From dfeec24772faa596859f8270a4eaeeca54752913 Mon Sep 17 00:00:00 2001 From: Ximin Luo Date: Sat, 4 Apr 2020 01:11:41 +0100 Subject: [PATCH] New upstream version 1.42.0+dfsg1 --- CONTRIBUTING.md | 4 +- Cargo.lock | 805 +- Cargo.toml | 1 + LICENSE-APACHE | 25 - RELEASES.md | 136 +- config.toml.example | 29 +- git-commit-hash | 2 +- src/bootstrap/Cargo.toml | 6 +- src/bootstrap/bin/llvm-config-wrapper.rs | 2 +- src/bootstrap/bin/main.rs | 2 +- src/bootstrap/bin/rustc.rs | 46 +- src/bootstrap/bin/rustdoc.rs | 16 +- src/bootstrap/bin/sccache-plus-cl.rs | 12 +- src/bootstrap/bootstrap.py | 45 +- src/bootstrap/bootstrap_test.py | 4 +- src/bootstrap/builder.rs | 204 +- src/bootstrap/builder/tests.rs | 379 +- src/bootstrap/cache.rs | 46 +- src/bootstrap/cc_detect.rs | 61 +- src/bootstrap/channel.rs | 2 +- src/bootstrap/check.rs | 91 +- src/bootstrap/clean.rs | 12 +- src/bootstrap/compile.rs | 339 +- src/bootstrap/config.rs | 94 +- src/bootstrap/configure.py | 4 +- src/bootstrap/dist.rs | 1014 +- src/bootstrap/doc.rs | 249 +- src/bootstrap/flags.rs | 128 +- src/bootstrap/format.rs | 75 + src/bootstrap/job.rs | 112 +- src/bootstrap/lib.rs | 254 +- src/bootstrap/metadata.rs | 25 +- src/bootstrap/native.rs | 393 +- src/bootstrap/sanity.rs | 103 +- src/bootstrap/test.rs | 515 +- src/bootstrap/tool.rs | 223 +- src/bootstrap/toolstate.rs | 73 +- src/bootstrap/util.rs | 159 +- src/build_helper/lib.rs | 147 +- src/ci/azure-pipelines/auto.yml | 23 +- src/ci/azure-pipelines/steps/run.yml | 4 - src/ci/azure-pipelines/try.yml | 2 +- src/ci/docker/dist-various-1/Dockerfile | 34 + .../dist-various-1/build-riscv-toolchain.sh | 27 + src/ci/docker/dist-various-1/crosstool-ng.sh | 13 + .../riscv64-unknown-linux-gnu.config | 908 + .../dist-various-2/build-wasi-toolchain.sh | 2 +- src/ci/docker/x86_64-gnu-debug/Dockerfile | 2 +- src/ci/docker/x86_64-gnu-llvm-7/Dockerfile | 4 +- src/ci/docker/x86_64-gnu/Dockerfile | 2 +- src/ci/publish_toolstate.sh | 14 +- src/ci/run.sh | 7 +- src/ci/scripts/install-clang.sh | 7 + src/ci/scripts/install-msys2-packages.sh | 3 +- src/ci/scripts/install-msys2.sh | 10 +- src/ci/scripts/switch-xcode.sh | 13 - src/ci/shared.sh | 4 +- src/doc/book/.travis.yml | 2 +- src/doc/book/2018-edition/Cargo.lock | 142 - src/doc/book/2018-edition/Cargo.toml | 36 - src/doc/book/2018-edition/LICENSE-APACHE | 201 - src/doc/book/2018-edition/LICENSE-MIT | 25 - src/doc/book/2018-edition/convert-quotes.sh | 13 - src/doc/book/2018-edition/nostarch.sh | 24 - src/doc/book/2018-edition/style-guide.md | 34 - .../book/2018-edition/tools/docx-to-md.xsl | 218 - .../tools/src/bin/concat_chapters.rs | 104 - .../tools/src/bin/convert_quotes.rs | 73 - .../book/2018-edition/tools/src/bin/lfp.rs | 243 - .../2018-edition/tools/src/bin/link2print.rs | 406 - .../tools/src/bin/remove_links.rs | 45 - .../tools/src/bin/remove_markup.rs | 52 - src/doc/book/Cargo.toml | 8 +- src/doc/book/README.md | 6 +- src/doc/book/nostarch/updates.md | 32 - src/doc/book/second-edition/Cargo.lock | 142 - src/doc/book/second-edition/Cargo.toml | 36 - src/doc/book/second-edition/LICENSE-APACHE | 201 - src/doc/book/second-edition/LICENSE-MIT | 25 - src/doc/book/second-edition/convert-quotes.sh | 13 - src/doc/book/second-edition/doc-to-md.sh | 20 - src/doc/book/second-edition/nostarch.sh | 24 - src/doc/book/second-edition/style-guide.md | 34 - .../book/second-edition/tools/docx-to-md.xsl | 218 - .../tools/src/bin/concat_chapters.rs | 104 - .../tools/src/bin/convert_quotes.rs | 73 - .../book/second-edition/tools/src/bin/lfp.rs | 242 - .../tools/src/bin/link2print.rs | 406 - .../tools/src/bin/remove_links.rs | 45 - .../tools/src/bin/remove_markup.rs | 52 - src/doc/book/src/appendix-01-keywords.md | 4 +- .../src/ch04-02-references-and-borrowing.md | 6 +- ...ojects-with-packages-crates-and-modules.md | 2 +- src/doc/book/src/ch11-02-running-tests.md | 32 +- src/doc/book/src/ch18-03-pattern-syntax.md | 4 +- .../ch20-03-graceful-shutdown-and-cleanup.md | 22 +- src/doc/book/tools/src/bin/remove_markup.rs | 9 +- .../rustup-for-managing-rust-versions.md | 18 +- src/doc/embedded-book/src/start/interrupts.md | 2 +- .../src/static-guarantees/design-contracts.md | 2 +- .../src/static-guarantees/state-machines.md | 2 +- src/doc/nomicon/.github/workflows/main.yml | 4 +- src/doc/nomicon/src/phantom-data.md | 4 +- src/doc/nomicon/src/unwinding.md | 2 +- src/doc/reference/src/abi.md | 5 +- .../reference/src/expressions/closure-expr.md | 16 +- src/doc/reference/src/identifiers.md | 2 +- .../reference/src/items/external-blocks.md | 14 +- src/doc/reference/src/macros-by-example.md | 2 +- src/doc/reference/src/type-layout.md | 7 +- src/doc/reference/src/types/pointer.md | 6 +- src/doc/rust-by-example/book.toml | 3 + .../src/conversion/try_from_try_into.md | 2 +- .../multiple_error_types/boxing_errors.md | 4 +- .../rust-by-example/src/trait/impl_trait.md | 16 +- src/doc/rust-by-example/src/types/alias.md | 4 +- src/doc/rustc-guide/book.toml | 2 +- src/doc/rustc-guide/src/SUMMARY.md | 4 + .../rustc-guide/src/appendix/bibliography.md | 4 +- .../rustc-guide/src/appendix/code-index.md | 16 +- src/doc/rustc-guide/src/borrow_check.md | 19 +- .../src/borrow_check/region_inference.md | 40 +- .../constraint_propagation.md | 16 +- .../region_inference/lifetime_parameters.md | 12 +- .../src/borrow_check/two_phase_borrows.md | 2 +- .../src/borrow_check/type_check.md | 2 +- src/doc/rustc-guide/src/bug-fix-procedure.md | 330 + .../rustc-guide/src/building/bootstrapping.md | 17 + src/doc/rustc-guide/src/building/suggested.md | 14 +- src/doc/rustc-guide/src/codegen.md | 2 +- src/doc/rustc-guide/src/conventions.md | 2 +- src/doc/rustc-guide/src/diagnostics.md | 18 +- .../src/diagnostics/diagnostic-codes.md | 75 + .../rustc-guide/src/diagnostics/lintstore.md | 2 +- .../rustc-guide/src/high-level-overview.md | 2 +- src/doc/rustc-guide/src/hir.md | 28 +- .../src/implementing_new_features.md | 7 +- src/doc/rustc-guide/src/macro-expansion.md | 28 +- src/doc/rustc-guide/src/mir/construction.md | 8 +- src/doc/rustc-guide/src/miri.md | 2 +- .../rustc-guide/src/panic-implementation.md | 108 + .../src/queries/example-0.counts.txt | 104 + .../rustc-guide/src/queries/example-0.html | 313330 +++++++++++++++ src/doc/rustc-guide/src/queries/example-0.png | Bin 0 -> 106577 bytes src/doc/rustc-guide/src/queries/profiling.md | 343 + src/doc/rustc-guide/src/rustc-driver.md | 2 +- src/doc/rustc-guide/src/rustdoc.md | 2 +- src/doc/rustc-guide/src/salsa.md | 4 +- src/doc/rustc-guide/src/stability.md | 109 +- .../rustc-guide/src/stabilization_guide.md | 11 +- src/doc/rustc-guide/src/the-parser.md | 4 +- .../rustc-guide/src/traits/chalk-overview.md | 4 +- src/doc/rustc-guide/src/ty.md | 684 +- .../src/compiler-flags/sanitizer.md | 163 + .../infer-static-outlives-requirements.md | 4 +- .../src/language-features/lang-items.md | 6 +- .../language-features/member-constraints.md | 4 +- .../src/language-features/repr128.md | 4 +- .../src/language-features/slice-patterns.md | 32 - .../language-features/transparent-enums.md | 93 - .../library-features/compiler-builtins-lib.md | 35 - .../library-features/debug-map-key-value.md | 9 - .../library-features/sanitizer-runtime-lib.md | 5 - src/etc/generate-deriving-span-tests.py | 4 +- src/etc/installer/msi/rust.wxs | 2 +- src/etc/test-float-parse/long-fractions.rs | 2 +- src/etc/test-float-parse/many-digits.rs | 6 +- src/etc/test-float-parse/subnorm.rs | 2 +- src/liballoc/alloc.rs | 23 +- src/liballoc/benches/btree/map.rs | 30 + src/liballoc/benches/btree/set.rs | 47 +- src/liballoc/benches/lib.rs | 4 +- src/liballoc/benches/string.rs | 42 +- src/liballoc/benches/vec.rs | 2 +- src/liballoc/borrow.rs | 35 +- src/liballoc/boxed.rs | 85 +- src/liballoc/collections/binary_heap.rs | 47 +- src/liballoc/collections/btree/map.rs | 383 +- src/liballoc/collections/btree/node.rs | 736 +- src/liballoc/collections/btree/search.rs | 25 +- src/liballoc/collections/btree/set.rs | 249 +- src/liballoc/collections/linked_list.rs | 694 +- src/liballoc/collections/linked_list/tests.rs | 152 + src/liballoc/collections/mod.rs | 12 +- src/liballoc/collections/vec_deque.rs | 252 +- src/liballoc/fmt.rs | 4 +- src/liballoc/lib.rs | 33 +- src/liballoc/raw_vec.rs | 147 +- src/liballoc/rc.rs | 157 +- src/liballoc/rc/tests.rs | 13 +- src/liballoc/slice.rs | 8 +- src/liballoc/str.rs | 64 +- src/liballoc/string.rs | 118 +- src/liballoc/sync.rs | 175 +- src/liballoc/sync/tests.rs | 18 +- src/liballoc/tests/arc.rs | 2 +- src/liballoc/tests/binary_heap.rs | 10 +- src/liballoc/tests/btree/map.rs | 328 +- src/liballoc/tests/btree/set.rs | 84 +- src/liballoc/tests/heap.rs | 23 +- src/liballoc/tests/lib.rs | 5 +- src/liballoc/tests/linked_list.rs | 1 - src/liballoc/tests/rc.rs | 2 +- src/liballoc/tests/slice.rs | 194 +- src/liballoc/tests/str.rs | 354 +- src/liballoc/tests/string.rs | 188 +- src/liballoc/tests/vec.rs | 248 +- src/liballoc/vec.rs | 266 +- src/libarena/lib.rs | 123 +- src/libarena/tests.rs | 22 +- src/libcore/alloc.rs | 183 +- src/libcore/any.rs | 54 +- src/libcore/array/iter.rs | 54 +- src/libcore/array/mod.rs | 23 +- src/libcore/benches/pattern.rs | 1 - src/libcore/borrow.rs | 22 +- src/libcore/cell.rs | 116 +- src/libcore/char/convert.rs | 2 +- src/libcore/char/methods.rs | 80 +- src/libcore/char/mod.rs | 4 +- src/libcore/clone.rs | 4 +- src/libcore/cmp.rs | 214 +- src/libcore/convert/mod.rs | 2 +- src/libcore/convert/num.rs | 30 +- src/libcore/ffi.rs | 4 +- src/libcore/fmt/builders.rs | 177 +- src/libcore/fmt/mod.rs | 218 +- src/libcore/fmt/num.rs | 49 +- src/libcore/fmt/rt/v1.rs | 6 +- src/libcore/hash/mod.rs | 2 +- src/libcore/hash/sip.rs | 10 +- src/libcore/internal_macros.rs | 2 +- src/libcore/intrinsics.rs | 97 +- src/libcore/iter/adapters/chain.rs | 87 +- src/libcore/iter/adapters/mod.rs | 741 +- src/libcore/iter/adapters/zip.rs | 100 +- src/libcore/iter/mod.rs | 71 +- src/libcore/iter/range.rs | 29 +- src/libcore/iter/sources.rs | 7 +- src/libcore/iter/traits/accum.rs | 16 +- src/libcore/iter/traits/iterator.rs | 449 +- src/libcore/iter/traits/marker.rs | 2 +- src/libcore/iter/traits/mod.rs | 14 +- src/libcore/iter_private.rs | 17 - src/libcore/lib.rs | 106 +- src/libcore/macros/mod.rs | 66 +- src/libcore/marker.rs | 79 +- src/libcore/mem/manually_drop.rs | 27 +- src/libcore/mem/maybe_uninit.rs | 33 +- src/libcore/mem/mod.rs | 34 +- src/libcore/num/bignum.rs | 6 +- src/libcore/num/dec2flt/mod.rs | 4 +- src/libcore/num/diy_float.rs | 2 +- src/libcore/num/f32.rs | 17 +- src/libcore/num/f64.rs | 6 +- src/libcore/num/flt2dec/mod.rs | 2 +- src/libcore/num/mod.rs | 592 +- src/libcore/num/wrapping.rs | 5 +- src/libcore/ops/deref.rs | 6 +- src/libcore/ops/drop.rs | 6 + src/libcore/ops/function.rs | 8 +- src/libcore/ops/mod.rs | 4 +- src/libcore/ops/range.rs | 17 +- src/libcore/ops/try.rs | 35 +- src/libcore/ops/unsize.rs | 10 +- src/libcore/option.rs | 12 +- src/libcore/panic.rs | 41 +- src/libcore/panicking.rs | 7 +- src/libcore/pin.rs | 4 +- src/libcore/ptr/const_ptr.rs | 762 + src/libcore/ptr/mod.rs | 1935 +- src/libcore/ptr/mut_ptr.rs | 949 + src/libcore/ptr/non_null.rs | 24 +- src/libcore/ptr/unique.rs | 28 +- src/libcore/result.rs | 177 +- src/libcore/slice/mod.rs | 884 +- src/libcore/str/lossy.rs | 61 +- src/libcore/str/mod.rs | 507 +- src/libcore/str/pattern.rs | 254 +- src/libcore/sync/atomic.rs | 195 +- src/libcore/task/poll.rs | 5 +- src/libcore/task/wake.rs | 4 +- src/libcore/tests/cmp.rs | 6 +- src/libcore/tests/fmt/builders.rs | 314 +- src/libcore/tests/fmt/mod.rs | 15 + src/libcore/tests/hash/mod.rs | 3 +- src/libcore/tests/iter.rs | 342 +- src/libcore/tests/lib.rs | 11 +- src/libcore/tests/num/dec2flt/mod.rs | 6 +- src/libcore/tests/num/flt2dec/mod.rs | 1036 +- src/libcore/tests/num/int_macros.rs | 27 + src/libcore/tests/num/mod.rs | 243 +- src/libcore/tests/num/uint_macros.rs | 27 + src/libcore/tests/pattern.rs | 471 +- src/libcore/tests/ptr.rs | 11 + src/libcore/tests/result.rs | 159 +- src/libcore/time.rs | 27 +- src/libcore/unicode/bool_trie.rs | 66 - src/libcore/unicode/mod.rs | 56 +- src/libcore/unicode/tables.rs | 2235 - src/libcore/unicode/unicode.py | 878 - src/libcore/unicode/unicode_data.rs | 2343 + src/libfmt_macros/Cargo.toml | 2 +- src/libfmt_macros/lib.rs | 62 +- src/libfmt_macros/tests.rs | 203 +- src/libgraphviz/lib.rs | 48 +- src/libgraphviz/tests.rs | 178 +- src/libpanic_abort/lib.rs | 63 +- src/libpanic_unwind/dwarf/eh.rs | 41 +- src/libpanic_unwind/dwarf/mod.rs | 2 +- src/libpanic_unwind/emcc.rs | 79 +- src/libpanic_unwind/gcc.rs | 55 +- src/libpanic_unwind/hermit.rs | 10 +- src/libpanic_unwind/lib.rs | 28 +- src/libpanic_unwind/seh.rs | 113 +- src/libproc_macro/bridge/buffer.rs | 20 +- src/libproc_macro/bridge/client.rs | 34 +- src/libproc_macro/bridge/closure.rs | 5 +- src/libproc_macro/bridge/handle.rs | 22 +- src/libproc_macro/bridge/mod.rs | 7 +- src/libproc_macro/bridge/server.rs | 36 +- src/libproc_macro/diagnostic.rs | 15 +- src/libproc_macro/lib.rs | 59 +- src/libprofiler_builtins/build.rs | 47 +- src/libprofiler_builtins/lib.rs | 8 +- src/librustc/Cargo.toml | 10 +- src/librustc/arena.rs | 108 +- src/librustc/benches/lib.rs | 30 +- src/librustc/dep_graph/debug.rs | 15 +- src/librustc/dep_graph/dep_node.rs | 90 +- src/librustc/dep_graph/graph.rs | 451 +- src/librustc/dep_graph/mod.rs | 4 +- src/librustc/dep_graph/prev.rs | 20 +- src/librustc/dep_graph/query.rs | 38 +- src/librustc/dep_graph/safe.rs | 40 +- src/librustc/dep_graph/serialized.rs | 6 +- src/librustc/hir/check_attr.rs | 295 +- src/librustc/hir/exports.rs | 32 + src/librustc/hir/map/blocks.rs | 122 +- src/librustc/hir/map/collector.rs | 129 +- src/librustc/hir/map/definitions.rs | 22 +- src/librustc/hir/map/hir_id_validator.rs | 31 +- src/librustc/hir/map/mod.rs | 179 +- src/librustc/hir/mod.rs | 2807 +- src/librustc/hir/ptr.rs | 138 - src/librustc/hir/upvars.rs | 28 +- src/librustc/ich/hcx.rs | 139 +- src/librustc/ich/impls_hir.rs | 341 +- src/librustc/ich/impls_syntax.rs | 74 +- src/librustc/ich/impls_ty.rs | 30 +- src/librustc/ich/mod.rs | 33 +- src/librustc/infer/at.rs | 239 +- src/librustc/infer/canonical/canonicalizer.rs | 124 +- src/librustc/infer/canonical/mod.rs | 128 +- .../infer/canonical/query_response.rs | 159 +- src/librustc/infer/canonical/substitute.rs | 23 +- src/librustc/infer/combine.rs | 242 +- src/librustc/infer/equate.rs | 82 +- src/librustc/infer/error_reporting/mod.rs | 893 +- .../infer/error_reporting/need_type_info.rs | 247 +- .../nice_region_error/different_lifetimes.rs | 39 +- .../nice_region_error/find_anon_type.rs | 59 +- .../error_reporting/nice_region_error/mod.rs | 18 +- .../nice_region_error/named_anon_conflict.rs | 23 +- .../nice_region_error/outlives_closure.rs | 115 +- .../nice_region_error/placeholder_error.rs | 55 +- .../nice_region_error/static_impl_trait.rs | 49 +- .../trait_impl_difference.rs | 22 +- .../error_reporting/nice_region_error/util.rs | 24 +- src/librustc/infer/error_reporting/note.rs | 781 +- src/librustc/infer/freshen.rs | 156 +- src/librustc/infer/fudge.rs | 63 +- src/librustc/infer/glb.rs | 54 +- src/librustc/infer/higher_ranked/mod.rs | 30 +- src/librustc/infer/lattice.rs | 13 +- .../infer/lexical_region_resolve/graphviz.rs | 68 +- .../infer/lexical_region_resolve/mod.rs | 113 +- src/librustc/infer/lub.rs | 54 +- src/librustc/infer/mod.rs | 246 +- src/librustc/infer/nll_relate/mod.rs | 94 +- src/librustc/infer/opaque_types/mod.rs | 221 +- src/librustc/infer/outlives/env.rs | 21 +- src/librustc/infer/outlives/mod.rs | 1 - src/librustc/infer/outlives/obligations.rs | 81 +- src/librustc/infer/outlives/verify.rs | 49 +- .../infer/region_constraints/leak_check.rs | 21 +- src/librustc/infer/region_constraints/mod.rs | 87 +- src/librustc/infer/resolve.rs | 45 +- src/librustc/infer/sub.rs | 90 +- src/librustc/infer/type_variable.rs | 95 +- src/librustc/infer/unify_key.rs | 73 +- src/librustc/lib.rs | 52 +- src/librustc/lint.rs | 369 + src/librustc/lint/context.rs | 1581 - src/librustc/lint/mod.rs | 699 - src/librustc/middle/codegen_fn_attrs.rs | 116 + src/librustc/middle/cstore.rs | 71 +- src/librustc/middle/dependency_format.rs | 2 +- src/librustc/middle/exported_symbols.rs | 85 +- src/librustc/middle/free_region.rs | 58 +- src/librustc/middle/lang_items.rs | 36 +- src/librustc/middle/mod.rs | 36 + src/librustc/middle/privacy.rs | 12 +- src/librustc/middle/recursion_limit.rs | 2 +- src/librustc/middle/region.rs | 1049 +- src/librustc/middle/resolve_lifetime.rs | 3026 +- src/librustc/middle/stability.rs | 761 +- src/librustc/middle/weak_lang_items.rs | 34 +- src/librustc/mir/cache.rs | 54 +- src/librustc/mir/interpret/allocation.rs | 193 +- src/librustc/mir/interpret/error.rs | 436 +- src/librustc/mir/interpret/mod.rs | 126 +- src/librustc/mir/interpret/pointer.rs | 45 +- src/librustc/mir/interpret/queries.rs | 78 + src/librustc/mir/interpret/value.rs | 193 +- src/librustc/mir/mod.rs | 619 +- src/librustc/mir/mono.rs | 234 +- src/librustc/mir/query.rs | 223 + src/librustc/mir/tcx.rs | 143 +- src/librustc/mir/traversal.rs | 16 +- src/librustc/mir/visit.rs | 84 +- src/librustc/query/mod.rs | 142 +- src/librustc/traits/auto_trait.rs | 188 +- src/librustc/traits/chalk_fulfill.rs | 65 +- src/librustc/traits/codegen/mod.rs | 53 +- src/librustc/traits/coherence.rs | 192 +- src/librustc/traits/engine.rs | 24 +- src/librustc/traits/error_reporting.rs | 2782 - src/librustc/traits/error_reporting/mod.rs | 1427 + .../error_reporting/on_unimplemented.rs | 213 + .../traits/error_reporting/suggestions.rs | 1780 + src/librustc/traits/fulfill.rs | 243 +- src/librustc/traits/misc.rs | 202 + src/librustc/traits/mod.rs | 507 +- src/librustc/traits/object_safety.rs | 1183 +- src/librustc/traits/on_unimplemented.rs | 176 +- src/librustc/traits/project.rs | 904 +- src/librustc/traits/query/dropck_outlives.rs | 61 +- .../traits/query/evaluate_obligation.rs | 33 +- src/librustc/traits/query/method_autoderef.rs | 2 +- src/librustc/traits/query/mod.rs | 4 +- src/librustc/traits/query/normalize.rs | 19 +- src/librustc/traits/query/outlives_bounds.rs | 52 +- .../traits/query/type_op/ascribe_user_type.rs | 12 +- src/librustc/traits/query/type_op/custom.rs | 11 +- src/librustc/traits/query/type_op/eq.rs | 6 +- src/librustc/traits/query/type_op/mod.rs | 18 +- .../traits/query/type_op/normalize.rs | 8 +- src/librustc/traits/query/type_op/outlives.rs | 2 +- .../traits/query/type_op/prove_predicate.rs | 2 +- src/librustc/traits/query/type_op/subtype.rs | 11 +- src/librustc/traits/select.rs | 972 +- src/librustc/traits/specialize/mod.rs | 222 +- .../traits/specialize/specialization_graph.rs | 118 +- src/librustc/traits/structural_impls.rs | 211 +- .../{ty => traits}/structural_match.rs | 48 +- src/librustc/traits/util.rs | 398 +- src/librustc/{ty => traits}/wf.rs | 518 +- src/librustc/ty/_match.rs | 82 +- src/librustc/ty/adjustment.rs | 41 +- src/librustc/ty/binding.rs | 14 +- src/librustc/ty/cast.rs | 12 +- src/librustc/ty/codec.rs | 94 +- src/librustc/ty/constness.rs | 246 - src/librustc/ty/context.rs | 1201 +- src/librustc/ty/diagnostics.rs | 39 +- src/librustc/ty/erase_regions.rs | 21 +- src/librustc/ty/error.rs | 336 +- src/librustc/ty/fast_reject.rs | 67 +- src/librustc/ty/flags.rs | 48 +- src/librustc/ty/fold.rs | 246 +- .../{infer/outlives => ty}/free_region_map.rs | 20 +- .../ty/inhabitedness/def_id_forest.rs | 14 +- src/librustc/ty/inhabitedness/mod.rs | 42 +- src/librustc/ty/instance.rs | 331 +- src/librustc/ty/layout.rs | 1114 +- src/librustc/ty/mod.rs | 1178 +- .../query => ty}/normalize_erasing_regions.rs | 26 +- src/librustc/ty/outlives.rs | 49 +- src/librustc/ty/print/mod.rs | 153 +- src/librustc/ty/print/obsolete.rs | 35 +- src/librustc/ty/print/pretty.rs | 555 +- src/librustc/ty/query/config.rs | 25 +- src/librustc/ty/query/job.rs | 172 +- src/librustc/ty/query/keys.rs | 34 +- src/librustc/ty/query/mod.rs | 77 +- src/librustc/ty/query/on_disk_cache.rs | 267 +- src/librustc/ty/query/plumbing.rs | 343 +- src/librustc/ty/query/profiling_support.rs | 235 + src/librustc/ty/query/values.rs | 4 +- src/librustc/ty/relate.rs | 285 +- src/librustc/ty/steal.rs | 10 +- src/librustc/ty/structural_impls.rs | 510 +- src/librustc/ty/sty.rs | 580 +- src/librustc/ty/subst.rs | 185 +- src/librustc/ty/trait_def.rs | 67 +- src/librustc/ty/util.rs | 632 +- src/librustc/ty/walk.rs | 38 +- src/librustc/util/bug.rs | 2 +- src/librustc/util/common.rs | 142 +- src/librustc/util/nodemap.rs | 20 - src/librustc_apfloat/ieee.rs | 232 +- src/librustc_apfloat/lib.rs | 100 +- src/librustc_apfloat/ppc.rs | 59 +- src/librustc_apfloat/tests/ieee.rs | 6064 +- src/librustc_apfloat/tests/ppc.rs | 171 +- src/librustc_asan/Cargo.toml | 20 - src/librustc_asan/build.rs | 30 - src/librustc_asan/lib.rs | 8 - src/librustc_ast_lowering/Cargo.toml | 23 + .../expr.rs | 814 +- .../item.rs | 926 +- .../lib.rs} | 2216 +- src/librustc_ast_lowering/pat.rs | 268 + src/librustc_ast_lowering/path.rs | 422 + src/librustc_ast_passes/Cargo.toml | 19 + .../ast_validation.rs | 586 +- src/librustc_ast_passes/feature_gate.rs | 680 + src/librustc_ast_passes/lib.rs | 9 + .../show_span.rs | 21 +- .../Cargo.toml | 12 +- .../asm.rs | 85 +- .../assert.rs | 73 +- .../cfg.rs | 15 +- .../cmdline_attrs.rs | 9 +- .../compile_error.rs | 13 +- .../concat.rs | 9 +- .../concat_idents.rs | 32 +- .../deriving/bounds.rs | 20 +- .../deriving/clone.rs | 174 +- .../deriving/cmp/eq.rs | 92 +- .../deriving/cmp/ord.rs | 113 + .../deriving/cmp/partial_eq.rs | 59 +- .../deriving/cmp/partial_ord.rs | 193 +- .../deriving/debug.rs | 96 +- .../deriving/decodable.rs | 225 + .../deriving/default.rs | 87 + .../deriving/encodable.rs | 176 +- .../deriving/generic/mod.rs | 1007 +- .../deriving/generic/ty.rs | 221 +- src/librustc_builtin_macros/deriving/hash.rs | 92 + .../deriving/mod.rs | 140 +- .../env.rs | 66 +- .../format.rs | 250 +- .../format_foreign.rs | 183 +- .../format_foreign/printf/tests.rs | 52 +- .../format_foreign/shell/tests.rs | 5 +- .../global_allocator.rs | 28 +- src/librustc_builtin_macros/global_asm.rs | 64 + .../lib.rs | 20 +- src/librustc_builtin_macros/log_syntax.rs | 15 + .../proc_macro_harness.rs | 241 +- .../source_util.rs | 97 +- .../standard_library_imports.rs | 45 +- src/librustc_builtin_macros/test.rs | 439 + .../test_harness.rs | 131 +- .../trace_macros.rs | 19 +- .../util.rs | 6 +- src/librustc_codegen_llvm/Cargo.toml | 7 +- src/librustc_codegen_llvm/abi.rs | 122 +- src/librustc_codegen_llvm/allocator.rs | 57 +- src/librustc_codegen_llvm/asm.rs | 73 +- src/librustc_codegen_llvm/attributes.rs | 244 +- src/librustc_codegen_llvm/back/archive.rs | 145 +- src/librustc_codegen_llvm/back/bytecode.rs | 47 +- src/librustc_codegen_llvm/back/lto.rs | 471 +- src/librustc_codegen_llvm/back/write.rs | 390 +- src/librustc_codegen_llvm/base.rs | 74 +- src/librustc_codegen_llvm/builder.rs | 487 +- src/librustc_codegen_llvm/callee.rs | 26 +- src/librustc_codegen_llvm/common.rs | 129 +- src/librustc_codegen_llvm/consts.rs | 153 +- src/librustc_codegen_llvm/context.rs | 202 +- .../debuginfo/create_scope_map.rs | 29 +- src/librustc_codegen_llvm/debuginfo/gdb.rs | 34 +- .../debuginfo/metadata.rs | 1466 +- src/librustc_codegen_llvm/debuginfo/mod.rs | 212 +- .../debuginfo/namespace.rs | 24 +- .../debuginfo/source_loc.rs | 27 +- src/librustc_codegen_llvm/debuginfo/utils.rs | 25 +- src/librustc_codegen_llvm/declare.rs | 67 +- src/librustc_codegen_llvm/intrinsic.rs | 1330 +- src/librustc_codegen_llvm/lib.rs | 131 +- src/librustc_codegen_llvm/llvm/archive_ro.rs | 8 +- src/librustc_codegen_llvm/llvm/diagnostic.rs | 65 +- src/librustc_codegen_llvm/llvm/ffi.rs | 1958 +- src/librustc_codegen_llvm/llvm/mod.rs | 41 +- src/librustc_codegen_llvm/llvm_util.rs | 125 +- src/librustc_codegen_llvm/metadata.rs | 81 +- src/librustc_codegen_llvm/mono_item.rs | 50 +- src/librustc_codegen_llvm/type_.rs | 171 +- src/librustc_codegen_llvm/type_of.rs | 191 +- src/librustc_codegen_llvm/va_arg.rs | 56 +- src/librustc_codegen_llvm/value.rs | 10 +- src/librustc_codegen_ssa/Cargo.toml | 4 +- src/librustc_codegen_ssa/back/archive.rs | 30 +- src/librustc_codegen_ssa/back/command.rs | 32 +- src/librustc_codegen_ssa/back/link.rs | 671 +- src/librustc_codegen_ssa/back/linker.rs | 339 +- src/librustc_codegen_ssa/back/lto.rs | 4 +- src/librustc_codegen_ssa/back/mod.rs | 10 +- src/librustc_codegen_ssa/back/rpath.rs | 18 +- src/librustc_codegen_ssa/back/rpath/tests.rs | 59 +- .../back/symbol_export.rs | 263 +- src/librustc_codegen_ssa/back/write.rs | 646 +- src/librustc_codegen_ssa/base.rs | 396 +- src/librustc_codegen_ssa/common.rs | 42 +- .../debuginfo/type_names.rs | 60 +- src/librustc_codegen_ssa/glue.rs | 22 +- src/librustc_codegen_ssa/lib.rs | 79 +- src/librustc_codegen_ssa/meth.rs | 18 +- src/librustc_codegen_ssa/mir/analyze.rs | 223 +- src/librustc_codegen_ssa/mir/block.rs | 442 +- src/librustc_codegen_ssa/mir/constant.rs | 96 +- src/librustc_codegen_ssa/mir/debuginfo.rs | 95 +- src/librustc_codegen_ssa/mir/mod.rs | 316 +- src/librustc_codegen_ssa/mir/operand.rs | 260 +- src/librustc_codegen_ssa/mir/place.rs | 251 +- src/librustc_codegen_ssa/mir/rvalue.rs | 503 +- src/librustc_codegen_ssa/mir/statement.rs | 69 +- src/librustc_codegen_ssa/mono_item.rs | 62 +- src/librustc_codegen_ssa/traits/abi.rs | 2 +- src/librustc_codegen_ssa/traits/asm.rs | 4 +- src/librustc_codegen_ssa/traits/backend.rs | 15 +- src/librustc_codegen_ssa/traits/builder.rs | 21 +- src/librustc_codegen_ssa/traits/consts.rs | 2 +- src/librustc_codegen_ssa/traits/debuginfo.rs | 6 +- src/librustc_codegen_ssa/traits/declare.rs | 2 +- src/librustc_codegen_ssa/traits/intrinsic.rs | 2 +- src/librustc_codegen_ssa/traits/misc.rs | 2 +- src/librustc_codegen_ssa/traits/mod.rs | 4 +- src/librustc_codegen_ssa/traits/statics.rs | 2 +- src/librustc_codegen_ssa/traits/type_.rs | 4 +- src/librustc_codegen_ssa/traits/write.rs | 10 +- src/librustc_codegen_utils/Cargo.toml | 3 +- src/librustc_codegen_utils/codegen_backend.rs | 16 +- src/librustc_codegen_utils/lib.rs | 26 +- src/librustc_codegen_utils/link.rs | 124 +- src/librustc_codegen_utils/symbol_names.rs | 129 +- .../symbol_names/legacy.rs | 99 +- src/librustc_codegen_utils/symbol_names/v0.rs | 138 +- .../symbol_names_test.rs | 15 +- src/librustc_data_structures/Cargo.toml | 5 +- src/librustc_data_structures/atomic_ref.rs | 26 + src/librustc_data_structures/base_n.rs | 1 - src/librustc_data_structures/base_n/tests.rs | 2 +- .../binary_search_util/mod.rs | 60 +- src/librustc_data_structures/box_region.rs | 30 +- .../captures.rs | 4 +- src/librustc_data_structures/const_cstr.rs | 8 +- src/librustc_data_structures/fingerprint.rs | 9 +- src/librustc_data_structures/flock.rs | 155 +- src/librustc_data_structures/fx.rs | 10 +- .../graph/dominators/mod.rs | 12 +- .../graph/dominators/tests.rs | 7 +- .../graph/implementation/mod.rs | 66 +- .../graph/implementation/tests.rs | 42 +- .../graph/iterate/mod.rs | 16 +- src/librustc_data_structures/graph/mod.rs | 15 +- .../graph/reference.rs | 4 +- src/librustc_data_structures/graph/scc/mod.rs | 59 +- .../graph/scc/tests.rs | 89 +- src/librustc_data_structures/graph/tests.rs | 6 +- .../graph/vec_graph/mod.rs | 12 +- .../graph/vec_graph/tests.rs | 11 +- src/librustc_data_structures/lib.rs | 68 +- src/librustc_data_structures/macros.rs | 4 +- .../obligation_forest/tests.rs | 398 +- .../owning_ref/mod.rs | 356 +- .../owning_ref/tests.rs | 109 +- src/librustc_data_structures/profiling.rs | 404 +- src/librustc_data_structures/ptr_key.rs | 6 +- src/librustc_data_structures/sharded.rs | 49 +- src/librustc_data_structures/sip128.rs | 69 +- src/librustc_data_structures/sip128/tests.rs | 374 +- src/librustc_data_structures/small_c_str.rs | 5 +- .../snapshot_map/mod.rs | 29 +- src/librustc_data_structures/sorted_map.rs | 160 +- .../sorted_map/tests.rs | 25 +- src/librustc_data_structures/stable_hasher.rs | 148 +- src/librustc_data_structures/stable_map.rs | 3 +- src/librustc_data_structures/svh.rs | 15 +- src/librustc_data_structures/sync.rs | 28 +- src/librustc_data_structures/thin_vec.rs | 8 +- .../tiny_list/tests.rs | 32 +- .../transitive_relation.rs | 101 +- .../transitive_relation/tests.rs | 9 +- .../vec_linked_list.rs | 5 +- src/librustc_data_structures/work_queue.rs | 10 +- src/librustc_driver/Cargo.toml | 10 +- src/librustc_driver/args.rs | 7 +- src/librustc_driver/lib.rs | 561 +- src/librustc_driver/pretty.rs | 220 +- src/librustc_error_codes/error_codes.rs | 8 +- src/librustc_error_codes/error_codes/E0038.md | 2 +- src/librustc_error_codes/error_codes/E0084.md | 2 +- src/librustc_error_codes/error_codes/E0120.md | 10 +- src/librustc_error_codes/error_codes/E0121.md | 24 +- src/librustc_error_codes/error_codes/E0124.md | 5 +- src/librustc_error_codes/error_codes/E0128.md | 9 +- src/librustc_error_codes/error_codes/E0130.md | 4 +- src/librustc_error_codes/error_codes/E0131.md | 7 +- src/librustc_error_codes/error_codes/E0136.md | 7 +- src/librustc_error_codes/error_codes/E0161.md | 3 +- src/librustc_error_codes/error_codes/E0164.md | 38 +- src/librustc_error_codes/error_codes/E0170.md | 21 + src/librustc_error_codes/error_codes/E0178.md | 25 +- src/librustc_error_codes/error_codes/E0184.md | 22 +- src/librustc_error_codes/error_codes/E0185.md | 18 +- src/librustc_error_codes/error_codes/E0186.md | 18 +- src/librustc_error_codes/error_codes/E0191.md | 10 +- src/librustc_error_codes/error_codes/E0192.md | 16 + src/librustc_error_codes/error_codes/E0195.md | 5 +- src/librustc_error_codes/error_codes/E0197.md | 17 +- src/librustc_error_codes/error_codes/E0198.md | 17 +- src/librustc_error_codes/error_codes/E0199.md | 21 +- src/librustc_error_codes/error_codes/E0200.md | 19 +- src/librustc_error_codes/error_codes/E0201.md | 6 +- src/librustc_error_codes/error_codes/E0204.md | 17 +- src/librustc_error_codes/error_codes/E0206.md | 16 +- src/librustc_error_codes/error_codes/E0207.md | 30 +- src/librustc_error_codes/error_codes/E0214.md | 13 +- src/librustc_error_codes/error_codes/E0220.md | 3 +- src/librustc_error_codes/error_codes/E0221.md | 3 +- src/librustc_error_codes/error_codes/E0222.md | 52 + src/librustc_error_codes/error_codes/E0223.md | 3 +- src/librustc_error_codes/error_codes/E0225.md | 7 +- src/librustc_error_codes/error_codes/E0229.md | 4 +- src/librustc_error_codes/error_codes/E0261.md | 5 +- src/librustc_error_codes/error_codes/E0262.md | 10 +- src/librustc_error_codes/error_codes/E0303.md | 10 +- src/librustc_error_codes/error_codes/E0307.md | 2 +- src/librustc_error_codes/error_codes/E0373.md | 2 +- src/librustc_error_codes/error_codes/E0426.md | 2 +- src/librustc_error_codes/error_codes/E0445.md | 4 + src/librustc_error_codes/error_codes/E0446.md | 4 + src/librustc_error_codes/error_codes/E0477.md | 45 + src/librustc_error_codes/error_codes/E0491.md | 36 +- src/librustc_error_codes/error_codes/E0527.md | 2 - src/librustc_error_codes/error_codes/E0528.md | 4 - src/librustc_error_codes/error_codes/E0566.md | 4 +- src/librustc_error_codes/error_codes/E0627.md | 30 + src/librustc_error_codes/error_codes/E0638.md | 30 +- src/librustc_error_codes/error_codes/E0730.md | 2 - src/librustc_error_codes/error_codes/E0734.md | 2 +- src/librustc_error_codes/error_codes/E0743.md | 16 +- src/librustc_error_codes/error_codes/E0745.md | 2 +- src/librustc_error_codes/error_codes/E0746.md | 138 + src/librustc_error_codes/lib.rs | 10 +- src/librustc_errors/Cargo.toml | 5 +- .../annotate_snippet_emitter_writer.rs | 128 +- src/librustc_errors/diagnostic.rs | 156 +- src/librustc_errors/diagnostic_builder.rs | 118 +- src/librustc_errors/emitter.rs | 77 +- src/librustc_errors/json.rs | 226 +- src/librustc_errors/json/tests.rs | 10 +- src/librustc_errors/lib.rs | 86 +- src/librustc_errors/lock.rs | 44 +- src/librustc_errors/snippet.rs | 30 +- src/librustc_errors/styled_buffer.rs | 29 +- .../Cargo.toml | 10 +- .../base.rs | 336 +- .../build.rs | 433 +- .../expand.rs | 721 +- .../lib.rs | 10 +- .../mbe.rs | 6 +- .../mbe/macro_check.rs | 10 +- .../mbe/macro_parser.rs | 150 +- .../mbe/macro_rules.rs | 112 +- .../mbe/quoted.rs | 28 +- .../mbe/transcribe.rs | 12 +- .../mut_visit/tests.rs | 44 +- .../parse/lexer/tests.rs | 42 +- .../parse/tests.rs | 203 +- .../placeholders.rs | 236 +- .../proc_macro.rs | 109 +- .../proc_macro_server.rs | 90 +- src/librustc_expand/tests.rs | 1012 + .../tokenstream/tests.rs | 4 +- src/librustc_feature/Cargo.toml | 2 +- src/librustc_feature/accepted.rs | 9 +- src/librustc_feature/active.rs | 41 +- src/librustc_feature/builtin_attrs.rs | 42 +- src/librustc_feature/lib.rs | 24 +- src/librustc_feature/removed.rs | 8 +- src/librustc_fs_util/lib.rs | 37 +- src/librustc_hir/Cargo.toml | 22 + src/{librustc/hir => librustc_hir}/def.rs | 130 +- src/{librustc/hir => librustc_hir}/def_id.rs | 89 +- src/librustc_hir/hir.rs | 2633 + src/librustc_hir/hir_id.rs | 78 + .../hir => librustc_hir}/intravisit.rs | 659 +- .../hir => librustc_hir}/itemlikevisit.rs | 66 +- src/librustc_hir/lib.rs | 25 + .../hir => librustc_hir}/pat_util.rs | 101 +- src/{librustc/hir => librustc_hir}/print.rs | 847 +- src/librustc_hir/stable_hash_impls.rs | 81 + src/librustc_incremental/Cargo.toml | 3 +- src/librustc_incremental/assert_dep_graph.rs | 239 +- .../assert_module_sources.rs | 74 +- src/librustc_incremental/lib.rs | 28 +- .../persist/dirty_clean.rs | 274 +- .../persist/file_format.rs | 42 +- src/librustc_incremental/persist/fs.rs | 521 +- src/librustc_incremental/persist/fs/tests.rs | 79 +- src/librustc_incremental/persist/load.rs | 124 +- src/librustc_incremental/persist/mod.rs | 4 +- src/librustc_incremental/persist/save.rs | 151 +- .../persist/work_product.rs | 73 +- src/librustc_index/bit_set.rs | 62 +- src/librustc_index/bit_set/tests.rs | 23 +- src/librustc_index/lib.rs | 2 +- src/librustc_index/vec.rs | 114 +- src/librustc_index/vec/tests.rs | 51 + src/librustc_interface/Cargo.toml | 15 +- src/librustc_interface/callbacks.rs | 62 + src/librustc_interface/interface.rs | 108 +- src/librustc_interface/lib.rs | 6 +- src/librustc_interface/passes.rs | 518 +- src/librustc_interface/proc_macro_decls.rs | 23 +- src/librustc_interface/queries.rs | 129 +- src/librustc_interface/tests.rs | 182 +- src/librustc_interface/util.rs | 299 +- src/librustc_lexer/src/lib.rs | 18 +- src/librustc_lexer/src/unescape.rs | 9 +- src/librustc_lint/Cargo.toml | 6 +- src/librustc_lint/array_into_iter.rs | 53 +- src/librustc_lint/builtin.rs | 879 +- src/librustc_lint/context.rs | 841 + src/librustc_lint/early.rs | 384 + .../lint => librustc_lint}/internal.rs | 45 +- src/librustc_lint/late.rs | 490 + .../lint => librustc_lint}/levels.rs | 476 +- src/librustc_lint/lib.rs | 488 +- src/librustc_lint/non_ascii_idents.rs | 30 +- src/librustc_lint/nonstandard_style.rs | 158 +- src/librustc_lint/passes.rs | 284 + src/librustc_lint/redundant_semicolon.rs | 14 +- src/librustc_lint/types.rs | 321 +- src/librustc_lint/unused.rs | 309 +- src/librustc_llvm/build.rs | 110 +- src/librustc_llvm/lib.rs | 204 +- src/librustc_lsan/Cargo.toml | 20 - src/librustc_lsan/build.rs | 29 - src/librustc_lsan/lib.rs | 8 - src/librustc_macros/src/hash_stable.rs | 70 +- src/librustc_macros/src/lib.rs | 5 +- src/librustc_macros/src/lift.rs | 33 +- src/librustc_macros/src/query.rs | 59 +- src/librustc_macros/src/symbols.rs | 26 +- src/librustc_macros/src/type_foldable.rs | 39 +- src/librustc_metadata/Cargo.toml | 11 +- src/librustc_metadata/creader.rs | 439 +- src/librustc_metadata/dependency_format.rs | 188 +- src/librustc_metadata/dynamic_lib.rs | 82 +- src/librustc_metadata/dynamic_lib/tests.rs | 15 +- src/librustc_metadata/foreign_modules.rs | 26 +- src/librustc_metadata/lib.rs | 16 +- src/librustc_metadata/link_args.rs | 22 +- src/librustc_metadata/locator.rs | 496 +- src/librustc_metadata/native_libs.rs | 146 +- src/librustc_metadata/rmeta/decoder.rs | 641 +- .../rmeta/decoder/cstore_impl.rs | 183 +- src/librustc_metadata/rmeta/encoder.rs | 389 +- src/librustc_metadata/rmeta/mod.rs | 72 +- src/librustc_metadata/rmeta/table.rs | 53 +- src/librustc_mir/Cargo.toml | 9 +- src/librustc_mir/borrow_check/borrow_set.rs | 71 +- .../borrow_check/constraint_generation.rs | 90 +- .../borrow_check/constraints/graph.rs | 48 +- .../borrow_check/constraints/mod.rs | 8 +- .../diagnostics/conflict_errors.rs | 565 +- .../diagnostics/explain_borrow.rs | 229 +- .../borrow_check/diagnostics/find_use.rs | 20 +- .../borrow_check/diagnostics/mod.rs | 361 +- .../borrow_check/diagnostics/move_errors.rs | 265 +- .../diagnostics/mutability_errors.rs | 323 +- .../diagnostics/outlives_suggestion.rs | 105 +- .../borrow_check/diagnostics/region_errors.rs | 865 +- .../borrow_check/diagnostics/region_name.rs | 417 +- .../borrow_check/diagnostics/var_name.rs | 65 +- src/librustc_mir/borrow_check/invalidation.rs | 182 +- src/librustc_mir/borrow_check/location.rs | 28 +- .../borrow_check/member_constraints.rs | 16 +- src/librustc_mir/borrow_check/mod.rs | 747 +- src/librustc_mir/borrow_check/nll.rs | 236 +- src/librustc_mir/borrow_check/path_utils.rs | 22 +- src/librustc_mir/borrow_check/place_ext.rs | 56 +- .../borrow_check/places_conflict.rs | 198 +- src/librustc_mir/borrow_check/prefixes.rs | 80 +- .../borrow_check/region_infer/dump_mir.rs | 22 +- .../borrow_check/region_infer/graphviz.rs | 9 +- .../borrow_check/region_infer/mod.rs | 916 +- .../borrow_check/region_infer/values.rs | 73 +- src/librustc_mir/borrow_check/renumber.rs | 21 +- .../type_check/constraint_conversion.rs | 61 +- .../type_check/free_region_relations.rs | 66 +- .../borrow_check/type_check/input_output.rs | 18 +- .../type_check/liveness/local_use_map.rs | 2 +- .../borrow_check/type_check/liveness/mod.rs | 12 +- .../type_check/liveness/polonius.rs | 6 +- .../borrow_check/type_check/liveness/trace.rs | 9 +- .../borrow_check/type_check/mod.rs | 876 +- .../borrow_check/type_check/relate_tys.rs | 42 +- .../borrow_check/universal_regions.rs | 148 +- src/librustc_mir/borrow_check/used_muts.rs | 49 +- src/librustc_mir/build/cfg.rs | 88 - src/librustc_mir/build/matches/util.rs | 132 - src/librustc_mir/const_eval.rs | 794 +- src/librustc_mir/const_eval/error.rs | 42 + src/librustc_mir/const_eval/eval_queries.rs | 382 + src/librustc_mir/const_eval/fn_queries.rs | 155 + src/librustc_mir/const_eval/machine.rs | 365 + src/librustc_mir/dataflow/at_location.rs | 31 +- .../dataflow/drop_flag_effects.rs | 75 +- src/librustc_mir/dataflow/generic.rs | 613 - src/librustc_mir/dataflow/generic/cursor.rs | 265 + src/librustc_mir/dataflow/generic/engine.rs | 427 + src/librustc_mir/dataflow/generic/graphviz.rs | 551 +- src/librustc_mir/dataflow/generic/mod.rs | 358 + src/librustc_mir/dataflow/generic/tests.rs | 332 + src/librustc_mir/dataflow/graphviz.rs | 125 +- .../dataflow/impls/borrowed_locals.rs | 40 +- src/librustc_mir/dataflow/impls/borrows.rs | 157 +- .../dataflow/impls/indirect_mutation.rs | 55 +- src/librustc_mir/dataflow/impls/mod.rs | 250 +- .../dataflow/impls/storage_liveness.rs | 66 +- src/librustc_mir/dataflow/mod.rs | 275 +- .../dataflow/move_paths/abs_domain.rs | 4 +- .../dataflow/move_paths/builder.rs | 86 +- src/librustc_mir/dataflow/move_paths/mod.rs | 16 +- src/librustc_mir/interpret/cast.rs | 137 +- src/librustc_mir/interpret/eval_context.rs | 253 +- src/librustc_mir/interpret/intern.rs | 223 +- src/librustc_mir/interpret/intrinsics.rs | 167 +- .../interpret/intrinsics/caller_location.rs | 28 +- .../interpret/intrinsics/type_name.rs | 56 +- src/librustc_mir/interpret/machine.rs | 53 +- src/librustc_mir/interpret/memory.rs | 273 +- src/librustc_mir/interpret/mod.rs | 24 +- src/librustc_mir/interpret/operand.rs | 355 +- src/librustc_mir/interpret/operator.rs | 74 +- src/librustc_mir/interpret/place.rs | 495 +- src/librustc_mir/interpret/snapshot.rs | 140 +- src/librustc_mir/interpret/step.rs | 65 +- src/librustc_mir/interpret/terminator.rs | 358 +- src/librustc_mir/interpret/traits.rs | 103 +- src/librustc_mir/interpret/validity.rs | 55 +- src/librustc_mir/interpret/visitor.rs | 45 +- src/librustc_mir/lib.rs | 31 +- src/librustc_mir/monomorphize/collector.rs | 586 +- src/librustc_mir/monomorphize/mod.rs | 4 +- src/librustc_mir/monomorphize/partitioning.rs | 297 +- src/librustc_mir/shim.rs | 595 +- src/librustc_mir/transform/add_call_guards.rs | 28 +- .../transform/add_moves_for_packed_drops.rs | 44 +- src/librustc_mir/transform/add_retag.rs | 106 +- .../transform/check_consts/mod.rs | 18 +- .../transform/check_consts/ops.rs | 171 +- .../transform/check_consts/qualifs.rs | 89 +- .../transform/check_consts/resolver.rs | 40 +- .../transform/check_consts/validation.rs | 394 +- src/librustc_mir/transform/check_unsafety.rs | 471 +- .../transform/cleanup_post_borrowck.rs | 16 +- src/librustc_mir/transform/const_prop.rs | 727 +- src/librustc_mir/transform/copy_prop.rs | 164 +- src/librustc_mir/transform/deaggregator.rs | 22 +- src/librustc_mir/transform/dump_mir.rs | 30 +- src/librustc_mir/transform/elaborate_drops.rs | 322 +- src/librustc_mir/transform/erase_regions.rs | 15 +- src/librustc_mir/transform/generator.rs | 509 +- src/librustc_mir/transform/inline.rs | 266 +- src/librustc_mir/transform/instcombine.rs | 31 +- src/librustc_mir/transform/mod.rs | 251 +- src/librustc_mir/transform/no_landing_pads.rs | 10 +- src/librustc_mir/transform/promote_consts.rs | 562 +- .../transform/qualify_min_const_fn.rs | 188 +- .../transform/remove_noop_landing_pads.rs | 62 +- src/librustc_mir/transform/rustc_peek.rs | 129 +- src/librustc_mir/transform/simplify.rs | 141 +- .../transform/simplify_branches.rs | 29 +- src/librustc_mir/transform/simplify_try.rs | 32 +- .../transform/unreachable_prop.rs | 108 + src/librustc_mir/util/aggregate.rs | 62 +- src/librustc_mir/util/alignment.rs | 10 +- src/librustc_mir/util/borrowck_errors.rs | 126 +- src/librustc_mir/util/collect_writes.rs | 19 +- src/librustc_mir/util/def_use.rs | 63 +- src/librustc_mir/util/elaborate_drops.rs | 499 +- src/librustc_mir/util/graphviz.rs | 61 +- src/librustc_mir/util/liveness.rs | 53 +- src/librustc_mir/util/mod.rs | 10 +- src/librustc_mir/util/patch.rs | 70 +- src/librustc_mir/util/pretty.rs | 120 +- src/librustc_mir_build/Cargo.toml | 28 + .../build/block.rs | 164 +- src/librustc_mir_build/build/cfg.rs | 102 + .../build/expr/as_constant.rs | 29 +- .../build/expr/as_operand.rs | 21 +- .../build/expr/as_place.rs | 199 +- .../build/expr/as_rvalue.rs | 115 +- .../build/expr/as_temp.rs | 52 +- .../build/expr/category.rs | 10 +- .../build/expr/into.rs | 178 +- .../build/expr/mod.rs | 0 .../build/expr/stmt.rs | 43 +- .../build/into.rs | 14 +- .../build/matches/mod.rs | 776 +- .../build/matches/simplify.rs | 70 +- .../build/matches/test.rs | 411 +- src/librustc_mir_build/build/matches/util.rs | 104 + .../build/misc.rs | 46 +- .../build/mod.rs | 550 +- .../build/scope.rs | 512 +- .../hair/constant.rs | 72 +- .../hair/cx/block.rs | 46 +- .../hair/cx/expr.rs | 882 +- .../hair/cx/mod.rs | 104 +- .../hair/cx/to_ref.rs | 11 +- .../hair/mod.rs | 129 +- .../hair/pattern/_match.rs | 138 +- .../hair/pattern/check_match.rs | 481 +- .../hair/pattern/const_to_pat.rs | 191 +- .../hair/pattern/mod.rs | 852 +- .../hair/util.rs | 8 +- src/librustc_mir_build/lib.rs | 27 + .../lints.rs | 61 +- src/librustc_msan/Cargo.toml | 20 - src/librustc_msan/build.rs | 29 - src/librustc_msan/lib.rs | 8 - src/librustc_parse/Cargo.toml | 5 +- src/librustc_parse/config.rs | 261 +- src/librustc_parse/lexer/mod.rs | 218 +- src/librustc_parse/lexer/tokentrees.rs | 70 +- .../lexer/unescape_error_reporting.rs | 92 +- src/librustc_parse/lexer/unicode_chars.rs | 2 +- src/librustc_parse/lib.rs | 124 +- src/librustc_parse/parser/attr.rs | 106 +- src/librustc_parse/parser/diagnostics.rs | 558 +- src/librustc_parse/parser/expr.rs | 2009 +- src/librustc_parse/parser/generics.rs | 117 +- src/librustc_parse/parser/item.rs | 881 +- src/librustc_parse/parser/mod.rs | 467 +- src/librustc_parse/parser/module.rs | 130 +- src/librustc_parse/parser/pat.rs | 475 +- src/librustc_parse/parser/path.rs | 182 +- src/librustc_parse/parser/stmt.rs | 526 +- src/librustc_parse/parser/ty.rs | 691 +- src/librustc_parse/validate_attr.rs | 168 +- src/librustc_passes/Cargo.toml | 8 +- src/librustc_passes/check_const.rs | 105 +- src/librustc_passes/dead.rs | 362 +- .../diagnostic_items.rs | 65 +- src/librustc_passes/entry.rs | 89 +- src/librustc_passes/hir_stats.rs | 131 +- src/librustc_passes/intrinsicck.rs | 82 +- src/librustc_passes/layout_test.rs | 32 +- src/librustc_passes/lib.rs | 27 +- .../lib_features.rs | 76 +- src/librustc_passes/liveness.rs | 717 +- src/librustc_passes/loops.rs | 163 +- .../middle => librustc_passes}/reachable.rs | 243 +- src/librustc_passes/region.rs | 837 + src/librustc_passes/stability.rs | 621 + src/librustc_plugin_impl/Cargo.toml | 6 +- src/librustc_plugin_impl/build.rs | 32 +- src/librustc_plugin_impl/lib.rs | 3 +- src/librustc_plugin_impl/load.rs | 64 +- src/librustc_privacy/Cargo.toml | 5 +- src/librustc_privacy/lib.rs | 645 +- src/librustc_resolve/Cargo.toml | 12 +- src/librustc_resolve/build_reduced_graph.rs | 468 +- src/librustc_resolve/check_unused.rs | 63 +- src/librustc_resolve/def_collector.rs | 146 +- src/librustc_resolve/diagnostics.rs | 848 +- .../{resolve_imports.rs => imports.rs} | 924 +- src/librustc_resolve/late.rs | 691 +- src/librustc_resolve/late/diagnostics.rs | 358 +- src/librustc_resolve/lib.rs | 1017 +- src/librustc_resolve/lifetimes.rs | 2898 + src/librustc_resolve/macros.rs | 751 +- src/librustc_save_analysis/Cargo.toml | 3 +- src/librustc_save_analysis/dump_visitor.rs | 335 +- src/librustc_save_analysis/dumper.rs | 25 +- src/librustc_save_analysis/lib.rs | 675 +- src/librustc_save_analysis/sig.rs | 213 +- src/librustc_save_analysis/span_utils.rs | 28 +- src/librustc_session/Cargo.toml | 2 +- src/librustc_session/cgu_reuse_tracker.rs | 81 +- src/librustc_session/code_stats.rs | 77 +- src/librustc_session/config.rs | 1338 +- src/librustc_session/filesearch.rs | 59 +- src/librustc_session/lib.rs | 5 +- src/librustc_session/lint.rs | 148 +- .../lint/builtin.rs | 190 +- src/librustc_session/node_id.rs | 7 +- src/librustc_session/options.rs | 955 + src/librustc_session/parse.rs | 99 +- src/librustc_session/search_paths.rs | 13 +- src/librustc_session/session.rs | 388 +- src/librustc_session/utils.rs | 16 +- .../Cargo.toml | 4 +- .../analyze_source_file.rs | 42 +- .../analyze_source_file/tests.rs | 47 +- .../caching_source_map_view.rs | 27 +- .../edition.rs | 20 +- .../fatal_error.rs | 6 +- .../hygiene.rs | 174 +- src/{libsyntax_pos => librustc_span}/lib.rs | 374 +- .../source_map.rs | 309 +- .../source_map/tests.rs | 37 +- .../span_encoding.rs | 4 +- .../symbol.rs | 67 +- .../symbol/tests.rs | 0 src/{libsyntax_pos => librustc_span}/tests.rs | 9 +- src/librustc_target/Cargo.toml | 2 +- src/librustc_target/abi/call/aarch64.rs | 41 +- src/librustc_target/abi/call/amdgpu.rs | 37 +- src/librustc_target/abi/call/arm.rs | 41 +- src/librustc_target/abi/call/hexagon.rs | 4 +- src/librustc_target/abi/call/mips.rs | 21 +- src/librustc_target/abi/call/mips64.rs | 43 +- src/librustc_target/abi/call/mod.rs | 163 +- src/librustc_target/abi/call/powerpc.rs | 4 +- src/librustc_target/abi/call/powerpc64.rs | 50 +- src/librustc_target/abi/call/s390x.rs | 31 +- src/librustc_target/abi/call/sparc.rs | 21 +- src/librustc_target/abi/call/sparc64.rs | 41 +- src/librustc_target/abi/call/wasm32.rs | 32 +- .../abi/call/wasm32_bindgen_compat.rs | 6 +- src/librustc_target/abi/call/x86.rs | 29 +- src/librustc_target/abi/call/x86_64.rs | 93 +- src/librustc_target/abi/call/x86_win64.rs | 23 +- src/librustc_target/abi/mod.rs | 207 +- src/librustc_target/lib.rs | 6 +- src/librustc_target/spec/aarch64_apple_ios.rs | 4 +- src/librustc_target/spec/aarch64_fuchsia.rs | 7 +- .../spec/aarch64_linux_android.rs | 5 +- .../spec/aarch64_pc_windows_msvc.rs | 2 +- .../spec/aarch64_unknown_freebsd.rs | 5 +- .../spec/aarch64_unknown_linux_gnu.rs | 2 +- .../spec/aarch64_unknown_linux_musl.rs | 2 +- .../spec/aarch64_unknown_netbsd.rs | 5 +- .../spec/aarch64_unknown_none.rs | 4 +- .../spec/aarch64_unknown_none_softfloat.rs | 4 +- .../spec/aarch64_uwp_windows_msvc.rs | 2 +- .../spec/aarch64_wrs_vxworks.rs | 5 +- src/librustc_target/spec/abi.rs | 58 +- src/librustc_target/spec/android_base.rs | 4 +- src/librustc_target/spec/apple_base.rs | 15 +- src/librustc_target/spec/apple_ios_base.rs | 80 +- .../spec/arm_linux_androideabi.rs | 5 +- .../spec/arm_unknown_linux_gnueabi.rs | 2 +- .../spec/arm_unknown_linux_gnueabihf.rs | 4 +- .../spec/arm_unknown_linux_musleabi.rs | 2 +- .../spec/arm_unknown_linux_musleabihf.rs | 2 +- .../spec/armebv7r_none_eabi.rs | 4 +- .../spec/armebv7r_none_eabihf.rs | 4 +- .../spec/armv4t_unknown_linux_gnueabi.rs | 4 +- .../spec/armv5te_unknown_linux_gnueabi.rs | 4 +- .../spec/armv5te_unknown_linux_musleabi.rs | 4 +- .../spec/armv6_unknown_freebsd.rs | 4 +- .../spec/armv6_unknown_netbsd_eabihf.rs | 4 +- src/librustc_target/spec/armv7_apple_ios.rs | 6 +- .../spec/armv7_linux_androideabi.rs | 8 +- .../spec/armv7_unknown_cloudabi_eabihf.rs | 5 +- .../spec/armv7_unknown_freebsd.rs | 4 +- .../spec/armv7_unknown_linux_gnueabi.rs | 4 +- .../spec/armv7_unknown_linux_gnueabihf.rs | 4 +- .../spec/armv7_unknown_linux_musleabi.rs | 4 +- .../spec/armv7_unknown_linux_musleabihf.rs | 4 +- .../spec/armv7_unknown_netbsd_eabihf.rs | 4 +- .../spec/armv7_wrs_vxworks_eabihf.rs | 4 +- src/librustc_target/spec/armv7a_none_eabi.rs | 48 + .../spec/armv7a_none_eabihf.rs | 36 + src/librustc_target/spec/armv7r_none_eabi.rs | 4 +- .../spec/armv7r_none_eabihf.rs | 4 +- src/librustc_target/spec/armv7s_apple_ios.rs | 6 +- .../spec/asmjs_unknown_emscripten.rs | 6 +- src/librustc_target/spec/cloudabi_base.rs | 19 +- src/librustc_target/spec/dragonfly_base.rs | 26 +- src/librustc_target/spec/freebsd_base.rs | 26 +- src/librustc_target/spec/fuchsia_base.rs | 24 +- src/librustc_target/spec/haiku_base.rs | 4 +- src/librustc_target/spec/hermit_base.rs | 13 +- .../spec/hermit_kernel_base.rs | 13 +- .../spec/hexagon_unknown_linux_musl.rs | 15 +- src/librustc_target/spec/i386_apple_ios.rs | 12 +- src/librustc_target/spec/i686_apple_darwin.rs | 9 +- .../spec/i686_linux_android.rs | 4 +- .../spec/i686_pc_windows_gnu.rs | 8 +- .../spec/i686_pc_windows_msvc.rs | 9 +- .../spec/i686_unknown_cloudabi.rs | 4 +- .../spec/i686_unknown_freebsd.rs | 8 +- .../spec/i686_unknown_haiku.rs | 4 +- .../spec/i686_unknown_linux_gnu.rs | 4 +- .../spec/i686_unknown_linux_musl.rs | 4 +- .../spec/i686_unknown_netbsd.rs | 9 +- .../spec/i686_unknown_openbsd.rs | 4 +- src/librustc_target/spec/i686_unknown_uefi.rs | 4 +- .../spec/i686_uwp_windows_gnu.rs | 8 +- .../spec/i686_uwp_windows_msvc.rs | 4 +- src/librustc_target/spec/i686_wrs_vxworks.rs | 4 +- src/librustc_target/spec/l4re_base.rs | 2 +- src/librustc_target/spec/linux_base.rs | 32 +- .../spec/mips64_unknown_linux_muslabi64.rs | 5 +- .../spec/mips64el_unknown_linux_muslabi64.rs | 5 +- .../spec/mips_unknown_linux_musl.rs | 5 +- .../spec/mipsel_unknown_linux_musl.rs | 5 +- src/librustc_target/spec/mod.rs | 140 +- src/librustc_target/spec/msp430_none_elf.rs | 4 +- src/librustc_target/spec/netbsd_base.rs | 21 +- .../spec/nvptx64_nvidia_cuda.rs | 6 +- src/librustc_target/spec/openbsd_base.rs | 26 +- .../spec/powerpc64_unknown_freebsd.rs | 5 +- .../spec/powerpc64_unknown_linux_gnu.rs | 7 +- .../spec/powerpc64_unknown_linux_musl.rs | 5 +- .../spec/powerpc64_wrs_vxworks.rs | 4 +- .../spec/powerpc64le_unknown_linux_gnu.rs | 5 +- .../spec/powerpc64le_unknown_linux_musl.rs | 5 +- .../spec/powerpc_unknown_linux_gnu.rs | 5 +- .../spec/powerpc_unknown_linux_gnuspe.rs | 5 +- .../spec/powerpc_unknown_linux_musl.rs | 5 +- .../spec/powerpc_unknown_netbsd.rs | 5 +- .../spec/powerpc_wrs_vxworks.rs | 5 +- .../spec/powerpc_wrs_vxworks_spe.rs | 2 +- src/librustc_target/spec/redox_base.rs | 32 +- .../spec/riscv32i_unknown_none_elf.rs | 5 +- .../spec/riscv32imac_unknown_none_elf.rs | 5 +- .../spec/riscv32imc_unknown_none_elf.rs | 5 +- .../spec/riscv64gc_unknown_none_elf.rs | 5 +- .../spec/riscv64imac_unknown_none_elf.rs | 5 +- src/librustc_target/spec/solaris_base.rs | 2 +- .../spec/sparc64_unknown_netbsd.rs | 5 +- src/librustc_target/spec/thumb_base.rs | 4 +- .../spec/thumbv6m_none_eabi.rs | 4 +- .../spec/thumbv7a_pc_windows_msvc.rs | 9 +- .../spec/thumbv7em_none_eabi.rs | 5 +- .../spec/thumbv7em_none_eabihf.rs | 4 +- .../spec/thumbv7m_none_eabi.rs | 5 +- .../spec/thumbv7neon_linux_androideabi.rs | 8 +- .../thumbv7neon_unknown_linux_gnueabihf.rs | 4 +- .../thumbv7neon_unknown_linux_musleabihf.rs | 4 +- .../spec/thumbv8m_base_none_eabi.rs | 2 +- .../spec/thumbv8m_main_none_eabi.rs | 5 +- .../spec/thumbv8m_main_none_eabihf.rs | 2 +- src/librustc_target/spec/uefi_base.rs | 13 +- src/librustc_target/spec/vxworks_base.rs | 29 +- src/librustc_target/spec/wasm32_base.rs | 6 +- .../spec/wasm32_unknown_emscripten.rs | 25 +- .../spec/wasm32_unknown_unknown.rs | 6 +- src/librustc_target/spec/windows_base.rs | 52 +- src/librustc_target/spec/windows_msvc_base.rs | 6 +- src/librustc_target/spec/windows_uwp_base.rs | 47 +- .../spec/windows_uwp_msvc_base.rs | 16 +- .../spec/x86_64_apple_darwin.rs | 8 +- src/librustc_target/spec/x86_64_apple_ios.rs | 11 +- .../spec/x86_64_apple_ios_macabi.rs | 11 +- .../spec/x86_64_fortanix_unknown_sgx.rs | 36 +- src/librustc_target/spec/x86_64_fuchsia.rs | 5 +- .../spec/x86_64_linux_android.rs | 3 +- .../spec/x86_64_linux_kernel.rs | 3 +- .../spec/x86_64_pc_windows_gnu.rs | 3 +- .../spec/x86_64_pc_windows_msvc.rs | 3 +- .../spec/x86_64_rumprun_netbsd.rs | 8 +- .../spec/x86_64_sun_solaris.rs | 3 +- .../spec/x86_64_unknown_cloudabi.rs | 3 +- .../spec/x86_64_unknown_dragonfly.rs | 3 +- .../spec/x86_64_unknown_freebsd.rs | 3 +- .../spec/x86_64_unknown_haiku.rs | 3 +- .../spec/x86_64_unknown_hermit.rs | 5 +- .../spec/x86_64_unknown_hermit_kernel.rs | 7 +- .../spec/x86_64_unknown_l4re_uclibc.rs | 3 +- .../spec/x86_64_unknown_linux_gnu.rs | 3 +- .../spec/x86_64_unknown_linux_gnux32.rs | 4 +- .../spec/x86_64_unknown_linux_musl.rs | 3 +- .../spec/x86_64_unknown_netbsd.rs | 8 +- .../spec/x86_64_unknown_openbsd.rs | 3 +- .../spec/x86_64_unknown_redox.rs | 3 +- .../spec/x86_64_unknown_uefi.rs | 3 +- .../spec/x86_64_uwp_windows_gnu.rs | 3 +- .../spec/x86_64_uwp_windows_msvc.rs | 3 +- .../spec/x86_64_wrs_vxworks.rs | 3 +- src/librustc_traits/Cargo.toml | 3 +- src/librustc_traits/chalk_context/mod.rs | 223 +- .../chalk_context/program_clauses/builtin.rs | 144 +- .../chalk_context/program_clauses/mod.rs | 121 +- .../program_clauses/primitive.rs | 66 +- .../chalk_context/resolvent_ops.rs | 99 +- src/librustc_traits/chalk_context/unify.rs | 53 +- src/librustc_traits/dropck_outlives.rs | 93 +- src/librustc_traits/evaluate_obligation.rs | 12 +- src/librustc_traits/generic_types.rs | 44 +- .../implied_outlives_bounds.rs | 63 +- src/librustc_traits/lib.rs | 9 +- src/librustc_traits/lowering/environment.rs | 139 +- src/librustc_traits/lowering/mod.rs | 178 +- .../normalize_erasing_regions.rs | 16 +- .../normalize_projection_ty.rs | 25 +- src/librustc_traits/type_op.rs | 121 +- src/librustc_tsan/Cargo.toml | 20 - src/librustc_tsan/build.rs | 30 - src/librustc_tsan/lib.rs | 8 - src/librustc_ty/Cargo.toml | 16 + src/librustc_ty/lib.rs | 25 + src/librustc_ty/ty.rs | 370 + src/librustc_typeck/Cargo.toml | 6 +- src/librustc_typeck/astconv.rs | 1964 +- src/librustc_typeck/check/_match.rs | 225 +- src/librustc_typeck/check/autoderef.rs | 156 +- src/librustc_typeck/check/callee.rs | 118 +- src/librustc_typeck/check/cast.rs | 428 +- src/librustc_typeck/check/closure.rs | 304 +- src/librustc_typeck/check/coercion.rs | 627 +- src/librustc_typeck/check/compare_method.rs | 809 +- src/librustc_typeck/check/demand.rs | 470 +- src/librustc_typeck/check/dropck.rs | 192 +- src/librustc_typeck/check/expr.rs | 926 +- .../check/generator_interior.rs | 187 +- src/librustc_typeck/check/intrinsic.rs | 580 +- src/librustc_typeck/check/method/confirm.rs | 363 +- src/librustc_typeck/check/method/mod.rs | 260 +- src/librustc_typeck/check/method/probe.rs | 829 +- src/librustc_typeck/check/method/suggest.rs | 739 +- src/librustc_typeck/check/mod.rs | 2548 +- src/librustc_typeck/check/op.rs | 476 +- src/librustc_typeck/check/pat.rs | 733 +- src/librustc_typeck/check/regionck.rs | 257 +- src/librustc_typeck/check/upvar.rs | 100 +- src/librustc_typeck/check/wfcheck.rs | 485 +- src/librustc_typeck/check/writeback.rs | 234 +- src/librustc_typeck/check_unused.rs | 72 +- src/librustc_typeck/coherence/builtin.rs | 396 +- .../coherence/inherent_impls.rs | 405 +- .../coherence/inherent_impls_overlap.rs | 65 +- src/librustc_typeck/coherence/mod.rs | 109 +- src/librustc_typeck/coherence/orphan.rs | 90 +- src/librustc_typeck/coherence/unsafety.rs | 87 +- src/librustc_typeck/collect.rs | 1294 +- .../constrained_generic_params.rs | 42 +- src/librustc_typeck/expr_use_visitor.rs | 240 +- src/librustc_typeck/impl_wf_check.rs | 126 +- src/librustc_typeck/lib.rs | 173 +- src/librustc_typeck/mem_categorization.rs | 282 +- src/librustc_typeck/namespace.rs | 18 +- src/librustc_typeck/outlives/explicit.rs | 8 +- .../outlives/implicit_infer.rs | 47 +- src/librustc_typeck/outlives/mod.rs | 85 +- src/librustc_typeck/outlives/test.rs | 27 +- src/librustc_typeck/outlives/utils.rs | 11 +- src/librustc_typeck/structured_errors.rs | 62 +- src/librustc_typeck/variance/constraints.rs | 223 +- src/librustc_typeck/variance/mod.rs | 34 +- src/librustc_typeck/variance/solve.rs | 61 +- src/librustc_typeck/variance/terms.rs | 48 +- src/librustc_typeck/variance/test.rs | 21 +- src/librustc_typeck/variance/xform.rs | 6 +- src/librustdoc/Cargo.toml | 1 + src/librustdoc/clean/auto_trait.rs | 424 +- src/librustdoc/clean/blanket_impl.rs | 84 +- src/librustdoc/clean/cfg.rs | 152 +- src/librustdoc/clean/cfg/tests.rs | 270 +- src/librustdoc/clean/inline.rs | 295 +- src/librustdoc/clean/mod.rs | 1248 +- src/librustdoc/clean/simplify.rs | 81 +- src/librustdoc/clean/types.rs | 496 +- src/librustdoc/clean/utils.rs | 345 +- src/librustdoc/config.rs | 12 +- src/librustdoc/core.rs | 56 +- src/librustdoc/docfs.rs | 36 +- src/librustdoc/doctree.rs | 130 +- src/librustdoc/externalfiles.rs | 53 +- src/librustdoc/fold.rs | 69 +- src/librustdoc/html/escape.rs | 4 +- src/librustdoc/html/format.rs | 583 +- src/librustdoc/html/highlight.rs | 153 +- src/librustdoc/html/item_type.rs | 248 +- src/librustdoc/html/layout.rs | 156 +- src/librustdoc/html/markdown.rs | 257 +- src/librustdoc/html/markdown/tests.rs | 235 +- src/librustdoc/html/render.rs | 2806 +- src/librustdoc/html/render/cache.rs | 286 +- src/librustdoc/html/render/tests.rs | 13 +- src/librustdoc/html/sources.rs | 61 +- src/librustdoc/html/static/main.js | 117 +- src/librustdoc/html/static/rustdoc.css | 8 +- src/librustdoc/html/static/themes/dark.css | 2 + src/librustdoc/html/static/themes/light.css | 2 + src/librustdoc/html/toc.rs | 20 +- src/librustdoc/html/toc/tests.rs | 41 +- src/librustdoc/lib.rs | 31 +- src/librustdoc/markdown.rs | 46 +- .../passes/calculate_doc_coverage.rs | 4 +- .../passes/check_code_block_syntax.rs | 39 +- .../passes/collect_intra_doc_links.rs | 20 +- src/librustdoc/passes/collect_trait_impls.rs | 6 +- src/librustdoc/passes/mod.rs | 5 +- src/librustdoc/passes/strip_hidden.rs | 4 +- src/librustdoc/passes/strip_private.rs | 2 +- src/librustdoc/test.rs | 422 +- src/librustdoc/test/tests.rs | 160 +- src/librustdoc/theme.rs | 70 +- src/librustdoc/theme/tests.rs | 8 +- src/librustdoc/visit_ast.rs | 408 +- src/librustdoc/visit_lib.rs | 25 +- src/libserialize/collection_impls.rs | 74 +- src/libserialize/hex.rs | 27 +- src/libserialize/hex/tests.rs | 19 +- src/libserialize/json.rs | 912 +- src/libserialize/json/tests.rs | 53 +- src/libserialize/leb128.rs | 46 +- src/libserialize/lib.rs | 19 +- src/libserialize/opaque.rs | 26 +- src/libserialize/serialize.rs | 270 +- src/libserialize/tests/json.rs | 661 +- src/libserialize/tests/leb128.rs | 6 +- src/libserialize/tests/opaque.rs | 125 +- src/libstd/Cargo.toml | 10 - src/libstd/alloc.rs | 53 +- src/libstd/collections/hash/map.rs | 94 +- src/libstd/collections/hash/set.rs | 258 +- src/libstd/env.rs | 14 +- src/libstd/error.rs | 258 +- src/libstd/f32.rs | 74 +- src/libstd/f64.rs | 14 +- src/libstd/ffi/c_str.rs | 83 +- src/libstd/ffi/os_str.rs | 70 +- src/libstd/fs.rs | 2 +- src/libstd/future.rs | 13 +- src/libstd/io/buffered.rs | 175 +- src/libstd/io/cursor.rs | 182 +- src/libstd/io/error.rs | 17 +- src/libstd/io/lazy.rs | 9 +- src/libstd/io/mod.rs | 5 +- src/libstd/io/stdio.rs | 137 +- src/libstd/keyword_docs.rs | 105 +- src/libstd/lib.rs | 153 +- src/libstd/macros.rs | 18 +- src/libstd/net/addr.rs | 24 +- src/libstd/net/ip.rs | 562 +- src/libstd/net/mod.rs | 41 +- src/libstd/net/parser.rs | 8 +- src/libstd/net/tcp.rs | 3 +- src/libstd/os/linux/raw.rs | 7 +- src/libstd/os/raw/mod.rs | 6 +- src/libstd/panic.rs | 2 +- src/libstd/panicking.rs | 141 +- src/libstd/path.rs | 26 +- src/libstd/primitive_docs.rs | 54 +- src/libstd/rt.rs | 2 +- src/libstd/sync/barrier.rs | 5 +- src/libstd/sync/condvar.rs | 162 +- src/libstd/sync/mod.rs | 4 +- src/libstd/sync/mpsc/mod.rs | 15 +- src/libstd/sync/mpsc/oneshot.rs | 7 +- src/libstd/sync/mutex.rs | 62 +- src/libstd/sync/once.rs | 2 +- src/libstd/sync/rwlock.rs | 72 +- src/libstd/sys/cloudabi/abi/bitflags.rs | 3 - src/libstd/sys/cloudabi/abi/cloudabi.rs | 2099 +- src/libstd/sys/cloudabi/condvar.rs | 42 +- src/libstd/sys/cloudabi/mod.rs | 5 +- src/libstd/sys/cloudabi/mutex.rs | 2 +- src/libstd/sys/cloudabi/rwlock.rs | 22 +- src/libstd/sys/cloudabi/shims/os.rs | 1 + src/libstd/sys/hermit/fast_thread_local.rs | 2 +- src/libstd/sys/hermit/fd.rs | 2 +- src/libstd/sys/hermit/os.rs | 10 +- src/libstd/sys/hermit/thread_local.rs | 4 +- src/libstd/sys/mod.rs | 4 +- src/libstd/sys/sgx/abi/mem.rs | 8 +- src/libstd/sys/sgx/abi/tls.rs | 2 +- src/libstd/sys/sgx/condvar.rs | 2 +- src/libstd/sys/sgx/mod.rs | 16 +- src/libstd/sys/sgx/mutex.rs | 22 +- src/libstd/sys/sgx/net.rs | 1 + src/libstd/sys/sgx/os.rs | 3 +- src/libstd/sys/sgx/rwlock.rs | 41 +- src/libstd/sys/sgx/waitqueue.rs | 115 +- src/libstd/sys/unix/android.rs | 6 +- src/libstd/sys/unix/args.rs | 125 +- src/libstd/sys/unix/cmath.rs | 1 - src/libstd/sys/unix/condvar.rs | 64 +- src/libstd/sys/unix/ext/mod.rs | 31 +- src/libstd/sys/unix/ext/net.rs | 182 +- src/libstd/sys/unix/fast_thread_local.rs | 2 +- src/libstd/sys/unix/fd.rs | 2 +- src/libstd/sys/unix/fs.rs | 485 +- src/libstd/sys/unix/mod.rs | 68 +- src/libstd/sys/unix/mutex.rs | 12 +- src/libstd/sys/unix/net.rs | 44 +- src/libstd/sys/unix/os.rs | 328 +- src/libstd/sys/unix/pipe.rs | 4 +- src/libstd/sys/unix/process/process_unix.rs | 174 +- src/libstd/sys/unix/rwlock.rs | 6 +- src/libstd/sys/unix/time.rs | 124 +- src/libstd/sys/vxworks/cmath.rs | 1 - src/libstd/sys/vxworks/ext/process.rs | 18 + src/libstd/sys/vxworks/fast_thread_local.rs | 2 +- src/libstd/sys/vxworks/fd.rs | 2 +- src/libstd/sys/vxworks/fs.rs | 2 +- src/libstd/sys/vxworks/mod.rs | 12 +- src/libstd/sys/vxworks/net.rs | 5 +- src/libstd/sys/vxworks/os.rs | 105 +- src/libstd/sys/vxworks/pipe.rs | 4 +- .../sys/vxworks/process/process_common.rs | 24 +- .../sys/vxworks/process/process_vxworks.rs | 56 +- src/libstd/sys/vxworks/weak.rs | 56 - src/libstd/sys/wasi/ext/fs.rs | 2 +- src/libstd/sys/wasi/ext/io.rs | 4 +- src/libstd/sys/wasi/io.rs | 25 +- src/libstd/sys/wasi/mod.rs | 20 +- src/libstd/sys/wasi/os.rs | 16 +- src/libstd/sys/wasm/alloc.rs | 2 +- src/libstd/sys/wasm/condvar.rs | 13 +- src/libstd/sys/wasm/condvar_atomics.rs | 2 +- src/libstd/sys/wasm/fast_thread_local.rs | 4 +- src/libstd/sys/wasm/mod.rs | 14 +- src/libstd/sys/wasm/mutex.rs | 11 +- src/libstd/sys/wasm/mutex_atomics.rs | 7 +- src/libstd/sys/wasm/os.rs | 1 + src/libstd/sys/wasm/rwlock.rs | 7 +- src/libstd/sys/wasm/rwlock_atomics.rs | 23 +- src/libstd/sys/windows/c.rs | 539 +- src/libstd/sys/windows/cmath.rs | 11 +- src/libstd/sys/windows/condvar.rs | 19 +- src/libstd/sys/windows/ext/fs.rs | 36 +- src/libstd/sys/windows/ext/process.rs | 2 +- src/libstd/sys/windows/fast_thread_local.rs | 2 +- src/libstd/sys/windows/fs.rs | 2 +- src/libstd/sys/windows/handle.rs | 4 +- src/libstd/sys/windows/mod.rs | 104 +- src/libstd/sys/windows/mutex.rs | 24 +- src/libstd/sys/windows/net.rs | 209 +- src/libstd/sys/windows/os.rs | 11 +- src/libstd/sys/windows/process.rs | 161 +- src/libstd/sys/windows/rwlock.rs | 4 +- src/libstd/sys/windows/stdio.rs | 2 +- src/libstd/sys/windows/stdio_uwp.rs | 2 +- src/libstd/sys/windows/time.rs | 42 +- src/libstd/sys_common/alloc.rs | 3 +- src/libstd/sys_common/at_exit_imp.rs | 4 +- src/libstd/sys_common/backtrace.rs | 17 +- src/libstd/sys_common/condvar.rs | 28 +- src/libstd/sys_common/mod.rs | 35 +- src/libstd/sys_common/mutex.rs | 32 +- src/libstd/sys_common/net.rs | 126 +- src/libstd/sys_common/os_str_bytes.rs | 1 + src/libstd/sys_common/poison.rs | 3 + src/libstd/sys_common/process.rs | 2 +- src/libstd/sys_common/remutex.rs | 31 +- src/libstd/sys_common/rwlock.rs | 32 +- src/libstd/sys_common/thread_local.rs | 37 +- src/libstd/tests/run-time-detect.rs | 13 +- src/libstd/thread/local.rs | 6 +- src/libstd/thread/mod.rs | 196 +- src/libstd/time.rs | 13 +- src/libsyntax/Cargo.toml | 7 +- src/libsyntax/ast.rs | 447 +- src/libsyntax/attr/builtin.rs | 521 +- src/libsyntax/attr/mod.rs | 225 +- src/libsyntax/diagnostics/macros.rs | 169 - src/libsyntax/early_buffered_lints.rs | 30 - src/libsyntax/entry.rs | 4 +- src/libsyntax/expand/allocator.rs | 14 +- src/libsyntax/expand/mod.rs | 5 +- src/libsyntax/feature_gate/check.rs | 877 - src/libsyntax/lib.rs | 70 +- src/libsyntax/mut_visit.rs | 300 +- src/libsyntax/print/helpers.rs | 10 +- src/libsyntax/print/pp.rs | 101 +- src/libsyntax/print/pprust.rs | 958 +- src/libsyntax/print/pprust/tests.rs | 31 +- src/libsyntax/ptr.rs | 35 +- src/libsyntax/token.rs | 247 +- src/libsyntax/tokenstream.rs | 52 +- src/libsyntax/util/classify.rs | 14 +- src/libsyntax/util/comments.rs | 48 +- src/libsyntax/util/lev_distance.rs | 87 +- src/libsyntax/util/lev_distance/tests.rs | 20 +- src/libsyntax/util/literal.rs | 118 +- src/libsyntax/util/map_in_place.rs | 24 +- src/libsyntax/util/node_count.rs | 25 +- src/libsyntax/util/parser.rs | 50 +- src/libsyntax/visit.rs | 336 +- src/libsyntax_expand/tests.rs | 1253 - src/libsyntax_ext/deriving/cmp/ord.rs | 116 - src/libsyntax_ext/deriving/decodable.rs | 190 - src/libsyntax_ext/deriving/default.rs | 82 - src/libsyntax_ext/deriving/hash.rs | 92 - src/libsyntax_ext/global_asm.rs | 65 - src/libsyntax_ext/log_syntax.rs | 14 - src/libsyntax_ext/test.rs | 378 - src/libterm/lib.rs | 20 +- src/libterm/terminfo/mod.rs | 67 +- src/libterm/terminfo/parm.rs | 246 +- src/libterm/terminfo/parm/tests.rs | 105 +- src/libterm/terminfo/parser/compiled.rs | 114 +- src/libterm/win.rs | 24 +- src/libtest/bench.rs | 36 +- src/libtest/cli.rs | 48 +- src/libtest/console.rs | 75 +- src/libtest/event.rs | 11 +- src/libtest/formatters/json.rs | 29 +- src/libtest/formatters/mod.rs | 15 +- src/libtest/formatters/pretty.rs | 32 +- src/libtest/formatters/terse.rs | 26 +- src/libtest/helpers/exit_code.rs | 2 +- src/libtest/helpers/isatty.rs | 3 +- src/libtest/helpers/mod.rs | 2 +- src/libtest/lib.rs | 146 +- src/libtest/options.rs | 5 +- src/libtest/stats/tests.rs | 11 +- src/libtest/test_result.rs | 4 +- src/libtest/tests.rs | 120 +- src/libtest/time.rs | 51 +- src/libtest/types.rs | 6 +- src/libunwind/build.rs | 6 +- src/libunwind/lib.rs | 6 +- src/libunwind/libunwind.rs | 20 +- src/rtstartup/rsbegin.rs | 10 +- src/rtstartup/rsend.rs | 4 +- src/rustc/Cargo.toml | 1 - src/rustc/rustc.rs | 19 +- src/rustllvm/ArchiveWrapper.cpp | 4 + src/rustllvm/Linker.cpp | 3 +- src/rustllvm/PassWrapper.cpp | 32 + src/rustllvm/RustWrapper.cpp | 31 + src/stage0.txt | 11 +- .../drop_in_place_intrinsic.rs | 5 +- .../item-collection/generic-drop-glue.rs | 12 +- .../instantiation-through-vtable.rs | 4 +- .../item-collection/non-generic-drop-glue.rs | 4 +- .../item-collection/transitive-drop-glue.rs | 18 +- .../item-collection/tuple-drop-glue.rs | 8 +- .../codegen-units/item-collection/unsizing.rs | 8 +- .../auxiliary/shared_generics_aux.rs | 16 +- .../partitioning/extern-drop-glue.rs | 6 +- .../partitioning/local-drop-glue.rs | 8 +- .../partitioning/shared-generics.rs | 12 +- .../partitioning/vtable-through-const.rs | 2 +- .../codegen/abi-main-signature-32bit-c-int.rs | 2 +- src/test/codegen/bool-cmp.rs | 5 +- src/test/codegen/consts.rs | 13 +- src/test/codegen/drop.rs | 2 +- src/test/codegen/force-frame-pointers.rs | 4 +- src/test/codegen/function-arguments.rs | 4 +- src/test/codegen/instrument-mcount.rs | 3 +- src/test/codegen/intrinsics/prefetch.rs | 32 +- src/test/codegen/naked-functions.rs | 4 +- src/test/codegen/repeat-trusted-len.rs | 2 +- .../codegen/repr-transparent-aggregates-1.rs | 2 +- .../codegen/repr-transparent-aggregates-2.rs | 2 +- .../codegen/repr-transparent-aggregates-3.rs | 2 +- src/test/codegen/repr-transparent-sysv64.rs | 4 +- src/test/codegen/repr-transparent.rs | 2 +- .../codegen/sanitizer-memory-track-orgins.rs | 6 +- src/test/codegen/sanitizer-recover.rs | 56 +- src/test/codegen/union-abi.rs | 2 +- .../compile-fail/consts/const-fn-error.rs | 1 + src/test/compile-fail/issue-23595-1.rs | 4 +- src/test/compile-fail/issue-52443.rs | 1 + src/test/compile-fail/panic-handler-twice.rs | 2 +- src/test/debuginfo/borrowed-enum-legacy.rs | 84 - ...c-enum-with-different-disr-sizes-legacy.rs | 105 - .../generic-struct-style-enum-legacy.rs | 86 - .../generic-tuple-style-enum-legacy.rs | 108 - src/test/debuginfo/recursive-struct-legacy.rs | 235 - .../debuginfo/struct-style-enum-legacy.rs | 105 - src/test/debuginfo/tuple-style-enum-legacy.rs | 105 - src/test/debuginfo/unique-enum-legacy.rs | 88 - .../auxiliary/a.rs | 31 + .../change_implementation_cross_crate/main.rs | 20 + .../cgu_invalidated_when_import_added.rs | 62 + .../cgu_invalidated_when_import_removed.rs | 74 + src/test/mir-opt/address-of.rs | 112 + src/test/mir-opt/array-index-is-temporary.rs | 19 +- .../mir-opt/const-promotion-extern-static.rs | 10 +- src/test/mir-opt/const_prop/aggregate.rs | 2 +- src/test/mir-opt/const_prop/array_index.rs | 2 +- src/test/mir-opt/const_prop/cast.rs | 49 + .../const_prop/const_prop_fails_gracefully.rs | 18 +- .../const_prop/optimizes_into_variable.rs | 149 + .../const_prop/read_immutable_static.rs | 6 +- src/test/mir-opt/const_prop/ref_deref.rs | 24 +- .../mir-opt/const_prop/ref_deref_project.rs | 41 + src/test/mir-opt/const_prop/repeat.rs | 2 +- src/test/mir-opt/const_prop/slice_len.rs | 6 +- .../{ => inline}/inline-any-operand.rs | 0 .../inline-closure-borrows-arg.rs | 0 .../{ => inline}/inline-closure-captures.rs | 0 .../mir-opt/{ => inline}/inline-closure.rs | 0 .../mir-opt/inline/inline-into-box-place.rs | 72 + src/test/mir-opt/{ => inline}/inline-retag.rs | 10 +- .../mir-opt/inline/inline-specialization.rs | 48 + .../{ => inline}/inline-trait-method.rs | 0 .../{ => inline}/inline-trait-method_2.rs | 0 src/test/mir-opt/match_false_edges.rs | 3 +- src/test/mir-opt/retag.rs | 16 +- src/test/mir-opt/retain-never-const.rs | 1 + src/test/mir-opt/simplify_try.rs | 26 +- src/test/mir-opt/slice-drop-shim.rs | 22 +- src/test/mir-opt/uniform_array_move_out.rs | 1 - .../mir-opt/uninhabited_enum_branching.rs | 81 +- src/test/mir-opt/unreachable.rs | 78 + src/test/mir-opt/unreachable_asm.rs | 72 + src/test/mir-opt/unreachable_asm_2.rs | 84 + src/test/mir-opt/unreachable_diverging.rs | 65 + src/test/mir-opt/unusual-item-types.rs | 4 +- src/test/pretty/ast-stmt-expr-attr.rs | 175 + src/test/pretty/raw-address-of.rs | 12 + src/test/pretty/top-level-doc-comments.rs | 5 - .../run-fail/unimplemented-macro-panic.rs | 2 +- .../allow-warnings-cmdline-stability/bar.rs | 2 +- .../run-make-fulldeps/c-dynamic-dylib/cfoo.c | 1 - .../run-make-fulldeps/c-dynamic-rlib/cfoo.c | 2 - .../c-link-to-rust-dylib/bar.c | 1 - .../c-link-to-rust-staticlib/bar.c | 1 - .../run-make-fulldeps/c-static-dylib/cfoo.c | 1 - .../run-make-fulldeps/c-static-rlib/cfoo.c | 1 - .../cdylib-dylib-linkage/Makefile | 27 + .../cdylib-dylib-linkage/bar.rs | 5 + .../cdylib-dylib-linkage/foo.c | 10 + .../cdylib-dylib-linkage/foo.rs | 13 + .../compiler-rt-works-on-mingw/foo.cpp | 1 - .../extern-fn-generic/test.c | 1 - .../run-make-fulldeps/extern-fn-mangle/test.c | 1 - .../extern-fn-with-extern-types/ctest.c | 1 - .../extern-fn-with-packed-struct/test.c | 1 - .../extern-fn-with-union/ctest.c | 1 - .../foreign-exceptions/foo.rs | 1 - .../glibc-staticlib-args/program.c | 1 - .../hotplug_codegen_backend/the_backend.rs | 7 +- .../interdependent-c-libraries/bar.c | 1 - .../interdependent-c-libraries/foo.c | 1 - src/test/run-make-fulldeps/issue-19371/foo.rs | 4 +- src/test/run-make-fulldeps/issue-25581/test.c | 1 - .../Makefile | 17 + .../issue-68794-textrel-on-minimal-lib/bar.c | 6 + .../issue-68794-textrel-on-minimal-lib/foo.rs | 8 + .../run-make-fulldeps/issue64319/Makefile | 39 + src/test/run-make-fulldeps/issue64319/bar.rs | 5 + src/test/run-make-fulldeps/issue64319/foo.rs | 9 + .../libtest-json/output-default.json | 2 +- .../libtest-json/output-stdout-success.json | 2 +- .../link-path-order/correct.c | 1 - .../run-make-fulldeps/link-path-order/wrong.c | 1 - .../linkage-attr-on-static/foo.c | 1 - src/test/run-make-fulldeps/lto-smoke-c/bar.c | 1 - src/test/run-make-fulldeps/manual-link/bar.c | 1 - src/test/run-make-fulldeps/manual-link/foo.c | 1 - .../pgo-branch-weights/Makefile | 30 +- .../sanitizer-address/Makefile | 30 - .../sanitizer-address/overflow.rs | 4 - .../sanitizer-invalid-cratetype/Makefile | 16 - .../sanitizer-invalid-cratetype/hello.rs | 3 - .../sanitizer-invalid-target/Makefile | 5 - .../sanitizer-invalid-target/hello.rs | 3 - .../run-make-fulldeps/sanitizer-leak/Makefile | 11 - .../run-make-fulldeps/sanitizer-leak/leak.rs | 6 - .../sanitizer-memory/Makefile | 9 - .../sanitizer-memory/uninit.rs | 7 - .../sanitizer-staticlib-link/program.c | 1 - .../share-generics-dylib/Makefile | 22 + .../instance_provider_a.rs | 6 + .../instance_provider_b.rs | 6 + .../instance_user_a_rlib.rs | 9 + .../instance_user_b_rlib.rs | 9 + .../instance_user_dylib.rs | 7 + .../share-generics-dylib/linked_leaf.rs | 15 + src/test/run-make-fulldeps/simd-ffi/simd.rs | 35 +- .../run-make/thumb-none-cortex-m/Makefile | 8 +- src/test/run-make/thumb-none-qemu/Makefile | 3 +- .../thumb-none-qemu/example/.cargo/config | 26 +- .../thumb-none-qemu/example/Cargo.lock | 199 + .../thumb-none-qemu/example/Cargo.toml | 4 +- .../thumb-none-qemu/example/src/main.rs | 8 +- .../run-make/wasm-export-all-symbols/bar.rs | 3 + .../wasm-export-all-symbols/verify.js | 14 +- .../wasm-symbols-different-module/Makefile | 28 + .../wasm-symbols-different-module/bar.rs | 33 + .../wasm-symbols-different-module/baz.rs | 22 + .../wasm-symbols-different-module/foo.rs | 23 + .../wasm-symbols-different-module/log.rs | 16 + .../verify-imports.js | 32 + .../rustdoc-ui/failed-doctest-output.stdout | 2 +- src/test/rustdoc-ui/invalid-syntax.rs | 6 + src/test/rustdoc-ui/invalid-syntax.stderr | 143 +- src/test/rustdoc-ui/test-compile-fail1.rs | 8 + src/test/rustdoc-ui/test-compile-fail1.stderr | 14 + src/test/rustdoc-ui/test-compile-fail2.rs | 3 + src/test/rustdoc-ui/test-compile-fail2.stderr | 8 + src/test/rustdoc-ui/test-compile-fail3.rs | 3 + src/test/rustdoc-ui/test-compile-fail3.stderr | 8 + src/test/rustdoc-ui/test-no_std.rs | 12 + src/test/rustdoc-ui/test-no_std.stdout | 6 + src/test/rustdoc/async-fn.rs | 7 + src/test/rustdoc/auto_aliases.rs | 6 + src/test/rustdoc/bad-codeblock-syntax.rs | 15 + src/test/rustdoc/const-display.rs | 8 +- src/test/rustdoc/const-generics/add-impl.rs | 2 +- src/test/rustdoc/const-generics/const-impl.rs | 11 +- src/test/rustdoc/const-underscore.rs | 7 + src/test/rustdoc/deref-typedef.rs | 33 + src/test/rustdoc/dont-show-const-contents.rs | 5 - src/test/rustdoc/duplicate-cfg.rs | 33 +- .../rustdoc/inline_cross/auxiliary/macros.rs | 2 +- src/test/rustdoc/issue-52873.rs | 5 +- src/test/rustdoc/playground-syntax-error.rs | 21 + src/test/rustdoc/remove-url-from-headings.rs | 17 + src/test/rustdoc/show-const-contents.rs | 67 + src/test/rustdoc/stability.rs | 2 +- src/test/rustdoc/unit-return.rs | 4 +- src/test/ui-fulldeps/ast_stmt_expr_attr.rs | 311 - .../auxiliary/issue-40001-plugin.rs | 14 +- .../auxiliary/lint-for-crate-rpass.rs | 13 +- .../ui-fulldeps/auxiliary/lint-for-crate.rs | 13 +- .../auxiliary/lint-group-plugin-test.rs | 10 +- .../ui-fulldeps/auxiliary/lint-plugin-test.rs | 6 +- .../ui-fulldeps/auxiliary/lint-tool-test.rs | 6 +- .../ui-fulldeps/auxiliary/macro-crate-test.rs | 1 - .../lint_pass_impl_without_macro.rs | 5 +- .../lint_pass_impl_without_macro.stderr | 4 +- .../ui-fulldeps/lint-plugin-forbid-attrs.rs | 2 + .../lint-plugin-forbid-attrs.stderr | 20 +- .../ui-fulldeps/lint-plugin-forbid-cmdline.rs | 2 + .../lint-plugin-forbid-cmdline.stderr | 18 +- .../lint-tool-cmdline-allow.stderr | 12 + src/test/ui-fulldeps/lint-tool-test.rs | 7 +- src/test/ui-fulldeps/lint-tool-test.stderr | 44 +- .../ui-fulldeps/mod_dir_path_canonicalized.rs | 4 +- src/test/ui-fulldeps/newtype_index.rs | 22 - src/test/ui-fulldeps/pprust-expr-roundtrip.rs | 12 +- src/test/ui/abi/stack-probes.rs | 15 +- src/test/ui/anon-params-deprecated.stderr | 6 +- .../issue-69103-extra-binding-subslice.rs | 18 + .../issue-69103-extra-binding-subslice.stderr | 26 + .../slice-pat-type-mismatches.rs} | 2 - .../slice-pat-type-mismatches.stderr} | 10 +- ...ubslice-only-once-semantic-restriction.rs} | 2 - ...lice-only-once-semantic-restriction.stderr | 24 + .../subslice-patterns-const-eval-match.rs | 97 + .../subslice-patterns-const-eval.rs | 95 + .../array-slice-vec/subslice-patterns-pass.rs | 2 - .../ui/array-slice-vec/vec-matching-fixed.rs | 2 - .../ui/array-slice-vec/vec-matching-fold.rs | 2 - .../vec-matching-legal-tail-element-borrow.rs | 3 +- src/test/ui/array-slice-vec/vec-matching.rs | 2 - .../ui/array-slice-vec/vec-tail-matching.rs | 2 - src/test/ui/asm/issue-51431.rs | 1 + src/test/ui/asm/issue-51431.stderr | 2 +- .../associated-const-ambiguity-report.stderr | 10 +- .../associated-const-no-item.rs | 2 +- .../ui/associated-const/issue-63496.stderr | 12 +- .../associated-item-enum.stderr | 6 +- .../ui/associated-item/issue-48027.stderr | 6 +- .../ui/associated-type-bounds/duplicate.rs | 141 +- .../associated-type-bounds/duplicate.stderr | 192 +- ...mbig-between-bound-and-where-clause.stderr | 54 + ...pe-projection-from-multiple-supertraits.rs | 13 +- ...rojection-from-multiple-supertraits.stderr | 69 +- .../associated-types-incomplete-object.rs | 6 +- .../associated-types-incomplete-object.stderr | 21 +- .../associated-types-path-1.stderr | 13 +- src/test/ui/associated-types/issue-64848.rs | 29 + .../missing-associated-types.rs | 27 + .../missing-associated-types.stderr | 129 + src/test/ui/async-await/async-fn-nonsend.rs | 15 +- .../ui/async-await/async-fn-nonsend.stderr | 24 +- .../dont-suggest-missing-await.stderr | 3 + .../ui/async-await/issue-64130-3-other.stderr | 3 + .../issue-64130-4-async-move.stderr | 18 +- .../issue-66387-if-without-else.rs | 2 +- .../issue-66387-if-without-else.stderr | 2 +- .../ui/async-await/issues/issue-62009-1.rs | 5 +- .../async-await/issues/issue-62009-1.stderr | 14 +- src/test/ui/async-await/issues/issue-64433.rs | 2 +- .../issues/issue-65436-raw-ptr-not-send.rs | 16 + .../issue-65436-raw-ptr-not-send.stderr | 26 + .../ret-impl-trait-no-fg.rs | 1 + .../ret-impl-trait-no-fg.stderr | 10 +- ...lly-recursive-async-impl-trait-type.stderr | 4 +- .../recursive-async-impl-trait-type.stderr | 2 +- .../suggest-missing-await-closure.stderr | 3 + .../async-await/suggest-missing-await.stderr | 6 + .../ui/async-await/unresolved_type_param.rs | 8 + .../async-await/unresolved_type_param.stderr | 28 +- src/test/ui/attr-shebang.rs | 1 - .../attributes/register-attr-tool-import.rs | 1 + .../register-attr-tool-import.stderr | 14 +- src/test/ui/auto-ref-slice-plus-ref.stderr | 8 +- src/test/ui/autoderef-full-lval.rs | 4 +- src/test/ui/autoderef-full-lval.stderr | 4 +- src/test/ui/auxiliary/cdylib-dep.rs | 1 - src/test/ui/auxiliary/stability-cfg2.rs | 2 +- src/test/ui/bad/bad-expr-lhs.rs | 10 +- src/test/ui/bad/bad-expr-lhs.stderr | 43 +- src/test/ui/bad/bad-expr-path.rs | 2 +- src/test/ui/bad/bad-expr-path.stderr | 2 +- src/test/ui/bad/bad-expr-path2.rs | 2 +- src/test/ui/bad/bad-expr-path2.stderr | 2 +- .../ui/bad/bad-intrinsic-monomorphization.rs | 2 + .../bad/bad-intrinsic-monomorphization.stderr | 6 +- src/test/ui/bad/bad-main.rs | 2 +- src/test/ui/bad/bad-main.stderr | 2 +- src/test/ui/binary-op-on-double-ref.rs | 2 +- src/test/ui/binary-op-on-double-ref.stderr | 2 +- ...can-live-while-the-other-survives-2.stderr | 2 +- ...can-live-while-the-other-survives-3.stderr | 2 +- ...can-live-while-the-other-survives-4.stderr | 2 +- .../ui/binding/empty-types-in-patterns.rs | 3 +- .../ui/binding/irrefutable-slice-patterns.rs | 3 +- .../ui/binding/match-byte-array-patterns.rs | 1 - src/test/ui/binding/match-vec-alternatives.rs | 1 - .../ui/binding/zero_sized_subslice_match.rs | 1 - src/test/ui/binop/binop-bitxor-str.rs | 2 +- src/test/ui/binop/binop-bitxor-str.stderr | 2 +- src/test/ui/binop/binop-mul-bool.rs | 2 +- src/test/ui/binop/binop-mul-bool.stderr | 2 +- src/test/ui/binop/binop-typeck.rs | 2 +- src/test/ui/binop/binop-typeck.stderr | 2 +- src/test/ui/block-result/issue-13624.stderr | 2 +- src/test/ui/block-result/issue-3563.rs | 2 +- src/test/ui/block-result/issue-3563.stderr | 2 +- src/test/ui/bogus-tag.stderr | 2 +- .../borrow-raw-address-of-borrowed.rs | 22 + .../borrow-raw-address-of-borrowed.stderr | 40 + ...rrow-raw-address-of-deref-mutability-ok.rs | 23 + .../borrow-raw-address-of-deref-mutability.rs | 17 + ...row-raw-address-of-deref-mutability.stderr | 21 + .../borrow-raw-address-of-mutability-ok.rs | 44 + .../borrow-raw-address-of-mutability.rs | 42 + .../borrow-raw-address-of-mutability.stderr | 59 + .../borrowck-closures-slice-patterns-ok.rs | 117 + .../borrowck-closures-slice-patterns.rs | 82 + .../borrowck-closures-slice-patterns.stderr | 114 + .../ui/borrowck/borrowck-describe-lvalue.rs | 2 - .../borrowck/borrowck-describe-lvalue.stderr | 64 +- .../borrowck-move-out-from-array-match.rs | 116 + .../borrowck-move-out-from-array-match.stderr | 113 + ...ck-move-out-from-array-no-overlap-match.rs | 115 + ...ove-out-from-array-no-overlap-match.stderr | 102 + ...borrowck-move-out-from-array-no-overlap.rs | 2 - .../borrowck-move-out-from-array-use-match.rs | 150 + ...rowck-move-out-from-array-use-match.stderr | 157 + ...ove-out-from-array-use-no-overlap-match.rs | 115 + ...out-from-array-use-no-overlap-match.stderr | 102 + ...owck-move-out-from-array-use-no-overlap.rs | 2 - .../borrowck-move-out-from-array-use.rs | 2 - .../borrowck-move-out-from-array-use.stderr | 28 +- .../borrowck/borrowck-move-out-from-array.rs | 2 - .../borrowck-move-out-from-array.stderr | 20 +- .../borrowck/borrowck-move-out-of-vec-tail.rs | 2 - .../borrowck-move-out-of-vec-tail.stderr | 2 +- ...e-pattern-element-loan-array-no-overlap.rs | 2 - ...rrowck-slice-pattern-element-loan-array.rs | 2 - ...ck-slice-pattern-element-loan-array.stderr | 16 +- ...rrowck-slice-pattern-element-loan-rpass.rs | 3 - ...e-pattern-element-loan-slice-no-overlap.rs | 2 - ...rrowck-slice-pattern-element-loan-slice.rs | 2 - ...ck-slice-pattern-element-loan-slice.stderr | 22 +- .../borrowck-vec-pattern-element-loan.rs | 2 - .../borrowck-vec-pattern-element-loan.stderr | 6 +- .../borrowck-vec-pattern-loan-from-mut.rs | 2 - .../borrowck-vec-pattern-loan-from-mut.stderr | 2 +- .../borrowck-vec-pattern-move-tail.rs | 4 - .../borrowck-vec-pattern-move-tail.stderr | 2 +- .../borrowck/borrowck-vec-pattern-nesting.rs | 1 - .../borrowck-vec-pattern-nesting.stderr | 16 +- .../borrowck-vec-pattern-tail-element-loan.rs | 2 - ...rowck-vec-pattern-tail-element-loan.stderr | 2 +- .../regions-bound-missing-bound-in-impl.rs | 1 + ...regions-bound-missing-bound-in-impl.stderr | 25 +- .../ui/c-variadic/variadic-ffi-4.nll.stderr | 4 +- .../variadic-ffi-no-fixed-args.stderr | 4 +- src/test/ui/cast/cast-as-bool.rs | 2 +- src/test/ui/cast/cast-as-bool.stderr | 7 +- src/test/ui/cdylib-deps-must-be-static.rs | 9 - src/test/ui/cdylib-deps-must-be-static.stderr | 4 - src/test/ui/class-cast-to-trait.stderr | 2 +- src/test/ui/closures/closure-move-sync.rs | 5 +- src/test/ui/closures/closure-move-sync.stderr | 16 +- .../ui/closures/closure-reform-bad.stderr | 2 + src/test/ui/closures/issue-68025.rs | 12 + src/test/ui/codemap_tests/unicode_2.stderr | 2 +- .../coerce-expect-unsized-ascribed.stderr | 14 +- .../ui/coherence/coherence_inherent.stderr | 2 +- .../ui/coherence/coherence_inherent_cc.stderr | 2 +- src/test/ui/commandline-argfile-badutf8.rs | 1 - src/test/ui/commandline-argfile-missing.rs | 1 - src/test/ui/conflicting-repr-hints.rs | 37 +- src/test/ui/conflicting-repr-hints.stderr | 42 +- .../issue-18343.stderr | 2 +- .../issue-2392.stderr | 22 +- .../issue-32128.stderr | 2 +- .../issue-33784.stderr | 6 +- .../private-field.stderr | 2 +- .../alloc-traits-no-impls-length-33.stderr | 15 + .../core-traits-no-impls-length-33.rs | 1 + .../core-traits-no-impls-length-33.stderr | 19 +- .../into-iter-no-impls-length-33.stderr | 21 + .../array-size-in-generic-struct-param.rs | 22 + .../array-size-in-generic-struct-param.stderr | 26 + .../const-generics/const-generic-type_name.rs | 11 + .../const-generic-type_name.stderr | 8 + .../const-param-elided-lifetime.rs | 24 + .../const-param-elided-lifetime.stderr | 40 + .../fn-const-param-infer.stderr | 2 +- ...ger-literal-generic-arg-in-where-clause.rs | 18 + ...literal-generic-arg-in-where-clause.stderr | 8 + .../invalid-const-arg-for-type-param.stderr | 2 +- .../ui/const-generics/issues/issue-61422.rs | 12 + .../ui/const-generics/issues/issue-61747.rs | 16 + .../const-generics/issues/issue-61747.stderr | 8 + .../ui/const-generics/issues/issue-66205.rs | 10 + src/test/ui/consts/array-literal-index-oob.rs | 12 +- .../ui/consts/array-literal-index-oob.stderr | 32 +- .../ui/consts/assoc_const_generic_impl.rs | 2 + .../ui/consts/assoc_const_generic_impl.stderr | 6 +- .../ui/consts/associated_const_generic.rs | 25 + .../consts/const-address-of-interior-mut.rs | 16 + .../const-address-of-interior-mut.stderr | 27 + src/test/ui/consts/const-address-of-mut.rs | 14 + .../ui/consts/const-address-of-mut.stderr | 39 + src/test/ui/consts/const-address-of.rs | 19 + src/test/ui/consts/const-err.rs | 1 + src/test/ui/consts/const-err.stderr | 8 +- src/test/ui/consts/const-err2.rs | 2 + src/test/ui/consts/const-err2.stderr | 12 +- src/test/ui/consts/const-err3.rs | 2 + src/test/ui/consts/const-err3.stderr | 12 +- .../consts/const-eval/auxiliary/stability.rs | 2 +- .../const-eval/conditional_array_execution.rs | 3 + .../conditional_array_execution.stderr | 12 +- .../const-eval/const-eval-overflow-2.rs | 1 + .../const-eval/const-eval-overflow-2.stderr | 8 +- .../consts/const-eval/const_fn_ptr_fail2.rs | 6 +- .../const-eval/const_fn_ptr_fail2.stderr | 6 +- .../ui/consts/const-eval/const_panic.stderr | 2 +- .../const-eval/const_panic_libcore.stderr | 2 +- .../const_panic_libcore_main.stderr | 2 +- .../dont_promote_unstable_const_fn.rs | 4 +- .../index-out-of-bounds-never-type.rs | 2 + .../index-out-of-bounds-never-type.stderr | 6 +- .../index_out_of_bounds_propagated.rs | 2 + .../index_out_of_bounds_propagated.stderr | 2 +- src/test/ui/consts/const-eval/issue-43197.rs | 8 +- .../ui/consts/const-eval/issue-43197.stderr | 30 +- src/test/ui/consts/const-eval/issue-44578.rs | 4 +- .../ui/consts/const-eval/issue-44578.stderr | 2 +- .../ui/consts/const-eval/issue-50814-2.rs | 2 + .../ui/consts/const-eval/issue-50814-2.stderr | 4 +- src/test/ui/consts/const-eval/issue-50814.rs | 8 +- .../ui/consts/const-eval/issue-50814.stderr | 4 +- .../const-eval/panic-assoc-never-type.rs | 2 + .../const-eval/panic-assoc-never-type.stderr | 8 +- .../ui/consts/const-eval/panic-never-type.rs | 2 + .../consts/const-eval/panic-never-type.stderr | 8 +- .../ui/consts/const-eval/promoted_errors.rs | 28 +- .../consts/const-eval/promoted_errors.stderr | 68 +- .../ui/consts/const-eval/promoted_errors2.rs | 30 +- .../consts/const-eval/promoted_errors2.stderr | 72 +- .../ui/consts/const-eval/ref_to_int_match.rs | 1 + .../consts/const-eval/ref_to_int_match.stderr | 10 +- .../consts/const-eval/simd/insert_extract.rs | 4 + .../ui/consts/const-eval/ub-nonnull.stderr | 2 +- src/test/ui/consts/const-eval/ub-wide-ptr.rs | 15 +- .../ui/consts/const-eval/ub-wide-ptr.stderr | 54 +- .../const-eval/validate_uninhabited_zsts.rs | 4 +- .../validate_uninhabited_zsts.stderr | 22 +- .../consts/const-fn-not-safe-for-const.stderr | 8 +- src/test/ui/consts/const-fn-type-name.rs | 1 + .../const-mut-refs/const_mut_address_of.rs | 30 + .../consts/const-mut-refs/const_mut_refs.rs | 1 - src/test/ui/consts/const-points-to-static.rs | 12 + .../ui/consts/const-points-to-static.stderr | 17 + src/test/ui/consts/const-prop-ice.rs | 2 + src/test/ui/consts/const-prop-ice.stderr | 2 +- src/test/ui/consts/const-prop-ice2.rs | 2 + src/test/ui/consts/const-prop-ice2.stderr | 2 +- src/test/ui/consts/const-prop-ice3.rs | 7 + .../ui/consts/const-prop-overflowing-casts.rs | 15 + .../consts/const-prop-read-static-in-const.rs | 3 +- .../const-prop-read-static-in-const.stderr | 14 +- src/test/ui/consts/const-size_of-cycle.rs | 5 +- src/test/ui/consts/const-size_of-cycle.stderr | 8 +- .../ui/consts/const_prop_slice_pat_ice.rs | 8 + src/test/ui/consts/consts-in-patterns.rs | 13 + .../exhaustive-c-like-enum-match.rs | 1 - ...eature-gate-const-if-match.if_match.stderr | 2 +- .../feature-gate-const-if-match.rs | 1 - .../feature-gate-const-if-match.stock.stderr | 50 +- .../control-flow/issue-50577.if_match.stderr | 2 +- .../ui/consts/control-flow/issue-50577.rs | 2 +- .../control-flow/issue-50577.stock.stderr | 2 +- .../consts/control-flow/short-circuit-let.rs | 1 - .../control-flow/single_variant_match_ice.rs | 2 +- src/test/ui/consts/enum-discr-type-err.rs | 1 + src/test/ui/consts/enum-discr-type-err.stderr | 19 +- src/test/ui/consts/huge-values.rs | 6 + src/test/ui/consts/issue-64662.stderr | 4 +- src/test/ui/consts/issue-67529.rs | 11 + src/test/ui/consts/issue-67640.rs | 24 + src/test/ui/consts/issue-67641.rs | 24 + .../ui/consts/issue-67696-const-prop-ice.rs | 20 + src/test/ui/consts/issue-67862.rs | 18 + src/test/ui/consts/issue-68264-overflow.rs | 43 + .../issue-68542-closure-in-array-len.rs | 10 + .../issue-68542-closure-in-array-len.stderr | 16 + ...sue-69191-ice-on-uninhabited-enum-field.rs | 91 + .../issue-69310-array-size-lit-wrong-ty.rs | 11 + ...issue-69310-array-size-lit-wrong-ty.stderr | 15 + src/test/ui/consts/match_ice.rs | 1 + src/test/ui/consts/match_ice.stderr | 10 +- src/test/ui/consts/min_const_fn/address_of.rs | 17 + .../ui/consts/min_const_fn/address_of.stderr | 21 + .../consts/min_const_fn/address_of_const.rs | 19 + .../min_const_fn_libstd_stability.rs | 8 +- .../min_const_unsafe_fn_libstd_stability.rs | 8 +- .../min_const_unsafe_fn_libstd_stability2.rs | 8 +- .../ui/consts/miri_unleashed/abi-mismatch.rs | 16 + .../consts/miri_unleashed/abi-mismatch.stderr | 28 + .../ui/consts/miri_unleashed/assoc_const.rs | 2 + .../consts/miri_unleashed/assoc_const.stderr | 4 +- .../ui/consts/miri_unleashed/assoc_const_2.rs | 2 + .../miri_unleashed/assoc_const_2.stderr | 2 +- .../miri_unleashed/const_refers_to_static.rs | 39 + .../const_refers_to_static.stderr | 106 + src/test/ui/consts/miri_unleashed/drop.rs | 23 + src/test/ui/consts/miri_unleashed/drop.stderr | 24 + .../consts/miri_unleashed/mutable_const2.rs | 19 + .../miri_unleashed/mutable_const2.stderr | 25 + .../mutable_references_ice.stderr | 2 +- .../ui/consts/miri_unleashed/non_const_fn.rs | 6 +- .../consts/miri_unleashed/non_const_fn.stderr | 14 +- src/test/ui/consts/offset_from_ub.rs | 5 +- src/test/ui/consts/offset_from_ub.stderr | 30 +- src/test/ui/consts/raw_pointer_promoted.rs | 5 + src/test/ui/consts/recursive-zst-static.rs | 7 + .../ui/consts/too_generic_eval_ice.stderr | 2 +- src/test/ui/consts/trait_specialization.rs | 65 + .../transmute-size-mismatch-before-typeck.rs | 20 + ...ansmute-size-mismatch-before-typeck.stderr | 34 + .../consts/uninhabited-const-issue-61744.rs | 10 +- .../uninhabited-const-issue-61744.stderr | 99 +- .../ui/consts/unstable-const-fn-in-libcore.rs | 2 +- src/test/ui/consts/validate_never_arrays.rs | 6 +- .../ui/consts/validate_never_arrays.stderr | 22 +- src/test/ui/consts/zst_no_llvm_alloc.rs | 10 +- src/test/ui/copy-a-resource.stderr | 2 +- .../cycle-trait-default-type-trait.rs | 1 + .../cycle-trait-default-type-trait.stderr | 15 +- ...duplicate-diagnostics-2.deduplicate.stderr | 28 + ...deduplicate-diagnostics-2.duplicate.stderr | 37 + src/test/ui/deduplicate-diagnostics-2.rs | 17 + ...deduplicate-diagnostics.deduplicate.stderr | 15 + .../deduplicate-diagnostics.duplicate.stderr | 33 + src/test/ui/deduplicate-diagnostics.rs | 11 + .../deprecated-macro_escape-inner.rs | 2 +- .../deprecated-macro_escape-inner.stderr | 4 +- .../ui/deprecation/deprecated-macro_escape.rs | 8 +- .../deprecated-macro_escape.stderr | 2 +- .../derives/derive-assoc-type-not-impl.stderr | 2 +- .../derives-span-Clone-enum-struct-variant.rs | 5 +- ...ives-span-Clone-enum-struct-variant.stderr | 2 +- .../ui/derives/derives-span-Clone-enum.rs | 5 +- .../ui/derives/derives-span-Clone-enum.stderr | 2 +- .../ui/derives/derives-span-Clone-struct.rs | 5 +- .../derives/derives-span-Clone-struct.stderr | 2 +- .../derives-span-Clone-tuple-struct.rs | 5 +- .../derives-span-Clone-tuple-struct.stderr | 2 +- .../derives-span-Debug-enum-struct-variant.rs | 5 +- ...ives-span-Debug-enum-struct-variant.stderr | 2 +- .../ui/derives/derives-span-Debug-enum.rs | 5 +- .../ui/derives/derives-span-Debug-enum.stderr | 2 +- .../ui/derives/derives-span-Debug-struct.rs | 5 +- .../derives/derives-span-Debug-struct.stderr | 2 +- .../derives-span-Debug-tuple-struct.rs | 5 +- .../derives-span-Debug-tuple-struct.stderr | 2 +- .../ui/derives/derives-span-Default-struct.rs | 5 +- .../derives-span-Default-struct.stderr | 2 +- .../derives-span-Default-tuple-struct.rs | 5 +- .../derives-span-Default-tuple-struct.stderr | 2 +- .../derives-span-Eq-enum-struct-variant.rs | 5 +- ...derives-span-Eq-enum-struct-variant.stderr | 2 +- src/test/ui/derives/derives-span-Eq-enum.rs | 5 +- .../ui/derives/derives-span-Eq-enum.stderr | 2 +- src/test/ui/derives/derives-span-Eq-struct.rs | 5 +- .../ui/derives/derives-span-Eq-struct.stderr | 2 +- .../derives/derives-span-Eq-tuple-struct.rs | 5 +- .../derives-span-Eq-tuple-struct.stderr | 2 +- .../derives-span-Hash-enum-struct-variant.rs | 5 +- ...rives-span-Hash-enum-struct-variant.stderr | 2 +- src/test/ui/derives/derives-span-Hash-enum.rs | 6 +- .../ui/derives/derives-span-Hash-enum.stderr | 2 +- .../ui/derives/derives-span-Hash-struct.rs | 5 +- .../derives/derives-span-Hash-struct.stderr | 2 +- .../derives/derives-span-Hash-tuple-struct.rs | 5 +- .../derives-span-Hash-tuple-struct.stderr | 2 +- .../derives-span-Ord-enum-struct-variant.rs | 5 +- ...erives-span-Ord-enum-struct-variant.stderr | 2 +- src/test/ui/derives/derives-span-Ord-enum.rs | 5 +- .../ui/derives/derives-span-Ord-enum.stderr | 2 +- .../ui/derives/derives-span-Ord-struct.rs | 5 +- .../ui/derives/derives-span-Ord-struct.stderr | 2 +- .../derives/derives-span-Ord-tuple-struct.rs | 5 +- .../derives-span-Ord-tuple-struct.stderr | 2 +- ...ives-span-PartialEq-enum-struct-variant.rs | 5 +- ...-span-PartialEq-enum-struct-variant.stderr | 4 +- .../ui/derives/derives-span-PartialEq-enum.rs | 5 +- .../derives-span-PartialEq-enum.stderr | 4 +- .../derives/derives-span-PartialEq-struct.rs | 5 +- .../derives-span-PartialEq-struct.stderr | 4 +- .../derives-span-PartialEq-tuple-struct.rs | 5 +- ...derives-span-PartialEq-tuple-struct.stderr | 4 +- ...ves-span-PartialOrd-enum-struct-variant.rs | 11 +- ...span-PartialOrd-enum-struct-variant.stderr | 40 +- .../derives/derives-span-PartialOrd-enum.rs | 11 +- .../derives-span-PartialOrd-enum.stderr | 40 +- .../derives/derives-span-PartialOrd-struct.rs | 11 +- .../derives-span-PartialOrd-struct.stderr | 40 +- .../derives-span-PartialOrd-tuple-struct.rs | 11 +- ...erives-span-PartialOrd-tuple-struct.stderr | 40 +- src/test/ui/derives/deriving-bounds.rs | 2 + src/test/ui/derives/deriving-bounds.stderr | 30 +- .../ui/derives/deriving-meta-unknown-trait.rs | 5 + .../deriving-meta-unknown-trait.stderr | 20 +- src/test/ui/derives/deriving-primitive.rs | 1 + src/test/ui/derives/deriving-primitive.stderr | 8 +- src/test/ui/destructure-trait-ref.rs | 2 - src/test/ui/destructure-trait-ref.stderr | 12 +- .../note-unsupported.rs | 25 + .../note-unsupported.stderr | 122 + src/test/ui/did_you_mean/bad-assoc-pat.rs | 12 +- src/test/ui/did_you_mean/bad-assoc-pat.stderr | 6 +- src/test/ui/did_you_mean/bad-assoc-ty.rs | 1 + src/test/ui/did_you_mean/bad-assoc-ty.stderr | 28 +- src/test/ui/did_you_mean/issue-40006.rs | 6 +- src/test/ui/did_you_mean/issue-40006.stderr | 14 +- src/test/ui/did_you_mean/issue-40396.rs | 6 +- src/test/ui/did_you_mean/issue-40396.stderr | 22 +- ...-identifier-not-instead-of-negation.stderr | 2 +- ...92-tuple-destructure-missing-parens.stderr | 24 +- .../issue-54109-and_instead_of_ampersands.rs | 39 +- ...sue-54109-and_instead_of_ampersands.stderr | 159 +- .../did_you_mean/recursion_limit_macro.stderr | 2 +- .../dollar-crate/dollar-crate-is-keyword.rs | 5 +- .../dollar-crate-is-keyword.stderr | 16 +- .../ui/dont-suggest-private-trait-method.rs | 2 +- .../dont-suggest-private-trait-method.stderr | 2 +- src/test/ui/drop/dynamic-drop-async.rs | 1 - src/test/ui/drop/dynamic-drop.rs | 7 +- src/test/ui/dropck/drop-on-non-struct.rs | 7 +- src/test/ui/dropck/drop-on-non-struct.stderr | 14 +- src/test/ui/dropck/dropck_fn_type.rs | 20 + src/test/ui/dropck/dropck_traits.rs | 68 + src/test/ui/dst/dst-bad-assign-3.rs | 2 +- src/test/ui/dst/dst-bad-assign-3.stderr | 2 +- src/test/ui/dst/dst-bad-assign.rs | 2 +- src/test/ui/dst/dst-bad-assign.stderr | 2 +- src/test/ui/duplicate/dupe-symbols-1.rs | 2 + src/test/ui/duplicate/dupe-symbols-1.stderr | 2 +- src/test/ui/duplicate/dupe-symbols-2.rs | 2 + src/test/ui/duplicate/dupe-symbols-2.stderr | 2 +- src/test/ui/duplicate/dupe-symbols-3.rs | 2 + src/test/ui/duplicate/dupe-symbols-3.stderr | 2 +- src/test/ui/duplicate/dupe-symbols-4.rs | 2 + src/test/ui/duplicate/dupe-symbols-4.stderr | 2 +- src/test/ui/duplicate/dupe-symbols-5.rs | 2 + src/test/ui/duplicate/dupe-symbols-5.stderr | 2 +- src/test/ui/duplicate/dupe-symbols-6.rs | 2 + src/test/ui/duplicate/dupe-symbols-6.stderr | 2 +- src/test/ui/duplicate/dupe-symbols-7.rs | 2 + src/test/ui/duplicate/dupe-symbols-7.stderr | 2 +- src/test/ui/duplicate_entry_error.rs | 2 +- src/test/ui/duplicate_entry_error.stderr | 4 +- src/test/ui/dyn-trait-compatibility.stderr | 12 +- src/test/ui/empty/empty-struct-braces-expr.rs | 6 +- .../ui/empty/empty-struct-braces-expr.stderr | 26 +- .../ui/empty/empty-struct-braces-pat-1.stderr | 5 + .../ui/empty/empty-struct-braces-pat-2.stderr | 20 + .../ui/empty/empty-struct-braces-pat-3.stderr | 10 + .../ui/empty/empty-struct-tuple-pat.stderr | 5 + .../ui/empty/empty-struct-unit-pat.stderr | 30 + src/test/ui/env-funky-keys.rs | 1 + src/test/ui/error-codes/E0007.rs | 3 +- src/test/ui/error-codes/E0007.stderr | 14 +- src/test/ui/error-codes/E0009.stderr | 2 +- src/test/ui/error-codes/E0030.rs | 1 + src/test/ui/error-codes/E0030.stderr | 8 +- src/test/ui/error-codes/E0034.stderr | 10 +- src/test/ui/error-codes/E0067.stderr | 8 +- src/test/ui/error-codes/E0070.stderr | 24 +- src/test/ui/error-codes/E0106.rs | 2 +- src/test/ui/error-codes/E0106.stderr | 32 +- src/test/ui/error-codes/E0117.rs | 3 +- src/test/ui/error-codes/E0117.stderr | 4 +- src/test/ui/error-codes/E0120.stderr | 4 +- src/test/ui/error-codes/E0121.stderr | 2 +- src/test/ui/error-codes/E0138.stderr | 2 +- src/test/ui/error-codes/E0152.stderr | 4 +- src/test/ui/error-codes/E0191.stderr | 6 +- src/test/ui/error-codes/E0220.stderr | 8 +- src/test/ui/error-codes/E0221.stderr | 20 +- src/test/ui/error-codes/E0261.stderr | 6 +- src/test/ui/error-codes/E0303.stderr | 19 - src/test/ui/error-codes/E0308-4.stderr | 8 +- src/test/ui/error-codes/E0393.stderr | 5 +- src/test/ui/error-codes/E0401.stderr | 2 +- src/test/ui/error-codes/E0452.rs | 6 +- src/test/ui/error-codes/E0452.stderr | 32 +- src/test/ui/error-codes/E0453.rs | 2 + src/test/ui/error-codes/E0453.stderr | 20 +- src/test/ui/error-codes/E0511.rs | 2 + src/test/ui/error-codes/E0511.stderr | 2 +- src/test/ui/error-codes/E0528.rs | 2 - src/test/ui/error-codes/E0528.stderr | 2 +- src/test/ui/error-codes/E0565.rs | 1 + src/test/ui/error-codes/E0565.stderr | 8 +- src/test/ui/error-codes/E0586.stderr | 6 +- src/test/ui/error-codes/E0599.stderr | 2 +- src/test/ui/error-codes/E0602.stderr | 10 +- src/test/ui/error-codes/E0603.stderr | 8 +- src/test/ui/error-codes/E0658.stderr | 2 +- src/test/ui/error-codes/E0719.stderr | 4 +- src/test/ui/error-codes/E0746.fixed | 18 + src/test/ui/error-codes/E0746.rs | 18 + src/test/ui/error-codes/E0746.stderr | 27 + .../ui/error-codes/e0119/complex-impl.stderr | 2 +- src/test/ui/error-festival.stderr | 10 +- ...sive_range_pattern_syntax_collision.stderr | 20 - ...ive_range_pattern_syntax_collision2.stderr | 27 - ...ive_range_pattern_syntax_collision3.stderr | 31 - src/test/ui/export-import.stderr | 8 +- src/test/ui/export-tag-variant.stderr | 8 +- src/test/ui/export.stderr | 8 +- src/test/ui/extern/extern-crate-visibility.rs | 4 +- .../ui/extern/extern-crate-visibility.stderr | 20 +- src/test/ui/extern/extern-main-fn.rs | 2 +- src/test/ui/extern/extern-main-fn.stderr | 2 +- .../extern/extern-types-distinct-types.stderr | 5 + ...llow-unwind-when-calling-panic-directly.rs | 6 +- .../issue-43106-gating-of-builtin-attrs.rs | 6 +- ...issue-43106-gating-of-builtin-attrs.stderr | 6 +- .../issue-43106-gating-of-derive-2.rs | 3 + .../issue-43106-gating-of-derive-2.stderr | 24 +- .../issue-43106-gating-of-macro_escape.rs | 2 +- .../issue-43106-gating-of-macro_escape.stderr | 4 +- .../issue-43106-gating-of-macro_use.rs | 6 +- .../issue-43106-gating-of-macro_use.stderr | 6 +- .../issue-43106-gating-of-rustc_deprecated.rs | 1 + ...ue-43106-gating-of-rustc_deprecated.stderr | 12 +- .../issue-43106-gating-of-stable.rs | 1 + .../issue-43106-gating-of-stable.stderr | 12 +- .../issue-43106-gating-of-unstable.rs | 1 + .../issue-43106-gating-of-unstable.stderr | 12 +- .../stability-attribute-consistency.rs | 2 +- .../stability-attribute-consistency.stderr | 4 +- ...rs => unstable-attribute-allow-issue-0.rs} | 2 +- ...> unstable-attribute-allow-issue-0.stderr} | 2 +- .../feature-gate-external_doc.rs | 1 + .../feature-gate-external_doc.stderr | 11 +- .../feature-gates/feature-gate-generators.rs | 2 +- .../feature-gate-generators.stderr | 5 +- .../feature-gate-generic_associated_types.rs | 2 + ...ature-gate-generic_associated_types.stderr | 30 +- .../feature-gate-in_band_lifetimes.stderr | 118 +- .../feature-gate-lint-reasons.rs | 2 + .../feature-gate-lint-reasons.stderr | 20 +- .../feature-gate-never_type.stderr | 10 +- .../feature-gates/feature-gate-repr-simd.rs | 3 +- .../feature-gate-repr-simd.stderr | 11 +- .../feature-gates/feature-gate-repr128.stderr | 2 +- .../feature-gate-sanitizer-runtime.rs | 3 - .../feature-gate-sanitizer-runtime.stderr | 11 - .../feature-gate-slice-patterns.rs | 17 - .../feature-gate-slice-patterns.stderr | 57 - .../ui/feature-gates/feature-gate-start.rs | 2 +- .../feature-gates/feature-gate-start.stderr | 2 +- .../feature-gate-transparent_enums.rs | 6 - .../feature-gate-transparent_enums.stderr | 12 - .../feature-gate-type_alias_impl_trait.stderr | 18 +- ...-gate-unboxed-closures-manual-impls.stderr | 12 +- .../feature-gate-unboxed-closures.stderr | 4 +- .../for-loop-while/for-loop-has-unit-body.rs | 4 +- src/test/ui/for/for-loop-type-error.rs | 2 +- src/test/ui/for/for-loop-type-error.stderr | 2 +- .../ui/future-incompatible-lint-group.stderr | 2 +- .../generator/auto-trait-regions.nll.stderr | 6 +- src/test/ui/generator/auto-trait-regions.rs | 2 + .../ui/generator/auto-trait-regions.stderr | 28 +- src/test/ui/generator/not-send-sync.stderr | 2 +- src/test/ui/generator/yield-in-const.rs | 2 +- src/test/ui/generator/yield-in-const.stderr | 3 +- src/test/ui/generator/yield-in-function.rs | 2 +- .../ui/generator/yield-in-function.stderr | 3 +- src/test/ui/generator/yield-in-static.rs | 2 +- src/test/ui/generator/yield-in-static.stderr | 3 +- .../collections.rs | 12 +- .../collections.stderr | 19 + .../construct_with_other_type.rs | 26 + .../construct_with_other_type.stderr | 13 + .../empty_generics.rs | 2 +- .../empty_generics.stderr | 8 + .../gat-dont-ice-on-absent-feature-2.rs | 17 + .../gat-dont-ice-on-absent-feature-2.stderr | 29 + .../gat-dont-ice-on-absent-feature.rs | 4 +- .../gat-dont-ice-on-absent-feature.stderr | 19 + .../gat-incomplete-warning.rs | 0 .../gat-incomplete-warning.stderr | 0 .../generic-associated-types-where.rs | 10 +- .../generic-associated-types-where.stderr | 26 + ...ic_associated_type_undeclared_lifetimes.rs | 16 + ...ssociated_type_undeclared_lifetimes.stderr | 33 + .../generic-associated-types/impl_bounds.rs | 23 + .../impl_bounds.stderr | 46 + .../impl_bounds_ok.rs | 30 + .../issue-47206-where-clause.rs | 17 + .../issue-47206-where-clause.stderr | 10 + .../issue-58694-parameter-out-of-range.rs | 10 + .../issue-62326-parameter-out-of-range.rs | 11 + .../issue-62326-parameter-out-of-range.stderr | 15 + .../generic-associated-types/issue-67424.rs | 13 + .../issue-67424.stderr | 20 + .../ui/generic-associated-types/iterable.rs | 51 + .../generic-associated-types/iterable.stderr | 63 + .../parameter_number_and_kind.rs | 24 + .../parameter_number_and_kind.stderr | 53 + .../parameter_number_and_kind_impl.rs | 35 + .../parameter_number_and_kind_impl.stderr | 62 + .../parse/in-trait-impl.rs | 2 +- .../parse/in-trait.rs | 3 +- .../pointer_family.rs | 9 +- .../pointer_family.stderr | 10 + .../shadowing.rs | 8 +- .../shadowing.stderr | 20 +- .../streaming_iterator.rs | 48 +- ...xclusive_range_pattern_syntax_collision.rs | 4 +- ...sive_range_pattern_syntax_collision.stderr | 14 + ...clusive_range_pattern_syntax_collision2.rs | 4 +- ...ive_range_pattern_syntax_collision2.stderr | 21 + ...clusive_range_pattern_syntax_collision3.rs | 3 +- ...ive_range_pattern_syntax_collision3.stderr | 40 + .../feature-gate-half-open-range-patterns.rs | 22 + ...ature-gate-half-open-range-patterns.stderr | 80 + .../half-open-range-pats-bad-types.rs | 8 + .../half-open-range-pats-bad-types.stderr | 21 + .../half-open-range-pats-exhaustive-fail.rs | 168 + ...alf-open-range-pats-exhaustive-fail.stderr | 547 + .../half-open-range-pats-exhaustive-pass.rs | 49 + .../half-open-range-pats-hair-lower-empty.rs | 54 + ...lf-open-range-pats-hair-lower-empty.stderr | 159 + ...nge-pats-inclusive-dotdotdot-bad-syntax.rs | 32 + ...pats-inclusive-dotdotdot-bad-syntax.stderr | 35 + .../half-open-range-pats-inclusive-no-end.rs | 26 + ...lf-open-range-pats-inclusive-no-end.stderr | 57 + ...lf-open-range-pats-ref-ambiguous-interp.rs | 26 + ...pen-range-pats-ref-ambiguous-interp.stderr | 55 + .../half-open-range-pats-semantics.rs | 160 + .../half-open-range-pats-syntactic-pass.rs | 30 + .../half-open-range-patterns/pat-tuple-4.rs | 13 + .../half-open-range-patterns/pat-tuple-5.rs | 10 + .../pat-tuple-5.stderr | 14 + .../hrtb/hrtb-perfect-forwarding.nll.stderr | 15 +- src/test/ui/hrtb/hrtb-perfect-forwarding.rs | 1 + .../ui/hrtb/hrtb-perfect-forwarding.stderr | 11 +- src/test/ui/hrtb/issue-30786.nll.stderr | 40 +- src/test/ui/hrtb/issue-30786.rs | 7 +- src/test/ui/huge-array-simple-32.rs | 1 + src/test/ui/huge-array-simple-32.stderr | 2 +- src/test/ui/huge-array-simple-64.rs | 1 + src/test/ui/huge-array-simple-64.stderr | 2 +- src/test/ui/huge-array.rs | 2 + src/test/ui/huge-array.stderr | 2 +- src/test/ui/huge-enum.rs | 1 + src/test/ui/huge-enum.stderr | 2 +- src/test/ui/huge-struct.rs | 1 + src/test/ui/huge-struct.stderr | 2 +- src/test/ui/hygiene/globs.stderr | 15 +- .../ui/hygiene/no_implicit_prelude.stderr | 2 +- src/test/ui/hygiene/privacy.stderr | 8 +- src/test/ui/hygiene/trait_items.rs | 2 +- src/test/ui/hygiene/trait_items.stderr | 2 +- src/test/ui/if-else-type-mismatch.rs | 16 +- src/test/ui/if-else-type-mismatch.stderr | 28 +- src/test/ui/if/if-branch-types.rs | 2 +- src/test/ui/if/if-branch-types.stderr | 2 +- src/test/ui/if/if-let-arm-types.rs | 4 +- src/test/ui/if/if-let-arm-types.stderr | 4 +- src/test/ui/if/if-let.stderr | 4 +- src/test/ui/if/if-without-block.rs | 2 +- src/test/ui/if/if-without-block.stderr | 2 +- src/test/ui/if/if-without-else-as-fn-expr.rs | 12 +- .../ui/if/if-without-else-as-fn-expr.stderr | 12 +- src/test/ui/if/if-without-else-result.rs | 2 +- src/test/ui/if/if-without-else-result.stderr | 2 +- src/test/ui/ignore-all-the-things.rs | 3 - .../assoc-type.stderr | 14 +- src/test/ui/impl-trait/auto-trait-leak.rs | 1 + src/test/ui/impl-trait/auto-trait-leak.stderr | 50 +- .../ui/impl-trait/auto-trait-leak2.stderr | 6 + src/test/ui/impl-trait/bindings-opaque.stderr | 6 +- .../impl-trait/does-not-live-long-enough.rs | 11 + .../does-not-live-long-enough.stderr | 21 + .../dyn-trait-return-should-be-impl-trait.rs | 74 + ...n-trait-return-should-be-impl-trait.stderr | 272 + src/test/ui/impl-trait/equality.stderr | 6 + src/test/ui/impl-trait/equality2.stderr | 18 + .../ui/impl-trait/impl-generic-mismatch.rs | 5 +- .../impl-trait/impl-generic-mismatch.stderr | 6 +- ...issue-21659-show-relevant-trait-impls-3.rs | 2 +- ...e-21659-show-relevant-trait-impls-3.stderr | 2 +- .../method-suggestion-no-duplication.stderr | 2 +- .../multiple-lifetimes/error-handling.stderr | 4 +- ...t_outlive_least_region_or_bound.nll.stderr | 4 +- .../must_outlive_least_region_or_bound.stderr | 6 +- .../impl-trait/no-method-suggested-traits.rs | 2 +- .../no-method-suggested-traits.stderr | 38 +- ...safe-trait-in-return-position-dyn-trait.rs | 35 + ...-trait-in-return-position-dyn-trait.stderr | 21 + ...afe-trait-in-return-position-impl-trait.rs | 46 + ...trait-in-return-position-impl-trait.stderr | 39 + .../recursive-impl-trait-type-indirect.stderr | 4 +- .../static-return-lifetime-infered.nll.stderr | 4 +- .../static-return-lifetime-infered.stderr | 4 +- src/test/ui/import.stderr | 10 +- .../extern-crate-self-fail.rs | 2 +- .../extern-crate-self-fail.stderr | 2 +- ...elude-extern-crate-restricted-shadowing.rs | 5 +- ...e-extern-crate-restricted-shadowing.stderr | 6 +- src/test/ui/imports/import-crate-var.rs | 4 +- src/test/ui/imports/import-crate-var.stderr | 9 +- src/test/ui/imports/issue-55457.rs | 2 + src/test/ui/imports/issue-55457.stderr | 18 +- src/test/ui/imports/issue-55884-2.rs | 2 +- src/test/ui/imports/issue-55884-2.stderr | 10 +- .../local-modularized-tricky-fail-1.rs | 1 + .../local-modularized-tricky-fail-1.stderr | 29 +- src/test/ui/imports/macros.rs | 1 + src/test/ui/imports/macros.stderr | 28 +- src/test/ui/imports/reexports.stderr | 20 +- .../ui/imports/unresolved-imports-used.stderr | 8 +- src/test/ui/impossible_range.rs | 6 +- src/test/ui/impossible_range.stderr | 12 +- ...anon-lifetime-in-struct-declaration.stderr | 7 +- .../mismatched_trait_impl-2.rs | 5 +- .../mismatched_trait_impl-2.stderr | 2 +- .../no_in_band_in_struct.stderr | 4 + .../no_introducing_in_band_in_locals.stderr | 2 + .../inference_unstable_featured.stderr | 10 +- .../ui/infinite/infinite-autoderef.stderr | 2 +- .../ui/infinite/infinite-instantiation.rs | 2 + .../ui/infinite/infinite-instantiation.stderr | 2 +- .../ui/infinite/infinite-macro-expansion.rs | 2 +- .../infinite/infinite-macro-expansion.stderr | 2 +- src/test/ui/inline-asm-bad-constraint.rs | 1 + src/test/ui/inline-asm-bad-constraint.stderr | 6 +- src/test/ui/inline-asm-bad-operand.rs | 1 + src/test/ui/inline-asm-bad-operand.stderr | 14 +- .../interior-mutability.rs | 5 +- .../interior-mutability.stderr | 4 +- .../internal/auxiliary/internal_unstable.rs | 8 +- .../ui/internal/internal-unstable-const.rs | 10 + .../internal/internal-unstable-const.stderr | 12 + .../ui/invalid/invalid-variadic-function.rs | 3 - .../invalid/invalid-variadic-function.stderr | 15 - src/test/ui/invalid_const_promotion.rs | 61 - src/test/ui/issues/auxiliary/issue-52489.rs | 2 +- .../ui/issues/auxiliary/lint-stability.rs | 46 +- src/test/ui/issues/issue-10465.stderr | 2 +- src/test/ui/issues/issue-10545.stderr | 8 +- src/test/ui/issues/issue-11154.rs | 1 + src/test/ui/issues/issue-11319.rs | 2 +- src/test/ui/issues/issue-11319.stderr | 2 +- src/test/ui/issues/issue-11593.stderr | 8 +- src/test/ui/issues/issue-11680.stderr | 16 +- src/test/ui/issues/issue-11844.stderr | 2 +- src/test/ui/issues/issue-12028.stderr | 2 +- src/test/ui/issues/issue-12369.rs | 1 - src/test/ui/issues/issue-12369.stderr | 4 +- src/test/ui/issues/issue-12552.stderr | 2 +- src/test/ui/issues/issue-12567.rs | 2 - src/test/ui/issues/issue-12567.stderr | 4 +- src/test/ui/issues/issue-13407.rs | 2 +- src/test/ui/issues/issue-13407.stderr | 16 +- src/test/ui/issues/issue-13466.stderr | 4 +- src/test/ui/issues/issue-13483.rs | 2 + src/test/ui/issues/issue-13483.stderr | 23 +- src/test/ui/issues/issue-13641.stderr | 16 +- src/test/ui/issues/issue-13853.stderr | 2 +- src/test/ui/issues/issue-14221.stderr | 2 + src/test/ui/issues/issue-14541.stderr | 4 +- src/test/ui/issues/issue-14915.rs | 2 +- src/test/ui/issues/issue-14915.stderr | 2 +- src/test/ui/issues/issue-15080.rs | 1 - src/test/ui/issues/issue-15104.rs | 1 - src/test/ui/issues/issue-15896.stderr | 2 +- src/test/ui/issues/issue-15919-32.rs | 1 + src/test/ui/issues/issue-15919-32.stderr | 2 +- src/test/ui/issues/issue-15919-64.rs | 1 + src/test/ui/issues/issue-15919-64.stderr | 2 +- src/test/ui/issues/issue-16098.rs | 2 +- src/test/ui/issues/issue-16098.stderr | 2 +- src/test/ui/issues/issue-16338.stderr | 4 +- src/test/ui/issues/issue-16401.stderr | 2 +- src/test/ui/issues/issue-16725.stderr | 8 +- src/test/ui/issues/issue-16966.stderr | 2 +- src/test/ui/issues/issue-17337.rs | 4 +- src/test/ui/issues/issue-17546.rs | 4 + src/test/ui/issues/issue-17546.stderr | 18 +- src/test/ui/issues/issue-17551.stderr | 2 +- .../ui/issues/issue-17718-const-bad-values.rs | 1 + .../issue-17718-const-bad-values.stderr | 14 +- .../issues/issue-17718-const-privacy.stderr | 16 +- .../ui/issues/issue-17718-references.stderr | 12 +- src/test/ui/issues/issue-17728.nll.stderr | 2 +- src/test/ui/issues/issue-17728.rs | 2 +- src/test/ui/issues/issue-17728.stderr | 2 +- src/test/ui/issues/issue-17732.rs | 1 + src/test/ui/issues/issue-17877.rs | 1 - src/test/ui/issues/issue-17913.rs | 1 + src/test/ui/issues/issue-17959.rs | 2 +- src/test/ui/issues/issue-17959.stderr | 16 +- src/test/ui/issues/issue-18118-2.rs | 3 +- src/test/ui/issues/issue-18118-2.stderr | 4 +- src/test/ui/issues/issue-18446.stderr | 6 +- src/test/ui/issues/issue-19100.stderr | 2 + src/test/ui/issues/issue-19482.rs | 2 +- src/test/ui/issues/issue-19482.stderr | 6 +- src/test/ui/issues/issue-19521.stderr | 2 +- src/test/ui/issues/issue-19692.stderr | 2 +- src/test/ui/issues/issue-19707.stderr | 12 +- src/test/ui/issues/issue-19991.rs | 4 +- src/test/ui/issues/issue-19991.stderr | 2 +- src/test/ui/issues/issue-20831-debruijn.rs | 1 + .../ui/issues/issue-20831-debruijn.stderr | 44 +- src/test/ui/issues/issue-21160.rs | 5 +- src/test/ui/issues/issue-21160.stderr | 2 +- src/test/ui/issues/issue-21596.stderr | 2 +- src/test/ui/issues/issue-21950.rs | 15 +- src/test/ui/issues/issue-21950.stderr | 22 +- src/test/ui/issues/issue-22370.stderr | 5 +- src/test/ui/issues/issue-22434.rs | 2 +- src/test/ui/issues/issue-22434.stderr | 6 +- src/test/ui/issues/issue-22560.rs | 19 +- src/test/ui/issues/issue-22560.stderr | 68 +- src/test/ui/issues/issue-22638.rs | 1 + src/test/ui/issues/issue-22638.stderr | 2 +- src/test/ui/issues/issue-22933-2.rs | 2 +- src/test/ui/issues/issue-22933-2.stderr | 2 +- src/test/ui/issues/issue-22933-3.rs | 2 +- src/test/ui/issues/issue-23024.rs | 2 +- src/test/ui/issues/issue-23024.stderr | 10 +- src/test/ui/issues/issue-23173.rs | 6 +- src/test/ui/issues/issue-23173.stderr | 8 +- src/test/ui/issues/issue-23217.rs | 2 +- src/test/ui/issues/issue-23217.stderr | 2 +- src/test/ui/issues/issue-23311.rs | 3 +- src/test/ui/issues/issue-23458.rs | 1 + src/test/ui/issues/issue-23458.stderr | 4 +- src/test/ui/issues/issue-23595-2.stderr | 4 +- src/test/ui/issues/issue-24036.rs | 2 +- src/test/ui/issues/issue-24036.stderr | 4 +- src/test/ui/issues/issue-24363.rs | 2 +- src/test/ui/issues/issue-24363.stderr | 2 +- src/test/ui/issues/issue-25368.stderr | 2 +- src/test/ui/issues/issue-25385.rs | 4 +- src/test/ui/issues/issue-26093.rs | 4 +- src/test/ui/issues/issue-26093.stderr | 28 +- src/test/ui/issues/issue-26217.stderr | 1 + src/test/ui/issues/issue-26619.rs | 2 - src/test/ui/issues/issue-26619.stderr | 2 +- src/test/ui/issues/issue-26638.stderr | 6 +- src/test/ui/issues/issue-27033.rs | 5 +- src/test/ui/issues/issue-27033.stderr | 4 +- src/test/ui/issues/issue-2823.stderr | 2 +- src/test/ui/issues/issue-28344.stderr | 12 +- src/test/ui/issues/issue-28388-2.stderr | 8 +- src/test/ui/issues/issue-28586.rs | 2 +- src/test/ui/issues/issue-28837.rs | 18 +- src/test/ui/issues/issue-28837.stderr | 18 +- src/test/ui/issues/issue-28971.rs | 2 +- src/test/ui/issues/issue-28971.stderr | 2 +- src/test/ui/issues/issue-29124.rs | 4 +- src/test/ui/issues/issue-29124.stderr | 8 +- src/test/ui/issues/issue-29161.stderr | 8 +- src/test/ui/issues/issue-30123.rs | 2 +- src/test/ui/issues/issue-30123.stderr | 2 +- src/test/ui/issues/issue-30255.stderr | 18 +- src/test/ui/issues/issue-30302.stderr | 2 + src/test/ui/issues/issue-31076.rs | 4 +- src/test/ui/issues/issue-31076.stderr | 4 +- src/test/ui/issues/issue-31173.stderr | 2 +- src/test/ui/issues/issue-32963.rs | 1 + src/test/ui/issues/issue-32963.stderr | 13 +- src/test/ui/issues/issue-33571.rs | 1 + src/test/ui/issues/issue-33571.stderr | 14 +- src/test/ui/issues/issue-33575.rs | 2 +- src/test/ui/issues/issue-33575.stderr | 2 +- src/test/ui/issues/issue-34209.rs | 2 +- src/test/ui/issues/issue-34209.stderr | 3 +- src/test/ui/issues/issue-34229.rs | 4 + src/test/ui/issues/issue-34229.stderr | 38 +- src/test/ui/issues/issue-34334.rs | 4 +- src/test/ui/issues/issue-34334.stderr | 10 +- src/test/ui/issues/issue-35600.rs | 2 + src/test/ui/issues/issue-35668.rs | 2 +- src/test/ui/issues/issue-35668.stderr | 2 +- src/test/ui/issues/issue-35677.stderr | 2 +- src/test/ui/issues/issue-36617.rs | 1 + src/test/ui/issues/issue-36617.stderr | 10 +- src/test/ui/issues/issue-3680.stderr | 2 +- src/test/ui/issues/issue-3702-2.stderr | 10 +- src/test/ui/issues/issue-37026.stderr | 4 +- src/test/ui/issues/issue-3707.rs | 2 +- src/test/ui/issues/issue-3707.stderr | 2 +- .../issue-37311.rs | 2 + .../issue-37311.stderr | 2 +- src/test/ui/issues/issue-37433.rs | 1 + src/test/ui/issues/issue-37433.stderr | 2 +- src/test/ui/issues/issue-37598.rs | 1 - src/test/ui/issues/issue-3820.rs | 2 +- src/test/ui/issues/issue-3820.stderr | 2 +- src/test/ui/issues/issue-38591.rs | 10 - src/test/ui/issues/issue-38715.rs | 2 +- src/test/ui/issues/issue-38715.stderr | 14 +- src/test/ui/issues/issue-38857.rs | 5 + src/test/ui/issues/issue-38857.stderr | 12 +- src/test/ui/issues/issue-38868.stderr | 4 +- src/test/ui/issues/issue-38919.rs | 2 +- src/test/ui/issues/issue-38919.stderr | 2 +- src/test/ui/issues/issue-39175.stderr | 2 +- src/test/ui/issues/issue-39211.stderr | 4 +- src/test/ui/issues/issue-39559.rs | 2 +- src/test/ui/issues/issue-39559.stderr | 2 +- src/test/ui/issues/issue-39720.rs | 10 +- src/test/ui/issues/issue-39720.stderr | 16 - src/test/ui/issues/issue-3973.rs | 2 +- src/test/ui/issues/issue-3973.stderr | 2 +- src/test/ui/issues/issue-39848.stderr | 2 +- src/test/ui/issues/issue-3993.stderr | 8 +- src/test/ui/issues/issue-40610.rs | 2 +- src/test/ui/issues/issue-40610.stderr | 2 +- src/test/ui/issues/issue-41255.rs | 33 + src/test/ui/issues/issue-41255.stderr | 150 +- src/test/ui/issues/issue-41394.rs | 2 +- src/test/ui/issues/issue-41394.stderr | 2 +- src/test/ui/issues/issue-41880.rs | 2 +- src/test/ui/issues/issue-41880.stderr | 2 +- src/test/ui/issues/issue-41974.stderr | 4 +- src/test/ui/issues/issue-4201.rs | 2 +- src/test/ui/issues/issue-4201.stderr | 2 +- src/test/ui/issues/issue-42880.stderr | 2 +- src/test/ui/issues/issue-43105.rs | 1 + src/test/ui/issues/issue-43105.stderr | 8 +- src/test/ui/issues/issue-43189.rs | 2 +- src/test/ui/issues/issue-43189.stderr | 2 +- src/test/ui/issues/issue-45730.stderr | 6 +- src/test/ui/issues/issue-46101.rs | 1 + src/test/ui/issues/issue-46101.stderr | 8 +- src/test/ui/issues/issue-47094.rs | 8 +- src/test/ui/issues/issue-47094.stderr | 23 +- src/test/ui/issues/issue-47377.stderr | 2 +- src/test/ui/issues/issue-47380.stderr | 2 +- src/test/ui/issues/issue-48131.rs | 6 +- src/test/ui/issues/issue-48508.rs | 1 + .../option-as_deref.rs | 2 +- .../option-as_deref.stderr | 2 +- .../option-as_deref_mut.rs | 2 +- .../option-as_deref_mut.stderr | 2 +- .../result-as_deref.stderr | 2 +- .../result-as_deref_err.stderr | 4 +- .../result-as_deref_mut.stderr | 2 +- .../result-as_deref_mut_err.stderr | 4 +- .../result-as_deref_mut_ok.rs | 6 - .../result-as_deref_mut_ok.stderr | 12 - .../result-as_deref_ok.rs | 6 - .../result-as_deref_ok.stderr | 12 - src/test/ui/issues/issue-50480.rs | 1 + src/test/ui/issues/issue-50480.stderr | 8 +- src/test/ui/issues/issue-5062.stderr | 2 +- src/test/ui/issues/issue-5100.stderr | 2 +- src/test/ui/issues/issue-5153.rs | 2 +- src/test/ui/issues/issue-5153.stderr | 2 +- src/test/ui/issues/issue-51602.stderr | 2 +- src/test/ui/issues/issue-51770.rs | 20 + src/test/ui/issues/issue-52060.rs | 1 + src/test/ui/issues/issue-52060.stderr | 15 +- src/test/ui/issues/issue-53251.rs | 1 + src/test/ui/issues/issue-53251.stderr | 11 +- src/test/ui/issues/issue-5358-1.stderr | 2 +- .../issue-53787-inline-assembler-macro.rs | 1 + .../issue-53787-inline-assembler-macro.stderr | 2 +- src/test/ui/issues/issue-53840.stderr | 4 +- src/test/ui/issues/issue-54062.stderr | 2 +- src/test/ui/issues/issue-54348.rs | 2 + src/test/ui/issues/issue-54348.stderr | 4 +- src/test/ui/issues/issue-54943.stderr | 1 + src/test/ui/issues/issue-57362-1.stderr | 4 +- src/test/ui/issues/issue-57362-2.stderr | 2 +- src/test/ui/issues/issue-57741-1.stderr | 4 +- src/test/ui/issues/issue-57741.stderr | 8 +- src/test/ui/issues/issue-58022.stderr | 6 +- src/test/ui/issues/issue-58212.rs | 9 +- src/test/ui/issues/issue-58344.stderr | 6 + src/test/ui/issues/issue-58712.stderr | 4 +- src/test/ui/issues/issue-58734.rs | 2 +- src/test/ui/issues/issue-58734.stderr | 2 +- src/test/ui/issues/issue-5883.stderr | 3 + src/test/ui/issues/issue-58856-1.rs | 2 + src/test/ui/issues/issue-58856-1.stderr | 17 +- src/test/ui/issues/issue-58857.rs | 2 +- src/test/ui/issues/issue-58857.stderr | 6 +- src/test/ui/issues/issue-59029-1.rs | 1 + src/test/ui/issues/issue-59029-1.stderr | 12 +- src/test/ui/issues/issue-60075.stderr | 2 +- src/test/ui/issues/issue-61858.stderr | 2 +- src/test/ui/issues/issue-62554.rs | 5 +- src/test/ui/issues/issue-62554.stderr | 70 +- src/test/ui/issues/issue-64430.stderr | 2 +- src/test/ui/issues/issue-6458-2.stderr | 2 +- src/test/ui/issues/issue-6458-3.stderr | 2 +- src/test/ui/issues/issue-6458.stderr | 2 +- ...issue-65284-suggest-generic-trait-bound.rs | 2 +- ...e-65284-suggest-generic-trait-bound.stderr | 2 +- .../issue-65634-raw-ident-suggestion.stderr | 10 +- src/test/ui/issues/issue-66308.rs | 8 + src/test/ui/issues/issue-66473.rs | Bin 0 -> 113 bytes src/test/ui/issues/issue-66473.stderr | Bin 0 -> 2632 bytes ...issue-66923-show-error-for-correct-call.rs | 15 + ...e-66923-show-error-for-correct-call.stderr | 19 + ...67037-pat-tup-scrut-ty-diff-less-fields.rs | 2 +- ...7-pat-tup-scrut-ty-diff-less-fields.stderr | 4 +- src/test/ui/issues/issue-6804.rs | 4 +- src/test/ui/issues/issue-6804.stderr | 11 +- .../issue-68091-unicode-ident-after-if.rs | 2 +- .../issue-68091-unicode-ident-after-if.stderr | 12 +- src/test/ui/issues/issue-68103.rs | 6 + .../issue-69396-const-no-type-in-macro.rs | 17 + .../issue-69396-const-no-type-in-macro.stderr | 48 + src/test/ui/issues/issue-7092.stderr | 2 +- src/test/ui/issues/issue-7607-1.rs | 4 + src/test/ui/issues/issue-7607-1.stderr | 7 +- src/test/ui/issues/issue-7784.rs | 1 - src/test/ui/issues/issue-7950.rs | 2 +- src/test/ui/issues/issue-7950.stderr | 2 +- src/test/ui/issues/issue-8460-const.rs | 1 + src/test/ui/issues/issue-8460-const.stderr | 62 +- src/test/ui/issues/issue-8460-const2.rs | 1 + src/test/ui/issues/issue-8460-const2.stderr | 42 +- src/test/ui/issues/issue-8460.rs | 4 +- src/test/ui/issues/issue-8727.rs | 2 + src/test/ui/issues/issue-8727.stderr | 4 +- src/test/ui/issues/issue-9575.rs | 2 +- src/test/ui/issues/issue-9575.stderr | 2 +- .../iterators/into-iter-on-arrays-lint.fixed | 25 + .../ui/iterators/into-iter-on-arrays-lint.rs | 25 + .../iterators/into-iter-on-arrays-lint.stderr | 72 + src/test/ui/iterators/skip-count-overflow.rs | 8 + src/test/ui/json-and-color.rs | 1 - src/test/ui/json-and-error-format.rs | 1 - src/test/ui/json-bom-plus-crlf-multifile.rs | 1 - src/test/ui/json-bom-plus-crlf.rs | 1 - src/test/ui/json-bom-plus-crlf.stderr | 8 +- src/test/ui/json-invalid.rs | 1 - src/test/ui/json-short.rs | 1 - src/test/ui/json-short.stderr | 2 +- .../ui/keyword/keyword-super-as-identifier.rs | 2 +- .../keyword-super-as-identifier.stderr | 4 +- src/test/ui/keyword/keyword-super.rs | 2 +- src/test/ui/keyword/keyword-super.stderr | 4 +- .../ui/kindck/kindck-impl-type-params.stderr | 3 +- .../ui/kindck/kindck-nonsendable-1.stderr | 4 +- src/test/ui/kindck/kindck-send-object1.stderr | 3 +- .../label_break_value_illegal_uses.stderr | 2 +- ...line-endings-string-literal-doc-comment.rs | 5 +- src/test/ui/lexical-scopes.stderr | 2 +- ...urn-type-requires-explicit-lifetime.stderr | 12 +- .../lifetime-elision-return-type-trait.stderr | 3 + .../ex1b-return-no-names-if-else.stderr | 6 +- ...-detect-extern-generated-name-collision.rs | 1 + ...e-detect-local-generated-name-collision.rs | 2 + ...tect-local-generated-name-collision.stderr | 2 +- .../linkage-attr/linkage-requires-raw-ptr.rs | 1 + src/test/ui/linkage-attr/linkage2.rs | 2 + src/test/ui/linkage-attr/linkage2.stderr | 2 +- src/test/ui/linkage-attr/linkage3.rs | 2 + src/test/ui/linkage-attr/linkage3.stderr | 2 +- .../ui/lint/auxiliary/inherited_stability.rs | 8 +- .../ui/lint/auxiliary/lint_output_format.rs | 6 +- src/test/ui/lint/auxiliary/lint_stability.rs | 46 +- .../lint/auxiliary/lint_stability_fields.rs | 24 +- src/test/ui/lint/auxiliary/stability-cfg2.rs | 2 +- src/test/ui/lint/auxiliary/stability_cfg2.rs | 2 +- .../ui/lint/command-line-lint-group-allow.rs | 2 +- .../ui/lint/dead-code/tuple-struct-field.rs | 2 +- .../lint/inclusive-range-pattern-syntax.fixed | 2 +- .../ui/lint/inclusive-range-pattern-syntax.rs | 2 +- ...62-no-snake-case-warning-for-field-puns.rs | 29 + ...o-snake-case-warning-for-field-puns.stderr | 32 + src/test/ui/lint/lint-ctypes-enum.rs | 2 +- src/test/ui/lint/lint-exceeding-bitshifts.rs | 1 + .../ui/lint/lint-exceeding-bitshifts.stderr | 38 +- src/test/ui/lint/lint-exceeding-bitshifts2.rs | 1 + .../ui/lint/lint-exceeding-bitshifts2.stderr | 10 +- src/test/ui/lint/lint-forbid-attr.rs | 2 + src/test/ui/lint/lint-forbid-attr.stderr | 20 +- src/test/ui/lint/lint-forbid-cmdline.rs | 2 + src/test/ui/lint/lint-forbid-cmdline.stderr | 18 +- ...t-lowercase-static-const-pattern-rename.rs | 2 +- src/test/ui/lint/lint-malformed.rs | 6 +- src/test/ui/lint/lint-malformed.stderr | 32 +- src/test/ui/lint/lint-non-camel-case-types.rs | 1 + .../ui/lint/lint-non-camel-case-types.stderr | 10 +- .../ui/lint/lint-non-camel-case-variant.rs | 2 +- ...on-camel-case-with-trailing-underscores.rs | 2 +- ...-non-snake-case-no-lowercase-equivalent.rs | 2 +- .../ui/lint/lint-nonstandard-style-unicode.rs | 2 +- src/test/ui/lint/lint-output-format-2.rs | 2 +- src/test/ui/lint/lint-removed-cmdline.stderr | 12 + src/test/ui/lint/lint-renamed-cmdline.stderr | 12 + src/test/ui/lint/lint-shorthand-field.fixed | 70 + src/test/ui/lint/lint-shorthand-field.rs | 18 +- src/test/ui/lint/lint-shorthand-field.stderr | 34 +- src/test/ui/lint/lint-stability-2.rs | 46 +- src/test/ui/lint/lint-stability-deprecated.rs | 51 +- .../ui/lint/lint-stability-deprecated.stderr | 162 +- .../lint/lint-stability-fields-deprecated.rs | 22 +- src/test/ui/lint/lint-stability-fields.rs | 22 +- src/test/ui/lint/lint-stability.rs | 46 +- .../ui/lint/lint-unexported-no-mangle.stderr | 24 + .../ui/lint/lint-unknown-lint-cmdline.stderr | 20 +- src/test/ui/lint/lint-unnecessary-parens.rs | 7 + .../ui/lint/lint-unnecessary-parens.stderr | 36 +- src/test/ui/lint/lint-unused-mut-variables.rs | 8 +- .../ui/lint/lint-unused-mut-variables.stderr | 14 +- src/test/ui/lint/lint-uppercase-variables.rs | 10 + .../ui/lint/lint-uppercase-variables.stderr | 40 +- src/test/ui/lint/lints-in-foreign-macros.rs | 2 +- src/test/ui/lint/outer-forbid.rs | 6 + src/test/ui/lint/outer-forbid.stderr | 60 +- src/test/ui/lint/reasons-erroneous.rs | 46 + src/test/ui/lint/reasons-erroneous.stderr | 154 +- src/test/ui/lint/reasons-forbidden.rs | 8 + src/test/ui/lint/reasons-forbidden.stderr | 26 +- src/test/ui/lint/reasons.rs | 2 +- .../lint-uncommon-codepoints.rs | 11 + .../lint-uncommon-codepoints.stderr | 32 + src/test/ui/lint/suggestions.rs | 2 +- src/test/ui/lint/suggestions.stderr | 4 +- src/test/ui/lint/type-overflow.rs | 2 +- src/test/ui/lint/uninitialized-zeroed.stderr | 70 +- src/test/ui/lint/unused_labels.rs | 2 +- src/test/ui/lint/use-redundant.rs | 2 +- src/test/ui/lto-duplicate-symbols.rs | 1 + src/test/ui/lub-glb/old-lub-glb-hr.rs | 2 +- src/test/ui/lub-glb/old-lub-glb-hr.stderr | 2 +- src/test/ui/lub-glb/old-lub-glb-object.rs | 2 +- src/test/ui/lub-glb/old-lub-glb-object.stderr | 2 +- .../ui/macros/auxiliary/unstable-macros.rs | 4 +- src/test/ui/macros/builtin-std-paths-fail.rs | 4 + .../ui/macros/builtin-std-paths-fail.stderr | 48 +- src/test/ui/macros/issue-68058.rs | 14 + .../macros/macro-local-data-key-priv.stderr | 9 +- src/test/ui/macros/macro-name-typo.rs | 4 + src/test/ui/macros/macro-name-typo.stderr | 7 +- .../ui/macros/macro-path-prelude-fail-3.rs | 4 + .../macros/macro-path-prelude-fail-3.stderr | 7 +- src/test/ui/macros/macro-stability-rpass.rs | 2 +- src/test/ui/macros/macro-stability.rs | 4 +- .../ui/macros/macro-use-wrong-name.stderr | 5 + src/test/ui/macros/meta-item-absolute-path.rs | 1 + .../ui/macros/meta-item-absolute-path.stderr | 8 +- src/test/ui/macros/trace_faulty_macros.stderr | 2 +- src/test/ui/main-wrong-type.rs | 2 +- src/test/ui/main-wrong-type.stderr | 2 +- .../issue-69341-malformed-derive-inert.rs | 10 + .../issue-69341-malformed-derive-inert.stderr | 26 + .../malformed/malformed-interpolated.stderr | 2 +- .../issue-61651-type-mismatch.rs | 17 + .../ui/match/match-arm-resolving-to-never.rs | 2 +- .../match/match-arm-resolving-to-never.stderr | 2 +- src/test/ui/match/match-range-fail-2.rs | 3 + src/test/ui/match/match-range-fail-2.stderr | 24 +- src/test/ui/match/match-range-fail.stderr | 4 +- src/test/ui/match/match-struct.stderr | 2 +- src/test/ui/match/match-tag-unary.stderr | 2 +- src/test/ui/match/match-type-err-first-arm.rs | 6 +- .../ui/match/match-type-err-first-arm.stderr | 6 +- ...method-ambig-two-traits-cross-crate.stderr | 10 +- ...method-ambig-two-traits-from-bounds.stderr | 10 +- .../method-ambig-two-traits-from-impls.stderr | 10 +- ...method-ambig-two-traits-from-impls2.stderr | 10 +- ...mbig-two-traits-with-default-method.stderr | 10 +- src/test/ui/methods/method-call-err-msg.rs | 2 +- .../ui/methods/method-call-err-msg.stderr | 2 +- ...ethod-call-lifetime-args-unresolved.stderr | 2 + ...e-trait-object-with-separate-params.stderr | 15 +- .../ui/mir/issue-67639-normalization-ice.rs | 34 + .../ui/mir/issue-67710-inline-projection.rs | 17 + src/test/ui/mir/issue-67947.rs | 7 + src/test/ui/mir/issue-67947.stderr | 16 + src/test/ui/mismatched_types/E0409.stderr | 2 + .../ui/mismatched_types/issue-36053-2.stderr | 2 +- .../method-help-unsatisfied-bound.rs | 2 +- .../method-help-unsatisfied-bound.stderr | 2 +- src/test/ui/missing/missing-block-hint.stderr | 4 +- .../missing-type-parameter.stderr | 2 +- src/test/ui/missing/missing-stability.rs | 2 +- src/test/ui/module-macro_use-arguments.rs | 2 +- src/test/ui/module-macro_use-arguments.stderr | 2 +- src/test/ui/moves/move-out-of-array-ref.rs | 34 + .../ui/moves/move-out-of-array-ref.stderr | 47 + src/test/ui/moves/move-out-of-slice-2.rs | 34 + src/test/ui/moves/move-out-of-slice-2.stderr | 51 + src/test/ui/multi-panic.rs | 2 +- src/test/ui/namespace/namespace-mix.stderr | 10 + .../feature-gate-never_type_fallback.stderr | 4 + src/test/ui/never_type/issue-2149.rs | 2 +- src/test/ui/never_type/issue-2149.stderr | 2 +- .../escape-argument-callee.stderr | 4 +- .../escape-argument.stderr | 4 +- .../escape-upvar-nested.stderr | 6 +- .../escape-upvar-ref.stderr | 4 +- ...pagate-approximated-fail-no-postdom.stderr | 4 +- .../propagate-approximated-ref.stderr | 4 +- ...er-to-static-comparing-against-free.stderr | 8 +- ...oximated-shorter-to-static-no-bound.stderr | 4 +- ...mated-shorter-to-static-wrong-bound.stderr | 4 +- .../propagate-approximated-val.stderr | 4 +- .../propagate-despite-same-free-region.rs | 2 +- .../propagate-despite-same-free-region.stderr | 4 +- ...ail-to-approximate-longer-no-bounds.stderr | 4 +- ...-to-approximate-longer-wrong-bounds.stderr | 4 +- .../propagate-from-trait-match.stderr | 6 +- .../return-wrong-bound-region.stderr | 4 +- src/test/ui/nll/constant.rs | 2 +- src/test/ui/nll/drop-may-dangle.rs | 2 +- src/test/ui/nll/extra-unused-mut.rs | 2 +- .../ui/nll/generator-distinct-lifetime.rs | 2 +- src/test/ui/nll/issue-50343.rs | 2 +- .../maybe-initialized-drop-uninitialized.rs | 2 +- src/test/ui/nll/projection-return.rs | 2 +- .../ui/nll/relate_tys/hr-fn-aau-eq-abu.rs | 2 +- .../ui/nll/relate_tys/hr-fn-aba-as-aaa.rs | 2 +- .../ty-outlives/impl-trait-outlives.stderr | 4 +- .../ui/nll/ty-outlives/projection-body.rs | 2 +- .../projection-no-regions-closure.stderr | 20 +- .../projection-no-regions-fn.stderr | 4 +- .../projection-one-region-closure.stderr | 20 +- ...tion-one-region-trait-bound-closure.stderr | 20 +- ...n-one-region-trait-bound-static-closure.rs | 2 +- ...e-region-trait-bound-static-closure.stderr | 20 +- ...tion-two-region-trait-bound-closure.stderr | 36 +- .../projection-where-clause-env.rs | 2 +- .../projection-where-clause-trait.rs | 2 +- ...ram-closure-approximate-lower-bound.stderr | 10 +- ...m-closure-outlives-from-return-type.stderr | 8 +- ...-closure-outlives-from-where-clause.stderr | 20 +- .../ty-outlives/ty-param-implied-bounds.rs | 2 +- .../ui/nll/user-annotations/downcast-infer.rs | 2 +- src/test/ui/no-send-res-ports.rs | 5 +- src/test/ui/no-send-res-ports.stderr | 21 +- src/test/ui/non-copyable-void.stderr | 2 +- .../ui/non-ice-error-on-worker-io-fail.rs | 37 + .../ui/non-ice-error-on-worker-io-fail.stderr | 6 + src/test/ui/non-integer-atomic.rs | 2 + src/test/ui/non-integer-atomic.stderr | 32 +- src/test/ui/noncopyable-class.stderr | 2 +- src/test/ui/not-clone-closure.stderr | 10 +- src/test/ui/object-pointer-types.stderr | 6 +- .../ui/or-patterns/already-bound-name.stderr | 4 +- .../exhaustiveness-non-exhaustive.rs | 2 +- .../ui/or-patterns/exhaustiveness-pass.rs | 2 +- .../exhaustiveness-unreachable-pattern.rs | 2 +- .../ui/or-patterns/feature-gate-const-fn.rs | 36 + .../or-patterns/feature-gate-const-fn.stderr | 57 + .../ui/or-patterns/inconsistent-modes.stderr | 8 +- .../ui/or-patterns/or-pattern-mismatch.stderr | 2 +- .../or-patterns/or-patterns-syntactic-fail.rs | 2 +- .../or-patterns-syntactic-fail.stderr | 2 +- .../ui/order-dependent-cast-inference.stderr | 2 +- .../packed-struct-address-of-element.rs | 37 + .../ui/packed/packed-struct-borrow-element.rs | 2 +- .../panic-handler/panic-handler-duplicate.rs | 2 +- .../panic-handler-duplicate.stderr | 4 +- .../ui/panic-handler/panic-handler-std.rs | 2 +- .../ui/panic-handler/panic-handler-std.stderr | 4 +- .../abort-link-to-unwind-dylib.rs | 1 + .../panic-runtime/transitive-link-a-bunch.rs | 1 + .../ui/panic-runtime/want-unwind-got-abort.rs | 1 + .../panic-runtime/want-unwind-got-abort2.rs | 1 + src/test/ui/parse-error-correct.rs | 2 - src/test/ui/parse-error-correct.stderr | 8 +- src/test/ui/parser-recovery-1.rs | 4 +- src/test/ui/parser-recovery-1.stderr | 14 +- src/test/ui/parser-recovery-2.rs | 4 +- src/test/ui/parser-recovery-2.stderr | 14 +- .../ui/parser/ascii-only-character-escape.rs | 2 - .../parser/ascii-only-character-escape.stderr | 6 +- src/test/ui/parser/attr-stmt-expr-attr-bad.rs | 117 + .../ui/parser/attr-stmt-expr-attr-bad.stderr | 427 + src/test/ui/parser/bad-char-literals.rs | 3 +- src/test/ui/parser/bad-char-literals.stderr | 8 +- src/test/ui/parser/bounds-type.rs | 5 + src/test/ui/parser/bounds-type.stderr | 8 +- ...brace-after-qualified-path-in-match.stderr | 4 +- src/test/ui/parser/byte-literals.rs | 3 - src/test/ui/parser/byte-literals.stderr | 14 +- src/test/ui/parser/byte-string-literals.rs | 2 - .../ui/parser/byte-string-literals.stderr | 10 +- .../parser/chained-comparison-suggestion.rs | 40 + .../chained-comparison-suggestion.stderr | 159 + src/test/ui/parser/do-catch-suggests-try.rs | 7 +- .../ui/parser/do-catch-suggests-try.stderr | 17 +- .../parser/doc-comment-in-if-statement.stderr | 2 +- src/test/ui/parser/impl-item-const-pass.rs | 8 + .../parser/impl-item-const-semantic-fail.rs | 7 + .../impl-item-const-semantic-fail.stderr | 10 + .../ui/parser/impl-item-fn-no-body-pass.rs | 8 + .../impl-item-fn-no-body-semantic-fail.rs | 7 + .../impl-item-fn-no-body-semantic-fail.stderr | 10 + .../ui/parser/impl-item-type-no-body-pass.rs | 11 + .../impl-item-type-no-body-semantic-fail.rs | 23 + ...mpl-item-type-no-body-semantic-fail.stderr | 79 + src/test/ui/parser/impl-parsing.rs | 2 - src/test/ui/parser/impl-parsing.stderr | 10 +- src/test/ui/parser/issue-10636-1.rs | 6 +- src/test/ui/parser/issue-10636-1.stderr | 6 +- src/test/ui/parser/issue-21153.stderr | 2 +- src/test/ui/parser/issue-2354-1.rs | 2 +- src/test/ui/parser/issue-2354-1.stderr | 4 +- src/test/ui/parser/issue-2354.rs | 4 +- src/test/ui/parser/issue-2354.stderr | 8 +- .../ui/parser/issue-23620-invalid-escapes.rs | 2 - .../parser/issue-23620-invalid-escapes.stderr | 26 +- src/test/ui/parser/issue-32446.stderr | 4 +- src/test/ui/parser/issue-33418.fixed | 10 +- src/test/ui/parser/issue-33418.rs | 10 +- src/test/ui/parser/issue-33418.stderr | 30 +- ...-58094-missing-right-square-bracket.stderr | 4 +- src/test/ui/parser/issue-62524.stderr | 4 +- src/test/ui/parser/issue-62546.rs | 2 +- src/test/ui/parser/issue-62546.stderr | 8 +- src/test/ui/parser/issue-62881.rs | 2 +- src/test/ui/parser/issue-62881.stderr | 8 +- src/test/ui/parser/issue-62913.rs | 1 + src/test/ui/parser/issue-62913.stderr | 8 +- src/test/ui/parser/issue-62973.rs | 2 +- src/test/ui/parser/issue-62973.stderr | 31 +- .../issue-63115-range-pat-interpolated.rs | 6 + src/test/ui/parser/issue-63116.stderr | 4 +- src/test/ui/parser/issue-63135.rs | 2 +- src/test/ui/parser/issue-63135.stderr | 17 +- .../issue-65257-invalid-var-decl-recovery.rs | 21 + ...sue-65257-invalid-var-decl-recovery.stderr | 67 + .../issue-66357-unexpected-unreachable.rs | 4 +- .../issue-66357-unexpected-unreachable.stderr | 6 +- ...-negative-outlives-bound-syntactic-fail.rs | 12 + ...ative-outlives-bound-syntactic-fail.stderr | 20 + src/test/ui/parser/lex-bad-char-literals-1.rs | 1 - .../ui/parser/lex-bad-char-literals-1.stderr | 8 +- src/test/ui/parser/lex-bad-char-literals-7.rs | 1 - .../ui/parser/lex-bad-char-literals-7.stderr | 6 +- .../lex-bare-cr-string-literal-doc-comment.rs | 2 - ...-bare-cr-string-literal-doc-comment.stderr | 14 +- .../macro-mismatched-delim-brace-paren.rs | 2 +- .../macro-mismatched-delim-brace-paren.stderr | 6 +- .../macro-mismatched-delim-paren-brace.rs | 4 +- .../macro-mismatched-delim-paren-brace.stderr | 10 +- .../ui/parser/macro/pub-item-macro.stderr | 11 +- .../parser/macro/trait-non-item-macros.stderr | 4 +- src/test/ui/parser/match-vec-invalid.stderr | 42 - .../ui/parser/mbe_missing_right_paren.stderr | 4 +- .../missing-close-brace-in-impl-trait.rs | 2 +- .../missing-close-brace-in-impl-trait.stderr | 8 +- .../missing-close-brace-in-struct.rs | 2 +- .../missing-close-brace-in-struct.stderr | 8 +- .../missing-close-brace-in-trait.rs | 2 +- .../missing-close-brace-in-trait.stderr | 14 +- .../mismatched-delim-brace-empty-block.rs | 2 +- .../mismatched-delim-brace-empty-block.stderr | 4 +- src/test/ui/parser/missing_right_paren.rs | 2 +- src/test/ui/parser/missing_right_paren.stderr | 17 +- ...paren-after-qualified-path-in-match.stderr | 4 +- src/test/ui/parser/pat-lt-bracket-6.rs | 1 - src/test/ui/parser/pat-lt-bracket-6.stderr | 16 +- src/test/ui/parser/pat-tuple-4.rs | 11 - src/test/ui/parser/pat-tuple-4.stderr | 25 - src/test/ui/parser/pat-tuple-5.rs | 10 - src/test/ui/parser/pat-tuple-5.stderr | 30 - src/test/ui/parser/range_inclusive.rs | 2 +- src/test/ui/parser/range_inclusive.stderr | 6 +- .../ui/parser/raw-byte-string-literals.rs | 2 +- .../parser/recover-labeled-non-block-expr.rs | 5 + .../recover-labeled-non-block-expr.stderr | 17 + src/test/ui/parser/recover-range-pats.rs | 80 +- src/test/ui/parser/recover-range-pats.stderr | 408 +- src/test/ui/parser/recovery-attr-on-if.rs | 9 + src/test/ui/parser/recovery-attr-on-if.stderr | 35 + .../require-parens-for-chained-comparison.rs | 12 +- ...quire-parens-for-chained-comparison.stderr | 20 +- .../ui/parser/stmt_expr_attrs_placement.rs | 22 + .../parser/stmt_expr_attrs_placement.stderr | 10 + ...ait-item-with-defaultness-fail-semantic.rs | 12 + ...item-with-defaultness-fail-semantic.stderr | 38 + .../trait-item-with-defaultness-pass.rs | 13 + .../parser/trait-object-trait-parens.stderr | 3 + .../parser/type-parameters-in-field-exprs.rs | 2 - .../type-parameters-in-field-exprs.stderr | 6 +- src/test/ui/parser/unclosed-braces.rs | 4 +- src/test/ui/parser/unclosed-braces.stderr | 8 +- .../parser/unclosed-delimiter-in-dep.stderr | 8 +- src/test/ui/parser/unclosed_delim_mod.rs | 2 +- src/test/ui/parser/unclosed_delim_mod.stderr | 8 +- .../unmatched-delimiter-at-end-of-file.rs | 2 +- .../unmatched-delimiter-at-end-of-file.stderr | 6 +- src/test/ui/parser/variadic-ffi-3.rs | 5 - src/test/ui/parser/variadic-ffi-3.stderr | 9 - src/test/ui/parser/variadic-ffi-4.rs | 5 - src/test/ui/parser/variadic-ffi-4.stderr | 9 - .../variadic-ffi-nested-syntactic-fail.rs | 9 + .../variadic-ffi-nested-syntactic-fail.stderr | 24 + .../variadic-ffi-semantic-restrictions.rs | 76 + .../variadic-ffi-semantic-restrictions.stderr | 206 + .../ui/parser/variadic-ffi-syntactic-pass.rs | 53 + src/test/ui/paths-containing-nul.rs | 2 +- ...her-can-live-while-the-other-survives-1.rs | 35 + ...can-live-while-the-other-survives-1.stderr | 56 + .../bind-by-move-no-subbindings-fun-param.rs | 14 + ...nd-by-move-no-subbindings-fun-param.stderr | 20 + .../borrowck-move-and-move.rs | 46 + .../borrowck-move-and-move.stderr | 133 + .../borrowck-pat-at-and-box-pass.rs | 75 + .../borrowck-pat-at-and-box.rs | 84 + .../borrowck-pat-at-and-box.stderr | 220 + .../borrowck-pat-by-copy-bindings-in-at.rs | 51 + .../borrowck-pat-by-move-and-ref.rs} | 5 +- .../borrowck-pat-by-move-and-ref.stderr | 12 + .../borrowck-pat-ref-both-sides.rs | 47 + .../borrowck-pat-ref-mut-and-ref.rs | 134 + .../borrowck-pat-ref-mut-and-ref.stderr | 437 + .../borrowck-pat-ref-mut-twice.rs | 111 + .../borrowck-pat-ref-mut-twice.stderr | 333 + .../bindings-after-at/copy-and-move-mixed.rs | 20 + .../copy-and-move-mixed.stderr | 51 + ...lt-binding-modes-both-sides-independent.rs | 37 + ...inding-modes-both-sides-independent.stderr | 41 + .../feature-gate-bindings_after_at.rs | 3 + .../feature-gate-bindings_after_at.stderr | 12 + .../bindings-after-at/nested-patterns.rs | 15 + ...d-type-ascription-syntactically-invalid.rs | 34 + ...pe-ascription-syntactically-invalid.stderr | 26 + .../pat-at-same-name-both.rs | 32 + .../pat-at-same-name-both.stderr | 72 + .../wild-before-at-syntactically-rejected.rs | 16 + ...ld-before-at-syntactically-rejected.stderr | 43 + src/test/ui/pattern/const-pat-ice.stderr | 4 +- .../issue-66270-pat-struct-parser-recovery.rs | 14 + ...ue-66270-pat-struct-parser-recovery.stderr | 8 + ...67776-match-same-name-enum-variant-refs.rs | 42 + ...6-match-same-name-enum-variant-refs.stderr | 38 + .../issue-68393-let-pat-assoc-constant.rs | 26 + .../issue-68393-let-pat-assoc-constant.stderr | 15 + .../issue-68394-let-pat-runtime-value.rs | 5 + .../issue-68394-let-pat-runtime-value.stderr | 9 + .../ui/pattern/issue-68396-let-float-bug.rs | 7 + .../pattern/issue-68396-let-float-bug.stderr | 15 + .../pattern/pat-struct-field-expr-has-type.rs | 9 + .../pat-struct-field-expr-has-type.stderr | 14 + .../ui/pattern/pat-type-err-formal-param.rs | 8 + .../pattern/pat-type-err-formal-param.stderr | 11 + src/test/ui/pattern/pat-type-err-let-stmt.rs | 16 + .../ui/pattern/pat-type-err-let-stmt.stderr | 49 + .../ui/pattern/patkind-litrange-no-expr.rs | 3 +- .../pattern/patkind-litrange-no-expr.stderr | 8 +- .../ui/pattern/pattern-bindings-after-at.rs | 16 - .../pattern/pattern-bindings-after-at.stderr | 22 - .../ui/pattern/pattern-error-continue.stderr | 2 +- src/test/ui/pattern/pattern-tyvar-2.rs | 2 +- src/test/ui/pattern/pattern-tyvar-2.stderr | 2 +- src/test/ui/pattern/pattern-tyvar.stderr | 2 +- .../issue-53820-slice-pattern-large-array.rs | 4 +- ...13-constants-and-slices-exhaustiveness.rs} | 2 +- .../usefulness/match-byte-array-patterns.rs | 1 - .../match-byte-array-patterns.stderr | 18 +- .../usefulness/match-range-fail-dominate.rs | 4 + .../match-range-fail-dominate.stderr | 22 +- .../usefulness/match-slice-patterns.rs | 2 - .../usefulness/match-slice-patterns.stderr | 2 +- .../usefulness/match-vec-unreachable.rs | 1 - .../usefulness/match-vec-unreachable.stderr | 8 +- .../usefulness/non-exhaustive-match-nested.rs | 2 - .../non-exhaustive-match-nested.stderr | 4 +- .../usefulness/non-exhaustive-match.rs | 1 - .../usefulness/non-exhaustive-match.stderr | 16 +- .../non-exhaustive-pattern-witness.rs | 2 - .../non-exhaustive-pattern-witness.stderr | 14 +- .../slice-patterns-exhaustiveness.rs | 2 - .../slice-patterns-exhaustiveness.stderr | 32 +- .../usefulness/slice-patterns-irrefutable.rs | 1 - .../usefulness/slice-patterns-reachability.rs | 1 - .../slice-patterns-reachability.stderr | 14 +- .../struct-pattern-match-useless.stderr | 4 +- ...-to-type-err-cause-on-impl-trait-return.rs | 2 +- ...type-err-cause-on-impl-trait-return.stderr | 40 +- .../ui/print_type_sizes/zero-sized-fields.rs | 1 + src/test/ui/privacy/decl-macro.stderr | 8 +- src/test/ui/privacy/privacy-in-paths.stderr | 24 +- src/test/ui/privacy/privacy-ns1.stderr | 4 + src/test/ui/privacy/privacy-ns2.stderr | 24 +- src/test/ui/privacy/privacy-ufcs.stderr | 8 +- src/test/ui/privacy/privacy1.rs | 1 + src/test/ui/privacy/privacy1.stderr | 116 +- src/test/ui/privacy/privacy2.stderr | 10 +- src/test/ui/privacy/privacy4.stderr | 8 +- src/test/ui/privacy/privacy5.stderr | 384 +- .../ui/privacy/private-in-public-assoc-ty.rs | 3 + .../privacy/private-in-public-assoc-ty.stderr | 32 +- .../ui/privacy/private-item-simple.stderr | 8 +- src/test/ui/privacy/restricted/test.stderr | 16 +- .../proc-macro/attributes-on-modules-fail.rs | 21 +- .../attributes-on-modules-fail.stderr | 26 +- .../ui/proc-macro/attributes-on-modules.rs | 8 +- .../proc-macro/attributes-on-modules.stderr | 12 - .../ui/proc-macro/disappearing-resolution.rs | 2 +- .../proc-macro/disappearing-resolution.stderr | 10 +- src/test/ui/proc-macro/generate-mod.stderr | 12 + .../ui/proc-macro/invalid-punct-ident-4.rs | 2 +- .../proc-macro/invalid-punct-ident-4.stderr | 4 +- src/test/ui/proc-macro/issue-50493.rs | 1 + src/test/ui/proc-macro/issue-50493.stderr | 10 +- src/test/ui/proc-macro/item-error.stderr | 8 +- .../proc-macro/macro-namespace-reserved-2.rs | 1 + .../macro-namespace-reserved-2.stderr | 18 +- src/test/ui/proc-macro/parent-source-spans.rs | 4 + .../ui/proc-macro/parent-source-spans.stderr | 57 +- src/test/ui/proc-macro/proc-macro-gates.rs | 6 +- .../ui/proc-macro/proc-macro-gates.stderr | 46 +- src/test/ui/proc-macro/resolve-error.rs | 8 + src/test/ui/proc-macro/resolve-error.stderr | 86 +- .../ui/qualified/qualified-path-params-2.rs | 3 +- .../qualified/qualified-path-params-2.stderr | 11 +- src/test/ui/range/range_traits-1.rs | 24 + src/test/ui/range/range_traits-1.stderr | 238 +- src/test/ui/raw-ref-op/raw-ref-op.rs | 6 +- src/test/ui/raw-ref-op/raw-ref-op.stderr | 18 - src/test/ui/raw-ref-op/raw-ref-temp-deref.rs | 20 +- .../ui/raw-ref-op/raw-ref-temp-deref.stderr | 74 - src/test/ui/raw-ref-op/raw-ref-temp.rs | 6 +- src/test/ui/raw-ref-op/raw-ref-temp.stderr | 40 +- src/test/ui/raw-ref-op/unusual_locations.rs | 31 +- .../ui/raw-ref-op/unusual_locations.stderr | 18 - .../ui/reachable/unreachable-variant.stderr | 8 +- .../issue-26548-recursion-via-normalize.rs} | 2 + ...ssue-26548-recursion-via-normalize.stderr} | 2 +- ...ssue-38591-non-regular-dropck-recursion.rs | 17 + ...-38591-non-regular-dropck-recursion.stderr | 4 + src/test/ui/recursion/recursion.rs | 2 + src/test/ui/recursion/recursion.stderr | 2 +- ...on-invariant-static-error-reporting.stderr | 4 +- ...s-bounded-by-trait-requiring-static.stderr | 1 + ...ions-bounded-method-type-parameters.stderr | 1 + .../regions-close-object-into-object-5.rs | 1 + .../regions-close-object-into-object-5.stderr | 17 +- .../ui/regions/regions-in-enums-anon.stderr | 8 +- src/test/ui/regions/regions-in-enums.stderr | 4 + .../ui/regions/regions-in-structs-anon.stderr | 8 +- src/test/ui/regions/regions-in-structs.stderr | 5 + .../ui/regions/regions-name-undeclared.stderr | 46 +- .../regions-normalize-in-where-clause-list.rs | 2 + ...ions-normalize-in-where-clause-list.stderr | 74 +- src/test/ui/regions/regions-undeclared.stderr | 11 +- src/test/ui/reject-specialized-drops-8142.rs | 27 +- .../ui/reject-specialized-drops-8142.stderr | 96 +- src/test/ui/repr/repr-align-assign.fixed | 2 + src/test/ui/repr/repr-align-assign.rs | 2 + src/test/ui/repr/repr-align-assign.stderr | 16 +- src/test/ui/repr/repr-align.rs | 6 + src/test/ui/repr/repr-align.stderr | 46 +- .../ui/repr/repr-packed-contains-align.rs | 16 +- .../ui/repr/repr-packed-contains-align.stderr | 112 +- src/test/ui/repr/repr-transparent.rs | 12 +- src/test/ui/repr/repr-transparent.stderr | 18 +- src/test/ui/required-lang-item.rs | 2 + .../ui/resolve/impl-items-vis-unresolved.rs | 3 +- .../resolve/impl-items-vis-unresolved.stderr | 4 +- src/test/ui/resolve/levenshtein.rs | 4 + src/test/ui/resolve/levenshtein.stderr | 21 +- src/test/ui/resolve/privacy-enum-ctor.stderr | 32 +- .../ui/resolve/privacy-struct-ctor.stderr | 48 +- .../resolve-inconsistent-binding-mode.stderr | 6 + .../resolve/resolve-inconsistent-names.stderr | 2 + src/test/ui/resolve/token-error-correct-2.rs | 2 +- .../ui/resolve/token-error-correct-2.stderr | 6 +- src/test/ui/resolve/token-error-correct.rs | 2 +- .../ui/resolve/token-error-correct.stderr | 8 +- .../termination-trait-test-wrong-type.rs | 5 +- .../termination-trait-test-wrong-type.stderr | 2 +- .../rfc-2005-default-binding-mode/for.stderr | 2 +- .../ui/rfc-2005-default-binding-mode/slice.rs | 2 - .../slice.stderr | 2 +- .../ui/rfc-2008-non-exhaustive/struct.stderr | 16 +- .../ui/rfc-2008-non-exhaustive/variant.stderr | 40 +- .../caller-location-intrinsic.rs | 6 +- .../diverging-caller-location.rs | 19 + .../std-panic-locations.rs | 38 + .../track-caller-attribute.rs | 2 +- .../tracked-fn-ptr-with-arg.rs | 19 + .../rfc-2091-track-caller/tracked-fn-ptr.rs | 19 + .../cross-crate.stderr | 2 +- .../ui/rfc-2093-infer-outlives/enum.stderr | 6 +- .../explicit-dyn.stderr | 2 +- .../explicit-enum.stderr | 2 +- .../explicit-projection.stderr | 2 +- .../explicit-struct.stderr | 2 +- .../explicit-union.stderr | 2 +- .../infer-static.stderr | 2 +- .../nested-enum.stderr | 2 +- .../nested-regions.stderr | 6 +- .../nested-structs.stderr | 2 +- .../nested-union.stderr | 2 +- .../rfc-2093-infer-outlives/projection.stderr | 2 +- .../rfc-2093-infer-outlives/reference.stderr | 2 +- .../rfc-2093-infer-outlives/self-dyn.stderr | 2 +- .../self-structs.stderr | 2 +- src/test/ui/rfc-2457/idents-normalized.rs | 8 + .../disallowed-positions.stderr | 14 +- .../ui/rfc-2497-if-let-chains/feature-gate.rs | 2 + .../feature-gate.stderr | 28 +- .../feature-gate.gated.stderr | 8 + .../const-trait-bound-opt-out/feature-gate.rs | 16 + .../feature-gate.stock.stderr | 12 + .../in-impl-trait.rs | 21 + .../in-impl-trait.stderr | 26 + .../in-trait-bounds.rs | 8 + .../in-trait-bounds.stderr | 8 + .../in-trait-object.rs | 19 + .../in-trait-object.stderr | 20 + .../opt-out-twice.rs | 8 + .../opt-out-twice.stderr | 14 + .../const-trait-bound-opt-out/syntax.rs | 10 + .../with-maybe-sized.rs | 7 + .../with-maybe-sized.stderr | 8 + .../without-question-mark.rs | 7 + .../without-question-mark.stderr | 8 + .../feature-gate.gated.stderr | 8 + .../rfc-2632-const-trait-impl/feature-gate.rs | 13 + .../feature-gate.stock.stderr | 18 + .../impl-opt-out-trait.rs | 11 + .../impl-opt-out-trait.stderr | 8 + .../inherent-impl.rs | 17 + .../inherent-impl.stderr | 30 + .../ui/rfc-2632-const-trait-impl/syntax.rs | 9 + ...cant-hide-behind-direct-struct-embedded.rs | 1 + ...-hide-behind-direct-struct-embedded.stderr | 8 +- .../cant-hide-behind-direct-struct-param.rs | 1 + ...ant-hide-behind-direct-struct-param.stderr | 8 +- .../ui/rfc1445/match-forbidden-without-eq.rs | 1 + .../rfc1445/match-forbidden-without-eq.stderr | 12 +- ...tch-nonempty-array-forbidden-without-eq.rs | 1 + ...nonempty-array-forbidden-without-eq.stderr | 8 +- .../match-requires-both-partialeq-and-eq.rs | 1 + ...atch-requires-both-partialeq-and-eq.stderr | 8 +- .../collections.stderr | 41 - .../construct_with_other_type.rs | 29 - .../construct_with_other_type.stderr | 29 - .../empty_generics.stderr | 16 - .../gat-dont-ice-on-absent-feature.stderr | 12 - .../generic-associated-types-where.stderr | 8 - ...ic_associated_type_undeclared_lifetimes.rs | 22 - ...ssociated_type_undeclared_lifetimes.stderr | 42 - .../iterable.rs | 50 - .../iterable.stderr | 47 - .../parameter_number_and_kind.rs | 47 - .../parameter_number_and_kind.stderr | 41 - .../pointer_family.stderr | 35 - .../streaming_iterator.stderr | 41 - src/test/ui/rfc1623.stderr | 4 +- .../rfc-2005-default-binding-mode/slice.rs | 1 - .../ui/rfcs/rfc1717/auxiliary/clibrary.rs | 5 - src/test/ui/rmeta-rpass.rs | 9 +- src/test/ui/rmeta_lib.rs | 1 + .../ui/rust-2018/uniform-paths/cross-crate.rs | 1 + .../uniform-paths/cross-crate.stderr | 14 +- .../rust-2018/uniform-paths/prelude-fail-2.rs | 2 + .../uniform-paths/prelude-fail-2.stderr | 28 +- src/test/ui/sanitizer-address.rs | 21 + src/test/ui/sanitizer-leak.rs | 21 + src/test/ui/sanitizer-memory.rs | 44 + src/test/ui/sanitizer-unsupported-target.rs | 7 + .../ui/sanitizer-unsupported-target.stderr | 4 + ...s_pin_lifetime_impl_trait-async.nll.stderr | 2 +- ...f_types_pin_lifetime_impl_trait.nll.stderr | 2 +- ..._self_types_pin_lifetime_impl_trait.stderr | 2 +- ...point-at-arbitrary-self-type-method.stderr | 2 +- ...at-arbitrary-self-type-trait-method.stderr | 2 +- src/test/ui/self/self-infer.rs | 2 + src/test/ui/self/self-infer.stderr | 26 +- src/test/ui/self/suggest-self-2.rs | 25 + src/test/ui/self/suggest-self-2.stderr | 40 + .../ui/shadowed/shadowed-trait-methods.stderr | 2 +- .../ui/shadowed/shadowed-use-visibility.rs | 4 +- .../shadowed/shadowed-use-visibility.stderr | 20 +- ...intrinsic-generic-arithmetic-saturating.rs | 1 + ...insic-generic-arithmetic-saturating.stderr | 4 +- .../simd-intrinsic-generic-arithmetic.rs | 2 + .../simd-intrinsic-generic-arithmetic.stderr | 28 +- .../simd-intrinsic-generic-bitmask.rs | 2 + .../simd-intrinsic-generic-bitmask.stderr | 10 +- .../simd-intrinsic-generic-cast.rs | 2 + .../simd-intrinsic-generic-cast.stderr | 8 +- .../simd-intrinsic-generic-comparison.rs | 2 + .../simd-intrinsic-generic-comparison.stderr | 36 +- .../simd-intrinsic-generic-elements.rs | 2 + .../simd-intrinsic-generic-elements.stderr | 30 +- .../simd-intrinsic-generic-reduction.rs | 1 + .../simd-intrinsic-generic-reduction.stderr | 20 +- .../simd-intrinsic-generic-select.rs | 2 + .../simd-intrinsic-generic-select.stderr | 16 +- .../simd-intrinsic-inlining-issue67557-ice.rs | 25 + .../simd-intrinsic-inlining-issue67557.rs | 40 + .../ui/simd-type-generic-monomorphisation.rs | 2 + src/test/ui/span/issue-37767.stderr | 30 +- src/test/ui/span/issue-39018.rs | 26 +- src/test/ui/span/issue-39018.stderr | 26 +- .../ui/span/issue-43927-non-ADT-derive.rs | 3 + .../ui/span/issue-43927-non-ADT-derive.stderr | 26 +- src/test/ui/span/issue-7575.rs | 6 +- src/test/ui/span/issue-7575.stderr | 24 +- .../span/type-annotations-needed-expr.stderr | 2 +- src/test/ui/span/type-binding.stderr | 2 +- .../specialization-trait-not-implemented.rs | 2 +- ...pecialization-trait-not-implemented.stderr | 2 +- .../stability-attribute-sanity.rs | 12 +- .../stability-attribute-sanity.stderr | 12 +- src/test/ui/stability-in-private-module.rs | 5 + .../ui/stability-in-private-module.stderr | 10 +- .../ui/static/static-priv-by-default2.stderr | 16 +- src/test/ui/str/str-array-assignment.rs | 2 +- src/test/ui/str/str-array-assignment.stderr | 2 +- src/test/ui/str/str-concat-on-double-ref.rs | 2 +- .../ui/str/str-concat-on-double-ref.stderr | 2 +- .../enum-non-c-like-repr-c-and-int.rs | 6 +- .../structs-enums/enum-non-c-like-repr-c.rs | 7 +- .../structs-enums/enum-non-c-like-repr-int.rs | 6 +- .../ui/structs/struct-path-associated-type.rs | 1 - .../struct-path-associated-type.stderr | 10 +- .../structs/struct-variant-privacy-xc.stderr | 16 +- .../ui/structs/struct-variant-privacy.stderr | 16 +- ...structure-constructor-type-mismatch.stderr | 6 +- src/test/ui/suffixed-literal-meta.rs | 12 + src/test/ui/suffixed-literal-meta.stderr | 142 +- src/test/ui/suggestions/attribute-typos.rs | 4 + .../ui/suggestions/attribute-typos.stderr | 13 +- src/test/ui/suggestions/constrain-trait.fixed | 4 +- src/test/ui/suggestions/constrain-trait.rs | 4 +- .../ui/suggestions/constrain-trait.stderr | 4 +- .../fn-or-tuple-struct-without-args.stderr | 2 +- src/test/ui/suggestions/for-i-in-vec.fixed | 15 + src/test/ui/suggestions/for-i-in-vec.rs | 15 + src/test/ui/suggestions/for-i-in-vec.stderr | 12 + ...it-with-missing-trait-bounds-in-arg.stderr | 2 +- src/test/ui/suggestions/issue-21673.stderr | 4 +- .../issue-66968-suggest-sorted-words.rs | 4 + .../issue-66968-suggest-sorted-words.stderr | 9 + .../let-binding-init-expr-as-ty.rs | 1 - .../let-binding-init-expr-as-ty.stderr | 12 +- .../suggestions/mut-borrow-needed-by-trait.rs | 2 +- .../mut-borrow-needed-by-trait.stderr | 2 +- .../no-extern-crate-in-type.stderr | 4 + src/test/ui/suggestions/opaque-type-error.rs | 2 +- .../ui/suggestions/opaque-type-error.stderr | 7 +- src/test/ui/suggestions/remove-as_str.rs | 8 +- src/test/ui/suggestions/remove-as_str.stderr | 8 +- ...oc-fn-call-with-turbofish-through-deref.rs | 2 +- ...n-call-with-turbofish-through-deref.stderr | 2 +- .../suggest-assoc-fn-call-with-turbofish.rs | 2 +- ...uggest-assoc-fn-call-with-turbofish.stderr | 2 +- .../ui/suggestions/suggest-methods.stderr | 4 +- src/test/ui/suggestions/suggest-variants.rs | 6 +- .../ui/suggestions/suggest-variants.stderr | 12 +- ...type-argument-instead-of-assoc-type.stderr | 11 +- .../suggestions/vec-macro-in-pattern.stderr | 3 +- src/test/ui/super-at-top-level.rs | 2 +- src/test/ui/super-at-top-level.stderr | 4 +- src/test/ui/symbol-names/basic.legacy.stderr | 8 +- src/test/ui/symbol-names/basic.rs | 1 + src/test/ui/symbol-names/basic.v0.stderr | 8 +- src/test/ui/symbol-names/impl1.legacy.stderr | 32 +- src/test/ui/symbol-names/impl1.rs | 13 +- src/test/ui/symbol-names/impl1.v0.stderr | 26 +- src/test/ui/symbol-names/impl2.rs | 2 + src/test/ui/symbol-names/impl2.stderr | 2 +- .../ui/symbol-names/issue-60925.legacy.stderr | 6 +- src/test/ui/symbol-names/issue-60925.rs | 1 + .../ui/symbol-names/issue-60925.v0.stderr | 6 +- .../non-1-width-unicode-multiline-label.rs | 2 +- ...non-1-width-unicode-multiline-label.stderr | 2 +- .../test-attrs/test-should-panic-attr.stderr | 8 +- src/test/ui/test-panic-abort.rs | 11 + src/test/ui/test-panic-abort.run.stdout | 9 +- .../sync-send-iterators-in-libcore.rs | 1 + .../tool-attributes-misplaced-1.rs | 1 + .../tool-attributes-misplaced-1.stderr | 16 +- src/test/ui/tool_lints.rs | 2 + src/test/ui/tool_lints.stderr | 14 +- src/test/ui/trailing-comma.rs | 2 - .../ui/traits/trait-alias-ambiguous.stderr | 10 +- .../trait-alias-object-fail.stderr | 6 +- .../ui/traits/trait-bounds-same-crate-name.rs | 2 +- .../trait-bounds-same-crate-name.stderr | 4 +- src/test/ui/traits/trait-impl-1.rs | 2 +- src/test/ui/traits/trait-impl-1.stderr | 2 +- src/test/ui/traits/trait-item-privacy.rs | 12 +- src/test/ui/traits/trait-item-privacy.stderr | 12 +- ...ject-with-self-in-projection-output-bad.rs | 4 +- ...-with-self-in-projection-output-bad.stderr | 12 +- .../trait-resolution-in-overloaded-op.rs | 2 +- .../trait-resolution-in-overloaded-op.stderr | 2 +- .../ui/traits/trait-suggest-where-clause.rs | 5 +- .../traits/trait-suggest-where-clause.stderr | 14 +- ...ts-multidispatch-convert-ambig-dest.stderr | 2 +- ...ounds-inconsistent-associated-functions.rs | 6 +- .../trivial-bounds/trivial-bounds-lint.stderr | 6 +- src/test/ui/try-on-option-diagnostics.rs | 29 + src/test/ui/try-on-option-diagnostics.stderr | 28 +- .../ui/tuple/tuple-struct-fields/test2.rs | 1 + .../ui/tuple/tuple-struct-fields/test2.stderr | 8 +- .../ui/tuple/tuple-struct-fields/test3.rs | 1 + .../ui/tuple/tuple-struct-fields/test3.stderr | 8 +- .../self-in-enum-definition.stderr | 5 + ..._type_does_not_live_long_enough.nll.stderr | 3 + ...eric_type_does_not_live_long_enough.stderr | 3 + .../generic_underconstrained2.stderr | 4 + .../incoherent-assoc-imp-trait.rs | 16 + .../incoherent-assoc-imp-trait.stderr | 23 + .../issue-57611-trait-alias.rs | 27 + .../issue-57611-trait-alias.stderr | 23 + .../issue-57807-associated-type.rs | 31 + .../ui/type-alias-impl-trait/issue-65918.rs | 49 + .../issue-68368-non-defining-use.rs | 13 + .../issue-68368-non-defining-use.stderr | 14 + .../never_reveal_concrete_type.stderr | 3 + ...o_revealing_outside_defining_module.stderr | 6 + .../not_well_formed.stderr | 4 +- .../type-alias/issue-62364-self-ty-arg.stderr | 4 +- .../or_else-multiple-type-params.stderr | 2 +- src/test/ui/type-inference/sort_by_key.stderr | 2 +- .../unbounded-associated-type.stderr | 2 +- ...ed-type-param-in-fn-with-assoc-type.stderr | 2 +- .../unbounded-type-param-in-fn.stderr | 2 +- .../ui/type/ascription/issue-47666.stderr | 2 +- ...67690-type-alias-bound-diagnostic-crash.rs | 8 + ...0-type-alias-bound-diagnostic-crash.stderr | 12 + src/test/ui/type/type-alias-bounds.rs | 2 +- src/test/ui/type/type-alias-bounds.stderr | 6 +- .../ui/type/type-annotation-needed.stderr | 2 +- .../type-check/assignment-expected-bool.rs | 2 +- .../assignment-expected-bool.stderr | 8 +- .../ui/type/type-check/assignment-in-if.rs | 2 +- ...ment-match-prior-arm-bool-expected-unit.rs | 2 +- ...-match-prior-arm-bool-expected-unit.stderr | 2 +- .../ui/type/type-check/missing_trait_impl.rs | 2 +- .../type/type-check/missing_trait_impl.stderr | 2 +- ...parameter-defaults-referencing-Self.stderr | 9 +- src/test/ui/type_length_limit.rs | 6 +- src/test/ui/type_length_limit.stderr | 4 +- ...e-57673-ice-on-deref-of-boxed-trait.stderr | 2 +- ...ice-on-invalid-type-node-after-recovery.rs | 9 + ...on-invalid-type-node-after-recovery.stderr | 8 + .../ui/typeck/typeck_type_placeholder_item.rs | 109 - .../typeck_type_placeholder_item.stderr | 237 - .../typeck_type_placeholder_item_help.stderr | 2 +- src/test/ui/ufcs/ufcs-partially-resolved.rs | 4 +- .../ui/ufcs/ufcs-partially-resolved.stderr | 4 +- src/test/ui/ui-testing-optout.rs | 2 +- .../unboxed-closure-feature-gate.stderr | 2 +- ...oxed-closure-sugar-lifetime-elision.stderr | 11 +- ...nboxed-closure-sugar-not-used-on-fn.stderr | 8 +- .../unboxed-closure-sugar-region.stderr | 2 +- ...ong-number-number-type-parameters-3.stderr | 2 +- .../unboxed-closure-sugar-wrong-trait.stderr | 4 +- ...ed-closures-static-call-wrong-trait.stderr | 4 +- src/test/ui/unconstrained-none.stderr | 2 +- src/test/ui/unconstrained-ref.stderr | 2 +- src/test/ui/underscore-imports/hygiene.stderr | 4 +- src/test/ui/underscore-imports/shadow.stderr | 2 +- .../dyn-trait-underscore-in-struct.stderr | 8 +- .../in-fn-return-illegal.stderr | 6 +- .../ui/underscore-lifetime/in-struct.stderr | 16 +- .../underscore-lifetime-binders.stderr | 8 +- .../uninhabited-matches-feature-gated.rs | 17 +- .../uninhabited-matches-feature-gated.stderr | 14 +- .../ui/uninhabited/uninhabited-patterns.rs | 2 +- src/test/ui/uninit-empty-types.rs | 12 +- src/test/ui/union/union-const-pat.rs | 1 + src/test/ui/union/union-const-pat.stderr | 8 +- src/test/ui/union/union-derive-clone.rs | 2 +- src/test/ui/union/union-derive-clone.stderr | 2 +- src/test/ui/unique-object-noncopyable.stderr | 2 +- src/test/ui/unique-pinned-nocopy.stderr | 2 +- src/test/ui/unknown-lint-tool-name.rs | 4 + src/test/ui/unknown-lint-tool-name.stderr | 28 +- .../ui/unspecified-self-in-trait-ref.stderr | 17 +- .../extern-use-primitive-type-lib.rs | 3 + .../issue-60976-extern-use-primitive-type.rs | 7 + src/test/ui/use/use-from-trait-xc.stderr | 16 +- src/test/ui/use/use-mod/use-mod-3.stderr | 16 +- src/test/ui/use/use-super-global-path.rs | 1 + src/test/ui/use/use-super-global-path.stderr | 12 +- src/test/ui/vec/vec-res-add.rs | 2 +- src/test/ui/vec/vec-res-add.stderr | 2 +- .../ui/wf/wf-unsafe-trait-obj-match.stderr | 2 +- .../where-equality-constraints.rs | 4 +- .../where-equality-constraints.stderr | 12 +- .../where-lifetime-resolution.stderr | 6 + src/test/ui/while-let.stderr | 4 +- src/test/ui/wrapping-int-api.rs | 3 + .../xcrate/xcrate-private-by-default.stderr | 80 +- src/tools/build-manifest/src/main.rs | 288 +- src/tools/cargotest/main.rs | 44 +- src/tools/compiletest/Cargo.toml | 2 +- src/tools/compiletest/src/common.rs | 60 +- src/tools/compiletest/src/errors.rs | 29 +- src/tools/compiletest/src/header.rs | 326 +- src/tools/compiletest/src/json.rs | 66 +- src/tools/compiletest/src/main.rs | 541 +- src/tools/compiletest/src/raise_fd_limit.rs | 15 +- src/tools/compiletest/src/read2.rs | 5 +- src/tools/compiletest/src/runtest.rs | 1070 +- src/tools/compiletest/src/runtest/tests.rs | 19 +- src/tools/compiletest/src/util.rs | 11 +- src/tools/error_index_generator/build.rs | 13 +- src/tools/error_index_generator/main.rs | 116 +- src/tools/linkchecker/main.rs | 159 +- src/tools/rustc-workspace-hack/Cargo.toml | 5 +- src/tools/rustdoc-themes/main.rs | 14 +- src/tools/rustdoc/main.rs | 4 +- src/tools/tidy/src/bins.rs | 58 +- src/tools/tidy/src/cargo.rs | 23 +- src/tools/tidy/src/debug_artifacts.rs | 3 +- src/tools/tidy/src/deps.rs | 23 +- src/tools/tidy/src/error_codes_check.rs | 68 +- src/tools/tidy/src/errors.rs | 89 +- src/tools/tidy/src/extdeps.rs | 6 +- src/tools/tidy/src/features.rs | 408 +- src/tools/tidy/src/features/version.rs | 11 +- src/tools/tidy/src/lib.rs | 42 +- src/tools/tidy/src/main.rs | 4 +- src/tools/tidy/src/pal.rs | 72 +- src/tools/tidy/src/style.rs | 82 +- src/tools/tidy/src/ui_tests.rs | 6 +- src/tools/tidy/src/unit_tests.rs | 58 +- src/tools/tidy/src/unstable_book.rs | 62 +- src/tools/unicode-table-generator/Cargo.toml | 10 + .../src/case_mapping.rs | 62 + src/tools/unicode-table-generator/src/main.rs | 261 + .../src/raw_emitter.rs | 170 + .../src/unicode_download.rs | 42 + src/tools/unstable-book-gen/src/main.rs | 103 +- vendor/anyhow/.cargo-checksum.json | 1 + vendor/anyhow/Cargo.toml | 37 + vendor/{fixedbitset => anyhow}/LICENSE-APACHE | 0 vendor/{wasi-0.7.0 => anyhow}/LICENSE-MIT | 0 vendor/anyhow/README.md | 163 + vendor/anyhow/build.rs | 62 + vendor/anyhow/src/backtrace.rs | 36 + vendor/anyhow/src/chain.rs | 101 + vendor/anyhow/src/context.rs | 177 + vendor/anyhow/src/error.rs | 793 + vendor/anyhow/src/fmt.rs | 149 + vendor/anyhow/src/kind.rs | 116 + vendor/anyhow/src/lib.rs | 582 + vendor/anyhow/src/macros.rs | 163 + vendor/anyhow/src/wrapper.rs | 78 + vendor/anyhow/tests/common/mod.rs | 14 + vendor/anyhow/tests/compiletest.rs | 6 + vendor/anyhow/tests/drop/mod.rs | 52 + vendor/anyhow/tests/test_autotrait.rs | 13 + vendor/anyhow/tests/test_backtrace.rs | 13 + vendor/anyhow/tests/test_boxed.rs | 40 + vendor/anyhow/tests/test_chain.rs | 45 + vendor/anyhow/tests/test_context.rs | 159 + vendor/anyhow/tests/test_convert.rs | 24 + vendor/anyhow/tests/test_downcast.rs | 106 + vendor/anyhow/tests/test_fmt.rs | 94 + vendor/anyhow/tests/test_macros.rs | 33 + vendor/anyhow/tests/test_repr.rs | 29 + vendor/anyhow/tests/test_source.rs | 62 + vendor/anyhow/tests/ui/no-impl.rs | 8 + vendor/anyhow/tests/ui/no-impl.stderr | 16 + vendor/autocfg/.cargo-checksum.json | 2 +- vendor/autocfg/Cargo.lock | 2 +- vendor/autocfg/Cargo.toml | 2 +- vendor/autocfg/README.md | 11 +- vendor/autocfg/src/lib.rs | 38 + vendor/autocfg/tests/rustflags.rs | 13 + vendor/bstr/.cargo-checksum.json | 1 + vendor/bstr/COPYING | 8 + vendor/bstr/Cargo.toml | 68 + vendor/{idna-0.1.5 => bstr}/LICENSE-APACHE | 0 vendor/bstr/LICENSE-MIT | 21 + vendor/bstr/README.md | 252 + vendor/bstr/examples/graphemes-std.rs | 28 + vendor/bstr/examples/graphemes.rs | 24 + vendor/bstr/examples/lines-std.rs | 17 + vendor/bstr/examples/lines.rs | 19 + vendor/bstr/examples/uppercase-std.rs | 15 + vendor/bstr/examples/uppercase.rs | 21 + vendor/bstr/examples/words-std.rs | 20 + vendor/bstr/examples/words.rs | 17 + vendor/bstr/rustfmt.toml | 1 + vendor/bstr/scripts/generate-unicode-data | 150 + vendor/bstr/scripts/regex/grapheme.sh | 50 + vendor/bstr/scripts/regex/sentence.sh | 176 + vendor/bstr/scripts/regex/word.sh | 111 + vendor/bstr/src/ascii.rs | 322 + vendor/bstr/src/bstr.rs | 3991 + vendor/bstr/src/bstring.rs | 1588 + vendor/bstr/src/cow.rs | 89 + vendor/bstr/src/freqs.rs | 258 + vendor/bstr/src/impls.rs | 715 + vendor/bstr/src/io.rs | 203 + vendor/bstr/src/lib.rs | 407 + vendor/bstr/src/search/byte_frequencies.rs | 258 + vendor/bstr/src/search/mod.rs | 8 + vendor/bstr/src/search/prefilter.rs | 424 + vendor/bstr/src/search/tests.rs | 223 + vendor/bstr/src/search/twoway.rs | 883 + vendor/bstr/src/slice_index.rs | 292 + vendor/bstr/src/tests.rs | 32 + .../src/unicode/data/GraphemeBreakTest.txt | 700 + .../src/unicode/data/SentenceBreakTest.txt | 530 + .../bstr/src/unicode/data/WordBreakTest.txt | 1851 + .../fsm/grapheme_break_fwd.bigendian.dfa | Bin 0 -> 10223 bytes .../fsm/grapheme_break_fwd.littleendian.dfa | Bin 0 -> 10223 bytes .../src/unicode/fsm/grapheme_break_fwd.rs | 45 + .../fsm/grapheme_break_rev.bigendian.dfa | Bin 0 -> 51923 bytes .../fsm/grapheme_break_rev.littleendian.dfa | Bin 0 -> 51923 bytes .../src/unicode/fsm/grapheme_break_rev.rs | 45 + vendor/bstr/src/unicode/fsm/mod.rs | 8 + .../fsm/regional_indicator_rev.bigendian.dfa | Bin 0 -> 366 bytes .../regional_indicator_rev.littleendian.dfa | Bin 0 -> 366 bytes .../src/unicode/fsm/regional_indicator_rev.rs | 45 + .../fsm/sentence_break_fwd.bigendian.dfa | Bin 0 -> 144343 bytes .../fsm/sentence_break_fwd.littleendian.dfa | Bin 0 -> 144343 bytes .../src/unicode/fsm/sentence_break_fwd.rs | 45 + .../unicode/fsm/simple_word_fwd.bigendian.dfa | Bin 0 -> 8665 bytes .../fsm/simple_word_fwd.littleendian.dfa | Bin 0 -> 8665 bytes .../bstr/src/unicode/fsm/simple_word_fwd.rs | 45 + .../fsm/whitespace_anchored_fwd.bigendian.dfa | Bin 0 -> 572 bytes .../whitespace_anchored_fwd.littleendian.dfa | Bin 0 -> 572 bytes .../unicode/fsm/whitespace_anchored_fwd.rs | 45 + .../fsm/whitespace_anchored_rev.bigendian.dfa | Bin 0 -> 598 bytes .../whitespace_anchored_rev.littleendian.dfa | Bin 0 -> 598 bytes .../unicode/fsm/whitespace_anchored_rev.rs | 45 + .../unicode/fsm/word_break_fwd.bigendian.dfa | Bin 0 -> 218729 bytes .../fsm/word_break_fwd.littleendian.dfa | Bin 0 -> 218729 bytes vendor/bstr/src/unicode/fsm/word_break_fwd.rs | 45 + vendor/bstr/src/unicode/grapheme.rs | 357 + vendor/bstr/src/unicode/mod.rs | 12 + vendor/bstr/src/unicode/sentence.rs | 221 + vendor/bstr/src/unicode/whitespace.rs | 14 + vendor/bstr/src/unicode/word.rs | 447 + vendor/bstr/src/utf8.rs | 1108 + vendor/c2-chacha/.cargo-checksum.json | 2 +- vendor/c2-chacha/Cargo.toml | 13 +- vendor/c2-chacha/benches/machine.rs | 39 - vendor/c2-chacha/src/lib.rs | 4 - vendor/cc/.cargo-checksum.json | 2 +- vendor/cc/Cargo.lock | 116 +- vendor/cc/Cargo.toml | 12 +- vendor/cc/src/lib.rs | 31 +- vendor/cc/tests/support/mod.rs | 4 +- vendor/cfg-if/.cargo-checksum.json | 2 +- vendor/cfg-if/Cargo.toml | 3 +- vendor/cfg-if/README.md | 9 +- vendor/cfg-if/src/lib.rs | 78 +- vendor/cfg-if/tests/xcrate.rs | 5 +- vendor/cmake/.cargo-checksum.json | 2 +- vendor/cmake/Cargo.toml | 6 +- vendor/cmake/README.md | 2 - vendor/cmake/src/lib.rs | 70 +- vendor/compiler_builtins/.cargo-checksum.json | 2 +- vendor/compiler_builtins/Cargo.lock | 6 +- vendor/compiler_builtins/Cargo.toml | 2 +- vendor/compiler_builtins/src/macros.rs | 6 +- vendor/compiler_builtins/src/probestack.rs | 19 +- vendor/crossbeam-channel/.cargo-checksum.json | 1 + vendor/crossbeam-channel/CHANGELOG.md | 137 + vendor/crossbeam-channel/Cargo.toml | 34 + .../LICENSE-APACHE | 0 .../LICENSE-MIT | 2 - vendor/crossbeam-channel/LICENSE-THIRD-PARTY | 625 + vendor/crossbeam-channel/README.md | 88 + .../crossbeam-channel/examples/fibonacci.rs | 27 + vendor/crossbeam-channel/examples/matching.rs | 75 + .../crossbeam-channel/examples/stopwatch.rs | 58 + vendor/crossbeam-channel/src/channel.rs | 1340 + vendor/crossbeam-channel/src/context.rs | 189 + vendor/crossbeam-channel/src/counter.rs | 132 + vendor/crossbeam-channel/src/err.rs | 451 + vendor/crossbeam-channel/src/flavors/after.rs | 200 + vendor/crossbeam-channel/src/flavors/array.rs | 637 + vendor/crossbeam-channel/src/flavors/list.rs | 657 + vendor/crossbeam-channel/src/flavors/mod.rs | 17 + vendor/crossbeam-channel/src/flavors/never.rs | 110 + vendor/crossbeam-channel/src/flavors/tick.rs | 173 + vendor/crossbeam-channel/src/flavors/zero.rs | 461 + vendor/crossbeam-channel/src/lib.rs | 372 + vendor/crossbeam-channel/src/select.rs | 1078 + vendor/crossbeam-channel/src/select_macro.rs | 1201 + vendor/crossbeam-channel/src/utils.rs | 118 + vendor/crossbeam-channel/src/waker.rs | 285 + vendor/crossbeam-channel/tests/after.rs | 335 + vendor/crossbeam-channel/tests/array.rs | 604 + vendor/crossbeam-channel/tests/golang.rs | 1025 + vendor/crossbeam-channel/tests/iter.rs | 110 + vendor/crossbeam-channel/tests/list.rs | 488 + vendor/crossbeam-channel/tests/mpsc.rs | 1948 + vendor/crossbeam-channel/tests/never.rs | 99 + vendor/crossbeam-channel/tests/ready.rs | 822 + vendor/crossbeam-channel/tests/select.rs | 1285 + .../crossbeam-channel/tests/select_macro.rs | 1416 + .../crossbeam-channel/tests/thread_locals.rs | 53 + vendor/crossbeam-channel/tests/tick.rs | 350 + vendor/crossbeam-channel/tests/zero.rs | 501 + vendor/fixedbitset/.cargo-checksum.json | 1 - vendor/fixedbitset/Cargo.toml | 24 - vendor/fixedbitset/LICENSE-MIT | 25 - vendor/fixedbitset/README.rst | 82 - vendor/fixedbitset/benches/benches.rs | 133 - vendor/fixedbitset/src/lib.rs | 988 - vendor/fixedbitset/src/range.rs | 39 - vendor/getrandom/.cargo-checksum.json | 2 +- vendor/getrandom/CHANGELOG.md | 30 + vendor/getrandom/Cargo.toml | 15 +- .../src/{freebsd.rs => bsd_arandom.rs} | 28 +- vendor/getrandom/src/error.rs | 21 +- vendor/getrandom/src/lib.rs | 32 +- vendor/getrandom/src/rdrand.rs | 2 +- vendor/getrandom/src/solaris_illumos.rs | 2 +- vendor/getrandom/src/use_file.rs | 128 +- vendor/getrandom/src/util.rs | 38 +- vendor/getrandom/src/util_libc.rs | 55 +- vendor/getrandom/src/vxworks.rs | 35 + vendor/getrandom/src/wasi.rs | 10 +- vendor/getrandom/src/windows_uwp.rs | 2 +- vendor/getrandom/tests/{mod.rs => common.rs} | 9 +- vendor/globset/.cargo-checksum.json | 1 + vendor/globset/COPYING | 3 + vendor/globset/Cargo.toml | 48 + vendor/globset/LICENSE-MIT | 21 + vendor/globset/README.md | 122 + vendor/globset/UNLICENSE | 24 + vendor/globset/benches/bench.rs | 121 + vendor/globset/src/glob.rs | 1497 + vendor/globset/src/lib.rs | 871 + vendor/globset/src/pathutil.rs | 129 + .../.cargo-checksum.json | 0 .../{humantime => humantime-1.3.0}/Cargo.toml | 0 .../LICENSE-APACHE | 0 .../LICENSE-MIT | 0 .../{humantime => humantime-1.3.0}/README.md | 0 .../benches/datetime_format.rs | 0 .../benches/datetime_parse.rs | 0 .../{humantime => humantime-1.3.0}/bulk.yaml | 0 .../src/date.rs | 0 .../src/duration.rs | 0 .../{humantime => humantime-1.3.0}/src/lib.rs | 0 .../src/wrapper.rs | 0 .../{humantime => humantime-1.3.0}/vagga.yaml | 0 vendor/idna-0.1.5/.cargo-checksum.json | 1 - vendor/idna-0.1.5/Cargo.toml | 43 - vendor/idna-0.1.5/LICENSE-MIT | 25 - vendor/idna-0.1.5/src/IdnaMappingTable.txt | 8405 - vendor/idna-0.1.5/src/lib.rs | 73 - .../src/make_uts46_mapping_table.py | 192 - vendor/idna-0.1.5/src/punycode.rs | 213 - vendor/idna-0.1.5/src/uts46.rs | 433 - vendor/idna-0.1.5/src/uts46_mapping_table.rs | 16005 - vendor/idna-0.1.5/tests/IdnaTest.txt | 7848 - vendor/idna-0.1.5/tests/punycode.rs | 65 - vendor/idna-0.1.5/tests/punycode_tests.json | 120 - vendor/idna-0.1.5/tests/tests.rs | 21 - vendor/idna-0.1.5/tests/unit.rs | 40 - vendor/idna-0.1.5/tests/uts46.rs | 124 - vendor/ignore/.cargo-checksum.json | 1 + vendor/ignore/COPYING | 3 + vendor/ignore/Cargo.lock | 180 + vendor/ignore/Cargo.toml | 58 + vendor/ignore/LICENSE-MIT | 21 + vendor/ignore/README.md | 66 + vendor/ignore/UNLICENSE | 24 + vendor/ignore/examples/walk.rs | 84 + vendor/ignore/src/dir.rs | 1003 + vendor/ignore/src/gitignore.rs | 787 + vendor/ignore/src/lib.rs | 505 + vendor/ignore/src/overrides.rs | 262 + vendor/ignore/src/pathutil.rs | 142 + vendor/ignore/src/types.rs | 814 + vendor/ignore/src/walk.rs | 2081 + ...atched_path_or_any_parents_tests.gitignore | 216 + ...gnore_matched_path_or_any_parents_tests.rs | 323 + vendor/itertools-0.7.8/.cargo-checksum.json | 1 - vendor/itertools-0.7.8/Cargo.toml | 43 - vendor/itertools-0.7.8/Makefile | 34 - vendor/itertools-0.7.8/README.rst | 490 - vendor/itertools-0.7.8/benches/bench1.rs | 735 - vendor/itertools-0.7.8/benches/extra/mod.rs | 4 - .../benches/extra/zipslices.rs | 189 - vendor/itertools-0.7.8/benches/tree_fold1.rs | 126 - .../benches/tuple_combinations.rs | 97 - vendor/itertools-0.7.8/benches/tuples.rs | 190 - vendor/itertools-0.7.8/bors.toml | 3 - vendor/itertools-0.7.8/custom.css | 29 - vendor/itertools-0.7.8/examples/iris.data | 150 - vendor/itertools-0.7.8/examples/iris.rs | 141 - vendor/itertools-0.7.8/src/adaptors/mod.rs | 1293 - .../src/adaptors/multi_product.rs | 220 - vendor/itertools-0.7.8/src/combinations.rs | 165 - vendor/itertools-0.7.8/src/concat_impl.rs | 22 - .../itertools-0.7.8/src/cons_tuples_impl.rs | 68 - vendor/itertools-0.7.8/src/diff.rs | 61 - vendor/itertools-0.7.8/src/either_or_both.rs | 10 - vendor/itertools-0.7.8/src/format.rs | 113 - vendor/itertools-0.7.8/src/free.rs | 231 - vendor/itertools-0.7.8/src/group_map.rs | 22 - vendor/itertools-0.7.8/src/groupbylazy.rs | 571 - vendor/itertools-0.7.8/src/impl_macros.rs | 14 - vendor/itertools-0.7.8/src/intersperse.rs | 60 - vendor/itertools-0.7.8/src/kmerge_impl.rs | 256 - vendor/itertools-0.7.8/src/lib.rs | 2121 - vendor/itertools-0.7.8/src/merge_join.rs | 87 - vendor/itertools-0.7.8/src/minmax.rs | 114 - vendor/itertools-0.7.8/src/multipeek_impl.rs | 104 - vendor/itertools-0.7.8/src/pad_tail.rs | 83 - .../itertools-0.7.8/src/peeking_take_while.rs | 149 - .../src/process_results_impl.rs | 81 - vendor/itertools-0.7.8/src/put_back_n_impl.rs | 63 - vendor/itertools-0.7.8/src/rciter_impl.rs | 98 - vendor/itertools-0.7.8/src/repeatn.rs | 54 - vendor/itertools-0.7.8/src/size_hint.rs | 104 - vendor/itertools-0.7.8/src/sources.rs | 187 - vendor/itertools-0.7.8/src/tee.rs | 78 - vendor/itertools-0.7.8/src/tuple_impl.rs | 266 - vendor/itertools-0.7.8/src/unique_impl.rs | 134 - vendor/itertools-0.7.8/src/with_position.rs | 90 - vendor/itertools-0.7.8/src/zip_eq_impl.rs | 60 - vendor/itertools-0.7.8/src/zip_longest.rs | 78 - vendor/itertools-0.7.8/src/ziptuple.rs | 111 - vendor/itertools-0.7.8/tests/merge_join.rs | 110 - .../tests/peeking_take_while.rs | 53 - vendor/itertools-0.7.8/tests/quick.rs | 1019 - vendor/itertools-0.7.8/tests/test_core.rs | 240 - vendor/itertools-0.7.8/tests/test_std.rs | 749 - vendor/itertools-0.7.8/tests/tuples.rs | 88 - vendor/itertools-0.7.8/tests/zip.rs | 65 - vendor/jobserver/.cargo-checksum.json | 2 +- vendor/jobserver/Cargo.toml | 7 +- vendor/jobserver/README.md | 2 - vendor/jobserver/src/lib.rs | 731 +- vendor/jobserver/src/unix.rs | 336 + vendor/jobserver/src/wasm.rs | 90 + vendor/jobserver/src/windows.rs | 246 + vendor/jobserver/tests/client-of-myself.rs | 15 +- vendor/jobserver/tests/client.rs | 64 +- vendor/jobserver/tests/helper.rs | 51 +- vendor/jobserver/tests/make-as-a-client.rs | 26 +- vendor/jobserver/tests/server.rs | 52 +- vendor/lazy_static/.cargo-checksum.json | 2 +- vendor/lazy_static/Cargo.toml | 4 +- vendor/lazy_static/README.md | 4 +- vendor/lazy_static/src/inline_lazy.rs | 18 +- vendor/lazy_static/src/lib.rs | 14 +- vendor/lazy_static/tests/test.rs | 2 + vendor/libc/.cargo-checksum.json | 2 +- vendor/libc/Cargo.toml | 3 +- vendor/libc/README.md | 21 +- vendor/libc/build.rs | 30 +- vendor/libc/src/lib.rs | 1 + vendor/libc/src/macros.rs | 98 +- vendor/libc/src/unix/bsd/apple/mod.rs | 5 + vendor/libc/src/unix/bsd/netbsdlike/mod.rs | 35 + .../src/unix/bsd/netbsdlike/netbsd/mod.rs | 206 +- .../src/unix/bsd/netbsdlike/openbsd/mod.rs | 28 + .../libc/src/unix/linux_like/android/mod.rs | 91 +- .../src/unix/linux_like/emscripten/mod.rs | 8 + .../libc/src/unix/linux_like/linux/align.rs | 4 + .../unix/linux_like/linux/gnu/b32/arm/mod.rs | 8 + .../unix/linux_like/linux/gnu/b32/mips/mod.rs | 1 + .../src/unix/linux_like/linux/gnu/b32/mod.rs | 3 + .../unix/linux_like/linux/gnu/b32/powerpc.rs | 8 + .../linux_like/linux/gnu/b32/sparc/align.rs | 7 + .../linux_like/linux/gnu/b32/sparc/mod.rs | 978 + .../unix/linux_like/linux/gnu/b32/x86/mod.rs | 8 + .../linux_like/linux/gnu/b64/aarch64/mod.rs | 9 + .../linux_like/linux/gnu/b64/mips64/mod.rs | 9 + .../src/unix/linux_like/linux/gnu/b64/mod.rs | 3 + .../linux_like/linux/gnu/b64/powerpc64/mod.rs | 8 + .../linux_like/linux/gnu/b64/riscv64/mod.rs | 861 + .../unix/linux_like/linux/gnu/b64/s390x.rs | 9 + .../linux_like/linux/gnu/b64/sparc64/mod.rs | 9 + .../linux_like/linux/gnu/b64/x86_64/mod.rs | 14 + .../libc/src/unix/linux_like/linux/gnu/mod.rs | 13 +- vendor/libc/src/unix/linux_like/linux/mod.rs | 118 +- .../unix/linux_like/linux/musl/b32/arm/mod.rs | 1 + .../unix/linux_like/linux/musl/b32/hexagon.rs | 1 + .../linux_like/linux/musl/b32/mips/mod.rs | 4 + .../unix/linux_like/linux/musl/b32/x86/mod.rs | 6 +- .../linux_like/linux/musl/b64/aarch64/mod.rs | 1 + .../unix/linux_like/linux/musl/b64/mips64.rs | 1 + .../linux_like/linux/musl/b64/powerpc64.rs | 1 + .../linux_like/linux/musl/b64/x86_64/mod.rs | 41 +- .../src/unix/linux_like/linux/musl/mod.rs | 2 + .../src/unix/linux_like/linux/no_align.rs | 4 + vendor/libc/src/unix/linux_like/mod.rs | 36 +- vendor/libc/src/unix/solarish/mod.rs | 198 + vendor/libc/src/unix/uclibc/arm/mod.rs | 4 - vendor/libc/src/unix/uclibc/mod.rs | 22 + vendor/libc/src/vxworks/mod.rs | 239 +- vendor/libc/src/windows/mod.rs | 50 + vendor/libc/src/windows/msvc.rs | 4 + vendor/libc/tests/const_fn.rs | 5 + vendor/lock_api-0.1.3/.cargo-checksum.json | 1 - vendor/lock_api-0.1.3/Cargo.toml | 31 - vendor/lock_api-0.1.3/src/lib.rs | 106 - vendor/lock_api-0.1.3/src/mutex.rs | 496 - vendor/lock_api-0.1.3/src/remutex.rs | 564 - vendor/lock_api-0.1.3/src/rwlock.rs | 1345 - vendor/measureme/.cargo-checksum.json | 2 +- vendor/measureme/Cargo.toml | 2 +- vendor/measureme/src/event_id.rs | 81 + vendor/measureme/src/file_header.rs | 2 +- .../measureme/src/file_serialization_sink.rs | 44 +- vendor/measureme/src/lib.rs | 2 + vendor/measureme/src/profiler.rs | 38 +- vendor/measureme/src/raw_event.rs | 75 +- vendor/measureme/src/serialization.rs | 16 +- vendor/measureme/src/stringtable.rs | 128 +- vendor/ordermap/.cargo-checksum.json | 1 - vendor/ordermap/Cargo.toml | 58 - vendor/ordermap/README.rst | 226 - vendor/ordermap/benches/bench.rs | 745 - vendor/ordermap/benches/faststring.rs | 183 - vendor/ordermap/src/equivalent.rs | 27 - vendor/ordermap/src/lib.rs | 1877 - vendor/ordermap/src/macros.rs | 122 - vendor/ordermap/src/mutable_keys.rs | 76 - vendor/ordermap/src/serde.rs | 123 - vendor/ordermap/src/set.rs | 1136 - vendor/ordermap/src/util.rs | 17 - vendor/ordermap/tests/equivalent_trait.rs | 55 - vendor/ordermap/tests/quick.rs | 365 - vendor/ordermap/tests/serde.rs | 59 - vendor/ordermap/tests/tests.rs | 32 - vendor/petgraph/.cargo-checksum.json | 1 - vendor/petgraph/CONTRIBUTING.rst | 127 - vendor/petgraph/Cargo.toml | 75 - vendor/petgraph/LICENSE-MIT | 25 - vendor/petgraph/Makefile | 38 - vendor/petgraph/README.rst | 383 - vendor/petgraph/benches/iso.rs | 224 - vendor/petgraph/benches/ograph.rs | 54 - vendor/petgraph/benches/stable_graph.rs | 206 - vendor/petgraph/custom.css | 25 - vendor/petgraph/graph-example.dot | 15 - vendor/petgraph/src/algo/dominators.rs | 267 - vendor/petgraph/src/algo/mod.rs | 626 - vendor/petgraph/src/astar.rs | 169 - vendor/petgraph/src/csr.rs | 940 - vendor/petgraph/src/data.rs | 435 - vendor/petgraph/src/dijkstra.rs | 79 - vendor/petgraph/src/dot.rs | 207 - vendor/petgraph/src/generate.rs | 129 - vendor/petgraph/src/graph_impl/frozen.rs | 85 - vendor/petgraph/src/graph_impl/mod.rs | 2035 - .../petgraph/src/graph_impl/serialization.rs | 308 - .../src/graph_impl/stable_graph/mod.rs | 1677 - .../graph_impl/stable_graph/serialization.rs | 270 - vendor/petgraph/src/graphmap.rs | 886 - vendor/petgraph/src/isomorphism.rs | 456 - vendor/petgraph/src/iter_format.rs | 100 - vendor/petgraph/src/iter_utils.rs | 31 - vendor/petgraph/src/lib.rs | 227 - vendor/petgraph/src/macros.rs | 13 - vendor/petgraph/src/prelude.rs | 48 - vendor/petgraph/src/quickcheck.rs | 208 - vendor/petgraph/src/scored.rs | 53 - vendor/petgraph/src/serde_utils.rs | 92 - vendor/petgraph/src/traits_graph.rs | 85 - vendor/petgraph/src/unionfind.rs | 145 - vendor/petgraph/src/util.rs | 23 - vendor/petgraph/src/visit/dfsvisit.rs | 195 - vendor/petgraph/src/visit/filter.rs | 419 - vendor/petgraph/src/visit/macros.rs | 133 - vendor/petgraph/src/visit/mod.rs | 714 - vendor/petgraph/src/visit/reversed.rs | 135 - vendor/petgraph/src/visit/traversal.rs | 440 - vendor/petgraph/tests/graph.rs | 1787 - vendor/petgraph/tests/graphmap.rs | 301 - vendor/petgraph/tests/iso.rs | 565 - vendor/petgraph/tests/quickcheck.rs | 926 - vendor/petgraph/tests/stable_graph.rs | 345 - vendor/petgraph/tests/unionfind.rs | 78 - vendor/petgraph/tests/utils/mod.rs | 5 - vendor/petgraph/tests/utils/qc.rs | 26 - vendor/pkg-config/.cargo-checksum.json | 2 +- vendor/pkg-config/CHANGELOG.md | 54 + vendor/pkg-config/Cargo.toml | 8 +- vendor/pkg-config/README.md | 8 +- vendor/pkg-config/src/lib.rs | 315 +- vendor/pkg-config/tests/test.rs | 227 +- vendor/ppv-lite86/.cargo-checksum.json | 2 +- vendor/ppv-lite86/Cargo.toml | 2 +- vendor/ppv-lite86/src/x86_64/mod.rs | 135 +- vendor/rand/.cargo-checksum.json | 2 +- vendor/rand/CHANGELOG.md | 34 + vendor/rand/Cargo.lock | 388 + vendor/rand/Cargo.toml | 23 +- vendor/rand/README.md | 16 +- vendor/rand/SECURITY.md | 69 + vendor/rand/benches/generators.rs | 81 +- vendor/rand/benches/misc.rs | 2 +- vendor/rand/benches/seq.rs | 50 +- vendor/rand/benches/weighted.rs | 36 + vendor/rand/examples/monte-carlo.rs | 7 +- vendor/rand/examples/monty-hall.rs | 29 +- vendor/rand/rustfmt.toml | 8 +- vendor/rand/src/distributions/bernoulli.rs | 61 +- vendor/rand/src/distributions/binomial.rs | 69 +- vendor/rand/src/distributions/cauchy.rs | 15 +- vendor/rand/src/distributions/dirichlet.rs | 9 +- vendor/rand/src/distributions/exponential.rs | 32 +- vendor/rand/src/distributions/float.rs | 114 +- vendor/rand/src/distributions/gamma.rs | 46 +- vendor/rand/src/distributions/integer.rs | 149 +- vendor/rand/src/distributions/mod.rs | 139 +- vendor/rand/src/distributions/normal.rs | 45 +- vendor/rand/src/distributions/other.rs | 130 +- vendor/rand/src/distributions/pareto.rs | 11 +- vendor/rand/src/distributions/poisson.rs | 14 +- vendor/rand/src/distributions/triangular.rs | 16 +- vendor/rand/src/distributions/uniform.rs | 538 +- vendor/rand/src/distributions/unit_circle.rs | 38 +- vendor/rand/src/distributions/unit_sphere.rs | 36 +- vendor/rand/src/distributions/utils.rs | 178 +- vendor/rand/src/distributions/weibull.rs | 11 +- .../distributions/weighted/alias_method.rs | 58 +- vendor/rand/src/distributions/weighted/mod.rs | 263 +- .../rand/src/distributions/ziggurat_tables.rs | 4 + vendor/rand/src/lib.rs | 90 +- vendor/rand/src/prelude.rs | 17 +- vendor/rand/src/rngs/adapter/mod.rs | 4 +- vendor/rand/src/rngs/adapter/read.rs | 27 +- vendor/rand/src/rngs/adapter/reseeding.rs | 119 +- vendor/rand/src/rngs/entropy.rs | 11 +- vendor/rand/src/rngs/mock.rs | 16 +- vendor/rand/src/rngs/mod.rs | 34 +- vendor/rand/src/rngs/os.rs | 95 - vendor/rand/src/rngs/small.rs | 12 +- vendor/rand/src/rngs/std.rs | 23 +- vendor/rand/src/rngs/thread.rs | 4 +- vendor/rand/src/seq/index.rs | 173 +- vendor/rand/src/seq/mod.rs | 186 +- vendor/rand_core-0.4.0/.cargo-checksum.json | 1 - vendor/rand_core-0.4.0/CHANGELOG.md | 36 - vendor/rand_core-0.4.0/COPYRIGHT | 12 - vendor/rand_core-0.4.0/Cargo.toml | 41 - vendor/rand_core-0.4.0/LICENSE-APACHE | 201 - vendor/rand_core-0.4.0/LICENSE-MIT | 26 - vendor/rand_core-0.4.0/README.md | 66 - vendor/rand_core-0.4.0/src/block.rs | 499 - vendor/rand_core-0.4.0/src/error.rs | 177 - vendor/rand_core-0.4.0/src/impls.rs | 165 - vendor/rand_core-0.4.0/src/le.rs | 68 - vendor/rand_core-0.4.0/src/lib.rs | 477 - vendor/redox_syscall/.cargo-checksum.json | 2 +- vendor/redox_syscall/Cargo.toml | 4 +- vendor/redox_syscall/src/arch/nonredox.rs | 31 + vendor/redox_syscall/src/arch/x86_64.rs | 38 +- vendor/redox_syscall/src/call.rs | 22 +- vendor/redox_syscall/src/data.rs | 144 +- vendor/redox_syscall/src/flag.rs | 25 +- vendor/redox_syscall/src/io/dma.rs | 4 +- vendor/redox_syscall/src/lib.rs | 22 +- vendor/redox_syscall/src/number.rs | 4 +- vendor/redox_syscall/src/scheme/scheme.rs | 14 +- .../redox_syscall/src/scheme/scheme_block.rs | 14 +- .../src/scheme/scheme_block_mut.rs | 14 +- vendor/redox_syscall/src/scheme/scheme_mut.rs | 14 +- vendor/redox_syscall/src/tests.rs | 129 + vendor/rustfix/.cargo-checksum.json | 2 +- vendor/rustfix/Cargo.toml | 6 +- vendor/rustfix/Readme.md | 3 - vendor/rustfix/bors.toml | 4 - vendor/rustfix/src/lib.rs | 23 +- vendor/rustfix/src/replace.rs | 24 +- vendor/socket2/.cargo-checksum.json | 2 +- vendor/socket2/Cargo.toml | 5 +- vendor/socket2/README.md | 2 +- vendor/socket2/src/lib.rs | 29 +- vendor/socket2/src/sockaddr.rs | 23 +- vendor/socket2/src/socket.rs | 34 +- vendor/socket2/src/sys/redox/mod.rs | 76 +- .../socket2/src/sys/{unix/mod.rs => unix.rs} | 105 +- vendor/socket2/src/sys/unix/weak.rs | 59 - vendor/socket2/src/sys/windows.rs | 33 +- vendor/ucd-parse/.cargo-checksum.json | 1 + vendor/ucd-parse/Cargo.toml | 28 + vendor/{ordermap => ucd-parse}/LICENSE-APACHE | 0 vendor/ucd-parse/LICENSE-MIT | 21 + vendor/ucd-parse/README.md | 22 + vendor/ucd-parse/src/age.rs | 63 + vendor/ucd-parse/src/case_folding.rs | 155 + vendor/ucd-parse/src/common.rs | 510 + vendor/ucd-parse/src/core_properties.rs | 62 + vendor/ucd-parse/src/emoji_properties.rs | 69 + vendor/ucd-parse/src/error.rs | 93 + .../ucd-parse/src/grapheme_cluster_break.rs | 104 + vendor/ucd-parse/src/jamo_short_name.rs | 78 + vendor/ucd-parse/src/lib.rs | 67 + vendor/ucd-parse/src/line_break.rs | 52 + vendor/ucd-parse/src/name_aliases.rs | 143 + vendor/ucd-parse/src/prop_list.rs | 65 + vendor/ucd-parse/src/property_aliases.rs | 111 + .../ucd-parse/src/property_value_aliases.rs | 176 + vendor/ucd-parse/src/script_extensions.rs | 65 + vendor/ucd-parse/src/scripts.rs | 62 + vendor/ucd-parse/src/sentence_break.rs | 104 + vendor/ucd-parse/src/special_casing.rs | 104 + vendor/ucd-parse/src/unicode_data.rs | 731 + vendor/ucd-parse/src/word_break.rs | 106 + .../.cargo-checksum.json | 2 +- vendor/unicode-normalization/Cargo.toml | 10 +- vendor/unicode-normalization/README.md | 13 +- vendor/unicode-normalization/benches/bench.rs | 35 + .../unicode-normalization/scripts/unicode.py | 178 +- .../unicode-normalization/src/__test_api.rs | 13 + vendor/unicode-normalization/src/decompose.rs | 103 +- vendor/unicode-normalization/src/lib.rs | 20 +- vendor/unicode-normalization/src/lookups.rs | 89 + .../src/normalization_tests.rs | 131078 ------ vendor/unicode-normalization/src/normalize.rs | 11 +- .../unicode-normalization/src/perfect_hash.rs | 41 + .../unicode-normalization/src/quick_check.rs | 36 +- vendor/unicode-normalization/src/recompose.rs | 54 +- .../unicode-normalization/src/stream_safe.rs | 32 +- vendor/unicode-normalization/src/tables.rs | 33048 +- vendor/unicode-normalization/src/test.rs | 78 - vendor/unicode-script/.cargo-checksum.json | 1 + .../{wasi-0.7.0 => unicode-script}/Cargo.toml | 30 +- vendor/unicode-script/README.md | 7 + vendor/unicode-script/scripts/unicode.py | 416 + vendor/unicode-script/src/lib.rs | 103 + vendor/unicode-script/src/tables.rs | 3526 + vendor/unicode-security/.cargo-checksum.json | 1 + vendor/unicode-security/COPYRIGHT | 7 + vendor/unicode-security/Cargo.toml | 47 + .../LICENSE-APACHE | 0 .../LICENSE-MIT | 2 +- vendor/unicode-security/README.md | 7 + vendor/unicode-security/scripts/unicode.py | 226 + .../src/general_security_profile.rs | 26 + vendor/unicode-security/src/lib.rs | 72 + vendor/unicode-security/src/mixed_script.rs | 132 + .../unicode-security/src/restriction_level.rs | 74 + vendor/unicode-security/src/tables.rs | 1701 + vendor/unicode-security/src/tests.rs | 60 + vendor/vcpkg/.cargo-checksum.json | 2 +- vendor/vcpkg/Cargo.toml | 4 +- vendor/vcpkg/src/lib.rs | 374 +- vendor/wasi-0.7.0/.cargo-checksum.json | 1 - vendor/wasi-0.7.0/0001-maybe.patch | 1178 - vendor/wasi-0.7.0/CODE_OF_CONDUCT.md | 46 - vendor/wasi-0.7.0/CONTRIBUTING.md | 8 - vendor/wasi-0.7.0/LICENSE-APACHE | 201 - .../LICENSE-Apache-2.0_WITH_LLVM-exception | 220 - vendor/wasi-0.7.0/README.md | 24 - vendor/wasi-0.7.0/clip.log | 20 - vendor/wasi-0.7.0/old-bitflags.patch | 570 - vendor/wasi-0.7.0/rusty-tags.vi | 477 - vendor/wasi-0.7.0/src/lib.rs | 20 - vendor/wasi-0.7.0/src/wasi_unstable/mod.rs | 824 - vendor/wasi-0.7.0/src/wasi_unstable/raw.rs | 632 - version | 2 +- 4387 files changed, 548671 insertions(+), 355812 deletions(-) create mode 100644 src/bootstrap/format.rs create mode 100755 src/ci/docker/dist-various-1/build-riscv-toolchain.sh create mode 100755 src/ci/docker/dist-various-1/crosstool-ng.sh create mode 100644 src/ci/docker/dist-various-1/riscv64-unknown-linux-gnu.config delete mode 100755 src/ci/scripts/switch-xcode.sh delete mode 100644 src/doc/book/2018-edition/Cargo.lock delete mode 100644 src/doc/book/2018-edition/Cargo.toml delete mode 100644 src/doc/book/2018-edition/LICENSE-APACHE delete mode 100644 src/doc/book/2018-edition/LICENSE-MIT delete mode 100755 src/doc/book/2018-edition/convert-quotes.sh delete mode 100755 src/doc/book/2018-edition/nostarch.sh delete mode 100644 src/doc/book/2018-edition/style-guide.md delete mode 100644 src/doc/book/2018-edition/tools/docx-to-md.xsl delete mode 100644 src/doc/book/2018-edition/tools/src/bin/concat_chapters.rs delete mode 100644 src/doc/book/2018-edition/tools/src/bin/convert_quotes.rs delete mode 100644 src/doc/book/2018-edition/tools/src/bin/lfp.rs delete mode 100644 src/doc/book/2018-edition/tools/src/bin/link2print.rs delete mode 100644 src/doc/book/2018-edition/tools/src/bin/remove_links.rs delete mode 100644 src/doc/book/2018-edition/tools/src/bin/remove_markup.rs delete mode 100644 src/doc/book/nostarch/updates.md delete mode 100644 src/doc/book/second-edition/Cargo.lock delete mode 100644 src/doc/book/second-edition/Cargo.toml delete mode 100644 src/doc/book/second-edition/LICENSE-APACHE delete mode 100644 src/doc/book/second-edition/LICENSE-MIT delete mode 100644 src/doc/book/second-edition/convert-quotes.sh delete mode 100644 src/doc/book/second-edition/doc-to-md.sh delete mode 100644 src/doc/book/second-edition/nostarch.sh delete mode 100644 src/doc/book/second-edition/style-guide.md delete mode 100644 src/doc/book/second-edition/tools/docx-to-md.xsl delete mode 100644 src/doc/book/second-edition/tools/src/bin/concat_chapters.rs delete mode 100644 src/doc/book/second-edition/tools/src/bin/convert_quotes.rs delete mode 100644 src/doc/book/second-edition/tools/src/bin/lfp.rs delete mode 100644 src/doc/book/second-edition/tools/src/bin/link2print.rs delete mode 100644 src/doc/book/second-edition/tools/src/bin/remove_links.rs delete mode 100644 src/doc/book/second-edition/tools/src/bin/remove_markup.rs create mode 100644 src/doc/rustc-guide/src/bug-fix-procedure.md create mode 100644 src/doc/rustc-guide/src/diagnostics/diagnostic-codes.md create mode 100644 src/doc/rustc-guide/src/panic-implementation.md create mode 100644 src/doc/rustc-guide/src/queries/example-0.counts.txt create mode 100644 src/doc/rustc-guide/src/queries/example-0.html create mode 100644 src/doc/rustc-guide/src/queries/example-0.png create mode 100644 src/doc/rustc-guide/src/queries/profiling.md create mode 100644 src/doc/unstable-book/src/compiler-flags/sanitizer.md delete mode 100644 src/doc/unstable-book/src/language-features/slice-patterns.md delete mode 100644 src/doc/unstable-book/src/language-features/transparent-enums.md delete mode 100644 src/doc/unstable-book/src/library-features/compiler-builtins-lib.md delete mode 100644 src/doc/unstable-book/src/library-features/debug-map-key-value.md delete mode 100644 src/doc/unstable-book/src/library-features/sanitizer-runtime-lib.md delete mode 100644 src/libcore/iter_private.rs create mode 100644 src/libcore/ptr/const_ptr.rs create mode 100644 src/libcore/ptr/mut_ptr.rs delete mode 100644 src/libcore/unicode/bool_trie.rs delete mode 100644 src/libcore/unicode/tables.rs delete mode 100755 src/libcore/unicode/unicode.py create mode 100644 src/libcore/unicode/unicode_data.rs create mode 100644 src/librustc/hir/exports.rs delete mode 100644 src/librustc/hir/ptr.rs create mode 100644 src/librustc/lint.rs delete mode 100644 src/librustc/lint/context.rs delete mode 100644 src/librustc/lint/mod.rs create mode 100644 src/librustc/middle/codegen_fn_attrs.rs create mode 100644 src/librustc/middle/mod.rs create mode 100644 src/librustc/mir/interpret/queries.rs create mode 100644 src/librustc/mir/query.rs delete mode 100644 src/librustc/traits/error_reporting.rs create mode 100644 src/librustc/traits/error_reporting/mod.rs create mode 100644 src/librustc/traits/error_reporting/on_unimplemented.rs create mode 100644 src/librustc/traits/error_reporting/suggestions.rs create mode 100644 src/librustc/traits/misc.rs rename src/librustc/{ty => traits}/structural_match.rs (92%) rename src/librustc/{ty => traits}/wf.rs (59%) delete mode 100644 src/librustc/ty/constness.rs rename src/librustc/{infer/outlives => ty}/free_region_map.rs (85%) rename src/librustc/{traits/query => ty}/normalize_erasing_regions.rs (78%) create mode 100644 src/librustc/ty/query/profiling_support.rs delete mode 100644 src/librustc/util/nodemap.rs delete mode 100644 src/librustc_asan/Cargo.toml delete mode 100644 src/librustc_asan/build.rs delete mode 100644 src/librustc_asan/lib.rs create mode 100644 src/librustc_ast_lowering/Cargo.toml rename src/{librustc/hir/lowering => librustc_ast_lowering}/expr.rs (67%) rename src/{librustc/hir/lowering => librustc_ast_lowering}/item.rs (66%) rename src/{librustc/hir/lowering.rs => librustc_ast_lowering/lib.rs} (55%) create mode 100644 src/librustc_ast_lowering/pat.rs create mode 100644 src/librustc_ast_lowering/path.rs create mode 100644 src/librustc_ast_passes/Cargo.toml rename src/{librustc_passes => librustc_ast_passes}/ast_validation.rs (58%) create mode 100644 src/librustc_ast_passes/feature_gate.rs create mode 100644 src/librustc_ast_passes/lib.rs rename src/{libsyntax => librustc_ast_passes}/show_span.rs (80%) rename src/{libsyntax_ext => librustc_builtin_macros}/Cargo.toml (66%) rename src/{libsyntax_ext => librustc_builtin_macros}/asm.rs (79%) rename src/{libsyntax_ext => librustc_builtin_macros}/assert.rs (69%) rename src/{libsyntax_ext => librustc_builtin_macros}/cfg.rs (81%) rename src/{libsyntax_ext => librustc_builtin_macros}/cmdline_attrs.rs (83%) rename src/{libsyntax_ext => librustc_builtin_macros}/compile_error.rs (54%) rename src/{libsyntax_ext => librustc_builtin_macros}/concat.rs (91%) rename src/{libsyntax_ext => librustc_builtin_macros}/concat_idents.rs (74%) rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/bounds.rs (61%) rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/clone.rs (57%) rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/cmp/eq.rs (50%) create mode 100644 src/librustc_builtin_macros/deriving/cmp/ord.rs rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/cmp/partial_eq.rs (78%) rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/cmp/partial_ord.rs (59%) rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/debug.rs (58%) create mode 100644 src/librustc_builtin_macros/deriving/decodable.rs create mode 100644 src/librustc_builtin_macros/deriving/default.rs rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/encodable.rs (63%) rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/generic/mod.rs (68%) rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/generic/ty.rs (54%) create mode 100644 src/librustc_builtin_macros/deriving/hash.rs rename src/{libsyntax_ext => librustc_builtin_macros}/deriving/mod.rs (56%) rename src/{libsyntax_ext => librustc_builtin_macros}/env.rs (50%) rename src/{libsyntax_ext => librustc_builtin_macros}/format.rs (88%) rename src/{libsyntax_ext => librustc_builtin_macros}/format_foreign.rs (88%) rename src/{libsyntax_ext => librustc_builtin_macros}/format_foreign/printf/tests.rs (77%) rename src/{libsyntax_ext => librustc_builtin_macros}/format_foreign/shell/tests.rs (95%) rename src/{libsyntax_ext => librustc_builtin_macros}/global_allocator.rs (90%) create mode 100644 src/librustc_builtin_macros/global_asm.rs rename src/{libsyntax_ext => librustc_builtin_macros}/lib.rs (88%) create mode 100644 src/librustc_builtin_macros/log_syntax.rs rename src/{libsyntax_ext => librustc_builtin_macros}/proc_macro_harness.rs (69%) rename src/{libsyntax_ext => librustc_builtin_macros}/source_util.rs (72%) rename src/{libsyntax_ext => librustc_builtin_macros}/standard_library_imports.rs (68%) create mode 100644 src/librustc_builtin_macros/test.rs rename src/{libsyntax_ext => librustc_builtin_macros}/test_harness.rs (78%) rename src/{libsyntax_ext => librustc_builtin_macros}/trace_macros.rs (60%) rename src/{libsyntax_ext => librustc_builtin_macros}/util.rs (88%) create mode 100644 src/librustc_data_structures/atomic_ref.rs rename src/{librustc/util => librustc_data_structures}/captures.rs (84%) create mode 100644 src/librustc_error_codes/error_codes/E0222.md create mode 100644 src/librustc_error_codes/error_codes/E0477.md create mode 100644 src/librustc_error_codes/error_codes/E0627.md create mode 100644 src/librustc_error_codes/error_codes/E0746.md rename src/{libsyntax_expand => librustc_expand}/Cargo.toml (69%) rename src/{libsyntax_expand => librustc_expand}/base.rs (82%) rename src/{libsyntax_expand => librustc_expand}/build.rs (64%) rename src/{libsyntax_expand => librustc_expand}/expand.rs (76%) rename src/{libsyntax_expand => librustc_expand}/lib.rs (91%) rename src/{libsyntax_expand => librustc_expand}/mbe.rs (98%) rename src/{libsyntax_expand => librustc_expand}/mbe/macro_check.rs (99%) rename src/{libsyntax_expand => librustc_expand}/mbe/macro_parser.rs (91%) rename src/{libsyntax_expand => librustc_expand}/mbe/macro_rules.rs (95%) rename src/{libsyntax_expand => librustc_expand}/mbe/quoted.rs (94%) rename src/{libsyntax_expand => librustc_expand}/mbe/transcribe.rs (99%) rename src/{libsyntax_expand => librustc_expand}/mut_visit/tests.rs (66%) rename src/{libsyntax_expand => librustc_expand}/parse/lexer/tests.rs (88%) rename src/{libsyntax_expand => librustc_expand}/parse/tests.rs (60%) rename src/{libsyntax_expand => librustc_expand}/placeholders.rs (65%) rename src/{libsyntax_expand => librustc_expand}/proc_macro.rs (77%) rename src/{libsyntax_expand => librustc_expand}/proc_macro_server.rs (92%) create mode 100644 src/librustc_expand/tests.rs rename src/{libsyntax_expand => librustc_expand}/tokenstream/tests.rs (98%) create mode 100644 src/librustc_hir/Cargo.toml rename src/{librustc/hir => librustc_hir}/def.rs (81%) rename src/{librustc/hir => librustc_hir}/def_id.rs (65%) create mode 100644 src/librustc_hir/hir.rs create mode 100644 src/librustc_hir/hir_id.rs rename src/{librustc/hir => librustc_hir}/intravisit.rs (68%) rename src/{librustc/hir => librustc_hir}/itemlikevisit.rs (63%) create mode 100644 src/librustc_hir/lib.rs rename src/{librustc/hir => librustc_hir}/pat_util.rs (65%) rename src/{librustc/hir => librustc_hir}/print.rs (78%) create mode 100644 src/librustc_hir/stable_hash_impls.rs create mode 100644 src/librustc_index/vec/tests.rs create mode 100644 src/librustc_interface/callbacks.rs create mode 100644 src/librustc_lint/context.rs create mode 100644 src/librustc_lint/early.rs rename src/{librustc/lint => librustc_lint}/internal.rs (86%) create mode 100644 src/librustc_lint/late.rs rename src/{librustc/lint => librustc_lint}/levels.rs (55%) create mode 100644 src/librustc_lint/passes.rs delete mode 100644 src/librustc_lsan/Cargo.toml delete mode 100644 src/librustc_lsan/build.rs delete mode 100644 src/librustc_lsan/lib.rs delete mode 100644 src/librustc_mir/build/cfg.rs delete mode 100644 src/librustc_mir/build/matches/util.rs create mode 100644 src/librustc_mir/const_eval/error.rs create mode 100644 src/librustc_mir/const_eval/eval_queries.rs create mode 100644 src/librustc_mir/const_eval/fn_queries.rs create mode 100644 src/librustc_mir/const_eval/machine.rs delete mode 100644 src/librustc_mir/dataflow/generic.rs create mode 100644 src/librustc_mir/dataflow/generic/cursor.rs create mode 100644 src/librustc_mir/dataflow/generic/engine.rs create mode 100644 src/librustc_mir/dataflow/generic/mod.rs create mode 100644 src/librustc_mir/dataflow/generic/tests.rs create mode 100644 src/librustc_mir/transform/unreachable_prop.rs create mode 100644 src/librustc_mir_build/Cargo.toml rename src/{librustc_mir => librustc_mir_build}/build/block.rs (62%) create mode 100644 src/librustc_mir_build/build/cfg.rs rename src/{librustc_mir => librustc_mir_build}/build/expr/as_constant.rs (61%) rename src/{librustc_mir => librustc_mir_build}/build/expr/as_operand.rs (81%) rename src/{librustc_mir => librustc_mir_build}/build/expr/as_place.rs (75%) rename src/{librustc_mir => librustc_mir_build}/build/expr/as_rvalue.rs (85%) rename src/{librustc_mir => librustc_mir_build}/build/expr/as_temp.rs (75%) rename src/{librustc_mir => librustc_mir_build}/build/expr/category.rs (91%) rename src/{librustc_mir => librustc_mir_build}/build/expr/into.rs (76%) rename src/{librustc_mir => librustc_mir_build}/build/expr/mod.rs (100%) rename src/{librustc_mir => librustc_mir_build}/build/expr/stmt.rs (85%) rename src/{librustc_mir => librustc_mir_build}/build/into.rs (85%) rename src/{librustc_mir => librustc_mir_build}/build/matches/mod.rs (77%) rename src/{librustc_mir => librustc_mir_build}/build/matches/simplify.rs (79%) rename src/{librustc_mir => librustc_mir_build}/build/matches/test.rs (73%) create mode 100644 src/librustc_mir_build/build/matches/util.rs rename src/{librustc_mir => librustc_mir_build}/build/misc.rs (62%) rename src/{librustc_mir => librustc_mir_build}/build/mod.rs (69%) rename src/{librustc_mir => librustc_mir_build}/build/scope.rs (80%) rename src/{librustc_mir => librustc_mir_build}/hair/constant.rs (50%) rename src/{librustc_mir => librustc_mir_build}/hair/cx/block.rs (74%) rename src/{librustc_mir => librustc_mir_build}/hair/cx/expr.rs (57%) rename src/{librustc_mir => librustc_mir_build}/hair/cx/mod.rs (65%) rename src/{librustc_mir => librustc_mir_build}/hair/cx/to_ref.rs (85%) rename src/{librustc_mir => librustc_mir_build}/hair/mod.rs (80%) rename src/{librustc_mir => librustc_mir_build}/hair/pattern/_match.rs (96%) rename src/{librustc_mir => librustc_mir_build}/hair/pattern/check_match.rs (57%) rename src/{librustc_mir => librustc_mir_build}/hair/pattern/const_to_pat.rs (63%) rename src/{librustc_mir => librustc_mir_build}/hair/pattern/mod.rs (54%) rename src/{librustc_mir => librustc_mir_build}/hair/util.rs (85%) create mode 100644 src/librustc_mir_build/lib.rs rename src/{librustc_mir => librustc_mir_build}/lints.rs (74%) delete mode 100644 src/librustc_msan/Cargo.toml delete mode 100644 src/librustc_msan/build.rs delete mode 100644 src/librustc_msan/lib.rs rename src/{librustc/middle => librustc_passes}/diagnostic_items.rs (67%) rename src/{librustc/middle => librustc_passes}/lib_features.rs (74%) rename src/{librustc/middle => librustc_passes}/reachable.rs (66%) create mode 100644 src/librustc_passes/region.rs create mode 100644 src/librustc_passes/stability.rs rename src/librustc_resolve/{resolve_imports.rs => imports.rs} (66%) create mode 100644 src/librustc_resolve/lifetimes.rs rename src/{librustc => librustc_session}/lint/builtin.rs (66%) create mode 100644 src/librustc_session/options.rs rename src/{libsyntax_pos => librustc_span}/Cargo.toml (92%) rename src/{libsyntax_pos => librustc_span}/analyze_source_file.rs (92%) rename src/{libsyntax_pos => librustc_span}/analyze_source_file/tests.rs (73%) rename src/{libsyntax_pos => librustc_span}/caching_source_map_view.rs (83%) rename src/{libsyntax_pos => librustc_span}/edition.rs (89%) rename src/{libsyntax_pos => librustc_span}/fatal_error.rs (84%) rename src/{libsyntax_pos => librustc_span}/hygiene.rs (87%) rename src/{libsyntax_pos => librustc_span}/lib.rs (86%) rename src/{libsyntax_pos => librustc_span}/source_map.rs (81%) rename src/{libsyntax_pos => librustc_span}/source_map/tests.rs (91%) rename src/{libsyntax_pos => librustc_span}/span_encoding.rs (99%) rename src/{libsyntax_pos => librustc_span}/symbol.rs (95%) rename src/{libsyntax_pos => librustc_span}/symbol/tests.rs (100%) rename src/{libsyntax_pos => librustc_span}/tests.rs (84%) create mode 100644 src/librustc_target/spec/armv7a_none_eabi.rs create mode 100644 src/librustc_target/spec/armv7a_none_eabihf.rs delete mode 100644 src/librustc_tsan/Cargo.toml delete mode 100644 src/librustc_tsan/build.rs delete mode 100644 src/librustc_tsan/lib.rs create mode 100644 src/librustc_ty/Cargo.toml create mode 100644 src/librustc_ty/lib.rs create mode 100644 src/librustc_ty/ty.rs delete mode 100644 src/libstd/sys/vxworks/weak.rs delete mode 100644 src/libsyntax/diagnostics/macros.rs delete mode 100644 src/libsyntax/early_buffered_lints.rs delete mode 100644 src/libsyntax/feature_gate/check.rs delete mode 100644 src/libsyntax_expand/tests.rs delete mode 100644 src/libsyntax_ext/deriving/cmp/ord.rs delete mode 100644 src/libsyntax_ext/deriving/decodable.rs delete mode 100644 src/libsyntax_ext/deriving/default.rs delete mode 100644 src/libsyntax_ext/deriving/hash.rs delete mode 100644 src/libsyntax_ext/global_asm.rs delete mode 100644 src/libsyntax_ext/log_syntax.rs delete mode 100644 src/libsyntax_ext/test.rs delete mode 100644 src/test/debuginfo/borrowed-enum-legacy.rs delete mode 100644 src/test/debuginfo/generic-enum-with-different-disr-sizes-legacy.rs delete mode 100644 src/test/debuginfo/generic-struct-style-enum-legacy.rs delete mode 100644 src/test/debuginfo/generic-tuple-style-enum-legacy.rs delete mode 100644 src/test/debuginfo/recursive-struct-legacy.rs delete mode 100644 src/test/debuginfo/struct-style-enum-legacy.rs delete mode 100644 src/test/debuginfo/tuple-style-enum-legacy.rs delete mode 100644 src/test/debuginfo/unique-enum-legacy.rs create mode 100644 src/test/incremental/change_implementation_cross_crate/auxiliary/a.rs create mode 100644 src/test/incremental/change_implementation_cross_crate/main.rs create mode 100644 src/test/incremental/thinlto/cgu_invalidated_when_import_added.rs create mode 100644 src/test/incremental/thinlto/cgu_invalidated_when_import_removed.rs create mode 100644 src/test/mir-opt/address-of.rs create mode 100644 src/test/mir-opt/const_prop/cast.rs create mode 100644 src/test/mir-opt/const_prop/optimizes_into_variable.rs create mode 100644 src/test/mir-opt/const_prop/ref_deref_project.rs rename src/test/mir-opt/{ => inline}/inline-any-operand.rs (100%) rename src/test/mir-opt/{ => inline}/inline-closure-borrows-arg.rs (100%) rename src/test/mir-opt/{ => inline}/inline-closure-captures.rs (100%) rename src/test/mir-opt/{ => inline}/inline-closure.rs (100%) create mode 100644 src/test/mir-opt/inline/inline-into-box-place.rs rename src/test/mir-opt/{ => inline}/inline-retag.rs (78%) create mode 100644 src/test/mir-opt/inline/inline-specialization.rs rename src/test/mir-opt/{ => inline}/inline-trait-method.rs (100%) rename src/test/mir-opt/{ => inline}/inline-trait-method_2.rs (100%) create mode 100644 src/test/mir-opt/unreachable.rs create mode 100644 src/test/mir-opt/unreachable_asm.rs create mode 100644 src/test/mir-opt/unreachable_asm_2.rs create mode 100644 src/test/mir-opt/unreachable_diverging.rs create mode 100644 src/test/pretty/ast-stmt-expr-attr.rs create mode 100644 src/test/pretty/raw-address-of.rs create mode 100644 src/test/run-make-fulldeps/cdylib-dylib-linkage/Makefile create mode 100644 src/test/run-make-fulldeps/cdylib-dylib-linkage/bar.rs create mode 100644 src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.c create mode 100644 src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.rs create mode 100644 src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/Makefile create mode 100644 src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/bar.c create mode 100644 src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/foo.rs create mode 100644 src/test/run-make-fulldeps/issue64319/Makefile create mode 100644 src/test/run-make-fulldeps/issue64319/bar.rs create mode 100644 src/test/run-make-fulldeps/issue64319/foo.rs delete mode 100644 src/test/run-make-fulldeps/sanitizer-address/Makefile delete mode 100644 src/test/run-make-fulldeps/sanitizer-address/overflow.rs delete mode 100644 src/test/run-make-fulldeps/sanitizer-invalid-cratetype/Makefile delete mode 100644 src/test/run-make-fulldeps/sanitizer-invalid-cratetype/hello.rs delete mode 100644 src/test/run-make-fulldeps/sanitizer-invalid-target/Makefile delete mode 100644 src/test/run-make-fulldeps/sanitizer-invalid-target/hello.rs delete mode 100644 src/test/run-make-fulldeps/sanitizer-leak/Makefile delete mode 100644 src/test/run-make-fulldeps/sanitizer-leak/leak.rs delete mode 100644 src/test/run-make-fulldeps/sanitizer-memory/Makefile delete mode 100644 src/test/run-make-fulldeps/sanitizer-memory/uninit.rs create mode 100644 src/test/run-make-fulldeps/share-generics-dylib/Makefile create mode 100644 src/test/run-make-fulldeps/share-generics-dylib/instance_provider_a.rs create mode 100644 src/test/run-make-fulldeps/share-generics-dylib/instance_provider_b.rs create mode 100644 src/test/run-make-fulldeps/share-generics-dylib/instance_user_a_rlib.rs create mode 100644 src/test/run-make-fulldeps/share-generics-dylib/instance_user_b_rlib.rs create mode 100644 src/test/run-make-fulldeps/share-generics-dylib/instance_user_dylib.rs create mode 100644 src/test/run-make-fulldeps/share-generics-dylib/linked_leaf.rs create mode 100644 src/test/run-make/thumb-none-qemu/example/Cargo.lock create mode 100644 src/test/run-make/wasm-symbols-different-module/Makefile create mode 100644 src/test/run-make/wasm-symbols-different-module/bar.rs create mode 100644 src/test/run-make/wasm-symbols-different-module/baz.rs create mode 100644 src/test/run-make/wasm-symbols-different-module/foo.rs create mode 100644 src/test/run-make/wasm-symbols-different-module/log.rs create mode 100644 src/test/run-make/wasm-symbols-different-module/verify-imports.js create mode 100644 src/test/rustdoc-ui/test-compile-fail1.rs create mode 100644 src/test/rustdoc-ui/test-compile-fail1.stderr create mode 100644 src/test/rustdoc-ui/test-compile-fail2.rs create mode 100644 src/test/rustdoc-ui/test-compile-fail2.stderr create mode 100644 src/test/rustdoc-ui/test-compile-fail3.rs create mode 100644 src/test/rustdoc-ui/test-compile-fail3.stderr create mode 100644 src/test/rustdoc-ui/test-no_std.rs create mode 100644 src/test/rustdoc-ui/test-no_std.stdout create mode 100644 src/test/rustdoc/auto_aliases.rs create mode 100644 src/test/rustdoc/const-underscore.rs create mode 100644 src/test/rustdoc/deref-typedef.rs delete mode 100644 src/test/rustdoc/dont-show-const-contents.rs create mode 100644 src/test/rustdoc/playground-syntax-error.rs create mode 100644 src/test/rustdoc/remove-url-from-headings.rs create mode 100644 src/test/rustdoc/show-const-contents.rs delete mode 100644 src/test/ui-fulldeps/ast_stmt_expr_attr.rs delete mode 100644 src/test/ui-fulldeps/newtype_index.rs create mode 100644 src/test/ui/array-slice-vec/issue-69103-extra-binding-subslice.rs create mode 100644 src/test/ui/array-slice-vec/issue-69103-extra-binding-subslice.stderr rename src/test/ui/{match/match-vec-mismatch.rs => array-slice-vec/slice-pat-type-mismatches.rs} (96%) rename src/test/ui/{match/match-vec-mismatch.stderr => array-slice-vec/slice-pat-type-mismatches.stderr} (81%) rename src/test/ui/{parser/match-vec-invalid.rs => array-slice-vec/subslice-only-once-semantic-restriction.rs} (76%) create mode 100644 src/test/ui/array-slice-vec/subslice-only-once-semantic-restriction.stderr create mode 100644 src/test/ui/array-slice-vec/subslice-patterns-const-eval-match.rs create mode 100644 src/test/ui/array-slice-vec/subslice-patterns-const-eval.rs create mode 100644 src/test/ui/associated-types/issue-64848.rs create mode 100644 src/test/ui/associated-types/missing-associated-types.rs create mode 100644 src/test/ui/associated-types/missing-associated-types.stderr create mode 100644 src/test/ui/async-await/issues/issue-65436-raw-ptr-not-send.rs create mode 100644 src/test/ui/async-await/issues/issue-65436-raw-ptr-not-send.stderr delete mode 100644 src/test/ui/auxiliary/cdylib-dep.rs create mode 100644 src/test/ui/borrowck/borrow-raw-address-of-borrowed.rs create mode 100644 src/test/ui/borrowck/borrow-raw-address-of-borrowed.stderr create mode 100644 src/test/ui/borrowck/borrow-raw-address-of-deref-mutability-ok.rs create mode 100644 src/test/ui/borrowck/borrow-raw-address-of-deref-mutability.rs create mode 100644 src/test/ui/borrowck/borrow-raw-address-of-deref-mutability.stderr create mode 100644 src/test/ui/borrowck/borrow-raw-address-of-mutability-ok.rs create mode 100644 src/test/ui/borrowck/borrow-raw-address-of-mutability.rs create mode 100644 src/test/ui/borrowck/borrow-raw-address-of-mutability.stderr create mode 100644 src/test/ui/borrowck/borrowck-closures-slice-patterns-ok.rs create mode 100644 src/test/ui/borrowck/borrowck-closures-slice-patterns.rs create mode 100644 src/test/ui/borrowck/borrowck-closures-slice-patterns.stderr create mode 100644 src/test/ui/borrowck/borrowck-move-out-from-array-match.rs create mode 100644 src/test/ui/borrowck/borrowck-move-out-from-array-match.stderr create mode 100644 src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap-match.rs create mode 100644 src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap-match.stderr create mode 100644 src/test/ui/borrowck/borrowck-move-out-from-array-use-match.rs create mode 100644 src/test/ui/borrowck/borrowck-move-out-from-array-use-match.stderr create mode 100644 src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap-match.rs create mode 100644 src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap-match.stderr delete mode 100644 src/test/ui/cdylib-deps-must-be-static.rs delete mode 100644 src/test/ui/cdylib-deps-must-be-static.stderr create mode 100644 src/test/ui/closures/issue-68025.rs create mode 100644 src/test/ui/const-generics/array-size-in-generic-struct-param.rs create mode 100644 src/test/ui/const-generics/array-size-in-generic-struct-param.stderr create mode 100644 src/test/ui/const-generics/const-generic-type_name.rs create mode 100644 src/test/ui/const-generics/const-generic-type_name.stderr create mode 100644 src/test/ui/const-generics/const-param-elided-lifetime.rs create mode 100644 src/test/ui/const-generics/const-param-elided-lifetime.stderr create mode 100644 src/test/ui/const-generics/integer-literal-generic-arg-in-where-clause.rs create mode 100644 src/test/ui/const-generics/integer-literal-generic-arg-in-where-clause.stderr create mode 100644 src/test/ui/const-generics/issues/issue-61747.rs create mode 100644 src/test/ui/const-generics/issues/issue-61747.stderr create mode 100644 src/test/ui/const-generics/issues/issue-66205.rs create mode 100644 src/test/ui/consts/associated_const_generic.rs create mode 100644 src/test/ui/consts/const-address-of-interior-mut.rs create mode 100644 src/test/ui/consts/const-address-of-interior-mut.stderr create mode 100644 src/test/ui/consts/const-address-of-mut.rs create mode 100644 src/test/ui/consts/const-address-of-mut.stderr create mode 100644 src/test/ui/consts/const-address-of.rs create mode 100644 src/test/ui/consts/const-mut-refs/const_mut_address_of.rs create mode 100644 src/test/ui/consts/const-points-to-static.rs create mode 100644 src/test/ui/consts/const-points-to-static.stderr create mode 100644 src/test/ui/consts/const-prop-ice3.rs create mode 100644 src/test/ui/consts/const-prop-overflowing-casts.rs create mode 100644 src/test/ui/consts/const_prop_slice_pat_ice.rs create mode 100644 src/test/ui/consts/issue-67529.rs create mode 100644 src/test/ui/consts/issue-67640.rs create mode 100644 src/test/ui/consts/issue-67641.rs create mode 100644 src/test/ui/consts/issue-67696-const-prop-ice.rs create mode 100644 src/test/ui/consts/issue-67862.rs create mode 100644 src/test/ui/consts/issue-68264-overflow.rs create mode 100644 src/test/ui/consts/issue-68542-closure-in-array-len.rs create mode 100644 src/test/ui/consts/issue-68542-closure-in-array-len.stderr create mode 100644 src/test/ui/consts/issue-69191-ice-on-uninhabited-enum-field.rs create mode 100644 src/test/ui/consts/issue-69310-array-size-lit-wrong-ty.rs create mode 100644 src/test/ui/consts/issue-69310-array-size-lit-wrong-ty.stderr create mode 100644 src/test/ui/consts/min_const_fn/address_of.rs create mode 100644 src/test/ui/consts/min_const_fn/address_of.stderr create mode 100644 src/test/ui/consts/min_const_fn/address_of_const.rs create mode 100644 src/test/ui/consts/miri_unleashed/abi-mismatch.rs create mode 100644 src/test/ui/consts/miri_unleashed/abi-mismatch.stderr create mode 100644 src/test/ui/consts/miri_unleashed/const_refers_to_static.rs create mode 100644 src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr create mode 100644 src/test/ui/consts/miri_unleashed/drop.rs create mode 100644 src/test/ui/consts/miri_unleashed/drop.stderr create mode 100644 src/test/ui/consts/miri_unleashed/mutable_const2.rs create mode 100644 src/test/ui/consts/miri_unleashed/mutable_const2.stderr create mode 100644 src/test/ui/consts/raw_pointer_promoted.rs create mode 100644 src/test/ui/consts/recursive-zst-static.rs create mode 100644 src/test/ui/consts/trait_specialization.rs create mode 100644 src/test/ui/consts/transmute-size-mismatch-before-typeck.rs create mode 100644 src/test/ui/consts/transmute-size-mismatch-before-typeck.stderr create mode 100644 src/test/ui/deduplicate-diagnostics-2.deduplicate.stderr create mode 100644 src/test/ui/deduplicate-diagnostics-2.duplicate.stderr create mode 100644 src/test/ui/deduplicate-diagnostics-2.rs create mode 100644 src/test/ui/deduplicate-diagnostics.deduplicate.stderr create mode 100644 src/test/ui/deduplicate-diagnostics.duplicate.stderr create mode 100644 src/test/ui/deduplicate-diagnostics.rs create mode 100644 src/test/ui/destructuring-assignment/note-unsupported.rs create mode 100644 src/test/ui/destructuring-assignment/note-unsupported.stderr create mode 100644 src/test/ui/dropck/dropck_fn_type.rs create mode 100644 src/test/ui/dropck/dropck_traits.rs delete mode 100644 src/test/ui/error-codes/E0303.stderr create mode 100644 src/test/ui/error-codes/E0746.fixed create mode 100644 src/test/ui/error-codes/E0746.rs create mode 100644 src/test/ui/error-codes/E0746.stderr delete mode 100644 src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision.stderr delete mode 100644 src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision2.stderr delete mode 100644 src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision3.stderr rename src/test/ui/feature-gate/{unstable-attribute-allow-issue-none.rs => unstable-attribute-allow-issue-0.rs} (84%) rename src/test/ui/feature-gate/{unstable-attribute-allow-issue-none.stderr => unstable-attribute-allow-issue-0.stderr} (80%) delete mode 100644 src/test/ui/feature-gates/feature-gate-sanitizer-runtime.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-sanitizer-runtime.stderr delete mode 100644 src/test/ui/feature-gates/feature-gate-slice-patterns.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-slice-patterns.stderr delete mode 100644 src/test/ui/feature-gates/feature-gate-transparent_enums.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-transparent_enums.stderr rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/collections.rs (77%) create mode 100644 src/test/ui/generic-associated-types/collections.stderr create mode 100644 src/test/ui/generic-associated-types/construct_with_other_type.rs create mode 100644 src/test/ui/generic-associated-types/construct_with_other_type.stderr rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/empty_generics.rs (71%) create mode 100644 src/test/ui/generic-associated-types/empty_generics.stderr create mode 100644 src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature-2.rs create mode 100644 src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature-2.stderr rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/gat-dont-ice-on-absent-feature.rs (54%) create mode 100644 src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature.stderr rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/gat-incomplete-warning.rs (100%) rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/gat-incomplete-warning.stderr (100%) rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/generic-associated-types-where.rs (52%) create mode 100644 src/test/ui/generic-associated-types/generic-associated-types-where.stderr create mode 100644 src/test/ui/generic-associated-types/generic_associated_type_undeclared_lifetimes.rs create mode 100644 src/test/ui/generic-associated-types/generic_associated_type_undeclared_lifetimes.stderr create mode 100644 src/test/ui/generic-associated-types/impl_bounds.rs create mode 100644 src/test/ui/generic-associated-types/impl_bounds.stderr create mode 100644 src/test/ui/generic-associated-types/impl_bounds_ok.rs create mode 100644 src/test/ui/generic-associated-types/issue-47206-where-clause.rs create mode 100644 src/test/ui/generic-associated-types/issue-47206-where-clause.stderr create mode 100644 src/test/ui/generic-associated-types/issue-58694-parameter-out-of-range.rs create mode 100644 src/test/ui/generic-associated-types/issue-62326-parameter-out-of-range.rs create mode 100644 src/test/ui/generic-associated-types/issue-62326-parameter-out-of-range.stderr create mode 100644 src/test/ui/generic-associated-types/issue-67424.rs create mode 100644 src/test/ui/generic-associated-types/issue-67424.stderr create mode 100644 src/test/ui/generic-associated-types/iterable.rs create mode 100644 src/test/ui/generic-associated-types/iterable.stderr create mode 100644 src/test/ui/generic-associated-types/parameter_number_and_kind.rs create mode 100644 src/test/ui/generic-associated-types/parameter_number_and_kind.stderr create mode 100644 src/test/ui/generic-associated-types/parameter_number_and_kind_impl.rs create mode 100644 src/test/ui/generic-associated-types/parameter_number_and_kind_impl.stderr rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/parse/in-trait-impl.rs (77%) rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/parse/in-trait.rs (92%) rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/pointer_family.rs (58%) create mode 100644 src/test/ui/generic-associated-types/pointer_family.stderr rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/shadowing.rs (65%) rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/shadowing.stderr (51%) rename src/test/ui/{rfc1598-generic-associated-types => generic-associated-types}/streaming_iterator.rs (53%) rename src/test/ui/{exclusive-range => half-open-range-patterns}/exclusive_range_pattern_syntax_collision.rs (59%) create mode 100644 src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.stderr rename src/test/ui/{exclusive-range => half-open-range-patterns}/exclusive_range_pattern_syntax_collision2.rs (58%) create mode 100644 src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.stderr rename src/test/ui/{exclusive-range => half-open-range-patterns}/exclusive_range_pattern_syntax_collision3.rs (74%) create mode 100644 src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.stderr create mode 100644 src/test/ui/half-open-range-patterns/feature-gate-half-open-range-patterns.rs create mode 100644 src/test/ui/half-open-range-patterns/feature-gate-half-open-range-patterns.stderr create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-bad-types.rs create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-bad-types.stderr create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.rs create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-pass.rs create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-hair-lower-empty.rs create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-hair-lower-empty.stderr create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-dotdotdot-bad-syntax.rs create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-dotdotdot-bad-syntax.stderr create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-no-end.rs create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-no-end.stderr create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-ref-ambiguous-interp.rs create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-ref-ambiguous-interp.stderr create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-semantics.rs create mode 100644 src/test/ui/half-open-range-patterns/half-open-range-pats-syntactic-pass.rs create mode 100644 src/test/ui/half-open-range-patterns/pat-tuple-4.rs create mode 100644 src/test/ui/half-open-range-patterns/pat-tuple-5.rs create mode 100644 src/test/ui/half-open-range-patterns/pat-tuple-5.stderr create mode 100644 src/test/ui/impl-trait/does-not-live-long-enough.rs create mode 100644 src/test/ui/impl-trait/does-not-live-long-enough.stderr create mode 100644 src/test/ui/impl-trait/dyn-trait-return-should-be-impl-trait.rs create mode 100644 src/test/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr create mode 100644 src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.rs create mode 100644 src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.stderr create mode 100644 src/test/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.rs create mode 100644 src/test/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.stderr create mode 100644 src/test/ui/internal/internal-unstable-const.rs create mode 100644 src/test/ui/internal/internal-unstable-const.stderr delete mode 100644 src/test/ui/invalid/invalid-variadic-function.rs delete mode 100644 src/test/ui/invalid/invalid-variadic-function.stderr delete mode 100644 src/test/ui/invalid_const_promotion.rs delete mode 100644 src/test/ui/issues/issue-38591.rs delete mode 100644 src/test/ui/issues/issue-39720.stderr delete mode 100644 src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_ok.rs delete mode 100644 src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_ok.stderr delete mode 100644 src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_ok.rs delete mode 100644 src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_ok.stderr create mode 100644 src/test/ui/issues/issue-51770.rs create mode 100644 src/test/ui/issues/issue-66308.rs create mode 100644 src/test/ui/issues/issue-66473.rs create mode 100644 src/test/ui/issues/issue-66473.stderr create mode 100644 src/test/ui/issues/issue-66923-show-error-for-correct-call.rs create mode 100644 src/test/ui/issues/issue-66923-show-error-for-correct-call.stderr create mode 100644 src/test/ui/issues/issue-68103.rs create mode 100644 src/test/ui/issues/issue-69396-const-no-type-in-macro.rs create mode 100644 src/test/ui/issues/issue-69396-const-no-type-in-macro.stderr create mode 100644 src/test/ui/iterators/skip-count-overflow.rs create mode 100644 src/test/ui/lint/issue-66362-no-snake-case-warning-for-field-puns.rs create mode 100644 src/test/ui/lint/issue-66362-no-snake-case-warning-for-field-puns.stderr create mode 100644 src/test/ui/lint/lint-shorthand-field.fixed create mode 100644 src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.rs create mode 100644 src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.stderr create mode 100644 src/test/ui/macros/issue-68058.rs create mode 100644 src/test/ui/malformed/issue-69341-malformed-derive-inert.rs create mode 100644 src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr create mode 100644 src/test/ui/marker_trait_attr/issue-61651-type-mismatch.rs create mode 100644 src/test/ui/mir/issue-67639-normalization-ice.rs create mode 100644 src/test/ui/mir/issue-67710-inline-projection.rs create mode 100644 src/test/ui/mir/issue-67947.rs create mode 100644 src/test/ui/mir/issue-67947.stderr create mode 100644 src/test/ui/moves/move-out-of-array-ref.rs create mode 100644 src/test/ui/moves/move-out-of-array-ref.stderr create mode 100644 src/test/ui/moves/move-out-of-slice-2.rs create mode 100644 src/test/ui/moves/move-out-of-slice-2.stderr create mode 100644 src/test/ui/non-ice-error-on-worker-io-fail.rs create mode 100644 src/test/ui/non-ice-error-on-worker-io-fail.stderr create mode 100644 src/test/ui/or-patterns/feature-gate-const-fn.rs create mode 100644 src/test/ui/or-patterns/feature-gate-const-fn.stderr create mode 100644 src/test/ui/packed/packed-struct-address-of-element.rs create mode 100644 src/test/ui/parser/attr-stmt-expr-attr-bad.rs create mode 100644 src/test/ui/parser/attr-stmt-expr-attr-bad.stderr create mode 100644 src/test/ui/parser/chained-comparison-suggestion.rs create mode 100644 src/test/ui/parser/chained-comparison-suggestion.stderr create mode 100644 src/test/ui/parser/impl-item-const-pass.rs create mode 100644 src/test/ui/parser/impl-item-const-semantic-fail.rs create mode 100644 src/test/ui/parser/impl-item-const-semantic-fail.stderr create mode 100644 src/test/ui/parser/impl-item-fn-no-body-pass.rs create mode 100644 src/test/ui/parser/impl-item-fn-no-body-semantic-fail.rs create mode 100644 src/test/ui/parser/impl-item-fn-no-body-semantic-fail.stderr create mode 100644 src/test/ui/parser/impl-item-type-no-body-pass.rs create mode 100644 src/test/ui/parser/impl-item-type-no-body-semantic-fail.rs create mode 100644 src/test/ui/parser/impl-item-type-no-body-semantic-fail.stderr create mode 100644 src/test/ui/parser/issue-65257-invalid-var-decl-recovery.rs create mode 100644 src/test/ui/parser/issue-65257-invalid-var-decl-recovery.stderr create mode 100644 src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.rs create mode 100644 src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.stderr delete mode 100644 src/test/ui/parser/match-vec-invalid.stderr delete mode 100644 src/test/ui/parser/pat-tuple-4.rs delete mode 100644 src/test/ui/parser/pat-tuple-4.stderr delete mode 100644 src/test/ui/parser/pat-tuple-5.rs delete mode 100644 src/test/ui/parser/pat-tuple-5.stderr create mode 100644 src/test/ui/parser/recover-labeled-non-block-expr.rs create mode 100644 src/test/ui/parser/recover-labeled-non-block-expr.stderr create mode 100644 src/test/ui/parser/recovery-attr-on-if.rs create mode 100644 src/test/ui/parser/recovery-attr-on-if.stderr create mode 100644 src/test/ui/parser/stmt_expr_attrs_placement.rs create mode 100644 src/test/ui/parser/stmt_expr_attrs_placement.stderr create mode 100644 src/test/ui/parser/trait-item-with-defaultness-fail-semantic.rs create mode 100644 src/test/ui/parser/trait-item-with-defaultness-fail-semantic.stderr create mode 100644 src/test/ui/parser/trait-item-with-defaultness-pass.rs delete mode 100644 src/test/ui/parser/variadic-ffi-3.rs delete mode 100644 src/test/ui/parser/variadic-ffi-3.stderr delete mode 100644 src/test/ui/parser/variadic-ffi-4.rs delete mode 100644 src/test/ui/parser/variadic-ffi-4.stderr create mode 100644 src/test/ui/parser/variadic-ffi-nested-syntactic-fail.rs create mode 100644 src/test/ui/parser/variadic-ffi-nested-syntactic-fail.stderr create mode 100644 src/test/ui/parser/variadic-ffi-semantic-restrictions.rs create mode 100644 src/test/ui/parser/variadic-ffi-semantic-restrictions.stderr create mode 100644 src/test/ui/parser/variadic-ffi-syntactic-pass.rs create mode 100644 src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.rs create mode 100644 src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/bind-by-move-no-subbindings-fun-param.rs create mode 100644 src/test/ui/pattern/bindings-after-at/bind-by-move-no-subbindings-fun-param.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-move-and-move.rs create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-move-and-move.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box-pass.rs create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box.rs create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-by-copy-bindings-in-at.rs rename src/test/ui/{error-codes/E0303.rs => pattern/bindings-after-at/borrowck-pat-by-move-and-ref.rs} (51%) create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-both-sides.rs create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-and-ref.rs create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-and-ref.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-twice.rs create mode 100644 src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-twice.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/copy-and-move-mixed.rs create mode 100644 src/test/ui/pattern/bindings-after-at/copy-and-move-mixed.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs create mode 100644 src/test/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/feature-gate-bindings_after_at.rs create mode 100644 src/test/ui/pattern/bindings-after-at/feature-gate-bindings_after_at.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/nested-patterns.rs create mode 100644 src/test/ui/pattern/bindings-after-at/nested-type-ascription-syntactically-invalid.rs create mode 100644 src/test/ui/pattern/bindings-after-at/nested-type-ascription-syntactically-invalid.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/pat-at-same-name-both.rs create mode 100644 src/test/ui/pattern/bindings-after-at/pat-at-same-name-both.stderr create mode 100644 src/test/ui/pattern/bindings-after-at/wild-before-at-syntactically-rejected.rs create mode 100644 src/test/ui/pattern/bindings-after-at/wild-before-at-syntactically-rejected.stderr create mode 100644 src/test/ui/pattern/issue-66270-pat-struct-parser-recovery.rs create mode 100644 src/test/ui/pattern/issue-66270-pat-struct-parser-recovery.stderr create mode 100644 src/test/ui/pattern/issue-67776-match-same-name-enum-variant-refs.rs create mode 100644 src/test/ui/pattern/issue-67776-match-same-name-enum-variant-refs.stderr create mode 100644 src/test/ui/pattern/issue-68393-let-pat-assoc-constant.rs create mode 100644 src/test/ui/pattern/issue-68393-let-pat-assoc-constant.stderr create mode 100644 src/test/ui/pattern/issue-68394-let-pat-runtime-value.rs create mode 100644 src/test/ui/pattern/issue-68394-let-pat-runtime-value.stderr create mode 100644 src/test/ui/pattern/issue-68396-let-float-bug.rs create mode 100644 src/test/ui/pattern/issue-68396-let-float-bug.stderr create mode 100644 src/test/ui/pattern/pat-struct-field-expr-has-type.rs create mode 100644 src/test/ui/pattern/pat-struct-field-expr-has-type.stderr create mode 100644 src/test/ui/pattern/pat-type-err-formal-param.rs create mode 100644 src/test/ui/pattern/pat-type-err-formal-param.stderr create mode 100644 src/test/ui/pattern/pat-type-err-let-stmt.rs create mode 100644 src/test/ui/pattern/pat-type-err-let-stmt.stderr delete mode 100644 src/test/ui/pattern/pattern-bindings-after-at.rs delete mode 100644 src/test/ui/pattern/pattern-bindings-after-at.stderr rename src/test/ui/pattern/{ => usefulness}/issue-53820-slice-pattern-large-array.rs (65%) rename src/test/ui/pattern/usefulness/{65413-constants-and-slices-exhaustiveness.rs => issue-65413-constants-and-slices-exhaustiveness.rs} (89%) delete mode 100644 src/test/ui/proc-macro/attributes-on-modules.stderr delete mode 100644 src/test/ui/raw-ref-op/raw-ref-op.stderr delete mode 100644 src/test/ui/raw-ref-op/raw-ref-temp-deref.stderr delete mode 100644 src/test/ui/raw-ref-op/unusual_locations.stderr rename src/test/ui/{issues/issue-26548.rs => recursion/issue-26548-recursion-via-normalize.rs} (95%) rename src/test/ui/{issues/issue-26548.stderr => recursion/issue-26548-recursion-via-normalize.stderr} (88%) create mode 100644 src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.rs create mode 100644 src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr create mode 100644 src/test/ui/rfc-2091-track-caller/diverging-caller-location.rs create mode 100644 src/test/ui/rfc-2091-track-caller/std-panic-locations.rs create mode 100644 src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs create mode 100644 src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs create mode 100644 src/test/ui/rfc-2457/idents-normalized.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.gated.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.stock.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-impl-trait.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-impl-trait.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-bounds.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-bounds.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-object.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-object.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/opt-out-twice.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/opt-out-twice.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/syntax.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/with-maybe-sized.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/with-maybe-sized.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/without-question-mark.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/without-question-mark.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/feature-gate.gated.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/feature-gate.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/feature-gate.stock.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/impl-opt-out-trait.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/impl-opt-out-trait.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/inherent-impl.rs create mode 100644 src/test/ui/rfc-2632-const-trait-impl/inherent-impl.stderr create mode 100644 src/test/ui/rfc-2632-const-trait-impl/syntax.rs delete mode 100644 src/test/ui/rfc1598-generic-associated-types/collections.stderr delete mode 100644 src/test/ui/rfc1598-generic-associated-types/construct_with_other_type.rs delete mode 100644 src/test/ui/rfc1598-generic-associated-types/construct_with_other_type.stderr delete mode 100644 src/test/ui/rfc1598-generic-associated-types/empty_generics.stderr delete mode 100644 src/test/ui/rfc1598-generic-associated-types/gat-dont-ice-on-absent-feature.stderr delete mode 100644 src/test/ui/rfc1598-generic-associated-types/generic-associated-types-where.stderr delete mode 100644 src/test/ui/rfc1598-generic-associated-types/generic_associated_type_undeclared_lifetimes.rs delete mode 100644 src/test/ui/rfc1598-generic-associated-types/generic_associated_type_undeclared_lifetimes.stderr delete mode 100644 src/test/ui/rfc1598-generic-associated-types/iterable.rs delete mode 100644 src/test/ui/rfc1598-generic-associated-types/iterable.stderr delete mode 100644 src/test/ui/rfc1598-generic-associated-types/parameter_number_and_kind.rs delete mode 100644 src/test/ui/rfc1598-generic-associated-types/parameter_number_and_kind.stderr delete mode 100644 src/test/ui/rfc1598-generic-associated-types/pointer_family.stderr delete mode 100644 src/test/ui/rfc1598-generic-associated-types/streaming_iterator.stderr delete mode 100644 src/test/ui/rfcs/rfc1717/auxiliary/clibrary.rs create mode 100644 src/test/ui/sanitizer-address.rs create mode 100644 src/test/ui/sanitizer-leak.rs create mode 100644 src/test/ui/sanitizer-memory.rs create mode 100644 src/test/ui/sanitizer-unsupported-target.rs create mode 100644 src/test/ui/sanitizer-unsupported-target.stderr create mode 100644 src/test/ui/self/suggest-self-2.rs create mode 100644 src/test/ui/self/suggest-self-2.stderr create mode 100644 src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs create mode 100644 src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs create mode 100644 src/test/ui/suggestions/for-i-in-vec.fixed create mode 100644 src/test/ui/suggestions/for-i-in-vec.rs create mode 100644 src/test/ui/suggestions/for-i-in-vec.stderr create mode 100644 src/test/ui/suggestions/issue-66968-suggest-sorted-words.rs create mode 100644 src/test/ui/suggestions/issue-66968-suggest-sorted-words.stderr create mode 100644 src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.rs create mode 100644 src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs create mode 100644 src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs create mode 100644 src/test/ui/type-alias-impl-trait/issue-65918.rs create mode 100644 src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.rs create mode 100644 src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.stderr create mode 100644 src/test/ui/type/issue-67690-type-alias-bound-diagnostic-crash.rs create mode 100644 src/test/ui/type/issue-67690-type-alias-bound-diagnostic-crash.stderr create mode 100644 src/test/ui/typeck/issue-69378-ice-on-invalid-type-node-after-recovery.rs create mode 100644 src/test/ui/typeck/issue-69378-ice-on-invalid-type-node-after-recovery.stderr delete mode 100644 src/test/ui/typeck/typeck_type_placeholder_item.rs delete mode 100644 src/test/ui/typeck/typeck_type_placeholder_item.stderr create mode 100644 src/test/ui/use/auxiliary/extern-use-primitive-type-lib.rs create mode 100644 src/test/ui/use/issue-60976-extern-use-primitive-type.rs create mode 100644 src/tools/unicode-table-generator/Cargo.toml create mode 100644 src/tools/unicode-table-generator/src/case_mapping.rs create mode 100644 src/tools/unicode-table-generator/src/main.rs create mode 100644 src/tools/unicode-table-generator/src/raw_emitter.rs create mode 100644 src/tools/unicode-table-generator/src/unicode_download.rs create mode 100644 vendor/anyhow/.cargo-checksum.json create mode 100644 vendor/anyhow/Cargo.toml rename vendor/{fixedbitset => anyhow}/LICENSE-APACHE (100%) rename vendor/{wasi-0.7.0 => anyhow}/LICENSE-MIT (100%) create mode 100644 vendor/anyhow/README.md create mode 100644 vendor/anyhow/build.rs create mode 100644 vendor/anyhow/src/backtrace.rs create mode 100644 vendor/anyhow/src/chain.rs create mode 100644 vendor/anyhow/src/context.rs create mode 100644 vendor/anyhow/src/error.rs create mode 100644 vendor/anyhow/src/fmt.rs create mode 100644 vendor/anyhow/src/kind.rs create mode 100644 vendor/anyhow/src/lib.rs create mode 100644 vendor/anyhow/src/macros.rs create mode 100644 vendor/anyhow/src/wrapper.rs create mode 100644 vendor/anyhow/tests/common/mod.rs create mode 100644 vendor/anyhow/tests/compiletest.rs create mode 100644 vendor/anyhow/tests/drop/mod.rs create mode 100644 vendor/anyhow/tests/test_autotrait.rs create mode 100644 vendor/anyhow/tests/test_backtrace.rs create mode 100644 vendor/anyhow/tests/test_boxed.rs create mode 100644 vendor/anyhow/tests/test_chain.rs create mode 100644 vendor/anyhow/tests/test_context.rs create mode 100644 vendor/anyhow/tests/test_convert.rs create mode 100644 vendor/anyhow/tests/test_downcast.rs create mode 100644 vendor/anyhow/tests/test_fmt.rs create mode 100644 vendor/anyhow/tests/test_macros.rs create mode 100644 vendor/anyhow/tests/test_repr.rs create mode 100644 vendor/anyhow/tests/test_source.rs create mode 100644 vendor/anyhow/tests/ui/no-impl.rs create mode 100644 vendor/anyhow/tests/ui/no-impl.stderr create mode 100644 vendor/autocfg/tests/rustflags.rs create mode 100644 vendor/bstr/.cargo-checksum.json create mode 100644 vendor/bstr/COPYING create mode 100644 vendor/bstr/Cargo.toml rename vendor/{idna-0.1.5 => bstr}/LICENSE-APACHE (100%) create mode 100644 vendor/bstr/LICENSE-MIT create mode 100644 vendor/bstr/README.md create mode 100644 vendor/bstr/examples/graphemes-std.rs create mode 100644 vendor/bstr/examples/graphemes.rs create mode 100644 vendor/bstr/examples/lines-std.rs create mode 100644 vendor/bstr/examples/lines.rs create mode 100644 vendor/bstr/examples/uppercase-std.rs create mode 100644 vendor/bstr/examples/uppercase.rs create mode 100644 vendor/bstr/examples/words-std.rs create mode 100644 vendor/bstr/examples/words.rs create mode 100644 vendor/bstr/rustfmt.toml create mode 100755 vendor/bstr/scripts/generate-unicode-data create mode 100644 vendor/bstr/scripts/regex/grapheme.sh create mode 100644 vendor/bstr/scripts/regex/sentence.sh create mode 100644 vendor/bstr/scripts/regex/word.sh create mode 100644 vendor/bstr/src/ascii.rs create mode 100644 vendor/bstr/src/bstr.rs create mode 100644 vendor/bstr/src/bstring.rs create mode 100644 vendor/bstr/src/cow.rs create mode 100644 vendor/bstr/src/freqs.rs create mode 100644 vendor/bstr/src/impls.rs create mode 100644 vendor/bstr/src/io.rs create mode 100644 vendor/bstr/src/lib.rs create mode 100644 vendor/bstr/src/search/byte_frequencies.rs create mode 100644 vendor/bstr/src/search/mod.rs create mode 100644 vendor/bstr/src/search/prefilter.rs create mode 100644 vendor/bstr/src/search/tests.rs create mode 100644 vendor/bstr/src/search/twoway.rs create mode 100644 vendor/bstr/src/slice_index.rs create mode 100644 vendor/bstr/src/tests.rs create mode 100644 vendor/bstr/src/unicode/data/GraphemeBreakTest.txt create mode 100644 vendor/bstr/src/unicode/data/SentenceBreakTest.txt create mode 100644 vendor/bstr/src/unicode/data/WordBreakTest.txt create mode 100644 vendor/bstr/src/unicode/fsm/grapheme_break_fwd.bigendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/grapheme_break_fwd.littleendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/grapheme_break_fwd.rs create mode 100644 vendor/bstr/src/unicode/fsm/grapheme_break_rev.bigendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/grapheme_break_rev.littleendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/grapheme_break_rev.rs create mode 100644 vendor/bstr/src/unicode/fsm/mod.rs create mode 100644 vendor/bstr/src/unicode/fsm/regional_indicator_rev.bigendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/regional_indicator_rev.littleendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/regional_indicator_rev.rs create mode 100644 vendor/bstr/src/unicode/fsm/sentence_break_fwd.bigendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/sentence_break_fwd.littleendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/sentence_break_fwd.rs create mode 100644 vendor/bstr/src/unicode/fsm/simple_word_fwd.bigendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/simple_word_fwd.littleendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/simple_word_fwd.rs create mode 100644 vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.bigendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.littleendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.rs create mode 100644 vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.bigendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.littleendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.rs create mode 100644 vendor/bstr/src/unicode/fsm/word_break_fwd.bigendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/word_break_fwd.littleendian.dfa create mode 100644 vendor/bstr/src/unicode/fsm/word_break_fwd.rs create mode 100644 vendor/bstr/src/unicode/grapheme.rs create mode 100644 vendor/bstr/src/unicode/mod.rs create mode 100644 vendor/bstr/src/unicode/sentence.rs create mode 100644 vendor/bstr/src/unicode/whitespace.rs create mode 100644 vendor/bstr/src/unicode/word.rs create mode 100644 vendor/bstr/src/utf8.rs delete mode 100644 vendor/c2-chacha/benches/machine.rs create mode 100644 vendor/crossbeam-channel/.cargo-checksum.json create mode 100644 vendor/crossbeam-channel/CHANGELOG.md create mode 100644 vendor/crossbeam-channel/Cargo.toml rename vendor/{itertools-0.7.8 => crossbeam-channel}/LICENSE-APACHE (100%) rename vendor/{itertools-0.7.8 => crossbeam-channel}/LICENSE-MIT (98%) create mode 100644 vendor/crossbeam-channel/LICENSE-THIRD-PARTY create mode 100644 vendor/crossbeam-channel/README.md create mode 100644 vendor/crossbeam-channel/examples/fibonacci.rs create mode 100644 vendor/crossbeam-channel/examples/matching.rs create mode 100644 vendor/crossbeam-channel/examples/stopwatch.rs create mode 100644 vendor/crossbeam-channel/src/channel.rs create mode 100644 vendor/crossbeam-channel/src/context.rs create mode 100644 vendor/crossbeam-channel/src/counter.rs create mode 100644 vendor/crossbeam-channel/src/err.rs create mode 100644 vendor/crossbeam-channel/src/flavors/after.rs create mode 100644 vendor/crossbeam-channel/src/flavors/array.rs create mode 100644 vendor/crossbeam-channel/src/flavors/list.rs create mode 100644 vendor/crossbeam-channel/src/flavors/mod.rs create mode 100644 vendor/crossbeam-channel/src/flavors/never.rs create mode 100644 vendor/crossbeam-channel/src/flavors/tick.rs create mode 100644 vendor/crossbeam-channel/src/flavors/zero.rs create mode 100644 vendor/crossbeam-channel/src/lib.rs create mode 100644 vendor/crossbeam-channel/src/select.rs create mode 100644 vendor/crossbeam-channel/src/select_macro.rs create mode 100644 vendor/crossbeam-channel/src/utils.rs create mode 100644 vendor/crossbeam-channel/src/waker.rs create mode 100644 vendor/crossbeam-channel/tests/after.rs create mode 100644 vendor/crossbeam-channel/tests/array.rs create mode 100644 vendor/crossbeam-channel/tests/golang.rs create mode 100644 vendor/crossbeam-channel/tests/iter.rs create mode 100644 vendor/crossbeam-channel/tests/list.rs create mode 100644 vendor/crossbeam-channel/tests/mpsc.rs create mode 100644 vendor/crossbeam-channel/tests/never.rs create mode 100644 vendor/crossbeam-channel/tests/ready.rs create mode 100644 vendor/crossbeam-channel/tests/select.rs create mode 100644 vendor/crossbeam-channel/tests/select_macro.rs create mode 100644 vendor/crossbeam-channel/tests/thread_locals.rs create mode 100644 vendor/crossbeam-channel/tests/tick.rs create mode 100644 vendor/crossbeam-channel/tests/zero.rs delete mode 100644 vendor/fixedbitset/.cargo-checksum.json delete mode 100644 vendor/fixedbitset/Cargo.toml delete mode 100644 vendor/fixedbitset/LICENSE-MIT delete mode 100644 vendor/fixedbitset/README.rst delete mode 100644 vendor/fixedbitset/benches/benches.rs delete mode 100644 vendor/fixedbitset/src/lib.rs delete mode 100644 vendor/fixedbitset/src/range.rs rename vendor/getrandom/src/{freebsd.rs => bsd_arandom.rs} (57%) create mode 100644 vendor/getrandom/src/vxworks.rs rename vendor/getrandom/tests/{mod.rs => common.rs} (80%) create mode 100644 vendor/globset/.cargo-checksum.json create mode 100644 vendor/globset/COPYING create mode 100644 vendor/globset/Cargo.toml create mode 100644 vendor/globset/LICENSE-MIT create mode 100644 vendor/globset/README.md create mode 100644 vendor/globset/UNLICENSE create mode 100644 vendor/globset/benches/bench.rs create mode 100644 vendor/globset/src/glob.rs create mode 100644 vendor/globset/src/lib.rs create mode 100644 vendor/globset/src/pathutil.rs rename vendor/{humantime => humantime-1.3.0}/.cargo-checksum.json (100%) rename vendor/{humantime => humantime-1.3.0}/Cargo.toml (100%) rename vendor/{humantime => humantime-1.3.0}/LICENSE-APACHE (100%) rename vendor/{humantime => humantime-1.3.0}/LICENSE-MIT (100%) rename vendor/{humantime => humantime-1.3.0}/README.md (100%) rename vendor/{humantime => humantime-1.3.0}/benches/datetime_format.rs (100%) rename vendor/{humantime => humantime-1.3.0}/benches/datetime_parse.rs (100%) rename vendor/{humantime => humantime-1.3.0}/bulk.yaml (100%) rename vendor/{humantime => humantime-1.3.0}/src/date.rs (100%) rename vendor/{humantime => humantime-1.3.0}/src/duration.rs (100%) rename vendor/{humantime => humantime-1.3.0}/src/lib.rs (100%) rename vendor/{humantime => humantime-1.3.0}/src/wrapper.rs (100%) rename vendor/{humantime => humantime-1.3.0}/vagga.yaml (100%) delete mode 100644 vendor/idna-0.1.5/.cargo-checksum.json delete mode 100644 vendor/idna-0.1.5/Cargo.toml delete mode 100644 vendor/idna-0.1.5/LICENSE-MIT delete mode 100644 vendor/idna-0.1.5/src/IdnaMappingTable.txt delete mode 100644 vendor/idna-0.1.5/src/lib.rs delete mode 100644 vendor/idna-0.1.5/src/make_uts46_mapping_table.py delete mode 100644 vendor/idna-0.1.5/src/punycode.rs delete mode 100644 vendor/idna-0.1.5/src/uts46.rs delete mode 100644 vendor/idna-0.1.5/src/uts46_mapping_table.rs delete mode 100644 vendor/idna-0.1.5/tests/IdnaTest.txt delete mode 100644 vendor/idna-0.1.5/tests/punycode.rs delete mode 100644 vendor/idna-0.1.5/tests/punycode_tests.json delete mode 100644 vendor/idna-0.1.5/tests/tests.rs delete mode 100644 vendor/idna-0.1.5/tests/unit.rs delete mode 100644 vendor/idna-0.1.5/tests/uts46.rs create mode 100644 vendor/ignore/.cargo-checksum.json create mode 100644 vendor/ignore/COPYING create mode 100644 vendor/ignore/Cargo.lock create mode 100644 vendor/ignore/Cargo.toml create mode 100644 vendor/ignore/LICENSE-MIT create mode 100644 vendor/ignore/README.md create mode 100644 vendor/ignore/UNLICENSE create mode 100644 vendor/ignore/examples/walk.rs create mode 100644 vendor/ignore/src/dir.rs create mode 100644 vendor/ignore/src/gitignore.rs create mode 100644 vendor/ignore/src/lib.rs create mode 100644 vendor/ignore/src/overrides.rs create mode 100644 vendor/ignore/src/pathutil.rs create mode 100644 vendor/ignore/src/types.rs create mode 100644 vendor/ignore/src/walk.rs create mode 100644 vendor/ignore/tests/gitignore_matched_path_or_any_parents_tests.gitignore create mode 100644 vendor/ignore/tests/gitignore_matched_path_or_any_parents_tests.rs delete mode 100644 vendor/itertools-0.7.8/.cargo-checksum.json delete mode 100644 vendor/itertools-0.7.8/Cargo.toml delete mode 100644 vendor/itertools-0.7.8/Makefile delete mode 100644 vendor/itertools-0.7.8/README.rst delete mode 100644 vendor/itertools-0.7.8/benches/bench1.rs delete mode 100644 vendor/itertools-0.7.8/benches/extra/mod.rs delete mode 100644 vendor/itertools-0.7.8/benches/extra/zipslices.rs delete mode 100644 vendor/itertools-0.7.8/benches/tree_fold1.rs delete mode 100644 vendor/itertools-0.7.8/benches/tuple_combinations.rs delete mode 100644 vendor/itertools-0.7.8/benches/tuples.rs delete mode 100644 vendor/itertools-0.7.8/bors.toml delete mode 100644 vendor/itertools-0.7.8/custom.css delete mode 100644 vendor/itertools-0.7.8/examples/iris.data delete mode 100644 vendor/itertools-0.7.8/examples/iris.rs delete mode 100644 vendor/itertools-0.7.8/src/adaptors/mod.rs delete mode 100644 vendor/itertools-0.7.8/src/adaptors/multi_product.rs delete mode 100644 vendor/itertools-0.7.8/src/combinations.rs delete mode 100644 vendor/itertools-0.7.8/src/concat_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/cons_tuples_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/diff.rs delete mode 100644 vendor/itertools-0.7.8/src/either_or_both.rs delete mode 100644 vendor/itertools-0.7.8/src/format.rs delete mode 100644 vendor/itertools-0.7.8/src/free.rs delete mode 100644 vendor/itertools-0.7.8/src/group_map.rs delete mode 100644 vendor/itertools-0.7.8/src/groupbylazy.rs delete mode 100644 vendor/itertools-0.7.8/src/impl_macros.rs delete mode 100644 vendor/itertools-0.7.8/src/intersperse.rs delete mode 100644 vendor/itertools-0.7.8/src/kmerge_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/lib.rs delete mode 100644 vendor/itertools-0.7.8/src/merge_join.rs delete mode 100644 vendor/itertools-0.7.8/src/minmax.rs delete mode 100644 vendor/itertools-0.7.8/src/multipeek_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/pad_tail.rs delete mode 100644 vendor/itertools-0.7.8/src/peeking_take_while.rs delete mode 100644 vendor/itertools-0.7.8/src/process_results_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/put_back_n_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/rciter_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/repeatn.rs delete mode 100644 vendor/itertools-0.7.8/src/size_hint.rs delete mode 100644 vendor/itertools-0.7.8/src/sources.rs delete mode 100644 vendor/itertools-0.7.8/src/tee.rs delete mode 100644 vendor/itertools-0.7.8/src/tuple_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/unique_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/with_position.rs delete mode 100644 vendor/itertools-0.7.8/src/zip_eq_impl.rs delete mode 100644 vendor/itertools-0.7.8/src/zip_longest.rs delete mode 100644 vendor/itertools-0.7.8/src/ziptuple.rs delete mode 100644 vendor/itertools-0.7.8/tests/merge_join.rs delete mode 100644 vendor/itertools-0.7.8/tests/peeking_take_while.rs delete mode 100644 vendor/itertools-0.7.8/tests/quick.rs delete mode 100644 vendor/itertools-0.7.8/tests/test_core.rs delete mode 100644 vendor/itertools-0.7.8/tests/test_std.rs delete mode 100644 vendor/itertools-0.7.8/tests/tuples.rs delete mode 100644 vendor/itertools-0.7.8/tests/zip.rs create mode 100644 vendor/jobserver/src/unix.rs create mode 100644 vendor/jobserver/src/wasm.rs create mode 100644 vendor/jobserver/src/windows.rs create mode 100644 vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/align.rs create mode 100644 vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs create mode 100644 vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs create mode 100644 vendor/libc/tests/const_fn.rs delete mode 100644 vendor/lock_api-0.1.3/.cargo-checksum.json delete mode 100644 vendor/lock_api-0.1.3/Cargo.toml delete mode 100644 vendor/lock_api-0.1.3/src/lib.rs delete mode 100644 vendor/lock_api-0.1.3/src/mutex.rs delete mode 100644 vendor/lock_api-0.1.3/src/remutex.rs delete mode 100644 vendor/lock_api-0.1.3/src/rwlock.rs create mode 100644 vendor/measureme/src/event_id.rs delete mode 100644 vendor/ordermap/.cargo-checksum.json delete mode 100644 vendor/ordermap/Cargo.toml delete mode 100644 vendor/ordermap/README.rst delete mode 100644 vendor/ordermap/benches/bench.rs delete mode 100644 vendor/ordermap/benches/faststring.rs delete mode 100644 vendor/ordermap/src/equivalent.rs delete mode 100644 vendor/ordermap/src/lib.rs delete mode 100644 vendor/ordermap/src/macros.rs delete mode 100644 vendor/ordermap/src/mutable_keys.rs delete mode 100644 vendor/ordermap/src/serde.rs delete mode 100644 vendor/ordermap/src/set.rs delete mode 100644 vendor/ordermap/src/util.rs delete mode 100644 vendor/ordermap/tests/equivalent_trait.rs delete mode 100644 vendor/ordermap/tests/quick.rs delete mode 100644 vendor/ordermap/tests/serde.rs delete mode 100644 vendor/ordermap/tests/tests.rs delete mode 100644 vendor/petgraph/.cargo-checksum.json delete mode 100644 vendor/petgraph/CONTRIBUTING.rst delete mode 100644 vendor/petgraph/Cargo.toml delete mode 100644 vendor/petgraph/LICENSE-MIT delete mode 100644 vendor/petgraph/Makefile delete mode 100644 vendor/petgraph/README.rst delete mode 100644 vendor/petgraph/benches/iso.rs delete mode 100644 vendor/petgraph/benches/ograph.rs delete mode 100644 vendor/petgraph/benches/stable_graph.rs delete mode 100644 vendor/petgraph/custom.css delete mode 100644 vendor/petgraph/graph-example.dot delete mode 100644 vendor/petgraph/src/algo/dominators.rs delete mode 100644 vendor/petgraph/src/algo/mod.rs delete mode 100644 vendor/petgraph/src/astar.rs delete mode 100644 vendor/petgraph/src/csr.rs delete mode 100644 vendor/petgraph/src/data.rs delete mode 100644 vendor/petgraph/src/dijkstra.rs delete mode 100644 vendor/petgraph/src/dot.rs delete mode 100644 vendor/petgraph/src/generate.rs delete mode 100644 vendor/petgraph/src/graph_impl/frozen.rs delete mode 100644 vendor/petgraph/src/graph_impl/mod.rs delete mode 100644 vendor/petgraph/src/graph_impl/serialization.rs delete mode 100644 vendor/petgraph/src/graph_impl/stable_graph/mod.rs delete mode 100644 vendor/petgraph/src/graph_impl/stable_graph/serialization.rs delete mode 100644 vendor/petgraph/src/graphmap.rs delete mode 100644 vendor/petgraph/src/isomorphism.rs delete mode 100644 vendor/petgraph/src/iter_format.rs delete mode 100644 vendor/petgraph/src/iter_utils.rs delete mode 100644 vendor/petgraph/src/lib.rs delete mode 100644 vendor/petgraph/src/macros.rs delete mode 100644 vendor/petgraph/src/prelude.rs delete mode 100644 vendor/petgraph/src/quickcheck.rs delete mode 100644 vendor/petgraph/src/scored.rs delete mode 100644 vendor/petgraph/src/serde_utils.rs delete mode 100644 vendor/petgraph/src/traits_graph.rs delete mode 100644 vendor/petgraph/src/unionfind.rs delete mode 100644 vendor/petgraph/src/util.rs delete mode 100644 vendor/petgraph/src/visit/dfsvisit.rs delete mode 100644 vendor/petgraph/src/visit/filter.rs delete mode 100644 vendor/petgraph/src/visit/macros.rs delete mode 100644 vendor/petgraph/src/visit/mod.rs delete mode 100644 vendor/petgraph/src/visit/reversed.rs delete mode 100644 vendor/petgraph/src/visit/traversal.rs delete mode 100644 vendor/petgraph/tests/graph.rs delete mode 100644 vendor/petgraph/tests/graphmap.rs delete mode 100644 vendor/petgraph/tests/iso.rs delete mode 100644 vendor/petgraph/tests/quickcheck.rs delete mode 100644 vendor/petgraph/tests/stable_graph.rs delete mode 100644 vendor/petgraph/tests/unionfind.rs delete mode 100644 vendor/petgraph/tests/utils/mod.rs delete mode 100644 vendor/petgraph/tests/utils/qc.rs create mode 100644 vendor/rand/Cargo.lock create mode 100644 vendor/rand/SECURITY.md create mode 100644 vendor/rand/benches/weighted.rs delete mode 100644 vendor/rand/src/rngs/os.rs delete mode 100644 vendor/rand_core-0.4.0/.cargo-checksum.json delete mode 100644 vendor/rand_core-0.4.0/CHANGELOG.md delete mode 100644 vendor/rand_core-0.4.0/COPYRIGHT delete mode 100644 vendor/rand_core-0.4.0/Cargo.toml delete mode 100644 vendor/rand_core-0.4.0/LICENSE-APACHE delete mode 100644 vendor/rand_core-0.4.0/LICENSE-MIT delete mode 100644 vendor/rand_core-0.4.0/README.md delete mode 100644 vendor/rand_core-0.4.0/src/block.rs delete mode 100644 vendor/rand_core-0.4.0/src/error.rs delete mode 100644 vendor/rand_core-0.4.0/src/impls.rs delete mode 100644 vendor/rand_core-0.4.0/src/le.rs delete mode 100644 vendor/rand_core-0.4.0/src/lib.rs create mode 100644 vendor/redox_syscall/src/arch/nonredox.rs create mode 100644 vendor/redox_syscall/src/tests.rs delete mode 100644 vendor/rustfix/bors.toml rename vendor/socket2/src/sys/{unix/mod.rs => unix.rs} (94%) delete mode 100644 vendor/socket2/src/sys/unix/weak.rs create mode 100644 vendor/ucd-parse/.cargo-checksum.json create mode 100644 vendor/ucd-parse/Cargo.toml rename vendor/{ordermap => ucd-parse}/LICENSE-APACHE (100%) create mode 100644 vendor/ucd-parse/LICENSE-MIT create mode 100644 vendor/ucd-parse/README.md create mode 100644 vendor/ucd-parse/src/age.rs create mode 100644 vendor/ucd-parse/src/case_folding.rs create mode 100644 vendor/ucd-parse/src/common.rs create mode 100644 vendor/ucd-parse/src/core_properties.rs create mode 100644 vendor/ucd-parse/src/emoji_properties.rs create mode 100644 vendor/ucd-parse/src/error.rs create mode 100644 vendor/ucd-parse/src/grapheme_cluster_break.rs create mode 100644 vendor/ucd-parse/src/jamo_short_name.rs create mode 100644 vendor/ucd-parse/src/lib.rs create mode 100644 vendor/ucd-parse/src/line_break.rs create mode 100644 vendor/ucd-parse/src/name_aliases.rs create mode 100644 vendor/ucd-parse/src/prop_list.rs create mode 100644 vendor/ucd-parse/src/property_aliases.rs create mode 100644 vendor/ucd-parse/src/property_value_aliases.rs create mode 100644 vendor/ucd-parse/src/script_extensions.rs create mode 100644 vendor/ucd-parse/src/scripts.rs create mode 100644 vendor/ucd-parse/src/sentence_break.rs create mode 100644 vendor/ucd-parse/src/special_casing.rs create mode 100644 vendor/ucd-parse/src/unicode_data.rs create mode 100644 vendor/ucd-parse/src/word_break.rs create mode 100644 vendor/unicode-normalization/src/__test_api.rs create mode 100644 vendor/unicode-normalization/src/lookups.rs delete mode 100644 vendor/unicode-normalization/src/normalization_tests.rs create mode 100644 vendor/unicode-normalization/src/perfect_hash.rs create mode 100644 vendor/unicode-script/.cargo-checksum.json rename vendor/{wasi-0.7.0 => unicode-script}/Cargo.toml (52%) create mode 100644 vendor/unicode-script/README.md create mode 100644 vendor/unicode-script/scripts/unicode.py create mode 100644 vendor/unicode-script/src/lib.rs create mode 100644 vendor/unicode-script/src/tables.rs create mode 100644 vendor/unicode-security/.cargo-checksum.json create mode 100644 vendor/unicode-security/COPYRIGHT create mode 100644 vendor/unicode-security/Cargo.toml rename vendor/{petgraph => unicode-security}/LICENSE-APACHE (100%) rename vendor/{ordermap => unicode-security}/LICENSE-MIT (95%) create mode 100644 vendor/unicode-security/README.md create mode 100644 vendor/unicode-security/scripts/unicode.py create mode 100644 vendor/unicode-security/src/general_security_profile.rs create mode 100644 vendor/unicode-security/src/lib.rs create mode 100644 vendor/unicode-security/src/mixed_script.rs create mode 100644 vendor/unicode-security/src/restriction_level.rs create mode 100644 vendor/unicode-security/src/tables.rs create mode 100644 vendor/unicode-security/src/tests.rs delete mode 100644 vendor/wasi-0.7.0/.cargo-checksum.json delete mode 100644 vendor/wasi-0.7.0/0001-maybe.patch delete mode 100644 vendor/wasi-0.7.0/CODE_OF_CONDUCT.md delete mode 100644 vendor/wasi-0.7.0/CONTRIBUTING.md delete mode 100644 vendor/wasi-0.7.0/LICENSE-APACHE delete mode 100644 vendor/wasi-0.7.0/LICENSE-Apache-2.0_WITH_LLVM-exception delete mode 100644 vendor/wasi-0.7.0/README.md delete mode 100644 vendor/wasi-0.7.0/clip.log delete mode 100644 vendor/wasi-0.7.0/old-bitflags.patch delete mode 100644 vendor/wasi-0.7.0/rusty-tags.vi delete mode 100644 vendor/wasi-0.7.0/src/lib.rs delete mode 100644 vendor/wasi-0.7.0/src/wasi_unstable/mod.rs delete mode 100644 vendor/wasi-0.7.0/src/wasi_unstable/raw.rs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8fbbd7c4a2..fc8ca5d07b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -367,7 +367,7 @@ labels to triage issues: to fix the issue. * The dark blue **final-comment-period** label marks bugs that are using the - RFC signoff functionality of [rfcbot][rfcbot] and are currently in the final + RFC signoff functionality of [rfcbot] and are currently in the final comment period. * Red, **I**-prefixed labels indicate the **importance** of the issue. The @@ -385,7 +385,7 @@ labels to triage issues: label. * The gray **proposed-final-comment-period** label marks bugs that are using - the RFC signoff functionality of [rfcbot][rfcbot] and are currently awaiting + the RFC signoff functionality of [rfcbot] and are currently awaiting signoff of all team members in order to enter the final comment period. * Pink, **regression**-prefixed labels track regressions from stable to the diff --git a/Cargo.lock b/Cargo.lock index 1af0442dde..80c90243e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,7 +21,7 @@ version = "0.0.0" dependencies = [ "compiler_builtins", "core", - "rand 0.7.0", + "rand 0.7.3", "rand_xorshift 0.2.0", ] @@ -32,7 +32,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e266e1f4be5ffa05309f650e2586fe1d3ae6034eb24025a7ae1dfecc330823a" dependencies = [ "html5ever", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "maplit", "matches", "tendril", @@ -57,6 +57,12 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "anyhow" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" + [[package]] name = "arc-swap" version = "0.3.7" @@ -109,9 +115,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875" +checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" [[package]] name = "backtrace" @@ -192,15 +198,16 @@ dependencies = [ "cmake", "filetime", "getopts", - "lazy_static 1.3.0", + "ignore", + "lazy_static 1.4.0", "libc", "num_cpus", - "petgraph", "pretty_assertions", "serde", "serde_json", "time", "toml", + "winapi 0.3.8", ] [[package]] @@ -265,18 +272,18 @@ checksum = "716960a18f978640f25101b5cbf1c6f6b0d3192fab36a2d98ca96f0ecbe41010" [[package]] name = "c2-chacha" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" +checksum = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" dependencies = [ - "lazy_static 1.3.0", "ppv-lite86", ] [[package]] name = "cargo" -version = "0.42.0" +version = "0.43.0" dependencies = [ + "anyhow", "atty", "bytesize", "cargo-platform", @@ -290,7 +297,6 @@ dependencies = [ "curl", "curl-sys", "env_logger 0.7.1", - "failure", "filetime", "flate2", "fs2", @@ -300,11 +306,11 @@ dependencies = [ "glob", "hex 0.4.0", "home", - "humantime", + "humantime 2.0.0", "ignore", "im-rc", "jobserver", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "lazycell", "libc", "libgit2-sys", @@ -318,7 +324,7 @@ dependencies = [ "pretty_env_logger", "remove_dir_all", "rustc-workspace-hack", - "rustfix", + "rustfix 0.5.0", "same-file", "semver", "serde", @@ -338,7 +344,7 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.0" +version = "0.1.1" dependencies = [ "serde", ] @@ -357,7 +363,7 @@ dependencies = [ "flate2", "git2", "glob", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "remove_dir_all", "serde_json", "tar", @@ -395,19 +401,18 @@ version = "0.1.0" [[package]] name = "cc" -version = "1.0.47" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa87058dce70a3ff5621797f1506cb837edd02ac4c0ae642b4542dce802908b8" +checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" dependencies = [ "jobserver", - "num_cpus", ] [[package]] name = "cfg-if" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89431bba4e6b7092fb5fcd00a6f6ca596c55cc26b2f1e6dcdd08a1f4933f66b2" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" dependencies = [ "compiler_builtins", "rustc-std-workspace-core", @@ -469,7 +474,7 @@ dependencies = [ "compiletest_rs", "derive-new", "git2", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "regex", "rustc-workspace-hack", "rustc_tools_util 0.2.0", @@ -490,7 +495,7 @@ dependencies = [ "cargo_metadata 0.9.0", "if_chain", "itertools 0.8.0", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "matches", "pulldown-cmark 0.6.1", "quine-mc_cluskey", @@ -514,9 +519,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.38" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96210eec534fc3fbfc0452a63769424eaa80205fda6cea98e5b61cb3d97bcec8" +checksum = "81fb25b677f8bf1eb325017cb6bb8452f87969db0fedb4f757b297bee78a7c62" dependencies = [ "cc", ] @@ -570,9 +575,9 @@ dependencies = [ [[package]] name = "compiler_builtins" -version = "0.1.22" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f083abf9bb9005a27d2da62706f661245278cb7096da37ab27410eaf60f2c1" +checksum = "438ac08ddc5efe81452f984a9e33ba425b00b31d1f48e6acd9e2210aa28cc52e" dependencies = [ "cc", "rustc-std-workspace-core", @@ -585,12 +590,12 @@ dependencies = [ "diff", "env_logger 0.7.1", "getopts", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "libc", "log", "miow 0.3.3", "regex", - "rustfix", + "rustfix 0.5.0", "serde", "serde_json", "walkdir", @@ -610,7 +615,7 @@ dependencies = [ "log", "miow 0.3.3", "regex", - "rustfix", + "rustfix 0.4.6", "serde", "serde_derive", "serde_json", @@ -657,7 +662,7 @@ dependencies = [ name = "core" version = "0.0.0" dependencies = [ - "rand 0.7.0", + "rand 0.7.3", ] [[package]] @@ -694,10 +699,10 @@ checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" [[package]] name = "crates-io" -version = "0.30.0" +version = "0.31.0" dependencies = [ + "anyhow", "curl", - "failure", "percent-encoding 2.1.0", "serde", "serde_derive", @@ -724,16 +729,6 @@ dependencies = [ "smallvec 0.6.10", ] -[[package]] -name = "crossbeam-deque" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils 0.6.5", -] - [[package]] name = "crossbeam-deque" version = "0.7.1" @@ -753,9 +748,9 @@ dependencies = [ "arrayvec", "cfg-if", "crossbeam-utils 0.6.5", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "memoffset", - "scopeguard 1.0.0", + "scopeguard", ] [[package]] @@ -774,7 +769,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" dependencies = [ "cfg-if", - "lazy_static 1.3.0", + "lazy_static 1.4.0", ] [[package]] @@ -785,7 +780,7 @@ checksum = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" dependencies = [ "autocfg", "cfg-if", - "lazy_static 1.3.0", + "lazy_static 1.4.0", ] [[package]] @@ -802,9 +797,9 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.24" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d08ad3cb89d076a36b0ce5749eec2c9964f70c0c58480ab6b75a91ec4fc206d8" +checksum = "06aa71e9208a54def20792d877bc663d6aae0732b9852e612c4a933177c31283" dependencies = [ "curl-sys", "libc", @@ -817,9 +812,9 @@ dependencies = [ [[package]] name = "curl-sys" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9a9a4e417722876332136a00cacf92c2ceb331fab4b52b6a1ad16c6cd79255" +checksum = "0c38ca47d60b86d0cc9d42caa90a0885669c2abc9791f871c81f58cdf39e979b" dependencies = [ "cc", "libc", @@ -982,7 +977,7 @@ version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a99a310cd1f9770e7bf8e48810c7bcbb0e078c8fb23a8c7bcf0da4c2bf61a455" dependencies = [ - "lazy_static 1.3.0", + "lazy_static 1.4.0", "regex", "serde", "serde_derive", @@ -1016,7 +1011,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" dependencies = [ "atty", - "humantime", + "humantime 1.3.0", "log", "regex", "termcolor", @@ -1029,7 +1024,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ "atty", - "humantime", + "humantime 1.3.0", "log", "regex", "termcolor", @@ -1091,12 +1086,6 @@ dependencies = [ "redox_syscall", ] -[[package]] -name = "fixedbitset" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" - [[package]] name = "flate2" version = "1.0.12" @@ -1115,7 +1104,7 @@ name = "fmt_macros" version = "0.0.0" dependencies = [ "rustc_lexer", - "syntax_pos", + "rustc_span", ] [[package]] @@ -1254,20 +1243,20 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ "cfg-if", "libc", - "wasi 0.7.0", + "wasi", ] [[package]] name = "git2" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39f27186fbb5ec67ece9a56990292bc5aed3c3fc51b9b07b0b52446b1dfb4a82" +checksum = "77519ef7c5beee314d0804d4534f01e0f9e8d9acdee2b7a48627e590b27e0ec4" dependencies = [ "bitflags", "libc", @@ -1280,9 +1269,9 @@ dependencies = [ [[package]] name = "git2-curl" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6527e480187ce19aaf4fa6acfb7657b25628ce31cb8ffabdfca3bf731524c5" +checksum = "d2559abb1d87d27668d31bd868a000f0e2e0065d10e78961b62da95d7a7f1cc7" dependencies = [ "curl", "git2", @@ -1338,7 +1327,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df044dd42cdb7e32f28557b661406fc0f2494be75199779998810dbc35030e0d" dependencies = [ "hashbrown 0.5.0", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "pest", "pest_derive", @@ -1407,7 +1396,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3753954f7bd71f0e671afb8b5a992d1724cf43b7f95a563cd4a0bde94659ca8" dependencies = [ - "scopeguard 1.0.0", + "scopeguard", "winapi 0.3.8", ] @@ -1463,6 +1452,12 @@ dependencies = [ "quick-error", ] +[[package]] +name = "humantime" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b6c53306532d3c8e8087b44e6580e10db51a023cf9b433cea2ac38066b92da" + [[package]] name = "hyper" version = "0.12.31" @@ -1542,13 +1537,13 @@ checksum = "c3360c7b59e5ffa2653671fb74b4741a5d343c03f331c0a4aeda42b5c2b0ec7d" [[package]] name = "ignore" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc57fa12805f367736a38541ac1a9fc6a52812a0ca959b1d4d4b640a89eb002" +checksum = "0ec16832258409d571aaef8273f3c3cc5b060d784e159d1a0f3b0017308f84a7" dependencies = [ "crossbeam-channel", "globset", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "memchr", "regex", @@ -1585,7 +1580,7 @@ dependencies = [ "clap", "failure", "flate2", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "num_cpus", "rayon", "remove_dir_all", @@ -1597,12 +1592,11 @@ dependencies = [ [[package]] name = "iovec" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" dependencies = [ "libc", - "winapi 0.2.8", ] [[package]] @@ -1648,13 +1642,11 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.16" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f74e73053eaf95399bf926e48fc7a2a3ce50bd0eaaa2357d391e95b2dcdd4f10" +checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" dependencies = [ "libc", - "log", - "rand 0.7.0", ] [[package]] @@ -1726,7 +1718,7 @@ dependencies = [ "jsonrpc-server-utils", "log", "parity-tokio-ipc", - "parking_lot 0.9.0", + "parking_lot", "tokio-service", ] @@ -1738,7 +1730,7 @@ checksum = "e2c08b444cc0ed70263798834343d0ac875e664257df8079160f23ac1ea79446" dependencies = [ "jsonrpc-core", "log", - "parking_lot 0.9.0", + "parking_lot", "serde", ] @@ -1751,7 +1743,7 @@ dependencies = [ "bytes", "globset", "jsonrpc-core", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "num_cpus", "tokio", @@ -1777,9 +1769,9 @@ checksum = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" [[package]] name = "lazy_static" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lazycell" @@ -1789,18 +1781,18 @@ checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" [[package]] name = "libc" -version = "0.2.64" +version = "0.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dfca3d9957906e8d1e6a0b641dc9a59848e793f1da2165889fd4f62d10d79c" +checksum = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" dependencies = [ "rustc-std-workspace-core", ] [[package]] name = "libgit2-sys" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a30f8637eb59616ee3b8a00f6adff781ee4ddd8343a615b8238de756060cc1b3" +checksum = "d9ec6bca50549d34a392611dde775123086acbd994e3fff64954777ce2dc2e51" dependencies = [ "cc", "libc", @@ -1812,9 +1804,9 @@ dependencies = [ [[package]] name = "libnghttp2-sys" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75d7966bda4730b722d1eab8e668df445368a24394bae9fc1e8dc0ab3dbe4f4" +checksum = "02254d44f4435dd79e695f2c2b83cd06a47919adea30216ceaf0c57ca0a72463" dependencies = [ "cc", "libc", @@ -1822,9 +1814,9 @@ dependencies = [ [[package]] name = "libssh2-sys" -version = "0.2.11" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126a1f4078368b163bfdee65fbab072af08a1b374a5551b21e87ade27b1fbf9d" +checksum = "36aa6e813339d3a063292b77091dfbbb6152ff9006a459895fa5bebed7d34f10" dependencies = [ "cc", "libc", @@ -1850,23 +1842,13 @@ dependencies = [ name = "linkchecker" version = "0.1.0" -[[package]] -name = "lock_api" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949826a5ccf18c1b3a7c3d57692778d21768b79e46eb9dd07bfc4c2160036c54" -dependencies = [ - "owning_ref", - "scopeguard 0.3.3", -] - [[package]] name = "lock_api" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc" dependencies = [ - "scopeguard 1.0.0", + "scopeguard", ] [[package]] @@ -1884,7 +1866,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19af41f0565d7c19b2058153ad0b42d4d5ce89ec4dbf06ed6741114a8b63e7cd" dependencies = [ - "lazy_static 1.3.0", + "lazy_static 1.4.0", ] [[package]] @@ -1977,7 +1959,7 @@ dependencies = [ "error-chain", "handlebars", "itertools 0.8.0", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "memchr", "open", @@ -2021,13 +2003,13 @@ dependencies = [ [[package]] name = "measureme" -version = "0.5.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c420bbc064623934620b5ab2dc0cf96451b34163329e82f95e7fa1b7b99a6ac8" +checksum = "fef709d3257013bba7cff14fc504e07e80631d3fe0f6d38ce63b8f6510ccb932" dependencies = [ "byteorder", "memmap", - "parking_lot 0.9.0", + "parking_lot", "rustc-hash", ] @@ -2171,7 +2153,7 @@ dependencies = [ "hex 0.4.0", "log", "num-traits", - "rand 0.7.0", + "rand 0.7.3", "rustc-workspace-hack", "rustc_version", "serde", @@ -2185,7 +2167,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" dependencies = [ - "lazy_static 1.3.0", + "lazy_static 1.4.0", "libc", "log", "openssl", @@ -2274,7 +2256,7 @@ dependencies = [ "bitflags", "cfg-if", "foreign-types", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "libc", "openssl-sys", ] @@ -2287,18 +2269,18 @@ checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" [[package]] name = "openssl-src" -version = "111.6.0+1.1.1d" +version = "111.6.1+1.1.1d" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9c2da1de8a7a3f860919c01540b03a6db16de042405a8a07a5e9d0b4b825d9c" +checksum = "c91b04cb43c1a8a90e934e0cd612e2a5715d976d2d6cff4490278a0cddf35005" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.52" +version = "0.9.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c977d08e1312e2f7e4b86f9ebaa0ed3b19d1daff75fae88bbb88108afbd801fc" +checksum = "465d16ae7fc0e313318f7de5cecf57b2fbe7511fd213978b457e1c96ff46736f" dependencies = [ "autocfg", "cc", @@ -2308,27 +2290,12 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "ordermap" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" - [[package]] name = "ordslice" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd20eec3dbe4376829cb7d80ae6ac45e0a766831dca50202ff2d40db46a8a024" -[[package]] -name = "owning_ref" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" -dependencies = [ - "stable_deref_trait", -] - [[package]] name = "packed_simd" version = "0.3.1" @@ -2370,45 +2337,22 @@ dependencies = [ "log", "mio-named-pipes", "miow 0.3.3", - "rand 0.7.0", + "rand 0.7.3", "tokio", "tokio-named-pipes", "tokio-uds", "winapi 0.3.8", ] -[[package]] -name = "parking_lot" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" -dependencies = [ - "lock_api 0.1.3", - "parking_lot_core 0.4.0", -] - [[package]] name = "parking_lot" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" dependencies = [ - "lock_api 0.3.1", - "parking_lot_core 0.6.2", - "rustc_version", -] - -[[package]] -name = "parking_lot_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -dependencies = [ - "libc", - "rand 0.6.1", + "lock_api", + "parking_lot_core", "rustc_version", - "smallvec 0.6.10", - "winapi 0.3.8", ] [[package]] @@ -2481,16 +2425,6 @@ dependencies = [ "sha-1", ] -[[package]] -name = "petgraph" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" -dependencies = [ - "fixedbitset", - "ordermap", -] - [[package]] name = "phf" version = "0.7.24" @@ -2531,9 +2465,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.14" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" +checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" [[package]] name = "polonius-engine" @@ -2548,9 +2482,9 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" +checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" [[package]] name = "precomputed-hash" @@ -2641,7 +2575,7 @@ checksum = "9bf259a81de2b2eb9850ec990ec78e6a25319715584fd7652b9b26f96fcb1510" dependencies = [ "error-chain", "idna 0.2.0", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "regex", "url 2.1.0", ] @@ -2715,8 +2649,8 @@ dependencies = [ "clap", "derive_more", "env_logger 0.6.2", - "humantime", - "lazy_static 1.3.0", + "humantime 1.3.0", + "lazy_static 1.4.0", "log", "rls-span", "rustc-ap-syntax", @@ -2743,9 +2677,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d47eab0e83d9693d40f825f86948aa16eff6750ead4bdffc4ab95b8b3a7f052c" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ "getrandom", "libc", @@ -2879,7 +2813,7 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a27732a533a1be0a0035a111fe76db89ad312f6f0347004c220c57f209a123" dependencies = [ - "crossbeam-deque 0.7.1", + "crossbeam-deque", "either", "rayon-core", ] @@ -2890,10 +2824,10 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98dcf634205083b17d0861252431eb2acbfb698ab7478a2d20de07954f47ec7b" dependencies = [ - "crossbeam-deque 0.7.1", + "crossbeam-deque", "crossbeam-queue", "crossbeam-utils 0.6.5", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "num_cpus", ] @@ -2908,9 +2842,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.43" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "679da7508e9a6390aeaf7fbd02a800fdc64b73fe2204dd2c8ae66d22d9d5ad5d" +checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" [[package]] name = "redox_termios" @@ -3010,26 +2944,26 @@ dependencies = [ name = "rls" version = "1.41.0" dependencies = [ + "anyhow", "cargo", "cargo_metadata 0.8.0", "clippy_lints", "crossbeam-channel", "difference", "env_logger 0.7.1", - "failure", "futures", "heck", "home", "itertools 0.8.0", "jsonrpc-core", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "lsp-codec", "lsp-types", "num_cpus", "ordslice", "racer", - "rand 0.7.0", + "rand 0.7.3", "rayon", "regex", "rls-analysis", @@ -3102,7 +3036,7 @@ dependencies = [ "failure", "futures", "log", - "rand 0.7.0", + "rand 0.7.3", "rls-data", "rls-ipc", "serde", @@ -3154,26 +3088,24 @@ dependencies = [ "jobserver", "log", "measureme", - "num_cpus", - "parking_lot 0.9.0", + "parking_lot", "polonius-engine", "rustc-rayon", "rustc-rayon-core", "rustc_apfloat", "rustc_data_structures", - "rustc_error_codes", "rustc_errors", "rustc_feature", - "rustc_fs_util", + "rustc_hir", "rustc_index", "rustc_macros", "rustc_session", + "rustc_span", "rustc_target", "scoped-tls", "serialize", "smallvec 1.0.0", "syntax", - "syntax_pos", ] [[package]] @@ -3203,9 +3135,9 @@ dependencies = [ "ena", "indexmap", "jobserver", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", - "parking_lot 0.9.0", + "parking_lot", "rustc-ap-graphviz", "rustc-ap-rustc_index", "rustc-ap-serialize", @@ -3296,7 +3228,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61fc1c901d2cbd24cae95d7bc5a58aa7661ec3dc5320c78c32830a52a685c33c" dependencies = [ "bitflags", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "rustc-ap-rustc_data_structures", "rustc-ap-rustc_errors", @@ -3351,7 +3283,6 @@ dependencies = [ "jemalloc-sys", "rustc_codegen_ssa", "rustc_driver", - "rustc_target", ] [[package]] @@ -3360,7 +3291,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f32767f90d938f1b7199a174ef249ae1924f6e5bbdb9d112fea141e016f25b3a" dependencies = [ - "crossbeam-deque 0.7.1", + "crossbeam-deque", "either", "rustc-rayon-core", ] @@ -3371,10 +3302,10 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2427831f0053ea3ea73559c8eabd893133a51b251d142bacee53c62a288cb3" dependencies = [ - "crossbeam-deque 0.7.1", + "crossbeam-deque", "crossbeam-queue", "crossbeam-utils 0.6.5", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "num_cpus", ] @@ -3407,6 +3338,7 @@ dependencies = [ "serde", "serde_json", "smallvec 0.6.10", + "smallvec 1.0.0", "syn 0.15.35", "url 2.1.0", "winapi 0.3.8", @@ -3421,14 +3353,52 @@ dependencies = [ ] [[package]] -name = "rustc_asan" +name = "rustc_ast_lowering" version = "0.0.0" dependencies = [ - "alloc", - "build_helper", - "cmake", - "compiler_builtins", - "core", + "log", + "rustc", + "rustc_data_structures", + "rustc_errors", + "rustc_hir", + "rustc_index", + "rustc_session", + "rustc_span", + "rustc_target", + "smallvec 1.0.0", + "syntax", +] + +[[package]] +name = "rustc_ast_passes" +version = "0.0.0" +dependencies = [ + "log", + "rustc_data_structures", + "rustc_errors", + "rustc_feature", + "rustc_parse", + "rustc_session", + "rustc_span", + "syntax", +] + +[[package]] +name = "rustc_builtin_macros" +version = "0.0.0" +dependencies = [ + "fmt_macros", + "log", + "rustc_data_structures", + "rustc_errors", + "rustc_expand", + "rustc_feature", + "rustc_parse", + "rustc_session", + "rustc_span", + "rustc_target", + "smallvec 1.0.0", + "syntax", ] [[package]] @@ -3447,15 +3417,16 @@ dependencies = [ "rustc_errors", "rustc_feature", "rustc_fs_util", + "rustc_hir", "rustc_incremental", "rustc_index", "rustc_llvm", "rustc_session", + "rustc_span", "rustc_target", - "smallvec 0.6.10", + "serialize", + "smallvec 1.0.0", "syntax", - "syntax_expand", - "syntax_pos", ] [[package]] @@ -3473,16 +3444,16 @@ dependencies = [ "rustc_apfloat", "rustc_codegen_utils", "rustc_data_structures", - "rustc_error_codes", "rustc_errors", "rustc_fs_util", + "rustc_hir", "rustc_incremental", "rustc_index", "rustc_session", + "rustc_span", "rustc_target", "serialize", "syntax", - "syntax_pos", "tempfile", ] @@ -3495,10 +3466,11 @@ dependencies = [ "rustc", "rustc-demangle", "rustc_data_structures", + "rustc_hir", "rustc_metadata", + "rustc_span", "rustc_target", "syntax", - "syntax_pos", ] [[package]] @@ -3512,10 +3484,10 @@ dependencies = [ "graphviz", "indexmap", "jobserver", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "measureme", - "parking_lot 0.9.0", + "parking_lot", "rustc-hash", "rustc-rayon", "rustc-rayon-core", @@ -3523,6 +3495,7 @@ dependencies = [ "serialize", "smallvec 1.0.0", "stable_deref_trait", + "winapi 0.3.8", ] [[package]] @@ -3530,8 +3503,7 @@ name = "rustc_driver" version = "0.0.0" dependencies = [ "env_logger 0.7.1", - "graphviz", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "rustc", "rustc_codegen_utils", @@ -3539,18 +3511,19 @@ dependencies = [ "rustc_error_codes", "rustc_errors", "rustc_feature", + "rustc_hir", "rustc_interface", "rustc_lint", "rustc_metadata", "rustc_mir", "rustc_parse", "rustc_plugin_impl", - "rustc_resolve", "rustc_save_analysis", + "rustc_span", "rustc_target", "serialize", "syntax", - "syntax_pos", + "winapi 0.3.8", ] [[package]] @@ -3565,40 +3538,76 @@ dependencies = [ "atty", "log", "rustc_data_structures", + "rustc_span", "serialize", - "syntax_pos", "term_size", "termcolor", "unicode-width", + "winapi 0.3.8", +] + +[[package]] +name = "rustc_expand" +version = "0.0.0" +dependencies = [ + "log", + "rustc_ast_passes", + "rustc_data_structures", + "rustc_errors", + "rustc_feature", + "rustc_lexer", + "rustc_parse", + "rustc_session", + "rustc_span", + "serialize", + "smallvec 1.0.0", + "syntax", ] [[package]] name = "rustc_feature" version = "0.0.0" dependencies = [ - "lazy_static 1.3.0", + "lazy_static 1.4.0", "rustc_data_structures", - "syntax_pos", + "rustc_span", ] [[package]] name = "rustc_fs_util" version = "0.0.0" +[[package]] +name = "rustc_hir" +version = "0.0.0" +dependencies = [ + "rustc_data_structures", + "rustc_errors", + "rustc_index", + "rustc_macros", + "rustc_session", + "rustc_span", + "rustc_target", + "serialize", + "smallvec 1.0.0", + "syntax", +] + [[package]] name = "rustc_incremental" version = "0.0.0" dependencies = [ "graphviz", "log", - "rand 0.7.0", + "rand 0.7.3", "rustc", "rustc_data_structures", "rustc_fs_util", + "rustc_hir", "rustc_session", + "rustc_span", "serialize", "syntax", - "syntax_pos", ] [[package]] @@ -3617,30 +3626,37 @@ dependencies = [ "once_cell", "rustc", "rustc-rayon", + "rustc_ast_lowering", + "rustc_ast_passes", + "rustc_builtin_macros", "rustc_codegen_llvm", "rustc_codegen_ssa", "rustc_codegen_utils", "rustc_data_structures", "rustc_errors", + "rustc_expand", + "rustc_hir", "rustc_incremental", "rustc_lint", "rustc_metadata", "rustc_mir", + "rustc_mir_build", "rustc_parse", "rustc_passes", "rustc_plugin_impl", "rustc_privacy", "rustc_resolve", + "rustc_session", + "rustc_span", "rustc_target", "rustc_traits", + "rustc_ty", "rustc_typeck", "serialize", "smallvec 1.0.0", "syntax", - "syntax_expand", - "syntax_ext", - "syntax_pos", "tempfile", + "winapi 0.3.8", ] [[package]] @@ -3657,13 +3673,15 @@ dependencies = [ "log", "rustc", "rustc_data_structures", - "rustc_error_codes", + "rustc_errors", "rustc_feature", + "rustc_hir", "rustc_index", "rustc_session", + "rustc_span", "rustc_target", "syntax", - "syntax_pos", + "unicode-security", ] [[package]] @@ -3675,17 +3693,6 @@ dependencies = [ "libc", ] -[[package]] -name = "rustc_lsan" -version = "0.0.0" -dependencies = [ - "alloc", - "build_helper", - "cmake", - "compiler_builtins", - "core", -] - [[package]] name = "rustc_macros" version = "0.1.0" @@ -3706,24 +3713,24 @@ dependencies = [ "memmap", "rustc", "rustc_data_structures", - "rustc_error_codes", "rustc_errors", + "rustc_expand", + "rustc_hir", "rustc_index", "rustc_parse", + "rustc_span", "rustc_target", "serialize", "smallvec 1.0.0", "stable_deref_trait", "syntax", - "syntax_expand", - "syntax_pos", + "winapi 0.3.8", ] [[package]] name = "rustc_mir" version = "0.0.0" dependencies = [ - "arena", "either", "graphviz", "itertools 0.8.0", @@ -3733,27 +3740,38 @@ dependencies = [ "rustc", "rustc_apfloat", "rustc_data_structures", - "rustc_error_codes", "rustc_errors", + "rustc_hir", "rustc_index", "rustc_lexer", "rustc_macros", + "rustc_span", "rustc_target", "serialize", "smallvec 1.0.0", "syntax", - "syntax_pos", ] [[package]] -name = "rustc_msan" +name = "rustc_mir_build" version = "0.0.0" dependencies = [ - "alloc", - "build_helper", - "cmake", - "compiler_builtins", - "core", + "arena", + "itertools 0.8.0", + "log", + "rustc", + "rustc_apfloat", + "rustc_data_structures", + "rustc_errors", + "rustc_hir", + "rustc_index", + "rustc_macros", + "rustc_session", + "rustc_span", + "rustc_target", + "serialize", + "smallvec 1.0.0", + "syntax", ] [[package]] @@ -3763,13 +3781,14 @@ dependencies = [ "bitflags", "log", "rustc_data_structures", - "rustc_error_codes", "rustc_errors", "rustc_feature", "rustc_lexer", + "rustc_session", + "rustc_span", "smallvec 1.0.0", "syntax", - "syntax_pos", + "unicode-normalization", ] [[package]] @@ -3779,14 +3798,14 @@ dependencies = [ "log", "rustc", "rustc_data_structures", - "rustc_error_codes", "rustc_errors", "rustc_feature", + "rustc_hir", "rustc_index", - "rustc_parse", + "rustc_session", + "rustc_span", "rustc_target", "syntax", - "syntax_pos", ] [[package]] @@ -3794,10 +3813,12 @@ name = "rustc_plugin_impl" version = "0.0.0" dependencies = [ "rustc", - "rustc_error_codes", + "rustc_errors", + "rustc_hir", + "rustc_lint", "rustc_metadata", + "rustc_span", "syntax", - "syntax_pos", ] [[package]] @@ -3807,10 +3828,11 @@ dependencies = [ "log", "rustc", "rustc_data_structures", - "rustc_error_codes", + "rustc_errors", + "rustc_hir", + "rustc_span", "rustc_typeck", "syntax", - "syntax_pos", ] [[package]] @@ -3821,15 +3843,17 @@ dependencies = [ "bitflags", "log", "rustc", + "rustc_ast_lowering", "rustc_data_structures", - "rustc_error_codes", "rustc_errors", + "rustc_expand", "rustc_feature", + "rustc_hir", "rustc_metadata", + "rustc_session", + "rustc_span", "smallvec 1.0.0", "syntax", - "syntax_expand", - "syntax_pos", ] [[package]] @@ -3842,10 +3866,11 @@ dependencies = [ "rustc", "rustc_codegen_utils", "rustc_data_structures", + "rustc_hir", "rustc_parse", + "rustc_span", "serde_json", "syntax", - "syntax_pos", ] [[package]] @@ -3859,9 +3884,24 @@ dependencies = [ "rustc_feature", "rustc_fs_util", "rustc_index", + "rustc_span", "rustc_target", "serialize", - "syntax_pos", +] + +[[package]] +name = "rustc_span" +version = "0.0.0" +dependencies = [ + "arena", + "cfg-if", + "log", + "rustc_data_structures", + "rustc_index", + "rustc_macros", + "scoped-tls", + "serialize", + "unicode-width", ] [[package]] @@ -3873,8 +3913,8 @@ dependencies = [ "rustc_data_structures", "rustc_index", "rustc_macros", + "rustc_span", "serialize", - "syntax_pos", ] [[package]] @@ -3895,22 +3935,23 @@ dependencies = [ "log", "rustc", "rustc_data_structures", + "rustc_hir", "rustc_macros", + "rustc_span", "rustc_target", "smallvec 1.0.0", "syntax", - "syntax_pos", ] [[package]] -name = "rustc_tsan" +name = "rustc_ty" version = "0.0.0" dependencies = [ - "alloc", - "build_helper", - "cmake", - "compiler_builtins", - "core", + "log", + "rustc", + "rustc_data_structures", + "rustc_hir", + "rustc_span", ] [[package]] @@ -3921,13 +3962,13 @@ dependencies = [ "log", "rustc", "rustc_data_structures", - "rustc_error_codes", "rustc_errors", + "rustc_hir", "rustc_index", + "rustc_span", "rustc_target", "smallvec 1.0.0", "syntax", - "syntax_pos", ] [[package]] @@ -3943,6 +3984,7 @@ dependencies = [ name = "rustdoc" version = "0.0.0" dependencies = [ + "itertools 0.8.0", "minifier", "pulldown-cmark 0.5.3", "rustc-rayon", @@ -3974,6 +4016,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "rustfix" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804b11883a5ce0ad0378fbf95a8dea59ee6b51c331a73b8f471b6bdaa3bd40c1" +dependencies = [ + "anyhow", + "log", + "serde", + "serde_json", +] + [[package]] name = "rustfmt-config_proc_macro" version = "0.2.0" @@ -3999,7 +4053,7 @@ dependencies = [ "getopts", "ignore", "itertools 0.8.0", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "regex", "rustc-ap-rustc_target", @@ -4034,11 +4088,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" +checksum = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" dependencies = [ - "lazy_static 1.3.0", + "lazy_static 1.4.0", "winapi 0.3.8", ] @@ -4054,12 +4108,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" -[[package]] -name = "scopeguard" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" - [[package]] name = "scopeguard" version = "1.0.0" @@ -4244,9 +4292,9 @@ checksum = "4ecf3b85f68e8abaa7555aa5abdb1153079387e60b718283d732f03897fcfc86" [[package]] name = "socket2" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7" +checksum = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" dependencies = [ "cfg-if", "libc", @@ -4277,13 +4325,9 @@ dependencies = [ "panic_abort", "panic_unwind", "profiler_builtins", - "rand 0.7.0", - "rustc_asan", - "rustc_lsan", - "rustc_msan", - "rustc_tsan", + "rand 0.7.3", "unwind", - "wasi 0.9.0+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -4301,7 +4345,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" dependencies = [ - "lazy_static 1.3.0", + "lazy_static 1.4.0", "new_debug_unreachable", "phf_shared", "precomputed-hash", @@ -4435,70 +4479,18 @@ dependencies = [ name = "syntax" version = "0.0.0" dependencies = [ - "bitflags", - "lazy_static 1.3.0", "log", "rustc_data_structures", - "rustc_error_codes", "rustc_errors", "rustc_feature", "rustc_index", "rustc_lexer", "rustc_macros", "rustc_session", + "rustc_span", "scoped-tls", "serialize", "smallvec 1.0.0", - "syntax_pos", -] - -[[package]] -name = "syntax_expand" -version = "0.0.0" -dependencies = [ - "log", - "rustc_data_structures", - "rustc_errors", - "rustc_feature", - "rustc_lexer", - "rustc_parse", - "serialize", - "smallvec 1.0.0", - "syntax", - "syntax_pos", -] - -[[package]] -name = "syntax_ext" -version = "0.0.0" -dependencies = [ - "fmt_macros", - "log", - "rustc_data_structures", - "rustc_error_codes", - "rustc_errors", - "rustc_feature", - "rustc_parse", - "rustc_target", - "smallvec 1.0.0", - "syntax", - "syntax_expand", - "syntax_pos", -] - -[[package]] -name = "syntax_pos" -version = "0.0.0" -dependencies = [ - "arena", - "cfg-if", - "log", - "rustc_data_structures", - "rustc_index", - "rustc_macros", - "scoped-tls", - "serialize", - "unicode-width", ] [[package]] @@ -4521,7 +4513,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if", "libc", - "rand 0.7.0", + "rand 0.7.3", "redox_syscall", "remove_dir_all", "winapi 0.3.8", @@ -4628,14 +4620,14 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" dependencies = [ - "lazy_static 1.3.0", + "lazy_static 1.4.0", ] [[package]] name = "tidy" version = "0.1.0" dependencies = [ - "lazy_static 1.3.0", + "lazy_static 1.4.0", "regex", "serde", "serde_json", @@ -4655,9 +4647,9 @@ dependencies = [ [[package]] name = "tokio" -version = "0.1.14" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4790d0be6f4ba6ae4f48190efa2ed7780c9e3567796abdb285003cf39840d9c5" +checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" dependencies = [ "bytes", "futures", @@ -4669,6 +4661,7 @@ dependencies = [ "tokio-fs", "tokio-io", "tokio-reactor", + "tokio-sync", "tokio-tcp", "tokio-threadpool", "tokio-timer", @@ -4700,9 +4693,9 @@ dependencies = [ [[package]] name = "tokio-current-thread" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331c8acc267855ec06eb0c94618dcbbfea45bed2d20b77252940095273fb58f6" +checksum = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" dependencies = [ "futures", "tokio-executor", @@ -4710,9 +4703,9 @@ dependencies = [ [[package]] name = "tokio-executor" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" +checksum = "ca6df436c42b0c3330a82d855d2ef017cd793090ad550a6bc2184f4b933532ab" dependencies = [ "crossbeam-utils 0.6.5", "futures", @@ -4720,9 +4713,9 @@ dependencies = [ [[package]] name = "tokio-fs" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9cbbc8a3698b7ab652340f46633364f9eaa928ddaaee79d8b8f356dd79a09d" +checksum = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" dependencies = [ "futures", "tokio-io", @@ -4731,9 +4724,9 @@ dependencies = [ [[package]] name = "tokio-io" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b53aeb9d3f5ccf2ebb29e19788f96987fa1355f8fe45ea193928eaaaf3ae820f" +checksum = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" dependencies = [ "bytes", "futures", @@ -4755,12 +4748,15 @@ dependencies = [ [[package]] name = "tokio-process" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88e1281e412013f1ff5787def044a9577a0bed059f451e835f1643201f8b777d" +checksum = "afbd6ef1b8cc2bd2c2b580d882774d443ebb1c6ceefe35ba9ea4ab586c89dbe8" dependencies = [ + "crossbeam-queue", "futures", + "lazy_static 1.4.0", "libc", + "log", "mio", "mio-named-pipes", "tokio-io", @@ -4771,20 +4767,21 @@ dependencies = [ [[package]] name = "tokio-reactor" -version = "0.1.8" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbcdb0f0d2a1e4c440af82d7bbf0bf91a8a8c0575bcd20c05d15be7e9d3a02f" +checksum = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" dependencies = [ "crossbeam-utils 0.6.5", "futures", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "log", "mio", "num_cpus", - "parking_lot 0.7.1", + "parking_lot", "slab", "tokio-executor", "tokio-io", + "tokio-sync", ] [[package]] @@ -4813,6 +4810,16 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "tokio-sync" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" +dependencies = [ + "fnv", + "futures", +] + [[package]] name = "tokio-tcp" version = "0.1.3" @@ -4829,25 +4836,26 @@ dependencies = [ [[package]] name = "tokio-threadpool" -version = "0.1.10" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17465013014410310f9f61fa10bf4724803c149ea1d51efece131c38efca93aa" +checksum = "f0c32ffea4827978e9aa392d2f743d973c1dfa3730a2ed3f22ce1e6984da848c" dependencies = [ - "crossbeam-channel", - "crossbeam-deque 0.6.3", + "crossbeam-deque", + "crossbeam-queue", "crossbeam-utils 0.6.5", "futures", + "lazy_static 1.4.0", "log", "num_cpus", - "rand 0.6.1", + "slab", "tokio-executor", ] [[package]] name = "tokio-timer" -version = "0.2.8" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f37f0111d76cc5da132fe9bc0590b9b9cfd079bc7e75ac3846278430a299ff8" +checksum = "1739638e364e558128461fc1ad84d997702c8e31c2e6b18fb99842268199e827" dependencies = [ "crossbeam-utils 0.6.5", "futures", @@ -4857,9 +4865,9 @@ dependencies = [ [[package]] name = "tokio-udp" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" +checksum = "f02298505547f73e60f568359ef0d016d5acd6e830ab9bc7c4a5b3403440121b" dependencies = [ "bytes", "futures", @@ -4906,7 +4914,7 @@ dependencies = [ "failure", "failure_derive", "is-match", - "lazy_static 1.3.0", + "lazy_static 1.4.0", "regex", "toml", "toml-query_derive", @@ -4944,6 +4952,16 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" +[[package]] +name = "ucd-parse" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6b52bf4da6512f0f07785a04769222e50d29639e7ecd016b7806fd2de306b4" +dependencies = [ + "lazy_static 1.4.0", + "regex", +] + [[package]] name = "ucd-trie" version = "0.1.1" @@ -4965,6 +4983,13 @@ dependencies = [ "version_check 0.1.5", ] +[[package]] +name = "unicode-bdd" +version = "0.1.0" +dependencies = [ + "ucd-parse", +] + [[package]] name = "unicode-bidi" version = "0.3.4" @@ -4976,9 +5001,27 @@ dependencies = [ [[package]] name = "unicode-normalization" -version = "0.1.7" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b561e267b2326bb4cebfc0ef9e68355c7abe6c6f522aeac2f5bf95d56c59bdcf" +dependencies = [ + "smallvec 1.0.0", +] + +[[package]] +name = "unicode-script" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" +checksum = "5b2c5c29e805da6817f5af6a627d65adb045cebf05cccd5a3493d6109454391c" + +[[package]] +name = "unicode-security" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c49d35967fa037b881acc34ef717c38c4b5560eba10e3685271b3f530bb19634" +dependencies = [ + "unicode-script", +] [[package]] name = "unicode-segmentation" @@ -5086,9 +5129,9 @@ dependencies = [ [[package]] name = "vcpkg" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" +checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" [[package]] name = "vec_map" @@ -5150,12 +5193,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" - [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index a242f090fb..9d5c27b96d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ members = [ "src/tools/rustfmt", "src/tools/miri", "src/tools/rustdoc-themes", + "src/tools/unicode-table-generator", ] exclude = [ "build", diff --git a/LICENSE-APACHE b/LICENSE-APACHE index 16fe87b06e..1b5ec8b78e 100644 --- a/LICENSE-APACHE +++ b/LICENSE-APACHE @@ -174,28 +174,3 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/RELEASES.md b/RELEASES.md index 3e06f23c59..77d0bbe579 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,3 +1,108 @@ +Version 1.42.0 (2020-03-12) +========================== + +Language +-------- +- [You can now use the slice pattern syntax with subslices.][67712] e.g. + ```rust + fn foo(words: &[&str]) { + match words { + ["Hello", "World", "!", ..] => println!("Hello World!"), + ["Foo", "Bar", ..] => println!("Baz"), + rest => println!("{:?}", rest), + } + } + ``` +- [You can now use `#[repr(transparent)]` on univariant `enum`s.][68122] Meaning + that you can create an enum that has the exact layout and ABI of the type + it contains. +- [There are some *syntax-only* changes:][67131] + - `default` is syntactically allowed before items in `trait` definitions. + - Items in `impl`s (i.e. `const`s, `type`s, and `fn`s) may syntactically + leave out their bodies in favor of `;`. + - Bounds on associated types in `impl`s are now syntactically allowed + (e.g. `type Foo: Ord;`). + - `...` (the C-variadic type) may occur syntactically directly as the type of + any function parameter. + + These are still rejected *semantically*, so you will likely receive an error + but these changes can be seen and parsed by procedural macros and + conditional compilation. + +Compiler +-------- +- [Added tier 2\* support for `armv7a-none-eabi`.][68253] +- [Added tier 2 support for `riscv64gc-unknown-linux-gnu`.][68339] +- [`Option::{expect,unwrap}` and + `Result::{expect, expect_err, unwrap, unwrap_err}` now produce panic messages + pointing to the location where they were called, rather than + `core`'s internals. ][67887] + +\* Refer to Rust's [platform support page][forge-platform-support] for more +information on Rust's tiered platform support. + +Libraries +--------- +- [`iter::Empty` now implements `Send` and `Sync` for any `T`.][68348] +- [`Pin::{map_unchecked, map_unchecked_mut}` no longer require the return type + to implement `Sized`.][67935] +- [`io::Cursor` now derives `PartialEq` and `Eq`.][67233] +- [`Layout::new` is now `const`.][66254] +- [Added Standard Library support for `riscv64gc-unknown-linux-gnu`.][66899] + + +Stabilized APIs +--------------- +- [`CondVar::wait_while`] +- [`CondVar::wait_timeout_while`] +- [`DebugMap::key`] +- [`DebugMap::value`] +- [`ManuallyDrop::take`] +- [`matches!`] +- [`ptr::slice_from_raw_parts_mut`] +- [`ptr::slice_from_raw_parts`] + +Cargo +----- +- [You no longer need to include `extern crate proc_macro;` to be able to + `use proc_macro;` in the `2018` edition.][cargo/7700] + +Compatibility Notes +------------------- +- [`Error::description` has been deprecated, and its use will now produce a + warning.][66919] It's recommended to use `Display`/`to_string` instead. +- [`use $crate;` inside macros is now a hard error.][37390] The compiler + emitted forward compatibility warnings since Rust 1.14.0. +- [As previously announced, this release reduces the level of support for + 32-bit Apple targets to tier 3.][apple-32bit-drop]. This means that the + source code is still available to build, but the targets are no longer tested + and no release binary is distributed by the Rust project. Please refer to the + linked blog post for more information. + +[37390]: https://github.com/rust-lang/rust/issues/37390/ +[68253]: https://github.com/rust-lang/rust/pull/68253/ +[68348]: https://github.com/rust-lang/rust/pull/68348/ +[67935]: https://github.com/rust-lang/rust/pull/67935/ +[68339]: https://github.com/rust-lang/rust/pull/68339/ +[68122]: https://github.com/rust-lang/rust/pull/68122/ +[67712]: https://github.com/rust-lang/rust/pull/67712/ +[67887]: https://github.com/rust-lang/rust/pull/67887/ +[67131]: https://github.com/rust-lang/rust/pull/67131/ +[67233]: https://github.com/rust-lang/rust/pull/67233/ +[66899]: https://github.com/rust-lang/rust/pull/66899/ +[66919]: https://github.com/rust-lang/rust/pull/66919/ +[66254]: https://github.com/rust-lang/rust/pull/66254/ +[cargo/7700]: https://github.com/rust-lang/cargo/pull/7700 +[`DebugMap::key`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.key +[`DebugMap::value`]: https://doc.rust-lang.org/stable/std/fmt/struct.DebugMap.html#method.value +[`ManuallyDrop::take`]: https://doc.rust-lang.org/stable/std/mem/struct.ManuallyDrop.html#method.take +[`matches!`]: https://doc.rust-lang.org/stable/std/macro.matches.html +[`ptr::slice_from_raw_parts_mut`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts_mut.html +[`ptr::slice_from_raw_parts`]: https://doc.rust-lang.org/stable/std/ptr/fn.slice_from_raw_parts.html +[`CondVar::wait_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_while +[`CondVar::wait_timeout_while`]: https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html#method.wait_timeout_while + + Version 1.41.1 (2020-02-27) =========================== @@ -8,6 +113,7 @@ Version 1.41.1 (2020-02-27) [69225]: https://github.com/rust-lang/rust/issues/69225 [69145]: https://github.com/rust-lang/rust/pull/69145 + Version 1.41.0 (2020-01-30) =========================== @@ -218,7 +324,7 @@ Compatibility Notes - [Using `#[inline]` on function prototypes and consts now emits a warning under `unused_attribute` lint.][65294] Using `#[inline]` anywhere else inside traits or `extern` blocks now correctly emits a hard error. - + [65294]: https://github.com/rust-lang/rust/pull/65294/ [66103]: https://github.com/rust-lang/rust/pull/66103/ [65843]: https://github.com/rust-lang/rust/pull/65843/ @@ -5076,10 +5182,10 @@ Stabilized APIs --------------- * [`std::panic`] -* [`std::panic::catch_unwind`][] (renamed from `recover`) -* [`std::panic::resume_unwind`][] (renamed from `propagate`) -* [`std::panic::AssertUnwindSafe`][] (renamed from `AssertRecoverSafe`) -* [`std::panic::UnwindSafe`][] (renamed from `RecoverSafe`) +* [`std::panic::catch_unwind`] (renamed from `recover`) +* [`std::panic::resume_unwind`] (renamed from `propagate`) +* [`std::panic::AssertUnwindSafe`] (renamed from `AssertRecoverSafe`) +* [`std::panic::UnwindSafe`] (renamed from `RecoverSafe`) * [`str::is_char_boundary`] * [`<*const T>::as_ref`] * [`<*mut T>::as_ref`] @@ -5359,18 +5465,18 @@ Libraries --------- * Stabilized APIs: - * [`str::encode_utf16`][] (renamed from `utf16_units`) - * [`str::EncodeUtf16`][] (renamed from `Utf16Units`) + * [`str::encode_utf16`] (renamed from `utf16_units`) + * [`str::EncodeUtf16`] (renamed from `Utf16Units`) * [`Ref::map`] * [`RefMut::map`] * [`ptr::drop_in_place`] * [`time::Instant`] * [`time::SystemTime`] * [`Instant::now`] - * [`Instant::duration_since`][] (renamed from `duration_from_earlier`) + * [`Instant::duration_since`] (renamed from `duration_from_earlier`) * [`Instant::elapsed`] * [`SystemTime::now`] - * [`SystemTime::duration_since`][] (renamed from `duration_from_earlier`) + * [`SystemTime::duration_since`] (renamed from `duration_from_earlier`) * [`SystemTime::elapsed`] * Various `Add`/`Sub` impls for `Time` and `SystemTime` * [`SystemTimeError`] @@ -5557,8 +5663,8 @@ Libraries * Stabilized APIs * `Path` - * [`Path::strip_prefix`][] (renamed from relative_from) - * [`path::StripPrefixError`][] (new error type returned from strip_prefix) + * [`Path::strip_prefix`] (renamed from relative_from) + * [`path::StripPrefixError`] (new error type returned from strip_prefix) * `Ipv4Addr` * [`Ipv4Addr::is_loopback`] * [`Ipv4Addr::is_private`] @@ -5771,7 +5877,7 @@ Libraries * Stabilized APIs: [`Read::read_exact`], - [`ErrorKind::UnexpectedEof`][] (renamed from `UnexpectedEOF`), + [`ErrorKind::UnexpectedEof`] (renamed from `UnexpectedEOF`), [`fs::DirBuilder`], [`fs::DirBuilder::new`], [`fs::DirBuilder::recursive`], [`fs::DirBuilder::create`], [`os::unix::fs::DirBuilderExt`], @@ -5784,11 +5890,11 @@ Libraries [`collections::hash_set::HashSet::drain`], [`collections::binary_heap::Drain`], [`collections::binary_heap::BinaryHeap::drain`], - [`Vec::extend_from_slice`][] (renamed from `push_all`), + [`Vec::extend_from_slice`] (renamed from `push_all`), [`Mutex::get_mut`], [`Mutex::into_inner`], [`RwLock::get_mut`], [`RwLock::into_inner`], - [`Iterator::min_by_key`][] (renamed from `min_by`), - [`Iterator::max_by_key`][] (renamed from `max_by`). + [`Iterator::min_by_key`] (renamed from `min_by`), + [`Iterator::max_by_key`] (renamed from `max_by`). * The [core library][1.6co] is stable, as are most of its APIs. * [The `assert_eq!` macro supports arguments that don't implement `Sized`][1.6ae], such as arrays. In this way it behaves more like diff --git a/config.toml.example b/config.toml.example index 5152a6c988..c9e17337ee 100644 --- a/config.toml.example +++ b/config.toml.example @@ -14,6 +14,12 @@ # ============================================================================= [llvm] +# Indicates whether LLVM rebuild should be skipped when running bootstrap. If +# this is `false` then the compiler's LLVM will be rebuilt whenever the built +# version doesn't have the correct hash. If it is `true` then LLVM will never +# be rebuilt. The default value is `false`. +#skip-rebuild = false + # Indicates whether the LLVM build is a Release or Debug build #optimize = true @@ -132,6 +138,10 @@ # specified, use this rustc binary instead as the stage0 snapshot compiler. #rustc = "/path/to/bin/rustc" +# Instead of download the src/stage0.txt version of rustfmt specified, +# use this rustfmt binary instead as the stage0 snapshot rustfmt. +#rustfmt = "/path/to/bin/rustfmt" + # Flag to specify whether any documentation is built. If false, rustdoc and # friends will still be compiled but they will not be used to generate any # documentation. @@ -171,21 +181,23 @@ # Indicate whether the vendored sources are used for Rust dependencies or not #vendor = false -# Typically the build system will build the rust compiler twice. The second +# Typically the build system will build the Rust compiler twice. The second # compiler, however, will simply use its own libraries to link against. If you # would rather to perform a full bootstrap, compiling the compiler three times, # then you can set this option to true. You shouldn't ever need to set this # option to true. #full-bootstrap = false -# Enable a build of the extended rust tool set which is not only the compiler +# Enable a build of the extended Rust tool set which is not only the compiler # but also tools such as Cargo. This will also produce "combined installers" # which are used to install Rust and Cargo together. This is disabled by -# default. +# default. The `tools` option (immediately below) specifies which tools should +# be built if `extended = true`. #extended = false -# Installs chosen set of extended tools if enabled. By default builds all. -# If chosen tool failed to build the installation fails. +# Installs chosen set of extended tools if `extended = true`. By default builds all. +# If chosen tool failed to build the installation fails. If `extended = false`, this +# option is ignored. #tools = ["cargo", "rls", "clippy", "rustfmt", "analysis", "src"] # Verbosity level: 0 == not verbose, 1 == verbose, 2 == very verbose @@ -400,6 +412,13 @@ # Whether to verify generated LLVM IR #verify-llvm-ir = false +# Compile the compiler with a non-default ThinLTO import limit. This import +# limit controls the maximum size of functions imported by ThinLTO. Decreasing +# will make code compile faster at the expense of lower runtime performance. +# If `incremental` is set to true above, the import limit will default to 10 +# instead of LLVM's default of 100. +#thin-lto-import-instr-limit = 100 + # Map all debuginfo paths for libstd and crates to `/rust/$sha/$crate/...`, # generally only set for releases #remap-debuginfo = false diff --git a/git-commit-hash b/git-commit-hash index 0e1e3ce434..1a947ee947 100644 --- a/git-commit-hash +++ b/git-commit-hash @@ -1 +1 @@ -f3e1a954d2ead4e2fc197c7da7d71e6c61bad196 \ No newline at end of file +b8cedc00407a4c56a3bda1ed605c6fc166655447 \ No newline at end of file diff --git a/src/bootstrap/Cargo.toml b/src/bootstrap/Cargo.toml index c27c318f5a..c09f58cc59 100644 --- a/src/bootstrap/Cargo.toml +++ b/src/bootstrap/Cargo.toml @@ -47,7 +47,11 @@ serde_json = "1.0.2" toml = "0.5" lazy_static = "1.3.0" time = "0.1" -petgraph = "0.4.13" +ignore = "0.4.10" + +[target.'cfg(windows)'.dependencies.winapi] +version = "0.3" +features = ["fileapi", "ioapiset", "jobapi2", "handleapi", "winioctl"] [dev-dependencies] pretty_assertions = "0.5" diff --git a/src/bootstrap/bin/llvm-config-wrapper.rs b/src/bootstrap/bin/llvm-config-wrapper.rs index 5e3625eb22..cf77af44ff 100644 --- a/src/bootstrap/bin/llvm-config-wrapper.rs +++ b/src/bootstrap/bin/llvm-config-wrapper.rs @@ -2,8 +2,8 @@ // `src/bootstrap/native.rs` for why this is needed when compiling LLD. use std::env; -use std::process::{self, Stdio, Command}; use std::io::{self, Write}; +use std::process::{self, Command, Stdio}; fn main() { let real_llvm_config = env::var_os("LLVM_CONFIG_REAL").unwrap(); diff --git a/src/bootstrap/bin/main.rs b/src/bootstrap/bin/main.rs index 138b7f4b26..b67486c962 100644 --- a/src/bootstrap/bin/main.rs +++ b/src/bootstrap/bin/main.rs @@ -7,7 +7,7 @@ use std::env; -use bootstrap::{Config, Build}; +use bootstrap::{Build, Config}; fn main() { let args = env::args().skip(1).collect::>(); diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs index 475f2e9046..a34ec44566 100644 --- a/src/bootstrap/bin/rustc.rs +++ b/src/bootstrap/bin/rustc.rs @@ -27,9 +27,7 @@ fn main() { // Detect whether or not we're a build script depending on whether --target // is passed (a bit janky...) - let target = args.windows(2) - .find(|w| &*w[0] == "--target") - .and_then(|w| w[1].to_str()); + let target = args.windows(2).find(|w| &*w[0] == "--target").and_then(|w| w[1].to_str()); let version = args.iter().find(|w| &**w == "-vV"); let verbose = match env::var("RUSTC_VERBOSE") { @@ -57,19 +55,16 @@ fn main() { dylib_path.insert(0, PathBuf::from(&libdir)); let mut cmd = Command::new(rustc); - cmd.args(&args) - .env(bootstrap::util::dylib_path_var(), - env::join_paths(&dylib_path).unwrap()); + cmd.args(&args).env(bootstrap::util::dylib_path_var(), env::join_paths(&dylib_path).unwrap()); // Get the name of the crate we're compiling, if any. - let crate_name = args.windows(2) - .find(|args| args[0] == "--crate-name") - .and_then(|args| args[1].to_str()); + let crate_name = + args.windows(2).find(|args| args[0] == "--crate-name").and_then(|args| args[1].to_str()); if let Some(crate_name) = crate_name { if let Some(target) = env::var_os("RUSTC_TIME") { - if target == "all" || - target.into_string().unwrap().split(",").any(|c| c.trim() == crate_name) + if target == "all" + || target.into_string().unwrap().split(",").any(|c| c.trim() == crate_name) { cmd.arg("-Ztime"); } @@ -101,15 +96,22 @@ fn main() { // `compiler_builtins` are unconditionally compiled with panic=abort to // workaround undefined references to `rust_eh_unwind_resume` generated // otherwise, see issue https://github.com/rust-lang/rust/issues/43095. - if crate_name == Some("panic_abort") || - crate_name == Some("compiler_builtins") && stage != "0" { + if crate_name == Some("panic_abort") + || crate_name == Some("compiler_builtins") && stage != "0" + { cmd.arg("-C").arg("panic=abort"); } // Set various options from config.toml to configure how we're building // code. let debug_assertions = match env::var("RUSTC_DEBUG_ASSERTIONS") { - Ok(s) => if s == "true" { "y" } else { "n" }, + Ok(s) => { + if s == "true" { + "y" + } else { + "n" + } + } Err(..) => "n", }; @@ -178,17 +180,17 @@ fn main() { if env::var_os("RUSTC_PRINT_STEP_TIMINGS").is_some() { if let Some(crate_name) = crate_name { let start = Instant::now(); - let status = cmd - .status() - .unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd)); + let status = cmd.status().unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd)); let dur = start.elapsed(); let is_test = args.iter().any(|a| a == "--test"); - eprintln!("[RUSTC-TIMING] {} test:{} {}.{:03}", - crate_name, - is_test, - dur.as_secs(), - dur.subsec_nanos() / 1_000_000); + eprintln!( + "[RUSTC-TIMING] {} test:{} {}.{:03}", + crate_name, + is_test, + dur.as_secs(), + dur.subsec_nanos() / 1_000_000 + ); match status.code() { Some(i) => std::process::exit(i), diff --git a/src/bootstrap/bin/rustdoc.rs b/src/bootstrap/bin/rustdoc.rs index 6937fb922d..8c8b33a4e4 100644 --- a/src/bootstrap/bin/rustdoc.rs +++ b/src/bootstrap/bin/rustdoc.rs @@ -3,9 +3,9 @@ //! See comments in `src/bootstrap/rustc.rs` for more information. use std::env; -use std::process::Command; -use std::path::PathBuf; use std::ffi::OsString; +use std::path::PathBuf; +use std::process::Command; fn main() { let args = env::args_os().skip(1).collect::>(); @@ -35,8 +35,7 @@ fn main() { .arg("dox") .arg("--sysroot") .arg(&sysroot) - .env(bootstrap::util::dylib_path_var(), - env::join_paths(&dylib_path).unwrap()); + .env(bootstrap::util::dylib_path_var(), env::join_paths(&dylib_path).unwrap()); // Force all crates compiled by this compiler to (a) be unstable and (b) // allow the `rustc_private` feature to link to other unstable crates @@ -55,8 +54,7 @@ fn main() { if let Some(version) = env::var_os("RUSTDOC_CRATE_VERSION") { // This "unstable-options" can be removed when `--crate-version` is stabilized if !has_unstable { - cmd.arg("-Z") - .arg("unstable-options"); + cmd.arg("-Z").arg("unstable-options"); } cmd.arg("--crate-version").arg(version); has_unstable = true; @@ -66,8 +64,7 @@ fn main() { if let Some(_) = env::var_os("RUSTDOC_GENERATE_REDIRECT_PAGES") { // This "unstable-options" can be removed when `--generate-redirect-pages` is stabilized if !has_unstable { - cmd.arg("-Z") - .arg("unstable-options"); + cmd.arg("-Z").arg("unstable-options"); } cmd.arg("--generate-redirect-pages"); has_unstable = true; @@ -77,8 +74,7 @@ fn main() { if let Some(ref x) = env::var_os("RUSTDOC_RESOURCE_SUFFIX") { // This "unstable-options" can be removed when `--resource-suffix` is stabilized if !has_unstable { - cmd.arg("-Z") - .arg("unstable-options"); + cmd.arg("-Z").arg("unstable-options"); } cmd.arg("--resource-suffix").arg(x); } diff --git a/src/bootstrap/bin/sccache-plus-cl.rs b/src/bootstrap/bin/sccache-plus-cl.rs index f40eec83dd..554c2dd4d8 100644 --- a/src/bootstrap/bin/sccache-plus-cl.rs +++ b/src/bootstrap/bin/sccache-plus-cl.rs @@ -8,12 +8,12 @@ fn main() { env::set_var("CXX", env::var_os("SCCACHE_CXX").unwrap()); let mut cfg = cc::Build::new(); cfg.cargo_metadata(false) - .out_dir("/") - .target(&target) - .host(&target) - .opt_level(0) - .warnings(false) - .debug(false); + .out_dir("/") + .target(&target) + .host(&target) + .opt_level(0) + .warnings(false) + .debug(false); let compiler = cfg.get_compiler(); // Invoke sccache with said compiler diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index bb16941488..6737086f6e 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -322,6 +322,7 @@ class RustBuild(object): self.date = '' self._download_url = '' self.rustc_channel = '' + self.rustfmt_channel = '' self.build = '' self.build_dir = os.path.join(os.getcwd(), "build") self.clean = False @@ -344,6 +345,7 @@ class RustBuild(object): """ rustc_channel = self.rustc_channel cargo_channel = self.cargo_channel + rustfmt_channel = self.rustfmt_channel def support_xz(): try: @@ -393,13 +395,29 @@ class RustBuild(object): with output(self.cargo_stamp()) as cargo_stamp: cargo_stamp.write(self.date) - def _download_stage0_helper(self, filename, pattern, tarball_suffix): + if self.rustfmt() and self.rustfmt().startswith(self.bin_root()) and ( + not os.path.exists(self.rustfmt()) + or self.program_out_of_date(self.rustfmt_stamp()) + ): + if rustfmt_channel: + tarball_suffix = '.tar.xz' if support_xz() else '.tar.gz' + [channel, date] = rustfmt_channel.split('-', 1) + filename = "rustfmt-{}-{}{}".format(channel, self.build, tarball_suffix) + self._download_stage0_helper(filename, "rustfmt-preview", tarball_suffix, date) + self.fix_executable("{}/bin/rustfmt".format(self.bin_root())) + self.fix_executable("{}/bin/cargo-fmt".format(self.bin_root())) + with output(self.rustfmt_stamp()) as rustfmt_stamp: + rustfmt_stamp.write(self.date) + + def _download_stage0_helper(self, filename, pattern, tarball_suffix, date=None): + if date is None: + date = self.date cache_dst = os.path.join(self.build_dir, "cache") - rustc_cache = os.path.join(cache_dst, self.date) + rustc_cache = os.path.join(cache_dst, date) if not os.path.exists(rustc_cache): os.makedirs(rustc_cache) - url = "{}/dist/{}".format(self._download_url, self.date) + url = "{}/dist/{}".format(self._download_url, date) tarball = os.path.join(rustc_cache, filename) if not os.path.exists(tarball): get("{}/{}".format(url, filename), tarball, verbose=self.verbose) @@ -493,6 +511,16 @@ class RustBuild(object): """ return os.path.join(self.bin_root(), '.cargo-stamp') + def rustfmt_stamp(self): + """Return the path for .rustfmt-stamp + + >>> rb = RustBuild() + >>> rb.build_dir = "build" + >>> rb.rustfmt_stamp() == os.path.join("build", "stage0", ".rustfmt-stamp") + True + """ + return os.path.join(self.bin_root(), '.rustfmt-stamp') + def program_out_of_date(self, stamp_path): """Check if the given program stamp is out of date""" if not os.path.exists(stamp_path) or self.clean: @@ -565,6 +593,12 @@ class RustBuild(object): """Return config path for rustc""" return self.program_config('rustc') + def rustfmt(self): + """Return config path for rustfmt""" + if not self.rustfmt_channel: + return None + return self.program_config('rustfmt') + def program_config(self, program): """Return config path for the given program @@ -868,6 +902,9 @@ def bootstrap(help_triggered): build.rustc_channel = data['rustc'] build.cargo_channel = data['cargo'] + if "rustfmt" in data: + build.rustfmt_channel = data['rustfmt'] + if 'dev' in data: build.set_dev_environment() else: @@ -895,6 +932,8 @@ def bootstrap(help_triggered): env["RUSTC_BOOTSTRAP"] = '1' env["CARGO"] = build.cargo() env["RUSTC"] = build.rustc() + if build.rustfmt(): + env["RUSTFMT"] = build.rustfmt() run(args, env=env, verbose=build.verbose) diff --git a/src/bootstrap/bootstrap_test.py b/src/bootstrap/bootstrap_test.py index 689298f32d..0e941e1367 100644 --- a/src/bootstrap/bootstrap_test.py +++ b/src/bootstrap/bootstrap_test.py @@ -20,14 +20,14 @@ class Stage0DataTestCase(unittest.TestCase): os.mkdir(os.path.join(self.rust_root, "src")) with open(os.path.join(self.rust_root, "src", "stage0.txt"), "w") as stage0: - stage0.write("#ignore\n\ndate: 2017-06-15\nrustc: beta\ncargo: beta") + stage0.write("#ignore\n\ndate: 2017-06-15\nrustc: beta\ncargo: beta\nrustfmt: beta") def tearDown(self): rmtree(self.rust_root) def test_stage0_data(self): """Extract data from stage0.txt""" - expected = {"date": "2017-06-15", "rustc": "beta", "cargo": "beta"} + expected = {"date": "2017-06-15", "rustc": "beta", "cargo": "beta", "rustfmt": "beta"} data = bootstrap.stage0_data(self.rust_root) self.assertDictEqual(data, expected) diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index 8b0ad169cf..d9c894aa9c 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -1,7 +1,6 @@ use std::any::Any; use std::cell::{Cell, RefCell}; use std::collections::BTreeSet; -use std::collections::HashMap; use std::env; use std::ffi::OsStr; use std::fmt::Debug; @@ -25,13 +24,10 @@ use crate::native; use crate::test; use crate::tool; use crate::util::{self, add_lib_path, exe, libdir}; -use crate::{Build, DocTests, Mode, GitRepo}; +use crate::{Build, DocTests, GitRepo, Mode}; pub use crate::Compiler; -use petgraph::graph::NodeIndex; -use petgraph::Graph; - pub struct Builder<'a> { pub build: &'a Build, pub top_stage: u32, @@ -40,9 +36,6 @@ pub struct Builder<'a> { stack: RefCell>>, time_spent_on_dependencies: Cell, pub paths: Vec, - graph_nodes: RefCell>, - graph: RefCell>, - parent: Cell>, } impl<'a> Deref for Builder<'a> { @@ -129,11 +122,7 @@ impl PathSet { fn path(&self, builder: &Builder<'_>) -> PathBuf { match self { - PathSet::Set(set) => set - .iter() - .next() - .unwrap_or(&builder.build.src) - .to_path_buf(), + PathSet::Set(set) => set.iter().next().unwrap_or(&builder.build.src).to_path_buf(), PathSet::Suite(path) => PathBuf::from(path), } } @@ -187,10 +176,8 @@ impl StepDescription { } fn run(v: &[StepDescription], builder: &Builder<'_>, paths: &[PathBuf]) { - let should_runs = v - .iter() - .map(|desc| (desc.should_run)(ShouldRun::new(builder))) - .collect::>(); + let should_runs = + v.iter().map(|desc| (desc.should_run)(ShouldRun::new(builder))).collect::>(); // sanity checks on rules for (desc, should_run) in v.iter().zip(&should_runs) { @@ -287,8 +274,7 @@ impl<'a> ShouldRun<'a> { // multiple aliases for the same job pub fn paths(mut self, paths: &[&str]) -> Self { - self.paths - .insert(PathSet::Set(paths.iter().map(PathBuf::from).collect())); + self.paths.insert(PathSet::Set(paths.iter().map(PathBuf::from).collect())); self } @@ -321,6 +307,7 @@ pub enum Kind { Check, Clippy, Fix, + Format, Test, Bench, Dist, @@ -356,15 +343,14 @@ impl<'a> Builder<'a> { tool::Rustdoc, tool::Clippy, native::Llvm, + native::Sanitizers, tool::Rustfmt, tool::Miri, native::Lld ), - Kind::Check | Kind::Clippy | Kind::Fix => describe!( - check::Std, - check::Rustc, - check::Rustdoc - ), + Kind::Check | Kind::Clippy | Kind::Fix | Kind::Format => { + describe!(check::Std, check::Rustc, check::Rustdoc) + } Kind::Test => describe!( crate::toolstate::ToolStateCheck, test::Tidy, @@ -490,9 +476,6 @@ impl<'a> Builder<'a> { stack: RefCell::new(Vec::new()), time_spent_on_dependencies: Cell::new(Duration::new(0, 0)), paths: vec![], - graph_nodes: RefCell::new(HashMap::new()), - graph: RefCell::new(Graph::new()), - parent: Cell::new(None), }; let builder = &builder; @@ -524,7 +507,7 @@ impl<'a> Builder<'a> { Subcommand::Bench { ref paths, .. } => (Kind::Bench, &paths[..]), Subcommand::Dist { ref paths } => (Kind::Dist, &paths[..]), Subcommand::Install { ref paths } => (Kind::Install, &paths[..]), - Subcommand::Clean { .. } => panic!(), + Subcommand::Format { .. } | Subcommand::Clean { .. } => panic!(), }; let builder = Builder { @@ -535,17 +518,13 @@ impl<'a> Builder<'a> { stack: RefCell::new(Vec::new()), time_spent_on_dependencies: Cell::new(Duration::new(0, 0)), paths: paths.to_owned(), - graph_nodes: RefCell::new(HashMap::new()), - graph: RefCell::new(Graph::new()), - parent: Cell::new(None), }; builder } - pub fn execute_cli(&self) -> Graph { + pub fn execute_cli(&self) { self.run_step_descriptions(&Builder::get_step_descriptions(self.kind), &self.paths); - self.graph.borrow().clone() } pub fn default_doc(&self, paths: Option<&[PathBuf]>) { @@ -562,9 +541,7 @@ impl<'a> Builder<'a> { /// obtained through this function, since it ensures that they are valid /// (i.e., built and assembled). pub fn compiler(&self, stage: u32, host: Interned) -> Compiler { - self.ensure(compile::Assemble { - target_compiler: Compiler { stage, host }, - }) + self.ensure(compile::Assemble { target_compiler: Compiler { stage, host } }) } /// Similar to `compiler`, except handles the full-bootstrap option to @@ -640,9 +617,10 @@ impl<'a> Builder<'a> { self.rustc_snapshot_libdir() } else { match self.config.libdir_relative() { - Some(relative_libdir) if compiler.stage >= 1 - => self.sysroot(compiler).join(relative_libdir), - _ => self.sysroot(compiler).join(libdir(&compiler.host)) + Some(relative_libdir) if compiler.stage >= 1 => { + self.sysroot(compiler).join(relative_libdir) + } + _ => self.sysroot(compiler).join(libdir(&compiler.host)), } } } @@ -657,9 +635,8 @@ impl<'a> Builder<'a> { libdir(&self.config.build).as_ref() } else { match self.config.libdir_relative() { - Some(relative_libdir) if compiler.stage >= 1 - => relative_libdir, - _ => libdir(&compiler.host).as_ref() + Some(relative_libdir) if compiler.stage >= 1 => relative_libdir, + _ => libdir(&compiler.host).as_ref(), } } } @@ -670,9 +647,8 @@ impl<'a> Builder<'a> { /// For example this returns `lib` on Unix and Windows. pub fn sysroot_libdir_relative(&self, compiler: Compiler) -> &Path { match self.config.libdir_relative() { - Some(relative_libdir) if compiler.stage >= 1 - => relative_libdir, - _ => Path::new("lib") + Some(relative_libdir) if compiler.stage >= 1 => relative_libdir, + _ => Path::new("lib"), } } @@ -694,9 +670,7 @@ impl<'a> Builder<'a> { if compiler.is_snapshot(self) { self.initial_rustc.clone() } else { - self.sysroot(compiler) - .join("bin") - .join(exe("rustc", &compiler.host)) + self.sysroot(compiler).join("bin").join(exe("rustc", &compiler.host)) } } @@ -753,17 +727,10 @@ impl<'a> Builder<'a> { self.clear_if_dirty(&my_out, &rustdoc); } - cargo - .env("CARGO_TARGET_DIR", out_dir) - .arg(cmd) - .arg("-Zconfig-profile"); + cargo.env("CARGO_TARGET_DIR", &out_dir).arg(cmd).arg("-Zconfig-profile"); let profile_var = |name: &str| { - let profile = if self.config.rust_optimize { - "RELEASE" - } else { - "DEV" - }; + let profile = if self.config.rust_optimize { "RELEASE" } else { "DEV" }; format!("CARGO_PROFILE_{}_{}", profile, name) }; @@ -775,8 +742,7 @@ impl<'a> Builder<'a> { } if cmd != "install" { - cargo.arg("--target") - .arg(target); + cargo.arg("--target").arg(target); } else { assert_eq!(target, compiler.host); } @@ -814,14 +780,14 @@ impl<'a> Builder<'a> { } match mode { - Mode::Std | Mode::ToolBootstrap | Mode::ToolStd => {}, + Mode::Std | Mode::ToolBootstrap | Mode::ToolStd => {} Mode::Rustc | Mode::Codegen | Mode::ToolRustc => { // Build proc macros both for the host and the target if target != compiler.host && cmd != "check" { cargo.arg("-Zdual-proc-macros"); rustflags.arg("-Zdual-proc-macros"); } - }, + } } // This tells Cargo (and in turn, rustc) to output more complete @@ -897,13 +863,21 @@ impl<'a> Builder<'a> { assert!(!use_snapshot || stage == 0 || self.local_rebuild); let maybe_sysroot = self.sysroot(compiler); - let sysroot = if use_snapshot { - self.rustc_snapshot_sysroot() - } else { - &maybe_sysroot - }; + let sysroot = if use_snapshot { self.rustc_snapshot_sysroot() } else { &maybe_sysroot }; let libdir = self.rustc_libdir(compiler); + // Clear the output directory if the real rustc we're using has changed; + // Cargo cannot detect this as it thinks rustc is bootstrap/debug/rustc. + // + // Avoid doing this during dry run as that usually means the relevant + // compiler is not yet linked/copied properly. + // + // Only clear out the directory if we're compiling std; otherwise, we + // should let Cargo take care of things for us (via depdep info) + if !self.config.dry_run && mode == Mode::Std && cmd == "build" { + self.clear_if_dirty(&out_dir, &self.rustc(compiler)); + } + // Customize the compiler we're running. Specify the compiler to cargo // as our shim and then pass it some various options used to configure // how the actual compiler itself is called. @@ -915,10 +889,7 @@ impl<'a> Builder<'a> { .env("RUSTC", self.out.join("bootstrap/debug/rustc")) .env("RUSTC_REAL", self.rustc(compiler)) .env("RUSTC_STAGE", stage.to_string()) - .env( - "RUSTC_DEBUG_ASSERTIONS", - self.config.rust_debug_assertions.to_string(), - ) + .env("RUSTC_DEBUG_ASSERTIONS", self.config.rust_debug_assertions.to_string()) .env("RUSTC_SYSROOT", &sysroot) .env("RUSTC_LIBDIR", &libdir) .env("RUSTDOC", self.out.join("bootstrap/debug/rustdoc")) @@ -961,7 +932,6 @@ impl<'a> Builder<'a> { // to change a flag in a binary? if self.config.rust_rpath && util::use_host_linker(&target) { let rpath = if target.contains("apple") { - // Note that we need to take one extra step on macOS to also pass // `-Wl,-instal_name,@rpath/...` to get things to work right. To // do that we pass a weird flag to the compiler to get it to do @@ -993,8 +963,9 @@ impl<'a> Builder<'a> { let debuginfo_level = match mode { Mode::Rustc | Mode::Codegen => self.config.rust_debuginfo_level_rustc, Mode::Std => self.config.rust_debuginfo_level_std, - Mode::ToolBootstrap | Mode::ToolStd | - Mode::ToolRustc => self.config.rust_debuginfo_level_tools, + Mode::ToolBootstrap | Mode::ToolStd | Mode::ToolRustc => { + self.config.rust_debuginfo_level_tools + } }; cargo.env(profile_var("DEBUG"), debuginfo_level.to_string()); @@ -1115,14 +1086,11 @@ impl<'a> Builder<'a> { cargo.env(format!("CC_{}", target), &cc); let cflags = self.cflags(target, GitRepo::Rustc).join(" "); - cargo - .env(format!("CFLAGS_{}", target), cflags.clone()); + cargo.env(format!("CFLAGS_{}", target), cflags.clone()); if let Some(ar) = self.ar(target) { let ranlib = format!("{} s", ar.display()); - cargo - .env(format!("AR_{}", target), ar) - .env(format!("RANLIB_{}", target), ranlib); + cargo.env(format!("AR_{}", target), ar).env(format!("RANLIB_{}", target), ranlib); } if let Ok(cxx) = self.cxx(target) { @@ -1133,15 +1101,14 @@ impl<'a> Builder<'a> { } } - if mode == Mode::Std - && self.config.extended - && compiler.is_final_stage(self) - { + if mode == Mode::Std && self.config.extended && compiler.is_final_stage(self) { rustflags.arg("-Zsave-analysis"); - cargo.env("RUST_SAVE_ANALYSIS_CONFIG", - "{\"output_file\": null,\"full_docs\": false,\ + cargo.env( + "RUST_SAVE_ANALYSIS_CONFIG", + "{\"output_file\": null,\"full_docs\": false,\ \"pub_only\": true,\"reachable_only\": false,\ - \"distro_crate\": true,\"signatures\": false,\"borrow_data\": false}"); + \"distro_crate\": true,\"signatures\": false,\"borrow_data\": false}", + ); } // For `cargo doc` invocations, make rustdoc print the Rust version into the docs @@ -1195,8 +1162,7 @@ impl<'a> Builder<'a> { } match (mode, self.config.rust_codegen_units_std, self.config.rust_codegen_units) { - (Mode::Std, Some(n), _) | - (_, _, Some(n)) => { + (Mode::Std, Some(n), _) | (_, _, Some(n)) => { cargo.env(profile_var("CODEGEN_UNITS"), n.to_string()); } _ => { @@ -1230,10 +1196,22 @@ impl<'a> Builder<'a> { rustflags.arg("-Cprefer-dynamic"); } - Cargo { - command: cargo, - rustflags, + // When building incrementally we default to a lower ThinLTO import limit + // (unless explicitly specified otherwise). This will produce a somewhat + // slower code but give way better compile times. + { + let limit = match self.config.rust_thin_lto_import_instr_limit { + Some(limit) => Some(limit), + None if self.config.incremental => Some(10), + _ => None, + }; + + if let Some(limit) = limit { + rustflags.arg(&format!("-Cllvm-args=-import-instr-limit={}", limit)); + } } + + Cargo { command: cargo, rustflags } } /// Ensure that a given step is built, returning its output. This will @@ -1244,10 +1222,7 @@ impl<'a> Builder<'a> { let mut stack = self.stack.borrow_mut(); for stack_step in stack.iter() { // should skip - if stack_step - .downcast_ref::() - .map_or(true, |stack_step| *stack_step != step) - { + if stack_step.downcast_ref::().map_or(true, |stack_step| *stack_step != step) { continue; } let mut out = String::new(); @@ -1260,41 +1235,12 @@ impl<'a> Builder<'a> { if let Some(out) = self.cache.get(&step) { self.verbose(&format!("{}c {:?}", " ".repeat(stack.len()), step)); - { - let mut graph = self.graph.borrow_mut(); - let parent = self.parent.get(); - let us = *self - .graph_nodes - .borrow_mut() - .entry(format!("{:?}", step)) - .or_insert_with(|| graph.add_node(format!("{:?}", step))); - if let Some(parent) = parent { - graph.add_edge(parent, us, false); - } - } - return out; } self.verbose(&format!("{}> {:?}", " ".repeat(stack.len()), step)); stack.push(Box::new(step.clone())); } - let prev_parent = self.parent.get(); - - { - let mut graph = self.graph.borrow_mut(); - let parent = self.parent.get(); - let us = *self - .graph_nodes - .borrow_mut() - .entry(format!("{:?}", step)) - .or_insert_with(|| graph.add_node(format!("{:?}", step))); - self.parent.set(Some(us)); - if let Some(parent) = parent { - graph.add_edge(parent, us, true); - } - } - let (out, dur) = { let start = Instant::now(); let zero = Duration::new(0, 0); @@ -1305,8 +1251,6 @@ impl<'a> Builder<'a> { (out, dur - deps) }; - self.parent.set(prev_parent); - if self.config.print_step_timings && dur > Duration::from_millis(100) { println!( "[TIMING] {:?} -- {}.{:03}", @@ -1321,11 +1265,7 @@ impl<'a> Builder<'a> { let cur_step = stack.pop().expect("step stack empty"); assert_eq!(cur_step.downcast_ref(), Some(&step)); } - self.verbose(&format!( - "{}< {:?}", - " ".repeat(self.stack.borrow().len()), - step - )); + self.verbose(&format!("{}< {:?}", " ".repeat(self.stack.borrow().len()), step)); self.cache.put(step, out.clone()); out } @@ -1388,7 +1328,9 @@ impl Cargo { } pub fn args(&mut self, args: I) -> &mut Cargo - where I: IntoIterator, S: AsRef + where + I: IntoIterator, + S: AsRef, { for arg in args { self.arg(arg.as_ref()); diff --git a/src/bootstrap/builder/tests.rs b/src/bootstrap/builder/tests.rs index b9d97fb8b7..5fefb97286 100644 --- a/src/bootstrap/builder/tests.rs +++ b/src/bootstrap/builder/tests.rs @@ -11,12 +11,10 @@ fn configure(host: &[&str], target: &[&str]) -> Config { config.skip_only_host_steps = false; config.dry_run = true; // try to avoid spurious failures in dist where we create/delete each others file - let dir = config.out.join("tmp-rustbuild-tests").join( - &thread::current() - .name() - .unwrap_or("unknown") - .replace(":", "-"), - ); + let dir = config + .out + .join("tmp-rustbuild-tests") + .join(&thread::current().name().unwrap_or("unknown").replace(":", "-")); t!(fs::create_dir_all(&dir)); config.out = dir; config.build = INTERNER.intern_str("A"); @@ -46,26 +44,15 @@ fn dist_baseline() { let a = INTERNER.intern_str("A"); - assert_eq!( - first(builder.cache.all::()), - &[dist::Docs { host: a },] - ); - assert_eq!( - first(builder.cache.all::()), - &[dist::Mingw { host: a },] - ); + assert_eq!(first(builder.cache.all::()), &[dist::Docs { host: a },]); + assert_eq!(first(builder.cache.all::()), &[dist::Mingw { host: a },]); assert_eq!( first(builder.cache.all::()), - &[dist::Rustc { - compiler: Compiler { host: a, stage: 2 } - },] + &[dist::Rustc { compiler: Compiler { host: a, stage: 2 } },] ); assert_eq!( first(builder.cache.all::()), - &[dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: a, - },] + &[dist::Std { compiler: Compiler { host: a, stage: 1 }, target: a },] ); assert_eq!(first(builder.cache.all::()), &[dist::Src]); } @@ -81,10 +68,7 @@ fn dist_with_targets() { assert_eq!( first(builder.cache.all::()), - &[ - dist::Docs { host: a }, - dist::Docs { host: b }, - ] + &[dist::Docs { host: a }, dist::Docs { host: b },] ); assert_eq!( first(builder.cache.all::()), @@ -92,21 +76,13 @@ fn dist_with_targets() { ); assert_eq!( first(builder.cache.all::()), - &[dist::Rustc { - compiler: Compiler { host: a, stage: 2 } - },] + &[dist::Rustc { compiler: Compiler { host: a, stage: 2 } },] ); assert_eq!( first(builder.cache.all::()), &[ - dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - dist::Std { - compiler: Compiler { host: a, stage: 2 }, - target: b, - }, + dist::Std { compiler: Compiler { host: a, stage: 1 }, target: a }, + dist::Std { compiler: Compiler { host: a, stage: 2 }, target: b }, ] ); assert_eq!(first(builder.cache.all::()), &[dist::Src]); @@ -123,10 +99,7 @@ fn dist_with_hosts() { assert_eq!( first(builder.cache.all::()), - &[ - dist::Docs { host: a }, - dist::Docs { host: b }, - ] + &[dist::Docs { host: a }, dist::Docs { host: b },] ); assert_eq!( first(builder.cache.all::()), @@ -135,25 +108,15 @@ fn dist_with_hosts() { assert_eq!( first(builder.cache.all::()), &[ - dist::Rustc { - compiler: Compiler { host: a, stage: 2 } - }, - dist::Rustc { - compiler: Compiler { host: b, stage: 2 } - }, + dist::Rustc { compiler: Compiler { host: a, stage: 2 } }, + dist::Rustc { compiler: Compiler { host: b, stage: 2 } }, ] ); assert_eq!( first(builder.cache.all::()), &[ - dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, + dist::Std { compiler: Compiler { host: a, stage: 1 }, target: a }, + dist::Std { compiler: Compiler { host: a, stage: 1 }, target: b }, ] ); assert_eq!(first(builder.cache.all::()), &[dist::Src]); @@ -172,23 +135,13 @@ fn dist_only_cross_host() { assert_eq!( first(builder.cache.all::()), - &[ - dist::Rustc { - compiler: Compiler { host: b, stage: 2 } - }, - ] + &[dist::Rustc { compiler: Compiler { host: b, stage: 2 } },] ); assert_eq!( first(builder.cache.all::()), &[ - compile::Rustc { - compiler: Compiler { host: a, stage: 0 }, - target: a, - }, - compile::Rustc { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, + compile::Rustc { compiler: Compiler { host: a, stage: 0 }, target: a }, + compile::Rustc { compiler: Compiler { host: a, stage: 1 }, target: b }, ] ); } @@ -205,46 +158,25 @@ fn dist_with_targets_and_hosts() { assert_eq!( first(builder.cache.all::()), - &[ - dist::Docs { host: a }, - dist::Docs { host: b }, - dist::Docs { host: c }, - ] + &[dist::Docs { host: a }, dist::Docs { host: b }, dist::Docs { host: c },] ); assert_eq!( first(builder.cache.all::()), - &[ - dist::Mingw { host: a }, - dist::Mingw { host: b }, - dist::Mingw { host: c }, - ] + &[dist::Mingw { host: a }, dist::Mingw { host: b }, dist::Mingw { host: c },] ); assert_eq!( first(builder.cache.all::()), &[ - dist::Rustc { - compiler: Compiler { host: a, stage: 2 } - }, - dist::Rustc { - compiler: Compiler { host: b, stage: 2 } - }, + dist::Rustc { compiler: Compiler { host: a, stage: 2 } }, + dist::Rustc { compiler: Compiler { host: b, stage: 2 } }, ] ); assert_eq!( first(builder.cache.all::()), &[ - dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, - dist::Std { - compiler: Compiler { host: a, stage: 2 }, - target: c, - }, + dist::Std { compiler: Compiler { host: a, stage: 1 }, target: a }, + dist::Std { compiler: Compiler { host: a, stage: 1 }, target: b }, + dist::Std { compiler: Compiler { host: a, stage: 2 }, target: c }, ] ); assert_eq!(first(builder.cache.all::()), &[dist::Src]); @@ -264,36 +196,19 @@ fn dist_with_target_flag() { assert_eq!( first(builder.cache.all::()), - &[ - dist::Docs { host: a }, - dist::Docs { host: b }, - dist::Docs { host: c }, - ] + &[dist::Docs { host: a }, dist::Docs { host: b }, dist::Docs { host: c },] ); assert_eq!( first(builder.cache.all::()), - &[ - dist::Mingw { host: a }, - dist::Mingw { host: b }, - dist::Mingw { host: c }, - ] + &[dist::Mingw { host: a }, dist::Mingw { host: b }, dist::Mingw { host: c },] ); assert_eq!(first(builder.cache.all::()), &[]); assert_eq!( first(builder.cache.all::()), &[ - dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, - dist::Std { - compiler: Compiler { host: a, stage: 2 }, - target: c, - }, + dist::Std { compiler: Compiler { host: a, stage: 1 }, target: a }, + dist::Std { compiler: Compiler { host: a, stage: 1 }, target: b }, + dist::Std { compiler: Compiler { host: a, stage: 2 }, target: c }, ] ); assert_eq!(first(builder.cache.all::()), &[]); @@ -310,10 +225,7 @@ fn dist_with_same_targets_and_hosts() { assert_eq!( first(builder.cache.all::()), - &[ - dist::Docs { host: a }, - dist::Docs { host: b }, - ] + &[dist::Docs { host: a }, dist::Docs { host: b },] ); assert_eq!( first(builder.cache.all::()), @@ -322,68 +234,35 @@ fn dist_with_same_targets_and_hosts() { assert_eq!( first(builder.cache.all::()), &[ - dist::Rustc { - compiler: Compiler { host: a, stage: 2 } - }, - dist::Rustc { - compiler: Compiler { host: b, stage: 2 } - }, + dist::Rustc { compiler: Compiler { host: a, stage: 2 } }, + dist::Rustc { compiler: Compiler { host: b, stage: 2 } }, ] ); assert_eq!( first(builder.cache.all::()), &[ - dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - dist::Std { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, + dist::Std { compiler: Compiler { host: a, stage: 1 }, target: a }, + dist::Std { compiler: Compiler { host: a, stage: 1 }, target: b }, ] ); assert_eq!(first(builder.cache.all::()), &[dist::Src]); assert_eq!( first(builder.cache.all::()), &[ - compile::Std { - compiler: Compiler { host: a, stage: 0 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: a, stage: 2 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, - compile::Std { - compiler: Compiler { host: a, stage: 2 }, - target: b, - }, + compile::Std { compiler: Compiler { host: a, stage: 0 }, target: a }, + compile::Std { compiler: Compiler { host: a, stage: 1 }, target: a }, + compile::Std { compiler: Compiler { host: a, stage: 2 }, target: a }, + compile::Std { compiler: Compiler { host: a, stage: 1 }, target: b }, + compile::Std { compiler: Compiler { host: a, stage: 2 }, target: b }, ] ); assert_eq!( first(builder.cache.all::()), &[ - compile::Assemble { - target_compiler: Compiler { host: a, stage: 0 }, - }, - compile::Assemble { - target_compiler: Compiler { host: a, stage: 1 }, - }, - compile::Assemble { - target_compiler: Compiler { host: a, stage: 2 }, - }, - compile::Assemble { - target_compiler: Compiler { host: b, stage: 2 }, - }, + compile::Assemble { target_compiler: Compiler { host: a, stage: 0 } }, + compile::Assemble { target_compiler: Compiler { host: a, stage: 1 } }, + compile::Assemble { target_compiler: Compiler { host: a, stage: 2 } }, + compile::Assemble { target_compiler: Compiler { host: b, stage: 2 } }, ] ); } @@ -401,76 +280,28 @@ fn build_default() { assert_eq!( first(builder.cache.all::()), &[ - compile::Std { - compiler: Compiler { host: a, stage: 0 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: a, stage: 2 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: b, stage: 2 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, - compile::Std { - compiler: Compiler { host: a, stage: 2 }, - target: b, - }, - compile::Std { - compiler: Compiler { host: b, stage: 2 }, - target: b, - }, - compile::Std { - compiler: Compiler { host: a, stage: 2 }, - target: c, - }, - compile::Std { - compiler: Compiler { host: b, stage: 2 }, - target: c, - }, + compile::Std { compiler: Compiler { host: a, stage: 0 }, target: a }, + compile::Std { compiler: Compiler { host: a, stage: 1 }, target: a }, + compile::Std { compiler: Compiler { host: a, stage: 2 }, target: a }, + compile::Std { compiler: Compiler { host: b, stage: 2 }, target: a }, + compile::Std { compiler: Compiler { host: a, stage: 1 }, target: b }, + compile::Std { compiler: Compiler { host: a, stage: 2 }, target: b }, + compile::Std { compiler: Compiler { host: b, stage: 2 }, target: b }, + compile::Std { compiler: Compiler { host: a, stage: 2 }, target: c }, + compile::Std { compiler: Compiler { host: b, stage: 2 }, target: c }, ] ); assert!(!builder.cache.all::().is_empty()); assert_eq!( first(builder.cache.all::()), &[ - compile::Rustc { - compiler: Compiler { host: a, stage: 0 }, - target: a, - }, - compile::Rustc { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - compile::Rustc { - compiler: Compiler { host: a, stage: 2 }, - target: a, - }, - compile::Rustc { - compiler: Compiler { host: b, stage: 2 }, - target: a, - }, - compile::Rustc { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, - compile::Rustc { - compiler: Compiler { host: a, stage: 2 }, - target: b, - }, - compile::Rustc { - compiler: Compiler { host: b, stage: 2 }, - target: b, - }, + compile::Rustc { compiler: Compiler { host: a, stage: 0 }, target: a }, + compile::Rustc { compiler: Compiler { host: a, stage: 1 }, target: a }, + compile::Rustc { compiler: Compiler { host: a, stage: 2 }, target: a }, + compile::Rustc { compiler: Compiler { host: b, stage: 2 }, target: a }, + compile::Rustc { compiler: Compiler { host: a, stage: 1 }, target: b }, + compile::Rustc { compiler: Compiler { host: a, stage: 2 }, target: b }, + compile::Rustc { compiler: Compiler { host: b, stage: 2 }, target: b }, ] ); } @@ -490,76 +321,32 @@ fn build_with_target_flag() { assert_eq!( first(builder.cache.all::()), &[ - compile::Std { - compiler: Compiler { host: a, stage: 0 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: a, stage: 2 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: b, stage: 2 }, - target: a, - }, - compile::Std { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, - compile::Std { - compiler: Compiler { host: a, stage: 2 }, - target: b, - }, - compile::Std { - compiler: Compiler { host: b, stage: 2 }, - target: b, - }, - compile::Std { - compiler: Compiler { host: a, stage: 2 }, - target: c, - }, - compile::Std { - compiler: Compiler { host: b, stage: 2 }, - target: c, - }, + compile::Std { compiler: Compiler { host: a, stage: 0 }, target: a }, + compile::Std { compiler: Compiler { host: a, stage: 1 }, target: a }, + compile::Std { compiler: Compiler { host: a, stage: 2 }, target: a }, + compile::Std { compiler: Compiler { host: b, stage: 2 }, target: a }, + compile::Std { compiler: Compiler { host: a, stage: 1 }, target: b }, + compile::Std { compiler: Compiler { host: a, stage: 2 }, target: b }, + compile::Std { compiler: Compiler { host: b, stage: 2 }, target: b }, + compile::Std { compiler: Compiler { host: a, stage: 2 }, target: c }, + compile::Std { compiler: Compiler { host: b, stage: 2 }, target: c }, ] ); assert_eq!( first(builder.cache.all::()), &[ - compile::Assemble { - target_compiler: Compiler { host: a, stage: 0 }, - }, - compile::Assemble { - target_compiler: Compiler { host: a, stage: 1 }, - }, - compile::Assemble { - target_compiler: Compiler { host: a, stage: 2 }, - }, - compile::Assemble { - target_compiler: Compiler { host: b, stage: 2 }, - }, + compile::Assemble { target_compiler: Compiler { host: a, stage: 0 } }, + compile::Assemble { target_compiler: Compiler { host: a, stage: 1 } }, + compile::Assemble { target_compiler: Compiler { host: a, stage: 2 } }, + compile::Assemble { target_compiler: Compiler { host: b, stage: 2 } }, ] ); assert_eq!( first(builder.cache.all::()), &[ - compile::Rustc { - compiler: Compiler { host: a, stage: 0 }, - target: a, - }, - compile::Rustc { - compiler: Compiler { host: a, stage: 1 }, - target: a, - }, - compile::Rustc { - compiler: Compiler { host: a, stage: 1 }, - target: b, - }, + compile::Rustc { compiler: Compiler { host: a, stage: 0 }, target: a }, + compile::Rustc { compiler: Compiler { host: a, stage: 1 }, target: a }, + compile::Rustc { compiler: Compiler { host: a, stage: 1 }, target: b }, ] ); } @@ -585,10 +372,8 @@ fn test_with_no_doc_stage0() { let host = INTERNER.intern_str("A"); - builder.run_step_descriptions( - &[StepDescription::from::()], - &["src/libstd".into()], - ); + builder + .run_step_descriptions(&[StepDescription::from::()], &["src/libstd".into()]); // Ensure we don't build any compiler artifacts. assert!(!builder.cache.contains::()); @@ -607,9 +392,7 @@ fn test_with_no_doc_stage0() { #[test] fn test_exclude() { let mut config = configure(&[], &[]); - config.exclude = vec![ - "src/tools/tidy".into(), - ]; + config.exclude = vec!["src/tools/tidy".into()]; config.cmd = Subcommand::Test { paths: Vec::new(), test_args: Vec::new(), diff --git a/src/bootstrap/cache.rs b/src/bootstrap/cache.rs index 4310f2c6fa..0c16fae01b 100644 --- a/src/bootstrap/cache.rs +++ b/src/bootstrap/cache.rs @@ -1,6 +1,7 @@ use std::any::{Any, TypeId}; use std::borrow::Borrow; use std::cell::RefCell; +use std::cmp::{Ord, Ordering, PartialOrd}; use std::collections::HashMap; use std::convert::AsRef; use std::ffi::OsStr; @@ -11,7 +12,6 @@ use std::mem; use std::ops::Deref; use std::path::{Path, PathBuf}; use std::sync::Mutex; -use std::cmp::{PartialOrd, Ord, Ordering}; use lazy_static::lazy_static; @@ -47,7 +47,7 @@ impl Eq for Interned {} impl PartialEq for Interned { fn eq(&self, other: &str) -> bool { - *self == other + *self == other } } impl<'a> PartialEq<&'a str> for Interned { @@ -168,24 +168,21 @@ struct TyIntern { impl Default for TyIntern { fn default() -> Self { - TyIntern { - items: Vec::new(), - set: Default::default(), - } + TyIntern { items: Vec::new(), set: Default::default() } } } impl TyIntern { fn intern_borrow(&mut self, item: &B) -> Interned where - B: Eq + Hash + ToOwned + ?Sized, + B: Eq + Hash + ToOwned + ?Sized, T: Borrow, { if let Some(i) = self.set.get(&item) { return *i; } let item = item.to_owned(); - let interned = Interned(self.items.len(), PhantomData::<*const T>); + let interned = Interned(self.items.len(), PhantomData::<*const T>); self.set.insert(item.clone(), interned); self.items.push(item); interned @@ -195,7 +192,7 @@ impl TyIntern { if let Some(i) = self.set.get(&item) { return *i; } - let interned = Interned(self.items.len(), PhantomData::<*const T>); + let interned = Interned(self.items.len(), PhantomData::<*const T>); self.set.insert(item.clone(), interned); self.items.push(item); interned @@ -235,10 +232,12 @@ lazy_static! { /// `get()` method. #[derive(Debug)] pub struct Cache( - RefCell, // actually a HashMap> - >> + RefCell< + HashMap< + TypeId, + Box, // actually a HashMap> + >, + >, ); impl Cache { @@ -249,10 +248,11 @@ impl Cache { pub fn put(&self, step: S, value: S::Output) { let mut cache = self.0.borrow_mut(); let type_id = TypeId::of::(); - let stepcache = cache.entry(type_id) - .or_insert_with(|| Box::new(HashMap::::new())) - .downcast_mut::>() - .expect("invalid type mapped"); + let stepcache = cache + .entry(type_id) + .or_insert_with(|| Box::new(HashMap::::new())) + .downcast_mut::>() + .expect("invalid type mapped"); assert!(!stepcache.contains_key(&step), "processing {:?} a second time", step); stepcache.insert(step, value); } @@ -260,10 +260,11 @@ impl Cache { pub fn get(&self, step: &S) -> Option { let mut cache = self.0.borrow_mut(); let type_id = TypeId::of::(); - let stepcache = cache.entry(type_id) - .or_insert_with(|| Box::new(HashMap::::new())) - .downcast_mut::>() - .expect("invalid type mapped"); + let stepcache = cache + .entry(type_id) + .or_insert_with(|| Box::new(HashMap::::new())) + .downcast_mut::>() + .expect("invalid type mapped"); stepcache.get(step).cloned() } } @@ -273,7 +274,8 @@ impl Cache { pub fn all(&mut self) -> Vec<(S, S::Output)> { let cache = self.0.get_mut(); let type_id = TypeId::of::(); - let mut v = cache.remove(&type_id) + let mut v = cache + .remove(&type_id) .map(|b| b.downcast::>().expect("correct type")) .map(|m| m.into_iter().collect::>()) .unwrap_or_default(); diff --git a/src/bootstrap/cc_detect.rs b/src/bootstrap/cc_detect.rs index a4cb81d3d1..a236edf971 100644 --- a/src/bootstrap/cc_detect.rs +++ b/src/bootstrap/cc_detect.rs @@ -22,15 +22,15 @@ //! everything. use std::collections::HashSet; -use std::{env, iter}; use std::path::{Path, PathBuf}; use std::process::Command; +use std::{env, iter}; use build_helper::output; -use crate::{Build, GitRepo}; -use crate::config::Target; use crate::cache::Interned; +use crate::config::Target; +use crate::{Build, GitRepo}; // The `cc` crate doesn't provide a way to obtain a path to the detected archiver, // so use some simplified logic here. First we respect the environment variable `AR`, then @@ -64,14 +64,25 @@ fn cc2ar(cc: &Path, target: &str) -> Option { pub fn find(build: &mut Build) { // For all targets we're going to need a C compiler for building some shims // and such as well as for being a linker for Rust code. - let targets = build.targets.iter().chain(&build.hosts).cloned().chain(iter::once(build.build)) - .collect::>(); + let targets = build + .targets + .iter() + .chain(&build.hosts) + .cloned() + .chain(iter::once(build.build)) + .collect::>(); for target in targets.into_iter() { let mut cfg = cc::Build::new(); - cfg.cargo_metadata(false).opt_level(2).warnings(false).debug(false) - .target(&target).host(&build.build); + cfg.cargo_metadata(false) + .opt_level(2) + .warnings(false) + .debug(false) + .target(&target) + .host(&build.build); match build.crt_static(target) { - Some(a) => { cfg.static_crt(a); } + Some(a) => { + cfg.static_crt(a); + } None => { if target.contains("msvc") { cfg.static_crt(true); @@ -102,8 +113,13 @@ pub fn find(build: &mut Build) { // If we use llvm-libunwind, we will need a C++ compiler as well for all targets // We'll need one anyways if the target triple is also a host triple let mut cfg = cc::Build::new(); - cfg.cargo_metadata(false).opt_level(2).warnings(false).debug(false).cpp(true) - .target(&target).host(&build.build); + cfg.cargo_metadata(false) + .opt_level(2) + .warnings(false) + .debug(false) + .cpp(true) + .target(&target) + .host(&build.build); let cxx_configured = if let Some(cxx) = config.and_then(|c| c.cxx.as_ref()) { cfg.compiler(cxx); @@ -133,21 +149,24 @@ pub fn find(build: &mut Build) { } } -fn set_compiler(cfg: &mut cc::Build, - compiler: Language, - target: Interned, - config: Option<&Target>, - build: &Build) { +fn set_compiler( + cfg: &mut cc::Build, + compiler: Language, + target: Interned, + config: Option<&Target>, + build: &Build, +) { match &*target { // When compiling for android we may have the NDK configured in the // config.toml in which case we look there. Otherwise the default // compiler already takes into account the triple in question. t if t.contains("android") => { if let Some(ndk) = config.and_then(|c| c.ndk.as_ref()) { - let target = target.replace("armv7neon", "arm") - .replace("armv7", "arm") - .replace("thumbv7neon", "arm") - .replace("thumbv7", "arm"); + let target = target + .replace("armv7neon", "arm") + .replace("armv7", "arm") + .replace("thumbv7neon", "arm") + .replace("thumbv7", "arm"); let compiler = format!("{}-{}", target, compiler.clang()); cfg.compiler(ndk.join("bin").join(compiler)); } @@ -159,7 +178,7 @@ fn set_compiler(cfg: &mut cc::Build, let c = cfg.get_compiler(); let gnu_compiler = compiler.gcc(); if !c.path().ends_with(gnu_compiler) { - return + return; } let output = output(c.to_command().arg("--version")); @@ -168,7 +187,7 @@ fn set_compiler(cfg: &mut cc::Build, None => return, }; match output[i + 3..].chars().next().unwrap() { - '0' ..= '6' => {} + '0'..='6' => {} _ => return, } let alternative = format!("e{}", gnu_compiler); diff --git a/src/bootstrap/channel.rs b/src/bootstrap/channel.rs index d265b6eb2d..38810237ef 100644 --- a/src/bootstrap/channel.rs +++ b/src/bootstrap/channel.rs @@ -13,7 +13,7 @@ use build_helper::output; use crate::Build; // The version number -pub const CFG_RELEASE_NUM: &str = "1.41.1"; +pub const CFG_RELEASE_NUM: &str = "1.42.0"; pub struct GitInfo { inner: Option, diff --git a/src/bootstrap/check.rs b/src/bootstrap/check.rs index f5c427d870..b76515763f 100644 --- a/src/bootstrap/check.rs +++ b/src/bootstrap/check.rs @@ -1,10 +1,10 @@ //! Implementation of compiling the compiler and standard library, in "check"-based modes. -use crate::compile::{run_cargo, std_cargo, rustc_cargo, add_to_sysroot}; -use crate::builder::{RunConfig, Builder, Kind, ShouldRun, Step}; +use crate::builder::{Builder, Kind, RunConfig, ShouldRun, Step}; +use crate::cache::Interned; +use crate::compile::{add_to_sysroot, run_cargo, rustc_cargo, std_cargo}; use crate::tool::{prepare_tool_cargo, SourceType}; use crate::{Compiler, Mode}; -use crate::cache::Interned; use std::path::PathBuf; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] @@ -15,7 +15,7 @@ pub struct Std { fn args(kind: Kind) -> Vec { match kind { Kind::Clippy => vec!["--".to_owned(), "--cap-lints".to_owned(), "warn".to_owned()], - _ => Vec::new() + _ => Vec::new(), } } @@ -24,7 +24,7 @@ fn cargo_subcommand(kind: Kind) -> &'static str { Kind::Check => "check", Kind::Clippy => "clippy", Kind::Fix => "fix", - _ => unreachable!() + _ => unreachable!(), } } @@ -37,9 +37,7 @@ impl Step for Std { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Std { - target: run.target, - }); + run.builder.ensure(Std { target: run.target }); } fn run(self, builder: &Builder<'_>) { @@ -47,15 +45,17 @@ impl Step for Std { let compiler = builder.compiler(0, builder.config.build); let mut cargo = builder.cargo(compiler, Mode::Std, target, cargo_subcommand(builder.kind)); - std_cargo(builder, &compiler, target, &mut cargo); + std_cargo(builder, target, &mut cargo); builder.info(&format!("Checking std artifacts ({} -> {})", &compiler.host, target)); - run_cargo(builder, - cargo, - args(builder.kind), - &libstd_stamp(builder, compiler, target), - vec![], - true); + run_cargo( + builder, + cargo, + args(builder.kind), + &libstd_stamp(builder, compiler, target), + vec![], + true, + ); let libdir = builder.sysroot_libdir(compiler, target); let hostdir = builder.sysroot_libdir(compiler, compiler.host); @@ -78,9 +78,7 @@ impl Step for Rustc { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Rustc { - target: run.target, - }); + run.builder.ensure(Rustc { target: run.target }); } /// Builds the compiler. @@ -94,17 +92,19 @@ impl Step for Rustc { builder.ensure(Std { target }); - let mut cargo = builder.cargo(compiler, Mode::Rustc, target, - cargo_subcommand(builder.kind)); + let mut cargo = + builder.cargo(compiler, Mode::Rustc, target, cargo_subcommand(builder.kind)); rustc_cargo(builder, &mut cargo, target); builder.info(&format!("Checking compiler artifacts ({} -> {})", &compiler.host, target)); - run_cargo(builder, - cargo, - args(builder.kind), - &librustc_stamp(builder, compiler, target), - vec![], - true); + run_cargo( + builder, + cargo, + args(builder.kind), + &librustc_stamp(builder, compiler, target), + vec![], + true, + ); let libdir = builder.sysroot_libdir(compiler, target); let hostdir = builder.sysroot_libdir(compiler, compiler.host); @@ -127,9 +127,7 @@ impl Step for Rustdoc { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Rustdoc { - target: run.target, - }); + run.builder.ensure(Rustdoc { target: run.target }); } fn run(self, builder: &Builder<'_>) { @@ -138,22 +136,26 @@ impl Step for Rustdoc { builder.ensure(Rustc { target }); - let cargo = prepare_tool_cargo(builder, - compiler, - Mode::ToolRustc, - target, - cargo_subcommand(builder.kind), - "src/tools/rustdoc", - SourceType::InTree, - &[]); + let cargo = prepare_tool_cargo( + builder, + compiler, + Mode::ToolRustc, + target, + cargo_subcommand(builder.kind), + "src/tools/rustdoc", + SourceType::InTree, + &[], + ); println!("Checking rustdoc artifacts ({} -> {})", &compiler.host, target); - run_cargo(builder, - cargo, - args(builder.kind), - &rustdoc_stamp(builder, compiler, target), - vec![], - true); + run_cargo( + builder, + cargo, + args(builder.kind), + &rustdoc_stamp(builder, compiler, target), + vec![], + true, + ); let libdir = builder.sysroot_libdir(compiler, target); let hostdir = builder.sysroot_libdir(compiler, compiler.host); @@ -188,6 +190,5 @@ pub fn rustdoc_stamp( compiler: Compiler, target: Interned, ) -> PathBuf { - builder.cargo_out(compiler, Mode::ToolRustc, target) - .join(".rustdoc-check.stamp") + builder.cargo_out(compiler, Mode::ToolRustc, target).join(".rustdoc-check.stamp") } diff --git a/src/bootstrap/clean.rs b/src/bootstrap/clean.rs index 73be8bfed8..b4e58c06fd 100644 --- a/src/bootstrap/clean.rs +++ b/src/bootstrap/clean.rs @@ -31,7 +31,7 @@ pub fn clean(build: &Build, all: bool) { for entry in entries { let entry = t!(entry); if entry.file_name().to_str() == Some("llvm") { - continue + continue; } let path = t!(entry.path().canonicalize()); rm_rf(&path); @@ -47,7 +47,7 @@ fn rm_rf(path: &Path) { return; } panic!("failed to get metadata for file {}: {}", path.display(), e); - }, + } Ok(metadata) => { if metadata.file_type().is_file() || metadata.file_type().is_symlink() { do_op(path, "remove file", |p| fs::remove_file(p)); @@ -58,20 +58,20 @@ fn rm_rf(path: &Path) { rm_rf(&t!(file).path()); } do_op(path, "remove dir", |p| fs::remove_dir(p)); - }, + } }; } fn do_op(path: &Path, desc: &str, mut f: F) - where F: FnMut(&Path) -> io::Result<()> +where + F: FnMut(&Path) -> io::Result<()>, { match f(path) { Ok(()) => {} // On windows we can't remove a readonly file, and git will often clone files as readonly. // As a result, we have some special logic to remove readonly files on windows. // This is also the reason that we can't use things like fs::remove_dir_all(). - Err(ref e) if cfg!(windows) && - e.kind() == ErrorKind::PermissionDenied => { + Err(ref e) if cfg!(windows) && e.kind() == ErrorKind::PermissionDenied => { let mut p = t!(path.symlink_metadata()).permissions(); p.set_readonly(false); t!(fs::set_permissions(path, p)); diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 831053bc0f..eced03506a 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -9,10 +9,10 @@ use std::borrow::Cow; use std::env; use std::fs; -use std::io::BufReader; use std::io::prelude::*; +use std::io::BufReader; use std::path::{Path, PathBuf}; -use std::process::{Command, Stdio, exit}; +use std::process::{exit, Command, Stdio}; use std::str; use build_helper::{output, t, up_to_date}; @@ -20,14 +20,14 @@ use filetime::FileTime; use serde::Deserialize; use serde_json; -use crate::dist; use crate::builder::Cargo; -use crate::util::{exe, is_dylib}; -use crate::{Compiler, Mode, GitRepo}; +use crate::dist; use crate::native; +use crate::util::{exe, is_dylib}; +use crate::{Compiler, GitRepo, Mode}; -use crate::cache::{INTERNER, Interned}; -use crate::builder::{Step, RunConfig, ShouldRun, Builder, Kind}; +use crate::builder::{Builder, Kind, RunConfig, ShouldRun, Step}; +use crate::cache::{Interned, INTERNER}; #[derive(Debug, PartialOrd, Ord, Copy, Clone, PartialEq, Eq, Hash)] pub struct Std { @@ -61,11 +61,7 @@ impl Step for Std { if builder.config.keep_stage.contains(&compiler.stage) { builder.info("Warning: Using a potentially old libstd. This may not behave well."); - builder.ensure(StdLink { - compiler, - target_compiler: compiler, - target, - }); + builder.ensure(StdLink { compiler, target_compiler: compiler, target }); return; } @@ -73,10 +69,7 @@ impl Step for Std { let compiler_to_use = builder.compiler_for(compiler.stage, compiler.host, target); if compiler_to_use != compiler { - builder.ensure(Std { - compiler: compiler_to_use, - target, - }); + builder.ensure(Std { compiler: compiler_to_use, target }); builder.info(&format!("Uplifting stage1 std ({} -> {})", compiler_to_use.host, target)); // Even if we're not building std this stage, the new sysroot must @@ -94,16 +87,20 @@ impl Step for Std { target_deps.extend(copy_third_party_objects(builder, &compiler, target).into_iter()); let mut cargo = builder.cargo(compiler, Mode::Std, target, "build"); - std_cargo(builder, &compiler, target, &mut cargo); + std_cargo(builder, target, &mut cargo); - builder.info(&format!("Building stage{} std artifacts ({} -> {})", compiler.stage, - &compiler.host, target)); - run_cargo(builder, - cargo, - vec![], - &libstd_stamp(builder, compiler, target), - target_deps, - false); + builder.info(&format!( + "Building stage{} std artifacts ({} -> {})", + compiler.stage, &compiler.host, target + )); + run_cargo( + builder, + cargo, + vec![], + &libstd_stamp(builder, compiler, target), + target_deps, + false, + ); builder.ensure(StdLink { compiler: builder.compiler(compiler.stage, builder.config.build), @@ -114,19 +111,18 @@ impl Step for Std { } /// Copies third party objects needed by various targets. -fn copy_third_party_objects(builder: &Builder<'_>, compiler: &Compiler, target: Interned) - -> Vec -{ +fn copy_third_party_objects( + builder: &Builder<'_>, + compiler: &Compiler, + target: Interned, +) -> Vec { let libdir = builder.sysroot_libdir(*compiler, target); let mut target_deps = vec![]; let mut copy_and_stamp = |sourcedir: &Path, name: &str| { let target = libdir.join(name); - builder.copy( - &sourcedir.join(name), - &target, - ); + builder.copy(&sourcedir.join(name), &target); target_deps.push(target); }; @@ -157,15 +153,18 @@ fn copy_third_party_objects(builder: &Builder<'_>, compiler: &Compiler, target: copy_and_stamp(Path::new(&src), "libunwind.a"); } + if builder.config.sanitizers && compiler.stage != 0 { + // The sanitizers are only copied in stage1 or above, + // to avoid creating dependency on LLVM. + target_deps.extend(copy_sanitizers(builder, &compiler, target)); + } + target_deps } /// Configure cargo to compile the standard library, adding appropriate env vars /// and such. -pub fn std_cargo(builder: &Builder<'_>, - compiler: &Compiler, - target: Interned, - cargo: &mut Cargo) { +pub fn std_cargo(builder: &Builder<'_>, target: Interned, cargo: &mut Cargo) { if let Some(target) = env::var_os("MACOSX_STD_DEPLOYMENT_TARGET") { cargo.env("MACOSX_DEPLOYMENT_TARGET", target); } @@ -208,22 +207,9 @@ pub fn std_cargo(builder: &Builder<'_>, let mut features = builder.std_features(); features.push_str(&compiler_builtins_c_feature); - if compiler.stage != 0 && builder.config.sanitizers { - // This variable is used by the sanitizer runtime crates, e.g. - // rustc_lsan, to build the sanitizer runtime from C code - // When this variable is missing, those crates won't compile the C code, - // so we don't set this variable during stage0 where llvm-config is - // missing - // We also only build the runtimes when --enable-sanitizers (or its - // config.toml equivalent) is used - let llvm_config = builder.ensure(native::Llvm { - target: builder.config.build, - }); - cargo.env("LLVM_CONFIG", llvm_config); - cargo.env("RUSTC_BUILD_SANITIZERS", "1"); - } - - cargo.arg("--features").arg(features) + cargo + .arg("--features") + .arg(features) .arg("--manifest-path") .arg(builder.src.join("src/libtest/Cargo.toml")); @@ -271,40 +257,50 @@ impl Step for StdLink { let compiler = self.compiler; let target_compiler = self.target_compiler; let target = self.target; - builder.info(&format!("Copying stage{} std from stage{} ({} -> {} / {})", - target_compiler.stage, - compiler.stage, - &compiler.host, - target_compiler.host, - target)); + builder.info(&format!( + "Copying stage{} std from stage{} ({} -> {} / {})", + target_compiler.stage, compiler.stage, &compiler.host, target_compiler.host, target + )); let libdir = builder.sysroot_libdir(target_compiler, target); let hostdir = builder.sysroot_libdir(target_compiler, compiler.host); add_to_sysroot(builder, &libdir, &hostdir, &libstd_stamp(builder, compiler, target)); - - if builder.config.sanitizers && compiler.stage != 0 && target == "x86_64-apple-darwin" { - // The sanitizers are only built in stage1 or above, so the dylibs will - // be missing in stage0 and causes panic. See the `std()` function above - // for reason why the sanitizers are not built in stage0. - copy_apple_sanitizer_dylibs(builder, &builder.native_dir(target), "osx", &libdir); - } } } -fn copy_apple_sanitizer_dylibs( +/// Copies sanitizer runtime libraries into target libdir. +fn copy_sanitizers( builder: &Builder<'_>, - native_dir: &Path, - platform: &str, - into: &Path, -) { - for &sanitizer in &["asan", "tsan"] { - let filename = format!("lib__rustc__clang_rt.{}_{}_dynamic.dylib", sanitizer, platform); - let mut src_path = native_dir.join(sanitizer); - src_path.push("build"); - src_path.push("lib"); - src_path.push("darwin"); - src_path.push(&filename); - builder.copy(&src_path, &into.join(filename)); + compiler: &Compiler, + target: Interned, +) -> Vec { + let runtimes: Vec = builder.ensure(native::Sanitizers { target }); + + if builder.config.dry_run { + return Vec::new(); + } + + let mut target_deps = Vec::new(); + let libdir = builder.sysroot_libdir(*compiler, target); + + for runtime in &runtimes { + let dst = libdir.join(&runtime.name); + builder.copy(&runtime.path, &dst); + + if target == "x86_64-apple-darwin" { + // Update the library install name reflect the fact it has been renamed. + let status = Command::new("install_name_tool") + .arg("-id") + .arg(format!("@rpath/{}", runtime.name)) + .arg(&dst) + .status() + .expect("failed to execute `install_name_tool`"); + assert!(status.success()); + } + + target_deps.push(dst); } + + target_deps } #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] @@ -337,7 +333,7 @@ impl Step for StartupObjects { let for_compiler = self.compiler; let target = self.target; if !target.contains("windows-gnu") { - return vec![] + return vec![]; } let mut target_deps = vec![]; @@ -352,12 +348,17 @@ impl Step for StartupObjects { let dst_file = &dst_dir.join(file.to_string() + ".o"); if !up_to_date(src_file, dst_file) { let mut cmd = Command::new(&builder.initial_rustc); - builder.run(cmd.env("RUSTC_BOOTSTRAP", "1") - .arg("--cfg").arg("bootstrap") - .arg("--target").arg(target) - .arg("--emit=obj") - .arg("-o").arg(dst_file) - .arg(src_file)); + builder.run( + cmd.env("RUSTC_BOOTSTRAP", "1") + .arg("--cfg") + .arg("bootstrap") + .arg("--target") + .arg(target) + .arg("--emit=obj") + .arg("-o") + .arg(dst_file) + .arg(src_file), + ); } let target = sysroot_dir.join(file.to_string() + ".o"); @@ -366,10 +367,7 @@ impl Step for StartupObjects { } for obj in ["crt2.o", "dllcrt2.o"].iter() { - let src = compiler_file(builder, - builder.cc(target), - target, - obj); + let src = compiler_file(builder, builder.cc(target), target, obj); let target = sysroot_dir.join(obj); builder.copy(&src, &target); target_deps.push(target); @@ -414,22 +412,15 @@ impl Step for Rustc { if builder.config.keep_stage.contains(&compiler.stage) { builder.info("Warning: Using a potentially old librustc. This may not behave well."); - builder.ensure(RustcLink { - compiler, - target_compiler: compiler, - target, - }); + builder.ensure(RustcLink { compiler, target_compiler: compiler, target }); return; } let compiler_to_use = builder.compiler_for(compiler.stage, compiler.host, target); if compiler_to_use != compiler { - builder.ensure(Rustc { - compiler: compiler_to_use, - target, - }); - builder.info(&format!("Uplifting stage1 rustc ({} -> {})", - builder.config.build, target)); + builder.ensure(Rustc { compiler: compiler_to_use, target }); + builder + .info(&format!("Uplifting stage1 rustc ({} -> {})", builder.config.build, target)); builder.ensure(RustcLink { compiler: compiler_to_use, target_compiler: compiler, @@ -447,14 +438,18 @@ impl Step for Rustc { let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "build"); rustc_cargo(builder, &mut cargo, target); - builder.info(&format!("Building stage{} compiler artifacts ({} -> {})", - compiler.stage, &compiler.host, target)); - run_cargo(builder, - cargo, - vec![], - &librustc_stamp(builder, compiler, target), - vec![], - false); + builder.info(&format!( + "Building stage{} compiler artifacts ({} -> {})", + compiler.stage, &compiler.host, target + )); + run_cargo( + builder, + cargo, + vec![], + &librustc_stamp(builder, compiler, target), + vec![], + false, + ); // We used to build librustc_codegen_llvm as a separate step, // which produced a dylib that the compiler would dlopen() at runtime. @@ -503,19 +498,22 @@ impl Step for Rustc { } pub fn rustc_cargo(builder: &Builder<'_>, cargo: &mut Cargo, target: Interned) { - cargo.arg("--features").arg(builder.rustc_features()) - .arg("--manifest-path") - .arg(builder.src.join("src/rustc/Cargo.toml")); + cargo + .arg("--features") + .arg(builder.rustc_features()) + .arg("--manifest-path") + .arg(builder.src.join("src/rustc/Cargo.toml")); rustc_cargo_env(builder, cargo, target); } pub fn rustc_cargo_env(builder: &Builder<'_>, cargo: &mut Cargo, target: Interned) { // Set some configuration variables picked up by build scripts and // the compiler alike - cargo.env("CFG_RELEASE", builder.rust_release()) - .env("CFG_RELEASE_CHANNEL", &builder.config.channel) - .env("CFG_VERSION", builder.rust_version()) - .env("CFG_PREFIX", builder.config.prefix.clone().unwrap_or_default()); + cargo + .env("CFG_RELEASE", builder.rust_release()) + .env("CFG_RELEASE_CHANNEL", &builder.config.channel) + .env("CFG_VERSION", builder.rust_version()) + .env("CFG_PREFIX", builder.config.prefix.clone().unwrap_or_default()); let libdir_relative = builder.config.libdir_relative().unwrap_or(Path::new("lib")); cargo.env("CFG_LIBDIR_RELATIVE", libdir_relative); @@ -561,14 +559,12 @@ pub fn rustc_cargo_env(builder: &Builder<'_>, cargo: &mut Cargo, target: Interne } // Building with a static libstdc++ is only supported on linux right now, // not for MSVC or macOS - if builder.config.llvm_static_stdcpp && - !target.contains("freebsd") && - !target.contains("msvc") && - !target.contains("apple") { - let file = compiler_file(builder, - builder.cxx(target).unwrap(), - target, - "libstdc++.a"); + if builder.config.llvm_static_stdcpp + && !target.contains("freebsd") + && !target.contains("msvc") + && !target.contains("apple") + { + let file = compiler_file(builder, builder.cxx(target).unwrap(), target, "libstdc++.a"); cargo.env("LLVM_STATIC_STDCPP", file); } if builder.config.llvm_link_shared || builder.config.llvm_thin_lto { @@ -602,17 +598,15 @@ impl Step for RustcLink { let compiler = self.compiler; let target_compiler = self.target_compiler; let target = self.target; - builder.info(&format!("Copying stage{} rustc from stage{} ({} -> {} / {})", - target_compiler.stage, - compiler.stage, - &compiler.host, - target_compiler.host, - target)); + builder.info(&format!( + "Copying stage{} rustc from stage{} ({} -> {} / {})", + target_compiler.stage, compiler.stage, &compiler.host, target_compiler.host, target + )); add_to_sysroot( builder, &builder.sysroot_libdir(target_compiler, target), &builder.sysroot_libdir(target_compiler, compiler.host), - &librustc_stamp(builder, compiler, target) + &librustc_stamp(builder, compiler, target), ); } } @@ -706,8 +700,10 @@ impl Step for Assemble { let target_compiler = self.target_compiler; if target_compiler.stage == 0 { - assert_eq!(builder.config.build, target_compiler.host, - "Cannot obtain compiler for non-native build triple at stage 0"); + assert_eq!( + builder.config.build, target_compiler.host, + "Cannot obtain compiler for non-native build triple at stage 0" + ); // The stage 0 compiler for the build triple is always pre-built. return target_compiler; } @@ -728,23 +724,17 @@ impl Step for Assemble { // // FIXME: It may be faster if we build just a stage 1 compiler and then // use that to bootstrap this compiler forward. - let build_compiler = - builder.compiler(target_compiler.stage - 1, builder.config.build); + let build_compiler = builder.compiler(target_compiler.stage - 1, builder.config.build); // Build the libraries for this compiler to link to (i.e., the libraries // it uses at runtime). NOTE: Crates the target compiler compiles don't // link to these. (FIXME: Is that correct? It seems to be correct most // of the time but I think we do link to these for stage2/bin compilers // when not performing a full bootstrap). - builder.ensure(Rustc { - compiler: build_compiler, - target: target_compiler.host, - }); + builder.ensure(Rustc { compiler: build_compiler, target: target_compiler.host }); let lld_install = if builder.config.lld_enabled { - Some(builder.ensure(native::Lld { - target: target_compiler.host, - })) + Some(builder.ensure(native::Lld { target: target_compiler.host })) } else { None }; @@ -786,7 +776,6 @@ impl Step for Assemble { let bindir = sysroot.join("bin"); t!(fs::create_dir_all(&bindir)); let compiler = builder.rustc(target_compiler); - let _ = fs::remove_file(&compiler); builder.copy(&rustc, &compiler); target_compiler @@ -801,7 +790,7 @@ pub fn add_to_sysroot( builder: &Builder<'_>, sysroot_dst: &Path, sysroot_host_dst: &Path, - stamp: &Path + stamp: &Path, ) { t!(fs::create_dir_all(&sysroot_dst)); t!(fs::create_dir_all(&sysroot_host_dst)); @@ -814,14 +803,14 @@ pub fn add_to_sysroot( } } -pub fn run_cargo(builder: &Builder<'_>, - cargo: Cargo, - tail_args: Vec, - stamp: &Path, - additional_target_deps: Vec, - is_check: bool) - -> Vec -{ +pub fn run_cargo( + builder: &Builder<'_>, + cargo: Cargo, + tail_args: Vec, + stamp: &Path, + additional_target_deps: Vec, + is_check: bool, +) -> Vec { if builder.config.dry_run { return Vec::new(); } @@ -831,9 +820,12 @@ pub fn run_cargo(builder: &Builder<'_>, // `target_deps_dir` looks like $dir/$target/release/deps let target_deps_dir = target_root_dir.join("deps"); // `host_root_dir` looks like $dir/release - let host_root_dir = target_root_dir.parent().unwrap() // chop off `release` - .parent().unwrap() // chop off `$target` - .join(target_root_dir.file_name().unwrap()); + let host_root_dir = target_root_dir + .parent() + .unwrap() // chop off `release` + .parent() + .unwrap() // chop off `$target` + .join(target_root_dir.file_name().unwrap()); // Spawn Cargo slurping up its JSON output. We'll start building up the // `deps` array of all files it generated along with a `toplevel` array of @@ -844,20 +836,19 @@ pub fn run_cargo(builder: &Builder<'_>, let (filenames, crate_types) = match msg { CargoMessage::CompilerArtifact { filenames, - target: CargoTarget { - crate_types, - }, + target: CargoTarget { crate_types }, .. } => (filenames, crate_types), _ => return, }; for filename in filenames { // Skip files like executables - if !filename.ends_with(".rlib") && - !filename.ends_with(".lib") && - !filename.ends_with(".a") && - !is_dylib(&filename) && - !(is_check && filename.ends_with(".rmeta")) { + if !filename.ends_with(".rlib") + && !filename.ends_with(".lib") + && !filename.ends_with(".a") + && !is_dylib(&filename) + && !(is_check && filename.ends_with(".rmeta")) + { continue; } @@ -913,14 +904,13 @@ pub fn run_cargo(builder: &Builder<'_>, .collect::>(); for (prefix, extension, expected_len) in toplevel { let candidates = contents.iter().filter(|&&(_, ref filename, ref meta)| { - filename.starts_with(&prefix[..]) && - filename[prefix.len()..].starts_with("-") && - filename.ends_with(&extension[..]) && - meta.len() == expected_len - }); - let max = candidates.max_by_key(|&&(_, _, ref metadata)| { - FileTime::from_last_modification_time(metadata) + filename.starts_with(&prefix[..]) + && filename[prefix.len()..].starts_with("-") + && filename.ends_with(&extension[..]) + && meta.len() == expected_len }); + let max = candidates + .max_by_key(|&&(_, _, ref metadata)| FileTime::from_last_modification_time(metadata)); let path_to_add = match max { Some(triple) => triple.0.to_str().unwrap(), None => panic!("no output generated for {:?} {:?}", prefix, extension), @@ -960,7 +950,7 @@ pub fn stream_cargo( // Instruct Cargo to give us json messages on stdout, critically leaving // stderr as piped so we can get those pretty colors. let mut message_format = String::from("json-render-diagnostics"); - if let Some(s) = &builder.config.rustc_error_format { + if let Some(s) = &builder.config.rustc_error_format { message_format.push_str(",json-diagnostic-"); message_format.push_str(s); } @@ -985,17 +975,18 @@ pub fn stream_cargo( match serde_json::from_str::>(&line) { Ok(msg) => cb(msg), // If this was informational, just print it out and continue - Err(_) => println!("{}", line) + Err(_) => println!("{}", line), } } // Make sure Cargo actually succeeded after we read all of its stdout. let status = t!(child.wait()); if !status.success() { - eprintln!("command did not execute successfully: {:?}\n\ + eprintln!( + "command did not execute successfully: {:?}\n\ expected success, got: {}", - cargo, - status); + cargo, status + ); } status.success() } diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index 5f2ef01bd5..110c8b844d 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -3,19 +3,20 @@ //! This module implements parsing `config.toml` configuration files to tweak //! how the build runs. +use std::cmp; use std::collections::{HashMap, HashSet}; use std::env; +use std::ffi::OsString; use std::fs; use std::path::{Path, PathBuf}; use std::process; -use std::cmp; -use build_helper::t; -use toml; -use serde::Deserialize; -use crate::cache::{INTERNER, Interned}; +use crate::cache::{Interned, INTERNER}; use crate::flags::Flags; pub use crate::flags::Subcommand; +use build_helper::t; +use serde::Deserialize; +use toml; /// Global configuration for the entire build and/or bootstrap. /// @@ -66,6 +67,7 @@ pub struct Config { pub backtrace_on_ice: bool, // llvm codegen options + pub llvm_skip_rebuild: bool, pub llvm_assertions: bool, pub llvm_optimize: bool, pub llvm_thin_lto: bool, @@ -106,6 +108,7 @@ pub struct Config { pub rust_dist_src: bool, pub rust_codegen_backends: Vec>, pub rust_verify_llvm_ir: bool, + pub rust_thin_lto_import_instr_limit: Option, pub rust_remap_debuginfo: bool, pub build: Interned, @@ -149,6 +152,7 @@ pub struct Config { // These are either the stage0 downloaded binaries or the locally installed ones. pub initial_cargo: PathBuf, pub initial_rustc: PathBuf, + pub initial_rustfmt: Option, pub out: PathBuf, } @@ -199,6 +203,7 @@ struct Build { target: Vec, cargo: Option, rustc: Option, + rustfmt: Option, /* allow bootstrap.py to use rustfmt key */ docs: Option, compiler_docs: Option, submodules: Option, @@ -242,6 +247,7 @@ struct Install { #[derive(Deserialize, Default)] #[serde(deny_unknown_fields, rename_all = "kebab-case")] struct Llvm { + skip_rebuild: Option, optimize: Option, thin_lto: Option, release_debuginfo: Option, @@ -321,6 +327,7 @@ struct Rust { deny_warnings: Option, backtrace_on_ice: Option, verify_llvm_ir: Option, + thin_lto_import_instr_limit: Option, remap_debuginfo: Option, jemalloc: Option, test_compare_mode: Option, @@ -348,12 +355,16 @@ struct TomlTarget { impl Config { fn path_from_python(var_key: &str) -> PathBuf { match env::var_os(var_key) { - // Do not trust paths from Python and normalize them slightly (#49785). - Some(var_val) => Path::new(&var_val).components().collect(), + Some(var_val) => Self::normalize_python_path(var_val), _ => panic!("expected '{}' to be set", var_key), } } + /// Normalizes paths from Python slightly. We don't trust paths from Python (#49785). + fn normalize_python_path(path: OsString) -> PathBuf { + Path::new(&path).components().collect() + } + pub fn default_opts() -> Config { let mut config = Config::default(); config.llvm_optimize = true; @@ -380,6 +391,7 @@ impl Config { config.initial_rustc = Config::path_from_python("RUSTC"); config.initial_cargo = Config::path_from_python("CARGO"); + config.initial_rustfmt = env::var_os("RUSTFMT").map(Config::normalize_python_path); config } @@ -413,17 +425,22 @@ impl Config { let has_targets = !flags.target.is_empty(); config.skip_only_host_steps = !has_hosts && has_targets; - let toml = file.map(|file| { - let contents = t!(fs::read_to_string(&file)); - match toml::from_str(&contents) { - Ok(table) => table, - Err(err) => { - println!("failed to parse TOML configuration '{}': {}", - file.display(), err); - process::exit(2); + let toml = file + .map(|file| { + let contents = t!(fs::read_to_string(&file)); + match toml::from_str(&contents) { + Ok(table) => table, + Err(err) => { + println!( + "failed to parse TOML configuration '{}': {}", + file.display(), + err + ); + process::exit(2); + } } - } - }).unwrap_or_else(|| TomlConfig::default()); + }) + .unwrap_or_else(|| TomlConfig::default()); let build = toml.build.clone().unwrap_or_default(); // set by bootstrap.py @@ -434,24 +451,15 @@ impl Config { config.hosts.push(host); } } - for target in config.hosts.iter().cloned() - .chain(build.target.iter().map(|s| INTERNER.intern_str(s))) + for target in + config.hosts.iter().cloned().chain(build.target.iter().map(|s| INTERNER.intern_str(s))) { if !config.targets.contains(&target) { config.targets.push(target); } } - config.hosts = if !flags.host.is_empty() { - flags.host - } else { - config.hosts - }; - config.targets = if !flags.target.is_empty() { - flags.target - } else { - config.targets - }; - + config.hosts = if !flags.host.is_empty() { flags.host } else { config.hosts }; + config.targets = if !flags.target.is_empty() { flags.target } else { config.targets }; config.nodejs = build.nodejs.map(PathBuf::from); config.gdb = build.gdb.map(PathBuf::from); @@ -485,6 +493,11 @@ impl Config { config.mandir = install.mandir.clone().map(PathBuf::from); } + // We want the llvm-skip-rebuild flag to take precedence over the + // skip-rebuild config.toml option so we store it separately + // so that we can infer the right value + let mut llvm_skip_rebuild = flags.llvm_skip_rebuild; + // Store off these values as options because if they're not provided // we'll infer default values for them later let mut llvm_assertions = None; @@ -500,9 +513,7 @@ impl Config { if let Some(ref llvm) = toml.llvm { match llvm.ccache { - Some(StringOrBool::String(ref s)) => { - config.ccache = Some(s.to_string()) - } + Some(StringOrBool::String(ref s)) => config.ccache = Some(s.to_string()), Some(StringOrBool::Bool(true)) => { config.ccache = Some("ccache".to_string()); } @@ -510,6 +521,7 @@ impl Config { } set(&mut config.ninja, llvm.ninja); llvm_assertions = llvm.assertions; + llvm_skip_rebuild = llvm_skip_rebuild.or(llvm.skip_rebuild); set(&mut config.llvm_optimize, llvm.optimize); set(&mut config.llvm_thin_lto, llvm.thin_lto); set(&mut config.llvm_release_debuginfo, llvm.release_debuginfo); @@ -564,12 +576,12 @@ impl Config { set(&mut config.deny_warnings, flags.deny_warnings.or(rust.deny_warnings)); set(&mut config.backtrace_on_ice, rust.backtrace_on_ice); set(&mut config.rust_verify_llvm_ir, rust.verify_llvm_ir); + config.rust_thin_lto_import_instr_limit = rust.thin_lto_import_instr_limit; set(&mut config.rust_remap_debuginfo, rust.remap_debuginfo); if let Some(ref backends) = rust.codegen_backends { - config.rust_codegen_backends = backends.iter() - .map(|s| INTERNER.intern_str(s)) - .collect(); + config.rust_codegen_backends = + backends.iter().map(|s| INTERNER.intern_str(s)).collect(); } config.rust_codegen_units = rust.codegen_units.map(threads_from_config); @@ -617,6 +629,8 @@ impl Config { set(&mut config.initial_rustc, build.rustc.map(PathBuf::from)); set(&mut config.initial_cargo, build.cargo.map(PathBuf::from)); + config.llvm_skip_rebuild = llvm_skip_rebuild.unwrap_or(false); + let default = false; config.llvm_assertions = llvm_assertions.unwrap_or(default); @@ -627,9 +641,11 @@ impl Config { config.rust_debug_assertions = debug_assertions.unwrap_or(default); let with_defaults = |debuginfo_level_specific: Option| { - debuginfo_level_specific - .or(debuginfo_level) - .unwrap_or(if debug == Some(true) { 2 } else { 0 }) + debuginfo_level_specific.or(debuginfo_level).unwrap_or(if debug == Some(true) { + 2 + } else { + 0 + }) }; config.rust_debuginfo_level_rustc = with_defaults(debuginfo_level_rustc); config.rust_debuginfo_level_std = with_defaults(debuginfo_level_std); diff --git a/src/bootstrap/configure.py b/src/bootstrap/configure.py index bb6041d7f3..7cfc5385e2 100755 --- a/src/bootstrap/configure.py +++ b/src/bootstrap/configure.py @@ -59,13 +59,13 @@ o("full-tools", None, "enable all tools") o("lld", "rust.lld", "build lld") o("lldb", "rust.lldb", "build lldb") o("missing-tools", "dist.missing-tools", "allow failures when building tools") -o("use-libcxx", "llvm.use_libcxx", "build LLVM with libc++") +o("use-libcxx", "llvm.use-libcxx", "build LLVM with libc++") o("cflags", "llvm.cflags", "build LLVM with these extra compiler flags") o("cxxflags", "llvm.cxxflags", "build LLVM with these extra compiler flags") o("ldflags", "llvm.ldflags", "build LLVM with these extra linker flags") -o("llvm-libunwind", "rust.llvm_libunwind", "use LLVM libunwind") +o("llvm-libunwind", "rust.llvm-libunwind", "use LLVM libunwind") # Optimization and debugging options. These may be overridden by the release # channel, etc. diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs index 02533944fc..8d13df3ee2 100644 --- a/src/bootstrap/dist.rs +++ b/src/bootstrap/dist.rs @@ -11,18 +11,18 @@ use std::env; use std::fs; use std::io::Write; -use std::path::{PathBuf, Path}; +use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use build_helper::{output, t}; -use crate::{Compiler, Mode, LLVM_TOOLS}; -use crate::channel; -use crate::util::{is_dylib, exe, timeit}; use crate::builder::{Builder, RunConfig, ShouldRun, Step}; +use crate::cache::{Interned, INTERNER}; +use crate::channel; use crate::compile; use crate::tool::{self, Tool}; -use crate::cache::{INTERNER, Interned}; +use crate::util::{exe, is_dylib, timeit}; +use crate::{Compiler, Mode, LLVM_TOOLS}; use time::{self, Timespec}; pub fn pkgname(builder: &Builder<'_>, component: &str) -> String { @@ -80,9 +80,7 @@ impl Step for Docs { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Docs { - host: run.target, - }); + run.builder.ensure(Docs { host: run.target }); } /// Builds the `rust-docs` installer component. @@ -110,16 +108,19 @@ impl Step for Docs { let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust-Documentation") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=Rust-documentation-is-installed.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg(format!("--package-name={}-{}", name, host)) - .arg("--component-name=rust-docs") - .arg("--legacy-manifest-dirs=rustlib,cargo") - .arg("--bulk-dirs=share/doc/rust/html"); + .arg("--product-name=Rust-Documentation") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=Rust-documentation-is-installed.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg(format!("--package-name={}-{}", name, host)) + .arg("--component-name=rust-docs") + .arg("--legacy-manifest-dirs=rustlib,cargo") + .arg("--bulk-dirs=share/doc/rust/html"); builder.run(&mut cmd); builder.remove_dir(&image); @@ -141,9 +142,7 @@ impl Step for RustcDocs { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(RustcDocs { - host: run.target, - }); + run.builder.ensure(RustcDocs { host: run.target }); } /// Builds the `rustc-docs` installer component. @@ -168,16 +167,19 @@ impl Step for RustcDocs { let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rustc-Documentation") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=Rustc-documentation-is-installed.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg(format!("--package-name={}-{}", name, host)) - .arg("--component-name=rustc-docs") - .arg("--legacy-manifest-dirs=rustlib,cargo") - .arg("--bulk-dirs=share/doc/rust/html"); + .arg("--product-name=Rustc-Documentation") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=Rustc-documentation-is-installed.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg(format!("--package-name={}-{}", name, host)) + .arg("--component-name=rustc-docs") + .arg("--legacy-manifest-dirs=rustlib,cargo") + .arg("--bulk-dirs=share/doc/rust/html"); builder.info(&format!("Dist compiler docs ({})", host)); let _time = timeit(builder); @@ -192,10 +194,7 @@ fn find_files(files: &[&str], path: &[PathBuf]) -> Vec { let mut found = Vec::with_capacity(files.len()); for file in files { - let file_path = - path.iter() - .map(|dir| dir.join(file)) - .find(|p| p.exists()); + let file_path = path.iter().map(|dir| dir.join(file)).find(|p| p.exists()); if let Some(file_path) = file_path { found.push(file_path); @@ -208,7 +207,10 @@ fn find_files(files: &[&str], path: &[PathBuf]) -> Vec { } fn make_win_dist( - rust_root: &Path, plat_root: &Path, target_triple: Interned, builder: &Builder<'_> + rust_root: &Path, + plat_root: &Path, + target_triple: Interned, + builder: &Builder<'_>, ) { //Ask gcc where it keeps its stuff let mut cmd = Command::new(builder.cc(target_triple)); @@ -222,11 +224,7 @@ fn make_win_dist( let idx = line.find(':').unwrap(); let key = &line[..idx]; let trim_chars: &[_] = &[' ', '=']; - let value = - line[(idx + 1)..] - .trim_start_matches(trim_chars) - .split(';') - .map(PathBuf::from); + let value = line[(idx + 1)..].trim_start_matches(trim_chars).split(';').map(PathBuf::from); if key == "programs" { bin_path.extend(value); @@ -243,7 +241,8 @@ fn make_win_dist( rustc_dlls.push("libgcc_s_seh-1.dll"); } - let target_libs = [ //MinGW libs + let target_libs = [ + //MinGW libs "libgcc.a", "libgcc_eh.a", "libgcc_s.a", @@ -312,7 +311,7 @@ fn make_win_dist( &target_bin_dir.join("GCC-WARNING.txt"), "gcc.exe contained in this folder cannot be used for compiling C files - it is only\ used as a linker. In order to be able to compile projects containing C code use\ - the GCC provided by MinGW or Cygwin." + the GCC provided by MinGW or Cygwin.", ); //Copy platform libs to platform-specific lib directory @@ -366,15 +365,18 @@ impl Step for Mingw { let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust-MinGW") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=Rust-MinGW-is-installed.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg(format!("--package-name={}-{}", name, host)) - .arg("--component-name=rust-mingw") - .arg("--legacy-manifest-dirs=rustlib,cargo"); + .arg("--product-name=Rust-MinGW") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=Rust-MinGW-is-installed.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg(format!("--package-name={}-{}", name, host)) + .arg("--component-name=rust-mingw") + .arg("--legacy-manifest-dirs=rustlib,cargo"); builder.run(&mut cmd); t!(fs::remove_dir_all(&image)); Some(distdir(builder).join(format!("{}-{}.tar.gz", name, host))) @@ -396,9 +398,8 @@ impl Step for Rustc { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Rustc { - compiler: run.builder.compiler(run.builder.top_stage, run.target), - }); + run.builder + .ensure(Rustc { compiler: run.builder.compiler(run.builder.top_stage, run.target) }); } /// Creates the `rustc` installer component. @@ -452,16 +453,20 @@ impl Step for Rustc { // Finally, wrap everything up in a nice tarball! let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=Rust-is-ready-to-roll.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg("--non-installed-overlay").arg(&overlay) - .arg(format!("--package-name={}-{}", name, host)) - .arg("--component-name=rustc") - .arg("--legacy-manifest-dirs=rustlib,cargo"); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=Rust-is-ready-to-roll.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg("--non-installed-overlay") + .arg(&overlay) + .arg(format!("--package-name={}-{}", name, host)) + .arg("--component-name=rustc") + .arg("--legacy-manifest-dirs=rustlib,cargo"); builder.info(&format!("Dist rustc stage{} ({})", compiler.stage, host)); let _time = timeit(builder); @@ -508,16 +513,10 @@ impl Step for Rustc { // Copy over lld if it's there if builder.config.lld_enabled { let exe = exe("rust-lld", &compiler.host); - let src = builder.sysroot_libdir(compiler, host) - .parent() - .unwrap() - .join("bin") - .join(&exe); + let src = + builder.sysroot_libdir(compiler, host).parent().unwrap().join("bin").join(&exe); // for the rationale about this rename check `compile::copy_lld_to_sysroot` - let dst = image.join("lib/rustlib") - .join(&*host) - .join("bin") - .join(&exe); + let dst = image.join("lib/rustlib").join(&*host).join("bin").join(&exe); t!(fs::create_dir_all(&dst.parent().unwrap())); builder.copy(&src, &dst); } @@ -530,9 +529,10 @@ impl Step for Rustc { // Reproducible builds: If SOURCE_DATE_EPOCH is set, use that as the time. let time = env::var("SOURCE_DATE_EPOCH") .map(|timestamp| { - let epoch = timestamp.parse().map_err(|err| { - format!("could not parse SOURCE_DATE_EPOCH: {}", err) - }).unwrap(); + let epoch = timestamp + .parse() + .map_err(|err| format!("could not parse SOURCE_DATE_EPOCH: {}", err)) + .unwrap(); time::at(Timespec::new(epoch, 0)) }) @@ -546,16 +546,18 @@ impl Step for Rustc { let page_dst = man_dst.join(file_entry.file_name()); t!(fs::copy(&page_src, &page_dst)); // template in month/year and version number - builder.replace_in_file(&page_dst, - &[("", &month_year), - ("", channel::CFG_RELEASE_NUM)]); + builder.replace_in_file( + &page_dst, + &[ + ("", &month_year), + ("", channel::CFG_RELEASE_NUM), + ], + ); } // Debugger scripts - builder.ensure(DebuggerScripts { - sysroot: INTERNER.intern_path(image.to_owned()), - host, - }); + builder + .ensure(DebuggerScripts { sysroot: INTERNER.intern_path(image.to_owned()), host }); // Misc license info let cp = |file: &str| { @@ -600,8 +602,11 @@ impl Step for DebuggerScripts { }; if host.contains("windows-msvc") { // windbg debugger scripts - builder.install(&builder.src.join("src/etc/rust-windbg.cmd"), &sysroot.join("bin"), - 0o755); + builder.install( + &builder.src.join("src/etc/rust-windbg.cmd"), + &sysroot.join("bin"), + 0o755, + ); cp_debugger_script("natvis/intrinsic.natvis"); cp_debugger_script("natvis/liballoc.natvis"); @@ -611,17 +616,14 @@ impl Step for DebuggerScripts { cp_debugger_script("debugger_pretty_printers_common.py"); // gdb debugger scripts - builder.install(&builder.src.join("src/etc/rust-gdb"), &sysroot.join("bin"), - 0o755); - builder.install(&builder.src.join("src/etc/rust-gdbgui"), &sysroot.join("bin"), - 0o755); + builder.install(&builder.src.join("src/etc/rust-gdb"), &sysroot.join("bin"), 0o755); + builder.install(&builder.src.join("src/etc/rust-gdbgui"), &sysroot.join("bin"), 0o755); cp_debugger_script("gdb_load_rust_pretty_printers.py"); cp_debugger_script("gdb_rust_pretty_printing.py"); // lldb debugger scripts - builder.install(&builder.src.join("src/etc/rust-lldb"), &sysroot.join("bin"), - 0o755); + builder.install(&builder.src.join("src/etc/rust-lldb"), &sysroot.join("bin"), 0o755); cp_debugger_script("lldb_rust_formatters.py"); } @@ -696,18 +698,21 @@ impl Step for Std { let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=std-is-standing-at-the-ready.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg(format!("--package-name={}-{}", name, target)) - .arg(format!("--component-name=rust-std-{}", target)) - .arg("--legacy-manifest-dirs=rustlib,cargo"); - - builder.info(&format!("Dist std stage{} ({} -> {})", - compiler.stage, &compiler.host, target)); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=std-is-standing-at-the-ready.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg(format!("--package-name={}-{}", name, target)) + .arg(format!("--component-name=rust-std-{}", target)) + .arg("--legacy-manifest-dirs=rustlib,cargo"); + + builder + .info(&format!("Dist std stage{} ({} -> {})", compiler.stage, &compiler.host, target)); let _time = timeit(builder); builder.run(&mut cmd); builder.remove_dir(&image); @@ -762,18 +767,23 @@ impl Step for RustcDev { let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=Rust-is-ready-to-develop.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg(format!("--package-name={}-{}", name, target)) - .arg(format!("--component-name=rustc-dev-{}", target)) - .arg("--legacy-manifest-dirs=rustlib,cargo"); - - builder.info(&format!("Dist rustc-dev stage{} ({} -> {})", - compiler.stage, &compiler.host, target)); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=Rust-is-ready-to-develop.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg(format!("--package-name={}-{}", name, target)) + .arg(format!("--component-name=rustc-dev-{}", target)) + .arg("--legacy-manifest-dirs=rustlib,cargo"); + + builder.info(&format!( + "Dist rustc-dev stage{} ({} -> {})", + compiler.stage, &compiler.host, target + )); let _time = timeit(builder); builder.run(&mut cmd); builder.remove_dir(&image); @@ -825,8 +835,11 @@ impl Step for Analysis { let image = tmpdir(builder).join(format!("{}-{}-image", name, target)); - let src = builder.stage_out(compiler, Mode::Std) - .join(target).join(builder.cargo_dir()).join("deps"); + let src = builder + .stage_out(compiler, Mode::Std) + .join(target) + .join(builder.cargo_dir()) + .join("deps"); let image_src = src.join("save-analysis"); let dst = image.join("lib/rustlib").join(target).join("analysis"); @@ -836,15 +849,18 @@ impl Step for Analysis { let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=save-analysis-saved.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg(format!("--package-name={}-{}", name, target)) - .arg(format!("--component-name=rust-analysis-{}", target)) - .arg("--legacy-manifest-dirs=rustlib,cargo"); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=save-analysis-saved.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg(format!("--package-name={}-{}", name, target)) + .arg(format!("--component-name=rust-analysis-{}", target)) + .arg("--legacy-manifest-dirs=rustlib,cargo"); builder.info("Dist analysis"); let _time = timeit(builder); @@ -861,31 +877,35 @@ fn copy_src_dirs(builder: &Builder<'_>, src_dirs: &[&str], exclude_dirs: &[&str] None => return false, }; if spath.ends_with("~") || spath.ends_with(".pyc") { - return false + return false; } const LLVM_PROJECTS: &[&str] = &[ - "llvm-project/clang", "llvm-project\\clang", - "llvm-project/libunwind", "llvm-project\\libunwind", - "llvm-project/lld", "llvm-project\\lld", - "llvm-project/lldb", "llvm-project\\lldb", - "llvm-project/llvm", "llvm-project\\llvm", - "llvm-project/compiler-rt", "llvm-project\\compiler-rt", + "llvm-project/clang", + "llvm-project\\clang", + "llvm-project/libunwind", + "llvm-project\\libunwind", + "llvm-project/lld", + "llvm-project\\lld", + "llvm-project/lldb", + "llvm-project\\lldb", + "llvm-project/llvm", + "llvm-project\\llvm", + "llvm-project/compiler-rt", + "llvm-project\\compiler-rt", ]; - if spath.contains("llvm-project") && !spath.ends_with("llvm-project") + if spath.contains("llvm-project") + && !spath.ends_with("llvm-project") && !LLVM_PROJECTS.iter().any(|path| spath.contains(path)) { return false; } - const LLVM_TEST: &[&str] = &[ - "llvm-project/llvm/test", "llvm-project\\llvm\\test", - ]; - if LLVM_TEST.iter().any(|path| spath.contains(path)) && - (spath.ends_with(".ll") || - spath.ends_with(".td") || - spath.ends_with(".s")) { - return false + const LLVM_TEST: &[&str] = &["llvm-project/llvm/test", "llvm-project\\llvm\\test"]; + if LLVM_TEST.iter().any(|path| spath.contains(path)) + && (spath.ends_with(".ll") || spath.ends_with(".td") || spath.ends_with(".s")) + { + return false; } let full_path = Path::new(dir).join(path); @@ -894,22 +914,37 @@ fn copy_src_dirs(builder: &Builder<'_>, src_dirs: &[&str], exclude_dirs: &[&str] } let excludes = [ - "CVS", "RCS", "SCCS", ".git", ".gitignore", ".gitmodules", - ".gitattributes", ".cvsignore", ".svn", ".arch-ids", "{arch}", - "=RELEASE-ID", "=meta-update", "=update", ".bzr", ".bzrignore", - ".bzrtags", ".hg", ".hgignore", ".hgrags", "_darcs", + "CVS", + "RCS", + "SCCS", + ".git", + ".gitignore", + ".gitmodules", + ".gitattributes", + ".cvsignore", + ".svn", + ".arch-ids", + "{arch}", + "=RELEASE-ID", + "=meta-update", + "=update", + ".bzr", + ".bzrignore", + ".bzrtags", + ".hg", + ".hgignore", + ".hgrags", + "_darcs", ]; - !path.iter() - .map(|s| s.to_str().unwrap()) - .any(|s| excludes.contains(&s)) + !path.iter().map(|s| s.to_str().unwrap()).any(|s| excludes.contains(&s)) } // Copy the directories using our filter for item in src_dirs { let dst = &dst_dir.join(item); t!(fs::create_dir_all(dst)); - builder.cp_filtered( - &builder.src.join(item), dst, &|path| filter_fn(exclude_dirs, item, path)); + builder + .cp_filtered(&builder.src.join(item), dst, &|path| filter_fn(exclude_dirs, item, path)); } } @@ -940,9 +975,7 @@ impl Step for Src { let dst_src = dst.join("rust"); t!(fs::create_dir_all(&dst_src)); - let src_files = [ - "Cargo.lock", - ]; + let src_files = ["Cargo.lock"]; // This is the reduced set of paths which will become the rust-src component // (essentially libstd and all of its path dependencies) let std_src_dirs = [ @@ -951,10 +984,6 @@ impl Step for Src { "src/libcore", "src/libpanic_abort", "src/libpanic_unwind", - "src/librustc_asan", - "src/librustc_lsan", - "src/librustc_msan", - "src/librustc_tsan", "src/libstd", "src/libunwind", "src/libtest", @@ -977,15 +1006,18 @@ impl Step for Src { // Create source tarball in rust-installer format let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=Awesome-Source.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg(format!("--package-name={}", name)) - .arg("--component-name=rust-src") - .arg("--legacy-manifest-dirs=rustlib,cargo"); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=Awesome-Source.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg(format!("--package-name={}", name)) + .arg("--component-name=rust-src") + .arg("--legacy-manifest-dirs=rustlib,cargo"); builder.info("Dist src"); let _time = timeit(builder); @@ -1036,9 +1068,7 @@ impl Step for PlainSourceTarball { "Cargo.toml", "Cargo.lock", ]; - let src_dirs = [ - "src", - ]; + let src_dirs = ["src"]; copy_src_dirs(builder, &src_dirs[..], &[], &plain_dst_src); @@ -1057,8 +1087,7 @@ impl Step for PlainSourceTarball { if builder.rust_info.is_git() { // Vendor all Cargo dependencies let mut cmd = Command::new(&builder.initial_cargo); - cmd.arg("vendor") - .current_dir(&plain_dst_src); + cmd.arg("vendor").current_dir(&plain_dst_src); builder.run(&mut cmd); } @@ -1073,10 +1102,12 @@ impl Step for PlainSourceTarball { builder.info("running installer"); let mut cmd = rust_installer(builder); cmd.arg("tarball") - .arg("--input").arg(&plain_name) - .arg("--output").arg(&tarball) - .arg("--work-dir=.") - .current_dir(tmpdir(builder)); + .arg("--input") + .arg(&plain_name) + .arg("--output") + .arg(&tarball) + .arg("--work-dir=.") + .current_dir(tmpdir(builder)); builder.info("Create plain source tarball"); let _time = timeit(builder); @@ -1095,10 +1126,10 @@ pub fn sanitize_sh(path: &Path) -> String { let mut ch = s.chars(); let drive = ch.next().unwrap_or('C'); if ch.next() != Some(':') { - return None + return None; } if ch.next() != Some('/') { - return None + return None; } Some(format!("/{}/{}", drive, &s[drive.len_utf8() + 2..])) } @@ -1154,8 +1185,7 @@ impl Step for Cargo { builder.install(&man.path(), &image.join("share/man/man1"), 0o644); } builder.install(&etc.join("_cargo"), &image.join("share/zsh/site-functions"), 0o644); - builder.copy(&etc.join("cargo.bashcomp.sh"), - &image.join("etc/bash_completion.d/cargo")); + builder.copy(&etc.join("cargo.bashcomp.sh"), &image.join("etc/bash_completion.d/cargo")); let doc = image.join("share/doc/cargo"); builder.install(&src.join("README.md"), &doc, 0o644); builder.install(&src.join("LICENSE-MIT"), &doc, 0o644); @@ -1175,16 +1205,20 @@ impl Step for Cargo { // Generate the installer tarball let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=Rust-is-ready-to-roll.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg("--non-installed-overlay").arg(&overlay) - .arg(format!("--package-name={}-{}", name, target)) - .arg("--component-name=cargo") - .arg("--legacy-manifest-dirs=rustlib,cargo"); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=Rust-is-ready-to-roll.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg("--non-installed-overlay") + .arg(&overlay) + .arg(format!("--package-name={}-{}", name, target)) + .arg("--component-name=cargo") + .arg("--legacy-manifest-dirs=rustlib,cargo"); builder.info(&format!("Dist cargo stage{} ({})", compiler.stage, target)); let _time = timeit(builder); @@ -1236,11 +1270,12 @@ impl Step for Rls { // Prepare the image directory // We expect RLS to build, because we've exited this step above if tool // state for RLS isn't testing. - let rls = builder.ensure(tool::Rls { - compiler, - target, - extra_features: Vec::new(), - }).or_else(|| { missing_tool("RLS", builder.build.config.missing_tools); None })?; + let rls = builder + .ensure(tool::Rls { compiler, target, extra_features: Vec::new() }) + .or_else(|| { + missing_tool("RLS", builder.build.config.missing_tools); + None + })?; builder.install(&rls, &image.join("bin"), 0o755); let doc = image.join("share/doc/rls"); @@ -1260,16 +1295,20 @@ impl Step for Rls { // Generate the installer tarball let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=RLS-ready-to-serve.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg("--non-installed-overlay").arg(&overlay) - .arg(format!("--package-name={}-{}", name, target)) - .arg("--legacy-manifest-dirs=rustlib,cargo") - .arg("--component-name=rls-preview"); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=RLS-ready-to-serve.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg("--non-installed-overlay") + .arg(&overlay) + .arg(format!("--package-name={}-{}", name, target)) + .arg("--legacy-manifest-dirs=rustlib,cargo") + .arg("--component-name=rls-preview"); builder.info(&format!("Dist RLS stage{} ({})", compiler.stage, target)); let _time = timeit(builder); @@ -1321,15 +1360,18 @@ impl Step for Clippy { // Prepare the image directory // We expect clippy to build, because we've exited this step above if tool // state for clippy isn't testing. - let clippy = builder.ensure(tool::Clippy { - compiler, - target, - extra_features: Vec::new(), - }).or_else(|| { missing_tool("clippy", builder.build.config.missing_tools); None })?; - let cargoclippy = builder.ensure(tool::CargoClippy { - compiler, - target, extra_features: Vec::new() - }).or_else(|| { missing_tool("cargo clippy", builder.build.config.missing_tools); None })?; + let clippy = builder + .ensure(tool::Clippy { compiler, target, extra_features: Vec::new() }) + .or_else(|| { + missing_tool("clippy", builder.build.config.missing_tools); + None + })?; + let cargoclippy = builder + .ensure(tool::CargoClippy { compiler, target, extra_features: Vec::new() }) + .or_else(|| { + missing_tool("cargo clippy", builder.build.config.missing_tools); + None + })?; builder.install(&clippy, &image.join("bin"), 0o755); builder.install(&cargoclippy, &image.join("bin"), 0o755); @@ -1350,16 +1392,20 @@ impl Step for Clippy { // Generate the installer tarball let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=clippy-ready-to-serve.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg("--non-installed-overlay").arg(&overlay) - .arg(format!("--package-name={}-{}", name, target)) - .arg("--legacy-manifest-dirs=rustlib,cargo") - .arg("--component-name=clippy-preview"); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=clippy-ready-to-serve.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg("--non-installed-overlay") + .arg(&overlay) + .arg(format!("--package-name={}-{}", name, target)) + .arg("--legacy-manifest-dirs=rustlib,cargo") + .arg("--component-name=clippy-preview"); builder.info(&format!("Dist clippy stage{} ({})", compiler.stage, target)); let _time = timeit(builder); @@ -1411,16 +1457,18 @@ impl Step for Miri { // Prepare the image directory // We expect miri to build, because we've exited this step above if tool // state for miri isn't testing. - let miri = builder.ensure(tool::Miri { - compiler, - target, - extra_features: Vec::new(), - }).or_else(|| { missing_tool("miri", builder.build.config.missing_tools); None })?; - let cargomiri = builder.ensure(tool::CargoMiri { - compiler, - target, - extra_features: Vec::new() - }).or_else(|| { missing_tool("cargo miri", builder.build.config.missing_tools); None })?; + let miri = builder + .ensure(tool::Miri { compiler, target, extra_features: Vec::new() }) + .or_else(|| { + missing_tool("miri", builder.build.config.missing_tools); + None + })?; + let cargomiri = builder + .ensure(tool::CargoMiri { compiler, target, extra_features: Vec::new() }) + .or_else(|| { + missing_tool("cargo miri", builder.build.config.missing_tools); + None + })?; builder.install(&miri, &image.join("bin"), 0o755); builder.install(&cargomiri, &image.join("bin"), 0o755); @@ -1441,16 +1489,20 @@ impl Step for Miri { // Generate the installer tarball let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=miri-ready-to-serve.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg("--non-installed-overlay").arg(&overlay) - .arg(format!("--package-name={}-{}", name, target)) - .arg("--legacy-manifest-dirs=rustlib,cargo") - .arg("--component-name=miri-preview"); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=miri-ready-to-serve.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg("--non-installed-overlay") + .arg(&overlay) + .arg(format!("--package-name={}-{}", name, target)) + .arg("--legacy-manifest-dirs=rustlib,cargo") + .arg("--component-name=miri-preview"); builder.info(&format!("Dist miri stage{} ({})", compiler.stage, target)); let _time = timeit(builder); @@ -1499,16 +1551,18 @@ impl Step for Rustfmt { builder.create_dir(&image); // Prepare the image directory - let rustfmt = builder.ensure(tool::Rustfmt { - compiler, - target, - extra_features: Vec::new(), - }).or_else(|| { missing_tool("Rustfmt", builder.build.config.missing_tools); None })?; - let cargofmt = builder.ensure(tool::Cargofmt { - compiler, - target, - extra_features: Vec::new(), - }).or_else(|| { missing_tool("Cargofmt", builder.build.config.missing_tools); None })?; + let rustfmt = builder + .ensure(tool::Rustfmt { compiler, target, extra_features: Vec::new() }) + .or_else(|| { + missing_tool("Rustfmt", builder.build.config.missing_tools); + None + })?; + let cargofmt = builder + .ensure(tool::Cargofmt { compiler, target, extra_features: Vec::new() }) + .or_else(|| { + missing_tool("Cargofmt", builder.build.config.missing_tools); + None + })?; builder.install(&rustfmt, &image.join("bin"), 0o755); builder.install(&cargofmt, &image.join("bin"), 0o755); @@ -1529,16 +1583,20 @@ impl Step for Rustfmt { // Generate the installer tarball let mut cmd = rust_installer(builder); cmd.arg("generate") - .arg("--product-name=Rust") - .arg("--rel-manifest-dir=rustlib") - .arg("--success-message=rustfmt-ready-to-fmt.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg("--non-installed-overlay").arg(&overlay) - .arg(format!("--package-name={}-{}", name, target)) - .arg("--legacy-manifest-dirs=rustlib,cargo") - .arg("--component-name=rustfmt-preview"); + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=rustfmt-ready-to-fmt.") + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg("--non-installed-overlay") + .arg(&overlay) + .arg(format!("--package-name={}-{}", name, target)) + .arg("--legacy-manifest-dirs=rustlib,cargo") + .arg("--component-name=rustfmt-preview"); builder.info(&format!("Dist Rustfmt stage{} ({})", compiler.stage, target)); let _time = timeit(builder); @@ -1580,9 +1638,7 @@ impl Step for Extended { builder.info(&format!("Dist extended stage{} ({})", compiler.stage, target)); - let rustc_installer = builder.ensure(Rustc { - compiler: builder.compiler(stage, target), - }); + let rustc_installer = builder.ensure(Rustc { compiler: builder.compiler(stage, target) }); let cargo_installer = builder.ensure(Cargo { compiler, target }); let rustfmt_installer = builder.ensure(Rustfmt { compiler, target }); let rls_installer = builder.ensure(Rls { compiler, target }); @@ -1593,11 +1649,9 @@ impl Step for Extended { let mingw_installer = builder.ensure(Mingw { host: target }); let analysis_installer = builder.ensure(Analysis { compiler, target }); - let docs_installer = builder.ensure(Docs { host: target, }); - let std_installer = builder.ensure(Std { - compiler: builder.compiler(stage, target), - target, - }); + let docs_installer = builder.ensure(Docs { host: target }); + let std_installer = + builder.ensure(Std { compiler: builder.compiler(stage, target), target }); let tmp = tmpdir(builder); let overlay = tmp.join("extended-overlay"); @@ -1648,12 +1702,16 @@ impl Step for Extended { .arg("--product-name=Rust") .arg("--rel-manifest-dir=rustlib") .arg("--success-message=Rust-is-ready-to-roll.") - .arg("--work-dir").arg(&work) - .arg("--output-dir").arg(&distdir(builder)) + .arg("--work-dir") + .arg(&work) + .arg("--output-dir") + .arg(&distdir(builder)) .arg(format!("--package-name={}-{}", pkgname(builder, "rust"), target)) .arg("--legacy-manifest-dirs=rustlib,cargo") - .arg("--input-tarballs").arg(input_tarballs) - .arg("--non-installed-overlay").arg(&overlay); + .arg("--input-tarballs") + .arg(input_tarballs) + .arg("--non-installed-overlay") + .arg(&overlay); let time = timeit(&builder); builder.run(&mut cmd); drop(time); @@ -1718,8 +1776,10 @@ impl Step for Extended { let pkgbuild = |component: &str| { let mut cmd = Command::new("pkgbuild"); - cmd.arg("--identifier").arg(format!("org.rust-lang.{}", component)) - .arg("--scripts").arg(pkg.join(component)) + cmd.arg("--identifier") + .arg(format!("org.rust-lang.{}", component)) + .arg("--scripts") + .arg(pkg.join(component)) .arg("--nopayload") .arg(pkg.join(component).with_extension("pkg")); builder.run(&mut cmd); @@ -1727,8 +1787,10 @@ impl Step for Extended { let prepare = |name: &str| { builder.create_dir(&pkg.join(name)); - builder.cp_r(&work.join(&format!("{}-{}", pkgname(builder, name), target)), - &pkg.join(name)); + builder.cp_r( + &work.join(&format!("{}-{}", pkgname(builder, name), target)), + &pkg.join(name), + ); builder.install(&etc.join("pkg/postinstall"), &pkg.join(name), 0o755); pkgbuild(name); }; @@ -1756,12 +1818,13 @@ impl Step for Extended { builder.create(&pkg.join("res/LICENSE.txt"), &license); builder.install(&etc.join("gfx/rust-logo.png"), &pkg.join("res"), 0o644); let mut cmd = Command::new("productbuild"); - cmd.arg("--distribution").arg(xform(&etc.join("pkg/Distribution.xml"))) - .arg("--resources").arg(pkg.join("res")) - .arg(distdir(builder).join(format!("{}-{}.pkg", - pkgname(builder, "rust"), - target))) - .arg("--package-path").arg(&pkg); + cmd.arg("--distribution") + .arg(xform(&etc.join("pkg/Distribution.xml"))) + .arg("--resources") + .arg(pkg.join("res")) + .arg(distdir(builder).join(format!("{}-{}.pkg", pkgname(builder, "rust"), target))) + .arg("--package-path") + .arg(&pkg); let _time = timeit(builder); builder.run(&mut cmd); } @@ -1783,9 +1846,10 @@ impl Step for Extended { } else { name.to_string() }; - builder.cp_r(&work.join(&format!("{}-{}", pkgname(builder, name), target)) - .join(dir), - &exe.join(name)); + builder.cp_r( + &work.join(&format!("{}-{}", pkgname(builder, name), target)).join(dir), + &exe.join(name), + ); builder.remove(&exe.join(name).join("manifest.in")); }; prepare("rustc"); @@ -1815,9 +1879,7 @@ impl Step for Extended { // Generate exe installer builder.info("building `exe` installer with `iscc`"); let mut cmd = Command::new("iscc"); - cmd.arg("rust.iss") - .arg("/Q") - .current_dir(&exe); + cmd.arg("rust.iss").arg("/Q").current_dir(&exe); if target.contains("windows-gnu") { cmd.arg("/dMINGW"); } @@ -1825,9 +1887,11 @@ impl Step for Extended { let time = timeit(builder); builder.run(&mut cmd); drop(time); - builder.install(&exe.join(format!("{}-{}.exe", pkgname(builder, "rust"), target)), - &distdir(builder), - 0o755); + builder.install( + &exe.join(format!("{}-{}.exe", pkgname(builder, "rust"), target)), + &distdir(builder), + 0o755, + ); // Generate msi installer let wix = PathBuf::from(env::var_os("WIX").unwrap()); @@ -1836,106 +1900,165 @@ impl Step for Extended { let light = wix.join("bin/light.exe"); let heat_flags = ["-nologo", "-gg", "-sfrag", "-srd", "-sreg"]; - builder.run(Command::new(&heat) - .current_dir(&exe) - .arg("dir") - .arg("rustc") - .args(&heat_flags) - .arg("-cg").arg("RustcGroup") - .arg("-dr").arg("Rustc") - .arg("-var").arg("var.RustcDir") - .arg("-out").arg(exe.join("RustcGroup.wxs"))); - builder.run(Command::new(&heat) - .current_dir(&exe) - .arg("dir") - .arg("rust-docs") - .args(&heat_flags) - .arg("-cg").arg("DocsGroup") - .arg("-dr").arg("Docs") - .arg("-var").arg("var.DocsDir") - .arg("-out").arg(exe.join("DocsGroup.wxs")) - .arg("-t").arg(etc.join("msi/squash-components.xsl"))); - builder.run(Command::new(&heat) - .current_dir(&exe) - .arg("dir") - .arg("cargo") - .args(&heat_flags) - .arg("-cg").arg("CargoGroup") - .arg("-dr").arg("Cargo") - .arg("-var").arg("var.CargoDir") - .arg("-out").arg(exe.join("CargoGroup.wxs")) - .arg("-t").arg(etc.join("msi/remove-duplicates.xsl"))); - builder.run(Command::new(&heat) - .current_dir(&exe) - .arg("dir") - .arg("rust-std") - .args(&heat_flags) - .arg("-cg").arg("StdGroup") - .arg("-dr").arg("Std") - .arg("-var").arg("var.StdDir") - .arg("-out").arg(exe.join("StdGroup.wxs"))); + builder.run( + Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("rustc") + .args(&heat_flags) + .arg("-cg") + .arg("RustcGroup") + .arg("-dr") + .arg("Rustc") + .arg("-var") + .arg("var.RustcDir") + .arg("-out") + .arg(exe.join("RustcGroup.wxs")), + ); + builder.run( + Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("rust-docs") + .args(&heat_flags) + .arg("-cg") + .arg("DocsGroup") + .arg("-dr") + .arg("Docs") + .arg("-var") + .arg("var.DocsDir") + .arg("-out") + .arg(exe.join("DocsGroup.wxs")) + .arg("-t") + .arg(etc.join("msi/squash-components.xsl")), + ); + builder.run( + Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("cargo") + .args(&heat_flags) + .arg("-cg") + .arg("CargoGroup") + .arg("-dr") + .arg("Cargo") + .arg("-var") + .arg("var.CargoDir") + .arg("-out") + .arg(exe.join("CargoGroup.wxs")) + .arg("-t") + .arg(etc.join("msi/remove-duplicates.xsl")), + ); + builder.run( + Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("rust-std") + .args(&heat_flags) + .arg("-cg") + .arg("StdGroup") + .arg("-dr") + .arg("Std") + .arg("-var") + .arg("var.StdDir") + .arg("-out") + .arg(exe.join("StdGroup.wxs")), + ); if rls_installer.is_some() { - builder.run(Command::new(&heat) - .current_dir(&exe) - .arg("dir") - .arg("rls") - .args(&heat_flags) - .arg("-cg").arg("RlsGroup") - .arg("-dr").arg("Rls") - .arg("-var").arg("var.RlsDir") - .arg("-out").arg(exe.join("RlsGroup.wxs")) - .arg("-t").arg(etc.join("msi/remove-duplicates.xsl"))); + builder.run( + Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("rls") + .args(&heat_flags) + .arg("-cg") + .arg("RlsGroup") + .arg("-dr") + .arg("Rls") + .arg("-var") + .arg("var.RlsDir") + .arg("-out") + .arg(exe.join("RlsGroup.wxs")) + .arg("-t") + .arg(etc.join("msi/remove-duplicates.xsl")), + ); } if clippy_installer.is_some() { - builder.run(Command::new(&heat) - .current_dir(&exe) - .arg("dir") - .arg("clippy") - .args(&heat_flags) - .arg("-cg").arg("ClippyGroup") - .arg("-dr").arg("Clippy") - .arg("-var").arg("var.ClippyDir") - .arg("-out").arg(exe.join("ClippyGroup.wxs")) - .arg("-t").arg(etc.join("msi/remove-duplicates.xsl"))); + builder.run( + Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("clippy") + .args(&heat_flags) + .arg("-cg") + .arg("ClippyGroup") + .arg("-dr") + .arg("Clippy") + .arg("-var") + .arg("var.ClippyDir") + .arg("-out") + .arg(exe.join("ClippyGroup.wxs")) + .arg("-t") + .arg(etc.join("msi/remove-duplicates.xsl")), + ); } if miri_installer.is_some() { - builder.run(Command::new(&heat) - .current_dir(&exe) - .arg("dir") - .arg("miri") - .args(&heat_flags) - .arg("-cg").arg("MiriGroup") - .arg("-dr").arg("Miri") - .arg("-var").arg("var.MiriDir") - .arg("-out").arg(exe.join("MiriGroup.wxs")) - .arg("-t").arg(etc.join("msi/remove-duplicates.xsl"))); + builder.run( + Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("miri") + .args(&heat_flags) + .arg("-cg") + .arg("MiriGroup") + .arg("-dr") + .arg("Miri") + .arg("-var") + .arg("var.MiriDir") + .arg("-out") + .arg(exe.join("MiriGroup.wxs")) + .arg("-t") + .arg(etc.join("msi/remove-duplicates.xsl")), + ); } - builder.run(Command::new(&heat) - .current_dir(&exe) - .arg("dir") - .arg("rust-analysis") - .args(&heat_flags) - .arg("-cg").arg("AnalysisGroup") - .arg("-dr").arg("Analysis") - .arg("-var").arg("var.AnalysisDir") - .arg("-out").arg(exe.join("AnalysisGroup.wxs")) - .arg("-t").arg(etc.join("msi/remove-duplicates.xsl"))); + builder.run( + Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("rust-analysis") + .args(&heat_flags) + .arg("-cg") + .arg("AnalysisGroup") + .arg("-dr") + .arg("Analysis") + .arg("-var") + .arg("var.AnalysisDir") + .arg("-out") + .arg(exe.join("AnalysisGroup.wxs")) + .arg("-t") + .arg(etc.join("msi/remove-duplicates.xsl")), + ); if target.contains("windows-gnu") { - builder.run(Command::new(&heat) - .current_dir(&exe) - .arg("dir") - .arg("rust-mingw") - .args(&heat_flags) - .arg("-cg").arg("GccGroup") - .arg("-dr").arg("Gcc") - .arg("-var").arg("var.GccDir") - .arg("-out").arg(exe.join("GccGroup.wxs"))); + builder.run( + Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("rust-mingw") + .args(&heat_flags) + .arg("-cg") + .arg("GccGroup") + .arg("-dr") + .arg("Gcc") + .arg("-var") + .arg("var.GccDir") + .arg("-out") + .arg(exe.join("GccGroup.wxs")), + ); } let candle = |input: &Path| { - let output = exe.join(input.file_stem().unwrap()) - .with_extension("wixobj"); - let arch = if target.contains("x86_64") {"x64"} else {"x86"}; + let output = exe.join(input.file_stem().unwrap()).with_extension("wixobj"); + let arch = if target.contains("x86_64") { "x64" } else { "x86" }; let mut cmd = Command::new(&candle); cmd.current_dir(&exe) .arg("-nologo") @@ -1944,8 +2067,10 @@ impl Step for Extended { .arg("-dCargoDir=cargo") .arg("-dStdDir=rust-std") .arg("-dAnalysisDir=rust-analysis") - .arg("-arch").arg(&arch) - .arg("-out").arg(&output) + .arg("-arch") + .arg(&arch) + .arg("-out") + .arg(&output) .arg(&input); add_env(builder, &mut cmd, target); @@ -1993,9 +2118,12 @@ impl Step for Extended { let filename = format!("{}-{}.msi", pkgname(builder, "rust"), target); let mut cmd = Command::new(&light); cmd.arg("-nologo") - .arg("-ext").arg("WixUIExtension") - .arg("-ext").arg("WixUtilExtension") - .arg("-out").arg(exe.join(&filename)) + .arg("-ext") + .arg("WixUIExtension") + .arg("-ext") + .arg("WixUtilExtension") + .arg("-out") + .arg(exe.join(&filename)) .arg("rust.wixobj") .arg("ui.wixobj") .arg("rustwelcomedlg.wixobj") @@ -2035,29 +2163,27 @@ impl Step for Extended { fn add_env(builder: &Builder<'_>, cmd: &mut Command, target: Interned) { let mut parts = channel::CFG_RELEASE_NUM.split('.'); cmd.env("CFG_RELEASE_INFO", builder.rust_version()) - .env("CFG_RELEASE_NUM", channel::CFG_RELEASE_NUM) - .env("CFG_RELEASE", builder.rust_release()) - .env("CFG_VER_MAJOR", parts.next().unwrap()) - .env("CFG_VER_MINOR", parts.next().unwrap()) - .env("CFG_VER_PATCH", parts.next().unwrap()) - .env("CFG_VER_BUILD", "0") // just needed to build - .env("CFG_PACKAGE_VERS", builder.rust_package_vers()) - .env("CFG_PACKAGE_NAME", pkgname(builder, "rust")) - .env("CFG_BUILD", target) - .env("CFG_CHANNEL", &builder.config.channel); + .env("CFG_RELEASE_NUM", channel::CFG_RELEASE_NUM) + .env("CFG_RELEASE", builder.rust_release()) + .env("CFG_VER_MAJOR", parts.next().unwrap()) + .env("CFG_VER_MINOR", parts.next().unwrap()) + .env("CFG_VER_PATCH", parts.next().unwrap()) + .env("CFG_VER_BUILD", "0") // just needed to build + .env("CFG_PACKAGE_VERS", builder.rust_package_vers()) + .env("CFG_PACKAGE_NAME", pkgname(builder, "rust")) + .env("CFG_BUILD", target) + .env("CFG_CHANNEL", &builder.config.channel); if target.contains("windows-gnu") { - cmd.env("CFG_MINGW", "1") - .env("CFG_ABI", "GNU"); + cmd.env("CFG_MINGW", "1").env("CFG_ABI", "GNU"); } else { - cmd.env("CFG_MINGW", "0") - .env("CFG_ABI", "MSVC"); + cmd.env("CFG_MINGW", "0").env("CFG_ABI", "MSVC"); } if target.contains("x86_64") { - cmd.env("CFG_PLATFORM", "x64"); + cmd.env("CFG_PLATFORM", "x64"); } else { - cmd.env("CFG_PLATFORM", "x86"); + cmd.env("CFG_PLATFORM", "x86"); } } @@ -2130,17 +2256,11 @@ impl Step for HashSign { // // Note: This function does no yet support Windows but we also don't support // linking LLVM tools dynamically on Windows yet. -pub fn maybe_install_llvm_dylib(builder: &Builder<'_>, - target: Interned, - sysroot: &Path) { - let src_libdir = builder - .llvm_out(target) - .join("lib"); +pub fn maybe_install_llvm_dylib(builder: &Builder<'_>, target: Interned, sysroot: &Path) { + let src_libdir = builder.llvm_out(target).join("lib"); let dst_libdir1 = sysroot.join("lib/rustlib").join(&*target).join("lib"); - let dst_libdir2 = sysroot.join(builder.sysroot_libdir_relative(Compiler { - stage: 1, - host: target, - })); + let dst_libdir2 = + sysroot.join(builder.sysroot_libdir_relative(Compiler { stage: 1, host: target })); t!(fs::create_dir_all(&dst_libdir1)); t!(fs::create_dir_all(&dst_libdir2)); @@ -2150,7 +2270,7 @@ pub fn maybe_install_llvm_dylib(builder: &Builder<'_>, builder.install(&llvm_dylib_path, &dst_libdir1, 0o644); builder.install(&llvm_dylib_path, &dst_libdir2, 0o644); } - return + return; } // Usually libLLVM.so is a symlink to something like libLLVM-6.0.so. @@ -2159,11 +2279,9 @@ pub fn maybe_install_llvm_dylib(builder: &Builder<'_>, let llvm_dylib_path = src_libdir.join("libLLVM.so"); if llvm_dylib_path.exists() { let llvm_dylib_path = llvm_dylib_path.canonicalize().unwrap_or_else(|e| { - panic!("dist: Error calling canonicalize path `{}`: {}", - llvm_dylib_path.display(), e); + panic!("dist: Error calling canonicalize path `{}`: {}", llvm_dylib_path.display(), e); }); - builder.install(&llvm_dylib_path, &dst_libdir1, 0o644); builder.install(&llvm_dylib_path, &dst_libdir2, 0o644); } @@ -2183,9 +2301,7 @@ impl Step for LlvmTools { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(LlvmTools { - target: run.target, - }); + run.builder.ensure(LlvmTools { target: run.target }); } fn run(self, builder: &Builder<'_>) -> Option { @@ -2195,8 +2311,7 @@ impl Step for LlvmTools { /* run only if llvm-config isn't used */ if let Some(config) = builder.config.target_config.get(&target) { if let Some(ref _s) = config.llvm_config { - builder.info(&format!("Skipping LlvmTools ({}): external LLVM", - target)); + builder.info(&format!("Skipping LlvmTools ({}): external LLVM", target)); return None; } } @@ -2211,12 +2326,8 @@ impl Step for LlvmTools { drop(fs::remove_dir_all(&image)); // Prepare the image directory - let src_bindir = builder - .llvm_out(target) - .join("bin"); - let dst_bindir = image.join("lib/rustlib") - .join(&*target) - .join("bin"); + let src_bindir = builder.llvm_out(target).join("bin"); + let dst_bindir = image.join("lib/rustlib").join(&*target).join("bin"); t!(fs::create_dir_all(&dst_bindir)); for tool in LLVM_TOOLS { let exe = src_bindir.join(exe(tool, &target)); @@ -2237,15 +2348,18 @@ impl Step for LlvmTools { .arg("--product-name=Rust") .arg("--rel-manifest-dir=rustlib") .arg("--success-message=llvm-tools-installed.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg("--non-installed-overlay").arg(&overlay) + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg("--non-installed-overlay") + .arg(&overlay) .arg(format!("--package-name={}-{}", name, target)) .arg("--legacy-manifest-dirs=rustlib,cargo") .arg("--component-name=llvm-tools-preview"); - builder.run(&mut cmd); Some(distdir(builder).join(format!("{}-{}.tar.gz", name, target))) } @@ -2266,9 +2380,7 @@ impl Step for Lldb { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Lldb { - target: run.target, - }); + run.builder.ensure(Lldb { target: run.target }); } fn run(self, builder: &Builder<'_>) -> Option { @@ -2278,9 +2390,7 @@ impl Step for Lldb { return None; } - let bindir = builder - .llvm_out(target) - .join("bin"); + let bindir = builder.llvm_out(target).join("bin"); let lldb_exe = bindir.join(exe("lldb", &target)); if !lldb_exe.exists() { return None; @@ -2314,7 +2424,7 @@ impl Step for Lldb { if t!(entry.file_type()).is_symlink() { builder.copy_to_folder(&entry.path(), &dst); } else { - builder.install(&entry.path(), &dst, 0o755); + builder.install(&entry.path(), &dst, 0o755); } } } @@ -2333,8 +2443,7 @@ impl Step for Lldb { let entry = t!(entry); if let Ok(name) = entry.file_name().into_string() { if name.starts_with("python") { - let dst = root.join(libdir_name) - .join(entry.file_name()); + let dst = root.join(libdir_name).join(entry.file_name()); t!(fs::create_dir_all(&dst)); builder.cp_r(&entry.path(), &dst); break; @@ -2355,15 +2464,18 @@ impl Step for Lldb { .arg("--product-name=Rust") .arg("--rel-manifest-dir=rustlib") .arg("--success-message=lldb-installed.") - .arg("--image-dir").arg(&image) - .arg("--work-dir").arg(&tmpdir(builder)) - .arg("--output-dir").arg(&distdir(builder)) - .arg("--non-installed-overlay").arg(&overlay) + .arg("--image-dir") + .arg(&image) + .arg("--work-dir") + .arg(&tmpdir(builder)) + .arg("--output-dir") + .arg(&distdir(builder)) + .arg("--non-installed-overlay") + .arg(&overlay) .arg(format!("--package-name={}-{}", name, target)) .arg("--legacy-manifest-dirs=rustlib,cargo") .arg("--component-name=lldb-preview"); - builder.run(&mut cmd); Some(distdir(builder).join(format!("{}-{}.tar.gz", name, target))) } diff --git a/src/bootstrap/doc.rs b/src/bootstrap/doc.rs index 608cee0a80..204056598d 100644 --- a/src/bootstrap/doc.rs +++ b/src/bootstrap/doc.rs @@ -10,17 +10,17 @@ use std::collections::HashSet; use std::fs; use std::io; -use std::path::{PathBuf, Path}; +use std::path::{Path, PathBuf}; use crate::Mode; use build_helper::{t, up_to_date}; -use crate::util::symlink_dir; use crate::builder::{Builder, Compiler, RunConfig, ShouldRun, Step}; -use crate::tool::{self, prepare_tool_cargo, Tool, SourceType}; +use crate::cache::{Interned, INTERNER}; use crate::compile; -use crate::cache::{INTERNER, Interned}; use crate::config::Config; +use crate::tool::{self, prepare_tool_cargo, SourceType, Tool}; +use crate::util::symlink_dir; macro_rules! book { ($($name:ident, $path:expr, $book_name:expr;)+) => { @@ -49,7 +49,7 @@ macro_rules! book { builder.ensure(RustbookSrc { target: self.target, name: INTERNER.intern_str($book_name), - src: doc_src(builder), + src: INTERNER.intern_path(builder.src.join($path)), }) } } @@ -60,6 +60,7 @@ macro_rules! book { // NOTE: When adding a book here, make sure to ALSO build the book by // adding a build step in `src/bootstrap/builder.rs`! book!( + CargoBook, "src/tools/cargo/src/doc", "cargo"; EditionGuide, "src/doc/edition-guide", "edition-guide"; EmbeddedBook, "src/doc/embedded-book", "embedded-book"; Nomicon, "src/doc/nomicon", "nomicon"; @@ -69,10 +70,6 @@ book!( RustdocBook, "src/doc/rustdoc", "rustdoc"; ); -fn doc_src(builder: &Builder<'_>) -> Interned { - INTERNER.intern_path(builder.src.join("src/doc")) -} - #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct UnstableBook { target: Interned, @@ -88,67 +85,19 @@ impl Step for UnstableBook { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(UnstableBook { - target: run.target, - }); + run.builder.ensure(UnstableBook { target: run.target }); } fn run(self, builder: &Builder<'_>) { - builder.ensure(UnstableBookGen { - target: self.target, - }); + builder.ensure(UnstableBookGen { target: self.target }); builder.ensure(RustbookSrc { target: self.target, name: INTERNER.intern_str("unstable-book"), - src: builder.md_doc_out(self.target), + src: INTERNER.intern_path(builder.md_doc_out(self.target).join("unstable-book")), }) } } -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub struct CargoBook { - target: Interned, - name: Interned, -} - -impl Step for CargoBook { - type Output = (); - const DEFAULT: bool = true; - - fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { - let builder = run.builder; - run.path("src/tools/cargo/src/doc/book").default_condition(builder.config.docs) - } - - fn make_run(run: RunConfig<'_>) { - run.builder.ensure(CargoBook { - target: run.target, - name: INTERNER.intern_str("cargo"), - }); - } - - fn run(self, builder: &Builder<'_>) { - let target = self.target; - let name = self.name; - let src = builder.src.join("src/tools/cargo/src/doc"); - - let out = builder.doc_out(target); - t!(fs::create_dir_all(&out)); - - let out = out.join(name); - - builder.info(&format!("Cargo Book ({}) - {}", target, name)); - - let _ = fs::remove_dir_all(&out); - - builder.run(builder.tool_cmd(Tool::Rustbook) - .arg("build") - .arg(&src) - .arg("-d") - .arg(out)); - } -} - #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] struct RustbookSrc { target: Interned, @@ -175,21 +124,16 @@ impl Step for RustbookSrc { t!(fs::create_dir_all(&out)); let out = out.join(name); - let src = src.join(name); let index = out.join("index.html"); let rustbook = builder.tool_exe(Tool::Rustbook); let mut rustbook_cmd = builder.tool_cmd(Tool::Rustbook); if up_to_date(&src, &index) && up_to_date(&rustbook, &index) { - return + return; } builder.info(&format!("Rustbook ({}) - {}", target, name)); let _ = fs::remove_dir_all(&out); - builder.run(rustbook_cmd - .arg("build") - .arg(&src) - .arg("-d") - .arg(out)); + builder.run(rustbook_cmd.arg("build").arg(&src).arg("-d").arg(out)); } } @@ -197,7 +141,6 @@ impl Step for RustbookSrc { pub struct TheBook { compiler: Compiler, target: Interned, - name: &'static str, } impl Step for TheBook { @@ -213,7 +156,6 @@ impl Step for TheBook { run.builder.ensure(TheBook { compiler: run.builder.compiler(run.builder.top_stage, run.builder.config.build), target: run.target, - name: "book", }); } @@ -221,51 +163,33 @@ impl Step for TheBook { /// /// We need to build: /// - /// * Book (first edition) - /// * Book (second edition) + /// * Book + /// * Older edition redirects /// * Version info and CSS /// * Index page /// * Redirect pages fn run(self, builder: &Builder<'_>) { let compiler = self.compiler; let target = self.target; - let name = self.name; // build book builder.ensure(RustbookSrc { target, - name: INTERNER.intern_string(name.to_string()), - src: doc_src(builder), + name: INTERNER.intern_str("book"), + src: INTERNER.intern_path(builder.src.join("src/doc/book")), }); // building older edition redirects - - let source_name = format!("{}/first-edition", name); - builder.ensure(RustbookSrc { - target, - name: INTERNER.intern_string(source_name), - src: doc_src(builder), - }); - - let source_name = format!("{}/second-edition", name); - builder.ensure(RustbookSrc { - target, - name: INTERNER.intern_string(source_name), - src: doc_src(builder), - }); - - let source_name = format!("{}/2018-edition", name); - builder.ensure(RustbookSrc { - target, - name: INTERNER.intern_string(source_name), - src: doc_src(builder), - }); + for edition in &["first-edition", "second-edition", "2018-edition"] { + builder.ensure(RustbookSrc { + target, + name: INTERNER.intern_string(format!("book/{}", edition)), + src: INTERNER.intern_path(builder.src.join("src/doc/book").join(edition)), + }); + } // build the version info page and CSS - builder.ensure(Standalone { - compiler, - target, - }); + builder.ensure(Standalone { compiler, target }); // build the redirect pages builder.info(&format!("Documenting book redirect pages ({})", target)); @@ -297,13 +221,20 @@ fn invoke_rustdoc( let out = out.join("book"); - cmd.arg("--html-after-content").arg(&footer) - .arg("--html-before-content").arg(&version_info) - .arg("--html-in-header").arg(&header) + cmd.arg("--html-after-content") + .arg(&footer) + .arg("--html-before-content") + .arg(&version_info) + .arg("--html-in-header") + .arg(&header) .arg("--markdown-no-toc") - .arg("--markdown-playground-url").arg("https://play.rust-lang.org/") - .arg("-o").arg(&out).arg(&path) - .arg("--markdown-css").arg("../rust.css"); + .arg("--markdown-playground-url") + .arg("https://play.rust-lang.org/") + .arg("-o") + .arg(&out) + .arg(&path) + .arg("--markdown-css") + .arg("../rust.css"); builder.run(&mut cmd); } @@ -366,33 +297,39 @@ impl Step for Standalone { let path = file.path(); let filename = path.file_name().unwrap().to_str().unwrap(); if !filename.ends_with(".md") || filename == "README.md" { - continue + continue; } let html = out.join(filename).with_extension("html"); let rustdoc = builder.rustdoc(compiler); - if up_to_date(&path, &html) && - up_to_date(&footer, &html) && - up_to_date(&favicon, &html) && - up_to_date(&full_toc, &html) && - (builder.config.dry_run || up_to_date(&version_info, &html)) && - (builder.config.dry_run || up_to_date(&rustdoc, &html)) { - continue + if up_to_date(&path, &html) + && up_to_date(&footer, &html) + && up_to_date(&favicon, &html) + && up_to_date(&full_toc, &html) + && (builder.config.dry_run || up_to_date(&version_info, &html)) + && (builder.config.dry_run || up_to_date(&rustdoc, &html)) + { + continue; } let mut cmd = builder.rustdoc_cmd(compiler); - cmd.arg("--html-after-content").arg(&footer) - .arg("--html-before-content").arg(&version_info) - .arg("--html-in-header").arg(&favicon) - .arg("--markdown-no-toc") - .arg("--index-page").arg(&builder.src.join("src/doc/index.md")) - .arg("--markdown-playground-url").arg("https://play.rust-lang.org/") - .arg("-o").arg(&out) - .arg(&path); + cmd.arg("--html-after-content") + .arg(&footer) + .arg("--html-before-content") + .arg(&version_info) + .arg("--html-in-header") + .arg(&favicon) + .arg("--markdown-no-toc") + .arg("--index-page") + .arg(&builder.src.join("src/doc/index.md")) + .arg("--markdown-playground-url") + .arg("https://play.rust-lang.org/") + .arg("-o") + .arg(&out) + .arg(&path); if filename == "not_found.md" { - cmd.arg("--markdown-css") - .arg("https://doc.rust-lang.org/rust.css"); + cmd.arg("--markdown-css").arg("https://doc.rust-lang.org/rust.css"); } else { cmd.arg("--markdown-css").arg("rust.css"); } @@ -417,10 +354,7 @@ impl Step for Std { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Std { - stage: run.builder.top_stage, - target: run.target - }); + run.builder.ensure(Std { stage: run.builder.top_stage, target: run.target }); } /// Compile all standard library documentation. @@ -436,8 +370,7 @@ impl Step for Std { let compiler = builder.compiler(stage, builder.config.build); builder.ensure(compile::Std { compiler, target }); - let out_dir = builder.stage_out(compiler, Mode::Std) - .join(target).join("doc"); + let out_dir = builder.stage_out(compiler, Mode::Std).join(target).join("doc"); // Here what we're doing is creating a *symlink* (directory junction on // Windows) to the final output location. This is not done as an @@ -458,22 +391,25 @@ impl Step for Std { let run_cargo_rustdoc_for = |package: &str| { let mut cargo = builder.cargo(compiler, Mode::Std, target, "rustdoc"); - compile::std_cargo(builder, &compiler, target, &mut cargo); + compile::std_cargo(builder, target, &mut cargo); // Keep a whitelist so we do not build internal stdlib crates, these will be // build by the rustc step later if enabled. - cargo.arg("-Z").arg("unstable-options") - .arg("-p").arg(package); + cargo.arg("-Z").arg("unstable-options").arg("-p").arg(package); // Create all crate output directories first to make sure rustdoc uses // relative links. // FIXME: Cargo should probably do this itself. t!(fs::create_dir_all(out_dir.join(package))); - cargo.arg("--") - .arg("--markdown-css").arg("rust.css") - .arg("--markdown-no-toc") - .arg("--generate-redirect-pages") - .arg("--resource-suffix").arg(crate::channel::CFG_RELEASE_NUM) - .arg("--index-page").arg(&builder.src.join("src/doc/index.md")); + cargo + .arg("--") + .arg("--markdown-css") + .arg("rust.css") + .arg("--markdown-no-toc") + .arg("--generate-redirect-pages") + .arg("--resource-suffix") + .arg(crate::channel::CFG_RELEASE_NUM) + .arg("--index-page") + .arg(&builder.src.join("src/doc/index.md")); builder.run(&mut cargo.into()); }; @@ -501,10 +437,7 @@ impl Step for Rustc { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Rustc { - stage: run.builder.top_stage, - target: run.target, - }); + run.builder.ensure(Rustc { stage: run.builder.top_stage, target: run.target }); } /// Generates compiler documentation. @@ -540,7 +473,7 @@ impl Step for Rustc { // Build cargo command. let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "doc"); - cargo.env("RUSTDOCFLAGS", "--document-private-items --passes strip-hidden"); + cargo.env("RUSTDOCFLAGS", "--document-private-items"); compile::rustc_cargo(builder, &mut cargo, target); // Only include compiler crates, no dependencies of those, such as `libc`. @@ -568,7 +501,7 @@ impl Step for Rustc { fn find_compiler_crates( builder: &Builder<'_>, name: &Interned, - crates: &mut HashSet> + crates: &mut HashSet>, ) { // Add current crate. crates.insert(*name); @@ -597,10 +530,7 @@ impl Step for Rustdoc { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Rustdoc { - stage: run.builder.top_stage, - target: run.target, - }); + run.builder.ensure(Rustdoc { stage: run.builder.top_stage, target: run.target }); } /// Generates compiler documentation. @@ -633,9 +563,7 @@ impl Step for Rustdoc { builder.ensure(tool::Rustdoc { compiler: compiler }); // Symlink compiler docs to the output directory of rustdoc documentation. - let out_dir = builder.stage_out(compiler, Mode::ToolRustc) - .join(target) - .join("doc"); + let out_dir = builder.stage_out(compiler, Mode::ToolRustc).join(target).join("doc"); t!(fs::create_dir_all(&out_dir)); t!(symlink_dir_force(&builder.config, &out, &out_dir)); @@ -648,7 +576,7 @@ impl Step for Rustdoc { "doc", "src/tools/rustdoc", SourceType::InTree, - &[] + &[], ); // Only include compiler crates, no dependencies of those, such as `libc`. @@ -676,9 +604,7 @@ impl Step for ErrorIndex { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(ErrorIndex { - target: run.target, - }); + run.builder.ensure(ErrorIndex { target: run.target }); } /// Generates the HTML rendered error-index by running the @@ -690,10 +616,7 @@ impl Step for ErrorIndex { let out = builder.doc_out(target); t!(fs::create_dir_all(&out)); let compiler = builder.compiler(2, builder.config.build); - let mut index = tool::ErrorIndex::command( - builder, - compiler, - ); + let mut index = tool::ErrorIndex::command(builder, compiler); index.arg("html"); index.arg(out.join("error-index.html")); index.arg(crate::channel::CFG_RELEASE_NUM); @@ -721,9 +644,7 @@ impl Step for UnstableBookGen { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(UnstableBookGen { - target: run.target, - }); + run.builder.ensure(UnstableBookGen { target: run.target }); } fn run(self, builder: &Builder<'_>) { @@ -751,9 +672,7 @@ fn symlink_dir_force(config: &Config, src: &Path, dst: &Path) -> io::Result<()> } else { // handle directory junctions on windows by falling back to // `remove_dir`. - fs::remove_file(dst).or_else(|_| { - fs::remove_dir(dst) - })?; + fs::remove_file(dst).or_else(|_| fs::remove_dir(dst))?; } } diff --git a/src/bootstrap/flags.rs b/src/bootstrap/flags.rs index 7b49cc0a92..2101ef27f9 100644 --- a/src/bootstrap/flags.rs +++ b/src/bootstrap/flags.rs @@ -38,6 +38,8 @@ pub struct Flags { // // true => deny, false => warn pub deny_warnings: Option, + + pub llvm_skip_rebuild: Option, } pub enum Subcommand { @@ -53,6 +55,9 @@ pub enum Subcommand { Fix { paths: Vec, }, + Format { + check: bool, + }, Doc { paths: Vec, }, @@ -85,23 +90,23 @@ pub enum Subcommand { impl Default for Subcommand { fn default() -> Subcommand { - Subcommand::Build { - paths: vec![PathBuf::from("nowhere")], - } + Subcommand::Build { paths: vec![PathBuf::from("nowhere")] } } } impl Flags { pub fn parse(args: &[String]) -> Flags { let mut extra_help = String::new(); - let mut subcommand_help = String::from("\ + let mut subcommand_help = String::from( + "\ Usage: x.py [options] [...] Subcommands: build Compile either the compiler or libraries check Compile either the compiler or libraries, using cargo check - clippy Run clippy + clippy Run clippy (uses rustup/cargo-installed clippy binary) fix Run cargo fix + fmt Run rustfmt test Build and run some test suites bench Build and run some benchmarks doc Build documentation @@ -109,7 +114,7 @@ Subcommands: dist Build distribution artifacts install Install distribution artifacts -To learn more about a subcommand, run `./x.py -h`" +To learn more about a subcommand, run `./x.py -h`", ); let mut opts = Options::new(); @@ -123,12 +128,20 @@ To learn more about a subcommand, run `./x.py -h`" opts.optmulti("", "exclude", "build paths to exclude", "PATH"); opts.optopt("", "on-fail", "command to run on failure", "CMD"); opts.optflag("", "dry-run", "dry run; don't build anything"); - opts.optopt("", "stage", + opts.optopt( + "", + "stage", "stage to build (indicates compiler to use/test, e.g., stage 0 uses the \ bootstrap compiler, stage 1 the stage 0 rustc artifacts, etc.)", - "N"); - opts.optmulti("", "keep-stage", "stage(s) to keep without recompiling \ - (pass multiple times to keep e.g., both stages 0 and 1)", "N"); + "N", + ); + opts.optmulti( + "", + "keep-stage", + "stage(s) to keep without recompiling \ + (pass multiple times to keep e.g., both stages 0 and 1)", + "N", + ); opts.optopt("", "src", "path to the root of the rust checkout", "DIR"); opts.optopt("j", "jobs", "number of jobs to run in parallel", "JOBS"); opts.optflag("h", "help", "print this help message"); @@ -139,6 +152,14 @@ To learn more about a subcommand, run `./x.py -h`" "VALUE", ); opts.optopt("", "error-format", "rustc error format", "FORMAT"); + opts.optopt( + "", + "llvm-skip-rebuild", + "whether rebuilding llvm should be skipped \ + a VALUE of TRUE indicates that llvm will not be rebuilt \ + VALUE overrides the skip-rebuild option in config.toml.", + "VALUE", + ); // fn usage() let usage = @@ -160,6 +181,7 @@ To learn more about a subcommand, run `./x.py -h`" || (s == "check") || (s == "clippy") || (s == "fix") + || (s == "fmt") || (s == "test") || (s == "bench") || (s == "doc") @@ -192,11 +214,7 @@ To learn more about a subcommand, run `./x.py -h`" ); opts.optflag("", "no-doc", "do not run doc tests"); opts.optflag("", "doc", "only run doc tests"); - opts.optflag( - "", - "bless", - "update all stderr/stdout files of failing ui tests", - ); + opts.optflag("", "bless", "update all stderr/stdout files of failing ui tests"); opts.optopt( "", "compare-mode", @@ -207,7 +225,7 @@ To learn more about a subcommand, run `./x.py -h`" "", "pass", "force {check,build,run}-pass tests to this mode.", - "check | build | run" + "check | build | run", ); opts.optflag( "", @@ -222,6 +240,9 @@ To learn more about a subcommand, run `./x.py -h`" "clean" => { opts.optflag("", "all", "clean all build artifacts"); } + "fmt" => { + opts.optflag("", "check", "check formatting instead of applying."); + } _ => {} }; @@ -323,6 +344,17 @@ Arguments: ./x.py fix src/libcore src/libproc_macro", ); } + "fmt" => { + subcommand_help.push_str( + "\n +Arguments: + This subcommand optionally accepts a `--check` flag which succeeds if formatting is correct and + fails if it is not. For example: + + ./x.py fmt + ./x.py fmt --check", + ); + } "test" => { subcommand_help.push_str( "\n @@ -367,10 +399,7 @@ Arguments: _ => {} }; // Get any optional paths which occur after the subcommand - let paths = matches.free[1..] - .iter() - .map(|p| p.into()) - .collect::>(); + let paths = matches.free[1..].iter().map(|p| p.into()).collect::>(); let cfg_file = matches.opt_str("config").map(PathBuf::from).or_else(|| { if fs::metadata("config.toml").is_ok() { @@ -388,12 +417,10 @@ Arguments: let maybe_rules_help = Builder::get_help(&build, subcommand.as_str()); extra_help.push_str(maybe_rules_help.unwrap_or_default().as_str()); - } else if subcommand.as_str() != "clean" { + } else if !(subcommand.as_str() == "clean" || subcommand.as_str() == "fmt") { extra_help.push_str( - format!( - "Run `./x.py {} -h -v` to see a list of available paths.", - subcommand - ).as_str(), + format!("Run `./x.py {} -h -v` to see a list of available paths.", subcommand) + .as_str(), ); } @@ -424,10 +451,7 @@ Arguments: DocTests::Yes }, }, - "bench" => Subcommand::Bench { - paths, - test_args: matches.opt_strs("test-args"), - }, + "bench" => Subcommand::Bench { paths, test_args: matches.opt_strs("test-args") }, "doc" => Subcommand::Doc { paths }, "clean" => { if !paths.is_empty() { @@ -435,10 +459,9 @@ Arguments: usage(1, &opts, &subcommand_help, &extra_help); } - Subcommand::Clean { - all: matches.opt_present("all"), - } + Subcommand::Clean { all: matches.opt_present("all") } } + "fmt" => Subcommand::Format { check: matches.opt_present("check") }, "dist" => Subcommand::Dist { paths }, "install" => Subcommand::Install { paths }, _ => { @@ -452,8 +475,10 @@ Arguments: dry_run: matches.opt_present("dry-run"), on_fail: matches.opt_str("on-fail"), rustc_error_format: matches.opt_str("error-format"), - keep_stage: matches.opt_strs("keep-stage") - .into_iter().map(|j| j.parse().expect("`keep-stage` should be a number")) + keep_stage: matches + .opt_strs("keep-stage") + .into_iter() + .map(|j| j.parse().expect("`keep-stage` should be a number")) .collect(), host: split(&matches.opt_strs("host")) .into_iter() @@ -472,6 +497,9 @@ Arguments: .map(|p| p.into()) .collect::>(), deny_warnings: parse_deny_warnings(&matches), + llvm_skip_rebuild: matches.opt_str("llvm-skip-rebuild").map(|s| s.to_lowercase()).map( + |s| s.parse::().expect("`llvm-skip-rebuild` should be either true or false"), + ), } } } @@ -480,10 +508,7 @@ impl Subcommand { pub fn test_args(&self) -> Vec<&str> { match *self { Subcommand::Test { ref test_args, .. } | Subcommand::Bench { ref test_args, .. } => { - test_args - .iter() - .flat_map(|s| s.split_whitespace()) - .collect() + test_args.iter().flat_map(|s| s.split_whitespace()).collect() } _ => Vec::new(), } @@ -491,10 +516,9 @@ impl Subcommand { pub fn rustc_args(&self) -> Vec<&str> { match *self { - Subcommand::Test { ref rustc_args, .. } => rustc_args - .iter() - .flat_map(|s| s.split_whitespace()) - .collect(), + Subcommand::Test { ref rustc_args, .. } => { + rustc_args.iter().flat_map(|s| s.split_whitespace()).collect() + } _ => Vec::new(), } } @@ -529,28 +553,21 @@ impl Subcommand { pub fn compare_mode(&self) -> Option<&str> { match *self { - Subcommand::Test { - ref compare_mode, .. - } => compare_mode.as_ref().map(|s| &s[..]), + Subcommand::Test { ref compare_mode, .. } => compare_mode.as_ref().map(|s| &s[..]), _ => None, } } pub fn pass(&self) -> Option<&str> { match *self { - Subcommand::Test { - ref pass, .. - } => pass.as_ref().map(|s| &s[..]), + Subcommand::Test { ref pass, .. } => pass.as_ref().map(|s| &s[..]), _ => None, } } } fn split(s: &[String]) -> Vec { - s.iter() - .flat_map(|s| s.split(',')) - .map(|s| s.to_string()) - .collect() + s.iter().flat_map(|s| s.split(',')).map(|s| s.to_string()).collect() } fn parse_deny_warnings(matches: &getopts::Matches) -> Option { @@ -558,12 +575,9 @@ fn parse_deny_warnings(matches: &getopts::Matches) -> Option { Some("deny") => Some(true), Some("warn") => Some(false), Some(value) => { - eprintln!( - r#"invalid value for --warnings: {:?}, expected "warn" or "deny""#, - value, - ); + eprintln!(r#"invalid value for --warnings: {:?}, expected "warn" or "deny""#, value,); process::exit(1); - }, + } None => None, } } diff --git a/src/bootstrap/format.rs b/src/bootstrap/format.rs new file mode 100644 index 0000000000..6e5e3fe07e --- /dev/null +++ b/src/bootstrap/format.rs @@ -0,0 +1,75 @@ +//! Runs rustfmt on the repository. + +use crate::Build; +use build_helper::t; +use ignore::WalkBuilder; +use std::path::Path; +use std::process::Command; + +fn rustfmt(src: &Path, rustfmt: &Path, path: &Path, check: bool) { + let mut cmd = Command::new(&rustfmt); + // avoid the submodule config paths from coming into play, + // we only allow a single global config for the workspace for now + cmd.arg("--config-path").arg(&src.canonicalize().unwrap()); + cmd.arg("--edition").arg("2018"); + cmd.arg("--unstable-features"); + cmd.arg("--skip-children"); + if check { + cmd.arg("--check"); + } + cmd.arg(&path); + let cmd_debug = format!("{:?}", cmd); + let status = cmd.status().expect("executing rustfmt"); + if !status.success() { + eprintln!( + "Running `{}` failed.\nIf you're running `tidy`, \ + try again with `--bless` flag. Or, you just want to format \ + code, run `./x.py fmt` instead.", + cmd_debug, + ); + std::process::exit(1); + } +} + +#[derive(serde::Deserialize)] +struct RustfmtConfig { + ignore: Vec, +} + +pub fn format(build: &Build, check: bool) { + let mut builder = ignore::types::TypesBuilder::new(); + builder.add_defaults(); + builder.select("rust"); + let matcher = builder.build().unwrap(); + let rustfmt_config = build.src.join("rustfmt.toml"); + if !rustfmt_config.exists() { + eprintln!("Not running formatting checks; rustfmt.toml does not exist."); + eprintln!("This may happen in distributed tarballs."); + return; + } + let rustfmt_config = t!(std::fs::read_to_string(&rustfmt_config)); + let rustfmt_config: RustfmtConfig = t!(toml::from_str(&rustfmt_config)); + let mut ignore_fmt = ignore::overrides::OverrideBuilder::new(&build.src); + for ignore in rustfmt_config.ignore { + ignore_fmt.add(&format!("!{}", ignore)).expect(&ignore); + } + let ignore_fmt = ignore_fmt.build().unwrap(); + + let rustfmt_path = build.config.initial_rustfmt.as_ref().unwrap_or_else(|| { + eprintln!("./x.py fmt is not supported on this channel"); + std::process::exit(1); + }); + let src = build.src.clone(); + let walker = WalkBuilder::new(&build.src).types(matcher).overrides(ignore_fmt).build_parallel(); + walker.run(|| { + let src = src.clone(); + let rustfmt_path = rustfmt_path.clone(); + Box::new(move |entry| { + let entry = t!(entry); + if entry.file_type().map_or(false, |t| t.is_file()) { + rustfmt(&src, &rustfmt_path, &entry.path(), check); + } + ignore::WalkState::Continue + }) + }); +} diff --git a/src/bootstrap/job.rs b/src/bootstrap/job.rs index 6867d62a48..efeb86540b 100644 --- a/src/bootstrap/job.rs +++ b/src/bootstrap/job.rs @@ -29,88 +29,22 @@ #![allow(nonstandard_style, dead_code)] +use crate::Build; use std::env; use std::io; use std::mem; use std::ptr; -use crate::Build; - -type HANDLE = *mut u8; -type BOOL = i32; -type DWORD = u32; -type LPHANDLE = *mut HANDLE; -type LPVOID = *mut u8; -type JOBOBJECTINFOCLASS = i32; -type SIZE_T = usize; -type LARGE_INTEGER = i64; -type UINT = u32; -type ULONG_PTR = usize; -type ULONGLONG = u64; - -const FALSE: BOOL = 0; -const DUPLICATE_SAME_ACCESS: DWORD = 0x2; -const PROCESS_DUP_HANDLE: DWORD = 0x40; -const JobObjectExtendedLimitInformation: JOBOBJECTINFOCLASS = 9; -const JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE: DWORD = 0x2000; -const JOB_OBJECT_LIMIT_PRIORITY_CLASS: DWORD = 0x00000020; -const SEM_FAILCRITICALERRORS: UINT = 0x0001; -const SEM_NOGPFAULTERRORBOX: UINT = 0x0002; -const BELOW_NORMAL_PRIORITY_CLASS: DWORD = 0x00004000; - -extern "system" { - fn CreateJobObjectW(lpJobAttributes: *mut u8, lpName: *const u8) -> HANDLE; - fn CloseHandle(hObject: HANDLE) -> BOOL; - fn GetCurrentProcess() -> HANDLE; - fn OpenProcess(dwDesiredAccess: DWORD, - bInheritHandle: BOOL, - dwProcessId: DWORD) -> HANDLE; - fn DuplicateHandle(hSourceProcessHandle: HANDLE, - hSourceHandle: HANDLE, - hTargetProcessHandle: HANDLE, - lpTargetHandle: LPHANDLE, - dwDesiredAccess: DWORD, - bInheritHandle: BOOL, - dwOptions: DWORD) -> BOOL; - fn AssignProcessToJobObject(hJob: HANDLE, hProcess: HANDLE) -> BOOL; - fn SetInformationJobObject(hJob: HANDLE, - JobObjectInformationClass: JOBOBJECTINFOCLASS, - lpJobObjectInformation: LPVOID, - cbJobObjectInformationLength: DWORD) -> BOOL; - fn SetErrorMode(mode: UINT) -> UINT; -} -#[repr(C)] -struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION { - BasicLimitInformation: JOBOBJECT_BASIC_LIMIT_INFORMATION, - IoInfo: IO_COUNTERS, - ProcessMemoryLimit: SIZE_T, - JobMemoryLimit: SIZE_T, - PeakProcessMemoryUsed: SIZE_T, - PeakJobMemoryUsed: SIZE_T, -} - -#[repr(C)] -struct IO_COUNTERS { - ReadOperationCount: ULONGLONG, - WriteOperationCount: ULONGLONG, - OtherOperationCount: ULONGLONG, - ReadTransferCount: ULONGLONG, - WriteTransferCount: ULONGLONG, - OtherTransferCount: ULONGLONG, -} - -#[repr(C)] -struct JOBOBJECT_BASIC_LIMIT_INFORMATION { - PerProcessUserTimeLimit: LARGE_INTEGER, - PerJobUserTimeLimit: LARGE_INTEGER, - LimitFlags: DWORD, - MinimumWorkingsetSize: SIZE_T, - MaximumWorkingsetSize: SIZE_T, - ActiveProcessLimit: DWORD, - Affinity: ULONG_PTR, - PriorityClass: DWORD, - SchedulingClass: DWORD, -} +use winapi::shared::minwindef::{DWORD, FALSE, LPVOID}; +use winapi::um::errhandlingapi::SetErrorMode; +use winapi::um::handleapi::{CloseHandle, DuplicateHandle}; +use winapi::um::jobapi2::{AssignProcessToJobObject, CreateJobObjectW, SetInformationJobObject}; +use winapi::um::processthreadsapi::{GetCurrentProcess, OpenProcess}; +use winapi::um::winbase::{BELOW_NORMAL_PRIORITY_CLASS, SEM_NOGPFAULTERRORBOX}; +use winapi::um::winnt::{ + JobObjectExtendedLimitInformation, DUPLICATE_SAME_ACCESS, JOBOBJECT_EXTENDED_LIMIT_INFORMATION, + JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, JOB_OBJECT_LIMIT_PRIORITY_CLASS, PROCESS_DUP_HANDLE, +}; pub unsafe fn setup(build: &mut Build) { // Enable the Windows Error Reporting dialog which msys disables, @@ -132,10 +66,12 @@ pub unsafe fn setup(build: &mut Build) { info.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_PRIORITY_CLASS; info.BasicLimitInformation.PriorityClass = BELOW_NORMAL_PRIORITY_CLASS; } - let r = SetInformationJobObject(job, - JobObjectExtendedLimitInformation, - &mut info as *mut _ as LPVOID, - mem::size_of_val(&info) as DWORD); + let r = SetInformationJobObject( + job, + JobObjectExtendedLimitInformation, + &mut info as *mut _ as LPVOID, + mem::size_of_val(&info) as DWORD, + ); assert!(r != 0, "{}", io::Error::last_os_error()); // Assign our process to this job object. Note that if this fails, one very @@ -150,7 +86,7 @@ pub unsafe fn setup(build: &mut Build) { let r = AssignProcessToJobObject(job, GetCurrentProcess()); if r == 0 { CloseHandle(job); - return + return; } // If we've got a parent process (e.g., the python script that called us) @@ -169,9 +105,15 @@ pub unsafe fn setup(build: &mut Build) { let parent = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid.parse().unwrap()); assert!(!parent.is_null(), "{}", io::Error::last_os_error()); let mut parent_handle = ptr::null_mut(); - let r = DuplicateHandle(GetCurrentProcess(), job, - parent, &mut parent_handle, - 0, FALSE, DUPLICATE_SAME_ACCESS); + let r = DuplicateHandle( + GetCurrentProcess(), + job, + parent, + &mut parent_handle, + 0, + FALSE, + DUPLICATE_SAME_ACCESS, + ); // If this failed, well at least we tried! An example of DuplicateHandle // failing in the past has been when the wrong python2 package spawned this diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index 080bef6853..1fee3fd9ac 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -106,12 +106,12 @@ #![feature(core_intrinsics)] #![feature(drain_filter)] -use std::cell::{RefCell, Cell}; -use std::collections::{HashSet, HashMap}; +use std::cell::{Cell, RefCell}; +use std::collections::{HashMap, HashSet}; use std::env; -use std::fs::{self, OpenOptions, File}; -use std::io::{Seek, SeekFrom, Write, Read}; -use std::path::{PathBuf, Path}; +use std::fs::{self, File, OpenOptions}; +use std::io::{Read, Seek, SeekFrom, Write}; +use std::path::{Path, PathBuf}; use std::process::{self, Command}; use std::slice; use std::str; @@ -121,32 +121,31 @@ use std::os::unix::fs::symlink as symlink_file; #[cfg(windows)] use std::os::windows::fs::symlink_file; -use build_helper::{ - mtime, output, run, run_suppressed, t, try_run, try_run_suppressed, -}; +use build_helper::{mtime, output, run, run_suppressed, t, try_run, try_run_suppressed}; use filetime::FileTime; use crate::util::{exe, libdir, CiEnv}; +mod builder; +mod cache; mod cc_detect; mod channel; mod check; -mod test; mod clean; mod compile; -mod metadata; mod config; mod dist; mod doc; mod flags; +mod format; mod install; +mod metadata; mod native; mod sanity; -pub mod util; -mod builder; -mod cache; +mod test; mod tool; mod toolstate; +pub mod util; #[cfg(windows)] mod job; @@ -162,13 +161,12 @@ mod job { #[cfg(any(target_os = "haiku", target_os = "hermit", not(any(unix, windows))))] mod job { - pub unsafe fn setup(_build: &mut crate::Build) { - } + pub unsafe fn setup(_build: &mut crate::Build) {} } +use crate::cache::{Interned, INTERNER}; pub use crate::config::Config; use crate::flags::Subcommand; -use crate::cache::{Interned, INTERNER}; const LLVM_TOOLS: &[&str] = &[ "llvm-nm", // used to inspect binaries; it shows symbol names, their sizes and visibility @@ -178,7 +176,7 @@ const LLVM_TOOLS: &[&str] = &[ "llvm-readobj", // used to get information from ELFs/objects that the other tools don't provide "llvm-size", // used to prints the size of the linker sections of a program "llvm-strip", // used to discard symbols from binary files to reduce their size - "llvm-ar" // used for creating and modifying archive files + "llvm-ar", // used for creating and modifying archive files ]; /// A structure representing a Rust compiler. @@ -257,10 +255,8 @@ pub struct Build { ci_env: CiEnv, delayed_failures: RefCell>, prerelease_version: Cell>, - tool_artifacts: RefCell, - HashMap)> - >>, + tool_artifacts: + RefCell, HashMap)>>>, } #[derive(Debug)] @@ -273,8 +269,7 @@ struct Crate { impl Crate { fn is_local(&self, build: &Build) -> bool { - self.path.starts_with(&build.config.src) && - !self.path.to_string_lossy().ends_with("_shim") + self.path.starts_with(&build.config.src) && !self.path.to_string_lossy().ends_with("_shim") } fn local_path(&self, build: &Build) -> PathBuf { @@ -315,7 +310,7 @@ impl Mode { pub fn is_tool(&self) -> bool { match self { Mode::ToolBootstrap | Mode::ToolRustc | Mode::ToolStd => true, - _ => false + _ => false, } } } @@ -330,12 +325,10 @@ impl Build { let out = config.out.clone(); let is_sudo = match env::var_os("SUDO_USER") { - Some(sudo_user) => { - match env::var_os("USER") { - Some(user) => user != sudo_user, - None => false, - } - } + Some(sudo_user) => match env::var_os("USER") { + Some(user) => user != sudo_user, + None => false, + }, None => false, }; @@ -392,11 +385,15 @@ impl Build { // If local-rust is the same major.minor as the current version, then force a // local-rebuild - let local_version_verbose = output( - Command::new(&build.initial_rustc).arg("--version").arg("--verbose")); + let local_version_verbose = + output(Command::new(&build.initial_rustc).arg("--version").arg("--verbose")); let local_release = local_version_verbose - .lines().filter(|x| x.starts_with("release:")) - .next().unwrap().trim_start_matches("release:").trim(); + .lines() + .filter(|x| x.starts_with("release:")) + .next() + .unwrap() + .trim_start_matches("release:") + .trim(); let my_version = channel::CFG_RELEASE_NUM; if local_release.split('.').take(2).eq(my_version.split('.').take(2)) { build.verbose(&format!("auto-detected local-rebuild {}", local_release)); @@ -410,9 +407,7 @@ impl Build { } pub fn build_triple(&self) -> &[Interned] { - unsafe { - slice::from_raw_parts(&self.build, 1) - } + unsafe { slice::from_raw_parts(&self.build, 1) } } /// Executes the entire build, as configured by the flags and configuration. @@ -421,6 +416,10 @@ impl Build { job::setup(self); } + if let Subcommand::Format { check } = self.config.cmd { + return format::format(self, check); + } + if let Subcommand::Clean { all } = self.config.cmd { return clean::clean(self, all); } @@ -509,7 +508,7 @@ impl Build { /// Component directory that Cargo will produce output into (e.g. /// release/debug) fn cargo_dir(&self) -> &'static str { - if self.config.rust_optimize {"release"} else {"debug"} + if self.config.rust_optimize { "release" } else { "debug" } } fn tools_dir(&self, compiler: Compiler) -> PathBuf { @@ -530,17 +529,13 @@ impl Build { Mode::ToolBootstrap => "-bootstrap-tools", Mode::ToolStd | Mode::ToolRustc => "-tools", }; - self.out.join(&*compiler.host) - .join(format!("stage{}{}", compiler.stage, suffix)) + self.out.join(&*compiler.host).join(format!("stage{}{}", compiler.stage, suffix)) } /// Returns the root output directory for all Cargo output in a given stage, /// running a particular compiler, whether or not we're building the /// standard library, and targeting the specified architecture. - fn cargo_out(&self, - compiler: Compiler, - mode: Mode, - target: Interned) -> PathBuf { + fn cargo_out(&self, compiler: Compiler, mode: Mode, target: Interned) -> PathBuf { self.stage_out(compiler, mode).join(&*target).join(self.cargo_dir()) } @@ -584,7 +579,7 @@ impl Build { fn is_rust_llvm(&self, target: Interned) -> bool { match self.config.target_config.get(&target) { Some(ref c) => c.llvm_config.is_none(), - None => true + None => true, } } @@ -602,8 +597,8 @@ impl Build { // On Fedora the system LLVM installs FileCheck in the // llvm subdirectory of the libdir. let llvm_libdir = output(Command::new(s).arg("--libdir")); - let lib_filecheck = Path::new(llvm_libdir.trim()) - .join("llvm").join(exe("FileCheck", &*target)); + let lib_filecheck = + Path::new(llvm_libdir.trim()).join("llvm").join(exe("FileCheck", &*target)); if lib_filecheck.exists() { lib_filecheck } else { @@ -662,14 +657,18 @@ impl Build { /// Runs a command, printing out nice contextual information if it fails. fn run(&self, cmd: &mut Command) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } self.verbose(&format!("running: {:?}", cmd)); run(cmd) } /// Runs a command, printing out nice contextual information if it fails. fn run_quiet(&self, cmd: &mut Command) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } self.verbose(&format!("running: {:?}", cmd)); run_suppressed(cmd) } @@ -678,7 +677,9 @@ impl Build { /// Exits if the command failed to execute at all, otherwise returns its /// `status.success()`. fn try_run(&self, cmd: &mut Command) -> bool { - if self.config.dry_run { return true; } + if self.config.dry_run { + return true; + } self.verbose(&format!("running: {:?}", cmd)); try_run(cmd) } @@ -687,7 +688,9 @@ impl Build { /// Exits if the command failed to execute at all, otherwise returns its /// `status.success()`. fn try_run_quiet(&self, cmd: &mut Command) -> bool { - if self.config.dry_run { return true; } + if self.config.dry_run { + return true; + } self.verbose(&format!("running: {:?}", cmd)); try_run_suppressed(cmd) } @@ -715,7 +718,9 @@ impl Build { } fn info(&self, msg: &str) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } println!("{}", msg); } @@ -727,7 +732,7 @@ impl Build { fn debuginfo_map(&self, which: GitRepo) -> Option { if !self.config.rust_remap_debuginfo { - return None + return None; } let path = match which { @@ -750,10 +755,12 @@ impl Build { fn cflags(&self, target: Interned, which: GitRepo) -> Vec { // Filter out -O and /O (the optimization flags) that we picked up from // cc-rs because the build scripts will determine that for themselves. - let mut base = self.cc[&target].args().iter() - .map(|s| s.to_string_lossy().into_owned()) - .filter(|s| !s.starts_with("-O") && !s.starts_with("/O")) - .collect::>(); + let mut base = self.cc[&target] + .args() + .iter() + .map(|s| s.to_string_lossy().into_owned()) + .filter(|s| !s.starts_with("-O") && !s.starts_with("/O")) + .collect::>(); // If we're compiling on macOS then we add a few unconditional flags // indicating that we want libc++ (more filled out than libstdc++) and @@ -771,7 +778,7 @@ impl Build { } if let Some(map) = self.debuginfo_map(which) { - let cc = self.cc(target); + let cc = self.cc(target); if cc.ends_with("clang") || cc.ends_with("gcc") { base.push(format!("-fdebug-prefix-map={}", map)); } else if cc.ends_with("clang-cl.exe") { @@ -796,20 +803,21 @@ impl Build { fn cxx(&self, target: Interned) -> Result<&Path, String> { match self.cxx.get(&target) { Some(p) => Ok(p.path()), - None => Err(format!( - "target `{}` is not configured as a host, only as a target", - target)) + None => { + Err(format!("target `{}` is not configured as a host, only as a target", target)) + } } } /// Returns the path to the linker for the given target if it needs to be overridden. fn linker(&self, target: Interned) -> Option<&Path> { - if let Some(linker) = self.config.target_config.get(&target) - .and_then(|c| c.linker.as_ref()) { + if let Some(linker) = self.config.target_config.get(&target).and_then(|c| c.linker.as_ref()) + { Some(linker) - } else if target != self.config.build && - util::use_host_linker(&target) && - !target.contains("msvc") { + } else if target != self.config.build + && util::use_host_linker(&target) + && !target.contains("msvc") + { Some(self.cc(target)) } else { None @@ -821,14 +829,15 @@ impl Build { if target.contains("pc-windows-msvc") { Some(true) } else { - self.config.target_config.get(&target) - .and_then(|t| t.crt_static) + self.config.target_config.get(&target).and_then(|t| t.crt_static) } } /// Returns the "musl root" for this `target`, if defined fn musl_root(&self, target: Interned) -> Option<&Path> { - self.config.target_config.get(&target) + self.config + .target_config + .get(&target) .and_then(|t| t.musl_root.as_ref()) .or(self.config.musl_root.as_ref()) .map(|p| &**p) @@ -836,22 +845,20 @@ impl Build { /// Returns the sysroot for the wasi target, if defined fn wasi_root(&self, target: Interned) -> Option<&Path> { - self.config.target_config.get(&target) - .and_then(|t| t.wasi_root.as_ref()) - .map(|p| &**p) + self.config.target_config.get(&target).and_then(|t| t.wasi_root.as_ref()).map(|p| &**p) } /// Returns `true` if this is a no-std `target`, if defined fn no_std(&self, target: Interned) -> Option { - self.config.target_config.get(&target) - .map(|t| t.no_std) + self.config.target_config.get(&target).map(|t| t.no_std) } /// Returns `true` if the target will be tested using the `remote-test-client` /// and `remote-test-server` binaries. fn remote_tested(&self, target: Interned) -> bool { - self.qemu_rootfs(target).is_some() || target.contains("android") || - env::var_os("TEST_DEVICE_ADDR").is_some() + self.qemu_rootfs(target).is_some() + || target.contains("android") + || env::var_os("TEST_DEVICE_ADDR").is_some() } /// Returns the root of the "rootfs" image that this target will be using, @@ -860,9 +867,7 @@ impl Build { /// If `Some` is returned then that means that tests for this target are /// emulated with QEMU and binaries will need to be shipped to the emulator. fn qemu_rootfs(&self, target: Interned) -> Option<&Path> { - self.config.target_config.get(&target) - .and_then(|t| t.qemu_rootfs.as_ref()) - .map(|p| &**p) + self.config.target_config.get(&target).and_then(|t| t.qemu_rootfs.as_ref()).map(|p| &**p) } /// Path to the python interpreter to use @@ -894,9 +899,9 @@ impl Build { /// When all of these conditions are met the build will lift artifacts from /// the previous stage forward. fn force_use_stage1(&self, compiler: Compiler, target: Interned) -> bool { - !self.config.full_bootstrap && - compiler.stage >= 2 && - (self.hosts.iter().any(|h| *h == target) || target == self.build) + !self.config.full_bootstrap + && compiler.stage >= 2 + && (self.hosts.iter().any(|h| *h == target) || target == self.build) } /// Given `num` in the form "a.b.c" return a "release string" which @@ -907,11 +912,13 @@ impl Build { fn release(&self, num: &str) -> String { match &self.config.channel[..] { "stable" => num.to_string(), - "beta" => if self.rust_info.is_git() { - format!("{}-beta.{}", num, self.beta_prerelease_version()) - } else { - format!("{}-beta", num) - }, + "beta" => { + if self.rust_info.is_git() { + format!("{}-beta.{}", num, self.beta_prerelease_version()) + } else { + format!("{}-beta", num) + } + } "nightly" => format!("{}-nightly", num), _ => format!("{}-dev", num), } @@ -919,33 +926,21 @@ impl Build { fn beta_prerelease_version(&self) -> u32 { if let Some(s) = self.prerelease_version.get() { - return s + return s; } let beta = output( - Command::new("git") - .arg("ls-remote") - .arg("origin") - .arg("beta") - .current_dir(&self.src) + Command::new("git").arg("ls-remote").arg("origin").arg("beta").current_dir(&self.src), ); let beta = beta.trim().split_whitespace().next().unwrap(); let master = output( - Command::new("git") - .arg("ls-remote") - .arg("origin") - .arg("master") - .current_dir(&self.src) + Command::new("git").arg("ls-remote").arg("origin").arg("master").current_dir(&self.src), ); let master = master.trim().split_whitespace().next().unwrap(); // Figure out where the current beta branch started. let base = output( - Command::new("git") - .arg("merge-base") - .arg(beta) - .arg(master) - .current_dir(&self.src), + Command::new("git").arg("merge-base").arg(beta).arg(master).current_dir(&self.src), ); let base = base.trim(); @@ -1056,7 +1051,7 @@ impl Build { let prefix = "version = \""; let suffix = "\""; if line.starts_with(prefix) && line.ends_with(suffix) { - return line[prefix.len()..line.len() - suffix.len()].to_string() + return line[prefix.len()..line.len() - suffix.len()].to_string(); } } @@ -1101,7 +1096,7 @@ impl Build { // run_cargo for more information (in compile.rs). for part in contents.split(|b| *b == 0) { if part.is_empty() { - continue + continue; } let host = part[0] as char == 'h'; let path = PathBuf::from(t!(str::from_utf8(&part[1..]))); @@ -1112,9 +1107,13 @@ impl Build { /// Copies a file from `src` to `dst` pub fn copy(&self, src: &Path, dst: &Path) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } self.verbose_than(1, &format!("Copy {:?} to {:?}", src, dst)); - if src == dst { return; } + if src == dst { + return; + } let _ = fs::remove_file(&dst); let metadata = t!(src.symlink_metadata()); if metadata.file_type().is_symlink() { @@ -1126,8 +1125,7 @@ impl Build { // just fall back to a slow `copy` operation. } else { if let Err(e) = fs::copy(src, dst) { - panic!("failed to copy `{}` to `{}`: {}", src.display(), - dst.display(), e) + panic!("failed to copy `{}` to `{}`: {}", src.display(), dst.display(), e) } t!(fs::set_permissions(dst, metadata.permissions())); let atime = FileTime::from_last_access_time(&metadata); @@ -1139,7 +1137,9 @@ impl Build { /// Search-and-replaces within a file. (Not maximally efficiently: allocates a /// new string for each replacement.) pub fn replace_in_file(&self, path: &Path, replacements: &[(&str, &str)]) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } let mut contents = String::new(); let mut file = t!(OpenOptions::new().read(true).write(true).open(path)); t!(file.read_to_string(&mut contents)); @@ -1154,7 +1154,9 @@ impl Build { /// Copies the `src` directory recursively to `dst`. Both are assumed to exist /// when this function is called. pub fn cp_r(&self, src: &Path, dst: &Path) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } for f in self.read_dir(src) { let path = f.path(); let name = path.file_name().unwrap(); @@ -1205,7 +1207,9 @@ impl Build { } fn install(&self, src: &Path, dstdir: &Path, perms: u32) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } let dst = dstdir.join(src.file_name().unwrap()); self.verbose_than(1, &format!("Install {:?} to {:?}", src, dst)); t!(fs::create_dir_all(dstdir)); @@ -1216,8 +1220,7 @@ impl Build { } let metadata = t!(src.symlink_metadata()); if let Err(e) = fs::copy(&src, &dst) { - panic!("failed to copy `{}` to `{}`: {}", src.display(), - dst.display(), e) + panic!("failed to copy `{}` to `{}`: {}", src.display(), dst.display(), e) } t!(fs::set_permissions(&dst, metadata.permissions())); let atime = FileTime::from_last_access_time(&metadata); @@ -1228,26 +1231,34 @@ impl Build { } fn create(&self, path: &Path, s: &str) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } t!(fs::write(path, s)); } fn read(&self, path: &Path) -> String { - if self.config.dry_run { return String::new(); } + if self.config.dry_run { + return String::new(); + } t!(fs::read_to_string(path)) } fn create_dir(&self, dir: &Path) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } t!(fs::create_dir_all(dir)) } fn remove_dir(&self, dir: &Path) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } t!(fs::remove_dir_all(dir)) } - fn read_dir(&self, dir: &Path) -> impl Iterator { + fn read_dir(&self, dir: &Path) -> impl Iterator { let iter = match fs::read_dir(dir) { Ok(v) => v, Err(_) if self.config.dry_run => return vec![].into_iter(), @@ -1257,7 +1268,9 @@ impl Build { } fn remove(&self, f: &Path) { - if self.config.dry_run { return; } + if self.config.dry_run { + return; + } fs::remove_file(f).unwrap_or_else(|_| panic!("failed to remove {:?}", f)); } } @@ -1270,7 +1283,6 @@ fn chmod(path: &Path, perms: u32) { #[cfg(windows)] fn chmod(_path: &Path, _perms: u32) {} - impl Compiler { pub fn with_stage(mut self, stage: u32) -> Compiler { self.stage = stage; diff --git a/src/bootstrap/metadata.rs b/src/bootstrap/metadata.rs index b622b3682a..8a26adc7ed 100644 --- a/src/bootstrap/metadata.rs +++ b/src/bootstrap/metadata.rs @@ -1,14 +1,14 @@ use std::collections::HashMap; -use std::process::Command; -use std::path::PathBuf; use std::collections::HashSet; +use std::path::PathBuf; +use std::process::Command; use build_helper::output; use serde::Deserialize; use serde_json; -use crate::{Build, Crate}; use crate::cache::INTERNER; +use crate::{Build, Crate}; #[derive(Deserialize)] struct Output { @@ -71,10 +71,14 @@ fn build_krate(features: &str, build: &mut Build, resolves: &mut Vec) -> ShouldRun<'_> { - run.path("src/llvm-project") - .path("src/llvm-project/llvm") - .path("src/llvm") + run.path("src/llvm-project").path("src/llvm-project/llvm").path("src/llvm") } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Llvm { - target: run.target, - }); + run.builder.ensure(Llvm { target: run.target }); } /// Compile LLVM for `target`. @@ -56,7 +52,7 @@ impl Step for Llvm { if let Some(config) = builder.config.target_config.get(&target) { if let Some(ref s) = config.llvm_config { check_llvm_version(builder, s); - return s.to_path_buf() + return s.to_path_buf(); } } @@ -69,11 +65,20 @@ impl Step for Llvm { } llvm_config_ret_dir.push("bin"); - let build_llvm_config = llvm_config_ret_dir - .join(exe("llvm-config", &*builder.config.build)); + let build_llvm_config = + llvm_config_ret_dir.join(exe("llvm-config", &*builder.config.build)); let done_stamp = out_dir.join("llvm-finished-building"); if done_stamp.exists() { + if builder.config.llvm_skip_rebuild { + builder.info( + "Warning: \ + Using a potentially stale build of LLVM; \ + This may not behave well.", + ); + return build_llvm_config; + } + if let Some(llvm_commit) = llvm_info.sha() { let done_contents = t!(fs::read(&done_stamp)); @@ -112,8 +117,10 @@ impl Step for Llvm { // defaults! let llvm_targets = match &builder.config.llvm_targets { Some(s) => s, - None => "AArch64;ARM;Hexagon;MSP430;Mips;NVPTX;PowerPC;RISCV;\ - Sparc;SystemZ;WebAssembly;X86", + None => { + "AArch64;ARM;Hexagon;MSP430;Mips;NVPTX;PowerPC;RISCV;\ + Sparc;SystemZ;WebAssembly;X86" + } }; let llvm_exp_targets = match builder.config.llvm_experimental_targets { @@ -121,31 +128,31 @@ impl Step for Llvm { None => "", }; - let assertions = if builder.config.llvm_assertions {"ON"} else {"OFF"}; + let assertions = if builder.config.llvm_assertions { "ON" } else { "OFF" }; cfg.out_dir(&out_dir) - .profile(profile) - .define("LLVM_ENABLE_ASSERTIONS", assertions) - .define("LLVM_TARGETS_TO_BUILD", llvm_targets) - .define("LLVM_EXPERIMENTAL_TARGETS_TO_BUILD", llvm_exp_targets) - .define("LLVM_INCLUDE_EXAMPLES", "OFF") - .define("LLVM_INCLUDE_TESTS", "OFF") - .define("LLVM_INCLUDE_DOCS", "OFF") - .define("LLVM_INCLUDE_BENCHMARKS", "OFF") - .define("LLVM_ENABLE_ZLIB", "OFF") - .define("WITH_POLLY", "OFF") - .define("LLVM_ENABLE_TERMINFO", "OFF") - .define("LLVM_ENABLE_LIBEDIT", "OFF") - .define("LLVM_ENABLE_BINDINGS", "OFF") - .define("LLVM_ENABLE_Z3_SOLVER", "OFF") - .define("LLVM_PARALLEL_COMPILE_JOBS", builder.jobs().to_string()) - .define("LLVM_TARGET_ARCH", target.split('-').next().unwrap()) - .define("LLVM_DEFAULT_TARGET_TRIPLE", target); + .profile(profile) + .define("LLVM_ENABLE_ASSERTIONS", assertions) + .define("LLVM_TARGETS_TO_BUILD", llvm_targets) + .define("LLVM_EXPERIMENTAL_TARGETS_TO_BUILD", llvm_exp_targets) + .define("LLVM_INCLUDE_EXAMPLES", "OFF") + .define("LLVM_INCLUDE_TESTS", "OFF") + .define("LLVM_INCLUDE_DOCS", "OFF") + .define("LLVM_INCLUDE_BENCHMARKS", "OFF") + .define("LLVM_ENABLE_ZLIB", "OFF") + .define("WITH_POLLY", "OFF") + .define("LLVM_ENABLE_TERMINFO", "OFF") + .define("LLVM_ENABLE_LIBEDIT", "OFF") + .define("LLVM_ENABLE_BINDINGS", "OFF") + .define("LLVM_ENABLE_Z3_SOLVER", "OFF") + .define("LLVM_PARALLEL_COMPILE_JOBS", builder.jobs().to_string()) + .define("LLVM_TARGET_ARCH", target.split('-').next().unwrap()) + .define("LLVM_DEFAULT_TARGET_TRIPLE", target); if builder.config.llvm_thin_lto { cfg.define("LLVM_ENABLE_LTO", "Thin"); if !target.contains("apple") { - cfg.define("LLVM_ENABLE_LLD", "ON"); + cfg.define("LLVM_ENABLE_LLD", "ON"); } } @@ -212,20 +219,19 @@ impl Step for Llvm { // http://llvm.org/docs/HowToCrossCompileLLVM.html if target != builder.config.build { - builder.ensure(Llvm { - target: builder.config.build, - }); + builder.ensure(Llvm { target: builder.config.build }); // FIXME: if the llvm root for the build triple is overridden then we // should use llvm-tblgen from there, also should verify that it // actually exists most of the time in normal installs of LLVM. let host = builder.llvm_out(builder.config.build).join("bin/llvm-tblgen"); - cfg.define("CMAKE_CROSSCOMPILING", "True") - .define("LLVM_TABLEGEN", &host); + cfg.define("CMAKE_CROSSCOMPILING", "True").define("LLVM_TABLEGEN", &host); if target.contains("netbsd") { - cfg.define("CMAKE_SYSTEM_NAME", "NetBSD"); + cfg.define("CMAKE_SYSTEM_NAME", "NetBSD"); } else if target.contains("freebsd") { - cfg.define("CMAKE_SYSTEM_NAME", "FreeBSD"); + cfg.define("CMAKE_SYSTEM_NAME", "FreeBSD"); + } else if target.contains("windows") { + cfg.define("CMAKE_SYSTEM_NAME", "Windows"); } cfg.define("LLVM_NATIVE_BUILD", builder.llvm_out(builder.config.build).join("build")); @@ -237,11 +243,8 @@ impl Step for Llvm { cfg.define("LLVM_VERSION_SUFFIX", suffix); } } else { - let mut default_suffix = format!( - "-rust-{}-{}", - channel::CFG_RELEASE_NUM, - builder.config.channel, - ); + let mut default_suffix = + format!("-rust-{}-{}", channel::CFG_RELEASE_NUM, builder.config.channel,); if let Some(sha) = llvm_info.sha_short() { default_suffix.push_str("-"); default_suffix.push_str(sha); @@ -261,7 +264,7 @@ impl Step for Llvm { cfg.define("PYTHON_EXECUTABLE", python); } - configure_cmake(builder, target, &mut cfg); + configure_cmake(builder, target, &mut cfg, true); // FIXME: we don't actually need to build all LLVM tools and all LLVM // libraries here, e.g., we just want a few components and a few @@ -282,7 +285,7 @@ impl Step for Llvm { fn check_llvm_version(builder: &Builder<'_>, llvm_config: &Path) { if !builder.config.llvm_version_check { - return + return; } if builder.config.dry_run { @@ -291,19 +294,21 @@ fn check_llvm_version(builder: &Builder<'_>, llvm_config: &Path) { let mut cmd = Command::new(llvm_config); let version = output(cmd.arg("--version")); - let mut parts = version.split('.').take(2) - .filter_map(|s| s.parse::().ok()); + let mut parts = version.split('.').take(2).filter_map(|s| s.parse::().ok()); if let (Some(major), Some(_minor)) = (parts.next(), parts.next()) { if major >= 7 { - return + return; } } panic!("\n\nbad LLVM version: {}, need >=7.0\n\n", version) } -fn configure_cmake(builder: &Builder<'_>, - target: Interned, - cfg: &mut cmake::Config) { +fn configure_cmake( + builder: &Builder<'_>, + target: Interned, + cfg: &mut cmake::Config, + use_compiler_launcher: bool, +) { // Do not print installation messages for up-to-date files. // LLVM and LLD builds can produce a lot of those and hit CI limits on log size. cfg.define("CMAKE_INSTALL_MESSAGE", "LAZY"); @@ -311,8 +316,7 @@ fn configure_cmake(builder: &Builder<'_>, if builder.config.ninja { cfg.generator("Ninja"); } - cfg.target(&target) - .host(&builder.config.build); + cfg.target(&target).host(&builder.config.build); let sanitize_cc = |cc: &Path| { if target.contains("msvc") { @@ -326,7 +330,7 @@ fn configure_cmake(builder: &Builder<'_>, // vars that we'd otherwise configure. In that case we just skip this // entirely. if target.contains("msvc") && !builder.config.ninja { - return + return; } let (cc, cxx) = match builder.config.llvm_clang_cl { @@ -335,56 +339,54 @@ fn configure_cmake(builder: &Builder<'_>, }; // Handle msvc + ninja + ccache specially (this is what the bots use) - if target.contains("msvc") && - builder.config.ninja && - builder.config.ccache.is_some() - { - let mut wrap_cc = env::current_exe().expect("failed to get cwd"); - wrap_cc.set_file_name("sccache-plus-cl.exe"); - - cfg.define("CMAKE_C_COMPILER", sanitize_cc(&wrap_cc)) - .define("CMAKE_CXX_COMPILER", sanitize_cc(&wrap_cc)); - cfg.env("SCCACHE_PATH", - builder.config.ccache.as_ref().unwrap()) - .env("SCCACHE_TARGET", target) - .env("SCCACHE_CC", &cc) - .env("SCCACHE_CXX", &cxx); - - // Building LLVM on MSVC can be a little ludicrous at times. We're so far - // off the beaten path here that I'm not really sure this is even half - // supported any more. Here we're trying to: - // - // * Build LLVM on MSVC - // * Build LLVM with `clang-cl` instead of `cl.exe` - // * Build a project with `sccache` - // * Build for 32-bit as well - // * Build with Ninja - // - // For `cl.exe` there are different binaries to compile 32/64 bit which - // we use but for `clang-cl` there's only one which internally - // multiplexes via flags. As a result it appears that CMake's detection - // of a compiler's architecture and such on MSVC **doesn't** pass any - // custom flags we pass in CMAKE_CXX_FLAGS below. This means that if we - // use `clang-cl.exe` it's always diagnosed as a 64-bit compiler which - // definitely causes problems since all the env vars are pointing to - // 32-bit libraries. - // - // To hack around this... again... we pass an argument that's - // unconditionally passed in the sccache shim. This'll get CMake to - // correctly diagnose it's doing a 32-bit compilation and LLVM will - // internally configure itself appropriately. - if builder.config.llvm_clang_cl.is_some() && target.contains("i686") { - cfg.env("SCCACHE_EXTRA_ARGS", "-m32"); - } + if target.contains("msvc") && builder.config.ninja && builder.config.ccache.is_some() { + let mut wrap_cc = env::current_exe().expect("failed to get cwd"); + wrap_cc.set_file_name("sccache-plus-cl.exe"); + + cfg.define("CMAKE_C_COMPILER", sanitize_cc(&wrap_cc)) + .define("CMAKE_CXX_COMPILER", sanitize_cc(&wrap_cc)); + cfg.env("SCCACHE_PATH", builder.config.ccache.as_ref().unwrap()) + .env("SCCACHE_TARGET", target) + .env("SCCACHE_CC", &cc) + .env("SCCACHE_CXX", &cxx); + + // Building LLVM on MSVC can be a little ludicrous at times. We're so far + // off the beaten path here that I'm not really sure this is even half + // supported any more. Here we're trying to: + // + // * Build LLVM on MSVC + // * Build LLVM with `clang-cl` instead of `cl.exe` + // * Build a project with `sccache` + // * Build for 32-bit as well + // * Build with Ninja + // + // For `cl.exe` there are different binaries to compile 32/64 bit which + // we use but for `clang-cl` there's only one which internally + // multiplexes via flags. As a result it appears that CMake's detection + // of a compiler's architecture and such on MSVC **doesn't** pass any + // custom flags we pass in CMAKE_CXX_FLAGS below. This means that if we + // use `clang-cl.exe` it's always diagnosed as a 64-bit compiler which + // definitely causes problems since all the env vars are pointing to + // 32-bit libraries. + // + // To hack around this... again... we pass an argument that's + // unconditionally passed in the sccache shim. This'll get CMake to + // correctly diagnose it's doing a 32-bit compilation and LLVM will + // internally configure itself appropriately. + if builder.config.llvm_clang_cl.is_some() && target.contains("i686") { + cfg.env("SCCACHE_EXTRA_ARGS", "-m32"); + } } else { - // If ccache is configured we inform the build a little differently how - // to invoke ccache while also invoking our compilers. - if let Some(ref ccache) = builder.config.ccache { - cfg.define("CMAKE_C_COMPILER_LAUNCHER", ccache) - .define("CMAKE_CXX_COMPILER_LAUNCHER", ccache); - } - cfg.define("CMAKE_C_COMPILER", sanitize_cc(cc)) - .define("CMAKE_CXX_COMPILER", sanitize_cc(cxx)); + // If ccache is configured we inform the build a little differently how + // to invoke ccache while also invoking our compilers. + if use_compiler_launcher { + if let Some(ref ccache) = builder.config.ccache { + cfg.define("CMAKE_C_COMPILER_LAUNCHER", ccache) + .define("CMAKE_CXX_COMPILER_LAUNCHER", ccache); + } + } + cfg.define("CMAKE_C_COMPILER", sanitize_cc(cc)) + .define("CMAKE_CXX_COMPILER", sanitize_cc(cxx)); } cfg.build_arg("-j").build_arg(builder.jobs().to_string()); @@ -394,10 +396,7 @@ fn configure_cmake(builder: &Builder<'_>, } cfg.define("CMAKE_C_FLAGS", cflags); let mut cxxflags = builder.cflags(target, GitRepo::Llvm).join(" "); - if builder.config.llvm_static_stdcpp && - !target.contains("msvc") && - !target.contains("netbsd") - { + if builder.config.llvm_static_stdcpp && !target.contains("msvc") && !target.contains("netbsd") { cxxflags.push_str(" -static-libstdc++"); } if let Some(ref s) = builder.config.llvm_cxxflags { @@ -455,14 +454,12 @@ impl Step for Lld { } let target = self.target; - let llvm_config = builder.ensure(Llvm { - target: self.target, - }); + let llvm_config = builder.ensure(Llvm { target: self.target }); let out_dir = builder.lld_out(target); let done_stamp = out_dir.join("lld-finished-building"); if done_stamp.exists() { - return out_dir + return out_dir; } builder.info(&format!("Building LLD for {}", target)); @@ -470,7 +467,7 @@ impl Step for Lld { t!(fs::create_dir_all(&out_dir)); let mut cfg = cmake::Config::new(builder.src.join("src/llvm-project/lld")); - configure_cmake(builder, target, &mut cfg); + configure_cmake(builder, target, &mut cfg, true); // This is an awful, awful hack. Discovered when we migrated to using // clang-cl to compile LLVM/LLD it turns out that LLD, when built out of @@ -486,14 +483,12 @@ impl Step for Lld { // ensure we don't hit the same bugs with escaping. It means that you // can't build on a system where your paths require `\` on Windows, but // there's probably a lot of reasons you can't do that other than this. - let llvm_config_shim = env::current_exe() - .unwrap() - .with_file_name("llvm-config-wrapper"); + let llvm_config_shim = env::current_exe().unwrap().with_file_name("llvm-config-wrapper"); cfg.out_dir(&out_dir) - .profile("Release") - .env("LLVM_CONFIG_REAL", llvm_config) - .define("LLVM_CONFIG_PATH", llvm_config_shim) - .define("LLVM_INCLUDE_TESTS", "OFF"); + .profile("Release") + .env("LLVM_CONFIG_REAL", llvm_config) + .define("LLVM_CONFIG_PATH", llvm_config_shim) + .define("LLVM_INCLUDE_TESTS", "OFF"); cfg.build(); @@ -528,7 +523,7 @@ impl Step for TestHelpers { let dst = builder.test_helpers_out(target); let src = builder.src.join("src/test/auxiliary/rust_test_helpers.c"); if up_to_date(&src, &dst.join("librust_test_helpers.a")) { - return + return; } builder.info("Building test helpers"); @@ -550,13 +545,149 @@ impl Step for TestHelpers { } cfg.cargo_metadata(false) - .out_dir(&dst) - .target(&target) - .host(&builder.config.build) - .opt_level(0) - .warnings(false) - .debug(false) - .file(builder.src.join("src/test/auxiliary/rust_test_helpers.c")) - .compile("rust_test_helpers"); + .out_dir(&dst) + .target(&target) + .host(&builder.config.build) + .opt_level(0) + .warnings(false) + .debug(false) + .file(builder.src.join("src/test/auxiliary/rust_test_helpers.c")) + .compile("rust_test_helpers"); + } +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct Sanitizers { + pub target: Interned, +} + +impl Step for Sanitizers { + type Output = Vec; + + fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { + run.path("src/llvm-project/compiler-rt").path("src/sanitizers") + } + + fn make_run(run: RunConfig<'_>) { + run.builder.ensure(Sanitizers { target: run.target }); + } + + /// Builds sanitizer runtime libraries. + fn run(self, builder: &Builder<'_>) -> Self::Output { + let compiler_rt_dir = builder.src.join("src/llvm-project/compiler-rt"); + if !compiler_rt_dir.exists() { + return Vec::new(); + } + + let out_dir = builder.native_dir(self.target).join("sanitizers"); + let runtimes = supported_sanitizers(&out_dir, self.target); + if runtimes.is_empty() { + return runtimes; + } + + let llvm_config = builder.ensure(Llvm { target: builder.config.build }); + if builder.config.dry_run { + return runtimes; + } + + let done_stamp = out_dir.join("sanitizers-finished-building"); + if done_stamp.exists() { + builder.info(&format!( + "Assuming that sanitizers rebuild is not necessary. \ + To force a rebuild, remove the file `{}`", + done_stamp.display() + )); + return runtimes; + } + + builder.info(&format!("Building sanitizers for {}", self.target)); + let _time = util::timeit(&builder); + + let mut cfg = cmake::Config::new(&compiler_rt_dir); + cfg.profile("Release"); + cfg.define("CMAKE_C_COMPILER_TARGET", self.target); + cfg.define("COMPILER_RT_BUILD_BUILTINS", "OFF"); + cfg.define("COMPILER_RT_BUILD_CRT", "OFF"); + cfg.define("COMPILER_RT_BUILD_LIBFUZZER", "OFF"); + cfg.define("COMPILER_RT_BUILD_PROFILE", "OFF"); + cfg.define("COMPILER_RT_BUILD_SANITIZERS", "ON"); + cfg.define("COMPILER_RT_BUILD_XRAY", "OFF"); + cfg.define("COMPILER_RT_DEFAULT_TARGET_ONLY", "ON"); + cfg.define("COMPILER_RT_USE_LIBCXX", "OFF"); + cfg.define("LLVM_CONFIG_PATH", &llvm_config); + + // On Darwin targets the sanitizer runtimes are build as universal binaries. + // Unfortunately sccache currently lacks support to build them successfully. + // Disable compiler launcher on Darwin targets to avoid potential issues. + let use_compiler_launcher = !self.target.contains("apple-darwin"); + configure_cmake(builder, self.target, &mut cfg, use_compiler_launcher); + + t!(fs::create_dir_all(&out_dir)); + cfg.out_dir(out_dir); + + for runtime in &runtimes { + cfg.build_target(&runtime.cmake_target); + cfg.build(); + } + + t!(fs::write(&done_stamp, b"")); + + runtimes + } +} + +#[derive(Clone, Debug)] +pub struct SanitizerRuntime { + /// CMake target used to build the runtime. + pub cmake_target: String, + /// Path to the built runtime library. + pub path: PathBuf, + /// Library filename that will be used rustc. + pub name: String, +} + +/// Returns sanitizers available on a given target. +fn supported_sanitizers(out_dir: &Path, target: Interned) -> Vec { + let mut result = Vec::new(); + match &*target { + "x86_64-apple-darwin" => { + for s in &["asan", "lsan", "tsan"] { + result.push(SanitizerRuntime { + cmake_target: format!("clang_rt.{}_osx_dynamic", s), + path: out_dir + .join(&format!("build/lib/darwin/libclang_rt.{}_osx_dynamic.dylib", s)), + name: format!("librustc_rt.{}.dylib", s), + }); + } + } + "x86_64-unknown-linux-gnu" => { + for s in &["asan", "lsan", "msan", "tsan"] { + result.push(SanitizerRuntime { + cmake_target: format!("clang_rt.{}-x86_64", s), + path: out_dir.join(&format!("build/lib/linux/libclang_rt.{}-x86_64.a", s)), + name: format!("librustc_rt.{}.a", s), + }); + } + } + "x86_64-fuchsia" => { + for s in &["asan"] { + result.push(SanitizerRuntime { + cmake_target: format!("clang_rt.{}-x86_64", s), + path: out_dir.join(&format!("build/lib/fuchsia/libclang_rt.{}-x86_64.a", s)), + name: format!("librustc_rt.{}.a", s), + }); + } + } + "aarch64-fuchsia" => { + for s in &["asan"] { + result.push(SanitizerRuntime { + cmake_target: format!("clang_rt.{}-aarch64", s), + path: out_dir.join(&format!("build/lib/fuchsia/libclang_rt.{}-aarch64.a", s)), + name: format!("librustc_rt.{}.a", s), + }); + } + } + _ => {} } + result } diff --git a/src/bootstrap/sanity.rs b/src/bootstrap/sanity.rs index bffe748f37..8ff7056e62 100644 --- a/src/bootstrap/sanity.rs +++ b/src/bootstrap/sanity.rs @@ -10,7 +10,7 @@ use std::collections::HashMap; use std::env; -use std::ffi::{OsString, OsStr}; +use std::ffi::{OsStr, OsString}; use std::fs; use std::path::PathBuf; use std::process::Command; @@ -26,30 +26,31 @@ struct Finder { impl Finder { fn new() -> Self { - Self { - cache: HashMap::new(), - path: env::var_os("PATH").unwrap_or_default() - } + Self { cache: HashMap::new(), path: env::var_os("PATH").unwrap_or_default() } } fn maybe_have>(&mut self, cmd: S) -> Option { let cmd: OsString = cmd.as_ref().into(); let path = &self.path; - self.cache.entry(cmd.clone()).or_insert_with(|| { - for path in env::split_paths(path) { - let target = path.join(&cmd); - let mut cmd_exe = cmd.clone(); - cmd_exe.push(".exe"); - - if target.is_file() // some/path/git + self.cache + .entry(cmd.clone()) + .or_insert_with(|| { + for path in env::split_paths(path) { + let target = path.join(&cmd); + let mut cmd_exe = cmd.clone(); + cmd_exe.push(".exe"); + + if target.is_file() // some/path/git || path.join(&cmd_exe).exists() // some/path/git.exe - || target.join(&cmd_exe).exists() // some/path/git/git.exe - { - return Some(target); + || target.join(&cmd_exe).exists() + // some/path/git/git.exe + { + return Some(target); + } } - } - None - }).clone() + None + }) + .clone() } fn must_have>(&mut self, cmd: S) -> PathBuf { @@ -77,11 +78,17 @@ pub fn check(build: &mut Build) { } // We need cmake, but only if we're actually building LLVM or sanitizers. - let building_llvm = build.hosts.iter() - .map(|host| build.config.target_config - .get(host) - .map(|config| config.llvm_config.is_none()) - .unwrap_or(true)) + let building_llvm = build + .hosts + .iter() + .map(|host| { + build + .config + .target_config + .get(host) + .map(|config| config.llvm_config.is_none()) + .unwrap_or(true) + }) .any(|build_llvm_ourselves| build_llvm_ourselves); if building_llvm || build.config.sanitizers { cmd_finder.must_have("cmake"); @@ -119,17 +126,29 @@ pub fn check(build: &mut Build) { } } - build.config.python = build.config.python.take().map(|p| cmd_finder.must_have(p)) + build.config.python = build + .config + .python + .take() + .map(|p| cmd_finder.must_have(p)) .or_else(|| cmd_finder.maybe_have("python2.7")) .or_else(|| cmd_finder.maybe_have("python2")) .or_else(|| env::var_os("BOOTSTRAP_PYTHON").map(PathBuf::from)) // set by bootstrap.py .or_else(|| Some(cmd_finder.must_have("python"))); - build.config.nodejs = build.config.nodejs.take().map(|p| cmd_finder.must_have(p)) + build.config.nodejs = build + .config + .nodejs + .take() + .map(|p| cmd_finder.must_have(p)) .or_else(|| cmd_finder.maybe_have("node")) .or_else(|| cmd_finder.maybe_have("nodejs")); - build.config.gdb = build.config.gdb.take().map(|p| cmd_finder.must_have(p)) + build.config.gdb = build + .config + .gdb + .take() + .map(|p| cmd_finder.must_have(p)) .or_else(|| cmd_finder.maybe_have("gdb")); // We're gonna build some custom C code here and there, host triples @@ -169,15 +188,13 @@ pub fn check(build: &mut Build) { for target in &build.targets { // Can't compile for iOS unless we're on macOS - if target.contains("apple-ios") && - !build.build.contains("apple-darwin") { + if target.contains("apple-ios") && !build.build.contains("apple-darwin") { panic!("the iOS target is only supported on macOS"); } if target.contains("-none-") || target.contains("nvptx") { if build.no_std(*target).is_none() { - let target = build.config.target_config.entry(target.clone()) - .or_default(); + let target = build.config.target_config.entry(target.clone()).or_default(); target.no_std = true; } @@ -192,22 +209,20 @@ pub fn check(build: &mut Build) { // If this is a native target (host is also musl) and no musl-root is given, // fall back to the system toolchain in /usr before giving up if build.musl_root(*target).is_none() && build.config.build == *target { - let target = build.config.target_config.entry(target.clone()) - .or_default(); + let target = build.config.target_config.entry(target.clone()).or_default(); target.musl_root = Some("/usr".into()); } match build.musl_root(*target) { Some(root) => { if fs::metadata(root.join("lib/libc.a")).is_err() { - panic!("couldn't find libc.a in musl dir: {}", - root.join("lib").display()); + panic!("couldn't find libc.a in musl dir: {}", root.join("lib").display()); } } - None => { - panic!("when targeting MUSL either the rust.musl-root \ + None => panic!( + "when targeting MUSL either the rust.musl-root \ option or the target.$TARGET.musl-root option must \ - be specified in config.toml") - } + be specified in config.toml" + ), } } @@ -217,7 +232,8 @@ pub fn check(build: &mut Build) { // Studio, so detect that here and error. let out = output(Command::new("cmake").arg("--help")); if !out.contains("Visual Studio") { - panic!(" + panic!( + " cmake does not support Visual Studio generators. This is likely due to it being an msys/cygwin build of cmake, @@ -228,7 +244,8 @@ If you are building under msys2 try installing the mingw-w64-x86_64-cmake package instead of cmake: $ pacman -R cmake && pacman -S mingw-w64-x86_64-cmake -"); +" + ); } } } @@ -240,8 +257,10 @@ $ pacman -R cmake && pacman -S mingw-w64-x86_64-cmake if build.config.channel == "stable" { let stage0 = t!(fs::read_to_string(build.src.join("src/stage0.txt"))); if stage0.contains("\ndev:") { - panic!("bootstrapping from a dev compiler in a stable release, but \ - should only be bootstrapping from a released compiler!"); + panic!( + "bootstrapping from a dev compiler in a stable release, but \ + should only be bootstrapping from a released compiler!" + ); } } } diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs index f3b2a73d3c..659a308d5b 100644 --- a/src/bootstrap/test.rs +++ b/src/bootstrap/test.rs @@ -19,11 +19,11 @@ use crate::compile; use crate::dist; use crate::flags::Subcommand; use crate::native; -use crate::tool::{self, Tool, SourceType}; +use crate::tool::{self, SourceType, Tool}; use crate::toolstate::ToolState; use crate::util::{self, dylib_path, dylib_path_var}; use crate::Crate as CargoCrate; -use crate::{DocTests, Mode, GitRepo, envify}; +use crate::{envify, DocTests, GitRepo, Mode}; const ADB_TEST_DIR: &str = "/data/tmp/work"; @@ -115,16 +115,13 @@ impl Step for Linkcheck { let _time = util::timeit(&builder); try_run( builder, - builder - .tool_cmd(Tool::Linkchecker) - .arg(builder.out.join(host).join("doc")), + builder.tool_cmd(Tool::Linkchecker).arg(builder.out.join(host).join("doc")), ); } fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { let builder = run.builder; - run.path("src/tools/linkchecker") - .default_condition(builder.config.docs) + run.path("src/tools/linkchecker").default_condition(builder.config.docs) } fn make_run(run: RunConfig<'_>) { @@ -147,10 +144,7 @@ impl Step for Cargotest { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Cargotest { - stage: run.builder.top_stage, - host: run.target, - }); + run.builder.ensure(Cargotest { stage: run.builder.top_stage, host: run.target }); } /// Runs the `cargotest` tool as compiled in `stage` by the `host` compiler. @@ -159,10 +153,7 @@ impl Step for Cargotest { /// test` to ensure that we don't regress the test suites there. fn run(self, builder: &Builder<'_>) { let compiler = builder.compiler(self.stage, self.host); - builder.ensure(compile::Rustc { - compiler, - target: compiler.host, - }); + builder.ensure(compile::Rustc { compiler, target: compiler.host }); // Note that this is a short, cryptic, and not scoped directory name. This // is currently to minimize the length of path on Windows where we otherwise @@ -197,28 +188,24 @@ impl Step for Cargo { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Cargo { - stage: run.builder.top_stage, - host: run.target, - }); + run.builder.ensure(Cargo { stage: run.builder.top_stage, host: run.target }); } /// Runs `cargo test` for `cargo` packaged with Rust. fn run(self, builder: &Builder<'_>) { let compiler = builder.compiler(self.stage, self.host); - builder.ensure(tool::Cargo { + builder.ensure(tool::Cargo { compiler, target: self.host }); + let mut cargo = tool::prepare_tool_cargo( + builder, compiler, - target: self.host, - }); - let mut cargo = tool::prepare_tool_cargo(builder, - compiler, - Mode::ToolRustc, - self.host, - "test", - "src/tools/cargo", - SourceType::Submodule, - &[]); + Mode::ToolRustc, + self.host, + "test", + "src/tools/cargo", + SourceType::Submodule, + &[], + ); if !builder.fail_fast { cargo.arg("--no-fail-fast"); @@ -254,10 +241,7 @@ impl Step for Rls { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Rls { - stage: run.builder.top_stage, - host: run.target, - }); + run.builder.ensure(Rls { stage: run.builder.top_stage, host: run.target }); } /// Runs `cargo test` for the rls. @@ -266,28 +250,26 @@ impl Step for Rls { let host = self.host; let compiler = builder.compiler(stage, host); - let build_result = builder.ensure(tool::Rls { - compiler, - target: self.host, - extra_features: Vec::new(), - }); + let build_result = + builder.ensure(tool::Rls { compiler, target: self.host, extra_features: Vec::new() }); if build_result.is_none() { eprintln!("failed to test rls: could not build"); return; } - let mut cargo = tool::prepare_tool_cargo(builder, - compiler, - Mode::ToolRustc, - host, - "test", - "src/tools/rls", - SourceType::Submodule, - &[]); + let mut cargo = tool::prepare_tool_cargo( + builder, + compiler, + Mode::ToolRustc, + host, + "test", + "src/tools/rls", + SourceType::Submodule, + &[], + ); builder.add_rustc_lib_path(compiler, &mut cargo); - cargo.arg("--") - .args(builder.config.cmd.test_args()); + cargo.arg("--").args(builder.config.cmd.test_args()); if try_run(builder, &mut cargo.into()) { builder.save_toolstate("rls", ToolState::TestPass); @@ -310,10 +292,7 @@ impl Step for Rustfmt { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Rustfmt { - stage: run.builder.top_stage, - host: run.target, - }); + run.builder.ensure(Rustfmt { stage: run.builder.top_stage, host: run.target }); } /// Runs `cargo test` for rustfmt. @@ -332,14 +311,16 @@ impl Step for Rustfmt { return; } - let mut cargo = tool::prepare_tool_cargo(builder, - compiler, - Mode::ToolRustc, - host, - "test", - "src/tools/rustfmt", - SourceType::Submodule, - &[]); + let mut cargo = tool::prepare_tool_cargo( + builder, + compiler, + Mode::ToolRustc, + host, + "test", + "src/tools/rustfmt", + SourceType::Submodule, + &[], + ); let dir = testdir(builder, compiler.host); t!(fs::create_dir_all(&dir)); @@ -368,10 +349,7 @@ impl Step for Miri { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Miri { - stage: run.builder.top_stage, - host: run.target, - }); + run.builder.ensure(Miri { stage: run.builder.top_stage, host: run.target }); } /// Runs `cargo test` for miri. @@ -380,11 +358,8 @@ impl Step for Miri { let host = self.host; let compiler = builder.compiler(stage, host); - let miri = builder.ensure(tool::Miri { - compiler, - target: self.host, - extra_features: Vec::new(), - }); + let miri = + builder.ensure(tool::Miri { compiler, target: self.host, extra_features: Vec::new() }); if let Some(miri) = miri { let mut cargo = builder.cargo(compiler, Mode::ToolRustc, host, "install"); cargo.arg("xargo"); @@ -407,16 +382,8 @@ impl Step for Miri { SourceType::Submodule, &[], ); - cargo - .arg("--bin") - .arg("cargo-miri") - .arg("--") - .arg("miri") - .arg("setup"); - - // Tell `cargo miri` not to worry about the sysroot mismatch (we built with - // stage1 but run with stage2). - cargo.env("MIRI_SKIP_SYSROOT_CHECK", "1"); + cargo.arg("--bin").arg("cargo-miri").arg("--").arg("miri").arg("setup"); + // Tell `cargo miri setup` where to find the sources. cargo.env("XARGO_RUST_SRC", builder.src.join("src")); // Debug things. @@ -441,7 +408,8 @@ impl Step for Miri { String::new() } else { builder.verbose(&format!("running: {:?}", cargo)); - let out = cargo.output() + let out = cargo + .output() .expect("We already ran `cargo miri setup` before and that worked"); assert!(out.status.success(), "`cargo miri setup` returned with non-0 exit code"); // Output is "\n". @@ -497,9 +465,7 @@ impl Step for CompiletestTest { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(CompiletestTest { - host: run.target, - }); + run.builder.ensure(CompiletestTest { host: run.target }); } /// Runs `cargo test` for compiletest. @@ -507,14 +473,16 @@ impl Step for CompiletestTest { let host = self.host; let compiler = builder.compiler(0, host); - let cargo = tool::prepare_tool_cargo(builder, - compiler, - Mode::ToolBootstrap, - host, - "test", - "src/tools/compiletest", - SourceType::InTree, - &[]); + let cargo = tool::prepare_tool_cargo( + builder, + compiler, + Mode::ToolBootstrap, + host, + "test", + "src/tools/compiletest", + SourceType::InTree, + &[], + ); try_run(builder, &mut cargo.into()); } @@ -536,10 +504,7 @@ impl Step for Clippy { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Clippy { - stage: run.builder.top_stage, - host: run.target, - }); + run.builder.ensure(Clippy { stage: run.builder.top_stage, host: run.target }); } /// Runs `cargo test` for clippy. @@ -554,22 +519,22 @@ impl Step for Clippy { extra_features: Vec::new(), }); if let Some(clippy) = clippy { - let mut cargo = tool::prepare_tool_cargo(builder, - compiler, - Mode::ToolRustc, - host, - "test", - "src/tools/clippy", - SourceType::Submodule, - &[]); + let mut cargo = tool::prepare_tool_cargo( + builder, + compiler, + Mode::ToolRustc, + host, + "test", + "src/tools/clippy", + SourceType::Submodule, + &[], + ); // clippy tests need to know about the stage sysroot cargo.env("SYSROOT", builder.sysroot(compiler)); cargo.env("RUSTC_TEST_SUITE", builder.rustc(compiler)); cargo.env("RUSTC_LIB_PATH", builder.rustc_libdir(compiler)); - let host_libs = builder - .stage_out(compiler, Mode::ToolRustc) - .join(builder.cargo_dir()); + let host_libs = builder.stage_out(compiler, Mode::ToolRustc).join(builder.cargo_dir()); let target_libs = builder .stage_out(compiler, Mode::ToolRustc) .join(&self.host) @@ -623,19 +588,10 @@ impl Step for RustdocTheme { let rustdoc = builder.out.join("bootstrap/debug/rustdoc"); let mut cmd = builder.tool_cmd(Tool::RustdocTheme); cmd.arg(rustdoc.to_str().unwrap()) - .arg( - builder - .src - .join("src/librustdoc/html/static/themes") - .to_str() - .unwrap(), - ) + .arg(builder.src.join("src/librustdoc/html/static/themes").to_str().unwrap()) .env("RUSTC_STAGE", self.compiler.stage.to_string()) .env("RUSTC_SYSROOT", builder.sysroot(self.compiler)) - .env( - "RUSTDOC_LIBDIR", - builder.sysroot_libdir(self.compiler, self.compiler.host), - ) + .env("RUSTDOC_LIBDIR", builder.sysroot_libdir(self.compiler, self.compiler.host)) .env("CFG_RELEASE_CHANNEL", &builder.config.channel) .env("RUSTDOC_REAL", builder.rustdoc(self.compiler)) .env("RUSTDOC_CRATE_VERSION", builder.rust_version()) @@ -663,25 +619,17 @@ impl Step for RustdocJSStd { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(RustdocJSStd { - host: run.host, - target: run.target, - }); + run.builder.ensure(RustdocJSStd { host: run.host, target: run.target }); } fn run(self, builder: &Builder<'_>) { if let Some(ref nodejs) = builder.config.nodejs { let mut command = Command::new(nodejs); command.args(&["src/tools/rustdoc-js-std/tester.js", &*self.host]); - builder.ensure(crate::doc::Std { - target: self.target, - stage: builder.top_stage, - }); + builder.ensure(crate::doc::Std { target: self.target, stage: builder.top_stage }); builder.run(&mut command); } else { - builder.info( - "No nodejs found, skipping \"src/test/rustdoc-js-std\" tests" - ); + builder.info("No nodejs found, skipping \"src/test/rustdoc-js-std\" tests"); } } } @@ -704,11 +652,7 @@ impl Step for RustdocJSNotStd { fn make_run(run: RunConfig<'_>) { let compiler = run.builder.compiler(run.builder.top_stage, run.host); - run.builder.ensure(RustdocJSNotStd { - host: run.host, - target: run.target, - compiler, - }); + run.builder.ensure(RustdocJSNotStd { host: run.host, target: run.target, compiler }); } fn run(self, builder: &Builder<'_>) { @@ -722,9 +666,7 @@ impl Step for RustdocJSNotStd { compare_mode: None, }); } else { - builder.info( - "No nodejs found, skipping \"src/test/rustdoc-js\" tests" - ); + builder.info("No nodejs found, skipping \"src/test/rustdoc-js\" tests"); } } } @@ -747,11 +689,7 @@ impl Step for RustdocUi { fn make_run(run: RunConfig<'_>) { let compiler = run.builder.compiler(run.builder.top_stage, run.host); - run.builder.ensure(RustdocUi { - host: run.host, - target: run.target, - compiler, - }); + run.builder.ensure(RustdocUi { host: run.host, target: run.target, compiler }); } fn run(self, builder: &Builder<'_>) { @@ -779,6 +717,9 @@ impl Step for Tidy { /// This tool in `src/tools` checks up on various bits and pieces of style and /// otherwise just implements a few lint-like checks that are specific to the /// compiler itself. + /// + /// Once tidy passes, this step also runs `fmt --check` if tests are being run + /// for the `dev` or `nightly` channels. fn run(self, builder: &Builder<'_>) { let mut cmd = builder.tool_cmd(Tool::Tidy); cmd.arg(builder.src.join("src")); @@ -792,6 +733,11 @@ impl Step for Tidy { builder.info("tidy check"); try_run(builder, &mut cmd); + + if builder.config.channel == "dev" || builder.config.channel == "nightly" { + builder.info("fmt check"); + crate::format::format(&builder.build, !builder.config.cmd.bless()); + } } fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { @@ -810,37 +756,55 @@ fn testdir(builder: &Builder<'_>, host: Interned) -> PathBuf { macro_rules! default_test { ($name:ident { path: $path:expr, mode: $mode:expr, suite: $suite:expr }) => { test!($name { path: $path, mode: $mode, suite: $suite, default: true, host: false }); - } + }; } macro_rules! default_test_with_compare_mode { ($name:ident { path: $path:expr, mode: $mode:expr, suite: $suite:expr, compare_mode: $compare_mode:expr }) => { - test_with_compare_mode!($name { path: $path, mode: $mode, suite: $suite, default: true, - host: false, compare_mode: $compare_mode }); - } + test_with_compare_mode!($name { + path: $path, + mode: $mode, + suite: $suite, + default: true, + host: false, + compare_mode: $compare_mode + }); + }; } macro_rules! host_test { ($name:ident { path: $path:expr, mode: $mode:expr, suite: $suite:expr }) => { test!($name { path: $path, mode: $mode, suite: $suite, default: true, host: true }); - } + }; } macro_rules! test { ($name:ident { path: $path:expr, mode: $mode:expr, suite: $suite:expr, default: $default:expr, host: $host:expr }) => { - test_definitions!($name { path: $path, mode: $mode, suite: $suite, default: $default, - host: $host, compare_mode: None }); - } + test_definitions!($name { + path: $path, + mode: $mode, + suite: $suite, + default: $default, + host: $host, + compare_mode: None + }); + }; } macro_rules! test_with_compare_mode { ($name:ident { path: $path:expr, mode: $mode:expr, suite: $suite:expr, default: $default:expr, host: $host:expr, compare_mode: $compare_mode:expr }) => { - test_definitions!($name { path: $path, mode: $mode, suite: $suite, default: $default, - host: $host, compare_mode: Some($compare_mode) }); - } + test_definitions!($name { + path: $path, + mode: $mode, + suite: $suite, + default: $default, + host: $host, + compare_mode: Some($compare_mode) + }); + }; } macro_rules! test_definitions { @@ -870,10 +834,7 @@ macro_rules! test_definitions { fn make_run(run: RunConfig<'_>) { let compiler = run.builder.compiler(run.builder.top_stage, run.host); - run.builder.ensure($name { - compiler, - target: run.target, - }); + run.builder.ensure($name { compiler, target: run.target }); } fn run(self, builder: &Builder<'_>) { @@ -887,7 +848,7 @@ macro_rules! test_definitions { }) } } - } + }; } default_test_with_compare_mode!(Ui { @@ -903,11 +864,7 @@ default_test!(CompileFail { suite: "compile-fail" }); -default_test!(RunFail { - path: "src/test/run-fail", - mode: "run-fail", - suite: "run-fail" -}); +default_test!(RunFail { path: "src/test/run-fail", mode: "run-fail", suite: "run-fail" }); default_test!(RunPassValgrind { path: "src/test/run-pass-valgrind", @@ -915,17 +872,9 @@ default_test!(RunPassValgrind { suite: "run-pass-valgrind" }); -default_test!(MirOpt { - path: "src/test/mir-opt", - mode: "mir-opt", - suite: "mir-opt" -}); +default_test!(MirOpt { path: "src/test/mir-opt", mode: "mir-opt", suite: "mir-opt" }); -default_test!(Codegen { - path: "src/test/codegen", - mode: "codegen", - suite: "codegen" -}); +default_test!(Codegen { path: "src/test/codegen", mode: "codegen", suite: "codegen" }); default_test!(CodegenUnits { path: "src/test/codegen-units", @@ -939,29 +888,13 @@ default_test!(Incremental { suite: "incremental" }); -default_test!(Debuginfo { - path: "src/test/debuginfo", - mode: "debuginfo", - suite: "debuginfo" -}); +default_test!(Debuginfo { path: "src/test/debuginfo", mode: "debuginfo", suite: "debuginfo" }); -host_test!(UiFullDeps { - path: "src/test/ui-fulldeps", - mode: "ui", - suite: "ui-fulldeps" -}); +host_test!(UiFullDeps { path: "src/test/ui-fulldeps", mode: "ui", suite: "ui-fulldeps" }); -host_test!(Rustdoc { - path: "src/test/rustdoc", - mode: "rustdoc", - suite: "rustdoc" -}); +host_test!(Rustdoc { path: "src/test/rustdoc", mode: "rustdoc", suite: "rustdoc" }); -host_test!(Pretty { - path: "src/test/pretty", - mode: "pretty", - suite: "pretty" -}); +host_test!(Pretty { path: "src/test/pretty", mode: "pretty", suite: "pretty" }); test!(RunFailPretty { path: "src/test/run-fail/pretty", mode: "pretty", @@ -977,11 +910,7 @@ test!(RunPassValgrindPretty { host: true }); -default_test!(RunMake { - path: "src/test/run-make", - mode: "run-make", - suite: "run-make" -}); +default_test!(RunMake { path: "src/test/run-make", mode: "run-make", suite: "run-make" }); host_test!(RunMakeFullDeps { path: "src/test/run-make-fulldeps", @@ -989,11 +918,7 @@ host_test!(RunMakeFullDeps { suite: "run-make-fulldeps" }); -default_test!(Assembly { - path: "src/test/assembly", - mode: "assembly", - suite: "assembly" -}); +default_test!(Assembly { path: "src/test/assembly", mode: "assembly", suite: "assembly" }); #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] struct Compiletest { @@ -1032,18 +957,8 @@ impl Step for Compiletest { } if suite == "debuginfo" { - let msvc = builder.config.build.contains("msvc"); - if mode == "debuginfo" { - return builder.ensure(Compiletest { - mode: if msvc { "debuginfo-cdb" } else { "debuginfo-gdb+lldb" }, - ..self - }); - } - - builder.ensure(dist::DebuggerScripts { - sysroot: builder.sysroot(compiler), - host: target, - }); + builder + .ensure(dist::DebuggerScripts { sysroot: builder.sysroot(compiler), host: target }); } if suite.ends_with("fulldeps") { @@ -1069,10 +984,8 @@ impl Step for Compiletest { // compiletest currently has... a lot of arguments, so let's just pass all // of them! - cmd.arg("--compile-lib-path") - .arg(builder.rustc_libdir(compiler)); - cmd.arg("--run-lib-path") - .arg(builder.sysroot_libdir(compiler, target)); + cmd.arg("--compile-lib-path").arg(builder.rustc_libdir(compiler)); + cmd.arg("--run-lib-path").arg(builder.sysroot_libdir(compiler, target)); cmd.arg("--rustc-path").arg(builder.rustc(compiler)); let is_rustdoc = suite.ends_with("rustdoc-ui") || suite.ends_with("rustdoc-js"); @@ -1083,33 +996,25 @@ impl Step for Compiletest { || (mode == "ui" && is_rustdoc) || mode == "js-doc-test" { - cmd.arg("--rustdoc-path") - .arg(builder.rustdoc(compiler)); + cmd.arg("--rustdoc-path").arg(builder.rustdoc(compiler)); } - cmd.arg("--src-base") - .arg(builder.src.join("src/test").join(suite)); - cmd.arg("--build-base") - .arg(testdir(builder, compiler.host).join(suite)); - cmd.arg("--stage-id") - .arg(format!("stage{}-{}", compiler.stage, target)); + cmd.arg("--src-base").arg(builder.src.join("src/test").join(suite)); + cmd.arg("--build-base").arg(testdir(builder, compiler.host).join(suite)); + cmd.arg("--stage-id").arg(format!("stage{}-{}", compiler.stage, target)); cmd.arg("--mode").arg(mode); cmd.arg("--target").arg(target); cmd.arg("--host").arg(&*compiler.host); - cmd.arg("--llvm-filecheck") - .arg(builder.llvm_filecheck(builder.config.build)); + cmd.arg("--llvm-filecheck").arg(builder.llvm_filecheck(builder.config.build)); if builder.config.cmd.bless() { cmd.arg("--bless"); } - let compare_mode = builder.config.cmd.compare_mode().or_else(|| { - if builder.config.test_compare_mode { - self.compare_mode - } else { - None - } - }); + let compare_mode = + builder.config.cmd.compare_mode().or_else(|| { + if builder.config.test_compare_mode { self.compare_mode } else { None } + }); if let Some(ref pass) = builder.config.cmd.pass() { cmd.arg("--pass"); @@ -1120,11 +1025,7 @@ impl Step for Compiletest { cmd.arg("--nodejs").arg(nodejs); } - let mut flags = if is_rustdoc { - Vec::new() - } else { - vec!["-Crpath".to_string()] - }; + let mut flags = if is_rustdoc { Vec::new() } else { vec!["-Crpath".to_string()] }; if !is_rustdoc { if builder.config.rust_optimize_tests { flags.push("-O".to_string()); @@ -1139,26 +1040,20 @@ impl Step for Compiletest { } let mut hostflags = flags.clone(); - hostflags.push(format!( - "-Lnative={}", - builder.test_helpers_out(compiler.host).display() - )); + hostflags.push(format!("-Lnative={}", builder.test_helpers_out(compiler.host).display())); cmd.arg("--host-rustcflags").arg(hostflags.join(" ")); let mut targetflags = flags; - targetflags.push(format!( - "-Lnative={}", - builder.test_helpers_out(target).display() - )); + targetflags.push(format!("-Lnative={}", builder.test_helpers_out(target).display())); cmd.arg("--target-rustcflags").arg(targetflags.join(" ")); cmd.arg("--docck-python").arg(builder.python()); if builder.config.build.ends_with("apple-darwin") { - // Force /usr/bin/python on macOS for LLDB tests because we're loading the + // Force /usr/bin/python3 on macOS for LLDB tests because we're loading the // LLDB plugin's compiled module which only works with the system python // (namely not Homebrew-installed python) - cmd.arg("--lldb-python").arg("/usr/bin/python"); + cmd.arg("--lldb-python").arg("/usr/bin/python3"); } else { cmd.arg("--lldb-python").arg(builder.python()); } @@ -1170,9 +1065,10 @@ impl Step for Compiletest { let run = |cmd: &mut Command| { cmd.output().map(|output| { String::from_utf8_lossy(&output.stdout) - .lines().next().unwrap_or_else(|| { - panic!("{:?} failed {:?}", cmd, output) - }).to_string() + .lines() + .next() + .unwrap_or_else(|| panic!("{:?} failed {:?}", cmd, output)) + .to_string() }) }; let lldb_exe = if builder.config.lldb_enabled { @@ -1184,7 +1080,7 @@ impl Step for Compiletest { let lldb_version = Command::new(&lldb_exe) .arg("--version") .output() - .map(|output| { String::from_utf8_lossy(&output.stdout).to_string() }) + .map(|output| String::from_utf8_lossy(&output.stdout).to_string()) .ok(); if let Some(ref vers) = lldb_version { cmd.arg("--lldb-version").arg(vers); @@ -1208,11 +1104,9 @@ impl Step for Compiletest { // Get test-args by striping suite path let mut test_args: Vec<&str> = paths .iter() - .map(|p| { - match p.strip_prefix(".") { - Ok(path) => path, - Err(_) => p, - } + .map(|p| match p.strip_prefix(".") { + Ok(path) => path, + Err(_) => p, }) .filter(|p| p.starts_with(suite_path) && (p.is_dir() || p.is_file())) .filter_map(|p| { @@ -1242,9 +1136,7 @@ impl Step for Compiletest { } if builder.config.llvm_enabled() { - let llvm_config = builder.ensure(native::Llvm { - target: builder.config.build, - }); + let llvm_config = builder.ensure(native::Llvm { target: builder.config.build }); if !builder.config.dry_run { let llvm_version = output(Command::new(&llvm_config).arg("--version")); cmd.arg("--llvm-version").arg(llvm_version); @@ -1274,23 +1166,24 @@ impl Step for Compiletest { // The llvm/bin directory contains many useful cross-platform // tools. Pass the path to run-make tests so they can use them. - let llvm_bin_path = llvm_config.parent() + let llvm_bin_path = llvm_config + .parent() .expect("Expected llvm-config to be contained in directory"); assert!(llvm_bin_path.is_dir()); cmd.arg("--llvm-bin-dir").arg(llvm_bin_path); // If LLD is available, add it to the PATH if builder.config.lld_enabled { - let lld_install_root = builder.ensure(native::Lld { - target: builder.config.build, - }); + let lld_install_root = + builder.ensure(native::Lld { target: builder.config.build }); let lld_bin_path = lld_install_root.join("bin"); let old_path = env::var_os("PATH").unwrap_or_default(); - let new_path = env::join_paths(std::iter::once(lld_bin_path) - .chain(env::split_paths(&old_path))) - .expect("Could not add LLD bin path to PATH"); + let new_path = env::join_paths( + std::iter::once(lld_bin_path).chain(env::split_paths(&old_path)), + ) + .expect("Could not add LLD bin path to PATH"); cmd.env("PATH", new_path); } } @@ -1310,8 +1203,7 @@ impl Step for Compiletest { } if builder.remote_tested(target) { - cmd.arg("--remote-test-client") - .arg(builder.tool_exe(Tool::RemoteTestClient)); + cmd.arg("--remote-test-client").arg(builder.tool_exe(Tool::RemoteTestClient)); } // Running a C compiler on MSVC requires a few env vars to be set, to be @@ -1341,7 +1233,6 @@ impl Step for Compiletest { std::fs::create_dir_all(&tmp).unwrap(); cmd.env("RUST_TEST_TMPDIR", tmp); - cmd.arg("--adb-path").arg("adb"); cmd.arg("--adb-test-dir").arg(ADB_TEST_DIR); if target.contains("android") { @@ -1401,10 +1292,7 @@ impl Step for DocTest { fn run(self, builder: &Builder<'_>) { let compiler = self.compiler; - builder.ensure(compile::Std { - compiler, - target: compiler.host, - }); + builder.ensure(compile::Std { compiler, target: compiler.host }); // Do a breadth-first traversal of the `src/doc` directory and just run // tests for all files that end in `*.md` @@ -1508,9 +1396,8 @@ impl Step for ErrorIndex { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(ErrorIndex { - compiler: run.builder.compiler(run.builder.top_stage, run.host), - }); + run.builder + .ensure(ErrorIndex { compiler: run.builder.compiler(run.builder.top_stage, run.host) }); } /// Runs the error index generator tool to execute the tests located in the error @@ -1522,10 +1409,7 @@ impl Step for ErrorIndex { fn run(self, builder: &Builder<'_>) { let compiler = self.compiler; - builder.ensure(compile::Std { - compiler, - target: compiler.host, - }); + builder.ensure(compile::Std { compiler, target: compiler.host }); let dir = testdir(builder, compiler.host); t!(fs::create_dir_all(&dir)); @@ -1535,9 +1419,7 @@ impl Step for ErrorIndex { builder, builder.compiler(compiler.stage, builder.config.build), ); - tool.arg("markdown") - .arg(&output) - .env("CFG_BUILD", &builder.config.build); + tool.arg("markdown").arg(&output).env("CFG_BUILD", &builder.config.build); builder.info(&format!("Testing error-index stage{}", compiler.stage)); let _time = util::timeit(&builder); @@ -1769,7 +1651,7 @@ impl Step for Crate { let mut cargo = builder.cargo(compiler, mode, target, test_kind.subcommand()); match mode { Mode::Std => { - compile::std_cargo(builder, &compiler, target, &mut cargo); + compile::std_cargo(builder, target, &mut cargo); } Mode::Rustc => { builder.ensure(compile::Rustc { compiler, target }); @@ -1817,23 +1699,12 @@ impl Step for Crate { if target.contains("emscripten") { cargo.env( format!("CARGO_TARGET_{}_RUNNER", envify(&target)), - builder - .config - .nodejs - .as_ref() - .expect("nodejs not configured"), + builder.config.nodejs.as_ref().expect("nodejs not configured"), ); } else if target.starts_with("wasm32") { - let node = builder - .config - .nodejs - .as_ref() - .expect("nodejs not configured"); - let runner = format!( - "{} {}/src/etc/wasm32-shim.js", - node.display(), - builder.src.display() - ); + let node = builder.config.nodejs.as_ref().expect("nodejs not configured"); + let runner = + format!("{} {}/src/etc/wasm32-shim.js", node.display(), builder.src.display()); cargo.env(format!("CARGO_TARGET_{}_RUNNER", envify(&target)), &runner); } else if builder.remote_tested(target) { cargo.env( @@ -1871,10 +1742,7 @@ impl Step for CrateRustdoc { let test_kind = builder.kind.into(); - builder.ensure(CrateRustdoc { - host: run.host, - test_kind, - }); + builder.ensure(CrateRustdoc { host: run.host, test_kind }); } fn run(self, builder: &Builder<'_>) { @@ -1884,14 +1752,16 @@ impl Step for CrateRustdoc { let target = compiler.host; builder.ensure(compile::Rustc { compiler, target }); - let mut cargo = tool::prepare_tool_cargo(builder, - compiler, - Mode::ToolRustc, - target, - test_kind.subcommand(), - "src/tools/rustdoc", - SourceType::InTree, - &[]); + let mut cargo = tool::prepare_tool_cargo( + builder, + compiler, + Mode::ToolRustc, + target, + test_kind.subcommand(), + "src/tools/rustdoc", + SourceType::InTree, + &[], + ); if test_kind.subcommand() == "test" && !builder.fail_fast { cargo.arg("--no-fail-fast"); } @@ -1953,18 +1823,13 @@ impl Step for RemoteCopyLibs { builder.info(&format!("REMOTE copy libs to emulator ({})", target)); t!(fs::create_dir_all(builder.out.join("tmp"))); - let server = builder.ensure(tool::RemoteTestServer { - compiler: compiler.with_stage(0), - target, - }); + let server = + builder.ensure(tool::RemoteTestServer { compiler: compiler.with_stage(0), target }); // Spawn the emulator and wait for it to come online let tool = builder.tool_exe(Tool::RemoteTestClient); let mut cmd = Command::new(&tool); - cmd.arg("spawn-emulator") - .arg(target) - .arg(&server) - .arg(builder.out.join("tmp")); + cmd.arg("spawn-emulator").arg(target).arg(&server).arg(builder.out.join("tmp")); if let Some(rootfs) = builder.qemu_rootfs(target) { cmd.arg(rootfs); } @@ -2019,9 +1884,7 @@ impl Step for Distcheck { .current_dir(&dir), ); builder.run( - Command::new(build_helper::make(&builder.config.build)) - .arg("check") - .current_dir(&dir), + Command::new(build_helper::make(&builder.config.build)).arg("check").current_dir(&dir), ); // Now make sure that rust-src has all of libstd's dependencies diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index 815498047f..7f24768a4f 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -1,20 +1,20 @@ -use std::fs; +use std::collections::HashSet; use std::env; +use std::fs; use std::path::PathBuf; -use std::process::{Command, exit}; -use std::collections::HashSet; +use std::process::{exit, Command}; use build_helper::t; -use crate::Mode; -use crate::Compiler; -use crate::builder::{Step, RunConfig, ShouldRun, Builder, Cargo as CargoCommand}; -use crate::util::{exe, add_lib_path, CiEnv}; -use crate::compile; -use crate::channel::GitInfo; -use crate::channel; +use crate::builder::{Builder, Cargo as CargoCommand, RunConfig, ShouldRun, Step}; use crate::cache::Interned; +use crate::channel; +use crate::channel::GitInfo; +use crate::compile; use crate::toolstate::ToolState; +use crate::util::{add_lib_path, exe, CiEnv}; +use crate::Compiler; +use crate::Mode; #[derive(Debug, Clone, Hash, PartialEq, Eq)] pub enum SourceType { @@ -53,14 +53,10 @@ impl Step for ToolBuild { let is_optional_tool = self.is_optional_tool; match self.mode { - Mode::ToolRustc => { - builder.ensure(compile::Rustc { compiler, target }) - } - Mode::ToolStd => { - builder.ensure(compile::Std { compiler, target }) - } + Mode::ToolRustc => builder.ensure(compile::Rustc { compiler, target }), + Mode::ToolStd => builder.ensure(compile::Std { compiler, target }), Mode::ToolBootstrap => {} // uses downloaded stage0 compiler libs - _ => panic!("unexpected Mode for tool build") + _ => panic!("unexpected Mode for tool build"), } let cargo = prepare_tool_cargo( @@ -79,12 +75,7 @@ impl Step for ToolBuild { let is_expected = compile::stream_cargo(builder, cargo, vec![], &mut |msg| { // Only care about big things like the RLS/Cargo for now match tool { - | "rls" - | "cargo" - | "clippy-driver" - | "miri" - | "rustfmt" - => {} + "rls" | "cargo" | "clippy-driver" | "miri" | "rustfmt" => {} _ => return, } @@ -94,9 +85,7 @@ impl Step for ToolBuild { features, filenames, target: _, - } => { - (package_id, features, filenames) - } + } => (package_id, features, filenames), _ => return, }; let features = features.iter().map(|s| s.to_string()).collect::>(); @@ -105,7 +94,7 @@ impl Step for ToolBuild { let val = (tool, PathBuf::from(&*path), features.clone()); // we're only interested in deduplicating rlibs for now if val.1.extension().and_then(|s| s.to_str()) != Some("rlib") { - continue + continue; } // Don't worry about compiles that turn out to be host @@ -132,9 +121,7 @@ impl Step for ToolBuild { // already listed then we need to see if we reused the same // artifact or produced a duplicate. let mut artifacts = builder.tool_artifacts.borrow_mut(); - let prev_artifacts = artifacts - .entry(target) - .or_default(); + let prev_artifacts = artifacts.entry(target).or_default(); let prev = match prev_artifacts.get(&*id) { Some(prev) => prev, None => { @@ -160,21 +147,21 @@ impl Step for ToolBuild { // ... and otherwise this looks like we duplicated some sort of // compilation, so record it to generate an error later. - duplicates.push(( - id.to_string(), - val, - prev.clone(), - )); + duplicates.push((id.to_string(), val, prev.clone())); } }); if is_expected && !duplicates.is_empty() { - println!("duplicate artifacts found when compiling a tool, this \ + println!( + "duplicate artifacts found when compiling a tool, this \ typically means that something was recompiled because \ a transitive dependency has different features activated \ - than in a previous build:\n"); - println!("the following dependencies are duplicated although they \ - have the same features enabled:"); + than in a previous build:\n" + ); + println!( + "the following dependencies are duplicated although they \ + have the same features enabled:" + ); for (id, cur, prev) in duplicates.drain_filter(|(_, cur, prev)| cur.2 == prev.2) { println!(" {}", id); // same features @@ -185,24 +172,33 @@ impl Step for ToolBuild { println!(" {}", id); let cur_features: HashSet<_> = cur.2.into_iter().collect(); let prev_features: HashSet<_> = prev.2.into_iter().collect(); - println!(" `{}` additionally enabled features {:?} at {:?}", - cur.0, &cur_features - &prev_features, cur.1); - println!(" `{}` additionally enabled features {:?} at {:?}", - prev.0, &prev_features - &cur_features, prev.1); + println!( + " `{}` additionally enabled features {:?} at {:?}", + cur.0, + &cur_features - &prev_features, + cur.1 + ); + println!( + " `{}` additionally enabled features {:?} at {:?}", + prev.0, + &prev_features - &cur_features, + prev.1 + ); } println!(); - println!("to fix this you will probably want to edit the local \ + println!( + "to fix this you will probably want to edit the local \ src/tools/rustc-workspace-hack/Cargo.toml crate, as \ that will update the dependency graph to ensure that \ - these crates all share the same feature set"); + these crates all share the same feature set" + ); panic!("tools should not compile multiple copies of the same crate"); } - builder.save_toolstate(tool, if is_expected { - ToolState::TestFail - } else { - ToolState::BuildFail - }); + builder.save_toolstate( + tool, + if is_expected { ToolState::TestFail } else { ToolState::BuildFail }, + ); if !is_expected { if !is_optional_tool { @@ -211,8 +207,8 @@ impl Step for ToolBuild { None } } else { - let cargo_out = builder.cargo_out(compiler, self.mode, target) - .join(exe(tool, &compiler.host)); + let cargo_out = + builder.cargo_out(compiler, self.mode, target).join(exe(tool, &compiler.host)); let bin = builder.tools_dir(compiler).join(exe(tool, &compiler.host)); builder.copy(&cargo_out, &bin); Some(bin) @@ -240,12 +236,12 @@ pub fn prepare_tool_cargo( let mut features = extra_features.iter().cloned().collect::>(); if builder.build.config.cargo_native_static { - if path.ends_with("cargo") || - path.ends_with("rls") || - path.ends_with("clippy") || - path.ends_with("miri") || - path.ends_with("rustbook") || - path.ends_with("rustfmt") + if path.ends_with("cargo") + || path.ends_with("rls") + || path.ends_with("clippy") + || path.ends_with("miri") + || path.ends_with("rustbook") + || path.ends_with("rustfmt") { cargo.env("LIBZ_SYS_STATIC", "1"); features.push("rustc-workspace-hack/all-static".to_string()); @@ -293,8 +289,8 @@ fn rustbook_features() -> Vec { macro_rules! bootstrap_tool { ($( $name:ident, $path:expr, $tool_name:expr - $(,llvm_tools = $llvm:expr)* $(,is_external_tool = $external:expr)* + $(,is_unstable_tool = $unstable:expr)* $(,features = $features:expr)* ; )+) => { @@ -305,15 +301,6 @@ macro_rules! bootstrap_tool { )+ } - impl Tool { - /// Whether this tool requires LLVM to run - pub fn uses_llvm_tools(&self) -> bool { - match self { - $(Tool::$name => false $(|| $llvm)*,)+ - } - } - } - impl<'a> Builder<'a> { pub fn tool_exe(&self, tool: Tool) -> PathBuf { match tool { @@ -354,7 +341,12 @@ macro_rules! bootstrap_tool { compiler: self.compiler, target: self.target, tool: $tool_name, - mode: Mode::ToolBootstrap, + mode: if false $(|| $unstable)* { + // use in-tree libraries for unstable features + Mode::ToolStd + } else { + Mode::ToolBootstrap + }, path: $path, is_optional_tool: false, source_type: if false $(|| $external)* { @@ -381,7 +373,7 @@ bootstrap_tool!( Tidy, "src/tools/tidy", "tidy"; Linkchecker, "src/tools/linkchecker", "linkchecker"; CargoTest, "src/tools/cargotest", "cargotest"; - Compiletest, "src/tools/compiletest", "compiletest", llvm_tools = true; + Compiletest, "src/tools/compiletest", "compiletest", is_unstable_tool = true; BuildManifest, "src/tools/build-manifest", "build-manifest"; RemoteTestClient, "src/tools/remote-test-client", "remote-test-client"; RustInstaller, "src/tools/rust-installer", "fabricate", is_external_tool = true; @@ -395,9 +387,7 @@ pub struct ErrorIndex { impl ErrorIndex { pub fn command(builder: &Builder<'_>, compiler: Compiler) -> Command { - let mut cmd = Command::new(builder.ensure(ErrorIndex { - compiler - })); + let mut cmd = Command::new(builder.ensure(ErrorIndex { compiler })); add_lib_path( vec![PathBuf::from(&builder.sysroot_libdir(compiler, compiler.host))], &mut cmd, @@ -417,22 +407,23 @@ impl Step for ErrorIndex { // Compile the error-index in the same stage as rustdoc to avoid // recompiling rustdoc twice if we can. let stage = if run.builder.top_stage >= 2 { run.builder.top_stage } else { 0 }; - run.builder.ensure(ErrorIndex { - compiler: run.builder.compiler(stage, run.builder.config.build), - }); + run.builder + .ensure(ErrorIndex { compiler: run.builder.compiler(stage, run.builder.config.build) }); } fn run(self, builder: &Builder<'_>) -> PathBuf { - builder.ensure(ToolBuild { - compiler: self.compiler, - target: self.compiler.host, - tool: "error_index_generator", - mode: Mode::ToolRustc, - path: "src/tools/error_index_generator", - is_optional_tool: false, - source_type: SourceType::InTree, - extra_features: Vec::new(), - }).expect("expected to build -- essential tool") + builder + .ensure(ToolBuild { + compiler: self.compiler, + target: self.compiler.host, + tool: "error_index_generator", + mode: Mode::ToolRustc, + path: "src/tools/error_index_generator", + is_optional_tool: false, + source_type: SourceType::InTree, + extra_features: Vec::new(), + }) + .expect("expected to build -- essential tool") } } @@ -457,16 +448,18 @@ impl Step for RemoteTestServer { } fn run(self, builder: &Builder<'_>) -> PathBuf { - builder.ensure(ToolBuild { - compiler: self.compiler, - target: self.target, - tool: "remote-test-server", - mode: Mode::ToolStd, - path: "src/tools/remote-test-server", - is_optional_tool: false, - source_type: SourceType::InTree, - extra_features: Vec::new(), - }).expect("expected to build -- essential tool") + builder + .ensure(ToolBuild { + compiler: self.compiler, + target: self.target, + tool: "remote-test-server", + mode: Mode::ToolStd, + path: "src/tools/remote-test-server", + is_optional_tool: false, + source_type: SourceType::InTree, + extra_features: Vec::new(), + }) + .expect("expected to build -- essential tool") } } @@ -487,9 +480,8 @@ impl Step for Rustdoc { } fn make_run(run: RunConfig<'_>) { - run.builder.ensure(Rustdoc { - compiler: run.builder.compiler(run.builder.top_stage, run.host), - }); + run.builder + .ensure(Rustdoc { compiler: run.builder.compiler(run.builder.top_stage, run.host) }); } fn run(self, builder: &Builder<'_>) -> PathBuf { @@ -525,14 +517,17 @@ impl Step for Rustdoc { &[], ); - builder.info(&format!("Building rustdoc for stage{} ({})", - target_compiler.stage, target_compiler.host)); + builder.info(&format!( + "Building rustdoc for stage{} ({})", + target_compiler.stage, target_compiler.host + )); builder.run(&mut cargo.into()); // Cargo adds a number of paths to the dylib search path on windows, which results in // the wrong rustdoc being executed. To avoid the conflicting rustdocs, we name the "tool" // rustdoc a different name. - let tool_rustdoc = builder.cargo_out(build_compiler, Mode::ToolRustc, target) + let tool_rustdoc = builder + .cargo_out(build_compiler, Mode::ToolRustc, target) .join(exe("rustdoc_tool_binary", &target_compiler.host)); // don't create a stage0-sysroot/bin directory. @@ -574,16 +569,18 @@ impl Step for Cargo { } fn run(self, builder: &Builder<'_>) -> PathBuf { - builder.ensure(ToolBuild { - compiler: self.compiler, - target: self.target, - tool: "cargo", - mode: Mode::ToolRustc, - path: "src/tools/cargo", - is_optional_tool: false, - source_type: SourceType::Submodule, - extra_features: Vec::new(), - }).expect("expected to build -- essential tool") + builder + .ensure(ToolBuild { + compiler: self.compiler, + target: self.target, + tool: "cargo", + mode: Mode::ToolRustc, + path: "src/tools/cargo", + is_optional_tool: false, + source_type: SourceType::Submodule, + extra_features: Vec::new(), + }) + .expect("expected to build -- essential tool") } } @@ -682,7 +679,7 @@ impl<'a> Builder<'a> { let curpaths = env::split_paths(&curpaths).collect::>(); for &(ref k, ref v) in self.cc[&compiler.host].env() { if k != "PATH" { - continue + continue; } for path in env::split_paths(v) { if !curpaths.contains(&path) { diff --git a/src/bootstrap/toolstate.rs b/src/bootstrap/toolstate.rs index a6d9ef38e5..b068c8200a 100644 --- a/src/bootstrap/toolstate.rs +++ b/src/bootstrap/toolstate.rs @@ -1,25 +1,25 @@ -use serde::{Deserialize, Serialize}; +use crate::builder::{Builder, RunConfig, ShouldRun, Step}; use build_helper::t; -use std::time; -use std::fs; -use std::io::{Seek, SeekFrom}; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use crate::builder::{Builder, RunConfig, ShouldRun, Step}; +use std::env; use std::fmt; -use std::process::Command; +use std::fs; +use std::io::{Seek, SeekFrom}; use std::path::PathBuf; -use std::env; +use std::process::Command; +use std::time; // Each cycle is 42 days long (6 weeks); the last week is 35..=42 then. const BETA_WEEK_START: u64 = 35; -#[cfg(linux)] +#[cfg(target_os = "linux")] const OS: Option<&str> = Some("linux"); #[cfg(windows)] const OS: Option<&str> = Some("windows"); -#[cfg(all(not(linux), not(windows)))] +#[cfg(all(not(target_os = "linux"), not(windows)))] const OS: Option<&str> = None; type ToolstateData = HashMap, ToolState>; @@ -38,11 +38,15 @@ pub enum ToolState { impl fmt::Display for ToolState { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", match self { - ToolState::TestFail => "test-fail", - ToolState::TestPass => "test-pass", - ToolState::BuildFail => "build-fail", - }) + write!( + f, + "{}", + match self { + ToolState::TestFail => "test-fail", + ToolState::TestPass => "test-pass", + ToolState::BuildFail => "build-fail", + } + ) } } @@ -120,9 +124,7 @@ fn check_changed_files(toolstates: &HashMap, ToolState>) { let output = t!(String::from_utf8(output.stdout)); for (tool, submodule) in STABLE_TOOLS.iter().chain(NIGHTLY_TOOLS.iter()) { - let changed = output.lines().any(|l| { - l.starts_with("M") && l.ends_with(submodule) - }); + let changed = output.lines().any(|l| l.starts_with("M") && l.ends_with(submodule)); eprintln!("Verifying status of {}...", tool); if !changed { continue; @@ -179,8 +181,10 @@ impl Step for ToolStateCheck { eprintln!("error: Tool `{}` should be test-pass but is {}", tool, state); } else if in_beta_week { did_error = true; - eprintln!("error: Tool `{}` should be test-pass but is {} during beta week.", - tool, state); + eprintln!( + "error: Tool `{}` should be test-pass but is {} during beta week.", + tool, state + ); } } } @@ -210,11 +214,8 @@ impl Builder<'_> { // Ensure the parent directory always exists t!(std::fs::create_dir_all(parent)); } - let mut file = t!(fs::OpenOptions::new() - .create(true) - .write(true) - .read(true) - .open(path)); + let mut file = + t!(fs::OpenOptions::new().create(true).write(true).read(true).open(path)); serde_json::from_reader(&mut file).unwrap_or_default() } else { @@ -233,11 +234,8 @@ impl Builder<'_> { // Ensure the parent directory always exists t!(std::fs::create_dir_all(parent)); } - let mut file = t!(fs::OpenOptions::new() - .create(true) - .read(true) - .write(true) - .open(path)); + let mut file = + t!(fs::OpenOptions::new().create(true).read(true).write(true).open(path)); let mut current_toolstates: HashMap, ToolState> = serde_json::from_reader(&mut file).unwrap_or_default(); @@ -275,10 +273,7 @@ impl Builder<'_> { /// /// * See /// if a private email by GitHub is wanted. -fn commit_toolstate_change( - current_toolstate: &ToolstateData, - in_beta_week: bool, -) { +fn commit_toolstate_change(current_toolstate: &ToolstateData, in_beta_week: bool) { fn git_config(key: &str, value: &str) { let status = Command::new("git").arg("config").arg("--global").arg(key).arg(value).status(); let success = match status { @@ -303,7 +298,8 @@ fn commit_toolstate_change( let git_credential_path = PathBuf::from(t!(env::var("HOME"))).join(".git-credentials"); t!(fs::write(&git_credential_path, credential)); - let status = Command::new("git").arg("clone") + let status = Command::new("git") + .arg("clone") .arg("--depth=1") .arg(t!(env::var("TOOLSTATE_REPO"))) .status(); @@ -379,7 +375,7 @@ fn change_toolstate( let mut regressed = false; for repo_state in old_toolstate { let tool = &repo_state.tool; - let state = if cfg!(linux) { + let state = if cfg!(target_os = "linux") { &repo_state.linux } else if cfg!(windows) { &repo_state.windows @@ -402,10 +398,7 @@ fn change_toolstate( std::process::exit(1); } - let commit = t!(std::process::Command::new("git") - .arg("rev-parse") - .arg("HEAD") - .output()); + let commit = t!(std::process::Command::new("git").arg("rev-parse").arg("HEAD").output()); let commit = t!(String::from_utf8(commit.stdout)); let toolstate_serialized = t!(serde_json::to_string(¤t_toolstate)); @@ -413,7 +406,7 @@ fn change_toolstate( let history_path = format!("rust-toolstate/history/{}.tsv", OS.expect("linux/windows only")); let mut file = t!(fs::read_to_string(&history_path)); let end_of_first_line = file.find('\n').unwrap(); - file.insert_str(end_of_first_line, &format!("{}\t{}\n", commit, toolstate_serialized)); + file.insert_str(end_of_first_line, &format!("\n{}\t{}", commit.trim(), toolstate_serialized)); t!(fs::write(&history_path, file)); } diff --git a/src/bootstrap/util.rs b/src/bootstrap/util.rs index 6824b7a58c..7d1efe4610 100644 --- a/src/bootstrap/util.rs +++ b/src/bootstrap/util.rs @@ -4,36 +4,28 @@ //! not a lot of interesting happenings here unfortunately. use std::env; -use std::str; use std::fs; use std::io; use std::path::{Path, PathBuf}; use std::process::Command; +use std::str; use std::time::Instant; use build_helper::t; -use crate::config::Config; use crate::builder::Builder; use crate::cache::Interned; +use crate::config::Config; /// Returns the `name` as the filename of a static library for `target`. pub fn staticlib(name: &str, target: &str) -> String { - if target.contains("windows") { - format!("{}.lib", name) - } else { - format!("lib{}.a", name) - } + if target.contains("windows") { format!("{}.lib", name) } else { format!("lib{}.a", name) } } /// Given an executable called `name`, return the filename for the /// executable for a particular target. pub fn exe(name: &str, target: &str) -> String { - if target.contains("windows") { - format!("{}.exe", name) - } else { - name.to_string() - } + if target.contains("windows") { format!("{}.exe", name) } else { name.to_string() } } /// Returns `true` if the file name given looks like a dynamic library. @@ -44,7 +36,7 @@ pub fn is_dylib(name: &str) -> bool { /// Returns the corresponding relative library directory that the compiler's /// dylibs will be found in. pub fn libdir(target: &str) -> &'static str { - if target.contains("windows") {"bin"} else {"lib"} + if target.contains("windows") { "bin" } else { "lib" } } /// Adds a list of lookup paths to `cmd`'s dynamic library lookup path. @@ -106,9 +98,7 @@ impl Drop for TimeIt { fn drop(&mut self) { let time = self.1.elapsed(); if !self.0 { - println!("\tfinished in {}.{:03}", - time.as_secs(), - time.subsec_nanos() / 1_000_000); + println!("\tfinished in {}.{:03}", time.as_secs(), time.subsec_nanos() / 1_000_000); } } } @@ -116,7 +106,9 @@ impl Drop for TimeIt { /// Symlinks two directories, using junctions on Windows and normal symlinks on /// Unix. pub fn symlink_dir(config: &Config, src: &Path, dest: &Path) -> io::Result<()> { - if config.dry_run { return Ok(()); } + if config.dry_run { + return Ok(()); + } let _ = fs::remove_dir(dest); return symlink_dir_inner(src, dest); @@ -131,37 +123,24 @@ pub fn symlink_dir(config: &Config, src: &Path, dest: &Path) -> io::Result<()> { // what can be found here: // // http://www.flexhex.com/docs/articles/hard-links.phtml - // - // Copied from std #[cfg(windows)] - #[allow(nonstandard_style)] fn symlink_dir_inner(target: &Path, junction: &Path) -> io::Result<()> { - use std::ptr; use std::ffi::OsStr; use std::os::windows::ffi::OsStrExt; + use std::ptr; - const MAXIMUM_REPARSE_DATA_BUFFER_SIZE: usize = 16 * 1024; - const GENERIC_WRITE: DWORD = 0x40000000; - const OPEN_EXISTING: DWORD = 3; - const FILE_FLAG_OPEN_REPARSE_POINT: DWORD = 0x00200000; - const FILE_FLAG_BACKUP_SEMANTICS: DWORD = 0x02000000; - const FSCTL_SET_REPARSE_POINT: DWORD = 0x900a4; - const IO_REPARSE_TAG_MOUNT_POINT: DWORD = 0xa0000003; - const FILE_SHARE_DELETE: DWORD = 0x4; - const FILE_SHARE_READ: DWORD = 0x1; - const FILE_SHARE_WRITE: DWORD = 0x2; - - type BOOL = i32; - type DWORD = u32; - type HANDLE = *mut u8; - type LPCWSTR = *const u16; - type LPDWORD = *mut DWORD; - type LPOVERLAPPED = *mut u8; - type LPSECURITY_ATTRIBUTES = *mut u8; - type LPVOID = *mut u8; - type WCHAR = u16; - type WORD = u16; - + use winapi::shared::minwindef::{DWORD, WORD}; + use winapi::um::fileapi::{CreateFileW, OPEN_EXISTING}; + use winapi::um::handleapi::CloseHandle; + use winapi::um::ioapiset::DeviceIoControl; + use winapi::um::winbase::{FILE_FLAG_BACKUP_SEMANTICS, FILE_FLAG_OPEN_REPARSE_POINT}; + use winapi::um::winioctl::FSCTL_SET_REPARSE_POINT; + use winapi::um::winnt::{ + FILE_SHARE_DELETE, FILE_SHARE_READ, FILE_SHARE_WRITE, GENERIC_WRITE, + IO_REPARSE_TAG_MOUNT_POINT, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, WCHAR, + }; + + #[allow(non_snake_case)] #[repr(C)] struct REPARSE_MOUNTPOINT_DATA_BUFFER { ReparseTag: DWORD, @@ -173,26 +152,6 @@ pub fn symlink_dir(config: &Config, src: &Path, dest: &Path) -> io::Result<()> { ReparseTarget: WCHAR, } - extern "system" { - fn CreateFileW(lpFileName: LPCWSTR, - dwDesiredAccess: DWORD, - dwShareMode: DWORD, - lpSecurityAttributes: LPSECURITY_ATTRIBUTES, - dwCreationDisposition: DWORD, - dwFlagsAndAttributes: DWORD, - hTemplateFile: HANDLE) - -> HANDLE; - fn DeviceIoControl(hDevice: HANDLE, - dwIoControlCode: DWORD, - lpInBuffer: LPVOID, - nInBufferSize: DWORD, - lpOutBuffer: LPVOID, - nOutBufferSize: DWORD, - lpBytesReturned: LPDWORD, - lpOverlapped: LPOVERLAPPED) -> BOOL; - fn CloseHandle(hObject: HANDLE) -> BOOL; - } - fn to_u16s>(s: S) -> io::Result> { Ok(s.as_ref().encode_wide().chain(Some(0)).collect()) } @@ -207,17 +166,18 @@ pub fn symlink_dir(config: &Config, src: &Path, dest: &Path) -> io::Result<()> { let path = to_u16s(junction)?; unsafe { - let h = CreateFileW(path.as_ptr(), - GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - ptr::null_mut(), - OPEN_EXISTING, - FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, - ptr::null_mut()); - - let mut data = [0u8; MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; - let db = data.as_mut_ptr() - as *mut REPARSE_MOUNTPOINT_DATA_BUFFER; + let h = CreateFileW( + path.as_ptr(), + GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + ptr::null_mut(), + OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, + ptr::null_mut(), + ); + + let mut data = [0u8; MAXIMUM_REPARSE_DATA_BUFFER_SIZE as usize]; + let db = data.as_mut_ptr() as *mut REPARSE_MOUNTPOINT_DATA_BUFFER; let buf = &mut (*db).ReparseTarget as *mut u16; let mut i = 0; // FIXME: this conversion is very hacky @@ -232,23 +192,21 @@ pub fn symlink_dir(config: &Config, src: &Path, dest: &Path) -> io::Result<()> { (*db).ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; (*db).ReparseTargetMaximumLength = (i * 2) as WORD; (*db).ReparseTargetLength = ((i - 1) * 2) as WORD; - (*db).ReparseDataLength = - (*db).ReparseTargetLength as DWORD + 12; + (*db).ReparseDataLength = (*db).ReparseTargetLength as DWORD + 12; let mut ret = 0; - let res = DeviceIoControl(h as *mut _, - FSCTL_SET_REPARSE_POINT, - data.as_ptr() as *mut _, - (*db).ReparseDataLength + 8, - ptr::null_mut(), 0, - &mut ret, - ptr::null_mut()); - - let out = if res == 0 { - Err(io::Error::last_os_error()) - } else { - Ok(()) - }; + let res = DeviceIoControl( + h as *mut _, + FSCTL_SET_REPARSE_POINT, + data.as_ptr() as *mut _, + (*db).ReparseDataLength + 8, + ptr::null_mut(), + 0, + &mut ret, + ptr::null_mut(), + ); + + let out = if res == 0 { Err(io::Error::last_os_error()) } else { Ok(()) }; CloseHandle(h); out } @@ -270,9 +228,9 @@ pub enum CiEnv { impl CiEnv { /// Obtains the current CI environment. pub fn current() -> CiEnv { - if env::var("TF_BUILD").ok().map_or(false, |e| &*e == "True") { + if env::var("TF_BUILD").map_or(false, |e| e == "True") { CiEnv::AzurePipelines - } else if env::var("GITHUB_ACTIONS").ok().map_or(false, |e| &*e == "true") { + } else if env::var("GITHUB_ACTIONS").map_or(false, |e| e == "true") { CiEnv::GitHubActions } else { CiEnv::None @@ -299,8 +257,11 @@ pub fn forcing_clang_based_tests() -> bool { "0" | "no" | "off" => false, other => { // Let's make sure typos don't go unnoticed - panic!("Unrecognized option '{}' set in \ - RUSTBUILD_FORCE_CLANG_BASED_TESTS", other) + panic!( + "Unrecognized option '{}' set in \ + RUSTBUILD_FORCE_CLANG_BASED_TESTS", + other + ) } } } else { @@ -311,11 +272,9 @@ pub fn forcing_clang_based_tests() -> bool { pub fn use_host_linker(target: &Interned) -> bool { // FIXME: this information should be gotten by checking the linker flavor // of the rustc target - !( - target.contains("emscripten") || - target.contains("wasm32") || - target.contains("nvptx") || - target.contains("fortanix") || - target.contains("fuchsia") - ) + !(target.contains("emscripten") + || target.contains("wasm32") + || target.contains("nvptx") + || target.contains("fortanix") + || target.contains("fuchsia")) } diff --git a/src/build_helper/lib.rs b/src/build_helper/lib.rs index bb94fb2b75..43c3c5773c 100644 --- a/src/build_helper/lib.rs +++ b/src/build_helper/lib.rs @@ -1,9 +1,7 @@ -use std::fs::File; use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::time::{SystemTime, UNIX_EPOCH}; use std::{env, fs}; -use std::thread; /// A helper macro to `unwrap` a result except also print out details like: /// @@ -64,10 +62,7 @@ pub fn run(cmd: &mut Command) { pub fn try_run(cmd: &mut Command) -> bool { let status = match cmd.status() { Ok(status) => status, - Err(e) => fail(&format!( - "failed to execute command: {:?}\nerror: {}", - cmd, e - )), + Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), }; if !status.success() { println!( @@ -88,10 +83,7 @@ pub fn run_suppressed(cmd: &mut Command) { pub fn try_run_suppressed(cmd: &mut Command) -> bool { let output = match cmd.output() { Ok(status) => status, - Err(e) => fail(&format!( - "failed to execute command: {:?}\nerror: {}", - cmd, e - )), + Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), }; if !output.status.success() { println!( @@ -119,8 +111,10 @@ pub fn gnu_target(target: &str) -> &str { } pub fn make(host: &str) -> PathBuf { - if host.contains("dragonfly") || host.contains("freebsd") - || host.contains("netbsd") || host.contains("openbsd") + if host.contains("dragonfly") + || host.contains("freebsd") + || host.contains("netbsd") + || host.contains("openbsd") { PathBuf::from("gmake") } else { @@ -131,10 +125,7 @@ pub fn make(host: &str) -> PathBuf { pub fn output(cmd: &mut Command) -> String { let output = match cmd.stderr(Stdio::inherit()).output() { Ok(status) => status, - Err(e) => fail(&format!( - "failed to execute command: {:?}\nerror: {}", - cmd, e - )), + Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), }; if !output.status.success() { panic!( @@ -147,7 +138,8 @@ pub fn output(cmd: &mut Command) -> String { } pub fn rerun_if_changed_anything_in_dir(dir: &Path) { - let mut stack = dir.read_dir() + let mut stack = dir + .read_dir() .unwrap() .map(|e| e.unwrap()) .filter(|e| &*e.file_name() != ".git") @@ -164,9 +156,7 @@ pub fn rerun_if_changed_anything_in_dir(dir: &Path) { /// Returns the last-modified time for `path`, or zero if it doesn't exist. pub fn mtime(path: &Path) -> SystemTime { - fs::metadata(path) - .and_then(|f| f.modified()) - .unwrap_or(UNIX_EPOCH) + fs::metadata(path).and_then(|f| f.modified()).unwrap_or(UNIX_EPOCH) } /// Returns `true` if `dst` is up to date given that the file or files in `src` @@ -189,123 +179,6 @@ pub fn up_to_date(src: &Path, dst: &Path) -> bool { } } -#[must_use] -pub struct NativeLibBoilerplate { - pub src_dir: PathBuf, - pub out_dir: PathBuf, -} - -impl NativeLibBoilerplate { - /// On macOS we don't want to ship the exact filename that compiler-rt builds. - /// This conflicts with the system and ours is likely a wildly different - /// version, so they can't be substituted. - /// - /// As a result, we rename it here but we need to also use - /// `install_name_tool` on macOS to rename the commands listed inside of it to - /// ensure it's linked against correctly. - pub fn fixup_sanitizer_lib_name(&self, sanitizer_name: &str) { - if env::var("TARGET").unwrap() != "x86_64-apple-darwin" { - return - } - - let dir = self.out_dir.join("build/lib/darwin"); - let name = format!("clang_rt.{}_osx_dynamic", sanitizer_name); - let src = dir.join(&format!("lib{}.dylib", name)); - let new_name = format!("lib__rustc__{}.dylib", name); - let dst = dir.join(&new_name); - - println!("{} => {}", src.display(), dst.display()); - fs::rename(&src, &dst).unwrap(); - let status = Command::new("install_name_tool") - .arg("-id") - .arg(format!("@rpath/{}", new_name)) - .arg(&dst) - .status() - .expect("failed to execute `install_name_tool`"); - assert!(status.success()); - } -} - -impl Drop for NativeLibBoilerplate { - fn drop(&mut self) { - if !thread::panicking() { - t!(File::create(self.out_dir.join("rustbuild.timestamp"))); - } - } -} - -// Perform standard preparations for native libraries that are build only once for all stages. -// Emit rerun-if-changed and linking attributes for Cargo, check if any source files are -// updated, calculate paths used later in actual build with CMake/make or C/C++ compiler. -// If Err is returned, then everything is up-to-date and further build actions can be skipped. -// Timestamps are created automatically when the result of `native_lib_boilerplate` goes out -// of scope, so all the build actions should be completed until then. -pub fn native_lib_boilerplate( - src_dir: &Path, - out_name: &str, - link_name: &str, - search_subdir: &str, -) -> Result { - rerun_if_changed_anything_in_dir(src_dir); - - let out_dir = env::var_os("RUSTBUILD_NATIVE_DIR").unwrap_or_else(|| - env::var_os("OUT_DIR").unwrap()); - let out_dir = PathBuf::from(out_dir).join(out_name); - t!(fs::create_dir_all(&out_dir)); - if link_name.contains('=') { - println!("cargo:rustc-link-lib={}", link_name); - } else { - println!("cargo:rustc-link-lib=static={}", link_name); - } - println!( - "cargo:rustc-link-search=native={}", - out_dir.join(search_subdir).display() - ); - - let timestamp = out_dir.join("rustbuild.timestamp"); - if !up_to_date(Path::new("build.rs"), ×tamp) || !up_to_date(src_dir, ×tamp) { - Ok(NativeLibBoilerplate { - src_dir: src_dir.to_path_buf(), - out_dir, - }) - } else { - Err(()) - } -} - -pub fn sanitizer_lib_boilerplate(sanitizer_name: &str) - -> Result<(NativeLibBoilerplate, String), ()> -{ - let (link_name, search_path, apple) = match &*env::var("TARGET").unwrap() { - "x86_64-unknown-linux-gnu" => ( - format!("clang_rt.{}-x86_64", sanitizer_name), - "build/lib/linux", - false, - ), - "x86_64-apple-darwin" => ( - format!("clang_rt.{}_osx_dynamic", sanitizer_name), - "build/lib/darwin", - true, - ), - _ => return Err(()), - }; - let to_link = if apple { - format!("dylib=__rustc__{}", link_name) - } else { - format!("static={}", link_name) - }; - // This env var is provided by rustbuild to tell us where `compiler-rt` - // lives. - let dir = env::var_os("RUST_COMPILER_RT_ROOT").unwrap(); - let lib = native_lib_boilerplate( - dir.as_ref(), - sanitizer_name, - &to_link, - search_path, - )?; - Ok((lib, link_name)) -} - fn dir_up_to_date(src: &Path, threshold: SystemTime) -> bool { t!(fs::read_dir(src)).map(|e| t!(e)).all(|e| { let meta = t!(e.metadata()); diff --git a/src/ci/azure-pipelines/auto.yml b/src/ci/azure-pipelines/auto.yml index 5248e41725..74b7469ea2 100644 --- a/src/ci/azure-pipelines/auto.yml +++ b/src/ci/azure-pipelines/auto.yml @@ -63,7 +63,7 @@ jobs: - job: macOS timeoutInMinutes: 600 pool: - vmImage: macos-10.13 + vmImage: macos-10.15 steps: - template: steps/run.yml strategy: @@ -85,7 +85,7 @@ jobs: dist-x86_64-apple: SCRIPT: ./x.py dist - RUST_CONFIGURE_ARGS: --target=aarch64-apple-ios,armv7-apple-ios,armv7s-apple-ios,i386-apple-ios,x86_64-apple-ios --enable-full-tools --enable-sanitizers --enable-profiler --set rust.jemalloc + RUST_CONFIGURE_ARGS: --target=aarch64-apple-ios,x86_64-apple-ios --enable-full-tools --enable-sanitizers --enable-profiler --set rust.jemalloc RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 MACOSX_DEPLOYMENT_TARGET: 10.7 NO_LLVM_ASSERTIONS: 1 @@ -100,25 +100,6 @@ jobs: NO_LLVM_ASSERTIONS: 1 NO_DEBUG_ASSERTIONS: 1 - i686-apple: - SCRIPT: ./x.py test - RUST_CONFIGURE_ARGS: --build=i686-apple-darwin --set rust.jemalloc - RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 - MACOSX_DEPLOYMENT_TARGET: 10.8 - MACOSX_STD_DEPLOYMENT_TARGET: 10.7 - NO_LLVM_ASSERTIONS: 1 - NO_DEBUG_ASSERTIONS: 1 - - dist-i686-apple: - SCRIPT: ./x.py dist - RUST_CONFIGURE_ARGS: --build=i686-apple-darwin --enable-full-tools --enable-profiler --set rust.jemalloc - RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 - MACOSX_DEPLOYMENT_TARGET: 10.7 - NO_LLVM_ASSERTIONS: 1 - NO_DEBUG_ASSERTIONS: 1 - DIST_REQUIRE_ALL_TOOLS: 1 - - - job: Windows timeoutInMinutes: 600 diff --git a/src/ci/azure-pipelines/steps/run.yml b/src/ci/azure-pipelines/steps/run.yml index c39f75aba8..ee9425aa1c 100644 --- a/src/ci/azure-pipelines/steps/run.yml +++ b/src/ci/azure-pipelines/steps/run.yml @@ -51,10 +51,6 @@ steps: displayName: Install clang condition: and(succeeded(), not(variables.SKIP_JOB)) -- bash: src/ci/scripts/switch-xcode.sh - displayName: Switch to Xcode 9.3 - condition: and(succeeded(), not(variables.SKIP_JOB)) - - bash: src/ci/scripts/install-wix.sh displayName: Install wix condition: and(succeeded(), not(variables.SKIP_JOB)) diff --git a/src/ci/azure-pipelines/try.yml b/src/ci/azure-pipelines/try.yml index b6177b2cc9..f8ddf0eb46 100644 --- a/src/ci/azure-pipelines/try.yml +++ b/src/ci/azure-pipelines/try.yml @@ -25,7 +25,7 @@ jobs: # - job: macOS # timeoutInMinutes: 600 # pool: -# vmImage: macos-10.13 +# vmImage: macos-10.15 # steps: # - template: steps/run.yml # strategy: diff --git a/src/ci/docker/dist-various-1/Dockerfile b/src/ci/docker/dist-various-1/Dockerfile index 6bbf092878..2a68a25be2 100644 --- a/src/ci/docker/dist-various-1/Dockerfile +++ b/src/ci/docker/dist-various-1/Dockerfile @@ -2,11 +2,24 @@ FROM ubuntu:16.04 RUN apt-get update && apt-get install -y --no-install-recommends \ g++ \ + automake \ + bison \ + bzip2 \ + flex \ + help2man \ + libtool-bin \ + texinfo \ + unzip \ + wget \ + xz-utils \ + libncurses-dev \ + gawk \ make \ file \ curl \ ca-certificates \ python2.7 \ + python3 \ git \ cmake \ sudo \ @@ -35,6 +48,18 @@ RUN add-apt-repository ppa:team-gcc-arm-embedded/ppa && \ apt-get update && \ apt-get install -y --no-install-recommends gcc-arm-embedded +COPY scripts/rustbuild-setup.sh dist-various-1/build-riscv-toolchain.sh dist-various-1/riscv64-unknown-linux-gnu.config dist-various-1/crosstool-ng.sh /build/ +RUN ./crosstool-ng.sh + +# Crosstool-ng will refuse to build as root +RUN sh ./rustbuild-setup.sh +USER rustbuild + +RUN ./build-riscv-toolchain.sh + +USER root +ENV PATH=/x-tools/riscv64-unknown-linux-gnu/bin:$PATH + COPY dist-various-1/build-rumprun.sh /build RUN ./build-rumprun.sh @@ -129,11 +154,13 @@ ENV TARGETS=$TARGETS,riscv32imc-unknown-none-elf ENV TARGETS=$TARGETS,riscv32imac-unknown-none-elf ENV TARGETS=$TARGETS,riscv64imac-unknown-none-elf ENV TARGETS=$TARGETS,riscv64gc-unknown-none-elf +ENV TARGETS=$TARGETS,riscv64gc-unknown-linux-gnu ENV TARGETS=$TARGETS,armebv7r-none-eabi ENV TARGETS=$TARGETS,armebv7r-none-eabihf ENV TARGETS=$TARGETS,armv7r-none-eabi ENV TARGETS=$TARGETS,armv7r-none-eabihf ENV TARGETS=$TARGETS,thumbv7neon-unknown-linux-gnueabihf +ENV TARGETS=$TARGETS,armv7a-none-eabi # riscv targets currently do not need a C compiler, as compiler_builtins # doesn't currently have it enabled, and the riscv gcc compiler is not @@ -147,6 +174,13 @@ ENV CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \ CC_thumbv7neon_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc \ AR_thumbv7neon_unknown_linux_gnueabihf=arm-linux-gnueabihf-ar \ CXX_thumbv7neon_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++ \ + CC_armv7a_none_eabi=arm-none-eabi-gcc \ + CC_armv7a_none_eabihf=arm-none-eabi-gcc \ + CFLAGS_armv7a_none_eabi=-march=armv7-a \ + CFLAGS_armv7a_none_eabihf=-march=armv7-a+vfpv3 \ + CC_riscv64gc_unknown_linux_gnu=riscv64-unknown-linux-gnu-gcc \ + AR_riscv64gc_unknown_linux_gnu=riscv64-unknown-linux-gnu-ar \ + CXX_riscv64gc_unknown_linux_gnu=riscv64-unknown-linux-gnu-g++ \ CC_riscv32i_unknown_none_elf=false \ CC_riscv32imc_unknown_none_elf=false \ CC_riscv32imac_unknown_none_elf=false \ diff --git a/src/ci/docker/dist-various-1/build-riscv-toolchain.sh b/src/ci/docker/dist-various-1/build-riscv-toolchain.sh new file mode 100755 index 0000000000..9cb5700b3b --- /dev/null +++ b/src/ci/docker/dist-various-1/build-riscv-toolchain.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +set -ex + +hide_output() { + set +x + on_err=" +echo ERROR: An error was encountered with the build. +cat /tmp/build.log +exit 1 +" + trap "$on_err" ERR + bash -c "while true; do sleep 30; echo \$(date) - building ...; done" & + PING_LOOP_PID=$! + $@ &> /tmp/build.log + rm /tmp/build.log + trap - ERR + kill $PING_LOOP_PID + set -x +} + +mkdir -p /tmp/build-riscv +cp riscv64-unknown-linux-gnu.config /tmp/build-riscv/.config +cd /tmp/build-riscv +hide_output ct-ng build +cd .. +rm -rf build-riscv diff --git a/src/ci/docker/dist-various-1/crosstool-ng.sh b/src/ci/docker/dist-various-1/crosstool-ng.sh new file mode 100755 index 0000000000..b01fdd0bf6 --- /dev/null +++ b/src/ci/docker/dist-various-1/crosstool-ng.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -ex + +# Mirrored from https://github.com/crosstool-ng/crosstool-ng/archive/crosstool-ng-1.24.0.tar.gz +url="https://ci-mirrors.rust-lang.org/rustc/crosstool-ng-1.24.0.tar.gz" +curl -Lf $url | tar xzf - +cd crosstool-ng-crosstool-ng-1.24.0 +./bootstrap +./configure --prefix=/usr/local +make -j$(nproc) +make install +cd .. +rm -rf crosstool-ng-crosstool-ng-1.24.0 diff --git a/src/ci/docker/dist-various-1/riscv64-unknown-linux-gnu.config b/src/ci/docker/dist-various-1/riscv64-unknown-linux-gnu.config new file mode 100644 index 0000000000..dd06065b19 --- /dev/null +++ b/src/ci/docker/dist-various-1/riscv64-unknown-linux-gnu.config @@ -0,0 +1,908 @@ +# +# Automatically generated file; DO NOT EDIT. +# crosstool-NG Configuration +# +CT_CONFIGURE_has_static_link=y +CT_CONFIGURE_has_cxx11=y +CT_CONFIGURE_has_wget=y +CT_CONFIGURE_has_curl=y +CT_CONFIGURE_has_make_3_81_or_newer=y +CT_CONFIGURE_has_make_4_0_or_newer=y +CT_CONFIGURE_has_libtool_2_4_or_newer=y +CT_CONFIGURE_has_libtoolize_2_4_or_newer=y +CT_CONFIGURE_has_autoconf_2_65_or_newer=y +CT_CONFIGURE_has_autoreconf_2_65_or_newer=y +CT_CONFIGURE_has_automake_1_15_or_newer=y +CT_CONFIGURE_has_gnu_m4_1_4_12_or_newer=y +CT_CONFIGURE_has_python_3_4_or_newer=y +CT_CONFIGURE_has_bison_2_7_or_newer=y +CT_CONFIGURE_has_python=y +CT_CONFIGURE_has_dtc=y +CT_CONFIGURE_has_svn=y +CT_CONFIGURE_has_git=y +CT_CONFIGURE_has_md5sum=y +CT_CONFIGURE_has_sha1sum=y +CT_CONFIGURE_has_sha256sum=y +CT_CONFIGURE_has_sha512sum=y +CT_CONFIGURE_has_install_with_strip_program=y +CT_CONFIG_VERSION_CURRENT="3" +CT_CONFIG_VERSION="3" +CT_MODULES=y + +# +# Paths and misc options +# + +# +# crosstool-NG behavior +# +# CT_OBSOLETE is not set +CT_EXPERIMENTAL=y +# CT_ALLOW_BUILD_AS_ROOT is not set +# CT_DEBUG_CT is not set + +# +# Paths +# +CT_LOCAL_TARBALLS_DIR="${HOME}/src" +CT_SAVE_TARBALLS=y +# CT_TARBALLS_BUILDROOT_LAYOUT is not set +CT_WORK_DIR="${CT_TOP_DIR}/.build" +CT_BUILD_TOP_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/.build}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}" +CT_PREFIX_DIR="/x-tools/${CT_TARGET}" +CT_RM_RF_PREFIX_DIR=y +CT_REMOVE_DOCS=y +CT_INSTALL_LICENSES=y +CT_PREFIX_DIR_RO=y +CT_STRIP_HOST_TOOLCHAIN_EXECUTABLES=y +# CT_STRIP_TARGET_TOOLCHAIN_EXECUTABLES is not set + +# +# Downloading +# +CT_DOWNLOAD_AGENT_WGET=y +# CT_DOWNLOAD_AGENT_CURL is not set +# CT_DOWNLOAD_AGENT_NONE is not set +# CT_FORBID_DOWNLOAD is not set +# CT_FORCE_DOWNLOAD is not set +CT_CONNECT_TIMEOUT=10 +CT_DOWNLOAD_WGET_OPTIONS="--passive-ftp --tries=3 -nc --progress=dot:binary" +# CT_ONLY_DOWNLOAD is not set +# CT_USE_MIRROR is not set +CT_VERIFY_DOWNLOAD_DIGEST=y +CT_VERIFY_DOWNLOAD_DIGEST_SHA512=y +# CT_VERIFY_DOWNLOAD_DIGEST_SHA256 is not set +# CT_VERIFY_DOWNLOAD_DIGEST_SHA1 is not set +# CT_VERIFY_DOWNLOAD_DIGEST_MD5 is not set +CT_VERIFY_DOWNLOAD_DIGEST_ALG="sha512" +# CT_VERIFY_DOWNLOAD_SIGNATURE is not set + +# +# Extracting +# +# CT_FORCE_EXTRACT is not set +CT_OVERRIDE_CONFIG_GUESS_SUB=y +# CT_ONLY_EXTRACT is not set +CT_PATCH_BUNDLED=y +# CT_PATCH_LOCAL is not set +# CT_PATCH_BUNDLED_LOCAL is not set +# CT_PATCH_LOCAL_BUNDLED is not set +# CT_PATCH_NONE is not set +CT_PATCH_ORDER="bundled" + +# +# Build behavior +# +CT_PARALLEL_JOBS=0 +CT_LOAD="" +CT_USE_PIPES=y +CT_EXTRA_CFLAGS_FOR_BUILD="" +CT_EXTRA_LDFLAGS_FOR_BUILD="" +CT_EXTRA_CFLAGS_FOR_HOST="" +CT_EXTRA_LDFLAGS_FOR_HOST="" +# CT_CONFIG_SHELL_SH is not set +# CT_CONFIG_SHELL_ASH is not set +CT_CONFIG_SHELL_BASH=y +# CT_CONFIG_SHELL_CUSTOM is not set +CT_CONFIG_SHELL="${bash}" + +# +# Logging +# +# CT_LOG_ERROR is not set +# CT_LOG_WARN is not set +# CT_LOG_INFO is not set +# CT_LOG_EXTRA is not set +CT_LOG_ALL=y +# CT_LOG_DEBUG is not set +CT_LOG_LEVEL_MAX="ALL" +# CT_LOG_SEE_TOOLS_WARN is not set +CT_LOG_TO_FILE=y +CT_LOG_FILE_COMPRESS=y + +# +# Target options +# +# CT_ARCH_ALPHA is not set +# CT_ARCH_ARC is not set +# CT_ARCH_ARM is not set +# CT_ARCH_AVR is not set +# CT_ARCH_M68K is not set +# CT_ARCH_MICROBLAZE is not set +# CT_ARCH_MIPS is not set +# CT_ARCH_MOXIE is not set +# CT_ARCH_MSP430 is not set +# CT_ARCH_NIOS2 is not set +# CT_ARCH_POWERPC is not set +CT_ARCH_RISCV=y +# CT_ARCH_S390 is not set +# CT_ARCH_SH is not set +# CT_ARCH_SPARC is not set +# CT_ARCH_X86 is not set +# CT_ARCH_XTENSA is not set +CT_ARCH="riscv" +CT_ARCH_CHOICE_KSYM="RISCV" +CT_ARCH_TUNE="" +CT_ARCH_RISCV_SHOW=y + +# +# Options for riscv +# +CT_ARCH_RISCV_PKG_KSYM="" +CT_ALL_ARCH_CHOICES="ALPHA ARC ARM AVR M68K MICROBLAZE MIPS MOXIE MSP430 NIOS2 POWERPC RISCV S390 SH SPARC X86 XTENSA" +CT_ARCH_SUFFIX="" +# CT_OMIT_TARGET_VENDOR is not set + +# +# Generic target options +# +# CT_MULTILIB is not set +# CT_DEMULTILIB is not set +CT_ARCH_SUPPORTS_BOTH_MMU=y +CT_ARCH_USE_MMU=y +CT_ARCH_SUPPORTS_32=y +CT_ARCH_SUPPORTS_64=y +CT_ARCH_DEFAULT_32=y +CT_ARCH_BITNESS=64 +# CT_ARCH_32 is not set +CT_ARCH_64=y + +# +# Target optimisations +# +CT_ARCH_SUPPORTS_WITH_ARCH=y +CT_ARCH_SUPPORTS_WITH_ABI=y +CT_ARCH_SUPPORTS_WITH_TUNE=y +CT_ARCH_ARCH="rv64gc" +CT_ARCH_ABI="" +CT_TARGET_CFLAGS="" +CT_TARGET_LDFLAGS="" + +# +# Toolchain options +# + +# +# General toolchain options +# +CT_FORCE_SYSROOT=y +CT_USE_SYSROOT=y +CT_SYSROOT_NAME="sysroot" +CT_SYSROOT_DIR_PREFIX="" +CT_WANTS_STATIC_LINK=y +CT_WANTS_STATIC_LINK_CXX=y +# CT_STATIC_TOOLCHAIN is not set +CT_SHOW_CT_VERSION=y +CT_TOOLCHAIN_PKGVERSION="" +CT_TOOLCHAIN_BUGURL="" + +# +# Tuple completion and aliasing +# +CT_TARGET_VENDOR="unknown" +CT_TARGET_ALIAS_SED_EXPR="" +CT_TARGET_ALIAS="" + +# +# Toolchain type +# +# CT_NATIVE is not set +CT_CROSS=y +# CT_CROSS_NATIVE is not set +# CT_CANADIAN is not set +CT_TOOLCHAIN_TYPE="cross" + +# +# Build system +# +CT_BUILD="" +CT_BUILD_PREFIX="" +CT_BUILD_SUFFIX="" + +# +# Misc options +# +# CT_TOOLCHAIN_ENABLE_NLS is not set + +# +# Operating System +# +CT_KERNEL_SUPPORTS_SHARED_LIBS=y +# CT_KERNEL_BARE_METAL is not set +CT_KERNEL_LINUX=y +CT_KERNEL="linux" +CT_KERNEL_CHOICE_KSYM="LINUX" +CT_KERNEL_LINUX_SHOW=y + +# +# Options for linux +# +CT_KERNEL_LINUX_PKG_KSYM="LINUX" +CT_LINUX_DIR_NAME="linux" +CT_LINUX_PKG_NAME="linux" +CT_LINUX_SRC_RELEASE=y +# CT_LINUX_SRC_DEVEL is not set +# CT_LINUX_SRC_CUSTOM is not set +CT_LINUX_PATCH_GLOBAL=y +# CT_LINUX_PATCH_BUNDLED is not set +# CT_LINUX_PATCH_LOCAL is not set +# CT_LINUX_PATCH_BUNDLED_LOCAL is not set +# CT_LINUX_PATCH_LOCAL_BUNDLED is not set +# CT_LINUX_PATCH_NONE is not set +CT_LINUX_PATCH_ORDER="global" +CT_LINUX_V_4_20=y +# CT_LINUX_V_4_19 is not set +# CT_LINUX_V_4_18 is not set +# CT_LINUX_V_4_17 is not set +# CT_LINUX_V_4_16 is not set +# CT_LINUX_V_4_15 is not set +# CT_LINUX_V_4_14 is not set +# CT_LINUX_V_4_13 is not set +# CT_LINUX_V_4_12 is not set +# CT_LINUX_V_4_11 is not set +# CT_LINUX_V_4_10 is not set +# CT_LINUX_V_4_9 is not set +# CT_LINUX_V_4_4 is not set +# CT_LINUX_V_4_1 is not set +# CT_LINUX_V_3_16 is not set +# CT_LINUX_V_3_13 is not set +# CT_LINUX_V_3_12 is not set +# CT_LINUX_V_3_10 is not set +# CT_LINUX_V_3_4 is not set +# CT_LINUX_V_3_2 is not set +# CT_LINUX_NO_VERSIONS is not set +CT_LINUX_VERSION="4.20.8" +CT_LINUX_MIRRORS="$(CT_Mirrors kernel.org linux ${CT_LINUX_VERSION})" +CT_LINUX_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_LINUX_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_LINUX_ARCHIVE_FORMATS=".tar.xz .tar.gz" +CT_LINUX_SIGNATURE_FORMAT="unpacked/.sign" +CT_LINUX_later_than_4_8=y +CT_LINUX_4_8_or_later=y +CT_LINUX_later_than_3_7=y +CT_LINUX_3_7_or_later=y +CT_LINUX_later_than_3_2=y +CT_LINUX_3_2_or_later=y +CT_LINUX_REQUIRE_3_2_or_later=y +CT_KERNEL_LINUX_VERBOSITY_0=y +# CT_KERNEL_LINUX_VERBOSITY_1 is not set +# CT_KERNEL_LINUX_VERBOSITY_2 is not set +CT_KERNEL_LINUX_VERBOSE_LEVEL=0 +CT_KERNEL_LINUX_INSTALL_CHECK=y +CT_ALL_KERNEL_CHOICES="BARE_METAL LINUX WINDOWS" + +# +# Common kernel options +# +CT_SHARED_LIBS=y + +# +# Binary utilities +# +CT_ARCH_BINFMT_ELF=y +CT_BINUTILS_BINUTILS=y +CT_BINUTILS="binutils" +CT_BINUTILS_CHOICE_KSYM="BINUTILS" +CT_BINUTILS_BINUTILS_SHOW=y + +# +# Options for binutils +# +CT_BINUTILS_BINUTILS_PKG_KSYM="BINUTILS" +CT_BINUTILS_DIR_NAME="binutils" +CT_BINUTILS_USE_GNU=y +CT_BINUTILS_USE="BINUTILS" +CT_BINUTILS_PKG_NAME="binutils" +CT_BINUTILS_SRC_RELEASE=y +# CT_BINUTILS_SRC_DEVEL is not set +# CT_BINUTILS_SRC_CUSTOM is not set +CT_BINUTILS_PATCH_GLOBAL=y +# CT_BINUTILS_PATCH_BUNDLED is not set +# CT_BINUTILS_PATCH_LOCAL is not set +# CT_BINUTILS_PATCH_BUNDLED_LOCAL is not set +# CT_BINUTILS_PATCH_LOCAL_BUNDLED is not set +# CT_BINUTILS_PATCH_NONE is not set +CT_BINUTILS_PATCH_ORDER="global" +CT_BINUTILS_V_2_32=y +# CT_BINUTILS_V_2_31 is not set +# CT_BINUTILS_V_2_30 is not set +# CT_BINUTILS_V_2_29 is not set +# CT_BINUTILS_V_2_28 is not set +# CT_BINUTILS_V_2_27 is not set +# CT_BINUTILS_V_2_26 is not set +# CT_BINUTILS_NO_VERSIONS is not set +CT_BINUTILS_VERSION="2.32" +CT_BINUTILS_MIRRORS="$(CT_Mirrors GNU binutils) $(CT_Mirrors sourceware binutils/releases)" +CT_BINUTILS_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_BINUTILS_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_BINUTILS_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" +CT_BINUTILS_SIGNATURE_FORMAT="packed/.sig" +CT_BINUTILS_later_than_2_30=y +CT_BINUTILS_2_30_or_later=y +CT_BINUTILS_later_than_2_27=y +CT_BINUTILS_2_27_or_later=y +CT_BINUTILS_later_than_2_25=y +CT_BINUTILS_2_25_or_later=y +CT_BINUTILS_REQUIRE_2_25_or_later=y +CT_BINUTILS_later_than_2_23=y +CT_BINUTILS_2_23_or_later=y + +# +# GNU binutils +# +CT_BINUTILS_HAS_HASH_STYLE=y +CT_BINUTILS_HAS_GOLD=y +CT_BINUTILS_HAS_PLUGINS=y +CT_BINUTILS_HAS_PKGVERSION_BUGURL=y +CT_BINUTILS_FORCE_LD_BFD_DEFAULT=y +CT_BINUTILS_LINKER_LD=y +CT_BINUTILS_LINKERS_LIST="ld" +CT_BINUTILS_LINKER_DEFAULT="bfd" +# CT_BINUTILS_PLUGINS is not set +CT_BINUTILS_RELRO=m +CT_BINUTILS_EXTRA_CONFIG_ARRAY="" +# CT_BINUTILS_FOR_TARGET is not set +CT_ALL_BINUTILS_CHOICES="BINUTILS" + +# +# C-library +# +CT_LIBC_GLIBC=y +# CT_LIBC_MUSL is not set +# CT_LIBC_UCLIBC is not set +CT_LIBC="glibc" +CT_LIBC_CHOICE_KSYM="GLIBC" +CT_THREADS="nptl" +CT_LIBC_GLIBC_SHOW=y + +# +# Options for glibc +# +CT_LIBC_GLIBC_PKG_KSYM="GLIBC" +CT_GLIBC_DIR_NAME="glibc" +CT_GLIBC_USE_GNU=y +CT_GLIBC_USE="GLIBC" +CT_GLIBC_PKG_NAME="glibc" +CT_GLIBC_SRC_RELEASE=y +# CT_GLIBC_SRC_DEVEL is not set +# CT_GLIBC_SRC_CUSTOM is not set +CT_GLIBC_PATCH_GLOBAL=y +# CT_GLIBC_PATCH_BUNDLED is not set +# CT_GLIBC_PATCH_LOCAL is not set +# CT_GLIBC_PATCH_BUNDLED_LOCAL is not set +# CT_GLIBC_PATCH_LOCAL_BUNDLED is not set +# CT_GLIBC_PATCH_NONE is not set +CT_GLIBC_PATCH_ORDER="global" +CT_GLIBC_V_2_29=y +# CT_GLIBC_NO_VERSIONS is not set +CT_GLIBC_VERSION="2.29" +CT_GLIBC_MIRRORS="$(CT_Mirrors GNU glibc)" +CT_GLIBC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_GLIBC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_GLIBC_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" +CT_GLIBC_SIGNATURE_FORMAT="packed/.sig" +CT_GLIBC_2_29_or_later=y +CT_GLIBC_2_29_or_older=y +CT_GLIBC_REQUIRE_2_29_or_later=y +CT_GLIBC_later_than_2_27=y +CT_GLIBC_2_27_or_later=y +CT_GLIBC_later_than_2_26=y +CT_GLIBC_2_26_or_later=y +CT_GLIBC_later_than_2_25=y +CT_GLIBC_2_25_or_later=y +CT_GLIBC_later_than_2_24=y +CT_GLIBC_2_24_or_later=y +CT_GLIBC_later_than_2_23=y +CT_GLIBC_2_23_or_later=y +CT_GLIBC_later_than_2_20=y +CT_GLIBC_2_20_or_later=y +CT_GLIBC_later_than_2_17=y +CT_GLIBC_2_17_or_later=y +CT_GLIBC_later_than_2_14=y +CT_GLIBC_2_14_or_later=y +CT_GLIBC_DEP_KERNEL_HEADERS_VERSION=y +CT_GLIBC_DEP_BINUTILS=y +CT_GLIBC_DEP_GCC=y +CT_GLIBC_DEP_PYTHON=y +CT_GLIBC_BUILD_SSP=y +CT_GLIBC_HAS_LIBIDN_ADDON=y +# CT_GLIBC_USE_LIBIDN_ADDON is not set +CT_GLIBC_NO_SPARC_V8=y +CT_GLIBC_HAS_OBSOLETE_RPC=y +CT_GLIBC_EXTRA_CONFIG_ARRAY="" +CT_GLIBC_CONFIGPARMS="" +CT_GLIBC_EXTRA_CFLAGS="" +CT_GLIBC_ENABLE_OBSOLETE_RPC=y +# CT_GLIBC_ENABLE_FORTIFIED_BUILD is not set +# CT_GLIBC_DISABLE_VERSIONING is not set +CT_GLIBC_OLDEST_ABI="" +CT_GLIBC_FORCE_UNWIND=y +# CT_GLIBC_LOCALES is not set +CT_GLIBC_KERNEL_VERSION_NONE=y +# CT_GLIBC_KERNEL_VERSION_AS_HEADERS is not set +# CT_GLIBC_KERNEL_VERSION_CHOSEN is not set +CT_GLIBC_MIN_KERNEL="" +CT_GLIBC_SSP_DEFAULT=y +# CT_GLIBC_SSP_NO is not set +# CT_GLIBC_SSP_YES is not set +# CT_GLIBC_SSP_ALL is not set +# CT_GLIBC_SSP_STRONG is not set +# CT_GLIBC_ENABLE_WERROR is not set +CT_ALL_LIBC_CHOICES="AVR_LIBC BIONIC GLIBC MINGW_W64 MOXIEBOX MUSL NEWLIB NONE UCLIBC" +CT_LIBC_SUPPORT_THREADS_ANY=y +CT_LIBC_SUPPORT_THREADS_NATIVE=y + +# +# Common C library options +# +CT_THREADS_NATIVE=y +# CT_CREATE_LDSO_CONF is not set +CT_LIBC_XLDD=y + +# +# C compiler +# +CT_CC_CORE_PASSES_NEEDED=y +CT_CC_CORE_PASS_1_NEEDED=y +CT_CC_CORE_PASS_2_NEEDED=y +CT_CC_SUPPORT_CXX=y +CT_CC_SUPPORT_FORTRAN=y +CT_CC_SUPPORT_ADA=y +CT_CC_SUPPORT_OBJC=y +CT_CC_SUPPORT_OBJCXX=y +CT_CC_SUPPORT_GOLANG=y +CT_CC_GCC=y +CT_CC="gcc" +CT_CC_CHOICE_KSYM="GCC" +CT_CC_GCC_SHOW=y + +# +# Options for gcc +# +CT_CC_GCC_PKG_KSYM="GCC" +CT_GCC_DIR_NAME="gcc" +CT_GCC_USE_GNU=y +# CT_GCC_USE_LINARO is not set +CT_GCC_USE="GCC" +CT_GCC_PKG_NAME="gcc" +CT_GCC_SRC_RELEASE=y +# CT_GCC_SRC_DEVEL is not set +# CT_GCC_SRC_CUSTOM is not set +CT_GCC_PATCH_GLOBAL=y +# CT_GCC_PATCH_BUNDLED is not set +# CT_GCC_PATCH_LOCAL is not set +# CT_GCC_PATCH_BUNDLED_LOCAL is not set +# CT_GCC_PATCH_LOCAL_BUNDLED is not set +# CT_GCC_PATCH_NONE is not set +CT_GCC_PATCH_ORDER="global" +CT_GCC_V_8=y +# CT_GCC_V_7 is not set +# CT_GCC_NO_VERSIONS is not set +CT_GCC_VERSION="8.3.0" +CT_GCC_MIRRORS="$(CT_Mirrors GNU gcc/gcc-${CT_GCC_VERSION}) $(CT_Mirrors sourceware gcc/releases/gcc-${CT_GCC_VERSION})" +CT_GCC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_GCC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_GCC_ARCHIVE_FORMATS=".tar.xz .tar.gz" +CT_GCC_SIGNATURE_FORMAT="" +CT_GCC_later_than_7=y +CT_GCC_7_or_later=y +CT_GCC_REQUIRE_7_or_later=y +CT_GCC_later_than_6=y +CT_GCC_6_or_later=y +CT_GCC_later_than_5=y +CT_GCC_5_or_later=y +CT_GCC_REQUIRE_5_or_later=y +CT_GCC_later_than_4_9=y +CT_GCC_4_9_or_later=y +CT_GCC_REQUIRE_4_9_or_later=y +CT_GCC_later_than_4_8=y +CT_GCC_4_8_or_later=y +CT_CC_GCC_HAS_LIBMPX=y +CT_CC_GCC_ENABLE_CXX_FLAGS="" +CT_CC_GCC_CORE_EXTRA_CONFIG_ARRAY="" +CT_CC_GCC_EXTRA_CONFIG_ARRAY="" +CT_CC_GCC_STATIC_LIBSTDCXX=y +# CT_CC_GCC_SYSTEM_ZLIB is not set +CT_CC_GCC_CONFIG_TLS=m + +# +# Optimisation features +# +CT_CC_GCC_USE_GRAPHITE=y +CT_CC_GCC_USE_LTO=y + +# +# Settings for libraries running on target +# +CT_CC_GCC_ENABLE_TARGET_OPTSPACE=y +# CT_CC_GCC_LIBMUDFLAP is not set +# CT_CC_GCC_LIBGOMP is not set +# CT_CC_GCC_LIBSSP is not set +# CT_CC_GCC_LIBQUADMATH is not set +# CT_CC_GCC_LIBSANITIZER is not set + +# +# Misc. obscure options. +# +CT_CC_CXA_ATEXIT=y +# CT_CC_GCC_DISABLE_PCH is not set +CT_CC_GCC_SJLJ_EXCEPTIONS=m +CT_CC_GCC_LDBL_128=m +# CT_CC_GCC_BUILD_ID is not set +CT_CC_GCC_LNK_HASH_STYLE_DEFAULT=y +# CT_CC_GCC_LNK_HASH_STYLE_SYSV is not set +# CT_CC_GCC_LNK_HASH_STYLE_GNU is not set +# CT_CC_GCC_LNK_HASH_STYLE_BOTH is not set +CT_CC_GCC_LNK_HASH_STYLE="" +CT_CC_GCC_DEC_FLOAT_AUTO=y +# CT_CC_GCC_DEC_FLOAT_BID is not set +# CT_CC_GCC_DEC_FLOAT_DPD is not set +# CT_CC_GCC_DEC_FLOATS_NO is not set +CT_ALL_CC_CHOICES="GCC" + +# +# Additional supported languages: +# +CT_CC_LANG_CXX=y +# CT_CC_LANG_FORTRAN is not set +# CT_CC_LANG_ADA is not set +# CT_CC_LANG_OBJC is not set +# CT_CC_LANG_OBJCXX is not set +# CT_CC_LANG_GOLANG is not set +CT_CC_LANG_OTHERS="" + +# +# Debug facilities +# +# CT_DEBUG_DUMA is not set +CT_DEBUG_GDB=y +CT_DEBUG_GDB_PKG_KSYM="GDB" +CT_GDB_DIR_NAME="gdb" +CT_GDB_USE_GNU=y +CT_GDB_USE="GDB" +CT_GDB_PKG_NAME="gdb" +CT_GDB_SRC_RELEASE=y +# CT_GDB_SRC_DEVEL is not set +# CT_GDB_SRC_CUSTOM is not set +CT_GDB_PATCH_GLOBAL=y +# CT_GDB_PATCH_BUNDLED is not set +# CT_GDB_PATCH_LOCAL is not set +# CT_GDB_PATCH_BUNDLED_LOCAL is not set +# CT_GDB_PATCH_LOCAL_BUNDLED is not set +# CT_GDB_PATCH_NONE is not set +CT_GDB_PATCH_ORDER="global" +CT_GDB_V_8_2=y +# CT_GDB_V_8_1 is not set +# CT_GDB_V_8_0 is not set +# CT_GDB_NO_VERSIONS is not set +CT_GDB_VERSION="8.2.1" +CT_GDB_MIRRORS="$(CT_Mirrors GNU gdb) $(CT_Mirrors sourceware gdb/releases)" +CT_GDB_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_GDB_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_GDB_ARCHIVE_FORMATS=".tar.xz .tar.gz" +CT_GDB_SIGNATURE_FORMAT="" +CT_GDB_later_than_8_0=y +CT_GDB_8_0_or_later=y +CT_GDB_REQUIRE_8_0_or_later=y +CT_GDB_later_than_7_12=y +CT_GDB_7_12_or_later=y +CT_GDB_later_than_7_2=y +CT_GDB_7_2_or_later=y +CT_GDB_later_than_7_0=y +CT_GDB_7_0_or_later=y +CT_GDB_CROSS=y +# CT_GDB_CROSS_STATIC is not set +# CT_GDB_CROSS_SIM is not set +# CT_GDB_CROSS_PYTHON is not set +CT_GDB_CROSS_EXTRA_CONFIG_ARRAY="" +# CT_GDB_NATIVE is not set +# CT_GDB_GDBSERVER is not set +CT_GDB_HAS_PKGVERSION_BUGURL=y +CT_GDB_HAS_PYTHON=y +CT_GDB_INSTALL_GDBINIT=y +CT_GDB_HAS_IPA_LIB=y +# CT_DEBUG_LTRACE is not set +# CT_DEBUG_STRACE is not set +CT_ALL_DEBUG_CHOICES="DUMA GDB LTRACE STRACE" + +# +# Companion libraries +# +# CT_COMPLIBS_CHECK is not set +# CT_COMP_LIBS_CLOOG is not set +CT_COMP_LIBS_EXPAT=y +CT_COMP_LIBS_EXPAT_PKG_KSYM="EXPAT" +CT_EXPAT_DIR_NAME="expat" +CT_EXPAT_PKG_NAME="expat" +CT_EXPAT_SRC_RELEASE=y +# CT_EXPAT_SRC_DEVEL is not set +# CT_EXPAT_SRC_CUSTOM is not set +CT_EXPAT_PATCH_GLOBAL=y +# CT_EXPAT_PATCH_BUNDLED is not set +# CT_EXPAT_PATCH_LOCAL is not set +# CT_EXPAT_PATCH_BUNDLED_LOCAL is not set +# CT_EXPAT_PATCH_LOCAL_BUNDLED is not set +# CT_EXPAT_PATCH_NONE is not set +CT_EXPAT_PATCH_ORDER="global" +CT_EXPAT_V_2_2=y +# CT_EXPAT_NO_VERSIONS is not set +CT_EXPAT_VERSION="2.2.6" +CT_EXPAT_MIRRORS="http://downloads.sourceforge.net/project/expat/expat/${CT_EXPAT_VERSION}" +CT_EXPAT_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_EXPAT_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_EXPAT_ARCHIVE_FORMATS=".tar.bz2" +CT_EXPAT_SIGNATURE_FORMAT="" +CT_COMP_LIBS_GETTEXT=y +CT_COMP_LIBS_GETTEXT_PKG_KSYM="GETTEXT" +CT_GETTEXT_DIR_NAME="gettext" +CT_GETTEXT_PKG_NAME="gettext" +CT_GETTEXT_SRC_RELEASE=y +# CT_GETTEXT_SRC_DEVEL is not set +# CT_GETTEXT_SRC_CUSTOM is not set +CT_GETTEXT_PATCH_GLOBAL=y +# CT_GETTEXT_PATCH_BUNDLED is not set +# CT_GETTEXT_PATCH_LOCAL is not set +# CT_GETTEXT_PATCH_BUNDLED_LOCAL is not set +# CT_GETTEXT_PATCH_LOCAL_BUNDLED is not set +# CT_GETTEXT_PATCH_NONE is not set +CT_GETTEXT_PATCH_ORDER="global" +CT_GETTEXT_V_0_19_8_1=y +# CT_GETTEXT_NO_VERSIONS is not set +CT_GETTEXT_VERSION="0.19.8.1" +CT_GETTEXT_MIRRORS="$(CT_Mirrors GNU gettext)" +CT_GETTEXT_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_GETTEXT_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_GETTEXT_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.gz" +CT_GETTEXT_SIGNATURE_FORMAT="packed/.sig" +CT_COMP_LIBS_GMP=y +CT_COMP_LIBS_GMP_PKG_KSYM="GMP" +CT_GMP_DIR_NAME="gmp" +CT_GMP_PKG_NAME="gmp" +CT_GMP_SRC_RELEASE=y +# CT_GMP_SRC_DEVEL is not set +# CT_GMP_SRC_CUSTOM is not set +CT_GMP_PATCH_GLOBAL=y +# CT_GMP_PATCH_BUNDLED is not set +# CT_GMP_PATCH_LOCAL is not set +# CT_GMP_PATCH_BUNDLED_LOCAL is not set +# CT_GMP_PATCH_LOCAL_BUNDLED is not set +# CT_GMP_PATCH_NONE is not set +CT_GMP_PATCH_ORDER="global" +CT_GMP_V_6_1=y +# CT_GMP_NO_VERSIONS is not set +CT_GMP_VERSION="6.1.2" +CT_GMP_MIRRORS="https://gmplib.org/download/gmp https://gmplib.org/download/gmp/archive $(CT_Mirrors GNU gmp)" +CT_GMP_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_GMP_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_GMP_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.bz2" +CT_GMP_SIGNATURE_FORMAT="packed/.sig" +CT_GMP_later_than_5_1_0=y +CT_GMP_5_1_0_or_later=y +CT_GMP_later_than_5_0_0=y +CT_GMP_5_0_0_or_later=y +CT_GMP_REQUIRE_5_0_0_or_later=y +CT_COMP_LIBS_ISL=y +CT_COMP_LIBS_ISL_PKG_KSYM="ISL" +CT_ISL_DIR_NAME="isl" +CT_ISL_PKG_NAME="isl" +CT_ISL_SRC_RELEASE=y +# CT_ISL_SRC_DEVEL is not set +# CT_ISL_SRC_CUSTOM is not set +CT_ISL_PATCH_GLOBAL=y +# CT_ISL_PATCH_BUNDLED is not set +# CT_ISL_PATCH_LOCAL is not set +# CT_ISL_PATCH_BUNDLED_LOCAL is not set +# CT_ISL_PATCH_LOCAL_BUNDLED is not set +# CT_ISL_PATCH_NONE is not set +CT_ISL_PATCH_ORDER="global" +CT_ISL_V_0_20=y +# CT_ISL_V_0_19 is not set +# CT_ISL_V_0_18 is not set +# CT_ISL_V_0_17 is not set +# CT_ISL_V_0_16 is not set +# CT_ISL_V_0_15 is not set +# CT_ISL_NO_VERSIONS is not set +CT_ISL_VERSION="0.20" +CT_ISL_MIRRORS="http://isl.gforge.inria.fr" +CT_ISL_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_ISL_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_ISL_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz" +CT_ISL_SIGNATURE_FORMAT="" +CT_ISL_later_than_0_18=y +CT_ISL_0_18_or_later=y +CT_ISL_later_than_0_15=y +CT_ISL_0_15_or_later=y +CT_ISL_REQUIRE_0_15_or_later=y +CT_ISL_later_than_0_14=y +CT_ISL_0_14_or_later=y +CT_ISL_REQUIRE_0_14_or_later=y +CT_ISL_later_than_0_13=y +CT_ISL_0_13_or_later=y +CT_ISL_later_than_0_12=y +CT_ISL_0_12_or_later=y +CT_ISL_REQUIRE_0_12_or_later=y +# CT_COMP_LIBS_LIBELF is not set +CT_COMP_LIBS_LIBICONV=y +CT_COMP_LIBS_LIBICONV_PKG_KSYM="LIBICONV" +CT_LIBICONV_DIR_NAME="libiconv" +CT_LIBICONV_PKG_NAME="libiconv" +CT_LIBICONV_SRC_RELEASE=y +# CT_LIBICONV_SRC_DEVEL is not set +# CT_LIBICONV_SRC_CUSTOM is not set +CT_LIBICONV_PATCH_GLOBAL=y +# CT_LIBICONV_PATCH_BUNDLED is not set +# CT_LIBICONV_PATCH_LOCAL is not set +# CT_LIBICONV_PATCH_BUNDLED_LOCAL is not set +# CT_LIBICONV_PATCH_LOCAL_BUNDLED is not set +# CT_LIBICONV_PATCH_NONE is not set +CT_LIBICONV_PATCH_ORDER="global" +CT_LIBICONV_V_1_15=y +# CT_LIBICONV_NO_VERSIONS is not set +CT_LIBICONV_VERSION="1.15" +CT_LIBICONV_MIRRORS="$(CT_Mirrors GNU libiconv)" +CT_LIBICONV_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_LIBICONV_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_LIBICONV_ARCHIVE_FORMATS=".tar.gz" +CT_LIBICONV_SIGNATURE_FORMAT="packed/.sig" +CT_COMP_LIBS_MPC=y +CT_COMP_LIBS_MPC_PKG_KSYM="MPC" +CT_MPC_DIR_NAME="mpc" +CT_MPC_PKG_NAME="mpc" +CT_MPC_SRC_RELEASE=y +# CT_MPC_SRC_DEVEL is not set +# CT_MPC_SRC_CUSTOM is not set +CT_MPC_PATCH_GLOBAL=y +# CT_MPC_PATCH_BUNDLED is not set +# CT_MPC_PATCH_LOCAL is not set +# CT_MPC_PATCH_BUNDLED_LOCAL is not set +# CT_MPC_PATCH_LOCAL_BUNDLED is not set +# CT_MPC_PATCH_NONE is not set +CT_MPC_PATCH_ORDER="global" +CT_MPC_V_1_1=y +# CT_MPC_V_1_0 is not set +# CT_MPC_NO_VERSIONS is not set +CT_MPC_VERSION="1.1.0" +CT_MPC_MIRRORS="http://www.multiprecision.org/downloads $(CT_Mirrors GNU mpc)" +CT_MPC_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_MPC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_MPC_ARCHIVE_FORMATS=".tar.gz" +CT_MPC_SIGNATURE_FORMAT="packed/.sig" +CT_MPC_1_1_0_or_later=y +CT_MPC_1_1_0_or_older=y +CT_COMP_LIBS_MPFR=y +CT_COMP_LIBS_MPFR_PKG_KSYM="MPFR" +CT_MPFR_DIR_NAME="mpfr" +CT_MPFR_PKG_NAME="mpfr" +CT_MPFR_SRC_RELEASE=y +# CT_MPFR_SRC_DEVEL is not set +# CT_MPFR_SRC_CUSTOM is not set +CT_MPFR_PATCH_GLOBAL=y +# CT_MPFR_PATCH_BUNDLED is not set +# CT_MPFR_PATCH_LOCAL is not set +# CT_MPFR_PATCH_BUNDLED_LOCAL is not set +# CT_MPFR_PATCH_LOCAL_BUNDLED is not set +# CT_MPFR_PATCH_NONE is not set +CT_MPFR_PATCH_ORDER="global" +CT_MPFR_V_4_0=y +# CT_MPFR_V_3_1 is not set +# CT_MPFR_NO_VERSIONS is not set +CT_MPFR_VERSION="4.0.2" +CT_MPFR_MIRRORS="http://www.mpfr.org/mpfr-${CT_MPFR_VERSION} $(CT_Mirrors GNU mpfr)" +CT_MPFR_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_MPFR_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_MPFR_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz .zip" +CT_MPFR_SIGNATURE_FORMAT="packed/.asc" +CT_MPFR_later_than_4_0_0=y +CT_MPFR_4_0_0_or_later=y +CT_MPFR_later_than_3_0_0=y +CT_MPFR_3_0_0_or_later=y +CT_MPFR_REQUIRE_3_0_0_or_later=y +CT_COMP_LIBS_NCURSES=y +CT_COMP_LIBS_NCURSES_PKG_KSYM="NCURSES" +CT_NCURSES_DIR_NAME="ncurses" +CT_NCURSES_PKG_NAME="ncurses" +CT_NCURSES_SRC_RELEASE=y +# CT_NCURSES_SRC_DEVEL is not set +# CT_NCURSES_SRC_CUSTOM is not set +CT_NCURSES_PATCH_GLOBAL=y +# CT_NCURSES_PATCH_BUNDLED is not set +# CT_NCURSES_PATCH_LOCAL is not set +# CT_NCURSES_PATCH_BUNDLED_LOCAL is not set +# CT_NCURSES_PATCH_LOCAL_BUNDLED is not set +# CT_NCURSES_PATCH_NONE is not set +CT_NCURSES_PATCH_ORDER="global" +CT_NCURSES_V_6_1=y +# CT_NCURSES_V_6_0 is not set +# CT_NCURSES_NO_VERSIONS is not set +CT_NCURSES_VERSION="6.1" +CT_NCURSES_MIRRORS="ftp://invisible-island.net/ncurses $(CT_Mirrors GNU ncurses)" +CT_NCURSES_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_NCURSES_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_NCURSES_ARCHIVE_FORMATS=".tar.gz" +CT_NCURSES_SIGNATURE_FORMAT="packed/.sig" +# CT_NCURSES_NEW_ABI is not set +CT_NCURSES_HOST_CONFIG_ARGS="" +CT_NCURSES_HOST_DISABLE_DB=y +CT_NCURSES_HOST_FALLBACKS="linux,xterm,xterm-color,xterm-256color,vt100" +CT_NCURSES_TARGET_CONFIG_ARGS="" +# CT_NCURSES_TARGET_DISABLE_DB is not set +CT_NCURSES_TARGET_FALLBACKS="" +CT_COMP_LIBS_ZLIB=y +CT_COMP_LIBS_ZLIB_PKG_KSYM="ZLIB" +CT_ZLIB_DIR_NAME="zlib" +CT_ZLIB_PKG_NAME="zlib" +CT_ZLIB_SRC_RELEASE=y +# CT_ZLIB_SRC_DEVEL is not set +# CT_ZLIB_SRC_CUSTOM is not set +CT_ZLIB_PATCH_GLOBAL=y +# CT_ZLIB_PATCH_BUNDLED is not set +# CT_ZLIB_PATCH_LOCAL is not set +# CT_ZLIB_PATCH_BUNDLED_LOCAL is not set +# CT_ZLIB_PATCH_LOCAL_BUNDLED is not set +# CT_ZLIB_PATCH_NONE is not set +CT_ZLIB_PATCH_ORDER="global" +CT_ZLIB_V_1_2_11=y +# CT_ZLIB_NO_VERSIONS is not set +CT_ZLIB_VERSION="1.2.11" +CT_ZLIB_MIRRORS="http://downloads.sourceforge.net/project/libpng/zlib/${CT_ZLIB_VERSION}" +CT_ZLIB_ARCHIVE_FILENAME="@{pkg_name}-@{version}" +CT_ZLIB_ARCHIVE_DIRNAME="@{pkg_name}-@{version}" +CT_ZLIB_ARCHIVE_FORMATS=".tar.xz .tar.gz" +CT_ZLIB_SIGNATURE_FORMAT="packed/.asc" +CT_ALL_COMP_LIBS_CHOICES="CLOOG EXPAT GETTEXT GMP ISL LIBELF LIBICONV MPC MPFR NCURSES ZLIB" +CT_LIBICONV_NEEDED=y +CT_GETTEXT_NEEDED=y +CT_GMP_NEEDED=y +CT_MPFR_NEEDED=y +CT_ISL_NEEDED=y +CT_MPC_NEEDED=y +CT_EXPAT_NEEDED=y +CT_NCURSES_NEEDED=y +CT_ZLIB_NEEDED=y +CT_LIBICONV=y +CT_GETTEXT=y +CT_GMP=y +CT_MPFR=y +CT_ISL=y +CT_MPC=y +CT_EXPAT=y +CT_NCURSES=y +CT_ZLIB=y + +# +# Companion tools +# +# CT_COMP_TOOLS_FOR_HOST is not set +# CT_COMP_TOOLS_AUTOCONF is not set +# CT_COMP_TOOLS_AUTOMAKE is not set +# CT_COMP_TOOLS_BISON is not set +# CT_COMP_TOOLS_DTC is not set +# CT_COMP_TOOLS_LIBTOOL is not set +# CT_COMP_TOOLS_M4 is not set +# CT_COMP_TOOLS_MAKE is not set +CT_ALL_COMP_TOOLS_CHOICES="AUTOCONF AUTOMAKE BISON DTC LIBTOOL M4 MAKE" + +# +# Test suite +# +# CT_TEST_SUITE_GCC is not set diff --git a/src/ci/docker/dist-various-2/build-wasi-toolchain.sh b/src/ci/docker/dist-various-2/build-wasi-toolchain.sh index 925d5ca022..b868677564 100755 --- a/src/ci/docker/dist-various-2/build-wasi-toolchain.sh +++ b/src/ci/docker/dist-various-2/build-wasi-toolchain.sh @@ -12,7 +12,7 @@ export PATH=`pwd`/clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-14.04/bin:$PATH git clone https://github.com/CraneStation/wasi-libc cd wasi-libc -git reset --hard f645f498dfbbbc00a7a97874d33082d3605c3f21 +git reset --hard 1fad33890a5e299027ce0eab7b6ad5260585e347 make -j$(nproc) INSTALL_DIR=/wasm32-wasi install cd .. diff --git a/src/ci/docker/x86_64-gnu-debug/Dockerfile b/src/ci/docker/x86_64-gnu-debug/Dockerfile index b2748d9c2a..890e13232c 100644 --- a/src/ci/docker/x86_64-gnu-debug/Dockerfile +++ b/src/ci/docker/x86_64-gnu-debug/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:19.04 +FROM ubuntu:19.10 RUN apt-get update && apt-get install -y --no-install-recommends \ g++ \ diff --git a/src/ci/docker/x86_64-gnu-llvm-7/Dockerfile b/src/ci/docker/x86_64-gnu-llvm-7/Dockerfile index a1c9c13fc4..dc90c286f5 100644 --- a/src/ci/docker/x86_64-gnu-llvm-7/Dockerfile +++ b/src/ci/docker/x86_64-gnu-llvm-7/Dockerfile @@ -25,7 +25,9 @@ RUN sh /scripts/sccache.sh ENV RUST_CONFIGURE_ARGS \ --build=x86_64-unknown-linux-gnu \ --llvm-root=/usr/lib/llvm-7 \ - --enable-llvm-link-shared + --enable-llvm-link-shared \ + --set rust.thin-lto-import-instr-limit=10 + ENV SCRIPT python2.7 ../x.py test src/tools/tidy && python2.7 ../x.py test # The purpose of this container isn't to test with debug assertions and diff --git a/src/ci/docker/x86_64-gnu/Dockerfile b/src/ci/docker/x86_64-gnu/Dockerfile index 4ec4364721..b864c09ea8 100644 --- a/src/ci/docker/x86_64-gnu/Dockerfile +++ b/src/ci/docker/x86_64-gnu/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:19.04 +FROM ubuntu:19.10 RUN apt-get update && apt-get install -y --no-install-recommends \ g++ \ diff --git a/src/ci/publish_toolstate.sh b/src/ci/publish_toolstate.sh index d8ff740782..7c43d034d8 100755 --- a/src/ci/publish_toolstate.sh +++ b/src/ci/publish_toolstate.sh @@ -1,6 +1,9 @@ -#!/bin/sh +#!/bin/bash -set -eu +set -euo pipefail +IFS=$'\n\t' + +source "$(cd "$(dirname "$0")" && pwd)/shared.sh" # The following lines are also found in src/bootstrap/toolstate.rs, # so if updating here, please also update that file. @@ -14,12 +17,15 @@ printf 'https://%s:x-oauth-basic@github.com\n' "$TOOLSTATE_REPO_ACCESS_TOKEN" \ > "$HOME/.git-credentials" git clone --depth=1 $TOOLSTATE_REPO +GIT_COMMIT="$(git rev-parse HEAD)" +GIT_COMMIT_MSG="$(git log --format=%s -n1 HEAD)" + cd rust-toolstate FAILURE=1 for RETRY_COUNT in 1 2 3 4 5; do # The purpose is to publish the new "current" toolstate in the toolstate repo. - "$BUILD_SOURCESDIRECTORY/src/tools/publish_toolstate.py" "$(git rev-parse HEAD)" \ - "$(git log --format=%s -n1 HEAD)" \ + "$(ciCheckoutPath)/src/tools/publish_toolstate.py" "$GIT_COMMIT" \ + "$GIT_COMMIT_MSG" \ "$MESSAGE_FILE" \ "$TOOLSTATE_REPO_ACCESS_TOKEN" # `git commit` failing means nothing to commit. diff --git a/src/ci/run.sh b/src/ci/run.sh index 5bbe21051b..67f51d0e86 100755 --- a/src/ci/run.sh +++ b/src/ci/run.sh @@ -44,8 +44,13 @@ fi # FIXME: need a scheme for changing this `nightly` value to `beta` and `stable` # either automatically or manually. export RUST_RELEASE_CHANNEL=stable + +# Always set the release channel for bootstrap; this is normally not important (i.e., only dist +# builds would seem to matter) but in practice bootstrap wants to know whether we're targeting +# master, beta, or stable with a build to determine whether to run some checks (notably toolstate). +RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --release-channel=$RUST_RELEASE_CHANNEL" + if [ "$DEPLOY$DEPLOY_ALT" = "1" ]; then - RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --release-channel=$RUST_RELEASE_CHANNEL" RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --enable-llvm-static-stdcpp" RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --set rust.remap-debuginfo" RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --debuginfo-level-std=1" diff --git a/src/ci/scripts/install-clang.sh b/src/ci/scripts/install-clang.sh index f0179994e8..c242f5d456 100755 --- a/src/ci/scripts/install-clang.sh +++ b/src/ci/scripts/install-clang.sh @@ -14,6 +14,13 @@ if isMacOS; then ciCommandSetEnv CC "$(pwd)/clang+llvm-9.0.0-x86_64-darwin-apple/bin/clang" ciCommandSetEnv CXX "$(pwd)/clang+llvm-9.0.0-x86_64-darwin-apple/bin/clang++" + # macOS 10.15 onwards doesn't have libraries in /usr/include anymore: those + # are now located deep into the filesystem, under Xcode's own files. The + # native clang is configured to use the correct path, but our custom one + # doesn't. This sets the SDKROOT environment variable to the SDK so that + # our own clang can figure out the correct include path on its own. + ciCommandSetEnv SDKROOT "$(xcrun --sdk macosx --show-sdk-path)" + # Configure `AR` specifically so rustbuild doesn't try to infer it as # `clang-ar` by accident. ciCommandSetEnv AR "ar" diff --git a/src/ci/scripts/install-msys2-packages.sh b/src/ci/scripts/install-msys2-packages.sh index 36d9202f7a..843a2bf2d5 100755 --- a/src/ci/scripts/install-msys2-packages.sh +++ b/src/ci/scripts/install-msys2-packages.sh @@ -6,7 +6,8 @@ IFS=$'\n\t' source "$(cd "$(dirname "$0")" && pwd)/../shared.sh" if isWindows; then - pacman -S --noconfirm --needed base-devel ca-certificates make diffutils tar + pacman -S --noconfirm --needed base-devel ca-certificates make diffutils tar \ + binutils # Make sure we use the native python interpreter instead of some msys equivalent # one way or another. The msys interpreters seem to have weird path conversions diff --git a/src/ci/scripts/install-msys2.sh b/src/ci/scripts/install-msys2.sh index c9fafc7fe6..9e899ba9d8 100755 --- a/src/ci/scripts/install-msys2.sh +++ b/src/ci/scripts/install-msys2.sh @@ -12,8 +12,14 @@ IFS=$'\n\t' source "$(cd "$(dirname "$0")" && pwd)/../shared.sh" if isWindows; then - choco install msys2 --params="/InstallDir:$(ciCheckoutPath)/msys2 /NoPath" -y --no-progress + # Pre-followed the api/v2 URL to the CDN since the API can be a bit flakey + curl -sSL https://packages.chocolatey.org/msys2.20190524.0.0.20191030.nupkg > \ + msys2.nupkg + curl -sSL https://packages.chocolatey.org/chocolatey-core.extension.1.3.5.1.nupkg > \ + chocolatey-core.extension.nupkg + choco install -s . msys2 \ + --params="/InstallDir:$(ciCheckoutPath)/msys2 /NoPath" -y --no-progress + rm msys2.nupkg chocolatey-core.extension.nupkg mkdir -p "$(ciCheckoutPath)/msys2/home/${USERNAME}" - ciCommandAddPath "$(ciCheckoutPath)/msys2/usr/bin" fi diff --git a/src/ci/scripts/switch-xcode.sh b/src/ci/scripts/switch-xcode.sh deleted file mode 100755 index 2cbb2ddbc7..0000000000 --- a/src/ci/scripts/switch-xcode.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# Switch to XCode 9.3 on OSX since it seems to be the last version that supports -# i686-apple-darwin. We'll eventually want to upgrade this and it will probably -# force us to drop i686-apple-darwin, but let's keep the wheels turning for now. - -set -euo pipefail -IFS=$'\n\t' - -source "$(cd "$(dirname "$0")" && pwd)/../shared.sh" - -if isMacOS; then - sudo xcode-select --switch /Applications/Xcode_9.3.app -fi diff --git a/src/ci/shared.sh b/src/ci/shared.sh index 98120f5dff..206065d707 100644 --- a/src/ci/shared.sh +++ b/src/ci/shared.sh @@ -80,7 +80,7 @@ function ciCommit { function ciCheckoutPath { if isAzurePipelines; then - echo "${SYSTEM_WORKFOLDER}" + echo "${BUILD_SOURCESDIRECTORY}" elif isGitHubActions; then echo "${GITHUB_WORKSPACE}" else @@ -99,7 +99,7 @@ function ciCommandAddPath { if isAzurePipelines; then echo "##vso[task.prependpath]${path}" elif isGitHubActions; then - echo "::add-path::${value}" + echo "::add-path::${path}" else echo "ciCommandAddPath only works inside CI!" exit 1 diff --git a/src/doc/book/.travis.yml b/src/doc/book/.travis.yml index d8247288d4..d9a907c9fc 100644 --- a/src/doc/book/.travis.yml +++ b/src/doc/book/.travis.yml @@ -13,6 +13,6 @@ addons: - aspell - aspell-en before_script: - - (cargo install mdbook --vers 0.2.3 --force || true) + - (cargo install mdbook --vers 0.3.5 --force || true) script: - bash ci/build.sh diff --git a/src/doc/book/2018-edition/Cargo.lock b/src/doc/book/2018-edition/Cargo.lock deleted file mode 100644 index 928f6b1244..0000000000 --- a/src/doc/book/2018-edition/Cargo.lock +++ /dev/null @@ -1,142 +0,0 @@ -[[package]] -name = "aho-corasick" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "docopt" -version = "0.6.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lazy_static" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libc" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "memchr" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rust-book" -version = "0.0.1" -dependencies = [ - "docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "strsim" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "thread-id" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "utf8-ranges" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "walkdir" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66" -"checksum docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)" = "4a7ef30445607f6fc8720f0a0a2c7442284b629cf0d049286860fae23e71c4d9" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum lazy_static 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "236eb37a62591d4a41a89b7763d7de3e06ca02d5ab2815446a8bae5d2f8c2d57" -"checksum libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "5ba3df4dcb460b9dfbd070d41c94c19209620c191b0340b929ce748a2bcd42d2" -"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" -"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f" -"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957" -"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" -"checksum strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c" -"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03" -"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5" -"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f" -"checksum walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c66c0b9792f0a765345452775f3adbd28dde9d33f30d13e5dcc5ae17cf6f3780" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/src/doc/book/2018-edition/Cargo.toml b/src/doc/book/2018-edition/Cargo.toml deleted file mode 100644 index bb6763509f..0000000000 --- a/src/doc/book/2018-edition/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "rust-book" -version = "0.0.1" -authors = ["Steve Klabnik "] -description = "The Rust Book" - -[[bin]] -name = "concat_chapters" -path = "tools/src/bin/concat_chapters.rs" - -[[bin]] -name = "lfp" -path = "tools/src/bin/lfp.rs" - -[[bin]] -name = "link2print" -path = "tools/src/bin/link2print.rs" - -[[bin]] -name = "remove_links" -path = "tools/src/bin/remove_links.rs" - -[[bin]] -name = "remove_markup" -path = "tools/src/bin/remove_markup.rs" - -[[bin]] -name = "convert_quotes" -path = "tools/src/bin/convert_quotes.rs" - -[dependencies] -walkdir = "0.1.5" -docopt = "0.6.82" -rustc-serialize = "0.3.19" -regex = "0.1.73" -lazy_static = "0.2.1" diff --git a/src/doc/book/2018-edition/LICENSE-APACHE b/src/doc/book/2018-edition/LICENSE-APACHE deleted file mode 100644 index 96e9f0458b..0000000000 --- a/src/doc/book/2018-edition/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright 2010-2017 The Rust Project Developers - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/src/doc/book/2018-edition/LICENSE-MIT b/src/doc/book/2018-edition/LICENSE-MIT deleted file mode 100644 index 5a56e6e8ed..0000000000 --- a/src/doc/book/2018-edition/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2010-2017 The Rust Project Developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/src/doc/book/2018-edition/convert-quotes.sh b/src/doc/book/2018-edition/convert-quotes.sh deleted file mode 100755 index aa51dcbddf..0000000000 --- a/src/doc/book/2018-edition/convert-quotes.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -set -eu - -dir=$1 - -mkdir -p "tmp/$dir" - -for f in $dir/*.md -do - cat "$f" | cargo run --bin convert_quotes > "tmp/$f" - mv "tmp/$f" "$f" -done diff --git a/src/doc/book/2018-edition/nostarch.sh b/src/doc/book/2018-edition/nostarch.sh deleted file mode 100755 index 6c4173a01c..0000000000 --- a/src/doc/book/2018-edition/nostarch.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -set -eu - -cargo build --release - -mkdir -p tmp -rm -rf tmp/*.md - -# Get all the Markdown files in the src dir, -ls src/${1:-""}*.md | \ -# except for `SUMMARY.md`. -grep -v SUMMARY.md | \ -# Extract just the filename so we can reuse it easily. -xargs -n 1 basename | \ -# Remove all links followed by ```, then -# Change all remaining links from Markdown to italicized inline text. -while IFS= read -r filename; do - < "src/$filename" ./target/release/remove_links \ - | ./target/release/link2print \ - | ./target/release/remove_markup > "tmp/$filename" -done -# Concatenate the files into the `nostarch` dir. -./target/release/concat_chapters tmp nostarch diff --git a/src/doc/book/2018-edition/style-guide.md b/src/doc/book/2018-edition/style-guide.md deleted file mode 100644 index 56677811f4..0000000000 --- a/src/doc/book/2018-edition/style-guide.md +++ /dev/null @@ -1,34 +0,0 @@ -# Style Guide - -## Prose - -* Prefer title case for chapter/section headings, ex: `## Generating a Secret - Number` rather than `## Generating a secret number`. -* Prefer italics over single quotes when calling out a term, ex: `is an - *associated function* of` rather than `is an ‘associated function’ of`. -* When talking about a method in prose, DO NOT include the parentheses, ex: - `read_line` rather than `read_line()`. -* Hard wrap at 80 chars -* Prefer not mixing code and not-code in one word, ex: ``Remember when we wrote - `use std::io`?`` rather than ``Remember when we `use`d `std::io`?`` - -## Code - -* Add the file name before markdown blocks to make it clear which file we're - talking about, when applicable. -* When making changes to code, make it clear which parts of the code changed - and which stayed the same... not sure how to do this yet -* Split up long lines as appropriate to keep them under 80 chars if possible -* Use `bash` syntax highlighting for command line output code blocks - -## Links - -Once all the scripts are done: - -* If a link shouldn't be printed, mark it to be ignored - * This includes all "Chapter XX" intra-book links, which *should* be links - for the HTML version -* Make intra-book links and stdlib API doc links relative so they work whether - the book is read offline or on docs.rust-lang.org -* Use markdown links and keep in mind that they will be changed into `text at - *url*` in print, so word them in a way that it reads well in that format diff --git a/src/doc/book/2018-edition/tools/docx-to-md.xsl b/src/doc/book/2018-edition/tools/docx-to-md.xsl deleted file mode 100644 index 3b60bc34e4..0000000000 --- a/src/doc/book/2018-edition/tools/docx-to-md.xsl +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - [TOC] - # - - - - - - ## - - - - - - ### - - - - - - #### - - - - - - ### - - - - - - 1. - - - - - - 1. - - - - - - * - - - - - - * - - - - - - * - - - - - - - - - - - - - ``` - - - - - - - - - - - - - - - - - - - - - ``` - - - - ``` - - ``` - - - - - - - - - - - - - - > - - - - - - > - - - - - - > - - - - - -Unmatched: - - - - - - - - - - - - - - - ` - - ` - - - - - - - - - - - - - - - - - ** - - ** - - - - - - - - - - - - - - - - - * - - * - - - - - - - - - - - - - - diff --git a/src/doc/book/2018-edition/tools/src/bin/concat_chapters.rs b/src/doc/book/2018-edition/tools/src/bin/concat_chapters.rs deleted file mode 100644 index da02dd34b4..0000000000 --- a/src/doc/book/2018-edition/tools/src/bin/concat_chapters.rs +++ /dev/null @@ -1,104 +0,0 @@ -#[macro_use] extern crate lazy_static; -extern crate regex; - -use std::env; -use std::io; -use std::io::{Read, Write}; -use std::process::exit; -use std::fs::{create_dir, read_dir, File}; -use std::path::{Path, PathBuf}; -use std::collections::BTreeMap; - -use regex::Regex; - -static PATTERNS: &'static [(&'static str, &'static str)] = &[ - (r"ch(\d\d)-\d\d-.*\.md", "chapter$1.md"), - (r"appendix-(\d\d).*\.md", "appendix.md"), -]; - -lazy_static! { - static ref MATCHERS: Vec<(Regex, &'static str)> = { - PATTERNS.iter() - .map(|&(expr, repl)| (Regex::new(expr).unwrap(), repl)) - .collect() - }; -} - -fn main() { - let args: Vec = env::args().collect(); - - if args.len() < 3 { - println!("Usage: {} ", args[0]); - exit(1); - } - - let source_dir = ensure_dir_exists(&args[1]).unwrap(); - let target_dir = ensure_dir_exists(&args[2]).unwrap(); - - let mut matched_files = match_files(source_dir, target_dir); - matched_files.sort(); - - for (target_path, source_paths) in group_by_target(matched_files) { - concat_files(source_paths, target_path).unwrap(); - } -} - -fn match_files(source_dir: &Path, target_dir: &Path) -> Vec<(PathBuf, PathBuf)> { - read_dir(source_dir) - .expect("Unable to read source directory") - .filter_map(|maybe_entry| maybe_entry.ok()) - .filter_map(|entry| { - let source_filename = entry.file_name(); - let source_filename = &source_filename.to_string_lossy().into_owned(); - for &(ref regex, replacement) in MATCHERS.iter() { - if regex.is_match(source_filename) { - let target_filename = regex.replace_all(source_filename, replacement); - let source_path = entry.path(); - let mut target_path = PathBuf::from(&target_dir); - target_path.push(target_filename); - return Some((source_path, target_path)); - } - } - None - }) - .collect() -} - -fn group_by_target(matched_files: Vec<(PathBuf, PathBuf)>) -> BTreeMap> { - let mut grouped: BTreeMap> = BTreeMap::new(); - for (source, target) in matched_files { - if let Some(source_paths) = grouped.get_mut(&target) { - source_paths.push(source); - continue; - } - let source_paths = vec![source]; - grouped.insert(target.clone(), source_paths); - } - grouped -} - -fn concat_files(source_paths: Vec, target_path: PathBuf) -> io::Result<()> { - println!("Concatenating into {}:", target_path.to_string_lossy()); - let mut target = try!(File::create(target_path)); - try!(target.write_all(b"\n[TOC]\n")); - - for path in source_paths { - println!(" {}", path.to_string_lossy()); - let mut source = try!(File::open(path)); - let mut contents: Vec = Vec::new(); - try!(source.read_to_end(&mut contents)); - - try!(target.write_all(b"\n")); - try!(target.write_all(&contents)); - try!(target.write_all(b"\n")); - } - Ok(()) -} - -fn ensure_dir_exists(dir_string: &str) -> io::Result<&Path> { - let path = Path::new(dir_string); - if !path.exists() { - try!(create_dir(path)); - } - Ok(&path) -} diff --git a/src/doc/book/2018-edition/tools/src/bin/convert_quotes.rs b/src/doc/book/2018-edition/tools/src/bin/convert_quotes.rs deleted file mode 100644 index b151ae7e9f..0000000000 --- a/src/doc/book/2018-edition/tools/src/bin/convert_quotes.rs +++ /dev/null @@ -1,73 +0,0 @@ -use std::io; -use std::io::{Read, Write}; - -fn main() { - let mut is_in_code_block = false; - let mut is_in_inline_code = false; - let mut is_in_html_tag = false; - - let mut buffer = String::new(); - if let Err(e) = io::stdin().read_to_string(&mut buffer) { - panic!(e); - } - - for line in buffer.lines() { - if line.is_empty() { - is_in_inline_code = false; - } - if line.starts_with("```") { - is_in_code_block = !is_in_code_block; - } - if is_in_code_block { - is_in_inline_code = false; - is_in_html_tag = false; - write!(io::stdout(), "{}\n", line).unwrap(); - } else { - let mut modified_line = &mut String::new(); - let mut previous_char = std::char::REPLACEMENT_CHARACTER; - let mut chars_in_line = line.chars(); - - while let Some(possible_match) = chars_in_line.next() { - // check if inside inline code - if possible_match == '`' { - is_in_inline_code = !is_in_inline_code; - } - // check if inside html tag - if possible_match == '<' && !is_in_inline_code { - is_in_html_tag = true; - } - if possible_match == '>' && !is_in_inline_code { - is_in_html_tag = false; - } - - // replace with right/left apostrophe/quote - let char_to_push = - if possible_match == '\'' && !is_in_inline_code && !is_in_html_tag { - if (previous_char != std::char::REPLACEMENT_CHARACTER && - !previous_char.is_whitespace()) || - previous_char == '‘' - { - '’' - } else { - '‘' - } - } else if possible_match == '"' && !is_in_inline_code && !is_in_html_tag { - if (previous_char != std::char::REPLACEMENT_CHARACTER && - !previous_char.is_whitespace()) || - previous_char == '“' - { - '”' - } else { - '“' - } - } else { - // leave untouched - possible_match - }; - modified_line.push(char_to_push); - previous_char = char_to_push; - } - write!(io::stdout(), "{}\n", modified_line).unwrap(); - } - } -} diff --git a/src/doc/book/2018-edition/tools/src/bin/lfp.rs b/src/doc/book/2018-edition/tools/src/bin/lfp.rs deleted file mode 100644 index 32b2ab2975..0000000000 --- a/src/doc/book/2018-edition/tools/src/bin/lfp.rs +++ /dev/null @@ -1,243 +0,0 @@ -// We have some long regex literals, so: -// ignore-tidy-linelength - -extern crate docopt; -extern crate rustc_serialize; -extern crate walkdir; - -use docopt::Docopt; -use std::{path, fs, io}; -use std::io::BufRead; - -fn main () { - let args: Args = Docopt::new(USAGE) - .and_then(|d| d.decode()) - .unwrap_or_else(|e| e.exit()); - - let src_dir = &path::Path::new(&args.arg_src_dir); - let found_errs = walkdir::WalkDir::new(src_dir) - .min_depth(1) - .into_iter() - .map(|entry| { - match entry { - Ok(entry) => entry, - Err(err) => { - eprintln!("{:?}", err); - std::process::exit(911) - }, - } - }) - .map(|entry| { - let path = entry.path(); - if is_file_of_interest(path) { - let err_vec = lint_file(path); - for err in &err_vec { - match *err { - LintingError::LineOfInterest(line_num, ref line) => - eprintln!("{}:{}\t{}", path.display(), line_num, line), - LintingError::UnableToOpenFile => - eprintln!("Unable to open {}.", path.display()), - } - } - !err_vec.is_empty() - } else { - false - } - }) - .collect::>() - .iter() - .any(|result| *result); - - if found_errs { - std::process::exit(1) - } else { - std::process::exit(0) - } -} - -const USAGE: &'static str = " -counter -Usage: - lfp - lfp (-h | --help) -Options: - -h --help Show this screen. -"; - -#[derive(Debug, RustcDecodable)] -struct Args { - arg_src_dir: String, -} - -fn lint_file(path: &path::Path) -> Vec { - match fs::File::open(path) { - Ok(file) => lint_lines(io::BufReader::new(&file).lines()), - Err(_) => vec![LintingError::UnableToOpenFile], - } -} - -fn lint_lines(lines: I) -> Vec - where I: Iterator> { - lines - .enumerate() - .map(|(line_num, line)| { - let raw_line = line.unwrap(); - if is_line_of_interest(&raw_line) { - Err(LintingError::LineOfInterest(line_num, raw_line)) - } else { - Ok(()) - } - }) - .filter(|result| result.is_err()) - .map(|result| result.unwrap_err()) - .collect() -} - -fn is_file_of_interest(path: &path::Path) -> bool { - path.extension() - .map_or(false, |ext| ext == "md") -} - -fn is_line_of_interest(line: &str) -> bool { - !line.split_whitespace() - .filter(|sub_string| - sub_string.contains("file://") && - !sub_string.contains("file:///projects/") - ) - .collect::>() - .is_empty() -} - -#[derive(Debug)] -enum LintingError { - UnableToOpenFile, - LineOfInterest(usize, String) -} - -#[cfg(test)] -mod tests { - - use std::path; - - #[test] - fn lint_file_returns_a_vec_with_errs_when_lines_of_interest_are_found() { - let string = r#" - $ cargo run - Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game) - Running `target/guessing_game` - Guess the number! - The secret number is: 61 - Please input your guess. - 10 - You guessed: 10 - Too small! - Please input your guess. - 99 - You guessed: 99 - Too big! - Please input your guess. - foo - Please input your guess. - 61 - You guessed: 61 - You win! - $ cargo run - Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game) - Running `target/debug/guessing_game` - Guess the number! - The secret number is: 7 - Please input your guess. - 4 - You guessed: 4 - $ cargo run - Running `target/debug/guessing_game` - Guess the number! - The secret number is: 83 - Please input your guess. - 5 - $ cargo run - Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game) - Running `target/debug/guessing_game` - Hello, world! - "#; - - let raw_lines = string.to_string(); - let lines = raw_lines.lines().map(|line| { - Ok(line.to_string()) - }); - - let result_vec = super::lint_lines(lines); - - assert!(!result_vec.is_empty()); - assert_eq!(3, result_vec.len()); - } - - #[test] - fn lint_file_returns_an_empty_vec_when_no_lines_of_interest_are_found() { - let string = r#" - $ cargo run - Compiling guessing_game v0.1.0 (file:///projects/guessing_game) - Running `target/guessing_game` - Guess the number! - The secret number is: 61 - Please input your guess. - 10 - You guessed: 10 - Too small! - Please input your guess. - 99 - You guessed: 99 - Too big! - Please input your guess. - foo - Please input your guess. - 61 - You guessed: 61 - You win! - "#; - - let raw_lines = string.to_string(); - let lines = raw_lines.lines().map(|line| { - Ok(line.to_string()) - }); - - let result_vec = super::lint_lines(lines); - - assert!(result_vec.is_empty()); - } - - #[test] - fn is_file_of_interest_returns_false_when_the_path_is_a_directory() { - let uninteresting_fn = "src/img"; - - assert!(!super::is_file_of_interest(path::Path::new(uninteresting_fn))); - } - - #[test] - fn is_file_of_interest_returns_false_when_the_filename_does_not_have_the_md_extension() { - let uninteresting_fn = "src/img/foo1.png"; - - assert!(!super::is_file_of_interest(path::Path::new(uninteresting_fn))); - } - - #[test] - fn is_file_of_interest_returns_true_when_the_filename_has_the_md_extension() { - let interesting_fn = "src/ch01-00-introduction.md"; - - assert!(super::is_file_of_interest(path::Path::new(interesting_fn))); - } - - #[test] - fn is_line_of_interest_does_not_report_a_line_if_the_line_contains_a_file_url_which_is_directly_followed_by_the_project_path() { - let sample_line = "Compiling guessing_game v0.1.0 (file:///projects/guessing_game)"; - - assert!(!super::is_line_of_interest(sample_line)); - } - - #[test] - fn is_line_of_interest_reports_a_line_if_the_line_contains_a_file_url_which_is_not_directly_followed_by_the_project_path() { - let sample_line = "Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game)"; - - assert!(super::is_line_of_interest(sample_line)); - } -} diff --git a/src/doc/book/2018-edition/tools/src/bin/link2print.rs b/src/doc/book/2018-edition/tools/src/bin/link2print.rs deleted file mode 100644 index 4fe4477b10..0000000000 --- a/src/doc/book/2018-edition/tools/src/bin/link2print.rs +++ /dev/null @@ -1,406 +0,0 @@ -// FIXME: we have some long lines that could be refactored, but it's not a big deal. -// ignore-tidy-linelength - -extern crate regex; - -use std::collections::HashMap; -use std::io; -use std::io::{Read, Write}; -use regex::{Regex, Captures}; - -fn main() { - write_md(parse_links(parse_references(read_md()))); -} - -fn read_md() -> String { - let mut buffer = String::new(); - match io::stdin().read_to_string(&mut buffer) { - Ok(_) => buffer, - Err(error) => panic!(error), - } -} - -fn write_md(output: String) { - write!(io::stdout(), "{}", output).unwrap(); -} - -fn parse_references(buffer: String) -> (String, HashMap) { - let mut ref_map = HashMap::new(); - // FIXME: currently doesn't handle "title" in following line. - let re = Regex::new(r###"(?m)\n?^ {0,3}\[([^]]+)\]:[[:blank:]]*(.*)$"###).unwrap(); - let output = re.replace_all(&buffer, |caps: &Captures| { - let key = caps.at(1).unwrap().to_owned().to_uppercase(); - let val = caps.at(2).unwrap().to_owned(); - if ref_map.insert(key, val).is_some() { - panic!("Did not expect markdown page to have duplicate reference"); - } - "".to_string() - }); - (output, ref_map) -} - -fn parse_links((buffer, ref_map): (String, HashMap)) -> String { - // FIXME: check which punctuation is allowed by spec. - let re = Regex::new(r###"(?:(?P
(?:```(?:[^`]|`[^`])*`?\n```\n)|(?:[^[]`[^`\n]+[\n]?[^`\n]*`))|(?:\[(?P[^]]+)\](?:(?:\([[:blank:]]*(?P[^")]*[^ ])(?:[[:blank:]]*"[^"]*")?\))|(?:\[(?P[^]]*)\]))?))"###).expect("could not create regex");
-    let error_code = Regex::new(r###"^E\d{4}$"###).expect("could not create regex");
-    let output = re.replace_all(&buffer, |caps: &Captures| {
-        match caps.name("pre") {
-            Some(pre_section) => format!("{}", pre_section.to_owned()),
-            None => {
-                let name = caps.name("name").expect("could not get name").to_owned();
-                // Really we should ignore text inside code blocks,
-                // this is a hack to not try to treat `#[derive()]`,
-                // `[profile]`, `[test]`, or `[E\d\d\d\d]` like a link.
-                if name.starts_with("derive(") ||
-                   name.starts_with("profile") ||
-                   name.starts_with("test") ||
-                   error_code.is_match(&name) {
-                    return name
-                }
-
-                let val = match caps.name("val") {
-                    // `[name](link)`
-                    Some(value) => value.to_owned(),
-                    None => {
-                        match caps.name("key") {
-                            Some(key) => {
-                                match key {
-                                    // `[name][]`
-                                    "" => format!("{}", ref_map.get(&name.to_uppercase()).expect(&format!("could not find url for the link text `{}`", name))),
-                                    // `[name][reference]`
-                                    _ => format!("{}", ref_map.get(&key.to_uppercase()).expect(&format!("could not find url for the link text `{}`", key))),
-                                }
-                            }
-                            // `[name]` as reference
-                            None => format!("{}", ref_map.get(&name.to_uppercase()).expect(&format!("could not find url for the link text `{}`", name))),
-                        }
-                    }
-                };
-                format!("{} at *{}*", name, val)
-            }
-        }
-    });
-    output
-}
-
-#[cfg(test)]
-mod tests {
-    fn parse(source: String) -> String {
-        super::parse_links(super::parse_references(source))
-    }
-
-    #[test]
-    fn parses_inline_link() {
-        let source = r"This is a [link](http://google.com) that should be expanded".to_string();
-        let target = r"This is a link at *http://google.com* that should be expanded".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_multiline_links() {
-        let source = r"This is a [link](http://google.com) that
-should appear expanded. Another [location](/here/) and [another](http://gogogo)"
-            .to_string();
-        let target = r"This is a link at *http://google.com* that
-should appear expanded. Another location at */here/* and another at *http://gogogo*"
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_reference() {
-        let source = r"This is a [link][theref].
-[theref]: http://example.com/foo
-more text"
-            .to_string();
-        let target = r"This is a link at *http://example.com/foo*.
-more text"
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_implicit_link() {
-        let source = r"This is an [implicit][] link.
-[implicit]: /The Link/"
-            .to_string();
-        let target = r"This is an implicit at */The Link/* link.".to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn parses_refs_with_one_space_indentation() {
-        let source = r"This is a [link][ref]
- [ref]: The link"
-            .to_string();
-        let target = r"This is a link at *The link*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_refs_with_two_space_indentation() {
-        let source = r"This is a [link][ref]
-  [ref]: The link"
-            .to_string();
-        let target = r"This is a link at *The link*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_refs_with_three_space_indentation() {
-        let source = r"This is a [link][ref]
-   [ref]: The link"
-            .to_string();
-        let target = r"This is a link at *The link*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    #[should_panic]
-    fn rejects_refs_with_four_space_indentation() {
-        let source = r"This is a [link][ref]
-    [ref]: The link"
-            .to_string();
-        let target = r"This is a link at *The link*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn ignores_optional_inline_title() {
-        let source = r###"This is a titled [link](http://example.com "My title")."###.to_string();
-        let target = r"This is a titled link at *http://example.com*.".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_title_with_puctuation() {
-        let source = r###"[link](http://example.com "It's Title")"###.to_string();
-        let target = r"link at *http://example.com*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_name_with_punctuation() {
-        let source = r###"[I'm here](there)"###.to_string();
-        let target = r###"I'm here at *there*"###.to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn parses_name_with_utf8() {
-        let source = r###"[user’s forum](the user’s forum)"###.to_string();
-        let target = r###"user’s forum at *the user’s forum*"###.to_string();
-        assert_eq!(parse(source), target);
-    }
-
-
-    #[test]
-    fn parses_reference_with_punctuation() {
-        let source = r###"[link][the ref-ref]
-[the ref-ref]:http://example.com/ref-ref"###
-            .to_string();
-        let target = r###"link at *http://example.com/ref-ref*"###.to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_reference_case_insensitively() {
-        let source = r"[link][Ref]
-[ref]: The reference"
-            .to_string();
-        let target = r"link at *The reference*".to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn parses_link_as_reference_when_reference_is_empty() {
-        let source = r"[link as reference][]
-[link as reference]: the actual reference"
-            .to_string();
-        let target = r"link as reference at *the actual reference*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_link_without_reference_as_reference() {
-        let source = r"[link] is alone
-[link]: The contents"
-            .to_string();
-        let target = r"link at *The contents* is alone".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    #[ignore]
-    fn parses_link_without_reference_as_reference_with_asterisks() {
-        let source = r"*[link]* is alone
-[link]: The contents"
-            .to_string();
-        let target = r"*link* at *The contents* is alone".to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_links_in_pre_sections() {
-        let source = r###"```toml
-[package]
-name = "hello_cargo"
-version = "0.1.0"
-authors = ["Your Name "]
-
-[dependencies]
-```
-"###
-            .to_string();
-        let target = source.clone();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn ignores_links_in_quoted_sections() {
-        let source = r###"do not change `[package]`."###.to_string();
-        let target = source.clone();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_links_in_quoted_sections_containing_newlines() {
-        let source = r"do not change `this [package]
-is still here` [link](ref)"
-            .to_string();
-        let target = r"do not change `this [package]
-is still here` link at *ref*"
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn ignores_links_in_pre_sections_while_still_handling_links() {
-        let source = r###"```toml
-[package]
-name = "hello_cargo"
-version = "0.1.0"
-authors = ["Your Name "]
-
-[dependencies]
-```
-Another [link]
-more text
-[link]: http://gohere
-"###
-            .to_string();
-        let target = r###"```toml
-[package]
-name = "hello_cargo"
-version = "0.1.0"
-authors = ["Your Name "]
-
-[dependencies]
-```
-Another link at *http://gohere*
-more text
-"###
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_quotes_in_pre_sections() {
-        let source = r###"```bash
-$ cargo build
-   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
-src/main.rs:23:21: 23:35 error: mismatched types [E0308]
-src/main.rs:23     match guess.cmp(&secret_number) {
-                                   ^~~~~~~~~~~~~~
-src/main.rs:23:21: 23:35 help: run `rustc --explain E0308` to see a detailed explanation
-src/main.rs:23:21: 23:35 note: expected type `&std::string::String`
-src/main.rs:23:21: 23:35 note:    found type `&_`
-error: aborting due to previous error
-Could not compile `guessing_game`.
-```
-"###
-            .to_string();
-        let target = source.clone();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_short_quotes() {
-        let source = r"to `1` at index `[0]` i".to_string();
-        let target = source.clone();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_pre_sections_with_final_quote() {
-        let source = r###"```bash
-$ cargo run
-   Compiling points v0.1.0 (file:///projects/points)
-error: the trait bound `Point: std::fmt::Display` is not satisfied [--explain E0277]
- --> src/main.rs:8:29
-8 |>     println!("Point 1: {}", p1);
-  |>                             ^^
-:2:27: 2:58: note: in this expansion of format_args!
-:3:1: 3:54: note: in this expansion of print! (defined in )
-src/main.rs:8:5: 8:33: note: in this expansion of println! (defined in )
-note: `Point` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string
-note: required by `std::fmt::Display::fmt`
-```
-`here` is another [link](the ref)
-"###.to_string();
-        let target = r###"```bash
-$ cargo run
-   Compiling points v0.1.0 (file:///projects/points)
-error: the trait bound `Point: std::fmt::Display` is not satisfied [--explain E0277]
- --> src/main.rs:8:29
-8 |>     println!("Point 1: {}", p1);
-  |>                             ^^
-:2:27: 2:58: note: in this expansion of format_args!
-:3:1: 3:54: note: in this expansion of print! (defined in )
-src/main.rs:8:5: 8:33: note: in this expansion of println! (defined in )
-note: `Point` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string
-note: required by `std::fmt::Display::fmt`
-```
-`here` is another link at *the ref*
-"###.to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn parses_adam_p_cheatsheet() {
-        let source = r###"[I'm an inline-style link](https://www.google.com)
-
-[I'm an inline-style link with title](https://www.google.com "Google's Homepage")
-
-[I'm a reference-style link][Arbitrary case-insensitive reference text]
-
-[I'm a relative reference to a repository file](../blob/master/LICENSE)
-
-[You can use numbers for reference-style link definitions][1]
-
-Or leave it empty and use the [link text itself][].
-
-URLs and URLs in angle brackets will automatically get turned into links.
-http://www.example.com or  and sometimes
-example.com (but not on Github, for example).
-
-Some text to show that the reference links can follow later.
-
-[arbitrary case-insensitive reference text]: https://www.mozilla.org
-[1]: http://slashdot.org
-[link text itself]: http://www.reddit.com"###
-            .to_string();
-
-        let target = r###"I'm an inline-style link at *https://www.google.com*
-
-I'm an inline-style link with title at *https://www.google.com*
-
-I'm a reference-style link at *https://www.mozilla.org*
-
-I'm a relative reference to a repository file at *../blob/master/LICENSE*
-
-You can use numbers for reference-style link definitions at *http://slashdot.org*
-
-Or leave it empty and use the link text itself at *http://www.reddit.com*.
-
-URLs and URLs in angle brackets will automatically get turned into links.
-http://www.example.com or  and sometimes
-example.com (but not on Github, for example).
-
-Some text to show that the reference links can follow later.
-"###
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-}
diff --git a/src/doc/book/2018-edition/tools/src/bin/remove_links.rs b/src/doc/book/2018-edition/tools/src/bin/remove_links.rs
deleted file mode 100644
index 71c386106f..0000000000
--- a/src/doc/book/2018-edition/tools/src/bin/remove_links.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-extern crate regex;
-
-use std::collections::HashSet;
-use std::io;
-use std::io::{Read, Write};
-use regex::{Regex, Captures};
-
-fn main () {
-    let mut buffer = String::new();
-    if let Err(e) = io::stdin().read_to_string(&mut buffer) {
-        panic!(e);
-    }
-
-    let mut refs = HashSet::new();
-
-    // Capture all links and link references.
-    let regex = r"\[([^\]]+)\](?:(?:\[([^\]]+)\])|(?:\([^\)]+\)))(?i)";
-    let link_regex = Regex::new(regex).unwrap();
-    let first_pass = link_regex.replace_all(&buffer, |caps: &Captures| {
-
-        // Save the link reference we want to delete.
-        if let Some(reference) = caps.at(2) {
-            refs.insert(reference.to_owned());
-        }
-
-        // Put the link title back.
-        caps.at(1).unwrap().to_owned()
-    });
-
-    // Search for the references we need to delete.
-    let ref_regex = Regex::new(r"\n\[([^\]]+)\]:\s.*\n").unwrap();
-    let out = ref_regex.replace_all(&first_pass, |caps: &Captures| {
-        let capture = caps.at(1).unwrap().to_owned();
-
-        // Check if we've marked this reference for deletion ...
-        if refs.contains(capture.as_str()) {
-            return "".to_string();
-        }
-
-        // ... else we put back everything we captured.
-        caps.at(0).unwrap().to_owned()
-    });
-
-    write!(io::stdout(), "{}", out).unwrap();
-}
diff --git a/src/doc/book/2018-edition/tools/src/bin/remove_markup.rs b/src/doc/book/2018-edition/tools/src/bin/remove_markup.rs
deleted file mode 100644
index be444bfd9a..0000000000
--- a/src/doc/book/2018-edition/tools/src/bin/remove_markup.rs
+++ /dev/null
@@ -1,52 +0,0 @@
-extern crate regex;
-
-use std::io;
-use std::io::{Read, Write};
-use regex::{Regex, Captures};
-
-fn main() {
-    write_md(remove_markup(read_md()));
-}
-
-fn read_md() -> String {
-    let mut buffer = String::new();
-    match io::stdin().read_to_string(&mut buffer) {
-        Ok(_) => buffer,
-        Err(error) => panic!(error),
-    }
-}
-
-fn write_md(output: String) {
-    write!(io::stdout(), "{}", output).unwrap();
-}
-
-fn remove_markup(input: String) -> String {
-    let filename_regex = Regex::new(r#"\A(.*)\z"#).unwrap();
-    // Captions sometimes take up multiple lines.
-    let caption_start_regex = Regex::new(r#"\A(.*)\z"#).unwrap();
-    let caption_end_regex = Regex::new(r#"(.*)\z"#).unwrap();
-    let regexen = vec![filename_regex, caption_start_regex, caption_end_regex];
-
-    let lines: Vec<_> = input.lines().flat_map(|line| {
-        // Remove our figure and caption markup.
-        if line == "
" || - line == "
" || - line == "
" || - line == "
" - { - None - // Remove our syntax highlighting and rustdoc markers. - } else if line.starts_with("```") { - Some(String::from("```")) - // Remove the span around filenames and captions. - } else { - let result = regexen.iter().fold(line.to_string(), |result, regex| { - regex.replace_all(&result, |caps: &Captures| { - caps.at(1).unwrap().to_owned() - }) - }); - Some(result) - } - }).collect(); - lines.join("\n") -} diff --git a/src/doc/book/Cargo.toml b/src/doc/book/Cargo.toml index b86be477ca..3254231c04 100644 --- a/src/doc/book/Cargo.toml +++ b/src/doc/book/Cargo.toml @@ -9,6 +9,10 @@ edition = "2018" name = "concat_chapters" path = "tools/src/bin/concat_chapters.rs" +[[bin]] +name = "convert_quotes" +path = "tools/src/bin/convert_quotes.rs" + [[bin]] name = "lfp" path = "tools/src/bin/lfp.rs" @@ -25,10 +29,6 @@ path = "tools/src/bin/remove_links.rs" name = "remove_markup" path = "tools/src/bin/remove_markup.rs" -[[bin]] -name = "convert_quotes" -path = "tools/src/bin/convert_quotes.rs" - [dependencies] walkdir = "0.1.5" docopt = "0.6.82" diff --git a/src/doc/book/README.md b/src/doc/book/README.md index 6dd1d9f373..7075fa40a3 100644 --- a/src/doc/book/README.md +++ b/src/doc/book/README.md @@ -4,7 +4,7 @@ This repository contains the source of "The Rust Programming Language" book. -[The book is available in dead-tree form from No Starch Press][nostarch] +[The book is available in dead-tree form from No Starch Press][nostarch]. [nostarch]: https://nostarch.com/rust @@ -17,6 +17,10 @@ releases are updated less frequently. [beta]: https://doc.rust-lang.org/beta/book/ [nightly]: https://doc.rust-lang.org/nightly/book/ +See the [releases] to download just the code of all the code listings that appear in the book. + +[releases]: https://github.com/rust-lang/book/releases + ## Requirements Building the book requires [mdBook], ideally the same 0.3.x version that diff --git a/src/doc/book/nostarch/updates.md b/src/doc/book/nostarch/updates.md deleted file mode 100644 index f4ab6f0f9c..0000000000 --- a/src/doc/book/nostarch/updates.md +++ /dev/null @@ -1,32 +0,0 @@ -Welcome to The Rust Programming Language book! This version of the text assumes -you are using Rust 1.31.0 or later, with `edition="2018"` in *Cargo.toml* of -all projects to use Rust 2018 Edition idioms. See the “Installation” section of -Chapter 1 to install or update Rust, and see the new Appendix E for information -on what editions of Rust are. - -The 2018 Edition of the Rust language includes a number of improvements to make -Rust more ergonomic and easier to learn. This printing of the book has a number -of changes to reflect the improvements: - -- Chapter 7, "Managing Growing Projects with Packages, Crates, and Modules", - has been mostly rewritten. The module system and the way paths work in the - 2018 Edition have been made more consistent. -- Chapter 10 has new sections titled "Traits as Parameters" and "Returning - Types that Implement Traits" that explain the new `impl Trait` syntax. -- Chapter 11 has a new section "Using `Result` in Tests" that shows how - to write tests that can use the `?` operator. -- The "Advanced Lifetimes" section of Chapter 19 has been removed as compiler - improvements have made the constructs in that section even more rare. -- The previous Appendix D on macros has been expanded to include procedural - macros, and has been moved to the "Macros" section in Chapter 19. -- Appendix A, "Keywords", also explains the new raw identifiers feature that - enables code written in Rust 2015 and Rust 2018 to interoperate. -- Appendix D now covers useful development tools that have been recently - released. -- We fixed a number of small errors and imprecise wording throughout the book. - Thank you to the readers who reported them! - -Note that any code in the first printing of *The Rust Programming Language* -that compiled will continue to compile without `edition="2018"` in the -project's *Cargo.toml*, even as you update the version of the Rust compiler -that you're using. That's Rust's backwards compatibility guarantees at work! \ No newline at end of file diff --git a/src/doc/book/second-edition/Cargo.lock b/src/doc/book/second-edition/Cargo.lock deleted file mode 100644 index 928f6b1244..0000000000 --- a/src/doc/book/second-edition/Cargo.lock +++ /dev/null @@ -1,142 +0,0 @@ -[[package]] -name = "aho-corasick" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "docopt" -version = "0.6.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lazy_static" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libc" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "memchr" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rust-book" -version = "0.0.1" -dependencies = [ - "docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "strsim" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "thread-id" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "utf8-ranges" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "walkdir" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66" -"checksum docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)" = "4a7ef30445607f6fc8720f0a0a2c7442284b629cf0d049286860fae23e71c4d9" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum lazy_static 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "236eb37a62591d4a41a89b7763d7de3e06ca02d5ab2815446a8bae5d2f8c2d57" -"checksum libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "5ba3df4dcb460b9dfbd070d41c94c19209620c191b0340b929ce748a2bcd42d2" -"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" -"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f" -"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957" -"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" -"checksum strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c" -"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03" -"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5" -"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f" -"checksum walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c66c0b9792f0a765345452775f3adbd28dde9d33f30d13e5dcc5ae17cf6f3780" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/src/doc/book/second-edition/Cargo.toml b/src/doc/book/second-edition/Cargo.toml deleted file mode 100644 index bb6763509f..0000000000 --- a/src/doc/book/second-edition/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "rust-book" -version = "0.0.1" -authors = ["Steve Klabnik "] -description = "The Rust Book" - -[[bin]] -name = "concat_chapters" -path = "tools/src/bin/concat_chapters.rs" - -[[bin]] -name = "lfp" -path = "tools/src/bin/lfp.rs" - -[[bin]] -name = "link2print" -path = "tools/src/bin/link2print.rs" - -[[bin]] -name = "remove_links" -path = "tools/src/bin/remove_links.rs" - -[[bin]] -name = "remove_markup" -path = "tools/src/bin/remove_markup.rs" - -[[bin]] -name = "convert_quotes" -path = "tools/src/bin/convert_quotes.rs" - -[dependencies] -walkdir = "0.1.5" -docopt = "0.6.82" -rustc-serialize = "0.3.19" -regex = "0.1.73" -lazy_static = "0.2.1" diff --git a/src/doc/book/second-edition/LICENSE-APACHE b/src/doc/book/second-edition/LICENSE-APACHE deleted file mode 100644 index 96e9f0458b..0000000000 --- a/src/doc/book/second-edition/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright 2010-2017 The Rust Project Developers - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/src/doc/book/second-edition/LICENSE-MIT b/src/doc/book/second-edition/LICENSE-MIT deleted file mode 100644 index 5a56e6e8ed..0000000000 --- a/src/doc/book/second-edition/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2010-2017 The Rust Project Developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/src/doc/book/second-edition/convert-quotes.sh b/src/doc/book/second-edition/convert-quotes.sh deleted file mode 100644 index aa51dcbddf..0000000000 --- a/src/doc/book/second-edition/convert-quotes.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -set -eu - -dir=$1 - -mkdir -p "tmp/$dir" - -for f in $dir/*.md -do - cat "$f" | cargo run --bin convert_quotes > "tmp/$f" - mv "tmp/$f" "$f" -done diff --git a/src/doc/book/second-edition/doc-to-md.sh b/src/doc/book/second-edition/doc-to-md.sh deleted file mode 100644 index 170727db9f..0000000000 --- a/src/doc/book/second-edition/doc-to-md.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -set -eu - -# Get all the docx files in the tmp dir. -ls tmp/*.docx | \ -# Extract just the filename so we can reuse it easily. -xargs -n 1 basename -s .docx | \ -while IFS= read -r filename; do - # Make a directory to put the XML in. - mkdir -p "tmp/$filename" - # Unzip the docx to get at the XML. - unzip -o "tmp/$filename.docx" -d "tmp/$filename" - # Convert to markdown with XSL. - xsltproc tools/docx-to-md.xsl "tmp/$filename/word/document.xml" | \ - # Hard wrap at 80 chars at word bourdaries. - fold -w 80 -s | \ - # Remove trailing whitespace and save in the `nostarch` dir for comparison. - sed -e "s/ *$//" > "nostarch/$filename.md" -done diff --git a/src/doc/book/second-edition/nostarch.sh b/src/doc/book/second-edition/nostarch.sh deleted file mode 100644 index 6c4173a01c..0000000000 --- a/src/doc/book/second-edition/nostarch.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -set -eu - -cargo build --release - -mkdir -p tmp -rm -rf tmp/*.md - -# Get all the Markdown files in the src dir, -ls src/${1:-""}*.md | \ -# except for `SUMMARY.md`. -grep -v SUMMARY.md | \ -# Extract just the filename so we can reuse it easily. -xargs -n 1 basename | \ -# Remove all links followed by ```, then -# Change all remaining links from Markdown to italicized inline text. -while IFS= read -r filename; do - < "src/$filename" ./target/release/remove_links \ - | ./target/release/link2print \ - | ./target/release/remove_markup > "tmp/$filename" -done -# Concatenate the files into the `nostarch` dir. -./target/release/concat_chapters tmp nostarch diff --git a/src/doc/book/second-edition/style-guide.md b/src/doc/book/second-edition/style-guide.md deleted file mode 100644 index 56677811f4..0000000000 --- a/src/doc/book/second-edition/style-guide.md +++ /dev/null @@ -1,34 +0,0 @@ -# Style Guide - -## Prose - -* Prefer title case for chapter/section headings, ex: `## Generating a Secret - Number` rather than `## Generating a secret number`. -* Prefer italics over single quotes when calling out a term, ex: `is an - *associated function* of` rather than `is an ‘associated function’ of`. -* When talking about a method in prose, DO NOT include the parentheses, ex: - `read_line` rather than `read_line()`. -* Hard wrap at 80 chars -* Prefer not mixing code and not-code in one word, ex: ``Remember when we wrote - `use std::io`?`` rather than ``Remember when we `use`d `std::io`?`` - -## Code - -* Add the file name before markdown blocks to make it clear which file we're - talking about, when applicable. -* When making changes to code, make it clear which parts of the code changed - and which stayed the same... not sure how to do this yet -* Split up long lines as appropriate to keep them under 80 chars if possible -* Use `bash` syntax highlighting for command line output code blocks - -## Links - -Once all the scripts are done: - -* If a link shouldn't be printed, mark it to be ignored - * This includes all "Chapter XX" intra-book links, which *should* be links - for the HTML version -* Make intra-book links and stdlib API doc links relative so they work whether - the book is read offline or on docs.rust-lang.org -* Use markdown links and keep in mind that they will be changed into `text at - *url*` in print, so word them in a way that it reads well in that format diff --git a/src/doc/book/second-edition/tools/docx-to-md.xsl b/src/doc/book/second-edition/tools/docx-to-md.xsl deleted file mode 100644 index 3b60bc34e4..0000000000 --- a/src/doc/book/second-edition/tools/docx-to-md.xsl +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - [TOC] - # - - - - - - ## - - - - - - ### - - - - - - #### - - - - - - ### - - - - - - 1. - - - - - - 1. - - - - - - * - - - - - - * - - - - - - * - - - - - - - - - - - - - ``` - - - - - - - - - - - - - - - - - - - - - ``` - - - - ``` - - ``` - - - - - - - - - - - - - - > - - - - - - > - - - - - - > - - - - - -Unmatched: - - - - - - - - - - - - - - - ` - - ` - - - - - - - - - - - - - - - - - ** - - ** - - - - - - - - - - - - - - - - - * - - * - - - - - - - - - - - - - - diff --git a/src/doc/book/second-edition/tools/src/bin/concat_chapters.rs b/src/doc/book/second-edition/tools/src/bin/concat_chapters.rs deleted file mode 100644 index da02dd34b4..0000000000 --- a/src/doc/book/second-edition/tools/src/bin/concat_chapters.rs +++ /dev/null @@ -1,104 +0,0 @@ -#[macro_use] extern crate lazy_static; -extern crate regex; - -use std::env; -use std::io; -use std::io::{Read, Write}; -use std::process::exit; -use std::fs::{create_dir, read_dir, File}; -use std::path::{Path, PathBuf}; -use std::collections::BTreeMap; - -use regex::Regex; - -static PATTERNS: &'static [(&'static str, &'static str)] = &[ - (r"ch(\d\d)-\d\d-.*\.md", "chapter$1.md"), - (r"appendix-(\d\d).*\.md", "appendix.md"), -]; - -lazy_static! { - static ref MATCHERS: Vec<(Regex, &'static str)> = { - PATTERNS.iter() - .map(|&(expr, repl)| (Regex::new(expr).unwrap(), repl)) - .collect() - }; -} - -fn main() { - let args: Vec = env::args().collect(); - - if args.len() < 3 { - println!("Usage: {} ", args[0]); - exit(1); - } - - let source_dir = ensure_dir_exists(&args[1]).unwrap(); - let target_dir = ensure_dir_exists(&args[2]).unwrap(); - - let mut matched_files = match_files(source_dir, target_dir); - matched_files.sort(); - - for (target_path, source_paths) in group_by_target(matched_files) { - concat_files(source_paths, target_path).unwrap(); - } -} - -fn match_files(source_dir: &Path, target_dir: &Path) -> Vec<(PathBuf, PathBuf)> { - read_dir(source_dir) - .expect("Unable to read source directory") - .filter_map(|maybe_entry| maybe_entry.ok()) - .filter_map(|entry| { - let source_filename = entry.file_name(); - let source_filename = &source_filename.to_string_lossy().into_owned(); - for &(ref regex, replacement) in MATCHERS.iter() { - if regex.is_match(source_filename) { - let target_filename = regex.replace_all(source_filename, replacement); - let source_path = entry.path(); - let mut target_path = PathBuf::from(&target_dir); - target_path.push(target_filename); - return Some((source_path, target_path)); - } - } - None - }) - .collect() -} - -fn group_by_target(matched_files: Vec<(PathBuf, PathBuf)>) -> BTreeMap> { - let mut grouped: BTreeMap> = BTreeMap::new(); - for (source, target) in matched_files { - if let Some(source_paths) = grouped.get_mut(&target) { - source_paths.push(source); - continue; - } - let source_paths = vec![source]; - grouped.insert(target.clone(), source_paths); - } - grouped -} - -fn concat_files(source_paths: Vec, target_path: PathBuf) -> io::Result<()> { - println!("Concatenating into {}:", target_path.to_string_lossy()); - let mut target = try!(File::create(target_path)); - try!(target.write_all(b"\n[TOC]\n")); - - for path in source_paths { - println!(" {}", path.to_string_lossy()); - let mut source = try!(File::open(path)); - let mut contents: Vec = Vec::new(); - try!(source.read_to_end(&mut contents)); - - try!(target.write_all(b"\n")); - try!(target.write_all(&contents)); - try!(target.write_all(b"\n")); - } - Ok(()) -} - -fn ensure_dir_exists(dir_string: &str) -> io::Result<&Path> { - let path = Path::new(dir_string); - if !path.exists() { - try!(create_dir(path)); - } - Ok(&path) -} diff --git a/src/doc/book/second-edition/tools/src/bin/convert_quotes.rs b/src/doc/book/second-edition/tools/src/bin/convert_quotes.rs deleted file mode 100644 index c1e38dac87..0000000000 --- a/src/doc/book/second-edition/tools/src/bin/convert_quotes.rs +++ /dev/null @@ -1,73 +0,0 @@ -use std::io; -use std::io::{Read, Write}; - -fn main() { - let mut is_in_code_block = false; - let mut is_in_inline_code = false; - let mut is_in_html_tag = false; - - let mut buffer = String::new(); - if let Err(e) = io::stdin().read_to_string(&mut buffer) { - panic!(e); - } - - for line in buffer.lines() { - if line.is_empty() { - is_in_inline_code = false; - } - if line.starts_with("```") { - is_in_code_block = !is_in_code_block; - } - if is_in_code_block { - is_in_inline_code = false; - is_in_html_tag = false; - write!(io::stdout(), "{}\n", line).unwrap(); - } else { - let mut modified_line = &mut String::new(); - let mut previous_char = std::char::REPLACEMENT_CHARACTER; - let mut chars_in_line = line.chars(); - - while let Some(possible_match) = chars_in_line.next() { - // Check if inside inline code. - if possible_match == '`' { - is_in_inline_code = !is_in_inline_code; - } - // Check if inside HTML tag. - if possible_match == '<' && !is_in_inline_code { - is_in_html_tag = true; - } - if possible_match == '>' && !is_in_inline_code { - is_in_html_tag = false; - } - - // Replace with right/left apostrophe/quote. - let char_to_push = - if possible_match == '\'' && !is_in_inline_code && !is_in_html_tag { - if (previous_char != std::char::REPLACEMENT_CHARACTER && - !previous_char.is_whitespace()) || - previous_char == '‘' - { - '’' - } else { - '‘' - } - } else if possible_match == '"' && !is_in_inline_code && !is_in_html_tag { - if (previous_char != std::char::REPLACEMENT_CHARACTER && - !previous_char.is_whitespace()) || - previous_char == '“' - { - '”' - } else { - '“' - } - } else { - // Leave untouched. - possible_match - }; - modified_line.push(char_to_push); - previous_char = char_to_push; - } - write!(io::stdout(), "{}\n", modified_line).unwrap(); - } - } -} diff --git a/src/doc/book/second-edition/tools/src/bin/lfp.rs b/src/doc/book/second-edition/tools/src/bin/lfp.rs deleted file mode 100644 index e5ee356944..0000000000 --- a/src/doc/book/second-edition/tools/src/bin/lfp.rs +++ /dev/null @@ -1,242 +0,0 @@ -// We have some long regex literals, so: -// ignore-tidy-linelength - -extern crate rustc_serialize; -extern crate docopt; -use docopt::Docopt; -extern crate walkdir; -use std::{path, fs, io}; -use std::io::{BufRead, Write}; - -fn main () { - let args: Args = Docopt::new(USAGE) - .and_then(|d| d.decode()) - .unwrap_or_else(|e| e.exit()); - - let src_dir = &path::Path::new(&args.arg_src_dir); - let found_errs = walkdir::WalkDir::new(src_dir) - .min_depth(1) - .into_iter() - .map(|entry| { - match entry { - Ok(entry) => entry, - Err(err) => { - eprintln!("{:?}", err); - std::process::exit(911) - }, - } - }) - .map(|entry| { - let path = entry.path(); - if is_file_of_interest(path) { - let err_vec = lint_file(path); - for err in &err_vec { - match *err { - LintingError::LineOfInterest(line_num, ref line) => - eprintln!("{}:{}\t{}", path.display(), line_num, line), - LintingError::UnableToOpenFile => - eprintln!("Unable to open {}.", path.display()), - } - } - !err_vec.is_empty() - } else { - false - } - }) - .collect::>() - .iter() - .any(|result| *result); - - if found_errs { - std::process::exit(1) - } else { - std::process::exit(0) - } -} - -const USAGE: &'static str = " -counter -Usage: - lfp - lfp (-h | --help) -Options: - -h --help Show this screen. -"; - -#[derive(Debug, RustcDecodable)] -struct Args { - arg_src_dir: String, -} - -fn lint_file(path: &path::Path) -> Vec { - match fs::File::open(path) { - Ok(file) => lint_lines(io::BufReader::new(&file).lines()), - Err(_) => vec![LintingError::UnableToOpenFile], - } -} - -fn lint_lines(lines: I) -> Vec - where I: Iterator> { - lines - .enumerate() - .map(|(line_num, line)| { - let raw_line = line.unwrap(); - if is_line_of_interest(&raw_line) { - Err(LintingError::LineOfInterest(line_num, raw_line)) - } else { - Ok(()) - } - }) - .filter(|result| result.is_err()) - .map(|result| result.unwrap_err()) - .collect() -} - -fn is_file_of_interest(path: &path::Path) -> bool { - path.extension() - .map_or(false, |ext| ext == "md") -} - -fn is_line_of_interest(line: &str) -> bool { - !line.split_whitespace() - .filter(|sub_string| - sub_string.contains("file://") && - !sub_string.contains("file:///projects/") - ) - .collect::>() - .is_empty() -} - -#[derive(Debug)] -enum LintingError { - UnableToOpenFile, - LineOfInterest(usize, String) -} - -#[cfg(test)] -mod tests { - - use std::path; - - #[test] - fn lint_file_returns_a_vec_with_errs_when_lines_of_interest_are_found() { - let string = r#" - $ cargo run - Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game) - Running `target/guessing_game` - Guess the number! - The secret number is: 61 - Please input your guess. - 10 - You guessed: 10 - Too small! - Please input your guess. - 99 - You guessed: 99 - Too big! - Please input your guess. - foo - Please input your guess. - 61 - You guessed: 61 - You win! - $ cargo run - Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game) - Running `target/debug/guessing_game` - Guess the number! - The secret number is: 7 - Please input your guess. - 4 - You guessed: 4 - $ cargo run - Running `target/debug/guessing_game` - Guess the number! - The secret number is: 83 - Please input your guess. - 5 - $ cargo run - Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game) - Running `target/debug/guessing_game` - Hello, world! - "#; - - let raw_lines = string.to_string(); - let lines = raw_lines.lines().map(|line| { - Ok(line.to_string()) - }); - - let result_vec = super::lint_lines(lines); - - assert!(!result_vec.is_empty()); - assert_eq!(3, result_vec.len()); - } - - #[test] - fn lint_file_returns_an_empty_vec_when_no_lines_of_interest_are_found() { - let string = r#" - $ cargo run - Compiling guessing_game v0.1.0 (file:///projects/guessing_game) - Running `target/guessing_game` - Guess the number! - The secret number is: 61 - Please input your guess. - 10 - You guessed: 10 - Too small! - Please input your guess. - 99 - You guessed: 99 - Too big! - Please input your guess. - foo - Please input your guess. - 61 - You guessed: 61 - You win! - "#; - - let raw_lines = string.to_string(); - let lines = raw_lines.lines().map(|line| { - Ok(line.to_string()) - }); - - let result_vec = super::lint_lines(lines); - - assert!(result_vec.is_empty()); - } - - #[test] - fn is_file_of_interest_returns_false_when_the_path_is_a_directory() { - let uninteresting_fn = "src/img"; - - assert!(!super::is_file_of_interest(path::Path::new(uninteresting_fn))); - } - - #[test] - fn is_file_of_interest_returns_false_when_the_filename_does_not_have_the_md_extension() { - let uninteresting_fn = "src/img/foo1.png"; - - assert!(!super::is_file_of_interest(path::Path::new(uninteresting_fn))); - } - - #[test] - fn is_file_of_interest_returns_true_when_the_filename_has_the_md_extension() { - let interesting_fn = "src/ch01-00-introduction.md"; - - assert!(super::is_file_of_interest(path::Path::new(interesting_fn))); - } - - #[test] - fn is_line_of_interest_does_not_report_a_line_if_the_line_contains_a_file_url_which_is_directly_followed_by_the_project_path() { - let sample_line = "Compiling guessing_game v0.1.0 (file:///projects/guessing_game)"; - - assert!(!super::is_line_of_interest(sample_line)); - } - - #[test] - fn is_line_of_interest_reports_a_line_if_the_line_contains_a_file_url_which_is_not_directly_followed_by_the_project_path() { - let sample_line = "Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game)"; - - assert!(super::is_line_of_interest(sample_line)); - } -} diff --git a/src/doc/book/second-edition/tools/src/bin/link2print.rs b/src/doc/book/second-edition/tools/src/bin/link2print.rs deleted file mode 100644 index 26f40c84b4..0000000000 --- a/src/doc/book/second-edition/tools/src/bin/link2print.rs +++ /dev/null @@ -1,406 +0,0 @@ -// FIXME: we have some long lines that could be refactored, but it's not a big deal. -// ignore-tidy-linelength - -extern crate regex; - -use std::collections::HashMap; -use std::io; -use std::io::{Read, Write}; -use regex::{Regex, Captures}; - -fn main() { - write_md(parse_links(parse_references(read_md()))); -} - -fn read_md() -> String { - let mut buffer = String::new(); - match io::stdin().read_to_string(&mut buffer) { - Ok(_) => buffer, - Err(error) => panic!(error), - } -} - -fn write_md(output: String) { - write!(io::stdout(), "{}", output).unwrap(); -} - -fn parse_references(buffer: String) -> (String, HashMap) { - let mut ref_map = HashMap::new(); - // FIXME: currently doesn't handle "title" in following line. - let re = Regex::new(r###"(?m)\n?^ {0,3}\[([^]]+)\]:[[:blank:]]*(.*)$"###).unwrap(); - let output = re.replace_all(&buffer, |caps: &Captures| { - let key = caps.at(1).unwrap().to_owned().to_uppercase(); - let val = caps.at(2).unwrap().to_owned(); - if ref_map.insert(key, val).is_some() { - panic!("Did not expect markdown page to have duplicate reference"); - } - "".to_string() - }); - (output, ref_map) -} - -fn parse_links((buffer, ref_map): (String, HashMap)) -> String { - // FIXME: check which punctuation is allowed by spec. - let re = Regex::new(r###"(?:(?P
(?:```(?:[^`]|`[^`])*`?\n```\n)|(?:[^[]`[^`\n]+[\n]?[^`\n]*`))|(?:\[(?P[^]]+)\](?:(?:\([[:blank:]]*(?P[^")]*[^ ])(?:[[:blank:]]*"[^"]*")?\))|(?:\[(?P[^]]*)\]))?))"###).expect("could not create regex");
-    let error_code = Regex::new(r###"^E\d{4}$"###).expect("could not create regex");
-    let output = re.replace_all(&buffer, |caps: &Captures| {
-        match caps.name("pre") {
-            Some(pre_section) => format!("{}", pre_section.to_owned()),
-            None => {
-                let name = caps.name("name").expect("could not get name").to_owned();
-                // Really we should ignore text inside code blocks,
-                // this is a hack to not try to treat `#[derive()]`,
-                // `[profile]`, `[test]`, or `[E\d\d\d\d]` like a link.
-                if name.starts_with("derive(") ||
-                   name.starts_with("profile") ||
-                   name.starts_with("test") ||
-                   error_code.is_match(&name) {
-                    return name
-                }
-
-                let val = match caps.name("val") {
-                    // `[name](link)`
-                    Some(value) => value.to_owned(),
-                    None => {
-                        match caps.name("key") {
-                            Some(key) => {
-                                match key {
-                                    // [name][]
-                                    "" => format!("{}", ref_map.get(&name.to_uppercase()).expect(&format!("could not find url for the link text `{}`", name))),
-                                    // [name][reference]
-                                    _ => format!("{}", ref_map.get(&key.to_uppercase()).expect(&format!("could not find url for the link text `{}`", key))),
-                                }
-                            }
-                            // `[name]` as reference
-                            None => format!("{}", ref_map.get(&name.to_uppercase()).expect(&format!("could not find url for the link text `{}`", name))),
-                        }
-                    }
-                };
-                format!("{} at *{}*", name, val)
-            }
-        }
-    });
-    output
-}
-
-#[cfg(test)]
-mod tests {
-    fn parse(source: String) -> String {
-        super::parse_links(super::parse_references(source))
-    }
-
-    #[test]
-    fn parses_inline_link() {
-        let source = r"This is a [link](http://google.com) that should be expanded".to_string();
-        let target = r"This is a link at *http://google.com* that should be expanded".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_multiline_links() {
-        let source = r"This is a [link](http://google.com) that
-should appear expanded. Another [location](/here/) and [another](http://gogogo)"
-            .to_string();
-        let target = r"This is a link at *http://google.com* that
-should appear expanded. Another location at */here/* and another at *http://gogogo*"
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_reference() {
-        let source = r"This is a [link][theref].
-[theref]: http://example.com/foo
-more text"
-            .to_string();
-        let target = r"This is a link at *http://example.com/foo*.
-more text"
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_implicit_link() {
-        let source = r"This is an [implicit][] link.
-[implicit]: /The Link/"
-            .to_string();
-        let target = r"This is an implicit at */The Link/* link.".to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn parses_refs_with_one_space_indentation() {
-        let source = r"This is a [link][ref]
- [ref]: The link"
-            .to_string();
-        let target = r"This is a link at *The link*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_refs_with_two_space_indentation() {
-        let source = r"This is a [link][ref]
-  [ref]: The link"
-            .to_string();
-        let target = r"This is a link at *The link*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_refs_with_three_space_indentation() {
-        let source = r"This is a [link][ref]
-   [ref]: The link"
-            .to_string();
-        let target = r"This is a link at *The link*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    #[should_panic]
-    fn rejects_refs_with_four_space_indentation() {
-        let source = r"This is a [link][ref]
-    [ref]: The link"
-            .to_string();
-        let target = r"This is a link at *The link*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn ignores_optional_inline_title() {
-        let source = r###"This is a titled [link](http://example.com "My title")."###.to_string();
-        let target = r"This is a titled link at *http://example.com*.".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_title_with_puctuation() {
-        let source = r###"[link](http://example.com "It's Title")"###.to_string();
-        let target = r"link at *http://example.com*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_name_with_punctuation() {
-        let source = r###"[I'm here](there)"###.to_string();
-        let target = r###"I'm here at *there*"###.to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn parses_name_with_utf8() {
-        let source = r###"[user’s forum](the user’s forum)"###.to_string();
-        let target = r###"user’s forum at *the user’s forum*"###.to_string();
-        assert_eq!(parse(source), target);
-    }
-
-
-    #[test]
-    fn parses_reference_with_punctuation() {
-        let source = r###"[link][the ref-ref]
-[the ref-ref]:http://example.com/ref-ref"###
-            .to_string();
-        let target = r###"link at *http://example.com/ref-ref*"###.to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_reference_case_insensitively() {
-        let source = r"[link][Ref]
-[ref]: The reference"
-            .to_string();
-        let target = r"link at *The reference*".to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn parses_link_as_reference_when_reference_is_empty() {
-        let source = r"[link as reference][]
-[link as reference]: the actual reference"
-            .to_string();
-        let target = r"link as reference at *the actual reference*".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn parses_link_without_reference_as_reference() {
-        let source = r"[link] is alone
-[link]: The contents"
-            .to_string();
-        let target = r"link at *The contents* is alone".to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    #[ignore]
-    fn parses_link_without_reference_as_reference_with_asterisks() {
-        let source = r"*[link]* is alone
-[link]: The contents"
-            .to_string();
-        let target = r"*link* at *The contents* is alone".to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_links_in_pre_sections() {
-        let source = r###"```toml
-[package]
-name = "hello_cargo"
-version = "0.1.0"
-authors = ["Your Name "]
-
-[dependencies]
-```
-"###
-            .to_string();
-        let target = source.clone();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn ignores_links_in_quoted_sections() {
-        let source = r###"do not change `[package]`."###.to_string();
-        let target = source.clone();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_links_in_quoted_sections_containing_newlines() {
-        let source = r"do not change `this [package]
-is still here` [link](ref)"
-            .to_string();
-        let target = r"do not change `this [package]
-is still here` link at *ref*"
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-
-    #[test]
-    fn ignores_links_in_pre_sections_while_still_handling_links() {
-        let source = r###"```toml
-[package]
-name = "hello_cargo"
-version = "0.1.0"
-authors = ["Your Name "]
-
-[dependencies]
-```
-Another [link]
-more text
-[link]: http://gohere
-"###
-            .to_string();
-        let target = r###"```toml
-[package]
-name = "hello_cargo"
-version = "0.1.0"
-authors = ["Your Name "]
-
-[dependencies]
-```
-Another link at *http://gohere*
-more text
-"###
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_quotes_in_pre_sections() {
-        let source = r###"```bash
-$ cargo build
-   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
-src/main.rs:23:21: 23:35 error: mismatched types [E0308]
-src/main.rs:23     match guess.cmp(&secret_number) {
-                                   ^~~~~~~~~~~~~~
-src/main.rs:23:21: 23:35 help: run `rustc --explain E0308` to see a detailed explanation
-src/main.rs:23:21: 23:35 note: expected type `&std::string::String`
-src/main.rs:23:21: 23:35 note:    found type `&_`
-error: aborting due to previous error
-Could not compile `guessing_game`.
-```
-"###
-            .to_string();
-        let target = source.clone();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_short_quotes() {
-        let source = r"to `1` at index `[0]` i".to_string();
-        let target = source.clone();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn ignores_pre_sections_with_final_quote() {
-        let source = r###"```bash
-$ cargo run
-   Compiling points v0.1.0 (file:///projects/points)
-error: the trait bound `Point: std::fmt::Display` is not satisfied [--explain E0277]
- --> src/main.rs:8:29
-8 |>     println!("Point 1: {}", p1);
-  |>                             ^^
-:2:27: 2:58: note: in this expansion of format_args!
-:3:1: 3:54: note: in this expansion of print! (defined in )
-src/main.rs:8:5: 8:33: note: in this expansion of println! (defined in )
-note: `Point` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string
-note: required by `std::fmt::Display::fmt`
-```
-`here` is another [link](the ref)
-"###.to_string();
-        let target = r###"```bash
-$ cargo run
-   Compiling points v0.1.0 (file:///projects/points)
-error: the trait bound `Point: std::fmt::Display` is not satisfied [--explain E0277]
- --> src/main.rs:8:29
-8 |>     println!("Point 1: {}", p1);
-  |>                             ^^
-:2:27: 2:58: note: in this expansion of format_args!
-:3:1: 3:54: note: in this expansion of print! (defined in )
-src/main.rs:8:5: 8:33: note: in this expansion of println! (defined in )
-note: `Point` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string
-note: required by `std::fmt::Display::fmt`
-```
-`here` is another link at *the ref*
-"###.to_string();
-        assert_eq!(parse(source), target);
-    }
-    #[test]
-    fn parses_adam_p_cheatsheet() {
-        let source = r###"[I'm an inline-style link](https://www.google.com)
-
-[I'm an inline-style link with title](https://www.google.com "Google's Homepage")
-
-[I'm a reference-style link][Arbitrary case-insensitive reference text]
-
-[I'm a relative reference to a repository file](../blob/master/LICENSE)
-
-[You can use numbers for reference-style link definitions][1]
-
-Or leave it empty and use the [link text itself][].
-
-URLs and URLs in angle brackets will automatically get turned into links.
-http://www.example.com or  and sometimes
-example.com (but not on Github, for example).
-
-Some text to show that the reference links can follow later.
-
-[arbitrary case-insensitive reference text]: https://www.mozilla.org
-[1]: http://slashdot.org
-[link text itself]: http://www.reddit.com"###
-            .to_string();
-
-        let target = r###"I'm an inline-style link at *https://www.google.com*
-
-I'm an inline-style link with title at *https://www.google.com*
-
-I'm a reference-style link at *https://www.mozilla.org*
-
-I'm a relative reference to a repository file at *../blob/master/LICENSE*
-
-You can use numbers for reference-style link definitions at *http://slashdot.org*
-
-Or leave it empty and use the link text itself at *http://www.reddit.com*.
-
-URLs and URLs in angle brackets will automatically get turned into links.
-http://www.example.com or  and sometimes
-example.com (but not on Github, for example).
-
-Some text to show that the reference links can follow later.
-"###
-            .to_string();
-        assert_eq!(parse(source), target);
-    }
-}
diff --git a/src/doc/book/second-edition/tools/src/bin/remove_links.rs b/src/doc/book/second-edition/tools/src/bin/remove_links.rs
deleted file mode 100644
index 0ea88639a8..0000000000
--- a/src/doc/book/second-edition/tools/src/bin/remove_links.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-extern crate regex;
-
-use std::io;
-use std::io::{Read, Write};
-use regex::{Regex, Captures};
-use std::collections::HashSet;
-
-fn main () {
-    let mut buffer = String::new();
-    if let Err(e) = io::stdin().read_to_string(&mut buffer) {
-        panic!(e);
-    }
-
-    let mut refs = HashSet::new();
-
-    // Capture all links and link references.
-    let regex = r"\[([^\]]+)\](?:(?:\[([^\]]+)\])|(?:\([^\)]+\)))(?i)";
-    let link_regex = Regex::new(regex).unwrap();
-    let first_pass = link_regex.replace_all(&buffer, |caps: &Captures| {
-
-        // Save the link reference we want to delete.
-        if let Some(reference) = caps.at(2) {
-            refs.insert(reference.to_owned());
-        }
-
-        // Put the link title back.
-        caps.at(1).unwrap().to_owned()
-    });
-
-    // Search for the references we need to delete.
-    let ref_regex = Regex::new(r"\n\[([^\]]+)\]:\s.*\n").unwrap();
-    let out = ref_regex.replace_all(&first_pass, |caps: &Captures| {
-        let capture = caps.at(1).unwrap().to_owned();
-
-        // Check if we've marked this reference for deletion ...
-        if refs.contains(capture.as_str()) {
-            return "".to_string();
-        }
-
-        // ... else we put back everything we captured.
-        caps.at(0).unwrap().to_owned()
-    });
-
-    write!(io::stdout(), "{}", out).unwrap();
-}
diff --git a/src/doc/book/second-edition/tools/src/bin/remove_markup.rs b/src/doc/book/second-edition/tools/src/bin/remove_markup.rs
deleted file mode 100644
index be444bfd9a..0000000000
--- a/src/doc/book/second-edition/tools/src/bin/remove_markup.rs
+++ /dev/null
@@ -1,52 +0,0 @@
-extern crate regex;
-
-use std::io;
-use std::io::{Read, Write};
-use regex::{Regex, Captures};
-
-fn main() {
-    write_md(remove_markup(read_md()));
-}
-
-fn read_md() -> String {
-    let mut buffer = String::new();
-    match io::stdin().read_to_string(&mut buffer) {
-        Ok(_) => buffer,
-        Err(error) => panic!(error),
-    }
-}
-
-fn write_md(output: String) {
-    write!(io::stdout(), "{}", output).unwrap();
-}
-
-fn remove_markup(input: String) -> String {
-    let filename_regex = Regex::new(r#"\A(.*)\z"#).unwrap();
-    // Captions sometimes take up multiple lines.
-    let caption_start_regex = Regex::new(r#"\A(.*)\z"#).unwrap();
-    let caption_end_regex = Regex::new(r#"(.*)\z"#).unwrap();
-    let regexen = vec![filename_regex, caption_start_regex, caption_end_regex];
-
-    let lines: Vec<_> = input.lines().flat_map(|line| {
-        // Remove our figure and caption markup.
-        if line == "
" || - line == "
" || - line == "
" || - line == "
" - { - None - // Remove our syntax highlighting and rustdoc markers. - } else if line.starts_with("```") { - Some(String::from("```")) - // Remove the span around filenames and captions. - } else { - let result = regexen.iter().fold(line.to_string(), |result, regex| { - regex.replace_all(&result, |caps: &Captures| { - caps.at(1).unwrap().to_owned() - }) - }); - Some(result) - } - }).collect(); - lines.join("\n") -} diff --git a/src/doc/book/src/appendix-01-keywords.md b/src/doc/book/src/appendix-01-keywords.md index 6a129e2903..ef1c51d571 100644 --- a/src/doc/book/src/appendix-01-keywords.md +++ b/src/doc/book/src/appendix-01-keywords.md @@ -15,6 +15,8 @@ The following keywords currently have the functionality described. * `as` - perform primitive casting, disambiguate the specific trait containing an item, or rename items in `use` and `extern crate` statements +* `async` - return a `Future` instead of blocking the current thread +* `await` - suspend execution until the result of a `Future` is ready * `break` - exit a loop immediately * `const` - define constant items or constant raw pointers * `continue` - continue to the next loop iteration @@ -59,8 +61,6 @@ The following keywords do not have any functionality but are reserved by Rust for potential future use. * `abstract` -* `async` -* `await` * `become` * `box` * `do` diff --git a/src/doc/book/src/ch04-02-references-and-borrowing.md b/src/doc/book/src/ch04-02-references-and-borrowing.md index f75d5c91b8..985f17f172 100644 --- a/src/doc/book/src/ch04-02-references-and-borrowing.md +++ b/src/doc/book/src/ch04-02-references-and-borrowing.md @@ -234,11 +234,7 @@ through the last time that reference is used. For instance, this code will compile because the last usage of the immutable references occurs before the mutable reference is introduced: - - -```rust,edition2018,ignore +```rust,edition2018 let mut s = String::from("hello"); let r1 = &s; // no problem diff --git a/src/doc/book/src/ch07-00-managing-growing-projects-with-packages-crates-and-modules.md b/src/doc/book/src/ch07-00-managing-growing-projects-with-packages-crates-and-modules.md index 241ddd2b09..b61cae42d5 100644 --- a/src/doc/book/src/ch07-00-managing-growing-projects-with-packages-crates-and-modules.md +++ b/src/doc/book/src/ch07-00-managing-growing-projects-with-packages-crates-and-modules.md @@ -34,7 +34,7 @@ same name in the same scope; tools are available to resolve name conflicts. Rust has a number of features that allow you to manage your code’s organization, including which details are exposed, which details are private, and what names are in each scope in your programs. These features, sometimes -collectively referred to as the *module system*, and include: +collectively referred to as the *module system*, include: * **Packages:** A Cargo feature that lets you build, test, and share crates * **Crates:** A tree of modules that produces a library or executable diff --git a/src/doc/book/src/ch11-02-running-tests.md b/src/doc/book/src/ch11-02-running-tests.md index fdf968f8b2..26293d1902 100644 --- a/src/doc/book/src/ch11-02-running-tests.md +++ b/src/doc/book/src/ch11-02-running-tests.md @@ -115,28 +115,39 @@ is printed when the test that passes runs. That output has been captured. The output from the test that failed, `I got the value 8`, appears in the section of the test summary output, which also shows the cause of the test failure. -If we want to see printed values for passing tests as well, we can disable the -output capture behavior by using the `--nocapture` flag: +If we want to see printed values for passing tests as well, we can tell Rust +to also show the output of successful tests at the end with `--show-output`. ```text -$ cargo test -- --nocapture +$ cargo test -- --show-output ``` -When we run the tests in Listing 11-10 again with the `--nocapture` flag, we +When we run the tests in Listing 11-10 again with the `--show-output` flag, we see the following output: ```text running 2 tests +test tests::this_test_will_pass ... ok +test tests::this_test_will_fail ... FAILED + +successes: + +---- tests::this_test_will_pass stdout ---- I got the value 4 + + +successes: + tests::this_test_will_pass + +failures: + +---- tests::this_test_will_fail stdout ---- I got the value 8 -test tests::this_test_will_pass ... ok thread 'tests::this_test_will_fail' panicked at 'assertion failed: `(left == right)` left: `5`, right: `10`', src/lib.rs:19:9 -note: Run with `RUST_BACKTRACE=1` for a backtrace. -test tests::this_test_will_fail ... FAILED +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. -failures: failures: tests::this_test_will_fail @@ -144,11 +155,6 @@ failures: test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out ``` -Note that the output for the tests and the test results are interleaved; the -reason is that the tests are running in parallel, as we talked about in the -previous section. Try using the `--test-threads=1` option and the `--nocapture` -flag, and see what the output looks like then! - ### Running a Subset of Tests by Name Sometimes, running a full test suite can take a long time. If you’re working on diff --git a/src/doc/book/src/ch18-03-pattern-syntax.md b/src/doc/book/src/ch18-03-pattern-syntax.md index 31b96a88b3..ccbcbd9ad4 100644 --- a/src/doc/book/src/ch18-03-pattern-syntax.md +++ b/src/doc/book/src/ch18-03-pattern-syntax.md @@ -281,7 +281,7 @@ fn main() { match msg { Message::Quit => { println!("The Quit variant has no data to destructure.") - }, + } Message::Move { x, y } => { println!( "Move in the x direction {} and in the y direction {}", @@ -356,7 +356,7 @@ fn main() { g, b ) - }, + } Message::ChangeColor(Color::Hsv(h, s, v)) => { println!( "Change the color to hue {}, saturation {}, and value {}", diff --git a/src/doc/book/src/ch20-03-graceful-shutdown-and-cleanup.md b/src/doc/book/src/ch20-03-graceful-shutdown-and-cleanup.md index e255e32a81..174378b935 100644 --- a/src/doc/book/src/ch20-03-graceful-shutdown-and-cleanup.md +++ b/src/doc/book/src/ch20-03-graceful-shutdown-and-cleanup.md @@ -1,6 +1,6 @@ ## Graceful Shutdown and Cleanup -The code in Listing 20-21 is responding to requests asynchronously through the +The code in Listing 20-20 is responding to requests asynchronously through the use of a thread pool, as we intended. We get some warnings about the `workers`, `id`, and `thread` fields that we’re not using in a direct way that reminds us we’re not cleaning up anything. When we use the less elegant Filename: src/lib.rs @@ -35,7 +35,7 @@ impl Drop for ThreadPool { } ``` -Listing 20-23: Joining each thread when the thread pool +Listing 20-22: Joining each thread when the thread pool goes out of scope First, we loop through each of the thread pool `workers`. We use `&mut` for @@ -178,7 +178,7 @@ thread should run, or it will be a `Terminate` variant that will cause the thread to exit its loop and stop. We need to adjust the channel to use values of type `Message` rather than type -`Job`, as shown in Listing 20-24. +`Job`, as shown in Listing 20-23. Filename: src/lib.rs @@ -217,7 +217,7 @@ impl Worker { Message::NewJob(job) => { println!("Worker {} got a job; executing.", id); - job.call_box(); + job(); }, Message::Terminate => { println!("Worker {} was told to terminate.", id); @@ -236,7 +236,7 @@ impl Worker { } ``` -Listing 20-24: Sending and receiving `Message` values and +Listing 20-23: Sending and receiving `Message` values and exiting the loop if a `Worker` receives `Message::Terminate` To incorporate the `Message` enum, we need to change `Job` to `Message` in two @@ -248,9 +248,9 @@ received, and the thread will break out of the loop if the `Terminate` variant is received. With these changes, the code will compile and continue to function in the same -way as it did after Listing 20-21. But we’ll get a warning because we aren’t +way as it did after Listing 20-20. But we’ll get a warning because we aren’t creating any messages of the `Terminate` variety. Let’s fix this warning by -changing our `Drop` implementation to look like Listing 20-25. +changing our `Drop` implementation to look like Listing 20-24. Filename: src/lib.rs @@ -276,7 +276,7 @@ impl Drop for ThreadPool { } ``` -Listing 20-25: Sending `Message::Terminate` to the +Listing 20-24: Sending `Message::Terminate` to the workers before calling `join` on each worker thread We’re now iterating over the workers twice: once to send one `Terminate` @@ -302,7 +302,7 @@ messages as there are workers, each worker will receive a terminate message before `join` is called on its thread. To see this code in action, let’s modify `main` to accept only two requests -before gracefully shutting down the server, as shown in Listing 20-26. +before gracefully shutting down the server, as shown in Listing 20-25. Filename: src/bin/main.rs @@ -323,7 +323,7 @@ fn main() { } ``` -Listing 20-26: Shut down the server after serving two +Listing 20-25: Shut down the server after serving two requests by exiting the loop You wouldn’t want a real-world web server to shut down after serving only two diff --git a/src/doc/book/tools/src/bin/remove_markup.rs b/src/doc/book/tools/src/bin/remove_markup.rs index 2c285b9ab8..a4d352d131 100644 --- a/src/doc/book/tools/src/bin/remove_markup.rs +++ b/src/doc/book/tools/src/bin/remove_markup.rs @@ -28,15 +28,8 @@ fn remove_markup(input: String) -> String { let regexen = vec![filename_regex, caption_start_regex, caption_end_regex]; let lines: Vec<_> = input.lines().flat_map(|line| { - // Remove our figure and caption markup. - if line == "
" || - line == "
" || - line == "
" || - line == "
" - { - None // Remove our syntax highlighting and rustdoc markers. - } else if line.starts_with("```") { + if line.starts_with("```") { Some(String::from("```")) // Remove the span around filenames and captions. } else { diff --git a/src/doc/edition-guide/src/rust-2018/rustup-for-managing-rust-versions.md b/src/doc/edition-guide/src/rust-2018/rustup-for-managing-rust-versions.md index 1a2f111268..715f3fec13 100644 --- a/src/doc/edition-guide/src/rust-2018/rustup-for-managing-rust-versions.md +++ b/src/doc/edition-guide/src/rust-2018/rustup-for-managing-rust-versions.md @@ -14,24 +14,24 @@ To install Rust through Rustup, you can go to so on your platform. This will install both `rustup` itself and the `stable` version of `rustc` and `cargo`. -To install a specific Rust version, you can use `rustup install`: +To install a specific Rust version, you can use `rustup toolchain install`: ```console -$ rustup install 1.30.0 +$ rustup toolchain install 1.30.0 ``` This works for a specific nightly, as well: ```console -$ rustup install nightly-2018-08-01 +$ rustup toolchain install nightly-2018-08-01 ``` As well as any of our release channels: ```console -$ rustup install stable -$ rustup install beta -$ rustup install nightly +$ rustup toolchain install stable +$ rustup toolchain install beta +$ rustup toolchain install nightly ``` ## For updating your installation @@ -53,6 +53,12 @@ To set the default toolchain to something other than `stable`: $ rustup default nightly ``` +To uninstall a specific Rust version, you can use `rustup toolchain uninstall`: + +```console +$ rustup toolchain uninstall 1.30.0 +``` + To use a toolchain other than the default, use `rustup run`: ```console diff --git a/src/doc/embedded-book/src/start/interrupts.md b/src/doc/embedded-book/src/start/interrupts.md index 278fab02a1..a898708b1e 100644 --- a/src/doc/embedded-book/src/start/interrupts.md +++ b/src/doc/embedded-book/src/start/interrupts.md @@ -39,7 +39,7 @@ Interrupt handlers look like plain functions (except for the lack of arguments) similar to exception handlers. However they can not be called directly by other parts of the firmware due to the special calling conventions. It is however possible to generate interrupt requests in software to trigger a diversion to -to the interrupt handler. +the interrupt handler. Similar to exception handlers it is also possible to declare `static mut` variables inside the interrupt handlers for *safe* state keeping. diff --git a/src/doc/embedded-book/src/static-guarantees/design-contracts.md b/src/doc/embedded-book/src/static-guarantees/design-contracts.md index a62fc3e068..6c3af65db9 100644 --- a/src/doc/embedded-book/src/static-guarantees/design-contracts.md +++ b/src/doc/embedded-book/src/static-guarantees/design-contracts.md @@ -25,7 +25,7 @@ struct GpioConfig { periph: GPIO_CONFIG, } -impl Gpio { +impl GpioConfig { pub fn set_enable(&mut self, is_enabled: bool) { self.periph.modify(|_r, w| { w.enable().set_bit(is_enabled) diff --git a/src/doc/embedded-book/src/static-guarantees/state-machines.md b/src/doc/embedded-book/src/static-guarantees/state-machines.md index b7c24f179c..5a27ffcf34 100644 --- a/src/doc/embedded-book/src/static-guarantees/state-machines.md +++ b/src/doc/embedded-book/src/static-guarantees/state-machines.md @@ -60,7 +60,7 @@ struct GpioConfig { periph: GPIO_CONFIG, } -impl Gpio { +impl GpioConfig { pub fn set_enable(&mut self, is_enabled: bool) { self.periph.modify(|_r, w| { w.enable().set_bit(is_enabled) diff --git a/src/doc/nomicon/.github/workflows/main.yml b/src/doc/nomicon/.github/workflows/main.yml index 3f83cb26ed..1497b13ced 100644 --- a/src/doc/nomicon/.github/workflows/main.yml +++ b/src/doc/nomicon/.github/workflows/main.yml @@ -12,8 +12,8 @@ jobs: - name: Install Rust run: | rustup set profile minimal - rustup toolchain install nightly -c rust-docs - rustup default nightly + rustup toolchain install nightly + rustup default nightly - name: Install mdbook run: | mkdir bin diff --git a/src/doc/nomicon/src/phantom-data.md b/src/doc/nomicon/src/phantom-data.md index fe63606c4a..58ee61d1ed 100644 --- a/src/doc/nomicon/src/phantom-data.md +++ b/src/doc/nomicon/src/phantom-data.md @@ -96,9 +96,7 @@ Here’s a table of all the wonderful ways `PhantomData` could be used: | `PhantomData<&'a mut T>` | variant | invariant | | `PhantomData<*const T>` | - | variant | | `PhantomData<*mut T>` | - | invariant | -| `PhantomData` | - | contravariant (*) | +| `PhantomData` | - | contravariant | | `PhantomData T>` | - | variant | | `PhantomData T>` | - | invariant | | `PhantomData>` | invariant | - | - -(*) If contravariance gets scrapped, this would be invariant. diff --git a/src/doc/nomicon/src/unwinding.md b/src/doc/nomicon/src/unwinding.md index 6dc396d515..7fe7d86f2b 100644 --- a/src/doc/nomicon/src/unwinding.md +++ b/src/doc/nomicon/src/unwinding.md @@ -31,7 +31,7 @@ panics can only be caught by the parent thread. This means catching a panic requires spinning up an entire OS thread! This unfortunately stands in conflict to Rust's philosophy of zero-cost abstractions. -There is an unstable API called `catch_panic` that enables catching a panic +There is an API called `catch_panic` that enables catching a panic without spawning a thread. Still, we would encourage you to only do this sparingly. In particular, Rust's current unwinding implementation is heavily optimized for the "doesn't unwind" case. If a program doesn't unwind, there diff --git a/src/doc/reference/src/abi.md b/src/doc/reference/src/abi.md index e4f1ec0317..f06c2baad6 100644 --- a/src/doc/reference/src/abi.md +++ b/src/doc/reference/src/abi.md @@ -10,8 +10,9 @@ linking external libraries. ## The `used` attribute The *`used` attribute* can only be applied to [`static` items]. This [attribute] forces the -compiler to keep the variable in the output object file (.o, .rlib, etc.) even if the variable is -not used, or referenced, by any other item in the crate. +compiler to keep the variable in the output object file (.o, .rlib, etc. excluding final binaries) +even if the variable is not used, or referenced, by any other item in the crate. +However, the linker is still free to remove such an item. Below is an example that shows under what conditions the compiler keeps a `static` item in the output object file. diff --git a/src/doc/reference/src/expressions/closure-expr.md b/src/doc/reference/src/expressions/closure-expr.md index 74b8e203c6..f49ae697ef 100644 --- a/src/doc/reference/src/expressions/closure-expr.md +++ b/src/doc/reference/src/expressions/closure-expr.md @@ -12,13 +12,13 @@ > _ClosureParam_ :\ >    [_OuterAttribute_]\* [_Pattern_] ( `:` [_Type_] )? -A _closure expression_ defines a closure and denotes it as a value, in a single -expression. A closure expression is a pipe-symbol-delimited (`|`) list of -irrefutable [patterns] followed by an expression. Type annotations may optionally be added -for the type of the parameters or for the return type. If there is a return -type, the expression used for the body of the closure must be a normal -[block]. A closure expression also may begin with the -`move` keyword before the initial `|`. +A _closure expression_, also know as a lambda expression or a lambda, defines a +closure and denotes it as a value, in a single expression. A closure expression +is a pipe-symbol-delimited (`|`) list of irrefutable [patterns] followed by an +expression. Type annotations may optionally be added for the type of the +parameters or for the return type. If there is a return type, the expression +used for the body of the closure must be a normal [block]. A closure expression +also may begin with the `move` keyword before the initial `|`. A closure expression denotes a function that maps a list of parameters onto the expression that follows the parameters. Just like a [`let` binding], the @@ -83,4 +83,4 @@ Attributes on closure parameters follow the same rules and restrictions as [_Pattern_]: ../patterns.md [_Type_]: ../types.md#type-expressions [`let` binding]: ../statements.md#let-statements -[_OuterAttribute_]: ../attributes.md \ No newline at end of file +[_OuterAttribute_]: ../attributes.md diff --git a/src/doc/reference/src/identifiers.md b/src/doc/reference/src/identifiers.md index c0730d1330..809ff3850c 100644 --- a/src/doc/reference/src/identifiers.md +++ b/src/doc/reference/src/identifiers.md @@ -5,7 +5,7 @@ >       [`a`-`z` `A`-`Z`] [`a`-`z` `A`-`Z` `0`-`9` `_`]\*\ >    | `_` [`a`-`z` `A`-`Z` `0`-`9` `_`]+ > -> RAW_IDENTIFIER : `r#` IDENTIFIER_OR_KEYWORD *Except `crate`, `extern`, `self`, `super`, `Self`* +> RAW_IDENTIFIER : `r#` IDENTIFIER_OR_KEYWORD *Except `crate`, `self`, `super`, `Self`* > > NON_KEYWORD_IDENTIFIER : IDENTIFIER_OR_KEYWORD *Except a [strict] or [reserved] keyword* > diff --git a/src/doc/reference/src/items/external-blocks.md b/src/doc/reference/src/items/external-blocks.md index 211a2fa4c2..7acb5ce3cc 100644 --- a/src/doc/reference/src/items/external-blocks.md +++ b/src/doc/reference/src/items/external-blocks.md @@ -38,6 +38,8 @@ Two kind of item _declarations_ are allowed in external blocks: [functions] and [statics]. Calling functions or accessing statics that are declared in external blocks is only allowed in an `unsafe` context. +## Functions + Functions within external blocks are declared in the same way as other Rust functions, with the exception that they may not have a body and are instead terminated by a semicolon. Patterns are not allowed in parameters, only @@ -53,10 +55,18 @@ extern "abi" for<'l1, ..., 'lm> fn(A1, ..., An) -> R`, where `'l1`, ... `'lm` are its lifetime parameters, `A1`, ..., `An` are the declared types of its parameters and `R` is the declared return type. -Statics within external blocks are declared in the same way as statics outside of external blocks, +## Statics + +Statics within external blocks are declared in the same way as [statics] outside of external blocks, except that they do not have an expression initializing their value. It is `unsafe` to access a static item declared in an extern block, whether or -not it's mutable. +not it's mutable, because there is nothing guaranteeing that the bit pattern at the static's +memory is valid for the type it is declared with, since some arbitrary (e.g. C) code is in charge +of initializing the static. + +Extern statics can be either immutable or mutable just like [statics] outside of external blocks. +An immutable static *must* be initialized before any Rust code is executed. It is not enough for +the static to be initialized before Rust code reads from it. ## ABI diff --git a/src/doc/reference/src/macros-by-example.md b/src/doc/reference/src/macros-by-example.md index 34c2d4af9c..499f4bab73 100644 --- a/src/doc/reference/src/macros-by-example.md +++ b/src/doc/reference/src/macros-by-example.md @@ -172,7 +172,7 @@ compiler knows how to expand them properly: `=> { $( $i );* }` is correct and replaces a comma-separated list of identifiers with a semicolon-separated list. 1. Second, each repetition in the transcriber must contain at least one - metavariable to decide now many times to expand it. If multiple + metavariable to decide how many times to expand it. If multiple metavariables appear in the same repetition, they must be bound to the same number of fragments. For instance, `( $( $i:ident ),* ; $( $j:ident ),* ) => ( $( ($i,$j) ),*` must bind the same number of `$i` fragments as `$j` diff --git a/src/doc/reference/src/type-layout.md b/src/doc/reference/src/type-layout.md index 900c6d4ac2..f6c9ca77eb 100644 --- a/src/doc/reference/src/type-layout.md +++ b/src/doc/reference/src/type-layout.md @@ -332,9 +332,10 @@ Like all ways to create undefined behavior in safe Rust, this is a bug. ### The `transparent` Representation -The `transparent` representation can only be used on `struct`s that have a -single non-zero sized field and any number of zero-sized fields, including -[`PhantomData`]. +The `transparent` representation can only be used on `struct`s that have: + +- a single field with non-zero size, and +- any number of fields with size 0 and alignment 1 (e.g. [`PhantomData`]). Structs with this representation have the same layout and ABI as the single non-zero sized field. diff --git a/src/doc/reference/src/types/pointer.md b/src/doc/reference/src/types/pointer.md index 70d8d8c033..8ed3fa8b90 100644 --- a/src/doc/reference/src/types/pointer.md +++ b/src/doc/reference/src/types/pointer.md @@ -40,9 +40,9 @@ reference by reborrowing it (`&*` or `&mut *`). Raw pointers are generally discouraged in Rust code; they exist to support interoperability with foreign code, and writing performance-critical or low-level functions. -When comparing pointers they are compared by their address, rather than by -what they point to. When comparing pointers to [dynamically sized types] they -also have their addition data compared. +When comparing raw pointers they are compared by their address, rather than by +what they point to. When comparing raw pointers to [dynamically sized types] they +also have their additional data compared. ## Smart Pointers diff --git a/src/doc/rust-by-example/book.toml b/src/doc/rust-by-example/book.toml index 60770d4eee..45ae5fd944 100644 --- a/src/doc/rust-by-example/book.toml +++ b/src/doc/rust-by-example/book.toml @@ -6,3 +6,6 @@ author = "The Rust Community" [output.html.playpen] editable = true editor = "ace" + +[output.html.fold] +enable = true diff --git a/src/doc/rust-by-example/src/conversion/try_from_try_into.md b/src/doc/rust-by-example/src/conversion/try_from_try_into.md index 230600bf64..ac62ad154b 100644 --- a/src/doc/rust-by-example/src/conversion/try_from_try_into.md +++ b/src/doc/rust-by-example/src/conversion/try_from_try_into.md @@ -10,7 +10,7 @@ return [`Result`]s. [`TryInto`]: https://doc.rust-lang.org/std/convert/trait.TryInto.html [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html -```rust +```rust,editable use std::convert::TryFrom; use std::convert::TryInto; diff --git a/src/doc/rust-by-example/src/error/multiple_error_types/boxing_errors.md b/src/doc/rust-by-example/src/error/multiple_error_types/boxing_errors.md index e2eb68607e..b0fc2aa3ec 100644 --- a/src/doc/rust-by-example/src/error/multiple_error_types/boxing_errors.md +++ b/src/doc/rust-by-example/src/error/multiple_error_types/boxing_errors.md @@ -13,7 +13,7 @@ use std::error; use std::fmt; // Change the alias to `Box`. -type Result = std::result::Result>; +type Result = std::result::Result>; #[derive(Debug, Clone)] struct EmptyVec; @@ -29,7 +29,7 @@ impl error::Error for EmptyVec { "invalid first item to double" } - fn cause(&self) -> Option<&error::Error> { + fn cause(&self) -> Option<&(dyn error::Error)> { // Generic error, underlying cause isn't tracked. None } diff --git a/src/doc/rust-by-example/src/trait/impl_trait.md b/src/doc/rust-by-example/src/trait/impl_trait.md index 601aaa3b64..7b87bd2e9c 100644 --- a/src/doc/rust-by-example/src/trait/impl_trait.md +++ b/src/doc/rust-by-example/src/trait/impl_trait.md @@ -9,7 +9,7 @@ use std::vec::IntoIter; // This function combines two `Vec` and returns an iterator over it. // Look how complicated its return type is! -fn combine_vecs_explicit_return_type<'a>( +fn combine_vecs_explicit_return_type( v: Vec, u: Vec, ) -> iter::Cycle, IntoIter>> { @@ -18,12 +18,24 @@ fn combine_vecs_explicit_return_type<'a>( // This is the exact same function, but its return type uses `impl Trait`. // Look how much simpler it is! -fn combine_vecs<'a>( +fn combine_vecs( v: Vec, u: Vec, ) -> impl Iterator { v.into_iter().chain(u.into_iter()).cycle() } + +fn main() { + let v1 = vec![1, 2, 3]; + let v2 = vec![4, 5]; + let mut v3 = combine_vecs(v1, v2); + assert_eq!(Some(1), v3.next()); + assert_eq!(Some(2), v3.next()); + assert_eq!(Some(3), v3.next()); + assert_eq!(Some(4), v3.next()); + assert_eq!(Some(5), v3.next()); + println!("all done"); +} ``` More importantly, some Rust types can't be written out. For example, every diff --git a/src/doc/rust-by-example/src/types/alias.md b/src/doc/rust-by-example/src/types/alias.md index c839f53213..5fda9477e8 100644 --- a/src/doc/rust-by-example/src/types/alias.md +++ b/src/doc/rust-by-example/src/types/alias.md @@ -1,7 +1,7 @@ # Aliasing The `type` statement can be used to give a new name to an existing type. Types -must have `CamelCase` names, or the compiler will raise a warning. The +must have `UpperCamelCase` names, or the compiler will raise a warning. The exception to this rule are the primitive types: `usize`, `f32`, etc. ```rust,editable @@ -33,4 +33,4 @@ is an alias for the `Result` type. ### See also: -[Attributes](../attribute.md) \ No newline at end of file +[Attributes](../attribute.md) diff --git a/src/doc/rustc-guide/book.toml b/src/doc/rustc-guide/book.toml index bbba6d60ce..3a5b1fd6dc 100644 --- a/src/doc/rustc-guide/book.toml +++ b/src/doc/rustc-guide/book.toml @@ -15,6 +15,6 @@ level = 1 [output.linkcheck] follow-web-links = true -exclude = [ "crates\\.io", "gcc\\.godbolt\\.org", "youtube\\.com", "youtu\\.be", "dl\\.acm\\.org" ] +exclude = [ "crates\\.io", "gcc\\.godbolt\\.org", "youtube\\.com", "youtu\\.be", "dl\\.acm\\.org", "cs\\.bgu\\.ac\\.il" ] cache-timeout = 172800 warning-policy = "error" diff --git a/src/doc/rustc-guide/src/SUMMARY.md b/src/doc/rustc-guide/src/SUMMARY.md index fe6584b554..125e20cf6f 100644 --- a/src/doc/rustc-guide/src/SUMMARY.md +++ b/src/doc/rustc-guide/src/SUMMARY.md @@ -17,6 +17,7 @@ - [Adding new tests](./tests/adding.md) - [Using `compiletest` + commands to control test execution](./compiletest.md) - [Walkthrough: a typical contribution](./walkthrough.md) + - [Bug Fix Procedure](./bug-fix-procedure.md) - [Implementing new features](./implementing_new_features.md) - [Stability attributes](./stability.md) - [Stabilizing Features](./stabilization_guide.md) @@ -27,6 +28,7 @@ - [crates.io Dependencies](./crates-io.md) - [Emitting Errors and other Diagnostics](diagnostics.md) - [`LintStore`](./diagnostics/lintstore.md) + - [Diagnostic Codes](./diagnostics/diagnostic-codes.md) - [ICE-breaker teams](ice-breaker/about.md) - [LLVM ICE-breakers](ice-breaker/llvm.md) - [Part 2: How rustc works](./part-2-intro.md) @@ -38,9 +40,11 @@ - [Incremental compilation](./queries/incremental-compilation.md) - [Incremental compilation In Detail](./queries/incremental-compilation-in-detail.md) - [Debugging and Testing](./incrcomp-debugging.md) + - [Profiling Queries](./queries/profiling.md) - [Salsa](./salsa.md) - [Lexing and Parsing](./the-parser.md) - [`#[test]` Implementation](./test-implementation.md) + - [Panic Implementation](./panic-implementation.md) - [Macro expansion](./macro-expansion.md) - [Name resolution](./name-resolution.md) - [The HIR (High-level IR)](./hir.md) diff --git a/src/doc/rustc-guide/src/appendix/bibliography.md b/src/doc/rustc-guide/src/appendix/bibliography.md index c3d0446c76..dc06b63f57 100644 --- a/src/doc/rustc-guide/src/appendix/bibliography.md +++ b/src/doc/rustc-guide/src/appendix/bibliography.md @@ -28,7 +28,7 @@ Rust, as well as publications about Rust. * [A Java fork/join calamity](http://www.coopsoft.com/ar/CalamityArticle.html) - critique of Java's fork/join library, particularly its application of work stealing to non-strict computation * [Scheduling techniques for concurrent systems](http://www.stanford.edu/~ouster/cgi-bin/papers/coscheduling.pdf) * [Contention aware scheduling](http://www.blagodurov.net/files/a8-blagodurov.pdf) -* [Balanced work stealing for time-sharing multicores](http://www.cse.ohio-state.edu/hpcs/WWW/HTML/publications/papers/TR-12-1.pdf) +* [Balanced work stealing for time-sharing multicores](https://web.njit.edu/~dingxn/papers/BWS.pdf) * [Three layer cake for shared-memory programming](http://dl.acm.org/citation.cfm?id=1953616&dl=ACM&coll=DL&CFID=524387192&CFTOKEN=44362705) * [Non-blocking steal-half work queues](http://www.cs.bgu.ac.il/%7Ehendlerd/papers/p280-hendler.pdf) * [Reagents: expressing and composing fine-grained concurrency](https://aturon.github.io/academic/reagents.pdf) @@ -45,7 +45,7 @@ Rust, as well as publications about Rust. * [GPU Programming in Rust: Implementing High Level Abstractions in a Systems Level - Language](https://www.cs.indiana.edu/~achauhan/Publications/Pubs/2013-hips-holk-rust.pdf). + Language](https://ieeexplore.ieee.org/document/6650903). Early GPU work by Eric Holk. * [Parallel closures: a new twist on an old idea](https://www.usenix.org/conference/hotpar12/parallel-closures-new-twist-old-idea) diff --git a/src/doc/rustc-guide/src/appendix/code-index.md b/src/doc/rustc-guide/src/appendix/code-index.md index 1c8d1d7076..39e16c1cba 100644 --- a/src/doc/rustc-guide/src/appendix/code-index.md +++ b/src/doc/rustc-guide/src/appendix/code-index.md @@ -6,14 +6,14 @@ compiler. Item | Kind | Short description | Chapter | Declaration ----------------|----------|-----------------------------|--------------------|------------------- -`BodyId` | struct | One of four types of HIR node identifiers | [Identifiers in the HIR] | [src/librustc/hir/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.BodyId.html) +`BodyId` | struct | One of four types of HIR node identifiers | [Identifiers in the HIR] | [src/librustc_hir/hir.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.BodyId.html) `Compiler` | struct | Represents a compiler session and can be used to drive a compilation. | [The Rustc Driver and Interface] | [src/librustc_interface/interface.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/interface/struct.Compiler.html) -`ast::Crate` | struct | A syntax-level representation of a parsed crate | [The parser] | [src/librustc/hir/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax/ast/struct.Crate.html) -`hir::Crate` | struct | A more abstract, compiler-friendly form of a crate's AST | [The Hir] | [src/librustc/hir/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.Crate.html) -`DefId` | struct | One of four types of HIR node identifiers | [Identifiers in the HIR] | [src/librustc/hir/def_id.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/def_id/struct.DefId.html) +`ast::Crate` | struct | A syntax-level representation of a parsed crate | [The parser] | [src/libsyntax/ast.rs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax/ast/struct.Crate.html) +`rustc_hir::Crate` | struct | A more abstract, compiler-friendly form of a crate's AST | [The Hir] | [src/librustc_hir/hir.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.Crate.html) +`DefId` | struct | One of four types of HIR node identifiers | [Identifiers in the HIR] | [src/librustc_hir/def_id.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def_id/struct.DefId.html) `DiagnosticBuilder` | struct | A struct for building up compiler diagnostics, such as errors or lints | [Emitting Diagnostics] | [src/librustc_errors/diagnostic_builder.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/struct.DiagnosticBuilder.html) `DocContext` | struct | A state container used by rustdoc when crawling through a crate to gather its documentation | [Rustdoc] | [src/librustdoc/core.rs](https://github.com/rust-lang/rust/blob/master/src/librustdoc/core.rs) -`HirId` | struct | One of four types of HIR node identifiers | [Identifiers in the HIR] | [src/librustc/hir/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.HirId.html) +`HirId` | struct | One of four types of HIR node identifiers | [Identifiers in the HIR] | [src/librustc_hir/hir_id.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/hir_id/struct.HirId.html) `NodeId` | struct | One of four types of HIR node identifiers. Being phased out | [Identifiers in the HIR] | [src/libsyntax/ast.rs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax/ast/struct.NodeId.html) `P` | struct | An owned immutable smart pointer. By contrast, `&T` is not owned, and `Box` is not immutable. | None | [src/syntax/ptr.rs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax/ptr/struct.P.html) `ParamEnv` | struct | Information about generic parameters or `Self`, useful for working with associated or generic items | [Parameter Environment] | [src/librustc/ty/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.ParamEnv.html) @@ -21,9 +21,9 @@ Item | Kind | Short description | Chapter | `Query` | struct | Represents the result of query to the `Compiler` interface and allows stealing, borrowing, and returning the results of compiler passes. | [The Rustc Driver and Interface] | [src/librustc_interface/queries.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/queries/struct.Query.html) `Rib` | struct | Represents a single scope of names | [Name resolution] | [src/librustc_resolve/lib.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/late/struct.Rib.html) `Session` | struct | The data associated with a compilation session | [The parser], [The Rustc Driver and Interface] | [src/librustc/session/mod.html](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/struct.Session.html) -`SourceFile` | struct | Part of the `SourceMap`. Maps AST nodes to their source code for a single source file. Was previously called FileMap | [The parser] | [src/libsyntax_pos/lib.rs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax/source_map/struct.SourceFile.html) -`SourceMap` | struct | Maps AST nodes to their source code. It is composed of `SourceFile`s. Was previously called CodeMap | [The parser] | [src/libsyntax/source_map.rs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax/source_map/struct.SourceMap.html) -`Span` | struct | A location in the user's source code, used for error reporting primarily | [Emitting Diagnostics] | [src/libsyntax_pos/span_encoding.rs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax_pos/struct.Span.html) +`SourceFile` | struct | Part of the `SourceMap`. Maps AST nodes to their source code for a single source file. Was previously called FileMap | [The parser] | [src/librustc_span/lib.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.SourceFile.html) +`SourceMap` | struct | Maps AST nodes to their source code. It is composed of `SourceFile`s. Was previously called CodeMap | [The parser] | [src/librustc_span/source_map.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/source_map/struct.SourceMap.html) +`Span` | struct | A location in the user's source code, used for error reporting primarily | [Emitting Diagnostics] | [src/librustc_span/span_encoding.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html) `StringReader` | struct | This is the lexer used during parsing. It consumes characters from the raw source code being compiled and produces a series of tokens for use by the rest of the parser | [The parser] | [src/librustc_parse/lexer/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.StringReader.html) `syntax::token_stream::TokenStream` | struct | An abstract sequence of tokens, organized into `TokenTree`s | [The parser], [Macro expansion] | [src/libsyntax/tokenstream.rs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax/tokenstream/struct.TokenStream.html) `TraitDef` | struct | This struct contains a trait's definition with type information | [The `ty` modules] | [src/librustc/ty/trait_def.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/trait_def/struct.TraitDef.html) diff --git a/src/doc/rustc-guide/src/borrow_check.md b/src/doc/rustc-guide/src/borrow_check.md index 0ceb21d72e..034c36253e 100644 --- a/src/doc/rustc-guide/src/borrow_check.md +++ b/src/doc/rustc-guide/src/borrow_check.md @@ -11,13 +11,8 @@ enforcing a number of properties: - That you can't mutate a place while it is immutably borrowed. - etc -At the time of this writing, the code is in a state of transition. The -"main" borrow checker still works by processing [the HIR](hir.html), -but that is being phased out in favor of the MIR-based borrow checker. -Accordingly, this documentation focuses on the new, MIR-based borrow -checker. - -Doing borrow checking on MIR has several advantages: +The borrow checker operates on the MIR. An older implementation operated on the +HIR. Doing borrow checking on MIR has several advantages: - The MIR is *far* less complex than the HIR; the radical desugaring helps prevent bugs in the borrow checker. (If you're curious, you @@ -42,15 +37,15 @@ the [`mir_borrowck`] query. we will modify this copy in place to modify the types and things to include references to the new regions that we are computing. - We then invoke [`replace_regions_in_mir`] to modify our local MIR. - Among other things, this function will replace all of the [regions](./appendix/glossary.html) in - the MIR with fresh [inference variables](./appendix/glossary.html). + Among other things, this function will replace all of the [regions](./appendix/glossary.md) in + the MIR with fresh [inference variables](./appendix/glossary.md). - Next, we perform a number of - [dataflow analyses](./appendix/background.html#dataflow) that + [dataflow analyses](./appendix/background.md#dataflow) that compute what data is moved and when. -- We then do a [second type check](borrow_check/type_check.html) across the MIR: +- We then do a [second type check](borrow_check/type_check.md) across the MIR: the purpose of this type check is to determine all of the constraints between different regions. -- Next, we do [region inference](borrow_check/region_inference.html), which computes +- Next, we do [region inference](borrow_check/region_inference.md), which computes the values of each region — basically, the points in the control-flow graph where each lifetime must be valid according to the constraints we collected. - At this point, we can compute the "borrows in scope" at each point. diff --git a/src/doc/rustc-guide/src/borrow_check/region_inference.md b/src/doc/rustc-guide/src/borrow_check/region_inference.md index 5ae0965743..84d30bdb47 100644 --- a/src/doc/rustc-guide/src/borrow_check/region_inference.md +++ b/src/doc/rustc-guide/src/borrow_check/region_inference.md @@ -1,11 +1,9 @@ # Region inference (NLL) -The MIR-based region checking code is located in -[the `rustc_mir::borrow_check::nll` module][nll]. (NLL, of course, -stands for "non-lexical lifetimes", a term that will hopefully be -deprecated once they become the standard kind of lifetime.) +The MIR-based region checking code is located in [the `rustc_mir::borrow_check` +module][nll]. -[nll]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/index.html +[nll]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/index.html The MIR-based region analysis consists of two major functions: @@ -36,12 +34,12 @@ The MIR-based region analysis consists of two major functions: - The [NLL RFC] also includes fairly thorough (and hopefully readable) coverage. -[cp]: ./region_inference/constraint_propagation.html -[fvb]: ../appendix/background.html#free-vs-bound +[cp]: ./region_inference/constraint_propagation.md +[fvb]: ../appendix/background.md#free-vs-bound [`replace_regions_in_mir`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/fn.replace_regions_in_mir.html [`compute_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/fn.compute_regions.html -[`RegionInferenceContext`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html -[`solve`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#method.solve +[`RegionInferenceContext`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html +[`solve`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.solve [NLL RFC]: https://rust-lang.github.io/rfcs/2094-nll.html [MIR type checker]: ./type_check.md @@ -68,7 +66,7 @@ the moment. TODO: write about _how_ these regions are computed. -[`UniversalRegions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/universal_regions/struct.UniversalRegions.html +[`UniversalRegions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/universal_regions/struct.UniversalRegions.html @@ -84,7 +82,7 @@ maintain a set storing what elements are present in its value (to make this efficient, we give each kind of element an index, the `RegionElementIndex`, and use sparse bitsets). -[ri]: https://github.com/rust-lang/rust/tree/master/src/librustc_mir/borrow_check/nll/region_infer/ +[ri]: https://github.com/rust-lang/rust/tree/master/src/librustc_mir/borrow_check/region_infer/ The kinds of region elements are as follows: @@ -115,7 +113,7 @@ common sorts of constraints are: 2. Liveness constraints. Each region needs to be live at points where it can be used. These constraints are collected by [`generate_constraints`]. -[`generate_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/constraint_generation/fn.generate_constraints.html +[`generate_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/constraint_generation/fn.generate_constraints.html ## Inference Overview @@ -219,12 +217,12 @@ Here are some of the fields of the struct: - [`closure_bounds_mapping`]: used for propagating region constraints from closures back out to the creator of the closure. -[`constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#structfield.constraints -[`liveness_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#structfield.liveness_constraints -[`universal_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#structfield.universal_regions -[`universal_region_relations`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#structfield.universal_region_relations -[`type_tests`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#structfield.type_tests -[`closure_bounds_mapping`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#structfield.closure_bounds_mapping +[`constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.constraints +[`liveness_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.liveness_constraints +[`universal_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.universal_regions +[`universal_region_relations`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.universal_region_relations +[`type_tests`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.type_tests +[`closure_bounds_mapping`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.closure_bounds_mapping TODO: should we discuss any of the others fields? What about the SCCs? @@ -233,6 +231,6 @@ inference. This is done by calling the [`solve`] method on the context. This is where we call [`propagate_constraints`] and then check the resulting type tests and universal regions, as discussed above. -[`propagate_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#method.propagate_constraints -[`check_type_tests`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#method.check_type_tests -[`check_universal_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#method.check_universal_regions +[`propagate_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.propagate_constraints +[`check_type_tests`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.check_type_tests +[`check_universal_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.check_universal_regions diff --git a/src/doc/rustc-guide/src/borrow_check/region_inference/constraint_propagation.md b/src/doc/rustc-guide/src/borrow_check/region_inference/constraint_propagation.md index 5f3b29c6d3..ee86ae1483 100644 --- a/src/doc/rustc-guide/src/borrow_check/region_inference/constraint_propagation.md +++ b/src/doc/rustc-guide/src/borrow_check/region_inference/constraint_propagation.md @@ -10,7 +10,7 @@ on one at a time (each of them is fairly independent from the others): - outlives constraints (`R1: R2`), which arise from subtyping; - [member constraints][m_c] (`member R_m of [R_c...]`), which arise from impl Trait. -[`propagate_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#method.propagate_constraints +[`propagate_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.propagate_constraints [m_c]: ./member_constraints.md In this chapter, we'll explain the "heart" of constraint propagation, @@ -68,8 +68,8 @@ though; instead, we store a (sparse) bitset per region variable (of type [`LivenessValues`]). This way we only need a single bit for each liveness constraint. -[`liveness_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#structfield.liveness_constraints -[`LivenessValues`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/values/struct.LivenessValues.html +[`liveness_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.liveness_constraints +[`LivenessValues`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/values/struct.LivenessValues.html One thing that is worth mentioning: All lifetime parameters are always considered to be live over the entire function body. This is because @@ -112,9 +112,9 @@ induces an edge `'a -> 'b`. This conversion happens in the [`RegionInferenceContext::new`] function that creates the inference context. -[`ConstraintSet`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/constraints/struct.OutlivesConstraintSet.html -[graph-fn]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/constraints/struct.OutlivesConstraintSet.html#method.graph -[`RegionInferenceContext::new`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#method.new +[`ConstraintSet`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/constraints/struct.OutlivesConstraintSet.html +[graph-fn]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/constraints/struct.OutlivesConstraintSet.html#method.graph +[`RegionInferenceContext::new`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.new When using a graph representation, we can detect regions that must be equal by looking for cycles. That is, if you have a constraint like @@ -146,8 +146,8 @@ of fields are defined in terms of SCCs. For example, the of a specific region `'a` then, we first figure out the SCC that the region is a part of, and then find the value of that SCC. -[`constraint_sccs`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#structfield.constraint_sccs -[`scc_values`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#structfield.scc_values +[`constraint_sccs`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.constraint_sccs +[`scc_values`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#structfield.scc_values When we compute SCCs, we not only figure out which regions are a member of each SCC, we also figure out the edges between them. So for example diff --git a/src/doc/rustc-guide/src/borrow_check/region_inference/lifetime_parameters.md b/src/doc/rustc-guide/src/borrow_check/region_inference/lifetime_parameters.md index 0d5219aa96..4086b71ef4 100644 --- a/src/doc/rustc-guide/src/borrow_check/region_inference/lifetime_parameters.md +++ b/src/doc/rustc-guide/src/borrow_check/region_inference/lifetime_parameters.md @@ -29,9 +29,9 @@ relationships to one another. So if you have e.g. `where 'a: 'b`, then the [`UniversalRegionRelations`] struct would track that `'a: 'b` is known to hold (which could be tested with the [`outlives`] function. -[`UniversalRegions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/universal_regions/struct.UniversalRegions.html -[`UniversalRegionRelations`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/type_check/free_region_relations/struct.UniversalRegionRelations.html -[`outlives`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/type_check/free_region_relations/struct.UniversalRegionRelations.html#method.outlives +[`UniversalRegions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/universal_regions/struct.UniversalRegions.html +[`UniversalRegionRelations`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/type_check/free_region_relations/struct.UniversalRegionRelations.html +[`outlives`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/type_check/free_region_relations/struct.UniversalRegionRelations.html#method.outlives ## Everything is a region variable @@ -56,7 +56,7 @@ type). These subdivisions are not important for the topics discussed here, but become important when we consider [closure constraint propagation](./closure_constraints.html), so we discuss them there. -[`RegionClassification`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/universal_regions/enum.RegionClassification.html#variant.Local +[`RegionClassification`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/universal_regions/enum.RegionClassification.html#variant.Local ## Universal lifetimes as the elements of a region's value @@ -86,7 +86,7 @@ liveness constraint (i.e., `'a` must extend until the end of itself). In the code, these liveness constraints are setup in [`init_free_and_bound_regions`]. -[`init_free_and_bound_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#method.init_free_and_bound_regions +[`init_free_and_bound_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.init_free_and_bound_regions ## Propagating outlives constraints for universal regions @@ -122,4 +122,4 @@ not, as in our example, that is an error. This check is done in the universal regions, inspects their final value, and tests against the declared [`UniversalRegionRelations`]. -[`check_universal_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/region_infer/struct.RegionInferenceContext.html#method.check_universal_regions +[`check_universal_regions`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/region_infer/struct.RegionInferenceContext.html#method.check_universal_regions diff --git a/src/doc/rustc-guide/src/borrow_check/two_phase_borrows.md b/src/doc/rustc-guide/src/borrow_check/two_phase_borrows.md index 09e7fbefe5..f036c3a8c5 100644 --- a/src/doc/rustc-guide/src/borrow_check/two_phase_borrows.md +++ b/src/doc/rustc-guide/src/borrow_check/two_phase_borrows.md @@ -74,7 +74,7 @@ The activation points are found using the [`GatherBorrows`] visitor. The borrow. [`AutoBorrow`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/adjustment/enum.AutoBorrow.html -[converted]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/hair/cx/expr/trait.ToBorrowKind.html#method.to_borrow_kind +[converted]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/hair/cx/expr/trait.ToBorrowKind.html#method.to_borrow_kind [`BorrowKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/mir/enum.BorrowKind.html [`GatherBorrows`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/mir/visit/trait.Visitor.html#method.visit_local [`BorrowData`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/borrow_set/struct.BorrowData.html diff --git a/src/doc/rustc-guide/src/borrow_check/type_check.md b/src/doc/rustc-guide/src/borrow_check/type_check.md index ee955d9717..0db895619e 100644 --- a/src/doc/rustc-guide/src/borrow_check/type_check.md +++ b/src/doc/rustc-guide/src/borrow_check/type_check.md @@ -1,7 +1,7 @@ # The MIR type-check A key component of the borrow check is the -[MIR type-check](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/nll/type_check/index.html). +[MIR type-check](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/type_check/index.html). This check walks the MIR and does a complete "type check" -- the same kind you might find in any other language. In the process of doing this type-check, we also uncover the region constraints that apply to diff --git a/src/doc/rustc-guide/src/bug-fix-procedure.md b/src/doc/rustc-guide/src/bug-fix-procedure.md new file mode 100644 index 0000000000..0f6d6c973b --- /dev/null +++ b/src/doc/rustc-guide/src/bug-fix-procedure.md @@ -0,0 +1,330 @@ +# Rustc Bug Fix Procedure +This page defines the best practices procedure for making bug fixes or soundness +corrections in the compiler that can cause existing code to stop compiling. This +text is based on +[RFC 1589](https://github.com/rust-lang/rfcs/blob/master/text/1589-rustc-bug-fix-procedure.md). + +# Motivation + +[motivation]: #motivation + +From time to time, we encounter the need to make a bug fix, soundness +correction, or other change in the compiler which will cause existing code to +stop compiling. When this happens, it is important that we handle the change in +a way that gives users of Rust a smooth transition. What we want to avoid is +that existing programs suddenly stop compiling with opaque error messages: we +would prefer to have a gradual period of warnings, with clear guidance as to +what the problem is, how to fix it, and why the change was made. This RFC +describes the procedure that we have been developing for handling breaking +changes that aims to achieve that kind of smooth transition. + +One of the key points of this policy is that (a) warnings should be issued +initially rather than hard errors if at all possible and (b) every change that +causes existing code to stop compiling will have an associated tracking issue. +This issue provides a point to collect feedback on the results of that change. +Sometimes changes have unexpectedly large consequences or there may be a way to +avoid the change that was not considered. In those cases, we may decide to +change course and roll back the change, or find another solution (if warnings +are being used, this is particularly easy to do). + +### What qualifies as a bug fix? + +Note that this RFC does not try to define when a breaking change is permitted. +That is already covered under [RFC 1122][]. This document assumes that the +change being made is in accordance with those policies. Here is a summary of the +conditions from RFC 1122: + +- **Soundness changes:** Fixes to holes uncovered in the type system. +- **Compiler bugs:** Places where the compiler is not implementing the specified + semantics found in an RFC or lang-team decision. +- **Underspecified language semantics:** Clarifications to grey areas where the + compiler behaves inconsistently and no formal behavior had been previously + decided. + +Please see [the RFC][rfc 1122] for full details! + +# Detailed design + +[design]: #detailed-design + +The procedure for making a breaking change is as follows (each of these steps is +described in more detail below): + +0. Do a **crater run** to assess the impact of the change. +1. Make a **special tracking issue** dedicated to the change. +1. Do not report an error right away. Instead, **issue forwards-compatibility + lint warnings**. + - Sometimes this is not straightforward. See the text below for suggestions + on different techniques we have employed in the past. + - For cases where warnings are infeasible: + - Report errors, but make every effort to give a targeted error message + that directs users to the tracking issue + - Submit PRs to all known affected crates that fix the issue + - or, at minimum, alert the owners of those crates to the problem and + direct them to the tracking issue +1. Once the change has been in the wild for at least one cycle, we can + **stabilize the change**, converting those warnings into errors. + +Finally, for changes to libsyntax that will affect plugins, the general policy +is to batch these changes. That is discussed below in more detail. + +### Tracking issue + +Every breaking change should be accompanied by a **dedicated tracking issue** +for that change. The main text of this issue should describe the change being +made, with a focus on what users must do to fix their code. The issue should be +approachable and practical; it may make sense to direct users to an RFC or some +other issue for the full details. The issue also serves as a place where users +can comment with questions or other concerns. + +A template for these breaking-change tracking issues can be found below. An +example of how such an issue should look can be [found +here][breaking-change-issue]. + +The issue should be tagged with (at least) `B-unstable` and `T-compiler`. + +### Tracking issue template + +This is a template to use for tracking issues: + +``` +This is the **summary issue** for the `YOUR_LINT_NAME_HERE` +future-compatibility warning and other related errors. The goal of +this page is describe why this change was made and how you can fix +code that is affected by it. It also provides a place to ask questions +or register a complaint if you feel the change should not be made. For +more information on the policy around future-compatibility warnings, +see our [breaking change policy guidelines][guidelines]. + +[guidelines]: LINK_TO_THIS_RFC + +#### What is the warning for? + +*Describe the conditions that trigger the warning and how they can be +fixed. Also explain why the change was made.** + +#### When will this warning become a hard error? + +At the beginning of each 6-week release cycle, the Rust compiler team +will review the set of outstanding future compatibility warnings and +nominate some of them for **Final Comment Period**. Toward the end of +the cycle, we will review any comments and make a final determination +whether to convert the warning into a hard error or remove it +entirely. +``` + +### Issuing future compatibility warnings + +The best way to handle a breaking change is to begin by issuing +future-compatibility warnings. These are a special category of lint warning. +Adding a new future-compatibility warning can be done as follows. + +```rust +// 1. Define the lint in `src/librustc/lint/builtin.rs`: +declare_lint! { + pub YOUR_ERROR_HERE, + Warn, + "illegal use of foo bar baz" +} + +// 2. Add to the list of HardwiredLints in the same file: +impl LintPass for HardwiredLints { + fn get_lints(&self) -> LintArray { + lint_array!( + .., + YOUR_ERROR_HERE + ) + } +} + +// 3. Register the lint in `src/librustc_lint/lib.rs`: +store.register_future_incompatible(sess, vec![ + ..., + FutureIncompatibleInfo { + id: LintId::of(YOUR_ERROR_HERE), + reference: "issue #1234", // your tracking issue here! + }, +]); + +// 4. Report the lint: +tcx.lint_node( + lint::builtin::YOUR_ERROR_HERE, + path_id, + binding.span, + format!("some helper message here")); +``` + +#### Helpful techniques + +It can often be challenging to filter out new warnings from older, pre-existing +errors. One technique that has been used in the past is to run the older code +unchanged and collect the errors it would have reported. You can then issue +warnings for any errors you would give which do not appear in that original set. +Another option is to abort compilation after the original code completes if +errors are reported: then you know that your new code will only execute when +there were no errors before. + +#### Crater and crates.io + +We should always do a crater run to assess impact. It is polite and considerate +to at least notify the authors of affected crates the breaking change. If we can +submit PRs to fix the problem, so much the better. + +#### Is it ever acceptable to go directly to issuing errors? + +Changes that are believed to have negligible impact can go directly to issuing +an error. One rule of thumb would be to check against `crates.io`: if fewer than +10 **total** affected projects are found (**not** root errors), we can move +straight to an error. In such cases, we should still make the "breaking change" +page as before, and we should ensure that the error directs users to this page. +In other words, everything should be the same except that users are getting an +error, and not a warning. Moreover, we should submit PRs to the affected +projects (ideally before the PR implementing the change lands in rustc). + +If the impact is not believed to be negligible (e.g., more than 10 crates are +affected), then warnings are required (unless the compiler team agrees to grant +a special exemption in some particular case). If implementing warnings is not +feasible, then we should make an aggressive strategy of migrating crates before +we land the change so as to lower the number of affected crates. Here are some +techniques for approaching this scenario: + +1. Issue warnings for subparts of the problem, and reserve the new errors for + the smallest set of cases you can. +2. Try to give a very precise error message that suggests how to fix the problem + and directs users to the tracking issue. +3. It may also make sense to layer the fix: + - First, add warnings where possible and let those land before proceeding to + issue errors. + - Work with authors of affected crates to ensure that corrected versions are + available _before_ the fix lands, so that downstream users can use them. + +### Stabilization + +After a change is made, we will **stabilize** the change using the same process +that we use for unstable features: + +- After a new release is made, we will go through the outstanding tracking + issues corresponding to breaking changes and nominate some of them for **final + comment period** (FCP). +- The FCP for such issues lasts for one cycle. In the final week or two of the + cycle, we will review comments and make a final determination: + + - Convert to error: the change should be made into a hard error. + - Revert: we should remove the warning and continue to allow the older code to + compile. + - Defer: can't decide yet, wait longer, or try other strategies. + +Ideally, breaking changes should have landed on the **stable branch** of the +compiler before they are finalized. + + + +### Removing a lint + +Once we have decided to make a "future warning" into a hard error, we need a PR +that removes the custom lint. As an example, here are the steps required to +remove the `overlapping_inherent_impls` compatibility lint. First, convert the +name of the lint to uppercase (`OVERLAPPING_INHERENT_IMPLS`) ripgrep through the +source for that string. We will basically by converting each place where this +lint name is mentioned (in the compiler, we use the upper-case name, and a macro +automatically generates the lower-case string; so searching for +`overlapping_inherent_impls` would not find much). + +#### Remove the lint. + +The first reference you will likely find is the lint definition [in +`librustc/lint/builtin.rs` that resembles this][defsource]: + +[defsource]: https://github.com/rust-lang/rust/blob/085d71c3efe453863739c1fb68fd9bd1beff214f/src/librustc/lint/builtin.rs#L171-L175 + +```rust +declare_lint! { + pub OVERLAPPING_INHERENT_IMPLS, + Deny, // this may also say Warning + "two overlapping inherent impls define an item with the same name were erroneously allowed" +} +``` + +This `declare_lint!` macro creates the relevant data structures. Remove it. You +will also find that there is a mention of `OVERLAPPING_INHERENT_IMPLS` later in +the file as [part of a `lint_array!`][lintarraysource]; remove it too, + +[lintarraysource]: https://github.com/rust-lang/rust/blob/085d71c3efe453863739c1fb68fd9bd1beff214f/src/librustc/lint/builtin.rs#L252-L290 + +Next, you see see [a reference to `OVERLAPPING_INHERENT_IMPLS` in +`librustc_lint/lib.rs`][futuresource]. This defining the lint as a "future +compatibility lint": + +```rust +FutureIncompatibleInfo { + id: LintId::of(OVERLAPPING_INHERENT_IMPLS), + reference: "issue #36889 ", +}, +``` + +Remove this too. + +#### Add the lint to the list of removed lists. + +In `src/librustc_lint/lib.rs` there is a list of "renamed and removed lints". +You can add this lint to the list: + +```rust +store.register_removed("overlapping_inherent_impls", "converted into hard error, see #36889"); +``` + +where `#36889` is the tracking issue for your lint. + +#### Update the places that issue the lint + +Finally, the last class of references you will see are the places that actually +**trigger** the lint itself (i.e., what causes the warnings to appear). These +you do not want to delete. Instead, you want to convert them into errors. In +this case, the [`add_lint` call][addlintsource] looks like this: + +```rust +self.tcx.sess.add_lint(lint::builtin::OVERLAPPING_INHERENT_IMPLS, + node_id, + self.tcx.span_of_impl(item1).unwrap(), + msg); +``` + +We want to convert this into an error. In some cases, there may be an existing +error for this scenario. In others, we will need to allocate a fresh diagnostic +code. +[Instructions for allocating a fresh diagnostic code can be found here.](rustc-diagnostic-code.html) +You may want to mention in the extended description that the compiler behavior +changed on this point, and include a reference to the tracking issue for the +change. + +Let's say that we've adopted `E0592` as our code. Then we can change the +`add_lint()` call above to something like: + +```rust +struct_span_err!(self.tcx.sess, self.tcx.span_of_impl(item1).unwrap(), msg) + .emit(); +``` + +#### Update tests + +Finally, run the test suite. These should be some tests that used to reference +the `overlapping_inherent_impls` lint, those will need to be updated. In +general, if the test used to have `#[deny(overlapping_inherent_impls)]`, that +can just be removed. + +``` +./x.py test +``` + +#### All done! + +Open a PR. =) + +[addlintsource]: https://github.com/rust-lang/rust/blob/085d71c3efe453863739c1fb68fd9bd1beff214f/src/librustc_typeck/coherence/inherent.rs#L300-L303 +[futuresource]: https://github.com/rust-lang/rust/blob/085d71c3efe453863739c1fb68fd9bd1beff214f/src/librustc_lint/lib.rs#L202-L205 + + + +[rfc 1122]: https://github.com/rust-lang/rfcs/blob/master/text/1122-language-semver.md +[breaking-change-issue]: https://gist.github.com/nikomatsakis/631ec8b4af9a18b5d062d9d9b7d3d967 + diff --git a/src/doc/rustc-guide/src/building/bootstrapping.md b/src/doc/rustc-guide/src/building/bootstrapping.md index 1265090772..5bdc8dc6f1 100644 --- a/src/doc/rustc-guide/src/building/bootstrapping.md +++ b/src/doc/rustc-guide/src/building/bootstrapping.md @@ -159,3 +159,20 @@ links against. This `stage2/bin/rustc` compiler is shipped to end-users, along with the `stage 1 {std,rustc}` artifacts. +## Environment Variables + +During bootstrapping, there are a bunch of compiler-internal environment +variables that are used. If you are trying to run an intermediate version of +`rustc`, sometimes you may need to set some of these environment variables +manually. Otherwise, you get an error like the following: + +```text +thread 'main' panicked at 'RUSTC_STAGE was not set: NotPresent', src/libcore/result.rs:1165:5 +``` + +If `./stageN/bin/rustc` gives an error about environment variables, that +usually means something is quite wrong -- or you're trying to compile e.g. +`librustc` or `libstd` or something that depends on environment variables. In +the unlikely case that you actually need to invoke rustc in such a situation, +you can find the environment variable values by adding the following flag to +your `x.py` command: `--on-fail=print-env`. diff --git a/src/doc/rustc-guide/src/building/suggested.md b/src/doc/rustc-guide/src/building/suggested.md index 07f834eacd..087e9dee86 100644 --- a/src/doc/rustc-guide/src/building/suggested.md +++ b/src/doc/rustc-guide/src/building/suggested.md @@ -74,5 +74,15 @@ This is specified in the `target` section of `config.toml`: llvm-config = "/path/to/llvm/llvm-7.0.1/bin/llvm-config" ``` -On my system, this path is `/usr/bin/llvm-config-7`, but this probably varies -by installation. +We have observed the following paths before, which may be different from your system: + +- `/usr/bin/llvm-config-8` +- `/usr/lib/llvm-8/bin/llvm-config` + +Note that you need to have the LLVM `FileCheck` tool installed, which is used +for codegen tests. This tool is normally built with LLVM, but if you use your +own preinstalled LLVM, you will need to provide `FileCheck` in some other way. +On Debian-based systems, you can install the `llvm-N-tools` package (where `N` +is the LLVM version number, e.g. `llvm-8-tools`). Alternately, you can specify +the path to `FileCheck` with the `llvm-filecheck` config item in `config.toml` +or you can disable codegen test with the `codegen-tests` item in `config.toml`. diff --git a/src/doc/rustc-guide/src/codegen.md b/src/doc/rustc-guide/src/codegen.md index c8d51f3184..c7d2fc071a 100644 --- a/src/doc/rustc-guide/src/codegen.md +++ b/src/doc/rustc-guide/src/codegen.md @@ -39,7 +39,7 @@ There are a few benefits to using LLVM: and maintenance burden. - We benefit from the large suite of advanced optimizations that the LLVM project has been collecting. -- We automatically can compile Rust to any of the platforms for which LLVM has +- We can automatically compile Rust to any of the platforms for which LLVM has support. For example, as soon as LLVM added support for wasm, voila! rustc, clang, and a bunch of other languages were able to compile to wasm! (Well, there was some extra stuff to be done, but we were 90% there anyway). diff --git a/src/doc/rustc-guide/src/conventions.md b/src/doc/rustc-guide/src/conventions.md index 76933d5741..7f7bf32e21 100644 --- a/src/doc/rustc-guide/src/conventions.md +++ b/src/doc/rustc-guide/src/conventions.md @@ -20,7 +20,7 @@ in isolation with `./x.py test src/tools/tidy`. ### Copyright notice -In the past, files begin with a copyright and license notice. Please **omit** +In the past, files began with a copyright and license notice. Please **omit** this notice for new files licensed under the standard terms (dual MIT/Apache-2.0). diff --git a/src/doc/rustc-guide/src/diagnostics.md b/src/doc/rustc-guide/src/diagnostics.md index c6c8f4fbaa..0bf869ccdd 100644 --- a/src/doc/rustc-guide/src/diagnostics.md +++ b/src/doc/rustc-guide/src/diagnostics.md @@ -9,14 +9,14 @@ This chapter is about how to emit compile errors and lints from the compiler. location in the code being compiled. `Span`s are attached to most constructs in HIR and MIR, allowing for more informative error reporting. -[span]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/source_map/struct.Span.html +[span]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html A `Span` can be looked up in a [`SourceMap`][sourcemap] to get a "snippet" useful for displaying errors with [`span_to_snippet`][sptosnip] and other similar methods on the `SourceMap`. -[sourcemap]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/source_map/struct.SourceMap.html -[sptosnip]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/source_map/struct.SourceMap.html#method.span_to_snippet +[sourcemap]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/source_map/struct.SourceMap.html +[sptosnip]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/source_map/struct.SourceMap.html#method.span_to_snippet ## Error messages @@ -34,7 +34,7 @@ warnings, errors, fatal errors, suggestions, etc. [parsesses]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/sess/struct.ParseSess.html [session]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/struct.Session.html -In general, there are two class of such methods: ones that emit an error +In general, there are two classes of such methods: ones that emit an error directly and ones that allow finer control over what to emit. For example, [`span_err`][spanerr] emits the given error message at the given `Span`, but [`struct_span_err`][strspanerr] instead returns a @@ -357,14 +357,12 @@ string; this was introduced so that UI tests could both make use of the structured JSON and see the "human" output (well, _sans_ colors) without having to compile everything twice. -The JSON emitter currently lives in libsyntax/json.rs. (But arguably -it should live in librustc_errors along with the "human" emitter? It's -not obvious to the present author why it wasn't moved from libsyntax -to librustc_errors at the same [time the "human" emitter was -moved](https://github.com/rust-lang/rust/commit/6ae3502134).) +The "human" readable and the json format emitter can be found under +librustc_errors, both were moved from the libsyntax crate to the +[librustc_errors crate](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/index.html). The JSON emitter defines [its own `Diagnostic` -struct](https://github.com/rust-lang/rust/blob/b2c6b8c29f13f8d1f242da89e587960b95337819/src/libsyntax/json.rs#L85-L99) +struct](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/json/struct.Diagnostic.html) (and sub-structs) for the JSON serialization. Don't confuse this with [`errors::Diagnostic`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/struct.Diagnostic.html)! diff --git a/src/doc/rustc-guide/src/diagnostics/diagnostic-codes.md b/src/doc/rustc-guide/src/diagnostics/diagnostic-codes.md new file mode 100644 index 0000000000..22d9b12c37 --- /dev/null +++ b/src/doc/rustc-guide/src/diagnostics/diagnostic-codes.md @@ -0,0 +1,75 @@ +# Diagnostic Codes +We generally try assign each error message a unique code like `E0123`. These +codes are defined in the compiler in the `diagnostics.rs` files found in each +crate, which basically consist of macros. The codes come in two varieties: those +that have an extended write-up, and those that do not. Whenever possible, if you +are making a new code, you should write an extended write-up. + +### Allocating a fresh code + +If you want to create a new error, you first need to find the next available +code. This is a bit tricky since the codes are defined in various crates. To do +it, run this obscure command: + +``` +./x.py test --stage 0 src/tools/tidy +``` + +This will invoke the tidy script, which generally checks that your code obeys +our coding conventions. One of those jobs is to check that diagnostic codes are +indeed unique. Once it is finished with that, tidy will print out the lowest +unused code: + +``` +... +tidy check (x86_64-apple-darwin) +* 470 error codes +* highest error code: E0591 +... +``` + +Here we see the highest error code in use is `E0591`, so we _probably_ want +`E0592`. To be sure, run `rg E0592` and check, you should see no references. + +Next, open `src/{crate}/diagnostics.rs` within the crate where you wish to issue +the error (e.g., `src/librustc_typeck/diagnostics.rs`). Ideally, you will add +the code (in its proper numerical order) into the `register_long_diagnostics!` +macro, sort of like this: + +```rust +register_long_diagnostics! { + ... + E0592: r##" +Your extended error text goes here! +"##, +} +``` + +But you can also add it without an extended description: + +```rust +register_diagnostics! { + ... + E0592, // put a description here +} +``` + +To actually issue the error, you can use the `struct_span_err!` macro: + +```rust +struct_span_err!(self.tcx.sess, // some path to the session here + span, // whatever span in the source you want + E0592, // your new error code + &format!("text of the error")) + .emit() // actually issue the error +``` + +If you want to add notes or other snippets, you can invoke methods before you +call `.emit()`: + +```rust +struct_span_err!(...) + .span_label(another_span, "something to label in the source") + .span_note(another_span, "some separate note, probably avoid these") + .emit_() +``` diff --git a/src/doc/rustc-guide/src/diagnostics/lintstore.md b/src/doc/rustc-guide/src/diagnostics/lintstore.md index 32e6ef8b87..b0ae9a3287 100644 --- a/src/doc/rustc-guide/src/diagnostics/lintstore.md +++ b/src/doc/rustc-guide/src/diagnostics/lintstore.md @@ -95,7 +95,7 @@ New lints being added likely want to join one of the existing declarations like `late_lint_mod_passes` in `librustc_lint/lib.rs`, which would then auto-propagate into the other. -[`LintStore::register_lint`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/lint/struct.LintStore.html#method.register_lints +[`LintStore::register_lint`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/struct.LintStore.html#method.register_lints [`rustc_interface::register_plugins`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/passes/fn.register_plugins.html [`rustc_lint::register_builtins`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/fn.register_builtins.html [`rustc_lint::register_internals`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/fn.register_internals.html diff --git a/src/doc/rustc-guide/src/high-level-overview.md b/src/doc/rustc-guide/src/high-level-overview.md index 6255590344..e4b9ff3720 100644 --- a/src/doc/rustc-guide/src/high-level-overview.md +++ b/src/doc/rustc-guide/src/high-level-overview.md @@ -36,7 +36,7 @@ rustc_codegen rustc_borrowck ... rustc_metadata syntax / \ / \ - syntax_pos syntax_ext + rustc_span rustc_builtin_macros ``` The `rustc_driver` crate, at the top of this lattice, is effectively diff --git a/src/doc/rustc-guide/src/hir.md b/src/doc/rustc-guide/src/hir.md index 0a48d11238..60a3c3b8bb 100644 --- a/src/doc/rustc-guide/src/hir.md +++ b/src/doc/rustc-guide/src/hir.md @@ -27,7 +27,7 @@ data structure basically just contains the root module, the HIR `Crate` structure contains a number of maps and other things that serve to organize the content of the crate for easier access. -[`Crate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.Crate.html +[`Crate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.Crate.html For example, the contents of individual items (e.g. modules, functions, traits, impls, etc) in the HIR are not immediately @@ -45,7 +45,7 @@ struct) would only have the **`ItemId`** `I` of `bar()`. To get the details of the function `bar()`, we would lookup `I` in the `items` map. -[`Mod`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.Mod.html +[`Mod`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.Mod.html One nice result from this representation is that one can iterate over all items in the crate by iterating over the key-value pairs @@ -55,14 +55,14 @@ as well as "bodies" (explained below). The other reason to set up the representation this way is for better integration with incremental compilation. This way, if you gain access -to an [`&hir::Item`] (e.g. for the mod `foo`), you do not immediately +to an [`&rustc_hir::Item`] (e.g. for the mod `foo`), you do not immediately gain access to the contents of the function `bar()`. Instead, you only gain access to the **id** for `bar()`, and you must invoke some function to lookup the contents of `bar()` given its id; this gives the compiler a chance to observe that you accessed the data for `bar()`, and then record the dependency. -[`&hir::Item`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.Item.html +[`&rustc_hir::Item`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.Item.html @@ -97,11 +97,17 @@ sorts of identifiers in active use: tree causes the [`NodeId`]s of all subsequent code in the crate to change. This is terrible for incremental compilation, as you can perhaps imagine. -[`DefId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/def_id/struct.DefId.html -[`HirId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.HirId.html -[`BodyId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.BodyId.html +[`DefId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def_id/struct.DefId.html +[`HirId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/hir_id/struct.HirId.html +[`BodyId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.BodyId.html [`NodeId`]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/ast/struct.NodeId.html +We also have an internal map to go from `DefId` to what’s called "Def path". "Def path" is like a +module path but a bit more rich. For example, it may be `crate::foo::MyStruct` that identifies +this definition uniquely. It’s a bit different than a module path because it might include a type +parameter `T`, which you can't write in normal rust, like `crate::foo::MyStruct::T`. These are used +in incremental compilation. + ### The HIR Map Most of the time when you are working with the HIR, you will do so via @@ -135,9 +141,9 @@ that `n` must be some HIR expression, you can do [`&hir::Expr`][Expr], panicking if `n` is not in fact an expression. [find]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/map/struct.Map.html#method.find -[`Node`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/enum.Node.html +[`Node`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/enum.Node.html [expect_expr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/map/struct.Map.html#method.expect_expr -[Expr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.Expr.html +[Expr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.Expr.html Finally, you can use the HIR map to find the parents of nodes, via calls like [`tcx.hir.get_parent_node(n)`][get_parent_node]. @@ -146,7 +152,7 @@ calls like [`tcx.hir.get_parent_node(n)`][get_parent_node]. ### HIR Bodies -A [`hir::Body`] represents some kind of executable code, such as the body +A [`rustc_hir::Body`] represents some kind of executable code, such as the body of a function/closure or the definition of a constant. Bodies are associated with an **owner**, which is typically some kind of item (e.g. an `fn()` or `const`), but could also be a closure expression @@ -154,6 +160,6 @@ associated with an **owner**, which is typically some kind of item associated with a given def-id ([`maybe_body_owned_by`]) or to find the owner of a body ([`body_owner_def_id`]). -[`hir::Body`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/struct.Body.html +[`rustc_hir::Body`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.Body.html [`maybe_body_owned_by`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/map/struct.Map.html#method.maybe_body_owned_by [`body_owner_def_id`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/hir/map/struct.Map.html#method.body_owner_def_id diff --git a/src/doc/rustc-guide/src/implementing_new_features.md b/src/doc/rustc-guide/src/implementing_new_features.md index 4b2529fff1..ff9a709e6f 100644 --- a/src/doc/rustc-guide/src/implementing_new_features.md +++ b/src/doc/rustc-guide/src/implementing_new_features.md @@ -125,7 +125,7 @@ a new unstable feature: 2. Pick a name for the feature gate (for RFCs, use the name in the RFC). -3. Add a feature gate declaration to `libsyntax/feature_gate/active.rs` +3. Add a feature gate declaration to `librustc_feature/active.rs` in the active `declare_features` block: ```rust,ignore @@ -158,7 +158,8 @@ a new unstable feature: For features introducing new syntax, pre-expansion gating should be used instead. To do so, extend the [`GatedSpans`] struct, add spans to it during parsing, - and then finally feature-gate all the spans in [`feature_gate::check::check_crate`]. + and then finally feature-gate all the spans in + [`rustc_ast_passes::feature_gate::check_crate`]. 5. Add a test to ensure the feature cannot be used without a feature gate, by creating `feature-gate-$feature_name.rs` @@ -175,7 +176,7 @@ a new unstable feature: implemented a feature in Rust! [`GatedSpans`]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/sess/struct.GatedSpans.html -[`feature_gate::check::check_crate`]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/feature_gate/check/fn.check_crate.html +[`rustc_ast_passes::feature_gate::check_crate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast_passes/feature_gate/fn.check_crate.html [value the stability of Rust]: https://github.com/rust-lang/rfcs/blob/master/text/1122-language-semver.md [stability in code]: #stability-in-code [here]: ./stabilization_guide.md diff --git a/src/doc/rustc-guide/src/macro-expansion.md b/src/doc/rustc-guide/src/macro-expansion.md index a3a3ae7623..9280fa9bc4 100644 --- a/src/doc/rustc-guide/src/macro-expansion.md +++ b/src/doc/rustc-guide/src/macro-expansion.md @@ -1,6 +1,6 @@ # Macro expansion -> `libsyntax`, `librustc_expand`, and `libsyntax_ext` are all undergoing +> `libsyntax`, `librustc_expand`, and `librustc_builtin_macros` are all undergoing > refactoring, so some of the links in this chapter may be broken. Macro expansion happens during parsing. `rustc` has two parsers, in fact: the @@ -10,7 +10,7 @@ before name resolution, macros are expanded using these portions of the code. The macro parser, in turn, may call the normal Rust parser when it needs to bind a metavariable (e.g. `$my_expr`) while parsing the contents of a macro invocation. The code for macro expansion is in -[`src/libsyntax_expand/mbe/`][code_dir]. This chapter aims to explain how macro +[`src/librustc_expand/mbe/`][code_dir]. This chapter aims to explain how macro expansion works. ### Example @@ -64,7 +64,7 @@ invocations. Interestingly, both are done by the macro parser. Basically, the macro parser is like an NFA-based regex parser. It uses an algorithm similar in spirit to the [Earley parsing algorithm](https://en.wikipedia.org/wiki/Earley_parser). The macro parser is -defined in [`src/libsyntax_expand/mbe/macro_parser.rs`][code_mp]. +defined in [`src/librustc_expand/mbe/macro_parser.rs`][code_mp]. The interface of the macro parser is as follows (this is slightly simplified): @@ -113,7 +113,7 @@ normal Rust parser. As mentioned above, both definitions and invocations of macros are parsed using the macro parser. This is extremely non-intuitive and self-referential. The code to parse macro _definitions_ is in -[`src/libsyntax_expand/mbe/macro_rules.rs`][code_mr]. It defines the pattern for +[`src/librustc_expand/mbe/macro_rules.rs`][code_mr]. It defines the pattern for matching for a macro definition as `$( $lhs:tt => $rhs:tt );+`. In other words, a `macro_rules` definition should have in its body at least one occurrence of a token tree followed by `=>` followed by another token tree. When the compiler @@ -142,7 +142,7 @@ the parse is ambiguous, while if there are no matches at all, there is a syntax error. For more information about the macro parser's implementation, see the comments -in [`src/libsyntax_expand/mbe/macro_parser.rs`][code_mp]. +in [`src/librustc_expand/mbe/macro_parser.rs`][code_mp]. ### Hygiene @@ -208,10 +208,10 @@ TODO TODO: maybe something about macros 2.0? -[code_dir]: https://github.com/rust-lang/rust/tree/master/src/libsyntax_expand/mbe -[code_mp]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax_expand/mbe/macro_parser -[code_mr]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax_expand/mbe/macro_rules -[code_parse_int]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax_expand/mbe/macro_parser/fn.parse.html +[code_dir]: https://github.com/rust-lang/rust/tree/master/src/librustc_expand/mbe +[code_mp]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/mbe/macro_parser +[code_mr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/mbe/macro_rules +[code_parse_int]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/mbe/macro_parser/fn.parse.html [parsing]: ./the-parser.html @@ -356,11 +356,11 @@ Vadim Petrochenkov: Here's some preliminary data I prepared. Vadim Petrochenkov: Below I'll assume #62771 and #62086 has landed. -Vadim Petrochenkov: Where to find the code: libsyntax_pos/hygiene.rs - +Vadim Petrochenkov: Where to find the code: librustc_span/hygiene.rs - structures related to hygiene and expansion that are kept in global data (can -be accessed from any Ident without any context) libsyntax_pos/lib.rs - some +be accessed from any Ident without any context) librustc_span/lib.rs - some secondary methods like macro backtrace using primary methods from hygiene.rs -libsyntax_ext - implementations of built-in macros (including macro attributes +librustc_builtin_macros - implementations of built-in macros (including macro attributes and derives) and some other early code generation facilities like injection of standard library imports or generation of test harness. libsyntax/config.rs - implementation of cfg/cfg_attr (they treated specially from other macros), @@ -375,8 +375,8 @@ AST libsyntax/ext/placeholder.rs - the part of expand.rs responsible for "integrating the results back into AST" basicallly, "placeholder" is a temporary AST node replaced with macro expansion result nodes libsyntax/ext/builer.rs - helper functions for building AST for built-in macros -in libsyntax_ext (and user-defined syntactic plugins previously), can probably -be moved into libsyntax_ext these days libsyntax/ext/proc_macro.rs + +in librustc_builtin_macros (and user-defined syntactic plugins previously), can probably +be moved into librustc_builtin_macros these days libsyntax/ext/proc_macro.rs + libsyntax/ext/proc_macro_server.rs - interfaces between the compiler and the stable proc_macro library, converting tokens and token streams between the two representations and sending them through C ABI libsyntax/ext/tt - diff --git a/src/doc/rustc-guide/src/mir/construction.md b/src/doc/rustc-guide/src/mir/construction.md index 35d68ad73a..52d1f46099 100644 --- a/src/doc/rustc-guide/src/mir/construction.md +++ b/src/doc/rustc-guide/src/mir/construction.md @@ -24,7 +24,7 @@ being a `hair::ExprKind::Neg(hair::Expr)` it is a `hair::ExprKind::Neg(hir::Expr This shallowness enables the `HAIR` to represent all datatypes that [HIR] has, but without having to create an in-memory copy of the entire [HIR]. [MIR] lowering will first convert the topmost expression from -[HIR] to [HAIR] (in [rustc_mir::hair::cx::expr]) and then process +[HIR] to [HAIR] (in [`rustc_mir_build::hair::cx::expr`]) and then process the [HAIR] expressions recursively. The lowering creates local variables for every argument as specified in the signature. @@ -152,7 +152,7 @@ case of `enum`s. [MIR]: ./index.html [HIR]: ../hir.html -[HAIR]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/hair/index.html +[HAIR]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/hair/index.html -[rustc_mir::hair::cx::expr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/hair/cx/expr/index.html -[`mir_built`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/fn.mir_built.html +[`rustc_mir_build::hair::cx::expr`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/hair/cx/expr/index.html +[`mir_built`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/build/fn.mir_built.html diff --git a/src/doc/rustc-guide/src/miri.md b/src/doc/rustc-guide/src/miri.md index 09c31e0a5c..1f11633a73 100644 --- a/src/doc/rustc-guide/src/miri.md +++ b/src/doc/rustc-guide/src/miri.md @@ -97,7 +97,7 @@ Miri, but just use the cached result. [`Immediate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/enum.Immediate.html [`ConstValue`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/mir/interpret/enum.ConstValue.html [`Scalar`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/mir/interpret/enum.Scalar.html -[`op_to_const`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/const_eval/fn.op_to_const.html +[`op_to_const`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/const_eval/eval_queries/fn.op_to_const.html ## Datastructures diff --git a/src/doc/rustc-guide/src/panic-implementation.md b/src/doc/rustc-guide/src/panic-implementation.md new file mode 100644 index 0000000000..497c81fd0b --- /dev/null +++ b/src/doc/rustc-guide/src/panic-implementation.md @@ -0,0 +1,108 @@ +### Panicking in rust ### + +#### Step 1: Invocation of the `panic!` macro. + +There are actually two panic macros - one defined in `libcore`, and one defined in `libstd`. +This is due to the fact that code in `libcore` can panic. `libcore` is built before `libstd`, +but we want panics to use the same machinery at runtime, whether they originate in `libcore` +or `libstd`. + +##### libcore definition of panic! + +The `libcore` `panic!` macro eventually makes the following call (in `src/libcore/panicking.rs`): + +```rust +// NOTE This function never crosses the FFI boundary; it's a Rust-to-Rust call +extern "Rust" { + #[lang = "panic_impl"] + fn panic_impl(pi: &PanicInfo<'_>) -> !; +} + +let pi = PanicInfo::internal_constructor(Some(&fmt), location); +unsafe { panic_impl(&pi) } +``` + +Actually resolving this goes through several layers of indirection: + +1. In `src/librustc/middle/weak_lang_items.rs`, `panic_impl` is declared as 'weak lang item', + with the symbol `rust_begin_unwind`. This is used in `librustc_typeck/collect.rs` + to set the actual symbol name to `rust_begin_unwind`. + + Note that `panic_impl` is declared in an `extern "Rust"` block, + which means that libcore will attempt to call a foreign symbol called `rust_begin_unwind` + (to be resolved at link time) + +2. In `src/libstd/panicking.rs`, we have this definition: + +```rust +/// Entry point of panic from the libcore crate. +#[cfg(not(test))] +#[panic_handler] +#[unwind(allowed)] +pub fn begin_panic_handler(info: &PanicInfo<'_>) -> ! { + ... +} +``` + +The special `panic_handler` attribute is resolved via `src/librustc/middle/lang_items`. +The `extract` function converts the `panic_handler` attribute to a `panic_impl` lang item. + +Now, we have a matching `panic_handler` lang item in the `libstd`. This function goes +through the same process as the `extern { fn panic_impl }` definition in `libcore`, ending +up with a symbol name of `rust_begin_unwind`. At link time, the symbol reference in `libcore` +will be resolved to the definition of `libstd` (the function called `begin_panic_handler` in the +Rust source). + +Thus, control flow will pass from libcore to std at runtime. This allows panics from `libcore` +to go through the same infrastructure that other panics use (panic hooks, unwinding, etc) + +##### libstd implementation of panic! + +This is where the actual panic-related logic begins. In `src/libstd/panicking.rs`, +control passes to `rust_panic_with_hook`. This method is responsible +for invoking the global panic hook, and checking for double panics. Finally, +we call `__rust_start_panic`, which is provided by the panic runtime. + +The call to `__rust_start_panic` is very weird - it is passed a `*mut &mut dyn BoxMeUp`, +converted to an `usize`. Let's break this type down: + +1. `BoxMeUp` is an internal trait. It is implemented for `PanicPayload` +(a wrapper around the user-supplied payload type), and has a method +`fn box_me_up(&mut self) -> *mut (dyn Any + Send)`. +This method takes the user-provided payload (`T: Any + Send`), +boxes it, and converts the box to a raw pointer. + +2. When we call `__rust_start_panic`, we have an `&mut dyn BoxMeUp`. +However, this is a fat pointer (twice the size of a `usize`). +To pass this to the panic runtime across an FFI boundary, we take a mutable +reference *to this mutable reference* (`&mut &mut dyn BoxMeUp`), and convert it to a raw pointer +(`*mut &mut dyn BoxMeUp`). The outer raw pointer is a thin pointer, since it points to a `Sized` +type (a mutable reference). Therefore, we can convert this thin pointer into a `usize`, which +is suitable for passing across an FFI boundary. + +Finally, we call `__rust_start_panic` with this `usize`. We have now entered the panic runtime. + +#### Step 2: The panic runtime + +Rust provides two panic runtimes: `libpanic_abort` and `libpanic_unwind`. The user chooses +between them at build time via their `Cargo.toml` + +`libpanic_abort` is extremely simple: its implementation of `__rust_start_panic` just aborts, +as you would expect. + +`libpanic_unwind` is the more interesting case. + +In its implementation of `__rust_start_panic`, we take the `usize`, convert +it back to a `*mut &mut dyn BoxMeUp`, dereference it, and call `box_me_up` +on the `&mut dyn BoxMeUp`. At this point, we have a raw pointer to the payload +itself (a `*mut (dyn Send + Any)`): that is, a raw pointer to the actual value +provided by the user who called `panic!`. + +At this point, the platform-independent code ends. We now call into +platform-specific unwinding logic (e.g `libunwind`). This code is +responsible for unwinding the stack, running any 'landing pads' associated +with each frame (currently, running destructors), and transferring control +to the `catch_unwind` frame. + +Note that all panics either abort the process or get caught by some call to `catch_unwind`: +in `src/libstd/rt.rs`, the call to the user-provided `main` function is wrapped in `catch_unwind`. diff --git a/src/doc/rustc-guide/src/queries/example-0.counts.txt b/src/doc/rustc-guide/src/queries/example-0.counts.txt new file mode 100644 index 0000000000..e5b9c3f3d8 --- /dev/null +++ b/src/doc/rustc-guide/src/queries/example-0.counts.txt @@ -0,0 +1,104 @@ +translation,1,0.891 +symbol_name,2658,0.733 +def_symbol_name,2556,0.268 +item_attrs,5566,0.162 +type_of,6922,0.117 +generics_of,8020,0.084 +serialize dep graph,1,0.079 +relevant_trait_impls_for,50,0.063 +def_span,24875,0.061 +expansion,1,0.059 +const checking,1,0.055 +adt_def,1141,0.048 +trait_impls_of,32,0.045 +is_copy_raw,47,0.045 +is_foreign_item,2638,0.042 +fn_sig,2172,0.033 +adt_dtorck_constraint,2,0.023 +impl_trait_ref,2434,0.023 +typeck_tables_of,29,0.022 +item-bodies checking,1,0.017 +typeck_item_bodies,1,0.017 +is_default_impl,2320,0.017 +borrow checking,1,0.014 +borrowck,4,0.014 +mir_validated,4,0.013 +adt_destructor,10,0.012 +layout_raw,258,0.010 +load_dep_graph,1,0.007 +item-types checking,1,0.005 +mir_const,2,0.005 +name resolution,1,0.004 +is_object_safe,35,0.003 +is_sized_raw,89,0.003 +parsing,1,0.003 +is_freeze_raw,11,0.001 +privacy checking,1,0.001 +privacy_access_levels,5,0.001 +resolving dependency formats,1,0.001 +adt_sized_constraint,9,0.001 +wf checking,1,0.001 +liveness checking,1,0.001 +compute_incremental_hashes_map,1,0.001 +match checking,1,0.001 +type collecting,1,0.001 +param_env,31,0.000 +effect checking,1,0.000 +trait_def,140,0.000 +lowering ast -> hir,1,0.000 +predicates_of,70,0.000 +extern_crate,319,0.000 +lifetime resolution,1,0.000 +is_const_fn,6,0.000 +intrinsic checking,1,0.000 +translation item collection,1,0.000 +impl_polarity,15,0.000 +creating allocators,1,0.000 +language item collection,1,0.000 +crate injection,1,0.000 +early lint checks,1,0.000 +indexing hir,1,0.000 +maybe creating a macro crate,1,0.000 +coherence checking,1,0.000 +optimized_mir,6,0.000 +is_panic_runtime,33,0.000 +associated_item_def_ids,7,0.000 +needs_drop_raw,10,0.000 +lint checking,1,0.000 +complete gated feature checking,1,0.000 +stability index,1,0.000 +region_maps,11,0.000 +super_predicates_of,8,0.000 +coherent_trait,2,0.000 +AST validation,1,0.000 +loop checking,1,0.000 +static item recursion checking,1,0.000 +variances_of,11,0.000 +associated_item,5,0.000 +plugin loading,1,0.000 +looking for plugin registrar,1,0.000 +stability checking,1,0.000 +describe_def,15,0.000 +variance testing,1,0.000 +codegen unit partitioning,1,0.000 +looking for entry point,1,0.000 +checking for inline asm in case the target doesn't support it,1,0.000 +inherent_impls,1,0.000 +crate_inherent_impls,1,0.000 +trait_of_item,7,0.000 +crate_inherent_impls_overlap_check,1,0.000 +attribute checking,1,0.000 +internalize symbols,1,0.000 +impl wf inference,1,0.000 +death checking,1,0.000 +reachability checking,1,0.000 +reachable_set,1,0.000 +is_exported_symbol,3,0.000 +is_mir_available,2,0.000 +unused lib feature checking,1,0.000 +maybe building test harness,1,0.000 +recursion limit,1,0.000 +write allocator module,1,0.000 +assert dep graph,1,0.000 +plugin registration,1,0.000 +write metadata,1,0.000 diff --git a/src/doc/rustc-guide/src/queries/example-0.html b/src/doc/rustc-guide/src/queries/example-0.html new file mode 100644 index 0000000000..b196aaa837 --- /dev/null +++ b/src/doc/rustc-guide/src/queries/example-0.html @@ -0,0 +1,313330 @@ + + + + + + +
+
parsing
+
0.003
+
0.2%
+
+
+
recursion limit
+
0.000
+
< 0.1%
+
+
+
crate injection
+
0.000
+
< 0.1%
+
+
+
plugin loading
+
0.000
+
< 0.1%
+
+
+
plugin registration
+
0.000
+
< 0.1%
+
+
+
expansion
+
0.059
+
5.2%
+
+
+
maybe building test harness
+
0.000
+
< 0.1%
+
+
+
maybe creating a macro crate
+
0.000
+
< 0.1%
+
+
+
creating allocators
+
0.000
+
< 0.1%
+
+
+
checking for inline asm in case the target doesn't support it
+
0.000
+
< 0.1%
+
+
+
early lint checks
+
0.000
+
< 0.1%
+
+
+
AST validation
+
0.000
+
< 0.1%
+
+
+
name resolution
+
0.004
+
0.3%
+
+
+
complete gated feature checking
+
0.000
+
< 0.1%
+
+
+
lowering ast -> hir
+
0.000
+
< 0.1%
+
+
+
indexing hir
+
0.000
+
< 0.1%
+
+
+
attribute checking
+
0.000
+
< 0.1%
+
+
+
language item collection
+
0.000
+
< 0.1%
+
+
+
lifetime resolution
+
0.000
+
< 0.1%
+
+
+
looking for entry point
+
0.000
+
< 0.1%
+
+
+
looking for plugin registrar
+
0.000
+
< 0.1%
+
+
+
loop checking
+
0.000
+
< 0.1%
+
+
+
static item recursion checking
+
0.000
+
< 0.1%
+
+
+
compute_incremental_hashes_map
+
0.001
+
< 0.1%
+
+
+
load_dep_graph
+
0.007
+
0.6%
+
+
+
stability index
+
0.000
+
< 0.1%
+
+
+
stability checking
+
0.000
+
< 0.1%
+
+
+
type collecting
+
0.001
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
impl wf inference
+
0.000
+
< 0.1%
+
+
+
coherence checking
+
0.000
+
< 0.1%
+
+
crate_inherent_impls
+
0.000
+
< 0.1%
+
+
+
crate_inherent_impls_overlap_check
+
0.000
+
< 0.1%
+
+
+
+
variance testing
+
0.000
+
< 0.1%
+
+
+
wf checking
+
0.001
+
< 0.1%
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item-types checking
+
0.005
+
0.4%
+
+
typeck_tables_of
+
0.005
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
relevant_trait_impls_for
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
super_predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
associated_item_def_ids
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
super_predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
super_predicates_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
associated_item_def_ids
+
0.000
+
< 0.1%
+
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
+
+
+
item-bodies checking
+
0.017
+
1.5%
+
+
typeck_item_bodies
+
0.017
+
1.5%
+
+
typeck_tables_of
+
0.017
+
1.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
inherent_impls
+
0.000
+
< 0.1%
+
+
+
associated_item_def_ids
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
associated_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
associated_item
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
adt_sized_constraint
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
+
adt_dtorck_constraint
+
0.012
+
1.1%
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
adt_dtorck_constraint
+
0.011
+
1.0%
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
adt_destructor
+
0.011
+
1.0%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
coherent_trait
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
relevant_trait_impls_for
+
0.011
+
1.0%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.010
+
0.9%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
adt_destructor
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
coherent_trait
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
const checking
+
0.055
+
4.8%
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.030
+
2.6%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
relevant_trait_impls_for
+
0.030
+
2.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.028
+
2.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.008
+
0.7%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.001
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
is_copy_raw
+
0.002
+
0.2%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.003
+
0.3%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
super_predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
associated_item_def_ids
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
super_predicates_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
associated_item_def_ids
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
+
is_const_fn
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
adt_destructor
+
0.000
+
< 0.1%
+
+
+
associated_item
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
+
is_const_fn
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
+
is_copy_raw
+
0.001
+
0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
+
privacy checking
+
0.001
+
0.1%
+
+
privacy_access_levels
+
0.001
+
0.1%
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
associated_item
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
associated_item
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
+
describe_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
intrinsic checking
+
0.000
+
< 0.1%
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
+
effect checking
+
0.000
+
< 0.1%
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
+
match checking
+
0.001
+
< 0.1%
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
+
liveness checking
+
0.001
+
< 0.1%
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
+
borrow checking
+
0.014
+
1.2%
+
+
borrowck
+
0.006
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
+
mir_validated
+
0.005
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
mir_const
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
adt_sized_constraint
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
variances_of
+
0.000
+
< 0.1%
+
+
+
+
is_const_fn
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
is_const_fn
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
is_const_fn
+
0.000
+
< 0.1%
+
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
+
borrowck
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
+
mir_validated
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
mir_const
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
region_maps
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
relevant_trait_impls_for
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.003
+
0.2%
+
+
def_span
+
0.003
+
0.2%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
is_object_safe
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
super_predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
associated_item_def_ids
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
super_predicates_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
associated_item_def_ids
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
+
+
reachability checking
+
0.000
+
< 0.1%
+
+
reachable_set
+
0.000
+
< 0.1%
+
+
privacy_access_levels
+
0.000
+
< 0.1%
+
+
+
+
+
death checking
+
0.000
+
< 0.1%
+
+
privacy_access_levels
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
+
unused lib feature checking
+
0.000
+
< 0.1%
+
+
privacy_access_levels
+
0.000
+
< 0.1%
+
+
+
+
lint checking
+
0.000
+
< 0.1%
+
+
privacy_access_levels
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
typeck_tables_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
+
resolving dependency formats
+
0.001
+
< 0.1%
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
+
translation
+
0.891
+
78.1%
+
+
write metadata
+
0.000
+
< 0.1%
+
+
+
translation item collection
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
optimized_mir
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
borrowck
+
0.000
+
< 0.1%
+
+
+
mir_validated
+
0.000
+
< 0.1%
+
+
+
param_env
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
is_copy_raw
+
0.000
+
< 0.1%
+
+
+
adt_destructor
+
0.000
+
< 0.1%
+
+
+
adt_destructor
+
0.000
+
< 0.1%
+
+
+
adt_destructor
+
0.000
+
< 0.1%
+
+
+
adt_destructor
+
0.000
+
< 0.1%
+
+
+
adt_destructor
+
0.000
+
< 0.1%
+
+
+
adt_destructor
+
0.000
+
< 0.1%
+
+
+
adt_destructor
+
0.000
+
< 0.1%
+
+
+
is_const_fn
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
trait_of_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
is_exported_symbol
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_mir_available
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_of_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
is_exported_symbol
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_exported_symbol
+
0.000
+
< 0.1%
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
+
is_mir_available
+
0.000
+
< 0.1%
+
+
+
optimized_mir
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
trait_of_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
needs_drop_raw
+
0.000
+
< 0.1%
+
+
+
optimized_mir
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
borrowck
+
0.000
+
< 0.1%
+
+
+
mir_validated
+
0.000
+
< 0.1%
+
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
codegen unit partitioning
+
0.000
+
< 0.1%
+
+
trait_of_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.001
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.001
+
< 0.1%
+
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.001
+
< 0.1%
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
adt_sized_constraint
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
adt_sized_constraint
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
adt_sized_constraint
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
adt_sized_constraint
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
adt_sized_constraint
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.001
+
< 0.1%
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
relevant_trait_impls_for
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
trait_impls_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_object_safe
+
0.000
+
< 0.1%
+
+
+
impl_polarity
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.002
+
0.2%
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.002
+
0.2%
+
+
param_env
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
super_predicates_of
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
adt_sized_constraint
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.002
+
0.2%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
optimized_mir
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
adt_sized_constraint
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
predicates_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
optimized_mir
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
trait_of_item
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
trait_of_item
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
extern_crate
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
trait_of_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
optimized_mir
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_freeze_raw
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
layout_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
is_sized_raw
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.001
+
< 0.1%
+
+
def_span
+
0.001
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.017
+
1.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.001
+
< 0.1%
+
+
def_span
+
0.001
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.025
+
2.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.012
+
1.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.012
+
1.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.010
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.010
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.020
+
1.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.006
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.006
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.005
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.005
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.005
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.005
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.005
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.005
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.005
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.005
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.005
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.012
+
1.0%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.012
+
1.0%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.005
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.010
+
0.9%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.006
+
0.5%
+
+
def_span
+
0.006
+
0.5%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.011
+
0.9%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.011
+
0.9%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.005
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.005
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.006
+
0.5%
+
+
def_span
+
0.006
+
0.5%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.006
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.005
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.006
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.006
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.003
+
0.2%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.002
+
0.2%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.010
+
0.9%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.010
+
0.9%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.001
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.005
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.003
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.001
+
< 0.1%
+
+
def_span
+
0.001
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.009
+
0.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.021
+
1.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.021
+
1.8%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.002
+
0.1%
+
+
def_span
+
0.002
+
0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.003
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.004
+
0.3%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.005
+
0.5%
+
+
def_span
+
0.005
+
0.5%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.007
+
0.6%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.008
+
0.7%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
trait_def
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.008
+
0.7%
+
+
def_span
+
0.008
+
0.7%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.005
+
0.4%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.024
+
2.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.024
+
2.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.006
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
is_panic_runtime
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.001
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.006
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.006
+
0.5%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.002
+
0.2%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.002
+
0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
adt_def
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
generics_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
is_foreign_item
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
fn_sig
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
def_symbol_name
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
is_default_impl
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
type_of
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
impl_trait_ref
+
0.000
+
< 0.1%
+
+
def_span
+
0.000
+
< 0.1%
+
+
+
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
internalize symbols
+
0.000
+
< 0.1%
+
+
generics_of
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
symbol_name
+
0.000
+
< 0.1%
+
+
+
item_attrs
+
0.000
+
< 0.1%
+
+
+
+
write allocator module
+
0.000
+
< 0.1%
+
+
+
+
assert dep graph
+
0.000
+
< 0.1%
+
+
+
serialize dep graph
+
0.079
+
6.9%
+
+ + diff --git a/src/doc/rustc-guide/src/queries/example-0.png b/src/doc/rustc-guide/src/queries/example-0.png new file mode 100644 index 0000000000000000000000000000000000000000..14b46c44f7d05cec9458aa56205f4b2982c72ee1 GIT binary patch literal 106577 zcmZU319WD~(snqpCUz#8*c02fZ98wQiEZ1QWMbR4ZQD-%oOADY@0|O;YrSjr?(VAY zYSezJo*g19EdmFP1q}oQ1ScjcC=Ub#GWq#mh5YhaGoBE100e|VZYCfgD<&X7AZu@9 zY-VW$1f&{};0mFLA~9?1_(0qp?I3JFu10*2?pF-U<|pt~QIMCoI2cTh7X^_IC7c*3 znjlm(Hk&LM1SB*R7!i2s%k0B@gS*qjJlovc*qKH{yN2VhQX2%Ibjke6N`hqgpPSK; z)#WiXSv6sl`0sF?pj5hG@<4>Hfk8*A8fl=luT38l)l9J2V=s&)QW_sGHy;)`57+Py zU_jNvRY59^CUl_}KtJ_vV2MP4ex3>MflMLkrMUq2NgBoz0I`me-mmprrY#y^OIRN* zt{ms6VgrHv2obyo|7je@q7z?4YaaAvFW3O`>KcJhX-BSgWF~4C97qJFln4_Cr#a+6 zj_UY|mZSZnr*J?gjX3r~r}b<^`P<=3P!M>G{yR_5&WDz-AK}Ms6=?aam!ZLmRMwOo zB?9b^mEKu0YuKyGT7G)aQ2Zx%t0S9jxeif-ppEC7%q_RWWMDKP-A$os76E$nP&GnO zT!5E>>sQxb)TIa-&mzf-AN_c{vMU?+TgA}?5;q%8@~^E@@0&2|TVI^K0Uob#QnKN~ zSRUW!C)Ul6q!7U1mT#q45=aZZFmj_)~~QbYS=#F zcOaU{Oe^b{QV}d8dENJ~SRt8Q*qYq%;Iy{h!PT=7Xs>^R?`ZmF3OHJRw@$-BGknv) zZ`#B)G;HA-AB?ypYvHkiAe;nR!GqYf0veiqcGi*5Lz=%|S*4?+gK*=;zw{BUb^9rc z2=wZ{Z*efCvmyfv3>ED|dnv54RKF_&Q&j%_+uoSbs= ze5NFzA0K|Bux;*n>sIzqPdhz4_mvlwZ;K6!-%i2q!EM15G?cw8&TeD~K7!crD}j)U zfAnmuyS}b)gwqYHL*<1{2|nem(oL-BFvyj|sJguCxc7J^Lnt7J3e>#AYg*^&&zV z{#(N72axrWn{aGiy;0f!)h&n*25)_XBNKnpu*N0&eXt@(88H7?7L9?OR!g9 zZ9yRZfJ%bbV3gd@!*9yLl-qvMF|5RJLqef36#2jz2PT7H3{hpewiv>&_`=W;QU>9m z{m3==$U$sAY*FL`v%1Ul6LdCoFv&Wqgo!YeK1u_rx*1jNi>8(g%;*|{ZDD7;3u8=9 zP(eLan}W6!hs}U4@J;w_=}l<6xkfZi9_z0S!2>%>S6^MET2V9oqdLFuOl(zbrCotO zn!O@`p!y^c$j}ite&vUR^4IKE;z!o|NhhFMke!E^D_c~Vdzl-YGnh?QV48hckX)!* zkY9w7Gn-#q1e?t%o+6?qw8ZxmdX0^WItNejg94kvyVRwWvlLq~s(4+tT$WKbOyNYX zMNULME4Q70jsMN}89PQ4h148bD+H-mp%+>o+b;dlFEB zwE8!7+~u~~s@kU71~YfFgCnv-|D)SOQGgxb32+A>0)*X$-`d|Q-*(-8KdhMMDa2`>o84WE%@B}F1dE(9tB6rM^o_OT6vJA^na+2ig~Y#r~b z@9u9gZ^Q3!53KcbP4sl-RsB$ds|lrv`(XV{r8d<=YfWNoB%Bx>Y{^s}@{I%&F5 zIsyle-Inc@bBRM=3wv{76U{mEVn&VoveXdul9fx;U?!+L-o@S`cJ0GE_p)ccXTw_6 zx%9cp+JdNZzW#J>P>6`nfNxRef!YLu_OkYpw!?brx=E{v2b1UcjTliAbW z^VrMDQ`W=BS6v)glu8^^R2LFkqCxUv_GH9UJWc#=#IG3Bc*DqU1hqVpgj8&n`W?^j z>2ENGjP`1*DDB@{X?&qP$BrUVA~?~WNX=Cgy=J3K2M$*t4iWru4kMAG#3E8ceuTGq zAUaIm=$?Fg7Z5>cV=Hrbl*d6iKw5AU+!URTIdaK+yv~ak0gd98ik4!HyX2Z8ulg3k zLC$SJTfYF00h56|a4Jll#$kkQ7cchXR9skhm$H zE54qklFPErY??tjZEZAh_>K-62)Ti|O7iNO3k>TFzj|L0Rg}aIcB{3zf zQsWZo4q$7+brB^#ABq-F)%q$_K6I7MWI8rc&S4!HyQ1sxmpjpghq z+lS2CHp+<5H~)&Rb*>GS|=K&P$Gzj>=CIPAm>LmNuBOe_U>+ zyw?Qzk^0F5QUyH+;Ra?!HAYBsKDcqe5FYj=O%+egC0$iiR!sLF_S+9M^@r(%wf)YN z&20P-{*ZdmXlbDR&h?!~GC-zW>U$ee`$)!CMoDr)mQ^}q`iXnT%iC>GCBm@-ufPakaG+cmpm5Ja4)8Ij^Sc&;N#kMQ zpG3rPouiPPtmbTuoSUUYJI^U0zQVN;y$sDKE89Iq%*0 zyPSe!Qj2owy;O#Z8zbPl%uaMjaA~j~5IV48uy-&u>lNbr zFyH;XBQYW^Ln)%h*%8r^QBLe9ccb_95?J?$%&*u*#=fS1ZHps}#FZH5)=stOs3R%o z@OQ2{z;@+a`f+XM2WlOhBf{|tmiqacMXP&9b4hMf ze!(T5w1xUg&izmLmZ0Gb%M8jWQoIKzE|2N?w@otx8Als!9hZ)EAiK?_npeK8Zv}d% zmxH2DH^u17d5u%jOzrX7W8p@T7U44O+-y1YS6fn38Y^Ok)o#Oj=0@x<8M`g}m@6qI zO9l=M4hk0|JpQAUqqJUS@4HVa?>B4UCjrhn@Sa9*&zBng579!?u?Scq3OpS11uV?< z`#M0)zz_u2gH-#Z%y5R^KzGdt;foQw4nFg{!|T(_<`b<=hslK@nfa_`Z|-c` z%5TMltUSa-Oy9y=HzLY#$FbY7=uup`DA<;Fe)5G|mTmH#3!Da}>>NgJMpE^4a4jd; zGSYu1e_qTqoY{FM-!I9p%{xkx;pAlVI#%f4KH3}YW8A1ltLE7sJ@8_G*}++Jt$U63 zt?tf*i4$@_FQRRu@sgX?c|NpPP}@oPeI2FpMERge+4!EDdK9=fh5~p{Z=%%NQA*Qc znf%#SwAgs@UR7AV-=A0rp`szvfNLFf9_*bwrS@37dlm3oL58s9EK~eW*G<^n=C0rY z0(Oy;5rYY%8uK0_#3S=|`|)rqiM!&qpS6E~;6w*M%hrqNF7fhy&2U9=>-ODwnQ@lU zuZF}yWc|haGWFpFVUd3k{d%F;hJGUt{Vgdx(Jaa4gYNOlu+MRCXQKVb@!eGU zQxecwH0CYNy|At57h#Z@u!z2)&Hc+HC@&NS6v}ulMWNX#K@BWdb*yEQX7pQXSk!Pe z$)FTZHA}T0OTCLJOAD;VY!Hp9jlW#PU2dN2pK6>9A&FsxpmrIr{m2IprEg3I8Em^Q4;`ZZK zaNycAJL);Po~gHUpm2St+^=q6cgRd+Y_7{tTteQi9toZOIQHx_>8L2ZNY$zF_W0>U z0BH%uj#Y;43v~p^g;t1sZ{SU`1kP1MNmxeMF0wCl7LFAa$6t6`qzVCyCqolMF`Z7mJi*&0`oWVXUf$zSQtkF7-&x#>wT``)1FbZ{9`gL>mL& zo2|Jq&$Ta*PS)0(>%Cu7UN?twWQd$5PDGw`_QQu-3tf@961cH%rmjz>L&x?%qglTd zDpn()>PgO-D`NEnpusYsn^AY5N_h}nDX>m$xXyuJK$eQ&*_{U769|w}oKU9YLm)0b z7_x$lQVyG;#$yn?6sdCBpi;U(t)Lc&pu}Iy@}Bfq0bj=;II_hse4q5R7Gby}ja@-6 zWdwn$c=coK4Z#FDiw%6~Ns`f3zm#F7#?);Qq%+gtErbqiOI;ORO+dZ+6Yz6^XLg6= zrf+{Q0N*1SHlmOywKs>YgK)%_3r-e)6*Q2U2{vX=0sOS)Swm@q@ucASx$*g@@WMF! z*u7SUI@fX@drh;%b0<*HxdWJiFH`_|9cCO`M?h{tfl{zzy;R;=E!Py^)KuS5<&991 z(*h<-DOa^S?gOqpEy*d$m`Wv?WmBR-{UfN5|N%3Hl!%i;&djo%cL&w@#pR_6t zgnL|gu5MJG^ymyjFUunrr&2@p0jLXwQOpX)EaQkh%iXIC6-v5}$_stTtG?+eN_kZD ziXmmG)mDIs4YiV|(oUvvi1Ipok4WFzY+LS|gkK6#F7309mW${8StrLsQ$iGMR)r_{ zhEdXNB8&30*L*qr?==nDC)E0!>N;;;jSUw|Pm)!0)orCH)+O z!DD?Szu}W1Q3T@g+UUVjfu!{qK60*p@fL1GWZXrRkC4=3rK?W{NJ5}>o9iR!U+68^ zsy7O*8gSySgL`9sBxDN=61L_|W)J2j7cmJQcti}R9K)wV#g#yWnD>S;DKbHr8k=gF zx*x(GsUJE|u`nLe1L&9OBXd%YWcFdv>=M71y)3CNnlD-{ZrJtOer1zrs%93*|@J8Zu+L&BHSqW@<111uiwCI+eNQwT`fMh~2As+)en|{7YzHsjzVWi{!Q>ZHi+mt*X5`rYc0P ziF*B-+6zvQE@rxb#lgdf-+C~+5gQfk1fAE`;HTWEZ| zTNqiq>jCa&KC?yOPQcikpzwa0wx9sN2SjjUU^QMtG6Zv<^&YB9ZXDpGt~^LCeP7~l z)PwB8pvYlnon?BCm1c`b=@{pq$<7WK9Z3R2ekeZ_bCiI1IwPPx#02g+F7qG95P}xl z9I0UHUdw3gEX^d(GqCcoGMEC%!IFEU&7&2n`l_y~?u*h@?zV^ap$_zR<@Qlmvsam0 zF#9YU-zYmtgON3no(W&ocGC`UZBiF|JX(pUr8s8Sv4&h_EIRjf2 zTVXuNUn9TBen|w=@b|4$w>JfoG1LGUhA(u<*cDvSiv%Ih$8H+<8#eDilW&#y9l?L! zmo7+89QTMxh|P<6A*tAYT?ZNNrWB$;zd*N0sMVaOJ)vm$jZs$HF|T5zs^zV4JHN!? z-x6doe=Lvfe{r`aW2$VOVnJ=%;1+z;`oQ`cBKV*<5x{)_TxbF+fJsz1!6IDIR*jYB ziOW{?&aC&>yU@o3dBcDkC*|XI=+a@7e=8|Yhp6MoTjSl!amxN`FLq;k+J5$W6`=vY zjna)WfhUBg#|yrUqI|#HON~*DQd>i-L8s##=4tQsWcf?&R;8Vz!+Vb>%5Fm>La;hI z(CK4;KZ_pFr3sMg#Ok6d_4=YJEni%O3Q#SW)kj5* z7)^jh>OK$R&oEd3s>`iFt+1S`<=@@7k7^pvcP&>F<1N2;|tsRK|rR4wg2pTyU z*qhk`%xtU){?ex<5rZ z|Egt|HFGhtR24L{GO~8~9D|#MfsXU<{{LUge@Fa7Qtb~(MutBn|7iKQBq!}(2K-^r zzgFw-+Rx?UhUTRG&(d>4cMU$00Riy>i3##4x&WWHA=oM`)P20{p_@=aHzfo27v?Wu zC~PEuF?YpkxMylreT~PAW4|yVz@+-l=@y}IUbl5^{uR&1_`HBLMRw-s=V}txOW{O` zpti<}v!tc*Y1JU@ktm#@p_d~C$!k??eMve5CL1^fJ!{Rz^1Ixwx#NdgU9%~ z`&r$?d%EYi+OqnKDLfD#HUw!WSTYc@E{Nn$C_3QJ2YG_a4f$xF#hUN6Vy8y8m$ZV!#heUr z6Aku=iO2>2S(=2*fAN?azIs=N%(tE)tsp7DJlv&VP5PHz|7YYX2Uy|aPcI_)CKoe# zDs8t`CMl!VRu{9QuwT!RjGQ$-rAwoq z0B)~cw{BujwR?69j3W`+`|~DXZglaG*9KU5+`{t*1eQxvxhSnvOTykuUNAJAbKR_m zAfCNbB~@SQD&%lGPkMS5Z|+wbZy!1+?cN9exzolVzzmsJ#|BYbFTYeM$6OC4y!$_l z>nP?OUL8G$G%{j1IlRst#WN*VXvZ_*Fej_|)bqBJwiW+*Vr&nfM6s2ZtEUSyB$MM2 zZrv4Uc52nMXmGea-5BodG5@Fc3Y6%I(sJc=VgmD-VRyc9wm098x8QoOWv485@B@>q zEeIi@$9t8I(9xIkG)ay|*guZu=N2ZTfh=^qe!Y0Rs|bDYXUg0=t*JHgW*=H6HR9DM zsn%a!FE|^hbyN^AG+_PvIRD?a)A^)`^J0yEa9B;dc%?C$%}A5x8}ds0(n?cHlwP#Y z*|aVl6I?+sd+|0K$&Ud2pHWM|@+WElE76P-saI518q}g`ED6!Ez|=*pbq!X7sNu^i z%!YmHdnJnf4F7kJ{xz^}A>!ovcut+ja%+iyytaXfdL4A)@UY@-)&Cln0A?Zb zR?uL3xx#F`hp{Ql_}7K}KMV3jdEGfgD7MMRcr8MAC7C*`1oFDv|L8#Hvm{Aye}+?X zPeKjKu2ewvKl^>I3_{*yyIP)c;6?wZVmcoHRQ@d*yws7i)JDJ+gmBsGz4&UDYe(Yf zKhy)0(w#uAHhO`guebd4(ShA`p5G`~eUH~-t!J|7dcf*Ps@6v{{Es8~d)_qxof<(K z`~&Ba@u_LCFhS|A#ye~znN+?1G3#@e=wP5kHB|myAz0I+`YxaUxv^tl@^!8X*FK5d z6ES)=L)x004)hEmQ7M1At>n%!!sw6B`^okuUOZOCY(qx0Pw?pg7Qy{2IR|8S$^P8Y z&N3oIi<$oA))4miSm2CeTZ*H^8<1`TF`?W0K@93k7#^xQ1qH3N6$HEY{dXzXjt4Z| zn}jc?*DSg-lUS0sb9^BOm}OkCm{UWryAScXuaZ!Sb3()mJhPvspPGZkX zIKttTz=ImGRq3>a92eP0TY+Tofth>=V^tui+b&dST@g^oA zAY(bYw?KL`F?Wn9m)HuGNJdcWg;ZQ+t$OP&`ON-R)U+& zAhUc&VEl5xuOcbc=ehSNz#I%r-2#s#TJeeEopv=0!!CKouzUxSTvp8h;pssE-Zt-@ z+1m{Q0<=WbvI;frb^0y>OE8yL9zhUnUDO=7e$pZlg*s#2OW7Xw-0N_pYu78R-t7gF zd+VOQls8F&C5lBUqYztx63$R?g}_Xo`+kqX&jFw)U_4OHFD|gFeFg-}!*7n_2kfu7 z-tyQS+WQ#lcv=C0HSrGzRKY|iRqsKh#p76bOru&pXv5WwbFRyN6%TqHQ~uN5IgdZ# z1A`nPTQ`Cd30Yu^EN$^uBBUSqEvc4)dITiso#`(H*~Z?#1j=?iL#c`-xzmr0AJ^#e z(EG!2+|~l0`9zS-0tdB3`nVAp4SMs_^=*KB-74#g9c=4l#1n0Wh|m*j`oPMi+|$nDk9T&MFtV!Ty*35YhXoK^ta@eX9)RI<@zVd8H|lozgpHv-x!YzAUByZl{5{1 z6hyr_?;?>$38eO$FRC`mvYBF&TCp=^8c8-FvY9)LegNTggp^-Y>3(R2UQxk3RtRIS zmByYtS^{wTnqB4C_d;F(tZ)twhirhE!a&zWVrbjrzM0~$y9l_CAPay#vL<`1Abi%o z_er^Yw(kG>DIZgixN9F}MME-DgZTQ+WF87UTuk4)e276cgqv{&BjYDJ%-X>DH`NbY zwAHmBxx6gDZS)^RjwtKD4C83vCkE%87U>yQp+LtFR=8maPNvkE5=~-ata{!Lhc_{a z3>1s}%=hJuGXgy7Gfd@;vq2%F&ll-b)C+d3nGVC`4Ag@hCvXKfc+u6>afTuM1K7S< znL0FXo_=H0NX${&edDnMy16s0l2aG&g1Nx>Vb^ZlsF0HuLy`Jh>+P#*Cc>Eic=2d~ z>(L3u3u{5B^;h*-oq$)l>!SAbFc3|D*K-TH6YsE-o3N_fXHq-q{{rjJ_hB#rohxYS zel!Bd?luSV7w>i-%MSX*cSbif)?B>3$~Rebu_M_=d58(#mhIzcWG1XO{M)W(L;Pi( zXvX1b+xsr3Kq^Uw#=UJG&pJ%0iA2IEO^*DKwO4F=x5>S4Htm27NLn&Q=$Vc;F6rm2 zpto9HS(%ZyF9^x9jhryrDd_}@YuXIKFmf*yMwNIF$KH#*XD?CajVkiuIyprEHFUwi{KOTV zfN>X<3+yGvCVl6pC+=Kh{GxxhsyKd@o{f0+6+#{-;Yr7avuw0_epSaWz;(Z=(wZrc^vy`^;v^VL8K}J(?wH-eTpVQ}0`&l)N#jEoWoq`zn;sR_ zT1F+Irz7>S>HM;%V#bv;8Agm=_OrN|@#>W|jHL+?!>%TC9kMzHQ4Oh`rcA}fFD5Le9}da^ukA#0#^#WEOA4uqHQr_tbP((orF4BGM{zOHk;dVT3Ls<@>Dig*s$Ckp~r( zZPNgAPLmoenPURFvv3c41(R{KkBcv7s*i*9E3+WK1OEVq56nJ87?bu;n#*0D{lE}y z*4=SVLnY*!H*T9xvPF;FloeBHSal6r5-*9UgHX4*g{_FLY{0ON`1vYpeKbL>XJgyY z|3Hwjh{?0C01AZ_vEyB;KVkJJKqZ1)t;akZTu)Ul??wm>y*#V%LQQ#CLr>`&_y^vf z;oW>r(%Ek7ct`DEbw^W9vcNLeO&Efd91ajrSk%;x?2r9QJ^T+;?X$wmE3N+fZFwQS zoRtH+MJA&euFf76%SWsOLVcXG=Bi9@m+Mb72@7l%CDsz&b4EmWg!u`Va{?BEf~pSA z8tjfPycc3!CjNVkK4&fkmguoZ>2g;!aQQa(D*-ECtN%C73>Zh`ve*Q#M3xD4sl!=$Ynj~KfHpvXYjv59j-c2e-4%YHZL~uQ#obd~(fR3$WQ49tDQl#G7SkQ{ zpGD&(1c|v<$=6C0&73KU?97Kd9AfTrs)o@5y&ppBXc#d%q;qD6%+F!j5oN1an(3a3 z%3yut1L{-Ks46j$OIJ41oyq};chBVKoA(>c*YQ&nU}k=>@w>{geBH@YGW5reDKRw6 zt9C=>K6+O~{>MTZ6Z??UXTt@ZUOowLUQbe$WMdk4AY?$miU+0P5?wZ(*=ofe(O9~u zBD@{*-)27aTwvzo4=DS2T@bt~j?2T%PRnS%yb{wou3h$+t)cra%rgsA(wtFq_DlJN zUwJ9#9dRlAhU|AmijZjmEm4=vB(|$#N^{?nP<)~{shsK;H%0jBA9W(#k|YiF>=CUL zG4v$OSELXppY_^*tw|hOOQYfh2FTv791adw88+6k7U`p`Hj>KBu`W_YY zkkj6uLRl3mqc26G{BHDriWUlw4xsdxVM6DN4*MAnx%B{T5~X(AboAINbb9hIB&bJU z>iEl^C>L)`F}9nehz{Qr&CgnGopxDteD*k=t(#?)aU2%A;Rvpw#Tn0n{!rfGSC3hP}EAh$}F=m3F0&|}Lj??Wh8g$11 z&2l6Fx*&vw_+;}*?v@#;TF{P=w}mG42zu!RtC4oSI>Lth>d zW%Ci**F{9w;a148;m^y2+*R;#4%$LrHSK|2a?_2aKn03* z-oUUjHGTx9FBL<8IdRnD!F%R>mWW zpF;dx_Vjvug4Ik7;A0g1Cf0nFCUE`l;3(6(n2bz35I+RjdDw1}Y|VMcX-qcTqr-$* zCGghJalyy6d$Da;v)vnUqG<319>$SXJ@TO+Jz2P2iSaFh!pY9`c@9-A6)=-j_CE5Z z;9Z-B49>(0dRk~!E#5N9zei8ZSaLZGt&AP~V8b8JXag%8{|ktFF+*A@ju|*} z@&-CcvaZ8&sHM6Voail9@%`ZEz#8nl7HG)Fcqx-+4f;}5A)i{rkesa}jqnO1t(w3( zS*?ePwqM?}m63r_Q2Q4auZZv8CVO@=m*?9`&fv)=`dIU1N;vP$u9Ks0E(qR=DNqc7 zsQ1zJ$-}O?^g(TW)qMp>Od2g*Rx3DeVVEnz%B{t6GT~H5>;3l2`3)sqYVx5_knBE` zLdR7YB9?b`Tw{Ht5b-eVHp^3hHFie3=<9Ypi30G%e3dJStp~X3HAebanSQiEGzY<& z65jhJ$9r)h!1R3W>`d-vbEvxS;x!&-`4+i-vlHVx6xFeK4e!PFKnEWOGte~h>yiiW z8K&92dTOy5s*m#KsAqt2kvl$36Y4-Z^d|uD{LL!JEbc(r`dYOxAS0X1KFQy`yrbr> z_R2N2+=Rxp<*AkQpr@%Ot#cN0vKEn=8LS^AYHe{>*8_4s4v)ZuYm{ST&=j{@@7nuE z?fJlSP|fB!cR1D?4oXKc=Fhy#X~{}!dd%uB*%iHk!OB}oZpf7&U_&nTu>NZ*Fz#Bt z4pJ0no9=Vmlb9dUj@&AKY!0D%L3*(Ne zCZ%1?0}Wkn-Crau7$pPZ-@DmS(y%7i&v*$a5ehR}kP8Q_%q??$*}ObEt#7p;35r^g zBBH(q)iCAB>>Y?>JFiB3@uWAGoRv=1I>$cbACV#AHbj|X0X8X96=8tmF$?l@+4nR7 zHUC9~ZHu}9DbUW%5ubbmiP^lfz*}T2pR+3p&dufZ)#v)hAO>#d1fC0AP*hW8b}{QQ z9IoD8wTL&2^|ecG^j|skVP@&1^Vz%MlWxMHrsgpM0h>ai_PZI}0 zes=4eAkzE1`BE;uy5{q|KqB1Rs zTUv3s2@Lu~bb&10_idS$-TBb3y@!7?mpi9|nUcGud!;0P2EQ^6?Z+a*q0*b&drOQL zeQMTicDAcJU(K30--qjTowF?4{qiV(lsY{buHVo|6Sth(WXGa&KmRqNl$QBRh6rr; zc24fBvwFJdSqZB2k&Kk5O#E*;vB}Q>2@v~i==zpJ2XPccJ#*ZGLTj~UnGg<_%Xp|_ zJ?}BQ_f&G8-!CWAa!+og=ow9MIOGExW0$RZWwO3UBRg#Ppcp)M zuFrSh{58qZr2m;$WOu7mz3M3GT&X07I#DHy)rSleO&O0V_|GQ)z5v)flAtIemkS50;A(mE~E*a*(v z9FLr44@|BRW(yj-+!+=&`{79%92G~mY`9A)J>T12c(1vImkq8y6Ou05J1*hdOHEh1 z`qQL=m@;;|P&2TmeIPLJ*he%>$Nl zRL9KG=FU%LBVGiLq~2nh5A%AWpMm+jvsJ9zWs#|;klWnh2<6a22e(4& zlV$CHfbq=wV|_hVP_5vbOq1&d0qpW@{PO4wwq5|yYpo6nU)$V3&C7nUB=fil8oF$g z!wem<#}o-CUP9Cs#Blp$v0=VaYB2g87-y2*4ekZpI`3ds8Qb(r9fTWal1sTSn!2YX zn!*+l@n}_7Tg?=3;I>6?381`a*`uwnXo$+5T!M8H7rMJoLt=2QMO&#J~a4E z%m_YIr`T~7a9G=%wHD4C01Pk2Pspe7!n`-)-}b37{al=^8C+9XzLW8`^!lKP7;$qQ zm`y^#6wG<-e8_6^s5p4Tp`BCb_5GwaUGNANkUzpXlW;OYpM-7z|Y6(Wkr29 zk$Gp)k%WcjrF)I2)o3Xy!mj7Knaa#^?BR8b57fBA8x0B@b50aSp|HgjWF#Gj^sL%u za>pTQnf&f`%w#WucS2A?BCx&X@tV9i7xElT-gl-**9)X6eY49W@Y}zdCVC;|0A1^r zhx?H`HA&nZY>a*Jt{nSY%TpHQ;u7>vN(Z3y*D7T12=r#^Ot?=+u?bcwG;2qPO6aiS zStdvINKreQ+hhwAtEb^YAyC7;Ciptu9!p0vQV6zvs228b8SPF51J~y^5Lw?{BaK7> zv}u?N3e7wB^Wzrmp3)-9_R=C=&4xwwxH0#O=_)!2!)*Ct1eqCWp`lPbDZMqLL_Al? z?7Og3ZO3Qup562~RS+g_p8U-uvPDB&hFKV#0um3~R&Q3w_i9si950M3%kCUY{>S3) zKjy~{sQ#Ysj@{oZpBAer##GZ}Jz8Iekk^>UP2<$`^cII!HKWO^hFIML@Bpeb4#ap6Hqa&bBrG$QlXue?GL$)tOO53798*!EcCsXA9Y z&Jq>wNLpVwb%GuNR)`JSIx`y)wAy>s;6k_-ChVw=OXJKG)%n-`XVq#}Sda*F>wT#$ zvBsI&GfW+gV+ctRP77@OB$xG6hUr z3tiPPj~+>u*9#-kv(8IxEAE`@Gda0sYVJl!Y*?}uc0CFyl3)*`De4FK$)?!}K-tB$ zn<->ac45XzQGa_skuY2+c#|3oskHk_cz?X)-`alr3~sIQfz1eJMiH^hW~|XKrmken z!ZhW0r&3;edO^ATF7^O8C}t%C0k>%Q)l7IC=Z zyxvGkN@oT#E!&PAu_wrTUiVJAO*b?1#5s1$$kcRy<(h%hpeQc3qqeN09_@q~wDMP6 zdHXMBaYLsK%YNsNr~{bP_617x?;!VbgH$77Zm)Z5rs%sy`p7>rs*=F}h=rGW*NUXO zo|a4=`Q(t=-{vX;J#uYyZkkB{h~`(_|3l?ja&EleWW@q|?mWYN(p}!gj!#j$JKHH? z;+mOE+;-oX{)~e@Lum;}(KKd;e^Y;+TWv68ni?3>55q?)`~&~&+6i|41!Q_(iX?v* zlCR$_L??3%b(w)}A9>&*I z6a0}!_)JGONp-1}jtfX?IS{=3ASfZne(E<()lkMC{Vs z!ce#w-bBp_&W2Ta#%OZe3Wlw>F`CbRX+V}5^@(ylkcO0>n!1x!Ee74{Pi`rQNHC*_ zASHi^GVU7MF`|5y)r9-N3e$MSZMLEr5hj>9 zFr~9Xz(}!XI5SPQ)mj=>n5L538jfr)Y|wq;J+k-GSpK4Vv%e-Ex+Rlku`&3h2oo$N zOC_?*Ja?TnIYVAHwmOgBNuHUBb5CB^IsQc;1a@m_Zsnp1gnMQ8ad=f#55$ana^d&j`SrsXg(TAJ_k%QD=z|zpD%C*Xf$ml5@q#a~N=<$rnW z{}p%l!l6qdhe=cE)ppXpRw@nz%Qqu#@84onnT4EFckWZdE$-QL7Uuj&K0FEhI>D&w zPRy7~jyZTiF7%Z0mFicR=x+_bvCL_xJE8c^9xyN}0dCe8YK+$i@H$-S;2b{HXO8cU z_1l!cxD0*vWUqfQRPV+|dN+q^dilgeEh|*9c@l9QIkYH5(-1hS#8m3>ae-Psv1phb#d}W zWoEO_^GB;in|br3hK3&t6V>?%ZG&q6eG*;nCqhamm)Kuq=F1xQZN{M=BYAazs*Y86 zpa^<@LUqO||H4l$>vh49k~yB3L|tyRggo+4Y4Ow8jOQir7I*oA?>d9YVdbemBk<*`{a?oY}VI}$hd2u_C}KQ_>>n%X|9;{74}%FOkJTe&DJ7)H-r491yDOH zVRr25?DUVpU?+Lf!97-kwksC06?GuP-79rEK+Z}ip~MoEQ*_;i5krdrbO}2=oB+a7 zr=IyWh%}<7HNxD^S)A*~EUd_x!hm+OoGWwHSbp#Zw~N-f>n_r9smWOl*F+N86n=Zs zVHqm{G5Ad!)`(wfeJ+LG$Y_1!DRK>v;9Pqy!>T_aYPyk$!=70T+_l)M(LabvGi`W< zex)`HDhK>%43_z_O}0b)>D&0hKEHmTeRcabtc>o9_h9Pevc+-XKO&JeZdNGvC^D&R z)tTL(GBn{{k3O!9JQUG+P~YPyHr!abrN?!f4=T*q>XjP6v6G9bIUHA`6j`qe`ggwS zxB&2(i^_LJRO2z-|K-fe-_M2NeE+-Td)dZ?Ll;h}oK~oDgYtS*7tvM77Rd5Vog}Y=%@tDS>Ims0?!V z(~NXplsxL*ax|e1{dU(^3zsV-#;gPAx>De3qV6MAPVF#jGG0j36IH}urZ^(uRY+;< z?PKsT&;?UX9$e4wujJr&*k-iJqo+n$!EO|@98<6Gk&61ZH zQ@^up;|lFx2Y&Hr#<}IsI{W=D68M6099DH~5y1Iw@NI0qvDHK;$Gx7&#XJAz^z;}u zO02o#9A=zqp&mZ)B0+w<8G+2a(7pA!EvsZgWCEs{g|xNk_>(aAz{jgf*^y6^d|D>j zsvk1p*En364#^^a)^!)L93zuFQv2fnn{S(LyYS%K+)}*d7w*NGaNH&`XY4#B zvLUR2PKS!EjPEi#4IDDl{=(eDpV>a*{M8JZoYHDA`$#s_VN=)2J0?(ZnE zdUY*oOiyxXeaT%~%!L%+1kB%lXEN&@sTc`2ALl(Am^)G!dG@q*OPYwpEgO zB6hp>=HJR3$GnAf^Ew%Mo|I-{QMlIw{@^%aG7&%^8z*!V5-*!4vG^soX`v z`#0C~v;>o%jk_rOpkrNC;t!&EVzuBGb2Mo}v(_?BG9-O~gvA!Boa<|CtUjtEE;ha= z+%^V*M=rn_?h%Uio;D}paftV!HqMP?)nwg1excW#W9h_C38y_ZJ-fJEs7#~fABXsO zC}{fmU+&n@=aMF$CJ;x;3iNLhgzw&I>Y?pRAn!Qx>U^iM1-;0uGK=#~_iZr(`~SKpaTQ<53SPy_XTDAx*!S>cyl zkI zv5)Y5u7-jkp54_B8Dg$bY!GM8LKu1z-P_Jh0V!U+THW5LF&7FNK8*^8fxubOhpW|)MrAg>kcgglk!oech zaE0!cEj7!_MW5!>8!FEyb+l968z-H7>=BIyw`S`tAJn=otjF2D@Fess93EiGBq`!P zI!HaKK>O=ejk+RoTa^ zNbaql;(p&6u67q}R*_mYp|tWZ2}$LT-U1LNerF7qTu3Jeq5;kyX;_^u1nKZB)O~GO zCh56*-@06Fo-fUFFPpz1CS49@sQu7&fO{?Y2tas-iX(Q)yEn!@Qkd;nOM+O@2h36_ zLp62tuWk_fl8jcvU1BosW>{Lxk&U4w%X`Q+Ggc+oq(}>&+P$d+S7o{F0D4U0)ma{z za6IQ9oMVsaT^K&}(rnUPV&;6e4wZePx4$!nMmgnvcm-HJ=fUjA>)#)nF~1)Dq-Rv> zvvM0H=|9P|q=;YjDxUF{JW%cdD&4%3p}&oKg^x2Rnl!8j-Y&@1>=wv0z1MZ%c&90_ zaIWn|y}i!wDKb9wjTs%jhScQ6bGA!r4xGf?n+~x_!-N=&O(|MU@Unn9f`7Glx}q}D zVp+Nq{Kcj!o!gGQw|dxQp+b~ybBBQ38RdjpJLVZg5h6&7;Pkuy$J}(#uPeG5qcrpZHSxxVj(#vJg z&R#ZtmRns8NM=`cNBu_@vO&Zaoxd}+!8p8~z2LLa5^gwa?Ui(hPDKCDd$Z4f0EX~P)P@cBpi97V6s3v&{P z^@n0KQ4}w(ScTqLMVWkuXOglt0X#0_<(P{SaP{M!9O9URu`Nx0x}iJ%{At%Z`gGp5 zr^6MBfL;=K%Z2)CkNvohy6H1P?wM`mtX>Z3n&0rq@I*W$XAYr%WE%48CAd9sFiyO1 zZWjHV?0a?XG8A2+UD>eL;}{w|0OQ+##aX~Od>9$4>hl@HkJsT4vwoYw4=AX*>PLLQ zEXk^&;li(Po*DffgQA-z{pgh?yNH~GkonYSm}bP!F6wT!eT?q3chvrqz4IDW<%(W( z><7diK)Uu)%nhwy!1{>!VkttiTkymgz1Vl_+d3{WEg9bawNuY%W}e2P90t!E?2(k2 z36E<%7)X-xmlHWdBUCDja+_?81e7mHOZ_xs3n zQ)Sb~8!(pX9_xw|w7w9ibf$8PzD~#6O7p;e8@AQ-Ren=dOVlsInLi0YO#-?_&9a=V0sdea}w^>efi_>;`2j`xJe zU3o?eqyrOAeu(Mi19ME-8(^?oZIq)v1&bf8RbTu3-AGd|vePq4?g4i8!M?=KcM;4- zjj+?=O#HKWy3X+?yd&eNlIAB`lWSY4XC0?3LL$*S(J`eeSCem?nLZo71F?#y~d%J`*Ep`h+t84NU z9153MYWZrx6D{l7gl(RM(QryP$-PPg9XqD6HK2`)t@Zo7+ptwKPpVv9@iE_C-3V&Y9s)I_vYLcv$+zJio^hGR{aeDrb{ZxntVx)b*^EB2I{@MH zXu^<`MkTnavmSvYGZCQB@Ww}mSlV|g?5?+uF@DccioqP$xk$LDY?O&kWsr$A@D<-N zVn_L$e2NCdN#eM#3BCC%F;tj^Sk2;hIu$Q|@nP4ZAharsiU?7w~*5%S~^8p-M*|3@g4#7>FH6^(e}nS0{BP8^}H(()^W z$_}P+%4sT%Jqbx*+3I`4NSg(!d)G_^wyJ?z#i%Z&&OoQli@OD}FFW0{kLWvD3Y^2& zA86D?)-Kgxut-?_3TT3*1U2a;ckU(C-tc~uv$*Xwk88~%B8I7VUtK3v_2&_B>|Stl z&IN;~jowQ-`4Inz%KkPJ9Ww#tUO~MO;9#>9$y=Ymr8MypA1-w-$9YTAnlIY8txdmk z!ua45$~XN=u`+d#ru5b=RKi>)ydew(`Gc)a)4skmv6)AF@054K$lB7bC9Tvl031~3 zwe_>z72Q5@hFh9%=QT2Fzmuo$$kdou8_&2Qn5Ng*d&3q&$*ut7O@REh z9X97GFLJa&R9HbFw(MCvYzv&&YU%yA1}*$qYfWXi94e2Pkc4f};0%WLs)F&eoE}t2 zx`MKJad!)?hGB&plB?G(^W!Q<8Xdx(IoghQPit(O7| z6b+S@k1#b_er-muwZi6#r4 zxK>{*oXYb&ZwQ)i$opCd>RpCIzK+gYE|c2D_Mk&qG&+AaKB#y|2u>57M`WCIM|{oL z^!(5G%thcMC;|g$aF+1YJW)e%^}#-DOx)G-)G*7R_iOF6opsx)B8gf8X;VnhlaFlz z(DS$1zd+o42@Wn3)W(s%c?+A&eG}Uzp6YVx?gO@cj*_reD(83_PMGgV6lSgP8?5Bn z>$%KBi(t>TLD>sw?8LtciS(u)e6^~ykV-!bb$MZ0@Y$l@bdg(Pt=;1Gc$sjg!D}@yD*v&)#qE#+q_vm_dX|r}&P)#p6uGI0B5=B2#kg)f zsQY-NZTH)#&JqikWose!E*Cy5&0Y^pT^+Qjv0@+$x~plpLZ^{U%o!#(@k}lO+AMS% zj9^D+Zj-VOuPDYS%Z;d;9$t}V>YL1X%Q56n=S&IC=B7s>6dEIGpA|Ey-XT)IFQ443 zlI)j5^An~fm_8g};d8N&`;L}5W~weWgd*Rn8Zh^LlF8Ygo9S-GC>1N@XOksXi0E34 zO-saBOyf87cvjw?8Zm66aiL$Wm4gDOs=!VoFUt+j6gxYyH{dyJPq;Jbj9D`D;sF-99RwdHu+ZA4`vaFftNw_1K16h?QoZ1f;mI|OS%XOrwhQ-p>GxrrkjPphFvVuB?%L{@ zsaWaycPzI(BdZ`HGa_^FtWVgOWm4OC1SmegZt09<*r{Ea_k9&(_+8v2hW+@xnEOv6 zEKgGU%(T_Y)2B!^UV>+o8@pDjoCPD*6kARpyCeN#Enxv8!tt8Fry|1jx)m{%EU8#z z!yF$=<}y9i%9^o~e4xlIz71uG6Dd}Gb6tvS#2LhqH&3-HOCr0&(>Avx#E3PJO13v&OWevv%2Krom`YPMI1?QJIF9nMw=8>)zP;LnUY?IF8OuzRGVgD9ykkn*Q<^6RE+)vhSS@X-$MFKfQBt~*=+Vln6J-+ zGz;x^dRte4efy^pTNm6obE20Q>4z-h^5K0po2E4i&NszwGwEV10W+2)2ks}(rvX7X z!`QvDwwhsU=|7vCDM$S)t`BP54zTkgc;H)ohS&IMyj5C1iXDvLt8-g)^~TGj zlcl%Ci7PO$PLggctiQr9ni_ZJj7x~6nw#E}iU1+f4&FODk-f*vs&m_a{TGTLuFvQ3^Zp2oKC{9P`sw~#`0+U>q zH_;yv4M%A~QNn(a=*Qo!ZD}VG^aZ}HJA43A$Z_xwnlEp#t5+J&-O-*r3KD3iLy>~O zR#J01uou8(2ppG4gPT6?G;4HzlLaL8zY#^A0x50|l(Eg$nLN9`<5s}{S67nvIW>Xj z5{#io|7GN1h~fd#=M0q_%YSxLfV{gEa2KF?s8oB6$sN5H52NyOi6UFWG=JwR4LV1Z z#{-8%QF_P^zrFgEdPe6@OOiLc1in6cIMs;id28?4$_1n?*eMsN4ewW=S*W>OcbV{a z*JizpDDr>2Ll0#fZwy(oHf95Ky};t>x74)Sn@1F~#%^i713WM0T}0(U&QR0uE{b;{ zaDT*_Yv*vdXW7*##(O7va2?M$CWlaQA(D9Qe_AIUC-{+*aMv%1cfz$hz($a?b@(rH z)X(tDdAhhVuDCzCEFC8VKm!=g5{7IsEZ_ZvP#Vr(4x%8`MEi>`^>~}l)7ShPw%ri2 za1gS6@2vs6=HDJq0;#LwbelcVv7S}6j|bB-2F>IizI=)wwIszr2Uh0cwJ#6}=%V0g z|EEq8*sN)W{x;|}8#$~FH~*KFsOJgVwudGnBC@?vHfF`t zAY2Zc*H9oI70r9{(gdvs4gRH;yejrLGdo>_+~Qxj?-MTWf6q)HJJ2tre?#sz`BF&S z|EElK`3Bqq7-M!Yc(eTNO&?nKUd~-1GZ6`<&Tzi3o%!Y_As3BUJs9~bj+-&%!q*kq zR`~Nf+`AK6A-K+PB+b;}L640kJ*l4$(bqhTB0?Hk+!$34B&sp3cn$;+>*p~_yHxOI zrUETPZBowZsx!q2qpbQ?>XVDCpw(v0aL|i1)k!X0=GRYZv~vT~fl|{s*XmVtZml2m ze-=enCF5uu#-LDJHne>y%Ky(EMLpd!<1Jy z@78+^20Dq{uQd(A0!InWyAFOF@LivJN!=7Ux6Vq?5mZ|=fH!glx^s$>(QWR3G*=** z5dumgD;%Y8p%o>QjVy5B@>G%Y`>spPzm{so)n5;JNKrH&`YmdhWg&Sq#ZABZn{ z#f^*}=#{9prjoNR{7;+=FBG#Zo_QBVQwZQcIsBqf~dO#S?WW-jGY$NAbl$ z+i1y=`}8cT@q86qshdcOvr388gS%sSl(-ytmG~bCWNh4mw1^En0k>0`&X}i=Da6hh zGQ_mO=W^2YoV&mg!(hQ6S9TovAc$VI%GB5XNQ8s183t(%7r7UgNf+XxfGZNu@C2Od zt$%4ES;8T|la>ChatwG8LJ@uQ8}0_dfkQm{;M9)THjA|#_5GLl&`tmS{TSW7KbEw@ z4EPX4ZB|(-Ma2b%7O-UMYyu7qoKfyph{~jtsm0h-xvl|%}}3>p%__^zEhToQMnZ*fj>-MLP_WPXcSNqA z64F9I+I<-O(^K@(x4hgpv}A@_u;aW6WpjtNqXU^<1r=;DOaf^5>6dogcw;@{wQbp8 z0Zo{i0$p+(ro}MT#w5_?q=oFWb2^eqGw(1XM7Ln{M-vST-;Icf zvZk`1oey*e13u6W^(=L)&V>9ZS>5lny8s&O>Fu44?R({Cn%Pp|>rEFb!?&xmkbTri zsr+D6lZi7dQuCxU#D4$TT(m&Lw>RL`N3%5{tald1&G`m)Sy3+35}`F{?mC@Frt{#p z(j1sUDc&zvA=)K$eJCL@c1Q@-_{(i{TX7vGPdV|f$)T*9O%{HZvkiV0<%^O^a<||X z_CZeA-5=!1Jj_y%LyMq6-4k;&Su12fgncJYKcBHZ{A)Iw2V3I&#`Fm@j4678X?;;R-eQfsZXrwb{r183VILki#MpwmzcSyQW+#s|vI2W+i z5_R>Jx{*Z_jLGwV(Hw@2`oY5X2ga>VF+)96Zd!JVb6Gr13^}8XDFYPSs$JB=gs7IYG8k;d*UP<{QsSkhpMCSuPL# z*vE^3Pde|-?hA2lwvlx)O?We(X^{Zo>H>Fs3>xmI@fc2TvfCa*fu*yY^Md8+6kH#T zdo==%x@o+2j-+ky!GOLbX=O&lIU2W|VPV5NIj!nu7Mm*0y1e~+?^@C^wg8JMCUBtv zuQ6p`pVsT(=1aHrLsHi0pOD71ZxrT;;LOgHQ-4~^wQi9=Okd}y9_!GUBYkRxQW<}W z0h)x8!bh)cAh4;DLXp^@?`V_`{UwzS zNrCW|Ew$)KYb?+s)bgdO2i4g(k0f8z>~n8+r_? zopU`7)a&7+s74Lot$w~;E`aOFO$#LyiZ*{wLjX58NrI}+tD|pfAoa!}eHb+advMmv zpfj=>n&6_3x`7C*9Bns+qLwU&Yi&%ZWua^Xz??G9?xHDJ77sD zigc;G`nTdOn{#`O-FjdV=gH{R<>PJk$)FBjE%*rTnNmc`=k0-~Q{Kt^1CiLW9aC2_ zVGH74wkF)$fLWWZ)0mnyImHOS^UR$DHBqOK%mQ5BJ`=jdS^!gdf8C6(K!P`Oopuje zV~h2r_CKPy^qT0uC2`4ni6|7YWdNI7R(iF}er_$%UilmqE`vXSpE!7nu<+}2p5Hv$gF~3|l=6rlVO1x0{#Q=Gc+}VXgx?S}feAcs z8p>t%+C_*tR->|BpZjt3j^_@)wQ!q;pM}FT%n&*WTMr-Jfc1!ydB!OZ4B?N=l<)(5 zlS;C=kPuj$bO6z3z~t4zN;~?P8eGqVRxmU+cOZ#Tv#Sqd)(#qi4V)k(Ywy1z@XIg! z-*&zV@v-a&H&3a*qC|TZ&Se_(H)xRm<&%E8>*$&CF4dWm%e~59z53=UIgFR}{`35} zBlUhNSbO7=UVHmpjBL}aS!;pHimjJ+TW_%H3->eG?tMM$-wwtb__slXsL_Q=kT5ha<3G9Bzc zHnm@0?Y+Raets}D?|vvJIwC&c$N$TDm4YmZrt?pb0H;s*f#;M`n6Jw50V~Z(bAH%z zL`2=OCCjbJwYRd*7iqtv;ji>M%mymfc8S{ZIInyEdN?Dxlsl3fOd%}FFh04b3~R<= zO7ve|tz_taXl>&qlTVYoGn1Pqvh*2*=x|t`w_LwuKNmG4>x{C+riY8>|0DjfOPKWg zz?|O~n2R?e^urRxCM-zIz!9@@r5(2U8GfEa&Bu8$9a+!JJ1@S~-Lwyr|e#rD40hCGMa3s9d`PIu(?waLXt>8k%lJsEiIVz1PnC zl!4QJwIUa3bxaj53Er4)3U2xrwA#lYY*XW!KaNhEEFHrq(PpIK(MRu{HT zO4P8+g9+j00NI;}gyH(*Y5Wf5tFIUSLQe90wXhMOkuOqRv~v$R4p=4dq0tEf=M{W+ z{u=cDS5a_U0sDFP0F_o{S~vQ-DK)D!mxg$?v{%G%$=g8tuE@p35###{3~G}ATS1s_ zyq-E=g9<#Tph0eE@yy2=2iaoTs0;Wz7~7+aqPZzDzLVRCz)^${E0I>9{NkHuWx1gM z8N*+-h+zR-sQHEi4on;pVV1%{gk}xuf!|KcqQV}M2~_S7PZ^Lny;1Q^`6awad8Ep6 z?9Y!y@`%UJ<}9LFbRIA&{owkOTAIhDwx-|Rp%1Hax8Fxf!@Jpgn>k2O@PQB4oJ*Ec zbb0BZK$MbpH~8dQ*x&9emkc@{1Nz?+3H~<5u4@3ml2R$|$Zp*?d65g{m;~IjL>O+1 z>_Ijj_KX-=g>CD(z!(`;U5#ELZ;l^wx z-iZBDQLnh~>uypvz~;VLTJLkh42gNN|FMmNFpG5_Z|(DpQym_GuSOg^)@&4{onflV zY{oRrQL#MB1NO)#3DIQVUi+4qI96{E9CF=Zw4GITJ<>BI)v;}gM|8UqRMnTTtciBz zkH`HV9!}MDnh8}is5MJ)=z}NA^fMj4UmNYk-3|NyGpFGkqXDXyC#N(ym@~Ew7RtD% z0X=igq!I3GIRd4oFUKX_E!=|sH|W=5QG{J;sV(o~HZ2Le@2nw zK5ULpH&lLwThNc(kV|KM8Ls_aE2w@Q^6ZQJ`g+PJ*Fz#R5F{n^qM7>L$t zh>zhEP^55=HpO(0>D9P;(G;g>VLQsP8Qsi2Cspv^x#1Q+yPy=b>Se_p?y4>;4+qo=~TK@ z|GVuTpKz}eK2KA`Z6^cJWYzSsX-ERQCVGQa6LG5E4#R$)Hm6YGHv3%T^OPeU=Jwxq zBrB4(%%5QI>lB6*ZmX!>j07t^a7=JD1I)SWx*W1_d_84KoG7Prjwr31Q;f(JP_Ts& zyM*xYuk8bP87>PUngh5Xr2u=v*9xCtr`yg6li1 zz2TIDBh;-r9H!CSVuap}qCn|hFKDszhh;42HO@;)nj5*)eRRIQg|UZZ6H*IO*?5J; z;i$oF#=Dsqt_2AjOV*+VHVm`tOu1{tB!^(2j4SmvE-9UUyn?T@R^lCL9A|a08ri9C zl10SKLdS1k%b_eD!p+ZZd_VZ~n89lb-c4+uqC+RLz==A4OifIgNLommAqm)9XR(KG zEPd#=q~hT{q7S0PMko<bO($?&6S?)bC%~rjo*+w>BJXT7QAUf>UC!W zxVg{LBb#k76UW#dvok0<^7hg@^P0qK?~32DxW!S#{1vjr(z%Z&&`| zH0X&c&AND)+1V9%<`E|KZB1zUdX&v%>PhGIXxG5bjqs`w$*j4w;W&FMD4;)nMUbz@2Mg`EDZ z`OLzw=SBBl;IQYvAg7rv5;}-mxNpK6Z*d-+_E-EUzF2%>0Vmu zU$)ur%{)L}7;g>qV)TOQk&?;Vg9L}f&c7Wwd<6HDY5r?WR`7%LDN7M+(4W{`s~5S! z9*m90eW>4e2YKWa24v$d^UmuFo;lB6q@;L0$Jzt$wAe=>2B9)1?fS;`e7iq!XO84y z%SN|WF{Lu%94fb(`cn=X<4tJC*XgA__K~ra@l$L2Pd?qo(D9E*?Us2lWS>_Djy|S0k`0P>Y(kds^&xd)n#5iRSJw zx_zm8qeK}~V`E&qCTxr}`gei=sXC>A4hWJ(|HaBz?OKf^FMu*4W<|Le-3rqCd#@&m zdCwYLWksBM%Xu8z$zJac`Tj8odNuY7VKrgm%k)7x6rZsm=`x=8QfaGR2YaslgJmeJG}#2uO+>xgf6B9p&FbN~E~w7#Gu5P-SBL7|uN zjo1PzH`8}$j-!xXx)m^RiG6Qh(17|*fP*C&f44Pa#j;mjhVXab&?hn2kjj(x{({_$ z9vs+q5d)idR6E5LC%G%6s*61StRr-9SCH3iyt2#>=KvukOk1+`sBqU9OWXDb-g&zRtprtJi6-MAHkr;c5{pl%xb4;YEChUm228 zqqe(Z0uEOkrRfvF+|9(_!#V~-2p!S%6E9VbGR5xefL&o>eoHPO9rODi!RF_!v-Ry! zXHo|YX$y*sXzYKd0zz-2Vyh}nj5~sBRcbve^6L7bIsAwkSO4QrrLV<@EvL&6CNk?q zCM>3)D!);m%`*`7IXC&SICX^+XM^O0lT^g+W}CN@bU$i?Ib?rmFcEgm1gWjk2oR?T z4fBKju~ny?U ziFp%&i|VWMfjHZJE*EN2Zp35(5Q$bNEP0>jOfb#$q%w@piV|DrVEOZSZ2siJf1n!L zDd=w_aCSmgpED;_+ZXrR-ODg0n|hGM?ski9ULyfk0%_{fAO$|bt4--)%ihgwPf@{765K* zQhgP(STq#iFsEpPfh&H7pO`-yw>zwHbn%2?SL1mHd&@V9;@oy&^=H{WL^4cmR1~zs zJY;W6y0fA~G`zoBp3|CrLz~+}*A=v~)>cwsH_7yEhhTP2q5KwaR>j5|@kempQF|BC z{R^r2JN}K-(omd#h|`MkS1yKj&p3DJv#a#)ilebX%PAY0WSKs$&| zhnw|AxG4J_>dQ43yzUqB!~Qj*b0jWK33*)7USdm#xCx)GD3ItOCEuHuMxu0YCQFQg z{WgEw_QtXr<(K+DrC8M?52R0T3$AY&1!XmBcSliolS1@gay9TJGz76poTf9IvlygM zC5=LsLo{p=jU*tx*~IYDb4!g)_XCEEp1UV<>=>DHX)T4ciF5g5Yz@9U>jv59nq3jg zM^1bc7YuM<3|@6aK2P|_BHC2idH7Va(we+7vMbEbY<%5Zasr%OYshJOGPVe4dpSQ| z5uTzooRdM?(aapvrG+;yvVAV3jDSS1Ej=6-Z7~~p)WLy{eD|Nti{Jwx2o+f`Hz|K| zJ3=v<(mIzy(4YgeLfh^~vea;x{1%aJW$)`(i)jlD==xC&!Pv0R4QH#3$fJ@u`W}9_ zXyH^32m7xLXcTKOH5?C7gMpA7c!i8%oJL1+KXTj{v1Mu}&vsSp?utEjyt~932^Lr8 z)z#ojnUPkDN?wdpLq~ij>m?z{ectXYErhmulKaV>FjXbnLj~iKjh5X+bLeQ9+!3lK z+d~ebT}u~gJ*h4CoN!fNRHYi6AlW3IK@^jrmPhQ-J6#UIsYC9CuJoS|wu+-SFX%Ot z81T}+q;>3Ne*EG6r6Z&_b-hkGl}%5tfvmt}Oly&IY3WdUA)00IN10g3a}Hzh-o4U2B^>qM9pt*z*T%QnNCiX4I1 z?orjv$sGnS!usrCTZKXZ`J)-7qu!osZ}7T9irJmd~kwVv+dWf`Iw=7 z;d)tZYH2l&!wBBT}f3YIM+8;Gt0NB#Jznm^a1c;^4{BxO+JfKJoj&EGA&pqh(;;!r|IGN=yfV=m)#2I&cd%8oHJ6pIP zaQ+Ek;6ZsP-xqkD2KV93p}DGHk&mT?`7O=2K&c3(k)`R<_eU0eS_|O@(TE{FRS4U}i`)qLoF$gmL@68*Ug!U;)xZ>_0|6(xuv&x!ibuYmW zLSjUuq7=hcDUKtee|`R*7`ni#Y%wo=9D|UzAmQy zM{`j`$FJNP(;wg2D{fQtupdFzQx|y8oeB4COm_CcG1XnZu$(RRBA@qXkZveMp zrRoxlp3gmBnP$TrmWY&z545@7(dN9pjn=mj{R)f{Q#BkF0Tn=d zJ*@qbnbk47Z`|d#%E6xlXf6J)OyQh*1FH~TLWCt7UJ!$ z6Zb-Bk0zmOaA0gZaQ=)Yj1Pg0UJ~^x+LZ>~bs13bVWsD}dOGq!U~OX5jPA?ON1Hm+ zxOVuQoG7!-m{N3_rlOD~lG_CAxqwpxbPoO$C9!sqx#RN+=5*3Y`jcF0W0*cEp5S+`PPE>sJoPdC;lPhdwJ zB$XzWsHuj4aiS>wVv%d*u&+VuZL3_hg+BnL@q(y^8%v#6Q%5r{nR}>|(M~VTZ{&2Y zVjbG;S6Gh~9|ZSKlunVX!%Q1kU8&Ptk&P&kG%5eg4Rj|v8)QmwNnn>`24H08>m(TdezP5_xH15phT5Xs4=*GxLlX>N30|dXubH@hQrP1jbn@7{?DG&igshy7 zb45lqVu4=gq8ao*9@kxk~&)#g10SMd5WVQ zH!{?iJWVv-4=piUJ>?=^lu@dXDF;(YKEtA=3pl`meEF~oA_T4R?ZQv}0dBMMt z{7$hT$QbC}EP@&CN$YZiQ$)7IdQE^)+0-mO#Y_|1G_(aSeCM|CZuXj3Xvr;*l6rCP z7yG#ishair9{O|I^-^yZr;#Pp{3B$f#dKYxKKUkjP?@Ipj8tFeUFnr zlpYRo8JUL%y?>=+B1DJ=KaLEz~ORGQkj|(_w;v&bR;=oTc#W;p{|CD^%4uXS5oQy&h^_k94vb?#Qc!b_`4ncc;b zeI!e*LQ8aB=H2NkSyp{3`oS-B`UV%gCqk>L{LoUsIYF>=Fn@ZxHJqFqE&a(v3HL+E z<#ea5x&T87DW?*c<^`lVcHJepb93OmQy1u6rKp*iqwbEW1g3gZ3ucbE+s6>EnUvzU zu0eQJ&c#z=!nZK0`AZ>?yfyRgsN;@qPqM_do@EGI$kr&`qD!sqJm+tGo$cFM{5C)3 z>HAybCAPYc$VgpeHLRJ>#8O++Ot2UHN4eA5XA#by7AP8$pi(p$z8Y#<8BYbaC5)juxyy1)37427~FNB zUIWfSYCPm{Sa1*fy@Smg&($rXFW@*K^|^Fau_&h=t!?)dGiN6(zO6ChxCcP?B?jDP z%P`AbFDRY%kJg8xF8>39yhS9nh)%Ga-EvUEl^rg>;)FdqiIU66e%2t- zd=#64H`z@PJd=_@t$7~P5lPOh;vxBdnu7Qfs_1>TI(v10eh8sCPrh|vVV^#7CeaK^ z_F7F(kDwZgm*gVAru*abJj?G3G7kU5p{kk}HrVkW5m24;oWkc~C;q^>92nrS8gfn6 zRX-X8GUONiH9Q>j|a zzw0*mQkRn0fA&b{vAYr&-wZ>W-!a^;#EfEkY9{d7xh=I5+U>BNuIcUfloxQg{RAyN zFaN!f@R5OWgZQ7b`vwXsx~U_yl{A^rA5>zzlCOb zE(CUUgJ^S3$$!sn2nJlrZ~iO42Jz#cf-Y8;L#(DD)Tr-Ay|2c5WuLQ}bcW>AScrQ` zgYB#Bw>WgHimE39EOZ%o9x+`zsf=5TnYG}M;`qnw&J9G;wAVu!B0%cQhpYEN9lm|K z2>{c?K*ktj!jx3h;_#qR@iCXu@HKU8$$YHyU-=*Kh{;PVaa-dT_W7X#Y^e0b$m0gb z?f#hc+4_p?0rHY^8$!@(yCR=GL<(pZx`ZRrK9IGwu5E)k(|^T1Q*Q~#g|N+4#!4HK z-5Q9!aGH=?^O8u1XyjfX;9fRkxiY|{k71Lh zFi)Zet;;$oxF?=oRS?nZf6YrWEaa?}Ze+Za6b(y_d32}J={9PLLMpL^2Z z%tFE~4R*2Tq1HSdP!dfr53rGLV8K*W zvntw+VlNq;My%wH>P_aO4)FS&Xy5--=Q&D9;ZBLD?Qu40AUd4b>m^?jEqM(Rd-`cv zDf)dbpDQ0sqZNd$(pm-bc+BEEyBvC(^lcUx+J)598k%;u=~3nW4dnGI#OqQWkGp-_ z^jV33Mz7EXB#Va-jM6qvKj=mNnTp8nX@ce?hAK)Eivh>4ovLek4C}LsI|^EEn)}^0_j)fy z-}qx9#Dk!7!_sOXcWQ#~UfOXFUfgoW@||MFx*PRwtZCkJ1aL-)4kn%McgpWS0En0% z_IR9BL$X!R$&`XsKgp3x*AxfyFH0YtRM3R7AV6WE1w=aT*(KZS+YVffeZcKV)NVjj zl6cxqq2Es|kgswG9Nc9Z2J*Yq>MHxcm%b>4o#!`=dfaz&OGGNLG@hes-ACO-6Emsk z^4$^!O+ILXPMP-<5bUp(zBNeAv7XjGsrqJ@>PWbPYz&w`J2^(XFh@eNBqa#9bnwtG zc(+@_6_BfQeE<<8fmf@WH$SXo(6_99Ij;3&?slK*XstB}^1SMRd9|kDdx|oWV66|E zrm5SP(nE3HwSh+%f{5Zz=bqrGgF`3l2tlZac!hd%p7s>6J?;4^p_fbWf)XDqFmE*W#iZ)Xxix%WkmOSkWF1Zw=e5^5HrasKkE%BwZ_oAAfAcy}2F zJXz`Cq4Nu3|g)|_x=d{0J)*jHQ$g$+%f^(V&FR=@o1Lr!}!DQC4i8SFy1M3 zYyZVxc(`b%4a?$G_!7WU=JuRCe6vrWNBF=f6WaU5sy57nE9(L$tQ5SV{RdoBnBIIqYut>9Sh+ zrA-ES5-VpVR-TosfQv-vx7kt;_oz|+r6P-*m&tCN%Mz^sO?;y|d))Fh&s^$pL*7)) z+h-i%p=Y7yBv_fJ2=6aNh*SDYn8qh}j*UgnUt%A|> zJf5j~uw zg;mv0v{$Gt?&UndHqAc7pNYX(`s#UZaMwMCgcA!-cc;4=7JH`3&X7FK1&$2up+6d) zRzGq=48T@o40XC3yM7BBVSqIDR&vb16@&a-TvJ+T3(a)vLy1Fr(%RhN{CInH z*B)I}dDJaopH3Cts&^2toR4xXGlD2e0VJIo3ULM)LG6~2F;73_2_wjfIc$(cHQj-| zd?|=^Nlm#Xk>%0^%n6jv%0n8D{P|niELJI(4aX-C^>=TlcTCWn(c7@M8{i~(6Pdb3_S)2mvgGDpxs{gu%SUUw_H%_gTZYTBpoGta;spIXsn?fKM z>bcEL+qgjEjJe{q`5KihLtgzJBfDPyWNU{VtNj8HAmGG!QBp0#r!sT!}-Ir-JBs~ zTXv;5HtxlvGZA`3k+gGP`S#QI`YfdQloEG_}#oVCo0^=%KgHN^O^ZM2hRPNI_W7HO^ zDZWsgj5&K}b(ju0cb9(uL7wEX#t`F&^;&Ti4J_pK5(_OkUQagV&n+9@G0;q4^*6#6oKUd6m^tjZ} zIEA0a50y1S&ln^#iBH>J1%v>BYi*{el=q$tps6?!O4YltzAIaR6eNb>uK)?F3RsUD?|Fpy= zv}H;&f9^$Exxs9=CW48$4aUpsbZvJ(G1*kX$fW{W%@JjeOPrF~*#K<_0HYk>3o ziS!%+!dBt0poe@4u@~PT%iEl{bIqZ>``Q<9IpkuyI$f2N=JMz_jI7Rwk{cDR4YebYA7ORjhAi;NH zO!%*u3UyXE&Ti()X6-XFLkSROyc;kwzu`ud1ZKihx|#fkR@4H?Sm!+!f<3aNCt|KT z;K^>^V4sWUdSv8nP3{`~Gg>MGEXU@mUmW%>n+V z#p3$cq3(C_dtX7b@jn!jj3n*f{ePsrWmFtl)HWI{KnM`rA-GF|I|=UY?hxGFLU4C? z2=4Cg4#C}}ad*BZlbK=ed*A#0xNG%~?pjsVr%vs&<=M~PXPbsK?>R$*KhO zT4>dao!gtq1~9_xT?q?wbgUcXt3tcWbBbe??SLVV<~4GArM%xb-lOHEju?PiQ$J_<+zq z2&f3&KL1`%zrvF&$J>V;+7_t#rTdFXy07nWR^R?v4@7T3Q08Qu`uCe9_S@5yXn<}@ ziqSYd1|kf!t1fsnjoh6St-w;=4DlTs4Z`k9RjqFKMwrRY6A)UL`p=?z1I>ph^(Qh) z!NFm%JX+M#Z9n}N(|!Xj_7NlpEyg_Al$Zv=2qNR`K)GtEDFAP4bM-!q6LlaU)zp(k z<2Cp?iy*~1N@2#!pGunLs6ez%k{)9NpDgc3!chuJiiewwzW@B+y8^xV51`0nNZ%7uUdOo{ zWWek3q7ycqULO^M0(rL!-99AoFOJ{|j*ASu9)3XVjN|oDk{>+S5VqCHZT}DNV{OE* z_w{+Wa-ddsBwvYDJiclDv`|FfzZf<$l}|D{*w8NwOEG!<{C*)k$pmAxiIxn7vIYj1 z26hdimAVFY<9AHw+6uX0-v2#0f+rdLqSHTeN9@(KoX~v$B41nv9V0~&2?H61uEf;M@NcP98MT|1{TTgW3PA7)aG6yu zZ;J~okPaQ9}OCJD_Lv!o~;-FDBF1$h7zT3g6e-BgRg%nJ1n!<6Jw z5>|lnd;cQ8gI4cT2OY~pduVrj&NJPQ@=SUT3}H*d+SM}aTM^r1ZQ|o?`kdC9#A4H$ zc^}Qui}WE)7BUtJZqpE(p!67R5ppxUf2VuhKb}1p^^ufW2`a1v=E*ivh;XVb7#(H- z-E!*Q45%M*MmODq3L#_~Em^07RzEbcHoxEozVU$kp$Q56#^z<@-umMG3%-aNAEw`k z>j|68puiElIf4dKCvvD|@8UnW)Nc$5GJ+=<{NfW5)Bl^LXMs!MxtR}+QO4OJPR4Qy z_mf!FZq^(cStv4Rk>H(60xl|k7d!zIi|Jft^(yzQYG%MB&`W3?pHI3p2IjX{j1GtI z7=T`ZMb(voTOx4nF{`*#at-fiUSbtDE2q6IX!)yC>dsC0w`bf$MK}X4u^B&VeJ#&1G@K5?%|k`Jm@m2LFP6l{W?^ zE!(`mc!J)w#|x(Z2Z;j*%4zDyu>;>%OLDdSBM-=<))3+7_g6=?z5~^-9!*b|D(RYyr^#|hQ|M>Z@L%tjeg!&`5*QD5%d%C*wp9ER!FpJPPKr)T^#IQ zOZoxbf0x-w*$1J(;Q)&9J6Uf^x5f^sTnho+!ugkwP&Je{jq{c2Th%80kOg%SM1noM zADy7wtekQ*aS#uDn=Qkx@l#gVY#^^r_5}Athc?P2`j4sd^ZrYMRQ?wUdNcFyz<5C0 z;;qw50HBNid>6oGkHYYv+rHrI&utf3N!62@IJ^?1|)VfwfVhA^(_XIl4qj(I=>1b6~= znkBhI6l1BzeXrI$9w48BCIf_u*(d6Hk-eV8U0j5C3PEGaM=n z00;iZ4N$t%#rlsl-Sj|{Q5XI`iD0ZC>wlv;npL_^oE5B&Io@Fb- zlaO4?gVE96*sZ}0`|q}|4I>X|IZ=8`FJE(@GWAsz!(l>8`3;`zJHJ2dcqkha!98nD53C`!f8aMnDY|#G^3B&}RO|*P6arRg=onUg%Vhzia&kz>AzV6N)Fb8Ol* z+Jsd;(){Z}-2<2#(prikD5|e`%m3|={8!Ckqns2swDR!|!SjRl5IM80Vhi%9!*=2w zy^>Ybt7Z660zBG(I!JnQ-!4lzOqj=ywFdmEp_2m1#&F)qSDp@ywpIB@eVtcq*i)dz z4)S`d!#rfQScOu!j(E>S^q!DJVj#wOtj_p%{`dqgl)=Utt);|c?d_&5$F-BN@-m_^ z4hKzq%M7qb@22wqEdPoR=&hbt{rM#NnMbjF4v+3P&73UtqG5vUmWxYBd2za&iX-V? zBgpeQs@c_ztnAt-FL8!TP9C%LEf3g2aZ7Jxxt_

HXvf-`OsnW@c$Oo_$|B*7TlP z@F@VT-f6?Y=wzI6pQGvShw*jiG?e-&_P)CYkiE^V#clZ!a7d87_IcUq0(^vXGMMl( zE`q@V0`;5Q`&qZAA?POdd(Ngfe9>+4#n?8Rm2LrsXEvOx3-@H_ZJY-ydzAS*LoMSB z?8VqH6mlFR*Q+Z}Bw)Lje??D>4Rix-Y@S>-JoOj!4zQ4>BT(K#PPdiAP-%-RU>%#1 zgY=u#suCp?40hf=2RXG&L_}oh;)CghhIQ6f1+DAz$g@wB1#;&L5{w2pc9#PYdPb4F zxcP;as?VK562QpJjD#x6hCRyanXI!pT+w!|jP-4?TB(|4th90t41fe@YB840?%INz z{=lNLtONmAQaG@b6A(-6@^f>@;6lrra9F3U^V8GgjKj{OyX6LSP%1^+qFjp7fE}i7 z6wpHZ2%eW;Twu;d-C5oKlG{913zdAnjJ|n+dH>P2@k8J`MCmT&q;?3?tqrK>9=pi6 z1eqT0=%L*NM%?*5nTE{iXE_|EMaSUVtWror{=24&{=uf~Ob^0*#mH{0jF&D1QEqu7 zn!t@yDI?;_rGM0S#d|0PM-?}>6`2N*SqN@Z6=QrhE7YPKnVhe4=Y(}CSP80DX$7Py z|L_%^=t+bwHPRjYetCjR8DGLI70$&3@*O@Hdo&g)XIsY4M7W1{NhsIDBX`G| z#$V?@51#C5h_sDhO(gp2suZ>XTW}1Xg)g^_8<+V9Ufy-Xu36HM-N1=acX!s>i` zjV_v*o5~qbRuhT!k!@D+%`=4WtCuj!gfHq#mvDl);A;|`8laSyA|)TU)Tod%)EN(P zg22C9y#ms4%dM6NIyW-tH^0}jrao=NQjtR?KF=bmBf>CGoPc& zc$F^XJdq87&9J!~d4`gV4;XPmTO4&B>M*++>vGZi&*cm9ISGeo8A;UZwObw(srxOgI4{hLRVc8e|r}m+5DcSqU&yQ z8*3iw?K3l^$vcCL(;dW+mSxKEZK_Qi@y=v*QT}KTAFk0=)cps~w1G1tAU0hvQq(m# zT|_(mTFa1uenK3J)Oqj*wxa=*ee;4i(v8WB&N~>GNhZjdlwONwHfEs=UtS5BAEsQJ zo-6dPC%L`M4xw-%>iF35c|G@$+YrXjo3sh@oexH9s z!g8TV0_XE@%#3N4TJg2@_J$IRz7?_S;^)z>Y%p@Y*=a)Z;tiXEmX;TjIEvV7Frt3cQD;7KzY+ z1ENKVNZN^>kE=1A(xH?|SDjZ%8R<&Oy$`Tmv5zd{6&fo^+BSC5w zZEtn}uwN^xyrIInzR5Hi;B~-?>@^E*bQX-@)plP1IYA#SGz}nV90Ocdg(%GlTy?tr ztCK&1q`ZNsk|4;K7C{HBJ7#-z587wDJ0<_C0&pcjKe_mytabHP{!1SKChumUx)?y! z8;lVCgu&>*DBo>X>CE+C{}LEl`?odUU!MYL3DbMW^Qgg)mU1* zYtP+RkOA-+biVLF*eY^7)z!>SPDnXjnNltGY;%rLoQa)cN8P3)y&Ad~%LgeHdE;rN z==lFzq8*4Uv3SjeaeV*VUAHv3|K z&%kODVLE7oNYXy&e4cVIeZgPM&tQ%)LpH=l>hnb;7k8G1Qv`p-)WsWt?mv{+4Pvcd zKLv)_a9dqNmK=9E`OFe_o<4{(Ny@wYBvf#+?h^hTz?`fi_zQ#IwRd*V2NJb$TniB_ zdW=DJQA!?t+2}g|%W(3TE_Zwhhvx#(9rojy@_i8Z|k(NOb6}kVKF5ze8;|zeJI@A6_ZuJ)^;$^^taK$Tv@^#$4C9;W*1gqYJsuP9 zk`YtkqQ*@#4&6D|WI`C8i-&K>a-8&7xWPINwCEB)Swm(l<9x;Tca|@?+x(-)ok7~ZY(ftzsIl%@I7ZEI$pyRA1kkLv&&mxek!!ca7h_T8PXhO zqgsmLc-VE=TK6eYLoYVKt|5GWct^E}#^geFK+&Pb*h+;Y(&lJ}ReB4J1J3?eFfHT= zx)Ses<@)Q#Pb6`pq>p@)1|TJ}utrAa7>gU!n&~5-%}ze)4p-AE zd*9AV5omJRG{f%D+-cD|V*r-ZSo^ZNBZK$I`-LPDLi2_D`&62sV9;FAQ2$G9wTAd& z75g`}^-Bv$g^tiN601M{-2gQO|DH`KerRZk^U-abbaa%@=z{7A+DfhTO^*Q8ioryU z7TY#1x6>apD*?juA#^2HY&y`$mn>@173S99*lhl<-^1wnl|C5zqCZg5Rr_X7o;e z4^`En=gU@zU~}q*vDitF0-vopeBZQ;`zz*+z8~b>$#Z8A)6Ufw%SyBbttc*es{=Mx zx}V#h5wgH?dVpI?XIG!PG)mPDzwK?IHzFTJ&Js&LFrLip*N23>liN{~E$RJlG^*_*?*S)?2L#=Fv+H}X7UY?Nv$pmnSTnG5f|-~R zc81iFHpd4IR+5>z*T-hWT4^KXMSL z0hy|jKi9r(up13=`c+~G>XAf-U&~B?1a1*h+y+C7s+G~ucX#g{_x(YCEx*1_Mbqc{ zvq#u9&2s0&_j;Xh-<>nru^Sn!R7h6ce*la&W{Hp6plnOue7X~17rx^%Fw}I!MFz+d z!`;x-k6l=i76k=KyNr2VT!<;{=<{^D7L#L?aYY0jM4Q(osh_;}%E_689Bkr{d;46a zE}aM&lmkh9d0*bT2m(-NF7U8=Q!@HSwI7b!taF!wkPs=MlE__6!!OFB=zH~wx9=Uv zO%d4HTumXY{_Wg}+k_`)t8K?*TIfVdwP$eQmP~0KfPau2W8-I3-rS~VP9sXSALf`z zzrb8+Sk_mn{r}Q_ajhBP1ZrY_9sv$vrk0JG-xKM-(0*ZXpv;J}PHOpuj?8-k;_k+d zn|!(a!`Ur*ttB&{j$f00tth6EDT`oC`wr}~)=WvMV63Ip!l5N?z*M-;@f*q7xVo_R z`oaMO_mK5v?t5MU!l+hI@Lm35h!zYf^ymbjx zBi0V3M;l$4`%Vp+)_X>}&4<1SKeQ6p-m1|j_OLa>-cM2l3O#84;evndu=7Ai6 z{f=7{U=nv1E-wS_!b|fGjdbH1U?<+@iIqs5!)tIDVaY1)Z>#uG`-SQbFx-Avb1kAC z;q4?wK<8psm{ZWXlvIKcl|L;hMQm}m6@p62(gaEW_n~dh*~y{@du>T$VhRm;kEi3VqahB{*(Owg2l-bq zKK0X*nXOK5M~l)P*Itz(jaZOeoe$)hFfAd+f#$7NPZnUj7v#bzKk~hMaOe`o%ifAo zKeANQ$KOo2qx6PWcT}+8Ne%<}H@1=D?aH8T>JXS?^|gH(-_*lKbXcS}o|^T$x{<=0 z;IQ+>57@fPz~0lFNLv-i+F)tnt>WzOID`Gvr|Q^OEaa7sz$!c^4y2tC?T(z9z1bI$ zV{+ak3_{_idjE?(+r8HW@X5o*n_;+X-rL!rKA5yK^wN5Gs^1TFs4}DKqq@plk+59M zAdMxkolm667G|EJ!+;f)vM0t{OFc5-EgN7jl|+y2mG5XG3R7-I{*}?;sbZXhF;Pp031b#{#a&UhDHmcM{QBHIj zr?%^_jFwgZk-xXwqxi*sO*}F}k!%kH(e3G?uPtJM*3I8Re_W(r#?)!u;^q-xJZoL| z;rbZ3TLLzF%Z@wz@vQlK2F&AF%x$}XCaecrC(ukT_P#z#vZ_58ccXXm@8`*U%u>aM zbC_7XdkcclGE{IG4{!YLCUaBbq5LB96JmeW~s;)Umw`cc^*(i+C3@-sL)V8LF#*;DsLdmA)bfRR-ohA=2`(WPh$VrtCZ_3AFzl3BwaD^6 zndi5Y&vg8gR;Yt*ot}|{g>i|sl;NC%e!iNfKime84?bjIp~}1u)E2K2e%B|E#K$SB zsFTCToJ8c4@xL(7qp)Y6xE5ij(3zMX4XF^V=CAx((J4BaqU5awH* zFL1C~CcH2RGDD6X(T#El+JTuBUO^wo12EP3WVk!2599)bsv!ogSnAeivC0_u8x>j9 zb@pq|UXoL}@9DaWj8&GMEson3eK7a1SkK}D&n1eYS?6yCRjLLwK|gy)1y@9-x2N0e z^7hWbiN6_DQu9^*}ZsM2^uSx%`zOS>BNJVa>@6Y3ow(qyP9NPB^kvCzA5FhW%1XglM^!+4cLmrIpP zvjC#}32Cug{Ekhy%plAJc{Cx-HoZ8N$GISTLq7%6I9N}@| z%tZ^@DX3Oreq^iL7xhPEdyYO8bZ1R2({`QXx(GFns#QwWSY&S0I#;QLOiS4p^R!%k z#uU9@1soxfiI!U?HLcTVW==aaif3kuym^p|6$H}66zonZJHd0kQyNy;Xiql5CK9~$ zBYQP`mT0#{mhY$;>T}#R$`wk9dJ}464tDt`4LB9dJ|7*(=gn5(FtRIV+*QNo-I0ZB zAXbRQJ?tlsrPf$YS%Jz&mOdOs7`W2h?m}$Q>J~m5D(!^ce3)?MU2ek1^Gv1ur9qmv zJxD|9sC*V55#{^6#7?Qj;vx;(W)ykS*|q(cvYX7pA{YD-Ps&6fmEEzOy159KUA-m|eI%3MC##^7Cg9-pkqT$5&|o z6_~`U{jLFsXg;|~Z$VSTI`~MAokejNa~7Unap(h(TAj&1S3=sn{mQb;0`|PO)OU1@ z0&V)`|EmN5;tX-^JoAb#s7k!oz824L898E_xO80WP#DJ$^H?QWrm) z*3FmWST473p@@TYaH?2a#5%+7tDJXGur-@Y0c>^4Zg`6s&u%2?> zG^0so@IMxNNCg-?WtPk1@V_LmR*5nCO)C1TOnwvY^e;C2M@p3~vW@}w6KXkT@27Iv zewr%%1u&4Hd69oshqXqZ5xKF8KB>FiMNp~qZL0D6BG2j&7^cBnF+K5O?#|Pp% z(T$L|u9*`5E`E?%XY2)1x^U~hyMu9gPKOnM_3{!%E-w7viXZMWjeh=B`tS>{x)lh% zmR5aD(TfxJ?Czxpr z4QA##b|;@Dd~YeU*jnoMOz#S_eJVjraa2&piQ>;OLk}tl@+cpmJe0wcuOP_mn~KMjLzGCss$A!&>Me4fZOGUb zYW{4snDdC+@~xGXi+LCbLS23M{fuuBUswQMS)U`_D)Ra&DZZ&rB>+tVAzQ0Kb4W`m zx2Vl!+p3gXf$o6sAK%Fu0a)B|=x)M!U?EQ9A7xX8(yk5g2vx}BDaCRX05X~Uo~C+U zQkgxa9Jr>OuEVKu3Ixs=98IHs$9Y_eSqZI1rYQY?86lrL^c=$yN`!*zp8^;f7lef8 zQn9?Z@-sCWzZfkv1XgA&y4od_QzP|Tsd{YkqaVZcfMoQ)QrBMn{HxsJC2Q7I<;3Yf zJVoZDf@t0ix!k-EPT&sQ?u^lW1a{vrlf<{}?$FY;W+egIgu7lis$f~ucs4js@8q*^ zn=SM)_7v48_vfdBP7`MUZ>NDa@bPdTOgUQW$wOb79P34=9sz&C{>A)g+aw6LMA+^3 zIbOp!1fpW)>!-cdNbY}#DY$x|`-x%v(h&xiBk|M~52NY4F*O+kqsXIQKB~PyhiycJ zJRqF?BnL^DC6!rVSHRs?fCXsMq{p(x^aFY4OMBJ~Z# z1v58flmU2*;b`XJw)mg&m~ttJi)>a9xM*-+{B-M7V6{phN3RSA{3J2_UofSZ43LHr zWxL*zuT81_#p+ai+_3c@Ts45l6CQ!2gUa&#KZk%{qI`MO2w#$@r=yQi+cK*>{{n(q z)=2SrwoP@=yN|cGuB)cjn%>x)uhL)?p!@8Uzf?PaWoo#mr>+DF28h1oP|wX^PvdFs zUgyZsVL@{EV@N`PXMn3T=X{}UZL|bY<-XBUTT#osUr+oyQu_@q`VypjkjFl`p@>BF zY-~YV1@IIqChz&IE0cawo?(iPWg!8qvYP*c%J})Wz0{0@*4~k0G3INa1=*~T@&ll20Wxqu1U+Rt=2_f|YRVwp5q-v(c{Xjt$a z!eFq*9KllIBoi`vPE0d>^7$rr$0f#bruVaPGa0=rzHB=QZLGn=FlA==sjZa=+~?+9 zY}YcuH-=&2qNlpY=Y14o>|$T1@9X=xTd{2hF4>ghXuHo->Iv^(SL?KSi?`)*h9ok? z8seaVaF&3ODASp#!DSjJ2g(!YkhxRX{Se5i4zjcb5E-WF;pq_2>dD^dRtg!;p|2{JriaH4qxOPfFLhy$Z=htLyC5I=Jy?I0lPGg(ST{igqN(R2Z zRDHaZiMtenQ6J$36ggK58O*iQ??&|H1&%nout^~yfLs;G(&m2^4CBl0?m0eePv}I9 z8lDRYW!F$+Z)OKKyuY965==rZF9xQ03lFN9)bkcl{i*)oO18FpPbC=w6Nn?WDSS1K z1Fok;^Kfy#uD%xUYZg|VVL4M#Z5L&90pb2m7$a)ZJ7^raB}}G@5!-VKWpk!|Pwnn% zCa^cOX8RE>oi21oIqsxbPNEgnRz5v$lyv6DF{s$woR*U@9W4nn55#g`O)-XK9Sldb*+ybFT-{sV#9>J?D{d zm23iubM)f*A`F;Svf-gJre$d!EKD|ezeK>c1c_s=j1Xx%-mpaf2-`$(cP8+4bMPj> z-DN*TTjc#*kt!M+yQbe@0~?5Xk#%~BR98%DP~{O?*g}MiJKQ@lX`+Q@<@Ud1xxE62 zKRAFCr%6l}PL>(XeVbJ%tTQCFH{90l+^$x79#r7zQaUXGsgHATZ1z`gt2UvYHeY_@ zqFqg5dmcEQc@^D99|UVM*q!c5Z5o-i`qT-s%FPEX@BgceU3y`TdR=njOLQ8~URTe1 z_Gz@8jH68KBtzbvLYFb(yAnVaXCBA;G%RHCb^Lrlt1(6ycO$~Hdkb{Q9cLNZOy*uR zR*Hy&iVPz+mpB_+`C2vV+*$kMwDYeT_O7XId}T3NV>pWZ8*@qpTIHYtMa9et>CoW;-W>diluxR}HhB}?`-U^Ry$GZd8t;F_ zKWheo4Htyb9FQ%0?)iM?=3>ScRnYx|@?a0Xpgf!Ip1p7S^@cR*aIQ-p&c~Q;hB~#`><3J8`a^@L$~YR>7B%h9+dL_fG6cz? zByz1}#&9MSQrgh|r}HyvmS{y^dk_N(0#~FEs0)7VGT6nY33svE@-S7=OTzyW;&Z;y z(V00$BF7}t2nbvVsu6uB_%Y|})LT8vF`i-r$n)@+RU9*E-6mYFBO1w%>};wtojRFL zPpYIuS4A@nZp3*EGp6r(9bSqWY zp;MgI`ItV#03z9B`AF*rLrrc!g4Rvmd-JSOo!&F{9n016${{}{sjYu1J$YQA#FW5Q z@LEU=?m1_TqKqu}M2ez!&7-o3&GPxPeQuT_?=x)(tt#Yh=UD77Lp%^F1 zhuFJSE!!febUh@<%cR;8QO@kAl@C_T&VKej59$TKGE4rrioba*==u-HS~boJAi_kdt`Nek^LM&o;iNG5TYU~9v`%O z^}FsLhXSTZrNr~g8HO{|irBCQ=L4ACm-CDRhC}CCNbyM2@+ESonTcx23Bis)RHvGc z_w^^H$8<^MM`RJ4rO4D2DVbW_--y13HJblog2XO}C~_|cRb4LWppax_5-JeRg<2m+ zLsMBg%h%HQG=eSXG?~M4UL&&f0zGs>;vxAlk38{zL(4p|O$?@n_1QXm3%8sS-cB3vdVxiL`ZE!Bv;A$Xyv7mY=|B!)1$YaI)24|L^i-W< zvN@8!oFbvtg~{vax>&YFzVqZQEEhbpD3%;>2_`1ib&+OrUPvjkfFmNW(=3G9#0U~9 zVn;Soq=W|-QNvtVa!+=W?NYCW;&S3CACNWdBW2=|eoV(w|4aki`phOCa)0Qc>S`bj zNxYcgW^&66hk`nXNVVarAIzh>?n-5v$M38?L-9um+i?RvVa}IxtzS-cv*r$Tiq7d^ zPQ?o(PRAE})MxD-kTb0c#(SvyRBn$N2i(&{nOsO62W63a z$p35fck8Pko5F+R+k-cgy^7i%r}|B023%Zb9A2ZBCS*fXLE0`}IF)Qj^shJtp3q+8 zGKNB!OyyE<|HS9a`;St(oxWL3p!JBDW{-K8G_q@iJrMe{Pe4*mT9pt3W3-#e31WEy zkPXoxchTol(zlk%NkGnJWOEJD8=5CMri zETBV4-bsPrT6{MBf%sfB$0CexwA0LNeFGZ#SH(w-_2 z)|TPGi$2hbOc z0vuT*h)hg@KvG}d2ZGVvrg{Z}@t#108e$PMWyW~_)cw~sHlr+gf;g3mv!%Pi`1ByzF@l~coFgEv)qzWZed%u`^omE#0}3ss_4Rky zwkF8Rdh?_khVQih3%sWz<6piCuv&r5%jNobV^q`C3s~mUIrquecKTE5>W|+6-E4*H zExKR7!Rug<=z|0ggx+gDN8Oj?D-t3fV7(4`>IQ?it>~*!q#KLpu##qq34yERnC)&k zpwVanAn{hGXEXuwf0G^lqD}Jr0yp43gSz5+WYAEq;4>*?*x}2zez|aq1Mm{rA+*>> zvuMGTuH*h2Uxv5Qfy?nI7>fcKv$+~*VV6ICH}a}QjZH7ffYS&2vL~IQxHoQchB7fD zMKb+Y!!GX3)uKiMP1Pl3W{PJ*j2PUb@F(D|CFuR1=Qs3?01>5l4yh3~GKOdx25jfR zh;6iN{QmPh%!v;8#DifYCGU`0g^$YI3Uo+U)2>A<%^xO#A>61XYGxl}uM|>}_${K{ zLnGBbW!IFVT91viTV9J?+9^$dyG8&9S17e5UhtN)xSst+{SM+|6QYwVHr8?O>7q-y zc@o)7)~CYuJXT$|76A_=g7gp^P`GH+m=1hRNF4FgKfDRqkXV$gx@<>(i!rQ|eYPo2 z-|bkhKy*{_s8T?vaeqI54azP@IoP?VNv9eq&QPx}qSMKlGuDXuMZ3nu=jmo{`XLh2 zTvu`pa+M!@bnn)M9J( zrB}@JT1dH4gZ6nZbMEBadJBo}oQThESZcgnKF$LeBj!SOG(<1XMK({ZOqvAd z%m_5Y%DEKjJ&-8V@l-=hiucb0`CyZrrOpjdN|yG%1{H#7wBiA4nx*V--a9uTvc|eS zb2k~;n9m&i;YcXe9=}%^pwFQ}B6XSf4dF6)=^17wCFN7X&S_)XQF1F6Bv(nC z;dL{%H&}y9p4*|T5)t@Pk2sopB5~!%QhUJ3;65Ez)UgFNuJ2vl6^YrL$jfnf4p}6hYjI0!lC&?IZh(|P%7Tr>M&2)O(iy0@0MA)sp7q24=@G`+e8tD zETEm*nXCXWp_=p87XC9&YY`PjB{O^m%&7~MjkSI(Y0HNP|F za?rb=(Y3q2tPpgL z3?OOXW*0~rKm%PKlBE4jIgr`Xq9`I)m~{__cF;v)yQeNgK_RRJ(hrc#Z;Iw-Pa7$Q zX?PDR&~h`^!Y@43?`Y>k=^IUb;r{J0p=;WJUdF0nP8YC9_0q8-Q2WxUim6yrWtFV7 zqhB1@zsmmGG$y=*q>?D{_j~92uXfBTv_TXj9kt>ULa5Ff?F0d%t@ovfS+(HnqmLsd zyPaQ=Q)+eV1-lqa*0vAo9gl?5%lTZp%N~SWAHT*%{HWZwZc0;`3dSTHEs&h5#pEp# z%}i4y2n*AN;T!C+ZYKHMc)F;PthQb$InhcEr+cm?zaO82J396AQ&d73s}>rY!MMN4V{F$pnJXH3WS zB9Gxkl@W;qlsV?j!0r@$Ju1h@_!h`>Z*AtNT)Oe44fbd~5SR{rcefZW-SCsoTg2Er zJ+GdXwqQy6Zn4pbnAq}?%^z`9QNxfmgq6!L-pq;|efZ(OZkS{x8)OJ}J>_*($YNiF z65D<2_)UWrNV#k)^5$>r4XG=qf}vc5=ri*d$Gy1DX`Cz=MHq18s)j>zQgAE$^j=YJ zg~CwfcHAw$VNK-knN+i|?uES*?H2;>v0FKLjJ7PPdmohaR7pAyAc!ap;KNO7&_Hr? z{T8fSpC-pH-!o}nbVv#&3oC*BoTLRpZTQ(mW!3gQ!I%Rxx|7-UpT1^Q^`lz%m@x&P z>aq)yA<6f=rt+R0(u$`{C#NLKo!>rZ3`*1A5?g%M*tKpVTebtIbOpX^OM2Ukm}#WjlJ9`wfl}-38%(aNwuX;rs_q&;+0mTBG1Ged-%ts{b)DIe-D9v?-kssvdlviBd+j^K8O$Y9?9KN)YC)%M@ogFCyuD& zBTUx=RQw$ZNTX$245Umd>;wsXCVmq7DJrg%j|h;}BpKLFd>Ty1szv02q*}&8oWPAM z-8a>0h@S66pxIzpt8;}Ywt2V2kUn2KayjpYey8d%!Y3={M0BtcusnHqXI8+ zp0_J}i=b{PLq7e;qY z&RkD{Mt1~>mBfD5HPI96>sGesQQQ;a3JJD#k*WLCImy#O7XS;3+>|CWyiON5{{ZLR z9o_xC2N3T=>hnB~XAYc#mM@)g<|h}Arit}lnpTQj-n)0i8k9JRUA1UVjf1uQRtz5X zv!wW8yvu1$&UhigD)nmH0lY^}v2&S&zV~a|+<#AIG_}(N+@<(gbg>arSCG`wxOv>T zCh0xoN>PYn?lt8|Zd@$=J<9=<7C&szx-=>VX zt3JH{X;&VftJt4E-|RB#!xYkKD?X!*^?+++23TwPkb!GvVx`CZL;5_S{bP#Ph=692 zw;Rk+P$T0^^=0Do3S(T)vGw$&L9&aos)tGWbLGU~Ql--9PEekgXz2D?(G2Qw|K(Q5 z&Y_C_VagsIq5N$eoonmLmtP6q`HR2)nGJ zt{zW@E(cmzn)_Ya@?0cp3_v-$KmJ zh!N;yNiRT(PE6oA&JNNDsa-43vb7+xqIC;=zLUTX6Yld{7W zvfzhvK;2CQIyF{4BW6hez--6ld4q5hibj{s7nb;lP4@E-hY60uV8G;0#aL-2pZbOY z*)T@EXDTXk3_iZj@G{&*&c07(G zA%|L~@tT?2kdN3L0OO_r_;s}VxU}QToO>QHvxO$|4;)FejDvUkmxEv0D-*YpHGSODP>Y*B&k#* zYL~!cHs;(Jf3VD`|i5J6Ovj}z&-?eQ)Nu7HZzCY@7M1*cR`Bg9%I)GvRUGb#RU|v>e2otYe zOz?qVmby%7)T6h>@_7$S&pJk_#Ia(sWR^|KhHJ;IUeivW)#n|ZiWiyf@A;W=m(e87 z1qsPQ0;&!8`jxW$ZmtM!v-=2=l>T$7*!aWdHJ!skyDsGe*b~SWmK#wyb(0Nn+0!8vA{K5*C$Dh@9K!1*_x7=XVHJA>OAd{1$|dxP zT2fr;N9p!Qoe9yqh%npY4J+go-5p%mv(9nf#NIgC0i6KzRo62OZ{#qed!wTD=1^8A zF_t;zJ+$0=QZ4~3!tox3iiUuF_K5r`C5Bj6s-qPh5TXx4iEa0$+S=F(n>&fQjxJ%$ zshrcAu)U4`!kf>b%*y;UN!WPn;z$;-cALemCY#Oc1CeSfl+ghkwo zJg}rivR=y+12#|N_iF?y;-0Q~1kb>4F(i2myq$33xY!?Pn|7Xux~FZUiU((eJ|j_+ zR;u^!9a>j-oKVwI6o)F3R>D*b+(k?-Z0S9(s%kZ@xxOnyFD4`n>$Ro(@+JjtpjH|O zv2Pw@C=^xX?|Bj|20q6!#WCa8`R!kudPgVJr_vjG_5rouY#A*Ke=2o+YS4wR_I?B9 z`S(W;9Rz#~V_Mr14V>rA-ybboXg$+6)Fx)PDQ#WH1XT~HkcAd*;cVG7`Si=1w$JNk zf_Z8+HI!8;`A_f7^GOotuIO+-H$D$F38p1V3)39i8|-h^u+P-`h@8`g+`wnQ8=rl5ksl%O zEfhFv3G>D%H__p~pcRoGh_SOx`n1|!$9u(PjwXK5eh%{dgdK_!p8ZI+opTZlFAvPtqVfwUakg`zwUW`A8HY6m7N&|#4GAo`>t;#o-!^r2lq&WW zjXZJ(YQ=VCb<>CjhYQ>Z>7-Yc;;$+2D0jbo!6ok&Nma{tfmFP(CuT8o z8V&tO;1*TFKmk(45iznOK8^g$Y4N*tp$5Ya%^GshG1>}+?Prr4ZT<46vr>HBE>+yy z(#alg$8W#K7*TF|0i1@<4L##)7pLLxeUgwuDDcsXv+-b>k&o!VZ z{vX=jIx5O8Y#*gj5l|4329c2NE~UG>lPe(6Hi?2 z`$fvGC@SOE*z}T{U$&)ErRqFMD?7^9Vi<{aA)=E%`f8iHq3B-v_xUzwN1-d*wX*eq z*nUrytkXIH3M)e=^E#32vY`l&_qnwdmpxxVi%ZRd&0LR;a1;?^&p7>j3Li1d*ke~$ zE__|lc$=`_YUp>9P*LBGTU$F`b0L%m>Dk+~P~VN#g;&3j8JjFSx841Arvbsf?6=Hk z!|-BHT_2-7q~tKVch4-5ikF@IrrVd1PO(;v4!yXksxM+A_ADY8dvj-t>O(wKH$?7K zw8<~ydgi0ewdodw?mCId;WZDqoFQ({^!Kc;%x1$l;#SRF*={uUf^w6Er5~Oel5C844 zUd6&efi8m`a{?gHQmAR_eL^7LD?+Iilub~GEiHHXzDiIfR`4La4;Q;5z#1)9HqX1T zByzjo=(iz_iL~D^_zJL+kZ00zWadoQG|iT;sqiYZ>+M-JEYw8TeWebIbQ9;rjT%uk ze52Gt;ckuXA`xya0KH@{PYWtYw<;b9p$c0mb^<-E6aS_gh3c?MaNWc@TbLL z)=p@>u!C9K``+3!VeD~+)x2?DRW2Q)18YamimXR|d`=^n9LzGSF}%bnYKcA_=mA<# z)oRQ~7tHm@*lr%Jop?z)7vps`1X0r?#Tcc znApz+b5ox^GM#x-3L>QoyXt>Cz-;;50M!ng7~_iJ)r4LwNvbo4!{dfy&OM4_HCGpm$YVMv+?^hN)|P8`{4NCQTgnB znGg8xH$R9vqsOi~N;OnN*N1@^rXgAmjsq2%k_VOFi}|5bucQoWV`|UcqNfIumt^%s zao;9f{_3HL-dHe2q*TpUJZ$CYZJrnZ=3hg zkdwU4iO8E)7bmAMwRR=~smgGb=|`9`XifIkwe20~;_=8RB@Ybv?Q!F8o&UOt;5FCc zYb$H@ViziH44WRTeg6zI;&>g+I=va7u<{?RHJ4_BxUd+{yE$VAh` z&k%X^^_^?u`VmLx3hbmF0h|TW+k72K(;+e0yDx0zP8p*X%ORE3y5+MeR@^@*q?sB{ zn29Tj1asK8#>UUVd;Q}*)~*${1ted}>BF|M!lw5Vq`R${%8Eu!{qMe<*KHWQ?Q80Z z18vHhWE#VDNXeZu#@$8s!p;~un^fp&Cympy``zy-f(W*w3o>+Ef}FjpmQ|UmcA=*^ z$7HR;mVzA7%sdsT;s~koC`+Ow8n?{Q&cRcn7MmBP1^fS#42zF8b z>;=%jQA5$!X>$V$x0l}3ke1h_u*{~JtgWzdJVVc%%2`|*mW5xt)O(Lin;0gHUA2L4 zDR?L=s&xY)3hr{7D@J$8yGh&nRQoCY13k?YbMZ6tHAXYp!rm$fW&nf4p*h3G9`69G zJwdMJm24C3iGIh}GKK=j<{`?1Us2IOY}1r|{a3?uLw4@oTnjBC{^GD)Op#b>2&|L5 zn-&dJzS(JSimv0HsWrM{Nt%nJOL7AL73}10U0XGLD}^M^9@9E)Xl}>Ucc50T87;Q! z=Uth0vLzk=V~EKAXG8p+Jf$u)3rom5P22T#*h|Xe&p6hwv%MtgzrQ>0l>M{|>YLoj znj)`=MmJb`ZXk$vBjS|umyrefKD$uNa*RZOKKeFY8?&8gcviCdcmq~*(;5HzCS@e^ zYR+Oj{8amOhoVy^1(l;?g{@d_r&kZkerJvG@lig~aGlIJHtK{(>UWn4-2~@2*|7DN zl{ihS0{H>HzVeF?aWLav>^R+xbD~5-e}>fcN{gvmy~#?;Fa7-_jA>m%#GTbp4`2Zq zwstC3d-54ukfW{)ix-~<%J8)iIIwV1T~PvGzfCIh1-&#mSX6wR9?C^<(Z&u-5ju@L z-9sp;=;JjU#@8QP*chZ!%7m(gBCX zSeLIt2Zp)Wb5D{7uP(ZjmIw#!C8&qQQ|9SwiPb??RHbK%Odn3i(sN3z9?_ zU8UW#MU_=FyWD=O(A)zGyftP$H=2zLDcyFYI;({Y6s#&Q1+GweVIFi@`Dnd^#LWf#UrwJLUu<)k-iD2xvb8OeQA;2z=;OHwrGwyp$D8u6xr z=FQ^waDvGvFvT_;l0$4NpgrS62V4Q_a+gs-<;er96nd#gy*Y^u74iFyWT3N7+PqnN z-jFW0gm&6^DVJWg*Q;++ce1+OYNyYKeXI`o*`sWwyx4wpXqz@V6p|=83s8GRPK!2} zcJ4UB(y4frYS~i{p7Vk*Rl`exLe}A3LahHvCRpuc^ukvWJ^h@ykkf57!4wEf$WVU+*&=&uD?5am=1ADQ#GY5aZMvJnDU` zZ#4fkuf4NkI&hpS!?`_5I>)#1}FBS%hTXM$8rtB&5>1~nH0!?GD!Kt^5*u$uQdeMimSL>NWh zY+^4nZjszXDeT*4vNORdw#8mJE#%-rjshSZ_qsGqT~U1{V2Jg4dxzi{SeVx_q5edP zv21Z9-nv`;m4np@#bNAwCvLrfGT=Qw(&B5~J*7~=z6F5Md`b))IT*KD2cf55Hh2d( zVIF1IU%};<-l;IP-T8_tGrO%V7dSy3t2kfFY_M9?DCEt5i z&JI@X1O7rFcs`FuEwt^to9e5QT(xrN4410^4CrFqT8%i73If~47I;t7i^wscIFLmQ zInb?VKp`_d&BmX+R}8DXm<(zKRM21>-hG2;O zF+-O1uQoSK_E~0P-h`xRAS(;onKXwTXAONy*KeHO(!Z4Oa8I+0VOK4WN_5`ppE!J>HY5vd*M>y!w2~>pHn{Rr*CZX zEeIMt@7y1jQ8-x{SvFv;XPhJtcJ$oBCOgq0 zH~-su(lv~gb=ExPu>UR7se?XiNhZ<87#v>DF7?<|{auP=skxQBe(y?zgWW=SU;cm`mDsSPS zb()nD9B&?EL-5ZeDBuIR$0A27P-Yj#gn8xD3r+I%RiGyTJ3`^kIdm@I2LicsMCjBGNOVa7y4f`h!9;!X7qgsuTb7mAZ~zTP%i?a~vmLWRx+iE*iew?Xu-GG`c)CvW6(EAk z&)rr;zF&`#Hm9A5Dh;Lv?eXWecm>U^__lLP^veoljV8)>S1w!e5K zUy(~mZ_0ZW%@S;=$#FEaqs{ z=e8;vqfdW)rSrKET#CIeivPQRsZ%&4v1mAit&!~T`iFxoVX(oF9Tu*q4}kvv6Z(DG zP=?Xx2a90tK8u33!k{atQMW?vCScMl=HU#vVuj?~38T|bMTJ$je@sT?VU%|_Vk36Ql}px(oeTYC!fGZ%i33IG1vc9Q}4AGHPP-LlMNM0MA(vP zL-2k$D%6^MKYT-3owOeKO|w}umBn1m1opsd63{CfMXnWirvF&5`0(13LW|cM1iekG z7%3g?ya(B|`bE`)7LPw8WzsOdNazh0S97{wMwS!d!yK!u4{w;}k;HC6RC~6|8*P*H z#k&=>ma@6cAu3zpH*Pnyi@6AzEgIdvIGT#puWjRtRR!NChJ-(KOp?zdz9}2X$A&N$ z^h$St;_$X=hf;Iyo%YrFe6i*mf}a3AFSWqWUv+$9&U^hu_K$@VASq;^7$~_X zQPVFJoV6pDnqAr#558P6fZjHpL#IUMMjlNgJ@lCHn#Xi~97Y>6rAwOBb1#L0?d|8~ zHghokhfAk|*N(Hxu7uA=d*H#~kVYk2C-Jtn{Yg5p!ko@1w|m_Yz)%aCop+hOe@`<4 z34RV?i)ekl%4IP5jgB7;4Dr@_s{Lj5h|Ju~23CT+H7a8l&qtv}U zE)7(8?yfZ*;eUO+1S34m&g%mNG&hiWZY}Ta7k9Rw^^554VS)7~UGG^LsDxn?-zz_f zR3`s#5DI-lvP$rco0=^6yrdbaaD`Q-O6L(_a%##;bYUXOzYJ>P^Kx&p!;t%~Z+6dnD++%Fi}0QX%4ITeZWB zO-m3~z5(deSa9%9=)W9E9qj~ZB84n&ztzR3}uJnTa(mS#ZMR6a`CQxr`X)j zs%a9%(iFQqytA)@Xu)Yv>9$zT{tR#TSigt<}`wj`tdZR`(Ap7 z?zaK0ha?U{`_q!=G3*?h0j* zW&r-vrzl3VXGj~rYKiyB!uNy4QhyQ`E>`$Kd73y1!_k!t$2C{*EgG1%EQ7`T7EmSW z`^~H{rziLj#~U*~cdN>yrX548%pA!l8Uid_sxRj#PdQ5s>LS=y2WS#SHo+wgVZ-1r zB~|CGfZhawaFdE=W?A>l7}F@mQElX|f}KD)=zw$=H&d!er9Lo1iYk2g=!@+LFZND> z<(f^RZjbaLXUtgR5x>(`U|EQX-9tb7%+F^J{$#D^ON=1!NoWq1g-6NPCyvkpa2_vs zT3m!el>nS>FZnLNvQ&%*x{cLKvOnR>)6$<6qJu<){v@C--&TJPrNcEJ;v zn@u2oE5!LW-h?k%s94h&gmLq{Z{_tuEnUMlW!k?W)~?W&kha zxa%MtGT^w?cIT38P4+NEXpnvIfRk+l4G*Q^OydjB@Jyw@>WCNpp()yby&S$0vjQ1uY+#DewJ>Q*d;# zo-?t)Tf?NPRtfix$!;v#nC(mo*V&s#M%m=Zij5H+%rhbp>=vg*jL&CfR>8QDy3460 zp$(LlnAM{nbIg-Dr{^CLT*&T=7o+B6<+x?WniDStTu&D!eR zeKmtVy?bguxMI%N)t~5c`S&$*mUOzRrGivWdZU*2Td9;*@t;)8FRhD<_ zfIqOtK6YxjmU1A_BiBOXnF5j-@G#D^VsTtx7Ir8D6(kJ zq9!)QscQ^u2@vnOAZ5%@d=faenIL^mBz^!AxWx}L)4Uxm;mENQNgj1QAC z;uc&iYZdD0yvtd<{5(5k_kkDiyn1iNx$j!Itz;-hk!*;kc87HcpmJh#VPVuHwV2kG zR*+L|J2{pKLeZ+r4uo=(#%H5;&R2lqP-v!yWp;Efp--!92j^+qy?NbHxxR1AT;Og- zB`tOe6;Q-dg|3bKfF1yvM0W4>&I`6y(ySA0O|? z)FrVy@J(y1wvUn4B?m`sZ7-^N+n*b__E)`N#0ejogzF4z>Q0SQR%~mWl?xnSC9-?z zS9Y>~o}Fw1UbCPJLr%=JgR`aGDQP-jx7U1I0Rct9-RV{Tu6%K-w7x6;`v#PvX4w8SjhSvgoP3 z?OHdzZ7WTTe$v)e*P#7;S${UME#QCF)$cfDv2$~mI$=@@fyOqNGH*5)A6bH{W^lK! zvEXM;XIFrAUP)v1J5})>rWb-kTRIzKnnkKL^Q%LcrFS%&$2`&LvXEahhlr7#Xdiy` z>xjdey%Y5Yj0yGRmzMr%YTH4S1nwA#m-w=RI-tg(U+b^WZ6Osdvo)gvMPA>+%^is& zka0ucVSm0OuMjiN2Q<uNkyFQSBkH7(ruKv6K_V)f|q3^ z%U|8pv*RVKFV>%m4qV%C9))d9381H^NqjHdgj%rd<2q2aXk*VlA)qGYN5UD=Frht^ z{_{>2jU-)GXR}irvNeiIG~RC8c9=_ft7w3&T2{F3Tz@Srbo)G=(|Ih$mQ(r54w)9D zjl;rYFrKKYp}mijIIo-@M@3t+bEoif0Kbg$SxcXvGHD$&%>n}Y`>B=%nb6E5&MlXqX9P2cB1b5U=j@i!@Zrcg#K@JHv7i%`90`KQ=<`7R$ zG7>7t4vzJA^Po-omyQf^O~P|GX?Fj{3)qKenDBFmTMAV5+Lz7_%|hyo1o}eA$c?RJ zY(81y{J3yoodY}NSf6~ z%Qr#1qNK%rom07|Q_E?Ef%W*PASpgvL~2i`CGZQ=QBuR*`}j786626ppEfVp&nxrk z$eAd6(BuyszZPFz2?^3n$fxDT0TRyR$=-EPniGmsr$cH?6JGJk9ZdW8N>Wb0nrf+x$ohnXhCJdch09ZA9c9EWd6_(`MK9h+;*Z3l?Rq* zKHM9J2IEv+Vs6l?HCmrEDZQjgDutUshjw<|g^|-tu?^=)z3AecfXCcc3Ds?VBjl(Y za~gxcBJ%)AllM}?JPlSl*8N?13UOe6r|@b1n@Z%V4Ri%bsyE;AB*8Kv6oj1%4ZXLu zakYz3h%w+xKcD!MRG@H21!Xn<@4R5sfUq@bgf5cNKqcK=M1m>O(9A@w8T#*vTxjFjcY2?fNDh8ovI34M zh1V}&}oCSC84&EU9&)XX)dD;yq}ds3&=?i%lxBf5gIB6 zO1x3@tizBE^jI&zKH)7n4l<(0f7gS9pL>*lXD4$*@&+q<_UJv@eW6?JOtb7wrt*fx zS^xb+A1%uS;No8f(~jWz56I~hw7tZlf|*hkP%u4*CDaGSj?E@J%I$O{9_7OfJ|wjjf+7Tf;)MVU?jo;s^}qS!zmcgv5jiQ0(;luXh131m)mSIxGYl?tIp ze2F|C5el3o&Xe7O^fXlEqA9Pb7>crb`9Z_b)H9kySzK_X8n$-#zhna(d@zy~W;!is zi*zWKczcU@EkQM0AX>AsC=>-?qGDpo@5ev>iUn~uQjD%FFZEq&qzT>ttAw?On_P_> z?WxYO!eU^_t%(iad>2Rk3Eo`i88IZFv6NM4fS{4JkCzA4?C?GA=~HSC;COc*)+|bx z(sOMZ&kbtly+F1DB8J+m%5W49-u%s=i^(?D4fb)Dce9(8V?wyrF$o)iUsRNo-ivxS z+?T~?Md9cU3ts1K7*Cp&MI23Wz+RU(%`2yKjv0O!sgJ74^Nh1f%dQ+V{Gp|n+byG_ z+US)fZS^YO!(sI^cXoJ`&Z*NOcZTrqs<{&OQiU#j^VGMDvc+Ejk@7xKZp&OnKpCx@ z*fe`|A#s8TE@qRcf3MtF&sz^LpMR&LHxqfk#(wni7T8pWO*s`qOw3FqzB^+kTsA8h zbsNn2r6qUK(<$1dA=kd=jeCVB9})DY|3{Yy`2Q%%z-Qn2eNvOtxcVn=ZOwe@YwVus>WQ?GR1Mdp)fKoJv8dYGjQX`-A6>@WeRzzc#8`*v zJZh&$HepqoaYjzW)_#iNJ^yac^u&CHl(CUywrvg4C7*Ha-;T3MSxx)_j!1IZsvp&imqma$U}w)GY9;*}M)gxh8x@ z?!Yc$H_gjruQ}XyIAmQ_WmZWnc5xslI3;atoK;?FP+WYA&m=AMyZyg>$33x!Xtq9A zK4A!67AMJz>M{mZrq#S0%!y^B&%qJgStHGlh_ib9*~9U?c$3tHw92sIpM(edyt~wLz}s2ND=W~A-%{>vLMlwLgmiiYiaj=#fbWx7c?&K ztSn{T5mh&S{XAZlG2?b(&deu|5fwBiwsYn}`}6w^hcb5!r^}OA0Y&jUmyK7|B-3I! z(urHsM>gB>ub74!=#0Lt`6a0}kNy;I8^3`*vEU(46D2j&SPSI4B`n?Kbu>5cp!A|% z`f%rmLZka5#v=TD2g{J^P;Qb*=ODYwls?C~2zR(%Scl^yLkVlYlY9d8SalRi!Ezu@ zm3diGnAh3>^WB^XuXaut{A`sGMQG95E#7`^kY@N;uDaSVB4f3kCK>%gj>$eEU&tFr zHP~C-jir~y*7W>Mp2V`R1mwG1IUV4xi_$4@xPwX3?VX|-Zo~Wx^r2$8adnszSm?1N z=65rWSC>CuhxZn3jGk8dZ+R0YNXZMZh_ob~;>q&zh3lC1niYl+Jm796J_$9JOJb=8 zY%`(jawbw|mo(0QEF!b)J$a2$1qJzLnAoW zW!r^5^KGS@TI?PayDJkbAS_nR>lZ8N7C~TGTVN)sjdgS+I&i+5$v+dcwyb$HS{T~+ zxve4ly+hN-@A5(}*ub3#iltD_!05O3CcoHI?Dtsa+)gZ-SlSoLUk_ChR7D*0mg)T{Tal^A4k67xx#6>O3@!_X#SLd zXbB#T)E`^Gom86eTO3|r)}dKA=6By5tKE8SlHGPlhWKwHBYbH(aU%B6 z%I*|FtF^MB%T4lqTapdMugY2nE*W}8d%)=vt?zaeb>UUY$Hb2>CP$d{w3zCW;}Q7c zLZjIRQOgNRyZ5M6qFb!bw^H`>(`rf=e{sGA$D5j>?oKPL^njT#_$TIi5bj zXU&b7t+NpJB(Q??ErpK=fHMkQeaqhU<9^3?a4LI>qX&sa$KNhwFyJVoOCR0lv4}FJ zyZoYZGs@!^YvzB$)`}?vSZ%7@u3!6H?oQzUwf`HnHfR2(Q8+Q&;*BmYzpF7b>i1}s zkB7IbJA8M^!mNE0bF2jMzfXCc~JUZ_$ zB}}LYtvBD9vb4a~bf&w~NGm!&Ikes3!*A)8jW4kVuMQv5%9TR$f#t}J?As|XSEzty}Y)LpHfE1ts}uBk`~LLZn- zf8p-Vrl(y3HpWeK);*fi$5gfCuVs_nUaqt925^OcsPk#wvP)q5m@ZpeKC(c;ZkdXP z%I?7K*ym}j&(Kx45V-?^7@&Og@&Inlsb^i8uN7Xk)$qEgI;QYe2^4H;p;jJWPRnA^x6V7lfaJF8r%ir!pY zGIiHfOuxf0!4)zww^G8ZPJ3<#E-{`}!8MP@V4S4DJs`+aJbE+0{#_>NSS;*aY8Bq* zG^j)>bg}w*4C7gEX~|Svog=rPy0)if)7fr9!YsdSjK#{&M*3w4;ZjAhC-CF^8%9md zk=ni*oQ6a4M#hrEO6iw3pS&V1!$KGMQL3|7zg*_TLDHCYO!aZd;M#f zKg_AWjC=0#+8@6fqKWK&ZOECn@T6q#lZcz|c(wc|bNvrH;8DM>5~@bunkf8T45U_( z>SodrTH1OX+bS@8p}tou!J#=JABU8k^`n=kKFVeOz!AiEUdI)41m6-7(c;jyJm#vh z7PgAS36|7DB(^PY_^;N`(t};i5DAN=l`yeQoWYH2WbfUOE{O<*)OVwV7A&=qhwJTc z!o@8;{QS%@oG$r?6E}6T)GF4^o{^03*Z;f{GT886!vl`^?bG_=i?kSq$7@oDOPrlt zt43Fivi5O>05y~LJn|uZWr+p+Mg9XIrmHWGtWAcU?8=y)MQ^^Dw2X6>f6Nv)e#h@&QBILk<&J9<0{R-#R%F_Wf*3Smy&r_q>=!s}by^YHjEa427a~SuM(`30}pbqv8}< z6okYRIWE(SjDuEW+DtbA!E<;yP^elb);5 zm4F{k>665hVJt08)%G$`w1O{LB^lxK*M?$VS*U&J5X=_?d~Y@NgoE9Hj#Mq|B9pJx z9T%EV=gBH4tYBJuNL%bRN_d3(NqD?lLdO$}fc7?-FUM|QQ`}BDL+LH@LJ6MaA3K{^ zP-^S^^z6M@7`!$?k9=F2<7dmTyiP^=Ys$m?XH@<7PuuJS;N?IOe)_p?>yaTQLleA? zI;Wv1&)y@QyuPwUrs#l_u7g10E;Ml)4XsT&Y0mv8<-kzEJ5`BP&#Kq3-g}TWZN;JR zBP1%?>)j}v@ZAdQ4uQ>2@5+*d*RRlitTvP8^rpFTOc@UV* z?Nk4(d{o0R!hvzJ@+4LCwm1o2L+_KRThY0^uJpcW+-TTW+_iu#2zX7FfG_tIK6^CSmHvk0PQr5*W&WO<70-f*HV>H0=bMdo(#J=As$lE0ou z-fJ#0^?zM;creTmHH6J#Vc0PJTS@;G5o9L|ZACpTN;BkUvykR8;Qs3HPf_-}iD&m3 zCRmZ%#kqhL>;Do#OBx7|(uwBS?VkP<6Jf%G)|+R%wzybLwK6|E zD;1Uy++Mq$ul#?fghL3U@PV5x*G265?*%Y8q+|&=_$q7jHPWI%XOgpmXe{BPMov9HVd$?)J<-rgZD#~-o`QcCzhQ3}dx@);Pp6IRL#h^lAM z&)p0T249_ncJ#5W#mPTlKY$w?jO97LC#6`9tze?B7;Cijjvrh$dB;kq{{!IBJ}}~C zbOvr5`2mFC5Wp}c7f(u+BJKmY3Uy+`q%=pm0Vw~znF#xkeJ`bP8Wq!h2v#E3sz7G{YK*d7il-ui1D75?^5y^$x9)xG*^+$N67z~s^d z(3`E9024^fnQ-(&mi%8oYveREj>9ef@?d#Km?J4wpg=b`7Zvu2T(_*#+%{93)-9_i zHGy9kePepjM6)5QkvO`4<&DF7Rg;X%v;VB8dq>3kNW!Wxs=c^C!f-m^WnV;%SChU` z|JmLP=;dNzkvZt*e21ll&oyi^ji=+?$&?on;ln5BBUJxb;;<2T>*;PYN!PUPdUrwv z<*ntVi$f2!HoQ!T`mL-vMIByAcVJOlr$&7sV1V;=g2`~$ao$o`rvIg@0jpdf59yT_mNy=GB2 zKJ(qf+jD`rTWc!aX_N=E>gItVwX#%tg!I4X4YM)~lr_-|R(~jifeH0$2CTlV8&{C@y8a>hQW7N< zg?B2P_a%BbuV;1~zAuo6uVl5%{};@%%wVqbo;|c!!Rv@&{H>%#PvJV(`HU;3qd{J9 z@03MJr4|C2Z+@->5Yr3q`|Dn=qt5RgSQqtQ&*y$ zute`pO;`4wK_9wWuXDT?++t+5ob~+=Cz~wxz{!?2UF8XmEY>Z&z~AYF@MiprQXhxc zYQ}$}6h7}+#5az}m|=V~S9#1mJ|IsdG#&8|kC!DUWS|*njxA|FAmm>LxJ{f);gi&j zXB<23=s3CYI5;f}lxu&y^~b{TSwMP|3;YYGs)xzliCaGq%nBq*0CCRb76X+k#Wb}I zKfh!Cah-xU>60R~Nm$37(JRpBA5Ysbm5*0Cj;8&dK0pwRU4P??BOcby&P_OlZJ2Chih+h8nhh9tcV-4&K!Cb`m2I3NK9#XrJ_4 zr77&pm7KK9-_bI(FqN+ULdtl7)ygGHCi4veo-(4F8`+LD;;HYCc)RNlU6@-f#W%25 zYms%INznS<)g60}HalNsP6pZ&;b1-)6M|c1Lyu7Guofjvb=P& z$Lch+>qZ&(s`p*1B9h5qiX{xXyxO**R)q83+2|8u(5dyl@4a(q1s4iTQT>R>GQ)60L)}a> zzf_TfHawU%e^xarR#rGmNu2bg@e#kRk~%h>uTQ*?4!o1r$GXIxEI>Y>u3C%0gFjo> z3`5<(BQY0zRtPKo%l+{IqEg4mp;cayj2T4xCbQ)PkMp=r5*1_$)iwc(I9V-+tG3|U>{ zZawy-)NRIK^P%*}RAF`UaM4irvp2I@o#h=jE`7y%((U4xJ(0;vcW#_yt*QqQEuG;6Y5U^+Z$!yMtN?%2#If8UxxG}-Pn74oybdUk@ z#Xa%(S&7JyXu*X!Fv|oM!J*$teyQSgo~qQ0+n<$S8^XG_C>x8Y`fjs28^WPNNG8vz>k6wY8d0f_BO3(<@^qb`Ss!Ui+~eYin!C124!HdH z0fv;Z=Yo=~#|K$D0`aF+A2CXR)_A~!W)HJLNM6DI{8N1|JXK))mUqj_kCAmpK53Wd zLpY0dZJP>9i96QEc7%p?#n}O6J2zDYYw#9Qk79eczeS`V#XdbxL85n?K!{iLOHi!G zRbYrs(~)$f#CEPu&E2`oIXMY5Hgc~it@k$}X2_$`Wd%21w;J{GQ>A9&s>P0FKfVhr z^wJTJ^=LFcuTmees+UNs#!n0ser8AQ`x#*?h?A$=F~^^$9`zJYH-Wx%Wz*id~2ig z1M<;3&-LN5WM0T;jrNc`c`j?847R&(*O&9^`(kAc`CdaC{UOq$!85%tZbx~z|j^Qybs>4^sryl=`9Nf<}dM%4jR!#@UpLi6XL zrRWO&2e+f-i`Syuc_$nfx39R{JxGGx=mVYh324|Fa1~;_a8>Vaf)2=lO+e4)vthMG z;PeNcT_)23Hkt!x8?6n(_tO`XI5-1dpT4E7Dt3n z1hgH^&J1BXJ70IG>~a~HlVl-#hVPxQr$6BD=A9Te7YckA)`i;ZRN29yyvE0(Dr(8% zO(a#yUFZLsaMWVvB5csT(2Xgr9+Q1|@McdWTH0)kky~i3>@2LgJ^Pqy=;;AZtB4PDtt{D&ATaAqRpHU4e-ml`lnbb-60GAVU`-)52-FFVoJ z8-u&a+Zw;VT!rP&?`afRRhv=d6O_6yIrDEMP|@u{hh0SDw@Ehm{e4+=!N8yXMPE1M zhO&MNA`juK9W49%bnJHBYiJp3-?ju;csmT6a;Hh_{f+ zgUpuB>38)x*ZDQxh2CT;%j)`1DUE#o$WzncJJ-kgQk|aY1bMAZ_(o-HbhG5Zk5cQf z7fv=oAc0bzSlV51?HKWwA2E+h`WLAGaelwLzTvr|7G%M5+uC`Ixx5D$A(%3^d(2|h zF)kfmSUjUmJo>jrrou1d1oytI_J0Umb*RmD4V(e<(H&!9v5C~eYb${ zr{LX9Cwne`n)BGPUF_fjHq+08BrSfuoI@FycXLM{H2t)+FxA;Ty4EBZs|mTp+AhBy z0%Wt9_1;_CPAYu7WvboadxK|#Qc?QIVN z{x_ZORih_ITbZ6V-pl0IKE11r>*qJ{-V=3w$@5p?M`g^x8XRd|#_c1buE)jp6yEC% zx9w;um)*PRsMzM*4evR>+H_~63heL=`HnrUXFP!~i6vR-w8~5ISf?cT7S}M}BWRJ@ z{H+&rD7Ql}d0@&{@R_x}BHmCA3H05t#K}a&3@qR~(?@*D<2$5nzC+XOph#T9~|FUA6wQz;Z)TUNkiP5HHauX z4*413MZa&kOzTnQNP(brz+NlFI8jE9O{sh*$yo=mTK9H+&hE7TXw>Rpcgd346#aCx zd{Rye>j)qJj{DWpS_uv89&$s{WQ;w%@t{AFcm`uc`0_p_t89Mya`j5IF-}C_JZI4C zyi>mn_|IMd2$z)XN-af}aKLf7{naLwi)U%8o{Q8c{C!B(;&&0k$_vJgI=1vB3#Tsz z0Mu@hG3U*8(aq5Dyt?z(DVx}CS~I|pxeSBu!8PHR+`w)kVlHj*{DV~jHbVeTY)y>f zx~n7DU~`l0v_CrLc;q=xIBZAXux>j_-_~z(tu2N{U8AcWf%ro`qk&$tT3qopM~WQ^ zsMSqcV$wA+5m!$cIkygSkS9xGUcP!Y`yAd#_W}AgGbTqKqWL*{Jx7>(pnP2lm2J_b6d+W3u zSX)IC0TX+t8~jMJFy)uC8Qf24l|QDqJmD0GjPv&Ni6dT`m}rp7x0EI0ACwje(%D_l zF|4Yxdh1*{KfLx%OIz=q_FdXX4A1FKke2&3ML9=nrSA^)9j{d=qtur^Or_P&p7>B8 z;*j2?J-1_oSzCmb-U{>w35{E*>l{r%_{?Gd!0>_VXdBuTII80IyE~8K*6VnC!s&jX z14FD_T6Q1s)}D%J@mv6SR?ocEor6kDD9$OkhlW(I@4nDYz_=7zQI8ib$Y*%eONM_p z`?`>hB%>5D^rQ>&VsGM`asIt|RlGfiG zIUN$dF6q&_*VljD4`)&{zBuj&{j@ywTx}9TN6S+nO7ovs2Oa+sloPPdcpJ_zakKZ) z8%>&c^Evfq$Fn^nxt-5rM}FCL@rUmuqWmjJhBE5bbJ!%m_8e}G1Gc!DTGmyB%ja@P&gS4xFl%^?(Qy) z%hx&QmvhuDBjM8_w4GIb5}L4D*V|@+Tvd?n>BhGl$S_=(EMM6eVu%y2AnBaIP`t! z?{?o($5b1f|t)71F5s*pqt%BW?+FuA@d) zB_kZX3?!lW-Ea1jxXt!3PHyhMU$TRbZ|&dosj8>%YcAS32;cMVyoGG^rE1eha=qk~ zM!fct@6bMtQSKAiuG%biV@jP|-oyp4_n|cD-%MQSf1U_qdZv*0Oxtr1F2?vP_ug|u zmYl7x)Y?vOU$cCy|2CJmC6~ufU35p)`QUOv_?kafrkLjzl@R9&tQz>fW+T@&*u#5J z1iTGBB7=j@5)!bphA%P1OI(2PqXi2FpbaZuSudhh&^#D-E46S*bGR$DHhG%!?eHj?qHmjA^Z3kc5 zr-PzX_57s-E~%@{!xKl&6=1D9-t(Z>P?8Z!yw%CH)CJM4-;!aTz5t5rc*1@Nr9e@J zN*fnd53DjK07xhHa#73biRg;0-S=sCkKi}CKFPr-dMne!XJP`y&fggk!2vxtzc^k^ zOT+nK)_*dSPx)ccywUDg^Byh4(Hx2cOoFiGwI{y|LSxU z+$p%d=SGAWJ-u=X=d{NYA8-2Na!FNMF0}=k=+~c&=~T*aK4ClQJTlp54Xh!%Qoiz7 z>dVCAVB}l9kh7um4J^hR0&oppXNteEI z)lB6)@5VG;xxRmsyaTZ|MZAO+&8AFWKO$5-Yy0N8xm~b(r$5|hHbCa~Z4YYSKXkF@ z@c}|~n1Lz&?nU6ZY8><{Q>Ip4M}?%n*F82}M;I}x-D8pTr}Kome$mP~=v!XFx$~G; zu7Xg+@^EMS#$000OO7`yt4zci;`axi?lZiJLO7sO%YBz4L9MWF2GQP2w^?1)tIVcv`!X?sg|sf()I#n4%Gp!oDhU4j_S&${rq={m=W)rth2IXy zk}me@7C-ZTz|vL0eheQ{cmr7|yslkd_PI)D`|fC&M=!IZz!QRDU310wslO|fleLXt~Pv`D-AxO;6t=)!BQX z-$C@IS>3oQthEJo@SLzA3y_}QhdPHRC=o@|T!NA)t*+-$T8koc4*(!nY zey(}cM0Xu)XzS4xVwZPEx*?tyDMmEaVaT)XG$}RpgL)2lq}zY6Yn< zP60Sd#B0(0*um&|ion#kgw91Av)Qk|x*mrz!RDIH*d1qf-rDXc2`dU|iS#<*=0r^B zVHCUz7)c_p^poq^H1#LGJTsBXVeKJK;4?Md@s{mnD)Se32T22;_dC0#VAB=I^pk=U zh%@tI!NB0e@XIf&R6p#l{AFH`)7It6bH_UecYL%^Hq7*MvL8VoKk9Y}76HK}OW48v zKo4_tdZ*y}N6^=Er%R?p~_kHabfWo{aJC(Fk8r3omeytwO9>h)4rj#5&(2EepLDm;tZRe9qJGQk*9A==$^fT z_qp6>`Jzpy^@2HVyUn%yH6;kxem>1@x+tw!&mz7GYC@nB?eb&6oSoLb*}DQZ_W-EI zNZD!NN#&hm<4dzq8R#4cS01KI@9jkQn%)@5aaoyHLA;q`fd7&wuKp0o({p9LsMq&x zFoAKb%^sP-t2%bpD~Dokqg>F8{}WC1mTMK&UBO|7NJ{0Mr1@RkLzU6*93Kt^+$&Wv zh#+OldTU6+2Q(nIQ*YVp8`HH98SSPVa67*fc_1WRuK~n18$Sy5x%9USJG_^oJadvG zWLU}%TIp*xm`C~B6Nw>+0CjzSwGmuHKGsrUu%6``0ubzOb52~eob<1Sq%cEjt!@wZ zh9jr397OM&4i&Cf%pdNVYQ0_rk&uYiCn=8BvDFn0-1s8+)Wl&&y1Xb}1)@MyDhkf? zbm*!K0bSE>$G5)(0YO7qv^x0ZQTkWdi^!9$_3cUa!Jo=sO3xJLa-A)HZknphb>-xo z?9J(wXV$*G4AKA&>tEb=gzwsnlH$roMR|-)Q2A}YfBA;i6IydAa_&AoL-zD#x-GrL z*D089+j247mEvADY3-o5py=`KmAo`|~Z4@+!VdS=NJ%=xStD1MymSydRz7 zIC=B^GUamz@|F0lKg08~`OuFisIx^M-lp(c%?DxQNwSKawOls4UDuJ?s-lNm6M*C4 z{>FKf*J5+>uHHsOu(-SIF>92?WT7a=iO!^}@l(QHMc*X23H3?eyhYbVj-0 zX$<9o(I8sI-Wv9kl|7x$&mMjUFlRYy&2&X4E&Ys6Rq*-BZSP*ZjeFbE7Wwr@{x7H$ z9p9jr^Hn5YoJ^6L08_T%K5O!Ez06^LYQPXy&6GO1cXw^hsQn^ManJ7KnxA(cM}MNv zo{EO*$eREhXg0>U_GdN3mtkqlyWvHmn6=X5smh5(#&djUq;hNhYQ3+8UBLLGN!UA8 z!o<7hAuXRh0fjF$TUKV{MAaT`z^^ZwQ+K+ZT7&quI`1Wdpn_IWy1*$y{m2;m;z3$h zv|kPD%&#-o@T)Jp3Kzt0R`y_fv=^3gRN+9L0M9n7LP!0=3w#7f&`M&v6x+&6HBpSY zkn5+4ZnKT;#e5L13Y+dQRZAs#tFHM#tyRn#ew8zrE}kEZ;^#ujx~t~rSM%YWgJe7u zS6^&O#PQ*^8-G{*)Q7nEpsk9>|LEm$cf$(gt*pL%^-{~E@ouAc0~-DG(cGH*1+%To z%J#K@VU?3Hey@?Wx{YBIE`O*uFmIP|lO;69*gCFf ztrMhfty{IrJ%_Wa?@F*GI25MncLcxXQDPai!V(%R4lqu!J@|1tg*@6;9k;Q5fvvR` zi|&MUPC-IGokg;tsp#)ZNZeosrLQ<$h8_=wf+`;WaD~ua7pQQWvcV^nRByE}qJc z?+4yM-?my2ds)4hYpmtj_bgp(QEf& z;i&oXxNYIZyGxeui^T1l1m;ibFMcVM(8-^F7Gn zX9v(150{lt+F*vtCq9&KlgOC~&|yk+!Vb5G8FVtIyGdve@tJ+uUtPJTBEAICTTOY@0?nUq7FU42H;uE% z^p!`swS2M0V*Nx=lZZn+)C{77O7}NLqwie|Gp-P6x)ol8u&BmT?XPH@$f`Bcus|Xu zOGTTygNd@w0c^^;4>!pV5}{m7$Wb$!N$^WcJNBR&gsXTamo9IPLwiTGXN$o}wT&C6 zwjN;&%}FMsQV?AZPuMQIbTd`9(&MC4t_{*ACFwDe;5BnzGqd$0Buzb;VuAQYcYAY_ z20xPMRi8I=Xzi6R%|rpp7#HJp9Nfx166cVu%juKxHzDKYS{c}A23=h=4E zb>Re$%QCWgRcMktwUL~9hsd}ht#MwNXt$m>XIK3Vvq-l`$9qffknRWsDtUuW!3=ei zaA%uPbtkB!*&%bleg9qz$ctTv@4lmk`kD)gfpe58u2N{UB>U3}cl_`Tse;HQU_0AZg3oO+y0EL=Lm(M1!5_Nl)nrH>GWOmdei;SQ=;d*%Np+&6+NOxX_?CGv zWs*{;YO8rwJMQfJL#$Hx%h}j+h;%8_eXK_qd^Bc&ik7t7n)##m%vy&R3d|7XTD@=B zaCr{w8Ee1<^k!R$&|Gi53<)3Pb_Xy3UIrObNDxbUCgoSj%CF~~o3#=K_jP^pwidXHs(1*Q)0P4V#_M7aw;|+|d1qJ&D>Rr2NPTO%^jKVYx*{&p8H7 z2?5b&F;)$GPFm-X5Ym_3(Ne z#&a$t@zAX=0v3>yHRThbQ=BCBMgL`Y`3 ziNK*aTmDc`sT#eXiAV1t%v2zTo0AeMs@mI)ucS|FWV~3p7}dKhT5_HVd^BiFs$~$wTC^4)Hx> zG^v`6@o5w~y?21p;daUX;*tLqw};0W_U807f`MLo`0rZLa|FIK5~waLQ2+Rzbxvpm z@mEh0-V)p$vnIQK78~oc{L>4v_u-=413fzn?K^Kt<(z+U$@8g48|&fW>VfJfNv&-Al{ z(LZYpZnYOXn6GR7ExRrdkJ?CNR>Do!TVu?MEci#crd<((>ju6*RYD{^Y8_jj0L^ zTA0s}Phw{Jbg_`8XR^%~R~pOoRD+K&6E`D_evT6X1r%2&aBdojf4?eS?$_FEQ#6z`9U=cYu7>!{?ex=7C z5lXv6G#W6xAG?C@H0B8b&U%NJLo)rge4EY_UG_Q04d03Q5iHJd< zYcwKO-gBD~F{)O00YqBnI%Bvs22HCB=cSGEo~R+OvtDBo8(l`C?IiG71Fmxj1LF*h zk#J|f8N1))SbQs=rxiB34r8Xk^b?IzST;3~`P-u@omH&M8!eIgNnksMoC-LsTUiSR(j^cg9Rh~dN4KYgoK13 z6VpoW9#A`t=euz<&2z=dRU%8BSrhKMdI^LuyICEEu{{PIi9Qx>3RW^nEm(evb2ICV zfD-S{Gwy-+nOKebBq4ly@XqAMhGeh7rnMP(iKNlxptnyU3J5^>G96R=B<A4)CVu36KFUnEaD#m zYCpA#DBp%fe%gPzhHgjp4X}?rxYQyZSW6J{+qqVMk*HNDM@m0%o;;_D==u^6*84@; z{nZD~sl_A-6P$1Snaz0P+xzt?#Aa+OV!cg5GUdi=n1 z7*XH+^~eX&J6_wK0@*Ci$yKVR2*4(n5~|0mc=|iAJATyNwD|XXZxD!zlMh*a7J?nS z_SQA6kIZnc*q}(>mS02gdkaa3)|qpBvj$S8Y#%ZWC0ZipLxZ%M*(FqOKsQB>@6wWfe0$e4y6hfw3c{mC@AJz@4QocE5gh9XFg|H3wC8=a@Um+TTgPy*K#+_D37F<{d zM1IY9f4a5nTzXDq>olSt^DC^o53ZJ?;QAca+v}0iti*g>yaweW_Fk%$)+iFY1+t!c zKnOQ>Sm~K-r#3I<)OedD`pnB>Jg+*MLow~#F}6ei@&DysV%vRa>YUxkV=GfkbcI(* z7{!`Jvpnq^06m%xRfCTc?F?zD?3PS;ZdJpc+7Pq+^_Vxi$kW6xeiMF~(_0}$=N0+q z7TBIZj`gt1i#La#rxO^sAwuAm1iv1p_s#fG;YN#z5-E}eUosS&`Ch{O9Jj;0GVs}f zS?D5T)-Qq%TWS?nEy+OlftR!%5%)YtmUuD@`5uJt0Gfw)Z&dGhs7C5}TK%+rGa2Ji zB!YN$kT1Bb_9VJ8;AUVtkcD$jC z^ed`(ccFY`$@*@t=4@gzV!DLQ|Csp5da9nyC+$ zG71&Vj3jr5WnkVHj3q`4J}aS1gC0KhUf;O`J|4=Ry*-2tKC`eL^WwT4jrfb8sC_P8 zffQSjM?ojT{D{yLpjm<+$GNy7)Qly66DBwt`$-7#Fb)fL8vk_tdns>na-dWOs%3p@ zzsG!uMt=|@L0fRi{fxWwl9$Ef6KyKMX7K7J+dU#RcYMB9-T18Faaq>jK+Hr9$DnLP zK<^fr|H)ji6v3#Wz$l~mf8ez zNe5J^5uhb{?1B;cBN?L;D)#^@%myDhIId*cX}J-rc`a3`3FL^=;ZZv5Q_5?qxk01I^HGcRqr z)7@FM3WtZ-)fF2#+7(PJ(hZ%r?K=%7Ysp!539EGM5x!*?-M+yVwTDIfwRqFM6SM?q z9`GLTQOqUUT0Tn^`&bHk>`AIc-afB1NEI24dnf_BKb&-?ZGFN5;UH_#*heIn)T>@4 z#zmNbj+32`fl5cYU5387E{w?10_UeIHJ#ss91tns(HkzsQ3Lq zclgwp<$b}7{E%Bjvi%s57BblF!abi|LxKEkYYJZ|3y(MMEIPw{LwC8^^i5KQuZES+ zG-i1{oh;UjH=Ql~p0~oL(qZBth@b$l?(al!p(Y_>p2UagHLG?%@@trtJ9yQrq!a7X zfLsT(s8h}gSV#|>FfpYEMT=T1Bj+Xfek>hPlve7}%B$mIHjiXn$KwYWHnH2Q7bI)c z8;CglT;QYnd3ixYrqZVKYN8@U)p%Sb0OvOwzAS&*6Q3U+u`CJwwr=Oa>Rvg*g|I*dw-|A_z7EL+%LmuYHL2YwN|} z9Zee}{Q=9JChzOF`p2-gFAsjw5%Oa@LVM_zWN~G4`lVdR*?tz?`7E+x3*;bmW1>6U z9C?H85qj}dH~OR4Qon?q^sj5Chpz0`1dp}2a>iJ{jd6|>Zv9RK2*~zxvFWg)*jvym ze+|_>ZO5DONSw=v@P)~B9KW5iH2jKIp&^T679uE8bqyL$*h{JGae zV@D8hFOnsJ?r~j1;Cl~wWqsj^+st)Q9+zv=K==H1Mc;=Q>UL|CU(JI&_f^1Sn8p6C zz4Xd$LE$A3-5yM5Xr1n?w;eOx|G=>#T_+^J<9k5%EGk>2i3| zw^9CHn|fU+&pD^su9j~{pa-O8Ops#nd_}o^1-0otLIR&SY>S)PX8!)99iqBM@D#!% zsE^>#%9t$(gTl7{e7`;hL8A93&D7ULl4p#*ka8@%A%i00 zGdXO2k$8iOyx9Wz=d9mg<}b|lF~E_k7vZ`!H!y%Gu72b*7-BJ7@5*o=ftLwv&Xhnud_5(xY86!jZ85{B+q!kJV4v5!huTSRs&-Q#T zT-W>}-O#IF8lZylrja7-FI_tG6nv z!&Cex9D^&Z1`M?8Awk^SXjcwozsCuNRn!)Cpm>p;~j2aJDtG42mAzW)F5EJ5JK@#dT`*r9RTOeH>rj9caxN~5F1zY z%N)M0yYJ|L=%5evI)4E>Ns-@>_B|*{)bxKLt+5aZC3Y;c6{3BUNum!!rtdiFo_XDKHjlgDs$oVAP5`Y2=I z^7c0!K@Y3~#34J>g#0sUz3!-}JzJZ%Sy14|$f;115W_S)gb~kjc%!n3{l43iPy3%! z{izXNO28{(0Jmxh*aerOI;-}NXuK`e7V79CM7m+lCs3nwR>W-9WH*a^{2%xl znj$PIAyV^5LtlT`povY=pAh3pHT6*(n-|y((MA~M%G^2rdrrY2`E}3I!`f8@IjM9X zG$nCBI>!FvT=jyKvKWX}r2h{RMYSZ4ZQqDldKQ7&cYTGrY{u*>lSZ7Yr4?stUXt}ue)R5-kjgD?Kt16NjQO><8mrYN z_9e3e`)A{GcT-JJM#x-XYNHiy96k)4WTc>M{KmBT)ttCftJk7py1qOBV6j%qT$k4c zgldsakhlC1TJsh1i{M!3ij^uVeT74qNoiaP^E&k4}~Fq#%R( zx>=%bcKmTg{8f_SD0w6%z@$-9E+OJF9ue-uMY_mSs@W<#$G22vt!#EmSspY^>$-ZF zdKmXr!cLJt_5?X;17yr-z&sq6T2<(Z=U^=CE-1}ofeKRCWWSh;#1$JJ0xJL1(pT?V`^_r6%>M(k@$qaCYS@dK9X; z7>`8d&kiXnm1EOuI4&+QKZ1Agfz{<@sGzE&CQQucgs2~A$OB0JfUx~h^c!aj(@u+;CGtf7!ISNk26 zL=WRk`1TL(xiXn zgUZ(0)Kh$#5*JmeDK;%C#WWoEQuhWhT9*Cfs*jiVOLK=ri%g9wbQr7Jy6-hbc0Nbp zW8NRFDU97dCM!ivGhPcQ)#xkR1GZljxTCy}6ArIz5m3@{!>SYzceGTUwkp90{LH30 z&K`=Uq>Hd9c`UNIwJkuUY)l8gN}wbv6D3jl<7lmVYtm*V($fPXhA6_BUNiq9*TfJE zZ$kXlm`|R!Np&j8T={ZudQ?U6O|0kr&^H@~WGzNi>BCB{u+*Tw}Y-v|t?3w5#`E;VUHwqo@r29C;tr(J@aoulC@0~pQmO5aea zTsN2O>&{XYS`dJt*p^eGoR>+Gi3hxqQzCVwqefHdSYPWKllG##{O%={!wDmiv%Yqj zq{8V}J)htCi^N!*y5?lqg_YNb6FK#^pkV@H@oq{gbmHf;JCnpr(`+7Nhl=cRL(fG| zW`|6LJ0S$xQPtiv2Z#?$UD0FY$kVn!p$&Xc69g1C;rufUZ&9h*qmFL(ubidGvx{So zZtD45YtbK#+cgQw(ME;t?rUM~>Yx1kUjU6E*DB`zrHq4L<~~5J@^JynJbG?~Kz29S zCA?8zbYQ9V)0p%HSO|j;)8OYszScen{2KWt3px^3lA~y|+_!K~y714+heHxi&XUv$ zP|d_3Ds=@ss|(D;_#q{DR1otx#uflfo#~j&E6kJu{xZt^HKjEQ>DktW)%m zn-mvq8{{y1UQoKApEfM*!;Vug@skLE96riiOcZz5x(tz2sJ;`R;+#+b zU7@rsuk>sVotgLyn!h^|(uf=h3FbHxAjZ2@DThf$X&?h%vNW~7PPw?s1G!h}2Kmbe z&KByDJF{7V%|Sf|D`*d|TX6?`MR}d`RhzPV90&Jyt=NIE{zlN;dqq!osO~Nwbk-@> zbMm<`_hD~S2?n9dVav)qSz*Rb-ygucJ$Ecefxk;m}M{S^;<3=n|yLwCn{ zO{f|`zR3e;WI--@R;_)-uC|RS^XLehmZuua$-5(jo4B(?d7o;Ye?5$7YC7Ahz^Uj^ zQ^4(EceunPd?d=0*dVR=paI!wE|EV=B|hKta8{In8*|>gp7|C_Lt;OWEVn`ra{H(< zg!hrc_+ms3H1PDiIjfMb$8-pRdk#M>!Oown*( z-O-f{me9(~R-d;Kvxrfpt^gYP9uRG%tnpt@T$yNPh9=vo`UIvTl-b~*Qra2_BH+`=du32vdv_-t*B>}2hCCX%nzrx z?JuZID1MTw;8_E2ijk}3b$C8VLa^kY?^zpCS?gVl7tdR)NF+V6D71Fr%)q%7?kV7M z5FaaH^uOL=$o&FmrbuZsBxgTa5sYBZPB2bGGgK?ih}?{~(MXVHS8vTxFy9`(qd95- z%_|~aR)-{|4l1i$_tGB9y?wMm_^iyAF%%kVJO<5^K@fclVgG+bm;!A*4@SR)Pp4aVGyF2|_7ccEI>ej6K}^X_&ocw!&YBamIp(^O8q-*ID68n}_-=1_q)QyxQ08>}}tPjF09JVb6Q;mbvJ{@@Y zURHJNwa7mCY%Anx6Kp+r_I6$L)iDA|5tKH~Klb6o8k07gKU6uuAn7L0P#;`E-FnCxi-odP$|%~h8-VqCcHdOCG?={OVNe+OeLSZlTnmW% zE5Mu+C#h1+O(dCC9><)}0yMaEN${q+f=6&I{v$zGjj>KHRrw zL@v(5qMxUQ91&_u@!-YR`L>d`bTr1ys5DsbAeUAP@-ksSX}l(Xk4fNjBL9U$XtI}e zsmfv+mP^h5A)gXaKwSiD^<`5I6SR*ikCbQ?9+LfOR39Fm%l9NSeT+OwpI816Pn%~l zV~m5ZAsibW1#2&45o|2+C^V%Y*`f$Qi$x(ET(>v)T@|I}*E0<{-kQ0QSj?_*3d7G_ z#CiAhjyD$S>TdX89{gTHv&4N5^2q}kC*DF0BVXZA#_g{gwVl)dBl{?j9Z~k%9~7y- z)ZIzO0ziBx!&LU(sWCDw_>$q5o_$V(S)wNwTLp;W=8JUd9&Q|=f6-o4_FWw2f zilvk69iSy$+e~vFUZF0ebYo(Rs^2{|P@5uL{ebXM{1v90t64zxM#<1O{@oHLMRO&Y z$|u7iq4s@qifrMNAxfEUQi8ti!iUI+Oxf&Si;{@sZpS3Md`xbY1q=P?1aKPjG@)oH zSiw;|5D7zyGpx6kb>h59TTA1zfe|5rP{;ME<)H>X5h=XB(=xrLvp+`m^)~6{A-t*# zi2+^yrGAWVo4B%ltK98rJAB8@d%tZe*KO6D4*(lDB;Z1lblRt^9v2UIPP}qyF&h0K zU8iwCT6WdXld4{@f2G|mUikA-QM|c5D@z3HIbZ5^zpjn=Io-zgDRpQi>2kg@|KeZe z1^gUSHGp?H)mJvN4iNR5u~Bquz1&h&yEg4yB$DiyQnh17K1hbKC1ad!ji#!lCjQ;K zaVMGfwTpOTrfK)>)`>Y9=Qb3b0^yu!>>OM5>TSRh9cayAif0hXkpUYE$@60JbNREy z`orktm`w1slULfb&sW_F1ijsup0Yk_gvr_%jh~ecgZEh+hL&o{@P_s8wPOgtbZ(A= z>%ll;h^B_YAmxo{cEVrLQQDuCHl>~_S^ahX9VgKi@RQ4OoZiaC2%u{xJ-TNrVOa9+ zOonmT=5z`t965ujb3giYY80W;#PJdRkzf*cidNVGcCf8z$Zw(tpM4epC7%Ilz{jf3o?% zd+DjluPbO6Hj_6eo*&wn?Z{~Cr^n1Bo;LE#j} zT;KoxK*ej&-+i)cY57{+0+tfF%ZYa?BkLDyHUzY^=^?tOg7J@`r!1UcGg1 z!y~?$W@j^}#Qae!L{ORkkCq}m7&^Fy&Sh0YNCu%v!z1YT0`M>A05;tiw9$-*u~Ob( zgDb)Rsa=H@xomRQ#j=*d#%n%Y0in^J(h`XQAna%YWMhg3@6PUgDEmtX8H? z01NduyB!+<#uepDect|8k+f$;Ij4#a7g9WdGCPfdH7>J#a{Ei~BE2gV$X# zaIvEBC?@kiHvFqW892x)0r{}T?>_(WT5v~k*ulkdcv3at|I;83ssW5APnPK^`TvZ( z3=Ld7t>7g3KMhU=yrG+z+MstP{+ILp-LhB=xVSJhk?wyT1sNJlBFCFAL?3RQIPkPj zxV9sLFuz_Tuyo-tAXBwVAeR=x3?6Ke!?yg_BnCu?^nOeTHq>N;q}1ThFi--@sRlu&4r8rnv?hXu3sbE8=5Nm<|E+E7XMCSD z-W=(8MgWDgIZV+?mk*}jzRP+N6_X*CEUXIFVICPGMF&xUp#x=2_WfI8GhO%;YYUwh zz=w=Ip?B4Sw{L3B@E1$-L#WLjtvXxR0=Z$Cc=UbYehQO1JAU}bQUR8N20EDgR%w}4 z8Sn`E5OA|V{is;W0A5e3E}q|(Lox6=5EW!<~2nJ!IdY;x8;8k5zI$P!-S^`~x9O)-pw)JJ{EFU2ntIFeG~ z`T7Tl@heR*U!?b7zG^$7#~Sy1E8pvek4E7c^ZpU(A!cQBj!;u~Ngxu2^7j-Ow4>pu zVL$2t2IUg~rGgp4)2>Sy77gt=3*7n9QuG)E3o&v`Dk0M_BO*>{FF zJ^9Zk5Ehjhos4mJ^IR9)lYu_nTe`0{yOv$jU*hbN9xYV6?_R(6iRgWPK8nvSTK?g4 zVMj++xfmdN|Hs98RX*e`a#4xR0nmk`E$IePUxq6bzBb{Hu?9jk5oLB-oG!OUcB~Gb z59LXCbqQ?t2}qx)gB9n-i}eKbvxPXFvC6}X>)x+Cbq>g>opo6F)s-79h(O_=OJBGg zj#+)m?{24%B)qwy7PK1@aGWin8c_CNw|ji=5wCwug% ziUkVY02`8L?fgQ&+PWFrePR9cuBKN&52*$qyU3DMhxGeUpl0_VvOntFs+QDS9aj{? z_e3{4T{8I|U>|uSod00TJfBRefV7nj*&*!#skgFu*X;`HfbK)r2JVfi9J=@4>wOqh zRqjWU#Fc3F4VAX7N66ommKV9PC+gn}k(7{0FZ2Kn=tOK7aIoxIEu3vmYrhi4s$)`s zVUXcU44Daoipq0U0eg|ar>5_hdsT(ig}216#`e2 z@d-sxCNkf4pHnof*$PVA-my0n7z*BlJsMFS#hxEee}(Q*LY>G~Tu%*Q7nmLMGUYnr z?$lC4w%CkSaAVFC+JBO3}pbF=on4P58pAf3mm-O@YbjixZB;%Ka3*YzRSLh z4ge~2NbNm#I+*#t_c|DW&%Ue*r+wvjBKq;_jtK-*EL0$+a}%WDOaY!8JZN2LJ8Ba4 zJ6O@5((Y#D{kD{IQWD)9#ukH3Yf3Q@+1nH&K0i$%>=_!rAaEb8H*;hyqIdEB{Pxd! zW59!Y{@T9Uvbw0yUOC;;7u>S|y$zOW5#KNzlZHfLj6Vq-`ws4E!x(j2ze$0s95pJT z13`7|xsYo8R5RL=>M}b8W+o>?Dtltt@Gl{$UqP5`!_chOCG_p5{V=*VQdVQOp~Iwt z^^=y-DZMwK)chW&rEurOJcebOCng;UV(r2E z*@9S3r21_-O*`HH11a&0erM_X7)+S?PI=|)tquLq3eKk|b)6c)Z>XHHMlK*#QtJZ+ z?r3L8SZjoe>Vf8JSh^hQNokt1r5pyai^fPuq%*D7dR$XXkBI}HZWbE4A4LVIufgT7AmAgk*yR#|f57>NKW71yjNudv*1FI$BsFZJh;2W&&NO5ev{wuc9Yfz37??^z)~g+PuH zrqJnXI#}aKT7B<54u5;gg8C@ry0g!#6`ibsgO?P4D~5R3lXIfZ6E?^%;oxXdEoN_R z-d1xPk#O+U^DI_?fS>|fXpV+A7#`b;1c<*9uPwi-tU|?kle&il>B@yMoU{UR} zlecrCM(gw;BZNIG7WA$ConI*}u)w^)z9C5b!N{hLcI-CWx%$rNot*|)Xp8)+@POiJ z>F$RI)`LowxKes(r`Ep{ACHv_(sRZJuM+82&_jlpu|zIDn}J8p*nu%_yt$v&dA0(B z^j6Vmp{apEdQNC0>X8Ay6h}8$U@rywFFSyNDZ*fJf)y5`vn)K){3Fch0O$1=Rr zamgYb?muw zH;liO0ddY4-p0N^_I-YHY|9A!ImM1ouSWfdfbUfx-^L;FJA~BJ`Wv2DLV?k*?~i#+ z!nT&1{mF)kvDjQxUsQJ%1njkvPZyaWP(k3L-D+wBRNnY(n{cdk?! zw!Y@D`hE5G4ytZ1d)40ul?i?6Y7>F}Y;&w5zt;GXCI-4lXT9{R(cDgn+JZiHpD@D4 zA^ArSF^AZ@LXloc$g|XYAya;Oy9biBI@*6+3T*~4p(g+&>xN<%(q81dQT!l zY3O0L!~HJH5`$sL9|!U8FgPj3e>MGcu8EuB5jw7u_6#EmnE1$;>|{)?iZCU#P{LZH zx<$MUnF%}Gn>|GC+IRP1m_5TiJXm)47Sy?8l{sW$QY3uiJd26EOi}C*KK@2iZ^gs| z)P@@`)IyVcsEAqAXLGVc4!)NaujR*(SvE}VF6wBGUWlGJjgpF@647|j7Xt23DFW)) za}>tuju7|9I!d_MB;TrSGXB(#f6a&NcYb4VdyF}M z6s4G@^d0kL{~<)wwIAYr1EOMzUT6d9~Ykl;`)DF&PuKjAB~7!05o3jg4zl+Mef zrJori`xr_IoTJQ)C<>^FA8VAT089pTo@8YDqmA}Gb5ya2pL7xQt$nSA9vr4GoAY)P z9c(vXraFqXxXhIExS`0R5#CA*p`M|i8M;qDla6jm!dM?-S+5II$Px9(aPY9>y!Woe zyI$TVJ+c`F>L-ndHt5XQYsOyoy~KI$XpY0R-c$_-5Z@L8v_EygQ_t(iHc&lPeC6j{ zvD2|3C;&uVzrPf1aX<9ognnQlUtLRyAXpj0( z81%kHR8<<2Wq?)VVY**B91gB2d@#=B6(P&5mFng3ZKj9U>pzNi{8$0U^#+mPI1+|O zFLjmaNErOJ$*E{TdDF)t9XH3DrroEeTSqxv)ctXx*403{wWS8;&R}9`Jr$u?r=Iv0 zgz^T(62bVrlzqJP7;*-x2mM61&ex$pwaNmHj-_B*u2h5J03R%k)Ss!@j*l7meHaDm z0sLjOK&x2NBS07pF8g9TJY_a$!K;mZU|YzKq2snWFPR>g!3MvkuJ-wS@BGY_aQT@3 z?cx+UXQJqeJb>CbE9?ssf5{bdcf{AULTabYYG0;-)3wfEJ2DCN4zvDMF* z#6N1ph874+YIO>Z=yVxZ>GlEB(53B7gkPtA3^8mk47ue^fB72LJ@*W8mrQQnz6OKmg zUO#Y4aZD+Fwk9r7C6S?NYRZ5g9feQt`G_lt$j)wOLHLasD$Ogf(0ll1tyMwYL@7nc za1?7+TomT?PRHI+l@cL!DVzFv&w8JG4rz~Sd&!y#k@?=s?VWIW#Zn`?0c3V@8II-} zr{SQ}A#t@-VphEWHk>j^?a*G5JBC}J&kugf7#;2vf@^onK~yB4c}1#J+;{3Jgg>KP zKh~+kKrxJinsF6pVmBXV&b42JO{qJ~alu8Y zKfk3*+`Y$R|E?Qgu7y(otUWT~KYUQKMygjf$Jp9O|_Dcz{_OzXrva;3#9~|Lf{21L9cLZ36@+*boQ~ z!Ciy9ySr;}cZU!lxJ$6X3GVJL!QI^l*Who+-sj$PAN-rHuCA`?uC8x=Ypwd9Bzb(8 zfQITS_Ck;ap=c*YNsm3j1LF%W_Ee*h_>2oqKd!z#-nQ}U0~Pa zoI3T^`^VMeQ`j#6a{5AIa3PIjl}1Z9l0{{vOmB$%flagUBkLZM8H~ezM8PN6`mYN> z+4iZh&apfBVgLdb(Ll{d8px39ijC4BY>$Y=Lnp-ZjE8@dF&row5GwH00cd@1#>vR+6GE1kZclYZRt|7>9f%u(;P za*KtK^!^L#q|Cf8_yMUKar(@56Y24CMNHeu+bx^Zgys@*YgFO^Ge?MXA?)V|rFc7h z$;{|?i-d8^;omQZ_0W!7=rJX2LXD$9kk7~YGik77n6TIyWg_i^F3>G2F=?s9qwPI5 z%h#+uqMVe7eA+*OISSFHDy^ zox=JXD1x9-Srt{IsAqVS!F?ChLgXTv;0djX=={f3w&pa;i_Ale_Q6L;P1W0o&0*vmsE9nBZ4XA=jL{Z8Tc9cCHpV#z5a4hx-1ZJ<;<0LPHZ68>R4$H#XjC}h#WB0{N~HLeCi)nli$nPaP^uvESbjV?4B zvmXue5>Xj29X>iu9fu58F2)6zhJQ8gk3dRj)eDJYsDNg(%~JnK81d4h|9lmhO7UH1 zO`4&JlE~DN;5z0>R>dinXz#jBbC829?pz-i1l(g@S(=m-7_JyYEPH$eB~+&l*Qa$ zjQ4!aoay=$o{M#wN$WUgrd@u?O`YqX+&(Tm5HS#!*m8#wb3&#QOWB8DQ z|8H4$ihB~3jvMH`iEyu835^Cb{IQPph)x;-b>g$Xm4V z%soYKu}*ZSW~1DCZ8(Z&R4<<4Jr%#F=h+qo;rMs+6*-djcAQU>wPrFu>V4gF4q}?Tm%W`%#GAAg*VgY0H;}2N7SA)d7Z2A*%Z<=G*=3JKh;-5F3wt;J zoqNCi2VYmk2?D*v67mqcnTJ-V@v*{Z{`0KroS?XZ)YTAsa27I;lC}N$hQp8D zdfhoo+BbIMU9+6RD=HT-hCwH#f&T;UgMRN=JcChBPYIN5XMo-A-r1kbsMRjQ@zuW4 z{NKS5CoRiz8>85ETe%E}1(I$R&Z~k~FiBGg3DbhJZf(vYsu?kX;+O{Ob_+X(HFjj zV@&#IJt`vnxWi9Dtz7%k7m_AnR#2C8BRzUw{3$Y{-uBwc6EJJ$O)0O&D5P#9=HdSv zzO2lrlGb_d@l%U?&pLGN?SNbx_{mlJ1GQ~g8o9HsS&Q?k+RzQ_Z1;euf9NBZ&CaM* zGpp`8{V)$vajbVRAHP>RqO>maE7=ZNjVG_keWk0zCD`35m(L67(R3gPQl8;?s1R2m z+d_$vUSIHtMK*=Zre^>9?PWS&!bm~d1cmg5n%zFvt&M1id)uM9E~Wcy;Ar0aZ7mu$ zvq=D@HjE_~ti)tZ7PD?S+X3P1U0~gHo;f>Jy>tAX#|P%jg@`S{@E0zxY&vV7B*23! zXu_#Eac!^(3){oRoL8`1drK?ZWlhirok7kKf9X5;WJ;1I0b6M`v1zY~$;E)S+7(k> zV;VfH2h;nnuNDlq^`Xzc$90KaAL$7*O8f=p_G;tRc>L@r^t{QiN&vR;Q!m867QTQC z?kA}-Vl(U}rq#au^*`I~AEPA?`pJ&wW0y8IqS#n{mcj`qi)p1>s9lCZUB^R&;Ze_hkVJ>TP} z8wL30bJ0ns1LfdoQZXY?rnhx2$B{o;uA?S>@%zz!1WUK;s#(#Ls=(IU{Q+Y-ccWbW z$?jEI>wGJ4KAyFFpE4}_`#&0P4Y8(jSV*unRmw|;%bEOTl-13& z#_eejr!ea@Eos0HS^+x?AD`0f8tM9{Pd`Y^j4|DdRe-z%8$J)cJ548mcDQp9&=~~_ z*GZ+f`$a4A2Xt`u#rxa|1VAN6N=Z8~JIIsiPxv`^RB}sjg-6|rsdN~QBuX-Z&_M<6 zi)b6k>+881TXpOn4^rQY52B28mZH+DxZm1B@)wqiR z!z0$Q+KCabWj-at^c#1+YTace#DwhEq@GJx%c(P1_MGtIRz85_o*Yz>rNT-jbRUGR z-Sgk8wSgoCwK(G5@-K`Ya1kYt_>3;W-u@*+CtW_jBX7e5`j~O#ynse!lb2*MQ%6mc zk+=OYway%q()1tYF5~C)(#m!L`~_*zlhHcHH4W1>x;1wEgd zJ5rx$B!|fL2f9Ocfg+-Ko{3F9gj9%%Li!5&qeeGq4^?(q?e)OZBp=F>L&eI6G*CsP z9=jeW$GcY$kz`ZFdcgAU~^TBbWcUK96%zt7g1tjZ;<(e%m9 zhYxBUHBjqW=3w<9QSsvi+zs0Ts5m_&m~@0e+8^>1C_2eAjdYxh+-Oycx0QUS_c*zk zM?i|_y`I)St8#!akiti2@Ww%~4^^}cX!b6HOp2g*P*#Jp?K)WQiG^%U6SL3bjP%0} z2YsF9R4hV5gIb-!NM)JRfU^}B_wZ0dei{N}!el>U-dU=CuzVQn3sCE3c8p%CJM?hyI^#mO;o^M+^hmz1rTywo%_;Uev zI>^q(Zp(UFZNbIaRAP{xE*fa(!wCXVj)Z*#Y zk#2@gsE3(tTP8hwPWC7e~u=`POI1UUdJWAI?QXU84bAmN+@sxBJ8?Pg!su>E0bYGk$F~Qvh~;N?S%l(;~CPqor~tUYRF z_{!?d)mD>2eskP+ymQZSZjrTASOU{+zKytMPtgBa+(0YKn%-I}d&tME{Jt2WVH^KI z@I%{(vC{-i&yAz|;lKjnV9sqDItOHev0rhkIG_wiUqAYOC~X6ESUd$a!!PBV)^#l8 z2>V$u$-!4a>02L9*og}@2(<-EZ^ak<=leSt#hd-OJIJw7|EFL4l;ScW!QY!8UNY3j z5M*hhD#t_JM$WRX(iNCLhk*9E6rVFt9H<75sHA*ov`L?L?Yy3Sf4wYBc-6vvV?grk zxH%bU6}Gy!RiJpzu(J*42)KLz$a0)(0h%jTks2o(S?u9$LW(akITgC1G=mwjPtIC) zK)xI4mm&qi?UT3Nlcl))&51hK>PGtfy36oiRbC4S(i$d}(HS%=P`HRQ@;D)aAr{BUOMMtFq=FFUd8{eca#^@5yy=&*KQ)2t1>2vmzdX^Jr(nYF99J zAHPmOJwBFISJdueose3Q$pk|6cK&E>099Q(^1~B7D26YhT?RQ~wAAdQbNQVUtg*&_ zY`kZ2oE;=G)v93&_nlM@#+PlhmFQ!+cHX>C2Ol&AqyhoMr!us@lpkr@E5_yf?VmRQ zs^$Sn-OHB;I;^ic*eLsVukt#~U$^c9<&ClL#n@kIA8v9~`~E6B0z%~sVBjf50ZL0v zELxbHK43Lke*yzX{3Z2~$q4yP(d+u*iML5p=;;WmPPk{fe$)dNTUYIm5w<)Nce|V1 z$1Am&)?(U|f<)@lte=6ey^XOr3LDNBYz}2 zFC>sh)DZWk(H-#360{H+lBb)Rg3E5BuZF2R|0vDHlz|zj2&_P5FfpP4 z3(Wl}n7>Cpr31bieD)pztNosd7*oL_xn}zn6pa;_f2joj@;5%ozHv0jWy{0=4@YAd z048G$1C36J04eV8PgmQph*XYJvn!&I2RmVvga3gZl?!rL(B7`e8qj(3tH4>k$qAez zlfi&|%bbC;K0uB~zUBSp{ft9Vfe7e-=9(cff4YhIlZdKT83P1V^GDTXj00#lLsqzR zjZYuKbYQ`)yGsLeJMPjr8s02Ve9d0*Uv4@(m_xxzu?R56&hZzrBFBYr-Au7Ii`X@V zRQ}#MS)F^}a@+l&Oq0Z4jko^uCWC5<rb^i~o1)c)`F-0ZsiT9{ZA$x?DIlFgjDv%8uR!qAtRz` zw%-WPYfF#UeK|6G)tKRCoAO^H5})KhK^#QSsb{!CJJD_PKianlT)*cM%zs|g|7GNK ziW^M2b%e7M`r$E@YLN}V>pHgTaQ4dvVDgP?8SHA3bOB`yuHnyl0w>Lezx)%sLk5KI z0KEC#;e<;ju)jcSRYg5I}6F`{R3g5prXy=|;`0fof$P zc5rvZB!|p!oby2aM>bf1{MHU0mtXyJfO>&}{!k~T07-FyGu-|wB=XfmNJ@Tu1KDT%f&uf!u)FN=2q-(o4=)|7=W-(9;bdE#&7f=jxH1zWeQJ_8Oma)iN8E1O z4LyNX?l=UCO|{u+?&)P$&IcpB>FAc2*E#U@K5rY*1{)aN7g$f2GR}H zsjKD8NT%Bt^r=qrGkg$0w^vX-?9?D${A)@xx!^jd-qQ7B zu{}_Mo6E!2IlHP1O_w+OvX5}yAt&|-l=JPXifKK#bzpBmf9O*pqf(n#E^y>HsK<&j zd@SE4T$KL!?Cksq$F_*95GZczNnM_K_#dn$J0mBgTx#7;szd_2R7rhi|M2+V*B^(?}L z?|LCdDD`#CijQJnJi(uml3ZMZYCRW1I+4Fv7Z){c*Ay>GI@tK_HR)ORywPiuXSpIT zcD5FjWvNVEobNekL^iC@T2saB|1%^?Xf93fBjvcfk^x(qp;F@Guvj5&vd&qV-b^v( z4z)P{3Re2TsrvG@f)-p!okc$Oo~l~yT|=h`a~{t!nuegUwHE>*3w5%3fOa} zVa1+nhIR6_AI5oIVcEegmnUy`EjX#hw(eC$KU#}$wUo8d`C>+{Dk?&~q2eSsL7G&n zvxY{cpzv zR#~D8slh8D0EePOd{$GR;ISPN4*BAXrG1qk5%pE@e#Yk`HEMaGEg@Zkl+SfXDGJTVyV+?jJR*4JZeQK)B zDp`+Qo0eO5Sp=C2wy>?8HceJar!U?!{$#1#dL;h=625fbK*NnRW7kc4j7-VkWOp!kq8V~^#=gC`gKbIsmz-%Z z4EW>+{V=XRc@b)~_EC*^0JuluVT)c}E&GXMUugcYgMu9v5#6>$;pzdxS%-8# zh24aN&yeu20SZomj&nMc%$$)4vU8TW^RX+67B{}a15N31LPr(e zSI$?61^%|+gkvFAJO=SUSD%Q&PCNbkZfSXZN-*+afns~Y0nsf1cBZ_bvH7KwPW-2f z72Of7X4+0sVHJ0`W%yRkZCP&-sp|13nS8JDRY6N%dS;xOO2b`R9Y>wMt!Zt8Kh@a# z6xlbNmkY85RaQcmyJC18QxLSQx#Db)MHMi2w85a$~6_qu&Z~cy0y96IPf>BSO|J$B-sfspZx$M&T={- zY|1ap7$#&ra_quXbEAK_ zIVKq*pKeXrJxL8T7}3UnhRt^%e)1xjZ|ZU{MIOe zrt{g68uG@qH+UINMzSPJW=!Ra_3+qM%$2u;Uq}(HUh9xGXia~ulI!?9DEzF()ONEL z>(WNP#~CYek4!MYDKWF$VPh-HzW6*(Lmf$Q{Mv|=cF1LoVS13dYOWV8%MXg##b94O zr{130E(t4NT^t&8uYOOjzw(Ul6v(|aac#lin@|Jsf8p1Vr;9Q${EB=&Fb_Z6@|R~O zDI#Dl+mSEp4FKyptWq&f?U@4+5H2;k&oBTKBuMNe4fP>B5?fU??IJu;AA2> zebjiIB=0TMZ9RfXTJ#~C`9VmextP?Xh@4KJDy|ky&e7%^w)*(F%yH*P#ZnGkm+)BG zhdrLi84c|t>flzAkj)+EVCt{nQF5i~E70apfqU|Km)f`edL=DC;hg+?KH7ZznQ&QOPk;^@A@TMyPrXHjn%I={?S`@-o zcGtI>-7uMvU*QOKePNTyTSYx(cdBR}{-_exvTWaKp7vd#APDX&iG*^;wohxpqY3WU z%Qi7b95vq26n@tIE|sca9vItycDi%(0{WqHB87982zIvjbDSeLMFP%6syYBLl(X9L zl$nQ_b;y4=aLkm06kL!zvwgP@l+LbFa+Ai*zQne~qJRA|wKHGAt=K{hOLlM3$Y~FY zU19Qh@{e@w$@x0o(fhr>>g0jKt~m6o?U7{Ap-QLp`c~S-jhuC%>}aTw88nrw`f5&n+oN&x zA*K-JxnXFDTixtLmqT0402U^=7-5qX7pEd2F)_-?)g&grbR+a;;ekujap*axSUG_R zm!s|kvH05-H}cxyVIg|n6Y0Ha85yDFzP$3TJIT-q;x(o2dwBtUpCUL4^_zii`JNv; zA+@bR2h9R61s^fVK1(bfHkIzo)6~^O&ahF@zZR*YU0fkIbGMj6yRS*n=rzU)BUl?9 zp#KN7w7EfoN}>Y>30B9T&`d;X*eWrk0`Wxl9Gf>9p3%=neF6GNV}bY3Wsw`HR+L)| zN94C8LGG7fo?D}@glGfhJdlZoM2H@;A7{%VL$jQU$RA68w;MY^;jzW6Uq?DN)3;Uf zHy{m{VJ6_pJBm{i>mR~Fh z5e!N9dJc90%K?swVNj74@gG0$xLNC~L^Z2_gdUafP2CiRL1>8YIO|$H;8YQ#$Ltm* zWgH1tv6JxN+OUs>tY<|zxfBt_U0TO1^mtds%}Qf!fLnz(%5L*nU(u1_KFpE77R@xe z>2UDdl)AYpI!LPz@{_da1CQC!Ch0B(l^J{S)hK1&3l^UgU-|1KJcSD}Sz+8(k$~?P z$7MqjQ|Hb}gpSBbApgu7nKVoBkp6ueiA|%WL{Qy<$8myQw{kg>utioZ7On3@!bsUG@XZzj( z_qz++3kL+o=ZMwbtbUl-JcCeHSP`g!txrKg3x#o!%92cD!(Bw2E;b6pAM1%}kO`-~ z_Kn?K!T(|{CAyM#4w+wX+q}+N&e-j~p0#_h5Z%2X$m9a+79VL8WbnBKK`DwUALbAH zC>_qFDyIlXvSAUlDcw8#Q7R^&g4c(8BGbYyun|UH?si0#d;011-P>jFJ$bMAk~PUF zs!PvQGF{|E30v@p#_gw}8d)+W*MUKatk) zb4=EA!}&vydA(j2d!7h9_NT;owo3FG<~!uyI70o>?W=<8M}-e217Um237FG*Z9 zlcxK(W8?=@atWQFuW_2ggr}{&;#PeL3o>~8*+YkdoYWbg=~F!lV80@MjSyaM3deL! zk3giTUP%Dln+$PX1-5NiK(==b{Jd)#q2`R8y^fz2zaY6j;Mg2#mfMLZOOx~M?U{xr zjBH)KIx%##!Z!u>U2HLz8~@yla~~C$DV>?2bakZV-t(;C#jsVA(=Tw7SFn5%%oVa* zS7=>cNtG`jl|sQf7;>xEFH@)YN-SGGpsT6PukcY#TGN+N;>(|eHtl&K5Efm2XdMm~ zqP!+BM?X|pQ9N$$c_L1eZj9WO8qloK1Wwi4G%dLbvoHD-Dqj73x@Z7&vk|G6G_MQEpnPU{zB}qu(>EMG-y8?HIQWT3aps(+qX;fX!fW&Z4T#xtu*Q4uDRK zl$UiTp6fpA|yf*+7y~ebKcEFIZ%WV-5 zMs+XOK;cPJg3=9 z_YYr34AYeyn#43`%fOp&zDgJ)2Q{(wt5JIN|EU;J#eA$~YA9aMUy+!vvR^-rMx-#7 zu%ghc&scC_yR{&f$zHeem1`Y0-CU`4Y^fgF+3ek)+!!$bR5De2;eN8*^=HQ`g zKNtW;wopfHs4%Rjo6J{X=Bs2X`8R>ackDVLHmNr`Cj*v1P{nkRIe=4 z!=AB)*UBhG6s^HsB)l80OZftQ&NiP@L^H8wa67EKdr(O6T8BG_krRJ{lrD&SZ-LE^oHC zgs%;BnMwObzA^KkpN|64inj;@oBcsQKY?2O+as}Z;lzq^?nLDCn)bsB+C^jMO56`& z#`)3!>njg=O#*L2OMScBGtTtz(}c+tx5Y=}hgih;oxw>eZS8alBSS)%J1w0j%R0P%_p`V;s zjeUg4%5K&PEKVX4-EIeh;+gX55@?s@j;kqdckivih8o5n(V+*ge_8&~loUN;Mro<0 zJ?llGsFw34_~6T7m@Grk(}z+5YU}U&WA*yvuw+JIoczuBW{itr8IGTXzo11Fr~(v+ zZ^yO0Ca#QJUH32b7%w%WM_FwEj8Cb{HRs78WRlzqRa7n;Jt$e*Oa}c17QaS;~ulrt(x@#|KK^?*#Z1>6-IzMW%*yI033P})yxVG;k<3oVpejicygmTpFoy|BbbQ9^wU0rIW|1vdO z!uX;+PX!?Fd|GcyZ8OhpsN3nZqL%_aFM+oYHRI_5T9gIB8NqV0-Qa*ys6F|?e1pGlsWvs-{uBv3U9F6vhS^U*BqUX zM-hsTPUfNo9&Aq2T&TdoK@bzYM}oxTnIFvvw_9-t(YhY?I@|m$>v}qgiy7?O@-sDE z+5_LzIQHE*kJGt#g5#H6jiFYIo-s$no=nYg%9^F6Dk_!zsvL>pzpep;50xNh)y7(dPapr zgF6>hr7uO>kf{3SB5(nMsGnHi@D%OcH}?aJ}TH4?vOgCQ_8%{ylPZa6?If;Gz`3s#?Zj_;b*91nDbomY`6* z5D^>1%h~>YI#b-e4)d@H&0Bv+K!e+D6(84Zo?a#T(pJvn$}$VSyJOmal_h9@xj=Y|w}ZxX z!z7xssgGOBPq|uY^yjnKIb{%C#3f5nv!E`g?VR_LHeO<}7_^0iOBu($YD#!FZ6x&8 zxs2wJ=mID>8I%YC*`F1V?;zQS3l+S~mM2!0BI<1)ZQMGRz9m7?9aL7JYhE7vt0gn> zRY#np+PdG?bxvoZj@PQ`PFEenA~NFpi7c1+brvGfoSWNK<%X zzAus$svBPT0DB@?q$-`4Nd~9=N)v30-$i*j^i8E=AiVYV_fGTAL=e~JTuW2)GXQ%V zfdNe*SNI6a5N{?7MwNPb*};7y;o3HjcB#T`cCH7MLL)Zs$&z(NOFrQTKX!nqsOVs! zL9@3quJ^N^Gv3*}Gv8^Kv~0-anXwP_^T1tkeGOkm^rG7i32=$y4LkKJ%qZN#~*h+yh62SY|!e zpu;dr`!<7KVaH3BoLR<68(!~JM$&lzn(+bYBQho?d$|X5zN}|f1D$z4Q#$hSpzORR zF0~k#`CCxAGik)-#$-&!Qo=6GS|%^l*qd9pz`oWNCe<%_7aV@|a11wWSx@yywP$Mq zd+V9%&qo&Jkkq&rQ-G^jk9^$G7H!5D3kq)-<|2ll4VZ>|_j0U+hob#u`5FhQp|+{K zcKn?FPteiI8<~McERKWxnWJOfGm@N?biW7g8-_aAKaWVY*a~D8LPqP9cahN0D4Z9C zHsUxlTKKweKwf(|>hPR<>Exht-}ySFj3OjYaJ3`5T-{D)Qn|E6D?=G8R@ERuhnxyu zEYNT`oC7Gms^8na>=;y*O3Jzhz0D&+2F_@oR3TW$x1WQV{hA#2d|GHYmGh>i8;zJ!8cjrPIuWjXtCU^_K z#4=G;iu6=kw6%Sk8@S!<%^T0ovF74(W#2$Cy;5-8{fPH8CW6t>qOdpABVuJrh2QmF z$)hd2(1s$UcO^OmuC)n zRm*z}pEf4g^nDe{k_UuyElTgEn!IJbM*Ep zh2&B`-TmOpk*7{ey&hIxbpYOqG6z&x1+0y(=LM&1l8l(_FvUVL+c9HlY&Wc)jT)z4 zx^3W5?JhNKUgEtuwzP&;T!?rv)-RN^wx(B6yr-o{!_Qh>WY-z(-?kjOHcvDzZ=ScY zNDdUL(8xZaYs(oBn$pSkZdrM7RNsEW)XBY>fFj&75@V9$;|ez8vp`<^V7f>iC=juk z6hR(n%_j@oQ`)QPd3wHh@3TjyQ9>myb#YKV>V89V|53}fRv2->{zo-~O6R6oyX9!^ z6UVMb1YRnp196sKJ!~Lx?0g(kpaYQy*Nw>o3GbC}t%-h;pXzwNH`ea+uR_Egamzg) z`faYHDygC=Q~fOqZBV$67!juH;=r~#PxIJgFV5{_B9G>%)Ad!l3=H$v1E2*9Utp4m z4)#PxsW~vv@NPcM!Q)fmWl1`7 z`o=SmhGz~^lNEWeg=1GAqIv*!(+l=im41dCA_x8EQ%lko6QZ5B2ZZDJgy)gdbZm(7 z0@tR8HQidEbbOdY_=~+^V{Dnqb#|r)zm`-IZNtyEwK(~7v_kpN#qY+iquF~LM90%C zXHJVc!?ebUBh8QCV8dL;e(zbM*_uJmhup|J_tH1d#CBi38MySRek!a_vt-}5nvVO~ zq(kF(R7LCq(XNoeFZevgccTGg4OIFSW^4P*B|9RR?kO^*xyQ;U&<$OtIs?pVRI1I# z(mXa+$KM{gRy?>s0Dv>ITpZbN--DtXQghSynC0B1?Mh>9hm0!?ko(Kp6M5l{z9Gi%wp=$Lm7gIHq(1$P_UU5q?9hpTT5qi2=Z&?B%G7gy0RP7G>h<#0W1q&8 zAaub+8HKh5&Z(1Zf4eG$zuWk(eFI4~sdICkOvXa`Esl>5_d2}bEcG9** zbBO2H9Js=_c?4a4dF+#>Q`Ht)g}(4S#qEq_M;w_|fjiu63nkGgl{gf1dt}LBKnKgo zuYxb#FCs3HDh**~q4J&z&nY1}2h$w#HBF+4+80|ZotLnBsfJqbWb}RaOuVNW^7J3r zMF&+xnXBw?v`V!!gQ$nEuB;TBGUsIE>ARDntp2!wsaX>}ekI}RIafst*+n28#}`k| z7tm5gl|9V3hcXW1aS2S%i%1D?Zp9F?^42$V*B1J%nfa)VeZWzr%QFGqBM=EgJ>id8 zn&$IxZrQ?}8lj_Zt=_|~X-eW`h)*;@uW0e3$QbL+o;M7Dq9!l4Tuf)0x6K%Wd7aN6 zfZ?5c^ZsSKPMOlz9y@8x4RLM7?cEvfZ!IL{BR0+L!BAb--nWn{{xAe#`FcQ-F#X(0!yj52d_=Si* zz)j#KlY&=k!C{?IAz@Y9n(T9GBarm&iY@t)cBxRtgg70SWVI`7xSCL_zt&GDkD7~_ zZWwSB)Y{KM&6dnsljM-Yzq z_+YPy;>^J7{mzA4uh_A*3oy*eh%RO@VcOQ0c*gI@jdZ$J_-DMS?c zHOoztvEhH7Mo{hK>5|sau@Xq5pE_SE*(bEn#w?<=N#o+jd_^`0;B}OzKNMG&wJ`gA zDKa|kn^|18rlJ;pWW-R0`H~VLMyDkvSKY>9x6W1=&#!e2t4TKKwq?+eKCinPZr=Qi zE-hGa->orUTKnaDdm&_(Q=`an91RAK_A}p)@}H#+JH7N?2O@l$)!?`9 znv&x%kfkHSYEDk6BzJ_Jkpm2xUbrFt)*usRpSt)_@cVXaGJ403lz+eIV-*K-d8UoH zQST_%g{q743tRvzQH&VNME`@_HYOVImzX9cRqjd@?Kxx-KRCWUzE@F(XuDA9cNs6< z-Skt+|DD-8?dq?aRS{4<;fsut3GsSz9r}3icGLOn$og#v+Z{xi%!ZI7uV1QOB__B` z#;pjPT_2^Vyb4P&?-FJT8ltH#z(``TM+A;(HZt~ZXwt50oau7tYVV(}{fO8%4Y`jk+02;J*bYLf{!Bu0tB($UT98f%~}$Z=YxIm(*{|f?LTCU6CMK|KfnW`!2iw z0=EIz$+lh7=GJT=I(P3t5k%zq3qSt$yFe;nW8*%=X@3jXZ6(|D0UXpD+A2@Sc#Q_U zRZf-G!Ov02C-oERP=bm;w;sE~m$XCZcckl|fDYk=I)8qZ;g|gjQm$xb*l}?xabuC$ zxbOZXkn=JQho4}p3N;zD0$r^OCXt+L%fVg+5Y=gy)WaP!qZf2!nI2ItoN|fuE!gtQ zrNB~*zfCRSAF2ftRIpB`pbkti;Ovt~!2zigUE?4QR#GgV_B zzuw&6vVA4vY{#Uz8GhuO`U(VQ;#6THWW_bVDZ{Xf&>=0P4QAd?c)$N6gatCfI+Vzl zV%O^+xuHPYEi#FNdkq;Di=PkAIkqmPrjpc(kJ2+sW@YHDM3o>2FpI{A0!kN26}7JQ zP1ghTglD4wKoK=K4YW_kZfgcNrQQ;n?`*7ee zeE`0lI=Tnbk9n*~EXYvu&UHYA-#JA6^QqfHM)wBi#Oe;mK^BNSfZA9N#tWg=u`k-#R)$lL=070I`hjp>b@MvgH`?ENq`d#XL z5Do+@Kamj+X&g1`R5|L85P=a22UrW8uPLzbax?!1X}y4r7Ud!-W2ITf@m^kGt0hwS zfK53fv@RCdVKtA&8noAc;tw!Z5crNCD|R?vmntpbYszdbeQn@e5MTO+OZE_lf{`-# zxc>+vMPTs)#y>MotOQX;X1IjKyHQy6xuB?CVtOC+zegb6qGkb4G>Kk(<6Lnn?QTO3 zBJH=|{suaK(G$jWIEi<>=}}34sQ>%t7)MAd{q9&t$gTe^3O=v%2Sv=_ev}D}XDW)r_|a!rl-U zjDX~?|EFXy1%zfd6Hj!SJKcXbaKm5V^LqEi>$5H9@93G6r+45#Nl`hGav_6n{|`;B Bng##> literal 0 HcmV?d00001 diff --git a/src/doc/rustc-guide/src/queries/profiling.md b/src/doc/rustc-guide/src/queries/profiling.md new file mode 100644 index 0000000000..156fd65a91 --- /dev/null +++ b/src/doc/rustc-guide/src/queries/profiling.md @@ -0,0 +1,343 @@ +# Profiling Queries +In an effort to support _incremental compilation_, the latest design of the Rust +compiler consists of a _query-based_ model. + +The details of this model are (currently) outside the scope of this document, +however, we explain [some background of this model](#background), in an effort +to explain how we profile its performance. We intend this profiling effort to +address [issue 42678](https://github.com/rust-lang/rust/issues/42678). + +## Quick Start + +### 0. Enable debug assertions + +``` +./configure --enable-debug-assertions +``` + +### 1. Compile `rustc` + +Compile the compiler, up to at least stage 1: + +``` +python x.py --stage 1 +``` + +### 2. Run `rustc`, with flags + +Run the compiler on a source file, supplying two additional debugging flags with +`-Z`: + +``` +rustc -Z profile-queries -Z incremental=cache foo.rs +``` + +Regarding the two additional parameters: + +- `-Z profile-queries` tells the compiler to run a separate thread that profiles + the queries made by the main compiler thread(s). +- `-Z incremental=cache` tells the compiler to "cache" various files that + describe the compilation dependencies, in the subdirectory `cache`. + +This command will generate the following files: + +- `profile_queries.html` consists of an HTML-based representation of the + [trace of queries](#trace-of-queries). +- `profile_queries.counts.txt` consists of a histogram, where each histogram + "bucket" is a query provider. + +### 3. Run `rustc`, with `-Z time-passes`: + +- This additional flag will add all timed passes to the output files mentioned + above, in step 2. As described below, these passes appear visually distinct + from the queries in the HTML output (they currently appear as green boxes, via + CSS). + +### 4. Inspect the output + +- 4(a). Open the HTML file (`profile_queries.html`) with a browser. See + [this section](#interpret-the-html-output) for an explanation of this file. +- 4(b). Open the data file (`profile_queries.counts.txt`) with a text editor, or + spreadsheet. See [this section](#interpret-the-data-output) for an explanation + of this file. + +## Interpret the HTML Output + +### Example 0 + +The following image gives some example output, from tracing the queries of +`hello_world.rs` (a single `main` function, that prints `"hello world"` via the +macro `println!`). This image only shows a short prefix of the total output; the +_actual_ output is much longer. + +[![Example HTML output](./example-0.png)][profile-example-html] +[View full HTML output][profile-example-html]. Note; it could take up +to a second to properly render depending on your browser. + +Here is the corresponding text output](./example-0.counts.txt). + +[profile-example-html]: ./example-0.html + +### Example 0 explanation + +The trace of the queries has a formal structure; see +[Trace of Queries](#trace-of-queries) for details. + +We style this formal structure as follows: + +- **Timed passes:** Green boxes, when present (via `-Z time-passes`), represent + _timed passes_ in the compiler. In future versions, these passes may be + replaced by queries, explained below. +- **Labels:** Some green and red boxes are labeled with text. Where they are + present, the labels give the following information: + - The [query's _provider_](#queries), sans its _key_ and its _result_, which + are often too long to include in these labels. + - The _duration_ of the provider, as a fraction of the total time (for the + entire trace). This fraction includes the query's entire extent (that is, + the sum total of all of its sub-queries). +- **Query hits:** Blue dots represent query hits. They consist of leaves in the + trace's tree. (CSS class: `hit`). +- **Query misses:** Red boxes represent query misses. They consist of internal + nodes in the trace's tree. (CSS class: `miss`). +- **Nesting structure:** Many red boxes contain _nested boxes and dots_. This + nesting structure reflects that some providers _depend on_ results from other + providers, which consist of their nested children. +- Some red boxes are _labeled_ with text, and have highlighted borders (light + red, and bolded). (See [heuristics](#heuristics) for details). + +## Heuristics + +Heuristics-based CSS Classes: + +- `important` -- Trace nodes are `important` if they have an extent of 6 (or + more), _or_ they have a duration fraction of one percent (or more). These + numbers are simple heuristics (currently hard-coded, but easy to modify). + Important nodes are styled with textual labels, and highlighted borders (light + red, and bolded). + +- `frac-50`, `-40`, ... -- Trace nodes whose total duration (self and children) + take a large fraction of the total duration, at or above 50%, 40%, and so on. + We style nodes these with larger font and padding. + +## Interpret the Data Output + +The file `profile_queries.counts.txt` contains a table of information about the +queries, organized around their providers. + +For each provider (or timed pass, when `-Z time-passes` is present), we produce: + +- A total **count** --- the total number of times this provider was queried + +- A total **duration** --- the total number of seconds spent running this + provider, _including_ all providers it may depend on. To get a sense of this + dependency structure, and inspect a more fine-grained view of these durations, + see [this section](#interpret-the-html-output). + +These rows are **sorted by total duration**, in descending order. + +### Counts: Example 0 + +The following example `profile_queries.counts.txt` file results from running on +a hello world program (a single main function that uses `println` to print +`"hellow world"). + +As explained above, the columns consist of `provider/pass`, `count`, `duration`: + +``` +translation,1,0.891 +symbol_name,2658,0.733 +def_symbol_name,2556,0.268 +item_attrs,5566,0.162 +type_of,6922,0.117 +generics_of,8020,0.084 +serialize dep graph,1,0.079 +relevant_trait_impls_for,50,0.063 +def_span,24875,0.061 +expansion,1,0.059 +const checking,1,0.055 +adt_def,1141,0.048 +trait_impls_of,32,0.045 +is_copy_raw,47,0.045 +is_foreign_item,2638,0.042 +fn_sig,2172,0.033 +adt_dtorck_constraint,2,0.023 +impl_trait_ref,2434,0.023 +typeck_tables_of,29,0.022 +item-bodies checking,1,0.017 +typeck_item_bodies,1,0.017 +is_default_impl,2320,0.017 +borrow checking,1,0.014 +borrowck,4,0.014 +mir_validated,4,0.013 +adt_destructor,10,0.012 +layout_raw,258,0.010 +load_dep_graph,1,0.007 +item-types checking,1,0.005 +mir_const,2,0.005 +name resolution,1,0.004 +is_object_safe,35,0.003 +is_sized_raw,89,0.003 +parsing,1,0.003 +is_freeze_raw,11,0.001 +privacy checking,1,0.001 +privacy_access_levels,5,0.001 +resolving dependency formats,1,0.001 +adt_sized_constraint,9,0.001 +wf checking,1,0.001 +liveness checking,1,0.001 +compute_incremental_hashes_map,1,0.001 +match checking,1,0.001 +type collecting,1,0.001 +param_env,31,0.000 +effect checking,1,0.000 +trait_def,140,0.000 +lowering ast -> hir,1,0.000 +predicates_of,70,0.000 +extern_crate,319,0.000 +lifetime resolution,1,0.000 +is_const_fn,6,0.000 +intrinsic checking,1,0.000 +translation item collection,1,0.000 +impl_polarity,15,0.000 +creating allocators,1,0.000 +language item collection,1,0.000 +crate injection,1,0.000 +early lint checks,1,0.000 +indexing hir,1,0.000 +maybe creating a macro crate,1,0.000 +coherence checking,1,0.000 +optimized_mir,6,0.000 +is_panic_runtime,33,0.000 +associated_item_def_ids,7,0.000 +needs_drop_raw,10,0.000 +lint checking,1,0.000 +complete gated feature checking,1,0.000 +stability index,1,0.000 +region_maps,11,0.000 +super_predicates_of,8,0.000 +coherent_trait,2,0.000 +AST validation,1,0.000 +loop checking,1,0.000 +static item recursion checking,1,0.000 +variances_of,11,0.000 +associated_item,5,0.000 +plugin loading,1,0.000 +looking for plugin registrar,1,0.000 +stability checking,1,0.000 +describe_def,15,0.000 +variance testing,1,0.000 +codegen unit partitioning,1,0.000 +looking for entry point,1,0.000 +checking for inline asm in case the target doesn't support it,1,0.000 +inherent_impls,1,0.000 +crate_inherent_impls,1,0.000 +trait_of_item,7,0.000 +crate_inherent_impls_overlap_check,1,0.000 +attribute checking,1,0.000 +internalize symbols,1,0.000 +impl wf inference,1,0.000 +death checking,1,0.000 +reachability checking,1,0.000 +reachable_set,1,0.000 +is_exported_symbol,3,0.000 +is_mir_available,2,0.000 +unused lib feature checking,1,0.000 +maybe building test harness,1,0.000 +recursion limit,1,0.000 +write allocator module,1,0.000 +assert dep graph,1,0.000 +plugin registration,1,0.000 +write metadata,1,0.000 +``` + +# Background + +We give some background about the query model of the Rust compiler. + +## Def IDs + +In the query model, many queries have a key that consists of a Def ID. The Rust +compiler uses Def IDs to distinguish definitions in the input Rust program. + +From the compiler source code (`src/librustc/hir/def_id.rs`): + +``` +/// A DefId identifies a particular *definition*, by combining a crate +/// index and a def index. +#[derive(Clone, Eq, Ord, PartialOrd, PartialEq, RustcEncodable, RustcDecodable, Hash, Copy)] +pub struct DefId { + pub krate: CrateNum, + pub index: DefIndex, +} +``` + +## Queries + +A query relates a _key_ to a _result_, either by invoking a _provider_ that +computes this result, or by reusing a cached result that was provided earlier. +We explain each term in more detail: + +- Query **Provider**: Each kind of query has a pre-defined _provider_, which + refers to the compiler behavior that provides an answer to the query. These + providers may nest; see [trace of queries](#trace-of-queries) for more + information about this nesting structure. + _Example providers:_ + - `typeck_tables_of` -- Typecheck a Def ID; produce "tables" of type + information. + - `borrowck` -- Borrow-check a Def ID. + - `optimized_mir` -- Generate an optimized MIR for a Def ID; produce MIR. + - For more examples, see [Example 0](#counts-example-0). +- Query **Key**: The input/arguments to the provider. Often, this consists of a + particular [Def ID](#def-ids). +- Query **Result**: The output of the provider. + +## Trace of Queries + +Formally, a _trace_ of the queries consists of a _tree_, where sub-trees +represent sub-traces. In particular, the nesting structure of the trace of +queries describes how the queries depend on one another. + +Even more precisely, this tree represents a directed acyclic graph (DAG), where +shared sub-graphs consist of tree nodes that occur multiple times in the tree, +first as "cache misses" and later as "cache hits". + +**Cache hits and misses.** The trace is a tree with the following possible tree +nodes: + +- Query, with cache **miss**: The query's result is **unknown**, and its + provider runs to compute it. In this case, the dynamic extent of the query's + trace consists of the traced behavior of its provider. +- Query, with cache **hit**: The query's result is **known**, and is reused; its + provider does not rerun. These nodes are leaves in the trace, since they have + no dynamic extent. These leaves also represent where the tree, represented as + a DAG, would _share_ a sub-graph (namely, the sub-graph of the query that was + reused from the cache). + +**Tree node metrics.** To help determine how to style this tree, we define the +following tree node metrics: + +- **Depth**: The number of **ancestors** of the node in its path from the tree + root. +- **Extent**: The number of **immediate children** of the node. + +Intuitively, a dependency tree is "good" for incremental caching when the depth +and extent of each node is relatively small. It is pathological when either of +these metrics grows too large. For instance, a tree node whose extent consists +of 1M immediate children means that if and when this node is re-computed, all 1M +children must be re-queried, at the very least (some may also require +recomputation, too). + +## External Links + +Related design ideas, and tracking issues: + +- Design document: + [On-demand Rustc incremental design doc](https://github.com/nikomatsakis/rustc-on-demand-incremental-design-doc/blob/master/0000-rustc-on-demand-and-incremental.md) +- Tracking Issue: + ["Red/Green" dependency tracking in compiler](https://github.com/rust-lang/rust/issues/42293) + +More discussion and issues: + +- [GitHub issue #42633](https://github.com/rust-lang/rust/issues/42633) +- [Incremental Compilation Beta](https://internals.rust-lang.org/t/incremental-compilation-beta/4721) +- [Incremental Compilation Announcement](https://blog.rust-lang.org/2016/09/08/incremental.html) diff --git a/src/doc/rustc-guide/src/rustc-driver.md b/src/doc/rustc-guide/src/rustc-driver.md index eb5390a920..50c7b2731a 100644 --- a/src/doc/rustc-guide/src/rustc-driver.md +++ b/src/doc/rustc-guide/src/rustc-driver.md @@ -54,6 +54,6 @@ thread-locals, although you should rarely need to touch it. [`Compiler`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/interface/struct.Compiler.html [`Session`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/struct.Session.html [`TyCtxt`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.TyCtxt.html -[`SourceMap`]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/source_map/struct.SourceMap.html +[`SourceMap`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/source_map/struct.SourceMap.html [stupid-stats]: https://github.com/nrc/stupid-stats [Appendix A]: appendix/stupid-stats.html diff --git a/src/doc/rustc-guide/src/rustdoc.md b/src/doc/rustc-guide/src/rustdoc.md index 318a8e2e12..fc964b18e3 100644 --- a/src/doc/rustc-guide/src/rustdoc.md +++ b/src/doc/rustc-guide/src/rustdoc.md @@ -84,7 +84,7 @@ is the `impl Clean for visit_ast::RustdocVisitor`, which is called by You see, I actually lied a little earlier: There's another AST transformation that happens before the events in `clean/mod.rs`. In `visit_ast.rs` is the -type `RustdocVisitor`, which *actually* crawls a `hir::Crate` to get the first +type `RustdocVisitor`, which *actually* crawls a `rustc_hir::Crate` to get the first intermediate representation, defined in `doctree.rs`. This pass is mainly to get a few intermediate wrappers around the HIR types and to process visibility and inlining. This is where `#[doc(inline)]`, `#[doc(no_inline)]`, and diff --git a/src/doc/rustc-guide/src/salsa.md b/src/doc/rustc-guide/src/salsa.md index b34647ad1e..68e92b29fd 100644 --- a/src/doc/rustc-guide/src/salsa.md +++ b/src/doc/rustc-guide/src/salsa.md @@ -9,8 +9,8 @@ This chapter is based on the explanation given by Niko Matsakis in this ## What is Salsa? -Salsa is a library for incremental recomputation, this means reusing -computation that has already been done in the past to increase the efficiency +Salsa is a library for incremental recomputation. This means it allows reusing +computations that were already done in the past to increase the efficiency of future computations. The objectives of Salsa are: diff --git a/src/doc/rustc-guide/src/stability.md b/src/doc/rustc-guide/src/stability.md index 1db738cb2f..f48c3d529d 100644 --- a/src/doc/rustc-guide/src/stability.md +++ b/src/doc/rustc-guide/src/stability.md @@ -1,63 +1,96 @@ # Stability attributes -This section is about the stability attributes and schemes that allow stable APIs to use unstable -APIs internally in the rustc standard library. +This section is about the stability attributes and schemes that allow stable +APIs to use unstable APIs internally in the rustc standard library. -For instructions on stabilizing a language feature see -[Stabilizing Features](./stabilization_guide.md). +For instructions on stabilizing a language feature see [Stabilizing +Features](./stabilization_guide.md). ## unstable -The `#[unstable(feature = "foo", issue = "1234", reason = "lorem ipsum")]` attribute explicitly -marks an item as unstable. Items that are marked as "unstable" cannot be used -without a corresponding `#![feature]` attribute on the crate, even on a -nightly compiler. This restriction only applies across crate boundaries, unstable -items may be used within the crate they are defined. +The `#[unstable(feature = "foo", issue = "1234", reason = "lorem ipsum")]` +attribute explicitly marks an item as unstable. Items that are marked as +"unstable" cannot be used without a corresponding `#![feature]` attribute on +the crate, even on a nightly compiler. This restriction only applies across +crate boundaries, unstable items may be used within the crate that defines +them. + +The `issue` field specifies the associated GitHub [issue number]. This field is +required and all unstable features should have an associated tracking issue. In +rare cases where there is no sensible value `issue = "none"` is used. -The `unstable` attribute infects all sub-items, where the attribute doesn't have to be -reapplied. So if you apply this to a module, all items in the module will be unstable. +The `unstable` attribute infects all sub-items, where the attribute doesn't +have to be reapplied. So if you apply this to a module, all items in the module +will be unstable. -You can make specific sub-items stable by using the `#[stable]` attribute on them. -The stability scheme works similarly to how `pub` works. You can have public functions of -nonpublic modules and you can have stable functions in unstable modules or vice versa. +You can make specific sub-items stable by using the `#[stable]` attribute on +them. The stability scheme works similarly to how `pub` works. You can have +public functions of nonpublic modules and you can have stable functions in +unstable modules or vice versa. Note, however, that due to a [rustc bug], stable items inside unstable modules *are* available to stable code in that location! So, for example, stable code -can import `core::intrinsics::transmute` even though `intrinsics` is an unstable -module. Thus, this kind of nesting should be avoided when possible. +can import `core::intrinsics::transmute` even though `intrinsics` is an +unstable module. Thus, this kind of nesting should be avoided when possible. The `unstable` attribute may also have the `soft` value, which makes it a future-incompatible deny-by-default lint instead of a hard error. This is used by the `bench` attribute which was accidentally accepted in the past. This prevents breaking dependencies by leveraging Cargo's lint capping. +[issue number]: https://github.com/rust-lang/rust/issues [rustc bug]: https://github.com/rust-lang/rust/issues/15702 ## stable -The `#[stable(feature = "foo", "since = "1.420.69")]` attribute explicitly marks an item as -stabilized. To do this, follow the instructions in +The `#[stable(feature = "foo", "since = "1.420.69")]` attribute explicitly +marks an item as stabilized. To do this, follow the instructions in [Stabilizing Features](./stabilization_guide.md). Note that stable functions may use unstable things in their body. -## allow_internal_unstable +## rustc_const_unstable + +The `#[rustc_const_unstable(feature = "foo", issue = "1234", reason = "lorem ipsum")]` +has the same interface as the `unstable` attribute. It is used to mark +`const fn` as having their constness be unstable. This allows you to make a +function stable without stabilizing its constness or even just marking an existing +stable function as `const fn` without instantly stabilizing the `const fn`ness. + +Furthermore this attribute is needed to mark an intrinsic as `const fn`, because +there's no way to add `const` to functions in `extern` blocks for now. -Macros, compiler desugarings and `const fn`s expose their bodies to the call site. To -work around not being able to use unstable things in the standard library's macros, there's the -`#[allow_internal_unstable(feature1, feature2)]` attribute that whitelists the given features for -usage in stable macros or `const fn`s. +## rustc_const_stable -Note that `const fn`s are even more special in this regard. You can't just whitelist any feature, -the features need an implementation in `qualify_min_const_fn.rs`. For example the `const_fn_union` -feature gate allows accessing fields of unions inside stable `const fn`s. The rules for when it's -ok to use such a feature gate are that behavior matches the runtime behavior of the same code -(see also [this blog post][blog]). This means that you may not create a -`const fn` that e.g. transmutes a memory address to an integer, because the addresses of things -are nondeterministic and often unknown at compile-time. +The `#[stable(feature = "foo", "since = "1.420.69")]` attribute explicitly marks +a `const fn` as having its constness be `stable`. This attribute can make sense +even on an `unstable` function, if that function is called from another +`rustc_const_stable` function. + +Furthermore this attribute is needed to mark an intrinsic as callable from +`rustc_const_stable` functions. + + +## allow_internal_unstable -Always ping @oli-obk, @RalfJung, and @Centril if you are adding more `allow_internal_unstable` -attributes to any `const fn` +Macros, compiler desugarings and `const fn`s expose their bodies to the call +site. To work around not being able to use unstable things in the standard +library's macros, there's the `#[allow_internal_unstable(feature1, feature2)]` +attribute that whitelists the given features for usage in stable macros or +`const fn`s. + +Note that `const fn`s are even more special in this regard. You can't just +whitelist any feature, the features need an implementation in +`qualify_min_const_fn.rs`. For example the `const_fn_union` feature gate allows +accessing fields of unions inside stable `const fn`s. The rules for when it's +ok to use such a feature gate are that behavior matches the runtime behavior of +the same code (see also [this blog post][blog]). This means that you may not +create a `const fn` that e.g. transmutes a memory address to an integer, +because the addresses of things are nondeterministic and often unknown at +compile-time. + +Always ping @oli-obk, @RalfJung, and @Centril if you are adding more +`allow_internal_unstable` attributes to any `const fn` ## staged_api @@ -83,13 +116,13 @@ item must also have a `stable` or `unstable` attribute. )] ``` -The `suggestion` field is optional. If given, it should be a string that can -be used as a machine-applicable suggestion to correct the warning. This is -typically used when the identifier is renamed, but no other significant -changes are necessary. +The `suggestion` field is optional. If given, it should be a string that can be +used as a machine-applicable suggestion to correct the warning. This is +typically used when the identifier is renamed, but no other significant changes +are necessary. -Another difference from the `deprecated` attribute is that the `since` field -is actually checked against the current version of `rustc`. If `since` is in a +Another difference from the `deprecated` attribute is that the `since` field is +actually checked against the current version of `rustc`. If `since` is in a future version, then the `deprecated_in_future` lint is triggered which is default `allow`, but most of the standard library raises it to a warning with `#![warn(deprecated_in_future)]`. diff --git a/src/doc/rustc-guide/src/stabilization_guide.md b/src/doc/rustc-guide/src/stabilization_guide.md index 302be41d0a..73edc3be5b 100644 --- a/src/doc/rustc-guide/src/stabilization_guide.md +++ b/src/doc/rustc-guide/src/stabilization_guide.md @@ -91,7 +91,7 @@ should appear in the documentation. ### Updating the feature-gate listing There is a central listing of feature-gates in -[`src/libsyntax/feature_gate.rs`]. Search for the `declare_features!` +[`src/librustc_feature`]. Search for the `declare_features!` macro. There should be an entry for the feature you are aiming to stabilize, something like (this example is taken from [rust-lang/rust#32409]: @@ -140,7 +140,8 @@ Most importantly, remove the code which flags an error if the feature-gate is not present (since the feature is now considered stable). If the feature can be detected because it employs some new syntax, then a common place for that code to be is in the -same `feature_gate.rs`. For example, you might see code like this: +same `src/librustc_ast_passes/feature_gate.rs`. +For example, you might see code like this: ```rust,ignore gate_feature_post!(&self, pub_restricted, span, @@ -173,9 +174,9 @@ if self.tcx.sess.features.borrow().pub_restricted && something { /* XXX */ } if something { /* XXX */ } ``` -[rust-lang/rust#32409]:https://github.com/rust-lang/rust/issues/32409 -[`src/libsyntax/feature_gate.rs`]:https://doc.rust-lang.org/nightly/nightly-rustc/syntax/feature_gate/index.html -[The Reference]: https://github.com/rust-lang-nursery/reference +[rust-lang/rust#32409]: https://github.com/rust-lang/rust/issues/32409 +[`src/librustc_feature`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_feature/index.html +[The Reference]: https://github.com/rust-lang/reference [The Book]: https://github.com/rust-lang/book [Rust by Example]: https://github.com/rust-lang/rust-by-example [`Unstable Book`]: https://doc.rust-lang.org/unstable-book/index.html diff --git a/src/doc/rustc-guide/src/the-parser.md b/src/doc/rustc-guide/src/the-parser.md index d089a84181..3584d73e44 100644 --- a/src/doc/rustc-guide/src/the-parser.md +++ b/src/doc/rustc-guide/src/the-parser.md @@ -53,11 +53,11 @@ Code for lexical analysis is split between two crates: [libsyntax]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/index.html [rustc_errors]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/index.html [ast]: https://en.wikipedia.org/wiki/Abstract_syntax_tree -[`SourceMap`]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/source_map/struct.SourceMap.html +[`SourceMap`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/source_map/struct.SourceMap.html [ast module]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/ast/index.html [librustc_parse]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/index.html [parser]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/parser/index.html [`Parser`]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/parse/parser/struct.Parser.html [`StringReader`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.StringReader.html [visit module]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/visit/index.html -[sourcefile]: https://doc.rust-lang.org/nightly/nightly-rustc/syntax/source_map/struct.SourceFile.html +[sourcefile]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.SourceFile.html diff --git a/src/doc/rustc-guide/src/traits/chalk-overview.md b/src/doc/rustc-guide/src/traits/chalk-overview.md index 0f102d4d04..a33cbcc63a 100644 --- a/src/doc/rustc-guide/src/traits/chalk-overview.md +++ b/src/doc/rustc-guide/src/traits/chalk-overview.md @@ -7,8 +7,8 @@ [Chalk][chalk] recasts Rust's trait system explicitly in terms of logic programming by "lowering" Rust code into a kind of logic program we can then -execute queries against. (See [*Lowering to Logic*][lowering-to-logic] and -[*Lowering Rules*][lowering-rules]) Its goal is to be an executable, highly +execute queries against (see [*Lowering to Logic*][lowering-to-logic] and +[*Lowering Rules*][lowering-rules]). Its goal is to be an executable, highly readable specification of the Rust trait system. There are many expected benefits from this work. It will consolidate our diff --git a/src/doc/rustc-guide/src/ty.md b/src/doc/rustc-guide/src/ty.md index 6295a0db1d..b665dadf17 100644 --- a/src/doc/rustc-guide/src/ty.md +++ b/src/doc/rustc-guide/src/ty.md @@ -1,14 +1,226 @@ +--- +tags: rustc, ty +--- + # The `ty` module: representing types -The `ty` module defines how the Rust compiler represents types -internally. It also defines the *typing context* (`tcx` or `TyCtxt`), -which is the central data structure in the compiler. +The `ty` module defines how the Rust compiler represents types internally. It also defines the +*typing context* (`tcx` or `TyCtxt`), which is the central data structure in the compiler. + +## `ty::Ty` + +When we talk about how rustc represents types, we usually refer to a type called `Ty` . There are +quite a few modules and types for `Ty` in the compiler ([Ty documentation][ty]). + +[ty]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/index.html + +The specific `Ty` we are referring to is [`rustc::ty::Ty`][ty_ty] (and not +[`rustc_hir::Ty`][hir_ty]). The distinction is important, so we will discuss it first before going +into the details of `ty::Ty`. + +[ty_ty]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/type.Ty.html +[hir_ty]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.Ty.html + +## `rustc_hir::Ty` vs `ty::Ty` + +The HIR in rustc can be thought of as the high-level intermediate representation. It is more or less +the AST (see [this chapter](hir.md)) as it represents the +syntax that the user wrote, and is obtained after parsing and some *desugaring*. It has a +representation of types, but in reality it reflects more of what the user wrote, that is, what they +wrote so as to represent that type. + +In contrast, `ty::Ty` represents the semantics of a type, that is, the *meaning* of what the user +wrote. For example, `rustc_hir::Ty` would record the fact that a user used the name `u32` twice +in their program, but the `ty::Ty` would record the fact that both usages refer to the same type. + +**Example: `fn foo(x: u32) → u32 { }`** In this function we see that `u32` appears twice. We know +that that is the same type, i.e. the function takes an argument and returns an argument of the same +type, but from the point of view of the HIR there would be two distinct type instances because these +are occurring in two different places in the program. That is, they have two +different [`Span`s][span] (locations). + +[span]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html + +**Example: `fn foo(x: &u32) -> &u32)`** In addition, HIR might have information left out. This type +`&u32` is incomplete, since in the full rust type there is actually a lifetime, but we didn’t need +to write those lifetimes. There are also some elision rules that insert information. The result may +look like `fn foo<'a>(x: &'a u32) -> &'a u32)`. + +In the HIR level, these things are not spelled out and you can say the picture is rather incomplete. +However, at the `ty::Ty` level, these details are added and it is complete. Moreover, we will have +exactly one `ty::Ty` for a given type, like `u32`, and that `ty::Ty` is used for all `u32`s in the +whole program, not a specific usage, unlike `rustc_hir::Ty`. + +Here is a summary: + +| [`rustc_hir::Ty`][hir_ty] | [`ty::Ty`][ty_ty] | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Describe the *syntax* of a type: what the user wrote (with some desugaring). | Describe the *semantics* of a type: the meaning of what the user wrote. | +| Each `rustc_hir::Ty` has its own spans corresponding to the appropriate place in the program. | Doesn’t correspond to a single place in the user’s program. | +| `rustc_hir::Ty` has generics and lifetimes; however, some of those lifetimes are special markers like [`LifetimeName::Implicit`][implicit]. | `ty::Ty` has the full type, including generics and lifetimes, even if the user left them out | +| `fn foo(x: u32) → u32 { }` - Two `rustc_hir::Ty` representing each usage of `u32`. Each has its own `Span`s, etc.- `rustc_hir::Ty` doesn’t tell us that both are the same type | `fn foo(x: u32) → u32 { }` - One `ty::Ty` for all instances of `u32` throughout the program.- `ty::Ty` tells us that both usages of `u32` mean the same type. | +| `fn foo(x: &u32) -> &u32)`- Two `rustc_hir::Ty` again.- Lifetimes for the references show up in the `rustc_hir::Ty`s using a special marker, [`LifetimeName::Implicit`][implicit]. | `fn foo(x: &u32) -> &u32)`- A single `ty::Ty`.- The `ty::Ty` has the hidden lifetime param | + +[implicit]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/enum.LifetimeName.html#variant.Implicit + +**Order** HIR is built directly from the AST, so it happens before any `ty::Ty` is produced. After +HIR is built, some basic type inference and type checking is done. During the type inference, we +figure out what the `ty::Ty` of everything is and we also check if the type of something is +ambiguous. The `ty::Ty` then, is used for type checking while making sure everything has the +expected type. The [`astconv` module][astconv], is where the code responsible for converting a +`rustc_hir::Ty` into a `ty::Ty` is located. This occurs during the type-checking phase, +but also in other parts of the compiler that want to ask questions like "what argument types does +this function expect"?. + +[astconv]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/astconv/index.html + +**How semantics drive the two instances of `Ty`** You can think of HIR as the perspective +of the type information that assumes the least. We assume two things are distinct until they are +proven to be the same thing. In other words, we know less about them, so we should assume less about +them. + +They are syntactically two strings: `"u32"` at line N column 20 and `"u32"` at line N column 35. We +don’t know that they are the same yet. So, in the HIR we treat them as if they are different. Later, +we determine that they semantically are the same type and that’s the `ty::Ty` we use. + +Consider another example: `fn foo(x: T) -> u32` and suppose that someone invokes `foo::(0)`. +This means that `T` and `u32` (in this invocation) actually turns out to be the same type, so we +would eventually end up with the same `ty::Ty` in the end, but we have distinct `rustc_hir::Ty`. +(This is a bit over-simplified, though, since during type checking, we would check the function +generically and would still have a `T` distinct from `u32`. Later, when doing code generation, +we would always be handling "monomorphized" (fully substituted) versions of each function, +and hence we would know what `T` represents (and specifically that it is `u32`). + +Here is one more example: + +```rust +mod a { + type X = u32; + pub fn foo(x: X) -> i32 { 22 } +} +mod b { + type X = i32; + pub fn foo(x: X) -> i32 { x } +} +``` + +Here the type `X` will vary depending on context, clearly. If you look at the `rustc_hir::Ty`, +you will get back that `X` is an alias in both cases (though it will be mapped via name resolution +to distinct aliases). But if you look at the `ty::Ty` signature, it will be either `fn(u32) -> u32` +or `fn(i32) -> i32` (with type aliases fully expanded). + +## `ty::Ty` implementation + +[`rustc::ty::Ty`][ty_ty] is actually a type alias to [`&TyS`][tys] (more about that later). `TyS` +(Type Structure) is where the main functionality is located. You can ignore `TyS` struct in general; +you will basically never access it explicitly. We always pass it by reference using the `Ty` alias. +The only exception is to define inherent methods on types. In particular, `TyS` has a [`kind`][kind] +field of type [`TyKind`][tykind], which represents the key type information. `TyKind` is a big enum +which represents different kinds of types (e.g. primitives, references, abstract data types, +generics, lifetimes, etc). `TyS` also has 2 more fields, `flags` and `outer_exclusive_binder`. They +are convenient hacks for efficiency and summarize information about the type that we may want to +know, but they don’t come into the picture as much here. + +[tys]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.TyS.html +[kind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.TyS.html#structfield.kind +[tykind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html + +Note: `TyKind` is **NOT** the functional programming concept of *Kind*. + +Whenever working with a `Ty` in the compiler, it is common to match on the kind of type: + +```rust,ignore +fn foo(x: Ty<'tcx>) { + match x.kind { + ... + } +} +``` + +The `kind` field is of type `TyKind<'tcx>`, which is an enum defining all of the different kinds of +types in the compiler. + +> N.B. inspecting the `kind` field on types during type inference can be risky, as there may be +> inference variables and other things to consider, or sometimes types are not yet known and will +> become known later. + +There are a lot of related types, and we’ll cover them in time (e.g regions/lifetimes, +“substitutions”, etc). + +## `ty::TyKind` Variants + +There are a bunch of variants on the `TyKind` enum, which you can see by looking at the rustdocs. +Here is a sampling: + +[**Algebraic Data Types (ADTs)**]() An [*algebraic Data Type*][wikiadt] is a `struct`, `enum` or +`union`. Under the hood, `struct`, `enum` and `union` are actually implemented the same way: they +are both [`ty::TyKind::Adt`][kindadt]. It’s basically a user defined type. We will talk more about +these later. + +[**Foreign**][kindforeign] Corresponds to `extern type T`. + +[**Str**][kindstr] Is the type str. When the user writes `&str`, `Str` is the how we represent the +`str` part of that type. + +[**Slice**][kindslice] Corresponds to `[T]`. + +[**Array**][kindarray] Corresponds to `[T; n]`. + +[**RawPtr**][kindrawptr] Corresponds to `*mut T` or `*const T` + +[**Ref**][kindref] `Ref` stands for safe references, `&'a mut T` or `&'a T`. `Ref` has some +associated parts, like `Ty<'tcx>` which is the type that the reference references, `Region<'tcx>` is +the lifetime or region of the reference and `Mutability` if the reference is mutable or not. + +[**Param**][kindparam] Represents a type parameter (e.g. the `T` in `Vec`). + +[**Error**][kinderr] Represents a type error somewhere so that we can print better diagnostics. We +will discuss this more later. + +[**And Many More**...][kindvars] + +[wikiadt]: https://en.wikipedia.org/wiki/Algebraic_data_type +[kindadt]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variant.Adt +[kindforeign]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variant.Foreign +[kindstr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variant.Str +[kindslice]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variant.Slice +[kindarray]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variant.Array +[kindrawptr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variant.RawPtr +[kindref]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variant.Ref +[kindparam]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variant.Param +[kinderr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variant.Error +[kindvars]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.TyKind.html#variants + +## Interning + +We create a LOT of types during compilation. For performance reasons, we allocate them from a global +memory pool, they are each allocated once from a long-lived *arena*. This is called _arena +allocation_. This system reduces allocations/deallocations of memory. It also allows for easy +comparison of types for equality: we implemented [`PartialEq for TyS`][peqimpl], so we can just +compare pointers. The [`CtxtInterners`] type contains a bunch of maps of interned types and the +arena itself. + +[peqimpl]: https://github.com/rust-lang/rust/blob/3ee936378662bd2e74be951d6a7011a95a6bd84d/src/librustc/ty/mod.rs#L528-L534 +[`CtxtInterners`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.CtxtInterners.html#structfield.arena + +Each time we want to construct a type, the compiler doesn’t naively allocate from the buffer. +Instead, we check if that type was already constructed. If it was, we just get the same pointer we +had before, otherwise we make a fresh pointer. With this schema if we want to know if two types are +the same, all we need to do is compare the pointers which is efficient. `TyS` which represents types +is carefully setup so you never construct them on the stack. You always allocate them from this +arena and you always intern them so they are unique. + +At the beginning of the compilation we make a buffer and each time we need to allocate a type we use +some of this memory buffer. If we run out of space we get another one. The lifetime of that buffer +is `'tcx`. Our types are tied to that lifetime, so when compilation finishes all the memory related +to that buffer is freed and our `'tcx` references would be invalid. + ## The tcx and how it uses lifetimes -The `tcx` ("typing context") is the central data structure in the -compiler. It is the context that you use to perform all manner of -queries. The struct `TyCtxt` defines a reference to this shared context: +The `tcx` ("typing context") is the central data structure in the compiler. It is the context that +you use to perform all manner of queries. The struct `TyCtxt` defines a reference to this shared +context: ```rust,ignore tcx: TyCtxt<'tcx> @@ -17,110 +229,408 @@ tcx: TyCtxt<'tcx> // arena lifetime ``` -As you can see, the `TyCtxt` type takes a lifetime parameter. -During Rust compilation, we allocate most of our memory in -**arenas**, which are basically pools of memory that get freed all at -once. When you see a reference with a lifetime like `'tcx`, -you know that it refers to arena-allocated data (or data that lives as -long as the arenas, anyhow). +As you can see, the `TyCtxt` type takes a lifetime parameter. When you see a reference with a +lifetime like `'tcx`, you know that it refers to arena-allocated data (or data that lives as long as +the arenas, anyhow). -### Allocating and working with types +## Allocating and working with types -Rust types are represented using the `Ty<'tcx>` defined in the `ty` -module (not to be confused with the `Ty` struct from [the HIR]). This -is in fact a simple type alias for a reference with `'tcx` lifetime: +To allocate a new type, you can use the various `mk_` methods defined on the `tcx`. These have names +that correspond mostly to the various kinds of types. For example: ```rust,ignore -pub type Ty<'tcx> = &'tcx TyS<'tcx>; +let array_ty = tcx.mk_array(elem_ty, len * 2); ``` -[the HIR]: ./hir.html +These methods all return a `Ty<'tcx>` – note that the lifetime you get back is the lifetime of the +arena that this `tcx` has access to. Types are always canonicalized and interned (so we never +allocate exactly the same type twice). + +> NB. Because types are interned, it is possible to compare them for equality efficiently using `==` +> – however, this is almost never what you want to do unless you happen to be hashing and looking +> for duplicates. This is because often in Rust there are multiple ways to represent the same type, +> particularly once inference is involved. If you are going to be testing for type equality, you +> probably need to start looking into the inference code to do it right. + +You can also find various common types in the `tcx` itself by accessing `tcx.types.bool`, +`tcx.types.char`, etc (see [`CommonTypes`] for more). + +[`CommonTypes`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/context/struct.CommonTypes.html -You can basically ignore the `TyS` struct – you will basically never -access it explicitly. We always pass it by reference using the -`Ty<'tcx>` alias – the only exception I think is to define inherent -methods on types. Instances of `TyS` are only ever allocated in one of -the rustc arenas (never e.g. on the stack). +## Beyond types: other kinds of arena-allocated data structures -One common operation on types is to **match** and see what kinds of -types they are. This is done by doing `match ty.sty`, sort of like this: +In addition to types, there are a number of other arena-allocated data structures that you can +allocate, and which are found in this module. Here are a few examples: + +- [`Substs`][subst], allocated with `mk_substs` – this will intern a slice of types, often used to + specify the values to be substituted for generics (e.g. `HashMap` would be represented + as a slice `&'tcx [tcx.types.i32, tcx.types.u32]`). +- [`TraitRef`], typically passed by value – a **trait reference** consists of a reference to a trait + along with its various type parameters (including `Self`), like `i32: Display` (here, the def-id + would reference the `Display` trait, and the substs would contain `i32`). Note that `def-id` is + defined and discussed in depth in the `AdtDef and DefId` section. +- [`Predicate`] defines something the trait system has to prove (see `traits` module). + +[subst]: ./generic_arguments.html#subst +[`TraitRef`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.TraitRef.html +[`Predicate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/enum.Predicate.html + +## Import conventions + +Although there is no hard and fast rule, the `ty` module tends to be used like so: ```rust,ignore -fn test_type<'tcx>(ty: Ty<'tcx>) { - match ty.sty { - ty::TyArray(elem_ty, len) => { ... } - ... - } +use ty::{self, Ty, TyCtxt}; +``` + +In particular, since they are so common, the `Ty` and `TyCtxt` types are imported directly. Other +types are often referenced with an explicit `ty::` prefix (e.g. `ty::TraitRef<'tcx>`). But some +modules choose to import a larger or smaller set of names explicitly. + +## ADTs Representation + +Let's consider the example of a type like `MyStruct`, where `MyStruct` is defined like so: + +```rust,ignore +struct MyStruct { x: u32, y: T } +``` + +The type `MyStruct` would be an instance of `TyKind::Adt`: + +```rust,ignore +Adt(&'tcx AdtDef, SubstsRef<'tcx>) +// ------------ --------------- +// (1) (2) +// +// (1) represents the `MyStruct` part +// (2) represents the ``, or "substitutions" / generic arguments +``` + +There are two parts: + +- The [`AdtDef`][adtdef] references the struct/enum/union but without the values for its type + parameters. In our example, this is the `MyStruct` part *without* the argument `u32`. + - Note that in the HIR, structs, enums and unions are represented differently, but in `ty::Ty`, + they are all represented using `TyKind::Adt`. +- The [`SubstsRef`][substsref] is an interned list of values that are to be substituted for the + generic parameters. In our example of `MyStruct`, we would end up with a list like `[u32]`. + We’ll dig more into generics and substitutions in a little bit. + +[adtdef]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.AdtDef.html +[substsref]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/subst/type.SubstsRef.html + +**`AdtDef` and `DefId`** + +For every type defined in the source code, there is a unique `DefId` (see [this +chapter](hir.md#identifiers-in-the-hir)). This includes ADTs and generics. In the `MyStruct` +definition we gave above, there are two `DefId`s: one for `MyStruct` and one for `T`. Notice that +the code above does not generate a new `DefId` for `u32` because it is not defined in that code (it +is only referenced). + +`AdtDef` is more or less a wrapper around `DefId` with lots of useful helper methods. There is +essentially a one-to-one relationship between `AdtDef` and `DefId`. You can get the `AdtDef` for a +`DefId` with the [`tcx.adt_def(def_id)` query][adtdefq]. The `AdtDef`s are all interned (as you can +see `'tcx` lifetime on it). + +[adtdefq]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.TyCtxt.html#method.adt_def + + +### Generics and substitutions + +Given a generic type `MyType`, we may want to swap out the generics `A, B, …` for some +other types (possibly other generics or concrete types). We do this a lot while doing type +inference, type checking, and trait solving. Conceptually, during these routines, we may find out +that one type is equal to another type and want to swap one out for the other and then swap that out +for another type and so on until we eventually get some concrete types (or an error). + +In rustc this is done using the `SubstsRef` that we mentioned above (“substs” = “substitutions”). +Conceptually, you can think of `SubstsRef` of a list of types that are to be substituted for the +generic type parameters of the ADT. + +`SubstsRef` is a type alias of `List>` (see [`List` rustdocs][list]). +[`GenericArg`] is essentially a space-efficient wrapper around [`GenericArgKind`], which is an enum +indicating what kind of generic the type parameter is (type, lifetime, or const). Thus, `SubstsRef` +is conceptually like a `&'tcx [GenericArgKind<'tcx>]` slice (but it is actually a `List`). + +[list]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.List.html +[`GenericArg`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/subst/struct.GenericArg.html +[`GenericArgKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/subst/enum.GenericArgKind.html + +So why do we use this `List` type instead of making it really a slice? It has the length "inline", +so `&List` is only 32 bits. As a consequence, it cannot be "subsliced" (that only works if the +length is out of line). + +This also implies that you can check two `List`s for equality via `==` (which would be not be +possible for ordinary slices). This is precisely because they never represent a "sub-list", only the +complete `List`, which has been hashed and interned. + +So pulling it all together, let’s go back to our example above: + +```rust,ignore +struct MyStruct +``` + +- There would be an `AdtDef` (and corresponding `DefId`) for `MyStruct`. +- There would be a `TyKind::Param` (and corresponding `DefId`) for `T` (more later). +- There would be a `SubstsRef` containing the list `[GenericArgKind::Type(Ty(T))]` + - The `Ty(T)` here is my shorthand for entire other `ty::Ty` that has `TyKind::Param`, which we + mentioned in the previous point. +- This is one `TyKind::Adt` containing the `AdtDef` of `MyStruct` with the `SubstsRef` above. + +Finally, we will quickly mention the +[`Generics`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/struct.Generics.html) type. It +is used to give information about the type parameters of a type. + +### Unsubstituted Generics + +So above, recall that in our example the `MyStruct` struct had a generic type `T`. When we are (for +example) type checking functions that use `MyStruct`, we will need to be able to refer to this type +`T` without actually knowing what it is. In general, this is true inside all generic definitions: we +need to be able to work with unknown types. This is done via `TyKind::Param` (which we mentioned in +the example above). + +Each `TyKind::Param` contains two things: the name and the index. In general, the index fully +defines the parameter and is used by most of the code. The name is included for debug print-outs. +There are two reasons for this. First, the index is convenient, it allows you to include into the +list of generic arguments when substituting. Second, the index is more robust. For example, you +could in principle have two distinct type parameters that use the same name, e.g. `impl Foo { +fn bar() { .. } }`, although the rules against shadowing make this difficult (but those language +rules could change in the future). + +The index of the type parameter is an integer indicating its order in the list of the type +parameters. Moreover, we consider the list to include all of the type parameters from outer scopes. +Consider the following example: + +```rust,ignore +struct Foo { + // A would have index 0 + // B would have index 1 + + .. // some fields +} +impl Foo { + fn method() { + // inside here, X, Y and Z are all in scope + // X has index 0 + // Y has index 1 + // Z has index 2 + } +} +``` + +When we are working inside the generic definition, we will use `TyKind::Param` just like any other +`TyKind`; it is just a type after all. However, if we want to use the generic type somewhere, then +we will need to do substitutions. + +For example suppose that the `Foo` type from the previous example has a field that is a +`Vec`. Observe that `Vec` is also a generic type. We want to tell the compiler that the type +parameter of `Vec` should be replaced with the `A` type parameter of `Foo`. We do that with +substitutions: + +```rust,ignore +struct Foo { // Adt(Foo, &[Param(0), Param(1)]) + x: Vec, // Adt(Vec, &[Param(0)]) + .. +} + +fn bar(foo: Foo) { // Adt(Foo, &[u32, f32]) + let y = foo.x; // Vec => Vec } ``` -The `sty` field (the origin of this name is unclear to me; perhaps -structural type?) is of type `TyKind<'tcx>`, which is an enum -defining all of the different kinds of types in the compiler. +This example has a few different substitutions: + +- In the definition of `Foo`, in the type of the field `x`, we replace `Vec`'s type parameter with + `Param(0)`, the first parameter of `Foo`, so that the type of `x` is `Vec`. +- In the function `bar`, we specify that we want a `Foo`. This means that we will + substitute `Param(0)` and `Param(1)` with `u32` and `f32`. +- In the body of `bar`, we access `foo.x`, which has type `Vec`, but `Param(0)` has been + substituted for `u32`, so `foo.x` has type `Vec`. + +Let’s look a bit more closely at that last substitution to see why we use indexes. If we want to +find the type of `foo.x`, we can get generic type of `x`, which is `Vec`. Now we can take +the index `0` and use it to find the right type substitution: looking at `Foo`'s `SubstsRef`, we +have the list `[u32, f32]` , since we want to replace index `0`, we take the 0-th index of this +list, which is `u32`. Voila! + +You may have a couple of followup questions… + + **`type_of`** How do we get the “generic type of `x`"? You can get the type of pretty much anything + with the `tcx.type_of(def_id)` query. In this case, we would pass the `DefId` of the field `x`. + The `type_of` query always returns the definition with the generics that are in scope of the + definition. For example, `tcx.type_of(def_id_of_my_struct)` would return the “self-view” of + `MyStruct`: `Adt(Foo, &[Param(0), Param(1)])`. + +**`subst`** How do we actually do the substitutions? There is a function for that too! You use +[`subst`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/subst/trait.Subst.html) to +replace a `SubstRef` with another list of types. + +[Here is an example of actually using `subst` in the compiler][substex]. The exact details are not +too important, but in this piece of code, we happen to be converting from the `rustc_hir::Ty` to +a real `ty::Ty`. You can see that we first get some substitutions (`substs`). Then we call +`type_of` to get a type and call `ty.subst(substs)` to get a new version of `ty` with +the substitutions made. -> N.B. inspecting the `sty` field on types during type inference can be -> risky, as there may be inference variables and other things to -> consider, or sometimes types are not yet known and will become -> known later. +[substex]: https://github.com/rust-lang/rust/blob/597f432489f12a3f33419daa039ccef11a12c4fd/src/librustc_typeck/astconv.rs#L942-L953 -To allocate a new type, you can use the various `mk_` methods defined -on the `tcx`. These have names that correspond mostly to the various kinds -of type variants. For example: +**Note on indices:** It is possible for the indices in `Param` to not match with what we expect. For +example, the index could be out of bounds or it could be the index of a lifetime when we were +expecting a type. These sorts of errors would be caught earlier in the compiler when translating +from a `rustc_hir::Ty` to a `ty::Ty`. If they occur later, that is a compiler bug. + +### `TypeFoldable` and `TypeFolder` + +How is this `subst` query actually implemented? As you can imagine, we might want to do +substitutions on a lot of different things. For example, we might want to do a substitution directly +on a type like we did with `Vec` above. But we might also have a more complex type with other types +nested inside that also need substitutions. + +The answer is a couple of traits: +[`TypeFoldable`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/fold/trait.TypeFoldable.html) +and +[`TypeFolder`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/fold/trait.TypeFolder.html). + +- `TypeFoldable` is implemented by types that embed type information. It allows you to recursively + process the contents of the `TypeFoldable` and do stuff to them. +- `TypeFolder` defines what you want to do with the types you encounter while processing the + `TypeFoldable`. + +For example, the `TypeFolder` trait has a method +[`fold_ty`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/fold/trait.TypeFolder.html#method.fold_ty) +that takes a type as input a type and returns a new type as a result. `TypeFoldable` invokes the +`TypeFolder` `fold_foo` methods on itself, giving the `TypeFolder` access to its contents (the +types, regions, etc that are contained within). + +You can think of it with this analogy to the iterator combinators we have come to love in rust: ```rust,ignore -let array_ty = tcx.mk_array(elem_ty, len * 2); +vec.iter().map(|e1| foo(e2)).collect() +// ^^^^^^^^^^^^ analogous to `TypeFolder` +// ^^^ analogous to `Typefoldable` ``` -These methods all return a `Ty<'tcx>` – note that the lifetime you -get back is the lifetime of the innermost arena that this `tcx` has -access to. In fact, types are always canonicalized and interned (so we -never allocate exactly the same type twice) and are always allocated -in the outermost arena where they can be (so, if they do not contain -any inference variables or other "temporary" types, they will be -allocated in the global arena). However, the lifetime `'tcx` is always -a safe approximation, so that is what you get back. - -> NB. Because types are interned, it is possible to compare them for -> equality efficiently using `==` – however, this is almost never what -> you want to do unless you happen to be hashing and looking for -> duplicates. This is because often in Rust there are multiple ways to -> represent the same type, particularly once inference is involved. If -> you are going to be testing for type equality, you probably need to -> start looking into the inference code to do it right. - -You can also find various common types in the `tcx` itself by accessing -`tcx.types.bool`, `tcx.types.char`, etc (see `CommonTypes` for more). - -### Beyond types: other kinds of arena-allocated data structures - -In addition to types, there are a number of other arena-allocated data -structures that you can allocate, and which are found in this -module. Here are a few examples: - -- [`Substs`][subst], allocated with `mk_substs` – this will intern a slice of - types, often used to specify the values to be substituted for generics - (e.g. `HashMap` would be represented as a slice - `&'tcx [tcx.types.i32, tcx.types.u32]`). -- `TraitRef`, typically passed by value – a **trait reference** - consists of a reference to a trait along with its various type - parameters (including `Self`), like `i32: Display` (here, the def-id - would reference the `Display` trait, and the substs would contain - `i32`). -- `Predicate` defines something the trait system has to prove (see `traits` - module). +So to reiterate: -[subst]: ./generic_arguments.html#subst +- `TypeFolder` is a trait that defines a “map” operation. +- `TypeFoldable` is a trait that is implemented by things that embed types. -### Import conventions +In the case of `subst`, we can see that it is implemented as a `TypeFolder`: +[`SubstFolder`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/subst/struct.SubstFolder.html). +Looking at its implementation, we see where the actual substitutions are happening. -Although there is no hard and fast rule, the `ty` module tends to be used like -so: +However, you might also notice that the implementation calls this `super_fold_with` method. What is +that? It is a method of `TypeFoldable`. Consider the following `TypeFoldable` type `MyFoldable`: ```rust,ignore -use ty::{self, Ty, TyCtxt}; +struct MyFoldable<'tcx> { + def_id: DefId, + ty: Ty<'tcx>, +} +``` + +The `TypeFolder` can call `super_fold_with` on `MyFoldable` if it just wants to replace some of the +fields of `MyFoldable` with new values. If it instead wants to replace the whole `MyFoldable` with a +different one, it would call `fold_with` instead (a different method on `TypeFoldable`). + +In almost all cases, we don’t want to replace the whole struct; we only want to replace `ty::Ty`s in +the struct, so usually we call `super_fold_with`. A typical implementation that `MyFoldable` could +have might do something like this: + +```rust,ignore +my_foldable: MyFoldable<'tcx> +my_foldable.subst(..., subst) + +impl TypeFoldable for MyFoldable { + fn super_fold_with(&self, folder: &mut impl TypeFolder<'tcx>) -> MyFoldable { + MyFoldable { + def_id: self.def_id.fold_with(folder), + ty: self.ty.fold_with(folder), + } + } + + fn super_visit_with(..) { } +} +``` + +Notice that here, we implement `super_fold_with` to go over the fields of `MyFoldable` and call +`fold_with` on *them*. That is, a folder may replace `def_id` and `ty`, but not the whole +`MyFoldable` struct. + +Here is another example to put things together: suppose we have a type like `Vec>`. The +`ty::Ty` would look like: `Adt(Vec, &[Adt(Vec, &[Param(X)])])`. If we want to do `subst(X => u32)`, +then we would first look at the overall type. We would see that there are no substitutions to be +made at the outer level, so we would descend one level and look at `Adt(Vec, &[Param(X)])`. There +are still no substitutions to be made here, so we would descend again. Now we are looking at +`Param(X)`, which can be substituted, so we replace it with `u32`. We can’t descend any more, so we +are done, and the overall result is `Adt(Vec, &[Adt(Vec, &[u32])])`. + +One last thing to mention: often when folding over a `TypeFoldable`, we don’t want to change most +things. We only want to do something when we reach a type. That means there may be a lot of +`TypeFoldable` types whose implementations basically just forward to their fields’ `TypeFoldable` +implementations. Such implementations of `TypeFoldable` tend to be pretty tedious to write by hand. +For this reason, there is a `derive` macro that allows you to `#![derive(TypeFoldable)]`. It is +defined +[here](https://github.com/rust-lang/rust/blob/master/src/librustc_macros/src/type_foldable.rs). + +**`subst`** In the case of substitutions the [actual +folder](https://github.com/rust-lang/rust/blob/04e69e4f4234beb4f12cc76dcc53e2cc4247a9be/src/librustc/ty/subst.rs#L467-L482) +is going to be doing the indexing we’ve already mentioned. There we define a `Folder` and call +`fold_with` on the `TypeFoldable` to process yourself. Then +[fold_ty](https://github.com/rust-lang/rust/blob/04e69e4f4234beb4f12cc76dcc53e2cc4247a9be/src/librustc/ty/subst.rs#L545-L573) +the method that process each type it looks for a `ty::Param` and for those it replaces it for +something from the list of substitutions, otherwise recursively process the type. To replace it, +calls +[ty_for_param](https://github.com/rust-lang/rust/blob/04e69e4f4234beb4f12cc76dcc53e2cc4247a9be/src/librustc/ty/subst.rs#L589-L624) +and all that does is index into the list of substitutions with the index of the `Param`. + +## Type errors + +There is a `TyKind::Error` that is produced when the user makes a type error. The idea is that +we would propagate this type and suppress other errors that come up due to it so as not to overwhelm +the user with cascading compiler error messages. + +There is an **important invariant** for `TyKind::Error`. You should **never** return the 'error +type' unless you **know** that an error has already been reported to the user. This is usually +because (a) you just reported it right there or (b) you are propagating an existing Error type (in +which case the error should've been reported when that error type was produced). + +It's important to maintain this invariant because the whole point of the `Error` type is to suppress +other errors -- i.e., we don't report them. If we were to produce an `Error` type without actually +emitting an error to the user, then this could cause later errors to be suppressed, and the +compilation might inadvertently succeed! + +Sometimes there is a third case. You believe that an error has been reported, but you believe it +would've been reported earlier in the compilation, not locally. In that case, you can invoke +[`delay_span_bug`] This will make a note that you expect compilation to yield an error -- if however +compilation should succeed, then it will trigger a compiler bug report. + +[`delay_span_bug`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/struct.Session.html#method.delay_span_bug + +## Question: Why not substitute “inside” the `AdtDef`? + +Recall that we represent a generic struct with `(AdtDef, substs)`. So why bother with this scheme? + +Well, the alternate way we could have choosen to represent types would be to always create a new, +fully-substituted form of the `AdtDef` where all the types are already substituted. This seems like +less of a hassle. However, the `(AdtDef, substs)` scheme has some advantages over this. + +First, `(AdtDef, substs)` scheme has an efficiency win: + +```rust,ignore +struct MyStruct { + ... 100s of fields ... +} + +// Want to do: MyStruct ==> MyStruct ``` -In particular, since they are so common, the `Ty` and `TyCtxt` types -are imported directly. Other types are often referenced with an -explicit `ty::` prefix (e.g. `ty::TraitRef<'tcx>`). But some modules -choose to import a larger or smaller set of names explicitly. +in an example like this, we can subst from `MyStruct` to `MyStruct` (and so on) very cheaply, +by just replacing the one reference to `A` with `B`. But if we eagerly substituted all the fields, +that could be a lot more work because we might have to go through all of the fields in the `AdtDef` +and update all of their types. + +A bit more deeply, this corresponds to structs in Rust being [*nominal* types][nominal] — which +means that they are defined by their *name* (and that their contents are then indexed from the +definition of that name, and not carried along “within” the type itself). + +[nominal]: https://en.wikipedia.org/wiki/Nominal_type_system diff --git a/src/doc/unstable-book/src/compiler-flags/sanitizer.md b/src/doc/unstable-book/src/compiler-flags/sanitizer.md new file mode 100644 index 0000000000..cbb90bd3bb --- /dev/null +++ b/src/doc/unstable-book/src/compiler-flags/sanitizer.md @@ -0,0 +1,163 @@ +# `sanitizer` + +The tracking issue for this feature is: [#39699](https://github.com/rust-lang/rust/issues/39699). + +------------------------ + +This feature allows for use of one of following sanitizers: + +* [AddressSanitizer][clang-asan] a faster memory error detector. Can + detect out-of-bounds access to heap, stack, and globals, use after free, use + after return, double free, invalid free, memory leaks. +* [LeakSanitizer][clang-lsan] a run-time memory leak detector. +* [MemorySanitizer][clang-msan] a detector of uninitialized reads. +* [ThreadSanitizer][clang-tsan] a fast data race detector. + +To enable a sanitizer compile with `-Zsanitizer=...` option, where value is one +of `address`, `leak`, `memory` or `thread`. + +# Examples + +This sections show various issues that can be detected with sanitizers. For +simplicity, the examples are prepared under assumption that optimization level +used is zero. + +## AddressSanitizer + +Stack buffer overflow: + +```shell +$ cat a.rs +fn main() { + let xs = [0, 1, 2, 3]; + let _y = unsafe { *xs.as_ptr().offset(4) }; +} +$ rustc -Zsanitizer=address a.rs +$ ./a +================================================================= +==10029==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffcc15f43d0 at pc 0x55f77dc015c5 bp 0x7ffcc15f4390 sp 0x7ffcc15f4388 +READ of size 4 at 0x7ffcc15f43d0 thread T0 + #0 0x55f77dc015c4 in a::main::hab3bd2a745c2d0ac (/tmp/a+0xa5c4) + #1 0x55f77dc01cdb in std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::haa8c76d1faa7b7ca (/tmp/a+0xacdb) + #2 0x55f77dc90f02 in std::rt::lang_start_internal::_$u7b$$u7b$closure$u7d$$u7d$::hfeb9a1aef9ac820d /rustc/c27f7568bc74c418996892028a629eed5a7f5f00/src/libstd/rt.rs:48:12 + #3 0x55f77dc90f02 in std::panicking::try::do_call::h12f0919717b8e0a6 /rustc/c27f7568bc74c418996892028a629eed5a7f5f00/src/libstd/panicking.rs:288:39 + #4 0x55f77dc926c9 in __rust_maybe_catch_panic /rustc/c27f7568bc74c418996892028a629eed5a7f5f00/src/libpanic_unwind/lib.rs:80:7 + #5 0x55f77dc9197c in std::panicking::try::h413b21cdcd6cfd86 /rustc/c27f7568bc74c418996892028a629eed5a7f5f00/src/libstd/panicking.rs:267:12 + #6 0x55f77dc9197c in std::panic::catch_unwind::hc5cc8ef2fd73424d /rustc/c27f7568bc74c418996892028a629eed5a7f5f00/src/libstd/panic.rs:396:8 + #7 0x55f77dc9197c in std::rt::lang_start_internal::h2039f418ab92218f /rustc/c27f7568bc74c418996892028a629eed5a7f5f00/src/libstd/rt.rs:47:24 + #8 0x55f77dc01c61 in std::rt::lang_start::ha905d28f6b61d691 (/tmp/a+0xac61) + #9 0x55f77dc0163a in main (/tmp/a+0xa63a) + #10 0x7f9b3cf5bbba in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x26bba) + #11 0x55f77dc01289 in _start (/tmp/a+0xa289) + +Address 0x7ffcc15f43d0 is located in stack of thread T0 at offset 48 in frame + #0 0x55f77dc0135f in a::main::hab3bd2a745c2d0ac (/tmp/a+0xa35f) + + This frame has 1 object(s): + [32, 48) 'xs' <== Memory access at offset 48 overflows this variable +HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork + (longjmp and C++ exceptions *are* supported) +SUMMARY: AddressSanitizer: stack-buffer-overflow (/tmp/a+0xa5c4) in a::main::hab3bd2a745c2d0ac +Shadow bytes around the buggy address: + 0x1000182b6820: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0x1000182b6830: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0x1000182b6840: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0x1000182b6850: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0x1000182b6860: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +=>0x1000182b6870: 00 00 00 00 f1 f1 f1 f1 00 00[f3]f3 00 00 00 00 + 0x1000182b6880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0x1000182b6890: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0x1000182b68a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0x1000182b68b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0x1000182b68c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Shadow byte legend (one shadow byte represents 8 application bytes): + Addressable: 00 + Partially addressable: 01 02 03 04 05 06 07 + Heap left redzone: fa + Freed heap region: fd + Stack left redzone: f1 + Stack mid redzone: f2 + Stack right redzone: f3 + Stack after return: f5 + Stack use after scope: f8 + Global redzone: f9 + Global init order: f6 + Poisoned by user: f7 + Container overflow: fc + Array cookie: ac + Intra object redzone: bb + ASan internal: fe + Left alloca redzone: ca + Right alloca redzone: cb + Shadow gap: cc +==10029==ABORTING +``` + +## MemorySanitizer + +Use of uninitialized memory. Note that we are using `-Zbuild-std` to instrument +standard library, and passing `-msan-track-origins=2` to the LLVM to track +origins of uninitialized memory: + +```shell +$ cat src/main.rs +use std::mem::MaybeUninit; + +fn main() { + unsafe { + let a = MaybeUninit::<[usize; 4]>::uninit(); + let a = a.assume_init(); + println!("{}", a[2]); + } +} + +$ env RUSTFLAGS="-Zsanitizer=memory -Cllvm-args=-msan-track-origins=2" cargo -Zbuild-std run --target x86_64-unknown-linux-gnu +==9416==WARNING: MemorySanitizer: use-of-uninitialized-value + #0 0x560c04f7488a in core::fmt::num::imp::fmt_u64::haa293b0b098501ca $RUST/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/src/rust/src/libcore/fmt/num.rs:202:16 +... + Uninitialized value was stored to memory at + #0 0x560c04ae898a in __msan_memcpy.part.0 $RUST/src/llvm-project/compiler-rt/lib/msan/msan_interceptors.cc:1558:3 + #1 0x560c04b2bf88 in memory::main::hd2333c1899d997f5 $CWD/src/main.rs:6:16 + + Uninitialized value was created by an allocation of 'a' in the stack frame of function '_ZN6memory4main17hd2333c1899d997f5E' + #0 0x560c04b2bc50 in memory::main::hd2333c1899d997f5 $CWD/src/main.rs:3 +``` + + +# Instrumentation of external dependencies and std + +The sanitizers to varying degrees work correctly with partially instrumented +code. On the one extreme is LeakSanitizer that doesn't use any compile time +instrumentation, on the other is MemorySanitizer that requires that all program +code to be instrumented (failing to achieve that will inevitably result in +false positives). + +It is strongly recommended to combine sanitizers with recompiled and +instrumented standard library, for example using [cargo `-Zbuild-std` +functionality][build-std]. + +[build-std]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#build-std + +# Build scripts and procedural macros + +Use of sanitizers together with build scripts and procedural macros is +technically possible, but in almost all cases it would be best avoided. This +is especially true for procedural macros which would require an instrumented +version of rustc. + +In more practical terms when using cargo always remember to pass `--target` +flag, so that rustflags will not be applied to build scripts and procedural +macros. + +# Additional Information + +* [Sanitizers project page](https://github.com/google/sanitizers/wiki/) +* [AddressSanitizer in Clang][clang-asan] +* [LeakSanitizer in Clang][clang-lsan] +* [MemorySanitizer in Clang][clang-msan] +* [ThreadSanitizer in Clang][clang-tsan] + +[clang-asan]: https://clang.llvm.org/docs/AddressSanitizer.html +[clang-lsan]: https://clang.llvm.org/docs/LeakSanitizer.html +[clang-msan]: https://clang.llvm.org/docs/MemorySanitizer.html +[clang-tsan]: https://clang.llvm.org/docs/ThreadSanitizer.html diff --git a/src/doc/unstable-book/src/language-features/infer-static-outlives-requirements.md b/src/doc/unstable-book/src/language-features/infer-static-outlives-requirements.md index 6187f395b0..53e01091f7 100644 --- a/src/doc/unstable-book/src/language-features/infer-static-outlives-requirements.md +++ b/src/doc/unstable-book/src/language-features/infer-static-outlives-requirements.md @@ -1,8 +1,8 @@ # `infer_static_outlives_requirements` -The tracking issue for this feature is: [#44493] +The tracking issue for this feature is: [#54185] -[#44493]: https://github.com/rust-lang/rust/issues/44493 +[#54185]: https://github.com/rust-lang/rust/issues/54185 ------------------------ The `infer_static_outlives_requirements` feature indicates that certain diff --git a/src/doc/unstable-book/src/language-features/lang-items.md b/src/doc/unstable-book/src/language-features/lang-items.md index d4ad65e84b..6f096e582f 100644 --- a/src/doc/unstable-book/src/language-features/lang-items.md +++ b/src/doc/unstable-book/src/language-features/lang-items.md @@ -188,11 +188,7 @@ pub extern fn rust_begin_panic(info: &PanicInfo) -> ! { In many cases, you may need to manually link to the `compiler_builtins` crate when building a `no_std` binary. You may observe this via linker error messages -such as "```undefined reference to `__rust_probestack'```". Using this crate -also requires enabling the library feature `compiler_builtins_lib`. You can read -more about this [here][compiler-builtins-lib]. - -[compiler-builtins-lib]: ../library-features/compiler-builtins-lib.md +such as "```undefined reference to `__rust_probestack'```". ## More about the language items diff --git a/src/doc/unstable-book/src/language-features/member-constraints.md b/src/doc/unstable-book/src/language-features/member-constraints.md index 0d11c31aca..3ba4a3e6b1 100644 --- a/src/doc/unstable-book/src/language-features/member-constraints.md +++ b/src/doc/unstable-book/src/language-features/member-constraints.md @@ -1,8 +1,8 @@ # `member_constraints` -The tracking issue for this feature is: [#61977] +The tracking issue for this feature is: [#61997] -[#61977]: https://github.com/rust-lang/rust/issues/61977 +[#61997]: https://github.com/rust-lang/rust/issues/61997 ------------------------ diff --git a/src/doc/unstable-book/src/language-features/repr128.md b/src/doc/unstable-book/src/language-features/repr128.md index 0858988952..146f50ee67 100644 --- a/src/doc/unstable-book/src/language-features/repr128.md +++ b/src/doc/unstable-book/src/language-features/repr128.md @@ -1,8 +1,8 @@ # `repr128` -The tracking issue for this feature is: [#35118] +The tracking issue for this feature is: [#56071] -[#35118]: https://github.com/rust-lang/rust/issues/35118 +[#56071]: https://github.com/rust-lang/rust/issues/56071 ------------------------ diff --git a/src/doc/unstable-book/src/language-features/slice-patterns.md b/src/doc/unstable-book/src/language-features/slice-patterns.md deleted file mode 100644 index cdb7449588..0000000000 --- a/src/doc/unstable-book/src/language-features/slice-patterns.md +++ /dev/null @@ -1,32 +0,0 @@ -# `slice_patterns` - -The tracking issue for this feature is: [#62254] - -[#62254]: https://github.com/rust-lang/rust/issues/62254 - ------------------------- - -The `slice_patterns` feature gate lets you use `..` to indicate any number of -elements inside a pattern matching a slice. This wildcard can only be used once -for a given array. If there's an pattern before the `..`, the subslice will be -matched against that pattern. For example: - -```rust -#![feature(slice_patterns)] - -fn is_symmetric(list: &[u32]) -> bool { - match list { - &[] | &[_] => true, - &[x, ref inside @ .., y] if x == y => is_symmetric(inside), - &[..] => false, - } -} - -fn main() { - let sym = &[0, 1, 4, 2, 4, 1, 0]; - assert!(is_symmetric(sym)); - - let not_sym = &[0, 1, 7, 2, 4, 1, 0]; - assert!(!is_symmetric(not_sym)); -} -``` diff --git a/src/doc/unstable-book/src/language-features/transparent-enums.md b/src/doc/unstable-book/src/language-features/transparent-enums.md deleted file mode 100644 index 862411ab39..0000000000 --- a/src/doc/unstable-book/src/language-features/transparent-enums.md +++ /dev/null @@ -1,93 +0,0 @@ -# `transparent_enums` - -The tracking issue for this feature is [#60405] - -[60405]: https://github.com/rust-lang/rust/issues/60405 - ----- - -The `transparent_enums` feature allows you mark `enum`s as -`#[repr(transparent)]`. An `enum` may be `#[repr(transparent)]` if it has -exactly one variant, and that variant matches the same conditions which `struct` -requires for transparency. Some concrete illustrations follow. - -```rust -#![feature(transparent_enums)] - -// This enum has the same representation as `f32`. -#[repr(transparent)] -enum SingleFieldEnum { - Variant(f32) -} - -// This enum has the same representation as `usize`. -#[repr(transparent)] -enum MultiFieldEnum { - Variant { field: usize, nothing: () }, -} -``` - -For consistency with transparent `struct`s, `enum`s must have exactly one -non-zero-sized field. If all fields are zero-sized, the `enum` must not be -`#[repr(transparent)]`: - -```rust -#![feature(transparent_enums)] - -// This (non-transparent) enum is already valid in stable Rust: -pub enum GoodEnum { - Nothing, -} - -// Error: transparent enum needs exactly one non-zero-sized field, but has 0 -// #[repr(transparent)] -// pub enum BadEnum { -// Nothing(()), -// } - -// Error: transparent enum needs exactly one non-zero-sized field, but has 0 -// #[repr(transparent)] -// pub enum BadEmptyEnum { -// Nothing, -// } -``` - -The one exception is if the `enum` is generic over `T` and has a field of type -`T`, it may be `#[repr(transparent)]` even if `T` is a zero-sized type: - -```rust -#![feature(transparent_enums)] - -// This enum has the same representation as `T`. -#[repr(transparent)] -pub enum GenericEnum { - Variant(T, ()), -} - -// This is okay even though `()` is a zero-sized type. -pub const THIS_IS_OKAY: GenericEnum<()> = GenericEnum::Variant((), ()); -``` - -Transparent `enum`s require exactly one variant: - -```rust -// Error: transparent enum needs exactly one variant, but has 0 -// #[repr(transparent)] -// pub enum TooFewVariants { -// } - -// Error: transparent enum needs exactly one variant, but has 2 -// #[repr(transparent)] -// pub enum TooManyVariants { -// First(usize), -// Second, -// } -``` - -Like transarent `struct`s, a transparent `enum` of type `E` has the same layout, -size, and ABI as its single non-ZST field. If it is generic over a type `T`, and -all its fields are ZSTs except for exactly one field of type `T`, then it has -the same layout and ABI as `T` (even if `T` is a ZST when monomorphized). - -Like transparent `struct`s, transparent `enum`s are FFI-safe if and only if -their underlying representation type is also FFI-safe. diff --git a/src/doc/unstable-book/src/library-features/compiler-builtins-lib.md b/src/doc/unstable-book/src/library-features/compiler-builtins-lib.md deleted file mode 100644 index 6c71c3f2ce..0000000000 --- a/src/doc/unstable-book/src/library-features/compiler-builtins-lib.md +++ /dev/null @@ -1,35 +0,0 @@ -# `compiler_builtins_lib` - -The tracking issue for this feature is: None. - ------------------------- - -This feature is required to link to the `compiler_builtins` crate which contains -"compiler intrinsics". Compiler intrinsics are software implementations of basic -operations like multiplication of `u64`s. These intrinsics are only required on -platforms where these operations don't directly map to a hardware instruction. - -You should never need to explicitly link to the `compiler_builtins` crate when -building "std" programs as `compiler_builtins` is already in the dependency -graph of `std`. But you may need it when building `no_std` **binary** crates. If -you get a *linker* error like: - -``` text -$PWD/src/main.rs:11: undefined reference to `__aeabi_lmul' -$PWD/src/main.rs:11: undefined reference to `__aeabi_uldivmod' -``` - -That means that you need to link to this crate. - -When you link to this crate, make sure it only appears once in your crate -dependency graph. Also, it doesn't matter where in the dependency graph you -place the `compiler_builtins` crate. - - - -``` rust,ignore -#![feature(compiler_builtins_lib)] -#![no_std] - -extern crate compiler_builtins; -``` diff --git a/src/doc/unstable-book/src/library-features/debug-map-key-value.md b/src/doc/unstable-book/src/library-features/debug-map-key-value.md deleted file mode 100644 index ae839bf2ac..0000000000 --- a/src/doc/unstable-book/src/library-features/debug-map-key-value.md +++ /dev/null @@ -1,9 +0,0 @@ -# `debug_map_key_value` - -The tracking issue for this feature is: [#62482] - -[#62482]: https://github.com/rust-lang/rust/issues/62482 - ------------------------- - -Add the methods `key` and `value` to `DebugMap` so that an entry can be formatted across multiple calls without additional buffering. diff --git a/src/doc/unstable-book/src/library-features/sanitizer-runtime-lib.md b/src/doc/unstable-book/src/library-features/sanitizer-runtime-lib.md deleted file mode 100644 index 82ae67fc05..0000000000 --- a/src/doc/unstable-book/src/library-features/sanitizer-runtime-lib.md +++ /dev/null @@ -1,5 +0,0 @@ -# `sanitizer_runtime_lib` - -This feature is internal to the Rust compiler and is not intended for general use. - ------------------------- diff --git a/src/etc/generate-deriving-span-tests.py b/src/etc/generate-deriving-span-tests.py index 39c24fb10e..afa6bbdae4 100755 --- a/src/etc/generate-deriving-span-tests.py +++ b/src/etc/generate-deriving-span-tests.py @@ -14,7 +14,9 @@ TEST_DIR = os.path.abspath( os.path.join(os.path.dirname(__file__), '../test/ui/derives/')) TEMPLATE = """\ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' {error_deriving} diff --git a/src/etc/installer/msi/rust.wxs b/src/etc/installer/msi/rust.wxs index a2e378f7b1..a182bc4067 100644 --- a/src/etc/installer/msi/rust.wxs +++ b/src/etc/installer/msi/rust.wxs @@ -85,7 +85,7 @@ - + diff --git a/src/etc/test-float-parse/long-fractions.rs b/src/etc/test-float-parse/long-fractions.rs index 55e4f07cd0..60cf85c4a6 100644 --- a/src/etc/test-float-parse/long-fractions.rs +++ b/src/etc/test-float-parse/long-fractions.rs @@ -1,7 +1,7 @@ mod _common; -use std::char; use _common::validate; +use std::char; fn main() { for n in 0..10 { diff --git a/src/etc/test-float-parse/many-digits.rs b/src/etc/test-float-parse/many-digits.rs index 76da818c70..599986e20d 100644 --- a/src/etc/test-float-parse/many-digits.rs +++ b/src/etc/test-float-parse/many-digits.rs @@ -2,10 +2,10 @@ extern crate rand; mod _common; -use std::char; -use rand::{IsaacRng, Rng, SeedableRng}; -use rand::distributions::{Range, Sample}; use _common::{validate, SEED}; +use rand::distributions::{Range, Sample}; +use rand::{IsaacRng, Rng, SeedableRng}; +use std::char; fn main() { let mut rnd = IsaacRng::from_seed(&SEED); diff --git a/src/etc/test-float-parse/subnorm.rs b/src/etc/test-float-parse/subnorm.rs index 448482c6eb..ba68d31e4e 100644 --- a/src/etc/test-float-parse/subnorm.rs +++ b/src/etc/test-float-parse/subnorm.rs @@ -1,7 +1,7 @@ mod _common; -use std::mem::transmute; use _common::validate; +use std::mem::transmute; fn main() { for bits in 0u32..(1 << 21) { diff --git a/src/liballoc/alloc.rs b/src/liballoc/alloc.rs index 9bc76f5157..0c0dc928b9 100644 --- a/src/liballoc/alloc.rs +++ b/src/liballoc/alloc.rs @@ -24,10 +24,7 @@ extern "Rust" { #[rustc_allocator_nounwind] fn __rust_dealloc(ptr: *mut u8, size: usize, align: usize); #[rustc_allocator_nounwind] - fn __rust_realloc(ptr: *mut u8, - old_size: usize, - align: usize, - new_size: usize) -> *mut u8; + fn __rust_realloc(ptr: *mut u8, old_size: usize, align: usize, new_size: usize) -> *mut u8; #[rustc_allocator_nounwind] fn __rust_alloc_zeroed(size: usize, align: usize) -> *mut u8; } @@ -178,12 +175,12 @@ unsafe impl Alloc for Global { } #[inline] - unsafe fn realloc(&mut self, - ptr: NonNull, - layout: Layout, - new_size: usize) - -> Result, AllocErr> - { + unsafe fn realloc( + &mut self, + ptr: NonNull, + layout: Layout, + new_size: usize, + ) -> Result, AllocErr> { NonNull::new(realloc(ptr.as_ptr(), layout, new_size)).ok_or(AllocErr) } @@ -204,11 +201,7 @@ unsafe fn exchange_malloc(size: usize, align: usize) -> *mut u8 { } else { let layout = Layout::from_size_align_unchecked(size, align); let ptr = alloc(layout); - if !ptr.is_null() { - ptr - } else { - handle_alloc_error(layout) - } + if !ptr.is_null() { ptr } else { handle_alloc_error(layout) } } } diff --git a/src/liballoc/benches/btree/map.rs b/src/liballoc/benches/btree/map.rs index eb5f51d9ad..ea69769279 100644 --- a/src/liballoc/benches/btree/map.rs +++ b/src/liballoc/benches/btree/map.rs @@ -146,6 +146,36 @@ pub fn iter_100000(b: &mut Bencher) { bench_iter(b, 100000); } +fn bench_iter_mut(b: &mut Bencher, size: i32) { + let mut map = BTreeMap::::new(); + let mut rng = thread_rng(); + + for _ in 0..size { + map.insert(rng.gen(), rng.gen()); + } + + b.iter(|| { + for kv in map.iter_mut() { + black_box(kv); + } + }); +} + +#[bench] +pub fn iter_mut_20(b: &mut Bencher) { + bench_iter_mut(b, 20); +} + +#[bench] +pub fn iter_mut_1000(b: &mut Bencher) { + bench_iter_mut(b, 1000); +} + +#[bench] +pub fn iter_mut_100000(b: &mut Bencher) { + bench_iter_mut(b, 100000); +} + fn bench_first_and_last(b: &mut Bencher, size: i32) { let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect(); b.iter(|| { diff --git a/src/liballoc/benches/btree/set.rs b/src/liballoc/benches/btree/set.rs index 18502ded30..d7c1d95a45 100644 --- a/src/liballoc/benches/btree/set.rs +++ b/src/liballoc/benches/btree/set.rs @@ -14,19 +14,13 @@ fn random(n: usize) -> BTreeSet { } fn neg(n: usize) -> BTreeSet { - let mut set = BTreeSet::new(); - for i in -(n as i32)..=-1 { - set.insert(i); - } + let set: BTreeSet = (-(n as i32)..=-1).collect(); assert_eq!(set.len(), n); set } fn pos(n: usize) -> BTreeSet { - let mut set = BTreeSet::new(); - for i in 1..=(n as i32) { - set.insert(i); - } + let set: BTreeSet = (1..=(n as i32)).collect(); assert_eq!(set.len(), n); set } @@ -56,6 +50,43 @@ macro_rules! set_bench { }; } +const BUILD_SET_SIZE: usize = 100; + +#[bench] +pub fn build_and_clear(b: &mut Bencher) { + b.iter(|| pos(BUILD_SET_SIZE).clear()) +} + +#[bench] +pub fn build_and_drop(b: &mut Bencher) { + b.iter(|| pos(BUILD_SET_SIZE)) +} + +#[bench] +pub fn build_and_into_iter(b: &mut Bencher) { + b.iter(|| pos(BUILD_SET_SIZE).into_iter().count()) +} + +#[bench] +pub fn build_and_pop_all(b: &mut Bencher) { + b.iter(|| { + let mut s = pos(BUILD_SET_SIZE); + while s.pop_first().is_some() {} + s + }); +} + +#[bench] +pub fn build_and_remove_all(b: &mut Bencher) { + b.iter(|| { + let mut s = pos(BUILD_SET_SIZE); + while let Some(elt) = s.iter().copied().next() { + s.remove(&elt); + } + s + }); +} + set_bench! {intersection_100_neg_vs_100_pos, intersection, count, [neg(100), pos(100)]} set_bench! {intersection_100_neg_vs_10k_pos, intersection, count, [neg(100), pos(10_000)]} set_bench! {intersection_100_pos_vs_100_neg, intersection, count, [pos(100), neg(100)]} diff --git a/src/liballoc/benches/lib.rs b/src/liballoc/benches/lib.rs index 9acda88606..951477a24c 100644 --- a/src/liballoc/benches/lib.rs +++ b/src/liballoc/benches/lib.rs @@ -6,8 +6,8 @@ extern crate test; mod btree; mod linked_list; -mod string; -mod str; mod slice; +mod str; +mod string; mod vec; mod vec_deque; diff --git a/src/liballoc/benches/string.rs b/src/liballoc/benches/string.rs index 2933014cb5..5c95160ba2 100644 --- a/src/liballoc/benches/string.rs +++ b/src/liballoc/benches/string.rs @@ -1,5 +1,5 @@ use std::iter::repeat; -use test::Bencher; +use test::{black_box, Bencher}; #[bench] fn bench_with_capacity(b: &mut Bencher) { @@ -122,3 +122,43 @@ fn bench_to_string(b: &mut Bencher) { Lorem ipsum dolor sit amet, consectetur. "; b.iter(|| s.to_string()) } + +#[bench] +fn bench_insert_char_short(b: &mut Bencher) { + let s = "Hello, World!"; + b.iter(|| { + let mut x = String::from(s); + black_box(&mut x).insert(6, black_box(' ')); + x + }) +} + +#[bench] +fn bench_insert_char_long(b: &mut Bencher) { + let s = "Hello, World!"; + b.iter(|| { + let mut x = String::from(s); + black_box(&mut x).insert(6, black_box('❤')); + x + }) +} + +#[bench] +fn bench_insert_str_short(b: &mut Bencher) { + let s = "Hello, World!"; + b.iter(|| { + let mut x = String::from(s); + black_box(&mut x).insert_str(6, black_box(" ")); + x + }) +} + +#[bench] +fn bench_insert_str_long(b: &mut Bencher) { + let s = "Hello, World!"; + b.iter(|| { + let mut x = String::from(s); + black_box(&mut x).insert_str(6, black_box(" rustic ")); + x + }) +} diff --git a/src/liballoc/benches/vec.rs b/src/liballoc/benches/vec.rs index 590c49f4ef..a3da9e80cd 100644 --- a/src/liballoc/benches/vec.rs +++ b/src/liballoc/benches/vec.rs @@ -1,5 +1,5 @@ +use std::iter::{repeat, FromIterator}; use test::Bencher; -use std::iter::{FromIterator, repeat}; #[bench] fn bench_new(b: &mut Bencher) { diff --git a/src/liballoc/borrow.rs b/src/liballoc/borrow.rs index fc96045196..51c233a21f 100644 --- a/src/liballoc/borrow.rs +++ b/src/liballoc/borrow.rs @@ -16,8 +16,9 @@ use Cow::*; #[stable(feature = "rust1", since = "1.0.0")] impl<'a, B: ?Sized> Borrow for Cow<'a, B> - where B: ToOwned, - ::Owned: 'a +where + B: ToOwned, + ::Owned: 'a, { fn borrow(&self) -> &B { &**self @@ -69,9 +70,7 @@ pub trait ToOwned { /// let mut v: Vec = Vec::new(); /// [1, 2][..].clone_into(&mut v); /// ``` - #[unstable(feature = "toowned_clone_into", - reason = "recently added", - issue = "41263")] + #[unstable(feature = "toowned_clone_into", reason = "recently added", issue = "41263")] fn clone_into(&self, target: &mut Self::Owned) { *target = self.to_owned(); } @@ -79,7 +78,8 @@ pub trait ToOwned { #[stable(feature = "rust1", since = "1.0.0")] impl ToOwned for T - where T: Clone +where + T: Clone, { type Owned = T; fn to_owned(&self) -> T { @@ -169,17 +169,16 @@ impl ToOwned for T /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub enum Cow<'a, B: ?Sized + 'a> - where B: ToOwned +where + B: ToOwned, { /// Borrowed data. #[stable(feature = "rust1", since = "1.0.0")] - Borrowed(#[stable(feature = "rust1", since = "1.0.0")] - &'a B), + Borrowed(#[stable(feature = "rust1", since = "1.0.0")] &'a B), /// Owned data. #[stable(feature = "rust1", since = "1.0.0")] - Owned(#[stable(feature = "rust1", since = "1.0.0")] - ::Owned), + Owned(#[stable(feature = "rust1", since = "1.0.0")] ::Owned), } #[stable(feature = "rust1", since = "1.0.0")] @@ -335,7 +334,8 @@ impl Eq for Cow<'_, B> where B: Eq + ToOwned {} #[stable(feature = "rust1", since = "1.0.0")] impl Ord for Cow<'_, B> - where B: Ord + ToOwned +where + B: Ord + ToOwned, { #[inline] fn cmp(&self, other: &Self) -> Ordering { @@ -345,8 +345,9 @@ impl Ord for Cow<'_, B> #[stable(feature = "rust1", since = "1.0.0")] impl<'a, 'b, B: ?Sized, C: ?Sized> PartialEq> for Cow<'a, B> - where B: PartialEq + ToOwned, - C: ToOwned +where + B: PartialEq + ToOwned, + C: ToOwned, { #[inline] fn eq(&self, other: &Cow<'b, C>) -> bool { @@ -356,7 +357,8 @@ impl<'a, 'b, B: ?Sized, C: ?Sized> PartialEq> for Cow<'a, B> #[stable(feature = "rust1", since = "1.0.0")] impl<'a, B: ?Sized> PartialOrd for Cow<'a, B> - where B: PartialOrd + ToOwned +where + B: PartialOrd + ToOwned, { #[inline] fn partial_cmp(&self, other: &Cow<'a, B>) -> Option { @@ -403,7 +405,8 @@ where #[stable(feature = "rust1", since = "1.0.0")] impl Hash for Cow<'_, B> - where B: Hash + ToOwned +where + B: Hash + ToOwned, { #[inline] fn hash(&self, state: &mut H) { diff --git a/src/liballoc/boxed.rs b/src/liballoc/boxed.rs index 1c39a3721f..87a4924f9b 100644 --- a/src/liballoc/boxed.rs +++ b/src/liballoc/boxed.rs @@ -134,21 +134,21 @@ use core::convert::{From, TryFrom}; use core::fmt; use core::future::Future; use core::hash::{Hash, Hasher}; -use core::iter::{Iterator, FromIterator, FusedIterator}; +use core::iter::{FromIterator, FusedIterator, Iterator}; use core::marker::{Unpin, Unsize}; use core::mem; -use core::pin::Pin; use core::ops::{ - CoerceUnsized, DispatchFromDyn, Deref, DerefMut, Receiver, Generator, GeneratorState + CoerceUnsized, Deref, DerefMut, DispatchFromDyn, Generator, GeneratorState, Receiver, }; +use core::pin::Pin; use core::ptr::{self, NonNull, Unique}; use core::slice; use core::task::{Context, Poll}; -use crate::alloc::{self, Global, Alloc}; -use crate::vec::Vec; +use crate::alloc::{self, Alloc, Global}; use crate::raw_vec::RawVec; use crate::str::from_boxed_utf8_unchecked; +use crate::vec::Vec; /// A pointer type for heap allocation. /// @@ -196,12 +196,10 @@ impl Box { pub fn new_uninit() -> Box> { let layout = alloc::Layout::new::>(); if layout.size() == 0 { - return Box(NonNull::dangling().into()) + return Box(NonNull::dangling().into()); } - let ptr = unsafe { - Global.alloc(layout) - .unwrap_or_else(|_| alloc::handle_alloc_error(layout)) - }; + let ptr = + unsafe { Global.alloc(layout).unwrap_or_else(|_| alloc::handle_alloc_error(layout)) }; Box(ptr.cast().into()) } @@ -269,9 +267,7 @@ impl Box<[T]> { NonNull::dangling() } else { unsafe { - Global.alloc(layout) - .unwrap_or_else(|_| alloc::handle_alloc_error(layout)) - .cast() + Global.alloc(layout).unwrap_or_else(|_| alloc::handle_alloc_error(layout)).cast() } }; let slice = unsafe { slice::from_raw_parts_mut(ptr.as_ptr(), len) }; @@ -476,7 +472,7 @@ impl Box { Box::into_unique(b).into() } - #[unstable(feature = "ptr_internals", issue = "0", reason = "use into_raw_non_null instead")] + #[unstable(feature = "ptr_internals", issue = "none", reason = "use into_raw_non_null instead")] #[inline] #[doc(hidden)] pub fn into_unique(b: Box) -> Unique { @@ -532,7 +528,7 @@ impl Box { #[inline] pub fn leak<'a>(b: Box) -> &'a mut T where - T: 'a // Technically not needed, but kept to be explicit. + T: 'a, // Technically not needed, but kept to be explicit. { unsafe { &mut *Box::into_raw(b) } } @@ -625,15 +621,12 @@ impl Clone for Box { } } - #[stable(feature = "box_slice_clone", since = "1.3.0")] impl Clone for Box { fn clone(&self) -> Self { // this makes a copy of the data let buf: Box<[u8]> = self.as_bytes().into(); - unsafe { - from_boxed_utf8_unchecked(buf) - } + unsafe { from_boxed_utf8_unchecked(buf) } } } @@ -830,7 +823,7 @@ impl From> for Box<[u8]> { } } -#[unstable(feature = "boxed_slice_try_from", issue = "0")] +#[unstable(feature = "boxed_slice_try_from", issue = "none")] impl TryFrom> for Box<[T; N]> where [T; N]: LengthAtMost32, @@ -946,7 +939,7 @@ impl DerefMut for Box { } } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for Box {} #[stable(feature = "rust1", since = "1.0.0")] @@ -1040,7 +1033,7 @@ impl + ?Sized> Fn for Box { #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Box {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Box {} #[stable(feature = "boxed_slice_from_iter", since = "1.32.0")] @@ -1053,51 +1046,7 @@ impl FromIterator for Box<[A]> { #[stable(feature = "box_slice_clone", since = "1.3.0")] impl Clone for Box<[T]> { fn clone(&self) -> Self { - let mut new = BoxBuilder { - data: RawVec::with_capacity(self.len()), - len: 0, - }; - - let mut target = new.data.ptr(); - - for item in self.iter() { - unsafe { - ptr::write(target, item.clone()); - target = target.offset(1); - }; - - new.len += 1; - } - - return unsafe { new.into_box() }; - - // Helper type for responding to panics correctly. - struct BoxBuilder { - data: RawVec, - len: usize, - } - - impl BoxBuilder { - unsafe fn into_box(self) -> Box<[T]> { - let raw = ptr::read(&self.data); - mem::forget(self); - raw.into_box() - } - } - - impl Drop for BoxBuilder { - fn drop(&mut self) { - let mut data = self.data.ptr(); - let max = unsafe { data.add(self.len) }; - - while data != max { - unsafe { - ptr::read(data); - data = data.offset(1); - } - } - } - } + self.to_vec().into_boxed_slice() } } @@ -1152,7 +1101,7 @@ impl AsMut for Box { * could have a method to project a Pin from it. */ #[stable(feature = "pin", since = "1.33.0")] -impl Unpin for Box { } +impl Unpin for Box {} #[unstable(feature = "generator_trait", issue = "43122")] impl Generator for Box { diff --git a/src/liballoc/collections/binary_heap.rs b/src/liballoc/collections/binary_heap.rs index fda6f090fd..c527b378f7 100644 --- a/src/liballoc/collections/binary_heap.rs +++ b/src/liballoc/collections/binary_heap.rs @@ -145,11 +145,11 @@ #![allow(missing_docs)] #![stable(feature = "rust1", since = "1.0.0")] -use core::ops::{Deref, DerefMut}; +use core::fmt; use core::iter::{FromIterator, FusedIterator, TrustedLen}; -use core::mem::{swap, size_of, ManuallyDrop}; +use core::mem::{size_of, swap, ManuallyDrop}; +use core::ops::{Deref, DerefMut}; use core::ptr; -use core::fmt; use crate::slice; use crate::vec::{self, Vec}; @@ -267,9 +267,7 @@ pub struct PeekMut<'a, T: 'a + Ord> { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for PeekMut<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("PeekMut") - .field(&self.heap.data[0]) - .finish() + f.debug_tuple("PeekMut").field(&self.heap.data[0]).finish() } } @@ -404,14 +402,7 @@ impl BinaryHeap { /// Cost is O(1) in the worst case. #[stable(feature = "binary_heap_peek_mut", since = "1.12.0")] pub fn peek_mut(&mut self) -> Option> { - if self.is_empty() { - None - } else { - Some(PeekMut { - heap: self, - sift: true, - }) - } + if self.is_empty() { None } else { Some(PeekMut { heap: self, sift: true }) } } /// Removes the greatest item from the binary heap and returns it, or `None` if it @@ -674,9 +665,7 @@ impl BinaryHeap { #[inline] #[unstable(feature = "binary_heap_drain_sorted", issue = "59278")] pub fn drain_sorted(&mut self) -> DrainSorted<'_, T> { - DrainSorted { - inner: self, - } + DrainSorted { inner: self } } } @@ -718,9 +707,7 @@ impl BinaryHeap { /// ``` #[unstable(feature = "binary_heap_into_iter_sorted", issue = "59278")] pub fn into_iter_sorted(self) -> IntoIterSorted { - IntoIterSorted { - inner: self, - } + IntoIterSorted { inner: self } } /// Returns the greatest item in the binary heap, or `None` if it is empty. @@ -857,7 +844,7 @@ impl BinaryHeap { /// assert!(heap.capacity() >= 10); /// ``` #[inline] - #[unstable(feature = "shrink_to", reason = "new API", issue="56431")] + #[unstable(feature = "shrink_to", reason = "new API", issue = "56431")] pub fn shrink_to(&mut self, min_capacity: usize) { self.data.shrink_to(min_capacity) } @@ -991,11 +978,7 @@ impl<'a, T> Hole<'a, T> { debug_assert!(pos < data.len()); // SAFE: pos should be inside the slice let elt = ptr::read(data.get_unchecked(pos)); - Hole { - data, - elt: ManuallyDrop::new(elt), - pos, - } + Hole { data, elt: ManuallyDrop::new(elt), pos } } #[inline] @@ -1059,9 +1042,7 @@ pub struct Iter<'a, T: 'a> { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for Iter<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("Iter") - .field(&self.iter.as_slice()) - .finish() + f.debug_tuple("Iter").field(&self.iter.as_slice()).finish() } } @@ -1113,7 +1094,7 @@ impl FusedIterator for Iter<'_, T> {} /// An owning iterator over the elements of a `BinaryHeap`. /// -/// This `struct` is created by the [`into_iter`] method on [`BinaryHeap`][`BinaryHeap`] +/// This `struct` is created by the [`into_iter`] method on [`BinaryHeap`] /// (provided by the `IntoIterator` trait). See its documentation for more. /// /// [`into_iter`]: struct.BinaryHeap.html#method.into_iter @@ -1127,9 +1108,7 @@ pub struct IntoIter { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for IntoIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("IntoIter") - .field(&self.iter.as_slice()) - .finish() + f.debug_tuple("IntoIter").field(&self.iter.as_slice()).finish() } } @@ -1281,7 +1260,7 @@ impl Iterator for DrainSorted<'_, T> { } #[unstable(feature = "binary_heap_drain_sorted", issue = "59278")] -impl ExactSizeIterator for DrainSorted<'_, T> { } +impl ExactSizeIterator for DrainSorted<'_, T> {} #[unstable(feature = "binary_heap_drain_sorted", issue = "59278")] impl FusedIterator for DrainSorted<'_, T> {} diff --git a/src/liballoc/collections/btree/map.rs b/src/liballoc/collections/btree/map.rs index 5b48b594ff..e70f881bc3 100644 --- a/src/liballoc/collections/btree/map.rs +++ b/src/liballoc/collections/btree/map.rs @@ -2,17 +2,17 @@ use core::borrow::Borrow; use core::cmp::Ordering; use core::fmt::Debug; use core::hash::{Hash, Hasher}; -use core::iter::{FromIterator, Peekable, FusedIterator}; +use core::iter::{FromIterator, FusedIterator, Peekable}; use core::marker::PhantomData; use core::ops::Bound::{Excluded, Included, Unbounded}; use core::ops::{Index, RangeBounds}; use core::{fmt, intrinsics, mem, ptr}; -use super::node::{self, Handle, NodeRef, marker, InsertResult::*, ForceResult::*}; +use super::node::{self, marker, ForceResult::*, Handle, InsertResult::*, NodeRef}; use super::search::{self, SearchResult::*}; -use UnderflowResult::*; use Entry::*; +use UnderflowResult::*; /// A map based on a B-Tree. /// @@ -138,16 +138,15 @@ unsafe impl<#[may_dangle] K, #[may_dangle] V> Drop for BTreeMap { impl Clone for BTreeMap { fn clone(&self) -> BTreeMap { fn clone_subtree<'a, K: Clone, V: Clone>( - node: node::NodeRef, K, V, marker::LeafOrInternal> + node: node::NodeRef, K, V, marker::LeafOrInternal>, ) -> BTreeMap - where K: 'a, V: 'a, + where + K: 'a, + V: 'a, { match node.force() { Leaf(leaf) => { - let mut out_tree = BTreeMap { - root: node::Root::new_leaf(), - length: 0, - }; + let mut out_tree = BTreeMap { root: node::Root::new_leaf(), length: 0 }; { let mut out_node = match out_tree.root.as_mut().force() { @@ -203,10 +202,7 @@ impl Clone for BTreeMap { if self.is_empty() { // Ideally we'd call `BTreeMap::new` here, but that has the `K: // Ord` constraint, which this method lacks. - BTreeMap { - root: node::Root::shared_empty_root(), - length: 0, - } + BTreeMap { root: node::Root::shared_empty_root(), length: 0 } } else { clone_subtree(self.root.as_ref()) } @@ -214,8 +210,9 @@ impl Clone for BTreeMap { } impl super::Recover for BTreeMap - where K: Borrow + Ord, - Q: Ord +where + K: Borrow + Ord, + Q: Ord, { type Key = K; @@ -228,15 +225,11 @@ impl super::Recover for BTreeMap fn take(&mut self, key: &Q) -> Option { match search::search_tree(self.root.as_mut(), key) { - Found(handle) => { - Some(OccupiedEntry { - handle, - length: &mut self.length, - _marker: PhantomData, - } - .remove_kv() - .0) - } + Found(handle) => Some( + OccupiedEntry { handle, length: &mut self.length, _marker: PhantomData } + .remove_kv() + .0, + ), GoDown(_) => None, } } @@ -246,13 +239,8 @@ impl super::Recover for BTreeMap match search::search_tree::, K, (), K>(self.root.as_mut(), &key) { Found(handle) => Some(mem::replace(handle.into_kv_mut().0, key)), GoDown(handle) => { - VacantEntry { - key, - handle, - length: &mut self.length, - _marker: PhantomData, - } - .insert(()); + VacantEntry { key, handle, length: &mut self.length, _marker: PhantomData } + .insert(()); None } } @@ -295,7 +283,7 @@ pub struct IterMut<'a, K: 'a, V: 'a> { /// An owning iterator over the entries of a `BTreeMap`. /// -/// This `struct` is created by the [`into_iter`] method on [`BTreeMap`][`BTreeMap`] +/// This `struct` is created by the [`into_iter`] method on [`BTreeMap`] /// (provided by the `IntoIterator` trait). See its documentation for more. /// /// [`into_iter`]: struct.BTreeMap.html#method.into_iter @@ -310,10 +298,7 @@ pub struct IntoIter { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for IntoIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let range = Range { - front: self.front.reborrow(), - back: self.back.reborrow(), - }; + let range = Range { front: self.front.reborrow(), back: self.back.reborrow() }; f.debug_list().entries(range).finish() } } @@ -408,10 +393,7 @@ pub struct RangeMut<'a, K: 'a, V: 'a> { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for RangeMut<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let range = Range { - front: self.front.reborrow(), - back: self.back.reborrow(), - }; + let range = Range { front: self.front.reborrow(), back: self.back.reborrow() }; f.debug_list().entries(range).finish() } } @@ -426,25 +408,19 @@ impl fmt::Debug for RangeMut<'_, K, V> { pub enum Entry<'a, K: 'a, V: 'a> { /// A vacant entry. #[stable(feature = "rust1", since = "1.0.0")] - Vacant(#[stable(feature = "rust1", since = "1.0.0")] - VacantEntry<'a, K, V>), + Vacant(#[stable(feature = "rust1", since = "1.0.0")] VacantEntry<'a, K, V>), /// An occupied entry. #[stable(feature = "rust1", since = "1.0.0")] - Occupied(#[stable(feature = "rust1", since = "1.0.0")] - OccupiedEntry<'a, K, V>), + Occupied(#[stable(feature = "rust1", since = "1.0.0")] OccupiedEntry<'a, K, V>), } -#[stable(feature= "debug_btree_map", since = "1.12.0")] +#[stable(feature = "debug_btree_map", since = "1.12.0")] impl Debug for Entry<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { - Vacant(ref v) => f.debug_tuple("Entry") - .field(v) - .finish(), - Occupied(ref o) => f.debug_tuple("Entry") - .field(o) - .finish(), + Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), + Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(), } } } @@ -463,12 +439,10 @@ pub struct VacantEntry<'a, K: 'a, V: 'a> { _marker: PhantomData<&'a mut (K, V)>, } -#[stable(feature= "debug_btree_map", since = "1.12.0")] +#[stable(feature = "debug_btree_map", since = "1.12.0")] impl Debug for VacantEntry<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("VacantEntry") - .field(self.key()) - .finish() + f.debug_tuple("VacantEntry").field(self.key()).finish() } } @@ -486,13 +460,10 @@ pub struct OccupiedEntry<'a, K: 'a, V: 'a> { _marker: PhantomData<&'a mut (K, V)>, } -#[stable(feature= "debug_btree_map", since = "1.12.0")] +#[stable(feature = "debug_btree_map", since = "1.12.0")] impl Debug for OccupiedEntry<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("OccupiedEntry") - .field("key", self.key()) - .field("value", self.get()) - .finish() + f.debug_struct("OccupiedEntry").field("key", self.key()).field("value", self.get()).finish() } } @@ -519,13 +490,10 @@ impl BTreeMap { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn new() -> BTreeMap { - BTreeMap { - root: node::Root::shared_empty_root(), - length: 0, - } + BTreeMap { root: node::Root::shared_empty_root(), length: 0 } } - /// Clears the map, removing all values. + /// Clears the map, removing all elements. /// /// # Examples /// @@ -563,8 +531,9 @@ impl BTreeMap { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn get(&self, key: &Q) -> Option<&V> - where K: Borrow, - Q: Ord + where + K: Borrow, + Q: Ord, { match search::search_tree(self.root.as_ref(), key) { Found(handle) => Some(handle.into_kv().1), @@ -589,8 +558,9 @@ impl BTreeMap { /// ``` #[stable(feature = "map_get_key_value", since = "1.40.0")] pub fn get_key_value(&self, k: &Q) -> Option<(&K, &V)> - where K: Borrow, - Q: Ord + where + K: Borrow, + Q: Ord, { match search::search_tree(self.root.as_ref(), k) { Found(handle) => Some(handle.into_kv()), @@ -617,7 +587,9 @@ impl BTreeMap { /// ``` #[unstable(feature = "map_first_last", issue = "62924")] pub fn first_key_value(&self) -> Option<(&K, &V)> - where T: Ord, K: Borrow + where + T: Ord, + K: Borrow, { let front = first_leaf_edge(self.root.as_ref()); front.right_kv().ok().map(Handle::into_kv) @@ -644,15 +616,17 @@ impl BTreeMap { /// ``` #[unstable(feature = "map_first_last", issue = "62924")] pub fn first_entry(&mut self) -> Option> - where T: Ord, K: Borrow + where + T: Ord, + K: Borrow, { match self.length { 0 => None, _ => Some(OccupiedEntry { - handle: self.root.as_mut().first_kv(), - length: &mut self.length, - _marker: PhantomData, - }), + handle: self.root.as_mut().first_kv(), + length: &mut self.length, + _marker: PhantomData, + }), } } @@ -674,7 +648,9 @@ impl BTreeMap { /// ``` #[unstable(feature = "map_first_last", issue = "62924")] pub fn last_key_value(&self) -> Option<(&K, &V)> - where T: Ord, K: Borrow + where + T: Ord, + K: Borrow, { let back = last_leaf_edge(self.root.as_ref()); back.left_kv().ok().map(Handle::into_kv) @@ -701,15 +677,17 @@ impl BTreeMap { /// ``` #[unstable(feature = "map_first_last", issue = "62924")] pub fn last_entry(&mut self) -> Option> - where T: Ord, K: Borrow + where + T: Ord, + K: Borrow, { match self.length { 0 => None, _ => Some(OccupiedEntry { - handle: self.root.as_mut().last_kv(), - length: &mut self.length, - _marker: PhantomData, - }), + handle: self.root.as_mut().last_kv(), + length: &mut self.length, + _marker: PhantomData, + }), } } @@ -732,8 +710,9 @@ impl BTreeMap { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn contains_key(&self, key: &Q) -> bool - where K: Borrow, - Q: Ord + where + K: Borrow, + Q: Ord, { self.get(key).is_some() } @@ -760,8 +739,9 @@ impl BTreeMap { // See `get` for implementation notes, this is basically a copy-paste with mut's added #[stable(feature = "rust1", since = "1.0.0")] pub fn get_mut(&mut self, key: &Q) -> Option<&mut V> - where K: Borrow, - Q: Ord + where + K: Borrow, + Q: Ord, { match search::search_tree(self.root.as_mut(), key) { Found(handle) => Some(handle.into_kv_mut().1), @@ -826,18 +806,14 @@ impl BTreeMap { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn remove(&mut self, key: &Q) -> Option - where K: Borrow, - Q: Ord + where + K: Borrow, + Q: Ord, { match search::search_tree(self.root.as_mut(), key) { - Found(handle) => { - Some(OccupiedEntry { - handle, - length: &mut self.length, - _marker: PhantomData, - } - .remove()) - } + Found(handle) => Some( + OccupiedEntry { handle, length: &mut self.length, _marker: PhantomData }.remove(), + ), GoDown(_) => None, } } @@ -886,10 +862,7 @@ impl BTreeMap { // First, we merge `self` and `other` into a sorted sequence in linear time. let self_iter = mem::take(self).into_iter(); let other_iter = mem::take(other).into_iter(); - let iter = MergeIter { - left: self_iter.peekable(), - right: other_iter.peekable(), - }; + let iter = MergeIter { left: self_iter.peekable(), right: other_iter.peekable() }; // Second, we build a tree from the sorted sequence in linear time. self.from_sorted_iter(iter); @@ -927,13 +900,16 @@ impl BTreeMap { /// ``` #[stable(feature = "btree_range", since = "1.17.0")] pub fn range(&self, range: R) -> Range<'_, K, V> - where T: Ord, K: Borrow, R: RangeBounds + where + T: Ord, + K: Borrow, + R: RangeBounds, { let root1 = self.root.as_ref(); let root2 = self.root.as_ref(); let (f, b) = range_search(root1, root2, range); - Range { front: f, back: b} + Range { front: f, back: b } } /// Constructs a mutable double-ended iterator over a sub-range of elements in the map. @@ -968,17 +944,16 @@ impl BTreeMap { /// ``` #[stable(feature = "btree_range", since = "1.17.0")] pub fn range_mut(&mut self, range: R) -> RangeMut<'_, K, V> - where T: Ord, K: Borrow, R: RangeBounds + where + T: Ord, + K: Borrow, + R: RangeBounds, { let root1 = self.root.as_mut(); let root2 = unsafe { ptr::read(&root1) }; let (f, b) = range_search(root1, root2, range); - RangeMut { - front: f, - back: b, - _marker: PhantomData, - } + RangeMut { front: f, back: b, _marker: PhantomData } } /// Gets the given key's corresponding entry in the map for in-place manipulation. @@ -1005,19 +980,10 @@ impl BTreeMap { self.ensure_root_is_owned(); match search::search_tree(self.root.as_mut(), &key) { Found(handle) => { - Occupied(OccupiedEntry { - handle, - length: &mut self.length, - _marker: PhantomData, - }) + Occupied(OccupiedEntry { handle, length: &mut self.length, _marker: PhantomData }) } GoDown(handle) => { - Vacant(VacantEntry { - key, - handle, - length: &mut self.length, - _marker: PhantomData, - }) + Vacant(VacantEntry { key, handle, length: &mut self.length, _marker: PhantomData }) } } } @@ -1124,7 +1090,8 @@ impl BTreeMap { /// ``` #[stable(feature = "btree_split_off", since = "1.11.0")] pub fn split_off(&mut self, key: &Q) -> Self - where K: Borrow + where + K: Borrow, { if self.is_empty() { return Self::new(); @@ -1182,10 +1149,10 @@ impl BTreeMap { /// Calculates the number of elements if it is incorrect. fn recalc_length(&mut self) { - fn dfs<'a, K, V>( - node: NodeRef, K, V, marker::LeafOrInternal> - ) -> usize - where K: 'a, V: 'a + fn dfs<'a, K, V>(node: NodeRef, K, V, marker::LeafOrInternal>) -> usize + where + K: 'a, + V: 'a, { let mut res = node.len(); @@ -1338,10 +1305,7 @@ impl ExactSizeIterator for Iter<'_, K, V> { #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Iter<'_, K, V> { fn clone(&self) -> Self { - Iter { - range: self.range.clone(), - length: self.length, - } + Iter { range: self.range.clone(), length: self.length } } } @@ -1410,11 +1374,7 @@ impl IntoIterator for BTreeMap { let len = self.length; mem::forget(self); - IntoIter { - front: first_leaf_edge(root1), - back: last_leaf_edge(root2), - length: len, - } + IntoIter { front: first_leaf_edge(root1), back: last_leaf_edge(root2), length: len } } } @@ -1619,11 +1579,7 @@ impl<'a, K, V> Iterator for Range<'a, K, V> { type Item = (&'a K, &'a V); fn next(&mut self) -> Option<(&'a K, &'a V)> { - if self.front == self.back { - None - } else { - unsafe { Some(self.next_unchecked()) } - } + if self.front == self.back { None } else { unsafe { Some(self.next_unchecked()) } } } fn last(mut self) -> Option<(&'a K, &'a V)> { @@ -1700,11 +1656,7 @@ impl<'a, K, V> Range<'a, K, V> { #[stable(feature = "btree_range", since = "1.17.0")] impl<'a, K, V> DoubleEndedIterator for Range<'a, K, V> { fn next_back(&mut self) -> Option<(&'a K, &'a V)> { - if self.front == self.back { - None - } else { - unsafe { Some(self.next_back_unchecked()) } - } + if self.front == self.back { None } else { unsafe { Some(self.next_back_unchecked()) } } } } @@ -1746,10 +1698,7 @@ impl FusedIterator for Range<'_, K, V> {} #[stable(feature = "btree_range", since = "1.17.0")] impl Clone for Range<'_, K, V> { fn clone(&self) -> Self { - Range { - front: self.front, - back: self.back, - } + Range { front: self.front, back: self.back } } } @@ -1758,11 +1707,7 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> { type Item = (&'a K, &'a mut V); fn next(&mut self) -> Option<(&'a K, &'a mut V)> { - if self.front == self.back { - None - } else { - unsafe { Some(self.next_unchecked()) } - } + if self.front == self.back { None } else { unsafe { Some(self.next_unchecked()) } } } fn last(mut self) -> Option<(&'a K, &'a mut V)> { @@ -1809,11 +1754,7 @@ impl<'a, K, V> RangeMut<'a, K, V> { #[stable(feature = "btree_range", since = "1.17.0")] impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V> { fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> { - if self.front == self.back { - None - } else { - unsafe { Some(self.next_back_unchecked()) } - } + if self.front == self.back { None } else { unsafe { Some(self.next_back_unchecked()) } } } } @@ -1934,8 +1875,9 @@ impl Debug for BTreeMap { #[stable(feature = "rust1", since = "1.0.0")] impl Index<&Q> for BTreeMap - where K: Borrow, - Q: Ord +where + K: Borrow, + Q: Ord, { type Output = V; @@ -1950,9 +1892,9 @@ impl Index<&Q> for BTreeMap } } -fn first_leaf_edge - (mut node: NodeRef) - -> Handle, marker::Edge> { +fn first_leaf_edge( + mut node: NodeRef, +) -> Handle, marker::Edge> { loop { match node.force() { Leaf(leaf) => return leaf.first_edge(), @@ -1963,9 +1905,9 @@ fn first_leaf_edge } } -fn last_leaf_edge - (mut node: NodeRef) - -> Handle, marker::Edge> { +fn last_leaf_edge( + mut node: NodeRef, +) -> Handle, marker::Edge> { loop { match node.force() { Leaf(leaf) => return leaf.last_edge(), @@ -1979,20 +1921,28 @@ fn last_leaf_edge fn range_search>( root1: NodeRef, root2: NodeRef, - range: R -)-> (Handle, marker::Edge>, - Handle, marker::Edge>) - where Q: Ord, K: Borrow + range: R, +) -> ( + Handle, marker::Edge>, + Handle, marker::Edge>, +) +where + Q: Ord, + K: Borrow, { match (range.start_bound(), range.end_bound()) { - (Excluded(s), Excluded(e)) if s==e => - panic!("range start and end are equal and excluded in BTreeMap"), - (Included(s), Included(e)) | - (Included(s), Excluded(e)) | - (Excluded(s), Included(e)) | - (Excluded(s), Excluded(e)) if s>e => - panic!("range start is greater than range end in BTreeMap"), - _ => {}, + (Excluded(s), Excluded(e)) if s == e => { + panic!("range start and end are equal and excluded in BTreeMap") + } + (Included(s), Included(e)) + | (Included(s), Excluded(e)) + | (Excluded(s), Included(e)) + | (Excluded(s), Excluded(e)) + if s > e => + { + panic!("range start is greater than range end in BTreeMap") + } + _ => {} }; let mut min_node = root1; @@ -2004,35 +1954,51 @@ fn range_search>( loop { let min_edge = match (min_found, range.start_bound()) { (false, Included(key)) => match search::search_linear(&min_node, key) { - (i, true) => { min_found = true; i }, + (i, true) => { + min_found = true; + i + } (i, false) => i, }, (false, Excluded(key)) => match search::search_linear(&min_node, key) { - (i, true) => { min_found = true; i+1 }, + (i, true) => { + min_found = true; + i + 1 + } (i, false) => i, }, (_, Unbounded) => 0, - (true, Included(_)) => min_node.keys().len(), + (true, Included(_)) => min_node.len(), (true, Excluded(_)) => 0, }; let max_edge = match (max_found, range.end_bound()) { (false, Included(key)) => match search::search_linear(&max_node, key) { - (i, true) => { max_found = true; i+1 }, + (i, true) => { + max_found = true; + i + 1 + } (i, false) => i, }, (false, Excluded(key)) => match search::search_linear(&max_node, key) { - (i, true) => { max_found = true; i }, + (i, true) => { + max_found = true; + i + } (i, false) => i, }, - (_, Unbounded) => max_node.keys().len(), + (_, Unbounded) => max_node.len(), (true, Included(_)) => 0, - (true, Excluded(_)) => max_node.keys().len(), + (true, Excluded(_)) => max_node.len(), }; if !diverged { - if max_edge < min_edge { panic!("Ord is ill-defined in BTreeMap range") } - if min_edge != max_edge { diverged = true; } + if max_edge < min_edge { + panic!("Ord is ill-defined in BTreeMap range") + } + if min_edge != max_edge { + diverged = true; + } } let front = Handle::new_edge(min_node, min_edge); @@ -2040,11 +2006,11 @@ fn range_search>( match (front.force(), back.force()) { (Leaf(f), Leaf(b)) => { return (f, b); - }, + } (Internal(min_int), Internal(max_int)) => { min_node = min_int.descend(); max_node = max_int.descend(); - }, + } _ => unreachable!("BTreeMap has different depths"), }; } @@ -2321,13 +2287,14 @@ impl<'a, K: Ord, V> Entry<'a, K, V> { /// ``` #[stable(feature = "entry_and_modify", since = "1.26.0")] pub fn and_modify(self, f: F) -> Self - where F: FnOnce(&mut V) + where + F: FnOnce(&mut V), { match self { Occupied(mut entry) => { f(entry.get_mut()); Occupied(entry) - }, + } Vacant(entry) => Vacant(entry), } } @@ -2354,7 +2321,6 @@ impl<'a, K: Ord, V: Default> Entry<'a, K, V> { Vacant(entry) => entry.insert(Default::default()), } } - } impl<'a, K: Ord, V> VacantEntry<'a, K, V> { @@ -2433,17 +2399,15 @@ impl<'a, K: Ord, V> VacantEntry<'a, K, V> { loop { match cur_parent { - Ok(parent) => { - match parent.insert(ins_k, ins_v, ins_edge) { - Fit(_) => return unsafe { &mut *out_ptr }, - Split(left, k, v, right) => { - ins_k = k; - ins_v = v; - ins_edge = right; - cur_parent = left.ascend().map_err(|n| n.into_root_mut()); - } + Ok(parent) => match parent.insert(ins_k, ins_v, ins_edge) { + Fit(_) => return unsafe { &mut *out_ptr }, + Split(left, k, v, right) => { + ins_k = k; + ins_v = v; + ins_edge = right; + cur_parent = left.ascend().map_err(|n| n.into_root_mut()); } - } + }, Err(root) => { root.push_level().push(ins_k, ins_v, ins_edge); return unsafe { &mut *out_ptr }; @@ -2641,7 +2605,7 @@ impl<'a, K: Ord, V> OccupiedEntry<'a, K, V> { // Handle underflow let mut cur_node = small_leaf.forget_type(); - while cur_node.len() < node::CAPACITY / 2 { + while cur_node.len() < node::MIN_LEN { match handle_underfull_node(cur_node) { AtRoot => break, EmptyParent(_) => unreachable!(), @@ -2669,8 +2633,9 @@ enum UnderflowResult<'a, K, V> { Stole(NodeRef, K, V, marker::Internal>), } -fn handle_underfull_node(node: NodeRef, K, V, marker::LeafOrInternal>) - -> UnderflowResult<'_, K, V> { +fn handle_underfull_node( + node: NodeRef, K, V, marker::LeafOrInternal>, +) -> UnderflowResult<'_, K, V> { let parent = if let Ok(parent) = node.ascend() { parent } else { @@ -2679,14 +2644,12 @@ fn handle_underfull_node(node: NodeRef, K, V, marker::Leaf let (is_left, mut handle) = match parent.left_kv() { Ok(left) => (true, left), - Err(parent) => { - match parent.right_kv() { - Ok(right) => (false, right), - Err(parent) => { - return EmptyParent(parent.into_node()); - } + Err(parent) => match parent.right_kv() { + Ok(right) => (false, right), + Err(parent) => { + return EmptyParent(parent.into_node()); } - } + }, }; if handle.can_merge() { diff --git a/src/liballoc/collections/btree/node.rs b/src/liballoc/collections/btree/node.rs index ab010b35f6..d9cdebb4f7 100644 --- a/src/liballoc/collections/btree/node.rs +++ b/src/liballoc/collections/btree/node.rs @@ -33,10 +33,10 @@ use core::marker::PhantomData; use core::mem::{self, MaybeUninit}; -use core::ptr::{self, Unique, NonNull}; +use core::ptr::{self, NonNull, Unique}; use core::slice; -use crate::alloc::{Global, Alloc, Layout}; +use crate::alloc::{Alloc, Global, Layout}; use crate::boxed::Box; const B: usize = 6; @@ -54,10 +54,8 @@ pub const CAPACITY: usize = 2 * B - 1; /// `NodeHeader` because we do not want unnecessary padding between `len` and the keys. /// Crucially, `NodeHeader` can be safely transmuted to different K and V. (This is exploited /// by `as_header`.) -/// See `into_key_slice` for an explanation of K2. K2 cannot be safely transmuted around -/// because the size of `NodeHeader` depends on its alignment! #[repr(C)] -struct NodeHeader { +struct NodeHeader { /// We use `*const` as opposed to `*mut` so as to be covariant in `K` and `V`. /// This either points to an actual node or is null. parent: *const InternalNode, @@ -72,9 +70,6 @@ struct NodeHeader { /// This next to `parent_idx` to encourage the compiler to join `len` and /// `parent_idx` into the same 32-bit word, reducing space overhead. len: u16, - - /// See `into_key_slice`. - keys_start: [K2; 0], } #[repr(C)] struct LeafNode { @@ -110,7 +105,7 @@ impl LeafNode { vals: [MaybeUninit::UNINIT; CAPACITY], parent: ptr::null(), parent_idx: MaybeUninit::uninit(), - len: 0 + len: 0, } } } @@ -127,12 +122,8 @@ unsafe impl Sync for NodeHeader<(), ()> {} // An empty node used as a placeholder for the root node, to avoid allocations. // We use just a header in order to save space, since no operation on an empty tree will // ever take a pointer past the first key. -static EMPTY_ROOT_NODE: NodeHeader<(), ()> = NodeHeader { - parent: ptr::null(), - parent_idx: MaybeUninit::uninit(), - len: 0, - keys_start: [], -}; +static EMPTY_ROOT_NODE: NodeHeader<(), ()> = + NodeHeader { parent: ptr::null(), parent_idx: MaybeUninit::uninit(), len: 0 }; /// The underlying representation of internal nodes. As with `LeafNode`s, these should be hidden /// behind `BoxedNode`s to prevent dropping uninitialized keys and values. Any pointer to an @@ -157,10 +148,7 @@ impl InternalNode { /// `len` of 0), there must be one initialized and valid edge. This function does not set up /// such an edge. unsafe fn new() -> Self { - InternalNode { - data: LeafNode::new(), - edges: [MaybeUninit::UNINIT; 2*B] - } + InternalNode { data: LeafNode::new(), edges: [MaybeUninit::UNINIT; 2 * B] } } } @@ -169,7 +157,7 @@ impl InternalNode { /// of nodes is actually behind the box, and, partially due to this lack of information, has no /// destructor. struct BoxedNode { - ptr: Unique> + ptr: Unique>, } impl BoxedNode { @@ -196,11 +184,11 @@ impl BoxedNode { /// and must be cleaned up manually. pub struct Root { node: BoxedNode, - height: usize + height: usize, } -unsafe impl Sync for Root { } -unsafe impl Send for Root { } +unsafe impl Sync for Root {} +unsafe impl Send for Root {} impl Root { pub fn is_shared_root(&self) -> bool { @@ -211,7 +199,7 @@ impl Root { Root { node: unsafe { BoxedNode::from_ptr(NonNull::new_unchecked( - &EMPTY_ROOT_NODE as *const _ as *const LeafNode as *mut _ + &EMPTY_ROOT_NODE as *const _ as *const LeafNode as *mut _, )) }, height: 0, @@ -219,14 +207,10 @@ impl Root { } pub fn new_leaf() -> Self { - Root { - node: BoxedNode::from_leaf(Box::new(unsafe { LeafNode::new() })), - height: 0 - } + Root { node: BoxedNode::from_leaf(Box::new(unsafe { LeafNode::new() })), height: 0 } } - pub fn as_ref(&self) - -> NodeRef, K, V, marker::LeafOrInternal> { + pub fn as_ref(&self) -> NodeRef, K, V, marker::LeafOrInternal> { NodeRef { height: self.height, node: self.node.as_ptr(), @@ -235,8 +219,7 @@ impl Root { } } - pub fn as_mut(&mut self) - -> NodeRef, K, V, marker::LeafOrInternal> { + pub fn as_mut(&mut self) -> NodeRef, K, V, marker::LeafOrInternal> { NodeRef { height: self.height, node: self.node.as_ptr(), @@ -245,8 +228,7 @@ impl Root { } } - pub fn into_ref(self) - -> NodeRef { + pub fn into_ref(self) -> NodeRef { NodeRef { height: self.height, node: self.node.as_ptr(), @@ -257,8 +239,7 @@ impl Root { /// Adds a new internal node with a single edge, pointing to the previous root, and make that /// new node the root. This increases the height by 1 and is the opposite of `pop_level`. - pub fn push_level(&mut self) - -> NodeRef, K, V, marker::Internal> { + pub fn push_level(&mut self) -> NodeRef, K, V, marker::Internal> { debug_assert!(!self.is_shared_root()); let mut new_node = Box::new(unsafe { InternalNode::new() }); new_node.edges[0].write(unsafe { BoxedNode::from_ptr(self.node.as_ptr()) }); @@ -270,7 +251,7 @@ impl Root { height: self.height, node: self.node.as_ptr(), root: self as *mut _, - _marker: PhantomData + _marker: PhantomData, }; unsafe { @@ -290,14 +271,14 @@ impl Root { let top = self.node.ptr; self.node = unsafe { - BoxedNode::from_ptr(self.as_mut() - .cast_unchecked::() - .first_edge() - .descend() - .node) + BoxedNode::from_ptr( + self.as_mut().cast_unchecked::().first_edge().descend().node, + ) }; self.height -= 1; - unsafe { (*self.as_mut().as_leaf_mut()).parent = ptr::null(); } + unsafe { + (*self.as_mut().as_leaf_mut()).parent = ptr::null(); + } unsafe { Global.dealloc(NonNull::from(top).cast(), Layout::new::>()); @@ -322,53 +303,44 @@ impl Root { /// `Leaf`, the `NodeRef` points to a leaf node, when this is `Internal` the /// `NodeRef` points to an internal node, and when this is `LeafOrInternal` the /// `NodeRef` could be pointing to either type of node. -/// Note that in case of a leaf node, this might still be the shared root! Only turn -/// this into a `LeafNode` reference if you know it is not a root! Shared references -/// must be dereferencable *for the entire size of their pointee*, so `&InternalNode` -/// pointing to the shared root is UB. -/// Turning this into a `NodeHeader` is always safe. +/// Note that in case of a leaf node, this might still be the shared root! +/// Only turn this into a `LeafNode` reference if you know it is not the shared root! +/// Shared references must be dereferencable *for the entire size of their pointee*, +/// so '&LeafNode` or `&InternalNode` pointing to the shared root is undefined behavior. +/// Turning this into a `NodeHeader` reference is always safe. pub struct NodeRef { height: usize, node: NonNull>, - // This is null unless the borrow type is `Mut` + // `root` is null unless the borrow type is `Mut` root: *const Root, - _marker: PhantomData<(BorrowType, Type)> + _marker: PhantomData<(BorrowType, Type)>, } -impl<'a, K: 'a, V: 'a, Type> Copy for NodeRef, K, V, Type> { } +impl<'a, K: 'a, V: 'a, Type> Copy for NodeRef, K, V, Type> {} impl<'a, K: 'a, V: 'a, Type> Clone for NodeRef, K, V, Type> { fn clone(&self) -> Self { *self } } -unsafe impl Sync - for NodeRef { } +unsafe impl Sync for NodeRef {} -unsafe impl<'a, K: Sync + 'a, V: Sync + 'a, Type> Send - for NodeRef, K, V, Type> { } -unsafe impl<'a, K: Send + 'a, V: Send + 'a, Type> Send - for NodeRef, K, V, Type> { } -unsafe impl Send - for NodeRef { } +unsafe impl<'a, K: Sync + 'a, V: Sync + 'a, Type> Send for NodeRef, K, V, Type> {} +unsafe impl<'a, K: Send + 'a, V: Send + 'a, Type> Send for NodeRef, K, V, Type> {} +unsafe impl Send for NodeRef {} impl NodeRef { fn as_internal(&self) -> &InternalNode { - unsafe { - &*(self.node.as_ptr() as *mut InternalNode) - } + unsafe { &*(self.node.as_ptr() as *mut InternalNode) } } } impl<'a, K, V> NodeRef, K, V, marker::Internal> { fn as_internal_mut(&mut self) -> &mut InternalNode { - unsafe { - &mut *(self.node.as_ptr() as *mut InternalNode) - } + unsafe { &mut *(self.node.as_ptr() as *mut InternalNode) } } } - impl NodeRef { /// Finds the length of the node. This is the number of keys or values. In an /// internal node, the number of edges is `len() + 1`. @@ -385,43 +357,41 @@ impl NodeRef { /// Removes any static information about whether this node is a `Leaf` or an /// `Internal` node. pub fn forget_type(self) -> NodeRef { - NodeRef { - height: self.height, - node: self.node, - root: self.root, - _marker: PhantomData - } + NodeRef { height: self.height, node: self.node, root: self.root, _marker: PhantomData } } /// Temporarily takes out another, immutable reference to the same node. fn reborrow(&self) -> NodeRef, K, V, Type> { - NodeRef { - height: self.height, - node: self.node, - root: self.root, - _marker: PhantomData - } + NodeRef { height: self.height, node: self.node, root: self.root, _marker: PhantomData } } - /// Assert that this is indeed a proper leaf node, and not the shared root. + /// Exposes the leaf "portion" of any leaf or internal node that is not the shared root. + /// If the node is a leaf, this function simply opens up its data. + /// If the node is an internal node, so not a leaf, it does have all the data a leaf has + /// (header, keys and values), and this function exposes that. + /// See `NodeRef` on why the node may not be a shared root. unsafe fn as_leaf(&self) -> &LeafNode { + debug_assert!(!self.is_shared_root()); self.node.as_ref() } fn as_header(&self) -> &NodeHeader { - unsafe { - &*(self.node.as_ptr() as *const NodeHeader) - } + unsafe { &*(self.node.as_ptr() as *const NodeHeader) } } + /// Returns whether the node is the shared, empty root. pub fn is_shared_root(&self) -> bool { self.as_header().is_shared_root() } - pub fn keys(&self) -> &[K] { + /// Borrows a view into the keys stored in the node. + /// The caller must ensure that the node is not the shared root. + pub unsafe fn keys(&self) -> &[K] { self.reborrow().into_key_slice() } + /// Borrows a view into the values stored in the node. + /// The caller must ensure that the node is not the shared root. fn vals(&self) -> &[V] { self.reborrow().into_val_slice() } @@ -433,17 +403,9 @@ impl NodeRef { /// /// `edge.descend().ascend().unwrap()` and `node.ascend().unwrap().descend()` should /// both, upon success, do nothing. - pub fn ascend(self) -> Result< - Handle< - NodeRef< - BorrowType, - K, V, - marker::Internal - >, - marker::Edge - >, - Self - > { + pub fn ascend( + self, + ) -> Result, marker::Edge>, Self> { let parent_as_leaf = self.as_header().parent as *const LeafNode; if let Some(non_zero) = NonNull::new(parent_as_leaf as *mut _) { Ok(Handle { @@ -451,10 +413,10 @@ impl NodeRef { height: self.height + 1, node: non_zero, root: self.root, - _marker: PhantomData + _marker: PhantomData, }, idx: unsafe { usize::from(*self.as_header().parent_idx.as_ptr()) }, - _marker: PhantomData + _marker: PhantomData, }) } else { Err(self) @@ -488,16 +450,9 @@ impl NodeRef { /// Similar to `ascend`, gets a reference to a node's parent node, but also /// deallocate the current node in the process. This is unsafe because the /// current node will still be accessible despite being deallocated. - pub unsafe fn deallocate_and_ascend(self) -> Option< - Handle< - NodeRef< - marker::Owned, - K, V, - marker::Internal - >, - marker::Edge - > - > { + pub unsafe fn deallocate_and_ascend( + self, + ) -> Option, marker::Edge>> { debug_assert!(!self.is_shared_root()); let node = self.node; let ret = self.ascend().ok(); @@ -510,16 +465,9 @@ impl NodeRef { /// Similar to `ascend`, gets a reference to a node's parent node, but also /// deallocate the current node in the process. This is unsafe because the /// current node will still be accessible despite being deallocated. - pub unsafe fn deallocate_and_ascend(self) -> Option< - Handle< - NodeRef< - marker::Owned, - K, V, - marker::Internal - >, - marker::Edge - > - > { + pub unsafe fn deallocate_and_ascend( + self, + ) -> Option, marker::Edge>> { let node = self.node; let ret = self.ascend().ok(); Global.dealloc(node.cast(), Layout::new::>()); @@ -530,15 +478,8 @@ impl NodeRef { impl<'a, K, V, Type> NodeRef, K, V, Type> { /// Unsafely asserts to the compiler some static information about whether this /// node is a `Leaf`. - unsafe fn cast_unchecked(&mut self) - -> NodeRef, K, V, NewType> { - - NodeRef { - height: self.height, - node: self.node, - root: self.root, - _marker: PhantomData - } + unsafe fn cast_unchecked(&mut self) -> NodeRef, K, V, NewType> { + NodeRef { height: self.height, node: self.node, root: self.root, _marker: PhantomData } } /// Temporarily takes out another, mutable reference to the same node. Beware, as @@ -552,86 +493,51 @@ impl<'a, K, V, Type> NodeRef, K, V, Type> { // FIXME(@gereeter) consider adding yet another type parameter to `NodeRef` that restricts // the use of `ascend` and `into_root_mut` on reborrowed pointers, preventing this unsafety. unsafe fn reborrow_mut(&mut self) -> NodeRef, K, V, Type> { - NodeRef { - height: self.height, - node: self.node, - root: self.root, - _marker: PhantomData - } + NodeRef { height: self.height, node: self.node, root: self.root, _marker: PhantomData } } + /// Exposes the leaf "portion" of any leaf or internal node for writing. + /// If the node is a leaf, this function simply opens up its data. + /// If the node is an internal node, so not a leaf, it does have all the data a leaf has + /// (header, keys and values), and this function exposes that. + /// /// Returns a raw ptr to avoid asserting exclusive access to the entire node. + /// This also implies you can invoke this member on the shared root, but the resulting pointer + /// might not be properly aligned and definitely would not allow accessing keys and values. fn as_leaf_mut(&mut self) -> *mut LeafNode { - // We are mutable, so we cannot be the root, so accessing this as a leaf is okay. self.node.as_ptr() } + /// The caller must ensure that the node is not the shared root. fn keys_mut(&mut self) -> &mut [K] { unsafe { self.reborrow_mut().into_key_slice_mut() } } + /// The caller must ensure that the node is not the shared root. fn vals_mut(&mut self) -> &mut [V] { unsafe { self.reborrow_mut().into_val_slice_mut() } } } impl<'a, K: 'a, V: 'a, Type> NodeRef, K, V, Type> { - fn into_key_slice(self) -> &'a [K] { - // We have to be careful here because we might be pointing to the shared root. - // In that case, we must not create an `&LeafNode`. We could just return - // an empty slice whenever the length is 0 (this includes the shared root), - // but we want to avoid that run-time check. - // Instead, we create a slice pointing into the node whenever possible. - // We can sometimes do this even for the shared root, as the slice will be - // empty. We cannot *always* do this because if the type is too highly - // aligned, the offset of `keys` in a "full node" might be outside the bounds - // of the header! So we do an alignment check first, that will be - // evaluated at compile-time, and only do any run-time check in the rare case - // that the alignment is very big. - if mem::align_of::() > mem::align_of::>() && self.is_shared_root() { - &[] - } else { - // Thanks to the alignment check above, we know that `keys` will be - // in-bounds of some allocation even if this is the shared root! - // (We might be one-past-the-end, but that is allowed by LLVM.) - // Getting the pointer is tricky though. `NodeHeader` does not have a `keys` - // field because we want its size to not depend on the alignment of `K` - // (needed because `as_header` should be safe). We cannot call `as_leaf` - // because we might be the shared root. - // For this reason, `NodeHeader` has this `K2` parameter (that's usually `()` - // and hence just adds a size-0-align-1 field, not affecting layout). - // We know that we can transmute `NodeHeader` to `NodeHeader` - // because we did the alignment check above, and hence `NodeHeader` - // is not bigger than `NodeHeader`! Then we can use `NodeHeader` - // to compute the pointer where the keys start. - // This entire hack will become unnecessary once - // lands, then we can just take a raw - // pointer to the `keys` field of `*const InternalNode`. - - // This is a non-debug-assert because it can be completely compile-time evaluated. - assert!(mem::size_of::>() == mem::size_of::>()); - let header = self.as_header() as *const _ as *const NodeHeader; - let keys = unsafe { &(*header).keys_start as *const _ as *const K }; - unsafe { - slice::from_raw_parts(keys, self.len()) - } - } + /// The caller must ensure that the node is not the shared root. + unsafe fn into_key_slice(self) -> &'a [K] { + debug_assert!(!self.is_shared_root()); + // We cannot be the shared root, so `as_leaf` is okay. + slice::from_raw_parts(MaybeUninit::first_ptr(&self.as_leaf().keys), self.len()) } + /// The caller must ensure that the node is not the shared root. fn into_val_slice(self) -> &'a [V] { debug_assert!(!self.is_shared_root()); - // We cannot be the root, so `as_leaf` is okay - unsafe { - slice::from_raw_parts( - MaybeUninit::first_ptr(&self.as_leaf().vals), - self.len() - ) - } + // We cannot be the shared root, so `as_leaf` is okay. + unsafe { slice::from_raw_parts(MaybeUninit::first_ptr(&self.as_leaf().vals), self.len()) } } + /// The caller must ensure that the node is not the shared root. fn into_slices(self) -> (&'a [K], &'a [V]) { let k = unsafe { ptr::read(&self) }; - (k.into_key_slice(), self.into_val_slice()) + (unsafe { k.into_key_slice() }, self.into_val_slice()) } } @@ -639,36 +545,33 @@ impl<'a, K: 'a, V: 'a, Type> NodeRef, K, V, Type> { /// Gets a mutable reference to the root itself. This is useful primarily when the /// height of the tree needs to be adjusted. Never call this on a reborrowed pointer. pub fn into_root_mut(self) -> &'a mut Root { - unsafe { - &mut *(self.root as *mut Root) - } + unsafe { &mut *(self.root as *mut Root) } } + /// The caller must ensure that the node is not the shared root. fn into_key_slice_mut(mut self) -> &'a mut [K] { - // Same as for `into_key_slice` above, we try to avoid a run-time check - // (the alignment comparison will usually be performed at compile-time). - if mem::align_of::() > mem::align_of::>() && self.is_shared_root() { - &mut [] - } else { - unsafe { - slice::from_raw_parts_mut( - MaybeUninit::first_ptr_mut(&mut (*self.as_leaf_mut()).keys), - self.len() - ) - } + debug_assert!(!self.is_shared_root()); + // We cannot be the shared root, so `as_leaf_mut` is okay. + unsafe { + slice::from_raw_parts_mut( + MaybeUninit::first_ptr_mut(&mut (*self.as_leaf_mut()).keys), + self.len(), + ) } } + /// The caller must ensure that the node is not the shared root. fn into_val_slice_mut(mut self) -> &'a mut [V] { debug_assert!(!self.is_shared_root()); unsafe { slice::from_raw_parts_mut( MaybeUninit::first_ptr_mut(&mut (*self.as_leaf_mut()).vals), - self.len() + self.len(), ) } } + /// The caller must ensure that the node is not the shared root. fn into_slices_mut(mut self) -> (&'a mut [K], &'a mut [V]) { debug_assert!(!self.is_shared_root()); // We cannot use the getters here, because calling the second one @@ -679,14 +582,10 @@ impl<'a, K: 'a, V: 'a, Type> NodeRef, K, V, Type> { unsafe { let len = self.len(); let leaf = self.as_leaf_mut(); - let keys = slice::from_raw_parts_mut( - MaybeUninit::first_ptr_mut(&mut (*leaf).keys), - len - ); - let vals = slice::from_raw_parts_mut( - MaybeUninit::first_ptr_mut(&mut (*leaf).vals), - len - ); + let keys = + slice::from_raw_parts_mut(MaybeUninit::first_ptr_mut(&mut (*leaf).keys), len); + let vals = + slice::from_raw_parts_mut(MaybeUninit::first_ptr_mut(&mut (*leaf).vals), len); (keys, vals) } } @@ -731,6 +630,7 @@ impl<'a, K, V> NodeRef, K, V, marker::Internal> { // Necessary for correctness, but this is an internal module debug_assert!(edge.height == self.height - 1); debug_assert!(self.len() < CAPACITY); + debug_assert!(!self.is_shared_root()); let idx = self.len(); @@ -762,6 +662,7 @@ impl<'a, K, V> NodeRef, K, V, marker::Internal> { // Necessary for correctness, but this is an internal module debug_assert!(edge.height == self.height - 1); debug_assert!(self.len() < CAPACITY); + debug_assert!(!self.is_shared_root()); unsafe { slice_insert(self.keys_mut(), 0, key); @@ -769,10 +670,10 @@ impl<'a, K, V> NodeRef, K, V, marker::Internal> { slice_insert( slice::from_raw_parts_mut( MaybeUninit::first_ptr_mut(&mut self.as_internal_mut().edges), - self.len()+1 + self.len() + 1, ), 0, - edge.node + edge.node, ); (*self.as_leaf_mut()).len += 1; @@ -797,9 +698,8 @@ impl<'a, K, V> NodeRef, K, V, marker::LeafOrInternal> { let edge = match self.reborrow_mut().force() { ForceResult::Leaf(_) => None, ForceResult::Internal(internal) => { - let edge = ptr::read( - internal.as_internal().edges.get_unchecked(idx + 1).as_ptr() - ); + let edge = + ptr::read(internal.as_internal().edges.get_unchecked(idx + 1).as_ptr()); let mut new_root = Root { node: edge, height: internal.height - 1 }; (*new_root.as_mut().as_leaf_mut()).parent = ptr::null(); Some(new_root) @@ -828,9 +728,9 @@ impl<'a, K, V> NodeRef, K, V, marker::LeafOrInternal> { let edge = slice_remove( slice::from_raw_parts_mut( MaybeUninit::first_ptr_mut(&mut internal.as_internal_mut().edges), - old_len+1 + old_len + 1, ), - 0 + 0, ); let mut new_root = Root { node: edge, height: internal.height - 1 }; @@ -850,33 +750,33 @@ impl<'a, K, V> NodeRef, K, V, marker::LeafOrInternal> { } } + /// The caller must ensure that the node is not the shared root. fn into_kv_pointers_mut(mut self) -> (*mut K, *mut V) { - ( - self.keys_mut().as_mut_ptr(), - self.vals_mut().as_mut_ptr() - ) + (self.keys_mut().as_mut_ptr(), self.vals_mut().as_mut_ptr()) } } impl NodeRef { /// Checks whether a node is an `Internal` node or a `Leaf` node. - pub fn force(self) -> ForceResult< + pub fn force( + self, + ) -> ForceResult< NodeRef, - NodeRef + NodeRef, > { if self.height == 0 { ForceResult::Leaf(NodeRef { height: self.height, node: self.node, root: self.root, - _marker: PhantomData + _marker: PhantomData, }) } else { ForceResult::Internal(NodeRef { height: self.height, node: self.node, root: self.root, - _marker: PhantomData + _marker: PhantomData, }) } } @@ -893,10 +793,10 @@ impl NodeRef { pub struct Handle { node: Node, idx: usize, - _marker: PhantomData + _marker: PhantomData, } -impl Copy for Handle { } +impl Copy for Handle {} // We don't need the full generality of `#[derive(Clone)]`, as the only time `Node` will be // `Clone`able is when it is an immutable reference and therefore `Copy`. impl Clone for Handle { @@ -918,11 +818,7 @@ impl Handle, mar // Necessary for correctness, but in a private module debug_assert!(idx < node.len()); - Handle { - node, - idx, - _marker: PhantomData - } + Handle { node, idx, _marker: PhantomData } } pub fn left_edge(self) -> Handle, marker::Edge> { @@ -935,32 +831,24 @@ impl Handle, mar } impl PartialEq - for Handle, HandleType> { - + for Handle, HandleType> +{ fn eq(&self, other: &Self) -> bool { self.node.node == other.node.node && self.idx == other.idx } } impl - Handle, HandleType> { - + Handle, HandleType> +{ /// Temporarily takes out another, immutable handle on the same location. - pub fn reborrow(&self) - -> Handle, K, V, NodeType>, HandleType> { - + pub fn reborrow(&self) -> Handle, K, V, NodeType>, HandleType> { // We can't use Handle::new_kv or Handle::new_edge because we don't know our type - Handle { - node: self.node.reborrow(), - idx: self.idx, - _marker: PhantomData - } + Handle { node: self.node.reborrow(), idx: self.idx, _marker: PhantomData } } } -impl<'a, K, V, NodeType, HandleType> - Handle, K, V, NodeType>, HandleType> { - +impl<'a, K, V, NodeType, HandleType> Handle, K, V, NodeType>, HandleType> { /// Temporarily takes out another, mutable handle on the same location. Beware, as /// this method is very dangerous, doubly so since it may not immediately appear /// dangerous. @@ -971,52 +859,30 @@ impl<'a, K, V, NodeType, HandleType> /// of a reborrowed handle, out of bounds. // FIXME(@gereeter) consider adding yet another type parameter to `NodeRef` that restricts // the use of `ascend` and `into_root_mut` on reborrowed pointers, preventing this unsafety. - pub unsafe fn reborrow_mut(&mut self) - -> Handle, K, V, NodeType>, HandleType> { - + pub unsafe fn reborrow_mut( + &mut self, + ) -> Handle, K, V, NodeType>, HandleType> { // We can't use Handle::new_kv or Handle::new_edge because we don't know our type - Handle { - node: self.node.reborrow_mut(), - idx: self.idx, - _marker: PhantomData - } + Handle { node: self.node.reborrow_mut(), idx: self.idx, _marker: PhantomData } } } -impl - Handle, marker::Edge> { - +impl Handle, marker::Edge> { /// Creates a new handle to an edge in `node`. `idx` must be less than or equal to /// `node.len()`. pub fn new_edge(node: NodeRef, idx: usize) -> Self { // Necessary for correctness, but in a private module debug_assert!(idx <= node.len()); - Handle { - node, - idx, - _marker: PhantomData - } + Handle { node, idx, _marker: PhantomData } } - pub fn left_kv(self) - -> Result, marker::KV>, Self> { - - if self.idx > 0 { - Ok(Handle::new_kv(self.node, self.idx - 1)) - } else { - Err(self) - } + pub fn left_kv(self) -> Result, marker::KV>, Self> { + if self.idx > 0 { Ok(Handle::new_kv(self.node, self.idx - 1)) } else { Err(self) } } - pub fn right_kv(self) - -> Result, marker::KV>, Self> { - - if self.idx < self.node.len() { - Ok(Handle::new_kv(self.node, self.idx)) - } else { - Err(self) - } + pub fn right_kv(self) -> Result, marker::KV>, Self> { + if self.idx < self.node.len() { Ok(Handle::new_kv(self.node, self.idx)) } else { Err(self) } } } @@ -1045,9 +911,7 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::Edge /// this edge. This method splits the node if there isn't enough room. /// /// The returned pointer points to the inserted value. - pub fn insert(mut self, key: K, val: V) - -> (InsertResult<'a, K, V, marker::Leaf>, *mut V) { - + pub fn insert(mut self, key: K, val: V) -> (InsertResult<'a, K, V, marker::Leaf>, *mut V) { if self.node.len() < CAPACITY { let ptr = self.insert_fit(key, val); (InsertResult::Fit(Handle::new_kv(self.node, self.idx)), ptr) @@ -1055,15 +919,14 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::Edge let middle = Handle::new_kv(self.node, B); let (mut left, k, v, mut right) = middle.split(); let ptr = if self.idx <= B { - unsafe { - Handle::new_edge(left.reborrow_mut(), self.idx).insert_fit(key, val) - } + unsafe { Handle::new_edge(left.reborrow_mut(), self.idx).insert_fit(key, val) } } else { unsafe { Handle::new_edge( right.as_mut().cast_unchecked::(), - self.idx - (B + 1) - ).insert_fit(key, val) + self.idx - (B + 1), + ) + .insert_fit(key, val) } }; (InsertResult::Split(left, k, v, right), ptr) @@ -1086,9 +949,9 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: /// Unsafely asserts to the compiler some static information about whether the underlying /// node of this handle is a `Leaf`. - unsafe fn cast_unchecked(&mut self) - -> Handle, K, V, NewType>, marker::Edge> { - + unsafe fn cast_unchecked( + &mut self, + ) -> Handle, K, V, NewType>, marker::Edge> { Handle::new_edge(self.node.cast_unchecked(), self.idx) } @@ -1107,13 +970,13 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: slice_insert( slice::from_raw_parts_mut( MaybeUninit::first_ptr_mut(&mut self.node.as_internal_mut().edges), - self.node.len() + self.node.len(), ), self.idx + 1, - edge.node + edge.node, ); - for i in (self.idx+1)..(self.node.len()+1) { + for i in (self.idx + 1)..(self.node.len() + 1) { Handle::new_edge(self.node.reborrow_mut(), i).correct_parent_link(); } } @@ -1122,9 +985,12 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: /// Inserts a new key/value pair and an edge that will go to the right of that new pair /// between this edge and the key/value pair to the right of this edge. This method splits /// the node if there isn't enough room. - pub fn insert(mut self, key: K, val: V, edge: Root) - -> InsertResult<'a, K, V, marker::Internal> { - + pub fn insert( + mut self, + key: K, + val: V, + edge: Root, + ) -> InsertResult<'a, K, V, marker::Internal> { // Necessary for correctness, but this is an internal module debug_assert!(edge.height == self.node.height - 1); @@ -1142,8 +1008,9 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: unsafe { Handle::new_edge( right.as_mut().cast_unchecked::(), - self.idx - (B + 1) - ).insert_fit(key, val, edge); + self.idx - (B + 1), + ) + .insert_fit(key, val, edge); } } InsertResult::Split(left, k, v, right) @@ -1151,9 +1018,7 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: } } -impl - Handle, marker::Edge> { - +impl Handle, marker::Edge> { /// Finds the node pointed to by this edge. /// /// `edge.descend().ascend().unwrap()` and `node.ascend().unwrap().descend()` should @@ -1165,30 +1030,22 @@ impl (&*self.node.as_internal().edges.get_unchecked(self.idx).as_ptr()).as_ptr() }, root: self.node.root, - _marker: PhantomData + _marker: PhantomData, } } } -impl<'a, K: 'a, V: 'a, NodeType> - Handle, K, V, NodeType>, marker::KV> { - +impl<'a, K: 'a, V: 'a, NodeType> Handle, K, V, NodeType>, marker::KV> { pub fn into_kv(self) -> (&'a K, &'a V) { let (keys, vals) = self.node.into_slices(); - unsafe { - (keys.get_unchecked(self.idx), vals.get_unchecked(self.idx)) - } + unsafe { (keys.get_unchecked(self.idx), vals.get_unchecked(self.idx)) } } } -impl<'a, K: 'a, V: 'a, NodeType> - Handle, K, V, NodeType>, marker::KV> { - +impl<'a, K: 'a, V: 'a, NodeType> Handle, K, V, NodeType>, marker::KV> { pub fn into_kv_mut(self) -> (&'a mut K, &'a mut V) { let (keys, vals) = self.node.into_slices_mut(); - unsafe { - (keys.get_unchecked_mut(self.idx), vals.get_unchecked_mut(self.idx)) - } + unsafe { (keys.get_unchecked_mut(self.idx), vals.get_unchecked_mut(self.idx)) } } } @@ -1209,8 +1066,7 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::KV> /// - The key and value pointed to by this handle and extracted. /// - All the key/value pairs to the right of this handle are put into a newly /// allocated node. - pub fn split(mut self) - -> (NodeRef, K, V, marker::Leaf>, K, V, Root) { + pub fn split(mut self) -> (NodeRef, K, V, marker::Leaf>, K, V, Root) { debug_assert!(!self.node.is_shared_root()); unsafe { let mut new_node = Box::new(LeafNode::new()); @@ -1223,32 +1079,26 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::KV> ptr::copy_nonoverlapping( self.node.keys().as_ptr().add(self.idx + 1), new_node.keys.as_mut_ptr() as *mut K, - new_len + new_len, ); ptr::copy_nonoverlapping( self.node.vals().as_ptr().add(self.idx + 1), new_node.vals.as_mut_ptr() as *mut V, - new_len + new_len, ); (*self.node.as_leaf_mut()).len = self.idx as u16; new_node.len = new_len as u16; - ( - self.node, - k, v, - Root { - node: BoxedNode::from_leaf(new_node), - height: 0 - } - ) + (self.node, k, v, Root { node: BoxedNode::from_leaf(new_node), height: 0 }) } } - /// Removes the key/value pair pointed to by this handle, returning the edge between the - /// now adjacent key/value pairs to the left and right of this handle. - pub fn remove(mut self) - -> (Handle, K, V, marker::Leaf>, marker::Edge>, K, V) { + /// Removes the key/value pair pointed to by this handle and returns it, along with the edge + /// between the now adjacent key/value pairs (if any) to the left and right of this handle. + pub fn remove( + mut self, + ) -> (Handle, K, V, marker::Leaf>, marker::Edge>, K, V) { debug_assert!(!self.node.is_shared_root()); unsafe { let k = slice_remove(self.node.keys_mut(), self.idx); @@ -1267,8 +1117,7 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: /// - The key and value pointed to by this handle and extracted. /// - All the edges and key/value pairs to the right of this handle are put into /// a newly allocated node. - pub fn split(mut self) - -> (NodeRef, K, V, marker::Internal>, K, V, Root) { + pub fn split(mut self) -> (NodeRef, K, V, marker::Internal>, K, V, Root) { unsafe { let mut new_node = Box::new(InternalNode::new()); @@ -1281,36 +1130,29 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: ptr::copy_nonoverlapping( self.node.keys().as_ptr().add(self.idx + 1), new_node.data.keys.as_mut_ptr() as *mut K, - new_len + new_len, ); ptr::copy_nonoverlapping( self.node.vals().as_ptr().add(self.idx + 1), new_node.data.vals.as_mut_ptr() as *mut V, - new_len + new_len, ); ptr::copy_nonoverlapping( self.node.as_internal().edges.as_ptr().add(self.idx + 1), new_node.edges.as_mut_ptr(), - new_len + 1 + new_len + 1, ); (*self.node.as_leaf_mut()).len = self.idx as u16; new_node.data.len = new_len as u16; - let mut new_root = Root { - node: BoxedNode::from_internal(new_node), - height, - }; + let mut new_root = Root { node: BoxedNode::from_internal(new_node), height }; - for i in 0..(new_len+1) { + for i in 0..(new_len + 1) { Handle::new_edge(new_root.as_mut().cast_unchecked(), i).correct_parent_link(); } - ( - self.node, - k, v, - new_root - ) + (self.node, k, v, new_root) } } @@ -1318,17 +1160,10 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: /// a node to hold the combination of the nodes to the left and right of this handle along /// with the key/value pair at this handle. pub fn can_merge(&self) -> bool { - ( - self.reborrow() - .left_edge() - .descend() - .len() - + self.reborrow() - .right_edge() - .descend() - .len() - + 1 - ) <= CAPACITY + (self.reborrow().left_edge().descend().len() + + self.reborrow().right_edge().descend().len() + + 1) + <= CAPACITY } /// Combines the node immediately to the left of this handle, the key/value pair pointed @@ -1336,8 +1171,9 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: /// child of the underlying node, returning an edge referencing that new child. /// /// Assumes that this edge `.can_merge()`. - pub fn merge(mut self) - -> Handle, K, V, marker::Internal>, marker::Edge> { + pub fn merge( + mut self, + ) -> Handle, K, V, marker::Internal>, marker::Edge> { let self1 = unsafe { ptr::read(&self) }; let self2 = unsafe { ptr::read(&self) }; let mut left_node = self1.left_edge().descend(); @@ -1349,23 +1185,27 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: debug_assert!(left_len + right_len + 1 <= CAPACITY); unsafe { - ptr::write(left_node.keys_mut().get_unchecked_mut(left_len), - slice_remove(self.node.keys_mut(), self.idx)); + ptr::write( + left_node.keys_mut().get_unchecked_mut(left_len), + slice_remove(self.node.keys_mut(), self.idx), + ); ptr::copy_nonoverlapping( right_node.keys().as_ptr(), left_node.keys_mut().as_mut_ptr().add(left_len + 1), - right_len + right_len, + ); + ptr::write( + left_node.vals_mut().get_unchecked_mut(left_len), + slice_remove(self.node.vals_mut(), self.idx), ); - ptr::write(left_node.vals_mut().get_unchecked_mut(left_len), - slice_remove(self.node.vals_mut(), self.idx)); ptr::copy_nonoverlapping( right_node.vals().as_ptr(), left_node.vals_mut().as_mut_ptr().add(left_len + 1), - right_len + right_len, ); slice_remove(&mut self.node.as_internal_mut().edges, self.idx + 1); - for i in self.idx+1..self.node.len() { + for i in self.idx + 1..self.node.len() { Handle::new_edge(self.node.reborrow_mut(), i).correct_parent_link(); } (*self.node.as_leaf_mut()).len -= 1; @@ -1375,37 +1215,30 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: if self.node.height > 1 { ptr::copy_nonoverlapping( right_node.cast_unchecked().as_internal().edges.as_ptr(), - left_node.cast_unchecked() - .as_internal_mut() - .edges - .as_mut_ptr() - .add(left_len + 1), - right_len + 1 + left_node + .cast_unchecked() + .as_internal_mut() + .edges + .as_mut_ptr() + .add(left_len + 1), + right_len + 1, ); - for i in left_len+1..left_len+right_len+2 { - Handle::new_edge( - left_node.cast_unchecked().reborrow_mut(), - i - ).correct_parent_link(); + for i in left_len + 1..left_len + right_len + 2 { + Handle::new_edge(left_node.cast_unchecked().reborrow_mut(), i) + .correct_parent_link(); } - Global.dealloc( - right_node.node.cast(), - Layout::new::>(), - ); + Global.dealloc(right_node.node.cast(), Layout::new::>()); } else { - Global.dealloc( - right_node.node.cast(), - Layout::new::>(), - ); + Global.dealloc(right_node.node.cast(), Layout::new::>()); } Handle::new_edge(self.node, self.idx) } } - /// This removes a key/value pair from the left child and replaces it with the key/value pair + /// This removes a key/value pair from the left child and places it in the key/value storage /// pointed to by this handle while pushing the old key/value pair of this handle into the right /// child. pub fn steal_left(&mut self) { @@ -1417,12 +1250,12 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: match self.reborrow_mut().right_edge().descend().force() { ForceResult::Leaf(mut leaf) => leaf.push_front(k, v), - ForceResult::Internal(mut internal) => internal.push_front(k, v, edge.unwrap()) + ForceResult::Internal(mut internal) => internal.push_front(k, v, edge.unwrap()), } } } - /// This removes a key/value pair from the right child and replaces it with the key/value pair + /// This removes a key/value pair from the right child and places it in the key/value storage /// pointed to by this handle while pushing the old key/value pair of this handle into the left /// child. pub fn steal_right(&mut self) { @@ -1434,7 +1267,7 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: match self.reborrow_mut().left_edge().descend().force() { ForceResult::Leaf(mut leaf) => leaf.push(k, v), - ForceResult::Internal(mut internal) => internal.push(k, v, edge.unwrap()) + ForceResult::Internal(mut internal) => internal.push(k, v, edge.unwrap()), } } } @@ -1463,12 +1296,8 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: }; // Make room for stolen elements in the right child. - ptr::copy(right_kv.0, - right_kv.0.add(count), - right_len); - ptr::copy(right_kv.1, - right_kv.1.add(count), - right_len); + ptr::copy(right_kv.0, right_kv.0.add(count), right_len); + ptr::copy(right_kv.1, right_kv.1.add(count), right_len); // Move elements from the left child to the right one. move_kv(left_kv, new_left_len + 1, right_kv, 0, count - 1); @@ -1487,15 +1316,15 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: (ForceResult::Internal(left), ForceResult::Internal(mut right)) => { // Make room for stolen edges. let right_edges = right.reborrow_mut().as_internal_mut().edges.as_mut_ptr(); - ptr::copy(right_edges, - right_edges.add(count), - right_len + 1); + ptr::copy(right_edges, right_edges.add(count), right_len + 1); right.correct_childrens_parent_links(count, count + right_len + 1); move_edges(left, new_left_len + 1, right, 0, count); - }, - (ForceResult::Leaf(_), ForceResult::Leaf(_)) => { } - _ => { unreachable!(); } + } + (ForceResult::Leaf(_), ForceResult::Leaf(_)) => {} + _ => { + unreachable!(); + } } } } @@ -1533,12 +1362,8 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: move_kv(right_kv, count - 1, parent_kv, 0, 1); // Fix right indexing - ptr::copy(right_kv.0.add(count), - right_kv.0, - new_right_len); - ptr::copy(right_kv.1.add(count), - right_kv.1, - new_right_len); + ptr::copy(right_kv.0.add(count), right_kv.0, new_right_len); + ptr::copy(right_kv.1.add(count), right_kv.1, new_right_len); } (*left_node.reborrow_mut().as_leaf_mut()).len += count as u16; @@ -1550,64 +1375,60 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: // Fix right indexing. let right_edges = right.reborrow_mut().as_internal_mut().edges.as_mut_ptr(); - ptr::copy(right_edges.add(count), - right_edges, - new_right_len + 1); + ptr::copy(right_edges.add(count), right_edges, new_right_len + 1); right.correct_childrens_parent_links(0, new_right_len + 1); - }, - (ForceResult::Leaf(_), ForceResult::Leaf(_)) => { } - _ => { unreachable!(); } + } + (ForceResult::Leaf(_), ForceResult::Leaf(_)) => {} + _ => { + unreachable!(); + } } } } } unsafe fn move_kv( - source: (*mut K, *mut V), source_offset: usize, - dest: (*mut K, *mut V), dest_offset: usize, - count: usize) -{ - ptr::copy_nonoverlapping(source.0.add(source_offset), - dest.0.add(dest_offset), - count); - ptr::copy_nonoverlapping(source.1.add(source_offset), - dest.1.add(dest_offset), - count); + source: (*mut K, *mut V), + source_offset: usize, + dest: (*mut K, *mut V), + dest_offset: usize, + count: usize, +) { + ptr::copy_nonoverlapping(source.0.add(source_offset), dest.0.add(dest_offset), count); + ptr::copy_nonoverlapping(source.1.add(source_offset), dest.1.add(dest_offset), count); } // Source and destination must have the same height. unsafe fn move_edges( - mut source: NodeRef, K, V, marker::Internal>, source_offset: usize, - mut dest: NodeRef, K, V, marker::Internal>, dest_offset: usize, - count: usize) -{ + mut source: NodeRef, K, V, marker::Internal>, + source_offset: usize, + mut dest: NodeRef, K, V, marker::Internal>, + dest_offset: usize, + count: usize, +) { let source_ptr = source.as_internal_mut().edges.as_mut_ptr(); let dest_ptr = dest.as_internal_mut().edges.as_mut_ptr(); - ptr::copy_nonoverlapping(source_ptr.add(source_offset), - dest_ptr.add(dest_offset), - count); + ptr::copy_nonoverlapping(source_ptr.add(source_offset), dest_ptr.add(dest_offset), count); dest.correct_childrens_parent_links(dest_offset, dest_offset + count); } impl - Handle, HandleType> { - + Handle, HandleType> +{ /// Checks whether the underlying node is an `Internal` node or a `Leaf` node. - pub fn force(self) -> ForceResult< + pub fn force( + self, + ) -> ForceResult< Handle, HandleType>, - Handle, HandleType> + Handle, HandleType>, > { match self.node.force() { - ForceResult::Leaf(node) => ForceResult::Leaf(Handle { - node, - idx: self.idx, - _marker: PhantomData - }), - ForceResult::Internal(node) => ForceResult::Internal(Handle { - node, - idx: self.idx, - _marker: PhantomData - }) + ForceResult::Leaf(node) => { + ForceResult::Leaf(Handle { node, idx: self.idx, _marker: PhantomData }) + } + ForceResult::Internal(node) => { + ForceResult::Internal(Handle { node, idx: self.idx, _marker: PhantomData }) + } } } } @@ -1615,8 +1436,10 @@ impl impl<'a, K, V> Handle, K, V, marker::LeafOrInternal>, marker::Edge> { /// Move the suffix after `self` from one node to another one. `right` must be empty. /// The first edge of `right` remains unchanged. - pub fn move_suffix(&mut self, - right: &mut NodeRef, K, V, marker::LeafOrInternal>) { + pub fn move_suffix( + &mut self, + right: &mut NodeRef, K, V, marker::LeafOrInternal>, + ) { unsafe { let left_new_len = self.idx; let mut left_node = self.reborrow_mut().into_node(); @@ -1630,7 +1453,6 @@ impl<'a, K, V> Handle, K, V, marker::LeafOrInternal>, ma let left_kv = left_node.reborrow_mut().into_kv_pointers_mut(); let right_kv = right_node.reborrow_mut().into_kv_pointers_mut(); - move_kv(left_kv, left_new_len, right_kv, 0, right_new_len); (*left_node.reborrow_mut().as_leaf_mut()).len = left_new_len as u16; @@ -1639,9 +1461,11 @@ impl<'a, K, V> Handle, K, V, marker::LeafOrInternal>, ma match (left_node.force(), right_node.force()) { (ForceResult::Internal(left), ForceResult::Internal(right)) => { move_edges(left, left_new_len + 1, right, 1, right_new_len); - }, - (ForceResult::Leaf(_), ForceResult::Leaf(_)) => { } - _ => { unreachable!(); } + } + (ForceResult::Leaf(_), ForceResult::Leaf(_)) => {} + _ => { + unreachable!(); + } } } } @@ -1649,44 +1473,36 @@ impl<'a, K, V> Handle, K, V, marker::LeafOrInternal>, ma pub enum ForceResult { Leaf(Leaf), - Internal(Internal) + Internal(Internal), } pub enum InsertResult<'a, K, V, Type> { Fit(Handle, K, V, Type>, marker::KV>), - Split(NodeRef, K, V, Type>, K, V, Root) + Split(NodeRef, K, V, Type>, K, V, Root), } pub mod marker { use core::marker::PhantomData; - pub enum Leaf { } - pub enum Internal { } - pub enum LeafOrInternal { } + pub enum Leaf {} + pub enum Internal {} + pub enum LeafOrInternal {} - pub enum Owned { } + pub enum Owned {} pub struct Immut<'a>(PhantomData<&'a ()>); pub struct Mut<'a>(PhantomData<&'a mut ()>); - pub enum KV { } - pub enum Edge { } + pub enum KV {} + pub enum Edge {} } unsafe fn slice_insert(slice: &mut [T], idx: usize, val: T) { - ptr::copy( - slice.as_ptr().add(idx), - slice.as_mut_ptr().add(idx + 1), - slice.len() - idx - ); + ptr::copy(slice.as_ptr().add(idx), slice.as_mut_ptr().add(idx + 1), slice.len() - idx); ptr::write(slice.get_unchecked_mut(idx), val); } unsafe fn slice_remove(slice: &mut [T], idx: usize) -> T { let ret = ptr::read(slice.get_unchecked(idx)); - ptr::copy( - slice.as_ptr().add(idx + 1), - slice.as_mut_ptr().add(idx), - slice.len() - idx - 1 - ); + ptr::copy(slice.as_ptr().add(idx + 1), slice.as_mut_ptr().add(idx), slice.len() - idx - 1); ret } diff --git a/src/liballoc/collections/btree/search.rs b/src/liballoc/collections/btree/search.rs index 3f3c49a2ef..579624cdd2 100644 --- a/src/liballoc/collections/btree/search.rs +++ b/src/liballoc/collections/btree/search.rs @@ -46,6 +46,11 @@ where } } +/// Returns the index in the node at which the key (or an equivalent) exists +/// or could exist, and whether it exists in the node itself. If it doesn't +/// exist in the node itself, it may exist in the subtree with that index +/// (if the node has subtrees). If the key doesn't exist in node or subtree, +/// the returned index is the position or subtree to insert at. pub fn search_linear( node: &NodeRef, key: &Q, @@ -54,12 +59,20 @@ where Q: Ord, K: Borrow, { - for (i, k) in node.keys().iter().enumerate() { - match key.cmp(k.borrow()) { - Ordering::Greater => {} - Ordering::Equal => return (i, true), - Ordering::Less => return (i, false), + // This function is defined over all borrow types (immutable, mutable, owned), + // and may be called on the shared root in each case. + // Using `keys()` is fine here even if BorrowType is mutable, as all we return + // is an index -- not a reference. + let len = node.len(); + if len > 0 { + let keys = unsafe { node.keys() }; // safe because a non-empty node cannot be the shared root + for (i, k) in keys.iter().enumerate() { + match key.cmp(k.borrow()) { + Ordering::Greater => {} + Ordering::Equal => return (i, true), + Ordering::Less => return (i, false), + } } } - (node.keys().len(), false) + (len, false) } diff --git a/src/liballoc/collections/btree/set.rs b/src/liballoc/collections/btree/set.rs index 85b93e0eda..f548742681 100644 --- a/src/liballoc/collections/btree/set.rs +++ b/src/liballoc/collections/btree/set.rs @@ -2,14 +2,14 @@ // to TreeMap use core::borrow::Borrow; -use core::cmp::Ordering::{Less, Greater, Equal}; +use core::cmp::Ordering::{Equal, Greater, Less}; use core::cmp::{max, min}; use core::fmt::{self, Debug}; -use core::iter::{Peekable, FromIterator, FusedIterator}; -use core::ops::{BitOr, BitAnd, BitXor, Sub, RangeBounds}; +use core::iter::{FromIterator, FusedIterator, Peekable}; +use core::ops::{BitAnd, BitOr, BitXor, RangeBounds, Sub}; -use crate::collections::btree_map::{self, BTreeMap, Keys}; use super::Recover; +use crate::collections::btree_map::{self, BTreeMap, Keys}; // FIXME(conventions): implement bounded iterators @@ -77,15 +77,13 @@ pub struct Iter<'a, T: 'a> { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for Iter<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("Iter") - .field(&self.iter.clone()) - .finish() + f.debug_tuple("Iter").field(&self.iter.clone()).finish() } } /// An owning iterator over the items of a `BTreeSet`. /// -/// This `struct` is created by the [`into_iter`] method on [`BTreeSet`][`BTreeSet`] +/// This `struct` is created by the [`into_iter`] method on [`BTreeSet`] /// (provided by the `IntoIterator` trait). See its documentation for more. /// /// [`BTreeSet`]: struct.BTreeSet.html @@ -114,8 +112,9 @@ pub struct Range<'a, T: 'a> { /// and crucially for SymmetricDifference, nexts() reports on both sides. #[derive(Clone)] struct MergeIterInner - where I: Iterator, - I::Item: Copy, +where + I: Iterator, + I::Item: Copy, { a: I, b: I, @@ -129,8 +128,9 @@ enum MergeIterPeeked { } impl MergeIterInner - where I: ExactSizeIterator + FusedIterator, - I::Item: Copy + Ord, +where + I: ExactSizeIterator + FusedIterator, + I::Item: Copy + Ord, { fn new(a: I, b: I) -> Self { MergeIterInner { a, b, peeked: None } @@ -169,14 +169,12 @@ impl MergeIterInner } impl Debug for MergeIterInner - where I: Iterator + Debug, - I::Item: Copy + Debug, +where + I: Iterator + Debug, + I::Item: Copy + Debug, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("MergeIterInner") - .field(&self.a) - .field(&self.b) - .finish() + f.debug_tuple("MergeIterInner").field(&self.a).field(&self.b).finish() } } @@ -328,7 +326,10 @@ impl BTreeSet { /// ``` #[stable(feature = "btree_range", since = "1.17.0")] pub fn range(&self, range: R) -> Range<'_, T> - where K: Ord, T: Borrow, R: RangeBounds + where + K: Ord, + T: Borrow, + R: RangeBounds, { Range { iter: self.map.range(range) } } @@ -355,24 +356,18 @@ impl BTreeSet { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn difference<'a>(&'a self, other: &'a BTreeSet) -> Difference<'a, T> { - let (self_min, self_max) = if let (Some(self_min), Some(self_max)) = - (self.first(), self.last()) - { - (self_min, self_max) - } else { - return Difference { - inner: DifferenceInner::Iterate(self.iter()), + let (self_min, self_max) = + if let (Some(self_min), Some(self_max)) = (self.first(), self.last()) { + (self_min, self_max) + } else { + return Difference { inner: DifferenceInner::Iterate(self.iter()) }; }; - }; - let (other_min, other_max) = if let (Some(other_min), Some(other_max)) = - (other.first(), other.last()) - { - (other_min, other_max) - } else { - return Difference { - inner: DifferenceInner::Iterate(self.iter()), + let (other_min, other_max) = + if let (Some(other_min), Some(other_max)) = (other.first(), other.last()) { + (other_min, other_max) + } else { + return Difference { inner: DifferenceInner::Iterate(self.iter()) }; }; - }; Difference { inner: match (self_min.cmp(other_max), self_max.cmp(other_min)) { (Greater, _) | (_, Less) => DifferenceInner::Iterate(self.iter()), @@ -387,10 +382,7 @@ impl BTreeSet { DifferenceInner::Iterate(self_iter) } _ if self.len() <= other.len() / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => { - DifferenceInner::Search { - self_iter: self.iter(), - other_set: other, - } + DifferenceInner::Search { self_iter: self.iter(), other_set: other } } _ => DifferenceInner::Stitch { self_iter: self.iter(), @@ -421,9 +413,10 @@ impl BTreeSet { /// assert_eq!(sym_diff, [1, 3]); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn symmetric_difference<'a>(&'a self, - other: &'a BTreeSet) - -> SymmetricDifference<'a, T> { + pub fn symmetric_difference<'a>( + &'a self, + other: &'a BTreeSet, + ) -> SymmetricDifference<'a, T> { SymmetricDifference(MergeIterInner::new(self.iter(), other.iter())) } @@ -449,45 +442,30 @@ impl BTreeSet { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn intersection<'a>(&'a self, other: &'a BTreeSet) -> Intersection<'a, T> { - let (self_min, self_max) = if let (Some(self_min), Some(self_max)) = - (self.first(), self.last()) - { - (self_min, self_max) - } else { - return Intersection { - inner: IntersectionInner::Answer(None), + let (self_min, self_max) = + if let (Some(self_min), Some(self_max)) = (self.first(), self.last()) { + (self_min, self_max) + } else { + return Intersection { inner: IntersectionInner::Answer(None) }; }; - }; - let (other_min, other_max) = if let (Some(other_min), Some(other_max)) = - (other.first(), other.last()) - { - (other_min, other_max) - } else { - return Intersection { - inner: IntersectionInner::Answer(None), + let (other_min, other_max) = + if let (Some(other_min), Some(other_max)) = (other.first(), other.last()) { + (other_min, other_max) + } else { + return Intersection { inner: IntersectionInner::Answer(None) }; }; - }; Intersection { inner: match (self_min.cmp(other_max), self_max.cmp(other_min)) { (Greater, _) | (_, Less) => IntersectionInner::Answer(None), (Equal, _) => IntersectionInner::Answer(Some(self_min)), (_, Equal) => IntersectionInner::Answer(Some(self_max)), _ if self.len() <= other.len() / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => { - IntersectionInner::Search { - small_iter: self.iter(), - large_set: other, - } + IntersectionInner::Search { small_iter: self.iter(), large_set: other } } _ if other.len() <= self.len() / ITER_PERFORMANCE_TIPPING_SIZE_DIFF => { - IntersectionInner::Search { - small_iter: other.iter(), - large_set: self, - } + IntersectionInner::Search { small_iter: other.iter(), large_set: self } } - _ => IntersectionInner::Stitch { - a: self.iter(), - b: other.iter(), - }, + _ => IntersectionInner::Stitch { a: self.iter(), b: other.iter() }, }, } } @@ -549,8 +527,9 @@ impl BTreeSet { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn contains(&self, value: &Q) -> bool - where T: Borrow, - Q: Ord + where + T: Borrow, + Q: Ord, { self.map.contains_key(value) } @@ -572,8 +551,9 @@ impl BTreeSet { /// ``` #[stable(feature = "set_recovery", since = "1.9.0")] pub fn get(&self, value: &Q) -> Option<&T> - where T: Borrow, - Q: Ord + where + T: Borrow, + Q: Ord, { Recover::get(&self.map, value) } @@ -624,20 +604,18 @@ impl BTreeSet { if self.len() > other.len() { return false; } - let (self_min, self_max) = if let (Some(self_min), Some(self_max)) = - (self.first(), self.last()) - { - (self_min, self_max) - } else { - return true; // self is empty - }; - let (other_min, other_max) = if let (Some(other_min), Some(other_max)) = - (other.first(), other.last()) - { - (other_min, other_max) - } else { - return false; // other is empty - }; + let (self_min, self_max) = + if let (Some(self_min), Some(self_max)) = (self.first(), self.last()) { + (self_min, self_max) + } else { + return true; // self is empty + }; + let (other_min, other_max) = + if let (Some(other_min), Some(other_max)) = (other.first(), other.last()) { + (other_min, other_max) + } else { + return false; // other is empty + }; let mut self_iter = self.iter(); match self_min.cmp(other_min) { Less => return false, @@ -855,8 +833,9 @@ impl BTreeSet { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn remove(&mut self, value: &Q) -> bool - where T: Borrow, - Q: Ord + where + T: Borrow, + Q: Ord, { self.map.remove(value).is_some() } @@ -878,8 +857,9 @@ impl BTreeSet { /// ``` #[stable(feature = "set_recovery", since = "1.9.0")] pub fn take(&mut self, value: &Q) -> Option - where T: Borrow, - Q: Ord + where + T: Borrow, + Q: Ord, { Recover::take(&mut self.map, value) } @@ -947,7 +927,10 @@ impl BTreeSet { /// assert!(b.contains(&41)); /// ``` #[stable(feature = "btree_split_off", since = "1.11.0")] - pub fn split_off(&mut self, key: &Q) -> Self where T: Borrow { + pub fn split_off(&mut self, key: &Q) -> Self + where + T: Borrow, + { BTreeSet { map: self.map.split_off(key) } } } @@ -1213,7 +1196,9 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> { } #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Iter<'_, T> { - fn len(&self) -> usize { self.iter.len() } + fn len(&self) -> usize { + self.iter.len() + } } #[stable(feature = "fused", since = "1.26.0")] @@ -1238,7 +1223,9 @@ impl DoubleEndedIterator for IntoIter { } #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for IntoIter { - fn len(&self) -> usize { self.iter.len() } + fn len(&self) -> usize { + self.iter.len() + } } #[stable(feature = "fused", since = "1.26.0")] @@ -1279,20 +1266,13 @@ impl Clone for Difference<'_, T> { fn clone(&self) -> Self { Difference { inner: match &self.inner { - DifferenceInner::Stitch { - self_iter, - other_iter, - } => DifferenceInner::Stitch { + DifferenceInner::Stitch { self_iter, other_iter } => DifferenceInner::Stitch { self_iter: self_iter.clone(), other_iter: other_iter.clone(), }, - DifferenceInner::Search { - self_iter, - other_set, - } => DifferenceInner::Search { - self_iter: self_iter.clone(), - other_set, - }, + DifferenceInner::Search { self_iter, other_set } => { + DifferenceInner::Search { self_iter: self_iter.clone(), other_set } + } DifferenceInner::Iterate(iter) => DifferenceInner::Iterate(iter.clone()), }, } @@ -1304,16 +1284,10 @@ impl<'a, T: Ord> Iterator for Difference<'a, T> { fn next(&mut self) -> Option<&'a T> { match &mut self.inner { - DifferenceInner::Stitch { - self_iter, - other_iter, - } => { + DifferenceInner::Stitch { self_iter, other_iter } => { let mut self_next = self_iter.next()?; loop { - match other_iter - .peek() - .map_or(Less, |other_next| self_next.cmp(other_next)) - { + match other_iter.peek().map_or(Less, |other_next| self_next.cmp(other_next)) { Less => return Some(self_next), Equal => { self_next = self_iter.next()?; @@ -1325,10 +1299,7 @@ impl<'a, T: Ord> Iterator for Difference<'a, T> { } } } - DifferenceInner::Search { - self_iter, - other_set, - } => loop { + DifferenceInner::Search { self_iter, other_set } => loop { let self_next = self_iter.next()?; if !other_set.contains(&self_next) { return Some(self_next); @@ -1340,14 +1311,10 @@ impl<'a, T: Ord> Iterator for Difference<'a, T> { fn size_hint(&self) -> (usize, Option) { let (self_len, other_len) = match &self.inner { - DifferenceInner::Stitch { - self_iter, - other_iter, - } => (self_iter.len(), other_iter.len()), - DifferenceInner::Search { - self_iter, - other_set, - } => (self_iter.len(), other_set.len()), + DifferenceInner::Stitch { self_iter, other_iter } => { + (self_iter.len(), other_iter.len()) + } + DifferenceInner::Search { self_iter, other_set } => (self_iter.len(), other_set.len()), DifferenceInner::Iterate(iter) => (iter.len(), 0), }; (self_len.saturating_sub(other_len), Some(self_len)) @@ -1393,20 +1360,12 @@ impl Clone for Intersection<'_, T> { fn clone(&self) -> Self { Intersection { inner: match &self.inner { - IntersectionInner::Stitch { - a, - b, - } => IntersectionInner::Stitch { - a: a.clone(), - b: b.clone(), - }, - IntersectionInner::Search { - small_iter, - large_set, - } => IntersectionInner::Search { - small_iter: small_iter.clone(), - large_set, - }, + IntersectionInner::Stitch { a, b } => { + IntersectionInner::Stitch { a: a.clone(), b: b.clone() } + } + IntersectionInner::Search { small_iter, large_set } => { + IntersectionInner::Search { small_iter: small_iter.clone(), large_set } + } IntersectionInner::Answer(answer) => IntersectionInner::Answer(*answer), }, } @@ -1418,10 +1377,7 @@ impl<'a, T: Ord> Iterator for Intersection<'a, T> { fn next(&mut self) -> Option<&'a T> { match &mut self.inner { - IntersectionInner::Stitch { - a, - b, - } => { + IntersectionInner::Stitch { a, b } => { let mut a_next = a.next()?; let mut b_next = b.next()?; loop { @@ -1432,10 +1388,7 @@ impl<'a, T: Ord> Iterator for Intersection<'a, T> { } } } - IntersectionInner::Search { - small_iter, - large_set, - } => loop { + IntersectionInner::Search { small_iter, large_set } => loop { let small_next = small_iter.next()?; if large_set.contains(&small_next) { return Some(small_next); diff --git a/src/liballoc/collections/linked_list.rs b/src/liballoc/collections/linked_list.rs index 4a74a479e7..b88ca8a0fb 100644 --- a/src/liballoc/collections/linked_list.rs +++ b/src/liballoc/collections/linked_list.rs @@ -14,14 +14,14 @@ use core::cmp::Ordering; use core::fmt; -use core::hash::{Hasher, Hash}; +use core::hash::{Hash, Hasher}; use core::iter::{FromIterator, FusedIterator}; use core::marker::PhantomData; use core::mem; use core::ptr::NonNull; -use crate::boxed::Box; use super::SpecExtend; +use crate::boxed::Box; #[cfg(test)] mod tests; @@ -66,9 +66,7 @@ pub struct Iter<'a, T: 'a> { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for Iter<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("Iter") - .field(&self.len) - .finish() + f.debug_tuple("Iter").field(&self.len).finish() } } @@ -101,16 +99,13 @@ pub struct IterMut<'a, T: 'a> { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for IterMut<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("IterMut") - .field(&self.list) - .field(&self.len) - .finish() + f.debug_tuple("IterMut").field(&self.list).field(&self.len).finish() } } /// An owning iterator over the elements of a `LinkedList`. /// -/// This `struct` is created by the [`into_iter`] method on [`LinkedList`][`LinkedList`] +/// This `struct` is created by the [`into_iter`] method on [`LinkedList`] /// (provided by the `IntoIterator` trait). See its documentation for more. /// /// [`into_iter`]: struct.LinkedList.html#method.into_iter @@ -124,19 +119,13 @@ pub struct IntoIter { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for IntoIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("IntoIter") - .field(&self.list) - .finish() + f.debug_tuple("IntoIter").field(&self.list).finish() } } impl Node { fn new(element: T) -> Self { - Node { - next: None, - prev: None, - element, - } + Node { next: None, prev: None, element } } fn into_element(self: Box) -> T { @@ -253,6 +242,121 @@ impl LinkedList { self.len -= 1; } + + /// Splices a series of nodes between two existing nodes. + /// + /// Warning: this will not check that the provided node belongs to the two existing lists. + #[inline] + unsafe fn splice_nodes( + &mut self, + existing_prev: Option>>, + existing_next: Option>>, + mut splice_start: NonNull>, + mut splice_end: NonNull>, + splice_length: usize, + ) { + // This method takes care not to create multiple mutable references to whole nodes at the same time, + // to maintain validity of aliasing pointers into `element`. + if let Some(mut existing_prev) = existing_prev { + existing_prev.as_mut().next = Some(splice_start); + } else { + self.head = Some(splice_start); + } + if let Some(mut existing_next) = existing_next { + existing_next.as_mut().prev = Some(splice_end); + } else { + self.tail = Some(splice_end); + } + splice_start.as_mut().prev = existing_prev; + splice_end.as_mut().next = existing_next; + + self.len += splice_length; + } + + /// Detaches all nodes from a linked list as a series of nodes. + #[inline] + fn detach_all_nodes(mut self) -> Option<(NonNull>, NonNull>, usize)> { + let head = self.head.take(); + let tail = self.tail.take(); + let len = mem::replace(&mut self.len, 0); + if let Some(head) = head { + let tail = tail.unwrap_or_else(|| unsafe { core::hint::unreachable_unchecked() }); + Some((head, tail, len)) + } else { + None + } + } + + #[inline] + unsafe fn split_off_before_node( + &mut self, + split_node: Option>>, + at: usize, + ) -> Self { + // The split node is the new head node of the second part + if let Some(mut split_node) = split_node { + let first_part_head; + let first_part_tail; + first_part_tail = split_node.as_mut().prev.take(); + if let Some(mut tail) = first_part_tail { + tail.as_mut().next = None; + first_part_head = self.head; + } else { + first_part_head = None; + } + + let first_part = LinkedList { + head: first_part_head, + tail: first_part_tail, + len: at, + marker: PhantomData, + }; + + // Fix the head ptr of the second part + self.head = Some(split_node); + self.len = self.len - at; + + first_part + } else { + mem::replace(self, LinkedList::new()) + } + } + + #[inline] + unsafe fn split_off_after_node( + &mut self, + split_node: Option>>, + at: usize, + ) -> Self { + // The split node is the new tail node of the first part and owns + // the head of the second part. + if let Some(mut split_node) = split_node { + let second_part_head; + let second_part_tail; + second_part_head = split_node.as_mut().next.take(); + if let Some(mut head) = second_part_head { + head.as_mut().prev = None; + second_part_tail = self.tail; + } else { + second_part_tail = None; + } + + let second_part = LinkedList { + head: second_part_head, + tail: second_part_tail, + len: self.len - at, + marker: PhantomData, + }; + + // Fix the tail ptr of the first part + self.tail = Some(split_node); + self.len = at; + + second_part + } else { + mem::replace(self, LinkedList::new()) + } + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -275,18 +379,10 @@ impl LinkedList { /// let list: LinkedList = LinkedList::new(); /// ``` #[inline] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_linked_list_new", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_linked_list_new", since = "1.32.0")] #[stable(feature = "rust1", since = "1.0.0")] pub const fn new() -> Self { - LinkedList { - head: None, - tail: None, - len: 0, - marker: PhantomData, - } + LinkedList { head: None, tail: None, len: 0, marker: PhantomData } } /// Moves all elements from `other` to the end of the list. @@ -338,6 +434,27 @@ impl LinkedList { } } + /// Moves all elements from `other` to the begin of the list. + #[unstable(feature = "linked_list_prepend", issue = "none")] + pub fn prepend(&mut self, other: &mut Self) { + match self.head { + None => mem::swap(self, other), + Some(mut head) => { + // `as_mut` is okay here because we have exclusive access to the entirety + // of both lists. + if let Some(mut other_tail) = other.tail.take() { + unsafe { + head.as_mut().prev = Some(other_tail); + other_tail.as_mut().next = Some(head); + } + + self.head = other.head.take(); + self.len += mem::replace(&mut other.len, 0); + } + } + } + } + /// Provides a forward iterator. /// /// # Examples @@ -360,12 +477,7 @@ impl LinkedList { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn iter(&self) -> Iter<'_, T> { - Iter { - head: self.head, - tail: self.tail, - len: self.len, - marker: PhantomData, - } + Iter { head: self.head, tail: self.tail, len: self.len, marker: PhantomData } } /// Provides a forward iterator with mutable references. @@ -394,12 +506,43 @@ impl LinkedList { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn iter_mut(&mut self) -> IterMut<'_, T> { - IterMut { - head: self.head, - tail: self.tail, - len: self.len, - list: self, - } + IterMut { head: self.head, tail: self.tail, len: self.len, list: self } + } + + /// Provides a cursor at the front element. + /// + /// The cursor is pointing to the "ghost" non-element if the list is empty. + #[inline] + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn cursor_front(&self) -> Cursor<'_, T> { + Cursor { index: 0, current: self.head, list: self } + } + + /// Provides a cursor with editing operations at the front element. + /// + /// The cursor is pointing to the "ghost" non-element if the list is empty. + #[inline] + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn cursor_front_mut(&mut self) -> CursorMut<'_, T> { + CursorMut { index: 0, current: self.head, list: self } + } + + /// Provides a cursor at the back element. + /// + /// The cursor is pointing to the "ghost" non-element if the list is empty. + #[inline] + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn cursor_back(&self) -> Cursor<'_, T> { + Cursor { index: self.len.checked_sub(1).unwrap_or(0), current: self.tail, list: self } + } + + /// Provides a cursor with editing operations at the back element. + /// + /// The cursor is pointing to the "ghost" non-element if the list is empty. + #[inline] + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn cursor_back_mut(&mut self) -> CursorMut<'_, T> { + CursorMut { index: self.len.checked_sub(1).unwrap_or(0), current: self.tail, list: self } } /// Returns `true` if the `LinkedList` is empty. @@ -494,7 +637,8 @@ impl LinkedList { /// ``` #[stable(feature = "linked_list_contains", since = "1.12.0")] pub fn contains(&self, x: &T) -> bool - where T: PartialEq + where + T: PartialEq, { self.iter().any(|e| e == x) } @@ -516,9 +660,7 @@ impl LinkedList { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn front(&self) -> Option<&T> { - unsafe { - self.head.as_ref().map(|node| &node.as_ref().element) - } + unsafe { self.head.as_ref().map(|node| &node.as_ref().element) } } /// Provides a mutable reference to the front element, or `None` if the list @@ -544,9 +686,7 @@ impl LinkedList { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn front_mut(&mut self) -> Option<&mut T> { - unsafe { - self.head.as_mut().map(|node| &mut node.as_mut().element) - } + unsafe { self.head.as_mut().map(|node| &mut node.as_mut().element) } } /// Provides a reference to the back element, or `None` if the list is @@ -566,9 +706,7 @@ impl LinkedList { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn back(&self) -> Option<&T> { - unsafe { - self.tail.as_ref().map(|node| &node.as_ref().element) - } + unsafe { self.tail.as_ref().map(|node| &node.as_ref().element) } } /// Provides a mutable reference to the back element, or `None` if the list @@ -594,9 +732,7 @@ impl LinkedList { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn back_mut(&mut self) -> Option<&mut T> { - unsafe { - self.tail.as_mut().map(|node| &mut node.as_mut().element) - } + unsafe { self.tail.as_mut().map(|node| &mut node.as_mut().element) } } /// Adds an element first in the list. @@ -739,30 +875,7 @@ impl LinkedList { } iter.tail }; - - // The split node is the new tail node of the first part and owns - // the head of the second part. - let second_part_head; - - unsafe { - second_part_head = split_node.unwrap().as_mut().next.take(); - if let Some(mut head) = second_part_head { - head.as_mut().prev = None; - } - } - - let second_part = LinkedList { - head: second_part_head, - tail: self.tail, - len: len - at, - marker: PhantomData, - }; - - // Fix the tail ptr of the first part - self.tail = split_node; - self.len = at; - - second_part + unsafe { self.split_off_after_node(split_node, at) } } /// Creates an iterator which uses a closure to determine if an element should be removed. @@ -793,19 +906,14 @@ impl LinkedList { /// ``` #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")] pub fn drain_filter(&mut self, filter: F) -> DrainFilter<'_, T, F> - where F: FnMut(&mut T) -> bool + where + F: FnMut(&mut T) -> bool, { // avoid borrow issues. let it = self.head; let old_len = self.len; - DrainFilter { - list: self, - it: it, - pred: filter, - idx: 0, - old_len: old_len, - } + DrainFilter { list: self, it: it, pred: filter, idx: 0, old_len: old_len } } } @@ -963,9 +1071,11 @@ impl IterMut<'_, T> { /// } /// ``` #[inline] - #[unstable(feature = "linked_list_extras", - reason = "this is probably better handled by a cursor type -- we'll see", - issue = "27794")] + #[unstable( + feature = "linked_list_extras", + reason = "this is probably better handled by a cursor type -- we'll see", + issue = "27794" + )] pub fn insert_next(&mut self, element: T) { match self.head { // `push_back` is okay with aliasing `element` references @@ -1011,24 +1121,407 @@ impl IterMut<'_, T> { /// assert_eq!(it.next().unwrap(), &2); /// ``` #[inline] - #[unstable(feature = "linked_list_extras", - reason = "this is probably better handled by a cursor type -- we'll see", - issue = "27794")] + #[unstable( + feature = "linked_list_extras", + reason = "this is probably better handled by a cursor type -- we'll see", + issue = "27794" + )] pub fn peek_next(&mut self) -> Option<&mut T> { if self.len == 0 { None } else { - unsafe { - self.head.as_mut().map(|node| &mut node.as_mut().element) + unsafe { self.head.as_mut().map(|node| &mut node.as_mut().element) } + } + } +} + +/// A cursor over a `LinkedList`. +/// +/// A `Cursor` is like an iterator, except that it can freely seek back-and-forth. +/// +/// Cursors always rest between two elements in the list, and index in a logically circular way. +/// To accommodate this, there is a "ghost" non-element that yields `None` between the head and +/// tail of the list. +/// +/// When created, cursors start at the front of the list, or the "ghost" non-element if the list is empty. +#[unstable(feature = "linked_list_cursors", issue = "58533")] +pub struct Cursor<'a, T: 'a> { + index: usize, + current: Option>>, + list: &'a LinkedList, +} + +#[unstable(feature = "linked_list_cursors", issue = "58533")] +impl fmt::Debug for Cursor<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("Cursor").field(&self.list).field(&self.index()).finish() + } +} + +/// A cursor over a `LinkedList` with editing operations. +/// +/// A `Cursor` is like an iterator, except that it can freely seek back-and-forth, and can +/// safely mutate the list during iteration. This is because the lifetime of its yielded +/// references is tied to its own lifetime, instead of just the underlying list. This means +/// cursors cannot yield multiple elements at once. +/// +/// Cursors always rest between two elements in the list, and index in a logically circular way. +/// To accommodate this, there is a "ghost" non-element that yields `None` between the head and +/// tail of the list. +#[unstable(feature = "linked_list_cursors", issue = "58533")] +pub struct CursorMut<'a, T: 'a> { + index: usize, + current: Option>>, + list: &'a mut LinkedList, +} + +#[unstable(feature = "linked_list_cursors", issue = "58533")] +impl fmt::Debug for CursorMut<'_, T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("CursorMut").field(&self.list).field(&self.index()).finish() + } +} + +impl<'a, T> Cursor<'a, T> { + /// Returns the cursor position index within the `LinkedList`. + /// + /// This returns `None` if the cursor is currently pointing to the + /// "ghost" non-element. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn index(&self) -> Option { + let _ = self.current?; + Some(self.index) + } + + /// Moves the cursor to the next element of the `LinkedList`. + /// + /// If the cursor is pointing to the "ghost" non-element then this will move it to + /// the first element of the `LinkedList`. If it is pointing to the last + /// element of the `LinkedList` then this will move it to the "ghost" non-element. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn move_next(&mut self) { + match self.current.take() { + // We had no current element; the cursor was sitting at the start position + // Next element should be the head of the list + None => { + self.current = self.list.head; + self.index = 0; + } + // We had a previous element, so let's go to its next + Some(current) => unsafe { + self.current = current.as_ref().next; + self.index += 1; + }, + } + } + + /// Moves the cursor to the previous element of the `LinkedList`. + /// + /// If the cursor is pointing to the "ghost" non-element then this will move it to + /// the last element of the `LinkedList`. If it is pointing to the first + /// element of the `LinkedList` then this will move it to the "ghost" non-element. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn move_prev(&mut self) { + match self.current.take() { + // No current. We're at the start of the list. Yield None and jump to the end. + None => { + self.current = self.list.tail; + self.index = self.list.len().checked_sub(1).unwrap_or(0); + } + // Have a prev. Yield it and go to the previous element. + Some(current) => unsafe { + self.current = current.as_ref().prev; + self.index = self.index.checked_sub(1).unwrap_or_else(|| self.list.len()); + }, + } + } + + /// Returns a reference to the element that the cursor is currently + /// pointing to. + /// + /// This returns `None` if the cursor is currently pointing to the + /// "ghost" non-element. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn current(&self) -> Option<&'a T> { + unsafe { self.current.map(|current| &(*current.as_ptr()).element) } + } + + /// Returns a reference to the next element. + /// + /// If the cursor is pointing to the "ghost" non-element then this returns + /// the first element of the `LinkedList`. If it is pointing to the last + /// element of the `LinkedList` then this returns `None`. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn peek_next(&self) -> Option<&'a T> { + unsafe { + let next = match self.current { + None => self.list.head, + Some(current) => current.as_ref().next, + }; + next.map(|next| &(*next.as_ptr()).element) + } + } + + /// Returns a reference to the previous element. + /// + /// If the cursor is pointing to the "ghost" non-element then this returns + /// the last element of the `LinkedList`. If it is pointing to the first + /// element of the `LinkedList` then this returns `None`. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn peek_prev(&self) -> Option<&'a T> { + unsafe { + let prev = match self.current { + None => self.list.tail, + Some(current) => current.as_ref().prev, + }; + prev.map(|prev| &(*prev.as_ptr()).element) + } + } +} + +impl<'a, T> CursorMut<'a, T> { + /// Returns the cursor position index within the `LinkedList`. + /// + /// This returns `None` if the cursor is currently pointing to the + /// "ghost" non-element. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn index(&self) -> Option { + let _ = self.current?; + Some(self.index) + } + + /// Moves the cursor to the next element of the `LinkedList`. + /// + /// If the cursor is pointing to the "ghost" non-element then this will move it to + /// the first element of the `LinkedList`. If it is pointing to the last + /// element of the `LinkedList` then this will move it to the "ghost" non-element. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn move_next(&mut self) { + match self.current.take() { + // We had no current element; the cursor was sitting at the start position + // Next element should be the head of the list + None => { + self.current = self.list.head; + self.index = 0; } + // We had a previous element, so let's go to its next + Some(current) => unsafe { + self.current = current.as_ref().next; + self.index += 1; + }, } } + + /// Moves the cursor to the previous element of the `LinkedList`. + /// + /// If the cursor is pointing to the "ghost" non-element then this will move it to + /// the last element of the `LinkedList`. If it is pointing to the first + /// element of the `LinkedList` then this will move it to the "ghost" non-element. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn move_prev(&mut self) { + match self.current.take() { + // No current. We're at the start of the list. Yield None and jump to the end. + None => { + self.current = self.list.tail; + self.index = self.list.len().checked_sub(1).unwrap_or(0); + } + // Have a prev. Yield it and go to the previous element. + Some(current) => unsafe { + self.current = current.as_ref().prev; + self.index = self.index.checked_sub(1).unwrap_or_else(|| self.list.len()); + }, + } + } + + /// Returns a reference to the element that the cursor is currently + /// pointing to. + /// + /// This returns `None` if the cursor is currently pointing to the + /// "ghost" non-element. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn current(&mut self) -> Option<&mut T> { + unsafe { self.current.map(|current| &mut (*current.as_ptr()).element) } + } + + /// Returns a reference to the next element. + /// + /// If the cursor is pointing to the "ghost" non-element then this returns + /// the first element of the `LinkedList`. If it is pointing to the last + /// element of the `LinkedList` then this returns `None`. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn peek_next(&mut self) -> Option<&mut T> { + unsafe { + let next = match self.current { + None => self.list.head, + Some(current) => current.as_ref().next, + }; + next.map(|next| &mut (*next.as_ptr()).element) + } + } + + /// Returns a reference to the previous element. + /// + /// If the cursor is pointing to the "ghost" non-element then this returns + /// the last element of the `LinkedList`. If it is pointing to the first + /// element of the `LinkedList` then this returns `None`. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn peek_prev(&mut self) -> Option<&mut T> { + unsafe { + let prev = match self.current { + None => self.list.tail, + Some(current) => current.as_ref().prev, + }; + prev.map(|prev| &mut (*prev.as_ptr()).element) + } + } + + /// Returns a read-only cursor pointing to the current element. + /// + /// The lifetime of the returned `Cursor` is bound to that of the + /// `CursorMut`, which means it cannot outlive the `CursorMut` and that the + /// `CursorMut` is frozen for the lifetime of the `Cursor`. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn as_cursor<'cm>(&'cm self) -> Cursor<'cm, T> { + Cursor { list: self.list, current: self.current, index: self.index } + } +} + +// Now the list editing operations + +impl<'a, T> CursorMut<'a, T> { + /// Inserts a new element into the `LinkedList` after the current one. + /// + /// If the cursor is pointing at the "ghost" non-element then the new element is + /// inserted at the front of the `LinkedList`. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn insert_after(&mut self, item: T) { + unsafe { + let spliced_node = Box::into_raw_non_null(Box::new(Node::new(item))); + let node_next = match self.current { + None => self.list.head, + Some(node) => node.as_ref().next, + }; + self.list.splice_nodes(self.current, node_next, spliced_node, spliced_node, 1); + if self.current.is_none() { + // The "ghost" non-element's index has changed. + self.index = self.list.len; + } + } + } + + /// Inserts a new element into the `LinkedList` before the current one. + /// + /// If the cursor is pointing at the "ghost" non-element then the new element is + /// inserted at the end of the `LinkedList`. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn insert_before(&mut self, item: T) { + unsafe { + let spliced_node = Box::into_raw_non_null(Box::new(Node::new(item))); + let node_prev = match self.current { + None => self.list.tail, + Some(node) => node.as_ref().prev, + }; + self.list.splice_nodes(node_prev, self.current, spliced_node, spliced_node, 1); + self.index += 1; + } + } + + /// Removes the current element from the `LinkedList`. + /// + /// The element that was removed is returned, and the cursor is + /// moved to point to the next element in the `LinkedList`. + /// + /// If the cursor is currently pointing to the "ghost" non-element then no element + /// is removed and `None` is returned. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn remove_current(&mut self) -> Option { + let unlinked_node = self.current?; + unsafe { + self.current = unlinked_node.as_ref().next; + self.list.unlink_node(unlinked_node); + let unlinked_node = Box::from_raw(unlinked_node.as_ptr()); + Some(unlinked_node.element) + } + } + + /// Inserts the elements from the given `LinkedList` after the current one. + /// + /// If the cursor is pointing at the "ghost" non-element then the new elements are + /// inserted at the start of the `LinkedList`. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn splice_after(&mut self, list: LinkedList) { + unsafe { + let (splice_head, splice_tail, splice_len) = match list.detach_all_nodes() { + Some(parts) => parts, + _ => return, + }; + let node_next = match self.current { + None => self.list.head, + Some(node) => node.as_ref().next, + }; + self.list.splice_nodes(self.current, node_next, splice_head, splice_tail, splice_len); + if self.current.is_none() { + // The "ghost" non-element's index has changed. + self.index = self.list.len; + } + } + } + + /// Inserts the elements from the given `LinkedList` before the current one. + /// + /// If the cursor is pointing at the "ghost" non-element then the new elements are + /// inserted at the end of the `LinkedList`. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn splice_before(&mut self, list: LinkedList) { + unsafe { + let (splice_head, splice_tail, splice_len) = match list.detach_all_nodes() { + Some(parts) => parts, + _ => return, + }; + let node_prev = match self.current { + None => self.list.tail, + Some(node) => node.as_ref().prev, + }; + self.list.splice_nodes(node_prev, self.current, splice_head, splice_tail, splice_len); + self.index += splice_len; + } + } + + /// Splits the list into two after the current element. This will return a + /// new list consisting of everything after the cursor, with the original + /// list retaining everything before. + /// + /// If the cursor is pointing at the "ghost" non-element then the entire contents + /// of the `LinkedList` are moved. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn split_after(&mut self) -> LinkedList { + let split_off_idx = if self.index == self.list.len { 0 } else { self.index + 1 }; + if self.index == self.list.len { + // The "ghost" non-element's index has changed to 0. + self.index = 0; + } + unsafe { self.list.split_off_after_node(self.current, split_off_idx) } + } + + /// Splits the list into two before the current element. This will return a + /// new list consisting of everything before the cursor, with the original + /// list retaining everything after. + /// + /// If the cursor is pointing at the "ghost" non-element then the entire contents + /// of the `LinkedList` are moved. + #[unstable(feature = "linked_list_cursors", issue = "58533")] + pub fn split_before(&mut self) -> LinkedList { + let split_off_idx = self.index; + self.index = 0; + unsafe { self.list.split_off_before_node(self.current, split_off_idx) } + } } /// An iterator produced by calling `drain_filter` on LinkedList. #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")] pub struct DrainFilter<'a, T: 'a, F: 'a> - where F: FnMut(&mut T) -> bool, +where + F: FnMut(&mut T) -> bool, { list: &'a mut LinkedList, it: Option>>, @@ -1039,7 +1532,8 @@ pub struct DrainFilter<'a, T: 'a, F: 'a> #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")] impl Iterator for DrainFilter<'_, T, F> - where F: FnMut(&mut T) -> bool, +where + F: FnMut(&mut T) -> bool, { type Item = T; @@ -1067,7 +1561,8 @@ impl Iterator for DrainFilter<'_, T, F> #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")] impl Drop for DrainFilter<'_, T, F> - where F: FnMut(&mut T) -> bool, +where + F: FnMut(&mut T) -> bool, { fn drop(&mut self) { self.for_each(drop); @@ -1076,12 +1571,11 @@ impl Drop for DrainFilter<'_, T, F> #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")] impl fmt::Debug for DrainFilter<'_, T, F> - where F: FnMut(&mut T) -> bool +where + F: FnMut(&mut T) -> bool, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("DrainFilter") - .field(&self.list) - .finish() + f.debug_tuple("DrainFilter").field(&self.list).finish() } } diff --git a/src/liballoc/collections/linked_list/tests.rs b/src/liballoc/collections/linked_list/tests.rs index 1b1d8eab39..085f734ed9 100644 --- a/src/liballoc/collections/linked_list/tests.rs +++ b/src/liballoc/collections/linked_list/tests.rs @@ -304,3 +304,155 @@ fn drain_to_empty_test() { assert_eq!(deleted, &[1, 2, 3, 4, 5, 6]); assert_eq!(m.into_iter().collect::>(), &[]); } + +#[test] +fn test_cursor_move_peek() { + let mut m: LinkedList = LinkedList::new(); + m.extend(&[1, 2, 3, 4, 5, 6]); + let mut cursor = m.cursor_front(); + assert_eq!(cursor.current(), Some(&1)); + assert_eq!(cursor.peek_next(), Some(&2)); + assert_eq!(cursor.peek_prev(), None); + assert_eq!(cursor.index(), Some(0)); + cursor.move_prev(); + assert_eq!(cursor.current(), None); + assert_eq!(cursor.peek_next(), Some(&1)); + assert_eq!(cursor.peek_prev(), Some(&6)); + assert_eq!(cursor.index(), None); + cursor.move_next(); + cursor.move_next(); + assert_eq!(cursor.current(), Some(&2)); + assert_eq!(cursor.peek_next(), Some(&3)); + assert_eq!(cursor.peek_prev(), Some(&1)); + assert_eq!(cursor.index(), Some(1)); + + let mut cursor = m.cursor_back(); + assert_eq!(cursor.current(), Some(&6)); + assert_eq!(cursor.peek_next(), None); + assert_eq!(cursor.peek_prev(), Some(&5)); + assert_eq!(cursor.index(), Some(5)); + cursor.move_next(); + assert_eq!(cursor.current(), None); + assert_eq!(cursor.peek_next(), Some(&1)); + assert_eq!(cursor.peek_prev(), Some(&6)); + assert_eq!(cursor.index(), None); + cursor.move_prev(); + cursor.move_prev(); + assert_eq!(cursor.current(), Some(&5)); + assert_eq!(cursor.peek_next(), Some(&6)); + assert_eq!(cursor.peek_prev(), Some(&4)); + assert_eq!(cursor.index(), Some(4)); + + let mut m: LinkedList = LinkedList::new(); + m.extend(&[1, 2, 3, 4, 5, 6]); + let mut cursor = m.cursor_front_mut(); + assert_eq!(cursor.current(), Some(&mut 1)); + assert_eq!(cursor.peek_next(), Some(&mut 2)); + assert_eq!(cursor.peek_prev(), None); + assert_eq!(cursor.index(), Some(0)); + cursor.move_prev(); + assert_eq!(cursor.current(), None); + assert_eq!(cursor.peek_next(), Some(&mut 1)); + assert_eq!(cursor.peek_prev(), Some(&mut 6)); + assert_eq!(cursor.index(), None); + cursor.move_next(); + cursor.move_next(); + assert_eq!(cursor.current(), Some(&mut 2)); + assert_eq!(cursor.peek_next(), Some(&mut 3)); + assert_eq!(cursor.peek_prev(), Some(&mut 1)); + assert_eq!(cursor.index(), Some(1)); + let mut cursor2 = cursor.as_cursor(); + assert_eq!(cursor2.current(), Some(&2)); + assert_eq!(cursor2.index(), Some(1)); + cursor2.move_next(); + assert_eq!(cursor2.current(), Some(&3)); + assert_eq!(cursor2.index(), Some(2)); + assert_eq!(cursor.current(), Some(&mut 2)); + assert_eq!(cursor.index(), Some(1)); + + let mut m: LinkedList = LinkedList::new(); + m.extend(&[1, 2, 3, 4, 5, 6]); + let mut cursor = m.cursor_back_mut(); + assert_eq!(cursor.current(), Some(&mut 6)); + assert_eq!(cursor.peek_next(), None); + assert_eq!(cursor.peek_prev(), Some(&mut 5)); + assert_eq!(cursor.index(), Some(5)); + cursor.move_next(); + assert_eq!(cursor.current(), None); + assert_eq!(cursor.peek_next(), Some(&mut 1)); + assert_eq!(cursor.peek_prev(), Some(&mut 6)); + assert_eq!(cursor.index(), None); + cursor.move_prev(); + cursor.move_prev(); + assert_eq!(cursor.current(), Some(&mut 5)); + assert_eq!(cursor.peek_next(), Some(&mut 6)); + assert_eq!(cursor.peek_prev(), Some(&mut 4)); + assert_eq!(cursor.index(), Some(4)); + let mut cursor2 = cursor.as_cursor(); + assert_eq!(cursor2.current(), Some(&5)); + assert_eq!(cursor2.index(), Some(4)); + cursor2.move_prev(); + assert_eq!(cursor2.current(), Some(&4)); + assert_eq!(cursor2.index(), Some(3)); + assert_eq!(cursor.current(), Some(&mut 5)); + assert_eq!(cursor.index(), Some(4)); +} + +#[test] +fn test_cursor_mut_insert() { + let mut m: LinkedList = LinkedList::new(); + m.extend(&[1, 2, 3, 4, 5, 6]); + let mut cursor = m.cursor_front_mut(); + cursor.insert_before(7); + cursor.insert_after(8); + check_links(&m); + assert_eq!(m.iter().cloned().collect::>(), &[7, 1, 8, 2, 3, 4, 5, 6]); + let mut cursor = m.cursor_front_mut(); + cursor.move_prev(); + cursor.insert_before(9); + cursor.insert_after(10); + check_links(&m); + assert_eq!(m.iter().cloned().collect::>(), &[10, 7, 1, 8, 2, 3, 4, 5, 6, 9]); + let mut cursor = m.cursor_front_mut(); + cursor.move_prev(); + assert_eq!(cursor.remove_current(), None); + cursor.move_next(); + cursor.move_next(); + assert_eq!(cursor.remove_current(), Some(7)); + cursor.move_prev(); + cursor.move_prev(); + cursor.move_prev(); + assert_eq!(cursor.remove_current(), Some(9)); + cursor.move_next(); + assert_eq!(cursor.remove_current(), Some(10)); + check_links(&m); + assert_eq!(m.iter().cloned().collect::>(), &[1, 8, 2, 3, 4, 5, 6]); + let mut cursor = m.cursor_front_mut(); + let mut p: LinkedList = LinkedList::new(); + p.extend(&[100, 101, 102, 103]); + let mut q: LinkedList = LinkedList::new(); + q.extend(&[200, 201, 202, 203]); + cursor.splice_after(p); + cursor.splice_before(q); + check_links(&m); + assert_eq!( + m.iter().cloned().collect::>(), + &[200, 201, 202, 203, 1, 100, 101, 102, 103, 8, 2, 3, 4, 5, 6] + ); + let mut cursor = m.cursor_front_mut(); + cursor.move_prev(); + let tmp = cursor.split_before(); + assert_eq!(m.into_iter().collect::>(), &[]); + m = tmp; + let mut cursor = m.cursor_front_mut(); + cursor.move_next(); + cursor.move_next(); + cursor.move_next(); + cursor.move_next(); + cursor.move_next(); + cursor.move_next(); + let tmp = cursor.split_after(); + assert_eq!(tmp.into_iter().collect::>(), &[102, 103, 8, 2, 3, 4, 5, 6]); + check_links(&m); + assert_eq!(m.iter().cloned().collect::>(), &[200, 201, 202, 203, 1, 100, 101]); +} diff --git a/src/liballoc/collections/mod.rs b/src/liballoc/collections/mod.rs index f1f22fe48c..0bb62373fa 100644 --- a/src/liballoc/collections/mod.rs +++ b/src/liballoc/collections/mod.rs @@ -45,7 +45,7 @@ use crate::alloc::{Layout, LayoutErr}; /// The error type for `try_reserve` methods. #[derive(Clone, PartialEq, Eq, Debug)] -#[unstable(feature = "try_reserve", reason = "new API", issue="48043")] +#[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] pub enum TryReserveError { /// Error due to the computed capacity exceeding the collection's maximum /// (usually `isize::MAX` bytes). @@ -57,15 +57,19 @@ pub enum TryReserveError { layout: Layout, #[doc(hidden)] - #[unstable(feature = "container_error_extra", issue = "0", reason = "\ + #[unstable( + feature = "container_error_extra", + issue = "none", + reason = "\ Enable exposing the allocator’s custom error value \ if an associated type is added in the future: \ - https://github.com/rust-lang/wg-allocators/issues/23")] + https://github.com/rust-lang/wg-allocators/issues/23" + )] non_exhaustive: (), }, } -#[unstable(feature = "try_reserve", reason = "new API", issue="48043")] +#[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] impl From for TryReserveError { #[inline] fn from(_: LayoutErr) -> Self { diff --git a/src/liballoc/collections/vec_deque.rs b/src/liballoc/collections/vec_deque.rs index 913613653a..2cc450bb68 100644 --- a/src/liballoc/collections/vec_deque.rs +++ b/src/liballoc/collections/vec_deque.rs @@ -10,13 +10,13 @@ use core::array::LengthAtMost32; use core::cmp::{self, Ordering}; use core::fmt; +use core::hash::{Hash, Hasher}; use core::iter::{once, repeat_with, FromIterator, FusedIterator}; use core::mem::{self, replace}; use core::ops::Bound::{Excluded, Included, Unbounded}; use core::ops::{Index, IndexMut, RangeBounds, Try}; use core::ptr::{self, NonNull}; use core::slice; -use core::hash::{Hash, Hasher}; use crate::collections::TryReserveError; use crate::raw_vec::RawVec; @@ -89,13 +89,12 @@ impl<'a, 'b, T> PairSlices<'a, 'b, T> { !self.b0.is_empty() } - fn remainder(self) -> impl Iterator { + fn remainder(self) -> impl Iterator { once(self.b0).chain(once(self.b1)) } } -impl<'a, 'b, T> Iterator for PairSlices<'a, 'b, T> -{ +impl<'a, 'b, T> Iterator for PairSlices<'a, 'b, T> { type Item = (&'a mut [T], &'b [T]); fn next(&mut self) -> Option { // Get next part length @@ -247,41 +246,45 @@ impl VecDeque { /// Copies a contiguous block of memory len long from src to dst #[inline] unsafe fn copy(&self, dst: usize, src: usize, len: usize) { - debug_assert!(dst + len <= self.cap(), - "cpy dst={} src={} len={} cap={}", - dst, - src, - len, - self.cap()); - debug_assert!(src + len <= self.cap(), - "cpy dst={} src={} len={} cap={}", - dst, - src, - len, - self.cap()); - ptr::copy(self.ptr().add(src), - self.ptr().add(dst), - len); + debug_assert!( + dst + len <= self.cap(), + "cpy dst={} src={} len={} cap={}", + dst, + src, + len, + self.cap() + ); + debug_assert!( + src + len <= self.cap(), + "cpy dst={} src={} len={} cap={}", + dst, + src, + len, + self.cap() + ); + ptr::copy(self.ptr().add(src), self.ptr().add(dst), len); } /// Copies a contiguous block of memory len long from src to dst #[inline] unsafe fn copy_nonoverlapping(&self, dst: usize, src: usize, len: usize) { - debug_assert!(dst + len <= self.cap(), - "cno dst={} src={} len={} cap={}", - dst, - src, - len, - self.cap()); - debug_assert!(src + len <= self.cap(), - "cno dst={} src={} len={} cap={}", - dst, - src, - len, - self.cap()); - ptr::copy_nonoverlapping(self.ptr().add(src), - self.ptr().add(dst), - len); + debug_assert!( + dst + len <= self.cap(), + "cno dst={} src={} len={} cap={}", + dst, + src, + len, + self.cap() + ); + debug_assert!( + src + len <= self.cap(), + "cno dst={} src={} len={} cap={}", + dst, + src, + len, + self.cap() + ); + ptr::copy_nonoverlapping(self.ptr().add(src), self.ptr().add(dst), len); } /// Copies a potentially wrapping block of memory len long from src to dest. @@ -292,12 +295,14 @@ impl VecDeque { fn diff(a: usize, b: usize) -> usize { if a <= b { b - a } else { a - b } } - debug_assert!(cmp::min(diff(dst, src), self.cap() - diff(dst, src)) + len <= self.cap(), - "wrc dst={} src={} len={} cap={}", - dst, - src, - len, - self.cap()); + debug_assert!( + cmp::min(diff(dst, src), self.cap() - diff(dst, src)) + len <= self.cap(), + "wrc dst={} src={} len={} cap={}", + dst, + src, + len, + self.cap() + ); if src == dst || len == 0 { return; @@ -475,11 +480,7 @@ impl VecDeque { let cap = cmp::max(capacity + 1, MINIMUM_CAPACITY + 1).next_power_of_two(); assert!(cap > capacity, "capacity overflow"); - VecDeque { - tail: 0, - head: 0, - buf: RawVec::with_capacity(cap), - } + VecDeque { tail: 0, head: 0, buf: RawVec::with_capacity(cap) } } /// Retrieves an element in the `VecDeque` by index. @@ -565,10 +566,7 @@ impl VecDeque { assert!(j < self.len()); let ri = self.wrap_add(self.tail, i); let rj = self.wrap_add(self.tail, j); - unsafe { - ptr::swap(self.ptr().add(ri), - self.ptr().add(rj)) - } + unsafe { ptr::swap(self.ptr().add(ri), self.ptr().add(rj)) } } /// Returns the number of elements the `VecDeque` can hold without @@ -635,7 +633,8 @@ impl VecDeque { pub fn reserve(&mut self, additional: usize) { let old_cap = self.cap(); let used_cap = self.len() + 1; - let new_cap = used_cap.checked_add(additional) + let new_cap = used_cap + .checked_add(additional) .and_then(|needed_cap| needed_cap.checked_next_power_of_two()) .expect("capacity overflow"); @@ -683,8 +682,8 @@ impl VecDeque { /// } /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?"); /// ``` - #[unstable(feature = "try_reserve", reason = "new API", issue="48043")] - pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> { + #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] + pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> { self.try_reserve(additional) } @@ -721,11 +720,12 @@ impl VecDeque { /// } /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?"); /// ``` - #[unstable(feature = "try_reserve", reason = "new API", issue="48043")] + #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { let old_cap = self.cap(); let used_cap = self.len() + 1; - let new_cap = used_cap.checked_add(additional) + let new_cap = used_cap + .checked_add(additional) .and_then(|needed_cap| needed_cap.checked_next_power_of_two()) .ok_or(TryReserveError::CapacityOverflow)?; @@ -781,16 +781,14 @@ impl VecDeque { /// buf.shrink_to(0); /// assert!(buf.capacity() >= 4); /// ``` - #[unstable(feature = "shrink_to", reason = "new API", issue="56431")] + #[unstable(feature = "shrink_to", reason = "new API", issue = "56431")] pub fn shrink_to(&mut self, min_capacity: usize) { assert!(self.capacity() >= min_capacity, "Tried to shrink to a larger capacity"); // +1 since the ringbuffer always leaves one space empty // len + 1 can't overflow for an existing, well-formed ringbuffer. - let target_cap = cmp::max( - cmp::max(min_capacity, self.len()) + 1, - MINIMUM_CAPACITY + 1 - ).next_power_of_two(); + let target_cap = cmp::max(cmp::max(min_capacity, self.len()) + 1, MINIMUM_CAPACITY + 1) + .next_power_of_two(); if target_cap < self.cap() { // There are three cases of interest: @@ -913,11 +911,7 @@ impl VecDeque { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn iter(&self) -> Iter<'_, T> { - Iter { - tail: self.tail, - head: self.head, - ring: unsafe { self.buffer_as_slice() }, - } + Iter { tail: self.tail, head: self.head, ring: unsafe { self.buffer_as_slice() } } } /// Returns a front-to-back iterator that returns mutable references. @@ -939,11 +933,7 @@ impl VecDeque { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn iter_mut(&mut self) -> IterMut<'_, T> { - IterMut { - tail: self.tail, - head: self.head, - ring: unsafe { self.buffer_as_mut_slice() }, - } + IterMut { tail: self.tail, head: self.head, ring: unsafe { self.buffer_as_mut_slice() } } } /// Returns a pair of slices which contain, in order, the contents of the @@ -1073,7 +1063,8 @@ impl VecDeque { #[inline] #[stable(feature = "drain", since = "1.6.0")] pub fn drain(&mut self, range: R) -> Drain<'_, T> - where R: RangeBounds + where + R: RangeBounds, { // Memory safety // @@ -1089,12 +1080,12 @@ impl VecDeque { let start = match range.start_bound() { Included(&n) => n, Excluded(&n) => n + 1, - Unbounded => 0, + Unbounded => 0, }; let end = match range.end_bound() { Included(&n) => n + 1, Excluded(&n) => n, - Unbounded => len, + Unbounded => len, }; assert!(start <= end, "drain lower bound was too large"); assert!(end <= len, "drain upper bound was too large"); @@ -1174,7 +1165,8 @@ impl VecDeque { /// ``` #[stable(feature = "vec_deque_contains", since = "1.12.0")] pub fn contains(&self, x: &T) -> bool - where T: PartialEq + where + T: PartialEq, { let (a, b) = self.as_slices(); a.contains(x) || b.contains(x) @@ -1197,11 +1189,7 @@ impl VecDeque { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn front(&self) -> Option<&T> { - if !self.is_empty() { - Some(&self[0]) - } else { - None - } + if !self.is_empty() { Some(&self[0]) } else { None } } /// Provides a mutable reference to the front element, or `None` if the @@ -1225,11 +1213,7 @@ impl VecDeque { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn front_mut(&mut self) -> Option<&mut T> { - if !self.is_empty() { - Some(&mut self[0]) - } else { - None - } + if !self.is_empty() { Some(&mut self[0]) } else { None } } /// Provides a reference to the back element, or `None` if the `VecDeque` is @@ -1249,11 +1233,7 @@ impl VecDeque { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn back(&self) -> Option<&T> { - if !self.is_empty() { - Some(&self[self.len() - 1]) - } else { - None - } + if !self.is_empty() { Some(&self[self.len() - 1]) } else { None } } /// Provides a mutable reference to the back element, or `None` if the @@ -1278,11 +1258,7 @@ impl VecDeque { #[stable(feature = "rust1", since = "1.0.0")] pub fn back_mut(&mut self) -> Option<&mut T> { let len = self.len(); - if !self.is_empty() { - Some(&mut self[len - 1]) - } else { - None - } + if !self.is_empty() { Some(&mut self[len - 1]) } else { None } } /// Removes the first element and returns it, or `None` if the `VecDeque` is @@ -1897,22 +1873,24 @@ impl VecDeque { // `at` lies in the first half. let amount_in_first = first_len - at; - ptr::copy_nonoverlapping(first_half.as_ptr().add(at), - other.ptr(), - amount_in_first); + ptr::copy_nonoverlapping(first_half.as_ptr().add(at), other.ptr(), amount_in_first); // just take all of the second half. - ptr::copy_nonoverlapping(second_half.as_ptr(), - other.ptr().add(amount_in_first), - second_len); + ptr::copy_nonoverlapping( + second_half.as_ptr(), + other.ptr().add(amount_in_first), + second_len, + ); } else { // `at` lies in the second half, need to factor in the elements we skipped // in the first half. let offset = at - first_len; let amount_in_second = second_len - offset; - ptr::copy_nonoverlapping(second_half.as_ptr().add(offset), - other.ptr(), - amount_in_second); + ptr::copy_nonoverlapping( + second_half.as_ptr().add(offset), + other.ptr(), + amount_in_second, + ); } } @@ -1979,7 +1957,8 @@ impl VecDeque { /// ``` #[stable(feature = "vec_deque_retain", since = "1.4.0")] pub fn retain(&mut self, mut f: F) - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { let len = self.len(); let mut del = 0; @@ -2034,7 +2013,7 @@ impl VecDeque { /// assert_eq!(buf, [5, 10, 101, 102, 103]); /// ``` #[stable(feature = "vec_resize_with", since = "1.33.0")] - pub fn resize_with(&mut self, new_len: usize, generator: impl FnMut()->T) { + pub fn resize_with(&mut self, new_len: usize, generator: impl FnMut() -> T) { let len = self.len(); if new_len > len { @@ -2250,10 +2229,7 @@ pub struct Iter<'a, T: 'a> { impl fmt::Debug for Iter<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let (front, back) = RingSlices::ring_slices(self.ring, self.head, self.tail); - f.debug_tuple("Iter") - .field(&front) - .field(&back) - .finish() + f.debug_tuple("Iter").field(&front).field(&back).finish() } } @@ -2261,11 +2237,7 @@ impl fmt::Debug for Iter<'_, T> { #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Iter<'_, T> { fn clone(&self) -> Self { - Iter { - ring: self.ring, - tail: self.tail, - head: self.head, - } + Iter { ring: self.ring, tail: self.tail, head: self.head } } } @@ -2290,7 +2262,8 @@ impl<'a, T> Iterator for Iter<'a, T> { } fn fold(self, mut accum: Acc, mut f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc + where + F: FnMut(Acc, Self::Item) -> Acc, { let (front, back) = RingSlices::ring_slices(self.ring, self.head, self.tail); accum = front.iter().fold(accum, &mut f); @@ -2350,7 +2323,8 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> { } fn rfold(self, mut accum: Acc, mut f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc + where + F: FnMut(Acc, Self::Item) -> Acc, { let (front, back) = RingSlices::ring_slices(self.ring, self.head, self.tail); accum = back.iter().rfold(accum, &mut f); @@ -2392,7 +2366,6 @@ impl ExactSizeIterator for Iter<'_, T> { #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for Iter<'_, T> {} - /// A mutable iterator over the elements of a `VecDeque`. /// /// This `struct` is created by the [`iter_mut`] method on [`VecDeque`]. See its @@ -2411,10 +2384,7 @@ pub struct IterMut<'a, T: 'a> { impl fmt::Debug for IterMut<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let (front, back) = RingSlices::ring_slices(&*self.ring, self.head, self.tail); - f.debug_tuple("IterMut") - .field(&front) - .field(&back) - .finish() + f.debug_tuple("IterMut").field(&front).field(&back).finish() } } @@ -2443,7 +2413,8 @@ impl<'a, T> Iterator for IterMut<'a, T> { } fn fold(self, mut accum: Acc, mut f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc + where + F: FnMut(Acc, Self::Item) -> Acc, { let (front, back) = RingSlices::ring_slices(self.ring, self.head, self.tail); accum = front.iter_mut().fold(accum, &mut f); @@ -2482,7 +2453,8 @@ impl<'a, T> DoubleEndedIterator for IterMut<'a, T> { } fn rfold(self, mut accum: Acc, mut f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc + where + F: FnMut(Acc, Self::Item) -> Acc, { let (front, back) = RingSlices::ring_slices(self.ring, self.head, self.tail); accum = back.iter_mut().rfold(accum, &mut f); @@ -2502,7 +2474,7 @@ impl FusedIterator for IterMut<'_, T> {} /// An owning iterator over the elements of a `VecDeque`. /// -/// This `struct` is created by the [`into_iter`] method on [`VecDeque`][`VecDeque`] +/// This `struct` is created by the [`into_iter`] method on [`VecDeque`] /// (provided by the `IntoIterator` trait). See its documentation for more. /// /// [`into_iter`]: struct.VecDeque.html#method.into_iter @@ -2516,9 +2488,7 @@ pub struct IntoIter { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for IntoIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("IntoIter") - .field(&self.inner) - .finish() + f.debug_tuple("IntoIter").field(&self.inner).finish() } } @@ -2575,10 +2545,10 @@ pub struct Drain<'a, T: 'a> { impl fmt::Debug for Drain<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("Drain") - .field(&self.after_tail) - .field(&self.after_head) - .field(&self.iter) - .finish() + .field(&self.after_tail) + .field(&self.after_head) + .field(&self.iter) + .finish() } } @@ -2835,7 +2805,9 @@ impl Extend for VecDeque { let head = self.head; self.head = self.wrap_add(self.head, 1); - unsafe { self.buffer_write(head, element); } + unsafe { + self.buffer_write(head, element); + } } } } @@ -2873,17 +2845,15 @@ impl From> for VecDeque { // We need to extend the buf if it's not a power of two, too small // or doesn't have at least one free space - if !buf.capacity().is_power_of_two() || (buf.capacity() < (MINIMUM_CAPACITY + 1)) || - (buf.capacity() == len) { + if !buf.capacity().is_power_of_two() + || (buf.capacity() < (MINIMUM_CAPACITY + 1)) + || (buf.capacity() == len) + { let cap = cmp::max(buf.capacity() + 1, MINIMUM_CAPACITY + 1).next_power_of_two(); buf.reserve_exact(len, cap - len); } - VecDeque { - tail: 0, - head: len, - buf, - } + VecDeque { tail: 0, head: len, buf } } } } @@ -2936,9 +2906,7 @@ impl From> for Vec { // do this in at most three copy moves. if (cap - tail) > head { // right hand block is the long one; move that enough for the left - ptr::copy(buf.add(tail), - buf.add(tail - head), - cap - tail); + ptr::copy(buf.add(tail), buf.add(tail - head), cap - tail); // copy left in the end ptr::copy(buf, buf.add(cap - head), head); // shift the new thing to the start @@ -2976,10 +2944,8 @@ impl From> for Vec { let n_ops = right_edge - left_edge; left_edge += n_ops; right_edge += right_offset + 1; - } } - } let out = Vec::from_raw_parts(buf, len, cap); mem::forget(other); diff --git a/src/liballoc/fmt.rs b/src/liballoc/fmt.rs index 18ebae3330..e6162e0f57 100644 --- a/src/liballoc/fmt.rs +++ b/src/liballoc/fmt.rs @@ -330,7 +330,7 @@ //! //! Additionally, the return value of this function is [`fmt::Result`] which is a //! type alias of [`Result`]`<(), `[`std::fmt::Error`]`>`. Formatting implementations -//! should ensure that they propagate errors from the [`Formatter`][`Formatter`] (e.g., when +//! should ensure that they propagate errors from the [`Formatter`] (e.g., when //! calling [`write!`]). However, they should never return errors spuriously. That //! is, a formatting implementation must and may only return an error if the //! passed-in [`Formatter`] returns an error. This is because, contrary to what @@ -514,7 +514,7 @@ #![stable(feature = "rust1", since = "1.0.0")] -#[unstable(feature = "fmt_internals", issue = "0")] +#[unstable(feature = "fmt_internals", issue = "none")] pub use core::fmt::rt; #[stable(feature = "fmt_flags_align", since = "1.28.0")] pub use core::fmt::Alignment; diff --git a/src/liballoc/lib.rs b/src/liballoc/lib.rs index d828e374a7..38c6fa91cc 100644 --- a/src/liballoc/lib.rs +++ b/src/liballoc/lib.rs @@ -58,22 +58,21 @@ #![allow(unused_attributes)] #![stable(feature = "alloc", since = "1.36.0")] -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/", - test(no_crate_inject, attr(allow(unused_variables), deny(warnings))))] +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/", + test(no_crate_inject, attr(allow(unused_variables), deny(warnings))) +)] #![no_std] #![needs_allocator] - #![warn(deprecated_in_future)] #![warn(missing_docs)] #![warn(missing_debug_implementations)] #![deny(intra_doc_link_resolution_failure)] // rustdoc is run without -D warnings #![allow(explicit_outlives_requirements)] #![allow(incomplete_features)] - #![cfg_attr(not(test), feature(generator_trait))] #![cfg_attr(test, feature(test))] - #![feature(allocator_api)] #![feature(allow_internal_unstable)] #![feature(arbitrary_self_types)] @@ -85,6 +84,7 @@ #![feature(const_generic_impls_guard)] #![feature(const_generics)] #![feature(const_in_array_repeat_expressions)] +#![feature(const_if_match)] #![feature(cow_is_borrowed)] #![feature(dispatch_from_dyn)] #![feature(core_intrinsics)] @@ -104,7 +104,6 @@ #![feature(ptr_offset_from)] #![feature(rustc_attrs)] #![feature(receiver_trait)] -#![feature(slice_from_raw_parts)] #![feature(specialization)] #![feature(staged_api)] #![feature(std_internals)] @@ -116,8 +115,6 @@ #![feature(unsize)] #![feature(unsized_locals)] #![feature(allocator_internals)] -#![cfg_attr(bootstrap, feature(on_unimplemented))] -#![cfg_attr(bootstrap, feature(rustc_const_unstable))] #![feature(slice_partition_dedup)] #![feature(maybe_uninit_extra, maybe_uninit_slice)] #![feature(alloc_layout_extra)] @@ -151,19 +148,19 @@ pub mod boxed; mod boxed { pub use std::boxed::Box; } -#[cfg(test)] -mod tests; -pub mod collections; -#[cfg(target_has_atomic = "ptr")] -pub mod sync; -pub mod rc; -pub mod raw_vec; -pub mod prelude; pub mod borrow; +pub mod collections; pub mod fmt; +pub mod prelude; +pub mod raw_vec; +pub mod rc; pub mod slice; pub mod str; pub mod string; +#[cfg(target_has_atomic = "ptr")] +pub mod sync; +#[cfg(test)] +mod tests; pub mod vec; #[cfg(not(test))] @@ -172,7 +169,7 @@ mod std { } #[doc(hidden)] -#[unstable(feature = "liballoc_internals", issue = "0", reason = "implementation detail")] +#[unstable(feature = "liballoc_internals", issue = "none", reason = "implementation detail")] pub mod __export { pub use core::format_args; } diff --git a/src/liballoc/raw_vec.rs b/src/liballoc/raw_vec.rs index ee75fc288f..86aed612ef 100644 --- a/src/liballoc/raw_vec.rs +++ b/src/liballoc/raw_vec.rs @@ -1,4 +1,4 @@ -#![unstable(feature = "raw_vec_internals", reason = "implementation detail", issue = "0")] +#![unstable(feature = "raw_vec_internals", reason = "implementation detail", issue = "none")] #![doc(hidden)] use core::cmp; @@ -7,9 +7,9 @@ use core::ops::Drop; use core::ptr::{self, NonNull, Unique}; use core::slice; -use crate::alloc::{Alloc, Layout, Global, AllocErr, handle_alloc_error}; -use crate::collections::TryReserveError::{self, *}; +use crate::alloc::{handle_alloc_error, Alloc, AllocErr, Global, Layout}; use crate::boxed::Box; +use crate::collections::TryReserveError::{self, *}; #[cfg(test)] mod tests; @@ -52,17 +52,10 @@ impl RawVec { /// Like `new`, but parameterized over the choice of allocator for /// the returned `RawVec`. pub const fn new_in(a: A) -> Self { - // `!0` is `usize::MAX`. This branch should be stripped at compile time. - // FIXME(mark-i-m): use this line when `if`s are allowed in `const`: - //let cap = if mem::size_of::() == 0 { !0 } else { 0 }; + let cap = if mem::size_of::() == 0 { core::usize::MAX } else { 0 }; // `Unique::empty()` doubles as "unallocated" and "zero-sized allocation". - RawVec { - ptr: Unique::empty(), - // FIXME(mark-i-m): use `cap` when ifs are allowed in const - cap: [0, !0][(mem::size_of::() == 0) as usize], - a, - } + RawVec { ptr: Unique::empty(), cap, a } } /// Like `with_capacity`, but parameterized over the choice of @@ -92,22 +85,14 @@ impl RawVec { } else { let align = mem::align_of::(); let layout = Layout::from_size_align(alloc_size, align).unwrap(); - let result = if zeroed { - a.alloc_zeroed(layout) - } else { - a.alloc(layout) - }; + let result = if zeroed { a.alloc_zeroed(layout) } else { a.alloc(layout) }; match result { Ok(ptr) => ptr.cast(), Err(_) => handle_alloc_error(layout), } }; - RawVec { - ptr: ptr.into(), - cap: capacity, - a, - } + RawVec { ptr: ptr.into(), cap: capacity, a } } } } @@ -132,19 +117,7 @@ impl RawVec { /// `RawVec` with capacity `usize::MAX`. Useful for implementing /// delayed allocation. pub const fn new() -> Self { - // FIXME(Centril): Reintegrate this with `fn new_in` when we can. - - // `!0` is `usize::MAX`. This branch should be stripped at compile time. - // FIXME(mark-i-m): use this line when `if`s are allowed in `const`: - //let cap = if mem::size_of::() == 0 { !0 } else { 0 }; - - // `Unique::empty()` doubles as "unallocated" and "zero-sized allocation". - RawVec { - ptr: Unique::empty(), - // FIXME(mark-i-m): use `cap` when ifs are allowed in const - cap: [0, !0][(mem::size_of::() == 0) as usize], - a: Global, - } + Self::new_in(Global) } /// Creates a `RawVec` (on the system heap) with exactly the @@ -183,11 +156,7 @@ impl RawVec { /// The `capacity` cannot exceed `isize::MAX` (only a concern on 32-bit systems). /// If the `ptr` and `capacity` come from a `RawVec` created via `a`, then this is guaranteed. pub unsafe fn from_raw_parts_in(ptr: *mut T, capacity: usize, a: A) -> Self { - RawVec { - ptr: Unique::new_unchecked(ptr), - cap: capacity, - a, - } + RawVec { ptr: Unique::new_unchecked(ptr), cap: capacity, a } } } @@ -200,11 +169,7 @@ impl RawVec { /// The `capacity` cannot exceed `isize::MAX` (only a concern on 32-bit systems). /// If the `ptr` and `capacity` come from a `RawVec`, then this is guaranteed. pub unsafe fn from_raw_parts(ptr: *mut T, capacity: usize) -> Self { - RawVec { - ptr: Unique::new_unchecked(ptr), - cap: capacity, - a: Global, - } + RawVec { ptr: Unique::new_unchecked(ptr), cap: capacity, a: Global } } /// Converts a `Box<[T]>` into a `RawVec`. @@ -230,11 +195,7 @@ impl RawVec { /// This will always be `usize::MAX` if `T` is zero-sized. #[inline(always)] pub fn capacity(&self) -> usize { - if mem::size_of::() == 0 { - !0 - } else { - self.cap - } + if mem::size_of::() == 0 { !0 } else { self.cap } } /// Returns a shared reference to the allocator backing this `RawVec`. @@ -334,14 +295,13 @@ impl RawVec { let new_cap = 2 * self.cap; let new_size = new_cap * elem_size; alloc_guard(new_size).unwrap_or_else(|_| capacity_overflow()); - let ptr_res = self.a.realloc(NonNull::from(self.ptr).cast(), - cur, - new_size); + let ptr_res = self.a.realloc(NonNull::from(self.ptr).cast(), cur, new_size); match ptr_res { Ok(ptr) => (new_cap, ptr.cast().into()), - Err(_) => handle_alloc_error( - Layout::from_size_align_unchecked(new_size, cur.align()) - ), + Err(_) => handle_alloc_error(Layout::from_size_align_unchecked( + new_size, + cur.align(), + )), } } None => { @@ -401,17 +361,17 @@ impl RawVec { self.cap = new_cap; true } - Err(_) => { - false - } + Err(_) => false, } } } /// The same as `reserve_exact`, but returns on errors instead of panicking or aborting. - pub fn try_reserve_exact(&mut self, used_capacity: usize, needed_extra_capacity: usize) - -> Result<(), TryReserveError> { - + pub fn try_reserve_exact( + &mut self, + used_capacity: usize, + needed_extra_capacity: usize, + ) -> Result<(), TryReserveError> { self.reserve_internal(used_capacity, needed_extra_capacity, Fallible, Exact) } @@ -440,18 +400,20 @@ impl RawVec { Err(CapacityOverflow) => capacity_overflow(), Err(AllocError { .. }) => unreachable!(), Ok(()) => { /* yay */ } - } - } + } + } /// Calculates the buffer's new size given that it'll hold `used_capacity + /// needed_extra_capacity` elements. This logic is used in amortized reserve methods. /// Returns `(new_capacity, new_alloc_size)`. - fn amortized_new_size(&self, used_capacity: usize, needed_extra_capacity: usize) - -> Result { - + fn amortized_new_size( + &self, + used_capacity: usize, + needed_extra_capacity: usize, + ) -> Result { // Nothing we can really do about these checks, sadly. - let required_cap = used_capacity.checked_add(needed_extra_capacity) - .ok_or(CapacityOverflow)?; + let required_cap = + used_capacity.checked_add(needed_extra_capacity).ok_or(CapacityOverflow)?; // Cannot overflow, because `cap <= isize::MAX`, and type of `cap` is `usize`. let double_cap = self.cap * 2; // `double_cap` guarantees exponential growth. @@ -459,8 +421,11 @@ impl RawVec { } /// The same as `reserve`, but returns on errors instead of panicking or aborting. - pub fn try_reserve(&mut self, used_capacity: usize, needed_extra_capacity: usize) - -> Result<(), TryReserveError> { + pub fn try_reserve( + &mut self, + used_capacity: usize, + needed_extra_capacity: usize, + ) -> Result<(), TryReserveError> { self.reserve_internal(used_capacity, needed_extra_capacity, Fallible, Amortized) } @@ -558,7 +523,8 @@ impl RawVec { return false; } - let new_cap = self.amortized_new_size(used_capacity, needed_extra_capacity) + let new_cap = self + .amortized_new_size(used_capacity, needed_extra_capacity) .unwrap_or_else(|_| capacity_overflow()); // Here, `cap < used_capacity + needed_extra_capacity <= new_cap` @@ -569,15 +535,15 @@ impl RawVec { // FIXME: may crash and burn on over-reserve alloc_guard(new_layout.size()).unwrap_or_else(|_| capacity_overflow()); match self.a.grow_in_place( - NonNull::from(self.ptr).cast(), old_layout, new_layout.size(), + NonNull::from(self.ptr).cast(), + old_layout, + new_layout.size(), ) { Ok(_) => { self.cap = new_cap; true } - Err(_) => { - false - } + Err(_) => false, } } } @@ -630,13 +596,11 @@ impl RawVec { let new_size = elem_size * amount; let align = mem::align_of::(); let old_layout = Layout::from_size_align_unchecked(old_size, align); - match self.a.realloc(NonNull::from(self.ptr).cast(), - old_layout, - new_size) { + match self.a.realloc(NonNull::from(self.ptr).cast(), old_layout, new_size) { Ok(p) => self.ptr = p.cast().into(), - Err(_) => handle_alloc_error( - Layout::from_size_align_unchecked(new_size, align) - ), + Err(_) => { + handle_alloc_error(Layout::from_size_align_unchecked(new_size, align)) + } } } self.cap = amount; @@ -680,7 +644,9 @@ impl RawVec { // Nothing we can really do about these checks, sadly. let new_cap = match strategy { - Exact => used_capacity.checked_add(needed_extra_capacity).ok_or(CapacityOverflow)?, + Exact => { + used_capacity.checked_add(needed_extra_capacity).ok_or(CapacityOverflow)? + } Amortized => self.amortized_new_size(used_capacity, needed_extra_capacity)?, }; let new_layout = Layout::array::(new_cap).map_err(|_| CapacityOverflow)?; @@ -697,10 +663,12 @@ impl RawVec { let ptr = match (res, fallibility) { (Err(AllocErr), Infallible) => handle_alloc_error(new_layout), - (Err(AllocErr), Fallible) => return Err(TryReserveError::AllocError { - layout: new_layout, - non_exhaustive: (), - }), + (Err(AllocErr), Fallible) => { + return Err(TryReserveError::AllocError { + layout: new_layout, + non_exhaustive: (), + }); + } (Ok(ptr), _) => ptr, }; @@ -710,7 +678,6 @@ impl RawVec { Ok(()) } } - } impl RawVec { @@ -748,7 +715,9 @@ impl RawVec { unsafe impl<#[may_dangle] T, A: Alloc> Drop for RawVec { /// Frees the memory owned by the `RawVec` *without* trying to drop its contents. fn drop(&mut self) { - unsafe { self.dealloc_buffer(); } + unsafe { + self.dealloc_buffer(); + } } } diff --git a/src/liballoc/rc.rs b/src/liballoc/rc.rs index 42a278de98..b176e0f6e2 100644 --- a/src/liballoc/rc.rs +++ b/src/liballoc/rc.rs @@ -239,20 +239,20 @@ use core::array::LengthAtMost32; use core::borrow; use core::cell::Cell; use core::cmp::Ordering; +use core::convert::{From, TryFrom}; use core::fmt; use core::hash::{Hash, Hasher}; use core::intrinsics::abort; use core::iter; -use core::marker::{self, Unpin, Unsize, PhantomData}; +use core::marker::{self, PhantomData, Unpin, Unsize}; use core::mem::{self, align_of, align_of_val, forget, size_of_val}; -use core::ops::{Deref, Receiver, CoerceUnsized, DispatchFromDyn}; +use core::ops::{CoerceUnsized, Deref, DispatchFromDyn, Receiver}; use core::pin::Pin; use core::ptr::{self, NonNull}; use core::slice::{self, from_raw_parts_mut}; -use core::convert::{From, TryFrom}; use core::usize; -use crate::alloc::{Global, Alloc, Layout, box_free, handle_alloc_error}; +use crate::alloc::{box_free, handle_alloc_error, Alloc, Global, Layout}; use crate::string::String; use crate::vec::Vec; @@ -291,15 +291,12 @@ impl !marker::Sync for Rc {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Rc {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Rc {} impl Rc { fn from_inner(ptr: NonNull>) -> Self { - Self { - ptr, - phantom: PhantomData, - } + Self { ptr, phantom: PhantomData } } unsafe fn from_ptr(ptr: *mut RcBox) -> Self { @@ -354,10 +351,9 @@ impl Rc { #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit() -> Rc> { unsafe { - Rc::from_ptr(Rc::allocate_for_layout( - Layout::new::(), - |mem| mem as *mut RcBox>, - )) + Rc::from_ptr(Rc::allocate_for_layout(Layout::new::(), |mem| { + mem as *mut RcBox> + })) } } @@ -466,9 +462,7 @@ impl Rc<[T]> { /// ``` #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit_slice(len: usize) -> Rc<[mem::MaybeUninit]> { - unsafe { - Rc::from_ptr(Rc::allocate_for_slice(len)) - } + unsafe { Rc::from_ptr(Rc::allocate_for_slice(len)) } } } @@ -571,9 +565,19 @@ impl Rc { /// ``` #[stable(feature = "rc_raw", since = "1.17.0")] pub fn into_raw(this: Self) -> *const T { - let ptr: *const T = &*this; + let ptr: *mut RcBox = NonNull::as_ptr(this.ptr); + let fake_ptr = ptr as *mut T; mem::forget(this); - ptr + + // SAFETY: This cannot go through Deref::deref. + // Instead, we manually offset the pointer rather than manifesting a reference. + // This is so that the returned pointer retains the same provenance as our pointer. + // This is required so that e.g. `get_mut` can write through the pointer + // after the Rc is recovered through `from_raw`. + unsafe { + let offset = data_offset(&(*ptr).value); + set_data_ptr(fake_ptr, (ptr as *mut u8).offset(offset)) + } } /// Constructs an `Rc` from a raw pointer. @@ -733,13 +737,7 @@ impl Rc { #[inline] #[stable(feature = "rc_unique", since = "1.4.0")] pub fn get_mut(this: &mut Self) -> Option<&mut T> { - if Rc::is_unique(this) { - unsafe { - Some(Rc::get_mut_unchecked(this)) - } - } else { - None - } + if Rc::is_unique(this) { unsafe { Some(Rc::get_mut_unchecked(this)) } } else { None } } /// Returns a mutable reference into the given `Rc`, @@ -872,9 +870,7 @@ impl Rc { // reference count is guaranteed to be 1 at this point, and we required // the `Rc` itself to be `mut`, so we're returning the only possible // reference to the allocation. - unsafe { - &mut this.ptr.as_mut().value - } + unsafe { &mut this.ptr.as_mut().value } } } @@ -918,19 +914,16 @@ impl Rc { /// and must return back a (potentially fat)-pointer for the `RcBox`. unsafe fn allocate_for_layout( value_layout: Layout, - mem_to_rcbox: impl FnOnce(*mut u8) -> *mut RcBox + mem_to_rcbox: impl FnOnce(*mut u8) -> *mut RcBox, ) -> *mut RcBox { // Calculate layout using the given value layout. // Previously, layout was calculated on the expression // `&*(ptr as *const RcBox)`, but this created a misaligned // reference (see #54908). - let layout = Layout::new::>() - .extend(value_layout).unwrap().0 - .pad_to_align(); + let layout = Layout::new::>().extend(value_layout).unwrap().0.pad_to_align(); // Allocate for the layout. - let mem = Global.alloc(layout) - .unwrap_or_else(|_| handle_alloc_error(layout)); + let mem = Global.alloc(layout).unwrap_or_else(|_| handle_alloc_error(layout)); // Initialize the RcBox let inner = mem_to_rcbox(mem.as_ptr()); @@ -945,10 +938,9 @@ impl Rc { /// Allocates an `RcBox` with sufficient space for an unsized inner value unsafe fn allocate_for_ptr(ptr: *const T) -> *mut RcBox { // Allocate for the `RcBox` using the given value. - Self::allocate_for_layout( - Layout::for_value(&*ptr), - |mem| set_data_ptr(ptr as *mut T, mem) as *mut RcBox, - ) + Self::allocate_for_layout(Layout::for_value(&*ptr), |mem| { + set_data_ptr(ptr as *mut T, mem) as *mut RcBox + }) } fn from_box(v: Box) -> Rc { @@ -963,7 +955,8 @@ impl Rc { ptr::copy_nonoverlapping( bptr as *const T as *const u8, &mut (*ptr).value as *mut _ as *mut u8, - value_size); + value_size, + ); // Free the allocation without dropping its contents box_free(box_unique); @@ -976,10 +969,9 @@ impl Rc { impl Rc<[T]> { /// Allocates an `RcBox<[T]>` with the given length. unsafe fn allocate_for_slice(len: usize) -> *mut RcBox<[T]> { - Self::allocate_for_layout( - Layout::array::(len).unwrap(), - |mem| ptr::slice_from_raw_parts_mut(mem as *mut T, len) as *mut RcBox<[T]>, - ) + Self::allocate_for_layout(Layout::array::(len).unwrap(), |mem| { + ptr::slice_from_raw_parts_mut(mem as *mut T, len) as *mut RcBox<[T]> + }) } } @@ -999,10 +991,7 @@ impl Rc<[T]> { unsafe fn copy_from_slice(v: &[T]) -> Rc<[T]> { let ptr = Self::allocate_for_slice(v.len()); - ptr::copy_nonoverlapping( - v.as_ptr(), - &mut (*ptr).value as *mut [T] as *mut T, - v.len()); + ptr::copy_nonoverlapping(v.as_ptr(), &mut (*ptr).value as *mut [T] as *mut T, v.len()); Self::from_ptr(ptr) } @@ -1040,12 +1029,7 @@ impl Rc<[T]> { // Pointer to first element let elems = &mut (*ptr).value as *mut [T] as *mut T; - let mut guard = Guard { - mem: NonNull::new_unchecked(mem), - elems, - layout, - n_elems: 0, - }; + let mut guard = Guard { mem: NonNull::new_unchecked(mem), elems, layout, n_elems: 0 }; for (i, item) in iter.enumerate() { ptr::write(elems.add(i), item); @@ -1067,9 +1051,7 @@ trait RcFromSlice { impl RcFromSlice for Rc<[T]> { #[inline] default fn from_slice(v: &[T]) -> Self { - unsafe { - Self::from_iter_exact(v.iter().cloned(), v.len()) - } + unsafe { Self::from_iter_exact(v.iter().cloned(), v.len()) } } } @@ -1090,7 +1072,7 @@ impl Deref for Rc { } } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for Rc {} #[stable(feature = "rust1", since = "1.0.0")] @@ -1471,7 +1453,7 @@ impl From> for Rc<[T]> { } } -#[unstable(feature = "boxed_slice_try_from", issue = "0")] +#[unstable(feature = "boxed_slice_try_from", issue = "none")] impl TryFrom> for Rc<[T; N]> where [T; N]: LengthAtMost32, @@ -1543,13 +1525,14 @@ impl> RcFromIter for Rc<[T]> { } } -impl> RcFromIter for Rc<[T]> { +impl> RcFromIter for Rc<[T]> { default fn from_iter(iter: I) -> Self { // This is the case for a `TrustedLen` iterator. let (low, high) = iter.size_hint(); if let Some(high) = high { debug_assert_eq!( - low, high, + low, + high, "TrustedLen iterator's size hint is not exact: {:?}", (low, high) ); @@ -1621,7 +1604,7 @@ impl !marker::Sync for Weak {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Weak {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Weak {} impl Weak { @@ -1641,9 +1624,7 @@ impl Weak { /// ``` #[stable(feature = "downgraded_weak", since = "1.10.0")] pub fn new() -> Weak { - Weak { - ptr: NonNull::new(usize::MAX as *mut RcBox).expect("MAX is not 0"), - } + Weak { ptr: NonNull::new(usize::MAX as *mut RcBox).expect("MAX is not 0") } } /// Returns a raw pointer to the object `T` pointed to by this `Weak`. @@ -1781,9 +1762,7 @@ impl Weak { let offset = data_offset(ptr); let fake_ptr = ptr as *mut RcBox; let ptr = set_data_ptr(fake_ptr, (ptr as *mut u8).offset(-offset)); - Weak { - ptr: NonNull::new(ptr).expect("Invalid pointer passed to from_raw"), - } + Weak { ptr: NonNull::new(ptr).expect("Invalid pointer passed to from_raw") } } } } @@ -1838,11 +1817,7 @@ impl Weak { /// [`Weak::new`]: #method.new #[stable(feature = "weak_counts", since = "1.41.0")] pub fn strong_count(&self) -> usize { - if let Some(inner) = self.inner() { - inner.strong() - } else { - 0 - } + if let Some(inner) = self.inner() { inner.strong() } else { 0 } } /// Gets the number of `Weak` pointers pointing to this allocation. @@ -1850,24 +1825,22 @@ impl Weak { /// If no strong pointers remain, this will return zero. #[stable(feature = "weak_counts", since = "1.41.0")] pub fn weak_count(&self) -> usize { - self.inner().map(|inner| { - if inner.strong() > 0 { - inner.weak() - 1 // subtract the implicit weak ptr - } else { - 0 - } - }).unwrap_or(0) + self.inner() + .map(|inner| { + if inner.strong() > 0 { + inner.weak() - 1 // subtract the implicit weak ptr + } else { + 0 + } + }) + .unwrap_or(0) } /// Returns `None` when the pointer is dangling and there is no allocated `RcBox` /// (i.e., when this `Weak` was created by `Weak::new`). #[inline] fn inner(&self) -> Option<&RcBox> { - if is_dangling(self.ptr) { - None - } else { - Some(unsafe { self.ptr.as_ref() }) - } + if is_dangling(self.ptr) { None } else { Some(unsafe { self.ptr.as_ref() }) } } /// Returns `true` if the two `Weak`s point to the same allocation (similar to @@ -2035,7 +2008,9 @@ trait RcBoxPtr { // nevertheless, we insert an abort here to hint LLVM at // an otherwise missed optimization. if strong == 0 || strong == usize::max_value() { - unsafe { abort(); } + unsafe { + abort(); + } } self.inner().strong.set(strong + 1); } @@ -2059,7 +2034,9 @@ trait RcBoxPtr { // nevertheless, we insert an abort here to hint LLVM at // an otherwise missed optimization. if weak == 0 || weak == usize::max_value() { - unsafe { abort(); } + unsafe { + abort(); + } } self.inner().weak.set(weak + 1); } @@ -2073,9 +2050,7 @@ trait RcBoxPtr { impl RcBoxPtr for Rc { #[inline(always)] fn inner(&self) -> &RcBox { - unsafe { - self.ptr.as_ref() - } + unsafe { self.ptr.as_ref() } } } @@ -2101,11 +2076,13 @@ impl AsRef for Rc { } #[stable(feature = "pin", since = "1.33.0")] -impl Unpin for Rc { } +impl Unpin for Rc {} unsafe fn data_offset(ptr: *const T) -> isize { // Align the unsized value to the end of the `RcBox`. // Because it is ?Sized, it will always be the last field in memory. + // Note: This is a detail of the current implementation of the compiler, + // and is not a guaranteed language detail. Do not rely on it outside of std. data_offset_align(align_of_val(&*ptr)) } diff --git a/src/liballoc/rc/tests.rs b/src/liballoc/rc/tests.rs index bf5c85a5c5..56788bb56d 100644 --- a/src/liballoc/rc/tests.rs +++ b/src/liballoc/rc/tests.rs @@ -2,11 +2,11 @@ use super::*; use std::boxed::Box; use std::cell::RefCell; -use std::option::Option::{self, None, Some}; -use std::result::Result::{Err, Ok}; -use std::mem::drop; use std::clone::Clone; use std::convert::{From, TryInto}; +use std::mem::drop; +use std::option::Option::{self, None, Some}; +use std::result::Result::{Err, Ok}; #[test] fn test_clone() { @@ -341,11 +341,8 @@ fn test_clone_from_slice_panic() { } } - let s: &[Fail] = &[ - Fail(0, "foo".to_string()), - Fail(1, "bar".to_string()), - Fail(2, "baz".to_string()), - ]; + let s: &[Fail] = + &[Fail(0, "foo".to_string()), Fail(1, "bar".to_string()), Fail(2, "baz".to_string())]; // Should panic, but not cause memory corruption let _r: Rc<[Fail]> = Rc::from(s); diff --git a/src/liballoc/slice.rs b/src/liballoc/slice.rs index 2f6d10c027..7b83658fca 100644 --- a/src/liballoc/slice.rs +++ b/src/liballoc/slice.rs @@ -450,7 +450,8 @@ impl [T] { // and `rem` is the remaining part of `n`. // Using `Vec` to access `set_len()`. - let mut buf = Vec::with_capacity(self.len().checked_mul(n).expect("capacity overflow")); + let capacity = self.len().checked_mul(n).expect("capacity overflow"); + let mut buf = Vec::with_capacity(capacity); // `2^expn` repetition is done by doubling `buf` `expn`-times. buf.extend(self); @@ -476,7 +477,7 @@ impl [T] { // `rem` (`= n - 2^expn`) repetition is done by copying // first `rem` repetitions from `buf` itself. - let rem_len = self.len() * n - buf.len(); // `self.len() * rem` + let rem_len = capacity - buf.len(); // `self.len() * rem` if rem_len > 0 { // `buf.extend(buf[0 .. rem_len])`: unsafe { @@ -487,8 +488,7 @@ impl [T] { rem_len, ); // `buf.len() + rem_len` equals to `buf.capacity()` (`= self.len() * n`). - let buf_cap = buf.capacity(); - buf.set_len(buf_cap); + buf.set_len(capacity); } } buf diff --git a/src/liballoc/str.rs b/src/liballoc/str.rs index 83816d8b95..843a2f1f8e 100644 --- a/src/liballoc/str.rs +++ b/src/liballoc/str.rs @@ -23,16 +23,15 @@ //! ``` #![stable(feature = "rust1", since = "1.0.0")] - // Many of the usings in this module are only used in the test configuration. // It's cleaner to just turn off the unused_imports warning than to fix them. #![allow(unused_imports)] use core::borrow::{Borrow, BorrowMut}; -use core::str::pattern::{Pattern, Searcher, ReverseSearcher, DoubleEndedSearcher}; +use core::iter::FusedIterator; use core::mem; use core::ptr; -use core::iter::FusedIterator; +use core::str::pattern::{DoubleEndedSearcher, Pattern, ReverseSearcher, Searcher}; use core::unicode::conversions; use crate::borrow::ToOwned; @@ -42,34 +41,34 @@ use crate::string::String; use crate::vec::Vec; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::{FromStr, Utf8Error}; -#[allow(deprecated)] +pub use core::str::pattern; +#[stable(feature = "encode_utf16", since = "1.8.0")] +pub use core::str::EncodeUtf16; +#[stable(feature = "split_ascii_whitespace", since = "1.34.0")] +pub use core::str::SplitAsciiWhitespace; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::{Lines, LinesAny}; +pub use core::str::SplitWhitespace; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::{Split, RSplit}; +pub use core::str::{from_utf8, from_utf8_mut, Bytes, CharIndices, Chars}; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::{SplitN, RSplitN}; +pub use core::str::{from_utf8_unchecked, from_utf8_unchecked_mut, ParseBoolError}; +#[stable(feature = "str_escape", since = "1.34.0")] +pub use core::str::{EscapeDebug, EscapeDefault, EscapeUnicode}; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::{SplitTerminator, RSplitTerminator}; +pub use core::str::{FromStr, Utf8Error}; +#[allow(deprecated)] #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::{Matches, RMatches}; +pub use core::str::{Lines, LinesAny}; #[stable(feature = "rust1", since = "1.0.0")] pub use core::str::{MatchIndices, RMatchIndices}; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::{from_utf8, from_utf8_mut, Chars, CharIndices, Bytes}; +pub use core::str::{Matches, RMatches}; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::{from_utf8_unchecked, from_utf8_unchecked_mut, ParseBoolError}; +pub use core::str::{RSplit, Split}; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::SplitWhitespace; +pub use core::str::{RSplitN, SplitN}; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::str::pattern; -#[stable(feature = "encode_utf16", since = "1.8.0")] -pub use core::str::EncodeUtf16; -#[stable(feature = "split_ascii_whitespace", since = "1.34.0")] -pub use core::str::SplitAsciiWhitespace; -#[stable(feature = "str_escape", since = "1.34.0")] -pub use core::str::{EscapeDebug, EscapeDefault, EscapeUnicode}; +pub use core::str::{RSplitTerminator, SplitTerminator}; /// Note: `str` in `Concat` is not meaningful here. /// This type parameter of the trait only exists to enable another impl. @@ -87,9 +86,7 @@ impl> Join<&str> for [S] { type Output = String; fn join(slice: &Self, sep: &str) -> String { - unsafe { - String::from_utf8_unchecked( join_generic_copy(slice, sep.as_bytes()) ) - } + unsafe { String::from_utf8_unchecked(join_generic_copy(slice, sep.as_bytes())) } } } @@ -123,10 +120,10 @@ macro_rules! spezialize_for_lengths { macro_rules! copy_slice_and_advance { ($target:expr, $bytes:expr) => { let len = $bytes.len(); - let (head, tail) = {$target}.split_at_mut(len); + let (head, tail) = { $target }.split_at_mut(len); head.copy_from_slice($bytes); $target = tail; - } + }; } // Optimized join implementation that works for both Vec (T: Copy) and String's inner vec @@ -156,11 +153,12 @@ where // if the `len` calculation overflows, we'll panic // we would have run out of memory anyway and the rest of the function requires // the entire Vec pre-allocated for safety - let len = sep_len.checked_mul(iter.len()).and_then(|n| { - slice.iter() - .map(|s| s.borrow().as_ref().len()) - .try_fold(n, usize::checked_add) - }).expect("attempt to join into collection with len > usize::MAX"); + let len = sep_len + .checked_mul(iter.len()) + .and_then(|n| { + slice.iter().map(|s| s.borrow().as_ref().len()).try_fold(n, usize::checked_add) + }) + .expect("attempt to join into collection with len > usize::MAX"); // crucial for safety let mut result = Vec::with_capacity(len); @@ -390,13 +388,13 @@ impl str { // See http://www.unicode.org/versions/Unicode7.0.0/ch03.pdf#G33992 // for the definition of `Final_Sigma`. debug_assert!('Σ'.len_utf8() == 2); - let is_word_final = case_ignoreable_then_cased(from[..i].chars().rev()) && - !case_ignoreable_then_cased(from[i + 2..].chars()); + let is_word_final = case_ignoreable_then_cased(from[..i].chars().rev()) + && !case_ignoreable_then_cased(from[i + 2..].chars()); to.push_str(if is_word_final { "ς" } else { "σ" }); } fn case_ignoreable_then_cased>(iter: I) -> bool { - use core::unicode::derived_property::{Cased, Case_Ignorable}; + use core::unicode::derived_property::{Case_Ignorable, Cased}; match iter.skip_while(|&c| Case_Ignorable(c)).next() { Some(c) => Cased(c), None => false, diff --git a/src/liballoc/string.rs b/src/liballoc/string.rs index bf9bbba475..96f871d889 100644 --- a/src/liballoc/string.rs +++ b/src/liballoc/string.rs @@ -50,15 +50,15 @@ use core::char::{decode_utf16, REPLACEMENT_CHARACTER}; use core::fmt; use core::hash; use core::iter::{FromIterator, FusedIterator}; -use core::ops::{self, Add, AddAssign, Index, IndexMut, RangeBounds}; use core::ops::Bound::{Excluded, Included, Unbounded}; +use core::ops::{self, Add, AddAssign, Index, IndexMut, RangeBounds}; use core::ptr; -use core::str::{pattern::Pattern, lossy}; +use core::str::{lossy, pattern::Pattern}; use crate::borrow::{Cow, ToOwned}; -use crate::collections::TryReserveError; use crate::boxed::Box; -use crate::str::{self, from_boxed_utf8_unchecked, FromStr, Utf8Error, Chars}; +use crate::collections::TryReserveError; +use crate::str::{self, from_boxed_utf8_unchecked, Chars, FromStr, Utf8Error}; use crate::vec::Vec; /// A UTF-8 encoded, growable string. @@ -367,10 +367,7 @@ impl String { /// let s = String::new(); /// ``` #[inline] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_string_new", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_string_new", since = "1.32.0")] #[stable(feature = "rust1", since = "1.0.0")] pub const fn new() -> String { String { vec: Vec::new() } @@ -494,12 +491,7 @@ impl String { pub fn from_utf8(vec: Vec) -> Result { match str::from_utf8(&vec) { Ok(..) => Ok(String { vec }), - Err(e) => { - Err(FromUtf8Error { - bytes: vec, - error: e, - }) - } + Err(e) => Err(FromUtf8Error { bytes: vec, error: e }), } } @@ -988,7 +980,7 @@ impl String { /// } /// # process_data("rust").expect("why is the test harness OOMing on 4 bytes?"); /// ``` - #[unstable(feature = "try_reserve", reason = "new API", issue="48043")] + #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { self.vec.try_reserve(additional) } @@ -1026,8 +1018,8 @@ impl String { /// } /// # process_data("rust").expect("why is the test harness OOMing on 4 bytes?"); /// ``` - #[unstable(feature = "try_reserve", reason = "new API", issue="48043")] - pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> { + #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] + pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> { self.vec.try_reserve_exact(additional) } @@ -1075,7 +1067,7 @@ impl String { /// assert!(s.capacity() >= 3); /// ``` #[inline] - #[unstable(feature = "shrink_to", reason = "new API", issue="56431")] + #[unstable(feature = "shrink_to", reason = "new API", issue = "56431")] pub fn shrink_to(&mut self, min_capacity: usize) { self.vec.shrink_to(min_capacity) } @@ -1225,9 +1217,7 @@ impl String { let next = idx + ch.len_utf8(); let len = self.len(); unsafe { - ptr::copy(self.vec.as_ptr().add(next), - self.vec.as_mut_ptr().add(idx), - len - next); + ptr::copy(self.vec.as_ptr().add(next), self.vec.as_mut_ptr().add(idx), len - next); self.vec.set_len(len - (next - idx)); } ch @@ -1261,25 +1251,26 @@ impl String { #[inline] #[stable(feature = "string_retain", since = "1.26.0")] pub fn retain(&mut self, mut f: F) - where F: FnMut(char) -> bool + where + F: FnMut(char) -> bool, { let len = self.len(); let mut del_bytes = 0; let mut idx = 0; while idx < len { - let ch = unsafe { - self.get_unchecked(idx..len).chars().next().unwrap() - }; + let ch = unsafe { self.get_unchecked(idx..len).chars().next().unwrap() }; let ch_len = ch.len_utf8(); if !f(ch) { del_bytes += ch_len; } else if del_bytes > 0 { unsafe { - ptr::copy(self.vec.as_ptr().add(idx), - self.vec.as_mut_ptr().add(idx - del_bytes), - ch_len); + ptr::copy( + self.vec.as_ptr().add(idx), + self.vec.as_mut_ptr().add(idx - del_bytes), + ch_len, + ); } } @@ -1288,7 +1279,9 @@ impl String { } if del_bytes > 0 { - unsafe { self.vec.set_len(len - del_bytes); } + unsafe { + self.vec.set_len(len - del_bytes); + } } } @@ -1334,12 +1327,8 @@ impl String { let amt = bytes.len(); self.vec.reserve(amt); - ptr::copy(self.vec.as_ptr().add(idx), - self.vec.as_mut_ptr().add(idx + amt), - len - idx); - ptr::copy(bytes.as_ptr(), - self.vec.as_mut_ptr().add(idx), - amt); + ptr::copy(self.vec.as_ptr().add(idx), self.vec.as_mut_ptr().add(idx + amt), len - idx); + ptr::copy(bytes.as_ptr(), self.vec.as_mut_ptr().add(idx), amt); self.vec.set_len(len + amt); } @@ -1534,7 +1523,8 @@ impl String { /// ``` #[stable(feature = "drain", since = "1.6.0")] pub fn drain(&mut self, range: R) -> Drain<'_> - where R: RangeBounds + where + R: RangeBounds, { // Memory safety // @@ -1560,12 +1550,7 @@ impl String { // slicing does the appropriate bounds checks let chars_iter = self[start..end].chars(); - Drain { - start, - end, - iter: chars_iter, - string: self_ptr, - } + Drain { start, end, iter: chars_iter, string: self_ptr } } /// Removes the specified range in the string, @@ -1594,7 +1579,8 @@ impl String { /// ``` #[stable(feature = "splice", since = "1.27.0")] pub fn replace_range(&mut self, range: R, replace_with: &str) - where R: RangeBounds + where + R: RangeBounds, { // Memory safety // @@ -1602,19 +1588,17 @@ impl String { // of the vector version. The data is just plain bytes. match range.start_bound() { - Included(&n) => assert!(self.is_char_boundary(n)), - Excluded(&n) => assert!(self.is_char_boundary(n + 1)), - Unbounded => {}, + Included(&n) => assert!(self.is_char_boundary(n)), + Excluded(&n) => assert!(self.is_char_boundary(n + 1)), + Unbounded => {} }; match range.end_bound() { - Included(&n) => assert!(self.is_char_boundary(n + 1)), - Excluded(&n) => assert!(self.is_char_boundary(n)), - Unbounded => {}, + Included(&n) => assert!(self.is_char_boundary(n + 1)), + Excluded(&n) => assert!(self.is_char_boundary(n)), + Unbounded => {} }; - unsafe { - self.as_mut_vec() - }.splice(range, replace_with.bytes()); + unsafe { self.as_mut_vec() }.splice(range, replace_with.bytes()); } /// Converts this `String` into a [`Box`]`<`[`str`]`>`. @@ -1843,9 +1827,11 @@ impl<'a> Extend> for String { } /// A convenience impl that delegates to the impl for `&str` -#[unstable(feature = "pattern", - reason = "API not fully fleshed out and ready to be stabilized", - issue = "27721")] +#[unstable( + feature = "pattern", + reason = "API not fully fleshed out and ready to be stabilized", + issue = "27721" +)] impl<'a, 'b> Pattern<'a> for &'b String { type Searcher = <&'b str as Pattern<'a>>::Searcher; @@ -1882,21 +1868,28 @@ macro_rules! impl_eq { #[allow(unused_lifetimes)] impl<'a, 'b> PartialEq<$rhs> for $lhs { #[inline] - fn eq(&self, other: &$rhs) -> bool { PartialEq::eq(&self[..], &other[..]) } + fn eq(&self, other: &$rhs) -> bool { + PartialEq::eq(&self[..], &other[..]) + } #[inline] - fn ne(&self, other: &$rhs) -> bool { PartialEq::ne(&self[..], &other[..]) } + fn ne(&self, other: &$rhs) -> bool { + PartialEq::ne(&self[..], &other[..]) + } } #[stable(feature = "rust1", since = "1.0.0")] #[allow(unused_lifetimes)] impl<'a, 'b> PartialEq<$lhs> for $rhs { #[inline] - fn eq(&self, other: &$lhs) -> bool { PartialEq::eq(&self[..], &other[..]) } + fn eq(&self, other: &$lhs) -> bool { + PartialEq::eq(&self[..], &other[..]) + } #[inline] - fn ne(&self, other: &$lhs) -> bool { PartialEq::ne(&self[..], &other[..]) } + fn ne(&self, other: &$lhs) -> bool { + PartialEq::ne(&self[..], &other[..]) + } } - - } + }; } impl_eq! { String, str } @@ -2137,7 +2130,6 @@ impl FromStr for String { } } - /// A trait for converting a value to a `String`. /// /// This trait is automatically implemented for any type which implements the @@ -2178,7 +2170,7 @@ impl ToString for T { use fmt::Write; let mut buf = String::new(); buf.write_fmt(format_args!("{}", self)) - .expect("a Display implementation returned an error unexpectedly"); + .expect("a Display implementation returned an error unexpectedly"); buf.shrink_to_fit(); buf } diff --git a/src/liballoc/sync.rs b/src/liballoc/sync.rs index a99564c0da..4aa0190b14 100644 --- a/src/liballoc/sync.rs +++ b/src/liballoc/sync.rs @@ -8,24 +8,24 @@ use core::any::Any; use core::array::LengthAtMost32; -use core::sync::atomic; -use core::sync::atomic::Ordering::{Acquire, Relaxed, Release, SeqCst}; use core::borrow; -use core::fmt; use core::cmp::Ordering; -use core::iter; +use core::convert::{From, TryFrom}; +use core::fmt; +use core::hash::{Hash, Hasher}; use core::intrinsics::abort; +use core::iter; +use core::marker::{PhantomData, Unpin, Unsize}; use core::mem::{self, align_of, align_of_val, size_of_val}; -use core::ops::{Deref, Receiver, CoerceUnsized, DispatchFromDyn}; +use core::ops::{CoerceUnsized, Deref, DispatchFromDyn, Receiver}; use core::pin::Pin; use core::ptr::{self, NonNull}; -use core::marker::{Unpin, Unsize, PhantomData}; -use core::hash::{Hash, Hasher}; -use core::{isize, usize}; -use core::convert::{From, TryFrom}; use core::slice::{self, from_raw_parts_mut}; +use core::sync::atomic; +use core::sync::atomic::Ordering::{Acquire, Relaxed, Release, SeqCst}; +use core::{isize, usize}; -use crate::alloc::{Global, Alloc, Layout, box_free, handle_alloc_error}; +use crate::alloc::{box_free, handle_alloc_error, Alloc, Global, Layout}; use crate::boxed::Box; use crate::rc::is_dangling; use crate::string::String; @@ -206,15 +206,12 @@ unsafe impl Sync for Arc {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Arc {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Arc {} impl Arc { fn from_inner(ptr: NonNull>) -> Self { - Self { - ptr, - phantom: PhantomData, - } + Self { ptr, phantom: PhantomData } } unsafe fn from_ptr(ptr: *mut ArcInner) -> Self { @@ -263,7 +260,7 @@ unsafe impl Sync for Weak {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl, U: ?Sized> CoerceUnsized> for Weak {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn> for Weak {} #[stable(feature = "arc_weak", since = "1.4.0")] @@ -334,10 +331,9 @@ impl Arc { #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit() -> Arc> { unsafe { - Arc::from_ptr(Arc::allocate_for_layout( - Layout::new::(), - |mem| mem as *mut ArcInner>, - )) + Arc::from_ptr(Arc::allocate_for_layout(Layout::new::(), |mem| { + mem as *mut ArcInner> + })) } } @@ -446,9 +442,7 @@ impl Arc<[T]> { /// ``` #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit_slice(len: usize) -> Arc<[mem::MaybeUninit]> { - unsafe { - Arc::from_ptr(Arc::allocate_for_slice(len)) - } + unsafe { Arc::from_ptr(Arc::allocate_for_slice(len)) } } } @@ -551,9 +545,19 @@ impl Arc { /// ``` #[stable(feature = "rc_raw", since = "1.17.0")] pub fn into_raw(this: Self) -> *const T { - let ptr: *const T = &*this; + let ptr: *mut ArcInner = NonNull::as_ptr(this.ptr); + let fake_ptr = ptr as *mut T; mem::forget(this); - ptr + + // SAFETY: This cannot go through Deref::deref. + // Instead, we manually offset the pointer rather than manifesting a reference. + // This is so that the returned pointer retains the same provenance as our pointer. + // This is required so that e.g. `get_mut` can write through the pointer + // after the Arc is recovered through `from_raw`. + unsafe { + let offset = data_offset(&(*ptr).data); + set_data_ptr(fake_ptr, (ptr as *mut u8).offset(offset)) + } } /// Constructs an `Arc` from a raw pointer. @@ -772,18 +776,15 @@ impl Arc { /// and must return back a (potentially fat)-pointer for the `ArcInner`. unsafe fn allocate_for_layout( value_layout: Layout, - mem_to_arcinner: impl FnOnce(*mut u8) -> *mut ArcInner + mem_to_arcinner: impl FnOnce(*mut u8) -> *mut ArcInner, ) -> *mut ArcInner { // Calculate layout using the given value layout. // Previously, layout was calculated on the expression // `&*(ptr as *const ArcInner)`, but this created a misaligned // reference (see #54908). - let layout = Layout::new::>() - .extend(value_layout).unwrap().0 - .pad_to_align(); + let layout = Layout::new::>().extend(value_layout).unwrap().0.pad_to_align(); - let mem = Global.alloc(layout) - .unwrap_or_else(|_| handle_alloc_error(layout)); + let mem = Global.alloc(layout).unwrap_or_else(|_| handle_alloc_error(layout)); // Initialize the ArcInner let inner = mem_to_arcinner(mem.as_ptr()); @@ -798,10 +799,9 @@ impl Arc { /// Allocates an `ArcInner` with sufficient space for an unsized inner value. unsafe fn allocate_for_ptr(ptr: *const T) -> *mut ArcInner { // Allocate for the `ArcInner` using the given value. - Self::allocate_for_layout( - Layout::for_value(&*ptr), - |mem| set_data_ptr(ptr as *mut T, mem) as *mut ArcInner, - ) + Self::allocate_for_layout(Layout::for_value(&*ptr), |mem| { + set_data_ptr(ptr as *mut T, mem) as *mut ArcInner + }) } fn from_box(v: Box) -> Arc { @@ -816,7 +816,8 @@ impl Arc { ptr::copy_nonoverlapping( bptr as *const T as *const u8, &mut (*ptr).data as *mut _ as *mut u8, - value_size); + value_size, + ); // Free the allocation without dropping its contents box_free(box_unique); @@ -829,10 +830,9 @@ impl Arc { impl Arc<[T]> { /// Allocates an `ArcInner<[T]>` with the given length. unsafe fn allocate_for_slice(len: usize) -> *mut ArcInner<[T]> { - Self::allocate_for_layout( - Layout::array::(len).unwrap(), - |mem| ptr::slice_from_raw_parts_mut(mem as *mut T, len) as *mut ArcInner<[T]>, - ) + Self::allocate_for_layout(Layout::array::(len).unwrap(), |mem| { + ptr::slice_from_raw_parts_mut(mem as *mut T, len) as *mut ArcInner<[T]> + }) } } @@ -852,10 +852,7 @@ impl Arc<[T]> { unsafe fn copy_from_slice(v: &[T]) -> Arc<[T]> { let ptr = Self::allocate_for_slice(v.len()); - ptr::copy_nonoverlapping( - v.as_ptr(), - &mut (*ptr).data as *mut [T] as *mut T, - v.len()); + ptr::copy_nonoverlapping(v.as_ptr(), &mut (*ptr).data as *mut [T] as *mut T, v.len()); Self::from_ptr(ptr) } @@ -893,12 +890,7 @@ impl Arc<[T]> { // Pointer to first element let elems = &mut (*ptr).data as *mut [T] as *mut T; - let mut guard = Guard { - mem: NonNull::new_unchecked(mem), - elems, - layout, - n_elems: 0, - }; + let mut guard = Guard { mem: NonNull::new_unchecked(mem), elems, layout, n_elems: 0 }; for (i, item) in iter.enumerate() { ptr::write(elems.add(i), item); @@ -920,9 +912,7 @@ trait ArcFromSlice { impl ArcFromSlice for Arc<[T]> { #[inline] default fn from_slice(v: &[T]) -> Self { - unsafe { - Self::from_iter_exact(v.iter().cloned(), v.len()) - } + unsafe { Self::from_iter_exact(v.iter().cloned(), v.len()) } } } @@ -993,7 +983,7 @@ impl Deref for Arc { } } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for Arc {} impl Arc { @@ -1079,9 +1069,7 @@ impl Arc { // As with `get_mut()`, the unsafety is ok because our reference was // either unique to begin with, or became one upon cloning the contents. - unsafe { - &mut this.ptr.as_mut().data - } + unsafe { &mut this.ptr.as_mut().data } } } @@ -1121,9 +1109,7 @@ impl Arc { // reference count is guaranteed to be 1 at this point, and we required // the Arc itself to be `mut`, so we're returning the only possible // reference to the inner data. - unsafe { - Some(Arc::get_mut_unchecked(this)) - } + unsafe { Some(Arc::get_mut_unchecked(this)) } } else { None } @@ -1317,9 +1303,7 @@ impl Weak { /// ``` #[stable(feature = "downgraded_weak", since = "1.10.0")] pub fn new() -> Weak { - Weak { - ptr: NonNull::new(usize::MAX as *mut ArcInner).expect("MAX is not 0"), - } + Weak { ptr: NonNull::new(usize::MAX as *mut ArcInner).expect("MAX is not 0") } } /// Returns a raw pointer to the object `T` pointed to by this `Weak`. @@ -1458,9 +1442,7 @@ impl Weak { let offset = data_offset(ptr); let fake_ptr = ptr as *mut ArcInner; let ptr = set_data_ptr(fake_ptr, (ptr as *mut u8).offset(-offset)); - Weak { - ptr: NonNull::new(ptr).expect("Invalid pointer passed to from_raw"), - } + Weak { ptr: NonNull::new(ptr).expect("Invalid pointer passed to from_raw") } } } } @@ -1531,11 +1513,7 @@ impl Weak { /// [`Weak::new`]: #method.new #[stable(feature = "weak_counts", since = "1.41.0")] pub fn strong_count(&self) -> usize { - if let Some(inner) = self.inner() { - inner.strong.load(SeqCst) - } else { - 0 - } + if let Some(inner) = self.inner() { inner.strong.load(SeqCst) } else { 0 } } /// Gets an approximation of the number of `Weak` pointers pointing to this @@ -1553,31 +1531,29 @@ impl Weak { /// [`Weak::new`]: #method.new #[stable(feature = "weak_counts", since = "1.41.0")] pub fn weak_count(&self) -> usize { - self.inner().map(|inner| { - let weak = inner.weak.load(SeqCst); - let strong = inner.strong.load(SeqCst); - if strong == 0 { - 0 - } else { - // Since we observed that there was at least one strong pointer - // after reading the weak count, we know that the implicit weak - // reference (present whenever any strong references are alive) - // was still around when we observed the weak count, and can - // therefore safely subtract it. - weak - 1 - } - }).unwrap_or(0) + self.inner() + .map(|inner| { + let weak = inner.weak.load(SeqCst); + let strong = inner.strong.load(SeqCst); + if strong == 0 { + 0 + } else { + // Since we observed that there was at least one strong pointer + // after reading the weak count, we know that the implicit weak + // reference (present whenever any strong references are alive) + // was still around when we observed the weak count, and can + // therefore safely subtract it. + weak - 1 + } + }) + .unwrap_or(0) } /// Returns `None` when the pointer is dangling and there is no allocated `ArcInner`, /// (i.e., when this `Weak` was created by `Weak::new`). #[inline] fn inner(&self) -> Option<&ArcInner> { - if is_dangling(self.ptr) { - None - } else { - Some(unsafe { self.ptr.as_ref() }) - } + if is_dangling(self.ptr) { None } else { Some(unsafe { self.ptr.as_ref() }) } } /// Returns `true` if the two `Weak`s point to the same allocation (similar to @@ -1722,17 +1698,11 @@ impl Drop for Weak { // weak count can only be locked if there was precisely one weak ref, // meaning that drop could only subsequently run ON that remaining weak // ref, which can only happen after the lock is released. - let inner = if let Some(inner) = self.inner() { - inner - } else { - return - }; + let inner = if let Some(inner) = self.inner() { inner } else { return }; if inner.weak.fetch_sub(1, Release) == 1 { atomic::fence(Acquire); - unsafe { - Global.dealloc(self.ptr.cast(), Layout::for_value(self.ptr.as_ref())) - } + unsafe { Global.dealloc(self.ptr.cast(), Layout::for_value(self.ptr.as_ref())) } } } } @@ -2032,7 +2002,7 @@ impl From> for Arc<[T]> { } } -#[unstable(feature = "boxed_slice_try_from", issue = "0")] +#[unstable(feature = "boxed_slice_try_from", issue = "none")] impl TryFrom> for Arc<[T; N]> where [T; N]: LengthAtMost32, @@ -2110,7 +2080,8 @@ impl> ArcFromIter for Arc<[T]> { let (low, high) = iter.size_hint(); if let Some(high) = high { debug_assert_eq!( - low, high, + low, + high, "TrustedLen iterator's size hint is not exact: {:?}", (low, high) ); @@ -2155,12 +2126,14 @@ impl AsRef for Arc { } #[stable(feature = "pin", since = "1.33.0")] -impl Unpin for Arc { } +impl Unpin for Arc {} /// Computes the offset of the data field within `ArcInner`. unsafe fn data_offset(ptr: *const T) -> isize { // Align the unsized value to the end of the `ArcInner`. // Because it is `?Sized`, it will always be the last field in memory. + // Note: This is a detail of the current implementation of the compiler, + // and is not a guaranteed language detail. Do not rely on it outside of std. data_offset_align(align_of_val(&*ptr)) } diff --git a/src/liballoc/sync/tests.rs b/src/liballoc/sync/tests.rs index 8f516129cd..edc2820ee2 100644 --- a/src/liballoc/sync/tests.rs +++ b/src/liballoc/sync/tests.rs @@ -2,14 +2,17 @@ use super::*; use std::boxed::Box; use std::clone::Clone; -use std::sync::mpsc::channel; +use std::convert::{From, TryInto}; use std::mem::drop; use std::ops::Drop; use std::option::Option::{self, None, Some}; -use std::sync::atomic::{self, Ordering::{Acquire, SeqCst}}; -use std::thread; +use std::sync::atomic::{ + self, + Ordering::{Acquire, SeqCst}, +}; +use std::sync::mpsc::channel; use std::sync::Mutex; -use std::convert::{From, TryInto}; +use std::thread; use crate::vec::Vec; @@ -394,11 +397,8 @@ fn test_clone_from_slice_panic() { } } - let s: &[Fail] = &[ - Fail(0, "foo".to_string()), - Fail(1, "bar".to_string()), - Fail(2, "baz".to_string()), - ]; + let s: &[Fail] = + &[Fail(0, "foo".to_string()), Fail(1, "bar".to_string()), Fail(2, "baz".to_string())]; // Should panic, but not cause memory corruption let _r: Arc<[Fail]> = Arc::from(s); diff --git a/src/liballoc/tests/arc.rs b/src/liballoc/tests/arc.rs index 2fbb59b041..34384cfcba 100644 --- a/src/liballoc/tests/arc.rs +++ b/src/liballoc/tests/arc.rs @@ -142,7 +142,7 @@ fn shared_from_iter_trustedlen_normal() { // Try a ZST to make sure it is handled well. { - let iter = (0..SHARED_ITER_MAX).map(|_| ()); + let iter = (0..SHARED_ITER_MAX).map(drop); let vec = iter.clone().collect::>(); let rc = iter.collect::>(); assert_eq!(&*vec, &*rc); diff --git a/src/liballoc/tests/binary_heap.rs b/src/liballoc/tests/binary_heap.rs index a896a1064d..f49ca71392 100644 --- a/src/liballoc/tests/binary_heap.rs +++ b/src/liballoc/tests/binary_heap.rs @@ -1,5 +1,5 @@ -use std::collections::BinaryHeap; use std::collections::binary_heap::{Drain, PeekMut}; +use std::collections::BinaryHeap; use std::iter::TrustedLen; #[test] @@ -349,10 +349,10 @@ fn assert_covariance() { #[test] #[cfg(not(target_os = "emscripten"))] fn panic_safe() { + use rand::{seq::SliceRandom, thread_rng}; use std::cmp; use std::panic::{self, AssertUnwindSafe}; use std::sync::atomic::{AtomicUsize, Ordering}; - use rand::{thread_rng, seq::SliceRandom}; static DROP_COUNTER: AtomicUsize = AtomicUsize::new(0); @@ -389,10 +389,8 @@ fn panic_safe() { for i in 1..=DATASZ { DROP_COUNTER.store(0, Ordering::SeqCst); - let mut panic_ords: Vec<_> = data.iter() - .filter(|&&x| x != i) - .map(|&x| PanicOrd(x, false)) - .collect(); + let mut panic_ords: Vec<_> = + data.iter().filter(|&&x| x != i).map(|&x| PanicOrd(x, false)).collect(); let panic_item = PanicOrd(i, true); // heapify the sane items diff --git a/src/liballoc/tests/btree/map.rs b/src/liballoc/tests/btree/map.rs index 27843aeaeb..f5be72c39b 100644 --- a/src/liballoc/tests/btree/map.rs +++ b/src/liballoc/tests/btree/map.rs @@ -1,8 +1,11 @@ -use std::collections::BTreeMap; use std::collections::btree_map::Entry::{Occupied, Vacant}; +use std::collections::BTreeMap; +use std::convert::TryFrom; +use std::fmt::Debug; +use std::iter::FromIterator; use std::ops::Bound::{self, Excluded, Included, Unbounded}; +use std::ops::RangeBounds; use std::rc::Rc; -use std::iter::FromIterator; use super::DeterministicRng; @@ -57,36 +60,75 @@ fn test_basic_large() { #[test] fn test_basic_small() { let mut map = BTreeMap::new(); + // Empty, shared root: assert_eq!(map.remove(&1), None); assert_eq!(map.len(), 0); + assert_eq!(map.get(&1), None); + assert_eq!(map.get_mut(&1), None); assert_eq!(map.first_key_value(), None); assert_eq!(map.last_key_value(), None); - assert_eq!(map.get(&1), None); + assert_eq!(map.keys().count(), 0); + assert_eq!(map.values().count(), 0); + assert_eq!(map.range(..).next(), None); + assert_eq!(map.range(..1).next(), None); + assert_eq!(map.range(1..).next(), None); + assert_eq!(map.range(1..=1).next(), None); + assert_eq!(map.range(1..2).next(), None); assert_eq!(map.insert(1, 1), None); + + // 1 key-value pair: assert_eq!(map.len(), 1); assert_eq!(map.get(&1), Some(&1)); + assert_eq!(map.get_mut(&1), Some(&mut 1)); assert_eq!(map.first_key_value(), Some((&1, &1))); assert_eq!(map.last_key_value(), Some((&1, &1))); + assert_eq!(map.keys().collect::>(), vec![&1]); + assert_eq!(map.values().collect::>(), vec![&1]); assert_eq!(map.insert(1, 2), Some(1)); assert_eq!(map.len(), 1); assert_eq!(map.get(&1), Some(&2)); + assert_eq!(map.get_mut(&1), Some(&mut 2)); assert_eq!(map.first_key_value(), Some((&1, &2))); assert_eq!(map.last_key_value(), Some((&1, &2))); + assert_eq!(map.keys().collect::>(), vec![&1]); + assert_eq!(map.values().collect::>(), vec![&2]); assert_eq!(map.insert(2, 4), None); + + // 2 key-value pairs: assert_eq!(map.len(), 2); assert_eq!(map.get(&2), Some(&4)); + assert_eq!(map.get_mut(&2), Some(&mut 4)); assert_eq!(map.first_key_value(), Some((&1, &2))); assert_eq!(map.last_key_value(), Some((&2, &4))); + assert_eq!(map.keys().collect::>(), vec![&1, &2]); + assert_eq!(map.values().collect::>(), vec![&2, &4]); assert_eq!(map.remove(&1), Some(2)); + + // 1 key-value pair: assert_eq!(map.len(), 1); assert_eq!(map.get(&1), None); + assert_eq!(map.get_mut(&1), None); assert_eq!(map.get(&2), Some(&4)); + assert_eq!(map.get_mut(&2), Some(&mut 4)); assert_eq!(map.first_key_value(), Some((&2, &4))); assert_eq!(map.last_key_value(), Some((&2, &4))); + assert_eq!(map.keys().collect::>(), vec![&2]); + assert_eq!(map.values().collect::>(), vec![&4]); assert_eq!(map.remove(&2), Some(4)); + + // Empty but private root: assert_eq!(map.len(), 0); + assert_eq!(map.get(&1), None); + assert_eq!(map.get_mut(&1), None); assert_eq!(map.first_key_value(), None); assert_eq!(map.last_key_value(), None); + assert_eq!(map.keys().count(), 0); + assert_eq!(map.values().count(), 0); + assert_eq!(map.range(..).next(), None); + assert_eq!(map.range(..1).next(), None); + assert_eq!(map.range(1..).next(), None); + assert_eq!(map.range(1..=1).next(), None); + assert_eq!(map.range(1..2).next(), None); assert_eq!(map.remove(&1), None); } @@ -97,11 +139,11 @@ fn test_iter() { #[cfg(miri)] let size = 200; - // Forwards let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect(); fn test(size: usize, mut iter: T) - where T: Iterator + where + T: Iterator, { for i in 0..size { assert_eq!(iter.size_hint(), (size - i, Some(size - i))); @@ -122,11 +164,11 @@ fn test_iter_rev() { #[cfg(miri)] let size = 200; - // Forwards let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect(); fn test(size: usize, mut iter: T) - where T: Iterator + where + T: Iterator, { for i in 0..size { assert_eq!(iter.size_hint(), (size - i, Some(size - i))); @@ -140,6 +182,87 @@ fn test_iter_rev() { test(size, map.into_iter().rev()); } +/// Specifically tests iter_mut's ability to mutate the value of pairs in-line +fn do_test_iter_mut_mutation(size: usize) +where + T: Copy + Debug + Ord + TryFrom, + >::Error: std::fmt::Debug, +{ + let zero = T::try_from(0).unwrap(); + let mut map: BTreeMap = (0..size).map(|i| (T::try_from(i).unwrap(), zero)).collect(); + + // Forward and backward iteration sees enough pairs (also tested elsewhere) + assert_eq!(map.iter_mut().count(), size); + assert_eq!(map.iter_mut().rev().count(), size); + + // Iterate forwards, trying to mutate to unique values + for (i, (k, v)) in map.iter_mut().enumerate() { + assert_eq!(*k, T::try_from(i).unwrap()); + assert_eq!(*v, zero); + *v = T::try_from(i + 1).unwrap(); + } + + // Iterate backwards, checking that mutations succeeded and trying to mutate again + for (i, (k, v)) in map.iter_mut().rev().enumerate() { + assert_eq!(*k, T::try_from(size - i - 1).unwrap()); + assert_eq!(*v, T::try_from(size - i).unwrap()); + *v = T::try_from(2 * size - i).unwrap(); + } + + // Check that backward mutations succeeded + for (i, (k, v)) in map.iter_mut().enumerate() { + assert_eq!(*k, T::try_from(i).unwrap()); + assert_eq!(*v, T::try_from(size + i + 1).unwrap()); + } +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)] +#[repr(align(32))] +struct Align32(usize); + +impl TryFrom for Align32 { + type Error = (); + + fn try_from(s: usize) -> Result { + Ok(Align32(s)) + } +} + +#[test] +fn test_iter_mut_mutation() { + // Check many alignments because various fields precede array in NodeHeader. + // Check with size 0 which should not iterate at all. + // Check with size 1 for a tree with one kind of node (root = leaf). + // Check with size 12 for a tree with two kinds of nodes (root and leaves). + // Check with size 144 for a tree with all kinds of nodes (root, internals and leaves). + do_test_iter_mut_mutation::(0); + do_test_iter_mut_mutation::(1); + do_test_iter_mut_mutation::(12); + do_test_iter_mut_mutation::(127); // not enough unique values to test 144 + do_test_iter_mut_mutation::(1); + do_test_iter_mut_mutation::(12); + do_test_iter_mut_mutation::(144); + do_test_iter_mut_mutation::(1); + do_test_iter_mut_mutation::(12); + do_test_iter_mut_mutation::(144); + do_test_iter_mut_mutation::(1); + do_test_iter_mut_mutation::(12); + do_test_iter_mut_mutation::(144); + do_test_iter_mut_mutation::(1); + do_test_iter_mut_mutation::(12); + do_test_iter_mut_mutation::(144); + do_test_iter_mut_mutation::(1); + do_test_iter_mut_mutation::(12); + do_test_iter_mut_mutation::(144); +} + +#[test] +fn test_into_key_slice_with_shared_root_past_bounds() { + let mut map: BTreeMap = BTreeMap::new(); + assert_eq!(map.get(&Align32(1)), None); + assert_eq!(map.get_mut(&Align32(1)), None); +} + #[test] fn test_values_mut() { let mut a = BTreeMap::new(); @@ -161,11 +284,11 @@ fn test_iter_mixed() { #[cfg(miri)] let size = 200; - // Forwards let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect(); fn test(size: usize, mut iter: T) - where T: Iterator + DoubleEndedIterator + where + T: Iterator + DoubleEndedIterator, { for i in 0..size / 4 { assert_eq!(iter.size_hint(), (size - i * 2, Some(size - i * 2))); @@ -184,49 +307,161 @@ fn test_iter_mixed() { test(size, map.into_iter()); } -#[test] -fn test_range_small() { - let size = 5; - - // Forwards - let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect(); - - let mut j = 0; - for ((&k, &v), i) in map.range(2..).zip(2..size) { - assert_eq!(k, i); - assert_eq!(v, i); - j += 1; - } - assert_eq!(j, size - 2); +fn range_keys(map: &BTreeMap, range: impl RangeBounds) -> Vec { + map.range(range) + .map(|(&k, &v)| { + assert_eq!(k, v); + k + }) + .collect() } #[test] -fn test_range_inclusive() { - let size = 500; +fn test_range_small() { + let size = 4; + + let map: BTreeMap<_, _> = (1..=size).map(|i| (i, i)).collect(); + let all: Vec<_> = (1..=size).collect(); + let (first, last) = (vec![all[0]], vec![all[size as usize - 1]]); + + assert_eq!(range_keys(&map, (Excluded(0), Excluded(size + 1))), all); + assert_eq!(range_keys(&map, (Excluded(0), Included(size + 1))), all); + assert_eq!(range_keys(&map, (Excluded(0), Included(size))), all); + assert_eq!(range_keys(&map, (Excluded(0), Unbounded)), all); + assert_eq!(range_keys(&map, (Included(0), Excluded(size + 1))), all); + assert_eq!(range_keys(&map, (Included(0), Included(size + 1))), all); + assert_eq!(range_keys(&map, (Included(0), Included(size))), all); + assert_eq!(range_keys(&map, (Included(0), Unbounded)), all); + assert_eq!(range_keys(&map, (Included(1), Excluded(size + 1))), all); + assert_eq!(range_keys(&map, (Included(1), Included(size + 1))), all); + assert_eq!(range_keys(&map, (Included(1), Included(size))), all); + assert_eq!(range_keys(&map, (Included(1), Unbounded)), all); + assert_eq!(range_keys(&map, (Unbounded, Excluded(size + 1))), all); + assert_eq!(range_keys(&map, (Unbounded, Included(size + 1))), all); + assert_eq!(range_keys(&map, (Unbounded, Included(size))), all); + assert_eq!(range_keys(&map, ..), all); + + assert_eq!(range_keys(&map, (Excluded(0), Excluded(1))), vec![]); + assert_eq!(range_keys(&map, (Excluded(0), Included(0))), vec![]); + assert_eq!(range_keys(&map, (Included(0), Included(0))), vec![]); + assert_eq!(range_keys(&map, (Included(0), Excluded(1))), vec![]); + assert_eq!(range_keys(&map, (Unbounded, Excluded(1))), vec![]); + assert_eq!(range_keys(&map, (Unbounded, Included(0))), vec![]); + assert_eq!(range_keys(&map, (Excluded(0), Excluded(2))), first); + assert_eq!(range_keys(&map, (Excluded(0), Included(1))), first); + assert_eq!(range_keys(&map, (Included(0), Excluded(2))), first); + assert_eq!(range_keys(&map, (Included(0), Included(1))), first); + assert_eq!(range_keys(&map, (Included(1), Excluded(2))), first); + assert_eq!(range_keys(&map, (Included(1), Included(1))), first); + assert_eq!(range_keys(&map, (Unbounded, Excluded(2))), first); + assert_eq!(range_keys(&map, (Unbounded, Included(1))), first); + assert_eq!(range_keys(&map, (Excluded(size - 1), Excluded(size + 1))), last); + assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size + 1))), last); + assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size))), last); + assert_eq!(range_keys(&map, (Excluded(size - 1), Unbounded)), last); + assert_eq!(range_keys(&map, (Included(size), Excluded(size + 1))), last); + assert_eq!(range_keys(&map, (Included(size), Included(size + 1))), last); + assert_eq!(range_keys(&map, (Included(size), Included(size))), last); + assert_eq!(range_keys(&map, (Included(size), Unbounded)), last); + assert_eq!(range_keys(&map, (Excluded(size), Excluded(size + 1))), vec![]); + assert_eq!(range_keys(&map, (Excluded(size), Included(size))), vec![]); + assert_eq!(range_keys(&map, (Excluded(size), Unbounded)), vec![]); + assert_eq!(range_keys(&map, (Included(size + 1), Excluded(size + 1))), vec![]); + assert_eq!(range_keys(&map, (Included(size + 1), Included(size + 1))), vec![]); + assert_eq!(range_keys(&map, (Included(size + 1), Unbounded)), vec![]); + + assert_eq!(range_keys(&map, ..3), vec![1, 2]); + assert_eq!(range_keys(&map, 3..), vec![3, 4]); + assert_eq!(range_keys(&map, 2..=3), vec![2, 3]); +} + +#[test] +fn test_range_depth_2() { + // Assuming that node.CAPACITY is 11, having 12 pairs implies a depth 2 tree + // with 2 leaves. Depending on details we don't want or need to rely upon, + // the single key at the root will be 6 or 7. + + let map: BTreeMap<_, _> = (1..=12).map(|i| (i, i)).collect(); + for &root in &[6, 7] { + assert_eq!(range_keys(&map, (Excluded(root), Excluded(root + 1))), vec![]); + assert_eq!(range_keys(&map, (Excluded(root), Included(root + 1))), vec![root + 1]); + assert_eq!(range_keys(&map, (Included(root), Excluded(root + 1))), vec![root]); + assert_eq!(range_keys(&map, (Included(root), Included(root + 1))), vec![root, root + 1]); + + assert_eq!(range_keys(&map, (Excluded(root - 1), Excluded(root))), vec![]); + assert_eq!(range_keys(&map, (Included(root - 1), Excluded(root))), vec![root - 1]); + assert_eq!(range_keys(&map, (Excluded(root - 1), Included(root))), vec![root]); + assert_eq!(range_keys(&map, (Included(root - 1), Included(root))), vec![root - 1, root]); + } +} + +#[test] +fn test_range_large() { + let size = 200; - let map: BTreeMap<_, _> = (0..=size).map(|i| (i, i)).collect(); + let map: BTreeMap<_, _> = (1..=size).map(|i| (i, i)).collect(); + let all: Vec<_> = (1..=size).collect(); + let (first, last) = (vec![all[0]], vec![all[size as usize - 1]]); + + assert_eq!(range_keys(&map, (Excluded(0), Excluded(size + 1))), all); + assert_eq!(range_keys(&map, (Excluded(0), Included(size + 1))), all); + assert_eq!(range_keys(&map, (Excluded(0), Included(size))), all); + assert_eq!(range_keys(&map, (Excluded(0), Unbounded)), all); + assert_eq!(range_keys(&map, (Included(0), Excluded(size + 1))), all); + assert_eq!(range_keys(&map, (Included(0), Included(size + 1))), all); + assert_eq!(range_keys(&map, (Included(0), Included(size))), all); + assert_eq!(range_keys(&map, (Included(0), Unbounded)), all); + assert_eq!(range_keys(&map, (Included(1), Excluded(size + 1))), all); + assert_eq!(range_keys(&map, (Included(1), Included(size + 1))), all); + assert_eq!(range_keys(&map, (Included(1), Included(size))), all); + assert_eq!(range_keys(&map, (Included(1), Unbounded)), all); + assert_eq!(range_keys(&map, (Unbounded, Excluded(size + 1))), all); + assert_eq!(range_keys(&map, (Unbounded, Included(size + 1))), all); + assert_eq!(range_keys(&map, (Unbounded, Included(size))), all); + assert_eq!(range_keys(&map, ..), all); + + assert_eq!(range_keys(&map, (Excluded(0), Excluded(1))), vec![]); + assert_eq!(range_keys(&map, (Excluded(0), Included(0))), vec![]); + assert_eq!(range_keys(&map, (Included(0), Included(0))), vec![]); + assert_eq!(range_keys(&map, (Included(0), Excluded(1))), vec![]); + assert_eq!(range_keys(&map, (Unbounded, Excluded(1))), vec![]); + assert_eq!(range_keys(&map, (Unbounded, Included(0))), vec![]); + assert_eq!(range_keys(&map, (Excluded(0), Excluded(2))), first); + assert_eq!(range_keys(&map, (Excluded(0), Included(1))), first); + assert_eq!(range_keys(&map, (Included(0), Excluded(2))), first); + assert_eq!(range_keys(&map, (Included(0), Included(1))), first); + assert_eq!(range_keys(&map, (Included(1), Excluded(2))), first); + assert_eq!(range_keys(&map, (Included(1), Included(1))), first); + assert_eq!(range_keys(&map, (Unbounded, Excluded(2))), first); + assert_eq!(range_keys(&map, (Unbounded, Included(1))), first); + assert_eq!(range_keys(&map, (Excluded(size - 1), Excluded(size + 1))), last); + assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size + 1))), last); + assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size))), last); + assert_eq!(range_keys(&map, (Excluded(size - 1), Unbounded)), last); + assert_eq!(range_keys(&map, (Included(size), Excluded(size + 1))), last); + assert_eq!(range_keys(&map, (Included(size), Included(size + 1))), last); + assert_eq!(range_keys(&map, (Included(size), Included(size))), last); + assert_eq!(range_keys(&map, (Included(size), Unbounded)), last); + assert_eq!(range_keys(&map, (Excluded(size), Excluded(size + 1))), vec![]); + assert_eq!(range_keys(&map, (Excluded(size), Included(size))), vec![]); + assert_eq!(range_keys(&map, (Excluded(size), Unbounded)), vec![]); + assert_eq!(range_keys(&map, (Included(size + 1), Excluded(size + 1))), vec![]); + assert_eq!(range_keys(&map, (Included(size + 1), Included(size + 1))), vec![]); + assert_eq!(range_keys(&map, (Included(size + 1), Unbounded)), vec![]); fn check<'a, L, R>(lhs: L, rhs: R) - where L: IntoIterator, - R: IntoIterator, + where + L: IntoIterator, + R: IntoIterator, { let lhs: Vec<_> = lhs.into_iter().collect(); let rhs: Vec<_> = rhs.into_iter().collect(); assert_eq!(lhs, rhs); } - check(map.range(size + 1..=size + 1), vec![]); - check(map.range(size..=size), vec![(&size, &size)]); - check(map.range(size..=size + 1), vec![(&size, &size)]); - check(map.range(0..=0), vec![(&0, &0)]); - check(map.range(0..=size - 1), map.range(..size)); - check(map.range(-1..=-1), vec![]); - check(map.range(-1..=size), map.range(..)); - check(map.range(..=size), map.range(..)); - check(map.range(..=200), map.range(..201)); + check(map.range(..=100), map.range(..101)); check(map.range(5..=8), vec![(&5, &5), (&6, &6), (&7, &7), (&8, &8)]); - check(map.range(-1..=0), vec![(&0, &0)]); - check(map.range(-1..=2), vec![(&0, &0), (&1, &1), (&2, &2)]); + check(map.range(-1..=2), vec![(&1, &1), (&2, &2)]); } #[test] @@ -313,7 +548,7 @@ fn test_range_borrowed_key() { map.insert("coyote".to_string(), 3); map.insert("dingo".to_string(), 4); // NOTE: would like to use simply "b".."d" here... - let mut iter = map.range::((Included("b"),Excluded("d"))); + let mut iter = map.range::((Included("b"), Excluded("d"))); assert_eq!(iter.next(), Some((&"baboon".to_string(), &2))); assert_eq!(iter.next(), Some((&"coyote".to_string(), &3))); assert_eq!(iter.next(), None); @@ -408,7 +643,6 @@ fn test_entry() { assert_eq!(map.get(&1).unwrap(), &100); assert_eq!(map.len(), 6); - // Existing key (update) match map.entry(2) { Vacant(_) => unreachable!(), @@ -430,7 +664,6 @@ fn test_entry() { assert_eq!(map.get(&3), None); assert_eq!(map.len(), 5); - // Inexistent key (insert) match map.entry(10) { Occupied(_) => unreachable!(), @@ -555,7 +788,7 @@ fn test_clone() { #[test] #[allow(dead_code)] fn test_variance() { - use std::collections::btree_map::{Iter, IntoIter, Range, Keys, Values}; + use std::collections::btree_map::{IntoIter, Iter, Keys, Range, Values}; fn map_key<'new>(v: BTreeMap<&'static str, ()>) -> BTreeMap<&'new str, ()> { v @@ -649,7 +882,6 @@ fn test_first_last_entry() { assert_eq!(a.last_entry().unwrap().key(), &1); } - macro_rules! create_append_test { ($name:ident, $len:expr) => { #[test] @@ -661,7 +893,7 @@ macro_rules! create_append_test { let mut b = BTreeMap::new(); for i in 5..$len { - b.insert(i, 2*i); + b.insert(i, 2 * i); } a.append(&mut b); @@ -673,12 +905,12 @@ macro_rules! create_append_test { if i < 5 { assert_eq!(a[&i], i); } else { - assert_eq!(a[&i], 2*i); + assert_eq!(a[&i], 2 * i); } } - assert_eq!(a.remove(&($len-1)), Some(2*($len-1))); - assert_eq!(a.insert($len-1, 20), None); + assert_eq!(a.remove(&($len - 1)), Some(2 * ($len - 1))); + assert_eq!(a.insert($len - 1, 20), None); } }; } diff --git a/src/liballoc/tests/btree/set.rs b/src/liballoc/tests/btree/set.rs index 13cd262802..265ef758cc 100644 --- a/src/liballoc/tests/btree/set.rs +++ b/src/liballoc/tests/btree/set.rs @@ -32,7 +32,8 @@ fn test_hash() { } fn check(a: &[i32], b: &[i32], expected: &[i32], f: F) - where F: FnOnce(&BTreeSet, &BTreeSet, &mut dyn FnMut(&i32) -> bool) -> bool +where + F: FnOnce(&BTreeSet, &BTreeSet, &mut dyn FnMut(&i32) -> bool) -> bool, { let mut set_a = BTreeSet::new(); let mut set_b = BTreeSet::new(); @@ -45,15 +46,13 @@ fn check(a: &[i32], b: &[i32], expected: &[i32], f: F) } let mut i = 0; - f(&set_a, - &set_b, - &mut |&x| { - if i < expected.len() { - assert_eq!(x, expected[i]); - } - i += 1; - true - }); + f(&set_a, &set_b, &mut |&x| { + if i < expected.len() { + assert_eq!(x, expected[i]); + } + i += 1; + true + }); assert_eq!(i, expected.len()); } @@ -68,11 +67,10 @@ fn test_intersection() { check_intersection(&[], &[1, 2, 3], &[]); check_intersection(&[2], &[1, 2, 3], &[2]); check_intersection(&[1, 2, 3], &[2], &[2]); - check_intersection(&[11, 1, 3, 77, 103, 5, -5], - &[2, 11, 77, -9, -42, 5, 3], - &[3, 5, 11, 77]); + check_intersection(&[11, 1, 3, 77, 103, 5, -5], &[2, 11, 77, -9, -42, 5, 3], &[3, 5, 11, 77]); - if cfg!(miri) { // Miri is too slow + if cfg!(miri) { + // Miri is too slow return; } @@ -87,9 +85,7 @@ fn test_intersection() { check_intersection(&large, &[99], &[99]); check_intersection(&[100], &large, &[]); check_intersection(&large, &[100], &[]); - check_intersection(&[11, 5000, 1, 3, 77, 8924], - &large, - &[1, 3, 11, 77]); + check_intersection(&[11, 5000, 1, 3, 77, 8924], &large, &[1, 3, 11, 77]); } #[test] @@ -121,11 +117,14 @@ fn test_difference() { check_difference(&[1, 3, 5, 9, 11], &[3, 6, 9], &[1, 5, 11]); check_difference(&[1, 3, 5, 9, 11], &[0, 1], &[3, 5, 9, 11]); check_difference(&[1, 3, 5, 9, 11], &[11, 12], &[1, 3, 5, 9]); - check_difference(&[-5, 11, 22, 33, 40, 42], - &[-12, -5, 14, 23, 34, 38, 39, 50], - &[11, 22, 33, 40, 42]); - - if cfg!(miri) { // Miri is too slow + check_difference( + &[-5, 11, 22, 33, 40, 42], + &[-12, -5, 14, 23, 34, 38, 39, 50], + &[11, 22, 33, 40, 42], + ); + + if cfg!(miri) { + // Miri is too slow return; } @@ -135,9 +134,7 @@ fn test_difference() { check_difference(&[0], &large, &[]); check_difference(&[99], &large, &[]); check_difference(&[100], &large, &[100]); - check_difference(&[11, 5000, 1, 3, 77, 8924], - &large, - &[5000, 8924]); + check_difference(&[11, 5000, 1, 3, 77, 8924], &large, &[5000, 8924]); check_difference(&large, &[], &large); check_difference(&large, &[-1], &large); check_difference(&large, &[100], &large); @@ -216,9 +213,7 @@ fn test_symmetric_difference() { check_symmetric_difference(&[], &[], &[]); check_symmetric_difference(&[1, 2, 3], &[2], &[1, 3]); check_symmetric_difference(&[2], &[1, 2, 3], &[1, 3]); - check_symmetric_difference(&[1, 3, 5, 9, 11], - &[-2, 3, 9, 14, 22], - &[-2, 1, 5, 11, 14, 22]); + check_symmetric_difference(&[1, 3, 5, 9, 11], &[-2, 3, 9, 14, 22], &[-2, 1, 5, 11, 14, 22]); } #[test] @@ -242,9 +237,11 @@ fn test_union() { check_union(&[], &[], &[]); check_union(&[1, 2, 3], &[2], &[1, 2, 3]); check_union(&[2], &[1, 2, 3], &[1, 2, 3]); - check_union(&[1, 3, 5, 9, 11, 16, 19, 24], - &[-2, 1, 5, 9, 13, 19], - &[-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]); + check_union( + &[1, 3, 5, 9, 11, 16, 19, 24], + &[-2, 1, 5, 9, 13, 19], + &[-2, 1, 3, 5, 9, 11, 13, 16, 19, 24], + ); } #[test] @@ -285,14 +282,14 @@ fn test_is_subset() { assert_eq!(is_subset(&[1, 2], &[1]), false); assert_eq!(is_subset(&[1, 2], &[1, 2]), true); assert_eq!(is_subset(&[1, 2], &[2, 3]), false); - assert_eq!(is_subset(&[-5, 11, 22, 33, 40, 42], - &[-12, -5, 11, 14, 22, 23, 33, 34, 38, 39, 40, 42]), - true); - assert_eq!(is_subset(&[-5, 11, 22, 33, 40, 42], - &[-12, -5, 11, 14, 22, 23, 34, 38]), - false); - - if cfg!(miri) { // Miri is too slow + assert_eq!( + is_subset(&[-5, 11, 22, 33, 40, 42], &[-12, -5, 11, 14, 22, 23, 33, 34, 38, 39, 40, 42]), + true + ); + assert_eq!(is_subset(&[-5, 11, 22, 33, 40, 42], &[-12, -5, 11, 14, 22, 23, 34, 38]), false); + + if cfg!(miri) { + // Miri is too slow return; } @@ -305,6 +302,15 @@ fn test_is_subset() { assert_eq!(is_subset(&[99, 100], &large), false); } +#[test] +fn test_clear() { + let mut x = BTreeSet::new(); + x.insert(1); + + x.clear(); + assert!(x.is_empty()); +} + #[test] fn test_zip() { let mut x = BTreeSet::new(); diff --git a/src/liballoc/tests/heap.rs b/src/liballoc/tests/heap.rs index 904b3e7e1b..43cd718782 100644 --- a/src/liballoc/tests/heap.rs +++ b/src/liballoc/tests/heap.rs @@ -1,4 +1,4 @@ -use std::alloc::{Global, Alloc, Layout, System}; +use std::alloc::{Alloc, Global, Layout, System}; /// Issue #45955 and #62251. #[test] @@ -12,16 +12,23 @@ fn std_heap_overaligned_request() { } fn check_overalign_requests(mut allocator: T) { - for &align in &[4, 8, 16, 32] { // less than and bigger than `MIN_ALIGN` - for &size in &[align/2, align-1] { // size less than alignment + for &align in &[4, 8, 16, 32] { + // less than and bigger than `MIN_ALIGN` + for &size in &[align / 2, align - 1] { + // size less than alignment let iterations = 128; unsafe { - let pointers: Vec<_> = (0..iterations).map(|_| { - allocator.alloc(Layout::from_size_align(size, align).unwrap()).unwrap() - }).collect(); + let pointers: Vec<_> = (0..iterations) + .map(|_| { + allocator.alloc(Layout::from_size_align(size, align).unwrap()).unwrap() + }) + .collect(); for &ptr in &pointers { - assert_eq!((ptr.as_ptr() as usize) % align, 0, - "Got a pointer less aligned than requested") + assert_eq!( + (ptr.as_ptr() as usize) % align, + 0, + "Got a pointer less aligned than requested" + ) } // Clean up diff --git a/src/liballoc/tests/lib.rs b/src/liballoc/tests/lib.rs index 605e0ef55d..c1ae67a1a3 100644 --- a/src/liballoc/tests/lib.rs +++ b/src/liballoc/tests/lib.rs @@ -11,9 +11,10 @@ #![feature(associated_type_bounds)] #![feature(binary_heap_into_iter_sorted)] #![feature(binary_heap_drain_sorted)] +#![feature(vec_remove_item)] -use std::hash::{Hash, Hasher}; use std::collections::hash_map::DefaultHasher; +use std::hash::{Hash, Hasher}; mod arc; mod binary_heap; @@ -27,8 +28,8 @@ mod rc; mod slice; mod str; mod string; -mod vec_deque; mod vec; +mod vec_deque; fn hash(t: &T) -> u64 { let mut s = DefaultHasher::new(); diff --git a/src/liballoc/tests/linked_list.rs b/src/liballoc/tests/linked_list.rs index 54a77d643c..b7736515b2 100644 --- a/src/liballoc/tests/linked_list.rs +++ b/src/liballoc/tests/linked_list.rs @@ -531,7 +531,6 @@ fn drain_filter_complex() { } } - #[test] fn test_drop() { static mut DROPS: i32 = 0; diff --git a/src/liballoc/tests/rc.rs b/src/liballoc/tests/rc.rs index e77c57d9a5..884856cd1b 100644 --- a/src/liballoc/tests/rc.rs +++ b/src/liballoc/tests/rc.rs @@ -138,7 +138,7 @@ fn shared_from_iter_trustedlen_normal() { // Try a ZST to make sure it is handled well. { - let iter = (0..SHARED_ITER_MAX).map(|_| ()); + let iter = (0..SHARED_ITER_MAX).map(drop); let vec = iter.clone().collect::>(); let rc = iter.collect::>(); assert_eq!(&*vec, &*rc); diff --git a/src/liballoc/tests/slice.rs b/src/liballoc/tests/slice.rs index ec45de7c79..51ddb5e7a4 100644 --- a/src/liballoc/tests/slice.rs +++ b/src/liballoc/tests/slice.rs @@ -3,11 +3,11 @@ use std::cmp::Ordering::{self, Equal, Greater, Less}; use std::mem; use std::panic; use std::rc::Rc; -use std::sync::atomic::{Ordering::Relaxed, AtomicUsize}; +use std::sync::atomic::{AtomicUsize, Ordering::Relaxed}; -use rand::{Rng, RngCore, thread_rng}; -use rand::seq::SliceRandom; use rand::distributions::Standard; +use rand::seq::SliceRandom; +use rand::{thread_rng, Rng, RngCore}; fn square(n: usize) -> usize { n * n @@ -231,7 +231,6 @@ fn test_slice_to() { assert_eq!(&vec[..0], b); } - #[test] fn test_pop() { let mut v = vec![5]; @@ -395,10 +394,8 @@ fn test_sort() { for len in (2..25).chain(500..510) { for &modulus in &[5, 10, 100, 1000] { for _ in 0..10 { - let orig: Vec<_> = rng.sample_iter::(&Standard) - .map(|x| x % modulus) - .take(len) - .collect(); + let orig: Vec<_> = + rng.sample_iter::(&Standard).map(|x| x % modulus).take(len).collect(); // Sort in default order. let mut v = orig.clone(); @@ -543,7 +540,7 @@ fn test_rotate_left() { // non-small prime rotation, has a few rounds of swapping v = (389..1000).chain(0..389).collect(); - v.rotate_left(1000-389); + v.rotate_left(1000 - 389); assert_eq!(v, expected); } @@ -697,7 +694,7 @@ macro_rules! assert_order { (Equal, $a:expr, $b:expr) => { assert_eq!($a.cmp($b), Equal); assert_eq!($a, $b); - } + }; } #[test] @@ -714,7 +711,6 @@ fn test_total_ord_u8() { assert_order!(Greater, &[2u8, 2][..], &c[..]); } - #[test] fn test_total_ord_i32() { let c = &[1, 2, 3]; @@ -804,7 +800,6 @@ fn test_mut_iterator() { #[test] fn test_rev_iterator() { - let xs = [1, 2, 5, 10, 11]; let ys = [11, 10, 5, 2, 1]; let mut i = 0; @@ -827,15 +822,13 @@ fn test_mut_rev_iterator() { #[test] fn test_move_iterator() { let xs = vec![1, 2, 3, 4, 5]; - assert_eq!(xs.into_iter().fold(0, |a: usize, b: usize| 10 * a + b), - 12345); + assert_eq!(xs.into_iter().fold(0, |a: usize, b: usize| 10 * a + b), 12345); } #[test] fn test_move_rev_iterator() { let xs = vec![1, 2, 3, 4, 5]; - assert_eq!(xs.into_iter().rev().fold(0, |a: usize, b: usize| 10 * a + b), - 54321); + assert_eq!(xs.into_iter().rev().fold(0, |a: usize, b: usize| 10 * a + b), 54321); } #[test] @@ -879,11 +872,9 @@ fn test_splitnator_mut() { let xs = &mut [1, 2, 3, 4, 5]; let splits: &[&mut [_]] = &[&mut [1, 2, 3, 4, 5]]; - assert_eq!(xs.splitn_mut(1, |x| *x % 2 == 0).collect::>(), - splits); + assert_eq!(xs.splitn_mut(1, |x| *x % 2 == 0).collect::>(), splits); let splits: &[&mut [_]] = &[&mut [1], &mut [3, 4, 5]]; - assert_eq!(xs.splitn_mut(2, |x| *x % 2 == 0).collect::>(), - splits); + assert_eq!(xs.splitn_mut(2, |x| *x % 2 == 0).collect::>(), splits); let splits: &[&mut [_]] = &[&mut [], &mut [], &mut [], &mut [4, 5]]; assert_eq!(xs.splitn_mut(4, |_| true).collect::>(), splits); @@ -1055,11 +1046,11 @@ fn test_reverse_part() { #[test] fn test_show() { macro_rules! test_show_vec { - ($x:expr, $x_str:expr) => ({ + ($x:expr, $x_str:expr) => {{ let (x, x_str) = ($x, $x_str); assert_eq!(format!("{:?}", x), x_str); assert_eq!(format!("{:?}", x), x_str); - }) + }}; } let empty = Vec::::new(); test_show_vec!(empty, "[]"); @@ -1083,7 +1074,7 @@ fn test_vec_default() { ($ty:ty) => {{ let v: $ty = Default::default(); assert!(v.is_empty()); - }} + }}; } t!(&[i32]); @@ -1406,8 +1397,8 @@ fn test_box_slice_clone() { #[allow(unused_must_use)] // here, we care about the side effects of `.clone()` #[cfg_attr(target_os = "emscripten", ignore)] fn test_box_slice_clone_panics() { - use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::Arc; struct Canary { count: Arc, @@ -1426,32 +1417,23 @@ fn test_box_slice_clone_panics() { panic!() } - Canary { - count: self.count.clone(), - panics: self.panics, - } + Canary { count: self.count.clone(), panics: self.panics } } } let drop_count = Arc::new(AtomicUsize::new(0)); - let canary = Canary { - count: drop_count.clone(), - panics: false, - }; - let panic = Canary { - count: drop_count.clone(), - panics: true, - }; + let canary = Canary { count: drop_count.clone(), panics: false }; + let panic = Canary { count: drop_count.clone(), panics: true }; std::panic::catch_unwind(move || { - // When xs is dropped, +5. - let xs = vec![canary.clone(), canary.clone(), canary.clone(), panic, canary] - .into_boxed_slice(); + // When xs is dropped, +5. + let xs = + vec![canary.clone(), canary.clone(), canary.clone(), panic, canary].into_boxed_slice(); - // When panic is cloned, +3. - xs.clone(); - }) - .unwrap_err(); + // When panic is cloned, +3. + xs.clone(); + }) + .unwrap_err(); // Total = 8 assert_eq!(drop_count.load(Ordering::SeqCst), 8); @@ -1485,26 +1467,86 @@ const MAX_LEN: usize = 80; static DROP_COUNTS: [AtomicUsize; MAX_LEN] = [ // FIXME(RFC 1109): AtomicUsize is not Copy. - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), - AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), + AtomicUsize::new(0), ]; static VERSIONS: AtomicUsize = AtomicUsize::new(0); @@ -1551,7 +1593,10 @@ macro_rules! test { // Work out the total number of comparisons required to sort // this array... let mut count = 0usize; - $input.to_owned().$func(|a, b| { count += 1; a.cmp(b) }); + $input.to_owned().$func(|a, b| { + count += 1; + a.cmp(b) + }); // ... and then panic on each and every single one. for panic_countdown in 0..count { @@ -1579,15 +1624,13 @@ macro_rules! test { // what we expect (i.e., the contents of `v`). for (i, c) in DROP_COUNTS.iter().enumerate().take(len) { let count = c.load(Relaxed); - assert!(count == 1, - "found drop count == {} for i == {}, len == {}", - count, i, len); + assert!(count == 1, "found drop count == {} for i == {}, len == {}", count, i, len); } // Check that the most recent versions of values were dropped. assert_eq!(VERSIONS.load(Relaxed), 0); } - } + }; } thread_local!(static SILENCE_PANIC: Cell = Cell::new(false)); @@ -1618,12 +1661,10 @@ fn panic_safe() { for &modulus in moduli { for &has_runs in &[false, true] { let mut input = (0..len) - .map(|id| { - DropCounter { - x: rng.next_u32() % modulus, - id: id, - version: Cell::new(0), - } + .map(|id| DropCounter { + x: rng.next_u32() % modulus, + id: id, + version: Cell::new(0), }) .collect::>(); @@ -1658,8 +1699,5 @@ fn repeat_generic_slice() { assert_eq!([1, 2].repeat(2), vec![1, 2, 1, 2]); assert_eq!([1, 2, 3, 4].repeat(0), vec![]); assert_eq!([1, 2, 3, 4].repeat(1), vec![1, 2, 3, 4]); - assert_eq!( - [1, 2, 3, 4].repeat(3), - vec![1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4] - ); + assert_eq!([1, 2, 3, 4].repeat(3), vec![1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]); } diff --git a/src/liballoc/tests/str.rs b/src/liballoc/tests/str.rs index 1b011242d0..d3c7261569 100644 --- a/src/liballoc/tests/str.rs +++ b/src/liballoc/tests/str.rs @@ -13,9 +13,9 @@ fn test_le() { #[test] fn test_find() { assert_eq!("hello".find('l'), Some(2)); - assert_eq!("hello".find(|c:char| c == 'o'), Some(4)); + assert_eq!("hello".find(|c: char| c == 'o'), Some(4)); assert!("hello".find('x').is_none()); - assert!("hello".find(|c:char| c == 'x').is_none()); + assert!("hello".find(|c: char| c == 'x').is_none()); assert_eq!("ประเทศไทย中华Việt Nam".find('华'), Some(30)); assert_eq!("ประเทศไทย中华Việt Nam".find(|c: char| c == '华'), Some(30)); } @@ -23,9 +23,9 @@ fn test_find() { #[test] fn test_rfind() { assert_eq!("hello".rfind('l'), Some(3)); - assert_eq!("hello".rfind(|c:char| c == 'o'), Some(4)); + assert_eq!("hello".rfind(|c: char| c == 'o'), Some(4)); assert!("hello".rfind('x').is_none()); - assert!("hello".rfind(|c:char| c == 'x').is_none()); + assert!("hello".rfind(|c: char| c == 'x').is_none()); assert_eq!("ประเทศไทย中华Việt Nam".rfind('华'), Some(30)); assert_eq!("ประเทศไทย中华Việt Nam".rfind(|c: char| c == '华'), Some(30)); } @@ -65,7 +65,7 @@ fn test_find_str() { assert_eq!(data[0..43].find(""), Some(0)); assert_eq!(data[6..43].find(""), Some(6 - 6)); - assert_eq!(data[0..43].find("ประ"), Some( 0)); + assert_eq!(data[0..43].find("ประ"), Some(0)); assert_eq!(data[0..43].find("ทศไ"), Some(12)); assert_eq!(data[0..43].find("ย中"), Some(24)); assert_eq!(data[0..43].find("iệt"), Some(34)); @@ -81,10 +81,7 @@ fn test_find_str() { let string = "Việt Namacbaabcaabaaba"; for (i, ci) in string.char_indices() { let ip = i + ci.len_utf8(); - for j in string[ip..].char_indices() - .map(|(i, _)| i) - .chain(Some(string.len() - ip)) - { + for j in string[ip..].char_indices().map(|(i, _)| i).chain(Some(string.len() - ip)) { let pat = &string[i..ip + j]; assert!(match string.find(pat) { None => false, @@ -98,15 +95,15 @@ fn test_find_str() { } } -fn s(x: &str) -> String { x.to_string() } +fn s(x: &str) -> String { + x.to_string() +} macro_rules! test_concat { - ($expected: expr, $string: expr) => { - { - let s: String = $string.concat(); - assert_eq!($expected, s); - } - } + ($expected: expr, $string: expr) => {{ + let s: String = $string.concat(); + assert_eq!($expected, s); + }}; } #[test] @@ -125,12 +122,10 @@ fn test_concat_for_different_lengths() { } macro_rules! test_join { - ($expected: expr, $string: expr, $delim: expr) => { - { - let s = $string.join($delim); - assert_eq!($expected, s); - } - } + ($expected: expr, $string: expr, $delim: expr) => {{ + let s = $string.join($delim); + assert_eq!($expected, s); + }}; } #[test] @@ -168,9 +163,9 @@ fn test_join_for_different_lengths_with_long_separator() { #[test] #[cfg_attr(miri, ignore)] // Miri is too slow fn test_unsafe_slice() { - assert_eq!("ab", unsafe {"abc".get_unchecked(0..2)}); - assert_eq!("bc", unsafe {"abc".get_unchecked(1..3)}); - assert_eq!("", unsafe {"abc".get_unchecked(1..1)}); + assert_eq!("ab", unsafe { "abc".get_unchecked(0..2) }); + assert_eq!("bc", unsafe { "abc".get_unchecked(1..3) }); + assert_eq!("", unsafe { "abc".get_unchecked(1..1) }); fn a_million_letter_a() -> String { let mut i = 0; let mut rs = String::new(); @@ -190,8 +185,7 @@ fn test_unsafe_slice() { rs } let letters = a_million_letter_a(); - assert_eq!(half_a_million_letter_a(), - unsafe { letters.get_unchecked(0..500000)}); + assert_eq!(half_a_million_letter_a(), unsafe { letters.get_unchecked(0..500000) }); } #[test] @@ -304,8 +298,7 @@ mod slice_index { // // This is not suitable for testing failure on invalid inputs. macro_rules! assert_range_eq { - ($s:expr, $range:expr, $expected:expr) - => { + ($s:expr, $range:expr, $expected:expr) => { let mut s: String = $s.to_owned(); let mut expected: String = $expected.to_owned(); { @@ -316,7 +309,8 @@ mod slice_index { assert_eq!(s.get($range), Some(expected), "(in assertion for: get)"); unsafe { assert_eq!( - s.get_unchecked($range), expected, + s.get_unchecked($range), + expected, "(in assertion for: get_unchecked)", ); } @@ -325,22 +319,21 @@ mod slice_index { let s: &mut str = &mut s; let expected: &mut str = &mut expected; + assert_eq!(&mut s[$range], expected, "(in assertion for: index_mut)",); assert_eq!( - &mut s[$range], expected, - "(in assertion for: index_mut)", - ); - assert_eq!( - s.get_mut($range), Some(&mut expected[..]), + s.get_mut($range), + Some(&mut expected[..]), "(in assertion for: get_mut)", ); unsafe { assert_eq!( - s.get_unchecked_mut($range), expected, + s.get_unchecked_mut($range), + expected, "(in assertion for: get_unchecked_mut)", ); } } - } + }; } // Make sure the macro can actually detect bugs, @@ -460,15 +453,15 @@ mod slice_index { assert_range_eq!(data, 30..33, "华"); /*0: 中 - 3: 华 - 6: V - 7: i - 8: ệ - 11: t - 12: - 13: N - 14: a - 15: m */ + 3: 华 + 6: V + 7: i + 8: ệ + 11: t + 12: + 13: N + 14: a + 15: m */ let ss = "中华Việt Nam"; assert_range_eq!(ss, 3..6, "华"); assert_range_eq!(ss, 6..16, "Việt Nam"); @@ -660,13 +653,13 @@ mod slice_index { // check the panic includes the prefix of the sliced string #[test] - #[should_panic(expected="byte index 1024 is out of bounds of `Lorem ipsum dolor sit amet")] + #[should_panic(expected = "byte index 1024 is out of bounds of `Lorem ipsum dolor sit amet")] fn test_slice_fail_truncated_1() { &LOREM_PARAGRAPH[..1024]; } // check the truncation in the panic message #[test] - #[should_panic(expected="luctus, im`[...]")] + #[should_panic(expected = "luctus, im`[...]")] fn test_slice_fail_truncated_2() { &LOREM_PARAGRAPH[..1024]; } @@ -712,8 +705,12 @@ fn test_is_char_boundary() { // ensure character locations are boundaries and continuation bytes are not assert!(s.is_char_boundary(i), "{} is a char boundary in {:?}", i, s); for j in 1..ch.len_utf8() { - assert!(!s.is_char_boundary(i + j), - "{} should not be a char boundary in {:?}", i + j, s); + assert!( + !s.is_char_boundary(i + j), + "{} should not be a char boundary in {:?}", + i + j, + s + ); } } } @@ -846,7 +843,7 @@ fn from_utf8_error() { let error = from_utf8($input).unwrap_err(); assert_eq!(error.valid_up_to(), $expected_valid_up_to); assert_eq!(error.error_len(), $expected_error_len); - } + }; } test!(b"A\xC3\xA9 \xFF ", 4, Some(1)); test!(b"A\xC3\xA9 \x80 ", 4, Some(1)); @@ -873,9 +870,8 @@ fn from_utf8_error() { fn test_as_bytes() { // no null let v = [ - 224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228, - 184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97, - 109 + 224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228, 184, 173, 229, 141, 142, + 86, 105, 225, 187, 135, 116, 32, 78, 97, 109, ]; let b: &[u8] = &[]; assert_eq!("".as_bytes(), b); @@ -1010,8 +1006,10 @@ fn test_escape_debug() { assert_eq!("\u{10000}\u{10ffff}".escape_debug().to_string(), "\u{10000}\\u{10ffff}"); assert_eq!("ab\u{200b}".escape_debug().to_string(), "ab\\u{200b}"); assert_eq!("\u{10d4ea}\r".escape_debug().to_string(), "\\u{10d4ea}\\r"); - assert_eq!("\u{301}a\u{301}bé\u{e000}".escape_debug().to_string(), - "\\u{301}a\u{301}bé\\u{e000}"); + assert_eq!( + "\u{301}a\u{301}bé\u{e000}".escape_debug().to_string(), + "\\u{301}a\u{301}bé\\u{e000}" + ); } #[test] @@ -1040,7 +1038,7 @@ fn test_total_ord() { #[test] fn test_iterator() { let s = "ศไทย中华Việt Nam"; - let v = ['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m']; + let v = ['ศ', 'ไ', 'ท', 'ย', '中', '华', 'V', 'i', 'ệ', 't', ' ', 'N', 'a', 'm']; let mut pos = 0; let it = s.chars(); @@ -1056,7 +1054,7 @@ fn test_iterator() { #[test] fn test_rev_iterator() { let s = "ศไทย中华Việt Nam"; - let v = ['m', 'a', 'N', ' ', 't', 'ệ','i','V','华','中','ย','ท','ไ','ศ']; + let v = ['m', 'a', 'N', ' ', 't', 'ệ', 'i', 'V', '华', '中', 'ย', 'ท', 'ไ', 'ศ']; let mut pos = 0; let it = s.chars().rev(); @@ -1097,7 +1095,7 @@ fn test_iterator_clone() { let s = "ศไทย中华Việt Nam"; let mut it = s.chars(); it.next(); - assert!(it.clone().zip(it).all(|(x,y)| x == y)); + assert!(it.clone().zip(it).all(|(x, y)| x == y)); } #[test] @@ -1122,9 +1120,8 @@ fn test_chars_debug() { fn test_bytesator() { let s = "ศไทย中华Việt Nam"; let v = [ - 224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228, - 184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97, - 109 + 224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228, 184, 173, 229, 141, 142, + 86, 105, 225, 187, 135, 116, 32, 78, 97, 109, ]; let mut pos = 0; @@ -1138,9 +1135,8 @@ fn test_bytesator() { fn test_bytes_revator() { let s = "ศไทย中华Việt Nam"; let v = [ - 224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228, - 184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97, - 109 + 224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228, 184, 173, 229, 141, 142, + 86, 105, 225, 187, 135, 116, 32, 78, 97, 109, ]; let mut pos = v.len(); @@ -1154,9 +1150,8 @@ fn test_bytes_revator() { fn test_bytesator_nth() { let s = "ศไทย中华Việt Nam"; let v = [ - 224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228, - 184, 173, 229, 141, 142, 86, 105, 225, 187, 135, 116, 32, 78, 97, - 109 + 224, 184, 168, 224, 185, 132, 224, 184, 151, 224, 184, 162, 228, 184, 173, 229, 141, 142, + 86, 105, 225, 187, 135, 116, 32, 78, 97, 109, ]; let mut b = s.bytes(); @@ -1185,7 +1180,7 @@ fn test_bytesator_last() { fn test_char_indicesator() { let s = "ศไทย中华Việt Nam"; let p = [0, 3, 6, 9, 12, 15, 18, 19, 20, 23, 24, 25, 26, 27]; - let v = ['ศ','ไ','ท','ย','中','华','V','i','ệ','t',' ','N','a','m']; + let v = ['ศ', 'ไ', 'ท', 'ย', '中', '华', 'V', 'i', 'ệ', 't', ' ', 'N', 'a', 'm']; let mut pos = 0; let it = s.char_indices(); @@ -1202,7 +1197,7 @@ fn test_char_indicesator() { fn test_char_indices_revator() { let s = "ศไทย中华Việt Nam"; let p = [27, 26, 25, 24, 23, 20, 19, 18, 15, 12, 9, 6, 3, 0]; - let v = ['m', 'a', 'N', ' ', 't', 'ệ','i','V','华','中','ย','ท','ไ','ศ']; + let v = ['m', 'a', 'N', ' ', 't', 'ệ', 'i', 'V', '华', '中', 'ย', 'ท', 'ไ', 'ศ']; let mut pos = 0; let it = s.char_indices().rev(); @@ -1314,10 +1309,10 @@ fn test_splitator() { t("zzXXXzYYYz", "XXX", &["zz", "zYYYz"]); t(".XXX.YYY.", ".", &["", "XXX", "YYY", ""]); t("", ".", &[""]); - t("zz", "zz", &["",""]); + t("zz", "zz", &["", ""]); t("ok", "z", &["ok"]); - t("zzz", "zz", &["","z"]); - t("zzzzz", "zz", &["","","z"]); + t("zzz", "zz", &["", "z"]); + t("zzzzz", "zz", &["", "", "z"]); } #[test] @@ -1383,7 +1378,7 @@ fn test_bool_from_str() { fn check_contains_all_substrings(s: &str) { assert!(s.contains("")); for i in 0..s.len() { - for j in i+1..=s.len() { + for j in i + 1..=s.len() { assert!(s.contains(&s[i..j])); } } @@ -1405,7 +1400,6 @@ fn strslice_issue_16878() { assert!(!"00abc01234567890123456789abc".contains("bcabc")); } - #[test] #[cfg_attr(miri, ignore)] // Miri is too slow fn test_strslice_contains() { @@ -1440,14 +1434,14 @@ fn test_split_char_iterator() { let data = "\nMäry häd ä little lämb\nLittle lämb\n"; let split: Vec<&str> = data.split(' ').collect(); - assert_eq!( split, ["\nMäry", "häd", "ä", "little", "lämb\nLittle", "lämb\n"]); + assert_eq!(split, ["\nMäry", "häd", "ä", "little", "lämb\nLittle", "lämb\n"]); let mut rsplit: Vec<&str> = data.split(' ').rev().collect(); rsplit.reverse(); assert_eq!(rsplit, ["\nMäry", "häd", "ä", "little", "lämb\nLittle", "lämb\n"]); let split: Vec<&str> = data.split(|c: char| c == ' ').collect(); - assert_eq!( split, ["\nMäry", "häd", "ä", "little", "lämb\nLittle", "lämb\n"]); + assert_eq!(split, ["\nMäry", "häd", "ä", "little", "lämb\nLittle", "lämb\n"]); let mut rsplit: Vec<&str> = data.split(|c: char| c == ' ').rev().collect(); rsplit.reverse(); @@ -1455,14 +1449,14 @@ fn test_split_char_iterator() { // Unicode let split: Vec<&str> = data.split('ä').collect(); - assert_eq!( split, ["\nM", "ry h", "d ", " little l", "mb\nLittle l", "mb\n"]); + assert_eq!(split, ["\nM", "ry h", "d ", " little l", "mb\nLittle l", "mb\n"]); let mut rsplit: Vec<&str> = data.split('ä').rev().collect(); rsplit.reverse(); assert_eq!(rsplit, ["\nM", "ry h", "d ", " little l", "mb\nLittle l", "mb\n"]); let split: Vec<&str> = data.split(|c: char| c == 'ä').collect(); - assert_eq!( split, ["\nM", "ry h", "d ", " little l", "mb\nLittle l", "mb\n"]); + assert_eq!(split, ["\nM", "ry h", "d ", " little l", "mb\nLittle l", "mb\n"]); let mut rsplit: Vec<&str> = data.split(|c: char| c == 'ä').rev().collect(); rsplit.reverse(); @@ -1484,8 +1478,7 @@ fn test_rev_split_char_iterator_no_trailing() { #[test] fn test_utf16_code_units() { - assert_eq!("é\u{1F4A9}".encode_utf16().collect::>(), - [0xE9, 0xD83D, 0xDCA9]) + assert_eq!("é\u{1F4A9}".encode_utf16().collect::>(), [0xE9, 0xD83D, 0xDCA9]) } #[test] @@ -1521,26 +1514,16 @@ fn contains_weird_cases() { #[test] fn trim_ws() { - assert_eq!(" \t a \t ".trim_start_matches(|c: char| c.is_whitespace()), - "a \t "); - assert_eq!(" \t a \t ".trim_end_matches(|c: char| c.is_whitespace()), - " \t a"); - assert_eq!(" \t a \t ".trim_start_matches(|c: char| c.is_whitespace()), - "a \t "); - assert_eq!(" \t a \t ".trim_end_matches(|c: char| c.is_whitespace()), - " \t a"); - assert_eq!(" \t a \t ".trim_matches(|c: char| c.is_whitespace()), - "a"); - assert_eq!(" \t \t ".trim_start_matches(|c: char| c.is_whitespace()), - ""); - assert_eq!(" \t \t ".trim_end_matches(|c: char| c.is_whitespace()), - ""); - assert_eq!(" \t \t ".trim_start_matches(|c: char| c.is_whitespace()), - ""); - assert_eq!(" \t \t ".trim_end_matches(|c: char| c.is_whitespace()), - ""); - assert_eq!(" \t \t ".trim_matches(|c: char| c.is_whitespace()), - ""); + assert_eq!(" \t a \t ".trim_start_matches(|c: char| c.is_whitespace()), "a \t "); + assert_eq!(" \t a \t ".trim_end_matches(|c: char| c.is_whitespace()), " \t a"); + assert_eq!(" \t a \t ".trim_start_matches(|c: char| c.is_whitespace()), "a \t "); + assert_eq!(" \t a \t ".trim_end_matches(|c: char| c.is_whitespace()), " \t a"); + assert_eq!(" \t a \t ".trim_matches(|c: char| c.is_whitespace()), "a"); + assert_eq!(" \t \t ".trim_start_matches(|c: char| c.is_whitespace()), ""); + assert_eq!(" \t \t ".trim_end_matches(|c: char| c.is_whitespace()), ""); + assert_eq!(" \t \t ".trim_start_matches(|c: char| c.is_whitespace()), ""); + assert_eq!(" \t \t ".trim_end_matches(|c: char| c.is_whitespace()), ""); + assert_eq!(" \t \t ".trim_matches(|c: char| c.is_whitespace()), ""); } #[test] @@ -1616,8 +1599,8 @@ fn test_repeat() { } mod pattern { - use std::str::pattern::{Pattern, Searcher, ReverseSearcher}; - use std::str::pattern::SearchStep::{self, Match, Reject, Done}; + use std::str::pattern::SearchStep::{self, Done, Match, Reject}; + use std::str::pattern::{Pattern, ReverseSearcher, Searcher}; macro_rules! make_test { ($name:ident, $p:expr, $h:expr, [$($e:expr,)*]) => { @@ -1641,12 +1624,12 @@ mod pattern { rev: bool, pat: impl Pattern<'a, Searcher: ReverseSearcher<'a>>, haystack: &'a str, - right: Vec + right: Vec, ) { let mut searcher = pat.into_searcher(haystack); let mut v = vec![]; loop { - match if !rev {searcher.next()} else {searcher.next_back()} { + match if !rev { searcher.next() } else { searcher.next_back() } { Match(a, b) => v.push(Match(a, b)), Reject(a, b) => v.push(Reject(a, b)), Done => break, @@ -1661,8 +1644,7 @@ mod pattern { for (i, e) in right.iter().enumerate() { match *e { - Match(a, b) | Reject(a, b) - if a <= b && a == first_index => { + Match(a, b) | Reject(a, b) if a <= b && a == first_index => { first_index = b; } _ => { @@ -1683,77 +1665,88 @@ mod pattern { assert_eq!(v, right); } - make_test!(str_searcher_ascii_haystack, "bb", "abbcbbd", [ - Reject(0, 1), - Match (1, 3), - Reject(3, 4), - Match (4, 6), - Reject(6, 7), - ]); - make_test!(str_searcher_ascii_haystack_seq, "bb", "abbcbbbbd", [ - Reject(0, 1), - Match (1, 3), - Reject(3, 4), - Match (4, 6), - Match (6, 8), - Reject(8, 9), - ]); - make_test!(str_searcher_empty_needle_ascii_haystack, "", "abbcbbd", [ - Match (0, 0), - Reject(0, 1), - Match (1, 1), - Reject(1, 2), - Match (2, 2), - Reject(2, 3), - Match (3, 3), - Reject(3, 4), - Match (4, 4), - Reject(4, 5), - Match (5, 5), - Reject(5, 6), - Match (6, 6), - Reject(6, 7), - Match (7, 7), - ]); - make_test!(str_searcher_multibyte_haystack, " ", "├──", [ - Reject(0, 3), - Reject(3, 6), - Reject(6, 9), - ]); - make_test!(str_searcher_empty_needle_multibyte_haystack, "", "├──", [ - Match (0, 0), - Reject(0, 3), - Match (3, 3), - Reject(3, 6), - Match (6, 6), - Reject(6, 9), - Match (9, 9), - ]); - make_test!(str_searcher_empty_needle_empty_haystack, "", "", [ - Match(0, 0), - ]); - make_test!(str_searcher_nonempty_needle_empty_haystack, "├", "", [ - ]); - make_test!(char_searcher_ascii_haystack, 'b', "abbcbbd", [ - Reject(0, 1), - Match (1, 2), - Match (2, 3), - Reject(3, 4), - Match (4, 5), - Match (5, 6), - Reject(6, 7), - ]); - make_test!(char_searcher_multibyte_haystack, ' ', "├──", [ - Reject(0, 3), - Reject(3, 6), - Reject(6, 9), - ]); - make_test!(char_searcher_short_haystack, '\u{1F4A9}', "* \t", [ - Reject(0, 1), - Reject(1, 2), - Reject(2, 3), - ]); - + make_test!( + str_searcher_ascii_haystack, + "bb", + "abbcbbd", + [Reject(0, 1), Match(1, 3), Reject(3, 4), Match(4, 6), Reject(6, 7),] + ); + make_test!( + str_searcher_ascii_haystack_seq, + "bb", + "abbcbbbbd", + [Reject(0, 1), Match(1, 3), Reject(3, 4), Match(4, 6), Match(6, 8), Reject(8, 9),] + ); + make_test!( + str_searcher_empty_needle_ascii_haystack, + "", + "abbcbbd", + [ + Match(0, 0), + Reject(0, 1), + Match(1, 1), + Reject(1, 2), + Match(2, 2), + Reject(2, 3), + Match(3, 3), + Reject(3, 4), + Match(4, 4), + Reject(4, 5), + Match(5, 5), + Reject(5, 6), + Match(6, 6), + Reject(6, 7), + Match(7, 7), + ] + ); + make_test!( + str_searcher_multibyte_haystack, + " ", + "├──", + [Reject(0, 3), Reject(3, 6), Reject(6, 9),] + ); + make_test!( + str_searcher_empty_needle_multibyte_haystack, + "", + "├──", + [ + Match(0, 0), + Reject(0, 3), + Match(3, 3), + Reject(3, 6), + Match(6, 6), + Reject(6, 9), + Match(9, 9), + ] + ); + make_test!(str_searcher_empty_needle_empty_haystack, "", "", [Match(0, 0),]); + make_test!(str_searcher_nonempty_needle_empty_haystack, "├", "", []); + make_test!( + char_searcher_ascii_haystack, + 'b', + "abbcbbd", + [ + Reject(0, 1), + Match(1, 2), + Match(2, 3), + Reject(3, 4), + Match(4, 5), + Match(5, 6), + Reject(6, 7), + ] + ); + make_test!( + char_searcher_multibyte_haystack, + ' ', + "├──", + [Reject(0, 3), Reject(3, 6), Reject(6, 9),] + ); + make_test!( + char_searcher_short_haystack, + '\u{1F4A9}', + "* \t", + [Reject(0, 1), Reject(1, 2), Reject(2, 3),] + ); } macro_rules! generate_iterator_test { @@ -1850,7 +1843,10 @@ generate_iterator_test! { fn different_str_pattern_forwarding_lifetimes() { use std::str::pattern::Pattern; - fn foo<'a, P>(p: P) where for<'b> &'b P: Pattern<'a> { + fn foo<'a, P>(p: P) + where + for<'b> &'b P: Pattern<'a>, + { for _ in 0..3 { "asdf".find(&p); } diff --git a/src/liballoc/tests/string.rs b/src/liballoc/tests/string.rs index fe7b4ff24b..dd44495845 100644 --- a/src/liballoc/tests/string.rs +++ b/src/liballoc/tests/string.rs @@ -1,9 +1,12 @@ use std::borrow::Cow; use std::collections::TryReserveError::*; use std::mem::size_of; -use std::{usize, isize}; +use std::{isize, usize}; -pub trait IntoCow<'a, B: ?Sized> where B: ToOwned { +pub trait IntoCow<'a, B: ?Sized> +where + B: ToOwned, +{ fn into_cow(self) -> Cow<'a, B>; } @@ -43,8 +46,7 @@ fn test_from_utf8() { assert_eq!(String::from_utf8(xs).unwrap(), String::from("hello")); let xs = "ศไทย中华Việt Nam".as_bytes().to_vec(); - assert_eq!(String::from_utf8(xs).unwrap(), - String::from("ศไทย中华Việt Nam")); + assert_eq!(String::from_utf8(xs).unwrap(), String::from("ศไทย中华Việt Nam")); let xs = b"hello\xFF".to_vec(); let err = String::from_utf8(xs).unwrap_err(); @@ -62,60 +64,87 @@ fn test_from_utf8_lossy() { assert_eq!(String::from_utf8_lossy(xs), ys); let xs = b"Hello\xC2 There\xFF Goodbye"; - assert_eq!(String::from_utf8_lossy(xs), - String::from("Hello\u{FFFD} There\u{FFFD} Goodbye").into_cow()); + assert_eq!( + String::from_utf8_lossy(xs), + String::from("Hello\u{FFFD} There\u{FFFD} Goodbye").into_cow() + ); let xs = b"Hello\xC0\x80 There\xE6\x83 Goodbye"; - assert_eq!(String::from_utf8_lossy(xs), - String::from("Hello\u{FFFD}\u{FFFD} There\u{FFFD} Goodbye").into_cow()); + assert_eq!( + String::from_utf8_lossy(xs), + String::from("Hello\u{FFFD}\u{FFFD} There\u{FFFD} Goodbye").into_cow() + ); let xs = b"\xF5foo\xF5\x80bar"; - assert_eq!(String::from_utf8_lossy(xs), - String::from("\u{FFFD}foo\u{FFFD}\u{FFFD}bar").into_cow()); + assert_eq!( + String::from_utf8_lossy(xs), + String::from("\u{FFFD}foo\u{FFFD}\u{FFFD}bar").into_cow() + ); let xs = b"\xF1foo\xF1\x80bar\xF1\x80\x80baz"; - assert_eq!(String::from_utf8_lossy(xs), - String::from("\u{FFFD}foo\u{FFFD}bar\u{FFFD}baz").into_cow()); + assert_eq!( + String::from_utf8_lossy(xs), + String::from("\u{FFFD}foo\u{FFFD}bar\u{FFFD}baz").into_cow() + ); let xs = b"\xF4foo\xF4\x80bar\xF4\xBFbaz"; - assert_eq!(String::from_utf8_lossy(xs), - String::from("\u{FFFD}foo\u{FFFD}bar\u{FFFD}\u{FFFD}baz").into_cow()); + assert_eq!( + String::from_utf8_lossy(xs), + String::from("\u{FFFD}foo\u{FFFD}bar\u{FFFD}\u{FFFD}baz").into_cow() + ); let xs = b"\xF0\x80\x80\x80foo\xF0\x90\x80\x80bar"; - assert_eq!(String::from_utf8_lossy(xs), - String::from("\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}foo\u{10000}bar").into_cow()); + assert_eq!( + String::from_utf8_lossy(xs), + String::from("\u{FFFD}\u{FFFD}\u{FFFD}\u{FFFD}foo\u{10000}bar").into_cow() + ); // surrogates let xs = b"\xED\xA0\x80foo\xED\xBF\xBFbar"; - assert_eq!(String::from_utf8_lossy(xs), - String::from("\u{FFFD}\u{FFFD}\u{FFFD}foo\u{FFFD}\u{FFFD}\u{FFFD}bar").into_cow()); + assert_eq!( + String::from_utf8_lossy(xs), + String::from("\u{FFFD}\u{FFFD}\u{FFFD}foo\u{FFFD}\u{FFFD}\u{FFFD}bar").into_cow() + ); } #[test] fn test_from_utf16() { - let pairs = [(String::from("𐍅𐌿𐌻𐍆𐌹𐌻𐌰\n"), - vec![0xd800, 0xdf45, 0xd800, 0xdf3f, 0xd800, 0xdf3b, 0xd800, 0xdf46, 0xd800, - 0xdf39, 0xd800, 0xdf3b, 0xd800, 0xdf30, 0x000a]), - - (String::from("𐐒𐑉𐐮𐑀𐐲𐑋 𐐏𐐲𐑍\n"), - vec![0xd801, 0xdc12, 0xd801, 0xdc49, 0xd801, 0xdc2e, 0xd801, 0xdc40, 0xd801, - 0xdc32, 0xd801, 0xdc4b, 0x0020, 0xd801, 0xdc0f, 0xd801, 0xdc32, 0xd801, - 0xdc4d, 0x000a]), - - (String::from("𐌀𐌖𐌋𐌄𐌑𐌉·𐌌𐌄𐌕𐌄𐌋𐌉𐌑\n"), - vec![0xd800, 0xdf00, 0xd800, 0xdf16, 0xd800, 0xdf0b, 0xd800, 0xdf04, 0xd800, - 0xdf11, 0xd800, 0xdf09, 0x00b7, 0xd800, 0xdf0c, 0xd800, 0xdf04, 0xd800, - 0xdf15, 0xd800, 0xdf04, 0xd800, 0xdf0b, 0xd800, 0xdf09, 0xd800, 0xdf11, - 0x000a]), - - (String::from("𐒋𐒘𐒈𐒑𐒛𐒒 𐒕𐒓 𐒈𐒚𐒍 𐒏𐒜𐒒𐒖𐒆 𐒕𐒆\n"), - vec![0xd801, 0xdc8b, 0xd801, 0xdc98, 0xd801, 0xdc88, 0xd801, 0xdc91, 0xd801, - 0xdc9b, 0xd801, 0xdc92, 0x0020, 0xd801, 0xdc95, 0xd801, 0xdc93, 0x0020, - 0xd801, 0xdc88, 0xd801, 0xdc9a, 0xd801, 0xdc8d, 0x0020, 0xd801, 0xdc8f, - 0xd801, 0xdc9c, 0xd801, 0xdc92, 0xd801, 0xdc96, 0xd801, 0xdc86, 0x0020, - 0xd801, 0xdc95, 0xd801, 0xdc86, 0x000a]), - // Issue #12318, even-numbered non-BMP planes - (String::from("\u{20000}"), vec![0xD840, 0xDC00])]; + let pairs = [ + ( + String::from("𐍅𐌿𐌻𐍆𐌹𐌻𐌰\n"), + vec![ + 0xd800, 0xdf45, 0xd800, 0xdf3f, 0xd800, 0xdf3b, 0xd800, 0xdf46, 0xd800, 0xdf39, + 0xd800, 0xdf3b, 0xd800, 0xdf30, 0x000a, + ], + ), + ( + String::from("𐐒𐑉𐐮𐑀𐐲𐑋 𐐏𐐲𐑍\n"), + vec![ + 0xd801, 0xdc12, 0xd801, 0xdc49, 0xd801, 0xdc2e, 0xd801, 0xdc40, 0xd801, 0xdc32, + 0xd801, 0xdc4b, 0x0020, 0xd801, 0xdc0f, 0xd801, 0xdc32, 0xd801, 0xdc4d, 0x000a, + ], + ), + ( + String::from("𐌀𐌖𐌋𐌄𐌑𐌉·𐌌𐌄𐌕𐌄𐌋𐌉𐌑\n"), + vec![ + 0xd800, 0xdf00, 0xd800, 0xdf16, 0xd800, 0xdf0b, 0xd800, 0xdf04, 0xd800, 0xdf11, + 0xd800, 0xdf09, 0x00b7, 0xd800, 0xdf0c, 0xd800, 0xdf04, 0xd800, 0xdf15, 0xd800, + 0xdf04, 0xd800, 0xdf0b, 0xd800, 0xdf09, 0xd800, 0xdf11, 0x000a, + ], + ), + ( + String::from("𐒋𐒘𐒈𐒑𐒛𐒒 𐒕𐒓 𐒈𐒚𐒍 𐒏𐒜𐒒𐒖𐒆 𐒕𐒆\n"), + vec![ + 0xd801, 0xdc8b, 0xd801, 0xdc98, 0xd801, 0xdc88, 0xd801, 0xdc91, 0xd801, 0xdc9b, + 0xd801, 0xdc92, 0x0020, 0xd801, 0xdc95, 0xd801, 0xdc93, 0x0020, 0xd801, 0xdc88, + 0xd801, 0xdc9a, 0xd801, 0xdc8d, 0x0020, 0xd801, 0xdc8f, 0xd801, 0xdc9c, 0xd801, + 0xdc92, 0xd801, 0xdc96, 0xd801, 0xdc86, 0x0020, 0xd801, 0xdc95, 0xd801, 0xdc86, + 0x000a, + ], + ), + // Issue #12318, even-numbered non-BMP planes + (String::from("\u{20000}"), vec![0xD840, 0xDC00]), + ]; for p in &pairs { let (s, u) = (*p).clone(); @@ -152,19 +181,18 @@ fn test_utf16_invalid() { fn test_from_utf16_lossy() { // completely positive cases tested above. // lead + eof - assert_eq!(String::from_utf16_lossy(&[0xD800]), - String::from("\u{FFFD}")); + assert_eq!(String::from_utf16_lossy(&[0xD800]), String::from("\u{FFFD}")); // lead + lead - assert_eq!(String::from_utf16_lossy(&[0xD800, 0xD800]), - String::from("\u{FFFD}\u{FFFD}")); + assert_eq!(String::from_utf16_lossy(&[0xD800, 0xD800]), String::from("\u{FFFD}\u{FFFD}")); // isolated trail - assert_eq!(String::from_utf16_lossy(&[0x0061, 0xDC00]), - String::from("a\u{FFFD}")); + assert_eq!(String::from_utf16_lossy(&[0x0061, 0xDC00]), String::from("a\u{FFFD}")); // general - assert_eq!(String::from_utf16_lossy(&[0xD800, 0xd801, 0xdc8b, 0xD800]), - String::from("\u{FFFD}𐒋\u{FFFD}")); + assert_eq!( + String::from_utf16_lossy(&[0xD800, 0xd801, 0xdc8b, 0xD800]), + String::from("\u{FFFD}𐒋\u{FFFD}") + ); } #[test] @@ -525,7 +553,6 @@ fn test_reserve_exact() { #[test] #[cfg_attr(miri, ignore)] // Miri does not support signalling OOM fn test_try_reserve() { - // These are the interesting cases: // * exactly isize::MAX should never trigger a CapacityOverflow (can be OOM) // * > isize::MAX should always fail @@ -559,23 +586,30 @@ fn test_try_reserve() { if guards_against_isize { // Check isize::MAX + 1 does count as overflow if let Err(CapacityOverflow) = empty_string.try_reserve(MAX_CAP + 1) { - } else { panic!("isize::MAX + 1 should trigger an overflow!") } + } else { + panic!("isize::MAX + 1 should trigger an overflow!") + } // Check usize::MAX does count as overflow if let Err(CapacityOverflow) = empty_string.try_reserve(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an overflow!") } + } else { + panic!("usize::MAX should trigger an overflow!") + } } else { // Check isize::MAX + 1 is an OOM if let Err(AllocError { .. }) = empty_string.try_reserve(MAX_CAP + 1) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } // Check usize::MAX is an OOM if let Err(AllocError { .. }) = empty_string.try_reserve(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an OOM!") } + } else { + panic!("usize::MAX should trigger an OOM!") + } } } - { // Same basic idea, but with non-zero len let mut ten_bytes: String = String::from("0123456789"); @@ -588,22 +622,26 @@ fn test_try_reserve() { } if guards_against_isize { if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 9) { - } else { panic!("isize::MAX + 1 should trigger an overflow!"); } + } else { + panic!("isize::MAX + 1 should trigger an overflow!"); + } } else { if let Err(AllocError { .. }) = ten_bytes.try_reserve(MAX_CAP - 9) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } } // Should always overflow in the add-to-len if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an overflow!") } + } else { + panic!("usize::MAX should trigger an overflow!") + } } - } #[test] #[cfg_attr(miri, ignore)] // Miri does not support signalling OOM fn test_try_reserve_exact() { - // This is exactly the same as test_try_reserve with the method changed. // See that test for comments. @@ -624,20 +662,27 @@ fn test_try_reserve_exact() { if guards_against_isize { if let Err(CapacityOverflow) = empty_string.try_reserve_exact(MAX_CAP + 1) { - } else { panic!("isize::MAX + 1 should trigger an overflow!") } + } else { + panic!("isize::MAX + 1 should trigger an overflow!") + } if let Err(CapacityOverflow) = empty_string.try_reserve_exact(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an overflow!") } + } else { + panic!("usize::MAX should trigger an overflow!") + } } else { if let Err(AllocError { .. }) = empty_string.try_reserve_exact(MAX_CAP + 1) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } if let Err(AllocError { .. }) = empty_string.try_reserve_exact(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an OOM!") } + } else { + panic!("usize::MAX should trigger an OOM!") + } } } - { let mut ten_bytes: String = String::from("0123456789"); @@ -649,13 +694,18 @@ fn test_try_reserve_exact() { } if guards_against_isize { if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 9) { - } else { panic!("isize::MAX + 1 should trigger an overflow!"); } + } else { + panic!("isize::MAX + 1 should trigger an overflow!"); + } } else { if let Err(AllocError { .. }) = ten_bytes.try_reserve_exact(MAX_CAP - 9) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } } if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an overflow!") } + } else { + panic!("usize::MAX should trigger an overflow!") + } } - } diff --git a/src/liballoc/tests/vec.rs b/src/liballoc/tests/vec.rs index 5e788d61f8..2a9bfefc71 100644 --- a/src/liballoc/tests/vec.rs +++ b/src/liballoc/tests/vec.rs @@ -1,8 +1,8 @@ use std::borrow::Cow; +use std::collections::TryReserveError::*; use std::mem::size_of; -use std::{usize, isize}; use std::vec::{Drain, IntoIter}; -use std::collections::TryReserveError::*; +use std::{isize, usize}; struct DropCounter<'a> { count: &'a mut u32, @@ -28,10 +28,7 @@ fn test_double_drop() { let (mut count_x, mut count_y) = (0, 0); { - let mut tv = TwoVec { - x: Vec::new(), - y: Vec::new(), - }; + let mut tv = TwoVec { x: Vec::new(), y: Vec::new() }; tv.x.push(DropCounter { count: &mut count_x }); tv.y.push(DropCounter { count: &mut count_y }); @@ -134,6 +131,21 @@ fn test_extend_ref() { assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]); } +#[test] +fn test_remove_item() { + let mut v = vec![1, 2, 3]; + v.remove_item(&1); + + assert_eq!(v.len(), 2); + assert_eq!(v, [2, 3]); + + let mut w = vec![1, 2, 3]; + w.remove_item(&4); + + assert_eq!(w.len(), 3); + w.remove_item(&4); +} + #[test] fn test_slice_from_mut() { let mut values = vec![1, 2, 3, 4, 5]; @@ -271,7 +283,12 @@ fn test_dedup_by() { assert_eq!(vec, ["foo", "bar", "baz", "bar"]); let mut vec = vec![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)]; - vec.dedup_by(|a, b| a.0 == b.0 && { b.1 += a.1; true }); + vec.dedup_by(|a, b| { + a.0 == b.0 && { + b.1 += a.1; + true + } + }); assert_eq!(vec, [("foo", 3), ("bar", 12)]); } @@ -323,14 +340,10 @@ fn zero_sized_values() { #[test] fn test_partition() { - assert_eq!(vec![].into_iter().partition(|x: &i32| *x < 3), - (vec![], vec![])); - assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 4), - (vec![1, 2, 3], vec![])); - assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 2), - (vec![1], vec![2, 3])); - assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 0), - (vec![], vec![1, 2, 3])); + assert_eq!(vec![].into_iter().partition(|x: &i32| *x < 3), (vec![], vec![])); + assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 4), (vec![1, 2, 3], vec![])); + assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 2), (vec![1], vec![2, 3])); + assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 0), (vec![], vec![1, 2, 3])); } #[test] @@ -509,66 +522,59 @@ fn test_drain_out_of_bounds() { #[test] fn test_drain_range() { let mut v = vec![1, 2, 3, 4, 5]; - for _ in v.drain(4..) { - } + for _ in v.drain(4..) {} assert_eq!(v, &[1, 2, 3, 4]); let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect(); - for _ in v.drain(1..4) { - } + for _ in v.drain(1..4) {} assert_eq!(v, &[1.to_string(), 5.to_string()]); let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect(); - for _ in v.drain(1..4).rev() { - } + for _ in v.drain(1..4).rev() {} assert_eq!(v, &[1.to_string(), 5.to_string()]); let mut v: Vec<_> = vec![(); 5]; - for _ in v.drain(1..4).rev() { - } + for _ in v.drain(1..4).rev() {} assert_eq!(v, &[(), ()]); } #[test] fn test_drain_inclusive_range() { let mut v = vec!['a', 'b', 'c', 'd', 'e']; - for _ in v.drain(1..=3) { - } + for _ in v.drain(1..=3) {} assert_eq!(v, &['a', 'e']); let mut v: Vec<_> = (0..=5).map(|x| x.to_string()).collect(); - for _ in v.drain(1..=5) { - } + for _ in v.drain(1..=5) {} assert_eq!(v, &["0".to_string()]); let mut v: Vec = (0..=5).map(|x| x.to_string()).collect(); - for _ in v.drain(0..=5) { - } + for _ in v.drain(0..=5) {} assert_eq!(v, Vec::::new()); let mut v: Vec<_> = (0..=5).map(|x| x.to_string()).collect(); - for _ in v.drain(0..=3) { - } + for _ in v.drain(0..=3) {} assert_eq!(v, &["4".to_string(), "5".to_string()]); let mut v: Vec<_> = (0..=1).map(|x| x.to_string()).collect(); - for _ in v.drain(..=0) { - } + for _ in v.drain(..=0) {} assert_eq!(v, &["1".to_string()]); } #[test] fn test_drain_max_vec_size() { let mut v = Vec::<()>::with_capacity(usize::max_value()); - unsafe { v.set_len(usize::max_value()); } - for _ in v.drain(usize::max_value() - 1..) { + unsafe { + v.set_len(usize::max_value()); } + for _ in v.drain(usize::max_value() - 1..) {} assert_eq!(v.len(), usize::max_value() - 1); let mut v = Vec::<()>::with_capacity(usize::max_value()); - unsafe { v.set_len(usize::max_value()); } - for _ in v.drain(usize::max_value() - 1..=usize::max_value() - 1) { + unsafe { + v.set_len(usize::max_value()); } + for _ in v.drain(usize::max_value() - 1..=usize::max_value() - 1) {} assert_eq!(v.len(), usize::max_value() - 1); } @@ -864,17 +870,12 @@ fn drain_filter_true() { #[test] fn drain_filter_complex() { - - { // [+xxx++++++xxxxx++++x+x++] - let mut vec = vec![1, - 2, 4, 6, - 7, 9, 11, 13, 15, 17, - 18, 20, 22, 24, 26, - 27, 29, 31, 33, - 34, - 35, - 36, - 37, 39]; + { + // [+xxx++++++xxxxx++++x+x++] + let mut vec = vec![ + 1, 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36, 37, + 39, + ]; let removed = vec.drain_filter(|x| *x % 2 == 0).collect::>(); assert_eq!(removed.len(), 10); @@ -884,15 +885,11 @@ fn drain_filter_complex() { assert_eq!(vec, vec![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]); } - { // [xxx++++++xxxxx++++x+x++] - let mut vec = vec![2, 4, 6, - 7, 9, 11, 13, 15, 17, - 18, 20, 22, 24, 26, - 27, 29, 31, 33, - 34, - 35, - 36, - 37, 39]; + { + // [xxx++++++xxxxx++++x+x++] + let mut vec = vec![ + 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36, 37, 39, + ]; let removed = vec.drain_filter(|x| *x % 2 == 0).collect::>(); assert_eq!(removed.len(), 10); @@ -902,14 +899,10 @@ fn drain_filter_complex() { assert_eq!(vec, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]); } - { // [xxx++++++xxxxx++++x+x] - let mut vec = vec![2, 4, 6, - 7, 9, 11, 13, 15, 17, - 18, 20, 22, 24, 26, - 27, 29, 31, 33, - 34, - 35, - 36]; + { + // [xxx++++++xxxxx++++x+x] + let mut vec = + vec![2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36]; let removed = vec.drain_filter(|x| *x % 2 == 0).collect::>(); assert_eq!(removed.len(), 10); @@ -919,9 +912,9 @@ fn drain_filter_complex() { assert_eq!(vec, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]); } - { // [xxxxxxxxxx+++++++++++] - let mut vec = vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20, - 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]; + { + // [xxxxxxxxxx+++++++++++] + let mut vec = vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]; let removed = vec.drain_filter(|x| *x % 2 == 0).collect::>(); assert_eq!(removed.len(), 10); @@ -931,9 +924,9 @@ fn drain_filter_complex() { assert_eq!(vec, vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]); } - { // [+++++++++++xxxxxxxxxx] - let mut vec = vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19, - 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]; + { + // [+++++++++++xxxxxxxxxx] + let mut vec = vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]; let removed = vec.drain_filter(|x| *x % 2 == 0).collect::>(); assert_eq!(removed.len(), 10); @@ -1082,7 +1075,6 @@ fn test_reserve_exact() { #[test] #[cfg_attr(miri, ignore)] // Miri does not support signalling OOM fn test_try_reserve() { - // These are the interesting cases: // * exactly isize::MAX should never trigger a CapacityOverflow (can be OOM) // * > isize::MAX should always fail @@ -1116,23 +1108,30 @@ fn test_try_reserve() { if guards_against_isize { // Check isize::MAX + 1 does count as overflow if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP + 1) { - } else { panic!("isize::MAX + 1 should trigger an overflow!") } + } else { + panic!("isize::MAX + 1 should trigger an overflow!") + } // Check usize::MAX does count as overflow if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an overflow!") } + } else { + panic!("usize::MAX should trigger an overflow!") + } } else { // Check isize::MAX + 1 is an OOM if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_CAP + 1) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } // Check usize::MAX is an OOM if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an OOM!") } + } else { + panic!("usize::MAX should trigger an OOM!") + } } } - { // Same basic idea, but with non-zero len let mut ten_bytes: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; @@ -1145,33 +1144,42 @@ fn test_try_reserve() { } if guards_against_isize { if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 9) { - } else { panic!("isize::MAX + 1 should trigger an overflow!"); } + } else { + panic!("isize::MAX + 1 should trigger an overflow!"); + } } else { if let Err(AllocError { .. }) = ten_bytes.try_reserve(MAX_CAP - 9) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } } // Should always overflow in the add-to-len if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an overflow!") } + } else { + panic!("usize::MAX should trigger an overflow!") + } } - { // Same basic idea, but with interesting type size let mut ten_u32s: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 10) { + if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 10) { panic!("isize::MAX shouldn't trigger an overflow!"); } - if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 10) { + if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 10) { panic!("isize::MAX shouldn't trigger an overflow!"); } if guards_against_isize { - if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 9) { - } else { panic!("isize::MAX + 1 should trigger an overflow!"); } + if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 9) { + } else { + panic!("isize::MAX + 1 should trigger an overflow!"); + } } else { - if let Err(AllocError { .. }) = ten_u32s.try_reserve(MAX_CAP/4 - 9) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + if let Err(AllocError { .. }) = ten_u32s.try_reserve(MAX_CAP / 4 - 9) { + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } } // Should fail in the mul-by-size if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_USIZE - 20) { @@ -1179,13 +1187,11 @@ fn test_try_reserve() { panic!("usize::MAX should trigger an overflow!"); } } - } #[test] #[cfg_attr(miri, ignore)] // Miri does not support signalling OOM fn test_try_reserve_exact() { - // This is exactly the same as test_try_reserve with the method changed. // See that test for comments. @@ -1206,20 +1212,27 @@ fn test_try_reserve_exact() { if guards_against_isize { if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP + 1) { - } else { panic!("isize::MAX + 1 should trigger an overflow!") } + } else { + panic!("isize::MAX + 1 should trigger an overflow!") + } if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an overflow!") } + } else { + panic!("usize::MAX should trigger an overflow!") + } } else { if let Err(AllocError { .. }) = empty_bytes.try_reserve_exact(MAX_CAP + 1) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } if let Err(AllocError { .. }) = empty_bytes.try_reserve_exact(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an OOM!") } + } else { + panic!("usize::MAX should trigger an OOM!") + } } } - { let mut ten_bytes: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; @@ -1231,36 +1244,46 @@ fn test_try_reserve_exact() { } if guards_against_isize { if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 9) { - } else { panic!("isize::MAX + 1 should trigger an overflow!"); } + } else { + panic!("isize::MAX + 1 should trigger an overflow!"); + } } else { if let Err(AllocError { .. }) = ten_bytes.try_reserve_exact(MAX_CAP - 9) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } } if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_USIZE) { - } else { panic!("usize::MAX should trigger an overflow!") } + } else { + panic!("usize::MAX should trigger an overflow!") + } } - { let mut ten_u32s: Vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 10) { + if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 10) { panic!("isize::MAX shouldn't trigger an overflow!"); } - if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 10) { + if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 10) { panic!("isize::MAX shouldn't trigger an overflow!"); } if guards_against_isize { - if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 9) { - } else { panic!("isize::MAX + 1 should trigger an overflow!"); } + if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 9) { + } else { + panic!("isize::MAX + 1 should trigger an overflow!"); + } } else { - if let Err(AllocError { .. }) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 9) { - } else { panic!("isize::MAX + 1 should trigger an OOM!") } + if let Err(AllocError { .. }) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 9) { + } else { + panic!("isize::MAX + 1 should trigger an OOM!") + } } if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_USIZE - 20) { - } else { panic!("usize::MAX should trigger an overflow!") } + } else { + panic!("usize::MAX should trigger an overflow!") + } } - } #[test] @@ -1311,18 +1334,11 @@ fn vec_macro_repeating_null_raw_fat_pointer() { // Polyfill for https://github.com/rust-lang/rfcs/pull/2580 fn ptr_metadata(ptr: *mut dyn Fn()) -> *mut () { - unsafe { - std::mem::transmute::<*mut dyn Fn(), DynRepr>(ptr).vtable - } + unsafe { std::mem::transmute::<*mut dyn Fn(), DynRepr>(ptr).vtable } } - fn ptr_from_raw_parts(data: *mut (), vtable: *mut()) -> *mut dyn Fn() { - unsafe { - std::mem::transmute::(DynRepr { - data, - vtable - }) - } + fn ptr_from_raw_parts(data: *mut (), vtable: *mut ()) -> *mut dyn Fn() { + unsafe { std::mem::transmute::(DynRepr { data, vtable }) } } #[repr(C)] diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index 2ad4e22884..e9cbf62784 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -64,14 +64,14 @@ use core::intrinsics::{arith_offset, assume}; use core::iter::{FromIterator, FusedIterator, TrustedLen}; use core::marker::PhantomData; use core::mem; -use core::ops::{self, Index, IndexMut, RangeBounds}; use core::ops::Bound::{Excluded, Included, Unbounded}; +use core::ops::{self, Index, IndexMut, RangeBounds}; use core::ptr::{self, NonNull}; use core::slice::{self, SliceIndex}; -use crate::borrow::{ToOwned, Cow}; -use crate::collections::TryReserveError; +use crate::borrow::{Cow, ToOwned}; use crate::boxed::Box; +use crate::collections::TryReserveError; use crate::raw_vec::RawVec; /// A contiguous growable array type, written `Vec` but pronounced 'vector'. @@ -242,7 +242,7 @@ use crate::raw_vec::RawVec; /// ensures no unnecessary allocations or deallocations occur. Emptying a `Vec` /// and then filling it back up to the same [`len`] should incur no calls to /// the allocator. If you wish to free up unused memory, use -/// [`shrink_to_fit`][`shrink_to_fit`]. +/// [`shrink_to_fit`]. /// /// [`push`] and [`insert`] will never (re)allocate if the reported capacity is /// sufficient. [`push`] and [`insert`] *will* (re)allocate if @@ -315,16 +315,10 @@ impl Vec { /// let mut vec: Vec = Vec::new(); /// ``` #[inline] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_vec_new", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_vec_new", since = "1.32.0")] #[stable(feature = "rust1", since = "1.0.0")] pub const fn new() -> Vec { - Vec { - buf: RawVec::NEW, - len: 0, - } + Vec { buf: RawVec::NEW, len: 0 } } /// Constructs a new, empty `Vec` with the specified capacity. @@ -358,10 +352,7 @@ impl Vec { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn with_capacity(capacity: usize) -> Vec { - Vec { - buf: RawVec::with_capacity(capacity), - len: 0, - } + Vec { buf: RawVec::with_capacity(capacity), len: 0 } } /// Decomposes a `Vec` into its raw components. @@ -462,10 +453,7 @@ impl Vec { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub unsafe fn from_raw_parts(ptr: *mut T, length: usize, capacity: usize) -> Vec { - Vec { - buf: RawVec::from_raw_parts(ptr, capacity), - len: length, - } + Vec { buf: RawVec::from_raw_parts(ptr, capacity), len: length } } /// Returns the number of elements the vector can hold without @@ -562,7 +550,7 @@ impl Vec { /// } /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?"); /// ``` - #[unstable(feature = "try_reserve", reason = "new API", issue="48043")] + #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { self.buf.try_reserve(self.len, additional) } @@ -602,8 +590,8 @@ impl Vec { /// } /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?"); /// ``` - #[unstable(feature = "try_reserve", reason = "new API", issue="48043")] - pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> { + #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] + pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> { self.buf.try_reserve_exact(self.len, additional) } @@ -650,7 +638,7 @@ impl Vec { /// vec.shrink_to(0); /// assert!(vec.capacity() >= 3); /// ``` - #[unstable(feature = "shrink_to", reason = "new API", issue="56431")] + #[unstable(feature = "shrink_to", reason = "new API", issue = "56431")] pub fn shrink_to(&mut self, min_capacity: usize) { self.buf.shrink_to_fit(cmp::max(self.len, min_capacity)); } @@ -815,7 +803,9 @@ impl Vec { // We shadow the slice method of the same name to avoid going through // `deref`, which creates an intermediate reference. let ptr = self.buf.ptr(); - unsafe { assume(!ptr.is_null()); } + unsafe { + assume(!ptr.is_null()); + } ptr } @@ -849,7 +839,9 @@ impl Vec { // We shadow the slice method of the same name to avoid going through // `deref_mut`, which creates an intermediate reference. let ptr = self.buf.ptr(); - unsafe { assume(!ptr.is_null()); } + unsafe { + assume(!ptr.is_null()); + } ptr } @@ -1062,7 +1054,7 @@ impl Vec { /// /// ``` /// let mut vec = vec![1, 2, 3, 4]; - /// vec.retain(|&x| x%2 == 0); + /// vec.retain(|&x| x % 2 == 0); /// assert_eq!(vec, [2, 4]); /// ``` /// @@ -1077,7 +1069,8 @@ impl Vec { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn retain(&mut self, mut f: F) - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { let len = self.len(); let mut del = 0; @@ -1113,7 +1106,11 @@ impl Vec { /// ``` #[stable(feature = "dedup_by", since = "1.16.0")] #[inline] - pub fn dedup_by_key(&mut self, mut key: F) where F: FnMut(&mut T) -> K, K: PartialEq { + pub fn dedup_by_key(&mut self, mut key: F) + where + F: FnMut(&mut T) -> K, + K: PartialEq, + { self.dedup_by(|a, b| key(a) == key(b)) } @@ -1136,7 +1133,10 @@ impl Vec { /// assert_eq!(vec, ["foo", "bar", "baz", "bar"]); /// ``` #[stable(feature = "dedup_by", since = "1.16.0")] - pub fn dedup_by(&mut self, same_bucket: F) where F: FnMut(&mut T, &mut T) -> bool { + pub fn dedup_by(&mut self, same_bucket: F) + where + F: FnMut(&mut T, &mut T) -> bool, + { let len = { let (dedup, _) = self.as_mut_slice().partition_dedup_by(same_bucket); dedup.len() @@ -1259,7 +1259,8 @@ impl Vec { /// ``` #[stable(feature = "drain", since = "1.6.0")] pub fn drain(&mut self, range: R) -> Drain<'_, T> - where R: RangeBounds + where + R: RangeBounds, { // Memory safety // @@ -1275,12 +1276,12 @@ impl Vec { let start = match range.start_bound() { Included(&n) => n, Excluded(&n) => n + 1, - Unbounded => 0, + Unbounded => 0, }; let end = match range.end_bound() { Included(&n) => n + 1, Excluded(&n) => n, - Unbounded => len, + Unbounded => len, }; assert!(start <= end); assert!(end <= len); @@ -1290,8 +1291,7 @@ impl Vec { self.set_len(start); // Use the borrow in the IterMut to indicate borrowing behavior of the // whole Drain iterator (like &mut T). - let range_slice = slice::from_raw_parts_mut(self.as_mut_ptr().add(start), - end - start); + let range_slice = slice::from_raw_parts_mut(self.as_mut_ptr().add(start), end - start); Drain { tail_start: end, tail_len: len - end, @@ -1383,9 +1383,7 @@ impl Vec { self.set_len(at); other.set_len(other_len); - ptr::copy_nonoverlapping(self.as_ptr().add(at), - other.as_mut_ptr(), - other.len()); + ptr::copy_nonoverlapping(self.as_ptr().add(at), other.as_mut_ptr(), other.len()); } other } @@ -1421,7 +1419,8 @@ impl Vec { /// [`Clone`]: ../../std/clone/trait.Clone.html #[stable(feature = "vec_resize_with", since = "1.33.0")] pub fn resize_with(&mut self, new_len: usize, f: F) - where F: FnMut() -> T + where + F: FnMut() -> T, { let len = self.len(); if new_len > len { @@ -1458,7 +1457,7 @@ impl Vec { #[inline] pub fn leak<'a>(vec: Vec) -> &'a mut [T] where - T: 'a // Technically not needed, but kept to be explicit. + T: 'a, // Technically not needed, but kept to be explicit. { Box::leak(vec.into_boxed_slice()) } @@ -1556,9 +1555,12 @@ impl Vec { /// [`Default`]: ../../std/default/trait.Default.html /// [`Clone`]: ../../std/clone/trait.Clone.html #[unstable(feature = "vec_resize_default", issue = "41758")] - #[rustc_deprecated(reason = "This is moving towards being removed in favor \ + #[rustc_deprecated( + reason = "This is moving towards being removed in favor \ of `.resize_with(Default::default)`. If you disagree, please comment \ - in the tracking issue.", since = "1.33.0")] + in the tracking issue.", + since = "1.33.0" + )] pub fn resize_default(&mut self, new_len: usize) { let len = self.len(); @@ -1578,20 +1580,32 @@ trait ExtendWith { struct ExtendElement(T); impl ExtendWith for ExtendElement { - fn next(&mut self) -> T { self.0.clone() } - fn last(self) -> T { self.0 } + fn next(&mut self) -> T { + self.0.clone() + } + fn last(self) -> T { + self.0 + } } struct ExtendDefault; impl ExtendWith for ExtendDefault { - fn next(&mut self) -> T { Default::default() } - fn last(self) -> T { Default::default() } + fn next(&mut self) -> T { + Default::default() + } + fn last(self) -> T { + Default::default() + } } struct ExtendFunc(F); impl T> ExtendWith for ExtendFunc { - fn next(&mut self) -> T { (self.0)() } - fn last(mut self) -> T { (self.0)() } + fn next(&mut self) -> T { + (self.0)() + } + fn last(mut self) -> T { + (self.0)() + } } impl Vec { @@ -1674,7 +1688,9 @@ impl Vec { pub fn dedup(&mut self) { self.dedup_by(|a, b| a == b) } +} +impl Vec { /// Removes the first instance of `item` from the vector if the item exists. /// /// # Examples @@ -1688,7 +1704,10 @@ impl Vec { /// assert_eq!(vec, vec![2, 3, 1]); /// ``` #[unstable(feature = "vec_remove_item", reason = "recently added", issue = "40062")] - pub fn remove_item(&mut self, item: &T) -> Option { + pub fn remove_item(&mut self, item: &V) -> Option + where + T: PartialEq, + { let pos = self.iter().position(|x| *x == *item)?; Some(self.remove(pos)) } @@ -1721,10 +1740,7 @@ impl SpecFromElem for u8 { #[inline] fn from_elem(elem: u8, n: usize) -> Vec { if elem == 0 { - return Vec { - buf: RawVec::with_capacity_zeroed(n), - len: n, - } + return Vec { buf: RawVec::with_capacity_zeroed(n), len: n }; } unsafe { let mut v = Vec::with_capacity(n); @@ -1739,10 +1755,7 @@ impl SpecFromElem for T { #[inline] fn from_elem(elem: T, n: usize) -> Vec { if elem.is_zero() { - return Vec { - buf: RawVec::with_capacity_zeroed(n), - len: n, - } + return Vec { buf: RawVec::with_capacity_zeroed(n), len: n }; } let mut v = Vec::with_capacity(n); v.extend_with(n, ExtendElement(elem)); @@ -1763,7 +1776,7 @@ macro_rules! impl_is_zero { $is_zero(*self) } } - } + }; } impl_is_zero!(i8, |x| x == 0); @@ -1824,7 +1837,6 @@ unsafe impl IsZero for Option> { } } - //////////////////////////////////////////////////////////////////////////////// // Common trait implementations for Vec //////////////////////////////////////////////////////////////////////////////// @@ -1860,8 +1872,8 @@ impl Hash for Vec { #[stable(feature = "rust1", since = "1.0.0")] #[rustc_on_unimplemented( - message="vector indices are of type `usize` or ranges of `usize`", - label="vector indices are of type `usize` or ranges of `usize`", + message = "vector indices are of type `usize` or ranges of `usize`", + label = "vector indices are of type `usize` or ranges of `usize`" )] impl> Index for Vec { type Output = I::Output; @@ -1874,8 +1886,8 @@ impl> Index for Vec { #[stable(feature = "rust1", since = "1.0.0")] #[rustc_on_unimplemented( - message="vector indices are of type `usize` or ranges of `usize`", - label="vector indices are of type `usize` or ranges of `usize`", + message = "vector indices are of type `usize` or ranges of `usize`", + label = "vector indices are of type `usize` or ranges of `usize`" )] impl> IndexMut for Vec { #[inline] @@ -1889,18 +1901,14 @@ impl ops::Deref for Vec { type Target = [T]; fn deref(&self) -> &[T] { - unsafe { - slice::from_raw_parts(self.as_ptr(), self.len) - } + unsafe { slice::from_raw_parts(self.as_ptr(), self.len) } } } #[stable(feature = "rust1", since = "1.0.0")] impl ops::DerefMut for Vec { fn deref_mut(&mut self) -> &mut [T] { - unsafe { - slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) - } + unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) } } } @@ -1987,7 +1995,8 @@ trait SpecExtend { } impl SpecExtend for Vec - where I: Iterator, +where + I: Iterator, { default fn from_iter(mut iterator: I) -> Self { // Unroll the first iteration, as the vector is going to be @@ -2017,7 +2026,8 @@ impl SpecExtend for Vec } impl SpecExtend for Vec - where I: TrustedLen, +where + I: TrustedLen, { default fn from_iter(iterator: I) -> Self { let mut vector = Vec::new(); @@ -2029,9 +2039,12 @@ impl SpecExtend for Vec // This is the case for a TrustedLen iterator. let (low, high) = iterator.size_hint(); if let Some(high_value) = high { - debug_assert_eq!(low, high_value, - "TrustedLen iterator's size hint is not exact: {:?}", - (low, high)); + debug_assert_eq!( + low, + high_value, + "TrustedLen iterator's size hint is not exact: {:?}", + (low, high) + ); } if let Some(additional) = high { self.reserve(additional); @@ -2058,9 +2071,7 @@ impl SpecExtend> for Vec { // has not been advanced at all. if iterator.buf.as_ptr() as *const _ == iterator.ptr { unsafe { - let vec = Vec::from_raw_parts(iterator.buf.as_ptr(), - iterator.len(), - iterator.cap); + let vec = Vec::from_raw_parts(iterator.buf.as_ptr(), iterator.len(), iterator.cap); mem::forget(iterator); vec } @@ -2080,8 +2091,9 @@ impl SpecExtend> for Vec { } impl<'a, T: 'a, I> SpecExtend<&'a T, I> for Vec - where I: Iterator, - T: Clone, +where + I: Iterator, + T: Clone, { default fn from_iter(iterator: I) -> Self { SpecExtend::from_iter(iterator.cloned()) @@ -2093,7 +2105,8 @@ impl<'a, T: 'a, I> SpecExtend<&'a T, I> for Vec } impl<'a, T: 'a> SpecExtend<&'a T, slice::Iter<'a, T>> for Vec - where T: Copy, +where + T: Copy, { fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) { let slice = iterator.as_slice(); @@ -2165,12 +2178,11 @@ impl Vec { #[inline] #[stable(feature = "vec_splice", since = "1.21.0")] pub fn splice(&mut self, range: R, replace_with: I) -> Splice<'_, I::IntoIter> - where R: RangeBounds, I: IntoIterator + where + R: RangeBounds, + I: IntoIterator, { - Splice { - drain: self.drain(range), - replace_with: replace_with.into_iter(), - } + Splice { drain: self.drain(range), replace_with: replace_with.into_iter() } } /// Creates an iterator which uses a closure to determine if an element should be removed. @@ -2220,21 +2232,17 @@ impl Vec { /// ``` #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")] pub fn drain_filter(&mut self, filter: F) -> DrainFilter<'_, T, F> - where F: FnMut(&mut T) -> bool, + where + F: FnMut(&mut T) -> bool, { let old_len = self.len(); // Guard against us getting leaked (leak amplification) - unsafe { self.set_len(0); } - - DrainFilter { - vec: self, - idx: 0, - del: 0, - old_len, - pred: filter, - panic_flag: false, + unsafe { + self.set_len(0); } + + DrainFilter { vec: self, idx: 0, del: 0, old_len, pred: filter, panic_flag: false } } } @@ -2383,7 +2391,10 @@ impl From<&mut [T]> for Vec { } #[stable(feature = "vec_from_cow_slice", since = "1.14.0")] -impl<'a, T> From> for Vec where [T]: ToOwned> { +impl<'a, T> From> for Vec +where + [T]: ToOwned>, +{ fn from(s: Cow<'a, [T]>) -> Vec { s.into_owned() } @@ -2440,7 +2451,10 @@ impl<'a, T: Clone> From<&'a Vec> for Cow<'a, [T]> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<'a, T> FromIterator for Cow<'a, [T]> where T: Clone { +impl<'a, T> FromIterator for Cow<'a, [T]> +where + T: Clone, +{ fn from_iter>(it: I) -> Cow<'a, [T]> { Cow::Owned(FromIterator::from_iter(it)) } @@ -2452,7 +2466,7 @@ impl<'a, T> FromIterator for Cow<'a, [T]> where T: Clone { /// An iterator that moves out of a vector. /// -/// This `struct` is created by the `into_iter` method on [`Vec`][`Vec`] (provided +/// This `struct` is created by the `into_iter` method on [`Vec`] (provided /// by the [`IntoIterator`] trait). /// /// [`Vec`]: struct.Vec.html @@ -2469,9 +2483,7 @@ pub struct IntoIter { #[stable(feature = "vec_intoiter_debug", since = "1.13.0")] impl fmt::Debug for IntoIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("IntoIter") - .field(&self.as_slice()) - .finish() + f.debug_tuple("IntoIter").field(&self.as_slice()).finish() } } @@ -2489,9 +2501,7 @@ impl IntoIter { /// ``` #[stable(feature = "vec_into_iter_as_slice", since = "1.15.0")] pub fn as_slice(&self) -> &[T] { - unsafe { - slice::from_raw_parts(self.ptr, self.len()) - } + unsafe { slice::from_raw_parts(self.ptr, self.len()) } } /// Returns the remaining items of this iterator as a mutable slice. @@ -2509,9 +2519,7 @@ impl IntoIter { /// ``` #[stable(feature = "vec_into_iter_as_slice", since = "1.15.0")] pub fn as_mut_slice(&mut self) -> &mut [T] { - unsafe { - slice::from_raw_parts_mut(self.ptr as *mut T, self.len()) - } + unsafe { slice::from_raw_parts_mut(self.ptr as *mut T, self.len()) } } } @@ -2639,9 +2647,7 @@ pub struct Drain<'a, T: 'a> { #[stable(feature = "collection_debug", since = "1.17.0")] impl fmt::Debug for Drain<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("Drain") - .field(&self.iter.as_slice()) - .finish() + f.debug_tuple("Drain").field(&self.iter.as_slice()).finish() } } @@ -2714,7 +2720,6 @@ impl Drop for Drain<'_, T> { } } - #[stable(feature = "drain", since = "1.6.0")] impl ExactSizeIterator for Drain<'_, T> { fn is_empty(&self) -> bool { @@ -2765,7 +2770,6 @@ impl DoubleEndedIterator for Splice<'_, I> { #[stable(feature = "vec_splice", since = "1.21.0")] impl ExactSizeIterator for Splice<'_, I> {} - #[stable(feature = "vec_splice", since = "1.21.0")] impl Drop for Splice<'_, I> { fn drop(&mut self) { @@ -2774,21 +2778,21 @@ impl Drop for Splice<'_, I> { unsafe { if self.drain.tail_len == 0 { self.drain.vec.as_mut().extend(self.replace_with.by_ref()); - return + return; } // First fill the range left by drain(). if !self.drain.fill(&mut self.replace_with) { - return + return; } // There may be more elements. Use the lower bound as an estimate. // FIXME: Is the upper bound a better guess? Or something else? let (lower_bound, _upper_bound) = self.replace_with.size_hint(); - if lower_bound > 0 { + if lower_bound > 0 { self.drain.move_tail(lower_bound); if !self.drain.fill(&mut self.replace_with) { - return + return; } } @@ -2813,20 +2817,19 @@ impl Drain<'_, T> { /// that have been moved out. /// Fill that range as much as possible with new elements from the `replace_with` iterator. /// Returns `true` if we filled the entire range. (`replace_with.next()` didn’t return `None`.) - unsafe fn fill>(&mut self, replace_with: &mut I) -> bool { + unsafe fn fill>(&mut self, replace_with: &mut I) -> bool { let vec = self.vec.as_mut(); let range_start = vec.len; let range_end = self.tail_start; - let range_slice = slice::from_raw_parts_mut( - vec.as_mut_ptr().add(range_start), - range_end - range_start); + let range_slice = + slice::from_raw_parts_mut(vec.as_mut_ptr().add(range_start), range_end - range_start); for place in range_slice { if let Some(new_item) = replace_with.next() { ptr::write(place, new_item); vec.len += 1; } else { - return false + return false; } } true @@ -2850,7 +2853,8 @@ impl Drain<'_, T> { #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")] #[derive(Debug)] pub struct DrainFilter<'a, T, F> - where F: FnMut(&mut T) -> bool, +where + F: FnMut(&mut T) -> bool, { vec: &'a mut Vec, /// The index of the item that will be inspected by the next call to `next`. @@ -2871,7 +2875,8 @@ pub struct DrainFilter<'a, T, F> #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")] impl Iterator for DrainFilter<'_, T, F> - where F: FnMut(&mut T) -> bool, +where + F: FnMut(&mut T) -> bool, { type Item = T; @@ -2908,19 +2913,20 @@ impl Iterator for DrainFilter<'_, T, F> #[unstable(feature = "drain_filter", reason = "recently added", issue = "43244")] impl Drop for DrainFilter<'_, T, F> - where F: FnMut(&mut T) -> bool, +where + F: FnMut(&mut T) -> bool, { fn drop(&mut self) { struct BackshiftOnDrop<'a, 'b, T, F> - where - F: FnMut(&mut T) -> bool, + where + F: FnMut(&mut T) -> bool, { drain: &'b mut DrainFilter<'a, T, F>, } impl<'a, 'b, T, F> Drop for BackshiftOnDrop<'a, 'b, T, F> - where - F: FnMut(&mut T) -> bool + where + F: FnMut(&mut T) -> bool, { fn drop(&mut self) { unsafe { @@ -2942,9 +2948,7 @@ impl Drop for DrainFilter<'_, T, F> } } - let backshift = BackshiftOnDrop { - drain: self - }; + let backshift = BackshiftOnDrop { drain: self }; // Attempt to consume any remaining elements if the filter predicate // has not yet panicked. We'll backshift any remaining elements diff --git a/src/libarena/lib.rs b/src/libarena/lib.rs index 854942dad3..2a3d92edc4 100644 --- a/src/libarena/lib.rs +++ b/src/libarena/lib.rs @@ -8,20 +8,19 @@ //! This crate implements `TypedArena`, a simple arena that can only hold //! objects of a single type. -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - test(no_crate_inject, attr(deny(warnings))))] - +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + test(no_crate_inject, attr(deny(warnings))) +)] #![feature(core_intrinsics)] #![feature(dropck_eyepatch)] #![feature(raw_vec_internals)] #![cfg_attr(test, feature(test))] - #![allow(deprecated)] extern crate alloc; use rustc_data_structures::cold_path; -use rustc_data_structures::sync::MTLock; use smallvec::SmallVec; use std::cell::{Cell, RefCell}; @@ -61,10 +60,7 @@ struct TypedArenaChunk { impl TypedArenaChunk { #[inline] unsafe fn new(capacity: usize) -> TypedArenaChunk { - TypedArenaChunk { - storage: RawVec::with_capacity(capacity), - entries: 0, - } + TypedArenaChunk { storage: RawVec::with_capacity(capacity), entries: 0 } } /// Destroys this arena chunk. @@ -119,11 +115,6 @@ impl Default for TypedArena { } impl TypedArena { - pub fn in_arena(&self, ptr: *const T) -> bool { - let ptr = ptr as *const T as *mut T; - - self.chunks.borrow().iter().any(|chunk| chunk.start() <= ptr && ptr < chunk.end()) - } /// Allocates an object in the `TypedArena`, returning a reference to it. #[inline] pub fn alloc(&self, object: T) -> &mut T { @@ -133,9 +124,7 @@ impl TypedArena { unsafe { if mem::size_of::() == 0 { - self.ptr - .set(intrinsics::arith_offset(self.ptr.get() as *mut u8, 1) - as *mut T); + self.ptr.set(intrinsics::arith_offset(self.ptr.get() as *mut u8, 1) as *mut T); let ptr = mem::align_of::() as *mut T; // Don't drop the object. This `write` is equivalent to `forget`. ptr::write(ptr, object); @@ -260,7 +249,7 @@ impl TypedArena { self.clear_last_chunk(&mut last_chunk); let len = chunks_borrow.len(); // If `T` is ZST, code below has no effect. - for mut chunk in chunks_borrow.drain(..len-1) { + for mut chunk in chunks_borrow.drain(..len - 1) { chunk.destroy(chunk.entries); } } @@ -339,12 +328,6 @@ impl Default for DroplessArena { } impl DroplessArena { - pub fn in_arena(&self, ptr: *const T) -> bool { - let ptr = ptr as *const u8 as *mut u8; - - self.chunks.borrow().iter().any(|chunk| chunk.start() <= ptr && ptr < chunk.end()) - } - #[inline] fn align(&self, align: usize) { let final_address = ((self.ptr.get() as usize) + align - 1) & !(align - 1); @@ -360,10 +343,7 @@ impl DroplessArena { let (chunk, mut new_capacity); if let Some(last_chunk) = chunks.last_mut() { let used_bytes = self.ptr.get() as usize - last_chunk.start() as usize; - if last_chunk - .storage - .reserve_in_place(used_bytes, needed_bytes) - { + if last_chunk.storage.reserve_in_place(used_bytes, needed_bytes) { self.end.set(last_chunk.end()); return; } else { @@ -399,9 +379,7 @@ impl DroplessArena { let ptr = self.ptr.get(); // Set the pointer past ourselves - self.ptr.set( - intrinsics::arith_offset(self.ptr.get(), bytes as isize) as *mut u8, - ); + self.ptr.set(intrinsics::arith_offset(self.ptr.get(), bytes as isize) as *mut u8); slice::from_raw_parts_mut(ptr, bytes) } } @@ -410,9 +388,7 @@ impl DroplessArena { pub fn alloc(&self, object: T) -> &mut T { assert!(!mem::needs_drop::()); - let mem = self.alloc_raw( - mem::size_of::(), - mem::align_of::()) as *mut _ as *mut T; + let mem = self.alloc_raw(mem::size_of::(), mem::align_of::()) as *mut _ as *mut T; unsafe { // Write into uninitialized memory. @@ -437,9 +413,8 @@ impl DroplessArena { assert!(mem::size_of::() != 0); assert!(!slice.is_empty()); - let mem = self.alloc_raw( - slice.len() * mem::size_of::(), - mem::align_of::()) as *mut _ as *mut T; + let mem = self.alloc_raw(slice.len() * mem::size_of::(), mem::align_of::()) as *mut _ + as *mut T; unsafe { let arena_slice = slice::from_raw_parts_mut(mem, slice.len()); @@ -484,13 +459,11 @@ impl DroplessArena { let len = min; if len == 0 { - return &mut [] + return &mut []; } let size = len.checked_mul(mem::size_of::()).unwrap(); let mem = self.alloc_raw(size, mem::align_of::()) as *mut _ as *mut T; - unsafe { - self.write_from_iter(iter, len, mem) - } + unsafe { self.write_from_iter(iter, len, mem) } } (_, _) => { cold_path(move || -> &mut [T] { @@ -502,10 +475,9 @@ impl DroplessArena { // the content of the SmallVec unsafe { let len = vec.len(); - let start_ptr = self.alloc_raw( - len * mem::size_of::(), - mem::align_of::() - ) as *mut _ as *mut T; + let start_ptr = self + .alloc_raw(len * mem::size_of::(), mem::align_of::()) + as *mut _ as *mut T; vec.as_ptr().copy_to_nonoverlapping(start_ptr, len); vec.set_len(0); slice::from_raw_parts_mut(start_ptr, len) @@ -516,66 +488,5 @@ impl DroplessArena { } } -#[derive(Default)] -// FIXME(@Zoxc): this type is entirely unused in rustc -pub struct SyncTypedArena { - lock: MTLock>, -} - -impl SyncTypedArena { - #[inline(always)] - pub fn alloc(&self, object: T) -> &mut T { - // Extend the lifetime of the result since it's limited to the lock guard - unsafe { &mut *(self.lock.lock().alloc(object) as *mut T) } - } - - #[inline(always)] - pub fn alloc_slice(&self, slice: &[T]) -> &mut [T] - where - T: Copy, - { - // Extend the lifetime of the result since it's limited to the lock guard - unsafe { &mut *(self.lock.lock().alloc_slice(slice) as *mut [T]) } - } - - #[inline(always)] - pub fn clear(&mut self) { - self.lock.get_mut().clear(); - } -} - -#[derive(Default)] -pub struct SyncDroplessArena { - lock: MTLock, -} - -impl SyncDroplessArena { - #[inline(always)] - pub fn in_arena(&self, ptr: *const T) -> bool { - self.lock.lock().in_arena(ptr) - } - - #[inline(always)] - pub fn alloc_raw(&self, bytes: usize, align: usize) -> &mut [u8] { - // Extend the lifetime of the result since it's limited to the lock guard - unsafe { &mut *(self.lock.lock().alloc_raw(bytes, align) as *mut [u8]) } - } - - #[inline(always)] - pub fn alloc(&self, object: T) -> &mut T { - // Extend the lifetime of the result since it's limited to the lock guard - unsafe { &mut *(self.lock.lock().alloc(object) as *mut T) } - } - - #[inline(always)] - pub fn alloc_slice(&self, slice: &[T]) -> &mut [T] - where - T: Copy, - { - // Extend the lifetime of the result since it's limited to the lock guard - unsafe { &mut *(self.lock.lock().alloc_slice(slice) as *mut [T]) } - } -} - #[cfg(test)] mod tests; diff --git a/src/libarena/tests.rs b/src/libarena/tests.rs index fa4189409d..8e63bdf545 100644 --- a/src/libarena/tests.rs +++ b/src/libarena/tests.rs @@ -1,7 +1,7 @@ extern crate test; -use test::Bencher; use super::TypedArena; use std::cell::Cell; +use test::Bencher; #[allow(dead_code)] #[derive(Debug, Eq, PartialEq)] @@ -53,9 +53,7 @@ fn test_arena_alloc_nested() { let arena = Wrap(TypedArena::default()); - let result = arena.alloc_outer(|| Outer { - inner: arena.alloc_inner(|| Inner { value: 10 }), - }); + let result = arena.alloc_outer(|| Outer { inner: arena.alloc_inner(|| Inner { value: 10 }) }); assert_eq!(result.inner.value, 10); } @@ -91,10 +89,7 @@ struct Noncopy { pub fn test_noncopy() { let arena = TypedArena::default(); for _ in 0..100000 { - arena.alloc(Noncopy { - string: "hello world".to_string(), - array: vec![1, 2, 3, 4, 5], - }); + arena.alloc(Noncopy { string: "hello world".to_string(), array: vec![1, 2, 3, 4, 5] }); } } @@ -195,19 +190,14 @@ fn test_typed_arena_drop_small_count() { pub fn bench_noncopy(b: &mut Bencher) { let arena = TypedArena::default(); b.iter(|| { - arena.alloc(Noncopy { - string: "hello world".to_string(), - array: vec![1, 2, 3, 4, 5], - }) + arena.alloc(Noncopy { string: "hello world".to_string(), array: vec![1, 2, 3, 4, 5] }) }) } #[bench] pub fn bench_noncopy_nonarena(b: &mut Bencher) { b.iter(|| { - let _: Box<_> = Box::new(Noncopy { - string: "hello world".to_string(), - array: vec![1, 2, 3, 4, 5], - }); + let _: Box<_> = + Box::new(Noncopy { string: "hello world".to_string(), array: vec![1, 2, 3, 4, 5] }); }) } diff --git a/src/libcore/alloc.rs b/src/libcore/alloc.rs index 227b725de1..2050f64512 100644 --- a/src/libcore/alloc.rs +++ b/src/libcore/alloc.rs @@ -7,9 +7,9 @@ use crate::cmp; use crate::fmt; use crate::mem; -use crate::usize; -use crate::ptr::{self, NonNull}; use crate::num::NonZeroUsize; +use crate::ptr::{self, NonNull}; +use crate::usize; /// Represents the combination of a starting address and /// a total capacity of the returned block. @@ -17,7 +17,7 @@ use crate::num::NonZeroUsize; #[derive(Debug)] pub struct Excess(pub NonNull, pub usize); -fn size_align() -> (usize, usize) { +const fn size_align() -> (usize, usize) { (mem::size_of::(), mem::align_of::()) } @@ -64,8 +64,9 @@ impl Layout { /// must not overflow (i.e., the rounded value must be less than /// `usize::MAX`). #[stable(feature = "alloc_layout", since = "1.28.0")] + #[rustc_const_unstable(feature = "const_alloc_layout", issue = "67521")] #[inline] - pub fn from_size_align(size: usize, align: usize) -> Result { + pub const fn from_size_align(size: usize, align: usize) -> Result { if !align.is_power_of_two() { return Err(LayoutErr { private: () }); } @@ -88,9 +89,7 @@ impl Layout { return Err(LayoutErr { private: () }); } - unsafe { - Ok(Layout::from_size_align_unchecked(size, align)) - } + unsafe { Ok(Layout::from_size_align_unchecked(size, align)) } } /// Creates a layout, bypassing all checks. @@ -100,7 +99,7 @@ impl Layout { /// This function is unsafe as it does not verify the preconditions from /// [`Layout::from_size_align`](#method.from_size_align). #[stable(feature = "alloc_layout", since = "1.28.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "alloc_layout", since = "1.28.0"))] + #[rustc_const_stable(feature = "alloc_layout", since = "1.28.0")] #[inline] pub const unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Self { Layout { size_: size, align_: NonZeroUsize::new_unchecked(align) } @@ -108,27 +107,31 @@ impl Layout { /// The minimum size in bytes for a memory block of this layout. #[stable(feature = "alloc_layout", since = "1.28.0")] + #[rustc_const_unstable(feature = "const_alloc_layout", issue = "67521")] #[inline] - pub fn size(&self) -> usize { self.size_ } + pub const fn size(&self) -> usize { + self.size_ + } /// The minimum byte alignment for a memory block of this layout. #[stable(feature = "alloc_layout", since = "1.28.0")] + #[rustc_const_unstable(feature = "const_alloc_layout", issue = "67521")] #[inline] - pub fn align(&self) -> usize { self.align_.get() } + pub const fn align(&self) -> usize { + self.align_.get() + } /// Constructs a `Layout` suitable for holding a value of type `T`. #[stable(feature = "alloc_layout", since = "1.28.0")] + #[rustc_const_stable(feature = "alloc_layout_const_new", since = "1.42.0")] #[inline] - pub fn new() -> Self { + pub const fn new() -> Self { let (size, align) = size_align::(); // Note that the align is guaranteed by rustc to be a power of two and // the size+align combo is guaranteed to fit in our address space. As a // result use the unchecked constructor here to avoid inserting code // that panics if it isn't optimized well enough. - debug_assert!(Layout::from_size_align(size, align).is_ok()); - unsafe { - Layout::from_size_align_unchecked(size, align) - } + unsafe { Layout::from_size_align_unchecked(size, align) } } /// Produces layout describing a record that could be used to @@ -140,9 +143,7 @@ impl Layout { let (size, align) = (mem::size_of_val(t), mem::align_of_val(t)); // See rationale in `new` for why this is using an unsafe variant below debug_assert!(Layout::from_size_align(size, align).is_ok()); - unsafe { - Layout::from_size_align_unchecked(size, align) - } + unsafe { Layout::from_size_align_unchecked(size, align) } } /// Creates a layout describing the record that can hold a value @@ -183,8 +184,9 @@ impl Layout { /// address for the whole allocated block of memory. One way to /// satisfy this constraint is to ensure `align <= self.align()`. #[unstable(feature = "alloc_layout_extra", issue = "55724")] + #[rustc_const_unstable(feature = "const_alloc_layout", issue = "67521")] #[inline] - pub fn padding_needed_for(&self, align: usize) -> usize { + pub const fn padding_needed_for(&self, align: usize) -> usize { let len = self.size(); // Rounded up value is: @@ -206,8 +208,7 @@ impl Layout { // size and padding overflow in the above manner should cause // the allocator to yield an error anyway.) - let len_rounded_up = len.wrapping_add(align).wrapping_sub(1) - & !align.wrapping_sub(1); + let len_rounded_up = len.wrapping_add(align).wrapping_sub(1) & !align.wrapping_sub(1); len_rounded_up.wrapping_sub(len) } @@ -276,10 +277,8 @@ impl Layout { let new_align = cmp::max(self.align(), next.align()); let pad = self.padding_needed_for(next.align()); - let offset = self.size().checked_add(pad) - .ok_or(LayoutErr { private: () })?; - let new_size = offset.checked_add(next.size()) - .ok_or(LayoutErr { private: () })?; + let offset = self.size().checked_add(pad).ok_or(LayoutErr { private: () })?; + let new_size = offset.checked_add(next.size()).ok_or(LayoutErr { private: () })?; let layout = Layout::from_size_align(new_size, new_align)?; Ok((layout, offset)) @@ -313,8 +312,7 @@ impl Layout { #[unstable(feature = "alloc_layout_extra", issue = "55724")] #[inline] pub fn extend_packed(&self, next: Self) -> Result { - let new_size = self.size().checked_add(next.size()) - .ok_or(LayoutErr { private: () })?; + let new_size = self.size().checked_add(next.size()).ok_or(LayoutErr { private: () })?; Layout::from_size_align(new_size, self.align()) } @@ -324,12 +322,10 @@ impl Layout { #[unstable(feature = "alloc_layout_extra", issue = "55724")] #[inline] pub fn array(n: usize) -> Result { - Layout::new::() - .repeat(n) - .map(|(k, offs)| { - debug_assert!(offs == mem::size_of::()); - k - }) + Layout::new::().repeat(n).map(|(k, offs)| { + debug_assert!(offs == mem::size_of::()); + k + }) } } @@ -339,7 +335,7 @@ impl Layout { #[stable(feature = "alloc_layout", since = "1.28.0")] #[derive(Clone, PartialEq, Eq, Debug)] pub struct LayoutErr { - private: () + private: (), } // (we need this for downstream impl of trait Error) @@ -531,7 +527,8 @@ pub unsafe trait GlobalAlloc { /// The memory may or may not have been deallocated, /// and should be considered unusable (unless of course it was /// transferred back to the caller again via the return value of - /// this method). + /// this method). The new memory block is allocated with `layout`, but + /// with the `size` updated to `new_size`. /// /// If this method returns null, then ownership of the memory /// block has not been transferred to this allocator, and the @@ -578,11 +575,7 @@ pub unsafe trait GlobalAlloc { let new_layout = Layout::from_size_align_unchecked(new_size, layout.align()); let new_ptr = self.alloc(new_layout); if !new_ptr.is_null() { - ptr::copy_nonoverlapping( - ptr, - new_ptr, - cmp::min(layout.size(), new_size), - ); + ptr::copy_nonoverlapping(ptr, new_ptr, cmp::min(layout.size(), new_size)); self.dealloc(ptr, layout); } new_ptr @@ -670,7 +663,6 @@ pub unsafe trait GlobalAlloc { /// the future. #[unstable(feature = "allocator_api", issue = "32838")] pub unsafe trait Alloc { - // (Note: some existing allocators have unspecified but well-defined // behavior in response to a zero size allocation request ; // e.g., in C, `malloc` of 0 will either return a null pointer or a @@ -827,10 +819,12 @@ pub unsafe trait Alloc { /// rather than directly invoking `panic!` or similar. /// /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html - unsafe fn realloc(&mut self, - ptr: NonNull, - layout: Layout, - new_size: usize) -> Result, AllocErr> { + unsafe fn realloc( + &mut self, + ptr: NonNull, + layout: Layout, + new_size: usize, + ) -> Result, AllocErr> { let old_size = layout.size(); if new_size >= old_size { @@ -847,9 +841,7 @@ pub unsafe trait Alloc { let new_layout = Layout::from_size_align_unchecked(new_size, layout.align()); let result = self.alloc(new_layout); if let Ok(new_ptr) = result { - ptr::copy_nonoverlapping(ptr.as_ptr(), - new_ptr.as_ptr(), - cmp::min(old_size, new_size)); + ptr::copy_nonoverlapping(ptr.as_ptr(), new_ptr.as_ptr(), cmp::min(old_size, new_size)); self.dealloc(ptr, layout); } result @@ -925,14 +917,15 @@ pub unsafe trait Alloc { /// rather than directly invoking `panic!` or similar. /// /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html - unsafe fn realloc_excess(&mut self, - ptr: NonNull, - layout: Layout, - new_size: usize) -> Result { + unsafe fn realloc_excess( + &mut self, + ptr: NonNull, + layout: Layout, + new_size: usize, + ) -> Result { let new_layout = Layout::from_size_align_unchecked(new_size, layout.align()); let usable_size = self.usable_size(&new_layout); - self.realloc(ptr, layout, new_size) - .map(|p| Excess(p, usable_size.1)) + self.realloc(ptr, layout, new_size).map(|p| Excess(p, usable_size.1)) } /// Attempts to extend the allocation referenced by `ptr` to fit `new_size`. @@ -970,20 +963,18 @@ pub unsafe trait Alloc { /// function; clients are expected either to be able to recover from /// `grow_in_place` failures without aborting, or to fall back on /// another reallocation method before resorting to an abort. - unsafe fn grow_in_place(&mut self, - ptr: NonNull, - layout: Layout, - new_size: usize) -> Result<(), CannotReallocInPlace> { + unsafe fn grow_in_place( + &mut self, + ptr: NonNull, + layout: Layout, + new_size: usize, + ) -> Result<(), CannotReallocInPlace> { let _ = ptr; // this default implementation doesn't care about the actual address. debug_assert!(new_size >= layout.size()); let (_l, u) = self.usable_size(&layout); // _l <= layout.size() [guaranteed by usable_size()] // layout.size() <= new_layout.size() [required by this method] - if new_size <= u { - Ok(()) - } else { - Err(CannotReallocInPlace) - } + if new_size <= u { Ok(()) } else { Err(CannotReallocInPlace) } } /// Attempts to shrink the allocation referenced by `ptr` to fit `new_size`. @@ -1025,23 +1016,20 @@ pub unsafe trait Alloc { /// function; clients are expected either to be able to recover from /// `shrink_in_place` failures without aborting, or to fall back /// on another reallocation method before resorting to an abort. - unsafe fn shrink_in_place(&mut self, - ptr: NonNull, - layout: Layout, - new_size: usize) -> Result<(), CannotReallocInPlace> { + unsafe fn shrink_in_place( + &mut self, + ptr: NonNull, + layout: Layout, + new_size: usize, + ) -> Result<(), CannotReallocInPlace> { let _ = ptr; // this default implementation doesn't care about the actual address. debug_assert!(new_size <= layout.size()); let (l, _u) = self.usable_size(&layout); // layout.size() <= _u [guaranteed by usable_size()] // new_layout.size() <= layout.size() [required by this method] - if l <= new_size { - Ok(()) - } else { - Err(CannotReallocInPlace) - } + if l <= new_size { Ok(()) } else { Err(CannotReallocInPlace) } } - // == COMMON USAGE PATTERNS == // alloc_one, dealloc_one, alloc_array, realloc_array. dealloc_array @@ -1075,14 +1063,11 @@ pub unsafe trait Alloc { /// /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html fn alloc_one(&mut self) -> Result, AllocErr> - where Self: Sized + where + Self: Sized, { let k = Layout::new::(); - if k.size() > 0 { - unsafe { self.alloc(k).map(|p| p.cast()) } - } else { - Err(AllocErr) - } + if k.size() > 0 { unsafe { self.alloc(k).map(|p| p.cast()) } } else { Err(AllocErr) } } /// Deallocates a block suitable for holding an instance of `T`. @@ -1103,7 +1088,8 @@ pub unsafe trait Alloc { /// /// * the layout of `T` must *fit* that block of memory. unsafe fn dealloc_one(&mut self, ptr: NonNull) - where Self: Sized + where + Self: Sized, { let k = Layout::new::(); if k.size() > 0 { @@ -1144,14 +1130,11 @@ pub unsafe trait Alloc { /// /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html fn alloc_array(&mut self, n: usize) -> Result, AllocErr> - where Self: Sized + where + Self: Sized, { match Layout::array::(n) { - Ok(layout) if layout.size() > 0 => { - unsafe { - self.alloc(layout).map(|p| p.cast()) - } - } + Ok(layout) if layout.size() > 0 => unsafe { self.alloc(layout).map(|p| p.cast()) }, _ => Err(AllocErr), } } @@ -1190,20 +1173,21 @@ pub unsafe trait Alloc { /// rather than directly invoking `panic!` or similar. /// /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html - unsafe fn realloc_array(&mut self, - ptr: NonNull, - n_old: usize, - n_new: usize) -> Result, AllocErr> - where Self: Sized + unsafe fn realloc_array( + &mut self, + ptr: NonNull, + n_old: usize, + n_new: usize, + ) -> Result, AllocErr> + where + Self: Sized, { match (Layout::array::(n_old), Layout::array::(n_new)) { (Ok(k_old), Ok(k_new)) if k_old.size() > 0 && k_new.size() > 0 => { debug_assert!(k_old.align() == k_new.align()); self.realloc(ptr.cast(), k_old, k_new.size()).map(NonNull::cast) } - _ => { - Err(AllocErr) - } + _ => Err(AllocErr), } } @@ -1228,15 +1212,12 @@ pub unsafe trait Alloc { /// /// Always returns `Err` on arithmetic overflow. unsafe fn dealloc_array(&mut self, ptr: NonNull, n: usize) -> Result<(), AllocErr> - where Self: Sized + where + Self: Sized, { match Layout::array::(n) { - Ok(k) if k.size() > 0 => { - Ok(self.dealloc(ptr.cast(), k)) - } - _ => { - Err(AllocErr) - } + Ok(k) if k.size() > 0 => Ok(self.dealloc(ptr.cast(), k)), + _ => Err(AllocErr), } } } diff --git a/src/libcore/any.rs b/src/libcore/any.rs index 7935c9b1b3..af02e84d3f 100644 --- a/src/libcore/any.rs +++ b/src/libcore/any.rs @@ -74,6 +74,16 @@ use crate::intrinsics; /// See the [module-level documentation][mod] for more details. /// /// [mod]: index.html +// This trait is not unsafe, though we rely on the specifics of it's sole impl's +// `type_id` function in unsafe code (e.g., `downcast`). Normally, that would be +// a problem, but because the only impl of `Any` is a blanket implementation, no +// other code can implement `Any`. +// +// We could plausibly make this trait unsafe -- it would not cause breakage, +// since we control all the implementations -- but we choose not to as that's +// both not really necessary and may confuse users about the distinction of +// unsafe traits and unsafe methods (i.e., `type_id` would still be safe to call, +// but we would likely want to indicate as such in documentation). #[stable(feature = "rust1", since = "1.0.0")] pub trait Any: 'static { /// Gets the `TypeId` of `self`. @@ -95,8 +105,10 @@ pub trait Any: 'static { } #[stable(feature = "rust1", since = "1.0.0")] -impl Any for T { - fn type_id(&self) -> TypeId { TypeId::of::() } +impl Any for T { + fn type_id(&self) -> TypeId { + TypeId::of::() + } } /////////////////////////////////////////////////////////////////////////////// @@ -183,9 +195,7 @@ impl dyn Any { pub fn downcast_ref(&self) -> Option<&T> { if self.is::() { // SAFETY: just checked whether we are pointing to the correct type - unsafe { - Some(&*(self as *const dyn Any as *const T)) - } + unsafe { Some(&*(self as *const dyn Any as *const T)) } } else { None } @@ -219,16 +229,14 @@ impl dyn Any { pub fn downcast_mut(&mut self) -> Option<&mut T> { if self.is::() { // SAFETY: just checked whether we are pointing to the correct type - unsafe { - Some(&mut *(self as *mut dyn Any as *mut T)) - } + unsafe { Some(&mut *(self as *mut dyn Any as *mut T)) } } else { None } } } -impl dyn Any+Send { +impl dyn Any + Send { /// Forwards to the method defined on the type `Any`. /// /// # Examples @@ -306,7 +314,7 @@ impl dyn Any+Send { } } -impl dyn Any+Send+Sync { +impl dyn Any + Send + Sync { /// Forwards to the method defined on the type `Any`. /// /// # Examples @@ -423,16 +431,9 @@ impl TypeId { /// assert_eq!(is_string(&"cookie monster".to_string()), true); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature="const_type_id"))] - #[cfg_attr(not(bootstrap), rustc_const_unstable(feature="const_type_id", issue = "41875"))] + #[rustc_const_unstable(feature = "const_type_id", issue = "41875")] pub const fn of() -> TypeId { - TypeId { - #[cfg(bootstrap)] - // SAFETY: going away soon - t: unsafe { intrinsics::type_id::() }, - #[cfg(not(bootstrap))] - t: intrinsics::type_id::(), - } + TypeId { t: intrinsics::type_id::() } } } @@ -462,8 +463,7 @@ impl TypeId { /// ); /// ``` #[stable(feature = "type_name", since = "1.38.0")] -#[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_type_name"))] -#[cfg_attr(not(bootstrap), rustc_const_unstable(feature = "const_type_name", issue = "63084"))] +#[rustc_const_unstable(feature = "const_type_name", issue = "63084")] pub const fn type_name() -> &'static str { intrinsics::type_name::() } @@ -476,11 +476,15 @@ pub const fn type_name() -> &'static str { /// /// This is intended for diagnostic use. The exact contents and format of the /// string are not specified, other than being a best-effort description of the -/// type. For example, `type_name_of::>(None)` could return +/// type. For example, `type_name_of_val::>(None)` could return /// `"Option"` or `"std::option::Option"`, but not /// `"foobar"`. In addition, the output may change between versions of the /// compiler. /// +/// This function does not resolve trait objects, +/// meaning that `type_name_of_val(&7u32 as &dyn Debug)` +/// may return `"dyn Debug"`, but not `"u32"`. +/// /// The type name should not be considered a unique identifier of a type; /// multiple types may share the same type name. /// @@ -501,9 +505,7 @@ pub const fn type_name() -> &'static str { /// println!("{}", type_name_of_val(&y)); /// ``` #[unstable(feature = "type_name_of_val", issue = "66359")] -#[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_type_name"))] -#[cfg_attr(not(bootstrap), rustc_const_unstable(feature = "const_type_name", issue = "63084"))] -pub const fn type_name_of_val(val: &T) -> &'static str { - let _ = val; +#[rustc_const_unstable(feature = "const_type_name", issue = "63084")] +pub const fn type_name_of_val(_val: &T) -> &'static str { type_name::() } diff --git a/src/libcore/array/iter.rs b/src/libcore/array/iter.rs index aab9463e3a..80eaae0d4a 100644 --- a/src/libcore/array/iter.rs +++ b/src/libcore/array/iter.rs @@ -1,5 +1,6 @@ //! Defines the `IntoIter` owned iterator for arrays. +use super::LengthAtMost32; use crate::{ fmt, iter::{ExactSizeIterator, FusedIterator, TrustedLen}, @@ -7,8 +8,6 @@ use crate::{ ops::Range, ptr, }; -use super::LengthAtMost32; - /// A by-value [array] iterator. /// @@ -40,7 +39,7 @@ where alive: Range, } -impl IntoIter +impl IntoIter where [T; N]: LengthAtMost32, { @@ -75,10 +74,7 @@ where data }; - Self { - data, - alive: 0..N, - } + Self { data, alive: 0..N } } /// Returns an immutable slice of all elements that have not been yielded @@ -88,9 +84,7 @@ where // SAFETY: This transmute is safe. As mentioned in `new`, `MaybeUninit` retains // the size and alignment of `T`. Furthermore, we know that all // elements within `alive` are properly initialized. - unsafe { - mem::transmute::<&[MaybeUninit], &[T]>(slice) - } + unsafe { mem::transmute::<&[MaybeUninit], &[T]>(slice) } } /// Returns a mutable slice of all elements that have not been yielded yet. @@ -100,15 +94,12 @@ where // SAFETY: This transmute is safe. As mentioned in `new`, `MaybeUninit` retains // the size and alignment of `T`. Furthermore, we know that all // elements within `alive` are properly initialized. - unsafe { - mem::transmute::<&mut [MaybeUninit], &mut [T]>(slice) - } + unsafe { mem::transmute::<&mut [MaybeUninit], &mut [T]>(slice) } } } - #[stable(feature = "array_value_iter_impls", since = "1.40.0")] -impl Iterator for IntoIter +impl Iterator for IntoIter where [T; N]: LengthAtMost32, { @@ -155,7 +146,7 @@ where } #[stable(feature = "array_value_iter_impls", since = "1.40.0")] -impl DoubleEndedIterator for IntoIter +impl DoubleEndedIterator for IntoIter where [T; N]: LengthAtMost32, { @@ -191,7 +182,7 @@ where } #[stable(feature = "array_value_iter_impls", since = "1.40.0")] -impl Drop for IntoIter +impl Drop for IntoIter where [T; N]: LengthAtMost32, { @@ -199,14 +190,12 @@ where // SAFETY: This is safe: `as_mut_slice` returns exactly the sub-slice // of elements that have not been moved out yet and that remain // to be dropped. - unsafe { - ptr::drop_in_place(self.as_mut_slice()) - } + unsafe { ptr::drop_in_place(self.as_mut_slice()) } } } #[stable(feature = "array_value_iter_impls", since = "1.40.0")] -impl ExactSizeIterator for IntoIter +impl ExactSizeIterator for IntoIter where [T; N]: LengthAtMost32, { @@ -221,23 +210,17 @@ where } #[stable(feature = "array_value_iter_impls", since = "1.40.0")] -impl FusedIterator for IntoIter -where - [T; N]: LengthAtMost32, -{} +impl FusedIterator for IntoIter where [T; N]: LengthAtMost32 {} // The iterator indeed reports the correct length. The number of "alive" // elements (that will still be yielded) is the length of the range `alive`. // This range is decremented in length in either `next` or `next_back`. It is // always decremented by 1 in those methods, but only if `Some(_)` is returned. #[stable(feature = "array_value_iter_impls", since = "1.40.0")] -unsafe impl TrustedLen for IntoIter -where - [T; N]: LengthAtMost32, -{} +unsafe impl TrustedLen for IntoIter where [T; N]: LengthAtMost32 {} #[stable(feature = "array_value_iter_impls", since = "1.40.0")] -impl Clone for IntoIter +impl Clone for IntoIter where [T; N]: LengthAtMost32, { @@ -260,24 +243,19 @@ where new_data.get_unchecked_mut(idx).write(clone); } - Self { - data: new_data, - alive: self.alive.clone(), - } + Self { data: new_data, alive: self.alive.clone() } } } } #[stable(feature = "array_value_iter_impls", since = "1.40.0")] -impl fmt::Debug for IntoIter +impl fmt::Debug for IntoIter where [T; N]: LengthAtMost32, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // Only print the elements that were not yielded yet: we cannot // access the yielded elements anymore. - f.debug_tuple("IntoIter") - .field(&self.as_slice()) - .finish() + f.debug_tuple("IntoIter").field(&self.as_slice()).finish() } } diff --git a/src/libcore/array/mod.rs b/src/libcore/array/mod.rs index 38d248d701..937451274c 100644 --- a/src/libcore/array/mod.rs +++ b/src/libcore/array/mod.rs @@ -10,7 +10,7 @@ use crate::borrow::{Borrow, BorrowMut}; use crate::cmp::Ordering; use crate::convert::{Infallible, TryFrom}; use crate::fmt; -use crate::hash::{Hash, self}; +use crate::hash::{self, Hash}; use crate::marker::Unsize; use crate::slice::{Iter, IterMut}; @@ -71,10 +71,12 @@ impl fmt::Display for TryFromSliceError { } impl TryFromSliceError { - #[unstable(feature = "array_error_internals", - reason = "available through Error trait and this method should not \ + #[unstable( + feature = "array_error_internals", + reason = "available through Error trait and this method should not \ be exposed publicly", - issue = "0")] + issue = "none" + )] #[inline] #[doc(hidden)] pub fn __description(&self) -> &str { @@ -385,17 +387,18 @@ where } /// Implemented for lengths where trait impls are allowed on arrays in core/std -#[rustc_on_unimplemented( - message="arrays only have std trait implementations for lengths 0..=32", +#[rustc_on_unimplemented(message = "arrays only have std trait implementations for lengths 0..=32")] +#[unstable( + feature = "const_generic_impls_guard", + issue = "none", + reason = "will never be stable, just a temporary step until const generics are stable" )] -#[unstable(feature = "const_generic_impls_guard", issue = "0", - reason = "will never be stable, just a temporary step until const generics are stable")] pub trait LengthAtMost32 {} macro_rules! array_impls { ($($N:literal)+) => { $( - #[unstable(feature = "const_generic_impls_guard", issue = "0")] + #[unstable(feature = "const_generic_impls_guard", issue = "none")] impl LengthAtMost32 for [T; $N] {} )+ } @@ -429,4 +432,4 @@ macro_rules! array_impl_default { }; } -array_impl_default!{32, T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T} +array_impl_default! {32, T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T} diff --git a/src/libcore/benches/pattern.rs b/src/libcore/benches/pattern.rs index a49490cec1..480ac6f36d 100644 --- a/src/libcore/benches/pattern.rs +++ b/src/libcore/benches/pattern.rs @@ -21,7 +21,6 @@ fn starts_with_str(b: &mut Bencher) { }) } - #[bench] fn ends_with_char(b: &mut Bencher) { let text = black_box("kdjsfhlakfhlsghlkvcnljknfqiunvcijqenwodind"); diff --git a/src/libcore/borrow.rs b/src/libcore/borrow.rs index 4d58aaca94..3e533255be 100644 --- a/src/libcore/borrow.rs +++ b/src/libcore/borrow.rs @@ -189,7 +189,7 @@ pub trait Borrow { /// /// [`Borrow`]: trait.Borrow.html #[stable(feature = "rust1", since = "1.0.0")] -pub trait BorrowMut : Borrow { +pub trait BorrowMut: Borrow { /// Mutably borrows from an owned value. /// /// # Examples @@ -211,25 +211,35 @@ pub trait BorrowMut : Borrow { #[stable(feature = "rust1", since = "1.0.0")] impl Borrow for T { - fn borrow(&self) -> &T { self } + fn borrow(&self) -> &T { + self + } } #[stable(feature = "rust1", since = "1.0.0")] impl BorrowMut for T { - fn borrow_mut(&mut self) -> &mut T { self } + fn borrow_mut(&mut self) -> &mut T { + self + } } #[stable(feature = "rust1", since = "1.0.0")] impl Borrow for &T { - fn borrow(&self) -> &T { &**self } + fn borrow(&self) -> &T { + &**self + } } #[stable(feature = "rust1", since = "1.0.0")] impl Borrow for &mut T { - fn borrow(&self) -> &T { &**self } + fn borrow(&self) -> &T { + &**self + } } #[stable(feature = "rust1", since = "1.0.0")] impl BorrowMut for &mut T { - fn borrow_mut(&mut self) -> &mut T { &mut **self } + fn borrow_mut(&mut self) -> &mut T { + &mut **self + } } diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index e4b4cd31c6..e7eecf7540 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -187,15 +187,13 @@ //! ``` //! -// ignore-tidy-undocumented-unsafe - #![stable(feature = "rust1", since = "1.0.0")] use crate::cmp::Ordering; use crate::fmt::{self, Debug, Display}; use crate::marker::Unsize; use crate::mem; -use crate::ops::{Deref, DerefMut, CoerceUnsized}; +use crate::ops::{CoerceUnsized, Deref, DerefMut}; use crate::ptr; /// A mutable memory location. @@ -243,7 +241,7 @@ unsafe impl Send for Cell where T: Send {} impl !Sync for Cell {} #[stable(feature = "rust1", since = "1.0.0")] -impl Clone for Cell { +impl Clone for Cell { #[inline] fn clone(&self) -> Cell { Cell::new(self.get()) @@ -324,12 +322,10 @@ impl Cell { /// let c = Cell::new(5); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_cell_new", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_cell_new", since = "1.32.0")] #[inline] pub const fn new(value: T) -> Cell { - Cell { - value: UnsafeCell::new(value), - } + Cell { value: UnsafeCell::new(value) } } /// Sets the contained value. @@ -370,6 +366,10 @@ impl Cell { if ptr::eq(self, other) { return; } + // SAFETY: This can be risky if called from separate threads, but `Cell` + // is `!Sync` so this won't happen. This also won't invalidate any + // pointers since `Cell` makes sure nothing else will be pointing into + // either of these `Cell`s. unsafe { ptr::swap(self.value.get(), other.value.get()); } @@ -389,6 +389,8 @@ impl Cell { /// ``` #[stable(feature = "move_cell", since = "1.17.0")] pub fn replace(&self, val: T) -> T { + // SAFETY: This can cause data races if called from a separate thread, + // but `Cell` is `!Sync` so this won't happen. mem::replace(unsafe { &mut *self.value.get() }, val) } @@ -410,7 +412,7 @@ impl Cell { } } -impl Cell { +impl Cell { /// Returns a copy of the contained value. /// /// # Examples @@ -425,7 +427,9 @@ impl Cell { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn get(&self) -> T { - unsafe{ *self.value.get() } + // SAFETY: This can cause data races if called from a separate thread, + // but `Cell` is `!Sync` so this won't happen. + unsafe { *self.value.get() } } /// Updates the contained value using a function and returns the new value. @@ -470,7 +474,7 @@ impl Cell { /// ``` #[inline] #[stable(feature = "cell_as_ptr", since = "1.12.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_cell_as_ptr", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_cell_as_ptr", since = "1.32.0")] pub const fn as_ptr(&self) -> *mut T { self.value.get() } @@ -493,9 +497,10 @@ impl Cell { #[inline] #[stable(feature = "cell_get_mut", since = "1.11.0")] pub fn get_mut(&mut self) -> &mut T { - unsafe { - &mut *self.value.get() - } + // SAFETY: This can cause data races if called from a separate thread, + // but `Cell` is `!Sync` so this won't happen, and `&mut` guarantees + // unique access. + unsafe { &mut *self.value.get() } } /// Returns a `&Cell` from a `&mut T` @@ -514,9 +519,8 @@ impl Cell { #[inline] #[stable(feature = "as_cell", since = "1.37.0")] pub fn from_mut(t: &mut T) -> &Cell { - unsafe { - &*(t as *mut T as *const Cell) - } + // SAFETY: `&mut` ensures unique access. + unsafe { &*(t as *mut T as *const Cell) } } } @@ -559,9 +563,8 @@ impl Cell<[T]> { /// ``` #[stable(feature = "as_cell", since = "1.37.0")] pub fn as_slice_of_cells(&self) -> &[Cell] { - unsafe { - &*(self as *const Cell<[T]> as *const [Cell]) - } + // SAFETY: `Cell` has the same memory layout as `T`. + unsafe { &*(self as *const Cell<[T]> as *const [Cell]) } } } @@ -651,13 +654,10 @@ impl RefCell { /// let c = RefCell::new(5); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_refcell_new", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_refcell_new", since = "1.32.0")] #[inline] pub const fn new(value: T) -> RefCell { - RefCell { - value: UnsafeCell::new(value), - borrow: Cell::new(UNUSED), - } + RefCell { value: UnsafeCell::new(value), borrow: Cell::new(UNUSED) } } /// Consumes the `RefCell`, returning the wrapped value. @@ -700,7 +700,7 @@ impl RefCell { /// assert_eq!(cell, RefCell::new(6)); /// ``` #[inline] - #[stable(feature = "refcell_replace", since="1.24.0")] + #[stable(feature = "refcell_replace", since = "1.24.0")] pub fn replace(&self, t: T) -> T { mem::replace(&mut *self.borrow_mut(), t) } @@ -722,7 +722,7 @@ impl RefCell { /// assert_eq!(cell, RefCell::new(6)); /// ``` #[inline] - #[stable(feature = "refcell_replace_swap", since="1.35.0")] + #[stable(feature = "refcell_replace_swap", since = "1.35.0")] pub fn replace_with T>(&self, f: F) -> T { let mut_borrow = &mut *self.borrow_mut(); let replacement = f(mut_borrow); @@ -749,7 +749,7 @@ impl RefCell { /// assert_eq!(d, RefCell::new(5)); /// ``` #[inline] - #[stable(feature = "refcell_swap", since="1.24.0")] + #[stable(feature = "refcell_swap", since = "1.24.0")] pub fn swap(&self, other: &Self) { mem::swap(&mut *self.borrow_mut(), &mut *other.borrow_mut()) } @@ -827,10 +827,9 @@ impl RefCell { #[inline] pub fn try_borrow(&self) -> Result, BorrowError> { match BorrowRef::new(&self.borrow) { - Some(b) => Ok(Ref { - value: unsafe { &*self.value.get() }, - borrow: b, - }), + // SAFETY: `BorrowRef` ensures that there is only immutable access + // to the value while borrowed. + Some(b) => Ok(Ref { value: unsafe { &*self.value.get() }, borrow: b }), None => Err(BorrowError { _private: () }), } } @@ -905,10 +904,8 @@ impl RefCell { #[inline] pub fn try_borrow_mut(&self) -> Result, BorrowMutError> { match BorrowRefMut::new(&self.borrow) { - Some(b) => Ok(RefMut { - value: unsafe { &mut *self.value.get() }, - borrow: b, - }), + // SAFETY: `BorrowRef` guarantees unique access. + Some(b) => Ok(RefMut { value: unsafe { &mut *self.value.get() }, borrow: b }), None => Err(BorrowMutError { _private: () }), } } @@ -957,9 +954,8 @@ impl RefCell { #[inline] #[stable(feature = "cell_get_mut", since = "1.11.0")] pub fn get_mut(&mut self) -> &mut T { - unsafe { - &mut *self.value.get() - } + // SAFETY: `&mut` guarantees unique access. + unsafe { &mut *self.value.get() } } /// Immutably borrows the wrapped value, returning an error if the value is @@ -1189,10 +1185,7 @@ impl<'b, T: ?Sized> Ref<'b, T> { #[stable(feature = "cell_extras", since = "1.15.0")] #[inline] pub fn clone(orig: &Ref<'b, T>) -> Ref<'b, T> { - Ref { - value: orig.value, - borrow: orig.borrow.clone(), - } + Ref { value: orig.value, borrow: orig.borrow.clone() } } /// Makes a new `Ref` for a component of the borrowed data. @@ -1216,12 +1209,10 @@ impl<'b, T: ?Sized> Ref<'b, T> { #[stable(feature = "cell_map", since = "1.8.0")] #[inline] pub fn map(orig: Ref<'b, T>, f: F) -> Ref<'b, U> - where F: FnOnce(&T) -> &U + where + F: FnOnce(&T) -> &U, { - Ref { - value: f(orig.value), - borrow: orig.borrow, - } + Ref { value: f(orig.value), borrow: orig.borrow } } /// Splits a `Ref` into multiple `Ref`s for different components of the @@ -1247,7 +1238,8 @@ impl<'b, T: ?Sized> Ref<'b, T> { #[stable(feature = "refcell_map_split", since = "1.35.0")] #[inline] pub fn map_split(orig: Ref<'b, T>, f: F) -> (Ref<'b, U>, Ref<'b, V>) - where F: FnOnce(&T) -> (&U, &V) + where + F: FnOnce(&T) -> (&U, &V), { let (a, b) = f(orig.value); let borrow = orig.borrow.clone(); @@ -1292,14 +1284,12 @@ impl<'b, T: ?Sized> RefMut<'b, T> { #[stable(feature = "cell_map", since = "1.8.0")] #[inline] pub fn map(orig: RefMut<'b, T>, f: F) -> RefMut<'b, U> - where F: FnOnce(&mut T) -> &mut U + where + F: FnOnce(&mut T) -> &mut U, { // FIXME(nll-rfc#40): fix borrow-check let RefMut { value, borrow } = orig; - RefMut { - value: f(value), - borrow, - } + RefMut { value: f(value), borrow } } /// Splits a `RefMut` into multiple `RefMut`s for different components of the @@ -1330,9 +1320,11 @@ impl<'b, T: ?Sized> RefMut<'b, T> { #[stable(feature = "refcell_map_split", since = "1.35.0")] #[inline] pub fn map_split( - orig: RefMut<'b, T>, f: F + orig: RefMut<'b, T>, + f: F, ) -> (RefMut<'b, U>, RefMut<'b, V>) - where F: FnOnce(&mut T) -> (&mut U, &mut V) + where + F: FnOnce(&mut T) -> (&mut U, &mut V), { let (a, b) = f(orig.value); let borrow = orig.borrow.clone(); @@ -1364,7 +1356,7 @@ impl<'b> BorrowRefMut<'b> { UNUSED => { borrow.set(UNUSED - 1); Some(BorrowRefMut { borrow }) - }, + } _ => None, } } @@ -1504,10 +1496,7 @@ impl UnsafeCell { /// let uc = UnsafeCell::new(5); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_unsafe_cell_new", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_unsafe_cell_new", since = "1.32.0")] #[inline] pub const fn new(value: T) -> UnsafeCell { UnsafeCell { value } @@ -1550,10 +1539,7 @@ impl UnsafeCell { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_unsafecell_get", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_unsafecell_get", since = "1.32.0")] pub const fn get(&self) -> *mut T { // We can just cast the pointer from `UnsafeCell` to `T` because of // #[repr(transparent)]. This exploits libstd's special status, there is diff --git a/src/libcore/char/convert.rs b/src/libcore/char/convert.rs index dd21c72e74..315020bac5 100644 --- a/src/libcore/char/convert.rs +++ b/src/libcore/char/convert.rs @@ -169,7 +169,7 @@ impl ParseCharError { #[unstable( feature = "char_error_internals", reason = "this method should not be available publicly", - issue = "0" + issue = "none" )] #[doc(hidden)] pub fn __description(&self) -> &str { diff --git a/src/libcore/char/methods.rs b/src/libcore/char/methods.rs index 5cfb9583a8..c341bb552a 100644 --- a/src/libcore/char/methods.rs +++ b/src/libcore/char/methods.rs @@ -3,7 +3,7 @@ use crate::slice; use crate::str::from_utf8_unchecked_mut; use crate::unicode::printable::is_printable; -use crate::unicode::tables::{conversions, derived_property, general_category, property}; +use crate::unicode::{self, conversions}; use super::*; @@ -434,36 +434,35 @@ impl char { #[inline] pub fn encode_utf8(self, dst: &mut [u8]) -> &mut str { let code = self as u32; - // SAFETY: each arm checks the size of the slice and only uses `get_unchecked` unsafe ops - unsafe { - let len = if code < MAX_ONE_B && !dst.is_empty() { - *dst.get_unchecked_mut(0) = code as u8; - 1 - } else if code < MAX_TWO_B && dst.len() >= 2 { - *dst.get_unchecked_mut(0) = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; - *dst.get_unchecked_mut(1) = (code & 0x3F) as u8 | TAG_CONT; - 2 - } else if code < MAX_THREE_B && dst.len() >= 3 { - *dst.get_unchecked_mut(0) = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; - *dst.get_unchecked_mut(1) = (code >> 6 & 0x3F) as u8 | TAG_CONT; - *dst.get_unchecked_mut(2) = (code & 0x3F) as u8 | TAG_CONT; - 3 - } else if dst.len() >= 4 { - *dst.get_unchecked_mut(0) = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; - *dst.get_unchecked_mut(1) = (code >> 12 & 0x3F) as u8 | TAG_CONT; - *dst.get_unchecked_mut(2) = (code >> 6 & 0x3F) as u8 | TAG_CONT; - *dst.get_unchecked_mut(3) = (code & 0x3F) as u8 | TAG_CONT; - 4 - } else { - panic!( - "encode_utf8: need {} bytes to encode U+{:X}, but the buffer has {}", - from_u32_unchecked(code).len_utf8(), - code, - dst.len(), - ) - }; - from_utf8_unchecked_mut(dst.get_unchecked_mut(..len)) - } + let len = self.len_utf8(); + match (len, &mut dst[..]) { + (1, [a, ..]) => { + *a = code as u8; + } + (2, [a, b, ..]) => { + *a = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; + *b = (code & 0x3F) as u8 | TAG_CONT; + } + (3, [a, b, c, ..]) => { + *a = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; + *b = (code >> 6 & 0x3F) as u8 | TAG_CONT; + *c = (code & 0x3F) as u8 | TAG_CONT; + } + (4, [a, b, c, d, ..]) => { + *a = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; + *b = (code >> 12 & 0x3F) as u8 | TAG_CONT; + *c = (code >> 6 & 0x3F) as u8 | TAG_CONT; + *d = (code & 0x3F) as u8 | TAG_CONT; + } + _ => panic!( + "encode_utf8: need {} bytes to encode U+{:X}, but the buffer has {}", + len, + code, + dst.len(), + ), + }; + // SAFETY: We just wrote UTF-8 content in, so converting to str is fine. + unsafe { from_utf8_unchecked_mut(&mut dst[..len]) } } /// Encodes this character as UTF-16 into the provided `u16` buffer, @@ -553,7 +552,7 @@ impl char { pub fn is_alphabetic(self) -> bool { match self { 'a'..='z' | 'A'..='Z' => true, - c => c > '\x7f' && derived_property::Alphabetic(c), + c => c > '\x7f' && unicode::Alphabetic(c), } } @@ -584,7 +583,7 @@ impl char { pub fn is_lowercase(self) -> bool { match self { 'a'..='z' => true, - c => c > '\x7f' && derived_property::Lowercase(c), + c => c > '\x7f' && unicode::Lowercase(c), } } @@ -615,7 +614,7 @@ impl char { pub fn is_uppercase(self) -> bool { match self { 'A'..='Z' => true, - c => c > '\x7f' && derived_property::Uppercase(c), + c => c > '\x7f' && unicode::Uppercase(c), } } @@ -643,7 +642,7 @@ impl char { pub fn is_whitespace(self) -> bool { match self { ' ' | '\x09'..='\x0d' => true, - c => c > '\x7f' && property::White_Space(c), + c => c > '\x7f' && unicode::White_Space(c), } } @@ -694,7 +693,7 @@ impl char { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn is_control(self) -> bool { - general_category::Cc(self) + unicode::Cc(self) } /// Returns `true` if this `char` has the `Grapheme_Extend` property. @@ -708,7 +707,7 @@ impl char { /// [`DerivedCoreProperties.txt`]: https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt #[inline] pub(crate) fn is_grapheme_extended(self) -> bool { - derived_property::Grapheme_Extend(self) + unicode::Grapheme_Extend(self) } /// Returns `true` if this `char` has one of the general categories for numbers. @@ -740,7 +739,7 @@ impl char { pub fn is_numeric(self) -> bool { match self { '0'..='9' => true, - c => c > '\x7f' && general_category::N(c), + c => c > '\x7f' && unicode::N(c), } } @@ -911,10 +910,7 @@ impl char { /// assert!(!non_ascii.is_ascii()); /// ``` #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.32.0")] #[inline] pub const fn is_ascii(&self) -> bool { *self as u32 <= 0x7F diff --git a/src/libcore/char/mod.rs b/src/libcore/char/mod.rs index a655ee6e7e..cf5576e549 100644 --- a/src/libcore/char/mod.rs +++ b/src/libcore/char/mod.rs @@ -37,9 +37,9 @@ pub use self::decode::{decode_utf16, DecodeUtf16, DecodeUtf16Error}; // unstable re-exports #[unstable(feature = "unicode_version", issue = "49726")] -pub use crate::unicode::tables::UNICODE_VERSION; -#[unstable(feature = "unicode_version", issue = "49726")] pub use crate::unicode::version::UnicodeVersion; +#[unstable(feature = "unicode_version", issue = "49726")] +pub use crate::unicode::UNICODE_VERSION; use crate::fmt::{self, Write}; use crate::iter::FusedIterator; diff --git a/src/libcore/clone.rs b/src/libcore/clone.rs index 18f808638d..9a412e5729 100644 --- a/src/libcore/clone.rs +++ b/src/libcore/clone.rs @@ -150,7 +150,7 @@ pub macro Clone($item:item) { #[unstable( feature = "derive_clone_copy", reason = "deriving hack, should not be public", - issue = "0" + issue = "none" )] pub struct AssertParamIsClone { _field: crate::marker::PhantomData, @@ -160,7 +160,7 @@ pub struct AssertParamIsClone { #[unstable( feature = "derive_clone_copy", reason = "deriving hack, should not be public", - issue = "0" + issue = "none" )] pub struct AssertParamIsCopy { _field: crate::marker::PhantomData, diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs index 4aa52a7a39..3ea4baa57b 100644 --- a/src/libcore/cmp.rs +++ b/src/libcore/cmp.rs @@ -195,8 +195,8 @@ use self::Ordering::*; #[doc(alias = "==")] #[doc(alias = "!=")] #[rustc_on_unimplemented( - message="can't compare `{Self}` with `{Rhs}`", - label="no implementation for `{Self} == {Rhs}`", + message = "can't compare `{Self}` with `{Rhs}`", + label = "no implementation for `{Self} == {Rhs}`" )] pub trait PartialEq { /// This method tests for `self` and `other` values to be equal, and is used @@ -209,14 +209,18 @@ pub trait PartialEq { #[inline] #[must_use] #[stable(feature = "rust1", since = "1.0.0")] - fn ne(&self, other: &Rhs) -> bool { !self.eq(other) } + fn ne(&self, other: &Rhs) -> bool { + !self.eq(other) + } } /// Derive macro generating an impl of the trait `PartialEq`. #[rustc_builtin_macro] #[stable(feature = "builtin_macro_prelude", since = "1.38.0")] #[allow_internal_unstable(core_intrinsics, structural_match)] -pub macro PartialEq($item:item) { /* compiler built-in */ } +pub macro PartialEq($item:item) { + /* compiler built-in */ +} /// Trait for equality comparisons which are [equivalence relations]( /// https://en.wikipedia.org/wiki/Equivalence_relation). @@ -278,7 +282,9 @@ pub trait Eq: PartialEq { #[rustc_builtin_macro] #[stable(feature = "builtin_macro_prelude", since = "1.38.0")] #[allow_internal_unstable(core_intrinsics, derive_eq, structural_match)] -pub macro Eq($item:item) { /* compiler built-in */ } +pub macro Eq($item:item) { + /* compiler built-in */ +} // FIXME: this struct is used solely by #[derive] to // assert that every component of a type implements Eq. @@ -286,10 +292,10 @@ pub macro Eq($item:item) { /* compiler built-in */ } // This struct should never appear in user code. #[doc(hidden)] #[allow(missing_debug_implementations)] -#[unstable(feature = "derive_eq", - reason = "deriving hack, should not be public", - issue = "0")] -pub struct AssertParamIsEq { _field: crate::marker::PhantomData } +#[unstable(feature = "derive_eq", reason = "deriving hack, should not be public", issue = "none")] +pub struct AssertParamIsEq { + _field: crate::marker::PhantomData, +} /// An `Ordering` is the result of a comparison between two values. /// @@ -460,13 +466,21 @@ impl PartialOrd for Reverse { } #[inline] - fn lt(&self, other: &Self) -> bool { other.0 < self.0 } + fn lt(&self, other: &Self) -> bool { + other.0 < self.0 + } #[inline] - fn le(&self, other: &Self) -> bool { other.0 <= self.0 } + fn le(&self, other: &Self) -> bool { + other.0 <= self.0 + } #[inline] - fn gt(&self, other: &Self) -> bool { other.0 > self.0 } + fn gt(&self, other: &Self) -> bool { + other.0 > self.0 + } #[inline] - fn ge(&self, other: &Self) -> bool { other.0 >= self.0 } + fn ge(&self, other: &Self) -> bool { + other.0 >= self.0 + } } #[stable(feature = "reverse_cmp_key", since = "1.19.0")] @@ -481,7 +495,7 @@ impl Ord for Reverse { /// /// An order is a total order if it is (for all `a`, `b` and `c`): /// -/// - total and antisymmetric: exactly one of `a < b`, `a == b` or `a > b` is true; and +/// - total and asymmetric: exactly one of `a < b`, `a == b` or `a > b` is true; and /// - transitive, `a < b` and `b < c` implies `a < c`. The same must hold for both `==` and `>`. /// /// ## Derivable @@ -570,7 +584,9 @@ pub trait Ord: Eq + PartialOrd { #[stable(feature = "ord_max_min", since = "1.21.0")] #[inline] fn max(self, other: Self) -> Self - where Self: Sized { + where + Self: Sized, + { max_by(self, other, Ord::cmp) } @@ -587,7 +603,9 @@ pub trait Ord: Eq + PartialOrd { #[stable(feature = "ord_max_min", since = "1.21.0")] #[inline] fn min(self, other: Self) -> Self - where Self: Sized { + where + Self: Sized, + { min_by(self, other, Ord::cmp) } @@ -611,7 +629,9 @@ pub trait Ord: Eq + PartialOrd { /// ``` #[unstable(feature = "clamp", issue = "44095")] fn clamp(self, min: Self, max: Self) -> Self - where Self: Sized { + where + Self: Sized, + { assert!(min <= max); if self < min { min @@ -627,7 +647,9 @@ pub trait Ord: Eq + PartialOrd { #[rustc_builtin_macro] #[stable(feature = "builtin_macro_prelude", since = "1.38.0")] #[allow_internal_unstable(core_intrinsics)] -pub macro Ord($item:item) { /* compiler built-in */ } +pub macro Ord($item:item) { + /* compiler built-in */ +} #[stable(feature = "rust1", since = "1.0.0")] impl Eq for Ordering {} @@ -652,7 +674,7 @@ impl PartialOrd for Ordering { /// /// The comparison must satisfy, for all `a`, `b` and `c`: /// -/// - antisymmetry: if `a < b` then `!(a > b)`, as well as `a > b` implying `!(a < b)`; and +/// - asymmetry: if `a < b` then `!(a > b)`, as well as `a > b` implying `!(a < b)`; and /// - transitivity: `a < b` and `b < c` implies `a < c`. The same must hold for both `==` and `>`. /// /// Note that these requirements mean that the trait itself must be implemented symmetrically and @@ -753,8 +775,8 @@ impl PartialOrd for Ordering { #[doc(alias = "<=")] #[doc(alias = ">=")] #[rustc_on_unimplemented( - message="can't compare `{Self}` with `{Rhs}`", - label="no implementation for `{Self} < {Rhs}` and `{Self} > {Rhs}`", + message = "can't compare `{Self}` with `{Rhs}`", + label = "no implementation for `{Self} < {Rhs}` and `{Self} > {Rhs}`" )] pub trait PartialOrd: PartialEq { /// This method returns an ordering between `self` and `other` values if one exists. @@ -799,10 +821,7 @@ pub trait PartialOrd: PartialEq { #[must_use] #[stable(feature = "rust1", since = "1.0.0")] fn lt(&self, other: &Rhs) -> bool { - match self.partial_cmp(other) { - Some(Less) => true, - _ => false, - } + matches!(self.partial_cmp(other), Some(Less)) } /// This method tests less than or equal to (for `self` and `other`) and is used by the `<=` @@ -821,10 +840,7 @@ pub trait PartialOrd: PartialEq { #[must_use] #[stable(feature = "rust1", since = "1.0.0")] fn le(&self, other: &Rhs) -> bool { - match self.partial_cmp(other) { - Some(Less) | Some(Equal) => true, - _ => false, - } + matches!(self.partial_cmp(other), Some(Less) | Some(Equal)) } /// This method tests greater than (for `self` and `other`) and is used by the `>` operator. @@ -842,10 +858,7 @@ pub trait PartialOrd: PartialEq { #[must_use] #[stable(feature = "rust1", since = "1.0.0")] fn gt(&self, other: &Rhs) -> bool { - match self.partial_cmp(other) { - Some(Greater) => true, - _ => false, - } + matches!(self.partial_cmp(other), Some(Greater)) } /// This method tests greater than or equal to (for `self` and `other`) and is used by the `>=` @@ -864,10 +877,7 @@ pub trait PartialOrd: PartialEq { #[must_use] #[stable(feature = "rust1", since = "1.0.0")] fn ge(&self, other: &Rhs) -> bool { - match self.partial_cmp(other) { - Some(Greater) | Some(Equal) => true, - _ => false, - } + matches!(self.partial_cmp(other), Some(Greater) | Some(Equal)) } } @@ -875,7 +885,9 @@ pub trait PartialOrd: PartialEq { #[rustc_builtin_macro] #[stable(feature = "builtin_macro_prelude", since = "1.38.0")] #[allow_internal_unstable(core_intrinsics)] -pub macro PartialOrd($item:item) { /* compiler built-in */ } +pub macro PartialOrd($item:item) { + /* compiler built-in */ +} /// Compares and returns the minimum of two values. /// @@ -1005,8 +1017,8 @@ pub fn max_by_key K, K: Ord>(v1: T, v2: T, mut f: F) -> T { // Implementation of PartialEq, Eq, PartialOrd and Ord for primitive types mod impls { + use crate::cmp::Ordering::{self, Equal, Greater, Less}; use crate::hint::unreachable_unchecked; - use crate::cmp::Ordering::{self, Less, Greater, Equal}; macro_rules! partial_eq_impl { ($($t:ty)*) => ($( @@ -1023,9 +1035,13 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl PartialEq for () { #[inline] - fn eq(&self, _other: &()) -> bool { true } + fn eq(&self, _other: &()) -> bool { + true + } #[inline] - fn ne(&self, _other: &()) -> bool { false } + fn ne(&self, _other: &()) -> bool { + false + } } partial_eq_impl! { @@ -1119,7 +1135,9 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl Ord for () { #[inline] - fn cmp(&self, _other: &()) -> Ordering { Equal } + fn cmp(&self, _other: &()) -> Ordering { + Equal + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -1168,31 +1186,54 @@ mod impls { // & pointers #[stable(feature = "rust1", since = "1.0.0")] - impl PartialEq<&B> for &A where A: PartialEq { + impl PartialEq<&B> for &A + where + A: PartialEq, + { #[inline] - fn eq(&self, other: & &B) -> bool { PartialEq::eq(*self, *other) } + fn eq(&self, other: &&B) -> bool { + PartialEq::eq(*self, *other) + } #[inline] - fn ne(&self, other: & &B) -> bool { PartialEq::ne(*self, *other) } + fn ne(&self, other: &&B) -> bool { + PartialEq::ne(*self, *other) + } } #[stable(feature = "rust1", since = "1.0.0")] - impl PartialOrd<&B> for &A where A: PartialOrd { + impl PartialOrd<&B> for &A + where + A: PartialOrd, + { #[inline] fn partial_cmp(&self, other: &&B) -> Option { PartialOrd::partial_cmp(*self, *other) } #[inline] - fn lt(&self, other: & &B) -> bool { PartialOrd::lt(*self, *other) } + fn lt(&self, other: &&B) -> bool { + PartialOrd::lt(*self, *other) + } #[inline] - fn le(&self, other: & &B) -> bool { PartialOrd::le(*self, *other) } + fn le(&self, other: &&B) -> bool { + PartialOrd::le(*self, *other) + } #[inline] - fn gt(&self, other: & &B) -> bool { PartialOrd::gt(*self, *other) } + fn gt(&self, other: &&B) -> bool { + PartialOrd::gt(*self, *other) + } #[inline] - fn ge(&self, other: & &B) -> bool { PartialOrd::ge(*self, *other) } + fn ge(&self, other: &&B) -> bool { + PartialOrd::ge(*self, *other) + } } #[stable(feature = "rust1", since = "1.0.0")] - impl Ord for &A where A: Ord { + impl Ord for &A + where + A: Ord, + { #[inline] - fn cmp(&self, other: &Self) -> Ordering { Ord::cmp(*self, *other) } + fn cmp(&self, other: &Self) -> Ordering { + Ord::cmp(*self, *other) + } } #[stable(feature = "rust1", since = "1.0.0")] impl Eq for &A where A: Eq {} @@ -1200,48 +1241,85 @@ mod impls { // &mut pointers #[stable(feature = "rust1", since = "1.0.0")] - impl PartialEq<&mut B> for &mut A where A: PartialEq { + impl PartialEq<&mut B> for &mut A + where + A: PartialEq, + { #[inline] - fn eq(&self, other: &&mut B) -> bool { PartialEq::eq(*self, *other) } + fn eq(&self, other: &&mut B) -> bool { + PartialEq::eq(*self, *other) + } #[inline] - fn ne(&self, other: &&mut B) -> bool { PartialEq::ne(*self, *other) } + fn ne(&self, other: &&mut B) -> bool { + PartialEq::ne(*self, *other) + } } #[stable(feature = "rust1", since = "1.0.0")] - impl PartialOrd<&mut B> for &mut A where A: PartialOrd { + impl PartialOrd<&mut B> for &mut A + where + A: PartialOrd, + { #[inline] fn partial_cmp(&self, other: &&mut B) -> Option { PartialOrd::partial_cmp(*self, *other) } #[inline] - fn lt(&self, other: &&mut B) -> bool { PartialOrd::lt(*self, *other) } + fn lt(&self, other: &&mut B) -> bool { + PartialOrd::lt(*self, *other) + } #[inline] - fn le(&self, other: &&mut B) -> bool { PartialOrd::le(*self, *other) } + fn le(&self, other: &&mut B) -> bool { + PartialOrd::le(*self, *other) + } #[inline] - fn gt(&self, other: &&mut B) -> bool { PartialOrd::gt(*self, *other) } + fn gt(&self, other: &&mut B) -> bool { + PartialOrd::gt(*self, *other) + } #[inline] - fn ge(&self, other: &&mut B) -> bool { PartialOrd::ge(*self, *other) } + fn ge(&self, other: &&mut B) -> bool { + PartialOrd::ge(*self, *other) + } } #[stable(feature = "rust1", since = "1.0.0")] - impl Ord for &mut A where A: Ord { + impl Ord for &mut A + where + A: Ord, + { #[inline] - fn cmp(&self, other: &Self) -> Ordering { Ord::cmp(*self, *other) } + fn cmp(&self, other: &Self) -> Ordering { + Ord::cmp(*self, *other) + } } #[stable(feature = "rust1", since = "1.0.0")] impl Eq for &mut A where A: Eq {} #[stable(feature = "rust1", since = "1.0.0")] - impl PartialEq<&mut B> for &A where A: PartialEq { + impl PartialEq<&mut B> for &A + where + A: PartialEq, + { #[inline] - fn eq(&self, other: &&mut B) -> bool { PartialEq::eq(*self, *other) } + fn eq(&self, other: &&mut B) -> bool { + PartialEq::eq(*self, *other) + } #[inline] - fn ne(&self, other: &&mut B) -> bool { PartialEq::ne(*self, *other) } + fn ne(&self, other: &&mut B) -> bool { + PartialEq::ne(*self, *other) + } } #[stable(feature = "rust1", since = "1.0.0")] - impl PartialEq<&B> for &mut A where A: PartialEq { + impl PartialEq<&B> for &mut A + where + A: PartialEq, + { #[inline] - fn eq(&self, other: &&B) -> bool { PartialEq::eq(*self, *other) } + fn eq(&self, other: &&B) -> bool { + PartialEq::eq(*self, *other) + } #[inline] - fn ne(&self, other: &&B) -> bool { PartialEq::ne(*self, *other) } + fn ne(&self, other: &&B) -> bool { + PartialEq::ne(*self, *other) + } } } diff --git a/src/libcore/convert/mod.rs b/src/libcore/convert/mod.rs index e5599f1dd3..959fd63df5 100644 --- a/src/libcore/convert/mod.rs +++ b/src/libcore/convert/mod.rs @@ -101,7 +101,7 @@ pub use num::FloatToInt; /// assert_eq!(vec![1, 3], filtered); /// ``` #[stable(feature = "convert_id", since = "1.33.0")] -#[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_identity", since = "1.33.0"))] +#[rustc_const_stable(feature = "const_identity", since = "1.33.0")] #[inline] pub const fn identity(x: T) -> T { x diff --git a/src/libcore/convert/num.rs b/src/libcore/convert/num.rs index 6f5ee756f5..752199c94b 100644 --- a/src/libcore/convert/num.rs +++ b/src/libcore/convert/num.rs @@ -13,7 +13,6 @@ mod private { /// Typically doesn’t need to be used directly. #[unstable(feature = "convert_float_to_int", issue = "67057")] pub trait FloatToInt: private::Sealed + Sized { - #[cfg(not(bootstrap))] #[unstable(feature = "float_approx_unchecked_to", issue = "67058")] #[doc(hidden)] unsafe fn approx_unchecked(self) -> Int; @@ -26,7 +25,6 @@ macro_rules! impl_float_to_int { $( #[unstable(feature = "convert_float_to_int", issue = "67057")] impl FloatToInt<$Int> for $Float { - #[cfg(not(bootstrap))] #[doc(hidden)] #[inline] unsafe fn approx_unchecked(self) -> $Int { @@ -49,8 +47,8 @@ macro_rules! impl_from { #[doc = $doc] impl From<$Small> for $Large { #[inline] - fn from(small: $Small) -> $Large { - small as $Large + fn from(small: $Small) -> Self { + small as Self } } }; @@ -179,7 +177,7 @@ macro_rules! try_from_unbounded { /// is outside of the range of the target type. #[inline] fn try_from(value: $source) -> Result { - Ok(value as $target) + Ok(value as Self) } } )*} @@ -196,9 +194,9 @@ macro_rules! try_from_lower_bounded { /// number type. This returns an error if the source value /// is outside of the range of the target type. #[inline] - fn try_from(u: $source) -> Result<$target, TryFromIntError> { + fn try_from(u: $source) -> Result { if u >= 0 { - Ok(u as $target) + Ok(u as Self) } else { Err(TryFromIntError(())) } @@ -218,11 +216,11 @@ macro_rules! try_from_upper_bounded { /// number type. This returns an error if the source value /// is outside of the range of the target type. #[inline] - fn try_from(u: $source) -> Result<$target, TryFromIntError> { - if u > (<$target>::max_value() as $source) { + fn try_from(u: $source) -> Result { + if u > (Self::max_value() as $source) { Err(TryFromIntError(())) } else { - Ok(u as $target) + Ok(u as Self) } } } @@ -240,13 +238,13 @@ macro_rules! try_from_both_bounded { /// number type. This returns an error if the source value /// is outside of the range of the target type. #[inline] - fn try_from(u: $source) -> Result<$target, TryFromIntError> { - let min = <$target>::min_value() as $source; - let max = <$target>::max_value() as $source; + fn try_from(u: $source) -> Result { + let min = Self::min_value() as $source; + let max = Self::max_value() as $source; if u < min || u > max { Err(TryFromIntError(())) } else { - Ok(u as $target) + Ok(u as Self) } } } @@ -387,10 +385,10 @@ macro_rules! nzint_impl_from { #[doc = $doc] impl From<$Small> for $Large { #[inline] - fn from(small: $Small) -> $Large { + fn from(small: $Small) -> Self { // SAFETY: input type guarantees the value is non-zero unsafe { - <$Large>::new_unchecked(small.get().into()) + Self::new_unchecked(small.get().into()) } } } diff --git a/src/libcore/ffi.rs b/src/libcore/ffi.rs index 74ec24939a..6277da4f12 100644 --- a/src/libcore/ffi.rs +++ b/src/libcore/ffi.rs @@ -38,14 +38,14 @@ pub enum c_void { #[unstable( feature = "c_void_variant", reason = "temporary implementation detail", - issue = "0" + issue = "none" )] #[doc(hidden)] __variant1, #[unstable( feature = "c_void_variant", reason = "temporary implementation detail", - issue = "0" + issue = "none" )] #[doc(hidden)] __variant2, diff --git a/src/libcore/fmt/builders.rs b/src/libcore/fmt/builders.rs index e6e3454b36..63866a5d11 100644 --- a/src/libcore/fmt/builders.rs +++ b/src/libcore/fmt/builders.rs @@ -11,21 +11,18 @@ struct PadAdapterState { impl Default for PadAdapterState { fn default() -> Self { - PadAdapterState { - on_newline: true, - } + PadAdapterState { on_newline: true } } } impl<'buf, 'state> PadAdapter<'buf, 'state> { - fn wrap<'slot, 'fmt: 'buf+'slot>(fmt: &'fmt mut fmt::Formatter<'_>, - slot: &'slot mut Option, - state: &'state mut PadAdapterState) -> fmt::Formatter<'slot> { + fn wrap<'slot, 'fmt: 'buf + 'slot>( + fmt: &'fmt mut fmt::Formatter<'_>, + slot: &'slot mut Option, + state: &'state mut PadAdapterState, + ) -> fmt::Formatter<'slot> { fmt.wrap_buf(move |buf| { - *slot = Some(PadAdapter { - buf, - state, - }); + *slot = Some(PadAdapter { buf, state }); slot.as_mut().unwrap() }) } @@ -98,15 +95,12 @@ pub struct DebugStruct<'a, 'b: 'a> { has_fields: bool, } -pub(super) fn debug_struct_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>, - name: &str) - -> DebugStruct<'a, 'b> { +pub(super) fn debug_struct_new<'a, 'b>( + fmt: &'a mut fmt::Formatter<'b>, + name: &str, +) -> DebugStruct<'a, 'b> { let result = fmt.write_str(name); - DebugStruct { - fmt, - result, - has_fields: false, - } + DebugStruct { fmt, result, has_fields: false } } impl<'a, 'b: 'a> DebugStruct<'a, 'b> { @@ -139,7 +133,7 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> { /// ); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] - pub fn field(&mut self, name: &str, value: &dyn fmt::Debug) -> &mut DebugStruct<'a, 'b> { + pub fn field(&mut self, name: &str, value: &dyn fmt::Debug) -> &mut Self { self.result = self.result.and_then(|_| { if self.is_pretty() { if !self.has_fields { @@ -165,6 +159,62 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> { self } + /// Marks the struct as non-exhaustive, indicating to the reader that there are some other + /// fields that are not shown in the debug representation. + /// + /// # Examples + /// + /// ``` + /// # #![feature(debug_non_exhaustive)] + /// use std::fmt; + /// + /// struct Bar { + /// bar: i32, + /// hidden: f32, + /// } + /// + /// impl fmt::Debug for Bar { + /// fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + /// fmt.debug_struct("Bar") + /// .field("bar", &self.bar) + /// .finish_non_exhaustive() // Show that some other field(s) exist. + /// } + /// } + /// + /// assert_eq!( + /// format!("{:?}", Bar { bar: 10, hidden: 1.0 }), + /// "Bar { bar: 10, .. }", + /// ); + /// ``` + #[unstable(feature = "debug_non_exhaustive", issue = "67364")] + pub fn finish_non_exhaustive(&mut self) -> fmt::Result { + self.result = self.result.and_then(|_| { + // Draw non-exhaustive dots (`..`), and open brace if necessary (no fields). + if self.is_pretty() { + if !self.has_fields { + self.fmt.write_str(" {\n")?; + } + let mut slot = None; + let mut state = Default::default(); + let mut writer = PadAdapter::wrap(&mut self.fmt, &mut slot, &mut state); + writer.write_str("..\n")?; + } else { + if self.has_fields { + self.fmt.write_str(", ..")?; + } else { + self.fmt.write_str(" { ..")?; + } + } + if self.is_pretty() { + self.fmt.write_str("}")? + } else { + self.fmt.write_str(" }")?; + } + Ok(()) + }); + self.result + } + /// Finishes output and returns any error encountered. /// /// # Examples @@ -196,11 +246,7 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> { pub fn finish(&mut self) -> fmt::Result { if self.has_fields { self.result = self.result.and_then(|_| { - if self.is_pretty() { - self.fmt.write_str("}") - } else { - self.fmt.write_str(" }") - } + if self.is_pretty() { self.fmt.write_str("}") } else { self.fmt.write_str(" }") } }); } self.result @@ -256,12 +302,7 @@ pub(super) fn debug_tuple_new<'a, 'b>( name: &str, ) -> DebugTuple<'a, 'b> { let result = fmt.write_str(name); - DebugTuple { - fmt, - result, - fields: 0, - empty_name: name.is_empty(), - } + DebugTuple { fmt, result, fields: 0, empty_name: name.is_empty() } } impl<'a, 'b: 'a> DebugTuple<'a, 'b> { @@ -289,7 +330,7 @@ impl<'a, 'b: 'a> DebugTuple<'a, 'b> { /// ); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] - pub fn field(&mut self, value: &dyn fmt::Debug) -> &mut DebugTuple<'a, 'b> { + pub fn field(&mut self, value: &dyn fmt::Debug) -> &mut Self { self.result = self.result.and_then(|_| { if self.is_pretty() { if self.fields == 0 { @@ -423,13 +464,7 @@ pub struct DebugSet<'a, 'b: 'a> { pub(super) fn debug_set_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>) -> DebugSet<'a, 'b> { let result = fmt.write_str("{"); - DebugSet { - inner: DebugInner { - fmt, - result, - has_fields: false, - }, - } + DebugSet { inner: DebugInner { fmt, result, has_fields: false } } } impl<'a, 'b: 'a> DebugSet<'a, 'b> { @@ -457,7 +492,7 @@ impl<'a, 'b: 'a> DebugSet<'a, 'b> { /// ); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] - pub fn entry(&mut self, entry: &dyn fmt::Debug) -> &mut DebugSet<'a, 'b> { + pub fn entry(&mut self, entry: &dyn fmt::Debug) -> &mut Self { self.inner.entry(entry); self } @@ -486,9 +521,10 @@ impl<'a, 'b: 'a> DebugSet<'a, 'b> { /// ); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] - pub fn entries(&mut self, entries: I) -> &mut DebugSet<'a, 'b> - where D: fmt::Debug, - I: IntoIterator + pub fn entries(&mut self, entries: I) -> &mut Self + where + D: fmt::Debug, + I: IntoIterator, { for entry in entries { self.entry(&entry); @@ -560,13 +596,7 @@ pub struct DebugList<'a, 'b: 'a> { pub(super) fn debug_list_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>) -> DebugList<'a, 'b> { let result = fmt.write_str("["); - DebugList { - inner: DebugInner { - fmt, - result, - has_fields: false, - }, - } + DebugList { inner: DebugInner { fmt, result, has_fields: false } } } impl<'a, 'b: 'a> DebugList<'a, 'b> { @@ -594,7 +624,7 @@ impl<'a, 'b: 'a> DebugList<'a, 'b> { /// ); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] - pub fn entry(&mut self, entry: &dyn fmt::Debug) -> &mut DebugList<'a, 'b> { + pub fn entry(&mut self, entry: &dyn fmt::Debug) -> &mut Self { self.inner.entry(entry); self } @@ -623,9 +653,10 @@ impl<'a, 'b: 'a> DebugList<'a, 'b> { /// ); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] - pub fn entries(&mut self, entries: I) -> &mut DebugList<'a, 'b> - where D: fmt::Debug, - I: IntoIterator + pub fn entries(&mut self, entries: I) -> &mut Self + where + D: fmt::Debug, + I: IntoIterator, { for entry in entries { self.entry(&entry); @@ -702,13 +733,7 @@ pub struct DebugMap<'a, 'b: 'a> { pub(super) fn debug_map_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>) -> DebugMap<'a, 'b> { let result = fmt.write_str("{"); - DebugMap { - fmt, - result, - has_fields: false, - has_key: false, - state: Default::default(), - } + DebugMap { fmt, result, has_fields: false, has_key: false, state: Default::default() } } impl<'a, 'b: 'a> DebugMap<'a, 'b> { @@ -735,7 +760,7 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> { /// ); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] - pub fn entry(&mut self, key: &dyn fmt::Debug, value: &dyn fmt::Debug) -> &mut DebugMap<'a, 'b> { + pub fn entry(&mut self, key: &dyn fmt::Debug, value: &dyn fmt::Debug) -> &mut Self { self.key(key).value(value) } @@ -753,7 +778,6 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> { /// # Examples /// /// ``` - /// # #![feature(debug_map_key_value)] /// use std::fmt; /// /// struct Foo(Vec<(String, i32)>); @@ -771,13 +795,14 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> { /// "{\"whole\": [(\"A\", 10), (\"B\", 11)]}", /// ); /// ``` - #[unstable(feature = "debug_map_key_value", - reason = "recently added", - issue = "62482")] - pub fn key(&mut self, key: &dyn fmt::Debug) -> &mut DebugMap<'a, 'b> { + #[stable(feature = "debug_map_key_value", since = "1.42.0")] + pub fn key(&mut self, key: &dyn fmt::Debug) -> &mut Self { self.result = self.result.and_then(|_| { - assert!(!self.has_key, "attempted to begin a new map entry \ - without completing the previous one"); + assert!( + !self.has_key, + "attempted to begin a new map entry \ + without completing the previous one" + ); if self.is_pretty() { if !self.has_fields { @@ -817,7 +842,6 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> { /// # Examples /// /// ``` - /// # #![feature(debug_map_key_value)] /// use std::fmt; /// /// struct Foo(Vec<(String, i32)>); @@ -835,10 +859,8 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> { /// "{\"whole\": [(\"A\", 10), (\"B\", 11)]}", /// ); /// ``` - #[unstable(feature = "debug_map_key_value", - reason = "recently added", - issue = "62482")] - pub fn value(&mut self, value: &dyn fmt::Debug) -> &mut DebugMap<'a, 'b> { + #[stable(feature = "debug_map_key_value", since = "1.42.0")] + pub fn value(&mut self, value: &dyn fmt::Debug) -> &mut Self { self.result = self.result.and_then(|_| { assert!(self.has_key, "attempted to format a map value before its key"); @@ -884,10 +906,11 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> { /// ); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] - pub fn entries(&mut self, entries: I) -> &mut DebugMap<'a, 'b> - where K: fmt::Debug, - V: fmt::Debug, - I: IntoIterator + pub fn entries(&mut self, entries: I) -> &mut Self + where + K: fmt::Debug, + V: fmt::Debug, + I: IntoIterator, { for (k, v) in entries { self.entry(&k, &v); diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index 223f91d909..900ef63f1d 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -10,7 +10,6 @@ use crate::mem; use crate::num::flt2dec; use crate::ops::Deref; use crate::result; -use crate::slice; use crate::str; mod builders; @@ -35,7 +34,7 @@ pub enum Alignment { #[stable(feature = "debug_builders", since = "1.2.0")] pub use self::builders::{DebugList, DebugMap, DebugSet, DebugStruct, DebugTuple}; -#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] +#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] #[doc(hidden)] pub mod rt { pub mod v1; @@ -63,7 +62,7 @@ pub mod rt { /// /// let pythagorean_triple = Triangle { a: 3.0, b: 4.0, c: 5.0 }; /// -/// println!("{}", pythagorean_triple); +/// assert_eq!(format!("{}", pythagorean_triple), "(3, 4, 5)"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub type Result = result::Result<(), Error>; @@ -234,8 +233,6 @@ pub struct Formatter<'a> { precision: Option, buf: &'a mut (dyn Write + 'a), - curarg: slice::Iter<'a, ArgumentV1<'a>>, - args: &'a [ArgumentV1<'a>], } // NB. Argument is essentially an optimized partially applied formatting function, @@ -259,7 +256,7 @@ struct Void { /// types, and then this struct is used to canonicalize arguments to one type. #[derive(Copy, Clone)] #[allow(missing_debug_implementations)] -#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] +#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] #[doc(hidden)] pub struct ArgumentV1<'a> { value: &'a Void, @@ -273,13 +270,13 @@ impl<'a> ArgumentV1<'a> { } #[doc(hidden)] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn new<'b, T>(x: &'b T, f: fn(&T, &mut Formatter<'_>) -> Result) -> ArgumentV1<'b> { unsafe { ArgumentV1 { formatter: mem::transmute(f), value: mem::transmute(x) } } } #[doc(hidden)] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn from_usize(x: &usize) -> ArgumentV1<'_> { ArgumentV1::new(x, ArgumentV1::show_usize) } @@ -309,7 +306,7 @@ impl<'a> Arguments<'a> { /// Arguments structure. #[doc(hidden)] #[inline] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn new_v1(pieces: &'a [&'a str], args: &'a [ArgumentV1<'a>]) -> Arguments<'a> { Arguments { pieces, fmt: None, args } } @@ -322,7 +319,7 @@ impl<'a> Arguments<'a> { /// unsafety, but will ignore invalid . #[doc(hidden)] #[inline] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn new_v1_formatted( pieces: &'a [&'a str], args: &'a [ArgumentV1<'a>], @@ -337,7 +334,7 @@ impl<'a> Arguments<'a> { /// when using `format!`. Note: this is neither the lower nor upper bound. #[doc(hidden)] #[inline] - #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "0")] + #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] pub fn estimated_capacity(&self) -> usize { let pieces_length: usize = self.pieces.iter().map(|x| x.len()).sum(); @@ -440,7 +437,7 @@ impl Display for Arguments<'_> { /// /// let origin = Point { x: 0, y: 0 }; /// -/// println!("The origin is: {:?}", origin); +/// assert_eq!(format!("The origin is: {:?}", origin), "The origin is: Point { x: 0, y: 0 }"); /// ``` /// /// Manually implementing: @@ -455,28 +452,25 @@ impl Display for Arguments<'_> { /// /// impl fmt::Debug for Point { /// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -/// write!(f, "Point {{ x: {}, y: {} }}", self.x, self.y) +/// f.debug_struct("Point") +/// .field("x", &self.x) +/// .field("y", &self.y) +/// .finish() /// } /// } /// /// let origin = Point { x: 0, y: 0 }; /// -/// println!("The origin is: {:?}", origin); -/// ``` -/// -/// This outputs: -/// -/// ```text -/// The origin is: Point { x: 0, y: 0 } +/// assert_eq!(format!("The origin is: {:?}", origin), "The origin is: Point { x: 0, y: 0 }"); /// ``` /// -/// There are a number of `debug_*` methods on [`Formatter`] to help you with manual -/// implementations, such as [`debug_struct`][debug_struct]. +/// There are a number of helper methods on the [`Formatter`] struct to help you with manual +/// implementations, such as [`debug_struct`]. /// /// `Debug` implementations using either `derive` or the debug builder API /// on [`Formatter`] support pretty-printing using the alternate flag: `{:#?}`. /// -/// [debug_struct]: ../../std/fmt/struct.Formatter.html#method.debug_struct +/// [`debug_struct`]: ../../std/fmt/struct.Formatter.html#method.debug_struct /// [`Formatter`]: ../../std/fmt/struct.Formatter.html /// /// Pretty-printing with `#?`: @@ -490,17 +484,13 @@ impl Display for Arguments<'_> { /// /// let origin = Point { x: 0, y: 0 }; /// -/// println!("The origin is: {:#?}", origin); -/// ``` -/// -/// This outputs: -/// -/// ```text -/// The origin is: Point { +/// assert_eq!(format!("The origin is: {:#?}", origin), +/// "The origin is: Point { /// x: 0, -/// y: 0 -/// } +/// y: 0, +/// }"); /// ``` + #[stable(feature = "rust1", since = "1.0.0")] #[rustc_on_unimplemented( on( @@ -528,12 +518,20 @@ pub trait Debug { /// /// impl fmt::Debug for Position { /// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - /// write!(f, "({:?}, {:?})", self.longitude, self.latitude) + /// f.debug_tuple("") + /// .field(&self.longitude) + /// .field(&self.latitude) + /// .finish() /// } /// } /// - /// assert_eq!("(1.987, 2.983)".to_owned(), - /// format!("{:?}", Position { longitude: 1.987, latitude: 2.983, })); + /// let position = Position { longitude: 1.987, latitude: 2.983 }; + /// assert_eq!(format!("{:?}", position), "(1.987, 2.983)"); + /// + /// assert_eq!(format!("{:#?}", position), "( + /// 1.987, + /// 2.983, + /// )"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] fn fmt(&self, f: &mut Formatter<'_>) -> Result; @@ -584,7 +582,7 @@ pub use macros::Debug; /// /// let origin = Point { x: 0, y: 0 }; /// -/// println!("The origin is: {}", origin); +/// assert_eq!(format!("The origin is: {}", origin), "The origin is: (0, 0)"); /// ``` #[rustc_on_unimplemented( on( @@ -618,7 +616,7 @@ pub trait Display { /// } /// } /// - /// assert_eq!("(1.987, 2.983)".to_owned(), + /// assert_eq!("(1.987, 2.983)", /// format!("{}", Position { longitude: 1.987, latitude: 2.983, })); /// ``` #[stable(feature = "rust1", since = "1.0.0")] @@ -668,7 +666,9 @@ pub trait Display { /// /// let l = Length(9); /// -/// println!("l as octal is: {:o}", l); +/// assert_eq!(format!("l as octal is: {:o}", l), "l as octal is: 11"); +/// +/// assert_eq!(format!("l as octal is: {:#06o}", l), "l as octal is: 0o0011"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub trait Octal { @@ -718,7 +718,12 @@ pub trait Octal { /// /// let l = Length(107); /// -/// println!("l as binary is: {:b}", l); +/// assert_eq!(format!("l as binary is: {:b}", l), "l as binary is: 1101011"); +/// +/// assert_eq!( +/// format!("l as binary is: {:#032b}", l), +/// "l as binary is: 0b000000000000000000000001101011" +/// ); /// ``` /// /// [module]: ../../std/fmt/index.html @@ -777,7 +782,9 @@ pub trait Binary { /// /// let l = Length(9); /// -/// println!("l as hex is: {:x}", l); +/// assert_eq!(format!("l as hex is: {:x}", l), "l as hex is: 9"); +/// +/// assert_eq!(format!("l as hex is: {:#010x}", l), "l as hex is: 0x00000009"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub trait LowerHex { @@ -828,9 +835,11 @@ pub trait LowerHex { /// } /// } /// -/// let l = Length(9); +/// let l = Length(i32::max_value()); /// -/// println!("l as hex is: {:X}", l); +/// assert_eq!(format!("l as hex is: {:X}", l), "l as hex is: 7FFFFFFF"); +/// +/// assert_eq!(format!("l as hex is: {:#010X}", l), "l as hex is: 0x7FFFFFFF"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub trait UpperHex { @@ -877,6 +886,10 @@ pub trait UpperHex { /// let l = Length(42); /// /// println!("l is in memory here: {:p}", l); +/// +/// let l_ptr = format!("{:018p}", l); +/// assert_eq!(l_ptr.len(), 18); +/// assert_eq!(&l_ptr[..2], "0x"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub trait Pointer { @@ -912,14 +925,22 @@ pub trait Pointer { /// /// impl fmt::LowerExp for Length { /// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -/// let val = self.0; -/// write!(f, "{}e1", val / 10) +/// let val = f64::from(self.0); +/// fmt::LowerExp::fmt(&val, f) // delegate to f64's implementation /// } /// } /// /// let l = Length(100); /// -/// println!("l in scientific notation is: {:e}", l); +/// assert_eq!( +/// format!("l in scientific notation is: {:e}", l), +/// "l in scientific notation is: 1e2" +/// ); +/// +/// assert_eq!( +/// format!("l in scientific notation is: {:05e}", l), +/// "l in scientific notation is: 001e2" +/// ); /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub trait LowerExp { @@ -955,14 +976,22 @@ pub trait LowerExp { /// /// impl fmt::UpperExp for Length { /// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -/// let val = self.0; -/// write!(f, "{}E1", val / 10) +/// let val = f64::from(self.0); +/// fmt::UpperExp::fmt(&val, f) // delegate to f64's implementation /// } /// } /// /// let l = Length(100); /// -/// println!("l in scientific notation is: {:E}", l); +/// assert_eq!( +/// format!("l in scientific notation is: {:E}", l), +/// "l in scientific notation is: 1E2" +/// ); +/// +/// assert_eq!( +/// format!("l in scientific notation is: {:05E}", l), +/// "l in scientific notation is: 001E2" +/// ); /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub trait UpperExp { @@ -1011,8 +1040,6 @@ pub fn write(output: &mut dyn Write, args: Arguments<'_>) -> Result { buf: output, align: rt::v1::Alignment::Unknown, fill: ' ', - args: args.args, - curarg: args.args.iter(), }; let mut idx = 0; @@ -1031,7 +1058,7 @@ pub fn write(output: &mut dyn Write, args: Arguments<'_>) -> Result { // a string piece. for (arg, piece) in fmt.iter().zip(args.pieces.iter()) { formatter.buf.write_str(*piece)?; - formatter.run(arg)?; + run(&mut formatter, arg, &args.args)?; idx += 1; } } @@ -1045,6 +1072,39 @@ pub fn write(output: &mut dyn Write, args: Arguments<'_>) -> Result { Ok(()) } +fn run(fmt: &mut Formatter<'_>, arg: &rt::v1::Argument, args: &[ArgumentV1<'_>]) -> Result { + fmt.fill = arg.format.fill; + fmt.align = arg.format.align; + fmt.flags = arg.format.flags; + fmt.width = getcount(args, &arg.format.width); + fmt.precision = getcount(args, &arg.format.precision); + + // Extract the correct argument + let value = { + #[cfg(bootstrap)] + { + match arg.position { + rt::v1::Position::At(i) => args[i], + } + } + #[cfg(not(bootstrap))] + { + args[arg.position] + } + }; + + // Then actually do some printing + (value.formatter)(value.value, fmt) +} + +fn getcount(args: &[ArgumentV1<'_>], cnt: &rt::v1::Count) -> Option { + match *cnt { + rt::v1::Count::Is(n) => Some(n), + rt::v1::Count::Implied => None, + rt::v1::Count::Param(i) => args[i].as_usize(), + } +} + /// Padding after the end of something. Returned by `Formatter::padding`. #[must_use = "don't forget to write the post padding"] struct PostPadding { @@ -1082,41 +1142,6 @@ impl<'a> Formatter<'a> { align: self.align, width: self.width, precision: self.precision, - - // These only exist in the struct for the `run` method, - // which won’t be used together with this method. - curarg: self.curarg.clone(), - args: self.args, - } - } - - // First up is the collection of functions used to execute a format string - // at runtime. This consumes all of the compile-time statics generated by - // the format! syntax extension. - fn run(&mut self, arg: &rt::v1::Argument) -> Result { - // Fill in the format parameters into the formatter - self.fill = arg.format.fill; - self.align = arg.format.align; - self.flags = arg.format.flags; - self.width = self.getcount(&arg.format.width); - self.precision = self.getcount(&arg.format.precision); - - // Extract the correct argument - let value = match arg.position { - rt::v1::Position::Next => *self.curarg.next().unwrap(), - rt::v1::Position::At(i) => self.args[i], - }; - - // Then actually do some printing - (value.formatter)(value.value, self) - } - - fn getcount(&mut self, cnt: &rt::v1::Count) -> Option { - match *cnt { - rt::v1::Count::Is(n) => Some(n), - rt::v1::Count::Implied => None, - rt::v1::Count::Param(i) => self.args[i].as_usize(), - rt::v1::Count::NextParam => self.curarg.next()?.as_usize(), } } @@ -1212,12 +1237,15 @@ impl<'a> Formatter<'a> { // The sign and prefix goes before the padding if the fill character // is zero Some(min) if self.sign_aware_zero_pad() => { - self.fill = '0'; - self.align = rt::v1::Alignment::Right; + let old_fill = crate::mem::replace(&mut self.fill, '0'); + let old_align = crate::mem::replace(&mut self.align, rt::v1::Alignment::Right); write_prefix(self, sign, prefix)?; let post_padding = self.padding(min - width, rt::v1::Alignment::Right)?; self.buf.write_str(buf)?; - post_padding.write(self.buf) + post_padding.write(self.buf)?; + self.fill = old_fill; + self.align = old_align; + Ok(()) } // Otherwise, the sign and prefix goes after the padding Some(min) => { @@ -1807,8 +1835,7 @@ impl<'a> Formatter<'a> { /// } /// } /// - /// // prints "[10, 11]" - /// println!("{:?}", Foo(vec![10, 11])); + /// assert_eq!(format!("{:?}", Foo(vec![10, 11])), "[10, 11]"); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] pub fn debug_list<'b>(&'b mut self) -> DebugList<'b, 'a> { @@ -1831,8 +1858,7 @@ impl<'a> Formatter<'a> { /// } /// } /// - /// // prints "{10, 11}" - /// println!("{:?}", Foo(vec![10, 11])); + /// assert_eq!(format!("{:?}", Foo(vec![10, 11])), "{10, 11}"); /// ``` /// /// [`format_args!`]: ../../std/macro.format_args.html @@ -1890,8 +1916,10 @@ impl<'a> Formatter<'a> { /// } /// } /// - /// // prints "{"A": 10, "B": 11}" - /// println!("{:?}", Foo(vec![("A".to_string(), 10), ("B".to_string(), 11)])); + /// assert_eq!( + /// format!("{:?}", Foo(vec![("A".to_string(), 10), ("B".to_string(), 11)])), + /// r#"{"A": 10, "B": 11}"# + /// ); /// ``` #[stable(feature = "debug_builders", since = "1.2.0")] pub fn debug_map<'b>(&'b mut self) -> DebugMap<'b, 'a> { diff --git a/src/libcore/fmt/num.rs b/src/libcore/fmt/num.rs index 3c7aefc090..d562639a65 100644 --- a/src/libcore/fmt/num.rs +++ b/src/libcore/fmt/num.rs @@ -2,17 +2,17 @@ // ignore-tidy-undocumented-unsafe - use crate::fmt; +use crate::mem::MaybeUninit; use crate::ops::{Div, Rem, Sub}; -use crate::str; -use crate::slice; use crate::ptr; -use crate::mem::MaybeUninit; +use crate::slice; +use crate::str; #[doc(hidden)] -trait Int: PartialEq + PartialOrd + Div + Rem + - Sub + Copy { +trait Int: + PartialEq + PartialOrd + Div + Rem + Sub + Copy +{ fn zero() -> Self; fn from_u8(u: u8) -> Self; fn to_u8(&self) -> u8; @@ -24,8 +24,8 @@ trait Int: PartialEq + PartialOrd + Div + Rem + macro_rules! doit { ($($t:ident)*) => ($(impl Int for $t { - fn zero() -> $t { 0 } - fn from_u8(u: u8) -> $t { u as $t } + fn zero() -> Self { 0 } + fn from_u8(u: u8) -> Self { u as Self } fn to_u8(&self) -> u8 { *self as u8 } fn to_u16(&self) -> u16 { *self as u16 } fn to_u32(&self) -> u32 { *self as u32 } @@ -60,33 +60,32 @@ trait GenericRadix { // Accumulate each digit of the number from the least significant // to the most significant figure. for byte in buf.iter_mut().rev() { - let n = x % base; // Get the current place value. - x = x / base; // Deaccumulate the number. + let n = x % base; // Get the current place value. + x = x / base; // Deaccumulate the number. byte.write(Self::digit(n.to_u8())); // Store the digit in the buffer. curr -= 1; if x == zero { // No more digits left to accumulate. - break + break; }; } } else { // Do the same as above, but accounting for two's complement. for byte in buf.iter_mut().rev() { - let n = zero - (x % base); // Get the current place value. - x = x / base; // Deaccumulate the number. + let n = zero - (x % base); // Get the current place value. + x = x / base; // Deaccumulate the number. byte.write(Self::digit(n.to_u8())); // Store the digit in the buffer. curr -= 1; if x == zero { // No more digits left to accumulate. - break + break; }; } } let buf = &buf[curr..]; - let buf = unsafe { str::from_utf8_unchecked(slice::from_raw_parts( - MaybeUninit::first_ptr(buf), - buf.len() - )) }; + let buf = unsafe { + str::from_utf8_unchecked(slice::from_raw_parts(MaybeUninit::first_ptr(buf), buf.len())) + }; f.pad_integral(is_nonnegative, Self::PREFIX, buf) } } @@ -125,9 +124,9 @@ macro_rules! radix { radix! { Binary, 2, "0b", x @ 0 ..= 1 => b'0' + x } radix! { Octal, 8, "0o", x @ 0 ..= 7 => b'0' + x } radix! { LowerHex, 16, "0x", x @ 0 ..= 9 => b'0' + x, - x @ 10 ..= 15 => b'a' + (x - 10) } +x @ 10 ..= 15 => b'a' + (x - 10) } radix! { UpperHex, 16, "0x", x @ 0 ..= 9 => b'0' + x, - x @ 10 ..= 15 => b'A' + (x - 10) } +x @ 10 ..= 15 => b'A' + (x - 10) } macro_rules! int_base { ($Trait:ident for $T:ident as $U:ident -> $Radix:ident) => { @@ -137,7 +136,7 @@ macro_rules! int_base { $Radix.fmt_int(*self as $U, f) } } - } + }; } macro_rules! debug { @@ -155,7 +154,7 @@ macro_rules! debug { } } } - } + }; } macro_rules! integer { @@ -171,7 +170,7 @@ macro_rules! integer { int_base! { LowerHex for $Uint as $Uint -> LowerHex } int_base! { UpperHex for $Uint as $Uint -> UpperHex } debug! { $Uint } - } + }; } integer! { isize, usize } integer! { i8, u8 } @@ -180,9 +179,7 @@ integer! { i32, u32 } integer! { i64, u64 } integer! { i128, u128 } - -static DEC_DIGITS_LUT: &[u8; 200] = - b"0001020304050607080910111213141516171819\ +static DEC_DIGITS_LUT: &[u8; 200] = b"0001020304050607080910111213141516171819\ 2021222324252627282930313233343536373839\ 4041424344454647484950515253545556575859\ 6061626364656667686970717273747576777879\ diff --git a/src/libcore/fmt/rt/v1.rs b/src/libcore/fmt/rt/v1.rs index 826ae36d2d..fd81f93242 100644 --- a/src/libcore/fmt/rt/v1.rs +++ b/src/libcore/fmt/rt/v1.rs @@ -7,7 +7,10 @@ #[derive(Copy, Clone)] pub struct Argument { + #[cfg(bootstrap)] pub position: Position, + #[cfg(not(bootstrap))] + pub position: usize, pub format: FormatSpec, } @@ -37,12 +40,11 @@ pub enum Alignment { pub enum Count { Is(usize), Param(usize), - NextParam, Implied, } +#[cfg(bootstrap)] #[derive(Copy, Clone)] pub enum Position { - Next, At(usize), } diff --git a/src/libcore/hash/mod.rs b/src/libcore/hash/mod.rs index 0db8d86ebb..2a7fa58dd3 100644 --- a/src/libcore/hash/mod.rs +++ b/src/libcore/hash/mod.rs @@ -90,7 +90,7 @@ use crate::marker; #[allow(deprecated)] pub use self::sip::SipHasher; -#[unstable(feature = "hashmap_internals", issue = "0")] +#[unstable(feature = "hashmap_internals", issue = "none")] #[allow(deprecated)] #[doc(hidden)] pub use self::sip::SipHasher13; diff --git a/src/libcore/hash/sip.rs b/src/libcore/hash/sip.rs index 0aa3b97ebc..7ebe01e26d 100644 --- a/src/libcore/hash/sip.rs +++ b/src/libcore/hash/sip.rs @@ -15,7 +15,7 @@ use crate::ptr; /// (e.g., `collections::HashMap` uses it by default). /// /// See: -#[unstable(feature = "hashmap_internals", issue = "0")] +#[unstable(feature = "hashmap_internals", issue = "none")] #[rustc_deprecated( since = "1.13.0", reason = "use `std::collections::hash_map::DefaultHasher` instead" @@ -29,7 +29,7 @@ pub struct SipHasher13 { /// An implementation of SipHash 2-4. /// /// See: -#[unstable(feature = "hashmap_internals", issue = "0")] +#[unstable(feature = "hashmap_internals", issue = "none")] #[rustc_deprecated( since = "1.13.0", reason = "use `std::collections::hash_map::DefaultHasher` instead" @@ -172,7 +172,7 @@ impl SipHasher { impl SipHasher13 { /// Creates a new `SipHasher13` with the two initial keys set to 0. #[inline] - #[unstable(feature = "hashmap_internals", issue = "0")] + #[unstable(feature = "hashmap_internals", issue = "none")] #[rustc_deprecated( since = "1.13.0", reason = "use `std::collections::hash_map::DefaultHasher` instead" @@ -183,7 +183,7 @@ impl SipHasher13 { /// Creates a `SipHasher13` that is keyed off the provided keys. #[inline] - #[unstable(feature = "hashmap_internals", issue = "0")] + #[unstable(feature = "hashmap_internals", issue = "none")] #[rustc_deprecated( since = "1.13.0", reason = "use `std::collections::hash_map::DefaultHasher` instead" @@ -264,7 +264,7 @@ impl super::Hasher for SipHasher { } } -#[unstable(feature = "hashmap_internals", issue = "0")] +#[unstable(feature = "hashmap_internals", issue = "none")] impl super::Hasher for SipHasher13 { #[inline] fn write(&mut self, msg: &[u8]) { diff --git a/src/libcore/internal_macros.rs b/src/libcore/internal_macros.rs index 3acf2ec837..4ea7dfc073 100644 --- a/src/libcore/internal_macros.rs +++ b/src/libcore/internal_macros.rs @@ -77,7 +77,7 @@ macro_rules! forward_ref_op_assign { } /// Create a zero-size type similar to a closure type, but named. -#[unstable(feature = "std_internals", issue = "0")] +#[unstable(feature = "std_internals", issue = "none")] macro_rules! impl_fn_for_zst { ($( $( #[$attr: meta] )* diff --git a/src/libcore/intrinsics.rs b/src/libcore/intrinsics.rs index 1f72b7ab09..416c73f50b 100644 --- a/src/libcore/intrinsics.rs +++ b/src/libcore/intrinsics.rs @@ -1,6 +1,22 @@ //! Compiler intrinsics. //! //! The corresponding definitions are in `librustc_codegen_llvm/intrinsic.rs`. +//! The corresponding const implementations are in `librustc_mir/interpret/intrinsics.rs` +//! +//! # Const intrinsics +//! +//! Note: any changes to the constness of intrinsics should be discussed with the language team. +//! This includes changes in the stability of the constness. +//! +//! In order to make an intrinsic usable at compile-time, one needs to copy the implementation +//! from https://github.com/rust-lang/miri/blob/master/src/shims/intrinsics.rs to +//! `librustc_mir/interpret/intrinsics.rs` and add a +//! `#[rustc_const_unstable(feature = "foo", issue = "01234")]` to the intrinsic. +//! +//! If an intrinsic is supposed to be used from a `const fn` with a `rustc_const_stable` attribute, +//! the intrinsic's attribute must be `rustc_const_stable`, too. Such a change should not be done +//! without T-lang consulation, because it bakes a feature into the language that cannot be +//! replicated in user code without compiler support. //! //! # Volatiles //! @@ -29,18 +45,22 @@ //! guaranteed to happen in order. This is the standard mode for working //! with atomic types and is equivalent to Java's `volatile`. -#![unstable(feature = "core_intrinsics", - reason = "intrinsics are unlikely to ever be stabilized, instead \ +#![unstable( + feature = "core_intrinsics", + reason = "intrinsics are unlikely to ever be stabilized, instead \ they should be used through stabilized interfaces \ in the rest of the standard library", - issue = "0")] + issue = "none" +)] #![allow(missing_docs)] use crate::mem; #[stable(feature = "drop_in_place", since = "1.8.0")] -#[rustc_deprecated(reason = "no longer an intrinsic - use `ptr::drop_in_place` directly", - since = "1.18.0")] +#[rustc_deprecated( + reason = "no longer an intrinsic - use `ptr::drop_in_place` directly", + since = "1.18.0" +)] pub use crate::ptr::drop_in_place; extern "rust-intrinsic" { @@ -667,6 +687,7 @@ extern "rust-intrinsic" { /// /// The stabilized version of this intrinsic is /// [`std::mem::size_of`](../../std/mem/fn.size_of.html). + #[rustc_const_stable(feature = "const_size_of", since = "1.40.0")] pub fn size_of() -> usize; /// Moves a value to an uninitialized memory location. @@ -674,7 +695,9 @@ extern "rust-intrinsic" { /// Drop glue is not run on the destination. pub fn move_val_init(dst: *mut T, src: T); + #[rustc_const_stable(feature = "const_min_align_of", since = "1.40.0")] pub fn min_align_of() -> usize; + #[rustc_const_unstable(feature = "const_pref_align_of", issue = "none")] pub fn pref_align_of() -> usize; /// The size of the referenced value in bytes. @@ -685,11 +708,13 @@ extern "rust-intrinsic" { pub fn min_align_of_val(_: &T) -> usize; /// Gets a static string slice containing the name of a type. + #[rustc_const_unstable(feature = "const_type_name", issue = "none")] pub fn type_name() -> &'static str; /// Gets an identifier which is globally unique to the specified type. This /// function will return the same value for a type regardless of whichever /// crate it is invoked in. + #[rustc_const_unstable(feature = "const_type_id", issue = "none")] pub fn type_id() -> u64; /// A guard for unsafe functions that cannot ever be executed if `T` is uninhabited: @@ -697,6 +722,7 @@ extern "rust-intrinsic" { pub fn panic_if_uninhabited(); /// Gets a reference to a static `Location` indicating where it was called. + #[rustc_const_unstable(feature = "const_caller_location", issue = "47809")] pub fn caller_location() -> &'static crate::panic::Location<'static>; /// Creates a value initialized to zero. @@ -705,13 +731,14 @@ extern "rust-intrinsic" { /// which is unsafe unless `T` is `Copy`. Also, even if T is /// `Copy`, an all-zero value may not correspond to any legitimate /// state for the type in question. - #[unstable(feature = "core_intrinsics", - reason = "intrinsics are unlikely to ever be stabilized, instead \ + #[unstable( + feature = "core_intrinsics", + reason = "intrinsics are unlikely to ever be stabilized, instead \ they should be used through stabilized interfaces \ in the rest of the standard library", - issue = "0")] - #[rustc_deprecated(reason = "superseded by MaybeUninit, removal planned", - since = "1.38.0")] + issue = "none" + )] + #[rustc_deprecated(reason = "superseded by MaybeUninit, removal planned", since = "1.38.0")] pub fn init() -> T; /// Creates an uninitialized value. @@ -721,13 +748,14 @@ extern "rust-intrinsic" { /// state, which means it may claim either dropped or /// undropped. In the general case one must use `ptr::write` to /// initialize memory previous set to the result of `uninit`. - #[unstable(feature = "core_intrinsics", - reason = "intrinsics are unlikely to ever be stabilized, instead \ + #[unstable( + feature = "core_intrinsics", + reason = "intrinsics are unlikely to ever be stabilized, instead \ they should be used through stabilized interfaces \ in the rest of the standard library", - issue = "0")] - #[rustc_deprecated(reason = "superseded by MaybeUninit, removal planned", - since = "1.38.0")] + issue = "none" + )] + #[rustc_deprecated(reason = "superseded by MaybeUninit, removal planned", since = "1.38.0")] pub fn uninit() -> T; /// Moves a value out of scope without running drop glue. @@ -939,11 +967,7 @@ extern "rust-intrinsic" { /// } /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_transmute"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_transmute", issue = "53605"), - )] + #[rustc_const_unstable(feature = "const_transmute", issue = "53605")] pub fn transmute(e: T) -> U; /// Returns `true` if the actual type given as `T` requires drop @@ -955,6 +979,7 @@ extern "rust-intrinsic" { /// /// The stabilized version of this intrinsic is /// [`std::mem::needs_drop`](../../std/mem/fn.needs_drop.html). + #[rustc_const_stable(feature = "const_needs_drop", since = "1.40.0")] pub fn needs_drop() -> bool; /// Calculates the offset from a pointer. @@ -989,8 +1014,7 @@ extern "rust-intrinsic" { /// /// The volatile parameter is set to `true`, so it will not be optimized out /// unless size is equal to zero. - pub fn volatile_copy_nonoverlapping_memory(dst: *mut T, src: *const T, - count: usize); + pub fn volatile_copy_nonoverlapping_memory(dst: *mut T, src: *const T, count: usize); /// Equivalent to the appropriate `llvm.memmove.p0i8.0i8.*` intrinsic, with /// a size of `count` * `size_of::()` and an alignment of /// `min_align_of::()` @@ -1150,11 +1174,10 @@ extern "rust-intrinsic" { /// Convert with LLVM’s fptoui/fptosi, which may return undef for values out of range /// https://github.com/rust-lang/rust/issues/10184 - #[cfg(not(bootstrap))] pub fn float_to_int_approx_unchecked(value: Float) -> Int; - /// Returns the number of bits set in an integer type `T` + #[rustc_const_stable(feature = "const_ctpop", since = "1.40.0")] pub fn ctpop(x: T) -> T; /// Returns the number of leading unset bits (zeroes) in an integer type `T`. @@ -1182,6 +1205,7 @@ extern "rust-intrinsic" { /// let num_leading = ctlz(x); /// assert_eq!(num_leading, 16); /// ``` + #[rustc_const_stable(feature = "const_ctlz", since = "1.40.0")] pub fn ctlz(x: T) -> T; /// Like `ctlz`, but extra-unsafe as it returns `undef` when @@ -1198,6 +1222,7 @@ extern "rust-intrinsic" { /// let num_leading = unsafe { ctlz_nonzero(x) }; /// assert_eq!(num_leading, 3); /// ``` + #[rustc_const_unstable(feature = "constctlz", issue = "none")] pub fn ctlz_nonzero(x: T) -> T; /// Returns the number of trailing unset bits (zeroes) in an integer type `T`. @@ -1225,6 +1250,7 @@ extern "rust-intrinsic" { /// let num_trailing = cttz(x); /// assert_eq!(num_trailing, 16); /// ``` + #[rustc_const_stable(feature = "const_cttz", since = "1.40.0")] pub fn cttz(x: T) -> T; /// Like `cttz`, but extra-unsafe as it returns `undef` when @@ -1241,30 +1267,36 @@ extern "rust-intrinsic" { /// let num_trailing = unsafe { cttz_nonzero(x) }; /// assert_eq!(num_trailing, 3); /// ``` + #[rustc_const_unstable(feature = "const_cttz", issue = "none")] pub fn cttz_nonzero(x: T) -> T; /// Reverses the bytes in an integer type `T`. + #[rustc_const_stable(feature = "const_bswap", since = "1.40.0")] pub fn bswap(x: T) -> T; /// Reverses the bits in an integer type `T`. + #[rustc_const_stable(feature = "const_bitreverse", since = "1.40.0")] pub fn bitreverse(x: T) -> T; /// Performs checked integer addition. /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `overflowing_add` method. For example, /// [`std::u32::overflowing_add`](../../std/primitive.u32.html#method.overflowing_add) + #[rustc_const_stable(feature = "const_int_overflow", since = "1.40.0")] pub fn add_with_overflow(x: T, y: T) -> (T, bool); /// Performs checked integer subtraction /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `overflowing_sub` method. For example, /// [`std::u32::overflowing_sub`](../../std/primitive.u32.html#method.overflowing_sub) + #[rustc_const_stable(feature = "const_int_overflow", since = "1.40.0")] pub fn sub_with_overflow(x: T, y: T) -> (T, bool); /// Performs checked integer multiplication /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `overflowing_mul` method. For example, /// [`std::u32::overflowing_mul`](../../std/primitive.u32.html#method.overflowing_mul) + #[rustc_const_stable(feature = "const_int_overflow", since = "1.40.0")] pub fn mul_with_overflow(x: T, y: T) -> (T, bool); /// Performs an exact division, resulting in undefined behavior where @@ -1280,9 +1312,11 @@ extern "rust-intrinsic" { /// Performs an unchecked left shift, resulting in undefined behavior when /// y < 0 or y >= N, where N is the width of T in bits. + #[rustc_const_stable(feature = "const_int_unchecked", since = "1.40.0")] pub fn unchecked_shl(x: T, y: T) -> T; /// Performs an unchecked right shift, resulting in undefined behavior when /// y < 0 or y >= N, where N is the width of T in bits. + #[rustc_const_stable(feature = "const_int_unchecked", since = "1.40.0")] pub fn unchecked_shr(x: T, y: T) -> T; /// Returns the result of an unchecked addition, resulting in @@ -1301,39 +1335,46 @@ extern "rust-intrinsic" { /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `rotate_left` method. For example, /// [`std::u32::rotate_left`](../../std/primitive.u32.html#method.rotate_left) + #[rustc_const_stable(feature = "const_int_rotate", since = "1.40.0")] pub fn rotate_left(x: T, y: T) -> T; /// Performs rotate right. /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `rotate_right` method. For example, /// [`std::u32::rotate_right`](../../std/primitive.u32.html#method.rotate_right) + #[rustc_const_stable(feature = "const_int_rotate", since = "1.40.0")] pub fn rotate_right(x: T, y: T) -> T; /// Returns (a + b) mod 2N, where N is the width of T in bits. /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `wrapping_add` method. For example, /// [`std::u32::wrapping_add`](../../std/primitive.u32.html#method.wrapping_add) + #[rustc_const_stable(feature = "const_int_wrapping", since = "1.40.0")] pub fn wrapping_add(a: T, b: T) -> T; /// Returns (a - b) mod 2N, where N is the width of T in bits. /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `wrapping_sub` method. For example, /// [`std::u32::wrapping_sub`](../../std/primitive.u32.html#method.wrapping_sub) + #[rustc_const_stable(feature = "const_int_wrapping", since = "1.40.0")] pub fn wrapping_sub(a: T, b: T) -> T; /// Returns (a * b) mod 2N, where N is the width of T in bits. /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `wrapping_mul` method. For example, /// [`std::u32::wrapping_mul`](../../std/primitive.u32.html#method.wrapping_mul) + #[rustc_const_stable(feature = "const_int_wrapping", since = "1.40.0")] pub fn wrapping_mul(a: T, b: T) -> T; /// Computes `a + b`, while saturating at numeric bounds. /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `saturating_add` method. For example, /// [`std::u32::saturating_add`](../../std/primitive.u32.html#method.saturating_add) + #[rustc_const_stable(feature = "const_int_saturating", since = "1.40.0")] pub fn saturating_add(a: T, b: T) -> T; /// Computes `a - b`, while saturating at numeric bounds. /// The stabilized versions of this intrinsic are available on the integer /// primitives via the `saturating_sub` method. For example, /// [`std::u32::saturating_sub`](../../std/primitive.u32.html#method.saturating_sub) + #[rustc_const_stable(feature = "const_int_saturating", since = "1.40.0")] pub fn saturating_sub(a: T, b: T) -> T; /// Returns the value of the discriminant for the variant in 'v', @@ -1355,13 +1396,13 @@ extern "rust-intrinsic" { pub fn nontemporal_store(ptr: *mut T, val: T); /// See documentation of `<*const T>::offset_from` for details. + #[rustc_const_unstable(feature = "const_ptr_offset_from", issue = "none")] pub fn ptr_offset_from(ptr: *const T, base: *const T) -> isize; /// Internal hook used by Miri to implement unwinding. /// Compiles to a NOP during non-Miri codegen. /// /// Perma-unstable: do not use - #[cfg(not(bootstrap))] pub fn miri_start_panic(data: *mut (dyn crate::any::Any + crate::marker::Send)) -> (); } @@ -1382,11 +1423,7 @@ fn overlaps(src: *const T, dst: *const T, count: usize) -> bool { let src_usize = src as usize; let dst_usize = dst as usize; let size = mem::size_of::().checked_mul(count).unwrap(); - let diff = if src_usize > dst_usize { - src_usize - dst_usize - } else { - dst_usize - src_usize - }; + let diff = if src_usize > dst_usize { src_usize - dst_usize } else { dst_usize - src_usize }; size > diff } diff --git a/src/libcore/iter/adapters/chain.rs b/src/libcore/iter/adapters/chain.rs index 3b669cad1c..3611a1aada 100644 --- a/src/libcore/iter/adapters/chain.rs +++ b/src/libcore/iter/adapters/chain.rs @@ -1,7 +1,7 @@ use crate::ops::Try; use crate::usize; -use super::super::{Iterator, DoubleEndedIterator, FusedIterator, TrustedLen}; +use super::super::{DoubleEndedIterator, FusedIterator, Iterator, TrustedLen}; /// An iterator that links two iterators together, in a chain. /// @@ -48,9 +48,10 @@ enum ChainState { } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Chain where +impl Iterator for Chain +where A: Iterator, - B: Iterator + B: Iterator, { type Item = A::Item; @@ -79,8 +80,11 @@ impl Iterator for Chain where } } - fn try_fold(&mut self, init: Acc, mut f: F) -> R where - Self: Sized, F: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, mut f: F) -> R + where + Self: Sized, + F: FnMut(Acc, Self::Item) -> R, + R: Try, { let mut accum = init; match self.state { @@ -90,7 +94,7 @@ impl Iterator for Chain where self.state = ChainState::Back; } } - _ => { } + _ => {} } if let ChainState::Back = self.state { accum = self.b.try_fold(accum, &mut f)?; @@ -99,20 +103,21 @@ impl Iterator for Chain where } fn fold(self, init: Acc, mut f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc, + where + F: FnMut(Acc, Self::Item) -> Acc, { let mut accum = init; match self.state { ChainState::Both | ChainState::Front => { accum = self.a.fold(accum, &mut f); } - _ => { } + _ => {} } match self.state { ChainState::Both | ChainState::Back => { accum = self.b.fold(accum, &mut f); } - _ => { } + _ => {} } accum } @@ -123,7 +128,7 @@ impl Iterator for Chain where ChainState::Both | ChainState::Front => { for x in self.a.by_ref() { if n == 0 { - return Some(x) + return Some(x); } n -= 1; } @@ -133,15 +138,12 @@ impl Iterator for Chain where } ChainState::Back => {} } - if let ChainState::Back = self.state { - self.b.nth(n) - } else { - None - } + if let ChainState::Back = self.state { self.b.nth(n) } else { None } } #[inline] - fn find

(&mut self, mut predicate: P) -> Option where + fn find

(&mut self, mut predicate: P) -> Option + where P: FnMut(&Self::Item) -> bool, { match self.state { @@ -150,7 +152,7 @@ impl Iterator for Chain where self.state = ChainState::Back; self.b.find(predicate) } - v => v + v => v, }, ChainState::Front => self.a.find(predicate), ChainState::Back => self.b.find(predicate), @@ -165,9 +167,9 @@ impl Iterator for Chain where let a_last = self.a.last(); let b_last = self.b.last(); b_last.or(a_last) - }, + } ChainState::Front => self.a.last(), - ChainState::Back => self.b.last() + ChainState::Back => self.b.last(), } } @@ -182,7 +184,7 @@ impl Iterator for Chain where let upper = match (a_upper, b_upper) { (Some(x), Some(y)) => x.checked_add(y), - _ => None + _ => None, }; (lower, upper) @@ -194,9 +196,10 @@ impl Iterator for Chain where } #[stable(feature = "rust1", since = "1.0.0")] -impl DoubleEndedIterator for Chain where +impl DoubleEndedIterator for Chain +where A: DoubleEndedIterator, - B: DoubleEndedIterator, + B: DoubleEndedIterator, { #[inline] fn next_back(&mut self) -> Option { @@ -219,7 +222,7 @@ impl DoubleEndedIterator for Chain where ChainState::Both | ChainState::Back => { for x in self.b.by_ref().rev() { if n == 0 { - return Some(x) + return Some(x); } n -= 1; } @@ -229,15 +232,14 @@ impl DoubleEndedIterator for Chain where } ChainState::Front => {} } - if let ChainState::Front = self.state { - self.a.nth_back(n) - } else { - None - } + if let ChainState::Front = self.state { self.a.nth_back(n) } else { None } } - fn try_rfold(&mut self, init: Acc, mut f: F) -> R where - Self: Sized, F: FnMut(Acc, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: Acc, mut f: F) -> R + where + Self: Sized, + F: FnMut(Acc, Self::Item) -> R, + R: Try, { let mut accum = init; match self.state { @@ -247,7 +249,7 @@ impl DoubleEndedIterator for Chain where self.state = ChainState::Front; } } - _ => { } + _ => {} } if let ChainState::Front = self.state { accum = self.a.try_rfold(accum, &mut f)?; @@ -256,34 +258,39 @@ impl DoubleEndedIterator for Chain where } fn rfold(self, init: Acc, mut f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc, + where + F: FnMut(Acc, Self::Item) -> Acc, { let mut accum = init; match self.state { ChainState::Both | ChainState::Back => { accum = self.b.rfold(accum, &mut f); } - _ => { } + _ => {} } match self.state { ChainState::Both | ChainState::Front => { accum = self.a.rfold(accum, &mut f); } - _ => { } + _ => {} } accum } - } // Note: *both* must be fused to handle double-ended iterators. #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for Chain - where A: FusedIterator, - B: FusedIterator, -{} +where + A: FusedIterator, + B: FusedIterator, +{ +} #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl TrustedLen for Chain - where A: TrustedLen, B: TrustedLen, -{} +where + A: TrustedLen, + B: TrustedLen, +{ +} diff --git a/src/libcore/iter/adapters/mod.rs b/src/libcore/iter/adapters/mod.rs index 39d571006e..5787b9174e 100644 --- a/src/libcore/iter/adapters/mod.rs +++ b/src/libcore/iter/adapters/mod.rs @@ -1,11 +1,11 @@ use crate::cmp; use crate::fmt; +use crate::intrinsics; use crate::ops::{Add, AddAssign, Try}; use crate::usize; -use crate::intrinsics; -use super::{Iterator, DoubleEndedIterator, ExactSizeIterator, FusedIterator, TrustedLen}; -use super::{LoopState, from_fn}; +use super::{from_fn, LoopState}; +use super::{DoubleEndedIterator, ExactSizeIterator, FusedIterator, Iterator, TrustedLen}; mod chain; mod flatten; @@ -14,8 +14,8 @@ mod zip; pub use self::chain::Chain; #[stable(feature = "rust1", since = "1.0.0")] pub use self::flatten::{FlatMap, Flatten}; -pub use self::zip::Zip; pub(crate) use self::zip::TrustedRandomAccess; +pub use self::zip::Zip; /// A double-ended iterator with the direction inverted. /// @@ -28,7 +28,7 @@ pub(crate) use self::zip::TrustedRandomAccess; #[must_use = "iterators are lazy and do nothing unless consumed"] #[stable(feature = "rust1", since = "1.0.0")] pub struct Rev { - iter: T + iter: T, } impl Rev { pub(super) fn new(iter: T) -> Rev { @@ -37,59 +37,85 @@ impl Rev { } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Rev where I: DoubleEndedIterator { +impl Iterator for Rev +where + I: DoubleEndedIterator, +{ type Item = ::Item; #[inline] - fn next(&mut self) -> Option<::Item> { self.iter.next_back() } + fn next(&mut self) -> Option<::Item> { + self.iter.next_back() + } #[inline] - fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } #[inline] - fn nth(&mut self, n: usize) -> Option<::Item> { self.iter.nth_back(n) } + fn nth(&mut self, n: usize) -> Option<::Item> { + self.iter.nth_back(n) + } - fn try_fold(&mut self, init: B, f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: B, f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { self.iter.try_rfold(init, f) } fn fold(self, init: Acc, f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc, + where + F: FnMut(Acc, Self::Item) -> Acc, { self.iter.rfold(init, f) } #[inline] fn find

(&mut self, predicate: P) -> Option - where P: FnMut(&Self::Item) -> bool + where + P: FnMut(&Self::Item) -> bool, { self.iter.rfind(predicate) } } #[stable(feature = "rust1", since = "1.0.0")] -impl DoubleEndedIterator for Rev where I: DoubleEndedIterator { +impl DoubleEndedIterator for Rev +where + I: DoubleEndedIterator, +{ #[inline] - fn next_back(&mut self) -> Option<::Item> { self.iter.next() } + fn next_back(&mut self) -> Option<::Item> { + self.iter.next() + } #[inline] - fn nth_back(&mut self, n: usize) -> Option<::Item> { self.iter.nth(n) } + fn nth_back(&mut self, n: usize) -> Option<::Item> { + self.iter.nth(n) + } - fn try_rfold(&mut self, init: B, f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: B, f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { self.iter.try_fold(init, f) } fn rfold(self, init: Acc, f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc, + where + F: FnMut(Acc, Self::Item) -> Acc, { self.iter.fold(init, f) } fn rfind

(&mut self, predicate: P) -> Option - where P: FnMut(&Self::Item) -> bool + where + P: FnMut(&Self::Item) -> bool, { self.iter.find(predicate) } @@ -97,7 +123,8 @@ impl DoubleEndedIterator for Rev where I: DoubleEndedIterator { #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Rev - where I: ExactSizeIterator + DoubleEndedIterator +where + I: ExactSizeIterator + DoubleEndedIterator, { fn len(&self) -> usize { self.iter.len() @@ -109,12 +136,10 @@ impl ExactSizeIterator for Rev } #[stable(feature = "fused", since = "1.26.0")] -impl FusedIterator for Rev - where I: FusedIterator + DoubleEndedIterator {} +impl FusedIterator for Rev where I: FusedIterator + DoubleEndedIterator {} #[unstable(feature = "trusted_len", issue = "37572")] -unsafe impl TrustedLen for Rev - where I: TrustedLen + DoubleEndedIterator {} +unsafe impl TrustedLen for Rev where I: TrustedLen + DoubleEndedIterator {} /// An iterator that copies the elements of an underlying iterator. /// @@ -136,21 +161,19 @@ impl Copied { } } -fn copy_fold( - mut f: impl FnMut(Acc, T) -> Acc, -) -> impl FnMut(Acc, &T) -> Acc { +fn copy_fold(mut f: impl FnMut(Acc, T) -> Acc) -> impl FnMut(Acc, &T) -> Acc { move |acc, &elt| f(acc, elt) } -fn copy_try_fold( - mut f: impl FnMut(Acc, T) -> R, -) -> impl FnMut(Acc, &T) -> R { +fn copy_try_fold(mut f: impl FnMut(Acc, T) -> R) -> impl FnMut(Acc, &T) -> R { move |acc, &elt| f(acc, elt) } #[stable(feature = "iter_copied", since = "1.36.0")] impl<'a, I, T: 'a> Iterator for Copied - where I: Iterator, T: Copy +where + I: Iterator, + T: Copy, { type Item = T; @@ -162,14 +185,18 @@ impl<'a, I, T: 'a> Iterator for Copied self.it.size_hint() } - fn try_fold(&mut self, init: B, f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: B, f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { self.it.try_fold(init, copy_try_fold(f)) } fn fold(self, init: Acc, f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc, + where + F: FnMut(Acc, Self::Item) -> Acc, { self.it.fold(init, copy_fold(f)) } @@ -177,20 +204,26 @@ impl<'a, I, T: 'a> Iterator for Copied #[stable(feature = "iter_copied", since = "1.36.0")] impl<'a, I, T: 'a> DoubleEndedIterator for Copied - where I: DoubleEndedIterator, T: Copy +where + I: DoubleEndedIterator, + T: Copy, { fn next_back(&mut self) -> Option { self.it.next_back().copied() } - fn try_rfold(&mut self, init: B, f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: B, f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { self.it.try_rfold(init, copy_try_fold(f)) } fn rfold(self, init: Acc, f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc, + where + F: FnMut(Acc, Self::Item) -> Acc, { self.it.rfold(init, copy_fold(f)) } @@ -198,7 +231,9 @@ impl<'a, I, T: 'a> DoubleEndedIterator for Copied #[stable(feature = "iter_copied", since = "1.36.0")] impl<'a, I, T: 'a> ExactSizeIterator for Copied - where I: ExactSizeIterator, T: Copy +where + I: ExactSizeIterator, + T: Copy, { fn len(&self) -> usize { self.it.len() @@ -211,12 +246,17 @@ impl<'a, I, T: 'a> ExactSizeIterator for Copied #[stable(feature = "iter_copied", since = "1.36.0")] impl<'a, I, T: 'a> FusedIterator for Copied - where I: FusedIterator, T: Copy -{} +where + I: FusedIterator, + T: Copy, +{ +} #[doc(hidden)] unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Copied - where I: TrustedRandomAccess, T: Copy +where + I: TrustedRandomAccess, + T: Copy, { unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item { *self.it.get_unchecked(i) @@ -230,9 +270,11 @@ unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Copied #[stable(feature = "iter_copied", since = "1.36.0")] unsafe impl<'a, I, T: 'a> TrustedLen for Copied - where I: TrustedLen, - T: Copy -{} +where + I: TrustedLen, + T: Copy, +{ +} /// An iterator that clones the elements of an underlying iterator. /// @@ -253,15 +295,15 @@ impl Cloned { } } -fn clone_try_fold( - mut f: impl FnMut(Acc, T) -> R, -) -> impl FnMut(Acc, &T) -> R { +fn clone_try_fold(mut f: impl FnMut(Acc, T) -> R) -> impl FnMut(Acc, &T) -> R { move |acc, elt| f(acc, elt.clone()) } #[stable(feature = "iter_cloned", since = "1.1.0")] impl<'a, I, T: 'a> Iterator for Cloned - where I: Iterator, T: Clone +where + I: Iterator, + T: Clone, { type Item = T; @@ -273,14 +315,18 @@ impl<'a, I, T: 'a> Iterator for Cloned self.it.size_hint() } - fn try_fold(&mut self, init: B, f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: B, f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { self.it.try_fold(init, clone_try_fold(f)) } fn fold(self, init: Acc, f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc, + where + F: FnMut(Acc, Self::Item) -> Acc, { self.it.map(T::clone).fold(init, f) } @@ -288,20 +334,26 @@ impl<'a, I, T: 'a> Iterator for Cloned #[stable(feature = "iter_cloned", since = "1.1.0")] impl<'a, I, T: 'a> DoubleEndedIterator for Cloned - where I: DoubleEndedIterator, T: Clone +where + I: DoubleEndedIterator, + T: Clone, { fn next_back(&mut self) -> Option { self.it.next_back().cloned() } - fn try_rfold(&mut self, init: B, f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: B, f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { self.it.try_rfold(init, clone_try_fold(f)) } fn rfold(self, init: Acc, f: F) -> Acc - where F: FnMut(Acc, Self::Item) -> Acc, + where + F: FnMut(Acc, Self::Item) -> Acc, { self.it.map(T::clone).rfold(init, f) } @@ -309,7 +361,9 @@ impl<'a, I, T: 'a> DoubleEndedIterator for Cloned #[stable(feature = "iter_cloned", since = "1.1.0")] impl<'a, I, T: 'a> ExactSizeIterator for Cloned - where I: ExactSizeIterator, T: Clone +where + I: ExactSizeIterator, + T: Clone, { fn len(&self) -> usize { self.it.len() @@ -322,24 +376,33 @@ impl<'a, I, T: 'a> ExactSizeIterator for Cloned #[stable(feature = "fused", since = "1.26.0")] impl<'a, I, T: 'a> FusedIterator for Cloned - where I: FusedIterator, T: Clone -{} +where + I: FusedIterator, + T: Clone, +{ +} #[doc(hidden)] unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned - where I: TrustedRandomAccess, T: Clone +where + I: TrustedRandomAccess, + T: Clone, { default unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item { self.it.get_unchecked(i).clone() } #[inline] - default fn may_have_side_effect() -> bool { true } + default fn may_have_side_effect() -> bool { + true + } } #[doc(hidden)] unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned - where I: TrustedRandomAccess, T: Copy +where + I: TrustedRandomAccess, + T: Copy, { unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item { *self.it.get_unchecked(i) @@ -353,9 +416,11 @@ unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl<'a, I, T: 'a> TrustedLen for Cloned - where I: TrustedLen, - T: Clone -{} +where + I: TrustedLen, + T: Clone, +{ +} /// An iterator that repeats endlessly. /// @@ -378,14 +443,20 @@ impl Cycle { } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Cycle where I: Clone + Iterator { +impl Iterator for Cycle +where + I: Clone + Iterator, +{ type Item = ::Item; #[inline] fn next(&mut self) -> Option<::Item> { match self.iter.next() { - None => { self.iter = self.orig.clone(); self.iter.next() } - y => y + None => { + self.iter = self.orig.clone(); + self.iter.next() + } + y => y, } } @@ -395,7 +466,7 @@ impl Iterator for Cycle where I: Clone + Iterator { match self.orig.size_hint() { sz @ (0, Some(0)) => sz, (0, _) => (0, None), - _ => (usize::MAX, None) + _ => (usize::MAX, None), } } @@ -456,7 +527,10 @@ impl StepBy { } #[stable(feature = "iterator_step_by", since = "1.28.0")] -impl Iterator for StepBy where I: Iterator { +impl Iterator for StepBy +where + I: Iterator, +{ type Item = I::Item; #[inline] @@ -517,14 +591,6 @@ impl Iterator for StepBy where I: Iterator { // overflow handling loop { let mul = n.checked_mul(step); - #[cfg(bootstrap)] - { - // SAFETY: going away soon - if unsafe { intrinsics::likely(mul.is_some()) } { - return self.iter.nth(mul.unwrap() - 1); - } - } - #[cfg(not(bootstrap))] { if intrinsics::likely(mul.is_some()) { return self.iter.nth(mul.unwrap() - 1); @@ -566,7 +632,10 @@ impl Iterator for StepBy where I: Iterator { } } -impl StepBy where I: ExactSizeIterator { +impl StepBy +where + I: ExactSizeIterator, +{ // The zero-based index starting from the end of the iterator of the // last element. Used in the `DoubleEndedIterator` implementation. fn next_back_index(&self) -> usize { @@ -580,7 +649,10 @@ impl StepBy where I: ExactSizeIterator { } #[stable(feature = "double_ended_step_by_iterator", since = "1.38.0")] -impl DoubleEndedIterator for StepBy where I: DoubleEndedIterator + ExactSizeIterator { +impl DoubleEndedIterator for StepBy +where + I: DoubleEndedIterator + ExactSizeIterator, +{ #[inline] fn next_back(&mut self) -> Option { self.iter.nth_back(self.next_back_index()) @@ -592,9 +664,7 @@ impl DoubleEndedIterator for StepBy where I: DoubleEndedIterator + ExactSi // is out of bounds because the length of `self.iter` does not exceed // `usize::MAX` (because `I: ExactSizeIterator`) and `nth_back` is // zero-indexed - let n = n - .saturating_mul(self.step + 1) - .saturating_add(self.next_back_index()); + let n = n.saturating_mul(self.step + 1).saturating_add(self.next_back_index()); self.iter.nth_back(n) } @@ -691,9 +761,7 @@ impl Map { #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for Map { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Map") - .field("iter", &self.iter) - .finish() + f.debug_struct("Map").field("iter", &self.iter).finish() } } @@ -712,7 +780,10 @@ fn map_try_fold<'a, T, B, Acc, R>( } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Map where F: FnMut(I::Item) -> B { +impl Iterator for Map +where + F: FnMut(I::Item) -> B, +{ type Item = B; #[inline] @@ -725,21 +796,26 @@ impl Iterator for Map where F: FnMut(I::Item) -> B { self.iter.size_hint() } - fn try_fold(&mut self, init: Acc, g: G) -> R where - Self: Sized, G: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, g: G) -> R + where + Self: Sized, + G: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_fold(init, map_try_fold(&mut self.f, g)) } fn fold(self, init: Acc, g: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, + where + G: FnMut(Acc, Self::Item) -> Acc, { self.iter.fold(init, map_fold(self.f, g)) } } #[stable(feature = "rust1", since = "1.0.0")] -impl DoubleEndedIterator for Map where +impl DoubleEndedIterator for Map +where F: FnMut(I::Item) -> B, { #[inline] @@ -747,14 +823,18 @@ impl DoubleEndedIterator for Map where self.iter.next_back().map(&mut self.f) } - fn try_rfold(&mut self, init: Acc, g: G) -> R where - Self: Sized, G: FnMut(Acc, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: Acc, g: G) -> R + where + Self: Sized, + G: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_rfold(init, map_try_fold(&mut self.f, g)) } fn rfold(self, init: Acc, g: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, + where + G: FnMut(Acc, Self::Item) -> Acc, { self.iter.rfold(init, map_fold(self.f, g)) } @@ -762,7 +842,8 @@ impl DoubleEndedIterator for Map where #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Map - where F: FnMut(I::Item) -> B +where + F: FnMut(I::Item) -> B, { fn len(&self) -> usize { self.iter.len() @@ -774,24 +855,29 @@ impl ExactSizeIterator for Map } #[stable(feature = "fused", since = "1.26.0")] -impl FusedIterator for Map - where F: FnMut(I::Item) -> B {} +impl FusedIterator for Map where F: FnMut(I::Item) -> B {} #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl TrustedLen for Map - where I: TrustedLen, - F: FnMut(I::Item) -> B {} +where + I: TrustedLen, + F: FnMut(I::Item) -> B, +{ +} #[doc(hidden)] unsafe impl TrustedRandomAccess for Map - where I: TrustedRandomAccess, - F: FnMut(I::Item) -> B, +where + I: TrustedRandomAccess, + F: FnMut(I::Item) -> B, { unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item { (self.f)(self.iter.get_unchecked(i)) } #[inline] - fn may_have_side_effect() -> bool { true } + fn may_have_side_effect() -> bool { + true + } } /// An iterator that filters the elements of `iter` with `predicate`. @@ -817,9 +903,7 @@ impl Filter { #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for Filter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Filter") - .field("iter", &self.iter) - .finish() + f.debug_struct("Filter").field("iter", &self.iter).finish() } } @@ -838,7 +922,10 @@ fn filter_try_fold<'a, T, Acc, R: Try>( } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Filter where P: FnMut(&I::Item) -> bool { +impl Iterator for Filter +where + P: FnMut(&I::Item) -> bool, +{ type Item = I::Item; #[inline] @@ -874,15 +961,19 @@ impl Iterator for Filter where P: FnMut(&I::Item) -> bool } #[inline] - fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_fold(init, filter_try_fold(&mut self.predicate, fold)) } #[inline] fn fold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { self.iter.fold(init, filter_fold(self.predicate, fold)) } @@ -890,7 +981,8 @@ impl Iterator for Filter where P: FnMut(&I::Item) -> bool #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Filter - where P: FnMut(&I::Item) -> bool, +where + P: FnMut(&I::Item) -> bool, { #[inline] fn next_back(&mut self) -> Option { @@ -898,23 +990,26 @@ impl DoubleEndedIterator for Filter } #[inline] - fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_rfold(init, filter_try_fold(&mut self.predicate, fold)) } #[inline] fn rfold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { self.iter.rfold(init, filter_fold(self.predicate, fold)) } } #[stable(feature = "fused", since = "1.26.0")] -impl FusedIterator for Filter - where P: FnMut(&I::Item) -> bool {} +impl FusedIterator for Filter where P: FnMut(&I::Item) -> bool {} /// An iterator that uses `f` to both filter and map elements from `iter`. /// @@ -939,9 +1034,7 @@ impl FilterMap { #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for FilterMap { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("FilterMap") - .field("iter", &self.iter) - .finish() + f.debug_struct("FilterMap").field("iter", &self.iter).finish() } } @@ -967,7 +1060,8 @@ fn filter_map_try_fold<'a, T, B, Acc, R: Try>( #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for FilterMap - where F: FnMut(I::Item) -> Option, +where + F: FnMut(I::Item) -> Option, { type Item = B; @@ -983,15 +1077,19 @@ impl Iterator for FilterMap } #[inline] - fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_fold(init, filter_map_try_fold(&mut self.f, fold)) } #[inline] fn fold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { self.iter.fold(init, filter_map_fold(self.f, fold)) } @@ -999,13 +1097,14 @@ impl Iterator for FilterMap #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for FilterMap - where F: FnMut(I::Item) -> Option, +where + F: FnMut(I::Item) -> Option, { #[inline] fn next_back(&mut self) -> Option { #[inline] fn find( - f: &mut impl FnMut(T) -> Option + f: &mut impl FnMut(T) -> Option, ) -> impl FnMut((), T) -> LoopState<(), B> + '_ { move |(), x| match f(x) { Some(x) => LoopState::Break(x), @@ -1017,23 +1116,26 @@ impl DoubleEndedIterator for FilterMap } #[inline] - fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_rfold(init, filter_map_try_fold(&mut self.f, fold)) } #[inline] fn rfold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { self.iter.rfold(init, filter_map_fold(self.f, fold)) } } #[stable(feature = "fused", since = "1.26.0")] -impl FusedIterator for FilterMap - where F: FnMut(I::Item) -> Option {} +impl FusedIterator for FilterMap where F: FnMut(I::Item) -> Option {} /// An iterator that yields the current count and the element during iteration. /// @@ -1056,7 +1158,10 @@ impl Enumerate { } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Enumerate where I: Iterator { +impl Iterator for Enumerate +where + I: Iterator, +{ type Item = (usize, ::Item); /// # Overflow Behavior @@ -1097,8 +1202,11 @@ impl Iterator for Enumerate where I: Iterator { } #[inline] - fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { #[inline] fn enumerate<'a, T, Acc, R>( @@ -1118,7 +1226,8 @@ impl Iterator for Enumerate where I: Iterator { #[inline] fn fold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { #[inline] fn enumerate( @@ -1138,8 +1247,9 @@ impl Iterator for Enumerate where I: Iterator { } #[stable(feature = "rust1", since = "1.0.0")] -impl DoubleEndedIterator for Enumerate where - I: ExactSizeIterator + DoubleEndedIterator +impl DoubleEndedIterator for Enumerate +where + I: ExactSizeIterator + DoubleEndedIterator, { #[inline] fn next_back(&mut self) -> Option<(usize, ::Item)> { @@ -1160,8 +1270,11 @@ impl DoubleEndedIterator for Enumerate where } #[inline] - fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { // Can safely add and subtract the count, as `ExactSizeIterator` promises // that the number of elements fits into a `usize`. @@ -1181,7 +1294,8 @@ impl DoubleEndedIterator for Enumerate where #[inline] fn rfold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { // Can safely add and subtract the count, as `ExactSizeIterator` promises // that the number of elements fits into a `usize`. @@ -1201,7 +1315,10 @@ impl DoubleEndedIterator for Enumerate where } #[stable(feature = "rust1", since = "1.0.0")] -impl ExactSizeIterator for Enumerate where I: ExactSizeIterator { +impl ExactSizeIterator for Enumerate +where + I: ExactSizeIterator, +{ fn len(&self) -> usize { self.iter.len() } @@ -1213,7 +1330,8 @@ impl ExactSizeIterator for Enumerate where I: ExactSizeIterator { #[doc(hidden)] unsafe impl TrustedRandomAccess for Enumerate - where I: TrustedRandomAccess +where + I: TrustedRandomAccess, { unsafe fn get_unchecked(&mut self, i: usize) -> (usize, I::Item) { (self.count + i, self.iter.get_unchecked(i)) @@ -1228,10 +1346,7 @@ unsafe impl TrustedRandomAccess for Enumerate impl FusedIterator for Enumerate where I: FusedIterator {} #[unstable(feature = "trusted_len", issue = "37572")] -unsafe impl TrustedLen for Enumerate - where I: TrustedLen, -{} - +unsafe impl TrustedLen for Enumerate where I: TrustedLen {} /// An iterator with a `peek()` that returns an optional reference to the next /// element. @@ -1318,8 +1433,11 @@ impl Iterator for Peekable { } #[inline] - fn try_fold(&mut self, init: B, mut f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: B, mut f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { let acc = match self.peeked.take() { Some(None) => return Try::from_ok(init), @@ -1331,7 +1449,8 @@ impl Iterator for Peekable { #[inline] fn fold(self, init: Acc, mut fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { let acc = match self.peeked { Some(None) => return init, @@ -1343,15 +1462,21 @@ impl Iterator for Peekable { } #[stable(feature = "double_ended_peek_iterator", since = "1.38.0")] -impl DoubleEndedIterator for Peekable where I: DoubleEndedIterator { +impl DoubleEndedIterator for Peekable +where + I: DoubleEndedIterator, +{ #[inline] fn next_back(&mut self) -> Option { self.iter.next_back().or_else(|| self.peeked.take().and_then(|x| x)) } #[inline] - fn try_rfold(&mut self, init: B, mut f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: B, mut f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { match self.peeked.take() { Some(None) => Try::from_ok(init), @@ -1368,7 +1493,8 @@ impl DoubleEndedIterator for Peekable where I: DoubleEndedIterator { #[inline] fn rfold(self, init: Acc, mut fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { match self.peeked { Some(None) => init, @@ -1457,16 +1583,14 @@ impl SkipWhile { #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for SkipWhile { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("SkipWhile") - .field("iter", &self.iter) - .field("flag", &self.flag) - .finish() + f.debug_struct("SkipWhile").field("iter", &self.iter).field("flag", &self.flag).finish() } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for SkipWhile - where P: FnMut(&I::Item) -> bool +where + P: FnMut(&I::Item) -> bool, { type Item = I::Item; @@ -1498,8 +1622,11 @@ impl Iterator for SkipWhile } #[inline] - fn try_fold(&mut self, mut init: Acc, mut fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, mut init: Acc, mut fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { if !self.flag { match self.next() { @@ -1512,7 +1639,8 @@ impl Iterator for SkipWhile #[inline] fn fold(mut self, mut init: Acc, mut fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { if !self.flag { match self.next() { @@ -1526,7 +1654,11 @@ impl Iterator for SkipWhile #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for SkipWhile - where I: FusedIterator, P: FnMut(&I::Item) -> bool {} +where + I: FusedIterator, + P: FnMut(&I::Item) -> bool, +{ +} /// An iterator that only accepts elements while `predicate` returns `true`. /// @@ -1552,16 +1684,14 @@ impl TakeWhile { #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for TakeWhile { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("TakeWhile") - .field("iter", &self.iter) - .field("flag", &self.flag) - .finish() + f.debug_struct("TakeWhile").field("iter", &self.iter).field("flag", &self.flag).finish() } } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for TakeWhile - where P: FnMut(&I::Item) -> bool +where + P: FnMut(&I::Item) -> bool, { type Item = I::Item; @@ -1591,8 +1721,11 @@ impl Iterator for TakeWhile } #[inline] - fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { fn check<'a, T, Acc, R: Try>( flag: &'a mut bool, @@ -1621,7 +1754,11 @@ impl Iterator for TakeWhile #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for TakeWhile - where I: FusedIterator, P: FnMut(&I::Item) -> bool {} +where + I: FusedIterator, + P: FnMut(&I::Item) -> bool, +{ +} /// An iterator that skips over `n` elements of `iter`. /// @@ -1635,7 +1772,7 @@ impl FusedIterator for TakeWhile #[stable(feature = "rust1", since = "1.0.0")] pub struct Skip { iter: I, - n: usize + n: usize, } impl Skip { pub(super) fn new(iter: I, n: usize) -> Skip { @@ -1644,7 +1781,10 @@ impl Skip { } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Skip where I: Iterator { +impl Iterator for Skip +where + I: Iterator, +{ type Item = ::Item; #[inline] @@ -1667,7 +1807,7 @@ impl Iterator for Skip where I: Iterator { let to_skip = self.n; self.n = 0; // nth(n) skips n+1 - if self.iter.nth(to_skip-1).is_none() { + if self.iter.nth(to_skip - 1).is_none() { return None; } self.iter.nth(n) @@ -1675,8 +1815,14 @@ impl Iterator for Skip where I: Iterator { } #[inline] - fn count(self) -> usize { - self.iter.count().saturating_sub(self.n) + fn count(mut self) -> usize { + if self.n > 0 { + // nth(n) skips n+1 + if self.iter.nth(self.n - 1).is_none() { + return 0; + } + } + self.iter.count() } #[inline] @@ -1708,8 +1854,11 @@ impl Iterator for Skip where I: Iterator { } #[inline] - fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { let n = self.n; self.n = 0; @@ -1724,7 +1873,8 @@ impl Iterator for Skip where I: Iterator { #[inline] fn fold(mut self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { if self.n > 0 { // nth(n) skips n+1 @@ -1740,13 +1890,12 @@ impl Iterator for Skip where I: Iterator { impl ExactSizeIterator for Skip where I: ExactSizeIterator {} #[stable(feature = "double_ended_skip_iterator", since = "1.9.0")] -impl DoubleEndedIterator for Skip where I: DoubleEndedIterator + ExactSizeIterator { +impl DoubleEndedIterator for Skip +where + I: DoubleEndedIterator + ExactSizeIterator, +{ fn next_back(&mut self) -> Option { - if self.len() > 0 { - self.iter.next_back() - } else { - None - } + if self.len() > 0 { self.iter.next_back() } else { None } } #[inline] @@ -1757,14 +1906,17 @@ impl DoubleEndedIterator for Skip where I: DoubleEndedIterator + ExactSize } else { if len > 0 { // consume the original iterator - self.iter.nth_back(len-1); + self.iter.nth_back(len - 1); } None } } - fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { fn check>( mut n: usize, @@ -1773,8 +1925,7 @@ impl DoubleEndedIterator for Skip where I: DoubleEndedIterator + ExactSize move |acc, x| { n -= 1; let r = fold(acc, x); - if n == 0 { LoopState::Break(r) } - else { LoopState::from_try(r) } + if n == 0 { LoopState::Break(r) } else { LoopState::from_try(r) } } } @@ -1802,7 +1953,7 @@ impl FusedIterator for Skip where I: FusedIterator {} #[stable(feature = "rust1", since = "1.0.0")] pub struct Take { pub(super) iter: I, - pub(super) n: usize + pub(super) n: usize, } impl Take { pub(super) fn new(iter: I, n: usize) -> Take { @@ -1811,7 +1962,10 @@ impl Take { } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Take where I: Iterator{ +impl Iterator for Take +where + I: Iterator, +{ type Item = ::Item; #[inline] @@ -1850,15 +2004,18 @@ impl Iterator for Take where I: Iterator{ let upper = match upper { Some(x) if x < self.n => Some(x), - _ => Some(self.n) + _ => Some(self.n), }; (lower, upper) } #[inline] - fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { fn check<'a, T, Acc, R: Try>( n: &'a mut usize, @@ -1867,8 +2024,7 @@ impl Iterator for Take where I: Iterator{ move |acc, x| { *n -= 1; let r = fold(acc, x); - if *n == 0 { LoopState::Break(r) } - else { LoopState::from_try(r) } + if *n == 0 { LoopState::Break(r) } else { LoopState::from_try(r) } } } @@ -1882,7 +2038,10 @@ impl Iterator for Take where I: Iterator{ } #[stable(feature = "double_ended_take_iterator", since = "1.38.0")] -impl DoubleEndedIterator for Take where I: DoubleEndedIterator + ExactSizeIterator { +impl DoubleEndedIterator for Take +where + I: DoubleEndedIterator + ExactSizeIterator, +{ #[inline] fn next_back(&mut self) -> Option { if self.n == 0 { @@ -1910,8 +2069,11 @@ impl DoubleEndedIterator for Take where I: DoubleEndedIterator + ExactSize } #[inline] - fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { if self.n == 0 { Try::from_ok(init) @@ -1959,15 +2121,13 @@ impl Scan { #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for Scan { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Scan") - .field("iter", &self.iter) - .field("state", &self.state) - .finish() + f.debug_struct("Scan").field("iter", &self.iter).field("state", &self.state).finish() } } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Scan where +impl Iterator for Scan +where I: Iterator, F: FnMut(&mut St, I::Item) -> Option, { @@ -1986,19 +2146,20 @@ impl Iterator for Scan where } #[inline] - fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { fn scan<'a, T, St, B, Acc, R: Try>( state: &'a mut St, f: &'a mut impl FnMut(&mut St, T) -> Option, mut fold: impl FnMut(Acc, B) -> R + 'a, ) -> impl FnMut(Acc, T) -> LoopState + 'a { - move |acc, x| { - match f(state, x) { - None => LoopState::Break(Try::from_ok(acc)), - Some(x) => LoopState::from_try(fold(acc, x)), - } + move |acc, x| match f(state, x) { + None => LoopState::Break(Try::from_ok(acc)), + Some(x) => LoopState::from_try(fold(acc, x)), } } @@ -2021,7 +2182,7 @@ impl Iterator for Scan where #[stable(feature = "rust1", since = "1.0.0")] pub struct Fuse { iter: I, - done: bool + done: bool, } impl Fuse { pub(super) fn new(iter: I) -> Fuse { @@ -2033,7 +2194,10 @@ impl Fuse { impl FusedIterator for Fuse where I: Iterator {} #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Fuse where I: Iterator { +impl Iterator for Fuse +where + I: Iterator, +{ type Item = ::Item; #[inline] @@ -2060,34 +2224,25 @@ impl Iterator for Fuse where I: Iterator { #[inline] default fn last(self) -> Option { - if self.done { - None - } else { - self.iter.last() - } + if self.done { None } else { self.iter.last() } } #[inline] default fn count(self) -> usize { - if self.done { - 0 - } else { - self.iter.count() - } + if self.done { 0 } else { self.iter.count() } } #[inline] default fn size_hint(&self) -> (usize, Option) { - if self.done { - (0, Some(0)) - } else { - self.iter.size_hint() - } + if self.done { (0, Some(0)) } else { self.iter.size_hint() } } #[inline] - default fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + default fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { if self.done { Try::from_ok(init) @@ -2100,18 +2255,18 @@ impl Iterator for Fuse where I: Iterator { #[inline] default fn fold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { - if self.done { - init - } else { - self.iter.fold(init, fold) - } + if self.done { init } else { self.iter.fold(init, fold) } } } #[stable(feature = "rust1", since = "1.0.0")] -impl DoubleEndedIterator for Fuse where I: DoubleEndedIterator { +impl DoubleEndedIterator for Fuse +where + I: DoubleEndedIterator, +{ #[inline] default fn next_back(&mut self) -> Option<::Item> { if self.done { @@ -2135,8 +2290,11 @@ impl DoubleEndedIterator for Fuse where I: DoubleEndedIterator { } #[inline] - default fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + default fn try_rfold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { if self.done { Try::from_ok(init) @@ -2149,18 +2307,16 @@ impl DoubleEndedIterator for Fuse where I: DoubleEndedIterator { #[inline] default fn rfold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { - if self.done { - init - } else { - self.iter.rfold(init, fold) - } + if self.done { init } else { self.iter.rfold(init, fold) } } } unsafe impl TrustedRandomAccess for Fuse - where I: TrustedRandomAccess, +where + I: TrustedRandomAccess, { unsafe fn get_unchecked(&mut self, i: usize) -> I::Item { self.iter.get_unchecked(i) @@ -2172,7 +2328,10 @@ unsafe impl TrustedRandomAccess for Fuse } #[stable(feature = "fused", since = "1.26.0")] -impl Iterator for Fuse where I: FusedIterator { +impl Iterator for Fuse +where + I: FusedIterator, +{ #[inline] fn next(&mut self) -> Option<::Item> { self.iter.next() @@ -2199,15 +2358,19 @@ impl Iterator for Fuse where I: FusedIterator { } #[inline] - fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_fold(init, fold) } #[inline] fn fold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { self.iter.fold(init, fold) } @@ -2215,7 +2378,8 @@ impl Iterator for Fuse where I: FusedIterator { #[stable(feature = "fused", since = "1.26.0")] impl DoubleEndedIterator for Fuse - where I: DoubleEndedIterator + FusedIterator +where + I: DoubleEndedIterator + FusedIterator, { #[inline] fn next_back(&mut self) -> Option<::Item> { @@ -2228,23 +2392,29 @@ impl DoubleEndedIterator for Fuse } #[inline] - fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_rfold(init, fold) } #[inline] fn rfold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { self.iter.rfold(init, fold) } } - #[stable(feature = "rust1", since = "1.0.0")] -impl ExactSizeIterator for Fuse where I: ExactSizeIterator { +impl ExactSizeIterator for Fuse +where + I: ExactSizeIterator, +{ fn len(&self) -> usize { self.iter.len() } @@ -2278,13 +2448,14 @@ impl Inspect { #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for Inspect { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Inspect") - .field("iter", &self.iter) - .finish() + f.debug_struct("Inspect").field("iter", &self.iter).finish() } } -impl Inspect where F: FnMut(&I::Item) { +impl Inspect +where + F: FnMut(&I::Item), +{ #[inline] fn do_inspect(&mut self, elt: Option) -> Option { if let Some(ref a) = elt { @@ -2299,18 +2470,27 @@ fn inspect_fold( mut f: impl FnMut(&T), mut fold: impl FnMut(Acc, T) -> Acc, ) -> impl FnMut(Acc, T) -> Acc { - move |acc, item| { f(&item); fold(acc, item) } + move |acc, item| { + f(&item); + fold(acc, item) + } } fn inspect_try_fold<'a, T, Acc, R>( f: &'a mut impl FnMut(&T), mut fold: impl FnMut(Acc, T) -> R + 'a, ) -> impl FnMut(Acc, T) -> R + 'a { - move |acc, item| { f(&item); fold(acc, item) } + move |acc, item| { + f(&item); + fold(acc, item) + } } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Inspect where F: FnMut(&I::Item) { +impl Iterator for Inspect +where + F: FnMut(&I::Item), +{ type Item = I::Item; #[inline] @@ -2325,15 +2505,19 @@ impl Iterator for Inspect where F: FnMut(&I::Item) { } #[inline] - fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_fold(init, inspect_try_fold(&mut self.f, fold)) } #[inline] fn fold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { self.iter.fold(init, inspect_fold(self.f, fold)) } @@ -2341,7 +2525,8 @@ impl Iterator for Inspect where F: FnMut(&I::Item) { #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Inspect - where F: FnMut(&I::Item), +where + F: FnMut(&I::Item), { #[inline] fn next_back(&mut self) -> Option { @@ -2350,15 +2535,19 @@ impl DoubleEndedIterator for Inspect } #[inline] - fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: Acc, fold: Fold) -> R + where + Self: Sized, + Fold: FnMut(Acc, Self::Item) -> R, + R: Try, { self.iter.try_rfold(init, inspect_try_fold(&mut self.f, fold)) } #[inline] fn rfold(self, init: Acc, fold: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { self.iter.rfold(init, inspect_fold(self.f, fold)) } @@ -2366,7 +2555,8 @@ impl DoubleEndedIterator for Inspect #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Inspect - where F: FnMut(&I::Item) +where + F: FnMut(&I::Item), { fn len(&self) -> usize { self.iter.len() @@ -2378,8 +2568,7 @@ impl ExactSizeIterator for Inspect } #[stable(feature = "fused", since = "1.26.0")] -impl FusedIterator for Inspect - where F: FnMut(&I::Item) {} +impl FusedIterator for Inspect where F: FnMut(&I::Item) {} /// An iterator adapter that produces output as long as the underlying /// iterator produces `Result::Ok` values. @@ -2400,16 +2589,14 @@ where for<'a> F: FnMut(ResultShunt<'a, I, E>) -> U, { let mut error = Ok(()); - let shunt = ResultShunt { - iter, - error: &mut error, - }; + let shunt = ResultShunt { iter, error: &mut error }; let value = f(shunt); error.map(|()| value) } impl Iterator for ResultShunt<'_, I, E> - where I: Iterator> +where + I: Iterator>, { type Item = T; diff --git a/src/libcore/iter/adapters/zip.rs b/src/libcore/iter/adapters/zip.rs index 14d9d5499b..b13e12e2e8 100644 --- a/src/libcore/iter/adapters/zip.rs +++ b/src/libcore/iter/adapters/zip.rs @@ -2,7 +2,7 @@ use crate::cmp; -use super::super::{Iterator, DoubleEndedIterator, ExactSizeIterator, FusedIterator, TrustedLen}; +use super::super::{DoubleEndedIterator, ExactSizeIterator, FusedIterator, Iterator, TrustedLen}; /// An iterator that iterates two other iterators simultaneously. /// @@ -27,7 +27,9 @@ impl Zip { } fn super_nth(&mut self, mut n: usize) -> Option<(A::Item, B::Item)> { while let Some(x) = Iterator::next(self) { - if n == 0 { return Some(x) } + if n == 0 { + return Some(x); + } n -= 1; } None @@ -35,7 +37,10 @@ impl Zip { } #[stable(feature = "rust1", since = "1.0.0")] -impl Iterator for Zip where A: Iterator, B: Iterator +impl Iterator for Zip +where + A: Iterator, + B: Iterator, { type Item = (A::Item, B::Item); @@ -56,7 +61,8 @@ impl Iterator for Zip where A: Iterator, B: Iterator } #[stable(feature = "rust1", since = "1.0.0")] -impl DoubleEndedIterator for Zip where +impl DoubleEndedIterator for Zip +where A: DoubleEndedIterator + ExactSizeIterator, B: DoubleEndedIterator + ExactSizeIterator, { @@ -75,14 +81,17 @@ trait ZipImpl { fn size_hint(&self) -> (usize, Option); fn nth(&mut self, n: usize) -> Option; fn next_back(&mut self) -> Option - where A: DoubleEndedIterator + ExactSizeIterator, - B: DoubleEndedIterator + ExactSizeIterator; + where + A: DoubleEndedIterator + ExactSizeIterator, + B: DoubleEndedIterator + ExactSizeIterator; } // General Zip impl #[doc(hidden)] impl ZipImpl for Zip - where A: Iterator, B: Iterator +where + A: Iterator, + B: Iterator, { type Item = (A::Item, B::Item); default fn new(a: A, b: B) -> Self { @@ -90,7 +99,7 @@ impl ZipImpl for Zip a, b, index: 0, // unused - len: 0, // unused + len: 0, // unused } } @@ -108,17 +117,22 @@ impl ZipImpl for Zip #[inline] default fn next_back(&mut self) -> Option<(A::Item, B::Item)> - where A: DoubleEndedIterator + ExactSizeIterator, - B: DoubleEndedIterator + ExactSizeIterator + where + A: DoubleEndedIterator + ExactSizeIterator, + B: DoubleEndedIterator + ExactSizeIterator, { let a_sz = self.a.len(); let b_sz = self.b.len(); if a_sz != b_sz { // Adjust a, b to equal length if a_sz > b_sz { - for _ in 0..a_sz - b_sz { self.a.next_back(); } + for _ in 0..a_sz - b_sz { + self.a.next_back(); + } } else { - for _ in 0..b_sz - a_sz { self.b.next_back(); } + for _ in 0..b_sz - a_sz { + self.b.next_back(); + } } } match (self.a.next_back(), self.b.next_back()) { @@ -136,10 +150,10 @@ impl ZipImpl for Zip let lower = cmp::min(a_lower, b_lower); let upper = match (a_upper, b_upper) { - (Some(x), Some(y)) => Some(cmp::min(x,y)), + (Some(x), Some(y)) => Some(cmp::min(x, y)), (Some(x), None) => Some(x), (None, Some(y)) => Some(y), - (None, None) => None + (None, None) => None, }; (lower, upper) @@ -148,16 +162,13 @@ impl ZipImpl for Zip #[doc(hidden)] impl ZipImpl for Zip - where A: TrustedRandomAccess, B: TrustedRandomAccess +where + A: TrustedRandomAccess, + B: TrustedRandomAccess, { fn new(a: A, b: B) -> Self { let len = cmp::min(a.len(), b.len()); - Zip { - a, - b, - index: 0, - len, - } + Zip { a, b, index: 0, len } } #[inline] @@ -165,9 +176,7 @@ impl ZipImpl for Zip if self.index < self.len { let i = self.index; self.index += 1; - unsafe { - Some((self.a.get_unchecked(i), self.b.get_unchecked(i))) - } + unsafe { Some((self.a.get_unchecked(i), self.b.get_unchecked(i))) } } else if A::may_have_side_effect() && self.index < self.a.len() { // match the base implementation's potential side effects unsafe { @@ -194,10 +203,14 @@ impl ZipImpl for Zip let i = self.index; self.index += 1; if A::may_have_side_effect() { - unsafe { self.a.get_unchecked(i); } + unsafe { + self.a.get_unchecked(i); + } } if B::may_have_side_effect() { - unsafe { self.b.get_unchecked(i); } + unsafe { + self.b.get_unchecked(i); + } } } @@ -206,8 +219,9 @@ impl ZipImpl for Zip #[inline] fn next_back(&mut self) -> Option<(A::Item, B::Item)> - where A: DoubleEndedIterator + ExactSizeIterator, - B: DoubleEndedIterator + ExactSizeIterator + where + A: DoubleEndedIterator + ExactSizeIterator, + B: DoubleEndedIterator + ExactSizeIterator, { // Adjust a, b to equal length if A::may_have_side_effect() { @@ -229,9 +243,7 @@ impl ZipImpl for Zip if self.index < self.len { self.len -= 1; let i = self.len; - unsafe { - Some((self.a.get_unchecked(i), self.b.get_unchecked(i))) - } + unsafe { Some((self.a.get_unchecked(i), self.b.get_unchecked(i))) } } else { None } @@ -240,12 +252,17 @@ impl ZipImpl for Zip #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for Zip - where A: ExactSizeIterator, B: ExactSizeIterator {} +where + A: ExactSizeIterator, + B: ExactSizeIterator, +{ +} #[doc(hidden)] unsafe impl TrustedRandomAccess for Zip - where A: TrustedRandomAccess, - B: TrustedRandomAccess, +where + A: TrustedRandomAccess, + B: TrustedRandomAccess, { unsafe fn get_unchecked(&mut self, i: usize) -> (A::Item, B::Item) { (self.a.get_unchecked(i), self.b.get_unchecked(i)) @@ -258,12 +275,19 @@ unsafe impl TrustedRandomAccess for Zip #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for Zip - where A: FusedIterator, B: FusedIterator, {} +where + A: FusedIterator, + B: FusedIterator, +{ +} #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl TrustedLen for Zip - where A: TrustedLen, B: TrustedLen, -{} +where + A: TrustedLen, + B: TrustedLen, +{ +} /// An iterator whose items are random-accessible efficiently /// @@ -275,7 +299,7 @@ unsafe impl TrustedLen for Zip /// .get_unchecked() must return distinct mutable references for distinct /// indices (if applicable), and must return a valid reference if index is in /// 0..self.len(). -pub(crate) unsafe trait TrustedRandomAccess : ExactSizeIterator { +pub(crate) unsafe trait TrustedRandomAccess: ExactSizeIterator { unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item; /// Returns `true` if getting an iterator element may have /// side effects. Remember to take inner iterators into account. diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index fac6ff0f06..0d5af3986f 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -216,6 +216,11 @@ //! Common iterator adapters include [`map`], [`take`], and [`filter`]. //! For more, see their documentation. //! +//! If an iterator adapter panics, the iterator will be in an unspecified (but +//! memory safe) state. This state is also not guaranteed to stay the same +//! across versions of Rust, so you should avoid relying on the exact values +//! returned by an iterator which panicked. +//! //! [`map`]: trait.Iterator.html#method.map //! [`take`]: trait.Iterator.html#method.take //! [`filter`]: trait.Iterator.html#method.filter @@ -309,56 +314,58 @@ use crate::ops::Try; #[stable(feature = "rust1", since = "1.0.0")] pub use self::traits::Iterator; -#[unstable(feature = "step_trait", - reason = "likely to be replaced by finer-grained traits", - issue = "42168")] +#[unstable( + feature = "step_trait", + reason = "likely to be replaced by finer-grained traits", + issue = "42168" +)] pub use self::range::Step; -#[stable(feature = "rust1", since = "1.0.0")] -pub use self::sources::{Repeat, repeat}; -#[stable(feature = "iterator_repeat_with", since = "1.28.0")] -pub use self::sources::{RepeatWith, repeat_with}; #[stable(feature = "iter_empty", since = "1.2.0")] -pub use self::sources::{Empty, empty}; +pub use self::sources::{empty, Empty}; +#[stable(feature = "iter_from_fn", since = "1.34.0")] +pub use self::sources::{from_fn, FromFn}; #[stable(feature = "iter_once", since = "1.2.0")] -pub use self::sources::{Once, once}; +pub use self::sources::{once, Once}; #[unstable(feature = "iter_once_with", issue = "57581")] -pub use self::sources::{OnceWith, once_with}; -#[stable(feature = "iter_from_fn", since = "1.34.0")] -pub use self::sources::{FromFn, from_fn}; +pub use self::sources::{once_with, OnceWith}; +#[stable(feature = "rust1", since = "1.0.0")] +pub use self::sources::{repeat, Repeat}; +#[stable(feature = "iterator_repeat_with", since = "1.28.0")] +pub use self::sources::{repeat_with, RepeatWith}; #[stable(feature = "iter_successors", since = "1.34.0")] -pub use self::sources::{Successors, successors}; +pub use self::sources::{successors, Successors}; -#[stable(feature = "rust1", since = "1.0.0")] -pub use self::traits::{FromIterator, IntoIterator, DoubleEndedIterator, Extend}; -#[stable(feature = "rust1", since = "1.0.0")] -pub use self::traits::{ExactSizeIterator, Sum, Product}; #[stable(feature = "fused", since = "1.26.0")] pub use self::traits::FusedIterator; #[unstable(feature = "trusted_len", issue = "37572")] pub use self::traits::TrustedLen; - #[stable(feature = "rust1", since = "1.0.0")] -pub use self::adapters::{Rev, Cycle, Chain, Zip, Map, Filter, FilterMap, Enumerate}; +pub use self::traits::{DoubleEndedIterator, Extend, FromIterator, IntoIterator}; #[stable(feature = "rust1", since = "1.0.0")] -pub use self::adapters::{Peekable, SkipWhile, TakeWhile, Skip, Take, Scan, FlatMap}; -#[stable(feature = "rust1", since = "1.0.0")] -pub use self::adapters::{Fuse, Inspect}; +pub use self::traits::{ExactSizeIterator, Product, Sum}; + #[stable(feature = "iter_cloned", since = "1.1.0")] pub use self::adapters::Cloned; -#[stable(feature = "iterator_step_by", since = "1.28.0")] -pub use self::adapters::StepBy; -#[stable(feature = "iterator_flatten", since = "1.29.0")] -pub use self::adapters::Flatten; #[stable(feature = "iter_copied", since = "1.36.0")] pub use self::adapters::Copied; +#[stable(feature = "iterator_flatten", since = "1.29.0")] +pub use self::adapters::Flatten; +#[stable(feature = "iterator_step_by", since = "1.28.0")] +pub use self::adapters::StepBy; +#[stable(feature = "rust1", since = "1.0.0")] +pub use self::adapters::{Chain, Cycle, Enumerate, Filter, FilterMap, Map, Rev, Zip}; +#[stable(feature = "rust1", since = "1.0.0")] +pub use self::adapters::{FlatMap, Peekable, Scan, Skip, SkipWhile, Take, TakeWhile}; +#[stable(feature = "rust1", since = "1.0.0")] +pub use self::adapters::{Fuse, Inspect}; -pub(crate) use self::adapters::{TrustedRandomAccess, process_results}; +pub(crate) use self::adapters::{process_results, TrustedRandomAccess}; +mod adapters; mod range; mod sources; mod traits; -mod adapters; /// Used to make try_fold closures more like normal loops #[derive(PartialEq)] @@ -378,9 +385,13 @@ impl Try for LoopState { } } #[inline] - fn from_error(v: Self::Error) -> Self { LoopState::Break(v) } + fn from_error(v: Self::Error) -> Self { + LoopState::Break(v) + } #[inline] - fn from_ok(v: Self::Ok) -> Self { LoopState::Continue(v) } + fn from_ok(v: Self::Ok) -> Self { + LoopState::Continue(v) + } } impl LoopState { diff --git a/src/libcore/iter/range.rs b/src/libcore/iter/range.rs index 63036f516a..eac3c107d2 100644 --- a/src/libcore/iter/range.rs +++ b/src/libcore/iter/range.rs @@ -9,9 +9,11 @@ use super::{FusedIterator, TrustedLen}; /// /// The `steps_between` function provides a way to efficiently compare /// two `Step` objects. -#[unstable(feature = "step_trait", - reason = "likely to be replaced by finer-grained traits", - issue = "42168")] +#[unstable( + feature = "step_trait", + reason = "likely to be replaced by finer-grained traits", + issue = "42168" +)] pub trait Step: Clone + PartialOrd + Sized { /// Returns the number of steps between two step objects. The count is /// inclusive of `start` and exclusive of `end`. @@ -170,8 +172,8 @@ macro_rules! step_impl_signed { } step_impl_unsigned!(usize u8 u16 u32 u64 u128); -step_impl_signed!([isize: usize] [i8: u8] [i16: u16]); -step_impl_signed!([i32: u32] [i64: u64] [i128: u128]); +step_impl_signed!([isize: usize][i8: u8][i16: u16]); +step_impl_signed!([i32: u32][i64: u64][i128: u128]); macro_rules! range_exact_iter_impl { ($($t:ty)*) => ($( @@ -227,7 +229,7 @@ impl Iterator for ops::Range { fn size_hint(&self) -> (usize, Option) { match Step::steps_between(&self.start, &self.end) { Some(hint) => (hint, Some(hint)), - None => (usize::MAX, None) + None => (usize::MAX, None), } } @@ -236,7 +238,7 @@ impl Iterator for ops::Range { if let Some(plus_n) = self.start.add_usize(n) { if plus_n < self.end { self.start = plus_n.add_one(); - return Some(plus_n) + return Some(plus_n); } } @@ -291,7 +293,7 @@ impl DoubleEndedIterator for ops::Range { if let Some(minus_n) = self.end.sub_usize(n) { if minus_n > self.start { self.end = minus_n.sub_one(); - return Some(self.end.clone()) + return Some(self.end.clone()); } } @@ -396,7 +398,9 @@ impl Iterator for ops::RangeInclusive { #[inline] fn try_fold(&mut self, init: B, mut f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { self.compute_is_empty(); @@ -484,8 +488,11 @@ impl DoubleEndedIterator for ops::RangeInclusive { } #[inline] - fn try_rfold(&mut self, init: B, mut f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_rfold(&mut self, init: B, mut f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { self.compute_is_empty(); diff --git a/src/libcore/iter/sources.rs b/src/libcore/iter/sources.rs index 127b778e62..25dfc573e4 100644 --- a/src/libcore/iter/sources.rs +++ b/src/libcore/iter/sources.rs @@ -208,6 +208,11 @@ pub fn repeat_with A>(repeater: F) -> RepeatWith { #[stable(feature = "iter_empty", since = "1.2.0")] pub struct Empty(marker::PhantomData); +#[stable(feature = "iter_empty_send_sync", since = "1.42.0")] +unsafe impl Send for Empty {} +#[stable(feature = "iter_empty_send_sync", since = "1.42.0")] +unsafe impl Sync for Empty {} + #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for Empty { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -281,7 +286,7 @@ impl Default for Empty { /// assert_eq!(None, nope.next()); /// ``` #[stable(feature = "iter_empty", since = "1.2.0")] -#[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_iter_empty", since = "1.32.0"))] +#[rustc_const_stable(feature = "const_iter_empty", since = "1.32.0")] pub const fn empty() -> Empty { Empty(marker::PhantomData) } diff --git a/src/libcore/iter/traits/accum.rs b/src/libcore/iter/traits/accum.rs index 65af671ddf..55f30794af 100644 --- a/src/libcore/iter/traits/accum.rs +++ b/src/libcore/iter/traits/accum.rs @@ -44,28 +44,28 @@ macro_rules! integer_sum_product { (@impls $zero:expr, $one:expr, #[$attr:meta], $($a:ty)*) => ($( #[$attr] impl Sum for $a { - fn sum>(iter: I) -> $a { + fn sum>(iter: I) -> Self { iter.fold($zero, Add::add) } } #[$attr] impl Product for $a { - fn product>(iter: I) -> $a { + fn product>(iter: I) -> Self { iter.fold($one, Mul::mul) } } #[$attr] impl<'a> Sum<&'a $a> for $a { - fn sum>(iter: I) -> $a { + fn sum>(iter: I) -> Self { iter.fold($zero, Add::add) } } #[$attr] impl<'a> Product<&'a $a> for $a { - fn product>(iter: I) -> $a { + fn product>(iter: I) -> Self { iter.fold($one, Mul::mul) } } @@ -84,28 +84,28 @@ macro_rules! float_sum_product { ($($a:ident)*) => ($( #[stable(feature = "iter_arith_traits", since = "1.12.0")] impl Sum for $a { - fn sum>(iter: I) -> $a { + fn sum>(iter: I) -> Self { iter.fold(0.0, Add::add) } } #[stable(feature = "iter_arith_traits", since = "1.12.0")] impl Product for $a { - fn product>(iter: I) -> $a { + fn product>(iter: I) -> Self { iter.fold(1.0, Mul::mul) } } #[stable(feature = "iter_arith_traits", since = "1.12.0")] impl<'a> Sum<&'a $a> for $a { - fn sum>(iter: I) -> $a { + fn sum>(iter: I) -> Self { iter.fold(0.0, Add::add) } } #[stable(feature = "iter_arith_traits", since = "1.12.0")] impl<'a> Product<&'a $a> for $a { - fn product>(iter: I) -> $a { + fn product>(iter: I) -> Self { iter.fold(1.0, Mul::mul) } } diff --git a/src/libcore/iter/traits/iterator.rs b/src/libcore/iter/traits/iterator.rs index 61e8b07511..21a569867b 100644 --- a/src/libcore/iter/traits/iterator.rs +++ b/src/libcore/iter/traits/iterator.rs @@ -1,13 +1,15 @@ +// ignore-tidy-filelength + use crate::cmp::{self, Ordering}; use crate::ops::{Add, Try}; use super::super::LoopState; -use super::super::{Chain, Cycle, Copied, Cloned, Enumerate, Filter, FilterMap, Fuse}; -use super::super::{Flatten, FlatMap}; -use super::super::{Inspect, Map, Peekable, Scan, Skip, SkipWhile, StepBy, Take, TakeWhile, Rev}; -use super::super::{Zip, Sum, Product, FromIterator}; +use super::super::{Chain, Cloned, Copied, Cycle, Enumerate, Filter, FilterMap, Fuse}; +use super::super::{FlatMap, Flatten}; +use super::super::{FromIterator, Product, Sum, Zip}; +use super::super::{Inspect, Map, Peekable, Rev, Scan, Skip, SkipWhile, StepBy, Take, TakeWhile}; -fn _assert_is_object_safe(_: &dyn Iterator) {} +fn _assert_is_object_safe(_: &dyn Iterator) {} /// An interface for dealing with iterators. /// @@ -20,71 +22,71 @@ fn _assert_is_object_safe(_: &dyn Iterator) {} #[stable(feature = "rust1", since = "1.0.0")] #[rustc_on_unimplemented( on( - _Self="[std::ops::Range; 1]", - label="if you meant to iterate between two values, remove the square brackets", - note="`[start..end]` is an array of one `Range`; you might have meant to have a `Range` \ - without the brackets: `start..end`" + _Self = "[std::ops::Range; 1]", + label = "if you meant to iterate between two values, remove the square brackets", + note = "`[start..end]` is an array of one `Range`; you might have meant to have a `Range` \ + without the brackets: `start..end`" ), on( - _Self="[std::ops::RangeFrom; 1]", - label="if you meant to iterate from a value onwards, remove the square brackets", - note="`[start..]` is an array of one `RangeFrom`; you might have meant to have a \ + _Self = "[std::ops::RangeFrom; 1]", + label = "if you meant to iterate from a value onwards, remove the square brackets", + note = "`[start..]` is an array of one `RangeFrom`; you might have meant to have a \ `RangeFrom` without the brackets: `start..`, keeping in mind that iterating over an \ unbounded iterator will run forever unless you `break` or `return` from within the \ loop" ), on( - _Self="[std::ops::RangeTo; 1]", - label="if you meant to iterate until a value, remove the square brackets and add a \ - starting value", - note="`[..end]` is an array of one `RangeTo`; you might have meant to have a bounded \ - `Range` without the brackets: `0..end`" + _Self = "[std::ops::RangeTo; 1]", + label = "if you meant to iterate until a value, remove the square brackets and add a \ + starting value", + note = "`[..end]` is an array of one `RangeTo`; you might have meant to have a bounded \ + `Range` without the brackets: `0..end`" ), on( - _Self="[std::ops::RangeInclusive; 1]", - label="if you meant to iterate between two values, remove the square brackets", - note="`[start..=end]` is an array of one `RangeInclusive`; you might have meant to have a \ + _Self = "[std::ops::RangeInclusive; 1]", + label = "if you meant to iterate between two values, remove the square brackets", + note = "`[start..=end]` is an array of one `RangeInclusive`; you might have meant to have a \ `RangeInclusive` without the brackets: `start..=end`" ), on( - _Self="[std::ops::RangeToInclusive; 1]", - label="if you meant to iterate until a value (including it), remove the square brackets \ - and add a starting value", - note="`[..=end]` is an array of one `RangeToInclusive`; you might have meant to have a \ - bounded `RangeInclusive` without the brackets: `0..=end`" + _Self = "[std::ops::RangeToInclusive; 1]", + label = "if you meant to iterate until a value (including it), remove the square brackets \ + and add a starting value", + note = "`[..=end]` is an array of one `RangeToInclusive`; you might have meant to have a \ + bounded `RangeInclusive` without the brackets: `0..=end`" ), on( - _Self="std::ops::RangeTo", - label="if you meant to iterate until a value, add a starting value", - note="`..end` is a `RangeTo`, which cannot be iterated on; you might have meant to have a \ + _Self = "std::ops::RangeTo", + label = "if you meant to iterate until a value, add a starting value", + note = "`..end` is a `RangeTo`, which cannot be iterated on; you might have meant to have a \ bounded `Range`: `0..end`" ), on( - _Self="std::ops::RangeToInclusive", - label="if you meant to iterate until a value (including it), add a starting value", - note="`..=end` is a `RangeToInclusive`, which cannot be iterated on; you might have meant \ + _Self = "std::ops::RangeToInclusive", + label = "if you meant to iterate until a value (including it), add a starting value", + note = "`..=end` is a `RangeToInclusive`, which cannot be iterated on; you might have meant \ to have a bounded `RangeInclusive`: `0..=end`" ), on( - _Self="&str", - label="`{Self}` is not an iterator; try calling `.chars()` or `.bytes()`" + _Self = "&str", + label = "`{Self}` is not an iterator; try calling `.chars()` or `.bytes()`" ), on( - _Self="std::string::String", - label="`{Self}` is not an iterator; try calling `.chars()` or `.bytes()`" + _Self = "std::string::String", + label = "`{Self}` is not an iterator; try calling `.chars()` or `.bytes()`" ), on( - _Self="[]", - label="borrow the array with `&` or call `.iter()` on it to iterate over it", - note="arrays are not iterators, but slices like the following are: `&[1, 2, 3]`" + _Self = "[]", + label = "borrow the array with `&` or call `.iter()` on it to iterate over it", + note = "arrays are not iterators, but slices like the following are: `&[1, 2, 3]`" ), on( - _Self="{integral}", - note="if you want to iterate between `start` until a value `end`, use the exclusive range \ + _Self = "{integral}", + note = "if you want to iterate between `start` until a value `end`, use the exclusive range \ syntax `start..end` or the inclusive range syntax `start..=end`" ), - label="`{Self}` is not an iterator", - message="`{Self}` is not an iterator" + label = "`{Self}` is not an iterator", + message = "`{Self}` is not an iterator" )] #[doc(spotlight)] #[must_use = "iterators are lazy and do nothing unless consumed"] @@ -197,7 +199,9 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn size_hint(&self) -> (usize, Option) { (0, None) } + fn size_hint(&self) -> (usize, Option) { + (0, None) + } /// Consumes the iterator, counting the number of iterations and returning it. /// @@ -236,7 +240,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn count(self) -> usize where Self: Sized { + fn count(self) -> usize + where + Self: Sized, + { #[inline] fn add1(count: usize, _: T) -> usize { // Might overflow. @@ -267,7 +274,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn last(self) -> Option where Self: Sized { + fn last(self) -> Option + where + Self: Sized, + { #[inline] fn some(_: Option, x: T) -> Option { Some(x) @@ -321,7 +331,9 @@ pub trait Iterator { #[stable(feature = "rust1", since = "1.0.0")] fn nth(&mut self, mut n: usize) -> Option { for x in self { - if n == 0 { return Some(x) } + if n == 0 { + return Some(x); + } n -= 1; } None @@ -373,7 +385,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "iterator_step_by", since = "1.28.0")] - fn step_by(self, step: usize) -> StepBy where Self: Sized { + fn step_by(self, step: usize) -> StepBy + where + Self: Sized, + { StepBy::new(self, step) } @@ -443,8 +458,10 @@ pub trait Iterator { /// [`OsStr`]: ../../std/ffi/struct.OsStr.html #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn chain(self, other: U) -> Chain where - Self: Sized, U: IntoIterator, + fn chain(self, other: U) -> Chain + where + Self: Sized, + U: IntoIterator, { Chain::new(self, other.into_iter()) } @@ -521,8 +538,10 @@ pub trait Iterator { /// [`None`]: ../../std/option/enum.Option.html#variant.None #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn zip(self, other: U) -> Zip where - Self: Sized, U: IntoIterator + fn zip(self, other: U) -> Zip + where + Self: Sized, + U: IntoIterator, { Zip::new(self, other.into_iter()) } @@ -578,8 +597,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn map(self, f: F) -> Map where - Self: Sized, F: FnMut(Self::Item) -> B, + fn map(self, f: F) -> Map + where + Self: Sized, + F: FnMut(Self::Item) -> B, { Map::new(self, f) } @@ -621,8 +642,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "iterator_for_each", since = "1.21.0")] - fn for_each(self, f: F) where - Self: Sized, F: FnMut(Self::Item), + fn for_each(self, f: F) + where + Self: Sized, + F: FnMut(Self::Item), { #[inline] fn call(mut f: impl FnMut(T)) -> impl FnMut((), T) { @@ -694,8 +717,10 @@ pub trait Iterator { /// of these layers. #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn filter

(self, predicate: P) -> Filter where - Self: Sized, P: FnMut(&Self::Item) -> bool, + fn filter

(self, predicate: P) -> Filter + where + Self: Sized, + P: FnMut(&Self::Item) -> bool, { Filter::new(self, predicate) } @@ -751,8 +776,10 @@ pub trait Iterator { /// [`None`]: ../../std/option/enum.Option.html#variant.None #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn filter_map(self, f: F) -> FilterMap where - Self: Sized, F: FnMut(Self::Item) -> Option, + fn filter_map(self, f: F) -> FilterMap + where + Self: Sized, + F: FnMut(Self::Item) -> Option, { FilterMap::new(self, f) } @@ -797,7 +824,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn enumerate(self) -> Enumerate where Self: Sized { + fn enumerate(self) -> Enumerate + where + Self: Sized, + { Enumerate::new(self) } @@ -843,7 +873,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn peekable(self) -> Peekable where Self: Sized { + fn peekable(self) -> Peekable + where + Self: Sized, + { Peekable::new(self) } @@ -904,8 +937,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn skip_while

(self, predicate: P) -> SkipWhile where - Self: Sized, P: FnMut(&Self::Item) -> bool, + fn skip_while

(self, predicate: P) -> SkipWhile + where + Self: Sized, + P: FnMut(&Self::Item) -> bool, { SkipWhile::new(self, predicate) } @@ -983,8 +1018,10 @@ pub trait Iterator { /// the iteration should stop, but wasn't placed back into the iterator. #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn take_while

(self, predicate: P) -> TakeWhile where - Self: Sized, P: FnMut(&Self::Item) -> bool, + fn take_while

(self, predicate: P) -> TakeWhile + where + Self: Sized, + P: FnMut(&Self::Item) -> bool, { TakeWhile::new(self, predicate) } @@ -1008,7 +1045,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn skip(self, n: usize) -> Skip where Self: Sized { + fn skip(self, n: usize) -> Skip + where + Self: Sized, + { Skip::new(self, n) } @@ -1040,7 +1080,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn take(self, n: usize) -> Take where Self: Sized, { + fn take(self, n: usize) -> Take + where + Self: Sized, + { Take::new(self, n) } @@ -1084,7 +1127,9 @@ pub trait Iterator { #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn scan(self, initial_state: St, f: F) -> Scan - where Self: Sized, F: FnMut(&mut St, Self::Item) -> Option, + where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option, { Scan::new(self, initial_state, f) } @@ -1122,7 +1167,10 @@ pub trait Iterator { #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn flat_map(self, f: F) -> FlatMap - where Self: Sized, U: IntoIterator, F: FnMut(Self::Item) -> U, + where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U, { FlatMap::new(self, f) } @@ -1191,7 +1239,10 @@ pub trait Iterator { #[inline] #[stable(feature = "iterator_flatten", since = "1.29.0")] fn flatten(self) -> Flatten - where Self: Sized, Self::Item: IntoIterator { + where + Self: Sized, + Self::Item: IntoIterator, + { Flatten::new(self) } @@ -1251,7 +1302,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn fuse(self) -> Fuse where Self: Sized { + fn fuse(self) -> Fuse + where + Self: Sized, + { Fuse::new(self) } @@ -1332,8 +1386,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn inspect(self, f: F) -> Inspect where - Self: Sized, F: FnMut(&Self::Item), + fn inspect(self, f: F) -> Inspect + where + Self: Sized, + F: FnMut(&Self::Item), { Inspect::new(self, f) } @@ -1375,7 +1431,12 @@ pub trait Iterator { /// assert_eq!(iter.next(), None); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn by_ref(&mut self) -> &mut Self where Self: Sized { self } + fn by_ref(&mut self) -> &mut Self + where + Self: Sized, + { + self + } /// Transforms an iterator into a collection. /// @@ -1490,7 +1551,10 @@ pub trait Iterator { #[inline] #[stable(feature = "rust1", since = "1.0.0")] #[must_use = "if you really need to exhaust the iterator, consider `.for_each(drop)` instead"] - fn collect>(self) -> B where Self: Sized { + fn collect>(self) -> B + where + Self: Sized, + { FromIterator::from_iter(self) } @@ -1520,10 +1584,11 @@ pub trait Iterator { /// assert_eq!(odd, vec![1, 3]); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn partition(self, f: F) -> (B, B) where + fn partition(self, f: F) -> (B, B) + where Self: Sized, B: Default + Extend, - F: FnMut(&Self::Item) -> bool + F: FnMut(&Self::Item) -> bool, { #[inline] fn extend<'a, T, B: Extend>( @@ -1597,9 +1662,7 @@ pub trait Iterator { } #[inline] - fn is_true( - predicate: &mut impl FnMut(&T) -> bool - ) -> impl FnMut(&&mut T) -> bool + '_ { + fn is_true(predicate: &mut impl FnMut(&T) -> bool) -> impl FnMut(&&mut T) -> bool + '_ { move |x| predicate(&**x) } @@ -1702,8 +1765,11 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "iterator_try_fold", since = "1.27.0")] - fn try_fold(&mut self, init: B, mut f: F) -> R where - Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try + fn try_fold(&mut self, init: B, mut f: F) -> R + where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try, { let mut accum = init; while let Some(x) = self.next() { @@ -1741,8 +1807,11 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "iterator_try_fold", since = "1.27.0")] - fn try_for_each(&mut self, f: F) -> R where - Self: Sized, F: FnMut(Self::Item) -> R, R: Try + fn try_for_each(&mut self, f: F) -> R + where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try, { #[inline] fn call(mut f: impl FnMut(T) -> R) -> impl FnMut((), T) -> R { @@ -1821,8 +1890,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn fold(mut self, init: B, f: F) -> B where - Self: Sized, F: FnMut(B, Self::Item) -> B, + fn fold(mut self, init: B, f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, { #[inline] fn ok(mut f: impl FnMut(B, T) -> B) -> impl FnMut(B, T) -> Result { @@ -1871,14 +1942,15 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn all(&mut self, f: F) -> bool where - Self: Sized, F: FnMut(Self::Item) -> bool + fn all(&mut self, f: F) -> bool + where + Self: Sized, + F: FnMut(Self::Item) -> bool, { #[inline] fn check(mut f: impl FnMut(T) -> bool) -> impl FnMut((), T) -> LoopState<(), ()> { move |(), x| { - if f(x) { LoopState::Continue(()) } - else { LoopState::Break(()) } + if f(x) { LoopState::Continue(()) } else { LoopState::Break(()) } } } self.try_fold((), check(f)) == LoopState::Continue(()) @@ -1923,15 +1995,15 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn any(&mut self, f: F) -> bool where + fn any(&mut self, f: F) -> bool + where Self: Sized, - F: FnMut(Self::Item) -> bool + F: FnMut(Self::Item) -> bool, { #[inline] fn check(mut f: impl FnMut(T) -> bool) -> impl FnMut((), T) -> LoopState<(), ()> { move |(), x| { - if f(x) { LoopState::Break(()) } - else { LoopState::Continue(()) } + if f(x) { LoopState::Break(()) } else { LoopState::Continue(()) } } } @@ -1982,17 +2054,17 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn find

(&mut self, predicate: P) -> Option where + fn find

(&mut self, predicate: P) -> Option + where Self: Sized, P: FnMut(&Self::Item) -> bool, { #[inline] fn check( - mut predicate: impl FnMut(&T) -> bool + mut predicate: impl FnMut(&T) -> bool, ) -> impl FnMut((), T) -> LoopState<(), T> { move |(), x| { - if predicate(&x) { LoopState::Break(x) } - else { LoopState::Continue(()) } + if predicate(&x) { LoopState::Break(x) } else { LoopState::Continue(()) } } } @@ -2016,7 +2088,8 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "iterator_find_map", since = "1.30.0")] - fn find_map(&mut self, f: F) -> Option where + fn find_map(&mut self, f: F) -> Option + where Self: Sized, F: FnMut(Self::Item) -> Option, { @@ -2031,6 +2104,43 @@ pub trait Iterator { self.try_fold((), check(f)).break_value() } + /// Applies function to the elements of iterator and returns + /// the first non-none result or the first error. + /// + /// # Examples + /// + /// ``` + /// #![feature(try_find)] + /// + /// let a = ["1", "2", "lol", "NaN", "5"]; + /// + /// let is_my_num = |s: &str, search: i32| -> Result { + /// Ok(s.parse::()? == search) + /// }; + /// + /// let result = a.iter().try_find(|&&s| is_my_num(s, 2)); + /// assert_eq!(result, Ok(Some(&"2"))); + /// + /// let result = a.iter().try_find(|&&s| is_my_num(s, 5)); + /// assert!(result.is_err()); + /// ``` + #[inline] + #[unstable(feature = "try_find", reason = "new API", issue = "63178")] + fn try_find(&mut self, mut f: F) -> Result, E> + where + Self: Sized, + F: FnMut(&Self::Item) -> R, + R: Try, + { + self.try_for_each(move |x| match f(&x).into_result() { + Ok(false) => LoopState::Continue(()), + Ok(true) => LoopState::Break(Ok(x)), + Err(x) => LoopState::Break(Err(x)), + }) + .break_value() + .transpose() + } + /// Searches for an element in an iterator, returning its index. /// /// `position()` takes a closure that returns `true` or `false`. It applies @@ -2087,7 +2197,8 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn position

(&mut self, predicate: P) -> Option where + fn position

(&mut self, predicate: P) -> Option + where Self: Sized, P: FnMut(Self::Item) -> bool, { @@ -2097,8 +2208,7 @@ pub trait Iterator { ) -> impl FnMut(usize, T) -> LoopState { // The addition might panic on overflow move |i, x| { - if predicate(x) { LoopState::Break(i) } - else { LoopState::Continue(Add::add(i, 1)) } + if predicate(x) { LoopState::Break(i) } else { LoopState::Continue(Add::add(i, 1)) } } } @@ -2145,9 +2255,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn rposition

(&mut self, predicate: P) -> Option where + fn rposition

(&mut self, predicate: P) -> Option + where P: FnMut(Self::Item) -> bool, - Self: Sized + ExactSizeIterator + DoubleEndedIterator + Self: Sized + ExactSizeIterator + DoubleEndedIterator, { // No need for an overflow check here, because `ExactSizeIterator` // implies that the number of elements fits into a `usize`. @@ -2157,8 +2268,7 @@ pub trait Iterator { ) -> impl FnMut(usize, T) -> LoopState { move |i, x| { let i = i - 1; - if predicate(x) { LoopState::Break(i) } - else { LoopState::Continue(i) } + if predicate(x) { LoopState::Break(i) } else { LoopState::Continue(i) } } } @@ -2186,7 +2296,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn max(self) -> Option where Self: Sized, Self::Item: Ord + fn max(self) -> Option + where + Self: Sized, + Self::Item: Ord, { self.max_by(Ord::cmp) } @@ -2211,7 +2324,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn min(self) -> Option where Self: Sized, Self::Item: Ord + fn min(self) -> Option + where + Self: Sized, + Self::Item: Ord, { self.min_by(Ord::cmp) } @@ -2233,7 +2349,9 @@ pub trait Iterator { #[inline] #[stable(feature = "iter_cmp_by_key", since = "1.6.0")] fn max_by_key(self, f: F) -> Option - where Self: Sized, F: FnMut(&Self::Item) -> B, + where + Self: Sized, + F: FnMut(&Self::Item) -> B, { #[inline] fn key(mut f: impl FnMut(&T) -> B) -> impl FnMut(T) -> (B, T) { @@ -2266,7 +2384,9 @@ pub trait Iterator { #[inline] #[stable(feature = "iter_max_by", since = "1.15.0")] fn max_by(self, compare: F) -> Option - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering, + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { #[inline] fn fold(mut compare: impl FnMut(&T, &T) -> Ordering) -> impl FnMut(T, T) -> T { @@ -2293,7 +2413,9 @@ pub trait Iterator { #[inline] #[stable(feature = "iter_cmp_by_key", since = "1.6.0")] fn min_by_key(self, f: F) -> Option - where Self: Sized, F: FnMut(&Self::Item) -> B, + where + Self: Sized, + F: FnMut(&Self::Item) -> B, { #[inline] fn key(mut f: impl FnMut(&T) -> B) -> impl FnMut(T) -> (B, T) { @@ -2326,7 +2448,9 @@ pub trait Iterator { #[inline] #[stable(feature = "iter_min_by", since = "1.15.0")] fn min_by(self, compare: F) -> Option - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering, + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { #[inline] fn fold(mut compare: impl FnMut(&T, &T) -> Ordering) -> impl FnMut(T, T) -> T { @@ -2336,7 +2460,6 @@ pub trait Iterator { fold1(self, fold(compare)) } - /// Reverses an iterator's direction. /// /// Usually, iterators iterate from left to right. After using `rev()`, @@ -2362,7 +2485,10 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - fn rev(self) -> Rev where Self: Sized + DoubleEndedIterator { + fn rev(self) -> Rev + where + Self: Sized + DoubleEndedIterator, + { Rev::new(self) } @@ -2389,10 +2515,11 @@ pub trait Iterator { /// assert_eq!(right, [2, 4]); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn unzip(self) -> (FromA, FromB) where + fn unzip(self) -> (FromA, FromB) + where FromA: Default + Extend, FromB: Default + Extend, - Self: Sized + Iterator, + Self: Sized + Iterator, { fn extend<'a, A, B>( ts: &'a mut impl Extend, @@ -2434,7 +2561,9 @@ pub trait Iterator { /// ``` #[stable(feature = "iter_copied", since = "1.36.0")] fn copied<'a, T: 'a>(self) -> Copied - where Self: Sized + Iterator, T: Copy + where + Self: Sized + Iterator, + T: Copy, { Copied::new(self) } @@ -2463,7 +2592,9 @@ pub trait Iterator { /// ``` #[stable(feature = "rust1", since = "1.0.0")] fn cloned<'a, T: 'a>(self) -> Cloned - where Self: Sized + Iterator, T: Clone + where + Self: Sized + Iterator, + T: Clone, { Cloned::new(self) } @@ -2495,7 +2626,10 @@ pub trait Iterator { /// ``` #[stable(feature = "rust1", since = "1.0.0")] #[inline] - fn cycle(self) -> Cycle where Self: Sized + Clone { + fn cycle(self) -> Cycle + where + Self: Sized + Clone, + { Cycle::new(self) } @@ -2523,8 +2657,9 @@ pub trait Iterator { /// ``` #[stable(feature = "iter_arith", since = "1.11.0")] fn sum(self) -> S - where Self: Sized, - S: Sum, + where + Self: Sized, + S: Sum, { Sum::sum(self) } @@ -2551,8 +2686,9 @@ pub trait Iterator { /// ``` #[stable(feature = "iter_arith", since = "1.11.0")] fn product

(self) -> P - where Self: Sized, - P: Product, + where + Self: Sized, + P: Product, { Product::product(self) } @@ -2609,11 +2745,13 @@ pub trait Iterator { loop { let x = match self.next() { - None => if other.next().is_none() { - return Ordering::Equal - } else { - return Ordering::Less - }, + None => { + if other.next().is_none() { + return Ordering::Equal; + } else { + return Ordering::Less; + } + } Some(val) => val, }; @@ -2692,11 +2830,13 @@ pub trait Iterator { loop { let x = match self.next() { - None => if other.next().is_none() { - return Some(Ordering::Equal) - } else { - return Some(Ordering::Less) - }, + None => { + if other.next().is_none() { + return Some(Ordering::Equal); + } else { + return Some(Ordering::Less); + } + } Some(val) => val, }; @@ -2782,7 +2922,8 @@ pub trait Iterator { /// assert_eq!([1].iter().ne([1, 2].iter()), true); /// ``` #[stable(feature = "iter_order", since = "1.5.0")] - fn ne(self, other: I) -> bool where + fn ne(self, other: I) -> bool + where I: IntoIterator, Self::Item: PartialEq, Self: Sized, @@ -2801,7 +2942,8 @@ pub trait Iterator { /// assert_eq!([1, 2].iter().lt([1].iter()), false); /// ``` #[stable(feature = "iter_order", since = "1.5.0")] - fn lt(self, other: I) -> bool where + fn lt(self, other: I) -> bool + where I: IntoIterator, Self::Item: PartialOrd, Self: Sized, @@ -2820,15 +2962,13 @@ pub trait Iterator { /// assert_eq!([1, 2].iter().le([1].iter()), false); /// ``` #[stable(feature = "iter_order", since = "1.5.0")] - fn le(self, other: I) -> bool where + fn le(self, other: I) -> bool + where I: IntoIterator, Self::Item: PartialOrd, Self: Sized, { - match self.partial_cmp(other) { - Some(Ordering::Less) | Some(Ordering::Equal) => true, - _ => false, - } + matches!(self.partial_cmp(other), Some(Ordering::Less) | Some(Ordering::Equal)) } /// Determines if the elements of this `Iterator` are lexicographically @@ -2842,7 +2982,8 @@ pub trait Iterator { /// assert_eq!([1, 2].iter().gt([1].iter()), true); /// ``` #[stable(feature = "iter_order", since = "1.5.0")] - fn gt(self, other: I) -> bool where + fn gt(self, other: I) -> bool + where I: IntoIterator, Self::Item: PartialOrd, Self: Sized, @@ -2861,15 +3002,13 @@ pub trait Iterator { /// assert_eq!([1, 2].iter().ge([1].iter()), true); /// ``` #[stable(feature = "iter_order", since = "1.5.0")] - fn ge(self, other: I) -> bool where + fn ge(self, other: I) -> bool + where I: IntoIterator, Self::Item: PartialOrd, Self: Sized, { - match self.partial_cmp(other) { - Some(Ordering::Greater) | Some(Ordering::Equal) => true, - _ => false, - } + matches!(self.partial_cmp(other), Some(Ordering::Greater) | Some(Ordering::Equal)) } /// Checks if the elements of this iterator are sorted. @@ -2925,7 +3064,7 @@ pub trait Iterator { fn is_sorted_by(mut self, mut compare: F) -> bool where Self: Sized, - F: FnMut(&Self::Item, &Self::Item) -> Option + F: FnMut(&Self::Item, &Self::Item) -> Option, { let mut last = match self.next() { Some(e) => e, @@ -2965,7 +3104,7 @@ pub trait Iterator { where Self: Sized, F: FnMut(Self::Item) -> K, - K: PartialOrd + K: PartialOrd, { self.map(f).is_sorted() } @@ -2974,9 +3113,9 @@ pub trait Iterator { /// Fold an iterator without having to provide an initial value. #[inline] fn fold1(mut it: I, f: F) -> Option - where - I: Iterator, - F: FnMut(I::Item, I::Item) -> I::Item, +where + I: Iterator, + F: FnMut(I::Item, I::Item) -> I::Item, { // start with the first element as our selection. This avoids // having to use `Option`s inside the loop, translating to a @@ -2988,8 +3127,12 @@ fn fold1(mut it: I, f: F) -> Option #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for &mut I { type Item = I::Item; - fn next(&mut self) -> Option { (**self).next() } - fn size_hint(&self) -> (usize, Option) { (**self).size_hint() } + fn next(&mut self) -> Option { + (**self).next() + } + fn size_hint(&self) -> (usize, Option) { + (**self).size_hint() + } fn nth(&mut self, n: usize) -> Option { (**self).nth(n) } diff --git a/src/libcore/iter/traits/marker.rs b/src/libcore/iter/traits/marker.rs index 602619bce5..404cc84495 100644 --- a/src/libcore/iter/traits/marker.rs +++ b/src/libcore/iter/traits/marker.rs @@ -38,7 +38,7 @@ impl FusedIterator for &mut I {} /// [`usize::MAX`]: ../../std/usize/constant.MAX.html /// [`.size_hint`]: ../../std/iter/trait.Iterator.html#method.size_hint #[unstable(feature = "trusted_len", issue = "37572")] -pub unsafe trait TrustedLen : Iterator {} +pub unsafe trait TrustedLen: Iterator {} #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl TrustedLen for &mut I {} diff --git a/src/libcore/iter/traits/mod.rs b/src/libcore/iter/traits/mod.rs index cf3013f423..efd1580a54 100644 --- a/src/libcore/iter/traits/mod.rs +++ b/src/libcore/iter/traits/mod.rs @@ -1,15 +1,15 @@ -mod iterator; +mod accum; +mod collect; mod double_ended; mod exact_size; -mod collect; -mod accum; +mod iterator; mod marker; -#[stable(feature = "rust1", since = "1.0.0")] -pub use self::iterator::Iterator; +pub use self::accum::{Product, Sum}; +pub use self::collect::{Extend, FromIterator, IntoIterator}; pub use self::double_ended::DoubleEndedIterator; pub use self::exact_size::ExactSizeIterator; -pub use self::collect::{FromIterator, IntoIterator, Extend}; -pub use self::accum::{Sum, Product}; +#[stable(feature = "rust1", since = "1.0.0")] +pub use self::iterator::Iterator; #[stable(feature = "rust1", since = "1.0.0")] pub use self::marker::{FusedIterator, TrustedLen}; diff --git a/src/libcore/iter_private.rs b/src/libcore/iter_private.rs deleted file mode 100644 index 890db47b19..0000000000 --- a/src/libcore/iter_private.rs +++ /dev/null @@ -1,17 +0,0 @@ -/// An iterator whose items are random accessible efficiently -/// -/// # Safety -/// -/// The iterator's .len() and size_hint() must be exact. -/// `.len()` must be cheap to call. -/// -/// .get_unchecked() must return distinct mutable references for distinct -/// indices (if applicable), and must return a valid reference if index is in -/// 0..self.len(). -#[doc(hidden)] -pub unsafe trait TrustedRandomAccess : ExactSizeIterator { - unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item; - /// Returns `true` if getting an iterator element may have - /// side effects. Remember to take inner iterators into account. - fn may_have_side_effect() -> bool; -} diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 7fe4f7e41a..f77b4d7461 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -44,38 +44,40 @@ // Here we explicitly #[cfg]-out this whole crate when testing. If we don't do // this, both the generated test artifact and the linked libtest (which // transitively includes libcore) will both define the same set of lang items, -// and this will cause the E0152 "duplicate lang item found" error. See +// and this will cause the E0152 "found duplicate lang item" error. See // discussion in #50466 for details. // // This cfg won't affect doc tests. #![cfg(not(test))] - #![stable(feature = "core", since = "1.6.0")] -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - html_playground_url = "https://play.rust-lang.org/", - issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/", - test(no_crate_inject, attr(deny(warnings))), - test(attr(allow(dead_code, deprecated, unused_variables, unused_mut))))] +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + html_playground_url = "https://play.rust-lang.org/", + issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/", + test(no_crate_inject, attr(deny(warnings))), + test(attr(allow(dead_code, deprecated, unused_variables, unused_mut))) +)] #![no_core] - #![warn(deprecated_in_future)] #![warn(missing_docs)] #![warn(missing_debug_implementations)] #![deny(intra_doc_link_resolution_failure)] // rustdoc is run without -D warnings #![allow(explicit_outlives_requirements)] #![allow(incomplete_features)] - #![feature(allow_internal_unstable)] #![feature(arbitrary_self_types)] #![feature(asm)] #![feature(bound_cloned)] #![feature(cfg_target_has_atomic)] #![feature(concat_idents)] -#![feature(const_fn)] +#![feature(const_alloc_layout)] +#![feature(const_if_match)] +#![feature(const_panic)] #![feature(const_fn_union)] #![feature(const_generics)] -#![cfg_attr(not(bootstrap), feature(const_ptr_offset_from))] -#![cfg_attr(not(bootstrap), feature(const_type_name))] +#![feature(const_ptr_offset_from)] +#![feature(const_result)] +#![feature(const_type_name)] #![feature(custom_inner_attributes)] #![feature(decl_macro)] #![feature(doc_cfg)] @@ -83,6 +85,7 @@ #![feature(extern_types)] #![feature(fundamental)] #![feature(intrinsics)] +#![feature(try_find)] #![feature(is_sorted)] #![feature(iter_once_with)] #![feature(lang_items)] @@ -91,18 +94,16 @@ #![feature(nll)] #![feature(exhaustive_patterns)] #![feature(no_core)] -#![cfg_attr(bootstrap, feature(on_unimplemented))] #![feature(optin_builtin_traits)] #![feature(prelude_import)] #![feature(repr_simd, platform_intrinsics)] #![feature(rustc_attrs)] -#![cfg_attr(bootstrap, feature(rustc_const_unstable))] #![feature(simd_ffi)] #![feature(specialization)] #![feature(staged_api)] #![feature(std_internals)] #![feature(stmt_expr_attributes)] -#![cfg_attr(not(bootstrap), feature(track_caller))] +#![feature(track_caller)] #![feature(transparent_unions)] #![feature(unboxed_closures)] #![feature(unsized_locals)] @@ -130,6 +131,9 @@ #![feature(maybe_uninit_slice)] #![feature(external_doc)] #![feature(associated_type_bounds)] +#![feature(const_type_id)] +#![feature(const_caller_location)] +#![cfg_attr(bootstrap, feature(slice_patterns))] #[prelude_import] #[allow(unused)] @@ -150,22 +154,36 @@ mod int_macros; #[macro_use] mod uint_macros; -#[path = "num/isize.rs"] pub mod isize; -#[path = "num/i8.rs"] pub mod i8; -#[path = "num/i16.rs"] pub mod i16; -#[path = "num/i32.rs"] pub mod i32; -#[path = "num/i64.rs"] pub mod i64; -#[path = "num/i128.rs"] pub mod i128; +#[path = "num/i128.rs"] +pub mod i128; +#[path = "num/i16.rs"] +pub mod i16; +#[path = "num/i32.rs"] +pub mod i32; +#[path = "num/i64.rs"] +pub mod i64; +#[path = "num/i8.rs"] +pub mod i8; +#[path = "num/isize.rs"] +pub mod isize; -#[path = "num/usize.rs"] pub mod usize; -#[path = "num/u8.rs"] pub mod u8; -#[path = "num/u16.rs"] pub mod u16; -#[path = "num/u32.rs"] pub mod u32; -#[path = "num/u64.rs"] pub mod u64; -#[path = "num/u128.rs"] pub mod u128; +#[path = "num/u128.rs"] +pub mod u128; +#[path = "num/u16.rs"] +pub mod u16; +#[path = "num/u32.rs"] +pub mod u32; +#[path = "num/u64.rs"] +pub mod u64; +#[path = "num/u8.rs"] +pub mod u8; +#[path = "num/usize.rs"] +pub mod usize; -#[path = "num/f32.rs"] pub mod f32; -#[path = "num/f64.rs"] pub mod f64; +#[path = "num/f32.rs"] +pub mod f32; +#[path = "num/f64.rs"] +pub mod f64; #[macro_use] pub mod num; @@ -176,24 +194,24 @@ pub mod prelude; /* Core modules for ownership management */ +pub mod hint; pub mod intrinsics; pub mod mem; pub mod ptr; -pub mod hint; /* Core language traits */ +pub mod borrow; #[cfg(not(test))] // See #65860 -pub mod marker; -pub mod ops; +pub mod clone; #[cfg(not(test))] // See #65860 pub mod cmp; -#[cfg(not(test))] // See #65860 -pub mod clone; +pub mod convert; #[cfg(not(test))] // See #65860 pub mod default; -pub mod convert; -pub mod borrow; +#[cfg(not(test))] // See #65860 +pub mod marker; +pub mod ops; /* Core types and methods on primitives */ @@ -201,27 +219,27 @@ pub mod any; #[cfg(not(test))] // See #65860 pub mod array; pub mod ascii; -pub mod sync; pub mod cell; pub mod char; +pub mod ffi; +#[cfg(not(test))] // See #65860 +pub mod iter; +pub mod option; pub mod panic; pub mod panicking; #[cfg(not(test))] // See #65860 pub mod pin; -#[cfg(not(test))] // See #65860 -pub mod iter; -pub mod option; pub mod raw; pub mod result; -pub mod ffi; +pub mod sync; -pub mod slice; #[cfg(not(test))] // See #65860 -pub mod str; +pub mod fmt; #[cfg(not(test))] // See #65860 pub mod hash; +pub mod slice; #[cfg(not(test))] // See #65860 -pub mod fmt; +pub mod str; pub mod time; pub mod unicode; diff --git a/src/libcore/macros/mod.rs b/src/libcore/macros/mod.rs index cf460745ff..76e58f0cc6 100644 --- a/src/libcore/macros/mod.rs +++ b/src/libcore/macros/mod.rs @@ -1,18 +1,13 @@ #[doc(include = "panic.md")] #[macro_export] -#[allow_internal_unstable(core_panic, - // FIXME(anp, eddyb) `core_intrinsics` is used here to allow calling - // the `caller_location` intrinsic, but once `#[track_caller]` is implemented, - // `panicking::{panic, panic_fmt}` can use that instead of a `Location` argument. - core_intrinsics, -)] +#[allow_internal_unstable(core_panic, track_caller)] #[stable(feature = "core", since = "1.6.0")] macro_rules! panic { () => ( $crate::panic!("explicit panic") ); ($msg:expr) => ( - $crate::panicking::panic($msg, $crate::intrinsics::caller_location()) + $crate::panicking::panic($msg) ); ($msg:expr,) => ( $crate::panic!($msg) @@ -20,7 +15,7 @@ macro_rules! panic { ($fmt:expr, $($arg:tt)+) => ( $crate::panicking::panic_fmt( $crate::format_args!($fmt, $($arg)+), - $crate::intrinsics::caller_location(), + $crate::panic::Location::caller(), ) ); } @@ -251,8 +246,6 @@ macro_rules! debug_assert_ne { /// # Examples /// /// ``` -/// #![feature(matches_macro)] -/// /// let foo = 'f'; /// assert!(matches!(foo, 'A'..='Z' | 'a'..='z')); /// @@ -260,7 +253,7 @@ macro_rules! debug_assert_ne { /// assert!(matches!(bar, Some(x) if x > 2)); /// ``` #[macro_export] -#[unstable(feature = "matches_macro", issue = "65721")] +#[stable(feature = "matches_macro", since = "1.42.0")] macro_rules! matches { ($expression:expr, $( $pattern:pat )|+ $( if $guard: expr )?) => { match $expression { @@ -556,13 +549,15 @@ macro_rules! unreachable { }); } -/// Indicates unfinished code by panicking with a message of "not yet implemented". +/// Indicates unimplemented code by panicking with a message of "not implemented". /// -/// This allows the your code to type-check, which is useful if you are prototyping or +/// This allows your code to type-check, which is useful if you are prototyping or /// implementing a trait that requires multiple methods which you don't plan of using all of. /// -/// There is no difference between `unimplemented!` and `todo!` apart from the -/// name. +/// The difference between `unimplemented!` and [`todo!`](macro.todo.html) is that while `todo!` +/// conveys an intent of implementing the functionality later and the message is "not yet +/// implemented", `unimplemented!` makes no such claims. Its message is "not implemented". +/// Also some IDEs will mark `todo!`s. /// /// # Panics /// @@ -573,7 +568,7 @@ macro_rules! unreachable { /// /// # Examples /// -/// Here's an example of some in-progress code. We have a trait `Foo`: +/// Say we have a trait `Foo`: /// /// ``` /// trait Foo { @@ -583,13 +578,13 @@ macro_rules! unreachable { /// } /// ``` /// -/// We want to implement `Foo` for 'MyStruct', but so far we only know how to -/// implement the `bar()` function. `baz()` and `qux()` will still need to be defined +/// We want to implement `Foo` for 'MyStruct', but for some reason it only makes sense +/// to implement the `bar()` function. `baz()` and `qux()` will still need to be defined /// in our implementation of `Foo`, but we can use `unimplemented!` in their definitions /// to allow our code to compile. /// -/// In the meantime, we want to have our program stop running once these -/// unimplemented functions are reached. +/// We still want to have our program stop running if the unimplemented methods are +/// reached. /// /// ``` /// # trait Foo { @@ -605,19 +600,18 @@ macro_rules! unreachable { /// } /// /// fn baz(&self) { -/// // We aren't sure how to even start writing baz yet, -/// // so we have no logic here at all. -/// // This will display "thread 'main' panicked at 'not yet implemented'". +/// // It makes no sense to `baz` a `MyStruct`, so we have no logic here +/// // at all. +/// // This will display "thread 'main' panicked at 'not implemented'". /// unimplemented!(); /// } /// /// fn qux(&self) -> Result { -/// let n = self.bar(); /// // We have some logic here, -/// // so we can use unimplemented! to display what we have so far. +/// // We can add a message to unimplemented! to display our omission. /// // This will display: -/// // "thread 'main' panicked at 'not yet implemented: we need to divide by 2'". -/// unimplemented!("we need to divide by {}", n); +/// // "thread 'main' panicked at 'not implemented: MyStruct isn't quxable'". +/// unimplemented!("MyStruct isn't quxable"); /// } /// } /// @@ -629,8 +623,8 @@ macro_rules! unreachable { #[macro_export] #[stable(feature = "rust1", since = "1.0.0")] macro_rules! unimplemented { - () => (panic!("not yet implemented")); - ($($arg:tt)+) => (panic!("not yet implemented: {}", $crate::format_args!($($arg)+))); + () => (panic!("not implemented")); + ($($arg:tt)+) => (panic!("not implemented: {}", $crate::format_args!($($arg)+))); } /// Indicates unfinished code. @@ -638,8 +632,12 @@ macro_rules! unimplemented { /// This can be useful if you are prototyping and are just looking to have your /// code typecheck. /// -/// There is no difference between `unimplemented!` and `todo!` apart from the -/// name. +/// The difference between [`unimplemented!`] and `todo!` is that while `todo!` conveys +/// an intent of implementing the functionality later and the message is "not yet +/// implemented", `unimplemented!` makes no such claims. Its message is "not implemented". +/// Also some IDEs will mark `todo!`s. +/// +/// [`unimplemented!`]: macro.unimplemented.html /// /// # Panics /// @@ -682,11 +680,11 @@ macro_rules! unimplemented { /// let s = MyStruct; /// s.bar(); /// -/// // we aren't even using baz() yet, so this is fine. +/// // we aren't even using baz(), so this is fine. /// } /// ``` #[macro_export] -#[stable(feature = "todo_macro", since = "1.39.0")] +#[stable(feature = "todo_macro", since = "1.40.0")] macro_rules! todo { () => (panic!("not yet implemented")); ($($arg:tt)+) => (panic!("not yet implemented: {}", $crate::format_args!($($arg)+))); @@ -799,7 +797,7 @@ pub(crate) mod builtin { /// Same as `format_args`, but adds a newline in the end. #[unstable( feature = "format_args_nl", - issue = "0", + issue = "none", reason = "`format_args_nl` is only for internal \ language use and is subject to change" )] diff --git a/src/libcore/marker.rs b/src/libcore/marker.rs index 1b586c3e5f..b4b595f330 100644 --- a/src/libcore/marker.rs +++ b/src/libcore/marker.rs @@ -31,17 +31,17 @@ use crate::hash::Hasher; #[stable(feature = "rust1", since = "1.0.0")] #[cfg_attr(not(test), rustc_diagnostic_item = "send_trait")] #[rustc_on_unimplemented( - message="`{Self}` cannot be sent between threads safely", - label="`{Self}` cannot be sent between threads safely" + message = "`{Self}` cannot be sent between threads safely", + label = "`{Self}` cannot be sent between threads safely" )] pub unsafe auto trait Send { // empty. } #[stable(feature = "rust1", since = "1.0.0")] -impl !Send for *const T { } +impl !Send for *const T {} #[stable(feature = "rust1", since = "1.0.0")] -impl !Send for *mut T { } +impl !Send for *mut T {} /// Types with a constant size known at compile time. /// @@ -83,11 +83,11 @@ impl !Send for *mut T { } #[stable(feature = "rust1", since = "1.0.0")] #[lang = "sized"] #[rustc_on_unimplemented( - on(parent_trait="std::path::Path", label="borrow the `Path` instead"), - message="the size for values of type `{Self}` cannot be known at compilation time", - label="doesn't have a size known at compile-time", - note="to learn more, visit ", + on(parent_trait = "std::path::Path", label = "borrow the `Path` instead"), + message = "the size for values of type `{Self}` cannot be known at compilation time", + label = "doesn't have a size known at compile-time", + note = "to learn more, visit " )] #[fundamental] // for Default, for example, which requires that `[T]: !Default` be evaluatable pub trait Sized { @@ -142,13 +142,13 @@ pub trait Unsize { /// In either of the two scenarios above, we reject usage of such a constant in /// a pattern match. /// -/// See also the [structural match RFC][RFC1445], and [issue 63438][] which +/// See also the [structural match RFC][RFC1445], and [issue 63438] which /// motivated migrating from attribute-based design to this trait. /// /// [RFC1445]: https://github.com/rust-lang/rfcs/blob/master/text/1445-restrict-constants-in-patterns.md /// [issue 63438]: https://github.com/rust-lang/rust/issues/63438 #[unstable(feature = "structural_match", issue = "31434")] -#[rustc_on_unimplemented(message="the type `{Self}` does not `#[derive(PartialEq)]`")] +#[rustc_on_unimplemented(message = "the type `{Self}` does not `#[derive(PartialEq)]`")] #[lang = "structural_peq"] pub trait StructuralPartialEq { // Empty. @@ -198,7 +198,7 @@ pub trait StructuralPartialEq { /// of the two derives (`#[derive(PartialEq)]` and `#[derive(Eq)]`) and check /// that both of them are present as part of structural-match checking. #[unstable(feature = "structural_match", issue = "31434")] -#[rustc_on_unimplemented(message="the type `{Self}` does not `#[derive(Eq)]`")] +#[rustc_on_unimplemented(message = "the type `{Self}` does not `#[derive(Eq)]`")] #[lang = "structural_teq"] pub trait StructuralEq { // Empty. @@ -362,7 +362,7 @@ pub trait StructuralEq { /// [impls]: #implementors #[stable(feature = "rust1", since = "1.0.0")] #[lang = "copy"] -pub trait Copy : Clone { +pub trait Copy: Clone { // Empty. } @@ -370,7 +370,9 @@ pub trait Copy : Clone { #[rustc_builtin_macro] #[stable(feature = "builtin_macro_prelude", since = "1.38.0")] #[allow_internal_unstable(core_intrinsics, derive_clone_copy)] -pub macro Copy($item:item) { /* compiler built-in */ } +pub macro Copy($item:item) { + /* compiler built-in */ +} /// Types for which it is safe to share references between threads. /// @@ -444,8 +446,8 @@ pub macro Copy($item:item) { /* compiler built-in */ } #[cfg_attr(not(test), rustc_diagnostic_item = "sync_trait")] #[lang = "sync"] #[rustc_on_unimplemented( - message="`{Self}` cannot be shared between threads safely", - label="`{Self}` cannot be shared between threads safely" + message = "`{Self}` cannot be shared between threads safely", + label = "`{Self}` cannot be shared between threads safely" )] pub unsafe auto trait Sync { // FIXME(estebank): once support to add notes in `rustc_on_unimplemented` @@ -462,67 +464,65 @@ pub unsafe auto trait Sync { } #[stable(feature = "rust1", since = "1.0.0")] -impl !Sync for *const T { } +impl !Sync for *const T {} #[stable(feature = "rust1", since = "1.0.0")] -impl !Sync for *mut T { } +impl !Sync for *mut T {} -macro_rules! impls{ - ($t: ident) => ( +macro_rules! impls { + ($t: ident) => { #[stable(feature = "rust1", since = "1.0.0")] - impl Hash for $t { + impl Hash for $t { #[inline] - fn hash(&self, _: &mut H) { - } + fn hash(&self, _: &mut H) {} } #[stable(feature = "rust1", since = "1.0.0")] - impl cmp::PartialEq for $t { + impl cmp::PartialEq for $t { fn eq(&self, _other: &$t) -> bool { true } } #[stable(feature = "rust1", since = "1.0.0")] - impl cmp::Eq for $t { - } + impl cmp::Eq for $t {} #[stable(feature = "rust1", since = "1.0.0")] - impl cmp::PartialOrd for $t { + impl cmp::PartialOrd for $t { fn partial_cmp(&self, _other: &$t) -> Option { Option::Some(cmp::Ordering::Equal) } } #[stable(feature = "rust1", since = "1.0.0")] - impl cmp::Ord for $t { + impl cmp::Ord for $t { fn cmp(&self, _other: &$t) -> cmp::Ordering { cmp::Ordering::Equal } } #[stable(feature = "rust1", since = "1.0.0")] - impl Copy for $t { } + impl Copy for $t {} #[stable(feature = "rust1", since = "1.0.0")] - impl Clone for $t { - fn clone(&self) -> $t { - $t + impl Clone for $t { + fn clone(&self) -> Self { + Self } } #[stable(feature = "rust1", since = "1.0.0")] - impl Default for $t { - fn default() -> $t { - $t + impl Default for $t { + fn default() -> Self { + Self } } #[unstable(feature = "structural_match", issue = "31434")] - impl StructuralPartialEq for $t { } + impl StructuralPartialEq for $t {} #[unstable(feature = "structural_match", issue = "31434")] - impl StructuralEq for $t { } - ) + impl StructuralEq for $t {} + }; } /// Zero-sized type used to mark things that "act like" they own a `T`. @@ -661,7 +661,7 @@ macro_rules! impls{ #[lang = "phantom_data"] #[structural_match] #[stable(feature = "rust1", since = "1.0.0")] -pub struct PhantomData; +pub struct PhantomData; impls! { PhantomData } @@ -788,5 +788,4 @@ mod copy_impls { // Shared references can be copied, but mutable references *cannot*! #[stable(feature = "rust1", since = "1.0.0")] impl Copy for &T {} - } diff --git a/src/libcore/mem/manually_drop.rs b/src/libcore/mem/manually_drop.rs index 6463668a03..4c3b81ea5e 100644 --- a/src/libcore/mem/manually_drop.rs +++ b/src/libcore/mem/manually_drop.rs @@ -63,10 +63,7 @@ impl ManuallyDrop { /// ManuallyDrop::new(Box::new(())); /// ``` #[stable(feature = "manually_drop", since = "1.20.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_manually_drop", since = "1.36.0"), - )] + #[rustc_const_stable(feature = "const_manually_drop", since = "1.36.0")] #[inline(always)] pub const fn new(value: T) -> ManuallyDrop { ManuallyDrop { value } @@ -84,36 +81,34 @@ impl ManuallyDrop { /// let _: Box<()> = ManuallyDrop::into_inner(x); // This drops the `Box`. /// ``` #[stable(feature = "manually_drop", since = "1.20.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_manually_drop", since = "1.36.0"), - )] + #[rustc_const_stable(feature = "const_manually_drop", since = "1.36.0")] #[inline(always)] pub const fn into_inner(slot: ManuallyDrop) -> T { slot.value } - /// Takes the contained value out. + /// Takes the value from the `ManuallyDrop` container out. /// /// This method is primarily intended for moving out values in drop. /// Instead of using [`ManuallyDrop::drop`] to manually drop the value, /// you can use this method to take the value and use it however desired. - /// `Drop` will be invoked on the returned value following normal end-of-scope rules. /// - /// If you have ownership of the container, you can use [`ManuallyDrop::into_inner`] instead. + /// Whenever possible, it is preferrable to use [`into_inner`][`ManuallyDrop::into_inner`] + /// instead, which prevents duplicating the content of the `ManuallyDrop`. /// /// # Safety /// - /// This function semantically moves out the contained value without preventing further usage. - /// It is up to the user of this method to ensure that this container is not used again. + /// This function semantically moves out the contained value without preventing further usage, + /// leaving the state of this container unchanged. + /// It is your responsibility to ensure that this `ManuallyDrop` is not used again. /// /// [`ManuallyDrop::drop`]: #method.drop /// [`ManuallyDrop::into_inner`]: #method.into_inner #[must_use = "if you don't need the value, you can use `ManuallyDrop::drop` instead"] - #[unstable(feature = "manually_drop_take", issue = "55422")] + #[stable(feature = "manually_drop_take", since = "1.42.0")] #[inline] pub unsafe fn take(slot: &mut ManuallyDrop) -> T { - ManuallyDrop::into_inner(ptr::read(slot)) + ptr::read(&slot.value) } } @@ -127,7 +122,7 @@ impl ManuallyDrop { /// This function runs the destructor of the contained value and thus the wrapped value /// now represents uninitialized data. It is up to the user of this method to ensure the /// uninitialized data is not actually used. - /// In particular, this function can only be called called at most once + /// In particular, this function can only be called at most once /// for a given instance of `ManuallyDrop`. /// /// [`ManuallyDrop::into_inner`]: #method.into_inner diff --git a/src/libcore/mem/maybe_uninit.rs b/src/libcore/mem/maybe_uninit.rs index 670a194e2d..5fb3c651b6 100644 --- a/src/libcore/mem/maybe_uninit.rs +++ b/src/libcore/mem/maybe_uninit.rs @@ -250,10 +250,7 @@ impl MaybeUninit { /// /// [`assume_init`]: #method.assume_init #[stable(feature = "maybe_uninit", since = "1.36.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_maybe_uninit", since = "1.36.0"), - )] + #[rustc_const_stable(feature = "const_maybe_uninit", since = "1.36.0")] #[inline(always)] pub const fn new(val: T) -> MaybeUninit { MaybeUninit { value: ManuallyDrop::new(val) } @@ -268,12 +265,9 @@ impl MaybeUninit { /// /// [type]: union.MaybeUninit.html #[stable(feature = "maybe_uninit", since = "1.36.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_maybe_uninit", since = "1.36.0"), - )] + #[rustc_const_stable(feature = "const_maybe_uninit", since = "1.36.0")] #[inline(always)] - #[cfg_attr(all(not(bootstrap)), rustc_diagnostic_item = "maybe_uninit_uninit")] + #[rustc_diagnostic_item = "maybe_uninit_uninit"] pub const fn uninit() -> MaybeUninit { MaybeUninit { uninit: () } } @@ -307,17 +301,18 @@ impl MaybeUninit { /// let mut buf: [MaybeUninit; 32] = MaybeUninit::uninit_array(); /// let data = read(&mut buf); /// ``` - #[unstable(feature = "maybe_uninit_uninit_array", issue = "0")] + #[unstable(feature = "maybe_uninit_uninit_array", issue = "none")] #[inline(always)] pub fn uninit_array() -> [Self; LEN] { - unsafe { - MaybeUninit::<[MaybeUninit; LEN]>::uninit().assume_init() - } + unsafe { MaybeUninit::<[MaybeUninit; LEN]>::uninit().assume_init() } } /// A promotable constant, equivalent to `uninit()`. - #[unstable(feature = "internal_uninit_const", issue = "0", - reason = "hack to work around promotability")] + #[unstable( + feature = "internal_uninit_const", + issue = "none", + reason = "hack to work around promotability" + )] pub const UNINIT: Self = Self::uninit(); /// Creates a new `MaybeUninit` in an uninitialized state, with the memory being @@ -357,7 +352,7 @@ impl MaybeUninit { /// ``` #[stable(feature = "maybe_uninit", since = "1.36.0")] #[inline] - #[cfg_attr(all(not(bootstrap)), rustc_diagnostic_item = "maybe_uninit_zeroed")] + #[rustc_diagnostic_item = "maybe_uninit_zeroed"] pub fn zeroed() -> MaybeUninit { let mut u = MaybeUninit::::uninit(); unsafe { @@ -498,7 +493,7 @@ impl MaybeUninit { /// ``` #[stable(feature = "maybe_uninit", since = "1.36.0")] #[inline(always)] - #[cfg_attr(all(not(bootstrap)), rustc_diagnostic_item = "assume_init")] + #[rustc_diagnostic_item = "assume_init"] pub unsafe fn assume_init(self) -> T { intrinsics::panic_if_uninhabited::(); ManuallyDrop::into_inner(self.value) @@ -755,7 +750,7 @@ impl MaybeUninit { /// It is up to the caller to guarantee that the `MaybeUninit` elements /// really are in an initialized state. /// Calling this when the content is not yet fully initialized causes undefined behavior. - #[unstable(feature = "maybe_uninit_slice_assume_init", issue = "0")] + #[unstable(feature = "maybe_uninit_slice_assume_init", issue = "none")] #[inline(always)] pub unsafe fn slice_get_ref(slice: &[Self]) -> &[T] { &*(slice as *const [Self] as *const [T]) @@ -768,7 +763,7 @@ impl MaybeUninit { /// It is up to the caller to guarantee that the `MaybeUninit` elements /// really are in an initialized state. /// Calling this when the content is not yet fully initialized causes undefined behavior. - #[unstable(feature = "maybe_uninit_slice_assume_init", issue = "0")] + #[unstable(feature = "maybe_uninit_slice_assume_init", issue = "none")] #[inline(always)] pub unsafe fn slice_get_mut(slice: &mut [Self]) -> &mut [T] { &mut *(slice as *mut [Self] as *mut [T]) diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index 00b32ad0b7..9eb151cf52 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -121,7 +121,7 @@ pub fn forget(t: T) { /// /// [`forget`]: fn.forget.html #[inline] -#[unstable(feature = "forget_unsized", issue = "0")] +#[unstable(feature = "forget_unsized", issue = "none")] pub fn forget_unsized(t: T) { // SAFETY: the forget intrinsic could be safe, but there's no point in making it safe since // we'll be implementing this function soon via `ManuallyDrop` @@ -271,7 +271,7 @@ pub fn forget_unsized(t: T) { #[inline(always)] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_promotable] -#[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_size_of", since = "1.32.0"))] +#[rustc_const_stable(feature = "const_size_of", since = "1.32.0")] pub const fn size_of() -> usize { intrinsics::size_of::() } @@ -299,10 +299,6 @@ pub const fn size_of() -> usize { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn size_of_val(val: &T) -> usize { - #[cfg(bootstrap)] - // SAFETY: going away soon - unsafe { intrinsics::size_of_val(val) } - #[cfg(not(bootstrap))] intrinsics::size_of_val(val) } @@ -347,10 +343,6 @@ pub fn min_align_of() -> usize { #[stable(feature = "rust1", since = "1.0.0")] #[rustc_deprecated(reason = "use `align_of_val` instead", since = "1.2.0")] pub fn min_align_of_val(val: &T) -> usize { - #[cfg(bootstrap)] - // SAFETY: going away soon - unsafe { intrinsics::min_align_of_val(val) } - #[cfg(not(bootstrap))] intrinsics::min_align_of_val(val) } @@ -372,7 +364,7 @@ pub fn min_align_of_val(val: &T) -> usize { #[inline(always)] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_promotable] -#[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_align_of", since = "1.32.0"))] +#[rustc_const_stable(feature = "const_align_of", since = "1.32.0")] pub const fn align_of() -> usize { intrinsics::min_align_of::() } @@ -455,7 +447,7 @@ pub fn align_of_val(val: &T) -> usize { /// ``` #[inline] #[stable(feature = "needs_drop", since = "1.21.0")] -#[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_needs_drop", since = "1.36.0"))] +#[rustc_const_stable(feature = "const_needs_drop", since = "1.36.0")] pub const fn needs_drop() -> bool { intrinsics::needs_drop::() } @@ -501,7 +493,7 @@ pub const fn needs_drop() -> bool { #[stable(feature = "rust1", since = "1.0.0")] #[allow(deprecated_in_future)] #[allow(deprecated)] -#[cfg_attr(all(not(bootstrap)), rustc_diagnostic_item = "mem_zeroed")] +#[rustc_diagnostic_item = "mem_zeroed"] pub unsafe fn zeroed() -> T { intrinsics::panic_if_uninhabited::(); intrinsics::init() @@ -534,7 +526,7 @@ pub unsafe fn zeroed() -> T { #[stable(feature = "rust1", since = "1.0.0")] #[allow(deprecated_in_future)] #[allow(deprecated)] -#[cfg_attr(all(not(bootstrap)), rustc_diagnostic_item = "mem_uninitialized")] +#[rustc_diagnostic_item = "mem_uninitialized"] pub unsafe fn uninitialized() -> T { intrinsics::panic_if_uninhabited::(); intrinsics::uninit() @@ -565,7 +557,7 @@ pub fn swap(x: &mut T, y: &mut T) { } } -/// Replace `dest` with the default value of `T`, and return the previous `dest` value. +/// Replaces `dest` with the default value of `T`, returning the previous `dest` value. /// /// # Examples /// @@ -753,7 +745,7 @@ pub fn replace(dest: &mut T, mut src: T) -> T { /// [`Copy`]: ../../std/marker/trait.Copy.html #[inline] #[stable(feature = "rust1", since = "1.0.0")] -pub fn drop(_x: T) { } +pub fn drop(_x: T) {} /// Interprets `src` as having type `&U`, and then reads `src` without moving /// the contained value. @@ -842,9 +834,7 @@ impl hash::Hash for Discriminant { #[stable(feature = "discriminant_value", since = "1.21.0")] impl fmt::Debug for Discriminant { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_tuple("Discriminant") - .field(&self.0) - .finish() + fmt.debug_tuple("Discriminant").field(&self.0).finish() } } @@ -874,11 +864,5 @@ impl fmt::Debug for Discriminant { /// ``` #[stable(feature = "discriminant_value", since = "1.21.0")] pub fn discriminant(v: &T) -> Discriminant { - #[cfg(bootstrap)] - // SAFETY: going away soon - unsafe { - Discriminant(intrinsics::discriminant_value(v), PhantomData) - } - #[cfg(not(bootstrap))] Discriminant(intrinsics::discriminant_value(v), PhantomData) } diff --git a/src/libcore/num/bignum.rs b/src/libcore/num/bignum.rs index b8ddd5322a..6f16b93d04 100644 --- a/src/libcore/num/bignum.rs +++ b/src/libcore/num/bignum.rs @@ -15,7 +15,7 @@ #![unstable( feature = "core_private_bignum", reason = "internal routines only exposed for testing", - issue = "0" + issue = "none" )] #![macro_use] @@ -455,8 +455,8 @@ macro_rules! define_bignum { } impl crate::clone::Clone for $name { - fn clone(&self) -> $name { - $name { size: self.size, base: self.base } + fn clone(&self) -> Self { + Self { size: self.size, base: self.base } } } diff --git a/src/libcore/num/dec2flt/mod.rs b/src/libcore/num/dec2flt/mod.rs index 6fe9af8cbd..c83c6b0ecc 100644 --- a/src/libcore/num/dec2flt/mod.rs +++ b/src/libcore/num/dec2flt/mod.rs @@ -81,7 +81,7 @@ #![unstable( feature = "dec2flt", reason = "internal routines only exposed for testing", - issue = "0" + issue = "none" )] use crate::fmt; @@ -187,7 +187,7 @@ impl ParseFloatError { feature = "int_error_internals", reason = "available through Error trait and this method should \ not be exposed publicly", - issue = "0" + issue = "none" )] #[doc(hidden)] pub fn __description(&self) -> &str { diff --git a/src/libcore/num/diy_float.rs b/src/libcore/num/diy_float.rs index 0e601d45a2..0a609417dc 100644 --- a/src/libcore/num/diy_float.rs +++ b/src/libcore/num/diy_float.rs @@ -6,7 +6,7 @@ #![unstable( feature = "core_private_diy_float", reason = "internal routines only exposed for testing", - issue = "0" + issue = "none" )] /// A custom 64-bit floating point type, representing `f * 2^e`. diff --git a/src/libcore/num/f32.rs b/src/libcore/num/f32.rs index ac06f95e24..505484c2a4 100644 --- a/src/libcore/num/f32.rs +++ b/src/libcore/num/f32.rs @@ -7,7 +7,6 @@ #![stable(feature = "rust1", since = "1.0.0")] -#[cfg(not(bootstrap))] use crate::convert::FloatToInt; #[cfg(not(test))] use crate::intrinsics; @@ -31,7 +30,7 @@ pub const DIGITS: u32 = 6; /// /// [Machine epsilon]: https://en.wikipedia.org/wiki/Machine_epsilon #[stable(feature = "rust1", since = "1.0.0")] -pub const EPSILON: f32 = 1.19209290e-07_f32; +pub const EPSILON: f32 = 1.1920929e-7_f32; /// Smallest finite `f32` value. #[stable(feature = "rust1", since = "1.0.0")] @@ -63,7 +62,7 @@ pub const NAN: f32 = 0.0_f32 / 0.0_f32; /// Infinity (∞). #[stable(feature = "rust1", since = "1.0.0")] pub const INFINITY: f32 = 1.0_f32 / 0.0_f32; -/// Negative infinity (-∞). +/// Negative infinity (−∞). #[stable(feature = "rust1", since = "1.0.0")] pub const NEG_INFINITY: f32 = -1.0_f32 / 0.0_f32; @@ -227,7 +226,7 @@ impl f32 { } /// Returns `true` if the number is neither zero, infinite, - /// [subnormal][subnormal], or `NaN`. + /// [subnormal], or `NaN`. /// /// ``` /// use std::f32; @@ -343,7 +342,7 @@ impl f32 { /// /// assert!(abs_difference <= f32::EPSILON); /// ``` - #[stable(feature = "f32_deg_rad_conversions", since="1.7.0")] + #[stable(feature = "f32_deg_rad_conversions", since = "1.7.0")] #[inline] pub fn to_degrees(self) -> f32 { // Use a constant for better precision. @@ -362,7 +361,7 @@ impl f32 { /// /// assert!(abs_difference <= f32::EPSILON); /// ``` - #[stable(feature = "f32_deg_rad_conversions", since="1.7.0")] + #[stable(feature = "f32_deg_rad_conversions", since = "1.7.0")] #[inline] pub fn to_radians(self) -> f32 { let value: f32 = consts::PI; @@ -423,10 +422,12 @@ impl f32 { /// * Not be `NaN` /// * Not be infinite /// * Be representable in the return type `Int`, after truncating off its fractional part - #[cfg(not(bootstrap))] #[unstable(feature = "float_approx_unchecked_to", issue = "67058")] #[inline] - pub unsafe fn approx_unchecked_to(self) -> Int where Self: FloatToInt { + pub unsafe fn approx_unchecked_to(self) -> Int + where + Self: FloatToInt, + { FloatToInt::::approx_unchecked(self) } diff --git a/src/libcore/num/f64.rs b/src/libcore/num/f64.rs index 5446ce3e3b..8f3af42d25 100644 --- a/src/libcore/num/f64.rs +++ b/src/libcore/num/f64.rs @@ -7,7 +7,6 @@ #![stable(feature = "rust1", since = "1.0.0")] -#[cfg(not(bootstrap))] use crate::convert::FloatToInt; #[cfg(not(test))] use crate::intrinsics; @@ -63,7 +62,7 @@ pub const NAN: f64 = 0.0_f64 / 0.0_f64; /// Infinity (∞). #[stable(feature = "rust1", since = "1.0.0")] pub const INFINITY: f64 = 1.0_f64 / 0.0_f64; -/// Negative infinity (-∞). +/// Negative infinity (−∞). #[stable(feature = "rust1", since = "1.0.0")] pub const NEG_INFINITY: f64 = -1.0_f64 / 0.0_f64; @@ -227,7 +226,7 @@ impl f64 { } /// Returns `true` if the number is neither zero, infinite, - /// [subnormal][subnormal], or `NaN`. + /// [subnormal], or `NaN`. /// /// ``` /// use std::f64; @@ -436,7 +435,6 @@ impl f64 { /// * Not be `NaN` /// * Not be infinite /// * Be representable in the return type `Int`, after truncating off its fractional part - #[cfg(not(bootstrap))] #[unstable(feature = "float_approx_unchecked_to", issue = "67058")] #[inline] pub unsafe fn approx_unchecked_to(self) -> Int diff --git a/src/libcore/num/flt2dec/mod.rs b/src/libcore/num/flt2dec/mod.rs index 63df561345..9e760c13c0 100644 --- a/src/libcore/num/flt2dec/mod.rs +++ b/src/libcore/num/flt2dec/mod.rs @@ -119,7 +119,7 @@ functions. #![unstable( feature = "flt2dec", reason = "internal routines only exposed for testing", - issue = "0" + issue = "none" )] pub use self::decoder::{decode, DecodableFloat, Decoded, FullDecoded}; diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index d091a8d86e..91848abd68 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -61,10 +61,7 @@ assert_eq!(size_of::>(), size_of::<", s /// /// The value must not be zero. #[$stability] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "nonzero", since = "1.34.0"), - )] + #[rustc_const_stable(feature = "nonzero", since = "1.34.0")] #[inline] pub const unsafe fn new_unchecked(n: $Int) -> Self { Self(n) @@ -85,10 +82,7 @@ assert_eq!(size_of::>(), size_of::<", s /// Returns the value as a primitive type. #[$stability] #[inline] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "nonzero", since = "1.34.0"), - )] + #[rustc_const_stable(feature = "nonzero", since = "1.34.0")] pub const fn get(self) -> $Int { self.0 } @@ -264,10 +258,7 @@ $EndFeature, " #[stable(feature = "rust1", since = "1.0.0")] #[inline(always)] #[rustc_promotable] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_min_value", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_min_value", since = "1.32.0")] pub const fn min_value() -> Self { !0 ^ ((!0 as $UnsignedT) >> 1) as Self } @@ -287,10 +278,7 @@ $EndFeature, " #[stable(feature = "rust1", since = "1.0.0")] #[inline(always)] #[rustc_promotable] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_max_value", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_max_value", since = "1.32.0")] pub const fn max_value() -> Self { !Self::min_value() } @@ -340,10 +328,7 @@ $EndFeature, " ``` "), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] pub const fn count_ones(self) -> u32 { (self as $UnsignedT).count_ones() } } @@ -359,10 +344,7 @@ Basic usage: ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 1);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] pub const fn count_zeros(self) -> u32 { (!self).count_ones() @@ -383,10 +365,7 @@ assert_eq!(n.leading_zeros(), 0);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] pub const fn leading_zeros(self) -> u32 { (self as $UnsignedT).leading_zeros() @@ -407,16 +386,55 @@ assert_eq!(n.trailing_zeros(), 2);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] pub const fn trailing_zeros(self) -> u32 { (self as $UnsignedT).trailing_zeros() } } + doc_comment! { + concat!("Returns the number of leading ones in the binary representation of `self`. + +# Examples + +Basic usage: + +``` +", $Feature, "#![feature(leading_trailing_ones)] +let n = -1", stringify!($SelfT), "; + +assert_eq!(n.leading_ones(), ", stringify!($BITS), ");", +$EndFeature, " +```"), + #[unstable(feature = "leading_trailing_ones", issue = "57969")] + #[inline] + pub const fn leading_ones(self) -> u32 { + (self as $UnsignedT).leading_ones() + } + } + + doc_comment! { + concat!("Returns the number of trailing ones in the binary representation of `self`. + +# Examples + +Basic usage: + +``` +", $Feature, "#![feature(leading_trailing_ones)] +let n = 3", stringify!($SelfT), "; + +assert_eq!(n.trailing_ones(), 2);", +$EndFeature, " +```"), + #[unstable(feature = "leading_trailing_ones", issue = "57969")] + #[inline] + pub const fn trailing_ones(self) -> u32 { + (self as $UnsignedT).trailing_ones() + } + } + doc_comment! { concat!("Shifts the bits to the left by a specified amount, `n`, wrapping the truncated bits to the end of the resulting integer. @@ -434,10 +452,7 @@ let m = ", $rot_result, "; assert_eq!(n.rotate_left(", $rot, "), m); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -464,10 +479,7 @@ let m = ", $rot_op, "; assert_eq!(n.rotate_right(", $rot, "), m); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -491,10 +503,7 @@ let m = n.swap_bytes(); assert_eq!(m, ", $swapped, "); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] pub const fn swap_bytes(self) -> Self { (self as $UnsignedT).swap_bytes() as Self @@ -515,10 +524,7 @@ let m = n.reverse_bits(); assert_eq!(m, ", $reversed, "); ```"), #[stable(feature = "reverse_bits", since = "1.37.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] #[must_use] pub const fn reverse_bits(self) -> Self { @@ -546,10 +552,7 @@ if cfg!(target_endian = \"big\") { $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_conversions", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_conversions", since = "1.32.0")] #[inline] pub const fn from_be(x: Self) -> Self { #[cfg(target_endian = "big")] @@ -583,10 +586,7 @@ if cfg!(target_endian = \"little\") { $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_conversions", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_conversions", since = "1.32.0")] #[inline] pub const fn from_le(x: Self) -> Self { #[cfg(target_endian = "little")] @@ -620,10 +620,7 @@ if cfg!(target_endian = \"big\") { $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_conversions", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_conversions", since = "1.32.0")] #[inline] pub const fn to_be(self) -> Self { // or not to be? #[cfg(target_endian = "big")] @@ -657,10 +654,7 @@ if cfg!(target_endian = \"little\") { $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_conversions", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_conversions", since = "1.32.0")] #[inline] pub const fn to_le(self) -> Self { #[cfg(target_endian = "little")] @@ -1013,11 +1007,7 @@ $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_saturating_int_methods"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1043,11 +1033,7 @@ assert_eq!(", stringify!($SelfT), "::max_value().saturating_sub(-1), ", stringif $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_saturating_int_methods"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1187,10 +1173,7 @@ assert_eq!(", stringify!($SelfT), "::max_value().wrapping_add(2), ", stringify!( $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1214,10 +1197,7 @@ stringify!($SelfT), "::max_value());", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1240,10 +1220,7 @@ assert_eq!(11i8.wrapping_mul(12), -124);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1388,10 +1365,7 @@ assert_eq!(", stringify!($SelfT), "::min_value().wrapping_neg(), ", stringify!($ $EndFeature, " ```"), #[stable(feature = "num_wrapping", since = "1.2.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] pub const fn wrapping_neg(self) -> Self { self.overflowing_neg().0 @@ -1417,10 +1391,7 @@ assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(128), -1);", $EndFeature, " ```"), #[stable(feature = "num_wrapping", since = "1.2.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1452,10 +1423,7 @@ assert_eq!((-128i16).wrapping_shr(64), -128);", $EndFeature, " ```"), #[stable(feature = "num_wrapping", since = "1.2.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1489,22 +1457,16 @@ assert_eq!((-128i8).wrapping_abs() as u8, 128);", $EndFeature, " ```"), #[stable(feature = "no_panic_abs", since = "1.13.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] + #[allow(unused_attributes)] + #[allow_internal_unstable(const_if_match)] #[inline] pub const fn wrapping_abs(self) -> Self { - // sign is -1 (all ones) for negative numbers, 0 otherwise. - let sign = self >> ($BITS - 1); - // For positive self, sign == 0 so the expression is simply - // (self ^ 0).wrapping_sub(0) == self == abs(self). - // - // For negative self, self ^ sign == self ^ all_ones. - // But all_ones ^ self == all_ones - self == -1 - self. - // So for negative numbers, (self ^ sign).wrapping_sub(sign) is - // (-1 - self).wrapping_sub(-1) == -self == abs(self). - (self ^ sign).wrapping_sub(sign) + if self.is_negative() { + self.wrapping_neg() + } else { + self + } } } @@ -1567,10 +1529,7 @@ assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (", stringify!($Sel "::MIN, true));", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1598,10 +1557,7 @@ assert_eq!(", stringify!($SelfT), "::MIN.overflowing_sub(1), (", stringify!($Sel "::MAX, true));", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1627,10 +1583,7 @@ assert_eq!(1_000_000_000i32.overflowing_mul(10), (1410065408, true));", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1798,12 +1751,15 @@ assert_eq!(", stringify!($SelfT), "::MIN.overflowing_neg(), (", stringify!($Self ```"), #[inline] #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] + #[allow(unused_attributes)] + #[allow_internal_unstable(const_if_match)] pub const fn overflowing_neg(self) -> (Self, bool) { - ((!self).wrapping_add(1), self == Self::min_value()) + if self == Self::min_value() { + (Self::min_value(), true) + } else { + (-self, false) + } } } @@ -1824,10 +1780,7 @@ assert_eq!(0x1i32.overflowing_shl(36), (0x10, true));", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1853,10 +1806,7 @@ assert_eq!(0x10i32.overflowing_shr(36), (0x1, true));", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1885,10 +1835,7 @@ assert_eq!((", stringify!($SelfT), "::min_value()).overflowing_abs(), (", string $EndFeature, " ```"), #[stable(feature = "no_panic_abs", since = "1.13.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] pub const fn overflowing_abs(self) -> (Self, bool) { (self.wrapping_abs(), self == Self::min_value()) @@ -2093,31 +2040,20 @@ assert_eq!((-10", stringify!($SelfT), ").abs(), 10);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] + #[allow(unused_attributes)] + #[allow_internal_unstable(const_if_match)] #[inline] #[rustc_inherit_overflow_checks] pub const fn abs(self) -> Self { // Note that the #[inline] above means that the overflow // semantics of the subtraction depend on the crate we're being // inlined into. - - // sign is -1 (all ones) for negative numbers, 0 otherwise. - let sign = self >> ($BITS - 1); - // For positive self, sign == 0 so the expression is simply - // (self ^ 0) - 0 == self == abs(self). - // - // For negative self, self ^ sign == self ^ all_ones. - // But all_ones ^ self == all_ones - self == -1 - self. - // So for negative numbers, (self ^ sign) - sign is - // (-1 - self) - -1 == -self == abs(self). - // - // The subtraction overflows when self is min_value(), because - // (-1 - min_value()) - -1 is max_value() - -1 which overflows. - // This is exactly when we want self.abs() to overflow. - (self ^ sign) - sign + if self.is_negative() { + -self + } else { + self + } } } @@ -2139,14 +2075,14 @@ assert_eq!((-10", stringify!($SelfT), ").signum(), -1);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_sign"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_sign", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_sign", issue = "53718")] #[inline] pub const fn signum(self) -> Self { - (self > 0) as Self - (self < 0) as Self + match self { + n if n > 0 => 1, + 0 => 0, + _ => -1, + } } } @@ -2164,10 +2100,7 @@ assert!(!(-10", stringify!($SelfT), ").is_positive());", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] pub const fn is_positive(self) -> bool { self > 0 } } @@ -2186,10 +2119,7 @@ assert!(!10", stringify!($SelfT), ".is_negative());", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_int_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")] #[inline] pub const fn is_negative(self) -> bool { self < 0 } } @@ -2207,11 +2137,7 @@ let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes(); assert_eq!(bytes, ", $be_bytes, "); ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn to_be_bytes(self) -> [u8; mem::size_of::()] { self.to_be().to_ne_bytes() @@ -2231,11 +2157,7 @@ let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes(); assert_eq!(bytes, ", $le_bytes, "); ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn to_le_bytes(self) -> [u8; mem::size_of::()] { self.to_le().to_ne_bytes() @@ -2270,11 +2192,7 @@ assert_eq!( ); ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn to_ne_bytes(self) -> [u8; mem::size_of::()] { // SAFETY: integers are plain old datatypes so we can always transmute them to @@ -2308,11 +2226,7 @@ fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), } ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn from_be_bytes(bytes: [u8; mem::size_of::()]) -> Self { Self::from_be(Self::from_ne_bytes(bytes)) @@ -2345,11 +2259,7 @@ fn read_le_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), } ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn from_le_bytes(bytes: [u8; mem::size_of::()]) -> Self { Self::from_le(Self::from_ne_bytes(bytes)) @@ -2392,11 +2302,7 @@ fn read_ne_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), } ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn from_ne_bytes(bytes: [u8; mem::size_of::()]) -> Self { // SAFETY: integers are plain old datatypes so we can always transmute to them @@ -2490,10 +2396,7 @@ Basic usage: #[stable(feature = "rust1", since = "1.0.0")] #[rustc_promotable] #[inline(always)] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_min_value", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_min_value", since = "1.32.0")] pub const fn min_value() -> Self { 0 } } @@ -2511,10 +2414,7 @@ stringify!($MaxV), ");", $EndFeature, " #[stable(feature = "rust1", since = "1.0.0")] #[rustc_promotable] #[inline(always)] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_max_value", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_max_value", since = "1.32.0")] pub const fn max_value() -> Self { !0 } } @@ -2561,10 +2461,7 @@ Basic usage: assert_eq!(n.count_ones(), 3);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] pub const fn count_ones(self) -> u32 { intrinsics::ctpop(self as $ActualT) as u32 @@ -2582,10 +2479,7 @@ Basic usage: ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 0);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] pub const fn count_zeros(self) -> u32 { (!self).count_ones() @@ -2605,10 +2499,7 @@ Basic usage: assert_eq!(n.leading_zeros(), 2);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] pub const fn leading_zeros(self) -> u32 { intrinsics::ctlz(self as $ActualT) as u32 @@ -2629,16 +2520,54 @@ Basic usage: assert_eq!(n.trailing_zeros(), 3);", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] pub const fn trailing_zeros(self) -> u32 { intrinsics::cttz(self) as u32 } } + doc_comment! { + concat!("Returns the number of leading ones in the binary representation of `self`. + +# Examples + +Basic usage: + +``` +", $Feature, "#![feature(leading_trailing_ones)] +let n = !(", stringify!($SelfT), "::max_value() >> 2); + +assert_eq!(n.leading_ones(), 2);", $EndFeature, " +```"), + #[unstable(feature = "leading_trailing_ones", issue = "57969")] + #[inline] + pub const fn leading_ones(self) -> u32 { + (!self).leading_zeros() + } + } + + doc_comment! { + concat!("Returns the number of trailing ones in the binary representation +of `self`. + +# Examples + +Basic usage: + +``` +", $Feature, "#![feature(leading_trailing_ones)] +let n = 0b1010111", stringify!($SelfT), "; + +assert_eq!(n.trailing_ones(), 3);", $EndFeature, " +```"), + #[unstable(feature = "leading_trailing_ones", issue = "57969")] + #[inline] + pub const fn trailing_ones(self) -> u32 { + (!self).trailing_zeros() + } + } + doc_comment! { concat!("Shifts the bits to the left by a specified amount, `n`, wrapping the truncated bits to the end of the resulting integer. @@ -2656,10 +2585,7 @@ let m = ", $rot_result, "; assert_eq!(n.rotate_left(", $rot, "), m); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -2686,10 +2612,7 @@ let m = ", $rot_op, "; assert_eq!(n.rotate_right(", $rot, "), m); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -2713,10 +2636,7 @@ let m = n.swap_bytes(); assert_eq!(m, ", $swapped, "); ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] pub const fn swap_bytes(self) -> Self { intrinsics::bswap(self as $ActualT) as Self @@ -2737,10 +2657,7 @@ let m = n.reverse_bits(); assert_eq!(m, ", $reversed, "); ```"), #[stable(feature = "reverse_bits", since = "1.37.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] #[must_use] pub const fn reverse_bits(self) -> Self { @@ -2768,10 +2685,7 @@ if cfg!(target_endian = \"big\") { }", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] pub const fn from_be(x: Self) -> Self { #[cfg(target_endian = "big")] @@ -2805,10 +2719,7 @@ if cfg!(target_endian = \"little\") { }", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] pub const fn from_le(x: Self) -> Self { #[cfg(target_endian = "little")] @@ -2842,10 +2753,7 @@ if cfg!(target_endian = \"big\") { }", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] pub const fn to_be(self) -> Self { // or not to be? #[cfg(target_endian = "big")] @@ -2879,10 +2787,7 @@ if cfg!(target_endian = \"little\") { }", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_math", since = "1.32.0")] #[inline] pub const fn to_le(self) -> Self { #[cfg(target_endian = "little")] @@ -3188,11 +3093,7 @@ assert_eq!(200u8.saturating_add(127), 255);", $EndFeature, " #[stable(feature = "rust1", since = "1.0.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_saturating_int_methods"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] #[inline] pub const fn saturating_add(self, rhs: Self) -> Self { intrinsics::saturating_add(self, rhs) @@ -3214,11 +3115,7 @@ assert_eq!(13", stringify!($SelfT), ".saturating_sub(127), 0);", $EndFeature, " #[stable(feature = "rust1", since = "1.0.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_saturating_int_methods"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_saturating_int_methods", issue = "53718")] #[inline] pub const fn saturating_sub(self, rhs: Self) -> Self { intrinsics::saturating_sub(self, rhs) @@ -3290,10 +3187,7 @@ assert_eq!(200", stringify!($SelfT), ".wrapping_add(", stringify!($SelfT), "::ma $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -3316,10 +3210,7 @@ assert_eq!(100", stringify!($SelfT), ".wrapping_sub(", stringify!($SelfT), "::ma $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -3343,10 +3234,7 @@ $EndFeature, " /// assert_eq!(25u8.wrapping_mul(12), 44); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -3476,10 +3364,7 @@ assert_eq!(100", stringify!($SelfT), ".wrapping_rem_euclid(10), 0); /// assert_eq!((-128i8).wrapping_neg(), -128); /// ``` #[stable(feature = "num_wrapping", since = "1.2.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[inline] pub const fn wrapping_neg(self) -> Self { self.overflowing_neg().0 @@ -3506,10 +3391,7 @@ Basic usage: assert_eq!(1", stringify!($SelfT), ".wrapping_shl(128), 1);", $EndFeature, " ```"), #[stable(feature = "num_wrapping", since = "1.2.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -3543,10 +3425,7 @@ Basic usage: assert_eq!(128", stringify!($SelfT), ".wrapping_shr(128), 128);", $EndFeature, " ```"), #[stable(feature = "num_wrapping", since = "1.2.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -3616,10 +3495,7 @@ assert_eq!(5", stringify!($SelfT), ".overflowing_add(2), (7, false)); assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (0, true));", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -3648,10 +3524,7 @@ assert_eq!(0", stringify!($SelfT), ".overflowing_sub(1), (", stringify!($SelfT), $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -3679,10 +3552,7 @@ $EndFeature, " /// assert_eq!(1_000_000_000u32.overflowing_mul(10), (1410065408, true)); /// ``` #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -3828,10 +3698,7 @@ assert_eq!(2", stringify!($SelfT), ".overflowing_neg(), (-2i32 as ", stringify!( ```"), #[inline] #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] pub const fn overflowing_neg(self) -> (Self, bool) { ((!self).wrapping_add(1), self != 0) } @@ -3855,10 +3722,7 @@ Basic usage assert_eq!(0x1", stringify!($SelfT), ".overflowing_shl(132), (0x10, true));", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -3885,10 +3749,7 @@ Basic usage assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(132), (0x1, true));", $EndFeature, " ```"), #[stable(feature = "wrapping", since = "1.7.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_wrapping_math", since = "1.32.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -4054,10 +3915,7 @@ Basic usage: assert!(!10", stringify!($SelfT), ".is_power_of_two());", $EndFeature, " ```"), #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_is_power_of_two", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_is_power_of_two", since = "1.32.0")] #[inline] pub const fn is_power_of_two(self) -> bool { self.count_ones() == 1 @@ -4169,11 +4027,7 @@ let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes(); assert_eq!(bytes, ", $be_bytes, "); ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn to_be_bytes(self) -> [u8; mem::size_of::()] { self.to_be().to_ne_bytes() @@ -4193,11 +4047,7 @@ let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes(); assert_eq!(bytes, ", $le_bytes, "); ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn to_le_bytes(self) -> [u8; mem::size_of::()] { self.to_le().to_ne_bytes() @@ -4232,11 +4082,7 @@ assert_eq!( ); ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn to_ne_bytes(self) -> [u8; mem::size_of::()] { // SAFETY: integers are plain old datatypes so we can always transmute them to @@ -4270,11 +4116,7 @@ fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), } ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn from_be_bytes(bytes: [u8; mem::size_of::()]) -> Self { Self::from_be(Self::from_ne_bytes(bytes)) @@ -4307,11 +4149,7 @@ fn read_le_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), } ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn from_le_bytes(bytes: [u8; mem::size_of::()]) -> Self { Self::from_le(Self::from_ne_bytes(bytes)) @@ -4354,11 +4192,7 @@ fn read_ne_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), } ```"), #[stable(feature = "int_to_from_bytes", since = "1.32.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_int_conversion"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_int_conversion", issue = "53718"), - )] + #[rustc_const_unstable(feature = "const_int_conversion", issue = "53718")] #[inline] pub const fn from_ne_bytes(bytes: [u8; mem::size_of::()]) -> Self { // SAFETY: integers are plain old datatypes so we can always transmute to them @@ -4535,10 +4369,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_alphabetic(&self) -> bool { - match *self { - b'A'..=b'Z' | b'a'..=b'z' => true, - _ => false, - } + matches!(*self, b'A'..=b'Z' | b'a'..=b'z') } /// Checks if the value is an ASCII uppercase character: @@ -4570,10 +4401,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_uppercase(&self) -> bool { - match *self { - b'A'..=b'Z' => true, - _ => false, - } + matches!(*self, b'A'..=b'Z') } /// Checks if the value is an ASCII lowercase character: @@ -4605,10 +4433,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_lowercase(&self) -> bool { - match *self { - b'a'..=b'z' => true, - _ => false, - } + matches!(*self, b'a'..=b'z') } /// Checks if the value is an ASCII alphanumeric character: @@ -4643,10 +4468,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_alphanumeric(&self) -> bool { - match *self { - b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z' => true, - _ => false, - } + matches!(*self, b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z') } /// Checks if the value is an ASCII decimal digit: @@ -4678,10 +4500,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_digit(&self) -> bool { - match *self { - b'0'..=b'9' => true, - _ => false, - } + matches!(*self, b'0'..=b'9') } /// Checks if the value is an ASCII hexadecimal digit: @@ -4716,10 +4535,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_hexdigit(&self) -> bool { - match *self { - b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f' => true, - _ => false, - } + matches!(*self, b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f') } /// Checks if the value is an ASCII punctuation character: @@ -4755,10 +4571,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_punctuation(&self) -> bool { - match *self { - b'!'..=b'/' | b':'..=b'@' | b'['..=b'`' | b'{'..=b'~' => true, - _ => false, - } + matches!(*self, b'!'..=b'/' | b':'..=b'@' | b'['..=b'`' | b'{'..=b'~') } /// Checks if the value is an ASCII graphic character: @@ -4790,10 +4603,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_graphic(&self) -> bool { - match *self { - b'!'..=b'~' => true, - _ => false, - } + matches!(*self, b'!'..=b'~') } /// Checks if the value is an ASCII whitespace character: @@ -4842,10 +4652,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_whitespace(&self) -> bool { - match *self { - b'\t' | b'\n' | b'\x0C' | b'\r' | b' ' => true, - _ => false, - } + matches!(*self, b'\t' | b'\n' | b'\x0C' | b'\r' | b' ') } /// Checks if the value is an ASCII control character: @@ -4879,10 +4686,7 @@ impl u8 { #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")] #[inline] pub fn is_ascii_control(&self) -> bool { - match *self { - b'\0'..=b'\x1F' | b'\x7F' => true, - _ => false, - } + matches!(*self, b'\0'..=b'\x1F' | b'\x7F') } } @@ -5017,7 +4821,7 @@ impl TryFromIntError { feature = "int_error_internals", reason = "available through Error trait and this method should \ not be exposed publicly", - issue = "0" + issue = "none" )] #[doc(hidden)] pub fn __description(&self) -> &str { @@ -5216,7 +5020,7 @@ impl ParseIntError { feature = "int_error_internals", reason = "available through Error trait and this method should \ not be exposed publicly", - issue = "0" + issue = "none" )] #[doc(hidden)] pub fn __description(&self) -> &str { diff --git a/src/libcore/num/wrapping.rs b/src/libcore/num/wrapping.rs index 46398dd2f8..82fa6acfbd 100644 --- a/src/libcore/num/wrapping.rs +++ b/src/libcore/num/wrapping.rs @@ -530,10 +530,7 @@ assert_eq!(n.trailing_zeros(), 3); /// assert_eq!(m, Wrapping(-22016)); /// ``` #[stable(feature = "reverse_bits", since = "1.37.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_reverse_bits", since = "1.37.0"), - )] + #[rustc_const_stable(feature = "const_reverse_bits", since = "1.37.0")] #[inline] #[must_use] pub const fn reverse_bits(self) -> Self { diff --git a/src/libcore/ops/deref.rs b/src/libcore/ops/deref.rs index f521355a90..68244fdb38 100644 --- a/src/libcore/ops/deref.rs +++ b/src/libcore/ops/deref.rs @@ -178,14 +178,14 @@ impl DerefMut for &mut T { /// `arbitrary_self_types` feature. This is implemented by stdlib pointer types like `Box`, /// `Rc`, `&T`, and `Pin

`. #[lang = "receiver"] -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] #[doc(hidden)] pub trait Receiver { // Empty. } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for &T {} -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for &mut T {} diff --git a/src/libcore/ops/drop.rs b/src/libcore/ops/drop.rs index eae63ea239..5233b475c4 100644 --- a/src/libcore/ops/drop.rs +++ b/src/libcore/ops/drop.rs @@ -99,9 +99,15 @@ pub trait Drop { /// Given that a [`panic!`] will call `drop` as it unwinds, any [`panic!`] /// in a `drop` implementation will likely abort. /// + /// Note that even if this panics, the value is considered to be dropped; + /// you must not cause `drop` to be called again. This is normally automatically + /// handled by the compiler, but when using unsafe code, can sometimes occur + /// unintentionally, particularly when using [`std::ptr::drop_in_place`]. + /// /// [E0040]: ../../error-index.html#E0040 /// [`panic!`]: ../macro.panic.html /// [`std::mem::drop`]: ../../std/mem/fn.drop.html + /// [`std::ptr::drop_in_place`]: ../../std/ptr/fn.drop_in_place.html #[stable(feature = "rust1", since = "1.0.0")] fn drop(&mut self); } diff --git a/src/libcore/ops/function.rs b/src/libcore/ops/function.rs index 505a65cee3..04c7789fa4 100644 --- a/src/libcore/ops/function.rs +++ b/src/libcore/ops/function.rs @@ -2,12 +2,12 @@ /// /// Instances of `Fn` can be called repeatedly without mutating state. /// -/// *This trait (`Fn`) is not to be confused with [function pointers][] +/// *This trait (`Fn`) is not to be confused with [function pointers] /// (`fn`).* /// /// `Fn` is implemented automatically by closures which only take immutable /// references to captured variables or don't capture anything at all, as well -/// as (safe) [function pointers][] (with some caveats, see their documentation +/// as (safe) [function pointers] (with some caveats, see their documentation /// for more details). Additionally, for any type `F` that implements `Fn`, `&F` /// implements `Fn`, too. /// @@ -78,7 +78,7 @@ pub trait Fn: FnMut { /// /// `FnMut` is implemented automatically by closures which take mutable /// references to captured variables, as well as all types that implement -/// [`Fn`], e.g., (safe) [function pointers][] (since `FnMut` is a supertrait of +/// [`Fn`], e.g., (safe) [function pointers] (since `FnMut` is a supertrait of /// [`Fn`]). Additionally, for any type `F` that implements `FnMut`, `&mut F` /// implements `FnMut`, too. /// @@ -162,7 +162,7 @@ pub trait FnMut: FnOnce { /// /// `FnOnce` is implemented automatically by closure that might consume captured /// variables, as well as all types that implement [`FnMut`], e.g., (safe) -/// [function pointers][] (since `FnOnce` is a supertrait of [`FnMut`]). +/// [function pointers] (since `FnOnce` is a supertrait of [`FnMut`]). /// /// Since both [`Fn`] and [`FnMut`] are subtraits of `FnOnce`, any instance of /// [`Fn`] or [`FnMut`] can be used where a `FnOnce` is expected. diff --git a/src/libcore/ops/mod.rs b/src/libcore/ops/mod.rs index 80ab906961..77b92b6ccb 100644 --- a/src/libcore/ops/mod.rs +++ b/src/libcore/ops/mod.rs @@ -168,7 +168,7 @@ pub use self::bit::{BitAndAssign, BitOrAssign, BitXorAssign, ShlAssign, ShrAssig #[stable(feature = "rust1", since = "1.0.0")] pub use self::deref::{Deref, DerefMut}; -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] pub use self::deref::Receiver; #[stable(feature = "rust1", since = "1.0.0")] @@ -195,5 +195,5 @@ pub use self::generator::{Generator, GeneratorState}; #[unstable(feature = "coerce_unsized", issue = "27732")] pub use self::unsize::CoerceUnsized; -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] pub use self::unsize::DispatchFromDyn; diff --git a/src/libcore/ops/range.rs b/src/libcore/ops/range.rs index 54ce2917a3..d38b351656 100644 --- a/src/libcore/ops/range.rs +++ b/src/libcore/ops/range.rs @@ -333,6 +333,11 @@ impl> RangeTo { #[derive(Clone)] // not Copy -- see #27186 #[stable(feature = "inclusive_range", since = "1.26.0")] pub struct RangeInclusive { + // Note that the fields here are not public to allow changing the + // representation in the future; in particular, while we could plausibly + // expose start/end, modifying them without changing (future/current) + // private fields may lead to incorrect behavior, so we don't want to + // support that mode. pub(crate) start: Idx, pub(crate) end: Idx, pub(crate) is_empty: Option, @@ -398,7 +403,7 @@ impl RangeInclusive { #[stable(feature = "inclusive_range_methods", since = "1.27.0")] #[inline] #[rustc_promotable] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_range_new", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_range_new", since = "1.32.0")] pub const fn new(start: Idx, end: Idx) -> Self { Self { start, end, is_empty: None } } @@ -422,10 +427,7 @@ impl RangeInclusive { /// assert_eq!((3..=5).start(), &3); /// ``` #[stable(feature = "inclusive_range_methods", since = "1.27.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_inclusive_range_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_inclusive_range_methods", since = "1.32.0")] #[inline] pub const fn start(&self) -> &Idx { &self.start @@ -450,10 +452,7 @@ impl RangeInclusive { /// assert_eq!((3..=5).end(), &5); /// ``` #[stable(feature = "inclusive_range_methods", since = "1.27.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_inclusive_range_methods", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_inclusive_range_methods", since = "1.32.0")] #[inline] pub const fn end(&self) -> &Idx { &self.end diff --git a/src/libcore/ops/try.rs b/src/libcore/ops/try.rs index 22ba97b91d..996a01d413 100644 --- a/src/libcore/ops/try.rs +++ b/src/libcore/ops/try.rs @@ -5,26 +5,23 @@ /// extracting those success or failure values from an existing instance and /// creating a new instance from a success or failure value. #[unstable(feature = "try_trait", issue = "42327")] -#[cfg_attr( - not(bootstrap), - rustc_on_unimplemented( - on( - all( - any(from_method = "from_error", from_method = "from_ok"), - from_desugaring = "QuestionMark" - ), - message = "the `?` operator can only be used in {ItemContext} \ - that returns `Result` or `Option` \ - (or another type that implements `{Try}`)", - label = "cannot use the `?` operator in {ItemContext} that returns `{Self}`", - enclosing_scope = "this function should return `Result` or `Option` to accept `?`" +#[rustc_on_unimplemented( + on( + all( + any(from_method = "from_error", from_method = "from_ok"), + from_desugaring = "QuestionMark" ), - on( - all(from_method = "into_result", from_desugaring = "QuestionMark"), - message = "the `?` operator can only be applied to values \ - that implement `{Try}`", - label = "the `?` operator cannot be applied to type `{Self}`" - ) + message = "the `?` operator can only be used in {ItemContext} \ + that returns `Result` or `Option` \ + (or another type that implements `{Try}`)", + label = "cannot use the `?` operator in {ItemContext} that returns `{Self}`", + enclosing_scope = "this function should return `Result` or `Option` to accept `?`" + ), + on( + all(from_method = "into_result", from_desugaring = "QuestionMark"), + message = "the `?` operator can only be applied to values \ + that implement `{Try}`", + label = "the `?` operator cannot be applied to type `{Self}`" ) )] #[doc(alias = "?")] diff --git a/src/libcore/ops/unsize.rs b/src/libcore/ops/unsize.rs index 80fb5642a6..95a4393592 100644 --- a/src/libcore/ops/unsize.rs +++ b/src/libcore/ops/unsize.rs @@ -81,21 +81,21 @@ impl, U: ?Sized> CoerceUnsized<*const U> for *const T {} /// T: Unsize, /// {} /// ``` -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] #[lang = "dispatch_from_dyn"] pub trait DispatchFromDyn { // Empty. } // &T -> &U -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl<'a, T: ?Sized + Unsize, U: ?Sized> DispatchFromDyn<&'a U> for &'a T {} // &mut T -> &mut U -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl<'a, T: ?Sized + Unsize, U: ?Sized> DispatchFromDyn<&'a mut U> for &'a mut T {} // *const T -> *const U -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn<*const U> for *const T {} // *mut T -> *mut U -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U: ?Sized> DispatchFromDyn<*mut U> for *mut T {} diff --git a/src/libcore/option.rs b/src/libcore/option.rs index 2066a484da..cb4247d987 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -151,6 +151,7 @@ use crate::{ /// The `Option` type. See [the module level documentation](index.html) for more. #[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)] +#[rustc_diagnostic_item = "option_type"] #[stable(feature = "rust1", since = "1.0.0")] pub enum Option { /// No value @@ -187,10 +188,7 @@ impl Option { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn is_some(&self) -> bool { - match *self { - Some(_) => true, - None => false, - } + matches!(*self, Some(_)) } /// Returns `true` if the option is a [`None`] value. @@ -341,6 +339,7 @@ impl Option { /// x.expect("the world is ending"); // panics with `the world is ending` /// ``` #[inline] + #[track_caller] #[stable(feature = "rust1", since = "1.0.0")] pub fn expect(self, msg: &str) -> T { match self { @@ -374,6 +373,7 @@ impl Option { /// assert_eq!(x.unwrap(), "air"); // fails /// ``` #[inline] + #[track_caller] #[stable(feature = "rust1", since = "1.0.0")] pub fn unwrap(self) -> T { match self { @@ -1015,6 +1015,7 @@ impl Option { /// } /// ``` #[inline] + #[track_caller] #[unstable(feature = "option_expect_none", reason = "newly added", issue = "62633")] pub fn expect_none(self, msg: &str) { if let Some(val) = self { @@ -1057,6 +1058,7 @@ impl Option { /// } /// ``` #[inline] + #[track_caller] #[unstable(feature = "option_unwrap_none", reason = "newly added", issue = "62633")] pub fn unwrap_none(self) { if let Some(val) = self { @@ -1184,6 +1186,7 @@ impl Option> { // This is a separate function to reduce the code size of .expect() itself. #[inline(never)] #[cold] +#[track_caller] fn expect_failed(msg: &str) -> ! { panic!("{}", msg) } @@ -1191,6 +1194,7 @@ fn expect_failed(msg: &str) -> ! { // This is a separate function to reduce the code size of .expect_none() itself. #[inline(never)] #[cold] +#[track_caller] fn expect_none_failed(msg: &str, value: &dyn fmt::Debug) -> ! { panic!("{}: {:?}", msg, value) } diff --git a/src/libcore/panic.rs b/src/libcore/panic.rs index 48bb504a73..dbfcbca3ff 100644 --- a/src/libcore/panic.rs +++ b/src/libcore/panic.rs @@ -37,10 +37,12 @@ pub struct PanicInfo<'a> { } impl<'a> PanicInfo<'a> { - #[unstable(feature = "panic_internals", - reason = "internal details of the implementation of the `panic!` \ + #[unstable( + feature = "panic_internals", + reason = "internal details of the implementation of the `panic!` \ and related macros", - issue = "0")] + issue = "none" + )] #[doc(hidden)] #[inline] pub fn internal_constructor( @@ -48,17 +50,15 @@ impl<'a> PanicInfo<'a> { location: &'a Location<'a>, ) -> Self { struct NoPayload; - PanicInfo { - location, - message, - payload: &NoPayload, - } + PanicInfo { location, message, payload: &NoPayload } } - #[unstable(feature = "panic_internals", - reason = "internal details of the implementation of the `panic!` \ + #[unstable( + feature = "panic_internals", + reason = "internal details of the implementation of the `panic!` \ and related macros", - issue = "0")] + issue = "none" + )] #[doc(hidden)] #[inline] pub fn set_payload(&mut self, info: &'a (dyn Any + Send)) { @@ -222,10 +222,11 @@ impl<'a> Location<'a> { /// assert_ne!(this_location.line(), another_location.line()); /// assert_ne!(this_location.column(), another_location.column()); /// ``` - #[cfg(not(bootstrap))] - #[unstable(feature = "track_caller", - reason = "uses #[track_caller] which is not yet stable", - issue = "47809")] + #[unstable( + feature = "track_caller", + reason = "uses #[track_caller] which is not yet stable", + issue = "47809" + )] #[track_caller] pub const fn caller() -> &'static Location<'static> { crate::intrinsics::caller_location() @@ -233,10 +234,12 @@ impl<'a> Location<'a> { } impl<'a> Location<'a> { - #![unstable(feature = "panic_internals", - reason = "internal details of the implementation of the `panic!` \ + #![unstable( + feature = "panic_internals", + reason = "internal details of the implementation of the `panic!` \ and related macros", - issue = "0")] + issue = "none" + )] #[doc(hidden)] pub const fn internal_constructor(file: &'a str, line: u32, col: u32) -> Self { Location { file, line, col } @@ -319,7 +322,7 @@ impl fmt::Display for Location<'_> { /// An internal trait used by libstd to pass data from libstd to `panic_unwind` /// and other panic runtimes. Not intended to be stabilized any time soon, do /// not use. -#[unstable(feature = "std_internals", issue = "0")] +#[unstable(feature = "std_internals", issue = "none")] #[doc(hidden)] pub unsafe trait BoxMeUp { /// Take full ownership of the contents. diff --git a/src/libcore/panicking.rs b/src/libcore/panicking.rs index 4857b11459..61b764f2d6 100644 --- a/src/libcore/panicking.rs +++ b/src/libcore/panicking.rs @@ -26,7 +26,7 @@ feature = "core_panic", reason = "internal details of the implementation of the `panic!` \ and related macros", - issue = "0" + issue = "none" )] use crate::fmt; @@ -36,8 +36,9 @@ use crate::panic::{Location, PanicInfo}; // never inline unless panic_immediate_abort to avoid code // bloat at the call sites as much as possible #[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))] +#[track_caller] #[lang = "panic"] // needed by codegen for panic on overflow and other `Assert` MIR terminators -pub fn panic(expr: &str, location: &Location<'_>) -> ! { +pub fn panic(expr: &str) -> ! { if cfg!(feature = "panic_immediate_abort") { unsafe { super::intrinsics::abort() } } @@ -48,7 +49,7 @@ pub fn panic(expr: &str, location: &Location<'_>) -> ! { // truncation and padding (even though none is used here). Using // Arguments::new_v1 may allow the compiler to omit Formatter::pad from the // output binary, saving up to a few kilobytes. - panic_fmt(fmt::Arguments::new_v1(&[expr], &[]), location) + panic_fmt(fmt::Arguments::new_v1(&[expr], &[]), Location::caller()) } #[cold] diff --git a/src/libcore/pin.rs b/src/libcore/pin.rs index 6a0c5bbebc..676d2c784a 100644 --- a/src/libcore/pin.rs +++ b/src/libcore/pin.rs @@ -672,6 +672,7 @@ impl<'a, T: ?Sized> Pin<&'a T> { #[stable(feature = "pin", since = "1.33.0")] pub unsafe fn map_unchecked(self, func: F) -> Pin<&'a U> where + U: ?Sized, F: FnOnce(&T) -> &U, { let pointer = &*self.pointer; @@ -763,6 +764,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> { #[stable(feature = "pin", since = "1.33.0")] pub unsafe fn map_unchecked_mut(self, func: F) -> Pin<&'a mut U> where + U: ?Sized, F: FnOnce(&mut T) -> &mut U, { let pointer = Pin::get_unchecked_mut(self); @@ -786,7 +788,7 @@ impl> DerefMut for Pin

{ } } -#[unstable(feature = "receiver_trait", issue = "0")] +#[unstable(feature = "receiver_trait", issue = "none")] impl Receiver for Pin

{} #[stable(feature = "pin", since = "1.33.0")] diff --git a/src/libcore/ptr/const_ptr.rs b/src/libcore/ptr/const_ptr.rs new file mode 100644 index 0000000000..fc3c02e1f0 --- /dev/null +++ b/src/libcore/ptr/const_ptr.rs @@ -0,0 +1,762 @@ +use super::*; +use crate::cmp::Ordering::{self, Equal, Greater, Less}; +use crate::intrinsics; +use crate::mem; + +// ignore-tidy-undocumented-unsafe + +#[lang = "const_ptr"] +impl *const T { + /// Returns `true` if the pointer is null. + /// + /// Note that unsized types have many possible null pointers, as only the + /// raw data pointer is considered, not their length, vtable, etc. + /// Therefore, two pointers that are null may still not compare equal to + /// each other. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let s: &str = "Follow the rabbit"; + /// let ptr: *const u8 = s.as_ptr(); + /// assert!(!ptr.is_null()); + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + #[inline] + pub fn is_null(self) -> bool { + // Compare via a cast to a thin pointer, so fat pointers are only + // considering their "data" part for null-ness. + (self as *const u8) == null() + } + + /// Casts to a pointer of another type. + #[stable(feature = "ptr_cast", since = "1.38.0")] + #[rustc_const_stable(feature = "const_ptr_cast", since = "1.38.0")] + #[inline] + pub const fn cast(self) -> *const U { + self as _ + } + + /// Returns `None` if the pointer is null, or else returns a reference to + /// the value wrapped in `Some`. + /// + /// # Safety + /// + /// While this method and its mutable counterpart are useful for + /// null-safety, it is important to note that this is still an unsafe + /// operation because the returned value could be pointing to invalid + /// memory. + /// + /// When calling this method, you have to ensure that *either* the pointer is NULL *or* + /// all of the following is true: + /// - it is properly aligned + /// - it must point to an initialized instance of T; in particular, the pointer must be + /// "dereferencable" in the sense defined [here]. + /// + /// This applies even if the result of this method is unused! + /// (The part about being initialized is not yet fully decided, but until + /// it is, the only safe approach is to ensure that they are indeed initialized.) + /// + /// Additionally, the lifetime `'a` returned is arbitrarily chosen and does + /// not necessarily reflect the actual lifetime of the data. *You* must enforce + /// Rust's aliasing rules. In particular, for the duration of this lifetime, + /// the memory the pointer points to must not get mutated (except inside `UnsafeCell`). + /// + /// [here]: crate::ptr#safety + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let ptr: *const u8 = &10u8 as *const u8; + /// + /// unsafe { + /// if let Some(val_back) = ptr.as_ref() { + /// println!("We got back the value: {}!", val_back); + /// } + /// } + /// ``` + /// + /// # Null-unchecked version + /// + /// If you are sure the pointer can never be null and are looking for some kind of + /// `as_ref_unchecked` that returns the `&T` instead of `Option<&T>`, know that you can + /// dereference the pointer directly. + /// + /// ``` + /// let ptr: *const u8 = &10u8 as *const u8; + /// + /// unsafe { + /// let val_back = &*ptr; + /// println!("We got back the value: {}!", val_back); + /// } + /// ``` + #[stable(feature = "ptr_as_ref", since = "1.9.0")] + #[inline] + pub unsafe fn as_ref<'a>(self) -> Option<&'a T> { + if self.is_null() { None } else { Some(&*self) } + } + + /// Calculates the offset from a pointer. + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// If any of the following conditions are violated, the result is Undefined + /// Behavior: + /// + /// * Both the starting and resulting pointer must be either in bounds or one + /// byte past the end of the same allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// * The computed offset, **in bytes**, cannot overflow an `isize`. + /// + /// * The offset being in bounds cannot rely on "wrapping around" the address + /// space. That is, the infinite-precision sum, **in bytes** must fit in a usize. + /// + /// The compiler and standard library generally tries to ensure allocations + /// never reach a size where an offset is a concern. For instance, `Vec` + /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so + /// `vec.as_ptr().add(vec.len())` is always safe. + /// + /// Most platforms fundamentally can't even construct such an allocation. + /// For instance, no known 64-bit platform can ever serve a request + /// for 263 bytes due to page-table limitations or splitting the address space. + /// However, some 32-bit and 16-bit platforms may successfully serve a request for + /// more than `isize::MAX` bytes with things like Physical Address + /// Extension. As such, memory acquired directly from allocators or memory + /// mapped files *may* be too large to handle with this function. + /// + /// Consider using [`wrapping_offset`] instead if these constraints are + /// difficult to satisfy. The only advantage of this method is that it + /// enables more aggressive compiler optimizations. + /// + /// [`wrapping_offset`]: #method.wrapping_offset + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let s: &str = "123"; + /// let ptr: *const u8 = s.as_ptr(); + /// + /// unsafe { + /// println!("{}", *ptr.offset(1) as char); + /// println!("{}", *ptr.offset(2) as char); + /// } + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + #[inline] + pub unsafe fn offset(self, count: isize) -> *const T + where + T: Sized, + { + intrinsics::offset(self, count) + } + + /// Calculates the offset from a pointer using wrapping arithmetic. + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// The resulting pointer does not need to be in bounds, but it is + /// potentially hazardous to dereference (which requires `unsafe`). + /// + /// In particular, the resulting pointer remains attached to the same allocated + /// object that `self` points to. It may *not* be used to access a + /// different allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// In other words, `x.wrapping_offset(y.wrapping_offset_from(x))` is + /// *not* the same as `y`, and dereferencing it is undefined behavior + /// unless `x` and `y` point into the same allocated object. + /// + /// Compared to [`offset`], this method basically delays the requirement of staying + /// within the same allocated object: [`offset`] is immediate Undefined Behavior when + /// crossing object boundaries; `wrapping_offset` produces a pointer but still leads + /// to Undefined Behavior if that pointer is dereferenced. [`offset`] can be optimized + /// better and is thus preferrable in performance-sensitive code. + /// + /// If you need to cross object boundaries, cast the pointer to an integer and + /// do the arithmetic there. + /// + /// [`offset`]: #method.offset + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// // Iterate using a raw pointer in increments of two elements + /// let data = [1u8, 2, 3, 4, 5]; + /// let mut ptr: *const u8 = data.as_ptr(); + /// let step = 2; + /// let end_rounded_up = ptr.wrapping_offset(6); + /// + /// // This loop prints "1, 3, 5, " + /// while ptr != end_rounded_up { + /// unsafe { + /// print!("{}, ", *ptr); + /// } + /// ptr = ptr.wrapping_offset(step); + /// } + /// ``` + #[stable(feature = "ptr_wrapping_offset", since = "1.16.0")] + #[inline] + pub fn wrapping_offset(self, count: isize) -> *const T + where + T: Sized, + { + unsafe { intrinsics::arith_offset(self, count) } + } + + /// Calculates the distance between two pointers. The returned value is in + /// units of T: the distance in bytes is divided by `mem::size_of::()`. + /// + /// This function is the inverse of [`offset`]. + /// + /// [`offset`]: #method.offset + /// [`wrapping_offset_from`]: #method.wrapping_offset_from + /// + /// # Safety + /// + /// If any of the following conditions are violated, the result is Undefined + /// Behavior: + /// + /// * Both the starting and other pointer must be either in bounds or one + /// byte past the end of the same allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// * The distance between the pointers, **in bytes**, cannot overflow an `isize`. + /// + /// * The distance between the pointers, in bytes, must be an exact multiple + /// of the size of `T`. + /// + /// * The distance being in bounds cannot rely on "wrapping around" the address space. + /// + /// The compiler and standard library generally try to ensure allocations + /// never reach a size where an offset is a concern. For instance, `Vec` + /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so + /// `ptr_into_vec.offset_from(vec.as_ptr())` is always safe. + /// + /// Most platforms fundamentally can't even construct such an allocation. + /// For instance, no known 64-bit platform can ever serve a request + /// for 263 bytes due to page-table limitations or splitting the address space. + /// However, some 32-bit and 16-bit platforms may successfully serve a request for + /// more than `isize::MAX` bytes with things like Physical Address + /// Extension. As such, memory acquired directly from allocators or memory + /// mapped files *may* be too large to handle with this function. + /// + /// Consider using [`wrapping_offset_from`] instead if these constraints are + /// difficult to satisfy. The only advantage of this method is that it + /// enables more aggressive compiler optimizations. + /// + /// # Panics + /// + /// This function panics if `T` is a Zero-Sized Type ("ZST"). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// #![feature(ptr_offset_from)] + /// + /// let a = [0; 5]; + /// let ptr1: *const i32 = &a[1]; + /// let ptr2: *const i32 = &a[3]; + /// unsafe { + /// assert_eq!(ptr2.offset_from(ptr1), 2); + /// assert_eq!(ptr1.offset_from(ptr2), -2); + /// assert_eq!(ptr1.offset(2), ptr2); + /// assert_eq!(ptr2.offset(-2), ptr1); + /// } + /// ``` + #[unstable(feature = "ptr_offset_from", issue = "41079")] + #[rustc_const_unstable(feature = "const_ptr_offset_from", issue = "41079")] + #[inline] + pub const unsafe fn offset_from(self, origin: *const T) -> isize + where + T: Sized, + { + let pointee_size = mem::size_of::(); + assert!(0 < pointee_size && pointee_size <= isize::max_value() as usize); + intrinsics::ptr_offset_from(self, origin) + } + + /// Calculates the distance between two pointers. The returned value is in + /// units of T: the distance in bytes is divided by `mem::size_of::()`. + /// + /// If the address different between the two pointers is not a multiple of + /// `mem::size_of::()` then the result of the division is rounded towards + /// zero. + /// + /// Though this method is safe for any two pointers, note that its result + /// will be mostly useless if the two pointers aren't into the same allocated + /// object, for example if they point to two different local variables. + /// + /// # Panics + /// + /// This function panics if `T` is a zero-sized type. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// #![feature(ptr_wrapping_offset_from)] + /// + /// let a = [0; 5]; + /// let ptr1: *const i32 = &a[1]; + /// let ptr2: *const i32 = &a[3]; + /// assert_eq!(ptr2.wrapping_offset_from(ptr1), 2); + /// assert_eq!(ptr1.wrapping_offset_from(ptr2), -2); + /// assert_eq!(ptr1.wrapping_offset(2), ptr2); + /// assert_eq!(ptr2.wrapping_offset(-2), ptr1); + /// + /// let ptr1: *const i32 = 3 as _; + /// let ptr2: *const i32 = 13 as _; + /// assert_eq!(ptr2.wrapping_offset_from(ptr1), 2); + /// ``` + #[unstable(feature = "ptr_wrapping_offset_from", issue = "41079")] + #[inline] + pub fn wrapping_offset_from(self, origin: *const T) -> isize + where + T: Sized, + { + let pointee_size = mem::size_of::(); + assert!(0 < pointee_size && pointee_size <= isize::max_value() as usize); + + let d = isize::wrapping_sub(self as _, origin as _); + d.wrapping_div(pointee_size as _) + } + + /// Calculates the offset from a pointer (convenience for `.offset(count as isize)`). + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// If any of the following conditions are violated, the result is Undefined + /// Behavior: + /// + /// * Both the starting and resulting pointer must be either in bounds or one + /// byte past the end of the same allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// * The computed offset, **in bytes**, cannot overflow an `isize`. + /// + /// * The offset being in bounds cannot rely on "wrapping around" the address + /// space. That is, the infinite-precision sum must fit in a `usize`. + /// + /// The compiler and standard library generally tries to ensure allocations + /// never reach a size where an offset is a concern. For instance, `Vec` + /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so + /// `vec.as_ptr().add(vec.len())` is always safe. + /// + /// Most platforms fundamentally can't even construct such an allocation. + /// For instance, no known 64-bit platform can ever serve a request + /// for 263 bytes due to page-table limitations or splitting the address space. + /// However, some 32-bit and 16-bit platforms may successfully serve a request for + /// more than `isize::MAX` bytes with things like Physical Address + /// Extension. As such, memory acquired directly from allocators or memory + /// mapped files *may* be too large to handle with this function. + /// + /// Consider using [`wrapping_add`] instead if these constraints are + /// difficult to satisfy. The only advantage of this method is that it + /// enables more aggressive compiler optimizations. + /// + /// [`wrapping_add`]: #method.wrapping_add + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let s: &str = "123"; + /// let ptr: *const u8 = s.as_ptr(); + /// + /// unsafe { + /// println!("{}", *ptr.add(1) as char); + /// println!("{}", *ptr.add(2) as char); + /// } + /// ``` + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn add(self, count: usize) -> Self + where + T: Sized, + { + self.offset(count as isize) + } + + /// Calculates the offset from a pointer (convenience for + /// `.offset((count as isize).wrapping_neg())`). + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// If any of the following conditions are violated, the result is Undefined + /// Behavior: + /// + /// * Both the starting and resulting pointer must be either in bounds or one + /// byte past the end of the same allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// * The computed offset cannot exceed `isize::MAX` **bytes**. + /// + /// * The offset being in bounds cannot rely on "wrapping around" the address + /// space. That is, the infinite-precision sum must fit in a usize. + /// + /// The compiler and standard library generally tries to ensure allocations + /// never reach a size where an offset is a concern. For instance, `Vec` + /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so + /// `vec.as_ptr().add(vec.len()).sub(vec.len())` is always safe. + /// + /// Most platforms fundamentally can't even construct such an allocation. + /// For instance, no known 64-bit platform can ever serve a request + /// for 263 bytes due to page-table limitations or splitting the address space. + /// However, some 32-bit and 16-bit platforms may successfully serve a request for + /// more than `isize::MAX` bytes with things like Physical Address + /// Extension. As such, memory acquired directly from allocators or memory + /// mapped files *may* be too large to handle with this function. + /// + /// Consider using [`wrapping_sub`] instead if these constraints are + /// difficult to satisfy. The only advantage of this method is that it + /// enables more aggressive compiler optimizations. + /// + /// [`wrapping_sub`]: #method.wrapping_sub + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let s: &str = "123"; + /// + /// unsafe { + /// let end: *const u8 = s.as_ptr().add(3); + /// println!("{}", *end.sub(1) as char); + /// println!("{}", *end.sub(2) as char); + /// } + /// ``` + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn sub(self, count: usize) -> Self + where + T: Sized, + { + self.offset((count as isize).wrapping_neg()) + } + + /// Calculates the offset from a pointer using wrapping arithmetic. + /// (convenience for `.wrapping_offset(count as isize)`) + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// The resulting pointer does not need to be in bounds, but it is + /// potentially hazardous to dereference (which requires `unsafe`). + /// + /// In particular, the resulting pointer remains attached to the same allocated + /// object that `self` points to. It may *not* be used to access a + /// different allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// Compared to [`add`], this method basically delays the requirement of staying + /// within the same allocated object: [`add`] is immediate Undefined Behavior when + /// crossing object boundaries; `wrapping_add` produces a pointer but still leads + /// to Undefined Behavior if that pointer is dereferenced. [`add`] can be optimized + /// better and is thus preferrable in performance-sensitive code. + /// + /// If you need to cross object boundaries, cast the pointer to an integer and + /// do the arithmetic there. + /// + /// [`add`]: #method.add + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// // Iterate using a raw pointer in increments of two elements + /// let data = [1u8, 2, 3, 4, 5]; + /// let mut ptr: *const u8 = data.as_ptr(); + /// let step = 2; + /// let end_rounded_up = ptr.wrapping_add(6); + /// + /// // This loop prints "1, 3, 5, " + /// while ptr != end_rounded_up { + /// unsafe { + /// print!("{}, ", *ptr); + /// } + /// ptr = ptr.wrapping_add(step); + /// } + /// ``` + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub fn wrapping_add(self, count: usize) -> Self + where + T: Sized, + { + self.wrapping_offset(count as isize) + } + + /// Calculates the offset from a pointer using wrapping arithmetic. + /// (convenience for `.wrapping_offset((count as isize).wrapping_sub())`) + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// The resulting pointer does not need to be in bounds, but it is + /// potentially hazardous to dereference (which requires `unsafe`). + /// + /// In particular, the resulting pointer remains attached to the same allocated + /// object that `self` points to. It may *not* be used to access a + /// different allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// Compared to [`sub`], this method basically delays the requirement of staying + /// within the same allocated object: [`sub`] is immediate Undefined Behavior when + /// crossing object boundaries; `wrapping_sub` produces a pointer but still leads + /// to Undefined Behavior if that pointer is dereferenced. [`sub`] can be optimized + /// better and is thus preferrable in performance-sensitive code. + /// + /// If you need to cross object boundaries, cast the pointer to an integer and + /// do the arithmetic there. + /// + /// [`sub`]: #method.sub + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// // Iterate using a raw pointer in increments of two elements (backwards) + /// let data = [1u8, 2, 3, 4, 5]; + /// let mut ptr: *const u8 = data.as_ptr(); + /// let start_rounded_down = ptr.wrapping_sub(2); + /// ptr = ptr.wrapping_add(4); + /// let step = 2; + /// // This loop prints "5, 3, 1, " + /// while ptr != start_rounded_down { + /// unsafe { + /// print!("{}, ", *ptr); + /// } + /// ptr = ptr.wrapping_sub(step); + /// } + /// ``` + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub fn wrapping_sub(self, count: usize) -> Self + where + T: Sized, + { + self.wrapping_offset((count as isize).wrapping_neg()) + } + + /// Reads the value from `self` without moving it. This leaves the + /// memory in `self` unchanged. + /// + /// See [`ptr::read`] for safety concerns and examples. + /// + /// [`ptr::read`]: ./ptr/fn.read.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn read(self) -> T + where + T: Sized, + { + read(self) + } + + /// Performs a volatile read of the value from `self` without moving it. This + /// leaves the memory in `self` unchanged. + /// + /// Volatile operations are intended to act on I/O memory, and are guaranteed + /// to not be elided or reordered by the compiler across other volatile + /// operations. + /// + /// See [`ptr::read_volatile`] for safety concerns and examples. + /// + /// [`ptr::read_volatile`]: ./ptr/fn.read_volatile.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn read_volatile(self) -> T + where + T: Sized, + { + read_volatile(self) + } + + /// Reads the value from `self` without moving it. This leaves the + /// memory in `self` unchanged. + /// + /// Unlike `read`, the pointer may be unaligned. + /// + /// See [`ptr::read_unaligned`] for safety concerns and examples. + /// + /// [`ptr::read_unaligned`]: ./ptr/fn.read_unaligned.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn read_unaligned(self) -> T + where + T: Sized, + { + read_unaligned(self) + } + + /// Copies `count * size_of` bytes from `self` to `dest`. The source + /// and destination may overlap. + /// + /// NOTE: this has the *same* argument order as [`ptr::copy`]. + /// + /// See [`ptr::copy`] for safety concerns and examples. + /// + /// [`ptr::copy`]: ./ptr/fn.copy.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn copy_to(self, dest: *mut T, count: usize) + where + T: Sized, + { + copy(self, dest, count) + } + + /// Copies `count * size_of` bytes from `self` to `dest`. The source + /// and destination may *not* overlap. + /// + /// NOTE: this has the *same* argument order as [`ptr::copy_nonoverlapping`]. + /// + /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples. + /// + /// [`ptr::copy_nonoverlapping`]: ./ptr/fn.copy_nonoverlapping.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize) + where + T: Sized, + { + copy_nonoverlapping(self, dest, count) + } + + /// Computes the offset that needs to be applied to the pointer in order to make it aligned to + /// `align`. + /// + /// If it is not possible to align the pointer, the implementation returns + /// `usize::max_value()`. It is permissible for the implementation to *always* + /// return `usize::max_value()`. Only your algorithm's performance can depend + /// on getting a usable offset here, not its correctness. + /// + /// The offset is expressed in number of `T` elements, and not bytes. The value returned can be + /// used with the `wrapping_add` method. + /// + /// There are no guarantees whatsoever that offsetting the pointer will not overflow or go + /// beyond the allocation that the pointer points into. It is up to the caller to ensure that + /// the returned offset is correct in all terms other than alignment. + /// + /// # Panics + /// + /// The function panics if `align` is not a power-of-two. + /// + /// # Examples + /// + /// Accessing adjacent `u8` as `u16` + /// + /// ``` + /// # fn foo(n: usize) { + /// # use std::mem::align_of; + /// # unsafe { + /// let x = [5u8, 6u8, 7u8, 8u8, 9u8]; + /// let ptr = &x[n] as *const u8; + /// let offset = ptr.align_offset(align_of::()); + /// if offset < x.len() - n - 1 { + /// let u16_ptr = ptr.add(offset) as *const u16; + /// assert_ne!(*u16_ptr, 500); + /// } else { + /// // while the pointer can be aligned via `offset`, it would point + /// // outside the allocation + /// } + /// # } } + /// ``` + #[stable(feature = "align_offset", since = "1.36.0")] + pub fn align_offset(self, align: usize) -> usize + where + T: Sized, + { + if !align.is_power_of_two() { + panic!("align_offset: align is not a power-of-two"); + } + unsafe { align_offset(self, align) } + } +} + +// Equality for pointers +#[stable(feature = "rust1", since = "1.0.0")] +impl PartialEq for *const T { + #[inline] + fn eq(&self, other: &*const T) -> bool { + *self == *other + } +} + +#[stable(feature = "rust1", since = "1.0.0")] +impl Eq for *const T {} + +// Comparison for pointers +#[stable(feature = "rust1", since = "1.0.0")] +impl Ord for *const T { + #[inline] + fn cmp(&self, other: &*const T) -> Ordering { + if self < other { + Less + } else if self == other { + Equal + } else { + Greater + } + } +} + +#[stable(feature = "rust1", since = "1.0.0")] +impl PartialOrd for *const T { + #[inline] + fn partial_cmp(&self, other: &*const T) -> Option { + Some(self.cmp(other)) + } + + #[inline] + fn lt(&self, other: &*const T) -> bool { + *self < *other + } + + #[inline] + fn le(&self, other: &*const T) -> bool { + *self <= *other + } + + #[inline] + fn gt(&self, other: &*const T) -> bool { + *self > *other + } + + #[inline] + fn ge(&self, other: &*const T) -> bool { + *self >= *other + } +} diff --git a/src/libcore/ptr/mod.rs b/src/libcore/ptr/mod.rs index 33c23233fd..9727e4face 100644 --- a/src/libcore/ptr/mod.rs +++ b/src/libcore/ptr/mod.rs @@ -65,12 +65,11 @@ //! [`write_volatile`]: ./fn.write_volatile.html //! [`NonNull::dangling`]: ./struct.NonNull.html#method.dangling -// ignore-tidy-filelength // ignore-tidy-undocumented-unsafe #![stable(feature = "rust1", since = "1.0.0")] -use crate::cmp::Ordering::{self, Equal, Greater, Less}; +use crate::cmp::Ordering; use crate::fmt; use crate::hash; use crate::intrinsics; @@ -90,9 +89,12 @@ mod non_null; pub use non_null::NonNull; mod unique; -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] pub use unique::Unique; +mod const_ptr; +mod mut_ptr; + /// Executes the destructor (if any) of the pointed-to value. /// /// This is semantically equivalent to calling [`ptr::read`] and discarding @@ -167,22 +169,12 @@ pub use unique::Unique; /// i.e., you do not usually have to worry about such issues unless you call `drop_in_place` /// manually. #[stable(feature = "drop_in_place", since = "1.8.0")] -#[inline(always)] -pub unsafe fn drop_in_place(to_drop: *mut T) { - real_drop_in_place(&mut *to_drop) -} - -// The real `drop_in_place` -- the one that gets called implicitly when variables go -// out of scope -- should have a safe reference and not a raw pointer as argument -// type. When we drop a local variable, we access it with a pointer that behaves -// like a safe reference; transmuting that to a raw pointer does not mean we can -// actually access it with raw pointers. #[lang = "drop_in_place"] #[allow(unconditional_recursion)] -unsafe fn real_drop_in_place(to_drop: &mut T) { +pub unsafe fn drop_in_place(to_drop: *mut T) { // Code here does not matter - this is replaced by the // real drop glue by the compiler. - real_drop_in_place(to_drop) + drop_in_place(to_drop) } /// Creates a null raw pointer. @@ -198,7 +190,7 @@ unsafe fn real_drop_in_place(to_drop: &mut T) { #[inline(always)] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_promotable] -#[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_ptr_null", since = "1.32.0"))] +#[rustc_const_stable(feature = "const_ptr_null", since = "1.32.0")] pub const fn null() -> *const T { 0 as *const T } @@ -216,7 +208,7 @@ pub const fn null() -> *const T { #[inline(always)] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_promotable] -#[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_ptr_null", since = "1.32.0"))] +#[rustc_const_stable(feature = "const_ptr_null", since = "1.32.0")] pub const fn null_mut() -> *mut T { 0 as *mut T } @@ -246,18 +238,18 @@ pub(crate) struct FatPtr { /// # Examples /// /// ```rust -/// #![feature(slice_from_raw_parts)] /// use std::ptr; /// /// // create a slice pointer when starting out with a pointer to the first element -/// let mut x = [5, 6, 7]; -/// let ptr = &mut x[0] as *mut _; -/// let slice = ptr::slice_from_raw_parts_mut(ptr, 3); +/// let x = [5, 6, 7]; +/// let ptr = x.as_ptr(); +/// let slice = ptr::slice_from_raw_parts(ptr, 3); /// assert_eq!(unsafe { &*slice }[2], 7); /// ``` #[inline] -#[unstable(feature = "slice_from_raw_parts", reason = "recently added", issue = "36925")] -pub fn slice_from_raw_parts(data: *const T, len: usize) -> *const [T] { +#[stable(feature = "slice_from_raw_parts", since = "1.42.0")] +#[rustc_const_unstable(feature = "const_slice_from_raw_parts", issue = "67456")] +pub const fn slice_from_raw_parts(data: *const T, len: usize) -> *const [T] { unsafe { Repr { raw: FatPtr { data, len } }.rust } } @@ -272,8 +264,9 @@ pub fn slice_from_raw_parts(data: *const T, len: usize) -> *const [T] { /// [`slice_from_raw_parts`]: fn.slice_from_raw_parts.html /// [`from_raw_parts_mut`]: ../../std/slice/fn.from_raw_parts_mut.html #[inline] -#[unstable(feature = "slice_from_raw_parts", reason = "recently added", issue = "36925")] -pub fn slice_from_raw_parts_mut(data: *mut T, len: usize) -> *mut [T] { +#[stable(feature = "slice_from_raw_parts", since = "1.42.0")] +#[rustc_const_unstable(feature = "const_slice_from_raw_parts", issue = "67456")] +pub const fn slice_from_raw_parts_mut(data: *mut T, len: usize) -> *mut [T] { unsafe { Repr { raw: FatPtr { data, len } }.rust_mut } } @@ -1034,1730 +1027,119 @@ pub unsafe fn write_volatile(dst: *mut T, src: T) { intrinsics::volatile_store(dst, src); } -#[lang = "const_ptr"] -impl *const T { - /// Returns `true` if the pointer is null. - /// - /// Note that unsized types have many possible null pointers, as only the - /// raw data pointer is considered, not their length, vtable, etc. - /// Therefore, two pointers that are null may still not compare equal to - /// each other. - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let s: &str = "Follow the rabbit"; - /// let ptr: *const u8 = s.as_ptr(); - /// assert!(!ptr.is_null()); - /// ``` - #[stable(feature = "rust1", since = "1.0.0")] - #[inline] - pub fn is_null(self) -> bool { - // Compare via a cast to a thin pointer, so fat pointers are only - // considering their "data" part for null-ness. - (self as *const u8) == null() - } - - /// Casts to a pointer of another type. - #[stable(feature = "ptr_cast", since = "1.38.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_ptr_cast", since = "1.38.0"))] - #[inline] - pub const fn cast(self) -> *const U { - self as _ - } - - /// Returns `None` if the pointer is null, or else returns a reference to - /// the value wrapped in `Some`. - /// - /// # Safety - /// - /// While this method and its mutable counterpart are useful for - /// null-safety, it is important to note that this is still an unsafe - /// operation because the returned value could be pointing to invalid - /// memory. - /// - /// When calling this method, you have to ensure that *either* the pointer is NULL *or* - /// all of the following is true: - /// - it is properly aligned - /// - it must point to an initialized instance of T; in particular, the pointer must be - /// "dereferencable" in the sense defined [here]. - /// - /// This applies even if the result of this method is unused! - /// (The part about being initialized is not yet fully decided, but until - /// it is, the only safe approach is to ensure that they are indeed initialized.) - /// - /// Additionally, the lifetime `'a` returned is arbitrarily chosen and does - /// not necessarily reflect the actual lifetime of the data. *You* must enforce - /// Rust's aliasing rules. In particular, for the duration of this lifetime, - /// the memory the pointer points to must not get mutated (except inside `UnsafeCell`). - /// - /// [here]: crate::ptr#safety - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let ptr: *const u8 = &10u8 as *const u8; - /// - /// unsafe { - /// if let Some(val_back) = ptr.as_ref() { - /// println!("We got back the value: {}!", val_back); - /// } - /// } - /// ``` - /// - /// # Null-unchecked version - /// - /// If you are sure the pointer can never be null and are looking for some kind of - /// `as_ref_unchecked` that returns the `&T` instead of `Option<&T>`, know that you can - /// dereference the pointer directly. - /// - /// ``` - /// let ptr: *const u8 = &10u8 as *const u8; - /// - /// unsafe { - /// let val_back = &*ptr; - /// println!("We got back the value: {}!", val_back); - /// } - /// ``` - #[stable(feature = "ptr_as_ref", since = "1.9.0")] - #[inline] - pub unsafe fn as_ref<'a>(self) -> Option<&'a T> { - if self.is_null() { None } else { Some(&*self) } - } - - /// Calculates the offset from a pointer. - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is Undefined - /// Behavior: - /// - /// * Both the starting and resulting pointer must be either in bounds or one - /// byte past the end of the same allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// * The computed offset, **in bytes**, cannot overflow an `isize`. - /// - /// * The offset being in bounds cannot rely on "wrapping around" the address - /// space. That is, the infinite-precision sum, **in bytes** must fit in a usize. - /// - /// The compiler and standard library generally tries to ensure allocations - /// never reach a size where an offset is a concern. For instance, `Vec` - /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so - /// `vec.as_ptr().add(vec.len())` is always safe. - /// - /// Most platforms fundamentally can't even construct such an allocation. - /// For instance, no known 64-bit platform can ever serve a request - /// for 263 bytes due to page-table limitations or splitting the address space. - /// However, some 32-bit and 16-bit platforms may successfully serve a request for - /// more than `isize::MAX` bytes with things like Physical Address - /// Extension. As such, memory acquired directly from allocators or memory - /// mapped files *may* be too large to handle with this function. - /// - /// Consider using [`wrapping_offset`] instead if these constraints are - /// difficult to satisfy. The only advantage of this method is that it - /// enables more aggressive compiler optimizations. - /// - /// [`wrapping_offset`]: #method.wrapping_offset - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let s: &str = "123"; - /// let ptr: *const u8 = s.as_ptr(); - /// - /// unsafe { - /// println!("{}", *ptr.offset(1) as char); - /// println!("{}", *ptr.offset(2) as char); - /// } - /// ``` - #[stable(feature = "rust1", since = "1.0.0")] - #[inline] - pub unsafe fn offset(self, count: isize) -> *const T - where - T: Sized, - { - intrinsics::offset(self, count) - } - - /// Calculates the offset from a pointer using wrapping arithmetic. - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// The resulting pointer does not need to be in bounds, but it is - /// potentially hazardous to dereference (which requires `unsafe`). - /// - /// In particular, the resulting pointer remains attached to the same allocated - /// object that `self` points to. It may *not* be used to access a - /// different allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// In other words, `x.wrapping_offset(y.wrapping_offset_from(x))` is - /// *not* the same as `y`, and dereferencing it is undefined behavior - /// unless `x` and `y` point into the same allocated object. - /// - /// Compared to [`offset`], this method basically delays the requirement of staying - /// within the same allocated object: [`offset`] is immediate Undefined Behavior when - /// crossing object boundaries; `wrapping_offset` produces a pointer but still leads - /// to Undefined Behavior if that pointer is dereferenced. [`offset`] can be optimized - /// better and is thus preferrable in performance-sensitive code. - /// - /// If you need to cross object boundaries, cast the pointer to an integer and - /// do the arithmetic there. - /// - /// [`offset`]: #method.offset - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// // Iterate using a raw pointer in increments of two elements - /// let data = [1u8, 2, 3, 4, 5]; - /// let mut ptr: *const u8 = data.as_ptr(); - /// let step = 2; - /// let end_rounded_up = ptr.wrapping_offset(6); - /// - /// // This loop prints "1, 3, 5, " - /// while ptr != end_rounded_up { - /// unsafe { - /// print!("{}, ", *ptr); - /// } - /// ptr = ptr.wrapping_offset(step); - /// } - /// ``` - #[stable(feature = "ptr_wrapping_offset", since = "1.16.0")] - #[inline] - pub fn wrapping_offset(self, count: isize) -> *const T - where - T: Sized, - { - unsafe { intrinsics::arith_offset(self, count) } - } - - /// Calculates the distance between two pointers. The returned value is in - /// units of T: the distance in bytes is divided by `mem::size_of::()`. - /// - /// This function is the inverse of [`offset`]. - /// - /// [`offset`]: #method.offset - /// [`wrapping_offset_from`]: #method.wrapping_offset_from - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is Undefined - /// Behavior: - /// - /// * Both the starting and other pointer must be either in bounds or one - /// byte past the end of the same allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// * The distance between the pointers, **in bytes**, cannot overflow an `isize`. - /// - /// * The distance between the pointers, in bytes, must be an exact multiple - /// of the size of `T`. - /// - /// * The distance being in bounds cannot rely on "wrapping around" the address space. - /// - /// The compiler and standard library generally try to ensure allocations - /// never reach a size where an offset is a concern. For instance, `Vec` - /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so - /// `ptr_into_vec.offset_from(vec.as_ptr())` is always safe. - /// - /// Most platforms fundamentally can't even construct such an allocation. - /// For instance, no known 64-bit platform can ever serve a request - /// for 263 bytes due to page-table limitations or splitting the address space. - /// However, some 32-bit and 16-bit platforms may successfully serve a request for - /// more than `isize::MAX` bytes with things like Physical Address - /// Extension. As such, memory acquired directly from allocators or memory - /// mapped files *may* be too large to handle with this function. - /// - /// Consider using [`wrapping_offset_from`] instead if these constraints are - /// difficult to satisfy. The only advantage of this method is that it - /// enables more aggressive compiler optimizations. - /// - /// # Panics - /// - /// This function panics if `T` is a Zero-Sized Type ("ZST"). - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// #![feature(ptr_offset_from)] - /// - /// let a = [0; 5]; - /// let ptr1: *const i32 = &a[1]; - /// let ptr2: *const i32 = &a[3]; - /// unsafe { - /// assert_eq!(ptr2.offset_from(ptr1), 2); - /// assert_eq!(ptr1.offset_from(ptr2), -2); - /// assert_eq!(ptr1.offset(2), ptr2); - /// assert_eq!(ptr2.offset(-2), ptr1); - /// } - /// ``` - #[unstable(feature = "ptr_offset_from", issue = "41079")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_ptr_offset_from"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_ptr_offset_from", issue = "41079"), - )] - #[inline] - pub const unsafe fn offset_from(self, origin: *const T) -> isize - where - T: Sized, - { - let pointee_size = mem::size_of::(); - let ok = 0 < pointee_size && pointee_size <= isize::max_value() as usize; - // assert that the pointee size is valid in a const eval compatible way - // FIXME: do this with a real assert at some point - [()][(!ok) as usize]; - intrinsics::ptr_offset_from(self, origin) - } - - /// Calculates the distance between two pointers. The returned value is in - /// units of T: the distance in bytes is divided by `mem::size_of::()`. - /// - /// If the address different between the two pointers is not a multiple of - /// `mem::size_of::()` then the result of the division is rounded towards - /// zero. - /// - /// Though this method is safe for any two pointers, note that its result - /// will be mostly useless if the two pointers aren't into the same allocated - /// object, for example if they point to two different local variables. - /// - /// # Panics - /// - /// This function panics if `T` is a zero-sized type. - /// - /// # Examples - /// - /// Basic usage: +/// Align pointer `p`. +/// +/// Calculate offset (in terms of elements of `stride` stride) that has to be applied +/// to pointer `p` so that pointer `p` would get aligned to `a`. +/// +/// Note: This implementation has been carefully tailored to not panic. It is UB for this to panic. +/// The only real change that can be made here is change of `INV_TABLE_MOD_16` and associated +/// constants. +/// +/// If we ever decide to make it possible to call the intrinsic with `a` that is not a +/// power-of-two, it will probably be more prudent to just change to a naive implementation rather +/// than trying to adapt this to accommodate that change. +/// +/// Any questions go to @nagisa. +#[lang = "align_offset"] +pub(crate) unsafe fn align_offset(p: *const T, a: usize) -> usize { + /// Calculate multiplicative modular inverse of `x` modulo `m`. /// - /// ``` - /// #![feature(ptr_wrapping_offset_from)] + /// This implementation is tailored for align_offset and has following preconditions: /// - /// let a = [0; 5]; - /// let ptr1: *const i32 = &a[1]; - /// let ptr2: *const i32 = &a[3]; - /// assert_eq!(ptr2.wrapping_offset_from(ptr1), 2); - /// assert_eq!(ptr1.wrapping_offset_from(ptr2), -2); - /// assert_eq!(ptr1.wrapping_offset(2), ptr2); - /// assert_eq!(ptr2.wrapping_offset(-2), ptr1); + /// * `m` is a power-of-two; + /// * `x < m`; (if `x ≥ m`, pass in `x % m` instead) /// - /// let ptr1: *const i32 = 3 as _; - /// let ptr2: *const i32 = 13 as _; - /// assert_eq!(ptr2.wrapping_offset_from(ptr1), 2); - /// ``` - #[unstable(feature = "ptr_wrapping_offset_from", issue = "41079")] + /// Implementation of this function shall not panic. Ever. #[inline] - pub fn wrapping_offset_from(self, origin: *const T) -> isize - where - T: Sized, - { - let pointee_size = mem::size_of::(); - assert!(0 < pointee_size && pointee_size <= isize::max_value() as usize); + fn mod_inv(x: usize, m: usize) -> usize { + /// Multiplicative modular inverse table modulo 2⁴ = 16. + /// + /// Note, that this table does not contain values where inverse does not exist (i.e., for + /// `0⁻¹ mod 16`, `2⁻¹ mod 16`, etc.) + const INV_TABLE_MOD_16: [u8; 8] = [1, 11, 13, 7, 9, 3, 5, 15]; + /// Modulo for which the `INV_TABLE_MOD_16` is intended. + const INV_TABLE_MOD: usize = 16; + /// INV_TABLE_MOD² + const INV_TABLE_MOD_SQUARED: usize = INV_TABLE_MOD * INV_TABLE_MOD; - let d = isize::wrapping_sub(self as _, origin as _); - d.wrapping_div(pointee_size as _) + let table_inverse = INV_TABLE_MOD_16[(x & (INV_TABLE_MOD - 1)) >> 1] as usize; + if m <= INV_TABLE_MOD { + table_inverse & (m - 1) + } else { + // We iterate "up" using the following formula: + // + // $$ xy ≡ 1 (mod 2ⁿ) → xy (2 - xy) ≡ 1 (mod 2²ⁿ) $$ + // + // until 2²ⁿ ≥ m. Then we can reduce to our desired `m` by taking the result `mod m`. + let mut inverse = table_inverse; + let mut going_mod = INV_TABLE_MOD_SQUARED; + loop { + // y = y * (2 - xy) mod n + // + // Note, that we use wrapping operations here intentionally – the original formula + // uses e.g., subtraction `mod n`. It is entirely fine to do them `mod + // usize::max_value()` instead, because we take the result `mod n` at the end + // anyway. + inverse = inverse.wrapping_mul(2usize.wrapping_sub(x.wrapping_mul(inverse))) + & (going_mod - 1); + if going_mod > m { + return inverse & (m - 1); + } + going_mod = going_mod.wrapping_mul(going_mod); + } + } } - /// Calculates the offset from a pointer (convenience for `.offset(count as isize)`). - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is Undefined - /// Behavior: - /// - /// * Both the starting and resulting pointer must be either in bounds or one - /// byte past the end of the same allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// * The computed offset, **in bytes**, cannot overflow an `isize`. - /// - /// * The offset being in bounds cannot rely on "wrapping around" the address - /// space. That is, the infinite-precision sum must fit in a `usize`. - /// - /// The compiler and standard library generally tries to ensure allocations - /// never reach a size where an offset is a concern. For instance, `Vec` - /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so - /// `vec.as_ptr().add(vec.len())` is always safe. - /// - /// Most platforms fundamentally can't even construct such an allocation. - /// For instance, no known 64-bit platform can ever serve a request - /// for 263 bytes due to page-table limitations or splitting the address space. - /// However, some 32-bit and 16-bit platforms may successfully serve a request for - /// more than `isize::MAX` bytes with things like Physical Address - /// Extension. As such, memory acquired directly from allocators or memory - /// mapped files *may* be too large to handle with this function. - /// - /// Consider using [`wrapping_add`] instead if these constraints are - /// difficult to satisfy. The only advantage of this method is that it - /// enables more aggressive compiler optimizations. - /// - /// [`wrapping_add`]: #method.wrapping_add - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let s: &str = "123"; - /// let ptr: *const u8 = s.as_ptr(); - /// - /// unsafe { - /// println!("{}", *ptr.add(1) as char); - /// println!("{}", *ptr.add(2) as char); - /// } - /// ``` - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn add(self, count: usize) -> Self - where - T: Sized, - { - self.offset(count as isize) - } + let stride = mem::size_of::(); + let a_minus_one = a.wrapping_sub(1); + let pmoda = p as usize & a_minus_one; - /// Calculates the offset from a pointer (convenience for - /// `.offset((count as isize).wrapping_neg())`). - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is Undefined - /// Behavior: - /// - /// * Both the starting and resulting pointer must be either in bounds or one - /// byte past the end of the same allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// * The computed offset cannot exceed `isize::MAX` **bytes**. - /// - /// * The offset being in bounds cannot rely on "wrapping around" the address - /// space. That is, the infinite-precision sum must fit in a usize. - /// - /// The compiler and standard library generally tries to ensure allocations - /// never reach a size where an offset is a concern. For instance, `Vec` - /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so - /// `vec.as_ptr().add(vec.len()).sub(vec.len())` is always safe. - /// - /// Most platforms fundamentally can't even construct such an allocation. - /// For instance, no known 64-bit platform can ever serve a request - /// for 263 bytes due to page-table limitations or splitting the address space. - /// However, some 32-bit and 16-bit platforms may successfully serve a request for - /// more than `isize::MAX` bytes with things like Physical Address - /// Extension. As such, memory acquired directly from allocators or memory - /// mapped files *may* be too large to handle with this function. - /// - /// Consider using [`wrapping_sub`] instead if these constraints are - /// difficult to satisfy. The only advantage of this method is that it - /// enables more aggressive compiler optimizations. - /// - /// [`wrapping_sub`]: #method.wrapping_sub - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let s: &str = "123"; - /// - /// unsafe { - /// let end: *const u8 = s.as_ptr().add(3); - /// println!("{}", *end.sub(1) as char); - /// println!("{}", *end.sub(2) as char); - /// } - /// ``` - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn sub(self, count: usize) -> Self - where - T: Sized, - { - self.offset((count as isize).wrapping_neg()) + if pmoda == 0 { + // Already aligned. Yay! + return 0; } - /// Calculates the offset from a pointer using wrapping arithmetic. - /// (convenience for `.wrapping_offset(count as isize)`) - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// The resulting pointer does not need to be in bounds, but it is - /// potentially hazardous to dereference (which requires `unsafe`). - /// - /// In particular, the resulting pointer remains attached to the same allocated - /// object that `self` points to. It may *not* be used to access a - /// different allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// Compared to [`add`], this method basically delays the requirement of staying - /// within the same allocated object: [`add`] is immediate Undefined Behavior when - /// crossing object boundaries; `wrapping_add` produces a pointer but still leads - /// to Undefined Behavior if that pointer is dereferenced. [`add`] can be optimized - /// better and is thus preferrable in performance-sensitive code. - /// - /// If you need to cross object boundaries, cast the pointer to an integer and - /// do the arithmetic there. - /// - /// [`add`]: #method.add - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// // Iterate using a raw pointer in increments of two elements - /// let data = [1u8, 2, 3, 4, 5]; - /// let mut ptr: *const u8 = data.as_ptr(); - /// let step = 2; - /// let end_rounded_up = ptr.wrapping_add(6); - /// - /// // This loop prints "1, 3, 5, " - /// while ptr != end_rounded_up { - /// unsafe { - /// print!("{}, ", *ptr); - /// } - /// ptr = ptr.wrapping_add(step); - /// } - /// ``` - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub fn wrapping_add(self, count: usize) -> Self - where - T: Sized, - { - self.wrapping_offset(count as isize) + if stride <= 1 { + return if stride == 0 { + // If the pointer is not aligned, and the element is zero-sized, then no amount of + // elements will ever align the pointer. + !0 + } else { + a.wrapping_sub(pmoda) + }; } - /// Calculates the offset from a pointer using wrapping arithmetic. - /// (convenience for `.wrapping_offset((count as isize).wrapping_sub())`) - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// The resulting pointer does not need to be in bounds, but it is - /// potentially hazardous to dereference (which requires `unsafe`). - /// - /// In particular, the resulting pointer remains attached to the same allocated - /// object that `self` points to. It may *not* be used to access a - /// different allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// Compared to [`sub`], this method basically delays the requirement of staying - /// within the same allocated object: [`sub`] is immediate Undefined Behavior when - /// crossing object boundaries; `wrapping_sub` produces a pointer but still leads - /// to Undefined Behavior if that pointer is dereferenced. [`sub`] can be optimized - /// better and is thus preferrable in performance-sensitive code. - /// - /// If you need to cross object boundaries, cast the pointer to an integer and - /// do the arithmetic there. - /// - /// [`sub`]: #method.sub - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// // Iterate using a raw pointer in increments of two elements (backwards) - /// let data = [1u8, 2, 3, 4, 5]; - /// let mut ptr: *const u8 = data.as_ptr(); - /// let start_rounded_down = ptr.wrapping_sub(2); - /// ptr = ptr.wrapping_add(4); - /// let step = 2; - /// // This loop prints "5, 3, 1, " - /// while ptr != start_rounded_down { - /// unsafe { - /// print!("{}, ", *ptr); - /// } - /// ptr = ptr.wrapping_sub(step); - /// } - /// ``` - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub fn wrapping_sub(self, count: usize) -> Self - where - T: Sized, - { - self.wrapping_offset((count as isize).wrapping_neg()) - } + let smoda = stride & a_minus_one; + // a is power-of-two so cannot be 0. stride = 0 is handled above. + let gcdpow = intrinsics::cttz_nonzero(stride).min(intrinsics::cttz_nonzero(a)); + let gcd = 1usize << gcdpow; - /// Reads the value from `self` without moving it. This leaves the - /// memory in `self` unchanged. - /// - /// See [`ptr::read`] for safety concerns and examples. - /// - /// [`ptr::read`]: ./ptr/fn.read.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn read(self) -> T - where - T: Sized, - { - read(self) + if p as usize & (gcd - 1) == 0 { + // This branch solves for the following linear congruence equation: + // + // $$ p + so ≡ 0 mod a $$ + // + // $p$ here is the pointer value, $s$ – stride of `T`, $o$ offset in `T`s, and $a$ – the + // requested alignment. + // + // g = gcd(a, s) + // o = (a - (p mod a))/g * ((s/g)⁻¹ mod a) + // + // The first term is “the relative alignment of p to a”, the second term is “how does + // incrementing p by s bytes change the relative alignment of p”. Division by `g` is + // necessary to make this equation well formed if $a$ and $s$ are not co-prime. + // + // Furthermore, the result produced by this solution is not “minimal”, so it is necessary + // to take the result $o mod lcm(s, a)$. We can replace $lcm(s, a)$ with just a $a / g$. + let j = a.wrapping_sub(pmoda) >> gcdpow; + let k = smoda >> gcdpow; + return intrinsics::unchecked_rem(j.wrapping_mul(mod_inv(k, a)), a >> gcdpow); } - /// Performs a volatile read of the value from `self` without moving it. This - /// leaves the memory in `self` unchanged. - /// - /// Volatile operations are intended to act on I/O memory, and are guaranteed - /// to not be elided or reordered by the compiler across other volatile - /// operations. - /// - /// See [`ptr::read_volatile`] for safety concerns and examples. - /// - /// [`ptr::read_volatile`]: ./ptr/fn.read_volatile.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn read_volatile(self) -> T - where - T: Sized, - { - read_volatile(self) - } - - /// Reads the value from `self` without moving it. This leaves the - /// memory in `self` unchanged. - /// - /// Unlike `read`, the pointer may be unaligned. - /// - /// See [`ptr::read_unaligned`] for safety concerns and examples. - /// - /// [`ptr::read_unaligned`]: ./ptr/fn.read_unaligned.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn read_unaligned(self) -> T - where - T: Sized, - { - read_unaligned(self) - } - - /// Copies `count * size_of` bytes from `self` to `dest`. The source - /// and destination may overlap. - /// - /// NOTE: this has the *same* argument order as [`ptr::copy`]. - /// - /// See [`ptr::copy`] for safety concerns and examples. - /// - /// [`ptr::copy`]: ./ptr/fn.copy.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn copy_to(self, dest: *mut T, count: usize) - where - T: Sized, - { - copy(self, dest, count) - } - - /// Copies `count * size_of` bytes from `self` to `dest`. The source - /// and destination may *not* overlap. - /// - /// NOTE: this has the *same* argument order as [`ptr::copy_nonoverlapping`]. - /// - /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples. - /// - /// [`ptr::copy_nonoverlapping`]: ./ptr/fn.copy_nonoverlapping.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize) - where - T: Sized, - { - copy_nonoverlapping(self, dest, count) - } - - /// Computes the offset that needs to be applied to the pointer in order to make it aligned to - /// `align`. - /// - /// If it is not possible to align the pointer, the implementation returns - /// `usize::max_value()`. It is permissible for the implementation to *always* - /// return `usize::max_value()`. Only your algorithm's performance can depend - /// on getting a usable offset here, not its correctness. - /// - /// The offset is expressed in number of `T` elements, and not bytes. The value returned can be - /// used with the `wrapping_add` method. - /// - /// There are no guarantees whatsoever that offsetting the pointer will not overflow or go - /// beyond the allocation that the pointer points into. It is up to the caller to ensure that - /// the returned offset is correct in all terms other than alignment. - /// - /// # Panics - /// - /// The function panics if `align` is not a power-of-two. - /// - /// # Examples - /// - /// Accessing adjacent `u8` as `u16` - /// - /// ``` - /// # fn foo(n: usize) { - /// # use std::mem::align_of; - /// # unsafe { - /// let x = [5u8, 6u8, 7u8, 8u8, 9u8]; - /// let ptr = &x[n] as *const u8; - /// let offset = ptr.align_offset(align_of::()); - /// if offset < x.len() - n - 1 { - /// let u16_ptr = ptr.add(offset) as *const u16; - /// assert_ne!(*u16_ptr, 500); - /// } else { - /// // while the pointer can be aligned via `offset`, it would point - /// // outside the allocation - /// } - /// # } } - /// ``` - #[stable(feature = "align_offset", since = "1.36.0")] - pub fn align_offset(self, align: usize) -> usize - where - T: Sized, - { - if !align.is_power_of_two() { - panic!("align_offset: align is not a power-of-two"); - } - unsafe { align_offset(self, align) } - } -} - -#[lang = "mut_ptr"] -impl *mut T { - /// Returns `true` if the pointer is null. - /// - /// Note that unsized types have many possible null pointers, as only the - /// raw data pointer is considered, not their length, vtable, etc. - /// Therefore, two pointers that are null may still not compare equal to - /// each other. - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let mut s = [1, 2, 3]; - /// let ptr: *mut u32 = s.as_mut_ptr(); - /// assert!(!ptr.is_null()); - /// ``` - #[stable(feature = "rust1", since = "1.0.0")] - #[inline] - pub fn is_null(self) -> bool { - // Compare via a cast to a thin pointer, so fat pointers are only - // considering their "data" part for null-ness. - (self as *mut u8) == null_mut() - } - - /// Casts to a pointer of another type. - #[stable(feature = "ptr_cast", since = "1.38.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_ptr_cast", since = "1.38.0"))] - #[inline] - pub const fn cast(self) -> *mut U { - self as _ - } - - /// Returns `None` if the pointer is null, or else returns a reference to - /// the value wrapped in `Some`. - /// - /// # Safety - /// - /// While this method and its mutable counterpart are useful for - /// null-safety, it is important to note that this is still an unsafe - /// operation because the returned value could be pointing to invalid - /// memory. - /// - /// When calling this method, you have to ensure that if the pointer is - /// non-NULL, then it is properly aligned, dereferencable (for the whole - /// size of `T`) and points to an initialized instance of `T`. This applies - /// even if the result of this method is unused! - /// (The part about being initialized is not yet fully decided, but until - /// it is, the only safe approach is to ensure that they are indeed initialized.) - /// - /// Additionally, the lifetime `'a` returned is arbitrarily chosen and does - /// not necessarily reflect the actual lifetime of the data. It is up to the - /// caller to ensure that for the duration of this lifetime, the memory this - /// pointer points to does not get written to outside of `UnsafeCell`. - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let ptr: *mut u8 = &mut 10u8 as *mut u8; - /// - /// unsafe { - /// if let Some(val_back) = ptr.as_ref() { - /// println!("We got back the value: {}!", val_back); - /// } - /// } - /// ``` - /// - /// # Null-unchecked version - /// - /// If you are sure the pointer can never be null and are looking for some kind of - /// `as_ref_unchecked` that returns the `&T` instead of `Option<&T>`, know that you can - /// dereference the pointer directly. - /// - /// ``` - /// let ptr: *mut u8 = &mut 10u8 as *mut u8; - /// - /// unsafe { - /// let val_back = &*ptr; - /// println!("We got back the value: {}!", val_back); - /// } - /// ``` - #[stable(feature = "ptr_as_ref", since = "1.9.0")] - #[inline] - pub unsafe fn as_ref<'a>(self) -> Option<&'a T> { - if self.is_null() { None } else { Some(&*self) } - } - - /// Calculates the offset from a pointer. - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is Undefined - /// Behavior: - /// - /// * Both the starting and resulting pointer must be either in bounds or one - /// byte past the end of the same allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// * The computed offset, **in bytes**, cannot overflow an `isize`. - /// - /// * The offset being in bounds cannot rely on "wrapping around" the address - /// space. That is, the infinite-precision sum, **in bytes** must fit in a usize. - /// - /// The compiler and standard library generally tries to ensure allocations - /// never reach a size where an offset is a concern. For instance, `Vec` - /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so - /// `vec.as_ptr().add(vec.len())` is always safe. - /// - /// Most platforms fundamentally can't even construct such an allocation. - /// For instance, no known 64-bit platform can ever serve a request - /// for 263 bytes due to page-table limitations or splitting the address space. - /// However, some 32-bit and 16-bit platforms may successfully serve a request for - /// more than `isize::MAX` bytes with things like Physical Address - /// Extension. As such, memory acquired directly from allocators or memory - /// mapped files *may* be too large to handle with this function. - /// - /// Consider using [`wrapping_offset`] instead if these constraints are - /// difficult to satisfy. The only advantage of this method is that it - /// enables more aggressive compiler optimizations. - /// - /// [`wrapping_offset`]: #method.wrapping_offset - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let mut s = [1, 2, 3]; - /// let ptr: *mut u32 = s.as_mut_ptr(); - /// - /// unsafe { - /// println!("{}", *ptr.offset(1)); - /// println!("{}", *ptr.offset(2)); - /// } - /// ``` - #[stable(feature = "rust1", since = "1.0.0")] - #[inline] - pub unsafe fn offset(self, count: isize) -> *mut T - where - T: Sized, - { - intrinsics::offset(self, count) as *mut T - } - - /// Calculates the offset from a pointer using wrapping arithmetic. - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// The resulting pointer does not need to be in bounds, but it is - /// potentially hazardous to dereference (which requires `unsafe`). - /// - /// In particular, the resulting pointer remains attached to the same allocated - /// object that `self` points to. It may *not* be used to access a - /// different allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// In other words, `x.wrapping_offset(y.wrapping_offset_from(x))` is - /// *not* the same as `y`, and dereferencing it is undefined behavior - /// unless `x` and `y` point into the same allocated object. - /// - /// Compared to [`offset`], this method basically delays the requirement of staying - /// within the same allocated object: [`offset`] is immediate Undefined Behavior when - /// crossing object boundaries; `wrapping_offset` produces a pointer but still leads - /// to Undefined Behavior if that pointer is dereferenced. [`offset`] can be optimized - /// better and is thus preferrable in performance-sensitive code. - /// - /// If you need to cross object boundaries, cast the pointer to an integer and - /// do the arithmetic there. - /// - /// [`offset`]: #method.offset - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// // Iterate using a raw pointer in increments of two elements - /// let mut data = [1u8, 2, 3, 4, 5]; - /// let mut ptr: *mut u8 = data.as_mut_ptr(); - /// let step = 2; - /// let end_rounded_up = ptr.wrapping_offset(6); - /// - /// while ptr != end_rounded_up { - /// unsafe { - /// *ptr = 0; - /// } - /// ptr = ptr.wrapping_offset(step); - /// } - /// assert_eq!(&data, &[0, 2, 0, 4, 0]); - /// ``` - #[stable(feature = "ptr_wrapping_offset", since = "1.16.0")] - #[inline] - pub fn wrapping_offset(self, count: isize) -> *mut T - where - T: Sized, - { - unsafe { intrinsics::arith_offset(self, count) as *mut T } - } - - /// Returns `None` if the pointer is null, or else returns a mutable - /// reference to the value wrapped in `Some`. - /// - /// # Safety - /// - /// As with [`as_ref`], this is unsafe because it cannot verify the validity - /// of the returned pointer, nor can it ensure that the lifetime `'a` - /// returned is indeed a valid lifetime for the contained data. - /// - /// When calling this method, you have to ensure that *either* the pointer is NULL *or* - /// all of the following is true: - /// - it is properly aligned - /// - it must point to an initialized instance of T; in particular, the pointer must be - /// "dereferencable" in the sense defined [here]. - /// - /// This applies even if the result of this method is unused! - /// (The part about being initialized is not yet fully decided, but until - /// it is the only safe approach is to ensure that they are indeed initialized.) - /// - /// Additionally, the lifetime `'a` returned is arbitrarily chosen and does - /// not necessarily reflect the actual lifetime of the data. *You* must enforce - /// Rust's aliasing rules. In particular, for the duration of this lifetime, - /// the memory this pointer points to must not get accessed (read or written) - /// through any other pointer. - /// - /// [here]: crate::ptr#safety - /// [`as_ref`]: #method.as_ref - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let mut s = [1, 2, 3]; - /// let ptr: *mut u32 = s.as_mut_ptr(); - /// let first_value = unsafe { ptr.as_mut().unwrap() }; - /// *first_value = 4; - /// println!("{:?}", s); // It'll print: "[4, 2, 3]". - /// ``` - #[stable(feature = "ptr_as_ref", since = "1.9.0")] - #[inline] - pub unsafe fn as_mut<'a>(self) -> Option<&'a mut T> { - if self.is_null() { None } else { Some(&mut *self) } - } - - /// Calculates the distance between two pointers. The returned value is in - /// units of T: the distance in bytes is divided by `mem::size_of::()`. - /// - /// This function is the inverse of [`offset`]. - /// - /// [`offset`]: #method.offset-1 - /// [`wrapping_offset_from`]: #method.wrapping_offset_from-1 - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is Undefined - /// Behavior: - /// - /// * Both the starting and other pointer must be either in bounds or one - /// byte past the end of the same allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// * The distance between the pointers, **in bytes**, cannot overflow an `isize`. - /// - /// * The distance between the pointers, in bytes, must be an exact multiple - /// of the size of `T`. - /// - /// * The distance being in bounds cannot rely on "wrapping around" the address space. - /// - /// The compiler and standard library generally try to ensure allocations - /// never reach a size where an offset is a concern. For instance, `Vec` - /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so - /// `ptr_into_vec.offset_from(vec.as_ptr())` is always safe. - /// - /// Most platforms fundamentally can't even construct such an allocation. - /// For instance, no known 64-bit platform can ever serve a request - /// for 263 bytes due to page-table limitations or splitting the address space. - /// However, some 32-bit and 16-bit platforms may successfully serve a request for - /// more than `isize::MAX` bytes with things like Physical Address - /// Extension. As such, memory acquired directly from allocators or memory - /// mapped files *may* be too large to handle with this function. - /// - /// Consider using [`wrapping_offset_from`] instead if these constraints are - /// difficult to satisfy. The only advantage of this method is that it - /// enables more aggressive compiler optimizations. - /// - /// # Panics - /// - /// This function panics if `T` is a Zero-Sized Type ("ZST"). - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// #![feature(ptr_offset_from)] - /// - /// let mut a = [0; 5]; - /// let ptr1: *mut i32 = &mut a[1]; - /// let ptr2: *mut i32 = &mut a[3]; - /// unsafe { - /// assert_eq!(ptr2.offset_from(ptr1), 2); - /// assert_eq!(ptr1.offset_from(ptr2), -2); - /// assert_eq!(ptr1.offset(2), ptr2); - /// assert_eq!(ptr2.offset(-2), ptr1); - /// } - /// ``` - #[unstable(feature = "ptr_offset_from", issue = "41079")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_ptr_offset_from"))] - #[cfg_attr( - not(bootstrap), - rustc_const_unstable(feature = "const_ptr_offset_from", issue = "41079"), - )] - #[inline] - pub const unsafe fn offset_from(self, origin: *const T) -> isize - where - T: Sized, - { - (self as *const T).offset_from(origin) - } - - /// Calculates the distance between two pointers. The returned value is in - /// units of T: the distance in bytes is divided by `mem::size_of::()`. - /// - /// If the address different between the two pointers is not a multiple of - /// `mem::size_of::()` then the result of the division is rounded towards - /// zero. - /// - /// Though this method is safe for any two pointers, note that its result - /// will be mostly useless if the two pointers aren't into the same allocated - /// object, for example if they point to two different local variables. - /// - /// # Panics - /// - /// This function panics if `T` is a zero-sized type. - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// #![feature(ptr_wrapping_offset_from)] - /// - /// let mut a = [0; 5]; - /// let ptr1: *mut i32 = &mut a[1]; - /// let ptr2: *mut i32 = &mut a[3]; - /// assert_eq!(ptr2.wrapping_offset_from(ptr1), 2); - /// assert_eq!(ptr1.wrapping_offset_from(ptr2), -2); - /// assert_eq!(ptr1.wrapping_offset(2), ptr2); - /// assert_eq!(ptr2.wrapping_offset(-2), ptr1); - /// - /// let ptr1: *mut i32 = 3 as _; - /// let ptr2: *mut i32 = 13 as _; - /// assert_eq!(ptr2.wrapping_offset_from(ptr1), 2); - /// ``` - #[unstable(feature = "ptr_wrapping_offset_from", issue = "41079")] - #[inline] - pub fn wrapping_offset_from(self, origin: *const T) -> isize - where - T: Sized, - { - (self as *const T).wrapping_offset_from(origin) - } - - /// Calculates the offset from a pointer (convenience for `.offset(count as isize)`). - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is Undefined - /// Behavior: - /// - /// * Both the starting and resulting pointer must be either in bounds or one - /// byte past the end of the same allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// * The computed offset, **in bytes**, cannot overflow an `isize`. - /// - /// * The offset being in bounds cannot rely on "wrapping around" the address - /// space. That is, the infinite-precision sum must fit in a `usize`. - /// - /// The compiler and standard library generally tries to ensure allocations - /// never reach a size where an offset is a concern. For instance, `Vec` - /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so - /// `vec.as_ptr().add(vec.len())` is always safe. - /// - /// Most platforms fundamentally can't even construct such an allocation. - /// For instance, no known 64-bit platform can ever serve a request - /// for 263 bytes due to page-table limitations or splitting the address space. - /// However, some 32-bit and 16-bit platforms may successfully serve a request for - /// more than `isize::MAX` bytes with things like Physical Address - /// Extension. As such, memory acquired directly from allocators or memory - /// mapped files *may* be too large to handle with this function. - /// - /// Consider using [`wrapping_add`] instead if these constraints are - /// difficult to satisfy. The only advantage of this method is that it - /// enables more aggressive compiler optimizations. - /// - /// [`wrapping_add`]: #method.wrapping_add - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let s: &str = "123"; - /// let ptr: *const u8 = s.as_ptr(); - /// - /// unsafe { - /// println!("{}", *ptr.add(1) as char); - /// println!("{}", *ptr.add(2) as char); - /// } - /// ``` - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn add(self, count: usize) -> Self - where - T: Sized, - { - self.offset(count as isize) - } - - /// Calculates the offset from a pointer (convenience for - /// `.offset((count as isize).wrapping_neg())`). - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is Undefined - /// Behavior: - /// - /// * Both the starting and resulting pointer must be either in bounds or one - /// byte past the end of the same allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// * The computed offset cannot exceed `isize::MAX` **bytes**. - /// - /// * The offset being in bounds cannot rely on "wrapping around" the address - /// space. That is, the infinite-precision sum must fit in a usize. - /// - /// The compiler and standard library generally tries to ensure allocations - /// never reach a size where an offset is a concern. For instance, `Vec` - /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so - /// `vec.as_ptr().add(vec.len()).sub(vec.len())` is always safe. - /// - /// Most platforms fundamentally can't even construct such an allocation. - /// For instance, no known 64-bit platform can ever serve a request - /// for 263 bytes due to page-table limitations or splitting the address space. - /// However, some 32-bit and 16-bit platforms may successfully serve a request for - /// more than `isize::MAX` bytes with things like Physical Address - /// Extension. As such, memory acquired directly from allocators or memory - /// mapped files *may* be too large to handle with this function. - /// - /// Consider using [`wrapping_sub`] instead if these constraints are - /// difficult to satisfy. The only advantage of this method is that it - /// enables more aggressive compiler optimizations. - /// - /// [`wrapping_sub`]: #method.wrapping_sub - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// let s: &str = "123"; - /// - /// unsafe { - /// let end: *const u8 = s.as_ptr().add(3); - /// println!("{}", *end.sub(1) as char); - /// println!("{}", *end.sub(2) as char); - /// } - /// ``` - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn sub(self, count: usize) -> Self - where - T: Sized, - { - self.offset((count as isize).wrapping_neg()) - } - - /// Calculates the offset from a pointer using wrapping arithmetic. - /// (convenience for `.wrapping_offset(count as isize)`) - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// The resulting pointer does not need to be in bounds, but it is - /// potentially hazardous to dereference (which requires `unsafe`). - /// - /// In particular, the resulting pointer remains attached to the same allocated - /// object that `self` points to. It may *not* be used to access a - /// different allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// Compared to [`add`], this method basically delays the requirement of staying - /// within the same allocated object: [`add`] is immediate Undefined Behavior when - /// crossing object boundaries; `wrapping_add` produces a pointer but still leads - /// to Undefined Behavior if that pointer is dereferenced. [`add`] can be optimized - /// better and is thus preferrable in performance-sensitive code. - /// - /// If you need to cross object boundaries, cast the pointer to an integer and - /// do the arithmetic there. - /// - /// [`add`]: #method.add - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// // Iterate using a raw pointer in increments of two elements - /// let data = [1u8, 2, 3, 4, 5]; - /// let mut ptr: *const u8 = data.as_ptr(); - /// let step = 2; - /// let end_rounded_up = ptr.wrapping_add(6); - /// - /// // This loop prints "1, 3, 5, " - /// while ptr != end_rounded_up { - /// unsafe { - /// print!("{}, ", *ptr); - /// } - /// ptr = ptr.wrapping_add(step); - /// } - /// ``` - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub fn wrapping_add(self, count: usize) -> Self - where - T: Sized, - { - self.wrapping_offset(count as isize) - } - - /// Calculates the offset from a pointer using wrapping arithmetic. - /// (convenience for `.wrapping_offset((count as isize).wrapping_sub())`) - /// - /// `count` is in units of T; e.g., a `count` of 3 represents a pointer - /// offset of `3 * size_of::()` bytes. - /// - /// # Safety - /// - /// The resulting pointer does not need to be in bounds, but it is - /// potentially hazardous to dereference (which requires `unsafe`). - /// - /// In particular, the resulting pointer remains attached to the same allocated - /// object that `self` points to. It may *not* be used to access a - /// different allocated object. Note that in Rust, - /// every (stack-allocated) variable is considered a separate allocated object. - /// - /// Compared to [`sub`], this method basically delays the requirement of staying - /// within the same allocated object: [`sub`] is immediate Undefined Behavior when - /// crossing object boundaries; `wrapping_sub` produces a pointer but still leads - /// to Undefined Behavior if that pointer is dereferenced. [`sub`] can be optimized - /// better and is thus preferrable in performance-sensitive code. - /// - /// If you need to cross object boundaries, cast the pointer to an integer and - /// do the arithmetic there. - /// - /// [`sub`]: #method.sub - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// // Iterate using a raw pointer in increments of two elements (backwards) - /// let data = [1u8, 2, 3, 4, 5]; - /// let mut ptr: *const u8 = data.as_ptr(); - /// let start_rounded_down = ptr.wrapping_sub(2); - /// ptr = ptr.wrapping_add(4); - /// let step = 2; - /// // This loop prints "5, 3, 1, " - /// while ptr != start_rounded_down { - /// unsafe { - /// print!("{}, ", *ptr); - /// } - /// ptr = ptr.wrapping_sub(step); - /// } - /// ``` - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub fn wrapping_sub(self, count: usize) -> Self - where - T: Sized, - { - self.wrapping_offset((count as isize).wrapping_neg()) - } - - /// Reads the value from `self` without moving it. This leaves the - /// memory in `self` unchanged. - /// - /// See [`ptr::read`] for safety concerns and examples. - /// - /// [`ptr::read`]: ./ptr/fn.read.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn read(self) -> T - where - T: Sized, - { - read(self) - } - - /// Performs a volatile read of the value from `self` without moving it. This - /// leaves the memory in `self` unchanged. - /// - /// Volatile operations are intended to act on I/O memory, and are guaranteed - /// to not be elided or reordered by the compiler across other volatile - /// operations. - /// - /// See [`ptr::read_volatile`] for safety concerns and examples. - /// - /// [`ptr::read_volatile`]: ./ptr/fn.read_volatile.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn read_volatile(self) -> T - where - T: Sized, - { - read_volatile(self) - } - - /// Reads the value from `self` without moving it. This leaves the - /// memory in `self` unchanged. - /// - /// Unlike `read`, the pointer may be unaligned. - /// - /// See [`ptr::read_unaligned`] for safety concerns and examples. - /// - /// [`ptr::read_unaligned`]: ./ptr/fn.read_unaligned.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn read_unaligned(self) -> T - where - T: Sized, - { - read_unaligned(self) - } - - /// Copies `count * size_of` bytes from `self` to `dest`. The source - /// and destination may overlap. - /// - /// NOTE: this has the *same* argument order as [`ptr::copy`]. - /// - /// See [`ptr::copy`] for safety concerns and examples. - /// - /// [`ptr::copy`]: ./ptr/fn.copy.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn copy_to(self, dest: *mut T, count: usize) - where - T: Sized, - { - copy(self, dest, count) - } - - /// Copies `count * size_of` bytes from `self` to `dest`. The source - /// and destination may *not* overlap. - /// - /// NOTE: this has the *same* argument order as [`ptr::copy_nonoverlapping`]. - /// - /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples. - /// - /// [`ptr::copy_nonoverlapping`]: ./ptr/fn.copy_nonoverlapping.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize) - where - T: Sized, - { - copy_nonoverlapping(self, dest, count) - } - - /// Copies `count * size_of` bytes from `src` to `self`. The source - /// and destination may overlap. - /// - /// NOTE: this has the *opposite* argument order of [`ptr::copy`]. - /// - /// See [`ptr::copy`] for safety concerns and examples. - /// - /// [`ptr::copy`]: ./ptr/fn.copy.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn copy_from(self, src: *const T, count: usize) - where - T: Sized, - { - copy(src, self, count) - } - - /// Copies `count * size_of` bytes from `src` to `self`. The source - /// and destination may *not* overlap. - /// - /// NOTE: this has the *opposite* argument order of [`ptr::copy_nonoverlapping`]. - /// - /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples. - /// - /// [`ptr::copy_nonoverlapping`]: ./ptr/fn.copy_nonoverlapping.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn copy_from_nonoverlapping(self, src: *const T, count: usize) - where - T: Sized, - { - copy_nonoverlapping(src, self, count) - } - - /// Executes the destructor (if any) of the pointed-to value. - /// - /// See [`ptr::drop_in_place`] for safety concerns and examples. - /// - /// [`ptr::drop_in_place`]: ./ptr/fn.drop_in_place.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn drop_in_place(self) { - drop_in_place(self) - } - - /// Overwrites a memory location with the given value without reading or - /// dropping the old value. - /// - /// See [`ptr::write`] for safety concerns and examples. - /// - /// [`ptr::write`]: ./ptr/fn.write.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn write(self, val: T) - where - T: Sized, - { - write(self, val) - } - - /// Invokes memset on the specified pointer, setting `count * size_of::()` - /// bytes of memory starting at `self` to `val`. - /// - /// See [`ptr::write_bytes`] for safety concerns and examples. - /// - /// [`ptr::write_bytes`]: ./ptr/fn.write_bytes.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn write_bytes(self, val: u8, count: usize) - where - T: Sized, - { - write_bytes(self, val, count) - } - - /// Performs a volatile write of a memory location with the given value without - /// reading or dropping the old value. - /// - /// Volatile operations are intended to act on I/O memory, and are guaranteed - /// to not be elided or reordered by the compiler across other volatile - /// operations. - /// - /// See [`ptr::write_volatile`] for safety concerns and examples. - /// - /// [`ptr::write_volatile`]: ./ptr/fn.write_volatile.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn write_volatile(self, val: T) - where - T: Sized, - { - write_volatile(self, val) - } - - /// Overwrites a memory location with the given value without reading or - /// dropping the old value. - /// - /// Unlike `write`, the pointer may be unaligned. - /// - /// See [`ptr::write_unaligned`] for safety concerns and examples. - /// - /// [`ptr::write_unaligned`]: ./ptr/fn.write_unaligned.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn write_unaligned(self, val: T) - where - T: Sized, - { - write_unaligned(self, val) - } - - /// Replaces the value at `self` with `src`, returning the old - /// value, without dropping either. - /// - /// See [`ptr::replace`] for safety concerns and examples. - /// - /// [`ptr::replace`]: ./ptr/fn.replace.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn replace(self, src: T) -> T - where - T: Sized, - { - replace(self, src) - } - - /// Swaps the values at two mutable locations of the same type, without - /// deinitializing either. They may overlap, unlike `mem::swap` which is - /// otherwise equivalent. - /// - /// See [`ptr::swap`] for safety concerns and examples. - /// - /// [`ptr::swap`]: ./ptr/fn.swap.html - #[stable(feature = "pointer_methods", since = "1.26.0")] - #[inline] - pub unsafe fn swap(self, with: *mut T) - where - T: Sized, - { - swap(self, with) - } - - /// Computes the offset that needs to be applied to the pointer in order to make it aligned to - /// `align`. - /// - /// If it is not possible to align the pointer, the implementation returns - /// `usize::max_value()`. It is permissible for the implementation to *always* - /// return `usize::max_value()`. Only your algorithm's performance can depend - /// on getting a usable offset here, not its correctness. - /// - /// The offset is expressed in number of `T` elements, and not bytes. The value returned can be - /// used with the `wrapping_add` method. - /// - /// There are no guarantees whatsoever that offsetting the pointer will not overflow or go - /// beyond the allocation that the pointer points into. It is up to the caller to ensure that - /// the returned offset is correct in all terms other than alignment. - /// - /// # Panics - /// - /// The function panics if `align` is not a power-of-two. - /// - /// # Examples - /// - /// Accessing adjacent `u8` as `u16` - /// - /// ``` - /// # fn foo(n: usize) { - /// # use std::mem::align_of; - /// # unsafe { - /// let x = [5u8, 6u8, 7u8, 8u8, 9u8]; - /// let ptr = &x[n] as *const u8; - /// let offset = ptr.align_offset(align_of::()); - /// if offset < x.len() - n - 1 { - /// let u16_ptr = ptr.add(offset) as *const u16; - /// assert_ne!(*u16_ptr, 500); - /// } else { - /// // while the pointer can be aligned via `offset`, it would point - /// // outside the allocation - /// } - /// # } } - /// ``` - #[stable(feature = "align_offset", since = "1.36.0")] - pub fn align_offset(self, align: usize) -> usize - where - T: Sized, - { - if !align.is_power_of_two() { - panic!("align_offset: align is not a power-of-two"); - } - unsafe { align_offset(self, align) } - } -} - -/// Align pointer `p`. -/// -/// Calculate offset (in terms of elements of `stride` stride) that has to be applied -/// to pointer `p` so that pointer `p` would get aligned to `a`. -/// -/// Note: This implementation has been carefully tailored to not panic. It is UB for this to panic. -/// The only real change that can be made here is change of `INV_TABLE_MOD_16` and associated -/// constants. -/// -/// If we ever decide to make it possible to call the intrinsic with `a` that is not a -/// power-of-two, it will probably be more prudent to just change to a naive implementation rather -/// than trying to adapt this to accommodate that change. -/// -/// Any questions go to @nagisa. -#[lang = "align_offset"] -pub(crate) unsafe fn align_offset(p: *const T, a: usize) -> usize { - /// Calculate multiplicative modular inverse of `x` modulo `m`. - /// - /// This implementation is tailored for align_offset and has following preconditions: - /// - /// * `m` is a power-of-two; - /// * `x < m`; (if `x ≥ m`, pass in `x % m` instead) - /// - /// Implementation of this function shall not panic. Ever. - #[inline] - fn mod_inv(x: usize, m: usize) -> usize { - /// Multiplicative modular inverse table modulo 2⁴ = 16. - /// - /// Note, that this table does not contain values where inverse does not exist (i.e., for - /// `0⁻¹ mod 16`, `2⁻¹ mod 16`, etc.) - const INV_TABLE_MOD_16: [u8; 8] = [1, 11, 13, 7, 9, 3, 5, 15]; - /// Modulo for which the `INV_TABLE_MOD_16` is intended. - const INV_TABLE_MOD: usize = 16; - /// INV_TABLE_MOD² - const INV_TABLE_MOD_SQUARED: usize = INV_TABLE_MOD * INV_TABLE_MOD; - - let table_inverse = INV_TABLE_MOD_16[(x & (INV_TABLE_MOD - 1)) >> 1] as usize; - if m <= INV_TABLE_MOD { - table_inverse & (m - 1) - } else { - // We iterate "up" using the following formula: - // - // $$ xy ≡ 1 (mod 2ⁿ) → xy (2 - xy) ≡ 1 (mod 2²ⁿ) $$ - // - // until 2²ⁿ ≥ m. Then we can reduce to our desired `m` by taking the result `mod m`. - let mut inverse = table_inverse; - let mut going_mod = INV_TABLE_MOD_SQUARED; - loop { - // y = y * (2 - xy) mod n - // - // Note, that we use wrapping operations here intentionally – the original formula - // uses e.g., subtraction `mod n`. It is entirely fine to do them `mod - // usize::max_value()` instead, because we take the result `mod n` at the end - // anyway. - inverse = inverse.wrapping_mul(2usize.wrapping_sub(x.wrapping_mul(inverse))) - & (going_mod - 1); - if going_mod > m { - return inverse & (m - 1); - } - going_mod = going_mod.wrapping_mul(going_mod); - } - } - } - - let stride = mem::size_of::(); - let a_minus_one = a.wrapping_sub(1); - let pmoda = p as usize & a_minus_one; - - if pmoda == 0 { - // Already aligned. Yay! - return 0; - } - - if stride <= 1 { - return if stride == 0 { - // If the pointer is not aligned, and the element is zero-sized, then no amount of - // elements will ever align the pointer. - !0 - } else { - a.wrapping_sub(pmoda) - }; - } - - let smoda = stride & a_minus_one; - // a is power-of-two so cannot be 0. stride = 0 is handled above. - let gcdpow = intrinsics::cttz_nonzero(stride).min(intrinsics::cttz_nonzero(a)); - let gcd = 1usize << gcdpow; - - if p as usize & (gcd - 1) == 0 { - // This branch solves for the following linear congruence equation: - // - // $$ p + so ≡ 0 mod a $$ - // - // $p$ here is the pointer value, $s$ – stride of `T`, $o$ offset in `T`s, and $a$ – the - // requested alignment. - // - // g = gcd(a, s) - // o = (a - (p mod a))/g * ((s/g)⁻¹ mod a) - // - // The first term is “the relative alignment of p to a”, the second term is “how does - // incrementing p by s bytes change the relative alignment of p”. Division by `g` is - // necessary to make this equation well formed if $a$ and $s$ are not co-prime. - // - // Furthermore, the result produced by this solution is not “minimal”, so it is necessary - // to take the result $o mod lcm(s, a)$. We can replace $lcm(s, a)$ with just a $a / g$. - let j = a.wrapping_sub(pmoda) >> gcdpow; - let k = smoda >> gcdpow; - return intrinsics::unchecked_rem(j.wrapping_mul(mod_inv(k, a)), a >> gcdpow); - } - - // Cannot be aligned at all. - usize::max_value() -} - -// Equality for pointers -#[stable(feature = "rust1", since = "1.0.0")] -impl PartialEq for *const T { - #[inline] - fn eq(&self, other: &*const T) -> bool { - *self == *other - } -} - -#[stable(feature = "rust1", since = "1.0.0")] -impl Eq for *const T {} - -#[stable(feature = "rust1", since = "1.0.0")] -impl PartialEq for *mut T { - #[inline] - fn eq(&self, other: &*mut T) -> bool { - *self == *other - } -} - -#[stable(feature = "rust1", since = "1.0.0")] -impl Eq for *mut T {} + // Cannot be aligned at all. + usize::max_value() +} /// Compares raw pointers for equality. /// @@ -2952,88 +1334,3 @@ fnptr_impls_args! { A, B, C, D, E, F, G, H, I } fnptr_impls_args! { A, B, C, D, E, F, G, H, I, J } fnptr_impls_args! { A, B, C, D, E, F, G, H, I, J, K } fnptr_impls_args! { A, B, C, D, E, F, G, H, I, J, K, L } - -// Comparison for pointers -#[stable(feature = "rust1", since = "1.0.0")] -impl Ord for *const T { - #[inline] - fn cmp(&self, other: &*const T) -> Ordering { - if self < other { - Less - } else if self == other { - Equal - } else { - Greater - } - } -} - -#[stable(feature = "rust1", since = "1.0.0")] -impl PartialOrd for *const T { - #[inline] - fn partial_cmp(&self, other: &*const T) -> Option { - Some(self.cmp(other)) - } - - #[inline] - fn lt(&self, other: &*const T) -> bool { - *self < *other - } - - #[inline] - fn le(&self, other: &*const T) -> bool { - *self <= *other - } - - #[inline] - fn gt(&self, other: &*const T) -> bool { - *self > *other - } - - #[inline] - fn ge(&self, other: &*const T) -> bool { - *self >= *other - } -} - -#[stable(feature = "rust1", since = "1.0.0")] -impl Ord for *mut T { - #[inline] - fn cmp(&self, other: &*mut T) -> Ordering { - if self < other { - Less - } else if self == other { - Equal - } else { - Greater - } - } -} - -#[stable(feature = "rust1", since = "1.0.0")] -impl PartialOrd for *mut T { - #[inline] - fn partial_cmp(&self, other: &*mut T) -> Option { - Some(self.cmp(other)) - } - - #[inline] - fn lt(&self, other: &*mut T) -> bool { - *self < *other - } - - #[inline] - fn le(&self, other: &*mut T) -> bool { - *self <= *other - } - - #[inline] - fn gt(&self, other: &*mut T) -> bool { - *self > *other - } - - #[inline] - fn ge(&self, other: &*mut T) -> bool { - *self >= *other - } -} diff --git a/src/libcore/ptr/mut_ptr.rs b/src/libcore/ptr/mut_ptr.rs new file mode 100644 index 0000000000..4bc0a3e9fa --- /dev/null +++ b/src/libcore/ptr/mut_ptr.rs @@ -0,0 +1,949 @@ +use super::*; +use crate::cmp::Ordering::{self, Equal, Greater, Less}; +use crate::intrinsics; + +// ignore-tidy-undocumented-unsafe + +#[lang = "mut_ptr"] +impl *mut T { + /// Returns `true` if the pointer is null. + /// + /// Note that unsized types have many possible null pointers, as only the + /// raw data pointer is considered, not their length, vtable, etc. + /// Therefore, two pointers that are null may still not compare equal to + /// each other. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let mut s = [1, 2, 3]; + /// let ptr: *mut u32 = s.as_mut_ptr(); + /// assert!(!ptr.is_null()); + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + #[inline] + pub fn is_null(self) -> bool { + // Compare via a cast to a thin pointer, so fat pointers are only + // considering their "data" part for null-ness. + (self as *mut u8) == null_mut() + } + + /// Casts to a pointer of another type. + #[stable(feature = "ptr_cast", since = "1.38.0")] + #[rustc_const_stable(feature = "const_ptr_cast", since = "1.38.0")] + #[inline] + pub const fn cast(self) -> *mut U { + self as _ + } + + /// Returns `None` if the pointer is null, or else returns a reference to + /// the value wrapped in `Some`. + /// + /// # Safety + /// + /// While this method and its mutable counterpart are useful for + /// null-safety, it is important to note that this is still an unsafe + /// operation because the returned value could be pointing to invalid + /// memory. + /// + /// When calling this method, you have to ensure that if the pointer is + /// non-NULL, then it is properly aligned, dereferencable (for the whole + /// size of `T`) and points to an initialized instance of `T`. This applies + /// even if the result of this method is unused! + /// (The part about being initialized is not yet fully decided, but until + /// it is, the only safe approach is to ensure that they are indeed initialized.) + /// + /// Additionally, the lifetime `'a` returned is arbitrarily chosen and does + /// not necessarily reflect the actual lifetime of the data. It is up to the + /// caller to ensure that for the duration of this lifetime, the memory this + /// pointer points to does not get written to outside of `UnsafeCell`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let ptr: *mut u8 = &mut 10u8 as *mut u8; + /// + /// unsafe { + /// if let Some(val_back) = ptr.as_ref() { + /// println!("We got back the value: {}!", val_back); + /// } + /// } + /// ``` + /// + /// # Null-unchecked version + /// + /// If you are sure the pointer can never be null and are looking for some kind of + /// `as_ref_unchecked` that returns the `&T` instead of `Option<&T>`, know that you can + /// dereference the pointer directly. + /// + /// ``` + /// let ptr: *mut u8 = &mut 10u8 as *mut u8; + /// + /// unsafe { + /// let val_back = &*ptr; + /// println!("We got back the value: {}!", val_back); + /// } + /// ``` + #[stable(feature = "ptr_as_ref", since = "1.9.0")] + #[inline] + pub unsafe fn as_ref<'a>(self) -> Option<&'a T> { + if self.is_null() { None } else { Some(&*self) } + } + + /// Calculates the offset from a pointer. + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// If any of the following conditions are violated, the result is Undefined + /// Behavior: + /// + /// * Both the starting and resulting pointer must be either in bounds or one + /// byte past the end of the same allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// * The computed offset, **in bytes**, cannot overflow an `isize`. + /// + /// * The offset being in bounds cannot rely on "wrapping around" the address + /// space. That is, the infinite-precision sum, **in bytes** must fit in a usize. + /// + /// The compiler and standard library generally tries to ensure allocations + /// never reach a size where an offset is a concern. For instance, `Vec` + /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so + /// `vec.as_ptr().add(vec.len())` is always safe. + /// + /// Most platforms fundamentally can't even construct such an allocation. + /// For instance, no known 64-bit platform can ever serve a request + /// for 263 bytes due to page-table limitations or splitting the address space. + /// However, some 32-bit and 16-bit platforms may successfully serve a request for + /// more than `isize::MAX` bytes with things like Physical Address + /// Extension. As such, memory acquired directly from allocators or memory + /// mapped files *may* be too large to handle with this function. + /// + /// Consider using [`wrapping_offset`] instead if these constraints are + /// difficult to satisfy. The only advantage of this method is that it + /// enables more aggressive compiler optimizations. + /// + /// [`wrapping_offset`]: #method.wrapping_offset + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let mut s = [1, 2, 3]; + /// let ptr: *mut u32 = s.as_mut_ptr(); + /// + /// unsafe { + /// println!("{}", *ptr.offset(1)); + /// println!("{}", *ptr.offset(2)); + /// } + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + #[inline] + pub unsafe fn offset(self, count: isize) -> *mut T + where + T: Sized, + { + intrinsics::offset(self, count) as *mut T + } + + /// Calculates the offset from a pointer using wrapping arithmetic. + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// The resulting pointer does not need to be in bounds, but it is + /// potentially hazardous to dereference (which requires `unsafe`). + /// + /// In particular, the resulting pointer remains attached to the same allocated + /// object that `self` points to. It may *not* be used to access a + /// different allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// In other words, `x.wrapping_offset(y.wrapping_offset_from(x))` is + /// *not* the same as `y`, and dereferencing it is undefined behavior + /// unless `x` and `y` point into the same allocated object. + /// + /// Compared to [`offset`], this method basically delays the requirement of staying + /// within the same allocated object: [`offset`] is immediate Undefined Behavior when + /// crossing object boundaries; `wrapping_offset` produces a pointer but still leads + /// to Undefined Behavior if that pointer is dereferenced. [`offset`] can be optimized + /// better and is thus preferrable in performance-sensitive code. + /// + /// If you need to cross object boundaries, cast the pointer to an integer and + /// do the arithmetic there. + /// + /// [`offset`]: #method.offset + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// // Iterate using a raw pointer in increments of two elements + /// let mut data = [1u8, 2, 3, 4, 5]; + /// let mut ptr: *mut u8 = data.as_mut_ptr(); + /// let step = 2; + /// let end_rounded_up = ptr.wrapping_offset(6); + /// + /// while ptr != end_rounded_up { + /// unsafe { + /// *ptr = 0; + /// } + /// ptr = ptr.wrapping_offset(step); + /// } + /// assert_eq!(&data, &[0, 2, 0, 4, 0]); + /// ``` + #[stable(feature = "ptr_wrapping_offset", since = "1.16.0")] + #[inline] + pub fn wrapping_offset(self, count: isize) -> *mut T + where + T: Sized, + { + unsafe { intrinsics::arith_offset(self, count) as *mut T } + } + + /// Returns `None` if the pointer is null, or else returns a mutable + /// reference to the value wrapped in `Some`. + /// + /// # Safety + /// + /// As with [`as_ref`], this is unsafe because it cannot verify the validity + /// of the returned pointer, nor can it ensure that the lifetime `'a` + /// returned is indeed a valid lifetime for the contained data. + /// + /// When calling this method, you have to ensure that *either* the pointer is NULL *or* + /// all of the following is true: + /// - it is properly aligned + /// - it must point to an initialized instance of T; in particular, the pointer must be + /// "dereferencable" in the sense defined [here]. + /// + /// This applies even if the result of this method is unused! + /// (The part about being initialized is not yet fully decided, but until + /// it is the only safe approach is to ensure that they are indeed initialized.) + /// + /// Additionally, the lifetime `'a` returned is arbitrarily chosen and does + /// not necessarily reflect the actual lifetime of the data. *You* must enforce + /// Rust's aliasing rules. In particular, for the duration of this lifetime, + /// the memory this pointer points to must not get accessed (read or written) + /// through any other pointer. + /// + /// [here]: crate::ptr#safety + /// [`as_ref`]: #method.as_ref + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let mut s = [1, 2, 3]; + /// let ptr: *mut u32 = s.as_mut_ptr(); + /// let first_value = unsafe { ptr.as_mut().unwrap() }; + /// *first_value = 4; + /// println!("{:?}", s); // It'll print: "[4, 2, 3]". + /// ``` + /// + /// # Null-unchecked version + /// + /// If you are sure the pointer can never be null and are looking for some kind of + /// `as_mut_unchecked` that returns the `&mut T` instead of `Option<&mut T>`, know that + /// you can dereference the pointer directly. + /// + /// ``` + /// let mut s = [1, 2, 3]; + /// let ptr: *mut u32 = s.as_mut_ptr(); + /// let first_value = unsafe { &mut *ptr }; + /// *first_value = 4; + /// println!("{:?}", s); // It'll print: "[4, 2, 3]". + /// ``` + #[stable(feature = "ptr_as_ref", since = "1.9.0")] + #[inline] + pub unsafe fn as_mut<'a>(self) -> Option<&'a mut T> { + if self.is_null() { None } else { Some(&mut *self) } + } + + /// Calculates the distance between two pointers. The returned value is in + /// units of T: the distance in bytes is divided by `mem::size_of::()`. + /// + /// This function is the inverse of [`offset`]. + /// + /// [`offset`]: #method.offset-1 + /// [`wrapping_offset_from`]: #method.wrapping_offset_from-1 + /// + /// # Safety + /// + /// If any of the following conditions are violated, the result is Undefined + /// Behavior: + /// + /// * Both the starting and other pointer must be either in bounds or one + /// byte past the end of the same allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// * The distance between the pointers, **in bytes**, cannot overflow an `isize`. + /// + /// * The distance between the pointers, in bytes, must be an exact multiple + /// of the size of `T`. + /// + /// * The distance being in bounds cannot rely on "wrapping around" the address space. + /// + /// The compiler and standard library generally try to ensure allocations + /// never reach a size where an offset is a concern. For instance, `Vec` + /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so + /// `ptr_into_vec.offset_from(vec.as_ptr())` is always safe. + /// + /// Most platforms fundamentally can't even construct such an allocation. + /// For instance, no known 64-bit platform can ever serve a request + /// for 263 bytes due to page-table limitations or splitting the address space. + /// However, some 32-bit and 16-bit platforms may successfully serve a request for + /// more than `isize::MAX` bytes with things like Physical Address + /// Extension. As such, memory acquired directly from allocators or memory + /// mapped files *may* be too large to handle with this function. + /// + /// Consider using [`wrapping_offset_from`] instead if these constraints are + /// difficult to satisfy. The only advantage of this method is that it + /// enables more aggressive compiler optimizations. + /// + /// # Panics + /// + /// This function panics if `T` is a Zero-Sized Type ("ZST"). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// #![feature(ptr_offset_from)] + /// + /// let mut a = [0; 5]; + /// let ptr1: *mut i32 = &mut a[1]; + /// let ptr2: *mut i32 = &mut a[3]; + /// unsafe { + /// assert_eq!(ptr2.offset_from(ptr1), 2); + /// assert_eq!(ptr1.offset_from(ptr2), -2); + /// assert_eq!(ptr1.offset(2), ptr2); + /// assert_eq!(ptr2.offset(-2), ptr1); + /// } + /// ``` + #[unstable(feature = "ptr_offset_from", issue = "41079")] + #[rustc_const_unstable(feature = "const_ptr_offset_from", issue = "41079")] + #[inline] + pub const unsafe fn offset_from(self, origin: *const T) -> isize + where + T: Sized, + { + (self as *const T).offset_from(origin) + } + + /// Calculates the distance between two pointers. The returned value is in + /// units of T: the distance in bytes is divided by `mem::size_of::()`. + /// + /// If the address different between the two pointers is not a multiple of + /// `mem::size_of::()` then the result of the division is rounded towards + /// zero. + /// + /// Though this method is safe for any two pointers, note that its result + /// will be mostly useless if the two pointers aren't into the same allocated + /// object, for example if they point to two different local variables. + /// + /// # Panics + /// + /// This function panics if `T` is a zero-sized type. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// #![feature(ptr_wrapping_offset_from)] + /// + /// let mut a = [0; 5]; + /// let ptr1: *mut i32 = &mut a[1]; + /// let ptr2: *mut i32 = &mut a[3]; + /// assert_eq!(ptr2.wrapping_offset_from(ptr1), 2); + /// assert_eq!(ptr1.wrapping_offset_from(ptr2), -2); + /// assert_eq!(ptr1.wrapping_offset(2), ptr2); + /// assert_eq!(ptr2.wrapping_offset(-2), ptr1); + /// + /// let ptr1: *mut i32 = 3 as _; + /// let ptr2: *mut i32 = 13 as _; + /// assert_eq!(ptr2.wrapping_offset_from(ptr1), 2); + /// ``` + #[unstable(feature = "ptr_wrapping_offset_from", issue = "41079")] + #[inline] + pub fn wrapping_offset_from(self, origin: *const T) -> isize + where + T: Sized, + { + (self as *const T).wrapping_offset_from(origin) + } + + /// Calculates the offset from a pointer (convenience for `.offset(count as isize)`). + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// If any of the following conditions are violated, the result is Undefined + /// Behavior: + /// + /// * Both the starting and resulting pointer must be either in bounds or one + /// byte past the end of the same allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// * The computed offset, **in bytes**, cannot overflow an `isize`. + /// + /// * The offset being in bounds cannot rely on "wrapping around" the address + /// space. That is, the infinite-precision sum must fit in a `usize`. + /// + /// The compiler and standard library generally tries to ensure allocations + /// never reach a size where an offset is a concern. For instance, `Vec` + /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so + /// `vec.as_ptr().add(vec.len())` is always safe. + /// + /// Most platforms fundamentally can't even construct such an allocation. + /// For instance, no known 64-bit platform can ever serve a request + /// for 263 bytes due to page-table limitations or splitting the address space. + /// However, some 32-bit and 16-bit platforms may successfully serve a request for + /// more than `isize::MAX` bytes with things like Physical Address + /// Extension. As such, memory acquired directly from allocators or memory + /// mapped files *may* be too large to handle with this function. + /// + /// Consider using [`wrapping_add`] instead if these constraints are + /// difficult to satisfy. The only advantage of this method is that it + /// enables more aggressive compiler optimizations. + /// + /// [`wrapping_add`]: #method.wrapping_add + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let s: &str = "123"; + /// let ptr: *const u8 = s.as_ptr(); + /// + /// unsafe { + /// println!("{}", *ptr.add(1) as char); + /// println!("{}", *ptr.add(2) as char); + /// } + /// ``` + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn add(self, count: usize) -> Self + where + T: Sized, + { + self.offset(count as isize) + } + + /// Calculates the offset from a pointer (convenience for + /// `.offset((count as isize).wrapping_neg())`). + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// If any of the following conditions are violated, the result is Undefined + /// Behavior: + /// + /// * Both the starting and resulting pointer must be either in bounds or one + /// byte past the end of the same allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// * The computed offset cannot exceed `isize::MAX` **bytes**. + /// + /// * The offset being in bounds cannot rely on "wrapping around" the address + /// space. That is, the infinite-precision sum must fit in a usize. + /// + /// The compiler and standard library generally tries to ensure allocations + /// never reach a size where an offset is a concern. For instance, `Vec` + /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so + /// `vec.as_ptr().add(vec.len()).sub(vec.len())` is always safe. + /// + /// Most platforms fundamentally can't even construct such an allocation. + /// For instance, no known 64-bit platform can ever serve a request + /// for 263 bytes due to page-table limitations or splitting the address space. + /// However, some 32-bit and 16-bit platforms may successfully serve a request for + /// more than `isize::MAX` bytes with things like Physical Address + /// Extension. As such, memory acquired directly from allocators or memory + /// mapped files *may* be too large to handle with this function. + /// + /// Consider using [`wrapping_sub`] instead if these constraints are + /// difficult to satisfy. The only advantage of this method is that it + /// enables more aggressive compiler optimizations. + /// + /// [`wrapping_sub`]: #method.wrapping_sub + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// let s: &str = "123"; + /// + /// unsafe { + /// let end: *const u8 = s.as_ptr().add(3); + /// println!("{}", *end.sub(1) as char); + /// println!("{}", *end.sub(2) as char); + /// } + /// ``` + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn sub(self, count: usize) -> Self + where + T: Sized, + { + self.offset((count as isize).wrapping_neg()) + } + + /// Calculates the offset from a pointer using wrapping arithmetic. + /// (convenience for `.wrapping_offset(count as isize)`) + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// The resulting pointer does not need to be in bounds, but it is + /// potentially hazardous to dereference (which requires `unsafe`). + /// + /// In particular, the resulting pointer remains attached to the same allocated + /// object that `self` points to. It may *not* be used to access a + /// different allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// Compared to [`add`], this method basically delays the requirement of staying + /// within the same allocated object: [`add`] is immediate Undefined Behavior when + /// crossing object boundaries; `wrapping_add` produces a pointer but still leads + /// to Undefined Behavior if that pointer is dereferenced. [`add`] can be optimized + /// better and is thus preferrable in performance-sensitive code. + /// + /// If you need to cross object boundaries, cast the pointer to an integer and + /// do the arithmetic there. + /// + /// [`add`]: #method.add + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// // Iterate using a raw pointer in increments of two elements + /// let data = [1u8, 2, 3, 4, 5]; + /// let mut ptr: *const u8 = data.as_ptr(); + /// let step = 2; + /// let end_rounded_up = ptr.wrapping_add(6); + /// + /// // This loop prints "1, 3, 5, " + /// while ptr != end_rounded_up { + /// unsafe { + /// print!("{}, ", *ptr); + /// } + /// ptr = ptr.wrapping_add(step); + /// } + /// ``` + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub fn wrapping_add(self, count: usize) -> Self + where + T: Sized, + { + self.wrapping_offset(count as isize) + } + + /// Calculates the offset from a pointer using wrapping arithmetic. + /// (convenience for `.wrapping_offset((count as isize).wrapping_sub())`) + /// + /// `count` is in units of T; e.g., a `count` of 3 represents a pointer + /// offset of `3 * size_of::()` bytes. + /// + /// # Safety + /// + /// The resulting pointer does not need to be in bounds, but it is + /// potentially hazardous to dereference (which requires `unsafe`). + /// + /// In particular, the resulting pointer remains attached to the same allocated + /// object that `self` points to. It may *not* be used to access a + /// different allocated object. Note that in Rust, + /// every (stack-allocated) variable is considered a separate allocated object. + /// + /// Compared to [`sub`], this method basically delays the requirement of staying + /// within the same allocated object: [`sub`] is immediate Undefined Behavior when + /// crossing object boundaries; `wrapping_sub` produces a pointer but still leads + /// to Undefined Behavior if that pointer is dereferenced. [`sub`] can be optimized + /// better and is thus preferrable in performance-sensitive code. + /// + /// If you need to cross object boundaries, cast the pointer to an integer and + /// do the arithmetic there. + /// + /// [`sub`]: #method.sub + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// // Iterate using a raw pointer in increments of two elements (backwards) + /// let data = [1u8, 2, 3, 4, 5]; + /// let mut ptr: *const u8 = data.as_ptr(); + /// let start_rounded_down = ptr.wrapping_sub(2); + /// ptr = ptr.wrapping_add(4); + /// let step = 2; + /// // This loop prints "5, 3, 1, " + /// while ptr != start_rounded_down { + /// unsafe { + /// print!("{}, ", *ptr); + /// } + /// ptr = ptr.wrapping_sub(step); + /// } + /// ``` + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub fn wrapping_sub(self, count: usize) -> Self + where + T: Sized, + { + self.wrapping_offset((count as isize).wrapping_neg()) + } + + /// Reads the value from `self` without moving it. This leaves the + /// memory in `self` unchanged. + /// + /// See [`ptr::read`] for safety concerns and examples. + /// + /// [`ptr::read`]: ./ptr/fn.read.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn read(self) -> T + where + T: Sized, + { + read(self) + } + + /// Performs a volatile read of the value from `self` without moving it. This + /// leaves the memory in `self` unchanged. + /// + /// Volatile operations are intended to act on I/O memory, and are guaranteed + /// to not be elided or reordered by the compiler across other volatile + /// operations. + /// + /// See [`ptr::read_volatile`] for safety concerns and examples. + /// + /// [`ptr::read_volatile`]: ./ptr/fn.read_volatile.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn read_volatile(self) -> T + where + T: Sized, + { + read_volatile(self) + } + + /// Reads the value from `self` without moving it. This leaves the + /// memory in `self` unchanged. + /// + /// Unlike `read`, the pointer may be unaligned. + /// + /// See [`ptr::read_unaligned`] for safety concerns and examples. + /// + /// [`ptr::read_unaligned`]: ./ptr/fn.read_unaligned.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn read_unaligned(self) -> T + where + T: Sized, + { + read_unaligned(self) + } + + /// Copies `count * size_of` bytes from `self` to `dest`. The source + /// and destination may overlap. + /// + /// NOTE: this has the *same* argument order as [`ptr::copy`]. + /// + /// See [`ptr::copy`] for safety concerns and examples. + /// + /// [`ptr::copy`]: ./ptr/fn.copy.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn copy_to(self, dest: *mut T, count: usize) + where + T: Sized, + { + copy(self, dest, count) + } + + /// Copies `count * size_of` bytes from `self` to `dest`. The source + /// and destination may *not* overlap. + /// + /// NOTE: this has the *same* argument order as [`ptr::copy_nonoverlapping`]. + /// + /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples. + /// + /// [`ptr::copy_nonoverlapping`]: ./ptr/fn.copy_nonoverlapping.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize) + where + T: Sized, + { + copy_nonoverlapping(self, dest, count) + } + + /// Copies `count * size_of` bytes from `src` to `self`. The source + /// and destination may overlap. + /// + /// NOTE: this has the *opposite* argument order of [`ptr::copy`]. + /// + /// See [`ptr::copy`] for safety concerns and examples. + /// + /// [`ptr::copy`]: ./ptr/fn.copy.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn copy_from(self, src: *const T, count: usize) + where + T: Sized, + { + copy(src, self, count) + } + + /// Copies `count * size_of` bytes from `src` to `self`. The source + /// and destination may *not* overlap. + /// + /// NOTE: this has the *opposite* argument order of [`ptr::copy_nonoverlapping`]. + /// + /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples. + /// + /// [`ptr::copy_nonoverlapping`]: ./ptr/fn.copy_nonoverlapping.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn copy_from_nonoverlapping(self, src: *const T, count: usize) + where + T: Sized, + { + copy_nonoverlapping(src, self, count) + } + + /// Executes the destructor (if any) of the pointed-to value. + /// + /// See [`ptr::drop_in_place`] for safety concerns and examples. + /// + /// [`ptr::drop_in_place`]: ./ptr/fn.drop_in_place.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn drop_in_place(self) { + drop_in_place(self) + } + + /// Overwrites a memory location with the given value without reading or + /// dropping the old value. + /// + /// See [`ptr::write`] for safety concerns and examples. + /// + /// [`ptr::write`]: ./ptr/fn.write.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn write(self, val: T) + where + T: Sized, + { + write(self, val) + } + + /// Invokes memset on the specified pointer, setting `count * size_of::()` + /// bytes of memory starting at `self` to `val`. + /// + /// See [`ptr::write_bytes`] for safety concerns and examples. + /// + /// [`ptr::write_bytes`]: ./ptr/fn.write_bytes.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn write_bytes(self, val: u8, count: usize) + where + T: Sized, + { + write_bytes(self, val, count) + } + + /// Performs a volatile write of a memory location with the given value without + /// reading or dropping the old value. + /// + /// Volatile operations are intended to act on I/O memory, and are guaranteed + /// to not be elided or reordered by the compiler across other volatile + /// operations. + /// + /// See [`ptr::write_volatile`] for safety concerns and examples. + /// + /// [`ptr::write_volatile`]: ./ptr/fn.write_volatile.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn write_volatile(self, val: T) + where + T: Sized, + { + write_volatile(self, val) + } + + /// Overwrites a memory location with the given value without reading or + /// dropping the old value. + /// + /// Unlike `write`, the pointer may be unaligned. + /// + /// See [`ptr::write_unaligned`] for safety concerns and examples. + /// + /// [`ptr::write_unaligned`]: ./ptr/fn.write_unaligned.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn write_unaligned(self, val: T) + where + T: Sized, + { + write_unaligned(self, val) + } + + /// Replaces the value at `self` with `src`, returning the old + /// value, without dropping either. + /// + /// See [`ptr::replace`] for safety concerns and examples. + /// + /// [`ptr::replace`]: ./ptr/fn.replace.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn replace(self, src: T) -> T + where + T: Sized, + { + replace(self, src) + } + + /// Swaps the values at two mutable locations of the same type, without + /// deinitializing either. They may overlap, unlike `mem::swap` which is + /// otherwise equivalent. + /// + /// See [`ptr::swap`] for safety concerns and examples. + /// + /// [`ptr::swap`]: ./ptr/fn.swap.html + #[stable(feature = "pointer_methods", since = "1.26.0")] + #[inline] + pub unsafe fn swap(self, with: *mut T) + where + T: Sized, + { + swap(self, with) + } + + /// Computes the offset that needs to be applied to the pointer in order to make it aligned to + /// `align`. + /// + /// If it is not possible to align the pointer, the implementation returns + /// `usize::max_value()`. It is permissible for the implementation to *always* + /// return `usize::max_value()`. Only your algorithm's performance can depend + /// on getting a usable offset here, not its correctness. + /// + /// The offset is expressed in number of `T` elements, and not bytes. The value returned can be + /// used with the `wrapping_add` method. + /// + /// There are no guarantees whatsoever that offsetting the pointer will not overflow or go + /// beyond the allocation that the pointer points into. It is up to the caller to ensure that + /// the returned offset is correct in all terms other than alignment. + /// + /// # Panics + /// + /// The function panics if `align` is not a power-of-two. + /// + /// # Examples + /// + /// Accessing adjacent `u8` as `u16` + /// + /// ``` + /// # fn foo(n: usize) { + /// # use std::mem::align_of; + /// # unsafe { + /// let x = [5u8, 6u8, 7u8, 8u8, 9u8]; + /// let ptr = &x[n] as *const u8; + /// let offset = ptr.align_offset(align_of::()); + /// if offset < x.len() - n - 1 { + /// let u16_ptr = ptr.add(offset) as *const u16; + /// assert_ne!(*u16_ptr, 500); + /// } else { + /// // while the pointer can be aligned via `offset`, it would point + /// // outside the allocation + /// } + /// # } } + /// ``` + #[stable(feature = "align_offset", since = "1.36.0")] + pub fn align_offset(self, align: usize) -> usize + where + T: Sized, + { + if !align.is_power_of_two() { + panic!("align_offset: align is not a power-of-two"); + } + unsafe { align_offset(self, align) } + } +} + +// Equality for pointers +#[stable(feature = "rust1", since = "1.0.0")] +impl PartialEq for *mut T { + #[inline] + fn eq(&self, other: &*mut T) -> bool { + *self == *other + } +} + +#[stable(feature = "rust1", since = "1.0.0")] +impl Eq for *mut T {} + +#[stable(feature = "rust1", since = "1.0.0")] +impl Ord for *mut T { + #[inline] + fn cmp(&self, other: &*mut T) -> Ordering { + if self < other { + Less + } else if self == other { + Equal + } else { + Greater + } + } +} + +#[stable(feature = "rust1", since = "1.0.0")] +impl PartialOrd for *mut T { + #[inline] + fn partial_cmp(&self, other: &*mut T) -> Option { + Some(self.cmp(other)) + } + + #[inline] + fn lt(&self, other: &*mut T) -> bool { + *self < *other + } + + #[inline] + fn le(&self, other: &*mut T) -> bool { + *self <= *other + } + + #[inline] + fn gt(&self, other: &*mut T) -> bool { + *self > *other + } + + #[inline] + fn ge(&self, other: &*mut T) -> bool { + *self >= *other + } +} diff --git a/src/libcore/ptr/non_null.rs b/src/libcore/ptr/non_null.rs index d1d97d7b33..626e58d493 100644 --- a/src/libcore/ptr/non_null.rs +++ b/src/libcore/ptr/non_null.rs @@ -66,10 +66,7 @@ impl NonNull { /// sentinel value. Types that lazily allocate must track initialization by /// some other means. #[stable(feature = "nonnull", since = "1.25.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_nonnull_dangling", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_nonnull_dangling", since = "1.32.0")] #[inline] pub const fn dangling() -> Self { unsafe { @@ -86,10 +83,7 @@ impl NonNull { /// /// `ptr` must be non-null. #[stable(feature = "nonnull", since = "1.25.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_nonnull_new_unchecked", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_nonnull_new_unchecked", since = "1.32.0")] #[inline] pub const unsafe fn new_unchecked(ptr: *mut T) -> Self { NonNull { pointer: ptr as _ } @@ -104,10 +98,7 @@ impl NonNull { /// Acquires the underlying `*mut` pointer. #[stable(feature = "nonnull", since = "1.25.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_nonnull_as_ptr", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_nonnull_as_ptr", since = "1.32.0")] #[inline] pub const fn as_ptr(self) -> *mut T { self.pointer as *mut T @@ -137,10 +128,7 @@ impl NonNull { /// Casts to a pointer of another type. #[stable(feature = "nonnull_cast", since = "1.27.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_nonnull_cast", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_nonnull_cast", since = "1.32.0")] #[inline] pub const fn cast(self) -> NonNull { unsafe { NonNull::new_unchecked(self.as_ptr() as *mut U) } @@ -161,7 +149,7 @@ impl Copy for NonNull {} #[unstable(feature = "coerce_unsized", issue = "27732")] impl CoerceUnsized> for NonNull where T: Unsize {} -#[unstable(feature = "dispatch_from_dyn", issue = "0")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] impl DispatchFromDyn> for NonNull where T: Unsize {} #[stable(feature = "nonnull", since = "1.25.0")] @@ -213,7 +201,7 @@ impl hash::Hash for NonNull { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl From> for NonNull { #[inline] fn from(unique: Unique) -> Self { diff --git a/src/libcore/ptr/unique.rs b/src/libcore/ptr/unique.rs index 546b7c9d77..87b56d951c 100644 --- a/src/libcore/ptr/unique.rs +++ b/src/libcore/ptr/unique.rs @@ -29,7 +29,7 @@ use crate::ptr::NonNull; /// for any type which upholds Unique's aliasing requirements. #[unstable( feature = "ptr_internals", - issue = "0", + issue = "none", reason = "use `NonNull` instead and consider `PhantomData` \ (if you also use `#[may_dangle]`), `Send`, and/or `Sync`" )] @@ -50,17 +50,17 @@ pub struct Unique { /// reference is unaliased. Note that this aliasing invariant is /// unenforced by the type system; the abstraction using the /// `Unique` must enforce it. -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] unsafe impl Send for Unique {} /// `Unique` pointers are `Sync` if `T` is `Sync` because the data they /// reference is unaliased. Note that this aliasing invariant is /// unenforced by the type system; the abstraction using the /// `Unique` must enforce it. -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] unsafe impl Sync for Unique {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl Unique { /// Creates a new `Unique` that is dangling, but well-aligned. /// @@ -78,7 +78,7 @@ impl Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl Unique { /// Creates a new `Unique`. /// @@ -133,7 +133,7 @@ impl Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl Clone for Unique { #[inline] fn clone(&self) -> Self { @@ -141,30 +141,30 @@ impl Clone for Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl Copy for Unique {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl CoerceUnsized> for Unique where T: Unsize {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl DispatchFromDyn> for Unique where T: Unsize {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl fmt::Debug for Unique { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Pointer::fmt(&self.as_ptr(), f) } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl fmt::Pointer for Unique { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Pointer::fmt(&self.as_ptr(), f) } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl From<&mut T> for Unique { #[inline] fn from(reference: &mut T) -> Self { @@ -172,7 +172,7 @@ impl From<&mut T> for Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl From<&T> for Unique { #[inline] fn from(reference: &T) -> Self { @@ -180,7 +180,7 @@ impl From<&T> for Unique { } } -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl From> for Unique { #[inline] fn from(p: NonNull) -> Self { diff --git a/src/libcore/result.rs b/src/libcore/result.rs index fb4dc62d8c..bc70dbd62e 100644 --- a/src/libcore/result.rs +++ b/src/libcore/result.rs @@ -242,6 +242,7 @@ use crate::ops::{self, Deref, DerefMut}; /// [`Err`]: enum.Result.html#variant.Err #[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)] #[must_use = "this `Result` may be an `Err` variant, which should be handled"] +#[rustc_diagnostic_item = "result_type"] #[stable(feature = "rust1", since = "1.0.0")] pub enum Result { /// Contains the success value @@ -278,13 +279,11 @@ impl Result { /// assert_eq!(x.is_ok(), false); /// ``` #[must_use = "if you intended to assert that this is ok, consider `.unwrap()` instead"] + #[rustc_const_unstable(feature = "const_result", issue = "67520")] #[inline] #[stable(feature = "rust1", since = "1.0.0")] - pub fn is_ok(&self) -> bool { - match *self { - Ok(_) => true, - Err(_) => false - } + pub const fn is_ok(&self) -> bool { + matches!(*self, Ok(_)) } /// Returns `true` if the result is [`Err`]. @@ -303,9 +302,10 @@ impl Result { /// assert_eq!(x.is_err(), true); /// ``` #[must_use = "if you intended to assert that this is err, consider `.unwrap_err()` instead"] + #[rustc_const_unstable(feature = "const_result", issue = "67520")] #[inline] #[stable(feature = "rust1", since = "1.0.0")] - pub fn is_err(&self) -> bool { + pub const fn is_err(&self) -> bool { !self.is_ok() } @@ -328,10 +328,13 @@ impl Result { #[must_use] #[inline] #[unstable(feature = "option_result_contains", issue = "62358")] - pub fn contains(&self, x: &U) -> bool where U: PartialEq { + pub fn contains(&self, x: &U) -> bool + where + U: PartialEq, + { match self { Ok(y) => x == y, - Err(_) => false + Err(_) => false, } } @@ -354,10 +357,13 @@ impl Result { #[must_use] #[inline] #[unstable(feature = "result_contains_err", issue = "62358")] - pub fn contains_err(&self, f: &F) -> bool where F: PartialEq { + pub fn contains_err(&self, f: &F) -> bool + where + F: PartialEq, + { match self { Ok(_) => false, - Err(e) => f == e + Err(e) => f == e, } } @@ -387,7 +393,7 @@ impl Result { #[stable(feature = "rust1", since = "1.0.0")] pub fn ok(self) -> Option { match self { - Ok(x) => Some(x), + Ok(x) => Some(x), Err(_) => None, } } @@ -414,7 +420,7 @@ impl Result { #[stable(feature = "rust1", since = "1.0.0")] pub fn err(self) -> Option { match self { - Ok(_) => None, + Ok(_) => None, Err(x) => Some(x), } } @@ -440,8 +446,9 @@ impl Result { /// assert_eq!(x.as_ref(), Err(&"Error")); /// ``` #[inline] + #[rustc_const_unstable(feature = "const_result", issue = "67520")] #[stable(feature = "rust1", since = "1.0.0")] - pub fn as_ref(&self) -> Result<&T, &E> { + pub const fn as_ref(&self) -> Result<&T, &E> { match *self { Ok(ref x) => Ok(x), Err(ref x) => Err(x), @@ -507,10 +514,10 @@ impl Result { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - pub fn map U>(self, op: F) -> Result { + pub fn map U>(self, op: F) -> Result { match self { Ok(t) => Ok(op(t)), - Err(e) => Err(e) + Err(e) => Err(e), } } @@ -591,10 +598,10 @@ impl Result { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - pub fn map_err F>(self, op: O) -> Result { + pub fn map_err F>(self, op: O) -> Result { match self { Ok(t) => Ok(t), - Err(e) => Err(op(e)) + Err(e) => Err(op(e)), } } @@ -813,7 +820,7 @@ impl Result { pub fn unwrap_or(self, optb: T) -> T { match self { Ok(t) => t, - Err(_) => optb + Err(_) => optb, } } @@ -838,7 +845,7 @@ impl Result { pub fn unwrap_or_else T>(self, op: F) -> T { match self { Ok(t) => t, - Err(e) => op(e) + Err(e) => op(e), } } } @@ -923,7 +930,6 @@ impl Result<&mut T, E> { } } - impl Result { /// Unwraps a result, yielding the content of an [`Ok`]. /// @@ -949,6 +955,7 @@ impl Result { /// x.unwrap(); // panics with `emergency failure` /// ``` #[inline] + #[track_caller] #[stable(feature = "rust1", since = "1.0.0")] pub fn unwrap(self) -> T { match self { @@ -976,6 +983,7 @@ impl Result { /// x.expect("Testing expect"); // panics with `Testing expect: emergency failure` /// ``` #[inline] + #[track_caller] #[stable(feature = "result_expect", since = "1.4.0")] pub fn expect(self, msg: &str) -> T { match self { @@ -1009,6 +1017,7 @@ impl Result { /// assert_eq!(x.unwrap_err(), "emergency failure"); /// ``` #[inline] + #[track_caller] #[stable(feature = "rust1", since = "1.0.0")] pub fn unwrap_err(self) -> E { match self { @@ -1036,6 +1045,7 @@ impl Result { /// x.expect_err("Testing expect_err"); // panics with `Testing expect_err: 10` /// ``` #[inline] + #[track_caller] #[stable(feature = "result_expect_err", since = "1.17.0")] pub fn expect_err(self, msg: &str) -> E { match self { @@ -1083,13 +1093,51 @@ impl Result { } } +#[unstable(feature = "unwrap_infallible", reason = "newly added", issue = "61695")] +impl> Result { + /// Unwraps a result that can never be an [`Err`], yielding the content of the [`Ok`]. + /// + /// Unlike [`unwrap`], this method is known to never panic on the + /// result types it is implemented for. Therefore, it can be used + /// instead of `unwrap` as a maintainability safeguard that will fail + /// to compile if the error type of the `Result` is later changed + /// to an error that can actually occur. + /// + /// [`Ok`]: enum.Result.html#variant.Ok + /// [`Err`]: enum.Result.html#variant.Err + /// [`unwrap`]: enum.Result.html#method.unwrap + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// # #![feature(never_type)] + /// # #![feature(unwrap_infallible)] + /// + /// fn only_good_news() -> Result { + /// Ok("this is fine".into()) + /// } + /// + /// let s: String = only_good_news().into_ok(); + /// println!("{}", s); + /// ``` + #[inline] + pub fn into_ok(self) -> T { + match self { + Ok(x) => x, + Err(e) => e.into(), + } + } +} + #[unstable(feature = "inner_deref", reason = "newly added", issue = "50264")] impl Result { /// Converts from `Result` (or `&Result`) to `Result<&T::Target, &E>`. /// /// Leaves the original `Result` in-place, creating a new one containing a reference to the /// `Ok` type's `Deref::Target` type. - pub fn as_deref_ok(&self) -> Result<&T::Target, &E> { + pub fn as_deref(&self) -> Result<&T::Target, &E> { self.as_ref().map(|t| t.deref()) } } @@ -1100,31 +1148,18 @@ impl Result { /// /// Leaves the original `Result` in-place, creating a new one containing a reference to the /// `Err` type's `Deref::Target` type. - pub fn as_deref_err(&self) -> Result<&T, &E::Target> - { + pub fn as_deref_err(&self) -> Result<&T, &E::Target> { self.as_ref().map_err(|e| e.deref()) } } -#[unstable(feature = "inner_deref", reason = "newly added", issue = "50264")] -impl Result { - /// Converts from `Result` (or `&Result`) to `Result<&T::Target, &E::Target>`. - /// - /// Leaves the original `Result` in-place, creating a new one containing a reference to both - /// the `Ok` and `Err` types' `Deref::Target` types. - pub fn as_deref(&self) -> Result<&T::Target, &E::Target> - { - self.as_ref().map(|t| t.deref()).map_err(|e| e.deref()) - } -} - #[unstable(feature = "inner_deref", reason = "newly added", issue = "50264")] impl Result { /// Converts from `Result` (or `&mut Result`) to `Result<&mut T::Target, &mut E>`. /// /// Leaves the original `Result` in-place, creating a new one containing a mutable reference to /// the `Ok` type's `Deref::Target` type. - pub fn as_deref_mut_ok(&mut self) -> Result<&mut T::Target, &mut E> { + pub fn as_deref_mut(&mut self) -> Result<&mut T::Target, &mut E> { self.as_mut().map(|t| t.deref_mut()) } } @@ -1135,25 +1170,11 @@ impl Result { /// /// Leaves the original `Result` in-place, creating a new one containing a mutable reference to /// the `Err` type's `Deref::Target` type. - pub fn as_deref_mut_err(&mut self) -> Result<&mut T, &mut E::Target> - { + pub fn as_deref_mut_err(&mut self) -> Result<&mut T, &mut E::Target> { self.as_mut().map_err(|e| e.deref_mut()) } } -#[unstable(feature = "inner_deref", reason = "newly added", issue = "50264")] -impl Result { - /// Converts from `Result` (or `&mut Result`) to - /// `Result<&mut T::Target, &mut E::Target>`. - /// - /// Leaves the original `Result` in-place, creating a new one containing a mutable reference to - /// both the `Ok` and `Err` types' `Deref::Target` types. - pub fn as_deref_mut(&mut self) -> Result<&mut T::Target, &mut E::Target> - { - self.as_mut().map(|t| t.deref_mut()).map_err(|e| e.deref_mut()) - } -} - impl Result, E> { /// Transposes a `Result` of an `Option` into an `Option` of a `Result`. /// @@ -1184,6 +1205,7 @@ impl Result, E> { // This is a separate function to reduce the code size of the methods #[inline(never)] #[cold] +#[track_caller] fn unwrap_failed(msg: &str, error: &dyn fmt::Debug) -> ! { panic!("{}: {:?}", msg, error) } @@ -1212,7 +1234,6 @@ impl Clone for Result { } } - #[stable(feature = "rust1", since = "1.0.0")] impl IntoIterator for Result { type Item = T; @@ -1276,17 +1297,21 @@ impl<'a, T, E> IntoIterator for &'a mut Result { /// [`Result::iter`]: enum.Result.html#method.iter #[derive(Debug)] #[stable(feature = "rust1", since = "1.0.0")] -pub struct Iter<'a, T: 'a> { inner: Option<&'a T> } +pub struct Iter<'a, T: 'a> { + inner: Option<&'a T>, +} #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> Iterator for Iter<'a, T> { type Item = &'a T; #[inline] - fn next(&mut self) -> Option<&'a T> { self.inner.take() } + fn next(&mut self) -> Option<&'a T> { + self.inner.take() + } #[inline] fn size_hint(&self) -> (usize, Option) { - let n = if self.inner.is_some() {1} else {0}; + let n = if self.inner.is_some() { 1 } else { 0 }; (n, Some(n)) } } @@ -1294,7 +1319,9 @@ impl<'a, T> Iterator for Iter<'a, T> { #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> DoubleEndedIterator for Iter<'a, T> { #[inline] - fn next_back(&mut self) -> Option<&'a T> { self.inner.take() } + fn next_back(&mut self) -> Option<&'a T> { + self.inner.take() + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -1309,7 +1336,9 @@ unsafe impl TrustedLen for Iter<'_, A> {} #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Iter<'_, T> { #[inline] - fn clone(&self) -> Self { Iter { inner: self.inner } } + fn clone(&self) -> Self { + Iter { inner: self.inner } + } } /// An iterator over a mutable reference to the [`Ok`] variant of a [`Result`]. @@ -1321,17 +1350,21 @@ impl Clone for Iter<'_, T> { /// [`Result::iter_mut`]: enum.Result.html#method.iter_mut #[derive(Debug)] #[stable(feature = "rust1", since = "1.0.0")] -pub struct IterMut<'a, T: 'a> { inner: Option<&'a mut T> } +pub struct IterMut<'a, T: 'a> { + inner: Option<&'a mut T>, +} #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> Iterator for IterMut<'a, T> { type Item = &'a mut T; #[inline] - fn next(&mut self) -> Option<&'a mut T> { self.inner.take() } + fn next(&mut self) -> Option<&'a mut T> { + self.inner.take() + } #[inline] fn size_hint(&self) -> (usize, Option) { - let n = if self.inner.is_some() {1} else {0}; + let n = if self.inner.is_some() { 1 } else { 0 }; (n, Some(n)) } } @@ -1339,7 +1372,9 @@ impl<'a, T> Iterator for IterMut<'a, T> { #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> DoubleEndedIterator for IterMut<'a, T> { #[inline] - fn next_back(&mut self) -> Option<&'a mut T> { self.inner.take() } + fn next_back(&mut self) -> Option<&'a mut T> { + self.inner.take() + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -1356,7 +1391,7 @@ unsafe impl TrustedLen for IterMut<'_, A> {} /// The iterator yields one value if the result is [`Ok`], otherwise none. /// /// This struct is created by the [`into_iter`] method on -/// [`Result`][`Result`] (provided by the [`IntoIterator`] trait). +/// [`Result`] (provided by the [`IntoIterator`] trait). /// /// [`Ok`]: enum.Result.html#variant.Ok /// [`Result`]: enum.Result.html @@ -1364,17 +1399,21 @@ unsafe impl TrustedLen for IterMut<'_, A> {} /// [`IntoIterator`]: ../iter/trait.IntoIterator.html #[derive(Clone, Debug)] #[stable(feature = "rust1", since = "1.0.0")] -pub struct IntoIter { inner: Option } +pub struct IntoIter { + inner: Option, +} #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for IntoIter { type Item = T; #[inline] - fn next(&mut self) -> Option { self.inner.take() } + fn next(&mut self) -> Option { + self.inner.take() + } #[inline] fn size_hint(&self) -> (usize, Option) { - let n = if self.inner.is_some() {1} else {0}; + let n = if self.inner.is_some() { 1 } else { 0 }; (n, Some(n)) } } @@ -1382,7 +1421,9 @@ impl Iterator for IntoIter { #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for IntoIter { #[inline] - fn next_back(&mut self) -> Option { self.inner.take() } + fn next_back(&mut self) -> Option { + self.inner.take() + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -1443,7 +1484,7 @@ impl> FromIterator> for Result { /// Since the third element caused an underflow, no further elements were taken, /// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16. #[inline] - fn from_iter>>(iter: I) -> Result { + fn from_iter>>(iter: I) -> Result { // FIXME(#11084): This could be replaced with Iterator::scan when this // performance bug is closed. @@ -1452,7 +1493,7 @@ impl> FromIterator> for Result { } #[unstable(feature = "try_trait", issue = "42327")] -impl ops::Try for Result { +impl ops::Try for Result { type Ok = T; type Error = E; diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs index a8e500d256..9b4d201573 100644 --- a/src/libcore/slice/mod.rs +++ b/src/libcore/slice/mod.rs @@ -23,23 +23,26 @@ // * The `raw` and `bytes` submodules. // * Boilerplate trait implementations. -use crate::cmp::Ordering::{self, Less, Equal, Greater}; use crate::cmp; +use crate::cmp::Ordering::{self, Equal, Greater, Less}; use crate::fmt; -use crate::intrinsics::{assume, exact_div, unchecked_sub, is_aligned_and_not_null}; +use crate::intrinsics::{assume, exact_div, is_aligned_and_not_null, unchecked_sub}; use crate::isize; use crate::iter::*; -use crate::ops::{FnMut, Range, self}; +use crate::marker::{self, Copy, Send, Sized, Sync}; +use crate::mem; +use crate::ops::{self, FnMut, Range}; use crate::option::Option; use crate::option::Option::{None, Some}; +use crate::ptr::{self, NonNull}; use crate::result::Result; -use crate::result::Result::{Ok, Err}; -use crate::ptr; -use crate::mem; -use crate::marker::{Copy, Send, Sync, Sized, self}; +use crate::result::Result::{Err, Ok}; -#[unstable(feature = "slice_internals", issue = "0", - reason = "exposed from core to be reused in std; use the memchr crate")] +#[unstable( + feature = "slice_internals", + issue = "none", + reason = "exposed from core to be reused in std; use the memchr crate" +)] /// Pure rust memchr implementation, taken from rust-memchr pub mod memchr; @@ -62,15 +65,13 @@ impl [T] { /// assert_eq!(a.len(), 3); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_slice_len", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_slice_len", since = "1.32.0")] #[inline] // SAFETY: const sound because we transmute out the length field as a usize (which it must be) #[allow(unused_attributes)] #[allow_internal_unstable(const_fn_union)] pub const fn len(&self) -> usize { - unsafe { - crate::ptr::Repr { rust: self }.raw.len - } + unsafe { crate::ptr::Repr { rust: self }.raw.len } } /// Returns `true` if the slice has a length of 0. @@ -82,10 +83,7 @@ impl [T] { /// assert!(!a.is_empty()); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_slice_is_empty", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_slice_is_empty", since = "1.32.0")] #[inline] pub const fn is_empty(&self) -> bool { self.len() == 0 @@ -161,7 +159,9 @@ impl [T] { #[stable(feature = "slice_splits", since = "1.5.0")] #[inline] pub fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])> { - if self.is_empty() { None } else { + if self.is_empty() { + None + } else { let split = self.split_at_mut(1); Some((&mut split.0[0], split.1)) } @@ -204,11 +204,12 @@ impl [T] { #[inline] pub fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])> { let len = self.len(); - if len == 0 { None } else { + if len == 0 { + None + } else { let split = self.split_at_mut(len - 1); Some((&mut split.1[0], split.0)) } - } /// Returns the last element of the slice, or `None` if it is empty. @@ -268,7 +269,8 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn get(&self, index: I) -> Option<&I::Output> - where I: SliceIndex + where + I: SliceIndex, { index.get(self) } @@ -291,7 +293,8 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn get_mut(&mut self, index: I) -> Option<&mut I::Output> - where I: SliceIndex + where + I: SliceIndex, { index.get_mut(self) } @@ -319,7 +322,8 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub unsafe fn get_unchecked(&self, index: I) -> &I::Output - where I: SliceIndex + where + I: SliceIndex, { index.get_unchecked(self) } @@ -349,7 +353,8 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub unsafe fn get_unchecked_mut(&mut self, index: I) -> &mut I::Output - where I: SliceIndex + where + I: SliceIndex, { index.get_unchecked_mut(self) } @@ -381,10 +386,7 @@ impl [T] { /// /// [`as_mut_ptr`]: #method.as_mut_ptr #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_slice_as_ptr", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_slice_as_ptr", since = "1.32.0")] #[inline] pub const fn as_ptr(&self) -> *const T { self as *const [T] as *const T @@ -555,8 +557,7 @@ impl [T] { // will be, when the length is odd -- so there's no way of emitting // pre- and postludes to use fully-aligned SIMD in the middle.) - let fast_unaligned = - cfg!(any(target_arch = "x86", target_arch = "x86_64")); + let fast_unaligned = cfg!(any(target_arch = "x86", target_arch = "x86_64")); if fast_unaligned && mem::size_of::() == 1 { // Use the llvm.bswap intrinsic to reverse u8s in a usize @@ -627,11 +628,7 @@ impl [T] { ptr.add(self.len()) }; - Iter { - ptr, - end, - _marker: marker::PhantomData - } + Iter { ptr: NonNull::new_unchecked(ptr as *mut T), end, _marker: marker::PhantomData } } } @@ -659,11 +656,7 @@ impl [T] { ptr.add(self.len()) }; - IterMut { - ptr, - end, - _marker: marker::PhantomData - } + IterMut { ptr: NonNull::new_unchecked(ptr), end, _marker: marker::PhantomData } } } @@ -1087,8 +1080,7 @@ impl [T] { unsafe { assert!(mid <= len); - (from_raw_parts_mut(ptr, mid), - from_raw_parts_mut(ptr.add(mid), len - mid)) + (from_raw_parts_mut(ptr, mid), from_raw_parts_mut(ptr.add(mid), len - mid)) } } @@ -1135,13 +1127,10 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn split(&self, pred: F) -> Split<'_, T, F> - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { - Split { - v: self, - pred, - finished: false - } + Split { v: self, pred, finished: false } } /// Returns an iterator over mutable subslices separated by elements that @@ -1160,7 +1149,8 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn split_mut(&mut self, pred: F) -> SplitMut<'_, T, F> - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { SplitMut { v: self, pred, finished: false } } @@ -1195,7 +1185,8 @@ impl [T] { #[stable(feature = "slice_rsplit", since = "1.27.0")] #[inline] pub fn rsplit(&self, pred: F) -> RSplit<'_, T, F> - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { RSplit { inner: self.split(pred) } } @@ -1220,7 +1211,8 @@ impl [T] { #[stable(feature = "slice_rsplit", since = "1.27.0")] #[inline] pub fn rsplit_mut(&mut self, pred: F) -> RSplitMut<'_, T, F> - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { RSplitMut { inner: self.split_mut(pred) } } @@ -1247,14 +1239,10 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn splitn(&self, n: usize, pred: F) -> SplitN<'_, T, F> - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { - SplitN { - inner: GenericSplitN { - iter: self.split(pred), - count: n - } - } + SplitN { inner: GenericSplitN { iter: self.split(pred), count: n } } } /// Returns an iterator over subslices separated by elements that match @@ -1277,14 +1265,10 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn splitn_mut(&mut self, n: usize, pred: F) -> SplitNMut<'_, T, F> - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { - SplitNMut { - inner: GenericSplitN { - iter: self.split_mut(pred), - count: n - } - } + SplitNMut { inner: GenericSplitN { iter: self.split_mut(pred), count: n } } } /// Returns an iterator over subslices separated by elements that match @@ -1310,14 +1294,10 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn rsplitn(&self, n: usize, pred: F) -> RSplitN<'_, T, F> - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { - RSplitN { - inner: GenericSplitN { - iter: self.rsplit(pred), - count: n - } - } + RSplitN { inner: GenericSplitN { iter: self.rsplit(pred), count: n } } } /// Returns an iterator over subslices separated by elements that match @@ -1341,14 +1321,10 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn rsplitn_mut(&mut self, n: usize, pred: F) -> RSplitNMut<'_, T, F> - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { - RSplitNMut { - inner: GenericSplitN { - iter: self.rsplit_mut(pred), - count: n - } - } + RSplitNMut { inner: GenericSplitN { iter: self.rsplit_mut(pred), count: n } } } /// Returns `true` if the slice contains an element with the given value. @@ -1371,7 +1347,8 @@ impl [T] { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn contains(&self, x: &T) -> bool - where T: PartialEq + where + T: PartialEq, { x.slice_contains(self) } @@ -1398,7 +1375,8 @@ impl [T] { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn starts_with(&self, needle: &[T]) -> bool - where T: PartialEq + where + T: PartialEq, { let n = needle.len(); self.len() >= n && needle == &self[..n] @@ -1426,10 +1404,11 @@ impl [T] { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn ends_with(&self, needle: &[T]) -> bool - where T: PartialEq + where + T: PartialEq, { let (m, n) = (self.len(), needle.len()); - m >= n && needle == &self[m-n..] + m >= n && needle == &self[m - n..] } /// Binary searches this sorted slice for a given element. @@ -1468,7 +1447,8 @@ impl [T] { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn binary_search(&self, x: &T) -> Result - where T: Ord + where + T: Ord, { self.binary_search_by(|p| p.cmp(x)) } @@ -1508,7 +1488,8 @@ impl [T] { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn binary_search_by<'a, F>(&'a self, mut f: F) -> Result - where F: FnMut(&'a T) -> Ordering + where + F: FnMut(&'a T) -> Ordering, { let s = self; let mut size = s.len(); @@ -1529,7 +1510,6 @@ impl [T] { // base is always in [0, size) because base <= mid. let cmp = f(unsafe { s.get_unchecked(base) }); if cmp == Equal { Ok(base) } else { Err(base + (cmp == Less) as usize) } - } /// Binary searches this sorted slice with a key extraction function. @@ -1566,8 +1546,9 @@ impl [T] { #[stable(feature = "slice_binary_search_by_key", since = "1.10.0")] #[inline] pub fn binary_search_by_key<'a, B, F>(&'a self, b: &B, mut f: F) -> Result - where F: FnMut(&'a T) -> B, - B: Ord + where + F: FnMut(&'a T) -> B, + B: Ord, { self.binary_search_by(|k| f(k).cmp(b)) } @@ -1601,7 +1582,8 @@ impl [T] { #[stable(feature = "sort_unstable", since = "1.20.0")] #[inline] pub fn sort_unstable(&mut self) - where T: Ord + where + T: Ord, { sort::quicksort(self, |a, b| a.lt(b)); } @@ -1655,7 +1637,8 @@ impl [T] { #[stable(feature = "sort_unstable", since = "1.20.0")] #[inline] pub fn sort_unstable_by(&mut self, mut compare: F) - where F: FnMut(&T, &T) -> Ordering + where + F: FnMut(&T, &T) -> Ordering, { sort::quicksort(self, |a, b| compare(a, b) == Ordering::Less); } @@ -1692,7 +1675,9 @@ impl [T] { #[stable(feature = "sort_unstable", since = "1.20.0")] #[inline] pub fn sort_unstable_by_key(&mut self, mut f: F) - where F: FnMut(&T) -> K, K: Ord + where + F: FnMut(&T) -> K, + K: Ord, { sort::quicksort(self, |a, b| f(a).lt(&f(b))); } @@ -1738,7 +1723,8 @@ impl [T] { #[unstable(feature = "slice_partition_at_index", issue = "55300")] #[inline] pub fn partition_at_index(&mut self, index: usize) -> (&mut [T], &mut T, &mut [T]) - where T: Ord + where + T: Ord, { let mut f = |a: &T, b: &T| a.lt(b); sort::partition_at_index(self, index, &mut f) @@ -1786,9 +1772,13 @@ impl [T] { /// ``` #[unstable(feature = "slice_partition_at_index", issue = "55300")] #[inline] - pub fn partition_at_index_by(&mut self, index: usize, mut compare: F) - -> (&mut [T], &mut T, &mut [T]) - where F: FnMut(&T, &T) -> Ordering + pub fn partition_at_index_by( + &mut self, + index: usize, + mut compare: F, + ) -> (&mut [T], &mut T, &mut [T]) + where + F: FnMut(&T, &T) -> Ordering, { let mut f = |a: &T, b: &T| compare(a, b) == Less; sort::partition_at_index(self, index, &mut f) @@ -1836,9 +1826,14 @@ impl [T] { /// ``` #[unstable(feature = "slice_partition_at_index", issue = "55300")] #[inline] - pub fn partition_at_index_by_key(&mut self, index: usize, mut f: F) - -> (&mut [T], &mut T, &mut [T]) - where F: FnMut(&T) -> K, K: Ord + pub fn partition_at_index_by_key( + &mut self, + index: usize, + mut f: F, + ) -> (&mut [T], &mut T, &mut [T]) + where + F: FnMut(&T) -> K, + K: Ord, { let mut g = |a: &T, b: &T| f(a).lt(&f(b)); sort::partition_at_index(self, index, &mut g) @@ -1867,7 +1862,8 @@ impl [T] { #[unstable(feature = "slice_partition_dedup", issue = "54279")] #[inline] pub fn partition_dedup(&mut self) -> (&mut [T], &mut [T]) - where T: PartialEq + where + T: PartialEq, { self.partition_dedup_by(|a, b| a == b) } @@ -1900,7 +1896,8 @@ impl [T] { #[unstable(feature = "slice_partition_dedup", issue = "54279")] #[inline] pub fn partition_dedup_by(&mut self, mut same_bucket: F) -> (&mut [T], &mut [T]) - where F: FnMut(&mut T, &mut T) -> bool + where + F: FnMut(&mut T, &mut T) -> bool, { // Although we have a mutable reference to `self`, we cannot make // *arbitrary* changes. The `same_bucket` calls could panic, so we @@ -1961,7 +1958,7 @@ impl [T] { let len = self.len(); if len <= 1 { - return (self, &mut []) + return (self, &mut []); } let ptr = self.as_mut_ptr(); @@ -2010,8 +2007,9 @@ impl [T] { #[unstable(feature = "slice_partition_dedup", issue = "54279")] #[inline] pub fn partition_dedup_by_key(&mut self, mut key: F) -> (&mut [T], &mut [T]) - where F: FnMut(&mut T) -> K, - K: PartialEq, + where + F: FnMut(&mut T) -> K, + K: PartialEq, { self.partition_dedup_by(|a, b| key(a) == key(b)) } @@ -2154,9 +2152,11 @@ impl [T] { /// [`copy_from_slice`]: #method.copy_from_slice /// [`split_at_mut`]: #method.split_at_mut #[stable(feature = "clone_from_slice", since = "1.7.0")] - pub fn clone_from_slice(&mut self, src: &[T]) where T: Clone { - assert!(self.len() == src.len(), - "destination and source slices have different lengths"); + pub fn clone_from_slice(&mut self, src: &[T]) + where + T: Clone, + { + assert!(self.len() == src.len(), "destination and source slices have different lengths"); // NOTE: We need to explicitly slice them to the same length // for bounds checking to be elided, and the optimizer will // generate memcpy for simple cases (for example T = u8). @@ -2165,7 +2165,6 @@ impl [T] { for i in 0..len { self[i].clone_from(&src[i]); } - } /// Copies all elements from `src` into `self`, using a memcpy. @@ -2223,12 +2222,13 @@ impl [T] { /// [`clone_from_slice`]: #method.clone_from_slice /// [`split_at_mut`]: #method.split_at_mut #[stable(feature = "copy_from_slice", since = "1.9.0")] - pub fn copy_from_slice(&mut self, src: &[T]) where T: Copy { - assert_eq!(self.len(), src.len(), - "destination and source slices have different lengths"); + pub fn copy_from_slice(&mut self, src: &[T]) + where + T: Copy, + { + assert_eq!(self.len(), src.len(), "destination and source slices have different lengths"); unsafe { - ptr::copy_nonoverlapping( - src.as_ptr(), self.as_mut_ptr(), self.len()); + ptr::copy_nonoverlapping(src.as_ptr(), self.as_mut_ptr(), self.len()); } } @@ -2263,15 +2263,15 @@ impl [T] { { let src_start = match src.start_bound() { ops::Bound::Included(&n) => n, - ops::Bound::Excluded(&n) => n - .checked_add(1) - .unwrap_or_else(|| slice_index_overflow_fail()), + ops::Bound::Excluded(&n) => { + n.checked_add(1).unwrap_or_else(|| slice_index_overflow_fail()) + } ops::Bound::Unbounded => 0, }; let src_end = match src.end_bound() { - ops::Bound::Included(&n) => n - .checked_add(1) - .unwrap_or_else(|| slice_index_overflow_fail()), + ops::Bound::Included(&n) => { + n.checked_add(1).unwrap_or_else(|| slice_index_overflow_fail()) + } ops::Bound::Excluded(&n) => n, ops::Bound::Unbounded => self.len(), }; @@ -2280,11 +2280,7 @@ impl [T] { let count = src_end - src_start; assert!(dest <= self.len() - count, "dest is out of bounds"); unsafe { - ptr::copy( - self.as_ptr().add(src_start), - self.as_mut_ptr().add(dest), - count, - ); + ptr::copy(self.as_ptr().add(src_start), self.as_mut_ptr().add(dest), count); } } @@ -2337,11 +2333,9 @@ impl [T] { /// [`split_at_mut`]: #method.split_at_mut #[stable(feature = "swap_with_slice", since = "1.27.0")] pub fn swap_with_slice(&mut self, other: &mut [T]) { - assert!(self.len() == other.len(), - "destination and source slices have different lengths"); + assert!(self.len() == other.len(), "destination and source slices have different lengths"); unsafe { - ptr::swap_nonoverlapping( - self.as_mut_ptr(), other.as_mut_ptr(), self.len()); + ptr::swap_nonoverlapping(self.as_mut_ptr(), other.as_mut_ptr(), self.len()); } } @@ -2372,8 +2366,12 @@ impl [T] { // We should still make this `const fn` (and revert to recursive algorithm if we do) // because relying on llvm to consteval all this is… well, it makes me uncomfortable. let (ctz_a, mut ctz_b) = unsafe { - if a == 0 { return b; } - if b == 0 { return a; } + if a == 0 { + return b; + } + if b == 0 { + return a; + } (intrinsics::cttz_nonzero(a), intrinsics::cttz_nonzero(b)) }; let k = ctz_a.min(ctz_b); @@ -2454,9 +2452,11 @@ impl [T] { let (left, rest) = self.split_at(offset); // now `rest` is definitely aligned, so `from_raw_parts_mut` below is okay let (us_len, ts_len) = rest.align_to_offsets::(); - (left, - from_raw_parts(rest.as_ptr() as *const U, us_len), - from_raw_parts(rest.as_ptr().add(rest.len() - ts_len), ts_len)) + ( + left, + from_raw_parts(rest.as_ptr() as *const U, us_len), + from_raw_parts(rest.as_ptr().add(rest.len() - ts_len), ts_len), + ) } } @@ -2509,9 +2509,11 @@ impl [T] { // now `rest` is definitely aligned, so `from_raw_parts_mut` below is okay let (us_len, ts_len) = rest.align_to_offsets::(); let mut_ptr = rest.as_mut_ptr(); - (left, - from_raw_parts_mut(mut_ptr as *mut U, us_len), - from_raw_parts_mut(mut_ptr.add(rest.len() - ts_len), ts_len)) + ( + left, + from_raw_parts_mut(mut_ptr as *mut U, us_len), + from_raw_parts_mut(mut_ptr.add(rest.len() - ts_len), ts_len), + ) } } @@ -2555,7 +2557,7 @@ impl [T] { #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")] pub fn is_sorted_by(&self, mut compare: F) -> bool where - F: FnMut(&T, &T) -> Option + F: FnMut(&T, &T) -> Option, { self.iter().is_sorted_by(|a, b| compare(*a, *b)) } @@ -2581,7 +2583,7 @@ impl [T] { pub fn is_sorted_by_key(&self, f: F) -> bool where F: FnMut(&T) -> K, - K: PartialOrd + K: PartialOrd, { self.iter().is_sorted_by_key(f) } @@ -2604,10 +2606,7 @@ impl [u8] { #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] #[inline] pub fn eq_ignore_ascii_case(&self, other: &[u8]) -> bool { - self.len() == other.len() && - self.iter().zip(other).all(|(a, b)| { - a.eq_ignore_ascii_case(b) - }) + self.len() == other.len() && self.iter().zip(other).all(|(a, b)| a.eq_ignore_ascii_case(b)) } /// Converts this slice to its ASCII upper case equivalent in-place. @@ -2643,12 +2642,12 @@ impl [u8] { byte.make_ascii_lowercase(); } } - } #[stable(feature = "rust1", since = "1.0.0")] impl ops::Index for [T] - where I: SliceIndex<[T]> +where + I: SliceIndex<[T]>, { type Output = I::Output; @@ -2660,7 +2659,8 @@ impl ops::Index for [T] #[stable(feature = "rust1", since = "1.0.0")] impl ops::IndexMut for [T] - where I: SliceIndex<[T]> +where + I: SliceIndex<[T]>, { #[inline] fn index_mut(&mut self, index: I) -> &mut I::Output { @@ -2710,17 +2710,14 @@ mod private_slice_index { /// A helper trait used for indexing operations. #[stable(feature = "slice_get_slice", since = "1.28.0")] #[rustc_on_unimplemented( + on(T = "str", label = "string indices are ranges of `usize`",), on( - T = "str", - label = "string indices are ranges of `usize`", - ), - on( - all(any(T = "str", T = "&str", T = "std::string::String"), _Self="{integer}"), - note="you can use `.chars().nth()` or `.bytes().nth()` + all(any(T = "str", T = "&str", T = "std::string::String"), _Self = "{integer}"), + note = "you can use `.chars().nth()` or `.bytes().nth()` see chapter in The Book " ), message = "the type `{T}` cannot be indexed by `{Self}`", - label = "slice indices are of type `usize` or ranges of `usize`", + label = "slice indices are of type `usize` or ranges of `usize`" )] pub trait SliceIndex: private_slice_index::Sealed { /// The output type returned by methods. @@ -2729,12 +2726,12 @@ pub trait SliceIndex: private_slice_index::Sealed { /// Returns a shared reference to the output at this location, if in /// bounds. - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] fn get(self, slice: &T) -> Option<&Self::Output>; /// Returns a mutable reference to the output at this location, if in /// bounds. - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] fn get_mut(self, slice: &mut T) -> Option<&mut Self::Output>; /// Returns a shared reference to the output at this location, without @@ -2742,7 +2739,7 @@ pub trait SliceIndex: private_slice_index::Sealed { /// Calling this method with an out-of-bounds index is *[undefined behavior]* /// even if the resulting reference is not used. /// [undefined behavior]: ../../reference/behavior-considered-undefined.html - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] unsafe fn get_unchecked(self, slice: &T) -> &Self::Output; /// Returns a mutable reference to the output at this location, without @@ -2750,17 +2747,17 @@ pub trait SliceIndex: private_slice_index::Sealed { /// Calling this method with an out-of-bounds index is *[undefined behavior]* /// even if the resulting reference is not used. /// [undefined behavior]: ../../reference/behavior-considered-undefined.html - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] unsafe fn get_unchecked_mut(self, slice: &mut T) -> &mut Self::Output; /// Returns a shared reference to the output at this location, panicking /// if out of bounds. - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] fn index(self, slice: &T) -> &Self::Output; /// Returns a mutable reference to the output at this location, panicking /// if out of bounds. - #[unstable(feature = "slice_index_methods", issue = "0")] + #[unstable(feature = "slice_index_methods", issue = "none")] fn index_mut(self, slice: &mut T) -> &mut Self::Output; } @@ -2770,24 +2767,12 @@ impl SliceIndex<[T]> for usize { #[inline] fn get(self, slice: &[T]) -> Option<&T> { - if self < slice.len() { - unsafe { - Some(self.get_unchecked(slice)) - } - } else { - None - } + if self < slice.len() { unsafe { Some(self.get_unchecked(slice)) } } else { None } } #[inline] fn get_mut(self, slice: &mut [T]) -> Option<&mut T> { - if self < slice.len() { - unsafe { - Some(self.get_unchecked_mut(slice)) - } - } else { - None - } + if self < slice.len() { unsafe { Some(self.get_unchecked_mut(slice)) } } else { None } } #[inline] @@ -2814,7 +2799,7 @@ impl SliceIndex<[T]> for usize { } #[stable(feature = "slice_get_slice_impls", since = "1.15.0")] -impl SliceIndex<[T]> for ops::Range { +impl SliceIndex<[T]> for ops::Range { type Output = [T]; #[inline] @@ -2822,9 +2807,7 @@ impl SliceIndex<[T]> for ops::Range { if self.start > self.end || self.end > slice.len() { None } else { - unsafe { - Some(self.get_unchecked(slice)) - } + unsafe { Some(self.get_unchecked(slice)) } } } @@ -2833,9 +2816,7 @@ impl SliceIndex<[T]> for ops::Range { if self.start > self.end || self.end > slice.len() { None } else { - unsafe { - Some(self.get_unchecked_mut(slice)) - } + unsafe { Some(self.get_unchecked_mut(slice)) } } } @@ -2856,9 +2837,7 @@ impl SliceIndex<[T]> for ops::Range { } else if self.end > slice.len() { slice_index_len_fail(self.end, slice.len()); } - unsafe { - self.get_unchecked(slice) - } + unsafe { self.get_unchecked(slice) } } #[inline] @@ -2868,9 +2847,7 @@ impl SliceIndex<[T]> for ops::Range { } else if self.end > slice.len() { slice_index_len_fail(self.end, slice.len()); } - unsafe { - self.get_unchecked_mut(slice) - } + unsafe { self.get_unchecked_mut(slice) } } } @@ -2979,21 +2956,26 @@ impl SliceIndex<[T]> for ops::RangeFull { } } - #[stable(feature = "inclusive_range", since = "1.26.0")] impl SliceIndex<[T]> for ops::RangeInclusive { type Output = [T]; #[inline] fn get(self, slice: &[T]) -> Option<&[T]> { - if *self.end() == usize::max_value() { None } - else { (*self.start()..self.end() + 1).get(slice) } + if *self.end() == usize::max_value() { + None + } else { + (*self.start()..self.end() + 1).get(slice) + } } #[inline] fn get_mut(self, slice: &mut [T]) -> Option<&mut [T]> { - if *self.end() == usize::max_value() { None } - else { (*self.start()..self.end() + 1).get_mut(slice) } + if *self.end() == usize::max_value() { + None + } else { + (*self.start()..self.end() + 1).get_mut(slice) + } } #[inline] @@ -3008,13 +2990,17 @@ impl SliceIndex<[T]> for ops::RangeInclusive { #[inline] fn index(self, slice: &[T]) -> &[T] { - if *self.end() == usize::max_value() { slice_index_overflow_fail(); } + if *self.end() == usize::max_value() { + slice_index_overflow_fail(); + } (*self.start()..self.end() + 1).index(slice) } #[inline] fn index_mut(self, slice: &mut [T]) -> &mut [T] { - if *self.end() == usize::max_value() { slice_index_overflow_fail(); } + if *self.end() == usize::max_value() { + slice_index_overflow_fail(); + } (*self.start()..self.end() + 1).index_mut(slice) } } @@ -3061,13 +3047,17 @@ impl SliceIndex<[T]> for ops::RangeToInclusive { #[stable(feature = "rust1", since = "1.0.0")] impl Default for &[T] { /// Creates an empty slice. - fn default() -> Self { &[] } + fn default() -> Self { + &[] + } } #[stable(feature = "mut_slice_default", since = "1.5.0")] impl Default for &mut [T] { /// Creates a mutable empty slice. - fn default() -> Self { &mut [] } + fn default() -> Self { + &mut [] + } } // @@ -3104,7 +3094,9 @@ fn size_from_ptr(_: *const T) -> usize { macro_rules! is_empty { // The way we encode the length of a ZST iterator, this works both for ZST // and non-ZST. - ($self: ident) => {$self.ptr == $self.end} + ($self: ident) => { + $self.ptr.as_ptr() as *const T == $self.end + }; } // To get rid of some bounds checks (see `position`), we compute the length in a somewhat // unexpected way. (Tested by `codegen/slice-position-bounds-check`.) @@ -3113,17 +3105,17 @@ macro_rules! len { #![allow(unused_unsafe)] // we're sometimes used within an unsafe block let start = $self.ptr; - let size = size_from_ptr(start); + let size = size_from_ptr(start.as_ptr()); if size == 0 { // This _cannot_ use `unchecked_sub` because we depend on wrapping // to represent the length of long ZST slice iterators. - ($self.end as usize).wrapping_sub(start as usize) + ($self.end as usize).wrapping_sub(start.as_ptr() as usize) } else { // We know that `start <= end`, so can do better than `offset_from`, // which needs to deal in signed. By setting appropriate flags here // we can tell LLVM this, which helps it remove bounds checks. // SAFETY: By the type invariant, `start <= end` - let diff = unsafe { unchecked_sub($self.end as usize, start as usize) }; + let diff = unsafe { unchecked_sub($self.end as usize, start.as_ptr() as usize) }; // By also telling LLVM that the pointers are apart by an exact // multiple of the type size, it can optimize `len() == 0` down to // `start == end` instead of `(end - start) < size`. @@ -3131,7 +3123,7 @@ macro_rules! len { // distance between them must be a multiple of pointee size unsafe { exact_div(diff, size) } } - }} + }}; } // The shared definition of the `Iter` and `IterMut` iterators @@ -3169,7 +3161,7 @@ macro_rules! iterator { // Helper function for creating a slice from the iterator. #[inline(always)] fn make_slice(&self) -> &'a [T] { - unsafe { from_raw_parts(self.ptr, len!(self)) } + unsafe { from_raw_parts(self.ptr.as_ptr(), len!(self)) } } // Helper function for moving the start of the iterator forwards by `offset` elements, @@ -3179,10 +3171,10 @@ macro_rules! iterator { unsafe fn post_inc_start(&mut self, offset: isize) -> * $raw_mut T { if mem::size_of::() == 0 { zst_shrink!(self, offset); - self.ptr + self.ptr.as_ptr() } else { - let old = self.ptr; - self.ptr = self.ptr.offset(offset); + let old = self.ptr.as_ptr(); + self.ptr = NonNull::new_unchecked(self.ptr.as_ptr().offset(offset)); old } } @@ -3194,7 +3186,7 @@ macro_rules! iterator { unsafe fn pre_dec_end(&mut self, offset: isize) -> * $raw_mut T { if mem::size_of::() == 0 { zst_shrink!(self, offset); - self.ptr + self.ptr.as_ptr() } else { self.end = self.end.offset(-offset); self.end @@ -3223,7 +3215,7 @@ macro_rules! iterator { fn next(&mut self) -> Option<$elem> { // could be implemented with slices, but this avoids bounds checks unsafe { - assume(!self.ptr.is_null()); + assume(!self.ptr.as_ptr().is_null()); if mem::size_of::() != 0 { assume(!self.end.is_null()); } @@ -3253,9 +3245,12 @@ macro_rules! iterator { if mem::size_of::() == 0 { // We have to do it this way as `ptr` may never be 0, but `end` // could be (due to wrapping). - self.end = self.ptr; + self.end = self.ptr.as_ptr(); } else { - self.ptr = self.end; + unsafe { + // End can't be 0 if T isn't ZST because ptr isn't 0 and end >= ptr + self.ptr = NonNull::new_unchecked(self.end as *mut T); + } } return None; } @@ -3316,7 +3311,7 @@ macro_rules! iterator { fn next_back(&mut self) -> Option<$elem> { // could be implemented with slices, but this avoids bounds checks unsafe { - assume(!self.ptr.is_null()); + assume(!self.ptr.as_ptr().is_null()); if mem::size_of::() != 0 { assume(!self.end.is_null()); } @@ -3332,7 +3327,7 @@ macro_rules! iterator { fn nth_back(&mut self, n: usize) -> Option<$elem> { if n >= len!(self) { // This iterator is now empty. - self.end = self.ptr; + self.end = self.ptr.as_ptr(); return None; } // We are in bounds. `pre_dec_end` does the right thing even for ZSTs. @@ -3373,19 +3368,17 @@ macro_rules! iterator { /// [slices]: ../../std/primitive.slice.html #[stable(feature = "rust1", since = "1.0.0")] pub struct Iter<'a, T: 'a> { - ptr: *const T, + ptr: NonNull, end: *const T, // If T is a ZST, this is actually ptr+len. This encoding is picked so that - // ptr == end is a quick test for the Iterator being empty, that works - // for both ZST and non-ZST. + // ptr == end is a quick test for the Iterator being empty, that works + // for both ZST and non-ZST. _marker: marker::PhantomData<&'a T>, } #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for Iter<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("Iter") - .field(&self.as_slice()) - .finish() + f.debug_tuple("Iter").field(&self.as_slice()).finish() } } @@ -3425,7 +3418,7 @@ impl<'a, T> Iter<'a, T> { } } -iterator!{struct Iter -> *const T, &'a T, const, {/* no mut */}, { +iterator! {struct Iter -> *const T, &'a T, const, {/* no mut */}, { fn is_sorted_by(self, mut compare: F) -> bool where Self: Sized, @@ -3439,7 +3432,9 @@ iterator!{struct Iter -> *const T, &'a T, const, {/* no mut */}, { #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Iter<'_, T> { - fn clone(&self) -> Self { Iter { ptr: self.ptr, end: self.end, _marker: self._marker } } + fn clone(&self) -> Self { + Iter { ptr: self.ptr, end: self.end, _marker: self._marker } + } } #[stable(feature = "slice_iter_as_ref", since = "1.13.0")] @@ -3475,19 +3470,17 @@ impl AsRef<[T]> for Iter<'_, T> { /// [slices]: ../../std/primitive.slice.html #[stable(feature = "rust1", since = "1.0.0")] pub struct IterMut<'a, T: 'a> { - ptr: *mut T, + ptr: NonNull, end: *mut T, // If T is a ZST, this is actually ptr+len. This encoding is picked so that - // ptr == end is a quick test for the Iterator being empty, that works - // for both ZST and non-ZST. + // ptr == end is a quick test for the Iterator being empty, that works + // for both ZST and non-ZST. _marker: marker::PhantomData<&'a mut T>, } #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for IterMut<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("IterMut") - .field(&self.make_slice()) - .finish() + f.debug_tuple("IterMut").field(&self.make_slice()).finish() } } @@ -3532,7 +3525,7 @@ impl<'a, T> IterMut<'a, T> { /// ``` #[stable(feature = "iter_to_slice", since = "1.4.0")] pub fn into_slice(self) -> &'a mut [T] { - unsafe { from_raw_parts_mut(self.ptr, len!(self)) } + unsafe { from_raw_parts_mut(self.ptr.as_ptr(), len!(self)) } } /// Views the underlying data as a subslice of the original data. @@ -3564,7 +3557,7 @@ impl<'a, T> IterMut<'a, T> { } } -iterator!{struct IterMut -> *mut T, &'a mut T, mut, {mut}, {}} +iterator! {struct IterMut -> *mut T, &'a mut T, mut, {mut}, {}} /// An internal abstraction over the splitting iterators, so that /// splitn, splitn_mut etc can be implemented once. @@ -3583,41 +3576,48 @@ trait SplitIter: DoubleEndedIterator { /// [`split`]: ../../std/primitive.slice.html#method.split /// [slices]: ../../std/primitive.slice.html #[stable(feature = "rust1", since = "1.0.0")] -pub struct Split<'a, T:'a, P> where P: FnMut(&T) -> bool { +pub struct Split<'a, T: 'a, P> +where + P: FnMut(&T) -> bool, +{ v: &'a [T], pred: P, - finished: bool + finished: bool, } #[stable(feature = "core_impl_debug", since = "1.9.0")] -impl fmt::Debug for Split<'_, T, P> where P: FnMut(&T) -> bool { +impl fmt::Debug for Split<'_, T, P> +where + P: FnMut(&T) -> bool, +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Split") - .field("v", &self.v) - .field("finished", &self.finished) - .finish() + f.debug_struct("Split").field("v", &self.v).field("finished", &self.finished).finish() } } // FIXME(#26925) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] -impl Clone for Split<'_, T, P> where P: Clone + FnMut(&T) -> bool { +impl Clone for Split<'_, T, P> +where + P: Clone + FnMut(&T) -> bool, +{ fn clone(&self) -> Self { - Split { - v: self.v, - pred: self.pred.clone(), - finished: self.finished, - } + Split { v: self.v, pred: self.pred.clone(), finished: self.finished } } } #[stable(feature = "rust1", since = "1.0.0")] -impl<'a, T, P> Iterator for Split<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> Iterator for Split<'a, T, P> +where + P: FnMut(&T) -> bool, +{ type Item = &'a [T]; #[inline] fn next(&mut self) -> Option<&'a [T]> { - if self.finished { return None; } + if self.finished { + return None; + } match self.v.iter().position(|x| (self.pred)(x)) { None => self.finish(), @@ -3631,19 +3631,20 @@ impl<'a, T, P> Iterator for Split<'a, T, P> where P: FnMut(&T) -> bool { #[inline] fn size_hint(&self) -> (usize, Option) { - if self.finished { - (0, Some(0)) - } else { - (1, Some(self.v.len() + 1)) - } + if self.finished { (0, Some(0)) } else { (1, Some(self.v.len() + 1)) } } } #[stable(feature = "rust1", since = "1.0.0")] -impl<'a, T, P> DoubleEndedIterator for Split<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> DoubleEndedIterator for Split<'a, T, P> +where + P: FnMut(&T) -> bool, +{ #[inline] fn next_back(&mut self) -> Option<&'a [T]> { - if self.finished { return None; } + if self.finished { + return None; + } match self.v.iter().rposition(|x| (self.pred)(x)) { None => self.finish(), @@ -3656,10 +3657,18 @@ impl<'a, T, P> DoubleEndedIterator for Split<'a, T, P> where P: FnMut(&T) -> boo } } -impl<'a, T, P> SplitIter for Split<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> SplitIter for Split<'a, T, P> +where + P: FnMut(&T) -> bool, +{ #[inline] fn finish(&mut self) -> Option<&'a [T]> { - if self.finished { None } else { self.finished = true; Some(self.v) } + if self.finished { + None + } else { + self.finished = true; + Some(self.v) + } } } @@ -3674,23 +3683,29 @@ impl FusedIterator for Split<'_, T, P> where P: FnMut(&T) -> bool {} /// [`split_mut`]: ../../std/primitive.slice.html#method.split_mut /// [slices]: ../../std/primitive.slice.html #[stable(feature = "rust1", since = "1.0.0")] -pub struct SplitMut<'a, T:'a, P> where P: FnMut(&T) -> bool { +pub struct SplitMut<'a, T: 'a, P> +where + P: FnMut(&T) -> bool, +{ v: &'a mut [T], pred: P, - finished: bool + finished: bool, } #[stable(feature = "core_impl_debug", since = "1.9.0")] -impl fmt::Debug for SplitMut<'_, T, P> where P: FnMut(&T) -> bool { +impl fmt::Debug for SplitMut<'_, T, P> +where + P: FnMut(&T) -> bool, +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("SplitMut") - .field("v", &self.v) - .field("finished", &self.finished) - .finish() + f.debug_struct("SplitMut").field("v", &self.v).field("finished", &self.finished).finish() } } -impl<'a, T, P> SplitIter for SplitMut<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> SplitIter for SplitMut<'a, T, P> +where + P: FnMut(&T) -> bool, +{ #[inline] fn finish(&mut self) -> Option<&'a mut [T]> { if self.finished { @@ -3703,14 +3718,20 @@ impl<'a, T, P> SplitIter for SplitMut<'a, T, P> where P: FnMut(&T) -> bool { } #[stable(feature = "rust1", since = "1.0.0")] -impl<'a, T, P> Iterator for SplitMut<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> Iterator for SplitMut<'a, T, P> +where + P: FnMut(&T) -> bool, +{ type Item = &'a mut [T]; #[inline] fn next(&mut self) -> Option<&'a mut [T]> { - if self.finished { return None; } + if self.finished { + return None; + } - let idx_opt = { // work around borrowck limitations + let idx_opt = { + // work around borrowck limitations let pred = &mut self.pred; self.v.iter().position(|x| (*pred)(x)) }; @@ -3738,14 +3759,18 @@ impl<'a, T, P> Iterator for SplitMut<'a, T, P> where P: FnMut(&T) -> bool { } #[stable(feature = "rust1", since = "1.0.0")] -impl<'a, T, P> DoubleEndedIterator for SplitMut<'a, T, P> where +impl<'a, T, P> DoubleEndedIterator for SplitMut<'a, T, P> +where P: FnMut(&T) -> bool, { #[inline] fn next_back(&mut self) -> Option<&'a mut [T]> { - if self.finished { return None; } + if self.finished { + return None; + } - let idx_opt = { // work around borrowck limitations + let idx_opt = { + // work around borrowck limitations let pred = &mut self.pred; self.v.iter().rposition(|x| (*pred)(x)) }; @@ -3773,12 +3798,18 @@ impl FusedIterator for SplitMut<'_, T, P> where P: FnMut(&T) -> bool {} /// [slices]: ../../std/primitive.slice.html #[stable(feature = "slice_rsplit", since = "1.27.0")] #[derive(Clone)] // Is this correct, or does it incorrectly require `T: Clone`? -pub struct RSplit<'a, T:'a, P> where P: FnMut(&T) -> bool { - inner: Split<'a, T, P> +pub struct RSplit<'a, T: 'a, P> +where + P: FnMut(&T) -> bool, +{ + inner: Split<'a, T, P>, } #[stable(feature = "slice_rsplit", since = "1.27.0")] -impl fmt::Debug for RSplit<'_, T, P> where P: FnMut(&T) -> bool { +impl fmt::Debug for RSplit<'_, T, P> +where + P: FnMut(&T) -> bool, +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RSplit") .field("v", &self.inner.v) @@ -3788,7 +3819,10 @@ impl fmt::Debug for RSplit<'_, T, P> where P: FnMut(&T) -> boo } #[stable(feature = "slice_rsplit", since = "1.27.0")] -impl<'a, T, P> Iterator for RSplit<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> Iterator for RSplit<'a, T, P> +where + P: FnMut(&T) -> bool, +{ type Item = &'a [T]; #[inline] @@ -3803,7 +3837,10 @@ impl<'a, T, P> Iterator for RSplit<'a, T, P> where P: FnMut(&T) -> bool { } #[stable(feature = "slice_rsplit", since = "1.27.0")] -impl<'a, T, P> DoubleEndedIterator for RSplit<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> DoubleEndedIterator for RSplit<'a, T, P> +where + P: FnMut(&T) -> bool, +{ #[inline] fn next_back(&mut self) -> Option<&'a [T]> { self.inner.next() @@ -3811,7 +3848,10 @@ impl<'a, T, P> DoubleEndedIterator for RSplit<'a, T, P> where P: FnMut(&T) -> bo } #[stable(feature = "slice_rsplit", since = "1.27.0")] -impl<'a, T, P> SplitIter for RSplit<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> SplitIter for RSplit<'a, T, P> +where + P: FnMut(&T) -> bool, +{ #[inline] fn finish(&mut self) -> Option<&'a [T]> { self.inner.finish() @@ -3829,12 +3869,18 @@ impl FusedIterator for RSplit<'_, T, P> where P: FnMut(&T) -> bool {} /// [`rsplit_mut`]: ../../std/primitive.slice.html#method.rsplit_mut /// [slices]: ../../std/primitive.slice.html #[stable(feature = "slice_rsplit", since = "1.27.0")] -pub struct RSplitMut<'a, T:'a, P> where P: FnMut(&T) -> bool { - inner: SplitMut<'a, T, P> +pub struct RSplitMut<'a, T: 'a, P> +where + P: FnMut(&T) -> bool, +{ + inner: SplitMut<'a, T, P>, } #[stable(feature = "slice_rsplit", since = "1.27.0")] -impl fmt::Debug for RSplitMut<'_, T, P> where P: FnMut(&T) -> bool { +impl fmt::Debug for RSplitMut<'_, T, P> +where + P: FnMut(&T) -> bool, +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RSplitMut") .field("v", &self.inner.v) @@ -3844,7 +3890,10 @@ impl fmt::Debug for RSplitMut<'_, T, P> where P: FnMut(&T) -> } #[stable(feature = "slice_rsplit", since = "1.27.0")] -impl<'a, T, P> SplitIter for RSplitMut<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> SplitIter for RSplitMut<'a, T, P> +where + P: FnMut(&T) -> bool, +{ #[inline] fn finish(&mut self) -> Option<&'a mut [T]> { self.inner.finish() @@ -3852,7 +3901,10 @@ impl<'a, T, P> SplitIter for RSplitMut<'a, T, P> where P: FnMut(&T) -> bool { } #[stable(feature = "slice_rsplit", since = "1.27.0")] -impl<'a, T, P> Iterator for RSplitMut<'a, T, P> where P: FnMut(&T) -> bool { +impl<'a, T, P> Iterator for RSplitMut<'a, T, P> +where + P: FnMut(&T) -> bool, +{ type Item = &'a mut [T]; #[inline] @@ -3867,7 +3919,8 @@ impl<'a, T, P> Iterator for RSplitMut<'a, T, P> where P: FnMut(&T) -> bool { } #[stable(feature = "slice_rsplit", since = "1.27.0")] -impl<'a, T, P> DoubleEndedIterator for RSplitMut<'a, T, P> where +impl<'a, T, P> DoubleEndedIterator for RSplitMut<'a, T, P> +where P: FnMut(&T) -> bool, { #[inline] @@ -3888,15 +3941,21 @@ struct GenericSplitN { count: usize, } -impl> Iterator for GenericSplitN { +impl> Iterator for GenericSplitN { type Item = T; #[inline] fn next(&mut self) -> Option { match self.count { 0 => None, - 1 => { self.count -= 1; self.iter.finish() } - _ => { self.count -= 1; self.iter.next() } + 1 => { + self.count -= 1; + self.iter.finish() + } + _ => { + self.count -= 1; + self.iter.next() + } } } @@ -3915,16 +3974,20 @@ impl> Iterator for GenericSplitN { /// [`splitn`]: ../../std/primitive.slice.html#method.splitn /// [slices]: ../../std/primitive.slice.html #[stable(feature = "rust1", since = "1.0.0")] -pub struct SplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool { - inner: GenericSplitN> +pub struct SplitN<'a, T: 'a, P> +where + P: FnMut(&T) -> bool, +{ + inner: GenericSplitN>, } #[stable(feature = "core_impl_debug", since = "1.9.0")] -impl fmt::Debug for SplitN<'_, T, P> where P: FnMut(&T) -> bool { +impl fmt::Debug for SplitN<'_, T, P> +where + P: FnMut(&T) -> bool, +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("SplitN") - .field("inner", &self.inner) - .finish() + f.debug_struct("SplitN").field("inner", &self.inner).finish() } } @@ -3937,16 +4000,20 @@ impl fmt::Debug for SplitN<'_, T, P> where P: FnMut(&T) -> boo /// [`rsplitn`]: ../../std/primitive.slice.html#method.rsplitn /// [slices]: ../../std/primitive.slice.html #[stable(feature = "rust1", since = "1.0.0")] -pub struct RSplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool { - inner: GenericSplitN> +pub struct RSplitN<'a, T: 'a, P> +where + P: FnMut(&T) -> bool, +{ + inner: GenericSplitN>, } #[stable(feature = "core_impl_debug", since = "1.9.0")] -impl fmt::Debug for RSplitN<'_, T, P> where P: FnMut(&T) -> bool { +impl fmt::Debug for RSplitN<'_, T, P> +where + P: FnMut(&T) -> bool, +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("RSplitN") - .field("inner", &self.inner) - .finish() + f.debug_struct("RSplitN").field("inner", &self.inner).finish() } } @@ -3958,16 +4025,20 @@ impl fmt::Debug for RSplitN<'_, T, P> where P: FnMut(&T) -> bo /// [`splitn_mut`]: ../../std/primitive.slice.html#method.splitn_mut /// [slices]: ../../std/primitive.slice.html #[stable(feature = "rust1", since = "1.0.0")] -pub struct SplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool { - inner: GenericSplitN> +pub struct SplitNMut<'a, T: 'a, P> +where + P: FnMut(&T) -> bool, +{ + inner: GenericSplitN>, } #[stable(feature = "core_impl_debug", since = "1.9.0")] -impl fmt::Debug for SplitNMut<'_, T, P> where P: FnMut(&T) -> bool { +impl fmt::Debug for SplitNMut<'_, T, P> +where + P: FnMut(&T) -> bool, +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("SplitNMut") - .field("inner", &self.inner) - .finish() + f.debug_struct("SplitNMut").field("inner", &self.inner).finish() } } @@ -3980,24 +4051,29 @@ impl fmt::Debug for SplitNMut<'_, T, P> where P: FnMut(&T) -> /// [`rsplitn_mut`]: ../../std/primitive.slice.html#method.rsplitn_mut /// [slices]: ../../std/primitive.slice.html #[stable(feature = "rust1", since = "1.0.0")] -pub struct RSplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool { - inner: GenericSplitN> +pub struct RSplitNMut<'a, T: 'a, P> +where + P: FnMut(&T) -> bool, +{ + inner: GenericSplitN>, } #[stable(feature = "core_impl_debug", since = "1.9.0")] -impl fmt::Debug for RSplitNMut<'_, T, P> where P: FnMut(&T) -> bool { +impl fmt::Debug for RSplitNMut<'_, T, P> +where + P: FnMut(&T) -> bool, +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("RSplitNMut") - .field("inner", &self.inner) - .finish() + f.debug_struct("RSplitNMut").field("inner", &self.inner).finish() } } macro_rules! forward_iterator { ($name:ident: $elem:ident, $iter_of:ty) => { #[stable(feature = "rust1", since = "1.0.0")] - impl<'a, $elem, P> Iterator for $name<'a, $elem, P> where - P: FnMut(&T) -> bool + impl<'a, $elem, P> Iterator for $name<'a, $elem, P> + where + P: FnMut(&T) -> bool, { type Item = $iter_of; @@ -4013,9 +4089,8 @@ macro_rules! forward_iterator { } #[stable(feature = "fused", since = "1.26.0")] - impl<'a, $elem, P> FusedIterator for $name<'a, $elem, P> - where P: FnMut(&T) -> bool {} - } + impl<'a, $elem, P> FusedIterator for $name<'a, $elem, P> where P: FnMut(&T) -> bool {} + }; } forward_iterator! { SplitN: T, &'a [T] } @@ -4031,19 +4106,16 @@ forward_iterator! { RSplitNMut: T, &'a mut [T] } /// [slices]: ../../std/primitive.slice.html #[derive(Debug)] #[stable(feature = "rust1", since = "1.0.0")] -pub struct Windows<'a, T:'a> { +pub struct Windows<'a, T: 'a> { v: &'a [T], - size: usize + size: usize, } // FIXME(#26925) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Windows<'_, T> { fn clone(&self) -> Self { - Windows { - v: self.v, - size: self.size, - } + Windows { v: self.v, size: self.size } } } @@ -4085,7 +4157,7 @@ impl<'a, T> Iterator for Windows<'a, T> { None } else { let nth = &self.v[n..end]; - self.v = &self.v[n+1..]; + self.v = &self.v[n + 1..]; Some(nth) } } @@ -4108,8 +4180,8 @@ impl<'a, T> DoubleEndedIterator for Windows<'a, T> { if self.size > self.v.len() { None } else { - let ret = Some(&self.v[self.v.len()-self.size..]); - self.v = &self.v[..self.v.len()-1]; + let ret = Some(&self.v[self.v.len() - self.size..]); + self.v = &self.v[..self.v.len() - 1]; ret } } @@ -4121,8 +4193,8 @@ impl<'a, T> DoubleEndedIterator for Windows<'a, T> { self.v = &[]; None } else { - let ret = &self.v[end-self.size..end]; - self.v = &self.v[..end-1]; + let ret = &self.v[end - self.size..end]; + self.v = &self.v[..end - 1]; Some(ret) } } @@ -4142,7 +4214,9 @@ unsafe impl<'a, T> TrustedRandomAccess for Windows<'a, T> { unsafe fn get_unchecked(&mut self, i: usize) -> &'a [T] { from_raw_parts(self.v.as_ptr().add(i), self.size) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } /// An iterator over a slice in (non-overlapping) chunks (`chunk_size` elements at a @@ -4157,19 +4231,16 @@ unsafe impl<'a, T> TrustedRandomAccess for Windows<'a, T> { /// [slices]: ../../std/primitive.slice.html #[derive(Debug)] #[stable(feature = "rust1", since = "1.0.0")] -pub struct Chunks<'a, T:'a> { +pub struct Chunks<'a, T: 'a> { v: &'a [T], - chunk_size: usize + chunk_size: usize, } // FIXME(#26925) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Chunks<'_, T> { fn clone(&self) -> Self { - Chunks { - v: self.v, - chunk_size: self.chunk_size, - } + Chunks { v: self.v, chunk_size: self.chunk_size } } } @@ -4196,7 +4267,7 @@ impl<'a, T> Iterator for Chunks<'a, T> { } else { let n = self.v.len() / self.chunk_size; let rem = self.v.len() % self.chunk_size; - let n = if rem > 0 { n+1 } else { n }; + let n = if rem > 0 { n + 1 } else { n }; (n, Some(n)) } } @@ -4287,7 +4358,9 @@ unsafe impl<'a, T> TrustedRandomAccess for Chunks<'a, T> { }; from_raw_parts(self.v.as_ptr().add(start), end - start) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } /// An iterator over a slice in (non-overlapping) mutable chunks (`chunk_size` @@ -4302,9 +4375,9 @@ unsafe impl<'a, T> TrustedRandomAccess for Chunks<'a, T> { /// [slices]: ../../std/primitive.slice.html #[derive(Debug)] #[stable(feature = "rust1", since = "1.0.0")] -pub struct ChunksMut<'a, T:'a> { +pub struct ChunksMut<'a, T: 'a> { v: &'a mut [T], - chunk_size: usize + chunk_size: usize, } #[stable(feature = "rust1", since = "1.0.0")] @@ -4354,7 +4427,7 @@ impl<'a, T> Iterator for ChunksMut<'a, T> { }; let tmp = mem::replace(&mut self.v, &mut []); let (head, tail) = tmp.split_at_mut(end); - let (_, nth) = head.split_at_mut(start); + let (_, nth) = head.split_at_mut(start); self.v = tail; Some(nth) } @@ -4427,7 +4500,9 @@ unsafe impl<'a, T> TrustedRandomAccess for ChunksMut<'a, T> { }; from_raw_parts_mut(self.v.as_mut_ptr().add(start), end - start) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } /// An iterator over a slice in (non-overlapping) chunks (`chunk_size` elements at a @@ -4444,10 +4519,10 @@ unsafe impl<'a, T> TrustedRandomAccess for ChunksMut<'a, T> { /// [slices]: ../../std/primitive.slice.html #[derive(Debug)] #[stable(feature = "chunks_exact", since = "1.31.0")] -pub struct ChunksExact<'a, T:'a> { +pub struct ChunksExact<'a, T: 'a> { v: &'a [T], rem: &'a [T], - chunk_size: usize + chunk_size: usize, } impl<'a, T> ChunksExact<'a, T> { @@ -4464,11 +4539,7 @@ impl<'a, T> ChunksExact<'a, T> { #[stable(feature = "chunks_exact", since = "1.31.0")] impl Clone for ChunksExact<'_, T> { fn clone(&self) -> Self { - ChunksExact { - v: self.v, - rem: self.rem, - chunk_size: self.chunk_size, - } + ChunksExact { v: self.v, rem: self.rem, chunk_size: self.chunk_size } } } @@ -4566,7 +4637,9 @@ unsafe impl<'a, T> TrustedRandomAccess for ChunksExact<'a, T> { let start = i * self.chunk_size; from_raw_parts(self.v.as_ptr().add(start), self.chunk_size) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } /// An iterator over a slice in (non-overlapping) mutable chunks (`chunk_size` @@ -4583,10 +4656,10 @@ unsafe impl<'a, T> TrustedRandomAccess for ChunksExact<'a, T> { /// [slices]: ../../std/primitive.slice.html #[derive(Debug)] #[stable(feature = "chunks_exact", since = "1.31.0")] -pub struct ChunksExactMut<'a, T:'a> { +pub struct ChunksExactMut<'a, T: 'a> { v: &'a mut [T], rem: &'a mut [T], - chunk_size: usize + chunk_size: usize, } impl<'a, T> ChunksExactMut<'a, T> { @@ -4698,7 +4771,9 @@ unsafe impl<'a, T> TrustedRandomAccess for ChunksExactMut<'a, T> { let start = i * self.chunk_size; from_raw_parts_mut(self.v.as_mut_ptr().add(start), self.chunk_size) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } /// An iterator over a slice in (non-overlapping) chunks (`chunk_size` elements at a @@ -4713,19 +4788,16 @@ unsafe impl<'a, T> TrustedRandomAccess for ChunksExactMut<'a, T> { /// [slices]: ../../std/primitive.slice.html #[derive(Debug)] #[stable(feature = "rchunks", since = "1.31.0")] -pub struct RChunks<'a, T:'a> { +pub struct RChunks<'a, T: 'a> { v: &'a [T], - chunk_size: usize + chunk_size: usize, } // FIXME(#26925) Remove in favor of `#[derive(Clone)]` #[stable(feature = "rchunks", since = "1.31.0")] impl Clone for RChunks<'_, T> { fn clone(&self) -> Self { - RChunks { - v: self.v, - chunk_size: self.chunk_size, - } + RChunks { v: self.v, chunk_size: self.chunk_size } } } @@ -4752,7 +4824,7 @@ impl<'a, T> Iterator for RChunks<'a, T> { } else { let n = self.v.len() / self.chunk_size; let rem = self.v.len() % self.chunk_size; - let n = if rem > 0 { n+1 } else { n }; + let n = if rem > 0 { n + 1 } else { n }; (n, Some(n)) } } @@ -4846,7 +4918,9 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunks<'a, T> { }; from_raw_parts(self.v.as_ptr().add(start), end - start) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } /// An iterator over a slice in (non-overlapping) mutable chunks (`chunk_size` @@ -4861,9 +4935,9 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunks<'a, T> { /// [slices]: ../../std/primitive.slice.html #[derive(Debug)] #[stable(feature = "rchunks", since = "1.31.0")] -pub struct RChunksMut<'a, T:'a> { +pub struct RChunksMut<'a, T: 'a> { v: &'a mut [T], - chunk_size: usize + chunk_size: usize, } #[stable(feature = "rchunks", since = "1.31.0")] @@ -4989,7 +5063,9 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunksMut<'a, T> { }; from_raw_parts_mut(self.v.as_mut_ptr().add(start), end - start) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } /// An iterator over a slice in (non-overlapping) chunks (`chunk_size` elements at a @@ -5006,10 +5082,10 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunksMut<'a, T> { /// [slices]: ../../std/primitive.slice.html #[derive(Debug)] #[stable(feature = "rchunks", since = "1.31.0")] -pub struct RChunksExact<'a, T:'a> { +pub struct RChunksExact<'a, T: 'a> { v: &'a [T], rem: &'a [T], - chunk_size: usize + chunk_size: usize, } impl<'a, T> RChunksExact<'a, T> { @@ -5026,11 +5102,7 @@ impl<'a, T> RChunksExact<'a, T> { #[stable(feature = "rchunks", since = "1.31.0")] impl<'a, T> Clone for RChunksExact<'a, T> { fn clone(&self) -> RChunksExact<'a, T> { - RChunksExact { - v: self.v, - rem: self.rem, - chunk_size: self.chunk_size, - } + RChunksExact { v: self.v, rem: self.rem, chunk_size: self.chunk_size } } } @@ -5132,7 +5204,9 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunksExact<'a, T> { let start = end - self.chunk_size; from_raw_parts(self.v.as_ptr().add(start), self.chunk_size) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } /// An iterator over a slice in (non-overlapping) mutable chunks (`chunk_size` @@ -5149,10 +5223,10 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunksExact<'a, T> { /// [slices]: ../../std/primitive.slice.html #[derive(Debug)] #[stable(feature = "rchunks", since = "1.31.0")] -pub struct RChunksExactMut<'a, T:'a> { +pub struct RChunksExactMut<'a, T: 'a> { v: &'a mut [T], rem: &'a mut [T], - chunk_size: usize + chunk_size: usize, } impl<'a, T> RChunksExactMut<'a, T> { @@ -5269,7 +5343,9 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunksExactMut<'a, T> { let start = end - self.chunk_size; from_raw_parts_mut(self.v.as_mut_ptr().add(start), self.chunk_size) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } // @@ -5328,8 +5404,10 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunksExactMut<'a, T> { #[stable(feature = "rust1", since = "1.0.0")] pub unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T] { debug_assert!(is_aligned_and_not_null(data), "attempt to create unaligned or null slice"); - debug_assert!(mem::size_of::().saturating_mul(len) <= isize::MAX as usize, - "attempt to create slice covering at least half the address space"); + debug_assert!( + mem::size_of::().saturating_mul(len) <= isize::MAX as usize, + "attempt to create slice covering at least half the address space" + ); &*ptr::slice_from_raw_parts(data, len) } @@ -5366,32 +5444,31 @@ pub unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T] { #[stable(feature = "rust1", since = "1.0.0")] pub unsafe fn from_raw_parts_mut<'a, T>(data: *mut T, len: usize) -> &'a mut [T] { debug_assert!(is_aligned_and_not_null(data), "attempt to create unaligned or null slice"); - debug_assert!(mem::size_of::().saturating_mul(len) <= isize::MAX as usize, - "attempt to create slice covering at least half the address space"); + debug_assert!( + mem::size_of::().saturating_mul(len) <= isize::MAX as usize, + "attempt to create slice covering at least half the address space" + ); &mut *ptr::slice_from_raw_parts_mut(data, len) } /// Converts a reference to T into a slice of length 1 (without copying). #[stable(feature = "from_ref", since = "1.28.0")] pub fn from_ref(s: &T) -> &[T] { - unsafe { - from_raw_parts(s, 1) - } + unsafe { from_raw_parts(s, 1) } } /// Converts a reference to T into a slice of length 1 (without copying). #[stable(feature = "from_ref", since = "1.28.0")] pub fn from_mut(s: &mut T) -> &mut [T] { - unsafe { - from_raw_parts_mut(s, 1) - } + unsafe { from_raw_parts_mut(s, 1) } } // This function is public only because there is no other way to unit test heapsort. -#[unstable(feature = "sort_internals", reason = "internal to sort module", issue = "0")] +#[unstable(feature = "sort_internals", reason = "internal to sort module", issue = "none")] #[doc(hidden)] pub fn heapsort(v: &mut [T], mut is_less: F) - where F: FnMut(&T, &T) -> bool +where + F: FnMut(&T, &T) -> bool, { sort::heapsort(v, &mut is_less); } @@ -5400,7 +5477,7 @@ pub fn heapsort(v: &mut [T], mut is_less: F) // Comparison traits // -extern { +extern "C" { /// Calls implementation provided memcmp. /// /// Interprets the data as u8. @@ -5412,7 +5489,10 @@ extern { } #[stable(feature = "rust1", since = "1.0.0")] -impl PartialEq<[B]> for [A] where A: PartialEq { +impl PartialEq<[B]> for [A] +where + A: PartialEq, +{ fn eq(&self, other: &[B]) -> bool { SlicePartialEq::equal(self, other) } @@ -5446,12 +5526,15 @@ impl PartialOrd for [T] { trait SlicePartialEq { fn equal(&self, other: &[B]) -> bool; - fn not_equal(&self, other: &[B]) -> bool { !self.equal(other) } + fn not_equal(&self, other: &[B]) -> bool { + !self.equal(other) + } } // Generic slice equality impl SlicePartialEq for [A] - where A: PartialEq +where + A: PartialEq, { default fn equal(&self, other: &[B]) -> bool { if self.len() != other.len() { @@ -5464,7 +5547,8 @@ impl SlicePartialEq for [A] // Use an equal-pointer optimization when types are `Eq` impl SlicePartialEq for [A] - where A: PartialEq + Eq +where + A: PartialEq + Eq, { default fn equal(&self, other: &[A]) -> bool { if self.len() != other.len() { @@ -5481,7 +5565,8 @@ impl SlicePartialEq for [A] // Use memcmp for bytewise equality when the types allow impl SlicePartialEq for [A] - where A: PartialEq + BytewiseEquality +where + A: PartialEq + BytewiseEquality, { fn equal(&self, other: &[A]) -> bool { if self.len() != other.len() { @@ -5492,8 +5577,7 @@ impl SlicePartialEq for [A] } unsafe { let size = mem::size_of_val(self); - memcmp(self.as_ptr() as *const u8, - other.as_ptr() as *const u8, size) == 0 + memcmp(self.as_ptr() as *const u8, other.as_ptr() as *const u8, size) == 0 } } } @@ -5505,7 +5589,8 @@ trait SlicePartialOrd { } impl SlicePartialOrd for [A] - where A: PartialOrd +where + A: PartialOrd, { default fn partial_compare(&self, other: &[A]) -> Option { let l = cmp::min(self.len(), other.len()); @@ -5527,7 +5612,8 @@ impl SlicePartialOrd for [A] } impl SlicePartialOrd for [A] - where A: Ord +where + A: Ord, { default fn partial_compare(&self, other: &[A]) -> Option { Some(SliceOrd::compare(self, other)) @@ -5541,7 +5627,8 @@ trait SliceOrd { } impl SliceOrd for [A] - where A: Ord +where + A: Ord, { default fn compare(&self, other: &[A]) -> Ordering { let l = cmp::min(self.len(), other.len()); @@ -5567,10 +5654,8 @@ impl SliceOrd for [A] impl SliceOrd for [u8] { #[inline] fn compare(&self, other: &[u8]) -> Ordering { - let order = unsafe { - memcmp(self.as_ptr(), other.as_ptr(), - cmp::min(self.len(), other.len())) - }; + let order = + unsafe { memcmp(self.as_ptr(), other.as_ptr(), cmp::min(self.len(), other.len())) }; if order == 0 { self.len().cmp(&other.len()) } else if order < 0 { @@ -5584,7 +5669,7 @@ impl SliceOrd for [u8] { #[doc(hidden)] /// Trait implemented for types that can be compared for equality using /// their bytewise representation -trait BytewiseEquality: Eq + Copy { } +trait BytewiseEquality: Eq + Copy {} macro_rules! impl_marker_for { ($traitname:ident, $($ty:ty)*) => { @@ -5600,24 +5685,31 @@ impl_marker_for!(BytewiseEquality, #[doc(hidden)] unsafe impl<'a, T> TrustedRandomAccess for Iter<'a, T> { unsafe fn get_unchecked(&mut self, i: usize) -> &'a T { - &*self.ptr.add(i) + &*self.ptr.as_ptr().add(i) + } + fn may_have_side_effect() -> bool { + false } - fn may_have_side_effect() -> bool { false } } #[doc(hidden)] unsafe impl<'a, T> TrustedRandomAccess for IterMut<'a, T> { unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut T { - &mut *self.ptr.add(i) + &mut *self.ptr.as_ptr().add(i) + } + fn may_have_side_effect() -> bool { + false } - fn may_have_side_effect() -> bool { false } } trait SliceContains: Sized { fn slice_contains(&self, x: &[Self]) -> bool; } -impl SliceContains for T where T: PartialEq { +impl SliceContains for T +where + T: PartialEq, +{ default fn slice_contains(&self, x: &[Self]) -> bool { x.iter().any(|y| *y == *self) } diff --git a/src/libcore/str/lossy.rs b/src/libcore/str/lossy.rs index 762de0489a..88b2bc551b 100644 --- a/src/libcore/str/lossy.rs +++ b/src/libcore/str/lossy.rs @@ -1,14 +1,12 @@ use crate::char; -use crate::str as core_str; use crate::fmt::{self, Write}; use crate::mem; - -// ignore-tidy-undocumented-unsafe +use crate::str as core_str; /// Lossy UTF-8 string. -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] pub struct Utf8Lossy { - bytes: [u8] + bytes: [u8], } impl Utf8Lossy { @@ -17,6 +15,7 @@ impl Utf8Lossy { } pub fn from_bytes(bytes: &[u8]) -> &Utf8Lossy { + // SAFETY: Both use the same memory layout, and UTF-8 correctness isn't required. unsafe { mem::transmute(bytes) } } @@ -25,15 +24,14 @@ impl Utf8Lossy { } } - /// Iterator over lossy UTF-8 string -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[allow(missing_debug_implementations)] pub struct Utf8LossyChunksIter<'a> { source: &'a [u8], } -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[derive(PartialEq, Eq, Debug)] pub struct Utf8LossyChunk<'a> { /// Sequence of valid chars. @@ -61,24 +59,28 @@ impl<'a> Iterator for Utf8LossyChunksIter<'a> { while i < self.source.len() { let i_ = i; + // SAFETY: `i` starts at `0`, is less than `self.source.len()`, and + // only increases, so `0 <= i < self.source.len()`. let byte = unsafe { *self.source.get_unchecked(i) }; i += 1; if byte < 128 { - } else { let w = core_str::utf8_char_width(byte); - macro_rules! error { () => ({ - unsafe { - let r = Utf8LossyChunk { - valid: core_str::from_utf8_unchecked(&self.source[0..i_]), - broken: &self.source[i_..i], - }; - self.source = &self.source[i..]; - return Some(r); - } - })} + macro_rules! error { + () => {{ + // SAFETY: We have checked up to `i` that source is valid UTF-8. + unsafe { + let r = Utf8LossyChunk { + valid: core_str::from_utf8_unchecked(&self.source[0..i_]), + broken: &self.source[i_..i], + }; + self.source = &self.source[i..]; + return Some(r); + } + }}; + } match w { 2 => { @@ -89,10 +91,10 @@ impl<'a> Iterator for Utf8LossyChunksIter<'a> { } 3 => { match (byte, safe_get(self.source, i)) { - (0xE0, 0xA0 ..= 0xBF) => (), - (0xE1 ..= 0xEC, 0x80 ..= 0xBF) => (), - (0xED, 0x80 ..= 0x9F) => (), - (0xEE ..= 0xEF, 0x80 ..= 0xBF) => (), + (0xE0, 0xA0..=0xBF) => (), + (0xE1..=0xEC, 0x80..=0xBF) => (), + (0xED, 0x80..=0x9F) => (), + (0xEE..=0xEF, 0x80..=0xBF) => (), _ => { error!(); } @@ -105,9 +107,9 @@ impl<'a> Iterator for Utf8LossyChunksIter<'a> { } 4 => { match (byte, safe_get(self.source, i)) { - (0xF0, 0x90 ..= 0xBF) => (), - (0xF1 ..= 0xF3, 0x80 ..= 0xBF) => (), - (0xF4, 0x80 ..= 0x8F) => (), + (0xF0, 0x90..=0xBF) => (), + (0xF1..=0xF3, 0x80..=0xBF) => (), + (0xF4, 0x80..=0x8F) => (), _ => { error!(); } @@ -130,6 +132,7 @@ impl<'a> Iterator for Utf8LossyChunksIter<'a> { } let r = Utf8LossyChunk { + // SAFETY: We have checked that the entire source is valid UTF-8. valid: unsafe { core_str::from_utf8_unchecked(self.source) }, broken: &[], }; @@ -138,13 +141,12 @@ impl<'a> Iterator for Utf8LossyChunksIter<'a> { } } - impl fmt::Display for Utf8Lossy { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // If we're the empty string then our iterator won't actually yield // anything, so perform the formatting manually if self.bytes.is_empty() { - return "".fmt(f) + return "".fmt(f); } for Utf8LossyChunk { valid, broken } in self.chunks() { @@ -153,7 +155,7 @@ impl fmt::Display for Utf8Lossy { // respect various formatting flags if possible. if valid.len() == self.bytes.len() { assert!(broken.is_empty()); - return valid.fmt(f) + return valid.fmt(f); } f.write_str(valid)?; @@ -170,7 +172,6 @@ impl fmt::Debug for Utf8Lossy { f.write_char('"')?; for Utf8LossyChunk { valid, broken } in self.chunks() { - // Valid part. // Here we partially parse UTF-8 again which is suboptimal. { diff --git a/src/libcore/str/mod.rs b/src/libcore/str/mod.rs index 763714e536..5a7cddd404 100644 --- a/src/libcore/str/mod.rs +++ b/src/libcore/str/mod.rs @@ -1,5 +1,4 @@ // ignore-tidy-filelength -// ignore-tidy-undocumented-unsafe //! String manipulation. //! @@ -8,20 +7,20 @@ #![stable(feature = "rust1", since = "1.0.0")] use self::pattern::Pattern; -use self::pattern::{Searcher, SearchStep, ReverseSearcher, DoubleEndedSearcher}; +use self::pattern::{DoubleEndedSearcher, ReverseSearcher, SearchStep, Searcher}; use crate::char; use crate::fmt::{self, Write}; -use crate::iter::{Map, Cloned, FusedIterator, TrustedLen, TrustedRandomAccess, Filter}; -use crate::iter::{Flatten, FlatMap, Chain}; -use crate::slice::{self, SliceIndex, Split as SliceSplit}; +use crate::iter::{Chain, FlatMap, Flatten}; +use crate::iter::{Cloned, Filter, FusedIterator, Map, TrustedLen, TrustedRandomAccess}; use crate::mem; use crate::ops::Try; use crate::option; +use crate::slice::{self, SliceIndex, Split as SliceSplit}; pub mod pattern; -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[allow(missing_docs)] pub mod lossy; @@ -133,9 +132,9 @@ impl FromStr for bool { #[inline] fn from_str(s: &str) -> Result { match s { - "true" => Ok(true), + "true" => Ok(true), "false" => Ok(false), - _ => Err(ParseBoolError { _priv: () }), + _ => Err(ParseBoolError { _priv: () }), } } } @@ -145,7 +144,9 @@ impl FromStr for bool { /// [`from_str`]: ../../std/primitive.bool.html#method.from_str #[derive(Debug, Clone, PartialEq, Eq)] #[stable(feature = "rust1", since = "1.0.0")] -pub struct ParseBoolError { _priv: () } +pub struct ParseBoolError { + _priv: (), +} #[stable(feature = "rust1", since = "1.0.0")] impl fmt::Display for ParseBoolError { @@ -230,7 +231,9 @@ impl Utf8Error { /// assert_eq!(1, error.valid_up_to()); /// ``` #[stable(feature = "utf8_error", since = "1.5.0")] - pub fn valid_up_to(&self) -> usize { self.valid_up_to } + pub fn valid_up_to(&self) -> usize { + self.valid_up_to + } /// Provides more information about the failure: /// @@ -337,6 +340,7 @@ impl Utf8Error { #[stable(feature = "rust1", since = "1.0.0")] pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error> { run_utf8_validation(v)?; + // SAFETY: Just ran validation. Ok(unsafe { from_utf8_unchecked(v) }) } @@ -375,6 +379,7 @@ pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error> { #[stable(feature = "str_mut_extras", since = "1.20.0")] pub fn from_utf8_mut(v: &mut [u8]) -> Result<&mut str, Utf8Error> { run_utf8_validation(v)?; + // SAFETY: Just ran validation. Ok(unsafe { from_utf8_unchecked_mut(v) }) } @@ -444,8 +449,11 @@ pub unsafe fn from_utf8_unchecked_mut(v: &mut [u8]) -> &mut str { impl fmt::Display for Utf8Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let Some(error_len) = self.error_len { - write!(f, "invalid utf-8 sequence of {} bytes from index {}", - error_len, self.valid_up_to) + write!( + f, + "invalid utf-8 sequence of {} bytes from index {}", + error_len, self.valid_up_to + ) } else { write!(f, "incomplete utf-8 byte sequence from index {}", self.valid_up_to) } @@ -468,23 +476,29 @@ Section: Iterators #[derive(Clone)] #[stable(feature = "rust1", since = "1.0.0")] pub struct Chars<'a> { - iter: slice::Iter<'a, u8> + iter: slice::Iter<'a, u8>, } /// Returns the initial codepoint accumulator for the first byte. /// The first byte is special, only want bottom 5 bits for width 2, 4 bits /// for width 3, and 3 bits for width 4. #[inline] -fn utf8_first_byte(byte: u8, width: u32) -> u32 { (byte & (0x7F >> width)) as u32 } +fn utf8_first_byte(byte: u8, width: u32) -> u32 { + (byte & (0x7F >> width)) as u32 +} /// Returns the value of `ch` updated with continuation byte `byte`. #[inline] -fn utf8_acc_cont_byte(ch: u32, byte: u8) -> u32 { (ch << 6) | (byte & CONT_MASK) as u32 } +fn utf8_acc_cont_byte(ch: u32, byte: u8) -> u32 { + (ch << 6) | (byte & CONT_MASK) as u32 +} /// Checks whether the byte is a UTF-8 continuation byte (i.e., starts with the /// bits `10`). #[inline] -fn utf8_is_cont_byte(byte: u8) -> bool { (byte & !CONT_MASK) == TAG_CONT_U8 } +fn utf8_is_cont_byte(byte: u8) -> bool { + (byte & !CONT_MASK) == TAG_CONT_U8 +} #[inline] fn unwrap_or_0(opt: Option<&u8>) -> u8 { @@ -496,13 +510,13 @@ fn unwrap_or_0(opt: Option<&u8>) -> u8 { /// Reads the next code point out of a byte iterator (assuming a /// UTF-8-like encoding). -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[inline] pub fn next_code_point<'a, I: Iterator>(bytes: &mut I) -> Option { // Decode UTF-8 let x = *bytes.next()?; if x < 128 { - return Some(x as u32) + return Some(x as u32); } // Multibyte case follows @@ -532,7 +546,8 @@ pub fn next_code_point<'a, I: Iterator>(bytes: &mut I) -> Option< /// UTF-8-like encoding). #[inline] fn next_code_point_reverse<'a, I>(bytes: &mut I) -> Option - where I: DoubleEndedIterator, +where + I: DoubleEndedIterator, { // Decode UTF-8 let w = match *bytes.next_back()? { @@ -567,10 +582,8 @@ impl<'a> Iterator for Chars<'a> { #[inline] fn next(&mut self) -> Option { next_code_point(&mut self.iter).map(|ch| { - // str invariant says `ch` is a valid Unicode Scalar Value - unsafe { - char::from_u32_unchecked(ch) - } + // SAFETY: `str` invariant says `ch` is a valid Unicode Scalar Value. + unsafe { char::from_u32_unchecked(ch) } }) } @@ -616,10 +629,8 @@ impl<'a> DoubleEndedIterator for Chars<'a> { #[inline] fn next_back(&mut self) -> Option { next_code_point_reverse(&mut self.iter).map(|ch| { - // str invariant says `ch` is a valid Unicode Scalar Value - unsafe { - char::from_u32_unchecked(ch) - } + // SAFETY: `str` invariant says `ch` is a valid Unicode Scalar Value. + unsafe { char::from_u32_unchecked(ch) } }) } } @@ -648,6 +659,7 @@ impl<'a> Chars<'a> { #[stable(feature = "iter_to_slice", since = "1.4.0")] #[inline] pub fn as_str(&self) -> &'a str { + // SAFETY: `Chars` is only made from a str, which guarantees the iter is valid UTF-8. unsafe { from_utf8_unchecked(self.iter.as_slice()) } } } @@ -770,32 +782,41 @@ impl Iterator for Bytes<'_> { } #[inline] - fn all(&mut self, f: F) -> bool where F: FnMut(Self::Item) -> bool { + fn all(&mut self, f: F) -> bool + where + F: FnMut(Self::Item) -> bool, + { self.0.all(f) } #[inline] - fn any(&mut self, f: F) -> bool where F: FnMut(Self::Item) -> bool { + fn any(&mut self, f: F) -> bool + where + F: FnMut(Self::Item) -> bool, + { self.0.any(f) } #[inline] - fn find

(&mut self, predicate: P) -> Option where - P: FnMut(&Self::Item) -> bool + fn find

(&mut self, predicate: P) -> Option + where + P: FnMut(&Self::Item) -> bool, { self.0.find(predicate) } #[inline] - fn position

(&mut self, predicate: P) -> Option where - P: FnMut(Self::Item) -> bool + fn position

(&mut self, predicate: P) -> Option + where + P: FnMut(Self::Item) -> bool, { self.0.position(predicate) } #[inline] - fn rposition

(&mut self, predicate: P) -> Option where - P: FnMut(Self::Item) -> bool + fn rposition

(&mut self, predicate: P) -> Option + where + P: FnMut(Self::Item) -> bool, { self.0.rposition(predicate) } @@ -814,8 +835,9 @@ impl DoubleEndedIterator for Bytes<'_> { } #[inline] - fn rfind

(&mut self, predicate: P) -> Option where - P: FnMut(&Self::Item) -> bool + fn rfind

(&mut self, predicate: P) -> Option + where + P: FnMut(&Self::Item) -> bool, { self.0.rfind(predicate) } @@ -845,7 +867,9 @@ unsafe impl TrustedRandomAccess for Bytes<'_> { unsafe fn get_unchecked(&mut self, i: usize) -> u8 { self.0.get_unchecked(i) } - fn may_have_side_effect() -> bool { false } + fn may_have_side_effect() -> bool { + false + } } /// This macro generates a Clone impl for string pattern API @@ -861,7 +885,7 @@ macro_rules! derive_pattern_clone { $e } } - } + }; } /// This macro generates two public iterator structs @@ -1047,7 +1071,7 @@ macro_rules! generate_pattern_iterators { } => {} } -derive_pattern_clone!{ +derive_pattern_clone! { clone SplitInternal with |s| SplitInternal { matcher: s.matcher.clone(), ..*s } } @@ -1080,6 +1104,7 @@ impl<'a, P: Pattern<'a>> SplitInternal<'a, P> { fn get_end(&mut self) -> Option<&'a str> { if !self.finished && (self.allow_trailing_empty || self.end - self.start > 0) { self.finished = true; + // SAFETY: `self.start` and `self.end` always lie on unicode boundaries. unsafe { let string = self.matcher.haystack().get_unchecked(self.start..self.end); Some(string) @@ -1091,10 +1116,13 @@ impl<'a, P: Pattern<'a>> SplitInternal<'a, P> { #[inline] fn next(&mut self) -> Option<&'a str> { - if self.finished { return None } + if self.finished { + return None; + } let haystack = self.matcher.haystack(); match self.matcher.next_match() { + // SAFETY: `Searcher` guarantees that `a` and `b` lie on unicode boundaries. Some((a, b)) => unsafe { let elt = haystack.get_unchecked(self.start..a); self.start = b; @@ -1106,25 +1134,34 @@ impl<'a, P: Pattern<'a>> SplitInternal<'a, P> { #[inline] fn next_back(&mut self) -> Option<&'a str> - where P::Searcher: ReverseSearcher<'a> + where + P::Searcher: ReverseSearcher<'a>, { - if self.finished { return None } + if self.finished { + return None; + } if !self.allow_trailing_empty { self.allow_trailing_empty = true; match self.next_back() { Some(elt) if !elt.is_empty() => return Some(elt), - _ => if self.finished { return None } + _ => { + if self.finished { + return None; + } + } } } let haystack = self.matcher.haystack(); match self.matcher.next_match_back() { + // SAFETY: `Searcher` guarantees that `a` and `b` lie on unicode boundaries. Some((a, b)) => unsafe { let elt = haystack.get_unchecked(b..self.end); self.end = a; Some(elt) }, + // SAFETY: `self.start` and `self.end` always lie on unicode boundaries. None => unsafe { self.finished = true; Some(haystack.get_unchecked(self.start..self.end)) @@ -1169,7 +1206,7 @@ generate_pattern_iterators! { delegate double ended; } -derive_pattern_clone!{ +derive_pattern_clone! { clone SplitNInternal with |s| SplitNInternal { iter: s.iter.clone(), ..*s } } @@ -1197,19 +1234,32 @@ impl<'a, P: Pattern<'a>> SplitNInternal<'a, P> { fn next(&mut self) -> Option<&'a str> { match self.count { 0 => None, - 1 => { self.count = 0; self.iter.get_end() } - _ => { self.count -= 1; self.iter.next() } + 1 => { + self.count = 0; + self.iter.get_end() + } + _ => { + self.count -= 1; + self.iter.next() + } } } #[inline] fn next_back(&mut self) -> Option<&'a str> - where P::Searcher: ReverseSearcher<'a> + where + P::Searcher: ReverseSearcher<'a>, { match self.count { 0 => None, - 1 => { self.count = 0; self.iter.get_end() } - _ => { self.count -= 1; self.iter.next_back() } + 1 => { + self.count = 0; + self.iter.get_end() + } + _ => { + self.count -= 1; + self.iter.next_back() + } } } } @@ -1232,7 +1282,7 @@ generate_pattern_iterators! { delegate single ended; } -derive_pattern_clone!{ +derive_pattern_clone! { clone MatchIndicesInternal with |s| MatchIndicesInternal(s.0.clone()) } @@ -1244,27 +1294,28 @@ where P: Pattern<'a, Searcher: fmt::Debug>, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("MatchIndicesInternal") - .field(&self.0) - .finish() + f.debug_tuple("MatchIndicesInternal").field(&self.0).finish() } } impl<'a, P: Pattern<'a>> MatchIndicesInternal<'a, P> { #[inline] fn next(&mut self) -> Option<(usize, &'a str)> { - self.0.next_match().map(|(start, end)| unsafe { - (start, self.0.haystack().get_unchecked(start..end)) - }) + self.0 + .next_match() + // SAFETY: `Searcher` guarantees that `start` and `end` lie on unicode boundaries. + .map(|(start, end)| unsafe { (start, self.0.haystack().get_unchecked(start..end)) }) } #[inline] fn next_back(&mut self) -> Option<(usize, &'a str)> - where P::Searcher: ReverseSearcher<'a> + where + P::Searcher: ReverseSearcher<'a>, { - self.0.next_match_back().map(|(start, end)| unsafe { - (start, self.0.haystack().get_unchecked(start..end)) - }) + self.0 + .next_match_back() + // SAFETY: `Searcher` guarantees that `start` and `end` lie on unicode boundaries. + .map(|(start, end)| unsafe { (start, self.0.haystack().get_unchecked(start..end)) }) } } @@ -1286,7 +1337,7 @@ generate_pattern_iterators! { delegate double ended; } -derive_pattern_clone!{ +derive_pattern_clone! { clone MatchesInternal with |s| MatchesInternal(s.0.clone()) } @@ -1298,15 +1349,14 @@ where P: Pattern<'a, Searcher: fmt::Debug>, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("MatchesInternal") - .field(&self.0) - .finish() + f.debug_tuple("MatchesInternal").field(&self.0).finish() } } impl<'a, P: Pattern<'a>> MatchesInternal<'a, P> { #[inline] fn next(&mut self) -> Option<&'a str> { + // SAFETY: `Searcher` guarantees that `start` and `end` lie on unicode boundaries. self.0.next_match().map(|(a, b)| unsafe { // Indices are known to be on utf8 boundaries self.0.haystack().get_unchecked(a..b) @@ -1315,8 +1365,10 @@ impl<'a, P: Pattern<'a>> MatchesInternal<'a, P> { #[inline] fn next_back(&mut self) -> Option<&'a str> - where P::Searcher: ReverseSearcher<'a> + where + P::Searcher: ReverseSearcher<'a>, { + // SAFETY: `Searcher` guarantees that `start` and `end` lie on unicode boundaries. self.0.next_match_back().map(|(a, b)| unsafe { // Indices are known to be on utf8 boundaries self.0.haystack().get_unchecked(a..b) @@ -1461,21 +1513,20 @@ fn run_utf8_validation(v: &[u8]) -> Result<(), Utf8Error> { let old_offset = index; macro_rules! err { ($error_len: expr) => { - return Err(Utf8Error { - valid_up_to: old_offset, - error_len: $error_len, - }) - } + return Err(Utf8Error { valid_up_to: old_offset, error_len: $error_len }); + }; } - macro_rules! next { () => {{ - index += 1; - // we needed data, but there was none: error! - if index >= len { - err!(None) - } - v[index] - }}} + macro_rules! next { + () => {{ + index += 1; + // we needed data, but there was none: error! + if index >= len { + err!(None) + } + v[index] + }}; + } let first = v[index]; if first >= 128 { @@ -1499,16 +1550,18 @@ fn run_utf8_validation(v: &[u8]) -> Result<(), Utf8Error> { // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / // %xF4 %x80-8F 2( UTF8-tail ) match w { - 2 => if next!() & !CONT_MASK != TAG_CONT_U8 { - err!(Some(1)) - }, + 2 => { + if next!() & !CONT_MASK != TAG_CONT_U8 { + err!(Some(1)) + } + } 3 => { match (first, next!()) { - (0xE0 , 0xA0 ..= 0xBF) | - (0xE1 ..= 0xEC, 0x80 ..= 0xBF) | - (0xED , 0x80 ..= 0x9F) | - (0xEE ..= 0xEF, 0x80 ..= 0xBF) => {} - _ => err!(Some(1)) + (0xE0, 0xA0..=0xBF) + | (0xE1..=0xEC, 0x80..=0xBF) + | (0xED, 0x80..=0x9F) + | (0xEE..=0xEF, 0x80..=0xBF) => {} + _ => err!(Some(1)), } if next!() & !CONT_MASK != TAG_CONT_U8 { err!(Some(2)) @@ -1516,10 +1569,8 @@ fn run_utf8_validation(v: &[u8]) -> Result<(), Utf8Error> { } 4 => { match (first, next!()) { - (0xF0 , 0x90 ..= 0xBF) | - (0xF1 ..= 0xF3, 0x80 ..= 0xBF) | - (0xF4 , 0x80 ..= 0x8F) => {} - _ => err!(Some(1)) + (0xF0, 0x90..=0xBF) | (0xF1..=0xF3, 0x80..=0xBF) | (0xF4, 0x80..=0x8F) => {} + _ => err!(Some(1)), } if next!() & !CONT_MASK != TAG_CONT_U8 { err!(Some(2)) @@ -1528,7 +1579,7 @@ fn run_utf8_validation(v: &[u8]) -> Result<(), Utf8Error> { err!(Some(3)) } } - _ => err!(Some(1)) + _ => err!(Some(1)), } index += 1; } else { @@ -1538,6 +1589,10 @@ fn run_utf8_validation(v: &[u8]) -> Result<(), Utf8Error> { if align != usize::max_value() && align.wrapping_sub(index) % usize_bytes == 0 { let ptr = v.as_ptr(); while index < blocks_end { + // SAFETY: since `align - index` and `ascii_block_size` are + // multiples of `usize_bytes`, `block = ptr.add(index)` is + // always aligned with a `usize` so it's safe to dereference + // both `block` and `block.offset(1)`. unsafe { let block = ptr.add(index) as *const usize; // break if there is a nonascii byte @@ -1564,26 +1619,26 @@ fn run_utf8_validation(v: &[u8]) -> Result<(), Utf8Error> { // https://tools.ietf.org/html/rfc3629 static UTF8_CHAR_WIDTH: [u8; 256] = [ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x1F -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x3F -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x5F -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x7F -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x9F -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xBF -0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // 0xDF -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, // 0xEF -4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, // 0xFF + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, // 0x1F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, // 0x3F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, // 0x5F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, // 0x7F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, // 0x9F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, // 0xBF + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, // 0xDF + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xEF + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xFF ]; /// Given a first byte, determines how many bytes are in this UTF-8 character. -#[unstable(feature = "str_internals", issue = "0")] +#[unstable(feature = "str_internals", issue = "none")] #[inline] pub fn utf8_char_width(b: u8) -> usize { UTF8_CHAR_WIDTH[b as usize] as usize @@ -1625,7 +1680,9 @@ mod traits { self.as_bytes() == other.as_bytes() } #[inline] - fn ne(&self, other: &str) -> bool { !(*self).eq(other) } + fn ne(&self, other: &str) -> bool { + !(*self).eq(other) + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -1757,9 +1814,11 @@ mod traits { type Output = str; #[inline] fn get(self, slice: &str) -> Option<&Self::Output> { - if self.start <= self.end && - slice.is_char_boundary(self.start) && - slice.is_char_boundary(self.end) { + if self.start <= self.end + && slice.is_char_boundary(self.start) + && slice.is_char_boundary(self.end) + { + // SAFETY: just checked that `start` and `end` are on a char boundary. Some(unsafe { self.get_unchecked(slice) }) } else { None @@ -1767,9 +1826,11 @@ mod traits { } #[inline] fn get_mut(self, slice: &mut str) -> Option<&mut Self::Output> { - if self.start <= self.end && - slice.is_char_boundary(self.start) && - slice.is_char_boundary(self.end) { + if self.start <= self.end + && slice.is_char_boundary(self.start) + && slice.is_char_boundary(self.end) + { + // SAFETY: just checked that `start` and `end` are on a char boundary. Some(unsafe { self.get_unchecked_mut(slice) }) } else { None @@ -1796,9 +1857,11 @@ mod traits { fn index_mut(self, slice: &mut str) -> &mut Self::Output { // is_char_boundary checks that the index is in [0, .len()] // cannot reuse `get` as above, because of NLL trouble - if self.start <= self.end && - slice.is_char_boundary(self.start) && - slice.is_char_boundary(self.end) { + if self.start <= self.end + && slice.is_char_boundary(self.start) + && slice.is_char_boundary(self.end) + { + // SAFETY: just checked that `start` and `end` are on a char boundary. unsafe { self.get_unchecked_mut(slice) } } else { super::slice_error_fail(slice, self.start, self.end) @@ -1827,6 +1890,7 @@ mod traits { #[inline] fn get(self, slice: &str) -> Option<&Self::Output> { if slice.is_char_boundary(self.end) { + // SAFETY: just checked that `end` is on a char boundary. Some(unsafe { self.get_unchecked(slice) }) } else { None @@ -1835,6 +1899,7 @@ mod traits { #[inline] fn get_mut(self, slice: &mut str) -> Option<&mut Self::Output> { if slice.is_char_boundary(self.end) { + // SAFETY: just checked that `end` is on a char boundary. Some(unsafe { self.get_unchecked_mut(slice) }) } else { None @@ -1857,8 +1922,8 @@ mod traits { } #[inline] fn index_mut(self, slice: &mut str) -> &mut Self::Output { - // is_char_boundary checks that the index is in [0, .len()] if slice.is_char_boundary(self.end) { + // SAFETY: just checked that `end` is on a char boundary. unsafe { self.get_unchecked_mut(slice) } } else { super::slice_error_fail(slice, 0, self.end) @@ -1888,6 +1953,7 @@ mod traits { #[inline] fn get(self, slice: &str) -> Option<&Self::Output> { if slice.is_char_boundary(self.start) { + // SAFETY: just checked that `start` is on a char boundary. Some(unsafe { self.get_unchecked(slice) }) } else { None @@ -1896,6 +1962,7 @@ mod traits { #[inline] fn get_mut(self, slice: &mut str) -> Option<&mut Self::Output> { if slice.is_char_boundary(self.start) { + // SAFETY: just checked that `start` is on a char boundary. Some(unsafe { self.get_unchecked_mut(slice) }) } else { None @@ -1920,8 +1987,8 @@ mod traits { } #[inline] fn index_mut(self, slice: &mut str) -> &mut Self::Output { - // is_char_boundary checks that the index is in [0, .len()] if slice.is_char_boundary(self.start) { + // SAFETY: just checked that `start` is on a char boundary. unsafe { self.get_unchecked_mut(slice) } } else { super::slice_error_fail(slice, self.start, slice.len()) @@ -1950,31 +2017,41 @@ mod traits { type Output = str; #[inline] fn get(self, slice: &str) -> Option<&Self::Output> { - if *self.end() == usize::max_value() { None } - else { (*self.start()..self.end()+1).get(slice) } + if *self.end() == usize::max_value() { + None + } else { + (*self.start()..self.end() + 1).get(slice) + } } #[inline] fn get_mut(self, slice: &mut str) -> Option<&mut Self::Output> { - if *self.end() == usize::max_value() { None } - else { (*self.start()..self.end()+1).get_mut(slice) } + if *self.end() == usize::max_value() { + None + } else { + (*self.start()..self.end() + 1).get_mut(slice) + } } #[inline] unsafe fn get_unchecked(self, slice: &str) -> &Self::Output { - (*self.start()..self.end()+1).get_unchecked(slice) + (*self.start()..self.end() + 1).get_unchecked(slice) } #[inline] unsafe fn get_unchecked_mut(self, slice: &mut str) -> &mut Self::Output { - (*self.start()..self.end()+1).get_unchecked_mut(slice) + (*self.start()..self.end() + 1).get_unchecked_mut(slice) } #[inline] fn index(self, slice: &str) -> &Self::Output { - if *self.end() == usize::max_value() { str_index_overflow_fail(); } - (*self.start()..self.end()+1).index(slice) + if *self.end() == usize::max_value() { + str_index_overflow_fail(); + } + (*self.start()..self.end() + 1).index(slice) } #[inline] fn index_mut(self, slice: &mut str) -> &mut Self::Output { - if *self.end() == usize::max_value() { str_index_overflow_fail(); } - (*self.start()..self.end()+1).index_mut(slice) + if *self.end() == usize::max_value() { + str_index_overflow_fail(); + } + (*self.start()..self.end() + 1).index_mut(slice) } } @@ -1997,31 +2074,33 @@ mod traits { type Output = str; #[inline] fn get(self, slice: &str) -> Option<&Self::Output> { - if self.end == usize::max_value() { None } - else { (..self.end+1).get(slice) } + if self.end == usize::max_value() { None } else { (..self.end + 1).get(slice) } } #[inline] fn get_mut(self, slice: &mut str) -> Option<&mut Self::Output> { - if self.end == usize::max_value() { None } - else { (..self.end+1).get_mut(slice) } + if self.end == usize::max_value() { None } else { (..self.end + 1).get_mut(slice) } } #[inline] unsafe fn get_unchecked(self, slice: &str) -> &Self::Output { - (..self.end+1).get_unchecked(slice) + (..self.end + 1).get_unchecked(slice) } #[inline] unsafe fn get_unchecked_mut(self, slice: &mut str) -> &mut Self::Output { - (..self.end+1).get_unchecked_mut(slice) + (..self.end + 1).get_unchecked_mut(slice) } #[inline] fn index(self, slice: &str) -> &Self::Output { - if self.end == usize::max_value() { str_index_overflow_fail(); } - (..self.end+1).index(slice) + if self.end == usize::max_value() { + str_index_overflow_fail(); + } + (..self.end + 1).index(slice) } #[inline] fn index_mut(self, slice: &mut str) -> &mut Self::Output { - if self.end == usize::max_value() { str_index_overflow_fail(); } - (..self.end+1).index_mut(slice) + if self.end == usize::max_value() { + str_index_overflow_fail(); + } + (..self.end + 1).index_mut(slice) } } } @@ -2053,8 +2132,14 @@ fn slice_error_fail(s: &str, begin: usize, end: usize) -> ! { } // 2. begin <= end - assert!(begin <= end, "begin <= end ({} <= {}) when slicing `{}`{}", - begin, end, s_trunc, ellipsis); + assert!( + begin <= end, + "begin <= end ({} <= {}) when slicing `{}`{}", + begin, + end, + s_trunc, + ellipsis + ); // 3. character boundary let index = if !s.is_char_boundary(begin) { begin } else { end }; @@ -2065,9 +2150,11 @@ fn slice_error_fail(s: &str, begin: usize, end: usize) -> ! { } // `char_start` must be less than len and a char boundary let ch = s[char_start..].chars().next().unwrap(); - let char_range = char_start .. char_start + ch.len_utf8(); - panic!("byte index {} is not a char boundary; it is inside {:?} (bytes {:?}) of `{}`{}", - index, ch, char_range, s_trunc, ellipsis); + let char_range = char_start..char_start + ch.len_utf8(); + panic!( + "byte index {} is not a char boundary; it is inside {:?} (bytes {:?}) of `{}`{}", + index, ch, char_range, s_trunc, ellipsis + ); } #[lang = "str"] @@ -2090,7 +2177,7 @@ impl str { /// assert_eq!("ƒoo".chars().count(), 3); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_str_len", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_str_len", since = "1.32.0")] #[inline] pub const fn len(&self) -> usize { self.as_bytes().len() @@ -2111,10 +2198,7 @@ impl str { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr( - not(bootstrap), - rustc_const_stable(feature = "const_str_is_empty", since = "1.32.0"), - )] + #[rustc_const_stable(feature = "const_str_is_empty", since = "1.32.0")] pub const fn is_empty(&self) -> bool { self.len() == 0 } @@ -2149,7 +2233,9 @@ impl str { // 0 and len are always ok. // Test for 0 explicitly so that it can optimize out the check // easily and skip reading string data for that case. - if index == 0 || index == self.len() { return true; } + if index == 0 || index == self.len() { + return true; + } match self.as_bytes().get(index) { None => false, // This is bit magic equivalent to: b < 128 || b >= 192 @@ -2171,9 +2257,8 @@ impl str { /// assert_eq!(b"bors", bytes); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "str_as_bytes", since = "1.32.0"))] + #[rustc_const_stable(feature = "str_as_bytes", since = "1.32.0")] #[inline(always)] - // SAFETY: const sound because we transmute two types with the same layout #[allow(unused_attributes)] #[allow_internal_unstable(const_fn_union)] pub const fn as_bytes(&self) -> &[u8] { @@ -2182,6 +2267,7 @@ impl str { str: &'a str, slice: &'a [u8], } + // SAFETY: const sound because we transmute two types with the same layout unsafe { Slices { str: self }.slice } } @@ -2245,7 +2331,7 @@ impl str { /// let ptr = s.as_ptr(); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "rustc_str_as_ptr", since = "1.32.0"))] + #[rustc_const_stable(feature = "rustc_str_as_ptr", since = "1.32.0")] #[inline] pub const fn as_ptr(&self) -> *const u8 { self as *const str as *const u8 @@ -2328,7 +2414,7 @@ impl str { i.get_mut(self) } - /// Returns a unchecked subslice of `str`. + /// Returns an unchecked subslice of `str`. /// /// This is the unchecked alternative to indexing the `str`. /// @@ -2508,10 +2594,8 @@ impl str { pub fn split_at(&self, mid: usize) -> (&str, &str) { // is_char_boundary checks that the index is in [0, .len()] if self.is_char_boundary(mid) { - unsafe { - (self.get_unchecked(0..mid), - self.get_unchecked(mid..self.len())) - } + // SAFETY: just checked that `mid` is on a char boundary. + unsafe { (self.get_unchecked(0..mid), self.get_unchecked(mid..self.len())) } } else { slice_error_fail(self, 0, mid) } @@ -2555,12 +2639,12 @@ impl str { if self.is_char_boundary(mid) { let len = self.len(); let ptr = self.as_mut_ptr(); + // SAFETY: just checked that `mid` is on a char boundary. unsafe { - (from_utf8_unchecked_mut(slice::from_raw_parts_mut(ptr, mid)), - from_utf8_unchecked_mut(slice::from_raw_parts_mut( - ptr.add(mid), - len - mid - ))) + ( + from_utf8_unchecked_mut(slice::from_raw_parts_mut(ptr, mid)), + from_utf8_unchecked_mut(slice::from_raw_parts_mut(ptr.add(mid), len - mid)), + ) } } else { slice_error_fail(self, 0, mid) @@ -2614,7 +2698,7 @@ impl str { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn chars(&self) -> Chars<'_> { - Chars{iter: self.as_bytes().iter()} + Chars { iter: self.as_bytes().iter() } } /// Returns an iterator over the [`char`]s of a string slice, and their @@ -2778,11 +2862,8 @@ impl str { #[stable(feature = "split_ascii_whitespace", since = "1.34.0")] #[inline] pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_> { - let inner = self - .as_bytes() - .split(IsAsciiWhitespace) - .filter(BytesIsNotEmpty) - .map(UnsafeBytesToStr); + let inner = + self.as_bytes().split(IsAsciiWhitespace).filter(BytesIsNotEmpty).map(UnsafeBytesToStr); SplitAsciiWhitespace { inner } } @@ -3223,10 +3304,7 @@ impl str { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn split_terminator<'a, P: Pattern<'a>>(&'a self, pat: P) -> SplitTerminator<'a, P> { - SplitTerminator(SplitInternal { - allow_trailing_empty: false, - ..self.split(pat).0 - }) + SplitTerminator(SplitInternal { allow_trailing_empty: false, ..self.split(pat).0 }) } /// An iterator over substrings of `self`, separated by characters @@ -3320,10 +3398,7 @@ impl str { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn splitn<'a, P: Pattern<'a>>(&'a self, n: usize, pat: P) -> SplitN<'a, P> { - SplitN(SplitNInternal { - iter: self.split(pat).0, - count: n, - }) + SplitN(SplitNInternal { iter: self.split(pat).0, count: n }) } /// An iterator over substrings of this string slice, separated by a @@ -3665,7 +3740,7 @@ impl str { #[rustc_deprecated( since = "1.33.0", reason = "superseded by `trim_start`", - suggestion = "trim_start", + suggestion = "trim_start" )] pub fn trim_left(&self) -> &str { self.trim_start() @@ -3706,7 +3781,7 @@ impl str { #[rustc_deprecated( since = "1.33.0", reason = "superseded by `trim_end`", - suggestion = "trim_end", + suggestion = "trim_end" )] pub fn trim_right(&self) -> &str { self.trim_end() @@ -3748,15 +3823,13 @@ impl str { if let Some((a, b)) = matcher.next_reject() { i = a; j = b; // Remember earliest known match, correct it below if - // last match is different + // last match is different } if let Some((_, b)) = matcher.next_reject_back() { j = b; } - unsafe { - // Searcher is known to return valid indices - self.get_unchecked(i..j) - } + // SAFETY: `Searcher` is known to return valid indices. + unsafe { self.get_unchecked(i..j) } } /// Returns a string slice with all prefixes that match a pattern @@ -3792,10 +3865,8 @@ impl str { if let Some((a, _)) = matcher.next_reject() { i = a; } - unsafe { - // Searcher is known to return valid indices - self.get_unchecked(i..self.len()) - } + // SAFETY: `Searcher` is known to return valid indices. + unsafe { self.get_unchecked(i..self.len()) } } /// Returns a string slice with the prefix removed. @@ -3821,12 +3892,13 @@ impl str { pub fn strip_prefix<'a, P: Pattern<'a>>(&'a self, prefix: P) -> Option<&'a str> { let mut matcher = prefix.into_searcher(self); if let SearchStep::Match(start, len) = matcher.next() { - debug_assert_eq!(start, 0, "The first search step from Searcher \ - must include the first character"); - unsafe { - // Searcher is known to return valid indices. - Some(self.get_unchecked(len..)) - } + debug_assert_eq!( + start, 0, + "The first search step from Searcher \ + must include the first character" + ); + // SAFETY: `Searcher` is known to return valid indices. + unsafe { Some(self.get_unchecked(len..)) } } else { None } @@ -3858,12 +3930,14 @@ impl str { { let mut matcher = suffix.into_searcher(self); if let SearchStep::Match(start, end) = matcher.next_back() { - debug_assert_eq!(end, self.len(), "The first search step from ReverseSearcher \ - must include the last character"); - unsafe { - // Searcher is known to return valid indices. - Some(self.get_unchecked(..start)) - } + debug_assert_eq!( + end, + self.len(), + "The first search step from ReverseSearcher \ + must include the last character" + ); + // SAFETY: `Searcher` is known to return valid indices. + unsafe { Some(self.get_unchecked(..start)) } } else { None } @@ -3911,10 +3985,8 @@ impl str { if let Some((_, b)) = matcher.next_reject_back() { j = b; } - unsafe { - // Searcher is known to return valid indices - self.get_unchecked(0..j) - } + // SAFETY: `Searcher` is known to return valid indices. + unsafe { self.get_unchecked(0..j) } } /// Returns a string slice with all prefixes that match a pattern @@ -3947,7 +4019,7 @@ impl str { #[rustc_deprecated( since = "1.33.0", reason = "superseded by `trim_start_matches`", - suggestion = "trim_start_matches", + suggestion = "trim_start_matches" )] pub fn trim_left_matches<'a, P: Pattern<'a>>(&'a self, pat: P) -> &'a str { self.trim_start_matches(pat) @@ -3989,7 +4061,7 @@ impl str { #[rustc_deprecated( since = "1.33.0", reason = "superseded by `trim_end_matches`", - suggestion = "trim_end_matches", + suggestion = "trim_end_matches" )] pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where @@ -4107,6 +4179,7 @@ impl str { /// ``` #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] pub fn make_ascii_uppercase(&mut self) { + // SAFETY: safe because we transmute two types with the same layout. let me = unsafe { self.as_bytes_mut() }; me.make_ascii_uppercase() } @@ -4132,6 +4205,7 @@ impl str { /// ``` #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] pub fn make_ascii_lowercase(&mut self) { + // SAFETY: safe because we transmute two types with the same layout. let me = unsafe { self.as_bytes_mut() }; me.make_ascii_lowercase() } @@ -4176,11 +4250,12 @@ impl str { pub fn escape_debug(&self) -> EscapeDebug<'_> { let mut chars = self.chars(); EscapeDebug { - inner: chars.next() + inner: chars + .next() .map(|first| first.escape_debug_ext(true)) .into_iter() .flatten() - .chain(chars.flat_map(CharEscapeDebugContinue)) + .chain(chars.flat_map(CharEscapeDebugContinue)), } } @@ -4288,13 +4363,18 @@ impl AsRef<[u8]> for str { #[stable(feature = "rust1", since = "1.0.0")] impl Default for &str { /// Creates an empty str - fn default() -> Self { "" } + fn default() -> Self { + "" + } } #[stable(feature = "default_mut_str", since = "1.28.0")] impl Default for &mut str { /// Creates an empty mutable str - fn default() -> Self { unsafe { from_utf8_unchecked_mut(&mut []) } } + fn default() -> Self { + // SAFETY: The empty string is valid UTF-8. + unsafe { from_utf8_unchecked_mut(&mut []) } + } } /// An iterator over the non-whitespace substrings of a string, @@ -4348,6 +4428,7 @@ impl_fn_for_zst! { #[derive(Clone)] struct UnsafeBytesToStr impl<'a> Fn = |bytes: &'a [u8]| -> &'a str { + // SAFETY: not safe unsafe { from_utf8_unchecked(bytes) } }; } @@ -4480,7 +4561,7 @@ impl FusedIterator for EncodeUtf16<'_> {} pub struct EscapeDebug<'a> { inner: Chain< Flatten>, - FlatMap, char::EscapeDebug, CharEscapeDebugContinue> + FlatMap, char::EscapeDebug, CharEscapeDebugContinue>, >, } diff --git a/src/libcore/str/pattern.rs b/src/libcore/str/pattern.rs index b7ebd5f88b..ef64d8b0fd 100644 --- a/src/libcore/str/pattern.rs +++ b/src/libcore/str/pattern.rs @@ -3,11 +3,11 @@ //! For more details, see the traits [`Pattern`], [`Searcher`], //! [`ReverseSearcher`], and [`DoubleEndedSearcher`]. -// ignore-tidy-undocumented-unsafe - -#![unstable(feature = "pattern", - reason = "API not fully fleshed out and ready to be stabilized", - issue = "27721")] +#![unstable( + feature = "pattern", + reason = "API not fully fleshed out and ready to be stabilized", + issue = "27721" +)] use crate::cmp; use crate::fmt; @@ -44,21 +44,16 @@ pub trait Pattern<'a>: Sized { /// Checks whether the pattern matches at the front of the haystack #[inline] fn is_prefix_of(self, haystack: &'a str) -> bool { - match self.into_searcher(haystack).next() { - SearchStep::Match(0, _) => true, - _ => false, - } + matches!(self.into_searcher(haystack).next(), SearchStep::Match(0, _)) } /// Checks whether the pattern matches at the back of the haystack #[inline] fn is_suffix_of(self, haystack: &'a str) -> bool - where Self::Searcher: ReverseSearcher<'a> + where + Self::Searcher: ReverseSearcher<'a>, { - match self.into_searcher(haystack).next_back() { - SearchStep::Match(_, j) if haystack.len() == j => true, - _ => false, - } + matches!(self.into_searcher(haystack).next_back(), SearchStep::Match(_, j) if haystack.len() == j) } } @@ -78,7 +73,7 @@ pub enum SearchStep { Reject(usize, usize), /// Expresses that every byte of the haystack has been visited, ending /// the iteration. - Done + Done, } /// A searcher for a string pattern. @@ -189,7 +184,7 @@ pub unsafe trait ReverseSearcher<'a>: Searcher<'a> { /// Finds the next `Match` result. See `next_back()` #[inline] - fn next_match_back(&mut self) -> Option<(usize, usize)>{ + fn next_match_back(&mut self) -> Option<(usize, usize)> { loop { match self.next_back() { SearchStep::Match(a, b) => return Some((a, b)), @@ -201,7 +196,7 @@ pub unsafe trait ReverseSearcher<'a>: Searcher<'a> { /// Finds the next `Reject` result. See `next_back()` #[inline] - fn next_reject_back(&mut self) -> Option<(usize, usize)>{ + fn next_reject_back(&mut self) -> Option<(usize, usize)> { loop { match self.next_back() { SearchStep::Reject(a, b) => return Some((a, b)), @@ -235,7 +230,6 @@ pub unsafe trait ReverseSearcher<'a>: Searcher<'a> { /// `"[aa]a"` or `"a[aa]"`, depending from which side it is searched. pub trait DoubleEndedSearcher<'a>: ReverseSearcher<'a> {} - ///////////////////////////////////////////////////////////////////////////// // Impl for char ///////////////////////////////////////////////////////////////////////////// @@ -247,7 +241,6 @@ pub struct CharSearcher<'a> { // safety invariant: `finger`/`finger_back` must be a valid utf8 byte index of `haystack` // This invariant can be broken *within* next_match and next_match_back, however // they must exit with fingers on valid code point boundaries. - /// `finger` is the current byte index of the forward search. /// Imagine that it exists before the byte at its index, i.e. /// `haystack[finger]` is the first byte of the slice we must inspect during @@ -276,6 +269,14 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> { #[inline] fn next(&mut self) -> SearchStep { let old_finger = self.finger; + // SAFETY: 1-4 guarantee safety of `get_unchecked` + // 1. `self.finger` and `self.finger_back` are kept on unicode boundaries + // (this is invariant) + // 2. `self.finger >= 0` since it starts at 0 and only increases + // 3. `self.finger < self.finger_back` because otherwise the char `iter` + // would return `SearchStep::Done` + // 4. `self.finger` comes before the end of the haystack because `self.finger_back` + // starts at the end and only decreases let slice = unsafe { self.haystack.get_unchecked(old_finger..self.finger_back) }; let mut iter = slice.chars(); let old_len = iter.iter.len(); @@ -298,6 +299,7 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> { // get the haystack after the last character found let bytes = self.haystack.as_bytes().get(self.finger..self.finger_back)?; // the last byte of the utf8 encoded needle + // SAFETY: we have an invariant that `utf8_size < 5` let last_byte = unsafe { *self.utf8_encoded.get_unchecked(self.utf8_size - 1) }; if let Some(index) = memchr::memchr(last_byte, bytes) { // The new finger is the index of the byte we found, @@ -341,6 +343,7 @@ unsafe impl<'a> ReverseSearcher<'a> for CharSearcher<'a> { #[inline] fn next_back(&mut self) -> SearchStep { let old_finger = self.finger_back; + // SAFETY: see the comment for next() above let slice = unsafe { self.haystack.get_unchecked(self.finger..old_finger) }; let mut iter = slice.chars(); let old_len = iter.iter.len(); @@ -368,6 +371,7 @@ unsafe impl<'a> ReverseSearcher<'a> for CharSearcher<'a> { return None; }; // the last byte of the utf8 encoded needle + // SAFETY: we have an invariant that `utf8_size < 5` let last_byte = unsafe { *self.utf8_encoded.get_unchecked(self.utf8_size - 1) }; if let Some(index) = memchr::memrchr(last_byte, bytes) { // we searched a slice that was offset by self.finger, @@ -429,7 +433,7 @@ impl<'a> Pattern<'a> for char { finger_back: haystack.len(), needle: self, utf8_size, - utf8_encoded + utf8_encoded, } } @@ -449,7 +453,9 @@ impl<'a> Pattern<'a> for char { } #[inline] - fn is_suffix_of(self, haystack: &'a str) -> bool where Self::Searcher: ReverseSearcher<'a> + fn is_suffix_of(self, haystack: &'a str) -> bool + where + Self::Searcher: ReverseSearcher<'a>, { self.encode_utf8(&mut [0u8; 4]).is_suffix_of(haystack) } @@ -464,15 +470,20 @@ trait MultiCharEq { fn matches(&mut self, c: char) -> bool; } -impl MultiCharEq for F where F: FnMut(char) -> bool { +impl MultiCharEq for F +where + F: FnMut(char) -> bool, +{ #[inline] - fn matches(&mut self, c: char) -> bool { (*self)(c) } + fn matches(&mut self, c: char) -> bool { + (*self)(c) + } } impl MultiCharEq for &[char] { #[inline] fn matches(&mut self, c: char) -> bool { - self.iter().any(|&m| { m == c }) + self.iter().any(|&m| m == c) } } @@ -490,11 +501,7 @@ impl<'a, C: MultiCharEq> Pattern<'a> for MultiCharEqPattern { #[inline] fn into_searcher(self, haystack: &'a str) -> MultiCharEqSearcher<'a, C> { - MultiCharEqSearcher { - haystack, - char_eq: self.0, - char_indices: haystack.char_indices(), - } + MultiCharEqSearcher { haystack, char_eq: self.0, char_indices: haystack.char_indices() } } } @@ -642,10 +649,12 @@ impl<'a, 'b> Pattern<'a> for &'b [char] { /// Associated type for `>::Searcher`. #[derive(Clone)] pub struct CharPredicateSearcher<'a, F>( as Pattern<'a>>::Searcher) - where F: FnMut(char) -> bool; +where + F: FnMut(char) -> bool; impl fmt::Debug for CharPredicateSearcher<'_, F> - where F: FnMut(char) -> bool +where + F: FnMut(char) -> bool, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("CharPredicateSearcher") @@ -655,22 +664,26 @@ impl fmt::Debug for CharPredicateSearcher<'_, F> } } unsafe impl<'a, F> Searcher<'a> for CharPredicateSearcher<'a, F> - where F: FnMut(char) -> bool +where + F: FnMut(char) -> bool, { searcher_methods!(forward); } unsafe impl<'a, F> ReverseSearcher<'a> for CharPredicateSearcher<'a, F> - where F: FnMut(char) -> bool +where + F: FnMut(char) -> bool, { searcher_methods!(reverse); } -impl<'a, F> DoubleEndedSearcher<'a> for CharPredicateSearcher<'a, F> - where F: FnMut(char) -> bool {} +impl<'a, F> DoubleEndedSearcher<'a> for CharPredicateSearcher<'a, F> where F: FnMut(char) -> bool {} /// Searches for chars that match the given predicate -impl<'a, F> Pattern<'a> for F where F: FnMut(char) -> bool { +impl<'a, F> Pattern<'a> for F +where + F: FnMut(char) -> bool, +{ pattern_methods!(CharPredicateSearcher<'a, F>, MultiCharEqPattern, CharPredicateSearcher); } @@ -712,7 +725,6 @@ impl<'a, 'b> Pattern<'a> for &'b str { } } - ///////////////////////////////////////////////////////////////////////////// // Two Way substring searcher ///////////////////////////////////////////////////////////////////////////// @@ -757,9 +769,10 @@ impl<'a, 'b> StrSearcher<'a, 'b> { StrSearcher { haystack, needle, - searcher: StrSearcherImpl::TwoWay( - TwoWaySearcher::new(needle.as_bytes(), haystack.len()) - ), + searcher: StrSearcherImpl::TwoWay(TwoWaySearcher::new( + needle.as_bytes(), + haystack.len(), + )), } } } @@ -798,10 +811,11 @@ unsafe impl<'a, 'b> Searcher<'a> for StrSearcher<'a, 'b> { return SearchStep::Done; } let is_long = searcher.memory == usize::MAX; - match searcher.next::(self.haystack.as_bytes(), - self.needle.as_bytes(), - is_long) - { + match searcher.next::( + self.haystack.as_bytes(), + self.needle.as_bytes(), + is_long, + ) { SearchStep::Reject(a, mut b) => { // skip to next char boundary while !self.haystack.is_char_boundary(b) { @@ -819,27 +833,29 @@ unsafe impl<'a, 'b> Searcher<'a> for StrSearcher<'a, 'b> { #[inline] fn next_match(&mut self) -> Option<(usize, usize)> { match self.searcher { - StrSearcherImpl::Empty(..) => { - loop { - match self.next() { - SearchStep::Match(a, b) => return Some((a, b)), - SearchStep::Done => return None, - SearchStep::Reject(..) => { } - } + StrSearcherImpl::Empty(..) => loop { + match self.next() { + SearchStep::Match(a, b) => return Some((a, b)), + SearchStep::Done => return None, + SearchStep::Reject(..) => {} } - } + }, StrSearcherImpl::TwoWay(ref mut searcher) => { let is_long = searcher.memory == usize::MAX; // write out `true` and `false` cases to encourage the compiler // to specialize the two cases separately. if is_long { - searcher.next::(self.haystack.as_bytes(), - self.needle.as_bytes(), - true) + searcher.next::( + self.haystack.as_bytes(), + self.needle.as_bytes(), + true, + ) } else { - searcher.next::(self.haystack.as_bytes(), - self.needle.as_bytes(), - false) + searcher.next::( + self.haystack.as_bytes(), + self.needle.as_bytes(), + false, + ) } } } @@ -868,10 +884,11 @@ unsafe impl<'a, 'b> ReverseSearcher<'a> for StrSearcher<'a, 'b> { return SearchStep::Done; } let is_long = searcher.memory == usize::MAX; - match searcher.next_back::(self.haystack.as_bytes(), - self.needle.as_bytes(), - is_long) - { + match searcher.next_back::( + self.haystack.as_bytes(), + self.needle.as_bytes(), + is_long, + ) { SearchStep::Reject(mut a, b) => { // skip to next char boundary while !self.haystack.is_char_boundary(a) { @@ -889,26 +906,28 @@ unsafe impl<'a, 'b> ReverseSearcher<'a> for StrSearcher<'a, 'b> { #[inline] fn next_match_back(&mut self) -> Option<(usize, usize)> { match self.searcher { - StrSearcherImpl::Empty(..) => { - loop { - match self.next_back() { - SearchStep::Match(a, b) => return Some((a, b)), - SearchStep::Done => return None, - SearchStep::Reject(..) => { } - } + StrSearcherImpl::Empty(..) => loop { + match self.next_back() { + SearchStep::Match(a, b) => return Some((a, b)), + SearchStep::Done => return None, + SearchStep::Reject(..) => {} } - } + }, StrSearcherImpl::TwoWay(ref mut searcher) => { let is_long = searcher.memory == usize::MAX; // write out `true` and `false`, like `next_match` if is_long { - searcher.next_back::(self.haystack.as_bytes(), - self.needle.as_bytes(), - true) + searcher.next_back::( + self.haystack.as_bytes(), + self.needle.as_bytes(), + true, + ) } else { - searcher.next_back::(self.haystack.as_bytes(), - self.needle.as_bytes(), - false) + searcher.next_back::( + self.haystack.as_bytes(), + self.needle.as_bytes(), + false, + ) } } } @@ -1016,12 +1035,11 @@ impl TwoWaySearcher { let (crit_pos_false, period_false) = TwoWaySearcher::maximal_suffix(needle, false); let (crit_pos_true, period_true) = TwoWaySearcher::maximal_suffix(needle, true); - let (crit_pos, period) = - if crit_pos_false > crit_pos_true { - (crit_pos_false, period_false) - } else { - (crit_pos_true, period_true) - }; + let (crit_pos, period) = if crit_pos_false > crit_pos_true { + (crit_pos_false, period_false) + } else { + (crit_pos_true, period_true) + }; // A particularly readable explanation of what's going on here can be found // in Crochemore and Rytter's book "Text Algorithms", ch 13. Specifically @@ -1032,7 +1050,7 @@ impl TwoWaySearcher { // &v[..period]. If it is, we use "Algorithm CP1". Otherwise we use // "Algorithm CP2", which is optimized for when the period of the needle // is large. - if &needle[..crit_pos] == &needle[period.. period + crit_pos] { + if &needle[..crit_pos] == &needle[period..period + crit_pos] { // short period case -- the period is exact // compute a separate critical factorization for the reversed needle // x = u' v' where |v'| < period(x). @@ -1042,9 +1060,11 @@ impl TwoWaySearcher { // (crit_pos = 1, period = 3) while being factored with approximate // period in reverse (crit_pos = 2, period = 2). We use the given // reverse factorization but keep the exact period. - let crit_pos_back = needle.len() - cmp::max( - TwoWaySearcher::reverse_maximal_suffix(needle, period, false), - TwoWaySearcher::reverse_maximal_suffix(needle, period, true)); + let crit_pos_back = needle.len() + - cmp::max( + TwoWaySearcher::reverse_maximal_suffix(needle, period, false), + TwoWaySearcher::reverse_maximal_suffix(needle, period, true), + ); TwoWaySearcher { crit_pos, @@ -1095,9 +1115,9 @@ impl TwoWaySearcher { // How far we can jump when we encounter a mismatch is all based on the fact // that (u, v) is a critical factorization for the needle. #[inline] - fn next(&mut self, haystack: &[u8], needle: &[u8], long_period: bool) - -> S::Output - where S: TwoWayStrategy + fn next(&mut self, haystack: &[u8], needle: &[u8], long_period: bool) -> S::Output + where + S: TwoWayStrategy, { // `next()` uses `self.position` as its cursor let old_pos = self.position; @@ -1128,8 +1148,8 @@ impl TwoWaySearcher { } // See if the right part of the needle matches - let start = if long_period { self.crit_pos } - else { cmp::max(self.crit_pos, self.memory) }; + let start = + if long_period { self.crit_pos } else { cmp::max(self.crit_pos, self.memory) }; for i in start..needle.len() { if needle[i] != haystack[self.position + i] { self.position += i - self.crit_pos + 1; @@ -1178,9 +1198,9 @@ impl TwoWaySearcher { // To search in reverse through the haystack, we search forward through // a reversed haystack with a reversed needle, matching first u' and then v'. #[inline] - fn next_back(&mut self, haystack: &[u8], needle: &[u8], long_period: bool) - -> S::Output - where S: TwoWayStrategy + fn next_back(&mut self, haystack: &[u8], needle: &[u8], long_period: bool) -> S::Output + where + S: TwoWayStrategy, { // `next_back()` uses `self.end` as its cursor -- so that `next()` and `next_back()` // are independent. @@ -1212,8 +1232,11 @@ impl TwoWaySearcher { } // See if the left part of the needle matches - let crit = if long_period { self.crit_pos_back } - else { cmp::min(self.crit_pos_back, self.memory_back) }; + let crit = if long_period { + self.crit_pos_back + } else { + cmp::min(self.crit_pos_back, self.memory_back) + }; for i in (0..crit).rev() { if needle[i] != haystack[self.end - needle.len() + i] { self.end -= self.crit_pos_back - i; @@ -1225,8 +1248,7 @@ impl TwoWaySearcher { } // See if the right part of the needle matches - let needle_end = if long_period { needle.len() } - else { self.memory_back }; + let needle_end = if long_period { needle.len() } else { self.memory_back }; for i in self.crit_pos_back..needle_end { if needle[i] != haystack[self.end - needle.len() + i] { self.end -= self.period; @@ -1266,7 +1288,7 @@ impl TwoWaySearcher { let mut left = 0; // Corresponds to i in the paper let mut right = 1; // Corresponds to j in the paper let mut offset = 0; // Corresponds to k in the paper, but starting at 0 - // to match 0-based indexing. + // to match 0-based indexing. let mut period = 1; // Corresponds to p in the paper while let Some(&a) = arr.get(right + offset) { @@ -1308,13 +1330,11 @@ impl TwoWaySearcher { // a critical factorization. // // For long period cases, the resulting period is not exact (it is too short). - fn reverse_maximal_suffix(arr: &[u8], known_period: usize, - order_greater: bool) -> usize - { + fn reverse_maximal_suffix(arr: &[u8], known_period: usize, order_greater: bool) -> usize { let mut left = 0; // Corresponds to i in the paper let mut right = 1; // Corresponds to j in the paper let mut offset = 0; // Corresponds to k in the paper, but starting at 0 - // to match 0-based indexing. + // to match 0-based indexing. let mut period = 1; // Corresponds to p in the paper let n = arr.len(); @@ -1360,29 +1380,41 @@ trait TwoWayStrategy { } /// Skip to match intervals as quickly as possible -enum MatchOnly { } +enum MatchOnly {} impl TwoWayStrategy for MatchOnly { type Output = Option<(usize, usize)>; #[inline] - fn use_early_reject() -> bool { false } + fn use_early_reject() -> bool { + false + } #[inline] - fn rejecting(_a: usize, _b: usize) -> Self::Output { None } + fn rejecting(_a: usize, _b: usize) -> Self::Output { + None + } #[inline] - fn matching(a: usize, b: usize) -> Self::Output { Some((a, b)) } + fn matching(a: usize, b: usize) -> Self::Output { + Some((a, b)) + } } /// Emit Rejects regularly -enum RejectAndMatch { } +enum RejectAndMatch {} impl TwoWayStrategy for RejectAndMatch { type Output = SearchStep; #[inline] - fn use_early_reject() -> bool { true } + fn use_early_reject() -> bool { + true + } #[inline] - fn rejecting(a: usize, b: usize) -> Self::Output { SearchStep::Reject(a, b) } + fn rejecting(a: usize, b: usize) -> Self::Output { + SearchStep::Reject(a, b) + } #[inline] - fn matching(a: usize, b: usize) -> Self::Output { SearchStep::Match(a, b) } + fn matching(a: usize, b: usize) -> Self::Output { + SearchStep::Match(a, b) + } } diff --git a/src/libcore/sync/atomic.rs b/src/libcore/sync/atomic.rs index d5b0bc4203..9d449bb991 100644 --- a/src/libcore/sync/atomic.rs +++ b/src/libcore/sync/atomic.rs @@ -112,17 +112,15 @@ //! println!("live threads: {}", old_thread_count + 1); //! ``` -// ignore-tidy-undocumented-unsafe - #![stable(feature = "rust1", since = "1.0.0")] #![cfg_attr(not(target_has_atomic_load_store = "8"), allow(dead_code))] #![cfg_attr(not(target_has_atomic_load_store = "8"), allow(unused_imports))] use self::Ordering::*; -use crate::intrinsics; use crate::cell::UnsafeCell; use crate::fmt; +use crate::intrinsics; use crate::hint::spin_loop; @@ -134,16 +132,10 @@ use crate::hint::spin_loop; /// This function is different from [`std::thread::yield_now`] which directly yields to the /// system's scheduler, whereas `spin_loop_hint` does not interact with the operating system. /// -/// Spin locks can be very efficient for short lock durations because they do not involve context -/// switches or interaction with the operating system. For long lock durations they become wasteful -/// however because they use CPU cycles for the entire lock duration, and using a -/// [`std::sync::Mutex`] is likely the better approach. If actively spinning for a long time is -/// required, e.g. because code polls a non-blocking API, calling [`std::thread::yield_now`] -/// or [`std::thread::sleep`] may be the best option. -/// -/// **Note**: Spin locks are based on the underlying assumption that another thread will release -/// the lock 'soon'. In order for this to work, that other thread must run on a different CPU or -/// core (at least potentially). Spin locks do not work efficiently on single CPU / core platforms. +/// A common use case for `spin_loop_hint` is implementing bounded optimistic spinning in a CAS +/// loop in synchronization primitives. To avoid problems like priority inversion, it is strongly +/// recommended that the spin loop is terminated after a finite amount of iterations and an +/// appropriate blocking syscall is made. /// /// **Note**: On platforms that do not support receiving spin-loop hints this function does not /// do anything at all. @@ -313,7 +305,7 @@ pub enum Ordering { #[rustc_deprecated( since = "1.34.0", reason = "the `new` function is now preferred", - suggestion = "AtomicBool::new(false)", + suggestion = "AtomicBool::new(false)" )] pub const ATOMIC_BOOL_INIT: AtomicBool = AtomicBool::new(false); @@ -331,7 +323,7 @@ impl AtomicBool { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_atomic_new", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_atomic_new", since = "1.32.0")] pub const fn new(v: bool) -> AtomicBool { AtomicBool { v: UnsafeCell::new(v as u8) } } @@ -356,6 +348,7 @@ impl AtomicBool { #[inline] #[stable(feature = "atomic_access", since = "1.15.0")] pub fn get_mut(&mut self) -> &mut bool { + // SAFETY: the mutable reference guarantees unique ownership. unsafe { &mut *(self.v.get() as *mut bool) } } @@ -406,6 +399,8 @@ impl AtomicBool { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn load(&self, order: Ordering) -> bool { + // SAFETY: any data races are prevented by atomic intrinsics and the raw + // pointer passed in is valid because we got it from a reference. unsafe { atomic_load(self.v.get(), order) != 0 } } @@ -438,6 +433,8 @@ impl AtomicBool { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn store(&self, val: bool, order: Ordering) { + // SAFETY: any data races are prevented by atomic intrinsics and the raw + // pointer passed in is valid because we got it from a reference. unsafe { atomic_store(self.v.get(), val as u8, order); } @@ -469,6 +466,7 @@ impl AtomicBool { #[stable(feature = "rust1", since = "1.0.0")] #[cfg(target_has_atomic = "8")] pub fn swap(&self, val: bool, order: Ordering) -> bool { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_swap(self.v.get(), val as u8, order) != 0 } } @@ -557,12 +555,14 @@ impl AtomicBool { #[inline] #[stable(feature = "extended_compare_and_swap", since = "1.10.0")] #[cfg(target_has_atomic = "8")] - pub fn compare_exchange(&self, - current: bool, - new: bool, - success: Ordering, - failure: Ordering) - -> Result { + pub fn compare_exchange( + &self, + current: bool, + new: bool, + success: Ordering, + failure: Ordering, + ) -> Result { + // SAFETY: data races are prevented by atomic intrinsics. match unsafe { atomic_compare_exchange(self.v.get(), current as u8, new as u8, success, failure) } { @@ -613,12 +613,14 @@ impl AtomicBool { #[inline] #[stable(feature = "extended_compare_and_swap", since = "1.10.0")] #[cfg(target_has_atomic = "8")] - pub fn compare_exchange_weak(&self, - current: bool, - new: bool, - success: Ordering, - failure: Ordering) - -> Result { + pub fn compare_exchange_weak( + &self, + current: bool, + new: bool, + success: Ordering, + failure: Ordering, + ) -> Result { + // SAFETY: data races are prevented by atomic intrinsics. match unsafe { atomic_compare_exchange_weak(self.v.get(), current as u8, new as u8, success, failure) } { @@ -665,6 +667,7 @@ impl AtomicBool { #[stable(feature = "rust1", since = "1.0.0")] #[cfg(target_has_atomic = "8")] pub fn fetch_and(&self, val: bool, order: Ordering) -> bool { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_and(self.v.get(), val as u8, order) != 0 } } @@ -760,6 +763,7 @@ impl AtomicBool { #[stable(feature = "rust1", since = "1.0.0")] #[cfg(target_has_atomic = "8")] pub fn fetch_or(&self, val: bool, order: Ordering) -> bool { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_or(self.v.get(), val as u8, order) != 0 } } @@ -801,6 +805,7 @@ impl AtomicBool { #[stable(feature = "rust1", since = "1.0.0")] #[cfg(target_has_atomic = "8")] pub fn fetch_xor(&self, val: bool, order: Ordering) -> bool { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_xor(self.v.get(), val as u8, order) != 0 } } @@ -834,9 +839,7 @@ impl AtomicBool { /// # } /// ``` #[inline] - #[unstable(feature = "atomic_mut_ptr", - reason = "recently added", - issue = "66893")] + #[unstable(feature = "atomic_mut_ptr", reason = "recently added", issue = "66893")] pub fn as_mut_ptr(&self) -> *mut bool { self.v.get() as *mut bool } @@ -856,7 +859,7 @@ impl AtomicPtr { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_atomic_new", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_atomic_new", since = "1.32.0")] pub const fn new(p: *mut T) -> AtomicPtr { AtomicPtr { p: UnsafeCell::new(p) } } @@ -878,6 +881,7 @@ impl AtomicPtr { #[inline] #[stable(feature = "atomic_access", since = "1.15.0")] pub fn get_mut(&mut self) -> &mut *mut T { + // SAFETY: the mutable reference guarantees unique ownership. unsafe { &mut *self.p.get() } } @@ -929,6 +933,7 @@ impl AtomicPtr { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn load(&self, order: Ordering) -> *mut T { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_load(self.p.get() as *mut usize, order) as *mut T } } @@ -963,6 +968,7 @@ impl AtomicPtr { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn store(&self, ptr: *mut T, order: Ordering) { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_store(self.p.get() as *mut usize, ptr as usize, order); } @@ -996,6 +1002,7 @@ impl AtomicPtr { #[stable(feature = "rust1", since = "1.0.0")] #[cfg(target_has_atomic = "ptr")] pub fn swap(&self, ptr: *mut T, order: Ordering) -> *mut T { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_swap(self.p.get() as *mut usize, ptr as usize, order) as *mut T } } @@ -1073,18 +1080,22 @@ impl AtomicPtr { #[inline] #[stable(feature = "extended_compare_and_swap", since = "1.10.0")] #[cfg(target_has_atomic = "ptr")] - pub fn compare_exchange(&self, - current: *mut T, - new: *mut T, - success: Ordering, - failure: Ordering) - -> Result<*mut T, *mut T> { + pub fn compare_exchange( + &self, + current: *mut T, + new: *mut T, + success: Ordering, + failure: Ordering, + ) -> Result<*mut T, *mut T> { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { - let res = atomic_compare_exchange(self.p.get() as *mut usize, - current as usize, - new as usize, - success, - failure); + let res = atomic_compare_exchange( + self.p.get() as *mut usize, + current as usize, + new as usize, + success, + failure, + ); match res { Ok(x) => Ok(x as *mut T), Err(x) => Err(x as *mut T), @@ -1133,18 +1144,22 @@ impl AtomicPtr { #[inline] #[stable(feature = "extended_compare_and_swap", since = "1.10.0")] #[cfg(target_has_atomic = "ptr")] - pub fn compare_exchange_weak(&self, - current: *mut T, - new: *mut T, - success: Ordering, - failure: Ordering) - -> Result<*mut T, *mut T> { + pub fn compare_exchange_weak( + &self, + current: *mut T, + new: *mut T, + success: Ordering, + failure: Ordering, + ) -> Result<*mut T, *mut T> { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { - let res = atomic_compare_exchange_weak(self.p.get() as *mut usize, - current as usize, - new as usize, - success, - failure); + let res = atomic_compare_exchange_weak( + self.p.get() as *mut usize, + current as usize, + new as usize, + success, + failure, + ); match res { Ok(x) => Ok(x as *mut T), Err(x) => Err(x as *mut T), @@ -1166,14 +1181,18 @@ impl From for AtomicBool { /// assert_eq!(format!("{:?}", atomic_bool), "true") /// ``` #[inline] - fn from(b: bool) -> Self { Self::new(b) } + fn from(b: bool) -> Self { + Self::new(b) + } } #[cfg(target_has_atomic_load_store = "ptr")] #[stable(feature = "atomic_from", since = "1.23.0")] impl From<*mut T> for AtomicPtr { #[inline] - fn from(p: *mut T) -> Self { Self::new(p) } + fn from(p: *mut T) -> Self { + Self::new(p) + } } #[cfg(target_has_atomic_load_store = "8")] @@ -1261,7 +1280,7 @@ let atomic_forty_two = ", stringify!($atomic_type), "::new(42); ```"), #[inline] #[$stable] - #[cfg_attr(not(bootstrap), $const_stable)] + #[$const_stable] pub const fn new(v: $int_type) -> Self { Self {v: UnsafeCell::new(v)} } @@ -1286,6 +1305,7 @@ assert_eq!(some_var.load(Ordering::SeqCst), 5); #[inline] #[$stable_access] pub fn get_mut(&mut self) -> &mut $int_type { + // SAFETY: the mutable reference guarantees unique ownership. unsafe { &mut *self.v.get() } } } @@ -1340,6 +1360,7 @@ assert_eq!(some_var.load(Ordering::Relaxed), 5); #[inline] #[$stable] pub fn load(&self, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_load(self.v.get(), order) } } } @@ -1374,6 +1395,7 @@ assert_eq!(some_var.load(Ordering::Relaxed), 10); #[inline] #[$stable] pub fn store(&self, val: $int_type, order: Ordering) { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_store(self.v.get(), val, order); } } } @@ -1404,6 +1426,7 @@ assert_eq!(some_var.swap(10, Ordering::Relaxed), 5); #[$stable] #[$cfg_cas] pub fn swap(&self, val: $int_type, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_swap(self.v.get(), val, order) } } } @@ -1506,6 +1529,7 @@ assert_eq!(some_var.load(Ordering::Relaxed), 10); new: $int_type, success: Ordering, failure: Ordering) -> Result<$int_type, $int_type> { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_compare_exchange(self.v.get(), current, new, success, failure) } } } @@ -1558,6 +1582,7 @@ loop { new: $int_type, success: Ordering, failure: Ordering) -> Result<$int_type, $int_type> { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_compare_exchange_weak(self.v.get(), current, new, success, failure) } @@ -1592,6 +1617,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 10); #[$stable] #[$cfg_cas] pub fn fetch_add(&self, val: $int_type, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_add(self.v.get(), val, order) } } } @@ -1624,6 +1650,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 10); #[$stable] #[$cfg_cas] pub fn fetch_sub(&self, val: $int_type, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_sub(self.v.get(), val, order) } } } @@ -1659,6 +1686,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 0b100001); #[$stable] #[$cfg_cas] pub fn fetch_and(&self, val: $int_type, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_and(self.v.get(), val, order) } } } @@ -1695,6 +1723,7 @@ assert_eq!(foo.load(Ordering::SeqCst), !(0x13 & 0x31)); #[$stable_nand] #[$cfg_cas] pub fn fetch_nand(&self, val: $int_type, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_nand(self.v.get(), val, order) } } } @@ -1730,6 +1759,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 0b111111); #[$stable] #[$cfg_cas] pub fn fetch_or(&self, val: $int_type, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_or(self.v.get(), val, order) } } } @@ -1765,6 +1795,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 0b011110); #[$stable] #[$cfg_cas] pub fn fetch_xor(&self, val: $int_type, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { atomic_xor(self.v.get(), val, order) } } } @@ -1876,6 +1907,7 @@ assert!(max_foo == 42); issue = "48655")] #[$cfg_cas] pub fn fetch_max(&self, val: $int_type, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { $max_fn(self.v.get(), val, order) } } } @@ -1928,6 +1960,7 @@ assert_eq!(min_foo, 12); issue = "48655")] #[$cfg_cas] pub fn fetch_min(&self, val: $int_type, order: Ordering) -> $int_type { + // SAFETY: data races are prevented by atomic intrinsics. unsafe { $min_fn(self.v.get(), val, order) } } } @@ -1956,7 +1989,9 @@ extern { } let mut atomic = ", stringify!($atomic_type), "::new(1); -unsafe { +", +// SAFETY: Safe as long as `my_atomic_op` is atomic. +"unsafe { my_atomic_op(atomic.as_mut_ptr()); } # } @@ -2156,20 +2191,26 @@ atomic_int! { #[cfg(target_has_atomic_load_store = "ptr")] #[cfg(target_pointer_width = "16")] macro_rules! ptr_width { - () => { 2 } + () => { + 2 + }; } #[cfg(target_has_atomic_load_store = "ptr")] #[cfg(target_pointer_width = "32")] macro_rules! ptr_width { - () => { 4 } + () => { + 4 + }; } #[cfg(target_has_atomic_load_store = "ptr")] #[cfg(target_pointer_width = "64")] macro_rules! ptr_width { - () => { 8 } + () => { + 8 + }; } #[cfg(target_has_atomic_load_store = "ptr")] -atomic_int!{ +atomic_int! { cfg(target_has_atomic = "ptr"), stable(feature = "rust1", since = "1.0.0"), stable(feature = "extended_compare_and_swap", since = "1.10.0"), @@ -2187,7 +2228,7 @@ atomic_int!{ isize AtomicIsize ATOMIC_ISIZE_INIT } #[cfg(target_has_atomic_load_store = "ptr")] -atomic_int!{ +atomic_int! { cfg(target_has_atomic = "ptr"), stable(feature = "rust1", since = "1.0.0"), stable(feature = "extended_compare_and_swap", since = "1.10.0"), @@ -2279,12 +2320,13 @@ unsafe fn atomic_sub(dst: *mut T, val: T, order: Ordering) -> T { #[inline] #[cfg(target_has_atomic = "8")] -unsafe fn atomic_compare_exchange(dst: *mut T, - old: T, - new: T, - success: Ordering, - failure: Ordering) - -> Result { +unsafe fn atomic_compare_exchange( + dst: *mut T, + old: T, + new: T, + success: Ordering, + failure: Ordering, +) -> Result { let (val, ok) = match (success, failure) { (Acquire, Acquire) => intrinsics::atomic_cxchg_acq(dst, old, new), (Release, Relaxed) => intrinsics::atomic_cxchg_rel(dst, old, new), @@ -2304,12 +2346,13 @@ unsafe fn atomic_compare_exchange(dst: *mut T, #[inline] #[cfg(target_has_atomic = "8")] -unsafe fn atomic_compare_exchange_weak(dst: *mut T, - old: T, - new: T, - success: Ordering, - failure: Ordering) - -> Result { +unsafe fn atomic_compare_exchange_weak( + dst: *mut T, + old: T, + new: T, + success: Ordering, + failure: Ordering, +) -> Result { let (val, ok) = match (success, failure) { (Acquire, Acquire) => intrinsics::atomic_cxchgweak_acq(dst, old, new), (Release, Relaxed) => intrinsics::atomic_cxchgweak_rel(dst, old, new), @@ -2514,6 +2557,7 @@ pub fn fence(order: Ordering) { // https://github.com/WebAssembly/tool-conventions/issues/59. We should // follow that discussion and implement a solution when one comes about! #[cfg(not(target_arch = "wasm32"))] + // SAFETY: using an atomic fence is safe. unsafe { match order { Acquire => intrinsics::atomic_fence_acq(), @@ -2525,7 +2569,6 @@ pub fn fence(order: Ordering) { } } - /// A compiler memory fence. /// /// `compiler_fence` does not emit any machine code, but restricts the kinds @@ -2602,6 +2645,7 @@ pub fn fence(order: Ordering) { #[inline] #[stable(feature = "compiler_fences", since = "1.21.0")] pub fn compiler_fence(order: Ordering) { + // SAFETY: using an atomic fence is safe. unsafe { match order { Acquire => intrinsics::atomic_singlethreadfence_acq(), @@ -2613,7 +2657,6 @@ pub fn compiler_fence(order: Ordering) { } } - #[cfg(target_has_atomic_load_store = "8")] #[stable(feature = "atomic_debug", since = "1.3.0")] impl fmt::Debug for AtomicBool { diff --git a/src/libcore/task/poll.rs b/src/libcore/task/poll.rs index d567ae5457..b3a4bd20b8 100644 --- a/src/libcore/task/poll.rs +++ b/src/libcore/task/poll.rs @@ -39,10 +39,7 @@ impl Poll { #[inline] #[stable(feature = "futures_api", since = "1.36.0")] pub fn is_ready(&self) -> bool { - match *self { - Poll::Ready(_) => true, - Poll::Pending => false, - } + matches!(*self, Poll::Ready(_)) } /// Returns `true` if this is `Poll::Pending` diff --git a/src/libcore/task/wake.rs b/src/libcore/task/wake.rs index c1e45f189b..b070b665b4 100644 --- a/src/libcore/task/wake.rs +++ b/src/libcore/task/wake.rs @@ -39,7 +39,7 @@ impl RawWaker { /// function in the `vtable` of the underlying `RawWaker` will be called. #[rustc_promotable] #[stable(feature = "futures_api", since = "1.36.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "futures_api", since = "1.36.0"))] + #[rustc_const_stable(feature = "futures_api", since = "1.36.0")] pub const fn new(data: *const (), vtable: &'static RawWakerVTable) -> RawWaker { RawWaker { data, vtable } } @@ -152,7 +152,7 @@ impl RawWakerVTable { // FIXME: remove whenever we have a stable way to accept fn pointers from const fn // (see https://github.com/rust-rfcs/const-eval/issues/19#issuecomment-472799062) #[rustc_allow_const_fn_ptr] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "futures_api", since = "1.36.0"))] + #[rustc_const_stable(feature = "futures_api", since = "1.36.0")] pub const fn new( clone: unsafe fn(*const ()) -> RawWaker, wake: unsafe fn(*const ()), diff --git a/src/libcore/tests/cmp.rs b/src/libcore/tests/cmp.rs index 56a2f4acf6..4086917780 100644 --- a/src/libcore/tests/cmp.rs +++ b/src/libcore/tests/cmp.rs @@ -101,7 +101,7 @@ fn test_ordering_then_with() { fn test_user_defined_eq() { // Our type. struct SketchyNum { - num : isize + num: isize, } // Our implementation of `PartialEq` to support `==` and `!=`. @@ -113,6 +113,6 @@ fn test_user_defined_eq() { } // Now these binary operators will work when applied! - assert!(SketchyNum {num: 37} == SketchyNum {num: 34}); - assert!(SketchyNum {num: 25} != SketchyNum {num: 57}); + assert!(SketchyNum { num: 37 } == SketchyNum { num: 34 }); + assert!(SketchyNum { num: 25 } != SketchyNum { num: 57 }); } diff --git a/src/libcore/tests/fmt/builders.rs b/src/libcore/tests/fmt/builders.rs index 2557244328..129c121e8c 100644 --- a/src/libcore/tests/fmt/builders.rs +++ b/src/libcore/tests/fmt/builders.rs @@ -21,18 +21,17 @@ mod debug_struct { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("Foo") - .field("bar", &true) - .finish() + fmt.debug_struct("Foo").field("bar", &true).finish() } } assert_eq!("Foo { bar: true }", format!("{:?}", Foo)); assert_eq!( -"Foo { + "Foo { bar: true, }", - format!("{:#?}", Foo)); + format!("{:#?}", Foo) + ); } #[test] @@ -50,11 +49,12 @@ mod debug_struct { assert_eq!("Foo { bar: true, baz: 10/20 }", format!("{:?}", Foo)); assert_eq!( -"Foo { + "Foo { bar: true, baz: 10/20, }", - format!("{:#?}", Foo)); + format!("{:#?}", Foo) + ); } #[test] @@ -72,26 +72,111 @@ mod debug_struct { struct Bar; + impl fmt::Debug for Bar { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt.debug_struct("Bar").field("foo", &Foo).field("hello", &"world").finish() + } + } + + assert_eq!( + "Bar { foo: Foo { bar: true, baz: 10/20 }, hello: \"world\" }", + format!("{:?}", Bar) + ); + assert_eq!( + "Bar { + foo: Foo { + bar: true, + baz: 10/20, + }, + hello: \"world\", +}", + format!("{:#?}", Bar) + ); + } + + #[test] + fn test_only_non_exhaustive() { + struct Foo; + + impl fmt::Debug for Foo { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt.debug_struct("Foo").finish_non_exhaustive() + } + } + + assert_eq!("Foo { .. }", format!("{:?}", Foo)); + assert_eq!( + "Foo { + .. +}", + format!("{:#?}", Foo) + ); + } + + #[test] + fn test_multiple_and_non_exhaustive() { + struct Foo; + + impl fmt::Debug for Foo { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt.debug_struct("Foo") + .field("bar", &true) + .field("baz", &format_args!("{}/{}", 10, 20)) + .finish_non_exhaustive() + } + } + + assert_eq!("Foo { bar: true, baz: 10/20, .. }", format!("{:?}", Foo)); + assert_eq!( + "Foo { + bar: true, + baz: 10/20, + .. +}", + format!("{:#?}", Foo) + ); + } + + #[test] + fn test_nested_non_exhaustive() { + struct Foo; + + impl fmt::Debug for Foo { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt.debug_struct("Foo") + .field("bar", &true) + .field("baz", &format_args!("{}/{}", 10, 20)) + .finish_non_exhaustive() + } + } + + struct Bar; + impl fmt::Debug for Bar { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { fmt.debug_struct("Bar") .field("foo", &Foo) .field("hello", &"world") - .finish() + .finish_non_exhaustive() } } - assert_eq!("Bar { foo: Foo { bar: true, baz: 10/20 }, hello: \"world\" }", - format!("{:?}", Bar)); assert_eq!( -"Bar { + "Bar { foo: Foo { bar: true, baz: 10/20, .. }, hello: \"world\", .. }", + format!("{:?}", Bar) + ); + assert_eq!( + "Bar { foo: Foo { bar: true, baz: 10/20, + .. }, hello: \"world\", + .. }", - format!("{:#?}", Bar)); + format!("{:#?}", Bar) + ); } } @@ -118,18 +203,17 @@ mod debug_tuple { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_tuple("Foo") - .field(&true) - .finish() + fmt.debug_tuple("Foo").field(&true).finish() } } assert_eq!("Foo(true)", format!("{:?}", Foo)); assert_eq!( -"Foo( + "Foo( true, )", - format!("{:#?}", Foo)); + format!("{:#?}", Foo) + ); } #[test] @@ -138,20 +222,18 @@ mod debug_tuple { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_tuple("Foo") - .field(&true) - .field(&format_args!("{}/{}", 10, 20)) - .finish() + fmt.debug_tuple("Foo").field(&true).field(&format_args!("{}/{}", 10, 20)).finish() } } assert_eq!("Foo(true, 10/20)", format!("{:?}", Foo)); assert_eq!( -"Foo( + "Foo( true, 10/20, )", - format!("{:#?}", Foo)); + format!("{:#?}", Foo) + ); } #[test] @@ -160,10 +242,7 @@ mod debug_tuple { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_tuple("Foo") - .field(&true) - .field(&format_args!("{}/{}", 10, 20)) - .finish() + fmt.debug_tuple("Foo").field(&true).field(&format_args!("{}/{}", 10, 20)).finish() } } @@ -171,24 +250,21 @@ mod debug_tuple { impl fmt::Debug for Bar { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_tuple("Bar") - .field(&Foo) - .field(&"world") - .finish() + fmt.debug_tuple("Bar").field(&Foo).field(&"world").finish() } } - assert_eq!("Bar(Foo(true, 10/20), \"world\")", - format!("{:?}", Bar)); + assert_eq!("Bar(Foo(true, 10/20), \"world\")", format!("{:?}", Bar)); assert_eq!( -"Bar( + "Bar( Foo( true, 10/20, ), \"world\", )", - format!("{:#?}", Bar)); + format!("{:#?}", Bar) + ); } } @@ -215,9 +291,7 @@ mod debug_map { impl fmt::Debug for Entry { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_map() - .entry(&"bar", &true) - .finish() + fmt.debug_map().entry(&"bar", &true).finish() } } @@ -225,9 +299,7 @@ mod debug_map { impl fmt::Debug for KeyValue { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_map() - .key(&"bar").value(&true) - .finish() + fmt.debug_map().key(&"bar").value(&true).finish() } } @@ -236,10 +308,11 @@ mod debug_map { assert_eq!("{\"bar\": true}", format!("{:?}", Entry)); assert_eq!( -"{ + "{ \"bar\": true, }", - format!("{:#?}", Entry)); + format!("{:#?}", Entry) + ); } #[test] @@ -260,8 +333,10 @@ mod debug_map { impl fmt::Debug for KeyValue { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { fmt.debug_map() - .key(&"bar").value(&true) - .key(&10).value(&format_args!("{}/{}", 10, 20)) + .key(&"bar") + .value(&true) + .key(&10) + .value(&format_args!("{}/{}", 10, 20)) .finish() } } @@ -271,11 +346,12 @@ mod debug_map { assert_eq!("{\"bar\": true, 10: 10/20}", format!("{:?}", Entry)); assert_eq!( -"{ + "{ \"bar\": true, 10: 10/20, }", - format!("{:#?}", Entry)); + format!("{:#?}", Entry) + ); } #[test] @@ -295,18 +371,17 @@ mod debug_map { impl fmt::Debug for Bar { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_map() - .entry(&"foo", &Foo) - .entry(&Foo, &"world") - .finish() + fmt.debug_map().entry(&"foo", &Foo).entry(&Foo, &"world").finish() } } - assert_eq!("{\"foo\": {\"bar\": true, 10: 10/20}, \ + assert_eq!( + "{\"foo\": {\"bar\": true, 10: 10/20}, \ {\"bar\": true, 10: 10/20}: \"world\"}", - format!("{:?}", Bar)); + format!("{:?}", Bar) + ); assert_eq!( -"{ + "{ \"foo\": { \"bar\": true, 10: 10/20, @@ -316,7 +391,8 @@ mod debug_map { 10: 10/20, }: \"world\", }", - format!("{:#?}", Bar)); + format!("{:#?}", Bar) + ); } #[test] @@ -366,10 +442,7 @@ mod debug_map { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_map() - .key(&"bar") - .key(&"invalid") - .finish() + fmt.debug_map().key(&"bar").key(&"invalid").finish() } } @@ -383,9 +456,7 @@ mod debug_map { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_map() - .key(&"bar") - .finish() + fmt.debug_map().key(&"bar").finish() } } @@ -399,10 +470,7 @@ mod debug_map { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_map() - .value(&"invalid") - .key(&"bar") - .finish() + fmt.debug_map().value(&"invalid").key(&"bar").finish() } } @@ -433,18 +501,17 @@ mod debug_set { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_set() - .entry(&true) - .finish() + fmt.debug_set().entry(&true).finish() } } assert_eq!("{true}", format!("{:?}", Foo)); assert_eq!( -"{ + "{ true, }", - format!("{:#?}", Foo)); + format!("{:#?}", Foo) + ); } #[test] @@ -453,20 +520,18 @@ mod debug_set { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_set() - .entry(&true) - .entry(&format_args!("{}/{}", 10, 20)) - .finish() + fmt.debug_set().entry(&true).entry(&format_args!("{}/{}", 10, 20)).finish() } } assert_eq!("{true, 10/20}", format!("{:?}", Foo)); assert_eq!( -"{ + "{ true, 10/20, }", - format!("{:#?}", Foo)); + format!("{:#?}", Foo) + ); } #[test] @@ -475,10 +540,7 @@ mod debug_set { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_set() - .entry(&true) - .entry(&format_args!("{}/{}", 10, 20)) - .finish() + fmt.debug_set().entry(&true).entry(&format_args!("{}/{}", 10, 20)).finish() } } @@ -486,24 +548,21 @@ mod debug_set { impl fmt::Debug for Bar { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_set() - .entry(&Foo) - .entry(&"world") - .finish() + fmt.debug_set().entry(&Foo).entry(&"world").finish() } } - assert_eq!("{{true, 10/20}, \"world\"}", - format!("{:?}", Bar)); + assert_eq!("{{true, 10/20}, \"world\"}", format!("{:?}", Bar)); assert_eq!( -"{ + "{ { true, 10/20, }, \"world\", }", - format!("{:#?}", Bar)); + format!("{:#?}", Bar) + ); } } @@ -530,18 +589,17 @@ mod debug_list { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_list() - .entry(&true) - .finish() + fmt.debug_list().entry(&true).finish() } } assert_eq!("[true]", format!("{:?}", Foo)); assert_eq!( -"[ + "[ true, ]", - format!("{:#?}", Foo)); + format!("{:#?}", Foo) + ); } #[test] @@ -550,20 +608,18 @@ mod debug_list { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_list() - .entry(&true) - .entry(&format_args!("{}/{}", 10, 20)) - .finish() + fmt.debug_list().entry(&true).entry(&format_args!("{}/{}", 10, 20)).finish() } } assert_eq!("[true, 10/20]", format!("{:?}", Foo)); assert_eq!( -"[ + "[ true, 10/20, ]", - format!("{:#?}", Foo)); + format!("{:#?}", Foo) + ); } #[test] @@ -572,10 +628,7 @@ mod debug_list { impl fmt::Debug for Foo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_list() - .entry(&true) - .entry(&format_args!("{}/{}", 10, 20)) - .finish() + fmt.debug_list().entry(&true).entry(&format_args!("{}/{}", 10, 20)).finish() } } @@ -583,24 +636,21 @@ mod debug_list { impl fmt::Debug for Bar { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_list() - .entry(&Foo) - .entry(&"world") - .finish() + fmt.debug_list().entry(&Foo).entry(&"world").finish() } } - assert_eq!("[[true, 10/20], \"world\"]", - format!("{:?}", Bar)); + assert_eq!("[[true, 10/20], \"world\"]", format!("{:?}", Bar)); assert_eq!( -"[ + "[ [ true, 10/20, ], \"world\", ]", - format!("{:#?}", Bar)); + format!("{:#?}", Bar) + ); } } @@ -627,34 +677,54 @@ fn test_formatting_parameters_are_forwarded() { assert_eq!(format!("{:03?}", list), "[1024, 007]"); assert_eq!(format!("{:03?}", map), r#"{"bar": 1024, "baz": 007}"#); assert_eq!(format!("{:03?}", set), "{007, 1024}"); - assert_eq!(format!("{:#03?}", struct_), " + assert_eq!( + format!("{:#03?}", struct_), + " Foo { bar: 1024, baz: 007, } - ".trim()); - assert_eq!(format!("{:#03?}", tuple), " + " + .trim() + ); + assert_eq!( + format!("{:#03?}", tuple), + " ( 1024, 007, ) - ".trim()); - assert_eq!(format!("{:#03?}", list), " + " + .trim() + ); + assert_eq!( + format!("{:#03?}", list), + " [ 1024, 007, ] - ".trim()); - assert_eq!(format!("{:#03?}", map), r#" + " + .trim() + ); + assert_eq!( + format!("{:#03?}", map), + r#" { "bar": 1024, "baz": 007, } - "#.trim()); - assert_eq!(format!("{:#03?}", set), " + "# + .trim() + ); + assert_eq!( + format!("{:#03?}", set), + " { 007, 1024, } - ".trim()); + " + .trim() + ); } diff --git a/src/libcore/tests/fmt/mod.rs b/src/libcore/tests/fmt/mod.rs index d86e21cf40..7b281ce48e 100644 --- a/src/libcore/tests/fmt/mod.rs +++ b/src/libcore/tests/fmt/mod.rs @@ -28,3 +28,18 @@ fn test_estimated_capacity() { assert_eq!(format_args!("{}, hello!", "World").estimated_capacity(), 0); assert_eq!(format_args!("{}. 16-bytes piece", "World").estimated_capacity(), 32); } + +#[test] +fn pad_integral_resets() { + struct Bar; + + impl core::fmt::Display for Bar { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + "1".fmt(f)?; + f.pad_integral(true, "", "5")?; + "1".fmt(f) + } + } + + assert_eq!(format!("{:<03}", Bar), "1 0051 "); +} diff --git a/src/libcore/tests/hash/mod.rs b/src/libcore/tests/hash/mod.rs index ba0220f0d9..1566d35749 100644 --- a/src/libcore/tests/hash/mod.rs +++ b/src/libcore/tests/hash/mod.rs @@ -71,7 +71,8 @@ fn test_writer_hasher() { let ptr = 5_usize as *mut i32; assert_eq!(hash(&ptr), 5); - if cfg!(miri) { // Miri cannot hash pointers + if cfg!(miri) { + // Miri cannot hash pointers return; } diff --git a/src/libcore/tests/iter.rs b/src/libcore/tests/iter.rs index c9096b713f..8b8dc94153 100644 --- a/src/libcore/tests/iter.rs +++ b/src/libcore/tests/iter.rs @@ -1,58 +1,58 @@ use core::cell::Cell; use core::convert::TryFrom; use core::iter::*; -use core::{i8, i16, isize}; use core::usize; +use core::{i16, i8, isize}; #[test] fn test_lt() { let empty: [isize; 0] = []; - let xs = [1,2,3]; - let ys = [1,2,0]; + let xs = [1, 2, 3]; + let ys = [1, 2, 0]; assert!(!xs.iter().lt(ys.iter())); assert!(!xs.iter().le(ys.iter())); - assert!( xs.iter().gt(ys.iter())); - assert!( xs.iter().ge(ys.iter())); + assert!(xs.iter().gt(ys.iter())); + assert!(xs.iter().ge(ys.iter())); - assert!( ys.iter().lt(xs.iter())); - assert!( ys.iter().le(xs.iter())); + assert!(ys.iter().lt(xs.iter())); + assert!(ys.iter().le(xs.iter())); assert!(!ys.iter().gt(xs.iter())); assert!(!ys.iter().ge(xs.iter())); - assert!( empty.iter().lt(xs.iter())); - assert!( empty.iter().le(xs.iter())); + assert!(empty.iter().lt(xs.iter())); + assert!(empty.iter().le(xs.iter())); assert!(!empty.iter().gt(xs.iter())); assert!(!empty.iter().ge(xs.iter())); // Sequence with NaN let u = [1.0f64, 2.0]; - let v = [0.0f64/0.0, 3.0]; + let v = [0.0f64 / 0.0, 3.0]; assert!(!u.iter().lt(v.iter())); assert!(!u.iter().le(v.iter())); assert!(!u.iter().gt(v.iter())); assert!(!u.iter().ge(v.iter())); - let a = [0.0f64/0.0]; + let a = [0.0f64 / 0.0]; let b = [1.0f64]; let c = [2.0f64]; - assert!(a.iter().lt(b.iter()) == (a[0] < b[0])); + assert!(a.iter().lt(b.iter()) == (a[0] < b[0])); assert!(a.iter().le(b.iter()) == (a[0] <= b[0])); - assert!(a.iter().gt(b.iter()) == (a[0] > b[0])); + assert!(a.iter().gt(b.iter()) == (a[0] > b[0])); assert!(a.iter().ge(b.iter()) == (a[0] >= b[0])); - assert!(c.iter().lt(b.iter()) == (c[0] < b[0])); + assert!(c.iter().lt(b.iter()) == (c[0] < b[0])); assert!(c.iter().le(b.iter()) == (c[0] <= b[0])); - assert!(c.iter().gt(b.iter()) == (c[0] > b[0])); + assert!(c.iter().gt(b.iter()) == (c[0] > b[0])); assert!(c.iter().ge(b.iter()) == (c[0] >= b[0])); } #[test] fn test_multi_iter() { - let xs = [1,2,3,4]; - let ys = [4,3,2,1]; + let xs = [1, 2, 3, 4]; + let ys = [4, 3, 2, 1]; assert!(xs.iter().eq(ys.iter().rev())); assert!(xs.iter().lt(xs.iter().skip(2))); } @@ -229,11 +229,7 @@ fn test_iterator_chain_size_hint() { } fn size_hint(&self) -> (usize, Option) { - if self.is_empty { - (0, Some(0)) - } else { - (1, Some(1)) - } + if self.is_empty { (0, Some(0)) } else { (1, Some(1)) } } } @@ -277,7 +273,9 @@ fn test_zip_nth() { fn test_zip_nth_side_effects() { let mut a = Vec::new(); let mut b = Vec::new(); - let value = [1, 2, 3, 4, 5, 6].iter().cloned() + let value = [1, 2, 3, 4, 5, 6] + .iter() + .cloned() .map(|n| { a.push(n); n * 10 @@ -356,7 +354,9 @@ fn test_iterator_step_by_nth_overflow() { struct Test(Bigger); impl Iterator for &mut Test { type Item = i32; - fn next(&mut self) -> Option { Some(21) } + fn next(&mut self) -> Option { + Some(21) + } fn nth(&mut self, n: usize) -> Option { self.0 += n as Bigger + 1; Some(42) @@ -499,7 +499,7 @@ fn test_iterator_step_by_size_hint() { let mut it = StubSizeHint(usize::MAX, None).step_by(1); assert_eq!(it.size_hint(), (usize::MAX, None)); it.next(); - assert_eq!(it.size_hint(), (usize::MAX-1, None)); + assert_eq!(it.size_hint(), (usize::MAX - 1, None)); // still infinite with larger step let mut it = StubSizeHint(7, None).step_by(3); @@ -508,18 +508,24 @@ fn test_iterator_step_by_size_hint() { assert_eq!(it.size_hint(), (2, None)); // propagates ExactSizeIterator - let a = [1,2,3,4,5]; + let a = [1, 2, 3, 4, 5]; let it = a.iter().step_by(2); assert_eq!(it.len(), 3); // Cannot be TrustedLen as a step greater than one makes an iterator // with (usize::MAX, None) no longer meet the safety requirements - trait TrustedLenCheck { fn test(self) -> bool; } - impl TrustedLenCheck for T { - default fn test(self) -> bool { false } + trait TrustedLenCheck { + fn test(self) -> bool; + } + impl TrustedLenCheck for T { + default fn test(self) -> bool { + false + } } - impl TrustedLenCheck for T { - fn test(self) -> bool { true } + impl TrustedLenCheck for T { + fn test(self) -> bool { + true + } } assert!(TrustedLenCheck::test(a.iter())); assert!(!TrustedLenCheck::test(a.iter().step_by(1))); @@ -527,23 +533,22 @@ fn test_iterator_step_by_size_hint() { #[test] fn test_filter_map() { - let it = (0..).step_by(1).take(10) - .filter_map(|x| if x % 2 == 0 { Some(x*x) } else { None }); - assert_eq!(it.collect::>(), [0*0, 2*2, 4*4, 6*6, 8*8]); + let it = (0..).step_by(1).take(10).filter_map(|x| if x % 2 == 0 { Some(x * x) } else { None }); + assert_eq!(it.collect::>(), [0 * 0, 2 * 2, 4 * 4, 6 * 6, 8 * 8]); } #[test] fn test_filter_map_fold() { let xs = [0, 1, 2, 3, 4, 5, 6, 7, 8]; - let ys = [0*0, 2*2, 4*4, 6*6, 8*8]; - let it = xs.iter().filter_map(|&x| if x % 2 == 0 { Some(x*x) } else { None }); + let ys = [0 * 0, 2 * 2, 4 * 4, 6 * 6, 8 * 8]; + let it = xs.iter().filter_map(|&x| if x % 2 == 0 { Some(x * x) } else { None }); let i = it.fold(0, |i, x| { assert_eq!(x, ys[i]); i + 1 }); assert_eq!(i, ys.len()); - let it = xs.iter().filter_map(|&x| if x % 2 == 0 { Some(x*x) } else { None }); + let it = xs.iter().filter_map(|&x| if x % 2 == 0 { Some(x * x) } else { None }); let i = it.rfold(ys.len(), |i, x| { assert_eq!(x, ys[i - 1]); i - 1 @@ -736,7 +741,6 @@ fn test_iterator_peekable_count() { let mut it = zs.iter().peekable(); assert_eq!(it.peek(), None); - } #[test] @@ -805,10 +809,7 @@ pub struct CycleIter<'a, T> { } pub fn cycle(data: &[T]) -> CycleIter<'_, T> { - CycleIter { - index: 0, - data, - } + CycleIter { index: 0, data } } impl<'a, T> Iterator for CycleIter<'a, T> { @@ -832,7 +833,9 @@ fn test_iterator_peekable_remember_peek_none_1() { let is_the_last = iter.peek().is_none(); assert_eq!(is_the_last, n == data.len() - 1); n += 1; - if n > data.len() { break; } + if n > data.len() { + break; + } } assert_eq!(n, data.len()); } @@ -914,7 +917,7 @@ fn test_iterator_skip() { while let Some(&x) = it.next() { assert_eq!(x, ys[i]); i += 1; - assert_eq!(it.len(), xs.len()-5-i); + assert_eq!(it.len(), xs.len() - 5 - i); } assert_eq!(i, ys.len()); assert_eq!(it.len(), 0); @@ -972,7 +975,6 @@ fn test_iterator_skip_nth() { let mut it = xs.iter().skip(12); assert_eq!(it.nth(0), None); - } #[test] @@ -1037,7 +1039,6 @@ fn test_iterator_skip_fold() { i }); assert_eq!(i, 1); - } #[test] @@ -1178,7 +1179,7 @@ fn test_iterator_flat_map() { fn test_iterator_flat_map_fold() { let xs = [0, 3, 6]; let ys = [1, 2, 3, 4, 5, 6, 7]; - let mut it = xs.iter().flat_map(|&x| x..x+3); + let mut it = xs.iter().flat_map(|&x| x..x + 3); assert_eq!(it.next(), Some(0)); assert_eq!(it.next_back(), Some(8)); let i = it.fold(0, |i, x| { @@ -1187,7 +1188,7 @@ fn test_iterator_flat_map_fold() { }); assert_eq!(i, ys.len()); - let mut it = xs.iter().flat_map(|&x| x..x+3); + let mut it = xs.iter().flat_map(|&x| x..x + 3); assert_eq!(it.next(), Some(0)); assert_eq!(it.next_back(), Some(8)); let i = it.rfold(ys.len(), |i, x| { @@ -1216,7 +1217,7 @@ fn test_iterator_flatten() { fn test_iterator_flatten_fold() { let xs = [0, 3, 6]; let ys = [1, 2, 3, 4, 5, 6, 7]; - let mut it = xs.iter().map(|&x| x..x+3).flatten(); + let mut it = xs.iter().map(|&x| x..x + 3).flatten(); assert_eq!(it.next(), Some(0)); assert_eq!(it.next_back(), Some(8)); let i = it.fold(0, |i, x| { @@ -1225,7 +1226,7 @@ fn test_iterator_flatten_fold() { }); assert_eq!(i, ys.len()); - let mut it = xs.iter().map(|&x| x..x+3).flatten(); + let mut it = xs.iter().map(|&x| x..x + 3).flatten(); assert_eq!(it.next(), Some(0)); assert_eq!(it.next_back(), Some(8)); let i = it.rfold(ys.len(), |i, x| { @@ -1240,10 +1241,7 @@ fn test_inspect() { let xs = [1, 2, 3, 4]; let mut n = 0; - let ys = xs.iter() - .cloned() - .inspect(|_| n += 1) - .collect::>(); + let ys = xs.iter().cloned().inspect(|_| n += 1).collect::>(); assert_eq!(n, xs.len()); assert_eq!(&xs[..], &ys[..]); @@ -1483,7 +1481,7 @@ fn test_iterator_size_hint() { assert_eq!(c.clone().enumerate().size_hint(), (usize::MAX, None)); assert_eq!(c.clone().chain(vi.clone().cloned()).size_hint(), (usize::MAX, None)); assert_eq!(c.clone().zip(vi.clone()).size_hint(), (10, Some(10))); - assert_eq!(c.clone().scan(0, |_,_| Some(0)).size_hint(), (0, None)); + assert_eq!(c.clone().scan(0, |_, _| Some(0)).size_hint(), (0, None)); assert_eq!(c.clone().filter(|_| false).size_hint(), (0, None)); assert_eq!(c.clone().map(|_| 0).size_hint(), (usize::MAX, None)); assert_eq!(c.filter_map(|_| Some(0)).size_hint(), (0, None)); @@ -1497,9 +1495,9 @@ fn test_iterator_size_hint() { assert_eq!(vi.clone().enumerate().size_hint(), (10, Some(10))); assert_eq!(vi.clone().chain(v2).size_hint(), (13, Some(13))); assert_eq!(vi.clone().zip(v2).size_hint(), (3, Some(3))); - assert_eq!(vi.clone().scan(0, |_,_| Some(0)).size_hint(), (0, Some(10))); + assert_eq!(vi.clone().scan(0, |_, _| Some(0)).size_hint(), (0, Some(10))); assert_eq!(vi.clone().filter(|_| false).size_hint(), (0, Some(10))); - assert_eq!(vi.clone().map(|&i| i+1).size_hint(), (10, Some(10))); + assert_eq!(vi.clone().map(|&i| i + 1).size_hint(), (10, Some(10))); assert_eq!(vi.filter_map(|_| Some(0)).size_hint(), (0, Some(10))); } @@ -1555,14 +1553,50 @@ fn test_find_map() { assert_eq!(iter.next(), Some(&7)); fn half_if_even(x: &isize) -> Option { - if x % 2 == 0 { - Some(x / 2) - } else { - None + if x % 2 == 0 { Some(x / 2) } else { None } + } +} + +#[test] +fn test_try_find() { + let xs: &[isize] = &[]; + assert_eq!(xs.iter().try_find(testfn), Ok(None)); + let xs: &[isize] = &[1, 2, 3, 4]; + assert_eq!(xs.iter().try_find(testfn), Ok(Some(&2))); + let xs: &[isize] = &[1, 3, 4]; + assert_eq!(xs.iter().try_find(testfn), Err(())); + + let xs: &[isize] = &[1, 2, 3, 4, 5, 6, 7]; + let mut iter = xs.iter(); + assert_eq!(iter.try_find(testfn), Ok(Some(&2))); + assert_eq!(iter.try_find(testfn), Err(())); + assert_eq!(iter.next(), Some(&5)); + + fn testfn(x: &&isize) -> Result { + if **x == 2 { + return Ok(true); + } + if **x == 4 { + return Err(()); } + Ok(false) } } +#[test] +fn test_try_find_api_usability() -> Result<(), Box> { + let a = ["1", "2"]; + + let is_my_num = |s: &str, search: i32| -> Result { + Ok(s.parse::()? == search) + }; + + let val = a.iter().try_find(|&&s| is_my_num(s, 2))?; + assert_eq!(val, Some(&"2")); + + Ok(()) +} + #[test] fn test_position() { let v = &[1, 3, 9, 27, 103, 14, 11]; @@ -1618,8 +1652,7 @@ fn test_rev() { let mut it = xs.iter(); it.next(); it.next(); - assert!(it.rev().cloned().collect::>() == - vec![16, 14, 12, 10, 8, 6]); + assert!(it.rev().cloned().collect::>() == vec![16, 14, 12, 10, 8, 6]); } #[test] @@ -1748,14 +1781,22 @@ fn test_double_ended_chain() { assert_eq!(it.next_back().unwrap(), &7); assert_eq!(it.next_back(), None); - // test that .chain() is well behaved with an unfused iterator struct CrazyIterator(bool); - impl CrazyIterator { fn new() -> CrazyIterator { CrazyIterator(false) } } + impl CrazyIterator { + fn new() -> CrazyIterator { + CrazyIterator(false) + } + } impl Iterator for CrazyIterator { type Item = i32; fn next(&mut self) -> Option { - if self.0 { Some(99) } else { self.0 = true; None } + if self.0 { + Some(99) + } else { + self.0 = true; + None + } } } @@ -1771,8 +1812,14 @@ fn test_double_ended_chain() { #[test] fn test_rposition() { - fn f(xy: &(isize, char)) -> bool { let (_x, y) = *xy; y == 'b' } - fn g(xy: &(isize, char)) -> bool { let (_x, y) = *xy; y == 'd' } + fn f(xy: &(isize, char)) -> bool { + let (_x, y) = *xy; + y == 'b' + } + fn g(xy: &(isize, char)) -> bool { + let (_x, y) = *xy; + y == 'd' + } let v = [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'b')]; assert_eq!(v.iter().rposition(f), Some(3)); @@ -1788,9 +1835,7 @@ fn test_rev_rposition() { #[test] #[should_panic] fn test_rposition_panic() { - let v: [(Box<_>, Box<_>); 4] = - [(box 0, box 0), (box 0, box 0), - (box 0, box 0), (box 0, box 0)]; + let v: [(Box<_>, Box<_>); 4] = [(box 0, box 0), (box 0, box 0), (box 0, box 0), (box 0, box 0)]; let mut i = 0; v.iter().rposition(|_elt| { if i == 2 { @@ -1801,38 +1846,37 @@ fn test_rposition_panic() { }); } - #[test] fn test_double_ended_flat_map() { - let u = [0,1]; - let v = [5,6,7,8]; + let u = [0, 1]; + let v = [5, 6, 7, 8]; let mut it = u.iter().flat_map(|x| &v[*x..v.len()]); assert_eq!(it.next_back().unwrap(), &8); - assert_eq!(it.next().unwrap(), &5); + assert_eq!(it.next().unwrap(), &5); assert_eq!(it.next_back().unwrap(), &7); assert_eq!(it.next_back().unwrap(), &6); assert_eq!(it.next_back().unwrap(), &8); - assert_eq!(it.next().unwrap(), &6); + assert_eq!(it.next().unwrap(), &6); assert_eq!(it.next_back().unwrap(), &7); assert_eq!(it.next_back(), None); - assert_eq!(it.next(), None); + assert_eq!(it.next(), None); assert_eq!(it.next_back(), None); } #[test] fn test_double_ended_flatten() { - let u = [0,1]; - let v = [5,6,7,8]; + let u = [0, 1]; + let v = [5, 6, 7, 8]; let mut it = u.iter().map(|x| &v[*x..v.len()]).flatten(); assert_eq!(it.next_back().unwrap(), &8); - assert_eq!(it.next().unwrap(), &5); + assert_eq!(it.next().unwrap(), &5); assert_eq!(it.next_back().unwrap(), &7); assert_eq!(it.next_back().unwrap(), &6); assert_eq!(it.next_back().unwrap(), &8); - assert_eq!(it.next().unwrap(), &6); + assert_eq!(it.next().unwrap(), &6); assert_eq!(it.next_back().unwrap(), &7); assert_eq!(it.next_back(), None); - assert_eq!(it.next(), None); + assert_eq!(it.next(), None); assert_eq!(it.next_back(), None); } @@ -1867,8 +1911,10 @@ fn test_range() { assert_eq!((-70..58).size_hint(), (128, Some(128))); assert_eq!((-128..127).size_hint(), (255, Some(255))); - assert_eq!((-2..isize::MAX).size_hint(), - (isize::MAX as usize + 2, Some(isize::MAX as usize + 2))); + assert_eq!( + (-2..isize::MAX).size_hint(), + (isize::MAX as usize + 2, Some(isize::MAX as usize + 2)) + ); } #[test] @@ -2171,15 +2217,15 @@ fn test_range_inclusive_folds() { assert!(it.is_empty()); let mut it = 10..=20; - assert_eq!(it.try_fold(0, |a,b| Some(a+b)), Some(165)); + assert_eq!(it.try_fold(0, |a, b| Some(a + b)), Some(165)); assert!(it.is_empty()); - assert_eq!(it.try_fold(0, |a,b| Some(a+b)), Some(0)); + assert_eq!(it.try_fold(0, |a, b| Some(a + b)), Some(0)); assert!(it.is_empty()); let mut it = 10..=20; - assert_eq!(it.try_rfold(0, |a,b| Some(a+b)), Some(165)); + assert_eq!(it.try_rfold(0, |a, b| Some(a + b)), Some(165)); assert!(it.is_empty()); - assert_eq!(it.try_rfold(0, |a,b| Some(a+b)), Some(0)); + assert_eq!(it.try_rfold(0, |a, b| Some(a + b)), Some(0)); assert!(it.is_empty()); } @@ -2292,15 +2338,19 @@ fn test_repeat_with_take() { is_trusted_len(repeat_with(|| 42).take(3)); assert_eq!(repeat_with(|| 42).take(3).size_hint(), (3, Some(3))); assert_eq!(repeat_with(|| 42).take(0).size_hint(), (0, Some(0))); - assert_eq!(repeat_with(|| 42).take(usize::MAX).size_hint(), - (usize::MAX, Some(usize::MAX))); + assert_eq!(repeat_with(|| 42).take(usize::MAX).size_hint(), (usize::MAX, Some(usize::MAX))); } #[test] fn test_repeat_with_take_collect() { let mut curr = 1; - let v: Vec<_> = repeat_with(|| { let tmp = curr; curr *= 2; tmp }) - .take(5).collect(); + let v: Vec<_> = repeat_with(|| { + let tmp = curr; + curr *= 2; + tmp + }) + .take(5) + .collect(); assert_eq!(v, vec![1, 2, 4, 8, 16]); } @@ -2472,7 +2522,7 @@ fn test_step_replace_no_between() { #[test] fn test_rev_try_folds() { - let f = &|acc, x| i32::checked_add(2*acc, x); + let f = &|acc, x| i32::checked_add(2 * acc, x); assert_eq!((1..10).rev().try_fold(7, f), (1..10).try_rfold(7, f)); assert_eq!((1..10).rev().try_rfold(7, f), (1..10).try_fold(7, f)); @@ -2488,8 +2538,8 @@ fn test_rev_try_folds() { #[test] fn test_cloned_try_folds() { let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]; - let f = &|acc, x| i32::checked_add(2*acc, x); - let f_ref = &|acc, &x| i32::checked_add(2*acc, x); + let f = &|acc, x| i32::checked_add(2 * acc, x); + let f_ref = &|acc, &x| i32::checked_add(2 * acc, x); assert_eq!(a.iter().cloned().try_fold(7, f), a.iter().try_fold(7, f_ref)); assert_eq!(a.iter().cloned().try_rfold(7, f), a.iter().try_rfold(7, f_ref)); @@ -2506,7 +2556,7 @@ fn test_cloned_try_folds() { fn test_chain_try_folds() { let c = || (0..10).chain(10..20); - let f = &|acc, x| i32::checked_add(2*acc, x); + let f = &|acc, x| i32::checked_add(2 * acc, x); assert_eq!(c().try_fold(7, f), (0..20).try_fold(7, f)); assert_eq!(c().try_rfold(7, f), (0..20).rev().try_fold(7, f)); @@ -2515,14 +2565,14 @@ fn test_chain_try_folds() { assert_eq!(iter.next(), Some(6), "stopped in front, state Both"); assert_eq!(iter.position(|x| x == 13), Some(6)); assert_eq!(iter.next(), Some(14), "stopped in back, state Back"); - assert_eq!(iter.try_fold(0, |acc, x| Some(acc+x)), Some((15..20).sum())); + assert_eq!(iter.try_fold(0, |acc, x| Some(acc + x)), Some((15..20).sum())); let mut iter = c().rev(); // use rev to access try_rfold assert_eq!(iter.position(|x| x == 15), Some(4)); assert_eq!(iter.next(), Some(14), "stopped in back, state Both"); assert_eq!(iter.position(|x| x == 5), Some(8)); assert_eq!(iter.next(), Some(4), "stopped in front, state Front"); - assert_eq!(iter.try_fold(0, |acc, x| Some(acc+x)), Some((0..4).sum())); + assert_eq!(iter.try_fold(0, |acc, x| Some(acc + x)), Some((0..4).sum())); let mut iter = c(); iter.by_ref().rev().nth(14); // skip the last 15, ending in state Front @@ -2535,11 +2585,11 @@ fn test_chain_try_folds() { #[test] fn test_map_try_folds() { - let f = &|acc, x| i32::checked_add(2*acc, x); - assert_eq!((0..10).map(|x| x+3).try_fold(7, f), (3..13).try_fold(7, f)); - assert_eq!((0..10).map(|x| x+3).try_rfold(7, f), (3..13).try_rfold(7, f)); + let f = &|acc, x| i32::checked_add(2 * acc, x); + assert_eq!((0..10).map(|x| x + 3).try_fold(7, f), (3..13).try_fold(7, f)); + assert_eq!((0..10).map(|x| x + 3).try_rfold(7, f), (3..13).try_rfold(7, f)); - let mut iter = (0..40).map(|x| x+10); + let mut iter = (0..40).map(|x| x + 10); assert_eq!(iter.try_fold(0, i8::checked_add), None); assert_eq!(iter.next(), Some(20)); assert_eq!(iter.try_rfold(0, i8::checked_add), None); @@ -2548,8 +2598,10 @@ fn test_map_try_folds() { #[test] fn test_filter_try_folds() { - fn p(&x: &i32) -> bool { 0 <= x && x < 10 } - let f = &|acc, x| i32::checked_add(2*acc, x); + fn p(&x: &i32) -> bool { + 0 <= x && x < 10 + } + let f = &|acc, x| i32::checked_add(2 * acc, x); assert_eq!((-10..20).filter(p).try_fold(7, f), (0..10).try_fold(7, f)); assert_eq!((-10..20).filter(p).try_rfold(7, f), (0..10).try_rfold(7, f)); @@ -2562,12 +2614,12 @@ fn test_filter_try_folds() { #[test] fn test_filter_map_try_folds() { - let mp = &|x| if 0 <= x && x < 10 { Some(x*2) } else { None }; - let f = &|acc, x| i32::checked_add(2*acc, x); - assert_eq!((-9..20).filter_map(mp).try_fold(7, f), (0..10).map(|x| 2*x).try_fold(7, f)); - assert_eq!((-9..20).filter_map(mp).try_rfold(7, f), (0..10).map(|x| 2*x).try_rfold(7, f)); + let mp = &|x| if 0 <= x && x < 10 { Some(x * 2) } else { None }; + let f = &|acc, x| i32::checked_add(2 * acc, x); + assert_eq!((-9..20).filter_map(mp).try_fold(7, f), (0..10).map(|x| 2 * x).try_fold(7, f)); + assert_eq!((-9..20).filter_map(mp).try_rfold(7, f), (0..10).map(|x| 2 * x).try_rfold(7, f)); - let mut iter = (0..40).filter_map(|x| if x%2 == 1 { None } else { Some(x*2 + 10) }); + let mut iter = (0..40).filter_map(|x| if x % 2 == 1 { None } else { Some(x * 2 + 10) }); assert_eq!(iter.try_fold(0, i8::checked_add), None); assert_eq!(iter.next(), Some(38)); assert_eq!(iter.try_rfold(0, i8::checked_add), None); @@ -2576,9 +2628,9 @@ fn test_filter_map_try_folds() { #[test] fn test_enumerate_try_folds() { - let f = &|acc, (i, x)| usize::checked_add(2*acc, x/(i+1) + i); - assert_eq!((9..18).enumerate().try_fold(7, f), (0..9).map(|i| (i, i+9)).try_fold(7, f)); - assert_eq!((9..18).enumerate().try_rfold(7, f), (0..9).map(|i| (i, i+9)).try_rfold(7, f)); + let f = &|acc, (i, x)| usize::checked_add(2 * acc, x / (i + 1) + i); + assert_eq!((9..18).enumerate().try_fold(7, f), (0..9).map(|i| (i, i + 9)).try_fold(7, f)); + assert_eq!((9..18).enumerate().try_rfold(7, f), (0..9).map(|i| (i, i + 9)).try_rfold(7, f)); let mut iter = (100..200).enumerate(); let f = &|acc, (i, x)| u8::checked_add(acc, u8::checked_div(x, i as u8 + 1)?); @@ -2590,7 +2642,7 @@ fn test_enumerate_try_folds() { #[test] fn test_peek_try_folds() { - let f = &|acc, x| i32::checked_add(2*acc, x); + let f = &|acc, x| i32::checked_add(2 * acc, x); assert_eq!((1..20).peekable().try_fold(7, f), (1..20).try_fold(7, f)); assert_eq!((1..20).peekable().try_rfold(7, f), (1..20).try_rfold(7, f)); @@ -2637,8 +2689,10 @@ fn test_peek_try_folds() { #[test] fn test_skip_while_try_fold() { - let f = &|acc, x| i32::checked_add(2*acc, x); - fn p(&x: &i32) -> bool { (x % 10) <= 5 } + let f = &|acc, x| i32::checked_add(2 * acc, x); + fn p(&x: &i32) -> bool { + (x % 10) <= 5 + } assert_eq!((1..20).skip_while(p).try_fold(7, f), (6..20).try_fold(7, f)); let mut iter = (1..20).skip_while(p); assert_eq!(iter.nth(5), Some(11)); @@ -2651,13 +2705,13 @@ fn test_skip_while_try_fold() { #[test] fn test_take_while_folds() { - let f = &|acc, x| i32::checked_add(2*acc, x); + let f = &|acc, x| i32::checked_add(2 * acc, x); assert_eq!((1..20).take_while(|&x| x != 10).try_fold(7, f), (1..10).try_fold(7, f)); let mut iter = (1..20).take_while(|&x| x != 10); - assert_eq!(iter.try_fold(0, |x, y| Some(x+y)), Some((1..10).sum())); + assert_eq!(iter.try_fold(0, |x, y| Some(x + y)), Some((1..10).sum())); assert_eq!(iter.next(), None, "flag should be set"); let iter = (1..20).take_while(|&x| x != 10); - assert_eq!(iter.fold(0, |x, y| x+y), (1..10).sum()); + assert_eq!(iter.fold(0, |x, y| x + y), (1..10).sum()); let mut iter = (10..50).take_while(|&x| x != 40); assert_eq!(iter.try_fold(0, i8::checked_add), None); @@ -2666,7 +2720,7 @@ fn test_take_while_folds() { #[test] fn test_skip_try_folds() { - let f = &|acc, x| i32::checked_add(2*acc, x); + let f = &|acc, x| i32::checked_add(2 * acc, x); assert_eq!((1..20).skip(9).try_fold(7, f), (10..20).try_fold(7, f)); assert_eq!((1..20).skip(9).try_rfold(7, f), (10..20).try_rfold(7, f)); @@ -2713,7 +2767,7 @@ fn test_skip_nth_back() { #[test] fn test_take_try_folds() { - let f = &|acc, x| i32::checked_add(2*acc, x); + let f = &|acc, x| i32::checked_add(2 * acc, x); assert_eq!((10..30).take(10).try_fold(7, f), (10..20).try_fold(7, f)); assert_eq!((10..30).take(10).try_rfold(7, f), (10..20).try_rfold(7, f)); @@ -2738,15 +2792,16 @@ fn test_take_try_folds() { #[test] fn test_flat_map_try_folds() { - let f = &|acc, x| i32::checked_add(acc*2/3, x); - let mr = &|x| (5*x)..(5*x + 5); + let f = &|acc, x| i32::checked_add(acc * 2 / 3, x); + let mr = &|x| (5 * x)..(5 * x + 5); assert_eq!((0..10).flat_map(mr).try_fold(7, f), (0..50).try_fold(7, f)); assert_eq!((0..10).flat_map(mr).try_rfold(7, f), (0..50).try_rfold(7, f)); let mut iter = (0..10).flat_map(mr); - iter.next(); iter.next_back(); // have front and back iters in progress + iter.next(); + iter.next_back(); // have front and back iters in progress assert_eq!(iter.try_rfold(7, f), (1..49).try_rfold(7, f)); - let mut iter = (0..10).flat_map(|x| (4*x)..(4*x + 4)); + let mut iter = (0..10).flat_map(|x| (4 * x)..(4 * x + 4)); assert_eq!(iter.try_fold(0, i8::checked_add), None); assert_eq!(iter.next(), Some(17)); assert_eq!(iter.try_rfold(0, i8::checked_add), None); @@ -2755,15 +2810,16 @@ fn test_flat_map_try_folds() { #[test] fn test_flatten_try_folds() { - let f = &|acc, x| i32::checked_add(acc*2/3, x); - let mr = &|x| (5*x)..(5*x + 5); + let f = &|acc, x| i32::checked_add(acc * 2 / 3, x); + let mr = &|x| (5 * x)..(5 * x + 5); assert_eq!((0..10).map(mr).flatten().try_fold(7, f), (0..50).try_fold(7, f)); assert_eq!((0..10).map(mr).flatten().try_rfold(7, f), (0..50).try_rfold(7, f)); let mut iter = (0..10).map(mr).flatten(); - iter.next(); iter.next_back(); // have front and back iters in progress + iter.next(); + iter.next_back(); // have front and back iters in progress assert_eq!(iter.try_rfold(7, f), (1..49).try_rfold(7, f)); - let mut iter = (0..10).map(|x| (4*x)..(4*x + 4)).flatten(); + let mut iter = (0..10).map(|x| (4 * x)..(4 * x + 4)).flatten(); assert_eq!(iter.try_fold(0, i8::checked_add), None); assert_eq!(iter.next(), Some(17)); assert_eq!(iter.try_rfold(0, i8::checked_add), None); @@ -2773,13 +2829,21 @@ fn test_flatten_try_folds() { #[test] fn test_functor_laws() { // identity: - fn identity(x: T) -> T { x } + fn identity(x: T) -> T { + x + } assert_eq!((0..10).map(identity).sum::(), (0..10).sum()); // composition: - fn f(x: usize) -> usize { x + 3 } - fn g(x: usize) -> usize { x * 2 } - fn h(x: usize) -> usize { g(f(x)) } + fn f(x: usize) -> usize { + x + 3 + } + fn g(x: usize) -> usize { + x * 2 + } + fn h(x: usize) -> usize { + g(f(x)) + } assert_eq!((0..10).map(f).map(g).sum::(), (0..10).map(h).sum()); } @@ -2798,10 +2862,16 @@ fn test_monad_laws_right_identity() { #[test] fn test_monad_laws_associativity() { - fn f(x: usize) -> impl Iterator { 0..x } - fn g(x: usize) -> impl Iterator { (0..x).rev() } - assert_eq!((0..10).flat_map(f).flat_map(g).sum::(), - (0..10).flat_map(|x| f(x).flat_map(g)).sum::()); + fn f(x: usize) -> impl Iterator { + 0..x + } + fn g(x: usize) -> impl Iterator { + (0..x).rev() + } + assert_eq!( + (0..10).flat_map(f).flat_map(g).sum::(), + (0..10).flat_map(|x| f(x).flat_map(g)).sum::() + ); } #[test] diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs index b28ed2eaa0..567c840b01 100644 --- a/src/libcore/tests/lib.rs +++ b/src/libcore/tests/lib.rs @@ -4,20 +4,21 @@ #![feature(cell_update)] #![feature(core_private_bignum)] #![feature(core_private_diy_float)] -#![feature(debug_map_key_value)] +#![feature(debug_non_exhaustive)] #![feature(dec2flt)] #![feature(exact_size_is_empty)] #![feature(fixed_size_array)] #![feature(flt2dec)] #![feature(fmt_internals)] #![feature(hashmap_internals)] +#![feature(try_find)] #![feature(is_sorted)] #![feature(iter_once_with)] #![feature(pattern)] #![feature(range_is_empty)] #![feature(raw)] #![feature(saturating_neg)] -#![feature(slice_patterns)] +#![cfg_attr(bootstrap, feature(slice_patterns))] #![feature(sort_internals)] #![feature(slice_partition_at_index)] #![feature(specialization)] @@ -30,12 +31,16 @@ #![feature(slice_internals)] #![feature(slice_partition_dedup)] #![feature(int_error_matching)] -#![feature(const_fn)] #![feature(array_value_iter)] #![feature(iter_partition_in_place)] #![feature(iter_is_partitioned)] #![feature(iter_order_by)] #![feature(cmp_min_max_by)] +#![feature(const_slice_from_raw_parts)] +#![feature(const_raw_ptr_deref)] +#![feature(never_type)] +#![feature(unwrap_infallible)] +#![feature(leading_trailing_ones)] extern crate test; diff --git a/src/libcore/tests/num/dec2flt/mod.rs b/src/libcore/tests/num/dec2flt/mod.rs index 6bb348fd75..a1fa5556ae 100644 --- a/src/libcore/tests/num/dec2flt/mod.rs +++ b/src/libcore/tests/num/dec2flt/mod.rs @@ -32,7 +32,8 @@ fn ordinary() { test_literal!(12345.); test_literal!(0.9999999); - if cfg!(miri) { // Miri is too slow + if cfg!(miri) { + // Miri is too slow return; } @@ -82,7 +83,8 @@ fn zero() { test_literal!(0.0); test_literal!(1e-325); - if cfg!(miri) { // Miri is too slow + if cfg!(miri) { + // Miri is too slow return; } diff --git a/src/libcore/tests/num/flt2dec/mod.rs b/src/libcore/tests/num/flt2dec/mod.rs index 2f94ea2fc4..f693504824 100644 --- a/src/libcore/tests/num/flt2dec/mod.rs +++ b/src/libcore/tests/num/flt2dec/mod.rs @@ -1,9 +1,10 @@ -use std::{str, i16, f32, f64, fmt}; +use std::{f32, f64, fmt, i16, str}; -use core::num::flt2dec::{decode, DecodableFloat, FullDecoded, Decoded}; -use core::num::flt2dec::{MAX_SIG_DIGITS, round_up, Part, Formatted, Sign}; -use core::num::flt2dec::{to_shortest_str, to_shortest_exp_str, - to_exact_exp_str, to_exact_fixed_str}; +use core::num::flt2dec::{decode, DecodableFloat, Decoded, FullDecoded}; +use core::num::flt2dec::{round_up, Formatted, Part, Sign, MAX_SIG_DIGITS}; +use core::num::flt2dec::{ + to_exact_exp_str, to_exact_fixed_str, to_shortest_exp_str, to_shortest_str, +}; pub use test::Bencher; @@ -17,7 +18,7 @@ mod random; pub fn decode_finite(v: T) -> Decoded { match decode(v).1 { FullDecoded::Finite(decoded) => decoded, - full_decoded => panic!("expected finite, got {:?} instead", full_decoded) + full_decoded => panic!("expected finite, got {:?} instead", full_decoded), } } @@ -81,7 +82,7 @@ fn ldexp_f32(a: f32, b: i32) -> f32 { } fn ldexp_f64(a: f64, b: i32) -> f64 { - extern { + extern "C" { fn ldexp(x: f64, n: i32) -> f64; } // SAFETY: assuming a correct `ldexp` has been supplied, the given arguments cannot possibly @@ -90,7 +91,10 @@ fn ldexp_f64(a: f64, b: i32) -> f64 { } fn check_exact(mut f: F, v: T, vstr: &str, expected: &[u8], expectedk: i16) - where T: DecodableFloat, F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) { +where + T: DecodableFloat, + F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16), +{ // use a large enough buffer let mut buf = [b'_'; 1024]; let mut expected_ = [b'_'; 1024]; @@ -105,14 +109,18 @@ fn check_exact(mut f: F, v: T, vstr: &str, expected: &[u8], expectedk: i16 if expected[i] >= b'5' { // check if this is a rounding-to-even case. // we avoid rounding ...x5000... (with infinite zeroes) to ...(x+1) when x is even. - if !(i+1 < expected.len() && expected[i-1] & 1 == 0 && - expected[i] == b'5' && - expected[i+1] == b' ') { + if !(i + 1 < expected.len() + && expected[i - 1] & 1 == 0 + && expected[i] == b'5' + && expected[i + 1] == b' ') + { // if this returns true, expected_[..i] is all `9`s and being rounded up. // we should always return `100..00` (`i` digits) instead, since that's // what we can came up with `i` digits anyway. `round_up` assumes that // the adjustment to the length is done by caller, which we simply ignore. - if let Some(_) = round_up(&mut expected_, i) { expectedk_ += 1; } + if let Some(_) = round_up(&mut expected_, i) { + expectedk_ += 1; + } } } @@ -146,9 +154,11 @@ fn check_exact(mut f: F, v: T, vstr: &str, expected: &[u8], expectedk: i16 // check infinite zero digits if let Some(cut) = cut { - for i in cut..expected.len()-1 { + for i in cut..expected.len() - 1 { expected_[..cut].copy_from_slice(&expected[..cut]); - for c in &mut expected_[cut..i] { *c = b'0'; } + for c in &mut expected_[cut..i] { + *c = b'0'; + } try_exact!(f(&decoded) => &mut buf, &expected_[..i], expectedk; "exact infzero mismatch for v={v}, i={i}: \ @@ -162,23 +172,29 @@ fn check_exact(mut f: F, v: T, vstr: &str, expected: &[u8], expectedk: i16 } } -trait TestableFloat : DecodableFloat + fmt::Display { +trait TestableFloat: DecodableFloat + fmt::Display { /// Returns `x * 2^exp`. Almost same to `std::{f32,f64}::ldexp`. /// This is used for testing. fn ldexpi(f: i64, exp: isize) -> Self; } impl TestableFloat for f32 { - fn ldexpi(f: i64, exp: isize) -> Self { f as Self * (exp as Self).exp2() } + fn ldexpi(f: i64, exp: isize) -> Self { + f as Self * (exp as Self).exp2() + } } impl TestableFloat for f64 { - fn ldexpi(f: i64, exp: isize) -> Self { f as Self * (exp as Self).exp2() } + fn ldexpi(f: i64, exp: isize) -> Self { + f as Self * (exp as Self).exp2() + } } fn check_exact_one(mut f: F, x: i64, e: isize, tstr: &str, expected: &[u8], expectedk: i16) - where T: TestableFloat, - F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) { +where + T: TestableFloat, + F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16), +{ // use a large enough buffer let mut buf = [b'_'; 1024]; let v: T = TestableFloat::ldexpi(x, e); @@ -193,15 +209,15 @@ fn check_exact_one(mut f: F, x: i64, e: isize, tstr: &str, expected: &[u8] } macro_rules! check_exact { - ($f:ident($v:expr) => $buf:expr, $exp:expr) => ( - check_exact(|d,b,k| $f(d,b,k), $v, stringify!($v), $buf, $exp) - ) + ($f:ident($v:expr) => $buf:expr, $exp:expr) => { + check_exact(|d, b, k| $f(d, b, k), $v, stringify!($v), $buf, $exp) + }; } macro_rules! check_exact_one { - ($f:ident($x:expr, $e:expr; $t:ty) => $buf:expr, $exp:expr) => ( - check_exact_one::<_, $t>(|d,b,k| $f(d,b,k), $x, $e, stringify!($t), $buf, $exp) - ) + ($f:ident($x:expr, $e:expr; $t:ty) => $buf:expr, $exp:expr) => { + check_exact_one::<_, $t>(|d, b, k| $f(d, b, k), $x, $e, stringify!($t), $buf, $exp) + }; } // in the following comments, three numbers are spaced by 1 ulp apart, @@ -212,7 +228,10 @@ macro_rules! check_exact_one { // [1] Vern Paxson, A Program for Testing IEEE Decimal-Binary Conversion // ftp://ftp.ee.lbl.gov/testbase-report.ps.Z -pub fn f32_shortest_sanity_test(mut f: F) where F: FnMut(&Decoded, &mut [u8]) -> (usize, i16) { +pub fn f32_shortest_sanity_test(mut f: F) +where + F: FnMut(&Decoded, &mut [u8]) -> (usize, i16), +{ // 0.0999999940395355224609375 // 0.100000001490116119384765625 // 0.10000000894069671630859375 @@ -257,7 +276,9 @@ pub fn f32_shortest_sanity_test(mut f: F) where F: FnMut(&Decoded, &mut [u8]) } pub fn f32_exact_sanity_test(mut f: F) - where F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) { +where + F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16), +{ let minf32 = ldexp_f32(1.0, -149); check_exact!(f(0.1f32) => b"100000001490116119384765625 ", 0); @@ -298,7 +319,10 @@ pub fn f32_exact_sanity_test(mut f: F) check_exact_one!(f(13248074, 95; f32) => b"524810279937", 36); } -pub fn f64_shortest_sanity_test(mut f: F) where F: FnMut(&Decoded, &mut [u8]) -> (usize, i16) { +pub fn f64_shortest_sanity_test(mut f: F) +where + F: FnMut(&Decoded, &mut [u8]) -> (usize, i16), +{ // 0.0999999999999999777955395074968691915273... // 0.1000000000000000055511151231257827021181... // 0.1000000000000000333066907387546962127089... @@ -362,7 +386,9 @@ pub fn f64_shortest_sanity_test(mut f: F) where F: FnMut(&Decoded, &mut [u8]) } pub fn f64_exact_sanity_test(mut f: F) - where F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) { +where + F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16), +{ let minf64 = ldexp_f64(1.0, -1074); check_exact!(f(0.1f64) => b"1000000000000000055511151231257827021181", 0); @@ -446,7 +472,10 @@ pub fn f64_exact_sanity_test(mut f: F) check_exact_one!(f(8549497411294502, -448; f64) => b"1176257830728540379990", -118); } -pub fn more_shortest_sanity_test(mut f: F) where F: FnMut(&Decoded, &mut [u8]) -> (usize, i16) { +pub fn more_shortest_sanity_test(mut f: F) +where + F: FnMut(&Decoded, &mut [u8]) -> (usize, i16), +{ check_shortest!(f{mant: 99_999_999_999_999_999, minus: 1, plus: 1, exp: 0, inclusive: true} => b"1", 18); check_shortest!(f{mant: 99_999_999_999_999_999, minus: 1, plus: 1, @@ -454,7 +483,9 @@ pub fn more_shortest_sanity_test(mut f: F) where F: FnMut(&Decoded, &mut [u8] } fn to_string_with_parts(mut f: F) -> String - where F: for<'a> FnMut(&'a mut [u8], &'a mut [Part<'a>]) -> Formatted<'a> { +where + F: for<'a> FnMut(&'a mut [u8], &'a mut [Part<'a>]) -> Formatted<'a>, +{ let mut buf = [0; 1024]; let mut parts = [Part::Zero(0); 16]; let formatted = f(&mut buf, &mut parts); @@ -464,66 +495,72 @@ fn to_string_with_parts(mut f: F) -> String } pub fn to_shortest_str_test(mut f_: F) - where F: FnMut(&Decoded, &mut [u8]) -> (usize, i16) { +where + F: FnMut(&Decoded, &mut [u8]) -> (usize, i16), +{ use core::num::flt2dec::Sign::*; fn to_string(f: &mut F, v: T, sign: Sign, frac_digits: usize, upper: bool) -> String - where T: DecodableFloat, F: FnMut(&Decoded, &mut [u8]) -> (usize, i16) { - to_string_with_parts(|buf, parts| to_shortest_str(|d,b| f(d,b), v, sign, - frac_digits, upper, buf, parts)) + where + T: DecodableFloat, + F: FnMut(&Decoded, &mut [u8]) -> (usize, i16), + { + to_string_with_parts(|buf, parts| { + to_shortest_str(|d, b| f(d, b), v, sign, frac_digits, upper, buf, parts) + }) } let f = &mut f_; - assert_eq!(to_string(f, 0.0, Minus, 0, false), "0"); - assert_eq!(to_string(f, 0.0, MinusRaw, 0, false), "0"); - assert_eq!(to_string(f, 0.0, MinusPlus, 0, false), "+0"); - assert_eq!(to_string(f, 0.0, MinusPlusRaw, 0, false), "+0"); - assert_eq!(to_string(f, -0.0, Minus, 0, false), "0"); - assert_eq!(to_string(f, -0.0, MinusRaw, 0, false), "-0"); - assert_eq!(to_string(f, -0.0, MinusPlus, 0, false), "+0"); + assert_eq!(to_string(f, 0.0, Minus, 0, false), "0"); + assert_eq!(to_string(f, 0.0, MinusRaw, 0, false), "0"); + assert_eq!(to_string(f, 0.0, MinusPlus, 0, false), "+0"); + assert_eq!(to_string(f, 0.0, MinusPlusRaw, 0, false), "+0"); + assert_eq!(to_string(f, -0.0, Minus, 0, false), "0"); + assert_eq!(to_string(f, -0.0, MinusRaw, 0, false), "-0"); + assert_eq!(to_string(f, -0.0, MinusPlus, 0, false), "+0"); assert_eq!(to_string(f, -0.0, MinusPlusRaw, 0, false), "-0"); - assert_eq!(to_string(f, 0.0, Minus, 1, true), "0.0"); - assert_eq!(to_string(f, 0.0, MinusRaw, 1, true), "0.0"); - assert_eq!(to_string(f, 0.0, MinusPlus, 1, true), "+0.0"); - assert_eq!(to_string(f, 0.0, MinusPlusRaw, 1, true), "+0.0"); - assert_eq!(to_string(f, -0.0, Minus, 8, true), "0.00000000"); - assert_eq!(to_string(f, -0.0, MinusRaw, 8, true), "-0.00000000"); - assert_eq!(to_string(f, -0.0, MinusPlus, 8, true), "+0.00000000"); - assert_eq!(to_string(f, -0.0, MinusPlusRaw, 8, true), "-0.00000000"); - - assert_eq!(to_string(f, 1.0/0.0, Minus, 0, false), "inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusRaw, 0, true), "inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusPlus, 0, false), "+inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusPlusRaw, 0, true), "+inf"); - assert_eq!(to_string(f, 0.0/0.0, Minus, 0, false), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusRaw, 1, true), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusPlus, 8, false), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusPlusRaw, 64, true), "NaN"); - assert_eq!(to_string(f, -1.0/0.0, Minus, 0, false), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusRaw, 1, true), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusPlus, 8, false), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusPlusRaw, 64, true), "-inf"); - - assert_eq!(to_string(f, 3.14, Minus, 0, false), "3.14"); - assert_eq!(to_string(f, 3.14, MinusRaw, 0, false), "3.14"); - assert_eq!(to_string(f, 3.14, MinusPlus, 0, false), "+3.14"); - assert_eq!(to_string(f, 3.14, MinusPlusRaw, 0, false), "+3.14"); - assert_eq!(to_string(f, -3.14, Minus, 0, false), "-3.14"); - assert_eq!(to_string(f, -3.14, MinusRaw, 0, false), "-3.14"); - assert_eq!(to_string(f, -3.14, MinusPlus, 0, false), "-3.14"); + assert_eq!(to_string(f, 0.0, Minus, 1, true), "0.0"); + assert_eq!(to_string(f, 0.0, MinusRaw, 1, true), "0.0"); + assert_eq!(to_string(f, 0.0, MinusPlus, 1, true), "+0.0"); + assert_eq!(to_string(f, 0.0, MinusPlusRaw, 1, true), "+0.0"); + assert_eq!(to_string(f, -0.0, Minus, 8, true), "0.00000000"); + assert_eq!(to_string(f, -0.0, MinusRaw, 8, true), "-0.00000000"); + assert_eq!(to_string(f, -0.0, MinusPlus, 8, true), "+0.00000000"); + assert_eq!(to_string(f, -0.0, MinusPlusRaw, 8, true), "-0.00000000"); + + assert_eq!(to_string(f, 1.0 / 0.0, Minus, 0, false), "inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusRaw, 0, true), "inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusPlus, 0, false), "+inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusPlusRaw, 0, true), "+inf"); + assert_eq!(to_string(f, 0.0 / 0.0, Minus, 0, false), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusRaw, 1, true), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusPlus, 8, false), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusPlusRaw, 64, true), "NaN"); + assert_eq!(to_string(f, -1.0 / 0.0, Minus, 0, false), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusRaw, 1, true), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusPlus, 8, false), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusPlusRaw, 64, true), "-inf"); + + assert_eq!(to_string(f, 3.14, Minus, 0, false), "3.14"); + assert_eq!(to_string(f, 3.14, MinusRaw, 0, false), "3.14"); + assert_eq!(to_string(f, 3.14, MinusPlus, 0, false), "+3.14"); + assert_eq!(to_string(f, 3.14, MinusPlusRaw, 0, false), "+3.14"); + assert_eq!(to_string(f, -3.14, Minus, 0, false), "-3.14"); + assert_eq!(to_string(f, -3.14, MinusRaw, 0, false), "-3.14"); + assert_eq!(to_string(f, -3.14, MinusPlus, 0, false), "-3.14"); assert_eq!(to_string(f, -3.14, MinusPlusRaw, 0, false), "-3.14"); - assert_eq!(to_string(f, 3.14, Minus, 1, true), "3.14"); - assert_eq!(to_string(f, 3.14, MinusRaw, 2, true), "3.14"); - assert_eq!(to_string(f, 3.14, MinusPlus, 3, true), "+3.140"); - assert_eq!(to_string(f, 3.14, MinusPlusRaw, 4, true), "+3.1400"); - assert_eq!(to_string(f, -3.14, Minus, 8, true), "-3.14000000"); - assert_eq!(to_string(f, -3.14, MinusRaw, 8, true), "-3.14000000"); - assert_eq!(to_string(f, -3.14, MinusPlus, 8, true), "-3.14000000"); - assert_eq!(to_string(f, -3.14, MinusPlusRaw, 8, true), "-3.14000000"); - - assert_eq!(to_string(f, 7.5e-11, Minus, 0, false), "0.000000000075"); - assert_eq!(to_string(f, 7.5e-11, Minus, 3, false), "0.000000000075"); + assert_eq!(to_string(f, 3.14, Minus, 1, true), "3.14"); + assert_eq!(to_string(f, 3.14, MinusRaw, 2, true), "3.14"); + assert_eq!(to_string(f, 3.14, MinusPlus, 3, true), "+3.140"); + assert_eq!(to_string(f, 3.14, MinusPlusRaw, 4, true), "+3.1400"); + assert_eq!(to_string(f, -3.14, Minus, 8, true), "-3.14000000"); + assert_eq!(to_string(f, -3.14, MinusRaw, 8, true), "-3.14000000"); + assert_eq!(to_string(f, -3.14, MinusPlus, 8, true), "-3.14000000"); + assert_eq!(to_string(f, -3.14, MinusPlusRaw, 8, true), "-3.14000000"); + + assert_eq!(to_string(f, 7.5e-11, Minus, 0, false), "0.000000000075"); + assert_eq!(to_string(f, 7.5e-11, Minus, 3, false), "0.000000000075"); assert_eq!(to_string(f, 7.5e-11, Minus, 12, false), "0.000000000075"); assert_eq!(to_string(f, 7.5e-11, Minus, 13, false), "0.0000000000750"); @@ -536,23 +573,24 @@ pub fn to_shortest_str_test(mut f_: F) assert_eq!(to_string(f, f32::MAX, Minus, 8, false), format!("34028235{:0>31}.00000000", "")); let minf32 = ldexp_f32(1.0, -149); - assert_eq!(to_string(f, minf32, Minus, 0, false), format!("0.{:0>44}1", "")); + assert_eq!(to_string(f, minf32, Minus, 0, false), format!("0.{:0>44}1", "")); assert_eq!(to_string(f, minf32, Minus, 45, false), format!("0.{:0>44}1", "")); assert_eq!(to_string(f, minf32, Minus, 46, false), format!("0.{:0>44}10", "")); - assert_eq!(to_string(f, f64::MAX, Minus, 0, false), - format!("17976931348623157{:0>292}", "")); - assert_eq!(to_string(f, f64::MAX, Minus, 1, false), - format!("17976931348623157{:0>292}.0", "")); - assert_eq!(to_string(f, f64::MAX, Minus, 8, false), - format!("17976931348623157{:0>292}.00000000", "")); + assert_eq!(to_string(f, f64::MAX, Minus, 0, false), format!("17976931348623157{:0>292}", "")); + assert_eq!(to_string(f, f64::MAX, Minus, 1, false), format!("17976931348623157{:0>292}.0", "")); + assert_eq!( + to_string(f, f64::MAX, Minus, 8, false), + format!("17976931348623157{:0>292}.00000000", "") + ); let minf64 = ldexp_f64(1.0, -1074); - assert_eq!(to_string(f, minf64, Minus, 0, false), format!("0.{:0>323}5", "")); + assert_eq!(to_string(f, minf64, Minus, 0, false), format!("0.{:0>323}5", "")); assert_eq!(to_string(f, minf64, Minus, 324, false), format!("0.{:0>323}5", "")); assert_eq!(to_string(f, minf64, Minus, 325, false), format!("0.{:0>323}50", "")); - if cfg!(miri) { // Miri is too slow + if cfg!(miri) { + // Miri is too slow return; } @@ -561,86 +599,92 @@ pub fn to_shortest_str_test(mut f_: F) } pub fn to_shortest_exp_str_test(mut f_: F) - where F: FnMut(&Decoded, &mut [u8]) -> (usize, i16) { +where + F: FnMut(&Decoded, &mut [u8]) -> (usize, i16), +{ use core::num::flt2dec::Sign::*; fn to_string(f: &mut F, v: T, sign: Sign, exp_bounds: (i16, i16), upper: bool) -> String - where T: DecodableFloat, F: FnMut(&Decoded, &mut [u8]) -> (usize, i16) { - to_string_with_parts(|buf, parts| to_shortest_exp_str(|d,b| f(d,b), v, sign, - exp_bounds, upper, buf, parts)) + where + T: DecodableFloat, + F: FnMut(&Decoded, &mut [u8]) -> (usize, i16), + { + to_string_with_parts(|buf, parts| { + to_shortest_exp_str(|d, b| f(d, b), v, sign, exp_bounds, upper, buf, parts) + }) } let f = &mut f_; - assert_eq!(to_string(f, 0.0, Minus, (-4, 16), false), "0"); - assert_eq!(to_string(f, 0.0, MinusRaw, (-4, 16), false), "0"); - assert_eq!(to_string(f, 0.0, MinusPlus, (-4, 16), false), "+0"); - assert_eq!(to_string(f, 0.0, MinusPlusRaw, (-4, 16), false), "+0"); - assert_eq!(to_string(f, -0.0, Minus, (-4, 16), false), "0"); - assert_eq!(to_string(f, -0.0, MinusRaw, (-4, 16), false), "-0"); - assert_eq!(to_string(f, -0.0, MinusPlus, (-4, 16), false), "+0"); + assert_eq!(to_string(f, 0.0, Minus, (-4, 16), false), "0"); + assert_eq!(to_string(f, 0.0, MinusRaw, (-4, 16), false), "0"); + assert_eq!(to_string(f, 0.0, MinusPlus, (-4, 16), false), "+0"); + assert_eq!(to_string(f, 0.0, MinusPlusRaw, (-4, 16), false), "+0"); + assert_eq!(to_string(f, -0.0, Minus, (-4, 16), false), "0"); + assert_eq!(to_string(f, -0.0, MinusRaw, (-4, 16), false), "-0"); + assert_eq!(to_string(f, -0.0, MinusPlus, (-4, 16), false), "+0"); assert_eq!(to_string(f, -0.0, MinusPlusRaw, (-4, 16), false), "-0"); - assert_eq!(to_string(f, 0.0, Minus, ( 0, 0), true), "0E0"); - assert_eq!(to_string(f, 0.0, MinusRaw, ( 0, 0), false), "0e0"); - assert_eq!(to_string(f, 0.0, MinusPlus, (-9, -5), true), "+0E0"); - assert_eq!(to_string(f, 0.0, MinusPlusRaw, ( 5, 9), false), "+0e0"); - assert_eq!(to_string(f, -0.0, Minus, ( 0, 0), true), "0E0"); - assert_eq!(to_string(f, -0.0, MinusRaw, ( 0, 0), false), "-0e0"); - assert_eq!(to_string(f, -0.0, MinusPlus, (-9, -5), true), "+0E0"); - assert_eq!(to_string(f, -0.0, MinusPlusRaw, ( 5, 9), false), "-0e0"); - - assert_eq!(to_string(f, 1.0/0.0, Minus, (-4, 16), false), "inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusRaw, (-4, 16), true), "inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusPlus, (-4, 16), false), "+inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusPlusRaw, (-4, 16), true), "+inf"); - assert_eq!(to_string(f, 0.0/0.0, Minus, ( 0, 0), false), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusRaw, ( 0, 0), true), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusPlus, (-9, -5), false), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusPlusRaw, ( 5, 9), true), "NaN"); - assert_eq!(to_string(f, -1.0/0.0, Minus, ( 0, 0), false), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusRaw, ( 0, 0), true), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusPlus, (-9, -5), false), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusPlusRaw, ( 5, 9), true), "-inf"); - - assert_eq!(to_string(f, 3.14, Minus, (-4, 16), false), "3.14"); - assert_eq!(to_string(f, 3.14, MinusRaw, (-4, 16), false), "3.14"); - assert_eq!(to_string(f, 3.14, MinusPlus, (-4, 16), false), "+3.14"); - assert_eq!(to_string(f, 3.14, MinusPlusRaw, (-4, 16), false), "+3.14"); - assert_eq!(to_string(f, -3.14, Minus, (-4, 16), false), "-3.14"); - assert_eq!(to_string(f, -3.14, MinusRaw, (-4, 16), false), "-3.14"); - assert_eq!(to_string(f, -3.14, MinusPlus, (-4, 16), false), "-3.14"); + assert_eq!(to_string(f, 0.0, Minus, (0, 0), true), "0E0"); + assert_eq!(to_string(f, 0.0, MinusRaw, (0, 0), false), "0e0"); + assert_eq!(to_string(f, 0.0, MinusPlus, (-9, -5), true), "+0E0"); + assert_eq!(to_string(f, 0.0, MinusPlusRaw, (5, 9), false), "+0e0"); + assert_eq!(to_string(f, -0.0, Minus, (0, 0), true), "0E0"); + assert_eq!(to_string(f, -0.0, MinusRaw, (0, 0), false), "-0e0"); + assert_eq!(to_string(f, -0.0, MinusPlus, (-9, -5), true), "+0E0"); + assert_eq!(to_string(f, -0.0, MinusPlusRaw, (5, 9), false), "-0e0"); + + assert_eq!(to_string(f, 1.0 / 0.0, Minus, (-4, 16), false), "inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusRaw, (-4, 16), true), "inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusPlus, (-4, 16), false), "+inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusPlusRaw, (-4, 16), true), "+inf"); + assert_eq!(to_string(f, 0.0 / 0.0, Minus, (0, 0), false), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusRaw, (0, 0), true), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusPlus, (-9, -5), false), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusPlusRaw, (5, 9), true), "NaN"); + assert_eq!(to_string(f, -1.0 / 0.0, Minus, (0, 0), false), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusRaw, (0, 0), true), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusPlus, (-9, -5), false), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusPlusRaw, (5, 9), true), "-inf"); + + assert_eq!(to_string(f, 3.14, Minus, (-4, 16), false), "3.14"); + assert_eq!(to_string(f, 3.14, MinusRaw, (-4, 16), false), "3.14"); + assert_eq!(to_string(f, 3.14, MinusPlus, (-4, 16), false), "+3.14"); + assert_eq!(to_string(f, 3.14, MinusPlusRaw, (-4, 16), false), "+3.14"); + assert_eq!(to_string(f, -3.14, Minus, (-4, 16), false), "-3.14"); + assert_eq!(to_string(f, -3.14, MinusRaw, (-4, 16), false), "-3.14"); + assert_eq!(to_string(f, -3.14, MinusPlus, (-4, 16), false), "-3.14"); assert_eq!(to_string(f, -3.14, MinusPlusRaw, (-4, 16), false), "-3.14"); - assert_eq!(to_string(f, 3.14, Minus, ( 0, 0), true), "3.14E0"); - assert_eq!(to_string(f, 3.14, MinusRaw, ( 0, 0), false), "3.14e0"); - assert_eq!(to_string(f, 3.14, MinusPlus, (-9, -5), true), "+3.14E0"); - assert_eq!(to_string(f, 3.14, MinusPlusRaw, ( 5, 9), false), "+3.14e0"); - assert_eq!(to_string(f, -3.14, Minus, ( 0, 0), true), "-3.14E0"); - assert_eq!(to_string(f, -3.14, MinusRaw, ( 0, 0), false), "-3.14e0"); - assert_eq!(to_string(f, -3.14, MinusPlus, (-9, -5), true), "-3.14E0"); - assert_eq!(to_string(f, -3.14, MinusPlusRaw, ( 5, 9), false), "-3.14e0"); - - assert_eq!(to_string(f, 0.1, Minus, (-4, 16), false), "0.1"); - assert_eq!(to_string(f, 0.1, MinusRaw, (-4, 16), false), "0.1"); - assert_eq!(to_string(f, 0.1, MinusPlus, (-4, 16), false), "+0.1"); - assert_eq!(to_string(f, 0.1, MinusPlusRaw, (-4, 16), false), "+0.1"); - assert_eq!(to_string(f, -0.1, Minus, (-4, 16), false), "-0.1"); - assert_eq!(to_string(f, -0.1, MinusRaw, (-4, 16), false), "-0.1"); - assert_eq!(to_string(f, -0.1, MinusPlus, (-4, 16), false), "-0.1"); + assert_eq!(to_string(f, 3.14, Minus, (0, 0), true), "3.14E0"); + assert_eq!(to_string(f, 3.14, MinusRaw, (0, 0), false), "3.14e0"); + assert_eq!(to_string(f, 3.14, MinusPlus, (-9, -5), true), "+3.14E0"); + assert_eq!(to_string(f, 3.14, MinusPlusRaw, (5, 9), false), "+3.14e0"); + assert_eq!(to_string(f, -3.14, Minus, (0, 0), true), "-3.14E0"); + assert_eq!(to_string(f, -3.14, MinusRaw, (0, 0), false), "-3.14e0"); + assert_eq!(to_string(f, -3.14, MinusPlus, (-9, -5), true), "-3.14E0"); + assert_eq!(to_string(f, -3.14, MinusPlusRaw, (5, 9), false), "-3.14e0"); + + assert_eq!(to_string(f, 0.1, Minus, (-4, 16), false), "0.1"); + assert_eq!(to_string(f, 0.1, MinusRaw, (-4, 16), false), "0.1"); + assert_eq!(to_string(f, 0.1, MinusPlus, (-4, 16), false), "+0.1"); + assert_eq!(to_string(f, 0.1, MinusPlusRaw, (-4, 16), false), "+0.1"); + assert_eq!(to_string(f, -0.1, Minus, (-4, 16), false), "-0.1"); + assert_eq!(to_string(f, -0.1, MinusRaw, (-4, 16), false), "-0.1"); + assert_eq!(to_string(f, -0.1, MinusPlus, (-4, 16), false), "-0.1"); assert_eq!(to_string(f, -0.1, MinusPlusRaw, (-4, 16), false), "-0.1"); - assert_eq!(to_string(f, 0.1, Minus, ( 0, 0), true), "1E-1"); - assert_eq!(to_string(f, 0.1, MinusRaw, ( 0, 0), false), "1e-1"); - assert_eq!(to_string(f, 0.1, MinusPlus, (-9, -5), true), "+1E-1"); - assert_eq!(to_string(f, 0.1, MinusPlusRaw, ( 5, 9), false), "+1e-1"); - assert_eq!(to_string(f, -0.1, Minus, ( 0, 0), true), "-1E-1"); - assert_eq!(to_string(f, -0.1, MinusRaw, ( 0, 0), false), "-1e-1"); - assert_eq!(to_string(f, -0.1, MinusPlus, (-9, -5), true), "-1E-1"); - assert_eq!(to_string(f, -0.1, MinusPlusRaw, ( 5, 9), false), "-1e-1"); - - assert_eq!(to_string(f, 7.5e-11, Minus, ( -4, 16), false), "7.5e-11"); + assert_eq!(to_string(f, 0.1, Minus, (0, 0), true), "1E-1"); + assert_eq!(to_string(f, 0.1, MinusRaw, (0, 0), false), "1e-1"); + assert_eq!(to_string(f, 0.1, MinusPlus, (-9, -5), true), "+1E-1"); + assert_eq!(to_string(f, 0.1, MinusPlusRaw, (5, 9), false), "+1e-1"); + assert_eq!(to_string(f, -0.1, Minus, (0, 0), true), "-1E-1"); + assert_eq!(to_string(f, -0.1, MinusRaw, (0, 0), false), "-1e-1"); + assert_eq!(to_string(f, -0.1, MinusPlus, (-9, -5), true), "-1E-1"); + assert_eq!(to_string(f, -0.1, MinusPlusRaw, (5, 9), false), "-1e-1"); + + assert_eq!(to_string(f, 7.5e-11, Minus, (-4, 16), false), "7.5e-11"); assert_eq!(to_string(f, 7.5e-11, Minus, (-11, 10), false), "0.000000000075"); assert_eq!(to_string(f, 7.5e-11, Minus, (-10, 11), false), "7.5e-11"); - assert_eq!(to_string(f, 1.9971e20, Minus, ( -4, 16), false), "1.9971e20"); + assert_eq!(to_string(f, 1.9971e20, Minus, (-4, 16), false), "1.9971e20"); assert_eq!(to_string(f, 1.9971e20, Minus, (-20, 21), false), "199710000000000000000"); assert_eq!(to_string(f, 1.9971e20, Minus, (-21, 20), false), "1.9971e20"); @@ -649,24 +693,24 @@ pub fn to_shortest_exp_str_test(mut f_: F) assert_eq!(to_string(f, 1.0e23, Minus, (23, 24), false), "100000000000000000000000"); assert_eq!(to_string(f, 1.0e23, Minus, (24, 25), false), "1e23"); - assert_eq!(to_string(f, f32::MAX, Minus, ( -4, 16), false), "3.4028235e38"); + assert_eq!(to_string(f, f32::MAX, Minus, (-4, 16), false), "3.4028235e38"); assert_eq!(to_string(f, f32::MAX, Minus, (-39, 38), false), "3.4028235e38"); assert_eq!(to_string(f, f32::MAX, Minus, (-38, 39), false), format!("34028235{:0>31}", "")); let minf32 = ldexp_f32(1.0, -149); - assert_eq!(to_string(f, minf32, Minus, ( -4, 16), false), "1e-45"); + assert_eq!(to_string(f, minf32, Minus, (-4, 16), false), "1e-45"); assert_eq!(to_string(f, minf32, Minus, (-44, 45), false), "1e-45"); assert_eq!(to_string(f, minf32, Minus, (-45, 44), false), format!("0.{:0>44}1", "")); - assert_eq!(to_string(f, f64::MAX, Minus, ( -4, 16), false), - "1.7976931348623157e308"); - assert_eq!(to_string(f, f64::MAX, Minus, (-308, 309), false), - format!("17976931348623157{:0>292}", "")); - assert_eq!(to_string(f, f64::MAX, Minus, (-309, 308), false), - "1.7976931348623157e308"); + assert_eq!(to_string(f, f64::MAX, Minus, (-4, 16), false), "1.7976931348623157e308"); + assert_eq!( + to_string(f, f64::MAX, Minus, (-308, 309), false), + format!("17976931348623157{:0>292}", "") + ); + assert_eq!(to_string(f, f64::MAX, Minus, (-309, 308), false), "1.7976931348623157e308"); let minf64 = ldexp_f64(1.0, -1074); - assert_eq!(to_string(f, minf64, Minus, ( -4, 16), false), "5e-324"); + assert_eq!(to_string(f, minf64, Minus, (-4, 16), false), "5e-324"); assert_eq!(to_string(f, minf64, Minus, (-324, 323), false), format!("0.{:0>323}5", "")); assert_eq!(to_string(f, minf64, Minus, (-323, 324), false), "5e-324"); @@ -674,88 +718,94 @@ pub fn to_shortest_exp_str_test(mut f_: F) } pub fn to_exact_exp_str_test(mut f_: F) - where F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) { +where + F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16), +{ use core::num::flt2dec::Sign::*; fn to_string(f: &mut F, v: T, sign: Sign, ndigits: usize, upper: bool) -> String - where T: DecodableFloat, F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) { - to_string_with_parts(|buf, parts| to_exact_exp_str(|d,b,l| f(d,b,l), v, sign, - ndigits, upper, buf, parts)) + where + T: DecodableFloat, + F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16), + { + to_string_with_parts(|buf, parts| { + to_exact_exp_str(|d, b, l| f(d, b, l), v, sign, ndigits, upper, buf, parts) + }) } let f = &mut f_; - assert_eq!(to_string(f, 0.0, Minus, 1, true), "0E0"); - assert_eq!(to_string(f, 0.0, MinusRaw, 1, false), "0e0"); - assert_eq!(to_string(f, 0.0, MinusPlus, 1, true), "+0E0"); - assert_eq!(to_string(f, 0.0, MinusPlusRaw, 1, false), "+0e0"); - assert_eq!(to_string(f, -0.0, Minus, 1, true), "0E0"); - assert_eq!(to_string(f, -0.0, MinusRaw, 1, false), "-0e0"); - assert_eq!(to_string(f, -0.0, MinusPlus, 1, true), "+0E0"); + assert_eq!(to_string(f, 0.0, Minus, 1, true), "0E0"); + assert_eq!(to_string(f, 0.0, MinusRaw, 1, false), "0e0"); + assert_eq!(to_string(f, 0.0, MinusPlus, 1, true), "+0E0"); + assert_eq!(to_string(f, 0.0, MinusPlusRaw, 1, false), "+0e0"); + assert_eq!(to_string(f, -0.0, Minus, 1, true), "0E0"); + assert_eq!(to_string(f, -0.0, MinusRaw, 1, false), "-0e0"); + assert_eq!(to_string(f, -0.0, MinusPlus, 1, true), "+0E0"); assert_eq!(to_string(f, -0.0, MinusPlusRaw, 1, false), "-0e0"); - assert_eq!(to_string(f, 0.0, Minus, 2, true), "0.0E0"); - assert_eq!(to_string(f, 0.0, MinusRaw, 2, false), "0.0e0"); - assert_eq!(to_string(f, 0.0, MinusPlus, 2, true), "+0.0E0"); - assert_eq!(to_string(f, 0.0, MinusPlusRaw, 2, false), "+0.0e0"); - assert_eq!(to_string(f, -0.0, Minus, 8, true), "0.0000000E0"); - assert_eq!(to_string(f, -0.0, MinusRaw, 8, false), "-0.0000000e0"); - assert_eq!(to_string(f, -0.0, MinusPlus, 8, true), "+0.0000000E0"); + assert_eq!(to_string(f, 0.0, Minus, 2, true), "0.0E0"); + assert_eq!(to_string(f, 0.0, MinusRaw, 2, false), "0.0e0"); + assert_eq!(to_string(f, 0.0, MinusPlus, 2, true), "+0.0E0"); + assert_eq!(to_string(f, 0.0, MinusPlusRaw, 2, false), "+0.0e0"); + assert_eq!(to_string(f, -0.0, Minus, 8, true), "0.0000000E0"); + assert_eq!(to_string(f, -0.0, MinusRaw, 8, false), "-0.0000000e0"); + assert_eq!(to_string(f, -0.0, MinusPlus, 8, true), "+0.0000000E0"); assert_eq!(to_string(f, -0.0, MinusPlusRaw, 8, false), "-0.0000000e0"); - assert_eq!(to_string(f, 1.0/0.0, Minus, 1, false), "inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusRaw, 1, true), "inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusPlus, 1, false), "+inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusPlusRaw, 1, true), "+inf"); - assert_eq!(to_string(f, 0.0/0.0, Minus, 8, false), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusRaw, 8, true), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusPlus, 8, false), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusPlusRaw, 8, true), "NaN"); - assert_eq!(to_string(f, -1.0/0.0, Minus, 64, false), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusRaw, 64, true), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusPlus, 64, false), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusPlusRaw, 64, true), "-inf"); - - assert_eq!(to_string(f, 3.14, Minus, 1, true), "3E0"); - assert_eq!(to_string(f, 3.14, MinusRaw, 1, false), "3e0"); - assert_eq!(to_string(f, 3.14, MinusPlus, 1, true), "+3E0"); - assert_eq!(to_string(f, 3.14, MinusPlusRaw, 1, false), "+3e0"); - assert_eq!(to_string(f, -3.14, Minus, 2, true), "-3.1E0"); - assert_eq!(to_string(f, -3.14, MinusRaw, 2, false), "-3.1e0"); - assert_eq!(to_string(f, -3.14, MinusPlus, 2, true), "-3.1E0"); + assert_eq!(to_string(f, 1.0 / 0.0, Minus, 1, false), "inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusRaw, 1, true), "inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusPlus, 1, false), "+inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusPlusRaw, 1, true), "+inf"); + assert_eq!(to_string(f, 0.0 / 0.0, Minus, 8, false), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusRaw, 8, true), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusPlus, 8, false), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusPlusRaw, 8, true), "NaN"); + assert_eq!(to_string(f, -1.0 / 0.0, Minus, 64, false), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusRaw, 64, true), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusPlus, 64, false), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusPlusRaw, 64, true), "-inf"); + + assert_eq!(to_string(f, 3.14, Minus, 1, true), "3E0"); + assert_eq!(to_string(f, 3.14, MinusRaw, 1, false), "3e0"); + assert_eq!(to_string(f, 3.14, MinusPlus, 1, true), "+3E0"); + assert_eq!(to_string(f, 3.14, MinusPlusRaw, 1, false), "+3e0"); + assert_eq!(to_string(f, -3.14, Minus, 2, true), "-3.1E0"); + assert_eq!(to_string(f, -3.14, MinusRaw, 2, false), "-3.1e0"); + assert_eq!(to_string(f, -3.14, MinusPlus, 2, true), "-3.1E0"); assert_eq!(to_string(f, -3.14, MinusPlusRaw, 2, false), "-3.1e0"); - assert_eq!(to_string(f, 3.14, Minus, 3, true), "3.14E0"); - assert_eq!(to_string(f, 3.14, MinusRaw, 3, false), "3.14e0"); - assert_eq!(to_string(f, 3.14, MinusPlus, 3, true), "+3.14E0"); - assert_eq!(to_string(f, 3.14, MinusPlusRaw, 3, false), "+3.14e0"); - assert_eq!(to_string(f, -3.14, Minus, 4, true), "-3.140E0"); - assert_eq!(to_string(f, -3.14, MinusRaw, 4, false), "-3.140e0"); - assert_eq!(to_string(f, -3.14, MinusPlus, 4, true), "-3.140E0"); + assert_eq!(to_string(f, 3.14, Minus, 3, true), "3.14E0"); + assert_eq!(to_string(f, 3.14, MinusRaw, 3, false), "3.14e0"); + assert_eq!(to_string(f, 3.14, MinusPlus, 3, true), "+3.14E0"); + assert_eq!(to_string(f, 3.14, MinusPlusRaw, 3, false), "+3.14e0"); + assert_eq!(to_string(f, -3.14, Minus, 4, true), "-3.140E0"); + assert_eq!(to_string(f, -3.14, MinusRaw, 4, false), "-3.140e0"); + assert_eq!(to_string(f, -3.14, MinusPlus, 4, true), "-3.140E0"); assert_eq!(to_string(f, -3.14, MinusPlusRaw, 4, false), "-3.140e0"); - assert_eq!(to_string(f, 0.195, Minus, 1, false), "2e-1"); - assert_eq!(to_string(f, 0.195, MinusRaw, 1, true), "2E-1"); - assert_eq!(to_string(f, 0.195, MinusPlus, 1, false), "+2e-1"); - assert_eq!(to_string(f, 0.195, MinusPlusRaw, 1, true), "+2E-1"); - assert_eq!(to_string(f, -0.195, Minus, 2, false), "-2.0e-1"); - assert_eq!(to_string(f, -0.195, MinusRaw, 2, true), "-2.0E-1"); - assert_eq!(to_string(f, -0.195, MinusPlus, 2, false), "-2.0e-1"); - assert_eq!(to_string(f, -0.195, MinusPlusRaw, 2, true), "-2.0E-1"); - assert_eq!(to_string(f, 0.195, Minus, 3, false), "1.95e-1"); - assert_eq!(to_string(f, 0.195, MinusRaw, 3, true), "1.95E-1"); - assert_eq!(to_string(f, 0.195, MinusPlus, 3, false), "+1.95e-1"); - assert_eq!(to_string(f, 0.195, MinusPlusRaw, 3, true), "+1.95E-1"); - assert_eq!(to_string(f, -0.195, Minus, 4, false), "-1.950e-1"); - assert_eq!(to_string(f, -0.195, MinusRaw, 4, true), "-1.950E-1"); - assert_eq!(to_string(f, -0.195, MinusPlus, 4, false), "-1.950e-1"); - assert_eq!(to_string(f, -0.195, MinusPlusRaw, 4, true), "-1.950E-1"); - - assert_eq!(to_string(f, 9.5, Minus, 1, false), "1e1"); - assert_eq!(to_string(f, 9.5, Minus, 2, false), "9.5e0"); - assert_eq!(to_string(f, 9.5, Minus, 3, false), "9.50e0"); + assert_eq!(to_string(f, 0.195, Minus, 1, false), "2e-1"); + assert_eq!(to_string(f, 0.195, MinusRaw, 1, true), "2E-1"); + assert_eq!(to_string(f, 0.195, MinusPlus, 1, false), "+2e-1"); + assert_eq!(to_string(f, 0.195, MinusPlusRaw, 1, true), "+2E-1"); + assert_eq!(to_string(f, -0.195, Minus, 2, false), "-2.0e-1"); + assert_eq!(to_string(f, -0.195, MinusRaw, 2, true), "-2.0E-1"); + assert_eq!(to_string(f, -0.195, MinusPlus, 2, false), "-2.0e-1"); + assert_eq!(to_string(f, -0.195, MinusPlusRaw, 2, true), "-2.0E-1"); + assert_eq!(to_string(f, 0.195, Minus, 3, false), "1.95e-1"); + assert_eq!(to_string(f, 0.195, MinusRaw, 3, true), "1.95E-1"); + assert_eq!(to_string(f, 0.195, MinusPlus, 3, false), "+1.95e-1"); + assert_eq!(to_string(f, 0.195, MinusPlusRaw, 3, true), "+1.95E-1"); + assert_eq!(to_string(f, -0.195, Minus, 4, false), "-1.950e-1"); + assert_eq!(to_string(f, -0.195, MinusRaw, 4, true), "-1.950E-1"); + assert_eq!(to_string(f, -0.195, MinusPlus, 4, false), "-1.950e-1"); + assert_eq!(to_string(f, -0.195, MinusPlusRaw, 4, true), "-1.950E-1"); + + assert_eq!(to_string(f, 9.5, Minus, 1, false), "1e1"); + assert_eq!(to_string(f, 9.5, Minus, 2, false), "9.5e0"); + assert_eq!(to_string(f, 9.5, Minus, 3, false), "9.50e0"); assert_eq!(to_string(f, 9.5, Minus, 30, false), "9.50000000000000000000000000000e0"); - assert_eq!(to_string(f, 1.0e25, Minus, 1, false), "1e25"); - assert_eq!(to_string(f, 1.0e25, Minus, 2, false), "1.0e25"); + assert_eq!(to_string(f, 1.0e25, Minus, 1, false), "1e25"); + assert_eq!(to_string(f, 1.0e25, Minus, 2, false), "1.0e25"); assert_eq!(to_string(f, 1.0e25, Minus, 15, false), "1.00000000000000e25"); assert_eq!(to_string(f, 1.0e25, Minus, 16, false), "1.000000000000000e25"); assert_eq!(to_string(f, 1.0e25, Minus, 17, false), "1.0000000000000001e25"); @@ -771,104 +821,136 @@ pub fn to_exact_exp_str_test(mut f_: F) assert_eq!(to_string(f, 1.0e25, Minus, 27, false), "1.00000000000000009059696640e25"); assert_eq!(to_string(f, 1.0e25, Minus, 30, false), "1.00000000000000009059696640000e25"); - assert_eq!(to_string(f, 1.0e-6, Minus, 1, false), "1e-6"); - assert_eq!(to_string(f, 1.0e-6, Minus, 2, false), "1.0e-6"); + assert_eq!(to_string(f, 1.0e-6, Minus, 1, false), "1e-6"); + assert_eq!(to_string(f, 1.0e-6, Minus, 2, false), "1.0e-6"); assert_eq!(to_string(f, 1.0e-6, Minus, 16, false), "1.000000000000000e-6"); assert_eq!(to_string(f, 1.0e-6, Minus, 17, false), "9.9999999999999995e-7"); assert_eq!(to_string(f, 1.0e-6, Minus, 18, false), "9.99999999999999955e-7"); assert_eq!(to_string(f, 1.0e-6, Minus, 19, false), "9.999999999999999547e-7"); assert_eq!(to_string(f, 1.0e-6, Minus, 20, false), "9.9999999999999995475e-7"); assert_eq!(to_string(f, 1.0e-6, Minus, 30, false), "9.99999999999999954748111825886e-7"); - assert_eq!(to_string(f, 1.0e-6, Minus, 40, false), - "9.999999999999999547481118258862586856139e-7"); - assert_eq!(to_string(f, 1.0e-6, Minus, 50, false), - "9.9999999999999995474811182588625868561393872369081e-7"); - assert_eq!(to_string(f, 1.0e-6, Minus, 60, false), - "9.99999999999999954748111825886258685613938723690807819366455e-7"); - assert_eq!(to_string(f, 1.0e-6, Minus, 70, false), - "9.999999999999999547481118258862586856139387236908078193664550781250000e-7"); - - assert_eq!(to_string(f, f32::MAX, Minus, 1, false), "3e38"); - assert_eq!(to_string(f, f32::MAX, Minus, 2, false), "3.4e38"); - assert_eq!(to_string(f, f32::MAX, Minus, 4, false), "3.403e38"); - assert_eq!(to_string(f, f32::MAX, Minus, 8, false), "3.4028235e38"); + assert_eq!( + to_string(f, 1.0e-6, Minus, 40, false), + "9.999999999999999547481118258862586856139e-7" + ); + assert_eq!( + to_string(f, 1.0e-6, Minus, 50, false), + "9.9999999999999995474811182588625868561393872369081e-7" + ); + assert_eq!( + to_string(f, 1.0e-6, Minus, 60, false), + "9.99999999999999954748111825886258685613938723690807819366455e-7" + ); + assert_eq!( + to_string(f, 1.0e-6, Minus, 70, false), + "9.999999999999999547481118258862586856139387236908078193664550781250000e-7" + ); + + assert_eq!(to_string(f, f32::MAX, Minus, 1, false), "3e38"); + assert_eq!(to_string(f, f32::MAX, Minus, 2, false), "3.4e38"); + assert_eq!(to_string(f, f32::MAX, Minus, 4, false), "3.403e38"); + assert_eq!(to_string(f, f32::MAX, Minus, 8, false), "3.4028235e38"); assert_eq!(to_string(f, f32::MAX, Minus, 16, false), "3.402823466385289e38"); assert_eq!(to_string(f, f32::MAX, Minus, 32, false), "3.4028234663852885981170418348452e38"); - assert_eq!(to_string(f, f32::MAX, Minus, 64, false), - "3.402823466385288598117041834845169254400000000000000000000000000e38"); + assert_eq!( + to_string(f, f32::MAX, Minus, 64, false), + "3.402823466385288598117041834845169254400000000000000000000000000e38" + ); let minf32 = ldexp_f32(1.0, -149); - assert_eq!(to_string(f, minf32, Minus, 1, false), "1e-45"); - assert_eq!(to_string(f, minf32, Minus, 2, false), "1.4e-45"); - assert_eq!(to_string(f, minf32, Minus, 4, false), "1.401e-45"); - assert_eq!(to_string(f, minf32, Minus, 8, false), "1.4012985e-45"); - assert_eq!(to_string(f, minf32, Minus, 16, false), "1.401298464324817e-45"); - assert_eq!(to_string(f, minf32, Minus, 32, false), "1.4012984643248170709237295832899e-45"); - assert_eq!(to_string(f, minf32, Minus, 64, false), - "1.401298464324817070923729583289916131280261941876515771757068284e-45"); - assert_eq!(to_string(f, minf32, Minus, 128, false), - "1.401298464324817070923729583289916131280261941876515771757068283\ - 8897910826858606014866381883621215820312500000000000000000000000e-45"); - - if cfg!(miri) { // Miri is too slow + assert_eq!(to_string(f, minf32, Minus, 1, false), "1e-45"); + assert_eq!(to_string(f, minf32, Minus, 2, false), "1.4e-45"); + assert_eq!(to_string(f, minf32, Minus, 4, false), "1.401e-45"); + assert_eq!(to_string(f, minf32, Minus, 8, false), "1.4012985e-45"); + assert_eq!(to_string(f, minf32, Minus, 16, false), "1.401298464324817e-45"); + assert_eq!(to_string(f, minf32, Minus, 32, false), "1.4012984643248170709237295832899e-45"); + assert_eq!( + to_string(f, minf32, Minus, 64, false), + "1.401298464324817070923729583289916131280261941876515771757068284e-45" + ); + assert_eq!( + to_string(f, minf32, Minus, 128, false), + "1.401298464324817070923729583289916131280261941876515771757068283\ + 8897910826858606014866381883621215820312500000000000000000000000e-45" + ); + + if cfg!(miri) { + // Miri is too slow return; } - assert_eq!(to_string(f, f64::MAX, Minus, 1, false), "2e308"); - assert_eq!(to_string(f, f64::MAX, Minus, 2, false), "1.8e308"); - assert_eq!(to_string(f, f64::MAX, Minus, 4, false), "1.798e308"); - assert_eq!(to_string(f, f64::MAX, Minus, 8, false), "1.7976931e308"); - assert_eq!(to_string(f, f64::MAX, Minus, 16, false), "1.797693134862316e308"); - assert_eq!(to_string(f, f64::MAX, Minus, 32, false), "1.7976931348623157081452742373170e308"); - assert_eq!(to_string(f, f64::MAX, Minus, 64, false), - "1.797693134862315708145274237317043567980705675258449965989174768e308"); - assert_eq!(to_string(f, f64::MAX, Minus, 128, false), - "1.797693134862315708145274237317043567980705675258449965989174768\ - 0315726078002853876058955863276687817154045895351438246423432133e308"); - assert_eq!(to_string(f, f64::MAX, Minus, 256, false), - "1.797693134862315708145274237317043567980705675258449965989174768\ + assert_eq!(to_string(f, f64::MAX, Minus, 1, false), "2e308"); + assert_eq!(to_string(f, f64::MAX, Minus, 2, false), "1.8e308"); + assert_eq!(to_string(f, f64::MAX, Minus, 4, false), "1.798e308"); + assert_eq!(to_string(f, f64::MAX, Minus, 8, false), "1.7976931e308"); + assert_eq!(to_string(f, f64::MAX, Minus, 16, false), "1.797693134862316e308"); + assert_eq!(to_string(f, f64::MAX, Minus, 32, false), "1.7976931348623157081452742373170e308"); + assert_eq!( + to_string(f, f64::MAX, Minus, 64, false), + "1.797693134862315708145274237317043567980705675258449965989174768e308" + ); + assert_eq!( + to_string(f, f64::MAX, Minus, 128, false), + "1.797693134862315708145274237317043567980705675258449965989174768\ + 0315726078002853876058955863276687817154045895351438246423432133e308" + ); + assert_eq!( + to_string(f, f64::MAX, Minus, 256, false), + "1.797693134862315708145274237317043567980705675258449965989174768\ 0315726078002853876058955863276687817154045895351438246423432132\ 6889464182768467546703537516986049910576551282076245490090389328\ - 9440758685084551339423045832369032229481658085593321233482747978e308"); - assert_eq!(to_string(f, f64::MAX, Minus, 512, false), - "1.797693134862315708145274237317043567980705675258449965989174768\ + 9440758685084551339423045832369032229481658085593321233482747978e308" + ); + assert_eq!( + to_string(f, f64::MAX, Minus, 512, false), + "1.797693134862315708145274237317043567980705675258449965989174768\ 0315726078002853876058955863276687817154045895351438246423432132\ 6889464182768467546703537516986049910576551282076245490090389328\ 9440758685084551339423045832369032229481658085593321233482747978\ 2620414472316873817718091929988125040402618412485836800000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ - 0000000000000000000000000000000000000000000000000000000000000000e308"); + 0000000000000000000000000000000000000000000000000000000000000000e308" + ); // okay, this is becoming tough. fortunately for us, this is almost the worst case. let minf64 = ldexp_f64(1.0, -1074); - assert_eq!(to_string(f, minf64, Minus, 1, false), "5e-324"); - assert_eq!(to_string(f, minf64, Minus, 2, false), "4.9e-324"); - assert_eq!(to_string(f, minf64, Minus, 4, false), "4.941e-324"); - assert_eq!(to_string(f, minf64, Minus, 8, false), "4.9406565e-324"); - assert_eq!(to_string(f, minf64, Minus, 16, false), "4.940656458412465e-324"); - assert_eq!(to_string(f, minf64, Minus, 32, false), "4.9406564584124654417656879286822e-324"); - assert_eq!(to_string(f, minf64, Minus, 64, false), - "4.940656458412465441765687928682213723650598026143247644255856825e-324"); - assert_eq!(to_string(f, minf64, Minus, 128, false), - "4.940656458412465441765687928682213723650598026143247644255856825\ - 0067550727020875186529983636163599237979656469544571773092665671e-324"); - assert_eq!(to_string(f, minf64, Minus, 256, false), - "4.940656458412465441765687928682213723650598026143247644255856825\ + assert_eq!(to_string(f, minf64, Minus, 1, false), "5e-324"); + assert_eq!(to_string(f, minf64, Minus, 2, false), "4.9e-324"); + assert_eq!(to_string(f, minf64, Minus, 4, false), "4.941e-324"); + assert_eq!(to_string(f, minf64, Minus, 8, false), "4.9406565e-324"); + assert_eq!(to_string(f, minf64, Minus, 16, false), "4.940656458412465e-324"); + assert_eq!(to_string(f, minf64, Minus, 32, false), "4.9406564584124654417656879286822e-324"); + assert_eq!( + to_string(f, minf64, Minus, 64, false), + "4.940656458412465441765687928682213723650598026143247644255856825e-324" + ); + assert_eq!( + to_string(f, minf64, Minus, 128, false), + "4.940656458412465441765687928682213723650598026143247644255856825\ + 0067550727020875186529983636163599237979656469544571773092665671e-324" + ); + assert_eq!( + to_string(f, minf64, Minus, 256, false), + "4.940656458412465441765687928682213723650598026143247644255856825\ 0067550727020875186529983636163599237979656469544571773092665671\ 0355939796398774796010781878126300713190311404527845817167848982\ - 1036887186360569987307230500063874091535649843873124733972731696e-324"); - assert_eq!(to_string(f, minf64, Minus, 512, false), - "4.940656458412465441765687928682213723650598026143247644255856825\ + 1036887186360569987307230500063874091535649843873124733972731696e-324" + ); + assert_eq!( + to_string(f, minf64, Minus, 512, false), + "4.940656458412465441765687928682213723650598026143247644255856825\ 0067550727020875186529983636163599237979656469544571773092665671\ 0355939796398774796010781878126300713190311404527845817167848982\ 1036887186360569987307230500063874091535649843873124733972731696\ 1514003171538539807412623856559117102665855668676818703956031062\ 4931945271591492455329305456544401127480129709999541931989409080\ 4165633245247571478690147267801593552386115501348035264934720193\ - 7902681071074917033322268447533357208324319360923828934583680601e-324"); - assert_eq!(to_string(f, minf64, Minus, 1024, false), - "4.940656458412465441765687928682213723650598026143247644255856825\ + 7902681071074917033322268447533357208324319360923828934583680601e-324" + ); + assert_eq!( + to_string(f, minf64, Minus, 1024, false), + "4.940656458412465441765687928682213723650598026143247644255856825\ 0067550727020875186529983636163599237979656469544571773092665671\ 0355939796398774796010781878126300713190311404527845817167848982\ 1036887186360569987307230500063874091535649843873124733972731696\ @@ -883,100 +965,117 @@ pub fn to_exact_exp_str_test(mut f_: F) 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ - 0000000000000000000000000000000000000000000000000000000000000000e-324"); + 0000000000000000000000000000000000000000000000000000000000000000e-324" + ); // very large output - assert_eq!(to_string(f, 0.0, Minus, 80000, false), format!("0.{:0>79999}e0", "")); - assert_eq!(to_string(f, 1.0e1, Minus, 80000, false), format!("1.{:0>79999}e1", "")); - assert_eq!(to_string(f, 1.0e0, Minus, 80000, false), format!("1.{:0>79999}e0", "")); - assert_eq!(to_string(f, 1.0e-1, Minus, 80000, false), - format!("1.000000000000000055511151231257827021181583404541015625{:0>79945}\ - e-1", "")); - assert_eq!(to_string(f, 1.0e-20, Minus, 80000, false), - format!("9.999999999999999451532714542095716517295037027873924471077157760\ - 66783064379706047475337982177734375{:0>79901}e-21", "")); + assert_eq!(to_string(f, 0.0, Minus, 80000, false), format!("0.{:0>79999}e0", "")); + assert_eq!(to_string(f, 1.0e1, Minus, 80000, false), format!("1.{:0>79999}e1", "")); + assert_eq!(to_string(f, 1.0e0, Minus, 80000, false), format!("1.{:0>79999}e0", "")); + assert_eq!( + to_string(f, 1.0e-1, Minus, 80000, false), + format!( + "1.000000000000000055511151231257827021181583404541015625{:0>79945}\ + e-1", + "" + ) + ); + assert_eq!( + to_string(f, 1.0e-20, Minus, 80000, false), + format!( + "9.999999999999999451532714542095716517295037027873924471077157760\ + 66783064379706047475337982177734375{:0>79901}e-21", + "" + ) + ); } pub fn to_exact_fixed_str_test(mut f_: F) - where F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) { +where + F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16), +{ use core::num::flt2dec::Sign::*; fn to_string(f: &mut F, v: T, sign: Sign, frac_digits: usize, upper: bool) -> String - where T: DecodableFloat, F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) { - to_string_with_parts(|buf, parts| to_exact_fixed_str(|d,b,l| f(d,b,l), v, sign, - frac_digits, upper, buf, parts)) + where + T: DecodableFloat, + F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16), + { + to_string_with_parts(|buf, parts| { + to_exact_fixed_str(|d, b, l| f(d, b, l), v, sign, frac_digits, upper, buf, parts) + }) } let f = &mut f_; - assert_eq!(to_string(f, 0.0, Minus, 0, false), "0"); - assert_eq!(to_string(f, 0.0, MinusRaw, 0, false), "0"); - assert_eq!(to_string(f, 0.0, MinusPlus, 0, false), "+0"); - assert_eq!(to_string(f, 0.0, MinusPlusRaw, 0, false), "+0"); - assert_eq!(to_string(f, -0.0, Minus, 0, false), "0"); - assert_eq!(to_string(f, -0.0, MinusRaw, 0, false), "-0"); - assert_eq!(to_string(f, -0.0, MinusPlus, 0, false), "+0"); + assert_eq!(to_string(f, 0.0, Minus, 0, false), "0"); + assert_eq!(to_string(f, 0.0, MinusRaw, 0, false), "0"); + assert_eq!(to_string(f, 0.0, MinusPlus, 0, false), "+0"); + assert_eq!(to_string(f, 0.0, MinusPlusRaw, 0, false), "+0"); + assert_eq!(to_string(f, -0.0, Minus, 0, false), "0"); + assert_eq!(to_string(f, -0.0, MinusRaw, 0, false), "-0"); + assert_eq!(to_string(f, -0.0, MinusPlus, 0, false), "+0"); assert_eq!(to_string(f, -0.0, MinusPlusRaw, 0, false), "-0"); - assert_eq!(to_string(f, 0.0, Minus, 1, true), "0.0"); - assert_eq!(to_string(f, 0.0, MinusRaw, 1, true), "0.0"); - assert_eq!(to_string(f, 0.0, MinusPlus, 1, true), "+0.0"); - assert_eq!(to_string(f, 0.0, MinusPlusRaw, 1, true), "+0.0"); - assert_eq!(to_string(f, -0.0, Minus, 8, true), "0.00000000"); - assert_eq!(to_string(f, -0.0, MinusRaw, 8, true), "-0.00000000"); - assert_eq!(to_string(f, -0.0, MinusPlus, 8, true), "+0.00000000"); - assert_eq!(to_string(f, -0.0, MinusPlusRaw, 8, true), "-0.00000000"); - - assert_eq!(to_string(f, 1.0/0.0, Minus, 0, false), "inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusRaw, 1, true), "inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusPlus, 8, false), "+inf"); - assert_eq!(to_string(f, 1.0/0.0, MinusPlusRaw, 64, true), "+inf"); - assert_eq!(to_string(f, 0.0/0.0, Minus, 0, false), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusRaw, 1, true), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusPlus, 8, false), "NaN"); - assert_eq!(to_string(f, 0.0/0.0, MinusPlusRaw, 64, true), "NaN"); - assert_eq!(to_string(f, -1.0/0.0, Minus, 0, false), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusRaw, 1, true), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusPlus, 8, false), "-inf"); - assert_eq!(to_string(f, -1.0/0.0, MinusPlusRaw, 64, true), "-inf"); - - assert_eq!(to_string(f, 3.14, Minus, 0, false), "3"); - assert_eq!(to_string(f, 3.14, MinusRaw, 0, false), "3"); - assert_eq!(to_string(f, 3.14, MinusPlus, 0, false), "+3"); - assert_eq!(to_string(f, 3.14, MinusPlusRaw, 0, false), "+3"); - assert_eq!(to_string(f, -3.14, Minus, 0, false), "-3"); - assert_eq!(to_string(f, -3.14, MinusRaw, 0, false), "-3"); - assert_eq!(to_string(f, -3.14, MinusPlus, 0, false), "-3"); + assert_eq!(to_string(f, 0.0, Minus, 1, true), "0.0"); + assert_eq!(to_string(f, 0.0, MinusRaw, 1, true), "0.0"); + assert_eq!(to_string(f, 0.0, MinusPlus, 1, true), "+0.0"); + assert_eq!(to_string(f, 0.0, MinusPlusRaw, 1, true), "+0.0"); + assert_eq!(to_string(f, -0.0, Minus, 8, true), "0.00000000"); + assert_eq!(to_string(f, -0.0, MinusRaw, 8, true), "-0.00000000"); + assert_eq!(to_string(f, -0.0, MinusPlus, 8, true), "+0.00000000"); + assert_eq!(to_string(f, -0.0, MinusPlusRaw, 8, true), "-0.00000000"); + + assert_eq!(to_string(f, 1.0 / 0.0, Minus, 0, false), "inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusRaw, 1, true), "inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusPlus, 8, false), "+inf"); + assert_eq!(to_string(f, 1.0 / 0.0, MinusPlusRaw, 64, true), "+inf"); + assert_eq!(to_string(f, 0.0 / 0.0, Minus, 0, false), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusRaw, 1, true), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusPlus, 8, false), "NaN"); + assert_eq!(to_string(f, 0.0 / 0.0, MinusPlusRaw, 64, true), "NaN"); + assert_eq!(to_string(f, -1.0 / 0.0, Minus, 0, false), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusRaw, 1, true), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusPlus, 8, false), "-inf"); + assert_eq!(to_string(f, -1.0 / 0.0, MinusPlusRaw, 64, true), "-inf"); + + assert_eq!(to_string(f, 3.14, Minus, 0, false), "3"); + assert_eq!(to_string(f, 3.14, MinusRaw, 0, false), "3"); + assert_eq!(to_string(f, 3.14, MinusPlus, 0, false), "+3"); + assert_eq!(to_string(f, 3.14, MinusPlusRaw, 0, false), "+3"); + assert_eq!(to_string(f, -3.14, Minus, 0, false), "-3"); + assert_eq!(to_string(f, -3.14, MinusRaw, 0, false), "-3"); + assert_eq!(to_string(f, -3.14, MinusPlus, 0, false), "-3"); assert_eq!(to_string(f, -3.14, MinusPlusRaw, 0, false), "-3"); - assert_eq!(to_string(f, 3.14, Minus, 1, true), "3.1"); - assert_eq!(to_string(f, 3.14, MinusRaw, 2, true), "3.14"); - assert_eq!(to_string(f, 3.14, MinusPlus, 3, true), "+3.140"); - assert_eq!(to_string(f, 3.14, MinusPlusRaw, 4, true), "+3.1400"); - assert_eq!(to_string(f, -3.14, Minus, 8, true), "-3.14000000"); - assert_eq!(to_string(f, -3.14, MinusRaw, 8, true), "-3.14000000"); - assert_eq!(to_string(f, -3.14, MinusPlus, 8, true), "-3.14000000"); - assert_eq!(to_string(f, -3.14, MinusPlusRaw, 8, true), "-3.14000000"); - - assert_eq!(to_string(f, 0.195, Minus, 0, false), "0"); - assert_eq!(to_string(f, 0.195, MinusRaw, 0, false), "0"); - assert_eq!(to_string(f, 0.195, MinusPlus, 0, false), "+0"); - assert_eq!(to_string(f, 0.195, MinusPlusRaw, 0, false), "+0"); - assert_eq!(to_string(f, -0.195, Minus, 0, false), "-0"); - assert_eq!(to_string(f, -0.195, MinusRaw, 0, false), "-0"); - assert_eq!(to_string(f, -0.195, MinusPlus, 0, false), "-0"); + assert_eq!(to_string(f, 3.14, Minus, 1, true), "3.1"); + assert_eq!(to_string(f, 3.14, MinusRaw, 2, true), "3.14"); + assert_eq!(to_string(f, 3.14, MinusPlus, 3, true), "+3.140"); + assert_eq!(to_string(f, 3.14, MinusPlusRaw, 4, true), "+3.1400"); + assert_eq!(to_string(f, -3.14, Minus, 8, true), "-3.14000000"); + assert_eq!(to_string(f, -3.14, MinusRaw, 8, true), "-3.14000000"); + assert_eq!(to_string(f, -3.14, MinusPlus, 8, true), "-3.14000000"); + assert_eq!(to_string(f, -3.14, MinusPlusRaw, 8, true), "-3.14000000"); + + assert_eq!(to_string(f, 0.195, Minus, 0, false), "0"); + assert_eq!(to_string(f, 0.195, MinusRaw, 0, false), "0"); + assert_eq!(to_string(f, 0.195, MinusPlus, 0, false), "+0"); + assert_eq!(to_string(f, 0.195, MinusPlusRaw, 0, false), "+0"); + assert_eq!(to_string(f, -0.195, Minus, 0, false), "-0"); + assert_eq!(to_string(f, -0.195, MinusRaw, 0, false), "-0"); + assert_eq!(to_string(f, -0.195, MinusPlus, 0, false), "-0"); assert_eq!(to_string(f, -0.195, MinusPlusRaw, 0, false), "-0"); - assert_eq!(to_string(f, 0.195, Minus, 1, true), "0.2"); - assert_eq!(to_string(f, 0.195, MinusRaw, 2, true), "0.20"); - assert_eq!(to_string(f, 0.195, MinusPlus, 3, true), "+0.195"); - assert_eq!(to_string(f, 0.195, MinusPlusRaw, 4, true), "+0.1950"); - assert_eq!(to_string(f, -0.195, Minus, 5, true), "-0.19500"); - assert_eq!(to_string(f, -0.195, MinusRaw, 6, true), "-0.195000"); - assert_eq!(to_string(f, -0.195, MinusPlus, 7, true), "-0.1950000"); - assert_eq!(to_string(f, -0.195, MinusPlusRaw, 8, true), "-0.19500000"); - - assert_eq!(to_string(f, 999.5, Minus, 0, false), "1000"); - assert_eq!(to_string(f, 999.5, Minus, 1, false), "999.5"); - assert_eq!(to_string(f, 999.5, Minus, 2, false), "999.50"); - assert_eq!(to_string(f, 999.5, Minus, 3, false), "999.500"); + assert_eq!(to_string(f, 0.195, Minus, 1, true), "0.2"); + assert_eq!(to_string(f, 0.195, MinusRaw, 2, true), "0.20"); + assert_eq!(to_string(f, 0.195, MinusPlus, 3, true), "+0.195"); + assert_eq!(to_string(f, 0.195, MinusPlusRaw, 4, true), "+0.1950"); + assert_eq!(to_string(f, -0.195, Minus, 5, true), "-0.19500"); + assert_eq!(to_string(f, -0.195, MinusRaw, 6, true), "-0.195000"); + assert_eq!(to_string(f, -0.195, MinusPlus, 7, true), "-0.1950000"); + assert_eq!(to_string(f, -0.195, MinusPlusRaw, 8, true), "-0.19500000"); + + assert_eq!(to_string(f, 999.5, Minus, 0, false), "1000"); + assert_eq!(to_string(f, 999.5, Minus, 1, false), "999.5"); + assert_eq!(to_string(f, 999.5, Minus, 2, false), "999.50"); + assert_eq!(to_string(f, 999.5, Minus, 3, false), "999.500"); assert_eq!(to_string(f, 999.5, Minus, 30, false), "999.500000000000000000000000000000"); assert_eq!(to_string(f, 0.5, Minus, 0, false), "1"); @@ -984,32 +1083,32 @@ pub fn to_exact_fixed_str_test(mut f_: F) assert_eq!(to_string(f, 0.5, Minus, 2, false), "0.50"); assert_eq!(to_string(f, 0.5, Minus, 3, false), "0.500"); - assert_eq!(to_string(f, 0.95, Minus, 0, false), "1"); - assert_eq!(to_string(f, 0.95, Minus, 1, false), "0.9"); // because it really is less than 0.95 - assert_eq!(to_string(f, 0.95, Minus, 2, false), "0.95"); - assert_eq!(to_string(f, 0.95, Minus, 3, false), "0.950"); + assert_eq!(to_string(f, 0.95, Minus, 0, false), "1"); + assert_eq!(to_string(f, 0.95, Minus, 1, false), "0.9"); // because it really is less than 0.95 + assert_eq!(to_string(f, 0.95, Minus, 2, false), "0.95"); + assert_eq!(to_string(f, 0.95, Minus, 3, false), "0.950"); assert_eq!(to_string(f, 0.95, Minus, 10, false), "0.9500000000"); assert_eq!(to_string(f, 0.95, Minus, 30, false), "0.949999999999999955591079014994"); - assert_eq!(to_string(f, 0.095, Minus, 0, false), "0"); - assert_eq!(to_string(f, 0.095, Minus, 1, false), "0.1"); - assert_eq!(to_string(f, 0.095, Minus, 2, false), "0.10"); - assert_eq!(to_string(f, 0.095, Minus, 3, false), "0.095"); - assert_eq!(to_string(f, 0.095, Minus, 4, false), "0.0950"); + assert_eq!(to_string(f, 0.095, Minus, 0, false), "0"); + assert_eq!(to_string(f, 0.095, Minus, 1, false), "0.1"); + assert_eq!(to_string(f, 0.095, Minus, 2, false), "0.10"); + assert_eq!(to_string(f, 0.095, Minus, 3, false), "0.095"); + assert_eq!(to_string(f, 0.095, Minus, 4, false), "0.0950"); assert_eq!(to_string(f, 0.095, Minus, 10, false), "0.0950000000"); assert_eq!(to_string(f, 0.095, Minus, 30, false), "0.095000000000000001110223024625"); - assert_eq!(to_string(f, 0.0095, Minus, 0, false), "0"); - assert_eq!(to_string(f, 0.0095, Minus, 1, false), "0.0"); - assert_eq!(to_string(f, 0.0095, Minus, 2, false), "0.01"); - assert_eq!(to_string(f, 0.0095, Minus, 3, false), "0.009"); // really is less than 0.0095 - assert_eq!(to_string(f, 0.0095, Minus, 4, false), "0.0095"); - assert_eq!(to_string(f, 0.0095, Minus, 5, false), "0.00950"); + assert_eq!(to_string(f, 0.0095, Minus, 0, false), "0"); + assert_eq!(to_string(f, 0.0095, Minus, 1, false), "0.0"); + assert_eq!(to_string(f, 0.0095, Minus, 2, false), "0.01"); + assert_eq!(to_string(f, 0.0095, Minus, 3, false), "0.009"); // really is less than 0.0095 + assert_eq!(to_string(f, 0.0095, Minus, 4, false), "0.0095"); + assert_eq!(to_string(f, 0.0095, Minus, 5, false), "0.00950"); assert_eq!(to_string(f, 0.0095, Minus, 10, false), "0.0095000000"); assert_eq!(to_string(f, 0.0095, Minus, 30, false), "0.009499999999999999764077607267"); - assert_eq!(to_string(f, 7.5e-11, Minus, 0, false), "0"); - assert_eq!(to_string(f, 7.5e-11, Minus, 3, false), "0.000"); + assert_eq!(to_string(f, 7.5e-11, Minus, 0, false), "0"); + assert_eq!(to_string(f, 7.5e-11, Minus, 3, false), "0.000"); assert_eq!(to_string(f, 7.5e-11, Minus, 10, false), "0.0000000001"); assert_eq!(to_string(f, 7.5e-11, Minus, 11, false), "0.00000000007"); // ditto assert_eq!(to_string(f, 7.5e-11, Minus, 12, false), "0.000000000075"); @@ -1021,77 +1120,102 @@ pub fn to_exact_fixed_str_test(mut f_: F) assert_eq!(to_string(f, 1.0e25, Minus, 1, false), "10000000000000000905969664.0"); assert_eq!(to_string(f, 1.0e25, Minus, 3, false), "10000000000000000905969664.000"); - assert_eq!(to_string(f, 1.0e-6, Minus, 0, false), "0"); - assert_eq!(to_string(f, 1.0e-6, Minus, 3, false), "0.000"); - assert_eq!(to_string(f, 1.0e-6, Minus, 6, false), "0.000001"); - assert_eq!(to_string(f, 1.0e-6, Minus, 9, false), "0.000001000"); + assert_eq!(to_string(f, 1.0e-6, Minus, 0, false), "0"); + assert_eq!(to_string(f, 1.0e-6, Minus, 3, false), "0.000"); + assert_eq!(to_string(f, 1.0e-6, Minus, 6, false), "0.000001"); + assert_eq!(to_string(f, 1.0e-6, Minus, 9, false), "0.000001000"); assert_eq!(to_string(f, 1.0e-6, Minus, 12, false), "0.000001000000"); assert_eq!(to_string(f, 1.0e-6, Minus, 22, false), "0.0000010000000000000000"); assert_eq!(to_string(f, 1.0e-6, Minus, 23, false), "0.00000099999999999999995"); assert_eq!(to_string(f, 1.0e-6, Minus, 24, false), "0.000000999999999999999955"); assert_eq!(to_string(f, 1.0e-6, Minus, 25, false), "0.0000009999999999999999547"); assert_eq!(to_string(f, 1.0e-6, Minus, 35, false), "0.00000099999999999999995474811182589"); - assert_eq!(to_string(f, 1.0e-6, Minus, 45, false), - "0.000000999999999999999954748111825886258685614"); - assert_eq!(to_string(f, 1.0e-6, Minus, 55, false), - "0.0000009999999999999999547481118258862586856139387236908"); - assert_eq!(to_string(f, 1.0e-6, Minus, 65, false), - "0.00000099999999999999995474811182588625868561393872369080781936646"); - assert_eq!(to_string(f, 1.0e-6, Minus, 75, false), - "0.000000999999999999999954748111825886258685613938723690807819366455078125000"); - - assert_eq!(to_string(f, f32::MAX, Minus, 0, false), - "340282346638528859811704183484516925440"); - assert_eq!(to_string(f, f32::MAX, Minus, 1, false), - "340282346638528859811704183484516925440.0"); - assert_eq!(to_string(f, f32::MAX, Minus, 2, false), - "340282346638528859811704183484516925440.00"); - - if cfg!(miri) { // Miri is too slow + assert_eq!( + to_string(f, 1.0e-6, Minus, 45, false), + "0.000000999999999999999954748111825886258685614" + ); + assert_eq!( + to_string(f, 1.0e-6, Minus, 55, false), + "0.0000009999999999999999547481118258862586856139387236908" + ); + assert_eq!( + to_string(f, 1.0e-6, Minus, 65, false), + "0.00000099999999999999995474811182588625868561393872369080781936646" + ); + assert_eq!( + to_string(f, 1.0e-6, Minus, 75, false), + "0.000000999999999999999954748111825886258685613938723690807819366455078125000" + ); + + assert_eq!(to_string(f, f32::MAX, Minus, 0, false), "340282346638528859811704183484516925440"); + assert_eq!( + to_string(f, f32::MAX, Minus, 1, false), + "340282346638528859811704183484516925440.0" + ); + assert_eq!( + to_string(f, f32::MAX, Minus, 2, false), + "340282346638528859811704183484516925440.00" + ); + + if cfg!(miri) { + // Miri is too slow return; } let minf32 = ldexp_f32(1.0, -149); - assert_eq!(to_string(f, minf32, Minus, 0, false), "0"); - assert_eq!(to_string(f, minf32, Minus, 1, false), "0.0"); - assert_eq!(to_string(f, minf32, Minus, 2, false), "0.00"); - assert_eq!(to_string(f, minf32, Minus, 4, false), "0.0000"); - assert_eq!(to_string(f, minf32, Minus, 8, false), "0.00000000"); - assert_eq!(to_string(f, minf32, Minus, 16, false), "0.0000000000000000"); - assert_eq!(to_string(f, minf32, Minus, 32, false), "0.00000000000000000000000000000000"); - assert_eq!(to_string(f, minf32, Minus, 64, false), - "0.0000000000000000000000000000000000000000000014012984643248170709"); - assert_eq!(to_string(f, minf32, Minus, 128, false), - "0.0000000000000000000000000000000000000000000014012984643248170709\ - 2372958328991613128026194187651577175706828388979108268586060149"); - assert_eq!(to_string(f, minf32, Minus, 256, false), - "0.0000000000000000000000000000000000000000000014012984643248170709\ + assert_eq!(to_string(f, minf32, Minus, 0, false), "0"); + assert_eq!(to_string(f, minf32, Minus, 1, false), "0.0"); + assert_eq!(to_string(f, minf32, Minus, 2, false), "0.00"); + assert_eq!(to_string(f, minf32, Minus, 4, false), "0.0000"); + assert_eq!(to_string(f, minf32, Minus, 8, false), "0.00000000"); + assert_eq!(to_string(f, minf32, Minus, 16, false), "0.0000000000000000"); + assert_eq!(to_string(f, minf32, Minus, 32, false), "0.00000000000000000000000000000000"); + assert_eq!( + to_string(f, minf32, Minus, 64, false), + "0.0000000000000000000000000000000000000000000014012984643248170709" + ); + assert_eq!( + to_string(f, minf32, Minus, 128, false), + "0.0000000000000000000000000000000000000000000014012984643248170709\ + 2372958328991613128026194187651577175706828388979108268586060149" + ); + assert_eq!( + to_string(f, minf32, Minus, 256, false), + "0.0000000000000000000000000000000000000000000014012984643248170709\ 2372958328991613128026194187651577175706828388979108268586060148\ 6638188362121582031250000000000000000000000000000000000000000000\ - 0000000000000000000000000000000000000000000000000000000000000000"); + 0000000000000000000000000000000000000000000000000000000000000000" + ); - assert_eq!(to_string(f, f64::MAX, Minus, 0, false), - "1797693134862315708145274237317043567980705675258449965989174768\ + assert_eq!( + to_string(f, f64::MAX, Minus, 0, false), + "1797693134862315708145274237317043567980705675258449965989174768\ 0315726078002853876058955863276687817154045895351438246423432132\ 6889464182768467546703537516986049910576551282076245490090389328\ 9440758685084551339423045832369032229481658085593321233482747978\ - 26204144723168738177180919299881250404026184124858368"); - assert_eq!(to_string(f, f64::MAX, Minus, 10, false), - "1797693134862315708145274237317043567980705675258449965989174768\ + 26204144723168738177180919299881250404026184124858368" + ); + assert_eq!( + to_string(f, f64::MAX, Minus, 10, false), + "1797693134862315708145274237317043567980705675258449965989174768\ 0315726078002853876058955863276687817154045895351438246423432132\ 6889464182768467546703537516986049910576551282076245490090389328\ 9440758685084551339423045832369032229481658085593321233482747978\ - 26204144723168738177180919299881250404026184124858368.0000000000"); + 26204144723168738177180919299881250404026184124858368.0000000000" + ); let minf64 = ldexp_f64(1.0, -1074); assert_eq!(to_string(f, minf64, Minus, 0, false), "0"); assert_eq!(to_string(f, minf64, Minus, 1, false), "0.0"); assert_eq!(to_string(f, minf64, Minus, 10, false), "0.0000000000"); - assert_eq!(to_string(f, minf64, Minus, 100, false), - "0.0000000000000000000000000000000000000000000000000000000000000000\ - 000000000000000000000000000000000000"); - assert_eq!(to_string(f, minf64, Minus, 1000, false), - "0.0000000000000000000000000000000000000000000000000000000000000000\ + assert_eq!( + to_string(f, minf64, Minus, 100, false), + "0.0000000000000000000000000000000000000000000000000000000000000000\ + 000000000000000000000000000000000000" + ); + assert_eq!( + to_string(f, minf64, Minus, 1000, false), + "0.0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000\ @@ -1106,15 +1230,23 @@ pub fn to_exact_fixed_str_test(mut f_: F) 1937902681071074917033322268447533357208324319360923828934583680\ 6010601150616980975307834227731832924790498252473077637592724787\ 4656084778203734469699533647017972677717585125660551199131504891\ - 1014510378627381672509558373897335989937"); + 1014510378627381672509558373897335989937" + ); // very large output - assert_eq!(to_string(f, 0.0, Minus, 80000, false), format!("0.{:0>80000}", "")); - assert_eq!(to_string(f, 1.0e1, Minus, 80000, false), format!("10.{:0>80000}", "")); - assert_eq!(to_string(f, 1.0e0, Minus, 80000, false), format!("1.{:0>80000}", "")); - assert_eq!(to_string(f, 1.0e-1, Minus, 80000, false), - format!("0.1000000000000000055511151231257827021181583404541015625{:0>79945}", "")); - assert_eq!(to_string(f, 1.0e-20, Minus, 80000, false), - format!("0.0000000000000000000099999999999999994515327145420957165172950370\ - 2787392447107715776066783064379706047475337982177734375{:0>79881}", "")); + assert_eq!(to_string(f, 0.0, Minus, 80000, false), format!("0.{:0>80000}", "")); + assert_eq!(to_string(f, 1.0e1, Minus, 80000, false), format!("10.{:0>80000}", "")); + assert_eq!(to_string(f, 1.0e0, Minus, 80000, false), format!("1.{:0>80000}", "")); + assert_eq!( + to_string(f, 1.0e-1, Minus, 80000, false), + format!("0.1000000000000000055511151231257827021181583404541015625{:0>79945}", "") + ); + assert_eq!( + to_string(f, 1.0e-20, Minus, 80000, false), + format!( + "0.0000000000000000000099999999999999994515327145420957165172950370\ + 2787392447107715776066783064379706047475337982177734375{:0>79881}", + "" + ) + ); } diff --git a/src/libcore/tests/num/int_macros.rs b/src/libcore/tests/num/int_macros.rs index 4a44b5f24b..48a49073b2 100644 --- a/src/libcore/tests/num/int_macros.rs +++ b/src/libcore/tests/num/int_macros.rs @@ -89,6 +89,33 @@ macro_rules! int_module { assert_eq!(C.count_zeros(), bits as u32 - 5); } + #[test] + fn test_leading_trailing_ones() { + let bits = (mem::size_of::<$T>() * 8) as u32; + + let a: $T = 0b0101_1111; + assert_eq!(a.trailing_ones(), 5); + assert_eq!((!a).leading_ones(), bits - 7); + + assert_eq!(a.reverse_bits().leading_ones(), 5); + + assert_eq!(_1.leading_ones(), bits); + assert_eq!(_1.trailing_ones(), bits); + + assert_eq!((_1 << 1).trailing_ones(), 0); + assert_eq!(MAX.leading_ones(), 0); + + assert_eq!((_1 << 1).leading_ones(), bits - 1); + assert_eq!(MAX.trailing_ones(), bits - 1); + + assert_eq!(_0.leading_ones(), 0); + assert_eq!(_0.trailing_ones(), 0); + + let x: $T = 0b0010_1100; + assert_eq!(x.leading_ones(), 0); + assert_eq!(x.trailing_ones(), 0); + } + #[test] fn test_rotate() { assert_eq!(A.rotate_left(6).rotate_right(2).rotate_right(4), A); diff --git a/src/libcore/tests/num/mod.rs b/src/libcore/tests/num/mod.rs index a17c094679..f61793a3bc 100644 --- a/src/libcore/tests/num/mod.rs +++ b/src/libcore/tests/num/mod.rs @@ -1,32 +1,31 @@ -use core::convert::{TryFrom, TryInto}; use core::cmp::PartialEq; +use core::convert::{TryFrom, TryInto}; use core::fmt::Debug; use core::marker::Copy; use core::num::TryFromIntError; -use core::ops::{Add, Sub, Mul, Div, Rem}; +use core::ops::{Add, Div, Mul, Rem, Sub}; use core::option::Option; -use core::option::Option::{Some, None}; +use core::option::Option::{None, Some}; #[macro_use] mod int_macros; -mod i8; mod i16; mod i32; mod i64; +mod i8; #[macro_use] mod uint_macros; -mod u8; mod u16; mod u32; mod u64; +mod u8; -mod flt2dec; -mod dec2flt; mod bignum; - +mod dec2flt; +mod flt2dec; /// Adds the attribute to all items in the block. macro_rules! cfg_block { @@ -48,25 +47,29 @@ macro_rules! assume_usize_width { } /// Helper function for testing numeric operations -pub fn test_num(ten: T, two: T) where +pub fn test_num(ten: T, two: T) +where T: PartialEq - + Add + Sub - + Mul + Div - + Rem + Debug - + Copy + + Add + + Sub + + Mul + + Div + + Rem + + Debug + + Copy, { - assert_eq!(ten.add(two), ten + two); - assert_eq!(ten.sub(two), ten - two); - assert_eq!(ten.mul(two), ten * two); - assert_eq!(ten.div(two), ten / two); - assert_eq!(ten.rem(two), ten % two); + assert_eq!(ten.add(two), ten + two); + assert_eq!(ten.sub(two), ten - two); + assert_eq!(ten.mul(two), ten * two); + assert_eq!(ten.div(two), ten / two); + assert_eq!(ten.rem(two), ten % two); } #[test] fn from_str_issue7588() { - let u : Option = u8::from_str_radix("1000", 10).ok(); + let u: Option = u8::from_str_radix("1000", 10).ok(); assert_eq!(u, None); - let s : Option = i16::from_str_radix("80000", 10).ok(); + let s: Option = i16::from_str_radix("80000", 10).ok(); assert_eq!(s, None); } @@ -144,7 +147,7 @@ macro_rules! test_impl_from { assert_eq!(large_max as $Small, small_max); assert_eq!(large_min as $Small, small_min); } - } + }; } // Unsigned -> Unsigned @@ -242,7 +245,6 @@ fn test_f32f64() { assert!(nan.is_nan()); } - /// Conversions where the full width of $source can be represented as $target macro_rules! test_impl_try_from_always_ok { ($fn_name:ident, $source:ty, $target: ty) => { @@ -251,14 +253,11 @@ macro_rules! test_impl_try_from_always_ok { let max = <$source>::max_value(); let min = <$source>::min_value(); let zero: $source = 0; - assert_eq!(<$target as TryFrom<$source>>::try_from(max).unwrap(), - max as $target); - assert_eq!(<$target as TryFrom<$source>>::try_from(min).unwrap(), - min as $target); - assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), - zero as $target); + assert_eq!(<$target as TryFrom<$source>>::try_from(max).unwrap(), max as $target); + assert_eq!(<$target as TryFrom<$source>>::try_from(min).unwrap(), min as $target); + assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), zero as $target); } - } + }; } test_impl_try_from_always_ok! { test_try_u8u8, u8, u8 } @@ -368,14 +367,12 @@ macro_rules! test_impl_try_from_signed_to_unsigned_upper_ok { let min = <$source>::min_value(); let zero: $source = 0; let neg_one: $source = -1; - assert_eq!(<$target as TryFrom<$source>>::try_from(max).unwrap(), - max as $target); + assert_eq!(<$target as TryFrom<$source>>::try_from(max).unwrap(), max as $target); assert!(<$target as TryFrom<$source>>::try_from(min).is_err()); - assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), - zero as $target); + assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), zero as $target); assert!(<$target as TryFrom<$source>>::try_from(neg_one).is_err()); } - } + }; } test_impl_try_from_signed_to_unsigned_upper_ok! { test_try_i8u8, i8, u8 } @@ -435,12 +432,10 @@ macro_rules! test_impl_try_from_unsigned_to_signed_upper_err { let min = <$source>::min_value(); let zero: $source = 0; assert!(<$target as TryFrom<$source>>::try_from(max).is_err()); - assert_eq!(<$target as TryFrom<$source>>::try_from(min).unwrap(), - min as $target); - assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), - zero as $target); + assert_eq!(<$target as TryFrom<$source>>::try_from(min).unwrap(), min as $target); + assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), zero as $target); } - } + }; } test_impl_try_from_unsigned_to_signed_upper_err! { test_try_u8i8, u8, i8 } @@ -503,16 +498,17 @@ macro_rules! test_impl_try_from_same_sign_err { if min != 0 { assert!(<$target as TryFrom<$source>>::try_from(min).is_err()); } - assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), - zero as $target); - assert_eq!(<$target as TryFrom<$source>>::try_from(t_max as $source) - .unwrap(), - t_max as $target); - assert_eq!(<$target as TryFrom<$source>>::try_from(t_min as $source) - .unwrap(), - t_min as $target); + assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), zero as $target); + assert_eq!( + <$target as TryFrom<$source>>::try_from(t_max as $source).unwrap(), + t_max as $target + ); + assert_eq!( + <$target as TryFrom<$source>>::try_from(t_min as $source).unwrap(), + t_min as $target + ); } - } + }; } test_impl_try_from_same_sign_err! { test_try_u16u8, u16, u8 } @@ -589,16 +585,17 @@ macro_rules! test_impl_try_from_signed_to_unsigned_err { let t_min = <$target>::min_value(); assert!(<$target as TryFrom<$source>>::try_from(max).is_err()); assert!(<$target as TryFrom<$source>>::try_from(min).is_err()); - assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), - zero as $target); - assert_eq!(<$target as TryFrom<$source>>::try_from(t_max as $source) - .unwrap(), - t_max as $target); - assert_eq!(<$target as TryFrom<$source>>::try_from(t_min as $source) - .unwrap(), - t_min as $target); + assert_eq!(<$target as TryFrom<$source>>::try_from(zero).unwrap(), zero as $target); + assert_eq!( + <$target as TryFrom<$source>>::try_from(t_max as $source).unwrap(), + t_max as $target + ); + assert_eq!( + <$target as TryFrom<$source>>::try_from(t_min as $source).unwrap(), + t_min as $target + ); } - } + }; } test_impl_try_from_signed_to_unsigned_err! { test_try_i16u8, i16, u8 } @@ -637,72 +634,74 @@ assume_usize_width! { } macro_rules! test_float { - ($modname: ident, $fty: ty, $inf: expr, $neginf: expr, $nan: expr) => { mod $modname { - // FIXME(nagisa): these tests should test for sign of -0.0 - #[test] - fn min() { - assert_eq!((0.0 as $fty).min(0.0), 0.0); - assert_eq!((-0.0 as $fty).min(-0.0), -0.0); - assert_eq!((9.0 as $fty).min(9.0), 9.0); - assert_eq!((-9.0 as $fty).min(0.0), -9.0); - assert_eq!((0.0 as $fty).min(9.0), 0.0); - assert_eq!((-0.0 as $fty).min(-9.0), -9.0); - assert_eq!(($inf as $fty).min(9.0), 9.0); - assert_eq!((9.0 as $fty).min($inf), 9.0); - assert_eq!(($inf as $fty).min(-9.0), -9.0); - assert_eq!((-9.0 as $fty).min($inf), -9.0); - assert_eq!(($neginf as $fty).min(9.0), $neginf); - assert_eq!((9.0 as $fty).min($neginf), $neginf); - assert_eq!(($neginf as $fty).min(-9.0), $neginf); - assert_eq!((-9.0 as $fty).min($neginf), $neginf); - assert_eq!(($nan as $fty).min(9.0), 9.0); - assert_eq!(($nan as $fty).min(-9.0), -9.0); - assert_eq!((9.0 as $fty).min($nan), 9.0); - assert_eq!((-9.0 as $fty).min($nan), -9.0); - assert!(($nan as $fty).min($nan).is_nan()); - } - #[test] - fn max() { - assert_eq!((0.0 as $fty).max(0.0), 0.0); - assert_eq!((-0.0 as $fty).max(-0.0), -0.0); - assert_eq!((9.0 as $fty).max(9.0), 9.0); - assert_eq!((-9.0 as $fty).max(0.0), 0.0); - assert_eq!((0.0 as $fty).max(9.0), 9.0); - assert_eq!((-0.0 as $fty).max(-9.0), -0.0); - assert_eq!(($inf as $fty).max(9.0), $inf); - assert_eq!((9.0 as $fty).max($inf), $inf); - assert_eq!(($inf as $fty).max(-9.0), $inf); - assert_eq!((-9.0 as $fty).max($inf), $inf); - assert_eq!(($neginf as $fty).max(9.0), 9.0); - assert_eq!((9.0 as $fty).max($neginf), 9.0); - assert_eq!(($neginf as $fty).max(-9.0), -9.0); - assert_eq!((-9.0 as $fty).max($neginf), -9.0); - assert_eq!(($nan as $fty).max(9.0), 9.0); - assert_eq!(($nan as $fty).max(-9.0), -9.0); - assert_eq!((9.0 as $fty).max($nan), 9.0); - assert_eq!((-9.0 as $fty).max($nan), -9.0); - assert!(($nan as $fty).max($nan).is_nan()); - } - #[test] - fn rem_euclid() { - let a: $fty = 42.0; - assert!($inf.rem_euclid(a).is_nan()); - assert_eq!(a.rem_euclid($inf), a); - assert!(a.rem_euclid($nan).is_nan()); - assert!($inf.rem_euclid($inf).is_nan()); - assert!($inf.rem_euclid($nan).is_nan()); - assert!($nan.rem_euclid($inf).is_nan()); - } - #[test] - fn div_euclid() { - let a: $fty = 42.0; - assert_eq!(a.div_euclid($inf), 0.0); - assert!(a.div_euclid($nan).is_nan()); - assert!($inf.div_euclid($inf).is_nan()); - assert!($inf.div_euclid($nan).is_nan()); - assert!($nan.div_euclid($inf).is_nan()); + ($modname: ident, $fty: ty, $inf: expr, $neginf: expr, $nan: expr) => { + mod $modname { + // FIXME(nagisa): these tests should test for sign of -0.0 + #[test] + fn min() { + assert_eq!((0.0 as $fty).min(0.0), 0.0); + assert_eq!((-0.0 as $fty).min(-0.0), -0.0); + assert_eq!((9.0 as $fty).min(9.0), 9.0); + assert_eq!((-9.0 as $fty).min(0.0), -9.0); + assert_eq!((0.0 as $fty).min(9.0), 0.0); + assert_eq!((-0.0 as $fty).min(-9.0), -9.0); + assert_eq!(($inf as $fty).min(9.0), 9.0); + assert_eq!((9.0 as $fty).min($inf), 9.0); + assert_eq!(($inf as $fty).min(-9.0), -9.0); + assert_eq!((-9.0 as $fty).min($inf), -9.0); + assert_eq!(($neginf as $fty).min(9.0), $neginf); + assert_eq!((9.0 as $fty).min($neginf), $neginf); + assert_eq!(($neginf as $fty).min(-9.0), $neginf); + assert_eq!((-9.0 as $fty).min($neginf), $neginf); + assert_eq!(($nan as $fty).min(9.0), 9.0); + assert_eq!(($nan as $fty).min(-9.0), -9.0); + assert_eq!((9.0 as $fty).min($nan), 9.0); + assert_eq!((-9.0 as $fty).min($nan), -9.0); + assert!(($nan as $fty).min($nan).is_nan()); + } + #[test] + fn max() { + assert_eq!((0.0 as $fty).max(0.0), 0.0); + assert_eq!((-0.0 as $fty).max(-0.0), -0.0); + assert_eq!((9.0 as $fty).max(9.0), 9.0); + assert_eq!((-9.0 as $fty).max(0.0), 0.0); + assert_eq!((0.0 as $fty).max(9.0), 9.0); + assert_eq!((-0.0 as $fty).max(-9.0), -0.0); + assert_eq!(($inf as $fty).max(9.0), $inf); + assert_eq!((9.0 as $fty).max($inf), $inf); + assert_eq!(($inf as $fty).max(-9.0), $inf); + assert_eq!((-9.0 as $fty).max($inf), $inf); + assert_eq!(($neginf as $fty).max(9.0), 9.0); + assert_eq!((9.0 as $fty).max($neginf), 9.0); + assert_eq!(($neginf as $fty).max(-9.0), -9.0); + assert_eq!((-9.0 as $fty).max($neginf), -9.0); + assert_eq!(($nan as $fty).max(9.0), 9.0); + assert_eq!(($nan as $fty).max(-9.0), -9.0); + assert_eq!((9.0 as $fty).max($nan), 9.0); + assert_eq!((-9.0 as $fty).max($nan), -9.0); + assert!(($nan as $fty).max($nan).is_nan()); + } + #[test] + fn rem_euclid() { + let a: $fty = 42.0; + assert!($inf.rem_euclid(a).is_nan()); + assert_eq!(a.rem_euclid($inf), a); + assert!(a.rem_euclid($nan).is_nan()); + assert!($inf.rem_euclid($inf).is_nan()); + assert!($inf.rem_euclid($nan).is_nan()); + assert!($nan.rem_euclid($inf).is_nan()); + } + #[test] + fn div_euclid() { + let a: $fty = 42.0; + assert_eq!(a.div_euclid($inf), 0.0); + assert!(a.div_euclid($nan).is_nan()); + assert!($inf.div_euclid($inf).is_nan()); + assert!($inf.div_euclid($nan).is_nan()); + assert!($nan.div_euclid($inf).is_nan()); + } } - } } + }; } test_float!(f32, f32, ::core::f32::INFINITY, ::core::f32::NEG_INFINITY, ::core::f32::NAN); diff --git a/src/libcore/tests/num/uint_macros.rs b/src/libcore/tests/num/uint_macros.rs index f94b2f56bb..8f1ca8e6fa 100644 --- a/src/libcore/tests/num/uint_macros.rs +++ b/src/libcore/tests/num/uint_macros.rs @@ -53,6 +53,33 @@ macro_rules! uint_module { assert!(C.count_zeros() == bits as u32 - 5); } + #[test] + fn test_leading_trailing_ones() { + let bits = (mem::size_of::<$T>() * 8) as u32; + + let a: $T = 0b0101_1111; + assert_eq!(a.trailing_ones(), 5); + assert_eq!((!a).leading_ones(), bits - 7); + + assert_eq!(a.reverse_bits().leading_ones(), 5); + + assert_eq!(_1.leading_ones(), bits); + assert_eq!(_1.trailing_ones(), bits); + + assert_eq!((_1 << 1).trailing_ones(), 0); + assert_eq!((_1 >> 1).leading_ones(), 0); + + assert_eq!((_1 << 1).leading_ones(), bits - 1); + assert_eq!((_1 >> 1).trailing_ones(), bits - 1); + + assert_eq!(_0.leading_ones(), 0); + assert_eq!(_0.trailing_ones(), 0); + + let x: $T = 0b0010_1100; + assert_eq!(x.leading_ones(), 0); + assert_eq!(x.trailing_ones(), 0); + } + #[test] fn test_rotate() { assert_eq!(A.rotate_left(6).rotate_right(2).rotate_right(4), A); diff --git a/src/libcore/tests/pattern.rs b/src/libcore/tests/pattern.rs index 06c3a78c16..d4bec996d8 100644 --- a/src/libcore/tests/pattern.rs +++ b/src/libcore/tests/pattern.rs @@ -18,7 +18,7 @@ enum Step { Matches(usize, usize), Rejects(usize, usize), InRange(usize, usize), - Done + Done, } use self::Step::*; @@ -28,7 +28,7 @@ impl From for Step { match x { SearchStep::Match(a, b) => Matches(a, b), SearchStep::Reject(a, b) => Rejects(a, b), - SearchStep::Done => Done + SearchStep::Done => Done, } } } @@ -37,13 +37,11 @@ impl From> for Step { fn from(x: Option<(usize, usize)>) -> Self { match x { Some((a, b)) => InRange(a, b), - None => Done + None => Done, } } } -// ignore-tidy-linelength - // FIXME(Manishearth) these tests focus on single-character searching (CharSearcher) // and on next()/next_match(), not next_reject(). This is because // the memchr changes make next_match() for single chars complex, but next_reject() @@ -52,57 +50,146 @@ impl From> for Step { #[test] fn test_simple_iteration() { - search_asserts! ("abcdeabcd", 'a', "forward iteration for ASCII string", + search_asserts!( + "abcdeabcd", + 'a', + "forward iteration for ASCII string", // a b c d e a b c d EOF - [next, next, next, next, next, next, next, next, next, next], - [Matches(0, 1), Rejects(1, 2), Rejects(2, 3), Rejects(3, 4), Rejects(4, 5), Matches(5, 6), Rejects(6, 7), Rejects(7, 8), Rejects(8, 9), Done] - ); - - search_asserts! ("abcdeabcd", 'a', "reverse iteration for ASCII string", + [next, next, next, next, next, next, next, next, next, next], + [ + Matches(0, 1), + Rejects(1, 2), + Rejects(2, 3), + Rejects(3, 4), + Rejects(4, 5), + Matches(5, 6), + Rejects(6, 7), + Rejects(7, 8), + Rejects(8, 9), + Done + ] + ); + + search_asserts!( + "abcdeabcd", + 'a', + "reverse iteration for ASCII string", // d c b a e d c b a EOF - [next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back], - [Rejects(8, 9), Rejects(7, 8), Rejects(6, 7), Matches(5, 6), Rejects(4, 5), Rejects(3, 4), Rejects(2, 3), Rejects(1, 2), Matches(0, 1), Done] - ); - - search_asserts! ("我爱我的猫", '我', "forward iteration for Chinese string", + [ + next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back, + next_back, next_back + ], + [ + Rejects(8, 9), + Rejects(7, 8), + Rejects(6, 7), + Matches(5, 6), + Rejects(4, 5), + Rejects(3, 4), + Rejects(2, 3), + Rejects(1, 2), + Matches(0, 1), + Done + ] + ); + + search_asserts!( + "我爱我的猫", + '我', + "forward iteration for Chinese string", // 我 愛 我 的 貓 EOF - [next, next, next, next, next, next], + [next, next, next, next, next, next], [Matches(0, 3), Rejects(3, 6), Matches(6, 9), Rejects(9, 12), Rejects(12, 15), Done] ); - search_asserts! ("我的猫说meow", 'm', "forward iteration for mixed string", + search_asserts!( + "我的猫说meow", + 'm', + "forward iteration for mixed string", // 我 的 猫 说 m e o w EOF - [next, next, next, next, next, next, next, next, next], - [Rejects(0, 3), Rejects(3, 6), Rejects(6, 9), Rejects(9, 12), Matches(12, 13), Rejects(13, 14), Rejects(14, 15), Rejects(15, 16), Done] - ); - - search_asserts! ("我的猫说meow", '猫', "reverse iteration for mixed string", + [next, next, next, next, next, next, next, next, next], + [ + Rejects(0, 3), + Rejects(3, 6), + Rejects(6, 9), + Rejects(9, 12), + Matches(12, 13), + Rejects(13, 14), + Rejects(14, 15), + Rejects(15, 16), + Done + ] + ); + + search_asserts!( + "我的猫说meow", + '猫', + "reverse iteration for mixed string", // w o e m 说 猫 的 我 EOF - [next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back], - [Rejects(15, 16), Rejects(14, 15), Rejects(13, 14), Rejects(12, 13), Rejects(9, 12), Matches(6, 9), Rejects(3, 6), Rejects(0, 3), Done] + [ + next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back, + next_back + ], + [ + Rejects(15, 16), + Rejects(14, 15), + Rejects(13, 14), + Rejects(12, 13), + Rejects(9, 12), + Matches(6, 9), + Rejects(3, 6), + Rejects(0, 3), + Done + ] ); } #[test] fn test_simple_search() { - search_asserts!("abcdeabcdeabcde", 'a', "next_match for ASCII string", - [next_match, next_match, next_match, next_match], + search_asserts!( + "abcdeabcdeabcde", + 'a', + "next_match for ASCII string", + [next_match, next_match, next_match, next_match], [InRange(0, 1), InRange(5, 6), InRange(10, 11), Done] ); - search_asserts!("abcdeabcdeabcde", 'a', "next_match_back for ASCII string", + search_asserts!( + "abcdeabcdeabcde", + 'a', + "next_match_back for ASCII string", [next_match_back, next_match_back, next_match_back, next_match_back], - [InRange(10, 11), InRange(5, 6), InRange(0, 1), Done] + [InRange(10, 11), InRange(5, 6), InRange(0, 1), Done] ); - search_asserts!("abcdeab", 'a', "next_reject for ASCII string", - [next_reject, next_reject, next_match, next_reject, next_reject], + search_asserts!( + "abcdeab", + 'a', + "next_reject for ASCII string", + [next_reject, next_reject, next_match, next_reject, next_reject], [InRange(1, 2), InRange(2, 3), InRange(5, 6), InRange(6, 7), Done] ); - search_asserts!("abcdeabcdeabcde", 'a', "next_reject_back for ASCII string", - [next_reject_back, next_reject_back, next_match_back, next_reject_back, next_reject_back, next_reject_back], - [InRange(14, 15), InRange(13, 14), InRange(10, 11), InRange(9, 10), InRange(8, 9), InRange(7, 8)] + search_asserts!( + "abcdeabcdeabcde", + 'a', + "next_reject_back for ASCII string", + [ + next_reject_back, + next_reject_back, + next_match_back, + next_reject_back, + next_reject_back, + next_reject_back + ], + [ + InRange(14, 15), + InRange(13, 14), + InRange(10, 11), + InRange(9, 10), + InRange(8, 9), + InRange(7, 8) + ] ); } @@ -121,134 +208,234 @@ const STRESS: &str = "Áa🁀bÁꁁfg😁각กᘀ각aÁ각ꁁก😁a"; fn test_stress_indices() { // this isn't really a test, more of documentation on the indices of each character in the stresstest string - search_asserts!(STRESS, 'x', "Indices of characters in stress test", - [next, next, next, next, next, next, next, next, next, next, next, next, next, next, next, next, next, next, next, next, next], - [Rejects(0, 2), // Á - Rejects(2, 3), // a - Rejects(3, 7), // 🁀 - Rejects(7, 8), // b - Rejects(8, 10), // Á - Rejects(10, 13), // ꁁ - Rejects(13, 14), // f - Rejects(14, 15), // g - Rejects(15, 19), // 😀 - Rejects(19, 22), // 각 - Rejects(22, 25), // ก - Rejects(25, 28), // ᘀ - Rejects(28, 31), // 각 - Rejects(31, 32), // a - Rejects(32, 34), // Á - Rejects(34, 37), // 각 - Rejects(37, 40), // ꁁ - Rejects(40, 43), // ก - Rejects(43, 47), // 😀 - Rejects(47, 48), // a - Done] + search_asserts!( + STRESS, + 'x', + "Indices of characters in stress test", + [ + next, next, next, next, next, next, next, next, next, next, next, next, next, next, + next, next, next, next, next, next, next + ], + [ + Rejects(0, 2), // Á + Rejects(2, 3), // a + Rejects(3, 7), // 🁀 + Rejects(7, 8), // b + Rejects(8, 10), // Á + Rejects(10, 13), // ꁁ + Rejects(13, 14), // f + Rejects(14, 15), // g + Rejects(15, 19), // 😀 + Rejects(19, 22), // 각 + Rejects(22, 25), // ก + Rejects(25, 28), // ᘀ + Rejects(28, 31), // 각 + Rejects(31, 32), // a + Rejects(32, 34), // Á + Rejects(34, 37), // 각 + Rejects(37, 40), // ꁁ + Rejects(40, 43), // ก + Rejects(43, 47), // 😀 + Rejects(47, 48), // a + Done + ] ); } #[test] fn test_forward_search_shared_bytes() { - search_asserts!(STRESS, 'Á', "Forward search for two-byte Latin character", - [next_match, next_match, next_match, next_match], + search_asserts!( + STRESS, + 'Á', + "Forward search for two-byte Latin character", + [next_match, next_match, next_match, next_match], [InRange(0, 2), InRange(8, 10), InRange(32, 34), Done] ); - search_asserts!(STRESS, 'Á', "Forward search for two-byte Latin character; check if next() still works", - [next_match, next, next_match, next, next_match, next, next_match], - [InRange(0, 2), Rejects(2, 3), InRange(8, 10), Rejects(10, 13), InRange(32, 34), Rejects(34, 37), Done] - ); - - search_asserts!(STRESS, '각', "Forward search for three-byte Hangul character", - [next_match, next, next_match, next_match, next_match], + search_asserts!( + STRESS, + 'Á', + "Forward search for two-byte Latin character; check if next() still works", + [next_match, next, next_match, next, next_match, next, next_match], + [ + InRange(0, 2), + Rejects(2, 3), + InRange(8, 10), + Rejects(10, 13), + InRange(32, 34), + Rejects(34, 37), + Done + ] + ); + + search_asserts!( + STRESS, + '각', + "Forward search for three-byte Hangul character", + [next_match, next, next_match, next_match, next_match], [InRange(19, 22), Rejects(22, 25), InRange(28, 31), InRange(34, 37), Done] ); - search_asserts!(STRESS, '각', "Forward search for three-byte Hangul character; check if next() still works", - [next_match, next, next_match, next, next_match, next, next_match], - [InRange(19, 22), Rejects(22, 25), InRange(28, 31), Rejects(31, 32), InRange(34, 37), Rejects(37, 40), Done] - ); - - search_asserts!(STRESS, 'ก', "Forward search for three-byte Thai character", - [next_match, next, next_match, next, next_match], + search_asserts!( + STRESS, + '각', + "Forward search for three-byte Hangul character; check if next() still works", + [next_match, next, next_match, next, next_match, next, next_match], + [ + InRange(19, 22), + Rejects(22, 25), + InRange(28, 31), + Rejects(31, 32), + InRange(34, 37), + Rejects(37, 40), + Done + ] + ); + + search_asserts!( + STRESS, + 'ก', + "Forward search for three-byte Thai character", + [next_match, next, next_match, next, next_match], [InRange(22, 25), Rejects(25, 28), InRange(40, 43), Rejects(43, 47), Done] ); - search_asserts!(STRESS, 'ก', "Forward search for three-byte Thai character; check if next() still works", - [next_match, next, next_match, next, next_match], + search_asserts!( + STRESS, + 'ก', + "Forward search for three-byte Thai character; check if next() still works", + [next_match, next, next_match, next, next_match], [InRange(22, 25), Rejects(25, 28), InRange(40, 43), Rejects(43, 47), Done] ); - search_asserts!(STRESS, '😁', "Forward search for four-byte emoji", - [next_match, next, next_match, next, next_match], + search_asserts!( + STRESS, + '😁', + "Forward search for four-byte emoji", + [next_match, next, next_match, next, next_match], [InRange(15, 19), Rejects(19, 22), InRange(43, 47), Rejects(47, 48), Done] ); - search_asserts!(STRESS, '😁', "Forward search for four-byte emoji; check if next() still works", - [next_match, next, next_match, next, next_match], + search_asserts!( + STRESS, + '😁', + "Forward search for four-byte emoji; check if next() still works", + [next_match, next, next_match, next, next_match], [InRange(15, 19), Rejects(19, 22), InRange(43, 47), Rejects(47, 48), Done] ); - search_asserts!(STRESS, 'ꁁ', "Forward search for three-byte Yi character with repeated bytes", - [next_match, next, next_match, next, next_match], + search_asserts!( + STRESS, + 'ꁁ', + "Forward search for three-byte Yi character with repeated bytes", + [next_match, next, next_match, next, next_match], [InRange(10, 13), Rejects(13, 14), InRange(37, 40), Rejects(40, 43), Done] ); - search_asserts!(STRESS, 'ꁁ', "Forward search for three-byte Yi character with repeated bytes; check if next() still works", - [next_match, next, next_match, next, next_match], + search_asserts!( + STRESS, + 'ꁁ', + "Forward search for three-byte Yi character with repeated bytes; check if next() still works", + [next_match, next, next_match, next, next_match], [InRange(10, 13), Rejects(13, 14), InRange(37, 40), Rejects(40, 43), Done] ); } #[test] fn test_reverse_search_shared_bytes() { - search_asserts!(STRESS, 'Á', "Reverse search for two-byte Latin character", + search_asserts!( + STRESS, + 'Á', + "Reverse search for two-byte Latin character", [next_match_back, next_match_back, next_match_back, next_match_back], - [InRange(32, 34), InRange(8, 10), InRange(0, 2), Done] - ); - - search_asserts!(STRESS, 'Á', "Reverse search for two-byte Latin character; check if next_back() still works", - [next_match_back, next_back, next_match_back, next_back, next_match_back, next_back], - [InRange(32, 34), Rejects(31, 32), InRange(8, 10), Rejects(7, 8), InRange(0, 2), Done] - ); - - search_asserts!(STRESS, '각', "Reverse search for three-byte Hangul character", - [next_match_back, next_back, next_match_back, next_match_back, next_match_back], - [InRange(34, 37), Rejects(32, 34), InRange(28, 31), InRange(19, 22), Done] - ); - - search_asserts!(STRESS, '각', "Reverse search for three-byte Hangul character; check if next_back() still works", - [next_match_back, next_back, next_match_back, next_back, next_match_back, next_back, next_match_back], - [InRange(34, 37), Rejects(32, 34), InRange(28, 31), Rejects(25, 28), InRange(19, 22), Rejects(15, 19), Done] - ); - - search_asserts!(STRESS, 'ก', "Reverse search for three-byte Thai character", - [next_match_back, next_back, next_match_back, next_back, next_match_back], + [InRange(32, 34), InRange(8, 10), InRange(0, 2), Done] + ); + + search_asserts!( + STRESS, + 'Á', + "Reverse search for two-byte Latin character; check if next_back() still works", + [next_match_back, next_back, next_match_back, next_back, next_match_back, next_back], + [InRange(32, 34), Rejects(31, 32), InRange(8, 10), Rejects(7, 8), InRange(0, 2), Done] + ); + + search_asserts!( + STRESS, + '각', + "Reverse search for three-byte Hangul character", + [next_match_back, next_back, next_match_back, next_match_back, next_match_back], + [InRange(34, 37), Rejects(32, 34), InRange(28, 31), InRange(19, 22), Done] + ); + + search_asserts!( + STRESS, + '각', + "Reverse search for three-byte Hangul character; check if next_back() still works", + [ + next_match_back, + next_back, + next_match_back, + next_back, + next_match_back, + next_back, + next_match_back + ], + [ + InRange(34, 37), + Rejects(32, 34), + InRange(28, 31), + Rejects(25, 28), + InRange(19, 22), + Rejects(15, 19), + Done + ] + ); + + search_asserts!( + STRESS, + 'ก', + "Reverse search for three-byte Thai character", + [next_match_back, next_back, next_match_back, next_back, next_match_back], [InRange(40, 43), Rejects(37, 40), InRange(22, 25), Rejects(19, 22), Done] ); - search_asserts!(STRESS, 'ก', "Reverse search for three-byte Thai character; check if next_back() still works", - [next_match_back, next_back, next_match_back, next_back, next_match_back], + search_asserts!( + STRESS, + 'ก', + "Reverse search for three-byte Thai character; check if next_back() still works", + [next_match_back, next_back, next_match_back, next_back, next_match_back], [InRange(40, 43), Rejects(37, 40), InRange(22, 25), Rejects(19, 22), Done] ); - search_asserts!(STRESS, '😁', "Reverse search for four-byte emoji", - [next_match_back, next_back, next_match_back, next_back, next_match_back], + search_asserts!( + STRESS, + '😁', + "Reverse search for four-byte emoji", + [next_match_back, next_back, next_match_back, next_back, next_match_back], [InRange(43, 47), Rejects(40, 43), InRange(15, 19), Rejects(14, 15), Done] ); - search_asserts!(STRESS, '😁', "Reverse search for four-byte emoji; check if next_back() still works", - [next_match_back, next_back, next_match_back, next_back, next_match_back], + search_asserts!( + STRESS, + '😁', + "Reverse search for four-byte emoji; check if next_back() still works", + [next_match_back, next_back, next_match_back, next_back, next_match_back], [InRange(43, 47), Rejects(40, 43), InRange(15, 19), Rejects(14, 15), Done] ); - search_asserts!(STRESS, 'ꁁ', "Reverse search for three-byte Yi character with repeated bytes", - [next_match_back, next_back, next_match_back, next_back, next_match_back], + search_asserts!( + STRESS, + 'ꁁ', + "Reverse search for three-byte Yi character with repeated bytes", + [next_match_back, next_back, next_match_back, next_back, next_match_back], [InRange(37, 40), Rejects(34, 37), InRange(10, 13), Rejects(8, 10), Done] ); - search_asserts!(STRESS, 'ꁁ', "Reverse search for three-byte Yi character with repeated bytes; check if next_back() still works", - [next_match_back, next_back, next_match_back, next_back, next_match_back], + search_asserts!( + STRESS, + 'ꁁ', + "Reverse search for three-byte Yi character with repeated bytes; check if next_back() still works", + [next_match_back, next_back, next_match_back, next_back, next_match_back], [InRange(37, 40), Rejects(34, 37), InRange(10, 13), Rejects(8, 10), Done] ); } @@ -257,36 +444,60 @@ fn test_reverse_search_shared_bytes() { fn double_ended_regression_test() { // https://github.com/rust-lang/rust/issues/47175 // Ensures that double ended searching comes to a convergence - search_asserts!("abcdeabcdeabcde", 'a', "alternating double ended search", - [next_match, next_match_back, next_match, next_match_back], + search_asserts!( + "abcdeabcdeabcde", + 'a', + "alternating double ended search", + [next_match, next_match_back, next_match, next_match_back], [InRange(0, 1), InRange(10, 11), InRange(5, 6), Done] ); - search_asserts!("abcdeabcdeabcde", 'a', "triple double ended search for a", - [next_match, next_match_back, next_match_back, next_match_back], + search_asserts!( + "abcdeabcdeabcde", + 'a', + "triple double ended search for a", + [next_match, next_match_back, next_match_back, next_match_back], [InRange(0, 1), InRange(10, 11), InRange(5, 6), Done] ); - search_asserts!("abcdeabcdeabcde", 'd', "triple double ended search for d", - [next_match, next_match_back, next_match_back, next_match_back], + search_asserts!( + "abcdeabcdeabcde", + 'd', + "triple double ended search for d", + [next_match, next_match_back, next_match_back, next_match_back], [InRange(3, 4), InRange(13, 14), InRange(8, 9), Done] ); - search_asserts!(STRESS, 'Á', "Double ended search for two-byte Latin character", - [next_match, next_match_back, next_match, next_match_back], + search_asserts!( + STRESS, + 'Á', + "Double ended search for two-byte Latin character", + [next_match, next_match_back, next_match, next_match_back], [InRange(0, 2), InRange(32, 34), InRange(8, 10), Done] ); - search_asserts!(STRESS, '각', "Reverse double ended search for three-byte Hangul character", - [next_match_back, next_back, next_match, next, next_match_back, next_match], + search_asserts!( + STRESS, + '각', + "Reverse double ended search for three-byte Hangul character", + [next_match_back, next_back, next_match, next, next_match_back, next_match], [InRange(34, 37), Rejects(32, 34), InRange(19, 22), Rejects(22, 25), InRange(28, 31), Done] ); - search_asserts!(STRESS, 'ก', "Double ended search for three-byte Thai character", - [next_match, next_back, next, next_match_back, next_match], + search_asserts!( + STRESS, + 'ก', + "Double ended search for three-byte Thai character", + [next_match, next_back, next, next_match_back, next_match], [InRange(22, 25), Rejects(47, 48), Rejects(25, 28), InRange(40, 43), Done] ); - search_asserts!(STRESS, '😁', "Double ended search for four-byte emoji", - [next_match_back, next, next_match, next_back, next_match], + search_asserts!( + STRESS, + '😁', + "Double ended search for four-byte emoji", + [next_match_back, next, next_match, next_back, next_match], [InRange(43, 47), Rejects(0, 2), InRange(15, 19), Rejects(40, 43), Done] ); - search_asserts!(STRESS, 'ꁁ', "Double ended search for three-byte Yi character with repeated bytes", - [next_match, next, next_match_back, next_back, next_match], + search_asserts!( + STRESS, + 'ꁁ', + "Double ended search for three-byte Yi character with repeated bytes", + [next_match, next, next_match_back, next_back, next_match], [InRange(10, 13), Rejects(13, 14), InRange(37, 40), Rejects(34, 37), Done] ); } diff --git a/src/libcore/tests/ptr.rs b/src/libcore/tests/ptr.rs index eea736bc88..a008b3319f 100644 --- a/src/libcore/tests/ptr.rs +++ b/src/libcore/tests/ptr.rs @@ -1,6 +1,17 @@ use core::cell::RefCell; use core::ptr::*; +#[test] +fn test_const_from_raw_parts() { + const SLICE: &[u8] = &[1, 2, 3, 4]; + const FROM_RAW: &[u8] = unsafe { &*slice_from_raw_parts(SLICE.as_ptr(), SLICE.len()) }; + assert_eq!(SLICE, FROM_RAW); + + let slice = &[1, 2, 3, 4, 5]; + let from_raw = unsafe { &*slice_from_raw_parts(slice.as_ptr(), 2) }; + assert_eq!(&slice[..2], from_raw); +} + #[test] fn test() { unsafe { diff --git a/src/libcore/tests/result.rs b/src/libcore/tests/result.rs index 163f8d0ab3..c835313aae 100644 --- a/src/libcore/tests/result.rs +++ b/src/libcore/tests/result.rs @@ -1,31 +1,30 @@ -use core::option::*; use core::array::FixedSizeArray; use core::ops::DerefMut; +use core::option::*; -fn op1() -> Result { Ok(666) } -fn op2() -> Result { Err("sadface") } +fn op1() -> Result { + Ok(666) +} +fn op2() -> Result { + Err("sadface") +} #[test] fn test_and() { assert_eq!(op1().and(Ok(667)).unwrap(), 667); - assert_eq!(op1().and(Err::("bad")).unwrap_err(), - "bad"); + assert_eq!(op1().and(Err::("bad")).unwrap_err(), "bad"); assert_eq!(op2().and(Ok(667)).unwrap_err(), "sadface"); - assert_eq!(op2().and(Err::("bad")).unwrap_err(), - "sadface"); + assert_eq!(op2().and(Err::("bad")).unwrap_err(), "sadface"); } #[test] fn test_and_then() { assert_eq!(op1().and_then(|i| Ok::(i + 1)).unwrap(), 667); - assert_eq!(op1().and_then(|_| Err::("bad")).unwrap_err(), - "bad"); + assert_eq!(op1().and_then(|_| Err::("bad")).unwrap_err(), "bad"); - assert_eq!(op2().and_then(|i| Ok::(i + 1)).unwrap_err(), - "sadface"); - assert_eq!(op2().and_then(|_| Err::("bad")).unwrap_err(), - "sadface"); + assert_eq!(op2().and_then(|i| Ok::(i + 1)).unwrap_err(), "sadface"); + assert_eq!(op2().and_then(|_| Err::("bad")).unwrap_err(), "sadface"); } #[test] @@ -43,8 +42,7 @@ fn test_or_else() { assert_eq!(op1().or_else(|e| Err::(e)).unwrap(), 666); assert_eq!(op2().or_else(|_| Ok::(667)).unwrap(), 667); - assert_eq!(op2().or_else(|e| Err::(e)).unwrap_err(), - "sadface"); + assert_eq!(op2().or_else(|e| Err::(e)).unwrap_err(), "sadface"); } #[test] @@ -67,9 +65,7 @@ fn test_collect() { let v: Result, ()> = (0..3).map(|x| Ok::(x)).collect(); assert!(v == Ok(vec![0, 1, 2])); - let v: Result, isize> = (0..3).map(|x| { - if x > 1 { Err(x) } else { Ok(x) } - }).collect(); + let v: Result, isize> = (0..3).map(|x| if x > 1 { Err(x) } else { Ok(x) }).collect(); assert!(v == Err(2)); // test that it does not take more elements than it needs @@ -103,11 +99,7 @@ fn test_unwrap_or() { #[test] fn test_unwrap_or_else() { fn handler(msg: &'static str) -> isize { - if msg == "I got this." { - 50 - } else { - panic!("BadBad") - } + if msg == "I got this." { 50 } else { panic!("BadBad") } } let ok: Result = Ok(100); @@ -121,38 +113,32 @@ fn test_unwrap_or_else() { #[should_panic] pub fn test_unwrap_or_else_panic() { fn handler(msg: &'static str) -> isize { - if msg == "I got this." { - 50 - } else { - panic!("BadBad") - } + if msg == "I got this." { 50 } else { panic!("BadBad") } } let bad_err: Result = Err("Unrecoverable mess."); - let _ : isize = bad_err.unwrap_or_else(handler); + let _: isize = bad_err.unwrap_or_else(handler); } - #[test] pub fn test_expect_ok() { let ok: Result = Ok(100); assert_eq!(ok.expect("Unexpected error"), 100); } #[test] -#[should_panic(expected="Got expected error: \"All good\"")] +#[should_panic(expected = "Got expected error: \"All good\"")] pub fn test_expect_err() { let err: Result = Err("All good"); err.expect("Got expected error"); } - #[test] pub fn test_expect_err_err() { let ok: Result<&'static str, isize> = Err(100); assert_eq!(ok.expect_err("Unexpected ok"), 100); } #[test] -#[should_panic(expected="Got expected ok: \"All good\"")] +#[should_panic(expected = "Got expected ok: \"All good\"")] pub fn test_expect_err_ok() { let err: Result<&'static str, isize> = Ok("All good"); err.expect_err("Got expected ok"); @@ -197,6 +183,28 @@ pub fn test_unwrap_or_default() { assert_eq!(op2().unwrap_or_default(), 0); } +#[test] +pub fn test_into_ok() { + fn infallible_op() -> Result { + Ok(666) + } + + assert_eq!(infallible_op().into_ok(), 666); + + enum MyNeverToken {} + impl From for ! { + fn from(never: MyNeverToken) -> ! { + match never {} + } + } + + fn infallible_op2() -> Result { + Ok(667) + } + + assert_eq!(infallible_op2().into_ok(), 667); +} + #[test] fn test_try() { fn try_result_some() -> Option { @@ -228,31 +236,17 @@ fn test_try() { #[test] fn test_result_as_deref() { - // &Result::Ok(T).as_deref_ok() -> + // &Result::Ok(T).as_deref() -> // Result<&T::Deref::Target, &E>::Ok(&*T) let ref_ok = &Result::Ok::<&i32, u8>(&42); let expected_result = Result::Ok::<&i32, &u8>(&42); - assert_eq!(ref_ok.as_deref_ok(), expected_result); - - let ref_ok = &Result::Ok::(String::from("a result")); - let expected_result = Result::Ok::<&str, &u32>("a result"); - assert_eq!(ref_ok.as_deref_ok(), expected_result); - - let ref_ok = &Result::Ok::, u32>(vec![1, 2, 3, 4, 5]); - let expected_result = Result::Ok::<&[i32], &u32>([1, 2, 3, 4, 5].as_slice()); - assert_eq!(ref_ok.as_deref_ok(), expected_result); - - // &Result::Ok(T).as_deref() -> - // Result<&T::Deref::Target, &E::Deref::Target>::Ok(&*T) - let ref_ok = &Result::Ok::<&i32, &u8>(&42); - let expected_result = Result::Ok::<&i32, &u8>(&42); assert_eq!(ref_ok.as_deref(), expected_result); - let ref_ok = &Result::Ok::(String::from("a result")); + let ref_ok = &Result::Ok::(String::from("a result")); let expected_result = Result::Ok::<&str, &u32>("a result"); assert_eq!(ref_ok.as_deref(), expected_result); - let ref_ok = &Result::Ok::, &u32>(vec![1, 2, 3, 4, 5]); + let ref_ok = &Result::Ok::, u32>(vec![1, 2, 3, 4, 5]); let expected_result = Result::Ok::<&[i32], &u32>([1, 2, 3, 4, 5].as_slice()); assert_eq!(ref_ok.as_deref(), expected_result); @@ -273,19 +267,21 @@ fn test_result_as_deref() { // &Result::Err(T).as_deref_err() -> // Result<&T, &E::Deref::Target>::Err(&*E) let ref_err = &Result::Err::<&u8, &i32>(&41); - let expected_result = Result::Err::<&u8, &i32>(&41); + let expected_result = Result::Err::<&u8, &&i32>(&&41); assert_eq!(ref_err.as_deref(), expected_result); - let ref_err = &Result::Err::<&u32, String>(String::from("an error")); - let expected_result = Result::Err::<&u32, &str>("an error"); + let s = String::from("an error"); + let ref_err = &Result::Err::<&u32, String>(s.clone()); + let expected_result = Result::Err::<&u32, &String>(&s); assert_eq!(ref_err.as_deref(), expected_result); - let ref_err = &Result::Err::<&u32, Vec>(vec![5, 4, 3, 2, 1]); - let expected_result = Result::Err::<&u32, &[i32]>([5, 4, 3, 2, 1].as_slice()); + let v = vec![5, 4, 3, 2, 1]; + let ref_err = &Result::Err::<&u32, Vec>(v.clone()); + let expected_result = Result::Err::<&u32, &Vec>(&v); assert_eq!(ref_err.as_deref(), expected_result); // The following cases test calling `as_deref_*` with the wrong variant (i.e. - // `as_deref_ok()` with a `Result::Err()`, or `as_deref_err()` with a `Result::Ok()`. + // `as_deref()` with a `Result::Err()`, or `as_deref_err()` with a `Result::Ok()`. // While uncommon, these cases are supported to ensure that an `as_deref_*` // call can still be made even when one of the Result types does not implement // `Deref` (for example, std::io::Error). @@ -304,56 +300,38 @@ fn test_result_as_deref() { let expected_result = Result::Ok::<&[i32; 5], &u32>(&[1, 2, 3, 4, 5]); assert_eq!(ref_ok.as_deref_err(), expected_result); - // &Result::Err(E).as_deref_ok() -> + // &Result::Err(E).as_deref() -> // Result<&T::Deref::Target, &E>::Err(&E) let ref_err = &Result::Err::<&u8, i32>(41); let expected_result = Result::Err::<&u8, &i32>(&41); - assert_eq!(ref_err.as_deref_ok(), expected_result); + assert_eq!(ref_err.as_deref(), expected_result); let ref_err = &Result::Err::<&u32, &str>("an error"); let expected_result = Result::Err::<&u32, &&str>(&"an error"); - assert_eq!(ref_err.as_deref_ok(), expected_result); + assert_eq!(ref_err.as_deref(), expected_result); let ref_err = &Result::Err::<&u32, [i32; 5]>([5, 4, 3, 2, 1]); let expected_result = Result::Err::<&u32, &[i32; 5]>(&[5, 4, 3, 2, 1]); - assert_eq!(ref_err.as_deref_ok(), expected_result); + assert_eq!(ref_err.as_deref(), expected_result); } #[test] fn test_result_as_deref_mut() { - // &mut Result::Ok(T).as_deref_mut_ok() -> + // &mut Result::Ok(T).as_deref_mut() -> // Result<&mut T::Deref::Target, &mut E>::Ok(&mut *T) let mut val = 42; let mut expected_val = 42; let mut_ok = &mut Result::Ok::<&mut i32, u8>(&mut val); let expected_result = Result::Ok::<&mut i32, &mut u8>(&mut expected_val); - assert_eq!(mut_ok.as_deref_mut_ok(), expected_result); - - let mut expected_string = String::from("a result"); - let mut_ok = &mut Result::Ok::(expected_string.clone()); - let expected_result = Result::Ok::<&mut str, &mut u32>(expected_string.deref_mut()); - assert_eq!(mut_ok.as_deref_mut_ok(), expected_result); - - let mut expected_vec = vec![1, 2, 3, 4, 5]; - let mut_ok = &mut Result::Ok::, u32>(expected_vec.clone()); - let expected_result = Result::Ok::<&mut [i32], &mut u32>(expected_vec.as_mut_slice()); - assert_eq!(mut_ok.as_deref_mut_ok(), expected_result); - - // &mut Result::Ok(T).as_deref_mut() -> - // Result<&mut T::Deref::Target, &mut E::Deref::Target>::Ok(&mut *T) - let mut val = 42; - let mut expected_val = 42; - let mut_ok = &mut Result::Ok::<&mut i32, &mut u8>(&mut val); - let expected_result = Result::Ok::<&mut i32, &mut u8>(&mut expected_val); assert_eq!(mut_ok.as_deref_mut(), expected_result); let mut expected_string = String::from("a result"); - let mut_ok = &mut Result::Ok::(expected_string.clone()); + let mut_ok = &mut Result::Ok::(expected_string.clone()); let expected_result = Result::Ok::<&mut str, &mut u32>(expected_string.deref_mut()); assert_eq!(mut_ok.as_deref_mut(), expected_result); let mut expected_vec = vec![1, 2, 3, 4, 5]; - let mut_ok = &mut Result::Ok::, &mut u32>(expected_vec.clone()); + let mut_ok = &mut Result::Ok::, u32>(expected_vec.clone()); let expected_result = Result::Ok::<&mut [i32], &mut u32>(expected_vec.as_mut_slice()); assert_eq!(mut_ok.as_deref_mut(), expected_result); @@ -378,23 +356,22 @@ fn test_result_as_deref_mut() { // &mut Result::Err(T).as_deref_mut_err() -> // Result<&mut T, &mut E::Deref::Target>::Err(&mut *E) let mut val = 41; - let mut expected_val = 41; - let mut_err = &mut Result::Err::<&mut u8, &mut i32>(&mut val); - let expected_result = Result::Err::<&mut u8, &mut i32>(&mut expected_val); + let mut_err = &mut Result::Err::<&mut u8, i32>(val); + let expected_result = Result::Err::<&mut u8, &mut i32>(&mut val); assert_eq!(mut_err.as_deref_mut(), expected_result); let mut expected_string = String::from("an error"); let mut_err = &mut Result::Err::<&mut u32, String>(expected_string.clone()); - let expected_result = Result::Err::<&mut u32, &mut str>(expected_string.as_mut_str()); + let expected_result = Result::Err::<&mut u32, &mut String>(&mut expected_string); assert_eq!(mut_err.as_deref_mut(), expected_result); let mut expected_vec = vec![5, 4, 3, 2, 1]; let mut_err = &mut Result::Err::<&mut u32, Vec>(expected_vec.clone()); - let expected_result = Result::Err::<&mut u32, &mut [i32]>(expected_vec.as_mut_slice()); + let expected_result = Result::Err::<&mut u32, &mut Vec>(&mut expected_vec); assert_eq!(mut_err.as_deref_mut(), expected_result); // The following cases test calling `as_deref_mut_*` with the wrong variant (i.e. - // `as_deref_mut_ok()` with a `Result::Err()`, or `as_deref_mut_err()` with a `Result::Ok()`. + // `as_deref_mut()` with a `Result::Err()`, or `as_deref_mut_err()` with a `Result::Ok()`. // While uncommon, these cases are supported to ensure that an `as_deref_mut_*` // call can still be made even when one of the Result types does not implement // `Deref` (for example, std::io::Error). @@ -418,22 +395,22 @@ fn test_result_as_deref_mut() { let expected_result = Result::Ok::<&mut [i32; 5], &mut u32>(&mut expected_arr); assert_eq!(mut_ok.as_deref_mut_err(), expected_result); - // &mut Result::Err(E).as_deref_mut_ok() -> + // &mut Result::Err(E).as_deref_mut() -> // Result<&mut T::Deref::Target, &mut E>::Err(&mut E) let mut expected_val = 41; let mut_err = &mut Result::Err::<&mut u8, i32>(expected_val.clone()); let expected_result = Result::Err::<&mut u8, &mut i32>(&mut expected_val); - assert_eq!(mut_err.as_deref_mut_ok(), expected_result); + assert_eq!(mut_err.as_deref_mut(), expected_result); let string = String::from("an error"); let expected_string = string.clone(); let mut ref_str = expected_string.as_ref(); let mut_err = &mut Result::Err::<&mut u32, &str>(string.as_str()); let expected_result = Result::Err::<&mut u32, &mut &str>(&mut ref_str); - assert_eq!(mut_err.as_deref_mut_ok(), expected_result); + assert_eq!(mut_err.as_deref_mut(), expected_result); let mut expected_arr = [5, 4, 3, 2, 1]; let mut_err = &mut Result::Err::<&mut u32, [i32; 5]>(expected_arr.clone()); let expected_result = Result::Err::<&mut u32, &mut [i32; 5]>(&mut expected_arr); - assert_eq!(mut_err.as_deref_mut_ok(), expected_result); + assert_eq!(mut_err.as_deref_mut(), expected_result); } diff --git a/src/libcore/time.rs b/src/libcore/time.rs index 7d04cfb5da..2ece2150e6 100644 --- a/src/libcore/time.rs +++ b/src/libcore/time.rs @@ -130,7 +130,7 @@ impl Duration { /// ``` #[stable(feature = "duration", since = "1.3.0")] #[inline] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_consts", since = "1.32.0"))] + #[rustc_const_stable(feature = "duration_consts", since = "1.32.0")] pub fn new(secs: u64, nanos: u32) -> Duration { let secs = secs.checked_add((nanos / NANOS_PER_SEC) as u64).expect("overflow in Duration::new"); @@ -153,7 +153,7 @@ impl Duration { #[stable(feature = "duration", since = "1.3.0")] #[inline] #[rustc_promotable] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_consts", since = "1.32.0"))] + #[rustc_const_stable(feature = "duration_consts", since = "1.32.0")] pub const fn from_secs(secs: u64) -> Duration { Duration { secs, nanos: 0 } } @@ -172,8 +172,7 @@ impl Duration { /// ``` #[stable(feature = "duration", since = "1.3.0")] #[inline] - #[rustc_promotable] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_consts", since = "1.32.0"))] + #[rustc_const_stable(feature = "duration_consts", since = "1.32.0")] pub const fn from_millis(millis: u64) -> Duration { Duration { secs: millis / MILLIS_PER_SEC, @@ -195,8 +194,7 @@ impl Duration { /// ``` #[stable(feature = "duration_from_micros", since = "1.27.0")] #[inline] - #[rustc_promotable] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_consts", since = "1.32.0"))] + #[rustc_const_stable(feature = "duration_consts", since = "1.32.0")] pub const fn from_micros(micros: u64) -> Duration { Duration { secs: micros / MICROS_PER_SEC, @@ -218,8 +216,7 @@ impl Duration { /// ``` #[stable(feature = "duration_extras", since = "1.27.0")] #[inline] - #[rustc_promotable] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_consts", since = "1.32.0"))] + #[rustc_const_stable(feature = "duration_consts", since = "1.32.0")] pub const fn from_nanos(nanos: u64) -> Duration { Duration { secs: nanos / (NANOS_PER_SEC as u64), @@ -256,7 +253,7 @@ impl Duration { /// /// [`subsec_nanos`]: #method.subsec_nanos #[stable(feature = "duration", since = "1.3.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration", since = "1.32.0"))] + #[rustc_const_stable(feature = "duration", since = "1.32.0")] #[inline] pub const fn as_secs(&self) -> u64 { self.secs @@ -278,7 +275,7 @@ impl Duration { /// assert_eq!(duration.subsec_millis(), 432); /// ``` #[stable(feature = "duration_extras", since = "1.27.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_extras", since = "1.32.0"))] + #[rustc_const_stable(feature = "duration_extras", since = "1.32.0")] #[inline] pub const fn subsec_millis(&self) -> u32 { self.nanos / NANOS_PER_MILLI @@ -300,7 +297,7 @@ impl Duration { /// assert_eq!(duration.subsec_micros(), 234_567); /// ``` #[stable(feature = "duration_extras", since = "1.27.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_extras", since = "1.32.0"))] + #[rustc_const_stable(feature = "duration_extras", since = "1.32.0")] #[inline] pub const fn subsec_micros(&self) -> u32 { self.nanos / NANOS_PER_MICRO @@ -322,7 +319,7 @@ impl Duration { /// assert_eq!(duration.subsec_nanos(), 10_000_000); /// ``` #[stable(feature = "duration", since = "1.3.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration", since = "1.32.0"))] + #[rustc_const_stable(feature = "duration", since = "1.32.0")] #[inline] pub const fn subsec_nanos(&self) -> u32 { self.nanos @@ -339,7 +336,7 @@ impl Duration { /// assert_eq!(duration.as_millis(), 5730); /// ``` #[stable(feature = "duration_as_u128", since = "1.33.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_as_u128", since = "1.33.0"))] + #[rustc_const_stable(feature = "duration_as_u128", since = "1.33.0")] #[inline] pub const fn as_millis(&self) -> u128 { self.secs as u128 * MILLIS_PER_SEC as u128 + (self.nanos / NANOS_PER_MILLI) as u128 @@ -356,7 +353,7 @@ impl Duration { /// assert_eq!(duration.as_micros(), 5730023); /// ``` #[stable(feature = "duration_as_u128", since = "1.33.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_as_u128", since = "1.33.0"))] + #[rustc_const_stable(feature = "duration_as_u128", since = "1.33.0")] #[inline] pub const fn as_micros(&self) -> u128 { self.secs as u128 * MICROS_PER_SEC as u128 + (self.nanos / NANOS_PER_MICRO) as u128 @@ -373,7 +370,7 @@ impl Duration { /// assert_eq!(duration.as_nanos(), 5730023852); /// ``` #[stable(feature = "duration_as_u128", since = "1.33.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "duration_as_u128", since = "1.33.0"))] + #[rustc_const_stable(feature = "duration_as_u128", since = "1.33.0")] #[inline] pub const fn as_nanos(&self) -> u128 { self.secs as u128 * NANOS_PER_SEC as u128 + self.nanos as u128 diff --git a/src/libcore/unicode/bool_trie.rs b/src/libcore/unicode/bool_trie.rs deleted file mode 100644 index b7fba88a54..0000000000 --- a/src/libcore/unicode/bool_trie.rs +++ /dev/null @@ -1,66 +0,0 @@ -/// BoolTrie is a trie for representing a set of Unicode codepoints. It is -/// implemented with postfix compression (sharing of identical child nodes), -/// which gives both compact size and fast lookup. -/// -/// The space of Unicode codepoints is divided into 3 subareas, each -/// represented by a trie with different depth. In the first (0..0x800), there -/// is no trie structure at all; each u64 entry corresponds to a bitvector -/// effectively holding 64 bool values. -/// -/// In the second (0x800..0x10000), each child of the root node represents a -/// 64-wide subrange, but instead of storing the full 64-bit value of the leaf, -/// the trie stores an 8-bit index into a shared table of leaf values. This -/// exploits the fact that in reasonable sets, many such leaves can be shared. -/// -/// In the third (0x10000..0x110000), each child of the root node represents a -/// 4096-wide subrange, and the trie stores an 8-bit index into a 64-byte slice -/// of a child tree. Each of these 64 bytes represents an index into the table -/// of shared 64-bit leaf values. This exploits the sparse structure in the -/// non-BMP range of most Unicode sets. -pub struct BoolTrie { - // 0..0x800 (corresponding to 1 and 2 byte utf-8 sequences) - pub r1: [u64; 32], // leaves - - // 0x800..0x10000 (corresponding to 3 byte utf-8 sequences) - pub r2: [u8; 992], // first level - pub r3: &'static [u64], // leaves - - // 0x10000..0x110000 (corresponding to 4 byte utf-8 sequences) - pub r4: [u8; 256], // first level - pub r5: &'static [u8], // second level - pub r6: &'static [u64], // leaves -} -impl BoolTrie { - pub fn lookup(&self, c: char) -> bool { - let c = c as u32; - if c < 0x800 { - trie_range_leaf(c, self.r1[(c >> 6) as usize]) - } else if c < 0x10000 { - let child = self.r2[(c >> 6) as usize - 0x20]; - trie_range_leaf(c, self.r3[child as usize]) - } else { - let child = self.r4[(c >> 12) as usize - 0x10]; - let leaf = self.r5[((child as usize) << 6) + ((c >> 6) as usize & 0x3f)]; - trie_range_leaf(c, self.r6[leaf as usize]) - } - } -} - -pub struct SmallBoolTrie { - pub(crate) r1: &'static [u8], // first level - pub(crate) r2: &'static [u64], // leaves -} - -impl SmallBoolTrie { - pub fn lookup(&self, c: char) -> bool { - let c = c as u32; - match self.r1.get((c >> 6) as usize) { - Some(&child) => trie_range_leaf(c, self.r2[child as usize]), - None => false, - } - } -} - -fn trie_range_leaf(c: u32, bitmap_chunk: u64) -> bool { - ((bitmap_chunk >> (c & 63)) & 1) != 0 -} diff --git a/src/libcore/unicode/mod.rs b/src/libcore/unicode/mod.rs index a3ec9fd51f..b6eaf06aa7 100644 --- a/src/libcore/unicode/mod.rs +++ b/src/libcore/unicode/mod.rs @@ -1,15 +1,59 @@ -#![unstable(feature = "unicode_internals", issue = "0")] +#![unstable(feature = "unicode_internals", issue = "none")] #![allow(missing_docs)] -mod bool_trie; pub(crate) mod printable; -pub(crate) mod tables; +mod unicode_data; pub(crate) mod version; +use version::UnicodeVersion; + +/// The version of [Unicode](http://www.unicode.org/) that the Unicode parts of +/// `char` and `str` methods are based on. +#[unstable(feature = "unicode_version", issue = "49726")] +pub const UNICODE_VERSION: UnicodeVersion = UnicodeVersion { + major: unicode_data::UNICODE_VERSION.0, + minor: unicode_data::UNICODE_VERSION.1, + micro: unicode_data::UNICODE_VERSION.2, + _priv: (), +}; + // For use in liballoc, not re-exported in libstd. pub mod derived_property { - pub use crate::unicode::tables::derived_property::{Case_Ignorable, Cased}; + pub use super::{Case_Ignorable, Cased}; } -pub mod conversions { - pub use crate::unicode::tables::conversions::{to_lower, to_upper}; + +pub use unicode_data::alphabetic::lookup as Alphabetic; +pub use unicode_data::case_ignorable::lookup as Case_Ignorable; +pub use unicode_data::cased::lookup as Cased; +pub use unicode_data::cc::lookup as Cc; +pub use unicode_data::conversions; +pub use unicode_data::grapheme_extend::lookup as Grapheme_Extend; +pub use unicode_data::lowercase::lookup as Lowercase; +pub use unicode_data::n::lookup as N; +pub use unicode_data::uppercase::lookup as Uppercase; +pub use unicode_data::white_space::lookup as White_Space; + +#[inline(always)] +fn range_search( + needle: u32, + chunk_idx_map: &[u8; N], + (last_chunk_idx, last_chunk_mapping): (u16, u8), + bitset_chunk_idx: &[[u8; 16]; N1], + bitset: &[u64; N2], +) -> bool { + let bucket_idx = (needle / 64) as usize; + let chunk_map_idx = bucket_idx / 16; + let chunk_piece = bucket_idx % 16; + let chunk_idx = if chunk_map_idx >= N { + if chunk_map_idx == last_chunk_idx as usize { + last_chunk_mapping + } else { + return false; + } + } else { + chunk_idx_map[chunk_map_idx] + }; + let idx = bitset_chunk_idx[(chunk_idx as usize)][chunk_piece]; + let word = bitset[(idx as usize)]; + (word & (1 << (needle % 64) as u64)) != 0 } diff --git a/src/libcore/unicode/tables.rs b/src/libcore/unicode/tables.rs deleted file mode 100644 index 3fa125e8fe..0000000000 --- a/src/libcore/unicode/tables.rs +++ /dev/null @@ -1,2235 +0,0 @@ -// NOTE: The following code was generated by "./unicode.py", do not edit directly - -#![allow(missing_docs, non_upper_case_globals, non_snake_case, clippy::unreadable_literal)] - -use crate::unicode::bool_trie::{BoolTrie, SmallBoolTrie}; -use crate::unicode::version::UnicodeVersion; - -/// The version of [Unicode](http://www.unicode.org/) that the Unicode parts of -/// `char` and `str` methods are based on. -#[unstable(feature = "unicode_version", issue = "49726")] -pub const UNICODE_VERSION: UnicodeVersion = - UnicodeVersion { major: 12, minor: 1, micro: 0, _priv: () }; -pub(crate) mod general_category { - #[rustfmt::skip] - const Cc_table: &super::SmallBoolTrie = &super::SmallBoolTrie { - r1: &[ - 0, 1, 0 - ], - r2: &[ - 0x00000000ffffffff, 0x8000000000000000 - ], - }; - - pub fn Cc(c: char) -> bool { - Cc_table.lookup(c) - } - - #[rustfmt::skip] - const N_table: &super::BoolTrie = &super::BoolTrie { - r1: [ - 0x03ff000000000000, 0x0000000000000000, 0x720c000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x000003ff00000000, 0x0000000000000000, 0x03ff000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000000003ff - ], - r2: [ - 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 1, 0, 3, 0, 4, 0, 5, 0, 1, 0, 6, 0, 1, 0, 7, 0, 7, 8, - 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 0, 0, 0, 12, 7, 0, 0, 0, 0, 13, 0, 14, 0, 0, 15, 0, 0, 7, 16, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 9, 0, 0, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 27, 0, 28, - 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, - 0, 0, 1, 0, 0, 0, 0, 31, 0, 0, 7, 9, 0, 0, 32, 0, 7, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0 - ], - r3: &[ - 0x0000000000000000, 0x0000ffc000000000, 0x03f0ffc000000000, 0x00fcffc000000000, - 0x0007ffc000000000, 0x7f00ffc000000000, 0x01ffffc07f000000, 0x0000000003ff0000, - 0x000fffff00000000, 0x00000000000003ff, 0x1ffffe0000000000, 0x0001c00000000000, - 0x03ff03ff00000000, 0x000000000000ffc0, 0x0000000007ff0000, 0x0000000003ff03ff, - 0x03ff000000000000, 0x03f1000000000000, 0xffffffffffff0000, 0x00000000000003e7, - 0xffffffff00000000, 0x000000000fffffff, 0xfffffc0000000000, 0xffc0000000000000, - 0x00000000000fffff, 0x2000000000000000, 0x070003fe00000080, 0x00000000003c0000, - 0x000003ff00000000, 0x00000000fffeff00, 0xfffe0000000003ff, 0x003f000000000000, - 0x03ff000003ff0000 - ], - r4: [ - 0, 1, 2, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 5, 6, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 - ], - r5: &[ - 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 4, 5, 6, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 10, 11, 12, 0, 13, 14, 0, 15, 16, 17, 0, 18, 19, 0, 0, 0, 0, 20, 21, 0, - 0, 0, 0, 22, 0, 0, 23, 24, 0, 0, 0, 25, 0, 21, 26, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, - 28, 0, 28, 0, 0, 0, 0, 0, 28, 0, 29, 30, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32, 0, 0, 0, 28, 8, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 39, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 21, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 28, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 - ], - r6: &[ - 0x0000000000000000, 0x000fffffffffff80, 0x01ffffffffffffff, 0x0000000000000c00, - 0x0ffffffe00000000, 0x0000000f00000000, 0x0000000000000402, 0x00000000003e0000, - 0x000003ff00000000, 0xfe000000ff000000, 0x0000ff8000000000, 0xf800000000000000, - 0x000000000fc00000, 0x3000000000000000, 0xfffffffffffcffff, 0x60000000000001ff, - 0x00000000e0000000, 0x0000f80000000000, 0xff000000ff000000, 0x0000fe0000000000, - 0xfc00000000000000, 0x03ff000000000000, 0x7fffffff00000000, 0x0000007fe0000000, - 0x00000000001e0000, 0x0000fffffffc0000, 0xffc0000000000000, 0x001ffffe03ff0000, - 0x0000000003ff0000, 0x00000000000003ff, 0x0fff000000000000, 0x0007ffff00000000, - 0x00001fffffff0000, 0x00000000001fffff, 0xffffffffffffffff, 0x00007fffffffffff, - 0x00000003fbff0000, 0x00000000007fffff, 0x000fffff00000000, 0x01ffffff00000000, - 0xffffffffffffc000, 0x000000000000ff80, 0xfffe000000000000, 0x001eefffffffffff, - 0x3fffbffffffffffe, 0x0000000000001fff - ], - }; - - pub fn N(c: char) -> bool { - N_table.lookup(c) - } -} - -pub(crate) mod derived_property { - #[rustfmt::skip] - const Alphabetic_table: &super::BoolTrie = &super::BoolTrie { - r1: [ - 0x0000000000000000, 0x07fffffe07fffffe, 0x0420040000000000, 0xff7fffffff7fffff, - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0x0000501f0003ffc3, - 0x0000000000000000, 0xbcdf000000000020, 0xfffffffbffffd740, 0xffbfffffffffffff, - 0xffffffffffffffff, 0xffffffffffffffff, 0xfffffffffffffc03, 0xffffffffffffffff, - 0xfffeffffffffffff, 0xffffffff027fffff, 0xbfff0000000001ff, 0x000787ffffff00b6, - 0xffffffff07ff0000, 0xffffc000feffffff, 0xffffffffffffffff, 0x9c00e1fe1fefffff, - 0xffffffffffff0000, 0xffffffffffffe000, 0x0003ffffffffffff, 0x043007fffffffc00 - ], - r2: [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 36, 36, 36, 36, 36, 36, 36, 36, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 31, 63, 64, 65, 66, 67, 68, 69, 70, 36, 36, 36, 71, 36, 36, - 36, 36, 72, 73, 74, 75, 31, 76, 77, 31, 78, 79, 80, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 81, 82, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 83, 84, 36, 85, 86, 87, 88, 89, 90, 31, 31, 31, - 31, 31, 31, 31, 91, 44, 92, 93, 94, 36, 95, 96, 31, 31, 31, 31, 31, 31, 31, 31, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 55, 31, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 97, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 98, 99, 36, 36, 36, 36, 100, 101, 36, 97, 102, 36, 103, - 104, 105, 106, 36, 107, 108, 109, 110, 111, 67, 112, 113, 114, 115, 116, 36, 117, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 118, 119, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 36, 36, 36, 36, 36, 120, 36, 121, 122, 123, 124, 125, 36, 36, 36, 36, 126, 33, 127, 128, - 31, 129, 36, 130, 131, 132, 113, 133 - ], - r3: &[ - 0x00001ffffcffffff, 0x000007ff01ffffff, 0x3fdfffff00000000, 0xffff03f8fff00000, - 0xefffffffffffffff, 0xfffe000fffe1dfff, 0xe3c5fdfffff99fef, 0x1003000fb080599f, - 0xc36dfdfffff987ee, 0x003f00005e021987, 0xe3edfdfffffbbfee, 0x1e00000f00011bbf, - 0xe3edfdfffff99fee, 0x0002000fb0c0199f, 0xc3ffc718d63dc7ec, 0x0000000000811dc7, - 0xe3fffdfffffddfef, 0x0000000f07601ddf, 0xe3effdfffffddfef, 0x0006000f40601ddf, - 0xe7fffffffffddfef, 0xfc00000f80f05ddf, 0x2ffbfffffc7fffec, 0x000c0000ff5f807f, - 0x07fffffffffffffe, 0x000000000000207f, 0x3bffffaffffff7d6, 0x00000000f000205f, - 0x0000000000000001, 0xfffe1ffffffffeff, 0x1ffffffffeffff03, 0x0000000000000000, - 0xf97fffffffffffff, 0xffffffffffff0000, 0xffffffff3c00ffff, 0xf7ffffffffff20bf, - 0xffffffffffffffff, 0xffffffff3d7f3dff, 0x7f3dffffffff3dff, 0xffffffffff7fff3d, - 0xffffffffff3dffff, 0x0000000007ffffff, 0xffffffff0000ffff, 0x3f3fffffffffffff, - 0xfffffffffffffffe, 0xffff9fffffffffff, 0xffffffff07fffffe, 0x01ffc7ffffffffff, - 0x000fffff000fdfff, 0x000ddfff000fffff, 0xffcfffffffffffff, 0x00000000108001ff, - 0xffffffff00000000, 0x01ffffffffffffff, 0xffff07ffffffffff, 0x003fffffffffffff, - 0x01ff0fff7fffffff, 0x001f3fffffff0000, 0xffff0fffffffffff, 0x00000000000003ff, - 0xffffffff0fffffff, 0x001ffffe7fffffff, 0x0000008000000000, 0xffefffffffffffff, - 0x0000000000000fef, 0xfc00f3ffffffffff, 0x0003ffbfffffffff, 0x007fffffffffffff, - 0x3ffffffffc00e000, 0xe7ffffffffff01ff, 0x046fde0000000000, 0x001fff8000000000, - 0xffffffff3f3fffff, 0x3fffffffaaff3f3f, 0x5fdfffffffffffff, 0x1fdc1fff0fcf1fdc, - 0x8002000000000000, 0x000000001fff0000, 0xf3ffbd503e2ffc84, 0xffffffff000043e0, - 0x00000000000001ff, 0xffc0000000000000, 0x000003ffffffffff, 0xffff7fffffffffff, - 0xffffffff7fffffff, 0x000c781fffffffff, 0xffff20bfffffffff, 0x000080ffffffffff, - 0x7f7f7f7f007fffff, 0xffffffff7f7f7f7f, 0x0000800000000000, 0x1f3e03fe000000e0, - 0xfffffffee07fffff, 0xf7ffffffffffffff, 0xfffeffffffffffe0, 0x07ffffff00007fff, - 0xffff000000000000, 0x0000ffffffffffff, 0x0000000000001fff, 0x3fffffffffff0000, - 0x00000c00ffff1fff, 0x8ff07fffffffffff, 0xfffffffcff800000, 0xfffffffffffff9ff, - 0xff8000000000007c, 0x000000ffffffffbf, 0x000fffffffffffff, 0xe8fc00000000002f, - 0xffff07fffffffc00, 0x1fffffff0007ffff, 0xfff7ffffffffffff, 0x7c00ffff00008000, - 0xfc7fffff00003fff, 0x7fffffffffffffff, 0x003cffff38000005, 0xffff7f7f007e7e7e, - 0xffff00fff7ffffff, 0x000007ffffffffff, 0xffff000fffffffff, 0x0ffffffffffff87f, - 0xffff3fffffffffff, 0x0000000003ffffff, 0x5f7ffdffe0f8007f, 0xffffffffffffffdb, - 0x0003ffffffffffff, 0xfffffffffff80000, 0x3fffffffffffffff, 0xfffffffffffcffff, - 0x0fff0000000000ff, 0xffdf000000000000, 0x1fffffffffffffff, 0x07fffffe00000000, - 0xffffffc007fffffe, 0x000000001cfcfcfc - ], - r4: [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 5, 9, 5, 10, 11, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 13, 14, - 15, 7, 16, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 - ], - r5: &[ - 0, 1, 2, 3, 4, 5, 4, 4, 4, 4, 6, 7, 8, 9, 10, 11, 2, 2, 12, 13, 14, 15, 4, 4, 2, 2, 2, - 2, 16, 17, 4, 4, 18, 19, 20, 21, 22, 4, 23, 4, 24, 25, 26, 27, 28, 29, 30, 4, 2, 31, 32, - 32, 33, 4, 4, 4, 4, 4, 4, 4, 34, 35, 4, 36, 2, 35, 37, 38, 32, 39, 2, 40, 41, 4, 42, 43, - 44, 45, 4, 4, 2, 46, 2, 47, 4, 4, 48, 49, 50, 51, 52, 4, 53, 4, 4, 4, 54, 4, 55, 56, 4, - 4, 57, 58, 59, 60, 61, 54, 4, 4, 4, 4, 62, 63, 64, 4, 65, 66, 67, 4, 4, 4, 4, 36, 4, 4, - 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 68, 4, 2, 69, 2, 2, 2, 70, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 69, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 71, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 2, 2, 2, 2, 2, 2, 2, 2, 54, 20, 4, 72, 73, 74, 75, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, - 4, 4, 2, 76, 77, 78, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 79, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 32, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 20, 80, 2, 2, 2, 2, - 2, 81, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 82, 83, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 84, 85, 86, 87, 88, 2, 2, 2, 2, 89, 90, 91, 92, - 93, 94, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 95, 4, 4, 4, 96, 97, 4, 4, 4, 4, 4, 98, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 99, 2, 100, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 101, 102, 103, 4, 4, 4, 4, 4, 4, 4, 4, 4, 104, 105, 106, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 107, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, - 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 108, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 109, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, - 110, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 - ], - r6: &[ - 0xb7ffff7fffffefff, 0x000000003fff3fff, 0xffffffffffffffff, 0x07ffffffffffffff, - 0x0000000000000000, 0x001fffffffffffff, 0xffffffff1fffffff, 0x000000000001ffff, - 0xffffe000ffffffff, 0x07ffffffffff07ff, 0xffffffff3fffffff, 0x00000000003eff0f, - 0xffff00003fffffff, 0x0fffffffff0fffff, 0xffff00ffffffffff, 0x0000000fffffffff, - 0x007fffffffffffff, 0x000000ff003fffff, 0x91bffffffffffd3f, 0x007fffff003fffff, - 0x000000007fffffff, 0x0037ffff00000000, 0x03ffffff003fffff, 0xc0ffffffffffffff, - 0x003ffffffeeff06f, 0x1fffffff00000000, 0x000000001fffffff, 0x0000001ffffffeff, - 0x003fffffffffffff, 0x0007ffff003fffff, 0x000000000003ffff, 0x00000000000001ff, - 0x0007ffffffffffff, 0x000000ffffffffff, 0xffff00801fffffff, 0x000000000000003f, - 0x007fffff00000000, 0x01fffffffffffffc, 0x000001ffffff0000, 0x0047ffffffff0070, - 0x000000001400001e, 0x409ffffffffbffff, 0xffff01ffbfffbd7f, 0x000001ffffffffff, - 0xe3edfdfffff99fef, 0x0000000fe081199f, 0x00000000800007bb, 0x00000000000000b3, - 0x7f3fffffffffffff, 0x000000003f000000, 0x7fffffffffffffff, 0x0000000000000011, - 0x013fffffffffffff, 0x000007ffe7ffffff, 0x01ffffffffffffff, 0xffffffff00000000, - 0x80000000ffffffff, 0xfffffcff00000000, 0x0000001afcffffff, 0x7fe7ffffffffffff, - 0xffffffffffff0000, 0x0000000020ffffff, 0x7f7ffffffffffdff, 0xfffc000000000001, - 0x007ffefffffcffff, 0xb47ffffffffffb7f, 0xfffffdbf000000cb, 0x00000000017b7fff, - 0x0000000003ffffff, 0x00007fffffffffff, 0x000000000000000f, 0x000000000000007f, - 0x00003fffffff0000, 0x0000ffffffffffff, 0xe0fffff80000000f, 0x000000000000ffff, - 0xffffffffffff87ff, 0x00000000ffff80ff, 0x0000000b00000000, 0x00ffffffffffffff, - 0xffff00f000070000, 0x0fffffffffffffff, 0x1fff07ffffffffff, 0x0000000043ff01ff, - 0xffffffffffdfffff, 0xebffde64dfffffff, 0xffffffffffffffef, 0x7bffffffdfdfe7bf, - 0xfffffffffffdfc5f, 0xffffff3fffffffff, 0xf7fffffff7fffffd, 0xffdfffffffdfffff, - 0xffff7fffffff7fff, 0xfffffdfffffffdff, 0x0000000000000ff7, 0x000007dbf9ffff7f, - 0x3f801fffffffffff, 0x0000000000004000, 0x00000fffffffffff, 0x000000000000001f, - 0x000000000000088f, 0x0af7fe96ffffffef, 0x5ef7f796aa96ea84, 0x0ffffbee0ffffbff, - 0xffff000000000000, 0xffff03ffffff03ff, 0x00000000000003ff, 0x00000000007fffff, - 0xffff0003ffffffff, 0x00000001ffffffff, 0x000000003fffffff - ], - }; - - pub fn Alphabetic(c: char) -> bool { - Alphabetic_table.lookup(c) - } - - #[rustfmt::skip] - const Case_Ignorable_table: &super::BoolTrie = &super::BoolTrie { - r1: [ - 0x0400408000000000, 0x0000000140000000, 0x0190a10000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0xffff000000000000, 0xffffffffffffffff, - 0xffffffffffffffff, 0x0430ffffffffffff, 0x00000000000000b0, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x00000000000003f8, 0x0000000000000000, - 0x0000000000000000, 0x0000000002000000, 0xbffffffffffe0000, 0x00100000000000b6, - 0x0000000017ff003f, 0x00010000fffff801, 0x0000000000000000, 0x00003dffbfc00000, - 0xffff000000028000, 0x00000000000007ff, 0x0001ffc000000000, 0x243ff80000000000 - ], - r2: [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 10, 11, 12, 13, 14, 15, 16, 11, 17, 18, 19, 2, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 2, 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 34, 35, 36, 37, 38, 39, 40, 2, 41, 2, 2, 2, 42, 43, 44, 2, - 45, 46, 47, 48, 49, 50, 2, 51, 52, 53, 54, 55, 2, 2, 2, 2, 2, 2, 56, 57, 58, 59, 60, 61, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 62, 2, 63, 2, 64, 2, 65, 66, 2, 2, 2, 2, - 2, 2, 2, 67, 2, 68, 69, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 70, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 50, 2, 2, 2, 2, 71, 72, 73, 74, 75, 76, 77, 78, 79, 2, 2, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 2, 89, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 91, 2, 92, 93, 2, 2, 2, 2, 2, 2, 2, 2, 94, 95, 2, 96, - 97, 98, 99, 100 - ], - r3: &[ - 0x00003fffffc00000, 0x000000000e000000, 0x0000000000000000, 0xfffffffffff80000, - 0x1400000000000007, 0x0002000c00fe21fe, 0x1000000000000002, 0x4000000c0000201e, - 0x1000000000000006, 0x0023000000023986, 0xfc00000c000021be, 0x9000000000000002, - 0x0000000c0040201e, 0x0000000000000004, 0x0000000000002001, 0xc000000000000011, - 0x0000000c00603dc1, 0x0000000c00003040, 0x1800000000000003, 0x0000000c0000201e, - 0x00000000005c0400, 0x07f2000000000000, 0x0000000000007fc0, 0x1ff2000000000000, - 0x0000000000003f40, 0x02a0000003000000, 0x7ffe000000000000, 0x1ffffffffeffe0df, - 0x0000000000000040, 0x66fde00000000000, 0x001e0001c3000000, 0x0000000020002064, - 0x1000000000000000, 0x00000000e0000000, 0x001c0000001c0000, 0x000c0000000c0000, - 0x3fb0000000000000, 0x00000000208ffe40, 0x0000000000007800, 0x0000000000000008, - 0x0000020000000060, 0x0e04018700000000, 0x0000000009800000, 0x9ff81fe57f400000, - 0x7fff008000000000, 0x17d000000000000f, 0x000ff80000000004, 0x00003b3c00000003, - 0x0003a34000000000, 0x00cff00000000000, 0x3f00000000000000, 0x031021fdfff70000, - 0xfffff00000000000, 0x010007ffffffffff, 0xfffffffff8000000, 0xfbffffffffffffff, - 0xa000000000000000, 0x6000e000e000e003, 0x00007c900300f800, 0x8002ffdf00000000, - 0x000000001fff0000, 0x0001ffffffff0000, 0x3000000000000000, 0x0003800000000000, - 0x8000800000000000, 0xffffffff00000000, 0x0000800000000000, 0x083e3c0000000020, - 0x000000007e000000, 0x7000000000000000, 0x0000000000200000, 0x0000000000001000, - 0xbff7800000000000, 0x00000000f0000000, 0x0003000000000000, 0x00000003ffffffff, - 0x0001000000000000, 0x0000000000000700, 0x0300000000000000, 0x0000006000000844, - 0x8003ffff00000030, 0x00003fc000000000, 0x000000000003ff80, 0x33c8000000000007, - 0x0000006000008000, 0x00667e0000000000, 0x1001000000001008, 0xc19d000000000000, - 0x0058300020000002, 0x00000000f8000000, 0x0000212000000000, 0x0000000040000000, - 0xfffc000000000000, 0x0000000000000003, 0x0000ffff0008ffff, 0x0000000000240000, - 0x8000000000000000, 0x4000000004004080, 0x0001000000000001, 0x00000000c0000000, - 0x0e00000800000000 - ], - r4: [ - 0, 1, 2, 3, 2, 2, 4, 2, 2, 2, 2, 5, 2, 6, 7, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 - ], - r5: &[ - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 17, 18, 19, 0, 0, 20, 21, 22, - 23, 0, 0, 24, 25, 26, 27, 28, 0, 29, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 31, 32, 33, 34, 0, - 0, 0, 0, 0, 35, 0, 36, 0, 37, 38, 39, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 44, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, - 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 52, 53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, - 0, 0, 56, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 58, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 62, 62, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ], - r6: &[ - 0x0000000000000000, 0x2000000000000000, 0x0000000100000000, 0x07c0000000000000, - 0x870000000000f06e, 0x0000006000000000, 0x000000f000000000, 0x000000000001ffc0, - 0xff00000000000002, 0x800000000000007f, 0x2678000000000003, 0x0000000000002000, - 0x001fef8000000007, 0x0008000000000000, 0x7fc0000000000003, 0x0000000000001e00, - 0x40d3800000000000, 0x000007f880000000, 0x1800000000000003, 0x001f1fc000000001, - 0xff00000000000000, 0x000000004000005c, 0x85f8000000000000, 0x000000000000000d, - 0xb03c000000000000, 0x0000000030000001, 0xa7f8000000000000, 0x0000000000000001, - 0x00bf280000000000, 0x00000fbce0000000, 0x06ff800000000000, 0x000000010cf00000, - 0x79f80000000007fe, 0x000000000e7e0080, 0x00000000037ffc00, 0xbf7f000000000000, - 0x006dfcfffffc0000, 0xb47e000000000000, 0x00000000000000bf, 0x0000000000a30000, - 0x0018000000000000, 0x01ff000000000000, 0x001f000000000000, 0x007f000000000000, - 0x000000000000000f, 0x0000000000008000, 0x00000000ffff8000, 0x0000000b00000000, - 0x0000000f60000000, 0xfff8038000000000, 0x00003c0000000fe7, 0x000000000000001c, - 0xf87fffffffffffff, 0x00201fffffffffff, 0x0000fffef8000010, 0x000007dbf9ffff7f, - 0x3fff000000000000, 0x0000f00000000000, 0x00000000007f0000, 0x0000000000000ff0, - 0xf800000000000000, 0xffffffff00000002, 0xffffffffffffffff, 0x0000ffffffffffff - ], - }; - - pub fn Case_Ignorable(c: char) -> bool { - Case_Ignorable_table.lookup(c) - } - - #[rustfmt::skip] - const Cased_table: &super::BoolTrie = &super::BoolTrie { - r1: [ - 0x0000000000000000, 0x07fffffe07fffffe, 0x0420040000000000, 0xff7fffffff7fffff, - 0xffffffffffffffff, 0xffffffffffffffff, 0xf7ffffffffffffff, 0xfffffffffffffff0, - 0xffffffffffffffff, 0xffffffffffffffff, 0x01ffffffffefffff, 0x0000001f00000003, - 0x0000000000000000, 0xbccf000000000020, 0xfffffffbffffd740, 0xffbfffffffffffff, - 0xffffffffffffffff, 0xffffffffffffffff, 0xfffffffffffffc03, 0xffffffffffffffff, - 0xfffeffffffffffff, 0xffffffff007fffff, 0x00000000000001ff, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 - ], - r2: [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 5, 5, - 0, 5, 5, 5, 5, 6, 7, 8, 9, 0, 10, 11, 0, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 18, 5, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 22, - 0, 23, 5, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 29, 30, 0, 0 - ], - r3: &[ - 0x0000000000000000, 0xffffffff00000000, 0xe7ffffffffff20bf, 0x3f3fffffffffffff, - 0xe7ffffffffff01ff, 0xffffffffffffffff, 0xffffffff3f3fffff, 0x3fffffffaaff3f3f, - 0x5fdfffffffffffff, 0x1fdc1fff0fcf1fdc, 0x8002000000000000, 0x000000001fff0000, - 0xf21fbd503e2ffc84, 0xffffffff000043e0, 0x0000000000000018, 0xffc0000000000000, - 0x000003ffffffffff, 0xffff7fffffffffff, 0xffffffff7fffffff, 0x000c781fffffffff, - 0x000020bfffffffff, 0x00003fffffffffff, 0x000000003fffffff, 0xfffffffc00000000, - 0xffffffffffff78ff, 0x070000000000007c, 0xffff000000000000, 0xffff00fff7ffffff, - 0x0000000000f8007f, 0x07fffffe00000000, 0x0000000007fffffe - ], - r4: [ - 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 - ], - r5: &[ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 9, 10, 11, 12, 1, 1, 1, 1, 13, 14, 15, 16, 17, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ], - r6: &[ - 0x0000000000000000, 0xffffffffffffffff, 0x000000000000ffff, 0xffff000000000000, - 0x0fffffffff0fffff, 0x0007ffffffffffff, 0xffffffff00000000, 0x00000000ffffffff, - 0xffffffffffdfffff, 0xebffde64dfffffff, 0xffffffffffffffef, 0x7bffffffdfdfe7bf, - 0xfffffffffffdfc5f, 0xffffff3fffffffff, 0xf7fffffff7fffffd, 0xffdfffffffdfffff, - 0xffff7fffffff7fff, 0xfffffdfffffffdff, 0x0000000000000ff7, 0x000000000000000f, - 0xffff03ffffff03ff, 0x00000000000003ff - ], - }; - - pub fn Cased(c: char) -> bool { - Cased_table.lookup(c) - } - - #[rustfmt::skip] - const Grapheme_Extend_table: &super::BoolTrie = &super::BoolTrie { - r1: [ - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0xffffffffffffffff, 0x0000ffffffffffff, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x00000000000003f8, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0xbffffffffffe0000, 0x00000000000000b6, - 0x0000000007ff0000, 0x00010000fffff800, 0x0000000000000000, 0x00003d9f9fc00000, - 0xffff000000020000, 0x00000000000007ff, 0x0001ffc000000000, 0x200ff80000000000 - ], - r2: [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 2, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 34, 35, 36, 37, 38, 2, 39, 2, 40, 2, 2, 2, 41, 42, 43, 2, 44, - 45, 46, 47, 48, 2, 2, 49, 2, 2, 2, 50, 2, 2, 2, 2, 2, 2, 2, 2, 51, 2, 2, 52, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 53, 2, 54, 2, 55, 2, 2, 2, 2, 2, 2, 2, 2, 56, - 2, 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 58, 59, 60, 2, 2, 2, 2, 61, 2, 2, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 2, 2, 2, 71, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 72, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 73, 2, 2, 2, 2, 2, 59, 2 - ], - r3: &[ - 0x00003eeffbc00000, 0x000000000e000000, 0x0000000000000000, 0xfffffffbfff80000, - 0x1400000000000007, 0x0000000c00fe21fe, 0x5000000000000002, 0x4000000c0080201e, - 0x1000000000000006, 0x0023000000023986, 0xfc00000c000021be, 0xd000000000000002, - 0x0000000c00c0201e, 0x4000000000000004, 0x0000000000802001, 0xc000000000000011, - 0x0000000c00603dc1, 0x9000000000000002, 0x0000000c00603044, 0x5800000000000003, - 0x0000000c0080201e, 0x00000000805c8400, 0x07f2000000000000, 0x0000000000007f80, - 0x1ff2000000000000, 0x0000000000003f00, 0x02a0000003000000, 0x7ffe000000000000, - 0x1ffffffffeffe0df, 0x0000000000000040, 0x66fde00000000000, 0x001e0001c3000000, - 0x0000000020002064, 0x00000000e0000000, 0x001c0000001c0000, 0x000c0000000c0000, - 0x3fb0000000000000, 0x00000000200ffe40, 0x0000000000003800, 0x0000020000000060, - 0x0e04018700000000, 0x0000000009800000, 0x9ff81fe57f400000, 0x7fff000000000000, - 0x17f000000000000f, 0x000ff80000000004, 0x00003b3c00000003, 0x0003a34000000000, - 0x00cff00000000000, 0x031021fdfff70000, 0xfbffffffffffffff, 0x0000000000001000, - 0x0001ffffffff0000, 0x0003800000000000, 0x8000000000000000, 0xffffffff00000000, - 0x0000fc0000000000, 0x0000000006000000, 0x3ff7800000000000, 0x00000000c0000000, - 0x0003000000000000, 0x0000006000000844, 0x8003ffff00000030, 0x00003fc000000000, - 0x000000000003ff80, 0x33c8000000000007, 0x0000002000000000, 0x00667e0000000000, - 0x1000000000001008, 0xc19d000000000000, 0x0040300000000002, 0x0000212000000000, - 0x0000000040000000, 0x0000ffff0000ffff - ], - r4: [ - 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 4, 2, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 - ], - r5: &[ - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 8, 9, 10, 0, 11, 12, 13, 14, 15, 0, 0, 16, 17, 18, 0, 0, 19, 20, 21, - 22, 0, 0, 23, 24, 25, 26, 27, 0, 28, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 0, - 0, 0, 0, 0, 34, 0, 35, 0, 36, 37, 38, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 46, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 50, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 41, 0, 0, 0, 0, 0, - 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 54, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, - 0, 56, 56, 56, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 - ], - r6: &[ - 0x0000000000000000, 0x2000000000000000, 0x0000000100000000, 0x07c0000000000000, - 0x870000000000f06e, 0x0000006000000000, 0x000000f000000000, 0x000000000001ffc0, - 0xff00000000000002, 0x800000000000007f, 0x0678000000000003, 0x001fef8000000007, - 0x0008000000000000, 0x7fc0000000000003, 0x0000000000001e00, 0x40d3800000000000, - 0x000007f880000000, 0x5800000000000003, 0x001f1fc000800001, 0xff00000000000000, - 0x000000004000005c, 0xa5f9000000000000, 0x000000000000000d, 0xb03c800000000000, - 0x0000000030000001, 0xa7f8000000000000, 0x0000000000000001, 0x00bf280000000000, - 0x00000fbce0000000, 0x06ff800000000000, 0x000000010cf00000, 0x79f80000000007fe, - 0x000000000e7e0080, 0x00000000037ffc00, 0xbf7f000000000000, 0x006dfcfffffc0000, - 0xb47e000000000000, 0x00000000000000bf, 0x0000000000a30000, 0x0018000000000000, - 0x001f000000000000, 0x007f000000000000, 0x0000000000008000, 0x0000000000078000, - 0x0000000060000000, 0xf807c3a000000000, 0x00003c0000000fe7, 0x000000000000001c, - 0xf87fffffffffffff, 0x00201fffffffffff, 0x0000fffef8000010, 0x000007dbf9ffff7f, - 0x0000f00000000000, 0x00000000007f0000, 0x00000000000007f0, 0xffffffff00000000, - 0xffffffffffffffff, 0x0000ffffffffffff - ], - }; - - pub fn Grapheme_Extend(c: char) -> bool { - Grapheme_Extend_table.lookup(c) - } - - #[rustfmt::skip] - const Lowercase_table: &super::BoolTrie = &super::BoolTrie { - r1: [ - 0x0000000000000000, 0x07fffffe00000000, 0x0420040000000000, 0xff7fffff80000000, - 0x55aaaaaaaaaaaaaa, 0xd4aaaaaaaaaaab55, 0xe6512d2a4e243129, 0xaa29aaaab5555240, - 0x93faaaaaaaaaaaaa, 0xffffffffffffaa85, 0x01ffffffffefffff, 0x0000001f00000003, - 0x0000000000000000, 0x3c8a000000000020, 0xfffff00000010000, 0x192faaaaaae37fff, - 0xffff000000000000, 0xaaaaaaaaffffffff, 0xaaaaaaaaaaaaa802, 0xaaaaaaaaaaaad554, - 0x0000aaaaaaaaaaaa, 0xffffffff00000000, 0x00000000000001ff, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 - ], - r2: [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 4, 4, - 0, 5, 5, 6, 5, 7, 8, 9, 10, 0, 11, 12, 0, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 18, 5, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 22, - 0, 23, 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 27, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0 - ], - r3: &[ - 0x0000000000000000, 0xe7ffffffffff0000, 0x3f00000000000000, 0x00000000000001ff, - 0xffffffffffffffff, 0xaaaaaaaaaaaaaaaa, 0xaaaaaaaabfeaaaaa, 0x00ff00ff003f00ff, - 0x3fff00ff00ff003f, 0x40df00ff00ff00ff, 0x00dc00ff00cf00dc, 0x8002000000000000, - 0x000000001fff0000, 0x321080000008c400, 0xffff0000000043c0, 0x0000000000000010, - 0x000003ffffff0000, 0xffff000000000000, 0x3fda15627fffffff, 0x0008501aaaaaaaaa, - 0x000020bfffffffff, 0x00002aaaaaaaaaaa, 0x000000003aaaaaaa, 0xaaabaaa800000000, - 0x95ffaaaaaaaaaaaa, 0xaaa082aaaaba50aa, 0x0700000000000008, 0xffff00fff7ffffff, - 0x0000000000f8007f, 0x0000000007fffffe - ], - r4: [ - 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 - ], - r5: &[ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ], - r6: &[ - 0x0000000000000000, 0xffffff0000000000, 0x000000000000ffff, 0x0fffffffff000000, - 0x0007ffffffffffff, 0x00000000ffffffff, 0xffffffff00000000, 0x000ffffffc000000, - 0x000000ffffdfc000, 0xebc000000ffffffc, 0xfffffc000000ffef, 0x00ffffffc000000f, - 0x00000ffffffc0000, 0xfc000000ffffffc0, 0xffffc000000fffff, 0x0ffffffc000000ff, - 0x0000ffffffc00000, 0x0000003ffffffc00, 0xf0000003f7fffffc, 0xffc000000fdfffff, - 0xffff0000003f7fff, 0xfffffc000000fdff, 0x0000000000000bf7, 0xfffffffc00000000, - 0x000000000000000f - ], - }; - - pub fn Lowercase(c: char) -> bool { - Lowercase_table.lookup(c) - } - - #[rustfmt::skip] - const Uppercase_table: &super::BoolTrie = &super::BoolTrie { - r1: [ - 0x0000000000000000, 0x0000000007fffffe, 0x0000000000000000, 0x000000007f7fffff, - 0xaa55555555555555, 0x2b555555555554aa, 0x11aed2d5b1dbced6, 0x55d255554aaaa490, - 0x6c05555555555555, 0x000000000000557a, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x8045000000000000, 0x00000ffbfffed740, 0xe6905555551c8000, - 0x0000ffffffffffff, 0x5555555500000000, 0x5555555555555401, 0x5555555555552aab, - 0xfffe555555555555, 0x00000000007fffff, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, - 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 - ], - r2: [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, - 0, 5, 5, 6, 5, 7, 8, 9, 10, 0, 0, 0, 0, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 17, 5, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 0, - 21, 22, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, 0 - ], - r3: &[ - 0x0000000000000000, 0xffffffff00000000, 0x00000000000020bf, 0x003fffffffffffff, - 0xe7ffffffffff0000, 0x5555555555555555, 0x5555555540155555, 0xff00ff003f00ff00, - 0x0000ff00aa003f00, 0x0f00000000000000, 0x0f001f000f000f00, 0xc00f3d503e273884, - 0x0000ffff00000020, 0x0000000000000008, 0xffc0000000000000, 0x000000000000ffff, - 0x00007fffffffffff, 0xc025ea9d00000000, 0x0004280555555555, 0x0000155555555555, - 0x0000000005555555, 0x5554555400000000, 0x6a00555555555555, 0x555f7d5555452855, - 0x0000000000000074, 0x07fffffe00000000 - ], - r4: [ - 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 - ], - r5: &[ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ], - r6: &[ - 0x0000000000000000, 0x000000ffffffffff, 0xffff000000000000, 0x00000000000fffff, - 0x0007ffffffffffff, 0xffffffff00000000, 0x00000000ffffffff, 0xfff0000003ffffff, - 0xffffff0000003fff, 0x003fde64d0000003, 0x000003ffffff0000, 0x7b0000001fdfe7b0, - 0xfffff0000001fc5f, 0x03ffffff0000003f, 0x00003ffffff00000, 0xf0000003ffffff00, - 0xffff0000003fffff, 0xffffff00000003ff, 0x07fffffc00000001, 0x001ffffff0000000, - 0x00007fffffc00000, 0x000001ffffff0000, 0x0000000000000400, 0x00000003ffffffff, - 0xffff03ffffff03ff, 0x00000000000003ff - ], - }; - - pub fn Uppercase(c: char) -> bool { - Uppercase_table.lookup(c) - } -} - -pub(crate) mod property { - #[rustfmt::skip] - const White_Space_table: &super::SmallBoolTrie = &super::SmallBoolTrie { - r1: &[ - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 - ], - r2: &[ - 0x0000000100003e00, 0x0000000000000000, 0x0000000100000020, 0x0000000000000001, - 0x00008300000007ff, 0x0000000080000000 - ], - }; - - pub fn White_Space(c: char) -> bool { - White_Space_table.lookup(c) - } -} - -pub(crate) mod conversions { - pub fn to_lower(c: char) -> [char; 3] { - match bsearch_case_table(c, to_lowercase_table) { - None => [c, '\0', '\0'], - Some(index) => to_lowercase_table[index].1, - } - } - - pub fn to_upper(c: char) -> [char; 3] { - match bsearch_case_table(c, to_uppercase_table) { - None => [c, '\0', '\0'], - Some(index) => to_uppercase_table[index].1, - } - } - - fn bsearch_case_table(c: char, table: &[(char, [char; 3])]) -> Option { - table.binary_search_by(|&(key, _)| key.cmp(&c)).ok() - } - - #[rustfmt::skip] - const to_lowercase_table: &[(char, [char; 3])] = &[ - ('\u{41}', ['\u{61}', '\0', '\0']), ('\u{42}', ['\u{62}', '\0', '\0']), ('\u{43}', - ['\u{63}', '\0', '\0']), ('\u{44}', ['\u{64}', '\0', '\0']), ('\u{45}', ['\u{65}', '\0', - '\0']), ('\u{46}', ['\u{66}', '\0', '\0']), ('\u{47}', ['\u{67}', '\0', '\0']), ('\u{48}', - ['\u{68}', '\0', '\0']), ('\u{49}', ['\u{69}', '\0', '\0']), ('\u{4a}', ['\u{6a}', '\0', - '\0']), ('\u{4b}', ['\u{6b}', '\0', '\0']), ('\u{4c}', ['\u{6c}', '\0', '\0']), ('\u{4d}', - ['\u{6d}', '\0', '\0']), ('\u{4e}', ['\u{6e}', '\0', '\0']), ('\u{4f}', ['\u{6f}', '\0', - '\0']), ('\u{50}', ['\u{70}', '\0', '\0']), ('\u{51}', ['\u{71}', '\0', '\0']), ('\u{52}', - ['\u{72}', '\0', '\0']), ('\u{53}', ['\u{73}', '\0', '\0']), ('\u{54}', ['\u{74}', '\0', - '\0']), ('\u{55}', ['\u{75}', '\0', '\0']), ('\u{56}', ['\u{76}', '\0', '\0']), ('\u{57}', - ['\u{77}', '\0', '\0']), ('\u{58}', ['\u{78}', '\0', '\0']), ('\u{59}', ['\u{79}', '\0', - '\0']), ('\u{5a}', ['\u{7a}', '\0', '\0']), ('\u{c0}', ['\u{e0}', '\0', '\0']), ('\u{c1}', - ['\u{e1}', '\0', '\0']), ('\u{c2}', ['\u{e2}', '\0', '\0']), ('\u{c3}', ['\u{e3}', '\0', - '\0']), ('\u{c4}', ['\u{e4}', '\0', '\0']), ('\u{c5}', ['\u{e5}', '\0', '\0']), ('\u{c6}', - ['\u{e6}', '\0', '\0']), ('\u{c7}', ['\u{e7}', '\0', '\0']), ('\u{c8}', ['\u{e8}', '\0', - '\0']), ('\u{c9}', ['\u{e9}', '\0', '\0']), ('\u{ca}', ['\u{ea}', '\0', '\0']), ('\u{cb}', - ['\u{eb}', '\0', '\0']), ('\u{cc}', ['\u{ec}', '\0', '\0']), ('\u{cd}', ['\u{ed}', '\0', - '\0']), ('\u{ce}', ['\u{ee}', '\0', '\0']), ('\u{cf}', ['\u{ef}', '\0', '\0']), ('\u{d0}', - ['\u{f0}', '\0', '\0']), ('\u{d1}', ['\u{f1}', '\0', '\0']), ('\u{d2}', ['\u{f2}', '\0', - '\0']), ('\u{d3}', ['\u{f3}', '\0', '\0']), ('\u{d4}', ['\u{f4}', '\0', '\0']), ('\u{d5}', - ['\u{f5}', '\0', '\0']), ('\u{d6}', ['\u{f6}', '\0', '\0']), ('\u{d8}', ['\u{f8}', '\0', - '\0']), ('\u{d9}', ['\u{f9}', '\0', '\0']), ('\u{da}', ['\u{fa}', '\0', '\0']), ('\u{db}', - ['\u{fb}', '\0', '\0']), ('\u{dc}', ['\u{fc}', '\0', '\0']), ('\u{dd}', ['\u{fd}', '\0', - '\0']), ('\u{de}', ['\u{fe}', '\0', '\0']), ('\u{100}', ['\u{101}', '\0', '\0']), - ('\u{102}', ['\u{103}', '\0', '\0']), ('\u{104}', ['\u{105}', '\0', '\0']), ('\u{106}', - ['\u{107}', '\0', '\0']), ('\u{108}', ['\u{109}', '\0', '\0']), ('\u{10a}', ['\u{10b}', - '\0', '\0']), ('\u{10c}', ['\u{10d}', '\0', '\0']), ('\u{10e}', ['\u{10f}', '\0', '\0']), - ('\u{110}', ['\u{111}', '\0', '\0']), ('\u{112}', ['\u{113}', '\0', '\0']), ('\u{114}', - ['\u{115}', '\0', '\0']), ('\u{116}', ['\u{117}', '\0', '\0']), ('\u{118}', ['\u{119}', - '\0', '\0']), ('\u{11a}', ['\u{11b}', '\0', '\0']), ('\u{11c}', ['\u{11d}', '\0', '\0']), - ('\u{11e}', ['\u{11f}', '\0', '\0']), ('\u{120}', ['\u{121}', '\0', '\0']), ('\u{122}', - ['\u{123}', '\0', '\0']), ('\u{124}', ['\u{125}', '\0', '\0']), ('\u{126}', ['\u{127}', - '\0', '\0']), ('\u{128}', ['\u{129}', '\0', '\0']), ('\u{12a}', ['\u{12b}', '\0', '\0']), - ('\u{12c}', ['\u{12d}', '\0', '\0']), ('\u{12e}', ['\u{12f}', '\0', '\0']), ('\u{130}', - ['\u{69}', '\u{307}', '\0']), ('\u{132}', ['\u{133}', '\0', '\0']), ('\u{134}', ['\u{135}', - '\0', '\0']), ('\u{136}', ['\u{137}', '\0', '\0']), ('\u{139}', ['\u{13a}', '\0', '\0']), - ('\u{13b}', ['\u{13c}', '\0', '\0']), ('\u{13d}', ['\u{13e}', '\0', '\0']), ('\u{13f}', - ['\u{140}', '\0', '\0']), ('\u{141}', ['\u{142}', '\0', '\0']), ('\u{143}', ['\u{144}', - '\0', '\0']), ('\u{145}', ['\u{146}', '\0', '\0']), ('\u{147}', ['\u{148}', '\0', '\0']), - ('\u{14a}', ['\u{14b}', '\0', '\0']), ('\u{14c}', ['\u{14d}', '\0', '\0']), ('\u{14e}', - ['\u{14f}', '\0', '\0']), ('\u{150}', ['\u{151}', '\0', '\0']), ('\u{152}', ['\u{153}', - '\0', '\0']), ('\u{154}', ['\u{155}', '\0', '\0']), ('\u{156}', ['\u{157}', '\0', '\0']), - ('\u{158}', ['\u{159}', '\0', '\0']), ('\u{15a}', ['\u{15b}', '\0', '\0']), ('\u{15c}', - ['\u{15d}', '\0', '\0']), ('\u{15e}', ['\u{15f}', '\0', '\0']), ('\u{160}', ['\u{161}', - '\0', '\0']), ('\u{162}', ['\u{163}', '\0', '\0']), ('\u{164}', ['\u{165}', '\0', '\0']), - ('\u{166}', ['\u{167}', '\0', '\0']), ('\u{168}', ['\u{169}', '\0', '\0']), ('\u{16a}', - ['\u{16b}', '\0', '\0']), ('\u{16c}', ['\u{16d}', '\0', '\0']), ('\u{16e}', ['\u{16f}', - '\0', '\0']), ('\u{170}', ['\u{171}', '\0', '\0']), ('\u{172}', ['\u{173}', '\0', '\0']), - ('\u{174}', ['\u{175}', '\0', '\0']), ('\u{176}', ['\u{177}', '\0', '\0']), ('\u{178}', - ['\u{ff}', '\0', '\0']), ('\u{179}', ['\u{17a}', '\0', '\0']), ('\u{17b}', ['\u{17c}', '\0', - '\0']), ('\u{17d}', ['\u{17e}', '\0', '\0']), ('\u{181}', ['\u{253}', '\0', '\0']), - ('\u{182}', ['\u{183}', '\0', '\0']), ('\u{184}', ['\u{185}', '\0', '\0']), ('\u{186}', - ['\u{254}', '\0', '\0']), ('\u{187}', ['\u{188}', '\0', '\0']), ('\u{189}', ['\u{256}', - '\0', '\0']), ('\u{18a}', ['\u{257}', '\0', '\0']), ('\u{18b}', ['\u{18c}', '\0', '\0']), - ('\u{18e}', ['\u{1dd}', '\0', '\0']), ('\u{18f}', ['\u{259}', '\0', '\0']), ('\u{190}', - ['\u{25b}', '\0', '\0']), ('\u{191}', ['\u{192}', '\0', '\0']), ('\u{193}', ['\u{260}', - '\0', '\0']), ('\u{194}', ['\u{263}', '\0', '\0']), ('\u{196}', ['\u{269}', '\0', '\0']), - ('\u{197}', ['\u{268}', '\0', '\0']), ('\u{198}', ['\u{199}', '\0', '\0']), ('\u{19c}', - ['\u{26f}', '\0', '\0']), ('\u{19d}', ['\u{272}', '\0', '\0']), ('\u{19f}', ['\u{275}', - '\0', '\0']), ('\u{1a0}', ['\u{1a1}', '\0', '\0']), ('\u{1a2}', ['\u{1a3}', '\0', '\0']), - ('\u{1a4}', ['\u{1a5}', '\0', '\0']), ('\u{1a6}', ['\u{280}', '\0', '\0']), ('\u{1a7}', - ['\u{1a8}', '\0', '\0']), ('\u{1a9}', ['\u{283}', '\0', '\0']), ('\u{1ac}', ['\u{1ad}', - '\0', '\0']), ('\u{1ae}', ['\u{288}', '\0', '\0']), ('\u{1af}', ['\u{1b0}', '\0', '\0']), - ('\u{1b1}', ['\u{28a}', '\0', '\0']), ('\u{1b2}', ['\u{28b}', '\0', '\0']), ('\u{1b3}', - ['\u{1b4}', '\0', '\0']), ('\u{1b5}', ['\u{1b6}', '\0', '\0']), ('\u{1b7}', ['\u{292}', - '\0', '\0']), ('\u{1b8}', ['\u{1b9}', '\0', '\0']), ('\u{1bc}', ['\u{1bd}', '\0', '\0']), - ('\u{1c4}', ['\u{1c6}', '\0', '\0']), ('\u{1c5}', ['\u{1c6}', '\0', '\0']), ('\u{1c7}', - ['\u{1c9}', '\0', '\0']), ('\u{1c8}', ['\u{1c9}', '\0', '\0']), ('\u{1ca}', ['\u{1cc}', - '\0', '\0']), ('\u{1cb}', ['\u{1cc}', '\0', '\0']), ('\u{1cd}', ['\u{1ce}', '\0', '\0']), - ('\u{1cf}', ['\u{1d0}', '\0', '\0']), ('\u{1d1}', ['\u{1d2}', '\0', '\0']), ('\u{1d3}', - ['\u{1d4}', '\0', '\0']), ('\u{1d5}', ['\u{1d6}', '\0', '\0']), ('\u{1d7}', ['\u{1d8}', - '\0', '\0']), ('\u{1d9}', ['\u{1da}', '\0', '\0']), ('\u{1db}', ['\u{1dc}', '\0', '\0']), - ('\u{1de}', ['\u{1df}', '\0', '\0']), ('\u{1e0}', ['\u{1e1}', '\0', '\0']), ('\u{1e2}', - ['\u{1e3}', '\0', '\0']), ('\u{1e4}', ['\u{1e5}', '\0', '\0']), ('\u{1e6}', ['\u{1e7}', - '\0', '\0']), ('\u{1e8}', ['\u{1e9}', '\0', '\0']), ('\u{1ea}', ['\u{1eb}', '\0', '\0']), - ('\u{1ec}', ['\u{1ed}', '\0', '\0']), ('\u{1ee}', ['\u{1ef}', '\0', '\0']), ('\u{1f1}', - ['\u{1f3}', '\0', '\0']), ('\u{1f2}', ['\u{1f3}', '\0', '\0']), ('\u{1f4}', ['\u{1f5}', - '\0', '\0']), ('\u{1f6}', ['\u{195}', '\0', '\0']), ('\u{1f7}', ['\u{1bf}', '\0', '\0']), - ('\u{1f8}', ['\u{1f9}', '\0', '\0']), ('\u{1fa}', ['\u{1fb}', '\0', '\0']), ('\u{1fc}', - ['\u{1fd}', '\0', '\0']), ('\u{1fe}', ['\u{1ff}', '\0', '\0']), ('\u{200}', ['\u{201}', - '\0', '\0']), ('\u{202}', ['\u{203}', '\0', '\0']), ('\u{204}', ['\u{205}', '\0', '\0']), - ('\u{206}', ['\u{207}', '\0', '\0']), ('\u{208}', ['\u{209}', '\0', '\0']), ('\u{20a}', - ['\u{20b}', '\0', '\0']), ('\u{20c}', ['\u{20d}', '\0', '\0']), ('\u{20e}', ['\u{20f}', - '\0', '\0']), ('\u{210}', ['\u{211}', '\0', '\0']), ('\u{212}', ['\u{213}', '\0', '\0']), - ('\u{214}', ['\u{215}', '\0', '\0']), ('\u{216}', ['\u{217}', '\0', '\0']), ('\u{218}', - ['\u{219}', '\0', '\0']), ('\u{21a}', ['\u{21b}', '\0', '\0']), ('\u{21c}', ['\u{21d}', - '\0', '\0']), ('\u{21e}', ['\u{21f}', '\0', '\0']), ('\u{220}', ['\u{19e}', '\0', '\0']), - ('\u{222}', ['\u{223}', '\0', '\0']), ('\u{224}', ['\u{225}', '\0', '\0']), ('\u{226}', - ['\u{227}', '\0', '\0']), ('\u{228}', ['\u{229}', '\0', '\0']), ('\u{22a}', ['\u{22b}', - '\0', '\0']), ('\u{22c}', ['\u{22d}', '\0', '\0']), ('\u{22e}', ['\u{22f}', '\0', '\0']), - ('\u{230}', ['\u{231}', '\0', '\0']), ('\u{232}', ['\u{233}', '\0', '\0']), ('\u{23a}', - ['\u{2c65}', '\0', '\0']), ('\u{23b}', ['\u{23c}', '\0', '\0']), ('\u{23d}', ['\u{19a}', - '\0', '\0']), ('\u{23e}', ['\u{2c66}', '\0', '\0']), ('\u{241}', ['\u{242}', '\0', '\0']), - ('\u{243}', ['\u{180}', '\0', '\0']), ('\u{244}', ['\u{289}', '\0', '\0']), ('\u{245}', - ['\u{28c}', '\0', '\0']), ('\u{246}', ['\u{247}', '\0', '\0']), ('\u{248}', ['\u{249}', - '\0', '\0']), ('\u{24a}', ['\u{24b}', '\0', '\0']), ('\u{24c}', ['\u{24d}', '\0', '\0']), - ('\u{24e}', ['\u{24f}', '\0', '\0']), ('\u{370}', ['\u{371}', '\0', '\0']), ('\u{372}', - ['\u{373}', '\0', '\0']), ('\u{376}', ['\u{377}', '\0', '\0']), ('\u{37f}', ['\u{3f3}', - '\0', '\0']), ('\u{386}', ['\u{3ac}', '\0', '\0']), ('\u{388}', ['\u{3ad}', '\0', '\0']), - ('\u{389}', ['\u{3ae}', '\0', '\0']), ('\u{38a}', ['\u{3af}', '\0', '\0']), ('\u{38c}', - ['\u{3cc}', '\0', '\0']), ('\u{38e}', ['\u{3cd}', '\0', '\0']), ('\u{38f}', ['\u{3ce}', - '\0', '\0']), ('\u{391}', ['\u{3b1}', '\0', '\0']), ('\u{392}', ['\u{3b2}', '\0', '\0']), - ('\u{393}', ['\u{3b3}', '\0', '\0']), ('\u{394}', ['\u{3b4}', '\0', '\0']), ('\u{395}', - ['\u{3b5}', '\0', '\0']), ('\u{396}', ['\u{3b6}', '\0', '\0']), ('\u{397}', ['\u{3b7}', - '\0', '\0']), ('\u{398}', ['\u{3b8}', '\0', '\0']), ('\u{399}', ['\u{3b9}', '\0', '\0']), - ('\u{39a}', ['\u{3ba}', '\0', '\0']), ('\u{39b}', ['\u{3bb}', '\0', '\0']), ('\u{39c}', - ['\u{3bc}', '\0', '\0']), ('\u{39d}', ['\u{3bd}', '\0', '\0']), ('\u{39e}', ['\u{3be}', - '\0', '\0']), ('\u{39f}', ['\u{3bf}', '\0', '\0']), ('\u{3a0}', ['\u{3c0}', '\0', '\0']), - ('\u{3a1}', ['\u{3c1}', '\0', '\0']), ('\u{3a3}', ['\u{3c3}', '\0', '\0']), ('\u{3a4}', - ['\u{3c4}', '\0', '\0']), ('\u{3a5}', ['\u{3c5}', '\0', '\0']), ('\u{3a6}', ['\u{3c6}', - '\0', '\0']), ('\u{3a7}', ['\u{3c7}', '\0', '\0']), ('\u{3a8}', ['\u{3c8}', '\0', '\0']), - ('\u{3a9}', ['\u{3c9}', '\0', '\0']), ('\u{3aa}', ['\u{3ca}', '\0', '\0']), ('\u{3ab}', - ['\u{3cb}', '\0', '\0']), ('\u{3cf}', ['\u{3d7}', '\0', '\0']), ('\u{3d8}', ['\u{3d9}', - '\0', '\0']), ('\u{3da}', ['\u{3db}', '\0', '\0']), ('\u{3dc}', ['\u{3dd}', '\0', '\0']), - ('\u{3de}', ['\u{3df}', '\0', '\0']), ('\u{3e0}', ['\u{3e1}', '\0', '\0']), ('\u{3e2}', - ['\u{3e3}', '\0', '\0']), ('\u{3e4}', ['\u{3e5}', '\0', '\0']), ('\u{3e6}', ['\u{3e7}', - '\0', '\0']), ('\u{3e8}', ['\u{3e9}', '\0', '\0']), ('\u{3ea}', ['\u{3eb}', '\0', '\0']), - ('\u{3ec}', ['\u{3ed}', '\0', '\0']), ('\u{3ee}', ['\u{3ef}', '\0', '\0']), ('\u{3f4}', - ['\u{3b8}', '\0', '\0']), ('\u{3f7}', ['\u{3f8}', '\0', '\0']), ('\u{3f9}', ['\u{3f2}', - '\0', '\0']), ('\u{3fa}', ['\u{3fb}', '\0', '\0']), ('\u{3fd}', ['\u{37b}', '\0', '\0']), - ('\u{3fe}', ['\u{37c}', '\0', '\0']), ('\u{3ff}', ['\u{37d}', '\0', '\0']), ('\u{400}', - ['\u{450}', '\0', '\0']), ('\u{401}', ['\u{451}', '\0', '\0']), ('\u{402}', ['\u{452}', - '\0', '\0']), ('\u{403}', ['\u{453}', '\0', '\0']), ('\u{404}', ['\u{454}', '\0', '\0']), - ('\u{405}', ['\u{455}', '\0', '\0']), ('\u{406}', ['\u{456}', '\0', '\0']), ('\u{407}', - ['\u{457}', '\0', '\0']), ('\u{408}', ['\u{458}', '\0', '\0']), ('\u{409}', ['\u{459}', - '\0', '\0']), ('\u{40a}', ['\u{45a}', '\0', '\0']), ('\u{40b}', ['\u{45b}', '\0', '\0']), - ('\u{40c}', ['\u{45c}', '\0', '\0']), ('\u{40d}', ['\u{45d}', '\0', '\0']), ('\u{40e}', - ['\u{45e}', '\0', '\0']), ('\u{40f}', ['\u{45f}', '\0', '\0']), ('\u{410}', ['\u{430}', - '\0', '\0']), ('\u{411}', ['\u{431}', '\0', '\0']), ('\u{412}', ['\u{432}', '\0', '\0']), - ('\u{413}', ['\u{433}', '\0', '\0']), ('\u{414}', ['\u{434}', '\0', '\0']), ('\u{415}', - ['\u{435}', '\0', '\0']), ('\u{416}', ['\u{436}', '\0', '\0']), ('\u{417}', ['\u{437}', - '\0', '\0']), ('\u{418}', ['\u{438}', '\0', '\0']), ('\u{419}', ['\u{439}', '\0', '\0']), - ('\u{41a}', ['\u{43a}', '\0', '\0']), ('\u{41b}', ['\u{43b}', '\0', '\0']), ('\u{41c}', - ['\u{43c}', '\0', '\0']), ('\u{41d}', ['\u{43d}', '\0', '\0']), ('\u{41e}', ['\u{43e}', - '\0', '\0']), ('\u{41f}', ['\u{43f}', '\0', '\0']), ('\u{420}', ['\u{440}', '\0', '\0']), - ('\u{421}', ['\u{441}', '\0', '\0']), ('\u{422}', ['\u{442}', '\0', '\0']), ('\u{423}', - ['\u{443}', '\0', '\0']), ('\u{424}', ['\u{444}', '\0', '\0']), ('\u{425}', ['\u{445}', - '\0', '\0']), ('\u{426}', ['\u{446}', '\0', '\0']), ('\u{427}', ['\u{447}', '\0', '\0']), - ('\u{428}', ['\u{448}', '\0', '\0']), ('\u{429}', ['\u{449}', '\0', '\0']), ('\u{42a}', - ['\u{44a}', '\0', '\0']), ('\u{42b}', ['\u{44b}', '\0', '\0']), ('\u{42c}', ['\u{44c}', - '\0', '\0']), ('\u{42d}', ['\u{44d}', '\0', '\0']), ('\u{42e}', ['\u{44e}', '\0', '\0']), - ('\u{42f}', ['\u{44f}', '\0', '\0']), ('\u{460}', ['\u{461}', '\0', '\0']), ('\u{462}', - ['\u{463}', '\0', '\0']), ('\u{464}', ['\u{465}', '\0', '\0']), ('\u{466}', ['\u{467}', - '\0', '\0']), ('\u{468}', ['\u{469}', '\0', '\0']), ('\u{46a}', ['\u{46b}', '\0', '\0']), - ('\u{46c}', ['\u{46d}', '\0', '\0']), ('\u{46e}', ['\u{46f}', '\0', '\0']), ('\u{470}', - ['\u{471}', '\0', '\0']), ('\u{472}', ['\u{473}', '\0', '\0']), ('\u{474}', ['\u{475}', - '\0', '\0']), ('\u{476}', ['\u{477}', '\0', '\0']), ('\u{478}', ['\u{479}', '\0', '\0']), - ('\u{47a}', ['\u{47b}', '\0', '\0']), ('\u{47c}', ['\u{47d}', '\0', '\0']), ('\u{47e}', - ['\u{47f}', '\0', '\0']), ('\u{480}', ['\u{481}', '\0', '\0']), ('\u{48a}', ['\u{48b}', - '\0', '\0']), ('\u{48c}', ['\u{48d}', '\0', '\0']), ('\u{48e}', ['\u{48f}', '\0', '\0']), - ('\u{490}', ['\u{491}', '\0', '\0']), ('\u{492}', ['\u{493}', '\0', '\0']), ('\u{494}', - ['\u{495}', '\0', '\0']), ('\u{496}', ['\u{497}', '\0', '\0']), ('\u{498}', ['\u{499}', - '\0', '\0']), ('\u{49a}', ['\u{49b}', '\0', '\0']), ('\u{49c}', ['\u{49d}', '\0', '\0']), - ('\u{49e}', ['\u{49f}', '\0', '\0']), ('\u{4a0}', ['\u{4a1}', '\0', '\0']), ('\u{4a2}', - ['\u{4a3}', '\0', '\0']), ('\u{4a4}', ['\u{4a5}', '\0', '\0']), ('\u{4a6}', ['\u{4a7}', - '\0', '\0']), ('\u{4a8}', ['\u{4a9}', '\0', '\0']), ('\u{4aa}', ['\u{4ab}', '\0', '\0']), - ('\u{4ac}', ['\u{4ad}', '\0', '\0']), ('\u{4ae}', ['\u{4af}', '\0', '\0']), ('\u{4b0}', - ['\u{4b1}', '\0', '\0']), ('\u{4b2}', ['\u{4b3}', '\0', '\0']), ('\u{4b4}', ['\u{4b5}', - '\0', '\0']), ('\u{4b6}', ['\u{4b7}', '\0', '\0']), ('\u{4b8}', ['\u{4b9}', '\0', '\0']), - ('\u{4ba}', ['\u{4bb}', '\0', '\0']), ('\u{4bc}', ['\u{4bd}', '\0', '\0']), ('\u{4be}', - ['\u{4bf}', '\0', '\0']), ('\u{4c0}', ['\u{4cf}', '\0', '\0']), ('\u{4c1}', ['\u{4c2}', - '\0', '\0']), ('\u{4c3}', ['\u{4c4}', '\0', '\0']), ('\u{4c5}', ['\u{4c6}', '\0', '\0']), - ('\u{4c7}', ['\u{4c8}', '\0', '\0']), ('\u{4c9}', ['\u{4ca}', '\0', '\0']), ('\u{4cb}', - ['\u{4cc}', '\0', '\0']), ('\u{4cd}', ['\u{4ce}', '\0', '\0']), ('\u{4d0}', ['\u{4d1}', - '\0', '\0']), ('\u{4d2}', ['\u{4d3}', '\0', '\0']), ('\u{4d4}', ['\u{4d5}', '\0', '\0']), - ('\u{4d6}', ['\u{4d7}', '\0', '\0']), ('\u{4d8}', ['\u{4d9}', '\0', '\0']), ('\u{4da}', - ['\u{4db}', '\0', '\0']), ('\u{4dc}', ['\u{4dd}', '\0', '\0']), ('\u{4de}', ['\u{4df}', - '\0', '\0']), ('\u{4e0}', ['\u{4e1}', '\0', '\0']), ('\u{4e2}', ['\u{4e3}', '\0', '\0']), - ('\u{4e4}', ['\u{4e5}', '\0', '\0']), ('\u{4e6}', ['\u{4e7}', '\0', '\0']), ('\u{4e8}', - ['\u{4e9}', '\0', '\0']), ('\u{4ea}', ['\u{4eb}', '\0', '\0']), ('\u{4ec}', ['\u{4ed}', - '\0', '\0']), ('\u{4ee}', ['\u{4ef}', '\0', '\0']), ('\u{4f0}', ['\u{4f1}', '\0', '\0']), - ('\u{4f2}', ['\u{4f3}', '\0', '\0']), ('\u{4f4}', ['\u{4f5}', '\0', '\0']), ('\u{4f6}', - ['\u{4f7}', '\0', '\0']), ('\u{4f8}', ['\u{4f9}', '\0', '\0']), ('\u{4fa}', ['\u{4fb}', - '\0', '\0']), ('\u{4fc}', ['\u{4fd}', '\0', '\0']), ('\u{4fe}', ['\u{4ff}', '\0', '\0']), - ('\u{500}', ['\u{501}', '\0', '\0']), ('\u{502}', ['\u{503}', '\0', '\0']), ('\u{504}', - ['\u{505}', '\0', '\0']), ('\u{506}', ['\u{507}', '\0', '\0']), ('\u{508}', ['\u{509}', - '\0', '\0']), ('\u{50a}', ['\u{50b}', '\0', '\0']), ('\u{50c}', ['\u{50d}', '\0', '\0']), - ('\u{50e}', ['\u{50f}', '\0', '\0']), ('\u{510}', ['\u{511}', '\0', '\0']), ('\u{512}', - ['\u{513}', '\0', '\0']), ('\u{514}', ['\u{515}', '\0', '\0']), ('\u{516}', ['\u{517}', - '\0', '\0']), ('\u{518}', ['\u{519}', '\0', '\0']), ('\u{51a}', ['\u{51b}', '\0', '\0']), - ('\u{51c}', ['\u{51d}', '\0', '\0']), ('\u{51e}', ['\u{51f}', '\0', '\0']), ('\u{520}', - ['\u{521}', '\0', '\0']), ('\u{522}', ['\u{523}', '\0', '\0']), ('\u{524}', ['\u{525}', - '\0', '\0']), ('\u{526}', ['\u{527}', '\0', '\0']), ('\u{528}', ['\u{529}', '\0', '\0']), - ('\u{52a}', ['\u{52b}', '\0', '\0']), ('\u{52c}', ['\u{52d}', '\0', '\0']), ('\u{52e}', - ['\u{52f}', '\0', '\0']), ('\u{531}', ['\u{561}', '\0', '\0']), ('\u{532}', ['\u{562}', - '\0', '\0']), ('\u{533}', ['\u{563}', '\0', '\0']), ('\u{534}', ['\u{564}', '\0', '\0']), - ('\u{535}', ['\u{565}', '\0', '\0']), ('\u{536}', ['\u{566}', '\0', '\0']), ('\u{537}', - ['\u{567}', '\0', '\0']), ('\u{538}', ['\u{568}', '\0', '\0']), ('\u{539}', ['\u{569}', - '\0', '\0']), ('\u{53a}', ['\u{56a}', '\0', '\0']), ('\u{53b}', ['\u{56b}', '\0', '\0']), - ('\u{53c}', ['\u{56c}', '\0', '\0']), ('\u{53d}', ['\u{56d}', '\0', '\0']), ('\u{53e}', - ['\u{56e}', '\0', '\0']), ('\u{53f}', ['\u{56f}', '\0', '\0']), ('\u{540}', ['\u{570}', - '\0', '\0']), ('\u{541}', ['\u{571}', '\0', '\0']), ('\u{542}', ['\u{572}', '\0', '\0']), - ('\u{543}', ['\u{573}', '\0', '\0']), ('\u{544}', ['\u{574}', '\0', '\0']), ('\u{545}', - ['\u{575}', '\0', '\0']), ('\u{546}', ['\u{576}', '\0', '\0']), ('\u{547}', ['\u{577}', - '\0', '\0']), ('\u{548}', ['\u{578}', '\0', '\0']), ('\u{549}', ['\u{579}', '\0', '\0']), - ('\u{54a}', ['\u{57a}', '\0', '\0']), ('\u{54b}', ['\u{57b}', '\0', '\0']), ('\u{54c}', - ['\u{57c}', '\0', '\0']), ('\u{54d}', ['\u{57d}', '\0', '\0']), ('\u{54e}', ['\u{57e}', - '\0', '\0']), ('\u{54f}', ['\u{57f}', '\0', '\0']), ('\u{550}', ['\u{580}', '\0', '\0']), - ('\u{551}', ['\u{581}', '\0', '\0']), ('\u{552}', ['\u{582}', '\0', '\0']), ('\u{553}', - ['\u{583}', '\0', '\0']), ('\u{554}', ['\u{584}', '\0', '\0']), ('\u{555}', ['\u{585}', - '\0', '\0']), ('\u{556}', ['\u{586}', '\0', '\0']), ('\u{10a0}', ['\u{2d00}', '\0', '\0']), - ('\u{10a1}', ['\u{2d01}', '\0', '\0']), ('\u{10a2}', ['\u{2d02}', '\0', '\0']), ('\u{10a3}', - ['\u{2d03}', '\0', '\0']), ('\u{10a4}', ['\u{2d04}', '\0', '\0']), ('\u{10a5}', ['\u{2d05}', - '\0', '\0']), ('\u{10a6}', ['\u{2d06}', '\0', '\0']), ('\u{10a7}', ['\u{2d07}', '\0', - '\0']), ('\u{10a8}', ['\u{2d08}', '\0', '\0']), ('\u{10a9}', ['\u{2d09}', '\0', '\0']), - ('\u{10aa}', ['\u{2d0a}', '\0', '\0']), ('\u{10ab}', ['\u{2d0b}', '\0', '\0']), ('\u{10ac}', - ['\u{2d0c}', '\0', '\0']), ('\u{10ad}', ['\u{2d0d}', '\0', '\0']), ('\u{10ae}', ['\u{2d0e}', - '\0', '\0']), ('\u{10af}', ['\u{2d0f}', '\0', '\0']), ('\u{10b0}', ['\u{2d10}', '\0', - '\0']), ('\u{10b1}', ['\u{2d11}', '\0', '\0']), ('\u{10b2}', ['\u{2d12}', '\0', '\0']), - ('\u{10b3}', ['\u{2d13}', '\0', '\0']), ('\u{10b4}', ['\u{2d14}', '\0', '\0']), ('\u{10b5}', - ['\u{2d15}', '\0', '\0']), ('\u{10b6}', ['\u{2d16}', '\0', '\0']), ('\u{10b7}', ['\u{2d17}', - '\0', '\0']), ('\u{10b8}', ['\u{2d18}', '\0', '\0']), ('\u{10b9}', ['\u{2d19}', '\0', - '\0']), ('\u{10ba}', ['\u{2d1a}', '\0', '\0']), ('\u{10bb}', ['\u{2d1b}', '\0', '\0']), - ('\u{10bc}', ['\u{2d1c}', '\0', '\0']), ('\u{10bd}', ['\u{2d1d}', '\0', '\0']), ('\u{10be}', - ['\u{2d1e}', '\0', '\0']), ('\u{10bf}', ['\u{2d1f}', '\0', '\0']), ('\u{10c0}', ['\u{2d20}', - '\0', '\0']), ('\u{10c1}', ['\u{2d21}', '\0', '\0']), ('\u{10c2}', ['\u{2d22}', '\0', - '\0']), ('\u{10c3}', ['\u{2d23}', '\0', '\0']), ('\u{10c4}', ['\u{2d24}', '\0', '\0']), - ('\u{10c5}', ['\u{2d25}', '\0', '\0']), ('\u{10c7}', ['\u{2d27}', '\0', '\0']), ('\u{10cd}', - ['\u{2d2d}', '\0', '\0']), ('\u{13a0}', ['\u{ab70}', '\0', '\0']), ('\u{13a1}', ['\u{ab71}', - '\0', '\0']), ('\u{13a2}', ['\u{ab72}', '\0', '\0']), ('\u{13a3}', ['\u{ab73}', '\0', - '\0']), ('\u{13a4}', ['\u{ab74}', '\0', '\0']), ('\u{13a5}', ['\u{ab75}', '\0', '\0']), - ('\u{13a6}', ['\u{ab76}', '\0', '\0']), ('\u{13a7}', ['\u{ab77}', '\0', '\0']), ('\u{13a8}', - ['\u{ab78}', '\0', '\0']), ('\u{13a9}', ['\u{ab79}', '\0', '\0']), ('\u{13aa}', ['\u{ab7a}', - '\0', '\0']), ('\u{13ab}', ['\u{ab7b}', '\0', '\0']), ('\u{13ac}', ['\u{ab7c}', '\0', - '\0']), ('\u{13ad}', ['\u{ab7d}', '\0', '\0']), ('\u{13ae}', ['\u{ab7e}', '\0', '\0']), - ('\u{13af}', ['\u{ab7f}', '\0', '\0']), ('\u{13b0}', ['\u{ab80}', '\0', '\0']), ('\u{13b1}', - ['\u{ab81}', '\0', '\0']), ('\u{13b2}', ['\u{ab82}', '\0', '\0']), ('\u{13b3}', ['\u{ab83}', - '\0', '\0']), ('\u{13b4}', ['\u{ab84}', '\0', '\0']), ('\u{13b5}', ['\u{ab85}', '\0', - '\0']), ('\u{13b6}', ['\u{ab86}', '\0', '\0']), ('\u{13b7}', ['\u{ab87}', '\0', '\0']), - ('\u{13b8}', ['\u{ab88}', '\0', '\0']), ('\u{13b9}', ['\u{ab89}', '\0', '\0']), ('\u{13ba}', - ['\u{ab8a}', '\0', '\0']), ('\u{13bb}', ['\u{ab8b}', '\0', '\0']), ('\u{13bc}', ['\u{ab8c}', - '\0', '\0']), ('\u{13bd}', ['\u{ab8d}', '\0', '\0']), ('\u{13be}', ['\u{ab8e}', '\0', - '\0']), ('\u{13bf}', ['\u{ab8f}', '\0', '\0']), ('\u{13c0}', ['\u{ab90}', '\0', '\0']), - ('\u{13c1}', ['\u{ab91}', '\0', '\0']), ('\u{13c2}', ['\u{ab92}', '\0', '\0']), ('\u{13c3}', - ['\u{ab93}', '\0', '\0']), ('\u{13c4}', ['\u{ab94}', '\0', '\0']), ('\u{13c5}', ['\u{ab95}', - '\0', '\0']), ('\u{13c6}', ['\u{ab96}', '\0', '\0']), ('\u{13c7}', ['\u{ab97}', '\0', - '\0']), ('\u{13c8}', ['\u{ab98}', '\0', '\0']), ('\u{13c9}', ['\u{ab99}', '\0', '\0']), - ('\u{13ca}', ['\u{ab9a}', '\0', '\0']), ('\u{13cb}', ['\u{ab9b}', '\0', '\0']), ('\u{13cc}', - ['\u{ab9c}', '\0', '\0']), ('\u{13cd}', ['\u{ab9d}', '\0', '\0']), ('\u{13ce}', ['\u{ab9e}', - '\0', '\0']), ('\u{13cf}', ['\u{ab9f}', '\0', '\0']), ('\u{13d0}', ['\u{aba0}', '\0', - '\0']), ('\u{13d1}', ['\u{aba1}', '\0', '\0']), ('\u{13d2}', ['\u{aba2}', '\0', '\0']), - ('\u{13d3}', ['\u{aba3}', '\0', '\0']), ('\u{13d4}', ['\u{aba4}', '\0', '\0']), ('\u{13d5}', - ['\u{aba5}', '\0', '\0']), ('\u{13d6}', ['\u{aba6}', '\0', '\0']), ('\u{13d7}', ['\u{aba7}', - '\0', '\0']), ('\u{13d8}', ['\u{aba8}', '\0', '\0']), ('\u{13d9}', ['\u{aba9}', '\0', - '\0']), ('\u{13da}', ['\u{abaa}', '\0', '\0']), ('\u{13db}', ['\u{abab}', '\0', '\0']), - ('\u{13dc}', ['\u{abac}', '\0', '\0']), ('\u{13dd}', ['\u{abad}', '\0', '\0']), ('\u{13de}', - ['\u{abae}', '\0', '\0']), ('\u{13df}', ['\u{abaf}', '\0', '\0']), ('\u{13e0}', ['\u{abb0}', - '\0', '\0']), ('\u{13e1}', ['\u{abb1}', '\0', '\0']), ('\u{13e2}', ['\u{abb2}', '\0', - '\0']), ('\u{13e3}', ['\u{abb3}', '\0', '\0']), ('\u{13e4}', ['\u{abb4}', '\0', '\0']), - ('\u{13e5}', ['\u{abb5}', '\0', '\0']), ('\u{13e6}', ['\u{abb6}', '\0', '\0']), ('\u{13e7}', - ['\u{abb7}', '\0', '\0']), ('\u{13e8}', ['\u{abb8}', '\0', '\0']), ('\u{13e9}', ['\u{abb9}', - '\0', '\0']), ('\u{13ea}', ['\u{abba}', '\0', '\0']), ('\u{13eb}', ['\u{abbb}', '\0', - '\0']), ('\u{13ec}', ['\u{abbc}', '\0', '\0']), ('\u{13ed}', ['\u{abbd}', '\0', '\0']), - ('\u{13ee}', ['\u{abbe}', '\0', '\0']), ('\u{13ef}', ['\u{abbf}', '\0', '\0']), ('\u{13f0}', - ['\u{13f8}', '\0', '\0']), ('\u{13f1}', ['\u{13f9}', '\0', '\0']), ('\u{13f2}', ['\u{13fa}', - '\0', '\0']), ('\u{13f3}', ['\u{13fb}', '\0', '\0']), ('\u{13f4}', ['\u{13fc}', '\0', - '\0']), ('\u{13f5}', ['\u{13fd}', '\0', '\0']), ('\u{1c90}', ['\u{10d0}', '\0', '\0']), - ('\u{1c91}', ['\u{10d1}', '\0', '\0']), ('\u{1c92}', ['\u{10d2}', '\0', '\0']), ('\u{1c93}', - ['\u{10d3}', '\0', '\0']), ('\u{1c94}', ['\u{10d4}', '\0', '\0']), ('\u{1c95}', ['\u{10d5}', - '\0', '\0']), ('\u{1c96}', ['\u{10d6}', '\0', '\0']), ('\u{1c97}', ['\u{10d7}', '\0', - '\0']), ('\u{1c98}', ['\u{10d8}', '\0', '\0']), ('\u{1c99}', ['\u{10d9}', '\0', '\0']), - ('\u{1c9a}', ['\u{10da}', '\0', '\0']), ('\u{1c9b}', ['\u{10db}', '\0', '\0']), ('\u{1c9c}', - ['\u{10dc}', '\0', '\0']), ('\u{1c9d}', ['\u{10dd}', '\0', '\0']), ('\u{1c9e}', ['\u{10de}', - '\0', '\0']), ('\u{1c9f}', ['\u{10df}', '\0', '\0']), ('\u{1ca0}', ['\u{10e0}', '\0', - '\0']), ('\u{1ca1}', ['\u{10e1}', '\0', '\0']), ('\u{1ca2}', ['\u{10e2}', '\0', '\0']), - ('\u{1ca3}', ['\u{10e3}', '\0', '\0']), ('\u{1ca4}', ['\u{10e4}', '\0', '\0']), ('\u{1ca5}', - ['\u{10e5}', '\0', '\0']), ('\u{1ca6}', ['\u{10e6}', '\0', '\0']), ('\u{1ca7}', ['\u{10e7}', - '\0', '\0']), ('\u{1ca8}', ['\u{10e8}', '\0', '\0']), ('\u{1ca9}', ['\u{10e9}', '\0', - '\0']), ('\u{1caa}', ['\u{10ea}', '\0', '\0']), ('\u{1cab}', ['\u{10eb}', '\0', '\0']), - ('\u{1cac}', ['\u{10ec}', '\0', '\0']), ('\u{1cad}', ['\u{10ed}', '\0', '\0']), ('\u{1cae}', - ['\u{10ee}', '\0', '\0']), ('\u{1caf}', ['\u{10ef}', '\0', '\0']), ('\u{1cb0}', ['\u{10f0}', - '\0', '\0']), ('\u{1cb1}', ['\u{10f1}', '\0', '\0']), ('\u{1cb2}', ['\u{10f2}', '\0', - '\0']), ('\u{1cb3}', ['\u{10f3}', '\0', '\0']), ('\u{1cb4}', ['\u{10f4}', '\0', '\0']), - ('\u{1cb5}', ['\u{10f5}', '\0', '\0']), ('\u{1cb6}', ['\u{10f6}', '\0', '\0']), ('\u{1cb7}', - ['\u{10f7}', '\0', '\0']), ('\u{1cb8}', ['\u{10f8}', '\0', '\0']), ('\u{1cb9}', ['\u{10f9}', - '\0', '\0']), ('\u{1cba}', ['\u{10fa}', '\0', '\0']), ('\u{1cbd}', ['\u{10fd}', '\0', - '\0']), ('\u{1cbe}', ['\u{10fe}', '\0', '\0']), ('\u{1cbf}', ['\u{10ff}', '\0', '\0']), - ('\u{1e00}', ['\u{1e01}', '\0', '\0']), ('\u{1e02}', ['\u{1e03}', '\0', '\0']), ('\u{1e04}', - ['\u{1e05}', '\0', '\0']), ('\u{1e06}', ['\u{1e07}', '\0', '\0']), ('\u{1e08}', ['\u{1e09}', - '\0', '\0']), ('\u{1e0a}', ['\u{1e0b}', '\0', '\0']), ('\u{1e0c}', ['\u{1e0d}', '\0', - '\0']), ('\u{1e0e}', ['\u{1e0f}', '\0', '\0']), ('\u{1e10}', ['\u{1e11}', '\0', '\0']), - ('\u{1e12}', ['\u{1e13}', '\0', '\0']), ('\u{1e14}', ['\u{1e15}', '\0', '\0']), ('\u{1e16}', - ['\u{1e17}', '\0', '\0']), ('\u{1e18}', ['\u{1e19}', '\0', '\0']), ('\u{1e1a}', ['\u{1e1b}', - '\0', '\0']), ('\u{1e1c}', ['\u{1e1d}', '\0', '\0']), ('\u{1e1e}', ['\u{1e1f}', '\0', - '\0']), ('\u{1e20}', ['\u{1e21}', '\0', '\0']), ('\u{1e22}', ['\u{1e23}', '\0', '\0']), - ('\u{1e24}', ['\u{1e25}', '\0', '\0']), ('\u{1e26}', ['\u{1e27}', '\0', '\0']), ('\u{1e28}', - ['\u{1e29}', '\0', '\0']), ('\u{1e2a}', ['\u{1e2b}', '\0', '\0']), ('\u{1e2c}', ['\u{1e2d}', - '\0', '\0']), ('\u{1e2e}', ['\u{1e2f}', '\0', '\0']), ('\u{1e30}', ['\u{1e31}', '\0', - '\0']), ('\u{1e32}', ['\u{1e33}', '\0', '\0']), ('\u{1e34}', ['\u{1e35}', '\0', '\0']), - ('\u{1e36}', ['\u{1e37}', '\0', '\0']), ('\u{1e38}', ['\u{1e39}', '\0', '\0']), ('\u{1e3a}', - ['\u{1e3b}', '\0', '\0']), ('\u{1e3c}', ['\u{1e3d}', '\0', '\0']), ('\u{1e3e}', ['\u{1e3f}', - '\0', '\0']), ('\u{1e40}', ['\u{1e41}', '\0', '\0']), ('\u{1e42}', ['\u{1e43}', '\0', - '\0']), ('\u{1e44}', ['\u{1e45}', '\0', '\0']), ('\u{1e46}', ['\u{1e47}', '\0', '\0']), - ('\u{1e48}', ['\u{1e49}', '\0', '\0']), ('\u{1e4a}', ['\u{1e4b}', '\0', '\0']), ('\u{1e4c}', - ['\u{1e4d}', '\0', '\0']), ('\u{1e4e}', ['\u{1e4f}', '\0', '\0']), ('\u{1e50}', ['\u{1e51}', - '\0', '\0']), ('\u{1e52}', ['\u{1e53}', '\0', '\0']), ('\u{1e54}', ['\u{1e55}', '\0', - '\0']), ('\u{1e56}', ['\u{1e57}', '\0', '\0']), ('\u{1e58}', ['\u{1e59}', '\0', '\0']), - ('\u{1e5a}', ['\u{1e5b}', '\0', '\0']), ('\u{1e5c}', ['\u{1e5d}', '\0', '\0']), ('\u{1e5e}', - ['\u{1e5f}', '\0', '\0']), ('\u{1e60}', ['\u{1e61}', '\0', '\0']), ('\u{1e62}', ['\u{1e63}', - '\0', '\0']), ('\u{1e64}', ['\u{1e65}', '\0', '\0']), ('\u{1e66}', ['\u{1e67}', '\0', - '\0']), ('\u{1e68}', ['\u{1e69}', '\0', '\0']), ('\u{1e6a}', ['\u{1e6b}', '\0', '\0']), - ('\u{1e6c}', ['\u{1e6d}', '\0', '\0']), ('\u{1e6e}', ['\u{1e6f}', '\0', '\0']), ('\u{1e70}', - ['\u{1e71}', '\0', '\0']), ('\u{1e72}', ['\u{1e73}', '\0', '\0']), ('\u{1e74}', ['\u{1e75}', - '\0', '\0']), ('\u{1e76}', ['\u{1e77}', '\0', '\0']), ('\u{1e78}', ['\u{1e79}', '\0', - '\0']), ('\u{1e7a}', ['\u{1e7b}', '\0', '\0']), ('\u{1e7c}', ['\u{1e7d}', '\0', '\0']), - ('\u{1e7e}', ['\u{1e7f}', '\0', '\0']), ('\u{1e80}', ['\u{1e81}', '\0', '\0']), ('\u{1e82}', - ['\u{1e83}', '\0', '\0']), ('\u{1e84}', ['\u{1e85}', '\0', '\0']), ('\u{1e86}', ['\u{1e87}', - '\0', '\0']), ('\u{1e88}', ['\u{1e89}', '\0', '\0']), ('\u{1e8a}', ['\u{1e8b}', '\0', - '\0']), ('\u{1e8c}', ['\u{1e8d}', '\0', '\0']), ('\u{1e8e}', ['\u{1e8f}', '\0', '\0']), - ('\u{1e90}', ['\u{1e91}', '\0', '\0']), ('\u{1e92}', ['\u{1e93}', '\0', '\0']), ('\u{1e94}', - ['\u{1e95}', '\0', '\0']), ('\u{1e9e}', ['\u{df}', '\0', '\0']), ('\u{1ea0}', ['\u{1ea1}', - '\0', '\0']), ('\u{1ea2}', ['\u{1ea3}', '\0', '\0']), ('\u{1ea4}', ['\u{1ea5}', '\0', - '\0']), ('\u{1ea6}', ['\u{1ea7}', '\0', '\0']), ('\u{1ea8}', ['\u{1ea9}', '\0', '\0']), - ('\u{1eaa}', ['\u{1eab}', '\0', '\0']), ('\u{1eac}', ['\u{1ead}', '\0', '\0']), ('\u{1eae}', - ['\u{1eaf}', '\0', '\0']), ('\u{1eb0}', ['\u{1eb1}', '\0', '\0']), ('\u{1eb2}', ['\u{1eb3}', - '\0', '\0']), ('\u{1eb4}', ['\u{1eb5}', '\0', '\0']), ('\u{1eb6}', ['\u{1eb7}', '\0', - '\0']), ('\u{1eb8}', ['\u{1eb9}', '\0', '\0']), ('\u{1eba}', ['\u{1ebb}', '\0', '\0']), - ('\u{1ebc}', ['\u{1ebd}', '\0', '\0']), ('\u{1ebe}', ['\u{1ebf}', '\0', '\0']), ('\u{1ec0}', - ['\u{1ec1}', '\0', '\0']), ('\u{1ec2}', ['\u{1ec3}', '\0', '\0']), ('\u{1ec4}', ['\u{1ec5}', - '\0', '\0']), ('\u{1ec6}', ['\u{1ec7}', '\0', '\0']), ('\u{1ec8}', ['\u{1ec9}', '\0', - '\0']), ('\u{1eca}', ['\u{1ecb}', '\0', '\0']), ('\u{1ecc}', ['\u{1ecd}', '\0', '\0']), - ('\u{1ece}', ['\u{1ecf}', '\0', '\0']), ('\u{1ed0}', ['\u{1ed1}', '\0', '\0']), ('\u{1ed2}', - ['\u{1ed3}', '\0', '\0']), ('\u{1ed4}', ['\u{1ed5}', '\0', '\0']), ('\u{1ed6}', ['\u{1ed7}', - '\0', '\0']), ('\u{1ed8}', ['\u{1ed9}', '\0', '\0']), ('\u{1eda}', ['\u{1edb}', '\0', - '\0']), ('\u{1edc}', ['\u{1edd}', '\0', '\0']), ('\u{1ede}', ['\u{1edf}', '\0', '\0']), - ('\u{1ee0}', ['\u{1ee1}', '\0', '\0']), ('\u{1ee2}', ['\u{1ee3}', '\0', '\0']), ('\u{1ee4}', - ['\u{1ee5}', '\0', '\0']), ('\u{1ee6}', ['\u{1ee7}', '\0', '\0']), ('\u{1ee8}', ['\u{1ee9}', - '\0', '\0']), ('\u{1eea}', ['\u{1eeb}', '\0', '\0']), ('\u{1eec}', ['\u{1eed}', '\0', - '\0']), ('\u{1eee}', ['\u{1eef}', '\0', '\0']), ('\u{1ef0}', ['\u{1ef1}', '\0', '\0']), - ('\u{1ef2}', ['\u{1ef3}', '\0', '\0']), ('\u{1ef4}', ['\u{1ef5}', '\0', '\0']), ('\u{1ef6}', - ['\u{1ef7}', '\0', '\0']), ('\u{1ef8}', ['\u{1ef9}', '\0', '\0']), ('\u{1efa}', ['\u{1efb}', - '\0', '\0']), ('\u{1efc}', ['\u{1efd}', '\0', '\0']), ('\u{1efe}', ['\u{1eff}', '\0', - '\0']), ('\u{1f08}', ['\u{1f00}', '\0', '\0']), ('\u{1f09}', ['\u{1f01}', '\0', '\0']), - ('\u{1f0a}', ['\u{1f02}', '\0', '\0']), ('\u{1f0b}', ['\u{1f03}', '\0', '\0']), ('\u{1f0c}', - ['\u{1f04}', '\0', '\0']), ('\u{1f0d}', ['\u{1f05}', '\0', '\0']), ('\u{1f0e}', ['\u{1f06}', - '\0', '\0']), ('\u{1f0f}', ['\u{1f07}', '\0', '\0']), ('\u{1f18}', ['\u{1f10}', '\0', - '\0']), ('\u{1f19}', ['\u{1f11}', '\0', '\0']), ('\u{1f1a}', ['\u{1f12}', '\0', '\0']), - ('\u{1f1b}', ['\u{1f13}', '\0', '\0']), ('\u{1f1c}', ['\u{1f14}', '\0', '\0']), ('\u{1f1d}', - ['\u{1f15}', '\0', '\0']), ('\u{1f28}', ['\u{1f20}', '\0', '\0']), ('\u{1f29}', ['\u{1f21}', - '\0', '\0']), ('\u{1f2a}', ['\u{1f22}', '\0', '\0']), ('\u{1f2b}', ['\u{1f23}', '\0', - '\0']), ('\u{1f2c}', ['\u{1f24}', '\0', '\0']), ('\u{1f2d}', ['\u{1f25}', '\0', '\0']), - ('\u{1f2e}', ['\u{1f26}', '\0', '\0']), ('\u{1f2f}', ['\u{1f27}', '\0', '\0']), ('\u{1f38}', - ['\u{1f30}', '\0', '\0']), ('\u{1f39}', ['\u{1f31}', '\0', '\0']), ('\u{1f3a}', ['\u{1f32}', - '\0', '\0']), ('\u{1f3b}', ['\u{1f33}', '\0', '\0']), ('\u{1f3c}', ['\u{1f34}', '\0', - '\0']), ('\u{1f3d}', ['\u{1f35}', '\0', '\0']), ('\u{1f3e}', ['\u{1f36}', '\0', '\0']), - ('\u{1f3f}', ['\u{1f37}', '\0', '\0']), ('\u{1f48}', ['\u{1f40}', '\0', '\0']), ('\u{1f49}', - ['\u{1f41}', '\0', '\0']), ('\u{1f4a}', ['\u{1f42}', '\0', '\0']), ('\u{1f4b}', ['\u{1f43}', - '\0', '\0']), ('\u{1f4c}', ['\u{1f44}', '\0', '\0']), ('\u{1f4d}', ['\u{1f45}', '\0', - '\0']), ('\u{1f59}', ['\u{1f51}', '\0', '\0']), ('\u{1f5b}', ['\u{1f53}', '\0', '\0']), - ('\u{1f5d}', ['\u{1f55}', '\0', '\0']), ('\u{1f5f}', ['\u{1f57}', '\0', '\0']), ('\u{1f68}', - ['\u{1f60}', '\0', '\0']), ('\u{1f69}', ['\u{1f61}', '\0', '\0']), ('\u{1f6a}', ['\u{1f62}', - '\0', '\0']), ('\u{1f6b}', ['\u{1f63}', '\0', '\0']), ('\u{1f6c}', ['\u{1f64}', '\0', - '\0']), ('\u{1f6d}', ['\u{1f65}', '\0', '\0']), ('\u{1f6e}', ['\u{1f66}', '\0', '\0']), - ('\u{1f6f}', ['\u{1f67}', '\0', '\0']), ('\u{1f88}', ['\u{1f80}', '\0', '\0']), ('\u{1f89}', - ['\u{1f81}', '\0', '\0']), ('\u{1f8a}', ['\u{1f82}', '\0', '\0']), ('\u{1f8b}', ['\u{1f83}', - '\0', '\0']), ('\u{1f8c}', ['\u{1f84}', '\0', '\0']), ('\u{1f8d}', ['\u{1f85}', '\0', - '\0']), ('\u{1f8e}', ['\u{1f86}', '\0', '\0']), ('\u{1f8f}', ['\u{1f87}', '\0', '\0']), - ('\u{1f98}', ['\u{1f90}', '\0', '\0']), ('\u{1f99}', ['\u{1f91}', '\0', '\0']), ('\u{1f9a}', - ['\u{1f92}', '\0', '\0']), ('\u{1f9b}', ['\u{1f93}', '\0', '\0']), ('\u{1f9c}', ['\u{1f94}', - '\0', '\0']), ('\u{1f9d}', ['\u{1f95}', '\0', '\0']), ('\u{1f9e}', ['\u{1f96}', '\0', - '\0']), ('\u{1f9f}', ['\u{1f97}', '\0', '\0']), ('\u{1fa8}', ['\u{1fa0}', '\0', '\0']), - ('\u{1fa9}', ['\u{1fa1}', '\0', '\0']), ('\u{1faa}', ['\u{1fa2}', '\0', '\0']), ('\u{1fab}', - ['\u{1fa3}', '\0', '\0']), ('\u{1fac}', ['\u{1fa4}', '\0', '\0']), ('\u{1fad}', ['\u{1fa5}', - '\0', '\0']), ('\u{1fae}', ['\u{1fa6}', '\0', '\0']), ('\u{1faf}', ['\u{1fa7}', '\0', - '\0']), ('\u{1fb8}', ['\u{1fb0}', '\0', '\0']), ('\u{1fb9}', ['\u{1fb1}', '\0', '\0']), - ('\u{1fba}', ['\u{1f70}', '\0', '\0']), ('\u{1fbb}', ['\u{1f71}', '\0', '\0']), ('\u{1fbc}', - ['\u{1fb3}', '\0', '\0']), ('\u{1fc8}', ['\u{1f72}', '\0', '\0']), ('\u{1fc9}', ['\u{1f73}', - '\0', '\0']), ('\u{1fca}', ['\u{1f74}', '\0', '\0']), ('\u{1fcb}', ['\u{1f75}', '\0', - '\0']), ('\u{1fcc}', ['\u{1fc3}', '\0', '\0']), ('\u{1fd8}', ['\u{1fd0}', '\0', '\0']), - ('\u{1fd9}', ['\u{1fd1}', '\0', '\0']), ('\u{1fda}', ['\u{1f76}', '\0', '\0']), ('\u{1fdb}', - ['\u{1f77}', '\0', '\0']), ('\u{1fe8}', ['\u{1fe0}', '\0', '\0']), ('\u{1fe9}', ['\u{1fe1}', - '\0', '\0']), ('\u{1fea}', ['\u{1f7a}', '\0', '\0']), ('\u{1feb}', ['\u{1f7b}', '\0', - '\0']), ('\u{1fec}', ['\u{1fe5}', '\0', '\0']), ('\u{1ff8}', ['\u{1f78}', '\0', '\0']), - ('\u{1ff9}', ['\u{1f79}', '\0', '\0']), ('\u{1ffa}', ['\u{1f7c}', '\0', '\0']), ('\u{1ffb}', - ['\u{1f7d}', '\0', '\0']), ('\u{1ffc}', ['\u{1ff3}', '\0', '\0']), ('\u{2126}', ['\u{3c9}', - '\0', '\0']), ('\u{212a}', ['\u{6b}', '\0', '\0']), ('\u{212b}', ['\u{e5}', '\0', '\0']), - ('\u{2132}', ['\u{214e}', '\0', '\0']), ('\u{2160}', ['\u{2170}', '\0', '\0']), ('\u{2161}', - ['\u{2171}', '\0', '\0']), ('\u{2162}', ['\u{2172}', '\0', '\0']), ('\u{2163}', ['\u{2173}', - '\0', '\0']), ('\u{2164}', ['\u{2174}', '\0', '\0']), ('\u{2165}', ['\u{2175}', '\0', - '\0']), ('\u{2166}', ['\u{2176}', '\0', '\0']), ('\u{2167}', ['\u{2177}', '\0', '\0']), - ('\u{2168}', ['\u{2178}', '\0', '\0']), ('\u{2169}', ['\u{2179}', '\0', '\0']), ('\u{216a}', - ['\u{217a}', '\0', '\0']), ('\u{216b}', ['\u{217b}', '\0', '\0']), ('\u{216c}', ['\u{217c}', - '\0', '\0']), ('\u{216d}', ['\u{217d}', '\0', '\0']), ('\u{216e}', ['\u{217e}', '\0', - '\0']), ('\u{216f}', ['\u{217f}', '\0', '\0']), ('\u{2183}', ['\u{2184}', '\0', '\0']), - ('\u{24b6}', ['\u{24d0}', '\0', '\0']), ('\u{24b7}', ['\u{24d1}', '\0', '\0']), ('\u{24b8}', - ['\u{24d2}', '\0', '\0']), ('\u{24b9}', ['\u{24d3}', '\0', '\0']), ('\u{24ba}', ['\u{24d4}', - '\0', '\0']), ('\u{24bb}', ['\u{24d5}', '\0', '\0']), ('\u{24bc}', ['\u{24d6}', '\0', - '\0']), ('\u{24bd}', ['\u{24d7}', '\0', '\0']), ('\u{24be}', ['\u{24d8}', '\0', '\0']), - ('\u{24bf}', ['\u{24d9}', '\0', '\0']), ('\u{24c0}', ['\u{24da}', '\0', '\0']), ('\u{24c1}', - ['\u{24db}', '\0', '\0']), ('\u{24c2}', ['\u{24dc}', '\0', '\0']), ('\u{24c3}', ['\u{24dd}', - '\0', '\0']), ('\u{24c4}', ['\u{24de}', '\0', '\0']), ('\u{24c5}', ['\u{24df}', '\0', - '\0']), ('\u{24c6}', ['\u{24e0}', '\0', '\0']), ('\u{24c7}', ['\u{24e1}', '\0', '\0']), - ('\u{24c8}', ['\u{24e2}', '\0', '\0']), ('\u{24c9}', ['\u{24e3}', '\0', '\0']), ('\u{24ca}', - ['\u{24e4}', '\0', '\0']), ('\u{24cb}', ['\u{24e5}', '\0', '\0']), ('\u{24cc}', ['\u{24e6}', - '\0', '\0']), ('\u{24cd}', ['\u{24e7}', '\0', '\0']), ('\u{24ce}', ['\u{24e8}', '\0', - '\0']), ('\u{24cf}', ['\u{24e9}', '\0', '\0']), ('\u{2c00}', ['\u{2c30}', '\0', '\0']), - ('\u{2c01}', ['\u{2c31}', '\0', '\0']), ('\u{2c02}', ['\u{2c32}', '\0', '\0']), ('\u{2c03}', - ['\u{2c33}', '\0', '\0']), ('\u{2c04}', ['\u{2c34}', '\0', '\0']), ('\u{2c05}', ['\u{2c35}', - '\0', '\0']), ('\u{2c06}', ['\u{2c36}', '\0', '\0']), ('\u{2c07}', ['\u{2c37}', '\0', - '\0']), ('\u{2c08}', ['\u{2c38}', '\0', '\0']), ('\u{2c09}', ['\u{2c39}', '\0', '\0']), - ('\u{2c0a}', ['\u{2c3a}', '\0', '\0']), ('\u{2c0b}', ['\u{2c3b}', '\0', '\0']), ('\u{2c0c}', - ['\u{2c3c}', '\0', '\0']), ('\u{2c0d}', ['\u{2c3d}', '\0', '\0']), ('\u{2c0e}', ['\u{2c3e}', - '\0', '\0']), ('\u{2c0f}', ['\u{2c3f}', '\0', '\0']), ('\u{2c10}', ['\u{2c40}', '\0', - '\0']), ('\u{2c11}', ['\u{2c41}', '\0', '\0']), ('\u{2c12}', ['\u{2c42}', '\0', '\0']), - ('\u{2c13}', ['\u{2c43}', '\0', '\0']), ('\u{2c14}', ['\u{2c44}', '\0', '\0']), ('\u{2c15}', - ['\u{2c45}', '\0', '\0']), ('\u{2c16}', ['\u{2c46}', '\0', '\0']), ('\u{2c17}', ['\u{2c47}', - '\0', '\0']), ('\u{2c18}', ['\u{2c48}', '\0', '\0']), ('\u{2c19}', ['\u{2c49}', '\0', - '\0']), ('\u{2c1a}', ['\u{2c4a}', '\0', '\0']), ('\u{2c1b}', ['\u{2c4b}', '\0', '\0']), - ('\u{2c1c}', ['\u{2c4c}', '\0', '\0']), ('\u{2c1d}', ['\u{2c4d}', '\0', '\0']), ('\u{2c1e}', - ['\u{2c4e}', '\0', '\0']), ('\u{2c1f}', ['\u{2c4f}', '\0', '\0']), ('\u{2c20}', ['\u{2c50}', - '\0', '\0']), ('\u{2c21}', ['\u{2c51}', '\0', '\0']), ('\u{2c22}', ['\u{2c52}', '\0', - '\0']), ('\u{2c23}', ['\u{2c53}', '\0', '\0']), ('\u{2c24}', ['\u{2c54}', '\0', '\0']), - ('\u{2c25}', ['\u{2c55}', '\0', '\0']), ('\u{2c26}', ['\u{2c56}', '\0', '\0']), ('\u{2c27}', - ['\u{2c57}', '\0', '\0']), ('\u{2c28}', ['\u{2c58}', '\0', '\0']), ('\u{2c29}', ['\u{2c59}', - '\0', '\0']), ('\u{2c2a}', ['\u{2c5a}', '\0', '\0']), ('\u{2c2b}', ['\u{2c5b}', '\0', - '\0']), ('\u{2c2c}', ['\u{2c5c}', '\0', '\0']), ('\u{2c2d}', ['\u{2c5d}', '\0', '\0']), - ('\u{2c2e}', ['\u{2c5e}', '\0', '\0']), ('\u{2c60}', ['\u{2c61}', '\0', '\0']), ('\u{2c62}', - ['\u{26b}', '\0', '\0']), ('\u{2c63}', ['\u{1d7d}', '\0', '\0']), ('\u{2c64}', ['\u{27d}', - '\0', '\0']), ('\u{2c67}', ['\u{2c68}', '\0', '\0']), ('\u{2c69}', ['\u{2c6a}', '\0', - '\0']), ('\u{2c6b}', ['\u{2c6c}', '\0', '\0']), ('\u{2c6d}', ['\u{251}', '\0', '\0']), - ('\u{2c6e}', ['\u{271}', '\0', '\0']), ('\u{2c6f}', ['\u{250}', '\0', '\0']), ('\u{2c70}', - ['\u{252}', '\0', '\0']), ('\u{2c72}', ['\u{2c73}', '\0', '\0']), ('\u{2c75}', ['\u{2c76}', - '\0', '\0']), ('\u{2c7e}', ['\u{23f}', '\0', '\0']), ('\u{2c7f}', ['\u{240}', '\0', '\0']), - ('\u{2c80}', ['\u{2c81}', '\0', '\0']), ('\u{2c82}', ['\u{2c83}', '\0', '\0']), ('\u{2c84}', - ['\u{2c85}', '\0', '\0']), ('\u{2c86}', ['\u{2c87}', '\0', '\0']), ('\u{2c88}', ['\u{2c89}', - '\0', '\0']), ('\u{2c8a}', ['\u{2c8b}', '\0', '\0']), ('\u{2c8c}', ['\u{2c8d}', '\0', - '\0']), ('\u{2c8e}', ['\u{2c8f}', '\0', '\0']), ('\u{2c90}', ['\u{2c91}', '\0', '\0']), - ('\u{2c92}', ['\u{2c93}', '\0', '\0']), ('\u{2c94}', ['\u{2c95}', '\0', '\0']), ('\u{2c96}', - ['\u{2c97}', '\0', '\0']), ('\u{2c98}', ['\u{2c99}', '\0', '\0']), ('\u{2c9a}', ['\u{2c9b}', - '\0', '\0']), ('\u{2c9c}', ['\u{2c9d}', '\0', '\0']), ('\u{2c9e}', ['\u{2c9f}', '\0', - '\0']), ('\u{2ca0}', ['\u{2ca1}', '\0', '\0']), ('\u{2ca2}', ['\u{2ca3}', '\0', '\0']), - ('\u{2ca4}', ['\u{2ca5}', '\0', '\0']), ('\u{2ca6}', ['\u{2ca7}', '\0', '\0']), ('\u{2ca8}', - ['\u{2ca9}', '\0', '\0']), ('\u{2caa}', ['\u{2cab}', '\0', '\0']), ('\u{2cac}', ['\u{2cad}', - '\0', '\0']), ('\u{2cae}', ['\u{2caf}', '\0', '\0']), ('\u{2cb0}', ['\u{2cb1}', '\0', - '\0']), ('\u{2cb2}', ['\u{2cb3}', '\0', '\0']), ('\u{2cb4}', ['\u{2cb5}', '\0', '\0']), - ('\u{2cb6}', ['\u{2cb7}', '\0', '\0']), ('\u{2cb8}', ['\u{2cb9}', '\0', '\0']), ('\u{2cba}', - ['\u{2cbb}', '\0', '\0']), ('\u{2cbc}', ['\u{2cbd}', '\0', '\0']), ('\u{2cbe}', ['\u{2cbf}', - '\0', '\0']), ('\u{2cc0}', ['\u{2cc1}', '\0', '\0']), ('\u{2cc2}', ['\u{2cc3}', '\0', - '\0']), ('\u{2cc4}', ['\u{2cc5}', '\0', '\0']), ('\u{2cc6}', ['\u{2cc7}', '\0', '\0']), - ('\u{2cc8}', ['\u{2cc9}', '\0', '\0']), ('\u{2cca}', ['\u{2ccb}', '\0', '\0']), ('\u{2ccc}', - ['\u{2ccd}', '\0', '\0']), ('\u{2cce}', ['\u{2ccf}', '\0', '\0']), ('\u{2cd0}', ['\u{2cd1}', - '\0', '\0']), ('\u{2cd2}', ['\u{2cd3}', '\0', '\0']), ('\u{2cd4}', ['\u{2cd5}', '\0', - '\0']), ('\u{2cd6}', ['\u{2cd7}', '\0', '\0']), ('\u{2cd8}', ['\u{2cd9}', '\0', '\0']), - ('\u{2cda}', ['\u{2cdb}', '\0', '\0']), ('\u{2cdc}', ['\u{2cdd}', '\0', '\0']), ('\u{2cde}', - ['\u{2cdf}', '\0', '\0']), ('\u{2ce0}', ['\u{2ce1}', '\0', '\0']), ('\u{2ce2}', ['\u{2ce3}', - '\0', '\0']), ('\u{2ceb}', ['\u{2cec}', '\0', '\0']), ('\u{2ced}', ['\u{2cee}', '\0', - '\0']), ('\u{2cf2}', ['\u{2cf3}', '\0', '\0']), ('\u{a640}', ['\u{a641}', '\0', '\0']), - ('\u{a642}', ['\u{a643}', '\0', '\0']), ('\u{a644}', ['\u{a645}', '\0', '\0']), ('\u{a646}', - ['\u{a647}', '\0', '\0']), ('\u{a648}', ['\u{a649}', '\0', '\0']), ('\u{a64a}', ['\u{a64b}', - '\0', '\0']), ('\u{a64c}', ['\u{a64d}', '\0', '\0']), ('\u{a64e}', ['\u{a64f}', '\0', - '\0']), ('\u{a650}', ['\u{a651}', '\0', '\0']), ('\u{a652}', ['\u{a653}', '\0', '\0']), - ('\u{a654}', ['\u{a655}', '\0', '\0']), ('\u{a656}', ['\u{a657}', '\0', '\0']), ('\u{a658}', - ['\u{a659}', '\0', '\0']), ('\u{a65a}', ['\u{a65b}', '\0', '\0']), ('\u{a65c}', ['\u{a65d}', - '\0', '\0']), ('\u{a65e}', ['\u{a65f}', '\0', '\0']), ('\u{a660}', ['\u{a661}', '\0', - '\0']), ('\u{a662}', ['\u{a663}', '\0', '\0']), ('\u{a664}', ['\u{a665}', '\0', '\0']), - ('\u{a666}', ['\u{a667}', '\0', '\0']), ('\u{a668}', ['\u{a669}', '\0', '\0']), ('\u{a66a}', - ['\u{a66b}', '\0', '\0']), ('\u{a66c}', ['\u{a66d}', '\0', '\0']), ('\u{a680}', ['\u{a681}', - '\0', '\0']), ('\u{a682}', ['\u{a683}', '\0', '\0']), ('\u{a684}', ['\u{a685}', '\0', - '\0']), ('\u{a686}', ['\u{a687}', '\0', '\0']), ('\u{a688}', ['\u{a689}', '\0', '\0']), - ('\u{a68a}', ['\u{a68b}', '\0', '\0']), ('\u{a68c}', ['\u{a68d}', '\0', '\0']), ('\u{a68e}', - ['\u{a68f}', '\0', '\0']), ('\u{a690}', ['\u{a691}', '\0', '\0']), ('\u{a692}', ['\u{a693}', - '\0', '\0']), ('\u{a694}', ['\u{a695}', '\0', '\0']), ('\u{a696}', ['\u{a697}', '\0', - '\0']), ('\u{a698}', ['\u{a699}', '\0', '\0']), ('\u{a69a}', ['\u{a69b}', '\0', '\0']), - ('\u{a722}', ['\u{a723}', '\0', '\0']), ('\u{a724}', ['\u{a725}', '\0', '\0']), ('\u{a726}', - ['\u{a727}', '\0', '\0']), ('\u{a728}', ['\u{a729}', '\0', '\0']), ('\u{a72a}', ['\u{a72b}', - '\0', '\0']), ('\u{a72c}', ['\u{a72d}', '\0', '\0']), ('\u{a72e}', ['\u{a72f}', '\0', - '\0']), ('\u{a732}', ['\u{a733}', '\0', '\0']), ('\u{a734}', ['\u{a735}', '\0', '\0']), - ('\u{a736}', ['\u{a737}', '\0', '\0']), ('\u{a738}', ['\u{a739}', '\0', '\0']), ('\u{a73a}', - ['\u{a73b}', '\0', '\0']), ('\u{a73c}', ['\u{a73d}', '\0', '\0']), ('\u{a73e}', ['\u{a73f}', - '\0', '\0']), ('\u{a740}', ['\u{a741}', '\0', '\0']), ('\u{a742}', ['\u{a743}', '\0', - '\0']), ('\u{a744}', ['\u{a745}', '\0', '\0']), ('\u{a746}', ['\u{a747}', '\0', '\0']), - ('\u{a748}', ['\u{a749}', '\0', '\0']), ('\u{a74a}', ['\u{a74b}', '\0', '\0']), ('\u{a74c}', - ['\u{a74d}', '\0', '\0']), ('\u{a74e}', ['\u{a74f}', '\0', '\0']), ('\u{a750}', ['\u{a751}', - '\0', '\0']), ('\u{a752}', ['\u{a753}', '\0', '\0']), ('\u{a754}', ['\u{a755}', '\0', - '\0']), ('\u{a756}', ['\u{a757}', '\0', '\0']), ('\u{a758}', ['\u{a759}', '\0', '\0']), - ('\u{a75a}', ['\u{a75b}', '\0', '\0']), ('\u{a75c}', ['\u{a75d}', '\0', '\0']), ('\u{a75e}', - ['\u{a75f}', '\0', '\0']), ('\u{a760}', ['\u{a761}', '\0', '\0']), ('\u{a762}', ['\u{a763}', - '\0', '\0']), ('\u{a764}', ['\u{a765}', '\0', '\0']), ('\u{a766}', ['\u{a767}', '\0', - '\0']), ('\u{a768}', ['\u{a769}', '\0', '\0']), ('\u{a76a}', ['\u{a76b}', '\0', '\0']), - ('\u{a76c}', ['\u{a76d}', '\0', '\0']), ('\u{a76e}', ['\u{a76f}', '\0', '\0']), ('\u{a779}', - ['\u{a77a}', '\0', '\0']), ('\u{a77b}', ['\u{a77c}', '\0', '\0']), ('\u{a77d}', ['\u{1d79}', - '\0', '\0']), ('\u{a77e}', ['\u{a77f}', '\0', '\0']), ('\u{a780}', ['\u{a781}', '\0', - '\0']), ('\u{a782}', ['\u{a783}', '\0', '\0']), ('\u{a784}', ['\u{a785}', '\0', '\0']), - ('\u{a786}', ['\u{a787}', '\0', '\0']), ('\u{a78b}', ['\u{a78c}', '\0', '\0']), ('\u{a78d}', - ['\u{265}', '\0', '\0']), ('\u{a790}', ['\u{a791}', '\0', '\0']), ('\u{a792}', ['\u{a793}', - '\0', '\0']), ('\u{a796}', ['\u{a797}', '\0', '\0']), ('\u{a798}', ['\u{a799}', '\0', - '\0']), ('\u{a79a}', ['\u{a79b}', '\0', '\0']), ('\u{a79c}', ['\u{a79d}', '\0', '\0']), - ('\u{a79e}', ['\u{a79f}', '\0', '\0']), ('\u{a7a0}', ['\u{a7a1}', '\0', '\0']), ('\u{a7a2}', - ['\u{a7a3}', '\0', '\0']), ('\u{a7a4}', ['\u{a7a5}', '\0', '\0']), ('\u{a7a6}', ['\u{a7a7}', - '\0', '\0']), ('\u{a7a8}', ['\u{a7a9}', '\0', '\0']), ('\u{a7aa}', ['\u{266}', '\0', '\0']), - ('\u{a7ab}', ['\u{25c}', '\0', '\0']), ('\u{a7ac}', ['\u{261}', '\0', '\0']), ('\u{a7ad}', - ['\u{26c}', '\0', '\0']), ('\u{a7ae}', ['\u{26a}', '\0', '\0']), ('\u{a7b0}', ['\u{29e}', - '\0', '\0']), ('\u{a7b1}', ['\u{287}', '\0', '\0']), ('\u{a7b2}', ['\u{29d}', '\0', '\0']), - ('\u{a7b3}', ['\u{ab53}', '\0', '\0']), ('\u{a7b4}', ['\u{a7b5}', '\0', '\0']), ('\u{a7b6}', - ['\u{a7b7}', '\0', '\0']), ('\u{a7b8}', ['\u{a7b9}', '\0', '\0']), ('\u{a7ba}', ['\u{a7bb}', - '\0', '\0']), ('\u{a7bc}', ['\u{a7bd}', '\0', '\0']), ('\u{a7be}', ['\u{a7bf}', '\0', - '\0']), ('\u{a7c2}', ['\u{a7c3}', '\0', '\0']), ('\u{a7c4}', ['\u{a794}', '\0', '\0']), - ('\u{a7c5}', ['\u{282}', '\0', '\0']), ('\u{a7c6}', ['\u{1d8e}', '\0', '\0']), ('\u{ff21}', - ['\u{ff41}', '\0', '\0']), ('\u{ff22}', ['\u{ff42}', '\0', '\0']), ('\u{ff23}', ['\u{ff43}', - '\0', '\0']), ('\u{ff24}', ['\u{ff44}', '\0', '\0']), ('\u{ff25}', ['\u{ff45}', '\0', - '\0']), ('\u{ff26}', ['\u{ff46}', '\0', '\0']), ('\u{ff27}', ['\u{ff47}', '\0', '\0']), - ('\u{ff28}', ['\u{ff48}', '\0', '\0']), ('\u{ff29}', ['\u{ff49}', '\0', '\0']), ('\u{ff2a}', - ['\u{ff4a}', '\0', '\0']), ('\u{ff2b}', ['\u{ff4b}', '\0', '\0']), ('\u{ff2c}', ['\u{ff4c}', - '\0', '\0']), ('\u{ff2d}', ['\u{ff4d}', '\0', '\0']), ('\u{ff2e}', ['\u{ff4e}', '\0', - '\0']), ('\u{ff2f}', ['\u{ff4f}', '\0', '\0']), ('\u{ff30}', ['\u{ff50}', '\0', '\0']), - ('\u{ff31}', ['\u{ff51}', '\0', '\0']), ('\u{ff32}', ['\u{ff52}', '\0', '\0']), ('\u{ff33}', - ['\u{ff53}', '\0', '\0']), ('\u{ff34}', ['\u{ff54}', '\0', '\0']), ('\u{ff35}', ['\u{ff55}', - '\0', '\0']), ('\u{ff36}', ['\u{ff56}', '\0', '\0']), ('\u{ff37}', ['\u{ff57}', '\0', - '\0']), ('\u{ff38}', ['\u{ff58}', '\0', '\0']), ('\u{ff39}', ['\u{ff59}', '\0', '\0']), - ('\u{ff3a}', ['\u{ff5a}', '\0', '\0']), ('\u{10400}', ['\u{10428}', '\0', '\0']), - ('\u{10401}', ['\u{10429}', '\0', '\0']), ('\u{10402}', ['\u{1042a}', '\0', '\0']), - ('\u{10403}', ['\u{1042b}', '\0', '\0']), ('\u{10404}', ['\u{1042c}', '\0', '\0']), - ('\u{10405}', ['\u{1042d}', '\0', '\0']), ('\u{10406}', ['\u{1042e}', '\0', '\0']), - ('\u{10407}', ['\u{1042f}', '\0', '\0']), ('\u{10408}', ['\u{10430}', '\0', '\0']), - ('\u{10409}', ['\u{10431}', '\0', '\0']), ('\u{1040a}', ['\u{10432}', '\0', '\0']), - ('\u{1040b}', ['\u{10433}', '\0', '\0']), ('\u{1040c}', ['\u{10434}', '\0', '\0']), - ('\u{1040d}', ['\u{10435}', '\0', '\0']), ('\u{1040e}', ['\u{10436}', '\0', '\0']), - ('\u{1040f}', ['\u{10437}', '\0', '\0']), ('\u{10410}', ['\u{10438}', '\0', '\0']), - ('\u{10411}', ['\u{10439}', '\0', '\0']), ('\u{10412}', ['\u{1043a}', '\0', '\0']), - ('\u{10413}', ['\u{1043b}', '\0', '\0']), ('\u{10414}', ['\u{1043c}', '\0', '\0']), - ('\u{10415}', ['\u{1043d}', '\0', '\0']), ('\u{10416}', ['\u{1043e}', '\0', '\0']), - ('\u{10417}', ['\u{1043f}', '\0', '\0']), ('\u{10418}', ['\u{10440}', '\0', '\0']), - ('\u{10419}', ['\u{10441}', '\0', '\0']), ('\u{1041a}', ['\u{10442}', '\0', '\0']), - ('\u{1041b}', ['\u{10443}', '\0', '\0']), ('\u{1041c}', ['\u{10444}', '\0', '\0']), - ('\u{1041d}', ['\u{10445}', '\0', '\0']), ('\u{1041e}', ['\u{10446}', '\0', '\0']), - ('\u{1041f}', ['\u{10447}', '\0', '\0']), ('\u{10420}', ['\u{10448}', '\0', '\0']), - ('\u{10421}', ['\u{10449}', '\0', '\0']), ('\u{10422}', ['\u{1044a}', '\0', '\0']), - ('\u{10423}', ['\u{1044b}', '\0', '\0']), ('\u{10424}', ['\u{1044c}', '\0', '\0']), - ('\u{10425}', ['\u{1044d}', '\0', '\0']), ('\u{10426}', ['\u{1044e}', '\0', '\0']), - ('\u{10427}', ['\u{1044f}', '\0', '\0']), ('\u{104b0}', ['\u{104d8}', '\0', '\0']), - ('\u{104b1}', ['\u{104d9}', '\0', '\0']), ('\u{104b2}', ['\u{104da}', '\0', '\0']), - ('\u{104b3}', ['\u{104db}', '\0', '\0']), ('\u{104b4}', ['\u{104dc}', '\0', '\0']), - ('\u{104b5}', ['\u{104dd}', '\0', '\0']), ('\u{104b6}', ['\u{104de}', '\0', '\0']), - ('\u{104b7}', ['\u{104df}', '\0', '\0']), ('\u{104b8}', ['\u{104e0}', '\0', '\0']), - ('\u{104b9}', ['\u{104e1}', '\0', '\0']), ('\u{104ba}', ['\u{104e2}', '\0', '\0']), - ('\u{104bb}', ['\u{104e3}', '\0', '\0']), ('\u{104bc}', ['\u{104e4}', '\0', '\0']), - ('\u{104bd}', ['\u{104e5}', '\0', '\0']), ('\u{104be}', ['\u{104e6}', '\0', '\0']), - ('\u{104bf}', ['\u{104e7}', '\0', '\0']), ('\u{104c0}', ['\u{104e8}', '\0', '\0']), - ('\u{104c1}', ['\u{104e9}', '\0', '\0']), ('\u{104c2}', ['\u{104ea}', '\0', '\0']), - ('\u{104c3}', ['\u{104eb}', '\0', '\0']), ('\u{104c4}', ['\u{104ec}', '\0', '\0']), - ('\u{104c5}', ['\u{104ed}', '\0', '\0']), ('\u{104c6}', ['\u{104ee}', '\0', '\0']), - ('\u{104c7}', ['\u{104ef}', '\0', '\0']), ('\u{104c8}', ['\u{104f0}', '\0', '\0']), - ('\u{104c9}', ['\u{104f1}', '\0', '\0']), ('\u{104ca}', ['\u{104f2}', '\0', '\0']), - ('\u{104cb}', ['\u{104f3}', '\0', '\0']), ('\u{104cc}', ['\u{104f4}', '\0', '\0']), - ('\u{104cd}', ['\u{104f5}', '\0', '\0']), ('\u{104ce}', ['\u{104f6}', '\0', '\0']), - ('\u{104cf}', ['\u{104f7}', '\0', '\0']), ('\u{104d0}', ['\u{104f8}', '\0', '\0']), - ('\u{104d1}', ['\u{104f9}', '\0', '\0']), ('\u{104d2}', ['\u{104fa}', '\0', '\0']), - ('\u{104d3}', ['\u{104fb}', '\0', '\0']), ('\u{10c80}', ['\u{10cc0}', '\0', '\0']), - ('\u{10c81}', ['\u{10cc1}', '\0', '\0']), ('\u{10c82}', ['\u{10cc2}', '\0', '\0']), - ('\u{10c83}', ['\u{10cc3}', '\0', '\0']), ('\u{10c84}', ['\u{10cc4}', '\0', '\0']), - ('\u{10c85}', ['\u{10cc5}', '\0', '\0']), ('\u{10c86}', ['\u{10cc6}', '\0', '\0']), - ('\u{10c87}', ['\u{10cc7}', '\0', '\0']), ('\u{10c88}', ['\u{10cc8}', '\0', '\0']), - ('\u{10c89}', ['\u{10cc9}', '\0', '\0']), ('\u{10c8a}', ['\u{10cca}', '\0', '\0']), - ('\u{10c8b}', ['\u{10ccb}', '\0', '\0']), ('\u{10c8c}', ['\u{10ccc}', '\0', '\0']), - ('\u{10c8d}', ['\u{10ccd}', '\0', '\0']), ('\u{10c8e}', ['\u{10cce}', '\0', '\0']), - ('\u{10c8f}', ['\u{10ccf}', '\0', '\0']), ('\u{10c90}', ['\u{10cd0}', '\0', '\0']), - ('\u{10c91}', ['\u{10cd1}', '\0', '\0']), ('\u{10c92}', ['\u{10cd2}', '\0', '\0']), - ('\u{10c93}', ['\u{10cd3}', '\0', '\0']), ('\u{10c94}', ['\u{10cd4}', '\0', '\0']), - ('\u{10c95}', ['\u{10cd5}', '\0', '\0']), ('\u{10c96}', ['\u{10cd6}', '\0', '\0']), - ('\u{10c97}', ['\u{10cd7}', '\0', '\0']), ('\u{10c98}', ['\u{10cd8}', '\0', '\0']), - ('\u{10c99}', ['\u{10cd9}', '\0', '\0']), ('\u{10c9a}', ['\u{10cda}', '\0', '\0']), - ('\u{10c9b}', ['\u{10cdb}', '\0', '\0']), ('\u{10c9c}', ['\u{10cdc}', '\0', '\0']), - ('\u{10c9d}', ['\u{10cdd}', '\0', '\0']), ('\u{10c9e}', ['\u{10cde}', '\0', '\0']), - ('\u{10c9f}', ['\u{10cdf}', '\0', '\0']), ('\u{10ca0}', ['\u{10ce0}', '\0', '\0']), - ('\u{10ca1}', ['\u{10ce1}', '\0', '\0']), ('\u{10ca2}', ['\u{10ce2}', '\0', '\0']), - ('\u{10ca3}', ['\u{10ce3}', '\0', '\0']), ('\u{10ca4}', ['\u{10ce4}', '\0', '\0']), - ('\u{10ca5}', ['\u{10ce5}', '\0', '\0']), ('\u{10ca6}', ['\u{10ce6}', '\0', '\0']), - ('\u{10ca7}', ['\u{10ce7}', '\0', '\0']), ('\u{10ca8}', ['\u{10ce8}', '\0', '\0']), - ('\u{10ca9}', ['\u{10ce9}', '\0', '\0']), ('\u{10caa}', ['\u{10cea}', '\0', '\0']), - ('\u{10cab}', ['\u{10ceb}', '\0', '\0']), ('\u{10cac}', ['\u{10cec}', '\0', '\0']), - ('\u{10cad}', ['\u{10ced}', '\0', '\0']), ('\u{10cae}', ['\u{10cee}', '\0', '\0']), - ('\u{10caf}', ['\u{10cef}', '\0', '\0']), ('\u{10cb0}', ['\u{10cf0}', '\0', '\0']), - ('\u{10cb1}', ['\u{10cf1}', '\0', '\0']), ('\u{10cb2}', ['\u{10cf2}', '\0', '\0']), - ('\u{118a0}', ['\u{118c0}', '\0', '\0']), ('\u{118a1}', ['\u{118c1}', '\0', '\0']), - ('\u{118a2}', ['\u{118c2}', '\0', '\0']), ('\u{118a3}', ['\u{118c3}', '\0', '\0']), - ('\u{118a4}', ['\u{118c4}', '\0', '\0']), ('\u{118a5}', ['\u{118c5}', '\0', '\0']), - ('\u{118a6}', ['\u{118c6}', '\0', '\0']), ('\u{118a7}', ['\u{118c7}', '\0', '\0']), - ('\u{118a8}', ['\u{118c8}', '\0', '\0']), ('\u{118a9}', ['\u{118c9}', '\0', '\0']), - ('\u{118aa}', ['\u{118ca}', '\0', '\0']), ('\u{118ab}', ['\u{118cb}', '\0', '\0']), - ('\u{118ac}', ['\u{118cc}', '\0', '\0']), ('\u{118ad}', ['\u{118cd}', '\0', '\0']), - ('\u{118ae}', ['\u{118ce}', '\0', '\0']), ('\u{118af}', ['\u{118cf}', '\0', '\0']), - ('\u{118b0}', ['\u{118d0}', '\0', '\0']), ('\u{118b1}', ['\u{118d1}', '\0', '\0']), - ('\u{118b2}', ['\u{118d2}', '\0', '\0']), ('\u{118b3}', ['\u{118d3}', '\0', '\0']), - ('\u{118b4}', ['\u{118d4}', '\0', '\0']), ('\u{118b5}', ['\u{118d5}', '\0', '\0']), - ('\u{118b6}', ['\u{118d6}', '\0', '\0']), ('\u{118b7}', ['\u{118d7}', '\0', '\0']), - ('\u{118b8}', ['\u{118d8}', '\0', '\0']), ('\u{118b9}', ['\u{118d9}', '\0', '\0']), - ('\u{118ba}', ['\u{118da}', '\0', '\0']), ('\u{118bb}', ['\u{118db}', '\0', '\0']), - ('\u{118bc}', ['\u{118dc}', '\0', '\0']), ('\u{118bd}', ['\u{118dd}', '\0', '\0']), - ('\u{118be}', ['\u{118de}', '\0', '\0']), ('\u{118bf}', ['\u{118df}', '\0', '\0']), - ('\u{16e40}', ['\u{16e60}', '\0', '\0']), ('\u{16e41}', ['\u{16e61}', '\0', '\0']), - ('\u{16e42}', ['\u{16e62}', '\0', '\0']), ('\u{16e43}', ['\u{16e63}', '\0', '\0']), - ('\u{16e44}', ['\u{16e64}', '\0', '\0']), ('\u{16e45}', ['\u{16e65}', '\0', '\0']), - ('\u{16e46}', ['\u{16e66}', '\0', '\0']), ('\u{16e47}', ['\u{16e67}', '\0', '\0']), - ('\u{16e48}', ['\u{16e68}', '\0', '\0']), ('\u{16e49}', ['\u{16e69}', '\0', '\0']), - ('\u{16e4a}', ['\u{16e6a}', '\0', '\0']), ('\u{16e4b}', ['\u{16e6b}', '\0', '\0']), - ('\u{16e4c}', ['\u{16e6c}', '\0', '\0']), ('\u{16e4d}', ['\u{16e6d}', '\0', '\0']), - ('\u{16e4e}', ['\u{16e6e}', '\0', '\0']), ('\u{16e4f}', ['\u{16e6f}', '\0', '\0']), - ('\u{16e50}', ['\u{16e70}', '\0', '\0']), ('\u{16e51}', ['\u{16e71}', '\0', '\0']), - ('\u{16e52}', ['\u{16e72}', '\0', '\0']), ('\u{16e53}', ['\u{16e73}', '\0', '\0']), - ('\u{16e54}', ['\u{16e74}', '\0', '\0']), ('\u{16e55}', ['\u{16e75}', '\0', '\0']), - ('\u{16e56}', ['\u{16e76}', '\0', '\0']), ('\u{16e57}', ['\u{16e77}', '\0', '\0']), - ('\u{16e58}', ['\u{16e78}', '\0', '\0']), ('\u{16e59}', ['\u{16e79}', '\0', '\0']), - ('\u{16e5a}', ['\u{16e7a}', '\0', '\0']), ('\u{16e5b}', ['\u{16e7b}', '\0', '\0']), - ('\u{16e5c}', ['\u{16e7c}', '\0', '\0']), ('\u{16e5d}', ['\u{16e7d}', '\0', '\0']), - ('\u{16e5e}', ['\u{16e7e}', '\0', '\0']), ('\u{16e5f}', ['\u{16e7f}', '\0', '\0']), - ('\u{1e900}', ['\u{1e922}', '\0', '\0']), ('\u{1e901}', ['\u{1e923}', '\0', '\0']), - ('\u{1e902}', ['\u{1e924}', '\0', '\0']), ('\u{1e903}', ['\u{1e925}', '\0', '\0']), - ('\u{1e904}', ['\u{1e926}', '\0', '\0']), ('\u{1e905}', ['\u{1e927}', '\0', '\0']), - ('\u{1e906}', ['\u{1e928}', '\0', '\0']), ('\u{1e907}', ['\u{1e929}', '\0', '\0']), - ('\u{1e908}', ['\u{1e92a}', '\0', '\0']), ('\u{1e909}', ['\u{1e92b}', '\0', '\0']), - ('\u{1e90a}', ['\u{1e92c}', '\0', '\0']), ('\u{1e90b}', ['\u{1e92d}', '\0', '\0']), - ('\u{1e90c}', ['\u{1e92e}', '\0', '\0']), ('\u{1e90d}', ['\u{1e92f}', '\0', '\0']), - ('\u{1e90e}', ['\u{1e930}', '\0', '\0']), ('\u{1e90f}', ['\u{1e931}', '\0', '\0']), - ('\u{1e910}', ['\u{1e932}', '\0', '\0']), ('\u{1e911}', ['\u{1e933}', '\0', '\0']), - ('\u{1e912}', ['\u{1e934}', '\0', '\0']), ('\u{1e913}', ['\u{1e935}', '\0', '\0']), - ('\u{1e914}', ['\u{1e936}', '\0', '\0']), ('\u{1e915}', ['\u{1e937}', '\0', '\0']), - ('\u{1e916}', ['\u{1e938}', '\0', '\0']), ('\u{1e917}', ['\u{1e939}', '\0', '\0']), - ('\u{1e918}', ['\u{1e93a}', '\0', '\0']), ('\u{1e919}', ['\u{1e93b}', '\0', '\0']), - ('\u{1e91a}', ['\u{1e93c}', '\0', '\0']), ('\u{1e91b}', ['\u{1e93d}', '\0', '\0']), - ('\u{1e91c}', ['\u{1e93e}', '\0', '\0']), ('\u{1e91d}', ['\u{1e93f}', '\0', '\0']), - ('\u{1e91e}', ['\u{1e940}', '\0', '\0']), ('\u{1e91f}', ['\u{1e941}', '\0', '\0']), - ('\u{1e920}', ['\u{1e942}', '\0', '\0']), ('\u{1e921}', ['\u{1e943}', '\0', '\0']) - ]; - - #[rustfmt::skip] - const to_uppercase_table: &[(char, [char; 3])] = &[ - ('\u{61}', ['\u{41}', '\0', '\0']), ('\u{62}', ['\u{42}', '\0', '\0']), ('\u{63}', - ['\u{43}', '\0', '\0']), ('\u{64}', ['\u{44}', '\0', '\0']), ('\u{65}', ['\u{45}', '\0', - '\0']), ('\u{66}', ['\u{46}', '\0', '\0']), ('\u{67}', ['\u{47}', '\0', '\0']), ('\u{68}', - ['\u{48}', '\0', '\0']), ('\u{69}', ['\u{49}', '\0', '\0']), ('\u{6a}', ['\u{4a}', '\0', - '\0']), ('\u{6b}', ['\u{4b}', '\0', '\0']), ('\u{6c}', ['\u{4c}', '\0', '\0']), ('\u{6d}', - ['\u{4d}', '\0', '\0']), ('\u{6e}', ['\u{4e}', '\0', '\0']), ('\u{6f}', ['\u{4f}', '\0', - '\0']), ('\u{70}', ['\u{50}', '\0', '\0']), ('\u{71}', ['\u{51}', '\0', '\0']), ('\u{72}', - ['\u{52}', '\0', '\0']), ('\u{73}', ['\u{53}', '\0', '\0']), ('\u{74}', ['\u{54}', '\0', - '\0']), ('\u{75}', ['\u{55}', '\0', '\0']), ('\u{76}', ['\u{56}', '\0', '\0']), ('\u{77}', - ['\u{57}', '\0', '\0']), ('\u{78}', ['\u{58}', '\0', '\0']), ('\u{79}', ['\u{59}', '\0', - '\0']), ('\u{7a}', ['\u{5a}', '\0', '\0']), ('\u{b5}', ['\u{39c}', '\0', '\0']), ('\u{df}', - ['\u{53}', '\u{53}', '\0']), ('\u{e0}', ['\u{c0}', '\0', '\0']), ('\u{e1}', ['\u{c1}', '\0', - '\0']), ('\u{e2}', ['\u{c2}', '\0', '\0']), ('\u{e3}', ['\u{c3}', '\0', '\0']), ('\u{e4}', - ['\u{c4}', '\0', '\0']), ('\u{e5}', ['\u{c5}', '\0', '\0']), ('\u{e6}', ['\u{c6}', '\0', - '\0']), ('\u{e7}', ['\u{c7}', '\0', '\0']), ('\u{e8}', ['\u{c8}', '\0', '\0']), ('\u{e9}', - ['\u{c9}', '\0', '\0']), ('\u{ea}', ['\u{ca}', '\0', '\0']), ('\u{eb}', ['\u{cb}', '\0', - '\0']), ('\u{ec}', ['\u{cc}', '\0', '\0']), ('\u{ed}', ['\u{cd}', '\0', '\0']), ('\u{ee}', - ['\u{ce}', '\0', '\0']), ('\u{ef}', ['\u{cf}', '\0', '\0']), ('\u{f0}', ['\u{d0}', '\0', - '\0']), ('\u{f1}', ['\u{d1}', '\0', '\0']), ('\u{f2}', ['\u{d2}', '\0', '\0']), ('\u{f3}', - ['\u{d3}', '\0', '\0']), ('\u{f4}', ['\u{d4}', '\0', '\0']), ('\u{f5}', ['\u{d5}', '\0', - '\0']), ('\u{f6}', ['\u{d6}', '\0', '\0']), ('\u{f8}', ['\u{d8}', '\0', '\0']), ('\u{f9}', - ['\u{d9}', '\0', '\0']), ('\u{fa}', ['\u{da}', '\0', '\0']), ('\u{fb}', ['\u{db}', '\0', - '\0']), ('\u{fc}', ['\u{dc}', '\0', '\0']), ('\u{fd}', ['\u{dd}', '\0', '\0']), ('\u{fe}', - ['\u{de}', '\0', '\0']), ('\u{ff}', ['\u{178}', '\0', '\0']), ('\u{101}', ['\u{100}', '\0', - '\0']), ('\u{103}', ['\u{102}', '\0', '\0']), ('\u{105}', ['\u{104}', '\0', '\0']), - ('\u{107}', ['\u{106}', '\0', '\0']), ('\u{109}', ['\u{108}', '\0', '\0']), ('\u{10b}', - ['\u{10a}', '\0', '\0']), ('\u{10d}', ['\u{10c}', '\0', '\0']), ('\u{10f}', ['\u{10e}', - '\0', '\0']), ('\u{111}', ['\u{110}', '\0', '\0']), ('\u{113}', ['\u{112}', '\0', '\0']), - ('\u{115}', ['\u{114}', '\0', '\0']), ('\u{117}', ['\u{116}', '\0', '\0']), ('\u{119}', - ['\u{118}', '\0', '\0']), ('\u{11b}', ['\u{11a}', '\0', '\0']), ('\u{11d}', ['\u{11c}', - '\0', '\0']), ('\u{11f}', ['\u{11e}', '\0', '\0']), ('\u{121}', ['\u{120}', '\0', '\0']), - ('\u{123}', ['\u{122}', '\0', '\0']), ('\u{125}', ['\u{124}', '\0', '\0']), ('\u{127}', - ['\u{126}', '\0', '\0']), ('\u{129}', ['\u{128}', '\0', '\0']), ('\u{12b}', ['\u{12a}', - '\0', '\0']), ('\u{12d}', ['\u{12c}', '\0', '\0']), ('\u{12f}', ['\u{12e}', '\0', '\0']), - ('\u{131}', ['\u{49}', '\0', '\0']), ('\u{133}', ['\u{132}', '\0', '\0']), ('\u{135}', - ['\u{134}', '\0', '\0']), ('\u{137}', ['\u{136}', '\0', '\0']), ('\u{13a}', ['\u{139}', - '\0', '\0']), ('\u{13c}', ['\u{13b}', '\0', '\0']), ('\u{13e}', ['\u{13d}', '\0', '\0']), - ('\u{140}', ['\u{13f}', '\0', '\0']), ('\u{142}', ['\u{141}', '\0', '\0']), ('\u{144}', - ['\u{143}', '\0', '\0']), ('\u{146}', ['\u{145}', '\0', '\0']), ('\u{148}', ['\u{147}', - '\0', '\0']), ('\u{149}', ['\u{2bc}', '\u{4e}', '\0']), ('\u{14b}', ['\u{14a}', '\0', - '\0']), ('\u{14d}', ['\u{14c}', '\0', '\0']), ('\u{14f}', ['\u{14e}', '\0', '\0']), - ('\u{151}', ['\u{150}', '\0', '\0']), ('\u{153}', ['\u{152}', '\0', '\0']), ('\u{155}', - ['\u{154}', '\0', '\0']), ('\u{157}', ['\u{156}', '\0', '\0']), ('\u{159}', ['\u{158}', - '\0', '\0']), ('\u{15b}', ['\u{15a}', '\0', '\0']), ('\u{15d}', ['\u{15c}', '\0', '\0']), - ('\u{15f}', ['\u{15e}', '\0', '\0']), ('\u{161}', ['\u{160}', '\0', '\0']), ('\u{163}', - ['\u{162}', '\0', '\0']), ('\u{165}', ['\u{164}', '\0', '\0']), ('\u{167}', ['\u{166}', - '\0', '\0']), ('\u{169}', ['\u{168}', '\0', '\0']), ('\u{16b}', ['\u{16a}', '\0', '\0']), - ('\u{16d}', ['\u{16c}', '\0', '\0']), ('\u{16f}', ['\u{16e}', '\0', '\0']), ('\u{171}', - ['\u{170}', '\0', '\0']), ('\u{173}', ['\u{172}', '\0', '\0']), ('\u{175}', ['\u{174}', - '\0', '\0']), ('\u{177}', ['\u{176}', '\0', '\0']), ('\u{17a}', ['\u{179}', '\0', '\0']), - ('\u{17c}', ['\u{17b}', '\0', '\0']), ('\u{17e}', ['\u{17d}', '\0', '\0']), ('\u{17f}', - ['\u{53}', '\0', '\0']), ('\u{180}', ['\u{243}', '\0', '\0']), ('\u{183}', ['\u{182}', '\0', - '\0']), ('\u{185}', ['\u{184}', '\0', '\0']), ('\u{188}', ['\u{187}', '\0', '\0']), - ('\u{18c}', ['\u{18b}', '\0', '\0']), ('\u{192}', ['\u{191}', '\0', '\0']), ('\u{195}', - ['\u{1f6}', '\0', '\0']), ('\u{199}', ['\u{198}', '\0', '\0']), ('\u{19a}', ['\u{23d}', - '\0', '\0']), ('\u{19e}', ['\u{220}', '\0', '\0']), ('\u{1a1}', ['\u{1a0}', '\0', '\0']), - ('\u{1a3}', ['\u{1a2}', '\0', '\0']), ('\u{1a5}', ['\u{1a4}', '\0', '\0']), ('\u{1a8}', - ['\u{1a7}', '\0', '\0']), ('\u{1ad}', ['\u{1ac}', '\0', '\0']), ('\u{1b0}', ['\u{1af}', - '\0', '\0']), ('\u{1b4}', ['\u{1b3}', '\0', '\0']), ('\u{1b6}', ['\u{1b5}', '\0', '\0']), - ('\u{1b9}', ['\u{1b8}', '\0', '\0']), ('\u{1bd}', ['\u{1bc}', '\0', '\0']), ('\u{1bf}', - ['\u{1f7}', '\0', '\0']), ('\u{1c5}', ['\u{1c4}', '\0', '\0']), ('\u{1c6}', ['\u{1c4}', - '\0', '\0']), ('\u{1c8}', ['\u{1c7}', '\0', '\0']), ('\u{1c9}', ['\u{1c7}', '\0', '\0']), - ('\u{1cb}', ['\u{1ca}', '\0', '\0']), ('\u{1cc}', ['\u{1ca}', '\0', '\0']), ('\u{1ce}', - ['\u{1cd}', '\0', '\0']), ('\u{1d0}', ['\u{1cf}', '\0', '\0']), ('\u{1d2}', ['\u{1d1}', - '\0', '\0']), ('\u{1d4}', ['\u{1d3}', '\0', '\0']), ('\u{1d6}', ['\u{1d5}', '\0', '\0']), - ('\u{1d8}', ['\u{1d7}', '\0', '\0']), ('\u{1da}', ['\u{1d9}', '\0', '\0']), ('\u{1dc}', - ['\u{1db}', '\0', '\0']), ('\u{1dd}', ['\u{18e}', '\0', '\0']), ('\u{1df}', ['\u{1de}', - '\0', '\0']), ('\u{1e1}', ['\u{1e0}', '\0', '\0']), ('\u{1e3}', ['\u{1e2}', '\0', '\0']), - ('\u{1e5}', ['\u{1e4}', '\0', '\0']), ('\u{1e7}', ['\u{1e6}', '\0', '\0']), ('\u{1e9}', - ['\u{1e8}', '\0', '\0']), ('\u{1eb}', ['\u{1ea}', '\0', '\0']), ('\u{1ed}', ['\u{1ec}', - '\0', '\0']), ('\u{1ef}', ['\u{1ee}', '\0', '\0']), ('\u{1f0}', ['\u{4a}', '\u{30c}', - '\0']), ('\u{1f2}', ['\u{1f1}', '\0', '\0']), ('\u{1f3}', ['\u{1f1}', '\0', '\0']), - ('\u{1f5}', ['\u{1f4}', '\0', '\0']), ('\u{1f9}', ['\u{1f8}', '\0', '\0']), ('\u{1fb}', - ['\u{1fa}', '\0', '\0']), ('\u{1fd}', ['\u{1fc}', '\0', '\0']), ('\u{1ff}', ['\u{1fe}', - '\0', '\0']), ('\u{201}', ['\u{200}', '\0', '\0']), ('\u{203}', ['\u{202}', '\0', '\0']), - ('\u{205}', ['\u{204}', '\0', '\0']), ('\u{207}', ['\u{206}', '\0', '\0']), ('\u{209}', - ['\u{208}', '\0', '\0']), ('\u{20b}', ['\u{20a}', '\0', '\0']), ('\u{20d}', ['\u{20c}', - '\0', '\0']), ('\u{20f}', ['\u{20e}', '\0', '\0']), ('\u{211}', ['\u{210}', '\0', '\0']), - ('\u{213}', ['\u{212}', '\0', '\0']), ('\u{215}', ['\u{214}', '\0', '\0']), ('\u{217}', - ['\u{216}', '\0', '\0']), ('\u{219}', ['\u{218}', '\0', '\0']), ('\u{21b}', ['\u{21a}', - '\0', '\0']), ('\u{21d}', ['\u{21c}', '\0', '\0']), ('\u{21f}', ['\u{21e}', '\0', '\0']), - ('\u{223}', ['\u{222}', '\0', '\0']), ('\u{225}', ['\u{224}', '\0', '\0']), ('\u{227}', - ['\u{226}', '\0', '\0']), ('\u{229}', ['\u{228}', '\0', '\0']), ('\u{22b}', ['\u{22a}', - '\0', '\0']), ('\u{22d}', ['\u{22c}', '\0', '\0']), ('\u{22f}', ['\u{22e}', '\0', '\0']), - ('\u{231}', ['\u{230}', '\0', '\0']), ('\u{233}', ['\u{232}', '\0', '\0']), ('\u{23c}', - ['\u{23b}', '\0', '\0']), ('\u{23f}', ['\u{2c7e}', '\0', '\0']), ('\u{240}', ['\u{2c7f}', - '\0', '\0']), ('\u{242}', ['\u{241}', '\0', '\0']), ('\u{247}', ['\u{246}', '\0', '\0']), - ('\u{249}', ['\u{248}', '\0', '\0']), ('\u{24b}', ['\u{24a}', '\0', '\0']), ('\u{24d}', - ['\u{24c}', '\0', '\0']), ('\u{24f}', ['\u{24e}', '\0', '\0']), ('\u{250}', ['\u{2c6f}', - '\0', '\0']), ('\u{251}', ['\u{2c6d}', '\0', '\0']), ('\u{252}', ['\u{2c70}', '\0', '\0']), - ('\u{253}', ['\u{181}', '\0', '\0']), ('\u{254}', ['\u{186}', '\0', '\0']), ('\u{256}', - ['\u{189}', '\0', '\0']), ('\u{257}', ['\u{18a}', '\0', '\0']), ('\u{259}', ['\u{18f}', - '\0', '\0']), ('\u{25b}', ['\u{190}', '\0', '\0']), ('\u{25c}', ['\u{a7ab}', '\0', '\0']), - ('\u{260}', ['\u{193}', '\0', '\0']), ('\u{261}', ['\u{a7ac}', '\0', '\0']), ('\u{263}', - ['\u{194}', '\0', '\0']), ('\u{265}', ['\u{a78d}', '\0', '\0']), ('\u{266}', ['\u{a7aa}', - '\0', '\0']), ('\u{268}', ['\u{197}', '\0', '\0']), ('\u{269}', ['\u{196}', '\0', '\0']), - ('\u{26a}', ['\u{a7ae}', '\0', '\0']), ('\u{26b}', ['\u{2c62}', '\0', '\0']), ('\u{26c}', - ['\u{a7ad}', '\0', '\0']), ('\u{26f}', ['\u{19c}', '\0', '\0']), ('\u{271}', ['\u{2c6e}', - '\0', '\0']), ('\u{272}', ['\u{19d}', '\0', '\0']), ('\u{275}', ['\u{19f}', '\0', '\0']), - ('\u{27d}', ['\u{2c64}', '\0', '\0']), ('\u{280}', ['\u{1a6}', '\0', '\0']), ('\u{282}', - ['\u{a7c5}', '\0', '\0']), ('\u{283}', ['\u{1a9}', '\0', '\0']), ('\u{287}', ['\u{a7b1}', - '\0', '\0']), ('\u{288}', ['\u{1ae}', '\0', '\0']), ('\u{289}', ['\u{244}', '\0', '\0']), - ('\u{28a}', ['\u{1b1}', '\0', '\0']), ('\u{28b}', ['\u{1b2}', '\0', '\0']), ('\u{28c}', - ['\u{245}', '\0', '\0']), ('\u{292}', ['\u{1b7}', '\0', '\0']), ('\u{29d}', ['\u{a7b2}', - '\0', '\0']), ('\u{29e}', ['\u{a7b0}', '\0', '\0']), ('\u{345}', ['\u{399}', '\0', '\0']), - ('\u{371}', ['\u{370}', '\0', '\0']), ('\u{373}', ['\u{372}', '\0', '\0']), ('\u{377}', - ['\u{376}', '\0', '\0']), ('\u{37b}', ['\u{3fd}', '\0', '\0']), ('\u{37c}', ['\u{3fe}', - '\0', '\0']), ('\u{37d}', ['\u{3ff}', '\0', '\0']), ('\u{390}', ['\u{399}', '\u{308}', - '\u{301}']), ('\u{3ac}', ['\u{386}', '\0', '\0']), ('\u{3ad}', ['\u{388}', '\0', '\0']), - ('\u{3ae}', ['\u{389}', '\0', '\0']), ('\u{3af}', ['\u{38a}', '\0', '\0']), ('\u{3b0}', - ['\u{3a5}', '\u{308}', '\u{301}']), ('\u{3b1}', ['\u{391}', '\0', '\0']), ('\u{3b2}', - ['\u{392}', '\0', '\0']), ('\u{3b3}', ['\u{393}', '\0', '\0']), ('\u{3b4}', ['\u{394}', - '\0', '\0']), ('\u{3b5}', ['\u{395}', '\0', '\0']), ('\u{3b6}', ['\u{396}', '\0', '\0']), - ('\u{3b7}', ['\u{397}', '\0', '\0']), ('\u{3b8}', ['\u{398}', '\0', '\0']), ('\u{3b9}', - ['\u{399}', '\0', '\0']), ('\u{3ba}', ['\u{39a}', '\0', '\0']), ('\u{3bb}', ['\u{39b}', - '\0', '\0']), ('\u{3bc}', ['\u{39c}', '\0', '\0']), ('\u{3bd}', ['\u{39d}', '\0', '\0']), - ('\u{3be}', ['\u{39e}', '\0', '\0']), ('\u{3bf}', ['\u{39f}', '\0', '\0']), ('\u{3c0}', - ['\u{3a0}', '\0', '\0']), ('\u{3c1}', ['\u{3a1}', '\0', '\0']), ('\u{3c2}', ['\u{3a3}', - '\0', '\0']), ('\u{3c3}', ['\u{3a3}', '\0', '\0']), ('\u{3c4}', ['\u{3a4}', '\0', '\0']), - ('\u{3c5}', ['\u{3a5}', '\0', '\0']), ('\u{3c6}', ['\u{3a6}', '\0', '\0']), ('\u{3c7}', - ['\u{3a7}', '\0', '\0']), ('\u{3c8}', ['\u{3a8}', '\0', '\0']), ('\u{3c9}', ['\u{3a9}', - '\0', '\0']), ('\u{3ca}', ['\u{3aa}', '\0', '\0']), ('\u{3cb}', ['\u{3ab}', '\0', '\0']), - ('\u{3cc}', ['\u{38c}', '\0', '\0']), ('\u{3cd}', ['\u{38e}', '\0', '\0']), ('\u{3ce}', - ['\u{38f}', '\0', '\0']), ('\u{3d0}', ['\u{392}', '\0', '\0']), ('\u{3d1}', ['\u{398}', - '\0', '\0']), ('\u{3d5}', ['\u{3a6}', '\0', '\0']), ('\u{3d6}', ['\u{3a0}', '\0', '\0']), - ('\u{3d7}', ['\u{3cf}', '\0', '\0']), ('\u{3d9}', ['\u{3d8}', '\0', '\0']), ('\u{3db}', - ['\u{3da}', '\0', '\0']), ('\u{3dd}', ['\u{3dc}', '\0', '\0']), ('\u{3df}', ['\u{3de}', - '\0', '\0']), ('\u{3e1}', ['\u{3e0}', '\0', '\0']), ('\u{3e3}', ['\u{3e2}', '\0', '\0']), - ('\u{3e5}', ['\u{3e4}', '\0', '\0']), ('\u{3e7}', ['\u{3e6}', '\0', '\0']), ('\u{3e9}', - ['\u{3e8}', '\0', '\0']), ('\u{3eb}', ['\u{3ea}', '\0', '\0']), ('\u{3ed}', ['\u{3ec}', - '\0', '\0']), ('\u{3ef}', ['\u{3ee}', '\0', '\0']), ('\u{3f0}', ['\u{39a}', '\0', '\0']), - ('\u{3f1}', ['\u{3a1}', '\0', '\0']), ('\u{3f2}', ['\u{3f9}', '\0', '\0']), ('\u{3f3}', - ['\u{37f}', '\0', '\0']), ('\u{3f5}', ['\u{395}', '\0', '\0']), ('\u{3f8}', ['\u{3f7}', - '\0', '\0']), ('\u{3fb}', ['\u{3fa}', '\0', '\0']), ('\u{430}', ['\u{410}', '\0', '\0']), - ('\u{431}', ['\u{411}', '\0', '\0']), ('\u{432}', ['\u{412}', '\0', '\0']), ('\u{433}', - ['\u{413}', '\0', '\0']), ('\u{434}', ['\u{414}', '\0', '\0']), ('\u{435}', ['\u{415}', - '\0', '\0']), ('\u{436}', ['\u{416}', '\0', '\0']), ('\u{437}', ['\u{417}', '\0', '\0']), - ('\u{438}', ['\u{418}', '\0', '\0']), ('\u{439}', ['\u{419}', '\0', '\0']), ('\u{43a}', - ['\u{41a}', '\0', '\0']), ('\u{43b}', ['\u{41b}', '\0', '\0']), ('\u{43c}', ['\u{41c}', - '\0', '\0']), ('\u{43d}', ['\u{41d}', '\0', '\0']), ('\u{43e}', ['\u{41e}', '\0', '\0']), - ('\u{43f}', ['\u{41f}', '\0', '\0']), ('\u{440}', ['\u{420}', '\0', '\0']), ('\u{441}', - ['\u{421}', '\0', '\0']), ('\u{442}', ['\u{422}', '\0', '\0']), ('\u{443}', ['\u{423}', - '\0', '\0']), ('\u{444}', ['\u{424}', '\0', '\0']), ('\u{445}', ['\u{425}', '\0', '\0']), - ('\u{446}', ['\u{426}', '\0', '\0']), ('\u{447}', ['\u{427}', '\0', '\0']), ('\u{448}', - ['\u{428}', '\0', '\0']), ('\u{449}', ['\u{429}', '\0', '\0']), ('\u{44a}', ['\u{42a}', - '\0', '\0']), ('\u{44b}', ['\u{42b}', '\0', '\0']), ('\u{44c}', ['\u{42c}', '\0', '\0']), - ('\u{44d}', ['\u{42d}', '\0', '\0']), ('\u{44e}', ['\u{42e}', '\0', '\0']), ('\u{44f}', - ['\u{42f}', '\0', '\0']), ('\u{450}', ['\u{400}', '\0', '\0']), ('\u{451}', ['\u{401}', - '\0', '\0']), ('\u{452}', ['\u{402}', '\0', '\0']), ('\u{453}', ['\u{403}', '\0', '\0']), - ('\u{454}', ['\u{404}', '\0', '\0']), ('\u{455}', ['\u{405}', '\0', '\0']), ('\u{456}', - ['\u{406}', '\0', '\0']), ('\u{457}', ['\u{407}', '\0', '\0']), ('\u{458}', ['\u{408}', - '\0', '\0']), ('\u{459}', ['\u{409}', '\0', '\0']), ('\u{45a}', ['\u{40a}', '\0', '\0']), - ('\u{45b}', ['\u{40b}', '\0', '\0']), ('\u{45c}', ['\u{40c}', '\0', '\0']), ('\u{45d}', - ['\u{40d}', '\0', '\0']), ('\u{45e}', ['\u{40e}', '\0', '\0']), ('\u{45f}', ['\u{40f}', - '\0', '\0']), ('\u{461}', ['\u{460}', '\0', '\0']), ('\u{463}', ['\u{462}', '\0', '\0']), - ('\u{465}', ['\u{464}', '\0', '\0']), ('\u{467}', ['\u{466}', '\0', '\0']), ('\u{469}', - ['\u{468}', '\0', '\0']), ('\u{46b}', ['\u{46a}', '\0', '\0']), ('\u{46d}', ['\u{46c}', - '\0', '\0']), ('\u{46f}', ['\u{46e}', '\0', '\0']), ('\u{471}', ['\u{470}', '\0', '\0']), - ('\u{473}', ['\u{472}', '\0', '\0']), ('\u{475}', ['\u{474}', '\0', '\0']), ('\u{477}', - ['\u{476}', '\0', '\0']), ('\u{479}', ['\u{478}', '\0', '\0']), ('\u{47b}', ['\u{47a}', - '\0', '\0']), ('\u{47d}', ['\u{47c}', '\0', '\0']), ('\u{47f}', ['\u{47e}', '\0', '\0']), - ('\u{481}', ['\u{480}', '\0', '\0']), ('\u{48b}', ['\u{48a}', '\0', '\0']), ('\u{48d}', - ['\u{48c}', '\0', '\0']), ('\u{48f}', ['\u{48e}', '\0', '\0']), ('\u{491}', ['\u{490}', - '\0', '\0']), ('\u{493}', ['\u{492}', '\0', '\0']), ('\u{495}', ['\u{494}', '\0', '\0']), - ('\u{497}', ['\u{496}', '\0', '\0']), ('\u{499}', ['\u{498}', '\0', '\0']), ('\u{49b}', - ['\u{49a}', '\0', '\0']), ('\u{49d}', ['\u{49c}', '\0', '\0']), ('\u{49f}', ['\u{49e}', - '\0', '\0']), ('\u{4a1}', ['\u{4a0}', '\0', '\0']), ('\u{4a3}', ['\u{4a2}', '\0', '\0']), - ('\u{4a5}', ['\u{4a4}', '\0', '\0']), ('\u{4a7}', ['\u{4a6}', '\0', '\0']), ('\u{4a9}', - ['\u{4a8}', '\0', '\0']), ('\u{4ab}', ['\u{4aa}', '\0', '\0']), ('\u{4ad}', ['\u{4ac}', - '\0', '\0']), ('\u{4af}', ['\u{4ae}', '\0', '\0']), ('\u{4b1}', ['\u{4b0}', '\0', '\0']), - ('\u{4b3}', ['\u{4b2}', '\0', '\0']), ('\u{4b5}', ['\u{4b4}', '\0', '\0']), ('\u{4b7}', - ['\u{4b6}', '\0', '\0']), ('\u{4b9}', ['\u{4b8}', '\0', '\0']), ('\u{4bb}', ['\u{4ba}', - '\0', '\0']), ('\u{4bd}', ['\u{4bc}', '\0', '\0']), ('\u{4bf}', ['\u{4be}', '\0', '\0']), - ('\u{4c2}', ['\u{4c1}', '\0', '\0']), ('\u{4c4}', ['\u{4c3}', '\0', '\0']), ('\u{4c6}', - ['\u{4c5}', '\0', '\0']), ('\u{4c8}', ['\u{4c7}', '\0', '\0']), ('\u{4ca}', ['\u{4c9}', - '\0', '\0']), ('\u{4cc}', ['\u{4cb}', '\0', '\0']), ('\u{4ce}', ['\u{4cd}', '\0', '\0']), - ('\u{4cf}', ['\u{4c0}', '\0', '\0']), ('\u{4d1}', ['\u{4d0}', '\0', '\0']), ('\u{4d3}', - ['\u{4d2}', '\0', '\0']), ('\u{4d5}', ['\u{4d4}', '\0', '\0']), ('\u{4d7}', ['\u{4d6}', - '\0', '\0']), ('\u{4d9}', ['\u{4d8}', '\0', '\0']), ('\u{4db}', ['\u{4da}', '\0', '\0']), - ('\u{4dd}', ['\u{4dc}', '\0', '\0']), ('\u{4df}', ['\u{4de}', '\0', '\0']), ('\u{4e1}', - ['\u{4e0}', '\0', '\0']), ('\u{4e3}', ['\u{4e2}', '\0', '\0']), ('\u{4e5}', ['\u{4e4}', - '\0', '\0']), ('\u{4e7}', ['\u{4e6}', '\0', '\0']), ('\u{4e9}', ['\u{4e8}', '\0', '\0']), - ('\u{4eb}', ['\u{4ea}', '\0', '\0']), ('\u{4ed}', ['\u{4ec}', '\0', '\0']), ('\u{4ef}', - ['\u{4ee}', '\0', '\0']), ('\u{4f1}', ['\u{4f0}', '\0', '\0']), ('\u{4f3}', ['\u{4f2}', - '\0', '\0']), ('\u{4f5}', ['\u{4f4}', '\0', '\0']), ('\u{4f7}', ['\u{4f6}', '\0', '\0']), - ('\u{4f9}', ['\u{4f8}', '\0', '\0']), ('\u{4fb}', ['\u{4fa}', '\0', '\0']), ('\u{4fd}', - ['\u{4fc}', '\0', '\0']), ('\u{4ff}', ['\u{4fe}', '\0', '\0']), ('\u{501}', ['\u{500}', - '\0', '\0']), ('\u{503}', ['\u{502}', '\0', '\0']), ('\u{505}', ['\u{504}', '\0', '\0']), - ('\u{507}', ['\u{506}', '\0', '\0']), ('\u{509}', ['\u{508}', '\0', '\0']), ('\u{50b}', - ['\u{50a}', '\0', '\0']), ('\u{50d}', ['\u{50c}', '\0', '\0']), ('\u{50f}', ['\u{50e}', - '\0', '\0']), ('\u{511}', ['\u{510}', '\0', '\0']), ('\u{513}', ['\u{512}', '\0', '\0']), - ('\u{515}', ['\u{514}', '\0', '\0']), ('\u{517}', ['\u{516}', '\0', '\0']), ('\u{519}', - ['\u{518}', '\0', '\0']), ('\u{51b}', ['\u{51a}', '\0', '\0']), ('\u{51d}', ['\u{51c}', - '\0', '\0']), ('\u{51f}', ['\u{51e}', '\0', '\0']), ('\u{521}', ['\u{520}', '\0', '\0']), - ('\u{523}', ['\u{522}', '\0', '\0']), ('\u{525}', ['\u{524}', '\0', '\0']), ('\u{527}', - ['\u{526}', '\0', '\0']), ('\u{529}', ['\u{528}', '\0', '\0']), ('\u{52b}', ['\u{52a}', - '\0', '\0']), ('\u{52d}', ['\u{52c}', '\0', '\0']), ('\u{52f}', ['\u{52e}', '\0', '\0']), - ('\u{561}', ['\u{531}', '\0', '\0']), ('\u{562}', ['\u{532}', '\0', '\0']), ('\u{563}', - ['\u{533}', '\0', '\0']), ('\u{564}', ['\u{534}', '\0', '\0']), ('\u{565}', ['\u{535}', - '\0', '\0']), ('\u{566}', ['\u{536}', '\0', '\0']), ('\u{567}', ['\u{537}', '\0', '\0']), - ('\u{568}', ['\u{538}', '\0', '\0']), ('\u{569}', ['\u{539}', '\0', '\0']), ('\u{56a}', - ['\u{53a}', '\0', '\0']), ('\u{56b}', ['\u{53b}', '\0', '\0']), ('\u{56c}', ['\u{53c}', - '\0', '\0']), ('\u{56d}', ['\u{53d}', '\0', '\0']), ('\u{56e}', ['\u{53e}', '\0', '\0']), - ('\u{56f}', ['\u{53f}', '\0', '\0']), ('\u{570}', ['\u{540}', '\0', '\0']), ('\u{571}', - ['\u{541}', '\0', '\0']), ('\u{572}', ['\u{542}', '\0', '\0']), ('\u{573}', ['\u{543}', - '\0', '\0']), ('\u{574}', ['\u{544}', '\0', '\0']), ('\u{575}', ['\u{545}', '\0', '\0']), - ('\u{576}', ['\u{546}', '\0', '\0']), ('\u{577}', ['\u{547}', '\0', '\0']), ('\u{578}', - ['\u{548}', '\0', '\0']), ('\u{579}', ['\u{549}', '\0', '\0']), ('\u{57a}', ['\u{54a}', - '\0', '\0']), ('\u{57b}', ['\u{54b}', '\0', '\0']), ('\u{57c}', ['\u{54c}', '\0', '\0']), - ('\u{57d}', ['\u{54d}', '\0', '\0']), ('\u{57e}', ['\u{54e}', '\0', '\0']), ('\u{57f}', - ['\u{54f}', '\0', '\0']), ('\u{580}', ['\u{550}', '\0', '\0']), ('\u{581}', ['\u{551}', - '\0', '\0']), ('\u{582}', ['\u{552}', '\0', '\0']), ('\u{583}', ['\u{553}', '\0', '\0']), - ('\u{584}', ['\u{554}', '\0', '\0']), ('\u{585}', ['\u{555}', '\0', '\0']), ('\u{586}', - ['\u{556}', '\0', '\0']), ('\u{587}', ['\u{535}', '\u{552}', '\0']), ('\u{10d0}', - ['\u{1c90}', '\0', '\0']), ('\u{10d1}', ['\u{1c91}', '\0', '\0']), ('\u{10d2}', ['\u{1c92}', - '\0', '\0']), ('\u{10d3}', ['\u{1c93}', '\0', '\0']), ('\u{10d4}', ['\u{1c94}', '\0', - '\0']), ('\u{10d5}', ['\u{1c95}', '\0', '\0']), ('\u{10d6}', ['\u{1c96}', '\0', '\0']), - ('\u{10d7}', ['\u{1c97}', '\0', '\0']), ('\u{10d8}', ['\u{1c98}', '\0', '\0']), ('\u{10d9}', - ['\u{1c99}', '\0', '\0']), ('\u{10da}', ['\u{1c9a}', '\0', '\0']), ('\u{10db}', ['\u{1c9b}', - '\0', '\0']), ('\u{10dc}', ['\u{1c9c}', '\0', '\0']), ('\u{10dd}', ['\u{1c9d}', '\0', - '\0']), ('\u{10de}', ['\u{1c9e}', '\0', '\0']), ('\u{10df}', ['\u{1c9f}', '\0', '\0']), - ('\u{10e0}', ['\u{1ca0}', '\0', '\0']), ('\u{10e1}', ['\u{1ca1}', '\0', '\0']), ('\u{10e2}', - ['\u{1ca2}', '\0', '\0']), ('\u{10e3}', ['\u{1ca3}', '\0', '\0']), ('\u{10e4}', ['\u{1ca4}', - '\0', '\0']), ('\u{10e5}', ['\u{1ca5}', '\0', '\0']), ('\u{10e6}', ['\u{1ca6}', '\0', - '\0']), ('\u{10e7}', ['\u{1ca7}', '\0', '\0']), ('\u{10e8}', ['\u{1ca8}', '\0', '\0']), - ('\u{10e9}', ['\u{1ca9}', '\0', '\0']), ('\u{10ea}', ['\u{1caa}', '\0', '\0']), ('\u{10eb}', - ['\u{1cab}', '\0', '\0']), ('\u{10ec}', ['\u{1cac}', '\0', '\0']), ('\u{10ed}', ['\u{1cad}', - '\0', '\0']), ('\u{10ee}', ['\u{1cae}', '\0', '\0']), ('\u{10ef}', ['\u{1caf}', '\0', - '\0']), ('\u{10f0}', ['\u{1cb0}', '\0', '\0']), ('\u{10f1}', ['\u{1cb1}', '\0', '\0']), - ('\u{10f2}', ['\u{1cb2}', '\0', '\0']), ('\u{10f3}', ['\u{1cb3}', '\0', '\0']), ('\u{10f4}', - ['\u{1cb4}', '\0', '\0']), ('\u{10f5}', ['\u{1cb5}', '\0', '\0']), ('\u{10f6}', ['\u{1cb6}', - '\0', '\0']), ('\u{10f7}', ['\u{1cb7}', '\0', '\0']), ('\u{10f8}', ['\u{1cb8}', '\0', - '\0']), ('\u{10f9}', ['\u{1cb9}', '\0', '\0']), ('\u{10fa}', ['\u{1cba}', '\0', '\0']), - ('\u{10fd}', ['\u{1cbd}', '\0', '\0']), ('\u{10fe}', ['\u{1cbe}', '\0', '\0']), ('\u{10ff}', - ['\u{1cbf}', '\0', '\0']), ('\u{13f8}', ['\u{13f0}', '\0', '\0']), ('\u{13f9}', ['\u{13f1}', - '\0', '\0']), ('\u{13fa}', ['\u{13f2}', '\0', '\0']), ('\u{13fb}', ['\u{13f3}', '\0', - '\0']), ('\u{13fc}', ['\u{13f4}', '\0', '\0']), ('\u{13fd}', ['\u{13f5}', '\0', '\0']), - ('\u{1c80}', ['\u{412}', '\0', '\0']), ('\u{1c81}', ['\u{414}', '\0', '\0']), ('\u{1c82}', - ['\u{41e}', '\0', '\0']), ('\u{1c83}', ['\u{421}', '\0', '\0']), ('\u{1c84}', ['\u{422}', - '\0', '\0']), ('\u{1c85}', ['\u{422}', '\0', '\0']), ('\u{1c86}', ['\u{42a}', '\0', '\0']), - ('\u{1c87}', ['\u{462}', '\0', '\0']), ('\u{1c88}', ['\u{a64a}', '\0', '\0']), ('\u{1d79}', - ['\u{a77d}', '\0', '\0']), ('\u{1d7d}', ['\u{2c63}', '\0', '\0']), ('\u{1d8e}', ['\u{a7c6}', - '\0', '\0']), ('\u{1e01}', ['\u{1e00}', '\0', '\0']), ('\u{1e03}', ['\u{1e02}', '\0', - '\0']), ('\u{1e05}', ['\u{1e04}', '\0', '\0']), ('\u{1e07}', ['\u{1e06}', '\0', '\0']), - ('\u{1e09}', ['\u{1e08}', '\0', '\0']), ('\u{1e0b}', ['\u{1e0a}', '\0', '\0']), ('\u{1e0d}', - ['\u{1e0c}', '\0', '\0']), ('\u{1e0f}', ['\u{1e0e}', '\0', '\0']), ('\u{1e11}', ['\u{1e10}', - '\0', '\0']), ('\u{1e13}', ['\u{1e12}', '\0', '\0']), ('\u{1e15}', ['\u{1e14}', '\0', - '\0']), ('\u{1e17}', ['\u{1e16}', '\0', '\0']), ('\u{1e19}', ['\u{1e18}', '\0', '\0']), - ('\u{1e1b}', ['\u{1e1a}', '\0', '\0']), ('\u{1e1d}', ['\u{1e1c}', '\0', '\0']), ('\u{1e1f}', - ['\u{1e1e}', '\0', '\0']), ('\u{1e21}', ['\u{1e20}', '\0', '\0']), ('\u{1e23}', ['\u{1e22}', - '\0', '\0']), ('\u{1e25}', ['\u{1e24}', '\0', '\0']), ('\u{1e27}', ['\u{1e26}', '\0', - '\0']), ('\u{1e29}', ['\u{1e28}', '\0', '\0']), ('\u{1e2b}', ['\u{1e2a}', '\0', '\0']), - ('\u{1e2d}', ['\u{1e2c}', '\0', '\0']), ('\u{1e2f}', ['\u{1e2e}', '\0', '\0']), ('\u{1e31}', - ['\u{1e30}', '\0', '\0']), ('\u{1e33}', ['\u{1e32}', '\0', '\0']), ('\u{1e35}', ['\u{1e34}', - '\0', '\0']), ('\u{1e37}', ['\u{1e36}', '\0', '\0']), ('\u{1e39}', ['\u{1e38}', '\0', - '\0']), ('\u{1e3b}', ['\u{1e3a}', '\0', '\0']), ('\u{1e3d}', ['\u{1e3c}', '\0', '\0']), - ('\u{1e3f}', ['\u{1e3e}', '\0', '\0']), ('\u{1e41}', ['\u{1e40}', '\0', '\0']), ('\u{1e43}', - ['\u{1e42}', '\0', '\0']), ('\u{1e45}', ['\u{1e44}', '\0', '\0']), ('\u{1e47}', ['\u{1e46}', - '\0', '\0']), ('\u{1e49}', ['\u{1e48}', '\0', '\0']), ('\u{1e4b}', ['\u{1e4a}', '\0', - '\0']), ('\u{1e4d}', ['\u{1e4c}', '\0', '\0']), ('\u{1e4f}', ['\u{1e4e}', '\0', '\0']), - ('\u{1e51}', ['\u{1e50}', '\0', '\0']), ('\u{1e53}', ['\u{1e52}', '\0', '\0']), ('\u{1e55}', - ['\u{1e54}', '\0', '\0']), ('\u{1e57}', ['\u{1e56}', '\0', '\0']), ('\u{1e59}', ['\u{1e58}', - '\0', '\0']), ('\u{1e5b}', ['\u{1e5a}', '\0', '\0']), ('\u{1e5d}', ['\u{1e5c}', '\0', - '\0']), ('\u{1e5f}', ['\u{1e5e}', '\0', '\0']), ('\u{1e61}', ['\u{1e60}', '\0', '\0']), - ('\u{1e63}', ['\u{1e62}', '\0', '\0']), ('\u{1e65}', ['\u{1e64}', '\0', '\0']), ('\u{1e67}', - ['\u{1e66}', '\0', '\0']), ('\u{1e69}', ['\u{1e68}', '\0', '\0']), ('\u{1e6b}', ['\u{1e6a}', - '\0', '\0']), ('\u{1e6d}', ['\u{1e6c}', '\0', '\0']), ('\u{1e6f}', ['\u{1e6e}', '\0', - '\0']), ('\u{1e71}', ['\u{1e70}', '\0', '\0']), ('\u{1e73}', ['\u{1e72}', '\0', '\0']), - ('\u{1e75}', ['\u{1e74}', '\0', '\0']), ('\u{1e77}', ['\u{1e76}', '\0', '\0']), ('\u{1e79}', - ['\u{1e78}', '\0', '\0']), ('\u{1e7b}', ['\u{1e7a}', '\0', '\0']), ('\u{1e7d}', ['\u{1e7c}', - '\0', '\0']), ('\u{1e7f}', ['\u{1e7e}', '\0', '\0']), ('\u{1e81}', ['\u{1e80}', '\0', - '\0']), ('\u{1e83}', ['\u{1e82}', '\0', '\0']), ('\u{1e85}', ['\u{1e84}', '\0', '\0']), - ('\u{1e87}', ['\u{1e86}', '\0', '\0']), ('\u{1e89}', ['\u{1e88}', '\0', '\0']), ('\u{1e8b}', - ['\u{1e8a}', '\0', '\0']), ('\u{1e8d}', ['\u{1e8c}', '\0', '\0']), ('\u{1e8f}', ['\u{1e8e}', - '\0', '\0']), ('\u{1e91}', ['\u{1e90}', '\0', '\0']), ('\u{1e93}', ['\u{1e92}', '\0', - '\0']), ('\u{1e95}', ['\u{1e94}', '\0', '\0']), ('\u{1e96}', ['\u{48}', '\u{331}', '\0']), - ('\u{1e97}', ['\u{54}', '\u{308}', '\0']), ('\u{1e98}', ['\u{57}', '\u{30a}', '\0']), - ('\u{1e99}', ['\u{59}', '\u{30a}', '\0']), ('\u{1e9a}', ['\u{41}', '\u{2be}', '\0']), - ('\u{1e9b}', ['\u{1e60}', '\0', '\0']), ('\u{1ea1}', ['\u{1ea0}', '\0', '\0']), ('\u{1ea3}', - ['\u{1ea2}', '\0', '\0']), ('\u{1ea5}', ['\u{1ea4}', '\0', '\0']), ('\u{1ea7}', ['\u{1ea6}', - '\0', '\0']), ('\u{1ea9}', ['\u{1ea8}', '\0', '\0']), ('\u{1eab}', ['\u{1eaa}', '\0', - '\0']), ('\u{1ead}', ['\u{1eac}', '\0', '\0']), ('\u{1eaf}', ['\u{1eae}', '\0', '\0']), - ('\u{1eb1}', ['\u{1eb0}', '\0', '\0']), ('\u{1eb3}', ['\u{1eb2}', '\0', '\0']), ('\u{1eb5}', - ['\u{1eb4}', '\0', '\0']), ('\u{1eb7}', ['\u{1eb6}', '\0', '\0']), ('\u{1eb9}', ['\u{1eb8}', - '\0', '\0']), ('\u{1ebb}', ['\u{1eba}', '\0', '\0']), ('\u{1ebd}', ['\u{1ebc}', '\0', - '\0']), ('\u{1ebf}', ['\u{1ebe}', '\0', '\0']), ('\u{1ec1}', ['\u{1ec0}', '\0', '\0']), - ('\u{1ec3}', ['\u{1ec2}', '\0', '\0']), ('\u{1ec5}', ['\u{1ec4}', '\0', '\0']), ('\u{1ec7}', - ['\u{1ec6}', '\0', '\0']), ('\u{1ec9}', ['\u{1ec8}', '\0', '\0']), ('\u{1ecb}', ['\u{1eca}', - '\0', '\0']), ('\u{1ecd}', ['\u{1ecc}', '\0', '\0']), ('\u{1ecf}', ['\u{1ece}', '\0', - '\0']), ('\u{1ed1}', ['\u{1ed0}', '\0', '\0']), ('\u{1ed3}', ['\u{1ed2}', '\0', '\0']), - ('\u{1ed5}', ['\u{1ed4}', '\0', '\0']), ('\u{1ed7}', ['\u{1ed6}', '\0', '\0']), ('\u{1ed9}', - ['\u{1ed8}', '\0', '\0']), ('\u{1edb}', ['\u{1eda}', '\0', '\0']), ('\u{1edd}', ['\u{1edc}', - '\0', '\0']), ('\u{1edf}', ['\u{1ede}', '\0', '\0']), ('\u{1ee1}', ['\u{1ee0}', '\0', - '\0']), ('\u{1ee3}', ['\u{1ee2}', '\0', '\0']), ('\u{1ee5}', ['\u{1ee4}', '\0', '\0']), - ('\u{1ee7}', ['\u{1ee6}', '\0', '\0']), ('\u{1ee9}', ['\u{1ee8}', '\0', '\0']), ('\u{1eeb}', - ['\u{1eea}', '\0', '\0']), ('\u{1eed}', ['\u{1eec}', '\0', '\0']), ('\u{1eef}', ['\u{1eee}', - '\0', '\0']), ('\u{1ef1}', ['\u{1ef0}', '\0', '\0']), ('\u{1ef3}', ['\u{1ef2}', '\0', - '\0']), ('\u{1ef5}', ['\u{1ef4}', '\0', '\0']), ('\u{1ef7}', ['\u{1ef6}', '\0', '\0']), - ('\u{1ef9}', ['\u{1ef8}', '\0', '\0']), ('\u{1efb}', ['\u{1efa}', '\0', '\0']), ('\u{1efd}', - ['\u{1efc}', '\0', '\0']), ('\u{1eff}', ['\u{1efe}', '\0', '\0']), ('\u{1f00}', ['\u{1f08}', - '\0', '\0']), ('\u{1f01}', ['\u{1f09}', '\0', '\0']), ('\u{1f02}', ['\u{1f0a}', '\0', - '\0']), ('\u{1f03}', ['\u{1f0b}', '\0', '\0']), ('\u{1f04}', ['\u{1f0c}', '\0', '\0']), - ('\u{1f05}', ['\u{1f0d}', '\0', '\0']), ('\u{1f06}', ['\u{1f0e}', '\0', '\0']), ('\u{1f07}', - ['\u{1f0f}', '\0', '\0']), ('\u{1f10}', ['\u{1f18}', '\0', '\0']), ('\u{1f11}', ['\u{1f19}', - '\0', '\0']), ('\u{1f12}', ['\u{1f1a}', '\0', '\0']), ('\u{1f13}', ['\u{1f1b}', '\0', - '\0']), ('\u{1f14}', ['\u{1f1c}', '\0', '\0']), ('\u{1f15}', ['\u{1f1d}', '\0', '\0']), - ('\u{1f20}', ['\u{1f28}', '\0', '\0']), ('\u{1f21}', ['\u{1f29}', '\0', '\0']), ('\u{1f22}', - ['\u{1f2a}', '\0', '\0']), ('\u{1f23}', ['\u{1f2b}', '\0', '\0']), ('\u{1f24}', ['\u{1f2c}', - '\0', '\0']), ('\u{1f25}', ['\u{1f2d}', '\0', '\0']), ('\u{1f26}', ['\u{1f2e}', '\0', - '\0']), ('\u{1f27}', ['\u{1f2f}', '\0', '\0']), ('\u{1f30}', ['\u{1f38}', '\0', '\0']), - ('\u{1f31}', ['\u{1f39}', '\0', '\0']), ('\u{1f32}', ['\u{1f3a}', '\0', '\0']), ('\u{1f33}', - ['\u{1f3b}', '\0', '\0']), ('\u{1f34}', ['\u{1f3c}', '\0', '\0']), ('\u{1f35}', ['\u{1f3d}', - '\0', '\0']), ('\u{1f36}', ['\u{1f3e}', '\0', '\0']), ('\u{1f37}', ['\u{1f3f}', '\0', - '\0']), ('\u{1f40}', ['\u{1f48}', '\0', '\0']), ('\u{1f41}', ['\u{1f49}', '\0', '\0']), - ('\u{1f42}', ['\u{1f4a}', '\0', '\0']), ('\u{1f43}', ['\u{1f4b}', '\0', '\0']), ('\u{1f44}', - ['\u{1f4c}', '\0', '\0']), ('\u{1f45}', ['\u{1f4d}', '\0', '\0']), ('\u{1f50}', ['\u{3a5}', - '\u{313}', '\0']), ('\u{1f51}', ['\u{1f59}', '\0', '\0']), ('\u{1f52}', ['\u{3a5}', - '\u{313}', '\u{300}']), ('\u{1f53}', ['\u{1f5b}', '\0', '\0']), ('\u{1f54}', ['\u{3a5}', - '\u{313}', '\u{301}']), ('\u{1f55}', ['\u{1f5d}', '\0', '\0']), ('\u{1f56}', ['\u{3a5}', - '\u{313}', '\u{342}']), ('\u{1f57}', ['\u{1f5f}', '\0', '\0']), ('\u{1f60}', ['\u{1f68}', - '\0', '\0']), ('\u{1f61}', ['\u{1f69}', '\0', '\0']), ('\u{1f62}', ['\u{1f6a}', '\0', - '\0']), ('\u{1f63}', ['\u{1f6b}', '\0', '\0']), ('\u{1f64}', ['\u{1f6c}', '\0', '\0']), - ('\u{1f65}', ['\u{1f6d}', '\0', '\0']), ('\u{1f66}', ['\u{1f6e}', '\0', '\0']), ('\u{1f67}', - ['\u{1f6f}', '\0', '\0']), ('\u{1f70}', ['\u{1fba}', '\0', '\0']), ('\u{1f71}', ['\u{1fbb}', - '\0', '\0']), ('\u{1f72}', ['\u{1fc8}', '\0', '\0']), ('\u{1f73}', ['\u{1fc9}', '\0', - '\0']), ('\u{1f74}', ['\u{1fca}', '\0', '\0']), ('\u{1f75}', ['\u{1fcb}', '\0', '\0']), - ('\u{1f76}', ['\u{1fda}', '\0', '\0']), ('\u{1f77}', ['\u{1fdb}', '\0', '\0']), ('\u{1f78}', - ['\u{1ff8}', '\0', '\0']), ('\u{1f79}', ['\u{1ff9}', '\0', '\0']), ('\u{1f7a}', ['\u{1fea}', - '\0', '\0']), ('\u{1f7b}', ['\u{1feb}', '\0', '\0']), ('\u{1f7c}', ['\u{1ffa}', '\0', - '\0']), ('\u{1f7d}', ['\u{1ffb}', '\0', '\0']), ('\u{1f80}', ['\u{1f08}', '\u{399}', '\0']), - ('\u{1f81}', ['\u{1f09}', '\u{399}', '\0']), ('\u{1f82}', ['\u{1f0a}', '\u{399}', '\0']), - ('\u{1f83}', ['\u{1f0b}', '\u{399}', '\0']), ('\u{1f84}', ['\u{1f0c}', '\u{399}', '\0']), - ('\u{1f85}', ['\u{1f0d}', '\u{399}', '\0']), ('\u{1f86}', ['\u{1f0e}', '\u{399}', '\0']), - ('\u{1f87}', ['\u{1f0f}', '\u{399}', '\0']), ('\u{1f88}', ['\u{1f08}', '\u{399}', '\0']), - ('\u{1f89}', ['\u{1f09}', '\u{399}', '\0']), ('\u{1f8a}', ['\u{1f0a}', '\u{399}', '\0']), - ('\u{1f8b}', ['\u{1f0b}', '\u{399}', '\0']), ('\u{1f8c}', ['\u{1f0c}', '\u{399}', '\0']), - ('\u{1f8d}', ['\u{1f0d}', '\u{399}', '\0']), ('\u{1f8e}', ['\u{1f0e}', '\u{399}', '\0']), - ('\u{1f8f}', ['\u{1f0f}', '\u{399}', '\0']), ('\u{1f90}', ['\u{1f28}', '\u{399}', '\0']), - ('\u{1f91}', ['\u{1f29}', '\u{399}', '\0']), ('\u{1f92}', ['\u{1f2a}', '\u{399}', '\0']), - ('\u{1f93}', ['\u{1f2b}', '\u{399}', '\0']), ('\u{1f94}', ['\u{1f2c}', '\u{399}', '\0']), - ('\u{1f95}', ['\u{1f2d}', '\u{399}', '\0']), ('\u{1f96}', ['\u{1f2e}', '\u{399}', '\0']), - ('\u{1f97}', ['\u{1f2f}', '\u{399}', '\0']), ('\u{1f98}', ['\u{1f28}', '\u{399}', '\0']), - ('\u{1f99}', ['\u{1f29}', '\u{399}', '\0']), ('\u{1f9a}', ['\u{1f2a}', '\u{399}', '\0']), - ('\u{1f9b}', ['\u{1f2b}', '\u{399}', '\0']), ('\u{1f9c}', ['\u{1f2c}', '\u{399}', '\0']), - ('\u{1f9d}', ['\u{1f2d}', '\u{399}', '\0']), ('\u{1f9e}', ['\u{1f2e}', '\u{399}', '\0']), - ('\u{1f9f}', ['\u{1f2f}', '\u{399}', '\0']), ('\u{1fa0}', ['\u{1f68}', '\u{399}', '\0']), - ('\u{1fa1}', ['\u{1f69}', '\u{399}', '\0']), ('\u{1fa2}', ['\u{1f6a}', '\u{399}', '\0']), - ('\u{1fa3}', ['\u{1f6b}', '\u{399}', '\0']), ('\u{1fa4}', ['\u{1f6c}', '\u{399}', '\0']), - ('\u{1fa5}', ['\u{1f6d}', '\u{399}', '\0']), ('\u{1fa6}', ['\u{1f6e}', '\u{399}', '\0']), - ('\u{1fa7}', ['\u{1f6f}', '\u{399}', '\0']), ('\u{1fa8}', ['\u{1f68}', '\u{399}', '\0']), - ('\u{1fa9}', ['\u{1f69}', '\u{399}', '\0']), ('\u{1faa}', ['\u{1f6a}', '\u{399}', '\0']), - ('\u{1fab}', ['\u{1f6b}', '\u{399}', '\0']), ('\u{1fac}', ['\u{1f6c}', '\u{399}', '\0']), - ('\u{1fad}', ['\u{1f6d}', '\u{399}', '\0']), ('\u{1fae}', ['\u{1f6e}', '\u{399}', '\0']), - ('\u{1faf}', ['\u{1f6f}', '\u{399}', '\0']), ('\u{1fb0}', ['\u{1fb8}', '\0', '\0']), - ('\u{1fb1}', ['\u{1fb9}', '\0', '\0']), ('\u{1fb2}', ['\u{1fba}', '\u{399}', '\0']), - ('\u{1fb3}', ['\u{391}', '\u{399}', '\0']), ('\u{1fb4}', ['\u{386}', '\u{399}', '\0']), - ('\u{1fb6}', ['\u{391}', '\u{342}', '\0']), ('\u{1fb7}', ['\u{391}', '\u{342}', '\u{399}']), - ('\u{1fbc}', ['\u{391}', '\u{399}', '\0']), ('\u{1fbe}', ['\u{399}', '\0', '\0']), - ('\u{1fc2}', ['\u{1fca}', '\u{399}', '\0']), ('\u{1fc3}', ['\u{397}', '\u{399}', '\0']), - ('\u{1fc4}', ['\u{389}', '\u{399}', '\0']), ('\u{1fc6}', ['\u{397}', '\u{342}', '\0']), - ('\u{1fc7}', ['\u{397}', '\u{342}', '\u{399}']), ('\u{1fcc}', ['\u{397}', '\u{399}', '\0']), - ('\u{1fd0}', ['\u{1fd8}', '\0', '\0']), ('\u{1fd1}', ['\u{1fd9}', '\0', '\0']), ('\u{1fd2}', - ['\u{399}', '\u{308}', '\u{300}']), ('\u{1fd3}', ['\u{399}', '\u{308}', '\u{301}']), - ('\u{1fd6}', ['\u{399}', '\u{342}', '\0']), ('\u{1fd7}', ['\u{399}', '\u{308}', '\u{342}']), - ('\u{1fe0}', ['\u{1fe8}', '\0', '\0']), ('\u{1fe1}', ['\u{1fe9}', '\0', '\0']), ('\u{1fe2}', - ['\u{3a5}', '\u{308}', '\u{300}']), ('\u{1fe3}', ['\u{3a5}', '\u{308}', '\u{301}']), - ('\u{1fe4}', ['\u{3a1}', '\u{313}', '\0']), ('\u{1fe5}', ['\u{1fec}', '\0', '\0']), - ('\u{1fe6}', ['\u{3a5}', '\u{342}', '\0']), ('\u{1fe7}', ['\u{3a5}', '\u{308}', '\u{342}']), - ('\u{1ff2}', ['\u{1ffa}', '\u{399}', '\0']), ('\u{1ff3}', ['\u{3a9}', '\u{399}', '\0']), - ('\u{1ff4}', ['\u{38f}', '\u{399}', '\0']), ('\u{1ff6}', ['\u{3a9}', '\u{342}', '\0']), - ('\u{1ff7}', ['\u{3a9}', '\u{342}', '\u{399}']), ('\u{1ffc}', ['\u{3a9}', '\u{399}', '\0']), - ('\u{214e}', ['\u{2132}', '\0', '\0']), ('\u{2170}', ['\u{2160}', '\0', '\0']), ('\u{2171}', - ['\u{2161}', '\0', '\0']), ('\u{2172}', ['\u{2162}', '\0', '\0']), ('\u{2173}', ['\u{2163}', - '\0', '\0']), ('\u{2174}', ['\u{2164}', '\0', '\0']), ('\u{2175}', ['\u{2165}', '\0', - '\0']), ('\u{2176}', ['\u{2166}', '\0', '\0']), ('\u{2177}', ['\u{2167}', '\0', '\0']), - ('\u{2178}', ['\u{2168}', '\0', '\0']), ('\u{2179}', ['\u{2169}', '\0', '\0']), ('\u{217a}', - ['\u{216a}', '\0', '\0']), ('\u{217b}', ['\u{216b}', '\0', '\0']), ('\u{217c}', ['\u{216c}', - '\0', '\0']), ('\u{217d}', ['\u{216d}', '\0', '\0']), ('\u{217e}', ['\u{216e}', '\0', - '\0']), ('\u{217f}', ['\u{216f}', '\0', '\0']), ('\u{2184}', ['\u{2183}', '\0', '\0']), - ('\u{24d0}', ['\u{24b6}', '\0', '\0']), ('\u{24d1}', ['\u{24b7}', '\0', '\0']), ('\u{24d2}', - ['\u{24b8}', '\0', '\0']), ('\u{24d3}', ['\u{24b9}', '\0', '\0']), ('\u{24d4}', ['\u{24ba}', - '\0', '\0']), ('\u{24d5}', ['\u{24bb}', '\0', '\0']), ('\u{24d6}', ['\u{24bc}', '\0', - '\0']), ('\u{24d7}', ['\u{24bd}', '\0', '\0']), ('\u{24d8}', ['\u{24be}', '\0', '\0']), - ('\u{24d9}', ['\u{24bf}', '\0', '\0']), ('\u{24da}', ['\u{24c0}', '\0', '\0']), ('\u{24db}', - ['\u{24c1}', '\0', '\0']), ('\u{24dc}', ['\u{24c2}', '\0', '\0']), ('\u{24dd}', ['\u{24c3}', - '\0', '\0']), ('\u{24de}', ['\u{24c4}', '\0', '\0']), ('\u{24df}', ['\u{24c5}', '\0', - '\0']), ('\u{24e0}', ['\u{24c6}', '\0', '\0']), ('\u{24e1}', ['\u{24c7}', '\0', '\0']), - ('\u{24e2}', ['\u{24c8}', '\0', '\0']), ('\u{24e3}', ['\u{24c9}', '\0', '\0']), ('\u{24e4}', - ['\u{24ca}', '\0', '\0']), ('\u{24e5}', ['\u{24cb}', '\0', '\0']), ('\u{24e6}', ['\u{24cc}', - '\0', '\0']), ('\u{24e7}', ['\u{24cd}', '\0', '\0']), ('\u{24e8}', ['\u{24ce}', '\0', - '\0']), ('\u{24e9}', ['\u{24cf}', '\0', '\0']), ('\u{2c30}', ['\u{2c00}', '\0', '\0']), - ('\u{2c31}', ['\u{2c01}', '\0', '\0']), ('\u{2c32}', ['\u{2c02}', '\0', '\0']), ('\u{2c33}', - ['\u{2c03}', '\0', '\0']), ('\u{2c34}', ['\u{2c04}', '\0', '\0']), ('\u{2c35}', ['\u{2c05}', - '\0', '\0']), ('\u{2c36}', ['\u{2c06}', '\0', '\0']), ('\u{2c37}', ['\u{2c07}', '\0', - '\0']), ('\u{2c38}', ['\u{2c08}', '\0', '\0']), ('\u{2c39}', ['\u{2c09}', '\0', '\0']), - ('\u{2c3a}', ['\u{2c0a}', '\0', '\0']), ('\u{2c3b}', ['\u{2c0b}', '\0', '\0']), ('\u{2c3c}', - ['\u{2c0c}', '\0', '\0']), ('\u{2c3d}', ['\u{2c0d}', '\0', '\0']), ('\u{2c3e}', ['\u{2c0e}', - '\0', '\0']), ('\u{2c3f}', ['\u{2c0f}', '\0', '\0']), ('\u{2c40}', ['\u{2c10}', '\0', - '\0']), ('\u{2c41}', ['\u{2c11}', '\0', '\0']), ('\u{2c42}', ['\u{2c12}', '\0', '\0']), - ('\u{2c43}', ['\u{2c13}', '\0', '\0']), ('\u{2c44}', ['\u{2c14}', '\0', '\0']), ('\u{2c45}', - ['\u{2c15}', '\0', '\0']), ('\u{2c46}', ['\u{2c16}', '\0', '\0']), ('\u{2c47}', ['\u{2c17}', - '\0', '\0']), ('\u{2c48}', ['\u{2c18}', '\0', '\0']), ('\u{2c49}', ['\u{2c19}', '\0', - '\0']), ('\u{2c4a}', ['\u{2c1a}', '\0', '\0']), ('\u{2c4b}', ['\u{2c1b}', '\0', '\0']), - ('\u{2c4c}', ['\u{2c1c}', '\0', '\0']), ('\u{2c4d}', ['\u{2c1d}', '\0', '\0']), ('\u{2c4e}', - ['\u{2c1e}', '\0', '\0']), ('\u{2c4f}', ['\u{2c1f}', '\0', '\0']), ('\u{2c50}', ['\u{2c20}', - '\0', '\0']), ('\u{2c51}', ['\u{2c21}', '\0', '\0']), ('\u{2c52}', ['\u{2c22}', '\0', - '\0']), ('\u{2c53}', ['\u{2c23}', '\0', '\0']), ('\u{2c54}', ['\u{2c24}', '\0', '\0']), - ('\u{2c55}', ['\u{2c25}', '\0', '\0']), ('\u{2c56}', ['\u{2c26}', '\0', '\0']), ('\u{2c57}', - ['\u{2c27}', '\0', '\0']), ('\u{2c58}', ['\u{2c28}', '\0', '\0']), ('\u{2c59}', ['\u{2c29}', - '\0', '\0']), ('\u{2c5a}', ['\u{2c2a}', '\0', '\0']), ('\u{2c5b}', ['\u{2c2b}', '\0', - '\0']), ('\u{2c5c}', ['\u{2c2c}', '\0', '\0']), ('\u{2c5d}', ['\u{2c2d}', '\0', '\0']), - ('\u{2c5e}', ['\u{2c2e}', '\0', '\0']), ('\u{2c61}', ['\u{2c60}', '\0', '\0']), ('\u{2c65}', - ['\u{23a}', '\0', '\0']), ('\u{2c66}', ['\u{23e}', '\0', '\0']), ('\u{2c68}', ['\u{2c67}', - '\0', '\0']), ('\u{2c6a}', ['\u{2c69}', '\0', '\0']), ('\u{2c6c}', ['\u{2c6b}', '\0', - '\0']), ('\u{2c73}', ['\u{2c72}', '\0', '\0']), ('\u{2c76}', ['\u{2c75}', '\0', '\0']), - ('\u{2c81}', ['\u{2c80}', '\0', '\0']), ('\u{2c83}', ['\u{2c82}', '\0', '\0']), ('\u{2c85}', - ['\u{2c84}', '\0', '\0']), ('\u{2c87}', ['\u{2c86}', '\0', '\0']), ('\u{2c89}', ['\u{2c88}', - '\0', '\0']), ('\u{2c8b}', ['\u{2c8a}', '\0', '\0']), ('\u{2c8d}', ['\u{2c8c}', '\0', - '\0']), ('\u{2c8f}', ['\u{2c8e}', '\0', '\0']), ('\u{2c91}', ['\u{2c90}', '\0', '\0']), - ('\u{2c93}', ['\u{2c92}', '\0', '\0']), ('\u{2c95}', ['\u{2c94}', '\0', '\0']), ('\u{2c97}', - ['\u{2c96}', '\0', '\0']), ('\u{2c99}', ['\u{2c98}', '\0', '\0']), ('\u{2c9b}', ['\u{2c9a}', - '\0', '\0']), ('\u{2c9d}', ['\u{2c9c}', '\0', '\0']), ('\u{2c9f}', ['\u{2c9e}', '\0', - '\0']), ('\u{2ca1}', ['\u{2ca0}', '\0', '\0']), ('\u{2ca3}', ['\u{2ca2}', '\0', '\0']), - ('\u{2ca5}', ['\u{2ca4}', '\0', '\0']), ('\u{2ca7}', ['\u{2ca6}', '\0', '\0']), ('\u{2ca9}', - ['\u{2ca8}', '\0', '\0']), ('\u{2cab}', ['\u{2caa}', '\0', '\0']), ('\u{2cad}', ['\u{2cac}', - '\0', '\0']), ('\u{2caf}', ['\u{2cae}', '\0', '\0']), ('\u{2cb1}', ['\u{2cb0}', '\0', - '\0']), ('\u{2cb3}', ['\u{2cb2}', '\0', '\0']), ('\u{2cb5}', ['\u{2cb4}', '\0', '\0']), - ('\u{2cb7}', ['\u{2cb6}', '\0', '\0']), ('\u{2cb9}', ['\u{2cb8}', '\0', '\0']), ('\u{2cbb}', - ['\u{2cba}', '\0', '\0']), ('\u{2cbd}', ['\u{2cbc}', '\0', '\0']), ('\u{2cbf}', ['\u{2cbe}', - '\0', '\0']), ('\u{2cc1}', ['\u{2cc0}', '\0', '\0']), ('\u{2cc3}', ['\u{2cc2}', '\0', - '\0']), ('\u{2cc5}', ['\u{2cc4}', '\0', '\0']), ('\u{2cc7}', ['\u{2cc6}', '\0', '\0']), - ('\u{2cc9}', ['\u{2cc8}', '\0', '\0']), ('\u{2ccb}', ['\u{2cca}', '\0', '\0']), ('\u{2ccd}', - ['\u{2ccc}', '\0', '\0']), ('\u{2ccf}', ['\u{2cce}', '\0', '\0']), ('\u{2cd1}', ['\u{2cd0}', - '\0', '\0']), ('\u{2cd3}', ['\u{2cd2}', '\0', '\0']), ('\u{2cd5}', ['\u{2cd4}', '\0', - '\0']), ('\u{2cd7}', ['\u{2cd6}', '\0', '\0']), ('\u{2cd9}', ['\u{2cd8}', '\0', '\0']), - ('\u{2cdb}', ['\u{2cda}', '\0', '\0']), ('\u{2cdd}', ['\u{2cdc}', '\0', '\0']), ('\u{2cdf}', - ['\u{2cde}', '\0', '\0']), ('\u{2ce1}', ['\u{2ce0}', '\0', '\0']), ('\u{2ce3}', ['\u{2ce2}', - '\0', '\0']), ('\u{2cec}', ['\u{2ceb}', '\0', '\0']), ('\u{2cee}', ['\u{2ced}', '\0', - '\0']), ('\u{2cf3}', ['\u{2cf2}', '\0', '\0']), ('\u{2d00}', ['\u{10a0}', '\0', '\0']), - ('\u{2d01}', ['\u{10a1}', '\0', '\0']), ('\u{2d02}', ['\u{10a2}', '\0', '\0']), ('\u{2d03}', - ['\u{10a3}', '\0', '\0']), ('\u{2d04}', ['\u{10a4}', '\0', '\0']), ('\u{2d05}', ['\u{10a5}', - '\0', '\0']), ('\u{2d06}', ['\u{10a6}', '\0', '\0']), ('\u{2d07}', ['\u{10a7}', '\0', - '\0']), ('\u{2d08}', ['\u{10a8}', '\0', '\0']), ('\u{2d09}', ['\u{10a9}', '\0', '\0']), - ('\u{2d0a}', ['\u{10aa}', '\0', '\0']), ('\u{2d0b}', ['\u{10ab}', '\0', '\0']), ('\u{2d0c}', - ['\u{10ac}', '\0', '\0']), ('\u{2d0d}', ['\u{10ad}', '\0', '\0']), ('\u{2d0e}', ['\u{10ae}', - '\0', '\0']), ('\u{2d0f}', ['\u{10af}', '\0', '\0']), ('\u{2d10}', ['\u{10b0}', '\0', - '\0']), ('\u{2d11}', ['\u{10b1}', '\0', '\0']), ('\u{2d12}', ['\u{10b2}', '\0', '\0']), - ('\u{2d13}', ['\u{10b3}', '\0', '\0']), ('\u{2d14}', ['\u{10b4}', '\0', '\0']), ('\u{2d15}', - ['\u{10b5}', '\0', '\0']), ('\u{2d16}', ['\u{10b6}', '\0', '\0']), ('\u{2d17}', ['\u{10b7}', - '\0', '\0']), ('\u{2d18}', ['\u{10b8}', '\0', '\0']), ('\u{2d19}', ['\u{10b9}', '\0', - '\0']), ('\u{2d1a}', ['\u{10ba}', '\0', '\0']), ('\u{2d1b}', ['\u{10bb}', '\0', '\0']), - ('\u{2d1c}', ['\u{10bc}', '\0', '\0']), ('\u{2d1d}', ['\u{10bd}', '\0', '\0']), ('\u{2d1e}', - ['\u{10be}', '\0', '\0']), ('\u{2d1f}', ['\u{10bf}', '\0', '\0']), ('\u{2d20}', ['\u{10c0}', - '\0', '\0']), ('\u{2d21}', ['\u{10c1}', '\0', '\0']), ('\u{2d22}', ['\u{10c2}', '\0', - '\0']), ('\u{2d23}', ['\u{10c3}', '\0', '\0']), ('\u{2d24}', ['\u{10c4}', '\0', '\0']), - ('\u{2d25}', ['\u{10c5}', '\0', '\0']), ('\u{2d27}', ['\u{10c7}', '\0', '\0']), ('\u{2d2d}', - ['\u{10cd}', '\0', '\0']), ('\u{a641}', ['\u{a640}', '\0', '\0']), ('\u{a643}', ['\u{a642}', - '\0', '\0']), ('\u{a645}', ['\u{a644}', '\0', '\0']), ('\u{a647}', ['\u{a646}', '\0', - '\0']), ('\u{a649}', ['\u{a648}', '\0', '\0']), ('\u{a64b}', ['\u{a64a}', '\0', '\0']), - ('\u{a64d}', ['\u{a64c}', '\0', '\0']), ('\u{a64f}', ['\u{a64e}', '\0', '\0']), ('\u{a651}', - ['\u{a650}', '\0', '\0']), ('\u{a653}', ['\u{a652}', '\0', '\0']), ('\u{a655}', ['\u{a654}', - '\0', '\0']), ('\u{a657}', ['\u{a656}', '\0', '\0']), ('\u{a659}', ['\u{a658}', '\0', - '\0']), ('\u{a65b}', ['\u{a65a}', '\0', '\0']), ('\u{a65d}', ['\u{a65c}', '\0', '\0']), - ('\u{a65f}', ['\u{a65e}', '\0', '\0']), ('\u{a661}', ['\u{a660}', '\0', '\0']), ('\u{a663}', - ['\u{a662}', '\0', '\0']), ('\u{a665}', ['\u{a664}', '\0', '\0']), ('\u{a667}', ['\u{a666}', - '\0', '\0']), ('\u{a669}', ['\u{a668}', '\0', '\0']), ('\u{a66b}', ['\u{a66a}', '\0', - '\0']), ('\u{a66d}', ['\u{a66c}', '\0', '\0']), ('\u{a681}', ['\u{a680}', '\0', '\0']), - ('\u{a683}', ['\u{a682}', '\0', '\0']), ('\u{a685}', ['\u{a684}', '\0', '\0']), ('\u{a687}', - ['\u{a686}', '\0', '\0']), ('\u{a689}', ['\u{a688}', '\0', '\0']), ('\u{a68b}', ['\u{a68a}', - '\0', '\0']), ('\u{a68d}', ['\u{a68c}', '\0', '\0']), ('\u{a68f}', ['\u{a68e}', '\0', - '\0']), ('\u{a691}', ['\u{a690}', '\0', '\0']), ('\u{a693}', ['\u{a692}', '\0', '\0']), - ('\u{a695}', ['\u{a694}', '\0', '\0']), ('\u{a697}', ['\u{a696}', '\0', '\0']), ('\u{a699}', - ['\u{a698}', '\0', '\0']), ('\u{a69b}', ['\u{a69a}', '\0', '\0']), ('\u{a723}', ['\u{a722}', - '\0', '\0']), ('\u{a725}', ['\u{a724}', '\0', '\0']), ('\u{a727}', ['\u{a726}', '\0', - '\0']), ('\u{a729}', ['\u{a728}', '\0', '\0']), ('\u{a72b}', ['\u{a72a}', '\0', '\0']), - ('\u{a72d}', ['\u{a72c}', '\0', '\0']), ('\u{a72f}', ['\u{a72e}', '\0', '\0']), ('\u{a733}', - ['\u{a732}', '\0', '\0']), ('\u{a735}', ['\u{a734}', '\0', '\0']), ('\u{a737}', ['\u{a736}', - '\0', '\0']), ('\u{a739}', ['\u{a738}', '\0', '\0']), ('\u{a73b}', ['\u{a73a}', '\0', - '\0']), ('\u{a73d}', ['\u{a73c}', '\0', '\0']), ('\u{a73f}', ['\u{a73e}', '\0', '\0']), - ('\u{a741}', ['\u{a740}', '\0', '\0']), ('\u{a743}', ['\u{a742}', '\0', '\0']), ('\u{a745}', - ['\u{a744}', '\0', '\0']), ('\u{a747}', ['\u{a746}', '\0', '\0']), ('\u{a749}', ['\u{a748}', - '\0', '\0']), ('\u{a74b}', ['\u{a74a}', '\0', '\0']), ('\u{a74d}', ['\u{a74c}', '\0', - '\0']), ('\u{a74f}', ['\u{a74e}', '\0', '\0']), ('\u{a751}', ['\u{a750}', '\0', '\0']), - ('\u{a753}', ['\u{a752}', '\0', '\0']), ('\u{a755}', ['\u{a754}', '\0', '\0']), ('\u{a757}', - ['\u{a756}', '\0', '\0']), ('\u{a759}', ['\u{a758}', '\0', '\0']), ('\u{a75b}', ['\u{a75a}', - '\0', '\0']), ('\u{a75d}', ['\u{a75c}', '\0', '\0']), ('\u{a75f}', ['\u{a75e}', '\0', - '\0']), ('\u{a761}', ['\u{a760}', '\0', '\0']), ('\u{a763}', ['\u{a762}', '\0', '\0']), - ('\u{a765}', ['\u{a764}', '\0', '\0']), ('\u{a767}', ['\u{a766}', '\0', '\0']), ('\u{a769}', - ['\u{a768}', '\0', '\0']), ('\u{a76b}', ['\u{a76a}', '\0', '\0']), ('\u{a76d}', ['\u{a76c}', - '\0', '\0']), ('\u{a76f}', ['\u{a76e}', '\0', '\0']), ('\u{a77a}', ['\u{a779}', '\0', - '\0']), ('\u{a77c}', ['\u{a77b}', '\0', '\0']), ('\u{a77f}', ['\u{a77e}', '\0', '\0']), - ('\u{a781}', ['\u{a780}', '\0', '\0']), ('\u{a783}', ['\u{a782}', '\0', '\0']), ('\u{a785}', - ['\u{a784}', '\0', '\0']), ('\u{a787}', ['\u{a786}', '\0', '\0']), ('\u{a78c}', ['\u{a78b}', - '\0', '\0']), ('\u{a791}', ['\u{a790}', '\0', '\0']), ('\u{a793}', ['\u{a792}', '\0', - '\0']), ('\u{a794}', ['\u{a7c4}', '\0', '\0']), ('\u{a797}', ['\u{a796}', '\0', '\0']), - ('\u{a799}', ['\u{a798}', '\0', '\0']), ('\u{a79b}', ['\u{a79a}', '\0', '\0']), ('\u{a79d}', - ['\u{a79c}', '\0', '\0']), ('\u{a79f}', ['\u{a79e}', '\0', '\0']), ('\u{a7a1}', ['\u{a7a0}', - '\0', '\0']), ('\u{a7a3}', ['\u{a7a2}', '\0', '\0']), ('\u{a7a5}', ['\u{a7a4}', '\0', - '\0']), ('\u{a7a7}', ['\u{a7a6}', '\0', '\0']), ('\u{a7a9}', ['\u{a7a8}', '\0', '\0']), - ('\u{a7b5}', ['\u{a7b4}', '\0', '\0']), ('\u{a7b7}', ['\u{a7b6}', '\0', '\0']), ('\u{a7b9}', - ['\u{a7b8}', '\0', '\0']), ('\u{a7bb}', ['\u{a7ba}', '\0', '\0']), ('\u{a7bd}', ['\u{a7bc}', - '\0', '\0']), ('\u{a7bf}', ['\u{a7be}', '\0', '\0']), ('\u{a7c3}', ['\u{a7c2}', '\0', - '\0']), ('\u{ab53}', ['\u{a7b3}', '\0', '\0']), ('\u{ab70}', ['\u{13a0}', '\0', '\0']), - ('\u{ab71}', ['\u{13a1}', '\0', '\0']), ('\u{ab72}', ['\u{13a2}', '\0', '\0']), ('\u{ab73}', - ['\u{13a3}', '\0', '\0']), ('\u{ab74}', ['\u{13a4}', '\0', '\0']), ('\u{ab75}', ['\u{13a5}', - '\0', '\0']), ('\u{ab76}', ['\u{13a6}', '\0', '\0']), ('\u{ab77}', ['\u{13a7}', '\0', - '\0']), ('\u{ab78}', ['\u{13a8}', '\0', '\0']), ('\u{ab79}', ['\u{13a9}', '\0', '\0']), - ('\u{ab7a}', ['\u{13aa}', '\0', '\0']), ('\u{ab7b}', ['\u{13ab}', '\0', '\0']), ('\u{ab7c}', - ['\u{13ac}', '\0', '\0']), ('\u{ab7d}', ['\u{13ad}', '\0', '\0']), ('\u{ab7e}', ['\u{13ae}', - '\0', '\0']), ('\u{ab7f}', ['\u{13af}', '\0', '\0']), ('\u{ab80}', ['\u{13b0}', '\0', - '\0']), ('\u{ab81}', ['\u{13b1}', '\0', '\0']), ('\u{ab82}', ['\u{13b2}', '\0', '\0']), - ('\u{ab83}', ['\u{13b3}', '\0', '\0']), ('\u{ab84}', ['\u{13b4}', '\0', '\0']), ('\u{ab85}', - ['\u{13b5}', '\0', '\0']), ('\u{ab86}', ['\u{13b6}', '\0', '\0']), ('\u{ab87}', ['\u{13b7}', - '\0', '\0']), ('\u{ab88}', ['\u{13b8}', '\0', '\0']), ('\u{ab89}', ['\u{13b9}', '\0', - '\0']), ('\u{ab8a}', ['\u{13ba}', '\0', '\0']), ('\u{ab8b}', ['\u{13bb}', '\0', '\0']), - ('\u{ab8c}', ['\u{13bc}', '\0', '\0']), ('\u{ab8d}', ['\u{13bd}', '\0', '\0']), ('\u{ab8e}', - ['\u{13be}', '\0', '\0']), ('\u{ab8f}', ['\u{13bf}', '\0', '\0']), ('\u{ab90}', ['\u{13c0}', - '\0', '\0']), ('\u{ab91}', ['\u{13c1}', '\0', '\0']), ('\u{ab92}', ['\u{13c2}', '\0', - '\0']), ('\u{ab93}', ['\u{13c3}', '\0', '\0']), ('\u{ab94}', ['\u{13c4}', '\0', '\0']), - ('\u{ab95}', ['\u{13c5}', '\0', '\0']), ('\u{ab96}', ['\u{13c6}', '\0', '\0']), ('\u{ab97}', - ['\u{13c7}', '\0', '\0']), ('\u{ab98}', ['\u{13c8}', '\0', '\0']), ('\u{ab99}', ['\u{13c9}', - '\0', '\0']), ('\u{ab9a}', ['\u{13ca}', '\0', '\0']), ('\u{ab9b}', ['\u{13cb}', '\0', - '\0']), ('\u{ab9c}', ['\u{13cc}', '\0', '\0']), ('\u{ab9d}', ['\u{13cd}', '\0', '\0']), - ('\u{ab9e}', ['\u{13ce}', '\0', '\0']), ('\u{ab9f}', ['\u{13cf}', '\0', '\0']), ('\u{aba0}', - ['\u{13d0}', '\0', '\0']), ('\u{aba1}', ['\u{13d1}', '\0', '\0']), ('\u{aba2}', ['\u{13d2}', - '\0', '\0']), ('\u{aba3}', ['\u{13d3}', '\0', '\0']), ('\u{aba4}', ['\u{13d4}', '\0', - '\0']), ('\u{aba5}', ['\u{13d5}', '\0', '\0']), ('\u{aba6}', ['\u{13d6}', '\0', '\0']), - ('\u{aba7}', ['\u{13d7}', '\0', '\0']), ('\u{aba8}', ['\u{13d8}', '\0', '\0']), ('\u{aba9}', - ['\u{13d9}', '\0', '\0']), ('\u{abaa}', ['\u{13da}', '\0', '\0']), ('\u{abab}', ['\u{13db}', - '\0', '\0']), ('\u{abac}', ['\u{13dc}', '\0', '\0']), ('\u{abad}', ['\u{13dd}', '\0', - '\0']), ('\u{abae}', ['\u{13de}', '\0', '\0']), ('\u{abaf}', ['\u{13df}', '\0', '\0']), - ('\u{abb0}', ['\u{13e0}', '\0', '\0']), ('\u{abb1}', ['\u{13e1}', '\0', '\0']), ('\u{abb2}', - ['\u{13e2}', '\0', '\0']), ('\u{abb3}', ['\u{13e3}', '\0', '\0']), ('\u{abb4}', ['\u{13e4}', - '\0', '\0']), ('\u{abb5}', ['\u{13e5}', '\0', '\0']), ('\u{abb6}', ['\u{13e6}', '\0', - '\0']), ('\u{abb7}', ['\u{13e7}', '\0', '\0']), ('\u{abb8}', ['\u{13e8}', '\0', '\0']), - ('\u{abb9}', ['\u{13e9}', '\0', '\0']), ('\u{abba}', ['\u{13ea}', '\0', '\0']), ('\u{abbb}', - ['\u{13eb}', '\0', '\0']), ('\u{abbc}', ['\u{13ec}', '\0', '\0']), ('\u{abbd}', ['\u{13ed}', - '\0', '\0']), ('\u{abbe}', ['\u{13ee}', '\0', '\0']), ('\u{abbf}', ['\u{13ef}', '\0', - '\0']), ('\u{fb00}', ['\u{46}', '\u{46}', '\0']), ('\u{fb01}', ['\u{46}', '\u{49}', '\0']), - ('\u{fb02}', ['\u{46}', '\u{4c}', '\0']), ('\u{fb03}', ['\u{46}', '\u{46}', '\u{49}']), - ('\u{fb04}', ['\u{46}', '\u{46}', '\u{4c}']), ('\u{fb05}', ['\u{53}', '\u{54}', '\0']), - ('\u{fb06}', ['\u{53}', '\u{54}', '\0']), ('\u{fb13}', ['\u{544}', '\u{546}', '\0']), - ('\u{fb14}', ['\u{544}', '\u{535}', '\0']), ('\u{fb15}', ['\u{544}', '\u{53b}', '\0']), - ('\u{fb16}', ['\u{54e}', '\u{546}', '\0']), ('\u{fb17}', ['\u{544}', '\u{53d}', '\0']), - ('\u{ff41}', ['\u{ff21}', '\0', '\0']), ('\u{ff42}', ['\u{ff22}', '\0', '\0']), ('\u{ff43}', - ['\u{ff23}', '\0', '\0']), ('\u{ff44}', ['\u{ff24}', '\0', '\0']), ('\u{ff45}', ['\u{ff25}', - '\0', '\0']), ('\u{ff46}', ['\u{ff26}', '\0', '\0']), ('\u{ff47}', ['\u{ff27}', '\0', - '\0']), ('\u{ff48}', ['\u{ff28}', '\0', '\0']), ('\u{ff49}', ['\u{ff29}', '\0', '\0']), - ('\u{ff4a}', ['\u{ff2a}', '\0', '\0']), ('\u{ff4b}', ['\u{ff2b}', '\0', '\0']), ('\u{ff4c}', - ['\u{ff2c}', '\0', '\0']), ('\u{ff4d}', ['\u{ff2d}', '\0', '\0']), ('\u{ff4e}', ['\u{ff2e}', - '\0', '\0']), ('\u{ff4f}', ['\u{ff2f}', '\0', '\0']), ('\u{ff50}', ['\u{ff30}', '\0', - '\0']), ('\u{ff51}', ['\u{ff31}', '\0', '\0']), ('\u{ff52}', ['\u{ff32}', '\0', '\0']), - ('\u{ff53}', ['\u{ff33}', '\0', '\0']), ('\u{ff54}', ['\u{ff34}', '\0', '\0']), ('\u{ff55}', - ['\u{ff35}', '\0', '\0']), ('\u{ff56}', ['\u{ff36}', '\0', '\0']), ('\u{ff57}', ['\u{ff37}', - '\0', '\0']), ('\u{ff58}', ['\u{ff38}', '\0', '\0']), ('\u{ff59}', ['\u{ff39}', '\0', - '\0']), ('\u{ff5a}', ['\u{ff3a}', '\0', '\0']), ('\u{10428}', ['\u{10400}', '\0', '\0']), - ('\u{10429}', ['\u{10401}', '\0', '\0']), ('\u{1042a}', ['\u{10402}', '\0', '\0']), - ('\u{1042b}', ['\u{10403}', '\0', '\0']), ('\u{1042c}', ['\u{10404}', '\0', '\0']), - ('\u{1042d}', ['\u{10405}', '\0', '\0']), ('\u{1042e}', ['\u{10406}', '\0', '\0']), - ('\u{1042f}', ['\u{10407}', '\0', '\0']), ('\u{10430}', ['\u{10408}', '\0', '\0']), - ('\u{10431}', ['\u{10409}', '\0', '\0']), ('\u{10432}', ['\u{1040a}', '\0', '\0']), - ('\u{10433}', ['\u{1040b}', '\0', '\0']), ('\u{10434}', ['\u{1040c}', '\0', '\0']), - ('\u{10435}', ['\u{1040d}', '\0', '\0']), ('\u{10436}', ['\u{1040e}', '\0', '\0']), - ('\u{10437}', ['\u{1040f}', '\0', '\0']), ('\u{10438}', ['\u{10410}', '\0', '\0']), - ('\u{10439}', ['\u{10411}', '\0', '\0']), ('\u{1043a}', ['\u{10412}', '\0', '\0']), - ('\u{1043b}', ['\u{10413}', '\0', '\0']), ('\u{1043c}', ['\u{10414}', '\0', '\0']), - ('\u{1043d}', ['\u{10415}', '\0', '\0']), ('\u{1043e}', ['\u{10416}', '\0', '\0']), - ('\u{1043f}', ['\u{10417}', '\0', '\0']), ('\u{10440}', ['\u{10418}', '\0', '\0']), - ('\u{10441}', ['\u{10419}', '\0', '\0']), ('\u{10442}', ['\u{1041a}', '\0', '\0']), - ('\u{10443}', ['\u{1041b}', '\0', '\0']), ('\u{10444}', ['\u{1041c}', '\0', '\0']), - ('\u{10445}', ['\u{1041d}', '\0', '\0']), ('\u{10446}', ['\u{1041e}', '\0', '\0']), - ('\u{10447}', ['\u{1041f}', '\0', '\0']), ('\u{10448}', ['\u{10420}', '\0', '\0']), - ('\u{10449}', ['\u{10421}', '\0', '\0']), ('\u{1044a}', ['\u{10422}', '\0', '\0']), - ('\u{1044b}', ['\u{10423}', '\0', '\0']), ('\u{1044c}', ['\u{10424}', '\0', '\0']), - ('\u{1044d}', ['\u{10425}', '\0', '\0']), ('\u{1044e}', ['\u{10426}', '\0', '\0']), - ('\u{1044f}', ['\u{10427}', '\0', '\0']), ('\u{104d8}', ['\u{104b0}', '\0', '\0']), - ('\u{104d9}', ['\u{104b1}', '\0', '\0']), ('\u{104da}', ['\u{104b2}', '\0', '\0']), - ('\u{104db}', ['\u{104b3}', '\0', '\0']), ('\u{104dc}', ['\u{104b4}', '\0', '\0']), - ('\u{104dd}', ['\u{104b5}', '\0', '\0']), ('\u{104de}', ['\u{104b6}', '\0', '\0']), - ('\u{104df}', ['\u{104b7}', '\0', '\0']), ('\u{104e0}', ['\u{104b8}', '\0', '\0']), - ('\u{104e1}', ['\u{104b9}', '\0', '\0']), ('\u{104e2}', ['\u{104ba}', '\0', '\0']), - ('\u{104e3}', ['\u{104bb}', '\0', '\0']), ('\u{104e4}', ['\u{104bc}', '\0', '\0']), - ('\u{104e5}', ['\u{104bd}', '\0', '\0']), ('\u{104e6}', ['\u{104be}', '\0', '\0']), - ('\u{104e7}', ['\u{104bf}', '\0', '\0']), ('\u{104e8}', ['\u{104c0}', '\0', '\0']), - ('\u{104e9}', ['\u{104c1}', '\0', '\0']), ('\u{104ea}', ['\u{104c2}', '\0', '\0']), - ('\u{104eb}', ['\u{104c3}', '\0', '\0']), ('\u{104ec}', ['\u{104c4}', '\0', '\0']), - ('\u{104ed}', ['\u{104c5}', '\0', '\0']), ('\u{104ee}', ['\u{104c6}', '\0', '\0']), - ('\u{104ef}', ['\u{104c7}', '\0', '\0']), ('\u{104f0}', ['\u{104c8}', '\0', '\0']), - ('\u{104f1}', ['\u{104c9}', '\0', '\0']), ('\u{104f2}', ['\u{104ca}', '\0', '\0']), - ('\u{104f3}', ['\u{104cb}', '\0', '\0']), ('\u{104f4}', ['\u{104cc}', '\0', '\0']), - ('\u{104f5}', ['\u{104cd}', '\0', '\0']), ('\u{104f6}', ['\u{104ce}', '\0', '\0']), - ('\u{104f7}', ['\u{104cf}', '\0', '\0']), ('\u{104f8}', ['\u{104d0}', '\0', '\0']), - ('\u{104f9}', ['\u{104d1}', '\0', '\0']), ('\u{104fa}', ['\u{104d2}', '\0', '\0']), - ('\u{104fb}', ['\u{104d3}', '\0', '\0']), ('\u{10cc0}', ['\u{10c80}', '\0', '\0']), - ('\u{10cc1}', ['\u{10c81}', '\0', '\0']), ('\u{10cc2}', ['\u{10c82}', '\0', '\0']), - ('\u{10cc3}', ['\u{10c83}', '\0', '\0']), ('\u{10cc4}', ['\u{10c84}', '\0', '\0']), - ('\u{10cc5}', ['\u{10c85}', '\0', '\0']), ('\u{10cc6}', ['\u{10c86}', '\0', '\0']), - ('\u{10cc7}', ['\u{10c87}', '\0', '\0']), ('\u{10cc8}', ['\u{10c88}', '\0', '\0']), - ('\u{10cc9}', ['\u{10c89}', '\0', '\0']), ('\u{10cca}', ['\u{10c8a}', '\0', '\0']), - ('\u{10ccb}', ['\u{10c8b}', '\0', '\0']), ('\u{10ccc}', ['\u{10c8c}', '\0', '\0']), - ('\u{10ccd}', ['\u{10c8d}', '\0', '\0']), ('\u{10cce}', ['\u{10c8e}', '\0', '\0']), - ('\u{10ccf}', ['\u{10c8f}', '\0', '\0']), ('\u{10cd0}', ['\u{10c90}', '\0', '\0']), - ('\u{10cd1}', ['\u{10c91}', '\0', '\0']), ('\u{10cd2}', ['\u{10c92}', '\0', '\0']), - ('\u{10cd3}', ['\u{10c93}', '\0', '\0']), ('\u{10cd4}', ['\u{10c94}', '\0', '\0']), - ('\u{10cd5}', ['\u{10c95}', '\0', '\0']), ('\u{10cd6}', ['\u{10c96}', '\0', '\0']), - ('\u{10cd7}', ['\u{10c97}', '\0', '\0']), ('\u{10cd8}', ['\u{10c98}', '\0', '\0']), - ('\u{10cd9}', ['\u{10c99}', '\0', '\0']), ('\u{10cda}', ['\u{10c9a}', '\0', '\0']), - ('\u{10cdb}', ['\u{10c9b}', '\0', '\0']), ('\u{10cdc}', ['\u{10c9c}', '\0', '\0']), - ('\u{10cdd}', ['\u{10c9d}', '\0', '\0']), ('\u{10cde}', ['\u{10c9e}', '\0', '\0']), - ('\u{10cdf}', ['\u{10c9f}', '\0', '\0']), ('\u{10ce0}', ['\u{10ca0}', '\0', '\0']), - ('\u{10ce1}', ['\u{10ca1}', '\0', '\0']), ('\u{10ce2}', ['\u{10ca2}', '\0', '\0']), - ('\u{10ce3}', ['\u{10ca3}', '\0', '\0']), ('\u{10ce4}', ['\u{10ca4}', '\0', '\0']), - ('\u{10ce5}', ['\u{10ca5}', '\0', '\0']), ('\u{10ce6}', ['\u{10ca6}', '\0', '\0']), - ('\u{10ce7}', ['\u{10ca7}', '\0', '\0']), ('\u{10ce8}', ['\u{10ca8}', '\0', '\0']), - ('\u{10ce9}', ['\u{10ca9}', '\0', '\0']), ('\u{10cea}', ['\u{10caa}', '\0', '\0']), - ('\u{10ceb}', ['\u{10cab}', '\0', '\0']), ('\u{10cec}', ['\u{10cac}', '\0', '\0']), - ('\u{10ced}', ['\u{10cad}', '\0', '\0']), ('\u{10cee}', ['\u{10cae}', '\0', '\0']), - ('\u{10cef}', ['\u{10caf}', '\0', '\0']), ('\u{10cf0}', ['\u{10cb0}', '\0', '\0']), - ('\u{10cf1}', ['\u{10cb1}', '\0', '\0']), ('\u{10cf2}', ['\u{10cb2}', '\0', '\0']), - ('\u{118c0}', ['\u{118a0}', '\0', '\0']), ('\u{118c1}', ['\u{118a1}', '\0', '\0']), - ('\u{118c2}', ['\u{118a2}', '\0', '\0']), ('\u{118c3}', ['\u{118a3}', '\0', '\0']), - ('\u{118c4}', ['\u{118a4}', '\0', '\0']), ('\u{118c5}', ['\u{118a5}', '\0', '\0']), - ('\u{118c6}', ['\u{118a6}', '\0', '\0']), ('\u{118c7}', ['\u{118a7}', '\0', '\0']), - ('\u{118c8}', ['\u{118a8}', '\0', '\0']), ('\u{118c9}', ['\u{118a9}', '\0', '\0']), - ('\u{118ca}', ['\u{118aa}', '\0', '\0']), ('\u{118cb}', ['\u{118ab}', '\0', '\0']), - ('\u{118cc}', ['\u{118ac}', '\0', '\0']), ('\u{118cd}', ['\u{118ad}', '\0', '\0']), - ('\u{118ce}', ['\u{118ae}', '\0', '\0']), ('\u{118cf}', ['\u{118af}', '\0', '\0']), - ('\u{118d0}', ['\u{118b0}', '\0', '\0']), ('\u{118d1}', ['\u{118b1}', '\0', '\0']), - ('\u{118d2}', ['\u{118b2}', '\0', '\0']), ('\u{118d3}', ['\u{118b3}', '\0', '\0']), - ('\u{118d4}', ['\u{118b4}', '\0', '\0']), ('\u{118d5}', ['\u{118b5}', '\0', '\0']), - ('\u{118d6}', ['\u{118b6}', '\0', '\0']), ('\u{118d7}', ['\u{118b7}', '\0', '\0']), - ('\u{118d8}', ['\u{118b8}', '\0', '\0']), ('\u{118d9}', ['\u{118b9}', '\0', '\0']), - ('\u{118da}', ['\u{118ba}', '\0', '\0']), ('\u{118db}', ['\u{118bb}', '\0', '\0']), - ('\u{118dc}', ['\u{118bc}', '\0', '\0']), ('\u{118dd}', ['\u{118bd}', '\0', '\0']), - ('\u{118de}', ['\u{118be}', '\0', '\0']), ('\u{118df}', ['\u{118bf}', '\0', '\0']), - ('\u{16e60}', ['\u{16e40}', '\0', '\0']), ('\u{16e61}', ['\u{16e41}', '\0', '\0']), - ('\u{16e62}', ['\u{16e42}', '\0', '\0']), ('\u{16e63}', ['\u{16e43}', '\0', '\0']), - ('\u{16e64}', ['\u{16e44}', '\0', '\0']), ('\u{16e65}', ['\u{16e45}', '\0', '\0']), - ('\u{16e66}', ['\u{16e46}', '\0', '\0']), ('\u{16e67}', ['\u{16e47}', '\0', '\0']), - ('\u{16e68}', ['\u{16e48}', '\0', '\0']), ('\u{16e69}', ['\u{16e49}', '\0', '\0']), - ('\u{16e6a}', ['\u{16e4a}', '\0', '\0']), ('\u{16e6b}', ['\u{16e4b}', '\0', '\0']), - ('\u{16e6c}', ['\u{16e4c}', '\0', '\0']), ('\u{16e6d}', ['\u{16e4d}', '\0', '\0']), - ('\u{16e6e}', ['\u{16e4e}', '\0', '\0']), ('\u{16e6f}', ['\u{16e4f}', '\0', '\0']), - ('\u{16e70}', ['\u{16e50}', '\0', '\0']), ('\u{16e71}', ['\u{16e51}', '\0', '\0']), - ('\u{16e72}', ['\u{16e52}', '\0', '\0']), ('\u{16e73}', ['\u{16e53}', '\0', '\0']), - ('\u{16e74}', ['\u{16e54}', '\0', '\0']), ('\u{16e75}', ['\u{16e55}', '\0', '\0']), - ('\u{16e76}', ['\u{16e56}', '\0', '\0']), ('\u{16e77}', ['\u{16e57}', '\0', '\0']), - ('\u{16e78}', ['\u{16e58}', '\0', '\0']), ('\u{16e79}', ['\u{16e59}', '\0', '\0']), - ('\u{16e7a}', ['\u{16e5a}', '\0', '\0']), ('\u{16e7b}', ['\u{16e5b}', '\0', '\0']), - ('\u{16e7c}', ['\u{16e5c}', '\0', '\0']), ('\u{16e7d}', ['\u{16e5d}', '\0', '\0']), - ('\u{16e7e}', ['\u{16e5e}', '\0', '\0']), ('\u{16e7f}', ['\u{16e5f}', '\0', '\0']), - ('\u{1e922}', ['\u{1e900}', '\0', '\0']), ('\u{1e923}', ['\u{1e901}', '\0', '\0']), - ('\u{1e924}', ['\u{1e902}', '\0', '\0']), ('\u{1e925}', ['\u{1e903}', '\0', '\0']), - ('\u{1e926}', ['\u{1e904}', '\0', '\0']), ('\u{1e927}', ['\u{1e905}', '\0', '\0']), - ('\u{1e928}', ['\u{1e906}', '\0', '\0']), ('\u{1e929}', ['\u{1e907}', '\0', '\0']), - ('\u{1e92a}', ['\u{1e908}', '\0', '\0']), ('\u{1e92b}', ['\u{1e909}', '\0', '\0']), - ('\u{1e92c}', ['\u{1e90a}', '\0', '\0']), ('\u{1e92d}', ['\u{1e90b}', '\0', '\0']), - ('\u{1e92e}', ['\u{1e90c}', '\0', '\0']), ('\u{1e92f}', ['\u{1e90d}', '\0', '\0']), - ('\u{1e930}', ['\u{1e90e}', '\0', '\0']), ('\u{1e931}', ['\u{1e90f}', '\0', '\0']), - ('\u{1e932}', ['\u{1e910}', '\0', '\0']), ('\u{1e933}', ['\u{1e911}', '\0', '\0']), - ('\u{1e934}', ['\u{1e912}', '\0', '\0']), ('\u{1e935}', ['\u{1e913}', '\0', '\0']), - ('\u{1e936}', ['\u{1e914}', '\0', '\0']), ('\u{1e937}', ['\u{1e915}', '\0', '\0']), - ('\u{1e938}', ['\u{1e916}', '\0', '\0']), ('\u{1e939}', ['\u{1e917}', '\0', '\0']), - ('\u{1e93a}', ['\u{1e918}', '\0', '\0']), ('\u{1e93b}', ['\u{1e919}', '\0', '\0']), - ('\u{1e93c}', ['\u{1e91a}', '\0', '\0']), ('\u{1e93d}', ['\u{1e91b}', '\0', '\0']), - ('\u{1e93e}', ['\u{1e91c}', '\0', '\0']), ('\u{1e93f}', ['\u{1e91d}', '\0', '\0']), - ('\u{1e940}', ['\u{1e91e}', '\0', '\0']), ('\u{1e941}', ['\u{1e91f}', '\0', '\0']), - ('\u{1e942}', ['\u{1e920}', '\0', '\0']), ('\u{1e943}', ['\u{1e921}', '\0', '\0']) - ]; -} diff --git a/src/libcore/unicode/unicode.py b/src/libcore/unicode/unicode.py deleted file mode 100755 index 97df92a56d..0000000000 --- a/src/libcore/unicode/unicode.py +++ /dev/null @@ -1,878 +0,0 @@ -#!/usr/bin/env python - -""" -Regenerate Unicode tables (tables.rs). -""" - -# This script uses the Unicode tables as defined -# in the UnicodeFiles class. - -# Since this should not require frequent updates, we just store this -# out-of-line and check the tables.rs file into git. - -# Note that the "curl" program is required for operation. -# This script is compatible with Python 2.7 and 3.x. - -import argparse -import datetime -import fileinput -import itertools -import os -import re -import textwrap -import subprocess - -from collections import defaultdict, namedtuple - -try: - # Python 3 - from itertools import zip_longest - from io import StringIO -except ImportError: - # Python 2 compatibility - zip_longest = itertools.izip_longest - from StringIO import StringIO - -try: - # Completely optional type hinting - # (Python 2 compatible using comments, - # see: https://mypy.readthedocs.io/en/latest/python2.html) - # This is very helpful in typing-aware IDE like PyCharm. - from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple -except ImportError: - pass - - -# We don't use enum.Enum because of Python 2.7 compatibility. -class UnicodeFiles(object): - # ReadMe does not contain any Unicode data, we - # only use it to extract versions. - README = "ReadMe.txt" - - DERIVED_CORE_PROPERTIES = "DerivedCoreProperties.txt" - DERIVED_NORMALIZATION_PROPS = "DerivedNormalizationProps.txt" - PROPS = "PropList.txt" - SCRIPTS = "Scripts.txt" - SPECIAL_CASING = "SpecialCasing.txt" - UNICODE_DATA = "UnicodeData.txt" - - -# The order doesn't really matter (Python < 3.6 won't preserve it), -# we only want to aggregate all the file names. -ALL_UNICODE_FILES = tuple( - value for name, value in UnicodeFiles.__dict__.items() - if not name.startswith("_") -) - -assert len(ALL_UNICODE_FILES) == 7, "Unexpected number of unicode files" - -# The directory this file is located in. -THIS_DIR = os.path.dirname(os.path.realpath(__file__)) - -# Where to download the Unicode data. The downloaded files -# will be placed in sub-directories named after Unicode version. -FETCH_DIR = os.path.join(THIS_DIR, "downloaded") - -FETCH_URL_LATEST = "ftp://ftp.unicode.org/Public/UNIDATA/{filename}" -FETCH_URL_VERSION = "ftp://ftp.unicode.org/Public/{version}/ucd/{filename}" - -PREAMBLE = """\ -// NOTE: The following code was generated by "./unicode.py", do not edit directly - -#![allow(missing_docs, non_upper_case_globals, non_snake_case, clippy::unreadable_literal)] - -use crate::unicode::bool_trie::{{BoolTrie, SmallBoolTrie}}; -use crate::unicode::version::UnicodeVersion; -""".format(year=datetime.datetime.now().year) - -# Mapping taken from Table 12 from: -# http://www.unicode.org/reports/tr44/#General_Category_Values -EXPANDED_CATEGORIES = { - "Lu": ["LC", "L"], "Ll": ["LC", "L"], "Lt": ["LC", "L"], - "Lm": ["L"], "Lo": ["L"], - "Mn": ["M"], "Mc": ["M"], "Me": ["M"], - "Nd": ["N"], "Nl": ["N"], "No": ["N"], - "Pc": ["P"], "Pd": ["P"], "Ps": ["P"], "Pe": ["P"], - "Pi": ["P"], "Pf": ["P"], "Po": ["P"], - "Sm": ["S"], "Sc": ["S"], "Sk": ["S"], "So": ["S"], - "Zs": ["Z"], "Zl": ["Z"], "Zp": ["Z"], - "Cc": ["C"], "Cf": ["C"], "Cs": ["C"], "Co": ["C"], "Cn": ["C"], -} - -# This is the (inclusive) range of surrogate codepoints. -# These are not valid Rust characters. -SURROGATE_CODEPOINTS_RANGE = (0xd800, 0xdfff) - -UnicodeData = namedtuple( - "UnicodeData", ( - # Conversions: - "to_upper", "to_lower", "to_title", - - # Decompositions: canonical decompositions, compatibility decomp - "canon_decomp", "compat_decomp", - - # Grouped: general categories and combining characters - "general_categories", "combines", - ) -) - -UnicodeVersion = namedtuple( - "UnicodeVersion", ("major", "minor", "micro", "as_str") -) - - -def fetch_files(version=None): - # type: (str) -> UnicodeVersion - """ - Fetch all the Unicode files from unicode.org. - - This will use cached files (stored in `FETCH_DIR`) if they exist, - creating them if they don't. In any case, the Unicode version - is always returned. - - :param version: The desired Unicode version, as string. - (If None, defaults to latest final release available, - querying the unicode.org service). - """ - have_version = check_stored_version(version) - if have_version: - return have_version - - if version: - # Check if the desired version exists on the server. - get_fetch_url = lambda name: FETCH_URL_VERSION.format(version=version, filename=name) - else: - # Extract the latest version. - get_fetch_url = lambda name: FETCH_URL_LATEST.format(filename=name) - - readme_url = get_fetch_url(UnicodeFiles.README) - - print("Fetching: {}".format(readme_url)) - readme_content = subprocess.check_output(("curl", readme_url)) - - unicode_version = parse_readme_unicode_version( - readme_content.decode("utf8") - ) - - download_dir = get_unicode_dir(unicode_version) - if not os.path.exists(download_dir): - # For 2.7 compat, we don't use `exist_ok=True`. - os.makedirs(download_dir) - - for filename in ALL_UNICODE_FILES: - file_path = get_unicode_file_path(unicode_version, filename) - - if os.path.exists(file_path): - # Assume file on the server didn't change if it's been saved before. - continue - - if filename == UnicodeFiles.README: - with open(file_path, "wb") as fd: - fd.write(readme_content) - else: - url = get_fetch_url(filename) - print("Fetching: {}".format(url)) - subprocess.check_call(("curl", "-o", file_path, url)) - - return unicode_version - - -def check_stored_version(version): - # type: (Optional[str]) -> Optional[UnicodeVersion] - """ - Given desired Unicode version, return the version - if stored files are all present, and `None` otherwise. - """ - if not version: - # If no desired version specified, we should check what's the latest - # version, skipping stored version checks. - return None - - fetch_dir = os.path.join(FETCH_DIR, version) - - for filename in ALL_UNICODE_FILES: - file_path = os.path.join(fetch_dir, filename) - - if not os.path.exists(file_path): - return None - - with open(os.path.join(fetch_dir, UnicodeFiles.README)) as fd: - return parse_readme_unicode_version(fd.read()) - - -def parse_readme_unicode_version(readme_content): - # type: (str) -> UnicodeVersion - """ - Parse the Unicode version contained in their `ReadMe.txt` file. - """ - # "Raw string" is necessary for \d not being treated as escape char - # (for the sake of compat with future Python versions). - # See: https://docs.python.org/3.6/whatsnew/3.6.html#deprecated-python-behavior - pattern = r"for Version (\d+)\.(\d+)\.(\d+) of the Unicode" - groups = re.search(pattern, readme_content).groups() - - return UnicodeVersion(*map(int, groups), as_str=".".join(groups)) - - -def get_unicode_dir(unicode_version): - # type: (UnicodeVersion) -> str - """ - Indicate in which parent dir the Unicode data files should be stored. - - This returns a full, absolute path. - """ - return os.path.join(FETCH_DIR, unicode_version.as_str) - - -def get_unicode_file_path(unicode_version, filename): - # type: (UnicodeVersion, str) -> str - """ - Indicate where the Unicode data file should be stored. - """ - return os.path.join(get_unicode_dir(unicode_version), filename) - - -def is_surrogate(n): - # type: (int) -> bool - """ - Tell if given codepoint is a surrogate (not a valid Rust character). - """ - return SURROGATE_CODEPOINTS_RANGE[0] <= n <= SURROGATE_CODEPOINTS_RANGE[1] - - -def load_unicode_data(file_path): - # type: (str) -> UnicodeData - """ - Load main Unicode data. - """ - # Conversions - to_lower = {} # type: Dict[int, Tuple[int, int, int]] - to_upper = {} # type: Dict[int, Tuple[int, int, int]] - to_title = {} # type: Dict[int, Tuple[int, int, int]] - - # Decompositions - compat_decomp = {} # type: Dict[int, List[int]] - canon_decomp = {} # type: Dict[int, List[int]] - - # Combining characters - # FIXME: combines are not used - combines = defaultdict(set) # type: Dict[str, Set[int]] - - # Categories - general_categories = defaultdict(set) # type: Dict[str, Set[int]] - category_assigned_codepoints = set() # type: Set[int] - - all_codepoints = {} - - range_start = -1 - - for line in fileinput.input(file_path): - data = line.split(";") - if len(data) != 15: - continue - codepoint = int(data[0], 16) - if is_surrogate(codepoint): - continue - if range_start >= 0: - for i in range(range_start, codepoint): - all_codepoints[i] = data - range_start = -1 - if data[1].endswith(", First>"): - range_start = codepoint - continue - all_codepoints[codepoint] = data - - for code, data in all_codepoints.items(): - (code_org, name, gencat, combine, bidi, - decomp, deci, digit, num, mirror, - old, iso, upcase, lowcase, titlecase) = data - - # Generate char to char direct common and simple conversions: - - # Uppercase to lowercase - if lowcase != "" and code_org != lowcase: - to_lower[code] = (int(lowcase, 16), 0, 0) - - # Lowercase to uppercase - if upcase != "" and code_org != upcase: - to_upper[code] = (int(upcase, 16), 0, 0) - - # Title case - if titlecase.strip() != "" and code_org != titlecase: - to_title[code] = (int(titlecase, 16), 0, 0) - - # Store decomposition, if given - if decomp: - decompositions = decomp.split()[1:] - decomp_code_points = [int(i, 16) for i in decompositions] - - if decomp.startswith("<"): - # Compatibility decomposition - compat_decomp[code] = decomp_code_points - else: - # Canonical decomposition - canon_decomp[code] = decomp_code_points - - # Place letter in categories as appropriate. - for cat in itertools.chain((gencat, ), EXPANDED_CATEGORIES.get(gencat, [])): - general_categories[cat].add(code) - category_assigned_codepoints.add(code) - - # Record combining class, if any. - if combine != "0": - combines[combine].add(code) - - # Generate Not_Assigned from Assigned. - general_categories["Cn"] = get_unassigned_codepoints(category_assigned_codepoints) - - # Other contains Not_Assigned - general_categories["C"].update(general_categories["Cn"]) - - grouped_categories = group_categories(general_categories) - - # FIXME: combines are not used - return UnicodeData( - to_lower=to_lower, to_upper=to_upper, to_title=to_title, - compat_decomp=compat_decomp, canon_decomp=canon_decomp, - general_categories=grouped_categories, combines=combines, - ) - - -def load_special_casing(file_path, unicode_data): - # type: (str, UnicodeData) -> None - """ - Load special casing data and enrich given Unicode data. - """ - for line in fileinput.input(file_path): - data = line.split("#")[0].split(";") - if len(data) == 5: - code, lower, title, upper, _comment = data - elif len(data) == 6: - code, lower, title, upper, condition, _comment = data - if condition.strip(): # Only keep unconditional mappins - continue - else: - continue - code = code.strip() - lower = lower.strip() - title = title.strip() - upper = upper.strip() - key = int(code, 16) - for (map_, values) in ((unicode_data.to_lower, lower), - (unicode_data.to_upper, upper), - (unicode_data.to_title, title)): - if values != code: - split = values.split() - - codepoints = list(itertools.chain( - (int(i, 16) for i in split), - (0 for _ in range(len(split), 3)) - )) - - assert len(codepoints) == 3 - map_[key] = codepoints - - -def group_categories(mapping): - # type: (Dict[Any, Iterable[int]]) -> Dict[str, List[Tuple[int, int]]] - """ - Group codepoints mapped in "categories". - """ - return {category: group_codepoints(codepoints) - for category, codepoints in mapping.items()} - - -def group_codepoints(codepoints): - # type: (Iterable[int]) -> List[Tuple[int, int]] - """ - Group integral values into continuous, disjoint value ranges. - - Performs value deduplication. - - :return: sorted list of pairs denoting start and end of codepoint - group values, both ends inclusive. - - >>> group_codepoints([1, 2, 10, 11, 12, 3, 4]) - [(1, 4), (10, 12)] - >>> group_codepoints([1]) - [(1, 1)] - >>> group_codepoints([1, 5, 6]) - [(1, 1), (5, 6)] - >>> group_codepoints([]) - [] - """ - sorted_codes = sorted(set(codepoints)) - result = [] # type: List[Tuple[int, int]] - - if not sorted_codes: - return result - - next_codes = sorted_codes[1:] - start_code = sorted_codes[0] - - for code, next_code in zip_longest(sorted_codes, next_codes, fillvalue=None): - if next_code is None or next_code - code != 1: - result.append((start_code, code)) - start_code = next_code - - return result - - -def ungroup_codepoints(codepoint_pairs): - # type: (Iterable[Tuple[int, int]]) -> List[int] - """ - The inverse of group_codepoints -- produce a flat list of values - from value range pairs. - - >>> ungroup_codepoints([(1, 4), (10, 12)]) - [1, 2, 3, 4, 10, 11, 12] - >>> ungroup_codepoints([(1, 1), (5, 6)]) - [1, 5, 6] - >>> ungroup_codepoints(group_codepoints([1, 2, 7, 8])) - [1, 2, 7, 8] - >>> ungroup_codepoints([]) - [] - """ - return list(itertools.chain.from_iterable( - range(lo, hi + 1) for lo, hi in codepoint_pairs - )) - - -def get_unassigned_codepoints(assigned_codepoints): - # type: (Set[int]) -> Set[int] - """ - Given a set of "assigned" codepoints, return a set - of these that are not in assigned and not surrogate. - """ - return {i for i in range(0, 0x110000) - if i not in assigned_codepoints and not is_surrogate(i)} - - -def generate_table_lines(items, indent, wrap=98): - # type: (Iterable[str], int, int) -> Iterator[str] - """ - Given table items, generate wrapped lines of text with comma-separated items. - - This is a generator function. - - :param wrap: soft wrap limit (characters per line), integer. - """ - line = " " * indent - first = True - for item in items: - if len(line) + len(item) < wrap: - if first: - line += item - else: - line += ", " + item - first = False - else: - yield line + ",\n" - line = " " * indent + item - - yield line - - -def load_properties(file_path, interesting_props): - # type: (str, Iterable[str]) -> Dict[str, List[Tuple[int, int]]] - """ - Load properties data and return in grouped form. - """ - props = defaultdict(list) # type: Dict[str, List[Tuple[int, int]]] - # "Raw string" is necessary for `\.` and `\w` not to be treated as escape chars - # (for the sake of compat with future Python versions). - # See: https://docs.python.org/3.6/whatsnew/3.6.html#deprecated-python-behavior - re1 = re.compile(r"^ *([0-9A-F]+) *; *(\w+)") - re2 = re.compile(r"^ *([0-9A-F]+)\.\.([0-9A-F]+) *; *(\w+)") - - for line in fileinput.input(file_path): - match = re1.match(line) or re2.match(line) - if match: - groups = match.groups() - - if len(groups) == 2: - # `re1` matched (2 groups). - d_lo, prop = groups - d_hi = d_lo - else: - d_lo, d_hi, prop = groups - else: - continue - - if interesting_props and prop not in interesting_props: - continue - - lo_value = int(d_lo, 16) - hi_value = int(d_hi, 16) - - props[prop].append((lo_value, hi_value)) - - # Optimize if possible. - for prop in props: - props[prop] = group_codepoints(ungroup_codepoints(props[prop])) - - return props - - -def escape_char(c): - # type: (int) -> str - r""" - Escape a codepoint for use as Rust char literal. - - Outputs are OK to use as Rust source code as char literals - and they also include necessary quotes. - - >>> escape_char(97) - "'\\u{61}'" - >>> escape_char(0) - "'\\0'" - """ - return r"'\u{%x}'" % c if c != 0 else r"'\0'" - - -def format_char_pair(pair): - # type: (Tuple[int, int]) -> str - """ - Format a pair of two Rust chars. - """ - return "(%s,%s)" % (escape_char(pair[0]), escape_char(pair[1])) - - -def generate_table( - name, # type: str - items, # type: List[Tuple[int, int]] - decl_type="&[(char, char)]", # type: str - is_pub=True, # type: bool - format_item=format_char_pair, # type: Callable[[Tuple[int, int]], str] -): - # type: (...) -> Iterator[str] - """ - Generate a nicely formatted Rust constant "table" array. - - This generates actual Rust code. - """ - pub_string = "" - if is_pub: - pub_string = "pub " - - yield "\n" - yield " #[rustfmt::skip]\n" - yield " %sconst %s: %s = &[\n" % (pub_string, name, decl_type) - - data = [] - first = True - for item in items: - if not first: - data.append(",") - first = False - data.extend(format_item(item)) - - for table_line in generate_table_lines("".join(data).split(","), 8): - yield table_line - - yield "\n ];\n" - - -def compute_trie(raw_data, chunk_size): - # type: (List[int], int) -> Tuple[List[int], List[int]] - """ - Compute postfix-compressed trie. - - See: bool_trie.rs for more details. - - >>> compute_trie([1, 2, 3, 1, 2, 3, 4, 5, 6], 3) - ([0, 0, 1], [1, 2, 3, 4, 5, 6]) - >>> compute_trie([1, 2, 3, 1, 2, 4, 4, 5, 6], 3) - ([0, 1, 2], [1, 2, 3, 1, 2, 4, 4, 5, 6]) - """ - root = [] - childmap = {} # type: Dict[Tuple[int, ...], int] - child_data = [] - - assert len(raw_data) % chunk_size == 0, "Chunks must be equally sized" - - for i in range(len(raw_data) // chunk_size): - data = raw_data[i * chunk_size : (i + 1) * chunk_size] - - # Postfix compression of child nodes (data chunks) - # (identical child nodes are shared). - - # Make a tuple out of the list so it's hashable. - child = tuple(data) - if child not in childmap: - childmap[child] = len(childmap) - child_data.extend(data) - - root.append(childmap[child]) - - return root, child_data - - -def generate_bool_trie(name, codepoint_ranges, is_pub=False): - # type: (str, List[Tuple[int, int]], bool) -> Iterator[str] - """ - Generate Rust code for BoolTrie struct. - - This yields string fragments that should be joined to produce - the final string. - - See: `bool_trie.rs`. - """ - chunk_size = 64 - rawdata = [False] * 0x110000 - for (lo, hi) in codepoint_ranges: - for cp in range(lo, hi + 1): - rawdata[cp] = True - - # Convert to bitmap chunks of `chunk_size` bits each. - chunks = [] - for i in range(0x110000 // chunk_size): - chunk = 0 - for j in range(chunk_size): - if rawdata[i * chunk_size + j]: - chunk |= 1 << j - chunks.append(chunk) - - pub_string = "" - if is_pub: - pub_string = "pub " - - yield "\n" - yield " #[rustfmt::skip]\n" - yield " %sconst %s: &super::BoolTrie = &super::BoolTrie {\n" % (pub_string, name) - yield " r1: [\n" - data = ("0x%016x" % chunk for chunk in chunks[:0x800 // chunk_size]) - for fragment in generate_table_lines(data, 12): - yield fragment - yield "\n ],\n" - - # 0x800..0x10000 trie - (r2, r3) = compute_trie(chunks[0x800 // chunk_size : 0x10000 // chunk_size], 64 // chunk_size) - yield " r2: [\n" - data = map(str, r2) - for fragment in generate_table_lines(data, 12): - yield fragment - yield "\n ],\n" - - yield " r3: &[\n" - data = ("0x%016x" % node for node in r3) - for fragment in generate_table_lines(data, 12): - yield fragment - yield "\n ],\n" - - # 0x10000..0x110000 trie - (mid, r6) = compute_trie(chunks[0x10000 // chunk_size : 0x110000 // chunk_size], - 64 // chunk_size) - (r4, r5) = compute_trie(mid, 64) - - yield " r4: [\n" - data = map(str, r4) - for fragment in generate_table_lines(data, 12): - yield fragment - yield "\n ],\n" - - yield " r5: &[\n" - data = map(str, r5) - for fragment in generate_table_lines(data, 12): - yield fragment - yield "\n ],\n" - - yield " r6: &[\n" - data = ("0x%016x" % node for node in r6) - for fragment in generate_table_lines(data, 12): - yield fragment - yield "\n ],\n" - - yield " };\n" - - -def generate_small_bool_trie(name, codepoint_ranges, is_pub=False): - # type: (str, List[Tuple[int, int]], bool) -> Iterator[str] - """ - Generate Rust code for `SmallBoolTrie` struct. - - See: `bool_trie.rs`. - """ - last_chunk = max(hi // 64 for (lo, hi) in codepoint_ranges) - n_chunks = last_chunk + 1 - chunks = [0] * n_chunks - for (lo, hi) in codepoint_ranges: - for cp in range(lo, hi + 1): - assert cp // 64 < len(chunks) - chunks[cp // 64] |= 1 << (cp & 63) - - pub_string = "" - if is_pub: - pub_string = "pub " - - yield "\n" - yield " #[rustfmt::skip]\n" - yield (" %sconst %s: &super::SmallBoolTrie = &super::SmallBoolTrie {\n" - % (pub_string, name)) - - (r1, r2) = compute_trie(chunks, 1) - - yield " r1: &[\n" - data = (str(node) for node in r1) - for fragment in generate_table_lines(data, 12): - yield fragment - yield "\n ],\n" - - yield " r2: &[\n" - data = ("0x%016x" % node for node in r2) - for fragment in generate_table_lines(data, 12): - yield fragment - yield "\n ],\n" - - yield " };\n" - - -def generate_property_module(mod, grouped_categories, category_subset): - # type: (str, Dict[str, List[Tuple[int, int]]], Iterable[str]) -> Iterator[str] - """ - Generate Rust code for module defining properties. - """ - - yield "pub(crate) mod %s {" % mod - for cat in sorted(category_subset): - if cat in ("Cc", "White_Space"): - generator = generate_small_bool_trie("%s_table" % cat, grouped_categories[cat]) - else: - generator = generate_bool_trie("%s_table" % cat, grouped_categories[cat]) - - for fragment in generator: - yield fragment - - yield "\n" - yield " pub fn %s(c: char) -> bool {\n" % cat - yield " %s_table.lookup(c)\n" % cat - yield " }\n" - - yield "}\n\n" - - -def generate_conversions_module(unicode_data): - # type: (UnicodeData) -> Iterator[str] - """ - Generate Rust code for module defining conversions. - """ - - yield "pub(crate) mod conversions {" - yield """ - pub fn to_lower(c: char) -> [char; 3] { - match bsearch_case_table(c, to_lowercase_table) { - None => [c, '\\0', '\\0'], - Some(index) => to_lowercase_table[index].1, - } - } - - pub fn to_upper(c: char) -> [char; 3] { - match bsearch_case_table(c, to_uppercase_table) { - None => [c, '\\0', '\\0'], - Some(index) => to_uppercase_table[index].1, - } - } - - fn bsearch_case_table(c: char, table: &[(char, [char; 3])]) -> Option { - table.binary_search_by(|&(key, _)| key.cmp(&c)).ok() - }\n""" - - decl_type = "&[(char, [char; 3])]" - format_conversion = lambda x: "({},[{},{},{}])".format(*( - escape_char(c) for c in (x[0], x[1][0], x[1][1], x[1][2]) - )) - - for fragment in generate_table( - name="to_lowercase_table", - items=sorted(unicode_data.to_lower.items(), key=lambda x: x[0]), - decl_type=decl_type, - is_pub=False, - format_item=format_conversion - ): - yield fragment - - for fragment in generate_table( - name="to_uppercase_table", - items=sorted(unicode_data.to_upper.items(), key=lambda x: x[0]), - decl_type=decl_type, - is_pub=False, - format_item=format_conversion - ): - yield fragment - - yield "}\n" - - -def parse_args(): - # type: () -> argparse.Namespace - """ - Parse command line arguments. - """ - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("-v", "--version", default=None, type=str, - help="Unicode version to use (if not specified," - " defaults to latest release).") - - return parser.parse_args() - - -def main(): - # type: () -> None - """ - Script entry point. - """ - args = parse_args() - - unicode_version = fetch_files(args.version) - print("Using Unicode version: {}".format(unicode_version.as_str)) - - # All the writing happens entirely in memory, we only write to file - # once we have generated the file content (it's not very large, <1 MB). - buf = StringIO() - buf.write(PREAMBLE) - - unicode_version_notice = textwrap.dedent(""" - /// The version of [Unicode](http://www.unicode.org/) that the Unicode parts of - /// `char` and `str` methods are based on. - #[unstable(feature = "unicode_version", issue = "49726")] - pub const UNICODE_VERSION: UnicodeVersion = - UnicodeVersion {{ major: {v.major}, minor: {v.minor}, micro: {v.micro}, _priv: () }}; - """).format(v=unicode_version) - buf.write(unicode_version_notice) - - get_path = lambda f: get_unicode_file_path(unicode_version, f) - - unicode_data = load_unicode_data(get_path(UnicodeFiles.UNICODE_DATA)) - load_special_casing(get_path(UnicodeFiles.SPECIAL_CASING), unicode_data) - - want_derived = {"Alphabetic", "Lowercase", "Uppercase", - "Cased", "Case_Ignorable", "Grapheme_Extend"} - derived = load_properties(get_path(UnicodeFiles.DERIVED_CORE_PROPERTIES), want_derived) - - props = load_properties(get_path(UnicodeFiles.PROPS), - {"White_Space", "Join_Control", "Noncharacter_Code_Point"}) - - # Category tables - for (name, categories, category_subset) in ( - ("general_category", unicode_data.general_categories, ["N", "Cc"]), - ("derived_property", derived, want_derived), - ("property", props, ["White_Space"]) - ): - for fragment in generate_property_module(name, categories, category_subset): - buf.write(fragment) - - for fragment in generate_conversions_module(unicode_data): - buf.write(fragment) - - tables_rs_path = os.path.join(THIS_DIR, "tables.rs") - - # Actually write out the file content. - # Will overwrite the file if it exists. - with open(tables_rs_path, "w") as fd: - fd.write(buf.getvalue()) - - print("Regenerated tables.rs.") - - -if __name__ == "__main__": - main() diff --git a/src/libcore/unicode/unicode_data.rs b/src/libcore/unicode/unicode_data.rs new file mode 100644 index 0000000000..da4cd4e9b1 --- /dev/null +++ b/src/libcore/unicode/unicode_data.rs @@ -0,0 +1,2343 @@ +///! This file is generated by src/tools/unicode-table-generator; do not edit manually! +use super::range_search; + +pub const UNICODE_VERSION: (u32, u32, u32) = (12, 1, 0); + +#[rustfmt::skip] +pub mod alphabetic { + static BITSET_LAST_CHUNK_MAP: (u16, u8) = (190, 37); + static BITSET_CHUNKS_MAP: [u8; 187] = [ + 6, 32, 10, 18, 19, 23, 21, 12, 7, 5, 0, 20, 14, 49, 49, 49, 49, 49, 49, 36, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 47, 49, 30, 8, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 45, 0, 0, 0, 0, 0, 0, 0, 0, 4, 35, 17, 31, 16, 25, 24, 26, 13, 15, + 44, 27, 0, 0, 49, 11, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 38, 1, 49, 49, 49, 49, 49, 48, + 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 28, 0, 0, 0, 0, 0, 29, 0, 0, 9, 0, 33, 2, 3, 0, 0, + 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 41, 49, 49, 49, + 43, 22, 49, 49, 49, 49, 40, 49, 49, 49, 49, 49, 49, 46, + ]; + static BITSET_INDEX_CHUNKS: [[u8; 16]; 50] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 248, 241, 38, 40], + [0, 0, 0, 0, 0, 0, 0, 0, 108, 133, 110, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 190, 200, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 248, 248, 248, 248, 248, 205, 248, 23, 134, 245, 68, 237], + [0, 0, 179, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 103, 99, 176, 248, 248, 248, 248, 248, 248, 248, 61, 0, 151, 217, 178], + [0, 145, 28, 0, 168, 221, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [48, 77, 248, 165, 201, 120, 184, 137, 91, 175, 143, 83, 206, 196, 248, 56], + [53, 0, 0, 0, 126, 15, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0], + [59, 54, 127, 199, 167, 186, 157, 114, 154, 84, 160, 115, 158, 66, 155, 21], + [62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [91, 129, 164, 101, 248, 248, 248, 79, 248, 248, 248, 248, 230, 128, 135, 117], + [97, 0, 220, 144, 0, 0, 212, 44, 142, 240, 30, 97, 0, 0, 0, 0], + [116, 247, 219, 171, 188, 248, 104, 190, 0, 0, 0, 0, 0, 0, 0, 0], + [141, 185, 88, 0, 149, 213, 22, 0, 0, 0, 0, 89, 0, 0, 0, 0], + [147, 90, 35, 82, 98, 0, 153, 0, 85, 119, 29, 45, 86, 71, 18, 0], + [150, 32, 248, 107, 0, 81, 0, 0, 0, 0, 227, 17, 211, 105, 231, 19], + [162, 41, 161, 69, 163, 173, 123, 73, 106, 14, 124, 37, 1, 187, 121, 0], + [172, 240, 228, 170, 248, 248, 248, 248, 248, 229, 138, 235, 234, 24, 222, 125], + [208, 233, 248, 74, 204, 64, 140, 232, 63, 0, 0, 0, 0, 0, 0, 0], + [220, 97, 202, 86, 94, 78, 203, 9, 226, 80, 46, 0, 183, 11, 174, 67], + [231, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248], + [247, 248, 248, 248, 248, 248, 248, 248, 248, 209, 225, 95, 76, 75, 180, 25], + [248, 5, 96, 50, 72, 87, 248, 26, 132, 0, 198, 51, 159, 42, 0, 0], + [248, 8, 72, 72, 49, 0, 0, 0, 0, 0, 0, 0, 194, 5, 0, 89], + [248, 36, 248, 7, 0, 0, 139, 31, 143, 3, 93, 0, 55, 0, 0, 0], + [248, 62, 248, 248, 248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [248, 118, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [248, 236, 166, 246, 136, 239, 248, 248, 248, 248, 215, 169, 182, 207, 214, 12], + [248, 248, 13, 130, 248, 248, 248, 248, 57, 146, 248, 65, 218, 248, 243, 177], + [248, 248, 191, 111, 197, 43, 0, 0, 248, 248, 248, 248, 91, 47, 0, 0], + [248, 248, 244, 248, 189, 223, 152, 70, 224, 210, 248, 148, 240, 242, 68, 100], + [248, 248, 248, 4, 248, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [248, 248, 248, 248, 35, 195, 248, 248, 248, 248, 248, 113, 0, 0, 0, 0], + [248, 248, 248, 248, 131, 240, 238, 109, 0, 181, 248, 122, 102, 216, 143, 27], + [248, 248, 248, 248, 248, 248, 86, 0, 248, 248, 248, 248, 248, 248, 248, 248], + [248, 248, 248, 248, 248, 248, 248, 248, 33, 0, 0, 0, 0, 0, 0, 0], + [248, 248, 248, 248, 248, 248, 248, 248, 97, 35, 0, 60, 65, 156, 16, 0], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 6, 0, 0, 0, 0, 0, 0], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 192, 248, 248, 248, 248, 248], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 20, 248, 248, 248, 248], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 72, 0, 0, 0, 0], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 81, 248, 248, 248], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 23, 0], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 193, 112], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 39], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 65], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 92], + [248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248], + ]; + static BITSET: [u64; 249] = [ + 0, 1, 15, 17, 31, 63, 127, 179, 511, 1023, 2191, 4079, 4087, 8191, 8319, 16384, 65535, + 131071, 262143, 4128527, 8388607, 8461767, 24870911, 67108863, 134217727, 276824575, + 335544350, 486341884, 536805376, 536870911, 553648127, 1056964608, 1073692671, 1073741823, + 1140785663, 2147483647, 2147485627, 4026540127, 4294934783, 8589934591, 47244640256, + 64548249055, 68191066527, 68719476735, 115913785343, 137438953215, 549755813888, + 1095220854783, 1099511627711, 1099511627775, 2199023190016, 2199023255551, 4398046511103, + 8641373536127, 8791831609343, 8795690369023, 8796093022207, 13198434443263, 17592186044415, + 35184321757183, 70368744112128, 88094074470339, 140737488355327, 140737488355328, + 141836999983103, 281474976710655, 563017343310239, 1125625028935679, 1125899906842623, + 1688915364814303, 2119858418286774, 2251795522912255, 2251799813685247, 3377704004976767, + 3509778554814463, 3905461007941631, 4503595333443583, 4503599627370495, 8796093022142464, + 9006649498927104, 9007192812290047, 9007199254740991, 15762594400829440, 17169970223906821, + 17732925109967239, 18014398491652207, 18014398509481983, 20266198323101808, + 36027697507139583, 36028792723996672, 36028792728190975, 36028797018963967, + 72057594037927935, 90071992547409919, 143851303137705983, 144053615424700415, + 144115188075855868, 144115188075855871, 288230371860938751, 297241973452963840, + 301749971126844416, 319718190147960832, 576460743713488896, 576460743847706622, + 576460748008488959, 576460752303359999, 576460752303423486, 576460752303423487, + 790380184120328175, 1152640029630136575, 1152917029519358975, 1152921504591118335, + 1152921504606845055, 1152921504606846975, 1153765996922689951, 2161727885562420159, + 2251241253188403424, 2295745090394464220, 2305570330330005503, 2305843004918726656, + 2305843004919250943, 2305843009196916483, 2305843009213693951, 3457638613854978028, + 4323455298678290390, 4557642822898941951, 4575692405780512767, 4602678814877679616, + 4611686017001275199, 4611686018360336384, 4611686018427322368, 4611686018427387903, + 4656722014700830719, 6843210385291930244, 6881498031078244479, 6908521828386340863, + 8935141660164089791, 8935423131384840192, 9168765891372858879, 9169328841326329855, + 9187201948305063935, 9187343239835811327, 9216616637413720063, 9223372036854775807, + 9223372041149743103, 9223934986808197120, 10371930679322607615, 10502394331027995967, + 11241233151490523135, 13006395723845991295, 13258596753222922239, 13609596598936928288, + 13834776580305453567, 13907115649320091647, 14082190885810440174, 14123225865944680428, + 16212958624174047247, 16412803692974677999, 16424062692043104238, 16424062692043104239, + 16424062692043243502, 16424625641996804079, 16429129241624174575, 16717361816799141871, + 16717361816799216127, 16788293510930366511, 17005555242810474495, 17293822569102704639, + 17581979622616071300, 17870283321271910397, 17870283321406070975, 17870283321406128127, + 17978369712463020031, 18158513764145585631, 18158781978395017215, 18194542490281852927, + 18410715276682199039, 18410715276690587772, 18428729675200069631, 18428729675200069632, + 18433233274827440127, 18437455399478099968, 18437736874452713471, 18442240474082181119, + 18444492273895866367, 18445618173802708993, 18446181192473632767, 18446216308128218879, + 18446462598732840928, 18446462598732840959, 18446462598732840960, 18446462599806582783, + 18446462615912710143, 18446462667452317695, 18446463149025525759, 18446463629525450752, + 18446463698110251007, 18446463698244468735, 18446464796682337663, 18446466966713532416, + 18446466996779287551, 18446471394825862144, 18446471394825863167, 18446480190918885375, + 18446498607738650623, 18446532967477018623, 18446602782178705022, 18446603336221163519, + 18446603336221196287, 18446638520593285119, 18446673709243564031, 18446708893632430079, + 18446740770879700992, 18446741595513422027, 18446741874686295551, 18446743249075830783, + 18446743798965862398, 18446744056529672000, 18446744060816261120, 18446744068886102015, + 18446744069414584320, 18446744069414601696, 18446744069414649855, 18446744069456527359, + 18446744069548736512, 18446744069548802046, 18446744069683019775, 18446744069951455231, + 18446744070421282815, 18446744070446333439, 18446744070475743231, 18446744070488326143, + 18446744071553646463, 18446744071562067967, 18446744073696837631, 18446744073701162813, + 18446744073707454463, 18446744073709027328, 18446744073709355007, 18446744073709419615, + 18446744073709486080, 18446744073709520895, 18446744073709543424, 18446744073709550079, + 18446744073709550595, 18446744073709551579, 18446744073709551599, 18446744073709551614, + 18446744073709551615, + ]; + + pub fn lookup(c: char) -> bool { + super::range_search( + c as u32, + &BITSET_CHUNKS_MAP, + BITSET_LAST_CHUNK_MAP, + &BITSET_INDEX_CHUNKS, + &BITSET, + ) + } +} + +#[rustfmt::skip] +pub mod case_ignorable { + static BITSET_LAST_CHUNK_MAP: (u16, u8) = (896, 33); + static BITSET_CHUNKS_MAP: [u8; 125] = [ + 25, 14, 21, 30, 28, 4, 17, 23, 22, 0, 0, 16, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 13, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 6, 9, 0, 7, 11, 32, 31, 26, 29, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, + 10, 0, 8, 0, 20, 0, 12, 0, 1, + ]; + static BITSET_INDEX_CHUNKS: [[u8; 16]; 34] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 47, 52], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 171, 2], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 88, 134, 38], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 102, 6, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 76, 26, 0, 146, 136, 79, 43, 117], + [0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 58, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 165, 97, 75, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 48, 0, 114, 0, 0], + [0, 0, 0, 0, 0, 170, 68, 0, 0, 7, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0], + [0, 0, 0, 28, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 133, 0, 0, 0, 0, 15, 160, 45, 84, 51, 78, 12, 109], + [0, 0, 11, 0, 0, 30, 161, 90, 35, 80, 0, 69, 173, 13, 81, 129], + [0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 131, 0, 85, 0, 148, 0, 175, 73, 0, 0, 0, 0, 0, 0, 0], + [20, 4, 62, 0, 118, 0, 0, 0, 32, 154, 145, 0, 124, 89, 67, 86], + [25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [59, 0, 0, 150, 70, 24, 132, 60, 100, 122, 163, 99, 0, 46, 0, 66], + [63, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0], + [71, 33, 0, 178, 123, 83, 120, 137, 121, 98, 121, 167, 153, 55, 3, 18], + [72, 149, 36, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [104, 133, 0, 110, 174, 105, 177, 166, 0, 0, 0, 0, 0, 0, 155, 139], + [107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [111, 50, 106, 0, 0, 0, 0, 0, 0, 0, 172, 179, 179, 112, 9, 0], + [113, 0, 0, 0, 0, 0, 0, 49, 142, 34, 31, 0, 0, 0, 0, 0], + [116, 0, 42, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140, 93, 37, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0], + [159, 0, 101, 0, 158, 10, 29, 0, 0, 0, 0, 91, 0, 0, 0, 0], + [162, 56, 153, 54, 125, 53, 0, 27, 115, 21, 126, 19, 108, 144, 127, 8], + [168, 41, 151, 5, 0, 0, 157, 39, 156, 1, 103, 0, 65, 0, 0, 0], + [169, 147, 130, 17, 96, 87, 143, 16, 138, 0, 0, 64, 125, 95, 0, 0], + [176, 179, 0, 0, 179, 179, 179, 77, 0, 0, 0, 0, 0, 0, 0, 0], + ]; + static BITSET: [u64; 180] = [ + 0, 1, 3, 4, 8, 13, 15, 28, 64, 176, 191, 1016, 1792, 2047, 4080, 4096, 7680, 8192, 8193, + 16192, 30720, 32704, 32768, 131008, 262016, 2097152, 2359296, 6030336, 8323072, 10682368, + 33554432, 58719232, 159383552, 234881024, 243138688, 402587711, 536805376, 536879204, + 546307648, 805306369, 1073741824, 1073741916, 2113929216, 3221225472, 3758096384, + 4026531840, 4160749568, 4294934528, 4294967296, 4512022528, 5368709120, 17179869183, + 47244640256, 51539615774, 51539619904, 51543810078, 51545914817, 66035122176, 412316860416, + 412316862532, 412316893184, 1030792151040, 2199023255648, 8641373536127, 8763880767488, + 17303886364672, 36421322670080, 65128884076547, 65970697670631, 68168642985984, + 70093866270720, 70368739983360, 136957967529984, 140737488355328, 263882790666240, + 281470547525648, 281470682333183, 281474976710655, 281474976710656, 281474976710657, + 281479271675905, 562675075514368, 562949953355776, 563001509683710, 844424930131968, + 985162418487296, 1023920203366400, 2251799813685248, 3377699721314304, 4494803534348292, + 4503599627370678, 6755399441055744, 7881299349733376, 8444256867844096, 8725724278030336, + 8760633772212225, 8989057312882695, 9042383626829823, 9851624185018758, 24822575045541890, + 28848986089586688, 30958948903026688, 35747322042253312, 53805701016846336, + 58529202969772032, 72066390130950143, 112767012056334336, 143833713099145216, + 189151184399892480, 216172782113783808, 220713756545974272, 288301294651703296, + 302022650010533887, 504262420777140224, 558446353793941504, 572520102629474304, + 593978171557150752, 1008806350890729472, 1009933895770046464, 1152921504606846976, + 1152921504606846978, 1152921504606846982, 1153202979583561736, 1441151880758558727, + 1715871458028158991, 1729382256910270467, 2301902359539744768, 2305843009196908767, + 2305843009213693952, 2612078987781865472, 2771965570646540291, 3458764513820540928, + 3731232291276455943, 4539628424389459968, 4589168020290535424, 4611404543450677248, + 4611686018494513280, 4611686069967003678, 4671217976001691648, 6917775322003857411, + 7421334051581067264, 8070450532247928832, 8788774672813524990, 9205357638345293827, + 9222809086901354496, 9223091111633879040, 9223372036854775808, 9223372036854775935, + 9223512774343131136, 9224216320050987008, 9224497932466651184, 9653465801268658176, + 9727775195120332910, 10376293541461622786, 11526998316797657088, 11529215046068469760, + 12103423998558208000, 12699025049277956096, 13005832773892571136, 13798747783286489088, + 13832665517980123136, 13835058055282032640, 13835058055282163729, 13951307220663664640, + 17870283321406128128, 17906312118425092095, 18158513697557839871, 18158513749097456062, + 18374686479671623680, 18374686479671623682, 18444496122186563584, 18445618173802708992, + 18446462598732840960, 18446462598733004800, 18446726481523507200, 18446744069414584320, + 18446744069414584322, 18446744073575333888, 18446744073709027328, 18446744073709551615, + ]; + + pub fn lookup(c: char) -> bool { + super::range_search( + c as u32, + &BITSET_CHUNKS_MAP, + BITSET_LAST_CHUNK_MAP, + &BITSET_INDEX_CHUNKS, + &BITSET, + ) + } +} + +#[rustfmt::skip] +pub mod cased { + static BITSET_LAST_CHUNK_MAP: (u16, u8) = (124, 6); + static BITSET_CHUNKS_MAP: [u8; 123] = [ + 13, 18, 0, 0, 12, 0, 0, 9, 14, 10, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 2, 0, 16, 0, 8, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, + 0, 0, 0, 7, + ]; + static BITSET_INDEX_CHUNKS: [[u8; 16]; 19] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 8, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 62, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 10, 0, 50, 62, 58, 20], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 42, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 31, 0, 62, 62, 62, 0, 62, 62, 62, 62, 54, 26, 27, 24], + [0, 0, 39, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 51, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 51, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 25], + [0, 22, 19, 37, 62, 62, 36, 61, 62, 62, 18, 12, 0, 30, 49, 38], + [0, 29, 9, 0, 34, 52, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [46, 55, 62, 17, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [62, 6, 42, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [62, 56, 33, 60, 28, 57, 62, 62, 62, 62, 48, 35, 40, 45, 47, 5], + [62, 62, 59, 62, 41, 53, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ]; + static BITSET: [u64; 63] = [ + 0, 15, 24, 511, 1023, 4087, 65535, 16253055, 134217726, 536805376, 1073741823, 4294967295, + 133143986179, 4398046511103, 36009005809663, 70368744177663, 2251799813685247, + 3509778554814463, 144115188074807295, 297241973452963840, 504403158265495676, + 576460743713488896, 576460743847706622, 1152921504591118335, 2295745090394464220, + 4557642822898941951, 4611686017001275199, 6908521828386340863, 8935141660164089791, + 9223934986808197120, 13605092999309557792, 16717361816799216127, 16717361816799223999, + 17005555242810474495, 17446871633794956420, 17870283321271910397, 17870283321406128127, + 18410715276682199039, 18428729675200069631, 18428729675200069632, 18437736874452713471, + 18446462598732840959, 18446462598732840960, 18446463698110251007, 18446466996779287551, + 18446603336221163519, 18446603336221196287, 18446741874686295551, 18446743249075830783, + 18446744056529672000, 18446744056529682432, 18446744069414584320, 18446744069414601696, + 18446744069422972927, 18446744070475743231, 18446744071562067967, 18446744073707454463, + 18446744073709419615, 18446744073709517055, 18446744073709550595, 18446744073709551599, + 18446744073709551600, 18446744073709551615, + ]; + + pub fn lookup(c: char) -> bool { + super::range_search( + c as u32, + &BITSET_CHUNKS_MAP, + BITSET_LAST_CHUNK_MAP, + &BITSET_INDEX_CHUNKS, + &BITSET, + ) + } +} + +#[rustfmt::skip] +pub mod cc { + static BITSET_LAST_CHUNK_MAP: (u16, u8) = (0, 0); + static BITSET_CHUNKS_MAP: [u8; 0] = [ + ]; + static BITSET_INDEX_CHUNKS: [[u8; 16]; 1] = [ + [1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ]; + static BITSET: [u64; 3] = [ + 0, 4294967295, 9223372036854775808, + ]; + + pub fn lookup(c: char) -> bool { + super::range_search( + c as u32, + &BITSET_CHUNKS_MAP, + BITSET_LAST_CHUNK_MAP, + &BITSET_INDEX_CHUNKS, + &BITSET, + ) + } +} + +#[rustfmt::skip] +pub mod grapheme_extend { + static BITSET_LAST_CHUNK_MAP: (u16, u8) = (896, 30); + static BITSET_CHUNKS_MAP: [u8; 123] = [ + 4, 15, 21, 27, 25, 3, 18, 23, 17, 0, 0, 14, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 7, 10, 0, 8, 12, 29, 28, 24, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 11, 0, 9, 0, 20, 0, 13, + ]; + static BITSET_INDEX_CHUNKS: [[u8; 16]; 31] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 18, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 70, 102, 29], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 62, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 83, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 35, 66, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 35, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 45, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 130, 78, 60, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 37, 0, 90, 0, 0], + [0, 0, 0, 0, 0, 129, 54, 0, 0, 3, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0], + [0, 0, 0, 19, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 67, 0, 114, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 7, 0, 0, 0, 125, 5, 24, 63, 0, 55, 135, 9, 64, 100], + [0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [10, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [12, 0, 48, 0, 92, 0, 0, 0, 25, 119, 113, 0, 96, 71, 53, 68], + [46, 0, 0, 116, 57, 17, 101, 44, 81, 94, 127, 80, 0, 0, 0, 52], + [49, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0], + [56, 26, 0, 136, 95, 43, 107, 105, 93, 79, 93, 132, 128, 42, 104, 20], + [59, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [85, 0, 0, 87, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0], + [89, 0, 0, 0, 0, 0, 0, 38, 110, 27, 22, 0, 0, 0, 0, 0], + [109, 74, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0], + [124, 0, 82, 0, 123, 6, 21, 0, 0, 0, 0, 72, 0, 0, 0, 0], + [126, 40, 118, 39, 108, 41, 0, 34, 91, 14, 97, 13, 86, 112, 98, 4], + [133, 32, 120, 2, 0, 0, 122, 30, 121, 1, 84, 0, 51, 0, 0, 0], + [134, 115, 88, 0, 77, 69, 111, 11, 106, 0, 0, 50, 108, 76, 0, 0], + [137, 138, 0, 0, 138, 138, 138, 62, 0, 0, 0, 0, 0, 0, 0, 0], + ]; + static BITSET: [u64; 139] = [ + 0, 1, 13, 28, 64, 182, 191, 1016, 2032, 2047, 4096, 7680, 14336, 16128, 32640, 32768, + 131008, 262016, 491520, 8323072, 8396801, 10682368, 58719232, 100663296, 134152192, + 159383552, 234881024, 243138688, 536879204, 537919040, 805306369, 1073741824, 1073741916, + 1610612736, 2153546752, 3221225472, 3758096384, 4294967296, 4512022528, 51545911364, + 51545914817, 51548004382, 51552198686, 51556262398, 137438953472, 412316860416, + 412316862532, 1030792151040, 2199023255648, 8641373536127, 8763880767488, 17303886364672, + 36421322670080, 65128884076547, 65970697670631, 67755789254656, 69200441769984, + 70093866270720, 263882790666240, 277076930199552, 281470547525648, 281470681808895, + 281474976710655, 281479271675904, 562675075514368, 562949953355776, 844424930131968, + 985162418487296, 1023920203366400, 2251799813685248, 3377699721314304, 4494803534348292, + 6755399441055744, 7881299349733376, 8444256867844096, 8725724278030336, 8760633780600833, + 8989057312882695, 9042383626829823, 9851624185018758, 18067175067615234, 28848986089586688, + 30958948903026688, 35747322042253312, 53805701016846336, 58529202969772032, + 189151184399892480, 220713756545974272, 466122561432846339, 504262420777140224, + 558446353793941504, 572520102629474304, 1009933895770046464, 1152921504606846982, + 1152921504606851080, 1441151880758558727, 1724878657282899983, 2301902359539744768, + 2305843009196908767, 2305843009213693952, 2310337812748042240, 3731232291276455943, + 4589168020290535424, 4609293481125347328, 4611686018427387908, 4611686069975392286, + 4671217976001691648, 5764607523034234882, 6341068275337658371, 7421334051581067264, + 8788774672813524990, 9205357638345293827, 9222809086901354496, 9223090561878065152, + 9223372036854775808, 9223372036854775935, 9224497932466651184, 9727775195120332910, + 10376293541461622786, 11526998316797657088, 11959590285459062784, 12103423998558208000, + 12699165786766311424, 13005832773892571136, 13798747783286489088, 13835058055282032640, + 13835058055282163729, 13951307220663664640, 14987979559889010690, 17872468738205286400, + 17906312118425092095, 18158513697557839871, 18158513749097456062, 18374686479671623680, + 18374686479671623682, 18446462598732972032, 18446744056529158144, 18446744069414584320, + 18446744073709551615, + ]; + + pub fn lookup(c: char) -> bool { + super::range_search( + c as u32, + &BITSET_CHUNKS_MAP, + BITSET_LAST_CHUNK_MAP, + &BITSET_INDEX_CHUNKS, + &BITSET, + ) + } +} + +#[rustfmt::skip] +pub mod lowercase { + static BITSET_LAST_CHUNK_MAP: (u16, u8) = (122, 6); + static BITSET_CHUNKS_MAP: [u8; 118] = [ + 12, 16, 0, 0, 10, 0, 0, 11, 13, 8, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 1, 0, 17, 0, 9, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + ]; + static BITSET_INDEX_CHUNKS: [[u8; 16]; 18] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 62, 71, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 9, 0, 50, 42, 44, 28], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35], + [0, 0, 3, 0, 71, 71, 71, 0, 46, 46, 48, 46, 24, 37, 38, 23], + [0, 29, 27, 57, 39, 51, 52, 43, 41, 70, 26, 11, 0, 34, 64, 32], + [0, 40, 8, 0, 33, 60, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [22, 13, 54, 66, 25, 15, 56, 63, 30, 19, 12, 55, 58, 61, 65, 4], + [59, 36, 46, 21, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [59, 49, 45, 47, 18, 69, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [67, 5, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ]; + static BITSET: [u64; 72] = [ + 0, 15, 16, 511, 3063, 65535, 16253055, 134217726, 536805376, 984263338, 4294967295, + 133143986179, 274877905920, 1099509514240, 4398046445568, 17592185782272, 36009005809663, + 46912496118442, 187649984473770, 281474972516352, 2251799813685247, 2339875276368554, + 4503599560261632, 61925590106570972, 71777214282006783, 72057592964186127, + 144115188074807295, 297241973452963840, 504403158265495560, 576460743713488896, + 1152921487426978047, 1152921504590069760, 1814856824841797631, 3607524039012697088, + 4362299189061746720, 4539628424389459968, 4601013482110844927, 4611405638684049471, + 4674456033467236607, 6172933889249159850, 9223934986808197120, 10663022717737544362, + 10808545280696953514, 12261519110656315968, 12294970652241842346, 12297829382473033730, + 12297829382473034410, 12297829382473045332, 12297829382829550250, 12297829383904690175, + 12298110845996498944, 15324248332066007893, 16596095761559859497, 16717361816799215616, + 16987577794709946364, 17293822586148356092, 18158513701852807104, 18410715274543104000, + 18428729675466407935, 18446462598732840960, 18446462598732858304, 18446462598737002495, + 18446463698110251007, 18446673704966422527, 18446726481523572736, 18446739675663105535, + 18446739675663106031, 18446742974197923840, 18446744056529682432, 18446744069414584320, + 18446744073709529733, 18446744073709551615, + ]; + + pub fn lookup(c: char) -> bool { + super::range_search( + c as u32, + &BITSET_CHUNKS_MAP, + BITSET_LAST_CHUNK_MAP, + &BITSET_INDEX_CHUNKS, + &BITSET, + ) + } +} + +#[rustfmt::skip] +pub mod n { + static BITSET_LAST_CHUNK_MAP: (u16, u8) = (124, 11); + static BITSET_CHUNKS_MAP: [u8; 124] = [ + 30, 7, 10, 24, 18, 3, 28, 20, 23, 27, 0, 15, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 12, 17, 25, 16, 22, 19, 14, 21, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 1, 0, 0, 9, 0, 13, 26, + ]; + static BITSET_INDEX_CHUNKS: [[u8; 16]; 33] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 48], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 42, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 21, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 46, 0, 0, 0, 2], + [0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 30, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 30, 0, 44, 0, 30, 0, 30, 0, 40, 0, 33], + [0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 36, 43, 4, 0, 0, 0, 0, 51, 22, 3, 0, 12], + [0, 0, 0, 6, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 61, 46, 0, 0, 0, 0, 59, 0, 0, 23, 9, 0, 0], + [0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 2, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0], + [0, 14, 0, 14, 0, 0, 0, 0, 0, 14, 0, 2, 50, 0, 0, 0], + [0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 25, 0, 0, 0, 14, 24, 0, 0, 0, 0, 0, 0, 0, 0, 10], + [0, 31, 0, 46, 64, 0, 0, 38, 0, 0, 0, 46, 0, 0, 0, 0], + [0, 45, 2, 0, 0, 70, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 58, 0, 30, 0, 41, 0, 30, 0, 14, 0, 14, 35, 0, 0, 0], + [0, 62, 29, 60, 17, 0, 54, 69, 0, 56, 19, 27, 0, 63, 28, 0], + [0, 65, 37, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 68, 18, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 8, 0], + [14, 0, 0, 0, 0, 7, 0, 16, 0, 0, 15, 0, 0, 14, 46, 0], + [39, 0, 0, 14, 2, 0, 0, 47, 0, 14, 0, 0, 0, 0, 0, 46], + [46, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [49, 0, 0, 0, 0, 0, 11, 0, 24, 20, 66, 0, 0, 0, 0, 0], + [72, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ]; + static BITSET: [u64; 73] = [ + 0, 999, 1023, 1026, 3072, 8191, 65408, 65472, 1048575, 1966080, 2097151, 3932160, 4063232, + 8388607, 67043328, 67044351, 134152192, 264241152, 268435455, 3758096384, 4294901504, + 17112694784, 64424509440, 549218942976, 4393751543808, 35184372023296, 140737488355327, + 272678883688448, 279275953455104, 280925220896768, 281200098803712, 281474976448512, + 492581209243648, 2251524935778304, 2251795518717952, 4503595332403200, 4503599627370368, + 8708132091985919, 9007190731849728, 17732923532771328, 71212894229889024, + 144114915328655360, 144115183780888576, 144115188075855871, 284007976623144960, + 284008251501051904, 287948901175001088, 287948901242044416, 287953294926544896, + 504407547722072192, 1152640029630136320, 1152921496016912384, 2305840810190438400, + 2305843009213693952, 3458764513820540928, 4611615649683210238, 6917529027641082367, + 8217943420044312576, 9151595642915651584, 9223372032559808512, 17870283321406128128, + 18158513697557839872, 18302628889911885824, 18374686483949813760, 18428729675200069632, + 18446181123756130304, 18446181123756131327, 18446739675663040512, 18446744069414584320, + 18446744073709355007, 18446744073709486080, 18446744073709535232, 18446744073709551615, + ]; + + pub fn lookup(c: char) -> bool { + super::range_search( + c as u32, + &BITSET_CHUNKS_MAP, + BITSET_LAST_CHUNK_MAP, + &BITSET_INDEX_CHUNKS, + &BITSET, + ) + } +} + +#[rustfmt::skip] +pub mod uppercase { + static BITSET_LAST_CHUNK_MAP: (u16, u8) = (124, 6); + static BITSET_CHUNKS_MAP: [u8; 123] = [ + 12, 15, 0, 0, 11, 0, 0, 8, 5, 9, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 13, 0, 7, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, + 0, 0, 4, + ]; + static BITSET_INDEX_CHUNKS: [[u8; 16]; 17] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 10, 0, 38, 46, 44, 2], + [0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 51, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 60, 62, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 54, 0, 0, 0, 0, 0, 43, 43, 40, 43, 56, 23, 34, 35], + [0, 0, 57, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 66, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 30], + [0, 11, 0, 12, 50, 37, 36, 45, 47, 6, 0, 0, 0, 49, 18, 53], + [15, 0, 60, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [22, 52, 43, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [25, 39, 42, 41, 59, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [58, 65, 29, 17, 48, 63, 31, 20, 55, 61, 64, 32, 28, 21, 16, 4], + ]; + static BITSET: [u64; 67] = [ + 0, 8, 116, 1023, 1024, 8383, 21882, 65535, 1048575, 8388607, 89478485, 134217726, + 2139095039, 4294967295, 17179869183, 1099511627775, 2199023190016, 4398046445568, + 17575006099264, 23456248059221, 70368743129088, 140737484161024, 140737488355327, + 280378317225728, 281470681743392, 281474976710655, 1169903278445909, 2251799813685247, + 9007198986305536, 17977448100528131, 18014398509481983, 288230371856744511, + 576460735123554305, 576460743713488896, 1080863910568919040, 1080897995681042176, + 1274187559846268630, 3122495741643543722, 6148633210533183488, 6148914689804861440, + 6148914690880001365, 6148914691236506283, 6148914691236516865, 6148914691236517205, + 6151773421467674709, 6184099063146390672, 7638198793012598101, 7783721355972007253, + 8863084067199903664, 9242793810247811072, 12273810184460391765, 13839347594782259332, + 13845730589451223040, 16613872850358272000, 16717361816799215616, 17293822586282573568, + 18374966856193736448, 18428729675200069632, 18442240474149289983, 18446274948748367189, + 18446462598732840960, 18446462598737035263, 18446466996779287551, 18446726481523637343, + 18446742974197924863, 18446742974197940223, 18446744069414584320, + ]; + + pub fn lookup(c: char) -> bool { + super::range_search( + c as u32, + &BITSET_CHUNKS_MAP, + BITSET_LAST_CHUNK_MAP, + &BITSET_INDEX_CHUNKS, + &BITSET, + ) + } +} + +#[rustfmt::skip] +pub mod white_space { + static BITSET_LAST_CHUNK_MAP: (u16, u8) = (12, 2); + static BITSET_CHUNKS_MAP: [u8; 9] = [ + 3, 0, 0, 0, 0, 1, 0, 0, 4, + ]; + static BITSET_INDEX_CHUNKS: [[u8; 16]; 5] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ]; + static BITSET: [u64; 6] = [ + 0, 1, 2147483648, 4294967328, 4294983168, 144036023240703, + ]; + + pub fn lookup(c: char) -> bool { + super::range_search( + c as u32, + &BITSET_CHUNKS_MAP, + BITSET_LAST_CHUNK_MAP, + &BITSET_INDEX_CHUNKS, + &BITSET, + ) + } +} + +#[rustfmt::skip] +pub mod conversions { + pub fn to_lower(c: char) -> [char; 3] { + match bsearch_case_table(c, LOWERCASE_TABLE) { + None => [c, '\0', '\0'], + Some(index) => LOWERCASE_TABLE[index].1, + } + } + + pub fn to_upper(c: char) -> [char; 3] { + match bsearch_case_table(c, UPPERCASE_TABLE) { + None => [c, '\0', '\0'], + Some(index) => UPPERCASE_TABLE[index].1, + } + } + + fn bsearch_case_table(c: char, table: &[(char, [char; 3])]) -> Option { + table.binary_search_by(|&(key, _)| key.cmp(&c)).ok() + } + static LOWERCASE_TABLE: &[(char, [char; 3])] = &[ + ('A', ['a', '\u{0}', '\u{0}']), ('B', ['b', '\u{0}', '\u{0}']), + ('C', ['c', '\u{0}', '\u{0}']), ('D', ['d', '\u{0}', '\u{0}']), + ('E', ['e', '\u{0}', '\u{0}']), ('F', ['f', '\u{0}', '\u{0}']), + ('G', ['g', '\u{0}', '\u{0}']), ('H', ['h', '\u{0}', '\u{0}']), + ('I', ['i', '\u{0}', '\u{0}']), ('J', ['j', '\u{0}', '\u{0}']), + ('K', ['k', '\u{0}', '\u{0}']), ('L', ['l', '\u{0}', '\u{0}']), + ('M', ['m', '\u{0}', '\u{0}']), ('N', ['n', '\u{0}', '\u{0}']), + ('O', ['o', '\u{0}', '\u{0}']), ('P', ['p', '\u{0}', '\u{0}']), + ('Q', ['q', '\u{0}', '\u{0}']), ('R', ['r', '\u{0}', '\u{0}']), + ('S', ['s', '\u{0}', '\u{0}']), ('T', ['t', '\u{0}', '\u{0}']), + ('U', ['u', '\u{0}', '\u{0}']), ('V', ['v', '\u{0}', '\u{0}']), + ('W', ['w', '\u{0}', '\u{0}']), ('X', ['x', '\u{0}', '\u{0}']), + ('Y', ['y', '\u{0}', '\u{0}']), ('Z', ['z', '\u{0}', '\u{0}']), + ('\u{c0}', ['\u{e0}', '\u{0}', '\u{0}']), ('\u{c1}', ['\u{e1}', '\u{0}', '\u{0}']), + ('\u{c2}', ['\u{e2}', '\u{0}', '\u{0}']), ('\u{c3}', ['\u{e3}', '\u{0}', '\u{0}']), + ('\u{c4}', ['\u{e4}', '\u{0}', '\u{0}']), ('\u{c5}', ['\u{e5}', '\u{0}', '\u{0}']), + ('\u{c6}', ['\u{e6}', '\u{0}', '\u{0}']), ('\u{c7}', ['\u{e7}', '\u{0}', '\u{0}']), + ('\u{c8}', ['\u{e8}', '\u{0}', '\u{0}']), ('\u{c9}', ['\u{e9}', '\u{0}', '\u{0}']), + ('\u{ca}', ['\u{ea}', '\u{0}', '\u{0}']), ('\u{cb}', ['\u{eb}', '\u{0}', '\u{0}']), + ('\u{cc}', ['\u{ec}', '\u{0}', '\u{0}']), ('\u{cd}', ['\u{ed}', '\u{0}', '\u{0}']), + ('\u{ce}', ['\u{ee}', '\u{0}', '\u{0}']), ('\u{cf}', ['\u{ef}', '\u{0}', '\u{0}']), + ('\u{d0}', ['\u{f0}', '\u{0}', '\u{0}']), ('\u{d1}', ['\u{f1}', '\u{0}', '\u{0}']), + ('\u{d2}', ['\u{f2}', '\u{0}', '\u{0}']), ('\u{d3}', ['\u{f3}', '\u{0}', '\u{0}']), + ('\u{d4}', ['\u{f4}', '\u{0}', '\u{0}']), ('\u{d5}', ['\u{f5}', '\u{0}', '\u{0}']), + ('\u{d6}', ['\u{f6}', '\u{0}', '\u{0}']), ('\u{d8}', ['\u{f8}', '\u{0}', '\u{0}']), + ('\u{d9}', ['\u{f9}', '\u{0}', '\u{0}']), ('\u{da}', ['\u{fa}', '\u{0}', '\u{0}']), + ('\u{db}', ['\u{fb}', '\u{0}', '\u{0}']), ('\u{dc}', ['\u{fc}', '\u{0}', '\u{0}']), + ('\u{dd}', ['\u{fd}', '\u{0}', '\u{0}']), ('\u{de}', ['\u{fe}', '\u{0}', '\u{0}']), + ('\u{100}', ['\u{101}', '\u{0}', '\u{0}']), ('\u{102}', ['\u{103}', '\u{0}', '\u{0}']), + ('\u{104}', ['\u{105}', '\u{0}', '\u{0}']), ('\u{106}', ['\u{107}', '\u{0}', '\u{0}']), + ('\u{108}', ['\u{109}', '\u{0}', '\u{0}']), ('\u{10a}', ['\u{10b}', '\u{0}', '\u{0}']), + ('\u{10c}', ['\u{10d}', '\u{0}', '\u{0}']), ('\u{10e}', ['\u{10f}', '\u{0}', '\u{0}']), + ('\u{110}', ['\u{111}', '\u{0}', '\u{0}']), ('\u{112}', ['\u{113}', '\u{0}', '\u{0}']), + ('\u{114}', ['\u{115}', '\u{0}', '\u{0}']), ('\u{116}', ['\u{117}', '\u{0}', '\u{0}']), + ('\u{118}', ['\u{119}', '\u{0}', '\u{0}']), ('\u{11a}', ['\u{11b}', '\u{0}', '\u{0}']), + ('\u{11c}', ['\u{11d}', '\u{0}', '\u{0}']), ('\u{11e}', ['\u{11f}', '\u{0}', '\u{0}']), + ('\u{120}', ['\u{121}', '\u{0}', '\u{0}']), ('\u{122}', ['\u{123}', '\u{0}', '\u{0}']), + ('\u{124}', ['\u{125}', '\u{0}', '\u{0}']), ('\u{126}', ['\u{127}', '\u{0}', '\u{0}']), + ('\u{128}', ['\u{129}', '\u{0}', '\u{0}']), ('\u{12a}', ['\u{12b}', '\u{0}', '\u{0}']), + ('\u{12c}', ['\u{12d}', '\u{0}', '\u{0}']), ('\u{12e}', ['\u{12f}', '\u{0}', '\u{0}']), + ('\u{130}', ['i', '\u{307}', '\u{0}']), ('\u{132}', ['\u{133}', '\u{0}', '\u{0}']), + ('\u{134}', ['\u{135}', '\u{0}', '\u{0}']), ('\u{136}', ['\u{137}', '\u{0}', '\u{0}']), + ('\u{139}', ['\u{13a}', '\u{0}', '\u{0}']), ('\u{13b}', ['\u{13c}', '\u{0}', '\u{0}']), + ('\u{13d}', ['\u{13e}', '\u{0}', '\u{0}']), ('\u{13f}', ['\u{140}', '\u{0}', '\u{0}']), + ('\u{141}', ['\u{142}', '\u{0}', '\u{0}']), ('\u{143}', ['\u{144}', '\u{0}', '\u{0}']), + ('\u{145}', ['\u{146}', '\u{0}', '\u{0}']), ('\u{147}', ['\u{148}', '\u{0}', '\u{0}']), + ('\u{14a}', ['\u{14b}', '\u{0}', '\u{0}']), ('\u{14c}', ['\u{14d}', '\u{0}', '\u{0}']), + ('\u{14e}', ['\u{14f}', '\u{0}', '\u{0}']), ('\u{150}', ['\u{151}', '\u{0}', '\u{0}']), + ('\u{152}', ['\u{153}', '\u{0}', '\u{0}']), ('\u{154}', ['\u{155}', '\u{0}', '\u{0}']), + ('\u{156}', ['\u{157}', '\u{0}', '\u{0}']), ('\u{158}', ['\u{159}', '\u{0}', '\u{0}']), + ('\u{15a}', ['\u{15b}', '\u{0}', '\u{0}']), ('\u{15c}', ['\u{15d}', '\u{0}', '\u{0}']), + ('\u{15e}', ['\u{15f}', '\u{0}', '\u{0}']), ('\u{160}', ['\u{161}', '\u{0}', '\u{0}']), + ('\u{162}', ['\u{163}', '\u{0}', '\u{0}']), ('\u{164}', ['\u{165}', '\u{0}', '\u{0}']), + ('\u{166}', ['\u{167}', '\u{0}', '\u{0}']), ('\u{168}', ['\u{169}', '\u{0}', '\u{0}']), + ('\u{16a}', ['\u{16b}', '\u{0}', '\u{0}']), ('\u{16c}', ['\u{16d}', '\u{0}', '\u{0}']), + ('\u{16e}', ['\u{16f}', '\u{0}', '\u{0}']), ('\u{170}', ['\u{171}', '\u{0}', '\u{0}']), + ('\u{172}', ['\u{173}', '\u{0}', '\u{0}']), ('\u{174}', ['\u{175}', '\u{0}', '\u{0}']), + ('\u{176}', ['\u{177}', '\u{0}', '\u{0}']), ('\u{178}', ['\u{ff}', '\u{0}', '\u{0}']), + ('\u{179}', ['\u{17a}', '\u{0}', '\u{0}']), ('\u{17b}', ['\u{17c}', '\u{0}', '\u{0}']), + ('\u{17d}', ['\u{17e}', '\u{0}', '\u{0}']), ('\u{181}', ['\u{253}', '\u{0}', '\u{0}']), + ('\u{182}', ['\u{183}', '\u{0}', '\u{0}']), ('\u{184}', ['\u{185}', '\u{0}', '\u{0}']), + ('\u{186}', ['\u{254}', '\u{0}', '\u{0}']), ('\u{187}', ['\u{188}', '\u{0}', '\u{0}']), + ('\u{189}', ['\u{256}', '\u{0}', '\u{0}']), ('\u{18a}', ['\u{257}', '\u{0}', '\u{0}']), + ('\u{18b}', ['\u{18c}', '\u{0}', '\u{0}']), ('\u{18e}', ['\u{1dd}', '\u{0}', '\u{0}']), + ('\u{18f}', ['\u{259}', '\u{0}', '\u{0}']), ('\u{190}', ['\u{25b}', '\u{0}', '\u{0}']), + ('\u{191}', ['\u{192}', '\u{0}', '\u{0}']), ('\u{193}', ['\u{260}', '\u{0}', '\u{0}']), + ('\u{194}', ['\u{263}', '\u{0}', '\u{0}']), ('\u{196}', ['\u{269}', '\u{0}', '\u{0}']), + ('\u{197}', ['\u{268}', '\u{0}', '\u{0}']), ('\u{198}', ['\u{199}', '\u{0}', '\u{0}']), + ('\u{19c}', ['\u{26f}', '\u{0}', '\u{0}']), ('\u{19d}', ['\u{272}', '\u{0}', '\u{0}']), + ('\u{19f}', ['\u{275}', '\u{0}', '\u{0}']), ('\u{1a0}', ['\u{1a1}', '\u{0}', '\u{0}']), + ('\u{1a2}', ['\u{1a3}', '\u{0}', '\u{0}']), ('\u{1a4}', ['\u{1a5}', '\u{0}', '\u{0}']), + ('\u{1a6}', ['\u{280}', '\u{0}', '\u{0}']), ('\u{1a7}', ['\u{1a8}', '\u{0}', '\u{0}']), + ('\u{1a9}', ['\u{283}', '\u{0}', '\u{0}']), ('\u{1ac}', ['\u{1ad}', '\u{0}', '\u{0}']), + ('\u{1ae}', ['\u{288}', '\u{0}', '\u{0}']), ('\u{1af}', ['\u{1b0}', '\u{0}', '\u{0}']), + ('\u{1b1}', ['\u{28a}', '\u{0}', '\u{0}']), ('\u{1b2}', ['\u{28b}', '\u{0}', '\u{0}']), + ('\u{1b3}', ['\u{1b4}', '\u{0}', '\u{0}']), ('\u{1b5}', ['\u{1b6}', '\u{0}', '\u{0}']), + ('\u{1b7}', ['\u{292}', '\u{0}', '\u{0}']), ('\u{1b8}', ['\u{1b9}', '\u{0}', '\u{0}']), + ('\u{1bc}', ['\u{1bd}', '\u{0}', '\u{0}']), ('\u{1c4}', ['\u{1c6}', '\u{0}', '\u{0}']), + ('\u{1c5}', ['\u{1c6}', '\u{0}', '\u{0}']), ('\u{1c7}', ['\u{1c9}', '\u{0}', '\u{0}']), + ('\u{1c8}', ['\u{1c9}', '\u{0}', '\u{0}']), ('\u{1ca}', ['\u{1cc}', '\u{0}', '\u{0}']), + ('\u{1cb}', ['\u{1cc}', '\u{0}', '\u{0}']), ('\u{1cd}', ['\u{1ce}', '\u{0}', '\u{0}']), + ('\u{1cf}', ['\u{1d0}', '\u{0}', '\u{0}']), ('\u{1d1}', ['\u{1d2}', '\u{0}', '\u{0}']), + ('\u{1d3}', ['\u{1d4}', '\u{0}', '\u{0}']), ('\u{1d5}', ['\u{1d6}', '\u{0}', '\u{0}']), + ('\u{1d7}', ['\u{1d8}', '\u{0}', '\u{0}']), ('\u{1d9}', ['\u{1da}', '\u{0}', '\u{0}']), + ('\u{1db}', ['\u{1dc}', '\u{0}', '\u{0}']), ('\u{1de}', ['\u{1df}', '\u{0}', '\u{0}']), + ('\u{1e0}', ['\u{1e1}', '\u{0}', '\u{0}']), ('\u{1e2}', ['\u{1e3}', '\u{0}', '\u{0}']), + ('\u{1e4}', ['\u{1e5}', '\u{0}', '\u{0}']), ('\u{1e6}', ['\u{1e7}', '\u{0}', '\u{0}']), + ('\u{1e8}', ['\u{1e9}', '\u{0}', '\u{0}']), ('\u{1ea}', ['\u{1eb}', '\u{0}', '\u{0}']), + ('\u{1ec}', ['\u{1ed}', '\u{0}', '\u{0}']), ('\u{1ee}', ['\u{1ef}', '\u{0}', '\u{0}']), + ('\u{1f1}', ['\u{1f3}', '\u{0}', '\u{0}']), ('\u{1f2}', ['\u{1f3}', '\u{0}', '\u{0}']), + ('\u{1f4}', ['\u{1f5}', '\u{0}', '\u{0}']), ('\u{1f6}', ['\u{195}', '\u{0}', '\u{0}']), + ('\u{1f7}', ['\u{1bf}', '\u{0}', '\u{0}']), ('\u{1f8}', ['\u{1f9}', '\u{0}', '\u{0}']), + ('\u{1fa}', ['\u{1fb}', '\u{0}', '\u{0}']), ('\u{1fc}', ['\u{1fd}', '\u{0}', '\u{0}']), + ('\u{1fe}', ['\u{1ff}', '\u{0}', '\u{0}']), ('\u{200}', ['\u{201}', '\u{0}', '\u{0}']), + ('\u{202}', ['\u{203}', '\u{0}', '\u{0}']), ('\u{204}', ['\u{205}', '\u{0}', '\u{0}']), + ('\u{206}', ['\u{207}', '\u{0}', '\u{0}']), ('\u{208}', ['\u{209}', '\u{0}', '\u{0}']), + ('\u{20a}', ['\u{20b}', '\u{0}', '\u{0}']), ('\u{20c}', ['\u{20d}', '\u{0}', '\u{0}']), + ('\u{20e}', ['\u{20f}', '\u{0}', '\u{0}']), ('\u{210}', ['\u{211}', '\u{0}', '\u{0}']), + ('\u{212}', ['\u{213}', '\u{0}', '\u{0}']), ('\u{214}', ['\u{215}', '\u{0}', '\u{0}']), + ('\u{216}', ['\u{217}', '\u{0}', '\u{0}']), ('\u{218}', ['\u{219}', '\u{0}', '\u{0}']), + ('\u{21a}', ['\u{21b}', '\u{0}', '\u{0}']), ('\u{21c}', ['\u{21d}', '\u{0}', '\u{0}']), + ('\u{21e}', ['\u{21f}', '\u{0}', '\u{0}']), ('\u{220}', ['\u{19e}', '\u{0}', '\u{0}']), + ('\u{222}', ['\u{223}', '\u{0}', '\u{0}']), ('\u{224}', ['\u{225}', '\u{0}', '\u{0}']), + ('\u{226}', ['\u{227}', '\u{0}', '\u{0}']), ('\u{228}', ['\u{229}', '\u{0}', '\u{0}']), + ('\u{22a}', ['\u{22b}', '\u{0}', '\u{0}']), ('\u{22c}', ['\u{22d}', '\u{0}', '\u{0}']), + ('\u{22e}', ['\u{22f}', '\u{0}', '\u{0}']), ('\u{230}', ['\u{231}', '\u{0}', '\u{0}']), + ('\u{232}', ['\u{233}', '\u{0}', '\u{0}']), ('\u{23a}', ['\u{2c65}', '\u{0}', '\u{0}']), + ('\u{23b}', ['\u{23c}', '\u{0}', '\u{0}']), ('\u{23d}', ['\u{19a}', '\u{0}', '\u{0}']), + ('\u{23e}', ['\u{2c66}', '\u{0}', '\u{0}']), ('\u{241}', ['\u{242}', '\u{0}', '\u{0}']), + ('\u{243}', ['\u{180}', '\u{0}', '\u{0}']), ('\u{244}', ['\u{289}', '\u{0}', '\u{0}']), + ('\u{245}', ['\u{28c}', '\u{0}', '\u{0}']), ('\u{246}', ['\u{247}', '\u{0}', '\u{0}']), + ('\u{248}', ['\u{249}', '\u{0}', '\u{0}']), ('\u{24a}', ['\u{24b}', '\u{0}', '\u{0}']), + ('\u{24c}', ['\u{24d}', '\u{0}', '\u{0}']), ('\u{24e}', ['\u{24f}', '\u{0}', '\u{0}']), + ('\u{370}', ['\u{371}', '\u{0}', '\u{0}']), ('\u{372}', ['\u{373}', '\u{0}', '\u{0}']), + ('\u{376}', ['\u{377}', '\u{0}', '\u{0}']), ('\u{37f}', ['\u{3f3}', '\u{0}', '\u{0}']), + ('\u{386}', ['\u{3ac}', '\u{0}', '\u{0}']), ('\u{388}', ['\u{3ad}', '\u{0}', '\u{0}']), + ('\u{389}', ['\u{3ae}', '\u{0}', '\u{0}']), ('\u{38a}', ['\u{3af}', '\u{0}', '\u{0}']), + ('\u{38c}', ['\u{3cc}', '\u{0}', '\u{0}']), ('\u{38e}', ['\u{3cd}', '\u{0}', '\u{0}']), + ('\u{38f}', ['\u{3ce}', '\u{0}', '\u{0}']), ('\u{391}', ['\u{3b1}', '\u{0}', '\u{0}']), + ('\u{392}', ['\u{3b2}', '\u{0}', '\u{0}']), ('\u{393}', ['\u{3b3}', '\u{0}', '\u{0}']), + ('\u{394}', ['\u{3b4}', '\u{0}', '\u{0}']), ('\u{395}', ['\u{3b5}', '\u{0}', '\u{0}']), + ('\u{396}', ['\u{3b6}', '\u{0}', '\u{0}']), ('\u{397}', ['\u{3b7}', '\u{0}', '\u{0}']), + ('\u{398}', ['\u{3b8}', '\u{0}', '\u{0}']), ('\u{399}', ['\u{3b9}', '\u{0}', '\u{0}']), + ('\u{39a}', ['\u{3ba}', '\u{0}', '\u{0}']), ('\u{39b}', ['\u{3bb}', '\u{0}', '\u{0}']), + ('\u{39c}', ['\u{3bc}', '\u{0}', '\u{0}']), ('\u{39d}', ['\u{3bd}', '\u{0}', '\u{0}']), + ('\u{39e}', ['\u{3be}', '\u{0}', '\u{0}']), ('\u{39f}', ['\u{3bf}', '\u{0}', '\u{0}']), + ('\u{3a0}', ['\u{3c0}', '\u{0}', '\u{0}']), ('\u{3a1}', ['\u{3c1}', '\u{0}', '\u{0}']), + ('\u{3a3}', ['\u{3c3}', '\u{0}', '\u{0}']), ('\u{3a4}', ['\u{3c4}', '\u{0}', '\u{0}']), + ('\u{3a5}', ['\u{3c5}', '\u{0}', '\u{0}']), ('\u{3a6}', ['\u{3c6}', '\u{0}', '\u{0}']), + ('\u{3a7}', ['\u{3c7}', '\u{0}', '\u{0}']), ('\u{3a8}', ['\u{3c8}', '\u{0}', '\u{0}']), + ('\u{3a9}', ['\u{3c9}', '\u{0}', '\u{0}']), ('\u{3aa}', ['\u{3ca}', '\u{0}', '\u{0}']), + ('\u{3ab}', ['\u{3cb}', '\u{0}', '\u{0}']), ('\u{3cf}', ['\u{3d7}', '\u{0}', '\u{0}']), + ('\u{3d8}', ['\u{3d9}', '\u{0}', '\u{0}']), ('\u{3da}', ['\u{3db}', '\u{0}', '\u{0}']), + ('\u{3dc}', ['\u{3dd}', '\u{0}', '\u{0}']), ('\u{3de}', ['\u{3df}', '\u{0}', '\u{0}']), + ('\u{3e0}', ['\u{3e1}', '\u{0}', '\u{0}']), ('\u{3e2}', ['\u{3e3}', '\u{0}', '\u{0}']), + ('\u{3e4}', ['\u{3e5}', '\u{0}', '\u{0}']), ('\u{3e6}', ['\u{3e7}', '\u{0}', '\u{0}']), + ('\u{3e8}', ['\u{3e9}', '\u{0}', '\u{0}']), ('\u{3ea}', ['\u{3eb}', '\u{0}', '\u{0}']), + ('\u{3ec}', ['\u{3ed}', '\u{0}', '\u{0}']), ('\u{3ee}', ['\u{3ef}', '\u{0}', '\u{0}']), + ('\u{3f4}', ['\u{3b8}', '\u{0}', '\u{0}']), ('\u{3f7}', ['\u{3f8}', '\u{0}', '\u{0}']), + ('\u{3f9}', ['\u{3f2}', '\u{0}', '\u{0}']), ('\u{3fa}', ['\u{3fb}', '\u{0}', '\u{0}']), + ('\u{3fd}', ['\u{37b}', '\u{0}', '\u{0}']), ('\u{3fe}', ['\u{37c}', '\u{0}', '\u{0}']), + ('\u{3ff}', ['\u{37d}', '\u{0}', '\u{0}']), ('\u{400}', ['\u{450}', '\u{0}', '\u{0}']), + ('\u{401}', ['\u{451}', '\u{0}', '\u{0}']), ('\u{402}', ['\u{452}', '\u{0}', '\u{0}']), + ('\u{403}', ['\u{453}', '\u{0}', '\u{0}']), ('\u{404}', ['\u{454}', '\u{0}', '\u{0}']), + ('\u{405}', ['\u{455}', '\u{0}', '\u{0}']), ('\u{406}', ['\u{456}', '\u{0}', '\u{0}']), + ('\u{407}', ['\u{457}', '\u{0}', '\u{0}']), ('\u{408}', ['\u{458}', '\u{0}', '\u{0}']), + ('\u{409}', ['\u{459}', '\u{0}', '\u{0}']), ('\u{40a}', ['\u{45a}', '\u{0}', '\u{0}']), + ('\u{40b}', ['\u{45b}', '\u{0}', '\u{0}']), ('\u{40c}', ['\u{45c}', '\u{0}', '\u{0}']), + ('\u{40d}', ['\u{45d}', '\u{0}', '\u{0}']), ('\u{40e}', ['\u{45e}', '\u{0}', '\u{0}']), + ('\u{40f}', ['\u{45f}', '\u{0}', '\u{0}']), ('\u{410}', ['\u{430}', '\u{0}', '\u{0}']), + ('\u{411}', ['\u{431}', '\u{0}', '\u{0}']), ('\u{412}', ['\u{432}', '\u{0}', '\u{0}']), + ('\u{413}', ['\u{433}', '\u{0}', '\u{0}']), ('\u{414}', ['\u{434}', '\u{0}', '\u{0}']), + ('\u{415}', ['\u{435}', '\u{0}', '\u{0}']), ('\u{416}', ['\u{436}', '\u{0}', '\u{0}']), + ('\u{417}', ['\u{437}', '\u{0}', '\u{0}']), ('\u{418}', ['\u{438}', '\u{0}', '\u{0}']), + ('\u{419}', ['\u{439}', '\u{0}', '\u{0}']), ('\u{41a}', ['\u{43a}', '\u{0}', '\u{0}']), + ('\u{41b}', ['\u{43b}', '\u{0}', '\u{0}']), ('\u{41c}', ['\u{43c}', '\u{0}', '\u{0}']), + ('\u{41d}', ['\u{43d}', '\u{0}', '\u{0}']), ('\u{41e}', ['\u{43e}', '\u{0}', '\u{0}']), + ('\u{41f}', ['\u{43f}', '\u{0}', '\u{0}']), ('\u{420}', ['\u{440}', '\u{0}', '\u{0}']), + ('\u{421}', ['\u{441}', '\u{0}', '\u{0}']), ('\u{422}', ['\u{442}', '\u{0}', '\u{0}']), + ('\u{423}', ['\u{443}', '\u{0}', '\u{0}']), ('\u{424}', ['\u{444}', '\u{0}', '\u{0}']), + ('\u{425}', ['\u{445}', '\u{0}', '\u{0}']), ('\u{426}', ['\u{446}', '\u{0}', '\u{0}']), + ('\u{427}', ['\u{447}', '\u{0}', '\u{0}']), ('\u{428}', ['\u{448}', '\u{0}', '\u{0}']), + ('\u{429}', ['\u{449}', '\u{0}', '\u{0}']), ('\u{42a}', ['\u{44a}', '\u{0}', '\u{0}']), + ('\u{42b}', ['\u{44b}', '\u{0}', '\u{0}']), ('\u{42c}', ['\u{44c}', '\u{0}', '\u{0}']), + ('\u{42d}', ['\u{44d}', '\u{0}', '\u{0}']), ('\u{42e}', ['\u{44e}', '\u{0}', '\u{0}']), + ('\u{42f}', ['\u{44f}', '\u{0}', '\u{0}']), ('\u{460}', ['\u{461}', '\u{0}', '\u{0}']), + ('\u{462}', ['\u{463}', '\u{0}', '\u{0}']), ('\u{464}', ['\u{465}', '\u{0}', '\u{0}']), + ('\u{466}', ['\u{467}', '\u{0}', '\u{0}']), ('\u{468}', ['\u{469}', '\u{0}', '\u{0}']), + ('\u{46a}', ['\u{46b}', '\u{0}', '\u{0}']), ('\u{46c}', ['\u{46d}', '\u{0}', '\u{0}']), + ('\u{46e}', ['\u{46f}', '\u{0}', '\u{0}']), ('\u{470}', ['\u{471}', '\u{0}', '\u{0}']), + ('\u{472}', ['\u{473}', '\u{0}', '\u{0}']), ('\u{474}', ['\u{475}', '\u{0}', '\u{0}']), + ('\u{476}', ['\u{477}', '\u{0}', '\u{0}']), ('\u{478}', ['\u{479}', '\u{0}', '\u{0}']), + ('\u{47a}', ['\u{47b}', '\u{0}', '\u{0}']), ('\u{47c}', ['\u{47d}', '\u{0}', '\u{0}']), + ('\u{47e}', ['\u{47f}', '\u{0}', '\u{0}']), ('\u{480}', ['\u{481}', '\u{0}', '\u{0}']), + ('\u{48a}', ['\u{48b}', '\u{0}', '\u{0}']), ('\u{48c}', ['\u{48d}', '\u{0}', '\u{0}']), + ('\u{48e}', ['\u{48f}', '\u{0}', '\u{0}']), ('\u{490}', ['\u{491}', '\u{0}', '\u{0}']), + ('\u{492}', ['\u{493}', '\u{0}', '\u{0}']), ('\u{494}', ['\u{495}', '\u{0}', '\u{0}']), + ('\u{496}', ['\u{497}', '\u{0}', '\u{0}']), ('\u{498}', ['\u{499}', '\u{0}', '\u{0}']), + ('\u{49a}', ['\u{49b}', '\u{0}', '\u{0}']), ('\u{49c}', ['\u{49d}', '\u{0}', '\u{0}']), + ('\u{49e}', ['\u{49f}', '\u{0}', '\u{0}']), ('\u{4a0}', ['\u{4a1}', '\u{0}', '\u{0}']), + ('\u{4a2}', ['\u{4a3}', '\u{0}', '\u{0}']), ('\u{4a4}', ['\u{4a5}', '\u{0}', '\u{0}']), + ('\u{4a6}', ['\u{4a7}', '\u{0}', '\u{0}']), ('\u{4a8}', ['\u{4a9}', '\u{0}', '\u{0}']), + ('\u{4aa}', ['\u{4ab}', '\u{0}', '\u{0}']), ('\u{4ac}', ['\u{4ad}', '\u{0}', '\u{0}']), + ('\u{4ae}', ['\u{4af}', '\u{0}', '\u{0}']), ('\u{4b0}', ['\u{4b1}', '\u{0}', '\u{0}']), + ('\u{4b2}', ['\u{4b3}', '\u{0}', '\u{0}']), ('\u{4b4}', ['\u{4b5}', '\u{0}', '\u{0}']), + ('\u{4b6}', ['\u{4b7}', '\u{0}', '\u{0}']), ('\u{4b8}', ['\u{4b9}', '\u{0}', '\u{0}']), + ('\u{4ba}', ['\u{4bb}', '\u{0}', '\u{0}']), ('\u{4bc}', ['\u{4bd}', '\u{0}', '\u{0}']), + ('\u{4be}', ['\u{4bf}', '\u{0}', '\u{0}']), ('\u{4c0}', ['\u{4cf}', '\u{0}', '\u{0}']), + ('\u{4c1}', ['\u{4c2}', '\u{0}', '\u{0}']), ('\u{4c3}', ['\u{4c4}', '\u{0}', '\u{0}']), + ('\u{4c5}', ['\u{4c6}', '\u{0}', '\u{0}']), ('\u{4c7}', ['\u{4c8}', '\u{0}', '\u{0}']), + ('\u{4c9}', ['\u{4ca}', '\u{0}', '\u{0}']), ('\u{4cb}', ['\u{4cc}', '\u{0}', '\u{0}']), + ('\u{4cd}', ['\u{4ce}', '\u{0}', '\u{0}']), ('\u{4d0}', ['\u{4d1}', '\u{0}', '\u{0}']), + ('\u{4d2}', ['\u{4d3}', '\u{0}', '\u{0}']), ('\u{4d4}', ['\u{4d5}', '\u{0}', '\u{0}']), + ('\u{4d6}', ['\u{4d7}', '\u{0}', '\u{0}']), ('\u{4d8}', ['\u{4d9}', '\u{0}', '\u{0}']), + ('\u{4da}', ['\u{4db}', '\u{0}', '\u{0}']), ('\u{4dc}', ['\u{4dd}', '\u{0}', '\u{0}']), + ('\u{4de}', ['\u{4df}', '\u{0}', '\u{0}']), ('\u{4e0}', ['\u{4e1}', '\u{0}', '\u{0}']), + ('\u{4e2}', ['\u{4e3}', '\u{0}', '\u{0}']), ('\u{4e4}', ['\u{4e5}', '\u{0}', '\u{0}']), + ('\u{4e6}', ['\u{4e7}', '\u{0}', '\u{0}']), ('\u{4e8}', ['\u{4e9}', '\u{0}', '\u{0}']), + ('\u{4ea}', ['\u{4eb}', '\u{0}', '\u{0}']), ('\u{4ec}', ['\u{4ed}', '\u{0}', '\u{0}']), + ('\u{4ee}', ['\u{4ef}', '\u{0}', '\u{0}']), ('\u{4f0}', ['\u{4f1}', '\u{0}', '\u{0}']), + ('\u{4f2}', ['\u{4f3}', '\u{0}', '\u{0}']), ('\u{4f4}', ['\u{4f5}', '\u{0}', '\u{0}']), + ('\u{4f6}', ['\u{4f7}', '\u{0}', '\u{0}']), ('\u{4f8}', ['\u{4f9}', '\u{0}', '\u{0}']), + ('\u{4fa}', ['\u{4fb}', '\u{0}', '\u{0}']), ('\u{4fc}', ['\u{4fd}', '\u{0}', '\u{0}']), + ('\u{4fe}', ['\u{4ff}', '\u{0}', '\u{0}']), ('\u{500}', ['\u{501}', '\u{0}', '\u{0}']), + ('\u{502}', ['\u{503}', '\u{0}', '\u{0}']), ('\u{504}', ['\u{505}', '\u{0}', '\u{0}']), + ('\u{506}', ['\u{507}', '\u{0}', '\u{0}']), ('\u{508}', ['\u{509}', '\u{0}', '\u{0}']), + ('\u{50a}', ['\u{50b}', '\u{0}', '\u{0}']), ('\u{50c}', ['\u{50d}', '\u{0}', '\u{0}']), + ('\u{50e}', ['\u{50f}', '\u{0}', '\u{0}']), ('\u{510}', ['\u{511}', '\u{0}', '\u{0}']), + ('\u{512}', ['\u{513}', '\u{0}', '\u{0}']), ('\u{514}', ['\u{515}', '\u{0}', '\u{0}']), + ('\u{516}', ['\u{517}', '\u{0}', '\u{0}']), ('\u{518}', ['\u{519}', '\u{0}', '\u{0}']), + ('\u{51a}', ['\u{51b}', '\u{0}', '\u{0}']), ('\u{51c}', ['\u{51d}', '\u{0}', '\u{0}']), + ('\u{51e}', ['\u{51f}', '\u{0}', '\u{0}']), ('\u{520}', ['\u{521}', '\u{0}', '\u{0}']), + ('\u{522}', ['\u{523}', '\u{0}', '\u{0}']), ('\u{524}', ['\u{525}', '\u{0}', '\u{0}']), + ('\u{526}', ['\u{527}', '\u{0}', '\u{0}']), ('\u{528}', ['\u{529}', '\u{0}', '\u{0}']), + ('\u{52a}', ['\u{52b}', '\u{0}', '\u{0}']), ('\u{52c}', ['\u{52d}', '\u{0}', '\u{0}']), + ('\u{52e}', ['\u{52f}', '\u{0}', '\u{0}']), ('\u{531}', ['\u{561}', '\u{0}', '\u{0}']), + ('\u{532}', ['\u{562}', '\u{0}', '\u{0}']), ('\u{533}', ['\u{563}', '\u{0}', '\u{0}']), + ('\u{534}', ['\u{564}', '\u{0}', '\u{0}']), ('\u{535}', ['\u{565}', '\u{0}', '\u{0}']), + ('\u{536}', ['\u{566}', '\u{0}', '\u{0}']), ('\u{537}', ['\u{567}', '\u{0}', '\u{0}']), + ('\u{538}', ['\u{568}', '\u{0}', '\u{0}']), ('\u{539}', ['\u{569}', '\u{0}', '\u{0}']), + ('\u{53a}', ['\u{56a}', '\u{0}', '\u{0}']), ('\u{53b}', ['\u{56b}', '\u{0}', '\u{0}']), + ('\u{53c}', ['\u{56c}', '\u{0}', '\u{0}']), ('\u{53d}', ['\u{56d}', '\u{0}', '\u{0}']), + ('\u{53e}', ['\u{56e}', '\u{0}', '\u{0}']), ('\u{53f}', ['\u{56f}', '\u{0}', '\u{0}']), + ('\u{540}', ['\u{570}', '\u{0}', '\u{0}']), ('\u{541}', ['\u{571}', '\u{0}', '\u{0}']), + ('\u{542}', ['\u{572}', '\u{0}', '\u{0}']), ('\u{543}', ['\u{573}', '\u{0}', '\u{0}']), + ('\u{544}', ['\u{574}', '\u{0}', '\u{0}']), ('\u{545}', ['\u{575}', '\u{0}', '\u{0}']), + ('\u{546}', ['\u{576}', '\u{0}', '\u{0}']), ('\u{547}', ['\u{577}', '\u{0}', '\u{0}']), + ('\u{548}', ['\u{578}', '\u{0}', '\u{0}']), ('\u{549}', ['\u{579}', '\u{0}', '\u{0}']), + ('\u{54a}', ['\u{57a}', '\u{0}', '\u{0}']), ('\u{54b}', ['\u{57b}', '\u{0}', '\u{0}']), + ('\u{54c}', ['\u{57c}', '\u{0}', '\u{0}']), ('\u{54d}', ['\u{57d}', '\u{0}', '\u{0}']), + ('\u{54e}', ['\u{57e}', '\u{0}', '\u{0}']), ('\u{54f}', ['\u{57f}', '\u{0}', '\u{0}']), + ('\u{550}', ['\u{580}', '\u{0}', '\u{0}']), ('\u{551}', ['\u{581}', '\u{0}', '\u{0}']), + ('\u{552}', ['\u{582}', '\u{0}', '\u{0}']), ('\u{553}', ['\u{583}', '\u{0}', '\u{0}']), + ('\u{554}', ['\u{584}', '\u{0}', '\u{0}']), ('\u{555}', ['\u{585}', '\u{0}', '\u{0}']), + ('\u{556}', ['\u{586}', '\u{0}', '\u{0}']), ('\u{10a0}', ['\u{2d00}', '\u{0}', '\u{0}']), + ('\u{10a1}', ['\u{2d01}', '\u{0}', '\u{0}']), ('\u{10a2}', ['\u{2d02}', '\u{0}', '\u{0}']), + ('\u{10a3}', ['\u{2d03}', '\u{0}', '\u{0}']), ('\u{10a4}', ['\u{2d04}', '\u{0}', '\u{0}']), + ('\u{10a5}', ['\u{2d05}', '\u{0}', '\u{0}']), ('\u{10a6}', ['\u{2d06}', '\u{0}', '\u{0}']), + ('\u{10a7}', ['\u{2d07}', '\u{0}', '\u{0}']), ('\u{10a8}', ['\u{2d08}', '\u{0}', '\u{0}']), + ('\u{10a9}', ['\u{2d09}', '\u{0}', '\u{0}']), ('\u{10aa}', ['\u{2d0a}', '\u{0}', '\u{0}']), + ('\u{10ab}', ['\u{2d0b}', '\u{0}', '\u{0}']), ('\u{10ac}', ['\u{2d0c}', '\u{0}', '\u{0}']), + ('\u{10ad}', ['\u{2d0d}', '\u{0}', '\u{0}']), ('\u{10ae}', ['\u{2d0e}', '\u{0}', '\u{0}']), + ('\u{10af}', ['\u{2d0f}', '\u{0}', '\u{0}']), ('\u{10b0}', ['\u{2d10}', '\u{0}', '\u{0}']), + ('\u{10b1}', ['\u{2d11}', '\u{0}', '\u{0}']), ('\u{10b2}', ['\u{2d12}', '\u{0}', '\u{0}']), + ('\u{10b3}', ['\u{2d13}', '\u{0}', '\u{0}']), ('\u{10b4}', ['\u{2d14}', '\u{0}', '\u{0}']), + ('\u{10b5}', ['\u{2d15}', '\u{0}', '\u{0}']), ('\u{10b6}', ['\u{2d16}', '\u{0}', '\u{0}']), + ('\u{10b7}', ['\u{2d17}', '\u{0}', '\u{0}']), ('\u{10b8}', ['\u{2d18}', '\u{0}', '\u{0}']), + ('\u{10b9}', ['\u{2d19}', '\u{0}', '\u{0}']), ('\u{10ba}', ['\u{2d1a}', '\u{0}', '\u{0}']), + ('\u{10bb}', ['\u{2d1b}', '\u{0}', '\u{0}']), ('\u{10bc}', ['\u{2d1c}', '\u{0}', '\u{0}']), + ('\u{10bd}', ['\u{2d1d}', '\u{0}', '\u{0}']), ('\u{10be}', ['\u{2d1e}', '\u{0}', '\u{0}']), + ('\u{10bf}', ['\u{2d1f}', '\u{0}', '\u{0}']), ('\u{10c0}', ['\u{2d20}', '\u{0}', '\u{0}']), + ('\u{10c1}', ['\u{2d21}', '\u{0}', '\u{0}']), ('\u{10c2}', ['\u{2d22}', '\u{0}', '\u{0}']), + ('\u{10c3}', ['\u{2d23}', '\u{0}', '\u{0}']), ('\u{10c4}', ['\u{2d24}', '\u{0}', '\u{0}']), + ('\u{10c5}', ['\u{2d25}', '\u{0}', '\u{0}']), ('\u{10c7}', ['\u{2d27}', '\u{0}', '\u{0}']), + ('\u{10cd}', ['\u{2d2d}', '\u{0}', '\u{0}']), ('\u{13a0}', ['\u{ab70}', '\u{0}', '\u{0}']), + ('\u{13a1}', ['\u{ab71}', '\u{0}', '\u{0}']), ('\u{13a2}', ['\u{ab72}', '\u{0}', '\u{0}']), + ('\u{13a3}', ['\u{ab73}', '\u{0}', '\u{0}']), ('\u{13a4}', ['\u{ab74}', '\u{0}', '\u{0}']), + ('\u{13a5}', ['\u{ab75}', '\u{0}', '\u{0}']), ('\u{13a6}', ['\u{ab76}', '\u{0}', '\u{0}']), + ('\u{13a7}', ['\u{ab77}', '\u{0}', '\u{0}']), ('\u{13a8}', ['\u{ab78}', '\u{0}', '\u{0}']), + ('\u{13a9}', ['\u{ab79}', '\u{0}', '\u{0}']), ('\u{13aa}', ['\u{ab7a}', '\u{0}', '\u{0}']), + ('\u{13ab}', ['\u{ab7b}', '\u{0}', '\u{0}']), ('\u{13ac}', ['\u{ab7c}', '\u{0}', '\u{0}']), + ('\u{13ad}', ['\u{ab7d}', '\u{0}', '\u{0}']), ('\u{13ae}', ['\u{ab7e}', '\u{0}', '\u{0}']), + ('\u{13af}', ['\u{ab7f}', '\u{0}', '\u{0}']), ('\u{13b0}', ['\u{ab80}', '\u{0}', '\u{0}']), + ('\u{13b1}', ['\u{ab81}', '\u{0}', '\u{0}']), ('\u{13b2}', ['\u{ab82}', '\u{0}', '\u{0}']), + ('\u{13b3}', ['\u{ab83}', '\u{0}', '\u{0}']), ('\u{13b4}', ['\u{ab84}', '\u{0}', '\u{0}']), + ('\u{13b5}', ['\u{ab85}', '\u{0}', '\u{0}']), ('\u{13b6}', ['\u{ab86}', '\u{0}', '\u{0}']), + ('\u{13b7}', ['\u{ab87}', '\u{0}', '\u{0}']), ('\u{13b8}', ['\u{ab88}', '\u{0}', '\u{0}']), + ('\u{13b9}', ['\u{ab89}', '\u{0}', '\u{0}']), ('\u{13ba}', ['\u{ab8a}', '\u{0}', '\u{0}']), + ('\u{13bb}', ['\u{ab8b}', '\u{0}', '\u{0}']), ('\u{13bc}', ['\u{ab8c}', '\u{0}', '\u{0}']), + ('\u{13bd}', ['\u{ab8d}', '\u{0}', '\u{0}']), ('\u{13be}', ['\u{ab8e}', '\u{0}', '\u{0}']), + ('\u{13bf}', ['\u{ab8f}', '\u{0}', '\u{0}']), ('\u{13c0}', ['\u{ab90}', '\u{0}', '\u{0}']), + ('\u{13c1}', ['\u{ab91}', '\u{0}', '\u{0}']), ('\u{13c2}', ['\u{ab92}', '\u{0}', '\u{0}']), + ('\u{13c3}', ['\u{ab93}', '\u{0}', '\u{0}']), ('\u{13c4}', ['\u{ab94}', '\u{0}', '\u{0}']), + ('\u{13c5}', ['\u{ab95}', '\u{0}', '\u{0}']), ('\u{13c6}', ['\u{ab96}', '\u{0}', '\u{0}']), + ('\u{13c7}', ['\u{ab97}', '\u{0}', '\u{0}']), ('\u{13c8}', ['\u{ab98}', '\u{0}', '\u{0}']), + ('\u{13c9}', ['\u{ab99}', '\u{0}', '\u{0}']), ('\u{13ca}', ['\u{ab9a}', '\u{0}', '\u{0}']), + ('\u{13cb}', ['\u{ab9b}', '\u{0}', '\u{0}']), ('\u{13cc}', ['\u{ab9c}', '\u{0}', '\u{0}']), + ('\u{13cd}', ['\u{ab9d}', '\u{0}', '\u{0}']), ('\u{13ce}', ['\u{ab9e}', '\u{0}', '\u{0}']), + ('\u{13cf}', ['\u{ab9f}', '\u{0}', '\u{0}']), ('\u{13d0}', ['\u{aba0}', '\u{0}', '\u{0}']), + ('\u{13d1}', ['\u{aba1}', '\u{0}', '\u{0}']), ('\u{13d2}', ['\u{aba2}', '\u{0}', '\u{0}']), + ('\u{13d3}', ['\u{aba3}', '\u{0}', '\u{0}']), ('\u{13d4}', ['\u{aba4}', '\u{0}', '\u{0}']), + ('\u{13d5}', ['\u{aba5}', '\u{0}', '\u{0}']), ('\u{13d6}', ['\u{aba6}', '\u{0}', '\u{0}']), + ('\u{13d7}', ['\u{aba7}', '\u{0}', '\u{0}']), ('\u{13d8}', ['\u{aba8}', '\u{0}', '\u{0}']), + ('\u{13d9}', ['\u{aba9}', '\u{0}', '\u{0}']), ('\u{13da}', ['\u{abaa}', '\u{0}', '\u{0}']), + ('\u{13db}', ['\u{abab}', '\u{0}', '\u{0}']), ('\u{13dc}', ['\u{abac}', '\u{0}', '\u{0}']), + ('\u{13dd}', ['\u{abad}', '\u{0}', '\u{0}']), ('\u{13de}', ['\u{abae}', '\u{0}', '\u{0}']), + ('\u{13df}', ['\u{abaf}', '\u{0}', '\u{0}']), ('\u{13e0}', ['\u{abb0}', '\u{0}', '\u{0}']), + ('\u{13e1}', ['\u{abb1}', '\u{0}', '\u{0}']), ('\u{13e2}', ['\u{abb2}', '\u{0}', '\u{0}']), + ('\u{13e3}', ['\u{abb3}', '\u{0}', '\u{0}']), ('\u{13e4}', ['\u{abb4}', '\u{0}', '\u{0}']), + ('\u{13e5}', ['\u{abb5}', '\u{0}', '\u{0}']), ('\u{13e6}', ['\u{abb6}', '\u{0}', '\u{0}']), + ('\u{13e7}', ['\u{abb7}', '\u{0}', '\u{0}']), ('\u{13e8}', ['\u{abb8}', '\u{0}', '\u{0}']), + ('\u{13e9}', ['\u{abb9}', '\u{0}', '\u{0}']), ('\u{13ea}', ['\u{abba}', '\u{0}', '\u{0}']), + ('\u{13eb}', ['\u{abbb}', '\u{0}', '\u{0}']), ('\u{13ec}', ['\u{abbc}', '\u{0}', '\u{0}']), + ('\u{13ed}', ['\u{abbd}', '\u{0}', '\u{0}']), ('\u{13ee}', ['\u{abbe}', '\u{0}', '\u{0}']), + ('\u{13ef}', ['\u{abbf}', '\u{0}', '\u{0}']), ('\u{13f0}', ['\u{13f8}', '\u{0}', '\u{0}']), + ('\u{13f1}', ['\u{13f9}', '\u{0}', '\u{0}']), ('\u{13f2}', ['\u{13fa}', '\u{0}', '\u{0}']), + ('\u{13f3}', ['\u{13fb}', '\u{0}', '\u{0}']), ('\u{13f4}', ['\u{13fc}', '\u{0}', '\u{0}']), + ('\u{13f5}', ['\u{13fd}', '\u{0}', '\u{0}']), ('\u{1c90}', ['\u{10d0}', '\u{0}', '\u{0}']), + ('\u{1c91}', ['\u{10d1}', '\u{0}', '\u{0}']), ('\u{1c92}', ['\u{10d2}', '\u{0}', '\u{0}']), + ('\u{1c93}', ['\u{10d3}', '\u{0}', '\u{0}']), ('\u{1c94}', ['\u{10d4}', '\u{0}', '\u{0}']), + ('\u{1c95}', ['\u{10d5}', '\u{0}', '\u{0}']), ('\u{1c96}', ['\u{10d6}', '\u{0}', '\u{0}']), + ('\u{1c97}', ['\u{10d7}', '\u{0}', '\u{0}']), ('\u{1c98}', ['\u{10d8}', '\u{0}', '\u{0}']), + ('\u{1c99}', ['\u{10d9}', '\u{0}', '\u{0}']), ('\u{1c9a}', ['\u{10da}', '\u{0}', '\u{0}']), + ('\u{1c9b}', ['\u{10db}', '\u{0}', '\u{0}']), ('\u{1c9c}', ['\u{10dc}', '\u{0}', '\u{0}']), + ('\u{1c9d}', ['\u{10dd}', '\u{0}', '\u{0}']), ('\u{1c9e}', ['\u{10de}', '\u{0}', '\u{0}']), + ('\u{1c9f}', ['\u{10df}', '\u{0}', '\u{0}']), ('\u{1ca0}', ['\u{10e0}', '\u{0}', '\u{0}']), + ('\u{1ca1}', ['\u{10e1}', '\u{0}', '\u{0}']), ('\u{1ca2}', ['\u{10e2}', '\u{0}', '\u{0}']), + ('\u{1ca3}', ['\u{10e3}', '\u{0}', '\u{0}']), ('\u{1ca4}', ['\u{10e4}', '\u{0}', '\u{0}']), + ('\u{1ca5}', ['\u{10e5}', '\u{0}', '\u{0}']), ('\u{1ca6}', ['\u{10e6}', '\u{0}', '\u{0}']), + ('\u{1ca7}', ['\u{10e7}', '\u{0}', '\u{0}']), ('\u{1ca8}', ['\u{10e8}', '\u{0}', '\u{0}']), + ('\u{1ca9}', ['\u{10e9}', '\u{0}', '\u{0}']), ('\u{1caa}', ['\u{10ea}', '\u{0}', '\u{0}']), + ('\u{1cab}', ['\u{10eb}', '\u{0}', '\u{0}']), ('\u{1cac}', ['\u{10ec}', '\u{0}', '\u{0}']), + ('\u{1cad}', ['\u{10ed}', '\u{0}', '\u{0}']), ('\u{1cae}', ['\u{10ee}', '\u{0}', '\u{0}']), + ('\u{1caf}', ['\u{10ef}', '\u{0}', '\u{0}']), ('\u{1cb0}', ['\u{10f0}', '\u{0}', '\u{0}']), + ('\u{1cb1}', ['\u{10f1}', '\u{0}', '\u{0}']), ('\u{1cb2}', ['\u{10f2}', '\u{0}', '\u{0}']), + ('\u{1cb3}', ['\u{10f3}', '\u{0}', '\u{0}']), ('\u{1cb4}', ['\u{10f4}', '\u{0}', '\u{0}']), + ('\u{1cb5}', ['\u{10f5}', '\u{0}', '\u{0}']), ('\u{1cb6}', ['\u{10f6}', '\u{0}', '\u{0}']), + ('\u{1cb7}', ['\u{10f7}', '\u{0}', '\u{0}']), ('\u{1cb8}', ['\u{10f8}', '\u{0}', '\u{0}']), + ('\u{1cb9}', ['\u{10f9}', '\u{0}', '\u{0}']), ('\u{1cba}', ['\u{10fa}', '\u{0}', '\u{0}']), + ('\u{1cbd}', ['\u{10fd}', '\u{0}', '\u{0}']), ('\u{1cbe}', ['\u{10fe}', '\u{0}', '\u{0}']), + ('\u{1cbf}', ['\u{10ff}', '\u{0}', '\u{0}']), ('\u{1e00}', ['\u{1e01}', '\u{0}', '\u{0}']), + ('\u{1e02}', ['\u{1e03}', '\u{0}', '\u{0}']), ('\u{1e04}', ['\u{1e05}', '\u{0}', '\u{0}']), + ('\u{1e06}', ['\u{1e07}', '\u{0}', '\u{0}']), ('\u{1e08}', ['\u{1e09}', '\u{0}', '\u{0}']), + ('\u{1e0a}', ['\u{1e0b}', '\u{0}', '\u{0}']), ('\u{1e0c}', ['\u{1e0d}', '\u{0}', '\u{0}']), + ('\u{1e0e}', ['\u{1e0f}', '\u{0}', '\u{0}']), ('\u{1e10}', ['\u{1e11}', '\u{0}', '\u{0}']), + ('\u{1e12}', ['\u{1e13}', '\u{0}', '\u{0}']), ('\u{1e14}', ['\u{1e15}', '\u{0}', '\u{0}']), + ('\u{1e16}', ['\u{1e17}', '\u{0}', '\u{0}']), ('\u{1e18}', ['\u{1e19}', '\u{0}', '\u{0}']), + ('\u{1e1a}', ['\u{1e1b}', '\u{0}', '\u{0}']), ('\u{1e1c}', ['\u{1e1d}', '\u{0}', '\u{0}']), + ('\u{1e1e}', ['\u{1e1f}', '\u{0}', '\u{0}']), ('\u{1e20}', ['\u{1e21}', '\u{0}', '\u{0}']), + ('\u{1e22}', ['\u{1e23}', '\u{0}', '\u{0}']), ('\u{1e24}', ['\u{1e25}', '\u{0}', '\u{0}']), + ('\u{1e26}', ['\u{1e27}', '\u{0}', '\u{0}']), ('\u{1e28}', ['\u{1e29}', '\u{0}', '\u{0}']), + ('\u{1e2a}', ['\u{1e2b}', '\u{0}', '\u{0}']), ('\u{1e2c}', ['\u{1e2d}', '\u{0}', '\u{0}']), + ('\u{1e2e}', ['\u{1e2f}', '\u{0}', '\u{0}']), ('\u{1e30}', ['\u{1e31}', '\u{0}', '\u{0}']), + ('\u{1e32}', ['\u{1e33}', '\u{0}', '\u{0}']), ('\u{1e34}', ['\u{1e35}', '\u{0}', '\u{0}']), + ('\u{1e36}', ['\u{1e37}', '\u{0}', '\u{0}']), ('\u{1e38}', ['\u{1e39}', '\u{0}', '\u{0}']), + ('\u{1e3a}', ['\u{1e3b}', '\u{0}', '\u{0}']), ('\u{1e3c}', ['\u{1e3d}', '\u{0}', '\u{0}']), + ('\u{1e3e}', ['\u{1e3f}', '\u{0}', '\u{0}']), ('\u{1e40}', ['\u{1e41}', '\u{0}', '\u{0}']), + ('\u{1e42}', ['\u{1e43}', '\u{0}', '\u{0}']), ('\u{1e44}', ['\u{1e45}', '\u{0}', '\u{0}']), + ('\u{1e46}', ['\u{1e47}', '\u{0}', '\u{0}']), ('\u{1e48}', ['\u{1e49}', '\u{0}', '\u{0}']), + ('\u{1e4a}', ['\u{1e4b}', '\u{0}', '\u{0}']), ('\u{1e4c}', ['\u{1e4d}', '\u{0}', '\u{0}']), + ('\u{1e4e}', ['\u{1e4f}', '\u{0}', '\u{0}']), ('\u{1e50}', ['\u{1e51}', '\u{0}', '\u{0}']), + ('\u{1e52}', ['\u{1e53}', '\u{0}', '\u{0}']), ('\u{1e54}', ['\u{1e55}', '\u{0}', '\u{0}']), + ('\u{1e56}', ['\u{1e57}', '\u{0}', '\u{0}']), ('\u{1e58}', ['\u{1e59}', '\u{0}', '\u{0}']), + ('\u{1e5a}', ['\u{1e5b}', '\u{0}', '\u{0}']), ('\u{1e5c}', ['\u{1e5d}', '\u{0}', '\u{0}']), + ('\u{1e5e}', ['\u{1e5f}', '\u{0}', '\u{0}']), ('\u{1e60}', ['\u{1e61}', '\u{0}', '\u{0}']), + ('\u{1e62}', ['\u{1e63}', '\u{0}', '\u{0}']), ('\u{1e64}', ['\u{1e65}', '\u{0}', '\u{0}']), + ('\u{1e66}', ['\u{1e67}', '\u{0}', '\u{0}']), ('\u{1e68}', ['\u{1e69}', '\u{0}', '\u{0}']), + ('\u{1e6a}', ['\u{1e6b}', '\u{0}', '\u{0}']), ('\u{1e6c}', ['\u{1e6d}', '\u{0}', '\u{0}']), + ('\u{1e6e}', ['\u{1e6f}', '\u{0}', '\u{0}']), ('\u{1e70}', ['\u{1e71}', '\u{0}', '\u{0}']), + ('\u{1e72}', ['\u{1e73}', '\u{0}', '\u{0}']), ('\u{1e74}', ['\u{1e75}', '\u{0}', '\u{0}']), + ('\u{1e76}', ['\u{1e77}', '\u{0}', '\u{0}']), ('\u{1e78}', ['\u{1e79}', '\u{0}', '\u{0}']), + ('\u{1e7a}', ['\u{1e7b}', '\u{0}', '\u{0}']), ('\u{1e7c}', ['\u{1e7d}', '\u{0}', '\u{0}']), + ('\u{1e7e}', ['\u{1e7f}', '\u{0}', '\u{0}']), ('\u{1e80}', ['\u{1e81}', '\u{0}', '\u{0}']), + ('\u{1e82}', ['\u{1e83}', '\u{0}', '\u{0}']), ('\u{1e84}', ['\u{1e85}', '\u{0}', '\u{0}']), + ('\u{1e86}', ['\u{1e87}', '\u{0}', '\u{0}']), ('\u{1e88}', ['\u{1e89}', '\u{0}', '\u{0}']), + ('\u{1e8a}', ['\u{1e8b}', '\u{0}', '\u{0}']), ('\u{1e8c}', ['\u{1e8d}', '\u{0}', '\u{0}']), + ('\u{1e8e}', ['\u{1e8f}', '\u{0}', '\u{0}']), ('\u{1e90}', ['\u{1e91}', '\u{0}', '\u{0}']), + ('\u{1e92}', ['\u{1e93}', '\u{0}', '\u{0}']), ('\u{1e94}', ['\u{1e95}', '\u{0}', '\u{0}']), + ('\u{1e9e}', ['\u{df}', '\u{0}', '\u{0}']), ('\u{1ea0}', ['\u{1ea1}', '\u{0}', '\u{0}']), + ('\u{1ea2}', ['\u{1ea3}', '\u{0}', '\u{0}']), ('\u{1ea4}', ['\u{1ea5}', '\u{0}', '\u{0}']), + ('\u{1ea6}', ['\u{1ea7}', '\u{0}', '\u{0}']), ('\u{1ea8}', ['\u{1ea9}', '\u{0}', '\u{0}']), + ('\u{1eaa}', ['\u{1eab}', '\u{0}', '\u{0}']), ('\u{1eac}', ['\u{1ead}', '\u{0}', '\u{0}']), + ('\u{1eae}', ['\u{1eaf}', '\u{0}', '\u{0}']), ('\u{1eb0}', ['\u{1eb1}', '\u{0}', '\u{0}']), + ('\u{1eb2}', ['\u{1eb3}', '\u{0}', '\u{0}']), ('\u{1eb4}', ['\u{1eb5}', '\u{0}', '\u{0}']), + ('\u{1eb6}', ['\u{1eb7}', '\u{0}', '\u{0}']), ('\u{1eb8}', ['\u{1eb9}', '\u{0}', '\u{0}']), + ('\u{1eba}', ['\u{1ebb}', '\u{0}', '\u{0}']), ('\u{1ebc}', ['\u{1ebd}', '\u{0}', '\u{0}']), + ('\u{1ebe}', ['\u{1ebf}', '\u{0}', '\u{0}']), ('\u{1ec0}', ['\u{1ec1}', '\u{0}', '\u{0}']), + ('\u{1ec2}', ['\u{1ec3}', '\u{0}', '\u{0}']), ('\u{1ec4}', ['\u{1ec5}', '\u{0}', '\u{0}']), + ('\u{1ec6}', ['\u{1ec7}', '\u{0}', '\u{0}']), ('\u{1ec8}', ['\u{1ec9}', '\u{0}', '\u{0}']), + ('\u{1eca}', ['\u{1ecb}', '\u{0}', '\u{0}']), ('\u{1ecc}', ['\u{1ecd}', '\u{0}', '\u{0}']), + ('\u{1ece}', ['\u{1ecf}', '\u{0}', '\u{0}']), ('\u{1ed0}', ['\u{1ed1}', '\u{0}', '\u{0}']), + ('\u{1ed2}', ['\u{1ed3}', '\u{0}', '\u{0}']), ('\u{1ed4}', ['\u{1ed5}', '\u{0}', '\u{0}']), + ('\u{1ed6}', ['\u{1ed7}', '\u{0}', '\u{0}']), ('\u{1ed8}', ['\u{1ed9}', '\u{0}', '\u{0}']), + ('\u{1eda}', ['\u{1edb}', '\u{0}', '\u{0}']), ('\u{1edc}', ['\u{1edd}', '\u{0}', '\u{0}']), + ('\u{1ede}', ['\u{1edf}', '\u{0}', '\u{0}']), ('\u{1ee0}', ['\u{1ee1}', '\u{0}', '\u{0}']), + ('\u{1ee2}', ['\u{1ee3}', '\u{0}', '\u{0}']), ('\u{1ee4}', ['\u{1ee5}', '\u{0}', '\u{0}']), + ('\u{1ee6}', ['\u{1ee7}', '\u{0}', '\u{0}']), ('\u{1ee8}', ['\u{1ee9}', '\u{0}', '\u{0}']), + ('\u{1eea}', ['\u{1eeb}', '\u{0}', '\u{0}']), ('\u{1eec}', ['\u{1eed}', '\u{0}', '\u{0}']), + ('\u{1eee}', ['\u{1eef}', '\u{0}', '\u{0}']), ('\u{1ef0}', ['\u{1ef1}', '\u{0}', '\u{0}']), + ('\u{1ef2}', ['\u{1ef3}', '\u{0}', '\u{0}']), ('\u{1ef4}', ['\u{1ef5}', '\u{0}', '\u{0}']), + ('\u{1ef6}', ['\u{1ef7}', '\u{0}', '\u{0}']), ('\u{1ef8}', ['\u{1ef9}', '\u{0}', '\u{0}']), + ('\u{1efa}', ['\u{1efb}', '\u{0}', '\u{0}']), ('\u{1efc}', ['\u{1efd}', '\u{0}', '\u{0}']), + ('\u{1efe}', ['\u{1eff}', '\u{0}', '\u{0}']), ('\u{1f08}', ['\u{1f00}', '\u{0}', '\u{0}']), + ('\u{1f09}', ['\u{1f01}', '\u{0}', '\u{0}']), ('\u{1f0a}', ['\u{1f02}', '\u{0}', '\u{0}']), + ('\u{1f0b}', ['\u{1f03}', '\u{0}', '\u{0}']), ('\u{1f0c}', ['\u{1f04}', '\u{0}', '\u{0}']), + ('\u{1f0d}', ['\u{1f05}', '\u{0}', '\u{0}']), ('\u{1f0e}', ['\u{1f06}', '\u{0}', '\u{0}']), + ('\u{1f0f}', ['\u{1f07}', '\u{0}', '\u{0}']), ('\u{1f18}', ['\u{1f10}', '\u{0}', '\u{0}']), + ('\u{1f19}', ['\u{1f11}', '\u{0}', '\u{0}']), ('\u{1f1a}', ['\u{1f12}', '\u{0}', '\u{0}']), + ('\u{1f1b}', ['\u{1f13}', '\u{0}', '\u{0}']), ('\u{1f1c}', ['\u{1f14}', '\u{0}', '\u{0}']), + ('\u{1f1d}', ['\u{1f15}', '\u{0}', '\u{0}']), ('\u{1f28}', ['\u{1f20}', '\u{0}', '\u{0}']), + ('\u{1f29}', ['\u{1f21}', '\u{0}', '\u{0}']), ('\u{1f2a}', ['\u{1f22}', '\u{0}', '\u{0}']), + ('\u{1f2b}', ['\u{1f23}', '\u{0}', '\u{0}']), ('\u{1f2c}', ['\u{1f24}', '\u{0}', '\u{0}']), + ('\u{1f2d}', ['\u{1f25}', '\u{0}', '\u{0}']), ('\u{1f2e}', ['\u{1f26}', '\u{0}', '\u{0}']), + ('\u{1f2f}', ['\u{1f27}', '\u{0}', '\u{0}']), ('\u{1f38}', ['\u{1f30}', '\u{0}', '\u{0}']), + ('\u{1f39}', ['\u{1f31}', '\u{0}', '\u{0}']), ('\u{1f3a}', ['\u{1f32}', '\u{0}', '\u{0}']), + ('\u{1f3b}', ['\u{1f33}', '\u{0}', '\u{0}']), ('\u{1f3c}', ['\u{1f34}', '\u{0}', '\u{0}']), + ('\u{1f3d}', ['\u{1f35}', '\u{0}', '\u{0}']), ('\u{1f3e}', ['\u{1f36}', '\u{0}', '\u{0}']), + ('\u{1f3f}', ['\u{1f37}', '\u{0}', '\u{0}']), ('\u{1f48}', ['\u{1f40}', '\u{0}', '\u{0}']), + ('\u{1f49}', ['\u{1f41}', '\u{0}', '\u{0}']), ('\u{1f4a}', ['\u{1f42}', '\u{0}', '\u{0}']), + ('\u{1f4b}', ['\u{1f43}', '\u{0}', '\u{0}']), ('\u{1f4c}', ['\u{1f44}', '\u{0}', '\u{0}']), + ('\u{1f4d}', ['\u{1f45}', '\u{0}', '\u{0}']), ('\u{1f59}', ['\u{1f51}', '\u{0}', '\u{0}']), + ('\u{1f5b}', ['\u{1f53}', '\u{0}', '\u{0}']), ('\u{1f5d}', ['\u{1f55}', '\u{0}', '\u{0}']), + ('\u{1f5f}', ['\u{1f57}', '\u{0}', '\u{0}']), ('\u{1f68}', ['\u{1f60}', '\u{0}', '\u{0}']), + ('\u{1f69}', ['\u{1f61}', '\u{0}', '\u{0}']), ('\u{1f6a}', ['\u{1f62}', '\u{0}', '\u{0}']), + ('\u{1f6b}', ['\u{1f63}', '\u{0}', '\u{0}']), ('\u{1f6c}', ['\u{1f64}', '\u{0}', '\u{0}']), + ('\u{1f6d}', ['\u{1f65}', '\u{0}', '\u{0}']), ('\u{1f6e}', ['\u{1f66}', '\u{0}', '\u{0}']), + ('\u{1f6f}', ['\u{1f67}', '\u{0}', '\u{0}']), ('\u{1f88}', ['\u{1f80}', '\u{0}', '\u{0}']), + ('\u{1f89}', ['\u{1f81}', '\u{0}', '\u{0}']), ('\u{1f8a}', ['\u{1f82}', '\u{0}', '\u{0}']), + ('\u{1f8b}', ['\u{1f83}', '\u{0}', '\u{0}']), ('\u{1f8c}', ['\u{1f84}', '\u{0}', '\u{0}']), + ('\u{1f8d}', ['\u{1f85}', '\u{0}', '\u{0}']), ('\u{1f8e}', ['\u{1f86}', '\u{0}', '\u{0}']), + ('\u{1f8f}', ['\u{1f87}', '\u{0}', '\u{0}']), ('\u{1f98}', ['\u{1f90}', '\u{0}', '\u{0}']), + ('\u{1f99}', ['\u{1f91}', '\u{0}', '\u{0}']), ('\u{1f9a}', ['\u{1f92}', '\u{0}', '\u{0}']), + ('\u{1f9b}', ['\u{1f93}', '\u{0}', '\u{0}']), ('\u{1f9c}', ['\u{1f94}', '\u{0}', '\u{0}']), + ('\u{1f9d}', ['\u{1f95}', '\u{0}', '\u{0}']), ('\u{1f9e}', ['\u{1f96}', '\u{0}', '\u{0}']), + ('\u{1f9f}', ['\u{1f97}', '\u{0}', '\u{0}']), ('\u{1fa8}', ['\u{1fa0}', '\u{0}', '\u{0}']), + ('\u{1fa9}', ['\u{1fa1}', '\u{0}', '\u{0}']), ('\u{1faa}', ['\u{1fa2}', '\u{0}', '\u{0}']), + ('\u{1fab}', ['\u{1fa3}', '\u{0}', '\u{0}']), ('\u{1fac}', ['\u{1fa4}', '\u{0}', '\u{0}']), + ('\u{1fad}', ['\u{1fa5}', '\u{0}', '\u{0}']), ('\u{1fae}', ['\u{1fa6}', '\u{0}', '\u{0}']), + ('\u{1faf}', ['\u{1fa7}', '\u{0}', '\u{0}']), ('\u{1fb8}', ['\u{1fb0}', '\u{0}', '\u{0}']), + ('\u{1fb9}', ['\u{1fb1}', '\u{0}', '\u{0}']), ('\u{1fba}', ['\u{1f70}', '\u{0}', '\u{0}']), + ('\u{1fbb}', ['\u{1f71}', '\u{0}', '\u{0}']), ('\u{1fbc}', ['\u{1fb3}', '\u{0}', '\u{0}']), + ('\u{1fc8}', ['\u{1f72}', '\u{0}', '\u{0}']), ('\u{1fc9}', ['\u{1f73}', '\u{0}', '\u{0}']), + ('\u{1fca}', ['\u{1f74}', '\u{0}', '\u{0}']), ('\u{1fcb}', ['\u{1f75}', '\u{0}', '\u{0}']), + ('\u{1fcc}', ['\u{1fc3}', '\u{0}', '\u{0}']), ('\u{1fd8}', ['\u{1fd0}', '\u{0}', '\u{0}']), + ('\u{1fd9}', ['\u{1fd1}', '\u{0}', '\u{0}']), ('\u{1fda}', ['\u{1f76}', '\u{0}', '\u{0}']), + ('\u{1fdb}', ['\u{1f77}', '\u{0}', '\u{0}']), ('\u{1fe8}', ['\u{1fe0}', '\u{0}', '\u{0}']), + ('\u{1fe9}', ['\u{1fe1}', '\u{0}', '\u{0}']), ('\u{1fea}', ['\u{1f7a}', '\u{0}', '\u{0}']), + ('\u{1feb}', ['\u{1f7b}', '\u{0}', '\u{0}']), ('\u{1fec}', ['\u{1fe5}', '\u{0}', '\u{0}']), + ('\u{1ff8}', ['\u{1f78}', '\u{0}', '\u{0}']), ('\u{1ff9}', ['\u{1f79}', '\u{0}', '\u{0}']), + ('\u{1ffa}', ['\u{1f7c}', '\u{0}', '\u{0}']), ('\u{1ffb}', ['\u{1f7d}', '\u{0}', '\u{0}']), + ('\u{1ffc}', ['\u{1ff3}', '\u{0}', '\u{0}']), ('\u{2126}', ['\u{3c9}', '\u{0}', '\u{0}']), + ('\u{212a}', ['k', '\u{0}', '\u{0}']), ('\u{212b}', ['\u{e5}', '\u{0}', '\u{0}']), + ('\u{2132}', ['\u{214e}', '\u{0}', '\u{0}']), ('\u{2160}', ['\u{2170}', '\u{0}', '\u{0}']), + ('\u{2161}', ['\u{2171}', '\u{0}', '\u{0}']), ('\u{2162}', ['\u{2172}', '\u{0}', '\u{0}']), + ('\u{2163}', ['\u{2173}', '\u{0}', '\u{0}']), ('\u{2164}', ['\u{2174}', '\u{0}', '\u{0}']), + ('\u{2165}', ['\u{2175}', '\u{0}', '\u{0}']), ('\u{2166}', ['\u{2176}', '\u{0}', '\u{0}']), + ('\u{2167}', ['\u{2177}', '\u{0}', '\u{0}']), ('\u{2168}', ['\u{2178}', '\u{0}', '\u{0}']), + ('\u{2169}', ['\u{2179}', '\u{0}', '\u{0}']), ('\u{216a}', ['\u{217a}', '\u{0}', '\u{0}']), + ('\u{216b}', ['\u{217b}', '\u{0}', '\u{0}']), ('\u{216c}', ['\u{217c}', '\u{0}', '\u{0}']), + ('\u{216d}', ['\u{217d}', '\u{0}', '\u{0}']), ('\u{216e}', ['\u{217e}', '\u{0}', '\u{0}']), + ('\u{216f}', ['\u{217f}', '\u{0}', '\u{0}']), ('\u{2183}', ['\u{2184}', '\u{0}', '\u{0}']), + ('\u{24b6}', ['\u{24d0}', '\u{0}', '\u{0}']), ('\u{24b7}', ['\u{24d1}', '\u{0}', '\u{0}']), + ('\u{24b8}', ['\u{24d2}', '\u{0}', '\u{0}']), ('\u{24b9}', ['\u{24d3}', '\u{0}', '\u{0}']), + ('\u{24ba}', ['\u{24d4}', '\u{0}', '\u{0}']), ('\u{24bb}', ['\u{24d5}', '\u{0}', '\u{0}']), + ('\u{24bc}', ['\u{24d6}', '\u{0}', '\u{0}']), ('\u{24bd}', ['\u{24d7}', '\u{0}', '\u{0}']), + ('\u{24be}', ['\u{24d8}', '\u{0}', '\u{0}']), ('\u{24bf}', ['\u{24d9}', '\u{0}', '\u{0}']), + ('\u{24c0}', ['\u{24da}', '\u{0}', '\u{0}']), ('\u{24c1}', ['\u{24db}', '\u{0}', '\u{0}']), + ('\u{24c2}', ['\u{24dc}', '\u{0}', '\u{0}']), ('\u{24c3}', ['\u{24dd}', '\u{0}', '\u{0}']), + ('\u{24c4}', ['\u{24de}', '\u{0}', '\u{0}']), ('\u{24c5}', ['\u{24df}', '\u{0}', '\u{0}']), + ('\u{24c6}', ['\u{24e0}', '\u{0}', '\u{0}']), ('\u{24c7}', ['\u{24e1}', '\u{0}', '\u{0}']), + ('\u{24c8}', ['\u{24e2}', '\u{0}', '\u{0}']), ('\u{24c9}', ['\u{24e3}', '\u{0}', '\u{0}']), + ('\u{24ca}', ['\u{24e4}', '\u{0}', '\u{0}']), ('\u{24cb}', ['\u{24e5}', '\u{0}', '\u{0}']), + ('\u{24cc}', ['\u{24e6}', '\u{0}', '\u{0}']), ('\u{24cd}', ['\u{24e7}', '\u{0}', '\u{0}']), + ('\u{24ce}', ['\u{24e8}', '\u{0}', '\u{0}']), ('\u{24cf}', ['\u{24e9}', '\u{0}', '\u{0}']), + ('\u{2c00}', ['\u{2c30}', '\u{0}', '\u{0}']), ('\u{2c01}', ['\u{2c31}', '\u{0}', '\u{0}']), + ('\u{2c02}', ['\u{2c32}', '\u{0}', '\u{0}']), ('\u{2c03}', ['\u{2c33}', '\u{0}', '\u{0}']), + ('\u{2c04}', ['\u{2c34}', '\u{0}', '\u{0}']), ('\u{2c05}', ['\u{2c35}', '\u{0}', '\u{0}']), + ('\u{2c06}', ['\u{2c36}', '\u{0}', '\u{0}']), ('\u{2c07}', ['\u{2c37}', '\u{0}', '\u{0}']), + ('\u{2c08}', ['\u{2c38}', '\u{0}', '\u{0}']), ('\u{2c09}', ['\u{2c39}', '\u{0}', '\u{0}']), + ('\u{2c0a}', ['\u{2c3a}', '\u{0}', '\u{0}']), ('\u{2c0b}', ['\u{2c3b}', '\u{0}', '\u{0}']), + ('\u{2c0c}', ['\u{2c3c}', '\u{0}', '\u{0}']), ('\u{2c0d}', ['\u{2c3d}', '\u{0}', '\u{0}']), + ('\u{2c0e}', ['\u{2c3e}', '\u{0}', '\u{0}']), ('\u{2c0f}', ['\u{2c3f}', '\u{0}', '\u{0}']), + ('\u{2c10}', ['\u{2c40}', '\u{0}', '\u{0}']), ('\u{2c11}', ['\u{2c41}', '\u{0}', '\u{0}']), + ('\u{2c12}', ['\u{2c42}', '\u{0}', '\u{0}']), ('\u{2c13}', ['\u{2c43}', '\u{0}', '\u{0}']), + ('\u{2c14}', ['\u{2c44}', '\u{0}', '\u{0}']), ('\u{2c15}', ['\u{2c45}', '\u{0}', '\u{0}']), + ('\u{2c16}', ['\u{2c46}', '\u{0}', '\u{0}']), ('\u{2c17}', ['\u{2c47}', '\u{0}', '\u{0}']), + ('\u{2c18}', ['\u{2c48}', '\u{0}', '\u{0}']), ('\u{2c19}', ['\u{2c49}', '\u{0}', '\u{0}']), + ('\u{2c1a}', ['\u{2c4a}', '\u{0}', '\u{0}']), ('\u{2c1b}', ['\u{2c4b}', '\u{0}', '\u{0}']), + ('\u{2c1c}', ['\u{2c4c}', '\u{0}', '\u{0}']), ('\u{2c1d}', ['\u{2c4d}', '\u{0}', '\u{0}']), + ('\u{2c1e}', ['\u{2c4e}', '\u{0}', '\u{0}']), ('\u{2c1f}', ['\u{2c4f}', '\u{0}', '\u{0}']), + ('\u{2c20}', ['\u{2c50}', '\u{0}', '\u{0}']), ('\u{2c21}', ['\u{2c51}', '\u{0}', '\u{0}']), + ('\u{2c22}', ['\u{2c52}', '\u{0}', '\u{0}']), ('\u{2c23}', ['\u{2c53}', '\u{0}', '\u{0}']), + ('\u{2c24}', ['\u{2c54}', '\u{0}', '\u{0}']), ('\u{2c25}', ['\u{2c55}', '\u{0}', '\u{0}']), + ('\u{2c26}', ['\u{2c56}', '\u{0}', '\u{0}']), ('\u{2c27}', ['\u{2c57}', '\u{0}', '\u{0}']), + ('\u{2c28}', ['\u{2c58}', '\u{0}', '\u{0}']), ('\u{2c29}', ['\u{2c59}', '\u{0}', '\u{0}']), + ('\u{2c2a}', ['\u{2c5a}', '\u{0}', '\u{0}']), ('\u{2c2b}', ['\u{2c5b}', '\u{0}', '\u{0}']), + ('\u{2c2c}', ['\u{2c5c}', '\u{0}', '\u{0}']), ('\u{2c2d}', ['\u{2c5d}', '\u{0}', '\u{0}']), + ('\u{2c2e}', ['\u{2c5e}', '\u{0}', '\u{0}']), ('\u{2c60}', ['\u{2c61}', '\u{0}', '\u{0}']), + ('\u{2c62}', ['\u{26b}', '\u{0}', '\u{0}']), ('\u{2c63}', ['\u{1d7d}', '\u{0}', '\u{0}']), + ('\u{2c64}', ['\u{27d}', '\u{0}', '\u{0}']), ('\u{2c67}', ['\u{2c68}', '\u{0}', '\u{0}']), + ('\u{2c69}', ['\u{2c6a}', '\u{0}', '\u{0}']), ('\u{2c6b}', ['\u{2c6c}', '\u{0}', '\u{0}']), + ('\u{2c6d}', ['\u{251}', '\u{0}', '\u{0}']), ('\u{2c6e}', ['\u{271}', '\u{0}', '\u{0}']), + ('\u{2c6f}', ['\u{250}', '\u{0}', '\u{0}']), ('\u{2c70}', ['\u{252}', '\u{0}', '\u{0}']), + ('\u{2c72}', ['\u{2c73}', '\u{0}', '\u{0}']), ('\u{2c75}', ['\u{2c76}', '\u{0}', '\u{0}']), + ('\u{2c7e}', ['\u{23f}', '\u{0}', '\u{0}']), ('\u{2c7f}', ['\u{240}', '\u{0}', '\u{0}']), + ('\u{2c80}', ['\u{2c81}', '\u{0}', '\u{0}']), ('\u{2c82}', ['\u{2c83}', '\u{0}', '\u{0}']), + ('\u{2c84}', ['\u{2c85}', '\u{0}', '\u{0}']), ('\u{2c86}', ['\u{2c87}', '\u{0}', '\u{0}']), + ('\u{2c88}', ['\u{2c89}', '\u{0}', '\u{0}']), ('\u{2c8a}', ['\u{2c8b}', '\u{0}', '\u{0}']), + ('\u{2c8c}', ['\u{2c8d}', '\u{0}', '\u{0}']), ('\u{2c8e}', ['\u{2c8f}', '\u{0}', '\u{0}']), + ('\u{2c90}', ['\u{2c91}', '\u{0}', '\u{0}']), ('\u{2c92}', ['\u{2c93}', '\u{0}', '\u{0}']), + ('\u{2c94}', ['\u{2c95}', '\u{0}', '\u{0}']), ('\u{2c96}', ['\u{2c97}', '\u{0}', '\u{0}']), + ('\u{2c98}', ['\u{2c99}', '\u{0}', '\u{0}']), ('\u{2c9a}', ['\u{2c9b}', '\u{0}', '\u{0}']), + ('\u{2c9c}', ['\u{2c9d}', '\u{0}', '\u{0}']), ('\u{2c9e}', ['\u{2c9f}', '\u{0}', '\u{0}']), + ('\u{2ca0}', ['\u{2ca1}', '\u{0}', '\u{0}']), ('\u{2ca2}', ['\u{2ca3}', '\u{0}', '\u{0}']), + ('\u{2ca4}', ['\u{2ca5}', '\u{0}', '\u{0}']), ('\u{2ca6}', ['\u{2ca7}', '\u{0}', '\u{0}']), + ('\u{2ca8}', ['\u{2ca9}', '\u{0}', '\u{0}']), ('\u{2caa}', ['\u{2cab}', '\u{0}', '\u{0}']), + ('\u{2cac}', ['\u{2cad}', '\u{0}', '\u{0}']), ('\u{2cae}', ['\u{2caf}', '\u{0}', '\u{0}']), + ('\u{2cb0}', ['\u{2cb1}', '\u{0}', '\u{0}']), ('\u{2cb2}', ['\u{2cb3}', '\u{0}', '\u{0}']), + ('\u{2cb4}', ['\u{2cb5}', '\u{0}', '\u{0}']), ('\u{2cb6}', ['\u{2cb7}', '\u{0}', '\u{0}']), + ('\u{2cb8}', ['\u{2cb9}', '\u{0}', '\u{0}']), ('\u{2cba}', ['\u{2cbb}', '\u{0}', '\u{0}']), + ('\u{2cbc}', ['\u{2cbd}', '\u{0}', '\u{0}']), ('\u{2cbe}', ['\u{2cbf}', '\u{0}', '\u{0}']), + ('\u{2cc0}', ['\u{2cc1}', '\u{0}', '\u{0}']), ('\u{2cc2}', ['\u{2cc3}', '\u{0}', '\u{0}']), + ('\u{2cc4}', ['\u{2cc5}', '\u{0}', '\u{0}']), ('\u{2cc6}', ['\u{2cc7}', '\u{0}', '\u{0}']), + ('\u{2cc8}', ['\u{2cc9}', '\u{0}', '\u{0}']), ('\u{2cca}', ['\u{2ccb}', '\u{0}', '\u{0}']), + ('\u{2ccc}', ['\u{2ccd}', '\u{0}', '\u{0}']), ('\u{2cce}', ['\u{2ccf}', '\u{0}', '\u{0}']), + ('\u{2cd0}', ['\u{2cd1}', '\u{0}', '\u{0}']), ('\u{2cd2}', ['\u{2cd3}', '\u{0}', '\u{0}']), + ('\u{2cd4}', ['\u{2cd5}', '\u{0}', '\u{0}']), ('\u{2cd6}', ['\u{2cd7}', '\u{0}', '\u{0}']), + ('\u{2cd8}', ['\u{2cd9}', '\u{0}', '\u{0}']), ('\u{2cda}', ['\u{2cdb}', '\u{0}', '\u{0}']), + ('\u{2cdc}', ['\u{2cdd}', '\u{0}', '\u{0}']), ('\u{2cde}', ['\u{2cdf}', '\u{0}', '\u{0}']), + ('\u{2ce0}', ['\u{2ce1}', '\u{0}', '\u{0}']), ('\u{2ce2}', ['\u{2ce3}', '\u{0}', '\u{0}']), + ('\u{2ceb}', ['\u{2cec}', '\u{0}', '\u{0}']), ('\u{2ced}', ['\u{2cee}', '\u{0}', '\u{0}']), + ('\u{2cf2}', ['\u{2cf3}', '\u{0}', '\u{0}']), ('\u{a640}', ['\u{a641}', '\u{0}', '\u{0}']), + ('\u{a642}', ['\u{a643}', '\u{0}', '\u{0}']), ('\u{a644}', ['\u{a645}', '\u{0}', '\u{0}']), + ('\u{a646}', ['\u{a647}', '\u{0}', '\u{0}']), ('\u{a648}', ['\u{a649}', '\u{0}', '\u{0}']), + ('\u{a64a}', ['\u{a64b}', '\u{0}', '\u{0}']), ('\u{a64c}', ['\u{a64d}', '\u{0}', '\u{0}']), + ('\u{a64e}', ['\u{a64f}', '\u{0}', '\u{0}']), ('\u{a650}', ['\u{a651}', '\u{0}', '\u{0}']), + ('\u{a652}', ['\u{a653}', '\u{0}', '\u{0}']), ('\u{a654}', ['\u{a655}', '\u{0}', '\u{0}']), + ('\u{a656}', ['\u{a657}', '\u{0}', '\u{0}']), ('\u{a658}', ['\u{a659}', '\u{0}', '\u{0}']), + ('\u{a65a}', ['\u{a65b}', '\u{0}', '\u{0}']), ('\u{a65c}', ['\u{a65d}', '\u{0}', '\u{0}']), + ('\u{a65e}', ['\u{a65f}', '\u{0}', '\u{0}']), ('\u{a660}', ['\u{a661}', '\u{0}', '\u{0}']), + ('\u{a662}', ['\u{a663}', '\u{0}', '\u{0}']), ('\u{a664}', ['\u{a665}', '\u{0}', '\u{0}']), + ('\u{a666}', ['\u{a667}', '\u{0}', '\u{0}']), ('\u{a668}', ['\u{a669}', '\u{0}', '\u{0}']), + ('\u{a66a}', ['\u{a66b}', '\u{0}', '\u{0}']), ('\u{a66c}', ['\u{a66d}', '\u{0}', '\u{0}']), + ('\u{a680}', ['\u{a681}', '\u{0}', '\u{0}']), ('\u{a682}', ['\u{a683}', '\u{0}', '\u{0}']), + ('\u{a684}', ['\u{a685}', '\u{0}', '\u{0}']), ('\u{a686}', ['\u{a687}', '\u{0}', '\u{0}']), + ('\u{a688}', ['\u{a689}', '\u{0}', '\u{0}']), ('\u{a68a}', ['\u{a68b}', '\u{0}', '\u{0}']), + ('\u{a68c}', ['\u{a68d}', '\u{0}', '\u{0}']), ('\u{a68e}', ['\u{a68f}', '\u{0}', '\u{0}']), + ('\u{a690}', ['\u{a691}', '\u{0}', '\u{0}']), ('\u{a692}', ['\u{a693}', '\u{0}', '\u{0}']), + ('\u{a694}', ['\u{a695}', '\u{0}', '\u{0}']), ('\u{a696}', ['\u{a697}', '\u{0}', '\u{0}']), + ('\u{a698}', ['\u{a699}', '\u{0}', '\u{0}']), ('\u{a69a}', ['\u{a69b}', '\u{0}', '\u{0}']), + ('\u{a722}', ['\u{a723}', '\u{0}', '\u{0}']), ('\u{a724}', ['\u{a725}', '\u{0}', '\u{0}']), + ('\u{a726}', ['\u{a727}', '\u{0}', '\u{0}']), ('\u{a728}', ['\u{a729}', '\u{0}', '\u{0}']), + ('\u{a72a}', ['\u{a72b}', '\u{0}', '\u{0}']), ('\u{a72c}', ['\u{a72d}', '\u{0}', '\u{0}']), + ('\u{a72e}', ['\u{a72f}', '\u{0}', '\u{0}']), ('\u{a732}', ['\u{a733}', '\u{0}', '\u{0}']), + ('\u{a734}', ['\u{a735}', '\u{0}', '\u{0}']), ('\u{a736}', ['\u{a737}', '\u{0}', '\u{0}']), + ('\u{a738}', ['\u{a739}', '\u{0}', '\u{0}']), ('\u{a73a}', ['\u{a73b}', '\u{0}', '\u{0}']), + ('\u{a73c}', ['\u{a73d}', '\u{0}', '\u{0}']), ('\u{a73e}', ['\u{a73f}', '\u{0}', '\u{0}']), + ('\u{a740}', ['\u{a741}', '\u{0}', '\u{0}']), ('\u{a742}', ['\u{a743}', '\u{0}', '\u{0}']), + ('\u{a744}', ['\u{a745}', '\u{0}', '\u{0}']), ('\u{a746}', ['\u{a747}', '\u{0}', '\u{0}']), + ('\u{a748}', ['\u{a749}', '\u{0}', '\u{0}']), ('\u{a74a}', ['\u{a74b}', '\u{0}', '\u{0}']), + ('\u{a74c}', ['\u{a74d}', '\u{0}', '\u{0}']), ('\u{a74e}', ['\u{a74f}', '\u{0}', '\u{0}']), + ('\u{a750}', ['\u{a751}', '\u{0}', '\u{0}']), ('\u{a752}', ['\u{a753}', '\u{0}', '\u{0}']), + ('\u{a754}', ['\u{a755}', '\u{0}', '\u{0}']), ('\u{a756}', ['\u{a757}', '\u{0}', '\u{0}']), + ('\u{a758}', ['\u{a759}', '\u{0}', '\u{0}']), ('\u{a75a}', ['\u{a75b}', '\u{0}', '\u{0}']), + ('\u{a75c}', ['\u{a75d}', '\u{0}', '\u{0}']), ('\u{a75e}', ['\u{a75f}', '\u{0}', '\u{0}']), + ('\u{a760}', ['\u{a761}', '\u{0}', '\u{0}']), ('\u{a762}', ['\u{a763}', '\u{0}', '\u{0}']), + ('\u{a764}', ['\u{a765}', '\u{0}', '\u{0}']), ('\u{a766}', ['\u{a767}', '\u{0}', '\u{0}']), + ('\u{a768}', ['\u{a769}', '\u{0}', '\u{0}']), ('\u{a76a}', ['\u{a76b}', '\u{0}', '\u{0}']), + ('\u{a76c}', ['\u{a76d}', '\u{0}', '\u{0}']), ('\u{a76e}', ['\u{a76f}', '\u{0}', '\u{0}']), + ('\u{a779}', ['\u{a77a}', '\u{0}', '\u{0}']), ('\u{a77b}', ['\u{a77c}', '\u{0}', '\u{0}']), + ('\u{a77d}', ['\u{1d79}', '\u{0}', '\u{0}']), ('\u{a77e}', ['\u{a77f}', '\u{0}', '\u{0}']), + ('\u{a780}', ['\u{a781}', '\u{0}', '\u{0}']), ('\u{a782}', ['\u{a783}', '\u{0}', '\u{0}']), + ('\u{a784}', ['\u{a785}', '\u{0}', '\u{0}']), ('\u{a786}', ['\u{a787}', '\u{0}', '\u{0}']), + ('\u{a78b}', ['\u{a78c}', '\u{0}', '\u{0}']), ('\u{a78d}', ['\u{265}', '\u{0}', '\u{0}']), + ('\u{a790}', ['\u{a791}', '\u{0}', '\u{0}']), ('\u{a792}', ['\u{a793}', '\u{0}', '\u{0}']), + ('\u{a796}', ['\u{a797}', '\u{0}', '\u{0}']), ('\u{a798}', ['\u{a799}', '\u{0}', '\u{0}']), + ('\u{a79a}', ['\u{a79b}', '\u{0}', '\u{0}']), ('\u{a79c}', ['\u{a79d}', '\u{0}', '\u{0}']), + ('\u{a79e}', ['\u{a79f}', '\u{0}', '\u{0}']), ('\u{a7a0}', ['\u{a7a1}', '\u{0}', '\u{0}']), + ('\u{a7a2}', ['\u{a7a3}', '\u{0}', '\u{0}']), ('\u{a7a4}', ['\u{a7a5}', '\u{0}', '\u{0}']), + ('\u{a7a6}', ['\u{a7a7}', '\u{0}', '\u{0}']), ('\u{a7a8}', ['\u{a7a9}', '\u{0}', '\u{0}']), + ('\u{a7aa}', ['\u{266}', '\u{0}', '\u{0}']), ('\u{a7ab}', ['\u{25c}', '\u{0}', '\u{0}']), + ('\u{a7ac}', ['\u{261}', '\u{0}', '\u{0}']), ('\u{a7ad}', ['\u{26c}', '\u{0}', '\u{0}']), + ('\u{a7ae}', ['\u{26a}', '\u{0}', '\u{0}']), ('\u{a7b0}', ['\u{29e}', '\u{0}', '\u{0}']), + ('\u{a7b1}', ['\u{287}', '\u{0}', '\u{0}']), ('\u{a7b2}', ['\u{29d}', '\u{0}', '\u{0}']), + ('\u{a7b3}', ['\u{ab53}', '\u{0}', '\u{0}']), ('\u{a7b4}', ['\u{a7b5}', '\u{0}', '\u{0}']), + ('\u{a7b6}', ['\u{a7b7}', '\u{0}', '\u{0}']), ('\u{a7b8}', ['\u{a7b9}', '\u{0}', '\u{0}']), + ('\u{a7ba}', ['\u{a7bb}', '\u{0}', '\u{0}']), ('\u{a7bc}', ['\u{a7bd}', '\u{0}', '\u{0}']), + ('\u{a7be}', ['\u{a7bf}', '\u{0}', '\u{0}']), ('\u{a7c2}', ['\u{a7c3}', '\u{0}', '\u{0}']), + ('\u{a7c4}', ['\u{a794}', '\u{0}', '\u{0}']), ('\u{a7c5}', ['\u{282}', '\u{0}', '\u{0}']), + ('\u{a7c6}', ['\u{1d8e}', '\u{0}', '\u{0}']), ('\u{ff21}', ['\u{ff41}', '\u{0}', '\u{0}']), + ('\u{ff22}', ['\u{ff42}', '\u{0}', '\u{0}']), ('\u{ff23}', ['\u{ff43}', '\u{0}', '\u{0}']), + ('\u{ff24}', ['\u{ff44}', '\u{0}', '\u{0}']), ('\u{ff25}', ['\u{ff45}', '\u{0}', '\u{0}']), + ('\u{ff26}', ['\u{ff46}', '\u{0}', '\u{0}']), ('\u{ff27}', ['\u{ff47}', '\u{0}', '\u{0}']), + ('\u{ff28}', ['\u{ff48}', '\u{0}', '\u{0}']), ('\u{ff29}', ['\u{ff49}', '\u{0}', '\u{0}']), + ('\u{ff2a}', ['\u{ff4a}', '\u{0}', '\u{0}']), ('\u{ff2b}', ['\u{ff4b}', '\u{0}', '\u{0}']), + ('\u{ff2c}', ['\u{ff4c}', '\u{0}', '\u{0}']), ('\u{ff2d}', ['\u{ff4d}', '\u{0}', '\u{0}']), + ('\u{ff2e}', ['\u{ff4e}', '\u{0}', '\u{0}']), ('\u{ff2f}', ['\u{ff4f}', '\u{0}', '\u{0}']), + ('\u{ff30}', ['\u{ff50}', '\u{0}', '\u{0}']), ('\u{ff31}', ['\u{ff51}', '\u{0}', '\u{0}']), + ('\u{ff32}', ['\u{ff52}', '\u{0}', '\u{0}']), ('\u{ff33}', ['\u{ff53}', '\u{0}', '\u{0}']), + ('\u{ff34}', ['\u{ff54}', '\u{0}', '\u{0}']), ('\u{ff35}', ['\u{ff55}', '\u{0}', '\u{0}']), + ('\u{ff36}', ['\u{ff56}', '\u{0}', '\u{0}']), ('\u{ff37}', ['\u{ff57}', '\u{0}', '\u{0}']), + ('\u{ff38}', ['\u{ff58}', '\u{0}', '\u{0}']), ('\u{ff39}', ['\u{ff59}', '\u{0}', '\u{0}']), + ('\u{ff3a}', ['\u{ff5a}', '\u{0}', '\u{0}']), + ('\u{10400}', ['\u{10428}', '\u{0}', '\u{0}']), + ('\u{10401}', ['\u{10429}', '\u{0}', '\u{0}']), + ('\u{10402}', ['\u{1042a}', '\u{0}', '\u{0}']), + ('\u{10403}', ['\u{1042b}', '\u{0}', '\u{0}']), + ('\u{10404}', ['\u{1042c}', '\u{0}', '\u{0}']), + ('\u{10405}', ['\u{1042d}', '\u{0}', '\u{0}']), + ('\u{10406}', ['\u{1042e}', '\u{0}', '\u{0}']), + ('\u{10407}', ['\u{1042f}', '\u{0}', '\u{0}']), + ('\u{10408}', ['\u{10430}', '\u{0}', '\u{0}']), + ('\u{10409}', ['\u{10431}', '\u{0}', '\u{0}']), + ('\u{1040a}', ['\u{10432}', '\u{0}', '\u{0}']), + ('\u{1040b}', ['\u{10433}', '\u{0}', '\u{0}']), + ('\u{1040c}', ['\u{10434}', '\u{0}', '\u{0}']), + ('\u{1040d}', ['\u{10435}', '\u{0}', '\u{0}']), + ('\u{1040e}', ['\u{10436}', '\u{0}', '\u{0}']), + ('\u{1040f}', ['\u{10437}', '\u{0}', '\u{0}']), + ('\u{10410}', ['\u{10438}', '\u{0}', '\u{0}']), + ('\u{10411}', ['\u{10439}', '\u{0}', '\u{0}']), + ('\u{10412}', ['\u{1043a}', '\u{0}', '\u{0}']), + ('\u{10413}', ['\u{1043b}', '\u{0}', '\u{0}']), + ('\u{10414}', ['\u{1043c}', '\u{0}', '\u{0}']), + ('\u{10415}', ['\u{1043d}', '\u{0}', '\u{0}']), + ('\u{10416}', ['\u{1043e}', '\u{0}', '\u{0}']), + ('\u{10417}', ['\u{1043f}', '\u{0}', '\u{0}']), + ('\u{10418}', ['\u{10440}', '\u{0}', '\u{0}']), + ('\u{10419}', ['\u{10441}', '\u{0}', '\u{0}']), + ('\u{1041a}', ['\u{10442}', '\u{0}', '\u{0}']), + ('\u{1041b}', ['\u{10443}', '\u{0}', '\u{0}']), + ('\u{1041c}', ['\u{10444}', '\u{0}', '\u{0}']), + ('\u{1041d}', ['\u{10445}', '\u{0}', '\u{0}']), + ('\u{1041e}', ['\u{10446}', '\u{0}', '\u{0}']), + ('\u{1041f}', ['\u{10447}', '\u{0}', '\u{0}']), + ('\u{10420}', ['\u{10448}', '\u{0}', '\u{0}']), + ('\u{10421}', ['\u{10449}', '\u{0}', '\u{0}']), + ('\u{10422}', ['\u{1044a}', '\u{0}', '\u{0}']), + ('\u{10423}', ['\u{1044b}', '\u{0}', '\u{0}']), + ('\u{10424}', ['\u{1044c}', '\u{0}', '\u{0}']), + ('\u{10425}', ['\u{1044d}', '\u{0}', '\u{0}']), + ('\u{10426}', ['\u{1044e}', '\u{0}', '\u{0}']), + ('\u{10427}', ['\u{1044f}', '\u{0}', '\u{0}']), + ('\u{104b0}', ['\u{104d8}', '\u{0}', '\u{0}']), + ('\u{104b1}', ['\u{104d9}', '\u{0}', '\u{0}']), + ('\u{104b2}', ['\u{104da}', '\u{0}', '\u{0}']), + ('\u{104b3}', ['\u{104db}', '\u{0}', '\u{0}']), + ('\u{104b4}', ['\u{104dc}', '\u{0}', '\u{0}']), + ('\u{104b5}', ['\u{104dd}', '\u{0}', '\u{0}']), + ('\u{104b6}', ['\u{104de}', '\u{0}', '\u{0}']), + ('\u{104b7}', ['\u{104df}', '\u{0}', '\u{0}']), + ('\u{104b8}', ['\u{104e0}', '\u{0}', '\u{0}']), + ('\u{104b9}', ['\u{104e1}', '\u{0}', '\u{0}']), + ('\u{104ba}', ['\u{104e2}', '\u{0}', '\u{0}']), + ('\u{104bb}', ['\u{104e3}', '\u{0}', '\u{0}']), + ('\u{104bc}', ['\u{104e4}', '\u{0}', '\u{0}']), + ('\u{104bd}', ['\u{104e5}', '\u{0}', '\u{0}']), + ('\u{104be}', ['\u{104e6}', '\u{0}', '\u{0}']), + ('\u{104bf}', ['\u{104e7}', '\u{0}', '\u{0}']), + ('\u{104c0}', ['\u{104e8}', '\u{0}', '\u{0}']), + ('\u{104c1}', ['\u{104e9}', '\u{0}', '\u{0}']), + ('\u{104c2}', ['\u{104ea}', '\u{0}', '\u{0}']), + ('\u{104c3}', ['\u{104eb}', '\u{0}', '\u{0}']), + ('\u{104c4}', ['\u{104ec}', '\u{0}', '\u{0}']), + ('\u{104c5}', ['\u{104ed}', '\u{0}', '\u{0}']), + ('\u{104c6}', ['\u{104ee}', '\u{0}', '\u{0}']), + ('\u{104c7}', ['\u{104ef}', '\u{0}', '\u{0}']), + ('\u{104c8}', ['\u{104f0}', '\u{0}', '\u{0}']), + ('\u{104c9}', ['\u{104f1}', '\u{0}', '\u{0}']), + ('\u{104ca}', ['\u{104f2}', '\u{0}', '\u{0}']), + ('\u{104cb}', ['\u{104f3}', '\u{0}', '\u{0}']), + ('\u{104cc}', ['\u{104f4}', '\u{0}', '\u{0}']), + ('\u{104cd}', ['\u{104f5}', '\u{0}', '\u{0}']), + ('\u{104ce}', ['\u{104f6}', '\u{0}', '\u{0}']), + ('\u{104cf}', ['\u{104f7}', '\u{0}', '\u{0}']), + ('\u{104d0}', ['\u{104f8}', '\u{0}', '\u{0}']), + ('\u{104d1}', ['\u{104f9}', '\u{0}', '\u{0}']), + ('\u{104d2}', ['\u{104fa}', '\u{0}', '\u{0}']), + ('\u{104d3}', ['\u{104fb}', '\u{0}', '\u{0}']), + ('\u{10c80}', ['\u{10cc0}', '\u{0}', '\u{0}']), + ('\u{10c81}', ['\u{10cc1}', '\u{0}', '\u{0}']), + ('\u{10c82}', ['\u{10cc2}', '\u{0}', '\u{0}']), + ('\u{10c83}', ['\u{10cc3}', '\u{0}', '\u{0}']), + ('\u{10c84}', ['\u{10cc4}', '\u{0}', '\u{0}']), + ('\u{10c85}', ['\u{10cc5}', '\u{0}', '\u{0}']), + ('\u{10c86}', ['\u{10cc6}', '\u{0}', '\u{0}']), + ('\u{10c87}', ['\u{10cc7}', '\u{0}', '\u{0}']), + ('\u{10c88}', ['\u{10cc8}', '\u{0}', '\u{0}']), + ('\u{10c89}', ['\u{10cc9}', '\u{0}', '\u{0}']), + ('\u{10c8a}', ['\u{10cca}', '\u{0}', '\u{0}']), + ('\u{10c8b}', ['\u{10ccb}', '\u{0}', '\u{0}']), + ('\u{10c8c}', ['\u{10ccc}', '\u{0}', '\u{0}']), + ('\u{10c8d}', ['\u{10ccd}', '\u{0}', '\u{0}']), + ('\u{10c8e}', ['\u{10cce}', '\u{0}', '\u{0}']), + ('\u{10c8f}', ['\u{10ccf}', '\u{0}', '\u{0}']), + ('\u{10c90}', ['\u{10cd0}', '\u{0}', '\u{0}']), + ('\u{10c91}', ['\u{10cd1}', '\u{0}', '\u{0}']), + ('\u{10c92}', ['\u{10cd2}', '\u{0}', '\u{0}']), + ('\u{10c93}', ['\u{10cd3}', '\u{0}', '\u{0}']), + ('\u{10c94}', ['\u{10cd4}', '\u{0}', '\u{0}']), + ('\u{10c95}', ['\u{10cd5}', '\u{0}', '\u{0}']), + ('\u{10c96}', ['\u{10cd6}', '\u{0}', '\u{0}']), + ('\u{10c97}', ['\u{10cd7}', '\u{0}', '\u{0}']), + ('\u{10c98}', ['\u{10cd8}', '\u{0}', '\u{0}']), + ('\u{10c99}', ['\u{10cd9}', '\u{0}', '\u{0}']), + ('\u{10c9a}', ['\u{10cda}', '\u{0}', '\u{0}']), + ('\u{10c9b}', ['\u{10cdb}', '\u{0}', '\u{0}']), + ('\u{10c9c}', ['\u{10cdc}', '\u{0}', '\u{0}']), + ('\u{10c9d}', ['\u{10cdd}', '\u{0}', '\u{0}']), + ('\u{10c9e}', ['\u{10cde}', '\u{0}', '\u{0}']), + ('\u{10c9f}', ['\u{10cdf}', '\u{0}', '\u{0}']), + ('\u{10ca0}', ['\u{10ce0}', '\u{0}', '\u{0}']), + ('\u{10ca1}', ['\u{10ce1}', '\u{0}', '\u{0}']), + ('\u{10ca2}', ['\u{10ce2}', '\u{0}', '\u{0}']), + ('\u{10ca3}', ['\u{10ce3}', '\u{0}', '\u{0}']), + ('\u{10ca4}', ['\u{10ce4}', '\u{0}', '\u{0}']), + ('\u{10ca5}', ['\u{10ce5}', '\u{0}', '\u{0}']), + ('\u{10ca6}', ['\u{10ce6}', '\u{0}', '\u{0}']), + ('\u{10ca7}', ['\u{10ce7}', '\u{0}', '\u{0}']), + ('\u{10ca8}', ['\u{10ce8}', '\u{0}', '\u{0}']), + ('\u{10ca9}', ['\u{10ce9}', '\u{0}', '\u{0}']), + ('\u{10caa}', ['\u{10cea}', '\u{0}', '\u{0}']), + ('\u{10cab}', ['\u{10ceb}', '\u{0}', '\u{0}']), + ('\u{10cac}', ['\u{10cec}', '\u{0}', '\u{0}']), + ('\u{10cad}', ['\u{10ced}', '\u{0}', '\u{0}']), + ('\u{10cae}', ['\u{10cee}', '\u{0}', '\u{0}']), + ('\u{10caf}', ['\u{10cef}', '\u{0}', '\u{0}']), + ('\u{10cb0}', ['\u{10cf0}', '\u{0}', '\u{0}']), + ('\u{10cb1}', ['\u{10cf1}', '\u{0}', '\u{0}']), + ('\u{10cb2}', ['\u{10cf2}', '\u{0}', '\u{0}']), + ('\u{118a0}', ['\u{118c0}', '\u{0}', '\u{0}']), + ('\u{118a1}', ['\u{118c1}', '\u{0}', '\u{0}']), + ('\u{118a2}', ['\u{118c2}', '\u{0}', '\u{0}']), + ('\u{118a3}', ['\u{118c3}', '\u{0}', '\u{0}']), + ('\u{118a4}', ['\u{118c4}', '\u{0}', '\u{0}']), + ('\u{118a5}', ['\u{118c5}', '\u{0}', '\u{0}']), + ('\u{118a6}', ['\u{118c6}', '\u{0}', '\u{0}']), + ('\u{118a7}', ['\u{118c7}', '\u{0}', '\u{0}']), + ('\u{118a8}', ['\u{118c8}', '\u{0}', '\u{0}']), + ('\u{118a9}', ['\u{118c9}', '\u{0}', '\u{0}']), + ('\u{118aa}', ['\u{118ca}', '\u{0}', '\u{0}']), + ('\u{118ab}', ['\u{118cb}', '\u{0}', '\u{0}']), + ('\u{118ac}', ['\u{118cc}', '\u{0}', '\u{0}']), + ('\u{118ad}', ['\u{118cd}', '\u{0}', '\u{0}']), + ('\u{118ae}', ['\u{118ce}', '\u{0}', '\u{0}']), + ('\u{118af}', ['\u{118cf}', '\u{0}', '\u{0}']), + ('\u{118b0}', ['\u{118d0}', '\u{0}', '\u{0}']), + ('\u{118b1}', ['\u{118d1}', '\u{0}', '\u{0}']), + ('\u{118b2}', ['\u{118d2}', '\u{0}', '\u{0}']), + ('\u{118b3}', ['\u{118d3}', '\u{0}', '\u{0}']), + ('\u{118b4}', ['\u{118d4}', '\u{0}', '\u{0}']), + ('\u{118b5}', ['\u{118d5}', '\u{0}', '\u{0}']), + ('\u{118b6}', ['\u{118d6}', '\u{0}', '\u{0}']), + ('\u{118b7}', ['\u{118d7}', '\u{0}', '\u{0}']), + ('\u{118b8}', ['\u{118d8}', '\u{0}', '\u{0}']), + ('\u{118b9}', ['\u{118d9}', '\u{0}', '\u{0}']), + ('\u{118ba}', ['\u{118da}', '\u{0}', '\u{0}']), + ('\u{118bb}', ['\u{118db}', '\u{0}', '\u{0}']), + ('\u{118bc}', ['\u{118dc}', '\u{0}', '\u{0}']), + ('\u{118bd}', ['\u{118dd}', '\u{0}', '\u{0}']), + ('\u{118be}', ['\u{118de}', '\u{0}', '\u{0}']), + ('\u{118bf}', ['\u{118df}', '\u{0}', '\u{0}']), + ('\u{16e40}', ['\u{16e60}', '\u{0}', '\u{0}']), + ('\u{16e41}', ['\u{16e61}', '\u{0}', '\u{0}']), + ('\u{16e42}', ['\u{16e62}', '\u{0}', '\u{0}']), + ('\u{16e43}', ['\u{16e63}', '\u{0}', '\u{0}']), + ('\u{16e44}', ['\u{16e64}', '\u{0}', '\u{0}']), + ('\u{16e45}', ['\u{16e65}', '\u{0}', '\u{0}']), + ('\u{16e46}', ['\u{16e66}', '\u{0}', '\u{0}']), + ('\u{16e47}', ['\u{16e67}', '\u{0}', '\u{0}']), + ('\u{16e48}', ['\u{16e68}', '\u{0}', '\u{0}']), + ('\u{16e49}', ['\u{16e69}', '\u{0}', '\u{0}']), + ('\u{16e4a}', ['\u{16e6a}', '\u{0}', '\u{0}']), + ('\u{16e4b}', ['\u{16e6b}', '\u{0}', '\u{0}']), + ('\u{16e4c}', ['\u{16e6c}', '\u{0}', '\u{0}']), + ('\u{16e4d}', ['\u{16e6d}', '\u{0}', '\u{0}']), + ('\u{16e4e}', ['\u{16e6e}', '\u{0}', '\u{0}']), + ('\u{16e4f}', ['\u{16e6f}', '\u{0}', '\u{0}']), + ('\u{16e50}', ['\u{16e70}', '\u{0}', '\u{0}']), + ('\u{16e51}', ['\u{16e71}', '\u{0}', '\u{0}']), + ('\u{16e52}', ['\u{16e72}', '\u{0}', '\u{0}']), + ('\u{16e53}', ['\u{16e73}', '\u{0}', '\u{0}']), + ('\u{16e54}', ['\u{16e74}', '\u{0}', '\u{0}']), + ('\u{16e55}', ['\u{16e75}', '\u{0}', '\u{0}']), + ('\u{16e56}', ['\u{16e76}', '\u{0}', '\u{0}']), + ('\u{16e57}', ['\u{16e77}', '\u{0}', '\u{0}']), + ('\u{16e58}', ['\u{16e78}', '\u{0}', '\u{0}']), + ('\u{16e59}', ['\u{16e79}', '\u{0}', '\u{0}']), + ('\u{16e5a}', ['\u{16e7a}', '\u{0}', '\u{0}']), + ('\u{16e5b}', ['\u{16e7b}', '\u{0}', '\u{0}']), + ('\u{16e5c}', ['\u{16e7c}', '\u{0}', '\u{0}']), + ('\u{16e5d}', ['\u{16e7d}', '\u{0}', '\u{0}']), + ('\u{16e5e}', ['\u{16e7e}', '\u{0}', '\u{0}']), + ('\u{16e5f}', ['\u{16e7f}', '\u{0}', '\u{0}']), + ('\u{1e900}', ['\u{1e922}', '\u{0}', '\u{0}']), + ('\u{1e901}', ['\u{1e923}', '\u{0}', '\u{0}']), + ('\u{1e902}', ['\u{1e924}', '\u{0}', '\u{0}']), + ('\u{1e903}', ['\u{1e925}', '\u{0}', '\u{0}']), + ('\u{1e904}', ['\u{1e926}', '\u{0}', '\u{0}']), + ('\u{1e905}', ['\u{1e927}', '\u{0}', '\u{0}']), + ('\u{1e906}', ['\u{1e928}', '\u{0}', '\u{0}']), + ('\u{1e907}', ['\u{1e929}', '\u{0}', '\u{0}']), + ('\u{1e908}', ['\u{1e92a}', '\u{0}', '\u{0}']), + ('\u{1e909}', ['\u{1e92b}', '\u{0}', '\u{0}']), + ('\u{1e90a}', ['\u{1e92c}', '\u{0}', '\u{0}']), + ('\u{1e90b}', ['\u{1e92d}', '\u{0}', '\u{0}']), + ('\u{1e90c}', ['\u{1e92e}', '\u{0}', '\u{0}']), + ('\u{1e90d}', ['\u{1e92f}', '\u{0}', '\u{0}']), + ('\u{1e90e}', ['\u{1e930}', '\u{0}', '\u{0}']), + ('\u{1e90f}', ['\u{1e931}', '\u{0}', '\u{0}']), + ('\u{1e910}', ['\u{1e932}', '\u{0}', '\u{0}']), + ('\u{1e911}', ['\u{1e933}', '\u{0}', '\u{0}']), + ('\u{1e912}', ['\u{1e934}', '\u{0}', '\u{0}']), + ('\u{1e913}', ['\u{1e935}', '\u{0}', '\u{0}']), + ('\u{1e914}', ['\u{1e936}', '\u{0}', '\u{0}']), + ('\u{1e915}', ['\u{1e937}', '\u{0}', '\u{0}']), + ('\u{1e916}', ['\u{1e938}', '\u{0}', '\u{0}']), + ('\u{1e917}', ['\u{1e939}', '\u{0}', '\u{0}']), + ('\u{1e918}', ['\u{1e93a}', '\u{0}', '\u{0}']), + ('\u{1e919}', ['\u{1e93b}', '\u{0}', '\u{0}']), + ('\u{1e91a}', ['\u{1e93c}', '\u{0}', '\u{0}']), + ('\u{1e91b}', ['\u{1e93d}', '\u{0}', '\u{0}']), + ('\u{1e91c}', ['\u{1e93e}', '\u{0}', '\u{0}']), + ('\u{1e91d}', ['\u{1e93f}', '\u{0}', '\u{0}']), + ('\u{1e91e}', ['\u{1e940}', '\u{0}', '\u{0}']), + ('\u{1e91f}', ['\u{1e941}', '\u{0}', '\u{0}']), + ('\u{1e920}', ['\u{1e942}', '\u{0}', '\u{0}']), + ('\u{1e921}', ['\u{1e943}', '\u{0}', '\u{0}']), + ]; + + static UPPERCASE_TABLE: &[(char, [char; 3])] = &[ + ('a', ['A', '\u{0}', '\u{0}']), ('b', ['B', '\u{0}', '\u{0}']), + ('c', ['C', '\u{0}', '\u{0}']), ('d', ['D', '\u{0}', '\u{0}']), + ('e', ['E', '\u{0}', '\u{0}']), ('f', ['F', '\u{0}', '\u{0}']), + ('g', ['G', '\u{0}', '\u{0}']), ('h', ['H', '\u{0}', '\u{0}']), + ('i', ['I', '\u{0}', '\u{0}']), ('j', ['J', '\u{0}', '\u{0}']), + ('k', ['K', '\u{0}', '\u{0}']), ('l', ['L', '\u{0}', '\u{0}']), + ('m', ['M', '\u{0}', '\u{0}']), ('n', ['N', '\u{0}', '\u{0}']), + ('o', ['O', '\u{0}', '\u{0}']), ('p', ['P', '\u{0}', '\u{0}']), + ('q', ['Q', '\u{0}', '\u{0}']), ('r', ['R', '\u{0}', '\u{0}']), + ('s', ['S', '\u{0}', '\u{0}']), ('t', ['T', '\u{0}', '\u{0}']), + ('u', ['U', '\u{0}', '\u{0}']), ('v', ['V', '\u{0}', '\u{0}']), + ('w', ['W', '\u{0}', '\u{0}']), ('x', ['X', '\u{0}', '\u{0}']), + ('y', ['Y', '\u{0}', '\u{0}']), ('z', ['Z', '\u{0}', '\u{0}']), + ('\u{b5}', ['\u{39c}', '\u{0}', '\u{0}']), ('\u{df}', ['S', 'S', '\u{0}']), + ('\u{e0}', ['\u{c0}', '\u{0}', '\u{0}']), ('\u{e1}', ['\u{c1}', '\u{0}', '\u{0}']), + ('\u{e2}', ['\u{c2}', '\u{0}', '\u{0}']), ('\u{e3}', ['\u{c3}', '\u{0}', '\u{0}']), + ('\u{e4}', ['\u{c4}', '\u{0}', '\u{0}']), ('\u{e5}', ['\u{c5}', '\u{0}', '\u{0}']), + ('\u{e6}', ['\u{c6}', '\u{0}', '\u{0}']), ('\u{e7}', ['\u{c7}', '\u{0}', '\u{0}']), + ('\u{e8}', ['\u{c8}', '\u{0}', '\u{0}']), ('\u{e9}', ['\u{c9}', '\u{0}', '\u{0}']), + ('\u{ea}', ['\u{ca}', '\u{0}', '\u{0}']), ('\u{eb}', ['\u{cb}', '\u{0}', '\u{0}']), + ('\u{ec}', ['\u{cc}', '\u{0}', '\u{0}']), ('\u{ed}', ['\u{cd}', '\u{0}', '\u{0}']), + ('\u{ee}', ['\u{ce}', '\u{0}', '\u{0}']), ('\u{ef}', ['\u{cf}', '\u{0}', '\u{0}']), + ('\u{f0}', ['\u{d0}', '\u{0}', '\u{0}']), ('\u{f1}', ['\u{d1}', '\u{0}', '\u{0}']), + ('\u{f2}', ['\u{d2}', '\u{0}', '\u{0}']), ('\u{f3}', ['\u{d3}', '\u{0}', '\u{0}']), + ('\u{f4}', ['\u{d4}', '\u{0}', '\u{0}']), ('\u{f5}', ['\u{d5}', '\u{0}', '\u{0}']), + ('\u{f6}', ['\u{d6}', '\u{0}', '\u{0}']), ('\u{f8}', ['\u{d8}', '\u{0}', '\u{0}']), + ('\u{f9}', ['\u{d9}', '\u{0}', '\u{0}']), ('\u{fa}', ['\u{da}', '\u{0}', '\u{0}']), + ('\u{fb}', ['\u{db}', '\u{0}', '\u{0}']), ('\u{fc}', ['\u{dc}', '\u{0}', '\u{0}']), + ('\u{fd}', ['\u{dd}', '\u{0}', '\u{0}']), ('\u{fe}', ['\u{de}', '\u{0}', '\u{0}']), + ('\u{ff}', ['\u{178}', '\u{0}', '\u{0}']), ('\u{101}', ['\u{100}', '\u{0}', '\u{0}']), + ('\u{103}', ['\u{102}', '\u{0}', '\u{0}']), ('\u{105}', ['\u{104}', '\u{0}', '\u{0}']), + ('\u{107}', ['\u{106}', '\u{0}', '\u{0}']), ('\u{109}', ['\u{108}', '\u{0}', '\u{0}']), + ('\u{10b}', ['\u{10a}', '\u{0}', '\u{0}']), ('\u{10d}', ['\u{10c}', '\u{0}', '\u{0}']), + ('\u{10f}', ['\u{10e}', '\u{0}', '\u{0}']), ('\u{111}', ['\u{110}', '\u{0}', '\u{0}']), + ('\u{113}', ['\u{112}', '\u{0}', '\u{0}']), ('\u{115}', ['\u{114}', '\u{0}', '\u{0}']), + ('\u{117}', ['\u{116}', '\u{0}', '\u{0}']), ('\u{119}', ['\u{118}', '\u{0}', '\u{0}']), + ('\u{11b}', ['\u{11a}', '\u{0}', '\u{0}']), ('\u{11d}', ['\u{11c}', '\u{0}', '\u{0}']), + ('\u{11f}', ['\u{11e}', '\u{0}', '\u{0}']), ('\u{121}', ['\u{120}', '\u{0}', '\u{0}']), + ('\u{123}', ['\u{122}', '\u{0}', '\u{0}']), ('\u{125}', ['\u{124}', '\u{0}', '\u{0}']), + ('\u{127}', ['\u{126}', '\u{0}', '\u{0}']), ('\u{129}', ['\u{128}', '\u{0}', '\u{0}']), + ('\u{12b}', ['\u{12a}', '\u{0}', '\u{0}']), ('\u{12d}', ['\u{12c}', '\u{0}', '\u{0}']), + ('\u{12f}', ['\u{12e}', '\u{0}', '\u{0}']), ('\u{131}', ['I', '\u{0}', '\u{0}']), + ('\u{133}', ['\u{132}', '\u{0}', '\u{0}']), ('\u{135}', ['\u{134}', '\u{0}', '\u{0}']), + ('\u{137}', ['\u{136}', '\u{0}', '\u{0}']), ('\u{13a}', ['\u{139}', '\u{0}', '\u{0}']), + ('\u{13c}', ['\u{13b}', '\u{0}', '\u{0}']), ('\u{13e}', ['\u{13d}', '\u{0}', '\u{0}']), + ('\u{140}', ['\u{13f}', '\u{0}', '\u{0}']), ('\u{142}', ['\u{141}', '\u{0}', '\u{0}']), + ('\u{144}', ['\u{143}', '\u{0}', '\u{0}']), ('\u{146}', ['\u{145}', '\u{0}', '\u{0}']), + ('\u{148}', ['\u{147}', '\u{0}', '\u{0}']), ('\u{149}', ['\u{2bc}', 'N', '\u{0}']), + ('\u{14b}', ['\u{14a}', '\u{0}', '\u{0}']), ('\u{14d}', ['\u{14c}', '\u{0}', '\u{0}']), + ('\u{14f}', ['\u{14e}', '\u{0}', '\u{0}']), ('\u{151}', ['\u{150}', '\u{0}', '\u{0}']), + ('\u{153}', ['\u{152}', '\u{0}', '\u{0}']), ('\u{155}', ['\u{154}', '\u{0}', '\u{0}']), + ('\u{157}', ['\u{156}', '\u{0}', '\u{0}']), ('\u{159}', ['\u{158}', '\u{0}', '\u{0}']), + ('\u{15b}', ['\u{15a}', '\u{0}', '\u{0}']), ('\u{15d}', ['\u{15c}', '\u{0}', '\u{0}']), + ('\u{15f}', ['\u{15e}', '\u{0}', '\u{0}']), ('\u{161}', ['\u{160}', '\u{0}', '\u{0}']), + ('\u{163}', ['\u{162}', '\u{0}', '\u{0}']), ('\u{165}', ['\u{164}', '\u{0}', '\u{0}']), + ('\u{167}', ['\u{166}', '\u{0}', '\u{0}']), ('\u{169}', ['\u{168}', '\u{0}', '\u{0}']), + ('\u{16b}', ['\u{16a}', '\u{0}', '\u{0}']), ('\u{16d}', ['\u{16c}', '\u{0}', '\u{0}']), + ('\u{16f}', ['\u{16e}', '\u{0}', '\u{0}']), ('\u{171}', ['\u{170}', '\u{0}', '\u{0}']), + ('\u{173}', ['\u{172}', '\u{0}', '\u{0}']), ('\u{175}', ['\u{174}', '\u{0}', '\u{0}']), + ('\u{177}', ['\u{176}', '\u{0}', '\u{0}']), ('\u{17a}', ['\u{179}', '\u{0}', '\u{0}']), + ('\u{17c}', ['\u{17b}', '\u{0}', '\u{0}']), ('\u{17e}', ['\u{17d}', '\u{0}', '\u{0}']), + ('\u{17f}', ['S', '\u{0}', '\u{0}']), ('\u{180}', ['\u{243}', '\u{0}', '\u{0}']), + ('\u{183}', ['\u{182}', '\u{0}', '\u{0}']), ('\u{185}', ['\u{184}', '\u{0}', '\u{0}']), + ('\u{188}', ['\u{187}', '\u{0}', '\u{0}']), ('\u{18c}', ['\u{18b}', '\u{0}', '\u{0}']), + ('\u{192}', ['\u{191}', '\u{0}', '\u{0}']), ('\u{195}', ['\u{1f6}', '\u{0}', '\u{0}']), + ('\u{199}', ['\u{198}', '\u{0}', '\u{0}']), ('\u{19a}', ['\u{23d}', '\u{0}', '\u{0}']), + ('\u{19e}', ['\u{220}', '\u{0}', '\u{0}']), ('\u{1a1}', ['\u{1a0}', '\u{0}', '\u{0}']), + ('\u{1a3}', ['\u{1a2}', '\u{0}', '\u{0}']), ('\u{1a5}', ['\u{1a4}', '\u{0}', '\u{0}']), + ('\u{1a8}', ['\u{1a7}', '\u{0}', '\u{0}']), ('\u{1ad}', ['\u{1ac}', '\u{0}', '\u{0}']), + ('\u{1b0}', ['\u{1af}', '\u{0}', '\u{0}']), ('\u{1b4}', ['\u{1b3}', '\u{0}', '\u{0}']), + ('\u{1b6}', ['\u{1b5}', '\u{0}', '\u{0}']), ('\u{1b9}', ['\u{1b8}', '\u{0}', '\u{0}']), + ('\u{1bd}', ['\u{1bc}', '\u{0}', '\u{0}']), ('\u{1bf}', ['\u{1f7}', '\u{0}', '\u{0}']), + ('\u{1c5}', ['\u{1c4}', '\u{0}', '\u{0}']), ('\u{1c6}', ['\u{1c4}', '\u{0}', '\u{0}']), + ('\u{1c8}', ['\u{1c7}', '\u{0}', '\u{0}']), ('\u{1c9}', ['\u{1c7}', '\u{0}', '\u{0}']), + ('\u{1cb}', ['\u{1ca}', '\u{0}', '\u{0}']), ('\u{1cc}', ['\u{1ca}', '\u{0}', '\u{0}']), + ('\u{1ce}', ['\u{1cd}', '\u{0}', '\u{0}']), ('\u{1d0}', ['\u{1cf}', '\u{0}', '\u{0}']), + ('\u{1d2}', ['\u{1d1}', '\u{0}', '\u{0}']), ('\u{1d4}', ['\u{1d3}', '\u{0}', '\u{0}']), + ('\u{1d6}', ['\u{1d5}', '\u{0}', '\u{0}']), ('\u{1d8}', ['\u{1d7}', '\u{0}', '\u{0}']), + ('\u{1da}', ['\u{1d9}', '\u{0}', '\u{0}']), ('\u{1dc}', ['\u{1db}', '\u{0}', '\u{0}']), + ('\u{1dd}', ['\u{18e}', '\u{0}', '\u{0}']), ('\u{1df}', ['\u{1de}', '\u{0}', '\u{0}']), + ('\u{1e1}', ['\u{1e0}', '\u{0}', '\u{0}']), ('\u{1e3}', ['\u{1e2}', '\u{0}', '\u{0}']), + ('\u{1e5}', ['\u{1e4}', '\u{0}', '\u{0}']), ('\u{1e7}', ['\u{1e6}', '\u{0}', '\u{0}']), + ('\u{1e9}', ['\u{1e8}', '\u{0}', '\u{0}']), ('\u{1eb}', ['\u{1ea}', '\u{0}', '\u{0}']), + ('\u{1ed}', ['\u{1ec}', '\u{0}', '\u{0}']), ('\u{1ef}', ['\u{1ee}', '\u{0}', '\u{0}']), + ('\u{1f0}', ['J', '\u{30c}', '\u{0}']), ('\u{1f2}', ['\u{1f1}', '\u{0}', '\u{0}']), + ('\u{1f3}', ['\u{1f1}', '\u{0}', '\u{0}']), ('\u{1f5}', ['\u{1f4}', '\u{0}', '\u{0}']), + ('\u{1f9}', ['\u{1f8}', '\u{0}', '\u{0}']), ('\u{1fb}', ['\u{1fa}', '\u{0}', '\u{0}']), + ('\u{1fd}', ['\u{1fc}', '\u{0}', '\u{0}']), ('\u{1ff}', ['\u{1fe}', '\u{0}', '\u{0}']), + ('\u{201}', ['\u{200}', '\u{0}', '\u{0}']), ('\u{203}', ['\u{202}', '\u{0}', '\u{0}']), + ('\u{205}', ['\u{204}', '\u{0}', '\u{0}']), ('\u{207}', ['\u{206}', '\u{0}', '\u{0}']), + ('\u{209}', ['\u{208}', '\u{0}', '\u{0}']), ('\u{20b}', ['\u{20a}', '\u{0}', '\u{0}']), + ('\u{20d}', ['\u{20c}', '\u{0}', '\u{0}']), ('\u{20f}', ['\u{20e}', '\u{0}', '\u{0}']), + ('\u{211}', ['\u{210}', '\u{0}', '\u{0}']), ('\u{213}', ['\u{212}', '\u{0}', '\u{0}']), + ('\u{215}', ['\u{214}', '\u{0}', '\u{0}']), ('\u{217}', ['\u{216}', '\u{0}', '\u{0}']), + ('\u{219}', ['\u{218}', '\u{0}', '\u{0}']), ('\u{21b}', ['\u{21a}', '\u{0}', '\u{0}']), + ('\u{21d}', ['\u{21c}', '\u{0}', '\u{0}']), ('\u{21f}', ['\u{21e}', '\u{0}', '\u{0}']), + ('\u{223}', ['\u{222}', '\u{0}', '\u{0}']), ('\u{225}', ['\u{224}', '\u{0}', '\u{0}']), + ('\u{227}', ['\u{226}', '\u{0}', '\u{0}']), ('\u{229}', ['\u{228}', '\u{0}', '\u{0}']), + ('\u{22b}', ['\u{22a}', '\u{0}', '\u{0}']), ('\u{22d}', ['\u{22c}', '\u{0}', '\u{0}']), + ('\u{22f}', ['\u{22e}', '\u{0}', '\u{0}']), ('\u{231}', ['\u{230}', '\u{0}', '\u{0}']), + ('\u{233}', ['\u{232}', '\u{0}', '\u{0}']), ('\u{23c}', ['\u{23b}', '\u{0}', '\u{0}']), + ('\u{23f}', ['\u{2c7e}', '\u{0}', '\u{0}']), ('\u{240}', ['\u{2c7f}', '\u{0}', '\u{0}']), + ('\u{242}', ['\u{241}', '\u{0}', '\u{0}']), ('\u{247}', ['\u{246}', '\u{0}', '\u{0}']), + ('\u{249}', ['\u{248}', '\u{0}', '\u{0}']), ('\u{24b}', ['\u{24a}', '\u{0}', '\u{0}']), + ('\u{24d}', ['\u{24c}', '\u{0}', '\u{0}']), ('\u{24f}', ['\u{24e}', '\u{0}', '\u{0}']), + ('\u{250}', ['\u{2c6f}', '\u{0}', '\u{0}']), ('\u{251}', ['\u{2c6d}', '\u{0}', '\u{0}']), + ('\u{252}', ['\u{2c70}', '\u{0}', '\u{0}']), ('\u{253}', ['\u{181}', '\u{0}', '\u{0}']), + ('\u{254}', ['\u{186}', '\u{0}', '\u{0}']), ('\u{256}', ['\u{189}', '\u{0}', '\u{0}']), + ('\u{257}', ['\u{18a}', '\u{0}', '\u{0}']), ('\u{259}', ['\u{18f}', '\u{0}', '\u{0}']), + ('\u{25b}', ['\u{190}', '\u{0}', '\u{0}']), ('\u{25c}', ['\u{a7ab}', '\u{0}', '\u{0}']), + ('\u{260}', ['\u{193}', '\u{0}', '\u{0}']), ('\u{261}', ['\u{a7ac}', '\u{0}', '\u{0}']), + ('\u{263}', ['\u{194}', '\u{0}', '\u{0}']), ('\u{265}', ['\u{a78d}', '\u{0}', '\u{0}']), + ('\u{266}', ['\u{a7aa}', '\u{0}', '\u{0}']), ('\u{268}', ['\u{197}', '\u{0}', '\u{0}']), + ('\u{269}', ['\u{196}', '\u{0}', '\u{0}']), ('\u{26a}', ['\u{a7ae}', '\u{0}', '\u{0}']), + ('\u{26b}', ['\u{2c62}', '\u{0}', '\u{0}']), ('\u{26c}', ['\u{a7ad}', '\u{0}', '\u{0}']), + ('\u{26f}', ['\u{19c}', '\u{0}', '\u{0}']), ('\u{271}', ['\u{2c6e}', '\u{0}', '\u{0}']), + ('\u{272}', ['\u{19d}', '\u{0}', '\u{0}']), ('\u{275}', ['\u{19f}', '\u{0}', '\u{0}']), + ('\u{27d}', ['\u{2c64}', '\u{0}', '\u{0}']), ('\u{280}', ['\u{1a6}', '\u{0}', '\u{0}']), + ('\u{282}', ['\u{a7c5}', '\u{0}', '\u{0}']), ('\u{283}', ['\u{1a9}', '\u{0}', '\u{0}']), + ('\u{287}', ['\u{a7b1}', '\u{0}', '\u{0}']), ('\u{288}', ['\u{1ae}', '\u{0}', '\u{0}']), + ('\u{289}', ['\u{244}', '\u{0}', '\u{0}']), ('\u{28a}', ['\u{1b1}', '\u{0}', '\u{0}']), + ('\u{28b}', ['\u{1b2}', '\u{0}', '\u{0}']), ('\u{28c}', ['\u{245}', '\u{0}', '\u{0}']), + ('\u{292}', ['\u{1b7}', '\u{0}', '\u{0}']), ('\u{29d}', ['\u{a7b2}', '\u{0}', '\u{0}']), + ('\u{29e}', ['\u{a7b0}', '\u{0}', '\u{0}']), ('\u{345}', ['\u{399}', '\u{0}', '\u{0}']), + ('\u{371}', ['\u{370}', '\u{0}', '\u{0}']), ('\u{373}', ['\u{372}', '\u{0}', '\u{0}']), + ('\u{377}', ['\u{376}', '\u{0}', '\u{0}']), ('\u{37b}', ['\u{3fd}', '\u{0}', '\u{0}']), + ('\u{37c}', ['\u{3fe}', '\u{0}', '\u{0}']), ('\u{37d}', ['\u{3ff}', '\u{0}', '\u{0}']), + ('\u{390}', ['\u{399}', '\u{308}', '\u{301}']), ('\u{3ac}', ['\u{386}', '\u{0}', '\u{0}']), + ('\u{3ad}', ['\u{388}', '\u{0}', '\u{0}']), ('\u{3ae}', ['\u{389}', '\u{0}', '\u{0}']), + ('\u{3af}', ['\u{38a}', '\u{0}', '\u{0}']), ('\u{3b0}', ['\u{3a5}', '\u{308}', '\u{301}']), + ('\u{3b1}', ['\u{391}', '\u{0}', '\u{0}']), ('\u{3b2}', ['\u{392}', '\u{0}', '\u{0}']), + ('\u{3b3}', ['\u{393}', '\u{0}', '\u{0}']), ('\u{3b4}', ['\u{394}', '\u{0}', '\u{0}']), + ('\u{3b5}', ['\u{395}', '\u{0}', '\u{0}']), ('\u{3b6}', ['\u{396}', '\u{0}', '\u{0}']), + ('\u{3b7}', ['\u{397}', '\u{0}', '\u{0}']), ('\u{3b8}', ['\u{398}', '\u{0}', '\u{0}']), + ('\u{3b9}', ['\u{399}', '\u{0}', '\u{0}']), ('\u{3ba}', ['\u{39a}', '\u{0}', '\u{0}']), + ('\u{3bb}', ['\u{39b}', '\u{0}', '\u{0}']), ('\u{3bc}', ['\u{39c}', '\u{0}', '\u{0}']), + ('\u{3bd}', ['\u{39d}', '\u{0}', '\u{0}']), ('\u{3be}', ['\u{39e}', '\u{0}', '\u{0}']), + ('\u{3bf}', ['\u{39f}', '\u{0}', '\u{0}']), ('\u{3c0}', ['\u{3a0}', '\u{0}', '\u{0}']), + ('\u{3c1}', ['\u{3a1}', '\u{0}', '\u{0}']), ('\u{3c2}', ['\u{3a3}', '\u{0}', '\u{0}']), + ('\u{3c3}', ['\u{3a3}', '\u{0}', '\u{0}']), ('\u{3c4}', ['\u{3a4}', '\u{0}', '\u{0}']), + ('\u{3c5}', ['\u{3a5}', '\u{0}', '\u{0}']), ('\u{3c6}', ['\u{3a6}', '\u{0}', '\u{0}']), + ('\u{3c7}', ['\u{3a7}', '\u{0}', '\u{0}']), ('\u{3c8}', ['\u{3a8}', '\u{0}', '\u{0}']), + ('\u{3c9}', ['\u{3a9}', '\u{0}', '\u{0}']), ('\u{3ca}', ['\u{3aa}', '\u{0}', '\u{0}']), + ('\u{3cb}', ['\u{3ab}', '\u{0}', '\u{0}']), ('\u{3cc}', ['\u{38c}', '\u{0}', '\u{0}']), + ('\u{3cd}', ['\u{38e}', '\u{0}', '\u{0}']), ('\u{3ce}', ['\u{38f}', '\u{0}', '\u{0}']), + ('\u{3d0}', ['\u{392}', '\u{0}', '\u{0}']), ('\u{3d1}', ['\u{398}', '\u{0}', '\u{0}']), + ('\u{3d5}', ['\u{3a6}', '\u{0}', '\u{0}']), ('\u{3d6}', ['\u{3a0}', '\u{0}', '\u{0}']), + ('\u{3d7}', ['\u{3cf}', '\u{0}', '\u{0}']), ('\u{3d9}', ['\u{3d8}', '\u{0}', '\u{0}']), + ('\u{3db}', ['\u{3da}', '\u{0}', '\u{0}']), ('\u{3dd}', ['\u{3dc}', '\u{0}', '\u{0}']), + ('\u{3df}', ['\u{3de}', '\u{0}', '\u{0}']), ('\u{3e1}', ['\u{3e0}', '\u{0}', '\u{0}']), + ('\u{3e3}', ['\u{3e2}', '\u{0}', '\u{0}']), ('\u{3e5}', ['\u{3e4}', '\u{0}', '\u{0}']), + ('\u{3e7}', ['\u{3e6}', '\u{0}', '\u{0}']), ('\u{3e9}', ['\u{3e8}', '\u{0}', '\u{0}']), + ('\u{3eb}', ['\u{3ea}', '\u{0}', '\u{0}']), ('\u{3ed}', ['\u{3ec}', '\u{0}', '\u{0}']), + ('\u{3ef}', ['\u{3ee}', '\u{0}', '\u{0}']), ('\u{3f0}', ['\u{39a}', '\u{0}', '\u{0}']), + ('\u{3f1}', ['\u{3a1}', '\u{0}', '\u{0}']), ('\u{3f2}', ['\u{3f9}', '\u{0}', '\u{0}']), + ('\u{3f3}', ['\u{37f}', '\u{0}', '\u{0}']), ('\u{3f5}', ['\u{395}', '\u{0}', '\u{0}']), + ('\u{3f8}', ['\u{3f7}', '\u{0}', '\u{0}']), ('\u{3fb}', ['\u{3fa}', '\u{0}', '\u{0}']), + ('\u{430}', ['\u{410}', '\u{0}', '\u{0}']), ('\u{431}', ['\u{411}', '\u{0}', '\u{0}']), + ('\u{432}', ['\u{412}', '\u{0}', '\u{0}']), ('\u{433}', ['\u{413}', '\u{0}', '\u{0}']), + ('\u{434}', ['\u{414}', '\u{0}', '\u{0}']), ('\u{435}', ['\u{415}', '\u{0}', '\u{0}']), + ('\u{436}', ['\u{416}', '\u{0}', '\u{0}']), ('\u{437}', ['\u{417}', '\u{0}', '\u{0}']), + ('\u{438}', ['\u{418}', '\u{0}', '\u{0}']), ('\u{439}', ['\u{419}', '\u{0}', '\u{0}']), + ('\u{43a}', ['\u{41a}', '\u{0}', '\u{0}']), ('\u{43b}', ['\u{41b}', '\u{0}', '\u{0}']), + ('\u{43c}', ['\u{41c}', '\u{0}', '\u{0}']), ('\u{43d}', ['\u{41d}', '\u{0}', '\u{0}']), + ('\u{43e}', ['\u{41e}', '\u{0}', '\u{0}']), ('\u{43f}', ['\u{41f}', '\u{0}', '\u{0}']), + ('\u{440}', ['\u{420}', '\u{0}', '\u{0}']), ('\u{441}', ['\u{421}', '\u{0}', '\u{0}']), + ('\u{442}', ['\u{422}', '\u{0}', '\u{0}']), ('\u{443}', ['\u{423}', '\u{0}', '\u{0}']), + ('\u{444}', ['\u{424}', '\u{0}', '\u{0}']), ('\u{445}', ['\u{425}', '\u{0}', '\u{0}']), + ('\u{446}', ['\u{426}', '\u{0}', '\u{0}']), ('\u{447}', ['\u{427}', '\u{0}', '\u{0}']), + ('\u{448}', ['\u{428}', '\u{0}', '\u{0}']), ('\u{449}', ['\u{429}', '\u{0}', '\u{0}']), + ('\u{44a}', ['\u{42a}', '\u{0}', '\u{0}']), ('\u{44b}', ['\u{42b}', '\u{0}', '\u{0}']), + ('\u{44c}', ['\u{42c}', '\u{0}', '\u{0}']), ('\u{44d}', ['\u{42d}', '\u{0}', '\u{0}']), + ('\u{44e}', ['\u{42e}', '\u{0}', '\u{0}']), ('\u{44f}', ['\u{42f}', '\u{0}', '\u{0}']), + ('\u{450}', ['\u{400}', '\u{0}', '\u{0}']), ('\u{451}', ['\u{401}', '\u{0}', '\u{0}']), + ('\u{452}', ['\u{402}', '\u{0}', '\u{0}']), ('\u{453}', ['\u{403}', '\u{0}', '\u{0}']), + ('\u{454}', ['\u{404}', '\u{0}', '\u{0}']), ('\u{455}', ['\u{405}', '\u{0}', '\u{0}']), + ('\u{456}', ['\u{406}', '\u{0}', '\u{0}']), ('\u{457}', ['\u{407}', '\u{0}', '\u{0}']), + ('\u{458}', ['\u{408}', '\u{0}', '\u{0}']), ('\u{459}', ['\u{409}', '\u{0}', '\u{0}']), + ('\u{45a}', ['\u{40a}', '\u{0}', '\u{0}']), ('\u{45b}', ['\u{40b}', '\u{0}', '\u{0}']), + ('\u{45c}', ['\u{40c}', '\u{0}', '\u{0}']), ('\u{45d}', ['\u{40d}', '\u{0}', '\u{0}']), + ('\u{45e}', ['\u{40e}', '\u{0}', '\u{0}']), ('\u{45f}', ['\u{40f}', '\u{0}', '\u{0}']), + ('\u{461}', ['\u{460}', '\u{0}', '\u{0}']), ('\u{463}', ['\u{462}', '\u{0}', '\u{0}']), + ('\u{465}', ['\u{464}', '\u{0}', '\u{0}']), ('\u{467}', ['\u{466}', '\u{0}', '\u{0}']), + ('\u{469}', ['\u{468}', '\u{0}', '\u{0}']), ('\u{46b}', ['\u{46a}', '\u{0}', '\u{0}']), + ('\u{46d}', ['\u{46c}', '\u{0}', '\u{0}']), ('\u{46f}', ['\u{46e}', '\u{0}', '\u{0}']), + ('\u{471}', ['\u{470}', '\u{0}', '\u{0}']), ('\u{473}', ['\u{472}', '\u{0}', '\u{0}']), + ('\u{475}', ['\u{474}', '\u{0}', '\u{0}']), ('\u{477}', ['\u{476}', '\u{0}', '\u{0}']), + ('\u{479}', ['\u{478}', '\u{0}', '\u{0}']), ('\u{47b}', ['\u{47a}', '\u{0}', '\u{0}']), + ('\u{47d}', ['\u{47c}', '\u{0}', '\u{0}']), ('\u{47f}', ['\u{47e}', '\u{0}', '\u{0}']), + ('\u{481}', ['\u{480}', '\u{0}', '\u{0}']), ('\u{48b}', ['\u{48a}', '\u{0}', '\u{0}']), + ('\u{48d}', ['\u{48c}', '\u{0}', '\u{0}']), ('\u{48f}', ['\u{48e}', '\u{0}', '\u{0}']), + ('\u{491}', ['\u{490}', '\u{0}', '\u{0}']), ('\u{493}', ['\u{492}', '\u{0}', '\u{0}']), + ('\u{495}', ['\u{494}', '\u{0}', '\u{0}']), ('\u{497}', ['\u{496}', '\u{0}', '\u{0}']), + ('\u{499}', ['\u{498}', '\u{0}', '\u{0}']), ('\u{49b}', ['\u{49a}', '\u{0}', '\u{0}']), + ('\u{49d}', ['\u{49c}', '\u{0}', '\u{0}']), ('\u{49f}', ['\u{49e}', '\u{0}', '\u{0}']), + ('\u{4a1}', ['\u{4a0}', '\u{0}', '\u{0}']), ('\u{4a3}', ['\u{4a2}', '\u{0}', '\u{0}']), + ('\u{4a5}', ['\u{4a4}', '\u{0}', '\u{0}']), ('\u{4a7}', ['\u{4a6}', '\u{0}', '\u{0}']), + ('\u{4a9}', ['\u{4a8}', '\u{0}', '\u{0}']), ('\u{4ab}', ['\u{4aa}', '\u{0}', '\u{0}']), + ('\u{4ad}', ['\u{4ac}', '\u{0}', '\u{0}']), ('\u{4af}', ['\u{4ae}', '\u{0}', '\u{0}']), + ('\u{4b1}', ['\u{4b0}', '\u{0}', '\u{0}']), ('\u{4b3}', ['\u{4b2}', '\u{0}', '\u{0}']), + ('\u{4b5}', ['\u{4b4}', '\u{0}', '\u{0}']), ('\u{4b7}', ['\u{4b6}', '\u{0}', '\u{0}']), + ('\u{4b9}', ['\u{4b8}', '\u{0}', '\u{0}']), ('\u{4bb}', ['\u{4ba}', '\u{0}', '\u{0}']), + ('\u{4bd}', ['\u{4bc}', '\u{0}', '\u{0}']), ('\u{4bf}', ['\u{4be}', '\u{0}', '\u{0}']), + ('\u{4c2}', ['\u{4c1}', '\u{0}', '\u{0}']), ('\u{4c4}', ['\u{4c3}', '\u{0}', '\u{0}']), + ('\u{4c6}', ['\u{4c5}', '\u{0}', '\u{0}']), ('\u{4c8}', ['\u{4c7}', '\u{0}', '\u{0}']), + ('\u{4ca}', ['\u{4c9}', '\u{0}', '\u{0}']), ('\u{4cc}', ['\u{4cb}', '\u{0}', '\u{0}']), + ('\u{4ce}', ['\u{4cd}', '\u{0}', '\u{0}']), ('\u{4cf}', ['\u{4c0}', '\u{0}', '\u{0}']), + ('\u{4d1}', ['\u{4d0}', '\u{0}', '\u{0}']), ('\u{4d3}', ['\u{4d2}', '\u{0}', '\u{0}']), + ('\u{4d5}', ['\u{4d4}', '\u{0}', '\u{0}']), ('\u{4d7}', ['\u{4d6}', '\u{0}', '\u{0}']), + ('\u{4d9}', ['\u{4d8}', '\u{0}', '\u{0}']), ('\u{4db}', ['\u{4da}', '\u{0}', '\u{0}']), + ('\u{4dd}', ['\u{4dc}', '\u{0}', '\u{0}']), ('\u{4df}', ['\u{4de}', '\u{0}', '\u{0}']), + ('\u{4e1}', ['\u{4e0}', '\u{0}', '\u{0}']), ('\u{4e3}', ['\u{4e2}', '\u{0}', '\u{0}']), + ('\u{4e5}', ['\u{4e4}', '\u{0}', '\u{0}']), ('\u{4e7}', ['\u{4e6}', '\u{0}', '\u{0}']), + ('\u{4e9}', ['\u{4e8}', '\u{0}', '\u{0}']), ('\u{4eb}', ['\u{4ea}', '\u{0}', '\u{0}']), + ('\u{4ed}', ['\u{4ec}', '\u{0}', '\u{0}']), ('\u{4ef}', ['\u{4ee}', '\u{0}', '\u{0}']), + ('\u{4f1}', ['\u{4f0}', '\u{0}', '\u{0}']), ('\u{4f3}', ['\u{4f2}', '\u{0}', '\u{0}']), + ('\u{4f5}', ['\u{4f4}', '\u{0}', '\u{0}']), ('\u{4f7}', ['\u{4f6}', '\u{0}', '\u{0}']), + ('\u{4f9}', ['\u{4f8}', '\u{0}', '\u{0}']), ('\u{4fb}', ['\u{4fa}', '\u{0}', '\u{0}']), + ('\u{4fd}', ['\u{4fc}', '\u{0}', '\u{0}']), ('\u{4ff}', ['\u{4fe}', '\u{0}', '\u{0}']), + ('\u{501}', ['\u{500}', '\u{0}', '\u{0}']), ('\u{503}', ['\u{502}', '\u{0}', '\u{0}']), + ('\u{505}', ['\u{504}', '\u{0}', '\u{0}']), ('\u{507}', ['\u{506}', '\u{0}', '\u{0}']), + ('\u{509}', ['\u{508}', '\u{0}', '\u{0}']), ('\u{50b}', ['\u{50a}', '\u{0}', '\u{0}']), + ('\u{50d}', ['\u{50c}', '\u{0}', '\u{0}']), ('\u{50f}', ['\u{50e}', '\u{0}', '\u{0}']), + ('\u{511}', ['\u{510}', '\u{0}', '\u{0}']), ('\u{513}', ['\u{512}', '\u{0}', '\u{0}']), + ('\u{515}', ['\u{514}', '\u{0}', '\u{0}']), ('\u{517}', ['\u{516}', '\u{0}', '\u{0}']), + ('\u{519}', ['\u{518}', '\u{0}', '\u{0}']), ('\u{51b}', ['\u{51a}', '\u{0}', '\u{0}']), + ('\u{51d}', ['\u{51c}', '\u{0}', '\u{0}']), ('\u{51f}', ['\u{51e}', '\u{0}', '\u{0}']), + ('\u{521}', ['\u{520}', '\u{0}', '\u{0}']), ('\u{523}', ['\u{522}', '\u{0}', '\u{0}']), + ('\u{525}', ['\u{524}', '\u{0}', '\u{0}']), ('\u{527}', ['\u{526}', '\u{0}', '\u{0}']), + ('\u{529}', ['\u{528}', '\u{0}', '\u{0}']), ('\u{52b}', ['\u{52a}', '\u{0}', '\u{0}']), + ('\u{52d}', ['\u{52c}', '\u{0}', '\u{0}']), ('\u{52f}', ['\u{52e}', '\u{0}', '\u{0}']), + ('\u{561}', ['\u{531}', '\u{0}', '\u{0}']), ('\u{562}', ['\u{532}', '\u{0}', '\u{0}']), + ('\u{563}', ['\u{533}', '\u{0}', '\u{0}']), ('\u{564}', ['\u{534}', '\u{0}', '\u{0}']), + ('\u{565}', ['\u{535}', '\u{0}', '\u{0}']), ('\u{566}', ['\u{536}', '\u{0}', '\u{0}']), + ('\u{567}', ['\u{537}', '\u{0}', '\u{0}']), ('\u{568}', ['\u{538}', '\u{0}', '\u{0}']), + ('\u{569}', ['\u{539}', '\u{0}', '\u{0}']), ('\u{56a}', ['\u{53a}', '\u{0}', '\u{0}']), + ('\u{56b}', ['\u{53b}', '\u{0}', '\u{0}']), ('\u{56c}', ['\u{53c}', '\u{0}', '\u{0}']), + ('\u{56d}', ['\u{53d}', '\u{0}', '\u{0}']), ('\u{56e}', ['\u{53e}', '\u{0}', '\u{0}']), + ('\u{56f}', ['\u{53f}', '\u{0}', '\u{0}']), ('\u{570}', ['\u{540}', '\u{0}', '\u{0}']), + ('\u{571}', ['\u{541}', '\u{0}', '\u{0}']), ('\u{572}', ['\u{542}', '\u{0}', '\u{0}']), + ('\u{573}', ['\u{543}', '\u{0}', '\u{0}']), ('\u{574}', ['\u{544}', '\u{0}', '\u{0}']), + ('\u{575}', ['\u{545}', '\u{0}', '\u{0}']), ('\u{576}', ['\u{546}', '\u{0}', '\u{0}']), + ('\u{577}', ['\u{547}', '\u{0}', '\u{0}']), ('\u{578}', ['\u{548}', '\u{0}', '\u{0}']), + ('\u{579}', ['\u{549}', '\u{0}', '\u{0}']), ('\u{57a}', ['\u{54a}', '\u{0}', '\u{0}']), + ('\u{57b}', ['\u{54b}', '\u{0}', '\u{0}']), ('\u{57c}', ['\u{54c}', '\u{0}', '\u{0}']), + ('\u{57d}', ['\u{54d}', '\u{0}', '\u{0}']), ('\u{57e}', ['\u{54e}', '\u{0}', '\u{0}']), + ('\u{57f}', ['\u{54f}', '\u{0}', '\u{0}']), ('\u{580}', ['\u{550}', '\u{0}', '\u{0}']), + ('\u{581}', ['\u{551}', '\u{0}', '\u{0}']), ('\u{582}', ['\u{552}', '\u{0}', '\u{0}']), + ('\u{583}', ['\u{553}', '\u{0}', '\u{0}']), ('\u{584}', ['\u{554}', '\u{0}', '\u{0}']), + ('\u{585}', ['\u{555}', '\u{0}', '\u{0}']), ('\u{586}', ['\u{556}', '\u{0}', '\u{0}']), + ('\u{587}', ['\u{535}', '\u{552}', '\u{0}']), ('\u{10d0}', ['\u{1c90}', '\u{0}', '\u{0}']), + ('\u{10d1}', ['\u{1c91}', '\u{0}', '\u{0}']), ('\u{10d2}', ['\u{1c92}', '\u{0}', '\u{0}']), + ('\u{10d3}', ['\u{1c93}', '\u{0}', '\u{0}']), ('\u{10d4}', ['\u{1c94}', '\u{0}', '\u{0}']), + ('\u{10d5}', ['\u{1c95}', '\u{0}', '\u{0}']), ('\u{10d6}', ['\u{1c96}', '\u{0}', '\u{0}']), + ('\u{10d7}', ['\u{1c97}', '\u{0}', '\u{0}']), ('\u{10d8}', ['\u{1c98}', '\u{0}', '\u{0}']), + ('\u{10d9}', ['\u{1c99}', '\u{0}', '\u{0}']), ('\u{10da}', ['\u{1c9a}', '\u{0}', '\u{0}']), + ('\u{10db}', ['\u{1c9b}', '\u{0}', '\u{0}']), ('\u{10dc}', ['\u{1c9c}', '\u{0}', '\u{0}']), + ('\u{10dd}', ['\u{1c9d}', '\u{0}', '\u{0}']), ('\u{10de}', ['\u{1c9e}', '\u{0}', '\u{0}']), + ('\u{10df}', ['\u{1c9f}', '\u{0}', '\u{0}']), ('\u{10e0}', ['\u{1ca0}', '\u{0}', '\u{0}']), + ('\u{10e1}', ['\u{1ca1}', '\u{0}', '\u{0}']), ('\u{10e2}', ['\u{1ca2}', '\u{0}', '\u{0}']), + ('\u{10e3}', ['\u{1ca3}', '\u{0}', '\u{0}']), ('\u{10e4}', ['\u{1ca4}', '\u{0}', '\u{0}']), + ('\u{10e5}', ['\u{1ca5}', '\u{0}', '\u{0}']), ('\u{10e6}', ['\u{1ca6}', '\u{0}', '\u{0}']), + ('\u{10e7}', ['\u{1ca7}', '\u{0}', '\u{0}']), ('\u{10e8}', ['\u{1ca8}', '\u{0}', '\u{0}']), + ('\u{10e9}', ['\u{1ca9}', '\u{0}', '\u{0}']), ('\u{10ea}', ['\u{1caa}', '\u{0}', '\u{0}']), + ('\u{10eb}', ['\u{1cab}', '\u{0}', '\u{0}']), ('\u{10ec}', ['\u{1cac}', '\u{0}', '\u{0}']), + ('\u{10ed}', ['\u{1cad}', '\u{0}', '\u{0}']), ('\u{10ee}', ['\u{1cae}', '\u{0}', '\u{0}']), + ('\u{10ef}', ['\u{1caf}', '\u{0}', '\u{0}']), ('\u{10f0}', ['\u{1cb0}', '\u{0}', '\u{0}']), + ('\u{10f1}', ['\u{1cb1}', '\u{0}', '\u{0}']), ('\u{10f2}', ['\u{1cb2}', '\u{0}', '\u{0}']), + ('\u{10f3}', ['\u{1cb3}', '\u{0}', '\u{0}']), ('\u{10f4}', ['\u{1cb4}', '\u{0}', '\u{0}']), + ('\u{10f5}', ['\u{1cb5}', '\u{0}', '\u{0}']), ('\u{10f6}', ['\u{1cb6}', '\u{0}', '\u{0}']), + ('\u{10f7}', ['\u{1cb7}', '\u{0}', '\u{0}']), ('\u{10f8}', ['\u{1cb8}', '\u{0}', '\u{0}']), + ('\u{10f9}', ['\u{1cb9}', '\u{0}', '\u{0}']), ('\u{10fa}', ['\u{1cba}', '\u{0}', '\u{0}']), + ('\u{10fd}', ['\u{1cbd}', '\u{0}', '\u{0}']), ('\u{10fe}', ['\u{1cbe}', '\u{0}', '\u{0}']), + ('\u{10ff}', ['\u{1cbf}', '\u{0}', '\u{0}']), ('\u{13f8}', ['\u{13f0}', '\u{0}', '\u{0}']), + ('\u{13f9}', ['\u{13f1}', '\u{0}', '\u{0}']), ('\u{13fa}', ['\u{13f2}', '\u{0}', '\u{0}']), + ('\u{13fb}', ['\u{13f3}', '\u{0}', '\u{0}']), ('\u{13fc}', ['\u{13f4}', '\u{0}', '\u{0}']), + ('\u{13fd}', ['\u{13f5}', '\u{0}', '\u{0}']), ('\u{1c80}', ['\u{412}', '\u{0}', '\u{0}']), + ('\u{1c81}', ['\u{414}', '\u{0}', '\u{0}']), ('\u{1c82}', ['\u{41e}', '\u{0}', '\u{0}']), + ('\u{1c83}', ['\u{421}', '\u{0}', '\u{0}']), ('\u{1c84}', ['\u{422}', '\u{0}', '\u{0}']), + ('\u{1c85}', ['\u{422}', '\u{0}', '\u{0}']), ('\u{1c86}', ['\u{42a}', '\u{0}', '\u{0}']), + ('\u{1c87}', ['\u{462}', '\u{0}', '\u{0}']), ('\u{1c88}', ['\u{a64a}', '\u{0}', '\u{0}']), + ('\u{1d79}', ['\u{a77d}', '\u{0}', '\u{0}']), ('\u{1d7d}', ['\u{2c63}', '\u{0}', '\u{0}']), + ('\u{1d8e}', ['\u{a7c6}', '\u{0}', '\u{0}']), ('\u{1e01}', ['\u{1e00}', '\u{0}', '\u{0}']), + ('\u{1e03}', ['\u{1e02}', '\u{0}', '\u{0}']), ('\u{1e05}', ['\u{1e04}', '\u{0}', '\u{0}']), + ('\u{1e07}', ['\u{1e06}', '\u{0}', '\u{0}']), ('\u{1e09}', ['\u{1e08}', '\u{0}', '\u{0}']), + ('\u{1e0b}', ['\u{1e0a}', '\u{0}', '\u{0}']), ('\u{1e0d}', ['\u{1e0c}', '\u{0}', '\u{0}']), + ('\u{1e0f}', ['\u{1e0e}', '\u{0}', '\u{0}']), ('\u{1e11}', ['\u{1e10}', '\u{0}', '\u{0}']), + ('\u{1e13}', ['\u{1e12}', '\u{0}', '\u{0}']), ('\u{1e15}', ['\u{1e14}', '\u{0}', '\u{0}']), + ('\u{1e17}', ['\u{1e16}', '\u{0}', '\u{0}']), ('\u{1e19}', ['\u{1e18}', '\u{0}', '\u{0}']), + ('\u{1e1b}', ['\u{1e1a}', '\u{0}', '\u{0}']), ('\u{1e1d}', ['\u{1e1c}', '\u{0}', '\u{0}']), + ('\u{1e1f}', ['\u{1e1e}', '\u{0}', '\u{0}']), ('\u{1e21}', ['\u{1e20}', '\u{0}', '\u{0}']), + ('\u{1e23}', ['\u{1e22}', '\u{0}', '\u{0}']), ('\u{1e25}', ['\u{1e24}', '\u{0}', '\u{0}']), + ('\u{1e27}', ['\u{1e26}', '\u{0}', '\u{0}']), ('\u{1e29}', ['\u{1e28}', '\u{0}', '\u{0}']), + ('\u{1e2b}', ['\u{1e2a}', '\u{0}', '\u{0}']), ('\u{1e2d}', ['\u{1e2c}', '\u{0}', '\u{0}']), + ('\u{1e2f}', ['\u{1e2e}', '\u{0}', '\u{0}']), ('\u{1e31}', ['\u{1e30}', '\u{0}', '\u{0}']), + ('\u{1e33}', ['\u{1e32}', '\u{0}', '\u{0}']), ('\u{1e35}', ['\u{1e34}', '\u{0}', '\u{0}']), + ('\u{1e37}', ['\u{1e36}', '\u{0}', '\u{0}']), ('\u{1e39}', ['\u{1e38}', '\u{0}', '\u{0}']), + ('\u{1e3b}', ['\u{1e3a}', '\u{0}', '\u{0}']), ('\u{1e3d}', ['\u{1e3c}', '\u{0}', '\u{0}']), + ('\u{1e3f}', ['\u{1e3e}', '\u{0}', '\u{0}']), ('\u{1e41}', ['\u{1e40}', '\u{0}', '\u{0}']), + ('\u{1e43}', ['\u{1e42}', '\u{0}', '\u{0}']), ('\u{1e45}', ['\u{1e44}', '\u{0}', '\u{0}']), + ('\u{1e47}', ['\u{1e46}', '\u{0}', '\u{0}']), ('\u{1e49}', ['\u{1e48}', '\u{0}', '\u{0}']), + ('\u{1e4b}', ['\u{1e4a}', '\u{0}', '\u{0}']), ('\u{1e4d}', ['\u{1e4c}', '\u{0}', '\u{0}']), + ('\u{1e4f}', ['\u{1e4e}', '\u{0}', '\u{0}']), ('\u{1e51}', ['\u{1e50}', '\u{0}', '\u{0}']), + ('\u{1e53}', ['\u{1e52}', '\u{0}', '\u{0}']), ('\u{1e55}', ['\u{1e54}', '\u{0}', '\u{0}']), + ('\u{1e57}', ['\u{1e56}', '\u{0}', '\u{0}']), ('\u{1e59}', ['\u{1e58}', '\u{0}', '\u{0}']), + ('\u{1e5b}', ['\u{1e5a}', '\u{0}', '\u{0}']), ('\u{1e5d}', ['\u{1e5c}', '\u{0}', '\u{0}']), + ('\u{1e5f}', ['\u{1e5e}', '\u{0}', '\u{0}']), ('\u{1e61}', ['\u{1e60}', '\u{0}', '\u{0}']), + ('\u{1e63}', ['\u{1e62}', '\u{0}', '\u{0}']), ('\u{1e65}', ['\u{1e64}', '\u{0}', '\u{0}']), + ('\u{1e67}', ['\u{1e66}', '\u{0}', '\u{0}']), ('\u{1e69}', ['\u{1e68}', '\u{0}', '\u{0}']), + ('\u{1e6b}', ['\u{1e6a}', '\u{0}', '\u{0}']), ('\u{1e6d}', ['\u{1e6c}', '\u{0}', '\u{0}']), + ('\u{1e6f}', ['\u{1e6e}', '\u{0}', '\u{0}']), ('\u{1e71}', ['\u{1e70}', '\u{0}', '\u{0}']), + ('\u{1e73}', ['\u{1e72}', '\u{0}', '\u{0}']), ('\u{1e75}', ['\u{1e74}', '\u{0}', '\u{0}']), + ('\u{1e77}', ['\u{1e76}', '\u{0}', '\u{0}']), ('\u{1e79}', ['\u{1e78}', '\u{0}', '\u{0}']), + ('\u{1e7b}', ['\u{1e7a}', '\u{0}', '\u{0}']), ('\u{1e7d}', ['\u{1e7c}', '\u{0}', '\u{0}']), + ('\u{1e7f}', ['\u{1e7e}', '\u{0}', '\u{0}']), ('\u{1e81}', ['\u{1e80}', '\u{0}', '\u{0}']), + ('\u{1e83}', ['\u{1e82}', '\u{0}', '\u{0}']), ('\u{1e85}', ['\u{1e84}', '\u{0}', '\u{0}']), + ('\u{1e87}', ['\u{1e86}', '\u{0}', '\u{0}']), ('\u{1e89}', ['\u{1e88}', '\u{0}', '\u{0}']), + ('\u{1e8b}', ['\u{1e8a}', '\u{0}', '\u{0}']), ('\u{1e8d}', ['\u{1e8c}', '\u{0}', '\u{0}']), + ('\u{1e8f}', ['\u{1e8e}', '\u{0}', '\u{0}']), ('\u{1e91}', ['\u{1e90}', '\u{0}', '\u{0}']), + ('\u{1e93}', ['\u{1e92}', '\u{0}', '\u{0}']), ('\u{1e95}', ['\u{1e94}', '\u{0}', '\u{0}']), + ('\u{1e96}', ['H', '\u{331}', '\u{0}']), ('\u{1e97}', ['T', '\u{308}', '\u{0}']), + ('\u{1e98}', ['W', '\u{30a}', '\u{0}']), ('\u{1e99}', ['Y', '\u{30a}', '\u{0}']), + ('\u{1e9a}', ['A', '\u{2be}', '\u{0}']), ('\u{1e9b}', ['\u{1e60}', '\u{0}', '\u{0}']), + ('\u{1ea1}', ['\u{1ea0}', '\u{0}', '\u{0}']), ('\u{1ea3}', ['\u{1ea2}', '\u{0}', '\u{0}']), + ('\u{1ea5}', ['\u{1ea4}', '\u{0}', '\u{0}']), ('\u{1ea7}', ['\u{1ea6}', '\u{0}', '\u{0}']), + ('\u{1ea9}', ['\u{1ea8}', '\u{0}', '\u{0}']), ('\u{1eab}', ['\u{1eaa}', '\u{0}', '\u{0}']), + ('\u{1ead}', ['\u{1eac}', '\u{0}', '\u{0}']), ('\u{1eaf}', ['\u{1eae}', '\u{0}', '\u{0}']), + ('\u{1eb1}', ['\u{1eb0}', '\u{0}', '\u{0}']), ('\u{1eb3}', ['\u{1eb2}', '\u{0}', '\u{0}']), + ('\u{1eb5}', ['\u{1eb4}', '\u{0}', '\u{0}']), ('\u{1eb7}', ['\u{1eb6}', '\u{0}', '\u{0}']), + ('\u{1eb9}', ['\u{1eb8}', '\u{0}', '\u{0}']), ('\u{1ebb}', ['\u{1eba}', '\u{0}', '\u{0}']), + ('\u{1ebd}', ['\u{1ebc}', '\u{0}', '\u{0}']), ('\u{1ebf}', ['\u{1ebe}', '\u{0}', '\u{0}']), + ('\u{1ec1}', ['\u{1ec0}', '\u{0}', '\u{0}']), ('\u{1ec3}', ['\u{1ec2}', '\u{0}', '\u{0}']), + ('\u{1ec5}', ['\u{1ec4}', '\u{0}', '\u{0}']), ('\u{1ec7}', ['\u{1ec6}', '\u{0}', '\u{0}']), + ('\u{1ec9}', ['\u{1ec8}', '\u{0}', '\u{0}']), ('\u{1ecb}', ['\u{1eca}', '\u{0}', '\u{0}']), + ('\u{1ecd}', ['\u{1ecc}', '\u{0}', '\u{0}']), ('\u{1ecf}', ['\u{1ece}', '\u{0}', '\u{0}']), + ('\u{1ed1}', ['\u{1ed0}', '\u{0}', '\u{0}']), ('\u{1ed3}', ['\u{1ed2}', '\u{0}', '\u{0}']), + ('\u{1ed5}', ['\u{1ed4}', '\u{0}', '\u{0}']), ('\u{1ed7}', ['\u{1ed6}', '\u{0}', '\u{0}']), + ('\u{1ed9}', ['\u{1ed8}', '\u{0}', '\u{0}']), ('\u{1edb}', ['\u{1eda}', '\u{0}', '\u{0}']), + ('\u{1edd}', ['\u{1edc}', '\u{0}', '\u{0}']), ('\u{1edf}', ['\u{1ede}', '\u{0}', '\u{0}']), + ('\u{1ee1}', ['\u{1ee0}', '\u{0}', '\u{0}']), ('\u{1ee3}', ['\u{1ee2}', '\u{0}', '\u{0}']), + ('\u{1ee5}', ['\u{1ee4}', '\u{0}', '\u{0}']), ('\u{1ee7}', ['\u{1ee6}', '\u{0}', '\u{0}']), + ('\u{1ee9}', ['\u{1ee8}', '\u{0}', '\u{0}']), ('\u{1eeb}', ['\u{1eea}', '\u{0}', '\u{0}']), + ('\u{1eed}', ['\u{1eec}', '\u{0}', '\u{0}']), ('\u{1eef}', ['\u{1eee}', '\u{0}', '\u{0}']), + ('\u{1ef1}', ['\u{1ef0}', '\u{0}', '\u{0}']), ('\u{1ef3}', ['\u{1ef2}', '\u{0}', '\u{0}']), + ('\u{1ef5}', ['\u{1ef4}', '\u{0}', '\u{0}']), ('\u{1ef7}', ['\u{1ef6}', '\u{0}', '\u{0}']), + ('\u{1ef9}', ['\u{1ef8}', '\u{0}', '\u{0}']), ('\u{1efb}', ['\u{1efa}', '\u{0}', '\u{0}']), + ('\u{1efd}', ['\u{1efc}', '\u{0}', '\u{0}']), ('\u{1eff}', ['\u{1efe}', '\u{0}', '\u{0}']), + ('\u{1f00}', ['\u{1f08}', '\u{0}', '\u{0}']), ('\u{1f01}', ['\u{1f09}', '\u{0}', '\u{0}']), + ('\u{1f02}', ['\u{1f0a}', '\u{0}', '\u{0}']), ('\u{1f03}', ['\u{1f0b}', '\u{0}', '\u{0}']), + ('\u{1f04}', ['\u{1f0c}', '\u{0}', '\u{0}']), ('\u{1f05}', ['\u{1f0d}', '\u{0}', '\u{0}']), + ('\u{1f06}', ['\u{1f0e}', '\u{0}', '\u{0}']), ('\u{1f07}', ['\u{1f0f}', '\u{0}', '\u{0}']), + ('\u{1f10}', ['\u{1f18}', '\u{0}', '\u{0}']), ('\u{1f11}', ['\u{1f19}', '\u{0}', '\u{0}']), + ('\u{1f12}', ['\u{1f1a}', '\u{0}', '\u{0}']), ('\u{1f13}', ['\u{1f1b}', '\u{0}', '\u{0}']), + ('\u{1f14}', ['\u{1f1c}', '\u{0}', '\u{0}']), ('\u{1f15}', ['\u{1f1d}', '\u{0}', '\u{0}']), + ('\u{1f20}', ['\u{1f28}', '\u{0}', '\u{0}']), ('\u{1f21}', ['\u{1f29}', '\u{0}', '\u{0}']), + ('\u{1f22}', ['\u{1f2a}', '\u{0}', '\u{0}']), ('\u{1f23}', ['\u{1f2b}', '\u{0}', '\u{0}']), + ('\u{1f24}', ['\u{1f2c}', '\u{0}', '\u{0}']), ('\u{1f25}', ['\u{1f2d}', '\u{0}', '\u{0}']), + ('\u{1f26}', ['\u{1f2e}', '\u{0}', '\u{0}']), ('\u{1f27}', ['\u{1f2f}', '\u{0}', '\u{0}']), + ('\u{1f30}', ['\u{1f38}', '\u{0}', '\u{0}']), ('\u{1f31}', ['\u{1f39}', '\u{0}', '\u{0}']), + ('\u{1f32}', ['\u{1f3a}', '\u{0}', '\u{0}']), ('\u{1f33}', ['\u{1f3b}', '\u{0}', '\u{0}']), + ('\u{1f34}', ['\u{1f3c}', '\u{0}', '\u{0}']), ('\u{1f35}', ['\u{1f3d}', '\u{0}', '\u{0}']), + ('\u{1f36}', ['\u{1f3e}', '\u{0}', '\u{0}']), ('\u{1f37}', ['\u{1f3f}', '\u{0}', '\u{0}']), + ('\u{1f40}', ['\u{1f48}', '\u{0}', '\u{0}']), ('\u{1f41}', ['\u{1f49}', '\u{0}', '\u{0}']), + ('\u{1f42}', ['\u{1f4a}', '\u{0}', '\u{0}']), ('\u{1f43}', ['\u{1f4b}', '\u{0}', '\u{0}']), + ('\u{1f44}', ['\u{1f4c}', '\u{0}', '\u{0}']), ('\u{1f45}', ['\u{1f4d}', '\u{0}', '\u{0}']), + ('\u{1f50}', ['\u{3a5}', '\u{313}', '\u{0}']), ('\u{1f51}', ['\u{1f59}', '\u{0}', '\u{0}']), + ('\u{1f52}', ['\u{3a5}', '\u{313}', '\u{300}']), + ('\u{1f53}', ['\u{1f5b}', '\u{0}', '\u{0}']), + ('\u{1f54}', ['\u{3a5}', '\u{313}', '\u{301}']), + ('\u{1f55}', ['\u{1f5d}', '\u{0}', '\u{0}']), + ('\u{1f56}', ['\u{3a5}', '\u{313}', '\u{342}']), + ('\u{1f57}', ['\u{1f5f}', '\u{0}', '\u{0}']), ('\u{1f60}', ['\u{1f68}', '\u{0}', '\u{0}']), + ('\u{1f61}', ['\u{1f69}', '\u{0}', '\u{0}']), ('\u{1f62}', ['\u{1f6a}', '\u{0}', '\u{0}']), + ('\u{1f63}', ['\u{1f6b}', '\u{0}', '\u{0}']), ('\u{1f64}', ['\u{1f6c}', '\u{0}', '\u{0}']), + ('\u{1f65}', ['\u{1f6d}', '\u{0}', '\u{0}']), ('\u{1f66}', ['\u{1f6e}', '\u{0}', '\u{0}']), + ('\u{1f67}', ['\u{1f6f}', '\u{0}', '\u{0}']), ('\u{1f70}', ['\u{1fba}', '\u{0}', '\u{0}']), + ('\u{1f71}', ['\u{1fbb}', '\u{0}', '\u{0}']), ('\u{1f72}', ['\u{1fc8}', '\u{0}', '\u{0}']), + ('\u{1f73}', ['\u{1fc9}', '\u{0}', '\u{0}']), ('\u{1f74}', ['\u{1fca}', '\u{0}', '\u{0}']), + ('\u{1f75}', ['\u{1fcb}', '\u{0}', '\u{0}']), ('\u{1f76}', ['\u{1fda}', '\u{0}', '\u{0}']), + ('\u{1f77}', ['\u{1fdb}', '\u{0}', '\u{0}']), ('\u{1f78}', ['\u{1ff8}', '\u{0}', '\u{0}']), + ('\u{1f79}', ['\u{1ff9}', '\u{0}', '\u{0}']), ('\u{1f7a}', ['\u{1fea}', '\u{0}', '\u{0}']), + ('\u{1f7b}', ['\u{1feb}', '\u{0}', '\u{0}']), ('\u{1f7c}', ['\u{1ffa}', '\u{0}', '\u{0}']), + ('\u{1f7d}', ['\u{1ffb}', '\u{0}', '\u{0}']), + ('\u{1f80}', ['\u{1f08}', '\u{399}', '\u{0}']), + ('\u{1f81}', ['\u{1f09}', '\u{399}', '\u{0}']), + ('\u{1f82}', ['\u{1f0a}', '\u{399}', '\u{0}']), + ('\u{1f83}', ['\u{1f0b}', '\u{399}', '\u{0}']), + ('\u{1f84}', ['\u{1f0c}', '\u{399}', '\u{0}']), + ('\u{1f85}', ['\u{1f0d}', '\u{399}', '\u{0}']), + ('\u{1f86}', ['\u{1f0e}', '\u{399}', '\u{0}']), + ('\u{1f87}', ['\u{1f0f}', '\u{399}', '\u{0}']), + ('\u{1f88}', ['\u{1f08}', '\u{399}', '\u{0}']), + ('\u{1f89}', ['\u{1f09}', '\u{399}', '\u{0}']), + ('\u{1f8a}', ['\u{1f0a}', '\u{399}', '\u{0}']), + ('\u{1f8b}', ['\u{1f0b}', '\u{399}', '\u{0}']), + ('\u{1f8c}', ['\u{1f0c}', '\u{399}', '\u{0}']), + ('\u{1f8d}', ['\u{1f0d}', '\u{399}', '\u{0}']), + ('\u{1f8e}', ['\u{1f0e}', '\u{399}', '\u{0}']), + ('\u{1f8f}', ['\u{1f0f}', '\u{399}', '\u{0}']), + ('\u{1f90}', ['\u{1f28}', '\u{399}', '\u{0}']), + ('\u{1f91}', ['\u{1f29}', '\u{399}', '\u{0}']), + ('\u{1f92}', ['\u{1f2a}', '\u{399}', '\u{0}']), + ('\u{1f93}', ['\u{1f2b}', '\u{399}', '\u{0}']), + ('\u{1f94}', ['\u{1f2c}', '\u{399}', '\u{0}']), + ('\u{1f95}', ['\u{1f2d}', '\u{399}', '\u{0}']), + ('\u{1f96}', ['\u{1f2e}', '\u{399}', '\u{0}']), + ('\u{1f97}', ['\u{1f2f}', '\u{399}', '\u{0}']), + ('\u{1f98}', ['\u{1f28}', '\u{399}', '\u{0}']), + ('\u{1f99}', ['\u{1f29}', '\u{399}', '\u{0}']), + ('\u{1f9a}', ['\u{1f2a}', '\u{399}', '\u{0}']), + ('\u{1f9b}', ['\u{1f2b}', '\u{399}', '\u{0}']), + ('\u{1f9c}', ['\u{1f2c}', '\u{399}', '\u{0}']), + ('\u{1f9d}', ['\u{1f2d}', '\u{399}', '\u{0}']), + ('\u{1f9e}', ['\u{1f2e}', '\u{399}', '\u{0}']), + ('\u{1f9f}', ['\u{1f2f}', '\u{399}', '\u{0}']), + ('\u{1fa0}', ['\u{1f68}', '\u{399}', '\u{0}']), + ('\u{1fa1}', ['\u{1f69}', '\u{399}', '\u{0}']), + ('\u{1fa2}', ['\u{1f6a}', '\u{399}', '\u{0}']), + ('\u{1fa3}', ['\u{1f6b}', '\u{399}', '\u{0}']), + ('\u{1fa4}', ['\u{1f6c}', '\u{399}', '\u{0}']), + ('\u{1fa5}', ['\u{1f6d}', '\u{399}', '\u{0}']), + ('\u{1fa6}', ['\u{1f6e}', '\u{399}', '\u{0}']), + ('\u{1fa7}', ['\u{1f6f}', '\u{399}', '\u{0}']), + ('\u{1fa8}', ['\u{1f68}', '\u{399}', '\u{0}']), + ('\u{1fa9}', ['\u{1f69}', '\u{399}', '\u{0}']), + ('\u{1faa}', ['\u{1f6a}', '\u{399}', '\u{0}']), + ('\u{1fab}', ['\u{1f6b}', '\u{399}', '\u{0}']), + ('\u{1fac}', ['\u{1f6c}', '\u{399}', '\u{0}']), + ('\u{1fad}', ['\u{1f6d}', '\u{399}', '\u{0}']), + ('\u{1fae}', ['\u{1f6e}', '\u{399}', '\u{0}']), + ('\u{1faf}', ['\u{1f6f}', '\u{399}', '\u{0}']), + ('\u{1fb0}', ['\u{1fb8}', '\u{0}', '\u{0}']), ('\u{1fb1}', ['\u{1fb9}', '\u{0}', '\u{0}']), + ('\u{1fb2}', ['\u{1fba}', '\u{399}', '\u{0}']), + ('\u{1fb3}', ['\u{391}', '\u{399}', '\u{0}']), + ('\u{1fb4}', ['\u{386}', '\u{399}', '\u{0}']), + ('\u{1fb6}', ['\u{391}', '\u{342}', '\u{0}']), + ('\u{1fb7}', ['\u{391}', '\u{342}', '\u{399}']), + ('\u{1fbc}', ['\u{391}', '\u{399}', '\u{0}']), ('\u{1fbe}', ['\u{399}', '\u{0}', '\u{0}']), + ('\u{1fc2}', ['\u{1fca}', '\u{399}', '\u{0}']), + ('\u{1fc3}', ['\u{397}', '\u{399}', '\u{0}']), + ('\u{1fc4}', ['\u{389}', '\u{399}', '\u{0}']), + ('\u{1fc6}', ['\u{397}', '\u{342}', '\u{0}']), + ('\u{1fc7}', ['\u{397}', '\u{342}', '\u{399}']), + ('\u{1fcc}', ['\u{397}', '\u{399}', '\u{0}']), ('\u{1fd0}', ['\u{1fd8}', '\u{0}', '\u{0}']), + ('\u{1fd1}', ['\u{1fd9}', '\u{0}', '\u{0}']), + ('\u{1fd2}', ['\u{399}', '\u{308}', '\u{300}']), + ('\u{1fd3}', ['\u{399}', '\u{308}', '\u{301}']), + ('\u{1fd6}', ['\u{399}', '\u{342}', '\u{0}']), + ('\u{1fd7}', ['\u{399}', '\u{308}', '\u{342}']), + ('\u{1fe0}', ['\u{1fe8}', '\u{0}', '\u{0}']), ('\u{1fe1}', ['\u{1fe9}', '\u{0}', '\u{0}']), + ('\u{1fe2}', ['\u{3a5}', '\u{308}', '\u{300}']), + ('\u{1fe3}', ['\u{3a5}', '\u{308}', '\u{301}']), + ('\u{1fe4}', ['\u{3a1}', '\u{313}', '\u{0}']), ('\u{1fe5}', ['\u{1fec}', '\u{0}', '\u{0}']), + ('\u{1fe6}', ['\u{3a5}', '\u{342}', '\u{0}']), + ('\u{1fe7}', ['\u{3a5}', '\u{308}', '\u{342}']), + ('\u{1ff2}', ['\u{1ffa}', '\u{399}', '\u{0}']), + ('\u{1ff3}', ['\u{3a9}', '\u{399}', '\u{0}']), + ('\u{1ff4}', ['\u{38f}', '\u{399}', '\u{0}']), + ('\u{1ff6}', ['\u{3a9}', '\u{342}', '\u{0}']), + ('\u{1ff7}', ['\u{3a9}', '\u{342}', '\u{399}']), + ('\u{1ffc}', ['\u{3a9}', '\u{399}', '\u{0}']), ('\u{214e}', ['\u{2132}', '\u{0}', '\u{0}']), + ('\u{2170}', ['\u{2160}', '\u{0}', '\u{0}']), ('\u{2171}', ['\u{2161}', '\u{0}', '\u{0}']), + ('\u{2172}', ['\u{2162}', '\u{0}', '\u{0}']), ('\u{2173}', ['\u{2163}', '\u{0}', '\u{0}']), + ('\u{2174}', ['\u{2164}', '\u{0}', '\u{0}']), ('\u{2175}', ['\u{2165}', '\u{0}', '\u{0}']), + ('\u{2176}', ['\u{2166}', '\u{0}', '\u{0}']), ('\u{2177}', ['\u{2167}', '\u{0}', '\u{0}']), + ('\u{2178}', ['\u{2168}', '\u{0}', '\u{0}']), ('\u{2179}', ['\u{2169}', '\u{0}', '\u{0}']), + ('\u{217a}', ['\u{216a}', '\u{0}', '\u{0}']), ('\u{217b}', ['\u{216b}', '\u{0}', '\u{0}']), + ('\u{217c}', ['\u{216c}', '\u{0}', '\u{0}']), ('\u{217d}', ['\u{216d}', '\u{0}', '\u{0}']), + ('\u{217e}', ['\u{216e}', '\u{0}', '\u{0}']), ('\u{217f}', ['\u{216f}', '\u{0}', '\u{0}']), + ('\u{2184}', ['\u{2183}', '\u{0}', '\u{0}']), ('\u{24d0}', ['\u{24b6}', '\u{0}', '\u{0}']), + ('\u{24d1}', ['\u{24b7}', '\u{0}', '\u{0}']), ('\u{24d2}', ['\u{24b8}', '\u{0}', '\u{0}']), + ('\u{24d3}', ['\u{24b9}', '\u{0}', '\u{0}']), ('\u{24d4}', ['\u{24ba}', '\u{0}', '\u{0}']), + ('\u{24d5}', ['\u{24bb}', '\u{0}', '\u{0}']), ('\u{24d6}', ['\u{24bc}', '\u{0}', '\u{0}']), + ('\u{24d7}', ['\u{24bd}', '\u{0}', '\u{0}']), ('\u{24d8}', ['\u{24be}', '\u{0}', '\u{0}']), + ('\u{24d9}', ['\u{24bf}', '\u{0}', '\u{0}']), ('\u{24da}', ['\u{24c0}', '\u{0}', '\u{0}']), + ('\u{24db}', ['\u{24c1}', '\u{0}', '\u{0}']), ('\u{24dc}', ['\u{24c2}', '\u{0}', '\u{0}']), + ('\u{24dd}', ['\u{24c3}', '\u{0}', '\u{0}']), ('\u{24de}', ['\u{24c4}', '\u{0}', '\u{0}']), + ('\u{24df}', ['\u{24c5}', '\u{0}', '\u{0}']), ('\u{24e0}', ['\u{24c6}', '\u{0}', '\u{0}']), + ('\u{24e1}', ['\u{24c7}', '\u{0}', '\u{0}']), ('\u{24e2}', ['\u{24c8}', '\u{0}', '\u{0}']), + ('\u{24e3}', ['\u{24c9}', '\u{0}', '\u{0}']), ('\u{24e4}', ['\u{24ca}', '\u{0}', '\u{0}']), + ('\u{24e5}', ['\u{24cb}', '\u{0}', '\u{0}']), ('\u{24e6}', ['\u{24cc}', '\u{0}', '\u{0}']), + ('\u{24e7}', ['\u{24cd}', '\u{0}', '\u{0}']), ('\u{24e8}', ['\u{24ce}', '\u{0}', '\u{0}']), + ('\u{24e9}', ['\u{24cf}', '\u{0}', '\u{0}']), ('\u{2c30}', ['\u{2c00}', '\u{0}', '\u{0}']), + ('\u{2c31}', ['\u{2c01}', '\u{0}', '\u{0}']), ('\u{2c32}', ['\u{2c02}', '\u{0}', '\u{0}']), + ('\u{2c33}', ['\u{2c03}', '\u{0}', '\u{0}']), ('\u{2c34}', ['\u{2c04}', '\u{0}', '\u{0}']), + ('\u{2c35}', ['\u{2c05}', '\u{0}', '\u{0}']), ('\u{2c36}', ['\u{2c06}', '\u{0}', '\u{0}']), + ('\u{2c37}', ['\u{2c07}', '\u{0}', '\u{0}']), ('\u{2c38}', ['\u{2c08}', '\u{0}', '\u{0}']), + ('\u{2c39}', ['\u{2c09}', '\u{0}', '\u{0}']), ('\u{2c3a}', ['\u{2c0a}', '\u{0}', '\u{0}']), + ('\u{2c3b}', ['\u{2c0b}', '\u{0}', '\u{0}']), ('\u{2c3c}', ['\u{2c0c}', '\u{0}', '\u{0}']), + ('\u{2c3d}', ['\u{2c0d}', '\u{0}', '\u{0}']), ('\u{2c3e}', ['\u{2c0e}', '\u{0}', '\u{0}']), + ('\u{2c3f}', ['\u{2c0f}', '\u{0}', '\u{0}']), ('\u{2c40}', ['\u{2c10}', '\u{0}', '\u{0}']), + ('\u{2c41}', ['\u{2c11}', '\u{0}', '\u{0}']), ('\u{2c42}', ['\u{2c12}', '\u{0}', '\u{0}']), + ('\u{2c43}', ['\u{2c13}', '\u{0}', '\u{0}']), ('\u{2c44}', ['\u{2c14}', '\u{0}', '\u{0}']), + ('\u{2c45}', ['\u{2c15}', '\u{0}', '\u{0}']), ('\u{2c46}', ['\u{2c16}', '\u{0}', '\u{0}']), + ('\u{2c47}', ['\u{2c17}', '\u{0}', '\u{0}']), ('\u{2c48}', ['\u{2c18}', '\u{0}', '\u{0}']), + ('\u{2c49}', ['\u{2c19}', '\u{0}', '\u{0}']), ('\u{2c4a}', ['\u{2c1a}', '\u{0}', '\u{0}']), + ('\u{2c4b}', ['\u{2c1b}', '\u{0}', '\u{0}']), ('\u{2c4c}', ['\u{2c1c}', '\u{0}', '\u{0}']), + ('\u{2c4d}', ['\u{2c1d}', '\u{0}', '\u{0}']), ('\u{2c4e}', ['\u{2c1e}', '\u{0}', '\u{0}']), + ('\u{2c4f}', ['\u{2c1f}', '\u{0}', '\u{0}']), ('\u{2c50}', ['\u{2c20}', '\u{0}', '\u{0}']), + ('\u{2c51}', ['\u{2c21}', '\u{0}', '\u{0}']), ('\u{2c52}', ['\u{2c22}', '\u{0}', '\u{0}']), + ('\u{2c53}', ['\u{2c23}', '\u{0}', '\u{0}']), ('\u{2c54}', ['\u{2c24}', '\u{0}', '\u{0}']), + ('\u{2c55}', ['\u{2c25}', '\u{0}', '\u{0}']), ('\u{2c56}', ['\u{2c26}', '\u{0}', '\u{0}']), + ('\u{2c57}', ['\u{2c27}', '\u{0}', '\u{0}']), ('\u{2c58}', ['\u{2c28}', '\u{0}', '\u{0}']), + ('\u{2c59}', ['\u{2c29}', '\u{0}', '\u{0}']), ('\u{2c5a}', ['\u{2c2a}', '\u{0}', '\u{0}']), + ('\u{2c5b}', ['\u{2c2b}', '\u{0}', '\u{0}']), ('\u{2c5c}', ['\u{2c2c}', '\u{0}', '\u{0}']), + ('\u{2c5d}', ['\u{2c2d}', '\u{0}', '\u{0}']), ('\u{2c5e}', ['\u{2c2e}', '\u{0}', '\u{0}']), + ('\u{2c61}', ['\u{2c60}', '\u{0}', '\u{0}']), ('\u{2c65}', ['\u{23a}', '\u{0}', '\u{0}']), + ('\u{2c66}', ['\u{23e}', '\u{0}', '\u{0}']), ('\u{2c68}', ['\u{2c67}', '\u{0}', '\u{0}']), + ('\u{2c6a}', ['\u{2c69}', '\u{0}', '\u{0}']), ('\u{2c6c}', ['\u{2c6b}', '\u{0}', '\u{0}']), + ('\u{2c73}', ['\u{2c72}', '\u{0}', '\u{0}']), ('\u{2c76}', ['\u{2c75}', '\u{0}', '\u{0}']), + ('\u{2c81}', ['\u{2c80}', '\u{0}', '\u{0}']), ('\u{2c83}', ['\u{2c82}', '\u{0}', '\u{0}']), + ('\u{2c85}', ['\u{2c84}', '\u{0}', '\u{0}']), ('\u{2c87}', ['\u{2c86}', '\u{0}', '\u{0}']), + ('\u{2c89}', ['\u{2c88}', '\u{0}', '\u{0}']), ('\u{2c8b}', ['\u{2c8a}', '\u{0}', '\u{0}']), + ('\u{2c8d}', ['\u{2c8c}', '\u{0}', '\u{0}']), ('\u{2c8f}', ['\u{2c8e}', '\u{0}', '\u{0}']), + ('\u{2c91}', ['\u{2c90}', '\u{0}', '\u{0}']), ('\u{2c93}', ['\u{2c92}', '\u{0}', '\u{0}']), + ('\u{2c95}', ['\u{2c94}', '\u{0}', '\u{0}']), ('\u{2c97}', ['\u{2c96}', '\u{0}', '\u{0}']), + ('\u{2c99}', ['\u{2c98}', '\u{0}', '\u{0}']), ('\u{2c9b}', ['\u{2c9a}', '\u{0}', '\u{0}']), + ('\u{2c9d}', ['\u{2c9c}', '\u{0}', '\u{0}']), ('\u{2c9f}', ['\u{2c9e}', '\u{0}', '\u{0}']), + ('\u{2ca1}', ['\u{2ca0}', '\u{0}', '\u{0}']), ('\u{2ca3}', ['\u{2ca2}', '\u{0}', '\u{0}']), + ('\u{2ca5}', ['\u{2ca4}', '\u{0}', '\u{0}']), ('\u{2ca7}', ['\u{2ca6}', '\u{0}', '\u{0}']), + ('\u{2ca9}', ['\u{2ca8}', '\u{0}', '\u{0}']), ('\u{2cab}', ['\u{2caa}', '\u{0}', '\u{0}']), + ('\u{2cad}', ['\u{2cac}', '\u{0}', '\u{0}']), ('\u{2caf}', ['\u{2cae}', '\u{0}', '\u{0}']), + ('\u{2cb1}', ['\u{2cb0}', '\u{0}', '\u{0}']), ('\u{2cb3}', ['\u{2cb2}', '\u{0}', '\u{0}']), + ('\u{2cb5}', ['\u{2cb4}', '\u{0}', '\u{0}']), ('\u{2cb7}', ['\u{2cb6}', '\u{0}', '\u{0}']), + ('\u{2cb9}', ['\u{2cb8}', '\u{0}', '\u{0}']), ('\u{2cbb}', ['\u{2cba}', '\u{0}', '\u{0}']), + ('\u{2cbd}', ['\u{2cbc}', '\u{0}', '\u{0}']), ('\u{2cbf}', ['\u{2cbe}', '\u{0}', '\u{0}']), + ('\u{2cc1}', ['\u{2cc0}', '\u{0}', '\u{0}']), ('\u{2cc3}', ['\u{2cc2}', '\u{0}', '\u{0}']), + ('\u{2cc5}', ['\u{2cc4}', '\u{0}', '\u{0}']), ('\u{2cc7}', ['\u{2cc6}', '\u{0}', '\u{0}']), + ('\u{2cc9}', ['\u{2cc8}', '\u{0}', '\u{0}']), ('\u{2ccb}', ['\u{2cca}', '\u{0}', '\u{0}']), + ('\u{2ccd}', ['\u{2ccc}', '\u{0}', '\u{0}']), ('\u{2ccf}', ['\u{2cce}', '\u{0}', '\u{0}']), + ('\u{2cd1}', ['\u{2cd0}', '\u{0}', '\u{0}']), ('\u{2cd3}', ['\u{2cd2}', '\u{0}', '\u{0}']), + ('\u{2cd5}', ['\u{2cd4}', '\u{0}', '\u{0}']), ('\u{2cd7}', ['\u{2cd6}', '\u{0}', '\u{0}']), + ('\u{2cd9}', ['\u{2cd8}', '\u{0}', '\u{0}']), ('\u{2cdb}', ['\u{2cda}', '\u{0}', '\u{0}']), + ('\u{2cdd}', ['\u{2cdc}', '\u{0}', '\u{0}']), ('\u{2cdf}', ['\u{2cde}', '\u{0}', '\u{0}']), + ('\u{2ce1}', ['\u{2ce0}', '\u{0}', '\u{0}']), ('\u{2ce3}', ['\u{2ce2}', '\u{0}', '\u{0}']), + ('\u{2cec}', ['\u{2ceb}', '\u{0}', '\u{0}']), ('\u{2cee}', ['\u{2ced}', '\u{0}', '\u{0}']), + ('\u{2cf3}', ['\u{2cf2}', '\u{0}', '\u{0}']), ('\u{2d00}', ['\u{10a0}', '\u{0}', '\u{0}']), + ('\u{2d01}', ['\u{10a1}', '\u{0}', '\u{0}']), ('\u{2d02}', ['\u{10a2}', '\u{0}', '\u{0}']), + ('\u{2d03}', ['\u{10a3}', '\u{0}', '\u{0}']), ('\u{2d04}', ['\u{10a4}', '\u{0}', '\u{0}']), + ('\u{2d05}', ['\u{10a5}', '\u{0}', '\u{0}']), ('\u{2d06}', ['\u{10a6}', '\u{0}', '\u{0}']), + ('\u{2d07}', ['\u{10a7}', '\u{0}', '\u{0}']), ('\u{2d08}', ['\u{10a8}', '\u{0}', '\u{0}']), + ('\u{2d09}', ['\u{10a9}', '\u{0}', '\u{0}']), ('\u{2d0a}', ['\u{10aa}', '\u{0}', '\u{0}']), + ('\u{2d0b}', ['\u{10ab}', '\u{0}', '\u{0}']), ('\u{2d0c}', ['\u{10ac}', '\u{0}', '\u{0}']), + ('\u{2d0d}', ['\u{10ad}', '\u{0}', '\u{0}']), ('\u{2d0e}', ['\u{10ae}', '\u{0}', '\u{0}']), + ('\u{2d0f}', ['\u{10af}', '\u{0}', '\u{0}']), ('\u{2d10}', ['\u{10b0}', '\u{0}', '\u{0}']), + ('\u{2d11}', ['\u{10b1}', '\u{0}', '\u{0}']), ('\u{2d12}', ['\u{10b2}', '\u{0}', '\u{0}']), + ('\u{2d13}', ['\u{10b3}', '\u{0}', '\u{0}']), ('\u{2d14}', ['\u{10b4}', '\u{0}', '\u{0}']), + ('\u{2d15}', ['\u{10b5}', '\u{0}', '\u{0}']), ('\u{2d16}', ['\u{10b6}', '\u{0}', '\u{0}']), + ('\u{2d17}', ['\u{10b7}', '\u{0}', '\u{0}']), ('\u{2d18}', ['\u{10b8}', '\u{0}', '\u{0}']), + ('\u{2d19}', ['\u{10b9}', '\u{0}', '\u{0}']), ('\u{2d1a}', ['\u{10ba}', '\u{0}', '\u{0}']), + ('\u{2d1b}', ['\u{10bb}', '\u{0}', '\u{0}']), ('\u{2d1c}', ['\u{10bc}', '\u{0}', '\u{0}']), + ('\u{2d1d}', ['\u{10bd}', '\u{0}', '\u{0}']), ('\u{2d1e}', ['\u{10be}', '\u{0}', '\u{0}']), + ('\u{2d1f}', ['\u{10bf}', '\u{0}', '\u{0}']), ('\u{2d20}', ['\u{10c0}', '\u{0}', '\u{0}']), + ('\u{2d21}', ['\u{10c1}', '\u{0}', '\u{0}']), ('\u{2d22}', ['\u{10c2}', '\u{0}', '\u{0}']), + ('\u{2d23}', ['\u{10c3}', '\u{0}', '\u{0}']), ('\u{2d24}', ['\u{10c4}', '\u{0}', '\u{0}']), + ('\u{2d25}', ['\u{10c5}', '\u{0}', '\u{0}']), ('\u{2d27}', ['\u{10c7}', '\u{0}', '\u{0}']), + ('\u{2d2d}', ['\u{10cd}', '\u{0}', '\u{0}']), ('\u{a641}', ['\u{a640}', '\u{0}', '\u{0}']), + ('\u{a643}', ['\u{a642}', '\u{0}', '\u{0}']), ('\u{a645}', ['\u{a644}', '\u{0}', '\u{0}']), + ('\u{a647}', ['\u{a646}', '\u{0}', '\u{0}']), ('\u{a649}', ['\u{a648}', '\u{0}', '\u{0}']), + ('\u{a64b}', ['\u{a64a}', '\u{0}', '\u{0}']), ('\u{a64d}', ['\u{a64c}', '\u{0}', '\u{0}']), + ('\u{a64f}', ['\u{a64e}', '\u{0}', '\u{0}']), ('\u{a651}', ['\u{a650}', '\u{0}', '\u{0}']), + ('\u{a653}', ['\u{a652}', '\u{0}', '\u{0}']), ('\u{a655}', ['\u{a654}', '\u{0}', '\u{0}']), + ('\u{a657}', ['\u{a656}', '\u{0}', '\u{0}']), ('\u{a659}', ['\u{a658}', '\u{0}', '\u{0}']), + ('\u{a65b}', ['\u{a65a}', '\u{0}', '\u{0}']), ('\u{a65d}', ['\u{a65c}', '\u{0}', '\u{0}']), + ('\u{a65f}', ['\u{a65e}', '\u{0}', '\u{0}']), ('\u{a661}', ['\u{a660}', '\u{0}', '\u{0}']), + ('\u{a663}', ['\u{a662}', '\u{0}', '\u{0}']), ('\u{a665}', ['\u{a664}', '\u{0}', '\u{0}']), + ('\u{a667}', ['\u{a666}', '\u{0}', '\u{0}']), ('\u{a669}', ['\u{a668}', '\u{0}', '\u{0}']), + ('\u{a66b}', ['\u{a66a}', '\u{0}', '\u{0}']), ('\u{a66d}', ['\u{a66c}', '\u{0}', '\u{0}']), + ('\u{a681}', ['\u{a680}', '\u{0}', '\u{0}']), ('\u{a683}', ['\u{a682}', '\u{0}', '\u{0}']), + ('\u{a685}', ['\u{a684}', '\u{0}', '\u{0}']), ('\u{a687}', ['\u{a686}', '\u{0}', '\u{0}']), + ('\u{a689}', ['\u{a688}', '\u{0}', '\u{0}']), ('\u{a68b}', ['\u{a68a}', '\u{0}', '\u{0}']), + ('\u{a68d}', ['\u{a68c}', '\u{0}', '\u{0}']), ('\u{a68f}', ['\u{a68e}', '\u{0}', '\u{0}']), + ('\u{a691}', ['\u{a690}', '\u{0}', '\u{0}']), ('\u{a693}', ['\u{a692}', '\u{0}', '\u{0}']), + ('\u{a695}', ['\u{a694}', '\u{0}', '\u{0}']), ('\u{a697}', ['\u{a696}', '\u{0}', '\u{0}']), + ('\u{a699}', ['\u{a698}', '\u{0}', '\u{0}']), ('\u{a69b}', ['\u{a69a}', '\u{0}', '\u{0}']), + ('\u{a723}', ['\u{a722}', '\u{0}', '\u{0}']), ('\u{a725}', ['\u{a724}', '\u{0}', '\u{0}']), + ('\u{a727}', ['\u{a726}', '\u{0}', '\u{0}']), ('\u{a729}', ['\u{a728}', '\u{0}', '\u{0}']), + ('\u{a72b}', ['\u{a72a}', '\u{0}', '\u{0}']), ('\u{a72d}', ['\u{a72c}', '\u{0}', '\u{0}']), + ('\u{a72f}', ['\u{a72e}', '\u{0}', '\u{0}']), ('\u{a733}', ['\u{a732}', '\u{0}', '\u{0}']), + ('\u{a735}', ['\u{a734}', '\u{0}', '\u{0}']), ('\u{a737}', ['\u{a736}', '\u{0}', '\u{0}']), + ('\u{a739}', ['\u{a738}', '\u{0}', '\u{0}']), ('\u{a73b}', ['\u{a73a}', '\u{0}', '\u{0}']), + ('\u{a73d}', ['\u{a73c}', '\u{0}', '\u{0}']), ('\u{a73f}', ['\u{a73e}', '\u{0}', '\u{0}']), + ('\u{a741}', ['\u{a740}', '\u{0}', '\u{0}']), ('\u{a743}', ['\u{a742}', '\u{0}', '\u{0}']), + ('\u{a745}', ['\u{a744}', '\u{0}', '\u{0}']), ('\u{a747}', ['\u{a746}', '\u{0}', '\u{0}']), + ('\u{a749}', ['\u{a748}', '\u{0}', '\u{0}']), ('\u{a74b}', ['\u{a74a}', '\u{0}', '\u{0}']), + ('\u{a74d}', ['\u{a74c}', '\u{0}', '\u{0}']), ('\u{a74f}', ['\u{a74e}', '\u{0}', '\u{0}']), + ('\u{a751}', ['\u{a750}', '\u{0}', '\u{0}']), ('\u{a753}', ['\u{a752}', '\u{0}', '\u{0}']), + ('\u{a755}', ['\u{a754}', '\u{0}', '\u{0}']), ('\u{a757}', ['\u{a756}', '\u{0}', '\u{0}']), + ('\u{a759}', ['\u{a758}', '\u{0}', '\u{0}']), ('\u{a75b}', ['\u{a75a}', '\u{0}', '\u{0}']), + ('\u{a75d}', ['\u{a75c}', '\u{0}', '\u{0}']), ('\u{a75f}', ['\u{a75e}', '\u{0}', '\u{0}']), + ('\u{a761}', ['\u{a760}', '\u{0}', '\u{0}']), ('\u{a763}', ['\u{a762}', '\u{0}', '\u{0}']), + ('\u{a765}', ['\u{a764}', '\u{0}', '\u{0}']), ('\u{a767}', ['\u{a766}', '\u{0}', '\u{0}']), + ('\u{a769}', ['\u{a768}', '\u{0}', '\u{0}']), ('\u{a76b}', ['\u{a76a}', '\u{0}', '\u{0}']), + ('\u{a76d}', ['\u{a76c}', '\u{0}', '\u{0}']), ('\u{a76f}', ['\u{a76e}', '\u{0}', '\u{0}']), + ('\u{a77a}', ['\u{a779}', '\u{0}', '\u{0}']), ('\u{a77c}', ['\u{a77b}', '\u{0}', '\u{0}']), + ('\u{a77f}', ['\u{a77e}', '\u{0}', '\u{0}']), ('\u{a781}', ['\u{a780}', '\u{0}', '\u{0}']), + ('\u{a783}', ['\u{a782}', '\u{0}', '\u{0}']), ('\u{a785}', ['\u{a784}', '\u{0}', '\u{0}']), + ('\u{a787}', ['\u{a786}', '\u{0}', '\u{0}']), ('\u{a78c}', ['\u{a78b}', '\u{0}', '\u{0}']), + ('\u{a791}', ['\u{a790}', '\u{0}', '\u{0}']), ('\u{a793}', ['\u{a792}', '\u{0}', '\u{0}']), + ('\u{a794}', ['\u{a7c4}', '\u{0}', '\u{0}']), ('\u{a797}', ['\u{a796}', '\u{0}', '\u{0}']), + ('\u{a799}', ['\u{a798}', '\u{0}', '\u{0}']), ('\u{a79b}', ['\u{a79a}', '\u{0}', '\u{0}']), + ('\u{a79d}', ['\u{a79c}', '\u{0}', '\u{0}']), ('\u{a79f}', ['\u{a79e}', '\u{0}', '\u{0}']), + ('\u{a7a1}', ['\u{a7a0}', '\u{0}', '\u{0}']), ('\u{a7a3}', ['\u{a7a2}', '\u{0}', '\u{0}']), + ('\u{a7a5}', ['\u{a7a4}', '\u{0}', '\u{0}']), ('\u{a7a7}', ['\u{a7a6}', '\u{0}', '\u{0}']), + ('\u{a7a9}', ['\u{a7a8}', '\u{0}', '\u{0}']), ('\u{a7b5}', ['\u{a7b4}', '\u{0}', '\u{0}']), + ('\u{a7b7}', ['\u{a7b6}', '\u{0}', '\u{0}']), ('\u{a7b9}', ['\u{a7b8}', '\u{0}', '\u{0}']), + ('\u{a7bb}', ['\u{a7ba}', '\u{0}', '\u{0}']), ('\u{a7bd}', ['\u{a7bc}', '\u{0}', '\u{0}']), + ('\u{a7bf}', ['\u{a7be}', '\u{0}', '\u{0}']), ('\u{a7c3}', ['\u{a7c2}', '\u{0}', '\u{0}']), + ('\u{ab53}', ['\u{a7b3}', '\u{0}', '\u{0}']), ('\u{ab70}', ['\u{13a0}', '\u{0}', '\u{0}']), + ('\u{ab71}', ['\u{13a1}', '\u{0}', '\u{0}']), ('\u{ab72}', ['\u{13a2}', '\u{0}', '\u{0}']), + ('\u{ab73}', ['\u{13a3}', '\u{0}', '\u{0}']), ('\u{ab74}', ['\u{13a4}', '\u{0}', '\u{0}']), + ('\u{ab75}', ['\u{13a5}', '\u{0}', '\u{0}']), ('\u{ab76}', ['\u{13a6}', '\u{0}', '\u{0}']), + ('\u{ab77}', ['\u{13a7}', '\u{0}', '\u{0}']), ('\u{ab78}', ['\u{13a8}', '\u{0}', '\u{0}']), + ('\u{ab79}', ['\u{13a9}', '\u{0}', '\u{0}']), ('\u{ab7a}', ['\u{13aa}', '\u{0}', '\u{0}']), + ('\u{ab7b}', ['\u{13ab}', '\u{0}', '\u{0}']), ('\u{ab7c}', ['\u{13ac}', '\u{0}', '\u{0}']), + ('\u{ab7d}', ['\u{13ad}', '\u{0}', '\u{0}']), ('\u{ab7e}', ['\u{13ae}', '\u{0}', '\u{0}']), + ('\u{ab7f}', ['\u{13af}', '\u{0}', '\u{0}']), ('\u{ab80}', ['\u{13b0}', '\u{0}', '\u{0}']), + ('\u{ab81}', ['\u{13b1}', '\u{0}', '\u{0}']), ('\u{ab82}', ['\u{13b2}', '\u{0}', '\u{0}']), + ('\u{ab83}', ['\u{13b3}', '\u{0}', '\u{0}']), ('\u{ab84}', ['\u{13b4}', '\u{0}', '\u{0}']), + ('\u{ab85}', ['\u{13b5}', '\u{0}', '\u{0}']), ('\u{ab86}', ['\u{13b6}', '\u{0}', '\u{0}']), + ('\u{ab87}', ['\u{13b7}', '\u{0}', '\u{0}']), ('\u{ab88}', ['\u{13b8}', '\u{0}', '\u{0}']), + ('\u{ab89}', ['\u{13b9}', '\u{0}', '\u{0}']), ('\u{ab8a}', ['\u{13ba}', '\u{0}', '\u{0}']), + ('\u{ab8b}', ['\u{13bb}', '\u{0}', '\u{0}']), ('\u{ab8c}', ['\u{13bc}', '\u{0}', '\u{0}']), + ('\u{ab8d}', ['\u{13bd}', '\u{0}', '\u{0}']), ('\u{ab8e}', ['\u{13be}', '\u{0}', '\u{0}']), + ('\u{ab8f}', ['\u{13bf}', '\u{0}', '\u{0}']), ('\u{ab90}', ['\u{13c0}', '\u{0}', '\u{0}']), + ('\u{ab91}', ['\u{13c1}', '\u{0}', '\u{0}']), ('\u{ab92}', ['\u{13c2}', '\u{0}', '\u{0}']), + ('\u{ab93}', ['\u{13c3}', '\u{0}', '\u{0}']), ('\u{ab94}', ['\u{13c4}', '\u{0}', '\u{0}']), + ('\u{ab95}', ['\u{13c5}', '\u{0}', '\u{0}']), ('\u{ab96}', ['\u{13c6}', '\u{0}', '\u{0}']), + ('\u{ab97}', ['\u{13c7}', '\u{0}', '\u{0}']), ('\u{ab98}', ['\u{13c8}', '\u{0}', '\u{0}']), + ('\u{ab99}', ['\u{13c9}', '\u{0}', '\u{0}']), ('\u{ab9a}', ['\u{13ca}', '\u{0}', '\u{0}']), + ('\u{ab9b}', ['\u{13cb}', '\u{0}', '\u{0}']), ('\u{ab9c}', ['\u{13cc}', '\u{0}', '\u{0}']), + ('\u{ab9d}', ['\u{13cd}', '\u{0}', '\u{0}']), ('\u{ab9e}', ['\u{13ce}', '\u{0}', '\u{0}']), + ('\u{ab9f}', ['\u{13cf}', '\u{0}', '\u{0}']), ('\u{aba0}', ['\u{13d0}', '\u{0}', '\u{0}']), + ('\u{aba1}', ['\u{13d1}', '\u{0}', '\u{0}']), ('\u{aba2}', ['\u{13d2}', '\u{0}', '\u{0}']), + ('\u{aba3}', ['\u{13d3}', '\u{0}', '\u{0}']), ('\u{aba4}', ['\u{13d4}', '\u{0}', '\u{0}']), + ('\u{aba5}', ['\u{13d5}', '\u{0}', '\u{0}']), ('\u{aba6}', ['\u{13d6}', '\u{0}', '\u{0}']), + ('\u{aba7}', ['\u{13d7}', '\u{0}', '\u{0}']), ('\u{aba8}', ['\u{13d8}', '\u{0}', '\u{0}']), + ('\u{aba9}', ['\u{13d9}', '\u{0}', '\u{0}']), ('\u{abaa}', ['\u{13da}', '\u{0}', '\u{0}']), + ('\u{abab}', ['\u{13db}', '\u{0}', '\u{0}']), ('\u{abac}', ['\u{13dc}', '\u{0}', '\u{0}']), + ('\u{abad}', ['\u{13dd}', '\u{0}', '\u{0}']), ('\u{abae}', ['\u{13de}', '\u{0}', '\u{0}']), + ('\u{abaf}', ['\u{13df}', '\u{0}', '\u{0}']), ('\u{abb0}', ['\u{13e0}', '\u{0}', '\u{0}']), + ('\u{abb1}', ['\u{13e1}', '\u{0}', '\u{0}']), ('\u{abb2}', ['\u{13e2}', '\u{0}', '\u{0}']), + ('\u{abb3}', ['\u{13e3}', '\u{0}', '\u{0}']), ('\u{abb4}', ['\u{13e4}', '\u{0}', '\u{0}']), + ('\u{abb5}', ['\u{13e5}', '\u{0}', '\u{0}']), ('\u{abb6}', ['\u{13e6}', '\u{0}', '\u{0}']), + ('\u{abb7}', ['\u{13e7}', '\u{0}', '\u{0}']), ('\u{abb8}', ['\u{13e8}', '\u{0}', '\u{0}']), + ('\u{abb9}', ['\u{13e9}', '\u{0}', '\u{0}']), ('\u{abba}', ['\u{13ea}', '\u{0}', '\u{0}']), + ('\u{abbb}', ['\u{13eb}', '\u{0}', '\u{0}']), ('\u{abbc}', ['\u{13ec}', '\u{0}', '\u{0}']), + ('\u{abbd}', ['\u{13ed}', '\u{0}', '\u{0}']), ('\u{abbe}', ['\u{13ee}', '\u{0}', '\u{0}']), + ('\u{abbf}', ['\u{13ef}', '\u{0}', '\u{0}']), ('\u{fb00}', ['F', 'F', '\u{0}']), + ('\u{fb01}', ['F', 'I', '\u{0}']), ('\u{fb02}', ['F', 'L', '\u{0}']), + ('\u{fb03}', ['F', 'F', 'I']), ('\u{fb04}', ['F', 'F', 'L']), + ('\u{fb05}', ['S', 'T', '\u{0}']), ('\u{fb06}', ['S', 'T', '\u{0}']), + ('\u{fb13}', ['\u{544}', '\u{546}', '\u{0}']), + ('\u{fb14}', ['\u{544}', '\u{535}', '\u{0}']), + ('\u{fb15}', ['\u{544}', '\u{53b}', '\u{0}']), + ('\u{fb16}', ['\u{54e}', '\u{546}', '\u{0}']), + ('\u{fb17}', ['\u{544}', '\u{53d}', '\u{0}']), ('\u{ff41}', ['\u{ff21}', '\u{0}', '\u{0}']), + ('\u{ff42}', ['\u{ff22}', '\u{0}', '\u{0}']), ('\u{ff43}', ['\u{ff23}', '\u{0}', '\u{0}']), + ('\u{ff44}', ['\u{ff24}', '\u{0}', '\u{0}']), ('\u{ff45}', ['\u{ff25}', '\u{0}', '\u{0}']), + ('\u{ff46}', ['\u{ff26}', '\u{0}', '\u{0}']), ('\u{ff47}', ['\u{ff27}', '\u{0}', '\u{0}']), + ('\u{ff48}', ['\u{ff28}', '\u{0}', '\u{0}']), ('\u{ff49}', ['\u{ff29}', '\u{0}', '\u{0}']), + ('\u{ff4a}', ['\u{ff2a}', '\u{0}', '\u{0}']), ('\u{ff4b}', ['\u{ff2b}', '\u{0}', '\u{0}']), + ('\u{ff4c}', ['\u{ff2c}', '\u{0}', '\u{0}']), ('\u{ff4d}', ['\u{ff2d}', '\u{0}', '\u{0}']), + ('\u{ff4e}', ['\u{ff2e}', '\u{0}', '\u{0}']), ('\u{ff4f}', ['\u{ff2f}', '\u{0}', '\u{0}']), + ('\u{ff50}', ['\u{ff30}', '\u{0}', '\u{0}']), ('\u{ff51}', ['\u{ff31}', '\u{0}', '\u{0}']), + ('\u{ff52}', ['\u{ff32}', '\u{0}', '\u{0}']), ('\u{ff53}', ['\u{ff33}', '\u{0}', '\u{0}']), + ('\u{ff54}', ['\u{ff34}', '\u{0}', '\u{0}']), ('\u{ff55}', ['\u{ff35}', '\u{0}', '\u{0}']), + ('\u{ff56}', ['\u{ff36}', '\u{0}', '\u{0}']), ('\u{ff57}', ['\u{ff37}', '\u{0}', '\u{0}']), + ('\u{ff58}', ['\u{ff38}', '\u{0}', '\u{0}']), ('\u{ff59}', ['\u{ff39}', '\u{0}', '\u{0}']), + ('\u{ff5a}', ['\u{ff3a}', '\u{0}', '\u{0}']), + ('\u{10428}', ['\u{10400}', '\u{0}', '\u{0}']), + ('\u{10429}', ['\u{10401}', '\u{0}', '\u{0}']), + ('\u{1042a}', ['\u{10402}', '\u{0}', '\u{0}']), + ('\u{1042b}', ['\u{10403}', '\u{0}', '\u{0}']), + ('\u{1042c}', ['\u{10404}', '\u{0}', '\u{0}']), + ('\u{1042d}', ['\u{10405}', '\u{0}', '\u{0}']), + ('\u{1042e}', ['\u{10406}', '\u{0}', '\u{0}']), + ('\u{1042f}', ['\u{10407}', '\u{0}', '\u{0}']), + ('\u{10430}', ['\u{10408}', '\u{0}', '\u{0}']), + ('\u{10431}', ['\u{10409}', '\u{0}', '\u{0}']), + ('\u{10432}', ['\u{1040a}', '\u{0}', '\u{0}']), + ('\u{10433}', ['\u{1040b}', '\u{0}', '\u{0}']), + ('\u{10434}', ['\u{1040c}', '\u{0}', '\u{0}']), + ('\u{10435}', ['\u{1040d}', '\u{0}', '\u{0}']), + ('\u{10436}', ['\u{1040e}', '\u{0}', '\u{0}']), + ('\u{10437}', ['\u{1040f}', '\u{0}', '\u{0}']), + ('\u{10438}', ['\u{10410}', '\u{0}', '\u{0}']), + ('\u{10439}', ['\u{10411}', '\u{0}', '\u{0}']), + ('\u{1043a}', ['\u{10412}', '\u{0}', '\u{0}']), + ('\u{1043b}', ['\u{10413}', '\u{0}', '\u{0}']), + ('\u{1043c}', ['\u{10414}', '\u{0}', '\u{0}']), + ('\u{1043d}', ['\u{10415}', '\u{0}', '\u{0}']), + ('\u{1043e}', ['\u{10416}', '\u{0}', '\u{0}']), + ('\u{1043f}', ['\u{10417}', '\u{0}', '\u{0}']), + ('\u{10440}', ['\u{10418}', '\u{0}', '\u{0}']), + ('\u{10441}', ['\u{10419}', '\u{0}', '\u{0}']), + ('\u{10442}', ['\u{1041a}', '\u{0}', '\u{0}']), + ('\u{10443}', ['\u{1041b}', '\u{0}', '\u{0}']), + ('\u{10444}', ['\u{1041c}', '\u{0}', '\u{0}']), + ('\u{10445}', ['\u{1041d}', '\u{0}', '\u{0}']), + ('\u{10446}', ['\u{1041e}', '\u{0}', '\u{0}']), + ('\u{10447}', ['\u{1041f}', '\u{0}', '\u{0}']), + ('\u{10448}', ['\u{10420}', '\u{0}', '\u{0}']), + ('\u{10449}', ['\u{10421}', '\u{0}', '\u{0}']), + ('\u{1044a}', ['\u{10422}', '\u{0}', '\u{0}']), + ('\u{1044b}', ['\u{10423}', '\u{0}', '\u{0}']), + ('\u{1044c}', ['\u{10424}', '\u{0}', '\u{0}']), + ('\u{1044d}', ['\u{10425}', '\u{0}', '\u{0}']), + ('\u{1044e}', ['\u{10426}', '\u{0}', '\u{0}']), + ('\u{1044f}', ['\u{10427}', '\u{0}', '\u{0}']), + ('\u{104d8}', ['\u{104b0}', '\u{0}', '\u{0}']), + ('\u{104d9}', ['\u{104b1}', '\u{0}', '\u{0}']), + ('\u{104da}', ['\u{104b2}', '\u{0}', '\u{0}']), + ('\u{104db}', ['\u{104b3}', '\u{0}', '\u{0}']), + ('\u{104dc}', ['\u{104b4}', '\u{0}', '\u{0}']), + ('\u{104dd}', ['\u{104b5}', '\u{0}', '\u{0}']), + ('\u{104de}', ['\u{104b6}', '\u{0}', '\u{0}']), + ('\u{104df}', ['\u{104b7}', '\u{0}', '\u{0}']), + ('\u{104e0}', ['\u{104b8}', '\u{0}', '\u{0}']), + ('\u{104e1}', ['\u{104b9}', '\u{0}', '\u{0}']), + ('\u{104e2}', ['\u{104ba}', '\u{0}', '\u{0}']), + ('\u{104e3}', ['\u{104bb}', '\u{0}', '\u{0}']), + ('\u{104e4}', ['\u{104bc}', '\u{0}', '\u{0}']), + ('\u{104e5}', ['\u{104bd}', '\u{0}', '\u{0}']), + ('\u{104e6}', ['\u{104be}', '\u{0}', '\u{0}']), + ('\u{104e7}', ['\u{104bf}', '\u{0}', '\u{0}']), + ('\u{104e8}', ['\u{104c0}', '\u{0}', '\u{0}']), + ('\u{104e9}', ['\u{104c1}', '\u{0}', '\u{0}']), + ('\u{104ea}', ['\u{104c2}', '\u{0}', '\u{0}']), + ('\u{104eb}', ['\u{104c3}', '\u{0}', '\u{0}']), + ('\u{104ec}', ['\u{104c4}', '\u{0}', '\u{0}']), + ('\u{104ed}', ['\u{104c5}', '\u{0}', '\u{0}']), + ('\u{104ee}', ['\u{104c6}', '\u{0}', '\u{0}']), + ('\u{104ef}', ['\u{104c7}', '\u{0}', '\u{0}']), + ('\u{104f0}', ['\u{104c8}', '\u{0}', '\u{0}']), + ('\u{104f1}', ['\u{104c9}', '\u{0}', '\u{0}']), + ('\u{104f2}', ['\u{104ca}', '\u{0}', '\u{0}']), + ('\u{104f3}', ['\u{104cb}', '\u{0}', '\u{0}']), + ('\u{104f4}', ['\u{104cc}', '\u{0}', '\u{0}']), + ('\u{104f5}', ['\u{104cd}', '\u{0}', '\u{0}']), + ('\u{104f6}', ['\u{104ce}', '\u{0}', '\u{0}']), + ('\u{104f7}', ['\u{104cf}', '\u{0}', '\u{0}']), + ('\u{104f8}', ['\u{104d0}', '\u{0}', '\u{0}']), + ('\u{104f9}', ['\u{104d1}', '\u{0}', '\u{0}']), + ('\u{104fa}', ['\u{104d2}', '\u{0}', '\u{0}']), + ('\u{104fb}', ['\u{104d3}', '\u{0}', '\u{0}']), + ('\u{10cc0}', ['\u{10c80}', '\u{0}', '\u{0}']), + ('\u{10cc1}', ['\u{10c81}', '\u{0}', '\u{0}']), + ('\u{10cc2}', ['\u{10c82}', '\u{0}', '\u{0}']), + ('\u{10cc3}', ['\u{10c83}', '\u{0}', '\u{0}']), + ('\u{10cc4}', ['\u{10c84}', '\u{0}', '\u{0}']), + ('\u{10cc5}', ['\u{10c85}', '\u{0}', '\u{0}']), + ('\u{10cc6}', ['\u{10c86}', '\u{0}', '\u{0}']), + ('\u{10cc7}', ['\u{10c87}', '\u{0}', '\u{0}']), + ('\u{10cc8}', ['\u{10c88}', '\u{0}', '\u{0}']), + ('\u{10cc9}', ['\u{10c89}', '\u{0}', '\u{0}']), + ('\u{10cca}', ['\u{10c8a}', '\u{0}', '\u{0}']), + ('\u{10ccb}', ['\u{10c8b}', '\u{0}', '\u{0}']), + ('\u{10ccc}', ['\u{10c8c}', '\u{0}', '\u{0}']), + ('\u{10ccd}', ['\u{10c8d}', '\u{0}', '\u{0}']), + ('\u{10cce}', ['\u{10c8e}', '\u{0}', '\u{0}']), + ('\u{10ccf}', ['\u{10c8f}', '\u{0}', '\u{0}']), + ('\u{10cd0}', ['\u{10c90}', '\u{0}', '\u{0}']), + ('\u{10cd1}', ['\u{10c91}', '\u{0}', '\u{0}']), + ('\u{10cd2}', ['\u{10c92}', '\u{0}', '\u{0}']), + ('\u{10cd3}', ['\u{10c93}', '\u{0}', '\u{0}']), + ('\u{10cd4}', ['\u{10c94}', '\u{0}', '\u{0}']), + ('\u{10cd5}', ['\u{10c95}', '\u{0}', '\u{0}']), + ('\u{10cd6}', ['\u{10c96}', '\u{0}', '\u{0}']), + ('\u{10cd7}', ['\u{10c97}', '\u{0}', '\u{0}']), + ('\u{10cd8}', ['\u{10c98}', '\u{0}', '\u{0}']), + ('\u{10cd9}', ['\u{10c99}', '\u{0}', '\u{0}']), + ('\u{10cda}', ['\u{10c9a}', '\u{0}', '\u{0}']), + ('\u{10cdb}', ['\u{10c9b}', '\u{0}', '\u{0}']), + ('\u{10cdc}', ['\u{10c9c}', '\u{0}', '\u{0}']), + ('\u{10cdd}', ['\u{10c9d}', '\u{0}', '\u{0}']), + ('\u{10cde}', ['\u{10c9e}', '\u{0}', '\u{0}']), + ('\u{10cdf}', ['\u{10c9f}', '\u{0}', '\u{0}']), + ('\u{10ce0}', ['\u{10ca0}', '\u{0}', '\u{0}']), + ('\u{10ce1}', ['\u{10ca1}', '\u{0}', '\u{0}']), + ('\u{10ce2}', ['\u{10ca2}', '\u{0}', '\u{0}']), + ('\u{10ce3}', ['\u{10ca3}', '\u{0}', '\u{0}']), + ('\u{10ce4}', ['\u{10ca4}', '\u{0}', '\u{0}']), + ('\u{10ce5}', ['\u{10ca5}', '\u{0}', '\u{0}']), + ('\u{10ce6}', ['\u{10ca6}', '\u{0}', '\u{0}']), + ('\u{10ce7}', ['\u{10ca7}', '\u{0}', '\u{0}']), + ('\u{10ce8}', ['\u{10ca8}', '\u{0}', '\u{0}']), + ('\u{10ce9}', ['\u{10ca9}', '\u{0}', '\u{0}']), + ('\u{10cea}', ['\u{10caa}', '\u{0}', '\u{0}']), + ('\u{10ceb}', ['\u{10cab}', '\u{0}', '\u{0}']), + ('\u{10cec}', ['\u{10cac}', '\u{0}', '\u{0}']), + ('\u{10ced}', ['\u{10cad}', '\u{0}', '\u{0}']), + ('\u{10cee}', ['\u{10cae}', '\u{0}', '\u{0}']), + ('\u{10cef}', ['\u{10caf}', '\u{0}', '\u{0}']), + ('\u{10cf0}', ['\u{10cb0}', '\u{0}', '\u{0}']), + ('\u{10cf1}', ['\u{10cb1}', '\u{0}', '\u{0}']), + ('\u{10cf2}', ['\u{10cb2}', '\u{0}', '\u{0}']), + ('\u{118c0}', ['\u{118a0}', '\u{0}', '\u{0}']), + ('\u{118c1}', ['\u{118a1}', '\u{0}', '\u{0}']), + ('\u{118c2}', ['\u{118a2}', '\u{0}', '\u{0}']), + ('\u{118c3}', ['\u{118a3}', '\u{0}', '\u{0}']), + ('\u{118c4}', ['\u{118a4}', '\u{0}', '\u{0}']), + ('\u{118c5}', ['\u{118a5}', '\u{0}', '\u{0}']), + ('\u{118c6}', ['\u{118a6}', '\u{0}', '\u{0}']), + ('\u{118c7}', ['\u{118a7}', '\u{0}', '\u{0}']), + ('\u{118c8}', ['\u{118a8}', '\u{0}', '\u{0}']), + ('\u{118c9}', ['\u{118a9}', '\u{0}', '\u{0}']), + ('\u{118ca}', ['\u{118aa}', '\u{0}', '\u{0}']), + ('\u{118cb}', ['\u{118ab}', '\u{0}', '\u{0}']), + ('\u{118cc}', ['\u{118ac}', '\u{0}', '\u{0}']), + ('\u{118cd}', ['\u{118ad}', '\u{0}', '\u{0}']), + ('\u{118ce}', ['\u{118ae}', '\u{0}', '\u{0}']), + ('\u{118cf}', ['\u{118af}', '\u{0}', '\u{0}']), + ('\u{118d0}', ['\u{118b0}', '\u{0}', '\u{0}']), + ('\u{118d1}', ['\u{118b1}', '\u{0}', '\u{0}']), + ('\u{118d2}', ['\u{118b2}', '\u{0}', '\u{0}']), + ('\u{118d3}', ['\u{118b3}', '\u{0}', '\u{0}']), + ('\u{118d4}', ['\u{118b4}', '\u{0}', '\u{0}']), + ('\u{118d5}', ['\u{118b5}', '\u{0}', '\u{0}']), + ('\u{118d6}', ['\u{118b6}', '\u{0}', '\u{0}']), + ('\u{118d7}', ['\u{118b7}', '\u{0}', '\u{0}']), + ('\u{118d8}', ['\u{118b8}', '\u{0}', '\u{0}']), + ('\u{118d9}', ['\u{118b9}', '\u{0}', '\u{0}']), + ('\u{118da}', ['\u{118ba}', '\u{0}', '\u{0}']), + ('\u{118db}', ['\u{118bb}', '\u{0}', '\u{0}']), + ('\u{118dc}', ['\u{118bc}', '\u{0}', '\u{0}']), + ('\u{118dd}', ['\u{118bd}', '\u{0}', '\u{0}']), + ('\u{118de}', ['\u{118be}', '\u{0}', '\u{0}']), + ('\u{118df}', ['\u{118bf}', '\u{0}', '\u{0}']), + ('\u{16e60}', ['\u{16e40}', '\u{0}', '\u{0}']), + ('\u{16e61}', ['\u{16e41}', '\u{0}', '\u{0}']), + ('\u{16e62}', ['\u{16e42}', '\u{0}', '\u{0}']), + ('\u{16e63}', ['\u{16e43}', '\u{0}', '\u{0}']), + ('\u{16e64}', ['\u{16e44}', '\u{0}', '\u{0}']), + ('\u{16e65}', ['\u{16e45}', '\u{0}', '\u{0}']), + ('\u{16e66}', ['\u{16e46}', '\u{0}', '\u{0}']), + ('\u{16e67}', ['\u{16e47}', '\u{0}', '\u{0}']), + ('\u{16e68}', ['\u{16e48}', '\u{0}', '\u{0}']), + ('\u{16e69}', ['\u{16e49}', '\u{0}', '\u{0}']), + ('\u{16e6a}', ['\u{16e4a}', '\u{0}', '\u{0}']), + ('\u{16e6b}', ['\u{16e4b}', '\u{0}', '\u{0}']), + ('\u{16e6c}', ['\u{16e4c}', '\u{0}', '\u{0}']), + ('\u{16e6d}', ['\u{16e4d}', '\u{0}', '\u{0}']), + ('\u{16e6e}', ['\u{16e4e}', '\u{0}', '\u{0}']), + ('\u{16e6f}', ['\u{16e4f}', '\u{0}', '\u{0}']), + ('\u{16e70}', ['\u{16e50}', '\u{0}', '\u{0}']), + ('\u{16e71}', ['\u{16e51}', '\u{0}', '\u{0}']), + ('\u{16e72}', ['\u{16e52}', '\u{0}', '\u{0}']), + ('\u{16e73}', ['\u{16e53}', '\u{0}', '\u{0}']), + ('\u{16e74}', ['\u{16e54}', '\u{0}', '\u{0}']), + ('\u{16e75}', ['\u{16e55}', '\u{0}', '\u{0}']), + ('\u{16e76}', ['\u{16e56}', '\u{0}', '\u{0}']), + ('\u{16e77}', ['\u{16e57}', '\u{0}', '\u{0}']), + ('\u{16e78}', ['\u{16e58}', '\u{0}', '\u{0}']), + ('\u{16e79}', ['\u{16e59}', '\u{0}', '\u{0}']), + ('\u{16e7a}', ['\u{16e5a}', '\u{0}', '\u{0}']), + ('\u{16e7b}', ['\u{16e5b}', '\u{0}', '\u{0}']), + ('\u{16e7c}', ['\u{16e5c}', '\u{0}', '\u{0}']), + ('\u{16e7d}', ['\u{16e5d}', '\u{0}', '\u{0}']), + ('\u{16e7e}', ['\u{16e5e}', '\u{0}', '\u{0}']), + ('\u{16e7f}', ['\u{16e5f}', '\u{0}', '\u{0}']), + ('\u{1e922}', ['\u{1e900}', '\u{0}', '\u{0}']), + ('\u{1e923}', ['\u{1e901}', '\u{0}', '\u{0}']), + ('\u{1e924}', ['\u{1e902}', '\u{0}', '\u{0}']), + ('\u{1e925}', ['\u{1e903}', '\u{0}', '\u{0}']), + ('\u{1e926}', ['\u{1e904}', '\u{0}', '\u{0}']), + ('\u{1e927}', ['\u{1e905}', '\u{0}', '\u{0}']), + ('\u{1e928}', ['\u{1e906}', '\u{0}', '\u{0}']), + ('\u{1e929}', ['\u{1e907}', '\u{0}', '\u{0}']), + ('\u{1e92a}', ['\u{1e908}', '\u{0}', '\u{0}']), + ('\u{1e92b}', ['\u{1e909}', '\u{0}', '\u{0}']), + ('\u{1e92c}', ['\u{1e90a}', '\u{0}', '\u{0}']), + ('\u{1e92d}', ['\u{1e90b}', '\u{0}', '\u{0}']), + ('\u{1e92e}', ['\u{1e90c}', '\u{0}', '\u{0}']), + ('\u{1e92f}', ['\u{1e90d}', '\u{0}', '\u{0}']), + ('\u{1e930}', ['\u{1e90e}', '\u{0}', '\u{0}']), + ('\u{1e931}', ['\u{1e90f}', '\u{0}', '\u{0}']), + ('\u{1e932}', ['\u{1e910}', '\u{0}', '\u{0}']), + ('\u{1e933}', ['\u{1e911}', '\u{0}', '\u{0}']), + ('\u{1e934}', ['\u{1e912}', '\u{0}', '\u{0}']), + ('\u{1e935}', ['\u{1e913}', '\u{0}', '\u{0}']), + ('\u{1e936}', ['\u{1e914}', '\u{0}', '\u{0}']), + ('\u{1e937}', ['\u{1e915}', '\u{0}', '\u{0}']), + ('\u{1e938}', ['\u{1e916}', '\u{0}', '\u{0}']), + ('\u{1e939}', ['\u{1e917}', '\u{0}', '\u{0}']), + ('\u{1e93a}', ['\u{1e918}', '\u{0}', '\u{0}']), + ('\u{1e93b}', ['\u{1e919}', '\u{0}', '\u{0}']), + ('\u{1e93c}', ['\u{1e91a}', '\u{0}', '\u{0}']), + ('\u{1e93d}', ['\u{1e91b}', '\u{0}', '\u{0}']), + ('\u{1e93e}', ['\u{1e91c}', '\u{0}', '\u{0}']), + ('\u{1e93f}', ['\u{1e91d}', '\u{0}', '\u{0}']), + ('\u{1e940}', ['\u{1e91e}', '\u{0}', '\u{0}']), + ('\u{1e941}', ['\u{1e91f}', '\u{0}', '\u{0}']), + ('\u{1e942}', ['\u{1e920}', '\u{0}', '\u{0}']), + ('\u{1e943}', ['\u{1e921}', '\u{0}', '\u{0}']), + ]; +} diff --git a/src/libfmt_macros/Cargo.toml b/src/libfmt_macros/Cargo.toml index fff4ec716d..01608701a7 100644 --- a/src/libfmt_macros/Cargo.toml +++ b/src/libfmt_macros/Cargo.toml @@ -9,5 +9,5 @@ name = "fmt_macros" path = "lib.rs" [dependencies] -syntax_pos = { path = "../libsyntax_pos" } +rustc_span = { path = "../librustc_span" } rustc_lexer = { path = "../librustc_lexer" } diff --git a/src/libfmt_macros/lib.rs b/src/libfmt_macros/lib.rs index 2ecbe77072..9ca7eee999 100644 --- a/src/libfmt_macros/lib.rs +++ b/src/libfmt_macros/lib.rs @@ -4,26 +4,27 @@ //! Parsing does not happen at runtime: structures of `std::fmt::rt` are //! generated instead. -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - html_playground_url = "https://play.rust-lang.org/", - test(attr(deny(warnings))))] - +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + html_playground_url = "https://play.rust-lang.org/", + test(attr(deny(warnings))) +)] #![feature(nll)] #![feature(rustc_private)] #![feature(unicode_internals)] #![feature(bool_to_option)] -pub use Piece::*; -pub use Position::*; pub use Alignment::*; -pub use Flag::*; pub use Count::*; +pub use Flag::*; +pub use Piece::*; +pub use Position::*; +use std::iter; use std::str; use std::string; -use std::iter; -use syntax_pos::{InnerSpan, Symbol}; +use rustc_span::{InnerSpan, Symbol}; #[derive(Copy, Clone)] struct InnerOffset(usize); @@ -219,9 +220,7 @@ impl<'a> Iterator for Parser<'a> { None } } - '\n' => { - Some(String(self.string(pos))) - } + '\n' => Some(String(self.string(pos))), _ => Some(String(self.string(pos))), } } else { @@ -272,7 +271,11 @@ impl<'a> Parser<'a> { /// Notifies of an error. The message doesn't actually need to be of type /// String, but I think it does when this eventually uses conditions so it /// might as well start using it now. - fn err_with_note, S2: Into, S3: Into>( + fn err_with_note< + S1: Into, + S2: Into, + S3: Into, + >( &mut self, description: S1, label: S2, @@ -340,10 +343,13 @@ impl<'a> Parser<'a> { let description = format!("expected `'}}'`, found `{:?}`", maybe); let label = "expected `}`".to_owned(); let (note, secondary_label) = if c == '}' { - (Some("if you intended to print `{`, you can escape it using `{{`".to_owned()), - self.last_opening_brace.map(|sp| { - ("because of this opening brace".to_owned(), sp) - })) + ( + Some( + "if you intended to print `{`, you can escape it using `{{`".to_owned(), + ), + self.last_opening_brace + .map(|sp| ("because of this opening brace".to_owned(), sp)), + ) } else { (None, None) }; @@ -364,10 +370,13 @@ impl<'a> Parser<'a> { if c == '}' { let label = format!("expected `{:?}`", c); let (note, secondary_label) = if c == '}' { - (Some("if you intended to print `{`, you can escape it using `{{`".to_owned()), - self.last_opening_brace.map(|sp| { - ("because of this opening brace".to_owned(), sp) - })) + ( + Some( + "if you intended to print `{`, you can escape it using `{{`".to_owned(), + ), + self.last_opening_brace + .map(|sp| ("because of this opening brace".to_owned(), sp)), + ) } else { (None, None) }; @@ -428,10 +437,7 @@ impl<'a> Parser<'a> { } }; - Argument { - position: pos, - format, - } + Argument { position: pos, format } } /// Parses a positional argument for a format. This could either be an @@ -517,11 +523,7 @@ impl<'a> Parser<'a> { } } if !havewidth { - let width_span_start = if let Some((pos, _)) = self.cur.peek() { - *pos - } else { - 0 - }; + let width_span_start = if let Some((pos, _)) = self.cur.peek() { *pos } else { 0 }; let (w, sp) = self.count(width_span_start); spec.width = w; spec.width_span = sp; diff --git a/src/libfmt_macros/tests.rs b/src/libfmt_macros/tests.rs index 81359033ed..98c2a17f0d 100644 --- a/src/libfmt_macros/tests.rs +++ b/src/libfmt_macros/tests.rs @@ -58,27 +58,15 @@ fn invalid06() { #[test] fn format_nothing() { - same("{}", - &[NextArgument(Argument { - position: ArgumentImplicitlyIs(0), - format: fmtdflt(), - })]); + same("{}", &[NextArgument(Argument { position: ArgumentImplicitlyIs(0), format: fmtdflt() })]); } #[test] fn format_position() { - same("{3}", - &[NextArgument(Argument { - position: ArgumentIs(3), - format: fmtdflt(), - })]); + same("{3}", &[NextArgument(Argument { position: ArgumentIs(3), format: fmtdflt() })]); } #[test] fn format_position_nothing_else() { - same("{3:}", - &[NextArgument(Argument { - position: ArgumentIs(3), - format: fmtdflt(), - })]); + same("{3:}", &[NextArgument(Argument { position: ArgumentIs(3), format: fmtdflt() })]); } #[test] fn format_type() { @@ -97,7 +85,8 @@ fn format_type() { ty: "x", ty_span: None, }, - })]); + })], + ); } #[test] fn format_align_fill() { @@ -116,7 +105,8 @@ fn format_align_fill() { ty: "", ty_span: None, }, - })]); + })], + ); same( "{3:0<}", &[NextArgument(Argument { @@ -132,7 +122,8 @@ fn format_align_fill() { ty: "", ty_span: None, }, - })]); + })], + ); same( "{3:* { @@ -402,7 +403,7 @@ impl<'a> Id<'a> { Some(c) if c.is_ascii_alphabetic() || c == '_' => {} _ => return Err(()), } - if !name.chars().all(|c| c.is_ascii_alphanumeric() || c == '_' ) { + if !name.chars().all(|c| c.is_ascii_alphanumeric() || c == '_') { return Err(()); } @@ -475,10 +476,7 @@ pub trait Labeller<'a> { /// Escape tags in such a way that it is suitable for inclusion in a /// Graphviz HTML label. pub fn escape_html(s: &str) -> String { - s.replace("&", "&") - .replace("\"", """) - .replace("<", "<") - .replace(">", ">") + s.replace("&", "&").replace("\"", """).replace("<", "<").replace(">", ">") } impl<'a> LabelText<'a> { @@ -495,7 +493,8 @@ impl<'a> LabelText<'a> { } fn escape_char(c: char, mut f: F) - where F: FnMut(char) + where + F: FnMut(char), { match c { // not escaping \\, since Graphviz escString needs to @@ -559,8 +558,8 @@ impl<'a> LabelText<'a> { } } -pub type Nodes<'a,N> = Cow<'a,[N]>; -pub type Edges<'a,E> = Cow<'a,[E]>; +pub type Nodes<'a, N> = Cow<'a, [N]>; +pub type Edges<'a, E> = Cow<'a, [E]>; // (The type parameters in GraphWalk should be associated items, // when/if Rust supports such.) @@ -607,25 +606,24 @@ pub fn default_options() -> Vec { /// Renders directed graph `g` into the writer `w` in DOT syntax. /// (Simple wrapper around `render_opts` that passes a default set of options.) -pub fn render<'a,N,E,G,W>(g: &'a G, w: &mut W) -> io::Result<()> - where N: Clone + 'a, - E: Clone + 'a, - G: Labeller<'a, Node=N, Edge=E> + GraphWalk<'a, Node=N, Edge=E>, - W: Write +pub fn render<'a, N, E, G, W>(g: &'a G, w: &mut W) -> io::Result<()> +where + N: Clone + 'a, + E: Clone + 'a, + G: Labeller<'a, Node = N, Edge = E> + GraphWalk<'a, Node = N, Edge = E>, + W: Write, { render_opts(g, w, &[]) } /// Renders directed graph `g` into the writer `w` in DOT syntax. /// (Main entry point for the library.) -pub fn render_opts<'a, N, E, G, W>(g: &'a G, - w: &mut W, - options: &[RenderOption]) - -> io::Result<()> - where N: Clone + 'a, - E: Clone + 'a, - G: Labeller<'a, Node=N, Edge=E> + GraphWalk<'a, Node=N, Edge=E>, - W: Write +pub fn render_opts<'a, N, E, G, W>(g: &'a G, w: &mut W, options: &[RenderOption]) -> io::Result<()> +where + N: Clone + 'a, + E: Clone + 'a, + G: Labeller<'a, Node = N, Edge = E> + GraphWalk<'a, Node = N, Edge = E>, + W: Write, { writeln!(w, "digraph {} {{", g.graph_id().as_slice())?; for n in g.nodes().iter() { diff --git a/src/libgraphviz/tests.rs b/src/libgraphviz/tests.rs index 2f713579b1..055e13156a 100644 --- a/src/libgraphviz/tests.rs +++ b/src/libgraphviz/tests.rs @@ -1,8 +1,8 @@ -use NodeLabels::*; -use super::{Id, Labeller, Nodes, Edges, GraphWalk, render, Style}; -use super::LabelText::{self, LabelStr, EscStr, HtmlStr}; +use super::LabelText::{self, EscStr, HtmlStr, LabelStr}; +use super::{render, Edges, GraphWalk, Id, Labeller, Nodes, Style}; use std::io; use std::io::prelude::*; +use NodeLabels::*; /// each node is an index in a vector in the graph. type Node = usize; @@ -14,12 +14,7 @@ struct Edge { } fn edge(from: usize, to: usize, label: &'static str, style: Style) -> Edge { - Edge { - from, - to, - label, - style, - } + Edge { from, to, label, style } } struct LabelledGraph { @@ -75,11 +70,12 @@ impl NodeLabels<&'static str> { } impl LabelledGraph { - fn new(name: &'static str, - node_labels: Trivial, - edges: Vec, - node_styles: Option>) - -> LabelledGraph { + fn new( + name: &'static str, + node_labels: Trivial, + edges: Vec, + node_styles: Option>, + ) -> LabelledGraph { let count = node_labels.len(); LabelledGraph { name, @@ -94,10 +90,7 @@ impl LabelledGraph { } impl LabelledGraphWithEscStrs { - fn new(name: &'static str, - node_labels: Trivial, - edges: Vec) - -> LabelledGraphWithEscStrs { + fn new(name: &'static str, node_labels: Trivial, edges: Vec) -> LabelledGraphWithEscStrs { LabelledGraphWithEscStrs { graph: LabelledGraph::new(name, node_labels, edges, None) } } } @@ -203,21 +196,25 @@ fn test_input(g: LabelledGraph) -> io::Result { fn empty_graph() { let labels: Trivial = UnlabelledNodes(0); let r = test_input(LabelledGraph::new("empty_graph", labels, vec![], None)); - assert_eq!(r.unwrap(), -r#"digraph empty_graph { + assert_eq!( + r.unwrap(), + r#"digraph empty_graph { } -"#); +"# + ); } #[test] fn single_node() { let labels: Trivial = UnlabelledNodes(1); let r = test_input(LabelledGraph::new("single_node", labels, vec![], None)); - assert_eq!(r.unwrap(), -r#"digraph single_node { + assert_eq!( + r.unwrap(), + r#"digraph single_node { N0[label="N0"]; } -"#); +"# + ); } #[test] @@ -225,89 +222,112 @@ fn single_node_with_style() { let labels: Trivial = UnlabelledNodes(1); let styles = Some(vec![Style::Dashed]); let r = test_input(LabelledGraph::new("single_node", labels, vec![], styles)); - assert_eq!(r.unwrap(), -r#"digraph single_node { + assert_eq!( + r.unwrap(), + r#"digraph single_node { N0[label="N0"][style="dashed"]; } -"#); +"# + ); } #[test] fn single_edge() { let labels: Trivial = UnlabelledNodes(2); - let result = test_input(LabelledGraph::new("single_edge", - labels, - vec![edge(0, 1, "E", Style::None)], - None)); - assert_eq!(result.unwrap(), -r#"digraph single_edge { + let result = test_input(LabelledGraph::new( + "single_edge", + labels, + vec![edge(0, 1, "E", Style::None)], + None, + )); + assert_eq!( + result.unwrap(), + r#"digraph single_edge { N0[label="N0"]; N1[label="N1"]; N0 -> N1[label="E"]; } -"#); +"# + ); } #[test] fn single_edge_with_style() { let labels: Trivial = UnlabelledNodes(2); - let result = test_input(LabelledGraph::new("single_edge", - labels, - vec![edge(0, 1, "E", Style::Bold)], - None)); - assert_eq!(result.unwrap(), -r#"digraph single_edge { + let result = test_input(LabelledGraph::new( + "single_edge", + labels, + vec![edge(0, 1, "E", Style::Bold)], + None, + )); + assert_eq!( + result.unwrap(), + r#"digraph single_edge { N0[label="N0"]; N1[label="N1"]; N0 -> N1[label="E"][style="bold"]; } -"#); +"# + ); } #[test] fn test_some_labelled() { let labels: Trivial = SomeNodesLabelled(vec![Some("A"), None]); let styles = Some(vec![Style::None, Style::Dotted]); - let result = test_input(LabelledGraph::new("test_some_labelled", - labels, - vec![edge(0, 1, "A-1", Style::None)], - styles)); - assert_eq!(result.unwrap(), -r#"digraph test_some_labelled { + let result = test_input(LabelledGraph::new( + "test_some_labelled", + labels, + vec![edge(0, 1, "A-1", Style::None)], + styles, + )); + assert_eq!( + result.unwrap(), + r#"digraph test_some_labelled { N0[label="A"]; N1[label="N1"][style="dotted"]; N0 -> N1[label="A-1"]; } -"#); +"# + ); } #[test] fn single_cyclic_node() { let labels: Trivial = UnlabelledNodes(1); - let r = test_input(LabelledGraph::new("single_cyclic_node", - labels, - vec![edge(0, 0, "E", Style::None)], - None)); - assert_eq!(r.unwrap(), -r#"digraph single_cyclic_node { + let r = test_input(LabelledGraph::new( + "single_cyclic_node", + labels, + vec![edge(0, 0, "E", Style::None)], + None, + )); + assert_eq!( + r.unwrap(), + r#"digraph single_cyclic_node { N0[label="N0"]; N0 -> N0[label="E"]; } -"#); +"# + ); } #[test] fn hasse_diagram() { let labels = AllNodesLabelled(vec!["{x,y}", "{x}", "{y}", "{}"]); - let r = test_input(LabelledGraph::new("hasse_diagram", - labels, - vec![edge(0, 1, "", Style::None), - edge(0, 2, "", Style::None), - edge(1, 3, "", Style::None), - edge(2, 3, "", Style::None)], - None)); - assert_eq!(r.unwrap(), -r#"digraph hasse_diagram { + let r = test_input(LabelledGraph::new( + "hasse_diagram", + labels, + vec![ + edge(0, 1, "", Style::None), + edge(0, 2, "", Style::None), + edge(1, 3, "", Style::None), + edge(2, 3, "", Style::None), + ], + None, + )); + assert_eq!( + r.unwrap(), + r#"digraph hasse_diagram { N0[label="{x,y}"]; N1[label="{x}"]; N2[label="{y}"]; @@ -317,7 +337,8 @@ r#"digraph hasse_diagram { N1 -> N3[label=""]; N2 -> N3[label=""]; } -"#); +"# + ); } #[test] @@ -332,23 +353,29 @@ fn left_aligned_text() { \\l", "branch1", "branch2", - "afterward"]); + "afterward", + ]); let mut writer = Vec::new(); - let g = LabelledGraphWithEscStrs::new("syntax_tree", - labels, - vec![edge(0, 1, "then", Style::None), - edge(0, 2, "else", Style::None), - edge(1, 3, ";", Style::None), - edge(2, 3, ";", Style::None)]); + let g = LabelledGraphWithEscStrs::new( + "syntax_tree", + labels, + vec![ + edge(0, 1, "then", Style::None), + edge(0, 2, "else", Style::None), + edge(1, 3, ";", Style::None), + edge(2, 3, ";", Style::None), + ], + ); render(&g, &mut writer).unwrap(); let mut r = String::new(); Read::read_to_string(&mut &*writer, &mut r).unwrap(); - assert_eq!(r, -r#"digraph syntax_tree { + assert_eq!( + r, + r#"digraph syntax_tree { N0[label="if test {\l branch1\l} else {\l branch2\l}\lafterward\l"]; N1[label="branch1"]; N2[label="branch2"]; @@ -358,7 +385,8 @@ r#"digraph syntax_tree { N1 -> N3[label=";"]; N2 -> N3[label=";"]; } -"#); +"# + ); } #[test] diff --git a/src/libpanic_abort/lib.rs b/src/libpanic_abort/lib.rs index 5509f47bc8..db7c250e21 100644 --- a/src/libpanic_abort/lib.rs +++ b/src/libpanic_abort/lib.rs @@ -5,12 +5,12 @@ #![no_std] #![unstable(feature = "panic_abort", issue = "32837")] -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/")] +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/" +)] #![panic_runtime] - #![allow(unused_features)] - #![feature(core_intrinsics)] #![feature(libc)] #![feature(nll)] @@ -21,10 +21,12 @@ // Rust's "try" function, but if we're aborting on panics we just call the // function as there's nothing else we need to do here. #[rustc_std_internal_symbol] -pub unsafe extern fn __rust_maybe_catch_panic(f: fn(*mut u8), - data: *mut u8, - _data_ptr: *mut usize, - _vtable_ptr: *mut usize) -> u32 { +pub unsafe extern "C" fn __rust_maybe_catch_panic( + f: fn(*mut u8), + data: *mut u8, + _data_ptr: *mut usize, + _vtable_ptr: *mut usize, +) -> u32 { f(data); 0 } @@ -40,7 +42,7 @@ pub unsafe extern fn __rust_maybe_catch_panic(f: fn(*mut u8), // will kill us with an illegal instruction, which will do a good enough job for // now hopefully. #[rustc_std_internal_symbol] -pub unsafe extern fn __rust_start_panic(_payload: usize) -> u32 { +pub unsafe extern "C" fn __rust_start_panic(_payload: usize) -> u32 { abort(); #[cfg(any(unix, target_os = "cloudabi"))] @@ -48,17 +50,17 @@ pub unsafe extern fn __rust_start_panic(_payload: usize) -> u32 { libc::abort(); } - #[cfg(any(windows, - all(target_arch = "wasm32", not(target_os = "emscripten"))))] + #[cfg(any(windows, all(target_arch = "wasm32", not(target_os = "emscripten"))))] unsafe fn abort() -> ! { core::intrinsics::abort(); } - #[cfg(any(target_os = "hermit", - all(target_vendor="fortanix", target_env="sgx")))] + #[cfg(any(target_os = "hermit", all(target_vendor = "fortanix", target_env = "sgx")))] unsafe fn abort() -> ! { // call std::sys::abort_internal - extern "C" { pub fn __rust_abort() -> !; } + extern "C" { + pub fn __rust_abort() -> !; + } __rust_abort(); } } @@ -92,28 +94,21 @@ pub unsafe extern fn __rust_start_panic(_payload: usize) -> u32 { pub mod personalities { #[no_mangle] #[cfg(not(any( - all( - target_arch = "wasm32", - not(target_os = "emscripten"), - ), - all( - target_os = "windows", - target_env = "gnu", - target_arch = "x86_64", - ), + all(target_arch = "wasm32", not(target_os = "emscripten"),), + all(target_os = "windows", target_env = "gnu", target_arch = "x86_64",), )))] - pub extern fn rust_eh_personality() {} + pub extern "C" fn rust_eh_personality() {} // On x86_64-pc-windows-gnu we use our own personality function that needs // to return `ExceptionContinueSearch` as we're passing on all our frames. #[no_mangle] - #[cfg(all(target_os = "windows", - target_env = "gnu", - target_arch = "x86_64"))] - pub extern fn rust_eh_personality(_record: usize, - _frame: usize, - _context: usize, - _dispatcher: usize) -> u32 { + #[cfg(all(target_os = "windows", target_env = "gnu", target_arch = "x86_64"))] + pub extern "C" fn rust_eh_personality( + _record: usize, + _frame: usize, + _context: usize, + _dispatcher: usize, + ) -> u32 { 1 // `ExceptionContinueSearch` } @@ -124,14 +119,14 @@ pub mod personalities { // body is empty. #[no_mangle] #[cfg(all(target_os = "windows", target_env = "gnu"))] - pub extern fn rust_eh_unwind_resume() {} + pub extern "C" fn rust_eh_unwind_resume() {} // These two are called by our startup objects on i686-pc-windows-gnu, but // they don't need to do anything so the bodies are nops. #[no_mangle] #[cfg(all(target_os = "windows", target_env = "gnu", target_arch = "x86"))] - pub extern fn rust_eh_register_frames() {} + pub extern "C" fn rust_eh_register_frames() {} #[no_mangle] #[cfg(all(target_os = "windows", target_env = "gnu", target_arch = "x86"))] - pub extern fn rust_eh_unregister_frames() {} + pub extern "C" fn rust_eh_unregister_frames() {} } diff --git a/src/libpanic_unwind/dwarf/eh.rs b/src/libpanic_unwind/dwarf/eh.rs index 242eb6750b..302478cfac 100644 --- a/src/libpanic_unwind/dwarf/eh.rs +++ b/src/libpanic_unwind/dwarf/eh.rs @@ -36,8 +36,8 @@ pub const DW_EH_PE_indirect: u8 = 0x80; #[derive(Copy, Clone)] pub struct EHContext<'a> { - pub ip: usize, // Current instruction pointer - pub func_start: usize, // Address of the current function + pub ip: usize, // Current instruction pointer + pub func_start: usize, // Address of the current function pub get_text_start: &'a dyn Fn() -> usize, // Get address of the code section pub get_data_start: &'a dyn Fn() -> usize, // Get address of the data section } @@ -51,11 +51,13 @@ pub enum EHAction { pub const USING_SJLJ_EXCEPTIONS: bool = cfg!(all(target_os = "ios", target_arch = "arm")); -pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>, foreign_exception: bool) - -> Result -{ +pub unsafe fn find_eh_action( + lsda: *const u8, + context: &EHContext<'_>, + foreign_exception: bool, +) -> Result { if lsda.is_null() { - return Ok(EHAction::None) + return Ok(EHAction::None); } let func_start = context.func_start; @@ -93,10 +95,10 @@ pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>, foreign_e } if ip < func_start + cs_start + cs_len { if cs_lpad == 0 { - return Ok(EHAction::None) + return Ok(EHAction::None); } else { let lpad = lpad_base + cs_lpad; - return Ok(interpret_cs_action(cs_action, lpad, foreign_exception)) + return Ok(interpret_cs_action(cs_action, lpad, foreign_exception)); } } } @@ -121,7 +123,7 @@ pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>, foreign_e // Can never have null landing pad for sjlj -- that would have // been indicated by a -1 call site index. let lpad = (cs_lpad + 1) as usize; - return Ok(interpret_cs_action(cs_action, lpad, foreign_exception)) + return Ok(interpret_cs_action(cs_action, lpad, foreign_exception)); } } } @@ -144,25 +146,22 @@ fn interpret_cs_action(cs_action: u64, lpad: usize, foreign_exception: bool) -> #[inline] fn round_up(unrounded: usize, align: usize) -> Result { - if align.is_power_of_two() { - Ok((unrounded + align - 1) & !(align - 1)) - } else { - Err(()) - } + if align.is_power_of_two() { Ok((unrounded + align - 1) & !(align - 1)) } else { Err(()) } } -unsafe fn read_encoded_pointer(reader: &mut DwarfReader, - context: &EHContext<'_>, - encoding: u8) - -> Result { +unsafe fn read_encoded_pointer( + reader: &mut DwarfReader, + context: &EHContext<'_>, + encoding: u8, +) -> Result { if encoding == DW_EH_PE_omit { - return Err(()) + return Err(()); } // DW_EH_PE_aligned implies it's an absolute pointer value if encoding == DW_EH_PE_aligned { reader.ptr = round_up(reader.ptr as usize, mem::size_of::())? as *const u8; - return Ok(reader.read::()) + return Ok(reader.read::()); } let mut result = match encoding & 0x0F { @@ -184,7 +183,7 @@ unsafe fn read_encoded_pointer(reader: &mut DwarfReader, DW_EH_PE_pcrel => reader.ptr as usize, DW_EH_PE_funcrel => { if context.func_start == 0 { - return Err(()) + return Err(()); } context.func_start } diff --git a/src/libpanic_unwind/dwarf/mod.rs b/src/libpanic_unwind/dwarf/mod.rs index 34128e60d3..649bbce52a 100644 --- a/src/libpanic_unwind/dwarf/mod.rs +++ b/src/libpanic_unwind/dwarf/mod.rs @@ -17,7 +17,7 @@ pub struct DwarfReader { pub ptr: *const u8, } -#[repr(C,packed)] +#[repr(C, packed)] struct Unaligned(T); impl DwarfReader { diff --git a/src/libpanic_unwind/emcc.rs b/src/libpanic_unwind/emcc.rs index 3d0d5a4151..9161d49959 100644 --- a/src/libpanic_unwind/emcc.rs +++ b/src/libpanic_unwind/emcc.rs @@ -8,10 +8,10 @@ #![allow(private_no_mangle_fns)] +use alloc::boxed::Box; use core::any::Any; -use core::ptr; use core::mem; -use alloc::boxed::Box; +use core::ptr; use libc::{self, c_int}; use unwind as uw; @@ -52,32 +52,60 @@ pub fn payload() -> *mut u8 { ptr::null_mut() } +struct Exception { + // This needs to be an Option because the object's lifetime follows C++ + // semantics: when catch_unwind moves the Box out of the exception it must + // still leave the exception object in a valid state because its destructor + // is still going to be called by __cxa_end_catch.. + data: Option>, +} + pub unsafe fn cleanup(ptr: *mut u8) -> Box { assert!(!ptr.is_null()); - let adjusted_ptr = __cxa_begin_catch(ptr as *mut libc::c_void); - let ex = ptr::read(adjusted_ptr as *mut _); + let adjusted_ptr = __cxa_begin_catch(ptr as *mut libc::c_void) as *mut Exception; + let ex = (*adjusted_ptr).data.take(); __cxa_end_catch(); - ex + ex.unwrap() } pub unsafe fn panic(data: Box) -> u32 { let sz = mem::size_of_val(&data); - let exception = __cxa_allocate_exception(sz); - if exception == ptr::null_mut() { + let exception = __cxa_allocate_exception(sz) as *mut Exception; + if exception.is_null() { return uw::_URC_FATAL_PHASE1_ERROR as u32; } - ptr::write(exception as *mut _, data); - __cxa_throw(exception as *mut _, &EXCEPTION_TYPE_INFO, ptr::null_mut()); + ptr::write(exception, Exception { data: Some(data) }); + __cxa_throw(exception as *mut _, &EXCEPTION_TYPE_INFO, exception_cleanup); +} + +// On WASM and ARM, the destructor returns the pointer to the object. +cfg_if::cfg_if! { + if #[cfg(any(target_arch = "arm", target_arch = "wasm32"))] { + type DestructorRet = *mut libc::c_void; + } else { + type DestructorRet = (); + } +} +extern "C" fn exception_cleanup(ptr: *mut libc::c_void) -> DestructorRet { + unsafe { + if let Some(b) = (ptr as *mut Exception).read().data { + drop(b); + super::__rust_drop_panic(); + } + #[cfg(any(target_arch = "arm", target_arch = "wasm32"))] + ptr + } } #[lang = "eh_personality"] #[no_mangle] -unsafe extern "C" fn rust_eh_personality(version: c_int, - actions: uw::_Unwind_Action, - exception_class: uw::_Unwind_Exception_Class, - exception_object: *mut uw::_Unwind_Exception, - context: *mut uw::_Unwind_Context) - -> uw::_Unwind_Reason_Code { +unsafe extern "C" fn rust_eh_personality( + version: c_int, + actions: uw::_Unwind_Action, + exception_class: uw::_Unwind_Exception_Class, + exception_object: *mut uw::_Unwind_Exception, + context: *mut uw::_Unwind_Context, +) -> uw::_Unwind_Reason_Code { __gxx_personality_v0(version, actions, exception_class, exception_object, context) } @@ -85,13 +113,16 @@ extern "C" { fn __cxa_allocate_exception(thrown_size: libc::size_t) -> *mut libc::c_void; fn __cxa_begin_catch(thrown_exception: *mut libc::c_void) -> *mut libc::c_void; fn __cxa_end_catch(); - fn __cxa_throw(thrown_exception: *mut libc::c_void, - tinfo: *const TypeInfo, - dest: *mut libc::c_void) -> !; - fn __gxx_personality_v0(version: c_int, - actions: uw::_Unwind_Action, - exception_class: uw::_Unwind_Exception_Class, - exception_object: *mut uw::_Unwind_Exception, - context: *mut uw::_Unwind_Context) - -> uw::_Unwind_Reason_Code; + fn __cxa_throw( + thrown_exception: *mut libc::c_void, + tinfo: *const TypeInfo, + dest: extern "C" fn(*mut libc::c_void) -> DestructorRet, + ) -> !; + fn __gxx_personality_v0( + version: c_int, + actions: uw::_Unwind_Action, + exception_class: uw::_Unwind_Exception_Class, + exception_object: *mut uw::_Unwind_Exception, + context: *mut uw::_Unwind_Context, + ) -> uw::_Unwind_Reason_Code; } diff --git a/src/libpanic_unwind/gcc.rs b/src/libpanic_unwind/gcc.rs index 4f572fe21b..591ff9d7fd 100644 --- a/src/libpanic_unwind/gcc.rs +++ b/src/libpanic_unwind/gcc.rs @@ -4,7 +4,7 @@ //! "Exception Handling in LLVM" (llvm.org/docs/ExceptionHandling.html) and //! documents linked from it. //! These are also good reads: -//! http://mentorembedded.github.io/cxx-abi/abi-eh.html +//! https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html //! http://monoinfinito.wordpress.com/series/exception-handling-in-c/ //! http://www.airs.com/blog/index.php?s=exception+frames //! @@ -46,18 +46,18 @@ #![allow(private_no_mangle_fns)] +use alloc::boxed::Box; use core::any::Any; use core::ptr; -use alloc::boxed::Box; -use unwind as uw; +use crate::dwarf::eh::{self, EHAction, EHContext}; use libc::{c_int, uintptr_t}; -use crate::dwarf::eh::{self, EHContext, EHAction}; +use unwind as uw; #[repr(C)] struct Exception { _uwe: uw::_Unwind_Exception, - cause: Option>, + cause: Box, } pub unsafe fn panic(data: Box) -> u32 { @@ -67,15 +67,18 @@ pub unsafe fn panic(data: Box) -> u32 { exception_cleanup, private: [0; uw::unwinder_private_data_size], }, - cause: Some(data), + cause: data, }); let exception_param = Box::into_raw(exception) as *mut uw::_Unwind_Exception; return uw::_Unwind_RaiseException(exception_param) as u32; - extern "C" fn exception_cleanup(_unwind_code: uw::_Unwind_Reason_Code, - exception: *mut uw::_Unwind_Exception) { + extern "C" fn exception_cleanup( + _unwind_code: uw::_Unwind_Reason_Code, + exception: *mut uw::_Unwind_Exception, + ) { unsafe { let _: Box = Box::from_raw(exception as *mut Exception); + super::__rust_drop_panic(); } } } @@ -85,10 +88,8 @@ pub fn payload() -> *mut u8 { } pub unsafe fn cleanup(ptr: *mut u8) -> Box { - let my_ep = ptr as *mut Exception; - let cause = (*my_ep).cause.take(); - uw::_Unwind_DeleteException(ptr as *mut _); - cause.unwrap() + let exception = Box::from_raw(ptr as *mut Exception); + exception.cause } // Rust's exception class identifier. This is used by personality routines to @@ -98,7 +99,6 @@ fn rust_exception_class() -> uw::_Unwind_Exception_Class { 0x4d4f5a_00_52555354 } - // Register ids were lifted from LLVM's TargetLowering::getExceptionPointerRegister() // and TargetLowering::getExceptionSelectorRegister() for each architecture, // then mapped to DWARF register numbers via register definition tables @@ -129,6 +129,9 @@ const UNWIND_DATA_REG: (i32, i32) = (24, 25); // I0, I1 #[cfg(target_arch = "hexagon")] const UNWIND_DATA_REG: (i32, i32) = (0, 1); // R0, R1 +#[cfg(target_arch = "riscv64")] +const UNWIND_DATA_REG: (i32, i32) = (10, 11); // x10, x11 + // The following code is based on GCC's C and C++ personality routines. For reference, see: // https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/libsupc++/eh_personality.cc // https://github.com/gcc-mirror/gcc/blob/trunk/libgcc/unwind-c.c @@ -187,7 +190,13 @@ cfg_if::cfg_if! { match eh_action { EHAction::None | EHAction::Cleanup(_) => return continue_unwind(exception_object, context), - EHAction::Catch(_) => return uw::_URC_HANDLER_FOUND, + EHAction::Catch(_) => { + // EHABI requires the personality routine to update the + // SP value in the barrier cache of the exception object. + (*exception_object).private[5] = + uw::_Unwind_GetGR(context, uw::UNWIND_SP_REG); + return uw::_URC_HANDLER_FOUND; + } EHAction::Terminate => return uw::_URC_FAILURE, } } else { @@ -302,9 +311,10 @@ cfg_if::cfg_if! { } } -unsafe fn find_eh_action(context: *mut uw::_Unwind_Context, foreign_exception: bool) - -> Result -{ +unsafe fn find_eh_action( + context: *mut uw::_Unwind_Context, + foreign_exception: bool, +) -> Result { let lsda = uw::_Unwind_GetLanguageSpecificData(context) as *const u8; let mut ip_before_instr: c_int = 0; let ip = uw::_Unwind_GetIPInfo(context, &mut ip_before_instr); @@ -320,7 +330,11 @@ unsafe fn find_eh_action(context: *mut uw::_Unwind_Context, foreign_exception: b } // See docs in the `unwind` module. -#[cfg(all(target_os="windows", any(target_arch = "x86", target_arch = "x86_64"), target_env="gnu"))] +#[cfg(all( + target_os = "windows", + any(target_arch = "x86", target_arch = "x86_64"), + target_env = "gnu" +))] #[lang = "eh_unwind_resume"] #[unwind(allowed)] unsafe extern "C" fn rust_eh_unwind_resume(panic_ctx: *mut u8) -> ! { @@ -343,7 +357,7 @@ unsafe extern "C" fn rust_eh_unwind_resume(panic_ctx: *mut u8) -> ! { // implementation of stack unwinding is (for now) deferred to libgcc_eh, however // Rust crates use these Rust-specific entry points to avoid potential clashes // with any GCC runtime. -#[cfg(all(target_os="windows", target_arch = "x86", target_env="gnu"))] +#[cfg(all(target_os = "windows", target_arch = "x86", target_env = "gnu"))] pub mod eh_frame_registry { extern "C" { fn __register_frame_info(eh_frame_begin: *const u8, object: *mut u8); @@ -356,8 +370,7 @@ pub mod eh_frame_registry { } #[no_mangle] - pub unsafe extern "C" fn rust_eh_unregister_frames(eh_frame_begin: *const u8, - object: *mut u8) { + pub unsafe extern "C" fn rust_eh_unregister_frames(eh_frame_begin: *const u8, object: *mut u8) { __deregister_frame_info(eh_frame_begin, object); } } diff --git a/src/libpanic_unwind/hermit.rs b/src/libpanic_unwind/hermit.rs index 8bee6ff09e..2f53df2861 100644 --- a/src/libpanic_unwind/hermit.rs +++ b/src/libpanic_unwind/hermit.rs @@ -3,19 +3,23 @@ //! Right now we don't support this, so this is just stubs. use alloc::boxed::Box; -use core::ptr; use core::any::Any; +use core::ptr; pub fn payload() -> *mut u8 { ptr::null_mut() } pub unsafe fn cleanup(_ptr: *mut u8) -> Box { - extern "C" { pub fn __rust_abort() -> !; } + extern "C" { + pub fn __rust_abort() -> !; + } __rust_abort(); } pub unsafe fn panic(_data: Box) -> u32 { - extern "C" { pub fn __rust_abort() -> !; } + extern "C" { + pub fn __rust_abort() -> !; + } __rust_abort(); } diff --git a/src/libpanic_unwind/lib.rs b/src/libpanic_unwind/lib.rs index 3a14197c77..6383ae39fb 100644 --- a/src/libpanic_unwind/lib.rs +++ b/src/libpanic_unwind/lib.rs @@ -13,9 +13,10 @@ #![no_std] #![unstable(feature = "panic_unwind", issue = "32837")] -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/")] - +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/" +)] #![feature(core_intrinsics)] #![feature(lang_items)] #![feature(libc)] @@ -25,15 +26,15 @@ #![feature(staged_api)] #![feature(std_internals)] #![feature(unwind_attributes)] - +#![feature(abi_thiscall)] #![panic_runtime] #![feature(panic_runtime)] use alloc::boxed::Box; use core::intrinsics; use core::mem; -use core::raw; use core::panic::BoxMeUp; +use core::raw; cfg_if::cfg_if! { if #[cfg(target_os = "emscripten")] { @@ -60,6 +61,12 @@ cfg_if::cfg_if! { } } +extern "C" { + /// Handler in libstd called when a panic object is dropped outside of + /// `catch_unwind`. + fn __rust_drop_panic() -> !; +} + mod dwarf; // Entry point for catching an exception, implemented using the `try` intrinsic @@ -69,11 +76,12 @@ mod dwarf; // hairy and tightly coupled, for more information see the compiler's // implementation of this. #[no_mangle] -pub unsafe extern "C" fn __rust_maybe_catch_panic(f: fn(*mut u8), - data: *mut u8, - data_ptr: *mut usize, - vtable_ptr: *mut usize) - -> u32 { +pub unsafe extern "C" fn __rust_maybe_catch_panic( + f: fn(*mut u8), + data: *mut u8, + data_ptr: *mut usize, + vtable_ptr: *mut usize, +) -> u32 { let mut payload = imp::payload(); if intrinsics::r#try(f, data, &mut payload as *mut _ as *mut _) == 0 { 0 diff --git a/src/libpanic_unwind/seh.rs b/src/libpanic_unwind/seh.rs index ff9a215d33..d9dca2c0f4 100644 --- a/src/libpanic_unwind/seh.rs +++ b/src/libpanic_unwind/seh.rs @@ -41,7 +41,7 @@ //! are then recovered in the filter function to be written to the stack frame //! of the `try` intrinsic. //! -//! [win64]: http://msdn.microsoft.com/en-us/library/1eyas8tf.aspx +//! [win64]: https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64 //! [llvm]: http://llvm.org/docs/ExceptionHandling.html#background-on-windows-exceptions #![allow(nonstandard_style)] @@ -77,8 +77,11 @@ use libc::{c_int, c_uint, c_void}; // #include // // struct rust_panic { +// rust_panic(const rust_panic&); +// ~rust_panic(); +// // uint64_t x[2]; -// } +// }; // // void foo() { // rust_panic a = {0, 1}; @@ -99,8 +102,12 @@ mod imp { pub type ptr_t = *mut u8; macro_rules! ptr { - (0) => (core::ptr::null_mut()); - ($e:expr) => ($e as *mut u8); + (0) => { + core::ptr::null_mut() + }; + ($e:expr) => { + $e as *mut u8 + }; } } @@ -124,7 +131,7 @@ mod imp { #[repr(C)] pub struct _ThrowInfo { pub attributes: c_uint, - pub pnfnUnwind: imp::ptr_t, + pub pmfnUnwind: imp::ptr_t, pub pForwardCompat: imp::ptr_t, pub pCatchableTypeArray: imp::ptr_t, } @@ -141,7 +148,7 @@ pub struct _CatchableType { pub pType: imp::ptr_t, pub thisDisplacement: _PMD, pub sizeOrOffset: c_int, - pub copy_function: imp::ptr_t, + pub copyFunction: imp::ptr_t, } #[repr(C)] @@ -164,26 +171,20 @@ const TYPE_NAME: [u8; 11] = *b"rust_panic\0"; static mut THROW_INFO: _ThrowInfo = _ThrowInfo { attributes: 0, - pnfnUnwind: ptr!(0), + pmfnUnwind: ptr!(0), pForwardCompat: ptr!(0), pCatchableTypeArray: ptr!(0), }; -static mut CATCHABLE_TYPE_ARRAY: _CatchableTypeArray = _CatchableTypeArray { - nCatchableTypes: 1, - arrayOfCatchableTypes: [ptr!(0)], -}; +static mut CATCHABLE_TYPE_ARRAY: _CatchableTypeArray = + _CatchableTypeArray { nCatchableTypes: 1, arrayOfCatchableTypes: [ptr!(0)] }; static mut CATCHABLE_TYPE: _CatchableType = _CatchableType { properties: 0, pType: ptr!(0), - thisDisplacement: _PMD { - mdisp: 0, - pdisp: -1, - vdisp: 0, - }, + thisDisplacement: _PMD { mdisp: 0, pdisp: -1, vdisp: 0 }, sizeOrOffset: mem::size_of::<[u64; 2]>() as c_int, - copy_function: ptr!(0), + copyFunction: ptr!(0), }; extern "C" { @@ -210,6 +211,43 @@ static mut TYPE_DESCRIPTOR: _TypeDescriptor = _TypeDescriptor { name: TYPE_NAME, }; +// Destructor used if the C++ code decides to capture the exception and drop it +// without propagating it. The catch part of the try intrinsic will set the +// first word of the exception object to 0 so that it is skipped by the +// destructor. +// +// Note that x86 Windows uses the "thiscall" calling convention for C++ member +// functions instead of the default "C" calling convention. +// +// The exception_copy function is a bit special here: it is invoked by the MSVC +// runtime under a try/catch block and the panic that we generate here will be +// used as the result of the exception copy. This is used by the C++ runtime to +// support capturing exceptions with std::exception_ptr, which we can't support +// because Box isn't clonable. +macro_rules! define_cleanup { + ($abi:tt) => { + unsafe extern $abi fn exception_cleanup(e: *mut [u64; 2]) { + if (*e)[0] != 0 { + cleanup(*e); + super::__rust_drop_panic(); + } + } + #[unwind(allowed)] + unsafe extern $abi fn exception_copy(_dest: *mut [u64; 2], + _src: *mut [u64; 2]) + -> *mut [u64; 2] { + panic!("Rust panics cannot be copied"); + } + } +} +cfg_if::cfg_if! { + if #[cfg(target_arch = "x86")] { + define_cleanup!("thiscall"); + } else { + define_cleanup!("C"); + } +} + pub unsafe fn panic(data: Box) -> u32 { use core::intrinsics::atomic_store; @@ -222,8 +260,7 @@ pub unsafe fn panic(data: Box) -> u32 { // exception (constructed above). let ptrs = mem::transmute::<_, raw::TraitObject>(data); let mut ptrs = [ptrs.data as u64, ptrs.vtable as u64]; - let ptrs_ptr = ptrs.as_mut_ptr(); - let throw_ptr = ptrs_ptr as *mut _; + let throw_ptr = ptrs.as_mut_ptr() as *mut _; // This... may seems surprising, and justifiably so. On 32-bit MSVC the // pointers between these structure are just that, pointers. On 64-bit MSVC, @@ -245,20 +282,37 @@ pub unsafe fn panic(data: Box) -> u32 { // // In any case, we basically need to do something like this until we can // express more operations in statics (and we may never be able to). - atomic_store(&mut THROW_INFO.pCatchableTypeArray as *mut _ as *mut u32, - ptr!(&CATCHABLE_TYPE_ARRAY as *const _) as u32); - atomic_store(&mut CATCHABLE_TYPE_ARRAY.arrayOfCatchableTypes[0] as *mut _ as *mut u32, - ptr!(&CATCHABLE_TYPE as *const _) as u32); - atomic_store(&mut CATCHABLE_TYPE.pType as *mut _ as *mut u32, - ptr!(&TYPE_DESCRIPTOR as *const _) as u32); + if !cfg!(bootstrap) { + atomic_store( + &mut THROW_INFO.pmfnUnwind as *mut _ as *mut u32, + ptr!(exception_cleanup) as u32, + ); + } + atomic_store( + &mut THROW_INFO.pCatchableTypeArray as *mut _ as *mut u32, + ptr!(&CATCHABLE_TYPE_ARRAY as *const _) as u32, + ); + atomic_store( + &mut CATCHABLE_TYPE_ARRAY.arrayOfCatchableTypes[0] as *mut _ as *mut u32, + ptr!(&CATCHABLE_TYPE as *const _) as u32, + ); + atomic_store( + &mut CATCHABLE_TYPE.pType as *mut _ as *mut u32, + ptr!(&TYPE_DESCRIPTOR as *const _) as u32, + ); + if !cfg!(bootstrap) { + atomic_store( + &mut CATCHABLE_TYPE.copyFunction as *mut _ as *mut u32, + ptr!(exception_copy) as u32, + ); + } extern "system" { #[unwind(allowed)] pub fn _CxxThrowException(pExceptionObject: *mut c_void, pThrowInfo: *mut u8) -> !; } - _CxxThrowException(throw_ptr, - &mut THROW_INFO as *mut _ as *mut _); + _CxxThrowException(throw_ptr, &mut THROW_INFO as *mut _ as *mut _); } pub fn payload() -> [u64; 2] { @@ -266,10 +320,7 @@ pub fn payload() -> [u64; 2] { } pub unsafe fn cleanup(payload: [u64; 2]) -> Box { - mem::transmute(raw::TraitObject { - data: payload[0] as *mut _, - vtable: payload[1] as *mut _, - }) + mem::transmute(raw::TraitObject { data: payload[0] as *mut _, vtable: payload[1] as *mut _ }) } // This is required by the compiler to exist (e.g., it's a lang item), but diff --git a/src/libproc_macro/bridge/buffer.rs b/src/libproc_macro/bridge/buffer.rs index a51e3a9a33..aeecbd4966 100644 --- a/src/libproc_macro/bridge/buffer.rs +++ b/src/libproc_macro/bridge/buffer.rs @@ -23,10 +23,7 @@ impl Clone for Slice<'a, T> { impl From<&'a [T]> for Slice<'a, T> { fn from(xs: &'a [T]) -> Self { - Slice { - data: unsafe { &*(xs.as_ptr() as *const [T; 0]) }, - len: xs.len(), - } + Slice { data: unsafe { &*(xs.as_ptr() as *const [T; 0]) }, len: xs.len() } } } @@ -128,12 +125,7 @@ impl From> for Buffer { // be safely called on `Buffer`s created by *this* `proc_macro`. fn to_vec(b: Buffer) -> Vec { unsafe { - let Buffer { - data, - len, - capacity, - .. - } = b; + let Buffer { data, len, capacity, .. } = b; mem::forget(b); Vec::from_raw_parts(data, len, capacity) } @@ -149,12 +141,6 @@ impl From> for Buffer { mem::drop(to_vec(b)); } - Buffer { - data, - len, - capacity, - extend_from_slice, - drop, - } + Buffer { data, len, capacity, extend_from_slice, drop } } } diff --git a/src/libproc_macro/bridge/client.rs b/src/libproc_macro/bridge/client.rs index 9643dba997..dd948025c9 100644 --- a/src/libproc_macro/bridge/client.rs +++ b/src/libproc_macro/bridge/client.rs @@ -393,17 +393,13 @@ impl Client crate::TokenStream> { ) -> Buffer { run_client(bridge, |input| f(crate::TokenStream(input)).0) } - Client { - get_handle_counters: HandleCounters::get, - run, - f, - } + Client { get_handle_counters: HandleCounters::get, run, f } } } impl Client crate::TokenStream> { pub const fn expand2( - f: fn(crate::TokenStream, crate::TokenStream) -> crate::TokenStream + f: fn(crate::TokenStream, crate::TokenStream) -> crate::TokenStream, ) -> Self { extern "C" fn run( bridge: Bridge<'_>, @@ -413,11 +409,7 @@ impl Client crate::TokenStream> { f(crate::TokenStream(input), crate::TokenStream(input2)).0 }) } - Client { - get_handle_counters: HandleCounters::get, - run, - f, - } + Client { get_handle_counters: HandleCounters::get, run, f } } } @@ -446,7 +438,7 @@ impl ProcMacro { match self { ProcMacro::CustomDerive { trait_name, .. } => trait_name, ProcMacro::Attr { name, .. } => name, - ProcMacro::Bang { name, ..} => name + ProcMacro::Bang { name, .. } => name, } } @@ -455,30 +447,20 @@ impl ProcMacro { attributes: &'static [&'static str], expand: fn(crate::TokenStream) -> crate::TokenStream, ) -> Self { - ProcMacro::CustomDerive { - trait_name, - attributes, - client: Client::expand1(expand), - } + ProcMacro::CustomDerive { trait_name, attributes, client: Client::expand1(expand) } } pub const fn attr( name: &'static str, expand: fn(crate::TokenStream, crate::TokenStream) -> crate::TokenStream, ) -> Self { - ProcMacro::Attr { - name, - client: Client::expand2(expand), - } + ProcMacro::Attr { name, client: Client::expand2(expand) } } pub const fn bang( name: &'static str, - expand: fn(crate::TokenStream) -> crate::TokenStream + expand: fn(crate::TokenStream) -> crate::TokenStream, ) -> Self { - ProcMacro::Bang { - name, - client: Client::expand1(expand), - } + ProcMacro::Bang { name, client: Client::expand1(expand) } } } diff --git a/src/libproc_macro/bridge/closure.rs b/src/libproc_macro/bridge/closure.rs index 8d8adfa1ca..5bfe287d33 100644 --- a/src/libproc_macro/bridge/closure.rs +++ b/src/libproc_macro/bridge/closure.rs @@ -18,10 +18,7 @@ impl<'a, A, R, F: FnMut(A) -> R> From<&'a mut F> for Closure<'a, A, R> { unsafe extern "C" fn call R>(env: &mut Env, arg: A) -> R { (*(env as *mut _ as *mut F))(arg) } - Closure { - call: call::, - env: unsafe { &mut *(f as *mut _ as *mut Env) }, - } + Closure { call: call::, env: unsafe { &mut *(f as *mut _ as *mut Env) } } } } diff --git a/src/libproc_macro/bridge/handle.rs b/src/libproc_macro/bridge/handle.rs index 66496ff3f1..bcbb868124 100644 --- a/src/libproc_macro/bridge/handle.rs +++ b/src/libproc_macro/bridge/handle.rs @@ -19,10 +19,7 @@ impl OwnedStore { // when `NonZeroU32::new` (aka `Handle::new`) is called in `alloc`. assert_ne!(counter.load(Ordering::SeqCst), 0); - OwnedStore { - counter, - data: BTreeMap::new(), - } + OwnedStore { counter, data: BTreeMap::new() } } } @@ -35,26 +32,20 @@ impl OwnedStore { } pub(super) fn take(&mut self, h: Handle) -> T { - self.data - .remove(&h) - .expect("use-after-free in `proc_macro` handle") + self.data.remove(&h).expect("use-after-free in `proc_macro` handle") } } impl Index for OwnedStore { type Output = T; fn index(&self, h: Handle) -> &T { - self.data - .get(&h) - .expect("use-after-free in `proc_macro` handle") + self.data.get(&h).expect("use-after-free in `proc_macro` handle") } } impl IndexMut for OwnedStore { fn index_mut(&mut self, h: Handle) -> &mut T { - self.data - .get_mut(&h) - .expect("use-after-free in `proc_macro` handle") + self.data.get_mut(&h).expect("use-after-free in `proc_macro` handle") } } @@ -65,10 +56,7 @@ pub(super) struct InternedStore { impl InternedStore { pub(super) fn new(counter: &'static AtomicUsize) -> Self { - InternedStore { - owned: OwnedStore::new(counter), - interner: HashMap::new(), - } + InternedStore { owned: OwnedStore::new(counter), interner: HashMap::new() } } pub(super) fn alloc(&mut self, x: T) -> Handle { diff --git a/src/libproc_macro/bridge/mod.rs b/src/libproc_macro/bridge/mod.rs index c26b59f473..a0e7d90f49 100644 --- a/src/libproc_macro/bridge/mod.rs +++ b/src/libproc_macro/bridge/mod.rs @@ -8,6 +8,7 @@ #![deny(unsafe_code)] +use crate::{Delimiter, Level, LineColumn, Spacing}; use std::fmt; use std::hash::Hash; use std::marker; @@ -17,7 +18,6 @@ use std::panic; use std::sync::atomic::AtomicUsize; use std::sync::Once; use std::thread; -use crate::{Delimiter, Level, LineColumn, Spacing}; /// Higher-order macro describing the server RPC API, allowing automatic /// generation of type-safe Rust APIs, both client-side and server-side. @@ -270,10 +270,7 @@ struct Marked { impl Mark for Marked { type Unmarked = T; fn mark(unmarked: Self::Unmarked) -> Self { - Marked { - value: unmarked, - _marker: marker::PhantomData, - } + Marked { value: unmarked, _marker: marker::PhantomData } } } impl Unmark for Marked { diff --git a/src/libproc_macro/bridge/server.rs b/src/libproc_macro/bridge/server.rs index f303e3e828..ca18d4459a 100644 --- a/src/libproc_macro/bridge/server.rs +++ b/src/libproc_macro/bridge/server.rs @@ -148,13 +148,7 @@ impl ExecutionStrategy for SameThread { ) -> Buffer { let mut dispatch = |b| dispatcher.dispatch(b); - run_client( - Bridge { - cached_buffer: input, - dispatch: (&mut dispatch).into(), - }, - client_data, - ) + run_client(Bridge { cached_buffer: input, dispatch: (&mut dispatch).into() }, client_data) } } @@ -183,10 +177,7 @@ impl ExecutionStrategy for CrossThread1 { }; run_client( - Bridge { - cached_buffer: input, - dispatch: (&mut dispatch).into(), - }, + Bridge { cached_buffer: input, dispatch: (&mut dispatch).into() }, client_data, ) }); @@ -233,10 +224,7 @@ impl ExecutionStrategy for CrossThread2 { }; let r = run_client( - Bridge { - cached_buffer: input, - dispatch: (&mut dispatch).into(), - }, + Bridge { cached_buffer: input, dispatch: (&mut dispatch).into() }, client_data, ); @@ -276,10 +264,8 @@ fn run_server< run_client: extern "C" fn(Bridge<'_>, D) -> Buffer, client_data: D, ) -> Result { - let mut dispatcher = Dispatcher { - handle_store: HandleStore::new(handle_counters), - server: MarkedTypes(server), - }; + let mut dispatcher = + Dispatcher { handle_store: HandleStore::new(handle_counters), server: MarkedTypes(server) }; let mut b = Buffer::new(); input.encode(&mut b, &mut dispatcher.handle_store); @@ -296,11 +282,7 @@ impl client::Client crate::TokenStream> { server: S, input: S::TokenStream, ) -> Result { - let client::Client { - get_handle_counters, - run, - f, - } = *self; + let client::Client { get_handle_counters, run, f } = *self; run_server( strategy, get_handle_counters(), @@ -321,11 +303,7 @@ impl client::Client crate::TokenSt input: S::TokenStream, input2: S::TokenStream, ) -> Result { - let client::Client { - get_handle_counters, - run, - f, - } = *self; + let client::Client { get_handle_counters, run, f } = *self; run_server( strategy, get_handle_counters(), diff --git a/src/libproc_macro/diagnostic.rs b/src/libproc_macro/diagnostic.rs index 65eebb5ec3..fdf252e533 100644 --- a/src/libproc_macro/diagnostic.rs +++ b/src/libproc_macro/diagnostic.rs @@ -51,7 +51,7 @@ pub struct Diagnostic { level: Level, message: String, spans: Vec, - children: Vec + children: Vec, } macro_rules! diagnostic_child_methods { @@ -96,25 +96,22 @@ impl Diagnostic { /// Creates a new diagnostic with the given `level` and `message`. #[unstable(feature = "proc_macro_diagnostic", issue = "54140")] pub fn new>(level: Level, message: T) -> Diagnostic { - Diagnostic { - level: level, - message: message.into(), - spans: vec![], - children: vec![] - } + Diagnostic { level: level, message: message.into(), spans: vec![], children: vec![] } } /// Creates a new diagnostic with the given `level` and `message` pointing to /// the given set of `spans`. #[unstable(feature = "proc_macro_diagnostic", issue = "54140")] pub fn spanned(spans: S, level: Level, message: T) -> Diagnostic - where S: MultiSpan, T: Into + where + S: MultiSpan, + T: Into, { Diagnostic { level: level, message: message.into(), spans: spans.into_spans(), - children: vec![] + children: vec![], } } diff --git a/src/libproc_macro/lib.rs b/src/libproc_macro/lib.rs index 87cd8fcb14..c51db695a5 100644 --- a/src/libproc_macro/lib.rs +++ b/src/libproc_macro/lib.rs @@ -11,24 +11,23 @@ #![stable(feature = "proc_macro_lib", since = "1.15.0")] #![deny(missing_docs)] -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - html_playground_url = "https://play.rust-lang.org/", - issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/", - test(no_crate_inject, attr(deny(warnings))), - test(attr(allow(dead_code, deprecated, unused_variables, unused_mut))))] - +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + html_playground_url = "https://play.rust-lang.org/", + issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/", + test(no_crate_inject, attr(deny(warnings))), + test(attr(allow(dead_code, deprecated, unused_variables, unused_mut))) +)] #![feature(nll)] #![feature(staged_api)] #![feature(allow_internal_unstable)] -#![feature(const_fn)] #![feature(decl_macro)] #![feature(extern_types)] #![feature(in_band_lifetimes)] #![feature(optin_builtin_traits)] #![feature(rustc_attrs)] #![feature(specialization)] - -#![recursion_limit="256"] +#![recursion_limit = "256"] #[unstable(feature = "proc_macro_internals", issue = "27812")] #[doc(hidden)] @@ -39,10 +38,10 @@ mod diagnostic; #[unstable(feature = "proc_macro_diagnostic", issue = "54140")] pub use diagnostic::{Diagnostic, Level, MultiSpan}; -use std::{fmt, iter, mem}; use std::ops::{Bound, RangeBounds}; use std::path::PathBuf; use std::str::FromStr; +use std::{fmt, iter, mem}; /// The main type provided by this crate, representing an abstract stream of /// tokens, or, more specifically, a sequence of token trees. @@ -134,20 +133,20 @@ impl fmt::Debug for TokenStream { pub use quote::{quote, quote_span}; /// Creates a token stream containing a single token tree. - #[stable(feature = "proc_macro_lib2", since = "1.29.0")] +#[stable(feature = "proc_macro_lib2", since = "1.29.0")] impl From for TokenStream { fn from(tree: TokenTree) -> TokenStream { TokenStream(bridge::client::TokenStream::from_token_tree(match tree { TokenTree::Group(tt) => bridge::TokenTree::Group(tt.0), TokenTree::Punct(tt) => bridge::TokenTree::Punct(tt.0), TokenTree::Ident(tt) => bridge::TokenTree::Ident(tt.0), - TokenTree::Literal(tt) => bridge::TokenTree::Literal(tt.0) + TokenTree::Literal(tt) => bridge::TokenTree::Literal(tt.0), })) } } /// Collects a number of token trees into a single stream. - #[stable(feature = "proc_macro_lib2", since = "1.29.0")] +#[stable(feature = "proc_macro_lib2", since = "1.29.0")] impl iter::FromIterator for TokenStream { fn from_iter>(trees: I) -> Self { trees.into_iter().map(TokenStream::from).collect() @@ -183,7 +182,7 @@ impl Extend for TokenStream { /// Public implementation details for the `TokenStream` type, such as iterators. #[stable(feature = "proc_macro_lib2", since = "1.29.0")] pub mod token_stream { - use crate::{bridge, Group, Ident, Literal, Punct, TokenTree, TokenStream}; + use crate::{bridge, Group, Ident, Literal, Punct, TokenStream, TokenTree}; /// An iterator over `TokenStream`'s `TokenTree`s. /// The iteration is "shallow", e.g., the iterator doesn't recurse into delimited groups, @@ -226,7 +225,9 @@ pub mod token_stream { #[unstable(feature = "proc_macro_quote", issue = "54722")] #[allow_internal_unstable(proc_macro_def_site)] #[rustc_builtin_macro] -pub macro quote ($($t:tt)*) { /* compiler built-in */ } +pub macro quote($($t:tt)*) { + /* compiler built-in */ +} #[unstable(feature = "proc_macro_internals", issue = "27812")] #[doc(hidden)] @@ -375,7 +376,7 @@ pub struct LineColumn { /// The 0-indexed column (in UTF-8 characters) in the source file on which /// the span starts or ends (inclusive). #[unstable(feature = "proc_macro_span", issue = "54725")] - pub column: usize + pub column: usize, } #[unstable(feature = "proc_macro_span", issue = "54725")] @@ -415,7 +416,6 @@ impl SourceFile { } } - #[unstable(feature = "proc_macro_span", issue = "54725")] impl fmt::Debug for SourceFile { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -442,28 +442,16 @@ impl Eq for SourceFile {} pub enum TokenTree { /// A token stream surrounded by bracket delimiters. #[stable(feature = "proc_macro_lib2", since = "1.29.0")] - Group( - #[stable(feature = "proc_macro_lib2", since = "1.29.0")] - Group - ), + Group(#[stable(feature = "proc_macro_lib2", since = "1.29.0")] Group), /// An identifier. #[stable(feature = "proc_macro_lib2", since = "1.29.0")] - Ident( - #[stable(feature = "proc_macro_lib2", since = "1.29.0")] - Ident - ), + Ident(#[stable(feature = "proc_macro_lib2", since = "1.29.0")] Ident), /// A single punctuation character (`+`, `,`, `$`, etc.). #[stable(feature = "proc_macro_lib2", since = "1.29.0")] - Punct( - #[stable(feature = "proc_macro_lib2", since = "1.29.0")] - Punct - ), + Punct(#[stable(feature = "proc_macro_lib2", since = "1.29.0")] Punct), /// A literal character (`'a'`), string (`"hello"`), number (`2.3`), etc. #[stable(feature = "proc_macro_lib2", since = "1.29.0")] - Literal( - #[stable(feature = "proc_macro_lib2", since = "1.29.0")] - Literal - ), + Literal(#[stable(feature = "proc_macro_lib2", since = "1.29.0")] Literal), } #[stable(feature = "proc_macro_lib2", since = "1.29.0")] @@ -1092,10 +1080,7 @@ impl Literal { } } - self.0.subspan( - cloned_bound(range.start_bound()), - cloned_bound(range.end_bound()), - ).map(Span) + self.0.subspan(cloned_bound(range.start_bound()), cloned_bound(range.end_bound())).map(Span) } } diff --git a/src/libprofiler_builtins/build.rs b/src/libprofiler_builtins/build.rs index 775f84535f..8adcff6780 100644 --- a/src/libprofiler_builtins/build.rs +++ b/src/libprofiler_builtins/build.rs @@ -9,21 +9,22 @@ fn main() { let target = env::var("TARGET").expect("TARGET was not set"); let cfg = &mut cc::Build::new(); - let mut profile_sources = vec!["GCDAProfiling.c", - "InstrProfiling.c", - "InstrProfilingBuffer.c", - "InstrProfilingFile.c", - "InstrProfilingMerge.c", - "InstrProfilingMergeFile.c", - "InstrProfilingNameVar.c", - "InstrProfilingPlatformDarwin.c", - "InstrProfilingPlatformLinux.c", - "InstrProfilingPlatformOther.c", - "InstrProfilingPlatformWindows.c", - "InstrProfilingRuntime.cc", - "InstrProfilingUtil.c", - "InstrProfilingValue.c", - "InstrProfilingWriter.c"]; + let mut profile_sources = vec![ + "GCDAProfiling.c", + "InstrProfiling.c", + "InstrProfilingBuffer.c", + "InstrProfilingFile.c", + "InstrProfilingMerge.c", + "InstrProfilingMergeFile.c", + "InstrProfilingNameVar.c", + "InstrProfilingPlatformDarwin.c", + "InstrProfilingPlatformLinux.c", + "InstrProfilingPlatformOther.c", + "InstrProfilingPlatformWindows.c", + "InstrProfilingUtil.c", + "InstrProfilingValue.c", + "InstrProfilingWriter.c", + ]; if target.contains("msvc") { // Don't pull in extra libraries on MSVC @@ -56,19 +57,27 @@ fn main() { // This should be a pretty good heuristic for when to set // COMPILER_RT_HAS_ATOMICS - if env::var_os("CARGO_CFG_TARGET_HAS_ATOMIC").map(|features| { - features.to_string_lossy().to_lowercase().contains("cas") - }).unwrap_or(false) { + if env::var_os("CARGO_CFG_TARGET_HAS_ATOMIC") + .map(|features| features.to_string_lossy().to_lowercase().contains("cas")) + .unwrap_or(false) + { cfg.define("COMPILER_RT_HAS_ATOMICS", Some("1")); } let root = env::var_os("RUST_COMPILER_RT_ROOT").unwrap(); let root = Path::new(&root); + let src_root = root.join("lib").join("profile"); for src in profile_sources { - cfg.file(root.join("lib").join("profile").join(src)); + cfg.file(src_root.join(src)); } + // The file was renamed in LLVM 10. + let old_runtime_path = src_root.join("InstrProfilingRuntime.cc"); + let new_runtime_path = src_root.join("InstrProfilingRuntime.cpp"); + cfg.file(if old_runtime_path.exists() { old_runtime_path } else { new_runtime_path }); + + cfg.include(root.join("include")); cfg.warnings(false); cfg.compile("profiler-rt"); } diff --git a/src/libprofiler_builtins/lib.rs b/src/libprofiler_builtins/lib.rs index 0d12ba01c8..bb1f2785de 100644 --- a/src/libprofiler_builtins/lib.rs +++ b/src/libprofiler_builtins/lib.rs @@ -1,9 +1,11 @@ #![no_std] #![feature(profiler_runtime)] #![profiler_runtime] -#![unstable(feature = "profiler_runtime_lib", - reason = "internal implementation detail of rustc right now", - issue = "0")] +#![unstable( + feature = "profiler_runtime_lib", + reason = "internal implementation detail of rustc right now", + issue = "none" +)] #![allow(unused_features)] #![feature(nll)] #![feature(staged_api)] diff --git a/src/librustc/Cargo.toml b/src/librustc/Cargo.toml index a4536bb6c4..b65635be54 100644 --- a/src/librustc/Cargo.toml +++ b/src/librustc/Cargo.toml @@ -15,7 +15,6 @@ bitflags = "1.2.1" fmt_macros = { path = "../libfmt_macros" } graphviz = { path = "../libgraphviz" } jobserver = "0.1" -num_cpus = "1.0" scoped-tls = "1.0" log = { version = "0.4", features = ["release_max_level_info", "std"] } rustc-rayon = "0.3.0" @@ -23,20 +22,19 @@ rustc-rayon-core = "0.3.0" polonius-engine = "0.11.0" rustc_apfloat = { path = "../librustc_apfloat" } rustc_feature = { path = "../librustc_feature" } +rustc_hir = { path = "../librustc_hir" } rustc_target = { path = "../librustc_target" } rustc_macros = { path = "../librustc_macros" } rustc_data_structures = { path = "../librustc_data_structures" } +rustc_errors = { path = "../librustc_errors" } rustc_index = { path = "../librustc_index" } -errors = { path = "../librustc_errors", package = "rustc_errors" } rustc_serialize = { path = "../libserialize", package = "serialize" } syntax = { path = "../libsyntax" } -syntax_pos = { path = "../libsyntax_pos" } +rustc_span = { path = "../librustc_span" } backtrace = "0.3.40" parking_lot = "0.9" byteorder = { version = "1.3" } chalk-engine = { version = "0.9.0", default-features=false } -rustc_fs_util = { path = "../librustc_fs_util" } smallvec = { version = "1.0", features = ["union", "may_dangle"] } -measureme = "0.5" -rustc_error_codes = { path = "../librustc_error_codes" } +measureme = "0.7.1" rustc_session = { path = "../librustc_session" } diff --git a/src/librustc/arena.rs b/src/librustc/arena.rs index eb7a170980..15e92d8d84 100644 --- a/src/librustc/arena.rs +++ b/src/librustc/arena.rs @@ -1,10 +1,10 @@ -use arena::{TypedArena, DroplessArena}; +use arena::{DroplessArena, TypedArena}; +use smallvec::SmallVec; +use std::cell::RefCell; +use std::marker::PhantomData; use std::mem; use std::ptr; use std::slice; -use std::cell::RefCell; -use std::marker::PhantomData; -use smallvec::SmallVec; /// This declares a list of types which can be allocated by `Arena`. /// @@ -38,13 +38,13 @@ macro_rules! arena_types { [] tables: rustc::ty::TypeckTables<$tcx>, [] const_allocs: rustc::mir::interpret::Allocation, [] vtable_method: Option<( - rustc::hir::def_id::DefId, + rustc_hir::def_id::DefId, rustc::ty::subst::SubstsRef<$tcx> )>, - [few, decode] mir_keys: rustc::util::nodemap::DefIdSet, + [few, decode] mir_keys: rustc_hir::def_id::DefIdSet, [decode] specialization_graph: rustc::traits::specialization_graph::Graph, [] region_scope_tree: rustc::middle::region::ScopeTree, - [] item_local_set: rustc::util::nodemap::ItemLocalSet, + [] item_local_set: rustc_hir::ItemLocalSet, [decode] mir_const_qualif: rustc_index::bit_set::BitSet, [] trait_impls_of: rustc::ty::trait_def::TraitImpls, [] dropck_outlives: @@ -87,42 +87,78 @@ macro_rules! arena_types { >, [few] crate_inherent_impls: rustc::ty::CrateInherentImpls, [few] upstream_monomorphizations: - rustc::util::nodemap::DefIdMap< + rustc_hir::def_id::DefIdMap< rustc_data_structures::fx::FxHashMap< rustc::ty::subst::SubstsRef<'tcx>, - rustc::hir::def_id::CrateNum + rustc_hir::def_id::CrateNum > >, - [few] hir_forest: rustc::hir::map::Forest, [few] diagnostic_items: rustc_data_structures::fx::FxHashMap< - syntax::symbol::Symbol, - rustc::hir::def_id::DefId, + rustc_span::symbol::Symbol, + rustc_hir::def_id::DefId, >, [few] resolve_lifetimes: rustc::middle::resolve_lifetime::ResolveLifetimes, [few] lint_levels: rustc::lint::LintLevelMap, [few] stability_index: rustc::middle::stability::Index<'tcx>, [few] features: rustc_feature::Features, - [few] all_traits: Vec, + [few] all_traits: Vec, [few] privacy_access_levels: rustc::middle::privacy::AccessLevels, [few] target_features_whitelist: rustc_data_structures::fx::FxHashMap< String, - Option + Option >, [few] wasm_import_module_map: rustc_data_structures::fx::FxHashMap< - rustc::hir::def_id::DefId, + rustc_hir::def_id::DefId, String >, [few] get_lib_features: rustc::middle::lib_features::LibFeatures, [few] defined_lib_features: rustc::middle::lang_items::LanguageItems, - [few] visible_parent_map: rustc::util::nodemap::DefIdMap, + [few] visible_parent_map: rustc_hir::def_id::DefIdMap, [few] foreign_module: rustc::middle::cstore::ForeignModule, [few] foreign_modules: Vec, - [few] reachable_non_generics: rustc::util::nodemap::DefIdMap< + [few] reachable_non_generics: rustc_hir::def_id::DefIdMap< rustc::middle::exported_symbols::SymbolExportLevel >, [few] crate_variances: rustc::ty::CrateVariancesMap<'tcx>, [few] inferred_outlives_crate: rustc::ty::CratePredicatesMap<'tcx>, - [] upvars: rustc_data_structures::fx::FxIndexMap, + [] upvars: rustc_data_structures::fx::FxIndexMap, + + // Interned types + [] tys: rustc::ty::TyS<$tcx>, + + // HIR types + [few] hir_forest: rustc::hir::map::Forest<$tcx>, + [] arm: rustc_hir::Arm<$tcx>, + [] attribute: syntax::ast::Attribute, + [] block: rustc_hir::Block<$tcx>, + [] bare_fn_ty: rustc_hir::BareFnTy<$tcx>, + [few] global_asm: rustc_hir::GlobalAsm, + [] generic_arg: rustc_hir::GenericArg<$tcx>, + [] generic_args: rustc_hir::GenericArgs<$tcx>, + [] generic_bound: rustc_hir::GenericBound<$tcx>, + [] generic_param: rustc_hir::GenericParam<$tcx>, + [] expr: rustc_hir::Expr<$tcx>, + [] field: rustc_hir::Field<$tcx>, + [] field_pat: rustc_hir::FieldPat<$tcx>, + [] fn_decl: rustc_hir::FnDecl<$tcx>, + [] foreign_item: rustc_hir::ForeignItem<$tcx>, + [] impl_item_ref: rustc_hir::ImplItemRef<$tcx>, + [] inline_asm: rustc_hir::InlineAsm<$tcx>, + [] local: rustc_hir::Local<$tcx>, + [few] macro_def: rustc_hir::MacroDef<$tcx>, + [] param: rustc_hir::Param<$tcx>, + [] pat: rustc_hir::Pat<$tcx>, + [] path: rustc_hir::Path<$tcx>, + [] path_segment: rustc_hir::PathSegment<$tcx>, + [] poly_trait_ref: rustc_hir::PolyTraitRef<$tcx>, + [] qpath: rustc_hir::QPath<$tcx>, + [] stmt: rustc_hir::Stmt<$tcx>, + [] struct_field: rustc_hir::StructField<$tcx>, + [] trait_item_ref: rustc_hir::TraitItemRef, + [] ty: rustc_hir::Ty<$tcx>, + [] type_binding: rustc_hir::TypeBinding<$tcx>, + [] variant: rustc_hir::Variant<$tcx>, + [] where_predicate: rustc_hir::WherePredicate<$tcx>, ], $tcx); ) } @@ -143,7 +179,7 @@ macro_rules! declare_arena { ([], [$($a:tt $name:ident: $ty:ty,)*], $tcx:lifetime) => { #[derive(Default)] pub struct Arena<$tcx> { - dropless: DroplessArena, + pub dropless: DroplessArena, drop: DropArena, $($name: arena_for_type!($a[$ty]),)* } @@ -212,17 +248,14 @@ impl<'tcx> Arena<'tcx> { #[inline] pub fn alloc_slice(&self, value: &[T]) -> &mut [T] { if value.len() == 0 { - return &mut [] + return &mut []; } self.dropless.alloc_slice(value) } - pub fn alloc_from_iter< - T: ArenaAllocatable, - I: IntoIterator - >( + pub fn alloc_from_iter>( &'a self, - iter: I + iter: I, ) -> &'a mut [T] { if !mem::needs_drop::() { return self.dropless.alloc_from_iter(iter); @@ -246,9 +279,7 @@ unsafe fn drop_for_type(to_drop: *mut u8) { impl Drop for DropType { fn drop(&mut self) { - unsafe { - (self.drop_fn)(self.obj) - } + unsafe { (self.drop_fn)(self.obj) } } } @@ -269,19 +300,16 @@ struct DropArena { impl DropArena { #[inline] unsafe fn alloc(&self, object: T) -> &mut T { - let mem = self.arena.alloc_raw( - mem::size_of::(), - mem::align_of::() - ) as *mut _ as *mut T; + let mem = + self.arena.alloc_raw(mem::size_of::(), mem::align_of::()) as *mut _ as *mut T; // Write into uninitialized memory. ptr::write(mem, object); let result = &mut *mem; // Record the destructor after doing the allocation as that may panic // and would cause `object`'s destuctor to run twice if it was recorded before - self.destructors.borrow_mut().push(DropType { - drop_fn: drop_for_type::, - obj: result as *mut T as *mut u8, - }); + self.destructors + .borrow_mut() + .push(DropType { drop_fn: drop_for_type::, obj: result as *mut T as *mut u8 }); result } @@ -293,10 +321,10 @@ impl DropArena { } let len = vec.len(); - let start_ptr = self.arena.alloc_raw( - len.checked_mul(mem::size_of::()).unwrap(), - mem::align_of::() - ) as *mut _ as *mut T; + let start_ptr = self + .arena + .alloc_raw(len.checked_mul(mem::size_of::()).unwrap(), mem::align_of::()) + as *mut _ as *mut T; let mut destructors = self.destructors.borrow_mut(); // Reserve space for the destructors so we can't panic while adding them diff --git a/src/librustc/benches/lib.rs b/src/librustc/benches/lib.rs index 6b62402889..de82b262e4 100644 --- a/src/librustc/benches/lib.rs +++ b/src/librustc/benches/lib.rs @@ -1,4 +1,4 @@ -#![feature(slice_patterns)] +#![cfg_attr(bootstrap, feature(slice_patterns))] #![feature(test)] extern crate test; @@ -8,7 +8,7 @@ use test::Bencher; // Static/dynamic method dispatch struct Struct { - field: isize + field: isize, } trait Trait { @@ -25,17 +25,13 @@ impl Trait for Struct { fn trait_vtable_method_call(b: &mut Bencher) { let s = Struct { field: 10 }; let t = &s as &dyn Trait; - b.iter(|| { - t.method() - }); + b.iter(|| t.method()); } #[bench] fn trait_static_method_call(b: &mut Bencher) { let s = Struct { field: 10 }; - b.iter(|| { - s.method() - }); + b.iter(|| s.method()); } // Overhead of various match forms @@ -43,21 +39,17 @@ fn trait_static_method_call(b: &mut Bencher) { #[bench] fn option_some(b: &mut Bencher) { let x = Some(10); - b.iter(|| { - match x { - Some(y) => y, - None => 11 - } + b.iter(|| match x { + Some(y) => y, + None => 11, }); } #[bench] fn vec_pattern(b: &mut Bencher) { - let x = [1,2,3,4,5,6]; - b.iter(|| { - match x { - [1,2,3,..] => 10, - _ => 11, - } + let x = [1, 2, 3, 4, 5, 6]; + b.iter(|| match x { + [1, 2, 3, ..] => 10, + _ => 11, }); } diff --git a/src/librustc/dep_graph/debug.rs b/src/librustc/dep_graph/debug.rs index f18ee3dced..d44c54593a 100644 --- a/src/librustc/dep_graph/debug.rs +++ b/src/librustc/dep_graph/debug.rs @@ -12,14 +12,12 @@ use std::error::Error; /// `z`. #[derive(Debug)] pub struct DepNodeFilter { - text: String + text: String, } impl DepNodeFilter { pub fn new(text: &str) -> Self { - DepNodeFilter { - text: text.trim().to_string() - } + DepNodeFilter { text: text.trim().to_string() } } /// Returns `true` if all nodes always pass the filter. @@ -30,9 +28,7 @@ impl DepNodeFilter { /// Tests whether `node` meets the filter, returning true if so. pub fn test(&self, node: &DepNode) -> bool { let debug_str = format!("{:?}", node); - self.text.split('&') - .map(|s| s.trim()) - .all(|f| debug_str.contains(f)) + self.text.split('&').map(|s| s.trim()).all(|f| debug_str.contains(f)) } } @@ -56,10 +52,7 @@ impl EdgeFilter { } } - pub fn test(&self, - source: &DepNode, - target: &DepNode) - -> bool { + pub fn test(&self, source: &DepNode, target: &DepNode) -> bool { self.source.test(source) && self.target.test(target) } } diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index 17ab0c187a..9df8e28254 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -49,31 +49,31 @@ //! user of the `DepNode` API of having to know how to compute the expected //! fingerprint for a given set of node parameters. -use crate::mir; -use crate::mir::interpret::GlobalId; -use crate::hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX}; use crate::hir::map::DefPathHash; -use crate::hir::HirId; - use crate::ich::{Fingerprint, StableHashingContext}; -use rustc_data_structures::stable_hasher::{StableHasher, HashStable}; -use std::fmt; -use std::hash::Hash; -use syntax_pos::symbol::Symbol; +use crate::mir; +use crate::mir::interpret::{GlobalId, LitToConstInput}; use crate::traits; use crate::traits::query::{ - CanonicalProjectionGoal, CanonicalTyGoal, CanonicalTypeOpAscribeUserTypeGoal, - CanonicalTypeOpEqGoal, CanonicalTypeOpSubtypeGoal, CanonicalPredicateGoal, - CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpNormalizeGoal, + CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal, + CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, + CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal, }; -use crate::ty::{self, TyCtxt, ParamEnvAnd, Ty}; use crate::ty::subst::SubstsRef; +use crate::ty::{self, ParamEnvAnd, Ty, TyCtxt}; + +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX}; +use rustc_hir::HirId; +use rustc_span::symbol::Symbol; +use std::fmt; +use std::hash::Hash; // erase!() just makes tokens go away. It's used to specify which macro argument // is repeated (i.e., which sub-expression of the macro we are in) but don't need // to actually use any of the arguments. macro_rules! erase { - ($x:tt) => ({}) + ($x:tt) => {{}}; } macro_rules! replace { @@ -81,13 +81,21 @@ macro_rules! replace { } macro_rules! is_anon_attr { - (anon) => (true); - ($attr:ident) => (false); + (anon) => { + true + }; + ($attr:ident) => { + false + }; } macro_rules! is_eval_always_attr { - (eval_always) => (true); - ($attr:ident) => (false); + (eval_always) => { + true + }; + ($attr:ident) => { + false + }; } macro_rules! contains_anon_attr { @@ -382,19 +390,12 @@ impl fmt::Debug for DepNode { } } - impl DefPathHash { pub fn to_dep_node(self, kind: DepKind) -> DepNode { DepNode::from_def_path_hash(kind, self) } } -impl DefId { - pub fn to_dep_node(self, tcx: TyCtxt<'_>, kind: DepKind) -> DepNode { - DepNode::from_def_path_hash(kind, tcx.def_path_hash(self)) - } -} - rustc_dep_node_append!([define_dep_nodes!][ <'tcx> // We use this for most things when incr. comp. is turned off. [] Null, @@ -517,10 +518,7 @@ impl<'tcx> DepNodeParams<'tcx> for CrateNum { const CAN_RECONSTRUCT_QUERY_KEY: bool = true; fn to_fingerprint(&self, tcx: TyCtxt<'_>) -> Fingerprint { - let def_id = DefId { - krate: *self, - index: CRATE_DEF_INDEX, - }; + let def_id = DefId { krate: *self, index: CRATE_DEF_INDEX }; tcx.def_path_hash(def_id).0 } @@ -547,9 +545,7 @@ impl<'tcx> DepNodeParams<'tcx> for (DefId, DefId) { fn to_debug_str(&self, tcx: TyCtxt<'tcx>) -> String { let (def_id_0, def_id_1) = *self; - format!("({}, {})", - tcx.def_path_debug_str(def_id_0), - tcx.def_path_debug_str(def_id_1)) + format!("({}, {})", tcx.def_path_debug_str(def_id_0), tcx.def_path_debug_str(def_id_1)) } } @@ -560,10 +556,7 @@ impl<'tcx> DepNodeParams<'tcx> for HirId { // method but it's faster to combine the hashes than to instantiate a full // hashing context and stable-hashing state. fn to_fingerprint(&self, tcx: TyCtxt<'_>) -> Fingerprint { - let HirId { - owner, - local_id, - } = *self; + let HirId { owner, local_id } = *self; let def_path_hash = tcx.def_path_hash(DefId::local(owner)); let local_id = Fingerprint::from_smaller_hash(local_id.as_u32().into()); @@ -577,10 +570,21 @@ impl<'tcx> DepNodeParams<'tcx> for HirId { /// some independent path or string that persists between runs without /// the need to be mapped or unmapped. (This ensures we can serialize /// them even in the absence of a tcx.) -#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, - RustcEncodable, RustcDecodable, HashStable)] +#[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + HashStable +)] pub struct WorkProductId { - hash: Fingerprint + hash: Fingerprint, } impl WorkProductId { @@ -588,14 +592,10 @@ impl WorkProductId { let mut hasher = StableHasher::new(); cgu_name.len().hash(&mut hasher); cgu_name.hash(&mut hasher); - WorkProductId { - hash: hasher.finish() - } + WorkProductId { hash: hasher.finish() } } pub fn from_fingerprint(fingerprint: Fingerprint) -> WorkProductId { - WorkProductId { - hash: fingerprint - } + WorkProductId { hash: fingerprint } } } diff --git a/src/librustc/dep_graph/graph.rs b/src/librustc/dep_graph/graph.rs index d952bf7ab9..8d1efc7bc0 100644 --- a/src/librustc/dep_graph/graph.rs +++ b/src/librustc/dep_graph/graph.rs @@ -1,30 +1,37 @@ -use errors::Diagnostic; -use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use crate::ty::{self, TyCtxt}; +use parking_lot::{Condvar, Mutex}; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::profiling::QueryInvocationId; +use rustc_data_structures::sharded::{self, Sharded}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_data_structures::sync::{AtomicU32, AtomicU64, Lock, Lrc, Ordering}; +use rustc_errors::Diagnostic; use rustc_index::vec::{Idx, IndexVec}; use smallvec::SmallVec; -use rustc_data_structures::sync::{Lrc, Lock, AtomicU32, AtomicU64, Ordering}; -use rustc_data_structures::sharded::{self, Sharded}; -use std::sync::atomic::Ordering::SeqCst; +use std::collections::hash_map::Entry; use std::env; use std::hash::Hash; -use std::collections::hash_map::Entry; use std::mem; -use crate::ty::{self, TyCtxt}; -use parking_lot::{Mutex, Condvar}; +use std::sync::atomic::Ordering::Relaxed; -use crate::ich::{StableHashingContext, StableHashingContextProvider, Fingerprint}; +use crate::ich::{Fingerprint, StableHashingContext, StableHashingContextProvider}; use super::debug::EdgeFilter; -use super::dep_node::{DepNode, DepKind, WorkProductId}; +use super::dep_node::{DepKind, DepNode, WorkProductId}; +use super::prev::PreviousDepGraph; use super::query::DepGraphQuery; use super::safe::DepGraphSafe; use super::serialized::{SerializedDepGraph, SerializedDepNodeIndex}; -use super::prev::PreviousDepGraph; #[derive(Clone)] pub struct DepGraph { data: Option>, + + /// This field is used for assigning DepNodeIndices when running in + /// non-incremental mode. Even in non-incremental mode we make sure that + /// each task has a `DepNodeIndex` that uniquely identifies it. This unique + /// ID is used for self-profiling. + virtual_dep_node_index: Lrc, } rustc_index::newtype_index! { @@ -35,10 +42,17 @@ impl DepNodeIndex { pub const INVALID: DepNodeIndex = DepNodeIndex::MAX; } +impl std::convert::From for QueryInvocationId { + #[inline] + fn from(dep_node_index: DepNodeIndex) -> Self { + QueryInvocationId(dep_node_index.as_u32()) + } +} + #[derive(PartialEq)] pub enum DepNodeColor { Red, - Green(DepNodeIndex) + Green(DepNodeIndex), } impl DepNodeColor { @@ -89,8 +103,10 @@ where } impl DepGraph { - pub fn new(prev_graph: PreviousDepGraph, - prev_work_products: FxHashMap) -> DepGraph { + pub fn new( + prev_graph: PreviousDepGraph, + prev_work_products: FxHashMap, + ) -> DepGraph { let prev_graph_node_count = prev_graph.node_count(); DepGraph { @@ -103,13 +119,12 @@ impl DepGraph { previous: prev_graph, colors: DepNodeColorMap::new(prev_graph_node_count), })), + virtual_dep_node_index: Lrc::new(AtomicU32::new(0)), } } pub fn new_disabled() -> DepGraph { - DepGraph { - data: None, - } + DepGraph { data: None, virtual_dep_node_index: Lrc::new(AtomicU32::new(0)) } } /// Returns `true` if we are actually building the full dep-graph, and `false` otherwise. @@ -132,8 +147,7 @@ impl DepGraph { DepGraphQuery::new(&nodes[..], &edges[..]) } - pub fn assert_ignored(&self) - { + pub fn assert_ignored(&self) { if let Some(..) = self.data { ty::tls::with_context_opt(|icx| { let icx = if let Some(icx) = icx { icx } else { return }; @@ -142,18 +156,14 @@ impl DepGraph { } } - pub fn with_ignore(&self, op: OP) -> R - where OP: FnOnce() -> R + pub fn with_ignore(&self, op: OP) -> R + where + OP: FnOnce() -> R, { ty::tls::with_context(|icx| { - let icx = ty::tls::ImplicitCtxt { - task_deps: None, - ..icx.clone() - }; + let icx = ty::tls::ImplicitCtxt { task_deps: None, ..icx.clone() }; - ty::tls::enter_context(&icx, |_| { - op() - }) + ty::tls::enter_context(&icx, |_| op()) }) } @@ -195,38 +205,45 @@ impl DepGraph { where C: DepGraphSafe + StableHashingContextProvider<'a>, { - self.with_task_impl(key, cx, arg, false, task, - |_key| Some(TaskDeps { - #[cfg(debug_assertions)] - node: Some(_key), - reads: SmallVec::new(), - read_set: Default::default(), - }), - |data, key, fingerprint, task| { - data.complete_task(key, task.unwrap(), fingerprint) + self.with_task_impl( + key, + cx, + arg, + false, + task, + |_key| { + Some(TaskDeps { + #[cfg(debug_assertions)] + node: Some(_key), + reads: SmallVec::new(), + read_set: Default::default(), + }) }, - hash_result) + |data, key, fingerprint, task| data.complete_task(key, task.unwrap(), fingerprint), + hash_result, + ) } /// Creates a new dep-graph input with value `input` - pub fn input_task<'a, C, R>(&self, - key: DepNode, - cx: C, - input: R) - -> (R, DepNodeIndex) - where C: DepGraphSafe + StableHashingContextProvider<'a>, - R: for<'b> HashStable>, + pub fn input_task<'a, C, R>(&self, key: DepNode, cx: C, input: R) -> (R, DepNodeIndex) + where + C: DepGraphSafe + StableHashingContextProvider<'a>, + R: for<'b> HashStable>, { fn identity_fn(_: C, arg: A) -> A { arg } - self.with_task_impl(key, cx, input, true, identity_fn, + self.with_task_impl( + key, + cx, + input, + true, + identity_fn, |_| None, - |data, key, fingerprint, _| { - data.alloc_node(key, SmallVec::new(), fingerprint) - }, - hash_result::) + |data, key, fingerprint, _| data.alloc_node(key, SmallVec::new(), fingerprint), + hash_result::, + ) } fn with_task_impl<'a, C, A, R>( @@ -237,10 +254,12 @@ impl DepGraph { no_tcx: bool, task: fn(C, A) -> R, create_task: fn(DepNode) -> Option, - finish_task_and_alloc_depnode: fn(&CurrentDepGraph, - DepNode, - Fingerprint, - Option) -> DepNodeIndex, + finish_task_and_alloc_depnode: fn( + &CurrentDepGraph, + DepNode, + Fingerprint, + Option, + ) -> DepNodeIndex, hash_result: impl FnOnce(&mut StableHashingContext<'_>, &R) -> Option, ) -> (R, DepNodeIndex) where @@ -260,14 +279,10 @@ impl DepGraph { task(cx, arg) } else { ty::tls::with_context(|icx| { - let icx = ty::tls::ImplicitCtxt { - task_deps: task_deps.as_ref(), - ..icx.clone() - }; - - ty::tls::enter_context(&icx, |_| { - task(cx, arg) - }) + let icx = + ty::tls::ImplicitCtxt { task_deps: task_deps.as_ref(), ..icx.clone() }; + + ty::tls::enter_context(&icx, |_| task(cx, arg)) }) }; @@ -306,9 +321,12 @@ impl DepGraph { DepNodeColor::Red }; - debug_assert!(data.colors.get(prev_index).is_none(), - "DepGraph::with_task() - Duplicate DepNodeColor \ - insertion for {:?}", key); + debug_assert!( + data.colors.get(prev_index).is_none(), + "DepGraph::with_task() - Duplicate DepNodeColor \ + insertion for {:?}", + key + ); data.colors.insert(prev_index, color); } else { @@ -319,14 +337,15 @@ impl DepGraph { (result, dep_node_index) } else { - (task(cx, arg), DepNodeIndex::INVALID) + (task(cx, arg), self.next_virtual_depnode_index()) } } /// Executes something within an "anonymous" task, that is, a task the /// `DepNode` of which is determined by the list of inputs it read from. - pub fn with_anon_task(&self, dep_kind: DepKind, op: OP) -> (R, DepNodeIndex) - where OP: FnOnce() -> R + pub fn with_anon_task(&self, dep_kind: DepKind, op: OP) -> (R, DepNodeIndex) + where + OP: FnOnce() -> R, { if let Some(ref data) = self.data { let (result, task_deps) = ty::tls::with_context(|icx| { @@ -338,23 +357,17 @@ impl DepGraph { }); let r = { - let icx = ty::tls::ImplicitCtxt { - task_deps: Some(&task_deps), - ..icx.clone() - }; - - ty::tls::enter_context(&icx, |_| { - op() - }) + let icx = ty::tls::ImplicitCtxt { task_deps: Some(&task_deps), ..icx.clone() }; + + ty::tls::enter_context(&icx, |_| op()) }; (r, task_deps.into_inner()) }); - let dep_node_index = data.current - .complete_anon_task(dep_kind, task_deps); + let dep_node_index = data.current.complete_anon_task(dep_kind, task_deps); (result, dep_node_index) } else { - (op(), DepNodeIndex::INVALID) + (op(), self.next_virtual_depnode_index()) } } @@ -371,12 +384,16 @@ impl DepGraph { where C: DepGraphSafe + StableHashingContextProvider<'a>, { - self.with_task_impl(key, cx, arg, false, task, + self.with_task_impl( + key, + cx, + arg, + false, + task, |_| None, - |data, key, fingerprint, _| { - data.alloc_node(key, smallvec![], fingerprint) - }, - hash_result) + |data, key, fingerprint, _| data.alloc_node(key, smallvec![], fingerprint), + hash_result, + ) } #[inline] @@ -444,11 +461,7 @@ impl DepGraph { /// Checks whether a previous work product exists for `v` and, if /// so, return the path that leads to it. Used to skip doing work. pub fn previous_work_product(&self, v: &WorkProductId) -> Option { - self.data - .as_ref() - .and_then(|data| { - data.previous_work_products.get(v).cloned() - }) + self.data.as_ref().and_then(|data| data.previous_work_products.get(v).cloned()) } /// Access the map of work-products created during the cached run. Only @@ -458,35 +471,31 @@ impl DepGraph { } #[inline(always)] - pub fn register_dep_node_debug_str(&self, - dep_node: DepNode, - debug_str_gen: F) - where F: FnOnce() -> String + pub fn register_dep_node_debug_str(&self, dep_node: DepNode, debug_str_gen: F) + where + F: FnOnce() -> String, { let dep_node_debug = &self.data.as_ref().unwrap().dep_node_debug; if dep_node_debug.borrow().contains_key(&dep_node) { - return + return; } let debug_str = debug_str_gen(); dep_node_debug.borrow_mut().insert(dep_node, debug_str); } pub(super) fn dep_node_debug_str(&self, dep_node: DepNode) -> Option { - self.data - .as_ref()? - .dep_node_debug - .borrow() - .get(&dep_node) - .cloned() + self.data.as_ref()?.dep_node_debug.borrow().get(&dep_node).cloned() } pub fn edge_deduplication_data(&self) -> Option<(u64, u64)> { if cfg!(debug_assertions) { let current_dep_graph = &self.data.as_ref().unwrap().current; - Some((current_dep_graph.total_read_count.load(SeqCst), - current_dep_graph.total_duplicate_read_count.load(SeqCst))) + Some(( + current_dep_graph.total_read_count.load(Relaxed), + current_dep_graph.total_duplicate_read_count.load(Relaxed), + )) } else { None } @@ -497,8 +506,7 @@ impl DepGraph { let fingerprints: IndexVec = data.iter().map(|d| d.fingerprint).collect(); - let nodes: IndexVec = - data.iter().map(|d| d.node).collect(); + let nodes: IndexVec = data.iter().map(|d| d.node).collect(); let total_edge_count: usize = data.iter().map(|d| d.edges.len()).sum(); @@ -518,22 +526,17 @@ impl DepGraph { debug_assert!(edge_list_data.len() <= ::std::u32::MAX as usize); debug_assert_eq!(edge_list_data.len(), total_edge_count); - SerializedDepGraph { - nodes, - fingerprints, - edge_list_indices, - edge_list_data, - } + SerializedDepGraph { nodes, fingerprints, edge_list_indices, edge_list_data } } pub fn node_color(&self, dep_node: &DepNode) -> Option { if let Some(ref data) = self.data { if let Some(prev_index) = data.previous.node_to_index_opt(dep_node) { - return data.colors.get(prev_index) + return data.colors.get(prev_index); } else { // This is a node that did not exist in the previous compilation // session, so we consider it to be red. - return Some(DepNodeColor::Red) + return Some(DepNodeColor::Red); } } @@ -577,14 +580,8 @@ impl DepGraph { // in the previous compilation session too, so we can try to // mark it as green by recursively marking all of its // dependencies green. - self.try_mark_previous_green( - tcx, - data, - prev_index, - &dep_node - ).map(|dep_node_index| { - (prev_index, dep_node_index) - }) + self.try_mark_previous_green(tcx, data, prev_index, &dep_node) + .map(|dep_node_index| (prev_index, dep_node_index)) } } } @@ -601,11 +598,14 @@ impl DepGraph { #[cfg(not(parallel_compiler))] { - debug_assert!(!data.current - .node_to_node_index - .get_shard_by_value(dep_node) - .lock() - .contains_key(dep_node)); + debug_assert!( + !data + .current + .node_to_node_index + .get_shard_by_value(dep_node) + .lock() + .contains_key(dep_node) + ); debug_assert!(data.colors.get(prev_dep_node_index).is_none()); } @@ -626,10 +626,12 @@ impl DepGraph { // This dependency has been marked as green before, we are // still fine and can continue with checking the other // dependencies. - debug!("try_mark_previous_green({:?}) --- found dependency {:?} to \ + debug!( + "try_mark_previous_green({:?}) --- found dependency {:?} to \ be immediately green", - dep_node, - data.previous.index_to_node(dep_dep_node_index)); + dep_node, + data.previous.index_to_node(dep_dep_node_index) + ); current_deps.push(node_index); } Some(DepNodeColor::Red) => { @@ -637,11 +639,13 @@ impl DepGraph { // compared to the previous compilation session. We cannot // mark the DepNode as green and also don't need to bother // with checking any of the other dependencies. - debug!("try_mark_previous_green({:?}) - END - dependency {:?} was \ + debug!( + "try_mark_previous_green({:?}) - END - dependency {:?} was \ immediately red", - dep_node, - data.previous.index_to_node(dep_dep_node_index)); - return None + dep_node, + data.previous.index_to_node(dep_dep_node_index) + ); + return None; } None => { let dep_dep_node = &data.previous.index_to_node(dep_dep_node_index); @@ -649,37 +653,42 @@ impl DepGraph { // We don't know the state of this dependency. If it isn't // an eval_always node, let's try to mark it green recursively. if !dep_dep_node.kind.is_eval_always() { - debug!("try_mark_previous_green({:?}) --- state of dependency {:?} \ - is unknown, trying to mark it green", dep_node, - dep_dep_node); + debug!( + "try_mark_previous_green({:?}) --- state of dependency {:?} \ + is unknown, trying to mark it green", + dep_node, dep_dep_node + ); let node_index = self.try_mark_previous_green( tcx, data, dep_dep_node_index, - dep_dep_node + dep_dep_node, ); if let Some(node_index) = node_index { - debug!("try_mark_previous_green({:?}) --- managed to MARK \ - dependency {:?} as green", dep_node, dep_dep_node); + debug!( + "try_mark_previous_green({:?}) --- managed to MARK \ + dependency {:?} as green", + dep_node, dep_dep_node + ); current_deps.push(node_index); continue; } } else { match dep_dep_node.kind { - DepKind::Hir | - DepKind::HirBody | - DepKind::CrateMetadata => { + DepKind::Hir | DepKind::HirBody | DepKind::CrateMetadata => { if dep_dep_node.extract_def_id(tcx).is_none() { // If the node does not exist anymore, we // just fail to mark green. - return None + return None; } else { // If the node does exist, it should have // been pre-allocated. - bug!("DepNode {:?} should have been \ + bug!( + "DepNode {:?} should have been \ pre-allocated but wasn't.", - dep_dep_node) + dep_dep_node + ) } } _ => { @@ -690,29 +699,37 @@ impl DepGraph { } // We failed to mark it green, so we try to force the query. - debug!("try_mark_previous_green({:?}) --- trying to force \ - dependency {:?}", dep_node, dep_dep_node); + debug!( + "try_mark_previous_green({:?}) --- trying to force \ + dependency {:?}", + dep_node, dep_dep_node + ); if crate::ty::query::force_from_dep_node(tcx, dep_dep_node) { let dep_dep_node_color = data.colors.get(dep_dep_node_index); match dep_dep_node_color { Some(DepNodeColor::Green(node_index)) => { - debug!("try_mark_previous_green({:?}) --- managed to \ + debug!( + "try_mark_previous_green({:?}) --- managed to \ FORCE dependency {:?} to green", - dep_node, dep_dep_node); + dep_node, dep_dep_node + ); current_deps.push(node_index); } Some(DepNodeColor::Red) => { - debug!("try_mark_previous_green({:?}) - END - \ + debug!( + "try_mark_previous_green({:?}) - END - \ dependency {:?} was red after forcing", - dep_node, - dep_dep_node); - return None + dep_node, dep_dep_node + ); + return None; } None => { if !tcx.sess.has_errors_or_delayed_span_bugs() { - bug!("try_mark_previous_green() - Forcing the DepNode \ - should have set its color") + bug!( + "try_mark_previous_green() - Forcing the DepNode \ + should have set its color" + ) } else { // If the query we just forced has resulted in // some kind of compilation error, we cannot rely on @@ -724,19 +741,23 @@ impl DepGraph { // invalid state will not be persisted to the // incremental compilation cache because of // compilation errors being present. - debug!("try_mark_previous_green({:?}) - END - \ + debug!( + "try_mark_previous_green({:?}) - END - \ dependency {:?} resulted in compilation error", - dep_node, - dep_dep_node); - return None + dep_node, dep_dep_node + ); + return None; } } } } else { // The DepNode could not be forced. - debug!("try_mark_previous_green({:?}) - END - dependency {:?} \ - could not be forced", dep_node, dep_dep_node); - return None + debug!( + "try_mark_previous_green({:?}) - END - dependency {:?} \ + could not be forced", + dep_node, dep_dep_node + ); + return None; } } } @@ -762,22 +783,18 @@ impl DepGraph { // FIXME: Store the fact that a node has diagnostics in a bit in the dep graph somewhere // Maybe store a list on disk and encode this fact in the DepNodeState - let diagnostics = tcx.queries.on_disk_cache - .load_diagnostics(tcx, prev_dep_node_index); + let diagnostics = tcx.queries.on_disk_cache.load_diagnostics(tcx, prev_dep_node_index); #[cfg(not(parallel_compiler))] - debug_assert!(data.colors.get(prev_dep_node_index).is_none(), - "DepGraph::try_mark_previous_green() - Duplicate DepNodeColor \ - insertion for {:?}", dep_node); + debug_assert!( + data.colors.get(prev_dep_node_index).is_none(), + "DepGraph::try_mark_previous_green() - Duplicate DepNodeColor \ + insertion for {:?}", + dep_node + ); if unlikely!(diagnostics.len() > 0) { - self.emit_diagnostics( - tcx, - data, - dep_node_index, - prev_dep_node_index, - diagnostics - ); + self.emit_diagnostics(tcx, data, dep_node_index, prev_dep_node_index, diagnostics); } // ... and finally storing a "Green" entry in the color map. @@ -814,8 +831,7 @@ impl DepGraph { mem::drop(emitting); // Promote the previous diagnostics to the current session. - tcx.queries.on_disk_cache - .store_diagnostics(dep_node_index, diagnostics.clone().into()); + tcx.queries.on_disk_cache.store_diagnostics(dep_node_index, diagnostics.clone().into()); let handle = tcx.sess.diagnostic(); @@ -836,8 +852,8 @@ impl DepGraph { loop { data.emitting_diagnostics_cond_var.wait(&mut emitting); - if data.colors - .get(prev_dep_node_index) == Some(DepNodeColor::Green(dep_node_index)) { + if data.colors.get(prev_dep_node_index) == Some(DepNodeColor::Green(dep_node_index)) + { break; } } @@ -868,8 +884,7 @@ impl DepGraph { let dep_node = data.previous.index_to_node(prev_index); dep_node.try_load_from_on_disk_cache(tcx); } - None | - Some(DepNodeColor::Red) => { + None | Some(DepNodeColor::Red) => { // We can skip red nodes because a node can only be marked // as red if the query result was recomputed and thus is // already in memory. @@ -877,6 +892,11 @@ impl DepGraph { } } } + + fn next_virtual_depnode_index(&self) -> DepNodeIndex { + let index = self.virtual_dep_node_index.fetch_add(1, Relaxed); + DepNodeIndex::from_u32(index) + } } /// A "work product" is an intermediate result that we save into the @@ -979,19 +999,16 @@ impl CurrentDepGraph { use std::time::{SystemTime, UNIX_EPOCH}; let duration = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); - let nanos = duration.as_secs() * 1_000_000_000 + - duration.subsec_nanos() as u64; + let nanos = duration.as_secs() * 1_000_000_000 + duration.subsec_nanos() as u64; let mut stable_hasher = StableHasher::new(); nanos.hash(&mut stable_hasher); let forbidden_edge = if cfg!(debug_assertions) { match env::var("RUST_FORBID_DEP_GRAPH_EDGE") { - Ok(s) => { - match EdgeFilter::new(&s) { - Ok(f) => Some(f), - Err(err) => bug!("RUST_FORBID_DEP_GRAPH_EDGE invalid: {}", err), - } - } + Ok(s) => match EdgeFilter::new(&s) { + Ok(f) => Some(f), + Err(err) => bug!("RUST_FORBID_DEP_GRAPH_EDGE invalid: {}", err), + }, Err(_) => None, } } else { @@ -1006,10 +1023,12 @@ impl CurrentDepGraph { CurrentDepGraph { data: Lock::new(IndexVec::with_capacity(new_node_count_estimate)), - node_to_node_index: Sharded::new(|| FxHashMap::with_capacity_and_hasher( - new_node_count_estimate / sharded::SHARDS, - Default::default(), - )), + node_to_node_index: Sharded::new(|| { + FxHashMap::with_capacity_and_hasher( + new_node_count_estimate / sharded::SHARDS, + Default::default(), + ) + }), anon_id_seed: stable_hasher.finish(), forbidden_edge, total_read_count: AtomicU64::new(0), @@ -1021,7 +1040,7 @@ impl CurrentDepGraph { &self, node: DepNode, task_deps: TaskDeps, - fingerprint: Fingerprint + fingerprint: Fingerprint, ) -> DepNodeIndex { self.alloc_node(node, task_deps.reads, fingerprint) } @@ -1054,12 +1073,11 @@ impl CurrentDepGraph { &self, dep_node: DepNode, edges: SmallVec<[DepNodeIndex; 8]>, - fingerprint: Fingerprint + fingerprint: Fingerprint, ) -> DepNodeIndex { - debug_assert!(!self.node_to_node_index - .get_shard_by_value(&dep_node) - .lock() - .contains_key(&dep_node)); + debug_assert!( + !self.node_to_node_index.get_shard_by_value(&dep_node).lock().contains_key(&dep_node) + ); self.intern_node(dep_node, edges, fingerprint) } @@ -1067,18 +1085,14 @@ impl CurrentDepGraph { &self, dep_node: DepNode, edges: SmallVec<[DepNodeIndex; 8]>, - fingerprint: Fingerprint + fingerprint: Fingerprint, ) -> DepNodeIndex { match self.node_to_node_index.get_shard_by_value(&dep_node).lock().entry(dep_node) { Entry::Occupied(entry) => *entry.get(), Entry::Vacant(entry) => { let mut data = self.data.lock(); let dep_node_index = DepNodeIndex::new(data.len()); - data.push(DepNodeData { - node: dep_node, - edges, - fingerprint - }); + data.push(DepNodeData { node: dep_node, edges, fingerprint }); entry.insert(dep_node_index); dep_node_index } @@ -1089,11 +1103,11 @@ impl CurrentDepGraph { impl DepGraphData { fn read_index(&self, source: DepNodeIndex) { ty::tls::with_context_opt(|icx| { - let icx = if let Some(icx) = icx { icx } else { return }; + let icx = if let Some(icx) = icx { icx } else { return }; if let Some(task_deps) = icx.task_deps { let mut task_deps = task_deps.lock(); if cfg!(debug_assertions) { - self.current.total_read_count.fetch_add(1, SeqCst); + self.current.total_read_count.fetch_add(1, Relaxed); } if task_deps.read_set.insert(source) { task_deps.reads.push(source); @@ -1105,15 +1119,13 @@ impl DepGraphData { if let Some(ref forbidden_edge) = self.current.forbidden_edge { let source = data[source].node; if forbidden_edge.test(&source, &target) { - bug!("forbidden edge {:?} -> {:?} created", - source, - target) + bug!("forbidden edge {:?} -> {:?} created", source, target) } } } } } else if cfg!(debug_assertions) { - self.current.total_duplicate_read_count.fetch_add(1, SeqCst); + self.current.total_duplicate_read_count.fetch_add(1, Relaxed); } } }) @@ -1139,25 +1151,26 @@ const COMPRESSED_FIRST_GREEN: u32 = 2; impl DepNodeColorMap { fn new(size: usize) -> DepNodeColorMap { - DepNodeColorMap { - values: (0..size).map(|_| AtomicU32::new(COMPRESSED_NONE)).collect(), - } + DepNodeColorMap { values: (0..size).map(|_| AtomicU32::new(COMPRESSED_NONE)).collect() } } fn get(&self, index: SerializedDepNodeIndex) -> Option { match self.values[index].load(Ordering::Acquire) { COMPRESSED_NONE => None, COMPRESSED_RED => Some(DepNodeColor::Red), - value => Some(DepNodeColor::Green(DepNodeIndex::from_u32( - value - COMPRESSED_FIRST_GREEN - ))) + value => { + Some(DepNodeColor::Green(DepNodeIndex::from_u32(value - COMPRESSED_FIRST_GREEN))) + } } } fn insert(&self, index: SerializedDepNodeIndex, color: DepNodeColor) { - self.values[index].store(match color { - DepNodeColor::Red => COMPRESSED_RED, - DepNodeColor::Green(index) => index.as_u32() + COMPRESSED_FIRST_GREEN, - }, Ordering::Release) + self.values[index].store( + match color { + DepNodeColor::Red => COMPRESSED_RED, + DepNodeColor::Green(index) => index.as_u32() + COMPRESSED_FIRST_GREEN, + }, + Ordering::Release, + ) } } diff --git a/src/librustc/dep_graph/mod.rs b/src/librustc/dep_graph/mod.rs index a1321d50f2..eb377d20f5 100644 --- a/src/librustc/dep_graph/mod.rs +++ b/src/librustc/dep_graph/mod.rs @@ -6,9 +6,9 @@ mod query; mod safe; mod serialized; -pub use self::dep_node::{DepNode, DepKind, DepConstructor, WorkProductId, RecoverKey, label_strs}; -pub use self::graph::{DepGraph, WorkProduct, DepNodeIndex, DepNodeColor, TaskDeps, hash_result}; +pub use self::dep_node::{label_strs, DepConstructor, DepKind, DepNode, RecoverKey, WorkProductId}; pub use self::graph::WorkProductFileKind; +pub use self::graph::{hash_result, DepGraph, DepNodeColor, DepNodeIndex, TaskDeps, WorkProduct}; pub use self::prev::PreviousDepGraph; pub use self::query::DepGraphQuery; pub use self::safe::AssertDepGraphSafe; diff --git a/src/librustc/dep_graph/prev.rs b/src/librustc/dep_graph/prev.rs index d971690bbe..fbc8f7bc99 100644 --- a/src/librustc/dep_graph/prev.rs +++ b/src/librustc/dep_graph/prev.rs @@ -1,7 +1,7 @@ -use crate::ich::Fingerprint; -use rustc_data_structures::fx::FxHashMap; use super::dep_node::DepNode; use super::serialized::{SerializedDepGraph, SerializedDepNodeIndex}; +use crate::ich::Fingerprint; +use rustc_data_structures::fx::FxHashMap; #[derive(Debug, RustcEncodable, RustcDecodable, Default)] pub struct PreviousDepGraph { @@ -11,17 +11,15 @@ pub struct PreviousDepGraph { impl PreviousDepGraph { pub fn new(data: SerializedDepGraph) -> PreviousDepGraph { - let index: FxHashMap<_, _> = data.nodes - .iter_enumerated() - .map(|(idx, &dep_node)| (dep_node, idx)) - .collect(); + let index: FxHashMap<_, _> = + data.nodes.iter_enumerated().map(|(idx, &dep_node)| (dep_node, idx)).collect(); PreviousDepGraph { data, index } } #[inline] pub fn edge_targets_from( &self, - dep_node_index: SerializedDepNodeIndex + dep_node_index: SerializedDepNodeIndex, ) -> &[SerializedDepNodeIndex] { self.data.edge_targets_from(dep_node_index) } @@ -43,15 +41,11 @@ impl PreviousDepGraph { #[inline] pub fn fingerprint_of(&self, dep_node: &DepNode) -> Option { - self.index - .get(dep_node) - .map(|&node_index| self.data.fingerprints[node_index]) + self.index.get(dep_node).map(|&node_index| self.data.fingerprints[node_index]) } #[inline] - pub fn fingerprint_by_index(&self, - dep_node_index: SerializedDepNodeIndex) - -> Fingerprint { + pub fn fingerprint_by_index(&self, dep_node_index: SerializedDepNodeIndex) -> Fingerprint { self.data.fingerprints[dep_node_index] } diff --git a/src/librustc/dep_graph/query.rs b/src/librustc/dep_graph/query.rs index cd4ced238d..c71c11ed0e 100644 --- a/src/librustc/dep_graph/query.rs +++ b/src/librustc/dep_graph/query.rs @@ -1,6 +1,6 @@ use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::graph::implementation::{ - Direction, INCOMING, Graph, NodeIndex, OUTGOING + Direction, Graph, NodeIndex, INCOMING, OUTGOING, }; use super::DepNode; @@ -11,9 +11,7 @@ pub struct DepGraphQuery { } impl DepGraphQuery { - pub fn new(nodes: &[DepNode], - edges: &[(DepNode, DepNode)]) - -> DepGraphQuery { + pub fn new(nodes: &[DepNode], edges: &[(DepNode, DepNode)]) -> DepGraphQuery { let mut graph = Graph::with_capacity(nodes.len(), edges.len()); let mut indices = FxHashMap::default(); for node in nodes { @@ -26,10 +24,7 @@ impl DepGraphQuery { graph.add_edge(source, target, ()); } - DepGraphQuery { - graph, - indices, - } + DepGraphQuery { graph, indices } } pub fn contains_node(&self, node: &DepNode) -> bool { @@ -37,26 +32,21 @@ impl DepGraphQuery { } pub fn nodes(&self) -> Vec<&DepNode> { - self.graph.all_nodes() - .iter() - .map(|n| &n.data) - .collect() + self.graph.all_nodes().iter().map(|n| &n.data).collect() } - pub fn edges(&self) -> Vec<(&DepNode,&DepNode)> { - self.graph.all_edges() - .iter() - .map(|edge| (edge.source(), edge.target())) - .map(|(s, t)| (self.graph.node_data(s), - self.graph.node_data(t))) - .collect() + pub fn edges(&self) -> Vec<(&DepNode, &DepNode)> { + self.graph + .all_edges() + .iter() + .map(|edge| (edge.source(), edge.target())) + .map(|(s, t)| (self.graph.node_data(s), self.graph.node_data(t))) + .collect() } fn reachable_nodes(&self, node: &DepNode, direction: Direction) -> Vec<&DepNode> { if let Some(&index) = self.indices.get(node) { - self.graph.depth_traverse(index, direction) - .map(|s| self.graph.node_data(s)) - .collect() + self.graph.depth_traverse(index, direction).map(|s| self.graph.node_data(s)).collect() } else { vec![] } @@ -76,9 +66,7 @@ impl DepGraphQuery { /// Just the outgoing edges from `node`. pub fn immediate_successors(&self, node: &DepNode) -> Vec<&DepNode> { if let Some(&index) = self.indices.get(&node) { - self.graph.successor_nodes(index) - .map(|s| self.graph.node_data(s)) - .collect() + self.graph.successor_nodes(index).map(|s| self.graph.node_data(s)).collect() } else { vec![] } diff --git a/src/librustc/dep_graph/safe.rs b/src/librustc/dep_graph/safe.rs index e5eda14cdb..23aef0c429 100644 --- a/src/librustc/dep_graph/safe.rs +++ b/src/librustc/dep_graph/safe.rs @@ -1,35 +1,32 @@ //! The `DepGraphSafe` trait -use crate::hir::BodyId; -use crate::hir::def_id::DefId; -use syntax::ast::NodeId; use crate::ty::TyCtxt; +use rustc_hir::def_id::DefId; +use rustc_hir::BodyId; +use syntax::ast::NodeId; + /// The `DepGraphSafe` trait is used to specify what kinds of values /// are safe to "leak" into a task. The idea is that this should be /// only be implemented for things like the tcx as well as various id /// types, which will create reads in the dep-graph whenever the trait /// loads anything that might depend on the input program. -pub trait DepGraphSafe { -} +pub trait DepGraphSafe {} /// A `BodyId` on its own doesn't give access to any particular state. /// You must fetch the state from the various maps or generate /// on-demand queries, all of which create reads. -impl DepGraphSafe for BodyId { -} +impl DepGraphSafe for BodyId {} /// A `NodeId` on its own doesn't give access to any particular state. /// You must fetch the state from the various maps or generate /// on-demand queries, all of which create reads. -impl DepGraphSafe for NodeId { -} +impl DepGraphSafe for NodeId {} /// A `DefId` on its own doesn't give access to any particular state. /// You must fetch the state from the various maps or generate /// on-demand queries, all of which create reads. -impl DepGraphSafe for DefId { -} +impl DepGraphSafe for DefId {} /// The type context itself can be used to access all kinds of tracked /// state, but those accesses should always generate read events. @@ -37,31 +34,24 @@ impl<'tcx> DepGraphSafe for TyCtxt<'tcx> {} /// Tuples make it easy to build up state. impl DepGraphSafe for (A, B) - where A: DepGraphSafe, B: DepGraphSafe +where + A: DepGraphSafe, + B: DepGraphSafe, { } /// Shared ref to dep-graph-safe stuff should still be dep-graph-safe. -impl<'a, A> DepGraphSafe for &'a A - where A: DepGraphSafe, -{ -} +impl<'a, A> DepGraphSafe for &'a A where A: DepGraphSafe {} /// Mut ref to dep-graph-safe stuff should still be dep-graph-safe. -impl<'a, A> DepGraphSafe for &'a mut A - where A: DepGraphSafe, -{ -} - +impl<'a, A> DepGraphSafe for &'a mut A where A: DepGraphSafe {} /// No data here! :) -impl DepGraphSafe for () { -} +impl DepGraphSafe for () {} /// A convenient override that lets you pass arbitrary state into a /// task. Every use should be accompanied by a comment explaining why /// it makes sense (or how it could be refactored away in the future). pub struct AssertDepGraphSafe(pub T); -impl DepGraphSafe for AssertDepGraphSafe { -} +impl DepGraphSafe for AssertDepGraphSafe {} diff --git a/src/librustc/dep_graph/serialized.rs b/src/librustc/dep_graph/serialized.rs index 4302195755..45ef52dbf3 100644 --- a/src/librustc/dep_graph/serialized.rs +++ b/src/librustc/dep_graph/serialized.rs @@ -2,7 +2,7 @@ use crate::dep_graph::DepNode; use crate::ich::Fingerprint; -use rustc_index::vec::{IndexVec, Idx}; +use rustc_index::vec::IndexVec; rustc_index::newtype_index! { pub struct SerializedDepNodeIndex { .. } @@ -27,9 +27,7 @@ pub struct SerializedDepGraph { impl SerializedDepGraph { #[inline] - pub fn edge_targets_from(&self, - source: SerializedDepNodeIndex) - -> &[SerializedDepNodeIndex] { + pub fn edge_targets_from(&self, source: SerializedDepNodeIndex) -> &[SerializedDepNodeIndex] { let targets = self.edge_list_indices[source]; &self.edge_list_data[targets.0 as usize..targets.1 as usize] } diff --git a/src/librustc/hir/check_attr.rs b/src/librustc/hir/check_attr.rs index ea1c585176..03fa426460 100644 --- a/src/librustc/hir/check_attr.rs +++ b/src/librustc/hir/check_attr.rs @@ -4,19 +4,23 @@ //! conflicts between multiple such attributes attached to the same //! item. -use crate::hir::{self, HirId, HirVec, Attribute, Item, ItemKind, TraitItem, TraitItemKind}; -use crate::hir::DUMMY_HIR_ID; -use crate::hir::def_id::DefId; -use crate::hir::intravisit::{self, Visitor, NestedVisitorMap}; -use crate::lint::builtin::UNUSED_ATTRIBUTES; -use crate::ty::TyCtxt; +use crate::hir::map::Map; use crate::ty::query::Providers; +use crate::ty::TyCtxt; -use std::fmt::{self, Display}; -use syntax::{attr, symbol::sym}; -use syntax_pos::Span; +use rustc_errors::struct_span_err; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_hir::DUMMY_HIR_ID; +use rustc_hir::{self, HirId, Item, ItemKind, TraitItem, TraitItemKind}; +use rustc_session::lint::builtin::{CONFLICTING_REPR_HINTS, UNUSED_ATTRIBUTES}; +use rustc_span::symbol::sym; +use rustc_span::Span; +use syntax::ast::Attribute; +use syntax::attr; -use rustc_error_codes::*; +use std::fmt::{self, Display}; #[derive(Copy, Clone, PartialEq)] pub(crate) enum MethodKind { @@ -55,38 +59,42 @@ pub(crate) enum Target { impl Display for Target { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", match *self { - Target::ExternCrate => "extern crate", - Target::Use => "use", - Target::Static => "static item", - Target::Const => "constant item", - Target::Fn => "function", - Target::Closure => "closure", - Target::Mod => "module", - Target::ForeignMod => "foreign module", - Target::GlobalAsm => "global asm", - Target::TyAlias => "type alias", - Target::OpaqueTy => "opaque type", - Target::Enum => "enum", - Target::Struct => "struct", - Target::Union => "union", - Target::Trait => "trait", - Target::TraitAlias => "trait alias", - Target::Impl => "item", - Target::Expression => "expression", - Target::Statement => "statement", - Target::AssocConst => "associated const", - Target::Method(_) => "method", - Target::AssocTy => "associated type", - Target::ForeignFn => "foreign function", - Target::ForeignStatic => "foreign static item", - Target::ForeignTy => "foreign type", - }) + write!( + f, + "{}", + match *self { + Target::ExternCrate => "extern crate", + Target::Use => "use", + Target::Static => "static item", + Target::Const => "constant item", + Target::Fn => "function", + Target::Closure => "closure", + Target::Mod => "module", + Target::ForeignMod => "foreign module", + Target::GlobalAsm => "global asm", + Target::TyAlias => "type alias", + Target::OpaqueTy => "opaque type", + Target::Enum => "enum", + Target::Struct => "struct", + Target::Union => "union", + Target::Trait => "trait", + Target::TraitAlias => "trait alias", + Target::Impl => "item", + Target::Expression => "expression", + Target::Statement => "statement", + Target::AssocConst => "associated const", + Target::Method(_) => "method", + Target::AssocTy => "associated type", + Target::ForeignFn => "foreign function", + Target::ForeignStatic => "foreign static item", + Target::ForeignTy => "foreign type", + } + ) } } impl Target { - pub(crate) fn from_item(item: &Item) -> Target { + pub(crate) fn from_item(item: &Item<'_>) -> Target { match item.kind { ItemKind::ExternCrate(..) => Target::ExternCrate, ItemKind::Use(..) => Target::Use, @@ -103,11 +111,11 @@ impl Target { ItemKind::Union(..) => Target::Union, ItemKind::Trait(..) => Target::Trait, ItemKind::TraitAlias(..) => Target::TraitAlias, - ItemKind::Impl(..) => Target::Impl, + ItemKind::Impl { .. } => Target::Impl, } } - fn from_trait_item(trait_item: &TraitItem) -> Target { + fn from_trait_item(trait_item: &TraitItem<'_>) -> Target { match trait_item.kind { TraitItemKind::Const(..) => Target::AssocConst, TraitItemKind::Method(_, hir::TraitMethod::Required(_)) => { @@ -120,7 +128,7 @@ impl Target { } } - fn from_foreign_item(foreign_item: &hir::ForeignItem) -> Target { + fn from_foreign_item(foreign_item: &hir::ForeignItem<'_>) -> Target { match foreign_item.kind { hir::ForeignItemKind::Fn(..) => Target::ForeignFn, hir::ForeignItemKind::Static(..) => Target::ForeignStatic, @@ -128,14 +136,14 @@ impl Target { } } - fn from_impl_item<'tcx>(tcx: TyCtxt<'tcx>, impl_item: &hir::ImplItem) -> Target { + fn from_impl_item<'tcx>(tcx: TyCtxt<'tcx>, impl_item: &hir::ImplItem<'_>) -> Target { match impl_item.kind { hir::ImplItemKind::Const(..) => Target::AssocConst, hir::ImplItemKind::Method(..) => { let parent_hir_id = tcx.hir().get_parent_item(impl_item.hir_id); let containing_item = tcx.hir().expect_item(parent_hir_id); let containing_impl_is_for_trait = match &containing_item.kind { - hir::ItemKind::Impl(_, _, _, _, tr, _, _) => tr.is_some(), + hir::ItemKind::Impl { ref of_trait, .. } => of_trait.is_some(), _ => bug!("parent of an ImplItem must be an Impl"), }; if containing_impl_is_for_trait { @@ -158,10 +166,10 @@ impl CheckAttrVisitor<'tcx> { fn check_attributes( &self, hir_id: HirId, - attrs: &HirVec, + attrs: &'hir [Attribute], span: &Span, target: Target, - item: Option<&Item>, + item: Option<&Item<'_>>, ) { let mut is_valid = true; for attr in attrs { @@ -188,22 +196,26 @@ impl CheckAttrVisitor<'tcx> { self.tcx.codegen_fn_attrs(self.tcx.hir().local_def_id(hir_id)); } - self.check_repr(attrs, span, target, item); + self.check_repr(attrs, span, target, item, hir_id); self.check_used(attrs, target); } /// Checks if an `#[inline]` is applied to a function or a closure. Returns `true` if valid. fn check_inline(&self, hir_id: HirId, attr: &Attribute, span: &Span, target: Target) -> bool { match target { - Target::Fn | Target::Closure | Target::Method(MethodKind::Trait { body: true }) + Target::Fn + | Target::Closure + | Target::Method(MethodKind::Trait { body: true }) | Target::Method(MethodKind::Inherent) => true, Target::Method(MethodKind::Trait { body: false }) | Target::ForeignFn => { - self.tcx.struct_span_lint_hir( - UNUSED_ATTRIBUTES, - hir_id, - attr.span, - "`#[inline]` is ignored on function prototypes", - ).emit(); + self.tcx + .struct_span_lint_hir( + UNUSED_ATTRIBUTES, + hir_id, + attr.span, + "`#[inline]` is ignored on function prototypes", + ) + .emit(); true } // FIXME(#65833): We permit associated consts to have an `#[inline]` attribute with @@ -211,17 +223,23 @@ impl CheckAttrVisitor<'tcx> { // accidentally, to to be compatible with crates depending on them, we can't throw an // error here. Target::AssocConst => { - self.tcx.struct_span_lint_hir( - UNUSED_ATTRIBUTES, - hir_id, - attr.span, - "`#[inline]` is ignored on constants", - ).warn("this was previously accepted by the compiler but is \ + self.tcx + .struct_span_lint_hir( + UNUSED_ATTRIBUTES, + hir_id, + attr.span, + "`#[inline]` is ignored on constants", + ) + .warn( + "this was previously accepted by the compiler but is \ being phased out; it will become a hard error in \ - a future release!") - .note("for more information, see issue #65833 \ - ") - .emit(); + a future release!", + ) + .note( + "for more information, see issue #65833 \ + ", + ) + .emit(); true } _ => { @@ -230,8 +248,9 @@ impl CheckAttrVisitor<'tcx> { attr.span, E0518, "attribute should be applied to function or closure", - ).span_label(*span, "not a function or closure") - .emit(); + ) + .span_label(*span, "not a function or closure") + .emit(); false } } @@ -241,7 +260,7 @@ impl CheckAttrVisitor<'tcx> { fn check_track_caller( &self, attr_span: &Span, - attrs: &HirVec, + attrs: &'hir [Attribute], span: &Span, target: Target, ) -> bool { @@ -252,7 +271,8 @@ impl CheckAttrVisitor<'tcx> { *attr_span, E0736, "cannot use `#[track_caller]` with `#[naked]`", - ).emit(); + ) + .emit(); false } Target::Fn | Target::Method(MethodKind::Inherent) => true, @@ -262,7 +282,8 @@ impl CheckAttrVisitor<'tcx> { *attr_span, E0738, "`#[track_caller]` may not be used on trait methods", - ).emit(); + ) + .emit(); false } _ => { @@ -280,21 +301,18 @@ impl CheckAttrVisitor<'tcx> { } /// Checks if the `#[non_exhaustive]` attribute on an `item` is valid. Returns `true` if valid. - fn check_non_exhaustive( - &self, - attr: &Attribute, - span: &Span, - target: Target, - ) -> bool { + fn check_non_exhaustive(&self, attr: &Attribute, span: &Span, target: Target) -> bool { match target { Target::Struct | Target::Enum => true, _ => { - struct_span_err!(self.tcx.sess, - attr.span, - E0701, - "attribute can only be applied to a struct or enum") - .span_label(*span, "not a struct or enum") - .emit(); + struct_span_err!( + self.tcx.sess, + attr.span, + E0701, + "attribute can only be applied to a struct or enum" + ) + .span_label(*span, "not a struct or enum") + .emit(); false } } @@ -305,7 +323,8 @@ impl CheckAttrVisitor<'tcx> { match target { Target::Trait => true, _ => { - self.tcx.sess + self.tcx + .sess .struct_span_err(attr.span, "attribute can only be applied to a trait") .span_label(*span, "not a trait") .emit(); @@ -317,25 +336,28 @@ impl CheckAttrVisitor<'tcx> { /// Checks if the `#[target_feature]` attribute on `item` is valid. Returns `true` if valid. fn check_target_feature(&self, attr: &Attribute, span: &Span, target: Target) -> bool { match target { - Target::Fn | Target::Method(MethodKind::Trait { body: true }) + Target::Fn + | Target::Method(MethodKind::Trait { body: true }) | Target::Method(MethodKind::Inherent) => true, _ => { - self.tcx.sess + self.tcx + .sess .struct_span_err(attr.span, "attribute should be applied to a function") .span_label(*span, "not a function") .emit(); false - }, + } } } /// Checks if the `#[repr]` attributes on `item` are valid. fn check_repr( &self, - attrs: &HirVec, + attrs: &'hir [Attribute], span: &Span, target: Target, - item: Option<&Item>, + item: Option<&Item<'_>>, + hir_id: HirId, ) { // Extract the names of all repr hints, e.g., [foo, bar, align] for: // ``` @@ -364,20 +386,15 @@ impl CheckAttrVisitor<'tcx> { } } sym::packed => { - if target != Target::Struct && - target != Target::Union { - ("a", "struct or union") + if target != Target::Struct && target != Target::Union { + ("a", "struct or union") } else { - continue + continue; } } sym::simd => { is_simd = true; - if target != Target::Struct { - ("a", "struct") - } else { - continue - } + if target != Target::Struct { ("a", "struct") } else { continue } } sym::transparent => { is_transparent = true; @@ -386,15 +403,18 @@ impl CheckAttrVisitor<'tcx> { _ => ("a", "struct, enum, or union"), } } - sym::i8 | sym::u8 | sym::i16 | sym::u16 | - sym::i32 | sym::u32 | sym::i64 | sym::u64 | - sym::isize | sym::usize => { + sym::i8 + | sym::u8 + | sym::i16 + | sym::u16 + | sym::i32 + | sym::u32 + | sym::i64 + | sym::u64 + | sym::isize + | sym::usize => { int_reprs += 1; - if target != Target::Enum { - ("an", "enum") - } else { - continue - } + if target != Target::Enum { ("an", "enum") } else { continue } } _ => continue, }; @@ -413,16 +433,29 @@ impl CheckAttrVisitor<'tcx> { // Error on repr(transparent, ). if is_transparent && hints.len() > 1 { let hint_spans: Vec<_> = hint_spans.clone().collect(); - span_err!(self.tcx.sess, hint_spans, E0692, - "transparent {} cannot have other repr hints", target); + struct_span_err!( + self.tcx.sess, + hint_spans, + E0692, + "transparent {} cannot have other repr hints", + target + ) + .emit(); } // Warn on repr(u8, u16), repr(C, simd), and c-like-enum-repr(C, u8) if (int_reprs > 1) - || (is_simd && is_c) - || (int_reprs == 1 && is_c && item.map_or(false, |item| is_c_like_enum(item))) { - let hint_spans: Vec<_> = hint_spans.collect(); - span_warn!(self.tcx.sess, hint_spans, E0566, - "conflicting representation hints"); + || (is_simd && is_c) + || (int_reprs == 1 && is_c && item.map_or(false, |item| is_c_like_enum(item))) + { + self.tcx + .struct_span_lint_hir( + CONFLICTING_REPR_HINTS, + hir_id, + hint_spans.collect::>(), + "conflicting representation hints", + ) + .code(rustc_errors::error_code!(E0566)) + .emit(); } } @@ -438,7 +471,7 @@ impl CheckAttrVisitor<'tcx> { .emit(); } - fn check_stmt_attributes(&self, stmt: &hir::Stmt) { + fn check_stmt_attributes(&self, stmt: &hir::Stmt<'_>) { // When checking statements ignore expressions, they will be checked later if let hir::StmtKind::Local(ref l) = stmt.kind { for attr in l.attrs.iter() { @@ -457,7 +490,7 @@ impl CheckAttrVisitor<'tcx> { } } - fn check_expr_attributes(&self, expr: &hir::Expr) { + fn check_expr_attributes(&self, expr: &hir::Expr<'_>) { let target = match expr.kind { hir::ExprKind::Closure(..) => Target::Closure, _ => Target::Expression, @@ -477,10 +510,11 @@ impl CheckAttrVisitor<'tcx> { } } - fn check_used(&self, attrs: &HirVec, target: Target) { + fn check_used(&self, attrs: &'hir [Attribute], target: Target) { for attr in attrs { if attr.check_name(sym::used) && target != Target::Static { - self.tcx.sess + self.tcx + .sess .span_err(attr.span, "attribute must be applied to a `static` variable"); } } @@ -488,48 +522,50 @@ impl CheckAttrVisitor<'tcx> { } impl Visitor<'tcx> for CheckAttrVisitor<'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, Self::Map> { NestedVisitorMap::OnlyBodies(&self.tcx.hir()) } - fn visit_item(&mut self, item: &'tcx Item) { + fn visit_item(&mut self, item: &'tcx Item<'tcx>) { let target = Target::from_item(item); - self.check_attributes(item.hir_id, &item.attrs, &item.span, target, Some(item)); + self.check_attributes(item.hir_id, item.attrs, &item.span, target, Some(item)); intravisit::walk_item(self, item) } - fn visit_trait_item(&mut self, trait_item: &'tcx TraitItem) { + fn visit_trait_item(&mut self, trait_item: &'tcx TraitItem<'tcx>) { let target = Target::from_trait_item(trait_item); self.check_attributes(trait_item.hir_id, &trait_item.attrs, &trait_item.span, target, None); intravisit::walk_trait_item(self, trait_item) } - fn visit_foreign_item(&mut self, f_item: &'tcx hir::ForeignItem) { + fn visit_foreign_item(&mut self, f_item: &'tcx hir::ForeignItem<'tcx>) { let target = Target::from_foreign_item(f_item); self.check_attributes(f_item.hir_id, &f_item.attrs, &f_item.span, target, None); intravisit::walk_foreign_item(self, f_item) } - fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem) { + fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { let target = Target::from_impl_item(self.tcx, impl_item); self.check_attributes(impl_item.hir_id, &impl_item.attrs, &impl_item.span, target, None); intravisit::walk_impl_item(self, impl_item) } - fn visit_stmt(&mut self, stmt: &'tcx hir::Stmt) { + fn visit_stmt(&mut self, stmt: &'tcx hir::Stmt<'tcx>) { self.check_stmt_attributes(stmt); intravisit::walk_stmt(self, stmt) } - fn visit_expr(&mut self, expr: &'tcx hir::Expr) { + fn visit_expr(&mut self, expr: &'tcx hir::Expr<'tcx>) { self.check_expr_attributes(expr); intravisit::walk_expr(self, expr) } } -fn is_c_like_enum(item: &Item) -> bool { +fn is_c_like_enum(item: &Item<'_>) -> bool { if let ItemKind::Enum(ref def, _) = item.kind { - for variant in &def.variants { + for variant in def.variants { match variant.data { hir::VariantData::Unit(..) => { /* continue */ } _ => return false, @@ -542,15 +578,10 @@ fn is_c_like_enum(item: &Item) -> bool { } fn check_mod_attrs(tcx: TyCtxt<'_>, module_def_id: DefId) { - tcx.hir().visit_item_likes_in_module( - module_def_id, - &mut CheckAttrVisitor { tcx }.as_deep_visitor() - ); + tcx.hir() + .visit_item_likes_in_module(module_def_id, &mut CheckAttrVisitor { tcx }.as_deep_visitor()); } pub(crate) fn provide(providers: &mut Providers<'_>) { - *providers = Providers { - check_mod_attrs, - ..*providers - }; + *providers = Providers { check_mod_attrs, ..*providers }; } diff --git a/src/librustc/hir/exports.rs b/src/librustc/hir/exports.rs new file mode 100644 index 0000000000..db020e39e8 --- /dev/null +++ b/src/librustc/hir/exports.rs @@ -0,0 +1,32 @@ +use crate::ty; + +use rustc_hir::def::Res; +use rustc_hir::def_id::DefIdMap; +use rustc_macros::HashStable; +use rustc_span::Span; +use syntax::ast; + +use std::fmt::Debug; + +/// This is the replacement export map. It maps a module to all of the exports +/// within. +pub type ExportMap = DefIdMap>>; + +#[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] +pub struct Export { + /// The name of the target. + pub ident: ast::Ident, + /// The resolution of the target. + pub res: Res, + /// The span of the target. + pub span: Span, + /// The visibility of the export. + /// We include non-`pub` exports for hygienic macros that get used from extern crates. + pub vis: ty::Visibility, +} + +impl Export { + pub fn map_id(self, map: impl FnMut(Id) -> R) -> Export { + Export { ident: self.ident, res: self.res.map_id(map), span: self.span, vis: self.vis } + } +} diff --git a/src/librustc/hir/map/blocks.rs b/src/librustc/hir/map/blocks.rs index ff793fd861..016fc939a7 100644 --- a/src/librustc/hir/map/blocks.rs +++ b/src/librustc/hir/map/blocks.rs @@ -11,12 +11,12 @@ //! nested within a uniquely determined `FnLike`), and users can ask //! for the `Code` associated with a particular NodeId. -use crate::hir as ast; -use crate::hir::intravisit::FnKind; -use crate::hir::map; -use crate::hir::{Expr, FnDecl, Node}; +use crate::hir::map::Map; +use rustc_hir as hir; +use rustc_hir::intravisit::FnKind; +use rustc_hir::{Expr, FnDecl, Node}; +use rustc_span::Span; use syntax::ast::{Attribute, Ident}; -use syntax_pos::Span; /// An FnLikeNode is a Node that is like a fn, in that it has a decl /// and a body (as well as a NodeId, a span, etc). @@ -39,37 +39,37 @@ trait MaybeFnLike { fn is_fn_like(&self) -> bool; } -impl MaybeFnLike for ast::Item { +impl MaybeFnLike for hir::Item<'_> { fn is_fn_like(&self) -> bool { match self.kind { - ast::ItemKind::Fn(..) => true, + hir::ItemKind::Fn(..) => true, _ => false, } } } -impl MaybeFnLike for ast::ImplItem { +impl MaybeFnLike for hir::ImplItem<'_> { fn is_fn_like(&self) -> bool { match self.kind { - ast::ImplItemKind::Method(..) => true, + hir::ImplItemKind::Method(..) => true, _ => false, } } } -impl MaybeFnLike for ast::TraitItem { +impl MaybeFnLike for hir::TraitItem<'_> { fn is_fn_like(&self) -> bool { match self.kind { - ast::TraitItemKind::Method(_, ast::TraitMethod::Provided(_)) => true, + hir::TraitItemKind::Method(_, hir::TraitMethod::Provided(_)) => true, _ => false, } } } -impl MaybeFnLike for ast::Expr { +impl MaybeFnLike for hir::Expr<'_> { fn is_fn_like(&self) -> bool { match self.kind { - ast::ExprKind::Closure(..) => true, + hir::ExprKind::Closure(..) => true, _ => false, } } @@ -81,11 +81,11 @@ impl MaybeFnLike for ast::Expr { #[derive(Copy, Clone)] pub enum Code<'a> { FnLike(FnLikeNode<'a>), - Expr(&'a Expr), + Expr(&'a Expr<'a>), } impl<'a> Code<'a> { - pub fn id(&self) -> ast::HirId { + pub fn id(&self) -> hir::HirId { match *self { Code::FnLike(node) => node.id(), Code::Expr(block) => block.hir_id, @@ -93,13 +93,13 @@ impl<'a> Code<'a> { } /// Attempts to construct a Code from presumed FnLike or Expr node input. - pub fn from_node(map: &map::Map<'a>, id: ast::HirId) -> Option> { + pub fn from_node(map: &Map<'a>, id: hir::HirId) -> Option> { match map.get(id) { - map::Node::Block(_) => { + Node::Block(_) => { // Use the parent, hopefully an expression node. Code::from_node(map, map.get_parent_node(id)) } - map::Node::Expr(expr) => Some(Code::Expr(expr)), + Node::Expr(expr) => Some(Code::Expr(expr)), node => FnLikeNode::from_node(node).map(Code::FnLike), } } @@ -109,12 +109,12 @@ impl<'a> Code<'a> { /// use when implementing FnLikeNode operations. struct ItemFnParts<'a> { ident: Ident, - decl: &'a ast::FnDecl, - header: ast::FnHeader, - vis: &'a ast::Visibility, - generics: &'a ast::Generics, - body: ast::BodyId, - id: ast::HirId, + decl: &'a hir::FnDecl<'a>, + header: hir::FnHeader, + vis: &'a hir::Visibility<'a>, + generics: &'a hir::Generics<'a>, + body: hir::BodyId, + id: hir::HirId, span: Span, attrs: &'a [Attribute], } @@ -122,15 +122,21 @@ struct ItemFnParts<'a> { /// These are all the components one can extract from a closure expr /// for use when implementing FnLikeNode operations. struct ClosureParts<'a> { - decl: &'a FnDecl, - body: ast::BodyId, - id: ast::HirId, + decl: &'a FnDecl<'a>, + body: hir::BodyId, + id: hir::HirId, span: Span, attrs: &'a [Attribute], } impl<'a> ClosureParts<'a> { - fn new(d: &'a FnDecl, b: ast::BodyId, id: ast::HirId, s: Span, attrs: &'a [Attribute]) -> Self { + fn new( + d: &'a FnDecl<'a>, + b: hir::BodyId, + id: hir::HirId, + s: Span, + attrs: &'a [Attribute], + ) -> Self { ClosureParts { decl: d, body: b, id, span: s, attrs } } } @@ -139,27 +145,27 @@ impl<'a> FnLikeNode<'a> { /// Attempts to construct a FnLikeNode from presumed FnLike node input. pub fn from_node(node: Node<'_>) -> Option> { let fn_like = match node { - map::Node::Item(item) => item.is_fn_like(), - map::Node::TraitItem(tm) => tm.is_fn_like(), - map::Node::ImplItem(it) => it.is_fn_like(), - map::Node::Expr(e) => e.is_fn_like(), + Node::Item(item) => item.is_fn_like(), + Node::TraitItem(tm) => tm.is_fn_like(), + Node::ImplItem(it) => it.is_fn_like(), + Node::Expr(e) => e.is_fn_like(), _ => false, }; fn_like.then_some(FnLikeNode { node }) } - pub fn body(self) -> ast::BodyId { + pub fn body(self) -> hir::BodyId { self.handle( |i: ItemFnParts<'a>| i.body, - |_, _, _: &'a ast::FnSig, _, body: ast::BodyId, _, _| body, + |_, _, _: &'a hir::FnSig<'a>, _, body: hir::BodyId, _, _| body, |c: ClosureParts<'a>| c.body, ) } - pub fn decl(self) -> &'a FnDecl { + pub fn decl(self) -> &'a FnDecl<'a> { self.handle( |i: ItemFnParts<'a>| &*i.decl, - |_, _, sig: &'a ast::FnSig, _, _, _, _| &sig.decl, + |_, _, sig: &'a hir::FnSig<'a>, _, _, _, _| &sig.decl, |c: ClosureParts<'a>| c.decl, ) } @@ -167,29 +173,29 @@ impl<'a> FnLikeNode<'a> { pub fn span(self) -> Span { self.handle( |i: ItemFnParts<'_>| i.span, - |_, _, _: &'a ast::FnSig, _, _, span, _| span, + |_, _, _: &'a hir::FnSig<'a>, _, _, span, _| span, |c: ClosureParts<'_>| c.span, ) } - pub fn id(self) -> ast::HirId { + pub fn id(self) -> hir::HirId { self.handle( |i: ItemFnParts<'_>| i.id, - |id, _, _: &'a ast::FnSig, _, _, _, _| id, + |id, _, _: &'a hir::FnSig<'a>, _, _, _, _| id, |c: ClosureParts<'_>| c.id, ) } - pub fn constness(self) -> ast::Constness { - self.kind().header().map_or(ast::Constness::NotConst, |header| header.constness) + pub fn constness(self) -> hir::Constness { + self.kind().header().map_or(hir::Constness::NotConst, |header| header.constness) } - pub fn asyncness(self) -> ast::IsAsync { - self.kind().header().map_or(ast::IsAsync::NotAsync, |header| header.asyncness) + pub fn asyncness(self) -> hir::IsAsync { + self.kind().header().map_or(hir::IsAsync::NotAsync, |header| header.asyncness) } - pub fn unsafety(self) -> ast::Unsafety { - self.kind().header().map_or(ast::Unsafety::Normal, |header| header.unsafety) + pub fn unsafety(self) -> hir::Unsafety { + self.kind().header().map_or(hir::Unsafety::Normal, |header| header.unsafety) } pub fn kind(self) -> FnKind<'a> { @@ -197,7 +203,7 @@ impl<'a> FnLikeNode<'a> { FnKind::ItemFn(p.ident, p.generics, p.header, p.vis, p.attrs) }; let closure = |c: ClosureParts<'a>| FnKind::Closure(c.attrs); - let method = |_, ident: Ident, sig: &'a ast::FnSig, vis, _, _, attrs| { + let method = |_, ident: Ident, sig: &'a hir::FnSig<'a>, vis, _, _, attrs| { FnKind::Method(ident, sig, vis, attrs) }; self.handle(item, method, closure) @@ -207,19 +213,19 @@ impl<'a> FnLikeNode<'a> { where I: FnOnce(ItemFnParts<'a>) -> A, M: FnOnce( - ast::HirId, + hir::HirId, Ident, - &'a ast::FnSig, - Option<&'a ast::Visibility>, - ast::BodyId, + &'a hir::FnSig<'a>, + Option<&'a hir::Visibility<'a>>, + hir::BodyId, Span, &'a [Attribute], ) -> A, C: FnOnce(ClosureParts<'a>) -> A, { match self.node { - map::Node::Item(i) => match i.kind { - ast::ItemKind::Fn(ref sig, ref generics, block) => item_fn(ItemFnParts { + Node::Item(i) => match i.kind { + hir::ItemKind::Fn(ref sig, ref generics, block) => item_fn(ItemFnParts { id: i.hir_id, ident: i.ident, decl: &sig.decl, @@ -232,20 +238,20 @@ impl<'a> FnLikeNode<'a> { }), _ => bug!("item FnLikeNode that is not fn-like"), }, - map::Node::TraitItem(ti) => match ti.kind { - ast::TraitItemKind::Method(ref sig, ast::TraitMethod::Provided(body)) => { + Node::TraitItem(ti) => match ti.kind { + hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) => { method(ti.hir_id, ti.ident, sig, None, body, ti.span, &ti.attrs) } _ => bug!("trait method FnLikeNode that is not fn-like"), }, - map::Node::ImplItem(ii) => match ii.kind { - ast::ImplItemKind::Method(ref sig, body) => { + Node::ImplItem(ii) => match ii.kind { + hir::ImplItemKind::Method(ref sig, body) => { method(ii.hir_id, ii.ident, sig, Some(&ii.vis), body, ii.span, &ii.attrs) } _ => bug!("impl method FnLikeNode that is not fn-like"), }, - map::Node::Expr(e) => match e.kind { - ast::ExprKind::Closure(_, ref decl, block, _fn_decl_span, _gen) => { + Node::Expr(e) => match e.kind { + hir::ExprKind::Closure(_, ref decl, block, _fn_decl_span, _gen) => { closure(ClosureParts::new(&decl, block, e.hir_id, e.span, &e.attrs)) } _ => bug!("expr FnLikeNode that is not fn-like"), diff --git a/src/librustc/hir/map/collector.rs b/src/librustc/hir/map/collector.rs index 76aa186696..b6be4bb001 100644 --- a/src/librustc/hir/map/collector.rs +++ b/src/librustc/hir/map/collector.rs @@ -1,28 +1,29 @@ -use super::*; -use crate::dep_graph::{DepGraph, DepKind, DepNodeIndex}; -use crate::hir; -use crate::hir::def_id::{CrateNum, LOCAL_CRATE}; -use crate::hir::intravisit::{NestedVisitorMap, Visitor}; -use crate::hir::map::HirEntryMap; -use crate::ich::Fingerprint; +use crate::dep_graph::{DepGraph, DepKind, DepNode, DepNodeIndex}; +use crate::hir::map::definitions::{self, DefPathHash}; +use crate::hir::map::{Entry, HirEntryMap, Map}; +use crate::ich::StableHashingContext; use crate::middle::cstore::CrateStore; -use crate::session::CrateDisambiguator; -use crate::session::Session; -use crate::util::nodemap::FxHashMap; +use rustc_data_structures::fingerprint::Fingerprint; +use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_data_structures::svh::Svh; +use rustc_hir as hir; +use rustc_hir::def_id::CRATE_DEF_INDEX; +use rustc_hir::def_id::{CrateNum, DefIndex, LOCAL_CRATE}; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_hir::*; use rustc_index::vec::IndexVec; -use std::iter::repeat; +use rustc_session::{CrateDisambiguator, Session}; +use rustc_span::source_map::SourceMap; +use rustc_span::{Span, Symbol, DUMMY_SP}; use syntax::ast::NodeId; -use syntax::source_map::SourceMap; -use syntax_pos::Span; -use crate::ich::StableHashingContext; -use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use std::iter::repeat; /// A visitor that walks over the HIR and collects `Node`s into a HIR map. pub(super) struct NodeCollector<'a, 'hir> { /// The crate - krate: &'hir Crate, + krate: &'hir Crate<'hir>, /// Source map source_map: &'a SourceMap, @@ -50,15 +51,12 @@ pub(super) struct NodeCollector<'a, 'hir> { hir_body_nodes: Vec<(DefPathHash, Fingerprint)>, } -fn input_dep_node_and_hash( +fn input_dep_node_and_hash( dep_graph: &DepGraph, hcx: &mut StableHashingContext<'_>, dep_node: DepNode, - input: I, -) -> (DepNodeIndex, Fingerprint) -where - I: for<'a> HashStable>, -{ + input: impl for<'a> HashStable>, +) -> (DepNodeIndex, Fingerprint) { let dep_node_index = dep_graph.input_task(dep_node, &mut *hcx, &input).1; let hash = if dep_graph.is_fully_enabled() { @@ -72,16 +70,13 @@ where (dep_node_index, hash) } -fn alloc_hir_dep_nodes( +fn alloc_hir_dep_nodes( dep_graph: &DepGraph, hcx: &mut StableHashingContext<'_>, def_path_hash: DefPathHash, - item_like: I, + item_like: impl for<'a> HashStable>, hir_body_nodes: &mut Vec<(DefPathHash, Fingerprint)>, -) -> (DepNodeIndex, DepNodeIndex) -where - I: for<'a> HashStable>, -{ +) -> (DepNodeIndex, DepNodeIndex) { let sig = dep_graph .input_task( def_path_hash.to_dep_node(DepKind::Hir), @@ -99,10 +94,25 @@ where (sig, full) } +fn upstream_crates(cstore: &dyn CrateStore) -> Vec<(Symbol, Fingerprint, Svh)> { + let mut upstream_crates: Vec<_> = cstore + .crates_untracked() + .iter() + .map(|&cnum| { + let name = cstore.crate_name_untracked(cnum); + let disambiguator = cstore.crate_disambiguator_untracked(cnum).to_fingerprint(); + let hash = cstore.crate_hash_untracked(cnum); + (name, disambiguator, hash) + }) + .collect(); + upstream_crates.sort_unstable_by_key(|&(name, dis, _)| (name.as_str(), dis)); + upstream_crates +} + impl<'a, 'hir> NodeCollector<'a, 'hir> { pub(super) fn root( sess: &'a Session, - krate: &'hir Crate, + krate: &'hir Crate<'hir>, dep_graph: &'a DepGraph, definitions: &'a definitions::Definitions, hir_to_node_id: &'a FxHashMap, @@ -191,18 +201,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> { }, ); - let mut upstream_crates: Vec<_> = cstore - .crates_untracked() - .iter() - .map(|&cnum| { - let name = cstore.crate_name_untracked(cnum); - let disambiguator = cstore.crate_disambiguator_untracked(cnum).to_fingerprint(); - let hash = cstore.crate_hash_untracked(cnum); - (name, disambiguator, hash) - }) - .collect(); - - upstream_crates.sort_unstable_by_key(|&(name, dis, _)| (name.as_str(), dis)); + let upstream_crates = upstream_crates(cstore); // We hash the final, remapped names of all local source files so we // don't have to include the path prefix remapping commandline args. @@ -269,7 +268,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> { None => format!("{:?}", node), }; - let forgot_str = if hir_id == crate::hir::DUMMY_HIR_ID { + let forgot_str = if hir_id == hir::DUMMY_HIR_ID { format!("\nMaybe you forgot to lower the node id {:?}?", node_id) } else { String::new() @@ -337,11 +336,13 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> { } impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { + type Map = Map<'hir>; + /// Because we want to track parent items and so forth, enable /// deep walking so that we walk nested items in the context of /// their outer items. - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'hir> { + fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, Self::Map> { panic!("`visit_nested_xxx` must be manually implemented in this visitor"); } @@ -365,7 +366,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { self.currently_in_body = prev_in_body; } - fn visit_param(&mut self, param: &'hir Param) { + fn visit_param(&mut self, param: &'hir Param<'hir>) { let node = Node::Param(param); self.insert(param.pat.span, param.hir_id, node); self.with_parent(param.hir_id, |this| { @@ -373,7 +374,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_item(&mut self, i: &'hir Item) { + fn visit_item(&mut self, i: &'hir Item<'hir>) { debug!("visit_item: {:?}", i); debug_assert_eq!( i.hir_id.owner, @@ -393,7 +394,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_foreign_item(&mut self, foreign_item: &'hir ForeignItem) { + fn visit_foreign_item(&mut self, foreign_item: &'hir ForeignItem<'hir>) { self.insert(foreign_item.span, foreign_item.hir_id, Node::ForeignItem(foreign_item)); self.with_parent(foreign_item.hir_id, |this| { @@ -401,12 +402,12 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_generic_param(&mut self, param: &'hir GenericParam) { + fn visit_generic_param(&mut self, param: &'hir GenericParam<'hir>) { self.insert(param.span, param.hir_id, Node::GenericParam(param)); intravisit::walk_generic_param(self, param); } - fn visit_trait_item(&mut self, ti: &'hir TraitItem) { + fn visit_trait_item(&mut self, ti: &'hir TraitItem<'hir>) { debug_assert_eq!( ti.hir_id.owner, self.definitions.opt_def_index(self.hir_to_node_id[&ti.hir_id]).unwrap() @@ -420,7 +421,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_impl_item(&mut self, ii: &'hir ImplItem) { + fn visit_impl_item(&mut self, ii: &'hir ImplItem<'hir>) { debug_assert_eq!( ii.hir_id.owner, self.definitions.opt_def_index(self.hir_to_node_id[&ii.hir_id]).unwrap() @@ -434,7 +435,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_pat(&mut self, pat: &'hir Pat) { + fn visit_pat(&mut self, pat: &'hir Pat<'hir>) { let node = if let PatKind::Binding(..) = pat.kind { Node::Binding(pat) } else { Node::Pat(pat) }; self.insert(pat.span, pat.hir_id, node); @@ -444,7 +445,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_arm(&mut self, arm: &'hir Arm) { + fn visit_arm(&mut self, arm: &'hir Arm<'hir>) { let node = Node::Arm(arm); self.insert(arm.span, arm.hir_id, node); @@ -462,7 +463,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_expr(&mut self, expr: &'hir Expr) { + fn visit_expr(&mut self, expr: &'hir Expr<'hir>) { self.insert(expr.span, expr.hir_id, Node::Expr(expr)); self.with_parent(expr.hir_id, |this| { @@ -470,7 +471,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_stmt(&mut self, stmt: &'hir Stmt) { + fn visit_stmt(&mut self, stmt: &'hir Stmt<'hir>) { self.insert(stmt.span, stmt.hir_id, Node::Stmt(stmt)); self.with_parent(stmt.hir_id, |this| { @@ -478,14 +479,14 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_path_segment(&mut self, path_span: Span, path_segment: &'hir PathSegment) { + fn visit_path_segment(&mut self, path_span: Span, path_segment: &'hir PathSegment<'hir>) { if let Some(hir_id) = path_segment.hir_id { self.insert(path_span, hir_id, Node::PathSegment(path_segment)); } intravisit::walk_path_segment(self, path_span, path_segment); } - fn visit_ty(&mut self, ty: &'hir Ty) { + fn visit_ty(&mut self, ty: &'hir Ty<'hir>) { self.insert(ty.span, ty.hir_id, Node::Ty(ty)); self.with_parent(ty.hir_id, |this| { @@ -493,7 +494,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_trait_ref(&mut self, tr: &'hir TraitRef) { + fn visit_trait_ref(&mut self, tr: &'hir TraitRef<'hir>) { self.insert(tr.path.span, tr.hir_ref_id, Node::TraitRef(tr)); self.with_parent(tr.hir_ref_id, |this| { @@ -504,7 +505,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { fn visit_fn( &mut self, fk: intravisit::FnKind<'hir>, - fd: &'hir FnDecl, + fd: &'hir FnDecl<'hir>, b: BodyId, s: Span, id: HirId, @@ -513,14 +514,14 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { intravisit::walk_fn(self, fk, fd, b, s, id); } - fn visit_block(&mut self, block: &'hir Block) { + fn visit_block(&mut self, block: &'hir Block<'hir>) { self.insert(block.span, block.hir_id, Node::Block(block)); self.with_parent(block.hir_id, |this| { intravisit::walk_block(this, block); }); } - fn visit_local(&mut self, l: &'hir Local) { + fn visit_local(&mut self, l: &'hir Local<'hir>) { self.insert(l.span, l.hir_id, Node::Local(l)); self.with_parent(l.hir_id, |this| intravisit::walk_local(this, l)) } @@ -529,7 +530,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { self.insert(lifetime.span, lifetime.hir_id, Node::Lifetime(lifetime)); } - fn visit_vis(&mut self, visibility: &'hir Visibility) { + fn visit_vis(&mut self, visibility: &'hir Visibility<'hir>) { match visibility.node { VisibilityKind::Public | VisibilityKind::Crate(_) | VisibilityKind::Inherited => {} VisibilityKind::Restricted { hir_id, .. } => { @@ -541,7 +542,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { } } - fn visit_macro_def(&mut self, macro_def: &'hir MacroDef) { + fn visit_macro_def(&mut self, macro_def: &'hir MacroDef<'hir>) { let node_id = self.hir_to_node_id[¯o_def.hir_id]; let def_index = self.definitions.opt_def_index(node_id).unwrap(); @@ -550,7 +551,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_variant(&mut self, v: &'hir Variant, g: &'hir Generics, item_id: HirId) { + fn visit_variant(&mut self, v: &'hir Variant<'hir>, g: &'hir Generics<'hir>, item_id: HirId) { self.insert(v.span, v.id, Node::Variant(v)); self.with_parent(v.id, |this| { // Register the constructor of this variant. @@ -561,7 +562,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_struct_field(&mut self, field: &'hir StructField) { + fn visit_struct_field(&mut self, field: &'hir StructField<'hir>) { self.insert(field.span, field.hir_id, Node::Field(field)); self.with_parent(field.hir_id, |this| { intravisit::walk_struct_field(this, field); @@ -576,7 +577,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { self.visit_nested_trait_item(id); } - fn visit_impl_item_ref(&mut self, ii: &'hir ImplItemRef) { + fn visit_impl_item_ref(&mut self, ii: &'hir ImplItemRef<'hir>) { // Do not visit the duplicate information in ImplItemRef. We want to // map the actual nodes, not the duplicate ones in the *Ref. let ImplItemRef { id, ident: _, kind: _, span: _, vis: _, defaultness: _ } = *ii; diff --git a/src/librustc/hir/map/definitions.rs b/src/librustc/hir/map/definitions.rs index 1ba0e993f0..ac2d7a9a8d 100644 --- a/src/librustc/hir/map/definitions.rs +++ b/src/librustc/hir/map/definitions.rs @@ -4,22 +4,22 @@ //! There are also some rather random cases (like const initializer //! expressions) that are mostly just leftovers. -use crate::hir; -use crate::hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE}; -use crate::ich::Fingerprint; -use crate::session::CrateDisambiguator; -use crate::util::nodemap::NodeMap; - +use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::StableHasher; +use rustc_hir as hir; +use rustc_hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_index::vec::IndexVec; +use rustc_session::node_id::NodeMap; +use rustc_session::CrateDisambiguator; +use rustc_span::hygiene::ExpnId; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; +use syntax::ast; + use std::borrow::Borrow; use std::fmt::Write; use std::hash::Hash; -use syntax::ast; -use syntax_pos::hygiene::ExpnId; -use syntax_pos::symbol::{sym, Symbol}; -use syntax_pos::Span; /// The `DefPathTable` maps `DefIndex`es to `DefKey`s and vice versa. /// Internally the `DefPathTable` holds a tree of `DefKey`s, where each `DefKey` @@ -293,7 +293,7 @@ pub enum DefPathData { Debug, RustcEncodable, RustcDecodable, - HashStable, + HashStable )] pub struct DefPathHash(pub Fingerprint); diff --git a/src/librustc/hir/map/hir_id_validator.rs b/src/librustc/hir/map/hir_id_validator.rs index b68e195f29..ca95f87a09 100644 --- a/src/librustc/hir/map/hir_id_validator.rs +++ b/src/librustc/hir/map/hir_id_validator.rs @@ -1,10 +1,13 @@ -use crate::hir::def_id::{DefId, DefIndex, CRATE_DEF_INDEX}; -use crate::hir::itemlikevisit::ItemLikeVisitor; -use crate::hir::{self, intravisit, HirId, ItemLocalId}; +use crate::hir::map::Map; use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::sync::{par_iter, Lock, ParallelIterator}; +use rustc_hir as hir; +use rustc_hir::def_id::{DefId, DefIndex, CRATE_DEF_INDEX}; +use rustc_hir::intravisit; +use rustc_hir::itemlikevisit::ItemLikeVisitor; +use rustc_hir::{HirId, ItemLocalId}; -pub fn check_crate(hir_map: &hir::map::Map<'_>, sess: &rustc_session::Session) { +pub fn check_crate(hir_map: &Map<'_>, sess: &rustc_session::Session) { hir_map.dep_graph.assert_ignored(); let errors = Lock::new(Vec::new()); @@ -21,24 +24,24 @@ pub fn check_crate(hir_map: &hir::map::Map<'_>, sess: &rustc_session::Session) { if !errors.is_empty() { let message = errors.iter().fold(String::new(), |s1, s2| s1 + "\n" + s2); - sess.delay_span_bug(syntax_pos::DUMMY_SP, &message); + sess.delay_span_bug(rustc_span::DUMMY_SP, &message); } } struct HirIdValidator<'a, 'hir> { - hir_map: &'a hir::map::Map<'hir>, + hir_map: &'a Map<'hir>, owner_def_index: Option, hir_ids_seen: FxHashSet, errors: &'a Lock>, } struct OuterVisitor<'a, 'hir> { - hir_map: &'a hir::map::Map<'hir>, + hir_map: &'a Map<'hir>, errors: &'a Lock>, } impl<'a, 'hir> OuterVisitor<'a, 'hir> { - fn new_inner_visitor(&self, hir_map: &'a hir::map::Map<'hir>) -> HirIdValidator<'a, 'hir> { + fn new_inner_visitor(&self, hir_map: &'a Map<'hir>) -> HirIdValidator<'a, 'hir> { HirIdValidator { hir_map, owner_def_index: None, @@ -49,17 +52,17 @@ impl<'a, 'hir> OuterVisitor<'a, 'hir> { } impl<'a, 'hir> ItemLikeVisitor<'hir> for OuterVisitor<'a, 'hir> { - fn visit_item(&mut self, i: &'hir hir::Item) { + fn visit_item(&mut self, i: &'hir hir::Item<'hir>) { let mut inner_visitor = self.new_inner_visitor(self.hir_map); inner_visitor.check(i.hir_id, |this| intravisit::walk_item(this, i)); } - fn visit_trait_item(&mut self, i: &'hir hir::TraitItem) { + fn visit_trait_item(&mut self, i: &'hir hir::TraitItem<'hir>) { let mut inner_visitor = self.new_inner_visitor(self.hir_map); inner_visitor.check(i.hir_id, |this| intravisit::walk_trait_item(this, i)); } - fn visit_impl_item(&mut self, i: &'hir hir::ImplItem) { + fn visit_impl_item(&mut self, i: &'hir hir::ImplItem<'hir>) { let mut inner_visitor = self.new_inner_visitor(self.hir_map); inner_visitor.check(i.hir_id, |this| intravisit::walk_impl_item(this, i)); } @@ -130,7 +133,9 @@ impl<'a, 'hir> HirIdValidator<'a, 'hir> { } impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> { - fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'hir> { + type Map = Map<'hir>; + + fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, Self::Map> { intravisit::NestedVisitorMap::OnlyBodies(self.hir_map) } @@ -161,7 +166,7 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> { self.hir_ids_seen.insert(hir_id.local_id); } - fn visit_impl_item_ref(&mut self, _: &'hir hir::ImplItemRef) { + fn visit_impl_item_ref(&mut self, _: &'hir hir::ImplItemRef<'hir>) { // Explicitly do nothing here. ImplItemRefs contain hir::Visibility // values that actually belong to an ImplItem instead of the ItemKind::Impl // we are currently in. So for those it's correct that they have a diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs index 8cd12ead65..b5ca63a34d 100644 --- a/src/librustc/hir/map/mod.rs +++ b/src/librustc/hir/map/mod.rs @@ -4,23 +4,23 @@ pub use self::definitions::{ }; use crate::dep_graph::{DepGraph, DepKind, DepNode, DepNodeIndex}; -use crate::hir::def_id::{DefId, LocalDefId, CRATE_DEF_INDEX}; -use crate::hir::itemlikevisit::ItemLikeVisitor; -use crate::hir::print::Nested; -use crate::hir::DefKind; -use crate::hir::*; use crate::middle::cstore::CrateStoreDyn; use crate::ty::query::Providers; -use crate::util::common::time; -use crate::util::nodemap::FxHashMap; - +use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::svh::Svh; +use rustc_hir::def::{DefKind, Res}; +use rustc_hir::def_id::{DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX}; +use rustc_hir::intravisit; +use rustc_hir::itemlikevisit::ItemLikeVisitor; +use rustc_hir::print::Nested; +use rustc_hir::*; use rustc_index::vec::IndexVec; +use rustc_span::hygiene::MacroKind; +use rustc_span::source_map::Spanned; +use rustc_span::symbol::kw; +use rustc_span::Span; use rustc_target::spec::abi::Abi; use syntax::ast::{self, Name, NodeId}; -use syntax::source_map::Spanned; -use syntax_pos::hygiene::MacroKind; -use syntax_pos::{Span, DUMMY_SP}; pub mod blocks; mod collector; @@ -43,7 +43,7 @@ impl<'hir> Entry<'hir> { } } - fn fn_decl(&self) -> Option<&'hir FnDecl> { + fn fn_decl(&self) -> Option<&'hir FnDecl<'hir>> { match self.node { Node::Item(ref item) => match item.kind { ItemKind::Fn(ref sig, _, _) => Some(&sig.decl), @@ -69,7 +69,7 @@ impl<'hir> Entry<'hir> { } } - fn fn_sig(&self) -> Option<&'hir FnSig> { + fn fn_sig(&self) -> Option<&'hir FnSig<'hir>> { match &self.node { Node::Item(item) => match &item.kind { ItemKind::Fn(sig, _, _) => Some(sig), @@ -130,17 +130,17 @@ impl<'hir> Entry<'hir> { } /// Stores a crate and any number of inlined items from other crates. -pub struct Forest { - krate: Crate, +pub struct Forest<'hir> { + krate: Crate<'hir>, pub dep_graph: DepGraph, } -impl Forest { - pub fn new(krate: Crate, dep_graph: &DepGraph) -> Forest { +impl Forest<'hir> { + pub fn new(krate: Crate<'hir>, dep_graph: &DepGraph) -> Forest<'hir> { Forest { krate, dep_graph: dep_graph.clone() } } - pub fn krate(&self) -> &Crate { + pub fn krate(&self) -> &Crate<'hir> { self.dep_graph.read(DepNode::new_no_params(DepKind::Krate)); &self.krate } @@ -148,7 +148,7 @@ impl Forest { /// This is used internally in the dependency tracking system. /// Use the `krate` method to ensure your dependency on the /// crate is tracked. - pub fn untracked_krate(&self) -> &Crate { + pub fn untracked_krate(&self) -> &Crate<'hir> { &self.krate } } @@ -163,7 +163,7 @@ pub(super) type HirEntryMap<'hir> = IndexVec { /// The backing storage for all the AST nodes. - pub forest: &'hir Forest, + pub forest: &'hir Forest<'hir>, /// Same as the dep_graph in forest, just available with one fewer /// deref. This is a gratuitous micro-optimization. @@ -180,19 +180,19 @@ pub struct Map<'hir> { hir_to_node_id: FxHashMap, } -struct ParentHirIterator<'map> { +struct ParentHirIterator<'map, 'hir> { current_id: HirId, - map: &'map Map<'map>, + map: &'map Map<'hir>, } -impl<'map> ParentHirIterator<'map> { - fn new(current_id: HirId, map: &'map Map<'map>) -> ParentHirIterator<'map> { - ParentHirIterator { current_id, map } +impl<'map, 'hir> ParentHirIterator<'map, 'hir> { + fn new(current_id: HirId, map: &'map Map<'hir>) -> Self { + Self { current_id, map } } } -impl<'map> Iterator for ParentHirIterator<'map> { - type Item = (HirId, Node<'map>); +impl<'hir> Iterator for ParentHirIterator<'_, 'hir> { + type Item = (HirId, Node<'hir>); fn next(&mut self) -> Option { if self.current_id == CRATE_HIR_ID { @@ -341,7 +341,7 @@ impl<'hir> Map<'hir> { | ItemKind::Use(..) | ItemKind::ForeignMod(..) | ItemKind::GlobalAsm(..) - | ItemKind::Impl(..) => return None, + | ItemKind::Impl { .. } => return None, }, Node::ForeignItem(item) => match item.kind { ForeignItemKind::Fn(..) => DefKind::Fn, @@ -401,11 +401,19 @@ impl<'hir> Map<'hir> { self.lookup(id).cloned() } - pub fn krate(&self) -> &'hir Crate { + pub fn krate(&self) -> &'hir Crate<'hir> { self.forest.krate() } - pub fn trait_item(&self, id: TraitItemId) -> &'hir TraitItem { + pub fn item(&self, id: HirId) -> &'hir Item<'hir> { + self.read(id); + + // N.B., intentionally bypass `self.forest.krate()` so that we + // do not trigger a read of the whole krate here + self.forest.krate.item(id) + } + + pub fn trait_item(&self, id: TraitItemId) -> &'hir TraitItem<'hir> { self.read(id.hir_id); // N.B., intentionally bypass `self.forest.krate()` so that we @@ -413,7 +421,7 @@ impl<'hir> Map<'hir> { self.forest.krate.trait_item(id) } - pub fn impl_item(&self, id: ImplItemId) -> &'hir ImplItem { + pub fn impl_item(&self, id: ImplItemId) -> &'hir ImplItem<'hir> { self.read(id.hir_id); // N.B., intentionally bypass `self.forest.krate()` so that we @@ -421,7 +429,7 @@ impl<'hir> Map<'hir> { self.forest.krate.impl_item(id) } - pub fn body(&self, id: BodyId) -> &'hir Body { + pub fn body(&self, id: BodyId) -> &'hir Body<'hir> { self.read(id.hir_id); // N.B., intentionally bypass `self.forest.krate()` so that we @@ -429,7 +437,7 @@ impl<'hir> Map<'hir> { self.forest.krate.body(id) } - pub fn fn_decl_by_hir_id(&self, hir_id: HirId) -> Option<&'hir FnDecl> { + pub fn fn_decl_by_hir_id(&self, hir_id: HirId) -> Option<&'hir FnDecl<'hir>> { if let Some(entry) = self.find_entry(hir_id) { entry.fn_decl() } else { @@ -437,7 +445,7 @@ impl<'hir> Map<'hir> { } } - pub fn fn_sig_by_hir_id(&self, hir_id: HirId) -> Option<&'hir FnSig> { + pub fn fn_sig_by_hir_id(&self, hir_id: HirId) -> Option<&'hir FnSig<'hir>> { if let Some(entry) = self.find_entry(hir_id) { entry.fn_sig() } else { @@ -537,7 +545,7 @@ impl<'hir> Map<'hir> { &self.forest.krate.attrs } - pub fn get_module(&self, module: DefId) -> (&'hir Mod, Span, HirId) { + pub fn get_module(&self, module: DefId) -> (&'hir Mod<'hir>, Span, HirId) { let hir_id = self.as_local_hir_id(module).unwrap(); self.read(hir_id); match self.find_entry(hir_id).unwrap().node { @@ -584,7 +592,7 @@ impl<'hir> Map<'hir> { self.as_local_hir_id(id).map(|id| self.get(id)) // read recorded by `get` } - pub fn get_generics(&self, id: DefId) -> Option<&'hir Generics> { + pub fn get_generics(&self, id: DefId) -> Option<&'hir Generics<'hir>> { self.get_if_local(id).and_then(|node| match node { Node::ImplItem(ref impl_item) => Some(&impl_item.generics), Node::TraitItem(ref trait_item) => Some(&trait_item.generics), @@ -596,7 +604,7 @@ impl<'hir> Map<'hir> { | ItemKind::Union(_, ref generics) | ItemKind::Trait(_, _, ref generics, ..) | ItemKind::TraitAlias(ref generics, _) - | ItemKind::Impl(_, _, _, ref generics, ..) => Some(generics), + | ItemKind::Impl { ref generics, .. } => Some(generics), _ => None, }, _ => None, @@ -782,7 +790,7 @@ impl<'hir> Map<'hir> { /// /// Used by error reporting when there's a type error in a match arm caused by the `match` /// expression needing to be unit. - pub fn get_match_if_cause(&self, hir_id: HirId) -> Option<&Expr> { + pub fn get_match_if_cause(&self, hir_id: HirId) -> Option<&'hir Expr<'hir>> { for (_, node) in ParentHirIterator::new(hir_id, &self) { match node { Node::Item(_) | Node::ForeignItem(_) | Node::TraitItem(_) | Node::ImplItem(_) => { @@ -813,7 +821,7 @@ impl<'hir> Map<'hir> { | ItemKind::Struct(..) | ItemKind::Union(..) | ItemKind::Trait(..) - | ItemKind::Impl(..) => true, + | ItemKind::Impl { .. } => true, _ => false, }, Node::ForeignItem(fi) => match fi.kind { @@ -875,7 +883,7 @@ impl<'hir> Map<'hir> { bug!("expected foreign mod or inlined parent, found {}", self.node_to_string(parent)) } - pub fn expect_item(&self, id: HirId) -> &'hir Item { + pub fn expect_item(&self, id: HirId) -> &'hir Item<'hir> { match self.find(id) { // read recorded by `find` Some(Node::Item(item)) => item, @@ -883,21 +891,21 @@ impl<'hir> Map<'hir> { } } - pub fn expect_impl_item(&self, id: HirId) -> &'hir ImplItem { + pub fn expect_impl_item(&self, id: HirId) -> &'hir ImplItem<'hir> { match self.find(id) { Some(Node::ImplItem(item)) => item, _ => bug!("expected impl item, found {}", self.node_to_string(id)), } } - pub fn expect_trait_item(&self, id: HirId) -> &'hir TraitItem { + pub fn expect_trait_item(&self, id: HirId) -> &'hir TraitItem<'hir> { match self.find(id) { Some(Node::TraitItem(item)) => item, _ => bug!("expected trait item, found {}", self.node_to_string(id)), } } - pub fn expect_variant_data(&self, id: HirId) -> &'hir VariantData { + pub fn expect_variant_data(&self, id: HirId) -> &'hir VariantData<'hir> { match self.find(id) { Some(Node::Item(i)) => match i.kind { ItemKind::Struct(ref struct_def, _) | ItemKind::Union(ref struct_def, _) => { @@ -911,21 +919,21 @@ impl<'hir> Map<'hir> { } } - pub fn expect_variant(&self, id: HirId) -> &'hir Variant { + pub fn expect_variant(&self, id: HirId) -> &'hir Variant<'hir> { match self.find(id) { Some(Node::Variant(variant)) => variant, _ => bug!("expected variant, found {}", self.node_to_string(id)), } } - pub fn expect_foreign_item(&self, id: HirId) -> &'hir ForeignItem { + pub fn expect_foreign_item(&self, id: HirId) -> &'hir ForeignItem<'hir> { match self.find(id) { Some(Node::ForeignItem(item)) => item, _ => bug!("expected foreign item, found {}", self.node_to_string(id)), } } - pub fn expect_expr(&self, id: HirId) -> &'hir Expr { + pub fn expect_expr(&self, id: HirId) -> &'hir Expr<'hir> { match self.find(id) { // read recorded by find Some(Node::Expr(expr)) => expr, @@ -1085,6 +1093,24 @@ impl<'hir> Map<'hir> { } } +impl<'hir> intravisit::Map<'hir> for Map<'hir> { + fn body(&self, id: BodyId) -> &'hir Body<'hir> { + self.body(id) + } + + fn item(&self, id: HirId) -> &'hir Item<'hir> { + self.item(id) + } + + fn trait_item(&self, id: TraitItemId) -> &'hir TraitItem<'hir> { + self.trait_item(id) + } + + fn impl_item(&self, id: ImplItemId) -> &'hir ImplItem<'hir> { + self.impl_item(id) + } +} + pub struct NodesMatchingSuffix<'a> { map: &'a Map<'a>, item_name: &'a String, @@ -1132,7 +1158,7 @@ impl<'a> NodesMatchingSuffix<'a> { id = parent; } - fn item_is_mod(item: &Item) -> bool { + fn item_is_mod(item: &Item<'_>) -> bool { match item.kind { ItemKind::Mod(_) => true, _ => false, @@ -1171,41 +1197,41 @@ impl Named for Spanned { } } -impl Named for Item { +impl Named for Item<'_> { fn name(&self) -> Name { self.ident.name } } -impl Named for ForeignItem { +impl Named for ForeignItem<'_> { fn name(&self) -> Name { self.ident.name } } -impl Named for Variant { +impl Named for Variant<'_> { fn name(&self) -> Name { self.ident.name } } -impl Named for StructField { +impl Named for StructField<'_> { fn name(&self) -> Name { self.ident.name } } -impl Named for TraitItem { +impl Named for TraitItem<'_> { fn name(&self) -> Name { self.ident.name } } -impl Named for ImplItem { +impl Named for ImplItem<'_> { fn name(&self) -> Name { self.ident.name } } pub fn map_crate<'hir>( - sess: &crate::session::Session, + sess: &rustc_session::Session, cstore: &CrateStoreDyn, - forest: &'hir Forest, + forest: &'hir Forest<'hir>, definitions: Definitions, ) -> Map<'hir> { let _prof_timer = sess.prof.generic_activity("build_hir_map"); @@ -1244,7 +1270,7 @@ pub fn map_crate<'hir>( definitions, }; - time(sess, "validate HIR map", || { + sess.time("validate_HIR_map", || { hir_id_validator::check_crate(&map, sess); }); @@ -1265,45 +1291,6 @@ impl<'hir> print::PpAnn for Map<'hir> { } } -impl<'a> print::State<'a> { - pub fn print_node(&mut self, node: Node<'_>) { - match node { - Node::Param(a) => self.print_param(&a), - Node::Item(a) => self.print_item(&a), - Node::ForeignItem(a) => self.print_foreign_item(&a), - Node::TraitItem(a) => self.print_trait_item(a), - Node::ImplItem(a) => self.print_impl_item(a), - Node::Variant(a) => self.print_variant(&a), - Node::AnonConst(a) => self.print_anon_const(&a), - Node::Expr(a) => self.print_expr(&a), - Node::Stmt(a) => self.print_stmt(&a), - Node::PathSegment(a) => self.print_path_segment(&a), - Node::Ty(a) => self.print_type(&a), - Node::TraitRef(a) => self.print_trait_ref(&a), - Node::Binding(a) | Node::Pat(a) => self.print_pat(&a), - Node::Arm(a) => self.print_arm(&a), - Node::Block(a) => { - // Containing cbox, will be closed by print-block at `}`. - self.cbox(print::INDENT_UNIT); - // Head-ibox, will be closed by print-block after `{`. - self.ibox(0); - self.print_block(&a) - } - Node::Lifetime(a) => self.print_lifetime(&a), - Node::Visibility(a) => self.print_visibility(&a), - Node::GenericParam(_) => bug!("cannot print Node::GenericParam"), - Node::Field(_) => bug!("cannot print StructField"), - // These cases do not carry enough information in the - // `hir_map` to reconstruct their full structure for pretty - // printing. - Node::Ctor(..) => bug!("cannot print isolated Ctor"), - Node::Local(a) => self.print_local_decl(&a), - Node::MacroDef(_) => bug!("cannot print MacroDef"), - Node::Crate => bug!("cannot print Crate"), - } - } -} - fn hir_id_to_string(map: &Map<'_>, id: HirId, include_id: bool) -> String { let id_str = format!(" (hir_id={})", id); let id_str = if include_id { &id_str[..] } else { "" }; @@ -1345,7 +1332,7 @@ fn hir_id_to_string(map: &Map<'_>, id: HirId, include_id: bool) -> String { ItemKind::Union(..) => "union", ItemKind::Trait(..) => "trait", ItemKind::TraitAlias(..) => "trait alias", - ItemKind::Impl(..) => "impl", + ItemKind::Impl { .. } => "impl", }; format!("{} {}{}", item_str, path_str(), id_str) } diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index 6b354b0151..97c14dd7e0 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -2,2818 +2,15 @@ //! //! [rustc guide]: https://rust-lang.github.io/rustc-guide/hir.html -pub use self::BlockCheckMode::*; -pub use self::FunctionRetTy::*; -pub use self::PrimTy::*; -pub use self::UnOp::*; -pub use self::UnsafeSource::*; - -use crate::hir::def::{Res, DefKind}; -use crate::hir::def_id::{DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX}; -use crate::hir::ptr::P; -use crate::mir::mono::Linkage; -use crate::ty::AdtKind; -use crate::ty::query::Providers; -use crate::util::nodemap::{NodeMap, FxHashSet}; - -use errors::FatalError; -use syntax_pos::{Span, DUMMY_SP, MultiSpan}; -use syntax::source_map::Spanned; -use syntax::ast::{self, CrateSugar, Ident, Name, NodeId, AsmDialect}; -use syntax::ast::{Attribute, Label, LitKind, StrStyle, FloatTy, IntTy, UintTy}; -pub use syntax::ast::{Mutability, Constness, Unsafety, Movability, CaptureBy}; -pub use syntax::ast::{IsAuto, ImplPolarity, BorrowKind}; -use syntax::attr::{InlineAttr, OptimizeAttr}; -use syntax::symbol::{Symbol, kw}; -use syntax::tokenstream::TokenStream; -use syntax::util::parser::ExprPrecedence; -use rustc_target::spec::abi::Abi; -use rustc_data_structures::sync::{par_for_each_in, Send, Sync}; -use rustc_data_structures::thin_vec::ThinVec; -use rustc_macros::HashStable; -use rustc_serialize::{self, Encoder, Encodable, Decoder, Decodable}; -use std::collections::{BTreeSet, BTreeMap}; -use std::fmt; -use smallvec::SmallVec; - -/// HIR doesn't commit to a concrete storage type and has its own alias for a vector. -/// It can be `Vec`, `P<[T]>` or potentially `Box<[T]>`, or some other container with similar -/// behavior. Unlike AST, HIR is mostly a static structure, so we can use an owned slice instead -/// of `Vec` to avoid keeping extra capacity. -pub type HirVec = P<[T]>; - -macro_rules! hir_vec { - ($elem:expr; $n:expr) => ( - $crate::hir::HirVec::from(vec![$elem; $n]) - ); - ($($x:expr),*) => ( - $crate::hir::HirVec::from(vec![$($x),*]) - ); -} - pub mod check_attr; -pub mod def; -pub mod def_id; -pub mod intravisit; -pub mod itemlikevisit; -pub mod lowering; +pub mod exports; pub mod map; -pub mod pat_util; -pub mod print; -pub mod ptr; pub mod upvars; -/// Uniquely identifies a node in the HIR of the current crate. It is -/// composed of the `owner`, which is the `DefIndex` of the directly enclosing -/// `hir::Item`, `hir::TraitItem`, or `hir::ImplItem` (i.e., the closest "item-like"), -/// and the `local_id` which is unique within the given owner. -/// -/// This two-level structure makes for more stable values: One can move an item -/// around within the source code, or add or remove stuff before it, without -/// the `local_id` part of the `HirId` changing, which is a very useful property in -/// incremental compilation where we have to persist things through changes to -/// the code base. -#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)] -pub struct HirId { - pub owner: DefIndex, - pub local_id: ItemLocalId, -} - -impl HirId { - pub fn owner_def_id(self) -> DefId { - DefId::local(self.owner) - } - - pub fn owner_local_def_id(self) -> LocalDefId { - LocalDefId::from_def_id(DefId::local(self.owner)) - } -} - -impl rustc_serialize::UseSpecializedEncodable for HirId { - fn default_encode(&self, s: &mut S) -> Result<(), S::Error> { - let HirId { - owner, - local_id, - } = *self; - - owner.encode(s)?; - local_id.encode(s)?; - Ok(()) - } -} - -impl rustc_serialize::UseSpecializedDecodable for HirId { - fn default_decode(d: &mut D) -> Result { - let owner = DefIndex::decode(d)?; - let local_id = ItemLocalId::decode(d)?; - - Ok(HirId { - owner, - local_id - }) - } -} - -impl fmt::Display for HirId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -// Hack to ensure that we don't try to access the private parts of `ItemLocalId` in this module. -mod item_local_id_inner { - use rustc_index::vec::Idx; - use rustc_macros::HashStable; - rustc_index::newtype_index! { - /// An `ItemLocalId` uniquely identifies something within a given "item-like"; - /// that is, within a `hir::Item`, `hir::TraitItem`, or `hir::ImplItem`. There is no - /// guarantee that the numerical value of a given `ItemLocalId` corresponds to - /// the node's position within the owning item in any way, but there is a - /// guarantee that the `LocalItemId`s within an owner occupy a dense range of - /// integers starting at zero, so a mapping that maps all or most nodes within - /// an "item-like" to something else can be implemented by a `Vec` instead of a - /// tree or hash map. - pub struct ItemLocalId { - derive [HashStable] - } - } -} - -pub use self::item_local_id_inner::ItemLocalId; - -/// The `HirId` corresponding to `CRATE_NODE_ID` and `CRATE_DEF_INDEX`. -pub const CRATE_HIR_ID: HirId = HirId { - owner: CRATE_DEF_INDEX, - local_id: ItemLocalId::from_u32_const(0) -}; - -pub const DUMMY_HIR_ID: HirId = HirId { - owner: CRATE_DEF_INDEX, - local_id: DUMMY_ITEM_LOCAL_ID, -}; - -pub const DUMMY_ITEM_LOCAL_ID: ItemLocalId = ItemLocalId::MAX; - -#[derive(Copy, Clone, RustcEncodable, RustcDecodable, HashStable)] -pub struct Lifetime { - pub hir_id: HirId, - pub span: Span, - - /// Either "`'a`", referring to a named lifetime definition, - /// or "``" (i.e., `kw::Invalid`), for elision placeholders. - /// - /// HIR lowering inserts these placeholders in type paths that - /// refer to type definitions needing lifetime parameters, - /// `&T` and `&mut T`, and trait objects without `... + 'a`. - pub name: LifetimeName, -} - -#[derive(Debug, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Copy, HashStable)] -pub enum ParamName { - /// Some user-given name like `T` or `'x`. - Plain(Ident), - - /// Synthetic name generated when user elided a lifetime in an impl header. - /// - /// E.g., the lifetimes in cases like these: - /// - /// impl Foo for &u32 - /// impl Foo<'_> for u32 - /// - /// in that case, we rewrite to - /// - /// impl<'f> Foo for &'f u32 - /// impl<'f> Foo<'f> for u32 - /// - /// where `'f` is something like `Fresh(0)`. The indices are - /// unique per impl, but not necessarily continuous. - Fresh(usize), - - /// Indicates an illegal name was given and an error has been - /// reported (so we should squelch other derived errors). Occurs - /// when, e.g., `'_` is used in the wrong place. - Error, -} - -impl ParamName { - pub fn ident(&self) -> Ident { - match *self { - ParamName::Plain(ident) => ident, - ParamName::Fresh(_) | - ParamName::Error => Ident::with_dummy_span(kw::UnderscoreLifetime), - } - } - - pub fn modern(&self) -> ParamName { - match *self { - ParamName::Plain(ident) => ParamName::Plain(ident.modern()), - param_name => param_name, - } - } -} - -#[derive(Debug, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Copy, HashStable)] -pub enum LifetimeName { - /// User-given names or fresh (synthetic) names. - Param(ParamName), - - /// User wrote nothing (e.g., the lifetime in `&u32`). - Implicit, - - /// Implicit lifetime in a context like `dyn Foo`. This is - /// distinguished from implicit lifetimes elsewhere because the - /// lifetime that they default to must appear elsewhere within the - /// enclosing type. This means that, in an `impl Trait` context, we - /// don't have to create a parameter for them. That is, `impl - /// Trait` expands to an opaque type like `type - /// Foo<'a> = impl Trait`, but `impl Trait` expands to `type Foo = impl Trait`. The latter uses `ImplicitObjectLifetimeDefault` so - /// that surrounding code knows not to create a lifetime - /// parameter. - ImplicitObjectLifetimeDefault, - - /// Indicates an error during lowering (usually `'_` in wrong place) - /// that was already reported. - Error, - - /// User wrote specifies `'_`. - Underscore, - - /// User wrote `'static`. - Static, -} - -impl LifetimeName { - pub fn ident(&self) -> Ident { - match *self { - LifetimeName::ImplicitObjectLifetimeDefault - | LifetimeName::Implicit - | LifetimeName::Error => Ident::invalid(), - LifetimeName::Underscore => Ident::with_dummy_span(kw::UnderscoreLifetime), - LifetimeName::Static => Ident::with_dummy_span(kw::StaticLifetime), - LifetimeName::Param(param_name) => param_name.ident(), - } - } - - pub fn is_elided(&self) -> bool { - match self { - LifetimeName::ImplicitObjectLifetimeDefault - | LifetimeName::Implicit - | LifetimeName::Underscore => true, - - // It might seem surprising that `Fresh(_)` counts as - // *not* elided -- but this is because, as far as the code - // in the compiler is concerned -- `Fresh(_)` variants act - // equivalently to "some fresh name". They correspond to - // early-bound regions on an impl, in other words. - LifetimeName::Error | LifetimeName::Param(_) | LifetimeName::Static => false, - } - } - - fn is_static(&self) -> bool { - self == &LifetimeName::Static - } - - pub fn modern(&self) -> LifetimeName { - match *self { - LifetimeName::Param(param_name) => LifetimeName::Param(param_name.modern()), - lifetime_name => lifetime_name, - } - } -} - -impl fmt::Display for Lifetime { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.name.ident().fmt(f) - } -} - -impl fmt::Debug for Lifetime { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, - "lifetime({}: {})", - self.hir_id, - print::to_string(print::NO_ANN, |s| s.print_lifetime(self))) - } -} - -impl Lifetime { - pub fn is_elided(&self) -> bool { - self.name.is_elided() - } - - pub fn is_static(&self) -> bool { - self.name.is_static() - } -} - -/// A `Path` is essentially Rust's notion of a name; for instance, -/// `std::cmp::PartialEq`. It's represented as a sequence of identifiers, -/// along with a bunch of supporting information. -#[derive(RustcEncodable, RustcDecodable, HashStable)] -pub struct Path { - pub span: Span, - /// The resolution for the path. - pub res: Res, - /// The segments in the path: the things separated by `::`. - pub segments: HirVec, -} - -impl Path { - pub fn is_global(&self) -> bool { - !self.segments.is_empty() && self.segments[0].ident.name == kw::PathRoot - } -} - -impl fmt::Debug for Path { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "path({})", self) - } -} - -impl fmt::Display for Path { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", print::to_string(print::NO_ANN, |s| s.print_path(self, false))) - } -} - -/// A segment of a path: an identifier, an optional lifetime, and a set of -/// types. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct PathSegment { - /// The identifier portion of this path segment. - #[stable_hasher(project(name))] - pub ident: Ident, - // `id` and `res` are optional. We currently only use these in save-analysis, - // any path segments without these will not have save-analysis info and - // therefore will not have 'jump to def' in IDEs, but otherwise will not be - // affected. (In general, we don't bother to get the defs for synthesized - // segments, only for segments which have come from the AST). - pub hir_id: Option, - pub res: Option, - - /// Type/lifetime parameters attached to this path. They come in - /// two flavors: `Path` and `Path(A,B) -> C`. Note that - /// this is more than just simple syntactic sugar; the use of - /// parens affects the region binding rules, so we preserve the - /// distinction. - pub args: Option>, - - /// Whether to infer remaining type parameters, if any. - /// This only applies to expression and pattern paths, and - /// out of those only the segments with no type parameters - /// to begin with, e.g., `Vec::new` is `>::new::<..>`. - pub infer_args: bool, -} - -impl PathSegment { - /// Converts an identifier to the corresponding segment. - pub fn from_ident(ident: Ident) -> PathSegment { - PathSegment { - ident, - hir_id: None, - res: None, - infer_args: true, - args: None, - } - } - - pub fn new( - ident: Ident, - hir_id: Option, - res: Option, - args: GenericArgs, - infer_args: bool, - ) -> Self { - PathSegment { - ident, - hir_id, - res, - infer_args, - args: if args.is_empty() { - None - } else { - Some(P(args)) - } - } - } - - pub fn generic_args(&self) -> &GenericArgs { - if let Some(ref args) = self.args { - args - } else { - const DUMMY: &GenericArgs = &GenericArgs::none(); - DUMMY - } - } -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct ConstArg { - pub value: AnonConst, - pub span: Span, -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum GenericArg { - Lifetime(Lifetime), - Type(Ty), - Const(ConstArg), -} - -impl GenericArg { - pub fn span(&self) -> Span { - match self { - GenericArg::Lifetime(l) => l.span, - GenericArg::Type(t) => t.span, - GenericArg::Const(c) => c.span, - } - } - - pub fn id(&self) -> HirId { - match self { - GenericArg::Lifetime(l) => l.hir_id, - GenericArg::Type(t) => t.hir_id, - GenericArg::Const(c) => c.value.hir_id, - } - } - - pub fn is_const(&self) -> bool { - match self { - GenericArg::Const(_) => true, - _ => false, - } - } -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct GenericArgs { - /// The generic arguments for this path segment. - pub args: HirVec, - /// Bindings (equality constraints) on associated types, if present. - /// E.g., `Foo`. - pub bindings: HirVec, - /// Were arguments written in parenthesized form `Fn(T) -> U`? - /// This is required mostly for pretty-printing and diagnostics, - /// but also for changing lifetime elision rules to be "function-like". - pub parenthesized: bool, -} - -impl GenericArgs { - pub const fn none() -> Self { - Self { - args: HirVec::new(), - bindings: HirVec::new(), - parenthesized: false, - } - } - - pub fn is_empty(&self) -> bool { - self.args.is_empty() && self.bindings.is_empty() && !self.parenthesized - } - - pub fn inputs(&self) -> &[Ty] { - if self.parenthesized { - for arg in &self.args { - match arg { - GenericArg::Lifetime(_) => {} - GenericArg::Type(ref ty) => { - if let TyKind::Tup(ref tys) = ty.kind { - return tys; - } - break; - } - GenericArg::Const(_) => {} - } - } - } - bug!("GenericArgs::inputs: not a `Fn(T) -> U`"); - } - - pub fn own_counts(&self) -> GenericParamCount { - // We could cache this as a property of `GenericParamCount`, but - // the aim is to refactor this away entirely eventually and the - // presence of this method will be a constant reminder. - let mut own_counts: GenericParamCount = Default::default(); - - for arg in &self.args { - match arg { - GenericArg::Lifetime(_) => own_counts.lifetimes += 1, - GenericArg::Type(_) => own_counts.types += 1, - GenericArg::Const(_) => own_counts.consts += 1, - }; - } - - own_counts - } -} - -/// A modifier on a bound, currently this is only used for `?Sized`, where the -/// modifier is `Maybe`. Negative bounds should also be handled here. -#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, HashStable)] -pub enum TraitBoundModifier { - None, - Maybe, -} - -/// The AST represents all type param bounds as types. -/// `typeck::collect::compute_bounds` matches these against -/// the "special" built-in traits (see `middle::lang_items`) and -/// detects `Copy`, `Send` and `Sync`. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum GenericBound { - Trait(PolyTraitRef, TraitBoundModifier), - Outlives(Lifetime), -} - -impl GenericBound { - pub fn span(&self) -> Span { - match self { - &GenericBound::Trait(ref t, ..) => t.span, - &GenericBound::Outlives(ref l) => l.span, - } - } -} - -pub type GenericBounds = HirVec; - -#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum LifetimeParamKind { - // Indicates that the lifetime definition was explicitly declared (e.g., in - // `fn foo<'a>(x: &'a u8) -> &'a u8 { x }`). - Explicit, - - // Indicates that the lifetime definition was synthetically added - // as a result of an in-band lifetime usage (e.g., in - // `fn foo(x: &'a u8) -> &'a u8 { x }`). - InBand, - - // Indication that the lifetime was elided (e.g., in both cases in - // `fn foo(x: &u8) -> &'_ u8 { x }`). - Elided, - - // Indication that the lifetime name was somehow in error. - Error, -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum GenericParamKind { - /// A lifetime definition (e.g., `'a: 'b + 'c + 'd`). - Lifetime { - kind: LifetimeParamKind, - }, - Type { - default: Option>, - synthetic: Option, - }, - Const { - ty: P, - } -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct GenericParam { - pub hir_id: HirId, - pub name: ParamName, - pub attrs: HirVec, - pub bounds: GenericBounds, - pub span: Span, - pub pure_wrt_drop: bool, - pub kind: GenericParamKind, -} - -#[derive(Default)] -pub struct GenericParamCount { - pub lifetimes: usize, - pub types: usize, - pub consts: usize, -} - -/// Represents lifetimes and type parameters attached to a declaration -/// of a function, enum, trait, etc. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct Generics { - pub params: HirVec, - pub where_clause: WhereClause, - pub span: Span, -} - -impl Generics { - pub const fn empty() -> Generics { - Generics { - params: HirVec::new(), - where_clause: WhereClause { - predicates: HirVec::new(), - span: DUMMY_SP, - }, - span: DUMMY_SP, - } - } - - pub fn own_counts(&self) -> GenericParamCount { - // We could cache this as a property of `GenericParamCount`, but - // the aim is to refactor this away entirely eventually and the - // presence of this method will be a constant reminder. - let mut own_counts: GenericParamCount = Default::default(); - - for param in &self.params { - match param.kind { - GenericParamKind::Lifetime { .. } => own_counts.lifetimes += 1, - GenericParamKind::Type { .. } => own_counts.types += 1, - GenericParamKind::Const { .. } => own_counts.consts += 1, - }; - } - - own_counts - } - - pub fn get_named(&self, name: Symbol) -> Option<&GenericParam> { - for param in &self.params { - if name == param.name.ident().name { - return Some(param); - } - } - None - } - - pub fn spans(&self) -> MultiSpan { - if self.params.is_empty() { - self.span.into() - } else { - self.params.iter().map(|p| p.span).collect::>().into() - } - } -} - -/// Synthetic type parameters are converted to another form during lowering; this allows -/// us to track the original form they had, and is useful for error messages. -#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, HashStable)] -pub enum SyntheticTyParamKind { - ImplTrait -} - -/// A where-clause in a definition. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct WhereClause { - pub predicates: HirVec, - // Only valid if predicates isn't empty. - span: Span, -} - -impl WhereClause { - pub fn span(&self) -> Option { - if self.predicates.is_empty() { - None - } else { - Some(self.span) - } - } - - /// The `WhereClause` under normal circumstances points at either the predicates or the empty - /// space where the `where` clause should be. Only of use for diagnostic suggestions. - pub fn span_for_predicates_or_empty_place(&self) -> Span { - self.span - } -} - -/// A single predicate in a where-clause. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum WherePredicate { - /// A type binding (e.g., `for<'c> Foo: Send + Clone + 'c`). - BoundPredicate(WhereBoundPredicate), - /// A lifetime predicate (e.g., `'a: 'b + 'c`). - RegionPredicate(WhereRegionPredicate), - /// An equality predicate (unsupported). - EqPredicate(WhereEqPredicate), -} - -impl WherePredicate { - pub fn span(&self) -> Span { - match self { - &WherePredicate::BoundPredicate(ref p) => p.span, - &WherePredicate::RegionPredicate(ref p) => p.span, - &WherePredicate::EqPredicate(ref p) => p.span, - } - } -} - -/// A type bound (e.g., `for<'c> Foo: Send + Clone + 'c`). -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct WhereBoundPredicate { - pub span: Span, - /// Any generics from a `for` binding. - pub bound_generic_params: HirVec, - /// The type being bounded. - pub bounded_ty: P, - /// Trait and lifetime bounds (e.g., `Clone + Send + 'static`). - pub bounds: GenericBounds, -} - -/// A lifetime predicate (e.g., `'a: 'b + 'c`). -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct WhereRegionPredicate { - pub span: Span, - pub lifetime: Lifetime, - pub bounds: GenericBounds, -} - -/// An equality predicate (e.g., `T = int`); currently unsupported. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct WhereEqPredicate { - pub hir_id: HirId, - pub span: Span, - pub lhs_ty: P, - pub rhs_ty: P, -} - -#[derive(RustcEncodable, RustcDecodable, Debug)] -pub struct ModuleItems { - // Use BTreeSets here so items are in the same order as in the - // list of all items in Crate - pub items: BTreeSet, - pub trait_items: BTreeSet, - pub impl_items: BTreeSet, -} - -/// The top-level data structure that stores the entire contents of -/// the crate currently being compiled. -/// -/// For more details, see the [rustc guide]. -/// -/// [rustc guide]: https://rust-lang.github.io/rustc-guide/hir.html -#[derive(RustcEncodable, RustcDecodable, Debug)] -pub struct Crate { - pub module: Mod, - pub attrs: HirVec, - pub span: Span, - pub exported_macros: HirVec, - // Attributes from non-exported macros, kept only for collecting the library feature list. - pub non_exported_macro_attrs: HirVec, - - // N.B., we use a `BTreeMap` here so that `visit_all_items` iterates - // over the ids in increasing order. In principle it should not - // matter what order we visit things in, but in *practice* it - // does, because it can affect the order in which errors are - // detected, which in turn can make compile-fail tests yield - // slightly different results. - pub items: BTreeMap, - - pub trait_items: BTreeMap, - pub impl_items: BTreeMap, - pub bodies: BTreeMap, - pub trait_impls: BTreeMap>, - - /// A list of the body ids written out in the order in which they - /// appear in the crate. If you're going to process all the bodies - /// in the crate, you should iterate over this list rather than the keys - /// of bodies. - pub body_ids: Vec, - - /// A list of modules written out in the order in which they - /// appear in the crate. This includes the main crate module. - pub modules: BTreeMap, -} - -impl Crate { - pub fn item(&self, id: HirId) -> &Item { - &self.items[&id] - } - - pub fn trait_item(&self, id: TraitItemId) -> &TraitItem { - &self.trait_items[&id] - } - - pub fn impl_item(&self, id: ImplItemId) -> &ImplItem { - &self.impl_items[&id] - } - - /// Visits all items in the crate in some deterministic (but - /// unspecified) order. If you just need to process every item, - /// but don't care about nesting, this method is the best choice. - /// - /// If you do care about nesting -- usually because your algorithm - /// follows lexical scoping rules -- then you want a different - /// approach. You should override `visit_nested_item` in your - /// visitor and then call `intravisit::walk_crate` instead. - pub fn visit_all_item_likes<'hir, V>(&'hir self, visitor: &mut V) - where V: itemlikevisit::ItemLikeVisitor<'hir> - { - for (_, item) in &self.items { - visitor.visit_item(item); - } - - for (_, trait_item) in &self.trait_items { - visitor.visit_trait_item(trait_item); - } - - for (_, impl_item) in &self.impl_items { - visitor.visit_impl_item(impl_item); - } - } - - /// A parallel version of `visit_all_item_likes`. - pub fn par_visit_all_item_likes<'hir, V>(&'hir self, visitor: &V) - where V: itemlikevisit::ParItemLikeVisitor<'hir> + Sync + Send - { - parallel!({ - par_for_each_in(&self.items, |(_, item)| { - visitor.visit_item(item); - }); - }, { - par_for_each_in(&self.trait_items, |(_, trait_item)| { - visitor.visit_trait_item(trait_item); - }); - }, { - par_for_each_in(&self.impl_items, |(_, impl_item)| { - visitor.visit_impl_item(impl_item); - }); - }); - } - - pub fn body(&self, id: BodyId) -> &Body { - &self.bodies[&id] - } -} - -/// A macro definition, in this crate or imported from another. -/// -/// Not parsed directly, but created on macro import or `macro_rules!` expansion. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct MacroDef { - pub name: Name, - pub vis: Visibility, - pub attrs: HirVec, - pub hir_id: HirId, - pub span: Span, - pub body: TokenStream, - pub legacy: bool, -} - -/// A block of statements `{ .. }`, which may have a label (in this case the -/// `targeted_by_break` field will be `true`) and may be `unsafe` by means of -/// the `rules` being anything but `DefaultBlock`. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct Block { - /// Statements in a block. - pub stmts: HirVec, - /// An expression at the end of the block - /// without a semicolon, if any. - pub expr: Option>, - #[stable_hasher(ignore)] - pub hir_id: HirId, - /// Distinguishes between `unsafe { ... }` and `{ ... }`. - pub rules: BlockCheckMode, - pub span: Span, - /// If true, then there may exist `break 'a` values that aim to - /// break out of this block early. - /// Used by `'label: {}` blocks and by `try {}` blocks. - pub targeted_by_break: bool, -} - -#[derive(RustcEncodable, RustcDecodable, HashStable)] -pub struct Pat { - #[stable_hasher(ignore)] - pub hir_id: HirId, - pub kind: PatKind, - pub span: Span, -} - -impl fmt::Debug for Pat { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "pat({}: {})", self.hir_id, - print::to_string(print::NO_ANN, |s| s.print_pat(self))) - } -} - -impl Pat { - // FIXME(#19596) this is a workaround, but there should be a better way - fn walk_short_(&self, it: &mut impl FnMut(&Pat) -> bool) -> bool { - if !it(self) { - return false; - } - - use PatKind::*; - match &self.kind { - Wild | Lit(_) | Range(..) | Binding(.., None) | Path(_) => true, - Box(s) | Ref(s, _) | Binding(.., Some(s)) => s.walk_short_(it), - Struct(_, fields, _) => fields.iter().all(|field| field.pat.walk_short_(it)), - TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().all(|p| p.walk_short_(it)), - Slice(before, slice, after) => { - before.iter() - .chain(slice.iter()) - .chain(after.iter()) - .all(|p| p.walk_short_(it)) - } - } - } - - /// Walk the pattern in left-to-right order, - /// short circuiting (with `.all(..)`) if `false` is returned. - /// - /// Note that when visiting e.g. `Tuple(ps)`, - /// if visiting `ps[0]` returns `false`, - /// then `ps[1]` will not be visited. - pub fn walk_short(&self, mut it: impl FnMut(&Pat) -> bool) -> bool { - self.walk_short_(&mut it) - } - - // FIXME(#19596) this is a workaround, but there should be a better way - fn walk_(&self, it: &mut impl FnMut(&Pat) -> bool) { - if !it(self) { - return; - } - - use PatKind::*; - match &self.kind { - Wild | Lit(_) | Range(..) | Binding(.., None) | Path(_) => {}, - Box(s) | Ref(s, _) | Binding(.., Some(s)) => s.walk_(it), - Struct(_, fields, _) => fields.iter().for_each(|field| field.pat.walk_(it)), - TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().for_each(|p| p.walk_(it)), - Slice(before, slice, after) => { - before.iter() - .chain(slice.iter()) - .chain(after.iter()) - .for_each(|p| p.walk_(it)) - } - } - } - - /// Walk the pattern in left-to-right order. - /// - /// If `it(pat)` returns `false`, the children are not visited. - pub fn walk(&self, mut it: impl FnMut(&Pat) -> bool) { - self.walk_(&mut it) - } -} - -/// A single field in a struct pattern. -/// -/// Patterns like the fields of Foo `{ x, ref y, ref mut z }` -/// are treated the same as` x: x, y: ref y, z: ref mut z`, -/// except `is_shorthand` is true. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct FieldPat { - #[stable_hasher(ignore)] - pub hir_id: HirId, - /// The identifier for the field. - #[stable_hasher(project(name))] - pub ident: Ident, - /// The pattern the field is destructured to. - pub pat: P, - pub is_shorthand: bool, - pub span: Span, -} - -/// Explicit binding annotations given in the HIR for a binding. Note -/// that this is not the final binding *mode* that we infer after type -/// inference. -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum BindingAnnotation { - /// No binding annotation given: this means that the final binding mode - /// will depend on whether we have skipped through a `&` reference - /// when matching. For example, the `x` in `Some(x)` will have binding - /// mode `None`; if you do `let Some(x) = &Some(22)`, it will - /// ultimately be inferred to be by-reference. - /// - /// Note that implicit reference skipping is not implemented yet (#42640). - Unannotated, - - /// Annotated with `mut x` -- could be either ref or not, similar to `None`. - Mutable, - - /// Annotated as `ref`, like `ref x` - Ref, - - /// Annotated as `ref mut x`. - RefMut, -} - -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum RangeEnd { - Included, - Excluded, -} - -impl fmt::Display for RangeEnd { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(match self { - RangeEnd::Included => "..=", - RangeEnd::Excluded => "..", - }) - } -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum PatKind { - /// Represents a wildcard pattern (i.e., `_`). - Wild, - - /// A fresh binding `ref mut binding @ OPT_SUBPATTERN`. - /// The `HirId` is the canonical ID for the variable being bound, - /// (e.g., in `Ok(x) | Err(x)`, both `x` use the same canonical ID), - /// which is the pattern ID of the first `x`. - Binding(BindingAnnotation, HirId, Ident, Option>), - - /// A struct or struct variant pattern (e.g., `Variant {x, y, ..}`). - /// The `bool` is `true` in the presence of a `..`. - Struct(QPath, HirVec, bool), - - /// A tuple struct/variant pattern `Variant(x, y, .., z)`. - /// If the `..` pattern fragment is present, then `Option` denotes its position. - /// `0 <= position <= subpats.len()` - TupleStruct(QPath, HirVec>, Option), - - /// An or-pattern `A | B | C`. - /// Invariant: `pats.len() >= 2`. - Or(HirVec>), - - /// A path pattern for an unit struct/variant or a (maybe-associated) constant. - Path(QPath), - - /// A tuple pattern (e.g., `(a, b)`). - /// If the `..` pattern fragment is present, then `Option` denotes its position. - /// `0 <= position <= subpats.len()` - Tuple(HirVec>, Option), - - /// A `box` pattern. - Box(P), - - /// A reference pattern (e.g., `&mut (a, b)`). - Ref(P, Mutability), - - /// A literal. - Lit(P), - - /// A range pattern (e.g., `1..=2` or `1..2`). - Range(P, P, RangeEnd), - - /// A slice pattern, `[before_0, ..., before_n, (slice, after_0, ..., after_n)?]`. - /// - /// Here, `slice` is lowered from the syntax `($binding_mode $ident @)? ..`. - /// If `slice` exists, then `after` can be non-empty. - /// - /// The representation for e.g., `[a, b, .., c, d]` is: - /// ``` - /// PatKind::Slice([Binding(a), Binding(b)], Some(Wild), [Binding(c), Binding(d)]) - /// ``` - Slice(HirVec>, Option>, HirVec>), -} - -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum BinOpKind { - /// The `+` operator (addition). - Add, - /// The `-` operator (subtraction). - Sub, - /// The `*` operator (multiplication). - Mul, - /// The `/` operator (division). - Div, - /// The `%` operator (modulus). - Rem, - /// The `&&` operator (logical and). - And, - /// The `||` operator (logical or). - Or, - /// The `^` operator (bitwise xor). - BitXor, - /// The `&` operator (bitwise and). - BitAnd, - /// The `|` operator (bitwise or). - BitOr, - /// The `<<` operator (shift left). - Shl, - /// The `>>` operator (shift right). - Shr, - /// The `==` operator (equality). - Eq, - /// The `<` operator (less than). - Lt, - /// The `<=` operator (less than or equal to). - Le, - /// The `!=` operator (not equal to). - Ne, - /// The `>=` operator (greater than or equal to). - Ge, - /// The `>` operator (greater than). - Gt, -} - -impl BinOpKind { - pub fn as_str(self) -> &'static str { - match self { - BinOpKind::Add => "+", - BinOpKind::Sub => "-", - BinOpKind::Mul => "*", - BinOpKind::Div => "/", - BinOpKind::Rem => "%", - BinOpKind::And => "&&", - BinOpKind::Or => "||", - BinOpKind::BitXor => "^", - BinOpKind::BitAnd => "&", - BinOpKind::BitOr => "|", - BinOpKind::Shl => "<<", - BinOpKind::Shr => ">>", - BinOpKind::Eq => "==", - BinOpKind::Lt => "<", - BinOpKind::Le => "<=", - BinOpKind::Ne => "!=", - BinOpKind::Ge => ">=", - BinOpKind::Gt => ">", - } - } - - pub fn is_lazy(self) -> bool { - match self { - BinOpKind::And | BinOpKind::Or => true, - _ => false, - } - } - - pub fn is_shift(self) -> bool { - match self { - BinOpKind::Shl | BinOpKind::Shr => true, - _ => false, - } - } - - pub fn is_comparison(self) -> bool { - match self { - BinOpKind::Eq | - BinOpKind::Lt | - BinOpKind::Le | - BinOpKind::Ne | - BinOpKind::Gt | - BinOpKind::Ge => true, - BinOpKind::And | - BinOpKind::Or | - BinOpKind::Add | - BinOpKind::Sub | - BinOpKind::Mul | - BinOpKind::Div | - BinOpKind::Rem | - BinOpKind::BitXor | - BinOpKind::BitAnd | - BinOpKind::BitOr | - BinOpKind::Shl | - BinOpKind::Shr => false, - } - } - - /// Returns `true` if the binary operator takes its arguments by value. - pub fn is_by_value(self) -> bool { - !self.is_comparison() - } -} - -impl Into for BinOpKind { - fn into(self) -> ast::BinOpKind { - match self { - BinOpKind::Add => ast::BinOpKind::Add, - BinOpKind::Sub => ast::BinOpKind::Sub, - BinOpKind::Mul => ast::BinOpKind::Mul, - BinOpKind::Div => ast::BinOpKind::Div, - BinOpKind::Rem => ast::BinOpKind::Rem, - BinOpKind::And => ast::BinOpKind::And, - BinOpKind::Or => ast::BinOpKind::Or, - BinOpKind::BitXor => ast::BinOpKind::BitXor, - BinOpKind::BitAnd => ast::BinOpKind::BitAnd, - BinOpKind::BitOr => ast::BinOpKind::BitOr, - BinOpKind::Shl => ast::BinOpKind::Shl, - BinOpKind::Shr => ast::BinOpKind::Shr, - BinOpKind::Eq => ast::BinOpKind::Eq, - BinOpKind::Lt => ast::BinOpKind::Lt, - BinOpKind::Le => ast::BinOpKind::Le, - BinOpKind::Ne => ast::BinOpKind::Ne, - BinOpKind::Ge => ast::BinOpKind::Ge, - BinOpKind::Gt => ast::BinOpKind::Gt, - } - } -} - -pub type BinOp = Spanned; - -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum UnOp { - /// The `*` operator (deferencing). - UnDeref, - /// The `!` operator (logical negation). - UnNot, - /// The `-` operator (negation). - UnNeg, -} - -impl UnOp { - pub fn as_str(self) -> &'static str { - match self { - UnDeref => "*", - UnNot => "!", - UnNeg => "-", - } - } - - /// Returns `true` if the unary operator takes its argument by value. - pub fn is_by_value(self) -> bool { - match self { - UnNeg | UnNot => true, - _ => false, - } - } -} - -/// A statement. -#[derive(RustcEncodable, RustcDecodable, HashStable)] -pub struct Stmt { - pub hir_id: HirId, - pub kind: StmtKind, - pub span: Span, -} - -impl fmt::Debug for Stmt { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "stmt({}: {})", self.hir_id, - print::to_string(print::NO_ANN, |s| s.print_stmt(self))) - } -} - -/// The contents of a statement. -#[derive(RustcEncodable, RustcDecodable, HashStable)] -pub enum StmtKind { - /// A local (`let`) binding. - Local(P), - - /// An item binding. - Item(ItemId), - - /// An expression without a trailing semi-colon (must have unit type). - Expr(P), - - /// An expression with a trailing semi-colon (may have any type). - Semi(P), -} - -impl StmtKind { - pub fn attrs(&self) -> &[Attribute] { - match *self { - StmtKind::Local(ref l) => &l.attrs, - StmtKind::Item(_) => &[], - StmtKind::Expr(ref e) | - StmtKind::Semi(ref e) => &e.attrs, - } - } -} - -/// Represents a `let` statement (i.e., `let : = ;`). -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct Local { - pub pat: P, - /// Type annotation, if any (otherwise the type will be inferred). - pub ty: Option>, - /// Initializer expression to set the value, if any. - pub init: Option>, - pub hir_id: HirId, - pub span: Span, - pub attrs: ThinVec, - /// Can be `ForLoopDesugar` if the `let` statement is part of a `for` loop - /// desugaring. Otherwise will be `Normal`. - pub source: LocalSource, -} - -/// Represents a single arm of a `match` expression, e.g. -/// ` (if ) => `. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct Arm { - #[stable_hasher(ignore)] - pub hir_id: HirId, - pub span: Span, - pub attrs: HirVec, - /// If this pattern and the optional guard matches, then `body` is evaluated. - pub pat: P, - /// Optional guard clause. - pub guard: Option, - /// The expression the arm evaluates to if this arm matches. - pub body: P, -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum Guard { - If(P), -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct Field { - #[stable_hasher(ignore)] - pub hir_id: HirId, - pub ident: Ident, - pub expr: P, - pub span: Span, - pub is_shorthand: bool, -} - -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum BlockCheckMode { - DefaultBlock, - UnsafeBlock(UnsafeSource), - PushUnsafeBlock(UnsafeSource), - PopUnsafeBlock(UnsafeSource), -} - -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum UnsafeSource { - CompilerGenerated, - UserProvided, -} - -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, RustcEncodable, RustcDecodable, Hash, Debug)] -pub struct BodyId { - pub hir_id: HirId, -} - -/// The body of a function, closure, or constant value. In the case of -/// a function, the body contains not only the function body itself -/// (which is an expression), but also the argument patterns, since -/// those are something that the caller doesn't really care about. -/// -/// # Examples -/// -/// ``` -/// fn foo((x, y): (u32, u32)) -> u32 { -/// x + y -/// } -/// ``` -/// -/// Here, the `Body` associated with `foo()` would contain: -/// -/// - an `params` array containing the `(x, y)` pattern -/// - a `value` containing the `x + y` expression (maybe wrapped in a block) -/// - `generator_kind` would be `None` -/// -/// All bodies have an **owner**, which can be accessed via the HIR -/// map using `body_owner_def_id()`. -#[derive(RustcEncodable, RustcDecodable, Debug)] -pub struct Body { - pub params: HirVec, - pub value: Expr, - pub generator_kind: Option, -} - -impl Body { - pub fn id(&self) -> BodyId { - BodyId { - hir_id: self.value.hir_id, - } - } - - pub fn generator_kind(&self) -> Option { - self.generator_kind - } -} - -/// The type of source expression that caused this generator to be created. -#[derive(Clone, PartialEq, Eq, HashStable, RustcEncodable, RustcDecodable, Debug, Copy)] -pub enum GeneratorKind { - /// An explicit `async` block or the body of an async function. - Async(AsyncGeneratorKind), - - /// A generator literal created via a `yield` inside a closure. - Gen, -} - -impl fmt::Display for GeneratorKind { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - GeneratorKind::Async(k) => fmt::Display::fmt(k, f), - GeneratorKind::Gen => f.write_str("generator"), - } - } -} - -/// In the case of a generator created as part of an async construct, -/// which kind of async construct caused it to be created? -/// -/// This helps error messages but is also used to drive coercions in -/// type-checking (see #60424). -#[derive(Clone, PartialEq, Eq, HashStable, RustcEncodable, RustcDecodable, Debug, Copy)] -pub enum AsyncGeneratorKind { - /// An explicit `async` block written by the user. - Block, - - /// An explicit `async` block written by the user. - Closure, - - /// The `async` block generated as the body of an async function. - Fn, -} - -impl fmt::Display for AsyncGeneratorKind { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(match self { - AsyncGeneratorKind::Block => "`async` block", - AsyncGeneratorKind::Closure => "`async` closure body", - AsyncGeneratorKind::Fn => "`async fn` body", - }) - } -} - -#[derive(Copy, Clone, Debug)] -pub enum BodyOwnerKind { - /// Functions and methods. - Fn, - - /// Closures - Closure, - - /// Constants and associated constants. - Const, - - /// Initializer of a `static` item. - Static(Mutability), -} - -impl BodyOwnerKind { - pub fn is_fn_or_closure(self) -> bool { - match self { - BodyOwnerKind::Fn | BodyOwnerKind::Closure => true, - BodyOwnerKind::Const | BodyOwnerKind::Static(_) => false, - } - } -} - -/// A literal. -pub type Lit = Spanned; - -/// A constant (expression) that's not an item or associated item, -/// but needs its own `DefId` for type-checking, const-eval, etc. -/// These are usually found nested inside types (e.g., array lengths) -/// or expressions (e.g., repeat counts), and also used to define -/// explicit discriminant values for enum variants. -#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct AnonConst { - pub hir_id: HirId, - pub body: BodyId, -} - -/// An expression. -#[derive(RustcEncodable, RustcDecodable)] -pub struct Expr { - pub hir_id: HirId, - pub kind: ExprKind, - pub attrs: ThinVec, - pub span: Span, -} - -// `Expr` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] -static_assert_size!(Expr, 64); - -impl Expr { - pub fn precedence(&self) -> ExprPrecedence { - match self.kind { - ExprKind::Box(_) => ExprPrecedence::Box, - ExprKind::Array(_) => ExprPrecedence::Array, - ExprKind::Call(..) => ExprPrecedence::Call, - ExprKind::MethodCall(..) => ExprPrecedence::MethodCall, - ExprKind::Tup(_) => ExprPrecedence::Tup, - ExprKind::Binary(op, ..) => ExprPrecedence::Binary(op.node.into()), - ExprKind::Unary(..) => ExprPrecedence::Unary, - ExprKind::Lit(_) => ExprPrecedence::Lit, - ExprKind::Type(..) | ExprKind::Cast(..) => ExprPrecedence::Cast, - ExprKind::DropTemps(ref expr, ..) => expr.precedence(), - ExprKind::Loop(..) => ExprPrecedence::Loop, - ExprKind::Match(..) => ExprPrecedence::Match, - ExprKind::Closure(..) => ExprPrecedence::Closure, - ExprKind::Block(..) => ExprPrecedence::Block, - ExprKind::Assign(..) => ExprPrecedence::Assign, - ExprKind::AssignOp(..) => ExprPrecedence::AssignOp, - ExprKind::Field(..) => ExprPrecedence::Field, - ExprKind::Index(..) => ExprPrecedence::Index, - ExprKind::Path(..) => ExprPrecedence::Path, - ExprKind::AddrOf(..) => ExprPrecedence::AddrOf, - ExprKind::Break(..) => ExprPrecedence::Break, - ExprKind::Continue(..) => ExprPrecedence::Continue, - ExprKind::Ret(..) => ExprPrecedence::Ret, - ExprKind::InlineAsm(..) => ExprPrecedence::InlineAsm, - ExprKind::Struct(..) => ExprPrecedence::Struct, - ExprKind::Repeat(..) => ExprPrecedence::Repeat, - ExprKind::Yield(..) => ExprPrecedence::Yield, - ExprKind::Err => ExprPrecedence::Err, - } - } - - // Whether this looks like a place expr, without checking for deref - // adjustments. - // This will return `true` in some potentially surprising cases such as - // `CONSTANT.field`. - pub fn is_syntactic_place_expr(&self) -> bool { - self.is_place_expr(|_| true) - } - - // Whether this is a place expression. - // `allow_projections_from` should return `true` if indexing a field or - // index expression based on the given expression should be considered a - // place expression. - pub fn is_place_expr(&self, mut allow_projections_from: impl FnMut(&Self) -> bool) -> bool { - match self.kind { - ExprKind::Path(QPath::Resolved(_, ref path)) => { - match path.res { - Res::Local(..) - | Res::Def(DefKind::Static, _) - | Res::Err => true, - _ => false, - } - } - - // Type ascription inherits its place expression kind from its - // operand. See: - // https://github.com/rust-lang/rfcs/blob/master/text/0803-type-ascription.md#type-ascription-and-temporaries - ExprKind::Type(ref e, _) => { - e.is_place_expr(allow_projections_from) - } - - ExprKind::Unary(UnDeref, _) => true, - - ExprKind::Field(ref base, _) | - ExprKind::Index(ref base, _) => { - allow_projections_from(base) - || base.is_place_expr(allow_projections_from) - } - - // Partially qualified paths in expressions can only legally - // refer to associated items which are always rvalues. - ExprKind::Path(QPath::TypeRelative(..)) | - - ExprKind::Call(..) | - ExprKind::MethodCall(..) | - ExprKind::Struct(..) | - ExprKind::Tup(..) | - ExprKind::Match(..) | - ExprKind::Closure(..) | - ExprKind::Block(..) | - ExprKind::Repeat(..) | - ExprKind::Array(..) | - ExprKind::Break(..) | - ExprKind::Continue(..) | - ExprKind::Ret(..) | - ExprKind::Loop(..) | - ExprKind::Assign(..) | - ExprKind::InlineAsm(..) | - ExprKind::AssignOp(..) | - ExprKind::Lit(_) | - ExprKind::Unary(..) | - ExprKind::Box(..) | - ExprKind::AddrOf(..) | - ExprKind::Binary(..) | - ExprKind::Yield(..) | - ExprKind::Cast(..) | - ExprKind::DropTemps(..) | - ExprKind::Err => { - false - } - } - } - - /// If `Self.kind` is `ExprKind::DropTemps(expr)`, drill down until we get a non-`DropTemps` - /// `Expr`. This is used in suggestions to ignore this `ExprKind` as it is semantically - /// silent, only signaling the ownership system. By doing this, suggestions that check the - /// `ExprKind` of any given `Expr` for presentation don't have to care about `DropTemps` - /// beyond remembering to call this function before doing analysis on it. - pub fn peel_drop_temps(&self) -> &Self { - let mut expr = self; - while let ExprKind::DropTemps(inner) = &expr.kind { - expr = inner; - } - expr - } -} - -impl fmt::Debug for Expr { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "expr({}: {})", self.hir_id, - print::to_string(print::NO_ANN, |s| s.print_expr(self))) - } -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum ExprKind { - /// A `box x` expression. - Box(P), - /// An array (e.g., `[a, b, c, d]`). - Array(HirVec), - /// A function call. - /// - /// The first field resolves to the function itself (usually an `ExprKind::Path`), - /// and the second field is the list of arguments. - /// This also represents calling the constructor of - /// tuple-like ADTs such as tuple structs and enum variants. - Call(P, HirVec), - /// A method call (e.g., `x.foo::<'static, Bar, Baz>(a, b, c, d)`). - /// - /// The `PathSegment`/`Span` represent the method name and its generic arguments - /// (within the angle brackets). - /// The first element of the vector of `Expr`s is the expression that evaluates - /// to the object on which the method is being called on (the receiver), - /// and the remaining elements are the rest of the arguments. - /// Thus, `x.foo::(a, b, c, d)` is represented as - /// `ExprKind::MethodCall(PathSegment { foo, [Bar, Baz] }, [x, a, b, c, d])`. - /// - /// To resolve the called method to a `DefId`, call [`type_dependent_def_id`] with - /// the `hir_id` of the `MethodCall` node itself. - /// - /// [`type_dependent_def_id`]: ../ty/struct.TypeckTables.html#method.type_dependent_def_id - MethodCall(P, Span, HirVec), - /// A tuple (e.g., `(a, b, c, d)`). - Tup(HirVec), - /// A binary operation (e.g., `a + b`, `a * b`). - Binary(BinOp, P, P), - /// A unary operation (e.g., `!x`, `*x`). - Unary(UnOp, P), - /// A literal (e.g., `1`, `"foo"`). - Lit(Lit), - /// A cast (e.g., `foo as f64`). - Cast(P, P), - /// A type reference (e.g., `Foo`). - Type(P, P), - /// Wraps the expression in a terminating scope. - /// This makes it semantically equivalent to `{ let _t = expr; _t }`. - /// - /// This construct only exists to tweak the drop order in HIR lowering. - /// An example of that is the desugaring of `for` loops. - DropTemps(P), - /// A conditionless loop (can be exited with `break`, `continue`, or `return`). - /// - /// I.e., `'label: loop { }`. - Loop(P, Option, D}`. - Enum(EnumDef, Generics), - /// A struct definition, e.g., `struct Foo {x: A}`. - Struct(VariantData, Generics), - /// A union definition, e.g., `union Foo {x: A, y: B}`. - Union(VariantData, Generics), - /// A trait definition. - Trait(IsAuto, Unsafety, Generics, GenericBounds, HirVec), - /// A trait alias. - TraitAlias(Generics, GenericBounds), - - /// An implementation, e.g., `impl Trait for Foo { .. }`. - Impl(Unsafety, - ImplPolarity, - Defaultness, - Generics, - Option, // (optional) trait this impl implements - P, // self - HirVec), -} - -impl ItemKind { - pub fn descriptive_variant(&self) -> &str { - match *self { - ItemKind::ExternCrate(..) => "extern crate", - ItemKind::Use(..) => "use", - ItemKind::Static(..) => "static item", - ItemKind::Const(..) => "constant item", - ItemKind::Fn(..) => "function", - ItemKind::Mod(..) => "module", - ItemKind::ForeignMod(..) => "foreign module", - ItemKind::GlobalAsm(..) => "global asm", - ItemKind::TyAlias(..) => "type alias", - ItemKind::OpaqueTy(..) => "opaque type", - ItemKind::Enum(..) => "enum", - ItemKind::Struct(..) => "struct", - ItemKind::Union(..) => "union", - ItemKind::Trait(..) => "trait", - ItemKind::TraitAlias(..) => "trait alias", - ItemKind::Impl(..) => "impl", - } - } - - pub fn adt_kind(&self) -> Option { - match *self { - ItemKind::Struct(..) => Some(AdtKind::Struct), - ItemKind::Union(..) => Some(AdtKind::Union), - ItemKind::Enum(..) => Some(AdtKind::Enum), - _ => None, - } - } - - pub fn generics(&self) -> Option<&Generics> { - Some(match *self { - ItemKind::Fn(_, ref generics, _) | - ItemKind::TyAlias(_, ref generics) | - ItemKind::OpaqueTy(OpaqueTy { ref generics, impl_trait_fn: None, .. }) | - ItemKind::Enum(_, ref generics) | - ItemKind::Struct(_, ref generics) | - ItemKind::Union(_, ref generics) | - ItemKind::Trait(_, _, ref generics, _, _) | - ItemKind::Impl(_, _, _, ref generics, _, _, _)=> generics, - _ => return None - }) - } -} - -/// A reference from an trait to one of its associated items. This -/// contains the item's id, naturally, but also the item's name and -/// some other high-level details (like whether it is an associated -/// type or method, and whether it is public). This allows other -/// passes to find the impl they want without loading the ID (which -/// means fewer edges in the incremental compilation graph). -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct TraitItemRef { - pub id: TraitItemId, - #[stable_hasher(project(name))] - pub ident: Ident, - pub kind: AssocItemKind, - pub span: Span, - pub defaultness: Defaultness, -} - -/// A reference from an impl to one of its associated items. This -/// contains the item's ID, naturally, but also the item's name and -/// some other high-level details (like whether it is an associated -/// type or method, and whether it is public). This allows other -/// passes to find the impl they want without loading the ID (which -/// means fewer edges in the incremental compilation graph). -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct ImplItemRef { - pub id: ImplItemId, - #[stable_hasher(project(name))] - pub ident: Ident, - pub kind: AssocItemKind, - pub span: Span, - pub vis: Visibility, - pub defaultness: Defaultness, -} - -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum AssocItemKind { - Const, - Method { has_self: bool }, - Type, - OpaqueTy, -} - -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub struct ForeignItem { - #[stable_hasher(project(name))] - pub ident: Ident, - pub attrs: HirVec, - pub kind: ForeignItemKind, - pub hir_id: HirId, - pub span: Span, - pub vis: Visibility, -} - -/// An item within an `extern` block. -#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] -pub enum ForeignItemKind { - /// A foreign function. - Fn(P, HirVec, Generics), - /// A foreign static item (`static ext: u8`). - Static(P, Mutability), - /// A foreign type. - Type, -} - -impl ForeignItemKind { - pub fn descriptive_variant(&self) -> &str { - match *self { - ForeignItemKind::Fn(..) => "foreign function", - ForeignItemKind::Static(..) => "foreign static item", - ForeignItemKind::Type => "foreign type", - } - } -} - -/// A variable captured by a closure. -#[derive(Debug, Copy, Clone, RustcEncodable, RustcDecodable, HashStable)] -pub struct Upvar { - // First span where it is accessed (there can be multiple). - pub span: Span -} - -pub type CaptureModeMap = NodeMap; - - // The TraitCandidate's import_ids is empty if the trait is defined in the same module, and - // has length > 0 if the trait is found through an chain of imports, starting with the - // import/use statement in the scope where the trait is used. -#[derive(Clone, Debug)] -pub struct TraitCandidate { - pub def_id: DefId, - pub import_ids: SmallVec<[NodeId; 1]>, -} - -// Trait method resolution -pub type TraitMap = NodeMap>; - -// Map from the NodeId of a glob import to a list of items which are actually -// imported. -pub type GlobMap = NodeMap>; +use crate::ty::query::Providers; pub fn provide(providers: &mut Providers<'_>) { check_attr::provide(providers); map::provide(providers); upvars::provide(providers); } - -#[derive(Clone, RustcEncodable, RustcDecodable, HashStable)] -pub struct CodegenFnAttrs { - pub flags: CodegenFnAttrFlags, - /// Parsed representation of the `#[inline]` attribute - pub inline: InlineAttr, - /// Parsed representation of the `#[optimize]` attribute - pub optimize: OptimizeAttr, - /// The `#[export_name = "..."]` attribute, indicating a custom symbol a - /// function should be exported under - pub export_name: Option, - /// The `#[link_name = "..."]` attribute, indicating a custom symbol an - /// imported function should be imported as. Note that `export_name` - /// probably isn't set when this is set, this is for foreign items while - /// `#[export_name]` is for Rust-defined functions. - pub link_name: Option, - /// The `#[link_ordinal = "..."]` attribute, indicating an ordinal an - /// imported function has in the dynamic library. Note that this must not - /// be set when `link_name` is set. This is for foreign items with the - /// "raw-dylib" kind. - pub link_ordinal: Option, - /// The `#[target_feature(enable = "...")]` attribute and the enabled - /// features (only enabled features are supported right now). - pub target_features: Vec, - /// The `#[linkage = "..."]` attribute and the value we found. - pub linkage: Option, - /// The `#[link_section = "..."]` attribute, or what executable section this - /// should be placed in. - pub link_section: Option, -} - -bitflags! { - #[derive(RustcEncodable, RustcDecodable, HashStable)] - pub struct CodegenFnAttrFlags: u32 { - /// `#[cold]`: a hint to LLVM that this function, when called, is never on - /// the hot path. - const COLD = 1 << 0; - /// `#[rustc_allocator]`: a hint to LLVM that the pointer returned from this - /// function is never null. - const ALLOCATOR = 1 << 1; - /// `#[unwind]`: an indicator that this function may unwind despite what - /// its ABI signature may otherwise imply. - const UNWIND = 1 << 2; - /// `#[rust_allocator_nounwind]`, an indicator that an imported FFI - /// function will never unwind. Probably obsolete by recent changes with - /// #[unwind], but hasn't been removed/migrated yet - const RUSTC_ALLOCATOR_NOUNWIND = 1 << 3; - /// `#[naked]`: an indicator to LLVM that no function prologue/epilogue - /// should be generated. - const NAKED = 1 << 4; - /// `#[no_mangle]`: an indicator that the function's name should be the same - /// as its symbol. - const NO_MANGLE = 1 << 5; - /// `#[rustc_std_internal_symbol]`: an indicator that this symbol is a - /// "weird symbol" for the standard library in that it has slightly - /// different linkage, visibility, and reachability rules. - const RUSTC_STD_INTERNAL_SYMBOL = 1 << 6; - /// `#[no_debug]`: an indicator that no debugging information should be - /// generated for this function by LLVM. - const NO_DEBUG = 1 << 7; - /// `#[thread_local]`: indicates a static is actually a thread local - /// piece of memory - const THREAD_LOCAL = 1 << 8; - /// `#[used]`: indicates that LLVM can't eliminate this function (but the - /// linker can!). - const USED = 1 << 9; - /// `#[ffi_returns_twice]`, indicates that an extern function can return - /// multiple times - const FFI_RETURNS_TWICE = 1 << 10; - /// `#[track_caller]`: allow access to the caller location - const TRACK_CALLER = 1 << 11; - } -} - -impl CodegenFnAttrs { - pub fn new() -> CodegenFnAttrs { - CodegenFnAttrs { - flags: CodegenFnAttrFlags::empty(), - inline: InlineAttr::None, - optimize: OptimizeAttr::None, - export_name: None, - link_name: None, - link_ordinal: None, - target_features: vec![], - linkage: None, - link_section: None, - } - } - - /// Returns `true` if `#[inline]` or `#[inline(always)]` is present. - pub fn requests_inline(&self) -> bool { - match self.inline { - InlineAttr::Hint | InlineAttr::Always => true, - InlineAttr::None | InlineAttr::Never => false, - } - } - - /// Returns `true` if it looks like this symbol needs to be exported, for example: - /// - /// * `#[no_mangle]` is present - /// * `#[export_name(...)]` is present - /// * `#[linkage]` is present - pub fn contains_extern_indicator(&self) -> bool { - self.flags.contains(CodegenFnAttrFlags::NO_MANGLE) || - self.export_name.is_some() || - match self.linkage { - // These are private, so make sure we don't try to consider - // them external. - None | - Some(Linkage::Internal) | - Some(Linkage::Private) => false, - Some(_) => true, - } - } -} - -#[derive(Copy, Clone, Debug)] -pub enum Node<'hir> { - Param(&'hir Param), - Item(&'hir Item), - ForeignItem(&'hir ForeignItem), - TraitItem(&'hir TraitItem), - ImplItem(&'hir ImplItem), - Variant(&'hir Variant), - Field(&'hir StructField), - AnonConst(&'hir AnonConst), - Expr(&'hir Expr), - Stmt(&'hir Stmt), - PathSegment(&'hir PathSegment), - Ty(&'hir Ty), - TraitRef(&'hir TraitRef), - Binding(&'hir Pat), - Pat(&'hir Pat), - Arm(&'hir Arm), - Block(&'hir Block), - Local(&'hir Local), - MacroDef(&'hir MacroDef), - - /// `Ctor` refers to the constructor of an enum variant or struct. Only tuple or unit variants - /// with synthesized constructors. - Ctor(&'hir VariantData), - - Lifetime(&'hir Lifetime), - GenericParam(&'hir GenericParam), - Visibility(&'hir Visibility), - - Crate, -} - -impl Node<'_> { - pub fn ident(&self) -> Option { - match self { - Node::TraitItem(TraitItem { ident, .. }) | - Node::ImplItem(ImplItem { ident, .. }) | - Node::ForeignItem(ForeignItem { ident, .. }) | - Node::Item(Item { ident, .. }) => Some(*ident), - _ => None, - } - } -} diff --git a/src/librustc/hir/ptr.rs b/src/librustc/hir/ptr.rs deleted file mode 100644 index 7ee461a859..0000000000 --- a/src/librustc/hir/ptr.rs +++ /dev/null @@ -1,138 +0,0 @@ -// HACK(eddyb) this is a copy of `syntax::ptr`, minus the mutation (the HIR is -// frozen anyway). The only reason for doing this instead of replacing `P` -// with `Box` in HIR, is that `&Box<[T]>` doesn't implement `IntoIterator`. - -use std::fmt::{self, Display, Debug}; -use std::iter::FromIterator; -use std::ops::Deref; -use std::{slice, vec}; - -use rustc_serialize::{Encodable, Decodable, Encoder, Decoder}; - -use rustc_data_structures::stable_hasher::{StableHasher, HashStable}; -/// An owned smart pointer. -#[derive(PartialEq, Eq)] -pub struct P { - ptr: Box -} - -/// Construct a `P` from a `T` value. -#[allow(non_snake_case)] -pub fn P(value: T) -> P { - P { - ptr: box value - } -} - -impl P { - // HACK(eddyb) used by HIR lowering in a few places still. - // NOTE: do not make this more public than `pub(super)`. - pub(super) fn into_inner(self) -> T { - *self.ptr - } -} - -impl Deref for P { - type Target = T; - - fn deref(&self) -> &T { - &self.ptr - } -} - -impl Debug for P { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - Debug::fmt(&self.ptr, f) - } -} - -impl Display for P { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - Display::fmt(&**self, f) - } -} - -impl Decodable for P { - fn decode(d: &mut D) -> Result, D::Error> { - Decodable::decode(d).map(P) - } -} - -impl Encodable for P { - fn encode(&self, s: &mut S) -> Result<(), S::Error> { - (**self).encode(s) - } -} - -impl P<[T]> { - pub const fn new() -> P<[T]> { - // HACK(eddyb) bypass the lack of a `const fn` to create an empty `Box<[T]>` - // (as trait methods, `default` in this case, can't be `const fn` yet). - P { - ptr: unsafe { - use std::ptr::NonNull; - std::mem::transmute(NonNull::<[T; 0]>::dangling() as NonNull<[T]>) - }, - } - } - - #[inline(never)] - pub fn from_vec(v: Vec) -> P<[T]> { - P { ptr: v.into_boxed_slice() } - } - - // HACK(eddyb) used by HIR lowering in a few places still. - // NOTE: do not make this more public than `pub(super)`, - // and do not make this into an `IntoIterator` impl. - pub(super) fn into_iter(self) -> vec::IntoIter { - self.ptr.into_vec().into_iter() - } -} - - -impl Default for P<[T]> { - /// Creates an empty `P<[T]>`. - fn default() -> P<[T]> { - P::new() - } -} - -impl From> for P<[T]> { - fn from(v: Vec) -> Self { - P::from_vec(v) - } -} - -impl FromIterator for P<[T]> { - fn from_iter>(iter: I) -> P<[T]> { - P::from_vec(iter.into_iter().collect()) - } -} - -impl<'a, T> IntoIterator for &'a P<[T]> { - type Item = &'a T; - type IntoIter = slice::Iter<'a, T>; - fn into_iter(self) -> Self::IntoIter { - self.ptr.into_iter() - } -} - -impl Encodable for P<[T]> { - fn encode(&self, s: &mut S) -> Result<(), S::Error> { - Encodable::encode(&**self, s) - } -} - -impl Decodable for P<[T]> { - fn decode(d: &mut D) -> Result, D::Error> { - Ok(P::from_vec(Decodable::decode(d)?)) - } -} - -impl HashStable for P - where T: ?Sized + HashStable -{ - fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) { - (**self).hash_stable(hcx, hasher); - } -} diff --git a/src/librustc/hir/upvars.rs b/src/librustc/hir/upvars.rs index 5c5f7f6120..4ca294f486 100644 --- a/src/librustc/hir/upvars.rs +++ b/src/librustc/hir/upvars.rs @@ -1,12 +1,14 @@ //! Upvar (closure capture) collection from cross-body HIR uses of `Res::Local`s. -use crate::hir::{self, HirId}; -use crate::hir::def::Res; -use crate::hir::intravisit::{self, Visitor, NestedVisitorMap}; -use crate::ty::TyCtxt; +use crate::hir::map::Map; use crate::ty::query::Providers; -use syntax_pos::Span; -use rustc_data_structures::fx::{FxIndexMap, FxHashSet}; +use crate::ty::TyCtxt; +use rustc_data_structures::fx::{FxHashSet, FxIndexMap}; +use rustc_hir as hir; +use rustc_hir::def::Res; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_hir::{self, HirId}; +use rustc_span::Span; pub fn provide(providers: &mut Providers<'_>) { providers.upvars = |tcx, def_id| { @@ -42,11 +44,13 @@ struct LocalCollector { } impl Visitor<'tcx> for LocalCollector { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, Self::Map> { NestedVisitorMap::None } - fn visit_pat(&mut self, pat: &'tcx hir::Pat) { + fn visit_pat(&mut self, pat: &'tcx hir::Pat<'tcx>) { if let hir::PatKind::Binding(_, hir_id, ..) = pat.kind { self.locals.insert(hir_id); } @@ -69,11 +73,13 @@ impl CaptureCollector<'_, '_> { } impl Visitor<'tcx> for CaptureCollector<'a, 'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, Self::Map> { NestedVisitorMap::None } - fn visit_path(&mut self, path: &'tcx hir::Path, _: hir::HirId) { + fn visit_path(&mut self, path: &'tcx hir::Path<'tcx>, _: hir::HirId) { if let Res::Local(var_id) = path.res { self.visit_local_use(var_id, path.span); } @@ -81,7 +87,7 @@ impl Visitor<'tcx> for CaptureCollector<'a, 'tcx> { intravisit::walk_path(self, path); } - fn visit_expr(&mut self, expr: &'tcx hir::Expr) { + fn visit_expr(&mut self, expr: &'tcx hir::Expr<'tcx>) { if let hir::ExprKind::Closure(..) = expr.kind { let closure_def_id = self.tcx.hir().local_def_id(expr.hir_id); if let Some(upvars) = self.tcx.upvars(closure_def_id) { diff --git a/src/librustc/ich/hcx.rs b/src/librustc/ich/hcx.rs index 8b35839c18..aade4c3f74 100644 --- a/src/librustc/ich/hcx.rs +++ b/src/librustc/ich/hcx.rs @@ -1,25 +1,22 @@ -use crate::hir; -use crate::hir::def_id::{DefId, DefIndex}; -use crate::hir::map::DefPathHash; use crate::hir::map::definitions::Definitions; +use crate::hir::map::DefPathHash; use crate::ich::{self, CachingSourceMapView}; use crate::middle::cstore::CrateStore; -use crate::ty::{TyCtxt, fast_reject}; use crate::session::Session; +use crate::ty::{fast_reject, TyCtxt}; -use std::cmp::Ord; - -use syntax::ast; -use syntax::source_map::SourceMap; -use syntax::symbol::Symbol; -use syntax_pos::{SourceFile, BytePos}; - -use rustc_data_structures::stable_hasher::{ - HashStable, StableHasher, ToStableHashKey, -}; -use rustc_data_structures::fx::{FxHashSet, FxHashMap}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey}; use rustc_data_structures::sync::Lrc; +use rustc_hir as hir; +use rustc_hir::def_id::{DefId, DefIndex}; +use rustc_span::source_map::SourceMap; +use rustc_span::symbol::Symbol; +use rustc_span::{BytePos, SourceFile}; +use syntax::ast; + use smallvec::SmallVec; +use std::cmp::Ord; fn compute_ignored_attr_names() -> FxHashSet { debug_assert!(ich::IGNORED_ATTRIBUTES.len() > 0); @@ -35,10 +32,10 @@ pub struct StableHashingContext<'a> { sess: &'a Session, definitions: &'a Definitions, cstore: &'a dyn CrateStore, - body_resolver: BodyResolver<'a>, + pub(super) body_resolver: BodyResolver<'a>, hash_spans: bool, hash_bodies: bool, - node_id_hashing_mode: NodeIdHashingMode, + pub(super) node_id_hashing_mode: NodeIdHashingMode, // Very often, we are hashing something that does not need the // `CachingSourceMapView`, so we initialize it lazily. @@ -56,12 +53,12 @@ pub enum NodeIdHashingMode { /// We could also just store a plain reference to the `hir::Crate` but we want /// to avoid that the crate is used to get untracked access to all of the HIR. #[derive(Clone, Copy)] -struct BodyResolver<'tcx>(&'tcx hir::Crate); +pub(super) struct BodyResolver<'tcx>(&'tcx hir::Crate<'tcx>); impl<'tcx> BodyResolver<'tcx> { /// Returns a reference to the `hir::Body` with the given `BodyId`. /// **Does not do any tracking**; use carefully. - fn body(self, id: hir::BodyId) -> &'tcx hir::Body { + pub(super) fn body(self, id: hir::BodyId) -> &'tcx hir::Body<'tcx> { self.0.body(id) } } @@ -71,11 +68,12 @@ impl<'a> StableHashingContext<'a> { /// Don't use it for anything else or you'll run the risk of /// leaking data out of the tracking system. #[inline] - pub fn new(sess: &'a Session, - krate: &'a hir::Crate, - definitions: &'a Definitions, - cstore: &'a dyn CrateStore) - -> Self { + pub fn new( + sess: &'a Session, + krate: &'a hir::Crate<'a>, + definitions: &'a Definitions, + cstore: &'a dyn CrateStore, + ) -> Self { let hash_spans_initial = !sess.opts.debugging_opts.incremental_ignore_spans; StableHashingContext { @@ -97,9 +95,7 @@ impl<'a> StableHashingContext<'a> { } #[inline] - pub fn while_hashing_hir_bodies(&mut self, - hash_bodies: bool, - f: F) { + pub fn while_hashing_hir_bodies(&mut self, hash_bodies: bool, f: F) { let prev_hash_bodies = self.hash_bodies; self.hash_bodies = hash_bodies; f(self); @@ -107,9 +103,7 @@ impl<'a> StableHashingContext<'a> { } #[inline] - pub fn while_hashing_spans(&mut self, - hash_spans: bool, - f: F) { + pub fn while_hashing_spans(&mut self, hash_spans: bool, f: F) { let prev_hash_spans = self.hash_spans; self.hash_spans = hash_spans; f(self); @@ -117,9 +111,11 @@ impl<'a> StableHashingContext<'a> { } #[inline] - pub fn with_node_id_hashing_mode(&mut self, - mode: NodeIdHashingMode, - f: F) { + pub fn with_node_id_hashing_mode( + &mut self, + mode: NodeIdHashingMode, + f: F, + ) { let prev = self.node_id_hashing_mode; self.node_id_hashing_mode = mode; f(self); @@ -153,9 +149,7 @@ impl<'a> StableHashingContext<'a> { #[inline] pub fn source_map(&mut self) -> &mut CachingSourceMapView<'a> { match self.caching_source_map { - Some(ref mut cm) => { - cm - } + Some(ref mut cm) => cm, ref mut none => { *none = Some(CachingSourceMapView::new(self.raw_source_map)); none.as_mut().unwrap() @@ -186,15 +180,13 @@ pub trait StableHashingContextProvider<'a> { fn get_stable_hashing_context(&self) -> StableHashingContext<'a>; } -impl<'a, 'b, T: StableHashingContextProvider<'a>> StableHashingContextProvider<'a> -for &'b T { +impl<'a, 'b, T: StableHashingContextProvider<'a>> StableHashingContextProvider<'a> for &'b T { fn get_stable_hashing_context(&self) -> StableHashingContext<'a> { (**self).get_stable_hashing_context() } } -impl<'a, 'b, T: StableHashingContextProvider<'a>> StableHashingContextProvider<'a> -for &'b mut T { +impl<'a, 'b, T: StableHashingContextProvider<'a>> StableHashingContextProvider<'a> for &'b mut T { fn get_stable_hashing_context(&self) -> StableHashingContext<'a> { (**self).get_stable_hashing_context() } @@ -214,41 +206,14 @@ impl<'a> StableHashingContextProvider<'a> for StableHashingContext<'a> { impl<'a> crate::dep_graph::DepGraphSafe for StableHashingContext<'a> {} -impl<'a> HashStable> for hir::BodyId { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - if hcx.hash_bodies() { - hcx.body_resolver.body(*self).hash_stable(hcx, hasher); - } - } -} - -impl<'a> HashStable> for hir::HirId { - #[inline] - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - match hcx.node_id_hashing_mode { - NodeIdHashingMode::Ignore => { - // Don't do anything. - } - NodeIdHashingMode::HashDefPath => { - let hir::HirId { - owner, - local_id, - } = *self; - - hcx.local_def_path_hash(owner).hash_stable(hcx, hasher); - local_id.hash_stable(hcx, hasher); - } - } - } -} - impl<'a> ToStableHashKey> for hir::HirId { type KeyType = (DefPathHash, hir::ItemLocalId); #[inline] - fn to_stable_hash_key(&self, - hcx: &StableHashingContext<'a>) - -> (DefPathHash, hir::ItemLocalId) { + fn to_stable_hash_key( + &self, + hcx: &StableHashingContext<'a>, + ) -> (DefPathHash, hir::ItemLocalId) { let def_path_hash = hcx.local_def_path_hash(self.owner); (def_path_hash, self.local_id) } @@ -271,21 +236,23 @@ impl<'a> ToStableHashKey> for ast::NodeId { type KeyType = (DefPathHash, hir::ItemLocalId); #[inline] - fn to_stable_hash_key(&self, - hcx: &StableHashingContext<'a>) - -> (DefPathHash, hir::ItemLocalId) { + fn to_stable_hash_key( + &self, + hcx: &StableHashingContext<'a>, + ) -> (DefPathHash, hir::ItemLocalId) { hcx.definitions.node_to_hir_id(*self).to_stable_hash_key(hcx) } } -impl<'a> syntax_pos::HashStableContext for StableHashingContext<'a> { +impl<'a> rustc_span::HashStableContext for StableHashingContext<'a> { fn hash_spans(&self) -> bool { self.hash_spans } - fn byte_pos_to_line_and_col(&mut self, byte: BytePos) - -> Option<(Lrc, usize, BytePos)> - { + fn byte_pos_to_line_and_col( + &mut self, + byte: BytePos, + ) -> Option<(Lrc, usize, BytePos)> { self.source_map().byte_pos_to_line_and_col(byte) } } @@ -297,10 +264,8 @@ pub fn hash_stable_trait_impls<'a>( non_blanket_impls: &FxHashMap>, ) { { - let mut blanket_impls: SmallVec<[_; 8]> = blanket_impls - .iter() - .map(|&def_id| hcx.def_path_hash(def_id)) - .collect(); + let mut blanket_impls: SmallVec<[_; 8]> = + blanket_impls.iter().map(|&def_id| hcx.def_path_hash(def_id)).collect(); if blanket_impls.len() > 1 { blanket_impls.sort_unstable(); @@ -311,17 +276,13 @@ pub fn hash_stable_trait_impls<'a>( { let mut keys: SmallVec<[_; 8]> = - non_blanket_impls.keys() - .map(|k| (k, k.map_def(|d| hcx.def_path_hash(d)))) - .collect(); + non_blanket_impls.keys().map(|k| (k, k.map_def(|d| hcx.def_path_hash(d)))).collect(); keys.sort_unstable_by(|&(_, ref k1), &(_, ref k2)| k1.cmp(k2)); keys.len().hash_stable(hcx, hasher); for (key, ref stable_key) in keys { stable_key.hash_stable(hcx, hasher); - let mut impls : SmallVec<[_; 8]> = non_blanket_impls[key] - .iter() - .map(|&impl_id| hcx.def_path_hash(impl_id)) - .collect(); + let mut impls: SmallVec<[_; 8]> = + non_blanket_impls[key].iter().map(|&impl_id| hcx.def_path_hash(impl_id)).collect(); if impls.len() > 1 { impls.sort_unstable(); diff --git a/src/librustc/ich/impls_hir.rs b/src/librustc/ich/impls_hir.rs index 066359bd4e..8961f7cd4b 100644 --- a/src/librustc/ich/impls_hir.rs +++ b/src/librustc/ich/impls_hir.rs @@ -1,20 +1,141 @@ //! This module contains `HashStable` implementations for various HIR data //! types in no particular order. -use crate::hir; use crate::hir::map::DefPathHash; -use crate::hir::def_id::{DefId, LocalDefId, CrateNum, CRATE_DEF_INDEX}; -use crate::ich::{StableHashingContext, NodeIdHashingMode, Fingerprint}; - -use rustc_data_structures::stable_hasher::{HashStable, ToStableHashKey, StableHasher}; +use crate::ich::{Fingerprint, NodeIdHashingMode, StableHashingContext}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey}; +use rustc_hir as hir; +use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX}; use smallvec::SmallVec; use std::mem; use syntax::attr; -impl<'a> HashStable> for DefId { +impl<'ctx> rustc_hir::HashStableContext for StableHashingContext<'ctx> { #[inline] - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - hcx.def_path_hash(*self).hash_stable(hcx, hasher); + fn hash_def_id(&mut self, def_id: DefId, hasher: &mut StableHasher) { + let hcx = self; + hcx.def_path_hash(def_id).hash_stable(hcx, hasher); + } + + #[inline] + fn hash_hir_id(&mut self, hir_id: hir::HirId, hasher: &mut StableHasher) { + let hcx = self; + match hcx.node_id_hashing_mode { + NodeIdHashingMode::Ignore => { + // Don't do anything. + } + NodeIdHashingMode::HashDefPath => { + let hir::HirId { owner, local_id } = hir_id; + + hcx.local_def_path_hash(owner).hash_stable(hcx, hasher); + local_id.hash_stable(hcx, hasher); + } + } + } + + fn hash_body_id(&mut self, id: hir::BodyId, hasher: &mut StableHasher) { + let hcx = self; + if hcx.hash_bodies() { + hcx.body_resolver.body(id).hash_stable(hcx, hasher); + } + } + + // The following implementations of HashStable for `ItemId`, `TraitItemId`, and + // `ImplItemId` deserve special attention. Normally we do not hash `NodeId`s within + // the HIR, since they just signify a HIR nodes own path. But `ItemId` et al + // are used when another item in the HIR is *referenced* and we certainly + // want to pick up on a reference changing its target, so we hash the NodeIds + // in "DefPath Mode". + + fn hash_item_id(&mut self, id: hir::ItemId, hasher: &mut StableHasher) { + let hcx = self; + let hir::ItemId { id } = id; + + hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { + id.hash_stable(hcx, hasher); + }) + } + + fn hash_impl_item_id(&mut self, id: hir::ImplItemId, hasher: &mut StableHasher) { + let hcx = self; + let hir::ImplItemId { hir_id } = id; + + hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { + hir_id.hash_stable(hcx, hasher); + }) + } + + fn hash_trait_item_id(&mut self, id: hir::TraitItemId, hasher: &mut StableHasher) { + let hcx = self; + let hir::TraitItemId { hir_id } = id; + + hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { + hir_id.hash_stable(hcx, hasher); + }) + } + + fn hash_hir_mod(&mut self, module: &hir::Mod<'_>, hasher: &mut StableHasher) { + let hcx = self; + let hir::Mod { inner: ref inner_span, ref item_ids } = *module; + + inner_span.hash_stable(hcx, hasher); + + // Combining the `DefPathHash`s directly is faster than feeding them + // into the hasher. Because we use a commutative combine, we also don't + // have to sort the array. + let item_ids_hash = item_ids + .iter() + .map(|id| { + let (def_path_hash, local_id) = id.id.to_stable_hash_key(hcx); + debug_assert_eq!(local_id, hir::ItemLocalId::from_u32(0)); + def_path_hash.0 + }) + .fold(Fingerprint::ZERO, |a, b| a.combine_commutative(b)); + + item_ids.len().hash_stable(hcx, hasher); + item_ids_hash.hash_stable(hcx, hasher); + } + + fn hash_hir_expr(&mut self, expr: &hir::Expr<'_>, hasher: &mut StableHasher) { + self.while_hashing_hir_bodies(true, |hcx| { + let hir::Expr { hir_id: _, ref span, ref kind, ref attrs } = *expr; + + span.hash_stable(hcx, hasher); + kind.hash_stable(hcx, hasher); + attrs.hash_stable(hcx, hasher); + }) + } + + fn hash_hir_ty(&mut self, ty: &hir::Ty<'_>, hasher: &mut StableHasher) { + self.while_hashing_hir_bodies(true, |hcx| { + let hir::Ty { hir_id: _, ref kind, ref span } = *ty; + + kind.hash_stable(hcx, hasher); + span.hash_stable(hcx, hasher); + }) + } + + fn hash_hir_visibility_kind( + &mut self, + vis: &hir::VisibilityKind<'_>, + hasher: &mut StableHasher, + ) { + let hcx = self; + mem::discriminant(vis).hash_stable(hcx, hasher); + match *vis { + hir::VisibilityKind::Public | hir::VisibilityKind::Inherited => { + // No fields to hash. + } + hir::VisibilityKind::Crate(sugar) => { + sugar.hash_stable(hcx, hasher); + } + hir::VisibilityKind::Restricted { ref path, hir_id } => { + hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { + hir_id.hash_stable(hcx, hasher); + }); + path.hash_stable(hcx, hasher); + } + } } } @@ -46,10 +167,7 @@ impl<'a> ToStableHashKey> for LocalDefId { impl<'a> HashStable> for CrateNum { #[inline] fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - hcx.def_path_hash(DefId { - krate: *self, - index: CRATE_DEF_INDEX - }).hash_stable(hcx, hasher); + hcx.def_path_hash(DefId { krate: *self, index: CRATE_DEF_INDEX }).hash_stable(hcx, hasher); } } @@ -63,103 +181,18 @@ impl<'a> ToStableHashKey> for CrateNum { } } -impl<'a> ToStableHashKey> -for hir::ItemLocalId { +impl<'a> ToStableHashKey> for hir::ItemLocalId { type KeyType = hir::ItemLocalId; #[inline] - fn to_stable_hash_key(&self, - _: &StableHashingContext<'a>) - -> hir::ItemLocalId { + fn to_stable_hash_key(&self, _: &StableHashingContext<'a>) -> hir::ItemLocalId { *self } } -// The following implementations of HashStable for `ItemId`, `TraitItemId`, and -// `ImplItemId` deserve special attention. Normally we do not hash `NodeId`s within -// the HIR, since they just signify a HIR nodes own path. But `ItemId` et al -// are used when another item in the HIR is *referenced* and we certainly -// want to pick up on a reference changing its target, so we hash the NodeIds -// in "DefPath Mode". - -impl<'a> HashStable> for hir::ItemId { +impl<'a> HashStable> for hir::TraitItem<'_> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let hir::ItemId { - id - } = *self; - - hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { - id.hash_stable(hcx, hasher); - }) - } -} - -impl<'a> HashStable> for hir::TraitItemId { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let hir::TraitItemId { - hir_id - } = * self; - - hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { - hir_id.hash_stable(hcx, hasher); - }) - } -} - -impl<'a> HashStable> for hir::ImplItemId { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let hir::ImplItemId { - hir_id - } = * self; - - hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { - hir_id.hash_stable(hcx, hasher); - }) - } -} - -impl<'a> HashStable> for hir::Ty { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - hcx.while_hashing_hir_bodies(true, |hcx| { - let hir::Ty { - hir_id: _, - ref kind, - ref span, - } = *self; - - kind.hash_stable(hcx, hasher); - span.hash_stable(hcx, hasher); - }) - } -} - -impl<'a> HashStable> for hir::Expr { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - hcx.while_hashing_hir_bodies(true, |hcx| { - let hir::Expr { - hir_id: _, - ref span, - ref kind, - ref attrs - } = *self; - - span.hash_stable(hcx, hasher); - kind.hash_stable(hcx, hasher); - attrs.hash_stable(hcx, hasher); - }) - } -} - -impl<'a> HashStable> for hir::TraitItem { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let hir::TraitItem { - hir_id: _, - ident, - ref attrs, - ref generics, - ref kind, - span - } = *self; + let hir::TraitItem { hir_id: _, ident, ref attrs, ref generics, ref kind, span } = *self; hcx.hash_hir_item_like(|hcx| { ident.name.hash_stable(hcx, hasher); @@ -171,8 +204,7 @@ impl<'a> HashStable> for hir::TraitItem { } } - -impl<'a> HashStable> for hir::ImplItem { +impl<'a> HashStable> for hir::ImplItem<'_> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { let hir::ImplItem { hir_id: _, @@ -182,7 +214,7 @@ impl<'a> HashStable> for hir::ImplItem { ref attrs, ref generics, ref kind, - span + span, } = *self; hcx.hash_hir_item_like(|hcx| { @@ -197,64 +229,9 @@ impl<'a> HashStable> for hir::ImplItem { } } -impl<'a> HashStable> for hir::VisibilityKind { +impl<'a> HashStable> for hir::Item<'_> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - mem::discriminant(self).hash_stable(hcx, hasher); - match *self { - hir::VisibilityKind::Public | - hir::VisibilityKind::Inherited => { - // No fields to hash. - } - hir::VisibilityKind::Crate(sugar) => { - sugar.hash_stable(hcx, hasher); - } - hir::VisibilityKind::Restricted { ref path, hir_id } => { - hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { - hir_id.hash_stable(hcx, hasher); - }); - path.hash_stable(hcx, hasher); - } - } - } -} - -impl<'a> HashStable> for hir::Mod { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let hir::Mod { - inner: ref inner_span, - ref item_ids, - } = *self; - - inner_span.hash_stable(hcx, hasher); - - // Combining the `DefPathHash`s directly is faster than feeding them - // into the hasher. Because we use a commutative combine, we also don't - // have to sort the array. - let item_ids_hash = item_ids - .iter() - .map(|id| { - let (def_path_hash, local_id) = id.id.to_stable_hash_key(hcx); - debug_assert_eq!(local_id, hir::ItemLocalId::from_u32(0)); - def_path_hash.0 - }).fold(Fingerprint::ZERO, |a, b| { - a.combine_commutative(b) - }); - - item_ids.len().hash_stable(hcx, hasher); - item_ids_hash.hash_stable(hcx, hasher); - } -} - -impl<'a> HashStable> for hir::Item { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let hir::Item { - ident, - ref attrs, - hir_id: _, - ref kind, - ref vis, - span - } = *self; + let hir::Item { ident, ref attrs, hir_id: _, ref kind, ref vis, span } = *self; hcx.hash_hir_item_like(|hcx| { ident.name.hash_stable(hcx, hasher); @@ -266,13 +243,9 @@ impl<'a> HashStable> for hir::Item { } } -impl<'a> HashStable> for hir::Body { +impl<'a> HashStable> for hir::Body<'_> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let hir::Body { - params, - value, - generator_kind, - } = self; + let hir::Body { params, value, generator_kind } = self; hcx.with_node_id_hashing_mode(NodeIdHashingMode::Ignore, |hcx| { params.hash_stable(hcx, hasher); @@ -286,16 +259,16 @@ impl<'a> ToStableHashKey> for hir::BodyId { type KeyType = (DefPathHash, hir::ItemLocalId); #[inline] - fn to_stable_hash_key(&self, - hcx: &StableHashingContext<'a>) - -> (DefPathHash, hir::ItemLocalId) { + fn to_stable_hash_key( + &self, + hcx: &StableHashingContext<'a>, + ) -> (DefPathHash, hir::ItemLocalId) { let hir::BodyId { hir_id } = *self; hir_id.to_stable_hash_key(hcx) } } impl<'a> HashStable> for hir::def_id::DefIndex { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { hcx.local_def_path_hash(*self).hash_stable(hcx, hasher); } @@ -306,7 +279,7 @@ impl<'a> ToStableHashKey> for hir::def_id::DefIndex { #[inline] fn to_stable_hash_key(&self, hcx: &StableHashingContext<'a>) -> DefPathHash { - hcx.local_def_path_hash(*self) + hcx.local_def_path_hash(*self) } } @@ -319,10 +292,7 @@ impl<'a> HashStable> for crate::middle::lang_items::Lan impl<'a> HashStable> for hir::TraitCandidate { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { - let hir::TraitCandidate { - def_id, - import_ids, - } = self; + let hir::TraitCandidate { def_id, import_ids } = self; def_id.hash_stable(hcx, hasher); import_ids.hash_stable(hcx, hasher); @@ -333,17 +303,14 @@ impl<'a> HashStable> for hir::TraitCandidate { impl<'a> ToStableHashKey> for hir::TraitCandidate { type KeyType = (DefPathHash, SmallVec<[(DefPathHash, hir::ItemLocalId); 1]>); - fn to_stable_hash_key(&self, - hcx: &StableHashingContext<'a>) - -> Self::KeyType { - let hir::TraitCandidate { - def_id, - import_ids, - } = self; - - let import_keys = import_ids.iter().map(|node_id| hcx.node_to_hir_id(*node_id)) - .map(|hir_id| (hcx.local_def_path_hash(hir_id.owner), - hir_id.local_id)).collect(); + fn to_stable_hash_key(&self, hcx: &StableHashingContext<'a>) -> Self::KeyType { + let hir::TraitCandidate { def_id, import_ids } = self; + + let import_keys = import_ids + .iter() + .map(|node_id| hcx.node_to_hir_id(*node_id)) + .map(|hir_id| (hcx.local_def_path_hash(hir_id.owner), hir_id.local_id)) + .collect(); (hcx.def_path_hash(*def_id), import_keys) } } diff --git a/src/librustc/ich/impls_syntax.rs b/src/librustc/ich/impls_syntax.rs index 6499e56325..e1733794b8 100644 --- a/src/librustc/ich/impls_syntax.rs +++ b/src/librustc/ich/impls_syntax.rs @@ -3,13 +3,12 @@ use crate::ich::StableHashingContext; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX}; +use rustc_span::SourceFile; use syntax::ast; -use syntax_pos::SourceFile; - -use crate::hir::def_id::{DefId, CrateNum, CRATE_DEF_INDEX}; use smallvec::SmallVec; -use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; impl<'ctx> rustc_target::HashStableContext for StableHashingContext<'ctx> {} @@ -24,15 +23,15 @@ impl<'a> HashStable> for [ast::Attribute] { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { if self.len() == 0 { self.len().hash_stable(hcx, hasher); - return + return; } // Some attributes are always ignored during hashing. let filtered: SmallVec<[&ast::Attribute; 8]> = self .iter() .filter(|attr| { - !attr.is_doc_comment() && - !attr.ident().map_or(false, |ident| hcx.is_ignored_attr(ident.name)) + !attr.is_doc_comment() + && !attr.ident().map_or(false, |ident| hcx.is_ignored_attr(ident.name)) }) .collect(); @@ -43,25 +42,23 @@ impl<'a> HashStable> for [ast::Attribute] { } } -impl<'a> HashStable> for ast::Attribute { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { +impl<'ctx> syntax::HashStableContext for StableHashingContext<'ctx> { + fn hash_attr(&mut self, attr: &ast::Attribute, hasher: &mut StableHasher) { // Make sure that these have been filtered out. - debug_assert!(!self.ident().map_or(false, |ident| hcx.is_ignored_attr(ident.name))); - debug_assert!(!self.is_doc_comment()); + debug_assert!(!attr.ident().map_or(false, |ident| self.is_ignored_attr(ident.name))); + debug_assert!(!attr.is_doc_comment()); - let ast::Attribute { kind, id: _, style, span } = self; + let ast::Attribute { kind, id: _, style, span } = attr; if let ast::AttrKind::Normal(item) = kind { - item.hash_stable(hcx, hasher); - style.hash_stable(hcx, hasher); - span.hash_stable(hcx, hasher); + item.hash_stable(self, hasher); + style.hash_stable(self, hasher); + span.hash_stable(self, hasher); } else { unreachable!(); } } } -impl<'ctx> syntax::HashStableContext for StableHashingContext<'ctx> {} - impl<'a> HashStable> for SourceFile { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { let SourceFile { @@ -85,10 +82,8 @@ impl<'a> HashStable> for SourceFile { (name_hash as u64).hash_stable(hcx, hasher); name_was_remapped.hash_stable(hcx, hasher); - DefId { - krate: CrateNum::from_u32(crate_of_origin), - index: CRATE_DEF_INDEX, - }.hash_stable(hcx, hasher); + DefId { krate: CrateNum::from_u32(crate_of_origin), index: CRATE_DEF_INDEX } + .hash_stable(hcx, hasher); src_hash.hash_stable(hcx, hasher); @@ -113,48 +108,41 @@ impl<'a> HashStable> for SourceFile { for &char_pos in normalized_pos.iter() { stable_normalized_pos(char_pos, start_pos).hash_stable(hcx, hasher); } - } } -fn stable_byte_pos(pos: ::syntax_pos::BytePos, - source_file_start: ::syntax_pos::BytePos) - -> u32 { +fn stable_byte_pos(pos: ::rustc_span::BytePos, source_file_start: ::rustc_span::BytePos) -> u32 { pos.0 - source_file_start.0 } -fn stable_multibyte_char(mbc: ::syntax_pos::MultiByteChar, - source_file_start: ::syntax_pos::BytePos) - -> (u32, u32) { - let ::syntax_pos::MultiByteChar { - pos, - bytes, - } = mbc; +fn stable_multibyte_char( + mbc: ::rustc_span::MultiByteChar, + source_file_start: ::rustc_span::BytePos, +) -> (u32, u32) { + let ::rustc_span::MultiByteChar { pos, bytes } = mbc; (pos.0 - source_file_start.0, bytes as u32) } -fn stable_non_narrow_char(swc: ::syntax_pos::NonNarrowChar, - source_file_start: ::syntax_pos::BytePos) - -> (u32, u32) { +fn stable_non_narrow_char( + swc: ::rustc_span::NonNarrowChar, + source_file_start: ::rustc_span::BytePos, +) -> (u32, u32) { let pos = swc.pos(); let width = swc.width(); (pos.0 - source_file_start.0, width as u32) } -fn stable_normalized_pos(np: ::syntax_pos::NormalizedPos, - source_file_start: ::syntax_pos::BytePos) - -> (u32, u32) { - let ::syntax_pos::NormalizedPos { - pos, - diff - } = np; +fn stable_normalized_pos( + np: ::rustc_span::NormalizedPos, + source_file_start: ::rustc_span::BytePos, +) -> (u32, u32) { + let ::rustc_span::NormalizedPos { pos, diff } = np; (pos.0 - source_file_start.0, diff) } - impl<'tcx> HashStable> for rustc_feature::Features { fn hash_stable(&self, hcx: &mut StableHashingContext<'tcx>, hasher: &mut StableHasher) { // Unfortunately we cannot exhaustively list fields here, since the diff --git a/src/librustc/ich/impls_ty.rs b/src/librustc/ich/impls_ty.rs index 7f50d859cd..6af0cee948 100644 --- a/src/librustc/ich/impls_ty.rs +++ b/src/librustc/ich/impls_ty.rs @@ -1,14 +1,14 @@ //! This module contains `HashStable` implementations for various data types //! from rustc::ty in no particular order. -use crate::ich::{Fingerprint, StableHashingContext, NodeIdHashingMode}; +use crate::ich::{Fingerprint, NodeIdHashingMode, StableHashingContext}; +use crate::middle::region; +use crate::mir; +use crate::ty; use rustc_data_structures::fx::FxHashMap; -use rustc_data_structures::stable_hasher::{HashStable, ToStableHashKey, StableHasher}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey}; use std::cell::RefCell; use std::mem; -use crate::middle::region; -use crate::ty; -use crate::mir; impl<'a, 'tcx, T> HashStable> for &'tcx ty::List where @@ -59,14 +59,11 @@ impl<'a, 'tcx> HashStable> for ty::subst::GenericArg<'t } } -impl<'a> HashStable> -for ty::RegionKind { +impl<'a> HashStable> for ty::RegionKind { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { mem::discriminant(self).hash_stable(hcx, hasher); match *self { - ty::ReErased | - ty::ReStatic | - ty::ReEmpty => { + ty::ReErased | ty::ReStatic | ty::ReEmpty => { // No variant fields to hash for these ... } ty::ReLateBound(db, ty::BrAnon(i)) => { @@ -95,8 +92,7 @@ for ty::RegionKind { ty::ReClosureBound(vid) => { vid.hash_stable(hcx, hasher); } - ty::ReVar(..) | - ty::RePlaceholder(..) => { + ty::ReVar(..) | ty::RePlaceholder(..) => { bug!("StableHasher: unexpected region {:?}", *self) } } @@ -146,8 +142,7 @@ impl<'a> HashStable> for mir::interpret::AllocId { } // `Relocations` with default type parameters is a sorted map. -impl<'a, Tag> HashStable> -for mir::interpret::Relocations +impl<'a, Tag> HashStable> for mir::interpret::Relocations where Tag: HashStable>, { @@ -201,13 +196,10 @@ where } } -impl<'a> HashStable> -for crate::middle::privacy::AccessLevels { +impl<'a> HashStable> for crate::middle::privacy::AccessLevels { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { - let crate::middle::privacy::AccessLevels { - ref map - } = *self; + let crate::middle::privacy::AccessLevels { ref map } = *self; map.hash_stable(hcx, hasher); }); diff --git a/src/librustc/ich/mod.rs b/src/librustc/ich/mod.rs index ece438266c..2c4618dcd4 100644 --- a/src/librustc/ich/mod.rs +++ b/src/librustc/ich/mod.rs @@ -1,32 +1,25 @@ //! ICH - Incremental Compilation Hash +pub use self::hcx::{ + hash_stable_trait_impls, NodeIdHashingMode, StableHashingContext, StableHashingContextProvider, +}; crate use rustc_data_structures::fingerprint::Fingerprint; -pub use syntax_pos::CachingSourceMapView; -pub use self::hcx::{StableHashingContextProvider, StableHashingContext, NodeIdHashingMode, - hash_stable_trait_impls}; -use syntax::symbol::{Symbol, sym}; +use rustc_span::symbol::{sym, Symbol}; +pub use rustc_span::CachingSourceMapView; mod hcx; mod impls_hir; -mod impls_ty; mod impls_syntax; - -pub const ATTR_DIRTY: Symbol = sym::rustc_dirty; -pub const ATTR_CLEAN: Symbol = sym::rustc_clean; -pub const ATTR_IF_THIS_CHANGED: Symbol = sym::rustc_if_this_changed; -pub const ATTR_THEN_THIS_WOULD_NEED: Symbol = sym::rustc_then_this_would_need; -pub const ATTR_PARTITION_REUSED: Symbol = sym::rustc_partition_reused; -pub const ATTR_PARTITION_CODEGENED: Symbol = sym::rustc_partition_codegened; -pub const ATTR_EXPECTED_CGU_REUSE: Symbol = sym::rustc_expected_cgu_reuse; +mod impls_ty; pub const IGNORED_ATTRIBUTES: &[Symbol] = &[ sym::cfg, - ATTR_IF_THIS_CHANGED, - ATTR_THEN_THIS_WOULD_NEED, - ATTR_DIRTY, - ATTR_CLEAN, - ATTR_PARTITION_REUSED, - ATTR_PARTITION_CODEGENED, - ATTR_EXPECTED_CGU_REUSE, + sym::rustc_if_this_changed, + sym::rustc_then_this_would_need, + sym::rustc_dirty, + sym::rustc_clean, + sym::rustc_partition_reused, + sym::rustc_partition_codegened, + sym::rustc_expected_cgu_reuse, ]; diff --git a/src/librustc/infer/at.rs b/src/librustc/infer/at.rs index e4aec59c1f..c58f1bd87b 100644 --- a/src/librustc/infer/at.rs +++ b/src/librustc/infer/at.rs @@ -27,8 +27,8 @@ use super::*; -use crate::ty::Const; use crate::ty::relate::{Relate, TypeRelation}; +use crate::ty::Const; pub struct At<'a, 'tcx> { pub infcx: &'a InferCtxt<'a, 'tcx>, @@ -54,38 +54,33 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } pub trait ToTrace<'tcx>: Relate<'tcx> + Copy { - fn to_trace(cause: &ObligationCause<'tcx>, - a_is_expected: bool, - a: Self, - b: Self) - -> TypeTrace<'tcx>; + fn to_trace( + cause: &ObligationCause<'tcx>, + a_is_expected: bool, + a: Self, + b: Self, + ) -> TypeTrace<'tcx>; } impl<'a, 'tcx> At<'a, 'tcx> { /// Hacky routine for equating two impl headers in coherence. - pub fn eq_impl_headers(self, - expected: &ty::ImplHeader<'tcx>, - actual: &ty::ImplHeader<'tcx>) - -> InferResult<'tcx, ()> - { + pub fn eq_impl_headers( + self, + expected: &ty::ImplHeader<'tcx>, + actual: &ty::ImplHeader<'tcx>, + ) -> InferResult<'tcx, ()> { debug!("eq_impl_header({:?} = {:?})", expected, actual); match (expected.trait_ref, actual.trait_ref) { - (Some(a_ref), Some(b_ref)) => - self.eq(a_ref, b_ref), - (None, None) => - self.eq(expected.self_ty, actual.self_ty), - _ => - bug!("mk_eq_impl_headers given mismatched impl kinds"), + (Some(a_ref), Some(b_ref)) => self.eq(a_ref, b_ref), + (None, None) => self.eq(expected.self_ty, actual.self_ty), + _ => bug!("mk_eq_impl_headers given mismatched impl kinds"), } } /// Makes `a <: b`, where `a` may or may not be expected. - pub fn sub_exp(self, - a_is_expected: bool, - a: T, - b: T) - -> InferResult<'tcx, ()> - where T: ToTrace<'tcx> + pub fn sub_exp(self, a_is_expected: bool, a: T, b: T) -> InferResult<'tcx, ()> + where + T: ToTrace<'tcx>, { self.trace_exp(a_is_expected, a, b).sub(&a, &b) } @@ -94,53 +89,40 @@ impl<'a, 'tcx> At<'a, 'tcx> { /// call like `foo(x)`, where `foo: fn(i32)`, you might have /// `sup(i32, x)`, since the "expected" type is the type that /// appears in the signature. - pub fn sup(self, - expected: T, - actual: T) - -> InferResult<'tcx, ()> - where T: ToTrace<'tcx> + pub fn sup(self, expected: T, actual: T) -> InferResult<'tcx, ()> + where + T: ToTrace<'tcx>, { self.sub_exp(false, actual, expected) } /// Makes `expected <: actual`. - pub fn sub(self, - expected: T, - actual: T) - -> InferResult<'tcx, ()> - where T: ToTrace<'tcx> + pub fn sub(self, expected: T, actual: T) -> InferResult<'tcx, ()> + where + T: ToTrace<'tcx>, { self.sub_exp(true, expected, actual) } /// Makes `expected <: actual`. - pub fn eq_exp(self, - a_is_expected: bool, - a: T, - b: T) - -> InferResult<'tcx, ()> - where T: ToTrace<'tcx> + pub fn eq_exp(self, a_is_expected: bool, a: T, b: T) -> InferResult<'tcx, ()> + where + T: ToTrace<'tcx>, { self.trace_exp(a_is_expected, a, b).eq(&a, &b) } /// Makes `expected <: actual`. - pub fn eq(self, - expected: T, - actual: T) - -> InferResult<'tcx, ()> - where T: ToTrace<'tcx> + pub fn eq(self, expected: T, actual: T) -> InferResult<'tcx, ()> + where + T: ToTrace<'tcx>, { self.trace(expected, actual).eq(&expected, &actual) } - pub fn relate( - self, - expected: T, - variance: ty::Variance, - actual: T, - ) -> InferResult<'tcx, ()> - where T: ToTrace<'tcx> + pub fn relate(self, expected: T, variance: ty::Variance, actual: T) -> InferResult<'tcx, ()> + where + T: ToTrace<'tcx>, { match variance { ty::Variance::Covariant => self.sub(expected, actual), @@ -161,11 +143,9 @@ impl<'a, 'tcx> At<'a, 'tcx> { /// this can result in an error (e.g., if asked to compute LUB of /// u32 and i32), it is meaningful to call one of them the /// "expected type". - pub fn lub(self, - expected: T, - actual: T) - -> InferResult<'tcx, T> - where T: ToTrace<'tcx> + pub fn lub(self, expected: T, actual: T) -> InferResult<'tcx, T> + where + T: ToTrace<'tcx>, { self.trace(expected, actual).lub(&expected, &actual) } @@ -173,11 +153,9 @@ impl<'a, 'tcx> At<'a, 'tcx> { /// Computes the greatest-lower-bound, or mutual subtype, of two /// values. As with `lub` order doesn't matter, except for error /// cases. - pub fn glb(self, - expected: T, - actual: T) - -> InferResult<'tcx, T> - where T: ToTrace<'tcx> + pub fn glb(self, expected: T, actual: T) -> InferResult<'tcx, T> + where + T: ToTrace<'tcx>, { self.trace(expected, actual).glb(&expected, &actual) } @@ -209,139 +187,126 @@ impl<'a, 'tcx> Trace<'a, 'tcx> { /// Makes `a <: b` where `a` may or may not be expected (if /// `a_is_expected` is true, then `a` is expected). /// Makes `expected <: actual`. - pub fn sub(self, - a: &T, - b: &T) - -> InferResult<'tcx, ()> - where T: Relate<'tcx> + pub fn sub(self, a: &T, b: &T) -> InferResult<'tcx, ()> + where + T: Relate<'tcx>, { debug!("sub({:?} <: {:?})", a, b); let Trace { at, trace, a_is_expected } = self; at.infcx.commit_if_ok(|_| { let mut fields = at.infcx.combine_fields(trace, at.param_env); - fields.sub(a_is_expected) - .relate(a, b) - .map(move |_| InferOk { value: (), obligations: fields.obligations }) + fields + .sub(a_is_expected) + .relate(a, b) + .map(move |_| InferOk { value: (), obligations: fields.obligations }) }) } /// Makes `a == b`; the expectation is set by the call to /// `trace()`. - pub fn eq(self, - a: &T, - b: &T) - -> InferResult<'tcx, ()> - where T: Relate<'tcx> + pub fn eq(self, a: &T, b: &T) -> InferResult<'tcx, ()> + where + T: Relate<'tcx>, { debug!("eq({:?} == {:?})", a, b); let Trace { at, trace, a_is_expected } = self; at.infcx.commit_if_ok(|_| { let mut fields = at.infcx.combine_fields(trace, at.param_env); - fields.equate(a_is_expected) - .relate(a, b) - .map(move |_| InferOk { value: (), obligations: fields.obligations }) + fields + .equate(a_is_expected) + .relate(a, b) + .map(move |_| InferOk { value: (), obligations: fields.obligations }) }) } - pub fn lub(self, - a: &T, - b: &T) - -> InferResult<'tcx, T> - where T: Relate<'tcx> + pub fn lub(self, a: &T, b: &T) -> InferResult<'tcx, T> + where + T: Relate<'tcx>, { debug!("lub({:?} \\/ {:?})", a, b); let Trace { at, trace, a_is_expected } = self; at.infcx.commit_if_ok(|_| { let mut fields = at.infcx.combine_fields(trace, at.param_env); - fields.lub(a_is_expected) - .relate(a, b) - .map(move |t| InferOk { value: t, obligations: fields.obligations }) + fields + .lub(a_is_expected) + .relate(a, b) + .map(move |t| InferOk { value: t, obligations: fields.obligations }) }) } - pub fn glb(self, - a: &T, - b: &T) - -> InferResult<'tcx, T> - where T: Relate<'tcx> + pub fn glb(self, a: &T, b: &T) -> InferResult<'tcx, T> + where + T: Relate<'tcx>, { debug!("glb({:?} /\\ {:?})", a, b); let Trace { at, trace, a_is_expected } = self; at.infcx.commit_if_ok(|_| { let mut fields = at.infcx.combine_fields(trace, at.param_env); - fields.glb(a_is_expected) - .relate(a, b) - .map(move |t| InferOk { value: t, obligations: fields.obligations }) + fields + .glb(a_is_expected) + .relate(a, b) + .map(move |t| InferOk { value: t, obligations: fields.obligations }) }) } } impl<'tcx> ToTrace<'tcx> for Ty<'tcx> { - fn to_trace(cause: &ObligationCause<'tcx>, - a_is_expected: bool, - a: Self, - b: Self) - -> TypeTrace<'tcx> - { - TypeTrace { - cause: cause.clone(), - values: Types(ExpectedFound::new(a_is_expected, a, b)) - } + fn to_trace( + cause: &ObligationCause<'tcx>, + a_is_expected: bool, + a: Self, + b: Self, + ) -> TypeTrace<'tcx> { + TypeTrace { cause: cause.clone(), values: Types(ExpectedFound::new(a_is_expected, a, b)) } } } impl<'tcx> ToTrace<'tcx> for ty::Region<'tcx> { - fn to_trace(cause: &ObligationCause<'tcx>, - a_is_expected: bool, - a: Self, - b: Self) - -> TypeTrace<'tcx> - { - TypeTrace { - cause: cause.clone(), - values: Regions(ExpectedFound::new(a_is_expected, a, b)) - } + fn to_trace( + cause: &ObligationCause<'tcx>, + a_is_expected: bool, + a: Self, + b: Self, + ) -> TypeTrace<'tcx> { + TypeTrace { cause: cause.clone(), values: Regions(ExpectedFound::new(a_is_expected, a, b)) } } } impl<'tcx> ToTrace<'tcx> for &'tcx Const<'tcx> { - fn to_trace(cause: &ObligationCause<'tcx>, - a_is_expected: bool, - a: Self, - b: Self) - -> TypeTrace<'tcx> - { - TypeTrace { - cause: cause.clone(), - values: Consts(ExpectedFound::new(a_is_expected, a, b)) - } + fn to_trace( + cause: &ObligationCause<'tcx>, + a_is_expected: bool, + a: Self, + b: Self, + ) -> TypeTrace<'tcx> { + TypeTrace { cause: cause.clone(), values: Consts(ExpectedFound::new(a_is_expected, a, b)) } } } impl<'tcx> ToTrace<'tcx> for ty::TraitRef<'tcx> { - fn to_trace(cause: &ObligationCause<'tcx>, - a_is_expected: bool, - a: Self, - b: Self) - -> TypeTrace<'tcx> - { + fn to_trace( + cause: &ObligationCause<'tcx>, + a_is_expected: bool, + a: Self, + b: Self, + ) -> TypeTrace<'tcx> { TypeTrace { cause: cause.clone(), - values: TraitRefs(ExpectedFound::new(a_is_expected, a, b)) + values: TraitRefs(ExpectedFound::new(a_is_expected, a, b)), } } } impl<'tcx> ToTrace<'tcx> for ty::PolyTraitRef<'tcx> { - fn to_trace(cause: &ObligationCause<'tcx>, - a_is_expected: bool, - a: Self, - b: Self) - -> TypeTrace<'tcx> - { + fn to_trace( + cause: &ObligationCause<'tcx>, + a_is_expected: bool, + a: Self, + b: Self, + ) -> TypeTrace<'tcx> { TypeTrace { cause: cause.clone(), - values: PolyTraitRefs(ExpectedFound::new(a_is_expected, a, b)) + values: PolyTraitRefs(ExpectedFound::new(a_is_expected, a, b)), } } } diff --git a/src/librustc/infer/canonical/canonicalizer.rs b/src/librustc/infer/canonical/canonicalizer.rs index 1fa814dc14..b720168f35 100644 --- a/src/librustc/infer/canonical/canonicalizer.rs +++ b/src/librustc/infer/canonical/canonicalizer.rs @@ -10,11 +10,11 @@ use crate::infer::canonical::{ OriginalQueryValues, }; use crate::infer::InferCtxt; -use std::sync::atomic::Ordering; +use crate::ty::flags::FlagComputation; use crate::ty::fold::{TypeFoldable, TypeFolder}; use crate::ty::subst::GenericArg; use crate::ty::{self, BoundVar, InferConst, List, Ty, TyCtxt, TypeFlags}; -use crate::ty::flags::FlagComputation; +use std::sync::atomic::Ordering; use rustc_data_structures::fx::FxHashMap; use rustc_index::vec::Idx; @@ -44,11 +44,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { where V: TypeFoldable<'tcx>, { - self.tcx - .sess - .perf_stats - .queries_canonicalized - .fetch_add(1, Ordering::Relaxed); + self.tcx.sess.perf_stats.queries_canonicalized.fetch_add(1, Ordering::Relaxed); Canonicalizer::canonicalize( value, @@ -133,11 +129,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { where V: TypeFoldable<'tcx>, { - self.tcx - .sess - .perf_stats - .queries_canonicalized - .fetch_add(1, Ordering::Relaxed); + self.tcx.sess.perf_stats.queries_canonicalized.fetch_add(1, Ordering::Relaxed); Canonicalizer::canonicalize( value, @@ -177,17 +169,13 @@ impl CanonicalizeRegionMode for CanonicalizeQueryResponse { match r { ty::ReFree(_) | ty::ReEmpty | ty::ReErased | ty::ReStatic | ty::ReEarlyBound(..) => r, ty::RePlaceholder(placeholder) => canonicalizer.canonical_var_for_region( - CanonicalVarInfo { - kind: CanonicalVarKind::PlaceholderRegion(*placeholder), - }, + CanonicalVarInfo { kind: CanonicalVarKind::PlaceholderRegion(*placeholder) }, r, ), ty::ReVar(vid) => { let universe = canonicalizer.region_var_universe(*vid); canonicalizer.canonical_var_for_region( - CanonicalVarInfo { - kind: CanonicalVarKind::Region(universe), - }, + CanonicalVarInfo { kind: CanonicalVarKind::Region(universe) }, r, ) } @@ -202,8 +190,9 @@ impl CanonicalizeRegionMode for CanonicalizeQueryResponse { // `delay_span_bug` to allow type error over an ICE. ty::tls::with_context(|c| { c.tcx.sess.delay_span_bug( - syntax_pos::DUMMY_SP, - &format!("unexpected region in query response: `{:?}`", r)); + rustc_span::DUMMY_SP, + &format!("unexpected region in query response: `{:?}`", r), + ); }); r } @@ -294,7 +283,8 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> { } fn fold_binder(&mut self, t: &ty::Binder) -> ty::Binder - where T: TypeFoldable<'tcx> + where + T: TypeFoldable<'tcx>, { self.binder_index.shift_in(1); let t = t.super_fold_with(self); @@ -313,7 +303,8 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> { } ty::ReVar(vid) => { - let r = self.infcx + let r = self + .infcx .unwrap() .borrow_region_constraints() .opportunistic_resolve_var(self.tcx, vid); @@ -322,8 +313,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> { opportunistically resolved to {:?}", vid, r ); - self.canonicalize_region_mode - .canonicalize_free_region(self, r) + self.canonicalize_region_mode.canonicalize_free_region(self, r) } ty::ReStatic @@ -332,8 +322,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> { | ty::ReScope(_) | ty::RePlaceholder(..) | ty::ReEmpty - | ty::ReErased => self.canonicalize_region_mode - .canonicalize_free_region(self, r), + | ty::ReErased => self.canonicalize_region_mode.canonicalize_free_region(self, r), ty::ReClosureBound(..) => { bug!("closure bound region encountered during canonicalization"); @@ -361,26 +350,22 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> { } self.canonicalize_ty_var( CanonicalVarInfo { - kind: CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)) + kind: CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)), }, - t + t, ) } } } ty::Infer(ty::IntVar(_)) => self.canonicalize_ty_var( - CanonicalVarInfo { - kind: CanonicalVarKind::Ty(CanonicalTyVarKind::Int) - }, - t + CanonicalVarInfo { kind: CanonicalVarKind::Ty(CanonicalTyVarKind::Int) }, + t, ), ty::Infer(ty::FloatVar(_)) => self.canonicalize_ty_var( - CanonicalVarInfo { - kind: CanonicalVarKind::Ty(CanonicalTyVarKind::Float) - }, - t + CanonicalVarInfo { kind: CanonicalVarKind::Ty(CanonicalTyVarKind::Float) }, + t, ), ty::Infer(ty::FreshTy(_)) @@ -390,10 +375,8 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> { } ty::Placeholder(placeholder) => self.canonicalize_ty_var( - CanonicalVarInfo { - kind: CanonicalVarKind::PlaceholderTy(placeholder) - }, - t + CanonicalVarInfo { kind: CanonicalVarKind::PlaceholderTy(placeholder) }, + t, ), ty::Bound(debruijn, _) => { @@ -456,9 +439,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> { ui = ty::UniverseIndex::ROOT; } return self.canonicalize_const_var( - CanonicalVarInfo { - kind: CanonicalVarKind::Const(ui), - }, + CanonicalVarInfo { kind: CanonicalVarKind::Const(ui) }, ct, ); } @@ -476,9 +457,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> { } ty::ConstKind::Placeholder(placeholder) => { return self.canonicalize_const_var( - CanonicalVarInfo { - kind: CanonicalVarKind::PlaceholderConst(placeholder), - }, + CanonicalVarInfo { kind: CanonicalVarKind::PlaceholderConst(placeholder) }, ct, ); } @@ -486,11 +465,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> { } let flags = FlagComputation::for_const(ct); - if flags.intersects(self.needs_canonical_flags) { - ct.super_fold_with(self) - } else { - ct - } + if flags.intersects(self.needs_canonical_flags) { ct.super_fold_with(self) } else { ct } } } @@ -513,10 +488,10 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> { TypeFlags::HAS_TY_PLACEHOLDER | TypeFlags::HAS_CT_PLACEHOLDER } else { - TypeFlags::KEEP_IN_LOCAL_TCX | - TypeFlags::HAS_RE_PLACEHOLDER | - TypeFlags::HAS_TY_PLACEHOLDER | - TypeFlags::HAS_CT_PLACEHOLDER + TypeFlags::KEEP_IN_LOCAL_TCX + | TypeFlags::HAS_RE_PLACEHOLDER + | TypeFlags::HAS_TY_PLACEHOLDER + | TypeFlags::HAS_CT_PLACEHOLDER }; // Fast path: nothing that needs to be canonicalized. @@ -554,11 +529,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> { .max() .unwrap_or(ty::UniverseIndex::ROOT); - Canonical { - max_universe, - variables: canonical_variables, - value: out_value, - } + Canonical { max_universe, variables: canonical_variables, value: out_value } } /// Creates a canonical variable replacing `kind` from the input, @@ -566,12 +537,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> { /// seen. `kind` is expected to be an unbound variable (or /// potentially a free region). fn canonical_var(&mut self, info: CanonicalVarInfo, kind: GenericArg<'tcx>) -> BoundVar { - let Canonicalizer { - variables, - query_state, - indices, - .. - } = self; + let Canonicalizer { variables, query_state, indices, .. } = self; let var_values = &mut query_state.var_values; @@ -637,19 +603,14 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> { r: ty::Region<'tcx>, ) -> ty::Region<'tcx> { self.canonical_var_for_region( - CanonicalVarInfo { - kind: CanonicalVarKind::Region(ty::UniverseIndex::ROOT), - }, + CanonicalVarInfo { kind: CanonicalVarKind::Region(ty::UniverseIndex::ROOT) }, r, ) } /// Returns the universe in which `vid` is defined. fn region_var_universe(&self, vid: ty::RegionVid) -> ty::UniverseIndex { - self.infcx - .unwrap() - .borrow_region_constraints() - .var_universe(vid) + self.infcx.unwrap().borrow_region_constraints().var_universe(vid) } /// Creates a canonical variable (with the given `info`) @@ -660,10 +621,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> { r: ty::Region<'tcx>, ) -> ty::Region<'tcx> { let var = self.canonical_var(info, r.into()); - let region = ty::ReLateBound( - self.binder_index, - ty::BoundRegion::BrAnon(var.as_u32()) - ); + let region = ty::ReLateBound(self.binder_index, ty::BoundRegion::BrAnon(var.as_u32())); self.tcx().mk_region(region) } @@ -689,7 +647,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> { fn canonicalize_const_var( &mut self, info: CanonicalVarInfo, - const_var: &'tcx ty::Const<'tcx> + const_var: &'tcx ty::Const<'tcx>, ) -> &'tcx ty::Const<'tcx> { let infcx = self.infcx.expect("encountered const-var without infcx"); let bound_to = infcx.shallow_resolve(const_var); @@ -697,12 +655,10 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> { self.fold_const(bound_to) } else { let var = self.canonical_var(info, const_var.into()); - self.tcx().mk_const( - ty::Const { - val: ty::ConstKind::Bound(self.binder_index, var.into()), - ty: self.fold_ty(const_var.ty), - } - ) + self.tcx().mk_const(ty::Const { + val: ty::ConstKind::Bound(self.binder_index, var.into()), + ty: self.fold_ty(const_var.ty), + }) } } } diff --git a/src/librustc/infer/canonical/mod.rs b/src/librustc/infer/canonical/mod.rs index b0f65ac6e1..a588d3d028 100644 --- a/src/librustc/infer/canonical/mod.rs +++ b/src/librustc/infer/canonical/mod.rs @@ -21,18 +21,18 @@ //! //! [c]: https://rust-lang.github.io/rustc-guide/traits/canonicalization.html -use crate::infer::{InferCtxt, RegionVariableOrigin, TypeVariableOrigin, TypeVariableOriginKind}; -use crate::infer::{ConstVariableOrigin, ConstVariableOriginKind}; use crate::infer::region_constraints::MemberConstraint; +use crate::infer::{ConstVariableOrigin, ConstVariableOriginKind}; +use crate::infer::{InferCtxt, RegionVariableOrigin, TypeVariableOrigin, TypeVariableOriginKind}; +use crate::ty::fold::TypeFoldable; +use crate::ty::subst::GenericArg; +use crate::ty::{self, BoundVar, List, Region, TyCtxt}; use rustc_index::vec::IndexVec; use rustc_macros::HashStable; use rustc_serialize::UseSpecializedDecodable; +use rustc_span::source_map::Span; use smallvec::SmallVec; use std::ops::Index; -use syntax::source_map::Span; -use crate::ty::fold::TypeFoldable; -use crate::ty::subst::GenericArg; -use crate::ty::{self, BoundVar, List, Region, TyCtxt}; mod canonicalizer; @@ -92,10 +92,7 @@ impl Default for OriginalQueryValues<'tcx> { let mut universe_map = SmallVec::default(); universe_map.push(ty::UniverseIndex::ROOT); - Self { - universe_map, - var_values: SmallVec::default(), - } + Self { universe_map, var_values: SmallVec::default() } } } @@ -157,7 +154,7 @@ impl CanonicalVarKind { CanonicalVarKind::Ty(kind) => match kind { CanonicalTyVarKind::General(ui) => ui, CanonicalTyVarKind::Float | CanonicalTyVarKind::Int => ty::UniverseIndex::ROOT, - } + }, CanonicalVarKind::PlaceholderTy(placeholder) => placeholder.universe, CanonicalVarKind::Region(ui) => ui, @@ -212,8 +209,7 @@ impl QueryRegionConstraints<'_> { pub type Canonicalized<'tcx, V> = Canonical<'tcx, V>; -pub type CanonicalizedQueryResponse<'tcx, T> = - &'tcx Canonical<'tcx, QueryResponse<'tcx, T>>; +pub type CanonicalizedQueryResponse<'tcx, T> = &'tcx Canonical<'tcx, QueryResponse<'tcx, T>>; /// Indicates whether or not we were able to prove the query to be /// true. @@ -295,16 +291,8 @@ impl<'tcx, V> Canonical<'tcx, V> { /// let b: Canonical<'tcx, (T, Ty<'tcx>)> = a.unchecked_map(|v| (v, ty)); /// ``` pub fn unchecked_map(self, map_op: impl FnOnce(V) -> W) -> Canonical<'tcx, W> { - let Canonical { - max_universe, - variables, - value, - } = self; - Canonical { - max_universe, - variables, - value: map_op(value), - } + let Canonical { max_universe, variables, value } = self; + Canonical { max_universe, variables, value: map_op(value) } } } @@ -381,15 +369,10 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { match cv_info.kind { CanonicalVarKind::Ty(ty_kind) => { let ty = match ty_kind { - CanonicalTyVarKind::General(ui) => { - self.next_ty_var_in_universe( - TypeVariableOrigin { - kind: TypeVariableOriginKind::MiscVariable, - span, - }, - universe_map(ui) - ) - } + CanonicalTyVarKind::General(ui) => self.next_ty_var_in_universe( + TypeVariableOrigin { kind: TypeVariableOriginKind::MiscVariable, span }, + universe_map(ui), + ), CanonicalTyVarKind::Int => self.next_int_var(), @@ -400,58 +383,43 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { CanonicalVarKind::PlaceholderTy(ty::PlaceholderType { universe, name }) => { let universe_mapped = universe_map(universe); - let placeholder_mapped = ty::PlaceholderType { - universe: universe_mapped, - name, - }; + let placeholder_mapped = ty::PlaceholderType { universe: universe_mapped, name }; self.tcx.mk_ty(ty::Placeholder(placeholder_mapped)).into() } - CanonicalVarKind::Region(ui) => self.next_region_var_in_universe( - RegionVariableOrigin::MiscVariable(span), - universe_map(ui), - ).into(), + CanonicalVarKind::Region(ui) => self + .next_region_var_in_universe( + RegionVariableOrigin::MiscVariable(span), + universe_map(ui), + ) + .into(), CanonicalVarKind::PlaceholderRegion(ty::PlaceholderRegion { universe, name }) => { let universe_mapped = universe_map(universe); - let placeholder_mapped = ty::PlaceholderRegion { - universe: universe_mapped, - name, - }; + let placeholder_mapped = ty::PlaceholderRegion { universe: universe_mapped, name }; self.tcx.mk_region(ty::RePlaceholder(placeholder_mapped)).into() } - CanonicalVarKind::Const(ui) => { - self.next_const_var_in_universe( + CanonicalVarKind::Const(ui) => self + .next_const_var_in_universe( self.next_ty_var_in_universe( - TypeVariableOrigin { - kind: TypeVariableOriginKind::MiscVariable, - span, - }, + TypeVariableOrigin { kind: TypeVariableOriginKind::MiscVariable, span }, universe_map(ui), ), - ConstVariableOrigin { - kind: ConstVariableOriginKind::MiscVariable, - span, - }, + ConstVariableOrigin { kind: ConstVariableOriginKind::MiscVariable, span }, universe_map(ui), - ).into() - } + ) + .into(), - CanonicalVarKind::PlaceholderConst( - ty::PlaceholderConst { universe, name }, - ) => { + CanonicalVarKind::PlaceholderConst(ty::PlaceholderConst { universe, name }) => { let universe_mapped = universe_map(universe); - let placeholder_mapped = ty::PlaceholderConst { - universe: universe_mapped, - name, - }; - self.tcx.mk_const( - ty::Const { + let placeholder_mapped = ty::PlaceholderConst { universe: universe_mapped, name }; + self.tcx + .mk_const(ty::Const { val: ty::ConstKind::Placeholder(placeholder_mapped), ty: self.tcx.types.err, // FIXME(const_generics) - } - ).into() + }) + .into() } } } @@ -484,23 +452,25 @@ impl<'tcx> CanonicalVarValues<'tcx> { use crate::ty::subst::GenericArgKind; CanonicalVarValues { - var_values: self.var_values.iter() + var_values: self + .var_values + .iter() .zip(0..) .map(|(kind, i)| match kind.unpack() { - GenericArgKind::Type(..) => tcx.mk_ty( - ty::Bound(ty::INNERMOST, ty::BoundVar::from_u32(i).into()) - ).into(), - GenericArgKind::Lifetime(..) => tcx.mk_region( - ty::ReLateBound(ty::INNERMOST, ty::BoundRegion::BrAnon(i)) - ).into(), - GenericArgKind::Const(ct) => { - tcx.mk_const(ty::Const { + GenericArgKind::Type(..) => { + tcx.mk_ty(ty::Bound(ty::INNERMOST, ty::BoundVar::from_u32(i).into())).into() + } + GenericArgKind::Lifetime(..) => tcx + .mk_region(ty::ReLateBound(ty::INNERMOST, ty::BoundRegion::BrAnon(i))) + .into(), + GenericArgKind::Const(ct) => tcx + .mk_const(ty::Const { ty: ct.ty, val: ty::ConstKind::Bound(ty::INNERMOST, ty::BoundVar::from_u32(i)), - }).into() - } + }) + .into(), }) - .collect() + .collect(), } } } diff --git a/src/librustc/infer/canonical/query_response.rs b/src/librustc/infer/canonical/query_response.rs index 825e98cedb..012900f8af 100644 --- a/src/librustc/infer/canonical/query_response.rs +++ b/src/librustc/infer/canonical/query_response.rs @@ -10,23 +10,23 @@ use crate::arena::ArenaAllocatable; use crate::infer::canonical::substitute::substitute_value; use crate::infer::canonical::{ - Canonical, CanonicalVarValues, CanonicalizedQueryResponse, Certainty, - OriginalQueryValues, QueryRegionConstraints, QueryOutlivesConstraint, QueryResponse, + Canonical, CanonicalVarValues, CanonicalizedQueryResponse, Certainty, OriginalQueryValues, + QueryOutlivesConstraint, QueryRegionConstraints, QueryResponse, }; use crate::infer::region_constraints::{Constraint, RegionConstraintData}; use crate::infer::InferCtxtBuilder; use crate::infer::{InferCtxt, InferOk, InferResult}; -use rustc_index::vec::Idx; -use rustc_index::vec::IndexVec; -use std::fmt::Debug; -use syntax_pos::DUMMY_SP; use crate::traits::query::{Fallible, NoSolution}; use crate::traits::TraitEngine; use crate::traits::{Obligation, ObligationCause, PredicateObligation}; use crate::ty::fold::TypeFoldable; use crate::ty::subst::{GenericArg, GenericArgKind}; use crate::ty::{self, BoundVar, Ty, TyCtxt}; -use crate::util::captures::Captures; +use rustc_data_structures::captures::Captures; +use rustc_index::vec::Idx; +use rustc_index::vec::IndexVec; +use rustc_span::DUMMY_SP; +use std::fmt::Debug; impl<'tcx> InferCtxtBuilder<'tcx> { /// The "main method" for a canonicalized trait query. Given the @@ -64,7 +64,7 @@ impl<'tcx> InferCtxtBuilder<'tcx> { infcx.make_canonicalized_query_response( canonical_inference_vars, value, - &mut *fulfill_cx + &mut *fulfill_cx, ) }, ) @@ -104,10 +104,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { let query_response = self.make_query_response(inference_vars, answer, fulfill_cx)?; let canonical_result = self.canonicalize_response(&query_response); - debug!( - "make_canonicalized_query_response: canonical_result = {:#?}", - canonical_result - ); + debug!("make_canonicalized_query_response: canonical_result = {:#?}", canonical_result); Ok(self.tcx.arena.alloc(canonical_result)) } @@ -175,18 +172,13 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { let region_constraints = self.with_region_constraints(|region_constraints| { make_query_region_constraints( tcx, - region_obligations - .iter() - .map(|(_, r_o)| (r_o.sup_type, r_o.sub_region)), + region_obligations.iter().map(|(_, r_o)| (r_o.sup_type, r_o.sub_region)), region_constraints, ) }); - let certainty = if ambig_errors.is_empty() { - Certainty::Proven - } else { - Certainty::Ambiguous - }; + let certainty = + if ambig_errors.is_empty() { Certainty::Proven } else { Certainty::Ambiguous }; Ok(QueryResponse { var_values: inference_vars, @@ -216,10 +208,8 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { where R: Debug + TypeFoldable<'tcx>, { - let InferOk { - value: result_subst, - mut obligations, - } = self.query_response_substitution(cause, param_env, original_values, query_response)?; + let InferOk { value: result_subst, mut obligations } = + self.query_response_substitution(cause, param_env, original_values, query_response)?; obligations.extend(self.query_outlives_constraints_into_obligations( cause, @@ -231,10 +221,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { let user_result: R = query_response.substitute_projected(self.tcx, &result_subst, |q_r| &q_r.value); - Ok(InferOk { - value: user_result, - obligations, - }) + Ok(InferOk { value: user_result, obligations }) } /// An alternative to @@ -327,11 +314,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { } _ => { - bug!( - "kind mismatch, cannot unify {:?} and {:?}", - original_value, - result_value - ); + bug!("kind mismatch, cannot unify {:?} and {:?}", original_value, result_value); } } } @@ -345,28 +328,24 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { // only compare the inner values to one another, so they are still at // consistent binding levels. let &ty::OutlivesPredicate(k1, r2) = r_c.skip_binder(); - if k1 != r2.into() { - Some(r_c) - } else { - None - } - }) + if k1 != r2.into() { Some(r_c) } else { None } + }), ); // ...also include the query member constraints. output_query_region_constraints.member_constraints.extend( - query_response.value.region_constraints.member_constraints.iter().map(|p_c| { - substitute_value(self.tcx, &result_subst, p_c) - }) + query_response + .value + .region_constraints + .member_constraints + .iter() + .map(|p_c| substitute_value(self.tcx, &result_subst, p_c)), ); let user_result: R = query_response.substitute_projected(self.tcx, &result_subst, |q_r| &q_r.value); - Ok(InferOk { - value: user_result, - obligations, - }) + Ok(InferOk { value: user_result, obligations }) } /// Given the original values and the (canonicalized) result from @@ -397,19 +376,17 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { let result_subst = self.query_response_substitution_guess(cause, original_values, query_response); - let obligations = self.unify_query_response_substitution_guess( - cause, - param_env, - original_values, - &result_subst, - query_response, - )? + let obligations = self + .unify_query_response_substitution_guess( + cause, + param_env, + original_values, + &result_subst, + query_response, + )? .into_obligations(); - Ok(InferOk { - value: result_subst, - obligations, - }) + Ok(InferOk { value: result_subst, obligations }) } /// Given the original values and the (canonicalized) result from @@ -445,10 +422,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { universe_map.push(self.create_next_universe()); } assert!(universe_map.len() >= 1); // always have the root universe - assert_eq!( - universe_map[ty::UniverseIndex::ROOT.as_usize()], - ty::UniverseIndex::ROOT - ); + assert_eq!(universe_map[ty::UniverseIndex::ROOT.as_usize()], ty::UniverseIndex::ROOT); // Every canonical query result includes values for each of // the inputs to the query. Therefore, we begin by unifying @@ -575,34 +549,28 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { unsubstituted_region_constraints: &'a [QueryOutlivesConstraint<'tcx>], result_subst: &'a CanonicalVarValues<'tcx>, ) -> impl Iterator> + 'a + Captures<'tcx> { - unsubstituted_region_constraints - .iter() - .map(move |constraint| { - let constraint = substitute_value(self.tcx, result_subst, constraint); - let &ty::OutlivesPredicate(k1, r2) = constraint.skip_binder(); // restored below - - Obligation::new( - cause.clone(), - param_env, - match k1.unpack() { - GenericArgKind::Lifetime(r1) => ty::Predicate::RegionOutlives( - ty::Binder::bind( - ty::OutlivesPredicate(r1, r2) - ) - ), - GenericArgKind::Type(t1) => ty::Predicate::TypeOutlives( - ty::Binder::bind( - ty::OutlivesPredicate(t1, r2) - ) - ), - GenericArgKind::Const(..) => { - // Consts cannot outlive one another, so we don't expect to - // ecounter this branch. - span_bug!(cause.span, "unexpected const outlives {:?}", constraint); - } + unsubstituted_region_constraints.iter().map(move |constraint| { + let constraint = substitute_value(self.tcx, result_subst, constraint); + let &ty::OutlivesPredicate(k1, r2) = constraint.skip_binder(); // restored below + + Obligation::new( + cause.clone(), + param_env, + match k1.unpack() { + GenericArgKind::Lifetime(r1) => ty::Predicate::RegionOutlives( + ty::Binder::bind(ty::OutlivesPredicate(r1, r2)), + ), + GenericArgKind::Type(t1) => { + ty::Predicate::TypeOutlives(ty::Binder::bind(ty::OutlivesPredicate(t1, r2))) } - ) - }) + GenericArgKind::Const(..) => { + // Consts cannot outlive one another, so we don't expect to + // ecounter this branch. + span_bug!(cause.span, "unexpected const outlives {:?}", constraint); + } + }, + ) + }) } /// Given two sets of values for the same set of canonical variables, unify them. @@ -643,10 +611,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { } } } - Ok(InferOk { - value: (), - obligations, - }) + Ok(InferOk { value: (), obligations }) }) } } @@ -658,12 +623,8 @@ pub fn make_query_region_constraints<'tcx>( outlives_obligations: impl Iterator, ty::Region<'tcx>)>, region_constraints: &RegionConstraintData<'tcx>, ) -> QueryRegionConstraints<'tcx> { - let RegionConstraintData { - constraints, - verifys, - givens, - member_constraints, - } = region_constraints; + let RegionConstraintData { constraints, verifys, givens, member_constraints } = + region_constraints; assert!(verifys.is_empty()); assert!(givens.is_empty()); @@ -689,7 +650,7 @@ pub fn make_query_region_constraints<'tcx>( .chain( outlives_obligations .map(|(ty, r)| ty::OutlivesPredicate(ty.into(), r)) - .map(ty::Binder::dummy) // no bound vars in the code above + .map(ty::Binder::dummy), // no bound vars in the code above ) .collect(); diff --git a/src/librustc/infer/canonical/substitute.rs b/src/librustc/infer/canonical/substitute.rs index 4f5bb09c91..9251634563 100644 --- a/src/librustc/infer/canonical/substitute.rs +++ b/src/librustc/infer/canonical/substitute.rs @@ -56,25 +56,20 @@ where if var_values.var_values.is_empty() { value.clone() } else { - let fld_r = |br: ty::BoundRegion| { - match var_values.var_values[br.assert_bound_var()].unpack() { + let fld_r = + |br: ty::BoundRegion| match var_values.var_values[br.assert_bound_var()].unpack() { GenericArgKind::Lifetime(l) => l, r => bug!("{:?} is a region but value is {:?}", br, r), - } - }; + }; - let fld_t = |bound_ty: ty::BoundTy| { - match var_values.var_values[bound_ty.var].unpack() { - GenericArgKind::Type(ty) => ty, - r => bug!("{:?} is a type but value is {:?}", bound_ty, r), - } + let fld_t = |bound_ty: ty::BoundTy| match var_values.var_values[bound_ty.var].unpack() { + GenericArgKind::Type(ty) => ty, + r => bug!("{:?} is a type but value is {:?}", bound_ty, r), }; - let fld_c = |bound_ct: ty::BoundVar, _| { - match var_values.var_values[bound_ct].unpack() { - GenericArgKind::Const(ct) => ct, - c => bug!("{:?} is a const but value is {:?}", bound_ct, c), - } + let fld_c = |bound_ct: ty::BoundVar, _| match var_values.var_values[bound_ct].unpack() { + GenericArgKind::Const(ct) => ct, + c => bug!("{:?} is a const but value is {:?}", bound_ct, c), }; tcx.replace_escaping_bound_vars(value, fld_r, fld_t, fld_c).0 diff --git a/src/librustc/infer/combine.rs b/src/librustc/infer/combine.rs index a2f0531f0a..5d765a2a3d 100644 --- a/src/librustc/infer/combine.rs +++ b/src/librustc/infer/combine.rs @@ -24,24 +24,24 @@ use super::equate::Equate; use super::glb::Glb; -use super::{InferCtxt, MiscVariable, TypeTrace}; use super::lub::Lub; use super::sub::Sub; use super::type_variable::TypeVariableValue; +use super::unify_key::replace_if_possible; use super::unify_key::{ConstVarValue, ConstVariableValue}; use super::unify_key::{ConstVariableOrigin, ConstVariableOriginKind}; -use super::unify_key::replace_if_possible; +use super::{InferCtxt, MiscVariable, TypeTrace}; -use crate::hir::def_id::DefId; -use crate::ty::{IntType, UintType}; -use crate::ty::{self, Ty, TyCtxt, InferConst}; +use crate::traits::{Obligation, PredicateObligations}; use crate::ty::error::TypeError; use crate::ty::relate::{self, Relate, RelateResult, TypeRelation}; use crate::ty::subst::SubstsRef; -use crate::traits::{Obligation, PredicateObligations}; +use crate::ty::{self, InferConst, Ty, TyCtxt}; +use crate::ty::{IntType, UintType}; +use rustc_hir::def_id::DefId; +use rustc_span::{Span, DUMMY_SP}; use syntax::ast; -use syntax_pos::{Span, DUMMY_SP}; #[derive(Clone)] pub struct CombineFields<'infcx, 'tcx> { @@ -54,7 +54,9 @@ pub struct CombineFields<'infcx, 'tcx> { #[derive(Copy, Clone, Debug)] pub enum RelationDir { - SubtypeOf, SupertypeOf, EqTo + SubtypeOf, + SupertypeOf, + EqTo, } impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> { @@ -107,14 +109,11 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> { } // All other cases of inference are errors - (&ty::Infer(_), _) | - (_, &ty::Infer(_)) => { + (&ty::Infer(_), _) | (_, &ty::Infer(_)) => { Err(TypeError::Sorts(ty::relate::expected_found(relation, &a, &b))) } - _ => { - ty::relate::super_relate_tys(relation, a, b) - } + _ => ty::relate::super_relate_tys(relation, a, b), } } @@ -128,7 +127,9 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> { R: TypeRelation<'tcx>, { debug!("{}.consts({:?}, {:?})", relation.tag(), a, b); - if a == b { return Ok(a); } + if a == b { + return Ok(a); + } let a = replace_if_possible(self.const_unification_table.borrow_mut(), a); let b = replace_if_possible(self.const_unification_table.borrow_mut(), b); @@ -136,8 +137,10 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> { let a_is_expected = relation.a_is_expected(); match (a.val, b.val) { - (ty::ConstKind::Infer(InferConst::Var(a_vid)), - ty::ConstKind::Infer(InferConst::Var(b_vid))) => { + ( + ty::ConstKind::Infer(InferConst::Var(a_vid)), + ty::ConstKind::Infer(InferConst::Var(b_vid)), + ) => { self.const_unification_table .borrow_mut() .unify_var_var(a_vid, b_vid) @@ -146,8 +149,8 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> { } // All other cases of inference with other variables are errors. - (ty::ConstKind::Infer(InferConst::Var(_)), ty::ConstKind::Infer(_)) | - (ty::ConstKind::Infer(_), ty::ConstKind::Infer(InferConst::Var(_))) => { + (ty::ConstKind::Infer(InferConst::Var(_)), ty::ConstKind::Infer(_)) + | (ty::ConstKind::Infer(_), ty::ConstKind::Infer(InferConst::Var(_))) => { bug!("tried to combine ConstKind::Infer/ConstKind::Infer(InferConst::Var)") } @@ -173,23 +176,26 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> { ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> { self.const_unification_table .borrow_mut() - .unify_var_value(vid, ConstVarValue { - origin: ConstVariableOrigin { - kind: ConstVariableOriginKind::ConstInference, - span: DUMMY_SP, + .unify_var_value( + vid, + ConstVarValue { + origin: ConstVariableOrigin { + kind: ConstVariableOriginKind::ConstInference, + span: DUMMY_SP, + }, + val: ConstVariableValue::Known { value }, }, - val: ConstVariableValue::Known { value }, - }) + ) .map_err(|e| const_unification_error(vid_is_expected, e))?; Ok(value) } - fn unify_integral_variable(&self, - vid_is_expected: bool, - vid: ty::IntVid, - val: ty::IntVarValue) - -> RelateResult<'tcx, Ty<'tcx>> - { + fn unify_integral_variable( + &self, + vid_is_expected: bool, + vid: ty::IntVid, + val: ty::IntVarValue, + ) -> RelateResult<'tcx, Ty<'tcx>> { self.int_unification_table .borrow_mut() .unify_var_value(vid, Some(val)) @@ -200,12 +206,12 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> { } } - fn unify_float_variable(&self, - vid_is_expected: bool, - vid: ty::FloatVid, - val: ast::FloatTy) - -> RelateResult<'tcx, Ty<'tcx>> - { + fn unify_float_variable( + &self, + vid_is_expected: bool, + vid: ty::FloatVid, + val: ast::FloatTy, + ) -> RelateResult<'tcx, Ty<'tcx>> { self.float_unification_table .borrow_mut() .unify_var_value(vid, Some(ty::FloatVarValue(val))) @@ -244,13 +250,13 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> { /// will first instantiate `b_vid` with a *generalized* version /// of `a_ty`. Generalization introduces other inference /// variables wherever subtyping could occur. - pub fn instantiate(&mut self, - a_ty: Ty<'tcx>, - dir: RelationDir, - b_vid: ty::TyVid, - a_is_expected: bool) - -> RelateResult<'tcx, ()> - { + pub fn instantiate( + &mut self, + a_ty: Ty<'tcx>, + dir: RelationDir, + b_vid: ty::TyVid, + a_is_expected: bool, + ) -> RelateResult<'tcx, ()> { use self::RelationDir::*; // Get the actual variable that b_vid has been inferred to @@ -270,14 +276,18 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> { // variables. (Down below, we will relate `a_ty <: b_ty`, // adding constraints like `'x: '?2` and `?1 <: ?3`.) let Generalization { ty: b_ty, needs_wf } = self.generalize(a_ty, b_vid, dir)?; - debug!("instantiate(a_ty={:?}, dir={:?}, b_vid={:?}, generalized b_ty={:?})", - a_ty, dir, b_vid, b_ty); + debug!( + "instantiate(a_ty={:?}, dir={:?}, b_vid={:?}, generalized b_ty={:?})", + a_ty, dir, b_vid, b_ty + ); self.infcx.type_variables.borrow_mut().instantiate(b_vid, b_ty); if needs_wf { - self.obligations.push(Obligation::new(self.trace.cause.clone(), - self.param_env, - ty::Predicate::WellFormed(b_ty))); + self.obligations.push(Obligation::new( + self.trace.cause.clone(), + self.param_env, + ty::Predicate::WellFormed(b_ty), + )); } // Finally, relate `b_ty` to `a_ty`, as described in previous comment. @@ -289,8 +299,9 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> { match dir { EqTo => self.equate(a_is_expected).relate(&a_ty, &b_ty), SubtypeOf => self.sub(a_is_expected).relate(&a_ty, &b_ty), - SupertypeOf => self.sub(a_is_expected).relate_with_variance( - ty::Contravariant, &a_ty, &b_ty), + SupertypeOf => { + self.sub(a_is_expected).relate_with_variance(ty::Contravariant, &a_ty, &b_ty) + } }?; Ok(()) @@ -305,12 +316,12 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> { /// Preconditions: /// /// - `for_vid` is a "root vid" - fn generalize(&self, - ty: Ty<'tcx>, - for_vid: ty::TyVid, - dir: RelationDir) - -> RelateResult<'tcx, Generalization<'tcx>> - { + fn generalize( + &self, + ty: Ty<'tcx>, + for_vid: ty::TyVid, + dir: RelationDir, + ) -> RelateResult<'tcx, Generalization<'tcx>> { debug!("generalize(ty={:?}, for_vid={:?}, dir={:?}", ty, for_vid, dir); // Determine the ambient variance within which `ty` appears. // The surrounding equation is: @@ -328,11 +339,9 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> { debug!("generalize: ambient_variance = {:?}", ambient_variance); let for_universe = match self.infcx.type_variables.borrow_mut().probe(for_vid) { - v @ TypeVariableValue::Known { .. } => panic!( - "instantiating {:?} which has a known value {:?}", - for_vid, - v, - ), + v @ TypeVariableValue::Known { .. } => { + panic!("instantiating {:?} which has a known value {:?}", for_vid, v,) + } TypeVariableValue::Unknown { universe } => universe, }; @@ -428,7 +437,9 @@ impl TypeRelation<'tcx> for Generalizer<'_, 'tcx> { fn tcx(&self) -> TyCtxt<'tcx> { self.infcx.tcx } - fn param_env(&self) -> ty::ParamEnv<'tcx> { self.param_env } + fn param_env(&self) -> ty::ParamEnv<'tcx> { + self.param_env + } fn tag(&self) -> &'static str { "Generalizer" @@ -438,19 +449,23 @@ impl TypeRelation<'tcx> for Generalizer<'_, 'tcx> { true } - fn binders(&mut self, a: &ty::Binder, b: &ty::Binder) - -> RelateResult<'tcx, ty::Binder> - where T: Relate<'tcx> + fn binders( + &mut self, + a: &ty::Binder, + b: &ty::Binder, + ) -> RelateResult<'tcx, ty::Binder> + where + T: Relate<'tcx>, { Ok(ty::Binder::bind(self.relate(a.skip_binder(), b.skip_binder())?)) } - fn relate_item_substs(&mut self, - item_def_id: DefId, - a_subst: SubstsRef<'tcx>, - b_subst: SubstsRef<'tcx>) - -> RelateResult<'tcx, SubstsRef<'tcx>> - { + fn relate_item_substs( + &mut self, + item_def_id: DefId, + a_subst: SubstsRef<'tcx>, + b_subst: SubstsRef<'tcx>, + ) -> RelateResult<'tcx, SubstsRef<'tcx>> { if self.ambient_variance == ty::Variance::Invariant { // Avoid fetching the variance if we are in an invariant // context; no need, and it can induce dependency cycles @@ -462,12 +477,12 @@ impl TypeRelation<'tcx> for Generalizer<'_, 'tcx> { } } - fn relate_with_variance>(&mut self, - variance: ty::Variance, - a: &T, - b: &T) - -> RelateResult<'tcx, T> - { + fn relate_with_variance>( + &mut self, + variance: ty::Variance, + a: &T, + b: &T, + ) -> RelateResult<'tcx, T> { let old_ambient_variance = self.ambient_variance; self.ambient_variance = self.ambient_variance.xform(variance); @@ -524,28 +539,27 @@ impl TypeRelation<'tcx> for Generalizer<'_, 'tcx> { let origin = *variables.var_origin(vid); let new_var_id = variables.new_var(self.for_universe, false, origin); let u = self.tcx().mk_ty_var(new_var_id); - debug!("generalize: replacing original vid={:?} with new={:?}", - vid, u); + debug!("generalize: replacing original vid={:?} with new={:?}", vid, u); Ok(u) } } } } - ty::Infer(ty::IntVar(_)) | - ty::Infer(ty::FloatVar(_)) => { + ty::Infer(ty::IntVar(_)) | ty::Infer(ty::FloatVar(_)) => { // No matter what mode we are in, // integer/floating-point types must be equal to be // relatable. Ok(t) } - _ => { - relate::super_relate_tys(self, t, t) - } + _ => relate::super_relate_tys(self, t, t), } } - fn regions(&mut self, r: ty::Region<'tcx>, r2: ty::Region<'tcx>) - -> RelateResult<'tcx, ty::Region<'tcx>> { + fn regions( + &mut self, + r: ty::Region<'tcx>, + r2: ty::Region<'tcx>, + ) -> RelateResult<'tcx, ty::Region<'tcx>> { assert_eq!(r, r2); // we are abusing TypeRelation here; both LHS and RHS ought to be == debug!("generalize: regions r={:?}", r); @@ -553,26 +567,21 @@ impl TypeRelation<'tcx> for Generalizer<'_, 'tcx> { match *r { // Never make variables for regions bound within the type itself, // nor for erased regions. - ty::ReLateBound(..) | - ty::ReErased => { + ty::ReLateBound(..) | ty::ReErased => { return Ok(r); } ty::ReClosureBound(..) => { - span_bug!( - self.span, - "encountered unexpected ReClosureBound: {:?}", - r, - ); + span_bug!(self.span, "encountered unexpected ReClosureBound: {:?}", r,); } - ty::RePlaceholder(..) | - ty::ReVar(..) | - ty::ReEmpty | - ty::ReStatic | - ty::ReScope(..) | - ty::ReEarlyBound(..) | - ty::ReFree(..) => { + ty::RePlaceholder(..) + | ty::ReVar(..) + | ty::ReEmpty + | ty::ReStatic + | ty::ReScope(..) + | ty::ReEarlyBound(..) + | ty::ReFree(..) => { // see common code below } } @@ -597,7 +606,7 @@ impl TypeRelation<'tcx> for Generalizer<'_, 'tcx> { fn consts( &mut self, c: &'tcx ty::Const<'tcx>, - c2: &'tcx ty::Const<'tcx> + c2: &'tcx ty::Const<'tcx>, ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> { assert_eq!(c, c2); // we are abusing TypeRelation here; both LHS and RHS ought to be == @@ -626,21 +635,17 @@ impl TypeRelation<'tcx> for Generalizer<'_, 'tcx> { } pub trait RelateResultCompare<'tcx, T> { - fn compare(&self, t: T, f: F) -> RelateResult<'tcx, T> where + fn compare(&self, t: T, f: F) -> RelateResult<'tcx, T> + where F: FnOnce() -> TypeError<'tcx>; } -impl<'tcx, T:Clone + PartialEq> RelateResultCompare<'tcx, T> for RelateResult<'tcx, T> { - fn compare(&self, t: T, f: F) -> RelateResult<'tcx, T> where +impl<'tcx, T: Clone + PartialEq> RelateResultCompare<'tcx, T> for RelateResult<'tcx, T> { + fn compare(&self, t: T, f: F) -> RelateResult<'tcx, T> + where F: FnOnce() -> TypeError<'tcx>, { - self.clone().and_then(|s| { - if s == t { - self.clone() - } else { - Err(f()) - } - }) + self.clone().and_then(|s| if s == t { self.clone() } else { Err(f()) }) } } @@ -651,17 +656,18 @@ pub fn const_unification_error<'tcx>( TypeError::ConstMismatch(ty::relate::expected_found_bool(a_is_expected, &a, &b)) } -fn int_unification_error<'tcx>(a_is_expected: bool, v: (ty::IntVarValue, ty::IntVarValue)) - -> TypeError<'tcx> -{ +fn int_unification_error<'tcx>( + a_is_expected: bool, + v: (ty::IntVarValue, ty::IntVarValue), +) -> TypeError<'tcx> { let (a, b) = v; TypeError::IntMismatch(ty::relate::expected_found_bool(a_is_expected, &a, &b)) } -fn float_unification_error<'tcx>(a_is_expected: bool, - v: (ty::FloatVarValue, ty::FloatVarValue)) - -> TypeError<'tcx> -{ +fn float_unification_error<'tcx>( + a_is_expected: bool, + v: (ty::FloatVarValue, ty::FloatVarValue), +) -> TypeError<'tcx> { let (ty::FloatVarValue(a), ty::FloatVarValue(b)) = v; TypeError::FloatMismatch(ty::relate::expected_found_bool(a_is_expected, &a, &b)) } diff --git a/src/librustc/infer/equate.rs b/src/librustc/infer/equate.rs index aea58acab5..4a41cdb140 100644 --- a/src/librustc/infer/equate.rs +++ b/src/librustc/infer/equate.rs @@ -1,12 +1,12 @@ use super::combine::{CombineFields, RelationDir}; use super::Subtype; -use crate::hir::def_id::DefId; - -use crate::ty::{self, Ty, TyCtxt}; -use crate::ty::TyVar; -use crate::ty::subst::SubstsRef; use crate::ty::relate::{self, Relate, RelateResult, TypeRelation}; +use crate::ty::subst::SubstsRef; +use crate::ty::TyVar; +use crate::ty::{self, Ty, TyCtxt}; + +use rustc_hir::def_id::DefId; /// Ensures `a` is made equal to `b`. Returns `a` on success. pub struct Equate<'combine, 'infcx, 'tcx> { @@ -24,20 +24,28 @@ impl<'combine, 'infcx, 'tcx> Equate<'combine, 'infcx, 'tcx> { } impl TypeRelation<'tcx> for Equate<'combine, 'infcx, 'tcx> { - fn tag(&self) -> &'static str { "Equate" } + fn tag(&self) -> &'static str { + "Equate" + } - fn tcx(&self) -> TyCtxt<'tcx> { self.fields.tcx() } + fn tcx(&self) -> TyCtxt<'tcx> { + self.fields.tcx() + } - fn param_env(&self) -> ty::ParamEnv<'tcx> { self.fields.param_env } + fn param_env(&self) -> ty::ParamEnv<'tcx> { + self.fields.param_env + } - fn a_is_expected(&self) -> bool { self.a_is_expected } + fn a_is_expected(&self) -> bool { + self.a_is_expected + } - fn relate_item_substs(&mut self, - _item_def_id: DefId, - a_subst: SubstsRef<'tcx>, - b_subst: SubstsRef<'tcx>) - -> RelateResult<'tcx, SubstsRef<'tcx>> - { + fn relate_item_substs( + &mut self, + _item_def_id: DefId, + a_subst: SubstsRef<'tcx>, + b_subst: SubstsRef<'tcx>, + ) -> RelateResult<'tcx, SubstsRef<'tcx>> { // N.B., once we are equating types, we don't care about // variance, so don't try to lookup the variance here. This // also avoids some cycles (e.g., #41849) since looking up @@ -48,19 +56,20 @@ impl TypeRelation<'tcx> for Equate<'combine, 'infcx, 'tcx> { relate::relate_substs(self, None, a_subst, b_subst) } - fn relate_with_variance>(&mut self, - _: ty::Variance, - a: &T, - b: &T) - -> RelateResult<'tcx, T> - { + fn relate_with_variance>( + &mut self, + _: ty::Variance, + a: &T, + b: &T, + ) -> RelateResult<'tcx, T> { self.relate(a, b) } fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>> { - debug!("{}.tys({:?}, {:?})", self.tag(), - a, b); - if a == b { return Ok(a); } + debug!("{}.tys({:?}, {:?})", self.tag(), a, b); + if a == b { + return Ok(a); + } let infcx = self.fields.infcx; let a = infcx.type_variables.borrow_mut().replace_if_possible(a); @@ -89,15 +98,14 @@ impl TypeRelation<'tcx> for Equate<'combine, 'infcx, 'tcx> { Ok(a) } - fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>) - -> RelateResult<'tcx, ty::Region<'tcx>> { - debug!("{}.regions({:?}, {:?})", - self.tag(), - a, - b); + fn regions( + &mut self, + a: ty::Region<'tcx>, + b: ty::Region<'tcx>, + ) -> RelateResult<'tcx, ty::Region<'tcx>> { + debug!("{}.regions({:?}, {:?})", self.tag(), a, b); let origin = Subtype(box self.fields.trace.clone()); - self.fields.infcx.borrow_region_constraints() - .make_eqregion(origin, a, b); + self.fields.infcx.borrow_region_constraints().make_eqregion(origin, a, b); Ok(a) } @@ -109,9 +117,13 @@ impl TypeRelation<'tcx> for Equate<'combine, 'infcx, 'tcx> { self.fields.infcx.super_combine_consts(self, a, b) } - fn binders(&mut self, a: &ty::Binder, b: &ty::Binder) - -> RelateResult<'tcx, ty::Binder> - where T: Relate<'tcx> + fn binders( + &mut self, + a: &ty::Binder, + b: &ty::Binder, + ) -> RelateResult<'tcx, ty::Binder> + where + T: Relate<'tcx>, { self.fields.higher_ranked_sub(a, b, self.a_is_expected)?; self.fields.higher_ranked_sub(b, a, self.a_is_expected) diff --git a/src/librustc/infer/error_reporting/mod.rs b/src/librustc/infer/error_reporting/mod.rs index c9d57706d5..58566bdcc3 100644 --- a/src/librustc/infer/error_reporting/mod.rs +++ b/src/librustc/infer/error_reporting/mod.rs @@ -49,22 +49,29 @@ use super::lexical_region_resolve::RegionResolutionError; use super::region_constraints::GenericKind; use super::{InferCtxt, RegionVariableOrigin, SubregionOrigin, TypeTrace, ValuePairs}; -use crate::hir; -use crate::hir::def_id::DefId; -use crate::hir::Node; -use crate::infer::{self, SuppressRegionErrors}; +use crate::hir::map; use crate::infer::opaque_types; +use crate::infer::{self, SuppressRegionErrors}; use crate::middle::region; +use crate::traits::error_reporting::report_object_safety_error; +use crate::traits::object_safety_violations; use crate::traits::{ IfExpressionCause, MatchExpressionArmCause, ObligationCause, ObligationCauseCode, }; use crate::ty::error::TypeError; -use crate::ty::{self, subst::{Subst, SubstsRef}, Region, Ty, TyCtxt, TypeFoldable}; - -use errors::{Applicability, DiagnosticBuilder, DiagnosticStyledString}; -use rustc_error_codes::*; +use crate::ty::{ + self, + subst::{Subst, SubstsRef}, + Region, Ty, TyCtxt, TypeFoldable, +}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_errors::{pluralize, struct_span_err}; +use rustc_errors::{Applicability, DiagnosticBuilder, DiagnosticStyledString}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::Node; +use rustc_span::{DesugaringKind, Pos, Span}; use rustc_target::spec::abi; -use syntax_pos::{Pos, Span}; use std::{cmp, fmt}; mod note; @@ -74,221 +81,209 @@ pub use need_type_info::TypeAnnotationNeeded; pub mod nice_region_error; -impl<'tcx> TyCtxt<'tcx> { - pub fn note_and_explain_region( - self, - region_scope_tree: ®ion::ScopeTree, - err: &mut DiagnosticBuilder<'_>, - prefix: &str, - region: ty::Region<'tcx>, - suffix: &str, - ) { - let (description, span) = match *region { - ty::ReScope(scope) => { - let new_string; - let unknown_scope = || { - format!( - "{}unknown scope: {:?}{}. Please report a bug.", - prefix, scope, suffix - ) - }; - let span = scope.span(self, region_scope_tree); - let tag = match self.hir().find(scope.hir_id(region_scope_tree)) { - Some(Node::Block(_)) => "block", - Some(Node::Expr(expr)) => match expr.kind { - hir::ExprKind::Call(..) => "call", - hir::ExprKind::MethodCall(..) => "method call", - hir::ExprKind::Match(.., hir::MatchSource::IfLetDesugar { .. }) => "if let", - hir::ExprKind::Match(.., hir::MatchSource::WhileLetDesugar) => "while let", - hir::ExprKind::Match(.., hir::MatchSource::ForLoopDesugar) => "for", - hir::ExprKind::Match(..) => "match", - _ => "expression", - }, - Some(Node::Stmt(_)) => "statement", - Some(Node::Item(it)) => Self::item_scope_tag(&it), - Some(Node::TraitItem(it)) => Self::trait_item_scope_tag(&it), - Some(Node::ImplItem(it)) => Self::impl_item_scope_tag(&it), - Some(_) | None => { - err.span_note(span, &unknown_scope()); - return; - } - }; - let scope_decorated_tag = match scope.data { - region::ScopeData::Node => tag, - region::ScopeData::CallSite => "scope of call-site for function", - region::ScopeData::Arguments => "scope of function body", - region::ScopeData::Destruction => { - new_string = format!("destruction scope surrounding {}", tag); - &new_string[..] - } - region::ScopeData::Remainder(first_statement_index) => { - new_string = format!( - "block suffix following statement {}", - first_statement_index.index() - ); - &new_string[..] - } - }; - self.explain_span(scope_decorated_tag, span) - } +pub(super) fn note_and_explain_region( + tcx: TyCtxt<'tcx>, + region_scope_tree: ®ion::ScopeTree, + err: &mut DiagnosticBuilder<'_>, + prefix: &str, + region: ty::Region<'tcx>, + suffix: &str, +) { + let (description, span) = match *region { + ty::ReScope(scope) => { + let new_string; + let unknown_scope = + || format!("{}unknown scope: {:?}{}. Please report a bug.", prefix, scope, suffix); + let span = scope.span(tcx, region_scope_tree); + let tag = match tcx.hir().find(scope.hir_id(region_scope_tree)) { + Some(Node::Block(_)) => "block", + Some(Node::Expr(expr)) => match expr.kind { + hir::ExprKind::Call(..) => "call", + hir::ExprKind::MethodCall(..) => "method call", + hir::ExprKind::Match(.., hir::MatchSource::IfLetDesugar { .. }) => "if let", + hir::ExprKind::Match(.., hir::MatchSource::WhileLetDesugar) => "while let", + hir::ExprKind::Match(.., hir::MatchSource::ForLoopDesugar) => "for", + hir::ExprKind::Match(..) => "match", + _ => "expression", + }, + Some(Node::Stmt(_)) => "statement", + Some(Node::Item(it)) => item_scope_tag(&it), + Some(Node::TraitItem(it)) => trait_item_scope_tag(&it), + Some(Node::ImplItem(it)) => impl_item_scope_tag(&it), + Some(_) | None => { + err.span_note(span, &unknown_scope()); + return; + } + }; + let scope_decorated_tag = match scope.data { + region::ScopeData::Node => tag, + region::ScopeData::CallSite => "scope of call-site for function", + region::ScopeData::Arguments => "scope of function body", + region::ScopeData::Destruction => { + new_string = format!("destruction scope surrounding {}", tag); + &new_string[..] + } + region::ScopeData::Remainder(first_statement_index) => { + new_string = format!( + "block suffix following statement {}", + first_statement_index.index() + ); + &new_string[..] + } + }; + explain_span(tcx, scope_decorated_tag, span) + } - ty::ReEarlyBound(_) | ty::ReFree(_) | ty::ReStatic => { - self.msg_span_from_free_region(region) - } + ty::ReEarlyBound(_) | ty::ReFree(_) | ty::ReStatic => { + msg_span_from_free_region(tcx, region) + } - ty::ReEmpty => ("the empty lifetime".to_owned(), None), + ty::ReEmpty => ("the empty lifetime".to_owned(), None), - ty::RePlaceholder(_) => (format!("any other region"), None), + ty::RePlaceholder(_) => (format!("any other region"), None), - // FIXME(#13998) RePlaceholder should probably print like - // ReFree rather than dumping Debug output on the user. - // - // We shouldn't really be having unification failures with ReVar - // and ReLateBound though. - ty::ReVar(_) | ty::ReLateBound(..) | ty::ReErased => { - (format!("lifetime {:?}", region), None) - } + // FIXME(#13998) RePlaceholder should probably print like + // ReFree rather than dumping Debug output on the user. + // + // We shouldn't really be having unification failures with ReVar + // and ReLateBound though. + ty::ReVar(_) | ty::ReLateBound(..) | ty::ReErased => { + (format!("lifetime {:?}", region), None) + } - // We shouldn't encounter an error message with ReClosureBound. - ty::ReClosureBound(..) => { - bug!("encountered unexpected ReClosureBound: {:?}", region,); - } - }; + // We shouldn't encounter an error message with ReClosureBound. + ty::ReClosureBound(..) => { + bug!("encountered unexpected ReClosureBound: {:?}", region,); + } + }; - TyCtxt::emit_msg_span(err, prefix, description, span, suffix); - } + emit_msg_span(err, prefix, description, span, suffix); +} - pub fn note_and_explain_free_region( - self, - err: &mut DiagnosticBuilder<'_>, - prefix: &str, - region: ty::Region<'tcx>, - suffix: &str, - ) { - let (description, span) = self.msg_span_from_free_region(region); +pub(super) fn note_and_explain_free_region( + tcx: TyCtxt<'tcx>, + err: &mut DiagnosticBuilder<'_>, + prefix: &str, + region: ty::Region<'tcx>, + suffix: &str, +) { + let (description, span) = msg_span_from_free_region(tcx, region); - TyCtxt::emit_msg_span(err, prefix, description, span, suffix); - } + emit_msg_span(err, prefix, description, span, suffix); +} - fn msg_span_from_free_region(self, region: ty::Region<'tcx>) -> (String, Option) { - match *region { - ty::ReEarlyBound(_) | ty::ReFree(_) => { - self.msg_span_from_early_bound_and_free_regions(region) - } - ty::ReStatic => ("the static lifetime".to_owned(), None), - ty::ReEmpty => ("an empty lifetime".to_owned(), None), - _ => bug!("{:?}", region), +fn msg_span_from_free_region( + tcx: TyCtxt<'tcx>, + region: ty::Region<'tcx>, +) -> (String, Option) { + match *region { + ty::ReEarlyBound(_) | ty::ReFree(_) => { + msg_span_from_early_bound_and_free_regions(tcx, region) } + ty::ReStatic => ("the static lifetime".to_owned(), None), + ty::ReEmpty => ("an empty lifetime".to_owned(), None), + _ => bug!("{:?}", region), } +} - fn msg_span_from_early_bound_and_free_regions( - self, - region: ty::Region<'tcx>, - ) -> (String, Option) { - let cm = self.sess.source_map(); - - let scope = region.free_region_binding_scope(self); - let node = self.hir().as_local_hir_id(scope).unwrap_or(hir::DUMMY_HIR_ID); - let tag = match self.hir().find(node) { - Some(Node::Block(_)) | Some(Node::Expr(_)) => "body", - Some(Node::Item(it)) => Self::item_scope_tag(&it), - Some(Node::TraitItem(it)) => Self::trait_item_scope_tag(&it), - Some(Node::ImplItem(it)) => Self::impl_item_scope_tag(&it), - _ => unreachable!(), - }; - let (prefix, span) = match *region { - ty::ReEarlyBound(ref br) => { - let mut sp = cm.def_span(self.hir().span(node)); - if let Some(param) = self.hir() - .get_generics(scope) - .and_then(|generics| generics.get_named(br.name)) - { - sp = param.span; - } - (format!("the lifetime `{}` as defined on", br.name), sp) +fn msg_span_from_early_bound_and_free_regions( + tcx: TyCtxt<'tcx>, + region: ty::Region<'tcx>, +) -> (String, Option) { + let cm = tcx.sess.source_map(); + + let scope = region.free_region_binding_scope(tcx); + let node = tcx.hir().as_local_hir_id(scope).unwrap_or(hir::DUMMY_HIR_ID); + let tag = match tcx.hir().find(node) { + Some(Node::Block(_)) | Some(Node::Expr(_)) => "body", + Some(Node::Item(it)) => item_scope_tag(&it), + Some(Node::TraitItem(it)) => trait_item_scope_tag(&it), + Some(Node::ImplItem(it)) => impl_item_scope_tag(&it), + _ => unreachable!(), + }; + let (prefix, span) = match *region { + ty::ReEarlyBound(ref br) => { + let mut sp = cm.def_span(tcx.hir().span(node)); + if let Some(param) = + tcx.hir().get_generics(scope).and_then(|generics| generics.get_named(br.name)) + { + sp = param.span; } - ty::ReFree(ty::FreeRegion { - bound_region: ty::BoundRegion::BrNamed(_, name), - .. - }) => { - let mut sp = cm.def_span(self.hir().span(node)); - if let Some(param) = self.hir() - .get_generics(scope) - .and_then(|generics| generics.get_named(name)) - { - sp = param.span; - } - (format!("the lifetime `{}` as defined on", name), sp) - } - ty::ReFree(ref fr) => match fr.bound_region { - ty::BrAnon(idx) => ( - format!("the anonymous lifetime #{} defined on", idx + 1), - self.hir().span(node), - ), - _ => ( - format!("the lifetime `{}` as defined on", region), - cm.def_span(self.hir().span(node)), - ), - }, - _ => bug!(), - }; - let (msg, opt_span) = self.explain_span(tag, span); - (format!("{} {}", prefix, msg), opt_span) - } - - fn emit_msg_span( - err: &mut DiagnosticBuilder<'_>, - prefix: &str, - description: String, - span: Option, - suffix: &str, - ) { - let message = format!("{}{}{}", prefix, description, suffix); - - if let Some(span) = span { - err.span_note(span, &message); - } else { - err.note(&message); + (format!("the lifetime `{}` as defined on", br.name), sp) } - } - - fn item_scope_tag(item: &hir::Item) -> &'static str { - match item.kind { - hir::ItemKind::Impl(..) => "impl", - hir::ItemKind::Struct(..) => "struct", - hir::ItemKind::Union(..) => "union", - hir::ItemKind::Enum(..) => "enum", - hir::ItemKind::Trait(..) => "trait", - hir::ItemKind::Fn(..) => "function body", - _ => "item", + ty::ReFree(ty::FreeRegion { bound_region: ty::BoundRegion::BrNamed(_, name), .. }) => { + let mut sp = cm.def_span(tcx.hir().span(node)); + if let Some(param) = + tcx.hir().get_generics(scope).and_then(|generics| generics.get_named(name)) + { + sp = param.span; + } + (format!("the lifetime `{}` as defined on", name), sp) } + ty::ReFree(ref fr) => match fr.bound_region { + ty::BrAnon(idx) => { + (format!("the anonymous lifetime #{} defined on", idx + 1), tcx.hir().span(node)) + } + _ => ( + format!("the lifetime `{}` as defined on", region), + cm.def_span(tcx.hir().span(node)), + ), + }, + _ => bug!(), + }; + let (msg, opt_span) = explain_span(tcx, tag, span); + (format!("{} {}", prefix, msg), opt_span) +} + +fn emit_msg_span( + err: &mut DiagnosticBuilder<'_>, + prefix: &str, + description: String, + span: Option, + suffix: &str, +) { + let message = format!("{}{}{}", prefix, description, suffix); + + if let Some(span) = span { + err.span_note(span, &message); + } else { + err.note(&message); } +} - fn trait_item_scope_tag(item: &hir::TraitItem) -> &'static str { - match item.kind { - hir::TraitItemKind::Method(..) => "method body", - hir::TraitItemKind::Const(..) | hir::TraitItemKind::Type(..) => "associated item", - } +fn item_scope_tag(item: &hir::Item<'_>) -> &'static str { + match item.kind { + hir::ItemKind::Impl { .. } => "impl", + hir::ItemKind::Struct(..) => "struct", + hir::ItemKind::Union(..) => "union", + hir::ItemKind::Enum(..) => "enum", + hir::ItemKind::Trait(..) => "trait", + hir::ItemKind::Fn(..) => "function body", + _ => "item", } +} - fn impl_item_scope_tag(item: &hir::ImplItem) -> &'static str { - match item.kind { - hir::ImplItemKind::Method(..) => "method body", - hir::ImplItemKind::Const(..) - | hir::ImplItemKind::OpaqueTy(..) - | hir::ImplItemKind::TyAlias(..) => "associated item", - } +fn trait_item_scope_tag(item: &hir::TraitItem<'_>) -> &'static str { + match item.kind { + hir::TraitItemKind::Method(..) => "method body", + hir::TraitItemKind::Const(..) | hir::TraitItemKind::Type(..) => "associated item", } +} - fn explain_span(self, heading: &str, span: Span) -> (String, Option) { - let lo = self.sess.source_map().lookup_char_pos(span.lo()); - ( - format!("the {} at {}:{}", heading, lo.line, lo.col.to_usize() + 1), - Some(span), - ) +fn impl_item_scope_tag(item: &hir::ImplItem<'_>) -> &'static str { + match item.kind { + hir::ImplItemKind::Method(..) => "method body", + hir::ImplItemKind::Const(..) + | hir::ImplItemKind::OpaqueTy(..) + | hir::ImplItemKind::TyAlias(..) => "associated item", } } +fn explain_span(tcx: TyCtxt<'tcx>, heading: &str, span: Span) -> (String, Option) { + let lo = tcx.sess.source_map().lookup_char_pos(span.lo()); + (format!("the {} at {}:{}", heading, lo.line, lo.col.to_usize() + 1), Some(span)) +} + impl<'a, 'tcx> InferCtxt<'a, 'tcx> { pub fn report_region_errors( &self, @@ -310,10 +305,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // together into a `ProcessedErrors` group: let errors = self.process_errors(errors); - debug!( - "report_region_errors: {} errors after preprocessing", - errors.len() - ); + debug!("report_region_errors: {} errors after preprocessing", errors.len()); for error in errors { debug!("report_region_errors: error = {:?}", error); @@ -362,7 +354,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { sub_r, sup_r, ) - .emit(); + .emit(); } else if sup_r.is_placeholder() { self.report_placeholder_failure( region_scope_tree, @@ -370,7 +362,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { sub_r, sup_r, ) - .emit(); + .emit(); } else { self.report_sub_sup_conflict( region_scope_tree, @@ -397,7 +389,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { opaque_type_def_id, hidden_ty, member_region, - ).emit(); + ) + .emit(); } } } @@ -435,18 +428,14 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { let is_bound_failure = |e: &RegionResolutionError<'tcx>| match *e { RegionResolutionError::GenericBoundFailure(..) => true, RegionResolutionError::ConcreteFailure(..) - | RegionResolutionError::SubSupConflict(..) - | RegionResolutionError::MemberConstraintFailure { .. } => false, + | RegionResolutionError::SubSupConflict(..) + | RegionResolutionError::MemberConstraintFailure { .. } => false, }; let mut errors = if errors.iter().all(|e| is_bound_failure(e)) { errors.clone() } else { - errors - .iter() - .filter(|&e| !is_bound_failure(e)) - .cloned() - .collect() + errors.iter().filter(|&e| !is_bound_failure(e)).cloned().collect() }; // sort the errors by span, for better error message stability. @@ -466,7 +455,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { terr: &TypeError<'tcx>, ) { use hir::def_id::CrateNum; - use hir::map::DisambiguatedDefPathData; + use map::DisambiguatedDefPathData; use ty::print::Printer; use ty::subst::GenericArg; @@ -489,17 +478,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { self.tcx } - fn print_region( - self, - _region: ty::Region<'_>, - ) -> Result { + fn print_region(self, _region: ty::Region<'_>) -> Result { Err(NonTrivialPath) } - fn print_type( - self, - _ty: Ty<'tcx>, - ) -> Result { + fn print_type(self, _ty: Ty<'tcx>) -> Result { Err(NonTrivialPath) } @@ -510,17 +493,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { Err(NonTrivialPath) } - fn print_const( - self, - _ct: &'tcx ty::Const<'tcx>, - ) -> Result { + fn print_const(self, _ct: &'tcx ty::Const<'tcx>) -> Result { Err(NonTrivialPath) } - fn path_crate( - self, - cnum: CrateNum, - ) -> Result { + fn path_crate(self, cnum: CrateNum) -> Result { Ok(vec![self.tcx.original_crate_name(cnum).to_string()]) } fn path_qualified( @@ -562,18 +539,14 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // Only external crates, if either is from a local // module we could have false positives if !(did1.is_local() || did2.is_local()) && did1.krate != did2.krate { - let abs_path = |def_id| { - AbsolutePathPrinter { tcx: self.tcx } - .print_def_path(def_id, &[]) - }; + let abs_path = + |def_id| AbsolutePathPrinter { tcx: self.tcx }.print_def_path(def_id, &[]); // We compare strings because DefPath can be different // for imported and non-imported crates let same_path = || -> Result<_, NonTrivialPath> { - Ok( - self.tcx.def_path_str(did1) == self.tcx.def_path_str(did2) || - abs_path(did1)? == abs_path(did2)? - ) + Ok(self.tcx.def_path_str(did1) == self.tcx.def_path_str(did2) + || abs_path(did1)? == abs_path(did2)?) }; if same_path().unwrap_or(false) { let crate_name = self.tcx.crate_name(did1.krate); @@ -588,8 +561,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { TypeError::Sorts(ref exp_found) => { // if they are both "path types", there's a chance of ambiguity // due to different versions of the same crate - if let (&ty::Adt(exp_adt, _), &ty::Adt(found_adt, _)) - = (&exp_found.expected.kind, &exp_found.found.kind) + if let (&ty::Adt(exp_adt, _), &ty::Adt(found_adt, _)) = + (&exp_found.expected.kind, &exp_found.found.kind) { report_path_match(err, exp_adt.did, found_adt.did); } @@ -608,9 +581,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { exp_found: Option>>, ) { match cause.code { - ObligationCauseCode::MatchExpressionArmPattern { span, ty } => { - if ty.is_suggestable() { // don't show type `_` - err.span_label(span, format!("this match expression has type `{}`", ty)); + ObligationCauseCode::Pattern { origin_expr: true, span: Some(span), root_ty } => { + let ty = self.resolve_vars_if_possible(&root_ty); + if ty.is_suggestable() { + // don't show type `_` + err.span_label(span, format!("this expression has type `{}`", ty)); } if let Some(ty::error::ExpectedFound { found, .. }) = exp_found { if ty.is_box() && ty.boxed_ty() == found { @@ -625,11 +600,14 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } } } + ObligationCauseCode::Pattern { origin_expr: false, span: Some(span), .. } => { + err.span_label(span, "expected due to this"); + } ObligationCauseCode::MatchExpressionArm(box MatchExpressionArmCause { source, ref prior_arms, last_ty, - discrim_hir_id, + scrut_hir_id, .. }) => match source { hir::MatchSource::IfLetDesugar { .. } => { @@ -638,17 +616,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } hir::MatchSource::TryDesugar => { if let Some(ty::error::ExpectedFound { expected, .. }) = exp_found { - let discrim_expr = self.tcx.hir().expect_expr(discrim_hir_id); - let discrim_ty = if let hir::ExprKind::Call(_, args) = &discrim_expr.kind { + let scrut_expr = self.tcx.hir().expect_expr(scrut_hir_id); + let scrut_ty = if let hir::ExprKind::Call(_, args) = &scrut_expr.kind { let arg_expr = args.first().expect("try desugaring call w/out arg"); - self.in_progress_tables.and_then(|tables| { - tables.borrow().expr_ty_opt(arg_expr) - }) + self.in_progress_tables + .and_then(|tables| tables.borrow().expr_ty_opt(arg_expr)) } else { - bug!("try desugaring w/out call expr as discriminant"); + bug!("try desugaring w/out call expr as scrutinee"); }; - match discrim_ty { + match scrut_ty { Some(ty) if expected == ty => { let source_map = self.tcx.sess.source_map(); err.span_suggestion( @@ -657,8 +634,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { "".to_string(), Applicability::MachineApplicable, ); - }, - _ => {}, + } + _ => {} } } } @@ -672,7 +649,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { err.span_label(cause.span, msg); if prior_arms.len() <= 4 { for sp in prior_arms { - err.span_label( *sp, format!("this is found to be of type `{}`", t)); + err.span_label(*sp, format!("this is found to be of type `{}`", t)); } } else if let Some(sp) = prior_arms.last() { err.span_label( @@ -684,7 +661,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { }, ObligationCauseCode::IfExpression(box IfExpressionCause { then, outer, semicolon }) => { err.span_label(then, "expected because of this"); - outer.map(|sp| err.span_label(sp, "if and else have incompatible types")); + outer.map(|sp| err.span_label(sp, "`if` and `else` have incompatible types")); if let Some(sp) = semicolon { err.span_suggestion_short( sp, @@ -729,14 +706,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } // Output the lifetimes for the first type - let lifetimes = sub.regions() + let lifetimes = sub + .regions() .map(|lifetime| { let s = lifetime.to_string(); - if s.is_empty() { - "'_".to_string() - } else { - s - } + if s.is_empty() { "'_".to_string() } else { s } }) .collect::>() .join(", "); @@ -836,11 +810,18 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { ) -> SubstsRef<'tcx> { let generics = self.tcx.generics_of(def_id); let mut num_supplied_defaults = 0; - let mut type_params = generics.params.iter().rev().filter_map(|param| match param.kind { - ty::GenericParamDefKind::Lifetime => None, - ty::GenericParamDefKind::Type { has_default, .. } => Some((param.def_id, has_default)), - ty::GenericParamDefKind::Const => None, // FIXME(const_generics:defaults) - }).peekable(); + let mut type_params = generics + .params + .iter() + .rev() + .filter_map(|param| match param.kind { + ty::GenericParamDefKind::Lifetime => None, + ty::GenericParamDefKind::Type { has_default, .. } => { + Some((param.def_id, has_default)) + } + ty::GenericParamDefKind::Const => None, // FIXME(const_generics:defaults) + }) + .peekable(); let has_default = { let has_default = type_params.peek().map(|(_, has_default)| has_default); *has_default.unwrap_or(&false) @@ -870,17 +851,13 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { sig2: &ty::PolyFnSig<'tcx>, ) -> (DiagnosticStyledString, DiagnosticStyledString) { let get_lifetimes = |sig| { - use crate::hir::def::Namespace; + use rustc_hir::def::Namespace; let mut s = String::new(); let (_, (sig, reg)) = ty::print::FmtPrinter::new(self.tcx, &mut s, Namespace::TypeNS) .name_all_regions(sig) .unwrap(); let lts: Vec = reg.into_iter().map(|(_, kind)| kind.to_string()).collect(); - (if lts.is_empty() { - String::new() - } else { - format!("for<{}> ", lts.join(", ")) - }, sig) + (if lts.is_empty() { String::new() } else { format!("for<{}> ", lts.join(", ")) }, sig) }; let (lt1, sig1) = get_lifetimes(sig1); @@ -1058,11 +1035,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { fn lifetime_display(lifetime: Region<'_>) -> String { let s = lifetime.to_string(); - if s.is_empty() { - "'_".to_string() - } else { - s - } + if s.is_empty() { "'_".to_string() } else { s } } // At one point we'd like to elide all lifetimes here, they are irrelevant for // all diagnostics that use this output @@ -1137,14 +1110,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // Foo // ------- this type argument is exactly the same as the other type // Bar - if self.cmp_type_arg( - &mut values.0, - &mut values.1, - path1.clone(), - sub_no_defaults_1, - path2.clone(), - &t2, - ).is_some() + if self + .cmp_type_arg( + &mut values.0, + &mut values.1, + path1.clone(), + sub_no_defaults_1, + path2.clone(), + &t2, + ) + .is_some() { return values; } @@ -1153,14 +1128,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // Bar // Foo> // ------- this type argument is exactly the same as the other type - if self.cmp_type_arg( - &mut values.1, - &mut values.0, - path2, - sub_no_defaults_2, - path1, - &t1, - ).is_some() + if self + .cmp_type_arg( + &mut values.1, + &mut values.0, + path2, + sub_no_defaults_2, + path1, + &t1, + ) + .is_some() { return values; } @@ -1177,14 +1154,15 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { const SEPARATOR: &str = "::"; let separator_len = SEPARATOR.len(); - let split_idx: usize = - t1_str.split(SEPARATOR) - .zip(t2_str.split(SEPARATOR)) - .take_while(|(mod1_str, mod2_str)| mod1_str == mod2_str) - .map(|(mod_str, _)| mod_str.len() + separator_len) - .sum(); - - debug!("cmp: separator_len={}, split_idx={}, min_len={}", + let split_idx: usize = t1_str + .split(SEPARATOR) + .zip(t2_str.split(SEPARATOR)) + .take_while(|(mod1_str, mod2_str)| mod1_str == mod2_str) + .map(|(mod_str, _)| mod_str.len() + separator_len) + .sum(); + + debug!( + "cmp: separator_len={}, split_idx={}, min_len={}", separator_len, split_idx, min_len ); @@ -1192,7 +1170,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // paths are identical, highlight everything ( DiagnosticStyledString::highlighted(t1_str), - DiagnosticStyledString::highlighted(t2_str) + DiagnosticStyledString::highlighted(t2_str), ) } else { let (common, uniq1) = t1_str.split_at(split_idx); @@ -1235,10 +1213,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // When encountering tuples of the same size, highlight only the differing types (&ty::Tuple(substs1), &ty::Tuple(substs2)) if substs1.len() == substs2.len() => { - let mut values = ( - DiagnosticStyledString::normal("("), - DiagnosticStyledString::normal("("), - ); + let mut values = + (DiagnosticStyledString::normal("("), DiagnosticStyledString::normal("(")); let len = substs1.len(); for (i, (left, right)) in substs1.types().zip(substs2.types()).enumerate() { let (x1, x2) = self.cmp(left, right); @@ -1246,7 +1222,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { (values.1).0.extend(x2.0); self.push_comma(&mut values.0, &mut values.1, len, i); } - if len == 1 { // Keep the output for single element tuples as `(ty,)`. + if len == 1 { + // Keep the output for single element tuples as `(ty,)`. values.0.push_normal(","); values.1.push_normal(","); } @@ -1272,8 +1249,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { let mut values = self.cmp_fn_sig(&sig1, sig2); values.0.push_normal(format!( " {{{}}}", - self.tcx.def_path_str_with_substs(*did1, substs1)), - ); + self.tcx.def_path_str_with_substs(*did1, substs1) + )); values } @@ -1282,22 +1259,17 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { let mut values = self.cmp_fn_sig(sig1, &sig2); values.1.push_normal(format!( " {{{}}}", - self.tcx.def_path_str_with_substs(*did2, substs2)), - ); + self.tcx.def_path_str_with_substs(*did2, substs2) + )); values } - (ty::FnPtr(sig1), ty::FnPtr(sig2)) => { - self.cmp_fn_sig(sig1, sig2) - } + (ty::FnPtr(sig1), ty::FnPtr(sig2)) => self.cmp_fn_sig(sig1, sig2), _ => { if t1 == t2 { // The two types are the same, elide and don't highlight. - ( - DiagnosticStyledString::normal("_"), - DiagnosticStyledString::normal("_"), - ) + (DiagnosticStyledString::normal("_"), DiagnosticStyledString::normal("_")) } else { // We couldn't find anything in common, highlight everything. ( @@ -1317,6 +1289,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { mut values: Option>, terr: &TypeError<'tcx>, ) { + let span = cause.span(self.tcx); + // For some types of errors, expected-found does not make // sense, so just ignore the values we were given. match terr { @@ -1326,14 +1300,115 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { _ => {} } + struct OpaqueTypesVisitor<'tcx> { + types: FxHashMap>, + expected: FxHashMap>, + found: FxHashMap>, + ignore_span: Span, + tcx: TyCtxt<'tcx>, + } + + impl<'tcx> OpaqueTypesVisitor<'tcx> { + fn visit_expected_found( + tcx: TyCtxt<'tcx>, + expected: Ty<'tcx>, + found: Ty<'tcx>, + ignore_span: Span, + ) -> Self { + let mut types_visitor = OpaqueTypesVisitor { + types: Default::default(), + expected: Default::default(), + found: Default::default(), + ignore_span, + tcx, + }; + // The visitor puts all the relevant encountered types in `self.types`, but in + // here we want to visit two separate types with no relation to each other, so we + // move the results from `types` to `expected` or `found` as appropriate. + expected.visit_with(&mut types_visitor); + std::mem::swap(&mut types_visitor.expected, &mut types_visitor.types); + found.visit_with(&mut types_visitor); + std::mem::swap(&mut types_visitor.found, &mut types_visitor.types); + types_visitor + } + + fn report(&self, err: &mut DiagnosticBuilder<'_>) { + self.add_labels_for_types(err, "expected", &self.expected); + self.add_labels_for_types(err, "found", &self.found); + } + + fn add_labels_for_types( + &self, + err: &mut DiagnosticBuilder<'_>, + target: &str, + types: &FxHashMap>, + ) { + for (key, values) in types.iter() { + let count = values.len(); + let kind = key.descr(); + for sp in values { + err.span_label( + *sp, + format!( + "{}{}{} {}{}", + if sp.is_desugaring(DesugaringKind::Async) { + "the `Output` of this `async fn`'s " + } else if count == 1 { + "the " + } else { + "" + }, + if count > 1 { "one of the " } else { "" }, + target, + kind, + pluralize!(count), + ), + ); + } + } + } + } + + impl<'tcx> ty::fold::TypeVisitor<'tcx> for OpaqueTypesVisitor<'tcx> { + fn visit_ty(&mut self, t: Ty<'tcx>) -> bool { + if let Some((kind, def_id)) = TyCategory::from_ty(t) { + let span = self.tcx.def_span(def_id); + // Avoid cluttering the output when the "found" and error span overlap: + // + // error[E0308]: mismatched types + // --> $DIR/issue-20862.rs:2:5 + // | + // LL | |y| x + y + // | ^^^^^^^^^ + // | | + // | the found closure + // | expected `()`, found closure + // | + // = note: expected unit type `()` + // found closure `[closure@$DIR/issue-20862.rs:2:5: 2:14 x:_]` + if !self.ignore_span.overlaps(span) { + self.types.entry(kind).or_default().insert(span); + } + } + t.super_visit_with(self) + } + } + debug!("note_type_err(diag={:?})", diag); let (expected_found, exp_found, is_simple_error) = match values { None => (None, None, false), Some(values) => { let (is_simple_error, exp_found) = match values { ValuePairs::Types(exp_found) => { - let is_simple_err = exp_found.expected.is_simple_text() - && exp_found.found.is_simple_text(); + let is_simple_err = + exp_found.expected.is_simple_text() && exp_found.found.is_simple_text(); + OpaqueTypesVisitor::visit_expected_found( + self.tcx, + exp_found.expected, + exp_found.found, + span, + ) + .report(diag); (is_simple_err, Some(exp_found)) } @@ -1351,8 +1426,6 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } }; - let span = cause.span(self.tcx); - // Ignore msg for object safe coercion // since E0038 message will be printed match terr { @@ -1364,7 +1437,6 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } } }; - if let Some((expected, found)) = expected_found { let expected_label = exp_found.map_or("type".into(), |ef| ef.expected.prefix_string()); let found_label = exp_found.map_or("type".into(), |ef| ef.found.prefix_string()); @@ -1373,14 +1445,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { let sort_string = |ty: Ty<'tcx>| match (extra, &ty.kind) { (true, ty::Opaque(def_id, _)) => format!( " (opaque type at {})", - self.tcx.sess.source_map() + self.tcx + .sess + .source_map() .mk_substr_filename(self.tcx.def_span(*def_id)), ), (true, _) => format!(" ({})", ty.sort_string(self.tcx)), (false, _) => "".to_string(), }; - if !(values.expected.is_simple_text() && values.found.is_simple_text()) || ( - exp_found.map_or(false, |ef| { + if !(values.expected.is_simple_text() && values.found.is_simple_text()) + || (exp_found.map_or(false, |ef| { // This happens when the type error is a subset of the expectation, // like when you have two references but one is `usize` and the other // is `f32`. In those cases we still want to show the `note`. If the @@ -1392,8 +1466,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } else { false } - }) - ) { + })) + { diag.note_expected_found_extra( &expected_label, expected, @@ -1426,8 +1500,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // it's a actual definition. According to the comments (e.g. in // librustc_typeck/check/compare_method.rs:compare_predicate_entailment) the latter // is relied upon by some other code. This might (or might not) need cleanup. - let body_owner_def_id = self.tcx.hir().opt_local_def_id(cause.body_id) - .unwrap_or_else(|| { + let body_owner_def_id = + self.tcx.hir().opt_local_def_id(cause.body_id).unwrap_or_else(|| { self.tcx.hir().body_owner_def_id(hir::BodyId { hir_id: cause.body_id }) }); self.check_and_note_conflicting_crates(diag, terr); @@ -1461,22 +1535,22 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { ("std::result::Result", result_msg), ("core::result::Result", result_msg), ]; - if let Some(msg) = have_as_ref.iter() - .filter_map(|(path, msg)| if &path_str == path { - Some(msg) - } else { - None - }).next() + if let Some(msg) = have_as_ref + .iter() + .filter_map( + |(path, msg)| if &path_str == path { Some(msg) } else { None }, + ) + .next() { let mut show_suggestion = true; for (exp_ty, found_ty) in exp_substs.types().zip(found_substs.types()) { match exp_ty.kind { ty::Ref(_, exp_ty, _) => { match (&exp_ty.kind, &found_ty.kind) { - (_, ty::Param(_)) | - (_, ty::Infer(_)) | - (ty::Param(_), _) | - (ty::Infer(_), _) => {} + (_, ty::Param(_)) + | (_, ty::Infer(_)) + | (ty::Param(_), _) + | (ty::Infer(_), _) => {} _ if ty::TyS::same_type(exp_ty, found_ty) => {} _ => show_suggestion = false, }; @@ -1485,10 +1559,9 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { _ => show_suggestion = false, } } - if let (Ok(snippet), true) = ( - self.tcx.sess.source_map().span_to_snippet(span), - show_suggestion, - ) { + if let (Ok(snippet), true) = + (self.tcx.sess.source_map().span_to_snippet(span), show_suggestion) + { diag.span_suggestion( span, msg, @@ -1509,17 +1582,14 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { trace: TypeTrace<'tcx>, terr: &TypeError<'tcx>, ) -> DiagnosticBuilder<'tcx> { - debug!( - "report_and_explain_type_error(trace={:?}, terr={:?})", - trace, terr - ); + debug!("report_and_explain_type_error(trace={:?}, terr={:?})", trace, terr); let span = trace.cause.span(self.tcx); let failure_code = trace.cause.as_failure_code(terr); let mut diag = match failure_code { FailureCode::Error0038(did) => { - let violations = self.tcx.object_safety_violations(did); - self.tcx.report_object_safety_error(span, did, violations) + let violations = object_safety_violations(self.tcx, did); + report_object_safety_error(self.tcx, span, did, violations) } FailureCode::Error0317(failure_str) => { struct_span_err!(self.tcx.sess, span, E0317, "{}", failure_str) @@ -1549,17 +1619,17 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { infer::TraitRefs(ref exp_found) => { let pretty_exp_found = ty::error::ExpectedFound { expected: exp_found.expected.print_only_trait_path(), - found: exp_found.found.print_only_trait_path() + found: exp_found.found.print_only_trait_path(), }; self.expected_found_str(&pretty_exp_found) - }, + } infer::PolyTraitRefs(ref exp_found) => { let pretty_exp_found = ty::error::ExpectedFound { expected: exp_found.expected.print_only_trait_path(), - found: exp_found.found.print_only_trait_path() + found: exp_found.found.print_only_trait_path(), }; self.expected_found_str(&pretty_exp_found) - }, + } } } @@ -1636,7 +1706,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // `T:` when appropriate let is_impl_trait = bound_kind.to_string().starts_with("impl "); let sp = if has_bounds && !is_impl_trait { - sp.to(self.tcx + sp.to(self + .tcx .sess .source_map() .next_point(self.tcx.sess.source_map().next_point(sp))) @@ -1707,11 +1778,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } let mut err = match *sub { - ty::ReEarlyBound(_) - | ty::ReFree(ty::FreeRegion { - bound_region: ty::BrNamed(..), - .. - }) => { + ty::ReEarlyBound(ty::EarlyBoundRegion { name, .. }) + | ty::ReFree(ty::FreeRegion { bound_region: ty::BrNamed(_, name), .. }) => { // Does the required lifetime have a nice name we can print? let mut err = struct_span_err!( self.tcx.sess, @@ -1720,7 +1788,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { "{} may not live long enough", labeled_user_string ); - binding_suggestion(&mut err, type_param_span, bound_kind, sub); + // Explicitely use the name instead of `sub`'s `Display` impl. The `Display` impl + // for the bound is not suitable for suggestions when `-Zverbose` is set because it + // uses `Debug` output, so we handle it specially here so that suggestions are + // always correct. + binding_suggestion(&mut err, type_param_span, bound_kind, name); err } @@ -1750,7 +1822,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { "consider adding an explicit lifetime bound for `{}`", bound_kind )); - self.tcx.note_and_explain_region( + note_and_explain_region( + self.tcx, region_scope_tree, &mut err, &format!("{} must be valid for ", labeled_user_string), @@ -1778,7 +1851,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { ) { let mut err = self.report_inference_failure(var_origin); - self.tcx.note_and_explain_region( + note_and_explain_region( + self.tcx, region_scope_tree, &mut err, "first, the lifetime cannot outlive ", @@ -1798,29 +1872,24 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { debug!("report_sub_sup_conflict: sup_trace.values={:?}", sup_trace.values); debug!("report_sub_sup_conflict: sub_trace.values={:?}", sub_trace.values); - if let (Some((sup_expected, sup_found)), Some((sub_expected, sub_found))) = ( - self.values_str(&sup_trace.values), - self.values_str(&sub_trace.values), - ) { + if let (Some((sup_expected, sup_found)), Some((sub_expected, sub_found))) = + (self.values_str(&sup_trace.values), self.values_str(&sub_trace.values)) + { if sub_expected == sup_expected && sub_found == sup_found { - self.tcx.note_and_explain_region( + note_and_explain_region( + self.tcx, region_scope_tree, &mut err, "...but the lifetime must also be valid for ", sub_region, "...", ); - err.span_note(sup_trace.cause.span, &format!( - "...so that the {}", - sup_trace.cause.as_requirement_str() - )); - - err.note_expected_found( - &"", - sup_expected, - &"", - sup_found + err.span_note( + sup_trace.cause.span, + &format!("...so that the {}", sup_trace.cause.as_requirement_str()), ); + + err.note_expected_found(&"", sup_expected, &"", sup_found); err.emit(); return; } @@ -1831,7 +1900,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { self.note_region_origin(&mut err, &sup_origin); - self.tcx.note_and_explain_region( + note_and_explain_region( + self.tcx, region_scope_tree, &mut err, "but, the lifetime must be valid for ", @@ -1912,19 +1982,22 @@ impl<'tcx> ObligationCause<'tcx> { use crate::traits::ObligationCauseCode::*; match self.code { CompareImplMethodObligation { .. } => Error0308("method not compatible with trait"), - MatchExpressionArm(box MatchExpressionArmCause { source, .. }) => + CompareImplTypeObligation { .. } => Error0308("type not compatible with trait"), + MatchExpressionArm(box MatchExpressionArmCause { source, .. }) => { Error0308(match source { - hir::MatchSource::IfLetDesugar { .. } => - "`if let` arms have incompatible types", + hir::MatchSource::IfLetDesugar { .. } => { + "`if let` arms have incompatible types" + } hir::MatchSource::TryDesugar => { "try expression alternatives have incompatible types" } - _ => "match arms have incompatible types", - }), - IfExpression { .. } => Error0308("if and else have incompatible types"), - IfExpressionWithNoElse => Error0317("if may be missing an else clause"), - MainFunctionType => Error0580("main function has wrong type"), - StartFunctionType => Error0308("start function has wrong type"), + _ => "`match` arms have incompatible types", + }) + } + IfExpression { .. } => Error0308("`if` and `else` have incompatible types"), + IfExpressionWithNoElse => Error0317("`if` may be missing an `else` clause"), + MainFunctionType => Error0580("`main` function has wrong type"), + StartFunctionType => Error0308("`#[start]` function has wrong type"), IntrinsicType => Error0308("intrinsic has wrong type"), MethodReceiver => Error0308("mismatched `self` parameter type"), @@ -1938,7 +2011,7 @@ impl<'tcx> ObligationCause<'tcx> { TypeError::IntrinsicCast => { Error0308("cannot coerce intrinsics to function pointers") } - TypeError::ObjectUnsafeCoercion(did) => Error0038(did.clone()), + TypeError::ObjectUnsafeCoercion(did) => Error0038(*did), _ => Error0308("mismatched types"), }, } @@ -1948,18 +2021,50 @@ impl<'tcx> ObligationCause<'tcx> { use crate::traits::ObligationCauseCode::*; match self.code { CompareImplMethodObligation { .. } => "method type is compatible with trait", + CompareImplTypeObligation { .. } => "associated type is compatible with trait", ExprAssignable => "expression is assignable", MatchExpressionArm(box MatchExpressionArmCause { source, .. }) => match source { hir::MatchSource::IfLetDesugar { .. } => "`if let` arms have compatible types", - _ => "match arms have compatible types", + _ => "`match` arms have compatible types", }, - IfExpression { .. } => "if and else have incompatible types", - IfExpressionWithNoElse => "if missing an else returns ()", + IfExpression { .. } => "`if` and `else` have incompatible types", + IfExpressionWithNoElse => "`if` missing an `else` returns `()`", MainFunctionType => "`main` function has the correct type", - StartFunctionType => "`start` function has the correct type", + StartFunctionType => "`#[start]` function has the correct type", IntrinsicType => "intrinsic has the correct type", MethodReceiver => "method receiver has the correct type", _ => "types are compatible", } } } + +/// This is a bare signal of what kind of type we're dealing with. `ty::TyKind` tracks +/// extra information about each type, but we only care about the category. +#[derive(Clone, Copy, PartialEq, Eq, Hash)] +crate enum TyCategory { + Closure, + Opaque, + Generator, + Foreign, +} + +impl TyCategory { + fn descr(&self) -> &'static str { + match self { + Self::Closure => "closure", + Self::Opaque => "opaque type", + Self::Generator => "generator", + Self::Foreign => "foreign type", + } + } + + pub fn from_ty(ty: Ty<'_>) -> Option<(Self, DefId)> { + match ty.kind { + ty::Closure(def_id, _) => Some((Self::Closure, def_id)), + ty::Opaque(def_id, _) => Some((Self::Opaque, def_id)), + ty::Generator(def_id, ..) => Some((Self::Generator, def_id)), + ty::Foreign(def_id) => Some((Self::Foreign, def_id)), + _ => None, + } + } +} diff --git a/src/librustc/infer/error_reporting/need_type_info.rs b/src/librustc/infer/error_reporting/need_type_info.rs index 8878683f3a..9947dea234 100644 --- a/src/librustc/infer/error_reporting/need_type_info.rs +++ b/src/librustc/infer/error_reporting/need_type_info.rs @@ -1,35 +1,31 @@ -use crate::hir::def::{DefKind, Namespace}; -use crate::hir::{self, Body, FunctionRetTy, Expr, ExprKind, HirId, Local, Pat}; -use crate::hir::intravisit::{self, Visitor, NestedVisitorMap}; -use crate::infer::InferCtxt; +use crate::hir::map::Map; use crate::infer::type_variable::TypeVariableOriginKind; -use crate::ty::{self, Ty, Infer, TyVar}; +use crate::infer::InferCtxt; use crate::ty::print::Print; -use syntax::source_map::DesugaringKind; -use syntax::symbol::kw; -use syntax_pos::Span; -use errors::{Applicability, DiagnosticBuilder}; +use crate::ty::{self, DefIdTree, Infer, Ty, TyVar}; +use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder}; +use rustc_hir as hir; +use rustc_hir::def::{DefKind, Namespace}; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_hir::{Body, Expr, ExprKind, FunctionRetTy, HirId, Local, Pat}; +use rustc_span::source_map::DesugaringKind; +use rustc_span::symbol::kw; +use rustc_span::Span; use std::borrow::Cow; -use rustc_error_codes::*; - struct FindLocalByTypeVisitor<'a, 'tcx> { infcx: &'a InferCtxt<'a, 'tcx>, target_ty: Ty<'tcx>, - hir_map: &'a hir::map::Map<'tcx>, - found_local_pattern: Option<&'tcx Pat>, - found_arg_pattern: Option<&'tcx Pat>, + hir_map: &'a Map<'tcx>, + found_local_pattern: Option<&'tcx Pat<'tcx>>, + found_arg_pattern: Option<&'tcx Pat<'tcx>>, found_ty: Option>, - found_closure: Option<&'tcx ExprKind>, - found_method_call: Option<&'tcx Expr>, + found_closure: Option<&'tcx ExprKind<'tcx>>, + found_method_call: Option<&'tcx Expr<'tcx>>, } impl<'a, 'tcx> FindLocalByTypeVisitor<'a, 'tcx> { - fn new( - infcx: &'a InferCtxt<'a, 'tcx>, - target_ty: Ty<'tcx>, - hir_map: &'a hir::map::Map<'tcx>, - ) -> Self { + fn new(infcx: &'a InferCtxt<'a, 'tcx>, target_ty: Ty<'tcx>, hir_map: &'a Map<'tcx>) -> Self { Self { infcx, target_ty, @@ -43,22 +39,19 @@ impl<'a, 'tcx> FindLocalByTypeVisitor<'a, 'tcx> { } fn node_matches_type(&mut self, hir_id: HirId) -> Option> { - let ty_opt = self.infcx.in_progress_tables.and_then(|tables| { - tables.borrow().node_type_opt(hir_id) - }); + let ty_opt = + self.infcx.in_progress_tables.and_then(|tables| tables.borrow().node_type_opt(hir_id)); match ty_opt { Some(ty) => { let ty = self.infcx.resolve_vars_if_possible(&ty); if ty.walk().any(|inner_ty| { - inner_ty == self.target_ty || match (&inner_ty.kind, &self.target_ty.kind) { - (&Infer(TyVar(a_vid)), &Infer(TyVar(b_vid))) => { - self.infcx - .type_variables - .borrow_mut() - .sub_unified(a_vid, b_vid) + inner_ty == self.target_ty + || match (&inner_ty.kind, &self.target_ty.kind) { + (&Infer(TyVar(a_vid)), &Infer(TyVar(b_vid))) => { + self.infcx.type_variables.borrow_mut().sub_unified(a_vid, b_vid) + } + _ => false, } - _ => false, - } }) { Some(ty) } else { @@ -71,11 +64,13 @@ impl<'a, 'tcx> FindLocalByTypeVisitor<'a, 'tcx> { } impl<'a, 'tcx> Visitor<'tcx> for FindLocalByTypeVisitor<'a, 'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, Self::Map> { NestedVisitorMap::OnlyBodies(&self.hir_map) } - fn visit_local(&mut self, local: &'tcx Local) { + fn visit_local(&mut self, local: &'tcx Local<'tcx>) { if let (None, Some(ty)) = (self.found_local_pattern, self.node_matches_type(local.hir_id)) { self.found_local_pattern = Some(&*local.pat); self.found_ty = Some(ty); @@ -83,12 +78,10 @@ impl<'a, 'tcx> Visitor<'tcx> for FindLocalByTypeVisitor<'a, 'tcx> { intravisit::walk_local(self, local); } - fn visit_body(&mut self, body: &'tcx Body) { - for param in &body.params { - if let (None, Some(ty)) = ( - self.found_arg_pattern, - self.node_matches_type(param.hir_id), - ) { + fn visit_body(&mut self, body: &'tcx Body<'tcx>) { + for param in body.params { + if let (None, Some(ty)) = (self.found_arg_pattern, self.node_matches_type(param.hir_id)) + { self.found_arg_pattern = Some(&*param.pat); self.found_ty = Some(ty); } @@ -96,7 +89,7 @@ impl<'a, 'tcx> Visitor<'tcx> for FindLocalByTypeVisitor<'a, 'tcx> { intravisit::walk_body(self, body); } - fn visit_expr(&mut self, expr: &'tcx Expr) { + fn visit_expr(&mut self, expr: &'tcx Expr<'tcx>) { if self.node_matches_type(expr.hir_id).is_some() { match expr.kind { ExprKind::Closure(..) => self.found_closure = Some(&expr.kind), @@ -112,44 +105,41 @@ impl<'a, 'tcx> Visitor<'tcx> for FindLocalByTypeVisitor<'a, 'tcx> { fn closure_return_type_suggestion( span: Span, err: &mut DiagnosticBuilder<'_>, - output: &FunctionRetTy, - body: &Body, + output: &FunctionRetTy<'_>, + body: &Body<'_>, descr: &str, name: &str, ret: &str, + parent_name: Option, + parent_descr: Option<&str>, ) { let (arrow, post) = match output { FunctionRetTy::DefaultReturn(_) => ("-> ", " "), _ => ("", ""), }; let suggestion = match body.value.kind { - ExprKind::Block(..) => { - vec![(output.span(), format!("{}{}{}", arrow, ret, post))] - } - _ => { - vec![ - (output.span(), format!("{}{}{}{{ ", arrow, ret, post)), - (body.value.span.shrink_to_hi(), " }".to_string()), - ] - } + ExprKind::Block(..) => vec![(output.span(), format!("{}{}{}", arrow, ret, post))], + _ => vec![ + (output.span(), format!("{}{}{}{{ ", arrow, ret, post)), + (body.value.span.shrink_to_hi(), " }".to_string()), + ], }; err.multipart_suggestion( "give this closure an explicit return type without `_` placeholders", suggestion, Applicability::HasPlaceholders, ); - err.span_label(span, InferCtxt::missing_type_msg(&name, &descr)); + err.span_label(span, InferCtxt::missing_type_msg(&name, &descr, parent_name, parent_descr)); } /// Given a closure signature, return a `String` containing a list of all its argument types. fn closure_args(fn_sig: &ty::PolyFnSig<'_>) -> String { - fn_sig.inputs() + fn_sig + .inputs() .skip_binder() .iter() .next() - .map(|args| args.tuple_fields() - .map(|arg| arg.to_string()) - .collect::>().join(", ")) + .map(|args| args.tuple_fields().map(|arg| arg.to_string()).collect::>().join(", ")) .unwrap_or_default() } @@ -159,16 +149,13 @@ pub enum TypeAnnotationNeeded { E0284, } -impl Into for TypeAnnotationNeeded { - fn into(self) -> errors::DiagnosticId { - syntax::diagnostic_used!(E0282); - syntax::diagnostic_used!(E0283); - syntax::diagnostic_used!(E0284); - errors::DiagnosticId::Error(match self { - Self::E0282 => "E0282".to_string(), - Self::E0283 => "E0283".to_string(), - Self::E0284 => "E0284".to_string(), - }) +impl Into for TypeAnnotationNeeded { + fn into(self) -> rustc_errors::DiagnosticId { + match self { + Self::E0282 => rustc_errors::error_code!(E0282), + Self::E0283 => rustc_errors::error_code!(E0283), + Self::E0284 => rustc_errors::error_code!(E0284), + } } } @@ -177,16 +164,38 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { &self, ty: Ty<'tcx>, highlight: Option, - ) -> (String, Option, Cow<'static, str>) { + ) -> (String, Option, Cow<'static, str>, Option, Option<&'static str>) { if let ty::Infer(ty::TyVar(ty_vid)) = ty.kind { let ty_vars = self.type_variables.borrow(); let var_origin = ty_vars.var_origin(ty_vid); - if let TypeVariableOriginKind::TypeParameterDefinition(name) = var_origin.kind { + if let TypeVariableOriginKind::TypeParameterDefinition(name, def_id) = var_origin.kind { + let parent_def_id = def_id.and_then(|def_id| self.tcx.parent(def_id)); + let (parent_name, parent_desc) = if let Some(parent_def_id) = parent_def_id { + let parent_name = self + .tcx + .def_key(parent_def_id) + .disambiguated_data + .data + .get_opt_name() + .map(|parent_symbol| parent_symbol.to_string()); + + let type_parent_desc = self + .tcx + .def_kind(parent_def_id) + .map(|parent_def_kind| parent_def_kind.descr(parent_def_id)); + + (parent_name, type_parent_desc) + } else { + (None, None) + }; + if name != kw::SelfUpper { return ( name.to_string(), Some(var_origin.span), "type parameter".into(), + parent_name, + parent_desc, ); } } @@ -198,7 +207,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { printer.region_highlight_mode = highlight; } let _ = ty.print(printer); - (s, None, ty.prefix_string()) + (s, None, ty.prefix_string(), None, None) } pub fn need_type_info_err( @@ -209,7 +218,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { error_code: TypeAnnotationNeeded, ) -> DiagnosticBuilder<'tcx> { let ty = self.resolve_vars_if_possible(&ty); - let (name, name_sp, descr) = self.extract_type_name(&ty, None); + let (name, name_sp, descr, parent_name, parent_descr) = self.extract_type_name(&ty, None); let mut local_visitor = FindLocalByTypeVisitor::new(&self, ty, &self.tcx.hir()); let ty_to_string = |ty: Ty<'tcx>| -> String { @@ -218,7 +227,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { let ty_vars = self.type_variables.borrow(); let getter = move |ty_vid| { let var_origin = ty_vars.var_origin(ty_vid); - if let TypeVariableOriginKind::TypeParameterDefinition(name) = var_origin.kind { + if let TypeVariableOriginKind::TypeParameterDefinition(name, _) = var_origin.kind { return Some(name.to_string()); } None @@ -242,9 +251,9 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // 3 | let _ = x.sum() as f64; // | ^^^ cannot infer type for `S` span - } else if let Some( - ExprKind::MethodCall(_, call_span, _), - ) = local_visitor.found_method_call.map(|e| &e.kind) { + } else if let Some(ExprKind::MethodCall(_, call_span, _)) = + local_visitor.found_method_call.map(|e| &e.kind) + { // Point at the call instead of the whole expression: // error[E0284]: type annotations needed // --> file.rs:2:5 @@ -253,11 +262,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // | ^^^^^^^ cannot infer type // | // = note: cannot resolve `<_ as std::ops::Try>::Ok == _` - if span.contains(*call_span) { - *call_span - } else { - span - } + if span.contains(*call_span) { *call_span } else { span } } else { span }; @@ -317,6 +322,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { &descr, &name, &ret, + parent_name, + parent_descr, ); // We don't want to give the other suggestions when the problem is the // closure return type. @@ -339,8 +346,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { let ty = ty_to_string(ty); format!( "the explicit type `{}`, where the type parameter `{}` is specified", - ty, - name, + ty, name, ) } _ => "a type".to_string(), @@ -370,9 +376,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } else if let Some(pattern) = local_visitor.found_local_pattern { let msg = if let Some(simple_ident) = pattern.simple_ident() { match pattern.span.desugaring_kind() { - None => { - format!("consider giving `{}` {}", simple_ident, suffix) - } + None => format!("consider giving `{}` {}", simple_ident, suffix), Some(DesugaringKind::ForLoop) => { "the element type for this iterator is not specified".to_string() } @@ -430,11 +434,18 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // | // = note: type must be known at this point let span = name_sp.unwrap_or(err_span); - if !err.span.span_labels().iter().any(|span_label| { - span_label.label.is_some() && span_label.span == span - }) && local_visitor.found_arg_pattern.is_none() - { // Avoid multiple labels pointing at `span`. - err.span_label(span, InferCtxt::missing_type_msg(&name, &descr)); + if !err + .span + .span_labels() + .iter() + .any(|span_label| span_label.label.is_some() && span_label.span == span) + && local_visitor.found_arg_pattern.is_none() + { + // Avoid multiple labels pointing at `span`. + err.span_label( + span, + InferCtxt::missing_type_msg(&name, &descr, parent_name, parent_descr), + ); } err @@ -444,8 +455,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { /// needed, suggest annotating the call, otherwise point out the resulting type of the call. fn annotate_method_call( &self, - segment: &hir::ptr::P, - e: &Expr, + segment: &hir::PathSegment<'_>, + e: &Expr<'_>, err: &mut DiagnosticBuilder<'_>, ) { if let (Ok(snippet), Some(tables), None) = ( @@ -461,16 +472,18 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { segment.ident.span, &format!( "consider specifying the type argument{} in the method call", - if generics.params.len() > 1 { - "s" - } else { - "" - }, + if generics.params.len() > 1 { "s" } else { "" }, + ), + format!( + "{}::<{}>", + snippet, + generics + .params + .iter() + .map(|p| p.name.to_string()) + .collect::>() + .join(", ") ), - format!("{}::<{}>", snippet, generics.params.iter() - .map(|p| p.name.to_string()) - .collect::>() - .join(", ")), Applicability::HasPlaceholders, ); } else { @@ -496,19 +509,41 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { ty: Ty<'tcx>, ) -> DiagnosticBuilder<'tcx> { let ty = self.resolve_vars_if_possible(&ty); - let (name, _, descr) = self.extract_type_name(&ty, None); + let (name, _, descr, parent_name, parent_descr) = self.extract_type_name(&ty, None); + let mut err = struct_span_err!( - self.tcx.sess, span, E0698, "type inside {} must be known in this context", kind, + self.tcx.sess, + span, + E0698, + "type inside {} must be known in this context", + kind, ); - err.span_label(span, InferCtxt::missing_type_msg(&name, &descr)); + err.span_label(span, InferCtxt::missing_type_msg(&name, &descr, parent_name, parent_descr)); err } - fn missing_type_msg(type_name: &str, descr: &str) -> Cow<'static, str>{ + fn missing_type_msg( + type_name: &str, + descr: &str, + parent_name: Option, + parent_descr: Option<&str>, + ) -> Cow<'static, str> { if type_name == "_" { "cannot infer type".into() } else { - format!("cannot infer type for {} `{}`", descr, type_name).into() + let parent_desc = if let Some(parent_name) = parent_name { + let parent_type_descr = if let Some(parent_descr) = parent_descr { + format!(" the {}", parent_descr) + } else { + "".into() + }; + + format!(" declared on{} `{}`", parent_type_descr, parent_name) + } else { + "".to_string() + }; + + format!("cannot infer type for {} `{}`{}", descr, type_name, parent_desc).into() } } } diff --git a/src/librustc/infer/error_reporting/nice_region_error/different_lifetimes.rs b/src/librustc/infer/error_reporting/nice_region_error/different_lifetimes.rs index a431b541fa..8f4c643992 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/different_lifetimes.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/different_lifetimes.rs @@ -1,11 +1,11 @@ //! Error Reporting for Anonymous Region Lifetime Errors //! where both the regions are anonymous. -use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::infer::error_reporting::nice_region_error::util::AnonymousParamInfo; +use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::util::common::ErrorReported; -use rustc_error_codes::*; +use rustc_errors::struct_span_err; impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { /// Print the error message for lifetime errors when both the concerned regions are anonymous. @@ -62,26 +62,20 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { debug!( "try_report_anon_anon_conflict: found_param1={:?} sup={:?} br1={:?}", - ty_sub, - sup, - bregion_sup + ty_sub, sup, bregion_sup ); debug!( "try_report_anon_anon_conflict: found_param2={:?} sub={:?} br2={:?}", - ty_sup, - sub, - bregion_sub + ty_sup, sub, bregion_sub ); let (ty_sup, ty_fndecl_sup) = ty_sup; let (ty_sub, ty_fndecl_sub) = ty_sub; - let AnonymousParamInfo { - param: anon_param_sup, .. - } = self.find_param_with_region(sup, sup)?; - let AnonymousParamInfo { - param: anon_param_sub, .. - } = self.find_param_with_region(sub, sub)?; + let AnonymousParamInfo { param: anon_param_sup, .. } = + self.find_param_with_region(sup, sup)?; + let AnonymousParamInfo { param: anon_param_sub, .. } = + self.find_param_with_region(sub, sub)?; let sup_is_ret_type = self.is_return_type_anon(scope_def_id_sup, bregion_sup, ty_fndecl_sup); @@ -103,16 +97,12 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { let (main_label_1, span_label_1) = if ty_sup.hir_id == ty_sub.hir_id { ( "this type is declared with multiple lifetimes...".to_owned(), - "...but data with one lifetime flows into the other here".to_owned() + "...but data with one lifetime flows into the other here".to_owned(), ) } else { ( "these two types are declared with different lifetimes...".to_owned(), - format!( - "...but data{} flows{} here", - span_label_var1, - span_label_var2 - ), + format!("...but data{} flows{} here", span_label_var1, span_label_var2), ) }; (ty_sup.span, ty_sub.span, main_label_1, span_label_1) @@ -122,21 +112,20 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { ty_sub.span, ret_span, "this parameter and the return type are declared \ - with different lifetimes...".to_owned() - , + with different lifetimes..." + .to_owned(), format!("...but data{} is returned here", span_label_var1), ), (_, Some(ret_span)) => ( ty_sup.span, ret_span, "this parameter and the return type are declared \ - with different lifetimes...".to_owned() - , + with different lifetimes..." + .to_owned(), format!("...but data{} is returned here", span_label_var1), ), }; - struct_span_err!(self.tcx().sess, span, E0623, "lifetime mismatch") .span_label(span_1, main_label) .span_label(span_2, String::new()) diff --git a/src/librustc/infer/error_reporting/nice_region_error/find_anon_type.rs b/src/librustc/infer/error_reporting/nice_region_error/find_anon_type.rs index db5557204e..8e2592b531 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/find_anon_type.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/find_anon_type.rs @@ -1,9 +1,10 @@ -use crate::hir; -use crate::ty::{self, Region, TyCtxt}; -use crate::hir::Node; -use crate::middle::resolve_lifetime as rl; -use crate::hir::intravisit::{self, NestedVisitorMap, Visitor}; +use crate::hir::map::Map; use crate::infer::error_reporting::nice_region_error::NiceRegionError; +use crate::middle::resolve_lifetime as rl; +use crate::ty::{self, Region, TyCtxt}; +use rustc_hir as hir; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_hir::Node; impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { /// This function calls the `visit_ty` method for the parameters @@ -25,15 +26,12 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { &self, region: Region<'tcx>, br: &ty::BoundRegion, - ) -> Option<(&hir::Ty, &hir::FnDecl)> { + ) -> Option<(&hir::Ty<'_>, &hir::FnDecl<'_>)> { if let Some(anon_reg) = self.tcx().is_suitable_region(region) { let def_id = anon_reg.def_id; if let Some(hir_id) = self.tcx().hir().as_local_hir_id(def_id) { let fndecl = match self.tcx().hir().get(hir_id) { - Node::Item(&hir::Item { - kind: hir::ItemKind::Fn(ref m, ..), - .. - }) + Node::Item(&hir::Item { kind: hir::ItemKind::Fn(ref m, ..), .. }) | Node::TraitItem(&hir::TraitItem { kind: hir::TraitItemKind::Method(ref m, ..), .. @@ -60,9 +58,9 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { // to the anonymous region. fn find_component_for_bound_region( &self, - arg: &'tcx hir::Ty, + arg: &'tcx hir::Ty<'tcx>, br: &ty::BoundRegion, - ) -> Option<&'tcx hir::Ty> { + ) -> Option<&'tcx hir::Ty<'tcx>> { let mut nested_visitor = FindNestedTypeVisitor { tcx: self.tcx(), bound_region: *br, @@ -88,16 +86,18 @@ struct FindNestedTypeVisitor<'tcx> { bound_region: ty::BoundRegion, // The type where the anonymous lifetime appears // for e.g., Vec<`&u8`> and <`&u8`> - found_type: Option<&'tcx hir::Ty>, + found_type: Option<&'tcx hir::Ty<'tcx>>, current_index: ty::DebruijnIndex, } impl Visitor<'tcx> for FindNestedTypeVisitor<'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, Self::Map> { NestedVisitorMap::OnlyBodies(&self.tcx.hir()) } - fn visit_ty(&mut self, arg: &'tcx hir::Ty) { + fn visit_ty(&mut self, arg: &'tcx hir::Ty<'tcx>) { match arg.kind { hir::TyKind::BareFn(_) => { self.current_index.shift_in(1); @@ -106,11 +106,13 @@ impl Visitor<'tcx> for FindNestedTypeVisitor<'tcx> { return; } - hir::TyKind::TraitObject(ref bounds, _) => for bound in bounds { - self.current_index.shift_in(1); - self.visit_poly_trait_ref(bound, hir::TraitBoundModifier::None); - self.current_index.shift_out(1); - }, + hir::TyKind::TraitObject(bounds, _) => { + for bound in bounds { + self.current_index.shift_in(1); + self.visit_poly_trait_ref(bound, hir::TraitBoundModifier::None); + self.current_index.shift_out(1); + } + } hir::TyKind::Rptr(ref lifetime, _) => { // the lifetime of the TyRptr @@ -125,9 +127,7 @@ impl Visitor<'tcx> for FindNestedTypeVisitor<'tcx> { ) => { debug!( "LateBoundAnon depth = {:?} anon_index = {:?} br_index={:?}", - debruijn_index, - anon_index, - br_index + debruijn_index, anon_index, br_index ); if debruijn_index == self.current_index && anon_index == br_index { self.found_type = Some(arg); @@ -183,7 +183,7 @@ impl Visitor<'tcx> for FindNestedTypeVisitor<'tcx> { current_index: self.current_index, }; intravisit::walk_ty(subvisitor, arg); // call walk_ty; as visit_ty is empty, - // this will visit only outermost type + // this will visit only outermost type if subvisitor.found_it { self.found_type = Some(arg); } @@ -210,7 +210,9 @@ struct TyPathVisitor<'tcx> { } impl Visitor<'tcx> for TyPathVisitor<'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, Map<'tcx>> { NestedVisitorMap::OnlyBodies(&self.tcx.hir()) } @@ -233,10 +235,7 @@ impl Visitor<'tcx> for TyPathVisitor<'tcx> { } (Some(rl::Region::LateBound(debruijn_index, id, _)), ty::BrNamed(def_id, _)) => { - debug!( - "FindNestedTypeVisitor::visit_ty: LateBound depth = {:?}", - debruijn_index, - ); + debug!("FindNestedTypeVisitor::visit_ty: LateBound depth = {:?}", debruijn_index,); debug!("id={:?}", id); debug!("def_id={:?}", def_id); if debruijn_index == self.current_index && id == def_id { @@ -256,7 +255,7 @@ impl Visitor<'tcx> for TyPathVisitor<'tcx> { } } - fn visit_ty(&mut self, arg: &'tcx hir::Ty) { + fn visit_ty(&mut self, arg: &'tcx hir::Ty<'tcx>) { // ignore nested types // // If you have a type like `Foo<'a, &Ty>` we diff --git a/src/librustc/infer/error_reporting/nice_region_error/mod.rs b/src/librustc/infer/error_reporting/nice_region_error/mod.rs index 09cfbf850a..8749d6cd34 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/mod.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/mod.rs @@ -1,16 +1,16 @@ -use crate::infer::InferCtxt; use crate::infer::lexical_region_resolve::RegionResolutionError; use crate::infer::lexical_region_resolve::RegionResolutionError::*; +use crate::infer::InferCtxt; use crate::ty::{self, TyCtxt}; use crate::util::common::ErrorReported; -use errors::DiagnosticBuilder; -use syntax::source_map::Span; +use rustc_errors::DiagnosticBuilder; +use rustc_span::source_map::Span; mod different_lifetimes; mod find_anon_type; mod named_anon_conflict; -mod placeholder_error; mod outlives_closure; +mod placeholder_error; mod static_impl_trait; mod trait_impl_difference; mod util; @@ -19,7 +19,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { pub fn try_report_nice_region_error(&self, error: &RegionResolutionError<'tcx>) -> bool { match *error { ConcreteFailure(..) | SubSupConflict(..) => {} - _ => return false, // inapplicable + _ => return false, // inapplicable } if let Some(tables) = self.in_progress_tables { @@ -64,13 +64,15 @@ impl<'cx, 'tcx> NiceRegionError<'cx, 'tcx> { pub fn try_report_from_nll(&self) -> Option> { // Due to the improved diagnostics returned by the MIR borrow checker, only a subset of // the nice region errors are required when running under the MIR borrow checker. - self.try_report_named_anon_conflict() - .or_else(|| self.try_report_placeholder_conflict()) + self.try_report_named_anon_conflict().or_else(|| self.try_report_placeholder_conflict()) } pub fn try_report(&self) -> Option { self.try_report_from_nll() - .map(|mut diag| { diag.emit(); ErrorReported }) + .map(|mut diag| { + diag.emit(); + ErrorReported + }) .or_else(|| self.try_report_anon_anon_conflict()) .or_else(|| self.try_report_outlives_closure()) .or_else(|| self.try_report_static_impl_trait()) diff --git a/src/librustc/infer/error_reporting/nice_region_error/named_anon_conflict.rs b/src/librustc/infer/error_reporting/nice_region_error/named_anon_conflict.rs index 0abdeb7199..df37f53606 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/named_anon_conflict.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/named_anon_conflict.rs @@ -1,11 +1,9 @@ //! Error Reporting for Anonymous Region Lifetime Errors //! where one region is named and the other is anonymous. use crate::infer::error_reporting::nice_region_error::NiceRegionError; -use crate::hir::{FunctionRetTy, TyKind}; use crate::ty; -use errors::{Applicability, DiagnosticBuilder}; - -use rustc_error_codes::*; +use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder}; +use rustc_hir::{FunctionRetTy, TyKind}; impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { /// When given a `ConcreteFailure` for a function with parameters containing a named region and @@ -15,9 +13,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { debug!( "try_report_named_anon_conflict(sub={:?}, sup={:?}, error={:?})", - sub, - sup, - self.error, + sub, sup, self.error, ); // Determine whether the sub and sup consist of one named region ('a) @@ -36,7 +32,8 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { self.find_param_with_region(sup, sub).unwrap(), self.tcx().is_suitable_region(sup).unwrap(), ) - } else if self.is_named_region(sup) && self.tcx().is_suitable_region(sub).is_some() + } else if self.is_named_region(sup) + && self.tcx().is_suitable_region(sub).is_some() && self.find_param_with_region(sub, sup).is_some() { ( @@ -50,14 +47,8 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { }; debug!("try_report_named_anon_conflict: named = {:?}", named); - debug!( - "try_report_named_anon_conflict: anon_param_info = {:?}", - anon_param_info - ); - debug!( - "try_report_named_anon_conflict: region_info = {:?}", - region_info - ); + debug!("try_report_named_anon_conflict: anon_param_info = {:?}", anon_param_info); + debug!("try_report_named_anon_conflict: region_info = {:?}", region_info); let (param, new_ty, new_ty_span, br, is_first, scope_def_id, is_impl_item) = ( anon_param_info.param, diff --git a/src/librustc/infer/error_reporting/nice_region_error/outlives_closure.rs b/src/librustc/infer/error_reporting/nice_region_error/outlives_closure.rs index 9231e4f779..af0e5ef800 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/outlives_closure.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/outlives_closure.rs @@ -2,12 +2,11 @@ //! where both the regions are anonymous. use crate::infer::error_reporting::nice_region_error::NiceRegionError; +use crate::infer::lexical_region_resolve::RegionResolutionError::SubSupConflict; use crate::infer::SubregionOrigin; use crate::ty::RegionKind; -use crate::hir::{Expr, ExprKind::Closure}; -use crate::hir::Node; use crate::util::common::ErrorReported; -use crate::infer::lexical_region_resolve::RegionResolutionError::SubSupConflict; +use rustc_hir::{Expr, ExprKind::Closure, Node}; impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { /// Print the error message for lifetime errors when binding escapes a closure. @@ -36,69 +35,75 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { /// ...because it cannot outlive this closure /// ``` pub(super) fn try_report_outlives_closure(&self) -> Option { - if let Some(SubSupConflict(_, - origin, - ref sub_origin, - _, - ref sup_origin, - sup_region)) = self.error { - + if let Some(SubSupConflict(_, origin, ref sub_origin, _, ref sup_origin, sup_region)) = + self.error + { // #45983: when trying to assign the contents of an argument to a binding outside of a // closure, provide a specific message pointing this out. - if let (&SubregionOrigin::BindingTypeIsNotValidAtDecl(ref external_span), - &RegionKind::ReFree(ref free_region)) = (&sub_origin, sup_region) { + if let ( + &SubregionOrigin::BindingTypeIsNotValidAtDecl(ref external_span), + &RegionKind::ReFree(ref free_region), + ) = (&sub_origin, sup_region) + { let hir = &self.tcx().hir(); if let Some(hir_id) = hir.as_local_hir_id(free_region.scope) { - if let Node::Expr(Expr { - kind: Closure(_, _, _, closure_span, None), - .. - }) = hir.get(hir_id) { + if let Node::Expr(Expr { kind: Closure(_, _, _, closure_span, None), .. }) = + hir.get(hir_id) + { let sup_sp = sup_origin.span(); let origin_sp = origin.span(); let mut err = self.tcx().sess.struct_span_err( sup_sp, - "borrowed data cannot be stored outside of its closure"); + "borrowed data cannot be stored outside of its closure", + ); err.span_label(sup_sp, "cannot be stored outside of its closure"); if origin_sp == sup_sp || origin_sp.contains(sup_sp) { -// // sup_sp == origin.span(): -// -// let mut x = None; -// ----- borrowed data cannot be stored into here... -// with_int(|y| x = Some(y)); -// --- ^ cannot be stored outside of its closure -// | -// ...because it cannot outlive this closure -// -// // origin.contains(&sup_sp): -// -// let mut f: Option<&u32> = None; -// ----- borrowed data cannot be stored into here... -// closure_expecting_bound(|x: &'x u32| { -// ------------ ... because it cannot outlive this closure -// f = Some(x); -// ^ cannot be stored outside of its closure - err.span_label(*external_span, - "borrowed data cannot be stored into here..."); - err.span_label(*closure_span, - "...because it cannot outlive this closure"); + // // sup_sp == origin.span(): + // + // let mut x = None; + // ----- borrowed data cannot be stored into here... + // with_int(|y| x = Some(y)); + // --- ^ cannot be stored outside of its closure + // | + // ...because it cannot outlive this closure + // + // // origin.contains(&sup_sp): + // + // let mut f: Option<&u32> = None; + // ----- borrowed data cannot be stored into here... + // closure_expecting_bound(|x: &'x u32| { + // ------------ ... because it cannot outlive this closure + // f = Some(x); + // ^ cannot be stored outside of its closure + err.span_label( + *external_span, + "borrowed data cannot be stored into here...", + ); + err.span_label( + *closure_span, + "...because it cannot outlive this closure", + ); } else { -// FIXME: the wording for this case could be much improved -// -// let mut lines_to_use: Vec<&CrateId> = Vec::new(); -// - cannot infer an appropriate lifetime... -// let push_id = |installed_id: &CrateId| { -// ------- ------------------------ borrowed data cannot outlive this closure -// | -// ...so that variable is valid at time of its declaration -// lines_to_use.push(installed_id); -// ^^^^^^^^^^^^ cannot be stored outside of its closure - err.span_label(origin_sp, - "cannot infer an appropriate lifetime..."); - err.span_label(*external_span, - "...so that variable is valid at time of its \ - declaration"); - err.span_label(*closure_span, - "borrowed data cannot outlive this closure"); + // FIXME: the wording for this case could be much improved + // + // let mut lines_to_use: Vec<&CrateId> = Vec::new(); + // - cannot infer an appropriate lifetime... + // let push_id = |installed_id: &CrateId| { + // ------- ------------------------ borrowed data cannot outlive this closure + // | + // ...so that variable is valid at time of its declaration + // lines_to_use.push(installed_id); + // ^^^^^^^^^^^^ cannot be stored outside of its closure + err.span_label(origin_sp, "cannot infer an appropriate lifetime..."); + err.span_label( + *external_span, + "...so that variable is valid at time of its \ + declaration", + ); + err.span_label( + *closure_span, + "borrowed data cannot outlive this closure", + ); } err.emit(); return Some(ErrorReported); diff --git a/src/librustc/infer/error_reporting/nice_region_error/placeholder_error.rs b/src/librustc/infer/error_reporting/nice_region_error/placeholder_error.rs index 3b4d06aab2..7b31fe7cd7 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/placeholder_error.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/placeholder_error.rs @@ -1,15 +1,15 @@ -use errors::DiagnosticBuilder; -use crate::hir::def::Namespace; -use crate::hir::def_id::DefId; use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::infer::lexical_region_resolve::RegionResolutionError; use crate::infer::ValuePairs; use crate::infer::{SubregionOrigin, TypeTrace}; use crate::traits::{ObligationCause, ObligationCauseCode}; -use crate::ty::{self, TyCtxt}; use crate::ty::error::ExpectedFound; +use crate::ty::print::{FmtPrinter, Print, RegionHighlightMode}; use crate::ty::subst::SubstsRef; -use crate::ty::print::{Print, RegionHighlightMode, FmtPrinter}; +use crate::ty::{self, TyCtxt}; +use rustc_errors::DiagnosticBuilder; +use rustc_hir::def::Namespace; +use rustc_hir::def_id::DefId; use std::fmt::{self, Write}; @@ -259,24 +259,16 @@ impl NiceRegionError<'me, 'tcx> { } }); - let actual_self_ty_has_vid = self - .tcx() - .any_free_region_meets(&actual_trait_ref.self_ty(), |r| Some(r) == vid); + let actual_self_ty_has_vid = + self.tcx().any_free_region_meets(&actual_trait_ref.self_ty(), |r| Some(r) == vid); - let expected_self_ty_has_vid = self - .tcx() - .any_free_region_meets(&expected_trait_ref.self_ty(), |r| Some(r) == vid); + let expected_self_ty_has_vid = + self.tcx().any_free_region_meets(&expected_trait_ref.self_ty(), |r| Some(r) == vid); let any_self_ty_has_vid = actual_self_ty_has_vid || expected_self_ty_has_vid; - debug!( - "try_report_placeholders_trait: actual_has_vid={:?}", - actual_has_vid - ); - debug!( - "try_report_placeholders_trait: expected_has_vid={:?}", - expected_has_vid - ); + debug!("try_report_placeholders_trait: actual_has_vid={:?}", actual_has_vid); + debug!("try_report_placeholders_trait: expected_has_vid={:?}", expected_has_vid); debug!("try_report_placeholders_trait: has_sub={:?}", has_sub); debug!("try_report_placeholders_trait: has_sup={:?}", has_sup); debug!( @@ -336,11 +328,7 @@ impl NiceRegionError<'me, 'tcx> { impl<'tcx, T> Highlighted<'tcx, T> { fn map(self, f: impl FnOnce(T) -> U) -> Highlighted<'tcx, U> { - Highlighted { - tcx: self.tcx, - highlight: self.highlight, - value: f(self.value), - } + Highlighted { tcx: self.tcx, highlight: self.highlight, value: f(self.value) } } } @@ -415,24 +403,21 @@ impl NiceRegionError<'me, 'tcx> { match (has_sub, has_sup) { (Some(n1), Some(n2)) => { - let _ = write!(note, + let _ = write!( + note, ", for any two lifetimes `'{}` and `'{}`...", std::cmp::min(n1, n2), std::cmp::max(n1, n2), ); } (Some(n), _) | (_, Some(n)) => { - let _ = write!(note, - ", for any lifetime `'{}`...", - n, - ); + let _ = write!(note, ", for any lifetime `'{}`...", n,); + } + (None, None) => { + if let Some(n) = expected_has_vid { + let _ = write!(note, ", for some specific lifetime `'{}`...", n,); + } } - (None, None) => if let Some(n) = expected_has_vid { - let _ = write!(note, - ", for some specific lifetime `'{}`...", - n, - ); - }, } note diff --git a/src/librustc/infer/error_reporting/nice_region_error/static_impl_trait.rs b/src/librustc/infer/error_reporting/nice_region_error/static_impl_trait.rs index 01ba748c4e..c6fc4cd3c1 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/static_impl_trait.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/static_impl_trait.rs @@ -1,70 +1,63 @@ //! Error Reporting for static impl Traits. +use crate::infer::error_reporting::msg_span_from_free_region; use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::infer::lexical_region_resolve::RegionResolutionError; use crate::ty::{BoundRegion, FreeRegion, RegionKind}; use crate::util::common::ErrorReported; -use errors::Applicability; +use rustc_errors::Applicability; impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { /// Print the error message for lifetime errors when the return type is a static impl Trait. pub(super) fn try_report_static_impl_trait(&self) -> Option { if let Some(ref error) = self.error { if let RegionResolutionError::SubSupConflict( - _, - var_origin, - sub_origin, - sub_r, - sup_origin, - sup_r, - ) = error.clone() + _, + var_origin, + sub_origin, + sub_r, + sup_origin, + sup_r, + ) = error.clone() { let anon_reg_sup = self.tcx().is_suitable_region(sup_r)?; let return_ty = self.tcx().return_type_impl_trait(anon_reg_sup.def_id); - if sub_r == &RegionKind::ReStatic && - return_ty.is_some() - { + if sub_r == &RegionKind::ReStatic && return_ty.is_some() { let sp = var_origin.span(); let return_sp = sub_origin.span(); - let mut err = self.tcx().sess.struct_span_err( - sp, - "cannot infer an appropriate lifetime", - ); + let mut err = + self.tcx().sess.struct_span_err(sp, "cannot infer an appropriate lifetime"); err.span_label( return_sp, "this return type evaluates to the `'static` lifetime...", ); - err.span_label( - sup_origin.span(), - "...but this borrow...", - ); + err.span_label(sup_origin.span(), "...but this borrow..."); - let (lifetime, lt_sp_opt) = self.tcx().msg_span_from_free_region(sup_r); + let (lifetime, lt_sp_opt) = msg_span_from_free_region(self.tcx(), sup_r); if let Some(lifetime_sp) = lt_sp_opt { - err.span_note( - lifetime_sp, - &format!("...can't outlive {}", lifetime), - ); + err.span_note(lifetime_sp, &format!("...can't outlive {}", lifetime)); } let lifetime_name = match sup_r { RegionKind::ReFree(FreeRegion { - bound_region: BoundRegion::BrNamed(_, ref name), .. + bound_region: BoundRegion::BrNamed(_, ref name), + .. }) => name.to_string(), _ => "'_".to_owned(), }; let fn_return_span = return_ty.unwrap().1; if let Ok(snippet) = - self.tcx().sess.source_map().span_to_snippet(fn_return_span) { + self.tcx().sess.source_map().span_to_snippet(fn_return_span) + { // only apply this suggestion onto functions with // explicit non-desugar'able return. if fn_return_span.desugaring_kind().is_none() { err.span_suggestion( fn_return_span, &format!( - "you can add a constraint to the return type to make it last \ + "you can add a bound to the return type to make it last \ less than `'static` and match {}", - lifetime, + lifetime, ), format!("{} + {}", snippet, lifetime_name), Applicability::Unspecified, diff --git a/src/librustc/infer/error_reporting/nice_region_error/trait_impl_difference.rs b/src/librustc/infer/error_reporting/nice_region_error/trait_impl_difference.rs index 0194300c50..a33cb51113 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/trait_impl_difference.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/trait_impl_difference.rs @@ -1,12 +1,12 @@ //! Error Reporting for `impl` items that do not match the obligations from their `trait`. -use syntax_pos::Span; -use crate::ty::Ty; -use crate::infer::{ValuePairs, Subtype}; use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::infer::lexical_region_resolve::RegionResolutionError; -use crate::util::common::ErrorReported; +use crate::infer::{Subtype, ValuePairs}; use crate::traits::ObligationCauseCode::CompareImplMethodObligation; +use crate::ty::Ty; +use crate::util::common::ErrorReported; +use rustc_span::Span; impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { /// Print the error message for lifetime errors when the `impl` doesn't conform to the `trait`. @@ -20,14 +20,16 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { _sub, sup_origin, _sup, - ) = error.clone() { + ) = error.clone() + { match (&sup_origin, &sub_origin) { (&Subtype(ref sup_trace), &Subtype(ref sub_trace)) => { if let ( ValuePairs::Types(sub_expected_found), ValuePairs::Types(sup_expected_found), CompareImplMethodObligation { trait_item_def_id, .. }, - ) = (&sub_trace.values, &sup_trace.values, &sub_trace.cause.code) { + ) = (&sub_trace.values, &sup_trace.values, &sub_trace.cause.code) + { if sup_expected_found == sub_expected_found { self.emit_err( var_origin.span(), @@ -47,10 +49,10 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { } fn emit_err(&self, sp: Span, expected: Ty<'tcx>, found: Ty<'tcx>, impl_sp: Span) { - let mut err = self.tcx().sess.struct_span_err( - sp, - "`impl` item signature doesn't match `trait` item signature", - ); + let mut err = self + .tcx() + .sess + .struct_span_err(sp, "`impl` item signature doesn't match `trait` item signature"); err.note(&format!("expected `{:?}`\n found `{:?}`", expected, found)); err.span_label(sp, &format!("found {:?}", found)); err.span_label(impl_sp, &format!("expected {:?}", expected)); diff --git a/src/librustc/infer/error_reporting/nice_region_error/util.rs b/src/librustc/infer/error_reporting/nice_region_error/util.rs index a2e48cf07c..52ccb1454e 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/util.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/util.rs @@ -1,24 +1,24 @@ //! Helper functions corresponding to lifetime errors due to //! anonymous regions. -use crate::hir; use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::ty::{self, DefIdTree, Region, Ty}; -use crate::hir::def_id::DefId; -use syntax_pos::Span; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_span::Span; // The struct contains the information about the anonymous region // we are searching for. #[derive(Debug)] pub(super) struct AnonymousParamInfo<'tcx> { // the parameter corresponding to the anonymous region - pub param: &'tcx hir::Param, + pub param: &'tcx hir::Param<'tcx>, // the type corresponding to the anonymopus region parameter pub param_ty: Ty<'tcx>, // the ty::BoundRegion corresponding to the anonymous region pub bound_region: ty::BoundRegion, // param_ty_span contains span of parameter type - pub param_ty_span : Span, + pub param_ty_span: Span, // corresponds to id the argument is the first parameter // in the declaration pub is_first: bool, @@ -79,7 +79,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { Some(AnonymousParamInfo { param: param, param_ty: new_param_ty, - param_ty_span : param_ty_span, + param_ty_span: param_ty_span, bound_region: bound_region, is_first: is_first, }) @@ -106,13 +106,13 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { &self, scope_def_id: DefId, br: ty::BoundRegion, - decl: &hir::FnDecl, + decl: &hir::FnDecl<'_>, ) -> Option { let ret_ty = self.tcx().type_of(scope_def_id); if let ty::FnDef(_, _) = ret_ty.kind { let sig = ret_ty.fn_sig(self.tcx()); - let late_bound_regions = self.tcx() - .collect_referenced_late_bound_regions(&sig.output()); + let late_bound_regions = + self.tcx().collect_referenced_late_bound_regions(&sig.output()); if late_bound_regions.iter().any(|r| *r == br) { return Some(decl.output.span()); } @@ -126,9 +126,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { // enable E0621 for it. pub(super) fn is_self_anon(&self, is_first: bool, scope_def_id: DefId) -> bool { is_first - && self.tcx() - .opt_associated_item(scope_def_id) - .map(|i| i.method_has_self_argument) == Some(true) + && self.tcx().opt_associated_item(scope_def_id).map(|i| i.method_has_self_argument) + == Some(true) } - } diff --git a/src/librustc/infer/error_reporting/note.rs b/src/librustc/infer/error_reporting/note.rs index 4b933735fc..11dda71b8c 100644 --- a/src/librustc/infer/error_reporting/note.rs +++ b/src/librustc/infer/error_reporting/note.rs @@ -1,66 +1,61 @@ +use crate::infer::error_reporting::note_and_explain_region; use crate::infer::{self, InferCtxt, SubregionOrigin}; use crate::middle::region; -use crate::ty::{self, Region}; use crate::ty::error::TypeError; -use errors::DiagnosticBuilder; - -use rustc_error_codes::*; +use crate::ty::{self, Region}; +use rustc_errors::{struct_span_err, DiagnosticBuilder}; impl<'a, 'tcx> InferCtxt<'a, 'tcx> { - pub(super) fn note_region_origin(&self, - err: &mut DiagnosticBuilder<'_>, - origin: &SubregionOrigin<'tcx>) { + pub(super) fn note_region_origin( + &self, + err: &mut DiagnosticBuilder<'_>, + origin: &SubregionOrigin<'tcx>, + ) { match *origin { infer::Subtype(ref trace) => { if let Some((expected, found)) = self.values_str(&trace.values) { err.span_note( trace.cause.span, - &format!( - "...so that the {}", - trace.cause.as_requirement_str() - ) + &format!("...so that the {}", trace.cause.as_requirement_str()), ); - err.note_expected_found( - &"", - expected, - &"", - found - ); + err.note_expected_found(&"", expected, &"", found); } else { // FIXME: this really should be handled at some earlier stage. Our // handling of region checking when type errors are present is // *terrible*. - err.span_note(trace.cause.span, - &format!("...so that {}", trace.cause.as_requirement_str())); + err.span_note( + trace.cause.span, + &format!("...so that {}", trace.cause.as_requirement_str()), + ); } } infer::Reborrow(span) => { - err.span_note(span, - "...so that reference does not outlive borrowed content"); + err.span_note(span, "...so that reference does not outlive borrowed content"); } infer::ReborrowUpvar(span, ref upvar_id) => { let var_name = self.tcx.hir().name(upvar_id.var_path.hir_id); - err.span_note(span, - &format!("...so that closure can access `{}`", var_name)); + err.span_note(span, &format!("...so that closure can access `{}`", var_name)); } infer::InfStackClosure(span) => { err.span_note(span, "...so that closure does not outlive its stack frame"); } infer::InvokeClosure(span) => { - err.span_note(span, - "...so that closure is not invoked outside its lifetime"); + err.span_note(span, "...so that closure is not invoked outside its lifetime"); } infer::DerefPointer(span) => { - err.span_note(span, - "...so that pointer is not dereferenced outside its lifetime"); + err.span_note(span, "...so that pointer is not dereferenced outside its lifetime"); } infer::ClosureCapture(span, id) => { - err.span_note(span, - &format!("...so that captured variable `{}` does not outlive the \ + err.span_note( + span, + &format!( + "...so that captured variable `{}` does not outlive the \ enclosing closure", - self.tcx.hir().name(id))); + self.tcx.hir().name(id) + ), + ); } infer::IndexSlice(span) => { err.span_note(span, "...so that slice is not indexed outside the lifetime"); @@ -69,8 +64,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { err.span_note(span, "...so that it can be closed over into an object"); } infer::CallRcvr(span) => { - err.span_note(span, - "...so that method receiver is valid for the method call"); + err.span_note(span, "...so that method receiver is valid for the method call"); } infer::CallArg(span) => { err.span_note(span, "...so that argument is valid for the call"); @@ -85,369 +79,606 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { err.span_note(span, "...so that reference is valid at the time of borrow"); } infer::AutoBorrow(span) => { - err.span_note(span, - "...so that auto-reference is valid at the time of borrow"); + err.span_note(span, "...so that auto-reference is valid at the time of borrow"); } infer::ExprTypeIsNotInScope(t, span) => { - err.span_note(span, - &format!("...so type `{}` of expression is valid during the \ + err.span_note( + span, + &format!( + "...so type `{}` of expression is valid during the \ expression", - self.ty_to_string(t))); + self.ty_to_string(t) + ), + ); } infer::BindingTypeIsNotValidAtDecl(span) => { - err.span_note(span, - "...so that variable is valid at time of its declaration"); + err.span_note(span, "...so that variable is valid at time of its declaration"); } infer::ParameterInScope(_, span) => { - err.span_note(span, - "...so that a type/lifetime parameter is in scope here"); + err.span_note(span, "...so that a type/lifetime parameter is in scope here"); } infer::DataBorrowed(ty, span) => { - err.span_note(span, - &format!("...so that the type `{}` is not borrowed for too long", - self.ty_to_string(ty))); + err.span_note( + span, + &format!( + "...so that the type `{}` is not borrowed for too long", + self.ty_to_string(ty) + ), + ); } infer::ReferenceOutlivesReferent(ty, span) => { - err.span_note(span, - &format!("...so that the reference type `{}` does not outlive the \ + err.span_note( + span, + &format!( + "...so that the reference type `{}` does not outlive the \ data it points at", - self.ty_to_string(ty))); + self.ty_to_string(ty) + ), + ); } infer::RelateParamBound(span, t) => { - err.span_note(span, - &format!("...so that the type `{}` will meet its required \ + err.span_note( + span, + &format!( + "...so that the type `{}` will meet its required \ lifetime bounds", - self.ty_to_string(t))); + self.ty_to_string(t) + ), + ); } infer::RelateDefaultParamBound(span, t) => { - err.span_note(span, - &format!("...so that type parameter instantiated with `{}`, will \ + err.span_note( + span, + &format!( + "...so that type parameter instantiated with `{}`, will \ meet its declared lifetime bounds", - self.ty_to_string(t))); + self.ty_to_string(t) + ), + ); } infer::RelateRegionParamBound(span) => { - err.span_note(span, - "...so that the declared lifetime parameter bounds are satisfied"); + err.span_note( + span, + "...so that the declared lifetime parameter bounds are satisfied", + ); } infer::SafeDestructor(span) => { - err.span_note(span, - "...so that references are valid when the destructor runs"); + err.span_note(span, "...so that references are valid when the destructor runs"); } infer::CompareImplMethodObligation { span, .. } => { - err.span_note(span, - "...so that the definition in impl matches the definition from the \ - trait"); + err.span_note( + span, + "...so that the definition in impl matches the definition from the \ + trait", + ); } } } - pub(super) fn report_concrete_failure(&self, - region_scope_tree: ®ion::ScopeTree, - origin: SubregionOrigin<'tcx>, - sub: Region<'tcx>, - sup: Region<'tcx>) - -> DiagnosticBuilder<'tcx> { + pub(super) fn report_concrete_failure( + &self, + region_scope_tree: ®ion::ScopeTree, + origin: SubregionOrigin<'tcx>, + sub: Region<'tcx>, + sup: Region<'tcx>, + ) -> DiagnosticBuilder<'tcx> { match origin { infer::Subtype(box trace) => { let terr = TypeError::RegionsDoesNotOutlive(sup, sub); let mut err = self.report_and_explain_type_error(trace, &terr); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, "", sup, "..."); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "...does not necessarily outlive ", sub, ""); + note_and_explain_region(self.tcx, region_scope_tree, &mut err, "", sup, "..."); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "...does not necessarily outlive ", + sub, + "", + ); err } infer::Reborrow(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0312, - "lifetime of reference outlives lifetime of \ - borrowed content..."); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "...the reference is valid for ", - sub, - "..."); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "...but the borrowed content is only valid for ", - sup, - ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0312, + "lifetime of reference outlives lifetime of \ + borrowed content..." + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "...the reference is valid for ", + sub, + "...", + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "...but the borrowed content is only valid for ", + sup, + "", + ); err } infer::ReborrowUpvar(span, ref upvar_id) => { let var_name = self.tcx.hir().name(upvar_id.var_path.hir_id); - let mut err = struct_span_err!(self.tcx.sess, - span, - E0313, - "lifetime of borrowed pointer outlives lifetime \ + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0313, + "lifetime of borrowed pointer outlives lifetime \ of captured variable `{}`...", - var_name); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "...the borrowed pointer is valid for ", - sub, - "..."); - self.tcx.note_and_explain_region( + var_name + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "...the borrowed pointer is valid for ", + sub, + "...", + ); + note_and_explain_region( + self.tcx, region_scope_tree, &mut err, &format!("...but `{}` is only valid for ", var_name), sup, - ""); + "", + ); err } infer::InfStackClosure(span) => { let mut err = struct_span_err!(self.tcx.sess, span, E0314, "closure outlives stack frame"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "...the closure must be valid for ", - sub, - "..."); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "...but the closure's stack frame is only valid \ + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "...the closure must be valid for ", + sub, + "...", + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "...but the closure's stack frame is only valid \ for ", - sup, - ""); + sup, + "", + ); err } infer::InvokeClosure(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0315, - "cannot invoke closure outside of its lifetime"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the closure is only valid for ", sup, ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0315, + "cannot invoke closure outside of its lifetime" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the closure is only valid for ", + sup, + "", + ); err } infer::DerefPointer(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0473, - "dereference of reference outside its lifetime"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the reference is only valid for ", sup, ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0473, + "dereference of reference outside its lifetime" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the reference is only valid for ", + sup, + "", + ); err } infer::ClosureCapture(span, id) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0474, - "captured variable `{}` does not outlive the \ + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0474, + "captured variable `{}` does not outlive the \ enclosing closure", - self.tcx.hir().name(id)); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "captured variable is valid for ", sup, ""); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "closure is valid for ", sub, ""); + self.tcx.hir().name(id) + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "captured variable is valid for ", + sup, + "", + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "closure is valid for ", + sub, + "", + ); err } infer::IndexSlice(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0475, - "index of slice outside its lifetime"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the slice is only valid for ", sup, ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0475, + "index of slice outside its lifetime" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the slice is only valid for ", + sup, + "", + ); err } infer::RelateObjectBound(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0476, - "lifetime of the source pointer does not outlive \ - lifetime bound of the object type"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "object type is valid for ", sub, ""); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "source pointer is only valid for ", - sup, - ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0476, + "lifetime of the source pointer does not outlive \ + lifetime bound of the object type" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "object type is valid for ", + sub, + "", + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "source pointer is only valid for ", + sup, + "", + ); err } infer::RelateParamBound(span, ty) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0477, - "the type `{}` does not fulfill the required \ + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0477, + "the type `{}` does not fulfill the required \ lifetime", - self.ty_to_string(ty)); + self.ty_to_string(ty) + ); match *sub { - ty::ReStatic => { - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "type must satisfy ", sub, "") - } - _ => { - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "type must outlive ", sub, "") - } + ty::ReStatic => note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "type must satisfy ", + sub, + "", + ), + _ => note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "type must outlive ", + sub, + "", + ), } err } infer::RelateRegionParamBound(span) => { let mut err = struct_span_err!(self.tcx.sess, span, E0478, "lifetime bound not satisfied"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "lifetime parameter instantiated with ", - sup, - ""); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "but lifetime parameter must outlive ", - sub, - ""); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "lifetime parameter instantiated with ", + sup, + "", + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "but lifetime parameter must outlive ", + sub, + "", + ); err } infer::RelateDefaultParamBound(span, ty) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0479, - "the type `{}` (provided as the value of a type \ + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0479, + "the type `{}` (provided as the value of a type \ parameter) is not valid at this point", - self.ty_to_string(ty)); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "type must outlive ", sub, ""); + self.ty_to_string(ty) + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "type must outlive ", + sub, + "", + ); err } infer::CallRcvr(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0480, - "lifetime of method receiver does not outlive the \ - method call"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the receiver is only valid for ", sup, ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0480, + "lifetime of method receiver does not outlive the \ + method call" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the receiver is only valid for ", + sup, + "", + ); err } infer::CallArg(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0481, - "lifetime of function argument does not outlive \ - the function call"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the function argument is only valid for ", - sup, - ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0481, + "lifetime of function argument does not outlive \ + the function call" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the function argument is only valid for ", + sup, + "", + ); err } infer::CallReturn(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0482, - "lifetime of return value does not outlive the \ - function call"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the return value is only valid for ", - sup, - ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0482, + "lifetime of return value does not outlive the \ + function call" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the return value is only valid for ", + sup, + "", + ); err } infer::Operand(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0483, - "lifetime of operand does not outlive the \ - operation"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the operand is only valid for ", sup, ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0483, + "lifetime of operand does not outlive the \ + operation" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the operand is only valid for ", + sup, + "", + ); err } infer::AddrOf(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0484, - "reference is not valid at the time of borrow"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the borrow is only valid for ", sup, ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0484, + "reference is not valid at the time of borrow" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the borrow is only valid for ", + sup, + "", + ); err } infer::AutoBorrow(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0485, - "automatically reference is not valid at the time \ - of borrow"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the automatic borrow is only valid for ", - sup, - ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0485, + "automatically reference is not valid at the time \ + of borrow" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the automatic borrow is only valid for ", + sup, + "", + ); err } infer::ExprTypeIsNotInScope(t, span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0486, - "type of expression contains references that are \ + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0486, + "type of expression contains references that are \ not valid during the expression: `{}`", - self.ty_to_string(t)); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "type is only valid for ", sup, ""); + self.ty_to_string(t) + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "type is only valid for ", + sup, + "", + ); err } infer::SafeDestructor(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0487, - "unsafe use of destructor: destructor might be \ - called while references are dead"); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0487, + "unsafe use of destructor: destructor might be \ + called while references are dead" + ); // FIXME (22171): terms "super/subregion" are suboptimal - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "superregion: ", sup, ""); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "subregion: ", sub, ""); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "superregion: ", + sup, + "", + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "subregion: ", + sub, + "", + ); err } infer::BindingTypeIsNotValidAtDecl(span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0488, - "lifetime of variable does not enclose its \ - declaration"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the variable is only valid for ", sup, ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0488, + "lifetime of variable does not enclose its \ + declaration" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the variable is only valid for ", + sup, + "", + ); err } infer::ParameterInScope(_, span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0489, - "type/lifetime parameter not in scope here"); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the parameter is only valid for ", sub, ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0489, + "type/lifetime parameter not in scope here" + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the parameter is only valid for ", + sub, + "", + ); err } infer::DataBorrowed(ty, span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0490, - "a value of type `{}` is borrowed for too long", - self.ty_to_string(ty)); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the type is valid for ", sub, ""); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "but the borrow lasts for ", sup, ""); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0490, + "a value of type `{}` is borrowed for too long", + self.ty_to_string(ty) + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the type is valid for ", + sub, + "", + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "but the borrow lasts for ", + sup, + "", + ); err } infer::ReferenceOutlivesReferent(ty, span) => { - let mut err = struct_span_err!(self.tcx.sess, - span, - E0491, - "in type `{}`, reference has a longer lifetime \ + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0491, + "in type `{}`, reference has a longer lifetime \ than the data it references", - self.ty_to_string(ty)); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "the pointer is valid for ", sub, ""); - self.tcx.note_and_explain_region(region_scope_tree, &mut err, - "but the referenced data is only valid for ", - sup, - ""); + self.ty_to_string(ty) + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "the pointer is valid for ", + sub, + "", + ); + note_and_explain_region( + self.tcx, + region_scope_tree, + &mut err, + "but the referenced data is only valid for ", + sup, + "", + ); err } - infer::CompareImplMethodObligation { span, - item_name, - impl_item_def_id, - trait_item_def_id } => { - self.report_extra_impl_obligation(span, - item_name, - impl_item_def_id, - trait_item_def_id, - &format!("`{}: {}`", sup, sub)) - } + infer::CompareImplMethodObligation { + span, + item_name, + impl_item_def_id, + trait_item_def_id, + } => self.report_extra_impl_obligation( + span, + item_name, + impl_item_def_id, + trait_item_def_id, + &format!("`{}: {}`", sup, sub), + ), } } @@ -465,9 +696,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { self.report_and_explain_type_error(trace, &terr) } - _ => { - self.report_concrete_failure(region_scope_tree, placeholder_origin, sub, sup) - } + _ => self.report_concrete_failure(region_scope_tree, placeholder_origin, sub, sup), } } } diff --git a/src/librustc/infer/freshen.rs b/src/librustc/infer/freshen.rs index 32b51da920..1608795997 100644 --- a/src/librustc/infer/freshen.rs +++ b/src/librustc/infer/freshen.rs @@ -31,14 +31,15 @@ //! variable only once, and it does so as soon as it can, so it is reasonable to ask what the type //! inferencer knows "so far". -use crate::ty::{self, Ty, TyCtxt, TypeFoldable}; use crate::ty::fold::TypeFolder; -use crate::util::nodemap::FxHashMap; +use crate::ty::{self, Ty, TyCtxt, TypeFoldable}; + +use rustc_data_structures::fx::FxHashMap; use std::collections::hash_map::Entry; -use super::InferCtxt; use super::unify_key::ToType; +use super::InferCtxt; pub struct TypeFreshener<'a, 'tcx> { infcx: &'a InferCtxt<'a, 'tcx>, @@ -123,30 +124,29 @@ impl<'a, 'tcx> TypeFolder<'tcx> for TypeFreshener<'a, 'tcx> { r } - ty::ReStatic | - ty::ReEarlyBound(..) | - ty::ReFree(_) | - ty::ReScope(_) | - ty::ReVar(_) | - ty::RePlaceholder(..) | - ty::ReEmpty | - ty::ReErased => { + ty::ReStatic + | ty::ReEarlyBound(..) + | ty::ReFree(_) + | ty::ReScope(_) + | ty::ReVar(_) + | ty::RePlaceholder(..) + | ty::ReEmpty + | ty::ReErased => { // replace all free regions with 'erased self.tcx().lifetimes.re_erased } ty::ReClosureBound(..) => { - bug!( - "encountered unexpected region: {:?}", - r, - ); + bug!("encountered unexpected region: {:?}", r,); } } } fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> { - if !t.needs_infer() && !t.has_erasable_regions() && - !(t.has_closure_types() && self.infcx.in_progress_tables.is_some()) { + if !t.needs_infer() + && !t.has_erasable_regions() + && !(t.has_closure_types() && self.infcx.in_progress_tables.is_some()) + { return t; } @@ -155,83 +155,78 @@ impl<'a, 'tcx> TypeFolder<'tcx> for TypeFreshener<'a, 'tcx> { match t.kind { ty::Infer(ty::TyVar(v)) => { let opt_ty = self.infcx.type_variables.borrow_mut().probe(v).known(); - self.freshen_ty( - opt_ty, - ty::TyVar(v), - ty::FreshTy) + self.freshen_ty(opt_ty, ty::TyVar(v), ty::FreshTy) } - ty::Infer(ty::IntVar(v)) => { - self.freshen_ty( - self.infcx.int_unification_table.borrow_mut() - .probe_value(v) - .map(|v| v.to_type(tcx)), - ty::IntVar(v), - ty::FreshIntTy) - } + ty::Infer(ty::IntVar(v)) => self.freshen_ty( + self.infcx + .int_unification_table + .borrow_mut() + .probe_value(v) + .map(|v| v.to_type(tcx)), + ty::IntVar(v), + ty::FreshIntTy, + ), - ty::Infer(ty::FloatVar(v)) => { - self.freshen_ty( - self.infcx.float_unification_table.borrow_mut() - .probe_value(v) - .map(|v| v.to_type(tcx)), - ty::FloatVar(v), - ty::FreshFloatTy) - } + ty::Infer(ty::FloatVar(v)) => self.freshen_ty( + self.infcx + .float_unification_table + .borrow_mut() + .probe_value(v) + .map(|v| v.to_type(tcx)), + ty::FloatVar(v), + ty::FreshFloatTy, + ), - ty::Infer(ty::FreshTy(ct)) | - ty::Infer(ty::FreshIntTy(ct)) | - ty::Infer(ty::FreshFloatTy(ct)) => { + ty::Infer(ty::FreshTy(ct)) + | ty::Infer(ty::FreshIntTy(ct)) + | ty::Infer(ty::FreshFloatTy(ct)) => { if ct >= self.ty_freshen_count { - bug!("Encountered a freshend type with id {} \ + bug!( + "Encountered a freshend type with id {} \ but our counter is only at {}", - ct, - self.ty_freshen_count); + ct, + self.ty_freshen_count + ); } t } - ty::Generator(..) | - ty::Bool | - ty::Char | - ty::Int(..) | - ty::Uint(..) | - ty::Float(..) | - ty::Adt(..) | - ty::Str | - ty::Error | - ty::Array(..) | - ty::Slice(..) | - ty::RawPtr(..) | - ty::Ref(..) | - ty::FnDef(..) | - ty::FnPtr(_) | - ty::Dynamic(..) | - ty::Never | - ty::Tuple(..) | - ty::Projection(..) | - ty::UnnormalizedProjection(..) | - ty::Foreign(..) | - ty::Param(..) | - ty::Closure(..) | - ty::GeneratorWitness(..) | - ty::Opaque(..) => { - t.super_fold_with(self) - } + ty::Generator(..) + | ty::Bool + | ty::Char + | ty::Int(..) + | ty::Uint(..) + | ty::Float(..) + | ty::Adt(..) + | ty::Str + | ty::Error + | ty::Array(..) + | ty::Slice(..) + | ty::RawPtr(..) + | ty::Ref(..) + | ty::FnDef(..) + | ty::FnPtr(_) + | ty::Dynamic(..) + | ty::Never + | ty::Tuple(..) + | ty::Projection(..) + | ty::UnnormalizedProjection(..) + | ty::Foreign(..) + | ty::Param(..) + | ty::Closure(..) + | ty::GeneratorWitness(..) + | ty::Opaque(..) => t.super_fold_with(self), - ty::Placeholder(..) | - ty::Bound(..) => bug!("unexpected type {:?}", t), + ty::Placeholder(..) | ty::Bound(..) => bug!("unexpected type {:?}", t), } } fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> { match ct.val { ty::ConstKind::Infer(ty::InferConst::Var(v)) => { - let opt_ct = self.infcx.const_unification_table - .borrow_mut() - .probe_value(v) - .val - .known(); + let opt_ct = + self.infcx.const_unification_table.borrow_mut().probe_value(v).val.known(); return self.freshen_const( opt_ct, ty::InferConst::Var(v), @@ -251,14 +246,11 @@ impl<'a, 'tcx> TypeFolder<'tcx> for TypeFreshener<'a, 'tcx> { return ct; } - ty::ConstKind::Bound(..) | - ty::ConstKind::Placeholder(_) => { + ty::ConstKind::Bound(..) | ty::ConstKind::Placeholder(_) => { bug!("unexpected const {:?}", ct) } - ty::ConstKind::Param(_) | - ty::ConstKind::Value(_) | - ty::ConstKind::Unevaluated(..) => {} + ty::ConstKind::Param(_) | ty::ConstKind::Value(_) | ty::ConstKind::Unevaluated(..) => {} } ct.super_fold_with(self) diff --git a/src/librustc/infer/fudge.rs b/src/librustc/infer/fudge.rs index 11f86a619b..265e45635c 100644 --- a/src/librustc/infer/fudge.rs +++ b/src/librustc/infer/fudge.rs @@ -1,9 +1,9 @@ -use crate::ty::{self, Ty, TyCtxt, TyVid, IntVid, FloatVid, RegionVid, ConstVid}; use crate::ty::fold::{TypeFoldable, TypeFolder}; +use crate::ty::{self, ConstVid, FloatVid, IntVid, RegionVid, Ty, TyCtxt, TyVid}; -use super::InferCtxt; -use super::{RegionVariableOrigin, ConstVariableOrigin}; use super::type_variable::TypeVariableOrigin; +use super::InferCtxt; +use super::{ConstVariableOrigin, RegionVariableOrigin}; use rustc_data_structures::unify as ut; use ut::UnifyKey; @@ -16,9 +16,12 @@ fn const_vars_since_snapshot<'tcx>( snapshot: &ut::Snapshot>>, ) -> (Range>, Vec) { let range = table.vars_since_snapshot(snapshot); - (range.start..range.end, (range.start.index..range.end.index).map(|index| { - table.probe_value(ConstVid::from_index(index)).origin.clone() - }).collect()) + ( + range.start..range.end, + (range.start.index..range.end.index) + .map(|index| table.probe_value(ConstVid::from_index(index)).origin) + .collect(), + ) } impl<'a, 'tcx> InferCtxt<'a, 'tcx> { @@ -61,10 +64,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { /// the actual types (`?T`, `Option`) -- and remember that /// after the snapshot is popped, the variable `?T` is no longer /// unified. - pub fn fudge_inference_if_ok( - &self, - f: F, - ) -> Result where + pub fn fudge_inference_if_ok(&self, f: F) -> Result + where F: FnOnce() -> Result, T: TypeFoldable<'tcx>, { @@ -81,18 +82,21 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // going to be popped, so we will have to // eliminate any references to them. - let type_vars = self.type_variables.borrow_mut().vars_since_snapshot( - &snapshot.type_snapshot, - ); - let int_vars = self.int_unification_table.borrow_mut().vars_since_snapshot( - &snapshot.int_snapshot, - ); - let float_vars = self.float_unification_table.borrow_mut().vars_since_snapshot( - &snapshot.float_snapshot, - ); - let region_vars = self.borrow_region_constraints().vars_since_snapshot( - &snapshot.region_constraints_snapshot, - ); + let type_vars = self + .type_variables + .borrow_mut() + .vars_since_snapshot(&snapshot.type_snapshot); + let int_vars = self + .int_unification_table + .borrow_mut() + .vars_since_snapshot(&snapshot.int_snapshot); + let float_vars = self + .float_unification_table + .borrow_mut() + .vars_since_snapshot(&snapshot.float_snapshot); + let region_vars = self + .borrow_region_constraints() + .vars_since_snapshot(&snapshot.region_constraints_snapshot); let const_vars = const_vars_since_snapshot( self.const_unification_table.borrow_mut(), &snapshot.const_snapshot, @@ -120,11 +124,12 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // Micro-optimization: if no variables have been created, then // `value` can't refer to any of them. =) So we can just return it. - if fudger.type_vars.0.is_empty() && - fudger.int_vars.is_empty() && - fudger.float_vars.is_empty() && - fudger.region_vars.0.is_empty() && - fudger.const_vars.0.is_empty() { + if fudger.type_vars.0.is_empty() + && fudger.int_vars.is_empty() + && fudger.float_vars.is_empty() + && fudger.region_vars.0.is_empty() + && fudger.const_vars.0.is_empty() + { Ok(value) } else { Ok(value.fold_with(&mut fudger)) @@ -161,9 +166,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for InferenceFudger<'a, 'tcx> { // variables to their binding anyhow, we know // that it is unbound, so we can just return // it. - debug_assert!(self.infcx.type_variables.borrow_mut() - .probe(vid) - .is_unknown()); + debug_assert!(self.infcx.type_variables.borrow_mut().probe(vid).is_unknown()); ty } } diff --git a/src/librustc/infer/glb.rs b/src/librustc/infer/glb.rs index 37de54a7e8..293dc80d98 100644 --- a/src/librustc/infer/glb.rs +++ b/src/librustc/infer/glb.rs @@ -1,11 +1,11 @@ use super::combine::CombineFields; -use super::InferCtxt; use super::lattice::{self, LatticeDir}; +use super::InferCtxt; use super::Subtype; use crate::traits::ObligationCause; -use crate::ty::{self, Ty, TyCtxt}; use crate::ty::relate::{Relate, RelateResult, TypeRelation}; +use crate::ty::{self, Ty, TyCtxt}; /// "Greatest lower bound" (common subtype) pub struct Glb<'combine, 'infcx, 'tcx> { @@ -23,20 +23,28 @@ impl<'combine, 'infcx, 'tcx> Glb<'combine, 'infcx, 'tcx> { } impl TypeRelation<'tcx> for Glb<'combine, 'infcx, 'tcx> { - fn tag(&self) -> &'static str { "Glb" } + fn tag(&self) -> &'static str { + "Glb" + } - fn tcx(&self) -> TyCtxt<'tcx> { self.fields.tcx() } + fn tcx(&self) -> TyCtxt<'tcx> { + self.fields.tcx() + } - fn param_env(&self) -> ty::ParamEnv<'tcx> { self.fields.param_env } + fn param_env(&self) -> ty::ParamEnv<'tcx> { + self.fields.param_env + } - fn a_is_expected(&self) -> bool { self.a_is_expected } + fn a_is_expected(&self) -> bool { + self.a_is_expected + } - fn relate_with_variance>(&mut self, - variance: ty::Variance, - a: &T, - b: &T) - -> RelateResult<'tcx, T> - { + fn relate_with_variance>( + &mut self, + variance: ty::Variance, + a: &T, + b: &T, + ) -> RelateResult<'tcx, T> { match variance { ty::Invariant => self.fields.equate(self.a_is_expected).relate(a, b), ty::Covariant => self.relate(a, b), @@ -50,12 +58,12 @@ impl TypeRelation<'tcx> for Glb<'combine, 'infcx, 'tcx> { lattice::super_lattice_tys(self, a, b) } - fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>) - -> RelateResult<'tcx, ty::Region<'tcx>> { - debug!("{}.regions({:?}, {:?})", - self.tag(), - a, - b); + fn regions( + &mut self, + a: ty::Region<'tcx>, + b: ty::Region<'tcx>, + ) -> RelateResult<'tcx, ty::Region<'tcx>> { + debug!("{}.regions({:?}, {:?})", self.tag(), a, b); let origin = Subtype(box self.fields.trace.clone()); Ok(self.fields.infcx.borrow_region_constraints().glb_regions(self.tcx(), origin, a, b)) @@ -69,9 +77,13 @@ impl TypeRelation<'tcx> for Glb<'combine, 'infcx, 'tcx> { self.fields.infcx.super_combine_consts(self, a, b) } - fn binders(&mut self, a: &ty::Binder, b: &ty::Binder) - -> RelateResult<'tcx, ty::Binder> - where T: Relate<'tcx> + fn binders( + &mut self, + a: &ty::Binder, + b: &ty::Binder, + ) -> RelateResult<'tcx, ty::Binder> + where + T: Relate<'tcx>, { debug!("binders(a={:?}, b={:?})", a, b); diff --git a/src/librustc/infer/higher_ranked/mod.rs b/src/librustc/infer/higher_ranked/mod.rs index 49c095c69d..bbca482343 100644 --- a/src/librustc/infer/higher_ranked/mod.rs +++ b/src/librustc/infer/higher_ranked/mod.rs @@ -40,8 +40,7 @@ impl<'a, 'tcx> CombineFields<'a, 'tcx> { // but no other pre-existing region variables -- can name // the placeholders. let (a_prime, _) = - self.infcx - .replace_bound_vars_with_fresh_vars(span, HigherRankedType, a); + self.infcx.replace_bound_vars_with_fresh_vars(span, HigherRankedType, a); debug!("a_prime={:?}", a_prime); debug!("b_prime={:?}", b_prime); @@ -49,8 +48,7 @@ impl<'a, 'tcx> CombineFields<'a, 'tcx> { // Compare types now that bound regions have been replaced. let result = self.sub(a_is_expected).relate(&a_prime, &b_prime)?; - self.infcx - .leak_check(!a_is_expected, &placeholder_map, snapshot)?; + self.infcx.leak_check(!a_is_expected, &placeholder_map, snapshot)?; debug!("higher_ranked_sub: OK result={:?}", result); @@ -100,15 +98,13 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { }; let fld_c = |bound_var: ty::BoundVar, ty| { - self.tcx.mk_const( - ty::Const { - val: ty::ConstKind::Placeholder(ty::PlaceholderConst { - universe: next_universe, - name: bound_var, - }), - ty, - } - ) + self.tcx.mk_const(ty::Const { + val: ty::ConstKind::Placeholder(ty::PlaceholderConst { + universe: next_universe, + name: bound_var, + }), + ty, + }) }; let (result, map) = self.tcx.replace_bound_vars(binder, fld_r, fld_t, fld_c); @@ -132,7 +128,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { placeholder_map: &PlaceholderMap<'tcx>, snapshot: &CombinedSnapshot<'_, 'tcx>, ) -> RelateResult<'tcx, ()> { - self.borrow_region_constraints() - .leak_check(self.tcx, overly_polymorphic, placeholder_map, snapshot) + self.borrow_region_constraints().leak_check( + self.tcx, + overly_polymorphic, + placeholder_map, + snapshot, + ) } } diff --git a/src/librustc/infer/lattice.rs b/src/librustc/infer/lattice.rs index 39701231aa..3e0aa4727a 100644 --- a/src/librustc/infer/lattice.rs +++ b/src/librustc/infer/lattice.rs @@ -19,13 +19,13 @@ //! over a `LatticeValue`, which is a value defined with respect to //! a lattice. -use super::InferCtxt; use super::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; +use super::InferCtxt; use crate::traits::ObligationCause; +use crate::ty::relate::{RelateResult, TypeRelation}; use crate::ty::TyVar; use crate::ty::{self, Ty}; -use crate::ty::relate::{RelateResult, TypeRelation}; pub trait LatticeDir<'f, 'tcx>: TypeRelation<'tcx> { fn infcx(&self) -> &'f InferCtxt<'f, 'tcx>; @@ -49,10 +49,7 @@ pub fn super_lattice_tys<'a, 'tcx: 'a, L>( where L: LatticeDir<'a, 'tcx>, { - debug!("{}.lattice_tys({:?}, {:?})", - this.tag(), - a, - b); + debug!("{}.lattice_tys({:?}, {:?})", this.tag(), a, b); if a == b { return Ok(a); @@ -97,8 +94,6 @@ where Ok(v) } - _ => { - infcx.super_combine_tys(this, a, b) - } + _ => infcx.super_combine_tys(this, a, b), } } diff --git a/src/librustc/infer/lexical_region_resolve/graphviz.rs b/src/librustc/infer/lexical_region_resolve/graphviz.rs index ad481417d5..a930e707c5 100644 --- a/src/librustc/infer/lexical_region_resolve/graphviz.rs +++ b/src/librustc/infer/lexical_region_resolve/graphviz.rs @@ -8,25 +8,26 @@ /// For clarity, rename the graphviz crate locally to dot. use graphviz as dot; -use crate::hir::def_id::DefIndex; -use crate::ty; -use crate::middle::free_region::RegionRelations; -use crate::middle::region; use super::Constraint; -use crate::infer::SubregionOrigin; use crate::infer::region_constraints::RegionConstraintData; -use crate::util::nodemap::{FxHashMap, FxHashSet}; +use crate::infer::SubregionOrigin; +use crate::middle::free_region::RegionRelations; +use crate::middle::region; +use crate::ty; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_hir::def_id::DefIndex; use std::borrow::Cow; -use std::collections::hash_map::Entry::Vacant; use std::collections::btree_map::BTreeMap; +use std::collections::hash_map::Entry::Vacant; use std::env; use std::fs; use std::io; use std::sync::atomic::{AtomicBool, Ordering}; fn print_help_message() { - println!("\ + println!( + "\ -Z print-region-graph by default prints a region constraint graph for every \n\ function body, to the path `constraints.nodeXXX.dot`, where the XXX is \n\ replaced with the node id of the function under analysis. \n\ @@ -41,7 +42,8 @@ the node id of the function under analysis. \n\ \n\ (Since you requested help via RUST_REGION_GRAPH=help, no region constraint \n\ graphs will be printed. \n\ -"); +" + ); } pub fn maybe_print_constraints_for<'a, 'tcx>( @@ -56,16 +58,15 @@ pub fn maybe_print_constraints_for<'a, 'tcx>( } let requested_node = env::var("RUST_REGION_GRAPH_NODE") - .ok().and_then(|s| s.parse().map(DefIndex::from_u32).ok()); + .ok() + .and_then(|s| s.parse().map(DefIndex::from_u32).ok()); if requested_node.is_some() && requested_node != Some(context.index) { return; } let requested_output = env::var("RUST_REGION_GRAPH"); - debug!("requested_output: {:?} requested_node: {:?}", - requested_output, - requested_node); + debug!("requested_output: {:?} requested_node: {:?}", requested_output, requested_node); let output_path = { let output_template = match requested_output { @@ -153,12 +154,7 @@ impl<'a, 'tcx> ConstraintGraph<'a, 'tcx> { }); } - ConstraintGraph { - map, - node_ids, - region_rels, - graph_name: name, - } + ConstraintGraph { map, node_ids, region_rels, graph_name: name } } } @@ -175,8 +171,8 @@ impl<'a, 'tcx> dot::Labeller<'a> for ConstraintGraph<'a, 'tcx> { }; let name = || format!("node_{}", node_id); - dot::Id::new(name()).unwrap_or_else(|_| - bug!("failed to create graphviz node identified by {}", name())) + dot::Id::new(name()) + .unwrap_or_else(|_| bug!("failed to create graphviz node identified by {}", name())) } fn node_label(&self, n: &Node) -> dot::LabelText<'_> { match *n { @@ -186,8 +182,9 @@ impl<'a, 'tcx> dot::Labeller<'a> for ConstraintGraph<'a, 'tcx> { } fn edge_label(&self, e: &Edge<'_>) -> dot::LabelText<'_> { match *e { - Edge::Constraint(ref c) => - dot::LabelText::label(format!("{:?}", self.map.get(c).unwrap())), + Edge::Constraint(ref c) => { + dot::LabelText::label(format!("{:?}", self.map.get(c).unwrap())) + } Edge::EnclScope(..) => dot::LabelText::label("(enclosed)".to_owned()), } } @@ -195,14 +192,10 @@ impl<'a, 'tcx> dot::Labeller<'a> for ConstraintGraph<'a, 'tcx> { fn constraint_to_nodes(c: &Constraint<'_>) -> (Node, Node) { match *c { - Constraint::VarSubVar(rv_1, rv_2) => - (Node::RegionVid(rv_1), Node::RegionVid(rv_2)), - Constraint::RegSubVar(r_1, rv_2) => - (Node::Region(*r_1), Node::RegionVid(rv_2)), - Constraint::VarSubReg(rv_1, r_2) => - (Node::RegionVid(rv_1), Node::Region(*r_2)), - Constraint::RegSubReg(r_1, r_2) => - (Node::Region(*r_1), Node::Region(*r_2)), + Constraint::VarSubVar(rv_1, rv_2) => (Node::RegionVid(rv_1), Node::RegionVid(rv_2)), + Constraint::RegSubVar(r_1, rv_2) => (Node::Region(*r_1), Node::RegionVid(rv_2)), + Constraint::VarSubReg(rv_1, r_2) => (Node::RegionVid(rv_1), Node::Region(*r_2)), + Constraint::RegSubReg(r_1, r_2) => (Node::Region(*r_1), Node::Region(*r_2)), } } @@ -210,8 +203,7 @@ fn edge_to_nodes(e: &Edge<'_>) -> (Node, Node) { match *e { Edge::Constraint(ref c) => constraint_to_nodes(c), Edge::EnclScope(sub, sup) => { - (Node::Region(ty::ReScope(sub)), - Node::Region(ty::ReScope(sup))) + (Node::Region(ty::ReScope(sub)), Node::Region(ty::ReScope(sup))) } } } @@ -227,9 +219,9 @@ impl<'a, 'tcx> dot::GraphWalk<'a> for ConstraintGraph<'a, 'tcx> { fn edges(&self) -> dot::Edges<'_, Edge<'tcx>> { debug!("constraint graph has {} edges", self.map.len()); let mut v: Vec<_> = self.map.keys().map(|e| Edge::Constraint(*e)).collect(); - self.region_rels.region_scope_tree.each_encl_scope(|sub, sup| { - v.push(Edge::EnclScope(sub, sup)) - }); + self.region_rels + .region_scope_tree + .each_encl_scope(|sub, sup| v.push(Edge::EnclScope(sub, sup))); debug!("region graph has {} edges", v.len()); Cow::Owned(v) } @@ -252,9 +244,7 @@ fn dump_region_data_to<'a, 'tcx>( map: &ConstraintMap<'tcx>, path: &str, ) -> io::Result<()> { - debug!("dump_region_data map (len: {}) path: {}", - map.len(), - path); + debug!("dump_region_data map (len: {}) path: {}", map.len(), path); let g = ConstraintGraph::new("region_data".to_string(), region_rels, map); debug!("dump_region_data calling render"); let mut v = Vec::new(); diff --git a/src/librustc/infer/lexical_region_resolve/mod.rs b/src/librustc/infer/lexical_region_resolve/mod.rs index f30f19d415..4b1f8a5be1 100644 --- a/src/librustc/infer/lexical_region_resolve/mod.rs +++ b/src/librustc/infer/lexical_region_resolve/mod.rs @@ -1,6 +1,5 @@ //! Lexical region resolution. -use crate::hir::def_id::DefId; use crate::infer::region_constraints::Constraint; use crate::infer::region_constraints::GenericKind; use crate::infer::region_constraints::MemberConstraint; @@ -19,10 +18,10 @@ use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::graph::implementation::{ Direction, Graph, NodeIndex, INCOMING, OUTGOING, }; -use rustc_index::bit_set::BitSet; +use rustc_hir::def_id::DefId; use rustc_index::vec::{Idx, IndexVec}; +use rustc_span::Span; use std::fmt; -use syntax_pos::Span; mod graphviz; @@ -155,10 +154,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> { } fn dump_constraints(&self, free_regions: &RegionRelations<'_, 'tcx>) { - debug!( - "----() Start constraint listing (context={:?}) ()----", - free_regions.context - ); + debug!("----() Start constraint listing (context={:?}) ()----", free_regions.context); for (idx, (constraint, _)) in self.data.constraints.iter().enumerate() { debug!("Constraint {} => {:?}", idx, constraint); } @@ -207,9 +203,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> { // want to stop at the first constraint that makes a change. let mut any_changed = false; for member_constraint in &self.data.member_constraints { - if self.enforce_member_constraint(graph, member_constraint, var_values) { - any_changed = true; - } + any_changed |= self.enforce_member_constraint(graph, member_constraint, var_values); } any_changed } @@ -255,12 +249,8 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> { // Find all the "upper bounds" -- that is, each region `b` such that // `r0 <= b` must hold. - let (member_upper_bounds, _) = self.collect_concrete_regions( - graph, - member_vid, - OUTGOING, - None, - ); + let (member_upper_bounds, _) = + self.collect_concrete_regions(graph, member_vid, OUTGOING, None); // Get an iterator over the *available choice* -- that is, // each choice region `c` where `lb <= c` and `c <= ub` for all the @@ -304,64 +294,59 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> { } fn expansion(&self, var_values: &mut LexicalRegionResolutions<'tcx>) { - let mut process_constraint = |constraint: &Constraint<'tcx>| { - let (a_region, b_vid, b_data, retain) = match *constraint { + let mut constraints = IndexVec::from_elem_n(Vec::new(), var_values.values.len()); + let mut changes = Vec::new(); + for constraint in self.data.constraints.keys() { + let (a_vid, a_region, b_vid, b_data) = match *constraint { Constraint::RegSubVar(a_region, b_vid) => { let b_data = var_values.value_mut(b_vid); - (a_region, b_vid, b_data, false) + (None, a_region, b_vid, b_data) } Constraint::VarSubVar(a_vid, b_vid) => match *var_values.value(a_vid) { - VarValue::ErrorValue => return (false, false), + VarValue::ErrorValue => continue, VarValue::Value(a_region) => { let b_data = var_values.value_mut(b_vid); - let retain = match *b_data { - VarValue::Value(ReStatic) | VarValue::ErrorValue => false, - _ => true, - }; - (a_region, b_vid, b_data, retain) + (Some(a_vid), a_region, b_vid, b_data) } }, Constraint::RegSubReg(..) | Constraint::VarSubReg(..) => { // These constraints are checked after expansion // is done, in `collect_errors`. - return (false, false); + continue; } }; - - let changed = self.expand_node(a_region, b_vid, b_data); - (changed, retain) - }; - - // Using bitsets to track the remaining elements is faster than using a - // `Vec` by itself (which requires removing elements, which requires - // element shuffling, which is slow). - let constraints: Vec<_> = self.data.constraints.keys().collect(); - let mut live_indices: BitSet = BitSet::new_filled(constraints.len()); - let mut killed_indices: BitSet = BitSet::new_empty(constraints.len()); - let mut changed = true; - while changed { - changed = false; - for index in live_indices.iter() { - let constraint = constraints[index]; - let (edge_changed, retain) = process_constraint(constraint); - if edge_changed { - changed = true; - } - if !retain { - let changed = killed_indices.insert(index); - debug_assert!(changed); + if self.expand_node(a_region, b_vid, b_data) { + changes.push(b_vid); + } + if let Some(a_vid) = a_vid { + match *b_data { + VarValue::Value(ReStatic) | VarValue::ErrorValue => (), + _ => { + constraints[a_vid].push((a_vid, b_vid)); + constraints[b_vid].push((a_vid, b_vid)); + } } } - live_indices.subtract(&killed_indices); + } - // We could clear `killed_indices` here, but we don't need to and - // it's cheaper not to. + while let Some(vid) = changes.pop() { + constraints[vid].retain(|&(a_vid, b_vid)| { + let a_region = match *var_values.value(a_vid) { + VarValue::ErrorValue => return false, + VarValue::Value(a_region) => a_region, + }; + let b_data = var_values.value_mut(b_vid); + if self.expand_node(a_region, b_vid, b_data) { + changes.push(b_vid); + } + match *b_data { + VarValue::Value(ReStatic) | VarValue::ErrorValue => false, + _ => true, + } + }); } } - // This function is very hot in some workloads. There's a single callsite - // so always inlining is ok even though it's large. - #[inline(always)] fn expand_node( &self, a_region: Region<'tcx>, @@ -626,7 +611,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> { errors.push(RegionResolutionError::GenericBoundFailure( verify.origin.clone(), - verify.kind.clone(), + verify.kind, sub, )); } @@ -776,7 +761,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> { for upper_bound in &upper_bounds { if !self.region_rels.is_subregion_of(effective_lower_bound, upper_bound.region) { - let origin = self.var_infos[node_idx].origin.clone(); + let origin = self.var_infos[node_idx].origin; debug!( "region inference error at {:?} for {:?}: SubSupConflict sub: {:?} \ sup: {:?}", @@ -799,13 +784,13 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> { // resolution errors here; delay ICE in favor of those errors. self.tcx().sess.delay_span_bug( self.var_infos[node_idx].origin.span(), - &format!("collect_error_for_expanding_node() could not find \ - error for var {:?} in universe {:?}, lower_bounds={:#?}, \ - upper_bounds={:#?}", - node_idx, - node_universe, - lower_bounds, - upper_bounds)); + &format!( + "collect_error_for_expanding_node() could not find \ + error for var {:?} in universe {:?}, lower_bounds={:#?}, \ + upper_bounds={:#?}", + node_idx, node_universe, lower_bounds, upper_bounds + ), + ); } fn collect_concrete_regions( diff --git a/src/librustc/infer/lub.rs b/src/librustc/infer/lub.rs index a1a94865e7..b512d3df3e 100644 --- a/src/librustc/infer/lub.rs +++ b/src/librustc/infer/lub.rs @@ -1,11 +1,11 @@ use super::combine::CombineFields; -use super::InferCtxt; use super::lattice::{self, LatticeDir}; +use super::InferCtxt; use super::Subtype; use crate::traits::ObligationCause; -use crate::ty::{self, Ty, TyCtxt}; use crate::ty::relate::{Relate, RelateResult, TypeRelation}; +use crate::ty::{self, Ty, TyCtxt}; /// "Least upper bound" (common supertype) pub struct Lub<'combine, 'infcx, 'tcx> { @@ -23,20 +23,28 @@ impl<'combine, 'infcx, 'tcx> Lub<'combine, 'infcx, 'tcx> { } impl TypeRelation<'tcx> for Lub<'combine, 'infcx, 'tcx> { - fn tag(&self) -> &'static str { "Lub" } + fn tag(&self) -> &'static str { + "Lub" + } - fn tcx(&self) -> TyCtxt<'tcx> { self.fields.tcx() } + fn tcx(&self) -> TyCtxt<'tcx> { + self.fields.tcx() + } - fn param_env(&self) -> ty::ParamEnv<'tcx> { self.fields.param_env } + fn param_env(&self) -> ty::ParamEnv<'tcx> { + self.fields.param_env + } - fn a_is_expected(&self) -> bool { self.a_is_expected } + fn a_is_expected(&self) -> bool { + self.a_is_expected + } - fn relate_with_variance>(&mut self, - variance: ty::Variance, - a: &T, - b: &T) - -> RelateResult<'tcx, T> - { + fn relate_with_variance>( + &mut self, + variance: ty::Variance, + a: &T, + b: &T, + ) -> RelateResult<'tcx, T> { match variance { ty::Invariant => self.fields.equate(self.a_is_expected).relate(a, b), ty::Covariant => self.relate(a, b), @@ -50,12 +58,12 @@ impl TypeRelation<'tcx> for Lub<'combine, 'infcx, 'tcx> { lattice::super_lattice_tys(self, a, b) } - fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>) - -> RelateResult<'tcx, ty::Region<'tcx>> { - debug!("{}.regions({:?}, {:?})", - self.tag(), - a, - b); + fn regions( + &mut self, + a: ty::Region<'tcx>, + b: ty::Region<'tcx>, + ) -> RelateResult<'tcx, ty::Region<'tcx>> { + debug!("{}.regions({:?}, {:?})", self.tag(), a, b); let origin = Subtype(box self.fields.trace.clone()); Ok(self.fields.infcx.borrow_region_constraints().lub_regions(self.tcx(), origin, a, b)) @@ -69,9 +77,13 @@ impl TypeRelation<'tcx> for Lub<'combine, 'infcx, 'tcx> { self.fields.infcx.super_combine_consts(self, a, b) } - fn binders(&mut self, a: &ty::Binder, b: &ty::Binder) - -> RelateResult<'tcx, ty::Binder> - where T: Relate<'tcx> + fn binders( + &mut self, + a: &ty::Binder, + b: &ty::Binder, + ) -> RelateResult<'tcx, ty::Binder> + where + T: Relate<'tcx>, { debug!("binders(a={:?}, b={:?})", a, b); diff --git a/src/librustc/infer/mod.rs b/src/librustc/infer/mod.rs index 73977878af..f67669e367 100644 --- a/src/librustc/infer/mod.rs +++ b/src/librustc/infer/mod.rs @@ -7,8 +7,6 @@ pub use self::SubregionOrigin::*; pub use self::ValuePairs::*; pub use crate::ty::IntVarValue; -use crate::hir; -use crate::hir::def_id::DefId; use crate::infer::canonical::{Canonical, CanonicalVarValues}; use crate::infer::unify_key::{ConstVarValue, ConstVariableValue}; use crate::middle::free_region::RegionRelations; @@ -17,22 +15,24 @@ use crate::middle::region; use crate::session::config::BorrowckMode; use crate::traits::{self, ObligationCause, PredicateObligations, TraitEngine}; use crate::ty::error::{ExpectedFound, TypeError, UnconstrainedNumeric}; -use crate::ty::fold::{TypeFolder, TypeFoldable}; +use crate::ty::fold::{TypeFoldable, TypeFolder}; use crate::ty::relate::RelateResult; use crate::ty::subst::{GenericArg, InternalSubsts, SubstsRef}; -use crate::ty::{self, GenericParamDefKind, Ty, TyCtxt, InferConst}; -use crate::ty::{FloatVid, IntVid, TyVid, ConstVid}; -use crate::util::nodemap::{FxHashMap, FxHashSet}; +use crate::ty::{self, GenericParamDefKind, InferConst, Ty, TyCtxt}; +use crate::ty::{ConstVid, FloatVid, IntVid, TyVid}; -use errors::DiagnosticBuilder; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::sync::Lrc; use rustc_data_structures::unify as ut; +use rustc_errors::DiagnosticBuilder; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::Symbol; +use rustc_span::Span; use std::cell::{Cell, Ref, RefCell, RefMut}; use std::collections::BTreeMap; use std::fmt; use syntax::ast; -use syntax_pos::symbol::Symbol; -use syntax_pos::Span; use self::combine::CombineFields; use self::lexical_region_resolve::LexicalRegionResolutions; @@ -40,7 +40,7 @@ use self::outlives::env::OutlivesEnvironment; use self::region_constraints::{GenericKind, RegionConstraintData, VarInfos, VerifyBound}; use self::region_constraints::{RegionConstraintCollector, RegionSnapshot}; use self::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; -use self::unify_key::{ToType, ConstVariableOrigin, ConstVariableOriginKind}; +use self::unify_key::{ConstVariableOrigin, ConstVariableOriginKind, ToType}; pub mod at; pub mod canonical; @@ -428,7 +428,7 @@ pub enum NLLRegionVariableOrigin { /// determine whether there is any valid instantiation of a `'a` variable that meets /// some constraint C, we want to blame the "source" of that `for` type, /// rather than blaming the source of the constraint C. - from_forall: bool + from_forall: bool, }, } @@ -437,7 +437,7 @@ impl NLLRegionVariableOrigin { match self { NLLRegionVariableOrigin::FreeRegion => true, NLLRegionVariableOrigin::Placeholder(..) => true, - NLLRegionVariableOrigin::Existential{ .. } => false, + NLLRegionVariableOrigin::Existential { .. } => false, } } @@ -493,10 +493,7 @@ pub struct InferCtxtBuilder<'tcx> { impl TyCtxt<'tcx> { pub fn infer_ctxt(self) -> InferCtxtBuilder<'tcx> { - InferCtxtBuilder { - global_tcx: self, - fresh_tables: None, - } + InferCtxtBuilder { global_tcx: self, fresh_tables: None } } } @@ -532,10 +529,7 @@ impl<'tcx> InferCtxtBuilder<'tcx> { } pub fn enter(&mut self, f: impl for<'a> FnOnce(InferCtxt<'a, 'tcx>) -> R) -> R { - let InferCtxtBuilder { - global_tcx, - ref fresh_tables, - } = *self; + let InferCtxtBuilder { global_tcx, ref fresh_tables } = *self; let in_progress_tables = fresh_tables.as_ref(); global_tcx.enter_local(|tcx| { f(InferCtxt { @@ -565,25 +559,16 @@ impl<'tcx> InferCtxtBuilder<'tcx> { impl ExpectedFound { pub fn new(a_is_expected: bool, a: T, b: T) -> Self { if a_is_expected { - ExpectedFound { - expected: a, - found: b, - } + ExpectedFound { expected: a, found: b } } else { - ExpectedFound { - expected: b, - found: a, - } + ExpectedFound { expected: b, found: a } } } } impl<'tcx, T> InferOk<'tcx, T> { pub fn unit(self) -> InferOk<'tcx, ()> { - InferOk { - value: (), - obligations: self.obligations, - } + InferOk { value: (), obligations: self.obligations } } /// Extracts `value`, registering any obligations into `fulfill_cx`. @@ -645,22 +630,14 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { use crate::ty::error::UnconstrainedNumeric::{UnconstrainedFloat, UnconstrainedInt}; match ty.kind { ty::Infer(ty::IntVar(vid)) => { - if self.int_unification_table - .borrow_mut() - .probe_value(vid) - .is_some() - { + if self.int_unification_table.borrow_mut().probe_value(vid).is_some() { Neither } else { UnconstrainedInt } } ty::Infer(ty::FloatVar(vid)) => { - if self.float_unification_table - .borrow_mut() - .probe_value(vid) - .is_some() - { + if self.float_unification_table.borrow_mut().probe_value(vid).is_some() { Neither } else { UnconstrainedFloat @@ -863,9 +840,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { &self, snapshot: &CombinedSnapshot<'a, 'tcx>, ) -> Option { - self.borrow_region_constraints().region_constraints_added_in_snapshot( - &snapshot.region_constraints_snapshot, - ) + self.borrow_region_constraints() + .region_constraints_added_in_snapshot(&snapshot.region_constraints_snapshot) } pub fn add_given(&self, sub: ty::Region<'tcx>, sup: ty::RegionVid) { @@ -878,12 +854,10 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { { let origin = &ObligationCause::dummy(); self.probe(|_| { - self.at(origin, param_env) - .sub(a, b) - .map(|InferOk { obligations: _, .. }| { - // Ignore obligations, since we are unrolling - // everything anyway. - }) + self.at(origin, param_env).sub(a, b).map(|InferOk { obligations: _, .. }| { + // Ignore obligations, since we are unrolling + // everything anyway. + }) }) } @@ -893,12 +867,10 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { { let origin = &ObligationCause::dummy(); self.probe(|_| { - self.at(origin, param_env) - .eq(a, b) - .map(|InferOk { obligations: _, .. }| { - // Ignore obligations, since we are unrolling - // everything anyway. - }) + self.at(origin, param_env).eq(a, b).map(|InferOk { obligations: _, .. }| { + // Ignore obligations, since we are unrolling + // everything anyway. + }) }) } @@ -909,8 +881,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { b: ty::Region<'tcx>, ) { debug!("sub_regions({:?} <: {:?})", a, b); - self.borrow_region_constraints() - .make_subregion(origin, a, b); + self.borrow_region_constraints().make_subregion(origin, a, b); } /// Require that the region `r` be equal to one of the regions in @@ -924,8 +895,13 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { in_regions: &Lrc>>, ) { debug!("member_constraint({:?} <: {:?})", region, in_regions); - self.borrow_region_constraints() - .member_constraint(opaque_type_def_id, definition_span, hidden_ty, region, in_regions); + self.borrow_region_constraints().member_constraint( + opaque_type_def_id, + definition_span, + hidden_ty, + region, + in_regions, + ); } pub fn subtype_predicate( @@ -954,17 +930,10 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } Some(self.commit_if_ok(|snapshot| { - let ( - ty::SubtypePredicate { - a_is_expected, - a, - b, - }, - placeholder_map, - ) = self.replace_bound_vars_with_placeholders(predicate); - - let ok = self.at(cause, param_env) - .sub_exp(a_is_expected, a, b)?; + let (ty::SubtypePredicate { a_is_expected, a, b }, placeholder_map) = + self.replace_bound_vars_with_placeholders(predicate); + + let ok = self.at(cause, param_env).sub_exp(a_is_expected, a, b)?; self.leak_check(false, &placeholder_map, snapshot)?; @@ -980,10 +949,9 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { self.commit_if_ok(|snapshot| { let (ty::OutlivesPredicate(r_a, r_b), placeholder_map) = self.replace_bound_vars_with_placeholders(predicate); - let origin = SubregionOrigin::from_obligation_cause( - cause, - || RelateRegionParamBound(cause.span), - ); + let origin = SubregionOrigin::from_obligation_cause(cause, || { + RelateRegionParamBound(cause.span) + }); self.sub_regions(origin, r_b, r_a); // `b : a` ==> `a <= b` self.leak_check(false, &placeholder_map, snapshot)?; Ok(()) @@ -991,9 +959,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } pub fn next_ty_var_id(&self, diverging: bool, origin: TypeVariableOrigin) -> TyVid { - self.type_variables - .borrow_mut() - .new_var(self.universe(), diverging, origin) + self.type_variables.borrow_mut().new_var(self.universe(), diverging, origin) } pub fn next_ty_var(&self, origin: TypeVariableOrigin) -> Ty<'tcx> { @@ -1003,11 +969,9 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { pub fn next_ty_var_in_universe( &self, origin: TypeVariableOrigin, - universe: ty::UniverseIndex + universe: ty::UniverseIndex, ) -> Ty<'tcx> { - let vid = self.type_variables - .borrow_mut() - .new_var(universe, false, origin); + let vid = self.type_variables.borrow_mut().new_var(universe, false, origin); self.tcx.mk_ty_var(vid) } @@ -1018,7 +982,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { pub fn next_const_var( &self, ty: Ty<'tcx>, - origin: ConstVariableOrigin + origin: ConstVariableOrigin, ) -> &'tcx ty::Const<'tcx> { self.tcx.mk_const_var(self.next_const_var_id(origin), ty) } @@ -1029,22 +993,18 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { origin: ConstVariableOrigin, universe: ty::UniverseIndex, ) -> &'tcx ty::Const<'tcx> { - let vid = self.const_unification_table + let vid = self + .const_unification_table .borrow_mut() - .new_key(ConstVarValue { - origin, - val: ConstVariableValue::Unknown { universe }, - }); + .new_key(ConstVarValue { origin, val: ConstVariableValue::Unknown { universe } }); self.tcx.mk_const_var(vid, ty) } pub fn next_const_var_id(&self, origin: ConstVariableOrigin) -> ConstVid<'tcx> { - self.const_unification_table - .borrow_mut() - .new_key(ConstVarValue { - origin, - val: ConstVariableValue::Unknown { universe: self.universe() }, - }) + self.const_unification_table.borrow_mut().new_key(ConstVarValue { + origin, + val: ConstVariableValue::Unknown { universe: self.universe() }, + }) } fn next_int_var_id(&self) -> IntVid { @@ -1078,8 +1038,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { origin: RegionVariableOrigin, universe: ty::UniverseIndex, ) -> ty::Region<'tcx> { - let region_var = self.borrow_region_constraints() - .new_region_var(universe, origin); + let region_var = self.borrow_region_constraints().new_region_var(universe, origin); self.tcx.mk_region(ty::ReVar(region_var)) } @@ -1088,10 +1047,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { /// etc) this is the root universe U0. For inference variables or /// placeholders, however, it will return the universe which which /// they are associated. - fn universe_of_region( - &self, - r: ty::Region<'tcx>, - ) -> ty::UniverseIndex { + fn universe_of_region(&self, r: ty::Region<'tcx>) -> ty::UniverseIndex { self.borrow_region_constraints().universe(r) } @@ -1119,8 +1075,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { GenericParamDefKind::Lifetime => { // Create a region inference variable for the given // region parameter definition. - self.next_region_var(EarlyBoundRegion(span, param.name)) - .into() + self.next_region_var(EarlyBoundRegion(span, param.name)).into() } GenericParamDefKind::Type { .. } => { // Create a type inference variable for the given @@ -1135,7 +1090,10 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { self.universe(), false, TypeVariableOrigin { - kind: TypeVariableOriginKind::TypeParameterDefinition(param.name), + kind: TypeVariableOriginKind::TypeParameterDefinition( + param.name, + Some(param.def_id), + ), span, }, ); @@ -1148,12 +1106,10 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { span, }; let const_var_id = - self.const_unification_table - .borrow_mut() - .new_key(ConstVarValue { - origin, - val: ConstVariableValue::Unknown { universe: self.universe() }, - }); + self.const_unification_table.borrow_mut().new_key(ConstVarValue { + origin, + val: ConstVariableValue::Unknown { universe: self.universe() }, + }); self.tcx.mk_const_var(const_var_id, self.tcx.type_of(param.def_id)).into() } } @@ -1215,7 +1171,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { region_map, outlives_env.free_region_map(), ); - let (var_infos, data) = self.region_constraints + let (var_infos, data) = self + .region_constraints .borrow_mut() .take() .expect("regions already resolved") @@ -1223,8 +1180,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { let (lexical_region_resolutions, errors) = lexical_region_resolve::resolve(region_rels, var_infos, data); - let old_value = self.lexical_region_resolutions - .replace(Some(lexical_region_resolutions)); + let old_value = self.lexical_region_resolutions.replace(Some(lexical_region_resolutions)); assert!(old_value.is_none()); if !self.is_tainted_by_errors() { @@ -1273,7 +1229,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { /// called. This is used only during NLL processing to "hand off" ownership /// of the set of region variables into the NLL region context. pub fn take_region_var_origins(&self) -> VarInfos { - let (var_infos, data) = self.region_constraints + let (var_infos, data) = self + .region_constraints .borrow_mut() .take() .expect("regions already resolved") @@ -1359,7 +1316,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { pub fn probe_const_var( &self, - vid: ty::ConstVid<'tcx> + vid: ty::ConstVid<'tcx>, ) -> Result<&'tcx ty::Const<'tcx>, ty::UniverseIndex> { match self.const_unification_table.borrow_mut().probe_value(vid).val { ConstVariableValue::Known { value } => Ok(value), @@ -1427,10 +1384,10 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { &self, span: Span, lbrct: LateBoundRegionConversionTime, - value: &ty::Binder + value: &ty::Binder, ) -> (T, BTreeMap>) where - T: TypeFoldable<'tcx> + T: TypeFoldable<'tcx>, { let fld_r = |br| self.next_region_var(LateBoundRegion(span, br, lbrct)); let fld_t = |_| { @@ -1439,10 +1396,12 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { span, }) }; - let fld_c = |_, ty| self.next_const_var(ty, ConstVariableOrigin { - kind: ConstVariableOriginKind:: MiscVariable, - span, - }); + let fld_c = |_, ty| { + self.next_const_var( + ty, + ConstVariableOrigin { kind: ConstVariableOriginKind::MiscVariable, span }, + ) + }; self.tcx.replace_bound_vars(value, fld_r, fld_t, fld_c) } @@ -1456,8 +1415,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { ) { debug!("verify_generic_bound({:?}, {:?} <: {:?})", kind, a, bound); - self.borrow_region_constraints() - .verify_generic_bound(origin, kind, a, bound); + self.borrow_region_constraints().verify_generic_bound(origin, kind, a, bound); } pub fn type_is_copy_modulo_regions( @@ -1502,11 +1460,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { /// `tcx.fn_sig(def_id)`, this method will work during the /// type-checking of the enclosing function and return the closure /// signature in its partially inferred state. - pub fn closure_sig( - &self, - def_id: DefId, - substs: SubstsRef<'tcx>, - ) -> ty::PolyFnSig<'tcx> { + pub fn closure_sig(&self, def_id: DefId, substs: SubstsRef<'tcx>) -> ty::PolyFnSig<'tcx> { let closure_sig_ty = substs.as_closure().sig_ty(def_id, self.tcx); let closure_sig_ty = self.shallow_resolve(closure_sig_ty); closure_sig_ty.fn_sig(self.tcx) @@ -1589,7 +1543,8 @@ impl<'a, 'tcx> ShallowResolver<'a, 'tcx> { // structurally), and we prevent cycles in any case, // so this recursion should always be of very limited // depth. - self.infcx.type_variables + self.infcx + .type_variables .borrow_mut() .probe(v) .known() @@ -1597,13 +1552,17 @@ impl<'a, 'tcx> ShallowResolver<'a, 'tcx> { .unwrap_or(typ) } - ty::Infer(ty::IntVar(v)) => self.infcx.int_unification_table + ty::Infer(ty::IntVar(v)) => self + .infcx + .int_unification_table .borrow_mut() .probe_value(v) .map(|v| v.to_type(self.infcx.tcx)) .unwrap_or(typ), - ty::Infer(ty::FloatVar(v)) => self.infcx.float_unification_table + ty::Infer(ty::FloatVar(v)) => self + .infcx + .float_unification_table .borrow_mut() .probe_value(v) .map(|v| v.to_type(self.infcx.tcx)) @@ -1662,12 +1621,13 @@ impl<'a, 'tcx> TypeFolder<'tcx> for ShallowResolver<'a, 'tcx> { fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> { if let ty::Const { val: ty::ConstKind::Infer(InferConst::Var(vid)), .. } = ct { - self.infcx.const_unification_table - .borrow_mut() - .probe_value(*vid) - .val - .known() - .unwrap_or(ct) + self.infcx + .const_unification_table + .borrow_mut() + .probe_value(*vid) + .val + .known() + .unwrap_or(ct) } else { ct } @@ -1685,19 +1645,13 @@ impl<'tcx> TypeTrace<'tcx> { a: Ty<'tcx>, b: Ty<'tcx>, ) -> TypeTrace<'tcx> { - TypeTrace { - cause: cause.clone(), - values: Types(ExpectedFound::new(a_is_expected, a, b)), - } + TypeTrace { cause: cause.clone(), values: Types(ExpectedFound::new(a_is_expected, a, b)) } } pub fn dummy(tcx: TyCtxt<'tcx>) -> TypeTrace<'tcx> { TypeTrace { cause: ObligationCause::dummy(), - values: Types(ExpectedFound { - expected: tcx.types.err, - found: tcx.types.err, - }), + values: Types(ExpectedFound { expected: tcx.types.err, found: tcx.types.err }), } } } @@ -1774,7 +1728,7 @@ impl RegionVariableOrigin { Coercion(a) => a, EarlyBoundRegion(a, ..) => a, LateBoundRegion(a, ..) => a, - BoundRegionInCoherence(_) => syntax_pos::DUMMY_SP, + BoundRegionInCoherence(_) => rustc_span::DUMMY_SP, UpvarRegion(_, a) => a, NLL(..) => bug!("NLL variable used with `span`"), } diff --git a/src/librustc/infer/nll_relate/mod.rs b/src/librustc/infer/nll_relate/mod.rs index 1e0feb6a7d..6b53871b9e 100644 --- a/src/librustc/infer/nll_relate/mod.rs +++ b/src/librustc/infer/nll_relate/mod.rs @@ -22,13 +22,13 @@ //! constituents) use crate::infer::InferCtxt; +use crate::infer::{ConstVarValue, ConstVariableValue}; use crate::traits::DomainGoal; use crate::ty::error::TypeError; use crate::ty::fold::{TypeFoldable, TypeVisitor}; use crate::ty::relate::{self, Relate, RelateResult, TypeRelation}; use crate::ty::subst::GenericArg; -use crate::ty::{self, Ty, TyCtxt, InferConst}; -use crate::infer::{ConstVariableValue, ConstVarValue}; +use crate::ty::{self, InferConst, Ty, TyCtxt}; use rustc_data_structures::fx::FxHashMap; use std::fmt::Debug; @@ -144,13 +144,7 @@ where delegate: D, ambient_variance: ty::Variance, ) -> Self { - Self { - infcx, - delegate, - ambient_variance, - a_scopes: vec![], - b_scopes: vec![], - } + Self { infcx, delegate, ambient_variance, a_scopes: vec![], b_scopes: vec![] } } fn ambient_covariance(&self) -> bool { @@ -272,7 +266,7 @@ where ) -> Ty<'tcx> { use crate::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use crate::traits::WhereClause; - use syntax_pos::DUMMY_SP; + use rustc_span::DUMMY_SP; match value_ty.kind { ty::Projection(other_projection_ty) => { @@ -286,10 +280,7 @@ where } _ => { - let projection = ty::ProjectionPredicate { - projection_ty, - ty: value_ty, - }; + let projection = ty::ProjectionPredicate { projection_ty, ty: value_ty }; self.delegate .push_domain_goal(DomainGoal::Holds(WhereClause::ProjectionEq(projection))); value_ty @@ -331,10 +322,7 @@ where match value_ty.kind { ty::Infer(ty::TyVar(value_vid)) => { // Two type variables: just equate them. - self.infcx - .type_variables - .borrow_mut() - .equate(vid, value_vid); + self.infcx.type_variables.borrow_mut().equate(vid, value_vid); return Ok(value_ty); } @@ -355,10 +343,7 @@ where assert!(!generalized_ty.has_infer_types()); } - self.infcx - .type_variables - .borrow_mut() - .instantiate(vid, generalized_ty); + self.infcx.type_variables.borrow_mut().instantiate(vid, generalized_ty); // The generalized values we extract from `canonical_var_values` have // been fully instantiated and hence the set of scopes we have @@ -503,7 +488,9 @@ where } // FIXME(oli-obk): not sure how to get the correct ParamEnv - fn param_env(&self) -> ty::ParamEnv<'tcx> { ty::ParamEnv::empty() } + fn param_env(&self) -> ty::ParamEnv<'tcx> { + ty::ParamEnv::empty() + } fn tag(&self) -> &'static str { "nll::subtype" @@ -519,18 +506,12 @@ where a: &T, b: &T, ) -> RelateResult<'tcx, T> { - debug!( - "relate_with_variance(variance={:?}, a={:?}, b={:?})", - variance, a, b - ); + debug!("relate_with_variance(variance={:?}, a={:?}, b={:?})", variance, a, b); let old_ambient_variance = self.ambient_variance; self.ambient_variance = self.ambient_variance.xform(variance); - debug!( - "relate_with_variance: ambient_variance = {:?}", - self.ambient_variance - ); + debug!("relate_with_variance: ambient_variance = {:?}", self.ambient_variance); let r = self.relate(a, b)?; @@ -573,10 +554,7 @@ where } _ => { - debug!( - "tys(a={:?}, b={:?}, variance={:?})", - a, b, self.ambient_variance - ); + debug!("tys(a={:?}, b={:?}, variance={:?})", a, b, self.ambient_variance); // Will also handle unification of `IntVar` and `FloatVar`. self.infcx.super_combine_tys(self, a, b) @@ -589,10 +567,7 @@ where a: ty::Region<'tcx>, b: ty::Region<'tcx>, ) -> RelateResult<'tcx, ty::Region<'tcx>> { - debug!( - "regions(a={:?}, b={:?}, variance={:?})", - a, b, self.ambient_variance - ); + debug!("regions(a={:?}, b={:?}, variance={:?})", a, b, self.ambient_variance); let v_a = self.replace_bound_region(a, ty::INNERMOST, &self.a_scopes); let v_b = self.replace_bound_region(b, ty::INNERMOST, &self.b_scopes); @@ -630,7 +605,7 @@ where bug!("unexpected inference var {:?}", b) } // FIXME(invariance): see the related FIXME above. - _ => self.infcx.super_combine_consts(self, a, b) + _ => self.infcx.super_combine_consts(self, a, b), } } @@ -661,10 +636,7 @@ where // - Instantiate binders on `b` universally, yielding a universe U1. // - Instantiate binders on `a` existentially in U1. - debug!( - "binders({:?}: {:?}, ambient_variance={:?})", - a, b, self.ambient_variance - ); + debug!("binders({:?}: {:?}, ambient_variance={:?})", a, b, self.ambient_variance); if self.ambient_covariance() { // Covariance, so we want `for<..> A <: for<..> B` -- @@ -767,18 +739,11 @@ impl<'me, 'tcx> TypeVisitor<'tcx> for ScopeInstantiator<'me, 'tcx> { } fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool { - let ScopeInstantiator { - bound_region_scope, - next_region, - .. - } = self; + let ScopeInstantiator { bound_region_scope, next_region, .. } = self; match r { ty::ReLateBound(debruijn, br) if *debruijn == self.target_index => { - bound_region_scope - .map - .entry(*br) - .or_insert_with(|| next_region(*br)); + bound_region_scope.map.entry(*br).or_insert_with(|| next_region(*br)); } _ => {} @@ -841,7 +806,9 @@ where } // FIXME(oli-obk): not sure how to get the correct ParamEnv - fn param_env(&self) -> ty::ParamEnv<'tcx> { ty::ParamEnv::empty() } + fn param_env(&self) -> ty::ParamEnv<'tcx> { + ty::ParamEnv::empty() + } fn tag(&self) -> &'static str { "nll::generalizer" @@ -888,10 +855,7 @@ where ty::Infer(ty::TyVar(_)) | ty::Infer(ty::IntVar(_)) | ty::Infer(ty::FloatVar(_)) if D::forbid_inference_vars() => { - bug!( - "unexpected inference variable encountered in NLL generalization: {:?}", - a - ); + bug!("unexpected inference variable encountered in NLL generalization: {:?}", a); } ty::Infer(ty::TyVar(vid)) => { @@ -909,9 +873,7 @@ where drop(variables); self.relate(&u, &u) } - TypeVariableValue::Unknown { - universe: _universe, - } => { + TypeVariableValue::Unknown { universe: _universe } => { if self.ambient_variance == ty::Bivariant { // FIXME: we may need a WF predicate (related to #54105). } @@ -924,10 +886,7 @@ where let new_var_id = variables.new_var(self.universe, false, origin); let u = self.tcx().mk_ty_var(new_var_id); - debug!( - "generalize: replacing original vid={:?} with new={:?}", - vid, u - ); + debug!("generalize: replacing original vid={:?} with new={:?}", vid, u); return Ok(u); } } @@ -999,10 +958,7 @@ where ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>> { match a.val { ty::ConstKind::Infer(InferConst::Var(_)) if D::forbid_inference_vars() => { - bug!( - "unexpected inference variable encountered in NLL generalization: {:?}", - a - ); + bug!("unexpected inference variable encountered in NLL generalization: {:?}", a); } ty::ConstKind::Infer(InferConst::Var(vid)) => { let mut variable_table = self.infcx.const_unification_table.borrow_mut(); diff --git a/src/librustc/infer/opaque_types/mod.rs b/src/librustc/infer/opaque_types/mod.rs index 9b197c1ecb..fe3a5d149f 100644 --- a/src/librustc/infer/opaque_types/mod.rs +++ b/src/librustc/infer/opaque_types/mod.rs @@ -1,21 +1,19 @@ -use crate::hir; -use crate::hir::def_id::DefId; -use crate::hir::Node; -use crate::infer::outlives::free_region_map::FreeRegionRelations; +use crate::infer::error_reporting::{note_and_explain_free_region, note_and_explain_region}; use crate::infer::{self, InferCtxt, InferOk, TypeVariableOrigin, TypeVariableOriginKind}; use crate::middle::region; use crate::traits::{self, PredicateObligation}; use crate::ty::fold::{BottomUpFolder, TypeFoldable, TypeFolder, TypeVisitor}; -use crate::ty::subst::{InternalSubsts, GenericArg, SubstsRef, GenericArgKind}; +use crate::ty::free_region_map::FreeRegionRelations; +use crate::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, SubstsRef}; use crate::ty::{self, GenericParamDefKind, Ty, TyCtxt}; -use crate::util::nodemap::DefIdMap; -use errors::DiagnosticBuilder; use rustc::session::config::nightly_options; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::sync::Lrc; -use syntax_pos::Span; - -use rustc_error_codes::*; +use rustc_errors::{struct_span_err, DiagnosticBuilder}; +use rustc_hir as hir; +use rustc_hir::def_id::{DefId, DefIdMap}; +use rustc_hir::Node; +use rustc_span::Span; pub type OpaqueTypeMap<'tcx> = DefIdMap>; @@ -24,7 +22,6 @@ pub type OpaqueTypeMap<'tcx> = DefIdMap>; /// appear in the return type). #[derive(Copy, Clone, Debug)] pub struct OpaqueTypeDecl<'tcx> { - /// The opaque type (`ty::Opaque`) for this declaration. pub opaque_type: Ty<'tcx>, @@ -351,7 +348,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { debug!("constrain_opaque_type: bounds={:#?}", bounds); let opaque_type = tcx.mk_opaque(def_id, opaque_defn.substs); - let required_region_bounds = tcx.required_region_bounds(opaque_type, bounds.predicates); + let required_region_bounds = + required_region_bounds(tcx, opaque_type, bounds.predicates); debug_assert!(!required_region_bounds.is_empty()); for required_region in required_region_bounds { @@ -467,13 +465,15 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { concrete_ty.visit_with(&mut ConstrainOpaqueTypeRegionVisitor { tcx: self.tcx, - op: |r| self.member_constraint( - opaque_type_def_id, - opaque_defn.definition_span, - concrete_ty, - r, - &choice_regions, - ), + op: |r| { + self.member_constraint( + opaque_type_def_id, + opaque_defn.definition_span, + concrete_ty, + r, + &choice_regions, + ) + }, }); } @@ -522,9 +522,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { err.span_label(span, label); if nightly_options::is_nightly_build() { - help!(err, - "add #![feature(member_constraints)] to the crate attributes \ - to enable"); + err.help("add #![feature(member_constraints)] to the crate attributes to enable"); } err.emit(); @@ -622,7 +620,8 @@ pub fn unexpected_hidden_region_diagnostic( // // (*) if not, the `tainted_by_errors` flag would be set to // true in any case, so we wouldn't be here at all. - tcx.note_and_explain_free_region( + note_and_explain_free_region( + tcx, &mut err, &format!("hidden type `{}` captures ", hidden_ty), hidden_region, @@ -647,7 +646,8 @@ pub fn unexpected_hidden_region_diagnostic( // If the `region_scope_tree` is available, this is being // invoked from the "region inferencer error". We can at // least report a really cryptic error for now. - tcx.note_and_explain_region( + note_and_explain_region( + tcx, region_scope_tree, &mut err, &format!("hidden type `{}` captures ", hidden_ty), @@ -839,26 +839,28 @@ impl TypeFolder<'tcx> for ReverseMapper<'tcx> { self.opaque_type_def_id, hidden_ty, r, - ).emit(); + ) + .emit(); } } self.tcx.lifetimes.re_empty } None => { - self.tcx.sess - .struct_span_err( - self.span, - "non-defining opaque type use in defining scope" - ) + self.tcx + .sess + .struct_span_err(self.span, "non-defining opaque type use in defining scope") .span_label( self.span, - format!("lifetime `{}` is part of concrete type but not used in \ - parameter list of the `impl Trait` type alias", r), + format!( + "lifetime `{}` is part of concrete type but not used in \ + parameter list of the `impl Trait` type alias", + r + ), ) .emit(); self.tcx().mk_region(ty::ReStatic) - }, + } } } @@ -890,32 +892,30 @@ impl TypeFolder<'tcx> for ReverseMapper<'tcx> { // during codegen. let generics = self.tcx.generics_of(def_id); - let substs = - self.tcx.mk_substs(substs.iter().enumerate().map(|(index, &kind)| { - if index < generics.parent_count { - // Accommodate missing regions in the parent kinds... - self.fold_kind_mapping_missing_regions_to_empty(kind) - } else { - // ...but not elsewhere. - self.fold_kind_normally(kind) - } - })); + let substs = self.tcx.mk_substs(substs.iter().enumerate().map(|(index, &kind)| { + if index < generics.parent_count { + // Accommodate missing regions in the parent kinds... + self.fold_kind_mapping_missing_regions_to_empty(kind) + } else { + // ...but not elsewhere. + self.fold_kind_normally(kind) + } + })); self.tcx.mk_closure(def_id, substs) } ty::Generator(def_id, substs, movability) => { let generics = self.tcx.generics_of(def_id); - let substs = - self.tcx.mk_substs(substs.iter().enumerate().map(|(index, &kind)| { - if index < generics.parent_count { - // Accommodate missing regions in the parent kinds... - self.fold_kind_mapping_missing_regions_to_empty(kind) - } else { - // ...but not elsewhere. - self.fold_kind_normally(kind) - } - })); + let substs = self.tcx.mk_substs(substs.iter().enumerate().map(|(index, &kind)| { + if index < generics.parent_count { + // Accommodate missing regions in the parent kinds... + self.fold_kind_mapping_missing_regions_to_empty(kind) + } else { + // ...but not elsewhere. + self.fold_kind_normally(kind) + } + })); self.tcx.mk_generator(def_id, substs, movability) } @@ -928,12 +928,15 @@ impl TypeFolder<'tcx> for ReverseMapper<'tcx> { Some(GenericArgKind::Type(t1)) => t1, Some(u) => panic!("type mapped to unexpected kind: {:?}", u), None => { - self.tcx.sess + self.tcx + .sess .struct_span_err( self.span, - &format!("type parameter `{}` is part of concrete type but not \ + &format!( + "type parameter `{}` is part of concrete type but not \ used in parameter list for the `impl Trait` type alias", - ty), + ty + ), ) .emit(); @@ -958,12 +961,15 @@ impl TypeFolder<'tcx> for ReverseMapper<'tcx> { Some(GenericArgKind::Const(c1)) => c1, Some(u) => panic!("const mapped to unexpected kind: {:?}", u), None => { - self.tcx.sess + self.tcx + .sess .struct_span_err( self.span, - &format!("const parameter `{}` is part of concrete type but not \ + &format!( + "const parameter `{}` is part of concrete type but not \ used in parameter list for the `impl Trait` type alias", - ct) + ct + ), ) .emit(); @@ -1035,8 +1041,7 @@ impl<'a, 'tcx> Instantiator<'a, 'tcx> { let parent_def_id = self.parent_def_id; let def_scope_default = || { let opaque_parent_hir_id = tcx.hir().get_parent_item(opaque_hir_id); - parent_def_id == tcx.hir() - .local_def_id(opaque_parent_hir_id) + parent_def_id == tcx.hir().local_def_id(opaque_parent_hir_id) }; let (in_definition_scope, origin) = match tcx.hir().find(opaque_hir_id) { Some(Node::Item(item)) => match item.kind { @@ -1052,29 +1057,17 @@ impl<'a, 'tcx> Instantiator<'a, 'tcx> { origin, .. }) => ( - may_define_opaque_type( - tcx, - self.parent_def_id, - opaque_hir_id, - ), + may_define_opaque_type(tcx, self.parent_def_id, opaque_hir_id), origin, ), - _ => { - (def_scope_default(), hir::OpaqueTyOrigin::TypeAlias) - } + _ => (def_scope_default(), hir::OpaqueTyOrigin::TypeAlias), }, Some(Node::ImplItem(item)) => match item.kind { hir::ImplItemKind::OpaqueTy(_) => ( - may_define_opaque_type( - tcx, - self.parent_def_id, - opaque_hir_id, - ), + may_define_opaque_type(tcx, self.parent_def_id, opaque_hir_id), hir::OpaqueTyOrigin::TypeAlias, ), - _ => { - (def_scope_default(), hir::OpaqueTyOrigin::TypeAlias) - } + _ => (def_scope_default(), hir::OpaqueTyOrigin::TypeAlias), }, _ => bug!( "expected (impl) item, found {}", @@ -1135,7 +1128,7 @@ impl<'a, 'tcx> Instantiator<'a, 'tcx> { debug!("instantiate_opaque_types: bounds={:?}", bounds); - let required_region_bounds = tcx.required_region_bounds(ty, bounds.predicates.clone()); + let required_region_bounds = required_region_bounds(tcx, ty, bounds.predicates.clone()); debug!("instantiate_opaque_types: required_region_bounds={:?}", required_region_bounds); // Make sure that we are in fact defining the *entire* type @@ -1211,11 +1204,7 @@ impl<'a, 'tcx> Instantiator<'a, 'tcx> { /// Here, `def_id` is the `DefId` of the defining use of the opaque type (e.g., `f1` or `f2`), /// and `opaque_hir_id` is the `HirId` of the definition of the opaque type `Baz`. /// For the above example, this function returns `true` for `f1` and `false` for `f2`. -pub fn may_define_opaque_type( - tcx: TyCtxt<'_>, - def_id: DefId, - opaque_hir_id: hir::HirId, -) -> bool { +pub fn may_define_opaque_type(tcx: TyCtxt<'_>, def_id: DefId, opaque_hir_id: hir::HirId) -> bool { let mut hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); // Named opaque types can be defined by any siblings or children of siblings. @@ -1228,9 +1217,73 @@ pub fn may_define_opaque_type( let res = hir_id == scope; trace!( "may_define_opaque_type(def={:?}, opaque_node={:?}) = {}", - tcx.hir().get(hir_id), + tcx.hir().find(hir_id), tcx.hir().get(opaque_hir_id), res ); res } + +/// Given a set of predicates that apply to an object type, returns +/// the region bounds that the (erased) `Self` type must +/// outlive. Precisely *because* the `Self` type is erased, the +/// parameter `erased_self_ty` must be supplied to indicate what type +/// has been used to represent `Self` in the predicates +/// themselves. This should really be a unique type; `FreshTy(0)` is a +/// popular choice. +/// +/// N.B., in some cases, particularly around higher-ranked bounds, +/// this function returns a kind of conservative approximation. +/// That is, all regions returned by this function are definitely +/// required, but there may be other region bounds that are not +/// returned, as well as requirements like `for<'a> T: 'a`. +/// +/// Requires that trait definitions have been processed so that we can +/// elaborate predicates and walk supertraits. +// +// FIXME: callers may only have a `&[Predicate]`, not a `Vec`, so that's +// what this code should accept. +crate fn required_region_bounds( + tcx: TyCtxt<'tcx>, + erased_self_ty: Ty<'tcx>, + predicates: Vec>, +) -> Vec> { + debug!( + "required_region_bounds(erased_self_ty={:?}, predicates={:?})", + erased_self_ty, predicates + ); + + assert!(!erased_self_ty.has_escaping_bound_vars()); + + traits::elaborate_predicates(tcx, predicates) + .filter_map(|predicate| { + match predicate { + ty::Predicate::Projection(..) + | ty::Predicate::Trait(..) + | ty::Predicate::Subtype(..) + | ty::Predicate::WellFormed(..) + | ty::Predicate::ObjectSafe(..) + | ty::Predicate::ClosureKind(..) + | ty::Predicate::RegionOutlives(..) + | ty::Predicate::ConstEvaluatable(..) => None, + ty::Predicate::TypeOutlives(predicate) => { + // Search for a bound of the form `erased_self_ty + // : 'a`, but be wary of something like `for<'a> + // erased_self_ty : 'a` (we interpret a + // higher-ranked bound like that as 'static, + // though at present the code in `fulfill.rs` + // considers such bounds to be unsatisfiable, so + // it's kind of a moot point since you could never + // construct such an object, but this seems + // correct even if that code changes). + let ty::OutlivesPredicate(ref t, ref r) = predicate.skip_binder(); + if t == &erased_self_ty && !r.has_escaping_bound_vars() { + Some(*r) + } else { + None + } + } + } + }) + .collect() +} diff --git a/src/librustc/infer/outlives/env.rs b/src/librustc/infer/outlives/env.rs index e6155454d4..ee2e629c2f 100644 --- a/src/librustc/infer/outlives/env.rs +++ b/src/librustc/infer/outlives/env.rs @@ -1,10 +1,10 @@ -use crate::infer::outlives::free_region_map::FreeRegionMap; use crate::infer::{GenericKind, InferCtxt}; -use crate::hir; -use rustc_data_structures::fx::FxHashMap; -use syntax_pos::Span; use crate::traits::query::outlives_bounds::{self, OutlivesBound}; +use crate::ty::free_region_map::FreeRegionMap; use crate::ty::{self, Ty}; +use rustc_data_structures::fx::FxHashMap; +use rustc_hir as hir; +use rustc_span::Span; /// The `OutlivesEnvironment` collects information about what outlives /// what in a given type-checking setting. For example, if we have a @@ -177,10 +177,8 @@ impl<'a, 'tcx> OutlivesEnvironment<'tcx> { /// Save the current set of region-bound pairs under the given `body_id`. pub fn save_implied_bounds(&mut self, body_id: hir::HirId) { - let old = self.region_bound_pairs_map.insert( - body_id, - self.region_bound_pairs_accum.clone(), - ); + let old = + self.region_bound_pairs_map.insert(body_id, self.region_bound_pairs_accum.clone()); assert!(old.is_none()); } @@ -201,13 +199,10 @@ impl<'a, 'tcx> OutlivesEnvironment<'tcx> { match outlives_bound { OutlivesBound::RegionSubRegion(r_a @ &ty::ReEarlyBound(_), &ty::ReVar(vid_b)) | OutlivesBound::RegionSubRegion(r_a @ &ty::ReFree(_), &ty::ReVar(vid_b)) => { - infcx - .expect("no infcx provided but region vars found") - .add_given(r_a, vid_b); + infcx.expect("no infcx provided but region vars found").add_given(r_a, vid_b); } OutlivesBound::RegionSubParam(r_a, param_b) => { - self.region_bound_pairs_accum - .push((r_a, GenericKind::Param(param_b))); + self.region_bound_pairs_accum.push((r_a, GenericKind::Param(param_b))); } OutlivesBound::RegionSubProjection(r_a, projection_b) => { self.region_bound_pairs_accum diff --git a/src/librustc/infer/outlives/mod.rs b/src/librustc/infer/outlives/mod.rs index e421d6fb69..6fc72470c9 100644 --- a/src/librustc/infer/outlives/mod.rs +++ b/src/librustc/infer/outlives/mod.rs @@ -1,6 +1,5 @@ //! Various code related to computing outlives relations. pub mod env; -pub mod free_region_map; pub mod obligations; pub mod verify; diff --git a/src/librustc/infer/outlives/obligations.rs b/src/librustc/infer/outlives/obligations.rs index f9443376a9..45e4a84589 100644 --- a/src/librustc/infer/outlives/obligations.rs +++ b/src/librustc/infer/outlives/obligations.rs @@ -62,12 +62,12 @@ use crate::infer::outlives::env::RegionBoundPairs; use crate::infer::outlives::verify::VerifyBoundCx; use crate::infer::{self, GenericKind, InferCtxt, RegionObligation, SubregionOrigin, VerifyBound}; -use rustc_data_structures::fx::FxHashMap; -use crate::hir; use crate::traits::ObligationCause; use crate::ty::outlives::Component; -use crate::ty::{self, Region, Ty, TyCtxt, TypeFoldable}; use crate::ty::subst::GenericArgKind; +use crate::ty::{self, Region, Ty, TyCtxt, TypeFoldable}; +use rustc_data_structures::fx::FxHashMap; +use rustc_hir as hir; impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { /// Registers that the given region obligation must be resolved @@ -80,14 +80,9 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { body_id: hir::HirId, obligation: RegionObligation<'tcx>, ) { - debug!( - "register_region_obligation(body_id={:?}, obligation={:?})", - body_id, obligation - ); + debug!("register_region_obligation(body_id={:?}, obligation={:?})", body_id, obligation); - self.region_obligations - .borrow_mut() - .push((body_id, obligation)); + self.region_obligations.borrow_mut().push((body_id, obligation)); } pub fn register_region_obligation_with_cause( @@ -102,11 +97,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { self.register_region_obligation( cause.body_id, - RegionObligation { - sup_type, - sub_region, - origin, - }, + RegionObligation { sup_type, sub_region, origin }, ); } @@ -163,15 +154,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { let my_region_obligations = self.take_registered_region_obligations(); - for ( - body_id, - RegionObligation { - sup_type, - sub_region, - origin, - }, - ) in my_region_obligations - { + for (body_id, RegionObligation { sup_type, sub_region, origin }) in my_region_obligations { debug!( "process_registered_region_obligations: sup_type={:?} sub_region={:?} origin={:?}", sup_type, sub_region, origin @@ -291,10 +274,7 @@ where ty: Ty<'tcx>, region: ty::Region<'tcx>, ) { - debug!( - "type_must_outlive(ty={:?}, region={:?}, origin={:?})", - ty, region, origin - ); + debug!("type_must_outlive(ty={:?}, region={:?}, origin={:?})", ty, region, origin); assert!(!ty.has_escaping_bound_vars()); @@ -313,8 +293,7 @@ where let origin = origin.clone(); match component { Component::Region(region1) => { - self.delegate - .push_sub_region_constraint(origin, region, region1); + self.delegate.push_sub_region_constraint(origin, region, region1); } Component::Param(param_ty) => { self.param_ty_must_outlive(origin, region, *param_ty); @@ -351,8 +330,7 @@ where let generic = GenericKind::Param(param_ty); let verify_bound = self.verify_bound.generic_bound(generic); - self.delegate - .push_verify(origin, generic, region, verify_bound); + self.delegate.push_verify(origin, generic, region, verify_bound); } fn projection_must_outlive( @@ -383,34 +361,28 @@ where // Compute the bounds we can derive from the trait definition. // These are guaranteed to apply, no matter the inference // results. - let trait_bounds: Vec<_> = self.verify_bound - .projection_declared_bounds_from_trait(projection_ty) - .collect(); + let trait_bounds: Vec<_> = + self.verify_bound.projection_declared_bounds_from_trait(projection_ty).collect(); // Compute the bounds we can derive from the environment. This // is an "approximate" match -- in some cases, these bounds // may not apply. - let mut approx_env_bounds = self.verify_bound - .projection_approx_declared_bounds_from_env(projection_ty); - debug!( - "projection_must_outlive: approx_env_bounds={:?}", - approx_env_bounds - ); + let mut approx_env_bounds = + self.verify_bound.projection_approx_declared_bounds_from_env(projection_ty); + debug!("projection_must_outlive: approx_env_bounds={:?}", approx_env_bounds); // Remove outlives bounds that we get from the environment but // which are also deducable from the trait. This arises (cc // #55756) in cases where you have e.g., `>::Item: // 'a` in the environment but `trait Foo<'b> { type Item: 'b // }` in the trait definition. - approx_env_bounds.retain(|bound| { - match bound.0.kind { - ty::Projection(projection_ty) => { - self.verify_bound.projection_declared_bounds_from_trait(projection_ty) - .all(|r| r != bound.1) - } + approx_env_bounds.retain(|bound| match bound.0.kind { + ty::Projection(projection_ty) => self + .verify_bound + .projection_declared_bounds_from_trait(projection_ty) + .all(|r| r != bound.1), - _ => panic!("expected only projection types from env, not {:?}", bound.0), - } + _ => panic!("expected only projection types from env, not {:?}", bound.0), }); // If declared bounds list is empty, the only applicable rule is @@ -465,13 +437,9 @@ where .all(|b| *b == trait_bounds[0]) { let unique_bound = trait_bounds[0]; - debug!( - "projection_must_outlive: unique trait bound = {:?}", - unique_bound - ); + debug!("projection_must_outlive: unique trait bound = {:?}", unique_bound); debug!("projection_must_outlive: unique declared bound appears in trait ref"); - self.delegate - .push_sub_region_constraint(origin, region, unique_bound); + self.delegate.push_sub_region_constraint(origin, region, unique_bound); return; } @@ -482,8 +450,7 @@ where // even though a satisfactory solution exists. let generic = GenericKind::Projection(projection_ty); let verify_bound = self.verify_bound.generic_bound(generic); - self.delegate - .push_verify(origin, generic.clone(), region, verify_bound); + self.delegate.push_verify(origin, generic.clone(), region, verify_bound); } } diff --git a/src/librustc/infer/outlives/verify.rs b/src/librustc/infer/outlives/verify.rs index 3e28145c0f..8ee8482e79 100644 --- a/src/librustc/infer/outlives/verify.rs +++ b/src/librustc/infer/outlives/verify.rs @@ -1,10 +1,10 @@ -use crate::hir::def_id::DefId; use crate::infer::outlives::env::RegionBoundPairs; use crate::infer::{GenericKind, VerifyBound}; use crate::traits; -use crate::ty::subst::{Subst, InternalSubsts}; +use crate::ty::subst::{InternalSubsts, Subst}; use crate::ty::{self, Ty, TyCtxt}; -use crate::util::captures::Captures; +use rustc_data_structures::captures::Captures; +use rustc_hir::def_id::DefId; /// The `TypeOutlives` struct has the job of "lowering" a `T: 'a` /// obligation into a series of `'a: 'b` constraints and "verifys", as @@ -26,12 +26,7 @@ impl<'cx, 'tcx> VerifyBoundCx<'cx, 'tcx> { implicit_region_bound: Option>, param_env: ty::ParamEnv<'tcx>, ) -> Self { - Self { - tcx, - region_bound_pairs, - implicit_region_bound, - param_env, - } + Self { tcx, region_bound_pairs, implicit_region_bound, param_env } } /// Returns a "verify bound" that encodes what we know about @@ -56,7 +51,8 @@ impl<'cx, 'tcx> VerifyBoundCx<'cx, 'tcx> { // Start with anything like `T: 'a` we can scrape from the // environment - let param_bounds = self.declared_generic_bounds_from_env(GenericKind::Param(param_ty)) + let param_bounds = self + .declared_generic_bounds_from_env(GenericKind::Param(param_ty)) .into_iter() .map(|outlives| outlives.1); @@ -113,7 +109,8 @@ impl<'cx, 'tcx> VerifyBoundCx<'cx, 'tcx> { self.tcx.mk_projection(projection_ty.item_def_id, projection_ty.substs); // Search the env for where clauses like `P: 'a`. - let env_bounds = self.projection_approx_declared_bounds_from_env(projection_ty) + let env_bounds = self + .projection_approx_declared_bounds_from_env(projection_ty) .into_iter() .map(|ty::OutlivesPredicate(ty, r)| { let vb = VerifyBound::OutlivedBy(r); @@ -128,41 +125,32 @@ impl<'cx, 'tcx> VerifyBoundCx<'cx, 'tcx> { }); // Extend with bounds that we can find from the trait. - let trait_bounds = self.projection_declared_bounds_from_trait(projection_ty) + let trait_bounds = self + .projection_declared_bounds_from_trait(projection_ty) .into_iter() .map(|r| VerifyBound::OutlivedBy(r)); // see the extensive comment in projection_must_outlive - let ty = self.tcx - .mk_projection(projection_ty.item_def_id, projection_ty.substs); + let ty = self.tcx.mk_projection(projection_ty.item_def_id, projection_ty.substs); let recursive_bound = self.recursive_type_bound(ty); VerifyBound::AnyBound(env_bounds.chain(trait_bounds).collect()).or(recursive_bound) } fn recursive_type_bound(&self, ty: Ty<'tcx>) -> VerifyBound<'tcx> { - let mut bounds = ty.walk_shallow() - .map(|subty| self.type_bound(subty)) - .collect::>(); + let mut bounds = ty.walk_shallow().map(|subty| self.type_bound(subty)).collect::>(); let mut regions = smallvec![]; ty.push_regions(&mut regions); regions.retain(|r| !r.is_late_bound()); // ignore late-bound regions bounds.push(VerifyBound::AllBounds( - regions - .into_iter() - .map(|r| VerifyBound::OutlivedBy(r)) - .collect(), + regions.into_iter().map(|r| VerifyBound::OutlivedBy(r)).collect(), )); // remove bounds that must hold, since they are not interesting bounds.retain(|b| !b.must_hold()); - if bounds.len() == 1 { - bounds.pop().unwrap() - } else { - VerifyBound::AllBounds(bounds) - } + if bounds.len() == 1 { bounds.pop().unwrap() } else { VerifyBound::AllBounds(bounds) } } /// Searches the environment for where-clauses like `G: 'a` where @@ -284,16 +272,15 @@ impl<'cx, 'tcx> VerifyBoundCx<'cx, 'tcx> { let tcx = self.tcx; let assoc_item = tcx.associated_item(assoc_item_def_id); let trait_def_id = assoc_item.container.assert_trait(); - let trait_predicates = tcx.predicates_of(trait_def_id).predicates - .iter() - .map(|(p, _)| *p) - .collect(); + let trait_predicates = + tcx.predicates_of(trait_def_id).predicates.iter().map(|(p, _)| *p).collect(); let identity_substs = InternalSubsts::identity_for_item(tcx, assoc_item_def_id); let identity_proj = tcx.mk_projection(assoc_item_def_id, identity_substs); self.collect_outlives_from_predicate_list( move |ty| ty == identity_proj, traits::elaborate_predicates(tcx, trait_predicates), - ).map(|b| b.1) + ) + .map(|b| b.1) } /// Searches through a predicate list for a predicate `T: 'a`. diff --git a/src/librustc/infer/region_constraints/leak_check.rs b/src/librustc/infer/region_constraints/leak_check.rs index 3d06942568..3b3a464ba5 100644 --- a/src/librustc/infer/region_constraints/leak_check.rs +++ b/src/librustc/infer/region_constraints/leak_check.rs @@ -50,19 +50,13 @@ impl<'tcx> RegionConstraintCollector<'tcx> { // Find the universe this placeholder inhabits. let placeholder = match placeholder_region { ty::RePlaceholder(p) => p, - _ => bug!( - "leak_check: expected placeholder found {:?}", - placeholder_region, - ), + _ => bug!("leak_check: expected placeholder found {:?}", placeholder_region,), }; // Find all regions that are related to this placeholder // in some way. This means any region that either outlives // or is outlived by a placeholder. - let mut taint_set = TaintSet::new( - TaintDirections::both(), - placeholder_region, - ); + let mut taint_set = TaintSet::new(TaintDirections::both(), placeholder_region); taint_set.fixed_point(tcx, &self.undo_log, &self.data.verifys); let tainted_regions = taint_set.into_set(); @@ -103,10 +97,7 @@ impl<'tcx> TaintSet<'tcx> { fn new(directions: TaintDirections, initial_region: ty::Region<'tcx>) -> Self { let mut regions = FxHashSet::default(); regions.insert(initial_region); - TaintSet { - directions: directions, - regions: regions, - } + TaintSet { directions: directions, regions: regions } } fn fixed_point( @@ -117,11 +108,7 @@ impl<'tcx> TaintSet<'tcx> { ) { let mut prev_len = 0; while prev_len < self.len() { - debug!( - "tainted: prev_len = {:?} new_len = {:?}", - prev_len, - self.len() - ); + debug!("tainted: prev_len = {:?} new_len = {:?}", prev_len, self.len()); prev_len = self.len(); diff --git a/src/librustc/infer/region_constraints/mod.rs b/src/librustc/infer/region_constraints/mod.rs index 402449ce6c..27ed3c7813 100644 --- a/src/librustc/infer/region_constraints/mod.rs +++ b/src/librustc/infer/region_constraints/mod.rs @@ -6,20 +6,20 @@ use self::UndoLog::*; use super::unify_key; use super::{MiscVariable, RegionVariableOrigin, SubregionOrigin}; -use rustc_data_structures::fx::{FxHashMap, FxHashSet}; -use rustc_index::vec::IndexVec; -use rustc_data_structures::sync::Lrc; -use rustc_data_structures::unify as ut; -use crate::hir::def_id::DefId; use crate::ty::ReStatic; use crate::ty::{self, Ty, TyCtxt}; use crate::ty::{ReLateBound, ReVar}; use crate::ty::{Region, RegionVid}; -use syntax_pos::Span; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::sync::Lrc; +use rustc_data_structures::unify as ut; +use rustc_hir::def_id::DefId; +use rustc_index::vec::IndexVec; +use rustc_span::Span; use std::collections::BTreeMap; -use std::{cmp, fmt, mem}; use std::ops::Range; +use std::{cmp, fmt, mem}; mod leak_check; @@ -346,24 +346,15 @@ pub struct TaintDirections { impl TaintDirections { pub fn incoming() -> Self { - TaintDirections { - incoming: true, - outgoing: false, - } + TaintDirections { incoming: true, outgoing: false } } pub fn outgoing() -> Self { - TaintDirections { - incoming: false, - outgoing: true, - } + TaintDirections { incoming: false, outgoing: true } } pub fn both() -> Self { - TaintDirections { - incoming: true, - outgoing: true, - } + TaintDirections { incoming: true, outgoing: true } } } @@ -529,17 +520,12 @@ impl<'tcx> RegionConstraintCollector<'tcx> { ) -> RegionVid { let vid = self.var_infos.push(RegionVariableInfo { origin, universe }); - let u_vid = self - .unification_table - .new_key(unify_key::RegionVidKey { min_vid: vid }); + let u_vid = self.unification_table.new_key(unify_key::RegionVidKey { min_vid: vid }); assert_eq!(vid, u_vid); if self.in_snapshot() { self.undo_log.push(AddVar(vid)); } - debug!( - "created new region variable {:?} in {:?} with origin {:?}", - vid, universe, origin - ); + debug!("created new region variable {:?} in {:?} with origin {:?}", vid, universe, origin); return vid; } @@ -601,10 +587,7 @@ impl<'tcx> RegionConstraintCollector<'tcx> { fn add_constraint(&mut self, constraint: Constraint<'tcx>, origin: SubregionOrigin<'tcx>) { // cannot add constraints once regions are resolved - debug!( - "RegionConstraintCollector: add_constraint({:?})", - constraint - ); + debug!("RegionConstraintCollector: add_constraint({:?})", constraint); // never overwrite an existing (constraint, origin) - only insert one if it isn't // present in the map yet. This prevents origins from outside the snapshot being @@ -687,9 +670,8 @@ impl<'tcx> RegionConstraintCollector<'tcx> { definition_span, hidden_ty, member_region, - choice_regions: choice_regions.clone() + choice_regions: choice_regions.clone(), }); - } pub fn make_subregion( @@ -706,12 +688,7 @@ impl<'tcx> RegionConstraintCollector<'tcx> { match (sub, sup) { (&ReLateBound(..), _) | (_, &ReLateBound(..)) => { - span_bug!( - origin.span(), - "cannot relate bound region: {:?} <= {:?}", - sub, - sup - ); + span_bug!(origin.span(), "cannot relate bound region: {:?} <= {:?}", sub, sup); } (_, &ReStatic) => { // all regions are subregions of static, so we can ignore this @@ -739,12 +716,7 @@ impl<'tcx> RegionConstraintCollector<'tcx> { sub: Region<'tcx>, bound: VerifyBound<'tcx>, ) { - self.add_verify(Verify { - kind, - origin, - region: sub, - bound, - }); + self.add_verify(Verify { kind, origin, region: sub, bound }); } pub fn lub_regions( @@ -857,9 +829,12 @@ impl<'tcx> RegionConstraintCollector<'tcx> { mark: &RegionSnapshot, ) -> (Range, Vec) { let range = self.unification_table.vars_since_snapshot(&mark.region_snapshot); - (range.clone(), (range.start.index()..range.end.index()).map(|index| { - self.var_infos[ty::RegionVid::from(index)].origin.clone() - }).collect()) + ( + range.clone(), + (range.start.index()..range.end.index()) + .map(|index| self.var_infos[ty::RegionVid::from(index)].origin) + .collect(), + ) } /// See [`RegionInference::region_constraints_added_in_snapshot`]. @@ -869,7 +844,8 @@ impl<'tcx> RegionConstraintCollector<'tcx> { .map(|&elt| match elt { AddConstraint(constraint) => Some(constraint.involves_placeholders()), _ => None, - }).max() + }) + .max() .unwrap_or(None) } } @@ -953,15 +929,10 @@ impl<'tcx> RegionConstraintData<'tcx> { /// Returns `true` if this region constraint data contains no constraints, and `false` /// otherwise. pub fn is_empty(&self) -> bool { - let RegionConstraintData { - constraints, - member_constraints, - verifys, - givens, - } = self; - constraints.is_empty() && - member_constraints.is_empty() && - verifys.is_empty() && - givens.is_empty() + let RegionConstraintData { constraints, member_constraints, verifys, givens } = self; + constraints.is_empty() + && member_constraints.is_empty() + && verifys.is_empty() + && givens.is_empty() } } diff --git a/src/librustc/infer/resolve.rs b/src/librustc/infer/resolve.rs index 613f66d7ff..d7dc607044 100644 --- a/src/librustc/infer/resolve.rs +++ b/src/librustc/infer/resolve.rs @@ -1,7 +1,7 @@ -use super::{InferCtxt, FixupError, FixupResult, Span}; use super::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; -use crate::ty::{self, Ty, Const, TyCtxt, TypeFoldable, InferConst}; +use super::{FixupError, FixupResult, InferCtxt, Span}; use crate::ty::fold::{TypeFolder, TypeVisitor}; +use crate::ty::{self, Const, InferConst, Ty, TyCtxt, TypeFoldable}; /////////////////////////////////////////////////////////////////////////// // OPPORTUNISTIC VAR RESOLVER @@ -75,11 +75,10 @@ impl<'a, 'tcx> TypeFolder<'tcx> for OpportunisticTypeAndRegionResolver<'a, 'tcx> fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> { match *r { - ty::ReVar(rid) => - self.infcx.borrow_region_constraints() - .opportunistic_resolve_var(self.tcx(), rid), - _ => - r, + ty::ReVar(rid) => { + self.infcx.borrow_region_constraints().opportunistic_resolve_var(self.tcx(), rid) + } + _ => r, } } @@ -120,11 +119,10 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for UnresolvedTypeFinder<'a, 'tcx> { if let ty::Infer(infer_ty) = t.kind { // Since we called `shallow_resolve` above, this must // be an (as yet...) unresolved inference variable. - let ty_var_span = - if let ty::TyVar(ty_vid) = infer_ty { + let ty_var_span = if let ty::TyVar(ty_vid) = infer_ty { let ty_vars = self.infcx.type_variables.borrow(); if let TypeVariableOrigin { - kind: TypeVariableOriginKind::TypeParameterDefinition(_), + kind: TypeVariableOriginKind::TypeParameterDefinition(_, _), span, } = *ty_vars.var_origin(ty_vid) { @@ -136,7 +134,7 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for UnresolvedTypeFinder<'a, 'tcx> { None }; self.first_unresolved = Some((t, ty_var_span)); - true // Halt visiting. + true // Halt visiting. } else { // Otherwise, visit its contents. t.super_visit_with(self) @@ -149,7 +147,6 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for UnresolvedTypeFinder<'a, 'tcx> { } } - /////////////////////////////////////////////////////////////////////////// // FULL TYPE RESOLUTION @@ -183,8 +180,8 @@ impl<'a, 'tcx> TypeFolder<'tcx> for FullTypeResolver<'a, 'tcx> { fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> { if !t.needs_infer() && !ty::keep_local(&t) { t // micro-optimize -- if there is nothing in this type that this fold affects... - // ^ we need to have the `keep_local` check to un-default - // defaulted tuples. + // ^ we need to have the `keep_local` check to un-default + // defaulted tuples. } else { let t = self.infcx.shallow_resolve(t); match t.kind { @@ -203,20 +200,20 @@ impl<'a, 'tcx> TypeFolder<'tcx> for FullTypeResolver<'a, 'tcx> { ty::Infer(_) => { bug!("Unexpected type in full type resolver: {:?}", t); } - _ => { - t.super_fold_with(self) - } + _ => t.super_fold_with(self), } } } fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> { match *r { - ty::ReVar(rid) => self.infcx.lexical_region_resolutions - .borrow() - .as_ref() - .expect("region resolution not performed") - .resolve_var(rid), + ty::ReVar(rid) => self + .infcx + .lexical_region_resolutions + .borrow() + .as_ref() + .expect("region resolution not performed") + .resolve_var(rid), _ => r, } } @@ -224,8 +221,8 @@ impl<'a, 'tcx> TypeFolder<'tcx> for FullTypeResolver<'a, 'tcx> { fn fold_const(&mut self, c: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> { if !c.needs_infer() && !ty::keep_local(&c) { c // micro-optimize -- if there is nothing in this const that this fold affects... - // ^ we need to have the `keep_local` check to un-default - // defaulted tuples. + // ^ we need to have the `keep_local` check to un-default + // defaulted tuples. } else { let c = self.infcx.shallow_resolve(c); match c.val { diff --git a/src/librustc/infer/sub.rs b/src/librustc/infer/sub.rs index 21c847e80f..f355ffe196 100644 --- a/src/librustc/infer/sub.rs +++ b/src/librustc/infer/sub.rs @@ -1,11 +1,11 @@ -use super::SubregionOrigin; use super::combine::{CombineFields, RelationDir}; +use super::SubregionOrigin; use crate::traits::Obligation; -use crate::ty::{self, Ty, TyCtxt}; -use crate::ty::TyVar; use crate::ty::fold::TypeFoldable; use crate::ty::relate::{Cause, Relate, RelateResult, TypeRelation}; +use crate::ty::TyVar; +use crate::ty::{self, Ty, TyCtxt}; use std::mem; /// Ensures `a` is made a subtype of `b`. Returns `a` on success. @@ -31,15 +31,24 @@ impl<'combine, 'infcx, 'tcx> Sub<'combine, 'infcx, 'tcx> { } impl TypeRelation<'tcx> for Sub<'combine, 'infcx, 'tcx> { - fn tag(&self) -> &'static str { "Sub" } - fn tcx(&self) -> TyCtxt<'tcx> { self.fields.infcx.tcx } + fn tag(&self) -> &'static str { + "Sub" + } + fn tcx(&self) -> TyCtxt<'tcx> { + self.fields.infcx.tcx + } - fn param_env(&self) -> ty::ParamEnv<'tcx> { self.fields.param_env } + fn param_env(&self) -> ty::ParamEnv<'tcx> { + self.fields.param_env + } - fn a_is_expected(&self) -> bool { self.a_is_expected } + fn a_is_expected(&self) -> bool { + self.a_is_expected + } - fn with_cause(&mut self, cause: Cause, f: F) -> R - where F: FnOnce(&mut Self) -> R + fn with_cause(&mut self, cause: Cause, f: F) -> R + where + F: FnOnce(&mut Self) -> R, { debug!("sub with_cause={:?}", cause); let old_cause = mem::replace(&mut self.fields.cause, Some(cause)); @@ -49,24 +58,26 @@ impl TypeRelation<'tcx> for Sub<'combine, 'infcx, 'tcx> { r } - fn relate_with_variance>(&mut self, - variance: ty::Variance, - a: &T, - b: &T) - -> RelateResult<'tcx, T> - { + fn relate_with_variance>( + &mut self, + variance: ty::Variance, + a: &T, + b: &T, + ) -> RelateResult<'tcx, T> { match variance { ty::Invariant => self.fields.equate(self.a_is_expected).relate(a, b), ty::Covariant => self.relate(a, b), ty::Bivariant => Ok(a.clone()), - ty::Contravariant => self.with_expected_switched(|this| { this.relate(b, a) }), + ty::Contravariant => self.with_expected_switched(|this| this.relate(b, a)), } } fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>> { debug!("{}.tys({:?}, {:?})", self.tag(), a, b); - if a == b { return Ok(a); } + if a == b { + return Ok(a); + } let infcx = self.fields.infcx; let a = infcx.type_variables.borrow_mut().replace_if_possible(a); @@ -85,22 +96,20 @@ impl TypeRelation<'tcx> for Sub<'combine, 'infcx, 'tcx> { // the two variables are equal modulo subtyping, which // is important to the occurs check later on. infcx.type_variables.borrow_mut().sub(a_vid, b_vid); - self.fields.obligations.push( - Obligation::new( - self.fields.trace.cause.clone(), - self.fields.param_env, - ty::Predicate::Subtype( - ty::Binder::dummy(ty::SubtypePredicate { - a_is_expected: self.a_is_expected, - a, - b, - })))); + self.fields.obligations.push(Obligation::new( + self.fields.trace.cause.clone(), + self.fields.param_env, + ty::Predicate::Subtype(ty::Binder::dummy(ty::SubtypePredicate { + a_is_expected: self.a_is_expected, + a, + b, + })), + )); Ok(a) } (&ty::Infer(TyVar(a_id)), _) => { - self.fields - .instantiate(b, RelationDir::SupertypeOf, a_id, !self.a_is_expected)?; + self.fields.instantiate(b, RelationDir::SupertypeOf, a_id, !self.a_is_expected)?; Ok(a) } (_, &ty::Infer(TyVar(b_id))) => { @@ -120,17 +129,18 @@ impl TypeRelation<'tcx> for Sub<'combine, 'infcx, 'tcx> { } } - fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>) - -> RelateResult<'tcx, ty::Region<'tcx>> { - debug!("{}.regions({:?}, {:?}) self.cause={:?}", - self.tag(), a, b, self.fields.cause); + fn regions( + &mut self, + a: ty::Region<'tcx>, + b: ty::Region<'tcx>, + ) -> RelateResult<'tcx, ty::Region<'tcx>> { + debug!("{}.regions({:?}, {:?}) self.cause={:?}", self.tag(), a, b, self.fields.cause); // FIXME -- we have more fine-grained information available // from the "cause" field, we could perhaps give more tailored // error messages. let origin = SubregionOrigin::Subtype(box self.fields.trace.clone()); - self.fields.infcx.borrow_region_constraints() - .make_subregion(origin, a, b); + self.fields.infcx.borrow_region_constraints().make_subregion(origin, a, b); Ok(a) } @@ -143,9 +153,13 @@ impl TypeRelation<'tcx> for Sub<'combine, 'infcx, 'tcx> { self.fields.infcx.super_combine_consts(self, a, b) } - fn binders(&mut self, a: &ty::Binder, b: &ty::Binder) - -> RelateResult<'tcx, ty::Binder> - where T: Relate<'tcx> + fn binders( + &mut self, + a: &ty::Binder, + b: &ty::Binder, + ) -> RelateResult<'tcx, ty::Binder> + where + T: Relate<'tcx>, { self.fields.higher_ranked_sub(a, b, self.a_is_expected) } diff --git a/src/librustc/infer/type_variable.rs b/src/librustc/infer/type_variable.rs index f79a30c7ae..8ea1b705d4 100644 --- a/src/librustc/infer/type_variable.rs +++ b/src/librustc/infer/type_variable.rs @@ -1,13 +1,14 @@ -use syntax::symbol::Symbol; -use syntax_pos::Span; use crate::ty::{self, Ty, TyVid}; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::Symbol; +use rustc_span::Span; +use rustc_data_structures::snapshot_vec as sv; +use rustc_data_structures::unify as ut; use std::cmp; use std::marker::PhantomData; -use std::u32; use std::ops::Range; -use rustc_data_structures::snapshot_vec as sv; -use rustc_data_structures::unify as ut; +use std::u32; pub struct TypeVariableTable<'tcx> { values: sv::SnapshotVec, @@ -49,7 +50,7 @@ pub enum TypeVariableOriginKind { MiscVariable, NormalizeProjectionType, TypeInference, - TypeParameterDefinition(Symbol), + TypeParameterDefinition(Symbol, Option), /// One of the upvars or closure kind parameters in a `ClosureSubsts` /// (before it has been determined). @@ -152,9 +153,13 @@ impl<'tcx> TypeVariableTable<'tcx> { pub fn instantiate(&mut self, vid: ty::TyVid, ty: Ty<'tcx>) { let vid = self.root_var(vid); debug_assert!(self.probe(vid).is_unknown()); - debug_assert!(self.eq_relations.probe_value(vid).is_unknown(), - "instantiating type variable `{:?}` twice: new-value = {:?}, old-value={:?}", - vid, ty, self.eq_relations.probe_value(vid)); + debug_assert!( + self.eq_relations.probe_value(vid).is_unknown(), + "instantiating type variable `{:?}` twice: new-value = {:?}, old-value={:?}", + vid, + ty, + self.eq_relations.probe_value(vid) + ); self.eq_relations.union_value(vid, TypeVariableValue::Known { value: ty }); // Hack: we only need this so that `types_escaping_snapshot` @@ -173,28 +178,23 @@ impl<'tcx> TypeVariableTable<'tcx> { /// - `origin`: indicates *why* the type variable was created. /// The code in this module doesn't care, but it can be useful /// for improving error messages. - pub fn new_var(&mut self, - universe: ty::UniverseIndex, - diverging: bool, - origin: TypeVariableOrigin) - -> ty::TyVid { + pub fn new_var( + &mut self, + universe: ty::UniverseIndex, + diverging: bool, + origin: TypeVariableOrigin, + ) -> ty::TyVid { let eq_key = self.eq_relations.new_key(TypeVariableValue::Unknown { universe }); let sub_key = self.sub_relations.new_key(()); assert_eq!(eq_key.vid, sub_key); - let index = self.values.push(TypeVariableData { - origin, - diverging, - }); + let index = self.values.push(TypeVariableData { origin, diverging }); assert_eq!(eq_key.vid.index, index as u32); debug!( "new_var(index={:?}, universe={:?}, diverging={:?}, origin={:?}", - eq_key.vid, - universe, - diverging, - origin, + eq_key.vid, universe, diverging, origin, ); eq_key.vid @@ -248,12 +248,10 @@ impl<'tcx> TypeVariableTable<'tcx> { /// instantiated. Otherwise, returns `t`. pub fn replace_if_possible(&mut self, t: Ty<'tcx>) -> Ty<'tcx> { match t.kind { - ty::Infer(ty::TyVar(v)) => { - match self.probe(v) { - TypeVariableValue::Unknown { .. } => t, - TypeVariableValue::Known { value } => value, - } - } + ty::Infer(ty::TyVar(v)) => match self.probe(v) { + TypeVariableValue::Unknown { .. } => t, + TypeVariableValue::Known { value } => value, + }, _ => t, } } @@ -305,9 +303,12 @@ impl<'tcx> TypeVariableTable<'tcx> { s: &Snapshot<'tcx>, ) -> (Range, Vec) { let range = self.eq_relations.vars_since_snapshot(&s.eq_snapshot); - (range.start.vid..range.end.vid, (range.start.vid.index..range.end.vid.index).map(|index| { - self.values.get(index as usize).origin.clone() - }).collect()) + ( + range.start.vid..range.end.vid, + (range.start.vid.index..range.end.vid.index) + .map(|index| self.values.get(index as usize).origin) + .collect(), + ) } /// Finds the set of type variables that existed *before* `s` @@ -346,7 +347,7 @@ impl<'tcx> TypeVariableTable<'tcx> { debug!("SpecifyVar({:?}) new_elem_threshold={}", vid, new_elem_threshold); } - _ => { } + _ => {} } } @@ -409,9 +410,15 @@ impl<'tcx> From for TyVidEqKey<'tcx> { impl<'tcx> ut::UnifyKey for TyVidEqKey<'tcx> { type Value = TypeVariableValue<'tcx>; - fn index(&self) -> u32 { self.vid.index } - fn from_index(i: u32) -> Self { TyVidEqKey::from(ty::TyVid { index: i }) } - fn tag() -> &'static str { "TyVidEqKey" } + fn index(&self) -> u32 { + self.vid.index + } + fn from_index(i: u32) -> Self { + TyVidEqKey::from(ty::TyVid { index: i }) + } + fn tag() -> &'static str { + "TyVidEqKey" + } } impl<'tcx> ut::UnifyValue for TypeVariableValue<'tcx> { @@ -431,8 +438,10 @@ impl<'tcx> ut::UnifyValue for TypeVariableValue<'tcx> { (&TypeVariableValue::Unknown { .. }, &TypeVariableValue::Known { .. }) => Ok(*value2), // If both sides are *unknown*, it hardly matters, does it? - (&TypeVariableValue::Unknown { universe: universe1 }, - &TypeVariableValue::Unknown { universe: universe2 }) => { + ( + &TypeVariableValue::Unknown { universe: universe1 }, + &TypeVariableValue::Unknown { universe: universe2 }, + ) => { // If we unify two unbound variables, ?T and ?U, then whatever // value they wind up taking (which must be the same value) must // be nameable by both universes. Therefore, the resulting @@ -449,7 +458,13 @@ impl<'tcx> ut::UnifyValue for TypeVariableValue<'tcx> { /// they carry no values. impl ut::UnifyKey for ty::TyVid { type Value = (); - fn index(&self) -> u32 { self.index } - fn from_index(i: u32) -> ty::TyVid { ty::TyVid { index: i } } - fn tag() -> &'static str { "TyVid" } + fn index(&self) -> u32 { + self.index + } + fn from_index(i: u32) -> ty::TyVid { + ty::TyVid { index: i } + } + fn tag() -> &'static str { + "TyVid" + } } diff --git a/src/librustc/infer/unify_key.rs b/src/librustc/infer/unify_key.rs index 8ad6990a75..c5ec0ba73e 100644 --- a/src/librustc/infer/unify_key.rs +++ b/src/librustc/infer/unify_key.rs @@ -1,12 +1,12 @@ -use crate::ty::{self, FloatVarValue, IntVarValue, Ty, TyCtxt, InferConst}; -use rustc_data_structures::unify::{NoError, EqUnifyValue, UnifyKey, UnifyValue, UnificationTable}; +use crate::ty::{self, FloatVarValue, InferConst, IntVarValue, Ty, TyCtxt}; use rustc_data_structures::unify::InPlace; -use syntax_pos::{Span, DUMMY_SP}; -use syntax::symbol::Symbol; +use rustc_data_structures::unify::{EqUnifyValue, NoError, UnificationTable, UnifyKey, UnifyValue}; +use rustc_span::symbol::Symbol; +use rustc_span::{Span, DUMMY_SP}; +use std::cell::RefMut; use std::cmp; use std::marker::PhantomData; -use std::cell::RefMut; pub trait ToType { fn to_type<'tcx>(&self, tcx: TyCtxt<'tcx>) -> Ty<'tcx>; @@ -14,9 +14,15 @@ pub trait ToType { impl UnifyKey for ty::IntVid { type Value = Option; - fn index(&self) -> u32 { self.index } - fn from_index(i: u32) -> ty::IntVid { ty::IntVid { index: i } } - fn tag() -> &'static str { "IntVid" } + fn index(&self) -> u32 { + self.index + } + fn from_index(i: u32) -> ty::IntVid { + ty::IntVid { index: i } + } + fn tag() -> &'static str { + "IntVid" + } } impl EqUnifyValue for IntVarValue {} @@ -26,7 +32,7 @@ pub struct RegionVidKey { /// The minimum region vid in the unification set. This is needed /// to have a canonical name for a type to prevent infinite /// recursion. - pub min_vid: ty::RegionVid + pub min_vid: ty::RegionVid, } impl UnifyValue for RegionVidKey { @@ -45,9 +51,15 @@ impl UnifyValue for RegionVidKey { impl UnifyKey for ty::RegionVid { type Value = RegionVidKey; - fn index(&self) -> u32 { u32::from(*self) } - fn from_index(i: u32) -> ty::RegionVid { ty::RegionVid::from(i) } - fn tag() -> &'static str { "RegionVid" } + fn index(&self) -> u32 { + u32::from(*self) + } + fn from_index(i: u32) -> ty::RegionVid { + ty::RegionVid::from(i) + } + fn tag() -> &'static str { + "RegionVid" + } } impl ToType for IntVarValue { @@ -63,9 +75,15 @@ impl ToType for IntVarValue { impl UnifyKey for ty::FloatVid { type Value = Option; - fn index(&self) -> u32 { self.index } - fn from_index(i: u32) -> ty::FloatVid { ty::FloatVid { index: i } } - fn tag() -> &'static str { "FloatVid" } + fn index(&self) -> u32 { + self.index + } + fn from_index(i: u32) -> ty::FloatVid { + ty::FloatVid { index: i } + } + fn tag() -> &'static str { + "FloatVid" + } } impl EqUnifyValue for FloatVarValue {} @@ -125,9 +143,15 @@ pub struct ConstVarValue<'tcx> { impl<'tcx> UnifyKey for ty::ConstVid<'tcx> { type Value = ConstVarValue<'tcx>; - fn index(&self) -> u32 { self.index } - fn from_index(i: u32) -> Self { ty::ConstVid { index: i, phantom: PhantomData } } - fn tag() -> &'static str { "ConstVid" } + fn index(&self) -> u32 { + self.index + } + fn from_index(i: u32) -> Self { + ty::ConstVid { index: i, phantom: PhantomData } + } + fn tag() -> &'static str { + "ConstVid" + } } impl<'tcx> UnifyValue for ConstVarValue<'tcx> { @@ -135,10 +159,7 @@ impl<'tcx> UnifyValue for ConstVarValue<'tcx> { fn unify_values(value1: &Self, value2: &Self) -> Result { let val = match (value1.val, value2.val) { - ( - ConstVariableValue::Known { .. }, - ConstVariableValue::Known { .. } - ) => { + (ConstVariableValue::Known { .. }, ConstVariableValue::Known { .. }) => { bug!("equating two const variables, both of which have known values") } @@ -151,8 +172,10 @@ impl<'tcx> UnifyValue for ConstVarValue<'tcx> { } // If both sides are *unknown*, it hardly matters, does it? - (ConstVariableValue::Unknown { universe: universe1 }, - ConstVariableValue::Unknown { universe: universe2 }) => { + ( + ConstVariableValue::Unknown { universe: universe1 }, + ConstVariableValue::Unknown { universe: universe2 }, + ) => { // If we unify two unbound variables, ?T and ?U, then whatever // value they wind up taking (which must be the same value) must // be nameable by both universes. Therefore, the resulting @@ -177,7 +200,7 @@ impl<'tcx> EqUnifyValue for &'tcx ty::Const<'tcx> {} pub fn replace_if_possible( mut table: RefMut<'_, UnificationTable>>>, - c: &'tcx ty::Const<'tcx> + c: &'tcx ty::Const<'tcx>, ) -> &'tcx ty::Const<'tcx> { if let ty::Const { val: ty::ConstKind::Infer(InferConst::Var(vid)), .. } = c { match table.probe_value(*vid).val.known() { diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 641e6a4f61..69ca406369 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -27,16 +27,13 @@ //! This API is completely unstable and subject to change. #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")] - #![feature(arbitrary_self_types)] #![feature(bool_to_option)] #![feature(box_patterns)] #![feature(box_syntax)] -#![feature(const_fn)] #![feature(const_transmute)] #![feature(core_intrinsics)] #![feature(drain_filter)] -#![cfg_attr(windows, feature(libc))] #![feature(never_type)] #![feature(exhaustive_patterns)] #![feature(overlapping_marker_traits)] @@ -45,7 +42,7 @@ #![feature(optin_builtin_traits)] #![feature(option_expect_none)] #![feature(range_is_empty)] -#![feature(slice_patterns)] +#![cfg_attr(bootstrap, feature(slice_patterns))] #![feature(specialization)] #![feature(unboxed_closures)] #![feature(thread_local)] @@ -61,18 +58,20 @@ #![feature(associated_type_bounds)] #![feature(rustc_attrs)] #![feature(hash_raw_entry)] +#![recursion_limit = "512"] -#![recursion_limit="512"] - -#[macro_use] extern crate bitflags; -#[macro_use] extern crate scoped_tls; -#[cfg(windows)] -extern crate libc; -#[macro_use] extern crate rustc_macros; -#[macro_use] extern crate rustc_data_structures; -#[macro_use] extern crate log; -#[macro_use] extern crate syntax; -#[macro_use] extern crate smallvec; +#[macro_use] +extern crate bitflags; +#[macro_use] +extern crate scoped_tls; +#[macro_use] +extern crate rustc_macros; +#[macro_use] +extern crate rustc_data_structures; +#[macro_use] +extern crate log; +#[macro_use] +extern crate smallvec; #[cfg(test)] mod tests; @@ -90,34 +89,15 @@ pub mod hir; pub mod ich; pub mod infer; pub mod lint; - -pub mod middle { - pub mod cstore; - pub mod dependency_format; - pub mod diagnostic_items; - pub mod exported_symbols; - pub mod free_region; - pub mod lib_features; - pub mod lang_items; - pub mod privacy; - pub mod reachable; - pub mod region; - pub mod recursion_limit; - pub mod resolve_lifetime; - pub mod stability; - pub mod weak_lang_items; -} - +pub mod middle; pub mod mir; pub use rustc_session as session; pub mod traits; pub mod ty; pub mod util { - pub mod captures; - pub mod common; - pub mod nodemap; pub mod bug; + pub mod common; } // Allows macros to refer to this crate as `::rustc` diff --git a/src/librustc/lint.rs b/src/librustc/lint.rs new file mode 100644 index 0000000000..2ed6cd5283 --- /dev/null +++ b/src/librustc/lint.rs @@ -0,0 +1,369 @@ +use std::cmp; + +use crate::ich::StableHashingContext; +use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_errors::{pluralize, Applicability, DiagnosticBuilder, DiagnosticId}; +use rustc_hir::HirId; +pub use rustc_session::lint::{builtin, Level, Lint, LintId, LintPass}; +use rustc_session::{DiagnosticMessageId, Session}; +use rustc_span::hygiene::MacroKind; +use rustc_span::source_map::{DesugaringKind, ExpnKind, MultiSpan}; +use rustc_span::{Span, Symbol}; + +/// How a lint level was set. +#[derive(Clone, Copy, PartialEq, Eq, HashStable)] +pub enum LintSource { + /// Lint is at the default level as declared + /// in rustc or a plugin. + Default, + + /// Lint level was set by an attribute. + Node(Symbol, Span, Option /* RFC 2383 reason */), + + /// Lint level was set by a command-line flag. + CommandLine(Symbol), +} + +pub type LevelSource = (Level, LintSource); + +pub struct LintLevelSets { + pub list: Vec, + pub lint_cap: Level, +} + +pub enum LintSet { + CommandLine { + // -A,-W,-D flags, a `Symbol` for the flag itself and `Level` for which + // flag. + specs: FxHashMap, + }, + + Node { + specs: FxHashMap, + parent: u32, + }, +} + +impl LintLevelSets { + pub fn new() -> Self { + LintLevelSets { list: Vec::new(), lint_cap: Level::Forbid } + } + + pub fn get_lint_level( + &self, + lint: &'static Lint, + idx: u32, + aux: Option<&FxHashMap>, + sess: &Session, + ) -> LevelSource { + let (level, mut src) = self.get_lint_id_level(LintId::of(lint), idx, aux); + + // If `level` is none then we actually assume the default level for this + // lint. + let mut level = level.unwrap_or_else(|| lint.default_level(sess.edition())); + + // If we're about to issue a warning, check at the last minute for any + // directives against the warnings "lint". If, for example, there's an + // `allow(warnings)` in scope then we want to respect that instead. + if level == Level::Warn { + let (warnings_level, warnings_src) = + self.get_lint_id_level(LintId::of(builtin::WARNINGS), idx, aux); + if let Some(configured_warning_level) = warnings_level { + if configured_warning_level != Level::Warn { + level = configured_warning_level; + src = warnings_src; + } + } + } + + // Ensure that we never exceed the `--cap-lints` argument. + level = cmp::min(level, self.lint_cap); + + if let Some(driver_level) = sess.driver_lint_caps.get(&LintId::of(lint)) { + // Ensure that we never exceed driver level. + level = cmp::min(*driver_level, level); + } + + return (level, src); + } + + pub fn get_lint_id_level( + &self, + id: LintId, + mut idx: u32, + aux: Option<&FxHashMap>, + ) -> (Option, LintSource) { + if let Some(specs) = aux { + if let Some(&(level, src)) = specs.get(&id) { + return (Some(level), src); + } + } + loop { + match self.list[idx as usize] { + LintSet::CommandLine { ref specs } => { + if let Some(&(level, src)) = specs.get(&id) { + return (Some(level), src); + } + return (None, LintSource::Default); + } + LintSet::Node { ref specs, parent } => { + if let Some(&(level, src)) = specs.get(&id) { + return (Some(level), src); + } + idx = parent; + } + } + } + } +} + +pub struct LintLevelMap { + pub sets: LintLevelSets, + pub id_to_set: FxHashMap, +} + +impl LintLevelMap { + /// If the `id` was previously registered with `register_id` when building + /// this `LintLevelMap` this returns the corresponding lint level and source + /// of the lint level for the lint provided. + /// + /// If the `id` was not previously registered, returns `None`. If `None` is + /// returned then the parent of `id` should be acquired and this function + /// should be called again. + pub fn level_and_source( + &self, + lint: &'static Lint, + id: HirId, + session: &Session, + ) -> Option { + self.id_to_set.get(&id).map(|idx| self.sets.get_lint_level(lint, *idx, None, session)) + } +} + +impl<'a> HashStable> for LintLevelMap { + #[inline] + fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { + let LintLevelMap { ref sets, ref id_to_set } = *self; + + id_to_set.hash_stable(hcx, hasher); + + let LintLevelSets { ref list, lint_cap } = *sets; + + lint_cap.hash_stable(hcx, hasher); + + hcx.while_hashing_spans(true, |hcx| { + list.len().hash_stable(hcx, hasher); + + // We are working under the assumption here that the list of + // lint-sets is built in a deterministic order. + for lint_set in list { + ::std::mem::discriminant(lint_set).hash_stable(hcx, hasher); + + match *lint_set { + LintSet::CommandLine { ref specs } => { + specs.hash_stable(hcx, hasher); + } + LintSet::Node { ref specs, parent } => { + specs.hash_stable(hcx, hasher); + parent.hash_stable(hcx, hasher); + } + } + } + }) + } +} + +pub fn struct_lint_level<'a>( + sess: &'a Session, + lint: &'static Lint, + level: Level, + src: LintSource, + span: Option, + msg: &str, +) -> DiagnosticBuilder<'a> { + let mut err = match (level, span) { + (Level::Allow, _) => return sess.diagnostic().struct_dummy(), + (Level::Warn, Some(span)) => sess.struct_span_warn(span, msg), + (Level::Warn, None) => sess.struct_warn(msg), + (Level::Deny, Some(span)) | (Level::Forbid, Some(span)) => sess.struct_span_err(span, msg), + (Level::Deny, None) | (Level::Forbid, None) => sess.struct_err(msg), + }; + + // Check for future incompatibility lints and issue a stronger warning. + let lint_id = LintId::of(lint); + let future_incompatible = lint.future_incompatible; + + // If this code originates in a foreign macro, aka something that this crate + // did not itself author, then it's likely that there's nothing this crate + // can do about it. We probably want to skip the lint entirely. + if err.span.primary_spans().iter().any(|s| in_external_macro(sess, *s)) { + // Any suggestions made here are likely to be incorrect, so anything we + // emit shouldn't be automatically fixed by rustfix. + err.allow_suggestions(false); + + // If this is a future incompatible lint it'll become a hard error, so + // we have to emit *something*. Also allow lints to whitelist themselves + // on a case-by-case basis for emission in a foreign macro. + if future_incompatible.is_none() && !lint.report_in_external_macro { + err.cancel(); + // Don't continue further, since we don't want to have + // `diag_span_note_once` called for a diagnostic that isn't emitted. + return err; + } + } + + let name = lint.name_lower(); + match src { + LintSource::Default => { + sess.diag_note_once( + &mut err, + DiagnosticMessageId::from(lint), + &format!("`#[{}({})]` on by default", level.as_str(), name), + ); + } + LintSource::CommandLine(lint_flag_val) => { + let flag = match level { + Level::Warn => "-W", + Level::Deny => "-D", + Level::Forbid => "-F", + Level::Allow => panic!(), + }; + let hyphen_case_lint_name = name.replace("_", "-"); + if lint_flag_val.as_str() == name { + sess.diag_note_once( + &mut err, + DiagnosticMessageId::from(lint), + &format!( + "requested on the command line with `{} {}`", + flag, hyphen_case_lint_name + ), + ); + } else { + let hyphen_case_flag_val = lint_flag_val.as_str().replace("_", "-"); + sess.diag_note_once( + &mut err, + DiagnosticMessageId::from(lint), + &format!( + "`{} {}` implied by `{} {}`", + flag, hyphen_case_lint_name, flag, hyphen_case_flag_val + ), + ); + } + } + LintSource::Node(lint_attr_name, src, reason) => { + if let Some(rationale) = reason { + err.note(&rationale.as_str()); + } + sess.diag_span_note_once( + &mut err, + DiagnosticMessageId::from(lint), + src, + "lint level defined here", + ); + if lint_attr_name.as_str() != name { + let level_str = level.as_str(); + sess.diag_note_once( + &mut err, + DiagnosticMessageId::from(lint), + &format!( + "`#[{}({})]` implied by `#[{}({})]`", + level_str, name, level_str, lint_attr_name + ), + ); + } + } + } + + err.code(DiagnosticId::Lint(name)); + + if let Some(future_incompatible) = future_incompatible { + const STANDARD_MESSAGE: &str = "this was previously accepted by the compiler but is being phased out; \ + it will become a hard error"; + + let explanation = if lint_id == LintId::of(builtin::UNSTABLE_NAME_COLLISIONS) { + "once this method is added to the standard library, \ + the ambiguity may cause an error or change in behavior!" + .to_owned() + } else if lint_id == LintId::of(builtin::MUTABLE_BORROW_RESERVATION_CONFLICT) { + "this borrowing pattern was not meant to be accepted, \ + and may become a hard error in the future" + .to_owned() + } else if let Some(edition) = future_incompatible.edition { + format!("{} in the {} edition!", STANDARD_MESSAGE, edition) + } else { + format!("{} in a future release!", STANDARD_MESSAGE) + }; + let citation = format!("for more information, see {}", future_incompatible.reference); + err.warn(&explanation); + err.note(&citation); + } + + return err; +} + +/// Returns whether `span` originates in a foreign crate's external macro. +/// +/// This is used to test whether a lint should not even begin to figure out whether it should +/// be reported on the current node. +pub fn in_external_macro(sess: &Session, span: Span) -> bool { + let expn_data = span.ctxt().outer_expn_data(); + match expn_data.kind { + ExpnKind::Root | ExpnKind::Desugaring(DesugaringKind::ForLoop) => false, + ExpnKind::AstPass(_) | ExpnKind::Desugaring(_) => true, // well, it's "external" + ExpnKind::Macro(MacroKind::Bang, _) => { + if expn_data.def_site.is_dummy() { + // Dummy span for the `def_site` means it's an external macro. + return true; + } + match sess.source_map().span_to_snippet(expn_data.def_site) { + Ok(code) => !code.starts_with("macro_rules"), + // No snippet means external macro or compiler-builtin expansion. + Err(_) => true, + } + } + ExpnKind::Macro(..) => true, // definitely a plugin + } +} + +pub fn add_elided_lifetime_in_path_suggestion( + sess: &Session, + db: &mut DiagnosticBuilder<'_>, + n: usize, + path_span: Span, + incl_angl_brckt: bool, + insertion_span: Span, + anon_lts: String, +) { + let (replace_span, suggestion) = if incl_angl_brckt { + (insertion_span, anon_lts) + } else { + // When possible, prefer a suggestion that replaces the whole + // `Path` expression with `Path<'_, T>`, rather than inserting `'_, ` + // at a point (which makes for an ugly/confusing label) + if let Ok(snippet) = sess.source_map().span_to_snippet(path_span) { + // But our spans can get out of whack due to macros; if the place we think + // we want to insert `'_` isn't even within the path expression's span, we + // should bail out of making any suggestion rather than panicking on a + // subtract-with-overflow or string-slice-out-out-bounds (!) + // FIXME: can we do better? + if insertion_span.lo().0 < path_span.lo().0 { + return; + } + let insertion_index = (insertion_span.lo().0 - path_span.lo().0) as usize; + if insertion_index > snippet.len() { + return; + } + let (before, after) = snippet.split_at(insertion_index); + (path_span, format!("{}{}{}", before, anon_lts, after)) + } else { + (insertion_span, anon_lts) + } + }; + db.span_suggestion( + replace_span, + &format!("indicate the anonymous lifetime{}", pluralize!(n)), + suggestion, + Applicability::MachineApplicable, + ); +} diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs deleted file mode 100644 index 7f72154e42..0000000000 --- a/src/librustc/lint/context.rs +++ /dev/null @@ -1,1581 +0,0 @@ -//! Implementation of lint checking. -//! -//! The lint checking is mostly consolidated into one pass which runs -//! after all other analyses. Throughout compilation, lint warnings -//! can be added via the `add_lint` method on the Session structure. This -//! requires a span and an ID of the node that the lint is being added to. The -//! lint isn't actually emitted at that time because it is unknown what the -//! actual lint level at that location is. -//! -//! To actually emit lint warnings/errors, a separate pass is used. -//! A context keeps track of the current state of all lint levels. -//! Upon entering a node of the ast which can modify the lint settings, the -//! previous lint state is pushed onto a stack and the ast is then recursed -//! upon. As the ast is traversed, this keeps track of the current lint level -//! for all lint attributes. - -use self::TargetLint::*; - -use crate::hir; -use crate::hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; -use crate::hir::intravisit as hir_visit; -use crate::hir::intravisit::Visitor; -use crate::hir::map::{definitions::DisambiguatedDefPathData, DefPathData}; -use crate::lint::{EarlyLintPass, LateLintPass, EarlyLintPassObject, LateLintPassObject}; -use crate::lint::{Level, Lint, LintId, LintPass, LintBuffer, FutureIncompatibleInfo}; -use crate::lint::builtin::BuiltinLintDiagnostics; -use crate::lint::levels::{LintLevelSets, LintLevelsBuilder}; -use crate::middle::privacy::AccessLevels; -use crate::session::Session; -use crate::ty::{self, print::Printer, subst::GenericArg, TyCtxt, Ty}; -use crate::ty::layout::{LayoutError, LayoutOf, TyLayout}; -use crate::util::nodemap::FxHashMap; -use crate::util::common::time; - -use errors::DiagnosticBuilder; -use std::slice; -use rustc_data_structures::sync::{self, ParallelIterator, join, par_iter}; -use syntax::ast; -use syntax::util::lev_distance::find_best_match_for_name; -use syntax::visit as ast_visit; -use syntax_pos::{MultiSpan, Span, symbol::Symbol}; - -use rustc_error_codes::*; - -/// Information about the registered lints. -/// -/// This is basically the subset of `Context` that we can -/// build early in the compile pipeline. -pub struct LintStore { - /// Registered lints. - lints: Vec<&'static Lint>, - - /// Constructor functions for each variety of lint pass. - /// - /// These should only be called once, but since we want to avoid locks or - /// interior mutability, we don't enforce this (and lints should, in theory, - /// be compatible with being constructed more than once, though not - /// necessarily in a sane manner. This is safe though.) - pre_expansion_passes: Vec EarlyLintPassObject + sync::Send + sync::Sync>>, - early_passes: Vec EarlyLintPassObject + sync::Send + sync::Sync>>, - late_passes: Vec LateLintPassObject + sync::Send + sync::Sync>>, - /// This is unique in that we construct them per-module, so not once. - late_module_passes: Vec LateLintPassObject + sync::Send + sync::Sync>>, - - /// Lints indexed by name. - by_name: FxHashMap, - - /// Map of registered lint groups to what lints they expand to. - lint_groups: FxHashMap<&'static str, LintGroup>, -} - -/// Lints that are buffered up early on in the `Session` before the -/// `LintLevels` is calculated -#[derive(PartialEq, Debug)] -pub struct BufferedEarlyLint { - pub lint_id: LintId, - pub ast_id: ast::NodeId, - pub span: MultiSpan, - pub msg: String, - pub diagnostic: BuiltinLintDiagnostics, -} - -/// The target of the `by_name` map, which accounts for renaming/deprecation. -enum TargetLint { - /// A direct lint target - Id(LintId), - - /// Temporary renaming, used for easing migration pain; see #16545 - Renamed(String, LintId), - - /// Lint with this name existed previously, but has been removed/deprecated. - /// The string argument is the reason for removal. - Removed(String), -} - -pub enum FindLintError { - NotFound, - Removed, -} - -struct LintAlias { - name: &'static str, - /// Whether deprecation warnings should be suppressed for this alias. - silent: bool, -} - -struct LintGroup { - lint_ids: Vec, - from_plugin: bool, - depr: Option, -} - -pub enum CheckLintNameResult<'a> { - Ok(&'a [LintId]), - /// Lint doesn't exist. Potentially contains a suggestion for a correct lint name. - NoLint(Option), - /// The lint is either renamed or removed. This is the warning - /// message, and an optional new name (`None` if removed). - Warning(String, Option), - /// The lint is from a tool. If the Option is None, then either - /// the lint does not exist in the tool or the code was not - /// compiled with the tool and therefore the lint was never - /// added to the `LintStore`. Otherwise the `LintId` will be - /// returned as if it where a rustc lint. - Tool(Result<&'a [LintId], (Option<&'a [LintId]>, String)>), -} - -impl LintStore { - pub fn new() -> LintStore { - LintStore { - lints: vec![], - pre_expansion_passes: vec![], - early_passes: vec![], - late_passes: vec![], - late_module_passes: vec![], - by_name: Default::default(), - lint_groups: Default::default(), - } - } - - pub fn get_lints<'t>(&'t self) -> &'t [&'static Lint] { - &self.lints - } - - pub fn get_lint_groups<'t>(&'t self) -> Vec<(&'static str, Vec, bool)> { - self.lint_groups.iter() - .filter(|(_, LintGroup { depr, .. })| { - // Don't display deprecated lint groups. - depr.is_none() - }) - .map(|(k, LintGroup { lint_ids, from_plugin, .. })| { - (*k, lint_ids.clone(), *from_plugin) - }) - .collect() - } - - pub fn register_early_pass( - &mut self, - pass: impl Fn() -> EarlyLintPassObject + 'static + sync::Send + sync::Sync - ) { - self.early_passes.push(Box::new(pass)); - } - - pub fn register_pre_expansion_pass( - &mut self, - pass: impl Fn() -> EarlyLintPassObject + 'static + sync::Send + sync::Sync, - ) { - self.pre_expansion_passes.push(Box::new(pass)); - } - - pub fn register_late_pass( - &mut self, - pass: impl Fn() -> LateLintPassObject + 'static + sync::Send + sync::Sync, - ) { - self.late_passes.push(Box::new(pass)); - } - - pub fn register_late_mod_pass( - &mut self, - pass: impl Fn() -> LateLintPassObject + 'static + sync::Send + sync::Sync, - ) { - self.late_module_passes.push(Box::new(pass)); - } - - // Helper method for register_early/late_pass - pub fn register_lints(&mut self, lints: &[&'static Lint]) { - for lint in lints { - self.lints.push(lint); - - let id = LintId::of(lint); - if self.by_name.insert(lint.name_lower(), Id(id)).is_some() { - bug!("duplicate specification of lint {}", lint.name_lower()) - } - - if let Some(FutureIncompatibleInfo { edition, .. }) = lint.future_incompatible { - if let Some(edition) = edition { - self.lint_groups.entry(edition.lint_name()) - .or_insert(LintGroup { - lint_ids: vec![], - from_plugin: lint.is_plugin, - depr: None, - }) - .lint_ids.push(id); - } - - self.lint_groups.entry("future_incompatible") - .or_insert(LintGroup { - lint_ids: vec![], - from_plugin: lint.is_plugin, - depr: None, - }) - .lint_ids.push(id); - } - } - } - - pub fn register_group_alias( - &mut self, - lint_name: &'static str, - alias: &'static str, - ) { - self.lint_groups.insert(alias, LintGroup { - lint_ids: vec![], - from_plugin: false, - depr: Some(LintAlias { name: lint_name, silent: true }), - }); - } - - pub fn register_group( - &mut self, - from_plugin: bool, - name: &'static str, - deprecated_name: Option<&'static str>, - to: Vec, - ) { - let new = self - .lint_groups - .insert(name, LintGroup { - lint_ids: to, - from_plugin, - depr: None, - }) - .is_none(); - if let Some(deprecated) = deprecated_name { - self.lint_groups.insert(deprecated, LintGroup { - lint_ids: vec![], - from_plugin, - depr: Some(LintAlias { name, silent: false }), - }); - } - - if !new { - bug!("duplicate specification of lint group {}", name); - } - } - - pub fn register_renamed(&mut self, old_name: &str, new_name: &str) { - let target = match self.by_name.get(new_name) { - Some(&Id(lint_id)) => lint_id.clone(), - _ => bug!("invalid lint renaming of {} to {}", old_name, new_name) - }; - self.by_name.insert(old_name.to_string(), Renamed(new_name.to_string(), target)); - } - - pub fn register_removed(&mut self, name: &str, reason: &str) { - self.by_name.insert(name.into(), Removed(reason.into())); - } - - pub fn find_lints(&self, mut lint_name: &str) -> Result, FindLintError> { - match self.by_name.get(lint_name) { - Some(&Id(lint_id)) => Ok(vec![lint_id]), - Some(&Renamed(_, lint_id)) => { - Ok(vec![lint_id]) - }, - Some(&Removed(_)) => { - Err(FindLintError::Removed) - }, - None => { - loop { - return match self.lint_groups.get(lint_name) { - Some(LintGroup {lint_ids, depr, .. }) => { - if let Some(LintAlias { name, .. }) = depr { - lint_name = name; - continue; - } - Ok(lint_ids.clone()) - } - None => Err(FindLintError::Removed) - }; - } - } - } - } - - /// Checks the validity of lint names derived from the command line - pub fn check_lint_name_cmdline(&self, - sess: &Session, - lint_name: &str, - level: Level) { - let db = match self.check_lint_name(lint_name, None) { - CheckLintNameResult::Ok(_) => None, - CheckLintNameResult::Warning(ref msg, _) => { - Some(sess.struct_warn(msg)) - }, - CheckLintNameResult::NoLint(suggestion) => { - let mut err = struct_err!(sess, E0602, "unknown lint: `{}`", lint_name); - - if let Some(suggestion) = suggestion { - err.help(&format!("did you mean: `{}`", suggestion)); - } - - Some(err) - } - CheckLintNameResult::Tool(result) => match result { - Err((Some(_), new_name)) => Some(sess.struct_warn(&format!( - "lint name `{}` is deprecated \ - and does not have an effect anymore. \ - Use: {}", - lint_name, new_name - ))), - _ => None, - }, - }; - - if let Some(mut db) = db { - let msg = format!("requested on the command line with `{} {}`", - match level { - Level::Allow => "-A", - Level::Warn => "-W", - Level::Deny => "-D", - Level::Forbid => "-F", - }, - lint_name); - db.note(&msg); - db.emit(); - } - } - - /// Checks the name of a lint for its existence, and whether it was - /// renamed or removed. Generates a DiagnosticBuilder containing a - /// warning for renamed and removed lints. This is over both lint - /// names from attributes and those passed on the command line. Since - /// it emits non-fatal warnings and there are *two* lint passes that - /// inspect attributes, this is only run from the late pass to avoid - /// printing duplicate warnings. - pub fn check_lint_name( - &self, - lint_name: &str, - tool_name: Option, - ) -> CheckLintNameResult<'_> { - let complete_name = if let Some(tool_name) = tool_name { - format!("{}::{}", tool_name, lint_name) - } else { - lint_name.to_string() - }; - // If the lint was scoped with `tool::` check if the tool lint exists - if let Some(_) = tool_name { - match self.by_name.get(&complete_name) { - None => match self.lint_groups.get(&*complete_name) { - None => return CheckLintNameResult::Tool(Err((None, String::new()))), - Some(LintGroup { lint_ids, .. }) => { - return CheckLintNameResult::Tool(Ok(&lint_ids)); - } - }, - Some(&Id(ref id)) => return CheckLintNameResult::Tool(Ok(slice::from_ref(id))), - // If the lint was registered as removed or renamed by the lint tool, we don't need - // to treat tool_lints and rustc lints different and can use the code below. - _ => {} - } - } - match self.by_name.get(&complete_name) { - Some(&Renamed(ref new_name, _)) => CheckLintNameResult::Warning( - format!( - "lint `{}` has been renamed to `{}`", - complete_name, new_name - ), - Some(new_name.to_owned()), - ), - Some(&Removed(ref reason)) => CheckLintNameResult::Warning( - format!("lint `{}` has been removed: `{}`", complete_name, reason), - None, - ), - None => match self.lint_groups.get(&*complete_name) { - // If neither the lint, nor the lint group exists check if there is a `clippy::` - // variant of this lint - None => self.check_tool_name_for_backwards_compat(&complete_name, "clippy"), - Some(LintGroup { lint_ids, depr, .. }) => { - // Check if the lint group name is deprecated - if let Some(LintAlias { name, silent }) = depr { - let LintGroup { lint_ids, .. } = self.lint_groups.get(name).unwrap(); - return if *silent { - CheckLintNameResult::Ok(&lint_ids) - } else { - CheckLintNameResult::Tool(Err(( - Some(&lint_ids), - name.to_string(), - ))) - }; - } - CheckLintNameResult::Ok(&lint_ids) - } - }, - Some(&Id(ref id)) => CheckLintNameResult::Ok(slice::from_ref(id)), - } - } - - fn check_tool_name_for_backwards_compat( - &self, - lint_name: &str, - tool_name: &str, - ) -> CheckLintNameResult<'_> { - let complete_name = format!("{}::{}", tool_name, lint_name); - match self.by_name.get(&complete_name) { - None => match self.lint_groups.get(&*complete_name) { - // Now we are sure, that this lint exists nowhere - None => { - let symbols = self.by_name.keys() - .map(|name| Symbol::intern(&name)) - .collect::>(); - - let suggestion = - find_best_match_for_name(symbols.iter(), &lint_name.to_lowercase(), None); - - CheckLintNameResult::NoLint(suggestion) - } - Some(LintGroup { lint_ids, depr, .. }) => { - // Reaching this would be weird, but let's cover this case anyway - if let Some(LintAlias { name, silent }) = depr { - let LintGroup { lint_ids, .. } = self.lint_groups.get(name).unwrap(); - return if *silent { - CheckLintNameResult::Tool(Err((Some(&lint_ids), complete_name))) - } else { - CheckLintNameResult::Tool(Err(( - Some(&lint_ids), - name.to_string(), - ))) - }; - } - CheckLintNameResult::Tool(Err((Some(&lint_ids), complete_name))) - } - }, - Some(&Id(ref id)) => { - CheckLintNameResult::Tool(Err((Some(slice::from_ref(id)), complete_name))) - } - _ => CheckLintNameResult::NoLint(None), - } - } -} - -/// Context for lint checking after type checking. -pub struct LateContext<'a, 'tcx> { - /// Type context we're checking in. - pub tcx: TyCtxt<'tcx>, - - /// Side-tables for the body we are in. - // FIXME: Make this lazy to avoid running the TypeckTables query? - pub tables: &'a ty::TypeckTables<'tcx>, - - /// Parameter environment for the item we are in. - pub param_env: ty::ParamEnv<'tcx>, - - /// Items accessible from the crate being checked. - pub access_levels: &'a AccessLevels, - - /// The store of registered lints and the lint levels. - lint_store: &'tcx LintStore, - - last_node_with_lint_attrs: hir::HirId, - - /// Generic type parameters in scope for the item we are in. - pub generics: Option<&'tcx hir::Generics>, - - /// We are only looking at one module - only_module: bool, -} - -pub struct LateContextAndPass<'a, 'tcx, T: LateLintPass<'a, 'tcx>> { - context: LateContext<'a, 'tcx>, - pass: T, -} - -/// Context for lint checking of the AST, after expansion, before lowering to -/// HIR. -pub struct EarlyContext<'a> { - /// Type context we're checking in. - pub sess: &'a Session, - - /// The crate being checked. - pub krate: &'a ast::Crate, - - builder: LintLevelsBuilder<'a>, - - /// The store of registered lints and the lint levels. - lint_store: &'a LintStore, - - buffered: LintBuffer, -} - -pub struct EarlyContextAndPass<'a, T: EarlyLintPass> { - context: EarlyContext<'a>, - pass: T, -} - -pub trait LintPassObject: Sized {} - -impl LintPassObject for EarlyLintPassObject {} - -impl LintPassObject for LateLintPassObject {} - -pub trait LintContext: Sized { - type PassObject: LintPassObject; - - fn sess(&self) -> &Session; - fn lints(&self) -> &LintStore; - - fn lookup_and_emit>(&self, - lint: &'static Lint, - span: Option, - msg: &str) { - self.lookup(lint, span, msg).emit(); - } - - fn lookup_and_emit_with_diagnostics>(&self, - lint: &'static Lint, - span: Option, - msg: &str, - diagnostic: BuiltinLintDiagnostics) { - let mut db = self.lookup(lint, span, msg); - diagnostic.run(self.sess(), &mut db); - db.emit(); - } - - fn lookup>(&self, - lint: &'static Lint, - span: Option, - msg: &str) - -> DiagnosticBuilder<'_>; - - /// Emit a lint at the appropriate level, for a particular span. - fn span_lint>(&self, lint: &'static Lint, span: S, msg: &str) { - self.lookup_and_emit(lint, Some(span), msg); - } - - fn struct_span_lint>(&self, - lint: &'static Lint, - span: S, - msg: &str) - -> DiagnosticBuilder<'_> { - self.lookup(lint, Some(span), msg) - } - - /// Emit a lint and note at the appropriate level, for a particular span. - fn span_lint_note(&self, lint: &'static Lint, span: Span, msg: &str, - note_span: Span, note: &str) { - let mut err = self.lookup(lint, Some(span), msg); - if note_span == span { - err.note(note); - } else { - err.span_note(note_span, note); - } - err.emit(); - } - - /// Emit a lint and help at the appropriate level, for a particular span. - fn span_lint_help(&self, lint: &'static Lint, span: Span, - msg: &str, help: &str) { - let mut err = self.lookup(lint, Some(span), msg); - self.span_lint(lint, span, msg); - err.span_help(span, help); - err.emit(); - } - - /// Emit a lint at the appropriate level, with no associated span. - fn lint(&self, lint: &'static Lint, msg: &str) { - self.lookup_and_emit(lint, None as Option, msg); - } -} - - -impl<'a> EarlyContext<'a> { - fn new( - sess: &'a Session, - lint_store: &'a LintStore, - krate: &'a ast::Crate, - buffered: LintBuffer, - warn_about_weird_lints: bool, - ) -> EarlyContext<'a> { - EarlyContext { - sess, - krate, - lint_store, - builder: LintLevelSets::builder(sess, warn_about_weird_lints, lint_store), - buffered, - } - } -} - -macro_rules! lint_callback { ($cx:expr, $f:ident, $($args:expr),*) => ({ - $cx.pass.$f(&$cx.context, $($args),*); -}) } - -macro_rules! run_early_pass { ($cx:expr, $f:ident, $($args:expr),*) => ({ - $cx.pass.$f(&$cx.context, $($args),*); -}) } - -impl<'a, T: EarlyLintPass> EarlyContextAndPass<'a, T> { - fn check_id(&mut self, id: ast::NodeId) { - for early_lint in self.context.buffered.take(id) { - self.context.lookup_and_emit_with_diagnostics( - early_lint.lint_id.lint, - Some(early_lint.span.clone()), - &early_lint.msg, - early_lint.diagnostic - ); - } - } - - /// Merge the lints specified by any lint attributes into the - /// current lint context, call the provided function, then reset the - /// lints in effect to their previous state. - fn with_lint_attrs(&mut self, - id: ast::NodeId, - attrs: &'a [ast::Attribute], - f: F) - where F: FnOnce(&mut Self) - { - let push = self.context.builder.push(attrs, &self.context.lint_store); - self.check_id(id); - self.enter_attrs(attrs); - f(self); - self.exit_attrs(attrs); - self.context.builder.pop(push); - } - - fn enter_attrs(&mut self, attrs: &'a [ast::Attribute]) { - debug!("early context: enter_attrs({:?})", attrs); - run_early_pass!(self, enter_lint_attrs, attrs); - } - - fn exit_attrs(&mut self, attrs: &'a [ast::Attribute]) { - debug!("early context: exit_attrs({:?})", attrs); - run_early_pass!(self, exit_lint_attrs, attrs); - } -} - -impl LintContext for LateContext<'_, '_> { - type PassObject = LateLintPassObject; - - /// Gets the overall compiler `Session` object. - fn sess(&self) -> &Session { - &self.tcx.sess - } - - fn lints(&self) -> &LintStore { - &*self.lint_store - } - - fn lookup>(&self, - lint: &'static Lint, - span: Option, - msg: &str) - -> DiagnosticBuilder<'_> { - let hir_id = self.last_node_with_lint_attrs; - - match span { - Some(s) => self.tcx.struct_span_lint_hir(lint, hir_id, s, msg), - None => { - self.tcx.struct_lint_node(lint, hir_id, msg) - }, - } - } -} - -impl LintContext for EarlyContext<'_> { - type PassObject = EarlyLintPassObject; - - /// Gets the overall compiler `Session` object. - fn sess(&self) -> &Session { - &self.sess - } - - fn lints(&self) -> &LintStore { - &*self.lint_store - } - - fn lookup>(&self, - lint: &'static Lint, - span: Option, - msg: &str) - -> DiagnosticBuilder<'_> { - self.builder.struct_lint(lint, span.map(|s| s.into()), msg) - } -} - -impl<'a, 'tcx> LateContext<'a, 'tcx> { - pub fn current_lint_root(&self) -> hir::HirId { - self.last_node_with_lint_attrs - } - - /// Check if a `DefId`'s path matches the given absolute type path usage. - /// - /// Anonymous scopes such as `extern` imports are matched with `kw::Invalid`; - /// inherent `impl` blocks are matched with the name of the type. - /// - /// # Examples - /// - /// ```rust,ignore (no context or def id available) - /// if cx.match_def_path(def_id, &[sym::core, sym::option, sym::Option]) { - /// // The given `def_id` is that of an `Option` type - /// } - /// ``` - pub fn match_def_path(&self, def_id: DefId, path: &[Symbol]) -> bool { - let names = self.get_def_path(def_id); - - names.len() == path.len() && names.into_iter().zip(path.iter()).all(|(a, &b)| a == b) - } - - /// Gets the absolute path of `def_id` as a vector of `Symbol`. - /// - /// # Examples - /// - /// ```rust,ignore (no context or def id available) - /// let def_path = cx.get_def_path(def_id); - /// if let &[sym::core, sym::option, sym::Option] = &def_path[..] { - /// // The given `def_id` is that of an `Option` type - /// } - /// ``` - pub fn get_def_path(&self, def_id: DefId) -> Vec { - pub struct AbsolutePathPrinter<'tcx> { - pub tcx: TyCtxt<'tcx>, - } - - impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> { - type Error = !; - - type Path = Vec; - type Region = (); - type Type = (); - type DynExistential = (); - type Const = (); - - fn tcx(&self) -> TyCtxt<'tcx> { - self.tcx - } - - fn print_region(self, _region: ty::Region<'_>) -> Result { - Ok(()) - } - - fn print_type(self, _ty: Ty<'tcx>) -> Result { - Ok(()) - } - - fn print_dyn_existential( - self, - _predicates: &'tcx ty::List>, - ) -> Result { - Ok(()) - } - - fn print_const( - self, - _ct: &'tcx ty::Const<'tcx>, - ) -> Result { - Ok(()) - } - - fn path_crate(self, cnum: CrateNum) -> Result { - Ok(vec![self.tcx.original_crate_name(cnum)]) - } - - fn path_qualified( - self, - self_ty: Ty<'tcx>, - trait_ref: Option>, - ) -> Result { - if trait_ref.is_none() { - if let ty::Adt(def, substs) = self_ty.kind { - return self.print_def_path(def.did, substs); - } - } - - // This shouldn't ever be needed, but just in case: - Ok(vec![match trait_ref { - Some(trait_ref) => Symbol::intern(&format!("{:?}", trait_ref)), - None => Symbol::intern(&format!("<{}>", self_ty)), - }]) - } - - fn path_append_impl( - self, - print_prefix: impl FnOnce(Self) -> Result, - _disambiguated_data: &DisambiguatedDefPathData, - self_ty: Ty<'tcx>, - trait_ref: Option>, - ) -> Result { - let mut path = print_prefix(self)?; - - // This shouldn't ever be needed, but just in case: - path.push(match trait_ref { - Some(trait_ref) => { - Symbol::intern( - &format!( - "", - trait_ref.print_only_trait_path(), - self_ty - ) - ) - }, - None => Symbol::intern(&format!("", self_ty)), - }); - - Ok(path) - } - - fn path_append( - self, - print_prefix: impl FnOnce(Self) -> Result, - disambiguated_data: &DisambiguatedDefPathData, - ) -> Result { - let mut path = print_prefix(self)?; - - // Skip `::{{constructor}}` on tuple/unit structs. - match disambiguated_data.data { - DefPathData::Ctor => return Ok(path), - _ => {} - } - - path.push(disambiguated_data.data.as_symbol()); - Ok(path) - } - - fn path_generic_args( - self, - print_prefix: impl FnOnce(Self) -> Result, - _args: &[GenericArg<'tcx>], - ) -> Result { - print_prefix(self) - } - } - - AbsolutePathPrinter { tcx: self.tcx } - .print_def_path(def_id, &[]) - .unwrap() - } -} - -impl<'a, 'tcx> LayoutOf for LateContext<'a, 'tcx> { - type Ty = Ty<'tcx>; - type TyLayout = Result, LayoutError<'tcx>>; - - fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout { - self.tcx.layout_of(self.param_env.and(ty)) - } -} - -impl<'a, 'tcx, T: LateLintPass<'a, 'tcx>> LateContextAndPass<'a, 'tcx, T> { - /// Merge the lints specified by any lint attributes into the - /// current lint context, call the provided function, then reset the - /// lints in effect to their previous state. - fn with_lint_attrs(&mut self, - id: hir::HirId, - attrs: &'tcx [ast::Attribute], - f: F) - where F: FnOnce(&mut Self) - { - let prev = self.context.last_node_with_lint_attrs; - self.context.last_node_with_lint_attrs = id; - self.enter_attrs(attrs); - f(self); - self.exit_attrs(attrs); - self.context.last_node_with_lint_attrs = prev; - } - - fn with_param_env(&mut self, id: hir::HirId, f: F) - where F: FnOnce(&mut Self), - { - let old_param_env = self.context.param_env; - self.context.param_env = self.context.tcx.param_env( - self.context.tcx.hir().local_def_id(id) - ); - f(self); - self.context.param_env = old_param_env; - } - - fn process_mod(&mut self, m: &'tcx hir::Mod, s: Span, n: hir::HirId) { - lint_callback!(self, check_mod, m, s, n); - hir_visit::walk_mod(self, m, n); - lint_callback!(self, check_mod_post, m, s, n); - } - - fn enter_attrs(&mut self, attrs: &'tcx [ast::Attribute]) { - debug!("late context: enter_attrs({:?})", attrs); - lint_callback!(self, enter_lint_attrs, attrs); - } - - fn exit_attrs(&mut self, attrs: &'tcx [ast::Attribute]) { - debug!("late context: exit_attrs({:?})", attrs); - lint_callback!(self, exit_lint_attrs, attrs); - } -} - -impl<'a, 'tcx, T: LateLintPass<'a, 'tcx>> hir_visit::Visitor<'tcx> -for LateContextAndPass<'a, 'tcx, T> { - /// Because lints are scoped lexically, we want to walk nested - /// items in the context of the outer item, so enable - /// deep-walking. - fn nested_visit_map<'this>(&'this mut self) -> hir_visit::NestedVisitorMap<'this, 'tcx> { - hir_visit::NestedVisitorMap::All(&self.context.tcx.hir()) - } - - fn visit_nested_body(&mut self, body: hir::BodyId) { - let old_tables = self.context.tables; - self.context.tables = self.context.tcx.body_tables(body); - let body = self.context.tcx.hir().body(body); - self.visit_body(body); - self.context.tables = old_tables; - } - - fn visit_param(&mut self, param: &'tcx hir::Param) { - self.with_lint_attrs(param.hir_id, ¶m.attrs, |cx| { - lint_callback!(cx, check_param, param); - hir_visit::walk_param(cx, param); - }); - } - - fn visit_body(&mut self, body: &'tcx hir::Body) { - lint_callback!(self, check_body, body); - hir_visit::walk_body(self, body); - lint_callback!(self, check_body_post, body); - } - - fn visit_item(&mut self, it: &'tcx hir::Item) { - let generics = self.context.generics.take(); - self.context.generics = it.kind.generics(); - self.with_lint_attrs(it.hir_id, &it.attrs, |cx| { - cx.with_param_env(it.hir_id, |cx| { - lint_callback!(cx, check_item, it); - hir_visit::walk_item(cx, it); - lint_callback!(cx, check_item_post, it); - }); - }); - self.context.generics = generics; - } - - fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem) { - self.with_lint_attrs(it.hir_id, &it.attrs, |cx| { - cx.with_param_env(it.hir_id, |cx| { - lint_callback!(cx, check_foreign_item, it); - hir_visit::walk_foreign_item(cx, it); - lint_callback!(cx, check_foreign_item_post, it); - }); - }) - } - - fn visit_pat(&mut self, p: &'tcx hir::Pat) { - lint_callback!(self, check_pat, p); - hir_visit::walk_pat(self, p); - } - - fn visit_expr(&mut self, e: &'tcx hir::Expr) { - self.with_lint_attrs(e.hir_id, &e.attrs, |cx| { - lint_callback!(cx, check_expr, e); - hir_visit::walk_expr(cx, e); - lint_callback!(cx, check_expr_post, e); - }) - } - - fn visit_stmt(&mut self, s: &'tcx hir::Stmt) { - // statement attributes are actually just attributes on one of - // - item - // - local - // - expression - // so we keep track of lint levels there - lint_callback!(self, check_stmt, s); - hir_visit::walk_stmt(self, s); - } - - fn visit_fn(&mut self, fk: hir_visit::FnKind<'tcx>, decl: &'tcx hir::FnDecl, - body_id: hir::BodyId, span: Span, id: hir::HirId) { - // Wrap in tables here, not just in visit_nested_body, - // in order for `check_fn` to be able to use them. - let old_tables = self.context.tables; - self.context.tables = self.context.tcx.body_tables(body_id); - let body = self.context.tcx.hir().body(body_id); - lint_callback!(self, check_fn, fk, decl, body, span, id); - hir_visit::walk_fn(self, fk, decl, body_id, span, id); - lint_callback!(self, check_fn_post, fk, decl, body, span, id); - self.context.tables = old_tables; - } - - fn visit_variant_data(&mut self, - s: &'tcx hir::VariantData, - _: ast::Name, - _: &'tcx hir::Generics, - _: hir::HirId, - _: Span) { - lint_callback!(self, check_struct_def, s); - hir_visit::walk_struct_def(self, s); - lint_callback!(self, check_struct_def_post, s); - } - - fn visit_struct_field(&mut self, s: &'tcx hir::StructField) { - self.with_lint_attrs(s.hir_id, &s.attrs, |cx| { - lint_callback!(cx, check_struct_field, s); - hir_visit::walk_struct_field(cx, s); - }) - } - - fn visit_variant(&mut self, - v: &'tcx hir::Variant, - g: &'tcx hir::Generics, - item_id: hir::HirId) { - self.with_lint_attrs(v.id, &v.attrs, |cx| { - lint_callback!(cx, check_variant, v); - hir_visit::walk_variant(cx, v, g, item_id); - lint_callback!(cx, check_variant_post, v); - }) - } - - fn visit_ty(&mut self, t: &'tcx hir::Ty) { - lint_callback!(self, check_ty, t); - hir_visit::walk_ty(self, t); - } - - fn visit_name(&mut self, sp: Span, name: ast::Name) { - lint_callback!(self, check_name, sp, name); - } - - fn visit_mod(&mut self, m: &'tcx hir::Mod, s: Span, n: hir::HirId) { - if !self.context.only_module { - self.process_mod(m, s, n); - } - } - - fn visit_local(&mut self, l: &'tcx hir::Local) { - self.with_lint_attrs(l.hir_id, &l.attrs, |cx| { - lint_callback!(cx, check_local, l); - hir_visit::walk_local(cx, l); - }) - } - - fn visit_block(&mut self, b: &'tcx hir::Block) { - lint_callback!(self, check_block, b); - hir_visit::walk_block(self, b); - lint_callback!(self, check_block_post, b); - } - - fn visit_arm(&mut self, a: &'tcx hir::Arm) { - lint_callback!(self, check_arm, a); - hir_visit::walk_arm(self, a); - } - - fn visit_generic_param(&mut self, p: &'tcx hir::GenericParam) { - lint_callback!(self, check_generic_param, p); - hir_visit::walk_generic_param(self, p); - } - - fn visit_generics(&mut self, g: &'tcx hir::Generics) { - lint_callback!(self, check_generics, g); - hir_visit::walk_generics(self, g); - } - - fn visit_where_predicate(&mut self, p: &'tcx hir::WherePredicate) { - lint_callback!(self, check_where_predicate, p); - hir_visit::walk_where_predicate(self, p); - } - - fn visit_poly_trait_ref(&mut self, t: &'tcx hir::PolyTraitRef, - m: hir::TraitBoundModifier) { - lint_callback!(self, check_poly_trait_ref, t, m); - hir_visit::walk_poly_trait_ref(self, t, m); - } - - fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem) { - let generics = self.context.generics.take(); - self.context.generics = Some(&trait_item.generics); - self.with_lint_attrs(trait_item.hir_id, &trait_item.attrs, |cx| { - cx.with_param_env(trait_item.hir_id, |cx| { - lint_callback!(cx, check_trait_item, trait_item); - hir_visit::walk_trait_item(cx, trait_item); - lint_callback!(cx, check_trait_item_post, trait_item); - }); - }); - self.context.generics = generics; - } - - fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem) { - let generics = self.context.generics.take(); - self.context.generics = Some(&impl_item.generics); - self.with_lint_attrs(impl_item.hir_id, &impl_item.attrs, |cx| { - cx.with_param_env(impl_item.hir_id, |cx| { - lint_callback!(cx, check_impl_item, impl_item); - hir_visit::walk_impl_item(cx, impl_item); - lint_callback!(cx, check_impl_item_post, impl_item); - }); - }); - self.context.generics = generics; - } - - fn visit_lifetime(&mut self, lt: &'tcx hir::Lifetime) { - lint_callback!(self, check_lifetime, lt); - hir_visit::walk_lifetime(self, lt); - } - - fn visit_path(&mut self, p: &'tcx hir::Path, id: hir::HirId) { - lint_callback!(self, check_path, p, id); - hir_visit::walk_path(self, p); - } - - fn visit_attribute(&mut self, attr: &'tcx ast::Attribute) { - lint_callback!(self, check_attribute, attr); - } -} - -impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T> { - fn visit_param(&mut self, param: &'a ast::Param) { - self.with_lint_attrs(param.id, ¶m.attrs, |cx| { - run_early_pass!(cx, check_param, param); - ast_visit::walk_param(cx, param); - }); - } - - fn visit_item(&mut self, it: &'a ast::Item) { - self.with_lint_attrs(it.id, &it.attrs, |cx| { - run_early_pass!(cx, check_item, it); - ast_visit::walk_item(cx, it); - run_early_pass!(cx, check_item_post, it); - }) - } - - fn visit_foreign_item(&mut self, it: &'a ast::ForeignItem) { - self.with_lint_attrs(it.id, &it.attrs, |cx| { - run_early_pass!(cx, check_foreign_item, it); - ast_visit::walk_foreign_item(cx, it); - run_early_pass!(cx, check_foreign_item_post, it); - }) - } - - fn visit_pat(&mut self, p: &'a ast::Pat) { - run_early_pass!(self, check_pat, p); - self.check_id(p.id); - ast_visit::walk_pat(self, p); - run_early_pass!(self, check_pat_post, p); - } - - fn visit_expr(&mut self, e: &'a ast::Expr) { - self.with_lint_attrs(e.id, &e.attrs, |cx| { - run_early_pass!(cx, check_expr, e); - ast_visit::walk_expr(cx, e); - }) - } - - fn visit_stmt(&mut self, s: &'a ast::Stmt) { - run_early_pass!(self, check_stmt, s); - self.check_id(s.id); - ast_visit::walk_stmt(self, s); - } - - fn visit_fn(&mut self, fk: ast_visit::FnKind<'a>, decl: &'a ast::FnDecl, - span: Span, id: ast::NodeId) { - run_early_pass!(self, check_fn, fk, decl, span, id); - self.check_id(id); - ast_visit::walk_fn(self, fk, decl, span); - run_early_pass!(self, check_fn_post, fk, decl, span, id); - } - - fn visit_variant_data(&mut self, s: &'a ast::VariantData) { - run_early_pass!(self, check_struct_def, s); - if let Some(ctor_hir_id) = s.ctor_id() { - self.check_id(ctor_hir_id); - } - ast_visit::walk_struct_def(self, s); - run_early_pass!(self, check_struct_def_post, s); - } - - fn visit_struct_field(&mut self, s: &'a ast::StructField) { - self.with_lint_attrs(s.id, &s.attrs, |cx| { - run_early_pass!(cx, check_struct_field, s); - ast_visit::walk_struct_field(cx, s); - }) - } - - fn visit_variant(&mut self, v: &'a ast::Variant) { - self.with_lint_attrs(v.id, &v.attrs, |cx| { - run_early_pass!(cx, check_variant, v); - ast_visit::walk_variant(cx, v); - run_early_pass!(cx, check_variant_post, v); - }) - } - - fn visit_ty(&mut self, t: &'a ast::Ty) { - run_early_pass!(self, check_ty, t); - self.check_id(t.id); - ast_visit::walk_ty(self, t); - } - - fn visit_ident(&mut self, ident: ast::Ident) { - run_early_pass!(self, check_ident, ident); - } - - fn visit_mod(&mut self, m: &'a ast::Mod, s: Span, _a: &[ast::Attribute], n: ast::NodeId) { - run_early_pass!(self, check_mod, m, s, n); - self.check_id(n); - ast_visit::walk_mod(self, m); - run_early_pass!(self, check_mod_post, m, s, n); - } - - fn visit_local(&mut self, l: &'a ast::Local) { - self.with_lint_attrs(l.id, &l.attrs, |cx| { - run_early_pass!(cx, check_local, l); - ast_visit::walk_local(cx, l); - }) - } - - fn visit_block(&mut self, b: &'a ast::Block) { - run_early_pass!(self, check_block, b); - self.check_id(b.id); - ast_visit::walk_block(self, b); - run_early_pass!(self, check_block_post, b); - } - - fn visit_arm(&mut self, a: &'a ast::Arm) { - run_early_pass!(self, check_arm, a); - ast_visit::walk_arm(self, a); - } - - fn visit_expr_post(&mut self, e: &'a ast::Expr) { - run_early_pass!(self, check_expr_post, e); - } - - fn visit_generic_param(&mut self, param: &'a ast::GenericParam) { - run_early_pass!(self, check_generic_param, param); - ast_visit::walk_generic_param(self, param); - } - - fn visit_generics(&mut self, g: &'a ast::Generics) { - run_early_pass!(self, check_generics, g); - ast_visit::walk_generics(self, g); - } - - fn visit_where_predicate(&mut self, p: &'a ast::WherePredicate) { - run_early_pass!(self, check_where_predicate, p); - ast_visit::walk_where_predicate(self, p); - } - - fn visit_poly_trait_ref(&mut self, t: &'a ast::PolyTraitRef, m: &'a ast::TraitBoundModifier) { - run_early_pass!(self, check_poly_trait_ref, t, m); - ast_visit::walk_poly_trait_ref(self, t, m); - } - - fn visit_trait_item(&mut self, trait_item: &'a ast::TraitItem) { - self.with_lint_attrs(trait_item.id, &trait_item.attrs, |cx| { - run_early_pass!(cx, check_trait_item, trait_item); - ast_visit::walk_trait_item(cx, trait_item); - run_early_pass!(cx, check_trait_item_post, trait_item); - }); - } - - fn visit_impl_item(&mut self, impl_item: &'a ast::ImplItem) { - self.with_lint_attrs(impl_item.id, &impl_item.attrs, |cx| { - run_early_pass!(cx, check_impl_item, impl_item); - ast_visit::walk_impl_item(cx, impl_item); - run_early_pass!(cx, check_impl_item_post, impl_item); - }); - } - - fn visit_lifetime(&mut self, lt: &'a ast::Lifetime) { - run_early_pass!(self, check_lifetime, lt); - self.check_id(lt.id); - } - - fn visit_path(&mut self, p: &'a ast::Path, id: ast::NodeId) { - run_early_pass!(self, check_path, p, id); - self.check_id(id); - ast_visit::walk_path(self, p); - } - - fn visit_attribute(&mut self, attr: &'a ast::Attribute) { - run_early_pass!(self, check_attribute, attr); - } - - fn visit_mac_def(&mut self, mac: &'a ast::MacroDef, id: ast::NodeId) { - run_early_pass!(self, check_mac_def, mac, id); - self.check_id(id); - } - - fn visit_mac(&mut self, mac: &'a ast::Mac) { - // FIXME(#54110): So, this setup isn't really right. I think - // that (a) the libsyntax visitor ought to be doing this as - // part of `walk_mac`, and (b) we should be calling - // `visit_path`, *but* that would require a `NodeId`, and I - // want to get #53686 fixed quickly. -nmatsakis - ast_visit::walk_path(self, &mac.path); - - run_early_pass!(self, check_mac, mac); - } -} - -struct LateLintPassObjects<'a> { - lints: &'a mut [LateLintPassObject], -} - -#[allow(rustc::lint_pass_impl_without_macro)] -impl LintPass for LateLintPassObjects<'_> { - fn name(&self) -> &'static str { - panic!() - } -} - -macro_rules! expand_late_lint_pass_impl_methods { - ([$a:tt, $hir:tt], [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( - $(fn $name(&mut self, context: &LateContext<$a, $hir>, $($param: $arg),*) { - for obj in self.lints.iter_mut() { - obj.$name(context, $($param),*); - } - })* - ) -} - -macro_rules! late_lint_pass_impl { - ([], [$hir:tt], $methods:tt) => ( - impl LateLintPass<'a, $hir> for LateLintPassObjects<'_> { - expand_late_lint_pass_impl_methods!(['a, $hir], $methods); - } - ) -} - -late_lint_methods!(late_lint_pass_impl, [], ['tcx]); - -fn late_lint_mod_pass<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>( - tcx: TyCtxt<'tcx>, - module_def_id: DefId, - pass: T, -) { - let access_levels = &tcx.privacy_access_levels(LOCAL_CRATE); - - let context = LateContext { - tcx, - tables: &ty::TypeckTables::empty(None), - param_env: ty::ParamEnv::empty(), - access_levels, - lint_store: &tcx.lint_store, - last_node_with_lint_attrs: tcx.hir().as_local_hir_id(module_def_id).unwrap(), - generics: None, - only_module: true, - }; - - let mut cx = LateContextAndPass { - context, - pass - }; - - let (module, span, hir_id) = tcx.hir().get_module(module_def_id); - cx.process_mod(module, span, hir_id); - - // Visit the crate attributes - if hir_id == hir::CRATE_HIR_ID { - walk_list!(cx, visit_attribute, tcx.hir().attrs(hir::CRATE_HIR_ID)); - } -} - -pub fn late_lint_mod<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>( - tcx: TyCtxt<'tcx>, - module_def_id: DefId, - builtin_lints: T, -) { - if tcx.sess.opts.debugging_opts.no_interleave_lints { - // These passes runs in late_lint_crate with -Z no_interleave_lints - return; - } - - late_lint_mod_pass(tcx, module_def_id, builtin_lints); - - let mut passes: Vec<_> = tcx.lint_store.late_module_passes - .iter().map(|pass| (pass)()).collect(); - - if !passes.is_empty() { - late_lint_mod_pass(tcx, module_def_id, LateLintPassObjects { lints: &mut passes[..] }); - } -} - -fn late_lint_pass_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(tcx: TyCtxt<'tcx>, pass: T) { - let access_levels = &tcx.privacy_access_levels(LOCAL_CRATE); - - let krate = tcx.hir().krate(); - - let context = LateContext { - tcx, - tables: &ty::TypeckTables::empty(None), - param_env: ty::ParamEnv::empty(), - access_levels, - lint_store: &tcx.lint_store, - last_node_with_lint_attrs: hir::CRATE_HIR_ID, - generics: None, - only_module: false, - }; - - let mut cx = LateContextAndPass { - context, - pass - }; - - // Visit the whole crate. - cx.with_lint_attrs(hir::CRATE_HIR_ID, &krate.attrs, |cx| { - // since the root module isn't visited as an item (because it isn't an - // item), warn for it here. - lint_callback!(cx, check_crate, krate); - - hir_visit::walk_crate(cx, krate); - - lint_callback!(cx, check_crate_post, krate); - }) -} - -fn late_lint_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(tcx: TyCtxt<'tcx>, builtin_lints: T) { - let mut passes = tcx.lint_store - .late_passes.iter().map(|p| (p)()).collect::>(); - - if !tcx.sess.opts.debugging_opts.no_interleave_lints { - if !passes.is_empty() { - late_lint_pass_crate(tcx, LateLintPassObjects { lints: &mut passes[..] }); - } - - late_lint_pass_crate(tcx, builtin_lints); - } else { - for pass in &mut passes { - time(tcx.sess, &format!("running late lint: {}", pass.name()), || { - late_lint_pass_crate(tcx, LateLintPassObjects { lints: slice::from_mut(pass) }); - }); - } - - let mut passes: Vec<_> = tcx.lint_store.late_module_passes - .iter().map(|pass| (pass)()).collect(); - - for pass in &mut passes { - time(tcx.sess, &format!("running late module lint: {}", pass.name()), || { - late_lint_pass_crate(tcx, LateLintPassObjects { lints: slice::from_mut(pass) }); - }); - } - } -} - -/// Performs lint checking on a crate. -pub fn check_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>( - tcx: TyCtxt<'tcx>, - builtin_lints: impl FnOnce() -> T + Send, -) { - join(|| { - time(tcx.sess, "crate lints", || { - // Run whole crate non-incremental lints - late_lint_crate(tcx, builtin_lints()); - }); - }, || { - time(tcx.sess, "module lints", || { - // Run per-module lints - par_iter(&tcx.hir().krate().modules).for_each(|(&module, _)| { - tcx.ensure().lint_mod(tcx.hir().local_def_id(module)); - }); - }); - }); -} - -struct EarlyLintPassObjects<'a> { - lints: &'a mut [EarlyLintPassObject], -} - -#[allow(rustc::lint_pass_impl_without_macro)] -impl LintPass for EarlyLintPassObjects<'_> { - fn name(&self) -> &'static str { - panic!() - } -} - -macro_rules! expand_early_lint_pass_impl_methods { - ([$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( - $(fn $name(&mut self, context: &EarlyContext<'_>, $($param: $arg),*) { - for obj in self.lints.iter_mut() { - obj.$name(context, $($param),*); - } - })* - ) -} - -macro_rules! early_lint_pass_impl { - ([], [$($methods:tt)*]) => ( - impl EarlyLintPass for EarlyLintPassObjects<'_> { - expand_early_lint_pass_impl_methods!([$($methods)*]); - } - ) -} - -early_lint_methods!(early_lint_pass_impl, []); - -fn early_lint_crate( - sess: &Session, - lint_store: &LintStore, - krate: &ast::Crate, - pass: T, - buffered: LintBuffer, - warn_about_weird_lints: bool, -) -> LintBuffer { - let mut cx = EarlyContextAndPass { - context: EarlyContext::new(sess, lint_store, krate, buffered, warn_about_weird_lints), - pass, - }; - - // Visit the whole crate. - cx.with_lint_attrs(ast::CRATE_NODE_ID, &krate.attrs, |cx| { - // since the root module isn't visited as an item (because it isn't an - // item), warn for it here. - run_early_pass!(cx, check_crate, krate); - - ast_visit::walk_crate(cx, krate); - - run_early_pass!(cx, check_crate_post, krate); - }); - cx.context.buffered -} - -pub fn check_ast_crate( - sess: &Session, - lint_store: &LintStore, - krate: &ast::Crate, - pre_expansion: bool, - lint_buffer: Option, - builtin_lints: T, -) { - let mut passes: Vec<_> = if pre_expansion { - lint_store.pre_expansion_passes.iter().map(|p| (p)()).collect() - } else { - lint_store.early_passes.iter().map(|p| (p)()).collect() - }; - let mut buffered = lint_buffer.unwrap_or_default(); - - if !sess.opts.debugging_opts.no_interleave_lints { - buffered = early_lint_crate(sess, lint_store, krate, builtin_lints, buffered, - pre_expansion); - - if !passes.is_empty() { - buffered = early_lint_crate( - sess, - lint_store, - krate, - EarlyLintPassObjects { lints: &mut passes[..] }, - buffered, - pre_expansion, - ); - } - } else { - for pass in &mut passes { - buffered = time(sess, &format!("running lint: {}", pass.name()), || { - early_lint_crate( - sess, - lint_store, - krate, - EarlyLintPassObjects { lints: slice::from_mut(pass) }, - buffered, - pre_expansion, - ) - }); - } - } - - // All of the buffered lints should have been emitted at this point. - // If not, that means that we somehow buffered a lint for a node id - // that was not lint-checked (perhaps it doesn't exist?). This is a bug. - // - // Rustdoc runs everybody-loops before the early lints and removes - // function bodies, so it's totally possible for linted - // node ids to not exist (e.g., macros defined within functions for the - // unused_macro lint) anymore. So we only run this check - // when we're not in rustdoc mode. (see issue #47639) - if !sess.opts.actually_rustdoc { - for (_id, lints) in buffered.map { - for early_lint in lints { - sess.delay_span_bug(early_lint.span, "failed to process buffered lint here"); - } - } - } -} diff --git a/src/librustc/lint/mod.rs b/src/librustc/lint/mod.rs deleted file mode 100644 index a8d8868667..0000000000 --- a/src/librustc/lint/mod.rs +++ /dev/null @@ -1,699 +0,0 @@ -//! Lints, aka compiler warnings. -//! -//! A 'lint' check is a kind of miscellaneous constraint that a user _might_ -//! want to enforce, but might reasonably want to permit as well, on a -//! module-by-module basis. They contrast with static constraints enforced by -//! other phases of the compiler, which are generally required to hold in order -//! to compile the program at all. -//! -//! Most lints can be written as `LintPass` instances. These run after -//! all other analyses. The `LintPass`es built into rustc are defined -//! within `builtin.rs`, which has further comments on how to add such a lint. -//! rustc can also load user-defined lint plugins via the plugin mechanism. -//! -//! Some of rustc's lints are defined elsewhere in the compiler and work by -//! calling `add_lint()` on the overall `Session` object. This works when -//! it happens before the main lint pass, which emits the lints stored by -//! `add_lint()`. To emit lints after the main lint pass (from codegen, for -//! example) requires more effort. See `emit_lint` and `GatherNodeLevels` -//! in `context.rs`. - -pub use self::Level::*; -pub use self::LintSource::*; - -use rustc_data_structures::sync; - -use crate::hir::def_id::{CrateNum, LOCAL_CRATE}; -use crate::hir::intravisit; -use crate::hir; -use crate::lint::builtin::BuiltinLintDiagnostics; -use crate::session::{Session, DiagnosticMessageId}; -use crate::ty::TyCtxt; -use crate::ty::query::Providers; -use crate::util::nodemap::NodeMap; -use errors::{DiagnosticBuilder, DiagnosticId}; -use syntax::ast; -use syntax::source_map::{MultiSpan, ExpnKind, DesugaringKind}; -use syntax::symbol::Symbol; -use syntax_pos::hygiene::MacroKind; -use syntax_pos::Span; - -pub use crate::lint::context::{LateContext, EarlyContext, LintContext, LintStore, - check_crate, check_ast_crate, late_lint_mod, CheckLintNameResult, - BufferedEarlyLint,}; - -pub use rustc_session::lint::{Lint, LintId, Level, FutureIncompatibleInfo}; - -/// Declares a static `LintArray` and return it as an expression. -#[macro_export] -macro_rules! lint_array { - ($( $lint:expr ),* ,) => { lint_array!( $($lint),* ) }; - ($( $lint:expr ),*) => {{ - vec![$($lint),*] - }} -} - -pub type LintArray = Vec<&'static Lint>; - -pub trait LintPass { - fn name(&self) -> &'static str; -} - -/// Implements `LintPass for $name` with the given list of `Lint` statics. -#[macro_export] -macro_rules! impl_lint_pass { - ($name:ident => [$($lint:expr),* $(,)?]) => { - impl LintPass for $name { - fn name(&self) -> &'static str { stringify!($name) } - } - impl $name { - pub fn get_lints() -> LintArray { $crate::lint_array!($($lint),*) } - } - }; -} - -/// Declares a type named `$name` which implements `LintPass`. -/// To the right of `=>` a comma separated list of `Lint` statics is given. -#[macro_export] -macro_rules! declare_lint_pass { - ($(#[$m:meta])* $name:ident => [$($lint:expr),* $(,)?]) => { - $(#[$m])* #[derive(Copy, Clone)] pub struct $name; - $crate::impl_lint_pass!($name => [$($lint),*]); - }; -} - -#[macro_export] -macro_rules! late_lint_methods { - ($macro:path, $args:tt, [$hir:tt]) => ( - $macro!($args, [$hir], [ - fn check_param(a: &$hir hir::Param); - fn check_body(a: &$hir hir::Body); - fn check_body_post(a: &$hir hir::Body); - fn check_name(a: Span, b: ast::Name); - fn check_crate(a: &$hir hir::Crate); - fn check_crate_post(a: &$hir hir::Crate); - fn check_mod(a: &$hir hir::Mod, b: Span, c: hir::HirId); - fn check_mod_post(a: &$hir hir::Mod, b: Span, c: hir::HirId); - fn check_foreign_item(a: &$hir hir::ForeignItem); - fn check_foreign_item_post(a: &$hir hir::ForeignItem); - fn check_item(a: &$hir hir::Item); - fn check_item_post(a: &$hir hir::Item); - fn check_local(a: &$hir hir::Local); - fn check_block(a: &$hir hir::Block); - fn check_block_post(a: &$hir hir::Block); - fn check_stmt(a: &$hir hir::Stmt); - fn check_arm(a: &$hir hir::Arm); - fn check_pat(a: &$hir hir::Pat); - fn check_expr(a: &$hir hir::Expr); - fn check_expr_post(a: &$hir hir::Expr); - fn check_ty(a: &$hir hir::Ty); - fn check_generic_param(a: &$hir hir::GenericParam); - fn check_generics(a: &$hir hir::Generics); - fn check_where_predicate(a: &$hir hir::WherePredicate); - fn check_poly_trait_ref(a: &$hir hir::PolyTraitRef, b: hir::TraitBoundModifier); - fn check_fn( - a: hir::intravisit::FnKind<$hir>, - b: &$hir hir::FnDecl, - c: &$hir hir::Body, - d: Span, - e: hir::HirId); - fn check_fn_post( - a: hir::intravisit::FnKind<$hir>, - b: &$hir hir::FnDecl, - c: &$hir hir::Body, - d: Span, - e: hir::HirId - ); - fn check_trait_item(a: &$hir hir::TraitItem); - fn check_trait_item_post(a: &$hir hir::TraitItem); - fn check_impl_item(a: &$hir hir::ImplItem); - fn check_impl_item_post(a: &$hir hir::ImplItem); - fn check_struct_def(a: &$hir hir::VariantData); - fn check_struct_def_post(a: &$hir hir::VariantData); - fn check_struct_field(a: &$hir hir::StructField); - fn check_variant(a: &$hir hir::Variant); - fn check_variant_post(a: &$hir hir::Variant); - fn check_lifetime(a: &$hir hir::Lifetime); - fn check_path(a: &$hir hir::Path, b: hir::HirId); - fn check_attribute(a: &$hir ast::Attribute); - - /// Called when entering a syntax node that can have lint attributes such - /// as `#[allow(...)]`. Called with *all* the attributes of that node. - fn enter_lint_attrs(a: &$hir [ast::Attribute]); - - /// Counterpart to `enter_lint_attrs`. - fn exit_lint_attrs(a: &$hir [ast::Attribute]); - ]); - ) -} - -/// Trait for types providing lint checks. -/// -/// Each `check` method checks a single syntax node, and should not -/// invoke methods recursively (unlike `Visitor`). By default they -/// do nothing. -// -// FIXME: eliminate the duplication with `Visitor`. But this also -// contains a few lint-specific methods with no equivalent in `Visitor`. - -macro_rules! expand_lint_pass_methods { - ($context:ty, [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( - $(#[inline(always)] fn $name(&mut self, _: $context, $(_: $arg),*) {})* - ) -} - -macro_rules! declare_late_lint_pass { - ([], [$hir:tt], [$($methods:tt)*]) => ( - pub trait LateLintPass<'a, $hir>: LintPass { - expand_lint_pass_methods!(&LateContext<'a, $hir>, [$($methods)*]); - } - ) -} - -late_lint_methods!(declare_late_lint_pass, [], ['tcx]); - -#[macro_export] -macro_rules! expand_combined_late_lint_pass_method { - ([$($passes:ident),*], $self: ident, $name: ident, $params:tt) => ({ - $($self.$passes.$name $params;)* - }) -} - -#[macro_export] -macro_rules! expand_combined_late_lint_pass_methods { - ($passes:tt, [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( - $(fn $name(&mut self, context: &LateContext<'a, 'tcx>, $($param: $arg),*) { - expand_combined_late_lint_pass_method!($passes, self, $name, (context, $($param),*)); - })* - ) -} - -#[macro_export] -macro_rules! declare_combined_late_lint_pass { - ([$v:vis $name:ident, [$($passes:ident: $constructor:expr,)*]], [$hir:tt], $methods:tt) => ( - #[allow(non_snake_case)] - $v struct $name { - $($passes: $passes,)* - } - - impl $name { - $v fn new() -> Self { - Self { - $($passes: $constructor,)* - } - } - - $v fn get_lints() -> LintArray { - let mut lints = Vec::new(); - $(lints.extend_from_slice(&$passes::get_lints());)* - lints - } - } - - impl<'a, 'tcx> LateLintPass<'a, 'tcx> for $name { - expand_combined_late_lint_pass_methods!([$($passes),*], $methods); - } - - impl LintPass for $name { - fn name(&self) -> &'static str { - panic!() - } - } - ) -} - -#[macro_export] -macro_rules! early_lint_methods { - ($macro:path, $args:tt) => ( - $macro!($args, [ - fn check_param(a: &ast::Param); - fn check_ident(a: ast::Ident); - fn check_crate(a: &ast::Crate); - fn check_crate_post(a: &ast::Crate); - fn check_mod(a: &ast::Mod, b: Span, c: ast::NodeId); - fn check_mod_post(a: &ast::Mod, b: Span, c: ast::NodeId); - fn check_foreign_item(a: &ast::ForeignItem); - fn check_foreign_item_post(a: &ast::ForeignItem); - fn check_item(a: &ast::Item); - fn check_item_post(a: &ast::Item); - fn check_local(a: &ast::Local); - fn check_block(a: &ast::Block); - fn check_block_post(a: &ast::Block); - fn check_stmt(a: &ast::Stmt); - fn check_arm(a: &ast::Arm); - fn check_pat(a: &ast::Pat); - fn check_pat_post(a: &ast::Pat); - fn check_expr(a: &ast::Expr); - fn check_expr_post(a: &ast::Expr); - fn check_ty(a: &ast::Ty); - fn check_generic_param(a: &ast::GenericParam); - fn check_generics(a: &ast::Generics); - fn check_where_predicate(a: &ast::WherePredicate); - fn check_poly_trait_ref(a: &ast::PolyTraitRef, - b: &ast::TraitBoundModifier); - fn check_fn(a: syntax::visit::FnKind<'_>, b: &ast::FnDecl, c: Span, d_: ast::NodeId); - fn check_fn_post( - a: syntax::visit::FnKind<'_>, - b: &ast::FnDecl, - c: Span, - d: ast::NodeId - ); - fn check_trait_item(a: &ast::TraitItem); - fn check_trait_item_post(a: &ast::TraitItem); - fn check_impl_item(a: &ast::ImplItem); - fn check_impl_item_post(a: &ast::ImplItem); - fn check_struct_def(a: &ast::VariantData); - fn check_struct_def_post(a: &ast::VariantData); - fn check_struct_field(a: &ast::StructField); - fn check_variant(a: &ast::Variant); - fn check_variant_post(a: &ast::Variant); - fn check_lifetime(a: &ast::Lifetime); - fn check_path(a: &ast::Path, b: ast::NodeId); - fn check_attribute(a: &ast::Attribute); - fn check_mac_def(a: &ast::MacroDef, b: ast::NodeId); - fn check_mac(a: &ast::Mac); - - /// Called when entering a syntax node that can have lint attributes such - /// as `#[allow(...)]`. Called with *all* the attributes of that node. - fn enter_lint_attrs(a: &[ast::Attribute]); - - /// Counterpart to `enter_lint_attrs`. - fn exit_lint_attrs(a: &[ast::Attribute]); - ]); - ) -} - -macro_rules! expand_early_lint_pass_methods { - ($context:ty, [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( - $(#[inline(always)] fn $name(&mut self, _: $context, $(_: $arg),*) {})* - ) -} - -macro_rules! declare_early_lint_pass { - ([], [$($methods:tt)*]) => ( - pub trait EarlyLintPass: LintPass { - expand_early_lint_pass_methods!(&EarlyContext<'_>, [$($methods)*]); - } - ) -} - -early_lint_methods!(declare_early_lint_pass, []); - -#[macro_export] -macro_rules! expand_combined_early_lint_pass_method { - ([$($passes:ident),*], $self: ident, $name: ident, $params:tt) => ({ - $($self.$passes.$name $params;)* - }) -} - -#[macro_export] -macro_rules! expand_combined_early_lint_pass_methods { - ($passes:tt, [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( - $(fn $name(&mut self, context: &EarlyContext<'_>, $($param: $arg),*) { - expand_combined_early_lint_pass_method!($passes, self, $name, (context, $($param),*)); - })* - ) -} - -#[macro_export] -macro_rules! declare_combined_early_lint_pass { - ([$v:vis $name:ident, [$($passes:ident: $constructor:expr,)*]], $methods:tt) => ( - #[allow(non_snake_case)] - $v struct $name { - $($passes: $passes,)* - } - - impl $name { - $v fn new() -> Self { - Self { - $($passes: $constructor,)* - } - } - - $v fn get_lints() -> LintArray { - let mut lints = Vec::new(); - $(lints.extend_from_slice(&$passes::get_lints());)* - lints - } - } - - impl EarlyLintPass for $name { - expand_combined_early_lint_pass_methods!([$($passes),*], $methods); - } - - impl LintPass for $name { - fn name(&self) -> &'static str { - panic!() - } - } - ) -} - -/// A lint pass boxed up as a trait object. -pub type EarlyLintPassObject = Box; -pub type LateLintPassObject = Box LateLintPass<'a, 'tcx> + sync::Send - + sync::Sync + 'static>; - -/// How a lint level was set. -#[derive(Clone, Copy, PartialEq, Eq, HashStable)] -pub enum LintSource { - /// Lint is at the default level as declared - /// in rustc or a plugin. - Default, - - /// Lint level was set by an attribute. - Node(ast::Name, Span, Option /* RFC 2383 reason */), - - /// Lint level was set by a command-line flag. - CommandLine(Symbol), -} - -pub type LevelSource = (Level, LintSource); - -pub mod builtin; -pub mod internal; -mod context; -mod levels; - -pub use self::levels::{LintLevelSets, LintLevelMap}; - -#[derive(Default)] -pub struct LintBuffer { - map: NodeMap>, -} - -impl LintBuffer { - pub fn add_lint(&mut self, - lint: &'static Lint, - id: ast::NodeId, - sp: MultiSpan, - msg: &str, - diagnostic: BuiltinLintDiagnostics) { - let early_lint = BufferedEarlyLint { - lint_id: LintId::of(lint), - ast_id: id, - span: sp, - msg: msg.to_string(), - diagnostic - }; - let arr = self.map.entry(id).or_default(); - if !arr.contains(&early_lint) { - arr.push(early_lint); - } - } - - fn take(&mut self, id: ast::NodeId) -> Vec { - self.map.remove(&id).unwrap_or_default() - } - - pub fn buffer_lint>( - &mut self, - lint: &'static Lint, - id: ast::NodeId, - sp: S, - msg: &str, - ) { - self.add_lint(lint, id, sp.into(), msg, BuiltinLintDiagnostics::Normal) - } - - pub fn buffer_lint_with_diagnostic>( - &mut self, - lint: &'static Lint, - id: ast::NodeId, - sp: S, - msg: &str, - diagnostic: BuiltinLintDiagnostics, - ) { - self.add_lint(lint, id, sp.into(), msg, diagnostic) - } -} - -pub fn struct_lint_level<'a>(sess: &'a Session, - lint: &'static Lint, - level: Level, - src: LintSource, - span: Option, - msg: &str) - -> DiagnosticBuilder<'a> -{ - let mut err = match (level, span) { - (Level::Allow, _) => return sess.diagnostic().struct_dummy(), - (Level::Warn, Some(span)) => sess.struct_span_warn(span, msg), - (Level::Warn, None) => sess.struct_warn(msg), - (Level::Deny, Some(span)) | - (Level::Forbid, Some(span)) => sess.struct_span_err(span, msg), - (Level::Deny, None) | - (Level::Forbid, None) => sess.struct_err(msg), - }; - - // Check for future incompatibility lints and issue a stronger warning. - let lint_id = LintId::of(lint); - let future_incompatible = lint.future_incompatible; - - // If this code originates in a foreign macro, aka something that this crate - // did not itself author, then it's likely that there's nothing this crate - // can do about it. We probably want to skip the lint entirely. - if err.span.primary_spans().iter().any(|s| in_external_macro(sess, *s)) { - // Any suggestions made here are likely to be incorrect, so anything we - // emit shouldn't be automatically fixed by rustfix. - err.allow_suggestions(false); - - // If this is a future incompatible lint it'll become a hard error, so - // we have to emit *something*. Also allow lints to whitelist themselves - // on a case-by-case basis for emission in a foreign macro. - if future_incompatible.is_none() && !lint.report_in_external_macro { - err.cancel(); - // Don't continue further, since we don't want to have - // `diag_span_note_once` called for a diagnostic that isn't emitted. - return err; - } - } - - let name = lint.name_lower(); - match src { - LintSource::Default => { - sess.diag_note_once( - &mut err, - DiagnosticMessageId::from(lint), - &format!("`#[{}({})]` on by default", level.as_str(), name)); - } - LintSource::CommandLine(lint_flag_val) => { - let flag = match level { - Level::Warn => "-W", - Level::Deny => "-D", - Level::Forbid => "-F", - Level::Allow => panic!(), - }; - let hyphen_case_lint_name = name.replace("_", "-"); - if lint_flag_val.as_str() == name { - sess.diag_note_once( - &mut err, - DiagnosticMessageId::from(lint), - &format!("requested on the command line with `{} {}`", - flag, hyphen_case_lint_name)); - } else { - let hyphen_case_flag_val = lint_flag_val.as_str().replace("_", "-"); - sess.diag_note_once( - &mut err, - DiagnosticMessageId::from(lint), - &format!("`{} {}` implied by `{} {}`", - flag, hyphen_case_lint_name, flag, - hyphen_case_flag_val)); - } - } - LintSource::Node(lint_attr_name, src, reason) => { - if let Some(rationale) = reason { - err.note(&rationale.as_str()); - } - sess.diag_span_note_once(&mut err, DiagnosticMessageId::from(lint), - src, "lint level defined here"); - if lint_attr_name.as_str() != name { - let level_str = level.as_str(); - sess.diag_note_once(&mut err, DiagnosticMessageId::from(lint), - &format!("`#[{}({})]` implied by `#[{}({})]`", - level_str, name, level_str, lint_attr_name)); - } - } - } - - err.code(DiagnosticId::Lint(name)); - - if let Some(future_incompatible) = future_incompatible { - const STANDARD_MESSAGE: &str = - "this was previously accepted by the compiler but is being phased out; \ - it will become a hard error"; - - let explanation = if lint_id == LintId::of(builtin::UNSTABLE_NAME_COLLISIONS) { - "once this method is added to the standard library, \ - the ambiguity may cause an error or change in behavior!" - .to_owned() - } else if lint_id == LintId::of(builtin::MUTABLE_BORROW_RESERVATION_CONFLICT) { - "this borrowing pattern was not meant to be accepted, \ - and may become a hard error in the future" - .to_owned() - } else if let Some(edition) = future_incompatible.edition { - format!("{} in the {} edition!", STANDARD_MESSAGE, edition) - } else { - format!("{} in a future release!", STANDARD_MESSAGE) - }; - let citation = format!("for more information, see {}", - future_incompatible.reference); - err.warn(&explanation); - err.note(&citation); - } - - return err -} - -pub fn maybe_lint_level_root(tcx: TyCtxt<'_>, id: hir::HirId) -> bool { - let attrs = tcx.hir().attrs(id); - attrs.iter().any(|attr| Level::from_symbol(attr.name_or_empty()).is_some()) -} - -fn lint_levels(tcx: TyCtxt<'_>, cnum: CrateNum) -> &LintLevelMap { - assert_eq!(cnum, LOCAL_CRATE); - let store = &tcx.lint_store; - let mut builder = LintLevelMapBuilder { - levels: LintLevelSets::builder(tcx.sess, false, &store), - tcx: tcx, - store: store, - }; - let krate = tcx.hir().krate(); - - let push = builder.levels.push(&krate.attrs, &store); - builder.levels.register_id(hir::CRATE_HIR_ID); - for macro_def in &krate.exported_macros { - builder.levels.register_id(macro_def.hir_id); - } - intravisit::walk_crate(&mut builder, krate); - builder.levels.pop(push); - - tcx.arena.alloc(builder.levels.build_map()) -} - -struct LintLevelMapBuilder<'a, 'tcx> { - levels: levels::LintLevelsBuilder<'tcx>, - tcx: TyCtxt<'tcx>, - store: &'a LintStore, -} - -impl LintLevelMapBuilder<'_, '_> { - fn with_lint_attrs(&mut self, - id: hir::HirId, - attrs: &[ast::Attribute], - f: F) - where F: FnOnce(&mut Self) - { - let push = self.levels.push(attrs, self.store); - if push.changed { - self.levels.register_id(id); - } - f(self); - self.levels.pop(push); - } -} - -impl intravisit::Visitor<'tcx> for LintLevelMapBuilder<'_, 'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'tcx> { - intravisit::NestedVisitorMap::All(&self.tcx.hir()) - } - - fn visit_param(&mut self, param: &'tcx hir::Param) { - self.with_lint_attrs(param.hir_id, ¶m.attrs, |builder| { - intravisit::walk_param(builder, param); - }); - } - - fn visit_item(&mut self, it: &'tcx hir::Item) { - self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { - intravisit::walk_item(builder, it); - }); - } - - fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem) { - self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { - intravisit::walk_foreign_item(builder, it); - }) - } - - fn visit_expr(&mut self, e: &'tcx hir::Expr) { - self.with_lint_attrs(e.hir_id, &e.attrs, |builder| { - intravisit::walk_expr(builder, e); - }) - } - - fn visit_struct_field(&mut self, s: &'tcx hir::StructField) { - self.with_lint_attrs(s.hir_id, &s.attrs, |builder| { - intravisit::walk_struct_field(builder, s); - }) - } - - fn visit_variant(&mut self, - v: &'tcx hir::Variant, - g: &'tcx hir::Generics, - item_id: hir::HirId) { - self.with_lint_attrs(v.id, &v.attrs, |builder| { - intravisit::walk_variant(builder, v, g, item_id); - }) - } - - fn visit_local(&mut self, l: &'tcx hir::Local) { - self.with_lint_attrs(l.hir_id, &l.attrs, |builder| { - intravisit::walk_local(builder, l); - }) - } - - fn visit_arm(&mut self, a: &'tcx hir::Arm) { - self.with_lint_attrs(a.hir_id, &a.attrs, |builder| { - intravisit::walk_arm(builder, a); - }) - } - - fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem) { - self.with_lint_attrs(trait_item.hir_id, &trait_item.attrs, |builder| { - intravisit::walk_trait_item(builder, trait_item); - }); - } - - fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem) { - self.with_lint_attrs(impl_item.hir_id, &impl_item.attrs, |builder| { - intravisit::walk_impl_item(builder, impl_item); - }); - } -} - -pub fn provide(providers: &mut Providers<'_>) { - providers.lint_levels = lint_levels; -} - -/// Returns whether `span` originates in a foreign crate's external macro. -/// -/// This is used to test whether a lint should not even begin to figure out whether it should -/// be reported on the current node. -pub fn in_external_macro(sess: &Session, span: Span) -> bool { - let expn_data = span.ctxt().outer_expn_data(); - match expn_data.kind { - ExpnKind::Root | ExpnKind::Desugaring(DesugaringKind::ForLoop) => false, - ExpnKind::AstPass(_) | ExpnKind::Desugaring(_) => true, // well, it's "external" - ExpnKind::Macro(MacroKind::Bang, _) => { - if expn_data.def_site.is_dummy() { - // Dummy span for the `def_site` means it's an external macro. - return true; - } - match sess.source_map().span_to_snippet(expn_data.def_site) { - Ok(code) => !code.starts_with("macro_rules"), - // No snippet means external macro or compiler-builtin expansion. - Err(_) => true, - } - } - ExpnKind::Macro(..) => true, // definitely a plugin - } -} - -/// Returns `true` if `span` originates in a derive-macro's expansion. -pub fn in_derive_expansion(span: Span) -> bool { - if let ExpnKind::Macro(MacroKind::Derive, _) = span.ctxt().outer_expn_data().kind { - return true; - } - false -} diff --git a/src/librustc/middle/codegen_fn_attrs.rs b/src/librustc/middle/codegen_fn_attrs.rs new file mode 100644 index 0000000000..3b109f2fea --- /dev/null +++ b/src/librustc/middle/codegen_fn_attrs.rs @@ -0,0 +1,116 @@ +use crate::mir::mono::Linkage; +use rustc_span::symbol::Symbol; +use syntax::attr::{InlineAttr, OptimizeAttr}; + +#[derive(Clone, RustcEncodable, RustcDecodable, HashStable)] +pub struct CodegenFnAttrs { + pub flags: CodegenFnAttrFlags, + /// Parsed representation of the `#[inline]` attribute + pub inline: InlineAttr, + /// Parsed representation of the `#[optimize]` attribute + pub optimize: OptimizeAttr, + /// The `#[export_name = "..."]` attribute, indicating a custom symbol a + /// function should be exported under + pub export_name: Option, + /// The `#[link_name = "..."]` attribute, indicating a custom symbol an + /// imported function should be imported as. Note that `export_name` + /// probably isn't set when this is set, this is for foreign items while + /// `#[export_name]` is for Rust-defined functions. + pub link_name: Option, + /// The `#[link_ordinal = "..."]` attribute, indicating an ordinal an + /// imported function has in the dynamic library. Note that this must not + /// be set when `link_name` is set. This is for foreign items with the + /// "raw-dylib" kind. + pub link_ordinal: Option, + /// The `#[target_feature(enable = "...")]` attribute and the enabled + /// features (only enabled features are supported right now). + pub target_features: Vec, + /// The `#[linkage = "..."]` attribute and the value we found. + pub linkage: Option, + /// The `#[link_section = "..."]` attribute, or what executable section this + /// should be placed in. + pub link_section: Option, +} + +bitflags! { + #[derive(RustcEncodable, RustcDecodable, HashStable)] + pub struct CodegenFnAttrFlags: u32 { + /// `#[cold]`: a hint to LLVM that this function, when called, is never on + /// the hot path. + const COLD = 1 << 0; + /// `#[rustc_allocator]`: a hint to LLVM that the pointer returned from this + /// function is never null. + const ALLOCATOR = 1 << 1; + /// `#[unwind]`: an indicator that this function may unwind despite what + /// its ABI signature may otherwise imply. + const UNWIND = 1 << 2; + /// `#[rust_allocator_nounwind]`, an indicator that an imported FFI + /// function will never unwind. Probably obsolete by recent changes with + /// #[unwind], but hasn't been removed/migrated yet + const RUSTC_ALLOCATOR_NOUNWIND = 1 << 3; + /// `#[naked]`: an indicator to LLVM that no function prologue/epilogue + /// should be generated. + const NAKED = 1 << 4; + /// `#[no_mangle]`: an indicator that the function's name should be the same + /// as its symbol. + const NO_MANGLE = 1 << 5; + /// `#[rustc_std_internal_symbol]`: an indicator that this symbol is a + /// "weird symbol" for the standard library in that it has slightly + /// different linkage, visibility, and reachability rules. + const RUSTC_STD_INTERNAL_SYMBOL = 1 << 6; + /// `#[no_debug]`: an indicator that no debugging information should be + /// generated for this function by LLVM. + const NO_DEBUG = 1 << 7; + /// `#[thread_local]`: indicates a static is actually a thread local + /// piece of memory + const THREAD_LOCAL = 1 << 8; + /// `#[used]`: indicates that LLVM can't eliminate this function (but the + /// linker can!). + const USED = 1 << 9; + /// `#[ffi_returns_twice]`, indicates that an extern function can return + /// multiple times + const FFI_RETURNS_TWICE = 1 << 10; + /// `#[track_caller]`: allow access to the caller location + const TRACK_CALLER = 1 << 11; + } +} + +impl CodegenFnAttrs { + pub fn new() -> CodegenFnAttrs { + CodegenFnAttrs { + flags: CodegenFnAttrFlags::empty(), + inline: InlineAttr::None, + optimize: OptimizeAttr::None, + export_name: None, + link_name: None, + link_ordinal: None, + target_features: vec![], + linkage: None, + link_section: None, + } + } + + /// Returns `true` if `#[inline]` or `#[inline(always)]` is present. + pub fn requests_inline(&self) -> bool { + match self.inline { + InlineAttr::Hint | InlineAttr::Always => true, + InlineAttr::None | InlineAttr::Never => false, + } + } + + /// Returns `true` if it looks like this symbol needs to be exported, for example: + /// + /// * `#[no_mangle]` is present + /// * `#[export_name(...)]` is present + /// * `#[linkage]` is present + pub fn contains_extern_indicator(&self) -> bool { + self.flags.contains(CodegenFnAttrFlags::NO_MANGLE) + || self.export_name.is_some() + || match self.linkage { + // These are private, so make sure we don't try to consider + // them external. + None | Some(Linkage::Internal) | Some(Linkage::Private) => false, + Some(_) => true, + } + } +} diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs index 324b01316f..0e7ff3a339 100644 --- a/src/librustc/middle/cstore.rs +++ b/src/librustc/middle/cstore.rs @@ -2,32 +2,32 @@ //! are *mostly* used as a part of that interface, but these should //! probably get a better home if someone can find one. -use crate::hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; use crate::hir::map as hir_map; use crate::hir::map::definitions::{DefKey, DefPathTable}; -use rustc_data_structures::svh::Svh; -use crate::ty::{self, TyCtxt}; -use crate::session::{Session, CrateDisambiguator}; use crate::session::search_paths::PathKind; +use crate::session::CrateDisambiguator; +use crate::ty::TyCtxt; +use rustc_data_structures::svh::Svh; +use rustc_data_structures::sync::{self, MetadataRef}; +use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; +use rustc_macros::HashStable; +use rustc_span::symbol::Symbol; +use rustc_span::Span; +use rustc_target::spec::Target; use std::any::Any; use std::path::{Path, PathBuf}; use syntax::ast; -use syntax::symbol::Symbol; -use syntax_pos::Span; use syntax::expand::allocator::AllocatorKind; -use rustc_target::spec::Target; -use rustc_data_structures::sync::{self, MetadataRef}; -use rustc_macros::HashStable; -pub use rustc_session::utils::NativeLibraryKind; pub use self::NativeLibraryKind::*; +pub use rustc_session::utils::NativeLibraryKind; // lonely orphan structs and enums looking for a better home /// Where a crate came from on the local filesystem. One of these three options /// must be non-None. -#[derive(PartialEq, Clone, Debug, HashStable)] +#[derive(PartialEq, Clone, Debug, HashStable, RustcEncodable, RustcDecodable)] pub struct CrateSource { pub dylib: Option<(PathBuf, PathKind)>, pub rlib: Option<(PathBuf, PathKind)>, @@ -40,8 +40,18 @@ impl CrateSource { } } -#[derive(RustcEncodable, RustcDecodable, Copy, Clone, - Ord, PartialOrd, Eq, PartialEq, Debug, HashStable)] +#[derive( + RustcEncodable, + RustcDecodable, + Copy, + Clone, + Ord, + PartialOrd, + Eq, + PartialEq, + Debug, + HashStable +)] pub enum DepKind { /// A dependency that is only used for its macros, none of which are visible from other crates. /// These are included in the metadata only as placeholders and are ignored when decoding. @@ -65,7 +75,7 @@ impl DepKind { } } -#[derive(PartialEq, Clone, Debug)] +#[derive(PartialEq, Clone, Debug, RustcEncodable, RustcDecodable)] pub enum LibSource { Some(PathBuf), MetadataOnly, @@ -74,11 +84,7 @@ pub enum LibSource { impl LibSource { pub fn is_some(&self) -> bool { - if let LibSource::Some(_) = *self { - true - } else { - false - } + if let LibSource::Some(_) = *self { true } else { false } } pub fn option(&self) -> Option { @@ -154,15 +160,14 @@ pub enum ExternCrateSource { Path, } +#[derive(RustcEncodable, RustcDecodable)] pub struct EncodedMetadata { - pub raw_data: Vec + pub raw_data: Vec, } impl EncodedMetadata { pub fn new() -> EncodedMetadata { - EncodedMetadata { - raw_data: Vec::new(), - } + EncodedMetadata { raw_data: Vec::new() } } } @@ -175,14 +180,8 @@ impl EncodedMetadata { /// metadata in library -- this trait just serves to decouple rustc_metadata from /// the archive reader, which depends on LLVM. pub trait MetadataLoader { - fn get_rlib_metadata(&self, - target: &Target, - filename: &Path) - -> Result; - fn get_dylib_metadata(&self, - target: &Target, - filename: &Path) - -> Result; + fn get_rlib_metadata(&self, target: &Target, filename: &Path) -> Result; + fn get_dylib_metadata(&self, target: &Target, filename: &Path) -> Result; } pub type MetadataLoaderDyn = dyn MetadataLoader + Sync; @@ -210,7 +209,6 @@ pub trait CrateStore { fn crate_is_private_dep_untracked(&self, cnum: CrateNum) -> bool; fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator; fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh; - fn item_generics_cloned_untracked(&self, def: DefId, sess: &Session) -> ty::Generics; // This is basically a 1-based range of ints, which is a little // silly - I may fix that. @@ -234,12 +232,13 @@ pub type CrateStoreDyn = dyn CrateStore + sync::Sync; // topological sort of all crates putting the leaves at the right-most // positions. pub fn used_crates(tcx: TyCtxt<'_>, prefer: LinkagePreference) -> Vec<(CrateNum, LibSource)> { - let mut libs = tcx.crates() + let mut libs = tcx + .crates() .iter() .cloned() .filter_map(|cnum| { if tcx.dep_kind(cnum).macros_only() { - return None + return None; } let source = tcx.used_crate_source(cnum); let path = match prefer { @@ -261,8 +260,6 @@ pub fn used_crates(tcx: TyCtxt<'_>, prefer: LinkagePreference) -> Vec<(CrateNum, .collect::>(); let mut ordering = tcx.postorder_cnums(LOCAL_CRATE).to_owned(); ordering.reverse(); - libs.sort_by_cached_key(|&(a, _)| { - ordering.iter().position(|x| *x == a) - }); + libs.sort_by_cached_key(|&(a, _)| ordering.iter().position(|x| *x == a)); libs } diff --git a/src/librustc/middle/dependency_format.rs b/src/librustc/middle/dependency_format.rs index 8b2bf55ccc..6ece51fe86 100644 --- a/src/librustc/middle/dependency_format.rs +++ b/src/librustc/middle/dependency_format.rs @@ -19,7 +19,7 @@ pub type DependencyList = Vec; /// This is local to the tcx, and is generally relevant to one session. pub type Dependencies = Vec<(config::CrateType, DependencyList)>; -#[derive(Copy, Clone, PartialEq, Debug, HashStable)] +#[derive(Copy, Clone, PartialEq, Debug, HashStable, RustcEncodable, RustcDecodable)] pub enum Linkage { NotLinked, IncludedFromDylib, diff --git a/src/librustc/middle/exported_symbols.rs b/src/librustc/middle/exported_symbols.rs index 7182f03182..1f4318fa53 100644 --- a/src/librustc/middle/exported_symbols.rs +++ b/src/librustc/middle/exported_symbols.rs @@ -1,10 +1,7 @@ -use crate::hir::def_id::{DefId, LOCAL_CRATE}; -use crate::ich::StableHashingContext; -use rustc_data_structures::stable_hasher::{StableHasher, HashStable}; -use std::cmp; -use std::mem; -use crate::ty::{self, TyCtxt}; use crate::ty::subst::SubstsRef; +use crate::ty::{self, Ty, TyCtxt}; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; +use rustc_macros::HashStable; /// The SymbolExportLevel of a symbols specifies from which kinds of crates /// the symbol will be exported. `C` symbols will be exported from any @@ -24,83 +21,35 @@ impl SymbolExportLevel { } } -#[derive(Eq, PartialEq, Debug, Copy, Clone, RustcEncodable, RustcDecodable)] +#[derive(Eq, PartialEq, Debug, Copy, Clone, RustcEncodable, RustcDecodable, HashStable)] pub enum ExportedSymbol<'tcx> { NonGeneric(DefId), Generic(DefId, SubstsRef<'tcx>), + DropGlue(Ty<'tcx>), NoDefId(ty::SymbolName), } impl<'tcx> ExportedSymbol<'tcx> { - pub fn symbol_name(&self, tcx: TyCtxt<'tcx>) -> ty::SymbolName { + /// This is the symbol name of an instance if it is instantiated in the + /// local crate. + pub fn symbol_name_for_local_instance(&self, tcx: TyCtxt<'tcx>) -> ty::SymbolName { match *self { - ExportedSymbol::NonGeneric(def_id) => { - tcx.symbol_name(ty::Instance::mono(tcx, def_id)) - } + ExportedSymbol::NonGeneric(def_id) => tcx.symbol_name(ty::Instance::mono(tcx, def_id)), ExportedSymbol::Generic(def_id, substs) => { tcx.symbol_name(ty::Instance::new(def_id, substs)) } - ExportedSymbol::NoDefId(symbol_name) => { - symbol_name - } - } - } - - pub fn compare_stable(&self, tcx: TyCtxt<'tcx>, other: &ExportedSymbol<'tcx>) -> cmp::Ordering { - match *self { - ExportedSymbol::NonGeneric(self_def_id) => match *other { - ExportedSymbol::NonGeneric(other_def_id) => { - tcx.def_path_hash(self_def_id).cmp(&tcx.def_path_hash(other_def_id)) - } - ExportedSymbol::Generic(..) | - ExportedSymbol::NoDefId(_) => { - cmp::Ordering::Less - } - } - ExportedSymbol::Generic(..) => match *other { - ExportedSymbol::NonGeneric(_) => { - cmp::Ordering::Greater - } - ExportedSymbol::Generic(..) => { - self.symbol_name(tcx).cmp(&other.symbol_name(tcx)) - } - ExportedSymbol::NoDefId(_) => { - cmp::Ordering::Less - } - } - ExportedSymbol::NoDefId(self_symbol_name) => match *other { - ExportedSymbol::NonGeneric(_) | - ExportedSymbol::Generic(..) => { - cmp::Ordering::Greater - } - ExportedSymbol::NoDefId(ref other_symbol_name) => { - self_symbol_name.cmp(other_symbol_name) - } + ExportedSymbol::DropGlue(ty) => { + tcx.symbol_name(ty::Instance::resolve_drop_in_place(tcx, ty)) } + ExportedSymbol::NoDefId(symbol_name) => symbol_name, } } } pub fn metadata_symbol_name(tcx: TyCtxt<'_>) -> String { - format!("rust_metadata_{}_{}", - tcx.original_crate_name(LOCAL_CRATE), - tcx.crate_disambiguator(LOCAL_CRATE).to_fingerprint().to_hex()) -} - -impl<'a, 'tcx> HashStable> for ExportedSymbol<'tcx> { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - mem::discriminant(self).hash_stable(hcx, hasher); - match *self { - ExportedSymbol::NonGeneric(def_id) => { - def_id.hash_stable(hcx, hasher); - } - ExportedSymbol::Generic(def_id, substs) => { - def_id.hash_stable(hcx, hasher); - substs.hash_stable(hcx, hasher); - } - ExportedSymbol::NoDefId(symbol_name) => { - symbol_name.hash_stable(hcx, hasher); - } - } - } + format!( + "rust_metadata_{}_{}", + tcx.original_crate_name(LOCAL_CRATE), + tcx.crate_disambiguator(LOCAL_CRATE).to_fingerprint().to_hex() + ) } diff --git a/src/librustc/middle/free_region.rs b/src/librustc/middle/free_region.rs index 60e41f7eb0..355f949b87 100644 --- a/src/librustc/middle/free_region.rs +++ b/src/librustc/middle/free_region.rs @@ -3,10 +3,10 @@ //! or explicit bounds. In that case, we track the bounds using the `TransitiveRelation` type, //! and use that to decide when one free region outlives another, and so forth. -use crate::infer::outlives::free_region_map::{FreeRegionMap, FreeRegionRelations}; -use crate::hir::def_id::DefId; use crate::middle::region; -use crate::ty::{self, TyCtxt, Region}; +use crate::ty::free_region_map::{FreeRegionMap, FreeRegionRelations}; +use crate::ty::{self, Region, TyCtxt}; +use rustc_hir::def_id::DefId; /// Combines a `region::ScopeTree` (which governs relationships between /// scopes) and a `FreeRegionMap` (which governs relationships between @@ -35,28 +35,23 @@ impl<'a, 'tcx> RegionRelations<'a, 'tcx> { region_scope_tree: &'a region::ScopeTree, free_regions: &'a FreeRegionMap<'tcx>, ) -> Self { - Self { - tcx, - context, - region_scope_tree, - free_regions, - } + Self { tcx, context, region_scope_tree, free_regions } } /// Determines whether one region is a subregion of another. This is intended to run *after /// inference* and sadly the logic is somewhat duplicated with the code in infer.rs. - pub fn is_subregion_of(&self, - sub_region: ty::Region<'tcx>, - super_region: ty::Region<'tcx>) - -> bool { + pub fn is_subregion_of( + &self, + sub_region: ty::Region<'tcx>, + super_region: ty::Region<'tcx>, + ) -> bool { let result = sub_region == super_region || { match (sub_region, super_region) { - (ty::ReEmpty, _) | - (_, ty::ReStatic) => - true, + (ty::ReEmpty, _) | (_, ty::ReStatic) => true, - (ty::ReScope(sub_scope), ty::ReScope(super_scope)) => - self.region_scope_tree.is_subscope_of(*sub_scope, *super_scope), + (ty::ReScope(sub_scope), ty::ReScope(super_scope)) => { + self.region_scope_tree.is_subscope_of(*sub_scope, *super_scope) + } (ty::ReScope(sub_scope), ty::ReEarlyBound(ref br)) => { let fr_scope = self.region_scope_tree.early_free_scope(self.tcx, br); @@ -68,19 +63,21 @@ impl<'a, 'tcx> RegionRelations<'a, 'tcx> { self.region_scope_tree.is_subscope_of(*sub_scope, fr_scope) } - (ty::ReEarlyBound(_), ty::ReEarlyBound(_)) | - (ty::ReFree(_), ty::ReEarlyBound(_)) | - (ty::ReEarlyBound(_), ty::ReFree(_)) | - (ty::ReFree(_), ty::ReFree(_)) => - self.free_regions.sub_free_regions(sub_region, super_region), + (ty::ReEarlyBound(_), ty::ReEarlyBound(_)) + | (ty::ReFree(_), ty::ReEarlyBound(_)) + | (ty::ReEarlyBound(_), ty::ReFree(_)) + | (ty::ReFree(_), ty::ReFree(_)) => { + self.free_regions.sub_free_regions(sub_region, super_region) + } - _ => - false, + _ => false, } }; let result = result || self.is_static(super_region); - debug!("is_subregion_of(sub_region={:?}, super_region={:?}) = {:?}", - sub_region, super_region, result); + debug!( + "is_subregion_of(sub_region={:?}, super_region={:?}) = {:?}", + sub_region, super_region, result + ); result } @@ -93,14 +90,11 @@ impl<'a, 'tcx> RegionRelations<'a, 'tcx> { let re_static = self.tcx.mk_region(ty::ReStatic); self.free_regions.sub_free_regions(&re_static, &super_region) } - _ => false + _ => false, } } - pub fn lub_free_regions(&self, - r_a: Region<'tcx>, - r_b: Region<'tcx>) - -> Region<'tcx> { + pub fn lub_free_regions(&self, r_a: Region<'tcx>, r_b: Region<'tcx>) -> Region<'tcx> { self.free_regions.lub_free_regions(self.tcx, r_a, r_b) } } diff --git a/src/librustc/middle/lang_items.rs b/src/librustc/middle/lang_items.rs index 6f7a022ecc..27b769742a 100644 --- a/src/librustc/middle/lang_items.rs +++ b/src/librustc/middle/lang_items.rs @@ -9,21 +9,20 @@ pub use self::LangItem::*; -use crate::hir::def_id::DefId; use crate::hir::check_attr::Target; -use crate::ty::{self, TyCtxt}; -use crate::middle::weak_lang_items; use crate::middle::cstore::ExternCrate; -use crate::util::nodemap::FxHashMap; +use crate::middle::weak_lang_items; +use crate::ty::{self, TyCtxt}; -use syntax::ast; -use syntax::symbol::{Symbol, sym}; -use syntax_pos::Span; +use rustc_data_structures::fx::FxHashMap; +use rustc_errors::struct_span_err; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_macros::HashStable; -use crate::hir::itemlikevisit::ItemLikeVisitor; -use crate::hir; - -use rustc_error_codes::*; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; +use syntax::ast; // The actual lang items defined come at the end of this file in one handy table. // So you probably just want to nip down to the end. @@ -113,7 +112,7 @@ struct LanguageItemCollector<'tcx> { } impl ItemLikeVisitor<'v> for LanguageItemCollector<'tcx> { - fn visit_item(&mut self, item: &hir::Item) { + fn visit_item(&mut self, item: &hir::Item<'_>) { if let Some((value, span)) = extract(&item.attrs) { let actual_target = Target::from_item(item); match self.item_refs.get(&*value.as_str()).cloned() { @@ -151,11 +150,11 @@ impl ItemLikeVisitor<'v> for LanguageItemCollector<'tcx> { } } - fn visit_trait_item(&mut self, _trait_item: &hir::TraitItem) { + fn visit_trait_item(&mut self, _trait_item: &hir::TraitItem<'_>) { // At present, lang items are always items, not trait items. } - fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem) { + fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem<'_>) { // At present, lang items are always items, not impl items. } } @@ -183,8 +182,9 @@ impl LanguageItemCollector<'tcx> { self.tcx.sess, span, E0152, - "duplicate lang item found: `{}`.", - name), + "found duplicate lang item `{}`", + name + ), None => { match self.tcx.extern_crate(item_def_id) { Some(ExternCrate {dependency_of, ..}) => { @@ -204,12 +204,12 @@ impl LanguageItemCollector<'tcx> { }, }; if let Some(span) = self.tcx.hir().span_if_local(original_def_id) { - span_note!(&mut err, span, "first defined here."); + err.span_note(span, "first defined here"); } else { match self.tcx.extern_crate(original_def_id) { Some(ExternCrate {dependency_of, ..}) => { err.note(&format!( - "first defined in crate `{}` (which `{}` depends on).", + "first defined in crate `{}` (which `{}` depends on)", self.tcx.crate_name(original_def_id.krate), self.tcx.crate_name(*dependency_of))); }, diff --git a/src/librustc/middle/mod.rs b/src/librustc/middle/mod.rs new file mode 100644 index 0000000000..c2959766c5 --- /dev/null +++ b/src/librustc/middle/mod.rs @@ -0,0 +1,36 @@ +pub mod codegen_fn_attrs; +pub mod cstore; +pub mod dependency_format; +pub mod exported_symbols; +pub mod free_region; +pub mod lang_items; +pub mod lib_features { + use rustc_data_structures::fx::{FxHashMap, FxHashSet}; + use rustc_span::symbol::Symbol; + + #[derive(HashStable)] + pub struct LibFeatures { + // A map from feature to stabilisation version. + pub stable: FxHashMap, + pub unstable: FxHashSet, + } + + impl LibFeatures { + pub fn to_vec(&self) -> Vec<(Symbol, Option)> { + let mut all_features: Vec<_> = self + .stable + .iter() + .map(|(f, s)| (*f, Some(*s))) + .chain(self.unstable.iter().map(|f| (*f, None))) + .collect(); + all_features.sort_unstable_by_key(|f| f.0.as_str()); + all_features + } + } +} +pub mod privacy; +pub mod recursion_limit; +pub mod region; +pub mod resolve_lifetime; +pub mod stability; +pub mod weak_lang_items; diff --git a/src/librustc/middle/privacy.rs b/src/librustc/middle/privacy.rs index 787ff8d48c..4756e83b5e 100644 --- a/src/librustc/middle/privacy.rs +++ b/src/librustc/middle/privacy.rs @@ -2,12 +2,12 @@ //! outside their scopes. This pass will also generate a set of exported items //! which are available for use externally when compiled as a library. -use crate::hir::HirId; -use crate::util::nodemap::{DefIdSet, FxHashMap}; - -use std::hash::Hash; -use std::fmt; +use rustc_data_structures::fx::FxHashMap; +use rustc_hir::def_id::DefIdSet; +use rustc_hir::HirId; use rustc_macros::HashStable; +use std::fmt; +use std::hash::Hash; // Accessibility levels, sorted in ascending order #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, HashStable)] @@ -28,7 +28,7 @@ pub enum AccessLevel { // Accessibility levels for reachable HIR nodes #[derive(Clone)] pub struct AccessLevels { - pub map: FxHashMap + pub map: FxHashMap, } impl AccessLevels { diff --git a/src/librustc/middle/recursion_limit.rs b/src/librustc/middle/recursion_limit.rs index 4063fee04c..b33cde8e2a 100644 --- a/src/librustc/middle/recursion_limit.rs +++ b/src/librustc/middle/recursion_limit.rs @@ -6,8 +6,8 @@ // just peeks and looks for that attribute. use crate::session::Session; +use rustc_span::symbol::{sym, Symbol}; use syntax::ast; -use syntax::symbol::{Symbol, sym}; use rustc_data_structures::sync::Once; diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index aa6f283982..9e9c8bd846 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -1,4 +1,4 @@ -//! This file builds up the `ScopeTree`, which describes +//! This file declares the `ScopeTree` type, which describes //! the parent links in the region hierarchy. //! //! For more information about how MIR-based region-checking works, @@ -6,24 +6,18 @@ //! //! [rustc guide]: https://rust-lang.github.io/rustc-guide/mir/borrowck.html -use crate::hir; -use crate::hir::Node; -use crate::hir::def_id::DefId; -use crate::hir::intravisit::{self, Visitor, NestedVisitorMap}; -use crate::hir::{Block, Arm, Pat, PatKind, Stmt, Expr, Local}; -use crate::ich::{StableHashingContext, NodeIdHashingMode}; -use crate::util::nodemap::{FxHashMap, FxHashSet}; +use crate::ich::{NodeIdHashingMode, StableHashingContext}; use crate::ty::{self, DefIdTree, TyCtxt}; -use crate::ty::query::Providers; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::Node; +use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; -use rustc_index::vec::Idx; use rustc_macros::HashStable; -use syntax::source_map; -use syntax_pos::{Span, DUMMY_SP}; +use rustc_span::{Span, DUMMY_SP}; use std::fmt; -use std::mem; /// Represents a statically-describable scope that can be used to /// bound the lifetime/region for values. @@ -87,8 +81,18 @@ use std::mem; // placate the same deriving in `ty::FreeRegion`, but we may want to // actually attach a more meaningful ordering to scopes than the one // generated via deriving here. -#[derive(Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Copy, - RustcEncodable, RustcDecodable, HashStable)] +#[derive( + Clone, + PartialEq, + PartialOrd, + Eq, + Ord, + Hash, + Copy, + RustcEncodable, + RustcDecodable, + HashStable +)] pub struct Scope { pub id: hir::ItemLocalId, pub data: ScopeData, @@ -111,8 +115,19 @@ impl fmt::Debug for Scope { } } -#[derive(Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Debug, Copy, - RustcEncodable, RustcDecodable, HashStable)] +#[derive( + Clone, + PartialEq, + PartialOrd, + Eq, + Ord, + Hash, + Debug, + Copy, + RustcEncodable, + RustcDecodable, + HashStable +)] pub enum ScopeData { Node, @@ -128,7 +143,7 @@ pub enum ScopeData { Destruction, /// Scope following a `let id = expr;` binding in a block. - Remainder(FirstStatementIndex) + Remainder(FirstStatementIndex), } rustc_index::newtype_index! { @@ -168,13 +183,8 @@ impl Scope { pub fn hir_id(&self, scope_tree: &ScopeTree) -> hir::HirId { match scope_tree.root_body { - Some(hir_id) => { - hir::HirId { - owner: hir_id.owner, - local_id: self.item_local_id() - } - } - None => hir::DUMMY_HIR_ID + Some(hir_id) => hir::HirId { owner: hir_id.owner, local_id: self.item_local_id() }, + None => hir::DUMMY_HIR_ID, } } @@ -205,8 +215,8 @@ impl Scope { return Span::new(stmt_span.lo(), span.hi(), span.ctxt()); } } - } - span + } + span } } @@ -216,12 +226,12 @@ pub type ScopeDepth = u32; #[derive(Default, Debug)] pub struct ScopeTree { /// If not empty, this body is the root of this region hierarchy. - root_body: Option, + pub root_body: Option, /// The parent of the root body owner, if the latter is an /// an associated const or method, as impls/traits can also /// have lifetime parameters free in this body. - root_parent: Option, + pub root_parent: Option, /// Maps from a scope ID to the enclosing scope id; /// this is usually corresponding to the lexical nesting, though @@ -229,7 +239,7 @@ pub struct ScopeTree { /// conditional expression or repeating block. (Note that the /// enclosing scope ID for the block associated with a closure is /// the closure itself.) - parent_map: FxHashMap, + pub parent_map: FxHashMap, /// Maps from a variable or binding ID to the block in which that /// variable is declared. @@ -329,12 +339,12 @@ pub struct ScopeTree { /// The reason is that semantically, until the `box` expression returns, /// the values are still owned by their containing expressions. So /// we'll see that `&x`. - yield_in_scope: FxHashMap, + pub yield_in_scope: FxHashMap, /// The number of visit_expr and visit_pat calls done in the body. /// Used to sanity check visit_expr/visit_pat call count when /// calculating generator interiors. - body_expr_count: FxHashMap, + pub body_expr_count: FxHashMap, } #[derive(Debug, Copy, Clone, RustcEncodable, RustcDecodable, HashStable)] @@ -346,105 +356,6 @@ pub struct YieldData { pub source: hir::YieldSource, } -#[derive(Debug, Copy, Clone)] -pub struct Context { - /// The root of the current region tree. This is typically the id - /// of the innermost fn body. Each fn forms its own disjoint tree - /// in the region hierarchy. These fn bodies are themselves - /// arranged into a tree. See the "Modeling closures" section of - /// the README in `infer::region_constraints` for more - /// details. - root_id: Option, - - /// The scope that contains any new variables declared, plus its depth in - /// the scope tree. - var_parent: Option<(Scope, ScopeDepth)>, - - /// Region parent of expressions, etc., plus its depth in the scope tree. - parent: Option<(Scope, ScopeDepth)>, -} - -struct RegionResolutionVisitor<'tcx> { - tcx: TyCtxt<'tcx>, - - // The number of expressions and patterns visited in the current body. - expr_and_pat_count: usize, - // When this is `true`, we record the `Scopes` we encounter - // when processing a Yield expression. This allows us to fix - // up their indices. - pessimistic_yield: bool, - // Stores scopes when `pessimistic_yield` is `true`. - fixup_scopes: Vec, - // The generated scope tree. - scope_tree: ScopeTree, - - cx: Context, - - /// `terminating_scopes` is a set containing the ids of each - /// statement, or conditional/repeating expression. These scopes - /// are calling "terminating scopes" because, when attempting to - /// find the scope of a temporary, by default we search up the - /// enclosing scopes until we encounter the terminating scope. A - /// conditional/repeating expression is one which is not - /// guaranteed to execute exactly once upon entering the parent - /// scope. This could be because the expression only executes - /// conditionally, such as the expression `b` in `a && b`, or - /// because the expression may execute many times, such as a loop - /// body. The reason that we distinguish such expressions is that, - /// upon exiting the parent scope, we cannot statically know how - /// many times the expression executed, and thus if the expression - /// creates temporaries we cannot know statically how many such - /// temporaries we would have to cleanup. Therefore, we ensure that - /// the temporaries never outlast the conditional/repeating - /// expression, preventing the need for dynamic checks and/or - /// arbitrary amounts of stack space. Terminating scopes end - /// up being contained in a DestructionScope that contains the - /// destructor's execution. - terminating_scopes: FxHashSet, -} - -struct ExprLocatorVisitor { - hir_id: hir::HirId, - result: Option, - expr_and_pat_count: usize, -} - -// This visitor has to have the same `visit_expr` calls as `RegionResolutionVisitor` -// since `expr_count` is compared against the results there. -impl<'tcx> Visitor<'tcx> for ExprLocatorVisitor { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::None - } - - fn visit_pat(&mut self, pat: &'tcx Pat) { - intravisit::walk_pat(self, pat); - - self.expr_and_pat_count += 1; - - if pat.hir_id == self.hir_id { - self.result = Some(self.expr_and_pat_count); - } - } - - fn visit_expr(&mut self, expr: &'tcx Expr) { - debug!("ExprLocatorVisitor - pre-increment {} expr = {:?}", - self.expr_and_pat_count, - expr); - - intravisit::walk_expr(self, expr); - - self.expr_and_pat_count += 1; - - debug!("ExprLocatorVisitor - post-increment {} expr = {:?}", - self.expr_and_pat_count, - expr); - - if expr.hir_id == self.hir_id { - self.result = Some(self.expr_and_pat_count); - } - } -} - impl<'tcx> ScopeTree { pub fn record_scope_parent(&mut self, child: Scope, parent: Option<(Scope, ScopeDepth)>) { debug!("{:?}.parent = {:?}", child, parent); @@ -460,13 +371,19 @@ impl<'tcx> ScopeTree { } } - pub fn each_encl_scope(&self, mut e: E) where E: FnMut(Scope, Scope) { + pub fn each_encl_scope(&self, mut e: E) + where + E: FnMut(Scope, Scope), + { for (&child, &parent) in &self.parent_map { e(child, parent.0) } } - pub fn each_var_scope(&self, mut e: E) where E: FnMut(&hir::ItemLocalId, Scope) { + pub fn each_var_scope(&self, mut e: E) + where + E: FnMut(&hir::ItemLocalId, Scope), + { for (child, &parent) in self.var_map.iter() { e(child, parent) } @@ -479,23 +396,27 @@ impl<'tcx> ScopeTree { /// Records that `sub_closure` is defined within `sup_closure`. These IDs /// should be the ID of the block that is the fn body, which is /// also the root of the region hierarchy for that fn. - fn record_closure_parent(&mut self, - sub_closure: hir::ItemLocalId, - sup_closure: hir::ItemLocalId) { - debug!("record_closure_parent(sub_closure={:?}, sup_closure={:?})", - sub_closure, sup_closure); + pub fn record_closure_parent( + &mut self, + sub_closure: hir::ItemLocalId, + sup_closure: hir::ItemLocalId, + ) { + debug!( + "record_closure_parent(sub_closure={:?}, sup_closure={:?})", + sub_closure, sup_closure + ); assert!(sub_closure != sup_closure); let previous = self.closure_tree.insert(sub_closure, sup_closure); assert!(previous.is_none()); } - fn record_var_scope(&mut self, var: hir::ItemLocalId, lifetime: Scope) { + pub fn record_var_scope(&mut self, var: hir::ItemLocalId, lifetime: Scope) { debug!("record_var_scope(sub={:?}, sup={:?})", var, lifetime); assert!(var != lifetime.item_local_id()); self.var_map.insert(var, lifetime); } - fn record_rvalue_scope(&mut self, var: hir::ItemLocalId, lifetime: Option) { + pub fn record_rvalue_scope(&mut self, var: hir::ItemLocalId, lifetime: Option) { debug!("record_rvalue_scope(sub={:?}, sup={:?})", var, lifetime); if let Some(lifetime) = lifetime { assert!(var != lifetime.item_local_id()); @@ -516,8 +437,10 @@ impl<'tcx> ScopeTree { /// Returns the lifetime of the local variable `var_id` pub fn var_scope(&self, var_id: hir::ItemLocalId) -> Scope { - self.var_map.get(&var_id).cloned().unwrap_or_else(|| - bug!("no enclosing scope for id {:?}", var_id)) + self.var_map + .get(&var_id) + .cloned() + .unwrap_or_else(|| bug!("no enclosing scope for id {:?}", var_id)) } /// Returns the scope when the temp created by `expr_id` will be cleaned up. @@ -537,11 +460,10 @@ impl<'tcx> ScopeTree { while let Some(&(p, _)) = self.parent_map.get(&id) { match p.data { ScopeData::Destruction => { - debug!("temporary_scope({:?}) = {:?} [enclosing]", - expr_id, id); + debug!("temporary_scope({:?}) = {:?} [enclosing]", expr_id, id); return Some(id); } - _ => id = p + _ => id = p, } } @@ -557,26 +479,21 @@ impl<'tcx> ScopeTree { } pub fn scopes_intersect(&self, scope1: Scope, scope2: Scope) -> bool { - self.is_subscope_of(scope1, scope2) || - self.is_subscope_of(scope2, scope1) + self.is_subscope_of(scope1, scope2) || self.is_subscope_of(scope2, scope1) } /// Returns `true` if `subscope` is equal to or is lexically nested inside `superscope`, and /// `false` otherwise. - pub fn is_subscope_of(&self, - subscope: Scope, - superscope: Scope) - -> bool { + pub fn is_subscope_of(&self, subscope: Scope, superscope: Scope) -> bool { let mut s = subscope; debug!("is_subscope_of({:?}, {:?})", subscope, superscope); while superscope != s { match self.opt_encl_scope(s) { None => { - debug!("is_subscope_of({:?}, {:?}, s={:?})=false", - subscope, superscope, s); + debug!("is_subscope_of({:?}, {:?}, s={:?})=false", subscope, superscope, s); return false; } - Some(scope) => s = scope + Some(scope) => s = scope, } } @@ -600,7 +517,9 @@ impl<'tcx> ScopeTree { /// smallest scope which is greater than or equal to both `scope_a` and /// `scope_b`. pub fn nearest_common_ancestor(&self, scope_a: Scope, scope_b: Scope) -> Scope { - if scope_a == scope_b { return scope_a; } + if scope_a == scope_b { + return scope_a; + } let mut a = scope_a; let mut b = scope_b; @@ -648,7 +567,7 @@ impl<'tcx> ScopeTree { while a != b { a = self.parent_map.get(&a).unwrap().0; b = self.parent_map.get(&b).unwrap().0; - }; + } a } @@ -659,25 +578,30 @@ impl<'tcx> ScopeTree { let param_owner = tcx.parent(br.def_id).unwrap(); let param_owner_id = tcx.hir().as_local_hir_id(param_owner).unwrap(); - let scope = tcx.hir().maybe_body_owned_by(param_owner_id).map(|body_id| { - tcx.hir().body(body_id).value.hir_id.local_id - }).unwrap_or_else(|| { - // The lifetime was defined on node that doesn't own a body, - // which in practice can only mean a trait or an impl, that - // is the parent of a method, and that is enforced below. - if Some(param_owner_id) != self.root_parent { - tcx.sess.delay_span_bug( - DUMMY_SP, - &format!("free_scope: {:?} not recognized by the \ + let scope = tcx + .hir() + .maybe_body_owned_by(param_owner_id) + .map(|body_id| tcx.hir().body(body_id).value.hir_id.local_id) + .unwrap_or_else(|| { + // The lifetime was defined on node that doesn't own a body, + // which in practice can only mean a trait or an impl, that + // is the parent of a method, and that is enforced below. + if Some(param_owner_id) != self.root_parent { + tcx.sess.delay_span_bug( + DUMMY_SP, + &format!( + "free_scope: {:?} not recognized by the \ region scope tree for {:?} / {:?}", - param_owner, - self.root_parent.map(|id| tcx.hir().local_def_id(id)), - self.root_body.map(|hir_id| DefId::local(hir_id.owner)))); - } + param_owner, + self.root_parent.map(|id| tcx.hir().local_def_id(id)), + self.root_body.map(|hir_id| DefId::local(hir_id.owner)) + ), + ); + } - // The trait/impl lifetime is in scope for the method's body. - self.root_body.unwrap().local_id - }); + // The trait/impl lifetime is in scope for the method's body. + self.root_body.unwrap().local_id + }); Scope { id: scope, data: ScopeData::CallSite } } @@ -686,10 +610,8 @@ impl<'tcx> ScopeTree { /// returns the outermost `Scope` that the region outlives. pub fn free_scope(&self, tcx: TyCtxt<'tcx>, fr: &ty::FreeRegion) -> Scope { let param_owner = match fr.bound_region { - ty::BoundRegion::BrNamed(def_id, _) => { - tcx.parent(def_id).unwrap() - } - _ => fr.scope + ty::BoundRegion::BrNamed(def_id, _) => tcx.parent(def_id).unwrap(), + _ => fr.scope, }; // Ensure that the named late-bound lifetimes were defined @@ -709,28 +631,6 @@ impl<'tcx> ScopeTree { self.yield_in_scope.get(&scope).cloned() } - /// Checks whether the given scope contains a `yield` and if that yield could execute - /// after `expr`. If so, it returns the span of that `yield`. - /// `scope` must be inside the body. - pub fn yield_in_scope_for_expr(&self, - scope: Scope, - expr_hir_id: hir::HirId, - body: &'tcx hir::Body) -> Option { - self.yield_in_scope(scope).and_then(|YieldData { span, expr_and_pat_count, .. }| { - let mut visitor = ExprLocatorVisitor { - hir_id: expr_hir_id, - result: None, - expr_and_pat_count: 0, - }; - visitor.visit_body(body); - if expr_and_pat_count >= visitor.result.unwrap() { - Some(span) - } else { - None - } - }) - } - /// Gives the number of expressions visited in a body. /// Used to sanity check visit_expr call count when /// calculating generator interiors. @@ -739,757 +639,6 @@ impl<'tcx> ScopeTree { } } -/// Records the lifetime of a local variable as `cx.var_parent` -fn record_var_lifetime( - visitor: &mut RegionResolutionVisitor<'_>, - var_id: hir::ItemLocalId, - _sp: Span, -) { - match visitor.cx.var_parent { - None => { - // this can happen in extern fn declarations like - // - // extern fn isalnum(c: c_int) -> c_int - } - Some((parent_scope, _)) => - visitor.scope_tree.record_var_scope(var_id, parent_scope), - } -} - -fn resolve_block<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, blk: &'tcx hir::Block) { - debug!("resolve_block(blk.hir_id={:?})", blk.hir_id); - - let prev_cx = visitor.cx; - - // We treat the tail expression in the block (if any) somewhat - // differently from the statements. The issue has to do with - // temporary lifetimes. Consider the following: - // - // quux({ - // let inner = ... (&bar()) ...; - // - // (... (&foo()) ...) // (the tail expression) - // }, other_argument()); - // - // Each of the statements within the block is a terminating - // scope, and thus a temporary (e.g., the result of calling - // `bar()` in the initializer expression for `let inner = ...;`) - // will be cleaned up immediately after its corresponding - // statement (i.e., `let inner = ...;`) executes. - // - // On the other hand, temporaries associated with evaluating the - // tail expression for the block are assigned lifetimes so that - // they will be cleaned up as part of the terminating scope - // *surrounding* the block expression. Here, the terminating - // scope for the block expression is the `quux(..)` call; so - // those temporaries will only be cleaned up *after* both - // `other_argument()` has run and also the call to `quux(..)` - // itself has returned. - - visitor.enter_node_scope_with_dtor(blk.hir_id.local_id); - visitor.cx.var_parent = visitor.cx.parent; - - { - // This block should be kept approximately in sync with - // `intravisit::walk_block`. (We manually walk the block, rather - // than call `walk_block`, in order to maintain precise - // index information.) - - for (i, statement) in blk.stmts.iter().enumerate() { - match statement.kind { - hir::StmtKind::Local(..) | - hir::StmtKind::Item(..) => { - // Each declaration introduces a subscope for bindings - // introduced by the declaration; this subscope covers a - // suffix of the block. Each subscope in a block has the - // previous subscope in the block as a parent, except for - // the first such subscope, which has the block itself as a - // parent. - visitor.enter_scope( - Scope { - id: blk.hir_id.local_id, - data: ScopeData::Remainder(FirstStatementIndex::new(i)) - } - ); - visitor.cx.var_parent = visitor.cx.parent; - } - hir::StmtKind::Expr(..) | - hir::StmtKind::Semi(..) => {} - } - visitor.visit_stmt(statement) - } - walk_list!(visitor, visit_expr, &blk.expr); - } - - visitor.cx = prev_cx; -} - -fn resolve_arm<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, arm: &'tcx hir::Arm) { - let prev_cx = visitor.cx; - - visitor.enter_scope( - Scope { - id: arm.hir_id.local_id, - data: ScopeData::Node, - } - ); - visitor.cx.var_parent = visitor.cx.parent; - - visitor.terminating_scopes.insert(arm.body.hir_id.local_id); - - if let Some(hir::Guard::If(ref expr)) = arm.guard { - visitor.terminating_scopes.insert(expr.hir_id.local_id); - } - - intravisit::walk_arm(visitor, arm); - - visitor.cx = prev_cx; -} - -fn resolve_pat<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, pat: &'tcx hir::Pat) { - visitor.record_child_scope(Scope { id: pat.hir_id.local_id, data: ScopeData::Node }); - - // If this is a binding then record the lifetime of that binding. - if let PatKind::Binding(..) = pat.kind { - record_var_lifetime(visitor, pat.hir_id.local_id, pat.span); - } - - debug!("resolve_pat - pre-increment {} pat = {:?}", visitor.expr_and_pat_count, pat); - - intravisit::walk_pat(visitor, pat); - - visitor.expr_and_pat_count += 1; - - debug!("resolve_pat - post-increment {} pat = {:?}", visitor.expr_and_pat_count, pat); -} - -fn resolve_stmt<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, stmt: &'tcx hir::Stmt) { - let stmt_id = stmt.hir_id.local_id; - debug!("resolve_stmt(stmt.id={:?})", stmt_id); - - // Every statement will clean up the temporaries created during - // execution of that statement. Therefore each statement has an - // associated destruction scope that represents the scope of the - // statement plus its destructors, and thus the scope for which - // regions referenced by the destructors need to survive. - visitor.terminating_scopes.insert(stmt_id); - - let prev_parent = visitor.cx.parent; - visitor.enter_node_scope_with_dtor(stmt_id); - - intravisit::walk_stmt(visitor, stmt); - - visitor.cx.parent = prev_parent; -} - -fn resolve_expr<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, expr: &'tcx hir::Expr) { - debug!("resolve_expr - pre-increment {} expr = {:?}", visitor.expr_and_pat_count, expr); - - let prev_cx = visitor.cx; - visitor.enter_node_scope_with_dtor(expr.hir_id.local_id); - - { - let terminating_scopes = &mut visitor.terminating_scopes; - let mut terminating = |id: hir::ItemLocalId| { - terminating_scopes.insert(id); - }; - match expr.kind { - // Conditional or repeating scopes are always terminating - // scopes, meaning that temporaries cannot outlive them. - // This ensures fixed size stacks. - - hir::ExprKind::Binary( - source_map::Spanned { node: hir::BinOpKind::And, .. }, _, ref r) | - hir::ExprKind::Binary( - source_map::Spanned { node: hir::BinOpKind::Or, .. }, _, ref r) => { - // For shortcircuiting operators, mark the RHS as a terminating - // scope since it only executes conditionally. - terminating(r.hir_id.local_id); - } - - hir::ExprKind::Loop(ref body, _, _) => { - terminating(body.hir_id.local_id); - } - - hir::ExprKind::DropTemps(ref expr) => { - // `DropTemps(expr)` does not denote a conditional scope. - // Rather, we want to achieve the same behavior as `{ let _t = expr; _t }`. - terminating(expr.hir_id.local_id); - } - - hir::ExprKind::AssignOp(..) | hir::ExprKind::Index(..) | - hir::ExprKind::Unary(..) | hir::ExprKind::Call(..) | hir::ExprKind::MethodCall(..) => { - // FIXME(https://github.com/rust-lang/rfcs/issues/811) Nested method calls - // - // The lifetimes for a call or method call look as follows: - // - // call.id - // - arg0.id - // - ... - // - argN.id - // - call.callee_id - // - // The idea is that call.callee_id represents *the time when - // the invoked function is actually running* and call.id - // represents *the time to prepare the arguments and make the - // call*. See the section "Borrows in Calls" borrowck/README.md - // for an extended explanation of why this distinction is - // important. - // - // record_superlifetime(new_cx, expr.callee_id); - } - - _ => {} - } - } - - let prev_pessimistic = visitor.pessimistic_yield; - - // Ordinarily, we can rely on the visit order of HIR intravisit - // to correspond to the actual execution order of statements. - // However, there's a weird corner case with compund assignment - // operators (e.g. `a += b`). The evaluation order depends on whether - // or not the operator is overloaded (e.g. whether or not a trait - // like AddAssign is implemented). - - // For primitive types (which, despite having a trait impl, don't actually - // end up calling it), the evluation order is right-to-left. For example, - // the following code snippet: - // - // let y = &mut 0; - // *{println!("LHS!"); y} += {println!("RHS!"); 1}; - // - // will print: - // - // RHS! - // LHS! - // - // However, if the operator is used on a non-primitive type, - // the evaluation order will be left-to-right, since the operator - // actually get desugared to a method call. For example, this - // nearly identical code snippet: - // - // let y = &mut String::new(); - // *{println!("LHS String"); y} += {println!("RHS String"); "hi"}; - // - // will print: - // LHS String - // RHS String - // - // To determine the actual execution order, we need to perform - // trait resolution. Unfortunately, we need to be able to compute - // yield_in_scope before type checking is even done, as it gets - // used by AST borrowcheck. - // - // Fortunately, we don't need to know the actual execution order. - // It suffices to know the 'worst case' order with respect to yields. - // Specifically, we need to know the highest 'expr_and_pat_count' - // that we could assign to the yield expression. To do this, - // we pick the greater of the two values from the left-hand - // and right-hand expressions. This makes us overly conservative - // about what types could possibly live across yield points, - // but we will never fail to detect that a type does actually - // live across a yield point. The latter part is critical - - // we're already overly conservative about what types will live - // across yield points, as the generated MIR will determine - // when things are actually live. However, for typecheck to work - // properly, we can't miss any types. - - - match expr.kind { - // Manually recurse over closures, because they are the only - // case of nested bodies that share the parent environment. - hir::ExprKind::Closure(.., body, _, _) => { - let body = visitor.tcx.hir().body(body); - visitor.visit_body(body); - }, - hir::ExprKind::AssignOp(_, ref left_expr, ref right_expr) => { - debug!("resolve_expr - enabling pessimistic_yield, was previously {}", - prev_pessimistic); - - let start_point = visitor.fixup_scopes.len(); - visitor.pessimistic_yield = true; - - // If the actual execution order turns out to be right-to-left, - // then we're fine. However, if the actual execution order is left-to-right, - // then we'll assign too low a count to any `yield` expressions - // we encounter in 'right_expression' - they should really occur after all of the - // expressions in 'left_expression'. - visitor.visit_expr(&right_expr); - visitor.pessimistic_yield = prev_pessimistic; - - debug!("resolve_expr - restoring pessimistic_yield to {}", prev_pessimistic); - visitor.visit_expr(&left_expr); - debug!("resolve_expr - fixing up counts to {}", visitor.expr_and_pat_count); - - // Remove and process any scopes pushed by the visitor - let target_scopes = visitor.fixup_scopes.drain(start_point..); - - for scope in target_scopes { - let mut yield_data = visitor.scope_tree.yield_in_scope.get_mut(&scope).unwrap(); - let count = yield_data.expr_and_pat_count; - let span = yield_data.span; - - // expr_and_pat_count never decreases. Since we recorded counts in yield_in_scope - // before walking the left-hand side, it should be impossible for the recorded - // count to be greater than the left-hand side count. - if count > visitor.expr_and_pat_count { - bug!("Encountered greater count {} at span {:?} - expected no greater than {}", - count, span, visitor.expr_and_pat_count); - } - let new_count = visitor.expr_and_pat_count; - debug!("resolve_expr - increasing count for scope {:?} from {} to {} at span {:?}", - scope, count, new_count, span); - - yield_data.expr_and_pat_count = new_count; - } - - } - - _ => intravisit::walk_expr(visitor, expr) - } - - visitor.expr_and_pat_count += 1; - - debug!("resolve_expr post-increment {}, expr = {:?}", visitor.expr_and_pat_count, expr); - - if let hir::ExprKind::Yield(_, source) = &expr.kind { - // Mark this expr's scope and all parent scopes as containing `yield`. - let mut scope = Scope { id: expr.hir_id.local_id, data: ScopeData::Node }; - loop { - let data = YieldData { - span: expr.span, - expr_and_pat_count: visitor.expr_and_pat_count, - source: *source, - }; - visitor.scope_tree.yield_in_scope.insert(scope, data); - if visitor.pessimistic_yield { - debug!("resolve_expr in pessimistic_yield - marking scope {:?} for fixup", scope); - visitor.fixup_scopes.push(scope); - } - - // Keep traversing up while we can. - match visitor.scope_tree.parent_map.get(&scope) { - // Don't cross from closure bodies to their parent. - Some(&(superscope, _)) => match superscope.data { - ScopeData::CallSite => break, - _ => scope = superscope - }, - None => break - } - } - } - - visitor.cx = prev_cx; -} - -fn resolve_local<'tcx>( - visitor: &mut RegionResolutionVisitor<'tcx>, - pat: Option<&'tcx hir::Pat>, - init: Option<&'tcx hir::Expr>, -) { - debug!("resolve_local(pat={:?}, init={:?})", pat, init); - - let blk_scope = visitor.cx.var_parent.map(|(p, _)| p); - - // As an exception to the normal rules governing temporary - // lifetimes, initializers in a let have a temporary lifetime - // of the enclosing block. This means that e.g., a program - // like the following is legal: - // - // let ref x = HashMap::new(); - // - // Because the hash map will be freed in the enclosing block. - // - // We express the rules more formally based on 3 grammars (defined - // fully in the helpers below that implement them): - // - // 1. `E&`, which matches expressions like `&` that - // own a pointer into the stack. - // - // 2. `P&`, which matches patterns like `ref x` or `(ref x, ref - // y)` that produce ref bindings into the value they are - // matched against or something (at least partially) owned by - // the value they are matched against. (By partially owned, - // I mean that creating a binding into a ref-counted or managed value - // would still count.) - // - // 3. `ET`, which matches both rvalues like `foo()` as well as places - // based on rvalues like `foo().x[2].y`. - // - // A subexpression `` that appears in a let initializer - // `let pat [: ty] = expr` has an extended temporary lifetime if - // any of the following conditions are met: - // - // A. `pat` matches `P&` and `expr` matches `ET` - // (covers cases where `pat` creates ref bindings into an rvalue - // produced by `expr`) - // B. `ty` is a borrowed pointer and `expr` matches `ET` - // (covers cases where coercion creates a borrow) - // C. `expr` matches `E&` - // (covers cases `expr` borrows an rvalue that is then assigned - // to memory (at least partially) owned by the binding) - // - // Here are some examples hopefully giving an intuition where each - // rule comes into play and why: - // - // Rule A. `let (ref x, ref y) = (foo().x, 44)`. The rvalue `(22, 44)` - // would have an extended lifetime, but not `foo()`. - // - // Rule B. `let x = &foo().x`. The rvalue `foo()` would have extended - // lifetime. - // - // In some cases, multiple rules may apply (though not to the same - // rvalue). For example: - // - // let ref x = [&a(), &b()]; - // - // Here, the expression `[...]` has an extended lifetime due to rule - // A, but the inner rvalues `a()` and `b()` have an extended lifetime - // due to rule C. - - if let Some(expr) = init { - record_rvalue_scope_if_borrow_expr(visitor, &expr, blk_scope); - - if let Some(pat) = pat { - if is_binding_pat(pat) { - record_rvalue_scope(visitor, &expr, blk_scope); - } - } - } - - // Make sure we visit the initializer first, so expr_and_pat_count remains correct - if let Some(expr) = init { - visitor.visit_expr(expr); - } - if let Some(pat) = pat { - visitor.visit_pat(pat); - } - - /// Returns `true` if `pat` match the `P&` non-terminal. - /// - /// P& = ref X - /// | StructName { ..., P&, ... } - /// | VariantName(..., P&, ...) - /// | [ ..., P&, ... ] - /// | ( ..., P&, ... ) - /// | box P& - fn is_binding_pat(pat: &hir::Pat) -> bool { - // Note that the code below looks for *explicit* refs only, that is, it won't - // know about *implicit* refs as introduced in #42640. - // - // This is not a problem. For example, consider - // - // let (ref x, ref y) = (Foo { .. }, Bar { .. }); - // - // Due to the explicit refs on the left hand side, the below code would signal - // that the temporary value on the right hand side should live until the end of - // the enclosing block (as opposed to being dropped after the let is complete). - // - // To create an implicit ref, however, you must have a borrowed value on the RHS - // already, as in this example (which won't compile before #42640): - // - // let Foo { x, .. } = &Foo { x: ..., ... }; - // - // in place of - // - // let Foo { ref x, .. } = Foo { ... }; - // - // In the former case (the implicit ref version), the temporary is created by the - // & expression, and its lifetime would be extended to the end of the block (due - // to a different rule, not the below code). - match pat.kind { - PatKind::Binding(hir::BindingAnnotation::Ref, ..) | - PatKind::Binding(hir::BindingAnnotation::RefMut, ..) => true, - - PatKind::Struct(_, ref field_pats, _) => { - field_pats.iter().any(|fp| is_binding_pat(&fp.pat)) - } - - PatKind::Slice(ref pats1, ref pats2, ref pats3) => { - pats1.iter().any(|p| is_binding_pat(&p)) || - pats2.iter().any(|p| is_binding_pat(&p)) || - pats3.iter().any(|p| is_binding_pat(&p)) - } - - PatKind::TupleStruct(_, ref subpats, _) | - PatKind::Tuple(ref subpats, _) => { - subpats.iter().any(|p| is_binding_pat(&p)) - } - - PatKind::Box(ref subpat) => { - is_binding_pat(&subpat) - } - - _ => false, - } - } - - /// If `expr` matches the `E&` grammar, then records an extended rvalue scope as appropriate: - /// - /// E& = & ET - /// | StructName { ..., f: E&, ... } - /// | [ ..., E&, ... ] - /// | ( ..., E&, ... ) - /// | {...; E&} - /// | box E& - /// | E& as ... - /// | ( E& ) - fn record_rvalue_scope_if_borrow_expr<'tcx>( - visitor: &mut RegionResolutionVisitor<'tcx>, - expr: &hir::Expr, - blk_id: Option, - ) { - match expr.kind { - hir::ExprKind::AddrOf(_, _, ref subexpr) => { - record_rvalue_scope_if_borrow_expr(visitor, &subexpr, blk_id); - record_rvalue_scope(visitor, &subexpr, blk_id); - } - hir::ExprKind::Struct(_, ref fields, _) => { - for field in fields { - record_rvalue_scope_if_borrow_expr( - visitor, &field.expr, blk_id); - } - } - hir::ExprKind::Array(ref subexprs) | - hir::ExprKind::Tup(ref subexprs) => { - for subexpr in subexprs { - record_rvalue_scope_if_borrow_expr( - visitor, &subexpr, blk_id); - } - } - hir::ExprKind::Cast(ref subexpr, _) => { - record_rvalue_scope_if_borrow_expr(visitor, &subexpr, blk_id) - } - hir::ExprKind::Block(ref block, _) => { - if let Some(ref subexpr) = block.expr { - record_rvalue_scope_if_borrow_expr( - visitor, &subexpr, blk_id); - } - } - _ => {} - } - } - - /// Applied to an expression `expr` if `expr` -- or something owned or partially owned by - /// `expr` -- is going to be indirectly referenced by a variable in a let statement. In that - /// case, the "temporary lifetime" or `expr` is extended to be the block enclosing the `let` - /// statement. - /// - /// More formally, if `expr` matches the grammar `ET`, record the rvalue scope of the matching - /// `` as `blk_id`: - /// - /// ET = *ET - /// | ET[...] - /// | ET.f - /// | (ET) - /// | - /// - /// Note: ET is intended to match "rvalues or places based on rvalues". - fn record_rvalue_scope<'tcx>( - visitor: &mut RegionResolutionVisitor<'tcx>, - expr: &hir::Expr, - blk_scope: Option, - ) { - let mut expr = expr; - loop { - // Note: give all the expressions matching `ET` with the - // extended temporary lifetime, not just the innermost rvalue, - // because in codegen if we must compile e.g., `*rvalue()` - // into a temporary, we request the temporary scope of the - // outer expression. - visitor.scope_tree.record_rvalue_scope(expr.hir_id.local_id, blk_scope); - - match expr.kind { - hir::ExprKind::AddrOf(_, _, ref subexpr) | - hir::ExprKind::Unary(hir::UnDeref, ref subexpr) | - hir::ExprKind::Field(ref subexpr, _) | - hir::ExprKind::Index(ref subexpr, _) => { - expr = &subexpr; - } - _ => { - return; - } - } - } - } -} - -impl<'tcx> RegionResolutionVisitor<'tcx> { - /// Records the current parent (if any) as the parent of `child_scope`. - /// Returns the depth of `child_scope`. - fn record_child_scope(&mut self, child_scope: Scope) -> ScopeDepth { - let parent = self.cx.parent; - self.scope_tree.record_scope_parent(child_scope, parent); - // If `child_scope` has no parent, it must be the root node, and so has - // a depth of 1. Otherwise, its depth is one more than its parent's. - parent.map_or(1, |(_p, d)| d + 1) - } - - /// Records the current parent (if any) as the parent of `child_scope`, - /// and sets `child_scope` as the new current parent. - fn enter_scope(&mut self, child_scope: Scope) { - let child_depth = self.record_child_scope(child_scope); - self.cx.parent = Some((child_scope, child_depth)); - } - - fn enter_node_scope_with_dtor(&mut self, id: hir::ItemLocalId) { - // If node was previously marked as a terminating scope during the - // recursive visit of its parent node in the AST, then we need to - // account for the destruction scope representing the scope of - // the destructors that run immediately after it completes. - if self.terminating_scopes.contains(&id) { - self.enter_scope(Scope { id, data: ScopeData::Destruction }); - } - self.enter_scope(Scope { id, data: ScopeData::Node }); - } -} - -impl<'tcx> Visitor<'tcx> for RegionResolutionVisitor<'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::None - } - - fn visit_block(&mut self, b: &'tcx Block) { - resolve_block(self, b); - } - - fn visit_body(&mut self, body: &'tcx hir::Body) { - let body_id = body.id(); - let owner_id = self.tcx.hir().body_owner(body_id); - - debug!("visit_body(id={:?}, span={:?}, body.id={:?}, cx.parent={:?})", - owner_id, - self.tcx.sess.source_map().span_to_string(body.value.span), - body_id, - self.cx.parent); - - let outer_ec = mem::replace(&mut self.expr_and_pat_count, 0); - let outer_cx = self.cx; - let outer_ts = mem::take(&mut self.terminating_scopes); - self.terminating_scopes.insert(body.value.hir_id.local_id); - - if let Some(root_id) = self.cx.root_id { - self.scope_tree.record_closure_parent(body.value.hir_id.local_id, root_id); - } - self.cx.root_id = Some(body.value.hir_id.local_id); - - self.enter_scope(Scope { id: body.value.hir_id.local_id, data: ScopeData::CallSite }); - self.enter_scope(Scope { id: body.value.hir_id.local_id, data: ScopeData::Arguments }); - - // The arguments and `self` are parented to the fn. - self.cx.var_parent = self.cx.parent.take(); - for param in &body.params { - self.visit_pat(¶m.pat); - } - - // The body of the every fn is a root scope. - self.cx.parent = self.cx.var_parent; - if self.tcx.hir().body_owner_kind(owner_id).is_fn_or_closure() { - self.visit_expr(&body.value) - } else { - // Only functions have an outer terminating (drop) scope, while - // temporaries in constant initializers may be 'static, but only - // according to rvalue lifetime semantics, using the same - // syntactical rules used for let initializers. - // - // e.g., in `let x = &f();`, the temporary holding the result from - // the `f()` call lives for the entirety of the surrounding block. - // - // Similarly, `const X: ... = &f();` would have the result of `f()` - // live for `'static`, implying (if Drop restrictions on constants - // ever get lifted) that the value *could* have a destructor, but - // it'd get leaked instead of the destructor running during the - // evaluation of `X` (if at all allowed by CTFE). - // - // However, `const Y: ... = g(&f());`, like `let y = g(&f());`, - // would *not* let the `f()` temporary escape into an outer scope - // (i.e., `'static`), which means that after `g` returns, it drops, - // and all the associated destruction scope rules apply. - self.cx.var_parent = None; - resolve_local(self, None, Some(&body.value)); - } - - if body.generator_kind.is_some() { - self.scope_tree.body_expr_count.insert(body_id, self.expr_and_pat_count); - } - - // Restore context we had at the start. - self.expr_and_pat_count = outer_ec; - self.cx = outer_cx; - self.terminating_scopes = outer_ts; - } - - fn visit_arm(&mut self, a: &'tcx Arm) { - resolve_arm(self, a); - } - fn visit_pat(&mut self, p: &'tcx Pat) { - resolve_pat(self, p); - } - fn visit_stmt(&mut self, s: &'tcx Stmt) { - resolve_stmt(self, s); - } - fn visit_expr(&mut self, ex: &'tcx Expr) { - resolve_expr(self, ex); - } - fn visit_local(&mut self, l: &'tcx Local) { - resolve_local(self, Some(&l.pat), l.init.as_ref().map(|e| &**e)); - } -} - -fn region_scope_tree(tcx: TyCtxt<'_>, def_id: DefId) -> &ScopeTree { - let closure_base_def_id = tcx.closure_base_def_id(def_id); - if closure_base_def_id != def_id { - return tcx.region_scope_tree(closure_base_def_id); - } - - let id = tcx.hir().as_local_hir_id(def_id).unwrap(); - let scope_tree = if let Some(body_id) = tcx.hir().maybe_body_owned_by(id) { - let mut visitor = RegionResolutionVisitor { - tcx, - scope_tree: ScopeTree::default(), - expr_and_pat_count: 0, - cx: Context { - root_id: None, - parent: None, - var_parent: None, - }, - terminating_scopes: Default::default(), - pessimistic_yield: false, - fixup_scopes: vec![], - }; - - let body = tcx.hir().body(body_id); - visitor.scope_tree.root_body = Some(body.value.hir_id); - - // If the item is an associated const or a method, - // record its impl/trait parent, as it can also have - // lifetime parameters free in this body. - match tcx.hir().get(id) { - Node::ImplItem(_) | - Node::TraitItem(_) => { - visitor.scope_tree.root_parent = Some(tcx.hir().get_parent_item(id)); - } - _ => {} - } - - visitor.visit_body(body); - - visitor.scope_tree - } else { - ScopeTree::default() - }; - - tcx.arena.alloc(scope_tree) -} - -pub fn provide(providers: &mut Providers<'_>) { - *providers = Providers { - region_scope_tree, - ..*providers - }; -} - impl<'a> HashStable> for ScopeTree { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { let ScopeTree { diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs index c13c44c413..c21ba1b3bd 100644 --- a/src/librustc/middle/resolve_lifetime.rs +++ b/src/librustc/middle/resolve_lifetime.rs @@ -1,36 +1,12 @@ -//! Name resolution for lifetimes. -//! -//! Name resolution for lifetimes follows *much* simpler rules than the -//! full resolve. For example, lifetime names are never exported or -//! used between functions, and they operate in a purely top-down -//! way. Therefore, we break lifetime name resolution into a separate pass. +//! Name resolution for lifetimes: type declarations. -// ignore-tidy-filelength +use crate::ty; -use crate::hir::def::{Res, DefKind}; -use crate::hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE}; -use crate::hir::map::Map; -use crate::hir::ptr::P; -use crate::hir::{GenericArg, GenericParam, ItemLocalId, LifetimeName, Node, ParamName, QPath}; -use crate::ty::{self, DefIdTree, GenericParamDefKind, TyCtxt}; - -use crate::rustc::lint; -use crate::session::Session; -use crate::util::nodemap::{DefIdMap, FxHashMap, FxHashSet, HirIdMap, HirIdSet}; -use errors::{Applicability, DiagnosticBuilder, pluralize}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_hir::def_id::{DefId, LocalDefId}; +use rustc_hir::{GenericParam, ItemLocalId}; +use rustc_hir::{GenericParamKind, LifetimeParamKind}; use rustc_macros::HashStable; -use std::borrow::Cow; -use std::cell::Cell; -use std::mem::{replace, take}; -use syntax::ast; -use syntax::attr; -use syntax::symbol::{kw, sym}; -use syntax_pos::Span; - -use crate::hir::intravisit::{self, NestedVisitorMap, Visitor}; -use crate::hir::{self, GenericParamKind, LifetimeParamKind}; - -use rustc_error_codes::*; /// The origin of a named lifetime definition. /// @@ -46,7 +22,7 @@ pub enum LifetimeDefOrigin { } impl LifetimeDefOrigin { - fn from_param(param: &GenericParam) -> Self { + pub fn from_param(param: &GenericParam<'_>) -> Self { match param.kind { GenericParamKind::Lifetime { kind } => match kind { LifetimeParamKind::InBand => LifetimeDefOrigin::InBand, @@ -59,109 +35,15 @@ impl LifetimeDefOrigin { } } -// This counts the no of times a lifetime is used -#[derive(Clone, Copy, Debug)] -pub enum LifetimeUseSet<'tcx> { - One(&'tcx hir::Lifetime), - Many, -} - #[derive(Clone, Copy, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Debug, HashStable)] pub enum Region { Static, - EarlyBound( - /* index */ u32, - /* lifetime decl */ DefId, - LifetimeDefOrigin, - ), - LateBound( - ty::DebruijnIndex, - /* lifetime decl */ DefId, - LifetimeDefOrigin, - ), + EarlyBound(/* index */ u32, /* lifetime decl */ DefId, LifetimeDefOrigin), + LateBound(ty::DebruijnIndex, /* lifetime decl */ DefId, LifetimeDefOrigin), LateBoundAnon(ty::DebruijnIndex, /* anon index */ u32), Free(DefId, /* lifetime decl */ DefId), } -impl Region { - fn early(hir_map: &Map<'_>, index: &mut u32, param: &GenericParam) -> (ParamName, Region) { - let i = *index; - *index += 1; - let def_id = hir_map.local_def_id(param.hir_id); - let origin = LifetimeDefOrigin::from_param(param); - debug!("Region::early: index={} def_id={:?}", i, def_id); - (param.name.modern(), Region::EarlyBound(i, def_id, origin)) - } - - fn late(hir_map: &Map<'_>, param: &GenericParam) -> (ParamName, Region) { - let depth = ty::INNERMOST; - let def_id = hir_map.local_def_id(param.hir_id); - let origin = LifetimeDefOrigin::from_param(param); - debug!( - "Region::late: param={:?} depth={:?} def_id={:?} origin={:?}", - param, depth, def_id, origin, - ); - ( - param.name.modern(), - Region::LateBound(depth, def_id, origin), - ) - } - - fn late_anon(index: &Cell) -> Region { - let i = index.get(); - index.set(i + 1); - let depth = ty::INNERMOST; - Region::LateBoundAnon(depth, i) - } - - fn id(&self) -> Option { - match *self { - Region::Static | Region::LateBoundAnon(..) => None, - - Region::EarlyBound(_, id, _) | Region::LateBound(_, id, _) | Region::Free(_, id) => { - Some(id) - } - } - } - - fn shifted(self, amount: u32) -> Region { - match self { - Region::LateBound(debruijn, id, origin) => { - Region::LateBound(debruijn.shifted_in(amount), id, origin) - } - Region::LateBoundAnon(debruijn, index) => { - Region::LateBoundAnon(debruijn.shifted_in(amount), index) - } - _ => self, - } - } - - fn shifted_out_to_binder(self, binder: ty::DebruijnIndex) -> Region { - match self { - Region::LateBound(debruijn, id, origin) => { - Region::LateBound(debruijn.shifted_out_to_binder(binder), id, origin) - } - Region::LateBoundAnon(debruijn, index) => { - Region::LateBoundAnon(debruijn.shifted_out_to_binder(binder), index) - } - _ => self, - } - } - - fn subst<'a, L>(self, mut params: L, map: &NamedRegionMap) -> Option - where - L: Iterator, - { - if let Region::EarlyBound(index, _, _) = self { - params - .nth(index as usize) - .and_then(|lifetime| map.defs.get(&lifetime.hir_id).cloned()) - } else { - Some(self) - } - } -} - /// A set containing, at most, one known element. /// If two distinct values are inserted into a set, then it /// becomes `Many`, which can be used to detect ambiguities. @@ -186,2885 +68,19 @@ pub type ObjectLifetimeDefault = Set1; /// Maps the id of each lifetime reference to the lifetime decl /// that it corresponds to. -/// -/// FIXME. This struct gets converted to a `ResolveLifetimes` for -/// actual use. It has the same data, but indexed by `DefIndex`. This -/// is silly. -#[derive(Default)] -struct NamedRegionMap { - // maps from every use of a named (not anonymous) lifetime to a - // `Region` describing how that region is bound - pub defs: HirIdMap, - - // the set of lifetime def ids that are late-bound; a region can - // be late-bound if (a) it does NOT appear in a where-clause and - // (b) it DOES appear in the arguments. - pub late_bound: HirIdSet, - - // For each type and trait definition, maps type parameters - // to the trait object lifetime defaults computed from them. - pub object_lifetime_defaults: HirIdMap>, -} - -/// See [`NamedRegionMap`]. #[derive(Default, HashStable)] pub struct ResolveLifetimes { - defs: FxHashMap>, - late_bound: FxHashMap>, - object_lifetime_defaults: + /// Maps from every use of a named (not anonymous) lifetime to a + /// `Region` describing how that region is bound + pub defs: FxHashMap>, + + /// Set of lifetime def ids that are late-bound; a region can + /// be late-bound if (a) it does NOT appear in a where-clause and + /// (b) it DOES appear in the arguments. + pub late_bound: FxHashMap>, + + /// For each type and trait definition, maps type parameters + /// to the trait object lifetime defaults computed from them. + pub object_lifetime_defaults: FxHashMap>>, } - -struct LifetimeContext<'a, 'tcx> { - tcx: TyCtxt<'tcx>, - map: &'a mut NamedRegionMap, - scope: ScopeRef<'a>, - - /// This is slightly complicated. Our representation for poly-trait-refs contains a single - /// binder and thus we only allow a single level of quantification. However, - /// the syntax of Rust permits quantification in two places, e.g., `T: for <'a> Foo<'a>` - /// and `for <'a, 'b> &'b T: Foo<'a>`. In order to get the De Bruijn indices - /// correct when representing these constraints, we should only introduce one - /// scope. However, we want to support both locations for the quantifier and - /// during lifetime resolution we want precise information (so we can't - /// desugar in an earlier phase). - /// - /// So, if we encounter a quantifier at the outer scope, we set - /// `trait_ref_hack` to `true` (and introduce a scope), and then if we encounter - /// a quantifier at the inner scope, we error. If `trait_ref_hack` is `false`, - /// then we introduce the scope at the inner quantifier. - trait_ref_hack: bool, - - /// Used to disallow the use of in-band lifetimes in `fn` or `Fn` syntax. - is_in_fn_syntax: bool, - - /// List of labels in the function/method currently under analysis. - labels_in_fn: Vec, - - /// Cache for cross-crate per-definition object lifetime defaults. - xcrate_object_lifetime_defaults: DefIdMap>, - - lifetime_uses: &'a mut DefIdMap>, -} - -#[derive(Debug)] -enum Scope<'a> { - /// Declares lifetimes, and each can be early-bound or late-bound. - /// The `DebruijnIndex` of late-bound lifetimes starts at `1` and - /// it should be shifted by the number of `Binder`s in between the - /// declaration `Binder` and the location it's referenced from. - Binder { - lifetimes: FxHashMap, - - /// if we extend this scope with another scope, what is the next index - /// we should use for an early-bound region? - next_early_index: u32, - - /// Flag is set to true if, in this binder, `'_` would be - /// equivalent to a "single-use region". This is true on - /// impls, but not other kinds of items. - track_lifetime_uses: bool, - - /// Whether or not this binder would serve as the parent - /// binder for opaque types introduced within. For example: - /// - /// fn foo<'a>() -> impl for<'b> Trait> - /// - /// Here, the opaque types we create for the `impl Trait` - /// and `impl Trait2` references will both have the `foo` item - /// as their parent. When we get to `impl Trait2`, we find - /// that it is nested within the `for<>` binder -- this flag - /// allows us to skip that when looking for the parent binder - /// of the resulting opaque type. - opaque_type_parent: bool, - - s: ScopeRef<'a>, - }, - - /// Lifetimes introduced by a fn are scoped to the call-site for that fn, - /// if this is a fn body, otherwise the original definitions are used. - /// Unspecified lifetimes are inferred, unless an elision scope is nested, - /// e.g., `(&T, fn(&T) -> &T);` becomes `(&'_ T, for<'a> fn(&'a T) -> &'a T)`. - Body { - id: hir::BodyId, - s: ScopeRef<'a>, - }, - - /// A scope which either determines unspecified lifetimes or errors - /// on them (e.g., due to ambiguity). For more details, see `Elide`. - Elision { - elide: Elide, - s: ScopeRef<'a>, - }, - - /// Use a specific lifetime (if `Some`) or leave it unset (to be - /// inferred in a function body or potentially error outside one), - /// for the default choice of lifetime in a trait object type. - ObjectLifetimeDefault { - lifetime: Option, - s: ScopeRef<'a>, - }, - - Root, -} - -#[derive(Clone, Debug)] -enum Elide { - /// Use a fresh anonymous late-bound lifetime each time, by - /// incrementing the counter to generate sequential indices. - FreshLateAnon(Cell), - /// Always use this one lifetime. - Exact(Region), - /// Less or more than one lifetime were found, error on unspecified. - Error(Vec), -} - -#[derive(Clone, Debug)] -struct ElisionFailureInfo { - /// Where we can find the argument pattern. - parent: Option, - /// The index of the argument in the original definition. - index: usize, - lifetime_count: usize, - have_bound_regions: bool, -} - -type ScopeRef<'a> = &'a Scope<'a>; - -const ROOT_SCOPE: ScopeRef<'static> = &Scope::Root; - -pub fn provide(providers: &mut ty::query::Providers<'_>) { - *providers = ty::query::Providers { - resolve_lifetimes, - - named_region_map: |tcx, id| { - let id = LocalDefId::from_def_id(DefId::local(id)); // (*) - tcx.resolve_lifetimes(LOCAL_CRATE).defs.get(&id) - }, - - is_late_bound_map: |tcx, id| { - let id = LocalDefId::from_def_id(DefId::local(id)); // (*) - tcx.resolve_lifetimes(LOCAL_CRATE) - .late_bound - .get(&id) - }, - - object_lifetime_defaults_map: |tcx, id| { - let id = LocalDefId::from_def_id(DefId::local(id)); // (*) - tcx.resolve_lifetimes(LOCAL_CRATE) - .object_lifetime_defaults - .get(&id) - }, - - ..*providers - }; - - // (*) FIXME the query should be defined to take a LocalDefId -} - -/// Computes the `ResolveLifetimes` map that contains data for the -/// entire crate. You should not read the result of this query -/// directly, but rather use `named_region_map`, `is_late_bound_map`, -/// etc. -fn resolve_lifetimes(tcx: TyCtxt<'_>, for_krate: CrateNum) -> &ResolveLifetimes { - assert_eq!(for_krate, LOCAL_CRATE); - - let named_region_map = krate(tcx); - - let mut rl = ResolveLifetimes::default(); - - for (hir_id, v) in named_region_map.defs { - let map = rl.defs.entry(hir_id.owner_local_def_id()).or_default(); - map.insert(hir_id.local_id, v); - } - for hir_id in named_region_map.late_bound { - let map = rl.late_bound - .entry(hir_id.owner_local_def_id()) - .or_default(); - map.insert(hir_id.local_id); - } - for (hir_id, v) in named_region_map.object_lifetime_defaults { - let map = rl.object_lifetime_defaults - .entry(hir_id.owner_local_def_id()) - .or_default(); - map.insert(hir_id.local_id, v); - } - - tcx.arena.alloc(rl) -} - -fn krate(tcx: TyCtxt<'_>) -> NamedRegionMap { - let krate = tcx.hir().krate(); - let mut map = NamedRegionMap { - defs: Default::default(), - late_bound: Default::default(), - object_lifetime_defaults: compute_object_lifetime_defaults(tcx), - }; - { - let mut visitor = LifetimeContext { - tcx, - map: &mut map, - scope: ROOT_SCOPE, - trait_ref_hack: false, - is_in_fn_syntax: false, - labels_in_fn: vec![], - xcrate_object_lifetime_defaults: Default::default(), - lifetime_uses: &mut Default::default(), - }; - for (_, item) in &krate.items { - visitor.visit_item(item); - } - } - map -} - -/// In traits, there is an implicit `Self` type parameter which comes before the generics. -/// We have to account for this when computing the index of the other generic parameters. -/// This function returns whether there is such an implicit parameter defined on the given item. -fn sub_items_have_self_param(node: &hir::ItemKind) -> bool { - match *node { - hir::ItemKind::Trait(..) | - hir::ItemKind::TraitAlias(..) => true, - _ => false, - } -} - -impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.tcx.hir()) - } - - // We want to nest trait/impl items in their parent, but nothing else. - fn visit_nested_item(&mut self, _: hir::ItemId) {} - - fn visit_nested_body(&mut self, body: hir::BodyId) { - // Each body has their own set of labels, save labels. - let saved = take(&mut self.labels_in_fn); - let body = self.tcx.hir().body(body); - extract_labels(self, body); - self.with( - Scope::Body { - id: body.id(), - s: self.scope, - }, - |_, this| { - this.visit_body(body); - }, - ); - replace(&mut self.labels_in_fn, saved); - } - - fn visit_item(&mut self, item: &'tcx hir::Item) { - match item.kind { - hir::ItemKind::Fn(ref sig, ref generics, _) => { - self.visit_early_late(None, &sig.decl, generics, |this| { - intravisit::walk_item(this, item); - }); - } - - hir::ItemKind::ExternCrate(_) - | hir::ItemKind::Use(..) - | hir::ItemKind::Mod(..) - | hir::ItemKind::ForeignMod(..) - | hir::ItemKind::GlobalAsm(..) => { - // These sorts of items have no lifetime parameters at all. - intravisit::walk_item(self, item); - } - hir::ItemKind::Static(..) | hir::ItemKind::Const(..) => { - // No lifetime parameters, but implied 'static. - let scope = Scope::Elision { - elide: Elide::Exact(Region::Static), - s: ROOT_SCOPE, - }; - self.with(scope, |_, this| intravisit::walk_item(this, item)); - } - hir::ItemKind::OpaqueTy(hir::OpaqueTy { - impl_trait_fn: Some(_), - .. - }) => { - // Currently opaque type declarations are just generated from `impl Trait` - // items. Doing anything on this node is irrelevant, as we currently don't need - // it. - } - hir::ItemKind::TyAlias(_, ref generics) - | hir::ItemKind::OpaqueTy(hir::OpaqueTy { - impl_trait_fn: None, - ref generics, - .. - }) - | hir::ItemKind::Enum(_, ref generics) - | hir::ItemKind::Struct(_, ref generics) - | hir::ItemKind::Union(_, ref generics) - | hir::ItemKind::Trait(_, _, ref generics, ..) - | hir::ItemKind::TraitAlias(ref generics, ..) - | hir::ItemKind::Impl(_, _, _, ref generics, ..) => { - // Impls permit `'_` to be used and it is equivalent to "some fresh lifetime name". - // This is not true for other kinds of items.x - let track_lifetime_uses = match item.kind { - hir::ItemKind::Impl(..) => true, - _ => false, - }; - // These kinds of items have only early-bound lifetime parameters. - let mut index = if sub_items_have_self_param(&item.kind) { - 1 // Self comes before lifetimes - } else { - 0 - }; - let mut non_lifetime_count = 0; - let lifetimes = generics.params.iter().filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => { - Some(Region::early(&self.tcx.hir(), &mut index, param)) - } - GenericParamKind::Type { .. } | - GenericParamKind::Const { .. } => { - non_lifetime_count += 1; - None - } - }).collect(); - let scope = Scope::Binder { - lifetimes, - next_early_index: index + non_lifetime_count, - opaque_type_parent: true, - track_lifetime_uses, - s: ROOT_SCOPE, - }; - self.with(scope, |old_scope, this| { - this.check_lifetime_params(old_scope, &generics.params); - intravisit::walk_item(this, item); - }); - } - } - } - - fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem) { - match item.kind { - hir::ForeignItemKind::Fn(ref decl, _, ref generics) => { - self.visit_early_late(None, decl, generics, |this| { - intravisit::walk_foreign_item(this, item); - }) - } - hir::ForeignItemKind::Static(..) => { - intravisit::walk_foreign_item(self, item); - } - hir::ForeignItemKind::Type => { - intravisit::walk_foreign_item(self, item); - } - } - } - - fn visit_ty(&mut self, ty: &'tcx hir::Ty) { - debug!("visit_ty: id={:?} ty={:?}", ty.hir_id, ty); - debug!("visit_ty: ty.kind={:?}", ty.kind); - match ty.kind { - hir::TyKind::BareFn(ref c) => { - let next_early_index = self.next_early_index(); - let was_in_fn_syntax = self.is_in_fn_syntax; - self.is_in_fn_syntax = true; - let scope = Scope::Binder { - lifetimes: c.generic_params - .iter() - .filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => { - Some(Region::late(&self.tcx.hir(), param)) - } - _ => None, - }) - .collect(), - s: self.scope, - next_early_index, - track_lifetime_uses: true, - opaque_type_parent: false, - }; - self.with(scope, |old_scope, this| { - // a bare fn has no bounds, so everything - // contained within is scoped within its binder. - this.check_lifetime_params(old_scope, &c.generic_params); - intravisit::walk_ty(this, ty); - }); - self.is_in_fn_syntax = was_in_fn_syntax; - } - hir::TyKind::TraitObject(ref bounds, ref lifetime) => { - debug!("visit_ty: TraitObject(bounds={:?}, lifetime={:?})", bounds, lifetime); - for bound in bounds { - self.visit_poly_trait_ref(bound, hir::TraitBoundModifier::None); - } - match lifetime.name { - LifetimeName::Implicit => { - // For types like `dyn Foo`, we should - // generate a special form of elided. - span_bug!( - ty.span, - "object-lifetime-default expected, not implict", - ); - } - LifetimeName::ImplicitObjectLifetimeDefault => { - // If the user does not write *anything*, we - // use the object lifetime defaulting - // rules. So e.g., `Box` becomes - // `Box`. - self.resolve_object_lifetime_default(lifetime) - } - LifetimeName::Underscore => { - // If the user writes `'_`, we use the *ordinary* elision - // rules. So the `'_` in e.g., `Box` will be - // resolved the same as the `'_` in `&'_ Foo`. - // - // cc #48468 - self.resolve_elided_lifetimes(vec![lifetime]) - } - LifetimeName::Param(_) | LifetimeName::Static => { - // If the user wrote an explicit name, use that. - self.visit_lifetime(lifetime); - } - LifetimeName::Error => {} - } - } - hir::TyKind::Rptr(ref lifetime_ref, ref mt) => { - self.visit_lifetime(lifetime_ref); - let scope = Scope::ObjectLifetimeDefault { - lifetime: self.map.defs.get(&lifetime_ref.hir_id).cloned(), - s: self.scope, - }; - self.with(scope, |_, this| this.visit_ty(&mt.ty)); - } - hir::TyKind::Def(item_id, ref lifetimes) => { - // Resolve the lifetimes in the bounds to the lifetime defs in the generics. - // `fn foo<'a>() -> impl MyTrait<'a> { ... }` desugars to - // `type MyAnonTy<'b> = impl MyTrait<'b>;` - // ^ ^ this gets resolved in the scope of - // the opaque_ty generics - let (generics, bounds) = match self.tcx.hir().expect_item(item_id.id).kind { - // Named opaque `impl Trait` types are reached via `TyKind::Path`. - // This arm is for `impl Trait` in the types of statics, constants and locals. - hir::ItemKind::OpaqueTy(hir::OpaqueTy { - impl_trait_fn: None, - .. - }) => { - intravisit::walk_ty(self, ty); - return; - } - // RPIT (return position impl trait) - hir::ItemKind::OpaqueTy(hir::OpaqueTy { - ref generics, - ref bounds, - .. - }) => (generics, bounds), - ref i => bug!("`impl Trait` pointed to non-opaque type?? {:#?}", i), - }; - - // Resolve the lifetimes that are applied to the opaque type. - // These are resolved in the current scope. - // `fn foo<'a>() -> impl MyTrait<'a> { ... }` desugars to - // `fn foo<'a>() -> MyAnonTy<'a> { ... }` - // ^ ^this gets resolved in the current scope - for lifetime in lifetimes { - if let hir::GenericArg::Lifetime(lifetime) = lifetime { - self.visit_lifetime(lifetime); - - // Check for predicates like `impl for<'a> Trait>` - // and ban them. Type variables instantiated inside binders aren't - // well-supported at the moment, so this doesn't work. - // In the future, this should be fixed and this error should be removed. - let def = self.map.defs.get(&lifetime.hir_id).cloned(); - if let Some(Region::LateBound(_, def_id, _)) = def { - if let Some(hir_id) = self.tcx.hir().as_local_hir_id(def_id) { - // Ensure that the parent of the def is an item, not HRTB - let parent_id = self.tcx.hir().get_parent_node(hir_id); - let parent_impl_id = hir::ImplItemId { hir_id: parent_id }; - let parent_trait_id = hir::TraitItemId { hir_id: parent_id }; - let krate = self.tcx.hir().forest.krate(); - - if !(krate.items.contains_key(&parent_id) - || krate.impl_items.contains_key(&parent_impl_id) - || krate.trait_items.contains_key(&parent_trait_id)) - { - span_err!( - self.tcx.sess, - lifetime.span, - E0657, - "`impl Trait` can only capture lifetimes \ - bound at the fn or impl level" - ); - self.uninsert_lifetime_on_error(lifetime, def.unwrap()); - } - } - } - } - } - - // We want to start our early-bound indices at the end of the parent scope, - // not including any parent `impl Trait`s. - let mut index = self.next_early_index_for_opaque_type(); - debug!("visit_ty: index = {}", index); - - let mut elision = None; - let mut lifetimes = FxHashMap::default(); - let mut non_lifetime_count = 0; - for param in &generics.params { - match param.kind { - GenericParamKind::Lifetime { .. } => { - let (name, reg) = Region::early(&self.tcx.hir(), &mut index, ¶m); - let def_id = if let Region::EarlyBound(_ ,def_id , _) = reg { - def_id - } else { - bug!(); - }; - if let hir::ParamName::Plain(param_name) = name { - if param_name.name == kw::UnderscoreLifetime { - // Pick the elided lifetime "definition" if one exists - // and use it to make an elision scope. - self.lifetime_uses.insert(def_id.clone(), LifetimeUseSet::Many); - elision = Some(reg); - } else { - lifetimes.insert(name, reg); - } - } else { - self.lifetime_uses.insert(def_id.clone(), LifetimeUseSet::Many); - lifetimes.insert(name, reg); - } - } - GenericParamKind::Type { .. } | - GenericParamKind::Const { .. } => { - non_lifetime_count += 1; - } - } - } - let next_early_index = index + non_lifetime_count; - - if let Some(elision_region) = elision { - let scope = Scope::Elision { - elide: Elide::Exact(elision_region), - s: self.scope, - }; - self.with(scope, |_old_scope, this| { - let scope = Scope::Binder { - lifetimes, - next_early_index, - s: this.scope, - track_lifetime_uses: true, - opaque_type_parent: false, - }; - this.with(scope, |_old_scope, this| { - this.visit_generics(generics); - for bound in bounds { - this.visit_param_bound(bound); - } - }); - }); - } else { - let scope = Scope::Binder { - lifetimes, - next_early_index, - s: self.scope, - track_lifetime_uses: true, - opaque_type_parent: false, - }; - self.with(scope, |_old_scope, this| { - this.visit_generics(generics); - for bound in bounds { - this.visit_param_bound(bound); - } - }); - } - } - _ => intravisit::walk_ty(self, ty), - } - } - - fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem) { - use self::hir::TraitItemKind::*; - match trait_item.kind { - Method(ref sig, _) => { - let tcx = self.tcx; - self.visit_early_late( - Some(tcx.hir().get_parent_item(trait_item.hir_id)), - &sig.decl, - &trait_item.generics, - |this| intravisit::walk_trait_item(this, trait_item), - ); - } - Type(ref bounds, ref ty) => { - let generics = &trait_item.generics; - let mut index = self.next_early_index(); - debug!("visit_ty: index = {}", index); - let mut non_lifetime_count = 0; - let lifetimes = generics.params.iter().filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => { - Some(Region::early(&self.tcx.hir(), &mut index, param)) - } - GenericParamKind::Type { .. } | - GenericParamKind::Const { .. } => { - non_lifetime_count += 1; - None - } - }).collect(); - let scope = Scope::Binder { - lifetimes, - next_early_index: index + non_lifetime_count, - s: self.scope, - track_lifetime_uses: true, - opaque_type_parent: true, - }; - self.with(scope, |_old_scope, this| { - this.visit_generics(generics); - for bound in bounds { - this.visit_param_bound(bound); - } - if let Some(ty) = ty { - this.visit_ty(ty); - } - }); - } - Const(_, _) => { - // Only methods and types support generics. - assert!(trait_item.generics.params.is_empty()); - intravisit::walk_trait_item(self, trait_item); - } - } - } - - fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem) { - use self::hir::ImplItemKind::*; - match impl_item.kind { - Method(ref sig, _) => { - let tcx = self.tcx; - self.visit_early_late( - Some(tcx.hir().get_parent_item(impl_item.hir_id)), - &sig.decl, - &impl_item.generics, - |this| intravisit::walk_impl_item(this, impl_item), - ) - } - TyAlias(ref ty) => { - let generics = &impl_item.generics; - let mut index = self.next_early_index(); - let mut non_lifetime_count = 0; - debug!("visit_ty: index = {}", index); - let lifetimes = generics.params.iter().filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => { - Some(Region::early(&self.tcx.hir(), &mut index, param)) - } - GenericParamKind::Const { .. } | - GenericParamKind::Type { .. } => { - non_lifetime_count += 1; - None - } - }).collect(); - let scope = Scope::Binder { - lifetimes, - next_early_index: index + non_lifetime_count, - s: self.scope, - track_lifetime_uses: true, - opaque_type_parent: true, - }; - self.with(scope, |_old_scope, this| { - this.visit_generics(generics); - this.visit_ty(ty); - }); - } - OpaqueTy(ref bounds) => { - let generics = &impl_item.generics; - let mut index = self.next_early_index(); - let mut next_early_index = index; - debug!("visit_ty: index = {}", index); - let lifetimes = generics.params.iter().filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => { - Some(Region::early(&self.tcx.hir(), &mut index, param)) - } - GenericParamKind::Type { .. } => { - next_early_index += 1; - None - } - GenericParamKind::Const { .. } => { - next_early_index += 1; - None - } - }).collect(); - - let scope = Scope::Binder { - lifetimes, - next_early_index, - s: self.scope, - track_lifetime_uses: true, - opaque_type_parent: true, - }; - self.with(scope, |_old_scope, this| { - this.visit_generics(generics); - for bound in bounds { - this.visit_param_bound(bound); - } - }); - } - Const(_, _) => { - // Only methods and types support generics. - assert!(impl_item.generics.params.is_empty()); - intravisit::walk_impl_item(self, impl_item); - } - } - } - - fn visit_lifetime(&mut self, lifetime_ref: &'tcx hir::Lifetime) { - debug!("visit_lifetime(lifetime_ref={:?})", lifetime_ref); - if lifetime_ref.is_elided() { - self.resolve_elided_lifetimes(vec![lifetime_ref]); - return; - } - if lifetime_ref.is_static() { - self.insert_lifetime(lifetime_ref, Region::Static); - return; - } - self.resolve_lifetime_ref(lifetime_ref); - } - - fn visit_path(&mut self, path: &'tcx hir::Path, _: hir::HirId) { - for (i, segment) in path.segments.iter().enumerate() { - let depth = path.segments.len() - i - 1; - if let Some(ref args) = segment.args { - self.visit_segment_args(path.res, depth, args); - } - } - } - - fn visit_fn_decl(&mut self, fd: &'tcx hir::FnDecl) { - let output = match fd.output { - hir::DefaultReturn(_) => None, - hir::Return(ref ty) => Some(&**ty), - }; - self.visit_fn_like_elision(&fd.inputs, output); - } - - fn visit_generics(&mut self, generics: &'tcx hir::Generics) { - check_mixed_explicit_and_in_band_defs(self.tcx, &generics.params); - for param in &generics.params { - match param.kind { - GenericParamKind::Lifetime { .. } => {} - GenericParamKind::Type { ref default, .. } => { - walk_list!(self, visit_param_bound, ¶m.bounds); - if let Some(ref ty) = default { - self.visit_ty(&ty); - } - } - GenericParamKind::Const { ref ty, .. } => { - walk_list!(self, visit_param_bound, ¶m.bounds); - self.visit_ty(&ty); - } - } - } - for predicate in &generics.where_clause.predicates { - match predicate { - &hir::WherePredicate::BoundPredicate(hir::WhereBoundPredicate { - ref bounded_ty, - ref bounds, - ref bound_generic_params, - .. - }) => { - let lifetimes: FxHashMap<_, _> = bound_generic_params - .iter() - .filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => { - Some(Region::late(&self.tcx.hir(), param)) - } - _ => None, - }) - .collect(); - if !lifetimes.is_empty() { - self.trait_ref_hack = true; - let next_early_index = self.next_early_index(); - let scope = Scope::Binder { - lifetimes, - s: self.scope, - next_early_index, - track_lifetime_uses: true, - opaque_type_parent: false, - }; - let result = self.with(scope, |old_scope, this| { - this.check_lifetime_params(old_scope, &bound_generic_params); - this.visit_ty(&bounded_ty); - walk_list!(this, visit_param_bound, bounds); - }); - self.trait_ref_hack = false; - result - } else { - self.visit_ty(&bounded_ty); - walk_list!(self, visit_param_bound, bounds); - } - } - &hir::WherePredicate::RegionPredicate(hir::WhereRegionPredicate { - ref lifetime, - ref bounds, - .. - }) => { - self.visit_lifetime(lifetime); - walk_list!(self, visit_param_bound, bounds); - } - &hir::WherePredicate::EqPredicate(hir::WhereEqPredicate { - ref lhs_ty, - ref rhs_ty, - .. - }) => { - self.visit_ty(lhs_ty); - self.visit_ty(rhs_ty); - } - } - } - } - - fn visit_poly_trait_ref( - &mut self, - trait_ref: &'tcx hir::PolyTraitRef, - _modifier: hir::TraitBoundModifier, - ) { - debug!("visit_poly_trait_ref(trait_ref={:?})", trait_ref); - - if !self.trait_ref_hack || trait_ref.bound_generic_params.iter().any(|param| { - match param.kind { - GenericParamKind::Lifetime { .. } => true, - _ => false, - } - }) { - if self.trait_ref_hack { - span_err!( - self.tcx.sess, - trait_ref.span, - E0316, - "nested quantification of lifetimes" - ); - } - let next_early_index = self.next_early_index(); - let scope = Scope::Binder { - lifetimes: trait_ref - .bound_generic_params - .iter() - .filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => { - Some(Region::late(&self.tcx.hir(), param)) - } - _ => None, - }) - .collect(), - s: self.scope, - next_early_index, - track_lifetime_uses: true, - opaque_type_parent: false, - }; - self.with(scope, |old_scope, this| { - this.check_lifetime_params(old_scope, &trait_ref.bound_generic_params); - walk_list!(this, visit_generic_param, &trait_ref.bound_generic_params); - this.visit_trait_ref(&trait_ref.trait_ref) - }) - } else { - self.visit_trait_ref(&trait_ref.trait_ref) - } - } -} - -#[derive(Copy, Clone, PartialEq)] -enum ShadowKind { - Label, - Lifetime, -} -struct Original { - kind: ShadowKind, - span: Span, -} -struct Shadower { - kind: ShadowKind, - span: Span, -} - -fn original_label(span: Span) -> Original { - Original { - kind: ShadowKind::Label, - span: span, - } -} -fn shadower_label(span: Span) -> Shadower { - Shadower { - kind: ShadowKind::Label, - span: span, - } -} -fn original_lifetime(span: Span) -> Original { - Original { - kind: ShadowKind::Lifetime, - span: span, - } -} -fn shadower_lifetime(param: &hir::GenericParam) -> Shadower { - Shadower { - kind: ShadowKind::Lifetime, - span: param.span, - } -} - -impl ShadowKind { - fn desc(&self) -> &'static str { - match *self { - ShadowKind::Label => "label", - ShadowKind::Lifetime => "lifetime", - } - } -} - -fn check_mixed_explicit_and_in_band_defs(tcx: TyCtxt<'_>, params: &P<[hir::GenericParam]>) { - let lifetime_params: Vec<_> = params - .iter() - .filter_map(|param| match param.kind { - GenericParamKind::Lifetime { kind, .. } => Some((kind, param.span)), - _ => None, - }) - .collect(); - let explicit = lifetime_params - .iter() - .find(|(kind, _)| *kind == LifetimeParamKind::Explicit); - let in_band = lifetime_params - .iter() - .find(|(kind, _)| *kind == LifetimeParamKind::InBand); - - if let (Some((_, explicit_span)), Some((_, in_band_span))) = (explicit, in_band) { - struct_span_err!( - tcx.sess, - *in_band_span, - E0688, - "cannot mix in-band and explicit lifetime definitions" - ).span_label(*in_band_span, "in-band lifetime definition here") - .span_label(*explicit_span, "explicit lifetime definition here") - .emit(); - } -} - -fn signal_shadowing_problem(tcx: TyCtxt<'_>, name: ast::Name, orig: Original, shadower: Shadower) { - let mut err = if let (ShadowKind::Lifetime, ShadowKind::Lifetime) = (orig.kind, shadower.kind) { - // lifetime/lifetime shadowing is an error - struct_span_err!( - tcx.sess, - shadower.span, - E0496, - "{} name `{}` shadows a \ - {} name that is already in scope", - shadower.kind.desc(), - name, - orig.kind.desc() - ) - } else { - // shadowing involving a label is only a warning, due to issues with - // labels and lifetimes not being macro-hygienic. - tcx.sess.struct_span_warn( - shadower.span, - &format!( - "{} name `{}` shadows a \ - {} name that is already in scope", - shadower.kind.desc(), - name, - orig.kind.desc() - ), - ) - }; - err.span_label(orig.span, "first declared here"); - err.span_label(shadower.span, format!("lifetime {} already in scope", name)); - err.emit(); -} - -// Adds all labels in `b` to `ctxt.labels_in_fn`, signalling a warning -// if one of the label shadows a lifetime or another label. -fn extract_labels(ctxt: &mut LifetimeContext<'_, '_>, body: &hir::Body) { - struct GatherLabels<'a, 'tcx> { - tcx: TyCtxt<'tcx>, - scope: ScopeRef<'a>, - labels_in_fn: &'a mut Vec, - } - - let mut gather = GatherLabels { - tcx: ctxt.tcx, - scope: ctxt.scope, - labels_in_fn: &mut ctxt.labels_in_fn, - }; - gather.visit_body(body); - - impl<'v, 'a, 'tcx> Visitor<'v> for GatherLabels<'a, 'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'v> { - NestedVisitorMap::None - } - - fn visit_expr(&mut self, ex: &hir::Expr) { - if let Some(label) = expression_label(ex) { - for prior_label in &self.labels_in_fn[..] { - // FIXME (#24278): non-hygienic comparison - if label.name == prior_label.name { - signal_shadowing_problem( - self.tcx, - label.name, - original_label(prior_label.span), - shadower_label(label.span), - ); - } - } - - check_if_label_shadows_lifetime(self.tcx, self.scope, label); - - self.labels_in_fn.push(label); - } - intravisit::walk_expr(self, ex) - } - } - - fn expression_label(ex: &hir::Expr) -> Option { - if let hir::ExprKind::Loop(_, Some(label), _) = ex.kind { - Some(label.ident) - } else { - None - } - } - - fn check_if_label_shadows_lifetime( - tcx: TyCtxt<'_>, - mut scope: ScopeRef<'_>, - label: ast::Ident, - ) { - loop { - match *scope { - Scope::Body { s, .. } - | Scope::Elision { s, .. } - | Scope::ObjectLifetimeDefault { s, .. } => { - scope = s; - } - - Scope::Root => { - return; - } - - Scope::Binder { - ref lifetimes, s, .. - } => { - // FIXME (#24278): non-hygienic comparison - if let Some(def) = lifetimes.get(&hir::ParamName::Plain(label.modern())) { - let hir_id = tcx.hir().as_local_hir_id(def.id().unwrap()).unwrap(); - - signal_shadowing_problem( - tcx, - label.name, - original_lifetime(tcx.hir().span(hir_id)), - shadower_label(label.span), - ); - return; - } - scope = s; - } - } - } - } -} - -fn compute_object_lifetime_defaults(tcx: TyCtxt<'_>) -> HirIdMap> { - let mut map = HirIdMap::default(); - for item in tcx.hir().krate().items.values() { - match item.kind { - hir::ItemKind::Struct(_, ref generics) - | hir::ItemKind::Union(_, ref generics) - | hir::ItemKind::Enum(_, ref generics) - | hir::ItemKind::OpaqueTy(hir::OpaqueTy { - ref generics, - impl_trait_fn: None, - .. - }) - | hir::ItemKind::TyAlias(_, ref generics) - | hir::ItemKind::Trait(_, _, ref generics, ..) => { - let result = object_lifetime_defaults_for_item(tcx, generics); - - // Debugging aid. - if attr::contains_name(&item.attrs, sym::rustc_object_lifetime_default) { - let object_lifetime_default_reprs: String = result - .iter() - .map(|set| match *set { - Set1::Empty => "BaseDefault".into(), - Set1::One(Region::Static) => "'static".into(), - Set1::One(Region::EarlyBound(mut i, _, _)) => generics - .params - .iter() - .find_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => { - if i == 0 { - return Some(param.name.ident().to_string().into()); - } - i -= 1; - None - } - _ => None, - }) - .unwrap(), - Set1::One(_) => bug!(), - Set1::Many => "Ambiguous".into(), - }) - .collect::>>() - .join(","); - tcx.sess.span_err(item.span, &object_lifetime_default_reprs); - } - - map.insert(item.hir_id, result); - } - _ => {} - } - } - map -} - -/// Scan the bounds and where-clauses on parameters to extract bounds -/// of the form `T:'a` so as to determine the `ObjectLifetimeDefault` -/// for each type parameter. -fn object_lifetime_defaults_for_item( - tcx: TyCtxt<'_>, - generics: &hir::Generics, -) -> Vec { - fn add_bounds(set: &mut Set1, bounds: &[hir::GenericBound]) { - for bound in bounds { - if let hir::GenericBound::Outlives(ref lifetime) = *bound { - set.insert(lifetime.name.modern()); - } - } - } - - generics - .params - .iter() - .filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => None, - GenericParamKind::Type { .. } => { - let mut set = Set1::Empty; - - add_bounds(&mut set, ¶m.bounds); - - let param_def_id = tcx.hir().local_def_id(param.hir_id); - for predicate in &generics.where_clause.predicates { - // Look for `type: ...` where clauses. - let data = match *predicate { - hir::WherePredicate::BoundPredicate(ref data) => data, - _ => continue, - }; - - // Ignore `for<'a> type: ...` as they can change what - // lifetimes mean (although we could "just" handle it). - if !data.bound_generic_params.is_empty() { - continue; - } - - let res = match data.bounded_ty.kind { - hir::TyKind::Path(hir::QPath::Resolved(None, ref path)) => path.res, - _ => continue, - }; - - if res == Res::Def(DefKind::TyParam, param_def_id) { - add_bounds(&mut set, &data.bounds); - } - } - - Some(match set { - Set1::Empty => Set1::Empty, - Set1::One(name) => { - if name == hir::LifetimeName::Static { - Set1::One(Region::Static) - } else { - generics - .params - .iter() - .filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => Some(( - param.hir_id, - hir::LifetimeName::Param(param.name), - LifetimeDefOrigin::from_param(param), - )), - _ => None, - }) - .enumerate() - .find(|&(_, (_, lt_name, _))| lt_name == name) - .map_or(Set1::Many, |(i, (id, _, origin))| { - let def_id = tcx.hir().local_def_id(id); - Set1::One(Region::EarlyBound(i as u32, def_id, origin)) - }) - } - } - Set1::Many => Set1::Many, - }) - } - GenericParamKind::Const { .. } => { - // Generic consts don't impose any constraints. - None - } - }) - .collect() -} - -impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { - // FIXME(#37666) this works around a limitation in the region inferencer - fn hack(&mut self, f: F) - where - F: for<'b> FnOnce(&mut LifetimeContext<'b, 'tcx>), - { - f(self) - } - - fn with(&mut self, wrap_scope: Scope<'_>, f: F) - where - F: for<'b> FnOnce(ScopeRef<'_>, &mut LifetimeContext<'b, 'tcx>), - { - let LifetimeContext { - tcx, - map, - lifetime_uses, - .. - } = self; - let labels_in_fn = take(&mut self.labels_in_fn); - let xcrate_object_lifetime_defaults = take(&mut self.xcrate_object_lifetime_defaults); - let mut this = LifetimeContext { - tcx: *tcx, - map: map, - scope: &wrap_scope, - trait_ref_hack: self.trait_ref_hack, - is_in_fn_syntax: self.is_in_fn_syntax, - labels_in_fn, - xcrate_object_lifetime_defaults, - lifetime_uses: lifetime_uses, - }; - debug!("entering scope {:?}", this.scope); - f(self.scope, &mut this); - this.check_uses_for_lifetimes_defined_by_scope(); - debug!("exiting scope {:?}", this.scope); - self.labels_in_fn = this.labels_in_fn; - self.xcrate_object_lifetime_defaults = this.xcrate_object_lifetime_defaults; - } - - /// helper method to determine the span to remove when suggesting the - /// deletion of a lifetime - fn lifetime_deletion_span(&self, name: ast::Ident, generics: &hir::Generics) -> Option { - generics.params.iter().enumerate().find_map(|(i, param)| { - if param.name.ident() == name { - let mut in_band = false; - if let hir::GenericParamKind::Lifetime { kind } = param.kind { - if let hir::LifetimeParamKind::InBand = kind { - in_band = true; - } - } - if in_band { - Some(param.span) - } else { - if generics.params.len() == 1 { - // if sole lifetime, remove the entire `<>` brackets - Some(generics.span) - } else { - // if removing within `<>` brackets, we also want to - // delete a leading or trailing comma as appropriate - if i >= generics.params.len() - 1 { - Some(generics.params[i - 1].span.shrink_to_hi().to(param.span)) - } else { - Some(param.span.to(generics.params[i + 1].span.shrink_to_lo())) - } - } - } - } else { - None - } - }) - } - - // helper method to issue suggestions from `fn rah<'a>(&'a T)` to `fn rah(&T)` - // or from `fn rah<'a>(T<'a>)` to `fn rah(T<'_>)` - fn suggest_eliding_single_use_lifetime( - &self, err: &mut DiagnosticBuilder<'_>, def_id: DefId, lifetime: &hir::Lifetime - ) { - let name = lifetime.name.ident(); - let mut remove_decl = None; - if let Some(parent_def_id) = self.tcx.parent(def_id) { - if let Some(generics) = self.tcx.hir().get_generics(parent_def_id) { - remove_decl = self.lifetime_deletion_span(name, generics); - } - } - - let mut remove_use = None; - let mut elide_use = None; - let mut find_arg_use_span = |inputs: &hir::HirVec| { - for input in inputs { - match input.kind { - hir::TyKind::Rptr(lt, _) => { - if lt.name.ident() == name { - // include the trailing whitespace between the lifetime and type names - let lt_through_ty_span = lifetime.span.to(input.span.shrink_to_hi()); - remove_use = Some( - self.tcx.sess.source_map() - .span_until_non_whitespace(lt_through_ty_span) - ); - break; - } - } - hir::TyKind::Path(ref qpath) => { - if let QPath::Resolved(_, path) = qpath { - - let last_segment = &path.segments[path.segments.len()-1]; - let generics = last_segment.generic_args(); - for arg in generics.args.iter() { - if let GenericArg::Lifetime(lt) = arg { - if lt.name.ident() == name { - elide_use = Some(lt.span); - break; - } - } - } - break; - } - }, - _ => {} - } - } - }; - if let Node::Lifetime(hir_lifetime) = self.tcx.hir().get(lifetime.hir_id) { - if let Some(parent) = self.tcx.hir().find( - self.tcx.hir().get_parent_item(hir_lifetime.hir_id)) - { - match parent { - Node::Item(item) => { - if let hir::ItemKind::Fn(sig, _, _) = &item.kind { - find_arg_use_span(&sig.decl.inputs); - } - }, - Node::ImplItem(impl_item) => { - if let hir::ImplItemKind::Method(sig, _) = &impl_item.kind { - find_arg_use_span(&sig.decl.inputs); - } - } - _ => {} - } - } - } - - let msg = "elide the single-use lifetime"; - match (remove_decl, remove_use, elide_use) { - (Some(decl_span), Some(use_span), None) => { - // if both declaration and use deletion spans start at the same - // place ("start at" because the latter includes trailing - // whitespace), then this is an in-band lifetime - if decl_span.shrink_to_lo() == use_span.shrink_to_lo() { - err.span_suggestion( - use_span, - msg, - String::new(), - Applicability::MachineApplicable, - ); - } else { - err.multipart_suggestion( - msg, - vec![(decl_span, String::new()), (use_span, String::new())], - Applicability::MachineApplicable, - ); - } - } - (Some(decl_span), None, Some(use_span)) => { - err.multipart_suggestion( - msg, - vec![(decl_span, String::new()), (use_span, "'_".to_owned())], - Applicability::MachineApplicable, - ); - } - _ => {} - } - } - - fn check_uses_for_lifetimes_defined_by_scope(&mut self) { - let defined_by = match self.scope { - Scope::Binder { lifetimes, .. } => lifetimes, - _ => { - debug!("check_uses_for_lifetimes_defined_by_scope: not in a binder scope"); - return; - } - }; - - let mut def_ids: Vec<_> = defined_by - .values() - .flat_map(|region| match region { - Region::EarlyBound(_, def_id, _) - | Region::LateBound(_, def_id, _) - | Region::Free(_, def_id) => Some(*def_id), - - Region::LateBoundAnon(..) | Region::Static => None, - }) - .collect(); - - // ensure that we issue lints in a repeatable order - def_ids.sort_by_cached_key(|&def_id| self.tcx.def_path_hash(def_id)); - - for def_id in def_ids { - debug!( - "check_uses_for_lifetimes_defined_by_scope: def_id = {:?}", - def_id - ); - - let lifetimeuseset = self.lifetime_uses.remove(&def_id); - - debug!( - "check_uses_for_lifetimes_defined_by_scope: lifetimeuseset = {:?}", - lifetimeuseset - ); - - match lifetimeuseset { - Some(LifetimeUseSet::One(lifetime)) => { - let hir_id = self.tcx.hir().as_local_hir_id(def_id).unwrap(); - debug!("hir id first={:?}", hir_id); - if let Some((id, span, name)) = match self.tcx.hir().get(hir_id) { - Node::Lifetime(hir_lifetime) => Some(( - hir_lifetime.hir_id, - hir_lifetime.span, - hir_lifetime.name.ident(), - )), - Node::GenericParam(param) => { - Some((param.hir_id, param.span, param.name.ident())) - } - _ => None, - } { - debug!("id = {:?} span = {:?} name = {:?}", id, span, name); - if name.name == kw::UnderscoreLifetime { - continue; - } - - if let Some(parent_def_id) = self.tcx.parent(def_id) { - if let Some(parent_hir_id) = self.tcx.hir() - .as_local_hir_id(parent_def_id) { - // lifetimes in `derive` expansions don't count (Issue #53738) - if self.tcx.hir().attrs(parent_hir_id).iter() - .any(|attr| attr.check_name(sym::automatically_derived)) { - continue; - } - } - } - - let mut err = self.tcx.struct_span_lint_hir( - lint::builtin::SINGLE_USE_LIFETIMES, - id, - span, - &format!("lifetime parameter `{}` only used once", name), - ); - - if span == lifetime.span { - // spans are the same for in-band lifetime declarations - err.span_label(span, "this lifetime is only used here"); - } else { - err.span_label(span, "this lifetime..."); - err.span_label(lifetime.span, "...is used only here"); - } - self.suggest_eliding_single_use_lifetime(&mut err, def_id, lifetime); - err.emit(); - } - } - Some(LifetimeUseSet::Many) => { - debug!("not one use lifetime"); - } - None => { - let hir_id = self.tcx.hir().as_local_hir_id(def_id).unwrap(); - if let Some((id, span, name)) = match self.tcx.hir().get(hir_id) { - Node::Lifetime(hir_lifetime) => Some(( - hir_lifetime.hir_id, - hir_lifetime.span, - hir_lifetime.name.ident(), - )), - Node::GenericParam(param) => { - Some((param.hir_id, param.span, param.name.ident())) - } - _ => None, - } { - debug!("id ={:?} span = {:?} name = {:?}", id, span, name); - let mut err = self.tcx.struct_span_lint_hir( - lint::builtin::UNUSED_LIFETIMES, - id, - span, - &format!("lifetime parameter `{}` never used", name), - ); - if let Some(parent_def_id) = self.tcx.parent(def_id) { - if let Some(generics) = self.tcx.hir().get_generics(parent_def_id) { - let unused_lt_span = self.lifetime_deletion_span(name, generics); - if let Some(span) = unused_lt_span { - err.span_suggestion( - span, - "elide the unused lifetime", - String::new(), - Applicability::MachineApplicable, - ); - } - } - } - err.emit(); - } - } - } - } - } - - /// Visits self by adding a scope and handling recursive walk over the contents with `walk`. - /// - /// Handles visiting fns and methods. These are a bit complicated because we must distinguish - /// early- vs late-bound lifetime parameters. We do this by checking which lifetimes appear - /// within type bounds; those are early bound lifetimes, and the rest are late bound. - /// - /// For example: - /// - /// fn foo<'a,'b,'c,T:Trait<'b>>(...) - /// - /// Here `'a` and `'c` are late bound but `'b` is early bound. Note that early- and late-bound - /// lifetimes may be interspersed together. - /// - /// If early bound lifetimes are present, we separate them into their own list (and likewise - /// for late bound). They will be numbered sequentially, starting from the lowest index that is - /// already in scope (for a fn item, that will be 0, but for a method it might not be). Late - /// bound lifetimes are resolved by name and associated with a binder ID (`binder_id`), so the - /// ordering is not important there. - fn visit_early_late( - &mut self, - parent_id: Option, - decl: &'tcx hir::FnDecl, - generics: &'tcx hir::Generics, - walk: F, - ) where - F: for<'b, 'c> FnOnce(&'b mut LifetimeContext<'c, 'tcx>), - { - insert_late_bound_lifetimes(self.map, decl, generics); - - // Find the start of nested early scopes, e.g., in methods. - let mut index = 0; - if let Some(parent_id) = parent_id { - let parent = self.tcx.hir().expect_item(parent_id); - if sub_items_have_self_param(&parent.kind) { - index += 1; // Self comes before lifetimes - } - match parent.kind { - hir::ItemKind::Trait(_, _, ref generics, ..) - | hir::ItemKind::Impl(_, _, _, ref generics, ..) => { - index += generics.params.len() as u32; - } - _ => {} - } - } - - let mut non_lifetime_count = 0; - let lifetimes = generics.params.iter().filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => { - if self.map.late_bound.contains(¶m.hir_id) { - Some(Region::late(&self.tcx.hir(), param)) - } else { - Some(Region::early(&self.tcx.hir(), &mut index, param)) - } - } - GenericParamKind::Type { .. } | - GenericParamKind::Const { .. } => { - non_lifetime_count += 1; - None - } - }).collect(); - let next_early_index = index + non_lifetime_count; - - let scope = Scope::Binder { - lifetimes, - next_early_index, - s: self.scope, - opaque_type_parent: true, - track_lifetime_uses: false, - }; - self.with(scope, move |old_scope, this| { - this.check_lifetime_params(old_scope, &generics.params); - this.hack(walk); // FIXME(#37666) workaround in place of `walk(this)` - }); - } - - fn next_early_index_helper(&self, only_opaque_type_parent: bool) -> u32 { - let mut scope = self.scope; - loop { - match *scope { - Scope::Root => return 0, - - Scope::Binder { - next_early_index, - opaque_type_parent, - .. - } if (!only_opaque_type_parent || opaque_type_parent) => - { - return next_early_index - } - - Scope::Binder { s, .. } - | Scope::Body { s, .. } - | Scope::Elision { s, .. } - | Scope::ObjectLifetimeDefault { s, .. } => scope = s, - } - } - } - - /// Returns the next index one would use for an early-bound-region - /// if extending the current scope. - fn next_early_index(&self) -> u32 { - self.next_early_index_helper(true) - } - - /// Returns the next index one would use for an `impl Trait` that - /// is being converted into an opaque type alias `impl Trait`. This will be the - /// next early index from the enclosing item, for the most - /// part. See the `opaque_type_parent` field for more info. - fn next_early_index_for_opaque_type(&self) -> u32 { - self.next_early_index_helper(false) - } - - fn resolve_lifetime_ref(&mut self, lifetime_ref: &'tcx hir::Lifetime) { - debug!("resolve_lifetime_ref(lifetime_ref={:?})", lifetime_ref); - - // If we've already reported an error, just ignore `lifetime_ref`. - if let LifetimeName::Error = lifetime_ref.name { - return; - } - - // Walk up the scope chain, tracking the number of fn scopes - // that we pass through, until we find a lifetime with the - // given name or we run out of scopes. - // search. - let mut late_depth = 0; - let mut scope = self.scope; - let mut outermost_body = None; - let result = loop { - match *scope { - Scope::Body { id, s } => { - outermost_body = Some(id); - scope = s; - } - - Scope::Root => { - break None; - } - - Scope::Binder { - ref lifetimes, s, .. - } => { - match lifetime_ref.name { - LifetimeName::Param(param_name) => { - if let Some(&def) = lifetimes.get(¶m_name.modern()) { - break Some(def.shifted(late_depth)); - } - } - _ => bug!("expected LifetimeName::Param"), - } - - late_depth += 1; - scope = s; - } - - Scope::Elision { s, .. } | Scope::ObjectLifetimeDefault { s, .. } => { - scope = s; - } - } - }; - - if let Some(mut def) = result { - if let Region::EarlyBound(..) = def { - // Do not free early-bound regions, only late-bound ones. - } else if let Some(body_id) = outermost_body { - let fn_id = self.tcx.hir().body_owner(body_id); - match self.tcx.hir().get(fn_id) { - Node::Item(&hir::Item { - kind: hir::ItemKind::Fn(..), - .. - }) - | Node::TraitItem(&hir::TraitItem { - kind: hir::TraitItemKind::Method(..), - .. - }) - | Node::ImplItem(&hir::ImplItem { - kind: hir::ImplItemKind::Method(..), - .. - }) => { - let scope = self.tcx.hir().local_def_id(fn_id); - def = Region::Free(scope, def.id().unwrap()); - } - _ => {} - } - } - - // Check for fn-syntax conflicts with in-band lifetime definitions - if self.is_in_fn_syntax { - match def { - Region::EarlyBound(_, _, LifetimeDefOrigin::InBand) - | Region::LateBound(_, _, LifetimeDefOrigin::InBand) => { - struct_span_err!( - self.tcx.sess, - lifetime_ref.span, - E0687, - "lifetimes used in `fn` or `Fn` syntax must be \ - explicitly declared using `<...>` binders" - ).span_label(lifetime_ref.span, "in-band lifetime definition") - .emit(); - } - - Region::Static - | Region::EarlyBound(_, _, LifetimeDefOrigin::ExplicitOrElided) - | Region::LateBound(_, _, LifetimeDefOrigin::ExplicitOrElided) - | Region::EarlyBound(_, _, LifetimeDefOrigin::Error) - | Region::LateBound(_, _, LifetimeDefOrigin::Error) - | Region::LateBoundAnon(..) - | Region::Free(..) => {} - } - } - - self.insert_lifetime(lifetime_ref, def); - } else { - struct_span_err!( - self.tcx.sess, - lifetime_ref.span, - E0261, - "use of undeclared lifetime name `{}`", - lifetime_ref - ).span_label(lifetime_ref.span, "undeclared lifetime") - .emit(); - } - } - - fn visit_segment_args(&mut self, res: Res, depth: usize, generic_args: &'tcx hir::GenericArgs) { - debug!( - "visit_segment_args(res={:?}, depth={:?}, generic_args={:?})", - res, - depth, - generic_args, - ); - - if generic_args.parenthesized { - let was_in_fn_syntax = self.is_in_fn_syntax; - self.is_in_fn_syntax = true; - self.visit_fn_like_elision(generic_args.inputs(), Some(generic_args.bindings[0].ty())); - self.is_in_fn_syntax = was_in_fn_syntax; - return; - } - - let mut elide_lifetimes = true; - let lifetimes = generic_args - .args - .iter() - .filter_map(|arg| match arg { - hir::GenericArg::Lifetime(lt) => { - if !lt.is_elided() { - elide_lifetimes = false; - } - Some(lt) - } - _ => None, - }) - .collect(); - if elide_lifetimes { - self.resolve_elided_lifetimes(lifetimes); - } else { - lifetimes.iter().for_each(|lt| self.visit_lifetime(lt)); - } - - // Figure out if this is a type/trait segment, - // which requires object lifetime defaults. - let parent_def_id = |this: &mut Self, def_id: DefId| { - let def_key = this.tcx.def_key(def_id); - DefId { - krate: def_id.krate, - index: def_key.parent.expect("missing parent"), - } - }; - let type_def_id = match res { - Res::Def(DefKind::AssocTy, def_id) - if depth == 1 => Some(parent_def_id(self, def_id)), - Res::Def(DefKind::Variant, def_id) - if depth == 0 => Some(parent_def_id(self, def_id)), - Res::Def(DefKind::Struct, def_id) - | Res::Def(DefKind::Union, def_id) - | Res::Def(DefKind::Enum, def_id) - | Res::Def(DefKind::TyAlias, def_id) - | Res::Def(DefKind::Trait, def_id) if depth == 0 => - { - Some(def_id) - } - _ => None, - }; - - debug!("visit_segment_args: type_def_id={:?}", type_def_id); - - // Compute a vector of defaults, one for each type parameter, - // per the rules given in RFCs 599 and 1156. Example: - // - // ```rust - // struct Foo<'a, T: 'a, U> { } - // ``` - // - // If you have `Foo<'x, dyn Bar, dyn Baz>`, we want to default - // `dyn Bar` to `dyn Bar + 'x` (because of the `T: 'a` bound) - // and `dyn Baz` to `dyn Baz + 'static` (because there is no - // such bound). - // - // Therefore, we would compute `object_lifetime_defaults` to a - // vector like `['x, 'static]`. Note that the vector only - // includes type parameters. - let object_lifetime_defaults = type_def_id.map_or(vec![], |def_id| { - let in_body = { - let mut scope = self.scope; - loop { - match *scope { - Scope::Root => break false, - - Scope::Body { .. } => break true, - - Scope::Binder { s, .. } - | Scope::Elision { s, .. } - | Scope::ObjectLifetimeDefault { s, .. } => { - scope = s; - } - } - } - }; - - let map = &self.map; - let unsubst = if let Some(id) = self.tcx.hir().as_local_hir_id(def_id) { - &map.object_lifetime_defaults[&id] - } else { - let tcx = self.tcx; - self.xcrate_object_lifetime_defaults - .entry(def_id) - .or_insert_with(|| { - tcx.generics_of(def_id) - .params - .iter() - .filter_map(|param| match param.kind { - GenericParamDefKind::Type { - object_lifetime_default, - .. - } => Some(object_lifetime_default), - GenericParamDefKind::Lifetime | GenericParamDefKind::Const => None, - }) - .collect() - }) - }; - debug!("visit_segment_args: unsubst={:?}", unsubst); - unsubst - .iter() - .map(|set| match *set { - Set1::Empty => if in_body { - None - } else { - Some(Region::Static) - }, - Set1::One(r) => { - let lifetimes = generic_args.args.iter().filter_map(|arg| match arg { - GenericArg::Lifetime(lt) => Some(lt), - _ => None, - }); - r.subst(lifetimes, map) - } - Set1::Many => None, - }) - .collect() - }); - - debug!("visit_segment_args: object_lifetime_defaults={:?}", object_lifetime_defaults); - - let mut i = 0; - for arg in &generic_args.args { - match arg { - GenericArg::Lifetime(_) => {} - GenericArg::Type(ty) => { - if let Some(<) = object_lifetime_defaults.get(i) { - let scope = Scope::ObjectLifetimeDefault { - lifetime: lt, - s: self.scope, - }; - self.with(scope, |_, this| this.visit_ty(ty)); - } else { - self.visit_ty(ty); - } - i += 1; - } - GenericArg::Const(ct) => { - self.visit_anon_const(&ct.value); - } - } - } - - // Hack: when resolving the type `XX` in binding like `dyn - // Foo<'b, Item = XX>`, the current object-lifetime default - // would be to examine the trait `Foo` to check whether it has - // a lifetime bound declared on `Item`. e.g., if `Foo` is - // declared like so, then the default object lifetime bound in - // `XX` should be `'b`: - // - // ```rust - // trait Foo<'a> { - // type Item: 'a; - // } - // ``` - // - // but if we just have `type Item;`, then it would be - // `'static`. However, we don't get all of this logic correct. - // - // Instead, we do something hacky: if there are no lifetime parameters - // to the trait, then we simply use a default object lifetime - // bound of `'static`, because there is no other possibility. On the other hand, - // if there ARE lifetime parameters, then we require the user to give an - // explicit bound for now. - // - // This is intended to leave room for us to implement the - // correct behavior in the future. - let has_lifetime_parameter = generic_args - .args - .iter() - .any(|arg| match arg { - GenericArg::Lifetime(_) => true, - _ => false, - }); - - // Resolve lifetimes found in the type `XX` from `Item = XX` bindings. - for b in &generic_args.bindings { - let scope = Scope::ObjectLifetimeDefault { - lifetime: if has_lifetime_parameter { - None - } else { - Some(Region::Static) - }, - s: self.scope, - }; - self.with(scope, |_, this| this.visit_assoc_type_binding(b)); - } - } - - fn visit_fn_like_elision(&mut self, inputs: &'tcx [hir::Ty], output: Option<&'tcx hir::Ty>) { - debug!("visit_fn_like_elision: enter"); - let mut arg_elide = Elide::FreshLateAnon(Cell::new(0)); - let arg_scope = Scope::Elision { - elide: arg_elide.clone(), - s: self.scope, - }; - self.with(arg_scope, |_, this| { - for input in inputs { - this.visit_ty(input); - } - match *this.scope { - Scope::Elision { ref elide, .. } => { - arg_elide = elide.clone(); - } - _ => bug!(), - } - }); - - let output = match output { - Some(ty) => ty, - None => return, - }; - - debug!("visit_fn_like_elision: determine output"); - - // Figure out if there's a body we can get argument names from, - // and whether there's a `self` argument (treated specially). - let mut assoc_item_kind = None; - let mut impl_self = None; - let parent = self.tcx.hir().get_parent_node(output.hir_id); - let body = match self.tcx.hir().get(parent) { - // `fn` definitions and methods. - Node::Item(&hir::Item { - kind: hir::ItemKind::Fn(.., body), - .. - }) => Some(body), - - Node::TraitItem(&hir::TraitItem { - kind: hir::TraitItemKind::Method(_, ref m), - .. - }) => { - if let hir::ItemKind::Trait(.., ref trait_items) = self.tcx - .hir() - .expect_item(self.tcx.hir().get_parent_item(parent)) - .kind - { - assoc_item_kind = trait_items - .iter() - .find(|ti| ti.id.hir_id == parent) - .map(|ti| ti.kind); - } - match *m { - hir::TraitMethod::Required(_) => None, - hir::TraitMethod::Provided(body) => Some(body), - } - } - - Node::ImplItem(&hir::ImplItem { - kind: hir::ImplItemKind::Method(_, body), - .. - }) => { - if let hir::ItemKind::Impl(.., ref self_ty, ref impl_items) = self.tcx - .hir() - .expect_item(self.tcx.hir().get_parent_item(parent)) - .kind - { - impl_self = Some(self_ty); - assoc_item_kind = impl_items - .iter() - .find(|ii| ii.id.hir_id == parent) - .map(|ii| ii.kind); - } - Some(body) - } - - // Foreign functions, `fn(...) -> R` and `Trait(...) -> R` (both types and bounds). - Node::ForeignItem(_) | Node::Ty(_) | Node::TraitRef(_) => None, - // Everything else (only closures?) doesn't - // actually enjoy elision in return types. - _ => { - self.visit_ty(output); - return; - } - }; - - let has_self = match assoc_item_kind { - Some(hir::AssocItemKind::Method { has_self }) => has_self, - _ => false, - }; - - // In accordance with the rules for lifetime elision, we can determine - // what region to use for elision in the output type in two ways. - // First (determined here), if `self` is by-reference, then the - // implied output region is the region of the self parameter. - if has_self { - struct SelfVisitor<'a> { - map: &'a NamedRegionMap, - impl_self: Option<&'a hir::TyKind>, - lifetime: Set1, - } - - impl SelfVisitor<'_> { - // Look for `self: &'a Self` - also desugared from `&'a self`, - // and if that matches, use it for elision and return early. - fn is_self_ty(&self, res: Res) -> bool { - if let Res::SelfTy(..) = res { - return true; - } - - // Can't always rely on literal (or implied) `Self` due - // to the way elision rules were originally specified. - if let Some(&hir::TyKind::Path(hir::QPath::Resolved(None, ref path))) = - self.impl_self - { - match path.res { - // Whitelist the types that unambiguously always - // result in the same type constructor being used - // (it can't differ between `Self` and `self`). - Res::Def(DefKind::Struct, _) - | Res::Def(DefKind::Union, _) - | Res::Def(DefKind::Enum, _) - | Res::PrimTy(_) => { - return res == path.res - } - _ => {} - } - } - - false - } - } - - impl<'a> Visitor<'a> for SelfVisitor<'a> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'a> { - NestedVisitorMap::None - } - - fn visit_ty(&mut self, ty: &'a hir::Ty) { - if let hir::TyKind::Rptr(lifetime_ref, ref mt) = ty.kind { - if let hir::TyKind::Path(hir::QPath::Resolved(None, ref path)) = mt.ty.kind - { - if self.is_self_ty(path.res) { - if let Some(lifetime) = self.map.defs.get(&lifetime_ref.hir_id) { - self.lifetime.insert(*lifetime); - } - } - } - } - intravisit::walk_ty(self, ty) - } - } - - let mut visitor = SelfVisitor { - map: self.map, - impl_self: impl_self.map(|ty| &ty.kind), - lifetime: Set1::Empty, - }; - visitor.visit_ty(&inputs[0]); - if let Set1::One(lifetime) = visitor.lifetime { - let scope = Scope::Elision { - elide: Elide::Exact(lifetime), - s: self.scope, - }; - self.with(scope, |_, this| this.visit_ty(output)); - return; - } - } - - // Second, if there was exactly one lifetime (either a substitution or a - // reference) in the arguments, then any anonymous regions in the output - // have that lifetime. - let mut possible_implied_output_region = None; - let mut lifetime_count = 0; - let arg_lifetimes = inputs - .iter() - .enumerate() - .skip(has_self as usize) - .map(|(i, input)| { - let mut gather = GatherLifetimes { - map: self.map, - outer_index: ty::INNERMOST, - have_bound_regions: false, - lifetimes: Default::default(), - }; - gather.visit_ty(input); - - lifetime_count += gather.lifetimes.len(); - - if lifetime_count == 1 && gather.lifetimes.len() == 1 { - // there's a chance that the unique lifetime of this - // iteration will be the appropriate lifetime for output - // parameters, so lets store it. - possible_implied_output_region = gather.lifetimes.iter().cloned().next(); - } - - ElisionFailureInfo { - parent: body, - index: i, - lifetime_count: gather.lifetimes.len(), - have_bound_regions: gather.have_bound_regions, - } - }) - .collect(); - - let elide = if lifetime_count == 1 { - Elide::Exact(possible_implied_output_region.unwrap()) - } else { - Elide::Error(arg_lifetimes) - }; - - debug!("visit_fn_like_elision: elide={:?}", elide); - - let scope = Scope::Elision { - elide, - s: self.scope, - }; - self.with(scope, |_, this| this.visit_ty(output)); - debug!("visit_fn_like_elision: exit"); - - struct GatherLifetimes<'a> { - map: &'a NamedRegionMap, - outer_index: ty::DebruijnIndex, - have_bound_regions: bool, - lifetimes: FxHashSet, - } - - impl<'v, 'a> Visitor<'v> for GatherLifetimes<'a> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'v> { - NestedVisitorMap::None - } - - fn visit_ty(&mut self, ty: &hir::Ty) { - if let hir::TyKind::BareFn(_) = ty.kind { - self.outer_index.shift_in(1); - } - match ty.kind { - hir::TyKind::TraitObject(ref bounds, ref lifetime) => { - for bound in bounds { - self.visit_poly_trait_ref(bound, hir::TraitBoundModifier::None); - } - - // Stay on the safe side and don't include the object - // lifetime default (which may not end up being used). - if !lifetime.is_elided() { - self.visit_lifetime(lifetime); - } - } - _ => { - intravisit::walk_ty(self, ty); - } - } - if let hir::TyKind::BareFn(_) = ty.kind { - self.outer_index.shift_out(1); - } - } - - fn visit_generic_param(&mut self, param: &hir::GenericParam) { - if let hir::GenericParamKind::Lifetime { .. } = param.kind { - // FIXME(eddyb) Do we want this? It only makes a difference - // if this `for<'a>` lifetime parameter is never used. - self.have_bound_regions = true; - } - - intravisit::walk_generic_param(self, param); - } - - fn visit_poly_trait_ref( - &mut self, - trait_ref: &hir::PolyTraitRef, - modifier: hir::TraitBoundModifier, - ) { - self.outer_index.shift_in(1); - intravisit::walk_poly_trait_ref(self, trait_ref, modifier); - self.outer_index.shift_out(1); - } - - fn visit_lifetime(&mut self, lifetime_ref: &hir::Lifetime) { - if let Some(&lifetime) = self.map.defs.get(&lifetime_ref.hir_id) { - match lifetime { - Region::LateBound(debruijn, _, _) | Region::LateBoundAnon(debruijn, _) - if debruijn < self.outer_index => - { - self.have_bound_regions = true; - } - _ => { - self.lifetimes - .insert(lifetime.shifted_out_to_binder(self.outer_index)); - } - } - } - } - } - } - - fn resolve_elided_lifetimes(&mut self, lifetime_refs: Vec<&'tcx hir::Lifetime>) { - debug!("resolve_elided_lifetimes(lifetime_refs={:?})", lifetime_refs); - - if lifetime_refs.is_empty() { - return; - } - - let span = lifetime_refs[0].span; - let mut late_depth = 0; - let mut scope = self.scope; - let mut lifetime_names = FxHashSet::default(); - let error = loop { - match *scope { - // Do not assign any resolution, it will be inferred. - Scope::Body { .. } => return, - - Scope::Root => break None, - - Scope::Binder { s, ref lifetimes, .. } => { - // collect named lifetimes for suggestions - for name in lifetimes.keys() { - if let hir::ParamName::Plain(name) = name { - lifetime_names.insert(*name); - } - } - late_depth += 1; - scope = s; - } - - Scope::Elision { ref elide, ref s, .. } => { - let lifetime = match *elide { - Elide::FreshLateAnon(ref counter) => { - for lifetime_ref in lifetime_refs { - let lifetime = Region::late_anon(counter).shifted(late_depth); - self.insert_lifetime(lifetime_ref, lifetime); - } - return; - } - Elide::Exact(l) => l.shifted(late_depth), - Elide::Error(ref e) => { - if let Scope::Binder { ref lifetimes, .. } = s { - // collect named lifetimes for suggestions - for name in lifetimes.keys() { - if let hir::ParamName::Plain(name) = name { - lifetime_names.insert(*name); - } - } - } - break Some(e); - } - }; - for lifetime_ref in lifetime_refs { - self.insert_lifetime(lifetime_ref, lifetime); - } - return; - } - - Scope::ObjectLifetimeDefault { s, .. } => { - scope = s; - } - } - }; - - let mut err = report_missing_lifetime_specifiers(self.tcx.sess, span, lifetime_refs.len()); - let mut add_label = true; - - if let Some(params) = error { - if lifetime_refs.len() == 1 { - add_label = add_label && self.report_elision_failure(&mut err, params, span); - } - } - if add_label { - add_missing_lifetime_specifiers_label( - &mut err, - span, - lifetime_refs.len(), - &lifetime_names, - self.tcx.sess.source_map().span_to_snippet(span).ok().as_ref().map(|s| s.as_str()), - ); - } - - err.emit(); - } - - fn suggest_lifetime(&self, db: &mut DiagnosticBuilder<'_>, span: Span, msg: &str) -> bool { - match self.tcx.sess.source_map().span_to_snippet(span) { - Ok(ref snippet) => { - let (sugg, applicability) = if snippet == "&" { - ("&'static ".to_owned(), Applicability::MachineApplicable) - } else if snippet == "'_" { - ("'static".to_owned(), Applicability::MachineApplicable) - } else { - (format!("{} + 'static", snippet), Applicability::MaybeIncorrect) - }; - db.span_suggestion(span, msg, sugg, applicability); - false - } - Err(_) => { - db.help(msg); - true - } - } - } - - fn report_elision_failure( - &mut self, - db: &mut DiagnosticBuilder<'_>, - params: &[ElisionFailureInfo], - span: Span, - ) -> bool { - let mut m = String::new(); - let len = params.len(); - - let elided_params: Vec<_> = params - .iter() - .cloned() - .filter(|info| info.lifetime_count > 0) - .collect(); - - let elided_len = elided_params.len(); - - for (i, info) in elided_params.into_iter().enumerate() { - let ElisionFailureInfo { - parent, - index, - lifetime_count: n, - have_bound_regions, - } = info; - - let help_name = if let Some(ident) = parent.and_then(|body| { - self.tcx.hir().body(body).params[index].pat.simple_ident() - }) { - format!("`{}`", ident) - } else { - format!("argument {}", index + 1) - }; - - m.push_str( - &(if n == 1 { - help_name - } else { - format!( - "one of {}'s {} {}lifetimes", - help_name, - n, - if have_bound_regions { "free " } else { "" } - ) - })[..], - ); - - if elided_len == 2 && i == 0 { - m.push_str(" or "); - } else if i + 2 == elided_len { - m.push_str(", or "); - } else if i != elided_len - 1 { - m.push_str(", "); - } - } - - if len == 0 { - help!( - db, - "this function's return type contains a borrowed value, but \ - there is no value for it to be borrowed from" - ); - self.suggest_lifetime(db, span, "consider giving it a 'static lifetime") - } else if elided_len == 0 { - help!( - db, - "this function's return type contains a borrowed value with \ - an elided lifetime, but the lifetime cannot be derived from \ - the arguments" - ); - let msg = "consider giving it an explicit bounded or 'static lifetime"; - self.suggest_lifetime(db, span, msg) - } else if elided_len == 1 { - help!( - db, - "this function's return type contains a borrowed value, but \ - the signature does not say which {} it is borrowed from", - m - ); - true - } else { - help!( - db, - "this function's return type contains a borrowed value, but \ - the signature does not say whether it is borrowed from {}", - m - ); - true - } - } - - fn resolve_object_lifetime_default(&mut self, lifetime_ref: &'tcx hir::Lifetime) { - debug!("resolve_object_lifetime_default(lifetime_ref={:?})", lifetime_ref); - let mut late_depth = 0; - let mut scope = self.scope; - let lifetime = loop { - match *scope { - Scope::Binder { s, .. } => { - late_depth += 1; - scope = s; - } - - Scope::Root | Scope::Elision { .. } => break Region::Static, - - Scope::Body { .. } | Scope::ObjectLifetimeDefault { lifetime: None, .. } => return, - - Scope::ObjectLifetimeDefault { - lifetime: Some(l), .. - } => break l, - } - }; - self.insert_lifetime(lifetime_ref, lifetime.shifted(late_depth)); - } - - fn check_lifetime_params( - &mut self, - old_scope: ScopeRef<'_>, - params: &'tcx [hir::GenericParam], - ) { - let lifetimes: Vec<_> = params - .iter() - .filter_map(|param| match param.kind { - GenericParamKind::Lifetime { .. } => Some((param, param.name.modern())), - _ => None, - }) - .collect(); - for (i, (lifetime_i, lifetime_i_name)) in lifetimes.iter().enumerate() { - if let hir::ParamName::Plain(_) = lifetime_i_name { - let name = lifetime_i_name.ident().name; - if name == kw::UnderscoreLifetime - || name == kw::StaticLifetime - { - let mut err = struct_span_err!( - self.tcx.sess, - lifetime_i.span, - E0262, - "invalid lifetime parameter name: `{}`", - lifetime_i.name.ident(), - ); - err.span_label( - lifetime_i.span, - format!("{} is a reserved lifetime name", name), - ); - err.emit(); - } - } - - // It is a hard error to shadow a lifetime within the same scope. - for (lifetime_j, lifetime_j_name) in lifetimes.iter().skip(i + 1) { - if lifetime_i_name == lifetime_j_name { - struct_span_err!( - self.tcx.sess, - lifetime_j.span, - E0263, - "lifetime name `{}` declared twice in the same scope", - lifetime_j.name.ident() - ).span_label(lifetime_j.span, "declared twice") - .span_label(lifetime_i.span, "previous declaration here") - .emit(); - } - } - - // It is a soft error to shadow a lifetime within a parent scope. - self.check_lifetime_param_for_shadowing(old_scope, &lifetime_i); - - for bound in &lifetime_i.bounds { - match bound { - hir::GenericBound::Outlives(lt) => match lt.name { - hir::LifetimeName::Underscore => self.tcx.sess.delay_span_bug( - lt.span, - "use of `'_` in illegal place, but not caught by lowering", - ), - hir::LifetimeName::Static => { - self.insert_lifetime(lt, Region::Static); - self.tcx - .sess - .struct_span_warn( - lifetime_i.span.to(lt.span), - &format!( - "unnecessary lifetime parameter `{}`", - lifetime_i.name.ident(), - ), - ) - .help(&format!( - "you can use the `'static` lifetime directly, in place of `{}`", - lifetime_i.name.ident(), - )) - .emit(); - } - hir::LifetimeName::Param(_) | hir::LifetimeName::Implicit => { - self.resolve_lifetime_ref(lt); - } - hir::LifetimeName::ImplicitObjectLifetimeDefault => { - self.tcx.sess.delay_span_bug( - lt.span, - "lowering generated `ImplicitObjectLifetimeDefault` \ - outside of an object type", - ) - } - hir::LifetimeName::Error => { - // No need to do anything, error already reported. - } - }, - _ => bug!(), - } - } - } - } - - fn check_lifetime_param_for_shadowing( - &self, - mut old_scope: ScopeRef<'_>, - param: &'tcx hir::GenericParam, - ) { - for label in &self.labels_in_fn { - // FIXME (#24278): non-hygienic comparison - if param.name.ident().name == label.name { - signal_shadowing_problem( - self.tcx, - label.name, - original_label(label.span), - shadower_lifetime(¶m), - ); - return; - } - } - - loop { - match *old_scope { - Scope::Body { s, .. } - | Scope::Elision { s, .. } - | Scope::ObjectLifetimeDefault { s, .. } => { - old_scope = s; - } - - Scope::Root => { - return; - } - - Scope::Binder { - ref lifetimes, s, .. - } => { - if let Some(&def) = lifetimes.get(¶m.name.modern()) { - let hir_id = self.tcx.hir().as_local_hir_id(def.id().unwrap()).unwrap(); - - signal_shadowing_problem( - self.tcx, - param.name.ident().name, - original_lifetime(self.tcx.hir().span(hir_id)), - shadower_lifetime(¶m), - ); - return; - } - - old_scope = s; - } - } - } - } - - /// Returns `true` if, in the current scope, replacing `'_` would be - /// equivalent to a single-use lifetime. - fn track_lifetime_uses(&self) -> bool { - let mut scope = self.scope; - loop { - match *scope { - Scope::Root => break false, - - // Inside of items, it depends on the kind of item. - Scope::Binder { - track_lifetime_uses, - .. - } => break track_lifetime_uses, - - // Inside a body, `'_` will use an inference variable, - // should be fine. - Scope::Body { .. } => break true, - - // A lifetime only used in a fn argument could as well - // be replaced with `'_`, as that would generate a - // fresh name, too. - Scope::Elision { - elide: Elide::FreshLateAnon(_), - .. - } => break true, - - // In the return type or other such place, `'_` is not - // going to make a fresh name, so we cannot - // necessarily replace a single-use lifetime with - // `'_`. - Scope::Elision { - elide: Elide::Exact(_), - .. - } => break false, - Scope::Elision { - elide: Elide::Error(_), - .. - } => break false, - - Scope::ObjectLifetimeDefault { s, .. } => scope = s, - } - } - } - - fn insert_lifetime(&mut self, lifetime_ref: &'tcx hir::Lifetime, def: Region) { - if lifetime_ref.hir_id == hir::DUMMY_HIR_ID { - span_bug!( - lifetime_ref.span, - "lifetime reference not renumbered, \ - probably a bug in syntax::fold" - ); - } - - debug!( - "insert_lifetime: {} resolved to {:?} span={:?}", - self.tcx.hir().node_to_string(lifetime_ref.hir_id), - def, - self.tcx.sess.source_map().span_to_string(lifetime_ref.span) - ); - self.map.defs.insert(lifetime_ref.hir_id, def); - - match def { - Region::LateBoundAnon(..) | Region::Static => { - // These are anonymous lifetimes or lifetimes that are not declared. - } - - Region::Free(_, def_id) - | Region::LateBound(_, def_id, _) - | Region::EarlyBound(_, def_id, _) => { - // A lifetime declared by the user. - let track_lifetime_uses = self.track_lifetime_uses(); - debug!( - "insert_lifetime: track_lifetime_uses={}", - track_lifetime_uses - ); - if track_lifetime_uses && !self.lifetime_uses.contains_key(&def_id) { - debug!("insert_lifetime: first use of {:?}", def_id); - self.lifetime_uses - .insert(def_id, LifetimeUseSet::One(lifetime_ref)); - } else { - debug!("insert_lifetime: many uses of {:?}", def_id); - self.lifetime_uses.insert(def_id, LifetimeUseSet::Many); - } - } - } - } - - /// Sometimes we resolve a lifetime, but later find that it is an - /// error (esp. around impl trait). In that case, we remove the - /// entry into `map.defs` so as not to confuse later code. - fn uninsert_lifetime_on_error(&mut self, lifetime_ref: &'tcx hir::Lifetime, bad_def: Region) { - let old_value = self.map.defs.remove(&lifetime_ref.hir_id); - assert_eq!(old_value, Some(bad_def)); - } -} - -/// Detects late-bound lifetimes and inserts them into -/// `map.late_bound`. -/// -/// A region declared on a fn is **late-bound** if: -/// - it is constrained by an argument type; -/// - it does not appear in a where-clause. -/// -/// "Constrained" basically means that it appears in any type but -/// not amongst the inputs to a projection. In other words, `<&'a -/// T as Trait<''b>>::Foo` does not constrain `'a` or `'b`. -fn insert_late_bound_lifetimes( - map: &mut NamedRegionMap, - decl: &hir::FnDecl, - generics: &hir::Generics, -) { - debug!( - "insert_late_bound_lifetimes(decl={:?}, generics={:?})", - decl, generics - ); - - let mut constrained_by_input = ConstrainedCollector::default(); - for arg_ty in &decl.inputs { - constrained_by_input.visit_ty(arg_ty); - } - - let mut appears_in_output = AllCollector::default(); - intravisit::walk_fn_ret_ty(&mut appears_in_output, &decl.output); - - debug!( - "insert_late_bound_lifetimes: constrained_by_input={:?}", - constrained_by_input.regions - ); - - // Walk the lifetimes that appear in where clauses. - // - // Subtle point: because we disallow nested bindings, we can just - // ignore binders here and scrape up all names we see. - let mut appears_in_where_clause = AllCollector::default(); - appears_in_where_clause.visit_generics(generics); - - for param in &generics.params { - if let hir::GenericParamKind::Lifetime { .. } = param.kind { - if !param.bounds.is_empty() { - // `'a: 'b` means both `'a` and `'b` are referenced - appears_in_where_clause - .regions - .insert(hir::LifetimeName::Param(param.name.modern())); - } - } - } - - debug!( - "insert_late_bound_lifetimes: appears_in_where_clause={:?}", - appears_in_where_clause.regions - ); - - // Late bound regions are those that: - // - appear in the inputs - // - do not appear in the where-clauses - // - are not implicitly captured by `impl Trait` - for param in &generics.params { - match param.kind { - hir::GenericParamKind::Lifetime { .. } => { /* fall through */ } - - // Neither types nor consts are late-bound. - hir::GenericParamKind::Type { .. } - | hir::GenericParamKind::Const { .. } => continue, - } - - let lt_name = hir::LifetimeName::Param(param.name.modern()); - // appears in the where clauses? early-bound. - if appears_in_where_clause.regions.contains(<_name) { - continue; - } - - // does not appear in the inputs, but appears in the return type? early-bound. - if !constrained_by_input.regions.contains(<_name) - && appears_in_output.regions.contains(<_name) - { - continue; - } - - debug!( - "insert_late_bound_lifetimes: lifetime {:?} with id {:?} is late-bound", - param.name.ident(), - param.hir_id - ); - - let inserted = map.late_bound.insert(param.hir_id); - assert!(inserted, "visited lifetime {:?} twice", param.hir_id); - } - - return; - - #[derive(Default)] - struct ConstrainedCollector { - regions: FxHashSet, - } - - impl<'v> Visitor<'v> for ConstrainedCollector { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'v> { - NestedVisitorMap::None - } - - fn visit_ty(&mut self, ty: &'v hir::Ty) { - match ty.kind { - hir::TyKind::Path(hir::QPath::Resolved(Some(_), _)) - | hir::TyKind::Path(hir::QPath::TypeRelative(..)) => { - // ignore lifetimes appearing in associated type - // projections, as they are not *constrained* - // (defined above) - } - - hir::TyKind::Path(hir::QPath::Resolved(None, ref path)) => { - // consider only the lifetimes on the final - // segment; I am not sure it's even currently - // valid to have them elsewhere, but even if it - // is, those would be potentially inputs to - // projections - if let Some(last_segment) = path.segments.last() { - self.visit_path_segment(path.span, last_segment); - } - } - - _ => { - intravisit::walk_ty(self, ty); - } - } - } - - fn visit_lifetime(&mut self, lifetime_ref: &'v hir::Lifetime) { - self.regions.insert(lifetime_ref.name.modern()); - } - } - - #[derive(Default)] - struct AllCollector { - regions: FxHashSet, - } - - impl<'v> Visitor<'v> for AllCollector { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'v> { - NestedVisitorMap::None - } - - fn visit_lifetime(&mut self, lifetime_ref: &'v hir::Lifetime) { - self.regions.insert(lifetime_ref.name.modern()); - } - } -} - -pub fn report_missing_lifetime_specifiers( - sess: &Session, - span: Span, - count: usize, -) -> DiagnosticBuilder<'_> { - struct_span_err!( - sess, - span, - E0106, - "missing lifetime specifier{}", - pluralize!(count) - ) -} - -fn add_missing_lifetime_specifiers_label( - err: &mut DiagnosticBuilder<'_>, - span: Span, - count: usize, - lifetime_names: &FxHashSet, - snippet: Option<&str>, -) { - if count > 1 { - err.span_label(span, format!("expected {} lifetime parameters", count)); - } else if let (1, Some(name), Some("&")) = ( - lifetime_names.len(), - lifetime_names.iter().next(), - snippet, - ) { - err.span_suggestion( - span, - "consider using the named lifetime", - format!("&{} ", name), - Applicability::MaybeIncorrect, - ); - } else { - err.span_label(span, "expected lifetime parameter"); - } -} diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index 51756084f2..1176ffc79d 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -3,33 +3,24 @@ pub use self::StabilityLevel::*; -use crate::lint::{self, Lint, in_derive_expansion}; -use crate::lint::builtin::BuiltinLintDiagnostics; -use crate::hir::{self, Item, Generics, StructField, Variant, HirId}; -use crate::hir::def::{Res, DefKind}; -use crate::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefId, LOCAL_CRATE}; -use crate::hir::intravisit::{self, Visitor, NestedVisitorMap}; -use crate::ty::query::Providers; -use crate::middle::privacy::AccessLevels; use crate::session::{DiagnosticMessageId, Session}; -use errors::DiagnosticBuilder; -use rustc_feature::GateIssue; -use syntax::symbol::{Symbol, sym}; -use syntax_pos::{Span, MultiSpan}; -use syntax::ast::{Attribute, CRATE_NODE_ID}; -use syntax::errors::Applicability; -use syntax::feature_gate::{feature_err, feature_err_issue}; -use syntax::attr::{self, Stability, Deprecation, RustcDeprecation, ConstStability}; use crate::ty::{self, TyCtxt}; -use crate::util::nodemap::{FxHashSet, FxHashMap}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_errors::{Applicability, DiagnosticBuilder}; +use rustc_feature::GateIssue; +use rustc_hir as hir; +use rustc_hir::def::DefKind; +use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX}; +use rustc_hir::{self, HirId}; +use rustc_session::lint::{self, BuiltinLintDiagnostics, Lint, LintBuffer}; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::{MultiSpan, Span}; +use syntax::ast::CRATE_NODE_ID; +use syntax::attr::{self, ConstStability, Deprecation, RustcDeprecation, Stability}; +use syntax::sess::feature_err_issue; -use std::cmp::Ordering; -use std::mem::replace; use std::num::NonZeroU32; -use rustc_error_codes::*; - - #[derive(PartialEq, Clone, Copy, Debug)] pub enum StabilityLevel { Unstable, @@ -42,16 +33,6 @@ impl StabilityLevel { } } -#[derive(PartialEq)] -enum AnnotationKind { - // Annotation is required if not inherited from unstable parents - Required, - // Annotation is useless, reject it - Prohibited, - // Annotation itself is useless, but it can be propagated to children - Container, -} - /// An entry in the `depr_map`. #[derive(Clone, HashStable)] pub struct DeprecationEntry { @@ -63,24 +44,18 @@ pub struct DeprecationEntry { } impl DeprecationEntry { - fn local(attr: Deprecation, id: HirId) -> DeprecationEntry { - DeprecationEntry { - attr, - origin: Some(id), - } + pub fn local(attr: Deprecation, id: HirId) -> DeprecationEntry { + DeprecationEntry { attr, origin: Some(id) } } pub fn external(attr: Deprecation) -> DeprecationEntry { - DeprecationEntry { - attr, - origin: None, - } + DeprecationEntry { attr, origin: None } } pub fn same_origin(&self, other: &DeprecationEntry) -> bool { match (self.origin, other.origin) { (Some(o1), Some(o2)) => o1 == o2, - _ => false + _ => false, } } } @@ -90,383 +65,18 @@ impl DeprecationEntry { pub struct Index<'tcx> { /// This is mostly a cache, except the stabilities of local items /// are filled by the annotator. - stab_map: FxHashMap, - const_stab_map: FxHashMap, - depr_map: FxHashMap, + pub stab_map: FxHashMap, + pub const_stab_map: FxHashMap, + pub depr_map: FxHashMap, /// Maps for each crate whether it is part of the staged API. - staged_api: FxHashMap, + pub staged_api: FxHashMap, /// Features enabled for this crate. - active_features: FxHashSet, -} - -// A private tree-walker for producing an Index. -struct Annotator<'a, 'tcx> { - tcx: TyCtxt<'tcx>, - index: &'a mut Index<'tcx>, - parent_stab: Option<&'tcx Stability>, - parent_depr: Option, - in_trait_impl: bool, -} - -impl<'a, 'tcx> Annotator<'a, 'tcx> { - // Determine the stability for a node based on its attributes and inherited - // stability. The stability is recorded in the index and used as the parent. - fn annotate(&mut self, hir_id: HirId, attrs: &[Attribute], - item_sp: Span, kind: AnnotationKind, visit_children: F) - where F: FnOnce(&mut Self) - { - if self.tcx.features().staged_api { - // This crate explicitly wants staged API. - debug!("annotate(id = {:?}, attrs = {:?})", hir_id, attrs); - if let Some(..) = attr::find_deprecation(&self.tcx.sess.parse_sess, attrs, item_sp) { - self.tcx.sess.span_err(item_sp, "`#[deprecated]` cannot be used in staged API; \ - use `#[rustc_deprecated]` instead"); - } - let (stab, const_stab) = attr::find_stability( - &self.tcx.sess.parse_sess, attrs, item_sp, - ); - if let Some(const_stab) = const_stab { - let const_stab = self.tcx.intern_const_stability(const_stab); - self.index.const_stab_map.insert(hir_id, const_stab); - } - if let Some(mut stab) = stab { - // Error if prohibited, or can't inherit anything from a container. - if kind == AnnotationKind::Prohibited || - (kind == AnnotationKind::Container && - stab.level.is_stable() && - stab.rustc_depr.is_none()) { - self.tcx.sess.span_err(item_sp, "This stability annotation is useless"); - } - - debug!("annotate: found {:?}", stab); - // If parent is deprecated and we're not, inherit this by merging - // deprecated_since and its reason. - if let Some(parent_stab) = self.parent_stab { - if parent_stab.rustc_depr.is_some() && stab.rustc_depr.is_none() { - stab.rustc_depr = parent_stab.rustc_depr.clone() - } - } - - let stab = self.tcx.intern_stability(stab); - - // Check if deprecated_since < stable_since. If it is, - // this is *almost surely* an accident. - if let (&Some(attr::RustcDeprecation {since: dep_since, ..}), - &attr::Stable {since: stab_since}) = (&stab.rustc_depr, &stab.level) { - // Explicit version of iter::order::lt to handle parse errors properly - for (dep_v, stab_v) in dep_since.as_str() - .split('.') - .zip(stab_since.as_str().split('.')) - { - if let (Ok(dep_v), Ok(stab_v)) = (dep_v.parse::(), stab_v.parse()) { - match dep_v.cmp(&stab_v) { - Ordering::Less => { - self.tcx.sess.span_err(item_sp, "An API can't be stabilized \ - after it is deprecated"); - break - } - Ordering::Equal => continue, - Ordering::Greater => break, - } - } else { - // Act like it isn't less because the question is now nonsensical, - // and this makes us not do anything else interesting. - self.tcx.sess.span_err(item_sp, "Invalid stability or deprecation \ - version found"); - break - } - } - } - - self.index.stab_map.insert(hir_id, stab); - - let orig_parent_stab = replace(&mut self.parent_stab, Some(stab)); - visit_children(self); - self.parent_stab = orig_parent_stab; - } else { - debug!("annotate: not found, parent = {:?}", self.parent_stab); - if let Some(stab) = self.parent_stab { - if stab.level.is_unstable() { - self.index.stab_map.insert(hir_id, stab); - } - } - visit_children(self); - } - } else { - // Emit errors for non-staged-api crates. - let unstable_attrs = [ - sym::unstable, sym::stable, - sym::rustc_deprecated, - sym::rustc_const_unstable, - sym::rustc_const_stable, - ]; - for attr in attrs { - let name = attr.name_or_empty(); - if unstable_attrs.contains(&name) { - attr::mark_used(attr); - struct_span_err!( - self.tcx.sess, - attr.span, - E0734, - "stability attributes may not be used outside of the standard library", - ).emit(); - } - } - - // Propagate unstability. This can happen even for non-staged-api crates in case - // -Zforce-unstable-if-unmarked is set. - if let Some(stab) = self.parent_stab { - if stab.level.is_unstable() { - self.index.stab_map.insert(hir_id, stab); - } - } - - if let Some(depr) = attr::find_deprecation(&self.tcx.sess.parse_sess, attrs, item_sp) { - if kind == AnnotationKind::Prohibited { - self.tcx.sess.span_err(item_sp, "This deprecation annotation is useless"); - } - - // `Deprecation` is just two pointers, no need to intern it - let depr_entry = DeprecationEntry::local(depr, hir_id); - self.index.depr_map.insert(hir_id, depr_entry.clone()); - - let orig_parent_depr = replace(&mut self.parent_depr, - Some(depr_entry)); - visit_children(self); - self.parent_depr = orig_parent_depr; - } else if let Some(parent_depr) = self.parent_depr.clone() { - self.index.depr_map.insert(hir_id, parent_depr); - visit_children(self); - } else { - visit_children(self); - } - } - } -} - -impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> { - /// Because stability levels are scoped lexically, we want to walk - /// nested items in the context of the outer item, so enable - /// deep-walking. - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.tcx.hir()) - } - - fn visit_item(&mut self, i: &'tcx Item) { - let orig_in_trait_impl = self.in_trait_impl; - let mut kind = AnnotationKind::Required; - match i.kind { - // Inherent impls and foreign modules serve only as containers for other items, - // they don't have their own stability. They still can be annotated as unstable - // and propagate this unstability to children, but this annotation is completely - // optional. They inherit stability from their parents when unannotated. - hir::ItemKind::Impl(.., None, _, _) | hir::ItemKind::ForeignMod(..) => { - self.in_trait_impl = false; - kind = AnnotationKind::Container; - } - hir::ItemKind::Impl(.., Some(_), _, _) => { - self.in_trait_impl = true; - } - hir::ItemKind::Struct(ref sd, _) => { - if let Some(ctor_hir_id) = sd.ctor_hir_id() { - self.annotate(ctor_hir_id, &i.attrs, i.span, AnnotationKind::Required, |_| {}) - } - } - _ => {} - } - - self.annotate(i.hir_id, &i.attrs, i.span, kind, |v| { - intravisit::walk_item(v, i) - }); - self.in_trait_impl = orig_in_trait_impl; - } - - fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem) { - self.annotate(ti.hir_id, &ti.attrs, ti.span, AnnotationKind::Required, |v| { - intravisit::walk_trait_item(v, ti); - }); - } - - fn visit_impl_item(&mut self, ii: &'tcx hir::ImplItem) { - let kind = if self.in_trait_impl { - AnnotationKind::Prohibited - } else { - AnnotationKind::Required - }; - self.annotate(ii.hir_id, &ii.attrs, ii.span, kind, |v| { - intravisit::walk_impl_item(v, ii); - }); - } - - fn visit_variant(&mut self, var: &'tcx Variant, g: &'tcx Generics, item_id: HirId) { - self.annotate(var.id, &var.attrs, var.span, AnnotationKind::Required, - |v| { - if let Some(ctor_hir_id) = var.data.ctor_hir_id() { - v.annotate(ctor_hir_id, &var.attrs, var.span, AnnotationKind::Required, - |_| {}); - } - - intravisit::walk_variant(v, var, g, item_id) - }) - } - - fn visit_struct_field(&mut self, s: &'tcx StructField) { - self.annotate(s.hir_id, &s.attrs, s.span, AnnotationKind::Required, |v| { - intravisit::walk_struct_field(v, s); - }); - } - - fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem) { - self.annotate(i.hir_id, &i.attrs, i.span, AnnotationKind::Required, |v| { - intravisit::walk_foreign_item(v, i); - }); - } - - fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef) { - self.annotate(md.hir_id, &md.attrs, md.span, AnnotationKind::Required, |_| {}); - } -} - -struct MissingStabilityAnnotations<'a, 'tcx> { - tcx: TyCtxt<'tcx>, - access_levels: &'a AccessLevels, -} - -impl<'a, 'tcx> MissingStabilityAnnotations<'a, 'tcx> { - fn check_missing_stability(&self, hir_id: HirId, span: Span, name: &str) { - let stab = self.tcx.stability().local_stability(hir_id); - let is_error = !self.tcx.sess.opts.test && - stab.is_none() && - self.access_levels.is_reachable(hir_id); - if is_error { - self.tcx.sess.span_err( - span, - &format!("{} has missing stability attribute", name), - ); - } - } -} - -impl<'a, 'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'a, 'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::OnlyBodies(&self.tcx.hir()) - } - - fn visit_item(&mut self, i: &'tcx Item) { - match i.kind { - // Inherent impls and foreign modules serve only as containers for other items, - // they don't have their own stability. They still can be annotated as unstable - // and propagate this unstability to children, but this annotation is completely - // optional. They inherit stability from their parents when unannotated. - hir::ItemKind::Impl(.., None, _, _) | hir::ItemKind::ForeignMod(..) => {} - - _ => self.check_missing_stability(i.hir_id, i.span, i.kind.descriptive_variant()) - } - - intravisit::walk_item(self, i) - } - - fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem) { - self.check_missing_stability(ti.hir_id, ti.span, "item"); - intravisit::walk_trait_item(self, ti); - } - - fn visit_impl_item(&mut self, ii: &'tcx hir::ImplItem) { - let impl_def_id = self.tcx.hir().local_def_id( - self.tcx.hir().get_parent_item(ii.hir_id)); - if self.tcx.impl_trait_ref(impl_def_id).is_none() { - self.check_missing_stability(ii.hir_id, ii.span, "item"); - } - intravisit::walk_impl_item(self, ii); - } - - fn visit_variant(&mut self, var: &'tcx Variant, g: &'tcx Generics, item_id: HirId) { - self.check_missing_stability(var.id, var.span, "variant"); - intravisit::walk_variant(self, var, g, item_id); - } - - fn visit_struct_field(&mut self, s: &'tcx StructField) { - self.check_missing_stability(s.hir_id, s.span, "field"); - intravisit::walk_struct_field(self, s); - } - - fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem) { - self.check_missing_stability(i.hir_id, i.span, i.kind.descriptive_variant()); - intravisit::walk_foreign_item(self, i); - } - - fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef) { - self.check_missing_stability(md.hir_id, md.span, "macro"); - } + pub active_features: FxHashSet, } impl<'tcx> Index<'tcx> { - pub fn new(tcx: TyCtxt<'tcx>) -> Index<'tcx> { - let is_staged_api = - tcx.sess.opts.debugging_opts.force_unstable_if_unmarked || - tcx.features().staged_api; - let mut staged_api = FxHashMap::default(); - staged_api.insert(LOCAL_CRATE, is_staged_api); - let mut index = Index { - staged_api, - stab_map: Default::default(), - const_stab_map: Default::default(), - depr_map: Default::default(), - active_features: Default::default(), - }; - - let active_lib_features = &tcx.features().declared_lib_features; - let active_lang_features = &tcx.features().declared_lang_features; - - // Put the active features into a map for quick lookup. - index.active_features = - active_lib_features.iter().map(|&(ref s, ..)| s.clone()) - .chain(active_lang_features.iter().map(|&(ref s, ..)| s.clone())) - .collect(); - - { - let krate = tcx.hir().krate(); - let mut annotator = Annotator { - tcx, - index: &mut index, - parent_stab: None, - parent_depr: None, - in_trait_impl: false, - }; - - // If the `-Z force-unstable-if-unmarked` flag is passed then we provide - // a parent stability annotation which indicates that this is private - // with the `rustc_private` feature. This is intended for use when - // compiling librustc crates themselves so we can leverage crates.io - // while maintaining the invariant that all sysroot crates are unstable - // by default and are unable to be used. - if tcx.sess.opts.debugging_opts.force_unstable_if_unmarked { - let reason = "this crate is being loaded from the sysroot, an \ - unstable location; did you mean to load this crate \ - from crates.io via `Cargo.toml` instead?"; - let stability = tcx.intern_stability(Stability { - level: attr::StabilityLevel::Unstable { - reason: Some(Symbol::intern(reason)), - issue: NonZeroU32::new(27812), - is_soft: false, - }, - feature: sym::rustc_private, - rustc_depr: None, - }); - annotator.parent_stab = Some(stability); - } - - annotator.annotate(hir::CRATE_HIR_ID, - &krate.attrs, - krate.span, - AnnotationKind::Required, - |v| intravisit::walk_crate(v, krate)); - } - return index; - } - pub fn local_stability(&self, id: HirId) -> Option<&'tcx Stability> { self.stab_map.get(&id).cloned() } @@ -480,19 +90,6 @@ impl<'tcx> Index<'tcx> { } } -/// Cross-references the feature names of unstable APIs with enabled -/// features and possibly prints errors. -fn check_mod_unstable_api_usage(tcx: TyCtxt<'_>, module_def_id: DefId) { - tcx.hir().visit_item_likes_in_module(module_def_id, &mut Checker { tcx }.as_deep_visitor()); -} - -pub fn provide(providers: &mut Providers<'_>) { - *providers = Providers { - check_mod_unstable_api_usage, - ..*providers - }; -} - pub fn report_unstable( sess: &Session, feature: Symbol, @@ -504,23 +101,19 @@ pub fn report_unstable( ) { let msg = match reason { Some(r) => format!("use of unstable library feature '{}': {}", feature, r), - None => format!("use of unstable library feature '{}'", &feature) + None => format!("use of unstable library feature '{}'", &feature), }; let msp: MultiSpan = span.into(); let cm = &sess.parse_sess.source_map(); - let span_key = msp.primary_span().and_then(|sp: Span| + let span_key = msp.primary_span().and_then(|sp: Span| { if !sp.is_dummy() { let file = cm.lookup_char_pos(sp.lo()).file; - if file.name.is_macros() { - None - } else { - Some(span) - } + if file.name.is_macros() { None } else { Some(span) } } else { None } - ); + }); let error_id = (DiagnosticMessageId::StabilityId(issue), span_key, msg.clone()); let fresh = sess.one_time_diagnostics.borrow_mut().insert(error_id); @@ -559,7 +152,9 @@ pub fn deprecation_in_effect(since: &str) -> bool { } pub fn deprecation_suggestion( - diag: &mut DiagnosticBuilder<'_>, suggestion: Option, span: Span + diag: &mut DiagnosticBuilder<'_>, + suggestion: Option, + span: Span, ) { if let Some(suggestion) = suggestion { diag.span_suggestion( @@ -587,20 +182,25 @@ pub fn rustc_deprecation_message(depr: &RustcDeprecation, path: &str) -> (String let (message, lint) = if deprecation_in_effect(&depr.since.as_str()) { (format!("use of deprecated item '{}'", path), lint::builtin::DEPRECATED) } else { - (format!("use of item '{}' that will be deprecated in future version {}", path, depr.since), - lint::builtin::DEPRECATED_IN_FUTURE) + ( + format!( + "use of item '{}' that will be deprecated in future version {}", + path, depr.since + ), + lint::builtin::DEPRECATED_IN_FUTURE, + ) }; (deprecation_message_common(message, Some(depr.reason)), lint) } pub fn early_report_deprecation( - lint_buffer: &'a mut lint::LintBuffer, + lint_buffer: &'a mut LintBuffer, message: &str, suggestion: Option, lint: &'static Lint, span: Span, ) { - if in_derive_expansion(span) { + if span.in_derive_expansion() { return; } @@ -617,7 +217,7 @@ fn late_report_deprecation( def_id: DefId, hir_id: HirId, ) { - if in_derive_expansion(span) { + if span.in_derive_expansion() { return; } @@ -631,10 +231,6 @@ fn late_report_deprecation( } } -struct Checker<'tcx> { - tcx: TyCtxt<'tcx>, -} - /// Result of `TyCtxt::eval_stability`. pub enum EvalResult { /// We can use the item because it is stable or we provided the @@ -642,48 +238,40 @@ pub enum EvalResult { Allow, /// We cannot use the item because it is unstable and we did not provide the /// corresponding feature gate. - Deny { - feature: Symbol, - reason: Option, - issue: Option, - is_soft: bool, - }, + Deny { feature: Symbol, reason: Option, issue: Option, is_soft: bool }, /// The item does not have the `#[stable]` or `#[unstable]` marker assigned. Unmarked, } -impl<'tcx> TyCtxt<'tcx> { - // See issue #38412. - fn skip_stability_check_due_to_privacy(self, mut def_id: DefId) -> bool { - // Check if `def_id` is a trait method. - match self.def_kind(def_id) { - Some(DefKind::Method) | - Some(DefKind::AssocTy) | - Some(DefKind::AssocConst) => { - if let ty::TraitContainer(trait_def_id) = self.associated_item(def_id).container { - // Trait methods do not declare visibility (even - // for visibility info in cstore). Use containing - // trait instead, so methods of `pub` traits are - // themselves considered `pub`. - def_id = trait_def_id; - } +// See issue #38412. +fn skip_stability_check_due_to_privacy(tcx: TyCtxt<'_>, mut def_id: DefId) -> bool { + // Check if `def_id` is a trait method. + match tcx.def_kind(def_id) { + Some(DefKind::Method) | Some(DefKind::AssocTy) | Some(DefKind::AssocConst) => { + if let ty::TraitContainer(trait_def_id) = tcx.associated_item(def_id).container { + // Trait methods do not declare visibility (even + // for visibility info in cstore). Use containing + // trait instead, so methods of `pub` traits are + // themselves considered `pub`. + def_id = trait_def_id; } - _ => {} } + _ => {} + } - let visibility = self.visibility(def_id); + let visibility = tcx.visibility(def_id); - match visibility { - // Must check stability for `pub` items. - ty::Visibility::Public => false, + match visibility { + // Must check stability for `pub` items. + ty::Visibility::Public => false, - // These are not visible outside crate; therefore - // stability markers are irrelevant, if even present. - ty::Visibility::Restricted(..) | - ty::Visibility::Invisible => true, - } + // These are not visible outside crate; therefore + // stability markers are irrelevant, if even present. + ty::Visibility::Restricted(..) | ty::Visibility::Invisible => true, } +} +impl<'tcx> TyCtxt<'tcx> { /// Evaluates the stability of an item. /// /// Returns `EvalResult::Allow` if the item is stable, or unstable but the corresponding @@ -697,10 +285,10 @@ impl<'tcx> TyCtxt<'tcx> { // Deprecated attributes apply in-crate and cross-crate. if let Some(id) = id { if let Some(depr_entry) = self.lookup_deprecation_entry(def_id) { - let parent_def_id = self.hir().local_def_id( - self.hir().get_parent_item(id)); - let skip = self.lookup_deprecation_entry(parent_def_id) - .map_or(false, |parent_depr| parent_depr.same_origin(&depr_entry)); + let parent_def_id = self.hir().local_def_id(self.hir().get_parent_item(id)); + let skip = self + .lookup_deprecation_entry(parent_def_id) + .map_or(false, |parent_depr| parent_depr.same_origin(&depr_entry)); if !skip { let (message, lint) = @@ -710,17 +298,18 @@ impl<'tcx> TyCtxt<'tcx> { }; } - let is_staged_api = self.lookup_stability(DefId { - index: CRATE_DEF_INDEX, - ..def_id - }).is_some(); + let is_staged_api = + self.lookup_stability(DefId { index: CRATE_DEF_INDEX, ..def_id }).is_some(); if !is_staged_api { return EvalResult::Allow; } let stability = self.lookup_stability(def_id); - debug!("stability: \ - inspecting def_id={:?} span={:?} of stability={:?}", def_id, span, stability); + debug!( + "stability: \ + inspecting def_id={:?} span={:?} of stability={:?}", + def_id, span, stability + ); if let Some(id) = id { if let Some(stability) = stability { @@ -728,7 +317,13 @@ impl<'tcx> TyCtxt<'tcx> { let (message, lint) = rustc_deprecation_message(depr, &self.def_path_str(def_id)); late_report_deprecation( - self, &message, depr.suggestion, lint, span, def_id, id + self, + &message, + depr.suggestion, + lint, + span, + def_id, + id, ); } } @@ -741,7 +336,7 @@ impl<'tcx> TyCtxt<'tcx> { } // Issue #38412: private items lack stability markers. - if self.skip_stability_check_due_to_privacy(def_id) { + if skip_stability_check_due_to_privacy(self, def_id) { return EvalResult::Allow; } @@ -779,9 +374,7 @@ impl<'tcx> TyCtxt<'tcx> { // handled by the lint emitting logic above. EvalResult::Allow } - None => { - EvalResult::Unmarked - } + None => EvalResult::Unmarked, } } @@ -797,8 +390,9 @@ impl<'tcx> TyCtxt<'tcx> { |lint, span, msg: &_| self.lint_hir(lint, id.unwrap_or(hir::CRATE_HIR_ID), span, msg); match self.eval_stability(def_id, id, span) { EvalResult::Allow => {} - EvalResult::Deny { feature, reason, issue, is_soft } => - report_unstable(self.sess, feature, reason, issue, is_soft, span, soft_handler), + EvalResult::Deny { feature, reason, issue, is_soft } => { + report_unstable(self.sess, feature, reason, issue, is_soft, span, soft_handler) + } EvalResult::Unmarked => { // The API could be uncallable for other reasons, for example when a private module // was referenced. @@ -806,193 +400,8 @@ impl<'tcx> TyCtxt<'tcx> { } } } -} - -impl Visitor<'tcx> for Checker<'tcx> { - /// Because stability levels are scoped lexically, we want to walk - /// nested items in the context of the outer item, so enable - /// deep-walking. - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::OnlyBodies(&self.tcx.hir()) - } - - fn visit_item(&mut self, item: &'tcx hir::Item) { - match item.kind { - hir::ItemKind::ExternCrate(_) => { - // compiler-generated `extern crate` items have a dummy span. - if item.span.is_dummy() { return } - - let def_id = self.tcx.hir().local_def_id(item.hir_id); - let cnum = match self.tcx.extern_mod_stmt_cnum(def_id) { - Some(cnum) => cnum, - None => return, - }; - let def_id = DefId { krate: cnum, index: CRATE_DEF_INDEX }; - self.tcx.check_stability(def_id, Some(item.hir_id), item.span); - } - - // For implementations of traits, check the stability of each item - // individually as it's possible to have a stable trait with unstable - // items. - hir::ItemKind::Impl(.., Some(ref t), _, ref impl_item_refs) => { - if let Res::Def(DefKind::Trait, trait_did) = t.path.res { - for impl_item_ref in impl_item_refs { - let impl_item = self.tcx.hir().impl_item(impl_item_ref.id); - let trait_item_def_id = self.tcx.associated_items(trait_did) - .find(|item| item.ident.name == impl_item.ident.name) - .map(|item| item.def_id); - if let Some(def_id) = trait_item_def_id { - // Pass `None` to skip deprecation warnings. - self.tcx.check_stability(def_id, None, impl_item.span); - } - } - } - } - // There's no good place to insert stability check for non-Copy unions, - // so semi-randomly perform it here in stability.rs - hir::ItemKind::Union(..) if !self.tcx.features().untagged_unions => { - let def_id = self.tcx.hir().local_def_id(item.hir_id); - let adt_def = self.tcx.adt_def(def_id); - let ty = self.tcx.type_of(def_id); - - if adt_def.has_dtor(self.tcx) { - feature_err( - &self.tcx.sess.parse_sess, sym::untagged_unions, item.span, - "unions with `Drop` implementations are unstable" - ) - .emit(); - } else { - let param_env = self.tcx.param_env(def_id); - if !param_env.can_type_implement_copy(self.tcx, ty).is_ok() { - feature_err( - &self.tcx.sess.parse_sess, sym::untagged_unions, item.span, - "unions with non-`Copy` fields are unstable" - ) - .emit(); - } - } - } - - _ => (/* pass */) - } - intravisit::walk_item(self, item); - } - - fn visit_path(&mut self, path: &'tcx hir::Path, id: hir::HirId) { - if let Some(def_id) = path.res.opt_def_id() { - self.tcx.check_stability(def_id, Some(id), path.span) - } - intravisit::walk_path(self, path) - } -} - -impl<'tcx> TyCtxt<'tcx> { pub fn lookup_deprecation(self, id: DefId) -> Option { self.lookup_deprecation_entry(id).map(|depr| depr.attr) } } - -/// Given the list of enabled features that were not language features (i.e., that -/// were expected to be library features), and the list of features used from -/// libraries, identify activated features that don't exist and error about them. -pub fn check_unused_or_stable_features(tcx: TyCtxt<'_>) { - let access_levels = &tcx.privacy_access_levels(LOCAL_CRATE); - - if tcx.stability().staged_api[&LOCAL_CRATE] { - let krate = tcx.hir().krate(); - let mut missing = MissingStabilityAnnotations { - tcx, - access_levels, - }; - missing.check_missing_stability(hir::CRATE_HIR_ID, krate.span, "crate"); - intravisit::walk_crate(&mut missing, krate); - krate.visit_all_item_likes(&mut missing.as_deep_visitor()); - } - - let declared_lang_features = &tcx.features().declared_lang_features; - let mut lang_features = FxHashSet::default(); - for &(feature, span, since) in declared_lang_features { - if let Some(since) = since { - // Warn if the user has enabled an already-stable lang feature. - unnecessary_stable_feature_lint(tcx, span, feature, since); - } - if !lang_features.insert(feature) { - // Warn if the user enables a lang feature multiple times. - duplicate_feature_err(tcx.sess, span, feature); - } - } - - let declared_lib_features = &tcx.features().declared_lib_features; - let mut remaining_lib_features = FxHashMap::default(); - for (feature, span) in declared_lib_features { - if remaining_lib_features.contains_key(&feature) { - // Warn if the user enables a lib feature multiple times. - duplicate_feature_err(tcx.sess, *span, *feature); - } - remaining_lib_features.insert(feature, span.clone()); - } - // `stdbuild` has special handling for `libc`, so we need to - // recognise the feature when building std. - // Likewise, libtest is handled specially, so `test` isn't - // available as we'd like it to be. - // FIXME: only remove `libc` when `stdbuild` is active. - // FIXME: remove special casing for `test`. - remaining_lib_features.remove(&Symbol::intern("libc")); - remaining_lib_features.remove(&sym::test); - - let check_features = - |remaining_lib_features: &mut FxHashMap<_, _>, defined_features: &[_]| { - for &(feature, since) in defined_features { - if let Some(since) = since { - if let Some(span) = remaining_lib_features.get(&feature) { - // Warn if the user has enabled an already-stable lib feature. - unnecessary_stable_feature_lint(tcx, *span, feature, since); - } - } - remaining_lib_features.remove(&feature); - if remaining_lib_features.is_empty() { - break; - } - } - }; - - // We always collect the lib features declared in the current crate, even if there are - // no unknown features, because the collection also does feature attribute validation. - let local_defined_features = tcx.lib_features().to_vec(); - if !remaining_lib_features.is_empty() { - check_features(&mut remaining_lib_features, &local_defined_features); - - for &cnum in &*tcx.crates() { - if remaining_lib_features.is_empty() { - break; - } - check_features(&mut remaining_lib_features, tcx.defined_lib_features(cnum)); - } - } - - for (feature, span) in remaining_lib_features { - struct_span_err!(tcx.sess, span, E0635, "unknown feature `{}`", feature).emit(); - } - - // FIXME(#44232): the `used_features` table no longer exists, so we - // don't lint about unused features. We should reenable this one day! -} - -fn unnecessary_stable_feature_lint( - tcx: TyCtxt<'_>, - span: Span, - feature: Symbol, - since: Symbol, -) { - tcx.lint_hir(lint::builtin::STABLE_FEATURES, - hir::CRATE_HIR_ID, - span, - &format!("the feature `{}` has been stable since {} and no longer requires \ - an attribute to enable", feature, since)); -} - -fn duplicate_feature_err(sess: &Session, span: Span, feature: Symbol) { - struct_span_err!(sess, span, E0636, "the feature `{}` has already been declared", feature) - .emit(); -} diff --git a/src/librustc/middle/weak_lang_items.rs b/src/librustc/middle/weak_lang_items.rs index 48c1226232..5571f8f231 100644 --- a/src/librustc/middle/weak_lang_items.rs +++ b/src/librustc/middle/weak_lang_items.rs @@ -1,20 +1,19 @@ //! Validity checking for weak lang items -use crate::session::config; use crate::middle::lang_items; +use crate::session::config; +use crate::hir::map::Map; +use crate::ty::TyCtxt; use rustc_data_structures::fx::FxHashSet; +use rustc_errors::struct_span_err; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; use rustc_target::spec::PanicStrategy; use syntax::ast; -use syntax::symbol::{Symbol, sym}; -use syntax_pos::Span; -use crate::hir::def_id::DefId; -use crate::hir::intravisit::{Visitor, NestedVisitorMap}; -use crate::hir::intravisit; -use crate::hir; -use crate::ty::TyCtxt; - -use rustc_error_codes::*; macro_rules! weak_lang_items { ($($name:ident, $item:ident, $sym:ident;)*) => ( @@ -124,19 +123,24 @@ impl<'a, 'tcx> Context<'a, 'tcx> { self.items.missing.push(lang_items::$item); } } else)* { - span_err!(self.tcx.sess, span, E0264, - "unknown external lang item: `{}`", - name); + struct_span_err!( + self.tcx.sess, span, E0264, + "unknown external lang item: `{}`", + name + ) + .emit(); } } } impl<'a, 'tcx, 'v> Visitor<'v> for Context<'a, 'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'v> { + type Map = Map<'v>; + + fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, Map<'v>> { NestedVisitorMap::None } - fn visit_foreign_item(&mut self, i: &hir::ForeignItem) { + fn visit_foreign_item(&mut self, i: &hir::ForeignItem<'_>) { if let Some((lang_item, _)) = lang_items::extract(&i.attrs) { self.register(lang_item, i.span); } diff --git a/src/librustc/mir/cache.rs b/src/librustc/mir/cache.rs index 0704771f6e..00ecc7a7a0 100644 --- a/src/librustc/mir/cache.rs +++ b/src/librustc/mir/cache.rs @@ -1,10 +1,10 @@ -use rustc_index::vec::IndexVec; -use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; -use rustc_serialize::{Encodable, Encoder, Decodable, Decoder}; use crate::ich::StableHashingContext; use crate::mir::{BasicBlock, BasicBlockData, Body, LocalDecls, Location, Successors}; -use rustc_data_structures::graph::{self, GraphPredecessors, GraphSuccessors}; use rustc_data_structures::graph::dominators::{dominators, Dominators}; +use rustc_data_structures::graph::{self, GraphPredecessors, GraphSuccessors}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_index::vec::IndexVec; +use rustc_serialize::{Decodable, Decoder, Encodable, Encoder}; use std::iter; use std::ops::{Deref, DerefMut, Index, IndexMut}; use std::vec::IntoIter; @@ -34,9 +34,7 @@ impl<'a> HashStable> for Cache { impl Cache { pub fn new() -> Self { - Self { - predecessors: None, - } + Self { predecessors: None } } pub fn invalidate_predecessors(&mut self) { @@ -72,7 +70,7 @@ impl Cache { fn unwrap_predecessor_locations<'a>( &'a self, loc: Location, - body: &'a Body<'a> + body: &'a Body<'a>, ) -> impl Iterator + 'a { let if_zero_locations = if loc.statement_index == 0 { let predecessor_blocks = self.unwrap_predecessors_for(loc.block); @@ -97,7 +95,7 @@ impl Cache { pub fn basic_blocks_mut<'a, 'tcx>( &mut self, - body: &'a mut Body<'tcx> + body: &'a mut Body<'tcx>, ) -> &'a mut IndexVec> { debug!("bbm: Clearing predecessors cache for body at: {:?}", body.span.data()); self.invalidate_predecessors(); @@ -106,7 +104,7 @@ impl Cache { pub fn basic_blocks_and_local_decls_mut<'a, 'tcx>( &mut self, - body: &'a mut Body<'tcx> + body: &'a mut Body<'tcx>, ) -> (&'a mut IndexVec>, &'a mut LocalDecls<'tcx>) { debug!("bbaldm: Clearing predecessors cache for body at: {:?}", body.span.data()); self.invalidate_predecessors(); @@ -122,21 +120,16 @@ pub struct BodyAndCache<'tcx> { impl BodyAndCache<'tcx> { pub fn new(body: Body<'tcx>) -> Self { - Self { - body, - cache: Cache::new(), - } + Self { body, cache: Cache::new() } } } #[macro_export] macro_rules! read_only { - ($body:expr) => { - { - $body.ensure_predecessors(); - $body.unwrap_read_only() - } - }; + ($body:expr) => {{ + $body.ensure_predecessors(); + $body.unwrap_read_only() + }}; } impl BodyAndCache<'tcx> { @@ -157,7 +150,7 @@ impl BodyAndCache<'tcx> { } pub fn basic_blocks_and_local_decls_mut( - &mut self + &mut self, ) -> (&mut IndexVec>, &mut LocalDecls<'tcx>) { self.cache.basic_blocks_and_local_decls_mut(&mut self.body) } @@ -201,11 +194,9 @@ impl ReadOnlyBodyAndCache<'a, 'tcx> { fn new(body: &'a Body<'tcx>, cache: &'a Cache) -> Self { assert!( cache.predecessors.is_some(), - "Cannot construct ReadOnlyBodyAndCache without computed predecessors"); - Self { - body, - cache, - } + "Cannot construct ReadOnlyBodyAndCache without computed predecessors" + ); + Self { body, cache } } pub fn predecessors(&self) -> &IndexVec> { @@ -239,10 +230,7 @@ impl graph::GraphPredecessors<'graph> for ReadOnlyBodyAndCache<'a, 'tcx> { } impl graph::WithPredecessors for ReadOnlyBodyAndCache<'a, 'tcx> { - fn predecessors( - &self, - node: Self::Node, - ) -> >::Iter { + fn predecessors(&self, node: Self::Node) -> >::Iter { self.cache.unwrap_predecessors_for(node).to_vec().into_iter() } } @@ -260,10 +248,7 @@ impl graph::WithStartNode for ReadOnlyBodyAndCache<'a, 'tcx> { } impl graph::WithSuccessors for ReadOnlyBodyAndCache<'a, 'tcx> { - fn successors( - &self, - node: Self::Node, - ) -> >::Iter { + fn successors(&self, node: Self::Node) -> >::Iter { self.body.successors(node) } } @@ -273,7 +258,6 @@ impl<'a, 'b, 'tcx> graph::GraphSuccessors<'b> for ReadOnlyBodyAndCache<'a, 'tcx> type Iter = iter::Cloned>; } - impl Deref for ReadOnlyBodyAndCache<'a, 'tcx> { type Target = &'a Body<'tcx>; diff --git a/src/librustc/mir/interpret/allocation.rs b/src/librustc/mir/interpret/allocation.rs index f849361e08..a06b23367e 100644 --- a/src/librustc/mir/interpret/allocation.rs +++ b/src/librustc/mir/interpret/allocation.rs @@ -1,17 +1,17 @@ //! The virtual memory representation of the MIR interpreter. use super::{ - Pointer, InterpResult, AllocId, ScalarMaybeUndef, write_target_uint, read_target_uint, Scalar, + read_target_uint, write_target_uint, AllocId, InterpResult, Pointer, Scalar, ScalarMaybeUndef, }; -use crate::ty::layout::{Size, Align}; +use crate::ty::layout::{Align, Size}; use rustc_data_structures::sorted_map::SortedMap; use rustc_target::abi::HasDataLayout; -use syntax::ast::Mutability; -use std::iter; -use std::ops::{Range, Deref, DerefMut}; use std::borrow::Cow; +use std::iter; +use std::ops::{Deref, DerefMut, Range}; +use syntax::ast::Mutability; // NOTE: When adding new fields, make sure to adjust the `Snapshot` impl in // `src/librustc_mir/interpret/snapshot.rs`. @@ -25,9 +25,9 @@ use std::borrow::Cow; Hash, RustcEncodable, RustcDecodable, - HashStable, + HashStable )] -pub struct Allocation { +pub struct Allocation { /// The actual bytes of the allocation. /// Note that the bytes of a pointer represent the offset of the pointer. bytes: Vec, @@ -92,7 +92,7 @@ pub trait AllocationExtra: ::std::fmt::Debug + Clone { } // For `Tag = ()` and no extra state, we have a trivial implementation. -impl AllocationExtra<()> for () { } +impl AllocationExtra<()> for () {} // The constructors are all without extra; the extra gets added by a machine hook later. impl Allocation { @@ -106,7 +106,7 @@ impl Allocation { undef_mask: UndefMask::new(size, true), size, align, - mutability: Mutability::Immutable, + mutability: Mutability::Not, extra: (), } } @@ -123,7 +123,7 @@ impl Allocation { undef_mask: UndefMask::new(size, false), size, align, - mutability: Mutability::Mutable, + mutability: Mutability::Mut, extra: (), } } @@ -140,14 +140,15 @@ impl Allocation<(), ()> { bytes: self.bytes, size: self.size, relocations: Relocations::from_presorted( - self.relocations.iter() + self.relocations + .iter() // The allocations in the relocations (pointers stored *inside* this allocation) // all get the base pointer tag. .map(|&(offset, ((), alloc))| { let tag = tagger(alloc); (offset, (tag, alloc)) }) - .collect() + .collect(), ), undef_mask: self.undef_mask, align: self.align, @@ -189,21 +190,20 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { /// Just a small local helper function to avoid a bit of code repetition. /// Returns the range of this allocation that was meant. #[inline] - fn check_bounds( - &self, - offset: Size, - size: Size - ) -> Range { + fn check_bounds(&self, offset: Size, size: Size) -> Range { let end = offset + size; // This does overflow checking. assert_eq!( - end.bytes() as usize as u64, end.bytes(), + end.bytes() as usize as u64, + end.bytes(), "cannot handle this access on this host architecture" ); let end = end.bytes() as usize; assert!( end <= self.len(), "Out-of-bounds access at offset {}, size {} in allocation of size {}", - offset.bytes(), size.bytes(), self.len() + offset.bytes(), + size.bytes(), + self.len() ); (offset.bytes() as usize)..end } @@ -223,8 +223,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { ptr: Pointer, size: Size, check_defined_and_ptr: bool, - ) -> InterpResult<'tcx, &[u8]> - { + ) -> InterpResult<'tcx, &[u8]> { let range = self.check_bounds(ptr.offset, size); if check_defined_and_ptr { @@ -252,8 +251,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { cx: &impl HasDataLayout, ptr: Pointer, size: Size, - ) -> InterpResult<'tcx, &[u8]> - { + ) -> InterpResult<'tcx, &[u8]> { self.get_bytes_internal(cx, ptr, size, true) } @@ -267,8 +265,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { cx: &impl HasDataLayout, ptr: Pointer, size: Size, - ) -> InterpResult<'tcx, &[u8]> - { + ) -> InterpResult<'tcx, &[u8]> { self.get_bytes_internal(cx, ptr, size, false) } @@ -283,8 +280,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { cx: &impl HasDataLayout, ptr: Pointer, size: Size, - ) -> InterpResult<'tcx, &mut [u8]> - { + ) -> InterpResult<'tcx, &mut [u8]> { let range = self.check_bounds(ptr.offset, size); self.mark_definedness(ptr, size, true); @@ -306,8 +302,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { &self, cx: &impl HasDataLayout, ptr: Pointer, - ) -> InterpResult<'tcx, &[u8]> - { + ) -> InterpResult<'tcx, &[u8]> { assert_eq!(ptr.offset.bytes() as usize as u64, ptr.offset.bytes()); let offset = ptr.offset.bytes() as usize; Ok(match self.bytes[offset..].iter().position(|&c| c == 0) { @@ -332,8 +327,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { ptr: Pointer, size: Size, allow_ptr_and_undef: bool, - ) -> InterpResult<'tcx> - { + ) -> InterpResult<'tcx> { // Check bounds and relocations on the edges. self.get_bytes_with_undef_and_ptr(cx, ptr, size)?; // Check undef and ptr. @@ -352,9 +346,8 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { &mut self, cx: &impl HasDataLayout, ptr: Pointer, - src: impl IntoIterator, - ) -> InterpResult<'tcx> - { + src: impl IntoIterator, + ) -> InterpResult<'tcx> { let mut src = src.into_iter(); let (lower, upper) = src.size_hint(); let len = upper.expect("can only write bounded iterators"); @@ -382,9 +375,8 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { &self, cx: &impl HasDataLayout, ptr: Pointer, - size: Size - ) -> InterpResult<'tcx, ScalarMaybeUndef> - { + size: Size, + ) -> InterpResult<'tcx, ScalarMaybeUndef> { // `get_bytes_unchecked` tests relocation edges. let bytes = self.get_bytes_with_undef_and_ptr(cx, ptr, size)?; // Undef check happens *after* we established that the alignment is correct. @@ -404,9 +396,9 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { match self.relocations.get(&ptr.offset) { Some(&(tag, alloc_id)) => { let ptr = Pointer::new_with_tag(alloc_id, Size::from_bytes(bits as u64), tag); - return Ok(ScalarMaybeUndef::Scalar(ptr.into())) + return Ok(ScalarMaybeUndef::Scalar(ptr.into())); } - None => {}, + None => {} } } // We don't. Just return the bits. @@ -421,8 +413,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { &self, cx: &impl HasDataLayout, ptr: Pointer, - ) -> InterpResult<'tcx, ScalarMaybeUndef> - { + ) -> InterpResult<'tcx, ScalarMaybeUndef> { self.read_scalar(cx, ptr, cx.data_layout().pointer_size) } @@ -441,14 +432,13 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { ptr: Pointer, val: ScalarMaybeUndef, type_size: Size, - ) -> InterpResult<'tcx> - { + ) -> InterpResult<'tcx> { let val = match val { ScalarMaybeUndef::Scalar(scalar) => scalar, ScalarMaybeUndef::Undef => { self.mark_definedness(ptr, type_size, false); return Ok(()); - }, + } }; let bytes = match val.to_bits_or_ptr(type_size, cx) { @@ -463,10 +453,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { // See if we have to also write a relocation. match val { Scalar::Ptr(val) => { - self.relocations.insert( - ptr.offset, - (val.tag, val.alloc_id), - ); + self.relocations.insert(ptr.offset, (val.tag, val.alloc_id)); } _ => {} } @@ -482,9 +469,8 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { &mut self, cx: &impl HasDataLayout, ptr: Pointer, - val: ScalarMaybeUndef - ) -> InterpResult<'tcx> - { + val: ScalarMaybeUndef, + ) -> InterpResult<'tcx> { let ptr_size = cx.data_layout().pointer_size; self.write_scalar(cx, ptr.into(), val, ptr_size) } @@ -541,8 +527,10 @@ impl<'tcx, Tag: Copy, Extra> Allocation { return Ok(()); } - (relocations.first().unwrap().0, - relocations.last().unwrap().0 + cx.data_layout().pointer_size) + ( + relocations.first().unwrap().0, + relocations.last().unwrap().0 + cx.data_layout().pointer_size, + ) }; let start = ptr.offset; let end = start + size; @@ -577,33 +565,22 @@ impl<'tcx, Tag: Copy, Extra> Allocation { } } - /// Undefined bytes. impl<'tcx, Tag, Extra> Allocation { /// Checks that a range of bytes is defined. If not, returns the `ReadUndefBytes` /// error which will report the first byte which is undefined. #[inline] fn check_defined(&self, ptr: Pointer, size: Size) -> InterpResult<'tcx> { - self.undef_mask.is_range_defined( - ptr.offset, - ptr.offset + size, - ).or_else(|idx| throw_unsup!(ReadUndefBytes(idx))) + self.undef_mask + .is_range_defined(ptr.offset, ptr.offset + size) + .or_else(|idx| throw_unsup!(ReadUndefBytes(idx))) } - pub fn mark_definedness( - &mut self, - ptr: Pointer, - size: Size, - new_state: bool, - ) { + pub fn mark_definedness(&mut self, ptr: Pointer, size: Size, new_state: bool) { if size.bytes() == 0 { return; } - self.undef_mask.set_range( - ptr.offset, - ptr.offset + size, - new_state, - ); + self.undef_mask.set_range(ptr.offset, ptr.offset + size, new_state); } } @@ -614,17 +591,21 @@ pub struct AllocationDefinedness { initial: bool, /// The lengths of ranges that are run-length encoded. /// The definedness of the ranges alternate starting with `initial`. - ranges: smallvec::SmallVec::<[u64; 1]>, + ranges: smallvec::SmallVec<[u64; 1]>, +} + +impl AllocationDefinedness { + pub fn all_bytes_undef(&self) -> bool { + // The `ranges` are run-length encoded and of alternating definedness. + // So if `ranges.len() > 1` then the second block is a range of defined. + self.initial == false && self.ranges.len() == 1 + } } /// Transferring the definedness mask to other allocations. impl Allocation { /// Creates a run-length encoding of the undef mask. - pub fn compress_undef_range( - &self, - src: Pointer, - size: Size, - ) -> AllocationDefinedness { + pub fn compress_undef_range(&self, src: Pointer, size: Size) -> AllocationDefinedness { // Since we are copying `size` bytes from `src` to `dest + i * size` (`for i in 0..repeat`), // a naive undef mask copying algorithm would repeatedly have to read the undef mask from // the source and write it to the destination. Even if we optimized the memory accesses, @@ -655,7 +636,7 @@ impl Allocation { ranges.push(cur_len); - AllocationDefinedness { ranges, initial, } + AllocationDefinedness { ranges, initial } } /// Applies multiple instances of the run-length encoding to the undef mask. @@ -747,33 +728,24 @@ impl Allocation { let mut new_relocations = Vec::with_capacity(relocations.len() * (length as usize)); for i in 0..length { - new_relocations.extend( - relocations - .iter() - .map(|&(offset, reloc)| { - // compute offset for current repetition - let dest_offset = dest.offset + (i * size); - ( - // shift offsets from source allocation to destination allocation - offset + dest_offset - src.offset, - reloc, - ) - }) - ); + new_relocations.extend(relocations.iter().map(|&(offset, reloc)| { + // compute offset for current repetition + let dest_offset = dest.offset + (i * size); + ( + // shift offsets from source allocation to destination allocation + offset + dest_offset - src.offset, + reloc, + ) + })); } - AllocationRelocations { - relative_relocations: new_relocations, - } + AllocationRelocations { relative_relocations: new_relocations } } /// Applies a relocation copy. /// The affected range, as defined in the parameters to `prepare_relocation_copy` is expected /// to be clear of relocations. - pub fn mark_relocation_range( - &mut self, - relocations: AllocationRelocations, - ) { + pub fn mark_relocation_range(&mut self, relocations: AllocationRelocations) { self.relocations.insert_presorted(relocations.relative_relocations); } } @@ -786,8 +758,18 @@ type Block = u64; /// A bitmask where each bit refers to the byte with the same index. If the bit is `true`, the byte /// is defined. If it is `false` the byte is undefined. -#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Hash, - RustcEncodable, RustcDecodable, HashStable)] +#[derive( + Clone, + Debug, + Eq, + PartialEq, + PartialOrd, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + HashStable +)] pub struct UndefMask { blocks: Vec, len: Size, @@ -797,10 +779,7 @@ impl UndefMask { pub const BLOCK_SIZE: u64 = 64; pub fn new(size: Size, state: bool) -> Self { - let mut m = UndefMask { - blocks: vec![], - len: Size::ZERO, - }; + let mut m = UndefMask { blocks: vec![], len: Size::ZERO }; m.grow(size, state); m } @@ -816,13 +795,11 @@ impl UndefMask { } // FIXME(oli-obk): optimize this for allocations larger than a block. - let idx = (start.bytes()..end.bytes()) - .map(|i| Size::from_bytes(i)) - .find(|&i| !self.get(i)); + let idx = (start.bytes()..end.bytes()).map(|i| Size::from_bytes(i)).find(|&i| !self.get(i)); match idx { Some(idx) => Err(idx), - None => Ok(()) + None => Ok(()), } } @@ -861,7 +838,7 @@ impl UndefMask { self.blocks[blockb] |= u64::max_value() >> (64 - bitb); } // Fill in all the other blocks (much faster than one bit at a time). - for block in (blocka + 1) .. blockb { + for block in (blocka + 1)..blockb { self.blocks[block] = u64::max_value(); } } else { @@ -872,7 +849,7 @@ impl UndefMask { self.blocks[blockb] &= !(u64::max_value() >> (64 - bitb)); } // Fill in all the other blocks (much faster than one bit at a time). - for block in (blocka + 1) .. blockb { + for block in (blocka + 1)..blockb { self.blocks[block] = 0; } } diff --git a/src/librustc/mir/interpret/error.rs b/src/librustc/mir/interpret/error.rs index 0dec7c071b..349dbd74ad 100644 --- a/src/librustc/mir/interpret/error.rs +++ b/src/librustc/mir/interpret/error.rs @@ -1,22 +1,20 @@ -use super::{RawConst, Pointer, CheckInAllocMsg, ScalarMaybeUndef}; +use super::{CheckInAllocMsg, Pointer, RawConst, ScalarMaybeUndef}; -use crate::hir; use crate::hir::map::definitions::DefPathData; use crate::mir; -use crate::ty::{self, Ty, layout}; -use crate::ty::layout::{Size, Align, LayoutError}; +use crate::ty::layout::{Align, LayoutError, Size}; use crate::ty::query::TyCtxtAt; +use crate::ty::{self, layout, Ty}; use backtrace::Backtrace; -use errors::DiagnosticBuilder; +use hir::GeneratorKind; +use rustc_errors::{struct_span_err, DiagnosticBuilder}; +use rustc_hir as hir; use rustc_macros::HashStable; +use rustc_span::symbol::Symbol; +use rustc_span::{Pos, Span}; use rustc_target::spec::abi::Abi; -use syntax_pos::{Pos, Span}; -use syntax::symbol::Symbol; -use hir::GeneratorKind; -use std::{fmt, env, any::Any}; - -use rustc_error_codes::*; +use std::{any::Any, env, fmt}; #[derive(Debug, Copy, Clone, PartialEq, Eq, HashStable, RustcEncodable, RustcDecodable)] pub enum ErrorHandled { @@ -30,9 +28,11 @@ pub enum ErrorHandled { impl ErrorHandled { pub fn assert_reported(self) { match self { - ErrorHandled::Reported => {}, - ErrorHandled::TooGeneric => bug!("MIR interpretation failed without reporting an error \ - even though it was fully monomorphized"), + ErrorHandled::Reported => {} + ErrorHandled::TooGeneric => bug!( + "MIR interpretation failed without reporting an error \ + even though it was fully monomorphized" + ), } } } @@ -93,7 +93,7 @@ impl<'tcx> ConstEvalErr<'tcx> { Ok(mut err) => { err.emit(); ErrorHandled::Reported - }, + } Err(err) => err, } } @@ -105,11 +105,7 @@ impl<'tcx> ConstEvalErr<'tcx> { lint_root: hir::HirId, span: Option, ) -> ErrorHandled { - let lint = self.struct_generic( - tcx, - message, - Some(lint_root), - ); + let lint = self.struct_generic(tcx, message, Some(lint_root)); match lint { Ok(mut lint) => { if let Some(span) = span { @@ -126,7 +122,7 @@ impl<'tcx> ConstEvalErr<'tcx> { } lint.emit(); ErrorHandled::Reported - }, + } Err(err) => err, } } @@ -139,24 +135,24 @@ impl<'tcx> ConstEvalErr<'tcx> { ) -> Result, ErrorHandled> { let must_error = match self.error { InterpError::MachineStop(_) => bug!("CTFE does not stop"), - err_inval!(Layout(LayoutError::Unknown(_))) | - err_inval!(TooGeneric) => - return Err(ErrorHandled::TooGeneric), - err_inval!(TypeckError) => - return Err(ErrorHandled::Reported), + err_inval!(Layout(LayoutError::Unknown(_))) | err_inval!(TooGeneric) => { + return Err(ErrorHandled::TooGeneric); + } + err_inval!(TypeckError) => return Err(ErrorHandled::Reported), err_inval!(Layout(LayoutError::SizeOverflow(_))) => true, _ => false, }; trace!("reporting const eval failure at {:?}", self.span); let mut err = if let (Some(lint_root), false) = (lint_root, must_error) { - let hir_id = self.stacktrace + let hir_id = self + .stacktrace .iter() .rev() .filter_map(|frame| frame.lint_root) .next() .unwrap_or(lint_root); tcx.struct_span_lint_hir( - crate::rustc::lint::builtin::CONST_ERR, + rustc_session::lint::builtin::CONST_ERR, hir_id, tcx.span, message, @@ -173,7 +169,7 @@ impl<'tcx> ConstEvalErr<'tcx> { // is sometimes empty because we create "fake" eval contexts in CTFE to do work // on constant values. if self.stacktrace.len() > 0 { - for frame_info in &self.stacktrace[..self.stacktrace.len()-1] { + for frame_info in &self.stacktrace[..self.stacktrace.len() - 1] { err.span_label(frame_info.call_site, frame_info.to_string()); } } @@ -196,7 +192,6 @@ pub struct InterpErrorInfo<'tcx> { backtrace: Option>, } - impl fmt::Display for InterpErrorInfo<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.kind) @@ -221,7 +216,8 @@ impl From for InterpErrorInfo<'tcx> { match err { ErrorHandled::Reported => err_inval!(ReferencedConstant), ErrorHandled::TooGeneric => err_inval!(TooGeneric), - }.into() + } + .into() } } @@ -239,28 +235,17 @@ impl<'tcx> From> for InterpErrorInfo<'tcx> { } else { Some(Box::new(backtrace)) } - }, + } _ => None, }; - InterpErrorInfo { - kind, - backtrace, - } + InterpErrorInfo { kind, backtrace } } } #[derive(Clone, RustcEncodable, RustcDecodable, HashStable, PartialEq)] pub enum PanicInfo { - Panic { - msg: Symbol, - line: u32, - col: u32, - file: Symbol, - }, - BoundsCheck { - len: O, - index: O, - }, + Panic { msg: Symbol, line: u32, col: u32, file: Symbol }, + BoundsCheck { len: O, index: O }, Overflow(mir::BinOp), OverflowNeg, DivisionByZero, @@ -279,38 +264,22 @@ impl PanicInfo { pub fn description(&self) -> &'static str { use PanicInfo::*; match self { - Overflow(mir::BinOp::Add) => - "attempt to add with overflow", - Overflow(mir::BinOp::Sub) => - "attempt to subtract with overflow", - Overflow(mir::BinOp::Mul) => - "attempt to multiply with overflow", - Overflow(mir::BinOp::Div) => - "attempt to divide with overflow", - Overflow(mir::BinOp::Rem) => - "attempt to calculate the remainder with overflow", - OverflowNeg => - "attempt to negate with overflow", - Overflow(mir::BinOp::Shr) => - "attempt to shift right with overflow", - Overflow(mir::BinOp::Shl) => - "attempt to shift left with overflow", - Overflow(op) => - bug!("{:?} cannot overflow", op), - DivisionByZero => - "attempt to divide by zero", - RemainderByZero => - "attempt to calculate the remainder with a divisor of zero", - ResumedAfterReturn(GeneratorKind::Gen) => - "generator resumed after completion", - ResumedAfterReturn(GeneratorKind::Async(_)) => - "`async fn` resumed after completion", - ResumedAfterPanic(GeneratorKind::Gen) => - "generator resumed after panicking", - ResumedAfterPanic(GeneratorKind::Async(_)) => - "`async fn` resumed after panicking", - Panic { .. } | BoundsCheck { .. } => - bug!("Unexpected PanicInfo"), + Overflow(mir::BinOp::Add) => "attempt to add with overflow", + Overflow(mir::BinOp::Sub) => "attempt to subtract with overflow", + Overflow(mir::BinOp::Mul) => "attempt to multiply with overflow", + Overflow(mir::BinOp::Div) => "attempt to divide with overflow", + Overflow(mir::BinOp::Rem) => "attempt to calculate the remainder with overflow", + OverflowNeg => "attempt to negate with overflow", + Overflow(mir::BinOp::Shr) => "attempt to shift right with overflow", + Overflow(mir::BinOp::Shl) => "attempt to shift left with overflow", + Overflow(op) => bug!("{:?} cannot overflow", op), + DivisionByZero => "attempt to divide by zero", + RemainderByZero => "attempt to calculate the remainder with a divisor of zero", + ResumedAfterReturn(GeneratorKind::Gen) => "generator resumed after completion", + ResumedAfterReturn(GeneratorKind::Async(_)) => "`async fn` resumed after completion", + ResumedAfterPanic(GeneratorKind::Gen) => "generator resumed after panicking", + ResumedAfterPanic(GeneratorKind::Async(_)) => "`async fn` resumed after panicking", + Panic { .. } | BoundsCheck { .. } => bug!("Unexpected PanicInfo"), } } } @@ -319,12 +288,13 @@ impl fmt::Debug for PanicInfo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use PanicInfo::*; match self { - Panic { ref msg, line, col, ref file } => - write!(f, "the evaluated program panicked at '{}', {}:{}:{}", msg, file, line, col), - BoundsCheck { ref len, ref index } => - write!(f, "index out of bounds: the len is {:?} but the index is {:?}", len, index), - _ => - write!(f, "{}", self.description()), + Panic { ref msg, line, col, ref file } => { + write!(f, "the evaluated program panicked at '{}', {}:{}:{}", msg, file, line, col) + } + BoundsCheck { ref len, ref index } => { + write!(f, "index out of bounds: the len is {:?} but the index is {:?}", len, index) + } + _ => write!(f, "{}", self.description()), } } } @@ -348,14 +318,10 @@ impl fmt::Debug for InvalidProgramInfo<'tcx> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use InvalidProgramInfo::*; match self { - TooGeneric => - write!(f, "encountered overly generic constant"), - ReferencedConstant => - write!(f, "referenced constant has errors"), - TypeckError => - write!(f, "encountered constants with type errors, stopping evaluation"), - Layout(ref err) => - write!(f, "{}", err), + TooGeneric => write!(f, "encountered overly generic constant"), + ReferencedConstant => write!(f, "referenced constant has errors"), + TypeckError => write!(f, "encountered constants with type errors, stopping evaluation"), + Layout(ref err) => write!(f, "{}", err), } } } @@ -384,21 +350,17 @@ impl fmt::Debug for UndefinedBehaviorInfo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use UndefinedBehaviorInfo::*; match self { - Ub(msg) | UbExperimental(msg) => - write!(f, "{}", msg), - Unreachable => - write!(f, "entering unreachable code"), - InvalidDiscriminant(val) => - write!(f, "encountering invalid enum discriminant {}", val), - BoundsCheckFailed { ref len, ref index } => - write!(f, "indexing out of bounds: the len is {:?} but the index is {:?}", - len, index), - DivisionByZero => - write!(f, "dividing by zero"), - RemainderByZero => - write!(f, "calculating the remainder with a divisor of zero"), - PointerArithOverflow => - write!(f, "overflowing in-bounds pointer arithmetic"), + Ub(msg) | UbExperimental(msg) => write!(f, "{}", msg), + Unreachable => write!(f, "entering unreachable code"), + InvalidDiscriminant(val) => write!(f, "encountering invalid enum discriminant {}", val), + BoundsCheckFailed { ref len, ref index } => write!( + f, + "indexing out of bounds: the len is {:?} but the index is {:?}", + len, index + ), + DivisionByZero => write!(f, "dividing by zero"), + RemainderByZero => write!(f, "calculating the remainder with a divisor of zero"), + PointerArithOverflow => write!(f, "overflowing in-bounds pointer arithmetic"), } } } @@ -468,118 +430,145 @@ pub enum UnsupportedOpInfo<'tcx> { HeapAllocNonPowerOfTwoAlignment(u64), ReadFromReturnPointer, PathNotFound(Vec), + TransmuteSizeDiff(Ty<'tcx>, Ty<'tcx>), } impl fmt::Debug for UnsupportedOpInfo<'tcx> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use UnsupportedOpInfo::*; match self { - PointerOutOfBounds { ptr, msg, allocation_size } => { - write!(f, "{} failed: pointer must be in-bounds at offset {}, \ + PointerOutOfBounds { ptr, msg, allocation_size } => write!( + f, + "{} failed: pointer must be in-bounds at offset {}, \ but is outside bounds of allocation {} which has size {}", - msg, ptr.offset.bytes(), ptr.alloc_id, allocation_size.bytes()) - }, - ValidationFailure(ref err) => { - write!(f, "type validation failed: {}", err) - } + msg, + ptr.offset.bytes(), + ptr.alloc_id, + allocation_size.bytes() + ), + ValidationFailure(ref err) => write!(f, "type validation failed: {}", err), NoMirFor(ref func) => write!(f, "no MIR for `{}`", func), - FunctionAbiMismatch(caller_abi, callee_abi) => - write!(f, "tried to call a function with ABI {:?} using caller ABI {:?}", - callee_abi, caller_abi), - FunctionArgMismatch(caller_ty, callee_ty) => - write!(f, "tried to call a function with argument of type {:?} \ + FunctionAbiMismatch(caller_abi, callee_abi) => write!( + f, + "tried to call a function with ABI {:?} using caller ABI {:?}", + callee_abi, caller_abi + ), + FunctionArgMismatch(caller_ty, callee_ty) => write!( + f, + "tried to call a function with argument of type {:?} \ passing data of type {:?}", - callee_ty, caller_ty), - FunctionRetMismatch(caller_ty, callee_ty) => - write!(f, "tried to call a function with return type {:?} \ + callee_ty, caller_ty + ), + TransmuteSizeDiff(from_ty, to_ty) => write!( + f, + "tried to transmute from {:?} to {:?}, but their sizes differed", + from_ty, to_ty + ), + FunctionRetMismatch(caller_ty, callee_ty) => write!( + f, + "tried to call a function with return type {:?} \ passing return place of type {:?}", - callee_ty, caller_ty), - FunctionArgCountMismatch => - write!(f, "tried to call a function with incorrect number of arguments"), - ReallocatedWrongMemoryKind(ref old, ref new) => - write!(f, "tried to reallocate memory from `{}` to `{}`", old, new), - DeallocatedWrongMemoryKind(ref old, ref new) => - write!(f, "tried to deallocate `{}` memory but gave `{}` as the kind", old, new), - InvalidChar(c) => - write!(f, "tried to interpret an invalid 32-bit value as a char: {}", c), - AlignmentCheckFailed { required, has } => - write!(f, "tried to access memory with alignment {}, but alignment {} is required", - has.bytes(), required.bytes()), - TypeNotPrimitive(ty) => - write!(f, "expected primitive type, got {}", ty), - PathNotFound(ref path) => - write!(f, "cannot find path {:?}", path), - IncorrectAllocationInformation(size, size2, align, align2) => - write!(f, "incorrect alloc info: expected size {} and align {}, \ + callee_ty, caller_ty + ), + FunctionArgCountMismatch => { + write!(f, "tried to call a function with incorrect number of arguments") + } + ReallocatedWrongMemoryKind(ref old, ref new) => { + write!(f, "tried to reallocate memory from `{}` to `{}`", old, new) + } + DeallocatedWrongMemoryKind(ref old, ref new) => { + write!(f, "tried to deallocate `{}` memory but gave `{}` as the kind", old, new) + } + InvalidChar(c) => { + write!(f, "tried to interpret an invalid 32-bit value as a char: {}", c) + } + AlignmentCheckFailed { required, has } => write!( + f, + "tried to access memory with alignment {}, but alignment {} is required", + has.bytes(), + required.bytes() + ), + TypeNotPrimitive(ty) => write!(f, "expected primitive type, got {}", ty), + PathNotFound(ref path) => write!(f, "cannot find path {:?}", path), + IncorrectAllocationInformation(size, size2, align, align2) => write!( + f, + "incorrect alloc info: expected size {} and align {}, \ got size {} and align {}", - size.bytes(), align.bytes(), size2.bytes(), align2.bytes()), - InvalidMemoryAccess => - write!(f, "tried to access memory through an invalid pointer"), - DanglingPointerDeref => - write!(f, "dangling pointer was dereferenced"), - DoubleFree => - write!(f, "tried to deallocate dangling pointer"), - InvalidFunctionPointer => - write!(f, "tried to use a function pointer after offsetting it"), - InvalidBool => - write!(f, "invalid boolean value read"), - InvalidNullPointerUsage => - write!(f, "invalid use of NULL pointer"), - ReadPointerAsBytes => - write!(f, "a raw memory access tried to access part of a pointer value as raw \ - bytes"), - ReadBytesAsPointer => - write!(f, "a memory access tried to interpret some bytes as a pointer"), - ReadForeignStatic => - write!(f, "tried to read from foreign (extern) static"), - InvalidPointerMath => - write!(f, "attempted to do invalid arithmetic on pointers that would leak base \ - addresses, e.g., comparing pointers into different allocations"), - DeadLocal => - write!(f, "tried to access a dead local variable"), - DerefFunctionPointer => - write!(f, "tried to dereference a function pointer"), - ExecuteMemory => - write!(f, "tried to treat a memory pointer as a function pointer"), - OutOfTls => - write!(f, "reached the maximum number of representable TLS keys"), - TlsOutOfBounds => - write!(f, "accessed an invalid (unallocated) TLS key"), - CalledClosureAsFunction => - write!(f, "tried to call a closure through a function pointer"), - VtableForArgumentlessMethod => - write!(f, "tried to call a vtable function without arguments"), - ModifiedConstantMemory => - write!(f, "tried to modify constant memory"), - ModifiedStatic => - write!(f, "tried to modify a static's initial value from another static's \ - initializer"), - ReallocateNonBasePtr => - write!(f, "tried to reallocate with a pointer not to the beginning of an \ - existing object"), - DeallocateNonBasePtr => - write!(f, "tried to deallocate with a pointer not to the beginning of an \ - existing object"), - HeapAllocZeroBytes => - write!(f, "tried to re-, de- or allocate zero bytes on the heap"), - ReadFromReturnPointer => - write!(f, "tried to read from the return pointer"), - UnimplementedTraitSelection => - write!(f, "there were unresolved type arguments during trait selection"), - InvalidBoolOp(_) => - write!(f, "invalid boolean operation"), - UnterminatedCString(_) => - write!(f, "attempted to get length of a null-terminated string, but no null \ - found before end of allocation"), - ReadUndefBytes(_) => - write!(f, "attempted to read undefined bytes"), - HeapAllocNonPowerOfTwoAlignment(_) => - write!(f, "tried to re-, de-, or allocate heap memory with alignment that is \ - not a power of two"), - Unsupported(ref msg) => - write!(f, "{}", msg), - ConstPropUnsupported(ref msg) => - write!(f, "Constant propagation encountered an unsupported situation: {}", msg), + size.bytes(), + align.bytes(), + size2.bytes(), + align2.bytes() + ), + InvalidMemoryAccess => write!(f, "tried to access memory through an invalid pointer"), + DanglingPointerDeref => write!(f, "dangling pointer was dereferenced"), + DoubleFree => write!(f, "tried to deallocate dangling pointer"), + InvalidFunctionPointer => { + write!(f, "tried to use a function pointer after offsetting it") + } + InvalidBool => write!(f, "invalid boolean value read"), + InvalidNullPointerUsage => write!(f, "invalid use of NULL pointer"), + ReadPointerAsBytes => write!( + f, + "a raw memory access tried to access part of a pointer value as raw \ + bytes" + ), + ReadBytesAsPointer => { + write!(f, "a memory access tried to interpret some bytes as a pointer") + } + ReadForeignStatic => write!(f, "tried to read from foreign (extern) static"), + InvalidPointerMath => write!( + f, + "attempted to do invalid arithmetic on pointers that would leak base \ + addresses, e.g., comparing pointers into different allocations" + ), + DeadLocal => write!(f, "tried to access a dead local variable"), + DerefFunctionPointer => write!(f, "tried to dereference a function pointer"), + ExecuteMemory => write!(f, "tried to treat a memory pointer as a function pointer"), + OutOfTls => write!(f, "reached the maximum number of representable TLS keys"), + TlsOutOfBounds => write!(f, "accessed an invalid (unallocated) TLS key"), + CalledClosureAsFunction => { + write!(f, "tried to call a closure through a function pointer") + } + VtableForArgumentlessMethod => { + write!(f, "tried to call a vtable function without arguments") + } + ModifiedConstantMemory => write!(f, "tried to modify constant memory"), + ModifiedStatic => write!( + f, + "tried to modify a static's initial value from another static's \ + initializer" + ), + ReallocateNonBasePtr => write!( + f, + "tried to reallocate with a pointer not to the beginning of an \ + existing object" + ), + DeallocateNonBasePtr => write!( + f, + "tried to deallocate with a pointer not to the beginning of an \ + existing object" + ), + HeapAllocZeroBytes => write!(f, "tried to re-, de- or allocate zero bytes on the heap"), + ReadFromReturnPointer => write!(f, "tried to read from the return pointer"), + UnimplementedTraitSelection => { + write!(f, "there were unresolved type arguments during trait selection") + } + InvalidBoolOp(_) => write!(f, "invalid boolean operation"), + UnterminatedCString(_) => write!( + f, + "attempted to get length of a null-terminated string, but no null \ + found before end of allocation" + ), + ReadUndefBytes(_) => write!(f, "attempted to read undefined bytes"), + HeapAllocNonPowerOfTwoAlignment(_) => write!( + f, + "tried to re-, de-, or allocate heap memory with alignment that is \ + not a power of two" + ), + Unsupported(ref msg) => write!(f, "{}", msg), + ConstPropUnsupported(ref msg) => { + write!(f, "Constant propagation encountered an unsupported situation: {}", msg) + } } } } @@ -597,11 +586,14 @@ impl fmt::Debug for ResourceExhaustionInfo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use ResourceExhaustionInfo::*; match self { - StackFrameLimitReached => - write!(f, "reached the configured maximum number of stack frames"), - InfiniteLoop => - write!(f, "duplicate interpreter state observed here, const evaluation will never \ - terminate"), + StackFrameLimitReached => { + write!(f, "reached the configured maximum number of stack frames") + } + InfiniteLoop => write!( + f, + "duplicate interpreter state observed here, const evaluation will never \ + terminate" + ), } } } @@ -637,18 +629,12 @@ impl fmt::Debug for InterpError<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use InterpError::*; match *self { - Unsupported(ref msg) => - write!(f, "{:?}", msg), - InvalidProgram(ref msg) => - write!(f, "{:?}", msg), - UndefinedBehavior(ref msg) => - write!(f, "{:?}", msg), - ResourceExhaustion(ref msg) => - write!(f, "{:?}", msg), - Panic(ref msg) => - write!(f, "{:?}", msg), - MachineStop(_) => - write!(f, "machine caused execution to stop"), + Unsupported(ref msg) => write!(f, "{:?}", msg), + InvalidProgram(ref msg) => write!(f, "{:?}", msg), + UndefinedBehavior(ref msg) => write!(f, "{:?}", msg), + ResourceExhaustion(ref msg) => write!(f, "{:?}", msg), + Panic(ref msg) => write!(f, "{:?}", msg), + MachineStop(_) => write!(f, "machine caused execution to stop"), } } } diff --git a/src/librustc/mir/interpret/mod.rs b/src/librustc/mir/interpret/mod.rs index fff876752d..108d3ef557 100644 --- a/src/librustc/mir/interpret/mod.rs +++ b/src/librustc/mir/interpret/mod.rs @@ -97,38 +97,41 @@ macro_rules! throw_machine_stop { }; } -mod error; -mod value; mod allocation; +mod error; mod pointer; +mod queries; +mod value; pub use self::error::{ - InterpErrorInfo, InterpResult, InterpError, AssertMessage, ConstEvalErr, struct_error, - FrameInfo, ConstEvalRawResult, ConstEvalResult, ErrorHandled, PanicInfo, UnsupportedOpInfo, - InvalidProgramInfo, ResourceExhaustionInfo, UndefinedBehaviorInfo, + struct_error, AssertMessage, ConstEvalErr, ConstEvalRawResult, ConstEvalResult, ErrorHandled, + FrameInfo, InterpError, InterpErrorInfo, InterpResult, InvalidProgramInfo, PanicInfo, + ResourceExhaustionInfo, UndefinedBehaviorInfo, UnsupportedOpInfo, }; -pub use self::value::{Scalar, ScalarMaybeUndef, RawConst, ConstValue, get_slice_bytes}; +pub use self::value::{get_slice_bytes, ConstValue, RawConst, Scalar, ScalarMaybeUndef}; pub use self::allocation::{Allocation, AllocationExtra, Relocations, UndefMask}; -pub use self::pointer::{Pointer, PointerArithmetic, CheckInAllocMsg}; +pub use self::pointer::{CheckInAllocMsg, Pointer, PointerArithmetic}; use crate::mir; -use crate::hir::def_id::DefId; -use crate::ty::{self, TyCtxt, Instance, subst::GenericArgKind}; use crate::ty::codec::TyDecoder; use crate::ty::layout::{self, Size}; -use std::io; -use std::fmt; -use std::num::NonZeroU32; -use std::sync::atomic::{AtomicU32, Ordering}; -use rustc_serialize::{Encoder, Decodable, Encodable}; +use crate::ty::subst::GenericArgKind; +use crate::ty::{self, Instance, Ty, TyCtxt}; +use byteorder::{BigEndian, LittleEndian, ReadBytesExt, WriteBytesExt}; use rustc_data_structures::fx::FxHashMap; -use rustc_data_structures::sync::{Lock, HashMapExt}; +use rustc_data_structures::sync::{HashMapExt, Lock}; use rustc_data_structures::tiny_list::TinyList; +use rustc_hir::def_id::DefId; use rustc_macros::HashStable; -use byteorder::{WriteBytesExt, ReadBytesExt, LittleEndian, BigEndian}; +use rustc_serialize::{Decodable, Encodable, Encoder}; +use std::fmt; +use std::io; +use std::num::NonZeroU32; +use std::sync::atomic::{AtomicU32, Ordering}; +use syntax::ast::LitKind; /// Uniquely identifies one of the following: /// - A constant @@ -145,9 +148,37 @@ pub struct GlobalId<'tcx> { pub promoted: Option, } -#[derive(Copy, Clone, Eq, Hash, Ord, PartialEq, PartialOrd, Debug)] +/// Input argument for `tcx.lit_to_const`. +#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, HashStable)] +pub struct LitToConstInput<'tcx> { + /// The absolute value of the resultant constant. + pub lit: &'tcx LitKind, + /// The type of the constant. + pub ty: Ty<'tcx>, + /// If the constant is negative. + pub neg: bool, +} + +/// Error type for `tcx.lit_to_const`. +#[derive(Copy, Clone, Debug, Eq, PartialEq, HashStable)] +pub enum LitToConstError { + /// The literal's inferred type did not match the expected `ty` in the input. + /// This is used for graceful error handling (`delay_span_bug`) in + /// type checking (`AstConv::ast_const_to_const`). + TypeError, + UnparseableFloat, + Reported, +} + +#[derive(Copy, Clone, Eq, Hash, Ord, PartialEq, PartialOrd)] pub struct AllocId(pub u64); +impl fmt::Debug for AllocId { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(fmt, "alloc{}", self.0) + } +} + impl rustc_serialize::UseSpecializedEncodable for AllocId {} impl rustc_serialize::UseSpecializedDecodable for AllocId {} @@ -163,8 +194,8 @@ pub fn specialized_encode_alloc_id<'tcx, E: Encoder>( tcx: TyCtxt<'tcx>, alloc_id: AllocId, ) -> Result<(), E::Error> { - let alloc: GlobalAlloc<'tcx> = tcx.alloc_map.lock().get(alloc_id) - .expect("no value for given alloc ID"); + let alloc: GlobalAlloc<'tcx> = + tcx.alloc_map.lock().get(alloc_id).expect("no value for given alloc ID"); match alloc { GlobalAlloc::Memory(alloc) => { trace!("encoding {:?} with {:#?}", alloc_id, alloc); @@ -212,19 +243,13 @@ impl AllocDecodingState { // Make sure this is never zero. let session_id = DecodingSessionId::new((counter & 0x7FFFFFFF) + 1).unwrap(); - AllocDecodingSession { - state: self, - session_id, - } + AllocDecodingSession { state: self, session_id } } pub fn new(data_offsets: Vec) -> Self { let decoding_state = vec![Lock::new(State::Empty); data_offsets.len()]; - Self { - decoding_state, - data_offsets, - } + Self { decoding_state, data_offsets } } } @@ -267,16 +292,15 @@ impl<'s> AllocDecodingSession<'s> { // If this is an allocation, we need to reserve an // `AllocId` so we can decode cyclic graphs. let alloc_id = decoder.tcx().alloc_map.lock().reserve(); - *entry = State::InProgress( - TinyList::new_single(self.session_id), - alloc_id); + *entry = + State::InProgress(TinyList::new_single(self.session_id), alloc_id); Some(alloc_id) - }, + } AllocDiscriminant::Fn | AllocDiscriminant::Static => { // Fns and statics cannot be cyclic, and their `AllocId` // is determined later by interning. - *entry = State::InProgressNonAlloc( - TinyList::new_single(self.session_id)); + *entry = + State::InProgressNonAlloc(TinyList::new_single(self.session_id)); None } } @@ -293,7 +317,7 @@ impl<'s> AllocDecodingSession<'s> { State::InProgress(ref mut sessions, alloc_id) => { if sessions.contains(&self.session_id) { // Don't recurse. - return Ok(alloc_id) + return Ok(alloc_id); } else { // Start decoding concurrently. sessions.insert(self.session_id); @@ -313,7 +337,7 @@ impl<'s> AllocDecodingSession<'s> { trace!("decoded alloc {:?}: {:#?}", alloc_id, alloc); decoder.tcx().alloc_map.lock().set_alloc_id_same_memory(alloc_id, alloc); Ok(alloc_id) - }, + } AllocDiscriminant::Fn => { assert!(alloc_id.is_none()); trace!("creating fn alloc ID"); @@ -321,7 +345,7 @@ impl<'s> AllocDecodingSession<'s> { trace!("decoded fn alloc instance: {:?}", instance); let alloc_id = decoder.tcx().alloc_map.lock().create_fn_alloc(instance); Ok(alloc_id) - }, + } AllocDiscriminant::Static => { assert!(alloc_id.is_none()); trace!("creating extern static alloc ID"); @@ -377,11 +401,7 @@ pub struct AllocMap<'tcx> { impl<'tcx> AllocMap<'tcx> { pub fn new() -> Self { - AllocMap { - alloc_map: Default::default(), - dedup: Default::default(), - next_id: AllocId(0), - } + AllocMap { alloc_map: Default::default(), dedup: Default::default(), next_id: AllocId(0) } } /// Obtains a new allocation ID that can be referenced but does not @@ -389,15 +409,13 @@ impl<'tcx> AllocMap<'tcx> { /// /// Make sure to call `set_alloc_id_memory` or `set_alloc_id_same_memory` before returning such /// an `AllocId` from a query. - pub fn reserve( - &mut self, - ) -> AllocId { + pub fn reserve(&mut self) -> AllocId { let next = self.next_id; - self.next_id.0 = self.next_id.0 - .checked_add(1) - .expect("You overflowed a u64 by incrementing by 1... \ - You've just earned yourself a free drink if we ever meet. \ - Seriously, how did you do that?!"); + self.next_id.0 = self.next_id.0.checked_add(1).expect( + "You overflowed a u64 by incrementing by 1... \ + You've just earned yourself a free drink if we ever meet. \ + Seriously, how did you do that?!", + ); next } @@ -406,7 +424,7 @@ impl<'tcx> AllocMap<'tcx> { /// to dedup IDs for "real" memory! fn reserve_and_set_dedup(&mut self, alloc: GlobalAlloc<'tcx>) -> AllocId { match alloc { - GlobalAlloc::Function(..) | GlobalAlloc::Static(..) => {}, + GlobalAlloc::Function(..) | GlobalAlloc::Static(..) => {} GlobalAlloc::Memory(..) => bug!("Trying to dedup-reserve memory with real data!"), } if let Some(&alloc_id) = self.dedup.get(&alloc) { @@ -435,11 +453,9 @@ impl<'tcx> AllocMap<'tcx> { // `main as fn() == main as fn()` is false, while `let x = main as fn(); x == x` is true. // However, formatting code relies on function identity (see #58320), so we only do // this for generic functions. Lifetime parameters are ignored. - let is_generic = instance.substs.into_iter().any(|kind| { - match kind.unpack() { - GenericArgKind::Lifetime(_) => false, - _ => true, - } + let is_generic = instance.substs.into_iter().any(|kind| match kind.unpack() { + GenericArgKind::Lifetime(_) => false, + _ => true, }); if is_generic { // Get a fresh ID. diff --git a/src/librustc/mir/interpret/pointer.rs b/src/librustc/mir/interpret/pointer.rs index 0b27f512e5..a4974fb541 100644 --- a/src/librustc/mir/interpret/pointer.rs +++ b/src/librustc/mir/interpret/pointer.rs @@ -20,12 +20,16 @@ impl Display for CheckInAllocMsg { /// When this is printed as an error the context looks like this /// "{test name} failed: pointer must be in-bounds at offset..." fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", match *self { - CheckInAllocMsg::MemoryAccessTest => "Memory access", - CheckInAllocMsg::NullPointerTest => "Null pointer test", - CheckInAllocMsg::PointerArithmeticTest => "Pointer arithmetic", - CheckInAllocMsg::InboundsTest => "Inbounds test", - }) + write!( + f, + "{}", + match *self { + CheckInAllocMsg::MemoryAccessTest => "Memory access", + CheckInAllocMsg::NullPointerTest => "Null pointer test", + CheckInAllocMsg::PointerArithmeticTest => "Pointer arithmetic", + CheckInAllocMsg::InboundsTest => "Inbounds test", + } + ) } } @@ -44,13 +48,13 @@ pub trait PointerArithmetic: layout::HasDataLayout { #[inline] fn usize_max(&self) -> u64 { let max_usize_plus_1 = 1u128 << self.pointer_size().bits(); - u64::try_from(max_usize_plus_1-1).unwrap() + u64::try_from(max_usize_plus_1 - 1).unwrap() } #[inline] fn isize_max(&self) -> i64 { - let max_isize_plus_1 = 1u128 << (self.pointer_size().bits()-1); - i64::try_from(max_isize_plus_1-1).unwrap() + let max_isize_plus_1 = 1u128 << (self.pointer_size().bits() - 1); + i64::try_from(max_isize_plus_1 - 1).unwrap() } /// Helper function: truncate given value-"overflowed flag" pair to pointer size and @@ -107,8 +111,18 @@ impl PointerArithmetic for T {} /// /// `Pointer` is also generic over the `Tag` associated with each pointer, /// which is used to do provenance tracking during execution. -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, - RustcEncodable, RustcDecodable, Hash, HashStable)] +#[derive( + Copy, + Clone, + Eq, + PartialEq, + Ord, + PartialOrd, + RustcEncodable, + RustcDecodable, + Hash, + HashStable +)] pub struct Pointer { pub alloc_id: Id, pub offset: Size, @@ -119,13 +133,13 @@ static_assert_size!(Pointer, 16); impl fmt::Debug for Pointer { default fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}.{:#x}[{:?}]", self.alloc_id, self.offset.bytes(), self.tag) + write!(f, "{:?}+{:x}[{:?}]", self.alloc_id, self.offset.bytes(), self.tag) } } // Specialization for no tag impl fmt::Debug for Pointer<(), Id> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}.{:#x}", self.alloc_id, self.offset.bytes()) + write!(f, "{:?}+{:x}", self.alloc_id, self.offset.bytes()) } } @@ -144,8 +158,7 @@ impl Pointer<()> { } #[inline(always)] - pub fn with_tag(self, tag: Tag) -> Pointer - { + pub fn with_tag(self, tag: Tag) -> Pointer { Pointer::new_with_tag(self.alloc_id, self.offset, tag) } } @@ -161,7 +174,7 @@ impl<'tcx, Tag> Pointer { Ok(Pointer::new_with_tag( self.alloc_id, Size::from_bytes(cx.data_layout().offset(self.offset.bytes(), i.bytes())?), - self.tag + self.tag, )) } diff --git a/src/librustc/mir/interpret/queries.rs b/src/librustc/mir/interpret/queries.rs new file mode 100644 index 0000000000..ed57f81e78 --- /dev/null +++ b/src/librustc/mir/interpret/queries.rs @@ -0,0 +1,78 @@ +use super::{ConstEvalResult, ErrorHandled, GlobalId}; + +use crate::mir; +use crate::ty::subst::{InternalSubsts, SubstsRef}; +use crate::ty::{self, TyCtxt}; +use rustc_hir::def_id::DefId; +use rustc_span::Span; + +impl<'tcx> TyCtxt<'tcx> { + /// Evaluates a constant without providing any substitutions. This is useful to evaluate consts + /// that can't take any generic arguments like statics, const items or enum discriminants. If a + /// generic parameter is used within the constant `ErrorHandled::ToGeneric` will be returned. + pub fn const_eval_poly(self, def_id: DefId) -> ConstEvalResult<'tcx> { + // In some situations def_id will have substitutions within scope, but they aren't allowed + // to be used. So we can't use `Instance::mono`, instead we feed unresolved substitutions + // into `const_eval` which will return `ErrorHandled::ToGeneric` if any og them are + // encountered. + let substs = InternalSubsts::identity_for_item(self, def_id); + let instance = ty::Instance::new(def_id, substs); + let cid = GlobalId { instance, promoted: None }; + let param_env = self.param_env(def_id).with_reveal_all(); + self.const_eval_validated(param_env.and(cid)) + } + + /// Resolves and evaluates a constant. + /// + /// The constant can be located on a trait like `::C`, in which case the given + /// substitutions and environment are used to resolve the constant. Alternatively if the + /// constant has generic parameters in scope the substitutions are used to evaluate the value of + /// the constant. For example in `fn foo() { let _ = [0; bar::()]; }` the repeat count + /// constant `bar::()` requires a substitution for `T`, if the substitution for `T` is still + /// too generic for the constant to be evaluated then `Err(ErrorHandled::TooGeneric)` is + /// returned. + pub fn const_eval_resolve( + self, + param_env: ty::ParamEnv<'tcx>, + def_id: DefId, + substs: SubstsRef<'tcx>, + promoted: Option, + span: Option, + ) -> ConstEvalResult<'tcx> { + let instance = ty::Instance::resolve(self, param_env, def_id, substs); + if let Some(instance) = instance { + if let Some(promoted) = promoted { + self.const_eval_promoted(param_env, instance, promoted) + } else { + self.const_eval_instance(param_env, instance, span) + } + } else { + Err(ErrorHandled::TooGeneric) + } + } + + pub fn const_eval_instance( + self, + param_env: ty::ParamEnv<'tcx>, + instance: ty::Instance<'tcx>, + span: Option, + ) -> ConstEvalResult<'tcx> { + let cid = GlobalId { instance, promoted: None }; + if let Some(span) = span { + self.at(span).const_eval_validated(param_env.and(cid)) + } else { + self.const_eval_validated(param_env.and(cid)) + } + } + + /// Evaluate a promoted constant. + pub fn const_eval_promoted( + self, + param_env: ty::ParamEnv<'tcx>, + instance: ty::Instance<'tcx>, + promoted: mir::Promoted, + ) -> ConstEvalResult<'tcx> { + let cid = GlobalId { instance, promoted: Some(promoted) }; + self.const_eval_validated(param_env.and(cid)) + } +} diff --git a/src/librustc/mir/interpret/value.rs b/src/librustc/mir/interpret/value.rs index a038ca23ae..2be36ad418 100644 --- a/src/librustc/mir/interpret/value.rs +++ b/src/librustc/mir/interpret/value.rs @@ -1,10 +1,16 @@ -use std::fmt; +use rustc_apfloat::{ + ieee::{Double, Single}, + Float, +}; use rustc_macros::HashStable; -use rustc_apfloat::{Float, ieee::{Double, Single}}; +use std::fmt; -use crate::ty::{Ty, layout::{HasDataLayout, Size}}; +use crate::ty::{ + layout::{HasDataLayout, Size}, + Ty, +}; -use super::{InterpResult, Pointer, PointerArithmetic, Allocation, AllocId, sign_extend, truncate}; +use super::{sign_extend, truncate, AllocId, Allocation, InterpResult, Pointer, PointerArithmetic}; /// Represents the result of a raw const operation, pre-validation. #[derive(Clone, HashStable)] @@ -17,8 +23,19 @@ pub struct RawConst<'tcx> { /// Represents a constant value in Rust. `Scalar` and `Slice` are optimizations for /// array length computations, enum discriminants and the pattern matching logic. -#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, - RustcEncodable, RustcDecodable, Hash, HashStable)] +#[derive( + Copy, + Clone, + Debug, + Eq, + PartialEq, + PartialOrd, + Ord, + RustcEncodable, + RustcDecodable, + Hash, + HashStable +)] pub enum ConstValue<'tcx> { /// Used only for types with `layout::abi::Scalar` ABI and ZSTs. /// @@ -26,11 +43,7 @@ pub enum ConstValue<'tcx> { Scalar(Scalar), /// Used only for `&[u8]` and `&str` - Slice { - data: &'tcx Allocation, - start: usize, - end: usize, - }, + Slice { data: &'tcx Allocation, start: usize, end: usize }, /// A value not represented/representable by `Scalar` or `Slice` ByRef { @@ -49,8 +62,7 @@ impl<'tcx> ConstValue<'tcx> { #[inline] pub fn try_to_scalar(&self) -> Option { match *self { - ConstValue::ByRef { .. } | - ConstValue::Slice { .. } => None, + ConstValue::ByRef { .. } | ConstValue::Slice { .. } => None, ConstValue::Scalar(val) => Some(val), } } @@ -60,8 +72,18 @@ impl<'tcx> ConstValue<'tcx> { /// `memory::Allocation`. It is in many ways like a small chunk of a `Allocation`, up to 8 bytes in /// size. Like a range of bytes in an `Allocation`, a `Scalar` can either represent the raw bytes /// of a simple value or a pointer into another `Allocation` -#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, - RustcEncodable, RustcDecodable, Hash, HashStable)] +#[derive( + Clone, + Copy, + Eq, + PartialEq, + Ord, + PartialOrd, + RustcEncodable, + RustcDecodable, + Hash, + HashStable +)] pub enum Scalar { /// The raw bytes of a simple value. Raw { @@ -83,8 +105,7 @@ static_assert_size!(Scalar, 24); impl fmt::Debug for Scalar { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Scalar::Ptr(ptr) => - write!(f, "{:?}", ptr), + Scalar::Ptr(ptr) => write!(f, "{:?}", ptr), &Scalar::Raw { data, size } => { Scalar::check_data(data, size); if size == 0 { @@ -92,7 +113,7 @@ impl fmt::Debug for Scalar { } else { // Format as hex number wide enough to fit any value of the given `size`. // So data=20, size=1 will be "0x14", but with size=4 it'll be "0x00000014". - write!(f, "0x{:>0width$x}", data, width=(size*2) as usize) + write!(f, "0x{:>0width$x}", data, width = (size * 2) as usize) } } } @@ -125,8 +146,13 @@ impl From for Scalar { impl Scalar<()> { #[inline(always)] fn check_data(data: u128, size: u8) { - debug_assert_eq!(truncate(data, Size::from_bytes(size as u64)), data, - "Scalar value {:#x} exceeds size of {} bytes", data, size); + debug_assert_eq!( + truncate(data, Size::from_bytes(size as u64)), + data, + "Scalar value {:#x} exceeds size of {} bytes", + data, + size + ); } /// Tag this scalar with `new_tag` if it is a pointer, leave it unchanged otherwise. @@ -155,10 +181,7 @@ impl<'tcx, Tag> Scalar { #[inline] pub fn ptr_null(cx: &impl HasDataLayout) -> Self { - Scalar::Raw { - data: 0, - size: cx.data_layout().pointer_size.bytes() as u8, - } + Scalar::Raw { data: 0, size: cx.data_layout().pointer_size.bytes() as u8 } } #[inline] @@ -172,10 +195,7 @@ impl<'tcx, Tag> Scalar { match self { Scalar::Raw { data, size } => { assert_eq!(size as u64, dl.pointer_size.bytes()); - Ok(Scalar::Raw { - data: dl.offset(data as u64, i.bytes())? as u128, - size, - }) + Ok(Scalar::Raw { data: dl.offset(data as u64, i.bytes())? as u128, size }) } Scalar::Ptr(ptr) => ptr.offset(i, dl).map(Scalar::Ptr), } @@ -187,10 +207,7 @@ impl<'tcx, Tag> Scalar { match self { Scalar::Raw { data, size } => { assert_eq!(size as u64, dl.pointer_size.bytes()); - Scalar::Raw { - data: dl.overflowing_offset(data as u64, i.bytes()).0 as u128, - size, - } + Scalar::Raw { data: dl.overflowing_offset(data as u64, i.bytes()).0 as u128, size } } Scalar::Ptr(ptr) => Scalar::Ptr(ptr.wrapping_offset(i, dl)), } @@ -202,10 +219,7 @@ impl<'tcx, Tag> Scalar { match self { Scalar::Raw { data, size } => { assert_eq!(size as u64, dl.pointer_size().bytes()); - Ok(Scalar::Raw { - data: dl.signed_offset(data as u64, i)? as u128, - size, - }) + Ok(Scalar::Raw { data: dl.signed_offset(data as u64, i)? as u128, size }) } Scalar::Ptr(ptr) => ptr.signed_offset(i, dl).map(Scalar::Ptr), } @@ -236,14 +250,21 @@ impl<'tcx, Tag> Scalar { Scalar::Raw { data: c as u128, size: 4 } } + #[inline] + pub fn try_from_uint(i: impl Into, size: Size) -> Option { + let i = i.into(); + if truncate(i, size) == i { + Some(Scalar::Raw { data: i, size: size.bytes() as u8 }) + } else { + None + } + } + #[inline] pub fn from_uint(i: impl Into, size: Size) -> Self { let i = i.into(); - assert_eq!( - truncate(i, size), i, - "Unsigned value {:#x} does not fit in {} bits", i, size.bits() - ); - Scalar::Raw { data: i, size: size.bytes() as u8 } + Self::try_from_uint(i, size) + .unwrap_or_else(|| bug!("Unsigned value {:#x} does not fit in {} bits", i, size.bits())) } #[inline] @@ -267,15 +288,22 @@ impl<'tcx, Tag> Scalar { } #[inline] - pub fn from_int(i: impl Into, size: Size) -> Self { + pub fn try_from_int(i: impl Into, size: Size) -> Option { let i = i.into(); // `into` performed sign extension, we have to truncate let truncated = truncate(i as u128, size); - assert_eq!( - sign_extend(truncated, size) as i128, i, - "Signed value {:#x} does not fit in {} bits", i, size.bits() - ); - Scalar::Raw { data: truncated, size: size.bytes() as u8 } + if sign_extend(truncated, size) as i128 == i { + Some(Scalar::Raw { data: truncated, size: size.bytes() as u8 }) + } else { + None + } + } + + #[inline] + pub fn from_int(i: impl Into, size: Size) -> Self { + let i = i.into(); + Self::try_from_int(i, size) + .unwrap_or_else(|| bug!("Signed value {:#x} does not fit in {} bits", i, size.bits())) } #[inline] @@ -339,8 +367,9 @@ impl<'tcx, Tag> Scalar { } /// Do not call this method! Use either `assert_ptr` or `force_ptr`. + /// This method is intentionally private, do not make it public. #[inline] - pub fn to_ptr(self) -> InterpResult<'tcx, Pointer> { + fn to_ptr(self) -> InterpResult<'tcx, Pointer> { match self { Scalar::Raw { data: 0, .. } => throw_unsup!(InvalidNullPointerUsage), Scalar::Raw { .. } => throw_unsup!(ReadBytesAsPointer), @@ -387,22 +416,30 @@ impl<'tcx, Tag> Scalar { } } + #[inline] + fn to_unsigned_with_bit_width(self, bits: u64) -> InterpResult<'static, u128> { + let sz = Size::from_bits(bits); + self.to_bits(sz) + } + + /// Converts the scalar to produce an `u8`. Fails if the scalar is a pointer. pub fn to_u8(self) -> InterpResult<'static, u8> { - let sz = Size::from_bits(8); - let b = self.to_bits(sz)?; - Ok(b as u8) + self.to_unsigned_with_bit_width(8).map(|v| v as u8) } + /// Converts the scalar to produce an `u16`. Fails if the scalar is a pointer. + pub fn to_u16(self) -> InterpResult<'static, u16> { + self.to_unsigned_with_bit_width(16).map(|v| v as u16) + } + + /// Converts the scalar to produce an `u32`. Fails if the scalar is a pointer. pub fn to_u32(self) -> InterpResult<'static, u32> { - let sz = Size::from_bits(32); - let b = self.to_bits(sz)?; - Ok(b as u32) + self.to_unsigned_with_bit_width(32).map(|v| v as u32) } + /// Converts the scalar to produce an `u64`. Fails if the scalar is a pointer. pub fn to_u64(self) -> InterpResult<'static, u64> { - let sz = Size::from_bits(64); - let b = self.to_bits(sz)?; - Ok(b as u64) + self.to_unsigned_with_bit_width(64).map(|v| v as u64) } pub fn to_machine_usize(self, cx: &impl HasDataLayout) -> InterpResult<'static, u64> { @@ -410,25 +447,31 @@ impl<'tcx, Tag> Scalar { Ok(b as u64) } - pub fn to_i8(self) -> InterpResult<'static, i8> { - let sz = Size::from_bits(8); + #[inline] + fn to_signed_with_bit_width(self, bits: u64) -> InterpResult<'static, i128> { + let sz = Size::from_bits(bits); let b = self.to_bits(sz)?; - let b = sign_extend(b, sz) as i128; - Ok(b as i8) + Ok(sign_extend(b, sz) as i128) } + /// Converts the scalar to produce an `i8`. Fails if the scalar is a pointer. + pub fn to_i8(self) -> InterpResult<'static, i8> { + self.to_signed_with_bit_width(8).map(|v| v as i8) + } + + /// Converts the scalar to produce an `i16`. Fails if the scalar is a pointer. + pub fn to_i16(self) -> InterpResult<'static, i16> { + self.to_signed_with_bit_width(16).map(|v| v as i16) + } + + /// Converts the scalar to produce an `i32`. Fails if the scalar is a pointer. pub fn to_i32(self) -> InterpResult<'static, i32> { - let sz = Size::from_bits(32); - let b = self.to_bits(sz)?; - let b = sign_extend(b, sz) as i128; - Ok(b as i32) + self.to_signed_with_bit_width(32).map(|v| v as i32) } + /// Converts the scalar to produce an `i64`. Fails if the scalar is a pointer. pub fn to_i64(self) -> InterpResult<'static, i64> { - let sz = Size::from_bits(64); - let b = self.to_bits(sz)?; - let b = sign_extend(b, sz) as i128; - Ok(b as i64) + self.to_signed_with_bit_width(64).map(|v| v as i64) } pub fn to_machine_isize(self, cx: &impl HasDataLayout) -> InterpResult<'static, i64> { @@ -501,8 +544,7 @@ impl<'tcx, Tag> ScalarMaybeUndef { /// /// Used by error reporting code to avoid having the error type depend on `Tag`. #[inline] - pub fn erase_tag(self) -> ScalarMaybeUndef - { + pub fn erase_tag(self) -> ScalarMaybeUndef { match self { ScalarMaybeUndef::Scalar(s) => ScalarMaybeUndef::Scalar(s.erase_tag()), ScalarMaybeUndef::Undef => ScalarMaybeUndef::Undef, @@ -517,12 +559,6 @@ impl<'tcx, Tag> ScalarMaybeUndef { } } - /// Do not call this method! Use either `assert_ptr` or `force_ptr`. - #[inline(always)] - pub fn to_ptr(self) -> InterpResult<'tcx, Pointer> { - self.not_undef()?.to_ptr() - } - /// Do not call this method! Use either `assert_bits` or `force_bits`. #[inline(always)] pub fn to_bits(self, target_size: Size) -> InterpResult<'tcx, u128> { @@ -599,7 +635,8 @@ pub fn get_slice_bytes<'tcx>(cx: &impl HasDataLayout, val: ConstValue<'tcx>) -> // invent a pointer, only the offset is relevant anyway Pointer::new(AllocId(0), Size::from_bytes(start as u64)), Size::from_bytes(len as u64), - ).unwrap_or_else(|err| bug!("const slice is invalid: {:?}", err)) + ) + .unwrap_or_else(|err| bug!("const slice is invalid: {:?}", err)) } else { bug!("expected const slice, but found another const value"); } diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index ba8feb4ee7..c9a89aae86 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -1,12 +1,7 @@ -// ignore-tidy-filelength - //! MIR datatypes and passes. See the [rustc guide] for more info. //! //! [rustc guide]: https://rust-lang.github.io/rustc-guide/mir/index.html -use crate::hir::def::{CtorKind, Namespace}; -use crate::hir::def_id::DefId; -use crate::hir::{self, GeneratorKind}; use crate::mir::interpret::{GlobalAlloc, PanicInfo, Scalar}; use crate::mir::visit::MirVisitable; use crate::ty::adjustment::PointerCast; @@ -17,33 +12,38 @@ use crate::ty::subst::{Subst, SubstsRef}; use crate::ty::{ self, AdtDef, CanonicalUserTypeAnnotations, List, Region, Ty, TyCtxt, UserTypeAnnotationIndex, }; +use rustc_hir as hir; +use rustc_hir::def::{CtorKind, Namespace}; +use rustc_hir::def_id::DefId; +use rustc_hir::{self, GeneratorKind}; use polonius_engine::Atom; -use rustc_index::bit_set::BitMatrix; use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::graph::dominators::Dominators; use rustc_data_structures::graph::{self, GraphSuccessors}; +use rustc_index::bit_set::BitMatrix; use rustc_index::vec::{Idx, IndexVec}; -use rustc_data_structures::sync::Lrc; use rustc_macros::HashStable; -use rustc_serialize::{Encodable, Decodable}; -use smallvec::SmallVec; +use rustc_serialize::{Decodable, Encodable}; +use rustc_span::symbol::Symbol; +use rustc_span::{Span, DUMMY_SP}; use std::borrow::Cow; use std::fmt::{self, Debug, Display, Formatter, Write}; use std::ops::Index; use std::slice; use std::{iter, mem, option, u32}; +pub use syntax::ast::Mutability; use syntax::ast::Name; -use syntax::symbol::Symbol; -use syntax_pos::{Span, DUMMY_SP}; -pub use crate::mir::interpret::AssertMessage; -pub use crate::mir::cache::{BodyAndCache, ReadOnlyBodyAndCache}; +pub use self::cache::{BodyAndCache, ReadOnlyBodyAndCache}; +pub use self::interpret::AssertMessage; +pub use self::query::*; pub use crate::read_only; mod cache; pub mod interpret; pub mod mono; +mod query; pub mod tcx; pub mod traversal; pub mod visit; @@ -70,8 +70,18 @@ impl<'tcx> HasLocalDecls<'tcx> for Body<'tcx> { /// The various "big phases" that MIR goes through. /// /// Warning: ordering of variants is significant. -#[derive(Copy, Clone, RustcEncodable, RustcDecodable, HashStable, - Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive( + Copy, + Clone, + RustcEncodable, + RustcDecodable, + HashStable, + Debug, + PartialEq, + Eq, + PartialOrd, + Ord +)] pub enum MirPhase { Build = 0, Const = 1, @@ -154,6 +164,16 @@ pub struct Body<'tcx> { /// A span representing this MIR, for error reporting. pub span: Span, + + /// The user may be writing e.g. &[(SOME_CELL, 42)][i].1 and this would get promoted, because + /// we'd statically know that no thing with interior mutability will ever be available to the + /// user without some serious unsafe code. Now this means that our promoted is actually + /// &[(SOME_CELL, 42)] and the MIR using it will do the &promoted[i].1 projection because the + /// index may be a runtime value. Such a promoted value is illegal because it has reachable + /// interior mutability. This flag just makes this situation very obvious where the previous + /// implementation without the flag hid this situation silently. + /// FIXME(oli-obk): rewrite the promoted during promotion to eliminate the cell components. + pub ignore_interior_mut_in_const_validation: bool, } impl<'tcx> Body<'tcx> { @@ -166,7 +186,7 @@ impl<'tcx> Body<'tcx> { var_debug_info: Vec>, span: Span, control_flow_destroyed: Vec<(Span, String)>, - generator_kind : Option, + generator_kind: Option, ) -> Self { // We need `arg_count` locals, and one for the return place. assert!( @@ -190,10 +210,36 @@ impl<'tcx> Body<'tcx> { spread_arg: None, var_debug_info, span, + ignore_interior_mut_in_const_validation: false, control_flow_destroyed, } } + /// Returns a partially initialized MIR body containing only a list of basic blocks. + /// + /// The returned MIR contains no `LocalDecl`s (even for the return place) or source scopes. It + /// is only useful for testing but cannot be `#[cfg(test)]` because it is used in a different + /// crate. + pub fn new_cfg_only(basic_blocks: IndexVec>) -> Self { + Body { + phase: MirPhase::Build, + basic_blocks, + source_scopes: IndexVec::new(), + yield_ty: None, + generator_drop: None, + generator_layout: None, + local_decls: IndexVec::new(), + user_type_annotations: IndexVec::new(), + arg_count: 0, + spread_arg: None, + span: DUMMY_SP, + control_flow_destroyed: Vec::new(), + generator_kind: None, + var_debug_info: Vec::new(), + ignore_interior_mut_in_const_validation: false, + } + } + #[inline] pub fn basic_blocks(&self) -> &IndexVec> { &self.basic_blocks @@ -229,11 +275,7 @@ impl<'tcx> Body<'tcx> { pub fn temps_iter<'a>(&'a self) -> impl Iterator + 'a { (self.arg_count + 1..self.local_decls.len()).filter_map(move |index| { let local = Local::new(index); - if self.local_decls[local].is_user_variable() { - None - } else { - Some(local) - } + if self.local_decls[local].is_user_variable() { None } else { Some(local) } }) } @@ -396,25 +438,19 @@ pub struct SourceInfo { } /////////////////////////////////////////////////////////////////////////// -// Mutability and borrow kinds - -#[derive(Copy, Clone, Debug, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable)] -pub enum Mutability { - Mut, - Not, -} - -impl From for hir::Mutability { - fn from(m: Mutability) -> Self { - match m { - Mutability::Mut => hir::Mutability::Mutable, - Mutability::Not => hir::Mutability::Immutable, - } - } -} +// Borrow kinds #[derive( - Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, RustcEncodable, RustcDecodable, HashStable, + Copy, + Clone, + Debug, + PartialEq, + Eq, + PartialOrd, + Ord, + RustcEncodable, + RustcDecodable, + HashStable )] pub enum BorrowKind { /// Data must be immutable and is aliasable. @@ -774,9 +810,9 @@ impl<'tcx> LocalDecl<'tcx> { pat_span: _, }))) => true, - LocalInfo::User( - ClearCrossCrate::Set(BindingForm::ImplicitSelf(ImplicitSelfKind::Imm)), - ) => true, + LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf( + ImplicitSelfKind::Imm, + ))) => true, _ => false, } @@ -1341,11 +1377,7 @@ impl<'tcx> BasicBlockData<'tcx> { } pub fn visitable(&self, index: usize) -> &dyn MirVisitable<'tcx> { - if index < self.statements.len() { - &self.statements[index] - } else { - &self.terminator - } + if index < self.statements.len() { &self.statements[index] } else { &self.terminator } } } @@ -1432,13 +1464,9 @@ impl<'tcx> TerminatorKind<'tcx> { values .iter() .map(|&u| { - ty::Const::from_scalar( - tcx, - Scalar::from_uint(u, size).into(), - switch_ty, - ) - .to_string() - .into() + ty::Const::from_scalar(tcx, Scalar::from_uint(u, size).into(), switch_ty) + .to_string() + .into() }) .chain(iter::once("otherwise".into())) .collect() @@ -1614,7 +1642,7 @@ impl Debug for Statement<'_> { fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { use self::StatementKind::*; match self.kind { - Assign(box(ref place, ref rv)) => write!(fmt, "{:?} = {:?}", place, rv), + Assign(box (ref place, ref rv)) => write!(fmt, "{:?} = {:?}", place, rv), FakeRead(ref cause, ref place) => write!(fmt, "FakeRead({:?}, {:?})", cause, place), Retag(ref kind, ref place) => write!( fmt, @@ -1635,7 +1663,7 @@ impl Debug for Statement<'_> { InlineAsm(ref asm) => { write!(fmt, "asm!({:?} : {:?} : {:?})", asm.asm, asm.outputs, asm.inputs) } - AscribeUserType(box(ref place, ref c_ty), ref variance) => { + AscribeUserType(box (ref place, ref c_ty), ref variance) => { write!(fmt, "AscribeUserType({:?}, {:?}, {:?})", place, variance, c_ty) } Nop => write!(fmt, "nop"), @@ -1648,11 +1676,9 @@ impl Debug for Statement<'_> { /// A path to a value; something that can be evaluated without /// changing or disturbing program state. -#[derive( - Clone, PartialEq, Eq, PartialOrd, Ord, Hash, RustcEncodable, HashStable, -)] +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, RustcEncodable, HashStable)] pub struct Place<'tcx> { - pub base: PlaceBase<'tcx>, + pub local: Local, /// projection out of a place (access a field, deref a pointer, etc) pub projection: &'tcx List>, @@ -1660,41 +1686,6 @@ pub struct Place<'tcx> { impl<'tcx> rustc_serialize::UseSpecializedDecodable for Place<'tcx> {} -#[derive( - Clone, PartialEq, Eq, PartialOrd, Ord, Hash, RustcEncodable, RustcDecodable, HashStable, -)] -pub enum PlaceBase<'tcx> { - /// local variable - Local(Local), - - /// static or static mut variable - Static(Box>), -} - -/// We store the normalized type to avoid requiring normalization when reading MIR -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, - RustcEncodable, RustcDecodable, HashStable)] -pub struct Static<'tcx> { - pub ty: Ty<'tcx>, - pub kind: StaticKind<'tcx>, - /// The `DefId` of the item this static was declared in. For promoted values, usually, this is - /// the same as the `DefId` of the `mir::Body` containing the `Place` this promoted appears in. - /// However, after inlining, that might no longer be the case as inlined `Place`s are copied - /// into the calling frame. - pub def_id: DefId, -} - -#[derive( - Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, HashStable, RustcEncodable, RustcDecodable, -)] -pub enum StaticKind<'tcx> { - /// Promoted references consist of an id (`Promoted`) and the substs necessary to monomorphize - /// it. Usually, these substs are just the identity substs for the item. However, the inliner - /// will adjust these substs when it inlines a function based on the substs at the callsite. - Promoted(Promoted, SubstsRef<'tcx>), - Static, -} - #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(RustcEncodable, RustcDecodable, HashStable)] pub enum ProjectionElem { @@ -1750,12 +1741,11 @@ impl ProjectionElem { match self { Self::Deref => true, - | Self::Field(_, _) + Self::Field(_, _) | Self::Index(_) | Self::ConstantIndex { .. } | Self::Subslice { .. } - | Self::Downcast(_, _) - => false + | Self::Downcast(_, _) => false, } } } @@ -1764,7 +1754,7 @@ impl ProjectionElem { /// and the index is a local. pub type PlaceElem<'tcx> = ProjectionElem>; -impl<'tcx> Copy for PlaceElem<'tcx> { } +impl<'tcx> Copy for PlaceElem<'tcx> {} // At least on 64 bit systems, `PlaceElem` should not be larger than two pointers. #[cfg(target_arch = "x86_64")] @@ -1783,17 +1773,14 @@ rustc_index::newtype_index! { #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct PlaceRef<'a, 'tcx> { - pub base: &'a PlaceBase<'tcx>, + pub local: &'a Local, pub projection: &'a [PlaceElem<'tcx>], } impl<'tcx> Place<'tcx> { // FIXME change this to a const fn by also making List::empty a const fn. pub fn return_place() -> Place<'tcx> { - Place { - base: PlaceBase::Local(RETURN_PLACE), - projection: List::empty(), - } + Place { local: RETURN_PLACE, projection: List::empty() } } /// Returns `true` if this `Place` contains a `Deref` projection. @@ -1810,14 +1797,8 @@ impl<'tcx> Place<'tcx> { // FIXME: can we safely swap the semantics of `fn base_local` below in here instead? pub fn local_or_deref_local(&self) -> Option { match self.as_ref() { - PlaceRef { - base: &PlaceBase::Local(local), - projection: &[], - } | - PlaceRef { - base: &PlaceBase::Local(local), - projection: &[ProjectionElem::Deref], - } => Some(local), + PlaceRef { local, projection: &[] } + | PlaceRef { local, projection: &[ProjectionElem::Deref] } => Some(*local), _ => None, } } @@ -1829,25 +1810,13 @@ impl<'tcx> Place<'tcx> { } pub fn as_ref(&self) -> PlaceRef<'_, 'tcx> { - PlaceRef { - base: &self.base, - projection: &self.projection, - } + PlaceRef { local: &self.local, projection: &self.projection } } } impl From for Place<'_> { fn from(local: Local) -> Self { - Place { - base: local.into(), - projection: List::empty(), - } - } -} - -impl From for PlaceBase<'_> { - fn from(local: Local) -> Self { - PlaceBase::Local(local) + Place { local, projection: List::empty() } } } @@ -1858,14 +1827,8 @@ impl<'a, 'tcx> PlaceRef<'a, 'tcx> { // FIXME: can we safely swap the semantics of `fn base_local` below in here instead? pub fn local_or_deref_local(&self) -> Option { match self { - PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } | - PlaceRef { - base: PlaceBase::Local(local), - projection: [ProjectionElem::Deref], - } => Some(*local), + PlaceRef { local, projection: [] } + | PlaceRef { local, projection: [ProjectionElem::Deref] } => Some(**local), _ => None, } } @@ -1874,7 +1837,7 @@ impl<'a, 'tcx> PlaceRef<'a, 'tcx> { /// projections, return `Some(_X)`. pub fn as_local(&self) -> Option { match self { - PlaceRef { base: PlaceBase::Local(l), projection: [] } => Some(*l), + PlaceRef { local, projection: [] } => Some(**local), _ => None, } } @@ -1896,7 +1859,7 @@ impl Debug for Place<'_> { } } - write!(fmt, "{:?}", self.base)?; + write!(fmt, "{:?}", self.local)?; for elem in self.projection.iter() { match elem { @@ -1940,22 +1903,6 @@ impl Debug for Place<'_> { } } -impl Debug for PlaceBase<'_> { - fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { - match *self { - PlaceBase::Local(id) => write!(fmt, "{:?}", id), - PlaceBase::Static(box self::Static { ty, kind: StaticKind::Static, def_id }) => { - write!(fmt, "({}: {:?})", ty::tls::with(|tcx| tcx.def_path_str(def_id)), ty) - } - PlaceBase::Static(box self::Static { - ty, kind: StaticKind::Promoted(promoted, _), def_id: _ - }) => { - write!(fmt, "({:?}: {:?})", promoted, ty) - } - } - } -} - /////////////////////////////////////////////////////////////////////////// // Scopes @@ -2041,7 +1988,7 @@ impl<'tcx> Operand<'tcx> { pub fn to_copy(&self) -> Self { match *self { Operand::Copy(_) | Operand::Constant(_) => self.clone(), - Operand::Move(ref place) => Operand::Copy(place.clone()), + Operand::Move(place) => Operand::Copy(place), } } } @@ -2060,6 +2007,11 @@ pub enum Rvalue<'tcx> { /// &x or &mut x Ref(Region<'tcx>, BorrowKind, Place<'tcx>), + /// Create a raw pointer to the given place + /// Can be generated by raw address of expressions (`&raw const x`), + /// or when casting a reference to a raw pointer. + AddressOf(Mutability, Place<'tcx>), + /// length of a [X] or [X;n] value Len(Place<'tcx>), @@ -2214,6 +2166,15 @@ impl<'tcx> Debug for Rvalue<'tcx> { write!(fmt, "&{}{}{:?}", region, kind_str, place) } + AddressOf(mutability, ref place) => { + let kind_str = match mutability { + Mutability::Mut => "mut", + Mutability::Not => "const", + }; + + write!(fmt, "&raw {} {:?}", kind_str, place) + } + Aggregate(ref kind, ref places) => { fn fmt_tuple(fmt: &mut Formatter<'_>, places: &[Operand<'_>]) -> fmt::Result { let mut tuple_fmt = fmt.debug_tuple(""); @@ -2333,11 +2294,9 @@ impl Constant<'tcx> { Some(GlobalAlloc::Static(def_id)) => Some(def_id), Some(_) => None, None => { - tcx.sess.delay_span_bug( - DUMMY_SP, "MIR cannot contain dangling const pointers", - ); + tcx.sess.delay_span_bug(DUMMY_SP, "MIR cannot contain dangling const pointers"); None - }, + } }, _ => None, } @@ -2390,15 +2349,13 @@ impl<'tcx> UserTypeProjections { UserTypeProjections { contents: projs.collect() } } - pub fn projections_and_spans(&self) - -> impl Iterator + ExactSizeIterator - { + pub fn projections_and_spans( + &self, + ) -> impl Iterator + ExactSizeIterator { self.contents.iter() } - pub fn projections(&self) - -> impl Iterator + ExactSizeIterator - { + pub fn projections(&self) -> impl Iterator + ExactSizeIterator { self.contents.iter().map(|&(ref user_type, _span)| user_type) } @@ -2505,11 +2462,15 @@ impl<'tcx> TypeFoldable<'tcx> for UserTypeProjection { let projs: Vec<_> = self .projs .iter() - .map(|elem| match elem { + .map(|&elem| match elem { Deref => Deref, - Field(f, ()) => Field(f.clone(), ()), + Field(f, ()) => Field(f, ()), Index(()) => Index(()), - elem => elem.clone(), + Downcast(symbol, variantidx) => Downcast(symbol, variantidx), + ConstantIndex { offset, min_length, from_end } => { + ConstantIndex { offset, min_length, from_end } + } + Subslice { from, to, from_end } => Subslice { from, to, from_end }, }) .collect(); @@ -2566,10 +2527,7 @@ impl<'tcx> graph::WithStartNode for Body<'tcx> { } impl<'tcx> graph::WithSuccessors for Body<'tcx> { - fn successors( - &self, - node: Self::Node, - ) -> >::Iter { + fn successors(&self, node: Self::Node) -> >::Iter { self.basic_blocks[node].terminator().successors().cloned() } } @@ -2611,7 +2569,7 @@ impl Location { pub fn is_predecessor_of<'tcx>( &self, other: Location, - body: ReadOnlyBodyAndCache<'_, 'tcx> + body: ReadOnlyBodyAndCache<'_, 'tcx>, ) -> bool { // If we are in the same block as the other location and are an earlier statement // then we are a predecessor of `other`. @@ -2650,221 +2608,6 @@ impl Location { } } -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, HashStable)] -pub enum UnsafetyViolationKind { - General, - /// Permitted both in `const fn`s and regular `fn`s. - GeneralAndConstFn, - BorrowPacked(hir::HirId), -} - -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, HashStable)] -pub struct UnsafetyViolation { - pub source_info: SourceInfo, - pub description: Symbol, - pub details: Symbol, - pub kind: UnsafetyViolationKind, -} - -#[derive(Clone, RustcEncodable, RustcDecodable, HashStable)] -pub struct UnsafetyCheckResult { - /// Violations that are propagated *upwards* from this function. - pub violations: Lrc<[UnsafetyViolation]>, - /// `unsafe` blocks in this function, along with whether they are used. This is - /// used for the "unused_unsafe" lint. - pub unsafe_blocks: Lrc<[(hir::HirId, bool)]>, -} - -rustc_index::newtype_index! { - pub struct GeneratorSavedLocal { - derive [HashStable] - DEBUG_FORMAT = "_{}", - } -} - -/// The layout of generator state. -#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] -pub struct GeneratorLayout<'tcx> { - /// The type of every local stored inside the generator. - pub field_tys: IndexVec>, - - /// Which of the above fields are in each variant. Note that one field may - /// be stored in multiple variants. - pub variant_fields: IndexVec>, - - /// Which saved locals are storage-live at the same time. Locals that do not - /// have conflicts with each other are allowed to overlap in the computed - /// layout. - pub storage_conflicts: BitMatrix, -} - -#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] -pub struct BorrowCheckResult<'tcx> { - pub closure_requirements: Option>, - pub used_mut_upvars: SmallVec<[Field; 8]>, -} - -/// The result of the `mir_const_qualif` query. -/// -/// Each field corresponds to an implementer of the `Qualif` trait in -/// `librustc_mir/transform/check_consts/qualifs.rs`. See that file for more information on each -/// `Qualif`. -#[derive(Clone, Copy, Debug, Default, RustcEncodable, RustcDecodable, HashStable)] -pub struct ConstQualifs { - pub has_mut_interior: bool, - pub needs_drop: bool, -} - -/// After we borrow check a closure, we are left with various -/// requirements that we have inferred between the free regions that -/// appear in the closure's signature or on its field types. These -/// requirements are then verified and proved by the closure's -/// creating function. This struct encodes those requirements. -/// -/// The requirements are listed as being between various -/// `RegionVid`. The 0th region refers to `'static`; subsequent region -/// vids refer to the free regions that appear in the closure (or -/// generator's) type, in order of appearance. (This numbering is -/// actually defined by the `UniversalRegions` struct in the NLL -/// region checker. See for example -/// `UniversalRegions::closure_mapping`.) Note that we treat the free -/// regions in the closure's type "as if" they were erased, so their -/// precise identity is not important, only their position. -/// -/// Example: If type check produces a closure with the closure substs: -/// -/// ```text -/// ClosureSubsts = [ -/// i8, // the "closure kind" -/// for<'x> fn(&'a &'x u32) -> &'x u32, // the "closure signature" -/// &'a String, // some upvar -/// ] -/// ``` -/// -/// here, there is one unique free region (`'a`) but it appears -/// twice. We would "renumber" each occurrence to a unique vid, as follows: -/// -/// ```text -/// ClosureSubsts = [ -/// i8, // the "closure kind" -/// for<'x> fn(&'1 &'x u32) -> &'x u32, // the "closure signature" -/// &'2 String, // some upvar -/// ] -/// ``` -/// -/// Now the code might impose a requirement like `'1: '2`. When an -/// instance of the closure is created, the corresponding free regions -/// can be extracted from its type and constrained to have the given -/// outlives relationship. -/// -/// In some cases, we have to record outlives requirements between -/// types and regions as well. In that case, if those types include -/// any regions, those regions are recorded as `ReClosureBound` -/// instances assigned one of these same indices. Those regions will -/// be substituted away by the creator. We use `ReClosureBound` in -/// that case because the regions must be allocated in the global -/// `TyCtxt`, and hence we cannot use `ReVar` (which is what we use -/// internally within the rest of the NLL code). -#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] -pub struct ClosureRegionRequirements<'tcx> { - /// The number of external regions defined on the closure. In our - /// example above, it would be 3 -- one for `'static`, then `'1` - /// and `'2`. This is just used for a sanity check later on, to - /// make sure that the number of regions we see at the callsite - /// matches. - pub num_external_vids: usize, - - /// Requirements between the various free regions defined in - /// indices. - pub outlives_requirements: Vec>, -} - -/// Indicates an outlives-constraint between a type or between two -/// free regions declared on the closure. -#[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] -pub struct ClosureOutlivesRequirement<'tcx> { - // This region or type ... - pub subject: ClosureOutlivesSubject<'tcx>, - - // ... must outlive this one. - pub outlived_free_region: ty::RegionVid, - - // If not, report an error here ... - pub blame_span: Span, - - // ... due to this reason. - pub category: ConstraintCategory, -} - -/// Outlives-constraints can be categorized to determine whether and why they -/// are interesting (for error reporting). Order of variants indicates sort -/// order of the category, thereby influencing diagnostic output. -/// -/// See also [rustc_mir::borrow_check::nll::constraints]. -#[derive( - Copy, - Clone, - Debug, - Eq, - PartialEq, - PartialOrd, - Ord, - Hash, - RustcEncodable, - RustcDecodable, - HashStable, -)] -pub enum ConstraintCategory { - Return, - Yield, - UseAsConst, - UseAsStatic, - TypeAnnotation, - Cast, - - /// A constraint that came from checking the body of a closure. - /// - /// We try to get the category that the closure used when reporting this. - ClosureBounds, - CallArgument, - CopyBound, - SizedBound, - Assignment, - OpaqueType, - - /// A "boring" constraint (caused by the given location) is one that - /// the user probably doesn't want to see described in diagnostics, - /// because it is kind of an artifact of the type system setup. - /// Example: `x = Foo { field: y }` technically creates - /// intermediate regions representing the "type of `Foo { field: y - /// }`", and data flows from `y` into those variables, but they - /// are not very interesting. The assignment into `x` on the other - /// hand might be. - Boring, - // Boring and applicable everywhere. - BoringNoLocation, - - /// A constraint that doesn't correspond to anything the user sees. - Internal, -} - -/// The subject of a `ClosureOutlivesRequirement` -- that is, the thing -/// that must outlive some region. -#[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] -pub enum ClosureOutlivesSubject<'tcx> { - /// Subject is a type, typically a type parameter, but could also - /// be a projection. Indicates a requirement like `T: 'a` being - /// passed to the caller, where the type here is `T`. - /// - /// The type here is guaranteed not to contain any free regions at - /// present. - Ty(Ty<'tcx>), - - /// Subject is a free region from the closure. Indicates a requirement - /// like `'a: 'b` being passed to the caller; the region here is `'a`. - Region(ty::RegionVid), -} - /* * `TypeFoldable` implementations for MIR types */ @@ -2872,7 +2615,6 @@ pub enum ClosureOutlivesSubject<'tcx> { CloneTypeFoldableAndLiftImpls! { BlockTailInfo, MirPhase, - Mutability, SourceInfo, FakeReadCause, RetagKind, @@ -2921,14 +2663,16 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> { Assert { ref cond, expected, ref msg, target, cleanup } => { use PanicInfo::*; let msg = match msg { - BoundsCheck { ref len, ref index } => - BoundsCheck { - len: len.fold_with(folder), - index: index.fold_with(folder), - }, - Panic { .. } | Overflow(_) | OverflowNeg | DivisionByZero | RemainderByZero | - ResumedAfterReturn(_) | ResumedAfterPanic(_) => - msg.clone(), + BoundsCheck { ref len, ref index } => { + BoundsCheck { len: len.fold_with(folder), index: index.fold_with(folder) } + } + Panic { .. } + | Overflow(_) + | OverflowNeg + | DivisionByZero + | RemainderByZero + | ResumedAfterReturn(_) + | ResumedAfterPanic(_) => msg.clone(), }; Assert { cond: cond.fold_with(folder), expected, msg, target, cleanup } } @@ -2969,12 +2713,16 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> { if cond.visit_with(visitor) { use PanicInfo::*; match msg { - BoundsCheck { ref len, ref index } => - len.visit_with(visitor) || index.visit_with(visitor), - Panic { .. } | Overflow(_) | OverflowNeg | - DivisionByZero | RemainderByZero | - ResumedAfterReturn(_) | ResumedAfterPanic(_) => - false + BoundsCheck { ref len, ref index } => { + len.visit_with(visitor) || index.visit_with(visitor) + } + Panic { .. } + | Overflow(_) + | OverflowNeg + | DivisionByZero + | RemainderByZero + | ResumedAfterReturn(_) + | ResumedAfterPanic(_) => false, } } else { false @@ -3004,30 +2752,11 @@ impl<'tcx> TypeFoldable<'tcx> for GeneratorKind { impl<'tcx> TypeFoldable<'tcx> for Place<'tcx> { fn super_fold_with>(&self, folder: &mut F) -> Self { - Place { - base: self.base.fold_with(folder), - projection: self.projection.fold_with(folder), - } - } - - fn super_visit_with>(&self, visitor: &mut V) -> bool { - self.base.visit_with(visitor) || self.projection.visit_with(visitor) - } -} - -impl<'tcx> TypeFoldable<'tcx> for PlaceBase<'tcx> { - fn super_fold_with>(&self, folder: &mut F) -> Self { - match self { - PlaceBase::Local(local) => PlaceBase::Local(local.fold_with(folder)), - PlaceBase::Static(static_) => PlaceBase::Static(static_.fold_with(folder)), - } + Place { local: self.local.fold_with(folder), projection: self.projection.fold_with(folder) } } fn super_visit_with>(&self, visitor: &mut V) -> bool { - match self { - PlaceBase::Local(local) => local.visit_with(visitor), - PlaceBase::Static(static_) => (**static_).visit_with(visitor), - } + self.local.visit_with(visitor) || self.projection.visit_with(visitor) } } @@ -3042,40 +2771,6 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List> { } } -impl<'tcx> TypeFoldable<'tcx> for Static<'tcx> { - fn super_fold_with>(&self, folder: &mut F) -> Self { - Static { - ty: self.ty.fold_with(folder), - kind: self.kind.fold_with(folder), - def_id: self.def_id, - } - } - - fn super_visit_with>(&self, visitor: &mut V) -> bool { - let Static { ty, kind, def_id: _ } = self; - - ty.visit_with(visitor) || kind.visit_with(visitor) - } -} - -impl<'tcx> TypeFoldable<'tcx> for StaticKind<'tcx> { - fn super_fold_with>(&self, folder: &mut F) -> Self { - match self { - StaticKind::Promoted(promoted, substs) => - StaticKind::Promoted(promoted.fold_with(folder), substs.fold_with(folder)), - StaticKind::Static => StaticKind::Static - } - } - - fn super_visit_with>(&self, visitor: &mut V) -> bool { - match self { - StaticKind::Promoted(promoted, substs) => - promoted.visit_with(visitor) || substs.visit_with(visitor), - StaticKind::Static => { false } - } - } -} - impl<'tcx> TypeFoldable<'tcx> for Rvalue<'tcx> { fn super_fold_with>(&self, folder: &mut F) -> Self { use crate::mir::Rvalue::*; @@ -3085,6 +2780,7 @@ impl<'tcx> TypeFoldable<'tcx> for Rvalue<'tcx> { Ref(region, bk, ref place) => { Ref(region.fold_with(folder), bk, place.fold_with(folder)) } + AddressOf(mutability, ref place) => AddressOf(mutability, place.fold_with(folder)), Len(ref place) => Len(place.fold_with(folder)), Cast(kind, ref op, ty) => Cast(kind, op.fold_with(folder), ty.fold_with(folder)), BinaryOp(op, ref rhs, ref lhs) => { @@ -3125,6 +2821,7 @@ impl<'tcx> TypeFoldable<'tcx> for Rvalue<'tcx> { Use(ref op) => op.visit_with(visitor), Repeat(ref op, _) => op.visit_with(visitor), Ref(region, _, ref place) => region.visit_with(visitor) || place.visit_with(visitor), + AddressOf(_, ref place) => place.visit_with(visitor), Len(ref place) => place.visit_with(visitor), Cast(_, ref op, ty) => op.visit_with(visitor) || ty.visit_with(visitor), BinaryOp(_, ref rhs, ref lhs) | CheckedBinaryOp(_, ref rhs, ref lhs) => { @@ -3169,11 +2866,15 @@ impl<'tcx> TypeFoldable<'tcx> for PlaceElem<'tcx> { fn super_fold_with>(&self, folder: &mut F) -> Self { use crate::mir::ProjectionElem::*; - match self { + match *self { Deref => Deref, - Field(f, ty) => Field(*f, ty.fold_with(folder)), + Field(f, ty) => Field(f, ty.fold_with(folder)), Index(v) => Index(v.fold_with(folder)), - elem => elem.clone(), + Downcast(symbol, variantidx) => Downcast(symbol, variantidx), + ConstantIndex { offset, min_length, from_end } => { + ConstantIndex { offset, min_length, from_end } + } + Subslice { from, to, from_end } => Subslice { from, to, from_end }, } } @@ -3218,7 +2919,7 @@ impl<'tcx, R: Idx, C: Idx> TypeFoldable<'tcx> for BitMatrix { impl<'tcx> TypeFoldable<'tcx> for Constant<'tcx> { fn super_fold_with>(&self, folder: &mut F) -> Self { Constant { - span: self.span.clone(), + span: self.span, user_ty: self.user_ty.fold_with(folder), literal: self.literal.fold_with(folder), } diff --git a/src/librustc/mir/mono.rs b/src/librustc/mir/mono.rs index 34daf185b2..d197326646 100644 --- a/src/librustc/mir/mono.rs +++ b/src/librustc/mir/mono.rs @@ -1,18 +1,18 @@ -use crate::hir::def_id::{DefId, CrateNum, LOCAL_CRATE}; -use crate::hir::HirId; -use syntax::symbol::Symbol; -use syntax::attr::InlineAttr; -use syntax::source_map::Span; -use crate::ty::{Instance, InstanceDef, TyCtxt, SymbolName, subst::InternalSubsts}; -use crate::util::nodemap::FxHashMap; +use crate::dep_graph::{DepConstructor, DepNode, WorkProduct, WorkProductId}; +use crate::ich::{Fingerprint, NodeIdHashingMode, StableHashingContext}; +use crate::session::config::OptLevel; use crate::ty::print::obsolete::DefPathBasedNames; -use crate::dep_graph::{WorkProductId, DepNode, WorkProduct, DepConstructor}; +use crate::ty::{subst::InternalSubsts, Instance, InstanceDef, SymbolName, TyCtxt}; use rustc_data_structures::base_n; +use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; -use crate::ich::{Fingerprint, StableHashingContext, NodeIdHashingMode}; -use crate::session::config::OptLevel; +use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; +use rustc_hir::HirId; +use rustc_span::source_map::Span; +use rustc_span::symbol::Symbol; use std::fmt; use std::hash::Hash; +use syntax::attr::InlineAttr; /// Describes how a monomorphization will be instantiated in object files. #[derive(PartialEq)] @@ -53,62 +53,57 @@ impl<'tcx> MonoItem<'tcx> { // Estimate the size of a function based on how many statements // it contains. tcx.instance_def_size_estimate(instance.def) - }, + } // Conservatively estimate the size of a static declaration // or assembly to be 1. - MonoItem::Static(_) | - MonoItem::GlobalAsm(_) => 1, + MonoItem::Static(_) | MonoItem::GlobalAsm(_) => 1, } } pub fn is_generic_fn(&self) -> bool { match *self { - MonoItem::Fn(ref instance) => { - instance.substs.non_erasable_generics().next().is_some() - } - MonoItem::Static(..) | - MonoItem::GlobalAsm(..) => false, + MonoItem::Fn(ref instance) => instance.substs.non_erasable_generics().next().is_some(), + MonoItem::Static(..) | MonoItem::GlobalAsm(..) => false, } } pub fn symbol_name(&self, tcx: TyCtxt<'tcx>) -> SymbolName { match *self { MonoItem::Fn(instance) => tcx.symbol_name(instance), - MonoItem::Static(def_id) => { - tcx.symbol_name(Instance::mono(tcx, def_id)) - } + MonoItem::Static(def_id) => tcx.symbol_name(Instance::mono(tcx, def_id)), MonoItem::GlobalAsm(hir_id) => { let def_id = tcx.hir().local_def_id(hir_id); - SymbolName { - name: Symbol::intern(&format!("global_asm_{:?}", def_id)) - } + SymbolName { name: Symbol::intern(&format!("global_asm_{:?}", def_id)) } } } } pub fn instantiation_mode(&self, tcx: TyCtxt<'tcx>) -> InstantiationMode { - let inline_in_all_cgus = - tcx.sess.opts.debugging_opts.inline_in_all_cgus.unwrap_or_else(|| { - tcx.sess.opts.optimize != OptLevel::No - }) && !tcx.sess.opts.cg.link_dead_code; + let generate_cgu_internal_copies = tcx + .sess + .opts + .debugging_opts + .inline_in_all_cgus + .unwrap_or_else(|| tcx.sess.opts.optimize != OptLevel::No) + && !tcx.sess.opts.cg.link_dead_code; match *self { MonoItem::Fn(ref instance) => { let entry_def_id = tcx.entry_fn(LOCAL_CRATE).map(|(id, _)| id); // If this function isn't inlined or otherwise has explicit // linkage, then we'll be creating a globally shared version. - if self.explicit_linkage(tcx).is_some() || - !instance.def.requires_local(tcx) || - Some(instance.def_id()) == entry_def_id + if self.explicit_linkage(tcx).is_some() + || !instance.def.generates_cgu_internal_copy(tcx) + || Some(instance.def_id()) == entry_def_id { - return InstantiationMode::GloballyShared { may_conflict: false } + return InstantiationMode::GloballyShared { may_conflict: false }; } // At this point we don't have explicit linkage and we're an // inlined function. If we're inlining into all CGUs then we'll // be creating a local copy per CGU - if inline_in_all_cgus { - return InstantiationMode::LocalCopy + if generate_cgu_internal_copies { + return InstantiationMode::LocalCopy; } // Finally, if this is `#[inline(always)]` we're sure to respect @@ -118,13 +113,10 @@ impl<'tcx> MonoItem<'tcx> { // symbol. match tcx.codegen_fn_attrs(instance.def_id()).inline { InlineAttr::Always => InstantiationMode::LocalCopy, - _ => { - InstantiationMode::GloballyShared { may_conflict: true } - } + _ => InstantiationMode::GloballyShared { may_conflict: true }, } } - MonoItem::Static(..) | - MonoItem::GlobalAsm(..) => { + MonoItem::Static(..) | MonoItem::GlobalAsm(..) => { InstantiationMode::GloballyShared { may_conflict: false } } } @@ -172,7 +164,7 @@ impl<'tcx> MonoItem<'tcx> { MonoItem::Fn(ref instance) => (instance.def_id(), instance.substs), MonoItem::Static(def_id) => (def_id, InternalSubsts::empty()), // global asm never has predicates - MonoItem::GlobalAsm(..) => return true + MonoItem::GlobalAsm(..) => return true, }; tcx.substitute_normalize_and_test_predicates((def_id, &substs)) @@ -180,16 +172,12 @@ impl<'tcx> MonoItem<'tcx> { pub fn to_string(&self, tcx: TyCtxt<'tcx>, debug: bool) -> String { return match *self { - MonoItem::Fn(instance) => { - to_string_internal(tcx, "fn ", instance, debug) - }, + MonoItem::Fn(instance) => to_string_internal(tcx, "fn ", instance, debug), MonoItem::Static(def_id) => { let instance = Instance::new(def_id, tcx.intern_substs(&[])); to_string_internal(tcx, "static ", instance, debug) - }, - MonoItem::GlobalAsm(..) => { - "global_asm".to_string() } + MonoItem::GlobalAsm(..) => "global_asm".to_string(), }; fn to_string_internal<'tcx>( @@ -208,16 +196,11 @@ impl<'tcx> MonoItem<'tcx> { pub fn local_span(&self, tcx: TyCtxt<'tcx>) -> Option { match *self { - MonoItem::Fn(Instance { def, .. }) => { - tcx.hir().as_local_hir_id(def.def_id()) - } - MonoItem::Static(def_id) => { - tcx.hir().as_local_hir_id(def_id) - } - MonoItem::GlobalAsm(hir_id) => { - Some(hir_id) - } - }.map(|hir_id| tcx.hir().span(hir_id)) + MonoItem::Fn(Instance { def, .. }) => tcx.hir().as_local_hir_id(def.def_id()), + MonoItem::Static(def_id) => tcx.hir().as_local_hir_id(def_id), + MonoItem::GlobalAsm(hir_id) => Some(hir_id), + } + .map(|hir_id| tcx.hir().span(hir_id)) } } @@ -275,11 +258,7 @@ pub enum Visibility { impl<'tcx> CodegenUnit<'tcx> { pub fn new(name: Symbol) -> CodegenUnit<'tcx> { - CodegenUnit { - name: name, - items: Default::default(), - size_estimate: None, - } + CodegenUnit { name: name, items: Default::default(), size_estimate: None } } pub fn name(&self) -> Symbol { @@ -294,9 +273,7 @@ impl<'tcx> CodegenUnit<'tcx> { &self.items } - pub fn items_mut(&mut self) - -> &mut FxHashMap, (Linkage, Visibility)> - { + pub fn items_mut(&mut self) -> &mut FxHashMap, (Linkage, Visibility)> { &mut self.items } @@ -339,10 +316,8 @@ impl<'tcx> CodegenUnit<'tcx> { pub fn work_product(&self, tcx: TyCtxt<'_>) -> WorkProduct { let work_product_id = self.work_product_id(); tcx.dep_graph - .previous_work_product(&work_product_id) - .unwrap_or_else(|| { - panic!("Could not find work-product for CGU `{}`", self.name()) - }) + .previous_work_product(&work_product_id) + .unwrap_or_else(|| panic!("Could not find work-product for CGU `{}`", self.name())) } pub fn items_in_deterministic_order( @@ -355,35 +330,30 @@ impl<'tcx> CodegenUnit<'tcx> { pub struct ItemSortKey(Option, SymbolName); fn item_sort_key<'tcx>(tcx: TyCtxt<'tcx>, item: MonoItem<'tcx>) -> ItemSortKey { - ItemSortKey(match item { - MonoItem::Fn(ref instance) => { - match instance.def { - // We only want to take HirIds of user-defined - // instances into account. The others don't matter for - // the codegen tests and can even make item order - // unstable. - InstanceDef::Item(def_id) => { - tcx.hir().as_local_hir_id(def_id) - } - InstanceDef::VtableShim(..) | - InstanceDef::ReifyShim(..) | - InstanceDef::Intrinsic(..) | - InstanceDef::FnPtrShim(..) | - InstanceDef::Virtual(..) | - InstanceDef::ClosureOnceShim { .. } | - InstanceDef::DropGlue(..) | - InstanceDef::CloneShim(..) => { - None + ItemSortKey( + match item { + MonoItem::Fn(ref instance) => { + match instance.def { + // We only want to take HirIds of user-defined + // instances into account. The others don't matter for + // the codegen tests and can even make item order + // unstable. + InstanceDef::Item(def_id) => tcx.hir().as_local_hir_id(def_id), + InstanceDef::VtableShim(..) + | InstanceDef::ReifyShim(..) + | InstanceDef::Intrinsic(..) + | InstanceDef::FnPtrShim(..) + | InstanceDef::Virtual(..) + | InstanceDef::ClosureOnceShim { .. } + | InstanceDef::DropGlue(..) + | InstanceDef::CloneShim(..) => None, } } - } - MonoItem::Static(def_id) => { - tcx.hir().as_local_hir_id(def_id) - } - MonoItem::GlobalAsm(hir_id) => { - Some(hir_id) - } - }, item.symbol_name(tcx)) + MonoItem::Static(def_id) => tcx.hir().as_local_hir_id(def_id), + MonoItem::GlobalAsm(hir_id) => Some(hir_id), + }, + item.symbol_name(tcx), + ) } let mut items: Vec<_> = self.items().iter().map(|(&i, &l)| (i, l)).collect(); @@ -392,7 +362,7 @@ impl<'tcx> CodegenUnit<'tcx> { } pub fn codegen_dep_node(&self, tcx: TyCtxt<'tcx>) -> DepNode { - DepNode::new(tcx, DepConstructor::CompileCodegenUnit(self.name().clone())) + DepNode::new(tcx, DepConstructor::CompileCodegenUnit(self.name())) } } @@ -407,12 +377,15 @@ impl<'a, 'tcx> HashStable> for CodegenUnit<'tcx> { name.hash_stable(hcx, hasher); - let mut items: Vec<(Fingerprint, _)> = items.iter().map(|(mono_item, &attrs)| { - let mut hasher = StableHasher::new(); - mono_item.hash_stable(hcx, &mut hasher); - let mono_item_fingerprint = hasher.finish(); - (mono_item_fingerprint, attrs) - }).collect(); + let mut items: Vec<(Fingerprint, _)> = items + .iter() + .map(|(mono_item, &attrs)| { + let mut hasher = StableHasher::new(); + mono_item.hash_stable(hcx, &mut hasher); + let mono_item_fingerprint = hasher.finish(); + (mono_item_fingerprint, attrs) + }) + .collect(); items.sort_unstable_by_key(|i| i.0); items.hash_stable(hcx, hasher); @@ -426,10 +399,7 @@ pub struct CodegenUnitNameBuilder<'tcx> { impl CodegenUnitNameBuilder<'tcx> { pub fn new(tcx: TyCtxt<'tcx>) -> Self { - CodegenUnitNameBuilder { - tcx, - cache: Default::default(), - } + CodegenUnitNameBuilder { tcx, cache: Default::default() } } /// CGU names should fulfill the following requirements: @@ -450,18 +420,18 @@ impl CodegenUnitNameBuilder<'tcx> { /// The '.' before `` makes sure that names with a special /// suffix can never collide with a name built out of regular Rust /// identifiers (e.g., module paths). - pub fn build_cgu_name(&mut self, - cnum: CrateNum, - components: I, - special_suffix: Option) - -> Symbol - where I: IntoIterator, - C: fmt::Display, - S: fmt::Display, + pub fn build_cgu_name( + &mut self, + cnum: CrateNum, + components: I, + special_suffix: Option, + ) -> Symbol + where + I: IntoIterator, + C: fmt::Display, + S: fmt::Display, { - let cgu_name = self.build_cgu_name_no_mangle(cnum, - components, - special_suffix); + let cgu_name = self.build_cgu_name_no_mangle(cnum, components, special_suffix); if self.tcx.sess.opts.debugging_opts.human_readable_cgu_names { cgu_name @@ -473,14 +443,16 @@ impl CodegenUnitNameBuilder<'tcx> { /// Same as `CodegenUnit::build_cgu_name()` but will never mangle the /// resulting name. - pub fn build_cgu_name_no_mangle(&mut self, - cnum: CrateNum, - components: I, - special_suffix: Option) - -> Symbol - where I: IntoIterator, - C: fmt::Display, - S: fmt::Display, + pub fn build_cgu_name_no_mangle( + &mut self, + cnum: CrateNum, + components: I, + special_suffix: Option, + ) -> Symbol + where + I: IntoIterator, + C: fmt::Display, + S: fmt::Display, { use std::fmt::Write; @@ -493,21 +465,15 @@ impl CodegenUnitNameBuilder<'tcx> { // local crate's ID. Otherwise there can be collisions between CGUs // instantiating stuff for upstream crates. let local_crate_id = if cnum != LOCAL_CRATE { - let local_crate_disambiguator = - format!("{}", tcx.crate_disambiguator(LOCAL_CRATE)); - format!("-in-{}.{}", - tcx.crate_name(LOCAL_CRATE), - &local_crate_disambiguator[0 .. 8]) + let local_crate_disambiguator = format!("{}", tcx.crate_disambiguator(LOCAL_CRATE)); + format!("-in-{}.{}", tcx.crate_name(LOCAL_CRATE), &local_crate_disambiguator[0..8]) } else { String::new() }; let crate_disambiguator = tcx.crate_disambiguator(cnum).to_string(); // Using a shortened disambiguator of about 40 bits - format!("{}.{}{}", - tcx.crate_name(cnum), - &crate_disambiguator[0 .. 8], - local_crate_id) + format!("{}.{}{}", tcx.crate_name(cnum), &crate_disambiguator[0..8], local_crate_id) }); write!(cgu_name, "{}", crate_prefix).unwrap(); diff --git a/src/librustc/mir/query.rs b/src/librustc/mir/query.rs new file mode 100644 index 0000000000..34f58ab89b --- /dev/null +++ b/src/librustc/mir/query.rs @@ -0,0 +1,223 @@ +//! Values computed by queries that use MIR. + +use crate::ty::{self, Ty}; +use rustc_data_structures::sync::Lrc; +use rustc_hir as hir; +use rustc_index::bit_set::BitMatrix; +use rustc_index::vec::IndexVec; +use rustc_span::{Span, Symbol}; +use rustc_target::abi::VariantIdx; +use smallvec::SmallVec; + +use super::{Field, SourceInfo}; + +#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, HashStable)] +pub enum UnsafetyViolationKind { + General, + /// Permitted both in `const fn`s and regular `fn`s. + GeneralAndConstFn, + BorrowPacked(hir::HirId), +} + +#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, HashStable)] +pub struct UnsafetyViolation { + pub source_info: SourceInfo, + pub description: Symbol, + pub details: Symbol, + pub kind: UnsafetyViolationKind, +} + +#[derive(Clone, RustcEncodable, RustcDecodable, HashStable)] +pub struct UnsafetyCheckResult { + /// Violations that are propagated *upwards* from this function. + pub violations: Lrc<[UnsafetyViolation]>, + /// `unsafe` blocks in this function, along with whether they are used. This is + /// used for the "unused_unsafe" lint. + pub unsafe_blocks: Lrc<[(hir::HirId, bool)]>, +} + +rustc_index::newtype_index! { + pub struct GeneratorSavedLocal { + derive [HashStable] + DEBUG_FORMAT = "_{}", + } +} + +/// The layout of generator state. +#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] +pub struct GeneratorLayout<'tcx> { + /// The type of every local stored inside the generator. + pub field_tys: IndexVec>, + + /// Which of the above fields are in each variant. Note that one field may + /// be stored in multiple variants. + pub variant_fields: IndexVec>, + + /// Which saved locals are storage-live at the same time. Locals that do not + /// have conflicts with each other are allowed to overlap in the computed + /// layout. + pub storage_conflicts: BitMatrix, +} + +#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] +pub struct BorrowCheckResult<'tcx> { + pub closure_requirements: Option>, + pub used_mut_upvars: SmallVec<[Field; 8]>, +} + +/// The result of the `mir_const_qualif` query. +/// +/// Each field corresponds to an implementer of the `Qualif` trait in +/// `librustc_mir/transform/check_consts/qualifs.rs`. See that file for more information on each +/// `Qualif`. +#[derive(Clone, Copy, Debug, Default, RustcEncodable, RustcDecodable, HashStable)] +pub struct ConstQualifs { + pub has_mut_interior: bool, + pub needs_drop: bool, +} + +/// After we borrow check a closure, we are left with various +/// requirements that we have inferred between the free regions that +/// appear in the closure's signature or on its field types. These +/// requirements are then verified and proved by the closure's +/// creating function. This struct encodes those requirements. +/// +/// The requirements are listed as being between various +/// `RegionVid`. The 0th region refers to `'static`; subsequent region +/// vids refer to the free regions that appear in the closure (or +/// generator's) type, in order of appearance. (This numbering is +/// actually defined by the `UniversalRegions` struct in the NLL +/// region checker. See for example +/// `UniversalRegions::closure_mapping`.) Note that we treat the free +/// regions in the closure's type "as if" they were erased, so their +/// precise identity is not important, only their position. +/// +/// Example: If type check produces a closure with the closure substs: +/// +/// ```text +/// ClosureSubsts = [ +/// i8, // the "closure kind" +/// for<'x> fn(&'a &'x u32) -> &'x u32, // the "closure signature" +/// &'a String, // some upvar +/// ] +/// ``` +/// +/// here, there is one unique free region (`'a`) but it appears +/// twice. We would "renumber" each occurrence to a unique vid, as follows: +/// +/// ```text +/// ClosureSubsts = [ +/// i8, // the "closure kind" +/// for<'x> fn(&'1 &'x u32) -> &'x u32, // the "closure signature" +/// &'2 String, // some upvar +/// ] +/// ``` +/// +/// Now the code might impose a requirement like `'1: '2`. When an +/// instance of the closure is created, the corresponding free regions +/// can be extracted from its type and constrained to have the given +/// outlives relationship. +/// +/// In some cases, we have to record outlives requirements between +/// types and regions as well. In that case, if those types include +/// any regions, those regions are recorded as `ReClosureBound` +/// instances assigned one of these same indices. Those regions will +/// be substituted away by the creator. We use `ReClosureBound` in +/// that case because the regions must be allocated in the global +/// `TyCtxt`, and hence we cannot use `ReVar` (which is what we use +/// internally within the rest of the NLL code). +#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] +pub struct ClosureRegionRequirements<'tcx> { + /// The number of external regions defined on the closure. In our + /// example above, it would be 3 -- one for `'static`, then `'1` + /// and `'2`. This is just used for a sanity check later on, to + /// make sure that the number of regions we see at the callsite + /// matches. + pub num_external_vids: usize, + + /// Requirements between the various free regions defined in + /// indices. + pub outlives_requirements: Vec>, +} + +/// Indicates an outlives-constraint between a type or between two +/// free regions declared on the closure. +#[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] +pub struct ClosureOutlivesRequirement<'tcx> { + // This region or type ... + pub subject: ClosureOutlivesSubject<'tcx>, + + // ... must outlive this one. + pub outlived_free_region: ty::RegionVid, + + // If not, report an error here ... + pub blame_span: Span, + + // ... due to this reason. + pub category: ConstraintCategory, +} + +/// Outlives-constraints can be categorized to determine whether and why they +/// are interesting (for error reporting). Order of variants indicates sort +/// order of the category, thereby influencing diagnostic output. +/// +/// See also [rustc_mir::borrow_check::nll::constraints]. +#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)] +#[derive(RustcEncodable, RustcDecodable, HashStable)] +pub enum ConstraintCategory { + Return, + Yield, + UseAsConst, + UseAsStatic, + TypeAnnotation, + Cast, + + /// A constraint that came from checking the body of a closure. + /// + /// We try to get the category that the closure used when reporting this. + ClosureBounds, + CallArgument, + CopyBound, + SizedBound, + Assignment, + OpaqueType, + + /// A "boring" constraint (caused by the given location) is one that + /// the user probably doesn't want to see described in diagnostics, + /// because it is kind of an artifact of the type system setup. + /// Example: `x = Foo { field: y }` technically creates + /// intermediate regions representing the "type of `Foo { field: y + /// }`", and data flows from `y` into those variables, but they + /// are not very interesting. The assignment into `x` on the other + /// hand might be. + Boring, + // Boring and applicable everywhere. + BoringNoLocation, + + /// A constraint that doesn't correspond to anything the user sees. + Internal, +} + +/// The subject of a `ClosureOutlivesRequirement` -- that is, the thing +/// that must outlive some region. +#[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] +pub enum ClosureOutlivesSubject<'tcx> { + /// Subject is a type, typically a type parameter, but could also + /// be a projection. Indicates a requirement like `T: 'a` being + /// passed to the caller, where the type here is `T`. + /// + /// The type here is guaranteed not to contain any free regions at + /// present. + Ty(Ty<'tcx>), + + /// Subject is a free region from the closure. Indicates a requirement + /// like `'a: 'b` being passed to the caller; the region here is `'a`. + Region(ty::RegionVid), +} + +/// The constituent parts of an ADT or array. +#[derive(Copy, Clone, Debug, HashStable)] +pub struct DestructuredConst<'tcx> { + pub variant: VariantIdx, + pub fields: &'tcx [&'tcx ty::Const<'tcx>], +} diff --git a/src/librustc/mir/tcx.rs b/src/librustc/mir/tcx.rs index 445fa6ea8c..e2aac562cc 100644 --- a/src/librustc/mir/tcx.rs +++ b/src/librustc/mir/tcx.rs @@ -4,11 +4,11 @@ */ use crate::mir::*; -use crate::ty::subst::Subst; -use crate::ty::{self, Ty, TyCtxt}; use crate::ty::layout::VariantIdx; -use crate::hir; +use crate::ty::subst::Subst; use crate::ty::util::IntTypeExt; +use crate::ty::{self, Ty, TyCtxt}; +use rustc_hir as hir; #[derive(Copy, Clone, Debug, TypeFoldable)] pub struct PlaceTy<'tcx> { @@ -78,36 +78,34 @@ impl<'tcx> PlaceTy<'tcx> { { let answer = match *elem { ProjectionElem::Deref => { - let ty = self.ty - .builtin_deref(true) - .unwrap_or_else(|| { - bug!("deref projection of non-dereferenceable ty {:?}", self) - }) - .ty; + let ty = self + .ty + .builtin_deref(true) + .unwrap_or_else(|| { + bug!("deref projection of non-dereferenceable ty {:?}", self) + }) + .ty; PlaceTy::from_ty(ty) } - ProjectionElem::Index(_) | ProjectionElem::ConstantIndex { .. } => - PlaceTy::from_ty(self.ty.builtin_index().unwrap()), + ProjectionElem::Index(_) | ProjectionElem::ConstantIndex { .. } => { + PlaceTy::from_ty(self.ty.builtin_index().unwrap()) + } ProjectionElem::Subslice { from, to, from_end } => { PlaceTy::from_ty(match self.ty.kind { ty::Slice(..) => self.ty, - ty::Array(inner, _) if !from_end => { - tcx.mk_array(inner, (to - from) as u64) - } + ty::Array(inner, _) if !from_end => tcx.mk_array(inner, (to - from) as u64), ty::Array(inner, size) if from_end => { let size = size.eval_usize(tcx, param_env); let len = size - (from as u64) - (to as u64); tcx.mk_array(inner, len) } - _ => { - bug!("cannot subslice non-array type: `{:?}`", self) - } + _ => bug!("cannot subslice non-array type: `{:?}`", self), }) } - ProjectionElem::Downcast(_name, index) => - PlaceTy { ty: self.ty, variant_index: Some(index) }, - ProjectionElem::Field(ref f, ref fty) => - PlaceTy::from_ty(handle_field(&self, f, fty)), + ProjectionElem::Downcast(_name, index) => { + PlaceTy { ty: self.ty, variant_index: Some(index) } + } + ProjectionElem::Field(ref f, ref fty) => PlaceTy::from_ty(handle_field(&self, f, fty)), }; debug!("projection_ty self: {:?} elem: {:?} yields: {:?}", self, elem, answer); answer @@ -116,41 +114,32 @@ impl<'tcx> PlaceTy<'tcx> { impl<'tcx> Place<'tcx> { pub fn ty_from( - base: &PlaceBase<'tcx>, + local: &Local, projection: &[PlaceElem<'tcx>], local_decls: &D, - tcx: TyCtxt<'tcx> + tcx: TyCtxt<'tcx>, ) -> PlaceTy<'tcx> - where D: HasLocalDecls<'tcx> + where + D: HasLocalDecls<'tcx>, { - projection.iter().fold( - base.ty(local_decls), - |place_ty, elem| place_ty.projection_ty(tcx, elem) - ) + projection + .iter() + .fold(PlaceTy::from_ty(local_decls.local_decls()[*local].ty), |place_ty, elem| { + place_ty.projection_ty(tcx, elem) + }) } pub fn ty(&self, local_decls: &D, tcx: TyCtxt<'tcx>) -> PlaceTy<'tcx> where D: HasLocalDecls<'tcx>, { - Place::ty_from(&self.base, &self.projection, local_decls, tcx) - } -} - -impl<'tcx> PlaceBase<'tcx> { - pub fn ty(&self, local_decls: &D) -> PlaceTy<'tcx> - where D: HasLocalDecls<'tcx> - { - match self { - PlaceBase::Local(index) => PlaceTy::from_ty(local_decls.local_decls()[*index].ty), - PlaceBase::Static(data) => PlaceTy::from_ty(data.ty), - } + Place::ty_from(&self.local, &self.projection, local_decls, tcx) } } pub enum RvalueInitializationState { Shallow, - Deep + Deep, } impl<'tcx> Rvalue<'tcx> { @@ -160,17 +149,14 @@ impl<'tcx> Rvalue<'tcx> { { match *self { Rvalue::Use(ref operand) => operand.ty(local_decls, tcx), - Rvalue::Repeat(ref operand, count) => { - tcx.mk_array(operand.ty(local_decls, tcx), count) - } + Rvalue::Repeat(ref operand, count) => tcx.mk_array(operand.ty(local_decls, tcx), count), Rvalue::Ref(reg, bk, ref place) => { let place_ty = place.ty(local_decls, tcx).ty; - tcx.mk_ref(reg, - ty::TypeAndMut { - ty: place_ty, - mutbl: bk.to_mutbl_lossy() - } - ) + tcx.mk_ref(reg, ty::TypeAndMut { ty: place_ty, mutbl: bk.to_mutbl_lossy() }) + } + Rvalue::AddressOf(mutability, ref place) => { + let place_ty = place.ty(local_decls, tcx).ty; + tcx.mk_ptr(ty::TypeAndMut { ty: place_ty, mutbl: mutability.into() }) } Rvalue::Len(..) => tcx.types.usize, Rvalue::Cast(.., ty) => ty, @@ -185,8 +171,7 @@ impl<'tcx> Rvalue<'tcx> { let ty = op.ty(tcx, lhs_ty, rhs_ty); tcx.intern_tup(&[ty, tcx.types.bool]) } - Rvalue::UnaryOp(UnOp::Not, ref operand) | - Rvalue::UnaryOp(UnOp::Neg, ref operand) => { + Rvalue::UnaryOp(UnOp::Not, ref operand) | Rvalue::UnaryOp(UnOp::Neg, ref operand) => { operand.ty(local_decls, tcx) } Rvalue::Discriminant(ref place) => { @@ -202,25 +187,15 @@ impl<'tcx> Rvalue<'tcx> { } Rvalue::NullaryOp(NullOp::Box, t) => tcx.mk_box(t), Rvalue::NullaryOp(NullOp::SizeOf, _) => tcx.types.usize, - Rvalue::Aggregate(ref ak, ref ops) => { - match **ak { - AggregateKind::Array(ty) => { - tcx.mk_array(ty, ops.len() as u64) - } - AggregateKind::Tuple => { - tcx.mk_tup(ops.iter().map(|op| op.ty(local_decls, tcx))) - } - AggregateKind::Adt(def, _, substs, _, _) => { - tcx.type_of(def.did).subst(tcx, substs) - } - AggregateKind::Closure(did, substs) => { - tcx.mk_closure(did, substs) - } - AggregateKind::Generator(did, substs, movability) => { - tcx.mk_generator(did, substs, movability) - } + Rvalue::Aggregate(ref ak, ref ops) => match **ak { + AggregateKind::Array(ty) => tcx.mk_array(ty, ops.len() as u64), + AggregateKind::Tuple => tcx.mk_tup(ops.iter().map(|op| op.ty(local_decls, tcx))), + AggregateKind::Adt(def, _, substs, _, _) => tcx.type_of(def.did).subst(tcx, substs), + AggregateKind::Closure(did, substs) => tcx.mk_closure(did, substs), + AggregateKind::Generator(did, substs, movability) => { + tcx.mk_generator(did, substs, movability) } - } + }, } } @@ -230,7 +205,7 @@ impl<'tcx> Rvalue<'tcx> { pub fn initialization_state(&self) -> RvalueInitializationState { match *self { Rvalue::NullaryOp(NullOp::Box, _) => RvalueInitializationState::Shallow, - _ => RvalueInitializationState::Deep + _ => RvalueInitializationState::Deep, } } } @@ -241,8 +216,7 @@ impl<'tcx> Operand<'tcx> { D: HasLocalDecls<'tcx>, { match self { - &Operand::Copy(ref l) | - &Operand::Move(ref l) => l.ty(local_decls, tcx).ty, + &Operand::Copy(ref l) | &Operand::Move(ref l) => l.ty(local_decls, tcx).ty, &Operand::Constant(ref c) => c.literal.ty, } } @@ -252,8 +226,14 @@ impl<'tcx> BinOp { pub fn ty(&self, tcx: TyCtxt<'tcx>, lhs_ty: Ty<'tcx>, rhs_ty: Ty<'tcx>) -> Ty<'tcx> { // FIXME: handle SIMD correctly match self { - &BinOp::Add | &BinOp::Sub | &BinOp::Mul | &BinOp::Div | &BinOp::Rem | - &BinOp::BitXor | &BinOp::BitAnd | &BinOp::BitOr => { + &BinOp::Add + | &BinOp::Sub + | &BinOp::Mul + | &BinOp::Div + | &BinOp::Rem + | &BinOp::BitXor + | &BinOp::BitAnd + | &BinOp::BitOr => { // these should be integers or floats of the same size. assert_eq!(lhs_ty, rhs_ty); lhs_ty @@ -261,8 +241,7 @@ impl<'tcx> BinOp { &BinOp::Shl | &BinOp::Shr | &BinOp::Offset => { lhs_ty // lhs_ty can be != rhs_ty } - &BinOp::Eq | &BinOp::Lt | &BinOp::Le | - &BinOp::Ne | &BinOp::Ge | &BinOp::Gt => { + &BinOp::Eq | &BinOp::Lt | &BinOp::Le | &BinOp::Ne | &BinOp::Ge | &BinOp::Gt => { tcx.types.bool } } @@ -272,17 +251,17 @@ impl<'tcx> BinOp { impl BorrowKind { pub fn to_mutbl_lossy(self) -> hir::Mutability { match self { - BorrowKind::Mut { .. } => hir::Mutability::Mutable, - BorrowKind::Shared => hir::Mutability::Immutable, + BorrowKind::Mut { .. } => hir::Mutability::Mut, + BorrowKind::Shared => hir::Mutability::Not, // We have no type corresponding to a unique imm borrow, so // use `&mut`. It gives all the capabilities of an `&uniq` // and hence is a safe "over approximation". - BorrowKind::Unique => hir::Mutability::Mutable, + BorrowKind::Unique => hir::Mutability::Mut, // We have no type corresponding to a shallow borrow, so use // `&` as an approximation. - BorrowKind::Shallow => hir::Mutability::Immutable, + BorrowKind::Shallow => hir::Mutability::Not, } } } @@ -306,7 +285,7 @@ impl BinOp { BinOp::Gt => hir::BinOpKind::Gt, BinOp::Le => hir::BinOpKind::Le, BinOp::Ge => hir::BinOpKind::Ge, - BinOp::Offset => unreachable!() + BinOp::Offset => unreachable!(), } } } diff --git a/src/librustc/mir/traversal.rs b/src/librustc/mir/traversal.rs index f129dd3abe..a89811ed43 100644 --- a/src/librustc/mir/traversal.rs +++ b/src/librustc/mir/traversal.rs @@ -114,7 +114,6 @@ impl<'a, 'tcx> Postorder<'a, 'tcx> { root_is_start_block: root == START_BLOCK, }; - let data = &po.body[root]; if let Some(ref term) = data.terminator { @@ -254,20 +253,16 @@ impl<'a, 'tcx> Iterator for Postorder<'a, 'tcx> { pub struct ReversePostorder<'a, 'tcx> { body: &'a Body<'tcx>, blocks: Vec, - idx: usize + idx: usize, } impl<'a, 'tcx> ReversePostorder<'a, 'tcx> { pub fn new(body: &'a Body<'tcx>, root: BasicBlock) -> ReversePostorder<'a, 'tcx> { - let blocks : Vec<_> = Postorder::new(body, root).map(|(bb, _)| bb).collect(); + let blocks: Vec<_> = Postorder::new(body, root).map(|(bb, _)| bb).collect(); let len = blocks.len(); - ReversePostorder { - body, - blocks, - idx: len - } + ReversePostorder { body, blocks, idx: len } } pub fn reset(&mut self) { @@ -275,7 +270,6 @@ impl<'a, 'tcx> ReversePostorder<'a, 'tcx> { } } - pub fn reverse_postorder<'a, 'tcx>(body: &'a Body<'tcx>) -> ReversePostorder<'a, 'tcx> { ReversePostorder::new(body, START_BLOCK) } @@ -284,7 +278,9 @@ impl<'a, 'tcx> Iterator for ReversePostorder<'a, 'tcx> { type Item = (BasicBlock, &'a BasicBlockData<'tcx>); fn next(&mut self) -> Option<(BasicBlock, &'a BasicBlockData<'tcx>)> { - if self.idx == 0 { return None; } + if self.idx == 0 { + return None; + } self.idx -= 1; self.blocks.get(self.idx).map(|&bb| (bb, &self.body[bb])) diff --git a/src/librustc/mir/visit.rs b/src/librustc/mir/visit.rs index 5d273fe85b..4c5db1b07d 100644 --- a/src/librustc/mir/visit.rs +++ b/src/librustc/mir/visit.rs @@ -1,7 +1,7 @@ +use crate::mir::*; use crate::ty::subst::SubstsRef; use crate::ty::{CanonicalUserTypeAnnotation, Ty}; -use crate::mir::*; -use syntax_pos::Span; +use rustc_span::Span; // # The MIR Visitor // @@ -164,10 +164,10 @@ macro_rules! make_mir_visitor { } fn visit_place_base(&mut self, - base: & $($mutability)? PlaceBase<'tcx>, + local: & $($mutability)? Local, context: PlaceContext, location: Location) { - self.super_place_base(base, context, location); + self.super_place_base(local, context, location); } visit_place_fns!($($mutability)?); @@ -570,6 +570,18 @@ macro_rules! make_mir_visitor { self.visit_place(path, ctx, location); } + Rvalue::AddressOf(m, path) => { + let ctx = match m { + Mutability::Mut => PlaceContext::MutatingUse( + MutatingUseContext::AddressOf + ), + Mutability::Not => PlaceContext::NonMutatingUse( + NonMutatingUseContext::AddressOf + ), + }; + self.visit_place(path, ctx, location); + } + Rvalue::Len(path) => { self.visit_place( path, @@ -693,17 +705,10 @@ macro_rules! make_mir_visitor { } fn super_place_base(&mut self, - place_base: & $($mutability)? PlaceBase<'tcx>, + local: & $($mutability)? Local, context: PlaceContext, location: Location) { - match place_base { - PlaceBase::Local(local) => { - self.visit_local(local, context, location); - } - PlaceBase::Static(box Static { kind: _, ty, def_id: _ }) => { - self.visit_ty(& $($mutability)? *ty, TyContext::Location(location)); - } - } + self.visit_local(local, context, location); } fn super_local_decl(&mut self, @@ -836,7 +841,7 @@ macro_rules! visit_place_fns { context: PlaceContext, location: Location, ) { - self.visit_place_base(&mut place.base, context, location); + self.visit_place_base(&mut place.local, context, location); if let Some(new_projection) = self.process_projection(&place.projection) { place.projection = self.tcx().intern_place_elems(&new_projection); @@ -877,23 +882,23 @@ macro_rules! visit_place_fns { () => ( fn visit_projection( &mut self, - base: &PlaceBase<'tcx>, + local: &Local, projection: &[PlaceElem<'tcx>], context: PlaceContext, location: Location, ) { - self.super_projection(base, projection, context, location); + self.super_projection(local, projection, context, location); } fn visit_projection_elem( &mut self, - base: &PlaceBase<'tcx>, + local: &Local, proj_base: &[PlaceElem<'tcx>], elem: &PlaceElem<'tcx>, context: PlaceContext, location: Location, ) { - self.super_projection_elem(base, proj_base, elem, context, location); + self.super_projection_elem(local, proj_base, elem, context, location); } fn super_place( @@ -912,9 +917,9 @@ macro_rules! visit_place_fns { }; } - self.visit_place_base(&place.base, context, location); + self.visit_place_base(&place.local, context, location); - self.visit_projection(&place.base, + self.visit_projection(&place.local, &place.projection, context, location); @@ -922,7 +927,7 @@ macro_rules! visit_place_fns { fn super_projection( &mut self, - base: &PlaceBase<'tcx>, + local: &Local, projection: &[PlaceElem<'tcx>], context: PlaceContext, location: Location, @@ -930,13 +935,13 @@ macro_rules! visit_place_fns { let mut cursor = projection; while let [proj_base @ .., elem] = cursor { cursor = proj_base; - self.visit_projection_elem(base, cursor, elem, context, location); + self.visit_projection_elem(local, cursor, elem, context, location); } } fn super_projection_elem( &mut self, - _base: &PlaceBase<'tcx>, + _local: &Local, _proj_base: &[PlaceElem<'tcx>], elem: &PlaceElem<'tcx>, _context: PlaceContext, @@ -966,29 +971,26 @@ macro_rules! visit_place_fns { } make_mir_visitor!(Visitor,); -make_mir_visitor!(MutVisitor,mut); +make_mir_visitor!(MutVisitor, mut); pub trait MirVisitable<'tcx> { fn apply(&self, location: Location, visitor: &mut dyn Visitor<'tcx>); } impl<'tcx> MirVisitable<'tcx> for Statement<'tcx> { - fn apply(&self, location: Location, visitor: &mut dyn Visitor<'tcx>) - { + fn apply(&self, location: Location, visitor: &mut dyn Visitor<'tcx>) { visitor.visit_statement(self, location) } } impl<'tcx> MirVisitable<'tcx> for Terminator<'tcx> { - fn apply(&self, location: Location, visitor: &mut dyn Visitor<'tcx>) - { + fn apply(&self, location: Location, visitor: &mut dyn Visitor<'tcx>) { visitor.visit_terminator(self, location) } } impl<'tcx> MirVisitable<'tcx> for Option> { - fn apply(&self, location: Location, visitor: &mut dyn Visitor<'tcx>) - { + fn apply(&self, location: Location, visitor: &mut dyn Visitor<'tcx>) { visitor.visit_terminator(self.as_ref().unwrap(), location) } } @@ -1031,6 +1033,8 @@ pub enum NonMutatingUseContext { ShallowBorrow, /// Unique borrow. UniqueBorrow, + /// AddressOf for *const pointer. + AddressOf, /// Used as base for another place, e.g., `x` in `x.y`. Will not mutate the place. /// For example, the projection `x.y` is not marked as a mutation in these cases: /// @@ -1054,6 +1058,8 @@ pub enum MutatingUseContext { Drop, /// Mutable borrow. Borrow, + /// AddressOf for *mut pointer. + AddressOf, /// Used as base for another place, e.g., `x` in `x.y`. Could potentially mutate the place. /// For example, the projection `x.y` is marked as a mutation in these cases: /// @@ -1096,10 +1102,10 @@ impl PlaceContext { /// Returns `true` if this place context represents a borrow. pub fn is_borrow(&self) -> bool { match *self { - PlaceContext::NonMutatingUse(NonMutatingUseContext::SharedBorrow) | - PlaceContext::NonMutatingUse(NonMutatingUseContext::ShallowBorrow) | - PlaceContext::NonMutatingUse(NonMutatingUseContext::UniqueBorrow) | - PlaceContext::MutatingUse(MutatingUseContext::Borrow) => true, + PlaceContext::NonMutatingUse(NonMutatingUseContext::SharedBorrow) + | PlaceContext::NonMutatingUse(NonMutatingUseContext::ShallowBorrow) + | PlaceContext::NonMutatingUse(NonMutatingUseContext::UniqueBorrow) + | PlaceContext::MutatingUse(MutatingUseContext::Borrow) => true, _ => false, } } @@ -1107,8 +1113,8 @@ impl PlaceContext { /// Returns `true` if this place context represents a storage live or storage dead marker. pub fn is_storage_marker(&self) -> bool { match *self { - PlaceContext::NonUse(NonUseContext::StorageLive) | - PlaceContext::NonUse(NonUseContext::StorageDead) => true, + PlaceContext::NonUse(NonUseContext::StorageLive) + | PlaceContext::NonUse(NonUseContext::StorageDead) => true, _ => false, } } @@ -1156,9 +1162,9 @@ impl PlaceContext { /// Returns `true` if this place context represents an assignment statement. pub fn is_place_assignment(&self) -> bool { match *self { - PlaceContext::MutatingUse(MutatingUseContext::Store) | - PlaceContext::MutatingUse(MutatingUseContext::Call) | - PlaceContext::MutatingUse(MutatingUseContext::AsmOutput) => true, + PlaceContext::MutatingUse(MutatingUseContext::Store) + | PlaceContext::MutatingUse(MutatingUseContext::Call) + | PlaceContext::MutatingUse(MutatingUseContext::AsmOutput) => true, _ => false, } } diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index cc02165f60..37d5e23535 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -1,21 +1,28 @@ -use crate::ty::query::QueryDescription; -use crate::ty::query::queries; -use crate::ty::{self, ParamEnvAnd, Ty, TyCtxt}; -use crate::ty::subst::SubstsRef; -use crate::dep_graph::{RecoverKey,DepKind, DepNode, SerializedDepNodeIndex}; -use crate::hir::def_id::{CrateNum, DefId, DefIndex}; +use crate::dep_graph::{DepKind, DepNode, RecoverKey, SerializedDepNodeIndex}; use crate::mir; -use crate::mir::interpret::GlobalId; +use crate::mir::interpret::{GlobalId, LitToConstInput}; use crate::traits; use crate::traits::query::{ - CanonicalPredicateGoal, CanonicalProjectionGoal, - CanonicalTyGoal, CanonicalTypeOpAscribeUserTypeGoal, - CanonicalTypeOpEqGoal, CanonicalTypeOpSubtypeGoal, CanonicalTypeOpProvePredicateGoal, - CanonicalTypeOpNormalizeGoal, + CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal, + CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, + CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal, }; +use crate::ty::query::queries; +use crate::ty::query::QueryDescription; +use crate::ty::subst::SubstsRef; +use crate::ty::{self, ParamEnvAnd, Ty, TyCtxt}; +use rustc_hir::def_id::{CrateNum, DefId, DefIndex}; +use rustc_span::symbol::Symbol; use std::borrow::Cow; -use syntax_pos::symbol::Symbol; + +fn describe_as_module(def_id: DefId, tcx: TyCtxt<'_>) -> String { + if def_id.is_top_level_module() { + format!("top-level module") + } else { + format!("module `{}`", tcx.def_path_str(def_id)) + } +} // Each of these queries corresponds to a function pointer field in the // `Providers` struct for requesting a value of that type, and a method @@ -75,7 +82,7 @@ rustc_queries! { desc { "looking up the native libraries of a linked crate" } } - query lint_levels(_: CrateNum) -> &'tcx lint::LintLevelMap { + query lint_levels(_: CrateNum) -> &'tcx LintLevelMap { eval_always desc { "computing the lint levels for items in this crate" } } @@ -333,50 +340,50 @@ rustc_queries! { Other { query lint_mod(key: DefId) -> () { - desc { |tcx| "linting {}", key.describe_as_module(tcx) } + desc { |tcx| "linting {}", describe_as_module(key, tcx) } } /// Checks the attributes in the module. query check_mod_attrs(key: DefId) -> () { - desc { |tcx| "checking attributes in {}", key.describe_as_module(tcx) } + desc { |tcx| "checking attributes in {}", describe_as_module(key, tcx) } } query check_mod_unstable_api_usage(key: DefId) -> () { - desc { |tcx| "checking for unstable API usage in {}", key.describe_as_module(tcx) } + desc { |tcx| "checking for unstable API usage in {}", describe_as_module(key, tcx) } } /// Checks the const bodies in the module for illegal operations (e.g. `if` or `loop`). query check_mod_const_bodies(key: DefId) -> () { - desc { |tcx| "checking consts in {}", key.describe_as_module(tcx) } + desc { |tcx| "checking consts in {}", describe_as_module(key, tcx) } } /// Checks the loops in the module. query check_mod_loops(key: DefId) -> () { - desc { |tcx| "checking loops in {}", key.describe_as_module(tcx) } + desc { |tcx| "checking loops in {}", describe_as_module(key, tcx) } } query check_mod_item_types(key: DefId) -> () { - desc { |tcx| "checking item types in {}", key.describe_as_module(tcx) } + desc { |tcx| "checking item types in {}", describe_as_module(key, tcx) } } query check_mod_privacy(key: DefId) -> () { - desc { |tcx| "checking privacy in {}", key.describe_as_module(tcx) } + desc { |tcx| "checking privacy in {}", describe_as_module(key, tcx) } } query check_mod_intrinsics(key: DefId) -> () { - desc { |tcx| "checking intrinsics in {}", key.describe_as_module(tcx) } + desc { |tcx| "checking intrinsics in {}", describe_as_module(key, tcx) } } query check_mod_liveness(key: DefId) -> () { - desc { |tcx| "checking liveness of variables in {}", key.describe_as_module(tcx) } + desc { |tcx| "checking liveness of variables in {}", describe_as_module(key, tcx) } } query check_mod_impl_wf(key: DefId) -> () { - desc { |tcx| "checking that impls are well-formed in {}", key.describe_as_module(tcx) } + desc { |tcx| "checking that impls are well-formed in {}", describe_as_module(key, tcx) } } query collect_mod_item_types(key: DefId) -> () { - desc { |tcx| "collecting item types in {}", key.describe_as_module(tcx) } + desc { |tcx| "collecting item types in {}", describe_as_module(key, tcx) } } /// Caches `CoerceUnsized` kinds for impls on custom types. @@ -399,6 +406,16 @@ rustc_queries! { typeck_tables.map(|tables| &*tcx.arena.alloc(tables)) } } + query diagnostic_only_typeck_tables_of(key: DefId) -> &'tcx ty::TypeckTables<'tcx> { + cache_on_disk_if { key.is_local() } + load_cached(tcx, id) { + let typeck_tables: Option> = tcx + .queries.on_disk_cache + .try_load_query_result(tcx, id); + + typeck_tables.map(|tables| &*tcx.arena.alloc(tables)) + } + } } Other { @@ -448,7 +465,8 @@ rustc_queries! { /// /// **Do not use this** outside const eval. Const eval uses this to break query cycles /// during validation. Please add a comment to every use site explaining why using - /// `const_eval` isn't sufficient. + /// `const_eval_validated` isn't sufficient. The returned constant also isn't in a suitable + /// form to be used outside of const eval. query const_eval_raw(key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>) -> ConstEvalRawResult<'tcx> { no_force @@ -460,7 +478,13 @@ rustc_queries! { /// Results of evaluating const items or constants embedded in /// other items (such as enum variant explicit discriminants). - query const_eval(key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>) + /// + /// In contrast to `const_eval_raw` this performs some validation on the constant, and + /// returns a proper constant that is usable by the rest of the compiler. + /// + /// **Do not use this** directly, use one of the following wrappers: `tcx.const_eval_poly`, + /// `tcx.const_eval_resolve`, `tcx.const_eval_instance`, or `tcx.const_eval_promoted`. + query const_eval_validated(key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>) -> ConstEvalResult<'tcx> { no_force desc { |tcx| @@ -481,10 +505,26 @@ rustc_queries! { desc { "extract field of const" } } - query const_caller_location(key: (syntax_pos::Symbol, u32, u32)) -> &'tcx ty::Const<'tcx> { + /// Destructure a constant ADT or array into its variant indent and its + /// field values. + query destructure_const( + key: ty::ParamEnvAnd<'tcx, &'tcx ty::Const<'tcx>> + ) -> mir::DestructuredConst<'tcx> { + no_force + desc { "destructure constant" } + } + + query const_caller_location(key: (rustc_span::Symbol, u32, u32)) -> &'tcx ty::Const<'tcx> { no_force desc { "get a &core::panic::Location referring to a span" } } + + query lit_to_const( + key: LitToConstInput<'tcx> + ) -> Result<&'tcx ty::Const<'tcx>, LitToConstError> { + no_force + desc { "converting literal to const" } + } } TypeChecking { @@ -504,7 +544,7 @@ rustc_queries! { } Other { - query reachable_set(_: CrateNum) -> ReachableSet { + query reachable_set(_: CrateNum) -> Lrc { desc { "reachability" } } @@ -517,6 +557,9 @@ rustc_queries! { desc { |tcx| "generating MIR shim for `{}`", tcx.def_path_str(key.def_id()) } } + /// The `symbol_name` query provides the symbol name for calling a + /// given instance from the local crate. In particular, it will also + /// look up the correct symbol name of instances from upstream crates. query symbol_name(key: ty::Instance<'tcx>) -> ty::SymbolName { no_force desc { "computing the symbol for `{}`", key } @@ -662,10 +705,6 @@ rustc_queries! { fatal_cycle desc { "checking if the crate has_panic_handler" } } - query is_sanitizer_runtime(_: CrateNum) -> bool { - fatal_cycle - desc { "query a crate is `#![sanitizer_runtime]`" } - } query is_profiler_runtime(_: CrateNum) -> bool { fatal_cycle desc { "query a crate is `#![profiler_runtime]`" } @@ -737,13 +776,47 @@ rustc_queries! { } Codegen { + /// The entire set of monomorphizations the local crate can safely link + /// to because they are exported from upstream crates. Do not depend on + /// this directly, as its value changes anytime a monomorphization gets + /// added or removed in any upstream crate. Instead use the narrower + /// `upstream_monomorphizations_for`, `upstream_drop_glue_for`, or, even + /// better, `Instance::upstream_monomorphization()`. query upstream_monomorphizations( k: CrateNum ) -> &'tcx DefIdMap, CrateNum>> { desc { "collecting available upstream monomorphizations `{:?}`", k } } + + /// Returns the set of upstream monomorphizations available for the + /// generic function identified by the given `def_id`. The query makes + /// sure to make a stable selection if the same monomorphization is + /// available in multiple upstream crates. + /// + /// You likely want to call `Instance::upstream_monomorphization()` + /// instead of invoking this query directly. query upstream_monomorphizations_for(_: DefId) -> Option<&'tcx FxHashMap, CrateNum>> {} + + /// Returns the upstream crate that exports drop-glue for the given + /// type (`substs` is expected to be a single-item list containing the + /// type one wants drop-glue for). + /// + /// This is a subset of `upstream_monomorphizations_for` in order to + /// increase dep-tracking granularity. Otherwise adding or removing any + /// type with drop-glue in any upstream crate would invalidate all + /// functions calling drop-glue of an upstream type. + /// + /// You likely want to call `Instance::upstream_monomorphization()` + /// instead of invoking this query directly. + /// + /// NOTE: This query could easily be extended to also support other + /// common functions that have are large set of monomorphizations + /// (like `Clone::clone` for example). + query upstream_drop_glue_for(substs: SubstsRef<'tcx>) -> Option { + desc { "available upstream drop-glue for `{:?}`", substs } + no_force + } } Other { @@ -935,6 +1008,11 @@ rustc_queries! { } Linking { + /// The list of symbols exported from the given crate. + /// + /// - All names contained in `exported_symbols(cnum)` are guaranteed to + /// correspond to a publicly visible symbol in `cnum` machine code. + /// - The `exported_symbols` sets of different crates do not intersect. query exported_symbols(_: CrateNum) -> Arc, SymbolExportLevel)>> { desc { "exported_symbols" } diff --git a/src/librustc/traits/auto_trait.rs b/src/librustc/traits/auto_trait.rs index a0d9f52d28..fdb6432f7c 100644 --- a/src/librustc/traits/auto_trait.rs +++ b/src/librustc/traits/auto_trait.rs @@ -83,10 +83,7 @@ impl<'tcx> AutoTraitFinder<'tcx> { ) -> AutoTraitResult { let tcx = self.tcx; - let trait_ref = ty::TraitRef { - def_id: trait_did, - substs: tcx.mk_substs_trait(ty, &[]), - }; + let trait_ref = ty::TraitRef { def_id: trait_did, substs: tcx.mk_substs_trait(ty, &[]) }; let trait_pred = ty::Binder::bind(trait_ref); @@ -107,7 +104,7 @@ impl<'tcx> AutoTraitFinder<'tcx> { ); true } - _ => false + _ => false, } }); @@ -165,20 +162,19 @@ impl<'tcx> AutoTraitFinder<'tcx> { None => return AutoTraitResult::NegativeImpl, }; - let (full_env, full_user_env) = self.evaluate_predicates( - &mut infcx, - trait_did, - ty, - new_env, - user_env, - &mut fresh_preds, - true, - ).unwrap_or_else(|| { - panic!( - "Failed to fully process: {:?} {:?} {:?}", - ty, trait_did, orig_env + let (full_env, full_user_env) = self + .evaluate_predicates( + &mut infcx, + trait_did, + ty, + new_env, + user_env, + &mut fresh_preds, + true, ) - }); + .unwrap_or_else(|| { + panic!("Failed to fully process: {:?} {:?} {:?}", ty, trait_did, orig_env) + }); debug!( "find_auto_trait_generics({:?}): fulfilling \ @@ -199,33 +195,19 @@ impl<'tcx> AutoTraitFinder<'tcx> { ObligationCause::misc(DUMMY_SP, hir::DUMMY_HIR_ID), ); fulfill.select_all_or_error(&infcx).unwrap_or_else(|e| { - panic!( - "Unable to fulfill trait {:?} for '{:?}': {:?}", - trait_did, ty, e - ) + panic!("Unable to fulfill trait {:?} for '{:?}': {:?}", trait_did, ty, e) }); - let body_id_map: FxHashMap<_, _> = infcx - .region_obligations - .borrow() - .iter() - .map(|&(id, _)| (id, vec![])) - .collect(); + let body_id_map: FxHashMap<_, _> = + infcx.region_obligations.borrow().iter().map(|&(id, _)| (id, vec![])).collect(); infcx.process_registered_region_obligations(&body_id_map, None, full_env); - let region_data = infcx - .borrow_region_constraints() - .region_constraint_data() - .clone(); + let region_data = infcx.borrow_region_constraints().region_constraint_data().clone(); let vid_to_region = self.map_vid_to_region(®ion_data); - let info = AutoTraitInfo { - full_user_env, - region_data, - vid_to_region, - }; + let info = AutoTraitInfo { full_user_env, region_data, vid_to_region }; return AutoTraitResult::PositiveImpl(auto_trait_callback(&infcx, info)); }); @@ -311,9 +293,11 @@ impl AutoTraitFinder<'tcx> { // Call `infcx.resolve_vars_if_possible` to see if we can // get rid of any inference variables. - let obligation = infcx.resolve_vars_if_possible( - &Obligation::new(dummy_cause.clone(), new_env, pred) - ); + let obligation = infcx.resolve_vars_if_possible(&Obligation::new( + dummy_cause.clone(), + new_env, + pred, + )); let result = select.select(&obligation); match &result { @@ -323,13 +307,15 @@ impl AutoTraitFinder<'tcx> { match vtable { Vtable::VtableImpl(VtableImplData { impl_def_id, .. }) => { // Blame 'tidy' for the weird bracket placement. - if infcx.tcx.impl_polarity(*impl_def_id) == ty::ImplPolarity::Negative - { - debug!("evaluate_nested_obligations: found explicit negative impl\ - {:?}, bailing out", impl_def_id); + if infcx.tcx.impl_polarity(*impl_def_id) == ty::ImplPolarity::Negative { + debug!( + "evaluate_nested_obligations: found explicit negative impl\ + {:?}, bailing out", + impl_def_id + ); return None; } - }, + } _ => {} } @@ -353,7 +339,7 @@ impl AutoTraitFinder<'tcx> { already_visited.remove(&pred); self.add_user_pred( &mut user_computed_preds, - ty::Predicate::Trait(pred), + ty::Predicate::Trait(pred, ast::Constness::NotConst), ); predicates.push_back(pred); } else { @@ -373,17 +359,14 @@ impl AutoTraitFinder<'tcx> { computed_preds.extend(user_computed_preds.iter().cloned()); let normalized_preds = elaborate_predicates(tcx, computed_preds.iter().cloned().collect()); - new_env = ty::ParamEnv::new( - tcx.mk_predicates(normalized_preds), - param_env.reveal, - None - ); + new_env = + ty::ParamEnv::new(tcx.mk_predicates(normalized_preds), param_env.reveal, None); } let final_user_env = ty::ParamEnv::new( tcx.mk_predicates(user_computed_preds.into_iter()), user_env.reveal, - None + None, ); debug!( "evaluate_nested_obligations(ty={:?}, trait_did={:?}): succeeded with '{:?}' \ @@ -425,7 +408,7 @@ impl AutoTraitFinder<'tcx> { let mut should_add_new = true; user_computed_preds.retain(|&old_pred| { match (&new_pred, old_pred) { - (&ty::Predicate::Trait(new_trait), ty::Predicate::Trait(old_trait)) => { + (&ty::Predicate::Trait(new_trait, _), ty::Predicate::Trait(old_trait, _)) => { if new_trait.def_id() == old_trait.def_id() { let new_substs = new_trait.skip_binder().trait_ref.substs; let old_substs = old_trait.skip_binder().trait_ref.substs; @@ -447,8 +430,8 @@ impl AutoTraitFinder<'tcx> { ty::RegionKind::ReLateBound(_, _), ) => {} - (ty::RegionKind::ReLateBound(_, _), _) | - (_, ty::RegionKind::ReVar(_)) => { + (ty::RegionKind::ReLateBound(_, _), _) + | (_, ty::RegionKind::ReVar(_)) => { // One of these is true: // The new predicate has a HRTB in a spot where the old // predicate does not (if they both had a HRTB, the previous @@ -474,8 +457,8 @@ impl AutoTraitFinder<'tcx> { // `user_computed_preds`. return false; } - (_, ty::RegionKind::ReLateBound(_, _)) | - (ty::RegionKind::ReVar(_), _) => { + (_, ty::RegionKind::ReLateBound(_, _)) + | (ty::RegionKind::ReVar(_), _) => { // This is the opposite situation as the previous arm. // One of these is true: // @@ -491,7 +474,7 @@ impl AutoTraitFinder<'tcx> { // predicate in `user_computed_preds`, and skip adding // new_pred to `user_computed_params`. should_add_new = false - }, + } _ => {} } } @@ -552,7 +535,7 @@ impl AutoTraitFinder<'tcx> { } while !vid_map.is_empty() { - let target = vid_map.keys().next().expect("Keys somehow empty").clone(); + let target = *vid_map.keys().next().expect("Keys somehow empty"); let deps = vid_map.remove(&target).expect("Entry somehow missing"); for smaller in deps.smaller.iter() { @@ -598,8 +581,7 @@ impl AutoTraitFinder<'tcx> { } fn is_param_no_infer(&self, substs: SubstsRef<'_>) -> bool { - return self.is_of_param(substs.type_at(0)) && - !substs.types().any(|t| t.has_infer_types()); + return self.is_of_param(substs.type_at(0)) && !substs.types().any(|t| t.has_infer_types()); } pub fn is_of_param(&self, ty: Ty<'_>) -> bool { @@ -612,10 +594,8 @@ impl AutoTraitFinder<'tcx> { fn is_self_referential_projection(&self, p: ty::PolyProjectionPredicate<'_>) -> bool { match p.ty().skip_binder().kind { - ty::Projection(proj) if proj == p.skip_binder().projection_ty => { - true - }, - _ => false + ty::Projection(proj) if proj == p.skip_binder().projection_ty => true, + _ => false, } } @@ -631,11 +611,8 @@ impl AutoTraitFinder<'tcx> { ) -> bool { let dummy_cause = ObligationCause::misc(DUMMY_SP, hir::DUMMY_HIR_ID); - for (obligation, mut predicate) in nested - .map(|o| (o.clone(), o.predicate)) - { - let is_new_pred = - fresh_preds.insert(self.clean_pred(select.infcx(), predicate)); + for (obligation, mut predicate) in nested.map(|o| (o.clone(), o.predicate)) { + let is_new_pred = fresh_preds.insert(self.clean_pred(select.infcx(), predicate)); // Resolve any inference variables that we can, to help selection succeed predicate = select.infcx().resolve_vars_if_possible(&predicate); @@ -653,18 +630,20 @@ impl AutoTraitFinder<'tcx> { // We check this by calling is_of_param on the relevant types // from the various possible predicates match &predicate { - &ty::Predicate::Trait(p) => { + &ty::Predicate::Trait(p, _) => { if self.is_param_no_infer(p.skip_binder().trait_ref.substs) && !only_projections - && is_new_pred { - + && is_new_pred + { self.add_user_pred(computed_preds, predicate); } predicates.push_back(p); } &ty::Predicate::Projection(p) => { - debug!("evaluate_nested_obligations: examining projection predicate {:?}", - predicate); + debug!( + "evaluate_nested_obligations: examining projection predicate {:?}", + predicate + ); // As described above, we only want to display // bounds which include a generic parameter but don't include @@ -673,27 +652,32 @@ impl AutoTraitFinder<'tcx> { // to avoid rendering duplicate bounds to the user. if self.is_param_no_infer(p.skip_binder().projection_ty.substs) && !p.ty().skip_binder().has_infer_types() - && is_new_pred { - debug!("evaluate_nested_obligations: adding projection predicate\ - to computed_preds: {:?}", predicate); - - // Under unusual circumstances, we can end up with a self-refeential - // projection predicate. For example: - // ::Value == ::Value - // Not only is displaying this to the user pointless, - // having it in the ParamEnv will cause an issue if we try to call - // poly_project_and_unify_type on the predicate, since this kind of - // predicate will normally never end up in a ParamEnv. - // - // For these reasons, we ignore these weird predicates, - // ensuring that we're able to properly synthesize an auto trait impl - if self.is_self_referential_projection(p) { - debug!("evaluate_nested_obligations: encountered a projection - predicate equating a type with itself! Skipping"); - - } else { - self.add_user_pred(computed_preds, predicate); - } + && is_new_pred + { + debug!( + "evaluate_nested_obligations: adding projection predicate\ + to computed_preds: {:?}", + predicate + ); + + // Under unusual circumstances, we can end up with a self-refeential + // projection predicate. For example: + // ::Value == ::Value + // Not only is displaying this to the user pointless, + // having it in the ParamEnv will cause an issue if we try to call + // poly_project_and_unify_type on the predicate, since this kind of + // predicate will normally never end up in a ParamEnv. + // + // For these reasons, we ignore these weird predicates, + // ensuring that we're able to properly synthesize an auto trait impl + if self.is_self_referential_projection(p) { + debug!( + "evaluate_nested_obligations: encountered a projection + predicate equating a type with itself! Skipping" + ); + } else { + self.add_user_pred(computed_preds, predicate); + } } // There are three possible cases when we project a predicate: @@ -736,8 +720,7 @@ impl AutoTraitFinder<'tcx> { // negative impl error. To properly handle this case, we need // to ensure that we catch any potential projection errors, // and turn them into an explicit negative impl for our type. - debug!("Projecting and unifying projection predicate {:?}", - predicate); + debug!("Projecting and unifying projection predicate {:?}", predicate); match poly_project_and_unify_type(select, &obligation.with(p)) { Err(e) => { @@ -782,11 +765,7 @@ impl AutoTraitFinder<'tcx> { } } &ty::Predicate::RegionOutlives(ref binder) => { - if select - .infcx() - .region_outlives_predicate(&dummy_cause, binder) - .is_err() - { + if select.infcx().region_outlives_predicate(&dummy_cause, binder).is_err() { return false; } } @@ -842,6 +821,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for RegionReplacer<'a, 'tcx> { (match r { &ty::ReVar(vid) => self.vid_to_region.get(&vid).cloned(), _ => None, - }).unwrap_or_else(|| r.super_fold_with(self)) + }) + .unwrap_or_else(|| r.super_fold_with(self)) } } diff --git a/src/librustc/traits/chalk_fulfill.rs b/src/librustc/traits/chalk_fulfill.rs index d9e83df7dd..a765e55d99 100644 --- a/src/librustc/traits/chalk_fulfill.rs +++ b/src/librustc/traits/chalk_fulfill.rs @@ -1,16 +1,10 @@ +use crate::infer::canonical::{Canonical, OriginalQueryValues}; +use crate::infer::InferCtxt; +use crate::traits::query::NoSolution; use crate::traits::{ - Environment, - InEnvironment, - TraitEngine, - ObligationCause, - PredicateObligation, - FulfillmentError, - FulfillmentErrorCode, - SelectionError, + Environment, FulfillmentError, FulfillmentErrorCode, InEnvironment, ObligationCause, + PredicateObligation, SelectionError, TraitEngine, }; -use crate::traits::query::NoSolution; -use crate::infer::InferCtxt; -use crate::infer::canonical::{Canonical, OriginalQueryValues}; use crate::ty::{self, Ty}; use rustc_data_structures::fx::FxHashSet; @@ -22,9 +16,7 @@ pub struct FulfillmentContext<'tcx> { impl FulfillmentContext<'tcx> { crate fn new() -> Self { - FulfillmentContext { - obligations: FxHashSet::default(), - } + FulfillmentContext { obligations: FxHashSet::default() } } } @@ -37,16 +29,13 @@ fn in_environment( let environment = match obligation.param_env.def_id { Some(def_id) => infcx.tcx.environment(def_id), - None if obligation.param_env.caller_bounds.is_empty() => Environment { - clauses: ty::List::empty(), - }, + None if obligation.param_env.caller_bounds.is_empty() => { + Environment { clauses: ty::List::empty() } + } _ => bug!("non-empty `ParamEnv` with no def-id"), }; - InEnvironment { - environment, - goal: obligation, - } + InEnvironment { environment, goal: obligation } } impl TraitEngine<'tcx> for FulfillmentContext<'tcx> { @@ -77,7 +66,9 @@ impl TraitEngine<'tcx> for FulfillmentContext<'tcx> { if self.obligations.is_empty() { Ok(()) } else { - let errors = self.obligations.iter() + let errors = self + .obligations + .iter() .map(|obligation| FulfillmentError { obligation: obligation.goal.clone(), code: FulfillmentErrorCode::CodeAmbiguity, @@ -103,10 +94,13 @@ impl TraitEngine<'tcx> for FulfillmentContext<'tcx> { // to unambiguously prove at least one obligation. for obligation in self.obligations.drain() { let mut orig_values = OriginalQueryValues::default(); - let canonical_goal = infcx.canonicalize_query(&InEnvironment { - environment: obligation.environment, - goal: obligation.goal.predicate, - }, &mut orig_values); + let canonical_goal = infcx.canonicalize_query( + &InEnvironment { + environment: obligation.environment, + goal: obligation.goal.predicate, + }, + &mut orig_values, + ); match infcx.tcx.evaluate_goal(canonical_goal) { Ok(response) => { @@ -117,18 +111,19 @@ impl TraitEngine<'tcx> for FulfillmentContext<'tcx> { &obligation.goal.cause, obligation.goal.param_env, &orig_values, - &response + &response, ) { Ok(infer_ok) => next_round.extend( - infer_ok.obligations + infer_ok + .obligations .into_iter() - .map(|obligation| in_environment(infcx, obligation)) + .map(|obligation| in_environment(infcx, obligation)), ), Err(_err) => errors.push(FulfillmentError { obligation: obligation.goal, code: FulfillmentErrorCode::CodeSelectionError( - SelectionError::Unimplemented + SelectionError::Unimplemented, ), points_at_arg_span: false, }), @@ -142,10 +137,10 @@ impl TraitEngine<'tcx> for FulfillmentContext<'tcx> { Err(NoSolution) => errors.push(FulfillmentError { obligation: obligation.goal, code: FulfillmentErrorCode::CodeSelectionError( - SelectionError::Unimplemented + SelectionError::Unimplemented, ), points_at_arg_span: false, - }) + }), } } next_round = std::mem::replace(&mut self.obligations, next_round); @@ -155,11 +150,7 @@ impl TraitEngine<'tcx> for FulfillmentContext<'tcx> { } } - if errors.is_empty() { - Ok(()) - } else { - Err(errors) - } + if errors.is_empty() { Ok(()) } else { Err(errors) } } fn pending_obligations(&self) -> Vec> { diff --git a/src/librustc/traits/codegen/mod.rs b/src/librustc/traits/codegen/mod.rs index 9dff699deb..8a264a79fb 100644 --- a/src/librustc/traits/codegen/mod.rs +++ b/src/librustc/traits/codegen/mod.rs @@ -4,11 +4,11 @@ // general routines. use crate::infer::InferCtxt; -use crate::traits::{FulfillmentContext, Obligation, ObligationCause, SelectionContext, - TraitEngine, Vtable}; -use crate::ty::{self, TyCtxt}; -use crate::ty::subst::{Subst, SubstsRef}; +use crate::traits::{ + FulfillmentContext, Obligation, ObligationCause, SelectionContext, TraitEngine, Vtable, +}; use crate::ty::fold::TypeFoldable; +use crate::ty::{self, TyCtxt}; /// Attempts to resolve an obligation to a vtable. The result is /// a shallow vtable resolution, meaning that we do not @@ -23,8 +23,11 @@ pub fn codegen_fulfill_obligation<'tcx>( // Remove any references to regions; this helps improve caching. let trait_ref = ty.erase_regions(&trait_ref); - debug!("codegen_fulfill_obligation(trait_ref={:?}, def_id={:?})", - (param_env, trait_ref), trait_ref.def_id()); + debug!( + "codegen_fulfill_obligation(trait_ref={:?}, def_id={:?})", + (param_env, trait_ref), + trait_ref.def_id() + ); // Do the initial selection for the obligation. This yields the // shallow result we are looking for -- that is, what specific impl. @@ -32,9 +35,8 @@ pub fn codegen_fulfill_obligation<'tcx>( let mut selcx = SelectionContext::new(&infcx); let obligation_cause = ObligationCause::dummy(); - let obligation = Obligation::new(obligation_cause, - param_env, - trait_ref.to_poly_trait_predicate()); + let obligation = + Obligation::new(obligation_cause, param_env, trait_ref.to_poly_trait_predicate()); let selection = match selcx.select(&obligation) { Ok(Some(selection)) => selection, @@ -45,9 +47,11 @@ pub fn codegen_fulfill_obligation<'tcx>( // leading to an ambiguous result. So report this as an // overflow bug, since I believe this is the only case // where ambiguity can result. - bug!("Encountered ambiguity selecting `{:?}` during codegen, \ + bug!( + "Encountered ambiguity selecting `{:?}` during codegen, \ presuming due to overflow", - trait_ref) + trait_ref + ) } Err(e) => { bug!("Encountered error `{:?}` selecting `{:?}` during codegen", e, trait_ref) @@ -71,33 +75,6 @@ pub fn codegen_fulfill_obligation<'tcx>( }) } -impl<'tcx> TyCtxt<'tcx> { - /// Monomorphizes a type from the AST by first applying the - /// in-scope substitutions and then normalizing any associated - /// types. - pub fn subst_and_normalize_erasing_regions( - self, - param_substs: SubstsRef<'tcx>, - param_env: ty::ParamEnv<'tcx>, - value: &T - ) -> T - where - T: TypeFoldable<'tcx>, - { - debug!( - "subst_and_normalize_erasing_regions(\ - param_substs={:?}, \ - value={:?}, \ - param_env={:?})", - param_substs, - value, - param_env, - ); - let substituted = value.subst(self, param_substs); - self.normalize_erasing_regions(param_env, substituted) - } -} - // # Global Cache impl<'a, 'tcx> InferCtxt<'a, 'tcx> { diff --git a/src/librustc/traits/coherence.rs b/src/librustc/traits/coherence.rs index 933bc06c21..29ea47809a 100644 --- a/src/librustc/traits/coherence.rs +++ b/src/librustc/traits/coherence.rs @@ -5,28 +5,28 @@ //! [trait-specialization]: https://rust-lang.github.io/rustc-guide/traits/specialization.html use crate::infer::{CombinedSnapshot, InferOk}; -use crate::hir::def_id::{DefId, LOCAL_CRATE}; -use crate::traits::{self, Normalized, SelectionContext, Obligation, ObligationCause}; -use crate::traits::IntercrateMode; use crate::traits::select::IntercrateAmbiguityCause; -use crate::ty::{self, Ty, TyCtxt}; +use crate::traits::IntercrateMode; +use crate::traits::{self, Normalized, Obligation, ObligationCause, SelectionContext}; use crate::ty::fold::TypeFoldable; use crate::ty::subst::Subst; -use syntax::symbol::sym; -use syntax_pos::DUMMY_SP; +use crate::ty::{self, Ty, TyCtxt}; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; +use rustc_span::symbol::sym; +use rustc_span::DUMMY_SP; /// Whether we do the orphan check relative to this crate or /// to some remote crate. #[derive(Copy, Clone, Debug)] enum InCrate { Local, - Remote + Remote, } #[derive(Debug, Copy, Clone)] pub enum Conflict { Upstream, - Downstream { used_to_be_broken: bool } + Downstream { used_to_be_broken: bool }, } pub struct OverlapResult<'tcx> { @@ -38,7 +38,7 @@ pub struct OverlapResult<'tcx> { pub involves_placeholder: bool, } -pub fn add_placeholder_note(err: &mut errors::DiagnosticBuilder<'_>) { +pub fn add_placeholder_note(err: &mut rustc_errors::DiagnosticBuilder<'_>) { err.note(&format!( "this behavior recently changed as a result of a bug fix; \ see rust-lang/rust#56105 for details" @@ -60,13 +60,13 @@ where F1: FnOnce(OverlapResult<'_>) -> R, F2: FnOnce() -> R, { - debug!("overlapping_impls(\ + debug!( + "overlapping_impls(\ impl1_def_id={:?}, \ impl2_def_id={:?}, intercrate_mode={:?})", - impl1_def_id, - impl2_def_id, - intercrate_mode); + impl1_def_id, impl2_def_id, intercrate_mode + ); let overlaps = tcx.infer_ctxt().enter(|infcx| { let selcx = &mut SelectionContext::intercrate(&infcx, intercrate_mode); @@ -140,35 +140,39 @@ fn overlap_within_probe( debug!("overlap: b_impl_header={:?}", b_impl_header); // Do `a` and `b` unify? If not, no overlap. - let obligations = match selcx.infcx().at(&ObligationCause::dummy(), param_env) - .eq_impl_headers(&a_impl_header, &b_impl_header) + let obligations = match selcx + .infcx() + .at(&ObligationCause::dummy(), param_env) + .eq_impl_headers(&a_impl_header, &b_impl_header) { Ok(InferOk { obligations, value: () }) => obligations, - Err(_) => return None + Err(_) => return None, }; debug!("overlap: unification check succeeded"); // Are any of the obligations unsatisfiable? If so, no overlap. let infcx = selcx.infcx(); - let opt_failing_obligation = - a_impl_header.predicates - .iter() - .chain(&b_impl_header.predicates) - .map(|p| infcx.resolve_vars_if_possible(p)) - .map(|p| Obligation { cause: ObligationCause::dummy(), - param_env, - recursion_depth: 0, - predicate: p }) - .chain(obligations) - .find(|o| !selcx.predicate_may_hold_fatal(o)); + let opt_failing_obligation = a_impl_header + .predicates + .iter() + .chain(&b_impl_header.predicates) + .map(|p| infcx.resolve_vars_if_possible(p)) + .map(|p| Obligation { + cause: ObligationCause::dummy(), + param_env, + recursion_depth: 0, + predicate: p, + }) + .chain(obligations) + .find(|o| !selcx.predicate_may_hold_fatal(o)); // FIXME: the call to `selcx.predicate_may_hold_fatal` above should be ported // to the canonical trait query form, `infcx.predicate_may_hold`, once // the new system supports intercrate mode (which coherence needs). if let Some(failing_obligation) = opt_failing_obligation { debug!("overlap: obligation unsatisfiable {:?}", failing_obligation); - return None + return None; } let impl_header = selcx.infcx().resolve_vars_if_possible(&a_impl_header); @@ -195,8 +199,7 @@ pub fn trait_ref_is_knowable<'tcx>( // A trait can be implementable for a trait ref by both the current // crate and crates downstream of it. Older versions of rustc // were not aware of this, causing incoherence (issue #43355). - let used_to_be_broken = - orphan_check_trait_ref(tcx, trait_ref, InCrate::Local).is_ok(); + let used_to_be_broken = orphan_check_trait_ref(tcx, trait_ref, InCrate::Local).is_ok(); if used_to_be_broken { debug!("trait_ref_is_knowable({:?}) - USED TO BE BROKEN", trait_ref); } @@ -247,10 +250,7 @@ pub enum OrphanCheckErr<'tcx> { /// /// 1. All type parameters in `Self` must be "covered" by some local type constructor. /// 2. Some local type must appear in `Self`. -pub fn orphan_check( - tcx: TyCtxt<'_>, - impl_def_id: DefId, -) -> Result<(), OrphanCheckErr<'_>> { +pub fn orphan_check(tcx: TyCtxt<'_>, impl_def_id: DefId) -> Result<(), OrphanCheckErr<'_>> { debug!("orphan_check({:?})", impl_def_id); // We only except this routine to be invoked on implementations @@ -260,8 +260,7 @@ pub fn orphan_check( // If the *trait* is local to the crate, ok. if trait_ref.def_id.is_local() { - debug!("trait {:?} is local to current crate", - trait_ref.def_id); + debug!("trait {:?} is local to current crate", trait_ref.def_id); return Ok(()); } @@ -359,12 +358,13 @@ fn orphan_check_trait_ref<'tcx>( trait_ref: ty::TraitRef<'tcx>, in_crate: InCrate, ) -> Result<(), OrphanCheckErr<'tcx>> { - debug!("orphan_check_trait_ref(trait_ref={:?}, in_crate={:?})", - trait_ref, in_crate); + debug!("orphan_check_trait_ref(trait_ref={:?}, in_crate={:?})", trait_ref, in_crate); if trait_ref.needs_infer() && trait_ref.needs_subst() { - bug!("can't orphan check a trait ref with both params and inference variables {:?}", - trait_ref); + bug!( + "can't orphan check a trait ref with both params and inference variables {:?}", + trait_ref + ); } // Given impl Trait for T0, an impl is valid only @@ -390,10 +390,8 @@ fn orphan_check_trait_ref<'tcx>( } let mut non_local_spans = vec![]; - for (i, input_ty) in trait_ref - .input_types() - .flat_map(|ty| uncover_fundamental_ty(tcx, ty, in_crate)) - .enumerate() + for (i, input_ty) in + trait_ref.input_types().flat_map(|ty| uncover_fundamental_ty(tcx, ty, in_crate)).enumerate() { debug!("orphan_check_trait_ref: check ty `{:?}`", input_ty); let non_local_tys = ty_is_non_local(input_ty, in_crate); @@ -410,7 +408,7 @@ fn orphan_check_trait_ref<'tcx>( debug!("orphan_check_trait_ref: uncovered ty local_type: `{:?}`", local_type); - return Err(OrphanCheckErr::UncoveredTy(input_ty, local_type)) + return Err(OrphanCheckErr::UncoveredTy(input_ty, local_type)); } if let Some(non_local_tys) = non_local_tys { for input_ty in non_local_tys { @@ -425,19 +423,18 @@ fn orphan_check_trait_ref<'tcx>( fn ty_is_non_local<'t>(ty: Ty<'t>, in_crate: InCrate) -> Option>> { match ty_is_non_local_constructor(ty, in_crate) { - Some(ty) => if !fundamental_ty(ty) { - Some(vec![ty]) - } else { - let tys: Vec<_> = ty.walk_shallow() - .filter_map(|t| ty_is_non_local(t, in_crate)) - .flat_map(|i| i) - .collect(); - if tys.is_empty() { - None + Some(ty) => { + if !fundamental_ty(ty) { + Some(vec![ty]) } else { - Some(tys) + let tys: Vec<_> = ty + .walk_shallow() + .filter_map(|t| ty_is_non_local(t, in_crate)) + .flat_map(|i| i) + .collect(); + if tys.is_empty() { None } else { Some(tys) } } - }, + } None => None, } } @@ -446,7 +443,7 @@ fn fundamental_ty(ty: Ty<'_>) -> bool { match ty.kind { ty::Ref(..) => true, ty::Adt(def, _) => def.is_fundamental(), - _ => false + _ => false, } } @@ -455,35 +452,30 @@ fn def_id_is_local(def_id: DefId, in_crate: InCrate) -> bool { // The type is local to *this* crate - it will not be // local in any other crate. InCrate::Remote => false, - InCrate::Local => def_id.is_local() + InCrate::Local => def_id.is_local(), } } -fn ty_is_non_local_constructor<'tcx>( - ty: Ty<'tcx>, - in_crate: InCrate, -) -> Option> { +fn ty_is_non_local_constructor<'tcx>(ty: Ty<'tcx>, in_crate: InCrate) -> Option> { debug!("ty_is_non_local_constructor({:?})", ty); match ty.kind { - ty::Bool | - ty::Char | - ty::Int(..) | - ty::Uint(..) | - ty::Float(..) | - ty::Str | - ty::FnDef(..) | - ty::FnPtr(_) | - ty::Array(..) | - ty::Slice(..) | - ty::RawPtr(..) | - ty::Ref(..) | - ty::Never | - ty::Tuple(..) | - ty::Param(..) | - ty::Projection(..) => { - Some(ty) - } + ty::Bool + | ty::Char + | ty::Int(..) + | ty::Uint(..) + | ty::Float(..) + | ty::Str + | ty::FnDef(..) + | ty::FnPtr(_) + | ty::Array(..) + | ty::Slice(..) + | ty::RawPtr(..) + | ty::Ref(..) + | ty::Never + | ty::Tuple(..) + | ty::Param(..) + | ty::Projection(..) => Some(ty), ty::Placeholder(..) | ty::Bound(..) | ty::Infer(..) => match in_crate { InCrate::Local => Some(ty), @@ -492,16 +484,20 @@ fn ty_is_non_local_constructor<'tcx>( InCrate::Remote => None, }, - ty::Adt(def, _) => if def_id_is_local(def.did, in_crate) { - None - } else { - Some(ty) - }, - ty::Foreign(did) => if def_id_is_local(did, in_crate) { - None - } else { - Some(ty) - }, + ty::Adt(def, _) => { + if def_id_is_local(def.did, in_crate) { + None + } else { + Some(ty) + } + } + ty::Foreign(did) => { + if def_id_is_local(did, in_crate) { + None + } else { + Some(ty) + } + } ty::Opaque(..) => { // This merits some explanation. // Normally, opaque types are not involed when performing @@ -533,11 +529,7 @@ fn ty_is_non_local_constructor<'tcx>( ty::Dynamic(ref tt, ..) => { if let Some(principal) = tt.principal() { - if def_id_is_local(principal.def_id(), in_crate) { - None - } else { - Some(ty) - } + if def_id_is_local(principal.def_id(), in_crate) { None } else { Some(ty) } } else { Some(ty) } @@ -545,11 +537,9 @@ fn ty_is_non_local_constructor<'tcx>( ty::Error => None, - ty::UnnormalizedProjection(..) | - ty::Closure(..) | - ty::Generator(..) | - ty::GeneratorWitness(..) => { - bug!("ty_is_local invoked on unexpected type: {:?}", ty) - } + ty::UnnormalizedProjection(..) + | ty::Closure(..) + | ty::Generator(..) + | ty::GeneratorWitness(..) => bug!("ty_is_local invoked on unexpected type: {:?}", ty), } } diff --git a/src/librustc/traits/engine.rs b/src/librustc/traits/engine.rs index b96126c7b6..84bfc86e6a 100644 --- a/src/librustc/traits/engine.rs +++ b/src/librustc/traits/engine.rs @@ -1,7 +1,7 @@ use crate::infer::InferCtxt; -use crate::ty::{self, Ty, TyCtxt, ToPredicate}; use crate::traits::Obligation; -use crate::hir::def_id::DefId; +use crate::ty::{self, ToPredicate, Ty, TyCtxt, WithConstness}; +use rustc_hir::def_id::DefId; use super::{ChalkFulfillmentContext, FulfillmentContext, FulfillmentError}; use super::{ObligationCause, PredicateObligation}; @@ -26,16 +26,16 @@ pub trait TraitEngine<'tcx>: 'tcx { def_id: DefId, cause: ObligationCause<'tcx>, ) { - let trait_ref = ty::TraitRef { - def_id, - substs: infcx.tcx.mk_substs_trait(ty, &[]), - }; - self.register_predicate_obligation(infcx, Obligation { - cause, - recursion_depth: 0, - param_env, - predicate: trait_ref.to_predicate() - }); + let trait_ref = ty::TraitRef { def_id, substs: infcx.tcx.mk_substs_trait(ty, &[]) }; + self.register_predicate_obligation( + infcx, + Obligation { + cause, + recursion_depth: 0, + param_env, + predicate: trait_ref.without_const().to_predicate(), + }, + ); } fn register_predicate_obligation( diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs deleted file mode 100644 index 701c19085b..0000000000 --- a/src/librustc/traits/error_reporting.rs +++ /dev/null @@ -1,2782 +0,0 @@ -use super::{ - ConstEvalFailure, - EvaluationResult, - FulfillmentError, - FulfillmentErrorCode, - MismatchedProjectionTypes, - ObjectSafetyViolation, - Obligation, - ObligationCause, - ObligationCauseCode, - OnUnimplementedDirective, - OnUnimplementedNote, - OutputTypeParameterMismatch, - Overflow, - PredicateObligation, - SelectionContext, - SelectionError, - TraitNotObjectSafe, -}; - -use crate::hir; -use crate::hir::Node; -use crate::hir::def_id::DefId; -use crate::infer::{self, InferCtxt}; -use crate::infer::error_reporting::TypeAnnotationNeeded as ErrorCode; -use crate::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; -use crate::session::DiagnosticMessageId; -use crate::ty::{self, AdtKind, DefIdTree, ToPredicate, ToPolyTraitRef, Ty, TyCtxt, TypeFoldable}; -use crate::ty::TypeckTables; -use crate::ty::GenericParamDefKind; -use crate::ty::error::ExpectedFound; -use crate::ty::fast_reject; -use crate::ty::fold::TypeFolder; -use crate::ty::subst::Subst; -use crate::ty::SubtypePredicate; -use crate::util::nodemap::{FxHashMap, FxHashSet}; - -use errors::{Applicability, DiagnosticBuilder, pluralize, Style}; -use std::fmt; -use syntax::ast; -use syntax::symbol::{sym, kw}; -use syntax_pos::{DUMMY_SP, Span, ExpnKind, MultiSpan}; -use rustc::hir::def_id::LOCAL_CRATE; -use syntax_pos::source_map::SourceMap; - -use rustc_error_codes::*; - -impl<'a, 'tcx> InferCtxt<'a, 'tcx> { - pub fn report_fulfillment_errors( - &self, - errors: &[FulfillmentError<'tcx>], - body_id: Option, - fallback_has_occurred: bool, - ) { - #[derive(Debug)] - struct ErrorDescriptor<'tcx> { - predicate: ty::Predicate<'tcx>, - index: Option, // None if this is an old error - } - - let mut error_map: FxHashMap<_, Vec<_>> = - self.reported_trait_errors.borrow().iter().map(|(&span, predicates)| { - (span, predicates.iter().map(|predicate| ErrorDescriptor { - predicate: predicate.clone(), - index: None - }).collect()) - }).collect(); - - for (index, error) in errors.iter().enumerate() { - // We want to ignore desugarings here: spans are equivalent even - // if one is the result of a desugaring and the other is not. - let mut span = error.obligation.cause.span; - let expn_data = span.ctxt().outer_expn_data(); - if let ExpnKind::Desugaring(_) = expn_data.kind { - span = expn_data.call_site; - } - - error_map.entry(span).or_default().push( - ErrorDescriptor { - predicate: error.obligation.predicate.clone(), - index: Some(index) - } - ); - - self.reported_trait_errors.borrow_mut() - .entry(span).or_default() - .push(error.obligation.predicate.clone()); - } - - // We do this in 2 passes because we want to display errors in order, though - // maybe it *is* better to sort errors by span or something. - let mut is_suppressed = vec![false; errors.len()]; - for (_, error_set) in error_map.iter() { - // We want to suppress "duplicate" errors with the same span. - for error in error_set { - if let Some(index) = error.index { - // Suppress errors that are either: - // 1) strictly implied by another error. - // 2) implied by an error with a smaller index. - for error2 in error_set { - if error2.index.map_or(false, |index2| is_suppressed[index2]) { - // Avoid errors being suppressed by already-suppressed - // errors, to prevent all errors from being suppressed - // at once. - continue - } - - if self.error_implies(&error2.predicate, &error.predicate) && - !(error2.index >= error.index && - self.error_implies(&error.predicate, &error2.predicate)) - { - info!("skipping {:?} (implied by {:?})", error, error2); - is_suppressed[index] = true; - break - } - } - } - } - } - - for (error, suppressed) in errors.iter().zip(is_suppressed) { - if !suppressed { - self.report_fulfillment_error(error, body_id, fallback_has_occurred); - } - } - } - - // returns if `cond` not occurring implies that `error` does not occur - i.e., that - // `error` occurring implies that `cond` occurs. - fn error_implies( - &self, - cond: &ty::Predicate<'tcx>, - error: &ty::Predicate<'tcx>, - ) -> bool { - if cond == error { - return true - } - - let (cond, error) = match (cond, error) { - (&ty::Predicate::Trait(..), &ty::Predicate::Trait(ref error)) - => (cond, error), - _ => { - // FIXME: make this work in other cases too. - return false - } - }; - - for implication in super::elaborate_predicates(self.tcx, vec![cond.clone()]) { - if let ty::Predicate::Trait(implication) = implication { - let error = error.to_poly_trait_ref(); - let implication = implication.to_poly_trait_ref(); - // FIXME: I'm just not taking associated types at all here. - // Eventually I'll need to implement param-env-aware - // `Γ₁ ⊦ φ₁ => Γ₂ ⊦ φ₂` logic. - let param_env = ty::ParamEnv::empty(); - if self.can_sub(param_env, error, implication).is_ok() { - debug!("error_implies: {:?} -> {:?} -> {:?}", cond, error, implication); - return true - } - } - } - - false - } - - fn report_fulfillment_error( - &self, - error: &FulfillmentError<'tcx>, - body_id: Option, - fallback_has_occurred: bool, - ) { - debug!("report_fulfillment_error({:?})", error); - match error.code { - FulfillmentErrorCode::CodeSelectionError(ref selection_error) => { - self.report_selection_error( - &error.obligation, - selection_error, - fallback_has_occurred, - error.points_at_arg_span, - ); - } - FulfillmentErrorCode::CodeProjectionError(ref e) => { - self.report_projection_error(&error.obligation, e); - } - FulfillmentErrorCode::CodeAmbiguity => { - self.maybe_report_ambiguity(&error.obligation, body_id); - } - FulfillmentErrorCode::CodeSubtypeError(ref expected_found, ref err) => { - self.report_mismatched_types( - &error.obligation.cause, - expected_found.expected, - expected_found.found, - err.clone(), - ).emit(); - } - } - } - - fn report_projection_error( - &self, - obligation: &PredicateObligation<'tcx>, - error: &MismatchedProjectionTypes<'tcx>, - ) { - let predicate = self.resolve_vars_if_possible(&obligation.predicate); - - if predicate.references_error() { - return - } - - self.probe(|_| { - let err_buf; - let mut err = &error.err; - let mut values = None; - - // try to find the mismatched types to report the error with. - // - // this can fail if the problem was higher-ranked, in which - // cause I have no idea for a good error message. - if let ty::Predicate::Projection(ref data) = predicate { - let mut selcx = SelectionContext::new(self); - let (data, _) = self.replace_bound_vars_with_fresh_vars( - obligation.cause.span, - infer::LateBoundRegionConversionTime::HigherRankedType, - data - ); - let mut obligations = vec![]; - let normalized_ty = super::normalize_projection_type( - &mut selcx, - obligation.param_env, - data.projection_ty, - obligation.cause.clone(), - 0, - &mut obligations - ); - - debug!("report_projection_error obligation.cause={:?} obligation.param_env={:?}", - obligation.cause, obligation.param_env); - - debug!("report_projection_error normalized_ty={:?} data.ty={:?}", - normalized_ty, data.ty); - - let is_normalized_ty_expected = match &obligation.cause.code { - ObligationCauseCode::ItemObligation(_) | - ObligationCauseCode::BindingObligation(_, _) | - ObligationCauseCode::ObjectCastObligation(_) => false, - _ => true, - }; - - if let Err(error) = self.at(&obligation.cause, obligation.param_env) - .eq_exp(is_normalized_ty_expected, normalized_ty, data.ty) - { - values = Some(infer::ValuePairs::Types( - ExpectedFound::new(is_normalized_ty_expected, normalized_ty, data.ty))); - - err_buf = error; - err = &err_buf; - } - } - - let msg = format!("type mismatch resolving `{}`", predicate); - let error_id = ( - DiagnosticMessageId::ErrorId(271), - Some(obligation.cause.span), - msg, - ); - let fresh = self.tcx.sess.one_time_diagnostics.borrow_mut().insert(error_id); - if fresh { - let mut diag = struct_span_err!( - self.tcx.sess, - obligation.cause.span, - E0271, - "type mismatch resolving `{}`", - predicate - ); - self.note_type_err(&mut diag, &obligation.cause, None, values, err); - self.note_obligation_cause(&mut diag, obligation); - diag.emit(); - } - }); - } - - fn fuzzy_match_tys(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> bool { - /// returns the fuzzy category of a given type, or None - /// if the type can be equated to any type. - fn type_category(t: Ty<'_>) -> Option { - match t.kind { - ty::Bool => Some(0), - ty::Char => Some(1), - ty::Str => Some(2), - ty::Int(..) | ty::Uint(..) | ty::Infer(ty::IntVar(..)) => Some(3), - ty::Float(..) | ty::Infer(ty::FloatVar(..)) => Some(4), - ty::Ref(..) | ty::RawPtr(..) => Some(5), - ty::Array(..) | ty::Slice(..) => Some(6), - ty::FnDef(..) | ty::FnPtr(..) => Some(7), - ty::Dynamic(..) => Some(8), - ty::Closure(..) => Some(9), - ty::Tuple(..) => Some(10), - ty::Projection(..) => Some(11), - ty::Param(..) => Some(12), - ty::Opaque(..) => Some(13), - ty::Never => Some(14), - ty::Adt(adt, ..) => match adt.adt_kind() { - AdtKind::Struct => Some(15), - AdtKind::Union => Some(16), - AdtKind::Enum => Some(17), - }, - ty::Generator(..) => Some(18), - ty::Foreign(..) => Some(19), - ty::GeneratorWitness(..) => Some(20), - ty::Placeholder(..) | ty::Bound(..) | ty::Infer(..) | ty::Error => None, - ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"), - } - } - - match (type_category(a), type_category(b)) { - (Some(cat_a), Some(cat_b)) => match (&a.kind, &b.kind) { - (&ty::Adt(def_a, _), &ty::Adt(def_b, _)) => def_a == def_b, - _ => cat_a == cat_b - }, - // infer and error can be equated to all types - _ => true - } - } - - fn impl_similar_to(&self, - trait_ref: ty::PolyTraitRef<'tcx>, - obligation: &PredicateObligation<'tcx>) - -> Option - { - let tcx = self.tcx; - let param_env = obligation.param_env; - let trait_ref = tcx.erase_late_bound_regions(&trait_ref); - let trait_self_ty = trait_ref.self_ty(); - - let mut self_match_impls = vec![]; - let mut fuzzy_match_impls = vec![]; - - self.tcx.for_each_relevant_impl( - trait_ref.def_id, trait_self_ty, |def_id| { - let impl_substs = self.fresh_substs_for_item(obligation.cause.span, def_id); - let impl_trait_ref = tcx - .impl_trait_ref(def_id) - .unwrap() - .subst(tcx, impl_substs); - - let impl_self_ty = impl_trait_ref.self_ty(); - - if let Ok(..) = self.can_eq(param_env, trait_self_ty, impl_self_ty) { - self_match_impls.push(def_id); - - if trait_ref.substs.types().skip(1) - .zip(impl_trait_ref.substs.types().skip(1)) - .all(|(u,v)| self.fuzzy_match_tys(u, v)) - { - fuzzy_match_impls.push(def_id); - } - } - }); - - let impl_def_id = if self_match_impls.len() == 1 { - self_match_impls[0] - } else if fuzzy_match_impls.len() == 1 { - fuzzy_match_impls[0] - } else { - return None - }; - - tcx.has_attr(impl_def_id, sym::rustc_on_unimplemented).then_some(impl_def_id) - } - - fn describe_generator(&self, body_id: hir::BodyId) -> Option<&'static str> { - self.tcx.hir().body(body_id).generator_kind.map(|gen_kind| { - match gen_kind { - hir::GeneratorKind::Gen => "a generator", - hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Block) => "an async block", - hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Fn) => "an async function", - hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Closure) => "an async closure", - } - }) - } - - /// Used to set on_unimplemented's `ItemContext` - /// to be the enclosing (async) block/function/closure - fn describe_enclosure(&self, hir_id: hir::HirId) -> Option<&'static str> { - let hir = &self.tcx.hir(); - let node = hir.find(hir_id)?; - if let hir::Node::Item( - hir::Item{kind: hir::ItemKind::Fn(sig, _, body_id), .. }) = &node { - self.describe_generator(*body_id).or_else(|| - Some(if let hir::FnHeader{ asyncness: hir::IsAsync::Async, .. } = sig.header { - "an async function" - } else { - "a function" - }) - ) - } else if let hir::Node::Expr(hir::Expr { - kind: hir::ExprKind::Closure(_is_move, _, body_id, _, gen_movability), .. }) = &node { - self.describe_generator(*body_id).or_else(|| - Some(if gen_movability.is_some() { - "an async closure" - } else { - "a closure" - }) - ) - } else if let hir::Node::Expr(hir::Expr { .. }) = &node { - let parent_hid = hir.get_parent_node(hir_id); - if parent_hid != hir_id { - return self.describe_enclosure(parent_hid); - } else { - None - } - } else { - None - } - } - - fn on_unimplemented_note( - &self, - trait_ref: ty::PolyTraitRef<'tcx>, - obligation: &PredicateObligation<'tcx>, - ) -> OnUnimplementedNote { - let def_id = self.impl_similar_to(trait_ref, obligation) - .unwrap_or_else(|| trait_ref.def_id()); - let trait_ref = *trait_ref.skip_binder(); - - let mut flags = vec![]; - flags.push((sym::item_context, - self.describe_enclosure(obligation.cause.body_id).map(|s|s.to_owned()))); - - match obligation.cause.code { - ObligationCauseCode::BuiltinDerivedObligation(..) | - ObligationCauseCode::ImplDerivedObligation(..) => {} - _ => { - // this is a "direct", user-specified, rather than derived, - // obligation. - flags.push((sym::direct, None)); - } - } - - if let ObligationCauseCode::ItemObligation(item) = obligation.cause.code { - // FIXME: maybe also have some way of handling methods - // from other traits? That would require name resolution, - // which we might want to be some sort of hygienic. - // - // Currently I'm leaving it for what I need for `try`. - if self.tcx.trait_of_item(item) == Some(trait_ref.def_id) { - let method = self.tcx.item_name(item); - flags.push((sym::from_method, None)); - flags.push((sym::from_method, Some(method.to_string()))); - } - } - if let Some(t) = self.get_parent_trait_ref(&obligation.cause.code) { - flags.push((sym::parent_trait, Some(t))); - } - - if let Some(k) = obligation.cause.span.desugaring_kind() { - flags.push((sym::from_desugaring, None)); - flags.push((sym::from_desugaring, Some(format!("{:?}", k)))); - } - let generics = self.tcx.generics_of(def_id); - let self_ty = trait_ref.self_ty(); - // This is also included through the generics list as `Self`, - // but the parser won't allow you to use it - flags.push((sym::_Self, Some(self_ty.to_string()))); - if let Some(def) = self_ty.ty_adt_def() { - // We also want to be able to select self's original - // signature with no type arguments resolved - flags.push((sym::_Self, Some(self.tcx.type_of(def.did).to_string()))); - } - - for param in generics.params.iter() { - let value = match param.kind { - GenericParamDefKind::Type { .. } | - GenericParamDefKind::Const => { - trait_ref.substs[param.index as usize].to_string() - }, - GenericParamDefKind::Lifetime => continue, - }; - let name = param.name; - flags.push((name, Some(value))); - } - - if let Some(true) = self_ty.ty_adt_def().map(|def| def.did.is_local()) { - flags.push((sym::crate_local, None)); - } - - // Allow targeting all integers using `{integral}`, even if the exact type was resolved - if self_ty.is_integral() { - flags.push((sym::_Self, Some("{integral}".to_owned()))); - } - - if let ty::Array(aty, len) = self_ty.kind { - flags.push((sym::_Self, Some("[]".to_owned()))); - flags.push((sym::_Self, Some(format!("[{}]", aty)))); - if let Some(def) = aty.ty_adt_def() { - // We also want to be able to select the array's type's original - // signature with no type arguments resolved - flags.push(( - sym::_Self, - Some(format!("[{}]", self.tcx.type_of(def.did).to_string())), - )); - let tcx = self.tcx; - if let Some(len) = len.try_eval_usize(tcx, ty::ParamEnv::empty()) { - flags.push(( - sym::_Self, - Some(format!("[{}; {}]", self.tcx.type_of(def.did).to_string(), len)), - )); - } else { - flags.push(( - sym::_Self, - Some(format!("[{}; _]", self.tcx.type_of(def.did).to_string())), - )); - } - } - } - - if let Ok(Some(command)) = OnUnimplementedDirective::of_item( - self.tcx, trait_ref.def_id, def_id - ) { - command.evaluate(self.tcx, trait_ref, &flags[..]) - } else { - OnUnimplementedNote::default() - } - } - - fn find_similar_impl_candidates( - &self, - trait_ref: ty::PolyTraitRef<'tcx>, - ) -> Vec> { - let simp = fast_reject::simplify_type(self.tcx, trait_ref.skip_binder().self_ty(), true); - let all_impls = self.tcx.all_impls(trait_ref.def_id()); - - match simp { - Some(simp) => all_impls.iter().filter_map(|&def_id| { - let imp = self.tcx.impl_trait_ref(def_id).unwrap(); - let imp_simp = fast_reject::simplify_type(self.tcx, imp.self_ty(), true); - if let Some(imp_simp) = imp_simp { - if simp != imp_simp { - return None - } - } - - Some(imp) - }).collect(), - None => all_impls.iter().map(|&def_id| - self.tcx.impl_trait_ref(def_id).unwrap() - ).collect() - } - } - - fn report_similar_impl_candidates( - &self, - impl_candidates: Vec>, - err: &mut DiagnosticBuilder<'_>, - ) { - if impl_candidates.is_empty() { - return; - } - - let len = impl_candidates.len(); - let end = if impl_candidates.len() <= 5 { - impl_candidates.len() - } else { - 4 - }; - - let normalize = |candidate| self.tcx.infer_ctxt().enter(|ref infcx| { - let normalized = infcx - .at(&ObligationCause::dummy(), ty::ParamEnv::empty()) - .normalize(candidate) - .ok(); - match normalized { - Some(normalized) => format!("\n {:?}", normalized.value), - None => format!("\n {:?}", candidate), - } - }); - - // Sort impl candidates so that ordering is consistent for UI tests. - let mut normalized_impl_candidates = impl_candidates - .iter() - .map(normalize) - .collect::>(); - - // Sort before taking the `..end` range, - // because the ordering of `impl_candidates` may not be deterministic: - // https://github.com/rust-lang/rust/pull/57475#issuecomment-455519507 - normalized_impl_candidates.sort(); - - err.help(&format!("the following implementations were found:{}{}", - normalized_impl_candidates[..end].join(""), - if len > 5 { - format!("\nand {} others", len - 4) - } else { - String::new() - } - )); - } - - /// Reports that an overflow has occurred and halts compilation. We - /// halt compilation unconditionally because it is important that - /// overflows never be masked -- they basically represent computations - /// whose result could not be truly determined and thus we can't say - /// if the program type checks or not -- and they are unusual - /// occurrences in any case. - pub fn report_overflow_error( - &self, - obligation: &Obligation<'tcx, T>, - suggest_increasing_limit: bool, - ) -> ! - where T: fmt::Display + TypeFoldable<'tcx> - { - let predicate = - self.resolve_vars_if_possible(&obligation.predicate); - let mut err = struct_span_err!( - self.tcx.sess, - obligation.cause.span, - E0275, - "overflow evaluating the requirement `{}`", - predicate - ); - - if suggest_increasing_limit { - self.suggest_new_overflow_limit(&mut err); - } - - self.note_obligation_cause_code( - &mut err, - &obligation.predicate, - &obligation.cause.code, - &mut vec![], - ); - - err.emit(); - self.tcx.sess.abort_if_errors(); - bug!(); - } - - /// Reports that a cycle was detected which led to overflow and halts - /// compilation. This is equivalent to `report_overflow_error` except - /// that we can give a more helpful error message (and, in particular, - /// we do not suggest increasing the overflow limit, which is not - /// going to help). - pub fn report_overflow_error_cycle(&self, cycle: &[PredicateObligation<'tcx>]) -> ! { - let cycle = self.resolve_vars_if_possible(&cycle.to_owned()); - assert!(cycle.len() > 0); - - debug!("report_overflow_error_cycle: cycle={:?}", cycle); - - self.report_overflow_error(&cycle[0], false); - } - - pub fn report_extra_impl_obligation(&self, - error_span: Span, - item_name: ast::Name, - _impl_item_def_id: DefId, - trait_item_def_id: DefId, - requirement: &dyn fmt::Display) - -> DiagnosticBuilder<'tcx> - { - let msg = "impl has stricter requirements than trait"; - let sp = self.tcx.sess.source_map().def_span(error_span); - - let mut err = struct_span_err!(self.tcx.sess, sp, E0276, "{}", msg); - - if let Some(trait_item_span) = self.tcx.hir().span_if_local(trait_item_def_id) { - let span = self.tcx.sess.source_map().def_span(trait_item_span); - err.span_label(span, format!("definition of `{}` from trait", item_name)); - } - - err.span_label(sp, format!("impl has extra requirement {}", requirement)); - - err - } - - - /// Gets the parent trait chain start - fn get_parent_trait_ref(&self, code: &ObligationCauseCode<'tcx>) -> Option { - match code { - &ObligationCauseCode::BuiltinDerivedObligation(ref data) => { - let parent_trait_ref = self.resolve_vars_if_possible( - &data.parent_trait_ref); - match self.get_parent_trait_ref(&data.parent_code) { - Some(t) => Some(t), - None => Some(parent_trait_ref.skip_binder().self_ty().to_string()), - } - } - _ => None, - } - } - - pub fn report_selection_error( - &self, - obligation: &PredicateObligation<'tcx>, - error: &SelectionError<'tcx>, - fallback_has_occurred: bool, - points_at_arg: bool, - ) { - let tcx = self.tcx; - let span = obligation.cause.span; - - let mut err = match *error { - SelectionError::Unimplemented => { - if let ObligationCauseCode::CompareImplMethodObligation { - item_name, impl_item_def_id, trait_item_def_id, - } = obligation.cause.code { - self.report_extra_impl_obligation( - span, - item_name, - impl_item_def_id, - trait_item_def_id, - &format!("`{}`", obligation.predicate)) - .emit(); - return; - } - match obligation.predicate { - ty::Predicate::Trait(ref trait_predicate) => { - let trait_predicate = self.resolve_vars_if_possible(trait_predicate); - - if self.tcx.sess.has_errors() && trait_predicate.references_error() { - return; - } - let trait_ref = trait_predicate.to_poly_trait_ref(); - let ( - post_message, - pre_message, - ) = self.get_parent_trait_ref(&obligation.cause.code) - .map(|t| (format!(" in `{}`", t), format!("within `{}`, ", t))) - .unwrap_or_default(); - - let OnUnimplementedNote { - message, - label, - note, - enclosing_scope, - } = self.on_unimplemented_note(trait_ref, obligation); - let have_alt_message = message.is_some() || label.is_some(); - let is_try = self.tcx.sess.source_map().span_to_snippet(span) - .map(|s| &s == "?") - .unwrap_or(false); - let is_from = - format!("{}", trait_ref.print_only_trait_path()) - .starts_with("std::convert::From<"); - let (message, note) = if is_try && is_from { - (Some(format!( - "`?` couldn't convert the error to `{}`", - trait_ref.self_ty(), - )), Some( - "the question mark operation (`?`) implicitly performs a \ - conversion on the error value using the `From` trait".to_owned() - )) - } else { - (message, note) - }; - - let mut err = struct_span_err!( - self.tcx.sess, - span, - E0277, - "{}", - message.unwrap_or_else(|| format!( - "the trait bound `{}` is not satisfied{}", - trait_ref.to_predicate(), - post_message, - ))); - - let explanation = - if obligation.cause.code == ObligationCauseCode::MainFunctionType { - "consider using `()`, or a `Result`".to_owned() - } else { - format!( - "{}the trait `{}` is not implemented for `{}`", - pre_message, - trait_ref.print_only_trait_path(), - trait_ref.self_ty(), - ) - }; - - if self.suggest_add_reference_to_arg( - &obligation, - &mut err, - &trait_ref, - points_at_arg, - have_alt_message, - ) { - self.note_obligation_cause(&mut err, obligation); - err.emit(); - return; - } - if let Some(ref s) = label { - // If it has a custom `#[rustc_on_unimplemented]` - // error message, let's display it as the label! - err.span_label(span, s.as_str()); - err.help(&explanation); - } else { - err.span_label(span, explanation); - } - if let Some(ref s) = note { - // If it has a custom `#[rustc_on_unimplemented]` note, let's display it - err.note(s.as_str()); - } - if let Some(ref s) = enclosing_scope { - let enclosing_scope_span = tcx.def_span( - tcx.hir() - .opt_local_def_id(obligation.cause.body_id) - .unwrap_or_else(|| { - tcx.hir().body_owner_def_id(hir::BodyId { - hir_id: obligation.cause.body_id, - }) - }), - ); - - err.span_label(enclosing_scope_span, s.as_str()); - } - - self.suggest_borrow_on_unsized_slice(&obligation.cause.code, &mut err); - self.suggest_fn_call(&obligation, &mut err, &trait_ref, points_at_arg); - self.suggest_remove_reference(&obligation, &mut err, &trait_ref); - self.suggest_semicolon_removal(&obligation, &mut err, span, &trait_ref); - self.note_version_mismatch(&mut err, &trait_ref); - - // Try to report a help message - if !trait_ref.has_infer_types() && - self.predicate_can_apply(obligation.param_env, trait_ref) { - // If a where-clause may be useful, remind the - // user that they can add it. - // - // don't display an on-unimplemented note, as - // these notes will often be of the form - // "the type `T` can't be frobnicated" - // which is somewhat confusing. - self.suggest_restricting_param_bound( - &mut err, - &trait_ref, - obligation.cause.body_id, - ); - } else { - if !have_alt_message { - // Can't show anything else useful, try to find similar impls. - let impl_candidates = self.find_similar_impl_candidates(trait_ref); - self.report_similar_impl_candidates(impl_candidates, &mut err); - } - self.suggest_change_mut( - &obligation, - &mut err, - &trait_ref, - points_at_arg, - ); - } - - // If this error is due to `!: Trait` not implemented but `(): Trait` is - // implemented, and fallback has occurred, then it could be due to a - // variable that used to fallback to `()` now falling back to `!`. Issue a - // note informing about the change in behaviour. - if trait_predicate.skip_binder().self_ty().is_never() - && fallback_has_occurred - { - let predicate = trait_predicate.map_bound(|mut trait_pred| { - trait_pred.trait_ref.substs = self.tcx.mk_substs_trait( - self.tcx.mk_unit(), - &trait_pred.trait_ref.substs[1..], - ); - trait_pred - }); - let unit_obligation = Obligation { - predicate: ty::Predicate::Trait(predicate), - .. obligation.clone() - }; - if self.predicate_may_hold(&unit_obligation) { - err.note("the trait is implemented for `()`. \ - Possibly this error has been caused by changes to \ - Rust's type-inference algorithm \ - (see: https://github.com/rust-lang/rust/issues/48950 \ - for more info). Consider whether you meant to use the \ - type `()` here instead."); - } - } - - err - } - - ty::Predicate::Subtype(ref predicate) => { - // Errors for Subtype predicates show up as - // `FulfillmentErrorCode::CodeSubtypeError`, - // not selection error. - span_bug!(span, "subtype requirement gave wrong error: `{:?}`", predicate) - } - - ty::Predicate::RegionOutlives(ref predicate) => { - let predicate = self.resolve_vars_if_possible(predicate); - let err = self.region_outlives_predicate(&obligation.cause, - &predicate).err().unwrap(); - struct_span_err!( - self.tcx.sess, span, E0279, - "the requirement `{}` is not satisfied (`{}`)", - predicate, err, - ) - } - - ty::Predicate::Projection(..) | ty::Predicate::TypeOutlives(..) => { - let predicate = - self.resolve_vars_if_possible(&obligation.predicate); - struct_span_err!(self.tcx.sess, span, E0280, - "the requirement `{}` is not satisfied", - predicate) - } - - ty::Predicate::ObjectSafe(trait_def_id) => { - let violations = self.tcx.object_safety_violations(trait_def_id); - self.tcx.report_object_safety_error( - span, - trait_def_id, - violations, - ) - } - - ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => { - let found_kind = self.closure_kind(closure_def_id, closure_substs).unwrap(); - let closure_span = self.tcx.sess.source_map() - .def_span(self.tcx.hir().span_if_local(closure_def_id).unwrap()); - let hir_id = self.tcx.hir().as_local_hir_id(closure_def_id).unwrap(); - let mut err = struct_span_err!( - self.tcx.sess, closure_span, E0525, - "expected a closure that implements the `{}` trait, \ - but this closure only implements `{}`", - kind, - found_kind); - - err.span_label( - closure_span, - format!("this closure implements `{}`, not `{}`", found_kind, kind)); - err.span_label( - obligation.cause.span, - format!("the requirement to implement `{}` derives from here", kind)); - - // Additional context information explaining why the closure only implements - // a particular trait. - if let Some(tables) = self.in_progress_tables { - let tables = tables.borrow(); - match (found_kind, tables.closure_kind_origins().get(hir_id)) { - (ty::ClosureKind::FnOnce, Some((span, name))) => { - err.span_label(*span, format!( - "closure is `FnOnce` because it moves the \ - variable `{}` out of its environment", name)); - }, - (ty::ClosureKind::FnMut, Some((span, name))) => { - err.span_label(*span, format!( - "closure is `FnMut` because it mutates the \ - variable `{}` here", name)); - }, - _ => {} - } - } - - err.emit(); - return; - } - - ty::Predicate::WellFormed(ty) => { - if !self.tcx.sess.opts.debugging_opts.chalk { - // WF predicates cannot themselves make - // errors. They can only block due to - // ambiguity; otherwise, they always - // degenerate into other obligations - // (which may fail). - span_bug!(span, "WF predicate not satisfied for {:?}", ty); - } else { - // FIXME: we'll need a better message which takes into account - // which bounds actually failed to hold. - self.tcx.sess.struct_span_err( - span, - &format!("the type `{}` is not well-formed (chalk)", ty) - ) - } - } - - ty::Predicate::ConstEvaluatable(..) => { - // Errors for `ConstEvaluatable` predicates show up as - // `SelectionError::ConstEvalFailure`, - // not `Unimplemented`. - span_bug!(span, - "const-evaluatable requirement gave wrong error: `{:?}`", obligation) - } - } - } - - OutputTypeParameterMismatch(ref found_trait_ref, ref expected_trait_ref, _) => { - let found_trait_ref = self.resolve_vars_if_possible(&*found_trait_ref); - let expected_trait_ref = self.resolve_vars_if_possible(&*expected_trait_ref); - - if expected_trait_ref.self_ty().references_error() { - return; - } - - let found_trait_ty = found_trait_ref.self_ty(); - - let found_did = match found_trait_ty.kind { - ty::Closure(did, _) | ty::Foreign(did) | ty::FnDef(did, _) => Some(did), - ty::Adt(def, _) => Some(def.did), - _ => None, - }; - - let found_span = found_did.and_then(|did| - self.tcx.hir().span_if_local(did) - ).map(|sp| self.tcx.sess.source_map().def_span(sp)); // the sp could be an fn def - - if self.reported_closure_mismatch.borrow().contains(&(span, found_span)) { - // We check closures twice, with obligations flowing in different directions, - // but we want to complain about them only once. - return; - } - - self.reported_closure_mismatch.borrow_mut().insert((span, found_span)); - - let found = match found_trait_ref.skip_binder().substs.type_at(1).kind { - ty::Tuple(ref tys) => vec![ArgKind::empty(); tys.len()], - _ => vec![ArgKind::empty()], - }; - - let expected_ty = expected_trait_ref.skip_binder().substs.type_at(1); - let expected = match expected_ty.kind { - ty::Tuple(ref tys) => tys.iter() - .map(|t| ArgKind::from_expected_ty(t.expect_ty(), Some(span))).collect(), - _ => vec![ArgKind::Arg("_".to_owned(), expected_ty.to_string())], - }; - - if found.len() == expected.len() { - self.report_closure_arg_mismatch(span, - found_span, - found_trait_ref, - expected_trait_ref) - } else { - let (closure_span, found) = found_did - .and_then(|did| self.tcx.hir().get_if_local(did)) - .map(|node| { - let (found_span, found) = self.get_fn_like_arguments(node); - (Some(found_span), found) - }).unwrap_or((found_span, found)); - - self.report_arg_count_mismatch(span, - closure_span, - expected, - found, - found_trait_ty.is_closure()) - } - } - - TraitNotObjectSafe(did) => { - let violations = self.tcx.object_safety_violations(did); - self.tcx.report_object_safety_error(span, did, violations) - } - - // already reported in the query - ConstEvalFailure(err) => { - self.tcx.sess.delay_span_bug( - span, - &format!("constant in type had an ignored error: {:?}", err), - ); - return; - } - - Overflow => { - bug!("overflow should be handled before the `report_selection_error` path"); - } - }; - - self.note_obligation_cause(&mut err, obligation); - - err.emit(); - } - - /// If the `Self` type of the unsatisfied trait `trait_ref` implements a trait - /// with the same path as `trait_ref`, a help message about - /// a probable version mismatch is added to `err` - fn note_version_mismatch( - &self, - err: &mut DiagnosticBuilder<'_>, - trait_ref: &ty::PolyTraitRef<'tcx>, - ) { - let get_trait_impl = |trait_def_id| { - let mut trait_impl = None; - self.tcx.for_each_relevant_impl(trait_def_id, trait_ref.self_ty(), |impl_def_id| { - if trait_impl.is_none() { - trait_impl = Some(impl_def_id); - } - }); - trait_impl - }; - let required_trait_path = self.tcx.def_path_str(trait_ref.def_id()); - let all_traits = self.tcx.all_traits(LOCAL_CRATE); - let traits_with_same_path: std::collections::BTreeSet<_> = all_traits - .iter() - .filter(|trait_def_id| **trait_def_id != trait_ref.def_id()) - .filter(|trait_def_id| self.tcx.def_path_str(**trait_def_id) == required_trait_path) - .collect(); - for trait_with_same_path in traits_with_same_path { - if let Some(impl_def_id) = get_trait_impl(*trait_with_same_path) { - let impl_span = self.tcx.def_span(impl_def_id); - err.span_help(impl_span, "trait impl with same name found"); - let trait_crate = self.tcx.crate_name(trait_with_same_path.krate); - let crate_msg = format!( - "Perhaps two different versions of crate `{}` are being used?", - trait_crate - ); - err.note(&crate_msg); - } - } - } - fn suggest_restricting_param_bound( - &self, - mut err: &mut DiagnosticBuilder<'_>, - trait_ref: &ty::PolyTraitRef<'_>, - body_id: hir::HirId, - ) { - let self_ty = trait_ref.self_ty(); - let (param_ty, projection) = match &self_ty.kind { - ty::Param(_) => (true, None), - ty::Projection(projection) => (false, Some(projection)), - _ => return, - }; - - let suggest_restriction = | - generics: &hir::Generics, - msg, - err: &mut DiagnosticBuilder<'_>, - | { - let span = generics.where_clause.span_for_predicates_or_empty_place(); - if !span.from_expansion() && span.desugaring_kind().is_none() { - err.span_suggestion( - generics.where_clause.span_for_predicates_or_empty_place().shrink_to_hi(), - &format!("consider further restricting {}", msg), - format!( - "{} {} ", - if !generics.where_clause.predicates.is_empty() { - "," - } else { - " where" - }, - trait_ref.to_predicate(), - ), - Applicability::MachineApplicable, - ); - } - }; - - // FIXME: Add check for trait bound that is already present, particularly `?Sized` so we - // don't suggest `T: Sized + ?Sized`. - let mut hir_id = body_id; - while let Some(node) = self.tcx.hir().find(hir_id) { - match node { - hir::Node::TraitItem(hir::TraitItem { - generics, - kind: hir::TraitItemKind::Method(..), .. - }) if param_ty && self_ty == self.tcx.types.self_param => { - // Restricting `Self` for a single method. - suggest_restriction(&generics, "`Self`", err); - return; - } - - hir::Node::Item(hir::Item { - kind: hir::ItemKind::Fn(_, generics, _), .. - }) | - hir::Node::TraitItem(hir::TraitItem { - generics, - kind: hir::TraitItemKind::Method(..), .. - }) | - hir::Node::ImplItem(hir::ImplItem { - generics, - kind: hir::ImplItemKind::Method(..), .. - }) | - hir::Node::Item(hir::Item { - kind: hir::ItemKind::Trait(_, _, generics, _, _), .. - }) | - hir::Node::Item(hir::Item { - kind: hir::ItemKind::Impl(_, _, _, generics, ..), .. - }) if projection.is_some() => { - // Missing associated type bound. - suggest_restriction(&generics, "the associated type", err); - return; - } - - hir::Node::Item(hir::Item { kind: hir::ItemKind::Struct(_, generics), span, .. }) | - hir::Node::Item(hir::Item { kind: hir::ItemKind::Enum(_, generics), span, .. }) | - hir::Node::Item(hir::Item { kind: hir::ItemKind::Union(_, generics), span, .. }) | - hir::Node::Item(hir::Item { - kind: hir::ItemKind::Trait(_, _, generics, ..), span, .. - }) | - hir::Node::Item(hir::Item { - kind: hir::ItemKind::Impl(_, _, _, generics, ..), span, .. - }) | - hir::Node::Item(hir::Item { - kind: hir::ItemKind::Fn(_, generics, _), span, .. - }) | - hir::Node::Item(hir::Item { - kind: hir::ItemKind::TyAlias(_, generics), span, .. - }) | - hir::Node::Item(hir::Item { - kind: hir::ItemKind::TraitAlias(generics, _), span, .. - }) | - hir::Node::Item(hir::Item { - kind: hir::ItemKind::OpaqueTy(hir::OpaqueTy { generics, .. }), span, .. - }) | - hir::Node::TraitItem(hir::TraitItem { generics, span, .. }) | - hir::Node::ImplItem(hir::ImplItem { generics, span, .. }) - if param_ty => { - // Missing generic type parameter bound. - let param_name = self_ty.to_string(); - let constraint = trait_ref.print_only_trait_path().to_string(); - if suggest_constraining_type_param( - generics, - &mut err, - ¶m_name, - &constraint, - self.tcx.sess.source_map(), - *span, - ) { - return; - } - } - - hir::Node::Crate => return, - - _ => {} - } - - hir_id = self.tcx.hir().get_parent_item(hir_id); - } - } - - /// When encountering an assignment of an unsized trait, like `let x = ""[..];`, provide a - /// suggestion to borrow the initializer in order to use have a slice instead. - fn suggest_borrow_on_unsized_slice( - &self, - code: &ObligationCauseCode<'tcx>, - err: &mut DiagnosticBuilder<'tcx>, - ) { - if let &ObligationCauseCode::VariableType(hir_id) = code { - let parent_node = self.tcx.hir().get_parent_node(hir_id); - if let Some(Node::Local(ref local)) = self.tcx.hir().find(parent_node) { - if let Some(ref expr) = local.init { - if let hir::ExprKind::Index(_, _) = expr.kind { - if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(expr.span) { - err.span_suggestion( - expr.span, - "consider borrowing here", - format!("&{}", snippet), - Applicability::MachineApplicable - ); - } - } - } - } - } - } - - fn mk_obligation_for_def_id( - &self, - def_id: DefId, - output_ty: Ty<'tcx>, - cause: ObligationCause<'tcx>, - param_env: ty::ParamEnv<'tcx>, - ) -> PredicateObligation<'tcx> { - let new_trait_ref = ty::TraitRef { - def_id, - substs: self.tcx.mk_substs_trait(output_ty, &[]), - }; - Obligation::new(cause, param_env, new_trait_ref.to_predicate()) - } - - /// Given a closure's `DefId`, return the given name of the closure. - /// - /// This doesn't account for reassignments, but it's only used for suggestions. - fn get_closure_name( - &self, - def_id: DefId, - err: &mut DiagnosticBuilder<'_>, - msg: &str, - ) -> Option { - let get_name = |err: &mut DiagnosticBuilder<'_>, kind: &hir::PatKind| -> Option { - // Get the local name of this closure. This can be inaccurate because - // of the possibility of reassignment, but this should be good enough. - match &kind { - hir::PatKind::Binding(hir::BindingAnnotation::Unannotated, _, name, None) => { - Some(format!("{}", name)) - } - _ => { - err.note(&msg); - None - } - } - }; - - let hir = self.tcx.hir(); - let hir_id = hir.as_local_hir_id(def_id)?; - let parent_node = hir.get_parent_node(hir_id); - match hir.find(parent_node) { - Some(hir::Node::Stmt(hir::Stmt { - kind: hir::StmtKind::Local(local), .. - })) => get_name(err, &local.pat.kind), - // Different to previous arm because one is `&hir::Local` and the other - // is `P`. - Some(hir::Node::Local(local)) => get_name(err, &local.pat.kind), - _ => return None, - } - } - - /// We tried to apply the bound to an `fn` or closure. Check whether calling it would - /// evaluate to a type that *would* satisfy the trait binding. If it would, suggest calling - /// it: `bar(foo)` → `bar(foo())`. This case is *very* likely to be hit if `foo` is `async`. - fn suggest_fn_call( - &self, - obligation: &PredicateObligation<'tcx>, - err: &mut DiagnosticBuilder<'_>, - trait_ref: &ty::Binder>, - points_at_arg: bool, - ) { - let self_ty = trait_ref.self_ty(); - let (def_id, output_ty, callable) = match self_ty.kind { - ty::Closure(def_id, substs) => { - (def_id, self.closure_sig(def_id, substs).output(), "closure") - } - ty::FnDef(def_id, _) => { - (def_id, self_ty.fn_sig(self.tcx).output(), "function") - } - _ => return, - }; - let msg = format!("use parentheses to call the {}", callable); - - let obligation = self.mk_obligation_for_def_id( - trait_ref.def_id(), - output_ty.skip_binder(), - obligation.cause.clone(), - obligation.param_env, - ); - - match self.evaluate_obligation(&obligation) { - Ok(EvaluationResult::EvaluatedToOk) | - Ok(EvaluationResult::EvaluatedToOkModuloRegions) | - Ok(EvaluationResult::EvaluatedToAmbig) => {} - _ => return, - } - let hir = self.tcx.hir(); - // Get the name of the callable and the arguments to be used in the suggestion. - let snippet = match hir.get_if_local(def_id) { - Some(hir::Node::Expr(hir::Expr { - kind: hir::ExprKind::Closure(_, decl, _, span, ..), - .. - })) => { - err.span_label(*span, "consider calling this closure"); - let name = match self.get_closure_name(def_id, err, &msg) { - Some(name) => name, - None => return, - }; - let args = decl.inputs.iter() - .map(|_| "_") - .collect::>() - .join(", "); - format!("{}({})", name, args) - } - Some(hir::Node::Item(hir::Item { - ident, - kind: hir::ItemKind::Fn(.., body_id), - .. - })) => { - err.span_label(ident.span, "consider calling this function"); - let body = hir.body(*body_id); - let args = body.params.iter() - .map(|arg| match &arg.pat.kind { - hir::PatKind::Binding(_, _, ident, None) - // FIXME: provide a better suggestion when encountering `SelfLower`, it - // should suggest a method call. - if ident.name != kw::SelfLower => ident.to_string(), - _ => "_".to_string(), - }) - .collect::>() - .join(", "); - format!("{}({})", ident, args) - } - _ => return, - }; - if points_at_arg { - // When the obligation error has been ensured to have been caused by - // an argument, the `obligation.cause.span` points at the expression - // of the argument, so we can provide a suggestion. This is signaled - // by `points_at_arg`. Otherwise, we give a more general note. - err.span_suggestion( - obligation.cause.span, - &msg, - snippet, - Applicability::HasPlaceholders, - ); - } else { - err.help(&format!("{}: `{}`", msg, snippet)); - } - } - - fn suggest_add_reference_to_arg( - &self, - obligation: &PredicateObligation<'tcx>, - err: &mut DiagnosticBuilder<'tcx>, - trait_ref: &ty::Binder>, - points_at_arg: bool, - has_custom_message: bool, - ) -> bool { - if !points_at_arg { - return false; - } - - let span = obligation.cause.span; - let param_env = obligation.param_env; - let trait_ref = trait_ref.skip_binder(); - - if let ObligationCauseCode::ImplDerivedObligation(obligation) = &obligation.cause.code { - // Try to apply the original trait binding obligation by borrowing. - let self_ty = trait_ref.self_ty(); - let found = self_ty.to_string(); - let new_self_ty = self.tcx.mk_imm_ref(self.tcx.lifetimes.re_static, self_ty); - let substs = self.tcx.mk_substs_trait(new_self_ty, &[]); - let new_trait_ref = ty::TraitRef::new(obligation.parent_trait_ref.def_id(), substs); - let new_obligation = Obligation::new( - ObligationCause::dummy(), - param_env, - new_trait_ref.to_predicate(), - ); - if self.predicate_must_hold_modulo_regions(&new_obligation) { - if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span) { - // We have a very specific type of error, where just borrowing this argument - // might solve the problem. In cases like this, the important part is the - // original type obligation, not the last one that failed, which is arbitrary. - // Because of this, we modify the error to refer to the original obligation and - // return early in the caller. - let msg = format!( - "the trait bound `{}: {}` is not satisfied", - found, - obligation.parent_trait_ref.skip_binder().print_only_trait_path(), - ); - if has_custom_message { - err.note(&msg); - } else { - err.message = vec![(msg, Style::NoStyle)]; - } - if snippet.starts_with('&') { - // This is already a literal borrow and the obligation is failing - // somewhere else in the obligation chain. Do not suggest non-sense. - return false; - } - err.span_label(span, &format!( - "expected an implementor of trait `{}`", - obligation.parent_trait_ref.skip_binder().print_only_trait_path(), - )); - err.span_suggestion( - span, - "consider borrowing here", - format!("&{}", snippet), - Applicability::MaybeIncorrect, - ); - return true; - } - } - } - false - } - - /// Whenever references are used by mistake, like `for (i, e) in &vec.iter().enumerate()`, - /// suggest removing these references until we reach a type that implements the trait. - fn suggest_remove_reference( - &self, - obligation: &PredicateObligation<'tcx>, - err: &mut DiagnosticBuilder<'tcx>, - trait_ref: &ty::Binder>, - ) { - let trait_ref = trait_ref.skip_binder(); - let span = obligation.cause.span; - - if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span) { - let refs_number = snippet.chars() - .filter(|c| !c.is_whitespace()) - .take_while(|c| *c == '&') - .count(); - if let Some('\'') = snippet.chars() - .filter(|c| !c.is_whitespace()) - .skip(refs_number) - .next() - { // Do not suggest removal of borrow from type arguments. - return; - } - - let mut trait_type = trait_ref.self_ty(); - - for refs_remaining in 0..refs_number { - if let ty::Ref(_, t_type, _) = trait_type.kind { - trait_type = t_type; - - let new_obligation = self.mk_obligation_for_def_id( - trait_ref.def_id, - trait_type, - ObligationCause::dummy(), - obligation.param_env, - ); - - if self.predicate_may_hold(&new_obligation) { - let sp = self.tcx.sess.source_map() - .span_take_while(span, |c| c.is_whitespace() || *c == '&'); - - let remove_refs = refs_remaining + 1; - let format_str = format!("consider removing {} leading `&`-references", - remove_refs); - - err.span_suggestion_short( - sp, &format_str, String::new(), Applicability::MachineApplicable - ); - break; - } - } else { - break; - } - } - } - } - - /// Check if the trait bound is implemented for a different mutability and note it in the - /// final error. - fn suggest_change_mut( - &self, - obligation: &PredicateObligation<'tcx>, - err: &mut DiagnosticBuilder<'tcx>, - trait_ref: &ty::Binder>, - points_at_arg: bool, - ) { - let span = obligation.cause.span; - if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span) { - let refs_number = snippet.chars() - .filter(|c| !c.is_whitespace()) - .take_while(|c| *c == '&') - .count(); - if let Some('\'') = snippet.chars() - .filter(|c| !c.is_whitespace()) - .skip(refs_number) - .next() - { // Do not suggest removal of borrow from type arguments. - return; - } - let trait_ref = self.resolve_vars_if_possible(trait_ref); - if trait_ref.has_infer_types() { - // Do not ICE while trying to find if a reborrow would succeed on a trait with - // unresolved bindings. - return; - } - - if let ty::Ref(region, t_type, mutability) = trait_ref.skip_binder().self_ty().kind { - let trait_type = match mutability { - hir::Mutability::Mutable => self.tcx.mk_imm_ref(region, t_type), - hir::Mutability::Immutable => self.tcx.mk_mut_ref(region, t_type), - }; - - let new_obligation = self.mk_obligation_for_def_id( - trait_ref.skip_binder().def_id, - trait_type, - ObligationCause::dummy(), - obligation.param_env, - ); - - if self.evaluate_obligation_no_overflow( - &new_obligation, - ).must_apply_modulo_regions() { - let sp = self.tcx.sess.source_map() - .span_take_while(span, |c| c.is_whitespace() || *c == '&'); - if points_at_arg && - mutability == hir::Mutability::Immutable && - refs_number > 0 - { - err.span_suggestion( - sp, - "consider changing this borrow's mutability", - "&mut ".to_string(), - Applicability::MachineApplicable, - ); - } else { - err.note(&format!( - "`{}` is implemented for `{:?}`, but not for `{:?}`", - trait_ref.print_only_trait_path(), - trait_type, - trait_ref.skip_binder().self_ty(), - )); - } - } - } - } - } - - fn suggest_semicolon_removal( - &self, - obligation: &PredicateObligation<'tcx>, - err: &mut DiagnosticBuilder<'tcx>, - span: Span, - trait_ref: &ty::Binder>, - ) { - let hir = self.tcx.hir(); - let parent_node = hir.get_parent_node(obligation.cause.body_id); - let node = hir.find(parent_node); - if let Some(hir::Node::Item(hir::Item { - kind: hir::ItemKind::Fn(sig, _, body_id), - .. - })) = node { - let body = hir.body(*body_id); - if let hir::ExprKind::Block(blk, _) = &body.value.kind { - if sig.decl.output.span().overlaps(span) && blk.expr.is_none() && - "()" == &trait_ref.self_ty().to_string() - { - // FIXME(estebank): When encountering a method with a trait - // bound not satisfied in the return type with a body that has - // no return, suggest removal of semicolon on last statement. - // Once that is added, close #54771. - if let Some(ref stmt) = blk.stmts.last() { - let sp = self.tcx.sess.source_map().end_point(stmt.span); - err.span_label(sp, "consider removing this semicolon"); - } - } - } - } - } - - /// Given some node representing a fn-like thing in the HIR map, - /// returns a span and `ArgKind` information that describes the - /// arguments it expects. This can be supplied to - /// `report_arg_count_mismatch`. - pub fn get_fn_like_arguments(&self, node: Node<'_>) -> (Span, Vec) { - match node { - Node::Expr(&hir::Expr { - kind: hir::ExprKind::Closure(_, ref _decl, id, span, _), - .. - }) => { - (self.tcx.sess.source_map().def_span(span), - self.tcx.hir().body(id).params.iter() - .map(|arg| { - if let hir::Pat { - kind: hir::PatKind::Tuple(ref args, _), - span, - .. - } = *arg.pat { - ArgKind::Tuple( - Some(span), - args.iter().map(|pat| { - let snippet = self.tcx.sess.source_map() - .span_to_snippet(pat.span).unwrap(); - (snippet, "_".to_owned()) - }).collect::>(), - ) - } else { - let name = self.tcx.sess.source_map() - .span_to_snippet(arg.pat.span).unwrap(); - ArgKind::Arg(name, "_".to_owned()) - } - }) - .collect::>()) - } - Node::Item(&hir::Item { - span, - kind: hir::ItemKind::Fn(ref sig, ..), - .. - }) | - Node::ImplItem(&hir::ImplItem { - span, - kind: hir::ImplItemKind::Method(ref sig, _), - .. - }) | - Node::TraitItem(&hir::TraitItem { - span, - kind: hir::TraitItemKind::Method(ref sig, _), - .. - }) => { - (self.tcx.sess.source_map().def_span(span), sig.decl.inputs.iter() - .map(|arg| match arg.clone().kind { - hir::TyKind::Tup(ref tys) => ArgKind::Tuple( - Some(arg.span), - vec![("_".to_owned(), "_".to_owned()); tys.len()] - ), - _ => ArgKind::empty() - }).collect::>()) - } - Node::Ctor(ref variant_data) => { - let span = variant_data.ctor_hir_id() - .map(|hir_id| self.tcx.hir().span(hir_id)) - .unwrap_or(DUMMY_SP); - let span = self.tcx.sess.source_map().def_span(span); - - (span, vec![ArgKind::empty(); variant_data.fields().len()]) - } - _ => panic!("non-FnLike node found: {:?}", node), - } - } - - /// Reports an error when the number of arguments needed by a - /// trait match doesn't match the number that the expression - /// provides. - pub fn report_arg_count_mismatch( - &self, - span: Span, - found_span: Option, - expected_args: Vec, - found_args: Vec, - is_closure: bool, - ) -> DiagnosticBuilder<'tcx> { - let kind = if is_closure { "closure" } else { "function" }; - - let args_str = |arguments: &[ArgKind], other: &[ArgKind]| { - let arg_length = arguments.len(); - let distinct = match &other[..] { - &[ArgKind::Tuple(..)] => true, - _ => false, - }; - match (arg_length, arguments.get(0)) { - (1, Some(&ArgKind::Tuple(_, ref fields))) => { - format!("a single {}-tuple as argument", fields.len()) - } - _ => format!("{} {}argument{}", - arg_length, - if distinct && arg_length > 1 { "distinct " } else { "" }, - pluralize!(arg_length)) - } - }; - - let expected_str = args_str(&expected_args, &found_args); - let found_str = args_str(&found_args, &expected_args); - - let mut err = struct_span_err!( - self.tcx.sess, - span, - E0593, - "{} is expected to take {}, but it takes {}", - kind, - expected_str, - found_str, - ); - - err.span_label(span, format!("expected {} that takes {}", kind, expected_str)); - - if let Some(found_span) = found_span { - err.span_label(found_span, format!("takes {}", found_str)); - - // move |_| { ... } - // ^^^^^^^^-- def_span - // - // move |_| { ... } - // ^^^^^-- prefix - let prefix_span = self.tcx.sess.source_map().span_until_non_whitespace(found_span); - // move |_| { ... } - // ^^^-- pipe_span - let pipe_span = if let Some(span) = found_span.trim_start(prefix_span) { - span - } else { - found_span - }; - - // Suggest to take and ignore the arguments with expected_args_length `_`s if - // found arguments is empty (assume the user just wants to ignore args in this case). - // For example, if `expected_args_length` is 2, suggest `|_, _|`. - if found_args.is_empty() && is_closure { - let underscores = vec!["_"; expected_args.len()].join(", "); - err.span_suggestion( - pipe_span, - &format!( - "consider changing the closure to take and ignore the expected argument{}", - if expected_args.len() < 2 { - "" - } else { - "s" - } - ), - format!("|{}|", underscores), - Applicability::MachineApplicable, - ); - } - - if let &[ArgKind::Tuple(_, ref fields)] = &found_args[..] { - if fields.len() == expected_args.len() { - let sugg = fields.iter() - .map(|(name, _)| name.to_owned()) - .collect::>() - .join(", "); - err.span_suggestion( - found_span, - "change the closure to take multiple arguments instead of a single tuple", - format!("|{}|", sugg), - Applicability::MachineApplicable, - ); - } - } - if let &[ArgKind::Tuple(_, ref fields)] = &expected_args[..] { - if fields.len() == found_args.len() && is_closure { - let sugg = format!( - "|({}){}|", - found_args.iter() - .map(|arg| match arg { - ArgKind::Arg(name, _) => name.to_owned(), - _ => "_".to_owned(), - }) - .collect::>() - .join(", "), - // add type annotations if available - if found_args.iter().any(|arg| match arg { - ArgKind::Arg(_, ty) => ty != "_", - _ => false, - }) { - format!(": ({})", - fields.iter() - .map(|(_, ty)| ty.to_owned()) - .collect::>() - .join(", ")) - } else { - String::new() - }, - ); - err.span_suggestion( - found_span, - "change the closure to accept a tuple instead of individual arguments", - sugg, - Applicability::MachineApplicable, - ); - } - } - } - - err - } - - fn report_closure_arg_mismatch( - &self, - span: Span, - found_span: Option, - expected_ref: ty::PolyTraitRef<'tcx>, - found: ty::PolyTraitRef<'tcx>, - ) -> DiagnosticBuilder<'tcx> { - fn build_fn_sig_string<'tcx>(tcx: TyCtxt<'tcx>, trait_ref: &ty::TraitRef<'tcx>) -> String { - let inputs = trait_ref.substs.type_at(1); - let sig = if let ty::Tuple(inputs) = inputs.kind { - tcx.mk_fn_sig( - inputs.iter().map(|k| k.expect_ty()), - tcx.mk_ty_infer(ty::TyVar(ty::TyVid { index: 0 })), - false, - hir::Unsafety::Normal, - ::rustc_target::spec::abi::Abi::Rust - ) - } else { - tcx.mk_fn_sig( - ::std::iter::once(inputs), - tcx.mk_ty_infer(ty::TyVar(ty::TyVid { index: 0 })), - false, - hir::Unsafety::Normal, - ::rustc_target::spec::abi::Abi::Rust - ) - }; - ty::Binder::bind(sig).to_string() - } - - let argument_is_closure = expected_ref.skip_binder().substs.type_at(0).is_closure(); - let mut err = struct_span_err!(self.tcx.sess, span, E0631, - "type mismatch in {} arguments", - if argument_is_closure { "closure" } else { "function" }); - - let found_str = format!( - "expected signature of `{}`", - build_fn_sig_string(self.tcx, found.skip_binder()) - ); - err.span_label(span, found_str); - - let found_span = found_span.unwrap_or(span); - let expected_str = format!( - "found signature of `{}`", - build_fn_sig_string(self.tcx, expected_ref.skip_binder()) - ); - err.span_label(found_span, expected_str); - - err - } -} - -impl<'tcx> TyCtxt<'tcx> { - pub fn recursive_type_with_infinite_size_error(self, - type_def_id: DefId) - -> DiagnosticBuilder<'tcx> - { - assert!(type_def_id.is_local()); - let span = self.hir().span_if_local(type_def_id).unwrap(); - let span = self.sess.source_map().def_span(span); - let mut err = struct_span_err!(self.sess, span, E0072, - "recursive type `{}` has infinite size", - self.def_path_str(type_def_id)); - err.span_label(span, "recursive type has infinite size"); - err.help(&format!("insert indirection (e.g., a `Box`, `Rc`, or `&`) \ - at some point to make `{}` representable", - self.def_path_str(type_def_id))); - err - } - - pub fn report_object_safety_error( - self, - span: Span, - trait_def_id: DefId, - violations: Vec, - ) -> DiagnosticBuilder<'tcx> { - let trait_str = self.def_path_str(trait_def_id); - let span = self.sess.source_map().def_span(span); - let mut err = struct_span_err!( - self.sess, span, E0038, - "the trait `{}` cannot be made into an object", - trait_str); - err.span_label(span, format!("the trait `{}` cannot be made into an object", trait_str)); - - let mut reported_violations = FxHashSet::default(); - for violation in violations { - if reported_violations.insert(violation.clone()) { - match violation.span() { - Some(span) => err.span_label(span, violation.error_msg()), - None => err.note(&violation.error_msg()), - }; - } - } - - if self.sess.trait_methods_not_found.borrow().contains(&span) { - // Avoid emitting error caused by non-existing method (#58734) - err.cancel(); - } - - err - } -} - -impl<'a, 'tcx> InferCtxt<'a, 'tcx> { - fn maybe_report_ambiguity( - &self, - obligation: &PredicateObligation<'tcx>, - body_id: Option, - ) { - // Unable to successfully determine, probably means - // insufficient type information, but could mean - // ambiguous impls. The latter *ought* to be a - // coherence violation, so we don't report it here. - - let predicate = self.resolve_vars_if_possible(&obligation.predicate); - let span = obligation.cause.span; - - debug!( - "maybe_report_ambiguity(predicate={:?}, obligation={:?} body_id={:?}, code={:?})", - predicate, - obligation, - body_id, - obligation.cause.code, - ); - - // Ambiguity errors are often caused as fallout from earlier - // errors. So just ignore them if this infcx is tainted. - if self.is_tainted_by_errors() { - return; - } - - let mut err = match predicate { - ty::Predicate::Trait(ref data) => { - let trait_ref = data.to_poly_trait_ref(); - let self_ty = trait_ref.self_ty(); - debug!("self_ty {:?} {:?} trait_ref {:?}", self_ty, self_ty.kind, trait_ref); - - if predicate.references_error() { - return; - } - // Typically, this ambiguity should only happen if - // there are unresolved type inference variables - // (otherwise it would suggest a coherence - // failure). But given #21974 that is not necessarily - // the case -- we can have multiple where clauses that - // are only distinguished by a region, which results - // in an ambiguity even when all types are fully - // known, since we don't dispatch based on region - // relationships. - - // This is kind of a hack: it frequently happens that some earlier - // error prevents types from being fully inferred, and then we get - // a bunch of uninteresting errors saying something like " doesn't implement Sized". It may even be true that we - // could just skip over all checks where the self-ty is an - // inference variable, but I was afraid that there might be an - // inference variable created, registered as an obligation, and - // then never forced by writeback, and hence by skipping here we'd - // be ignoring the fact that we don't KNOW the type works - // out. Though even that would probably be harmless, given that - // we're only talking about builtin traits, which are known to be - // inhabited. We used to check for `self.tcx.sess.has_errors()` to - // avoid inundating the user with unnecessary errors, but we now - // check upstream for type errors and dont add the obligations to - // begin with in those cases. - if self.tcx.lang_items().sized_trait() - .map_or(false, |sized_id| sized_id == trait_ref.def_id()) - { - self.need_type_info_err(body_id, span, self_ty, ErrorCode::E0282).emit(); - return; - } - let mut err = self.need_type_info_err(body_id, span, self_ty, ErrorCode::E0283); - err.note(&format!("cannot resolve `{}`", predicate)); - if let (Ok(ref snippet), ObligationCauseCode::BindingObligation(ref def_id, _)) = ( - self.tcx.sess.source_map().span_to_snippet(span), - &obligation.cause.code, - ) { - let generics = self.tcx.generics_of(*def_id); - if !generics.params.is_empty() && !snippet.ends_with('>'){ - // FIXME: To avoid spurious suggestions in functions where type arguments - // where already supplied, we check the snippet to make sure it doesn't - // end with a turbofish. Ideally we would have access to a `PathSegment` - // instead. Otherwise we would produce the following output: - // - // error[E0283]: type annotations needed - // --> $DIR/issue-54954.rs:3:24 - // | - // LL | const ARR_LEN: usize = Tt::const_val::<[i8; 123]>(); - // | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - // | | - // | cannot infer type - // | help: consider specifying the type argument - // | in the function call: - // | `Tt::const_val::<[i8; 123]>::` - // ... - // LL | const fn const_val() -> usize { - // | --------- - required by this bound in `Tt::const_val` - // | - // = note: cannot resolve `_: Tt` - - err.span_suggestion( - span, - &format!( - "consider specifying the type argument{} in the function call", - if generics.params.len() > 1 { - "s" - } else { - "" - }, - ), - format!("{}::<{}>", snippet, generics.params.iter() - .map(|p| p.name.to_string()) - .collect::>() - .join(", ")), - Applicability::HasPlaceholders, - ); - } - } - err - } - - ty::Predicate::WellFormed(ty) => { - // Same hacky approach as above to avoid deluging user - // with error messages. - if ty.references_error() || self.tcx.sess.has_errors() { - return; - } - self.need_type_info_err(body_id, span, ty, ErrorCode::E0282) - } - - ty::Predicate::Subtype(ref data) => { - if data.references_error() || self.tcx.sess.has_errors() { - // no need to overload user in such cases - return - } - let &SubtypePredicate { a_is_expected: _, a, b } = data.skip_binder(); - // both must be type variables, or the other would've been instantiated - assert!(a.is_ty_var() && b.is_ty_var()); - self.need_type_info_err(body_id, span, a, ErrorCode::E0282) - } - ty::Predicate::Projection(ref data) => { - let trait_ref = data.to_poly_trait_ref(self.tcx); - let self_ty = trait_ref.self_ty(); - if predicate.references_error() { - return; - } - let mut err = self.need_type_info_err(body_id, span, self_ty, ErrorCode::E0284); - err.note(&format!("cannot resolve `{}`", predicate)); - err - } - - _ => { - if self.tcx.sess.has_errors() { - return; - } - let mut err = struct_span_err!( - self.tcx.sess, - span, - E0284, - "type annotations needed: cannot resolve `{}`", - predicate, - ); - err.span_label(span, &format!("cannot resolve `{}`", predicate)); - err - } - }; - self.note_obligation_cause(&mut err, obligation); - err.emit(); - } - - /// Returns `true` if the trait predicate may apply for *some* assignment - /// to the type parameters. - fn predicate_can_apply( - &self, - param_env: ty::ParamEnv<'tcx>, - pred: ty::PolyTraitRef<'tcx>, - ) -> bool { - struct ParamToVarFolder<'a, 'tcx> { - infcx: &'a InferCtxt<'a, 'tcx>, - var_map: FxHashMap, Ty<'tcx>>, - } - - impl<'a, 'tcx> TypeFolder<'tcx> for ParamToVarFolder<'a, 'tcx> { - fn tcx<'b>(&'b self) -> TyCtxt<'tcx> { self.infcx.tcx } - - fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { - if let ty::Param(ty::ParamTy {name, .. }) = ty.kind { - let infcx = self.infcx; - self.var_map.entry(ty).or_insert_with(|| - infcx.next_ty_var( - TypeVariableOrigin { - kind: TypeVariableOriginKind::TypeParameterDefinition(name), - span: DUMMY_SP, - } - ) - ) - } else { - ty.super_fold_with(self) - } - } - } - - self.probe(|_| { - let mut selcx = SelectionContext::new(self); - - let cleaned_pred = pred.fold_with(&mut ParamToVarFolder { - infcx: self, - var_map: Default::default() - }); - - let cleaned_pred = super::project::normalize( - &mut selcx, - param_env, - ObligationCause::dummy(), - &cleaned_pred - ).value; - - let obligation = Obligation::new( - ObligationCause::dummy(), - param_env, - cleaned_pred.to_predicate() - ); - - self.predicate_may_hold(&obligation) - }) - } - - fn note_obligation_cause( - &self, - err: &mut DiagnosticBuilder<'_>, - obligation: &PredicateObligation<'tcx>, - ) { - // First, attempt to add note to this error with an async-await-specific - // message, and fall back to regular note otherwise. - if !self.maybe_note_obligation_cause_for_async_await(err, obligation) { - self.note_obligation_cause_code(err, &obligation.predicate, &obligation.cause.code, - &mut vec![]); - } - } - - /// Adds an async-await specific note to the diagnostic when the future does not implement - /// an auto trait because of a captured type. - /// - /// ```ignore (diagnostic) - /// note: future does not implement `Qux` as this value is used across an await - /// --> $DIR/issue-64130-3-other.rs:17:5 - /// | - /// LL | let x = Foo; - /// | - has type `Foo` - /// LL | baz().await; - /// | ^^^^^^^^^^^ await occurs here, with `x` maybe used later - /// LL | } - /// | - `x` is later dropped here - /// ``` - /// - /// When the diagnostic does not implement `Send` or `Sync` specifically, then the diagnostic - /// is "replaced" with a different message and a more specific error. - /// - /// ```ignore (diagnostic) - /// error: future cannot be sent between threads safely - /// --> $DIR/issue-64130-2-send.rs:21:5 - /// | - /// LL | fn is_send(t: T) { } - /// | ------- ---- required by this bound in `is_send` - /// ... - /// LL | is_send(bar()); - /// | ^^^^^^^ future returned by `bar` is not send - /// | - /// = help: within `impl std::future::Future`, the trait `std::marker::Send` is not - /// implemented for `Foo` - /// note: future is not send as this value is used across an await - /// --> $DIR/issue-64130-2-send.rs:15:5 - /// | - /// LL | let x = Foo; - /// | - has type `Foo` - /// LL | baz().await; - /// | ^^^^^^^^^^^ await occurs here, with `x` maybe used later - /// LL | } - /// | - `x` is later dropped here - /// ``` - /// - /// Returns `true` if an async-await specific note was added to the diagnostic. - fn maybe_note_obligation_cause_for_async_await( - &self, - err: &mut DiagnosticBuilder<'_>, - obligation: &PredicateObligation<'tcx>, - ) -> bool { - debug!("maybe_note_obligation_cause_for_async_await: obligation.predicate={:?} \ - obligation.cause.span={:?}", obligation.predicate, obligation.cause.span); - let source_map = self.tcx.sess.source_map(); - - // Attempt to detect an async-await error by looking at the obligation causes, looking - // for a generator to be present. - // - // When a future does not implement a trait because of a captured type in one of the - // generators somewhere in the call stack, then the result is a chain of obligations. - // - // Given a `async fn` A that calls a `async fn` B which captures a non-send type and that - // future is passed as an argument to a function C which requires a `Send` type, then the - // chain looks something like this: - // - // - `BuiltinDerivedObligation` with a generator witness (B) - // - `BuiltinDerivedObligation` with a generator (B) - // - `BuiltinDerivedObligation` with `std::future::GenFuture` (B) - // - `BuiltinDerivedObligation` with `impl std::future::Future` (B) - // - `BuiltinDerivedObligation` with `impl std::future::Future` (B) - // - `BuiltinDerivedObligation` with a generator witness (A) - // - `BuiltinDerivedObligation` with a generator (A) - // - `BuiltinDerivedObligation` with `std::future::GenFuture` (A) - // - `BuiltinDerivedObligation` with `impl std::future::Future` (A) - // - `BuiltinDerivedObligation` with `impl std::future::Future` (A) - // - `BindingObligation` with `impl_send (Send requirement) - // - // The first obligation in the chain is the most useful and has the generator that captured - // the type. The last generator has information about where the bound was introduced. At - // least one generator should be present for this diagnostic to be modified. - let (mut trait_ref, mut target_ty) = match obligation.predicate { - ty::Predicate::Trait(p) => - (Some(p.skip_binder().trait_ref), Some(p.skip_binder().self_ty())), - _ => (None, None), - }; - let mut generator = None; - let mut last_generator = None; - let mut next_code = Some(&obligation.cause.code); - while let Some(code) = next_code { - debug!("maybe_note_obligation_cause_for_async_await: code={:?}", code); - match code { - ObligationCauseCode::BuiltinDerivedObligation(derived_obligation) | - ObligationCauseCode::ImplDerivedObligation(derived_obligation) => { - let ty = derived_obligation.parent_trait_ref.self_ty(); - debug!("maybe_note_obligation_cause_for_async_await: \ - parent_trait_ref={:?} self_ty.kind={:?}", - derived_obligation.parent_trait_ref, ty.kind); - - match ty.kind { - ty::Generator(did, ..) => { - generator = generator.or(Some(did)); - last_generator = Some(did); - }, - ty::GeneratorWitness(..) => {}, - _ if generator.is_none() => { - trait_ref = Some(*derived_obligation.parent_trait_ref.skip_binder()); - target_ty = Some(ty); - }, - _ => {}, - } - - next_code = Some(derived_obligation.parent_code.as_ref()); - }, - _ => break, - } - } - - // Only continue if a generator was found. - debug!("maybe_note_obligation_cause_for_async_await: generator={:?} trait_ref={:?} \ - target_ty={:?}", generator, trait_ref, target_ty); - let (generator_did, trait_ref, target_ty) = match (generator, trait_ref, target_ty) { - (Some(generator_did), Some(trait_ref), Some(target_ty)) => - (generator_did, trait_ref, target_ty), - _ => return false, - }; - - let span = self.tcx.def_span(generator_did); - - // Do not ICE on closure typeck (#66868). - if let None = self.tcx.hir().as_local_hir_id(generator_did) { - return false; - } - - // Get the tables from the infcx if the generator is the function we are - // currently type-checking; otherwise, get them by performing a query. - // This is needed to avoid cycles. - let in_progress_tables = self.in_progress_tables.map(|t| t.borrow()); - let generator_did_root = self.tcx.closure_base_def_id(generator_did); - debug!("maybe_note_obligation_cause_for_async_await: generator_did={:?} \ - generator_did_root={:?} in_progress_tables.local_id_root={:?} span={:?}", - generator_did, generator_did_root, - in_progress_tables.as_ref().map(|t| t.local_id_root), span); - let query_tables; - let tables: &TypeckTables<'tcx> = match &in_progress_tables { - Some(t) if t.local_id_root == Some(generator_did_root) => t, - _ => { - query_tables = self.tcx.typeck_tables_of(generator_did); - &query_tables - } - }; - - // Look for a type inside the generator interior that matches the target type to get - // a span. - let target_ty_erased = self.tcx.erase_regions(&target_ty); - let target_span = tables.generator_interior_types.iter() - .find(|ty::GeneratorInteriorTypeCause { ty, .. }| { - // Careful: the regions for types that appear in the - // generator interior are not generally known, so we - // want to erase them when comparing (and anyway, - // `Send` and other bounds are generally unaffected by - // the choice of region). When erasing regions, we - // also have to erase late-bound regions. This is - // because the types that appear in the generator - // interior generally contain "bound regions" to - // represent regions that are part of the suspended - // generator frame. Bound regions are preserved by - // `erase_regions` and so we must also call - // `erase_late_bound_regions`. - let ty_erased = self.tcx.erase_late_bound_regions(&ty::Binder::bind(*ty)); - let ty_erased = self.tcx.erase_regions(&ty_erased); - let eq = ty::TyS::same_type(ty_erased, target_ty_erased); - debug!("maybe_note_obligation_cause_for_async_await: ty_erased={:?} \ - target_ty_erased={:?} eq={:?}", ty_erased, target_ty_erased, eq); - eq - }) - .map(|ty::GeneratorInteriorTypeCause { span, scope_span, .. }| - (span, source_map.span_to_snippet(*span), scope_span)); - debug!("maybe_note_obligation_cause_for_async_await: target_ty={:?} \ - generator_interior_types={:?} target_span={:?}", - target_ty, tables.generator_interior_types, target_span); - if let Some((target_span, Ok(snippet), scope_span)) = target_span { - self.note_obligation_cause_for_async_await( - err, *target_span, scope_span, snippet, generator_did, last_generator, - trait_ref, target_ty, tables, obligation, next_code, - ); - true - } else { - false - } - } - - /// Unconditionally adds the diagnostic note described in - /// `maybe_note_obligation_cause_for_async_await`'s documentation comment. - fn note_obligation_cause_for_async_await( - &self, - err: &mut DiagnosticBuilder<'_>, - target_span: Span, - scope_span: &Option, - snippet: String, - first_generator: DefId, - last_generator: Option, - trait_ref: ty::TraitRef<'_>, - target_ty: Ty<'tcx>, - tables: &ty::TypeckTables<'_>, - obligation: &PredicateObligation<'tcx>, - next_code: Option<&ObligationCauseCode<'tcx>>, - ) { - let source_map = self.tcx.sess.source_map(); - - let is_async_fn = self.tcx.parent(first_generator) - .map(|parent_did| self.tcx.asyncness(parent_did)) - .map(|parent_asyncness| parent_asyncness == hir::IsAsync::Async) - .unwrap_or(false); - let is_async_move = self.tcx.hir().as_local_hir_id(first_generator) - .and_then(|hir_id| self.tcx.hir().maybe_body_owned_by(hir_id)) - .map(|body_id| self.tcx.hir().body(body_id)) - .and_then(|body| body.generator_kind()) - .map(|generator_kind| match generator_kind { - hir::GeneratorKind::Async(..) => true, - _ => false, - }) - .unwrap_or(false); - let await_or_yield = if is_async_fn || is_async_move { "await" } else { "yield" }; - - // Special case the primary error message when send or sync is the trait that was - // not implemented. - let is_send = self.tcx.is_diagnostic_item(sym::send_trait, trait_ref.def_id); - let is_sync = self.tcx.is_diagnostic_item(sym::sync_trait, trait_ref.def_id); - let trait_explanation = if is_send || is_sync { - let (trait_name, trait_verb) = if is_send { - ("`Send`", "sent") - } else { - ("`Sync`", "shared") - }; - - err.clear_code(); - err.set_primary_message( - format!("future cannot be {} between threads safely", trait_verb) - ); - - let original_span = err.span.primary_span().unwrap(); - let mut span = MultiSpan::from_span(original_span); - - let message = if let Some(name) = last_generator - .and_then(|generator_did| self.tcx.parent(generator_did)) - .and_then(|parent_did| self.tcx.hir().as_local_hir_id(parent_did)) - .and_then(|parent_hir_id| self.tcx.hir().opt_name(parent_hir_id)) - { - format!("future returned by `{}` is not {}", name, trait_name) - } else { - format!("future is not {}", trait_name) - }; - - span.push_span_label(original_span, message); - err.set_span(span); - - format!("is not {}", trait_name) - } else { - format!("does not implement `{}`", trait_ref.print_only_trait_path()) - }; - - // Look at the last interior type to get a span for the `.await`. - let await_span = tables.generator_interior_types.iter().map(|i| i.span).last().unwrap(); - let mut span = MultiSpan::from_span(await_span); - span.push_span_label( - await_span, - format!("{} occurs here, with `{}` maybe used later", await_or_yield, snippet)); - - span.push_span_label(target_span, format!("has type `{}`", target_ty)); - - // If available, use the scope span to annotate the drop location. - if let Some(scope_span) = scope_span { - span.push_span_label( - source_map.end_point(*scope_span), - format!("`{}` is later dropped here", snippet), - ); - } - - err.span_note(span, &format!( - "future {} as this value is used across an {}", - trait_explanation, - await_or_yield, - )); - - // Add a note for the item obligation that remains - normally a note pointing to the - // bound that introduced the obligation (e.g. `T: Send`). - debug!("note_obligation_cause_for_async_await: next_code={:?}", next_code); - self.note_obligation_cause_code( - err, - &obligation.predicate, - next_code.unwrap(), - &mut Vec::new(), - ); - } - - fn note_obligation_cause_code(&self, - err: &mut DiagnosticBuilder<'_>, - predicate: &T, - cause_code: &ObligationCauseCode<'tcx>, - obligated_types: &mut Vec<&ty::TyS<'tcx>>) - where T: fmt::Display - { - let tcx = self.tcx; - match *cause_code { - ObligationCauseCode::ExprAssignable | - ObligationCauseCode::MatchExpressionArm { .. } | - ObligationCauseCode::MatchExpressionArmPattern { .. } | - ObligationCauseCode::IfExpression { .. } | - ObligationCauseCode::IfExpressionWithNoElse | - ObligationCauseCode::MainFunctionType | - ObligationCauseCode::StartFunctionType | - ObligationCauseCode::IntrinsicType | - ObligationCauseCode::MethodReceiver | - ObligationCauseCode::ReturnNoExpression | - ObligationCauseCode::MiscObligation => {} - ObligationCauseCode::SliceOrArrayElem => { - err.note("slice and array elements must have `Sized` type"); - } - ObligationCauseCode::TupleElem => { - err.note("only the last element of a tuple may have a dynamically sized type"); - } - ObligationCauseCode::ProjectionWf(data) => { - err.note(&format!( - "required so that the projection `{}` is well-formed", - data, - )); - } - ObligationCauseCode::ReferenceOutlivesReferent(ref_ty) => { - err.note(&format!( - "required so that reference `{}` does not outlive its referent", - ref_ty, - )); - } - ObligationCauseCode::ObjectTypeBound(object_ty, region) => { - err.note(&format!( - "required so that the lifetime bound of `{}` for `{}` is satisfied", - region, - object_ty, - )); - } - ObligationCauseCode::ItemObligation(item_def_id) => { - let item_name = tcx.def_path_str(item_def_id); - let msg = format!("required by `{}`", item_name); - - if let Some(sp) = tcx.hir().span_if_local(item_def_id) { - let sp = tcx.sess.source_map().def_span(sp); - err.span_label(sp, &msg); - } else { - err.note(&msg); - } - } - ObligationCauseCode::BindingObligation(item_def_id, span) => { - let item_name = tcx.def_path_str(item_def_id); - let msg = format!("required by this bound in `{}`", item_name); - if let Some(ident) = tcx.opt_item_name(item_def_id) { - err.span_label(ident.span, ""); - } - if span != DUMMY_SP { - err.span_label(span, &msg); - } else { - err.note(&msg); - } - } - ObligationCauseCode::ObjectCastObligation(object_ty) => { - err.note(&format!("required for the cast to the object type `{}`", - self.ty_to_string(object_ty))); - } - ObligationCauseCode::Coercion { source: _, target } => { - err.note(&format!("required by cast to type `{}`", - self.ty_to_string(target))); - } - ObligationCauseCode::RepeatVec(suggest_const_in_array_repeat_expressions) => { - err.note("the `Copy` trait is required because the \ - repeated element will be copied"); - if suggest_const_in_array_repeat_expressions { - err.note("this array initializer can be evaluated at compile-time, for more \ - information, see issue \ - https://github.com/rust-lang/rust/issues/49147"); - if tcx.sess.opts.unstable_features.is_nightly_build() { - err.help("add `#![feature(const_in_array_repeat_expressions)]` to the \ - crate attributes to enable"); - } - } - } - ObligationCauseCode::VariableType(_) => { - err.note("all local variables must have a statically known size"); - if !self.tcx.features().unsized_locals { - err.help("unsized locals are gated as an unstable feature"); - } - } - ObligationCauseCode::SizedArgumentType => { - err.note("all function arguments must have a statically known size"); - if !self.tcx.features().unsized_locals { - err.help("unsized locals are gated as an unstable feature"); - } - } - ObligationCauseCode::SizedReturnType => { - err.note("the return type of a function must have a \ - statically known size"); - } - ObligationCauseCode::SizedYieldType => { - err.note("the yield type of a generator must have a \ - statically known size"); - } - ObligationCauseCode::AssignmentLhsSized => { - err.note("the left-hand-side of an assignment must have a statically known size"); - } - ObligationCauseCode::TupleInitializerSized => { - err.note("tuples must have a statically known size to be initialized"); - } - ObligationCauseCode::StructInitializerSized => { - err.note("structs must have a statically known size to be initialized"); - } - ObligationCauseCode::FieldSized { adt_kind: ref item, last } => { - match *item { - AdtKind::Struct => { - if last { - err.note("the last field of a packed struct may only have a \ - dynamically sized type if it does not need drop to be run"); - } else { - err.note("only the last field of a struct may have a dynamically \ - sized type"); - } - } - AdtKind::Union => { - err.note("no field of a union may have a dynamically sized type"); - } - AdtKind::Enum => { - err.note("no field of an enum variant may have a dynamically sized type"); - } - } - } - ObligationCauseCode::ConstSized => { - err.note("constant expressions must have a statically known size"); - } - ObligationCauseCode::ConstPatternStructural => { - err.note("constants used for pattern-matching must derive `PartialEq` and `Eq`"); - } - ObligationCauseCode::SharedStatic => { - err.note("shared static variables must have a type that implements `Sync`"); - } - ObligationCauseCode::BuiltinDerivedObligation(ref data) => { - let parent_trait_ref = self.resolve_vars_if_possible(&data.parent_trait_ref); - let ty = parent_trait_ref.skip_binder().self_ty(); - err.note(&format!("required because it appears within the type `{}`", ty)); - obligated_types.push(ty); - - let parent_predicate = parent_trait_ref.to_predicate(); - if !self.is_recursive_obligation(obligated_types, &data.parent_code) { - self.note_obligation_cause_code(err, - &parent_predicate, - &data.parent_code, - obligated_types); - } - } - ObligationCauseCode::ImplDerivedObligation(ref data) => { - let parent_trait_ref = self.resolve_vars_if_possible(&data.parent_trait_ref); - err.note( - &format!("required because of the requirements on the impl of `{}` for `{}`", - parent_trait_ref.print_only_trait_path(), - parent_trait_ref.skip_binder().self_ty())); - let parent_predicate = parent_trait_ref.to_predicate(); - self.note_obligation_cause_code(err, - &parent_predicate, - &data.parent_code, - obligated_types); - } - ObligationCauseCode::CompareImplMethodObligation { .. } => { - err.note( - &format!("the requirement `{}` appears on the impl method \ - but not on the corresponding trait method", - predicate)); - } - ObligationCauseCode::ReturnType | - ObligationCauseCode::ReturnValue(_) | - ObligationCauseCode::BlockTailExpression(_) => (), - ObligationCauseCode::TrivialBound => { - err.help("see issue #48214"); - if tcx.sess.opts.unstable_features.is_nightly_build() { - err.help("add `#![feature(trivial_bounds)]` to the \ - crate attributes to enable", - ); - } - } - ObligationCauseCode::AssocTypeBound(ref data) => { - err.span_label(data.original, "associated type defined here"); - if let Some(sp) = data.impl_span { - err.span_label(sp, "in this `impl` item"); - } - for sp in &data.bounds { - err.span_label(*sp, "restricted in this bound"); - } - } - } - } - - fn suggest_new_overflow_limit(&self, err: &mut DiagnosticBuilder<'_>) { - let current_limit = self.tcx.sess.recursion_limit.get(); - let suggested_limit = current_limit * 2; - err.help(&format!("consider adding a `#![recursion_limit=\"{}\"]` attribute to your crate", - suggested_limit)); - } - - fn is_recursive_obligation(&self, - obligated_types: &mut Vec<&ty::TyS<'tcx>>, - cause_code: &ObligationCauseCode<'tcx>) -> bool { - if let ObligationCauseCode::BuiltinDerivedObligation(ref data) = cause_code { - let parent_trait_ref = self.resolve_vars_if_possible(&data.parent_trait_ref); - - if obligated_types.iter().any(|ot| ot == &parent_trait_ref.skip_binder().self_ty()) { - return true; - } - } - false - } -} - -/// Summarizes information -#[derive(Clone)] -pub enum ArgKind { - /// An argument of non-tuple type. Parameters are (name, ty) - Arg(String, String), - - /// An argument of tuple type. For a "found" argument, the span is - /// the locationo in the source of the pattern. For a "expected" - /// argument, it will be None. The vector is a list of (name, ty) - /// strings for the components of the tuple. - Tuple(Option, Vec<(String, String)>), -} - -impl ArgKind { - fn empty() -> ArgKind { - ArgKind::Arg("_".to_owned(), "_".to_owned()) - } - - /// Creates an `ArgKind` from the expected type of an - /// argument. It has no name (`_`) and an optional source span. - pub fn from_expected_ty(t: Ty<'_>, span: Option) -> ArgKind { - match t.kind { - ty::Tuple(ref tys) => ArgKind::Tuple( - span, - tys.iter() - .map(|ty| ("_".to_owned(), ty.to_string())) - .collect::>() - ), - _ => ArgKind::Arg("_".to_owned(), t.to_string()), - } - } -} - -/// Suggest restricting a type param with a new bound. -pub fn suggest_constraining_type_param( - generics: &hir::Generics, - err: &mut DiagnosticBuilder<'_>, - param_name: &str, - constraint: &str, - source_map: &SourceMap, - span: Span, -) -> bool { - let restrict_msg = "consider further restricting this bound"; - if let Some(param) = generics.params.iter().filter(|p| { - p.name.ident().as_str() == param_name - }).next() { - if param_name.starts_with("impl ") { - // `impl Trait` in argument: - // `fn foo(x: impl Trait) {}` → `fn foo(t: impl Trait + Trait2) {}` - err.span_suggestion( - param.span, - restrict_msg, - // `impl CurrentTrait + MissingTrait` - format!("{} + {}", param_name, constraint), - Applicability::MachineApplicable, - ); - } else if generics.where_clause.predicates.is_empty() && - param.bounds.is_empty() - { - // If there are no bounds whatsoever, suggest adding a constraint - // to the type parameter: - // `fn foo(t: T) {}` → `fn foo(t: T) {}` - err.span_suggestion( - param.span, - "consider restricting this bound", - format!("{}: {}", param_name, constraint), - Applicability::MachineApplicable, - ); - } else if !generics.where_clause.predicates.is_empty() { - // There is a `where` clause, so suggest expanding it: - // `fn foo(t: T) where T: Debug {}` → - // `fn foo(t: T) where T: Debug, T: Trait {}` - err.span_suggestion( - generics.where_clause.span().unwrap().shrink_to_hi(), - &format!("consider further restricting type parameter `{}`", param_name), - format!(", {}: {}", param_name, constraint), - Applicability::MachineApplicable, - ); - } else { - // If there is no `where` clause lean towards constraining to the - // type parameter: - // `fn foo(t: T, x: X) {}` → `fn foo(t: T) {}` - // `fn foo(t: T) {}` → `fn foo(t: T) {}` - let sp = param.span.with_hi(span.hi()); - let span = source_map.span_through_char(sp, ':'); - if sp != param.span && sp != span { - // Only suggest if we have high certainty that the span - // covers the colon in `foo`. - err.span_suggestion( - span, - restrict_msg, - format!("{}: {} + ", param_name, constraint), - Applicability::MachineApplicable, - ); - } else { - err.span_label( - param.span, - &format!("consider adding a `where {}: {}` bound", param_name, constraint), - ); - } - } - return true; - } - false -} diff --git a/src/librustc/traits/error_reporting/mod.rs b/src/librustc/traits/error_reporting/mod.rs new file mode 100644 index 0000000000..28084c9d4a --- /dev/null +++ b/src/librustc/traits/error_reporting/mod.rs @@ -0,0 +1,1427 @@ +pub mod on_unimplemented; +pub mod suggestions; + +use super::{ + ConstEvalFailure, EvaluationResult, FulfillmentError, FulfillmentErrorCode, + MismatchedProjectionTypes, ObjectSafetyViolation, Obligation, ObligationCause, + ObligationCauseCode, OnUnimplementedDirective, OnUnimplementedNote, + OutputTypeParameterMismatch, Overflow, PredicateObligation, SelectionContext, SelectionError, + TraitNotObjectSafe, +}; + +use crate::infer::error_reporting::{TyCategory, TypeAnnotationNeeded as ErrorCode}; +use crate::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; +use crate::infer::{self, InferCtxt}; +use crate::mir::interpret::ErrorHandled; +use crate::session::DiagnosticMessageId; +use crate::traits::object_safety_violations; +use crate::ty::error::ExpectedFound; +use crate::ty::fast_reject; +use crate::ty::fold::TypeFolder; +use crate::ty::SubtypePredicate; +use crate::ty::{ + self, AdtKind, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness, +}; + +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder}; +use rustc_hir as hir; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; +use rustc_span::source_map::SourceMap; +use rustc_span::{ExpnKind, Span, DUMMY_SP}; +use std::fmt; +use syntax::ast; + +impl<'a, 'tcx> InferCtxt<'a, 'tcx> { + pub fn report_fulfillment_errors( + &self, + errors: &[FulfillmentError<'tcx>], + body_id: Option, + fallback_has_occurred: bool, + ) { + #[derive(Debug)] + struct ErrorDescriptor<'tcx> { + predicate: ty::Predicate<'tcx>, + index: Option, // None if this is an old error + } + + let mut error_map: FxHashMap<_, Vec<_>> = self + .reported_trait_errors + .borrow() + .iter() + .map(|(&span, predicates)| { + ( + span, + predicates + .iter() + .map(|&predicate| ErrorDescriptor { predicate, index: None }) + .collect(), + ) + }) + .collect(); + + for (index, error) in errors.iter().enumerate() { + // We want to ignore desugarings here: spans are equivalent even + // if one is the result of a desugaring and the other is not. + let mut span = error.obligation.cause.span; + let expn_data = span.ctxt().outer_expn_data(); + if let ExpnKind::Desugaring(_) = expn_data.kind { + span = expn_data.call_site; + } + + error_map.entry(span).or_default().push(ErrorDescriptor { + predicate: error.obligation.predicate, + index: Some(index), + }); + + self.reported_trait_errors + .borrow_mut() + .entry(span) + .or_default() + .push(error.obligation.predicate.clone()); + } + + // We do this in 2 passes because we want to display errors in order, though + // maybe it *is* better to sort errors by span or something. + let mut is_suppressed = vec![false; errors.len()]; + for (_, error_set) in error_map.iter() { + // We want to suppress "duplicate" errors with the same span. + for error in error_set { + if let Some(index) = error.index { + // Suppress errors that are either: + // 1) strictly implied by another error. + // 2) implied by an error with a smaller index. + for error2 in error_set { + if error2.index.map_or(false, |index2| is_suppressed[index2]) { + // Avoid errors being suppressed by already-suppressed + // errors, to prevent all errors from being suppressed + // at once. + continue; + } + + if self.error_implies(&error2.predicate, &error.predicate) + && !(error2.index >= error.index + && self.error_implies(&error.predicate, &error2.predicate)) + { + info!("skipping {:?} (implied by {:?})", error, error2); + is_suppressed[index] = true; + break; + } + } + } + } + } + + for (error, suppressed) in errors.iter().zip(is_suppressed) { + if !suppressed { + self.report_fulfillment_error(error, body_id, fallback_has_occurred); + } + } + } + + // returns if `cond` not occurring implies that `error` does not occur - i.e., that + // `error` occurring implies that `cond` occurs. + fn error_implies(&self, cond: &ty::Predicate<'tcx>, error: &ty::Predicate<'tcx>) -> bool { + if cond == error { + return true; + } + + let (cond, error) = match (cond, error) { + (&ty::Predicate::Trait(..), &ty::Predicate::Trait(ref error, _)) => (cond, error), + _ => { + // FIXME: make this work in other cases too. + return false; + } + }; + + for implication in super::elaborate_predicates(self.tcx, vec![*cond]) { + if let ty::Predicate::Trait(implication, _) = implication { + let error = error.to_poly_trait_ref(); + let implication = implication.to_poly_trait_ref(); + // FIXME: I'm just not taking associated types at all here. + // Eventually I'll need to implement param-env-aware + // `Γ₁ ⊦ φ₁ => Γ₂ ⊦ φ₂` logic. + let param_env = ty::ParamEnv::empty(); + if self.can_sub(param_env, error, implication).is_ok() { + debug!("error_implies: {:?} -> {:?} -> {:?}", cond, error, implication); + return true; + } + } + } + + false + } + + fn report_fulfillment_error( + &self, + error: &FulfillmentError<'tcx>, + body_id: Option, + fallback_has_occurred: bool, + ) { + debug!("report_fulfillment_error({:?})", error); + match error.code { + FulfillmentErrorCode::CodeSelectionError(ref selection_error) => { + self.report_selection_error( + &error.obligation, + selection_error, + fallback_has_occurred, + error.points_at_arg_span, + ); + } + FulfillmentErrorCode::CodeProjectionError(ref e) => { + self.report_projection_error(&error.obligation, e); + } + FulfillmentErrorCode::CodeAmbiguity => { + self.maybe_report_ambiguity(&error.obligation, body_id); + } + FulfillmentErrorCode::CodeSubtypeError(ref expected_found, ref err) => { + self.report_mismatched_types( + &error.obligation.cause, + expected_found.expected, + expected_found.found, + err.clone(), + ) + .emit(); + } + } + } + + fn report_projection_error( + &self, + obligation: &PredicateObligation<'tcx>, + error: &MismatchedProjectionTypes<'tcx>, + ) { + let predicate = self.resolve_vars_if_possible(&obligation.predicate); + + if predicate.references_error() { + return; + } + + self.probe(|_| { + let err_buf; + let mut err = &error.err; + let mut values = None; + + // try to find the mismatched types to report the error with. + // + // this can fail if the problem was higher-ranked, in which + // cause I have no idea for a good error message. + if let ty::Predicate::Projection(ref data) = predicate { + let mut selcx = SelectionContext::new(self); + let (data, _) = self.replace_bound_vars_with_fresh_vars( + obligation.cause.span, + infer::LateBoundRegionConversionTime::HigherRankedType, + data, + ); + let mut obligations = vec![]; + let normalized_ty = super::normalize_projection_type( + &mut selcx, + obligation.param_env, + data.projection_ty, + obligation.cause.clone(), + 0, + &mut obligations, + ); + + debug!( + "report_projection_error obligation.cause={:?} obligation.param_env={:?}", + obligation.cause, obligation.param_env + ); + + debug!( + "report_projection_error normalized_ty={:?} data.ty={:?}", + normalized_ty, data.ty + ); + + let is_normalized_ty_expected = match &obligation.cause.code { + ObligationCauseCode::ItemObligation(_) + | ObligationCauseCode::BindingObligation(_, _) + | ObligationCauseCode::ObjectCastObligation(_) => false, + _ => true, + }; + + if let Err(error) = self.at(&obligation.cause, obligation.param_env).eq_exp( + is_normalized_ty_expected, + normalized_ty, + data.ty, + ) { + values = Some(infer::ValuePairs::Types(ExpectedFound::new( + is_normalized_ty_expected, + normalized_ty, + data.ty, + ))); + + err_buf = error; + err = &err_buf; + } + } + + let msg = format!("type mismatch resolving `{}`", predicate); + let error_id = (DiagnosticMessageId::ErrorId(271), Some(obligation.cause.span), msg); + let fresh = self.tcx.sess.one_time_diagnostics.borrow_mut().insert(error_id); + if fresh { + let mut diag = struct_span_err!( + self.tcx.sess, + obligation.cause.span, + E0271, + "type mismatch resolving `{}`", + predicate + ); + self.note_type_err(&mut diag, &obligation.cause, None, values, err); + self.note_obligation_cause(&mut diag, obligation); + diag.emit(); + } + }); + } + + fn fuzzy_match_tys(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> bool { + /// returns the fuzzy category of a given type, or None + /// if the type can be equated to any type. + fn type_category(t: Ty<'_>) -> Option { + match t.kind { + ty::Bool => Some(0), + ty::Char => Some(1), + ty::Str => Some(2), + ty::Int(..) | ty::Uint(..) | ty::Infer(ty::IntVar(..)) => Some(3), + ty::Float(..) | ty::Infer(ty::FloatVar(..)) => Some(4), + ty::Ref(..) | ty::RawPtr(..) => Some(5), + ty::Array(..) | ty::Slice(..) => Some(6), + ty::FnDef(..) | ty::FnPtr(..) => Some(7), + ty::Dynamic(..) => Some(8), + ty::Closure(..) => Some(9), + ty::Tuple(..) => Some(10), + ty::Projection(..) => Some(11), + ty::Param(..) => Some(12), + ty::Opaque(..) => Some(13), + ty::Never => Some(14), + ty::Adt(adt, ..) => match adt.adt_kind() { + AdtKind::Struct => Some(15), + AdtKind::Union => Some(16), + AdtKind::Enum => Some(17), + }, + ty::Generator(..) => Some(18), + ty::Foreign(..) => Some(19), + ty::GeneratorWitness(..) => Some(20), + ty::Placeholder(..) | ty::Bound(..) | ty::Infer(..) | ty::Error => None, + ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"), + } + } + + match (type_category(a), type_category(b)) { + (Some(cat_a), Some(cat_b)) => match (&a.kind, &b.kind) { + (&ty::Adt(def_a, _), &ty::Adt(def_b, _)) => def_a == def_b, + _ => cat_a == cat_b, + }, + // infer and error can be equated to all types + _ => true, + } + } + + fn describe_generator(&self, body_id: hir::BodyId) -> Option<&'static str> { + self.tcx.hir().body(body_id).generator_kind.map(|gen_kind| match gen_kind { + hir::GeneratorKind::Gen => "a generator", + hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Block) => "an async block", + hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Fn) => "an async function", + hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Closure) => "an async closure", + }) + } + + fn find_similar_impl_candidates( + &self, + trait_ref: ty::PolyTraitRef<'tcx>, + ) -> Vec> { + let simp = fast_reject::simplify_type(self.tcx, trait_ref.skip_binder().self_ty(), true); + let all_impls = self.tcx.all_impls(trait_ref.def_id()); + + match simp { + Some(simp) => all_impls + .iter() + .filter_map(|&def_id| { + let imp = self.tcx.impl_trait_ref(def_id).unwrap(); + let imp_simp = fast_reject::simplify_type(self.tcx, imp.self_ty(), true); + if let Some(imp_simp) = imp_simp { + if simp != imp_simp { + return None; + } + } + + Some(imp) + }) + .collect(), + None => { + all_impls.iter().map(|&def_id| self.tcx.impl_trait_ref(def_id).unwrap()).collect() + } + } + } + + fn report_similar_impl_candidates( + &self, + impl_candidates: Vec>, + err: &mut DiagnosticBuilder<'_>, + ) { + if impl_candidates.is_empty() { + return; + } + + let len = impl_candidates.len(); + let end = if impl_candidates.len() <= 5 { impl_candidates.len() } else { 4 }; + + let normalize = |candidate| { + self.tcx.infer_ctxt().enter(|ref infcx| { + let normalized = infcx + .at(&ObligationCause::dummy(), ty::ParamEnv::empty()) + .normalize(candidate) + .ok(); + match normalized { + Some(normalized) => format!("\n {:?}", normalized.value), + None => format!("\n {:?}", candidate), + } + }) + }; + + // Sort impl candidates so that ordering is consistent for UI tests. + let mut normalized_impl_candidates = + impl_candidates.iter().map(normalize).collect::>(); + + // Sort before taking the `..end` range, + // because the ordering of `impl_candidates` may not be deterministic: + // https://github.com/rust-lang/rust/pull/57475#issuecomment-455519507 + normalized_impl_candidates.sort(); + + err.help(&format!( + "the following implementations were found:{}{}", + normalized_impl_candidates[..end].join(""), + if len > 5 { format!("\nand {} others", len - 4) } else { String::new() } + )); + } + + /// Reports that an overflow has occurred and halts compilation. We + /// halt compilation unconditionally because it is important that + /// overflows never be masked -- they basically represent computations + /// whose result could not be truly determined and thus we can't say + /// if the program type checks or not -- and they are unusual + /// occurrences in any case. + pub fn report_overflow_error( + &self, + obligation: &Obligation<'tcx, T>, + suggest_increasing_limit: bool, + ) -> ! + where + T: fmt::Display + TypeFoldable<'tcx>, + { + let predicate = self.resolve_vars_if_possible(&obligation.predicate); + let mut err = struct_span_err!( + self.tcx.sess, + obligation.cause.span, + E0275, + "overflow evaluating the requirement `{}`", + predicate + ); + + if suggest_increasing_limit { + self.suggest_new_overflow_limit(&mut err); + } + + self.note_obligation_cause_code( + &mut err, + &obligation.predicate, + &obligation.cause.code, + &mut vec![], + ); + + err.emit(); + self.tcx.sess.abort_if_errors(); + bug!(); + } + + /// Reports that a cycle was detected which led to overflow and halts + /// compilation. This is equivalent to `report_overflow_error` except + /// that we can give a more helpful error message (and, in particular, + /// we do not suggest increasing the overflow limit, which is not + /// going to help). + pub fn report_overflow_error_cycle(&self, cycle: &[PredicateObligation<'tcx>]) -> ! { + let cycle = self.resolve_vars_if_possible(&cycle.to_owned()); + assert!(cycle.len() > 0); + + debug!("report_overflow_error_cycle: cycle={:?}", cycle); + + self.report_overflow_error(&cycle[0], false); + } + + pub fn report_extra_impl_obligation( + &self, + error_span: Span, + item_name: ast::Name, + _impl_item_def_id: DefId, + trait_item_def_id: DefId, + requirement: &dyn fmt::Display, + ) -> DiagnosticBuilder<'tcx> { + let msg = "impl has stricter requirements than trait"; + let sp = self.tcx.sess.source_map().def_span(error_span); + + let mut err = struct_span_err!(self.tcx.sess, sp, E0276, "{}", msg); + + if let Some(trait_item_span) = self.tcx.hir().span_if_local(trait_item_def_id) { + let span = self.tcx.sess.source_map().def_span(trait_item_span); + err.span_label(span, format!("definition of `{}` from trait", item_name)); + } + + err.span_label(sp, format!("impl has extra requirement {}", requirement)); + + err + } + + /// Gets the parent trait chain start + fn get_parent_trait_ref( + &self, + code: &ObligationCauseCode<'tcx>, + ) -> Option<(String, Option)> { + match code { + &ObligationCauseCode::BuiltinDerivedObligation(ref data) => { + let parent_trait_ref = self.resolve_vars_if_possible(&data.parent_trait_ref); + match self.get_parent_trait_ref(&data.parent_code) { + Some(t) => Some(t), + None => { + let ty = parent_trait_ref.skip_binder().self_ty(); + let span = + TyCategory::from_ty(ty).map(|(_, def_id)| self.tcx.def_span(def_id)); + Some((ty.to_string(), span)) + } + } + } + _ => None, + } + } + + pub fn report_selection_error( + &self, + obligation: &PredicateObligation<'tcx>, + error: &SelectionError<'tcx>, + fallback_has_occurred: bool, + points_at_arg: bool, + ) { + let tcx = self.tcx; + let span = obligation.cause.span; + + let mut err = match *error { + SelectionError::Unimplemented => { + if let ObligationCauseCode::CompareImplMethodObligation { + item_name, + impl_item_def_id, + trait_item_def_id, + } + | ObligationCauseCode::CompareImplTypeObligation { + item_name, + impl_item_def_id, + trait_item_def_id, + } = obligation.cause.code + { + self.report_extra_impl_obligation( + span, + item_name, + impl_item_def_id, + trait_item_def_id, + &format!("`{}`", obligation.predicate), + ) + .emit(); + return; + } + match obligation.predicate { + ty::Predicate::Trait(ref trait_predicate, _) => { + let trait_predicate = self.resolve_vars_if_possible(trait_predicate); + + if self.tcx.sess.has_errors() && trait_predicate.references_error() { + return; + } + let trait_ref = trait_predicate.to_poly_trait_ref(); + let (post_message, pre_message, type_def) = self + .get_parent_trait_ref(&obligation.cause.code) + .map(|(t, s)| { + ( + format!(" in `{}`", t), + format!("within `{}`, ", t), + s.map(|s| (format!("within this `{}`", t), s)), + ) + }) + .unwrap_or_default(); + + let OnUnimplementedNote { message, label, note, enclosing_scope } = + self.on_unimplemented_note(trait_ref, obligation); + let have_alt_message = message.is_some() || label.is_some(); + let is_try = self + .tcx + .sess + .source_map() + .span_to_snippet(span) + .map(|s| &s == "?") + .unwrap_or(false); + let is_from = format!("{}", trait_ref.print_only_trait_path()) + .starts_with("std::convert::From<"); + let (message, note) = if is_try && is_from { + ( + Some(format!( + "`?` couldn't convert the error to `{}`", + trait_ref.self_ty(), + )), + Some( + "the question mark operation (`?`) implicitly performs a \ + conversion on the error value using the `From` trait" + .to_owned(), + ), + ) + } else { + (message, note) + }; + + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0277, + "{}", + message.unwrap_or_else(|| format!( + "the trait bound `{}` is not satisfied{}", + trait_ref.without_const().to_predicate(), + post_message, + )) + ); + + let explanation = + if obligation.cause.code == ObligationCauseCode::MainFunctionType { + "consider using `()`, or a `Result`".to_owned() + } else { + format!( + "{}the trait `{}` is not implemented for `{}`", + pre_message, + trait_ref.print_only_trait_path(), + trait_ref.self_ty(), + ) + }; + + if self.suggest_add_reference_to_arg( + &obligation, + &mut err, + &trait_ref, + points_at_arg, + have_alt_message, + ) { + self.note_obligation_cause(&mut err, obligation); + err.emit(); + return; + } + if let Some(ref s) = label { + // If it has a custom `#[rustc_on_unimplemented]` + // error message, let's display it as the label! + err.span_label(span, s.as_str()); + err.help(&explanation); + } else { + err.span_label(span, explanation); + } + if let Some((msg, span)) = type_def { + err.span_label(span, &msg); + } + if let Some(ref s) = note { + // If it has a custom `#[rustc_on_unimplemented]` note, let's display it + err.note(s.as_str()); + } + if let Some(ref s) = enclosing_scope { + let enclosing_scope_span = tcx.def_span( + tcx.hir() + .opt_local_def_id(obligation.cause.body_id) + .unwrap_or_else(|| { + tcx.hir().body_owner_def_id(hir::BodyId { + hir_id: obligation.cause.body_id, + }) + }), + ); + + err.span_label(enclosing_scope_span, s.as_str()); + } + + self.suggest_borrow_on_unsized_slice(&obligation.cause.code, &mut err); + self.suggest_fn_call(&obligation, &mut err, &trait_ref, points_at_arg); + self.suggest_remove_reference(&obligation, &mut err, &trait_ref); + self.suggest_semicolon_removal(&obligation, &mut err, span, &trait_ref); + self.note_version_mismatch(&mut err, &trait_ref); + if self.suggest_impl_trait(&mut err, span, &obligation, &trait_ref) { + err.emit(); + return; + } + + // Try to report a help message + if !trait_ref.has_infer_types() + && self.predicate_can_apply(obligation.param_env, trait_ref) + { + // If a where-clause may be useful, remind the + // user that they can add it. + // + // don't display an on-unimplemented note, as + // these notes will often be of the form + // "the type `T` can't be frobnicated" + // which is somewhat confusing. + self.suggest_restricting_param_bound( + &mut err, + &trait_ref, + obligation.cause.body_id, + ); + } else { + if !have_alt_message { + // Can't show anything else useful, try to find similar impls. + let impl_candidates = self.find_similar_impl_candidates(trait_ref); + self.report_similar_impl_candidates(impl_candidates, &mut err); + } + self.suggest_change_mut( + &obligation, + &mut err, + &trait_ref, + points_at_arg, + ); + } + + // If this error is due to `!: Trait` not implemented but `(): Trait` is + // implemented, and fallback has occurred, then it could be due to a + // variable that used to fallback to `()` now falling back to `!`. Issue a + // note informing about the change in behaviour. + if trait_predicate.skip_binder().self_ty().is_never() + && fallback_has_occurred + { + let predicate = trait_predicate.map_bound(|mut trait_pred| { + trait_pred.trait_ref.substs = self.tcx.mk_substs_trait( + self.tcx.mk_unit(), + &trait_pred.trait_ref.substs[1..], + ); + trait_pred + }); + let unit_obligation = Obligation { + predicate: ty::Predicate::Trait( + predicate, + ast::Constness::NotConst, + ), + ..obligation.clone() + }; + if self.predicate_may_hold(&unit_obligation) { + err.note( + "the trait is implemented for `()`. \ + Possibly this error has been caused by changes to \ + Rust's type-inference algorithm \ + (see: https://github.com/rust-lang/rust/issues/48950 \ + for more info). Consider whether you meant to use the \ + type `()` here instead.", + ); + } + } + + err + } + + ty::Predicate::Subtype(ref predicate) => { + // Errors for Subtype predicates show up as + // `FulfillmentErrorCode::CodeSubtypeError`, + // not selection error. + span_bug!(span, "subtype requirement gave wrong error: `{:?}`", predicate) + } + + ty::Predicate::RegionOutlives(ref predicate) => { + let predicate = self.resolve_vars_if_possible(predicate); + let err = self + .region_outlives_predicate(&obligation.cause, &predicate) + .err() + .unwrap(); + struct_span_err!( + self.tcx.sess, + span, + E0279, + "the requirement `{}` is not satisfied (`{}`)", + predicate, + err, + ) + } + + ty::Predicate::Projection(..) | ty::Predicate::TypeOutlives(..) => { + let predicate = self.resolve_vars_if_possible(&obligation.predicate); + struct_span_err!( + self.tcx.sess, + span, + E0280, + "the requirement `{}` is not satisfied", + predicate + ) + } + + ty::Predicate::ObjectSafe(trait_def_id) => { + let violations = object_safety_violations(self.tcx, trait_def_id); + report_object_safety_error(self.tcx, span, trait_def_id, violations) + } + + ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => { + let found_kind = self.closure_kind(closure_def_id, closure_substs).unwrap(); + let closure_span = self + .tcx + .sess + .source_map() + .def_span(self.tcx.hir().span_if_local(closure_def_id).unwrap()); + let hir_id = self.tcx.hir().as_local_hir_id(closure_def_id).unwrap(); + let mut err = struct_span_err!( + self.tcx.sess, + closure_span, + E0525, + "expected a closure that implements the `{}` trait, \ + but this closure only implements `{}`", + kind, + found_kind + ); + + err.span_label( + closure_span, + format!("this closure implements `{}`, not `{}`", found_kind, kind), + ); + err.span_label( + obligation.cause.span, + format!("the requirement to implement `{}` derives from here", kind), + ); + + // Additional context information explaining why the closure only implements + // a particular trait. + if let Some(tables) = self.in_progress_tables { + let tables = tables.borrow(); + match (found_kind, tables.closure_kind_origins().get(hir_id)) { + (ty::ClosureKind::FnOnce, Some((span, name))) => { + err.span_label( + *span, + format!( + "closure is `FnOnce` because it moves the \ + variable `{}` out of its environment", + name + ), + ); + } + (ty::ClosureKind::FnMut, Some((span, name))) => { + err.span_label( + *span, + format!( + "closure is `FnMut` because it mutates the \ + variable `{}` here", + name + ), + ); + } + _ => {} + } + } + + err.emit(); + return; + } + + ty::Predicate::WellFormed(ty) => { + if !self.tcx.sess.opts.debugging_opts.chalk { + // WF predicates cannot themselves make + // errors. They can only block due to + // ambiguity; otherwise, they always + // degenerate into other obligations + // (which may fail). + span_bug!(span, "WF predicate not satisfied for {:?}", ty); + } else { + // FIXME: we'll need a better message which takes into account + // which bounds actually failed to hold. + self.tcx.sess.struct_span_err( + span, + &format!("the type `{}` is not well-formed (chalk)", ty), + ) + } + } + + ty::Predicate::ConstEvaluatable(..) => { + // Errors for `ConstEvaluatable` predicates show up as + // `SelectionError::ConstEvalFailure`, + // not `Unimplemented`. + span_bug!( + span, + "const-evaluatable requirement gave wrong error: `{:?}`", + obligation + ) + } + } + } + + OutputTypeParameterMismatch(ref found_trait_ref, ref expected_trait_ref, _) => { + let found_trait_ref = self.resolve_vars_if_possible(&*found_trait_ref); + let expected_trait_ref = self.resolve_vars_if_possible(&*expected_trait_ref); + + if expected_trait_ref.self_ty().references_error() { + return; + } + + let found_trait_ty = found_trait_ref.self_ty(); + + let found_did = match found_trait_ty.kind { + ty::Closure(did, _) | ty::Foreign(did) | ty::FnDef(did, _) => Some(did), + ty::Adt(def, _) => Some(def.did), + _ => None, + }; + + let found_span = found_did + .and_then(|did| self.tcx.hir().span_if_local(did)) + .map(|sp| self.tcx.sess.source_map().def_span(sp)); // the sp could be an fn def + + if self.reported_closure_mismatch.borrow().contains(&(span, found_span)) { + // We check closures twice, with obligations flowing in different directions, + // but we want to complain about them only once. + return; + } + + self.reported_closure_mismatch.borrow_mut().insert((span, found_span)); + + let found = match found_trait_ref.skip_binder().substs.type_at(1).kind { + ty::Tuple(ref tys) => vec![ArgKind::empty(); tys.len()], + _ => vec![ArgKind::empty()], + }; + + let expected_ty = expected_trait_ref.skip_binder().substs.type_at(1); + let expected = match expected_ty.kind { + ty::Tuple(ref tys) => tys + .iter() + .map(|t| ArgKind::from_expected_ty(t.expect_ty(), Some(span))) + .collect(), + _ => vec![ArgKind::Arg("_".to_owned(), expected_ty.to_string())], + }; + + if found.len() == expected.len() { + self.report_closure_arg_mismatch( + span, + found_span, + found_trait_ref, + expected_trait_ref, + ) + } else { + let (closure_span, found) = found_did + .and_then(|did| self.tcx.hir().get_if_local(did)) + .map(|node| { + let (found_span, found) = self.get_fn_like_arguments(node); + (Some(found_span), found) + }) + .unwrap_or((found_span, found)); + + self.report_arg_count_mismatch( + span, + closure_span, + expected, + found, + found_trait_ty.is_closure(), + ) + } + } + + TraitNotObjectSafe(did) => { + let violations = object_safety_violations(self.tcx, did); + report_object_safety_error(self.tcx, span, did, violations) + } + + ConstEvalFailure(ErrorHandled::TooGeneric) => { + // In this instance, we have a const expression containing an unevaluated + // generic parameter. We have no idea whether this expression is valid or + // not (e.g. it might result in an error), but we don't want to just assume + // that it's okay, because that might result in post-monomorphisation time + // errors. The onus is really on the caller to provide values that it can + // prove are well-formed. + let mut err = self + .tcx + .sess + .struct_span_err(span, "constant expression depends on a generic parameter"); + // FIXME(const_generics): we should suggest to the user how they can resolve this + // issue. However, this is currently not actually possible + // (see https://github.com/rust-lang/rust/issues/66962#issuecomment-575907083). + err.note("this may fail depending on what value the parameter takes"); + err + } + + // Already reported in the query. + ConstEvalFailure(ErrorHandled::Reported) => { + self.tcx + .sess + .delay_span_bug(span, &format!("constant in type had an ignored error")); + return; + } + + Overflow => { + bug!("overflow should be handled before the `report_selection_error` path"); + } + }; + + self.note_obligation_cause(&mut err, obligation); + self.point_at_returns_when_relevant(&mut err, &obligation); + + err.emit(); + } + + /// If the `Self` type of the unsatisfied trait `trait_ref` implements a trait + /// with the same path as `trait_ref`, a help message about + /// a probable version mismatch is added to `err` + fn note_version_mismatch( + &self, + err: &mut DiagnosticBuilder<'_>, + trait_ref: &ty::PolyTraitRef<'tcx>, + ) { + let get_trait_impl = |trait_def_id| { + let mut trait_impl = None; + self.tcx.for_each_relevant_impl(trait_def_id, trait_ref.self_ty(), |impl_def_id| { + if trait_impl.is_none() { + trait_impl = Some(impl_def_id); + } + }); + trait_impl + }; + let required_trait_path = self.tcx.def_path_str(trait_ref.def_id()); + let all_traits = self.tcx.all_traits(LOCAL_CRATE); + let traits_with_same_path: std::collections::BTreeSet<_> = all_traits + .iter() + .filter(|trait_def_id| **trait_def_id != trait_ref.def_id()) + .filter(|trait_def_id| self.tcx.def_path_str(**trait_def_id) == required_trait_path) + .collect(); + for trait_with_same_path in traits_with_same_path { + if let Some(impl_def_id) = get_trait_impl(*trait_with_same_path) { + let impl_span = self.tcx.def_span(impl_def_id); + err.span_help(impl_span, "trait impl with same name found"); + let trait_crate = self.tcx.crate_name(trait_with_same_path.krate); + let crate_msg = format!( + "perhaps two different versions of crate `{}` are being used?", + trait_crate + ); + err.note(&crate_msg); + } + } + } + + fn mk_obligation_for_def_id( + &self, + def_id: DefId, + output_ty: Ty<'tcx>, + cause: ObligationCause<'tcx>, + param_env: ty::ParamEnv<'tcx>, + ) -> PredicateObligation<'tcx> { + let new_trait_ref = + ty::TraitRef { def_id, substs: self.tcx.mk_substs_trait(output_ty, &[]) }; + Obligation::new(cause, param_env, new_trait_ref.without_const().to_predicate()) + } +} + +pub fn recursive_type_with_infinite_size_error( + tcx: TyCtxt<'tcx>, + type_def_id: DefId, +) -> DiagnosticBuilder<'tcx> { + assert!(type_def_id.is_local()); + let span = tcx.hir().span_if_local(type_def_id).unwrap(); + let span = tcx.sess.source_map().def_span(span); + let mut err = struct_span_err!( + tcx.sess, + span, + E0072, + "recursive type `{}` has infinite size", + tcx.def_path_str(type_def_id) + ); + err.span_label(span, "recursive type has infinite size"); + err.help(&format!( + "insert indirection (e.g., a `Box`, `Rc`, or `&`) \ + at some point to make `{}` representable", + tcx.def_path_str(type_def_id) + )); + err +} + +pub fn report_object_safety_error( + tcx: TyCtxt<'tcx>, + span: Span, + trait_def_id: DefId, + violations: Vec, +) -> DiagnosticBuilder<'tcx> { + let trait_str = tcx.def_path_str(trait_def_id); + let span = tcx.sess.source_map().def_span(span); + let mut err = struct_span_err!( + tcx.sess, + span, + E0038, + "the trait `{}` cannot be made into an object", + trait_str + ); + err.span_label(span, format!("the trait `{}` cannot be made into an object", trait_str)); + + let mut reported_violations = FxHashSet::default(); + for violation in violations { + if reported_violations.insert(violation.clone()) { + match violation.span() { + Some(span) => err.span_label(span, violation.error_msg()), + None => err.note(&violation.error_msg()), + }; + } + } + + if tcx.sess.trait_methods_not_found.borrow().contains(&span) { + // Avoid emitting error caused by non-existing method (#58734) + err.cancel(); + } + + err +} + +impl<'a, 'tcx> InferCtxt<'a, 'tcx> { + fn maybe_report_ambiguity( + &self, + obligation: &PredicateObligation<'tcx>, + body_id: Option, + ) { + // Unable to successfully determine, probably means + // insufficient type information, but could mean + // ambiguous impls. The latter *ought* to be a + // coherence violation, so we don't report it here. + + let predicate = self.resolve_vars_if_possible(&obligation.predicate); + let span = obligation.cause.span; + + debug!( + "maybe_report_ambiguity(predicate={:?}, obligation={:?} body_id={:?}, code={:?})", + predicate, obligation, body_id, obligation.cause.code, + ); + + // Ambiguity errors are often caused as fallout from earlier + // errors. So just ignore them if this infcx is tainted. + if self.is_tainted_by_errors() { + return; + } + + let mut err = match predicate { + ty::Predicate::Trait(ref data, _) => { + let trait_ref = data.to_poly_trait_ref(); + let self_ty = trait_ref.self_ty(); + debug!("self_ty {:?} {:?} trait_ref {:?}", self_ty, self_ty.kind, trait_ref); + + if predicate.references_error() { + return; + } + // Typically, this ambiguity should only happen if + // there are unresolved type inference variables + // (otherwise it would suggest a coherence + // failure). But given #21974 that is not necessarily + // the case -- we can have multiple where clauses that + // are only distinguished by a region, which results + // in an ambiguity even when all types are fully + // known, since we don't dispatch based on region + // relationships. + + // This is kind of a hack: it frequently happens that some earlier + // error prevents types from being fully inferred, and then we get + // a bunch of uninteresting errors saying something like " doesn't implement Sized". It may even be true that we + // could just skip over all checks where the self-ty is an + // inference variable, but I was afraid that there might be an + // inference variable created, registered as an obligation, and + // then never forced by writeback, and hence by skipping here we'd + // be ignoring the fact that we don't KNOW the type works + // out. Though even that would probably be harmless, given that + // we're only talking about builtin traits, which are known to be + // inhabited. We used to check for `self.tcx.sess.has_errors()` to + // avoid inundating the user with unnecessary errors, but we now + // check upstream for type errors and dont add the obligations to + // begin with in those cases. + if self + .tcx + .lang_items() + .sized_trait() + .map_or(false, |sized_id| sized_id == trait_ref.def_id()) + { + self.need_type_info_err(body_id, span, self_ty, ErrorCode::E0282).emit(); + return; + } + let mut err = self.need_type_info_err(body_id, span, self_ty, ErrorCode::E0283); + err.note(&format!("cannot resolve `{}`", predicate)); + if let ObligationCauseCode::ItemObligation(def_id) = obligation.cause.code { + self.suggest_fully_qualified_path(&mut err, def_id, span, trait_ref.def_id()); + } else if let ( + Ok(ref snippet), + ObligationCauseCode::BindingObligation(ref def_id, _), + ) = + (self.tcx.sess.source_map().span_to_snippet(span), &obligation.cause.code) + { + let generics = self.tcx.generics_of(*def_id); + if !generics.params.is_empty() && !snippet.ends_with('>') { + // FIXME: To avoid spurious suggestions in functions where type arguments + // where already supplied, we check the snippet to make sure it doesn't + // end with a turbofish. Ideally we would have access to a `PathSegment` + // instead. Otherwise we would produce the following output: + // + // error[E0283]: type annotations needed + // --> $DIR/issue-54954.rs:3:24 + // | + // LL | const ARR_LEN: usize = Tt::const_val::<[i8; 123]>(); + // | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + // | | + // | cannot infer type + // | help: consider specifying the type argument + // | in the function call: + // | `Tt::const_val::<[i8; 123]>::` + // ... + // LL | const fn const_val() -> usize { + // | --------- - required by this bound in `Tt::const_val` + // | + // = note: cannot resolve `_: Tt` + + err.span_suggestion( + span, + &format!( + "consider specifying the type argument{} in the function call", + if generics.params.len() > 1 { "s" } else { "" }, + ), + format!( + "{}::<{}>", + snippet, + generics + .params + .iter() + .map(|p| p.name.to_string()) + .collect::>() + .join(", ") + ), + Applicability::HasPlaceholders, + ); + } + } + err + } + + ty::Predicate::WellFormed(ty) => { + // Same hacky approach as above to avoid deluging user + // with error messages. + if ty.references_error() || self.tcx.sess.has_errors() { + return; + } + self.need_type_info_err(body_id, span, ty, ErrorCode::E0282) + } + + ty::Predicate::Subtype(ref data) => { + if data.references_error() || self.tcx.sess.has_errors() { + // no need to overload user in such cases + return; + } + let &SubtypePredicate { a_is_expected: _, a, b } = data.skip_binder(); + // both must be type variables, or the other would've been instantiated + assert!(a.is_ty_var() && b.is_ty_var()); + self.need_type_info_err(body_id, span, a, ErrorCode::E0282) + } + ty::Predicate::Projection(ref data) => { + let trait_ref = data.to_poly_trait_ref(self.tcx); + let self_ty = trait_ref.self_ty(); + if predicate.references_error() { + return; + } + let mut err = self.need_type_info_err(body_id, span, self_ty, ErrorCode::E0284); + err.note(&format!("cannot resolve `{}`", predicate)); + err + } + + _ => { + if self.tcx.sess.has_errors() { + return; + } + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0284, + "type annotations needed: cannot resolve `{}`", + predicate, + ); + err.span_label(span, &format!("cannot resolve `{}`", predicate)); + err + } + }; + self.note_obligation_cause(&mut err, obligation); + err.emit(); + } + + /// Returns `true` if the trait predicate may apply for *some* assignment + /// to the type parameters. + fn predicate_can_apply( + &self, + param_env: ty::ParamEnv<'tcx>, + pred: ty::PolyTraitRef<'tcx>, + ) -> bool { + struct ParamToVarFolder<'a, 'tcx> { + infcx: &'a InferCtxt<'a, 'tcx>, + var_map: FxHashMap, Ty<'tcx>>, + } + + impl<'a, 'tcx> TypeFolder<'tcx> for ParamToVarFolder<'a, 'tcx> { + fn tcx<'b>(&'b self) -> TyCtxt<'tcx> { + self.infcx.tcx + } + + fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { + if let ty::Param(ty::ParamTy { name, .. }) = ty.kind { + let infcx = self.infcx; + self.var_map.entry(ty).or_insert_with(|| { + infcx.next_ty_var(TypeVariableOrigin { + kind: TypeVariableOriginKind::TypeParameterDefinition(name, None), + span: DUMMY_SP, + }) + }) + } else { + ty.super_fold_with(self) + } + } + } + + self.probe(|_| { + let mut selcx = SelectionContext::new(self); + + let cleaned_pred = + pred.fold_with(&mut ParamToVarFolder { infcx: self, var_map: Default::default() }); + + let cleaned_pred = super::project::normalize( + &mut selcx, + param_env, + ObligationCause::dummy(), + &cleaned_pred, + ) + .value; + + let obligation = Obligation::new( + ObligationCause::dummy(), + param_env, + cleaned_pred.without_const().to_predicate(), + ); + + self.predicate_may_hold(&obligation) + }) + } + + fn note_obligation_cause( + &self, + err: &mut DiagnosticBuilder<'_>, + obligation: &PredicateObligation<'tcx>, + ) { + // First, attempt to add note to this error with an async-await-specific + // message, and fall back to regular note otherwise. + if !self.maybe_note_obligation_cause_for_async_await(err, obligation) { + self.note_obligation_cause_code( + err, + &obligation.predicate, + &obligation.cause.code, + &mut vec![], + ); + } + } + + fn is_recursive_obligation( + &self, + obligated_types: &mut Vec<&ty::TyS<'tcx>>, + cause_code: &ObligationCauseCode<'tcx>, + ) -> bool { + if let ObligationCauseCode::BuiltinDerivedObligation(ref data) = cause_code { + let parent_trait_ref = self.resolve_vars_if_possible(&data.parent_trait_ref); + + if obligated_types.iter().any(|ot| ot == &parent_trait_ref.skip_binder().self_ty()) { + return true; + } + } + false + } +} + +/// Summarizes information +#[derive(Clone)] +pub enum ArgKind { + /// An argument of non-tuple type. Parameters are (name, ty) + Arg(String, String), + + /// An argument of tuple type. For a "found" argument, the span is + /// the locationo in the source of the pattern. For a "expected" + /// argument, it will be None. The vector is a list of (name, ty) + /// strings for the components of the tuple. + Tuple(Option, Vec<(String, String)>), +} + +impl ArgKind { + fn empty() -> ArgKind { + ArgKind::Arg("_".to_owned(), "_".to_owned()) + } + + /// Creates an `ArgKind` from the expected type of an + /// argument. It has no name (`_`) and an optional source span. + pub fn from_expected_ty(t: Ty<'_>, span: Option) -> ArgKind { + match t.kind { + ty::Tuple(ref tys) => ArgKind::Tuple( + span, + tys.iter().map(|ty| ("_".to_owned(), ty.to_string())).collect::>(), + ), + _ => ArgKind::Arg("_".to_owned(), t.to_string()), + } + } +} + +/// Suggest restricting a type param with a new bound. +pub fn suggest_constraining_type_param( + generics: &hir::Generics<'_>, + err: &mut DiagnosticBuilder<'_>, + param_name: &str, + constraint: &str, + source_map: &SourceMap, + span: Span, +) -> bool { + let restrict_msg = "consider further restricting this bound"; + if let Some(param) = + generics.params.iter().filter(|p| p.name.ident().as_str() == param_name).next() + { + if param_name.starts_with("impl ") { + // `impl Trait` in argument: + // `fn foo(x: impl Trait) {}` → `fn foo(t: impl Trait + Trait2) {}` + err.span_suggestion( + param.span, + restrict_msg, + // `impl CurrentTrait + MissingTrait` + format!("{} + {}", param_name, constraint), + Applicability::MachineApplicable, + ); + } else if generics.where_clause.predicates.is_empty() && param.bounds.is_empty() { + // If there are no bounds whatsoever, suggest adding a constraint + // to the type parameter: + // `fn foo(t: T) {}` → `fn foo(t: T) {}` + err.span_suggestion( + param.span, + "consider restricting this bound", + format!("{}: {}", param_name, constraint), + Applicability::MachineApplicable, + ); + } else if !generics.where_clause.predicates.is_empty() { + // There is a `where` clause, so suggest expanding it: + // `fn foo(t: T) where T: Debug {}` → + // `fn foo(t: T) where T: Debug, T: Trait {}` + err.span_suggestion( + generics.where_clause.span().unwrap().shrink_to_hi(), + &format!("consider further restricting type parameter `{}`", param_name), + format!(", {}: {}", param_name, constraint), + Applicability::MachineApplicable, + ); + } else { + // If there is no `where` clause lean towards constraining to the + // type parameter: + // `fn foo(t: T, x: X) {}` → `fn foo(t: T) {}` + // `fn foo(t: T) {}` → `fn foo(t: T) {}` + let sp = param.span.with_hi(span.hi()); + let span = source_map.span_through_char(sp, ':'); + if sp != param.span && sp != span { + // Only suggest if we have high certainty that the span + // covers the colon in `foo`. + err.span_suggestion( + span, + restrict_msg, + format!("{}: {} + ", param_name, constraint), + Applicability::MachineApplicable, + ); + } else { + err.span_label( + param.span, + &format!("consider adding a `where {}: {}` bound", param_name, constraint), + ); + } + } + return true; + } + false +} diff --git a/src/librustc/traits/error_reporting/on_unimplemented.rs b/src/librustc/traits/error_reporting/on_unimplemented.rs new file mode 100644 index 0000000000..2ba12baaf6 --- /dev/null +++ b/src/librustc/traits/error_reporting/on_unimplemented.rs @@ -0,0 +1,213 @@ +use super::{ + ObligationCauseCode, OnUnimplementedDirective, OnUnimplementedNote, PredicateObligation, +}; +use crate::infer::InferCtxt; +use crate::ty::subst::Subst; +use crate::ty::{self, GenericParamDefKind}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::sym; + +impl<'a, 'tcx> InferCtxt<'a, 'tcx> { + fn impl_similar_to( + &self, + trait_ref: ty::PolyTraitRef<'tcx>, + obligation: &PredicateObligation<'tcx>, + ) -> Option { + let tcx = self.tcx; + let param_env = obligation.param_env; + let trait_ref = tcx.erase_late_bound_regions(&trait_ref); + let trait_self_ty = trait_ref.self_ty(); + + let mut self_match_impls = vec![]; + let mut fuzzy_match_impls = vec![]; + + self.tcx.for_each_relevant_impl(trait_ref.def_id, trait_self_ty, |def_id| { + let impl_substs = self.fresh_substs_for_item(obligation.cause.span, def_id); + let impl_trait_ref = tcx.impl_trait_ref(def_id).unwrap().subst(tcx, impl_substs); + + let impl_self_ty = impl_trait_ref.self_ty(); + + if let Ok(..) = self.can_eq(param_env, trait_self_ty, impl_self_ty) { + self_match_impls.push(def_id); + + if trait_ref + .substs + .types() + .skip(1) + .zip(impl_trait_ref.substs.types().skip(1)) + .all(|(u, v)| self.fuzzy_match_tys(u, v)) + { + fuzzy_match_impls.push(def_id); + } + } + }); + + let impl_def_id = if self_match_impls.len() == 1 { + self_match_impls[0] + } else if fuzzy_match_impls.len() == 1 { + fuzzy_match_impls[0] + } else { + return None; + }; + + tcx.has_attr(impl_def_id, sym::rustc_on_unimplemented).then_some(impl_def_id) + } + + /// Used to set on_unimplemented's `ItemContext` + /// to be the enclosing (async) block/function/closure + fn describe_enclosure(&self, hir_id: hir::HirId) -> Option<&'static str> { + let hir = &self.tcx.hir(); + let node = hir.find(hir_id)?; + match &node { + hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, _, body_id), .. }) => { + self.describe_generator(*body_id).or_else(|| { + Some(if let hir::FnHeader { asyncness: hir::IsAsync::Async, .. } = sig.header { + "an async function" + } else { + "a function" + }) + }) + } + hir::Node::TraitItem(hir::TraitItem { + kind: hir::TraitItemKind::Method(_, hir::TraitMethod::Provided(body_id)), + .. + }) => self.describe_generator(*body_id).or_else(|| Some("a trait method")), + hir::Node::ImplItem(hir::ImplItem { + kind: hir::ImplItemKind::Method(sig, body_id), + .. + }) => self.describe_generator(*body_id).or_else(|| { + Some(if let hir::FnHeader { asyncness: hir::IsAsync::Async, .. } = sig.header { + "an async method" + } else { + "a method" + }) + }), + hir::Node::Expr(hir::Expr { + kind: hir::ExprKind::Closure(_is_move, _, body_id, _, gen_movability), + .. + }) => self.describe_generator(*body_id).or_else(|| { + Some(if gen_movability.is_some() { "an async closure" } else { "a closure" }) + }), + hir::Node::Expr(hir::Expr { .. }) => { + let parent_hid = hir.get_parent_node(hir_id); + if parent_hid != hir_id { + return self.describe_enclosure(parent_hid); + } else { + None + } + } + _ => None, + } + } + + crate fn on_unimplemented_note( + &self, + trait_ref: ty::PolyTraitRef<'tcx>, + obligation: &PredicateObligation<'tcx>, + ) -> OnUnimplementedNote { + let def_id = + self.impl_similar_to(trait_ref, obligation).unwrap_or_else(|| trait_ref.def_id()); + let trait_ref = *trait_ref.skip_binder(); + + let mut flags = vec![]; + flags.push(( + sym::item_context, + self.describe_enclosure(obligation.cause.body_id).map(|s| s.to_owned()), + )); + + match obligation.cause.code { + ObligationCauseCode::BuiltinDerivedObligation(..) + | ObligationCauseCode::ImplDerivedObligation(..) => {} + _ => { + // this is a "direct", user-specified, rather than derived, + // obligation. + flags.push((sym::direct, None)); + } + } + + if let ObligationCauseCode::ItemObligation(item) = obligation.cause.code { + // FIXME: maybe also have some way of handling methods + // from other traits? That would require name resolution, + // which we might want to be some sort of hygienic. + // + // Currently I'm leaving it for what I need for `try`. + if self.tcx.trait_of_item(item) == Some(trait_ref.def_id) { + let method = self.tcx.item_name(item); + flags.push((sym::from_method, None)); + flags.push((sym::from_method, Some(method.to_string()))); + } + } + if let Some((t, _)) = self.get_parent_trait_ref(&obligation.cause.code) { + flags.push((sym::parent_trait, Some(t))); + } + + if let Some(k) = obligation.cause.span.desugaring_kind() { + flags.push((sym::from_desugaring, None)); + flags.push((sym::from_desugaring, Some(format!("{:?}", k)))); + } + let generics = self.tcx.generics_of(def_id); + let self_ty = trait_ref.self_ty(); + // This is also included through the generics list as `Self`, + // but the parser won't allow you to use it + flags.push((sym::_Self, Some(self_ty.to_string()))); + if let Some(def) = self_ty.ty_adt_def() { + // We also want to be able to select self's original + // signature with no type arguments resolved + flags.push((sym::_Self, Some(self.tcx.type_of(def.did).to_string()))); + } + + for param in generics.params.iter() { + let value = match param.kind { + GenericParamDefKind::Type { .. } | GenericParamDefKind::Const => { + trait_ref.substs[param.index as usize].to_string() + } + GenericParamDefKind::Lifetime => continue, + }; + let name = param.name; + flags.push((name, Some(value))); + } + + if let Some(true) = self_ty.ty_adt_def().map(|def| def.did.is_local()) { + flags.push((sym::crate_local, None)); + } + + // Allow targeting all integers using `{integral}`, even if the exact type was resolved + if self_ty.is_integral() { + flags.push((sym::_Self, Some("{integral}".to_owned()))); + } + + if let ty::Array(aty, len) = self_ty.kind { + flags.push((sym::_Self, Some("[]".to_owned()))); + flags.push((sym::_Self, Some(format!("[{}]", aty)))); + if let Some(def) = aty.ty_adt_def() { + // We also want to be able to select the array's type's original + // signature with no type arguments resolved + flags.push(( + sym::_Self, + Some(format!("[{}]", self.tcx.type_of(def.did).to_string())), + )); + let tcx = self.tcx; + if let Some(len) = len.try_eval_usize(tcx, ty::ParamEnv::empty()) { + flags.push(( + sym::_Self, + Some(format!("[{}; {}]", self.tcx.type_of(def.did).to_string(), len)), + )); + } else { + flags.push(( + sym::_Self, + Some(format!("[{}; _]", self.tcx.type_of(def.did).to_string())), + )); + } + } + } + + if let Ok(Some(command)) = + OnUnimplementedDirective::of_item(self.tcx, trait_ref.def_id, def_id) + { + command.evaluate(self.tcx, trait_ref, &flags[..]) + } else { + OnUnimplementedNote::default() + } + } +} diff --git a/src/librustc/traits/error_reporting/suggestions.rs b/src/librustc/traits/error_reporting/suggestions.rs new file mode 100644 index 0000000000..72629c6a3c --- /dev/null +++ b/src/librustc/traits/error_reporting/suggestions.rs @@ -0,0 +1,1780 @@ +use super::{ + ArgKind, EvaluationResult, Obligation, ObligationCause, ObligationCauseCode, + PredicateObligation, +}; + +use crate::infer::InferCtxt; +use crate::traits::object_safety::object_safety_violations; +use crate::ty::TypeckTables; +use crate::ty::{self, AdtKind, DefIdTree, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness}; + +use rustc_errors::{ + error_code, pluralize, struct_span_err, Applicability, DiagnosticBuilder, Style, +}; +use rustc_hir as hir; +use rustc_hir::def::DefKind; +use rustc_hir::def_id::DefId; +use rustc_hir::intravisit::Visitor; +use rustc_hir::Node; +use rustc_span::source_map::SourceMap; +use rustc_span::symbol::{kw, sym}; +use rustc_span::{MultiSpan, Span, DUMMY_SP}; +use std::fmt; + +impl<'a, 'tcx> InferCtxt<'a, 'tcx> { + crate fn suggest_restricting_param_bound( + &self, + mut err: &mut DiagnosticBuilder<'_>, + trait_ref: &ty::PolyTraitRef<'_>, + body_id: hir::HirId, + ) { + let self_ty = trait_ref.self_ty(); + let (param_ty, projection) = match &self_ty.kind { + ty::Param(_) => (true, None), + ty::Projection(projection) => (false, Some(projection)), + _ => return, + }; + + let suggest_restriction = + |generics: &hir::Generics<'_>, msg, err: &mut DiagnosticBuilder<'_>| { + let span = generics.where_clause.span_for_predicates_or_empty_place(); + if !span.from_expansion() && span.desugaring_kind().is_none() { + err.span_suggestion( + generics.where_clause.span_for_predicates_or_empty_place().shrink_to_hi(), + &format!("consider further restricting {}", msg), + format!( + "{} {} ", + if !generics.where_clause.predicates.is_empty() { + "," + } else { + " where" + }, + trait_ref.without_const().to_predicate(), + ), + Applicability::MachineApplicable, + ); + } + }; + + // FIXME: Add check for trait bound that is already present, particularly `?Sized` so we + // don't suggest `T: Sized + ?Sized`. + let mut hir_id = body_id; + while let Some(node) = self.tcx.hir().find(hir_id) { + match node { + hir::Node::TraitItem(hir::TraitItem { + generics, + kind: hir::TraitItemKind::Method(..), + .. + }) if param_ty && self_ty == self.tcx.types.self_param => { + // Restricting `Self` for a single method. + suggest_restriction(&generics, "`Self`", err); + return; + } + + hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, generics, _), .. }) + | hir::Node::TraitItem(hir::TraitItem { + generics, + kind: hir::TraitItemKind::Method(..), + .. + }) + | hir::Node::ImplItem(hir::ImplItem { + generics, + kind: hir::ImplItemKind::Method(..), + .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::Trait(_, _, generics, _, _), + .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::Impl { generics, .. }, .. + }) if projection.is_some() => { + // Missing associated type bound. + suggest_restriction(&generics, "the associated type", err); + return; + } + + hir::Node::Item(hir::Item { + kind: hir::ItemKind::Struct(_, generics), + span, + .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::Enum(_, generics), span, .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::Union(_, generics), + span, + .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::Trait(_, _, generics, ..), + span, + .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::Impl { generics, .. }, + span, + .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::Fn(_, generics, _), + span, + .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::TyAlias(_, generics), + span, + .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::TraitAlias(generics, _), + span, + .. + }) + | hir::Node::Item(hir::Item { + kind: hir::ItemKind::OpaqueTy(hir::OpaqueTy { generics, .. }), + span, + .. + }) + | hir::Node::TraitItem(hir::TraitItem { generics, span, .. }) + | hir::Node::ImplItem(hir::ImplItem { generics, span, .. }) + if param_ty => + { + // Missing generic type parameter bound. + let param_name = self_ty.to_string(); + let constraint = trait_ref.print_only_trait_path().to_string(); + if suggest_constraining_type_param( + generics, + &mut err, + ¶m_name, + &constraint, + self.tcx.sess.source_map(), + *span, + ) { + return; + } + } + + hir::Node::Crate => return, + + _ => {} + } + + hir_id = self.tcx.hir().get_parent_item(hir_id); + } + } + + /// When encountering an assignment of an unsized trait, like `let x = ""[..];`, provide a + /// suggestion to borrow the initializer in order to use have a slice instead. + crate fn suggest_borrow_on_unsized_slice( + &self, + code: &ObligationCauseCode<'tcx>, + err: &mut DiagnosticBuilder<'tcx>, + ) { + if let &ObligationCauseCode::VariableType(hir_id) = code { + let parent_node = self.tcx.hir().get_parent_node(hir_id); + if let Some(Node::Local(ref local)) = self.tcx.hir().find(parent_node) { + if let Some(ref expr) = local.init { + if let hir::ExprKind::Index(_, _) = expr.kind { + if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(expr.span) { + err.span_suggestion( + expr.span, + "consider borrowing here", + format!("&{}", snippet), + Applicability::MachineApplicable, + ); + } + } + } + } + } + } + + /// Given a closure's `DefId`, return the given name of the closure. + /// + /// This doesn't account for reassignments, but it's only used for suggestions. + crate fn get_closure_name( + &self, + def_id: DefId, + err: &mut DiagnosticBuilder<'_>, + msg: &str, + ) -> Option { + let get_name = + |err: &mut DiagnosticBuilder<'_>, kind: &hir::PatKind<'_>| -> Option { + // Get the local name of this closure. This can be inaccurate because + // of the possibility of reassignment, but this should be good enough. + match &kind { + hir::PatKind::Binding(hir::BindingAnnotation::Unannotated, _, name, None) => { + Some(format!("{}", name)) + } + _ => { + err.note(&msg); + None + } + } + }; + + let hir = self.tcx.hir(); + let hir_id = hir.as_local_hir_id(def_id)?; + let parent_node = hir.get_parent_node(hir_id); + match hir.find(parent_node) { + Some(hir::Node::Stmt(hir::Stmt { kind: hir::StmtKind::Local(local), .. })) => { + get_name(err, &local.pat.kind) + } + // Different to previous arm because one is `&hir::Local` and the other + // is `P`. + Some(hir::Node::Local(local)) => get_name(err, &local.pat.kind), + _ => return None, + } + } + + /// We tried to apply the bound to an `fn` or closure. Check whether calling it would + /// evaluate to a type that *would* satisfy the trait binding. If it would, suggest calling + /// it: `bar(foo)` → `bar(foo())`. This case is *very* likely to be hit if `foo` is `async`. + crate fn suggest_fn_call( + &self, + obligation: &PredicateObligation<'tcx>, + err: &mut DiagnosticBuilder<'_>, + trait_ref: &ty::Binder>, + points_at_arg: bool, + ) { + let self_ty = trait_ref.self_ty(); + let (def_id, output_ty, callable) = match self_ty.kind { + ty::Closure(def_id, substs) => { + (def_id, self.closure_sig(def_id, substs).output(), "closure") + } + ty::FnDef(def_id, _) => (def_id, self_ty.fn_sig(self.tcx).output(), "function"), + _ => return, + }; + let msg = format!("use parentheses to call the {}", callable); + + let obligation = self.mk_obligation_for_def_id( + trait_ref.def_id(), + output_ty.skip_binder(), + obligation.cause.clone(), + obligation.param_env, + ); + + match self.evaluate_obligation(&obligation) { + Ok(EvaluationResult::EvaluatedToOk) + | Ok(EvaluationResult::EvaluatedToOkModuloRegions) + | Ok(EvaluationResult::EvaluatedToAmbig) => {} + _ => return, + } + let hir = self.tcx.hir(); + // Get the name of the callable and the arguments to be used in the suggestion. + let snippet = match hir.get_if_local(def_id) { + Some(hir::Node::Expr(hir::Expr { + kind: hir::ExprKind::Closure(_, decl, _, span, ..), + .. + })) => { + err.span_label(*span, "consider calling this closure"); + let name = match self.get_closure_name(def_id, err, &msg) { + Some(name) => name, + None => return, + }; + let args = decl.inputs.iter().map(|_| "_").collect::>().join(", "); + format!("{}({})", name, args) + } + Some(hir::Node::Item(hir::Item { + ident, + kind: hir::ItemKind::Fn(.., body_id), + .. + })) => { + err.span_label(ident.span, "consider calling this function"); + let body = hir.body(*body_id); + let args = body + .params + .iter() + .map(|arg| match &arg.pat.kind { + hir::PatKind::Binding(_, _, ident, None) + // FIXME: provide a better suggestion when encountering `SelfLower`, it + // should suggest a method call. + if ident.name != kw::SelfLower => ident.to_string(), + _ => "_".to_string(), + }) + .collect::>() + .join(", "); + format!("{}({})", ident, args) + } + _ => return, + }; + if points_at_arg { + // When the obligation error has been ensured to have been caused by + // an argument, the `obligation.cause.span` points at the expression + // of the argument, so we can provide a suggestion. This is signaled + // by `points_at_arg`. Otherwise, we give a more general note. + err.span_suggestion( + obligation.cause.span, + &msg, + snippet, + Applicability::HasPlaceholders, + ); + } else { + err.help(&format!("{}: `{}`", msg, snippet)); + } + } + + crate fn suggest_add_reference_to_arg( + &self, + obligation: &PredicateObligation<'tcx>, + err: &mut DiagnosticBuilder<'tcx>, + trait_ref: &ty::Binder>, + points_at_arg: bool, + has_custom_message: bool, + ) -> bool { + if !points_at_arg { + return false; + } + + let span = obligation.cause.span; + let param_env = obligation.param_env; + let trait_ref = trait_ref.skip_binder(); + + if let ObligationCauseCode::ImplDerivedObligation(obligation) = &obligation.cause.code { + // Try to apply the original trait binding obligation by borrowing. + let self_ty = trait_ref.self_ty(); + let found = self_ty.to_string(); + let new_self_ty = self.tcx.mk_imm_ref(self.tcx.lifetimes.re_static, self_ty); + let substs = self.tcx.mk_substs_trait(new_self_ty, &[]); + let new_trait_ref = ty::TraitRef::new(obligation.parent_trait_ref.def_id(), substs); + let new_obligation = Obligation::new( + ObligationCause::dummy(), + param_env, + new_trait_ref.without_const().to_predicate(), + ); + if self.predicate_must_hold_modulo_regions(&new_obligation) { + if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span) { + // We have a very specific type of error, where just borrowing this argument + // might solve the problem. In cases like this, the important part is the + // original type obligation, not the last one that failed, which is arbitrary. + // Because of this, we modify the error to refer to the original obligation and + // return early in the caller. + let msg = format!( + "the trait bound `{}: {}` is not satisfied", + found, + obligation.parent_trait_ref.skip_binder().print_only_trait_path(), + ); + if has_custom_message { + err.note(&msg); + } else { + err.message = vec![(msg, Style::NoStyle)]; + } + if snippet.starts_with('&') { + // This is already a literal borrow and the obligation is failing + // somewhere else in the obligation chain. Do not suggest non-sense. + return false; + } + err.span_label( + span, + &format!( + "expected an implementor of trait `{}`", + obligation.parent_trait_ref.skip_binder().print_only_trait_path(), + ), + ); + err.span_suggestion( + span, + "consider borrowing here", + format!("&{}", snippet), + Applicability::MaybeIncorrect, + ); + return true; + } + } + } + false + } + + /// Whenever references are used by mistake, like `for (i, e) in &vec.iter().enumerate()`, + /// suggest removing these references until we reach a type that implements the trait. + crate fn suggest_remove_reference( + &self, + obligation: &PredicateObligation<'tcx>, + err: &mut DiagnosticBuilder<'tcx>, + trait_ref: &ty::Binder>, + ) { + let trait_ref = trait_ref.skip_binder(); + let span = obligation.cause.span; + + if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span) { + let refs_number = + snippet.chars().filter(|c| !c.is_whitespace()).take_while(|c| *c == '&').count(); + if let Some('\'') = + snippet.chars().filter(|c| !c.is_whitespace()).skip(refs_number).next() + { + // Do not suggest removal of borrow from type arguments. + return; + } + + let mut trait_type = trait_ref.self_ty(); + + for refs_remaining in 0..refs_number { + if let ty::Ref(_, t_type, _) = trait_type.kind { + trait_type = t_type; + + let new_obligation = self.mk_obligation_for_def_id( + trait_ref.def_id, + trait_type, + ObligationCause::dummy(), + obligation.param_env, + ); + + if self.predicate_may_hold(&new_obligation) { + let sp = self + .tcx + .sess + .source_map() + .span_take_while(span, |c| c.is_whitespace() || *c == '&'); + + let remove_refs = refs_remaining + 1; + let format_str = + format!("consider removing {} leading `&`-references", remove_refs); + + err.span_suggestion_short( + sp, + &format_str, + String::new(), + Applicability::MachineApplicable, + ); + break; + } + } else { + break; + } + } + } + } + + /// Check if the trait bound is implemented for a different mutability and note it in the + /// final error. + crate fn suggest_change_mut( + &self, + obligation: &PredicateObligation<'tcx>, + err: &mut DiagnosticBuilder<'tcx>, + trait_ref: &ty::Binder>, + points_at_arg: bool, + ) { + let span = obligation.cause.span; + if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span) { + let refs_number = + snippet.chars().filter(|c| !c.is_whitespace()).take_while(|c| *c == '&').count(); + if let Some('\'') = + snippet.chars().filter(|c| !c.is_whitespace()).skip(refs_number).next() + { + // Do not suggest removal of borrow from type arguments. + return; + } + let trait_ref = self.resolve_vars_if_possible(trait_ref); + if trait_ref.has_infer_types() { + // Do not ICE while trying to find if a reborrow would succeed on a trait with + // unresolved bindings. + return; + } + + if let ty::Ref(region, t_type, mutability) = trait_ref.skip_binder().self_ty().kind { + let trait_type = match mutability { + hir::Mutability::Mut => self.tcx.mk_imm_ref(region, t_type), + hir::Mutability::Not => self.tcx.mk_mut_ref(region, t_type), + }; + + let new_obligation = self.mk_obligation_for_def_id( + trait_ref.skip_binder().def_id, + trait_type, + ObligationCause::dummy(), + obligation.param_env, + ); + + if self.evaluate_obligation_no_overflow(&new_obligation).must_apply_modulo_regions() + { + let sp = self + .tcx + .sess + .source_map() + .span_take_while(span, |c| c.is_whitespace() || *c == '&'); + if points_at_arg && mutability == hir::Mutability::Not && refs_number > 0 { + err.span_suggestion( + sp, + "consider changing this borrow's mutability", + "&mut ".to_string(), + Applicability::MachineApplicable, + ); + } else { + err.note(&format!( + "`{}` is implemented for `{:?}`, but not for `{:?}`", + trait_ref.print_only_trait_path(), + trait_type, + trait_ref.skip_binder().self_ty(), + )); + } + } + } + } + } + + crate fn suggest_semicolon_removal( + &self, + obligation: &PredicateObligation<'tcx>, + err: &mut DiagnosticBuilder<'tcx>, + span: Span, + trait_ref: &ty::Binder>, + ) { + let hir = self.tcx.hir(); + let parent_node = hir.get_parent_node(obligation.cause.body_id); + let node = hir.find(parent_node); + if let Some(hir::Node::Item(hir::Item { + kind: hir::ItemKind::Fn(sig, _, body_id), .. + })) = node + { + let body = hir.body(*body_id); + if let hir::ExprKind::Block(blk, _) = &body.value.kind { + if sig.decl.output.span().overlaps(span) + && blk.expr.is_none() + && "()" == &trait_ref.self_ty().to_string() + { + // FIXME(estebank): When encountering a method with a trait + // bound not satisfied in the return type with a body that has + // no return, suggest removal of semicolon on last statement. + // Once that is added, close #54771. + if let Some(ref stmt) = blk.stmts.last() { + let sp = self.tcx.sess.source_map().end_point(stmt.span); + err.span_label(sp, "consider removing this semicolon"); + } + } + } + } + } + + /// If all conditions are met to identify a returned `dyn Trait`, suggest using `impl Trait` if + /// applicable and signal that the error has been expanded appropriately and needs to be + /// emitted. + crate fn suggest_impl_trait( + &self, + err: &mut DiagnosticBuilder<'tcx>, + span: Span, + obligation: &PredicateObligation<'tcx>, + trait_ref: &ty::Binder>, + ) -> bool { + match obligation.cause.code.peel_derives() { + // Only suggest `impl Trait` if the return type is unsized because it is `dyn Trait`. + ObligationCauseCode::SizedReturnType => {} + _ => return false, + } + + let hir = self.tcx.hir(); + let parent_node = hir.get_parent_node(obligation.cause.body_id); + let node = hir.find(parent_node); + let (sig, body_id) = if let Some(hir::Node::Item(hir::Item { + kind: hir::ItemKind::Fn(sig, _, body_id), + .. + })) = node + { + (sig, body_id) + } else { + return false; + }; + let body = hir.body(*body_id); + let trait_ref = self.resolve_vars_if_possible(trait_ref); + let ty = trait_ref.skip_binder().self_ty(); + let is_object_safe = match ty.kind { + ty::Dynamic(predicates, _) => { + // If the `dyn Trait` is not object safe, do not suggest `Box`. + predicates + .principal_def_id() + .map_or(true, |def_id| object_safety_violations(self.tcx, def_id).is_empty()) + } + // We only want to suggest `impl Trait` to `dyn Trait`s. + // For example, `fn foo() -> str` needs to be filtered out. + _ => return false, + }; + + let ret_ty = if let hir::FunctionRetTy::Return(ret_ty) = sig.decl.output { + ret_ty + } else { + return false; + }; + + // Use `TypeVisitor` instead of the output type directly to find the span of `ty` for + // cases like `fn foo() -> (dyn Trait, i32) {}`. + // Recursively look for `TraitObject` types and if there's only one, use that span to + // suggest `impl Trait`. + + // Visit to make sure there's a single `return` type to suggest `impl Trait`, + // otherwise suggest using `Box` or an enum. + let mut visitor = ReturnsVisitor::default(); + visitor.visit_body(&body); + + let tables = self.in_progress_tables.map(|t| t.borrow()).unwrap(); + + let mut ret_types = visitor + .returns + .iter() + .filter_map(|expr| tables.node_type_opt(expr.hir_id)) + .map(|ty| self.resolve_vars_if_possible(&ty)); + let (last_ty, all_returns_have_same_type) = ret_types.clone().fold( + (None, true), + |(last_ty, mut same): (std::option::Option>, bool), ty| { + let ty = self.resolve_vars_if_possible(&ty); + same &= last_ty.map_or(true, |last_ty| last_ty == ty) && ty.kind != ty::Error; + (Some(ty), same) + }, + ); + let all_returns_conform_to_trait = + if let Some(ty_ret_ty) = tables.node_type_opt(ret_ty.hir_id) { + match ty_ret_ty.kind { + ty::Dynamic(predicates, _) => { + let cause = ObligationCause::misc(ret_ty.span, ret_ty.hir_id); + let param_env = ty::ParamEnv::empty(); + ret_types.all(|returned_ty| { + predicates.iter().all(|predicate| { + let pred = predicate.with_self_ty(self.tcx, returned_ty); + let obl = Obligation::new(cause.clone(), param_env, pred); + self.predicate_may_hold(&obl) + }) + }) + } + _ => false, + } + } else { + true + }; + + let (snippet, last_ty) = + if let (true, hir::TyKind::TraitObject(..), Ok(snippet), true, Some(last_ty)) = ( + // Verify that we're dealing with a return `dyn Trait` + ret_ty.span.overlaps(span), + &ret_ty.kind, + self.tcx.sess.source_map().span_to_snippet(ret_ty.span), + // If any of the return types does not conform to the trait, then we can't + // suggest `impl Trait` nor trait objects, it is a type mismatch error. + all_returns_conform_to_trait, + last_ty, + ) { + (snippet, last_ty) + } else { + return false; + }; + err.code(error_code!(E0746)); + err.set_primary_message("return type cannot have an unboxed trait object"); + err.children.clear(); + let impl_trait_msg = "for information on `impl Trait`, see \ + "; + let trait_obj_msg = "for information on trait objects, see \ + "; + let has_dyn = snippet.split_whitespace().next().map_or(false, |s| s == "dyn"); + let trait_obj = if has_dyn { &snippet[4..] } else { &snippet[..] }; + if all_returns_have_same_type { + // Suggest `-> impl Trait`. + err.span_suggestion( + ret_ty.span, + &format!( + "return `impl {1}` instead, as all return paths are of type `{}`, \ + which implements `{1}`", + last_ty, trait_obj, + ), + format!("impl {}", trait_obj), + Applicability::MachineApplicable, + ); + err.note(impl_trait_msg); + } else { + if is_object_safe { + // Suggest `-> Box` and `Box::new(returned_value)`. + // Get all the return values and collect their span and suggestion. + let mut suggestions = visitor + .returns + .iter() + .map(|expr| { + ( + expr.span, + format!( + "Box::new({})", + self.tcx.sess.source_map().span_to_snippet(expr.span).unwrap() + ), + ) + }) + .collect::>(); + // Add the suggestion for the return type. + suggestions.push(( + ret_ty.span, + format!("Box<{}{}>", if has_dyn { "" } else { "dyn " }, snippet), + )); + err.multipart_suggestion( + "return a boxed trait object instead", + suggestions, + Applicability::MaybeIncorrect, + ); + } else { + // This is currently not possible to trigger because E0038 takes precedence, but + // leave it in for completeness in case anything changes in an earlier stage. + err.note(&format!( + "if trait `{}` was object safe, you could return a trait object", + trait_obj, + )); + } + err.note(trait_obj_msg); + err.note(&format!( + "if all the returned values were of the same type you could use \ + `impl {}` as the return type", + trait_obj, + )); + err.note(impl_trait_msg); + err.note("you can create a new `enum` with a variant for each returned type"); + } + true + } + + crate fn point_at_returns_when_relevant( + &self, + err: &mut DiagnosticBuilder<'tcx>, + obligation: &PredicateObligation<'tcx>, + ) { + match obligation.cause.code.peel_derives() { + ObligationCauseCode::SizedReturnType => {} + _ => return, + } + + let hir = self.tcx.hir(); + let parent_node = hir.get_parent_node(obligation.cause.body_id); + let node = hir.find(parent_node); + if let Some(hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. })) = + node + { + let body = hir.body(*body_id); + // Point at all the `return`s in the function as they have failed trait bounds. + let mut visitor = ReturnsVisitor::default(); + visitor.visit_body(&body); + let tables = self.in_progress_tables.map(|t| t.borrow()).unwrap(); + for expr in &visitor.returns { + if let Some(returned_ty) = tables.node_type_opt(expr.hir_id) { + let ty = self.resolve_vars_if_possible(&returned_ty); + err.span_label(expr.span, &format!("this returned value is of type `{}`", ty)); + } + } + } + } + + /// Given some node representing a fn-like thing in the HIR map, + /// returns a span and `ArgKind` information that describes the + /// arguments it expects. This can be supplied to + /// `report_arg_count_mismatch`. + pub fn get_fn_like_arguments(&self, node: Node<'_>) -> (Span, Vec) { + match node { + Node::Expr(&hir::Expr { + kind: hir::ExprKind::Closure(_, ref _decl, id, span, _), + .. + }) => ( + self.tcx.sess.source_map().def_span(span), + self.tcx + .hir() + .body(id) + .params + .iter() + .map(|arg| { + if let hir::Pat { kind: hir::PatKind::Tuple(ref args, _), span, .. } = + *arg.pat + { + ArgKind::Tuple( + Some(span), + args.iter() + .map(|pat| { + let snippet = self + .tcx + .sess + .source_map() + .span_to_snippet(pat.span) + .unwrap(); + (snippet, "_".to_owned()) + }) + .collect::>(), + ) + } else { + let name = + self.tcx.sess.source_map().span_to_snippet(arg.pat.span).unwrap(); + ArgKind::Arg(name, "_".to_owned()) + } + }) + .collect::>(), + ), + Node::Item(&hir::Item { span, kind: hir::ItemKind::Fn(ref sig, ..), .. }) + | Node::ImplItem(&hir::ImplItem { + span, + kind: hir::ImplItemKind::Method(ref sig, _), + .. + }) + | Node::TraitItem(&hir::TraitItem { + span, + kind: hir::TraitItemKind::Method(ref sig, _), + .. + }) => ( + self.tcx.sess.source_map().def_span(span), + sig.decl + .inputs + .iter() + .map(|arg| match arg.clone().kind { + hir::TyKind::Tup(ref tys) => ArgKind::Tuple( + Some(arg.span), + vec![("_".to_owned(), "_".to_owned()); tys.len()], + ), + _ => ArgKind::empty(), + }) + .collect::>(), + ), + Node::Ctor(ref variant_data) => { + let span = variant_data + .ctor_hir_id() + .map(|hir_id| self.tcx.hir().span(hir_id)) + .unwrap_or(DUMMY_SP); + let span = self.tcx.sess.source_map().def_span(span); + + (span, vec![ArgKind::empty(); variant_data.fields().len()]) + } + _ => panic!("non-FnLike node found: {:?}", node), + } + } + + /// Reports an error when the number of arguments needed by a + /// trait match doesn't match the number that the expression + /// provides. + pub fn report_arg_count_mismatch( + &self, + span: Span, + found_span: Option, + expected_args: Vec, + found_args: Vec, + is_closure: bool, + ) -> DiagnosticBuilder<'tcx> { + let kind = if is_closure { "closure" } else { "function" }; + + let args_str = |arguments: &[ArgKind], other: &[ArgKind]| { + let arg_length = arguments.len(); + let distinct = match &other[..] { + &[ArgKind::Tuple(..)] => true, + _ => false, + }; + match (arg_length, arguments.get(0)) { + (1, Some(&ArgKind::Tuple(_, ref fields))) => { + format!("a single {}-tuple as argument", fields.len()) + } + _ => format!( + "{} {}argument{}", + arg_length, + if distinct && arg_length > 1 { "distinct " } else { "" }, + pluralize!(arg_length) + ), + } + }; + + let expected_str = args_str(&expected_args, &found_args); + let found_str = args_str(&found_args, &expected_args); + + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0593, + "{} is expected to take {}, but it takes {}", + kind, + expected_str, + found_str, + ); + + err.span_label(span, format!("expected {} that takes {}", kind, expected_str)); + + if let Some(found_span) = found_span { + err.span_label(found_span, format!("takes {}", found_str)); + + // move |_| { ... } + // ^^^^^^^^-- def_span + // + // move |_| { ... } + // ^^^^^-- prefix + let prefix_span = self.tcx.sess.source_map().span_until_non_whitespace(found_span); + // move |_| { ... } + // ^^^-- pipe_span + let pipe_span = + if let Some(span) = found_span.trim_start(prefix_span) { span } else { found_span }; + + // Suggest to take and ignore the arguments with expected_args_length `_`s if + // found arguments is empty (assume the user just wants to ignore args in this case). + // For example, if `expected_args_length` is 2, suggest `|_, _|`. + if found_args.is_empty() && is_closure { + let underscores = vec!["_"; expected_args.len()].join(", "); + err.span_suggestion( + pipe_span, + &format!( + "consider changing the closure to take and ignore the expected argument{}", + if expected_args.len() < 2 { "" } else { "s" } + ), + format!("|{}|", underscores), + Applicability::MachineApplicable, + ); + } + + if let &[ArgKind::Tuple(_, ref fields)] = &found_args[..] { + if fields.len() == expected_args.len() { + let sugg = fields + .iter() + .map(|(name, _)| name.to_owned()) + .collect::>() + .join(", "); + err.span_suggestion( + found_span, + "change the closure to take multiple arguments instead of a single tuple", + format!("|{}|", sugg), + Applicability::MachineApplicable, + ); + } + } + if let &[ArgKind::Tuple(_, ref fields)] = &expected_args[..] { + if fields.len() == found_args.len() && is_closure { + let sugg = format!( + "|({}){}|", + found_args + .iter() + .map(|arg| match arg { + ArgKind::Arg(name, _) => name.to_owned(), + _ => "_".to_owned(), + }) + .collect::>() + .join(", "), + // add type annotations if available + if found_args.iter().any(|arg| match arg { + ArgKind::Arg(_, ty) => ty != "_", + _ => false, + }) { + format!( + ": ({})", + fields + .iter() + .map(|(_, ty)| ty.to_owned()) + .collect::>() + .join(", ") + ) + } else { + String::new() + }, + ); + err.span_suggestion( + found_span, + "change the closure to accept a tuple instead of individual arguments", + sugg, + Applicability::MachineApplicable, + ); + } + } + } + + err + } + + crate fn report_closure_arg_mismatch( + &self, + span: Span, + found_span: Option, + expected_ref: ty::PolyTraitRef<'tcx>, + found: ty::PolyTraitRef<'tcx>, + ) -> DiagnosticBuilder<'tcx> { + crate fn build_fn_sig_string<'tcx>( + tcx: TyCtxt<'tcx>, + trait_ref: &ty::TraitRef<'tcx>, + ) -> String { + let inputs = trait_ref.substs.type_at(1); + let sig = if let ty::Tuple(inputs) = inputs.kind { + tcx.mk_fn_sig( + inputs.iter().map(|k| k.expect_ty()), + tcx.mk_ty_infer(ty::TyVar(ty::TyVid { index: 0 })), + false, + hir::Unsafety::Normal, + ::rustc_target::spec::abi::Abi::Rust, + ) + } else { + tcx.mk_fn_sig( + ::std::iter::once(inputs), + tcx.mk_ty_infer(ty::TyVar(ty::TyVid { index: 0 })), + false, + hir::Unsafety::Normal, + ::rustc_target::spec::abi::Abi::Rust, + ) + }; + ty::Binder::bind(sig).to_string() + } + + let argument_is_closure = expected_ref.skip_binder().substs.type_at(0).is_closure(); + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0631, + "type mismatch in {} arguments", + if argument_is_closure { "closure" } else { "function" } + ); + + let found_str = format!( + "expected signature of `{}`", + build_fn_sig_string(self.tcx, found.skip_binder()) + ); + err.span_label(span, found_str); + + let found_span = found_span.unwrap_or(span); + let expected_str = format!( + "found signature of `{}`", + build_fn_sig_string(self.tcx, expected_ref.skip_binder()) + ); + err.span_label(found_span, expected_str); + + err + } +} + +impl<'a, 'tcx> InferCtxt<'a, 'tcx> { + crate fn suggest_fully_qualified_path( + &self, + err: &mut DiagnosticBuilder<'_>, + def_id: DefId, + span: Span, + trait_ref: DefId, + ) { + if let Some(assoc_item) = self.tcx.opt_associated_item(def_id) { + if let ty::AssocKind::Const | ty::AssocKind::Type = assoc_item.kind { + err.note(&format!( + "{}s cannot be accessed directly on a `trait`, they can only be \ + accessed through a specific `impl`", + assoc_item.kind.suggestion_descr(), + )); + err.span_suggestion( + span, + "use the fully qualified path to an implementation", + format!("::{}", self.tcx.def_path_str(trait_ref), assoc_item.ident), + Applicability::HasPlaceholders, + ); + } + } + } + + /// Adds an async-await specific note to the diagnostic when the future does not implement + /// an auto trait because of a captured type. + /// + /// ```ignore (diagnostic) + /// note: future does not implement `Qux` as this value is used across an await + /// --> $DIR/issue-64130-3-other.rs:17:5 + /// | + /// LL | let x = Foo; + /// | - has type `Foo` + /// LL | baz().await; + /// | ^^^^^^^^^^^ await occurs here, with `x` maybe used later + /// LL | } + /// | - `x` is later dropped here + /// ``` + /// + /// When the diagnostic does not implement `Send` or `Sync` specifically, then the diagnostic + /// is "replaced" with a different message and a more specific error. + /// + /// ```ignore (diagnostic) + /// error: future cannot be sent between threads safely + /// --> $DIR/issue-64130-2-send.rs:21:5 + /// | + /// LL | fn is_send(t: T) { } + /// | ------- ---- required by this bound in `is_send` + /// ... + /// LL | is_send(bar()); + /// | ^^^^^^^ future returned by `bar` is not send + /// | + /// = help: within `impl std::future::Future`, the trait `std::marker::Send` is not + /// implemented for `Foo` + /// note: future is not send as this value is used across an await + /// --> $DIR/issue-64130-2-send.rs:15:5 + /// | + /// LL | let x = Foo; + /// | - has type `Foo` + /// LL | baz().await; + /// | ^^^^^^^^^^^ await occurs here, with `x` maybe used later + /// LL | } + /// | - `x` is later dropped here + /// ``` + /// + /// Returns `true` if an async-await specific note was added to the diagnostic. + crate fn maybe_note_obligation_cause_for_async_await( + &self, + err: &mut DiagnosticBuilder<'_>, + obligation: &PredicateObligation<'tcx>, + ) -> bool { + debug!( + "maybe_note_obligation_cause_for_async_await: obligation.predicate={:?} \ + obligation.cause.span={:?}", + obligation.predicate, obligation.cause.span + ); + let source_map = self.tcx.sess.source_map(); + + // Attempt to detect an async-await error by looking at the obligation causes, looking + // for a generator to be present. + // + // When a future does not implement a trait because of a captured type in one of the + // generators somewhere in the call stack, then the result is a chain of obligations. + // + // Given a `async fn` A that calls a `async fn` B which captures a non-send type and that + // future is passed as an argument to a function C which requires a `Send` type, then the + // chain looks something like this: + // + // - `BuiltinDerivedObligation` with a generator witness (B) + // - `BuiltinDerivedObligation` with a generator (B) + // - `BuiltinDerivedObligation` with `std::future::GenFuture` (B) + // - `BuiltinDerivedObligation` with `impl std::future::Future` (B) + // - `BuiltinDerivedObligation` with `impl std::future::Future` (B) + // - `BuiltinDerivedObligation` with a generator witness (A) + // - `BuiltinDerivedObligation` with a generator (A) + // - `BuiltinDerivedObligation` with `std::future::GenFuture` (A) + // - `BuiltinDerivedObligation` with `impl std::future::Future` (A) + // - `BuiltinDerivedObligation` with `impl std::future::Future` (A) + // - `BindingObligation` with `impl_send (Send requirement) + // + // The first obligation in the chain is the most useful and has the generator that captured + // the type. The last generator has information about where the bound was introduced. At + // least one generator should be present for this diagnostic to be modified. + let (mut trait_ref, mut target_ty) = match obligation.predicate { + ty::Predicate::Trait(p, _) => { + (Some(p.skip_binder().trait_ref), Some(p.skip_binder().self_ty())) + } + _ => (None, None), + }; + let mut generator = None; + let mut last_generator = None; + let mut next_code = Some(&obligation.cause.code); + while let Some(code) = next_code { + debug!("maybe_note_obligation_cause_for_async_await: code={:?}", code); + match code { + ObligationCauseCode::BuiltinDerivedObligation(derived_obligation) + | ObligationCauseCode::ImplDerivedObligation(derived_obligation) => { + let ty = derived_obligation.parent_trait_ref.self_ty(); + debug!( + "maybe_note_obligation_cause_for_async_await: \ + parent_trait_ref={:?} self_ty.kind={:?}", + derived_obligation.parent_trait_ref, ty.kind + ); + + match ty.kind { + ty::Generator(did, ..) => { + generator = generator.or(Some(did)); + last_generator = Some(did); + } + ty::GeneratorWitness(..) => {} + _ if generator.is_none() => { + trait_ref = Some(*derived_obligation.parent_trait_ref.skip_binder()); + target_ty = Some(ty); + } + _ => {} + } + + next_code = Some(derived_obligation.parent_code.as_ref()); + } + _ => break, + } + } + + // Only continue if a generator was found. + debug!( + "maybe_note_obligation_cause_for_async_await: generator={:?} trait_ref={:?} \ + target_ty={:?}", + generator, trait_ref, target_ty + ); + let (generator_did, trait_ref, target_ty) = match (generator, trait_ref, target_ty) { + (Some(generator_did), Some(trait_ref), Some(target_ty)) => { + (generator_did, trait_ref, target_ty) + } + _ => return false, + }; + + let span = self.tcx.def_span(generator_did); + + // Do not ICE on closure typeck (#66868). + if self.tcx.hir().as_local_hir_id(generator_did).is_none() { + return false; + } + + // Get the tables from the infcx if the generator is the function we are + // currently type-checking; otherwise, get them by performing a query. + // This is needed to avoid cycles. + let in_progress_tables = self.in_progress_tables.map(|t| t.borrow()); + let generator_did_root = self.tcx.closure_base_def_id(generator_did); + debug!( + "maybe_note_obligation_cause_for_async_await: generator_did={:?} \ + generator_did_root={:?} in_progress_tables.local_id_root={:?} span={:?}", + generator_did, + generator_did_root, + in_progress_tables.as_ref().map(|t| t.local_id_root), + span + ); + let query_tables; + let tables: &TypeckTables<'tcx> = match &in_progress_tables { + Some(t) if t.local_id_root == Some(generator_did_root) => t, + _ => { + query_tables = self.tcx.typeck_tables_of(generator_did); + &query_tables + } + }; + + // Look for a type inside the generator interior that matches the target type to get + // a span. + let target_ty_erased = self.tcx.erase_regions(&target_ty); + let target_span = tables + .generator_interior_types + .iter() + .find(|ty::GeneratorInteriorTypeCause { ty, .. }| { + // Careful: the regions for types that appear in the + // generator interior are not generally known, so we + // want to erase them when comparing (and anyway, + // `Send` and other bounds are generally unaffected by + // the choice of region). When erasing regions, we + // also have to erase late-bound regions. This is + // because the types that appear in the generator + // interior generally contain "bound regions" to + // represent regions that are part of the suspended + // generator frame. Bound regions are preserved by + // `erase_regions` and so we must also call + // `erase_late_bound_regions`. + let ty_erased = self.tcx.erase_late_bound_regions(&ty::Binder::bind(*ty)); + let ty_erased = self.tcx.erase_regions(&ty_erased); + let eq = ty::TyS::same_type(ty_erased, target_ty_erased); + debug!( + "maybe_note_obligation_cause_for_async_await: ty_erased={:?} \ + target_ty_erased={:?} eq={:?}", + ty_erased, target_ty_erased, eq + ); + eq + }) + .map(|ty::GeneratorInteriorTypeCause { span, scope_span, expr, .. }| { + (span, source_map.span_to_snippet(*span), scope_span, expr) + }); + + debug!( + "maybe_note_obligation_cause_for_async_await: target_ty={:?} \ + generator_interior_types={:?} target_span={:?}", + target_ty, tables.generator_interior_types, target_span + ); + if let Some((target_span, Ok(snippet), scope_span, expr)) = target_span { + self.note_obligation_cause_for_async_await( + err, + *target_span, + scope_span, + *expr, + snippet, + generator_did, + last_generator, + trait_ref, + target_ty, + tables, + obligation, + next_code, + ); + true + } else { + false + } + } + + /// Unconditionally adds the diagnostic note described in + /// `maybe_note_obligation_cause_for_async_await`'s documentation comment. + crate fn note_obligation_cause_for_async_await( + &self, + err: &mut DiagnosticBuilder<'_>, + target_span: Span, + scope_span: &Option, + expr: Option, + snippet: String, + first_generator: DefId, + last_generator: Option, + trait_ref: ty::TraitRef<'_>, + target_ty: Ty<'tcx>, + tables: &ty::TypeckTables<'_>, + obligation: &PredicateObligation<'tcx>, + next_code: Option<&ObligationCauseCode<'tcx>>, + ) { + let source_map = self.tcx.sess.source_map(); + + let is_async_fn = self + .tcx + .parent(first_generator) + .map(|parent_did| self.tcx.asyncness(parent_did)) + .map(|parent_asyncness| parent_asyncness == hir::IsAsync::Async) + .unwrap_or(false); + let is_async_move = self + .tcx + .hir() + .as_local_hir_id(first_generator) + .and_then(|hir_id| self.tcx.hir().maybe_body_owned_by(hir_id)) + .map(|body_id| self.tcx.hir().body(body_id)) + .and_then(|body| body.generator_kind()) + .map(|generator_kind| match generator_kind { + hir::GeneratorKind::Async(..) => true, + _ => false, + }) + .unwrap_or(false); + let await_or_yield = if is_async_fn || is_async_move { "await" } else { "yield" }; + + // Special case the primary error message when send or sync is the trait that was + // not implemented. + let is_send = self.tcx.is_diagnostic_item(sym::send_trait, trait_ref.def_id); + let is_sync = self.tcx.is_diagnostic_item(sym::sync_trait, trait_ref.def_id); + let hir = self.tcx.hir(); + let trait_explanation = if is_send || is_sync { + let (trait_name, trait_verb) = + if is_send { ("`Send`", "sent") } else { ("`Sync`", "shared") }; + + err.clear_code(); + err.set_primary_message(format!( + "future cannot be {} between threads safely", + trait_verb + )); + + let original_span = err.span.primary_span().unwrap(); + let mut span = MultiSpan::from_span(original_span); + + let message = if let Some(name) = last_generator + .and_then(|generator_did| self.tcx.parent(generator_did)) + .and_then(|parent_did| hir.as_local_hir_id(parent_did)) + .and_then(|parent_hir_id| hir.opt_name(parent_hir_id)) + { + format!("future returned by `{}` is not {}", name, trait_name) + } else { + format!("future is not {}", trait_name) + }; + + span.push_span_label(original_span, message); + err.set_span(span); + + format!("is not {}", trait_name) + } else { + format!("does not implement `{}`", trait_ref.print_only_trait_path()) + }; + + // Look at the last interior type to get a span for the `.await`. + let await_span = tables.generator_interior_types.iter().map(|t| t.span).last().unwrap(); + let mut span = MultiSpan::from_span(await_span); + span.push_span_label( + await_span, + format!("{} occurs here, with `{}` maybe used later", await_or_yield, snippet), + ); + + span.push_span_label(target_span, format!("has type `{}`", target_ty)); + + // If available, use the scope span to annotate the drop location. + if let Some(scope_span) = scope_span { + span.push_span_label( + source_map.end_point(*scope_span), + format!("`{}` is later dropped here", snippet), + ); + } + + err.span_note( + span, + &format!( + "future {} as this value is used across an {}", + trait_explanation, await_or_yield, + ), + ); + + if let Some(expr_id) = expr { + let expr = hir.expect_expr(expr_id); + debug!("target_ty evaluated from {:?}", expr); + + let parent = hir.get_parent_node(expr_id); + if let Some(hir::Node::Expr(e)) = hir.find(parent) { + let parent_span = hir.span(parent); + let parent_did = parent.owner_def_id(); + // ```rust + // impl T { + // fn foo(&self) -> i32 {} + // } + // T.foo(); + // ^^^^^^^ a temporary `&T` created inside this method call due to `&self` + // ``` + // + let is_region_borrow = + tables.expr_adjustments(expr).iter().any(|adj| adj.is_region_borrow()); + + // ```rust + // struct Foo(*const u8); + // bar(Foo(std::ptr::null())).await; + // ^^^^^^^^^^^^^^^^^^^^^ raw-ptr `*T` created inside this struct ctor. + // ``` + debug!("parent_def_kind: {:?}", self.tcx.def_kind(parent_did)); + let is_raw_borrow_inside_fn_like_call = match self.tcx.def_kind(parent_did) { + Some(DefKind::Fn) | Some(DefKind::Ctor(..)) => target_ty.is_unsafe_ptr(), + _ => false, + }; + + if (tables.is_method_call(e) && is_region_borrow) + || is_raw_borrow_inside_fn_like_call + { + err.span_help( + parent_span, + "consider moving this into a `let` \ + binding to create a shorter lived borrow", + ); + } + } + } + + // Add a note for the item obligation that remains - normally a note pointing to the + // bound that introduced the obligation (e.g. `T: Send`). + debug!("note_obligation_cause_for_async_await: next_code={:?}", next_code); + self.note_obligation_cause_code( + err, + &obligation.predicate, + next_code.unwrap(), + &mut Vec::new(), + ); + } + + crate fn note_obligation_cause_code( + &self, + err: &mut DiagnosticBuilder<'_>, + predicate: &T, + cause_code: &ObligationCauseCode<'tcx>, + obligated_types: &mut Vec<&ty::TyS<'tcx>>, + ) where + T: fmt::Display, + { + let tcx = self.tcx; + match *cause_code { + ObligationCauseCode::ExprAssignable + | ObligationCauseCode::MatchExpressionArm { .. } + | ObligationCauseCode::Pattern { .. } + | ObligationCauseCode::IfExpression { .. } + | ObligationCauseCode::IfExpressionWithNoElse + | ObligationCauseCode::MainFunctionType + | ObligationCauseCode::StartFunctionType + | ObligationCauseCode::IntrinsicType + | ObligationCauseCode::MethodReceiver + | ObligationCauseCode::ReturnNoExpression + | ObligationCauseCode::MiscObligation => {} + ObligationCauseCode::SliceOrArrayElem => { + err.note("slice and array elements must have `Sized` type"); + } + ObligationCauseCode::TupleElem => { + err.note("only the last element of a tuple may have a dynamically sized type"); + } + ObligationCauseCode::ProjectionWf(data) => { + err.note(&format!("required so that the projection `{}` is well-formed", data,)); + } + ObligationCauseCode::ReferenceOutlivesReferent(ref_ty) => { + err.note(&format!( + "required so that reference `{}` does not outlive its referent", + ref_ty, + )); + } + ObligationCauseCode::ObjectTypeBound(object_ty, region) => { + err.note(&format!( + "required so that the lifetime bound of `{}` for `{}` is satisfied", + region, object_ty, + )); + } + ObligationCauseCode::ItemObligation(item_def_id) => { + let item_name = tcx.def_path_str(item_def_id); + let msg = format!("required by `{}`", item_name); + + if let Some(sp) = tcx.hir().span_if_local(item_def_id) { + let sp = tcx.sess.source_map().def_span(sp); + err.span_label(sp, &msg); + } else { + err.note(&msg); + } + } + ObligationCauseCode::BindingObligation(item_def_id, span) => { + let item_name = tcx.def_path_str(item_def_id); + let msg = format!("required by this bound in `{}`", item_name); + if let Some(ident) = tcx.opt_item_name(item_def_id) { + err.span_label(ident.span, ""); + } + if span != DUMMY_SP { + err.span_label(span, &msg); + } else { + err.note(&msg); + } + } + ObligationCauseCode::ObjectCastObligation(object_ty) => { + err.note(&format!( + "required for the cast to the object type `{}`", + self.ty_to_string(object_ty) + )); + } + ObligationCauseCode::Coercion { source: _, target } => { + err.note(&format!("required by cast to type `{}`", self.ty_to_string(target))); + } + ObligationCauseCode::RepeatVec(suggest_const_in_array_repeat_expressions) => { + err.note( + "the `Copy` trait is required because the repeated element will be copied", + ); + if suggest_const_in_array_repeat_expressions { + err.note( + "this array initializer can be evaluated at compile-time, for more \ + information, see issue \ + https://github.com/rust-lang/rust/issues/49147", + ); + if tcx.sess.opts.unstable_features.is_nightly_build() { + err.help( + "add `#![feature(const_in_array_repeat_expressions)]` to the \ + crate attributes to enable", + ); + } + } + } + ObligationCauseCode::VariableType(_) => { + err.note("all local variables must have a statically known size"); + if !self.tcx.features().unsized_locals { + err.help("unsized locals are gated as an unstable feature"); + } + } + ObligationCauseCode::SizedArgumentType => { + err.note("all function arguments must have a statically known size"); + if !self.tcx.features().unsized_locals { + err.help("unsized locals are gated as an unstable feature"); + } + } + ObligationCauseCode::SizedReturnType => { + err.note("the return type of a function must have a statically known size"); + } + ObligationCauseCode::SizedYieldType => { + err.note("the yield type of a generator must have a statically known size"); + } + ObligationCauseCode::AssignmentLhsSized => { + err.note("the left-hand-side of an assignment must have a statically known size"); + } + ObligationCauseCode::TupleInitializerSized => { + err.note("tuples must have a statically known size to be initialized"); + } + ObligationCauseCode::StructInitializerSized => { + err.note("structs must have a statically known size to be initialized"); + } + ObligationCauseCode::FieldSized { adt_kind: ref item, last } => match *item { + AdtKind::Struct => { + if last { + err.note( + "the last field of a packed struct may only have a \ + dynamically sized type if it does not need drop to be run", + ); + } else { + err.note( + "only the last field of a struct may have a dynamically sized type", + ); + } + } + AdtKind::Union => { + err.note("no field of a union may have a dynamically sized type"); + } + AdtKind::Enum => { + err.note("no field of an enum variant may have a dynamically sized type"); + } + }, + ObligationCauseCode::ConstSized => { + err.note("constant expressions must have a statically known size"); + } + ObligationCauseCode::ConstPatternStructural => { + err.note("constants used for pattern-matching must derive `PartialEq` and `Eq`"); + } + ObligationCauseCode::SharedStatic => { + err.note("shared static variables must have a type that implements `Sync`"); + } + ObligationCauseCode::BuiltinDerivedObligation(ref data) => { + let parent_trait_ref = self.resolve_vars_if_possible(&data.parent_trait_ref); + let ty = parent_trait_ref.skip_binder().self_ty(); + err.note(&format!("required because it appears within the type `{}`", ty)); + obligated_types.push(ty); + + let parent_predicate = parent_trait_ref.without_const().to_predicate(); + if !self.is_recursive_obligation(obligated_types, &data.parent_code) { + self.note_obligation_cause_code( + err, + &parent_predicate, + &data.parent_code, + obligated_types, + ); + } + } + ObligationCauseCode::ImplDerivedObligation(ref data) => { + let parent_trait_ref = self.resolve_vars_if_possible(&data.parent_trait_ref); + err.note(&format!( + "required because of the requirements on the impl of `{}` for `{}`", + parent_trait_ref.print_only_trait_path(), + parent_trait_ref.skip_binder().self_ty() + )); + let parent_predicate = parent_trait_ref.without_const().to_predicate(); + self.note_obligation_cause_code( + err, + &parent_predicate, + &data.parent_code, + obligated_types, + ); + } + ObligationCauseCode::CompareImplMethodObligation { .. } => { + err.note(&format!( + "the requirement `{}` appears on the impl method \ + but not on the corresponding trait method", + predicate + )); + } + ObligationCauseCode::CompareImplTypeObligation { .. } => { + err.note(&format!( + "the requirement `{}` appears on the associated impl type \ + but not on the corresponding associated trait type", + predicate + )); + } + ObligationCauseCode::ReturnType + | ObligationCauseCode::ReturnValue(_) + | ObligationCauseCode::BlockTailExpression(_) => (), + ObligationCauseCode::TrivialBound => { + err.help("see issue #48214"); + if tcx.sess.opts.unstable_features.is_nightly_build() { + err.help("add `#![feature(trivial_bounds)]` to the crate attributes to enable"); + } + } + ObligationCauseCode::AssocTypeBound(ref data) => { + err.span_label(data.original, "associated type defined here"); + if let Some(sp) = data.impl_span { + err.span_label(sp, "in this `impl` item"); + } + for sp in &data.bounds { + err.span_label(*sp, "restricted in this bound"); + } + } + } + } + + crate fn suggest_new_overflow_limit(&self, err: &mut DiagnosticBuilder<'_>) { + let current_limit = self.tcx.sess.recursion_limit.get(); + let suggested_limit = current_limit * 2; + err.help(&format!( + "consider adding a `#![recursion_limit=\"{}\"]` attribute to your crate", + suggested_limit + )); + } +} + +/// Suggest restricting a type param with a new bound. +pub fn suggest_constraining_type_param( + generics: &hir::Generics<'_>, + err: &mut DiagnosticBuilder<'_>, + param_name: &str, + constraint: &str, + source_map: &SourceMap, + span: Span, +) -> bool { + let restrict_msg = "consider further restricting this bound"; + if let Some(param) = + generics.params.iter().filter(|p| p.name.ident().as_str() == param_name).next() + { + if param_name.starts_with("impl ") { + // `impl Trait` in argument: + // `fn foo(x: impl Trait) {}` → `fn foo(t: impl Trait + Trait2) {}` + err.span_suggestion( + param.span, + restrict_msg, + // `impl CurrentTrait + MissingTrait` + format!("{} + {}", param_name, constraint), + Applicability::MachineApplicable, + ); + } else if generics.where_clause.predicates.is_empty() && param.bounds.is_empty() { + // If there are no bounds whatsoever, suggest adding a constraint + // to the type parameter: + // `fn foo(t: T) {}` → `fn foo(t: T) {}` + err.span_suggestion( + param.span, + "consider restricting this bound", + format!("{}: {}", param_name, constraint), + Applicability::MachineApplicable, + ); + } else if !generics.where_clause.predicates.is_empty() { + // There is a `where` clause, so suggest expanding it: + // `fn foo(t: T) where T: Debug {}` → + // `fn foo(t: T) where T: Debug, T: Trait {}` + err.span_suggestion( + generics.where_clause.span().unwrap().shrink_to_hi(), + &format!("consider further restricting type parameter `{}`", param_name), + format!(", {}: {}", param_name, constraint), + Applicability::MachineApplicable, + ); + } else { + // If there is no `where` clause lean towards constraining to the + // type parameter: + // `fn foo(t: T, x: X) {}` → `fn foo(t: T) {}` + // `fn foo(t: T) {}` → `fn foo(t: T) {}` + let sp = param.span.with_hi(span.hi()); + let span = source_map.span_through_char(sp, ':'); + if sp != param.span && sp != span { + // Only suggest if we have high certainty that the span + // covers the colon in `foo`. + err.span_suggestion( + span, + restrict_msg, + format!("{}: {} + ", param_name, constraint), + Applicability::MachineApplicable, + ); + } else { + err.span_label( + param.span, + &format!("consider adding a `where {}: {}` bound", param_name, constraint), + ); + } + } + return true; + } + false +} + +/// Collect all the returned expressions within the input expression. +/// Used to point at the return spans when we want to suggest some change to them. +#[derive(Default)] +struct ReturnsVisitor<'v> { + returns: Vec<&'v hir::Expr<'v>>, + in_block_tail: bool, +} + +impl<'v> Visitor<'v> for ReturnsVisitor<'v> { + type Map = rustc::hir::map::Map<'v>; + + fn nested_visit_map(&mut self) -> hir::intravisit::NestedVisitorMap<'_, Self::Map> { + hir::intravisit::NestedVisitorMap::None + } + + fn visit_expr(&mut self, ex: &'v hir::Expr<'v>) { + // Visit every expression to detect `return` paths, either through the function's tail + // expression or `return` statements. We walk all nodes to find `return` statements, but + // we only care about tail expressions when `in_block_tail` is `true`, which means that + // they're in the return path of the function body. + match ex.kind { + hir::ExprKind::Ret(Some(ex)) => { + self.returns.push(ex); + } + hir::ExprKind::Block(block, _) if self.in_block_tail => { + self.in_block_tail = false; + for stmt in block.stmts { + hir::intravisit::walk_stmt(self, stmt); + } + self.in_block_tail = true; + if let Some(expr) = block.expr { + self.visit_expr(expr); + } + } + hir::ExprKind::Match(_, arms, _) if self.in_block_tail => { + for arm in arms { + self.visit_expr(arm.body); + } + } + // We need to walk to find `return`s in the entire body. + _ if !self.in_block_tail => hir::intravisit::walk_expr(self, ex), + _ => self.returns.push(ex), + } + } + + fn visit_body(&mut self, body: &'v hir::Body<'v>) { + assert!(!self.in_block_tail); + if body.generator_kind().is_none() { + if let hir::ExprKind::Block(block, None) = body.value.kind { + if block.expr.is_some() { + self.in_block_tail = true; + } + } + } + hir::intravisit::walk_body(self, body); + } +} diff --git a/src/librustc/traits/fulfill.rs b/src/librustc/traits/fulfill.rs index 27731990d2..0aac6fb81e 100644 --- a/src/librustc/traits/fulfill.rs +++ b/src/librustc/traits/fulfill.rs @@ -1,26 +1,28 @@ use crate::infer::{InferCtxt, ShallowResolver}; -use crate::mir::interpret::{GlobalId, ErrorHandled}; -use crate::ty::{self, Ty, TypeFoldable, ToPolyTraitRef}; use crate::ty::error::ExpectedFound; +use crate::ty::{self, ToPolyTraitRef, Ty, TypeFoldable}; +use rustc_data_structures::obligation_forest::ProcessResult; use rustc_data_structures::obligation_forest::{DoCompleted, Error, ForestObligation}; use rustc_data_structures::obligation_forest::{ObligationForest, ObligationProcessor}; -use rustc_data_structures::obligation_forest::{ProcessResult}; use std::marker::PhantomData; +use super::engine::{TraitEngine, TraitEngineExt}; +use super::project; +use super::select::SelectionContext; +use super::wf; use super::CodeAmbiguity; use super::CodeProjectionError; use super::CodeSelectionError; -use super::engine::{TraitEngine, TraitEngineExt}; +use super::{ConstEvalFailure, Unimplemented}; use super::{FulfillmentError, FulfillmentErrorCode}; use super::{ObligationCause, PredicateObligation}; -use super::project; -use super::select::SelectionContext; -use super::{Unimplemented, ConstEvalFailure}; impl<'tcx> ForestObligation for PendingPredicateObligation<'tcx> { type Predicate = ty::Predicate<'tcx>; - fn as_predicate(&self) -> &Self::Predicate { &self.obligation.predicate } + fn as_predicate(&self) -> &Self::Predicate { + &self.obligation.predicate + } } /// The fulfillment context is used to drive trait resolution. It @@ -59,7 +61,7 @@ pub struct FulfillmentContext<'tcx> { // other fulfillment contexts sometimes do live inside of // a snapshot (they don't *straddle* a snapshot, so there // is no trouble there). - usable_in_snapshot: bool + usable_in_snapshot: bool, } #[derive(Clone, Debug)] @@ -94,7 +96,7 @@ impl<'a, 'tcx> FulfillmentContext<'tcx> { FulfillmentContext { predicates: ObligationForest::new(), register_region_obligations: false, - usable_in_snapshot: false + usable_in_snapshot: false, } } @@ -111,18 +113,19 @@ impl<'a, 'tcx> FulfillmentContext<'tcx> { debug!("select: starting another iteration"); // Process pending obligations. - let outcome = self.predicates.process_obligations(&mut FulfillProcessor { - selcx, - register_region_obligations: self.register_region_obligations - }, DoCompleted::No); + let outcome = self.predicates.process_obligations( + &mut FulfillProcessor { + selcx, + register_region_obligations: self.register_region_obligations, + }, + DoCompleted::No, + ); debug!("select: outcome={:#?}", outcome); // FIXME: if we kept the original cache key, we could mark projection // obligations as complete for the projection cache here. - errors.extend( - outcome.errors.into_iter() - .map(|e| to_fulfillment_error(e))); + errors.extend(outcome.errors.into_iter().map(|e| to_fulfillment_error(e))); // If nothing new was added, no need to keep looping. if outcome.stalled { @@ -130,14 +133,13 @@ impl<'a, 'tcx> FulfillmentContext<'tcx> { } } - debug!("select({} predicates remaining, {} errors) done", - self.predicates.len(), errors.len()); + debug!( + "select({} predicates remaining, {} errors) done", + self.predicates.len(), + errors.len() + ); - if errors.is_empty() { - Ok(()) - } else { - Err(errors) - } + if errors.is_empty() { Ok(()) } else { Err(errors) } } } @@ -156,8 +158,7 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentContext<'tcx> { projection_ty: ty::ProjectionTy<'tcx>, cause: ObligationCause<'tcx>, ) -> Ty<'tcx> { - debug!("normalize_projection_type(projection_ty={:?})", - projection_ty); + debug!("normalize_projection_type(projection_ty={:?})", projection_ty); debug_assert!(!projection_ty.has_escaping_bound_vars()); @@ -165,12 +166,14 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentContext<'tcx> { let mut selcx = SelectionContext::new(infcx); let mut obligations = vec![]; - let normalized_ty = project::normalize_projection_type(&mut selcx, - param_env, - projection_ty, - cause, - 0, - &mut obligations); + let normalized_ty = project::normalize_projection_type( + &mut selcx, + param_env, + projection_ty, + cause, + 0, + &mut obligations, + ); self.register_predicate_obligations(infcx, obligations); debug!("normalize_projection_type: result={:?}", normalized_ty); @@ -191,10 +194,8 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentContext<'tcx> { assert!(!infcx.is_in_snapshot() || self.usable_in_snapshot); - self.predicates.register_obligation(PendingPredicateObligation { - obligation, - stalled_on: vec![] - }); + self.predicates + .register_obligation(PendingPredicateObligation { obligation, stalled_on: vec![] }); } fn select_all_or_error( @@ -203,16 +204,13 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentContext<'tcx> { ) -> Result<(), Vec>> { self.select_where_possible(infcx)?; - let errors: Vec<_> = - self.predicates.to_errors(CodeAmbiguity) - .into_iter() - .map(|e| to_fulfillment_error(e)) - .collect(); - if errors.is_empty() { - Ok(()) - } else { - Err(errors) - } + let errors: Vec<_> = self + .predicates + .to_errors(CodeAmbiguity) + .into_iter() + .map(|e| to_fulfillment_error(e)) + .collect(); + if errors.is_empty() { Ok(()) } else { Err(errors) } } fn select_where_possible( @@ -234,10 +232,9 @@ struct FulfillProcessor<'a, 'b, 'tcx> { } fn mk_pending(os: Vec>) -> Vec> { - os.into_iter().map(|o| PendingPredicateObligation { - obligation: o, - stalled_on: vec![] - }).collect() + os.into_iter() + .map(|o| PendingPredicateObligation { obligation: o, stalled_on: vec![] }) + .collect() } impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> { @@ -285,10 +282,11 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> { }; if !change { - debug!("process_predicate: pending obligation {:?} still stalled on {:?}", - self.selcx.infcx() - .resolve_vars_if_possible(&pending_obligation.obligation), - pending_obligation.stalled_on); + debug!( + "process_predicate: pending obligation {:?} still stalled on {:?}", + self.selcx.infcx().resolve_vars_if_possible(&pending_obligation.obligation), + pending_obligation.stalled_on + ); return ProcessResult::Unchanged; } @@ -313,28 +311,34 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> { } match obligation.predicate { - ty::Predicate::Trait(ref data) => { + ty::Predicate::Trait(ref data, _) => { let trait_obligation = obligation.with(data.clone()); if data.is_global() { // no type variables present, can use evaluation for better caching. // FIXME: consider caching errors too. if self.selcx.infcx().predicate_must_hold_considering_regions(&obligation) { - debug!("selecting trait `{:?}` at depth {} evaluated to holds", - data, obligation.recursion_depth); - return ProcessResult::Changed(vec![]) + debug!( + "selecting trait `{:?}` at depth {} evaluated to holds", + data, obligation.recursion_depth + ); + return ProcessResult::Changed(vec![]); } } match self.selcx.select(&trait_obligation) { Ok(Some(vtable)) => { - debug!("selecting trait `{:?}` at depth {} yielded Ok(Some)", - data, obligation.recursion_depth); + debug!( + "selecting trait `{:?}` at depth {} yielded Ok(Some)", + data, obligation.recursion_depth + ); ProcessResult::Changed(mk_pending(vtable.nested_obligations())) } Ok(None) => { - debug!("selecting trait `{:?}` at depth {} yielded Ok(None)", - data, obligation.recursion_depth); + debug!( + "selecting trait `{:?}` at depth {} yielded Ok(None)", + data, obligation.recursion_depth + ); // This is a bit subtle: for the most part, the // only reason we can fail to make progress on @@ -352,15 +356,19 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> { pending_obligation.stalled_on = trait_ref_type_vars(self.selcx, data.to_poly_trait_ref()); - debug!("process_predicate: pending obligation {:?} now stalled on {:?}", - self.selcx.infcx().resolve_vars_if_possible(obligation), - pending_obligation.stalled_on); + debug!( + "process_predicate: pending obligation {:?} now stalled on {:?}", + self.selcx.infcx().resolve_vars_if_possible(obligation), + pending_obligation.stalled_on + ); ProcessResult::Unchanged } Err(selection_err) => { - info!("selecting trait `{:?}` at depth {} yielded Err", - data, obligation.recursion_depth); + info!( + "selecting trait `{:?}` at depth {} yielded Err", + data, obligation.recursion_depth + ); ProcessResult::Error(CodeSelectionError(selection_err)) } @@ -387,9 +395,7 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> { // If so, this obligation is an error (for now). Eventually we should be // able to support additional cases here, like `for<'a> &'a str: 'a`. // NOTE: this is duplicate-implemented between here and fulfillment. - None => { - ProcessResult::Error(CodeSelectionError(Unimplemented)) - } + None => ProcessResult::Error(CodeSelectionError(Unimplemented)), // Otherwise, we have something of the form // `for<'a> T: 'a where 'a not in T`, which we can treat as // `T: 'static`. @@ -430,7 +436,7 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> { ProcessResult::Unchanged } Ok(Some(os)) => ProcessResult::Changed(mk_pending(os)), - Err(e) => ProcessResult::Error(CodeProjectionError(e)) + Err(e) => ProcessResult::Error(CodeProjectionError(e)), } } @@ -451,14 +457,12 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> { ProcessResult::Error(CodeSelectionError(Unimplemented)) } } - None => { - ProcessResult::Unchanged - } + None => ProcessResult::Unchanged, } } ty::Predicate::WellFormed(ty) => { - match ty::wf::obligations( + match wf::obligations( self.selcx.infcx(), obligation.param_env, obligation.cause.body_id, @@ -469,59 +473,55 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> { pending_obligation.stalled_on = vec![infer_ty(ty)]; ProcessResult::Unchanged } - Some(os) => ProcessResult::Changed(mk_pending(os)) + Some(os) => ProcessResult::Changed(mk_pending(os)), } } ty::Predicate::Subtype(ref subtype) => { - match self.selcx.infcx().subtype_predicate(&obligation.cause, - obligation.param_env, - subtype) { + match self.selcx.infcx().subtype_predicate( + &obligation.cause, + obligation.param_env, + subtype, + ) { None => { // None means that both are unresolved. - pending_obligation.stalled_on = vec![infer_ty(subtype.skip_binder().a), - infer_ty(subtype.skip_binder().b)]; + pending_obligation.stalled_on = vec![ + infer_ty(subtype.skip_binder().a), + infer_ty(subtype.skip_binder().b), + ]; ProcessResult::Unchanged } - Some(Ok(ok)) => { - ProcessResult::Changed(mk_pending(ok.obligations)) - } + Some(Ok(ok)) => ProcessResult::Changed(mk_pending(ok.obligations)), Some(Err(err)) => { - let expected_found = ExpectedFound::new(subtype.skip_binder().a_is_expected, - subtype.skip_binder().a, - subtype.skip_binder().b); - ProcessResult::Error( - FulfillmentErrorCode::CodeSubtypeError(expected_found, err)) + let expected_found = ExpectedFound::new( + subtype.skip_binder().a_is_expected, + subtype.skip_binder().a, + subtype.skip_binder().b, + ); + ProcessResult::Error(FulfillmentErrorCode::CodeSubtypeError( + expected_found, + err, + )) } } } ty::Predicate::ConstEvaluatable(def_id, substs) => { if obligation.param_env.has_local_value() { - ProcessResult::Unchanged + ProcessResult::Unchanged } else { if !substs.has_local_value() { - let instance = ty::Instance::resolve( - self.selcx.tcx(), + match self.selcx.tcx().const_eval_resolve( obligation.param_env, def_id, substs, - ); - if let Some(instance) = instance { - let cid = GlobalId { - instance, - promoted: None, - }; - match self.selcx.tcx().at(obligation.cause.span) - .const_eval(obligation.param_env.and(cid)) { - Ok(_) => ProcessResult::Changed(vec![]), - Err(err) => ProcessResult::Error( - CodeSelectionError(ConstEvalFailure(err))) + None, + Some(obligation.cause.span), + ) { + Ok(_) => ProcessResult::Changed(vec![]), + Err(err) => { + ProcessResult::Error(CodeSelectionError(ConstEvalFailure(err))) } - } else { - ProcessResult::Error(CodeSelectionError( - ConstEvalFailure(ErrorHandled::TooGeneric) - )) } } else { pending_obligation.stalled_on = @@ -533,9 +533,12 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> { } } - fn process_backedge<'c, I>(&mut self, cycle: I, - _marker: PhantomData<&'c PendingPredicateObligation<'tcx>>) - where I: Clone + Iterator>, + fn process_backedge<'c, I>( + &mut self, + cycle: I, + _marker: PhantomData<&'c PendingPredicateObligation<'tcx>>, + ) where + I: Clone + Iterator>, { if self.selcx.coinductive_match(cycle.clone().map(|s| s.obligation.predicate)) { debug!("process_child_obligations: coinductive match"); @@ -552,18 +555,20 @@ fn trait_ref_type_vars<'a, 'tcx>( t: ty::PolyTraitRef<'tcx>, ) -> Vec { t.skip_binder() // ok b/c this check doesn't care about regions - .input_types() - .map(|t| selcx.infcx().resolve_vars_if_possible(&t)) - .filter(|t| t.has_infer_types()) - .flat_map(|t| t.walk()) - .filter_map(|t| match t.kind { ty::Infer(infer) => Some(infer), _ => None }) - .collect() + .input_types() + .map(|t| selcx.infcx().resolve_vars_if_possible(&t)) + .filter(|t| t.has_infer_types()) + .flat_map(|t| t.walk()) + .filter_map(|t| match t.kind { + ty::Infer(infer) => Some(infer), + _ => None, + }) + .collect() } fn to_fulfillment_error<'tcx>( - error: Error, FulfillmentErrorCode<'tcx>>) - -> FulfillmentError<'tcx> -{ + error: Error, FulfillmentErrorCode<'tcx>>, +) -> FulfillmentError<'tcx> { let obligation = error.backtrace.into_iter().next().unwrap().obligation; FulfillmentError::new(obligation, error.error) } diff --git a/src/librustc/traits/misc.rs b/src/librustc/traits/misc.rs new file mode 100644 index 0000000000..08c3a77bf3 --- /dev/null +++ b/src/librustc/traits/misc.rs @@ -0,0 +1,202 @@ +//! Miscellaneous type-system utilities that are too small to deserve their own modules. + +use crate::middle::lang_items; +use crate::traits::{self, ObligationCause}; +use crate::ty::util::NeedsDrop; +use crate::ty::{self, Ty, TyCtxt, TypeFoldable}; + +use rustc_hir as hir; +use rustc_span::DUMMY_SP; + +#[derive(Clone)] +pub enum CopyImplementationError<'tcx> { + InfrigingFields(Vec<&'tcx ty::FieldDef>), + NotAnAdt, + HasDestructor, +} + +pub fn can_type_implement_copy( + tcx: TyCtxt<'tcx>, + param_env: ty::ParamEnv<'tcx>, + self_type: Ty<'tcx>, +) -> Result<(), CopyImplementationError<'tcx>> { + // FIXME: (@jroesch) float this code up + tcx.infer_ctxt().enter(|infcx| { + let (adt, substs) = match self_type.kind { + // These types used to have a builtin impl. + // Now libcore provides that impl. + ty::Uint(_) + | ty::Int(_) + | ty::Bool + | ty::Float(_) + | ty::Char + | ty::RawPtr(..) + | ty::Never + | ty::Ref(_, _, hir::Mutability::Not) => return Ok(()), + + ty::Adt(adt, substs) => (adt, substs), + + _ => return Err(CopyImplementationError::NotAnAdt), + }; + + let mut infringing = Vec::new(); + for variant in &adt.variants { + for field in &variant.fields { + let ty = field.ty(tcx, substs); + if ty.references_error() { + continue; + } + let span = tcx.def_span(field.did); + let cause = ObligationCause { span, ..ObligationCause::dummy() }; + let ctx = traits::FulfillmentContext::new(); + match traits::fully_normalize(&infcx, ctx, cause, param_env, &ty) { + Ok(ty) => { + if !infcx.type_is_copy_modulo_regions(param_env, ty, span) { + infringing.push(field); + } + } + Err(errors) => { + infcx.report_fulfillment_errors(&errors, None, false); + } + }; + } + } + if !infringing.is_empty() { + return Err(CopyImplementationError::InfrigingFields(infringing)); + } + if adt.has_dtor(tcx) { + return Err(CopyImplementationError::HasDestructor); + } + + Ok(()) + }) +} + +fn is_copy_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool { + is_item_raw(tcx, query, lang_items::CopyTraitLangItem) +} + +fn is_sized_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool { + is_item_raw(tcx, query, lang_items::SizedTraitLangItem) +} + +fn is_freeze_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool { + is_item_raw(tcx, query, lang_items::FreezeTraitLangItem) +} + +fn is_item_raw<'tcx>( + tcx: TyCtxt<'tcx>, + query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>, + item: lang_items::LangItem, +) -> bool { + let (param_env, ty) = query.into_parts(); + let trait_def_id = tcx.require_lang_item(item, None); + tcx.infer_ctxt().enter(|infcx| { + traits::type_known_to_meet_bound_modulo_regions( + &infcx, + param_env, + ty, + trait_def_id, + DUMMY_SP, + ) + }) +} + +fn needs_drop_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> NeedsDrop { + let (param_env, ty) = query.into_parts(); + + let needs_drop = |ty: Ty<'tcx>| -> bool { tcx.needs_drop_raw(param_env.and(ty)).0 }; + + assert!(!ty.needs_infer()); + + NeedsDrop(match ty.kind { + // Fast-path for primitive types + ty::Infer(ty::FreshIntTy(_)) + | ty::Infer(ty::FreshFloatTy(_)) + | ty::Bool + | ty::Int(_) + | ty::Uint(_) + | ty::Float(_) + | ty::Never + | ty::FnDef(..) + | ty::FnPtr(_) + | ty::Char + | ty::GeneratorWitness(..) + | ty::RawPtr(_) + | ty::Ref(..) + | ty::Str => false, + + // Foreign types can never have destructors + ty::Foreign(..) => false, + + // `ManuallyDrop` doesn't have a destructor regardless of field types. + ty::Adt(def, _) if Some(def.did) == tcx.lang_items().manually_drop() => false, + + // Issue #22536: We first query `is_copy_modulo_regions`. It sees a + // normalized version of the type, and therefore will definitely + // know whether the type implements Copy (and thus needs no + // cleanup/drop/zeroing) ... + _ if ty.is_copy_modulo_regions(tcx, param_env, DUMMY_SP) => false, + + // ... (issue #22536 continued) but as an optimization, still use + // prior logic of asking for the structural "may drop". + + // FIXME(#22815): Note that this is a conservative heuristic; + // it may report that the type "may drop" when actual type does + // not actually have a destructor associated with it. But since + // the type absolutely did not have the `Copy` bound attached + // (see above), it is sound to treat it as having a destructor. + + // User destructors are the only way to have concrete drop types. + ty::Adt(def, _) if def.has_dtor(tcx) => true, + + // Can refer to a type which may drop. + // FIXME(eddyb) check this against a ParamEnv. + ty::Dynamic(..) + | ty::Projection(..) + | ty::Param(_) + | ty::Bound(..) + | ty::Placeholder(..) + | ty::Opaque(..) + | ty::Infer(_) + | ty::Error => true, + + ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"), + + // Zero-length arrays never contain anything to drop. + ty::Array(_, len) if len.try_eval_usize(tcx, param_env) == Some(0) => false, + + // Structural recursion. + ty::Array(ty, _) | ty::Slice(ty) => needs_drop(ty), + + ty::Closure(def_id, ref substs) => { + substs.as_closure().upvar_tys(def_id, tcx).any(needs_drop) + } + + // Pessimistically assume that all generators will require destructors + // as we don't know if a destructor is a noop or not until after the MIR + // state transformation pass + ty::Generator(..) => true, + + ty::Tuple(..) => ty.tuple_fields().any(needs_drop), + + // unions don't have destructors because of the child types, + // only if they manually implement `Drop` (handled above). + ty::Adt(def, _) if def.is_union() => false, + + ty::Adt(def, substs) => def + .variants + .iter() + .any(|variant| variant.fields.iter().any(|field| needs_drop(field.ty(tcx, substs)))), + }) +} + +pub fn provide(providers: &mut ty::query::Providers<'_>) { + *providers = ty::query::Providers { + is_copy_raw, + is_sized_raw, + is_freeze_raw, + needs_drop_raw, + ..*providers + }; +} diff --git a/src/librustc/traits/mod.rs b/src/librustc/traits/mod.rs index d94e004db2..daaba95cf6 100644 --- a/src/librustc/traits/mod.rs +++ b/src/librustc/traits/mod.rs @@ -5,73 +5,85 @@ #[allow(dead_code)] pub mod auto_trait; mod chalk_fulfill; +pub mod codegen; mod coherence; -pub mod error_reporting; mod engine; +pub mod error_reporting; mod fulfill; -mod project; +pub mod misc; mod object_safety; mod on_unimplemented; +mod project; +pub mod query; mod select; mod specialize; mod structural_impls; -pub mod codegen; +mod structural_match; mod util; -pub mod query; +pub mod wf; -use chalk_engine; -use crate::hir; -use crate::hir::def_id::DefId; -use crate::infer::{InferCtxt, SuppressRegionErrors}; use crate::infer::outlives::env::OutlivesEnvironment; +use crate::infer::{InferCtxt, SuppressRegionErrors}; use crate::middle::region; use crate::mir::interpret::ErrorHandled; -use rustc_macros::HashStable; -use syntax::ast; -use syntax_pos::{Span, DUMMY_SP}; -use crate::ty::subst::{InternalSubsts, SubstsRef}; -use crate::ty::{self, AdtKind, List, Ty, TyCtxt, GenericParamDefKind, ToPredicate}; use crate::ty::error::{ExpectedFound, TypeError}; -use crate::ty::fold::{TypeFolder, TypeFoldable, TypeVisitor}; +use crate::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor}; +use crate::ty::subst::{InternalSubsts, SubstsRef}; +use crate::ty::{self, AdtKind, GenericParamDefKind, List, ToPredicate, Ty, TyCtxt, WithConstness}; use crate::util::common::ErrorReported; +use chalk_engine; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_macros::HashStable; +use rustc_span::{Span, DUMMY_SP}; +use syntax::ast; use std::fmt::Debug; use std::rc::Rc; -pub use self::SelectionError::*; pub use self::FulfillmentErrorCode::*; -pub use self::Vtable::*; pub use self::ObligationCauseCode::*; +pub use self::SelectionError::*; +pub use self::Vtable::*; pub use self::coherence::{add_placeholder_note, orphan_check, overlapping_impls}; pub use self::coherence::{OrphanCheckErr, OverlapResult}; +pub use self::engine::{TraitEngine, TraitEngineExt}; pub use self::fulfill::{FulfillmentContext, PendingPredicateObligation}; -pub use self::project::MismatchedProjectionTypes; -pub use self::project::{normalize, normalize_projection_type, poly_project_and_unify_type}; -pub use self::project::{ProjectionCache, ProjectionCacheSnapshot, Reveal, Normalized}; -pub use self::object_safety::ObjectSafetyViolation; +pub use self::object_safety::astconv_object_safety_violations; +pub use self::object_safety::is_vtable_safe_method; +pub use self::object_safety::object_safety_violations; pub use self::object_safety::MethodViolationCode; +pub use self::object_safety::ObjectSafetyViolation; pub use self::on_unimplemented::{OnUnimplementedDirective, OnUnimplementedNote}; -pub use self::select::{EvaluationCache, SelectionContext, SelectionCache}; +pub use self::project::MismatchedProjectionTypes; +pub use self::project::{normalize, normalize_projection_type, poly_project_and_unify_type}; +pub use self::project::{Normalized, ProjectionCache, ProjectionCacheSnapshot, Reveal}; +pub use self::select::{EvaluationCache, SelectionCache, SelectionContext}; pub use self::select::{EvaluationResult, IntercrateAmbiguityCause, OverflowError}; -pub use self::specialize::{OverlapError, specialization_graph, translate_substs}; pub use self::specialize::find_associated_item; pub use self::specialize::specialization_graph::FutureCompatOverlapError; pub use self::specialize::specialization_graph::FutureCompatOverlapErrorKind; -pub use self::engine::{TraitEngine, TraitEngineExt}; +pub use self::specialize::{specialization_graph, translate_substs, OverlapError}; +pub use self::structural_match::search_for_structural_match_violation; +pub use self::structural_match::type_marked_structural; +pub use self::structural_match::NonStructuralMatchTy; pub use self::util::{elaborate_predicates, elaborate_trait_ref, elaborate_trait_refs}; +pub use self::util::{expand_trait_aliases, TraitAliasExpander}; pub use self::util::{ - supertraits, supertrait_def_ids, transitive_bounds, Supertraits, SupertraitDefIds, + get_vtable_index_of_object_method, impl_is_default, impl_item_is_final, + predicate_for_trait_def, upcast_choices, +}; +pub use self::util::{ + supertrait_def_ids, supertraits, transitive_bounds, SupertraitDefIds, Supertraits, }; -pub use self::util::{expand_trait_aliases, TraitAliasExpander}; pub use self::chalk_fulfill::{ - CanonicalGoal as ChalkCanonicalGoal, - FulfillmentContext as ChalkFulfillmentContext + CanonicalGoal as ChalkCanonicalGoal, FulfillmentContext as ChalkFulfillmentContext, }; -pub use self::ObligationCauseCode::*; pub use self::FulfillmentErrorCode::*; +pub use self::ObligationCauseCode::*; pub use self::SelectionError::*; pub use self::Vtable::*; @@ -79,7 +91,7 @@ pub use self::Vtable::*; #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum IntercrateMode { Issue43355, - Fixed + Fixed, } /// The mode that trait queries run in. @@ -140,19 +152,19 @@ pub struct ObligationCause<'tcx> { /// information. pub body_id: hir::HirId, - pub code: ObligationCauseCode<'tcx> + pub code: ObligationCauseCode<'tcx>, } -impl<'tcx> ObligationCause<'tcx> { - pub fn span(&self, tcx: TyCtxt<'tcx>) -> Span { +impl ObligationCause<'_> { + pub fn span(&self, tcx: TyCtxt<'_>) -> Span { match self.code { - ObligationCauseCode::CompareImplMethodObligation { .. } | - ObligationCauseCode::MainFunctionType | - ObligationCauseCode::StartFunctionType => { - tcx.sess.source_map().def_span(self.span) - } - ObligationCauseCode::MatchExpressionArm( - box MatchExpressionArmCause { arm_span, .. }) => arm_span, + ObligationCauseCode::CompareImplMethodObligation { .. } + | ObligationCauseCode::MainFunctionType + | ObligationCauseCode::StartFunctionType => tcx.sess.source_map().def_span(self.span), + ObligationCauseCode::MatchExpressionArm(box MatchExpressionArmCause { + arm_span, + .. + }) => arm_span, _ => self.span, } } @@ -189,7 +201,10 @@ pub enum ObligationCauseCode<'tcx> { ObjectCastObligation(/* Object type */ Ty<'tcx>), /// Obligation incurred due to a coercion. - Coercion { source: Ty<'tcx>, target: Ty<'tcx> }, + Coercion { + source: Ty<'tcx>, + target: Ty<'tcx>, + }, /// Various cases where expressions must be `Sized` / `Copy` / etc. /// `L = X` implies that `L` is `Sized`. @@ -211,7 +226,10 @@ pub enum ObligationCauseCode<'tcx> { RepeatVec(bool), /// Types of fields (other than the last, except for packed structs) in a struct must be sized. - FieldSized { adt_kind: AdtKind, last: bool }, + FieldSized { + adt_kind: AdtKind, + last: bool, + }, /// Constant expressions must be sized. ConstSized, @@ -230,6 +248,13 @@ pub enum ObligationCauseCode<'tcx> { trait_item_def_id: DefId, }, + /// Error derived when matching traits/impls; see ObligationCause for more details + CompareImplTypeObligation { + item_name: ast::Name, + impl_item_def_id: DefId, + trait_item_def_id: DefId, + }, + /// Checking that this expression can be assigned where it needs to be // FIXME(eddyb) #11161 is the original Expr required? ExprAssignable, @@ -237,8 +262,15 @@ pub enum ObligationCauseCode<'tcx> { /// Computing common supertype in the arms of a match expression MatchExpressionArm(Box>), - /// Computing common supertype in the pattern guard for the arms of a match expression - MatchExpressionArmPattern { span: Span, ty: Ty<'tcx> }, + /// Type error arising from type checking a pattern against an expected type. + Pattern { + /// The span of the scrutinee or type expression which caused the `root_ty` type. + span: Option, + /// The root expected type induced by a scrutinee or type expression. + root_ty: Ty<'tcx>, + /// Whether the `Span` came from an expression or a type expression. + origin_expr: bool, + }, /// Constants in patterns must have `Structural` type. ConstPatternStructural, @@ -296,7 +328,7 @@ pub struct MatchExpressionArmCause<'tcx> { pub source: hir::MatchSource, pub prior_arms: Vec, pub last_ty: Ty<'tcx>, - pub discrim_hir_id: hir::HirId, + pub scrut_hir_id: hir::HirId, } #[derive(Clone, Debug, PartialEq, Eq, Hash)] @@ -315,7 +347,7 @@ pub struct DerivedObligationCause<'tcx> { parent_trait_ref: ty::PolyTraitRef<'tcx>, /// The parent trait had this cause. - parent_code: Rc> + parent_code: Rc>, } pub type Obligations<'tcx, O> = Vec>; @@ -408,7 +440,7 @@ impl<'tcx> GoalKind<'tcx> { Some(p) => p.into_goal(), None => GoalKind::Quantified( QuantifierKind::Universal, - domain_goal.map_bound(|p| tcx.mk_goal(p.into_goal())) + domain_goal.map_bound(|p| tcx.mk_goal(p.into_goal())), ), } } @@ -467,10 +499,7 @@ pub struct Environment<'tcx> { impl Environment<'tcx> { pub fn with(self, goal: G) -> InEnvironment<'tcx, G> { - InEnvironment { - environment: self, - goal, - } + InEnvironment { environment: self, goal } } } @@ -483,12 +512,14 @@ pub struct InEnvironment<'tcx, G> { pub type Selection<'tcx> = Vtable<'tcx, PredicateObligation<'tcx>>; -#[derive(Clone,Debug,TypeFoldable)] +#[derive(Clone, Debug, TypeFoldable)] pub enum SelectionError<'tcx> { Unimplemented, - OutputTypeParameterMismatch(ty::PolyTraitRef<'tcx>, - ty::PolyTraitRef<'tcx>, - ty::error::TypeError<'tcx>), + OutputTypeParameterMismatch( + ty::PolyTraitRef<'tcx>, + ty::PolyTraitRef<'tcx>, + ty::error::TypeError<'tcx>, + ), TraitNotObjectSafe(DefId), ConstEvalFailure(ErrorHandled), Overflow, @@ -507,8 +538,7 @@ pub struct FulfillmentError<'tcx> { pub enum FulfillmentErrorCode<'tcx> { CodeSelectionError(SelectionError<'tcx>), CodeProjectionError(MismatchedProjectionTypes<'tcx>), - CodeSubtypeError(ExpectedFound>, - TypeError<'tcx>), // always comes from a SubtypePredicate + CodeSubtypeError(ExpectedFound>, TypeError<'tcx>), // always comes from a SubtypePredicate CodeAmbiguity, } @@ -610,7 +640,7 @@ pub enum Vtable<'tcx, N> { pub struct VtableImplData<'tcx, N> { pub impl_def_id: DefId, pub substs: SubstsRef<'tcx>, - pub nested: Vec + pub nested: Vec, } #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] @@ -619,7 +649,7 @@ pub struct VtableGeneratorData<'tcx, N> { pub substs: SubstsRef<'tcx>, /// Nested obligations. This can be non-empty if the generator /// signature contains associated types. - pub nested: Vec + pub nested: Vec, } #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] @@ -628,18 +658,18 @@ pub struct VtableClosureData<'tcx, N> { pub substs: SubstsRef<'tcx>, /// Nested obligations. This can be non-empty if the closure /// signature contains associated types. - pub nested: Vec + pub nested: Vec, } #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] pub struct VtableAutoImplData { pub trait_def_id: DefId, - pub nested: Vec + pub nested: Vec, } #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] pub struct VtableBuiltinData { - pub nested: Vec + pub nested: Vec, } /// A vtable for some object-safe trait `Foo` automatically derived @@ -660,7 +690,7 @@ pub struct VtableObjectData<'tcx, N> { #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] pub struct VtableFnPointerData<'tcx, N> { pub fn_ty: Ty<'tcx>, - pub nested: Vec + pub nested: Vec, } #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] @@ -691,24 +721,27 @@ pub fn type_known_to_meet_bound_modulo_regions<'a, 'tcx>( def_id: DefId, span: Span, ) -> bool { - debug!("type_known_to_meet_bound_modulo_regions(ty={:?}, bound={:?})", - ty, - infcx.tcx.def_path_str(def_id)); + debug!( + "type_known_to_meet_bound_modulo_regions(ty={:?}, bound={:?})", + ty, + infcx.tcx.def_path_str(def_id) + ); - let trait_ref = ty::TraitRef { - def_id, - substs: infcx.tcx.mk_substs_trait(ty, &[]), - }; + let trait_ref = ty::TraitRef { def_id, substs: infcx.tcx.mk_substs_trait(ty, &[]) }; let obligation = Obligation { param_env, cause: ObligationCause::misc(span, hir::DUMMY_HIR_ID), recursion_depth: 0, - predicate: trait_ref.to_predicate(), + predicate: trait_ref.without_const().to_predicate(), }; let result = infcx.predicate_must_hold_modulo_regions(&obligation); - debug!("type_known_to_meet_ty={:?} bound={} => {:?}", - ty, infcx.tcx.def_path_str(def_id), result); + debug!( + "type_known_to_meet_ty={:?} bound={} => {:?}", + ty, + infcx.tcx.def_path_str(def_id), + result + ); if result && (ty.has_infer_types() || ty.has_closure_types()) { // Because of inference "guessing", selection can sometimes claim @@ -733,16 +766,20 @@ pub fn type_known_to_meet_bound_modulo_regions<'a, 'tcx>( // assume it is move; linear is always ok. match fulfill_cx.select_all_or_error(infcx) { Ok(()) => { - debug!("type_known_to_meet_bound_modulo_regions: ty={:?} bound={} success", - ty, - infcx.tcx.def_path_str(def_id)); + debug!( + "type_known_to_meet_bound_modulo_regions: ty={:?} bound={} success", + ty, + infcx.tcx.def_path_str(def_id) + ); true } Err(e) => { - debug!("type_known_to_meet_bound_modulo_regions: ty={:?} bound={} errors={:?}", - ty, - infcx.tcx.def_path_str(def_id), - e); + debug!( + "type_known_to_meet_bound_modulo_regions: ty={:?} bound={} errors={:?}", + ty, + infcx.tcx.def_path_str(def_id), + e + ); false } } @@ -760,9 +797,7 @@ fn do_normalize_predicates<'tcx>( ) -> Result>, ErrorReported> { debug!( "do_normalize_predicates(predicates={:?}, region_context={:?}, cause={:?})", - predicates, - region_context, - cause, + predicates, region_context, cause, ); let span = cause.span; tcx.infer_ctxt().enter(|infcx| { @@ -780,19 +815,14 @@ fn do_normalize_predicates<'tcx>( // them here too, and we will remove this function when // we move over to lazy normalization *anyway*. let fulfill_cx = FulfillmentContext::new_ignoring_regions(); - let predicates = match fully_normalize( - &infcx, - fulfill_cx, - cause, - elaborated_env, - &predicates, - ) { - Ok(predicates) => predicates, - Err(errors) => { - infcx.report_fulfillment_errors(&errors, None, false); - return Err(ErrorReported) - } - }; + let predicates = + match fully_normalize(&infcx, fulfill_cx, cause, elaborated_env, &predicates) { + Ok(predicates) => predicates, + Err(errors) => { + infcx.report_fulfillment_errors(&errors, None, false); + return Err(ErrorReported); + } + }; debug!("do_normalize_predictes: normalized predicates = {:?}", predicates); @@ -820,7 +850,7 @@ fn do_normalize_predicates<'tcx>( // unconstrained variable, and it seems better not to ICE, // all things considered. tcx.sess.span_err(span, &fixup_err.to_string()); - return Err(ErrorReported) + return Err(ErrorReported); } }; if predicates.has_local_value() { @@ -855,20 +885,20 @@ pub fn normalize_param_env_or_error<'tcx>( // and errors will get reported then; so after typeck we // can be sure that no errors should occur. - debug!("normalize_param_env_or_error(region_context={:?}, unnormalized_env={:?}, cause={:?})", - region_context, unnormalized_env, cause); + debug!( + "normalize_param_env_or_error(region_context={:?}, unnormalized_env={:?}, cause={:?})", + region_context, unnormalized_env, cause + ); let mut predicates: Vec<_> = - util::elaborate_predicates(tcx, unnormalized_env.caller_bounds.to_vec()) - .collect(); + util::elaborate_predicates(tcx, unnormalized_env.caller_bounds.to_vec()).collect(); - debug!("normalize_param_env_or_error: elaborated-predicates={:?}", - predicates); + debug!("normalize_param_env_or_error: elaborated-predicates={:?}", predicates); let elaborated_env = ty::ParamEnv::new( tcx.intern_predicates(&predicates), unnormalized_env.reveal, - unnormalized_env.def_id + unnormalized_env.def_id, ); // HACK: we are trying to normalize the param-env inside *itself*. The problem is that @@ -889,25 +919,31 @@ pub fn normalize_param_env_or_error<'tcx>( // // This works fairly well because trait matching does not actually care about param-env // TypeOutlives predicates - these are normally used by regionck. - let outlives_predicates: Vec<_> = predicates.drain_filter(|predicate| { - match predicate { + let outlives_predicates: Vec<_> = predicates + .drain_filter(|predicate| match predicate { ty::Predicate::TypeOutlives(..) => true, - _ => false - } - }).collect(); + _ => false, + }) + .collect(); - debug!("normalize_param_env_or_error: predicates=(non-outlives={:?}, outlives={:?})", - predicates, outlives_predicates); - let non_outlives_predicates = - match do_normalize_predicates(tcx, region_context, cause.clone(), - elaborated_env, predicates) { - Ok(predicates) => predicates, - // An unnormalized env is better than nothing. - Err(ErrorReported) => { - debug!("normalize_param_env_or_error: errored resolving non-outlives predicates"); - return elaborated_env - } - }; + debug!( + "normalize_param_env_or_error: predicates=(non-outlives={:?}, outlives={:?})", + predicates, outlives_predicates + ); + let non_outlives_predicates = match do_normalize_predicates( + tcx, + region_context, + cause.clone(), + elaborated_env, + predicates, + ) { + Ok(predicates) => predicates, + // An unnormalized env is better than nothing. + Err(ErrorReported) => { + debug!("normalize_param_env_or_error: errored resolving non-outlives predicates"); + return elaborated_env; + } + }; debug!("normalize_param_env_or_error: non-outlives predicates={:?}", non_outlives_predicates); @@ -916,21 +952,22 @@ pub fn normalize_param_env_or_error<'tcx>( // predicates here anyway. Keeping them here anyway because it seems safer. let outlives_env: Vec<_> = non_outlives_predicates.iter().chain(&outlives_predicates).cloned().collect(); - let outlives_env = ty::ParamEnv::new( - tcx.intern_predicates(&outlives_env), - unnormalized_env.reveal, - None - ); - let outlives_predicates = - match do_normalize_predicates(tcx, region_context, cause, - outlives_env, outlives_predicates) { - Ok(predicates) => predicates, - // An unnormalized env is better than nothing. - Err(ErrorReported) => { - debug!("normalize_param_env_or_error: errored resolving outlives predicates"); - return elaborated_env - } - }; + let outlives_env = + ty::ParamEnv::new(tcx.intern_predicates(&outlives_env), unnormalized_env.reveal, None); + let outlives_predicates = match do_normalize_predicates( + tcx, + region_context, + cause, + outlives_env, + outlives_predicates, + ) { + Ok(predicates) => predicates, + // An unnormalized env is better than nothing. + Err(ErrorReported) => { + debug!("normalize_param_env_or_error: errored resolving outlives predicates"); + return elaborated_env; + } + }; debug!("normalize_param_env_or_error: outlives predicates={:?}", outlives_predicates); let mut predicates = non_outlives_predicates; @@ -939,7 +976,7 @@ pub fn normalize_param_env_or_error<'tcx>( ty::ParamEnv::new( tcx.intern_predicates(&predicates), unnormalized_env.reveal, - unnormalized_env.def_id + unnormalized_env.def_id, ) } @@ -957,9 +994,10 @@ where let selcx = &mut SelectionContext::new(infcx); let Normalized { value: normalized_value, obligations } = project::normalize(selcx, param_env, cause, value); - debug!("fully_normalize: normalized_value={:?} obligations={:?}", - normalized_value, - obligations); + debug!( + "fully_normalize: normalized_value={:?} obligations={:?}", + normalized_value, obligations + ); for obligation in obligations { fulfill_cx.register_predicate_obligation(selcx.infcx(), obligation); } @@ -976,12 +1014,11 @@ where /// environment. If this returns false, then either normalize /// encountered an error or one of the predicates did not hold. Used /// when creating vtables to check for unsatisfiable methods. -fn normalize_and_test_predicates<'tcx>( +pub fn normalize_and_test_predicates<'tcx>( tcx: TyCtxt<'tcx>, predicates: Vec>, ) -> bool { - debug!("normalize_and_test_predicates(predicates={:?})", - predicates); + debug!("normalize_and_test_predicates(predicates={:?})", predicates); let result = tcx.infer_ctxt().enter(|infcx| { let param_env = ty::ParamEnv::reveal_all(); @@ -1000,8 +1037,7 @@ fn normalize_and_test_predicates<'tcx>( fulfill_cx.select_all_or_error(&infcx).is_ok() }); - debug!("normalize_and_test_predicates(predicates={:?}) = {:?}", - predicates, result); + debug!("normalize_and_test_predicates(predicates={:?}) = {:?}", predicates, result); result } @@ -1009,14 +1045,12 @@ fn substitute_normalize_and_test_predicates<'tcx>( tcx: TyCtxt<'tcx>, key: (DefId, SubstsRef<'tcx>), ) -> bool { - debug!("substitute_normalize_and_test_predicates(key={:?})", - key); + debug!("substitute_normalize_and_test_predicates(key={:?})", key); let predicates = tcx.predicates_of(key.0).instantiate(tcx, key.1).predicates; let result = normalize_and_test_predicates(tcx, predicates); - debug!("substitute_normalize_and_test_predicates(key={:?}) = {:?}", - key, result); + debug!("substitute_normalize_and_test_predicates(key={:?}) = {:?}", key, result); result } @@ -1029,100 +1063,98 @@ fn vtable_methods<'tcx>( ) -> &'tcx [Option<(DefId, SubstsRef<'tcx>)>] { debug!("vtable_methods({:?})", trait_ref); - tcx.arena.alloc_from_iter( - supertraits(tcx, trait_ref).flat_map(move |trait_ref| { - let trait_methods = tcx.associated_items(trait_ref.def_id()) - .filter(|item| item.kind == ty::AssocKind::Method); - - // Now list each method's DefId and InternalSubsts (for within its trait). - // If the method can never be called from this object, produce None. - trait_methods.map(move |trait_method| { - debug!("vtable_methods: trait_method={:?}", trait_method); - let def_id = trait_method.def_id; - - // Some methods cannot be called on an object; skip those. - if !tcx.is_vtable_safe_method(trait_ref.def_id(), &trait_method) { - debug!("vtable_methods: not vtable safe"); - return None; - } - - // The method may have some early-bound lifetimes; add regions for those. - let substs = trait_ref.map_bound(|trait_ref| - InternalSubsts::for_item(tcx, def_id, |param, _| - match param.kind { - GenericParamDefKind::Lifetime => tcx.lifetimes.re_erased.into(), - GenericParamDefKind::Type { .. } | - GenericParamDefKind::Const => { - trait_ref.substs[param.index as usize] - } - } - ) - ); - - // The trait type may have higher-ranked lifetimes in it; - // erase them if they appear, so that we get the type - // at some particular call site. - let substs = tcx.normalize_erasing_late_bound_regions( - ty::ParamEnv::reveal_all(), - &substs - ); + tcx.arena.alloc_from_iter(supertraits(tcx, trait_ref).flat_map(move |trait_ref| { + let trait_methods = tcx + .associated_items(trait_ref.def_id()) + .filter(|item| item.kind == ty::AssocKind::Method); + + // Now list each method's DefId and InternalSubsts (for within its trait). + // If the method can never be called from this object, produce None. + trait_methods.map(move |trait_method| { + debug!("vtable_methods: trait_method={:?}", trait_method); + let def_id = trait_method.def_id; + + // Some methods cannot be called on an object; skip those. + if !is_vtable_safe_method(tcx, trait_ref.def_id(), &trait_method) { + debug!("vtable_methods: not vtable safe"); + return None; + } - // It's possible that the method relies on where-clauses that - // do not hold for this particular set of type parameters. - // Note that this method could then never be called, so we - // do not want to try and codegen it, in that case (see #23435). - let predicates = tcx.predicates_of(def_id).instantiate_own(tcx, substs); - if !normalize_and_test_predicates(tcx, predicates.predicates) { - debug!("vtable_methods: predicates do not hold"); - return None; - } + // The method may have some early-bound lifetimes; add regions for those. + let substs = trait_ref.map_bound(|trait_ref| { + InternalSubsts::for_item(tcx, def_id, |param, _| match param.kind { + GenericParamDefKind::Lifetime => tcx.lifetimes.re_erased.into(), + GenericParamDefKind::Type { .. } | GenericParamDefKind::Const => { + trait_ref.substs[param.index as usize] + } + }) + }); + + // The trait type may have higher-ranked lifetimes in it; + // erase them if they appear, so that we get the type + // at some particular call site. + let substs = + tcx.normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &substs); + + // It's possible that the method relies on where-clauses that + // do not hold for this particular set of type parameters. + // Note that this method could then never be called, so we + // do not want to try and codegen it, in that case (see #23435). + let predicates = tcx.predicates_of(def_id).instantiate_own(tcx, substs); + if !normalize_and_test_predicates(tcx, predicates.predicates) { + debug!("vtable_methods: predicates do not hold"); + return None; + } - Some((def_id, substs)) - }) + Some((def_id, substs)) }) - ) + })) } impl<'tcx, O> Obligation<'tcx, O> { - pub fn new(cause: ObligationCause<'tcx>, - param_env: ty::ParamEnv<'tcx>, - predicate: O) - -> Obligation<'tcx, O> - { + pub fn new( + cause: ObligationCause<'tcx>, + param_env: ty::ParamEnv<'tcx>, + predicate: O, + ) -> Obligation<'tcx, O> { Obligation { cause, param_env, recursion_depth: 0, predicate } } - fn with_depth(cause: ObligationCause<'tcx>, - recursion_depth: usize, - param_env: ty::ParamEnv<'tcx>, - predicate: O) - -> Obligation<'tcx, O> - { + fn with_depth( + cause: ObligationCause<'tcx>, + recursion_depth: usize, + param_env: ty::ParamEnv<'tcx>, + predicate: O, + ) -> Obligation<'tcx, O> { Obligation { cause, param_env, recursion_depth, predicate } } - pub fn misc(span: Span, - body_id: hir::HirId, - param_env: ty::ParamEnv<'tcx>, - trait_ref: O) - -> Obligation<'tcx, O> { + pub fn misc( + span: Span, + body_id: hir::HirId, + param_env: ty::ParamEnv<'tcx>, + trait_ref: O, + ) -> Obligation<'tcx, O> { Obligation::new(ObligationCause::misc(span, body_id), param_env, trait_ref) } - pub fn with

(&self, value: P) -> Obligation<'tcx,P> { - Obligation { cause: self.cause.clone(), - param_env: self.param_env, - recursion_depth: self.recursion_depth, - predicate: value } + pub fn with

(&self, value: P) -> Obligation<'tcx, P> { + Obligation { + cause: self.cause.clone(), + param_env: self.param_env, + recursion_depth: self.recursion_depth, + predicate: value, + } } } impl<'tcx> ObligationCause<'tcx> { #[inline] - pub fn new(span: Span, - body_id: hir::HirId, - code: ObligationCauseCode<'tcx>) - -> ObligationCause<'tcx> { + pub fn new( + span: Span, + body_id: hir::HirId, + code: ObligationCauseCode<'tcx>, + ) -> ObligationCause<'tcx> { ObligationCause { span, body_id, code } } @@ -1135,6 +1167,17 @@ impl<'tcx> ObligationCause<'tcx> { } } +impl ObligationCauseCode<'_> { + // Return the base obligation, ignoring derived obligations. + pub fn peel_derives(&self) -> &Self { + let mut base_cause = self; + while let BuiltinDerivedObligation(cause) | ImplDerivedObligation(cause) = base_cause { + base_cause = &cause.parent_code; + } + base_cause + } +} + impl<'tcx, N> Vtable<'tcx, N> { pub fn nested_obligations(self) -> Vec { match self { @@ -1150,7 +1193,10 @@ impl<'tcx, N> Vtable<'tcx, N> { } } - pub fn map(self, f: F) -> Vtable<'tcx, M> where F: FnMut(N) -> M { + pub fn map(self, f: F) -> Vtable<'tcx, M> + where + F: FnMut(N) -> M, + { match self { VtableImpl(i) => VtableImpl(VtableImplData { impl_def_id: i.impl_def_id, @@ -1158,9 +1204,9 @@ impl<'tcx, N> Vtable<'tcx, N> { nested: i.nested.into_iter().map(f).collect(), }), VtableParam(n) => VtableParam(n.into_iter().map(f).collect()), - VtableBuiltin(i) => VtableBuiltin(VtableBuiltinData { - nested: i.nested.into_iter().map(f).collect(), - }), + VtableBuiltin(i) => { + VtableBuiltin(VtableBuiltinData { nested: i.nested.into_iter().map(f).collect() }) + } VtableObject(o) => VtableObject(VtableObjectData { upcast_trait_ref: o.upcast_trait_ref, vtable_base: o.vtable_base, @@ -1194,10 +1240,10 @@ impl<'tcx, N> Vtable<'tcx, N> { } impl<'tcx> FulfillmentError<'tcx> { - fn new(obligation: PredicateObligation<'tcx>, - code: FulfillmentErrorCode<'tcx>) - -> FulfillmentError<'tcx> - { + fn new( + obligation: PredicateObligation<'tcx>, + code: FulfillmentErrorCode<'tcx>, + ) -> FulfillmentError<'tcx> { FulfillmentError { obligation: obligation, code: code, points_at_arg_span: false } } } @@ -1209,6 +1255,7 @@ impl<'tcx> TraitObligation<'tcx> { } pub fn provide(providers: &mut ty::query::Providers<'_>) { + misc::provide(providers); *providers = ty::query::Providers { is_object_safe: object_safety::is_object_safe_provider, specialization_graph_of: specialize::specialization_graph_provider, diff --git a/src/librustc/traits/object_safety.rs b/src/librustc/traits/object_safety.rs index 8ded1417ee..15f81bb3f4 100644 --- a/src/librustc/traits/object_safety.rs +++ b/src/librustc/traits/object_safety.rs @@ -10,17 +10,18 @@ use super::elaborate_predicates; -use crate::hir; -use crate::hir::def_id::DefId; -use crate::lint; use crate::traits::{self, Obligation, ObligationCause}; -use crate::ty::{self, Ty, TyCtxt, TypeFoldable, Predicate, ToPredicate}; -use crate::ty::subst::{Subst, InternalSubsts}; +use crate::ty::subst::{InternalSubsts, Subst}; +use crate::ty::{self, Predicate, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_session::lint::builtin::WHERE_CLAUSES_OBJECT_SAFETY; +use rustc_span::symbol::Symbol; +use rustc_span::{Span, DUMMY_SP}; +use syntax::ast; + use std::borrow::Cow; use std::iter::{self}; -use syntax::ast::{self}; -use syntax::symbol::Symbol; -use syntax_pos::{Span, DUMMY_SP}; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] pub enum ObjectSafetyViolation { @@ -41,28 +42,36 @@ pub enum ObjectSafetyViolation { impl ObjectSafetyViolation { pub fn error_msg(&self) -> Cow<'static, str> { match *self { - ObjectSafetyViolation::SizedSelf => - "the trait cannot require that `Self : Sized`".into(), - ObjectSafetyViolation::SupertraitSelf => + ObjectSafetyViolation::SizedSelf => { + "the trait cannot require that `Self : Sized`".into() + } + ObjectSafetyViolation::SupertraitSelf => { "the trait cannot use `Self` as a type parameter \ - in the supertraits or where-clauses".into(), - ObjectSafetyViolation::Method(name, MethodViolationCode::StaticMethod, _) => - format!("associated function `{}` has no `self` parameter", name).into(), + in the supertraits or where-clauses" + .into() + } + ObjectSafetyViolation::Method(name, MethodViolationCode::StaticMethod, _) => { + format!("associated function `{}` has no `self` parameter", name).into() + } ObjectSafetyViolation::Method(name, MethodViolationCode::ReferencesSelf, _) => format!( "method `{}` references the `Self` type in its parameters or return type", name, - ).into(), + ) + .into(), ObjectSafetyViolation::Method( name, MethodViolationCode::WhereClauseReferencesSelf, _, ) => format!("method `{}` references the `Self` type in where clauses", name).into(), - ObjectSafetyViolation::Method(name, MethodViolationCode::Generic, _) => - format!("method `{}` has generic type parameters", name).into(), - ObjectSafetyViolation::Method(name, MethodViolationCode::UndispatchableReceiver, _) => - format!("method `{}`'s `self` parameter cannot be dispatched on", name).into(), - ObjectSafetyViolation::AssocConst(name, _) => - format!("the trait cannot contain associated consts like `{}`", name).into(), + ObjectSafetyViolation::Method(name, MethodViolationCode::Generic, _) => { + format!("method `{}` has generic type parameters", name).into() + } + ObjectSafetyViolation::Method(name, MethodViolationCode::UndispatchableReceiver, _) => { + format!("method `{}`'s `self` parameter cannot be dispatched on", name).into() + } + ObjectSafetyViolation::AssocConst(name, _) => { + format!("the trait cannot contain associated consts like `{}`", name).into() + } } } @@ -70,8 +79,12 @@ impl ObjectSafetyViolation { // When `span` comes from a separate crate, it'll be `DUMMY_SP`. Treat it as `None` so // diagnostics use a `note` instead of a `span_label`. match *self { - ObjectSafetyViolation::AssocConst(_, span) | - ObjectSafetyViolation::Method(_, _, span) if span != DUMMY_SP => Some(span), + ObjectSafetyViolation::AssocConst(_, span) + | ObjectSafetyViolation::Method(_, _, span) + if span != DUMMY_SP => + { + Some(span) + } _ => None, } } @@ -96,636 +109,622 @@ pub enum MethodViolationCode { UndispatchableReceiver, } -impl<'tcx> TyCtxt<'tcx> { - /// Returns the object safety violations that affect - /// astconv -- currently, `Self` in supertraits. This is needed - /// because `object_safety_violations` can't be used during - /// type collection. - pub fn astconv_object_safety_violations( - self, - trait_def_id: DefId, - ) -> Vec { - debug_assert!(self.generics_of(trait_def_id).has_self); - let violations = traits::supertrait_def_ids(self, trait_def_id) - .filter(|&def_id| self.predicates_reference_self(def_id, true)) - .map(|_| ObjectSafetyViolation::SupertraitSelf) - .collect(); +/// Returns the object safety violations that affect +/// astconv -- currently, `Self` in supertraits. This is needed +/// because `object_safety_violations` can't be used during +/// type collection. +pub fn astconv_object_safety_violations( + tcx: TyCtxt<'_>, + trait_def_id: DefId, +) -> Vec { + debug_assert!(tcx.generics_of(trait_def_id).has_self); + let violations = traits::supertrait_def_ids(tcx, trait_def_id) + .filter(|&def_id| predicates_reference_self(tcx, def_id, true)) + .map(|_| ObjectSafetyViolation::SupertraitSelf) + .collect(); + + debug!("astconv_object_safety_violations(trait_def_id={:?}) = {:?}", trait_def_id, violations); + + violations +} - debug!("astconv_object_safety_violations(trait_def_id={:?}) = {:?}", - trait_def_id, - violations); +pub fn object_safety_violations( + tcx: TyCtxt<'_>, + trait_def_id: DefId, +) -> Vec { + debug_assert!(tcx.generics_of(trait_def_id).has_self); + debug!("object_safety_violations: {:?}", trait_def_id); - violations - } + traits::supertrait_def_ids(tcx, trait_def_id) + .flat_map(|def_id| object_safety_violations_for_trait(tcx, def_id)) + .collect() +} - pub fn object_safety_violations(self, trait_def_id: DefId) - -> Vec - { - debug_assert!(self.generics_of(trait_def_id).has_self); - debug!("object_safety_violations: {:?}", trait_def_id); +/// We say a method is *vtable safe* if it can be invoked on a trait +/// object. Note that object-safe traits can have some +/// non-vtable-safe methods, so long as they require `Self: Sized` or +/// otherwise ensure that they cannot be used when `Self = Trait`. +pub fn is_vtable_safe_method(tcx: TyCtxt<'_>, trait_def_id: DefId, method: &ty::AssocItem) -> bool { + debug_assert!(tcx.generics_of(trait_def_id).has_self); + debug!("is_vtable_safe_method({:?}, {:?})", trait_def_id, method); + // Any method that has a `Self: Sized` bound cannot be called. + if generics_require_sized_self(tcx, method.def_id) { + return false; + } - traits::supertrait_def_ids(self, trait_def_id) - .flat_map(|def_id| self.object_safety_violations_for_trait(def_id)) - .collect() + match virtual_call_violation_for_method(tcx, trait_def_id, method) { + None | Some(MethodViolationCode::WhereClauseReferencesSelf) => true, + Some(_) => false, } +} - /// We say a method is *vtable safe* if it can be invoked on a trait - /// object. Note that object-safe traits can have some - /// non-vtable-safe methods, so long as they require `Self: Sized` or - /// otherwise ensure that they cannot be used when `Self = Trait`. - pub fn is_vtable_safe_method(self, trait_def_id: DefId, method: &ty::AssocItem) -> bool { - debug_assert!(self.generics_of(trait_def_id).has_self); - debug!("is_vtable_safe_method({:?}, {:?})", trait_def_id, method); - // Any method that has a `Self: Sized` bound cannot be called. - if self.generics_require_sized_self(method.def_id) { - return false; - } +fn object_safety_violations_for_trait( + tcx: TyCtxt<'_>, + trait_def_id: DefId, +) -> Vec { + // Check methods for violations. + let mut violations: Vec<_> = tcx + .associated_items(trait_def_id) + .filter(|item| item.kind == ty::AssocKind::Method) + .filter_map(|item| { + object_safety_violation_for_method(tcx, trait_def_id, &item) + .map(|code| ObjectSafetyViolation::Method(item.ident.name, code, item.ident.span)) + }) + .filter(|violation| { + if let ObjectSafetyViolation::Method( + _, + MethodViolationCode::WhereClauseReferencesSelf, + span, + ) = violation + { + // Using `CRATE_NODE_ID` is wrong, but it's hard to get a more precise id. + // It's also hard to get a use site span, so we use the method definition span. + tcx.struct_span_lint_hir( + WHERE_CLAUSES_OBJECT_SAFETY, + hir::CRATE_HIR_ID, + *span, + &format!( + "the trait `{}` cannot be made into an object", + tcx.def_path_str(trait_def_id) + ), + ) + .note(&violation.error_msg()) + .emit(); + false + } else { + true + } + }) + .collect(); - match self.virtual_call_violation_for_method(trait_def_id, method) { - None | Some(MethodViolationCode::WhereClauseReferencesSelf) => true, - Some(_) => false, - } + // Check the trait itself. + if trait_has_sized_self(tcx, trait_def_id) { + violations.push(ObjectSafetyViolation::SizedSelf); + } + if predicates_reference_self(tcx, trait_def_id, false) { + violations.push(ObjectSafetyViolation::SupertraitSelf); } - fn object_safety_violations_for_trait(self, trait_def_id: DefId) -> Vec { - // Check methods for violations. - let mut violations: Vec<_> = self.associated_items(trait_def_id) - .filter(|item| item.kind == ty::AssocKind::Method) - .filter_map(|item| - self.object_safety_violation_for_method(trait_def_id, &item).map(|code| { - ObjectSafetyViolation::Method(item.ident.name, code, item.ident.span) - }) - ).filter(|violation| { - if let ObjectSafetyViolation::Method( - _, - MethodViolationCode::WhereClauseReferencesSelf, - span, - ) = violation { - // Using `CRATE_NODE_ID` is wrong, but it's hard to get a more precise id. - // It's also hard to get a use site span, so we use the method definition span. - self.lint_node_note( - lint::builtin::WHERE_CLAUSES_OBJECT_SAFETY, - hir::CRATE_HIR_ID, - *span, - &format!("the trait `{}` cannot be made into an object", - self.def_path_str(trait_def_id)), - &violation.error_msg()); - false - } else { - true + violations.extend( + tcx.associated_items(trait_def_id) + .filter(|item| item.kind == ty::AssocKind::Const) + .map(|item| ObjectSafetyViolation::AssocConst(item.ident.name, item.ident.span)), + ); + + debug!( + "object_safety_violations_for_trait(trait_def_id={:?}) = {:?}", + trait_def_id, violations + ); + + violations +} + +fn predicates_reference_self(tcx: TyCtxt<'_>, trait_def_id: DefId, supertraits_only: bool) -> bool { + let trait_ref = ty::Binder::dummy(ty::TraitRef::identity(tcx, trait_def_id)); + let predicates = if supertraits_only { + tcx.super_predicates_of(trait_def_id) + } else { + tcx.predicates_of(trait_def_id) + }; + let self_ty = tcx.types.self_param; + let has_self_ty = |t: Ty<'_>| t.walk().any(|t| t == self_ty); + predicates + .predicates + .iter() + .map(|(predicate, _)| predicate.subst_supertrait(tcx, &trait_ref)) + .any(|predicate| { + match predicate { + ty::Predicate::Trait(ref data, _) => { + // In the case of a trait predicate, we can skip the "self" type. + data.skip_binder().input_types().skip(1).any(has_self_ty) } - }).collect(); + ty::Predicate::Projection(ref data) => { + // And similarly for projections. This should be redundant with + // the previous check because any projection should have a + // matching `Trait` predicate with the same inputs, but we do + // the check to be safe. + // + // Note that we *do* allow projection *outputs* to contain + // `self` (i.e., `trait Foo: Bar { type Result; }`), + // we just require the user to specify *both* outputs + // in the object type (i.e., `dyn Foo`). + // + // This is ALT2 in issue #56288, see that for discussion of the + // possible alternatives. + data.skip_binder() + .projection_ty + .trait_ref(tcx) + .input_types() + .skip(1) + .any(has_self_ty) + } + ty::Predicate::WellFormed(..) + | ty::Predicate::ObjectSafe(..) + | ty::Predicate::TypeOutlives(..) + | ty::Predicate::RegionOutlives(..) + | ty::Predicate::ClosureKind(..) + | ty::Predicate::Subtype(..) + | ty::Predicate::ConstEvaluatable(..) => false, + } + }) +} - // Check the trait itself. - if self.trait_has_sized_self(trait_def_id) { - violations.push(ObjectSafetyViolation::SizedSelf); +fn trait_has_sized_self(tcx: TyCtxt<'_>, trait_def_id: DefId) -> bool { + generics_require_sized_self(tcx, trait_def_id) +} + +fn generics_require_sized_self(tcx: TyCtxt<'_>, def_id: DefId) -> bool { + let sized_def_id = match tcx.lang_items().sized_trait() { + Some(def_id) => def_id, + None => { + return false; /* No Sized trait, can't require it! */ } - if self.predicates_reference_self(trait_def_id, false) { - violations.push(ObjectSafetyViolation::SupertraitSelf); + }; + + // Search for a predicate like `Self : Sized` amongst the trait bounds. + let predicates = tcx.predicates_of(def_id); + let predicates = predicates.instantiate_identity(tcx).predicates; + elaborate_predicates(tcx, predicates).any(|predicate| match predicate { + ty::Predicate::Trait(ref trait_pred, _) => { + trait_pred.def_id() == sized_def_id && trait_pred.skip_binder().self_ty().is_param(0) } + ty::Predicate::Projection(..) + | ty::Predicate::Subtype(..) + | ty::Predicate::RegionOutlives(..) + | ty::Predicate::WellFormed(..) + | ty::Predicate::ObjectSafe(..) + | ty::Predicate::ClosureKind(..) + | ty::Predicate::TypeOutlives(..) + | ty::Predicate::ConstEvaluatable(..) => false, + }) +} - violations.extend(self.associated_items(trait_def_id) - .filter(|item| item.kind == ty::AssocKind::Const) - .map(|item| ObjectSafetyViolation::AssocConst(item.ident.name, item.ident.span))); +/// Returns `Some(_)` if this method makes the containing trait not object safe. +fn object_safety_violation_for_method( + tcx: TyCtxt<'_>, + trait_def_id: DefId, + method: &ty::AssocItem, +) -> Option { + debug!("object_safety_violation_for_method({:?}, {:?})", trait_def_id, method); + // Any method that has a `Self : Sized` requisite is otherwise + // exempt from the regulations. + if generics_require_sized_self(tcx, method.def_id) { + return None; + } - debug!("object_safety_violations_for_trait(trait_def_id={:?}) = {:?}", - trait_def_id, - violations); + virtual_call_violation_for_method(tcx, trait_def_id, method) +} - violations +/// Returns `Some(_)` if this method cannot be called on a trait +/// object; this does not necessarily imply that the enclosing trait +/// is not object safe, because the method might have a where clause +/// `Self:Sized`. +fn virtual_call_violation_for_method<'tcx>( + tcx: TyCtxt<'tcx>, + trait_def_id: DefId, + method: &ty::AssocItem, +) -> Option { + // The method's first parameter must be named `self` + if !method.method_has_self_argument { + return Some(MethodViolationCode::StaticMethod); } - fn predicates_reference_self( - self, - trait_def_id: DefId, - supertraits_only: bool, - ) -> bool { - let trait_ref = ty::Binder::dummy(ty::TraitRef::identity(self, trait_def_id)); - let predicates = if supertraits_only { - self.super_predicates_of(trait_def_id) - } else { - self.predicates_of(trait_def_id) - }; - let self_ty = self.types.self_param; - let has_self_ty = |t: Ty<'tcx>| t.walk().any(|t| t == self_ty); - predicates - .predicates - .iter() - .map(|(predicate, _)| predicate.subst_supertrait(self, &trait_ref)) - .any(|predicate| { - match predicate { - ty::Predicate::Trait(ref data) => { - // In the case of a trait predicate, we can skip the "self" type. - data.skip_binder().input_types().skip(1).any(has_self_ty) - } - ty::Predicate::Projection(ref data) => { - // And similarly for projections. This should be redundant with - // the previous check because any projection should have a - // matching `Trait` predicate with the same inputs, but we do - // the check to be safe. - // - // Note that we *do* allow projection *outputs* to contain - // `self` (i.e., `trait Foo: Bar { type Result; }`), - // we just require the user to specify *both* outputs - // in the object type (i.e., `dyn Foo`). - // - // This is ALT2 in issue #56288, see that for discussion of the - // possible alternatives. - data.skip_binder() - .projection_ty - .trait_ref(self) - .input_types() - .skip(1) - .any(has_self_ty) - } - ty::Predicate::WellFormed(..) | - ty::Predicate::ObjectSafe(..) | - ty::Predicate::TypeOutlives(..) | - ty::Predicate::RegionOutlives(..) | - ty::Predicate::ClosureKind(..) | - ty::Predicate::Subtype(..) | - ty::Predicate::ConstEvaluatable(..) => { - false - } - } - }) + let sig = tcx.fn_sig(method.def_id); + + for input_ty in &sig.skip_binder().inputs()[1..] { + if contains_illegal_self_type_reference(tcx, trait_def_id, input_ty) { + return Some(MethodViolationCode::ReferencesSelf); + } + } + if contains_illegal_self_type_reference(tcx, trait_def_id, sig.output().skip_binder()) { + return Some(MethodViolationCode::ReferencesSelf); } - fn trait_has_sized_self(self, trait_def_id: DefId) -> bool { - self.generics_require_sized_self(trait_def_id) + // We can't monomorphize things like `fn foo(...)`. + let own_counts = tcx.generics_of(method.def_id).own_counts(); + if own_counts.types + own_counts.consts != 0 { + return Some(MethodViolationCode::Generic); } - fn generics_require_sized_self(self, def_id: DefId) -> bool { - let sized_def_id = match self.lang_items().sized_trait() { - Some(def_id) => def_id, - None => { return false; /* No Sized trait, can't require it! */ } - }; + if tcx + .predicates_of(method.def_id) + .predicates + .iter() + // A trait object can't claim to live more than the concrete type, + // so outlives predicates will always hold. + .cloned() + .filter(|(p, _)| p.to_opt_type_outlives().is_none()) + .collect::>() + // Do a shallow visit so that `contains_illegal_self_type_reference` + // may apply it's custom visiting. + .visit_tys_shallow(|t| contains_illegal_self_type_reference(tcx, trait_def_id, t)) + { + return Some(MethodViolationCode::WhereClauseReferencesSelf); + } + + let receiver_ty = + tcx.liberate_late_bound_regions(method.def_id, &sig.map_bound(|sig| sig.inputs()[0])); + + // Until `unsized_locals` is fully implemented, `self: Self` can't be dispatched on. + // However, this is already considered object-safe. We allow it as a special case here. + // FIXME(mikeyhew) get rid of this `if` statement once `receiver_is_dispatchable` allows + // `Receiver: Unsize dyn Trait]>`. + if receiver_ty != tcx.types.self_param { + if !receiver_is_dispatchable(tcx, method, receiver_ty) { + return Some(MethodViolationCode::UndispatchableReceiver); + } else { + // Do sanity check to make sure the receiver actually has the layout of a pointer. - // Search for a predicate like `Self : Sized` amongst the trait bounds. - let predicates = self.predicates_of(def_id); - let predicates = predicates.instantiate_identity(self).predicates; - elaborate_predicates(self, predicates) - .any(|predicate| match predicate { - ty::Predicate::Trait(ref trait_pred) => { - trait_pred.def_id() == sized_def_id - && trait_pred.skip_binder().self_ty().is_param(0) + use crate::ty::layout::Abi; + + let param_env = tcx.param_env(method.def_id); + + let abi_of_ty = |ty: Ty<'tcx>| -> &Abi { + match tcx.layout_of(param_env.and(ty)) { + Ok(layout) => &layout.abi, + Err(err) => bug!("error: {}\n while computing layout for type {:?}", err, ty), } - ty::Predicate::Projection(..) | - ty::Predicate::Subtype(..) | - ty::Predicate::RegionOutlives(..) | - ty::Predicate::WellFormed(..) | - ty::Predicate::ObjectSafe(..) | - ty::Predicate::ClosureKind(..) | - ty::Predicate::TypeOutlives(..) | - ty::Predicate::ConstEvaluatable(..) => { - false + }; + + // e.g., `Rc<()>` + let unit_receiver_ty = + receiver_for_self_ty(tcx, receiver_ty, tcx.mk_unit(), method.def_id); + + match abi_of_ty(unit_receiver_ty) { + &Abi::Scalar(..) => (), + abi => { + tcx.sess.delay_span_bug( + tcx.def_span(method.def_id), + &format!( + "receiver when `Self = ()` should have a Scalar ABI; found {:?}", + abi + ), + ); } } - ) - } - /// Returns `Some(_)` if this method makes the containing trait not object safe. - fn object_safety_violation_for_method( - self, - trait_def_id: DefId, - method: &ty::AssocItem, - ) -> Option { - debug!("object_safety_violation_for_method({:?}, {:?})", trait_def_id, method); - // Any method that has a `Self : Sized` requisite is otherwise - // exempt from the regulations. - if self.generics_require_sized_self(method.def_id) { - return None; - } + let trait_object_ty = + object_ty_for_trait(tcx, trait_def_id, tcx.mk_region(ty::ReStatic)); - self.virtual_call_violation_for_method(trait_def_id, method) - } + // e.g., `Rc` + let trait_object_receiver = + receiver_for_self_ty(tcx, receiver_ty, trait_object_ty, method.def_id); - /// Returns `Some(_)` if this method cannot be called on a trait - /// object; this does not necessarily imply that the enclosing trait - /// is not object safe, because the method might have a where clause - /// `Self:Sized`. - fn virtual_call_violation_for_method( - self, - trait_def_id: DefId, - method: &ty::AssocItem, - ) -> Option { - // The method's first parameter must be named `self` - if !method.method_has_self_argument { - return Some(MethodViolationCode::StaticMethod); + match abi_of_ty(trait_object_receiver) { + &Abi::ScalarPair(..) => (), + abi => { + tcx.sess.delay_span_bug( + tcx.def_span(method.def_id), + &format!( + "receiver when `Self = {}` should have a ScalarPair ABI; \ + found {:?}", + trait_object_ty, abi + ), + ); + } + } } + } - let sig = self.fn_sig(method.def_id); + None +} - for input_ty in &sig.skip_binder().inputs()[1..] { - if self.contains_illegal_self_type_reference(trait_def_id, input_ty) { - return Some(MethodViolationCode::ReferencesSelf); - } - } - if self.contains_illegal_self_type_reference(trait_def_id, sig.output().skip_binder()) { - return Some(MethodViolationCode::ReferencesSelf); - } +/// Performs a type substitution to produce the version of `receiver_ty` when `Self = self_ty`. +/// For example, for `receiver_ty = Rc` and `self_ty = Foo`, returns `Rc`. +fn receiver_for_self_ty<'tcx>( + tcx: TyCtxt<'tcx>, + receiver_ty: Ty<'tcx>, + self_ty: Ty<'tcx>, + method_def_id: DefId, +) -> Ty<'tcx> { + debug!("receiver_for_self_ty({:?}, {:?}, {:?})", receiver_ty, self_ty, method_def_id); + let substs = InternalSubsts::for_item(tcx, method_def_id, |param, _| { + if param.index == 0 { self_ty.into() } else { tcx.mk_param_from_def(param) } + }); + + let result = receiver_ty.subst(tcx, substs); + debug!( + "receiver_for_self_ty({:?}, {:?}, {:?}) = {:?}", + receiver_ty, self_ty, method_def_id, result + ); + result +} - // We can't monomorphize things like `fn foo(...)`. - let own_counts = self.generics_of(method.def_id).own_counts(); - if own_counts.types + own_counts.consts != 0 { - return Some(MethodViolationCode::Generic); - } +/// Creates the object type for the current trait. For example, +/// if the current trait is `Deref`, then this will be +/// `dyn Deref + 'static`. +fn object_ty_for_trait<'tcx>( + tcx: TyCtxt<'tcx>, + trait_def_id: DefId, + lifetime: ty::Region<'tcx>, +) -> Ty<'tcx> { + debug!("object_ty_for_trait: trait_def_id={:?}", trait_def_id); - if self.predicates_of(method.def_id).predicates.iter() - // A trait object can't claim to live more than the concrete type, - // so outlives predicates will always hold. - .cloned() - .filter(|(p, _)| p.to_opt_type_outlives().is_none()) - .collect::>() - // Do a shallow visit so that `contains_illegal_self_type_reference` - // may apply it's custom visiting. - .visit_tys_shallow(|t| { - self.contains_illegal_self_type_reference(trait_def_id, t) - }) { - return Some(MethodViolationCode::WhereClauseReferencesSelf); - } + let trait_ref = ty::TraitRef::identity(tcx, trait_def_id); - let receiver_ty = self.liberate_late_bound_regions( - method.def_id, - &sig.map_bound(|sig| sig.inputs()[0]), - ); - - // Until `unsized_locals` is fully implemented, `self: Self` can't be dispatched on. - // However, this is already considered object-safe. We allow it as a special case here. - // FIXME(mikeyhew) get rid of this `if` statement once `receiver_is_dispatchable` allows - // `Receiver: Unsize dyn Trait]>`. - if receiver_ty != self.types.self_param { - if !self.receiver_is_dispatchable(method, receiver_ty) { - return Some(MethodViolationCode::UndispatchableReceiver); - } else { - // Do sanity check to make sure the receiver actually has the layout of a pointer. + let trait_predicate = + ty::ExistentialPredicate::Trait(ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref)); - use crate::ty::layout::Abi; + let mut associated_types = traits::supertraits(tcx, ty::Binder::dummy(trait_ref)) + .flat_map(|super_trait_ref| { + tcx.associated_items(super_trait_ref.def_id()).map(move |item| (super_trait_ref, item)) + }) + .filter(|(_, item)| item.kind == ty::AssocKind::Type) + .collect::>(); - let param_env = self.param_env(method.def_id); + // existential predicates need to be in a specific order + associated_types.sort_by_cached_key(|(_, item)| tcx.def_path_hash(item.def_id)); - let abi_of_ty = |ty: Ty<'tcx>| -> &Abi { - match self.layout_of(param_env.and(ty)) { - Ok(layout) => &layout.abi, - Err(err) => bug!( - "error: {}\n while computing layout for type {:?}", err, ty - ) - } - }; - - // e.g., `Rc<()>` - let unit_receiver_ty = self.receiver_for_self_ty( - receiver_ty, self.mk_unit(), method.def_id - ); - - match abi_of_ty(unit_receiver_ty) { - &Abi::Scalar(..) => (), - abi => { - self.sess.delay_span_bug( - self.def_span(method.def_id), - &format!( - "receiver when `Self = ()` should have a Scalar ABI; found {:?}", - abi - ), - ); - } - } + let projection_predicates = associated_types.into_iter().map(|(super_trait_ref, item)| { + // We *can* get bound lifetimes here in cases like + // `trait MyTrait: for<'s> OtherTrait<&'s T, Output=bool>`. + // + // binder moved to (*)... + let super_trait_ref = super_trait_ref.skip_binder(); + ty::ExistentialPredicate::Projection(ty::ExistentialProjection { + ty: tcx.mk_projection(item.def_id, super_trait_ref.substs), + item_def_id: item.def_id, + substs: super_trait_ref.substs, + }) + }); - let trait_object_ty = self.object_ty_for_trait( - trait_def_id, self.mk_region(ty::ReStatic) - ); - - // e.g., `Rc` - let trait_object_receiver = self.receiver_for_self_ty( - receiver_ty, trait_object_ty, method.def_id - ); - - match abi_of_ty(trait_object_receiver) { - &Abi::ScalarPair(..) => (), - abi => { - self.sess.delay_span_bug( - self.def_span(method.def_id), - &format!( - "receiver when `Self = {}` should have a ScalarPair ABI; \ - found {:?}", - trait_object_ty, abi - ), - ); - } - } - } - } + let existential_predicates = + tcx.mk_existential_predicates(iter::once(trait_predicate).chain(projection_predicates)); - None - } + let object_ty = tcx.mk_dynamic( + // (*) ... binder re-introduced here + ty::Binder::bind(existential_predicates), + lifetime, + ); - /// Performs a type substitution to produce the version of `receiver_ty` when `Self = self_ty`. - /// For example, for `receiver_ty = Rc` and `self_ty = Foo`, returns `Rc`. - fn receiver_for_self_ty( - self, - receiver_ty: Ty<'tcx>, - self_ty: Ty<'tcx>, - method_def_id: DefId, - ) -> Ty<'tcx> { - debug!("receiver_for_self_ty({:?}, {:?}, {:?})", receiver_ty, self_ty, method_def_id); - let substs = InternalSubsts::for_item(self, method_def_id, |param, _| { - if param.index == 0 { - self_ty.into() - } else { - self.mk_param_from_def(param) - } - }); + debug!("object_ty_for_trait: object_ty=`{}`", object_ty); - let result = receiver_ty.subst(self, substs); - debug!("receiver_for_self_ty({:?}, {:?}, {:?}) = {:?}", - receiver_ty, self_ty, method_def_id, result); - result - } + object_ty +} - /// Creates the object type for the current trait. For example, - /// if the current trait is `Deref`, then this will be - /// `dyn Deref + 'static`. - fn object_ty_for_trait(self, trait_def_id: DefId, lifetime: ty::Region<'tcx>) -> Ty<'tcx> { - debug!("object_ty_for_trait: trait_def_id={:?}", trait_def_id); - - let trait_ref = ty::TraitRef::identity(self, trait_def_id); - - let trait_predicate = ty::ExistentialPredicate::Trait( - ty::ExistentialTraitRef::erase_self_ty(self, trait_ref) - ); - - let mut associated_types = traits::supertraits(self, ty::Binder::dummy(trait_ref)) - .flat_map(|super_trait_ref| { - self.associated_items(super_trait_ref.def_id()) - .map(move |item| (super_trait_ref, item)) - }) - .filter(|(_, item)| item.kind == ty::AssocKind::Type) - .collect::>(); - - // existential predicates need to be in a specific order - associated_types.sort_by_cached_key(|(_, item)| self.def_path_hash(item.def_id)); - - let projection_predicates = associated_types.into_iter().map(|(super_trait_ref, item)| { - // We *can* get bound lifetimes here in cases like - // `trait MyTrait: for<'s> OtherTrait<&'s T, Output=bool>`. - // - // binder moved to (*)... - let super_trait_ref = super_trait_ref.skip_binder(); - ty::ExistentialPredicate::Projection(ty::ExistentialProjection { - ty: self.mk_projection(item.def_id, super_trait_ref.substs), - item_def_id: item.def_id, - substs: super_trait_ref.substs, - }) - }); - - let existential_predicates = self.mk_existential_predicates( - iter::once(trait_predicate).chain(projection_predicates) - ); - - let object_ty = self.mk_dynamic( - // (*) ... binder re-introduced here - ty::Binder::bind(existential_predicates), - lifetime, - ); - - debug!("object_ty_for_trait: object_ty=`{}`", object_ty); - - object_ty - } +/// Checks the method's receiver (the `self` argument) can be dispatched on when `Self` is a +/// trait object. We require that `DispatchableFromDyn` be implemented for the receiver type +/// in the following way: +/// - let `Receiver` be the type of the `self` argument, i.e `Self`, `&Self`, `Rc`, +/// - require the following bound: +/// +/// ``` +/// Receiver[Self => T]: DispatchFromDyn dyn Trait]> +/// ``` +/// +/// where `Foo[X => Y]` means "the same type as `Foo`, but with `X` replaced with `Y`" +/// (substitution notation). +/// +/// Some examples of receiver types and their required obligation: +/// - `&'a mut self` requires `&'a mut Self: DispatchFromDyn<&'a mut dyn Trait>`, +/// - `self: Rc` requires `Rc: DispatchFromDyn>`, +/// - `self: Pin>` requires `Pin>: DispatchFromDyn>>`. +/// +/// The only case where the receiver is not dispatchable, but is still a valid receiver +/// type (just not object-safe), is when there is more than one level of pointer indirection. +/// E.g., `self: &&Self`, `self: &Rc`, `self: Box>`. In these cases, there +/// is no way, or at least no inexpensive way, to coerce the receiver from the version where +/// `Self = dyn Trait` to the version where `Self = T`, where `T` is the unknown erased type +/// contained by the trait object, because the object that needs to be coerced is behind +/// a pointer. +/// +/// In practice, we cannot use `dyn Trait` explicitly in the obligation because it would result +/// in a new check that `Trait` is object safe, creating a cycle (until object_safe_for_dispatch +/// is stabilized, see tracking issue https://github.com/rust-lang/rust/issues/43561). +/// Instead, we fudge a little by introducing a new type parameter `U` such that +/// `Self: Unsize` and `U: Trait + ?Sized`, and use `U` in place of `dyn Trait`. +/// Written as a chalk-style query: +/// +/// forall (U: Trait + ?Sized) { +/// if (Self: Unsize) { +/// Receiver: DispatchFromDyn U]> +/// } +/// } +/// +/// for `self: &'a mut Self`, this means `&'a mut Self: DispatchFromDyn<&'a mut U>` +/// for `self: Rc`, this means `Rc: DispatchFromDyn>` +/// for `self: Pin>`, this means `Pin>: DispatchFromDyn>>` +// +// FIXME(mikeyhew) when unsized receivers are implemented as part of unsized rvalues, add this +// fallback query: `Receiver: Unsize U]>` to support receivers like +// `self: Wrapper`. +#[allow(dead_code)] +fn receiver_is_dispatchable<'tcx>( + tcx: TyCtxt<'tcx>, + method: &ty::AssocItem, + receiver_ty: Ty<'tcx>, +) -> bool { + debug!("receiver_is_dispatchable: method = {:?}, receiver_ty = {:?}", method, receiver_ty); + + let traits = (tcx.lang_items().unsize_trait(), tcx.lang_items().dispatch_from_dyn_trait()); + let (unsize_did, dispatch_from_dyn_did) = if let (Some(u), Some(cu)) = traits { + (u, cu) + } else { + debug!("receiver_is_dispatchable: Missing Unsize or DispatchFromDyn traits"); + return false; + }; + + // the type `U` in the query + // use a bogus type parameter to mimick a forall(U) query using u32::MAX for now. + // FIXME(mikeyhew) this is a total hack. Once object_safe_for_dispatch is stabilized, we can + // replace this with `dyn Trait` + let unsized_self_ty: Ty<'tcx> = + tcx.mk_ty_param(::std::u32::MAX, Symbol::intern("RustaceansAreAwesome")); + + // `Receiver[Self => U]` + let unsized_receiver_ty = + receiver_for_self_ty(tcx, receiver_ty, unsized_self_ty, method.def_id); + + // create a modified param env, with `Self: Unsize` and `U: Trait` added to caller bounds + // `U: ?Sized` is already implied here + let param_env = { + let mut param_env = tcx.param_env(method.def_id); + + // Self: Unsize + let unsize_predicate = ty::TraitRef { + def_id: unsize_did, + substs: tcx.mk_substs_trait(tcx.types.self_param, &[unsized_self_ty.into()]), + } + .without_const() + .to_predicate(); + + // U: Trait + let trait_predicate = { + let substs = + InternalSubsts::for_item(tcx, method.container.assert_trait(), |param, _| { + if param.index == 0 { + unsized_self_ty.into() + } else { + tcx.mk_param_from_def(param) + } + }); - /// Checks the method's receiver (the `self` argument) can be dispatched on when `Self` is a - /// trait object. We require that `DispatchableFromDyn` be implemented for the receiver type - /// in the following way: - /// - let `Receiver` be the type of the `self` argument, i.e `Self`, `&Self`, `Rc`, - /// - require the following bound: - /// - /// ``` - /// Receiver[Self => T]: DispatchFromDyn dyn Trait]> - /// ``` - /// - /// where `Foo[X => Y]` means "the same type as `Foo`, but with `X` replaced with `Y`" - /// (substitution notation). - /// - /// Some examples of receiver types and their required obligation: - /// - `&'a mut self` requires `&'a mut Self: DispatchFromDyn<&'a mut dyn Trait>`, - /// - `self: Rc` requires `Rc: DispatchFromDyn>`, - /// - `self: Pin>` requires `Pin>: DispatchFromDyn>>`. - /// - /// The only case where the receiver is not dispatchable, but is still a valid receiver - /// type (just not object-safe), is when there is more than one level of pointer indirection. - /// E.g., `self: &&Self`, `self: &Rc`, `self: Box>`. In these cases, there - /// is no way, or at least no inexpensive way, to coerce the receiver from the version where - /// `Self = dyn Trait` to the version where `Self = T`, where `T` is the unknown erased type - /// contained by the trait object, because the object that needs to be coerced is behind - /// a pointer. - /// - /// In practice, we cannot use `dyn Trait` explicitly in the obligation because it would result - /// in a new check that `Trait` is object safe, creating a cycle (until object_safe_for_dispatch - /// is stabilized, see tracking issue https://github.com/rust-lang/rust/issues/43561). - /// Instead, we fudge a little by introducing a new type parameter `U` such that - /// `Self: Unsize` and `U: Trait + ?Sized`, and use `U` in place of `dyn Trait`. - /// Written as a chalk-style query: - /// - /// forall (U: Trait + ?Sized) { - /// if (Self: Unsize) { - /// Receiver: DispatchFromDyn U]> - /// } - /// } - /// - /// for `self: &'a mut Self`, this means `&'a mut Self: DispatchFromDyn<&'a mut U>` - /// for `self: Rc`, this means `Rc: DispatchFromDyn>` - /// for `self: Pin>`, this means `Pin>: DispatchFromDyn>>` - // - // FIXME(mikeyhew) when unsized receivers are implemented as part of unsized rvalues, add this - // fallback query: `Receiver: Unsize U]>` to support receivers like - // `self: Wrapper`. - #[allow(dead_code)] - fn receiver_is_dispatchable( - self, - method: &ty::AssocItem, - receiver_ty: Ty<'tcx>, - ) -> bool { - debug!("receiver_is_dispatchable: method = {:?}, receiver_ty = {:?}", method, receiver_ty); - - let traits = (self.lang_items().unsize_trait(), - self.lang_items().dispatch_from_dyn_trait()); - let (unsize_did, dispatch_from_dyn_did) = if let (Some(u), Some(cu)) = traits { - (u, cu) - } else { - debug!("receiver_is_dispatchable: Missing Unsize or DispatchFromDyn traits"); - return false; + ty::TraitRef { def_id: unsize_did, substs }.without_const().to_predicate() }; - // the type `U` in the query - // use a bogus type parameter to mimick a forall(U) query using u32::MAX for now. - // FIXME(mikeyhew) this is a total hack. Once object_safe_for_dispatch is stabilized, we can - // replace this with `dyn Trait` - let unsized_self_ty: Ty<'tcx> = self.mk_ty_param( - ::std::u32::MAX, - Symbol::intern("RustaceansAreAwesome"), - ); - - // `Receiver[Self => U]` - let unsized_receiver_ty = self.receiver_for_self_ty( - receiver_ty, unsized_self_ty, method.def_id - ); - - // create a modified param env, with `Self: Unsize` and `U: Trait` added to caller bounds - // `U: ?Sized` is already implied here - let param_env = { - let mut param_env = self.param_env(method.def_id); - - // Self: Unsize - let unsize_predicate = ty::TraitRef { - def_id: unsize_did, - substs: self.mk_substs_trait(self.types.self_param, &[unsized_self_ty.into()]), - }.to_predicate(); - - // U: Trait - let trait_predicate = { - let substs = InternalSubsts::for_item( - self, - method.container.assert_trait(), - |param, _| { - if param.index == 0 { - unsized_self_ty.into() - } else { - self.mk_param_from_def(param) - } - }, - ); - - ty::TraitRef { - def_id: unsize_did, - substs, - }.to_predicate() - }; - - let caller_bounds: Vec> = param_env.caller_bounds.iter().cloned() - .chain(iter::once(unsize_predicate)) - .chain(iter::once(trait_predicate)) - .collect(); + let caller_bounds: Vec> = param_env + .caller_bounds + .iter() + .cloned() + .chain(iter::once(unsize_predicate)) + .chain(iter::once(trait_predicate)) + .collect(); - param_env.caller_bounds = self.intern_predicates(&caller_bounds); + param_env.caller_bounds = tcx.intern_predicates(&caller_bounds); - param_env - }; + param_env + }; - // Receiver: DispatchFromDyn U]> - let obligation = { - let predicate = ty::TraitRef { - def_id: dispatch_from_dyn_did, - substs: self.mk_substs_trait(receiver_ty, &[unsized_receiver_ty.into()]), - }.to_predicate(); - - Obligation::new( - ObligationCause::dummy(), - param_env, - predicate, - ) - }; + // Receiver: DispatchFromDyn U]> + let obligation = { + let predicate = ty::TraitRef { + def_id: dispatch_from_dyn_did, + substs: tcx.mk_substs_trait(receiver_ty, &[unsized_receiver_ty.into()]), + } + .without_const() + .to_predicate(); - self.infer_ctxt().enter(|ref infcx| { - // the receiver is dispatchable iff the obligation holds - infcx.predicate_must_hold_modulo_regions(&obligation) - }) - } + Obligation::new(ObligationCause::dummy(), param_env, predicate) + }; - fn contains_illegal_self_type_reference( - self, - trait_def_id: DefId, - ty: Ty<'tcx>, - ) -> bool { - // This is somewhat subtle. In general, we want to forbid - // references to `Self` in the argument and return types, - // since the value of `Self` is erased. However, there is one - // exception: it is ok to reference `Self` in order to access - // an associated type of the current trait, since we retain - // the value of those associated types in the object type - // itself. - // - // ```rust - // trait SuperTrait { - // type X; - // } - // - // trait Trait : SuperTrait { - // type Y; - // fn foo(&self, x: Self) // bad - // fn foo(&self) -> Self // bad - // fn foo(&self) -> Option // bad - // fn foo(&self) -> Self::Y // OK, desugars to next example - // fn foo(&self) -> ::Y // OK - // fn foo(&self) -> Self::X // OK, desugars to next example - // fn foo(&self) -> ::X // OK - // } - // ``` - // - // However, it is not as simple as allowing `Self` in a projected - // type, because there are illegal ways to use `Self` as well: - // - // ```rust - // trait Trait : SuperTrait { - // ... - // fn foo(&self) -> ::X; - // } - // ``` - // - // Here we will not have the type of `X` recorded in the - // object type, and we cannot resolve `Self as SomeOtherTrait` - // without knowing what `Self` is. - - let mut supertraits: Option>> = None; - let mut error = false; - let self_ty = self.types.self_param; - ty.maybe_walk(|ty| { - match ty.kind { - ty::Param(_) => { - if ty == self_ty { - error = true; - } + tcx.infer_ctxt().enter(|ref infcx| { + // the receiver is dispatchable iff the obligation holds + infcx.predicate_must_hold_modulo_regions(&obligation) + }) +} - false // no contained types to walk +fn contains_illegal_self_type_reference<'tcx>( + tcx: TyCtxt<'tcx>, + trait_def_id: DefId, + ty: Ty<'tcx>, +) -> bool { + // This is somewhat subtle. In general, we want to forbid + // references to `Self` in the argument and return types, + // since the value of `Self` is erased. However, there is one + // exception: it is ok to reference `Self` in order to access + // an associated type of the current trait, since we retain + // the value of those associated types in the object type + // itself. + // + // ```rust + // trait SuperTrait { + // type X; + // } + // + // trait Trait : SuperTrait { + // type Y; + // fn foo(&self, x: Self) // bad + // fn foo(&self) -> Self // bad + // fn foo(&self) -> Option // bad + // fn foo(&self) -> Self::Y // OK, desugars to next example + // fn foo(&self) -> ::Y // OK + // fn foo(&self) -> Self::X // OK, desugars to next example + // fn foo(&self) -> ::X // OK + // } + // ``` + // + // However, it is not as simple as allowing `Self` in a projected + // type, because there are illegal ways to use `Self` as well: + // + // ```rust + // trait Trait : SuperTrait { + // ... + // fn foo(&self) -> ::X; + // } + // ``` + // + // Here we will not have the type of `X` recorded in the + // object type, and we cannot resolve `Self as SomeOtherTrait` + // without knowing what `Self` is. + + let mut supertraits: Option>> = None; + let mut error = false; + let self_ty = tcx.types.self_param; + ty.maybe_walk(|ty| { + match ty.kind { + ty::Param(_) => { + if ty == self_ty { + error = true; } - ty::Projection(ref data) => { - // This is a projected type `::X`. + false // no contained types to walk + } - // Compute supertraits of current trait lazily. - if supertraits.is_none() { - let trait_ref = ty::Binder::bind( - ty::TraitRef::identity(self, trait_def_id), - ); - supertraits = Some(traits::supertraits(self, trait_ref).collect()); - } + ty::Projection(ref data) => { + // This is a projected type `::X`. - // Determine whether the trait reference `Foo as - // SomeTrait` is in fact a supertrait of the - // current trait. In that case, this type is - // legal, because the type `X` will be specified - // in the object type. Note that we can just use - // direct equality here because all of these types - // are part of the formal parameter listing, and - // hence there should be no inference variables. - let projection_trait_ref = ty::Binder::bind(data.trait_ref(self)); - let is_supertrait_of_current_trait = - supertraits.as_ref().unwrap().contains(&projection_trait_ref); - - if is_supertrait_of_current_trait { - false // do not walk contained types, do not report error, do collect $200 - } else { - true // DO walk contained types, POSSIBLY reporting an error - } + // Compute supertraits of current trait lazily. + if supertraits.is_none() { + let trait_ref = ty::Binder::bind(ty::TraitRef::identity(tcx, trait_def_id)); + supertraits = Some(traits::supertraits(tcx, trait_ref).collect()); } - _ => true, // walk contained types, if any + // Determine whether the trait reference `Foo as + // SomeTrait` is in fact a supertrait of the + // current trait. In that case, this type is + // legal, because the type `X` will be specified + // in the object type. Note that we can just use + // direct equality here because all of these types + // are part of the formal parameter listing, and + // hence there should be no inference variables. + let projection_trait_ref = ty::Binder::bind(data.trait_ref(tcx)); + let is_supertrait_of_current_trait = + supertraits.as_ref().unwrap().contains(&projection_trait_ref); + + if is_supertrait_of_current_trait { + false // do not walk contained types, do not report error, do collect $200 + } else { + true // DO walk contained types, POSSIBLY reporting an error + } } - }); - error - } + _ => true, // walk contained types, if any + } + }); + + error } pub(super) fn is_object_safe_provider(tcx: TyCtxt<'_>, trait_def_id: DefId) -> bool { - tcx.object_safety_violations(trait_def_id).is_empty() + object_safety_violations(tcx, trait_def_id).is_empty() } diff --git a/src/librustc/traits/on_unimplemented.rs b/src/librustc/traits/on_unimplemented.rs index 604f39dcf2..669ec5ccc9 100644 --- a/src/librustc/traits/on_unimplemented.rs +++ b/src/librustc/traits/on_unimplemented.rs @@ -1,16 +1,15 @@ use fmt_macros::{Parser, Piece, Position}; -use crate::hir::def_id::DefId; -use crate::ty::{self, TyCtxt, GenericParamDefKind}; +use crate::ty::{self, GenericParamDefKind, TyCtxt}; use crate::util::common::ErrorReported; -use crate::util::nodemap::FxHashMap; +use rustc_data_structures::fx::FxHashMap; +use rustc_errors::struct_span_err; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_span::Span; use syntax::ast::{MetaItem, NestedMetaItem}; use syntax::attr; -use syntax::symbol::{Symbol, kw, sym}; -use syntax_pos::Span; - -use rustc_error_codes::*; #[derive(Clone, Debug)] pub struct OnUnimplementedFormatString(Symbol); @@ -40,8 +39,7 @@ fn parse_error( label: &str, note: Option<&str>, ) -> ErrorReported { - let mut diag = struct_span_err!( - tcx.sess, span, E0232, "{}", message); + let mut diag = struct_span_err!(tcx.sess, span, E0232, "{}", message); diag.span_label(span, label); if let Some(note) = note { diag.note(note); @@ -64,17 +62,27 @@ impl<'tcx> OnUnimplementedDirective { let condition = if is_root { None } else { - let cond = item_iter.next().ok_or_else(|| - parse_error(tcx, span, - "empty `on`-clause in `#[rustc_on_unimplemented]`", - "empty on-clause here", - None) - )?.meta_item().ok_or_else(|| - parse_error(tcx, span, - "invalid `on`-clause in `#[rustc_on_unimplemented]`", - "invalid on-clause here", - None) - )?; + let cond = item_iter + .next() + .ok_or_else(|| { + parse_error( + tcx, + span, + "empty `on`-clause in `#[rustc_on_unimplemented]`", + "empty on-clause here", + None, + ) + })? + .meta_item() + .ok_or_else(|| { + parse_error( + tcx, + span, + "invalid `on`-clause in `#[rustc_on_unimplemented]`", + "invalid on-clause here", + None, + ) + })?; attr::eval_condition(cond, &tcx.sess.parse_sess, &mut |_| true); Some(cond.clone()) }; @@ -86,9 +94,8 @@ impl<'tcx> OnUnimplementedDirective { let mut subcommands = vec![]; let parse_value = |value_str| { - OnUnimplementedFormatString::try_parse(tcx, trait_def_id, value_str, span) - .map(Some) - }; + OnUnimplementedFormatString::try_parse(tcx, trait_def_id, value_str, span).map(Some) + }; for item in item_iter { if item.check_name(sym::message) && message.is_none() { @@ -111,8 +118,11 @@ impl<'tcx> OnUnimplementedDirective { enclosing_scope = parse_value(enclosing_scope_)?; continue; } - } else if item.check_name(sym::on) && is_root && - message.is_none() && label.is_none() && note.is_none() + } else if item.check_name(sym::on) + && is_root + && message.is_none() + && label.is_none() + && note.is_none() { if let Some(items) = item.meta_item_list() { if let Ok(subcommand) = @@ -122,15 +132,18 @@ impl<'tcx> OnUnimplementedDirective { } else { errored = true; } - continue + continue; } } // nothing found - parse_error(tcx, item.span(), - "this attribute must have a valid value", - "expected value here", - Some(r#"eg `#[rustc_on_unimplemented(message="foo")]`"#)); + parse_error( + tcx, + item.span(), + "this attribute must have a valid value", + "expected value here", + Some(r#"eg `#[rustc_on_unimplemented(message="foo")]`"#), + ); } if errored { @@ -142,7 +155,7 @@ impl<'tcx> OnUnimplementedDirective { message, label, note, - enclosing_scope + enclosing_scope, }) } } @@ -168,7 +181,11 @@ impl<'tcx> OnUnimplementedDirective { message: None, subcommands: vec![], label: Some(OnUnimplementedFormatString::try_parse( - tcx, trait_def_id, value, attr.span)?), + tcx, + trait_def_id, + value, + attr.span, + )?), note: None, enclosing_scope: None, })) @@ -195,14 +212,11 @@ impl<'tcx> OnUnimplementedDirective { if let Some(ref condition) = command.condition { if !attr::eval_condition(condition, &tcx.sess.parse_sess, &mut |c| { c.ident().map_or(false, |ident| { - options.contains(&( - ident.name, - c.value_str().map(|s| s.to_string()) - )) + options.contains(&(ident.name, c.value_str().map(|s| s.to_string()))) }) }) { debug!("evaluate: skipping {:?} due to condition", command); - continue + continue; } } debug!("evaluate: {:?} succeeded", command); @@ -223,7 +237,8 @@ impl<'tcx> OnUnimplementedDirective { } } - let options: FxHashMap = options.into_iter() + let options: FxHashMap = options + .into_iter() .filter_map(|(k, v)| v.as_ref().map(|v| (*k, v.to_owned()))) .collect(); OnUnimplementedNote { @@ -273,23 +288,35 @@ impl<'tcx> OnUnimplementedFormatString { // `{ItemContext}` is allowed Position::ArgumentNamed(s) if s == sym::item_context => (), // So is `{A}` if A is a type parameter - Position::ArgumentNamed(s) => match generics.params.iter().find(|param| { - param.name == s - }) { - Some(_) => (), - None => { - span_err!(tcx.sess, span, E0230, - "there is no parameter `{}` on trait `{}`", s, name); - result = Err(ErrorReported); + Position::ArgumentNamed(s) => { + match generics.params.iter().find(|param| param.name == s) { + Some(_) => (), + None => { + struct_span_err!( + tcx.sess, + span, + E0230, + "there is no parameter `{}` on trait `{}`", + s, + name + ) + .emit(); + result = Err(ErrorReported); + } } - }, + } // `{:1}` and `{}` are not to be used Position::ArgumentIs(_) | Position::ArgumentImplicitlyIs(_) => { - span_err!(tcx.sess, span, E0231, - "only named substitution parameters are allowed"); + struct_span_err!( + tcx.sess, + span, + E0231, + "only named substitution parameters are allowed" + ) + .emit(); result = Err(ErrorReported); } - } + }, } } @@ -305,31 +332,32 @@ impl<'tcx> OnUnimplementedFormatString { let name = tcx.item_name(trait_ref.def_id); let trait_str = tcx.def_path_str(trait_ref.def_id); let generics = tcx.generics_of(trait_ref.def_id); - let generic_map = generics.params.iter().filter_map(|param| { - let value = match param.kind { - GenericParamDefKind::Type { .. } | - GenericParamDefKind::Const => { - trait_ref.substs[param.index as usize].to_string() - }, - GenericParamDefKind::Lifetime => return None - }; - let name = param.name; - Some((name, value)) - }).collect::>(); + let generic_map = generics + .params + .iter() + .filter_map(|param| { + let value = match param.kind { + GenericParamDefKind::Type { .. } | GenericParamDefKind::Const => { + trait_ref.substs[param.index as usize].to_string() + } + GenericParamDefKind::Lifetime => return None, + }; + let name = param.name; + Some((name, value)) + }) + .collect::>(); let empty_string = String::new(); let s = self.0.as_str(); let parser = Parser::new(&s, None, vec![], false); let item_context = (options.get(&sym::item_context)).unwrap_or(&empty_string); - parser.map(|p| - match p { + parser + .map(|p| match p { Piece::String(s) => s, Piece::NextArgument(a) => match a.position { Position::ArgumentNamed(s) => match generic_map.get(&s) { Some(val) => val, - None if s == name => { - &trait_str - } + None if s == name => &trait_str, None => { if let Some(val) = options.get(&s) { val @@ -339,15 +367,19 @@ impl<'tcx> OnUnimplementedFormatString { } else if s == sym::item_context { &item_context } else { - bug!("broken on_unimplemented {:?} for {:?}: \ + bug!( + "broken on_unimplemented {:?} for {:?}: \ no argument matching {:?}", - self.0, trait_ref, s) + self.0, + trait_ref, + s + ) } } }, - _ => bug!("broken on_unimplemented {:?} - bad format arg", self.0) - } - } - ).collect() + _ => bug!("broken on_unimplemented {:?} - bad format arg", self.0), + }, + }) + .collect() } } diff --git a/src/librustc/traits/project.rs b/src/librustc/traits/project.rs index 1fdec5f015..3085837335 100644 --- a/src/librustc/traits/project.rs +++ b/src/librustc/traits/project.rs @@ -3,26 +3,26 @@ use super::elaborate_predicates; use super::specialization_graph; use super::translate_substs; +use super::util; use super::Obligation; use super::ObligationCause; use super::PredicateObligation; use super::Selection; use super::SelectionContext; use super::SelectionError; -use super::{VtableImplData, VtableClosureData, VtableGeneratorData, VtableFnPointerData}; -use super::util; +use super::{VtableClosureData, VtableFnPointerData, VtableGeneratorData, VtableImplData}; -use crate::hir::def_id::DefId; -use crate::infer::{InferCtxt, InferOk, LateBoundRegionConversionTime}; use crate::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; +use crate::infer::{InferCtxt, InferOk, LateBoundRegionConversionTime}; +use crate::ty::fold::{TypeFoldable, TypeFolder}; +use crate::ty::subst::{InternalSubsts, Subst}; +use crate::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, WithConstness}; use rustc_data_structures::snapshot_map::{Snapshot, SnapshotMap}; +use rustc_hir::def_id::DefId; use rustc_macros::HashStable; +use rustc_span::symbol::sym; +use rustc_span::DUMMY_SP; use syntax::ast::Ident; -use syntax::symbol::sym; -use crate::ty::subst::{Subst, InternalSubsts}; -use crate::ty::{self, ToPredicate, ToPolyTraitRef, Ty, TyCtxt}; -use crate::ty::fold::{TypeFoldable, TypeFolder}; -use crate::util::common::FN_OUTPUT_NAME; /// Depending on the stage of compilation, we want projection to be /// more or less conservative. @@ -66,14 +66,11 @@ pub enum Reveal { All, } -pub type PolyProjectionObligation<'tcx> = - Obligation<'tcx, ty::PolyProjectionPredicate<'tcx>>; +pub type PolyProjectionObligation<'tcx> = Obligation<'tcx, ty::PolyProjectionPredicate<'tcx>>; -pub type ProjectionObligation<'tcx> = - Obligation<'tcx, ty::ProjectionPredicate<'tcx>>; +pub type ProjectionObligation<'tcx> = Obligation<'tcx, ty::ProjectionPredicate<'tcx>>; -pub type ProjectionTyObligation<'tcx> = - Obligation<'tcx, ty::ProjectionTy<'tcx>>; +pub type ProjectionTyObligation<'tcx> = Obligation<'tcx, ty::ProjectionTy<'tcx>>; /// When attempting to resolve `::Name` ... #[derive(Debug)] @@ -87,7 +84,7 @@ pub enum ProjectionTyError<'tcx> { #[derive(Clone)] pub struct MismatchedProjectionTypes<'tcx> { - pub err: ty::error::TypeError<'tcx> + pub err: ty::error::TypeError<'tcx>, } #[derive(PartialEq, Eq, Debug)] @@ -122,8 +119,8 @@ impl<'tcx> ProjectionTyCandidateSet<'tcx> { // was discarded -- this could be because of ambiguity, or because // a higher-priority candidate is already there. fn push_candidate(&mut self, candidate: ProjectionTyCandidate<'tcx>) -> bool { - use self::ProjectionTyCandidateSet::*; use self::ProjectionTyCandidate::*; + use self::ProjectionTyCandidateSet::*; // This wacky variable is just used to try and // make code readable and avoid confusing paths. @@ -186,8 +183,7 @@ pub fn poly_project_and_unify_type<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &PolyProjectionObligation<'tcx>, ) -> Result>>, MismatchedProjectionTypes<'tcx>> { - debug!("poly_project_and_unify_type(obligation={:?})", - obligation); + debug!("poly_project_and_unify_type(obligation={:?})", obligation); let infcx = selcx.infcx(); infcx.commit_if_ok(|snapshot| { @@ -196,7 +192,8 @@ pub fn poly_project_and_unify_type<'cx, 'tcx>( let placeholder_obligation = obligation.with(placeholder_predicate); let result = project_and_unify_type(selcx, &placeholder_obligation)?; - infcx.leak_check(false, &placeholder_map, snapshot) + infcx + .leak_check(false, &placeholder_map, snapshot) .map_err(|err| MismatchedProjectionTypes { err })?; Ok(result) }) @@ -211,32 +208,35 @@ fn project_and_unify_type<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionObligation<'tcx>, ) -> Result>>, MismatchedProjectionTypes<'tcx>> { - debug!("project_and_unify_type(obligation={:?})", - obligation); + debug!("project_and_unify_type(obligation={:?})", obligation); let mut obligations = vec![]; - let normalized_ty = - match opt_normalize_projection_type(selcx, - obligation.param_env, - obligation.predicate.projection_ty, - obligation.cause.clone(), - obligation.recursion_depth, - &mut obligations) { - Some(n) => n, - None => return Ok(None), - }; + let normalized_ty = match opt_normalize_projection_type( + selcx, + obligation.param_env, + obligation.predicate.projection_ty, + obligation.cause.clone(), + obligation.recursion_depth, + &mut obligations, + ) { + Some(n) => n, + None => return Ok(None), + }; - debug!("project_and_unify_type: normalized_ty={:?} obligations={:?}", - normalized_ty, - obligations); + debug!( + "project_and_unify_type: normalized_ty={:?} obligations={:?}", + normalized_ty, obligations + ); let infcx = selcx.infcx(); - match infcx.at(&obligation.cause, obligation.param_env) - .eq(normalized_ty, obligation.predicate.ty) { + match infcx + .at(&obligation.cause, obligation.param_env) + .eq(normalized_ty, obligation.predicate.ty) + { Ok(InferOk { obligations: inferred_obligations, value: () }) => { obligations.extend(inferred_obligations); Ok(Some(obligations)) - }, + } Err(err) => { debug!("project_and_unify_type: equating types encountered error {:?}", err); Err(MismatchedProjectionTypes { err }) @@ -274,14 +274,14 @@ where debug!("normalize_with_depth(depth={}, value={:?})", depth, value); let mut normalizer = AssocTypeNormalizer::new(selcx, param_env, cause, depth); let result = normalizer.fold(value); - debug!("normalize_with_depth: depth={} result={:?} with {} obligations", - depth, result, normalizer.obligations.len()); - debug!("normalize_with_depth: depth={} obligations={:?}", - depth, normalizer.obligations); - Normalized { - value: result, - obligations: normalizer.obligations, - } + debug!( + "normalize_with_depth: depth={} result={:?} with {} obligations", + depth, + result, + normalizer.obligations.len() + ); + debug!("normalize_with_depth: depth={} obligations={:?}", depth, normalizer.obligations); + Normalized { value: result, obligations: normalizer.obligations } } struct AssocTypeNormalizer<'a, 'b, 'tcx> { @@ -299,23 +299,13 @@ impl<'a, 'b, 'tcx> AssocTypeNormalizer<'a, 'b, 'tcx> { cause: ObligationCause<'tcx>, depth: usize, ) -> AssocTypeNormalizer<'a, 'b, 'tcx> { - AssocTypeNormalizer { - selcx, - param_env, - cause, - obligations: vec![], - depth, - } + AssocTypeNormalizer { selcx, param_env, cause, obligations: vec![], depth } } - fn fold>(&mut self, value: &T) -> T { + fn fold>(&mut self, value: &T) -> T { let value = self.selcx.infcx().resolve_vars_if_possible(value); - if !value.has_projections() { - value - } else { - value.fold_with(self) - } + if !value.has_projections() { value } else { value.fold_with(self) } } } @@ -325,6 +315,9 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> { } fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { + if !ty.has_projections() { + return ty; + } // We don't want to normalize associated types that occur inside of region // binders, because they may contain bound regions, and we can't cope with that. // @@ -338,7 +331,8 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> { let ty = ty.super_fold_with(self); match ty.kind { - ty::Opaque(def_id, substs) if !substs.has_escaping_bound_vars() => { // (*) + ty::Opaque(def_id, substs) if !substs.has_escaping_bound_vars() => { + // (*) // Only normalize `impl Trait` after type-checking, usually in codegen. match self.param_env.reveal { Reveal::UserFacing => ty, @@ -365,7 +359,8 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> { } } - ty::Projection(ref data) if !data.has_escaping_bound_vars() => { // (*) + ty::Projection(ref data) if !data.has_escaping_bound_vars() => { + // (*) // (*) This is kind of hacky -- we need to be able to // handle normalization within binders because @@ -379,19 +374,26 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> { // binder). It would be better to normalize in a // binding-aware fashion. - let normalized_ty = normalize_projection_type(self.selcx, - self.param_env, - data.clone(), - self.cause.clone(), - self.depth, - &mut self.obligations); - debug!("AssocTypeNormalizer: depth={} normalized {:?} to {:?}, \ + let normalized_ty = normalize_projection_type( + self.selcx, + self.param_env, + *data, + self.cause.clone(), + self.depth, + &mut self.obligations, + ); + debug!( + "AssocTypeNormalizer: depth={} normalized {:?} to {:?}, \ now with {} obligations", - self.depth, ty, normalized_ty, self.obligations.len()); + self.depth, + ty, + normalized_ty, + self.obligations.len() + ); normalized_ty } - _ => ty + _ => ty, } } @@ -401,15 +403,15 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> { } #[derive(Clone, TypeFoldable)] -pub struct Normalized<'tcx,T> { +pub struct Normalized<'tcx, T> { pub value: T, pub obligations: Vec>, } pub type NormalizedTy<'tcx> = Normalized<'tcx, Ty<'tcx>>; -impl<'tcx,T> Normalized<'tcx,T> { - pub fn with(self, value: U) -> Normalized<'tcx,U> { +impl<'tcx, T> Normalized<'tcx, T> { + pub fn with(self, value: U) -> Normalized<'tcx, U> { Normalized { value: value, obligations: self.obligations } } } @@ -428,30 +430,31 @@ pub fn normalize_projection_type<'a, 'b, 'tcx>( depth: usize, obligations: &mut Vec>, ) -> Ty<'tcx> { - opt_normalize_projection_type(selcx, param_env, projection_ty.clone(), cause.clone(), depth, - obligations) - .unwrap_or_else(move || { - // if we bottom out in ambiguity, create a type variable - // and a deferred predicate to resolve this when more type - // information is available. - - let tcx = selcx.infcx().tcx; - let def_id = projection_ty.item_def_id; - let ty_var = selcx.infcx().next_ty_var( - TypeVariableOrigin { - kind: TypeVariableOriginKind::NormalizeProjectionType, - span: tcx.def_span(def_id), - }, - ); - let projection = ty::Binder::dummy(ty::ProjectionPredicate { - projection_ty, - ty: ty_var - }); - let obligation = Obligation::with_depth( - cause, depth + 1, param_env, projection.to_predicate()); - obligations.push(obligation); - ty_var - }) + opt_normalize_projection_type( + selcx, + param_env, + projection_ty, + cause.clone(), + depth, + obligations, + ) + .unwrap_or_else(move || { + // if we bottom out in ambiguity, create a type variable + // and a deferred predicate to resolve this when more type + // information is available. + + let tcx = selcx.infcx().tcx; + let def_id = projection_ty.item_def_id; + let ty_var = selcx.infcx().next_ty_var(TypeVariableOrigin { + kind: TypeVariableOriginKind::NormalizeProjectionType, + span: tcx.def_span(def_id), + }); + let projection = ty::Binder::dummy(ty::ProjectionPredicate { projection_ty, ty: ty_var }); + let obligation = + Obligation::with_depth(cause, depth + 1, param_env, projection.to_predicate()); + obligations.push(obligation); + ty_var + }) } /// The guts of `normalize`: normalize a specific projection like `( let projection_ty = infcx.resolve_vars_if_possible(&projection_ty); let cache_key = ProjectionCacheKey { ty: projection_ty }; - debug!("opt_normalize_projection_type(\ + debug!( + "opt_normalize_projection_type(\ projection_ty={:?}, \ depth={})", - projection_ty, - depth); + projection_ty, depth + ); // FIXME(#20304) For now, I am caching here, which is good, but it // means we don't capture the type variables that are created in @@ -493,7 +497,7 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>( let cache_result = infcx.projection_cache.borrow_mut().try_start(cache_key); match cache_result { - Ok(()) => { } + Ok(()) => {} Err(ProjectionCacheEntry::Ambiguous) => { // If we found ambiguity the last time, that generally // means we will continue to do so until some type in the @@ -504,8 +508,10 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>( // // FIXME(#32286) refactor this so that closure type // changes - debug!("opt_normalize_projection_type: \ - found cache entry: ambiguous"); + debug!( + "opt_normalize_projection_type: \ + found cache entry: ambiguous" + ); if !projection_ty.has_closure_types() { return None; } @@ -531,15 +537,15 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>( // return Some(NormalizedTy { value: v, obligations: vec![] }); // ``` - debug!("opt_normalize_projection_type: \ - found cache entry: in-progress"); + debug!( + "opt_normalize_projection_type: \ + found cache entry: in-progress" + ); // But for now, let's classify this as an overflow: let recursion_limit = *selcx.tcx().sess.recursion_limit.get(); - let obligation = Obligation::with_depth(cause, - recursion_limit, - param_env, - projection_ty); + let obligation = + Obligation::with_depth(cause, recursion_limit, param_env, projection_ty); selcx.infcx().report_overflow_error(&obligation, false); } Err(ProjectionCacheEntry::NormalizedTy(ty)) => { @@ -554,74 +560,74 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>( // discarded as duplicated). But when doing trait // evaluation this is not the case, and dropping the trait // evaluations can causes ICEs (e.g., #43132). - debug!("opt_normalize_projection_type: \ + debug!( + "opt_normalize_projection_type: \ found normalized ty `{:?}`", - ty); + ty + ); // Once we have inferred everything we need to know, we // can ignore the `obligations` from that point on. if infcx.unresolved_type_vars(&ty.value).is_none() { infcx.projection_cache.borrow_mut().complete_normalized(cache_key, &ty); - // No need to extend `obligations`. + // No need to extend `obligations`. } else { obligations.extend(ty.obligations); } - obligations.push(get_paranoid_cache_value_obligation(infcx, - param_env, - projection_ty, - cause, - depth)); + obligations.push(get_paranoid_cache_value_obligation( + infcx, + param_env, + projection_ty, + cause, + depth, + )); return Some(ty.value); } Err(ProjectionCacheEntry::Error) => { - debug!("opt_normalize_projection_type: \ - found error"); + debug!( + "opt_normalize_projection_type: \ + found error" + ); let result = normalize_to_error(selcx, param_env, projection_ty, cause, depth); obligations.extend(result.obligations); - return Some(result.value) + return Some(result.value); } } let obligation = Obligation::with_depth(cause.clone(), depth, param_env, projection_ty); match project_type(selcx, &obligation) { - Ok(ProjectedTy::Progress(Progress { ty: projected_ty, - obligations: mut projected_obligations })) => { + Ok(ProjectedTy::Progress(Progress { + ty: projected_ty, + obligations: mut projected_obligations, + })) => { // if projection succeeded, then what we get out of this // is also non-normalized (consider: it was derived from // an impl, where-clause etc) and hence we must // re-normalize it - debug!("opt_normalize_projection_type: \ + debug!( + "opt_normalize_projection_type: \ projected_ty={:?} \ depth={} \ projected_obligations={:?}", - projected_ty, - depth, - projected_obligations); + projected_ty, depth, projected_obligations + ); let result = if projected_ty.has_projections() { - let mut normalizer = AssocTypeNormalizer::new(selcx, - param_env, - cause, - depth+1); + let mut normalizer = AssocTypeNormalizer::new(selcx, param_env, cause, depth + 1); let normalized_ty = normalizer.fold(&projected_ty); - debug!("opt_normalize_projection_type: \ + debug!( + "opt_normalize_projection_type: \ normalized_ty={:?} depth={}", - normalized_ty, - depth); + normalized_ty, depth + ); projected_obligations.extend(normalizer.obligations); - Normalized { - value: normalized_ty, - obligations: projected_obligations, - } + Normalized { value: normalized_ty, obligations: projected_obligations } } else { - Normalized { - value: projected_ty, - obligations: projected_obligations, - } + Normalized { value: projected_ty, obligations: projected_obligations } }; let cache_value = prune_cache_value_obligations(infcx, &result); @@ -630,22 +636,22 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>( Some(result.value) } Ok(ProjectedTy::NoProgress(projected_ty)) => { - debug!("opt_normalize_projection_type: \ + debug!( + "opt_normalize_projection_type: \ projected_ty={:?} no progress", - projected_ty); - let result = Normalized { - value: projected_ty, - obligations: vec![] - }; + projected_ty + ); + let result = Normalized { value: projected_ty, obligations: vec![] }; infcx.projection_cache.borrow_mut().insert_ty(cache_key, result.clone()); // No need to extend `obligations`. Some(result.value) } Err(ProjectionTyError::TooManyCandidates) => { - debug!("opt_normalize_projection_type: \ - too many candidates"); - infcx.projection_cache.borrow_mut() - .ambiguous(cache_key); + debug!( + "opt_normalize_projection_type: \ + too many candidates" + ); + infcx.projection_cache.borrow_mut().ambiguous(cache_key); None } Err(ProjectionTyError::TraitSelectionError(_)) => { @@ -655,8 +661,7 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>( // Trait`, which when processed will cause the error to be // reported later - infcx.projection_cache.borrow_mut() - .error(cache_key); + infcx.projection_cache.borrow_mut().error(cache_key); let result = normalize_to_error(selcx, param_env, projection_ty, cause, depth); obligations.extend(result.obligations); Some(result.value) @@ -675,28 +680,27 @@ fn prune_cache_value_obligations<'a, 'tcx>( return NormalizedTy { value: result.value, obligations: vec![] }; } - let mut obligations: Vec<_> = - result.obligations - .iter() - .filter(|obligation| match obligation.predicate { - // We found a `T: Foo` predicate, let's check - // if `U` references any unresolved type - // variables. In principle, we only care if this - // projection can help resolve any of the type - // variables found in `result.value` -- but we just - // check for any type variables here, for fear of - // indirect obligations (e.g., we project to `?0`, - // but we have `T: Foo` and `?1: Bar`). - ty::Predicate::Projection(ref data) => - infcx.unresolved_type_vars(&data.ty()).is_some(), - - // We are only interested in `T: Foo` predicates, whre - // `U` references one of `unresolved_type_vars`. =) - _ => false, - }) - .cloned() - .collect(); + let mut obligations: Vec<_> = result + .obligations + .iter() + .filter(|obligation| match obligation.predicate { + // We found a `T: Foo` predicate, let's check + // if `U` references any unresolved type + // variables. In principle, we only care if this + // projection can help resolve any of the type + // variables found in `result.value` -- but we just + // check for any type variables here, for fear of + // indirect obligations (e.g., we project to `?0`, + // but we have `T: Foo` and `?1: Bar`). + ty::Predicate::Projection(ref data) => infcx.unresolved_type_vars(&data.ty()).is_some(), + + // We are only interested in `T: Foo` predicates, whre + // `U` references one of `unresolved_type_vars`. =) + _ => false, + }) + .cloned() + .collect(); obligations.shrink_to_fit(); @@ -738,7 +742,7 @@ fn get_paranoid_cache_value_obligation<'a, 'tcx>( cause, recursion_depth: depth, param_env, - predicate: trait_ref.to_predicate(), + predicate: trait_ref.without_const().to_predicate(), } } @@ -769,22 +773,19 @@ fn normalize_to_error<'a, 'tcx>( depth: usize, ) -> NormalizedTy<'tcx> { let trait_ref = projection_ty.trait_ref(selcx.tcx()).to_poly_trait_ref(); - let trait_obligation = Obligation { cause, - recursion_depth: depth, - param_env, - predicate: trait_ref.to_predicate() }; + let trait_obligation = Obligation { + cause, + recursion_depth: depth, + param_env, + predicate: trait_ref.without_const().to_predicate(), + }; let tcx = selcx.infcx().tcx; let def_id = projection_ty.item_def_id; - let new_value = selcx.infcx().next_ty_var( - TypeVariableOrigin { - kind: TypeVariableOriginKind::NormalizeProjectionType, - span: tcx.def_span(def_id), - }, - ); - Normalized { - value: new_value, - obligations: vec![trait_obligation] - } + let new_value = selcx.infcx().next_ty_var(TypeVariableOrigin { + kind: TypeVariableOriginKind::NormalizeProjectionType, + span: tcx.def_span(def_id), + }); + Normalized { value: new_value, obligations: vec![trait_obligation] } } enum ProjectedTy<'tcx> { @@ -799,20 +800,20 @@ struct Progress<'tcx> { impl<'tcx> Progress<'tcx> { fn error(tcx: TyCtxt<'tcx>) -> Self { - Progress { - ty: tcx.types.err, - obligations: vec![], - } + Progress { ty: tcx.types.err, obligations: vec![] } } - fn with_addl_obligations(mut self, - mut obligations: Vec>) - -> Self { - debug!("with_addl_obligations: self.obligations.len={} obligations.len={}", - self.obligations.len(), obligations.len()); + fn with_addl_obligations(mut self, mut obligations: Vec>) -> Self { + debug!( + "with_addl_obligations: self.obligations.len={} obligations.len={}", + self.obligations.len(), + obligations.len() + ); - debug!("with_addl_obligations: self.obligations={:?} obligations={:?}", - self.obligations, obligations); + debug!( + "with_addl_obligations: self.obligations={:?} obligations={:?}", + self.obligations, obligations + ); self.obligations.append(&mut obligations); self @@ -827,8 +828,7 @@ fn project_type<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, ) -> Result, ProjectionTyError<'tcx>> { - debug!("project(obligation={:?})", - obligation); + debug!("project(obligation={:?})", obligation); let recursion_limit = *selcx.tcx().sess.recursion_limit.get(); if obligation.recursion_depth >= recursion_limit { @@ -849,37 +849,26 @@ fn project_type<'cx, 'tcx>( // Make sure that the following procedures are kept in order. ParamEnv // needs to be first because it has highest priority, and Select checks // the return value of push_candidate which assumes it's ran at last. - assemble_candidates_from_param_env(selcx, - obligation, - &obligation_trait_ref, - &mut candidates); + assemble_candidates_from_param_env(selcx, obligation, &obligation_trait_ref, &mut candidates); - assemble_candidates_from_trait_def(selcx, - obligation, - &obligation_trait_ref, - &mut candidates); + assemble_candidates_from_trait_def(selcx, obligation, &obligation_trait_ref, &mut candidates); - assemble_candidates_from_impls(selcx, - obligation, - &obligation_trait_ref, - &mut candidates); + assemble_candidates_from_impls(selcx, obligation, &obligation_trait_ref, &mut candidates); match candidates { ProjectionTyCandidateSet::Single(candidate) => Ok(ProjectedTy::Progress( - confirm_candidate(selcx, - obligation, - &obligation_trait_ref, - candidate))), + confirm_candidate(selcx, obligation, &obligation_trait_ref, candidate), + )), ProjectionTyCandidateSet::None => Ok(ProjectedTy::NoProgress( - selcx.tcx().mk_projection( - obligation.predicate.item_def_id, - obligation.predicate.substs))), + selcx + .tcx() + .mk_projection(obligation.predicate.item_def_id, obligation.predicate.substs), + )), // Error occurred while trying to processing impls. ProjectionTyCandidateSet::Error(e) => Err(ProjectionTyError::TraitSelectionError(e)), // Inherent ambiguity that prevents us from even enumerating the // candidates. ProjectionTyCandidateSet::Ambiguous => Err(ProjectionTyError::TooManyCandidates), - } } @@ -893,12 +882,14 @@ fn assemble_candidates_from_param_env<'cx, 'tcx>( candidate_set: &mut ProjectionTyCandidateSet<'tcx>, ) { debug!("assemble_candidates_from_param_env(..)"); - assemble_candidates_from_predicates(selcx, - obligation, - obligation_trait_ref, - candidate_set, - ProjectionTyCandidate::ParamEnv, - obligation.param_env.caller_bounds.iter().cloned()); + assemble_candidates_from_predicates( + selcx, + obligation, + obligation_trait_ref, + candidate_set, + ProjectionTyCandidate::ParamEnv, + obligation.param_env.caller_bounds.iter().cloned(), + ); } /// In the case of a nested projection like <::FooT as Bar>::BarT, we may find @@ -922,9 +913,7 @@ fn assemble_candidates_from_trait_def<'cx, 'tcx>( let tcx = selcx.tcx(); // Check whether the self-type is itself a projection. let (def_id, substs) = match obligation_trait_ref.self_ty().kind { - ty::Projection(ref data) => { - (data.trait_ref(tcx).def_id, data.substs) - } + ty::Projection(ref data) => (data.trait_ref(tcx).def_id, data.substs), ty::Opaque(def_id, substs) => (def_id, substs), ty::Infer(ty::TyVar(_)) => { // If the self-type is an inference variable, then it MAY wind up @@ -932,19 +921,21 @@ fn assemble_candidates_from_trait_def<'cx, 'tcx>( candidate_set.mark_ambiguous(); return; } - _ => return + _ => return, }; // If so, extract what we know from the trait and try to come up with a good answer. let trait_predicates = tcx.predicates_of(def_id); let bounds = trait_predicates.instantiate(tcx, substs); let bounds = elaborate_predicates(tcx, bounds.predicates); - assemble_candidates_from_predicates(selcx, - obligation, - obligation_trait_ref, - candidate_set, - ProjectionTyCandidate::TraitDef, - bounds) + assemble_candidates_from_predicates( + selcx, + obligation, + obligation_trait_ref, + candidate_set, + ProjectionTyCandidate::TraitDef, + bounds, + ) } fn assemble_candidates_from_predicates<'cx, 'tcx, I>( @@ -957,32 +948,32 @@ fn assemble_candidates_from_predicates<'cx, 'tcx, I>( ) where I: IntoIterator>, { - debug!("assemble_candidates_from_predicates(obligation={:?})", - obligation); + debug!("assemble_candidates_from_predicates(obligation={:?})", obligation); let infcx = selcx.infcx(); for predicate in env_predicates { - debug!("assemble_candidates_from_predicates: predicate={:?}", - predicate); + debug!("assemble_candidates_from_predicates: predicate={:?}", predicate); if let ty::Predicate::Projection(data) = predicate { let same_def_id = data.projection_def_id() == obligation.predicate.item_def_id; - let is_match = same_def_id && infcx.probe(|_| { - let data_poly_trait_ref = - data.to_poly_trait_ref(infcx.tcx); - let obligation_poly_trait_ref = - obligation_trait_ref.to_poly_trait_ref(); - infcx.at(&obligation.cause, obligation.param_env) - .sup(obligation_poly_trait_ref, data_poly_trait_ref) - .map(|InferOk { obligations: _, value: () }| { - // FIXME(#32730) -- do we need to take obligations - // into account in any way? At the moment, no. - }) - .is_ok() - }); - - debug!("assemble_candidates_from_predicates: candidate={:?} \ + let is_match = same_def_id + && infcx.probe(|_| { + let data_poly_trait_ref = data.to_poly_trait_ref(infcx.tcx); + let obligation_poly_trait_ref = obligation_trait_ref.to_poly_trait_ref(); + infcx + .at(&obligation.cause, obligation.param_env) + .sup(obligation_poly_trait_ref, data_poly_trait_ref) + .map(|InferOk { obligations: _, value: () }| { + // FIXME(#32730) -- do we need to take obligations + // into account in any way? At the moment, no. + }) + .is_ok() + }); + + debug!( + "assemble_candidates_from_predicates: candidate={:?} \ is_match={} same_def_id={}", - data, is_match, same_def_id); + data, is_match, same_def_id + ); if is_match { candidate_set.push_candidate(ctor(data)); @@ -1016,13 +1007,12 @@ fn assemble_candidates_from_impls<'cx, 'tcx>( }; let eligible = match &vtable { - super::VtableClosure(_) | - super::VtableGenerator(_) | - super::VtableFnPointer(_) | - super::VtableObject(_) | - super::VtableTraitAlias(_) => { - debug!("assemble_candidates_from_impls: vtable={:?}", - vtable); + super::VtableClosure(_) + | super::VtableGenerator(_) + | super::VtableFnPointer(_) + | super::VtableObject(_) + | super::VtableTraitAlias(_) => { + debug!("assemble_candidates_from_impls: vtable={:?}", vtable); true } super::VtableImpl(impl_data) => { @@ -1045,9 +1035,11 @@ fn assemble_candidates_from_impls<'cx, 'tcx>( // In either case, we handle this by not adding a // candidate for an impl if it contains a `default` // type. - let node_item = assoc_ty_def(selcx, - impl_data.impl_def_id, - obligation.predicate.item_def_id); + // + // NOTE: This should be kept in sync with the similar code in + // `rustc::ty::instance::resolve_associated_item()`. + let node_item = + assoc_ty_def(selcx, impl_data.impl_def_id, obligation.predicate.item_def_id); let is_default = if node_item.node.is_from_trait() { // If true, the impl inherited a `type Foo = Bar` @@ -1068,8 +1060,8 @@ fn assemble_candidates_from_impls<'cx, 'tcx>( // being invoked). node_item.item.defaultness.has_value() } else { - node_item.item.defaultness.is_default() || - selcx.tcx().impl_is_default(node_item.node.def_id()) + node_item.item.defaultness.is_default() + || super::util::impl_is_default(selcx.tcx(), node_item.node.def_id()) }; // Only reveal a specializable default if we're past type-checking @@ -1115,13 +1107,13 @@ fn assemble_candidates_from_impls<'cx, 'tcx>( // in `assemble_candidates_from_param_env`. false } - super::VtableAutoImpl(..) | - super::VtableBuiltin(..) => { + super::VtableAutoImpl(..) | super::VtableBuiltin(..) => { // These traits have no associated types. span_bug!( obligation.cause.span, "Cannot project an associated type from `{:?}`", - vtable); + vtable + ); } }; @@ -1143,13 +1135,11 @@ fn confirm_candidate<'cx, 'tcx>( obligation_trait_ref: &ty::TraitRef<'tcx>, candidate: ProjectionTyCandidate<'tcx>, ) -> Progress<'tcx> { - debug!("confirm_candidate(candidate={:?}, obligation={:?})", - candidate, - obligation); + debug!("confirm_candidate(candidate={:?}, obligation={:?})", candidate, obligation); match candidate { - ProjectionTyCandidate::ParamEnv(poly_projection) | - ProjectionTyCandidate::TraitDef(poly_projection) => { + ProjectionTyCandidate::ParamEnv(poly_projection) + | ProjectionTyCandidate::TraitDef(poly_projection) => { confirm_param_env_candidate(selcx, obligation, poly_projection) } @@ -1166,25 +1156,23 @@ fn confirm_select_candidate<'cx, 'tcx>( vtable: Selection<'tcx>, ) -> Progress<'tcx> { match vtable { - super::VtableImpl(data) => - confirm_impl_candidate(selcx, obligation, data), - super::VtableGenerator(data) => - confirm_generator_candidate(selcx, obligation, data), - super::VtableClosure(data) => - confirm_closure_candidate(selcx, obligation, data), - super::VtableFnPointer(data) => - confirm_fn_pointer_candidate(selcx, obligation, data), - super::VtableObject(_) => - confirm_object_candidate(selcx, obligation, obligation_trait_ref), - super::VtableAutoImpl(..) | - super::VtableParam(..) | - super::VtableBuiltin(..) | - super::VtableTraitAlias(..) => - // we don't create Select candidates with this kind of resolution + super::VtableImpl(data) => confirm_impl_candidate(selcx, obligation, data), + super::VtableGenerator(data) => confirm_generator_candidate(selcx, obligation, data), + super::VtableClosure(data) => confirm_closure_candidate(selcx, obligation, data), + super::VtableFnPointer(data) => confirm_fn_pointer_candidate(selcx, obligation, data), + super::VtableObject(_) => confirm_object_candidate(selcx, obligation, obligation_trait_ref), + super::VtableAutoImpl(..) + | super::VtableParam(..) + | super::VtableBuiltin(..) + | super::VtableTraitAlias(..) => + // we don't create Select candidates with this kind of resolution + { span_bug!( obligation.cause.span, "Cannot project an associated type from `{:?}`", - vtable), + vtable + ) + } } } @@ -1195,44 +1183,46 @@ fn confirm_object_candidate<'cx, 'tcx>( ) -> Progress<'tcx> { let self_ty = obligation_trait_ref.self_ty(); let object_ty = selcx.infcx().shallow_resolve(self_ty); - debug!("confirm_object_candidate(object_ty={:?})", - object_ty); + debug!("confirm_object_candidate(object_ty={:?})", object_ty); let data = match object_ty.kind { ty::Dynamic(ref data, ..) => data, - _ => { - span_bug!( - obligation.cause.span, - "confirm_object_candidate called with non-object: {:?}", - object_ty) - } + _ => span_bug!( + obligation.cause.span, + "confirm_object_candidate called with non-object: {:?}", + object_ty + ), }; - let env_predicates = data.projection_bounds().map(|p| { - p.with_self_ty(selcx.tcx(), object_ty).to_predicate() - }).collect(); + let env_predicates = data + .projection_bounds() + .map(|p| p.with_self_ty(selcx.tcx(), object_ty).to_predicate()) + .collect(); let env_predicate = { let env_predicates = elaborate_predicates(selcx.tcx(), env_predicates); // select only those projections that are actually projecting an // item with the correct name let env_predicates = env_predicates.filter_map(|p| match p { - ty::Predicate::Projection(data) => + ty::Predicate::Projection(data) => { if data.projection_def_id() == obligation.predicate.item_def_id { Some(data) } else { None - }, - _ => None + } + } + _ => None, }); // select those with a relevant trait-ref let mut env_predicates = env_predicates.filter(|data| { let data_poly_trait_ref = data.to_poly_trait_ref(selcx.tcx()); let obligation_poly_trait_ref = obligation_trait_ref.to_poly_trait_ref(); - selcx.infcx().probe(|_| - selcx.infcx().at(&obligation.cause, obligation.param_env) - .sup(obligation_poly_trait_ref, data_poly_trait_ref) - .is_ok() - ) + selcx.infcx().probe(|_| { + selcx + .infcx() + .at(&obligation.cause, obligation.param_env) + .sup(obligation_poly_trait_ref, data_poly_trait_ref) + .is_ok() + }) }); // select the first matching one; there really ought to be one or @@ -1241,9 +1231,11 @@ fn confirm_object_candidate<'cx, 'tcx>( match env_predicates.next() { Some(env_predicate) => env_predicate, None => { - debug!("confirm_object_candidate: no env-predicate \ + debug!( + "confirm_object_candidate: no env-predicate \ found in object type `{:?}`; ill-formed", - object_ty); + object_ty + ); return Progress::error(selcx.tcx()); } } @@ -1258,46 +1250,47 @@ fn confirm_generator_candidate<'cx, 'tcx>( vtable: VtableGeneratorData<'tcx, PredicateObligation<'tcx>>, ) -> Progress<'tcx> { let gen_sig = vtable.substs.as_generator().poly_sig(vtable.generator_def_id, selcx.tcx()); - let Normalized { - value: gen_sig, - obligations - } = normalize_with_depth(selcx, - obligation.param_env, - obligation.cause.clone(), - obligation.recursion_depth+1, - &gen_sig); - - debug!("confirm_generator_candidate: obligation={:?},gen_sig={:?},obligations={:?}", - obligation, - gen_sig, - obligations); + let Normalized { value: gen_sig, obligations } = normalize_with_depth( + selcx, + obligation.param_env, + obligation.cause.clone(), + obligation.recursion_depth + 1, + &gen_sig, + ); + + debug!( + "confirm_generator_candidate: obligation={:?},gen_sig={:?},obligations={:?}", + obligation, gen_sig, obligations + ); let tcx = selcx.tcx(); let gen_def_id = tcx.lang_items().gen_trait().unwrap(); - let predicate = - tcx.generator_trait_ref_and_outputs(gen_def_id, - obligation.predicate.self_ty(), - gen_sig) - .map_bound(|(trait_ref, yield_ty, return_ty)| { - let name = tcx.associated_item(obligation.predicate.item_def_id).ident.name; - let ty = if name == sym::Return { - return_ty - } else if name == sym::Yield { - yield_ty - } else { - bug!() - }; + let predicate = super::util::generator_trait_ref_and_outputs( + tcx, + gen_def_id, + obligation.predicate.self_ty(), + gen_sig, + ) + .map_bound(|(trait_ref, yield_ty, return_ty)| { + let name = tcx.associated_item(obligation.predicate.item_def_id).ident.name; + let ty = if name == sym::Return { + return_ty + } else if name == sym::Yield { + yield_ty + } else { + bug!() + }; - ty::ProjectionPredicate { - projection_ty: ty::ProjectionTy { - substs: trait_ref.substs, - item_def_id: obligation.predicate.item_def_id, - }, - ty: ty - } - }); + ty::ProjectionPredicate { + projection_ty: ty::ProjectionTy { + substs: trait_ref.substs, + item_def_id: obligation.predicate.item_def_id, + }, + ty: ty, + } + }); confirm_param_env_candidate(selcx, obligation, predicate) .with_addl_obligations(vtable.nested) @@ -1311,14 +1304,13 @@ fn confirm_fn_pointer_candidate<'cx, 'tcx>( ) -> Progress<'tcx> { let fn_type = selcx.infcx().shallow_resolve(fn_pointer_vtable.fn_ty); let sig = fn_type.fn_sig(selcx.tcx()); - let Normalized { - value: sig, - obligations - } = normalize_with_depth(selcx, - obligation.param_env, - obligation.cause.clone(), - obligation.recursion_depth+1, - &sig); + let Normalized { value: sig, obligations } = normalize_with_depth( + selcx, + obligation.param_env, + obligation.cause.clone(), + obligation.recursion_depth + 1, + &sig, + ); confirm_callable_candidate(selcx, obligation, sig, util::TupleArgumentsFlag::Yes) .with_addl_obligations(fn_pointer_vtable.nested) @@ -1332,27 +1324,22 @@ fn confirm_closure_candidate<'cx, 'tcx>( ) -> Progress<'tcx> { let tcx = selcx.tcx(); let infcx = selcx.infcx(); - let closure_sig_ty = vtable.substs - .as_closure().sig_ty(vtable.closure_def_id, tcx); + let closure_sig_ty = vtable.substs.as_closure().sig_ty(vtable.closure_def_id, tcx); let closure_sig = infcx.shallow_resolve(closure_sig_ty).fn_sig(tcx); - let Normalized { - value: closure_sig, - obligations - } = normalize_with_depth(selcx, - obligation.param_env, - obligation.cause.clone(), - obligation.recursion_depth+1, - &closure_sig); - - debug!("confirm_closure_candidate: obligation={:?},closure_sig={:?},obligations={:?}", - obligation, - closure_sig, - obligations); - - confirm_callable_candidate(selcx, - obligation, - closure_sig, - util::TupleArgumentsFlag::No) + let Normalized { value: closure_sig, obligations } = normalize_with_depth( + selcx, + obligation.param_env, + obligation.cause.clone(), + obligation.recursion_depth + 1, + &closure_sig, + ); + + debug!( + "confirm_closure_candidate: obligation={:?},closure_sig={:?},obligations={:?}", + obligation, closure_sig, obligations + ); + + confirm_callable_candidate(selcx, obligation, closure_sig, util::TupleArgumentsFlag::No) .with_addl_obligations(vtable.nested) .with_addl_obligations(obligations) } @@ -1365,28 +1352,26 @@ fn confirm_callable_candidate<'cx, 'tcx>( ) -> Progress<'tcx> { let tcx = selcx.tcx(); - debug!("confirm_callable_candidate({:?},{:?})", - obligation, - fn_sig); + debug!("confirm_callable_candidate({:?},{:?})", obligation, fn_sig); // the `Output` associated type is declared on `FnOnce` let fn_once_def_id = tcx.lang_items().fn_once_trait().unwrap(); - let predicate = - tcx.closure_trait_ref_and_return_type(fn_once_def_id, - obligation.predicate.self_ty(), - fn_sig, - flag) - .map_bound(|(trait_ref, ret_type)| - ty::ProjectionPredicate { - projection_ty: ty::ProjectionTy::from_ref_and_name( - tcx, - trait_ref, - Ident::with_dummy_span(FN_OUTPUT_NAME), - ), - ty: ret_type - } - ); + let predicate = super::util::closure_trait_ref_and_return_type( + tcx, + fn_once_def_id, + obligation.predicate.self_ty(), + fn_sig, + flag, + ) + .map_bound(|(trait_ref, ret_type)| ty::ProjectionPredicate { + projection_ty: ty::ProjectionTy::from_ref_and_name( + tcx, + trait_ref, + Ident::with_dummy_span(rustc_hir::FN_OUTPUT_NAME), + ), + ty: ret_type, + }); confirm_param_env_candidate(selcx, obligation, predicate) } @@ -1400,34 +1385,24 @@ fn confirm_param_env_candidate<'cx, 'tcx>( let cause = &obligation.cause; let param_env = obligation.param_env; - let (cache_entry, _) = - infcx.replace_bound_vars_with_fresh_vars( - cause.span, - LateBoundRegionConversionTime::HigherRankedType, - &poly_cache_entry); + let (cache_entry, _) = infcx.replace_bound_vars_with_fresh_vars( + cause.span, + LateBoundRegionConversionTime::HigherRankedType, + &poly_cache_entry, + ); let cache_trait_ref = cache_entry.projection_ty.trait_ref(infcx.tcx); let obligation_trait_ref = obligation.predicate.trait_ref(infcx.tcx); match infcx.at(cause, param_env).eq(cache_trait_ref, obligation_trait_ref) { - Ok(InferOk { value: _, obligations }) => { - Progress { - ty: cache_entry.ty, - obligations, - } - } + Ok(InferOk { value: _, obligations }) => Progress { ty: cache_entry.ty, obligations }, Err(e) => { let msg = format!( "Failed to unify obligation `{:?}` with poly_projection `{:?}`: {:?}", - obligation, - poly_cache_entry, - e, + obligation, poly_cache_entry, e, ); debug!("confirm_param_env_candidate: {}", msg); infcx.tcx.sess.delay_span_bug(obligation.cause.span, &msg); - Progress { - ty: infcx.tcx.types.err, - obligations: vec![], - } + Progress { ty: infcx.tcx.types.err, obligations: vec![] } } } } @@ -1437,25 +1412,27 @@ fn confirm_impl_candidate<'cx, 'tcx>( obligation: &ProjectionTyObligation<'tcx>, impl_vtable: VtableImplData<'tcx, PredicateObligation<'tcx>>, ) -> Progress<'tcx> { + let tcx = selcx.tcx(); + let VtableImplData { impl_def_id, substs, nested } = impl_vtable; + let assoc_item_id = obligation.predicate.item_def_id; + let trait_def_id = tcx.trait_id_of_impl(impl_def_id).unwrap(); - let tcx = selcx.tcx(); let param_env = obligation.param_env; - let assoc_ty = assoc_ty_def(selcx, impl_def_id, obligation.predicate.item_def_id); + let assoc_ty = assoc_ty_def(selcx, impl_def_id, assoc_item_id); if !assoc_ty.item.defaultness.has_value() { // This means that the impl is missing a definition for the // associated type. This error will be reported by the type // checker method `check_impl_items_against_trait`, so here we // just return Error. - debug!("confirm_impl_candidate: no associated type {:?} for {:?}", - assoc_ty.item.ident, - obligation.predicate); - return Progress { - ty: tcx.types.err, - obligations: nested, - }; + debug!( + "confirm_impl_candidate: no associated type {:?} for {:?}", + assoc_ty.item.ident, obligation.predicate + ); + return Progress { ty: tcx.types.err, obligations: nested }; } + let substs = obligation.predicate.substs.rebase_onto(tcx, trait_def_id, substs); let substs = translate_substs(selcx.infcx(), param_env, impl_def_id, substs, assoc_ty.node); let ty = if let ty::AssocKind::OpaqueTy = assoc_ty.item.kind { let item_substs = InternalSubsts::identity_for_item(tcx, assoc_ty.item.def_id); @@ -1463,9 +1440,12 @@ fn confirm_impl_candidate<'cx, 'tcx>( } else { tcx.type_of(assoc_ty.item.def_id) }; - Progress { - ty: ty.subst(tcx, substs), - obligations: nested, + if substs.len() != tcx.generics_of(assoc_ty.item.def_id).count() { + tcx.sess + .delay_span_bug(DUMMY_SP, "impl item and trait item have different parameter counts"); + Progress { ty: tcx.types.err, obligations: nested } + } else { + Progress { ty: ty.subst(tcx, substs), obligations: nested } } } @@ -1492,8 +1472,9 @@ fn assoc_ty_def( // cycle error if the specialization graph is currently being built. let impl_node = specialization_graph::Node::Impl(impl_def_id); for item in impl_node.items(tcx) { - if item.kind == ty::AssocKind::Type && - tcx.hygienic_eq(item.ident, assoc_ty_name, trait_def_id) { + if matches!(item.kind, ty::AssocKind::Type | ty::AssocKind::OpaqueTy) + && tcx.hygienic_eq(item.ident, assoc_ty_name, trait_def_id) + { return specialization_graph::NodeItem { node: specialization_graph::Node::Impl(impl_def_id), item, @@ -1501,10 +1482,9 @@ fn assoc_ty_def( } } - if let Some(assoc_item) = trait_def - .ancestors(tcx, impl_def_id) - .leaf_def(tcx, assoc_ty_name, ty::AssocKind::Type) { - + if let Some(assoc_item) = + trait_def.ancestors(tcx, impl_def_id).leaf_def(tcx, assoc_ty_name, ty::AssocKind::Type) + { assoc_item } else { // This is saying that neither the trait nor @@ -1513,9 +1493,7 @@ fn assoc_ty_def( // could only arise through a compiler bug -- // if the user wrote a bad item name, it // should have failed in astconv. - bug!("No associated type `{}` for {}", - assoc_ty_name, - tcx.def_path_str(impl_def_id)) + bug!("No associated type `{}` for {}", assoc_ty_name, tcx.def_path_str(impl_def_id)) } } @@ -1557,7 +1535,7 @@ pub struct ProjectionCache<'tcx> { #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] pub struct ProjectionCacheKey<'tcx> { - ty: ty::ProjectionTy<'tcx> + ty: ty::ProjectionTy<'tcx>, } impl<'cx, 'tcx> ProjectionCacheKey<'tcx> { @@ -1568,14 +1546,13 @@ impl<'cx, 'tcx> ProjectionCacheKey<'tcx> { let infcx = selcx.infcx(); // We don't do cross-snapshot caching of obligations with escaping regions, // so there's no cache key to use - predicate.no_bound_vars() - .map(|predicate| ProjectionCacheKey { - // We don't attempt to match up with a specific type-variable state - // from a specific call to `opt_normalize_projection_type` - if - // there's no precise match, the original cache entry is "stranded" - // anyway. - ty: infcx.resolve_vars_if_possible(&predicate.projection_ty) - }) + predicate.no_bound_vars().map(|predicate| ProjectionCacheKey { + // We don't attempt to match up with a specific type-variable state + // from a specific call to `opt_normalize_projection_type` - if + // there's no precise match, the original cache entry is "stranded" + // anyway. + ty: infcx.resolve_vars_if_possible(&predicate.projection_ty), + }) } } @@ -1616,8 +1593,10 @@ impl<'tcx> ProjectionCache<'tcx> { /// Try to start normalize `key`; returns an error if /// normalization already occurred (this error corresponds to a /// cache hit, so it's actually a good thing). - fn try_start(&mut self, key: ProjectionCacheKey<'tcx>) - -> Result<(), ProjectionCacheEntry<'tcx>> { + fn try_start( + &mut self, + key: ProjectionCacheKey<'tcx>, + ) -> Result<(), ProjectionCacheEntry<'tcx>> { if let Some(entry) = self.map.get(&key) { return Err(entry.clone()); } @@ -1628,8 +1607,10 @@ impl<'tcx> ProjectionCache<'tcx> { /// Indicates that `key` was normalized to `value`. fn insert_ty(&mut self, key: ProjectionCacheKey<'tcx>, value: NormalizedTy<'tcx>) { - debug!("ProjectionCacheEntry::insert_ty: adding cache entry: key={:?}, value={:?}", - key, value); + debug!( + "ProjectionCacheEntry::insert_ty: adding cache entry: key={:?}, value={:?}", + key, value + ); let fresh_key = self.map.insert(key, ProjectionCacheEntry::NormalizedTy(value)); assert!(!fresh_key, "never started projecting `{:?}`", key); } @@ -1641,23 +1622,21 @@ impl<'tcx> ProjectionCache<'tcx> { pub fn complete(&mut self, key: ProjectionCacheKey<'tcx>) { let ty = match self.map.get(&key) { Some(&ProjectionCacheEntry::NormalizedTy(ref ty)) => { - debug!("ProjectionCacheEntry::complete({:?}) - completing {:?}", - key, ty); + debug!("ProjectionCacheEntry::complete({:?}) - completing {:?}", key, ty); ty.value } ref value => { // Type inference could "strand behind" old cache entries. Leave // them alone for now. - debug!("ProjectionCacheEntry::complete({:?}) - ignoring {:?}", - key, value); - return + debug!("ProjectionCacheEntry::complete({:?}) - ignoring {:?}", key, value); + return; } }; - self.map.insert(key, ProjectionCacheEntry::NormalizedTy(Normalized { - value: ty, - obligations: vec![] - })); + self.map.insert( + key, + ProjectionCacheEntry::NormalizedTy(Normalized { value: ty, obligations: vec![] }), + ); } /// A specialized version of `complete` for when the key's value is known @@ -1666,10 +1645,13 @@ impl<'tcx> ProjectionCache<'tcx> { // We want to insert `ty` with no obligations. If the existing value // already has no obligations (as is common) we don't insert anything. if !ty.obligations.is_empty() { - self.map.insert(key, ProjectionCacheEntry::NormalizedTy(Normalized { - value: ty.value, - obligations: vec![] - })); + self.map.insert( + key, + ProjectionCacheEntry::NormalizedTy(Normalized { + value: ty.value, + obligations: vec![], + }), + ); } } diff --git a/src/librustc/traits/query/dropck_outlives.rs b/src/librustc/traits/query/dropck_outlives.rs index 785b4122d0..2e5ef5adcd 100644 --- a/src/librustc/traits/query/dropck_outlives.rs +++ b/src/librustc/traits/query/dropck_outlives.rs @@ -1,12 +1,10 @@ use crate::infer::at::At; -use crate::infer::InferOk; use crate::infer::canonical::OriginalQueryValues; -use std::iter::FromIterator; -use syntax::source_map::Span; +use crate::infer::InferOk; use crate::ty::subst::GenericArg; use crate::ty::{self, Ty, TyCtxt}; - -use rustc_error_codes::*; +use rustc_span::source_map::Span; +use std::iter::FromIterator; impl<'cx, 'tcx> At<'cx, 'tcx> { /// Given a type `ty` of some value being dropped, computes a set @@ -27,19 +25,13 @@ impl<'cx, 'tcx> At<'cx, 'tcx> { /// [#1238]: https://github.com/rust-lang/rfcs/blob/master/text/1238-nonparametric-dropck.md /// [#1327]: https://github.com/rust-lang/rfcs/blob/master/text/1327-dropck-param-eyepatch.md pub fn dropck_outlives(&self, ty: Ty<'tcx>) -> InferOk<'tcx, Vec>> { - debug!( - "dropck_outlives(ty={:?}, param_env={:?})", - ty, self.param_env, - ); + debug!("dropck_outlives(ty={:?}, param_env={:?})", ty, self.param_env,); // Quick check: there are a number of cases that we know do not require // any destructor. let tcx = self.infcx.tcx; if trivial_dropck_outlives(tcx, ty) { - return InferOk { - value: vec![], - obligations: vec![], - }; + return InferOk { value: vec![], obligations: vec![] }; } let mut orig_values = OriginalQueryValues::default(); @@ -50,17 +42,15 @@ impl<'cx, 'tcx> At<'cx, 'tcx> { if result.is_proven() { if let Ok(InferOk { value, obligations }) = self.infcx.instantiate_query_response_and_region_obligations( - self.cause, - self.param_env, - &orig_values, - result) + self.cause, + self.param_env, + &orig_values, + result, + ) { let ty = self.infcx.resolve_vars_if_possible(&ty); let kinds = value.into_kinds_reporting_overflows(tcx, span, ty); - return InferOk { - value: kinds, - obligations, - }; + return InferOk { value: kinds, obligations }; } } } @@ -69,13 +59,9 @@ impl<'cx, 'tcx> At<'cx, 'tcx> { // - unresolved inference variables at the end of typeck // - non well-formed types where projections cannot be resolved // Either of these should have created an error before. - tcx.sess - .delay_span_bug(span, "dtorck encountered internal error"); + tcx.sess.delay_span_bug(span, "dtorck encountered internal error"); - InferOk { - value: vec![], - obligations: vec![], - } + InferOk { value: vec![], obligations: vec![] } } } @@ -88,15 +74,15 @@ pub struct DropckOutlivesResult<'tcx> { impl<'tcx> DropckOutlivesResult<'tcx> { pub fn report_overflows(&self, tcx: TyCtxt<'tcx>, span: Span, ty: Ty<'tcx>) { if let Some(overflow_ty) = self.overflows.iter().next() { - let mut err = struct_span_err!( + rustc_errors::struct_span_err!( tcx.sess, span, E0320, "overflow while adding drop-check rules for {}", ty, - ); - err.note(&format!("overflowed on {}", overflow_ty)); - err.emit(); + ) + .note(&format!("overflowed on {}", overflow_ty)) + .emit(); } } @@ -131,11 +117,7 @@ pub struct DtorckConstraint<'tcx> { impl<'tcx> DtorckConstraint<'tcx> { pub fn empty() -> DtorckConstraint<'tcx> { - DtorckConstraint { - outlives: vec![], - dtorck_types: vec![], - overflows: vec![], - } + DtorckConstraint { outlives: vec![], dtorck_types: vec![], overflows: vec![] } } } @@ -192,10 +174,9 @@ pub fn trivial_dropck_outlives<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> bool { // (T1..Tn) and closures have same properties as T1..Tn -- // check if *any* of those are trivial. ty::Tuple(ref tys) => tys.iter().all(|t| trivial_dropck_outlives(tcx, t.expect_ty())), - ty::Closure(def_id, ref substs) => substs - .as_closure() - .upvar_tys(def_id, tcx) - .all(|t| trivial_dropck_outlives(tcx, t)), + ty::Closure(def_id, ref substs) => { + substs.as_closure().upvar_tys(def_id, tcx).all(|t| trivial_dropck_outlives(tcx, t)) + } ty::Adt(def, _) => { if Some(def.did) == tcx.lang_items().manually_drop() { diff --git a/src/librustc/traits/query/evaluate_obligation.rs b/src/librustc/traits/query/evaluate_obligation.rs index 0d426cab9b..b9ce3ccff2 100644 --- a/src/librustc/traits/query/evaluate_obligation.rs +++ b/src/librustc/traits/query/evaluate_obligation.rs @@ -1,16 +1,13 @@ -use crate::infer::InferCtxt; use crate::infer::canonical::OriginalQueryValues; +use crate::infer::InferCtxt; use crate::traits::{ - EvaluationResult, PredicateObligation, SelectionContext, TraitQueryMode, OverflowError, + EvaluationResult, OverflowError, PredicateObligation, SelectionContext, TraitQueryMode, }; impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { /// Evaluates whether the predicate can be satisfied (by any means) /// in the given `ParamEnv`. - pub fn predicate_may_hold( - &self, - obligation: &PredicateObligation<'tcx>, - ) -> bool { + pub fn predicate_may_hold(&self, obligation: &PredicateObligation<'tcx>) -> bool { self.evaluate_obligation_no_overflow(obligation).may_apply() } @@ -45,8 +42,8 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { obligation: &PredicateObligation<'tcx>, ) -> Result { let mut _orig_values = OriginalQueryValues::default(); - let c_pred = self.canonicalize_query(&obligation.param_env.and(obligation.predicate), - &mut _orig_values); + let c_pred = self + .canonicalize_query(&obligation.param_env.and(obligation.predicate), &mut _orig_values); // Run canonical query. If overflow occurs, rerun from scratch but this time // in standard trait query mode so that overflow is handled appropriately // within `SelectionContext`. @@ -63,17 +60,15 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { match self.evaluate_obligation(obligation) { Ok(result) => result, Err(OverflowError) => { - let mut selcx = - SelectionContext::with_query_mode(&self, TraitQueryMode::Standard); - selcx.evaluate_root_obligation(obligation) - .unwrap_or_else(|r| { - span_bug!( - obligation.cause.span, - "Overflow should be caught earlier in standard query mode: {:?}, {:?}", - obligation, - r, - ) - }) + let mut selcx = SelectionContext::with_query_mode(&self, TraitQueryMode::Standard); + selcx.evaluate_root_obligation(obligation).unwrap_or_else(|r| { + span_bug!( + obligation.cause.span, + "Overflow should be caught earlier in standard query mode: {:?}, {:?}", + obligation, + r, + ) + }) } } } diff --git a/src/librustc/traits/query/method_autoderef.rs b/src/librustc/traits/query/method_autoderef.rs index be846287e2..4ef775750e 100644 --- a/src/librustc/traits/query/method_autoderef.rs +++ b/src/librustc/traits/query/method_autoderef.rs @@ -1,6 +1,6 @@ -use rustc_data_structures::sync::Lrc; use crate::infer::canonical::{Canonical, QueryResponse}; use crate::ty::Ty; +use rustc_data_structures::sync::Lrc; #[derive(Debug, HashStable)] pub struct CandidateStep<'tcx> { diff --git a/src/librustc/traits/query/mod.rs b/src/librustc/traits/query/mod.rs index 66683cab95..440268aab8 100644 --- a/src/librustc/traits/query/mod.rs +++ b/src/librustc/traits/query/mod.rs @@ -13,7 +13,6 @@ pub mod dropck_outlives; pub mod evaluate_obligation; pub mod method_autoderef; pub mod normalize; -pub mod normalize_erasing_regions; pub mod outlives_bounds; pub mod type_op; @@ -22,8 +21,7 @@ pub type CanonicalProjectionGoal<'tcx> = pub type CanonicalTyGoal<'tcx> = Canonical<'tcx, ty::ParamEnvAnd<'tcx, Ty<'tcx>>>; -pub type CanonicalPredicateGoal<'tcx> = - Canonical<'tcx, ty::ParamEnvAnd<'tcx, ty::Predicate<'tcx>>>; +pub type CanonicalPredicateGoal<'tcx> = Canonical<'tcx, ty::ParamEnvAnd<'tcx, ty::Predicate<'tcx>>>; pub type CanonicalTypeOpAscribeUserTypeGoal<'tcx> = Canonical<'tcx, ty::ParamEnvAnd<'tcx, type_op::ascribe_user_type::AscribeUserType<'tcx>>>; diff --git a/src/librustc/traits/query/normalize.rs b/src/librustc/traits/query/normalize.rs index 09c7f45c22..8f23f98a2a 100644 --- a/src/librustc/traits/query/normalize.rs +++ b/src/librustc/traits/query/normalize.rs @@ -38,10 +38,7 @@ impl<'cx, 'tcx> At<'cx, 'tcx> { self.param_env, ); if !value.has_projections() { - return Ok(Normalized { - value: value.clone(), - obligations: vec![], - }); + return Ok(Normalized { value: value.clone(), obligations: vec![] }); } let mut normalizer = QueryNormalizer { @@ -57,10 +54,7 @@ impl<'cx, 'tcx> At<'cx, 'tcx> { if normalizer.error { Err(NoSolution) } else { - Ok(Normalized { - value: value1, - obligations: normalizer.obligations, - }) + Ok(Normalized { value: value1, obligations: normalizer.obligations }) } } } @@ -146,8 +140,9 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> { let mut orig_values = OriginalQueryValues::default(); // HACK(matthewjasper) `'static` is special-cased in selection, // so we cannot canonicalize it. - let c_data = self.infcx.canonicalize_hr_query_hack( - &self.param_env.and(*data), &mut orig_values); + let c_data = self + .infcx + .canonicalize_hr_query_hack(&self.param_env.and(*data), &mut orig_values); debug!("QueryNormalizer: c_data = {:#?}", c_data); debug!("QueryNormalizer: orig_values = {:#?}", orig_values); match tcx.normalize_projection_ty(c_data) { @@ -162,8 +157,8 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> { self.cause, self.param_env, &orig_values, - &result) - { + &result, + ) { Ok(InferOk { value: result, obligations }) => { debug!("QueryNormalizer: result = {:#?}", result); debug!("QueryNormalizer: obligations = {:#?}", obligations); diff --git a/src/librustc/traits/query/outlives_bounds.rs b/src/librustc/traits/query/outlives_bounds.rs index d6cd2cce42..07e57e847b 100644 --- a/src/librustc/traits/query/outlives_bounds.rs +++ b/src/librustc/traits/query/outlives_bounds.rs @@ -1,10 +1,10 @@ -use crate::infer::InferCtxt; use crate::infer::canonical::OriginalQueryValues; -use crate::hir; -use syntax::source_map::Span; -use crate::traits::{FulfillmentContext, ObligationCause, TraitEngine, TraitEngineExt}; +use crate::infer::InferCtxt; use crate::traits::query::NoSolution; +use crate::traits::{FulfillmentContext, ObligationCause, TraitEngine, TraitEngineExt}; use crate::ty::{self, Ty}; +use rustc_hir as hir; +use rustc_span::source_map::Span; use crate::ich::StableHashingContext; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; @@ -82,7 +82,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { Err(NoSolution) => { self.tcx.sess.delay_span_bug( span, - "implied_outlives_bounds failed to solve all obligations" + "implied_outlives_bounds failed to solve all obligations", ); return vec![]; } @@ -90,15 +90,16 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { assert!(result.value.is_proven()); let result = self.instantiate_query_response_and_region_obligations( - &ObligationCause::misc(span, body_id), param_env, &orig_values, &result); + &ObligationCause::misc(span, body_id), + param_env, + &orig_values, + &result, + ); debug!("implied_outlives_bounds for {:?}: {:#?}", ty, result); let result = match result { Ok(v) => v, Err(_) => { - self.tcx.sess.delay_span_bug( - span, - "implied_outlives_bounds failed to instantiate" - ); + self.tcx.sess.delay_span_bug(span, "implied_outlives_bounds failed to instantiate"); return vec![]; } }; @@ -110,7 +111,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { if fulfill_cx.select_all_or_error(self).is_err() { self.tcx.sess.delay_span_bug( span, - "implied_outlives_bounds failed to solve obligations from instantiation" + "implied_outlives_bounds failed to solve obligations from instantiation", ); } @@ -122,20 +123,17 @@ pub fn explicit_outlives_bounds<'tcx>( param_env: ty::ParamEnv<'tcx>, ) -> impl Iterator> + 'tcx { debug!("explicit_outlives_bounds()"); - param_env - .caller_bounds - .into_iter() - .filter_map(move |predicate| match predicate { - ty::Predicate::Projection(..) | - ty::Predicate::Trait(..) | - ty::Predicate::Subtype(..) | - ty::Predicate::WellFormed(..) | - ty::Predicate::ObjectSafe(..) | - ty::Predicate::ClosureKind(..) | - ty::Predicate::TypeOutlives(..) | - ty::Predicate::ConstEvaluatable(..) => None, - ty::Predicate::RegionOutlives(ref data) => data.no_bound_vars().map( - |ty::OutlivesPredicate(r_a, r_b)| OutlivesBound::RegionSubRegion(r_b, r_a), - ), - }) + param_env.caller_bounds.into_iter().filter_map(move |predicate| match predicate { + ty::Predicate::Projection(..) + | ty::Predicate::Trait(..) + | ty::Predicate::Subtype(..) + | ty::Predicate::WellFormed(..) + | ty::Predicate::ObjectSafe(..) + | ty::Predicate::ClosureKind(..) + | ty::Predicate::TypeOutlives(..) + | ty::Predicate::ConstEvaluatable(..) => None, + ty::Predicate::RegionOutlives(ref data) => data + .no_bound_vars() + .map(|ty::OutlivesPredicate(r_a, r_b)| OutlivesBound::RegionSubRegion(r_b, r_a)), + }) } diff --git a/src/librustc/traits/query/type_op/ascribe_user_type.rs b/src/librustc/traits/query/type_op/ascribe_user_type.rs index ee8b73f86a..46b656eb94 100644 --- a/src/librustc/traits/query/type_op/ascribe_user_type.rs +++ b/src/librustc/traits/query/type_op/ascribe_user_type.rs @@ -1,8 +1,8 @@ use crate::infer::canonical::{Canonicalized, CanonicalizedQueryResponse}; use crate::traits::query::Fallible; -use crate::hir::def_id::DefId; -use crate::ty::{ParamEnvAnd, Ty, TyCtxt}; use crate::ty::subst::UserSubsts; +use crate::ty::{ParamEnvAnd, Ty, TyCtxt}; +use rustc_hir::def_id::DefId; #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable, TypeFoldable, Lift)] pub struct AscribeUserType<'tcx> { @@ -12,12 +12,8 @@ pub struct AscribeUserType<'tcx> { } impl<'tcx> AscribeUserType<'tcx> { - pub fn new( - mir_ty: Ty<'tcx>, - def_id: DefId, - user_substs: UserSubsts<'tcx>, - ) -> Self { - Self { mir_ty, def_id, user_substs } + pub fn new(mir_ty: Ty<'tcx>, def_id: DefId, user_substs: UserSubsts<'tcx>) -> Self { + Self { mir_ty, def_id, user_substs } } } diff --git a/src/librustc/traits/query/type_op/custom.rs b/src/librustc/traits/query/type_op/custom.rs index a2a5f3f950..c1c9030b88 100644 --- a/src/librustc/traits/query/type_op/custom.rs +++ b/src/librustc/traits/query/type_op/custom.rs @@ -1,12 +1,12 @@ use crate::infer::{InferCtxt, InferOk}; -use std::fmt; use crate::traits::query::Fallible; +use std::fmt; use crate::infer::canonical::query_response; use crate::infer::canonical::QueryRegionConstraints; -use std::rc::Rc; -use syntax::source_map::DUMMY_SP; use crate::traits::{ObligationCause, TraitEngine, TraitEngineExt}; +use rustc_span::source_map::DUMMY_SP; +use std::rc::Rc; pub struct CustomTypeOp { closure: F, @@ -19,10 +19,7 @@ impl CustomTypeOp { F: FnOnce(&InferCtxt<'_, 'tcx>) -> Fallible>, G: Fn() -> String, { - CustomTypeOp { - closure, - description, - } + CustomTypeOp { closure, description } } } diff --git a/src/librustc/traits/query/type_op/eq.rs b/src/librustc/traits/query/type_op/eq.rs index 8ea800cced..267722362c 100644 --- a/src/librustc/traits/query/type_op/eq.rs +++ b/src/librustc/traits/query/type_op/eq.rs @@ -21,11 +21,7 @@ impl<'tcx> super::QueryTypeOp<'tcx> for Eq<'tcx> { _tcx: TyCtxt<'tcx>, key: &ParamEnvAnd<'tcx, Eq<'tcx>>, ) -> Option { - if key.value.a == key.value.b { - Some(()) - } else { - None - } + if key.value.a == key.value.b { Some(()) } else { None } } fn perform_query( diff --git a/src/librustc/traits/query/type_op/mod.rs b/src/librustc/traits/query/type_op/mod.rs index 98e535234b..adf63e4d60 100644 --- a/src/librustc/traits/query/type_op/mod.rs +++ b/src/librustc/traits/query/type_op/mod.rs @@ -1,14 +1,13 @@ use crate::infer::canonical::{ - Canonicalized, CanonicalizedQueryResponse, OriginalQueryValues, - QueryRegionConstraints, + Canonicalized, CanonicalizedQueryResponse, OriginalQueryValues, QueryRegionConstraints, }; use crate::infer::{InferCtxt, InferOk}; -use std::fmt; -use std::rc::Rc; use crate::traits::query::Fallible; use crate::traits::ObligationCause; use crate::ty::fold::TypeFoldable; use crate::ty::{ParamEnvAnd, TyCtxt}; +use std::fmt; +use std::rc::Rc; pub mod ascribe_user_type; pub mod custom; @@ -102,9 +101,7 @@ pub trait QueryTypeOp<'tcx>: fmt::Debug + Sized + TypeFoldable<'tcx> + 'tcx { // fulfill them. We do this via a (recursive) query. for obligation in obligations { let () = ProvePredicate::fully_perform_into( - obligation - .param_env - .and(ProvePredicate::new(obligation.predicate)), + obligation.param_env.and(ProvePredicate::new(obligation.predicate)), infcx, output_query_region_constraints, )?; @@ -129,11 +126,8 @@ where // Promote the final query-region-constraints into a // (optional) ref-counted vector: - let opt_qrc = if region_constraints.is_empty() { - None - } else { - Some(Rc::new(region_constraints)) - }; + let opt_qrc = + if region_constraints.is_empty() { None } else { Some(Rc::new(region_constraints)) }; Ok((r, opt_qrc)) } diff --git a/src/librustc/traits/query/type_op/normalize.rs b/src/librustc/traits/query/type_op/normalize.rs index f905d5a019..8a028eecd5 100644 --- a/src/librustc/traits/query/type_op/normalize.rs +++ b/src/librustc/traits/query/type_op/normalize.rs @@ -1,8 +1,8 @@ use crate::infer::canonical::{Canonicalized, CanonicalizedQueryResponse}; -use std::fmt; use crate::traits::query::Fallible; use crate::ty::fold::TypeFoldable; use crate::ty::{self, Lift, ParamEnvAnd, Ty, TyCtxt}; +use std::fmt; #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable, TypeFoldable, Lift)] pub struct Normalize { @@ -25,11 +25,7 @@ where type QueryResponse = T; fn try_fast_path(_tcx: TyCtxt<'tcx>, key: &ParamEnvAnd<'tcx, Self>) -> Option { - if !key.value.value.has_projections() { - Some(key.value.value) - } else { - None - } + if !key.value.value.has_projections() { Some(key.value.value) } else { None } } fn perform_query( diff --git a/src/librustc/traits/query/type_op/outlives.rs b/src/librustc/traits/query/type_op/outlives.rs index 83d51b6d3e..35afa63796 100644 --- a/src/librustc/traits/query/type_op/outlives.rs +++ b/src/librustc/traits/query/type_op/outlives.rs @@ -1,5 +1,5 @@ use crate::infer::canonical::{Canonicalized, CanonicalizedQueryResponse}; -use crate::traits::query::dropck_outlives::{DropckOutlivesResult, trivial_dropck_outlives}; +use crate::traits::query::dropck_outlives::{trivial_dropck_outlives, DropckOutlivesResult}; use crate::traits::query::Fallible; use crate::ty::{ParamEnvAnd, Ty, TyCtxt}; diff --git a/src/librustc/traits/query/type_op/prove_predicate.rs b/src/librustc/traits/query/type_op/prove_predicate.rs index c0a0cbe9a3..15870ec95d 100644 --- a/src/librustc/traits/query/type_op/prove_predicate.rs +++ b/src/librustc/traits/query/type_op/prove_predicate.rs @@ -24,7 +24,7 @@ impl<'tcx> super::QueryTypeOp<'tcx> for ProvePredicate<'tcx> { // `&T`, accounts for about 60% percentage of the predicates // we have to prove. No need to canonicalize and all that for // such cases. - if let Predicate::Trait(trait_ref) = key.value.predicate { + if let Predicate::Trait(trait_ref, _) = key.value.predicate { if let Some(sized_def_id) = tcx.lang_items().sized_trait() { if trait_ref.def_id() == sized_def_id { if trait_ref.skip_binder().self_ty().is_trivially_sized(tcx) { diff --git a/src/librustc/traits/query/type_op/subtype.rs b/src/librustc/traits/query/type_op/subtype.rs index 76292f9dea..c70508a20a 100644 --- a/src/librustc/traits/query/type_op/subtype.rs +++ b/src/librustc/traits/query/type_op/subtype.rs @@ -10,10 +10,7 @@ pub struct Subtype<'tcx> { impl<'tcx> Subtype<'tcx> { pub fn new(sub: Ty<'tcx>, sup: Ty<'tcx>) -> Self { - Self { - sub, - sup, - } + Self { sub, sup } } } @@ -21,11 +18,7 @@ impl<'tcx> super::QueryTypeOp<'tcx> for Subtype<'tcx> { type QueryResponse = (); fn try_fast_path(_tcx: TyCtxt<'tcx>, key: &ParamEnvAnd<'tcx, Self>) -> Option<()> { - if key.value.sub == key.value.sup { - Some(()) - } else { - None - } + if key.value.sub == key.value.sup { Some(()) } else { None } } fn perform_query( diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 94a77c553e..ba0a270638 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -11,6 +11,8 @@ use super::coherence::{self, Conflict}; use super::project; use super::project::{normalize_with_depth, Normalized, ProjectionCacheKey}; use super::util; +use super::util::{closure_trait_ref_and_return_type, predicate_for_trait_def}; +use super::wf; use super::DerivedObligationCause; use super::Selection; use super::SelectionResult; @@ -30,27 +32,26 @@ use super::{ }; use crate::dep_graph::{DepKind, DepNodeIndex}; -use crate::hir::def_id::DefId; use crate::infer::{CombinedSnapshot, InferCtxt, InferOk, PlaceholderMap, TypeFreshener}; use crate::middle::lang_items; -use crate::mir::interpret::GlobalId; use crate::ty::fast_reject; use crate::ty::relate::TypeRelation; use crate::ty::subst::{Subst, SubstsRef}; -use crate::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, TypeFoldable}; +use crate::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness}; +use rustc_hir::def_id::DefId; -use crate::hir; -use rustc_index::bit_set::GrowableBitSet; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::sync::Lock; +use rustc_hir as hir; +use rustc_index::bit_set::GrowableBitSet; +use rustc_span::symbol::sym; use rustc_target::spec::abi::Abi; -use syntax::attr; -use syntax::symbol::sym; use std::cell::{Cell, RefCell}; use std::cmp; use std::fmt::{self, Display}; use std::iter; use std::rc::Rc; -use crate::util::nodemap::{FxHashMap, FxHashSet}; +use syntax::{ast, attr}; pub struct SelectionContext<'cx, 'tcx> { infcx: &'cx InferCtxt<'cx, 'tcx>, @@ -93,46 +94,29 @@ pub struct SelectionContext<'cx, 'tcx> { #[derive(Clone, Debug)] pub enum IntercrateAmbiguityCause { - DownstreamCrate { - trait_desc: String, - self_desc: Option, - }, - UpstreamCrateUpdate { - trait_desc: String, - self_desc: Option, - }, - ReservationImpl { - message: String - }, + DownstreamCrate { trait_desc: String, self_desc: Option }, + UpstreamCrateUpdate { trait_desc: String, self_desc: Option }, + ReservationImpl { message: String }, } impl IntercrateAmbiguityCause { /// Emits notes when the overlap is caused by complex intercrate ambiguities. /// See #23980 for details. - pub fn add_intercrate_ambiguity_hint(&self, err: &mut errors::DiagnosticBuilder<'_>) { + pub fn add_intercrate_ambiguity_hint(&self, err: &mut rustc_errors::DiagnosticBuilder<'_>) { err.note(&self.intercrate_ambiguity_hint()); } pub fn intercrate_ambiguity_hint(&self) -> String { match self { - &IntercrateAmbiguityCause::DownstreamCrate { - ref trait_desc, - ref self_desc, - } => { + &IntercrateAmbiguityCause::DownstreamCrate { ref trait_desc, ref self_desc } => { let self_desc = if let &Some(ref ty) = self_desc { format!(" for type `{}`", ty) } else { String::new() }; - format!( - "downstream crates may implement trait `{}`{}", - trait_desc, self_desc - ) + format!("downstream crates may implement trait `{}`{}", trait_desc, self_desc) } - &IntercrateAmbiguityCause::UpstreamCrateUpdate { - ref trait_desc, - ref self_desc, - } => { + &IntercrateAmbiguityCause::UpstreamCrateUpdate { ref trait_desc, ref self_desc } => { let self_desc = if let &Some(ref ty) = self_desc { format!(" for type `{}`", ty) } else { @@ -144,11 +128,7 @@ impl IntercrateAmbiguityCause { trait_desc, self_desc ) } - &IntercrateAmbiguityCause::ReservationImpl { - ref message - } => { - message.clone() - } + &IntercrateAmbiguityCause::ReservationImpl { ref message } => message.clone(), } } } @@ -705,10 +685,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let mut result = EvaluatedToOk; for obligation in predicates { let eval = self.evaluate_predicate_recursively(stack, obligation.clone())?; - debug!( - "evaluate_predicate_recursively({:?}) = {:?}", - obligation, eval - ); + debug!("evaluate_predicate_recursively({:?}) = {:?}", obligation, eval); if let EvaluatedToErr = eval { // fast-path - EvaluatedToErr is the top of the lattice, // so we don't need to look on the other predicates. @@ -725,8 +702,11 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { previous_stack: TraitObligationStackList<'o, 'tcx>, obligation: PredicateObligation<'tcx>, ) -> Result { - debug!("evaluate_predicate_recursively(previous_stack={:?}, obligation={:?})", - previous_stack.head(), obligation); + debug!( + "evaluate_predicate_recursively(previous_stack={:?}, obligation={:?})", + previous_stack.head(), + obligation + ); // `previous_stack` stores a `TraitObligatiom`, while `obligation` is // a `PredicateObligation`. These are distinct types, so we can't @@ -734,11 +714,11 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // the same. match previous_stack.head() { Some(h) => self.check_recursion_limit(&obligation, h.obligation)?, - None => self.check_recursion_limit(&obligation, &obligation)? + None => self.check_recursion_limit(&obligation, &obligation)?, } match obligation.predicate { - ty::Predicate::Trait(ref t) => { + ty::Predicate::Trait(ref t, _) => { debug_assert!(!t.has_escaping_bound_vars()); let obligation = obligation.with(t.clone()); self.evaluate_trait_predicate_recursively(previous_stack, obligation) @@ -746,19 +726,20 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ty::Predicate::Subtype(ref p) => { // Does this code ever run? - match self.infcx - .subtype_predicate(&obligation.cause, obligation.param_env, p) - { + match self.infcx.subtype_predicate(&obligation.cause, obligation.param_env, p) { Some(Ok(InferOk { mut obligations, .. })) => { self.add_depth(obligations.iter_mut(), obligation.recursion_depth); - self.evaluate_predicates_recursively(previous_stack,obligations.into_iter()) + self.evaluate_predicates_recursively( + previous_stack, + obligations.into_iter(), + ) } Some(Err(_)) => Ok(EvaluatedToErr), None => Ok(EvaluatedToAmbig), } } - ty::Predicate::WellFormed(ty) => match ty::wf::obligations( + ty::Predicate::WellFormed(ty) => match wf::obligations( self.infcx, obligation.param_env, obligation.cause.body_id, @@ -820,22 +801,16 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } ty::Predicate::ConstEvaluatable(def_id, substs) => { - let tcx = self.tcx(); if !(obligation.param_env, substs).has_local_value() { - let param_env = obligation.param_env; - let instance = - ty::Instance::resolve(tcx, param_env, def_id, substs); - if let Some(instance) = instance { - let cid = GlobalId { - instance, - promoted: None, - }; - match self.tcx().const_eval(param_env.and(cid)) { - Ok(_) => Ok(EvaluatedToOk), - Err(_) => Ok(EvaluatedToErr), - } - } else { - Ok(EvaluatedToErr) + match self.tcx().const_eval_resolve( + obligation.param_env, + def_id, + substs, + None, + None, + ) { + Ok(_) => Ok(EvaluatedToOk), + Err(_) => Ok(EvaluatedToErr), } } else { // Inference variables still left in param_env or substs. @@ -852,20 +827,14 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ) -> Result { debug!("evaluate_trait_predicate_recursively({:?})", obligation); - if self.intercrate.is_none() && obligation.is_global() - && obligation - .param_env - .caller_bounds - .iter() - .all(|bound| bound.needs_subst()) + if self.intercrate.is_none() + && obligation.is_global() + && obligation.param_env.caller_bounds.iter().all(|bound| bound.needs_subst()) { // If a param env has no global bounds, global obligations do not // depend on its particular value in order to work, so we can clear // out the param env and get better caching. - debug!( - "evaluate_trait_predicate_recursively({:?}) - in global", - obligation - ); + debug!("evaluate_trait_predicate_recursively({:?}) - in global", obligation); obligation.param_env = obligation.param_env.without_caller_bounds(); } @@ -916,20 +885,12 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { debug!( "evaluate_trait_predicate_recursively: caching provisionally because {:?} \ is a cycle participant (at depth {}, reached depth {})", - fresh_trait_ref, - stack.depth, - reached_depth, + fresh_trait_ref, stack.depth, reached_depth, ); - stack.cache().insert_provisional( - stack.dfn, - reached_depth, - fresh_trait_ref, - result, - ); + stack.cache().insert_provisional(stack.dfn, reached_depth, fresh_trait_ref, result); } - Ok(result) } @@ -956,16 +917,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { &mut self, stack: &TraitObligationStack<'_, 'tcx>, ) -> Option { - if let Some(cycle_depth) = stack.iter() + if let Some(cycle_depth) = stack + .iter() .skip(1) // Skip top-most frame. - .find(|prev| stack.obligation.param_env == prev.obligation.param_env && - stack.fresh_trait_ref == prev.fresh_trait_ref) + .find(|prev| { + stack.obligation.param_env == prev.obligation.param_env + && stack.fresh_trait_ref == prev.fresh_trait_ref + }) .map(|stack| stack.depth) { debug!( "evaluate_stack({:?}) --> recursive at depth {}", - stack.fresh_trait_ref, - cycle_depth, + stack.fresh_trait_ref, cycle_depth, ); // If we have a stack like `A B C D E A`, where the top of @@ -982,18 +945,14 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // trait refs. This is important because it's only a cycle // if the regions match exactly. let cycle = stack.iter().skip(1).take_while(|s| s.depth >= cycle_depth); - let cycle = cycle.map(|stack| ty::Predicate::Trait(stack.obligation.predicate)); + let cycle = cycle.map(|stack| { + ty::Predicate::Trait(stack.obligation.predicate, ast::Constness::NotConst) + }); if self.coinductive_match(cycle) { - debug!( - "evaluate_stack({:?}) --> recursive, coinductive", - stack.fresh_trait_ref - ); + debug!("evaluate_stack({:?}) --> recursive, coinductive", stack.fresh_trait_ref); Some(EvaluatedToOk) } else { - debug!( - "evaluate_stack({:?}) --> recursive, inductive", - stack.fresh_trait_ref - ); + debug!("evaluate_stack({:?}) --> recursive, inductive", stack.fresh_trait_ref); Some(EvaluatedToRecur) } } else { @@ -1029,11 +988,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // This suffices to allow chains like `FnMut` implemented in // terms of `Fn` etc, but we could probably make this more // precise still. - let unbound_input_types = stack - .fresh_trait_ref - .skip_binder() - .input_types() - .any(|ty| ty.is_fresh()); + let unbound_input_types = + stack.fresh_trait_ref.skip_binder().input_types().any(|ty| ty.is_fresh()); // This check was an imperfect workaround for a bug in the old // intercrate mode; it should be removed when that goes away. if unbound_input_types && self.intercrate == Some(IntercrateMode::Issue43355) { @@ -1057,20 +1013,22 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { }, }; debug!("evaluate_stack: pushing cause = {:?}", cause); - self.intercrate_ambiguity_causes - .as_mut() - .unwrap() - .push(cause); + self.intercrate_ambiguity_causes.as_mut().unwrap().push(cause); } } } return Ok(EvaluatedToAmbig); } - if unbound_input_types && stack.iter().skip(1).any(|prev| { - stack.obligation.param_env == prev.obligation.param_env - && self.match_fresh_trait_refs( - &stack.fresh_trait_ref, &prev.fresh_trait_ref, prev.obligation.param_env) - }) { + if unbound_input_types + && stack.iter().skip(1).any(|prev| { + stack.obligation.param_env == prev.obligation.param_env + && self.match_fresh_trait_refs( + &stack.fresh_trait_ref, + &prev.fresh_trait_ref, + prev.obligation.param_env, + ) + }) + { debug!( "evaluate_stack({:?}) --> unbound argument, recursive --> giving up", stack.fresh_trait_ref @@ -1104,7 +1062,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { fn coinductive_predicate(&self, predicate: ty::Predicate<'tcx>) -> bool { let result = match predicate { - ty::Predicate::Trait(ref data) => self.tcx().trait_is_auto(data.def_id()), + ty::Predicate::Trait(ref data, _) => self.tcx().trait_is_auto(data.def_id()), _ => false, }; debug!("coinductive_predicate({:?}) = {:?}", predicate, result); @@ -1128,7 +1086,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { match this.confirm_candidate(stack.obligation, candidate) { Ok(selection) => this.evaluate_predicates_recursively( stack.list(), - selection.nested_obligations().into_iter() + selection.nested_obligations().into_iter(), ), Err(..) => Ok(EvaluatedToErr), } @@ -1192,10 +1150,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } } - debug!( - "insert_evaluation_cache(trait_ref={:?}, candidate={:?})", - trait_ref, result, - ); + debug!("insert_evaluation_cache(trait_ref={:?}, candidate={:?})", trait_ref, result,); self.infcx .evaluation_cache .hashmap @@ -1207,15 +1162,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { /// to have a *lower* recursion_depth than the obligation used to create it. /// Projection sub-obligations may be returned from the projection cache, /// which results in obligations with an 'old' `recursion_depth`. - /// Additionally, methods like `ty::wf::obligations` and + /// Additionally, methods like `wf::obligations` and /// `InferCtxt.subtype_predicate` produce subobligations without /// taking in a 'parent' depth, causing the generated subobligations /// to have a `recursion_depth` of `0`. /// /// To ensure that obligation_depth never decreasees, we force all subobligations /// to have at least the depth of the original obligation. - fn add_depth>>(&self, it: I, - min_depth: usize) { + fn add_depth>>( + &self, + it: I, + min_depth: usize, + ) { it.for_each(|o| o.recursion_depth = cmp::max(min_depth, o.recursion_depth) + 1); } @@ -1226,8 +1184,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { fn check_recursion_limit, V: Display + TypeFoldable<'tcx>>( &self, obligation: &Obligation<'tcx, T>, - error_obligation: &Obligation<'tcx, V> - ) -> Result<(), OverflowError> { + error_obligation: &Obligation<'tcx, V>, + ) -> Result<(), OverflowError> { let recursion_limit = *self.infcx.tcx.sess.recursion_limit.get(); if obligation.recursion_depth >= recursion_limit { match self.query_mode { @@ -1287,10 +1245,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let (candidate, dep_node) = self.in_task(|this| this.candidate_from_obligation_no_cache(stack)); - debug!( - "CACHE MISS: SELECT({:?})={:?}", - cache_fresh_trait_pred, candidate - ); + debug!("CACHE MISS: SELECT({:?})={:?}", cache_fresh_trait_pred, candidate); self.insert_candidate_cache( stack.obligation.param_env, cache_fresh_trait_pred, @@ -1304,9 +1259,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { where OP: FnOnce(&mut Self) -> R, { - let (result, dep_node) = self.tcx() - .dep_graph - .with_anon_task(DepKind::TraitSelect, || op(self)); + let (result, dep_node) = + self.tcx().dep_graph.with_anon_task(DepKind::TraitSelect, || op(self)); self.tcx().dep_graph.read_index(dep_node); (result, dep_node) } @@ -1323,19 +1277,22 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { return Err(Unimplemented); } ty::ImplPolarity::Reservation => { - if let Some(intercrate_ambiguity_clauses) - = &mut self.intercrate_ambiguity_causes + if let Some(intercrate_ambiguity_clauses) = + &mut self.intercrate_ambiguity_causes { let attrs = tcx.get_attrs(def_id); let attr = attr::find_by_name(&attrs, sym::rustc_reservation_impl); let value = attr.and_then(|a| a.value_str()); if let Some(value) = value { - debug!("filter_negative_and_reservation_impls: \ - reservation impl ambiguity on {:?}", def_id); + debug!( + "filter_negative_and_reservation_impls: \ + reservation impl ambiguity on {:?}", + def_id + ); intercrate_ambiguity_clauses.push( IntercrateAmbiguityCause::ReservationImpl { - message: value.to_string() - } + message: value.to_string(), + }, ); } } @@ -1370,10 +1327,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { if let Ok(candidate_set) = self.assemble_candidates(stack) { let mut no_candidates_apply = true; { - let evaluated_candidates = candidate_set - .vec - .iter() - .map(|c| self.evaluate_candidate(stack, &c)); + let evaluated_candidates = + candidate_set.vec.iter().map(|c| self.evaluate_candidate(stack, &c)); for ec in evaluated_candidates { match ec { @@ -1398,21 +1353,12 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { None }; let cause = if let Conflict::Upstream = conflict { - IntercrateAmbiguityCause::UpstreamCrateUpdate { - trait_desc, - self_desc, - } + IntercrateAmbiguityCause::UpstreamCrateUpdate { trait_desc, self_desc } } else { - IntercrateAmbiguityCause::DownstreamCrate { - trait_desc, - self_desc, - } + IntercrateAmbiguityCause::DownstreamCrate { trait_desc, self_desc } }; debug!("evaluate_stack: pushing cause = {:?}", cause); - self.intercrate_ambiguity_causes - .as_mut() - .unwrap() - .push(cause); + self.intercrate_ambiguity_causes.as_mut().unwrap().push(cause); } } } @@ -1428,12 +1374,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let mut candidates = candidate_set.vec; - debug!( - "assembled {} candidates for {:?}: {:?}", - candidates.len(), - stack, - candidates - ); + debug!("assembled {} candidates for {:?}: {:?}", candidates.len(), stack, candidates); // At this point, we know that each of the entries in the // candidate set is *individually* applicable. Now we have to @@ -1467,22 +1408,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let mut candidates = candidates .into_iter() .map(|c| match self.evaluate_candidate(stack, &c) { - Ok(eval) if eval.may_apply() => Ok(Some(EvaluatedCandidate { - candidate: c, - evaluation: eval, - })), + Ok(eval) if eval.may_apply() => { + Ok(Some(EvaluatedCandidate { candidate: c, evaluation: eval })) + } Ok(_) => Ok(None), Err(OverflowError) => Err(Overflow), }) .flat_map(Result::transpose) .collect::, _>>()?; - debug!( - "winnowed to {} candidates for {:?}: {:?}", - candidates.len(), - stack, - candidates - ); + debug!("winnowed to {} candidates for {:?}: {:?}", candidates.len(), stack, candidates); + + let needs_infer = stack.obligation.predicate.needs_infer(); // If there are STILL multiple candidates, we can further // reduce the list by dropping duplicates -- including @@ -1491,23 +1428,17 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let mut i = 0; while i < candidates.len() { let is_dup = (0..candidates.len()).filter(|&j| i != j).any(|j| { - self.candidate_should_be_dropped_in_favor_of(&candidates[i], &candidates[j]) + self.candidate_should_be_dropped_in_favor_of( + &candidates[i], + &candidates[j], + needs_infer, + ) }); if is_dup { - debug!( - "Dropping candidate #{}/{}: {:?}", - i, - candidates.len(), - candidates[i] - ); + debug!("Dropping candidate #{}/{}: {:?}", i, candidates.len(), candidates[i]); candidates.swap_remove(i); } else { - debug!( - "Retaining candidate #{}/{}: {:?}", - i, - candidates.len(), - candidates[i] - ); + debug!("Retaining candidate #{}/{}: {:?}", i, candidates.len(), candidates[i]); i += 1; // If there are *STILL* multiple candidates, give up @@ -1545,8 +1476,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } let obligation = &stack.obligation; - let predicate = self.infcx() - .resolve_vars_if_possible(&obligation.predicate); + let predicate = self.infcx().resolve_vars_if_possible(&obligation.predicate); // Okay to skip binder because of the nature of the // trait-ref-is-knowable check, which does not care about @@ -1555,9 +1485,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let result = coherence::trait_ref_is_knowable(self.tcx(), trait_ref); if let ( - Some(Conflict::Downstream { - used_to_be_broken: true, - }), + Some(Conflict::Downstream { used_to_be_broken: true }), Some(IntercrateMode::Issue43355), ) = (result, self.intercrate) { @@ -1631,14 +1559,15 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { /// Because of this, we always want to re-run the full selection /// process for our obligation the next time we see it, since /// we might end up picking a different `SelectionCandidate` (or none at all). - fn can_cache_candidate(&self, - result: &SelectionResult<'tcx, SelectionCandidate<'tcx>> - ) -> bool { + fn can_cache_candidate( + &self, + result: &SelectionResult<'tcx, SelectionCandidate<'tcx>>, + ) -> bool { match result { Ok(Some(SelectionCandidate::ParamCandidate(trait_ref))) => { !trait_ref.skip_binder().input_types().any(|t| t.walk().any(|t_| t_.is_ty_infer())) - }, - _ => true + } + _ => true, } } @@ -1653,10 +1582,12 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let trait_ref = cache_fresh_trait_pred.skip_binder().trait_ref; if !self.can_cache_candidate(&candidate) { - debug!("insert_candidate_cache(trait_ref={:?}, candidate={:?} -\ - candidate is not cacheable", trait_ref, candidate); + debug!( + "insert_candidate_cache(trait_ref={:?}, candidate={:?} -\ + candidate is not cacheable", + trait_ref, candidate + ); return; - } if self.can_use_global_caches(param_env) { @@ -1698,8 +1629,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { param_env: obligation.param_env, cause: obligation.cause.clone(), recursion_depth: obligation.recursion_depth, - predicate: self.infcx() - .resolve_vars_if_possible(&obligation.predicate), + predicate: self.infcx().resolve_vars_if_possible(&obligation.predicate), }; if obligation.predicate.skip_binder().self_ty().is_ty_var() { @@ -1712,16 +1642,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // Take the fast path out - this also improves // performance by preventing assemble_candidates_from_impls from // matching every impl for this trait. - return Ok(SelectionCandidateSet { - vec: vec![], - ambiguous: true, - }); + return Ok(SelectionCandidateSet { vec: vec![], ambiguous: true }); } - let mut candidates = SelectionCandidateSet { - vec: Vec::new(), - ambiguous: false, - }; + let mut candidates = SelectionCandidateSet { vec: Vec::new(), ambiguous: false }; self.assemble_candidates_for_trait_alias(obligation, &mut candidates)?; @@ -1731,10 +1655,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let lang_items = self.tcx().lang_items(); if lang_items.copy_trait() == Some(def_id) { - debug!( - "obligation self ty is {:?}", - obligation.predicate.skip_binder().self_ty() - ); + debug!("obligation self ty is {:?}", obligation.predicate.skip_binder().self_ty()); // User-defined copy impls are permitted, but only for // structs and enums. @@ -1798,10 +1719,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } let result = self.infcx.probe(|snapshot| { - self.match_projection_obligation_against_definition_bounds( - obligation, - snapshot, - ) + self.match_projection_obligation_against_definition_bounds(obligation, snapshot) }); if result { @@ -1814,10 +1732,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation: &TraitObligation<'tcx>, snapshot: &CombinedSnapshot<'_, 'tcx>, ) -> bool { - let poly_trait_predicate = self.infcx() - .resolve_vars_if_possible(&obligation.predicate); - let (placeholder_trait_predicate, placeholder_map) = self.infcx() - .replace_bound_vars_with_placeholders(&poly_trait_predicate); + let poly_trait_predicate = self.infcx().resolve_vars_if_possible(&obligation.predicate); + let (placeholder_trait_predicate, placeholder_map) = + self.infcx().replace_bound_vars_with_placeholders(&poly_trait_predicate); debug!( "match_projection_obligation_against_definition_bounds: \ placeholder_trait_predicate={:?}", @@ -1851,19 +1768,17 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ); let elaborated_predicates = util::elaborate_predicates(self.tcx(), bounds.predicates); - let matching_bound = elaborated_predicates - .filter_to_traits() - .find(|bound| { - self.infcx.probe(|_| { - self.match_projection( - obligation, - bound.clone(), - placeholder_trait_predicate.trait_ref.clone(), - &placeholder_map, - snapshot, - ) - }) - }); + let matching_bound = elaborated_predicates.filter_to_traits().find(|bound| { + self.infcx.probe(|_| { + self.match_projection( + obligation, + bound.clone(), + placeholder_trait_predicate.trait_ref.clone(), + &placeholder_map, + snapshot, + ) + }) + }); debug!( "match_projection_obligation_against_definition_bounds: \ @@ -1901,8 +1816,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { .at(&obligation.cause, obligation.param_env) .sup(ty::Binder::dummy(placeholder_trait_ref), trait_bound) .is_ok() - && - self.infcx.leak_check(false, placeholder_map, snapshot).is_ok() + && self.infcx.leak_check(false, placeholder_map, snapshot).is_ok() } /// Given an obligation like ``, searches the obligations that the caller @@ -1914,10 +1828,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { stack: &TraitObligationStack<'o, 'tcx>, candidates: &mut SelectionCandidateSet<'tcx>, ) -> Result<(), SelectionError<'tcx>> { - debug!( - "assemble_candidates_from_caller_bounds({:?})", - stack.obligation - ); + debug!("assemble_candidates_from_caller_bounds({:?})", stack.obligation); let all_bounds = stack .obligation @@ -2002,10 +1913,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation: &TraitObligation<'tcx>, candidates: &mut SelectionCandidateSet<'tcx>, ) -> Result<(), SelectionError<'tcx>> { - let kind = match self.tcx() - .lang_items() - .fn_trait_kind(obligation.predicate.def_id()) - { + let kind = match self.tcx().lang_items().fn_trait_kind(obligation.predicate.def_id()) { Some(k) => k, None => { return Ok(()); @@ -2017,19 +1925,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // type/region parameters match obligation.self_ty().skip_binder().kind { ty::Closure(closure_def_id, closure_substs) => { - debug!( - "assemble_unboxed_candidates: kind={:?} obligation={:?}", - kind, obligation - ); - match self.infcx.closure_kind( - closure_def_id, - closure_substs - ) { + debug!("assemble_unboxed_candidates: kind={:?} obligation={:?}", kind, obligation); + match self.infcx.closure_kind(closure_def_id, closure_substs) { Some(closure_kind) => { - debug!( - "assemble_unboxed_candidates: closure_kind = {:?}", - closure_kind - ); + debug!("assemble_unboxed_candidates: closure_kind = {:?}", closure_kind); if closure_kind.extends(kind) { candidates.vec.push(ClosureCandidate); } @@ -2057,11 +1956,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { candidates: &mut SelectionCandidateSet<'tcx>, ) -> Result<(), SelectionError<'tcx>> { // We provide impl of all fn traits for fn pointers. - if self.tcx() - .lang_items() - .fn_trait_kind(obligation.predicate.def_id()) - .is_none() - { + if self.tcx().lang_items().fn_trait_kind(obligation.predicate.def_id()).is_none() { return Ok(()); } @@ -2096,18 +1991,14 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation: &TraitObligation<'tcx>, candidates: &mut SelectionCandidateSet<'tcx>, ) -> Result<(), SelectionError<'tcx>> { - debug!( - "assemble_candidates_from_impls(obligation={:?})", - obligation - ); + debug!("assemble_candidates_from_impls(obligation={:?})", obligation); self.tcx().for_each_relevant_impl( obligation.predicate.def_id(), obligation.predicate.skip_binder().trait_ref.self_ty(), |impl_def_id| { self.infcx.probe(|snapshot| { - if let Ok(_substs) = self.match_impl(impl_def_id, obligation, snapshot) - { + if let Ok(_substs) = self.match_impl(impl_def_id, obligation, snapshot) { candidates.vec.push(ImplCandidate(impl_def_id)); } }); @@ -2172,14 +2063,12 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { hir::Movability::Movable => { // Movable generators are always `Unpin`, so add an // unconditional builtin candidate. - candidates.vec.push(BuiltinCandidate { - has_nested: false, - }); + candidates.vec.push(BuiltinCandidate { has_nested: false }); } } } - _ => candidates.vec.push(AutoImplCandidate(def_id.clone())), + _ => candidates.vec.push(AutoImplCandidate(def_id)), } } @@ -2204,9 +2093,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let self_ty = self.tcx().erase_late_bound_regions(&obligation.self_ty()); let poly_trait_ref = match self_ty.kind { ty::Dynamic(ref data, ..) => { - if data.auto_traits() - .any(|did| did == obligation.predicate.def_id()) - { + if data.auto_traits().any(|did| did == obligation.predicate.def_id()) { debug!( "assemble_candidates_from_object_ty: matched builtin bound, \ pushing candidate" @@ -2236,10 +2123,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { _ => return, }; - debug!( - "assemble_candidates_from_object_ty: poly_trait_ref={:?}", - poly_trait_ref - ); + debug!("assemble_candidates_from_object_ty: poly_trait_ref={:?}", poly_trait_ref); // Count only those upcast versions that match the trait-ref // we are looking for. Specifically, do not only check for the @@ -2248,11 +2132,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // but `Foo` is declared as `trait Foo: Bar`. let upcast_trait_refs = util::supertraits(self.tcx(), poly_trait_ref) .filter(|upcast_trait_ref| { - self.infcx.probe(|_| { - let upcast_trait_ref = upcast_trait_ref.clone(); - self.match_poly_trait_ref(obligation, upcast_trait_ref) - .is_ok() - }) + self.infcx + .probe(|_| self.match_poly_trait_ref(obligation, *upcast_trait_ref).is_ok()) }) .count(); @@ -2292,17 +2173,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { return; } }; - let target = obligation - .predicate - .skip_binder() - .trait_ref - .substs - .type_at(1); + let target = obligation.predicate.skip_binder().trait_ref.substs.type_at(1); - debug!( - "assemble_candidates_for_unsizing(source={:?}, target={:?})", - source, target - ); + debug!("assemble_candidates_for_unsizing(source={:?}, target={:?})", source, target); let may_apply = match (&source.kind, &target.kind) { // Trait+Kx+'a -> Trait+Ky+'b (upcasts). @@ -2319,9 +2192,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // We always upcast when we can because of reason // #2 (region bounds). data_a.principal_def_id() == data_b.principal_def_id() - && data_b.auto_traits() - // All of a's auto traits need to be in b's auto traits. - .all(|b| data_a.auto_traits().any(|a| a == b)) + && data_b + .auto_traits() + // All of a's auto traits need to be in b's auto traits. + .all(|b| data_a.auto_traits().any(|a| a == b)) } // `T` -> `Trait` @@ -2367,7 +2241,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let def_id = obligation.predicate.def_id(); if self.tcx().is_trait_alias(def_id) { - candidates.vec.push(TraitAliasCandidate(def_id.clone())); + candidates.vec.push(TraitAliasCandidate(def_id)); } Ok(()) @@ -2390,6 +2264,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { &mut self, victim: &EvaluatedCandidate<'tcx>, other: &EvaluatedCandidate<'tcx>, + needs_infer: bool, ) -> bool { if victim.candidate == other.candidate { return true; @@ -2471,9 +2346,55 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { match victim.candidate { ImplCandidate(victim_def) => { let tcx = self.tcx(); - return tcx.specializes((other_def, victim_def)) - || tcx.impls_are_allowed_to_overlap( - other_def, victim_def).is_some(); + if tcx.specializes((other_def, victim_def)) { + return true; + } + return match tcx.impls_are_allowed_to_overlap(other_def, victim_def) { + Some(ty::ImplOverlapKind::Permitted { marker: true }) => { + // Subtle: If the predicate we are evaluating has inference + // variables, do *not* allow discarding candidates due to + // marker trait impls. + // + // Without this restriction, we could end up accidentally + // constrainting inference variables based on an arbitrarily + // chosen trait impl. + // + // Imagine we have the following code: + // + // ```rust + // #[marker] trait MyTrait {} + // impl MyTrait for u8 {} + // impl MyTrait for bool {} + // ``` + // + // And we are evaluating the predicate `<_#0t as MyTrait>`. + // + // During selection, we will end up with one candidate for each + // impl of `MyTrait`. If we were to discard one impl in favor + // of the other, we would be left with one candidate, causing + // us to "successfully" select the predicate, unifying + // _#0t with (for example) `u8`. + // + // However, we have no reason to believe that this unification + // is correct - we've essentially just picked an arbitrary + // *possibility* for _#0t, and required that this be the *only* + // possibility. + // + // Eventually, we will either: + // 1) Unify all inference variables in the predicate through + // some other means (e.g. type-checking of a function). We will + // then be in a position to drop marker trait candidates + // without constraining inference variables (since there are + // none left to constrin) + // 2) Be left with some unconstrained inference variables. We + // will then correctly report an inference error, since the + // existence of multiple marker trait impls tells us nothing + // about which one should actually apply. + !needs_infer + } + Some(_) => true, + None => false, + }; } ParamCandidate(ref cand) => { // Prefer the impl to a global where clause candidate. @@ -2518,9 +2439,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { match conditions { BuiltinImplConditions::Where(nested) => { debug!("builtin_bound: nested={:?}", nested); - candidates.vec.push(BuiltinCandidate { - has_nested: nested.skip_binder().len() > 0, - }); + candidates + .vec + .push(BuiltinCandidate { has_nested: nested.skip_binder().len() > 0 }); } BuiltinImplConditions::None => {} BuiltinImplConditions::Ambiguous => { @@ -2539,8 +2460,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { use self::BuiltinImplConditions::{Ambiguous, None, Where}; // NOTE: binder moved to (*) - let self_ty = self.infcx - .shallow_resolve(obligation.predicate.skip_binder().self_ty()); + let self_ty = self.infcx.shallow_resolve(obligation.predicate.skip_binder().self_ty()); match self_ty.kind { ty::Infer(ty::IntVar(_)) @@ -2574,10 +2494,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let sized_crit = def.sized_constraint(self.tcx()); // (*) binder moved here Where(ty::Binder::bind( - sized_crit - .iter() - .map(|ty| ty.subst(self.tcx(), substs)) - .collect(), + sized_crit.iter().map(|ty| ty.subst(self.tcx(), substs)).collect(), )) } @@ -2590,10 +2507,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { | ty::Infer(ty::FreshTy(_)) | ty::Infer(ty::FreshIntTy(_)) | ty::Infer(ty::FreshFloatTy(_)) => { - bug!( - "asked to assemble builtin bounds of unexpected type: {:?}", - self_ty - ); + bug!("asked to assemble builtin bounds of unexpected type: {:?}", self_ty); } } } @@ -2603,8 +2517,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation: &TraitObligation<'tcx>, ) -> BuiltinImplConditions<'tcx> { // NOTE: binder moved to (*) - let self_ty = self.infcx - .shallow_resolve(obligation.predicate.skip_binder().self_ty()); + let self_ty = self.infcx.shallow_resolve(obligation.predicate.skip_binder().self_ty()); use self::BuiltinImplConditions::{Ambiguous, None, Where}; @@ -2622,7 +2535,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { | ty::Char | ty::RawPtr(..) | ty::Never - | ty::Ref(_, _, hir::Mutability::Immutable) => { + | ty::Ref(_, _, hir::Mutability::Not) => { // Implementations provided in libcore None } @@ -2633,7 +2546,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { | ty::Generator(..) | ty::GeneratorWitness(..) | ty::Foreign(..) - | ty::Ref(_, _, hir::Mutability::Mutable) => None, + | ty::Ref(_, _, hir::Mutability::Mut) => None, ty::Array(element_ty, _) => { // (*) binder moved here @@ -2647,9 +2560,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ty::Closure(def_id, substs) => { // (*) binder moved here - Where(ty::Binder::bind( - substs.as_closure().upvar_tys(def_id, self.tcx()).collect(), - )) + Where(ty::Binder::bind(substs.as_closure().upvar_tys(def_id, self.tcx()).collect())) } ty::Adt(..) | ty::Projection(..) | ty::Param(..) | ty::Opaque(..) => { @@ -2670,10 +2581,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { | ty::Infer(ty::FreshTy(_)) | ty::Infer(ty::FreshIntTy(_)) | ty::Infer(ty::FreshFloatTy(_)) => { - bug!( - "asked to assemble builtin bounds of unexpected type: {:?}", - self_ty - ); + bug!("asked to assemble builtin bounds of unexpected type: {:?}", self_ty); } } } @@ -2715,10 +2623,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { | ty::Infer(ty::FreshTy(_)) | ty::Infer(ty::FreshIntTy(_)) | ty::Infer(ty::FreshFloatTy(_)) => { - bug!( - "asked to assemble constituent types of unexpected type: {:?}", - t - ); + bug!("asked to assemble constituent types of unexpected type: {:?}", t); } ty::RawPtr(ty::TypeAndMut { ty: element_ty, .. }) | ty::Ref(_, element_ty, _) => { @@ -2732,9 +2637,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { tys.iter().map(|k| k.expect_ty()).collect() } - ty::Closure(def_id, ref substs) => substs.as_closure() - .upvar_tys(def_id, self.tcx()) - .collect(), + ty::Closure(def_id, ref substs) => { + substs.as_closure().upvar_tys(def_id, self.tcx()).collect() + } ty::Generator(def_id, ref substs, _) => { let witness = substs.as_generator().witness(def_id, self.tcx()); @@ -2796,19 +2701,17 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let ty: ty::Binder> = ty::Binder::bind(ty); // <----/ self.infcx.commit_unconditionally(|_| { - let (skol_ty, _) = self.infcx - .replace_bound_vars_with_placeholders(&ty); - let Normalized { - value: normalized_ty, - mut obligations, - } = project::normalize_with_depth( - self, - param_env, - cause.clone(), - recursion_depth, - &skol_ty, - ); - let skol_obligation = self.tcx().predicate_for_trait_def( + let (skol_ty, _) = self.infcx.replace_bound_vars_with_placeholders(&ty); + let Normalized { value: normalized_ty, mut obligations } = + project::normalize_with_depth( + self, + param_env, + cause.clone(), + recursion_depth, + &skol_ty, + ); + let skol_obligation = predicate_for_trait_def( + self.tcx(), param_env, cause.clone(), trait_def_id, @@ -2851,10 +2754,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { Ok(VtableParam(obligations)) } - ImplCandidate(impl_def_id) => Ok(VtableImpl(self.confirm_impl_candidate( - obligation, - impl_def_id, - ))), + ImplCandidate(impl_def_id) => { + Ok(VtableImpl(self.confirm_impl_candidate(obligation, impl_def_id))) + } AutoImplCandidate(trait_def_id) => { let data = self.confirm_auto_impl_candidate(obligation, trait_def_id); @@ -2908,10 +2810,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { fn confirm_projection_candidate(&mut self, obligation: &TraitObligation<'tcx>) { self.infcx.commit_unconditionally(|snapshot| { let result = - self.match_projection_obligation_against_definition_bounds( - obligation, - snapshot, - ); + self.match_projection_obligation_against_definition_bounds(obligation, snapshot); assert!(result); }) } @@ -2944,10 +2843,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation: &TraitObligation<'tcx>, has_nested: bool, ) -> VtableBuiltinData> { - debug!( - "confirm_builtin_candidate({:?}, {:?})", - obligation, has_nested - ); + debug!("confirm_builtin_candidate({:?}, {:?})", obligation, has_nested); let lang_items = self.tcx().lang_items(); let obligations = if has_nested { @@ -2963,10 +2859,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { }; let nested = match conditions { BuiltinImplConditions::Where(nested) => nested, - _ => bug!( - "obligation {:?} had matched a builtin impl but now doesn't", - obligation - ), + _ => bug!("obligation {:?} had matched a builtin impl but now doesn't", obligation), }; let cause = obligation.derived_cause(BuiltinDerivedObligation); @@ -2983,9 +2876,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { debug!("confirm_builtin_candidate: obligations={:?}", obligations); - VtableBuiltinData { - nested: obligations, - } + VtableBuiltinData { nested: obligations } } /// This handles the case where a `auto trait Foo` impl is being used. @@ -2998,10 +2889,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation: &TraitObligation<'tcx>, trait_def_id: DefId, ) -> VtableAutoImplData> { - debug!( - "confirm_auto_impl_candidate({:?}, {:?})", - obligation, trait_def_id - ); + debug!("confirm_auto_impl_candidate({:?}, {:?})", obligation, trait_def_id); let types = obligation.predicate.map_bound(|inner| { let self_ty = self.infcx.shallow_resolve(inner.self_ty()); @@ -3031,8 +2919,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let trait_obligations: Vec> = self.infcx.commit_unconditionally(|_| { let poly_trait_ref = obligation.predicate.to_poly_trait_ref(); - let (trait_ref, _) = self.infcx - .replace_bound_vars_with_placeholders(&poly_trait_ref); + let (trait_ref, _) = + self.infcx.replace_bound_vars_with_placeholders(&poly_trait_ref); let cause = obligation.derived_cause(ImplDerivedObligation); self.impl_or_trait_obligations( cause, @@ -3049,10 +2937,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { debug!("vtable_auto_impl: obligations={:?}", obligations); - VtableAutoImplData { - trait_def_id, - nested: obligations, - } + VtableAutoImplData { trait_def_id, nested: obligations } } fn confirm_impl_candidate( @@ -3111,11 +2996,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // e.g., `impl> Foo<::T> for V` impl_obligations.append(&mut substs.obligations); - VtableImplData { - impl_def_id, - substs: substs.value, - nested: impl_obligations, - } + VtableImplData { impl_def_id, substs: substs.value, nested: impl_obligations } } fn confirm_object_candidate( @@ -3128,13 +3009,14 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // probably flatten the binder from the obligation and the binder // from the object. Have to try to make a broken test case that // results. - let self_ty = self.infcx - .shallow_resolve(*obligation.self_ty().skip_binder()); + let self_ty = self.infcx.shallow_resolve(*obligation.self_ty().skip_binder()); let poly_trait_ref = match self_ty.kind { - ty::Dynamic(ref data, ..) => - data.principal().unwrap_or_else(|| { + ty::Dynamic(ref data, ..) => data + .principal() + .unwrap_or_else(|| { span_bug!(obligation.cause.span, "object candidate with no principal") - }).with_self_ty(self.tcx(), self_ty), + }) + .with_self_ty(self.tcx(), self_ty), _ => span_bug!(obligation.cause.span, "object candidate with non-object"), }; @@ -3151,29 +3033,25 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // where we can unify, because otherwise select would have // reported an ambiguity. (When we do find a match, also // record it for later.) - let nonmatching = util::supertraits(tcx, poly_trait_ref).take_while( - |&t| match self.infcx.commit_if_ok(|_| self.match_poly_trait_ref(obligation, t)) { + let nonmatching = util::supertraits(tcx, poly_trait_ref).take_while(|&t| { + match self.infcx.commit_if_ok(|_| self.match_poly_trait_ref(obligation, t)) { Ok(obligations) => { upcast_trait_ref = Some(t); nested.extend(obligations); false } Err(_) => true, - }, - ); + } + }); // Additionally, for each of the non-matching predicates that // we pass over, we sum up the set of number of vtable // entries, so that we can compute the offset for the selected // trait. - vtable_base = nonmatching.map(|t| tcx.count_own_vtable_entries(t)).sum(); + vtable_base = nonmatching.map(|t| super::util::count_own_vtable_entries(tcx, t)).sum(); } - VtableObjectData { - upcast_trait_ref: upcast_trait_ref.unwrap(), - vtable_base, - nested, - } + VtableObjectData { upcast_trait_ref: upcast_trait_ref.unwrap(), vtable_base, nested } } fn confirm_fn_pointer_candidate( @@ -3183,22 +3061,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { debug!("confirm_fn_pointer_candidate({:?})", obligation); // Okay to skip binder; it is reintroduced below. - let self_ty = self.infcx - .shallow_resolve(*obligation.self_ty().skip_binder()); + let self_ty = self.infcx.shallow_resolve(*obligation.self_ty().skip_binder()); let sig = self_ty.fn_sig(self.tcx()); - let trait_ref = self.tcx() - .closure_trait_ref_and_return_type( - obligation.predicate.def_id(), - self_ty, - sig, - util::TupleArgumentsFlag::Yes, - ) - .map_bound(|(trait_ref, _)| trait_ref); + let trait_ref = closure_trait_ref_and_return_type( + self.tcx(), + obligation.predicate.def_id(), + self_ty, + sig, + util::TupleArgumentsFlag::Yes, + ) + .map_bound(|(trait_ref, _)| trait_ref); - let Normalized { - value: trait_ref, - obligations, - } = project::normalize_with_depth( + let Normalized { value: trait_ref, obligations } = project::normalize_with_depth( self, obligation.param_env, obligation.cause.clone(), @@ -3212,10 +3086,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation.predicate.to_poly_trait_ref(), trait_ref, )?; - Ok(VtableFnPointerData { - fn_ty: self_ty, - nested: obligations, - }) + Ok(VtableFnPointerData { fn_ty: self_ty, nested: obligations }) } fn confirm_trait_alias_candidate( @@ -3223,14 +3094,11 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation: &TraitObligation<'tcx>, alias_def_id: DefId, ) -> VtableTraitAliasData<'tcx, PredicateObligation<'tcx>> { - debug!( - "confirm_trait_alias_candidate({:?}, {:?})", - obligation, alias_def_id - ); + debug!("confirm_trait_alias_candidate({:?}, {:?})", obligation, alias_def_id); self.infcx.commit_unconditionally(|_| { - let (predicate, _) = self.infcx() - .replace_bound_vars_with_placeholders(&obligation.predicate); + let (predicate, _) = + self.infcx().replace_bound_vars_with_placeholders(&obligation.predicate); let trait_ref = predicate.trait_ref; let trait_def_id = trait_ref.def_id; let substs = trait_ref.substs; @@ -3248,11 +3116,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { trait_def_id, trait_obligations ); - VtableTraitAliasData { - alias_def_id, - substs: substs, - nested: trait_obligations, - } + VtableTraitAliasData { alias_def_id, substs: substs, nested: trait_obligations } }) } @@ -3269,16 +3133,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { _ => bug!("closure candidate for non-closure {:?}", obligation), }; - debug!( - "confirm_generator_candidate({:?},{:?},{:?})", - obligation, generator_def_id, substs - ); + debug!("confirm_generator_candidate({:?},{:?},{:?})", obligation, generator_def_id, substs); let trait_ref = self.generator_trait_ref_unnormalized(obligation, generator_def_id, substs); - let Normalized { - value: trait_ref, - mut obligations, - } = normalize_with_depth( + let Normalized { value: trait_ref, mut obligations } = normalize_with_depth( self, obligation.param_env, obligation.cause.clone(), @@ -3299,11 +3157,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { trait_ref, )?); - Ok(VtableGeneratorData { - generator_def_id, - substs, - nested: obligations, - }) + Ok(VtableGeneratorData { generator_def_id, substs, nested: obligations }) } fn confirm_closure_candidate( @@ -3312,7 +3166,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ) -> Result>, SelectionError<'tcx>> { debug!("confirm_closure_candidate({:?})", obligation); - let kind = self.tcx() + let kind = self + .tcx() .lang_items() .fn_trait_kind(obligation.predicate.def_id()) .unwrap_or_else(|| bug!("closure candidate for non-fn trait {:?}", obligation)); @@ -3327,10 +3182,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { }; let trait_ref = self.closure_trait_ref_unnormalized(obligation, closure_def_id, substs); - let Normalized { - value: trait_ref, - mut obligations, - } = normalize_with_depth( + let Normalized { value: trait_ref, mut obligations } = normalize_with_depth( self, obligation.param_env, obligation.cause.clone(), @@ -3356,19 +3208,11 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligations.push(Obligation::new( obligation.cause.clone(), obligation.param_env, - ty::Predicate::ClosureKind( - closure_def_id, - substs, - kind - ), + ty::Predicate::ClosureKind(closure_def_id, substs, kind), )); } - Ok(VtableClosureData { - closure_def_id, - substs: substs, - nested: obligations, - }) + Ok(VtableClosureData { closure_def_id, substs: substs, nested: obligations }) } /// In the case of closure types and fn pointers, @@ -3403,7 +3247,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation_trait_ref: ty::PolyTraitRef<'tcx>, expected_trait_ref: ty::PolyTraitRef<'tcx>, ) -> Result>, SelectionError<'tcx>> { - let obligation_trait_ref = obligation_trait_ref.clone(); self.infcx .at(&obligation_cause, obligation_param_env) .sup(obligation_trait_ref, expected_trait_ref) @@ -3419,20 +3262,11 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // `assemble_candidates_for_unsizing` should ensure there are no late-bound // regions here. See the comment there for more details. - let source = self.infcx - .shallow_resolve(obligation.self_ty().no_bound_vars().unwrap()); - let target = obligation - .predicate - .skip_binder() - .trait_ref - .substs - .type_at(1); + let source = self.infcx.shallow_resolve(obligation.self_ty().no_bound_vars().unwrap()); + let target = obligation.predicate.skip_binder().trait_ref.substs.type_at(1); let target = self.infcx.shallow_resolve(target); - debug!( - "confirm_builtin_unsize_candidate(source={:?}, target={:?})", - source, target - ); + debug!("confirm_builtin_unsize_candidate(source={:?}, target={:?})", source, target); let mut nested = vec![]; match (&source.kind, &target.kind) { @@ -3440,18 +3274,16 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { (&ty::Dynamic(ref data_a, r_a), &ty::Dynamic(ref data_b, r_b)) => { // See `assemble_candidates_for_unsizing` for more info. let existential_predicates = data_a.map_bound(|data_a| { - let iter = - data_a.principal().map(|x| ty::ExistentialPredicate::Trait(x)) - .into_iter().chain( - data_a - .projection_bounds() - .map(|x| ty::ExistentialPredicate::Projection(x)), - ) - .chain( - data_b - .auto_traits() - .map(ty::ExistentialPredicate::AutoTrait), - ); + let iter = data_a + .principal() + .map(|x| ty::ExistentialPredicate::Trait(x)) + .into_iter() + .chain( + data_a + .projection_bounds() + .map(|x| ty::ExistentialPredicate::Projection(x)), + ) + .chain(data_b.auto_traits().map(ty::ExistentialPredicate::AutoTrait)); tcx.mk_existential_predicates(iter) }); let source_trait = tcx.mk_dynamic(existential_predicates, r_b); @@ -3472,7 +3304,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // because I want to continue rejecting that test (as we have // done for quite some time) before we are firmly comfortable // with what our behavior should be there. -nikomatsakis - let InferOk { obligations, .. } = self.infcx + let InferOk { obligations, .. } = self + .infcx .at(&obligation.cause, obligation.param_env) .eq(target, source_trait) // FIXME -- see below .map_err(|_| Unimplemented)?; @@ -3495,8 +3328,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // `T` -> `Trait` (_, &ty::Dynamic(ref data, r)) => { - let mut object_dids = data.auto_traits() - .chain(data.principal_def_id()); + let mut object_dids = data.auto_traits().chain(data.principal_def_id()); if let Some(did) = object_dids.find(|did| !tcx.is_object_safe(*did)) { return Err(TraitNotObjectSafe(did)); } @@ -3523,10 +3355,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // the `Send` check.) // - Projection predicates nested.extend( - data.iter() - .map(|predicate| - predicate_to_obligation(predicate.with_self_ty(tcx, source)) - ), + data.iter().map(|predicate| { + predicate_to_obligation(predicate.with_self_ty(tcx, source)) + }), ); // We can only make objects from sized types. @@ -3534,19 +3365,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { tcx.require_lang_item(lang_items::SizedTraitLangItem, None), tcx.mk_substs_trait(source, &[]), ); - nested.push(predicate_to_obligation(tr.to_predicate())); + nested.push(predicate_to_obligation(tr.without_const().to_predicate())); // If the type is `Foo + 'a`, ensure that the type // being cast to `Foo + 'a` outlives `'a`: let outlives = ty::OutlivesPredicate(source, r); - nested.push(predicate_to_obligation( - ty::Binder::dummy(outlives).to_predicate(), - )); + nested.push(predicate_to_obligation(ty::Binder::dummy(outlives).to_predicate())); } // `[T; n]` -> `[T]` (&ty::Array(a, _), &ty::Slice(b)) => { - let InferOk { obligations, .. } = self.infcx + let InferOk { obligations, .. } = self + .infcx .at(&obligation.cause, obligation.param_env) .eq(b, a) .map_err(|_| Unimplemented)?; @@ -3555,9 +3385,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // `Struct` -> `Struct` (&ty::Adt(def, substs_a), &ty::Adt(_, substs_b)) => { - let fields = def.all_fields() - .map(|field| tcx.type_of(field.did)) - .collect::>(); + let fields = + def.all_fields().map(|field| tcx.type_of(field.did)).collect::>(); // The last field of the structure has to exist and contain type parameters. let field = if let Some(&field) = fields.last() { @@ -3581,13 +3410,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // Error and ensure they do not affect any other fields. // This could be checked after type collection for any struct // with a potentially unsized trailing field. - let params = substs_a.iter().enumerate().map(|(i, &k)| { - if ty_params.contains(i) { - tcx.types.err.into() - } else { - k - } - }); + let params = substs_a + .iter() + .enumerate() + .map(|(i, &k)| if ty_params.contains(i) { tcx.types.err.into() } else { k }); let substs = tcx.mk_substs(params); for &ty in fields.split_last().unwrap().1 { if ty.subst(tcx, substs).references_error() { @@ -3602,21 +3428,19 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // Check that the source struct with the target's // unsized parameters is equal to the target. let params = substs_a.iter().enumerate().map(|(i, &k)| { - if ty_params.contains(i) { - substs_b.type_at(i).into() - } else { - k - } + if ty_params.contains(i) { substs_b.type_at(i).into() } else { k } }); let new_struct = tcx.mk_adt(def, tcx.mk_substs(params)); - let InferOk { obligations, .. } = self.infcx + let InferOk { obligations, .. } = self + .infcx .at(&obligation.cause, obligation.param_env) .eq(target, new_struct) .map_err(|_| Unimplemented)?; nested.extend(obligations); // Construct the nested `Field: Unsize>` predicate. - nested.push(tcx.predicate_for_trait_def( + nested.push(predicate_for_trait_def( + tcx, obligation.param_env, obligation.cause.clone(), obligation.predicate.def_id(), @@ -3643,14 +3467,16 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let new_tuple = tcx.mk_tup( a_mid.iter().map(|k| k.expect_ty()).chain(iter::once(b_last.expect_ty())), ); - let InferOk { obligations, .. } = self.infcx + let InferOk { obligations, .. } = self + .infcx .at(&obligation.cause, obligation.param_env) .eq(target, new_tuple) .map_err(|_| Unimplemented)?; nested.extend(obligations); // Construct the nested `T: Unsize` predicate. - nested.push(tcx.predicate_for_trait_def( + nested.push(predicate_for_trait_def( + tcx, obligation.param_env, obligation.cause.clone(), obligation.predicate.def_id(), @@ -3709,25 +3535,22 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { return Err(()); } - let (skol_obligation, placeholder_map) = self.infcx() - .replace_bound_vars_with_placeholders(&obligation.predicate); + let (skol_obligation, placeholder_map) = + self.infcx().replace_bound_vars_with_placeholders(&obligation.predicate); let skol_obligation_trait_ref = skol_obligation.trait_ref; - let impl_substs = self.infcx - .fresh_substs_for_item(obligation.cause.span, impl_def_id); + let impl_substs = self.infcx.fresh_substs_for_item(obligation.cause.span, impl_def_id); let impl_trait_ref = impl_trait_ref.subst(self.tcx(), impl_substs); - let Normalized { - value: impl_trait_ref, - obligations: mut nested_obligations, - } = project::normalize_with_depth( - self, - obligation.param_env, - obligation.cause.clone(), - obligation.recursion_depth + 1, - &impl_trait_ref, - ); + let Normalized { value: impl_trait_ref, obligations: mut nested_obligations } = + project::normalize_with_depth( + self, + obligation.param_env, + obligation.cause.clone(), + obligation.recursion_depth + 1, + &impl_trait_ref, + ); debug!( "match_impl(impl_def_id={:?}, obligation={:?}, \ @@ -3735,7 +3558,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { impl_def_id, obligation, impl_trait_ref, skol_obligation_trait_ref ); - let InferOk { obligations, .. } = self.infcx + let InferOk { obligations, .. } = self + .infcx .at(&obligation.cause, obligation.param_env) .eq(skol_obligation_trait_ref, impl_trait_ref) .map_err(|e| debug!("match_impl: failed eq_trait_refs due to `{}`", e))?; @@ -3754,10 +3578,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } debug!("match_impl: success impl_substs={:?}", impl_substs); - Ok(Normalized { - value: impl_substs, - obligations: nested_obligations, - }) + Ok(Normalized { value: impl_substs, obligations: nested_obligations }) } fn fast_reject_trait_refs( @@ -3769,12 +3590,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // substitution if we find that any of the input types, when // simplified, do not match. - obligation - .predicate - .skip_binder() - .input_types() - .zip(impl_trait_ref.input_types()) - .any(|(obligation_ty, impl_ty)| { + obligation.predicate.skip_binder().input_types().zip(impl_trait_ref.input_types()).any( + |(obligation_ty, impl_ty)| { let simplified_obligation_ty = fast_reject::simplify_type(self.tcx(), obligation_ty, true); let simplified_impl_ty = fast_reject::simplify_type(self.tcx(), impl_ty, false); @@ -3782,7 +3599,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { simplified_obligation_ty.is_some() && simplified_impl_ty.is_some() && simplified_obligation_ty != simplified_impl_ty - }) + }, + ) } /// Normalize `where_clause_trait_ref` and try to match it against @@ -3835,10 +3653,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { previous_stack: TraitObligationStackList<'o, 'tcx>, obligation: &'o TraitObligation<'tcx>, ) -> TraitObligationStack<'o, 'tcx> { - let fresh_trait_ref = obligation - .predicate - .to_poly_trait_ref() - .fold_with(&mut self.freshener); + let fresh_trait_ref = + obligation.predicate.to_poly_trait_ref().fold_with(&mut self.freshener); let dfn = previous_stack.cache.next_dfn(); let depth = previous_stack.depth() + 1; @@ -3864,24 +3680,21 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ); let closure_type = self.infcx.closure_sig(closure_def_id, substs); - debug!( - "closure_trait_ref_unnormalized: closure_type = {:?}", - closure_type - ); + debug!("closure_trait_ref_unnormalized: closure_type = {:?}", closure_type); // (1) Feels icky to skip the binder here, but OTOH we know // that the self-type is an unboxed closure type and hence is // in fact unparameterized (or at least does not reference any // regions bound in the obligation). Still probably some // refactoring could make this nicer. - self.tcx() - .closure_trait_ref_and_return_type( - obligation.predicate.def_id(), - obligation.predicate.skip_binder().self_ty(), // (1) - closure_type, - util::TupleArgumentsFlag::No, - ) - .map_bound(|(trait_ref, _)| trait_ref) + closure_trait_ref_and_return_type( + self.tcx(), + obligation.predicate.def_id(), + obligation.predicate.skip_binder().self_ty(), // (1) + closure_type, + util::TupleArgumentsFlag::No, + ) + .map_bound(|(trait_ref, _)| trait_ref) } fn generator_trait_ref_unnormalized( @@ -3898,13 +3711,13 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // regions bound in the obligation). Still probably some // refactoring could make this nicer. - self.tcx() - .generator_trait_ref_and_outputs( - obligation.predicate.def_id(), - obligation.predicate.skip_binder().self_ty(), // (1) - gen_sig, - ) - .map_bound(|(trait_ref, ..)| trait_ref) + super::util::generator_trait_ref_and_outputs( + self.tcx(), + obligation.predicate.def_id(), + obligation.predicate.skip_binder().self_ty(), // (1) + gen_sig, + ) + .map_bound(|(trait_ref, ..)| trait_ref) } /// Returns the obligations that are implied by instantiating an @@ -3916,8 +3729,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { cause: ObligationCause<'tcx>, recursion_depth: usize, param_env: ty::ParamEnv<'tcx>, - def_id: DefId, // of impl or trait - substs: SubstsRef<'tcx>, // for impl or trait + def_id: DefId, // of impl or trait + substs: SubstsRef<'tcx>, // for impl or trait ) -> Vec> { debug!("impl_or_trait_obligations(def_id={:?})", def_id); let tcx = self.tcx(); @@ -4005,20 +3818,12 @@ impl<'tcx> TraitObligation<'tcx> { // NOTE(flaper87): As of now, it keeps track of the whole error // chain. Ideally, we should have a way to configure this either // by using -Z verbose or just a CLI argument. - if obligation.recursion_depth >= 0 { - let derived_cause = DerivedObligationCause { - parent_trait_ref: obligation.predicate.to_poly_trait_ref(), - parent_code: Rc::new(obligation.cause.code.clone()), - }; - let derived_code = variant(derived_cause); - ObligationCause::new( - obligation.cause.span, - obligation.cause.body_id, - derived_code, - ) - } else { - obligation.cause.clone() - } + let derived_cause = DerivedObligationCause { + parent_trait_ref: obligation.predicate.to_poly_trait_ref(), + parent_code: Rc::new(obligation.cause.code.clone()), + }; + let derived_code = variant(derived_cause); + ObligationCause::new(obligation.cause.span, obligation.cause.body_id, derived_code) } } @@ -4221,10 +4026,7 @@ impl<'tcx> ProvisionalEvaluationCache<'tcx> { ) { debug!( "insert_provisional(from_dfn={}, reached_depth={}, fresh_trait_ref={:?}, result={:?})", - from_dfn, - reached_depth, - fresh_trait_ref, - result, + from_dfn, reached_depth, fresh_trait_ref, result, ); let r_d = self.reached_depth.get(); self.reached_depth.set(r_d.min(reached_depth)); @@ -4243,10 +4045,7 @@ impl<'tcx> ProvisionalEvaluationCache<'tcx> { /// these provisional entries must either depend on it or some /// ancestor of it. fn on_failure(&self, dfn: usize) { - debug!( - "on_failure(dfn={:?})", - dfn, - ); + debug!("on_failure(dfn={:?})", dfn,); self.map.borrow_mut().retain(|key, eval| { if !eval.from_dfn >= dfn { debug!("on_failure: removing {:?}", key); @@ -4267,11 +4066,7 @@ impl<'tcx> ProvisionalEvaluationCache<'tcx> { depth: usize, mut op: impl FnMut(ty::PolyTraitRef<'tcx>, EvaluationResult), ) { - debug!( - "on_completion(depth={}, reached_depth={})", - depth, - self.reached_depth.get(), - ); + debug!("on_completion(depth={}, reached_depth={})", depth, self.reached_depth.get(),); if self.reached_depth.get() < depth { debug!("on_completion: did not yet reach depth to complete"); @@ -4279,11 +4074,7 @@ impl<'tcx> ProvisionalEvaluationCache<'tcx> { } for (fresh_trait_ref, eval) in self.map.borrow_mut().drain() { - debug!( - "on_completion: fresh_trait_ref={:?} eval={:?}", - fresh_trait_ref, - eval, - ); + debug!("on_completion: fresh_trait_ref={:?} eval={:?}", fresh_trait_ref, eval,); op(fresh_trait_ref, eval.result); } @@ -4312,11 +4103,7 @@ impl<'o, 'tcx> TraitObligationStackList<'o, 'tcx> { } fn depth(&self) -> usize { - if let Some(head) = self.head { - head.depth - } else { - 0 - } + if let Some(head) = self.head { head.depth } else { 0 } } } @@ -4348,10 +4135,7 @@ pub struct WithDepNode { impl WithDepNode { pub fn new(dep_node: DepNodeIndex, cached_value: T) -> Self { - WithDepNode { - dep_node, - cached_value, - } + WithDepNode { dep_node, cached_value } } pub fn get(&self, tcx: TyCtxt<'_>) -> T { diff --git a/src/librustc/traits/specialize/mod.rs b/src/librustc/traits/specialize/mod.rs index 88a2db3dc6..e559ea391c 100644 --- a/src/librustc/traits/specialize/mod.rs +++ b/src/librustc/traits/specialize/mod.rs @@ -11,20 +11,19 @@ pub mod specialization_graph; -use crate::hir::def_id::DefId; use crate::infer::{InferCtxt, InferOk}; -use crate::lint; -use crate::traits::{self, coherence, FutureCompatOverlapErrorKind, ObligationCause, TraitEngine}; -use rustc_data_structures::fx::FxHashSet; -use syntax_pos::DUMMY_SP; use crate::traits::select::IntercrateAmbiguityCause; +use crate::traits::{self, coherence, FutureCompatOverlapErrorKind, ObligationCause, TraitEngine}; +use crate::ty::subst::{InternalSubsts, Subst, SubstsRef}; use crate::ty::{self, TyCtxt, TypeFoldable}; -use crate::ty::subst::{Subst, InternalSubsts, SubstsRef}; +use rustc_data_structures::fx::FxHashSet; +use rustc_errors::struct_span_err; +use rustc_hir::def_id::DefId; +use rustc_session::lint::builtin::ORDER_DEPENDENT_TRAIT_OBJECTS; +use rustc_span::DUMMY_SP; -use super::{SelectionContext, FulfillmentContext}; use super::util::impl_trait_ref_and_oblig; - -use rustc_error_codes::*; +use super::{FulfillmentContext, SelectionContext}; /// Information pertinent to an overlapping impl error. #[derive(Debug)] @@ -78,12 +77,12 @@ pub fn translate_substs<'a, 'tcx>( source_substs: SubstsRef<'tcx>, target_node: specialization_graph::Node, ) -> SubstsRef<'tcx> { - debug!("translate_substs({:?}, {:?}, {:?}, {:?})", - param_env, source_impl, source_substs, target_node); - let source_trait_ref = infcx.tcx - .impl_trait_ref(source_impl) - .unwrap() - .subst(infcx.tcx, &source_substs); + debug!( + "translate_substs({:?}, {:?}, {:?}, {:?})", + param_env, source_impl, source_substs, target_node + ); + let source_trait_ref = + infcx.tcx.impl_trait_ref(source_impl).unwrap().subst(infcx.tcx, &source_substs); // translate the Self and Param parts of the substitution, since those // vary across impls @@ -94,11 +93,14 @@ pub fn translate_substs<'a, 'tcx>( return source_substs; } - fulfill_implication(infcx, param_env, source_trait_ref, target_impl) - .unwrap_or_else(|_| - bug!("When translating substitutions for specialization, the expected \ - specialization failed to hold") - ) + fulfill_implication(infcx, param_env, source_trait_ref, target_impl).unwrap_or_else( + |_| { + bug!( + "When translating substitutions for specialization, the expected \ + specialization failed to hold" + ) + }, + ) } specialization_graph::Node::Trait(..) => source_trait_ref.substs, }; @@ -119,8 +121,7 @@ pub fn find_associated_item<'tcx>( substs: SubstsRef<'tcx>, impl_data: &super::VtableImplData<'tcx, ()>, ) -> (DefId, SubstsRef<'tcx>) { - debug!("find_associated_item({:?}, {:?}, {:?}, {:?})", - param_env, item, substs, impl_data); + debug!("find_associated_item({:?}, {:?}, {:?}, {:?})", param_env, item, substs, impl_data); assert!(!substs.needs_infer()); let trait_def_id = tcx.trait_id_of_impl(impl_data.impl_def_id).unwrap(); @@ -132,13 +133,18 @@ pub fn find_associated_item<'tcx>( let substs = tcx.infer_ctxt().enter(|infcx| { let param_env = param_env.with_reveal_all(); let substs = substs.rebase_onto(tcx, trait_def_id, impl_data.substs); - let substs = translate_substs(&infcx, param_env, impl_data.impl_def_id, - substs, node_item.node); + let substs = translate_substs( + &infcx, + param_env, + impl_data.impl_def_id, + substs, + node_item.node, + ); infcx.tcx.erase_regions(&substs) }); (node_item.item.def_id, substs) } - None => bug!("{:?} not found in {:?}", item, impl_data.impl_def_id) + None => bug!("{:?} not found in {:?}", item, impl_data.impl_def_id), } } @@ -147,16 +153,12 @@ pub fn find_associated_item<'tcx>( /// Specialization is determined by the sets of types to which the impls apply; /// `impl1` specializes `impl2` if it applies to a subset of the types `impl2` applies /// to. -pub(super) fn specializes( - tcx: TyCtxt<'_>, - (impl1_def_id, impl2_def_id): (DefId, DefId), -) -> bool { +pub(super) fn specializes(tcx: TyCtxt<'_>, (impl1_def_id, impl2_def_id): (DefId, DefId)) -> bool { debug!("specializes({:?}, {:?})", impl1_def_id, impl2_def_id); // The feature gate should prevent introducing new specializations, but not // taking advantage of upstream ones. - if !tcx.features().specialization && - (impl1_def_id.is_local() || impl2_def_id.is_local()) { + if !tcx.features().specialization && (impl1_def_id.is_local() || impl2_def_id.is_local()) { return false; } @@ -185,17 +187,18 @@ pub(super) fn specializes( tcx.infer_ctxt().enter(|infcx| { // Normalize the trait reference. The WF rules ought to ensure // that this always succeeds. - let impl1_trait_ref = - match traits::fully_normalize(&infcx, - FulfillmentContext::new(), - ObligationCause::dummy(), - penv, - &impl1_trait_ref) { - Ok(impl1_trait_ref) => impl1_trait_ref, - Err(err) => { - bug!("failed to fully normalize {:?}: {:?}", impl1_trait_ref, err); - } - }; + let impl1_trait_ref = match traits::fully_normalize( + &infcx, + FulfillmentContext::new(), + ObligationCause::dummy(), + penv, + &impl1_trait_ref, + ) { + Ok(impl1_trait_ref) => impl1_trait_ref, + Err(err) => { + bug!("failed to fully normalize {:?}: {:?}", impl1_trait_ref, err); + } + }; // Attempt to prove that impl2 applies, given all of the above. fulfill_implication(&infcx, penv, impl1_trait_ref, impl2_def_id).is_ok() @@ -213,28 +216,30 @@ fn fulfill_implication<'a, 'tcx>( source_trait_ref: ty::TraitRef<'tcx>, target_impl: DefId, ) -> Result, ()> { - debug!("fulfill_implication({:?}, trait_ref={:?} |- {:?} applies)", - param_env, source_trait_ref, target_impl); + debug!( + "fulfill_implication({:?}, trait_ref={:?} |- {:?} applies)", + param_env, source_trait_ref, target_impl + ); let selcx = &mut SelectionContext::new(&infcx); let target_substs = infcx.fresh_substs_for_item(DUMMY_SP, target_impl); - let (target_trait_ref, mut obligations) = impl_trait_ref_and_oblig(selcx, - param_env, - target_impl, - target_substs); - debug!("fulfill_implication: target_trait_ref={:?}, obligations={:?}", - target_trait_ref, obligations); + let (target_trait_ref, mut obligations) = + impl_trait_ref_and_oblig(selcx, param_env, target_impl, target_substs); + debug!( + "fulfill_implication: target_trait_ref={:?}, obligations={:?}", + target_trait_ref, obligations + ); // do the impls unify? If not, no specialization. - match infcx.at(&ObligationCause::dummy(), param_env) - .eq(source_trait_ref, target_trait_ref) { + match infcx.at(&ObligationCause::dummy(), param_env).eq(source_trait_ref, target_trait_ref) { Ok(InferOk { obligations: o, .. }) => { obligations.extend(o); } Err(_) => { - debug!("fulfill_implication: {:?} does not unify with {:?}", - source_trait_ref, - target_trait_ref); + debug!( + "fulfill_implication: {:?} does not unify with {:?}", + source_trait_ref, target_trait_ref + ); return Err(()); } } @@ -261,19 +266,19 @@ fn fulfill_implication<'a, 'tcx>( match fulfill_cx.select_all_or_error(infcx) { Err(errors) => { // no dice! - debug!("fulfill_implication: for impls on {:?} and {:?}, \ + debug!( + "fulfill_implication: for impls on {:?} and {:?}, \ could not fulfill: {:?} given {:?}", - source_trait_ref, - target_trait_ref, - errors, - param_env.caller_bounds); + source_trait_ref, target_trait_ref, errors, param_env.caller_bounds + ); Err(()) } Ok(()) => { - debug!("fulfill_implication: an impl for {:?} specializes {:?}", - source_trait_ref, - target_trait_ref); + debug!( + "fulfill_implication: an impl for {:?} specializes {:?}", + source_trait_ref, target_trait_ref + ); // Now resolve the *substitution* we built for the target earlier, replacing // the inference variables inside with whatever we got from fulfillment. @@ -296,9 +301,8 @@ pub(super) fn specialization_graph_provider( // iterated over (roughly) in definition order, so we are sorting by // negated `CrateNum` (so remote definitions are visited first) and then // by a flattened version of the `DefIndex`. - trait_impls.sort_unstable_by_key(|def_id| { - (-(def_id.krate.as_u32() as i64), def_id.index.index()) - }); + trait_impls + .sort_unstable_by_key(|def_id| (-(def_id.krate.as_u32() as i64), def_id.index.index())); for impl_def_id in trait_impls { if impl_def_id.is_local() { @@ -308,60 +312,67 @@ pub(super) fn specialization_graph_provider( let (overlap, used_to_be_allowed) = match insert_result { Err(overlap) => (Some(overlap), None), Ok(Some(overlap)) => (Some(overlap.error), Some(overlap.kind)), - Ok(None) => (None, None) + Ok(None) => (None, None), }; if let Some(overlap) = overlap { - let msg = format!("conflicting implementations of trait `{}`{}:{}", + let msg = format!( + "conflicting implementations of trait `{}`{}:{}", overlap.trait_desc, - overlap.self_desc.clone().map_or( - String::new(), |ty| { - format!(" for type `{}`", ty) - }), + overlap + .self_desc + .clone() + .map_or(String::new(), |ty| { format!(" for type `{}`", ty) }), match used_to_be_allowed { Some(FutureCompatOverlapErrorKind::Issue33140) => " (E0119)", _ => "", } ); - let impl_span = tcx.sess.source_map().def_span( - tcx.span_of_impl(impl_def_id).unwrap() - ); + let impl_span = + tcx.sess.source_map().def_span(tcx.span_of_impl(impl_def_id).unwrap()); let mut err = match used_to_be_allowed { - Some(FutureCompatOverlapErrorKind::Issue43355) | None => - struct_span_err!(tcx.sess, - impl_span, - E0119, - "{}", - msg), + Some(FutureCompatOverlapErrorKind::Issue43355) | None => { + struct_span_err!(tcx.sess, impl_span, E0119, "{}", msg) + } Some(kind) => { let lint = match kind { - FutureCompatOverlapErrorKind::Issue43355 => - unreachable!("converted to hard error above"), - FutureCompatOverlapErrorKind::Issue33140 => - lint::builtin::ORDER_DEPENDENT_TRAIT_OBJECTS, + FutureCompatOverlapErrorKind::Issue43355 => { + unreachable!("converted to hard error above") + } + FutureCompatOverlapErrorKind::Issue33140 => { + ORDER_DEPENDENT_TRAIT_OBJECTS + } }; tcx.struct_span_lint_hir( lint, tcx.hir().as_local_hir_id(impl_def_id).unwrap(), impl_span, - &msg) + &msg, + ) } }; match tcx.span_of_impl(overlap.with_impl) { Ok(span) => { - err.span_label(tcx.sess.source_map().def_span(span), - "first implementation here".to_string()); - err.span_label(impl_span, - format!("conflicting implementation{}", - overlap.self_desc - .map_or(String::new(), - |ty| format!(" for `{}`", ty)))); + err.span_label( + tcx.sess.source_map().def_span(span), + "first implementation here".to_string(), + ); + err.span_label( + impl_span, + format!( + "conflicting implementation{}", + overlap + .self_desc + .map_or(String::new(), |ty| format!(" for `{}`", ty)) + ), + ); } Err(cname) => { let msg = match to_pretty_impl_header(tcx, overlap.with_impl) { - Some(s) => format!( - "conflicting implementation in crate `{}`:\n- {}", cname, s), + Some(s) => { + format!("conflicting implementation in crate `{}`:\n- {}", cname, s) + } None => format!("conflicting implementation in crate `{}`", cname), }; err.note(&msg); @@ -410,10 +421,14 @@ fn to_pretty_impl_header(tcx: TyCtxt<'_>, impl_def_id: DefId) -> Option if !substs.is_noop() { types_without_default_bounds.extend(substs.types()); w.push('<'); - w.push_str(&substs.iter() - .map(|k| k.to_string()) - .filter(|k| k != "'_") - .collect::>().join(", ")); + w.push_str( + &substs + .iter() + .map(|k| k.to_string()) + .filter(|k| k != "'_") + .collect::>() + .join(", "), + ); w.push('>'); } @@ -422,8 +437,8 @@ fn to_pretty_impl_header(tcx: TyCtxt<'_>, impl_def_id: DefId) -> Option // The predicates will contain default bounds like `T: Sized`. We need to // remove these bounds, and add `T: ?Sized` to any untouched type parameters. let predicates = tcx.predicates_of(impl_def_id).predicates; - let mut pretty_predicates = Vec::with_capacity( - predicates.len() + types_without_default_bounds.len()); + let mut pretty_predicates = + Vec::with_capacity(predicates.len() + types_without_default_bounds.len()); for (p, _) in predicates { if let Some(poly_trait_ref) = p.to_opt_poly_trait_ref() { @@ -435,9 +450,8 @@ fn to_pretty_impl_header(tcx: TyCtxt<'_>, impl_def_id: DefId) -> Option pretty_predicates.push(p.to_string()); } - pretty_predicates.extend( - types_without_default_bounds.iter().map(|ty| format!("{}: ?Sized", ty)) - ); + pretty_predicates + .extend(types_without_default_bounds.iter().map(|ty| format!("{}: ?Sized", ty))); if !pretty_predicates.is_empty() { write!(w, "\n where {}", pretty_predicates.join(", ")).unwrap(); diff --git a/src/librustc/traits/specialize/specialization_graph.rs b/src/librustc/traits/specialize/specialization_graph.rs index b8ddf6078b..9509b6220e 100644 --- a/src/librustc/traits/specialize/specialization_graph.rs +++ b/src/librustc/traits/specialize/specialization_graph.rs @@ -1,13 +1,13 @@ use super::OverlapError; -use crate::hir::def_id::DefId; use crate::ich::{self, StableHashingContext}; -use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use crate::traits; -use crate::ty::{self, TyCtxt, TypeFoldable}; use crate::ty::fast_reject::{self, SimplifiedType}; +use crate::ty::{self, TyCtxt, TypeFoldable}; +use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_hir::def_id::{DefId, DefIdMap}; use syntax::ast::Ident; -use crate::util::nodemap::{DefIdMap, FxHashMap}; /// A per-trait graph of impls in specialization order. At the moment, this /// graph forms a tree rooted with the trait itself, with all other nodes @@ -47,7 +47,6 @@ struct Children { // A similar division is used within `TraitDef`, but the lists there collect // together *all* the impls for a trait, and are populated prior to building // the specialization graph. - /// Impls of the trait. nonblanket_impls: FxHashMap>, @@ -64,7 +63,7 @@ pub enum FutureCompatOverlapErrorKind { #[derive(Debug)] pub struct FutureCompatOverlapError { pub error: OverlapError, - pub kind: FutureCompatOverlapErrorKind + pub kind: FutureCompatOverlapErrorKind, } /// The result of attempting to insert an impl into a group of children. @@ -121,11 +120,7 @@ impl<'tcx> Children { let mut last_lint = None; let mut replace_children = Vec::new(); - debug!( - "insert(impl_def_id={:?}, simplified_self={:?})", - impl_def_id, - simplified_self, - ); + debug!("insert(impl_def_id={:?}, simplified_self={:?})", impl_def_id, simplified_self,); let possible_siblings = match simplified_self { Some(st) => PotentialSiblings::Filtered(self.filtered(st)), @@ -135,9 +130,7 @@ impl<'tcx> Children { for possible_sibling in possible_siblings { debug!( "insert: impl_def_id={:?}, simplified_self={:?}, possible_sibling={:?}", - impl_def_id, - simplified_self, - possible_sibling, + impl_def_id, simplified_self, possible_sibling, ); let overlap_error = |overlap: traits::coherence::OverlapResult<'_>| { @@ -170,11 +163,11 @@ impl<'tcx> Children { tcx.impls_are_allowed_to_overlap(impl_def_id, possible_sibling) { match overlap_kind { - ty::ImplOverlapKind::Permitted => {} + ty::ImplOverlapKind::Permitted { marker: _ } => {} ty::ImplOverlapKind::Issue33140 => { last_lint = Some(FutureCompatOverlapError { error: overlap_error(overlap), - kind: FutureCompatOverlapErrorKind::Issue33140 + kind: FutureCompatOverlapErrorKind::Issue33140, }); } } @@ -185,30 +178,28 @@ impl<'tcx> Children { let le = tcx.specializes((impl_def_id, possible_sibling)); let ge = tcx.specializes((possible_sibling, impl_def_id)); - if le == ge { - Err(overlap_error(overlap)) - } else { - Ok((le, ge)) - } + if le == ge { Err(overlap_error(overlap)) } else { Ok((le, ge)) } }, || Ok((false, false)), )?; if le && !ge { - debug!("descending as child of TraitRef {:?}", - tcx.impl_trait_ref(possible_sibling).unwrap()); + debug!( + "descending as child of TraitRef {:?}", + tcx.impl_trait_ref(possible_sibling).unwrap() + ); // The impl specializes `possible_sibling`. return Ok(Inserted::ShouldRecurseOn(possible_sibling)); } else if ge && !le { - debug!("placing as parent of TraitRef {:?}", - tcx.impl_trait_ref(possible_sibling).unwrap()); + debug!( + "placing as parent of TraitRef {:?}", + tcx.impl_trait_ref(possible_sibling).unwrap() + ); replace_children.push(possible_sibling); } else { - if let None = tcx.impls_are_allowed_to_overlap( - impl_def_id, possible_sibling) - { + if let None = tcx.impls_are_allowed_to_overlap(impl_def_id, possible_sibling) { // do future-compat checks for overlap. Have issue #33140 // errors overwrite issue #43355 errors when both are present. @@ -220,7 +211,7 @@ impl<'tcx> Children { |overlap| { last_lint = Some(FutureCompatOverlapError { error: overlap_error(overlap), - kind: FutureCompatOverlapErrorKind::Issue43355 + kind: FutureCompatOverlapErrorKind::Issue43355, }); }, || (), @@ -254,33 +245,32 @@ impl<'tcx> Children { // A custom iterator used by Children::insert enum PotentialSiblings - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { Unfiltered(I), - Filtered(J) + Filtered(J), } impl Iterator for PotentialSiblings - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { type Item = DefId; fn next(&mut self) -> Option { match *self { PotentialSiblings::Unfiltered(ref mut iter) => iter.next(), - PotentialSiblings::Filtered(ref mut iter) => iter.next() + PotentialSiblings::Filtered(ref mut iter) => iter.next(), } } } impl<'tcx> Graph { pub fn new() -> Graph { - Graph { - parent: Default::default(), - children: Default::default(), - } + Graph { parent: Default::default(), children: Default::default() } } /// Insert a local impl into the specialization graph. If an existing impl @@ -296,21 +286,24 @@ impl<'tcx> Graph { let trait_ref = tcx.impl_trait_ref(impl_def_id).unwrap(); let trait_def_id = trait_ref.def_id; - debug!("insert({:?}): inserting TraitRef {:?} into specialization graph", - impl_def_id, trait_ref); + debug!( + "insert({:?}): inserting TraitRef {:?} into specialization graph", + impl_def_id, trait_ref + ); // If the reference itself contains an earlier error (e.g., due to a // resolution failure), then we just insert the impl at the top level of // the graph and claim that there's no overlap (in order to suppress // bogus errors). if trait_ref.references_error() { - debug!("insert: inserting dummy node for erroneous TraitRef {:?}, \ + debug!( + "insert: inserting dummy node for erroneous TraitRef {:?}, \ impl_def_id={:?}, trait_def_id={:?}", - trait_ref, impl_def_id, trait_def_id); + trait_ref, impl_def_id, trait_def_id + ); self.parent.insert(impl_def_id, trait_def_id); - self.children.entry(trait_def_id).or_default() - .insert_blindly(tcx, impl_def_id); + self.children.entry(trait_def_id).or_default().insert_blindly(tcx, impl_def_id); return Ok(None); } @@ -322,8 +315,8 @@ impl<'tcx> Graph { loop { use self::Inserted::*; - let insert_result = self.children.entry(parent).or_default() - .insert(tcx, impl_def_id, simplified)?; + let insert_result = + self.children.entry(parent).or_default().insert(tcx, impl_def_id, simplified)?; match insert_result { BecameNewSibling(opt_lint) => { @@ -347,9 +340,7 @@ impl<'tcx> Graph { // Adjust P's list of children: remove G and then add N. { - let siblings = self.children - .get_mut(&parent) - .unwrap(); + let siblings = self.children.get_mut(&parent).unwrap(); for &grand_child_to_be in &grand_children_to_be { siblings.remove_existing(tcx, grand_child_to_be); } @@ -364,7 +355,9 @@ impl<'tcx> Graph { // Add G as N's child. for &grand_child_to_be in &grand_children_to_be { - self.children.entry(impl_def_id).or_default() + self.children + .entry(impl_def_id) + .or_default() .insert_blindly(tcx, grand_child_to_be); } break; @@ -382,8 +375,10 @@ impl<'tcx> Graph { /// Insert cached metadata mapping from a child impl back to its parent. pub fn record_impl_from_cstore(&mut self, tcx: TyCtxt<'tcx>, parent: DefId, child: DefId) { if self.parent.insert(child, parent).is_some() { - bug!("When recording an impl from the crate store, information about its parent \ - was already present."); + bug!( + "When recording an impl from the crate store, information about its parent \ + was already present." + ); } self.children.entry(parent).or_default().insert_blindly(tcx, child); @@ -431,8 +426,8 @@ impl<'tcx> Node { ) -> Option { use crate::ty::AssocKind::*; - tcx.associated_items(self.def_id()) - .find(move |impl_item| match (trait_item_kind, impl_item.kind) { + tcx.associated_items(self.def_id()).find(move |impl_item| { + match (trait_item_kind, impl_item.kind) { | (Const, Const) | (Method, Method) | (Type, Type) @@ -444,7 +439,8 @@ impl<'tcx> Node { | (Type, _) | (OpaqueTy, _) => false, - }) + } + }) } pub fn def_id(&self) -> DefId { @@ -486,10 +482,7 @@ pub struct NodeItem { impl NodeItem { pub fn map U>(self, f: F) -> NodeItem { - NodeItem { - node: self.node, - item: f(self.item), - } + NodeItem { node: self.node, item: f(self.item) } } } @@ -527,10 +520,7 @@ pub fn ancestors( impl<'a> HashStable> for Children { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let Children { - ref nonblanket_impls, - ref blanket_impls, - } = *self; + let Children { ref nonblanket_impls, ref blanket_impls } = *self; ich::hash_stable_trait_impls(hcx, hasher, blanket_impls, nonblanket_impls); } diff --git a/src/librustc/traits/structural_impls.rs b/src/librustc/traits/structural_impls.rs index 8c300da11f..58204a460d 100644 --- a/src/librustc/traits/structural_impls.rs +++ b/src/librustc/traits/structural_impls.rs @@ -1,14 +1,14 @@ -use chalk_engine; -use smallvec::SmallVec; use crate::traits; use crate::traits::project::Normalized; use crate::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor}; use crate::ty::{self, Lift, Ty, TyCtxt}; -use syntax::symbol::Symbol; +use chalk_engine; +use rustc_span::symbol::Symbol; +use smallvec::SmallVec; +use std::collections::{BTreeMap, BTreeSet}; use std::fmt; use std::rc::Rc; -use std::collections::{BTreeSet, BTreeMap}; // Structural impls for the structs in `traits`. @@ -27,11 +27,7 @@ impl<'tcx, O: fmt::Debug> fmt::Debug for traits::Obligation<'tcx, O> { self.predicate, self.cause, self.param_env, self.recursion_depth ) } else { - write!( - f, - "Obligation(predicate={:?}, depth={})", - self.predicate, self.recursion_depth - ) + write!(f, "Obligation(predicate={:?}, depth={})", self.predicate, self.recursion_depth) } } } @@ -118,11 +114,7 @@ impl<'tcx, N: fmt::Debug> fmt::Debug for traits::VtableObjectData<'tcx, N> { impl<'tcx, N: fmt::Debug> fmt::Debug for traits::VtableFnPointerData<'tcx, N> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "VtableFnPointerData(fn_ty={:?}, nested={:?})", - self.fn_ty, self.nested - ) + write!(f, "VtableFnPointerData(fn_ty={:?}, nested={:?})", self.fn_ty, self.nested) } } @@ -169,7 +161,7 @@ impl<'tcx> fmt::Display for traits::WhereClause<'tcx> { // FIXME(eddyb) implement a custom `PrettyPrinter`, or move this to `ty::print`. fn write_region_name<'tcx>( r: ty::Region<'tcx>, - fmt: &mut fmt::Formatter<'_> + fmt: &mut fmt::Formatter<'_>, ) -> fmt::Result { match r { ty::ReLateBound(index, br) => match br { @@ -182,7 +174,7 @@ impl<'tcx> fmt::Display for traits::WhereClause<'tcx> { } } _ => write!(fmt, "'_"), - } + }, _ => write!(fmt, "{}", r), } @@ -235,12 +227,9 @@ impl<'tcx> fmt::Display for traits::DomainGoal<'tcx> { Holds(wc) => write!(fmt, "{}", wc), WellFormed(wf) => write!(fmt, "{}", wf), FromEnv(from_env) => write!(fmt, "{}", from_env), - Normalize(projection) => write!( - fmt, - "Normalize({} -> {})", - projection.projection_ty, - projection.ty - ), + Normalize(projection) => { + write!(fmt, "Normalize({} -> {})", projection.projection_ty, projection.ty) + } } } } @@ -318,10 +307,10 @@ impl<'tcx> TypeVisitor<'tcx> for BoundNamesCollector { bound_ty.var.as_u32(), match bound_ty.kind { ty::BoundTyKind::Param(name) => name, - ty::BoundTyKind::Anon => - Symbol::intern(&format!("^{}", bound_ty.var.as_u32()), - ), - } + ty::BoundTyKind::Anon => { + Symbol::intern(&format!("^{}", bound_ty.var.as_u32())) + } + }, ); } @@ -333,19 +322,17 @@ impl<'tcx> TypeVisitor<'tcx> for BoundNamesCollector { fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool { match r { - ty::ReLateBound(index, br) if *index == self.binder_index => { - match br { - ty::BoundRegion::BrNamed(_, name) => { - self.regions.insert(*name); - } - - ty::BoundRegion::BrAnon(var) => { - self.regions.insert(Symbol::intern(&format!("'^{}", var))); - } + ty::ReLateBound(index, br) if *index == self.binder_index => match br { + ty::BoundRegion::BrNamed(_, name) => { + self.regions.insert(*name); + } - _ => (), + ty::BoundRegion::BrAnon(var) => { + self.regions.insert(Symbol::intern(&format!("'^{}", var))); } - } + + _ => (), + }, _ => (), }; @@ -450,10 +437,9 @@ impl<'a, 'tcx> Lift<'tcx> for traits::SelectionError<'a> { match *self { super::Unimplemented => Some(super::Unimplemented), super::OutputTypeParameterMismatch(a, b, ref err) => { - tcx.lift(&(a, b)).and_then(|(a, b)| - tcx.lift(err) - .map(|err| super::OutputTypeParameterMismatch(a, b, err)) - ) + tcx.lift(&(a, b)).and_then(|(a, b)| { + tcx.lift(err).map(|err| super::OutputTypeParameterMismatch(a, b, err)) + }) } super::TraitNotObjectSafe(def_id) => Some(super::TraitNotObjectSafe(def_id)), super::ConstEvalFailure(err) => Some(super::ConstEvalFailure(err)), @@ -476,15 +462,13 @@ impl<'a, 'tcx> Lift<'tcx> for traits::ObligationCauseCode<'a> { super::ReferenceOutlivesReferent(ty) => { tcx.lift(&ty).map(super::ReferenceOutlivesReferent) } - super::ObjectTypeBound(ty, r) => tcx.lift(&ty).and_then(|ty| - tcx.lift(&r) - .and_then(|r| Some(super::ObjectTypeBound(ty, r))) - ), + super::ObjectTypeBound(ty, r) => tcx + .lift(&ty) + .and_then(|ty| tcx.lift(&r).and_then(|r| Some(super::ObjectTypeBound(ty, r)))), super::ObjectCastObligation(ty) => tcx.lift(&ty).map(super::ObjectCastObligation), - super::Coercion { source, target } => Some(super::Coercion { - source: tcx.lift(&source)?, - target: tcx.lift(&target)?, - }), + super::Coercion { source, target } => { + Some(super::Coercion { source: tcx.lift(&source)?, target: tcx.lift(&target)? }) + } super::AssignmentLhsSized => Some(super::AssignmentLhsSized), super::TupleInitializerSized => Some(super::TupleInitializerSized), super::StructInitializerSized => Some(super::StructInitializerSized), @@ -514,33 +498,34 @@ impl<'a, 'tcx> Lift<'tcx> for traits::ObligationCauseCode<'a> { impl_item_def_id, trait_item_def_id, }), + super::CompareImplTypeObligation { item_name, impl_item_def_id, trait_item_def_id } => { + Some(super::CompareImplTypeObligation { + item_name, + impl_item_def_id, + trait_item_def_id, + }) + } super::ExprAssignable => Some(super::ExprAssignable), super::MatchExpressionArm(box super::MatchExpressionArmCause { arm_span, source, ref prior_arms, last_ty, - discrim_hir_id, - }) => { - tcx.lift(&last_ty).map(|last_ty| { - super::MatchExpressionArm(box super::MatchExpressionArmCause { - arm_span, - source, - prior_arms: prior_arms.clone(), - last_ty, - discrim_hir_id, - }) + scrut_hir_id, + }) => tcx.lift(&last_ty).map(|last_ty| { + super::MatchExpressionArm(box super::MatchExpressionArmCause { + arm_span, + source, + prior_arms: prior_arms.clone(), + last_ty, + scrut_hir_id, }) - } - super::MatchExpressionArmPattern { span, ty } => { - tcx.lift(&ty).map(|ty| super::MatchExpressionArmPattern { span, ty }) + }), + super::Pattern { span, root_ty, origin_expr } => { + tcx.lift(&root_ty).map(|root_ty| super::Pattern { span, root_ty, origin_expr }) } super::IfExpression(box super::IfExpressionCause { then, outer, semicolon }) => { - Some(super::IfExpression(box super::IfExpressionCause { - then, - outer, - semicolon, - })) + Some(super::IfExpression(box super::IfExpressionCause { then, outer, semicolon })) } super::IfExpressionWithNoElse => Some(super::IfExpressionWithNoElse), super::MainFunctionType => Some(super::MainFunctionType), @@ -557,13 +542,12 @@ impl<'a, 'tcx> Lift<'tcx> for traits::ObligationCauseCode<'a> { impl<'a, 'tcx> Lift<'tcx> for traits::DerivedObligationCause<'a> { type Lifted = traits::DerivedObligationCause<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.parent_trait_ref).and_then(|trait_ref| - tcx.lift(&*self.parent_code) - .map(|code| traits::DerivedObligationCause { - parent_trait_ref: trait_ref, - parent_code: Rc::new(code), - }) - ) + tcx.lift(&self.parent_trait_ref).and_then(|trait_ref| { + tcx.lift(&*self.parent_code).map(|code| traits::DerivedObligationCause { + parent_trait_ref: trait_ref, + parent_code: Rc::new(code), + }) + }) } } @@ -583,44 +567,36 @@ impl<'a, 'tcx> Lift<'tcx> for traits::Vtable<'a, ()> { type Lifted = traits::Vtable<'tcx, ()>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { match self.clone() { - traits::VtableImpl(traits::VtableImplData { - impl_def_id, - substs, - nested, - }) => tcx.lift(&substs).map(|substs| - traits::VtableImpl(traits::VtableImplData { - impl_def_id, - substs, - nested, + traits::VtableImpl(traits::VtableImplData { impl_def_id, substs, nested }) => { + tcx.lift(&substs).map(|substs| { + traits::VtableImpl(traits::VtableImplData { impl_def_id, substs, nested }) }) - ), + } traits::VtableAutoImpl(t) => Some(traits::VtableAutoImpl(t)), traits::VtableGenerator(traits::VtableGeneratorData { generator_def_id, substs, nested, - }) => tcx.lift(&substs).map(|substs| + }) => tcx.lift(&substs).map(|substs| { traits::VtableGenerator(traits::VtableGeneratorData { generator_def_id: generator_def_id, substs: substs, nested: nested, }) - ), - traits::VtableClosure(traits::VtableClosureData { - closure_def_id, - substs, - nested, - }) => tcx.lift(&substs).map(|substs| - traits::VtableClosure(traits::VtableClosureData { - closure_def_id, - substs, - nested, + }), + traits::VtableClosure(traits::VtableClosureData { closure_def_id, substs, nested }) => { + tcx.lift(&substs).map(|substs| { + traits::VtableClosure(traits::VtableClosureData { + closure_def_id, + substs, + nested, + }) }) - ), + } traits::VtableFnPointer(traits::VtableFnPointerData { fn_ty, nested }) => { - tcx.lift(&fn_ty).map(|fn_ty| + tcx.lift(&fn_ty).map(|fn_ty| { traits::VtableFnPointer(traits::VtableFnPointerData { fn_ty, nested }) - ) + }) } traits::VtableParam(n) => Some(traits::VtableParam(n)), traits::VtableBuiltin(n) => Some(traits::VtableBuiltin(n)), @@ -628,24 +604,24 @@ impl<'a, 'tcx> Lift<'tcx> for traits::Vtable<'a, ()> { upcast_trait_ref, vtable_base, nested, - }) => tcx.lift(&upcast_trait_ref).map(|trait_ref| + }) => tcx.lift(&upcast_trait_ref).map(|trait_ref| { traits::VtableObject(traits::VtableObjectData { upcast_trait_ref: trait_ref, vtable_base, nested, }) - ), + }), traits::VtableTraitAlias(traits::VtableTraitAliasData { alias_def_id, substs, nested, - }) => tcx.lift(&substs).map(|substs| + }) => tcx.lift(&substs).map(|substs| { traits::VtableTraitAlias(traits::VtableTraitAliasData { alias_def_id, substs, nested, }) - ), + }), } } } @@ -653,11 +629,7 @@ impl<'a, 'tcx> Lift<'tcx> for traits::Vtable<'a, ()> { impl<'a, 'tcx> Lift<'tcx> for traits::Environment<'a> { type Lifted = traits::Environment<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.clauses).map(|clauses| { - traits::Environment { - clauses, - } - }) + tcx.lift(&self.clauses).map(|clauses| traits::Environment { clauses }) } } @@ -665,12 +637,7 @@ impl<'a, 'tcx, G: Lift<'tcx>> Lift<'tcx> for traits::InEnvironment<'a, G> { type Lifted = traits::InEnvironment<'tcx, G::Lifted>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { tcx.lift(&self.environment).and_then(|environment| { - tcx.lift(&self.goal).map(|goal| { - traits::InEnvironment { - environment, - goal, - } - }) + tcx.lift(&self.goal).map(|goal| traits::InEnvironment { environment, goal }) }) } } @@ -735,9 +702,7 @@ CloneTypeFoldableAndLiftImpls! { impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List> { fn super_fold_with>(&self, folder: &mut F) -> Self { - let v = self.iter() - .map(|t| t.fold_with(folder)) - .collect::>(); + let v = self.iter().map(|t| t.fold_with(folder)).collect::>(); folder.tcx().intern_goals(&v) } @@ -763,9 +728,7 @@ CloneTypeFoldableAndLiftImpls! { impl<'tcx> TypeFoldable<'tcx> for traits::Clauses<'tcx> { fn super_fold_with>(&self, folder: &mut F) -> Self { - let v = self.iter() - .map(|t| t.fold_with(folder)) - .collect::>(); + let v = self.iter().map(|t| t.fold_with(folder)).collect::>(); folder.tcx().intern_clauses(&v) } @@ -781,17 +744,11 @@ where C::RegionConstraint: Clone, { fn super_fold_with>(&self, folder: &mut F) -> Self { - ::fold_ex_clause_with( - self, - folder, - ) + ::fold_ex_clause_with(self, folder) } fn super_visit_with>(&self, visitor: &mut V) -> bool { - ::visit_ex_clause_with( - self, - visitor, - ) + ::visit_ex_clause_with(self, visitor) } } diff --git a/src/librustc/ty/structural_match.rs b/src/librustc/traits/structural_match.rs similarity index 92% rename from src/librustc/ty/structural_match.rs rename to src/librustc/traits/structural_match.rs index cdf5734f5a..b2c3c23b4e 100644 --- a/src/librustc/ty/structural_match.rs +++ b/src/librustc/traits/structural_match.rs @@ -1,14 +1,12 @@ -use crate::hir; +use crate::ty::fold::{TypeFoldable, TypeVisitor}; +use crate::ty::{self, AdtDef, Ty, TyCtxt}; + use rustc::infer::InferCtxt; -use rustc::traits::{self, ConstPatternStructural, TraitEngine}; use rustc::traits::ObligationCause; - -use rustc_data_structures::fx::{FxHashSet}; - -use syntax_pos::Span; - -use crate::ty::{self, AdtDef, Ty, TyCtxt}; -use crate::ty::fold::{TypeFoldable, TypeVisitor}; +use rustc::traits::{self, ConstPatternStructural, TraitEngine}; +use rustc_data_structures::fx::FxHashSet; +use rustc_hir as hir; +use rustc_span::Span; #[derive(Debug)] pub enum NonStructuralMatchTy<'tcx> { @@ -62,24 +60,34 @@ pub fn search_for_structural_match_violation<'tcx>( /// /// Note that this does *not* recursively check if the substructure of `adt_ty` /// implements the traits. -pub fn type_marked_structural(id: hir::HirId, - span: Span, - infcx: &InferCtxt<'_, 'tcx>, - adt_ty: Ty<'tcx>) - -> bool -{ +pub fn type_marked_structural( + id: hir::HirId, + span: Span, + infcx: &InferCtxt<'_, 'tcx>, + adt_ty: Ty<'tcx>, +) -> bool { let mut fulfillment_cx = traits::FulfillmentContext::new(); let cause = ObligationCause::new(span, id, ConstPatternStructural); // require `#[derive(PartialEq)]` let structural_peq_def_id = infcx.tcx.lang_items().structural_peq_trait().unwrap(); fulfillment_cx.register_bound( - infcx, ty::ParamEnv::empty(), adt_ty, structural_peq_def_id, cause); + infcx, + ty::ParamEnv::empty(), + adt_ty, + structural_peq_def_id, + cause, + ); // for now, require `#[derive(Eq)]`. (Doing so is a hack to work around // the type `for<'a> fn(&'a ())` failing to implement `Eq` itself.) let cause = ObligationCause::new(span, id, ConstPatternStructural); let structural_teq_def_id = infcx.tcx.lang_items().structural_teq_trait().unwrap(); fulfillment_cx.register_bound( - infcx, ty::ParamEnv::empty(), adt_ty, structural_teq_def_id, cause); + infcx, + ty::ParamEnv::empty(), + adt_ty, + structural_teq_def_id, + cause, + ); // We deliberately skip *reporting* fulfillment errors (via // `report_fulfillment_errors`), for two reasons: @@ -156,9 +164,9 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for Search<'a, 'tcx> { // (But still tell caller to continue search.) return false; } - ty::Array(_, n) if { - n.try_eval_usize(self.tcx(), ty::ParamEnv::reveal_all()) == Some(0) - } => { + ty::Array(_, n) + if { n.try_eval_usize(self.tcx(), ty::ParamEnv::reveal_all()) == Some(0) } => + { // rust-lang/rust#62336: ignore type of contents // for empty array. return false; diff --git a/src/librustc/traits/util.rs b/src/librustc/traits/util.rs index c15915a9d5..ae1a5e3efa 100644 --- a/src/librustc/traits/util.rs +++ b/src/librustc/traits/util.rs @@ -1,44 +1,49 @@ -use errors::DiagnosticBuilder; +use rustc_errors::DiagnosticBuilder; +use rustc_span::Span; use smallvec::SmallVec; -use syntax_pos::Span; -use crate::hir; -use crate::hir::def_id::DefId; -use crate::ty::{self, Ty, TyCtxt, ToPredicate, ToPolyTraitRef}; use crate::ty::outlives::Component; use crate::ty::subst::{GenericArg, Subst, SubstsRef}; -use crate::util::nodemap::FxHashSet; +use crate::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, WithConstness}; +use rustc_data_structures::fx::FxHashSet; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; -use super::{Obligation, ObligationCause, PredicateObligation, SelectionContext, Normalized}; +use super::{Normalized, Obligation, ObligationCause, PredicateObligation, SelectionContext}; fn anonymize_predicate<'tcx>(tcx: TyCtxt<'tcx>, pred: &ty::Predicate<'tcx>) -> ty::Predicate<'tcx> { match *pred { - ty::Predicate::Trait(ref data) => - ty::Predicate::Trait(tcx.anonymize_late_bound_regions(data)), + ty::Predicate::Trait(ref data, constness) => { + ty::Predicate::Trait(tcx.anonymize_late_bound_regions(data), constness) + } - ty::Predicate::RegionOutlives(ref data) => - ty::Predicate::RegionOutlives(tcx.anonymize_late_bound_regions(data)), + ty::Predicate::RegionOutlives(ref data) => { + ty::Predicate::RegionOutlives(tcx.anonymize_late_bound_regions(data)) + } - ty::Predicate::TypeOutlives(ref data) => - ty::Predicate::TypeOutlives(tcx.anonymize_late_bound_regions(data)), + ty::Predicate::TypeOutlives(ref data) => { + ty::Predicate::TypeOutlives(tcx.anonymize_late_bound_regions(data)) + } - ty::Predicate::Projection(ref data) => - ty::Predicate::Projection(tcx.anonymize_late_bound_regions(data)), + ty::Predicate::Projection(ref data) => { + ty::Predicate::Projection(tcx.anonymize_late_bound_regions(data)) + } - ty::Predicate::WellFormed(data) => - ty::Predicate::WellFormed(data), + ty::Predicate::WellFormed(data) => ty::Predicate::WellFormed(data), - ty::Predicate::ObjectSafe(data) => - ty::Predicate::ObjectSafe(data), + ty::Predicate::ObjectSafe(data) => ty::Predicate::ObjectSafe(data), - ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => - ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind), + ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => { + ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) + } - ty::Predicate::Subtype(ref data) => - ty::Predicate::Subtype(tcx.anonymize_late_bound_regions(data)), + ty::Predicate::Subtype(ref data) => { + ty::Predicate::Subtype(tcx.anonymize_late_bound_regions(data)) + } - ty::Predicate::ConstEvaluatable(def_id, substs) => - ty::Predicate::ConstEvaluatable(def_id, substs), + ty::Predicate::ConstEvaluatable(def_id, substs) => { + ty::Predicate::ConstEvaluatable(def_id, substs) + } } } @@ -94,14 +99,14 @@ pub fn elaborate_trait_ref<'tcx>( tcx: TyCtxt<'tcx>, trait_ref: ty::PolyTraitRef<'tcx>, ) -> Elaborator<'tcx> { - elaborate_predicates(tcx, vec![trait_ref.to_predicate()]) + elaborate_predicates(tcx, vec![trait_ref.without_const().to_predicate()]) } pub fn elaborate_trait_refs<'tcx>( tcx: TyCtxt<'tcx>, trait_refs: impl Iterator>, ) -> Elaborator<'tcx> { - let predicates = trait_refs.map(|trait_ref| trait_ref.to_predicate()).collect(); + let predicates = trait_refs.map(|trait_ref| trait_ref.without_const().to_predicate()).collect(); elaborate_predicates(tcx, predicates) } @@ -122,15 +127,15 @@ impl Elaborator<'tcx> { fn elaborate(&mut self, predicate: &ty::Predicate<'tcx>) { let tcx = self.visited.tcx; match *predicate { - ty::Predicate::Trait(ref data) => { + ty::Predicate::Trait(ref data, _) => { // Get predicates declared on the trait. let predicates = tcx.super_predicates_of(data.def_id()); - let predicates = predicates.predicates + let predicates = predicates + .predicates .iter() .map(|(pred, _)| pred.subst_supertrait(tcx, &data.to_poly_trait_ref())); - debug!("super_predicates: data={:?} predicates={:?}", - data, predicates.clone()); + debug!("super_predicates: data={:?} predicates={:?}", data, predicates.clone()); // Only keep those bounds that we haven't already seen. // This is necessary to prevent infinite recursion in some @@ -194,32 +199,33 @@ impl Elaborator<'tcx> { components .into_iter() .filter_map(|component| match component { - Component::Region(r) => if r.is_late_bound() { - None - } else { - Some(ty::Predicate::RegionOutlives( - ty::Binder::dummy(ty::OutlivesPredicate(r, r_min)))) + Component::Region(r) => { + if r.is_late_bound() { + None + } else { + Some(ty::Predicate::RegionOutlives(ty::Binder::dummy( + ty::OutlivesPredicate(r, r_min), + ))) + } } Component::Param(p) => { let ty = tcx.mk_ty_param(p.index, p.name); - Some(ty::Predicate::TypeOutlives( - ty::Binder::dummy(ty::OutlivesPredicate(ty, r_min)))) + Some(ty::Predicate::TypeOutlives(ty::Binder::dummy( + ty::OutlivesPredicate(ty, r_min), + ))) } - Component::UnresolvedInferenceVariable(_) => { - None - } + Component::UnresolvedInferenceVariable(_) => None, - Component::Projection(_) | - Component::EscapingProjection(_) => { + Component::Projection(_) | Component::EscapingProjection(_) => { // We can probably do more here. This // corresponds to a case like `>::U: 'b`. None } }) - .filter(|p| visited.insert(p)) + .filter(|p| visited.insert(p)), ); } } @@ -289,17 +295,16 @@ pub struct TraitAliasExpansionInfo<'tcx> { impl<'tcx> TraitAliasExpansionInfo<'tcx> { fn new(trait_ref: ty::PolyTraitRef<'tcx>, span: Span) -> Self { - Self { - path: smallvec![(trait_ref, span)] - } + Self { path: smallvec![(trait_ref, span)] } } /// Adds diagnostic labels to `diag` for the expansion path of a trait through all intermediate /// trait aliases. - pub fn label_with_exp_info(&self, + pub fn label_with_exp_info( + &self, diag: &mut DiagnosticBuilder<'_>, top_label: &str, - use_desc: &str + use_desc: &str, ) { diag.span_label(self.top().1, top_label); if self.path.len() > 1 { @@ -307,8 +312,10 @@ impl<'tcx> TraitAliasExpansionInfo<'tcx> { diag.span_label(*sp, format!("referenced here ({})", use_desc)); } } - diag.span_label(self.bottom().1, - format!("trait alias used in trait object type ({})", use_desc)); + diag.span_label( + self.bottom().1, + format!("trait alias used in trait object type ({})", use_desc), + ); } pub fn trait_ref(&self) -> &ty::PolyTraitRef<'tcx> { @@ -327,9 +334,7 @@ impl<'tcx> TraitAliasExpansionInfo<'tcx> { let mut path = self.path.clone(); path.push((trait_ref, span)); - Self { - path - } + Self { path } } } @@ -353,7 +358,7 @@ impl<'tcx> TraitAliasExpander<'tcx> { fn expand(&mut self, item: &TraitAliasExpansionInfo<'tcx>) -> bool { let tcx = self.tcx; let trait_ref = item.trait_ref(); - let pred = trait_ref.to_predicate(); + let pred = trait_ref.without_const().to_predicate(); debug!("expand_trait_aliases: trait_ref={:?}", trait_ref); @@ -365,22 +370,20 @@ impl<'tcx> TraitAliasExpander<'tcx> { // Don't recurse if this trait alias is already on the stack for the DFS search. let anon_pred = anonymize_predicate(tcx, &pred); - if item.path.iter().rev().skip(1) - .any(|(tr, _)| anonymize_predicate(tcx, &tr.to_predicate()) == anon_pred) { + if item.path.iter().rev().skip(1).any(|(tr, _)| { + anonymize_predicate(tcx, &tr.without_const().to_predicate()) == anon_pred + }) { return false; } // Get components of trait alias. let predicates = tcx.super_predicates_of(trait_ref.def_id()); - let items = predicates.predicates - .iter() - .rev() - .filter_map(|(pred, span)| { - pred.subst_supertrait(tcx, &trait_ref) - .to_opt_poly_trait_ref() - .map(|trait_ref| item.clone_and_push(trait_ref, *span)) - }); + let items = predicates.predicates.iter().rev().filter_map(|(pred, span)| { + pred.subst_supertrait(tcx, &trait_ref) + .to_opt_poly_trait_ref() + .map(|trait_ref| item.clone_and_push(trait_ref, *span)) + }); debug!("expand_trait_aliases: items={:?}", items.clone()); self.stack.extend(items); @@ -432,11 +435,13 @@ impl Iterator for SupertraitDefIds<'tcx> { let predicates = self.tcx.super_predicates_of(def_id); let visited = &mut self.visited; self.stack.extend( - predicates.predicates - .iter() - .filter_map(|(pred, _)| pred.to_opt_poly_trait_ref()) - .map(|trait_ref| trait_ref.def_id()) - .filter(|&super_def_id| visited.insert(super_def_id))); + predicates + .predicates + .iter() + .filter_map(|(pred, _)| pred.to_opt_poly_trait_ref()) + .map(|trait_ref| trait_ref.def_id()) + .filter(|&super_def_id| visited.insert(super_def_id)), + ); Some(def_id) } } @@ -448,7 +453,7 @@ impl Iterator for SupertraitDefIds<'tcx> { /// A filter around an iterator of predicates that makes it yield up /// just trait references. pub struct FilterToTraits { - base_iterator: I + base_iterator: I, } impl FilterToTraits { @@ -462,7 +467,7 @@ impl<'tcx, I: Iterator>> Iterator for FilterToTraits< fn next(&mut self) -> Option> { while let Some(pred) = self.base_iterator.next() { - if let ty::Predicate::Trait(data) = pred { + if let ty::Predicate::Trait(data, _) = pred { return Some(data.to_poly_trait_ref()); } } @@ -488,10 +493,8 @@ pub fn impl_trait_ref_and_oblig<'a, 'tcx>( impl_def_id: DefId, impl_substs: SubstsRef<'tcx>, ) -> (ty::TraitRef<'tcx>, Vec>) { - let impl_trait_ref = - selcx.tcx().impl_trait_ref(impl_def_id).unwrap(); - let impl_trait_ref = - impl_trait_ref.subst(selcx.tcx(), impl_substs); + let impl_trait_ref = selcx.tcx().impl_trait_ref(impl_def_id).unwrap(); + let impl_trait_ref = impl_trait_ref.subst(selcx.tcx(), impl_substs); let Normalized { value: impl_trait_ref, obligations: normalization_obligations1 } = super::normalize(selcx, param_env, ObligationCause::dummy(), &impl_trait_ref); @@ -502,8 +505,8 @@ pub fn impl_trait_ref_and_oblig<'a, 'tcx>( let impl_obligations = predicates_for_generics(ObligationCause::dummy(), 0, param_env, &predicates); - let impl_obligations: Vec<_> = - impl_obligations.into_iter() + let impl_obligations: Vec<_> = impl_obligations + .into_iter() .chain(normalization_obligations1) .chain(normalization_obligations2) .collect(); @@ -520,155 +523,150 @@ pub fn predicates_for_generics<'tcx>( ) -> Vec> { debug!("predicates_for_generics(generic_bounds={:?})", generic_bounds); - generic_bounds.predicates.iter().map(|predicate| Obligation { - cause: cause.clone(), - recursion_depth, - param_env, - predicate: predicate.clone(), - }).collect() + generic_bounds + .predicates + .iter() + .map(|&predicate| Obligation { + cause: cause.clone(), + recursion_depth, + param_env, + predicate, + }) + .collect() } pub fn predicate_for_trait_ref<'tcx>( cause: ObligationCause<'tcx>, param_env: ty::ParamEnv<'tcx>, trait_ref: ty::TraitRef<'tcx>, - recursion_depth: usize) - -> PredicateObligation<'tcx> -{ + recursion_depth: usize, +) -> PredicateObligation<'tcx> { Obligation { cause, param_env, recursion_depth, - predicate: trait_ref.to_predicate(), + predicate: trait_ref.without_const().to_predicate(), } } -impl<'tcx> TyCtxt<'tcx> { - pub fn predicate_for_trait_def(self, - param_env: ty::ParamEnv<'tcx>, - cause: ObligationCause<'tcx>, - trait_def_id: DefId, - recursion_depth: usize, - self_ty: Ty<'tcx>, - params: &[GenericArg<'tcx>]) - -> PredicateObligation<'tcx> - { - let trait_ref = ty::TraitRef { - def_id: trait_def_id, - substs: self.mk_substs_trait(self_ty, params) - }; - predicate_for_trait_ref(cause, param_env, trait_ref, recursion_depth) - } - - /// Casts a trait reference into a reference to one of its super - /// traits; returns `None` if `target_trait_def_id` is not a - /// supertrait. - pub fn upcast_choices(self, - source_trait_ref: ty::PolyTraitRef<'tcx>, - target_trait_def_id: DefId) - -> Vec> - { - if source_trait_ref.def_id() == target_trait_def_id { - return vec![source_trait_ref]; // Shortcut the most common case. - } +pub fn predicate_for_trait_def( + tcx: TyCtxt<'tcx>, + param_env: ty::ParamEnv<'tcx>, + cause: ObligationCause<'tcx>, + trait_def_id: DefId, + recursion_depth: usize, + self_ty: Ty<'tcx>, + params: &[GenericArg<'tcx>], +) -> PredicateObligation<'tcx> { + let trait_ref = + ty::TraitRef { def_id: trait_def_id, substs: tcx.mk_substs_trait(self_ty, params) }; + predicate_for_trait_ref(cause, param_env, trait_ref, recursion_depth) +} - supertraits(self, source_trait_ref) - .filter(|r| r.def_id() == target_trait_def_id) - .collect() +/// Casts a trait reference into a reference to one of its super +/// traits; returns `None` if `target_trait_def_id` is not a +/// supertrait. +pub fn upcast_choices( + tcx: TyCtxt<'tcx>, + source_trait_ref: ty::PolyTraitRef<'tcx>, + target_trait_def_id: DefId, +) -> Vec> { + if source_trait_ref.def_id() == target_trait_def_id { + return vec![source_trait_ref]; // Shortcut the most common case. } - /// Given a trait `trait_ref`, returns the number of vtable entries - /// that come from `trait_ref`, excluding its supertraits. Used in - /// computing the vtable base for an upcast trait of a trait object. - pub fn count_own_vtable_entries(self, trait_ref: ty::PolyTraitRef<'tcx>) -> usize { - let mut entries = 0; - // Count number of methods and add them to the total offset. - // Skip over associated types and constants. - for trait_item in self.associated_items(trait_ref.def_id()) { - if trait_item.kind == ty::AssocKind::Method { - entries += 1; - } + supertraits(tcx, source_trait_ref).filter(|r| r.def_id() == target_trait_def_id).collect() +} + +/// Given a trait `trait_ref`, returns the number of vtable entries +/// that come from `trait_ref`, excluding its supertraits. Used in +/// computing the vtable base for an upcast trait of a trait object. +pub fn count_own_vtable_entries(tcx: TyCtxt<'tcx>, trait_ref: ty::PolyTraitRef<'tcx>) -> usize { + let mut entries = 0; + // Count number of methods and add them to the total offset. + // Skip over associated types and constants. + for trait_item in tcx.associated_items(trait_ref.def_id()) { + if trait_item.kind == ty::AssocKind::Method { + entries += 1; } - entries } + entries +} - /// Given an upcast trait object described by `object`, returns the - /// index of the method `method_def_id` (which should be part of - /// `object.upcast_trait_ref`) within the vtable for `object`. - pub fn get_vtable_index_of_object_method(self, - object: &super::VtableObjectData<'tcx, N>, - method_def_id: DefId) -> usize { - // Count number of methods preceding the one we are selecting and - // add them to the total offset. - // Skip over associated types and constants. - let mut entries = object.vtable_base; - for trait_item in self.associated_items(object.upcast_trait_ref.def_id()) { - if trait_item.def_id == method_def_id { - // The item with the ID we were given really ought to be a method. - assert_eq!(trait_item.kind, ty::AssocKind::Method); - return entries; - } - if trait_item.kind == ty::AssocKind::Method { - entries += 1; - } +/// Given an upcast trait object described by `object`, returns the +/// index of the method `method_def_id` (which should be part of +/// `object.upcast_trait_ref`) within the vtable for `object`. +pub fn get_vtable_index_of_object_method( + tcx: TyCtxt<'tcx>, + object: &super::VtableObjectData<'tcx, N>, + method_def_id: DefId, +) -> usize { + // Count number of methods preceding the one we are selecting and + // add them to the total offset. + // Skip over associated types and constants. + let mut entries = object.vtable_base; + for trait_item in tcx.associated_items(object.upcast_trait_ref.def_id()) { + if trait_item.def_id == method_def_id { + // The item with the ID we were given really ought to be a method. + assert_eq!(trait_item.kind, ty::AssocKind::Method); + return entries; + } + if trait_item.kind == ty::AssocKind::Method { + entries += 1; } - - bug!("get_vtable_index_of_object_method: {:?} was not found", - method_def_id); } - pub fn closure_trait_ref_and_return_type(self, - fn_trait_def_id: DefId, - self_ty: Ty<'tcx>, - sig: ty::PolyFnSig<'tcx>, - tuple_arguments: TupleArgumentsFlag) - -> ty::Binder<(ty::TraitRef<'tcx>, Ty<'tcx>)> - { - let arguments_tuple = match tuple_arguments { - TupleArgumentsFlag::No => sig.skip_binder().inputs()[0], - TupleArgumentsFlag::Yes => - self.intern_tup(sig.skip_binder().inputs()), - }; - let trait_ref = ty::TraitRef { - def_id: fn_trait_def_id, - substs: self.mk_substs_trait(self_ty, &[arguments_tuple.into()]), - }; - ty::Binder::bind((trait_ref, sig.skip_binder().output())) - } + bug!("get_vtable_index_of_object_method: {:?} was not found", method_def_id); +} - pub fn generator_trait_ref_and_outputs(self, - fn_trait_def_id: DefId, - self_ty: Ty<'tcx>, - sig: ty::PolyGenSig<'tcx>) - -> ty::Binder<(ty::TraitRef<'tcx>, Ty<'tcx>, Ty<'tcx>)> - { - let trait_ref = ty::TraitRef { - def_id: fn_trait_def_id, - substs: self.mk_substs_trait(self_ty, &[]), - }; - ty::Binder::bind((trait_ref, sig.skip_binder().yield_ty, sig.skip_binder().return_ty)) - } +pub fn closure_trait_ref_and_return_type( + tcx: TyCtxt<'tcx>, + fn_trait_def_id: DefId, + self_ty: Ty<'tcx>, + sig: ty::PolyFnSig<'tcx>, + tuple_arguments: TupleArgumentsFlag, +) -> ty::Binder<(ty::TraitRef<'tcx>, Ty<'tcx>)> { + let arguments_tuple = match tuple_arguments { + TupleArgumentsFlag::No => sig.skip_binder().inputs()[0], + TupleArgumentsFlag::Yes => tcx.intern_tup(sig.skip_binder().inputs()), + }; + let trait_ref = ty::TraitRef { + def_id: fn_trait_def_id, + substs: tcx.mk_substs_trait(self_ty, &[arguments_tuple.into()]), + }; + ty::Binder::bind((trait_ref, sig.skip_binder().output())) +} - pub fn impl_is_default(self, node_item_def_id: DefId) -> bool { - match self.hir().as_local_hir_id(node_item_def_id) { - Some(hir_id) => { - let item = self.hir().expect_item(hir_id); - if let hir::ItemKind::Impl(_, _, defaultness, ..) = item.kind { - defaultness.is_default() - } else { - false - } - } - None => { - self.impl_defaultness(node_item_def_id) - .is_default() +pub fn generator_trait_ref_and_outputs( + tcx: TyCtxt<'tcx>, + fn_trait_def_id: DefId, + self_ty: Ty<'tcx>, + sig: ty::PolyGenSig<'tcx>, +) -> ty::Binder<(ty::TraitRef<'tcx>, Ty<'tcx>, Ty<'tcx>)> { + let trait_ref = + ty::TraitRef { def_id: fn_trait_def_id, substs: tcx.mk_substs_trait(self_ty, &[]) }; + ty::Binder::bind((trait_ref, sig.skip_binder().yield_ty, sig.skip_binder().return_ty)) +} + +pub fn impl_is_default(tcx: TyCtxt<'_>, node_item_def_id: DefId) -> bool { + match tcx.hir().as_local_hir_id(node_item_def_id) { + Some(hir_id) => { + let item = tcx.hir().expect_item(hir_id); + if let hir::ItemKind::Impl { defaultness, .. } = item.kind { + defaultness.is_default() + } else { + false } } + None => tcx.impl_defaultness(node_item_def_id).is_default(), } +} - pub fn impl_item_is_final(self, assoc_item: &ty::AssocItem) -> bool { - assoc_item.defaultness.is_final() && !self.impl_is_default(assoc_item.container.id()) - } +pub fn impl_item_is_final(tcx: TyCtxt<'_>, assoc_item: &ty::AssocItem) -> bool { + assoc_item.defaultness.is_final() && !impl_is_default(tcx, assoc_item.container.id()) } -pub enum TupleArgumentsFlag { Yes, No } +pub enum TupleArgumentsFlag { + Yes, + No, +} diff --git a/src/librustc/ty/wf.rs b/src/librustc/traits/wf.rs similarity index 59% rename from src/librustc/ty/wf.rs rename to src/librustc/traits/wf.rs index 276fc8c1de..9fa3c87477 100644 --- a/src/librustc/ty/wf.rs +++ b/src/librustc/traits/wf.rs @@ -1,13 +1,14 @@ -use crate::hir; -use crate::hir::def_id::DefId; +use crate::infer::opaque_types::required_region_bounds; use crate::infer::InferCtxt; -use crate::ty::subst::SubstsRef; +use crate::middle::lang_items; use crate::traits::{self, AssocTypeBoundData}; -use crate::ty::{self, ToPredicate, Ty, TyCtxt, TypeFoldable}; +use crate::ty::subst::SubstsRef; +use crate::ty::{self, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::{kw, Ident}; +use rustc_span::Span; use std::iter::once; -use syntax::symbol::{kw, Ident}; -use syntax_pos::Span; -use crate::middle::lang_items; /// Returns the set of obligations needed to make `ty` well-formed. /// If `ty` contains unresolved inference variables, this may include @@ -22,14 +23,7 @@ pub fn obligations<'a, 'tcx>( ty: Ty<'tcx>, span: Span, ) -> Option>> { - let mut wf = WfPredicates { - infcx, - param_env, - body_id, - span, - out: vec![], - item: None, - }; + let mut wf = WfPredicates { infcx, param_env, body_id, span, out: vec![], item: None }; if wf.compute(ty) { debug!("wf::obligations({:?}, body_id={:?}) = {:?}", ty, body_id, wf.out); let result = wf.normalize(); @@ -50,7 +44,7 @@ pub fn trait_obligations<'a, 'tcx>( body_id: hir::HirId, trait_ref: &ty::TraitRef<'tcx>, span: Span, - item: Option<&'tcx hir::Item>, + item: Option<&'tcx hir::Item<'tcx>>, ) -> Vec> { let mut wf = WfPredicates { infcx, param_env, body_id, span, out: vec![], item }; wf.compute_trait_ref(trait_ref, Elaborate::All); @@ -68,11 +62,10 @@ pub fn predicate_obligations<'a, 'tcx>( // (*) ok to skip binders, because wf code is prepared for it match *predicate { - ty::Predicate::Trait(ref t) => { + ty::Predicate::Trait(ref t, _) => { wf.compute_trait_ref(&t.skip_binder().trait_ref, Elaborate::None); // (*) } - ty::Predicate::RegionOutlives(..) => { - } + ty::Predicate::RegionOutlives(..) => {} ty::Predicate::TypeOutlives(ref t) => { wf.compute(t.skip_binder().0); } @@ -84,10 +77,8 @@ pub fn predicate_obligations<'a, 'tcx>( ty::Predicate::WellFormed(t) => { wf.compute(t); } - ty::Predicate::ObjectSafe(_) => { - } - ty::Predicate::ClosureKind(..) => { - } + ty::Predicate::ObjectSafe(_) => {} + ty::Predicate::ClosureKind(..) => {} ty::Predicate::Subtype(ref data) => { wf.compute(data.skip_binder().a); // (*) wf.compute(data.skip_binder().b); // (*) @@ -111,7 +102,7 @@ struct WfPredicates<'a, 'tcx> { body_id: hir::HirId, span: Span, out: Vec>, - item: Option<&'tcx hir::Item>, + item: Option<&'tcx hir::Item<'tcx>>, } /// Controls whether we "elaborate" supertraits and so forth on the WF @@ -152,14 +143,15 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { let cause = self.cause(traits::MiscObligation); let infcx = &mut self.infcx; let param_env = self.param_env; - self.out.iter() - .inspect(|pred| assert!(!pred.has_escaping_bound_vars())) - .flat_map(|pred| { - let mut selcx = traits::SelectionContext::new(infcx); - let pred = traits::normalize(&mut selcx, param_env, cause.clone(), pred); - once(pred.value).chain(pred.obligations) - }) - .collect() + self.out + .iter() + .inspect(|pred| assert!(!pred.has_escaping_bound_vars())) + .flat_map(|pred| { + let mut selcx = traits::SelectionContext::new(infcx); + let pred = traits::normalize(&mut selcx, param_env, cause.clone(), pred); + once(pred.value).chain(pred.obligations) + }) + .collect() } /// Pushes the obligations required for `trait_ref` to be WF into `self.out`. @@ -171,154 +163,162 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { let param_env = self.param_env; let item = &self.item; - let extend_cause_with_original_assoc_item_obligation = | - cause: &mut traits::ObligationCause<'_>, - pred: &ty::Predicate<'_>, - trait_assoc_items: ty::AssocItemsIterator<'_>, - | { - let trait_item = tcx.hir().as_local_hir_id(trait_ref.def_id).and_then(|trait_id| { - tcx.hir().find(trait_id) - }); - let (trait_name, trait_generics) = match trait_item { - Some(hir::Node::Item(hir::Item { - ident, - kind: hir::ItemKind::Trait(.., generics, _, _), - .. - })) | - Some(hir::Node::Item(hir::Item { - ident, - kind: hir::ItemKind::TraitAlias(generics, _), - .. - })) => (Some(ident), Some(generics)), - _ => (None, None), - }; - - let item_span = item.map(|i| tcx.sess.source_map().def_span(i.span)); - match pred { - ty::Predicate::Projection(proj) => { - // The obligation comes not from the current `impl` nor the `trait` being - // implemented, but rather from a "second order" obligation, like in - // `src/test/ui/associated-types/point-at-type-on-obligation-failure.rs`: - // - // error[E0271]: type mismatch resolving `::Ok == ()` - // --> $DIR/point-at-type-on-obligation-failure.rs:13:5 - // | - // LL | type Ok; - // | -- associated type defined here - // ... - // LL | impl Bar for Foo { - // | ---------------- in this `impl` item - // LL | type Ok = (); - // | ^^^^^^^^^^^^^ expected `u32`, found `()` - // | - // = note: expected type `u32` - // found type `()` - // - // FIXME: we would want to point a span to all places that contributed to this - // obligation. In the case above, it should be closer to: - // - // error[E0271]: type mismatch resolving `::Ok == ()` - // --> $DIR/point-at-type-on-obligation-failure.rs:13:5 - // | - // LL | type Ok; - // | -- associated type defined here - // LL | type Sibling: Bar2; - // | -------------------------------- obligation set here - // ... - // LL | impl Bar for Foo { - // | ---------------- in this `impl` item - // LL | type Ok = (); - // | ^^^^^^^^^^^^^ expected `u32`, found `()` - // ... - // LL | impl Bar2 for Foo2 { - // | ---------------- in this `impl` item - // LL | type Ok = u32; - // | -------------- obligation set here - // | - // = note: expected type `u32` - // found type `()` - if let Some(hir::ItemKind::Impl(.., impl_items)) = item.map(|i| &i.kind) { - let trait_assoc_item = tcx.associated_item(proj.projection_def_id()); - if let Some(impl_item) = impl_items.iter().filter(|item| { - item.ident == trait_assoc_item.ident - }).next() { - cause.span = impl_item.span; - cause.code = traits::AssocTypeBound(Box::new(AssocTypeBoundData { - impl_span: item_span, - original: trait_assoc_item.ident.span, - bounds: vec![], - })); + let extend_cause_with_original_assoc_item_obligation = + |cause: &mut traits::ObligationCause<'_>, + pred: &ty::Predicate<'_>, + trait_assoc_items: ty::AssocItemsIterator<'_>| { + let trait_item = tcx + .hir() + .as_local_hir_id(trait_ref.def_id) + .and_then(|trait_id| tcx.hir().find(trait_id)); + let (trait_name, trait_generics) = match trait_item { + Some(hir::Node::Item(hir::Item { + ident, + kind: hir::ItemKind::Trait(.., generics, _, _), + .. + })) + | Some(hir::Node::Item(hir::Item { + ident, + kind: hir::ItemKind::TraitAlias(generics, _), + .. + })) => (Some(ident), Some(generics)), + _ => (None, None), + }; + + let item_span = item.map(|i| tcx.sess.source_map().def_span(i.span)); + match pred { + ty::Predicate::Projection(proj) => { + // The obligation comes not from the current `impl` nor the `trait` being + // implemented, but rather from a "second order" obligation, like in + // `src/test/ui/associated-types/point-at-type-on-obligation-failure.rs`: + // + // error[E0271]: type mismatch resolving `::Ok == ()` + // --> $DIR/point-at-type-on-obligation-failure.rs:13:5 + // | + // LL | type Ok; + // | -- associated type defined here + // ... + // LL | impl Bar for Foo { + // | ---------------- in this `impl` item + // LL | type Ok = (); + // | ^^^^^^^^^^^^^ expected `u32`, found `()` + // | + // = note: expected type `u32` + // found type `()` + // + // FIXME: we would want to point a span to all places that contributed to this + // obligation. In the case above, it should be closer to: + // + // error[E0271]: type mismatch resolving `::Ok == ()` + // --> $DIR/point-at-type-on-obligation-failure.rs:13:5 + // | + // LL | type Ok; + // | -- associated type defined here + // LL | type Sibling: Bar2; + // | -------------------------------- obligation set here + // ... + // LL | impl Bar for Foo { + // | ---------------- in this `impl` item + // LL | type Ok = (); + // | ^^^^^^^^^^^^^ expected `u32`, found `()` + // ... + // LL | impl Bar2 for Foo2 { + // | ---------------- in this `impl` item + // LL | type Ok = u32; + // | -------------- obligation set here + // | + // = note: expected type `u32` + // found type `()` + if let Some(hir::ItemKind::Impl { items, .. }) = item.map(|i| &i.kind) { + let trait_assoc_item = tcx.associated_item(proj.projection_def_id()); + if let Some(impl_item) = items + .iter() + .filter(|item| item.ident == trait_assoc_item.ident) + .next() + { + cause.span = impl_item.span; + cause.code = traits::AssocTypeBound(Box::new(AssocTypeBoundData { + impl_span: item_span, + original: trait_assoc_item.ident.span, + bounds: vec![], + })); + } } } - } - ty::Predicate::Trait(proj) => { - // An associated item obligation born out of the `trait` failed to be met. - // Point at the `impl` that failed the obligation, the associated item that - // needed to meet the obligation, and the definition of that associated item, - // which should hold the obligation in most cases. An example can be seen in - // `src/test/ui/associated-types/point-at-type-on-obligation-failure-2.rs`: - // - // error[E0277]: the trait bound `bool: Bar` is not satisfied - // --> $DIR/point-at-type-on-obligation-failure-2.rs:8:5 - // | - // LL | type Assoc: Bar; - // | ----- associated type defined here - // ... - // LL | impl Foo for () { - // | --------------- in this `impl` item - // LL | type Assoc = bool; - // | ^^^^^^^^^^^^^^^^^^ the trait `Bar` is not implemented for `bool` - // - // If the obligation comes from the where clause in the `trait`, we point at it: - // - // error[E0277]: the trait bound `bool: Bar` is not satisfied - // --> $DIR/point-at-type-on-obligation-failure-2.rs:8:5 - // | - // | trait Foo where >::Assoc: Bar { - // | -------------------------- restricted in this bound - // LL | type Assoc; - // | ----- associated type defined here - // ... - // LL | impl Foo for () { - // | --------------- in this `impl` item - // LL | type Assoc = bool; - // | ^^^^^^^^^^^^^^^^^^ the trait `Bar` is not implemented for `bool` - if let ( - ty::Projection(ty::ProjectionTy { item_def_id, .. }), - Some(hir::ItemKind::Impl(.., impl_items)), - ) = (&proj.skip_binder().self_ty().kind, item.map(|i| &i.kind)) { - if let Some((impl_item, trait_assoc_item)) = trait_assoc_items - .filter(|i| i.def_id == *item_def_id) - .next() - .and_then(|trait_assoc_item| impl_items.iter() - .filter(|i| i.ident == trait_assoc_item.ident) - .next() - .map(|impl_item| (impl_item, trait_assoc_item))) + ty::Predicate::Trait(proj, _) => { + // An associated item obligation born out of the `trait` failed to be met. + // Point at the `impl` that failed the obligation, the associated item that + // needed to meet the obligation, and the definition of that associated item, + // which should hold the obligation in most cases. An example can be seen in + // `src/test/ui/associated-types/point-at-type-on-obligation-failure-2.rs`: + // + // error[E0277]: the trait bound `bool: Bar` is not satisfied + // --> $DIR/point-at-type-on-obligation-failure-2.rs:8:5 + // | + // LL | type Assoc: Bar; + // | ----- associated type defined here + // ... + // LL | impl Foo for () { + // | --------------- in this `impl` item + // LL | type Assoc = bool; + // | ^^^^^^^^^^^^^^^^^^ the trait `Bar` is not implemented for `bool` + // + // If the obligation comes from the where clause in the `trait`, we point at it: + // + // error[E0277]: the trait bound `bool: Bar` is not satisfied + // --> $DIR/point-at-type-on-obligation-failure-2.rs:8:5 + // | + // | trait Foo where >::Assoc: Bar { + // | -------------------------- restricted in this bound + // LL | type Assoc; + // | ----- associated type defined here + // ... + // LL | impl Foo for () { + // | --------------- in this `impl` item + // LL | type Assoc = bool; + // | ^^^^^^^^^^^^^^^^^^ the trait `Bar` is not implemented for `bool` + if let ( + ty::Projection(ty::ProjectionTy { item_def_id, .. }), + Some(hir::ItemKind::Impl { items, .. }), + ) = (&proj.skip_binder().self_ty().kind, item.map(|i| &i.kind)) { - let bounds = trait_generics.map(|generics| get_generic_bound_spans( - &generics, - trait_name, - trait_assoc_item.ident, - )).unwrap_or_else(Vec::new); - cause.span = impl_item.span; - cause.code = traits::AssocTypeBound(Box::new(AssocTypeBoundData { - impl_span: item_span, - original: trait_assoc_item.ident.span, - bounds, - })); + if let Some((impl_item, trait_assoc_item)) = trait_assoc_items + .filter(|i| i.def_id == *item_def_id) + .next() + .and_then(|trait_assoc_item| { + items + .iter() + .filter(|i| i.ident == trait_assoc_item.ident) + .next() + .map(|impl_item| (impl_item, trait_assoc_item)) + }) + { + let bounds = trait_generics + .map(|generics| { + get_generic_bound_spans( + &generics, + trait_name, + trait_assoc_item.ident, + ) + }) + .unwrap_or_else(Vec::new); + cause.span = impl_item.span; + cause.code = traits::AssocTypeBound(Box::new(AssocTypeBoundData { + impl_span: item_span, + original: trait_assoc_item.ident.span, + bounds, + })); + } } } + _ => {} } - _ => {} - } - }; + }; if let Elaborate::All = elaborate { let trait_assoc_items = tcx.associated_items(trait_ref.def_id); - let predicates = obligations.iter() - .map(|obligation| obligation.predicate.clone()) - .collect(); + let predicates = obligations.iter().map(|obligation| obligation.predicate).collect(); let implied_obligations = traits::elaborate_predicates(tcx, predicates); let implied_obligations = implied_obligations.map(|pred| { let mut cause = cause.clone(); @@ -334,13 +334,9 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { self.out.extend(obligations); - self.out.extend(trait_ref.substs.types() - .filter(|ty| !ty.has_escaping_bound_vars()) - .map(|ty| traits::Obligation::new( - cause.clone(), - param_env, - ty::Predicate::WellFormed(ty), - ))); + self.out.extend(trait_ref.substs.types().filter(|ty| !ty.has_escaping_bound_vars()).map( + |ty| traits::Obligation::new(cause.clone(), param_env, ty::Predicate::WellFormed(ty)), + )); } /// Pushes the obligations required for `trait_ref::Item` to be WF @@ -353,7 +349,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { self.compute_trait_ref(&trait_ref, Elaborate::None); if !data.has_escaping_bound_vars() { - let predicate = trait_ref.to_predicate(); + let predicate = trait_ref.without_const().to_predicate(); let cause = self.cause(traits::ProjectionWf(data)); self.out.push(traits::Obligation::new(cause, self.param_env, predicate)); } @@ -362,15 +358,15 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { /// Pushes the obligations required for an array length to be WF /// into `self.out`. fn compute_array_len(&mut self, constant: ty::Const<'tcx>) { - if let ty::ConstKind::Unevaluated(def_id, substs) = constant.val { + if let ty::ConstKind::Unevaluated(def_id, substs, promoted) = constant.val { + assert!(promoted.is_none()); + let obligations = self.nominal_obligations(def_id, substs); self.out.extend(obligations); let predicate = ty::Predicate::ConstEvaluatable(def_id, substs); let cause = self.cause(traits::MiscObligation); - self.out.push(traits::Obligation::new(cause, - self.param_env, - predicate)); + self.out.push(traits::Obligation::new(cause, self.param_env, predicate)); } } @@ -381,7 +377,11 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { def_id: self.infcx.tcx.require_lang_item(lang_items::SizedTraitLangItem, None), substs: self.infcx.tcx.mk_substs_trait(subty, &[]), }; - self.out.push(traits::Obligation::new(cause, self.param_env, trait_ref.to_predicate())); + self.out.push(traits::Obligation::new( + cause, + self.param_env, + trait_ref.without_const().to_predicate(), + )); } } @@ -394,19 +394,19 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { let param_env = self.param_env; while let Some(ty) = subtys.next() { match ty.kind { - ty::Bool | - ty::Char | - ty::Int(..) | - ty::Uint(..) | - ty::Float(..) | - ty::Error | - ty::Str | - ty::GeneratorWitness(..) | - ty::Never | - ty::Param(_) | - ty::Bound(..) | - ty::Placeholder(..) | - ty::Foreign(..) => { + ty::Bool + | ty::Char + | ty::Int(..) + | ty::Uint(..) + | ty::Float(..) + | ty::Error + | ty::Str + | ty::GeneratorWitness(..) + | ty::Never + | ty::Param(_) + | ty::Bound(..) + | ty::Placeholder(..) + | ty::Foreign(..) => { // WfScalar, WfParameter, etc } @@ -453,13 +453,13 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { // WfReference if !r.has_escaping_bound_vars() && !rty.has_escaping_bound_vars() { let cause = self.cause(traits::ReferenceOutlivesReferent(ty)); - self.out.push( - traits::Obligation::new( - cause, - param_env, - ty::Predicate::TypeOutlives( - ty::Binder::dummy( - ty::OutlivesPredicate(rty, r))))); + self.out.push(traits::Obligation::new( + cause, + param_env, + ty::Predicate::TypeOutlives(ty::Binder::dummy(ty::OutlivesPredicate( + rty, r, + ))), + )); } } @@ -520,7 +520,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { // of whatever returned this exact `impl Trait`. // for named opaque `impl Trait` types we still need to check them - if super::is_impl_trait_defn(self.infcx.tcx, did).is_none() { + if ty::is_impl_trait_defn(self.infcx.tcx, did).is_none() { let obligations = self.nominal_obligations(did, substs); self.out.extend(obligations); } @@ -537,20 +537,18 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { // obligations that don't refer to Self and // checking those - let defer_to_coercion = - self.infcx.tcx.features().object_safe_for_dispatch; + let defer_to_coercion = self.infcx.tcx.features().object_safe_for_dispatch; if !defer_to_coercion { let cause = self.cause(traits::MiscObligation); - let component_traits = - data.auto_traits().chain(data.principal_def_id()); - self.out.extend( - component_traits.map(|did| traits::Obligation::new( + let component_traits = data.auto_traits().chain(data.principal_def_id()); + self.out.extend(component_traits.map(|did| { + traits::Obligation::new( cause.clone(), param_env, - ty::Predicate::ObjectSafe(did) - )) - ); + ty::Predicate::ObjectSafe(did), + ) + })); } } @@ -569,16 +567,22 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { // is satisfied to ensure termination.) ty::Infer(_) => { let ty = self.infcx.shallow_resolve(ty); - if let ty::Infer(_) = ty.kind { // not yet resolved... - if ty == ty0 { // ...this is the type we started from! no progress. + if let ty::Infer(_) = ty.kind { + // not yet resolved... + if ty == ty0 { + // ...this is the type we started from! no progress. return false; } let cause = self.cause(traits::MiscObligation); - self.out.push( // ...not the type we started from, so we made progress. - traits::Obligation::new(cause, - self.param_env, - ty::Predicate::WellFormed(ty))); + self.out.push( + // ...not the type we started from, so we made progress. + traits::Obligation::new( + cause, + self.param_env, + ty::Predicate::WellFormed(ty), + ), + ); } else { // Yes, resolved, proceed with the // result. Should never return false because @@ -593,27 +597,27 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { return true; } - fn nominal_obligations(&mut self, - def_id: DefId, - substs: SubstsRef<'tcx>) - -> Vec> - { - let predicates = - self.infcx.tcx.predicates_of(def_id) - .instantiate(self.infcx.tcx, substs); + fn nominal_obligations( + &mut self, + def_id: DefId, + substs: SubstsRef<'tcx>, + ) -> Vec> { + let predicates = self.infcx.tcx.predicates_of(def_id).instantiate(self.infcx.tcx, substs); let cause = self.cause(traits::ItemObligation(def_id)); - predicates.predicates - .into_iter() - .map(|pred| traits::Obligation::new(cause.clone(), - self.param_env, - pred)) - .filter(|pred| !pred.has_escaping_bound_vars()) - .collect() + predicates + .predicates + .into_iter() + .map(|pred| traits::Obligation::new(cause.clone(), self.param_env, pred)) + .filter(|pred| !pred.has_escaping_bound_vars()) + .collect() } - fn from_object_ty(&mut self, ty: Ty<'tcx>, - data: ty::Binder<&'tcx ty::List>>, - region: ty::Region<'tcx>) { + fn from_object_ty( + &mut self, + ty: Ty<'tcx>, + data: ty::Binder<&'tcx ty::List>>, + region: ty::Region<'tcx>, + ) { // Imagine a type like this: // // trait Foo { } @@ -646,19 +650,20 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { // Note: in fact we only permit builtin traits, not `Bar<'d>`, I // am looking forward to the future here. if !data.has_escaping_bound_vars() && !region.has_escaping_bound_vars() { - let implicit_bounds = - object_region_bounds(self.infcx.tcx, data); + let implicit_bounds = object_region_bounds(self.infcx.tcx, data); let explicit_bound = region; self.out.reserve(implicit_bounds.len()); for implicit_bound in implicit_bounds { let cause = self.cause(traits::ObjectTypeBound(ty, explicit_bound)); - let outlives = ty::Binder::dummy( - ty::OutlivesPredicate(explicit_bound, implicit_bound)); - self.out.push(traits::Obligation::new(cause, - self.param_env, - outlives.to_predicate())); + let outlives = + ty::Binder::dummy(ty::OutlivesPredicate(explicit_bound, implicit_bound)); + self.out.push(traits::Obligation::new( + cause, + self.param_env, + outlives.to_predicate(), + )); } } } @@ -669,7 +674,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { /// from the declarations of `SomeTrait`, `Send`, and friends -- if /// they declare `trait SomeTrait : 'static`, for example, then /// `'static` would appear in the list. The hard work is done by -/// `ty::required_region_bounds`, see that for more information. +/// `infer::required_region_bounds`, see that for more information. pub fn object_region_bounds<'tcx>( tcx: TyCtxt<'tcx>, existential_predicates: ty::Binder<&'tcx ty::List>>, @@ -679,20 +684,23 @@ pub fn object_region_bounds<'tcx>( // a placeholder type. let open_ty = tcx.mk_ty_infer(ty::FreshTy(0)); - let predicates = existential_predicates.iter().filter_map(|predicate| { - if let ty::ExistentialPredicate::Projection(_) = *predicate.skip_binder() { - None - } else { - Some(predicate.with_self_ty(tcx, open_ty)) - } - }).collect(); + let predicates = existential_predicates + .iter() + .filter_map(|predicate| { + if let ty::ExistentialPredicate::Projection(_) = *predicate.skip_binder() { + None + } else { + Some(predicate.with_self_ty(tcx, open_ty)) + } + }) + .collect(); - tcx.required_region_bounds(open_ty, predicates) + required_region_bounds(tcx, open_ty, predicates) } /// Find the span of a generic bound affecting an associated type. fn get_generic_bound_spans( - generics: &hir::Generics, + generics: &hir::Generics<'_>, trait_name: Option<&Ident>, assoc_item_name: Ident, ) -> Vec { @@ -727,7 +735,7 @@ fn get_generic_bound_spans( bounds } -fn is_self_path(kind: &hir::TyKind) -> bool { +fn is_self_path(kind: &hir::TyKind<'_>) -> bool { match kind { hir::TyKind::Path(hir::QPath::Resolved(None, path)) => { let mut s = path.segments.iter(); diff --git a/src/librustc/ty/_match.rs b/src/librustc/ty/_match.rs index ea8a6ff2b2..35f8eb2047 100644 --- a/src/librustc/ty/_match.rs +++ b/src/librustc/ty/_match.rs @@ -1,6 +1,6 @@ -use crate::ty::{self, Ty, TyCtxt, InferConst}; use crate::ty::error::TypeError; -use crate::ty::relate::{self, Relate, TypeRelation, RelateResult}; +use crate::ty::relate::{self, Relate, RelateResult, TypeRelation}; +use crate::ty::{self, InferConst, Ty, TyCtxt}; /// A type "A" *matches* "B" if the fresh types in B could be /// substituted with values so as to make it equal to A. Matching is @@ -30,53 +30,55 @@ impl Match<'tcx> { } impl TypeRelation<'tcx> for Match<'tcx> { - fn tag(&self) -> &'static str { "Match" } - fn tcx(&self) -> TyCtxt<'tcx> { self.tcx } - fn param_env(&self) -> ty::ParamEnv<'tcx> { self.param_env } - fn a_is_expected(&self) -> bool { true } // irrelevant - - fn relate_with_variance>(&mut self, - _: ty::Variance, - a: &T, - b: &T) - -> RelateResult<'tcx, T> - { + fn tag(&self) -> &'static str { + "Match" + } + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + fn param_env(&self) -> ty::ParamEnv<'tcx> { + self.param_env + } + fn a_is_expected(&self) -> bool { + true + } // irrelevant + + fn relate_with_variance>( + &mut self, + _: ty::Variance, + a: &T, + b: &T, + ) -> RelateResult<'tcx, T> { self.relate(a, b) } - fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>) - -> RelateResult<'tcx, ty::Region<'tcx>> { - debug!("{}.regions({:?}, {:?})", - self.tag(), - a, - b); + fn regions( + &mut self, + a: ty::Region<'tcx>, + b: ty::Region<'tcx>, + ) -> RelateResult<'tcx, ty::Region<'tcx>> { + debug!("{}.regions({:?}, {:?})", self.tag(), a, b); Ok(a) } fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>> { - debug!("{}.tys({:?}, {:?})", self.tag(), - a, b); - if a == b { return Ok(a); } + debug!("{}.tys({:?}, {:?})", self.tag(), a, b); + if a == b { + return Ok(a); + } match (&a.kind, &b.kind) { - (_, &ty::Infer(ty::FreshTy(_))) | - (_, &ty::Infer(ty::FreshIntTy(_))) | - (_, &ty::Infer(ty::FreshFloatTy(_))) => { - Ok(a) - } + (_, &ty::Infer(ty::FreshTy(_))) + | (_, &ty::Infer(ty::FreshIntTy(_))) + | (_, &ty::Infer(ty::FreshFloatTy(_))) => Ok(a), - (&ty::Infer(_), _) | - (_, &ty::Infer(_)) => { + (&ty::Infer(_), _) | (_, &ty::Infer(_)) => { Err(TypeError::Sorts(relate::expected_found(self, &a, &b))) } - (&ty::Error, _) | (_, &ty::Error) => { - Ok(self.tcx().types.err) - } + (&ty::Error, _) | (_, &ty::Error) => Ok(self.tcx().types.err), - _ => { - relate::super_relate_tys(self, a, b) - } + _ => relate::super_relate_tys(self, a, b), } } @@ -105,9 +107,13 @@ impl TypeRelation<'tcx> for Match<'tcx> { relate::super_relate_consts(self, a, b) } - fn binders(&mut self, a: &ty::Binder, b: &ty::Binder) - -> RelateResult<'tcx, ty::Binder> - where T: Relate<'tcx> + fn binders( + &mut self, + a: &ty::Binder, + b: &ty::Binder, + ) -> RelateResult<'tcx, ty::Binder> + where + T: Relate<'tcx>, { Ok(ty::Binder::bind(self.relate(a.skip_binder(), b.skip_binder())?)) } diff --git a/src/librustc/ty/adjustment.rs b/src/librustc/ty/adjustment.rs index 342644752b..db034d1618 100644 --- a/src/librustc/ty/adjustment.rs +++ b/src/librustc/ty/adjustment.rs @@ -1,10 +1,9 @@ -use crate::hir; -use crate::hir::def_id::DefId; -use crate::ty::{self, Ty, TyCtxt}; use crate::ty::subst::SubstsRef; +use crate::ty::{self, Ty, TyCtxt}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; use rustc_macros::HashStable; - #[derive(Clone, Copy, Debug, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable)] pub enum PointerCast { /// Go from a fn-item type to a fn-pointer type. @@ -82,6 +81,15 @@ pub struct Adjustment<'tcx> { pub target: Ty<'tcx>, } +impl Adjustment<'tcx> { + pub fn is_region_borrow(&self) -> bool { + match self.kind { + Adjust::Borrow(AutoBorrow::Ref(..)) => true, + _ => false, + } + } +} + #[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)] pub enum Adjust<'tcx> { /// Go from ! to any type. @@ -109,11 +117,14 @@ pub struct OverloadedDeref<'tcx> { impl<'tcx> OverloadedDeref<'tcx> { pub fn method_call(&self, tcx: TyCtxt<'tcx>, source: Ty<'tcx>) -> (DefId, SubstsRef<'tcx>) { let trait_def_id = match self.mutbl { - hir::Mutability::Immutable => tcx.lang_items().deref_trait(), - hir::Mutability::Mutable => tcx.lang_items().deref_mut_trait() + hir::Mutability::Not => tcx.lang_items().deref_trait(), + hir::Mutability::Mut => tcx.lang_items().deref_mut_trait(), }; - let method_def_id = tcx.associated_items(trait_def_id.unwrap()) - .find(|m| m.kind == ty::AssocKind::Method).unwrap().def_id; + let method_def_id = tcx + .associated_items(trait_def_id.unwrap()) + .find(|m| m.kind == ty::AssocKind::Method) + .unwrap() + .def_id; (method_def_id, tcx.mk_substs_trait(source, &[])) } } @@ -133,20 +144,20 @@ impl<'tcx> OverloadedDeref<'tcx> { #[derive(Copy, Clone, PartialEq, Debug, RustcEncodable, RustcDecodable, HashStable)] pub enum AllowTwoPhase { Yes, - No + No, } #[derive(Copy, Clone, PartialEq, Debug, RustcEncodable, RustcDecodable, HashStable)] pub enum AutoBorrowMutability { - Mutable { allow_two_phase_borrow: AllowTwoPhase }, - Immutable, + Mut { allow_two_phase_borrow: AllowTwoPhase }, + Not, } impl From for hir::Mutability { fn from(m: AutoBorrowMutability) -> Self { match m { - AutoBorrowMutability::Mutable { .. } => hir::Mutability::Mutable, - AutoBorrowMutability::Immutable => hir::Mutability::Immutable, + AutoBorrowMutability::Mut { .. } => hir::Mutability::Mut, + AutoBorrowMutability::Not => hir::Mutability::Not, } } } @@ -172,11 +183,11 @@ pub struct CoerceUnsizedInfo { /// coercion is it? This applies to impls of `CoerceUnsized` for /// structs, primarily, where we store a bit of info about which /// fields need to be coerced. - pub custom_kind: Option + pub custom_kind: Option, } #[derive(Clone, Copy, RustcEncodable, RustcDecodable, Debug, HashStable)] pub enum CustomCoerceUnsized { /// Records the index of the field being coerced. - Struct(usize) + Struct(usize), } diff --git a/src/librustc/ty/binding.rs b/src/librustc/ty/binding.rs index 491e09dff0..5ee8811509 100644 --- a/src/librustc/ty/binding.rs +++ b/src/librustc/ty/binding.rs @@ -1,6 +1,6 @@ -use crate::hir::BindingAnnotation::*; -use crate::hir::BindingAnnotation; -use crate::hir::Mutability; +use rustc_hir::BindingAnnotation; +use rustc_hir::BindingAnnotation::*; +use rustc_hir::Mutability; #[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, Copy, HashStable)] pub enum BindingMode { @@ -13,10 +13,10 @@ CloneTypeFoldableAndLiftImpls! { BindingMode, } impl BindingMode { pub fn convert(ba: BindingAnnotation) -> BindingMode { match ba { - Unannotated => BindingMode::BindByValue(Mutability::Immutable), - Mutable => BindingMode::BindByValue(Mutability::Mutable), - Ref => BindingMode::BindByReference(Mutability::Immutable), - RefMut => BindingMode::BindByReference(Mutability::Mutable), + Unannotated => BindingMode::BindByValue(Mutability::Not), + Mutable => BindingMode::BindByValue(Mutability::Mut), + Ref => BindingMode::BindByReference(Mutability::Not), + RefMut => BindingMode::BindByReference(Mutability::Mut), } } } diff --git a/src/librustc/ty/cast.rs b/src/librustc/ty/cast.rs index bc12412312..5ba3f80b82 100644 --- a/src/librustc/ty/cast.rs +++ b/src/librustc/ty/cast.rs @@ -3,8 +3,8 @@ use crate::ty::{self, Ty}; -use syntax::ast; use rustc_macros::HashStable; +use syntax::ast; /// Types that are represented as ints. #[derive(Copy, Clone, Debug, PartialEq, Eq)] @@ -13,7 +13,7 @@ pub enum IntTy { I, CEnum, Bool, - Char + Char, } // Valid types for the result of a non-coercion cast @@ -28,8 +28,6 @@ pub enum CastTy<'tcx> { FnPtr, /// Raw pointers Ptr(ty::TypeAndMut<'tcx>), - /// References - RPtr(ty::TypeAndMut<'tcx>), } /// Cast Kind. See RFC 401 (or librustc_typeck/check/cast.rs) @@ -45,7 +43,7 @@ pub enum CastKind { U8CharCast, ArrayPtrCast, FnPtrPtrCast, - FnPtrAddrCast + FnPtrAddrCast, } impl<'tcx> CastTy<'tcx> { @@ -60,10 +58,8 @@ impl<'tcx> CastTy<'tcx> { ty::Infer(ty::InferTy::FloatVar(_)) => Some(CastTy::Float), ty::Uint(u) => Some(CastTy::Int(IntTy::U(u))), ty::Float(_) => Some(CastTy::Float), - ty::Adt(d,_) if d.is_enum() && d.is_payloadfree() => - Some(CastTy::Int(IntTy::CEnum)), + ty::Adt(d, _) if d.is_enum() && d.is_payloadfree() => Some(CastTy::Int(IntTy::CEnum)), ty::RawPtr(mt) => Some(CastTy::Ptr(mt)), - ty::Ref(_, ty, mutbl) => Some(CastTy::RPtr(ty::TypeAndMut { ty, mutbl })), ty::FnPtr(..) => Some(CastTy::FnPtr), _ => None, } diff --git a/src/librustc/ty/codec.rs b/src/librustc/ty/codec.rs index b3ef3217ec..df1602b2ac 100644 --- a/src/librustc/ty/codec.rs +++ b/src/librustc/ty/codec.rs @@ -7,16 +7,16 @@ // persisting to incr. comp. caches. use crate::arena::ArenaAllocatable; -use crate::hir::def_id::{DefId, CrateNum}; use crate::infer::canonical::{CanonicalVarInfo, CanonicalVarInfos}; +use crate::mir::{self, interpret::Allocation}; +use crate::ty::subst::SubstsRef; +use crate::ty::{self, List, Ty, TyCtxt}; use rustc_data_structures::fx::FxHashMap; -use rustc_serialize::{Decodable, Decoder, Encoder, Encodable, opaque}; +use rustc_hir::def_id::{CrateNum, DefId}; +use rustc_serialize::{opaque, Decodable, Decoder, Encodable, Encoder}; +use rustc_span::Span; use std::hash::Hash; use std::intrinsics; -use crate::ty::{self, List, Ty, TyCtxt}; -use crate::ty::subst::SubstsRef; -use crate::mir::{self, interpret::Allocation}; -use syntax_pos::Span; /// The shorthand encoding uses an enum's variant index `usize` /// and is offset by this value so it never matches a real variant. @@ -55,13 +55,11 @@ impl TyEncoder for opaque::Encoder { } /// Encode the given value or a previously cached shorthand. -pub fn encode_with_shorthand(encoder: &mut E, - value: &T, - cache: M) - -> Result<(), E::Error> - where E: TyEncoder, - M: for<'b> Fn(&'b mut E) -> &'b mut FxHashMap, - T: EncodableWithShorthand, +pub fn encode_with_shorthand(encoder: &mut E, value: &T, cache: M) -> Result<(), E::Error> +where + E: TyEncoder, + M: for<'b> Fn(&'b mut E) -> &'b mut FxHashMap, + T: EncodableWithShorthand, { let existing_shorthand = cache(encoder).get(value).cloned(); if let Some(shorthand) = existing_shorthand { @@ -76,9 +74,6 @@ pub fn encode_with_shorthand(encoder: &mut E, // The shorthand encoding uses the same usize as the // discriminant, with an offset so they can't conflict. - #[cfg(bootstrap)] - let discriminant = unsafe { intrinsics::discriminant_value(variant) }; - #[cfg(not(bootstrap))] let discriminant = intrinsics::discriminant_value(variant); assert!(discriminant < SHORTHAND_OFFSET as u64); let shorthand = start + SHORTHAND_OFFSET; @@ -101,8 +96,9 @@ pub fn encode_spanned_predicates<'tcx, E, C>( predicates: &'tcx [(ty::Predicate<'tcx>, Span)], cache: C, ) -> Result<(), E::Error> - where E: TyEncoder, - C: for<'b> Fn(&'b mut E) -> &'b mut FxHashMap, usize>, +where + E: TyEncoder, + C: for<'b> Fn(&'b mut E) -> &'b mut FxHashMap, usize>, { predicates.len().encode(encoder)?; for (predicate, span) in predicates { @@ -119,14 +115,17 @@ pub trait TyDecoder<'tcx>: Decoder { fn position(&self) -> usize; - fn cached_ty_for_shorthand(&mut self, - shorthand: usize, - or_insert_with: F) - -> Result, Self::Error> - where F: FnOnce(&mut Self) -> Result, Self::Error>; + fn cached_ty_for_shorthand( + &mut self, + shorthand: usize, + or_insert_with: F, + ) -> Result, Self::Error> + where + F: FnOnce(&mut Self) -> Result, Self::Error>; fn with_position(&mut self, pos: usize, f: F) -> R - where F: FnOnce(&mut Self) -> R; + where + F: FnOnce(&mut Self) -> R; fn map_encoded_cnum_to_current(&self, cnum: CrateNum) -> CrateNum; @@ -194,20 +193,21 @@ where { let tcx = decoder.tcx(); Ok(tcx.arena.alloc_from_iter( - (0..decoder.read_usize()?).map(|_| { - // Handle shorthands first, if we have an usize > 0x80. - let predicate = if decoder.positioned_at_shorthand() { - let pos = decoder.read_usize()?; - assert!(pos >= SHORTHAND_OFFSET); - let shorthand = pos - SHORTHAND_OFFSET; - - decoder.with_position(shorthand, ty::Predicate::decode) - } else { - ty::Predicate::decode(decoder) - }?; - Ok((predicate, Decodable::decode(decoder)?)) - }) - .collect::, _>>()?, + (0..decoder.read_usize()?) + .map(|_| { + // Handle shorthands first, if we have an usize > 0x80. + let predicate = if decoder.positioned_at_shorthand() { + let pos = decoder.read_usize()?; + assert!(pos >= SHORTHAND_OFFSET); + let shorthand = pos - SHORTHAND_OFFSET; + + decoder.with_position(shorthand, ty::Predicate::decode) + } else { + ty::Predicate::decode(decoder) + }?; + Ok((predicate, Decodable::decode(decoder)?)) + }) + .collect::, _>>()?, )) } @@ -226,11 +226,11 @@ pub fn decode_place(decoder: &mut D) -> Result, D::Error> where D: TyDecoder<'tcx>, { - let base: mir::PlaceBase<'tcx> = Decodable::decode(decoder)?; + let local: mir::Local = Decodable::decode(decoder)?; let len = decoder.read_usize()?; let projection: &'tcx List> = decoder.tcx().mk_place_elems((0..len).map(|_| Decodable::decode(decoder)))?; - Ok(mir::Place { base, projection }) + Ok(mir::Place { local, projection }) } #[inline] @@ -267,8 +267,7 @@ where D: TyDecoder<'tcx>, { let len = decoder.read_usize()?; - Ok(decoder.tcx() - .mk_existential_predicates((0..len).map(|_| Decodable::decode(decoder)))?) + Ok(decoder.tcx().mk_existential_predicates((0..len).map(|_| Decodable::decode(decoder)))?) } #[inline] @@ -277,10 +276,9 @@ where D: TyDecoder<'tcx>, { let len = decoder.read_usize()?; - let interned: Result, _> = (0..len).map(|_| Decodable::decode(decoder)) - .collect(); - Ok(decoder.tcx() - .intern_canonical_var_infos(interned?.as_slice())) + let interned: Result, _> = + (0..len).map(|_| Decodable::decode(decoder)).collect(); + Ok(decoder.tcx().intern_canonical_var_infos(interned?.as_slice())) } #[inline] @@ -355,9 +353,9 @@ macro_rules! implement_ty_decoder { use $crate::ty; use $crate::ty::codec::*; use $crate::ty::subst::SubstsRef; - use $crate::hir::def_id::{CrateNum}; + use rustc_hir::def_id::{CrateNum}; - use syntax_pos::Span; + use rustc_span::Span; use super::$DecoderName; diff --git a/src/librustc/ty/constness.rs b/src/librustc/ty/constness.rs deleted file mode 100644 index 897a3678c4..0000000000 --- a/src/librustc/ty/constness.rs +++ /dev/null @@ -1,246 +0,0 @@ -use crate::ty::query::Providers; -use crate::hir::def_id::DefId; -use crate::hir; -use crate::ty::TyCtxt; -use syntax_pos::symbol::{sym, Symbol}; -use rustc_target::spec::abi::Abi; -use crate::hir::map::blocks::FnLikeNode; -use syntax::attr; - -impl<'tcx> TyCtxt<'tcx> { - /// Whether the `def_id` counts as const fn in your current crate, considering all active - /// feature gates - pub fn is_const_fn(self, def_id: DefId) -> bool { - self.is_const_fn_raw(def_id) && match self.is_unstable_const_fn(def_id) { - Some(feature_name) => { - // has a `rustc_const_unstable` attribute, check whether the user enabled the - // corresponding feature gate. - self.features() - .declared_lib_features - .iter() - .any(|&(sym, _)| sym == feature_name) - }, - // functions without const stability are either stable user written - // const fn or the user is using feature gates and we thus don't - // care what they do - None => true, - } - } - - /// Whether the `def_id` is an unstable const fn and what feature gate is necessary to enable it - pub fn is_unstable_const_fn(self, def_id: DefId) -> Option { - if self.is_const_fn_raw(def_id) { - let const_stab = self.lookup_const_stability(def_id)?; - if const_stab.level.is_unstable() { - Some(const_stab.feature) - } else { - None - } - } else { - None - } - } - - /// Returns `true` if the `def_id` refers to an intrisic which we've whitelisted - /// for being called from stable `const fn`s (`min_const_fn`). - /// - /// Adding more intrinsics requires sign-off from @rust-lang/lang. - /// - /// This list differs from the list in `is_const_intrinsic` in the sense that any item on this - /// list must be on the `is_const_intrinsic` list, too, because if an intrinsic is callable from - /// stable, it must be callable at all. - fn is_intrinsic_min_const_fn(self, def_id: DefId) -> bool { - match self.item_name(def_id) { - | sym::size_of - | sym::min_align_of - | sym::needs_drop - // Arithmetic: - | sym::add_with_overflow // ~> .overflowing_add - | sym::sub_with_overflow // ~> .overflowing_sub - | sym::mul_with_overflow // ~> .overflowing_mul - | sym::wrapping_add // ~> .wrapping_add - | sym::wrapping_sub // ~> .wrapping_sub - | sym::wrapping_mul // ~> .wrapping_mul - | sym::saturating_add // ~> .saturating_add - | sym::saturating_sub // ~> .saturating_sub - | sym::unchecked_shl // ~> .wrapping_shl - | sym::unchecked_shr // ~> .wrapping_shr - | sym::rotate_left // ~> .rotate_left - | sym::rotate_right // ~> .rotate_right - | sym::ctpop // ~> .count_ones - | sym::ctlz // ~> .leading_zeros - | sym::cttz // ~> .trailing_zeros - | sym::bswap // ~> .swap_bytes - | sym::bitreverse // ~> .reverse_bits - => true, - _ => false, - } - } - - /// Returns `true` if this function must conform to `min_const_fn` - pub fn is_min_const_fn(self, def_id: DefId) -> bool { - // Bail out if the signature doesn't contain `const` - if !self.is_const_fn_raw(def_id) { - return false; - } - if let Abi::RustIntrinsic = self.fn_sig(def_id).abi() { - return self.is_intrinsic_min_const_fn(def_id); - } - - if self.features().staged_api { - // In order for a libstd function to be considered min_const_fn - // it needs to be stable and have no `rustc_const_unstable` attribute. - match self.lookup_const_stability(def_id) { - // `rustc_const_unstable` functions don't need to conform. - Some(&attr::ConstStability { ref level, .. }) if level.is_unstable() => false, - None => if let Some(stab) = self.lookup_stability(def_id) { - if stab.level.is_stable() { - self.sess.span_err( - self.def_span(def_id), - "stable const functions must have either `rustc_const_stable` or \ - `rustc_const_unstable` attribute", - ); - // While we errored above, because we don't know if we need to conform, we - // err on the "safe" side and require min_const_fn. - true - } else { - // Unstable functions need not conform to min_const_fn. - false - } - } else { - // Internal functions are forced to conform to min_const_fn. - // Annotate the internal function with a const stability attribute if - // you need to use unstable features. - // Note: this is an arbitrary choice that does not affect stability or const - // safety or anything, it just changes whether we need to annotate some - // internal functions with `rustc_const_stable` or with `rustc_const_unstable` - true - }, - // Everything else needs to conform, because it would be callable from - // other `min_const_fn` functions. - _ => true, - } - } else { - // users enabling the `const_fn` feature gate can do what they want - !self.features().const_fn - } - } -} - - -pub fn provide(providers: &mut Providers<'_>) { - /// Const evaluability whitelist is here to check evaluability at the - /// top level beforehand. - fn is_const_intrinsic(tcx: TyCtxt<'_>, def_id: DefId) -> Option { - match tcx.fn_sig(def_id).abi() { - Abi::RustIntrinsic | - Abi::PlatformIntrinsic => { - // FIXME: deduplicate these two lists as much as possible - match tcx.item_name(def_id) { - // Keep this list in the same order as the match patterns in - // `librustc_mir/interpret/intrinsics.rs` - - // This whitelist is a list of intrinsics that have a miri-engine implementation - // and can thus be called when enabling enough feature gates. The similar - // whitelist in `is_intrinsic_min_const_fn` (in this file), exists for allowing - // the intrinsics to be called by stable const fns. - | sym::caller_location - - | sym::min_align_of - | sym::pref_align_of - | sym::needs_drop - | sym::size_of - | sym::type_id - | sym::type_name - - | sym::ctpop - | sym::cttz - | sym::cttz_nonzero - | sym::ctlz - | sym::ctlz_nonzero - | sym::bswap - | sym::bitreverse - - | sym::wrapping_add - | sym::wrapping_sub - | sym::wrapping_mul - | sym::add_with_overflow - | sym::sub_with_overflow - | sym::mul_with_overflow - - | sym::saturating_add - | sym::saturating_sub - - | sym::unchecked_shl - | sym::unchecked_shr - - | sym::rotate_left - | sym::rotate_right - - | sym::ptr_offset_from - - | sym::transmute - - | sym::simd_insert - - | sym::simd_extract - - => Some(true), - - _ => Some(false) - } - } - _ => None - } - } - - /// Checks whether the function has a `const` modifier or, in case it is an intrinsic, whether - /// said intrinsic is on the whitelist for being const callable. - fn is_const_fn_raw(tcx: TyCtxt<'_>, def_id: DefId) -> bool { - let hir_id = tcx.hir().as_local_hir_id(def_id) - .expect("Non-local call to local provider is_const_fn"); - - let node = tcx.hir().get(hir_id); - - if let Some(whitelisted) = is_const_intrinsic(tcx, def_id) { - whitelisted - } else if let Some(fn_like) = FnLikeNode::from_node(node) { - fn_like.constness() == hir::Constness::Const - } else if let hir::Node::Ctor(_) = node { - true - } else { - false - } - } - - fn is_promotable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool { - tcx.is_const_fn(def_id) && match tcx.lookup_const_stability(def_id) { - Some(stab) => { - if cfg!(debug_assertions) && stab.promotable { - let sig = tcx.fn_sig(def_id); - assert_eq!( - sig.unsafety(), - hir::Unsafety::Normal, - "don't mark const unsafe fns as promotable", - // https://github.com/rust-lang/rust/pull/53851#issuecomment-418760682 - ); - } - stab.promotable - }, - None => false, - } - } - - fn const_fn_is_allowed_fn_ptr(tcx: TyCtxt<'_>, def_id: DefId) -> bool { - tcx.is_const_fn(def_id) && - tcx.lookup_const_stability(def_id) - .map(|stab| stab.allow_const_fn_ptr).unwrap_or(false) - } - - *providers = Providers { - is_const_fn_raw, - is_promotable_const_fn, - const_fn_is_allowed_fn_ptr, - ..*providers - }; -} diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index 595ea40b2f..355df86046 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -1,99 +1,92 @@ -// ignore-tidy-filelength //! Type context book-keeping. use crate::arena::Arena; use crate::dep_graph::DepGraph; -use crate::dep_graph::{self, DepNode, DepConstructor}; -use crate::session::Session; -use crate::session::config::{BorrowckMode, OutputFilenames}; -use crate::session::config::CrateType; -use crate::middle; -use crate::middle::lang_items::PanicLocationLangItem; -use crate::hir::{self, TraitCandidate, HirId, ItemKind, ItemLocalId, Node}; -use crate::hir::def::{Res, DefKind, Export}; -use crate::hir::def_id::{CrateNum, DefId, DefIndex, LOCAL_CRATE}; +use crate::dep_graph::{self, DepConstructor, DepNode}; +use crate::hir::exports::Export; use crate::hir::map as hir_map; use crate::hir::map::DefPathHash; -use crate::lint::{self, Lint}; -use crate::ich::{StableHashingContext, NodeIdHashingMode}; +use crate::ich::{NodeIdHashingMode, StableHashingContext}; use crate::infer::canonical::{Canonical, CanonicalVarInfo, CanonicalVarInfos}; -use crate::infer::outlives::free_region_map::FreeRegionMap; +use crate::lint::{struct_lint_level, LintSource}; +use crate::middle; use crate::middle::cstore::CrateStoreDyn; use crate::middle::cstore::EncodedMetadata; use crate::middle::lang_items; +use crate::middle::lang_items::PanicLocationLangItem; use crate::middle::resolve_lifetime::{self, ObjectLifetimeDefault}; use crate::middle::stability; -use crate::mir::{BodyAndCache, Field, interpret, Local, Place, PlaceElem, ProjectionKind, Promoted}; -use crate::mir::interpret::{ConstValue, Allocation, Scalar}; -use crate::ty::subst::{GenericArg, InternalSubsts, SubstsRef, Subst}; -use crate::ty::ReprOptions; +use crate::mir::interpret::{Allocation, ConstValue, Scalar}; +use crate::mir::{ + interpret, BodyAndCache, Field, Local, Place, PlaceElem, ProjectionKind, Promoted, +}; use crate::traits; -use crate::traits::{Clause, Clauses, GoalKind, Goal, Goals}; -use crate::ty::{self, DefIdTree, Ty, TypeAndMut}; -use crate::ty::{TyS, TyKind, List}; -use crate::ty::{AdtKind, AdtDef, Region, Const}; -use crate::ty::{PolyFnSig, InferTy, ParamTy, ProjectionTy, ExistentialPredicate, Predicate}; -use crate::ty::RegionKind; -use crate::ty::{TyVar, TyVid, IntVar, IntVid, FloatVar, FloatVid, ConstVid}; -use crate::ty::TyKind::*; -use crate::ty::{InferConst, ParamConst}; -use crate::ty::GenericParamDefKind; +use crate::traits::{Clause, Clauses, Goal, GoalKind, Goals}; +use crate::ty::free_region_map::FreeRegionMap; use crate::ty::layout::{LayoutDetails, TargetDataLayout, VariantIdx}; use crate::ty::query; use crate::ty::steal::Steal; -use crate::ty::subst::{UserSubsts, GenericArgKind}; -use crate::ty::{BoundVar, BindingMode}; +use crate::ty::subst::{GenericArg, InternalSubsts, Subst, SubstsRef}; +use crate::ty::subst::{GenericArgKind, UserSubsts}; use crate::ty::CanonicalPolyFnSig; +use crate::ty::GenericParamDefKind; +use crate::ty::RegionKind; +use crate::ty::ReprOptions; +use crate::ty::TyKind::*; +use crate::ty::{self, DefIdTree, Ty, TypeAndMut}; +use crate::ty::{AdtDef, AdtKind, Const, Region}; +use crate::ty::{BindingMode, BoundVar}; +use crate::ty::{ConstVid, FloatVar, FloatVid, IntVar, IntVid, TyVar, TyVid}; +use crate::ty::{ExistentialPredicate, InferTy, ParamTy, PolyFnSig, Predicate, ProjectionTy}; +use crate::ty::{InferConst, ParamConst}; +use crate::ty::{List, TyKind, TyS}; use crate::util::common::ErrorReported; -use crate::util::nodemap::{DefIdMap, DefIdSet, ItemLocalMap, ItemLocalSet, NodeMap}; -use crate::util::nodemap::{FxHashMap, FxHashSet}; - -use errors::DiagnosticBuilder; -use arena::SyncDroplessArena; -use smallvec::SmallVec; +use rustc_data_structures::sync; +use rustc_hir as hir; +use rustc_hir::def::{DefKind, Res}; +use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, DefIndex, LOCAL_CRATE}; +use rustc_hir::{HirId, Node, TraitCandidate}; +use rustc_hir::{ItemKind, ItemLocalId, ItemLocalMap, ItemLocalSet}; +use rustc_session::config::CrateType; +use rustc_session::config::{BorrowckMode, OutputFilenames}; +use rustc_session::Session; + +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::profiling::SelfProfilerRef; +use rustc_data_structures::sharded::{IntoPointer, ShardedHashMap}; use rustc_data_structures::stable_hasher::{ - HashStable, StableHasher, StableVec, hash_stable_hashmap, + hash_stable_hashmap, HashStable, StableHasher, StableVec, }; +use rustc_data_structures::sync::{Lock, Lrc, WorkerLocal}; +use rustc_errors::DiagnosticBuilder; use rustc_index::vec::{Idx, IndexVec}; -use rustc_data_structures::sharded::ShardedHashMap; -use rustc_data_structures::sync::{Lrc, Lock, WorkerLocal}; +use rustc_macros::HashStable; +use rustc_session::lint::{Level, Lint}; +use rustc_session::node_id::NodeMap; +use rustc_span::source_map::MultiSpan; +use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_span::Span; +use rustc_target::spec::abi; +use smallvec::SmallVec; use std::any::Any; use std::borrow::Borrow; use std::cmp::Ordering; use std::collections::hash_map::{self, Entry}; -use std::hash::{Hash, Hasher}; use std::fmt; -use std::mem; -use std::ops::{Deref, Bound}; +use std::hash::{Hash, Hasher}; use std::iter; +use std::mem; +use std::ops::{Bound, Deref}; use std::sync::Arc; -use rustc_target::spec::abi; -use rustc_macros::HashStable; use syntax::ast; use syntax::attr; -use syntax::source_map::MultiSpan; -use syntax::symbol::{Symbol, kw, sym}; -use syntax_pos::Span; use syntax::expand::allocator::AllocatorKind; -pub struct AllArenas { - pub interner: SyncDroplessArena, -} - -impl AllArenas { - pub fn new() -> Self { - AllArenas { - interner: SyncDroplessArena::default(), - } - } -} - type InternedSet<'tcx, T> = ShardedHashMap, ()>; pub struct CtxtInterners<'tcx> { /// The arena that types, regions, etc. are allocated from. - arena: &'tcx SyncDroplessArena, + arena: &'tcx WorkerLocal>, /// Specifically use a speedy hash algorithm for these hash sets, since /// they're accessed quite often. @@ -113,7 +106,7 @@ pub struct CtxtInterners<'tcx> { } impl<'tcx> CtxtInterners<'tcx> { - fn new(arena: &'tcx SyncDroplessArena) -> CtxtInterners<'tcx> { + fn new(arena: &'tcx WorkerLocal>) -> CtxtInterners<'tcx> { CtxtInterners { arena, type_: Default::default(), @@ -135,20 +128,20 @@ impl<'tcx> CtxtInterners<'tcx> { /// Interns a type. #[allow(rustc::usage_of_ty_tykind)] #[inline(never)] - fn intern_ty(&self, - kind: TyKind<'tcx> - ) -> Ty<'tcx> { - self.type_.intern(kind, |kind| { - let flags = super::flags::FlagComputation::for_kind(&kind); - - let ty_struct = TyS { - kind, - flags: flags.flags, - outer_exclusive_binder: flags.outer_exclusive_binder, - }; + fn intern_ty(&self, kind: TyKind<'tcx>) -> Ty<'tcx> { + self.type_ + .intern(kind, |kind| { + let flags = super::flags::FlagComputation::for_kind(&kind); + + let ty_struct = TyS { + kind, + flags: flags.flags, + outer_exclusive_binder: flags.outer_exclusive_binder, + }; - Interned(self.arena.alloc(ty_struct)) - }).0 + Interned(self.arena.alloc(ty_struct)) + }) + .0 } } @@ -192,7 +185,7 @@ pub struct CommonConsts<'tcx> { pub struct LocalTableInContext<'a, V> { local_id_root: Option, - data: &'a ItemLocalMap + data: &'a ItemLocalMap, } /// Validate that the given HirId (respectively its `local_id` part) can be @@ -202,17 +195,21 @@ pub struct LocalTableInContext<'a, V> { /// would be in a different frame of reference and using its `local_id` /// would result in lookup errors, or worse, in silently wrong data being /// stored/returned. -fn validate_hir_id_for_typeck_tables(local_id_root: Option, - hir_id: hir::HirId, - mut_access: bool) { +fn validate_hir_id_for_typeck_tables( + local_id_root: Option, + hir_id: hir::HirId, + mut_access: bool, +) { if let Some(local_id_root) = local_id_root { if hir_id.owner != local_id_root.index { ty::tls::with(|tcx| { - bug!("node {} with HirId::owner {:?} cannot be placed in \ + bug!( + "node {} with HirId::owner {:?} cannot be placed in \ TypeckTables with local_id_root {:?}", - tcx.hir().node_to_string(hir_id), - DefId::local(hir_id.owner), - local_id_root) + tcx.hir().node_to_string(hir_id), + DefId::local(hir_id.owner), + local_id_root + ) }); } } else { @@ -253,7 +250,7 @@ impl<'a, V> ::std::ops::Index for LocalTableInContext<'a, V> { pub struct LocalTableInContextMut<'a, V> { local_id_root: Option, - data: &'a mut ItemLocalMap + data: &'a mut ItemLocalMap, } impl<'a, V> LocalTableInContextMut<'a, V> { @@ -307,8 +304,7 @@ pub struct ResolvedOpaqueTy<'tcx> { /// /// Here, we would store the type `T`, the span of the value `x`, and the "scope-span" for /// the scope that contains `x`. -#[derive(RustcEncodable, RustcDecodable, Clone, Debug, Eq, Hash, PartialEq)] -#[derive(HashStable, TypeFoldable)] +#[derive(RustcEncodable, RustcDecodable, Clone, Debug, Eq, Hash, PartialEq, HashStable)] pub struct GeneratorInteriorTypeCause<'tcx> { /// Type of the captured binding. pub ty: Ty<'tcx>, @@ -316,6 +312,8 @@ pub struct GeneratorInteriorTypeCause<'tcx> { pub span: Span, /// Span of the scope of the captured binding. pub scope_span: Option, + /// Expr which the type evaluated from. + pub expr: Option, } #[derive(RustcEncodable, RustcDecodable, Debug)] @@ -428,7 +426,7 @@ pub struct TypeckTables<'tcx> { /// entire variable. pub upvar_list: ty::UpvarListMap, - /// Stores the type, span and optional scope span of all types + /// Stores the type, expression, span and optional scope span of all types /// that are live across the yield of this generator (if a generator). pub generator_interior_types: Vec>, } @@ -461,10 +459,11 @@ impl<'tcx> TypeckTables<'tcx> { } /// Returns the final resolution of a `QPath` in an `Expr` or `Pat` node. - pub fn qpath_res(&self, qpath: &hir::QPath, id: hir::HirId) -> Res { + pub fn qpath_res(&self, qpath: &hir::QPath<'_>, id: hir::HirId) -> Res { match *qpath { hir::QPath::Resolved(_, ref path) => path.res, - hir::QPath::TypeRelative(..) => self.type_dependent_def(id) + hir::QPath::TypeRelative(..) => self + .type_dependent_def(id) .map_or(Res::Err, |(kind, def_id)| Res::Def(kind, def_id)), } } @@ -472,10 +471,7 @@ impl<'tcx> TypeckTables<'tcx> { pub fn type_dependent_defs( &self, ) -> LocalTableInContext<'_, Result<(DefKind, DefId), ErrorReported>> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.type_dependent_defs - } + LocalTableInContext { local_id_root: self.local_id_root, data: &self.type_dependent_defs } } pub fn type_dependent_def(&self, id: HirId) -> Option<(DefKind, DefId)> { @@ -492,61 +488,43 @@ impl<'tcx> TypeckTables<'tcx> { ) -> LocalTableInContextMut<'_, Result<(DefKind, DefId), ErrorReported>> { LocalTableInContextMut { local_id_root: self.local_id_root, - data: &mut self.type_dependent_defs + data: &mut self.type_dependent_defs, } } pub fn field_indices(&self) -> LocalTableInContext<'_, usize> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.field_indices - } + LocalTableInContext { local_id_root: self.local_id_root, data: &self.field_indices } } pub fn field_indices_mut(&mut self) -> LocalTableInContextMut<'_, usize> { - LocalTableInContextMut { - local_id_root: self.local_id_root, - data: &mut self.field_indices - } + LocalTableInContextMut { local_id_root: self.local_id_root, data: &mut self.field_indices } } - pub fn user_provided_types( - &self - ) -> LocalTableInContext<'_, CanonicalUserType<'tcx>> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.user_provided_types - } + pub fn user_provided_types(&self) -> LocalTableInContext<'_, CanonicalUserType<'tcx>> { + LocalTableInContext { local_id_root: self.local_id_root, data: &self.user_provided_types } } pub fn user_provided_types_mut( - &mut self + &mut self, ) -> LocalTableInContextMut<'_, CanonicalUserType<'tcx>> { LocalTableInContextMut { local_id_root: self.local_id_root, - data: &mut self.user_provided_types + data: &mut self.user_provided_types, } } pub fn node_types(&self) -> LocalTableInContext<'_, Ty<'tcx>> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.node_types - } + LocalTableInContext { local_id_root: self.local_id_root, data: &self.node_types } } pub fn node_types_mut(&mut self) -> LocalTableInContextMut<'_, Ty<'tcx>> { - LocalTableInContextMut { - local_id_root: self.local_id_root, - data: &mut self.node_types - } + LocalTableInContextMut { local_id_root: self.local_id_root, data: &mut self.node_types } } pub fn node_type(&self, id: hir::HirId) -> Ty<'tcx> { - self.node_type_opt(id).unwrap_or_else(|| - bug!("node_type: no type for node `{}`", - tls::with(|tcx| tcx.hir().node_to_string(id))) - ) + self.node_type_opt(id).unwrap_or_else(|| { + bug!("node_type: no type for node `{}`", tls::with(|tcx| tcx.hir().node_to_string(id))) + }) } pub fn node_type_opt(&self, id: hir::HirId) -> Option> { @@ -555,10 +533,7 @@ impl<'tcx> TypeckTables<'tcx> { } pub fn node_substs_mut(&mut self) -> LocalTableInContextMut<'_, SubstsRef<'tcx>> { - LocalTableInContextMut { - local_id_root: self.local_id_root, - data: &mut self.node_substs - } + LocalTableInContextMut { local_id_root: self.local_id_root, data: &mut self.node_substs } } pub fn node_substs(&self, id: hir::HirId) -> SubstsRef<'tcx> { @@ -573,11 +548,11 @@ impl<'tcx> TypeckTables<'tcx> { // Returns the type of a pattern as a monotype. Like @expr_ty, this function // doesn't provide type parameter substitutions. - pub fn pat_ty(&self, pat: &hir::Pat) -> Ty<'tcx> { + pub fn pat_ty(&self, pat: &hir::Pat<'_>) -> Ty<'tcx> { self.node_type(pat.hir_id) } - pub fn pat_ty_opt(&self, pat: &hir::Pat) -> Option> { + pub fn pat_ty_opt(&self, pat: &hir::Pat<'_>) -> Option> { self.node_type_opt(pat.hir_id) } @@ -591,51 +566,40 @@ impl<'tcx> TypeckTables<'tcx> { // NB (2): This type doesn't provide type parameter substitutions; e.g., if you // ask for the type of "id" in "id(3)", it will return "fn(&isize) -> isize" // instead of "fn(ty) -> T with T = isize". - pub fn expr_ty(&self, expr: &hir::Expr) -> Ty<'tcx> { + pub fn expr_ty(&self, expr: &hir::Expr<'_>) -> Ty<'tcx> { self.node_type(expr.hir_id) } - pub fn expr_ty_opt(&self, expr: &hir::Expr) -> Option> { + pub fn expr_ty_opt(&self, expr: &hir::Expr<'_>) -> Option> { self.node_type_opt(expr.hir_id) } pub fn adjustments(&self) -> LocalTableInContext<'_, Vec>> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.adjustments - } + LocalTableInContext { local_id_root: self.local_id_root, data: &self.adjustments } } - pub fn adjustments_mut(&mut self) - -> LocalTableInContextMut<'_, Vec>> { - LocalTableInContextMut { - local_id_root: self.local_id_root, - data: &mut self.adjustments - } + pub fn adjustments_mut( + &mut self, + ) -> LocalTableInContextMut<'_, Vec>> { + LocalTableInContextMut { local_id_root: self.local_id_root, data: &mut self.adjustments } } - pub fn expr_adjustments(&self, expr: &hir::Expr) - -> &[ty::adjustment::Adjustment<'tcx>] { + pub fn expr_adjustments(&self, expr: &hir::Expr<'_>) -> &[ty::adjustment::Adjustment<'tcx>] { validate_hir_id_for_typeck_tables(self.local_id_root, expr.hir_id, false); self.adjustments.get(&expr.hir_id.local_id).map_or(&[], |a| &a[..]) } /// Returns the type of `expr`, considering any `Adjustment` /// entry recorded for that expression. - pub fn expr_ty_adjusted(&self, expr: &hir::Expr) -> Ty<'tcx> { - self.expr_adjustments(expr) - .last() - .map_or_else(|| self.expr_ty(expr), |adj| adj.target) + pub fn expr_ty_adjusted(&self, expr: &hir::Expr<'_>) -> Ty<'tcx> { + self.expr_adjustments(expr).last().map_or_else(|| self.expr_ty(expr), |adj| adj.target) } - pub fn expr_ty_adjusted_opt(&self, expr: &hir::Expr) -> Option> { - self.expr_adjustments(expr) - .last() - .map(|adj| adj.target) - .or_else(|| self.expr_ty_opt(expr)) + pub fn expr_ty_adjusted_opt(&self, expr: &hir::Expr<'_>) -> Option> { + self.expr_adjustments(expr).last().map(|adj| adj.target).or_else(|| self.expr_ty_opt(expr)) } - pub fn is_method_call(&self, expr: &hir::Expr) -> bool { + pub fn is_method_call(&self, expr: &hir::Expr<'_>) -> bool { // Only paths and method calls/overloaded operators have // entries in type_dependent_defs, ignore the former here. if let hir::ExprKind::Path(_) = expr.kind { @@ -644,34 +608,33 @@ impl<'tcx> TypeckTables<'tcx> { match self.type_dependent_defs().get(expr.hir_id) { Some(Ok((DefKind::Method, _))) => true, - _ => false + _ => false, } } + pub fn extract_binding_mode(&self, s: &Session, id: HirId, sp: Span) -> Option { + self.pat_binding_modes().get(id).copied().or_else(|| { + s.delay_span_bug(sp, "missing binding mode"); + None + }) + } + pub fn pat_binding_modes(&self) -> LocalTableInContext<'_, BindingMode> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.pat_binding_modes - } + LocalTableInContext { local_id_root: self.local_id_root, data: &self.pat_binding_modes } } - pub fn pat_binding_modes_mut(&mut self) - -> LocalTableInContextMut<'_, BindingMode> { + pub fn pat_binding_modes_mut(&mut self) -> LocalTableInContextMut<'_, BindingMode> { LocalTableInContextMut { local_id_root: self.local_id_root, - data: &mut self.pat_binding_modes + data: &mut self.pat_binding_modes, } } pub fn pat_adjustments(&self) -> LocalTableInContext<'_, Vec>> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.pat_adjustments, - } + LocalTableInContext { local_id_root: self.local_id_root, data: &self.pat_adjustments } } - pub fn pat_adjustments_mut(&mut self) - -> LocalTableInContextMut<'_, Vec>> { + pub fn pat_adjustments_mut(&mut self) -> LocalTableInContextMut<'_, Vec>> { LocalTableInContextMut { local_id_root: self.local_id_root, data: &mut self.pat_adjustments, @@ -683,44 +646,35 @@ impl<'tcx> TypeckTables<'tcx> { } pub fn closure_kind_origins(&self) -> LocalTableInContext<'_, (Span, ast::Name)> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.closure_kind_origins - } + LocalTableInContext { local_id_root: self.local_id_root, data: &self.closure_kind_origins } } pub fn closure_kind_origins_mut(&mut self) -> LocalTableInContextMut<'_, (Span, ast::Name)> { LocalTableInContextMut { local_id_root: self.local_id_root, - data: &mut self.closure_kind_origins + data: &mut self.closure_kind_origins, } } pub fn liberated_fn_sigs(&self) -> LocalTableInContext<'_, ty::FnSig<'tcx>> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.liberated_fn_sigs - } + LocalTableInContext { local_id_root: self.local_id_root, data: &self.liberated_fn_sigs } } pub fn liberated_fn_sigs_mut(&mut self) -> LocalTableInContextMut<'_, ty::FnSig<'tcx>> { LocalTableInContextMut { local_id_root: self.local_id_root, - data: &mut self.liberated_fn_sigs + data: &mut self.liberated_fn_sigs, } } pub fn fru_field_types(&self) -> LocalTableInContext<'_, Vec>> { - LocalTableInContext { - local_id_root: self.local_id_root, - data: &self.fru_field_types - } + LocalTableInContext { local_id_root: self.local_id_root, data: &self.fru_field_types } } pub fn fru_field_types_mut(&mut self) -> LocalTableInContextMut<'_, Vec>> { LocalTableInContextMut { local_id_root: self.local_id_root, - data: &mut self.fru_field_types + data: &mut self.fru_field_types, } } @@ -736,7 +690,6 @@ impl<'tcx> TypeckTables<'tcx> { pub fn coercion_casts(&self) -> &ItemLocalSet { &self.coercion_casts } - } impl<'a, 'tcx> HashStable> for TypeckTables<'tcx> { @@ -765,7 +718,6 @@ impl<'a, 'tcx> HashStable> for TypeckTables<'tcx> { ref concrete_opaque_types, ref upvar_list, ref generator_interior_types, - } = *self; hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { @@ -779,25 +731,19 @@ impl<'a, 'tcx> HashStable> for TypeckTables<'tcx> { pat_binding_modes.hash_stable(hcx, hasher); pat_adjustments.hash_stable(hcx, hasher); hash_stable_hashmap(hcx, hasher, upvar_capture_map, |up_var_id, hcx| { - let ty::UpvarId { - var_path, - closure_expr_id - } = *up_var_id; - - let local_id_root = - local_id_root.expect("trying to hash invalid TypeckTables"); - - let var_owner_def_id = DefId { - krate: local_id_root.krate, - index: var_path.hir_id.owner, - }; - let closure_def_id = DefId { - krate: local_id_root.krate, - index: closure_expr_id.to_def_id().index, - }; - (hcx.def_path_hash(var_owner_def_id), - var_path.hir_id.local_id, - hcx.def_path_hash(closure_def_id)) + let ty::UpvarId { var_path, closure_expr_id } = *up_var_id; + + let local_id_root = local_id_root.expect("trying to hash invalid TypeckTables"); + + let var_owner_def_id = + DefId { krate: local_id_root.krate, index: var_path.hir_id.owner }; + let closure_def_id = + DefId { krate: local_id_root.krate, index: closure_expr_id.to_def_id().index }; + ( + hcx.def_path_hash(var_owner_def_id), + var_path.hir_id.local_id, + hcx.def_path_hash(closure_def_id), + ) }); closure_kind_origins.hash_stable(hcx, hasher); @@ -877,7 +823,7 @@ impl CanonicalUserType<'tcx> { }, } }) - }, + } } } } @@ -919,10 +865,7 @@ impl<'tcx> CommonTypes<'tcx> { u128: mk(Uint(ast::UintTy::U128)), f32: mk(Float(ast::FloatTy::F32)), f64: mk(Float(ast::FloatTy::F64)), - self_param: mk(ty::Param(ty::ParamTy { - index: 0, - name: kw::SelfUpper, - })), + self_param: mk(ty::Param(ty::ParamTy { index: 0, name: kw::SelfUpper })), trait_object_dummy_self: mk(Infer(ty::FreshTy(0))), } @@ -931,11 +874,7 @@ impl<'tcx> CommonTypes<'tcx> { impl<'tcx> CommonLifetimes<'tcx> { fn new(interners: &CtxtInterners<'tcx>) -> CommonLifetimes<'tcx> { - let mk = |r| { - interners.region.intern(r, |r| { - Interned(interners.arena.alloc(r)) - }).0 - }; + let mk = |r| interners.region.intern(r, |r| Interned(interners.arena.alloc(r))).0; CommonLifetimes { re_empty: mk(RegionKind::ReEmpty), @@ -947,11 +886,7 @@ impl<'tcx> CommonLifetimes<'tcx> { impl<'tcx> CommonConsts<'tcx> { fn new(interners: &CtxtInterners<'tcx>, types: &CommonTypes<'tcx>) -> CommonConsts<'tcx> { - let mk_const = |c| { - interners.const_.intern(c, |c| { - Interned(interners.arena.alloc(c)) - }).0 - }; + let mk_const = |c| interners.const_.intern(c, |c| Interned(interners.arena.alloc(c))).0; CommonConsts { err: mk_const(ty::Const { @@ -1003,7 +938,11 @@ pub struct GlobalCtxt<'tcx> { pub sess: &'tcx Session, - pub lint_store: Lrc, + /// This only ever stores a `LintStore` but we don't want a dependency on that type here. + /// + /// FIXME(Centril): consider `dyn LintStoreMarker` once + /// we can upcast to `Any` for some additional type safety. + pub lint_store: Lrc, pub dep_graph: DepGraph, @@ -1023,9 +962,7 @@ pub struct GlobalCtxt<'tcx> { /// Map indicating what traits are in scope for places where this /// is relevant; generated by resolve. - trait_map: FxHashMap>>, + trait_map: FxHashMap>>, /// Export map produced by name resolution. export_map: FxHashMap>>, @@ -1092,13 +1029,17 @@ impl<'tcx> TyCtxt<'tcx> { self.arena.alloc(Steal::new(mir)) } - pub fn alloc_steal_promoted(self, promoted: IndexVec>) -> - &'tcx Steal>> { + pub fn alloc_steal_promoted( + self, + promoted: IndexVec>, + ) -> &'tcx Steal>> { self.arena.alloc(Steal::new(promoted)) } - pub fn intern_promoted(self, promoted: IndexVec>) -> - &'tcx IndexVec> { + pub fn intern_promoted( + self, + promoted: IndexVec>, + ) -> &'tcx IndexVec> { self.arena.alloc(promoted) } @@ -1114,9 +1055,7 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn intern_const_alloc(self, alloc: Allocation) -> &'tcx Allocation { - self.allocation_interner.intern(alloc, |alloc| { - self.arena.alloc(alloc) - }) + self.allocation_interner.intern(alloc, |alloc| self.arena.alloc(alloc)) } /// Allocates a read-only byte or string literal for `mir::interpret`. @@ -1128,21 +1067,15 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn intern_stability(self, stab: attr::Stability) -> &'tcx attr::Stability { - self.stability_interner.intern(stab, |stab| { - self.arena.alloc(stab) - }) + self.stability_interner.intern(stab, |stab| self.arena.alloc(stab)) } pub fn intern_const_stability(self, stab: attr::ConstStability) -> &'tcx attr::ConstStability { - self.const_stability_interner.intern(stab, |stab| { - self.arena.alloc(stab) - }) + self.const_stability_interner.intern(stab, |stab| self.arena.alloc(stab)) } pub fn intern_layout(self, layout: LayoutDetails) -> &'tcx LayoutDetails { - self.layout_interner.intern(layout, |layout| { - self.arena.alloc(layout) - }) + self.layout_interner.intern(layout, |layout| self.arena.alloc(layout)) } /// Returns a range of the start/end indices specified with the @@ -1162,8 +1095,10 @@ impl<'tcx> TyCtxt<'tcx> { } span_bug!(attr.span, "no arguments to `rustc_layout_scalar_valid_range` attribute"); }; - (get(sym::rustc_layout_scalar_valid_range_start), - get(sym::rustc_layout_scalar_valid_range_end)) + ( + get(sym::rustc_layout_scalar_valid_range_start), + get(sym::rustc_layout_scalar_valid_range_end), + ) } pub fn lift>(self, value: &T) -> Option { @@ -1176,10 +1111,9 @@ impl<'tcx> TyCtxt<'tcx> { /// reference to the context, to allow formatting values that need it. pub fn create_global_ctxt( s: &'tcx Session, - lint_store: Lrc, + lint_store: Lrc, local_providers: ty::query::Providers<'tcx>, extern_providers: ty::query::Providers<'tcx>, - arenas: &'tcx AllArenas, arena: &'tcx WorkerLocal>, resolutions: ty::ResolverOutputs, hir: hir_map::Map<'tcx>, @@ -1190,7 +1124,7 @@ impl<'tcx> TyCtxt<'tcx> { let data_layout = TargetDataLayout::parse(&s.target.target).unwrap_or_else(|err| { s.fatal(&err); }); - let interners = CtxtInterners::new(&arenas.interner); + let interners = CtxtInterners::new(arena); let common_types = CommonTypes::new(&interners); let common_lifetimes = CommonLifetimes::new(&interners); let common_consts = CommonConsts::new(&interners, &common_types); @@ -1211,10 +1145,8 @@ impl<'tcx> TyCtxt<'tcx> { // re-allocate when populating it. let capacity = def_path_tables.clone().map(|(_, t)| t.size()).sum::(); - let mut map: FxHashMap<_, _> = FxHashMap::with_capacity_and_hasher( - capacity, - ::std::default::Default::default() - ); + let mut map: FxHashMap<_, _> = + FxHashMap::with_capacity_and_hasher(capacity, ::std::default::Default::default()); for (cnum, def_path_table) in def_path_tables { def_path_table.add_def_path_hashes_to(cnum, &mut map); @@ -1245,33 +1177,34 @@ impl<'tcx> TyCtxt<'tcx> { consts: common_consts, extern_crate_map: resolutions.extern_crate_map, trait_map, - export_map: resolutions.export_map.into_iter().map(|(k, v)| { - let exports: Vec<_> = v.into_iter().map(|e| { - e.map_id(|id| hir.node_to_hir_id(id)) - }).collect(); - (k, exports) - }).collect(), - maybe_unused_trait_imports: - resolutions.maybe_unused_trait_imports - .into_iter() - .map(|id| hir.local_def_id_from_node_id(id)) - .collect(), - maybe_unused_extern_crates: - resolutions.maybe_unused_extern_crates - .into_iter() - .map(|(id, sp)| (hir.local_def_id_from_node_id(id), sp)) - .collect(), - glob_map: resolutions.glob_map.into_iter().map(|(id, names)| { - (hir.local_def_id_from_node_id(id), names) - }).collect(), + export_map: resolutions + .export_map + .into_iter() + .map(|(k, v)| { + let exports: Vec<_> = + v.into_iter().map(|e| e.map_id(|id| hir.node_to_hir_id(id))).collect(); + (k, exports) + }) + .collect(), + maybe_unused_trait_imports: resolutions + .maybe_unused_trait_imports + .into_iter() + .map(|id| hir.local_def_id_from_node_id(id)) + .collect(), + maybe_unused_extern_crates: resolutions + .maybe_unused_extern_crates + .into_iter() + .map(|(id, sp)| (hir.local_def_id_from_node_id(id), sp)) + .collect(), + glob_map: resolutions + .glob_map + .into_iter() + .map(|(id, names)| (hir.local_def_id_from_node_id(id), names)) + .collect(), extern_prelude: resolutions.extern_prelude, hir_map: hir, def_path_hash_to_def_id, - queries: query::Queries::new( - providers, - extern_providers, - on_disk_query_result_cache, - ), + queries: query::Queries::new(providers, extern_providers, on_disk_query_result_cache), rcache: Default::default(), selection_cache: Default::default(), evaluation_cache: Default::default(), @@ -1328,11 +1261,7 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn def_key(self, id: DefId) -> hir_map::DefKey { - if id.is_local() { - self.hir().def_key(id) - } else { - self.cstore.def_key(id) - } + if id.is_local() { self.hir().def_key(id) } else { self.cstore.def_key(id) } } /// Converts a `DefId` into its fully expanded `DefPath` (every @@ -1341,21 +1270,13 @@ impl<'tcx> TyCtxt<'tcx> { /// Note that if `id` is not local to this crate, the result will /// be a non-local `DefPath`. pub fn def_path(self, id: DefId) -> hir_map::DefPath { - if id.is_local() { - self.hir().def_path(id) - } else { - self.cstore.def_path(id) - } + if id.is_local() { self.hir().def_path(id) } else { self.cstore.def_path(id) } } /// Returns whether or not the crate with CrateNum 'cnum' /// is marked as a private dependency pub fn is_private_dep(self, cnum: CrateNum) -> bool { - if cnum == LOCAL_CRATE { - false - } else { - self.cstore.crate_is_private_dep_untracked(cnum) - } + if cnum == LOCAL_CRATE { false } else { self.cstore.crate_is_private_dep_untracked(cnum) } } #[inline] @@ -1373,26 +1294,29 @@ impl<'tcx> TyCtxt<'tcx> { // statements within the query system and we'd run into endless // recursion otherwise. let (crate_name, crate_disambiguator) = if def_id.is_local() { - (self.crate_name.clone(), - self.sess.local_crate_disambiguator()) + (self.crate_name, self.sess.local_crate_disambiguator()) } else { - (self.cstore.crate_name_untracked(def_id.krate), - self.cstore.crate_disambiguator_untracked(def_id.krate)) + ( + self.cstore.crate_name_untracked(def_id.krate), + self.cstore.crate_disambiguator_untracked(def_id.krate), + ) }; - format!("{}[{}]{}", - crate_name, - // Don't print the whole crate disambiguator. That's just - // annoying in debug output. - &(crate_disambiguator.to_fingerprint().to_hex())[..4], - self.def_path(def_id).to_string_no_crate()) + format!( + "{}[{}]{}", + crate_name, + // Don't print the whole crate disambiguator. That's just + // annoying in debug output. + &(crate_disambiguator.to_fingerprint().to_hex())[..4], + self.def_path(def_id).to_string_no_crate() + ) } pub fn metadata_encoding_version(self) -> Vec { self.cstore.metadata_encoding_version().to_vec() } - pub fn encode_metadata(self)-> EncodedMetadata { + pub fn encode_metadata(self) -> EncodedMetadata { let _prof_timer = self.prof.generic_activity("generate_crate_metadata"); self.cstore.encode_metadata(self) } @@ -1407,10 +1331,7 @@ impl<'tcx> TyCtxt<'tcx> { pub fn create_stable_hashing_context(self) -> StableHashingContext<'tcx> { let krate = self.gcx.hir_map.forest.untracked_krate(); - StableHashingContext::new(self.sess, - krate, - self.hir().definitions(), - &*self.cstore) + StableHashingContext::new(self.sess, krate, self.hir().definitions(), &*self.cstore) } // This method makes sure that we have a DepNode and a Fingerprint for @@ -1424,19 +1345,19 @@ impl<'tcx> TyCtxt<'tcx> { for cnum in self.cstore.crates_untracked() { let dep_node = DepNode::new(self, DepConstructor::CrateMetadata(cnum)); let crate_hash = self.cstore.crate_hash_untracked(cnum); - self.dep_graph.with_task(dep_node, - self, - crate_hash, - |_, x| x, // No transformation needed - dep_graph::hash_result, + self.dep_graph.with_task( + dep_node, + self, + crate_hash, + |_, x| x, // No transformation needed + dep_graph::hash_result, ); } } - pub fn serialize_query_result_cache(self, - encoder: &mut E) - -> Result<(), E::Error> - where E: ty::codec::TyEncoder + pub fn serialize_query_result_cache(self, encoder: &mut E) -> Result<(), E::Error> + where + E: ty::codec::TyEncoder, { self.queries.on_disk_cache.serialize(self, encoder) } @@ -1447,19 +1368,6 @@ impl<'tcx> TyCtxt<'tcx> { self.borrowck_mode().migrate() } - /// If `true`, make MIR codegen for `match` emit a temp that holds a - /// borrow of the input to the match expression. - pub fn generate_borrow_of_any_match_input(&self) -> bool { - self.emit_read_for_match() - } - - /// If `true`, make MIR codegen for `match` emit FakeRead - /// statements (which simulate the maximal effect of executing the - /// patterns in a match arm). - pub fn emit_read_for_match(&self) -> bool { - !self.sess.opts.debugging_opts.nll_dont_emit_read_for_match - } - /// What mode(s) of borrowck should we run? AST? MIR? both? /// (Also considers the `#![feature(nll)]` setting.) pub fn borrowck_mode(&self) -> BorrowckMode { @@ -1485,7 +1393,9 @@ impl<'tcx> TyCtxt<'tcx> { // // * Otherwise, use the behavior requested via `-Z borrowck=...` - if self.features().nll { return BorrowckMode::Mir; } + if self.features().nll { + return BorrowckMode::Mir; + } self.sess.opts.borrowck_mode } @@ -1496,18 +1406,18 @@ impl<'tcx> TyCtxt<'tcx> { self.sess.crate_types.borrow().iter().any(|crate_type| { match crate_type { - CrateType::Executable | - CrateType::Staticlib | - CrateType::ProcMacro | - CrateType::Cdylib => false, + CrateType::Executable + | CrateType::Staticlib + | CrateType::ProcMacro + | CrateType::Cdylib => false, // FIXME rust-lang/rust#64319, rust-lang/rust#64872: // We want to block export of generics from dylibs, // but we must fix rust-lang/rust#65890 before we can // do that robustly. - CrateType::Dylib => true, + CrateType::Dylib => true, - CrateType::Rlib => true, + CrateType::Rlib => true, } }) } @@ -1516,16 +1426,13 @@ impl<'tcx> TyCtxt<'tcx> { pub fn is_suitable_region(&self, region: Region<'tcx>) -> Option { let (suitable_region_binding_scope, bound_region) = match *region { ty::ReFree(ref free_region) => (free_region.scope, free_region.bound_region), - ty::ReEarlyBound(ref ebr) => ( - self.parent(ebr.def_id).unwrap(), - ty::BoundRegion::BrNamed(ebr.def_id, ebr.name), - ), + ty::ReEarlyBound(ref ebr) => { + (self.parent(ebr.def_id).unwrap(), ty::BoundRegion::BrNamed(ebr.def_id, ebr.name)) + } _ => return None, // not a free region }; - let hir_id = self.hir() - .as_local_hir_id(suitable_region_binding_scope) - .unwrap(); + let hir_id = self.hir().as_local_hir_id(suitable_region_binding_scope).unwrap(); let is_impl_item = match self.hir().find(hir_id) { Some(Node::Item(..)) | Some(Node::TraitItem(..)) => false, Some(Node::ImplItem(..)) => { @@ -1541,10 +1448,7 @@ impl<'tcx> TyCtxt<'tcx> { }); } - pub fn return_type_impl_trait( - &self, - scope_def_id: DefId, - ) -> Option<(Ty<'tcx>, Span)> { + pub fn return_type_impl_trait(&self, scope_def_id: DefId) -> Option<(Ty<'tcx>, Span)> { // HACK: `type_of_def_id()` will fail on these (#55796), so return `None`. let hir_id = self.hir().as_local_hir_id(scope_def_id).unwrap(); match self.hir().get(hir_id) { @@ -1571,18 +1475,13 @@ impl<'tcx> TyCtxt<'tcx> { None } } - _ => None + _ => None, } } // Checks if the bound region is in Impl Item. - pub fn is_bound_region_in_impl_item( - &self, - suitable_region_binding_scope: DefId, - ) -> bool { - let container_id = self.associated_item(suitable_region_binding_scope) - .container - .id(); + pub fn is_bound_region_in_impl_item(&self, suitable_region_binding_scope: DefId) -> bool { + let container_id = self.associated_item(suitable_region_binding_scope).container.id(); if self.impl_trait_ref(container_id).is_some() { // For now, we do not try to target impls of traits. This is // because this message is going to suggest that the user @@ -1619,9 +1518,7 @@ impl<'tcx> GlobalCtxt<'tcx> { where F: FnOnce(TyCtxt<'tcx>) -> R, { - let tcx = TyCtxt { - gcx: self, - }; + let tcx = TyCtxt { gcx: self }; ty::tls::with_related_context(tcx, |icx| { let new_icx = ty::tls::ImplicitCtxt { tcx, @@ -1630,9 +1527,7 @@ impl<'tcx> GlobalCtxt<'tcx> { layout_depth: icx.layout_depth, task_deps: icx.task_deps, }; - ty::tls::enter_context(&new_icx, |_| { - f(tcx) - }) + ty::tls::enter_context(&new_icx, |_| f(tcx)) }) } } @@ -1660,66 +1555,64 @@ pub trait Lift<'tcx>: fmt::Debug { } macro_rules! nop_lift { - ($ty:ty => $lifted:ty) => { + ($set:ident; $ty:ty => $lifted:ty) => { impl<'a, 'tcx> Lift<'tcx> for $ty { - type Lifted = $lifted; - fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - if tcx.interners.arena.in_arena(*self as *const _) { - Some(unsafe { mem::transmute(*self) }) - } else { - None - } - } + type Lifted = $lifted; + fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { + if tcx.interners.$set.contains_pointer_to(&Interned(*self)) { + Some(unsafe { mem::transmute(*self) }) + } else { + None } + } + } }; } macro_rules! nop_list_lift { - ($ty:ty => $lifted:ty) => { + ($set:ident; $ty:ty => $lifted:ty) => { impl<'a, 'tcx> Lift<'tcx> for &'a List<$ty> { - type Lifted = &'tcx List<$lifted>; - fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - if self.is_empty() { - return Some(List::empty()); - } - if tcx.interners.arena.in_arena(*self as *const _) { - Some(unsafe { mem::transmute(*self) }) - } else { - None - } - } + type Lifted = &'tcx List<$lifted>; + fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { + if self.is_empty() { + return Some(List::empty()); + } + if tcx.interners.$set.contains_pointer_to(&Interned(*self)) { + Some(unsafe { mem::transmute(*self) }) + } else { + None } + } + } }; } -nop_lift!{Ty<'a> => Ty<'tcx>} -nop_lift!{Region<'a> => Region<'tcx>} -nop_lift!{Goal<'a> => Goal<'tcx>} -nop_lift!{&'a Const<'a> => &'tcx Const<'tcx>} +nop_lift! {type_; Ty<'a> => Ty<'tcx>} +nop_lift! {region; Region<'a> => Region<'tcx>} +nop_lift! {goal; Goal<'a> => Goal<'tcx>} +nop_lift! {const_; &'a Const<'a> => &'tcx Const<'tcx>} -nop_list_lift!{Goal<'a> => Goal<'tcx>} -nop_list_lift!{Clause<'a> => Clause<'tcx>} -nop_list_lift!{Ty<'a> => Ty<'tcx>} -nop_list_lift!{ExistentialPredicate<'a> => ExistentialPredicate<'tcx>} -nop_list_lift!{Predicate<'a> => Predicate<'tcx>} -nop_list_lift!{CanonicalVarInfo => CanonicalVarInfo} -nop_list_lift!{ProjectionKind => ProjectionKind} +nop_list_lift! {goal_list; Goal<'a> => Goal<'tcx>} +nop_list_lift! {clauses; Clause<'a> => Clause<'tcx>} +nop_list_lift! {type_list; Ty<'a> => Ty<'tcx>} +nop_list_lift! {existential_predicates; ExistentialPredicate<'a> => ExistentialPredicate<'tcx>} +nop_list_lift! {predicates; Predicate<'a> => Predicate<'tcx>} +nop_list_lift! {canonical_var_infos; CanonicalVarInfo => CanonicalVarInfo} +nop_list_lift! {projs; ProjectionKind => ProjectionKind} // This is the impl for `&'a InternalSubsts<'a>`. -nop_list_lift!{GenericArg<'a> => GenericArg<'tcx>} +nop_list_lift! {substs; GenericArg<'a> => GenericArg<'tcx>} pub mod tls { - use super::{GlobalCtxt, TyCtxt, ptr_eq}; + use super::{ptr_eq, GlobalCtxt, TyCtxt}; - use std::fmt; - use std::mem; - use syntax_pos; + use crate::dep_graph::TaskDeps; use crate::ty::query; - use errors::{Diagnostic, TRACK_DIAGNOSTICS}; - use rustc_data_structures::OnDrop; - use rustc_data_structures::sync::{self, Lrc, Lock}; + use rustc_data_structures::sync::{self, Lock, Lrc}; use rustc_data_structures::thin_vec::ThinVec; - use crate::dep_graph::TaskDeps; + use rustc_data_structures::OnDrop; + use rustc_errors::Diagnostic; + use std::mem; #[cfg(not(parallel_compiler))] use std::cell::Cell; @@ -1795,66 +1688,13 @@ pub mod tls { TLV.with(|tlv| tlv.get()) } - /// This is a callback from libsyntax as it cannot access the implicit state - /// in librustc otherwise. - fn span_debug(span: syntax_pos::Span, f: &mut fmt::Formatter<'_>) -> fmt::Result { - with_opt(|tcx| { - if let Some(tcx) = tcx { - write!(f, "{}", tcx.sess.source_map().span_to_string(span)) - } else { - syntax_pos::default_span_debug(span, f) - } - }) - } - - /// This is a callback from libsyntax as it cannot access the implicit state - /// in librustc otherwise. It is used to when diagnostic messages are - /// emitted and stores them in the current query, if there is one. - fn track_diagnostic(diagnostic: &Diagnostic) { - with_context_opt(|icx| { - if let Some(icx) = icx { - if let Some(ref diagnostics) = icx.diagnostics { - let mut diagnostics = diagnostics.lock(); - diagnostics.extend(Some(diagnostic.clone())); - } - } - }) - } - - /// Sets up the callbacks from libsyntax on the current thread. - pub fn with_thread_locals(f: F) -> R - where F: FnOnce() -> R - { - syntax_pos::SPAN_DEBUG.with(|span_dbg| { - let original_span_debug = span_dbg.get(); - span_dbg.set(span_debug); - - let _on_drop = OnDrop(move || { - span_dbg.set(original_span_debug); - }); - - TRACK_DIAGNOSTICS.with(|current| { - let original = current.get(); - current.set(track_diagnostic); - - let _on_drop = OnDrop(move || { - current.set(original); - }); - - f() - }) - }) - } - /// Sets `context` as the new current `ImplicitCtxt` for the duration of the function `f`. #[inline] pub fn enter_context<'a, 'tcx, F, R>(context: &ImplicitCtxt<'a, 'tcx>, f: F) -> R where F: FnOnce(&ImplicitCtxt<'a, 'tcx>) -> R, { - set_tlv(context as *const _ as usize, || { - f(&context) - }) + set_tlv(context as *const _ as usize, || f(&context)) } /// Enters `GlobalCtxt` by setting up libsyntax callbacks and @@ -1874,19 +1714,10 @@ pub mod tls { GCX_PTR.with(|lock| *lock.lock() = 0); }); - let tcx = TyCtxt { - gcx, - }; - let icx = ImplicitCtxt { - tcx, - query: None, - diagnostics: None, - layout_depth: 0, - task_deps: None, - }; - enter_context(&icx, |_| { - f(tcx) - }) + let tcx = TyCtxt { gcx }; + let icx = + ImplicitCtxt { tcx, query: None, diagnostics: None, layout_depth: 0, task_deps: None }; + enter_context(&icx, |_| f(tcx)) } scoped_thread_local! { @@ -1904,16 +1735,9 @@ pub mod tls { let gcx = GCX_PTR.with(|lock| *lock.lock()); assert!(gcx != 0); let gcx = &*(gcx as *const GlobalCtxt<'_>); - let tcx = TyCtxt { - gcx, - }; - let icx = ImplicitCtxt { - query: None, - diagnostics: None, - tcx, - layout_depth: 0, - task_deps: None, - }; + let tcx = TyCtxt { gcx }; + let icx = + ImplicitCtxt { query: None, diagnostics: None, tcx, layout_depth: 0, task_deps: None }; enter_context(&icx, |_| f(tcx)) } @@ -1955,12 +1779,10 @@ pub mod tls { where F: FnOnce(&ImplicitCtxt<'_, 'tcx>) -> R, { - with_context(|context| { - unsafe { - assert!(ptr_eq(context.tcx.gcx, tcx.gcx)); - let context: &ImplicitCtxt<'_, '_> = mem::transmute(context); - f(context) - } + with_context(|context| unsafe { + assert!(ptr_eq(context.tcx.gcx, tcx.gcx)); + let context: &ImplicitCtxt<'_, '_> = mem::transmute(context); + f(context) }) } @@ -2062,9 +1884,27 @@ impl<'tcx> TyCtxt<'tcx> { pub fn print_debug_stats(self) { sty_debug_print!( self, - Adt, Array, Slice, RawPtr, Ref, FnDef, FnPtr, Placeholder, - Generator, GeneratorWitness, Dynamic, Closure, Tuple, Bound, - Param, Infer, UnnormalizedProjection, Projection, Opaque, Foreign); + Adt, + Array, + Slice, + RawPtr, + Ref, + FnDef, + FnPtr, + Placeholder, + Generator, + GeneratorWitness, + Dynamic, + Closure, + Tuple, + Bound, + Param, + Infer, + UnnormalizedProjection, + Projection, + Opaque, + Foreign + ); println!("InternalSubsts interner: #{}", self.interners.substs.len()); println!("Region interner: #{}", self.interners.region.len()); @@ -2075,17 +1915,21 @@ impl<'tcx> TyCtxt<'tcx> { } } - /// An entry in an interner. struct Interned<'tcx, T: ?Sized>(&'tcx T); -impl<'tcx, T: 'tcx+?Sized> Clone for Interned<'tcx, T> { +impl<'tcx, T: 'tcx + ?Sized> Clone for Interned<'tcx, T> { fn clone(&self) -> Self { Interned(self.0) } } -impl<'tcx, T: 'tcx+?Sized> Copy for Interned<'tcx, T> {} +impl<'tcx, T: 'tcx + ?Sized> Copy for Interned<'tcx, T> {} +impl<'tcx, T: 'tcx + ?Sized> IntoPointer for Interned<'tcx, T> { + fn into_pointer(&self) -> *const () { + self.0 as *const _ as *const () + } +} // N.B., an `Interned` compares and hashes as a `TyKind`. impl<'tcx> PartialEq for Interned<'tcx, TyS<'tcx>> { fn eq(&self, other: &Interned<'tcx, TyS<'tcx>>) -> bool { @@ -2141,15 +1985,13 @@ impl<'tcx> Borrow<[GenericArg<'tcx>]> for Interned<'tcx, InternalSubsts<'tcx>> { } } -impl<'tcx> Borrow<[ProjectionKind]> - for Interned<'tcx, List> { +impl<'tcx> Borrow<[ProjectionKind]> for Interned<'tcx, List> { fn borrow(&self) -> &[ProjectionKind] { &self.0[..] } } -impl<'tcx> Borrow<[PlaceElem<'tcx>]> - for Interned<'tcx, List>> { +impl<'tcx> Borrow<[PlaceElem<'tcx>]> for Interned<'tcx, List>> { fn borrow(&self) -> &[PlaceElem<'tcx>] { &self.0[..] } @@ -2240,7 +2082,7 @@ macro_rules! slice_interners { $(impl<'tcx> TyCtxt<'tcx> { pub fn $method(self, v: &[$ty]) -> &'tcx List<$ty> { self.interners.$field.intern_ref(v, || { - Interned(List::from_arena(&self.interners.arena, v)) + Interned(List::from_arena(&*self.arena, v)) }).0 } })+ @@ -2265,10 +2107,7 @@ impl<'tcx> TyCtxt<'tcx> { /// unsafe. pub fn safe_to_unsafe_fn_ty(self, sig: PolyFnSig<'tcx>) -> Ty<'tcx> { assert_eq!(sig.unsafety(), hir::Unsafety::Normal); - self.mk_fn_ptr(sig.map_bound(|sig| ty::FnSig { - unsafety: hir::Unsafety::Unsafe, - ..sig - })) + self.mk_fn_ptr(sig.map_bound(|sig| ty::FnSig { unsafety: hir::Unsafety::Unsafe, ..sig })) } /// Given a closure signature `sig`, returns an equivalent `fn` @@ -2282,18 +2121,10 @@ impl<'tcx> TyCtxt<'tcx> { pub fn coerce_closure_fn_ty(self, sig: PolyFnSig<'tcx>, unsafety: hir::Unsafety) -> Ty<'tcx> { let converted_sig = sig.map_bound(|s| { let params_iter = match s.inputs()[0].kind { - ty::Tuple(params) => { - params.into_iter().map(|k| k.expect_ty()) - } + ty::Tuple(params) => params.into_iter().map(|k| k.expect_ty()), _ => bug!(), }; - self.mk_fn_sig( - params_iter, - s.output(), - s.c_variadic, - unsafety, - abi::Abi::Rust, - ) + self.mk_fn_sig(params_iter, s.output(), s.c_variadic, unsafety, abi::Abi::Rust) }); self.mk_fn_ptr(converted_sig) @@ -2307,30 +2138,30 @@ impl<'tcx> TyCtxt<'tcx> { pub fn mk_mach_int(self, tm: ast::IntTy) -> Ty<'tcx> { match tm { - ast::IntTy::Isize => self.types.isize, - ast::IntTy::I8 => self.types.i8, - ast::IntTy::I16 => self.types.i16, - ast::IntTy::I32 => self.types.i32, - ast::IntTy::I64 => self.types.i64, - ast::IntTy::I128 => self.types.i128, + ast::IntTy::Isize => self.types.isize, + ast::IntTy::I8 => self.types.i8, + ast::IntTy::I16 => self.types.i16, + ast::IntTy::I32 => self.types.i32, + ast::IntTy::I64 => self.types.i64, + ast::IntTy::I128 => self.types.i128, } } pub fn mk_mach_uint(self, tm: ast::UintTy) -> Ty<'tcx> { match tm { - ast::UintTy::Usize => self.types.usize, - ast::UintTy::U8 => self.types.u8, - ast::UintTy::U16 => self.types.u16, - ast::UintTy::U32 => self.types.u32, - ast::UintTy::U64 => self.types.u64, - ast::UintTy::U128 => self.types.u128, + ast::UintTy::Usize => self.types.usize, + ast::UintTy::U8 => self.types.u8, + ast::UintTy::U16 => self.types.u16, + ast::UintTy::U32 => self.types.u32, + ast::UintTy::U64 => self.types.u64, + ast::UintTy::U128 => self.types.u128, } } pub fn mk_mach_float(self, tm: ast::FloatTy) -> Ty<'tcx> { match tm { - ast::FloatTy::F32 => self.types.f32, - ast::FloatTy::F64 => self.types.f64, + ast::FloatTy::F32 => self.types.f32, + ast::FloatTy::F64 => self.types.f64, } } @@ -2357,12 +2188,9 @@ impl<'tcx> TyCtxt<'tcx> { fn mk_generic_adt(self, wrapper_def_id: DefId, ty_param: Ty<'tcx>) -> Ty<'tcx> { let adt_def = self.adt_def(wrapper_def_id); - let substs = InternalSubsts::for_item(self, wrapper_def_id, |param, substs| { - match param.kind { - GenericParamDefKind::Lifetime | - GenericParamDefKind::Const => { - bug!() - } + let substs = + InternalSubsts::for_item(self, wrapper_def_id, |param, substs| match param.kind { + GenericParamDefKind::Lifetime | GenericParamDefKind::Const => bug!(), GenericParamDefKind::Type { has_default, .. } => { if param.index == 0 { ty_param.into() @@ -2371,8 +2199,7 @@ impl<'tcx> TyCtxt<'tcx> { self.type_of(param.def_id).subst(self, substs).into() } } - } - }); + }); self.mk_ty(Adt(adt_def, substs)) } @@ -2383,7 +2210,7 @@ impl<'tcx> TyCtxt<'tcx> { } #[inline] - pub fn mk_lang_item(self, ty: Ty<'tcx>, item: lang_items::LangItem) -> Option> { + pub fn mk_lang_item(self, ty: Ty<'tcx>, item: lang_items::LangItem) -> Option> { let def_id = self.lang_items().require(item).ok()?; Some(self.mk_generic_adt(def_id, ty)) } @@ -2406,22 +2233,22 @@ impl<'tcx> TyCtxt<'tcx> { #[inline] pub fn mk_mut_ref(self, r: Region<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> { - self.mk_ref(r, TypeAndMut {ty: ty, mutbl: hir::Mutability::Mutable}) + self.mk_ref(r, TypeAndMut { ty: ty, mutbl: hir::Mutability::Mut }) } #[inline] pub fn mk_imm_ref(self, r: Region<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> { - self.mk_ref(r, TypeAndMut {ty: ty, mutbl: hir::Mutability::Immutable}) + self.mk_ref(r, TypeAndMut { ty: ty, mutbl: hir::Mutability::Not }) } #[inline] pub fn mk_mut_ptr(self, ty: Ty<'tcx>) -> Ty<'tcx> { - self.mk_ptr(TypeAndMut {ty: ty, mutbl: hir::Mutability::Mutable}) + self.mk_ptr(TypeAndMut { ty: ty, mutbl: hir::Mutability::Mut }) } #[inline] pub fn mk_imm_ptr(self, ty: Ty<'tcx>) -> Ty<'tcx> { - self.mk_ptr(TypeAndMut {ty: ty, mutbl: hir::Mutability::Immutable}) + self.mk_ptr(TypeAndMut { ty: ty, mutbl: hir::Mutability::Not }) } #[inline] @@ -2459,11 +2286,7 @@ impl<'tcx> TyCtxt<'tcx> { #[inline] pub fn mk_diverging_default(self) -> Ty<'tcx> { - if self.features().never_type_fallback { - self.types.never - } else { - self.types.unit - } + if self.features().never_type_fallback { self.types.never } else { self.types.unit } } #[inline] @@ -2472,8 +2295,7 @@ impl<'tcx> TyCtxt<'tcx> { } #[inline] - pub fn mk_fn_def(self, def_id: DefId, - substs: SubstsRef<'tcx>) -> Ty<'tcx> { + pub fn mk_fn_def(self, def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> { self.mk_ty(FnDef(def_id, substs)) } @@ -2486,34 +2308,28 @@ impl<'tcx> TyCtxt<'tcx> { pub fn mk_dynamic( self, obj: ty::Binder<&'tcx List>>, - reg: ty::Region<'tcx> + reg: ty::Region<'tcx>, ) -> Ty<'tcx> { self.mk_ty(Dynamic(obj, reg)) } #[inline] - pub fn mk_projection(self, - item_def_id: DefId, - substs: SubstsRef<'tcx>) - -> Ty<'tcx> { - self.mk_ty(Projection(ProjectionTy { - item_def_id, - substs, - })) - } + pub fn mk_projection(self, item_def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> { + self.mk_ty(Projection(ProjectionTy { item_def_id, substs })) + } #[inline] - pub fn mk_closure(self, closure_id: DefId, closure_substs: SubstsRef<'tcx>) - -> Ty<'tcx> { + pub fn mk_closure(self, closure_id: DefId, closure_substs: SubstsRef<'tcx>) -> Ty<'tcx> { self.mk_ty(Closure(closure_id, closure_substs)) } #[inline] - pub fn mk_generator(self, - id: DefId, - generator_substs: SubstsRef<'tcx>, - movability: hir::Movability) - -> Ty<'tcx> { + pub fn mk_generator( + self, + id: DefId, + generator_substs: SubstsRef<'tcx>, + movability: hir::Movability, + ) -> Ty<'tcx> { self.mk_ty(Generator(id, generator_substs, movability)) } @@ -2529,10 +2345,7 @@ impl<'tcx> TyCtxt<'tcx> { #[inline] pub fn mk_const_var(self, v: ConstVid<'tcx>, ty: Ty<'tcx>) -> &'tcx Const<'tcx> { - self.mk_const(ty::Const { - val: ty::ConstKind::Infer(InferConst::Var(v)), - ty, - }) + self.mk_const(ty::Const { val: ty::ConstKind::Infer(InferConst::Var(v)), ty }) } #[inline] @@ -2551,15 +2364,8 @@ impl<'tcx> TyCtxt<'tcx> { } #[inline] - pub fn mk_const_infer( - self, - ic: InferConst<'tcx>, - ty: Ty<'tcx>, - ) -> &'tcx ty::Const<'tcx> { - self.mk_const(ty::Const { - val: ty::ConstKind::Infer(ic), - ty, - }) + pub fn mk_const_infer(self, ic: InferConst<'tcx>, ty: Ty<'tcx>) -> &'tcx ty::Const<'tcx> { + self.mk_const(ty::Const { val: ty::ConstKind::Infer(ic), ty }) } #[inline] @@ -2568,19 +2374,10 @@ impl<'tcx> TyCtxt<'tcx> { } #[inline] - pub fn mk_const_param( - self, - index: u32, - name: Symbol, - ty: Ty<'tcx> - ) -> &'tcx Const<'tcx> { - self.mk_const(ty::Const { - val: ty::ConstKind::Param(ParamConst { index, name }), - ty, - }) + pub fn mk_const_param(self, index: u32, name: Symbol, ty: Ty<'tcx>) -> &'tcx Const<'tcx> { + self.mk_const(ty::Const { val: ty::ConstKind::Param(ParamConst { index, name }), ty }) } - pub fn mk_param_from_def(self, param: &ty::GenericParamDef) -> GenericArg<'tcx> { match param.kind { GenericParamDefKind::Lifetime => { @@ -2637,18 +2434,19 @@ impl<'tcx> TyCtxt<'tcx> { let mut projection = place.projection.to_vec(); projection.push(elem); - Place { base: place.base, projection: self.intern_place_elems(&projection) } + Place { local: place.local, projection: self.intern_place_elems(&projection) } } - pub fn intern_existential_predicates(self, eps: &[ExistentialPredicate<'tcx>]) - -> &'tcx List> { + pub fn intern_existential_predicates( + self, + eps: &[ExistentialPredicate<'tcx>], + ) -> &'tcx List> { assert!(!eps.is_empty()); assert!(eps.windows(2).all(|w| w[0].stable_cmp(self, &w[1]) != Ordering::Greater)); self._intern_existential_predicates(eps) } - pub fn intern_predicates(self, preds: &[Predicate<'tcx>]) - -> &'tcx List> { + pub fn intern_predicates(self, preds: &[Predicate<'tcx>]) -> &'tcx List> { // FIXME consider asking the input slice to be sorted to avoid // re-interning permutations, in which case that would be asserted // here. @@ -2661,109 +2459,87 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn intern_type_list(self, ts: &[Ty<'tcx>]) -> &'tcx List> { - if ts.len() == 0 { - List::empty() - } else { - self._intern_type_list(ts) - } + if ts.len() == 0 { List::empty() } else { self._intern_type_list(ts) } } pub fn intern_substs(self, ts: &[GenericArg<'tcx>]) -> &'tcx List> { - if ts.len() == 0 { - List::empty() - } else { - self._intern_substs(ts) - } + if ts.len() == 0 { List::empty() } else { self._intern_substs(ts) } } pub fn intern_projs(self, ps: &[ProjectionKind]) -> &'tcx List { - if ps.len() == 0 { - List::empty() - } else { - self._intern_projs(ps) - } + if ps.len() == 0 { List::empty() } else { self._intern_projs(ps) } } pub fn intern_place_elems(self, ts: &[PlaceElem<'tcx>]) -> &'tcx List> { - if ts.len() == 0 { - List::empty() - } else { - self._intern_place_elems(ts) - } + if ts.len() == 0 { List::empty() } else { self._intern_place_elems(ts) } } pub fn intern_canonical_var_infos(self, ts: &[CanonicalVarInfo]) -> CanonicalVarInfos<'tcx> { - if ts.len() == 0 { - List::empty() - } else { - self._intern_canonical_var_infos(ts) - } + if ts.len() == 0 { List::empty() } else { self._intern_canonical_var_infos(ts) } } pub fn intern_clauses(self, ts: &[Clause<'tcx>]) -> Clauses<'tcx> { - if ts.len() == 0 { - List::empty() - } else { - self._intern_clauses(ts) - } + if ts.len() == 0 { List::empty() } else { self._intern_clauses(ts) } } pub fn intern_goals(self, ts: &[Goal<'tcx>]) -> Goals<'tcx> { - if ts.len() == 0 { - List::empty() - } else { - self._intern_goals(ts) - } + if ts.len() == 0 { List::empty() } else { self._intern_goals(ts) } } - pub fn mk_fn_sig(self, - inputs: I, - output: I::Item, - c_variadic: bool, - unsafety: hir::Unsafety, - abi: abi::Abi) - -> , ty::FnSig<'tcx>>>::Output + pub fn mk_fn_sig( + self, + inputs: I, + output: I::Item, + c_variadic: bool, + unsafety: hir::Unsafety, + abi: abi::Abi, + ) -> , ty::FnSig<'tcx>>>::Output where I: Iterator, ty::FnSig<'tcx>>>, { inputs.chain(iter::once(output)).intern_with(|xs| ty::FnSig { inputs_and_output: self.intern_type_list(xs), - c_variadic, unsafety, abi + c_variadic, + unsafety, + abi, }) } - pub fn mk_existential_predicates], - &'tcx List>>>(self, iter: I) - -> I::Output { + pub fn mk_existential_predicates< + I: InternAs<[ExistentialPredicate<'tcx>], &'tcx List>>, + >( + self, + iter: I, + ) -> I::Output { iter.intern_with(|xs| self.intern_existential_predicates(xs)) } - pub fn mk_predicates], - &'tcx List>>>(self, iter: I) - -> I::Output { + pub fn mk_predicates], &'tcx List>>>( + self, + iter: I, + ) -> I::Output { iter.intern_with(|xs| self.intern_predicates(xs)) } - pub fn mk_type_list], - &'tcx List>>>(self, iter: I) -> I::Output { + pub fn mk_type_list], &'tcx List>>>(self, iter: I) -> I::Output { iter.intern_with(|xs| self.intern_type_list(xs)) } - pub fn mk_substs], - &'tcx List>>>(self, iter: I) -> I::Output { + pub fn mk_substs], &'tcx List>>>( + self, + iter: I, + ) -> I::Output { iter.intern_with(|xs| self.intern_substs(xs)) } - pub fn mk_place_elems], - &'tcx List>>>(self, iter: I) -> I::Output { + pub fn mk_place_elems], &'tcx List>>>( + self, + iter: I, + ) -> I::Output { iter.intern_with(|xs| self.intern_place_elems(xs)) } - pub fn mk_substs_trait(self, - self_ty: Ty<'tcx>, - rest: &[GenericArg<'tcx>]) - -> SubstsRef<'tcx> - { + pub fn mk_substs_trait(self, self_ty: Ty<'tcx>, rest: &[GenericArg<'tcx>]) -> SubstsRef<'tcx> { self.mk_substs(iter::once(self_ty.into()).chain(rest.iter().cloned())) } @@ -2775,51 +2551,29 @@ impl<'tcx> TyCtxt<'tcx> { iter.intern_with(|xs| self.intern_goals(xs)) } - pub fn lint_hir>(self, - lint: &'static Lint, - hir_id: HirId, - span: S, - msg: &str) { + pub fn lint_hir( + self, + lint: &'static Lint, + hir_id: HirId, + span: impl Into, + msg: &str, + ) { self.struct_span_lint_hir(lint, hir_id, span.into(), msg).emit() } - pub fn lint_hir_note>(self, - lint: &'static Lint, - hir_id: HirId, - span: S, - msg: &str, - note: &str) { - let mut err = self.struct_span_lint_hir(lint, hir_id, span.into(), msg); - err.note(note); - err.emit() - } - - pub fn lint_node_note>(self, - lint: &'static Lint, - id: hir::HirId, - span: S, - msg: &str, - note: &str) { - let mut err = self.struct_span_lint_hir(lint, id, span.into(), msg); - err.note(note); - err.emit() - } - /// Walks upwards from `id` to find a node which might change lint levels with attributes. /// It stops at `bound` and just returns it if reached. - pub fn maybe_lint_level_root_bounded( - self, - mut id: hir::HirId, - bound: hir::HirId, - ) -> hir::HirId { + pub fn maybe_lint_level_root_bounded(self, mut id: HirId, bound: HirId) -> HirId { + let hir = self.hir(); loop { if id == bound { return bound; } - if lint::maybe_lint_level_root(self, id) { + + if hir.attrs(id).iter().any(|attr| Level::from_symbol(attr.name_or_empty()).is_some()) { return id; } - let next = self.hir().get_parent_node(id); + let next = hir.get_parent_node(id); if next == id { bug!("lint traversal reached the root of the crate"); } @@ -2830,12 +2584,12 @@ impl<'tcx> TyCtxt<'tcx> { pub fn lint_level_at_node( self, lint: &'static Lint, - mut id: hir::HirId - ) -> (lint::Level, lint::LintSource) { + mut id: hir::HirId, + ) -> (Level, LintSource) { let sets = self.lint_levels(LOCAL_CRATE); loop { if let Some(pair) = sets.level_and_source(lint, id, self.sess) { - return pair + return pair; } let next = self.hir().get_parent_node(id); if next == id { @@ -2845,38 +2599,37 @@ impl<'tcx> TyCtxt<'tcx> { } } - pub fn struct_span_lint_hir>(self, - lint: &'static Lint, - hir_id: HirId, - span: S, - msg: &str) - -> DiagnosticBuilder<'tcx> - { + pub fn struct_span_lint_hir( + self, + lint: &'static Lint, + hir_id: HirId, + span: impl Into, + msg: &str, + ) -> DiagnosticBuilder<'tcx> { let (level, src) = self.lint_level_at_node(lint, hir_id); - lint::struct_lint_level(self.sess, lint, level, src, Some(span.into()), msg) + struct_lint_level(self.sess, lint, level, src, Some(span.into()), msg) } - pub fn struct_lint_node(self, lint: &'static Lint, id: HirId, msg: &str) - -> DiagnosticBuilder<'tcx> - { + pub fn struct_lint_node( + self, + lint: &'static Lint, + id: HirId, + msg: &str, + ) -> DiagnosticBuilder<'tcx> { let (level, src) = self.lint_level_at_node(lint, id); - lint::struct_lint_level(self.sess, lint, level, src, None, msg) + struct_lint_level(self.sess, lint, level, src, None, msg) } pub fn in_scope_traits(self, id: HirId) -> Option<&'tcx StableVec> { - self.in_scope_traits_map(id.owner) - .and_then(|map| map.get(&id.local_id)) + self.in_scope_traits_map(id.owner).and_then(|map| map.get(&id.local_id)) } pub fn named_region(self, id: HirId) -> Option { - self.named_region_map(id.owner) - .and_then(|map| map.get(&id.local_id).cloned()) + self.named_region_map(id.owner).and_then(|map| map.get(&id.local_id).cloned()) } pub fn is_late_bound(self, id: HirId) -> bool { - self.is_late_bound_map(id.owner) - .map(|set| set.contains(&id.local_id)) - .unwrap_or(false) + self.is_late_bound_map(id.owner).map(|set| set.contains(&id.local_id)).unwrap_or(false) } pub fn object_lifetime_defaults(self, id: HirId) -> Option<&'tcx [ObjectLifetimeDefault]> { @@ -2888,44 +2641,52 @@ impl<'tcx> TyCtxt<'tcx> { pub trait InternAs { type Output; fn intern_with(self, f: F) -> Self::Output - where F: FnOnce(&T) -> R; + where + F: FnOnce(&T) -> R; } impl InternAs<[T], R> for I - where E: InternIteratorElement, - I: Iterator { +where + E: InternIteratorElement, + I: Iterator, +{ type Output = E::Output; fn intern_with(self, f: F) -> Self::Output - where F: FnOnce(&[T]) -> R { + where + F: FnOnce(&[T]) -> R, + { E::intern_with(self, f) } } pub trait InternIteratorElement: Sized { type Output; - fn intern_with, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output; + fn intern_with, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output; } impl InternIteratorElement for T { type Output = R; - fn intern_with, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output { + fn intern_with, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output { f(&iter.collect::>()) } } impl<'a, T, R> InternIteratorElement for &'a T - where T: Clone + 'a +where + T: Clone + 'a, { type Output = R; - fn intern_with, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output { + fn intern_with, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output { f(&iter.cloned().collect::>()) } } impl InternIteratorElement for Result { type Output = Result; - fn intern_with, F: FnOnce(&[T]) -> R>(mut iter: I, f: F) - -> Self::Output { + fn intern_with, F: FnOnce(&[T]) -> R>( + mut iter: I, + f: F, + ) -> Self::Output { // This code is hot enough that it's worth specializing for the most // common length lists, to avoid the overhead of `SmallVec` creation. // The match arms are in order of frequency. The 1, 2, and 0 cases are @@ -2947,9 +2708,7 @@ impl InternIteratorElement for Result { assert!(iter.next().is_none()); f(&[]) } - _ => { - f(&iter.collect::, _>>()?) - } + _ => f(&iter.collect::, _>>()?), }) } } @@ -2967,25 +2726,11 @@ pub fn provide(providers: &mut ty::query::Providers<'_>) { assert_eq!(id, LOCAL_CRATE); tcx.crate_name }; - providers.get_lib_features = |tcx, id| { - assert_eq!(id, LOCAL_CRATE); - tcx.arena.alloc(middle::lib_features::collect(tcx)) - }; providers.get_lang_items = |tcx, id| { assert_eq!(id, LOCAL_CRATE); tcx.arena.alloc(middle::lang_items::collect(tcx)) }; - providers.diagnostic_items = |tcx, id| { - assert_eq!(id, LOCAL_CRATE); - middle::diagnostic_items::collect(tcx) - }; - providers.all_diagnostic_items = |tcx, id| { - assert_eq!(id, LOCAL_CRATE); - middle::diagnostic_items::collect_all(tcx) - }; - providers.maybe_unused_trait_import = |tcx, id| { - tcx.maybe_unused_trait_imports.contains(&id) - }; + providers.maybe_unused_trait_import = |tcx, id| tcx.maybe_unused_trait_imports.contains(&id); providers.maybe_unused_extern_crates = |tcx, cnum| { assert_eq!(cnum, LOCAL_CRATE); &tcx.maybe_unused_extern_crates[..] @@ -2995,10 +2740,6 @@ pub fn provide(providers: &mut ty::query::Providers<'_>) { Lrc::new(tcx.glob_map.get(&id).cloned().unwrap_or_default()) }; - providers.stability_index = |tcx, cnum| { - assert_eq!(cnum, LOCAL_CRATE); - tcx.arena.alloc(stability::Index::new(tcx)) - }; providers.lookup_stability = |tcx, id| { assert_eq!(id.krate, LOCAL_CRATE); let id = tcx.hir().definitions().def_index_to_hir_id(id.index); diff --git a/src/librustc/ty/diagnostics.rs b/src/librustc/ty/diagnostics.rs index 3a55aefe85..d1eb21e25f 100644 --- a/src/librustc/ty/diagnostics.rs +++ b/src/librustc/ty/diagnostics.rs @@ -1,16 +1,23 @@ //! Diagnostics related methods for `TyS`. -use crate::ty::TyS; -use crate::ty::TyKind::*; use crate::ty::sty::InferTy; +use crate::ty::TyKind::*; +use crate::ty::TyS; impl<'tcx> TyS<'tcx> { /// Similar to `TyS::is_primitive`, but also considers inferred numeric values to be primitive. pub fn is_primitive_ty(&self) -> bool { match self.kind { - Bool | Char | Str | Int(_) | Uint(_) | Float(_) | - Infer(InferTy::IntVar(_)) | Infer(InferTy::FloatVar(_)) | - Infer(InferTy::FreshIntTy(_)) | Infer(InferTy::FreshFloatTy(_)) => true, + Bool + | Char + | Str + | Int(_) + | Uint(_) + | Float(_) + | Infer(InferTy::IntVar(_)) + | Infer(InferTy::FloatVar(_)) + | Infer(InferTy::FreshIntTy(_)) + | Infer(InferTy::FreshFloatTy(_)) => true, _ => false, } } @@ -19,9 +26,16 @@ impl<'tcx> TyS<'tcx> { /// description in error messages. This is used in the main error message. pub fn is_simple_ty(&self) -> bool { match self.kind { - Bool | Char | Str | Int(_) | Uint(_) | Float(_) | - Infer(InferTy::IntVar(_)) | Infer(InferTy::FloatVar(_)) | - Infer(InferTy::FreshIntTy(_)) | Infer(InferTy::FreshFloatTy(_)) => true, + Bool + | Char + | Str + | Int(_) + | Uint(_) + | Float(_) + | Infer(InferTy::IntVar(_)) + | Infer(InferTy::FloatVar(_)) + | Infer(InferTy::FreshIntTy(_)) + | Infer(InferTy::FreshFloatTy(_)) => true, Ref(_, x, _) | Array(x, _) | Slice(x) => x.peel_refs().is_simple_ty(), Tuple(tys) if tys.is_empty() => true, _ => false, @@ -43,13 +57,8 @@ impl<'tcx> TyS<'tcx> { /// Whether the type can be safely suggested during error recovery. pub fn is_suggestable(&self) -> bool { match self.kind { - Opaque(..) | - FnDef(..) | - FnPtr(..) | - Dynamic(..) | - Closure(..) | - Infer(..) | - Projection(..) => false, + Opaque(..) | FnDef(..) | FnPtr(..) | Dynamic(..) | Closure(..) | Infer(..) + | Projection(..) => false, _ => true, } } diff --git a/src/librustc/ty/erase_regions.rs b/src/librustc/ty/erase_regions.rs index 3dd1fd100f..4bf08096ed 100644 --- a/src/librustc/ty/erase_regions.rs +++ b/src/librustc/ty/erase_regions.rs @@ -1,11 +1,8 @@ +use crate::ty::fold::{TypeFoldable, TypeFolder}; use crate::ty::{self, Ty, TyCtxt, TypeFlags}; -use crate::ty::fold::{TypeFolder, TypeFoldable}; pub(super) fn provide(providers: &mut ty::query::Providers<'_>) { - *providers = ty::query::Providers { - erase_regions_ty, - ..*providers - }; + *providers = ty::query::Providers { erase_regions_ty, ..*providers }; } fn erase_regions_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> { @@ -19,7 +16,8 @@ impl<'tcx> TyCtxt<'tcx> { /// that late-bound regions remain, because they are important for /// subtyping, but they are anonymized and normalized as well).. pub fn erase_regions(self, value: &T) -> T - where T : TypeFoldable<'tcx> + where + T: TypeFoldable<'tcx>, { // If there's nothing to erase avoid performing the query at all if !value.has_type_flags(TypeFlags::HAS_RE_LATE_BOUND | TypeFlags::HAS_FREE_REGIONS) { @@ -42,15 +40,12 @@ impl TypeFolder<'tcx> for RegionEraserVisitor<'tcx> { } fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { - if ty.has_local_value() { - ty.super_fold_with(self) - } else { - self.tcx.erase_regions_ty(ty) - } + if ty.has_local_value() { ty.super_fold_with(self) } else { self.tcx.erase_regions_ty(ty) } } fn fold_binder(&mut self, t: &ty::Binder) -> ty::Binder - where T : TypeFoldable<'tcx> + where + T: TypeFoldable<'tcx>, { let u = self.tcx.anonymize_late_bound_regions(t); u.super_fold_with(self) @@ -67,7 +62,7 @@ impl TypeFolder<'tcx> for RegionEraserVisitor<'tcx> { // whenever a substitution occurs. match *r { ty::ReLateBound(..) => r, - _ => self.tcx.lifetimes.re_erased + _ => self.tcx.lifetimes.re_erased, } } } diff --git a/src/librustc/ty/error.rs b/src/librustc/ty/error.rs index be6d21564a..217ca0ca3f 100644 --- a/src/librustc/ty/error.rs +++ b/src/librustc/ty/error.rs @@ -1,12 +1,10 @@ -use crate::hir; -use crate::hir::def_id::DefId; use crate::ty::{self, BoundRegion, Region, Ty, TyCtxt}; - -use errors::{Applicability, DiagnosticBuilder}; +use rustc_errors::{pluralize, Applicability, DiagnosticBuilder}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_span::Span; use rustc_target::spec::abi; use syntax::ast; -use syntax::errors::pluralize; -use syntax_pos::Span; use std::borrow::Cow; use std::fmt; @@ -79,109 +77,102 @@ impl<'tcx> fmt::Display for TypeError<'tcx> { } } - let br_string = |br: ty::BoundRegion| { - match br { - ty::BrNamed(_, name) => format!(" {}", name), - _ => String::new(), - } + let br_string = |br: ty::BoundRegion| match br { + ty::BrNamed(_, name) => format!(" {}", name), + _ => String::new(), }; match *self { CyclicTy(_) => write!(f, "cyclic type of infinite size"), Mismatch => write!(f, "types differ"), UnsafetyMismatch(values) => { - write!(f, "expected {} fn, found {} fn", - values.expected, - values.found) + write!(f, "expected {} fn, found {} fn", values.expected, values.found) } AbiMismatch(values) => { - write!(f, "expected {} fn, found {} fn", - values.expected, - values.found) + write!(f, "expected {} fn, found {} fn", values.expected, values.found) } Mutability => write!(f, "types differ in mutability"), - TupleSize(values) => { - write!(f, "expected a tuple with {} element{}, \ + TupleSize(values) => write!( + f, + "expected a tuple with {} element{}, \ found one with {} element{}", - values.expected, - pluralize!(values.expected), - values.found, - pluralize!(values.found)) - } - FixedArraySize(values) => { - write!(f, "expected an array with a fixed size of {} element{}, \ + values.expected, + pluralize!(values.expected), + values.found, + pluralize!(values.found) + ), + FixedArraySize(values) => write!( + f, + "expected an array with a fixed size of {} element{}, \ found one with {} element{}", - values.expected, - pluralize!(values.expected), - values.found, - pluralize!(values.found)) - } - ArgCount => { - write!(f, "incorrect number of function parameters") - } - RegionsDoesNotOutlive(..) => { - write!(f, "lifetime mismatch") - } - RegionsInsufficientlyPolymorphic(br, _) => { - write!(f, - "expected bound lifetime parameter{}, found concrete lifetime", - br_string(br)) - } - RegionsOverlyPolymorphic(br, _) => { - write!(f, - "expected concrete lifetime, found bound lifetime parameter{}", - br_string(br)) - } - RegionsPlaceholderMismatch => { - write!(f, "one type is more general than the other") - } + values.expected, + pluralize!(values.expected), + values.found, + pluralize!(values.found) + ), + ArgCount => write!(f, "incorrect number of function parameters"), + RegionsDoesNotOutlive(..) => write!(f, "lifetime mismatch"), + RegionsInsufficientlyPolymorphic(br, _) => write!( + f, + "expected bound lifetime parameter{}, found concrete lifetime", + br_string(br) + ), + RegionsOverlyPolymorphic(br, _) => write!( + f, + "expected concrete lifetime, found bound lifetime parameter{}", + br_string(br) + ), + RegionsPlaceholderMismatch => write!(f, "one type is more general than the other"), Sorts(values) => ty::tls::with(|tcx| { - report_maybe_different(f, &values.expected.sort_string(tcx), - &values.found.sort_string(tcx)) + report_maybe_different( + f, + &values.expected.sort_string(tcx), + &values.found.sort_string(tcx), + ) }), Traits(values) => ty::tls::with(|tcx| { - report_maybe_different(f, - &format!("trait `{}`", - tcx.def_path_str(values.expected)), - &format!("trait `{}`", - tcx.def_path_str(values.found))) + report_maybe_different( + f, + &format!("trait `{}`", tcx.def_path_str(values.expected)), + &format!("trait `{}`", tcx.def_path_str(values.found)), + ) }), IntMismatch(ref values) => { - write!(f, "expected `{:?}`, found `{:?}`", - values.expected, - values.found) + write!(f, "expected `{:?}`, found `{:?}`", values.expected, values.found) } FloatMismatch(ref values) => { - write!(f, "expected `{:?}`, found `{:?}`", - values.expected, - values.found) - } - VariadicMismatch(ref values) => { - write!(f, "expected {} fn, found {} function", - if values.expected { "variadic" } else { "non-variadic" }, - if values.found { "variadic" } else { "non-variadic" }) + write!(f, "expected `{:?}`, found `{:?}`", values.expected, values.found) } + VariadicMismatch(ref values) => write!( + f, + "expected {} fn, found {} function", + if values.expected { "variadic" } else { "non-variadic" }, + if values.found { "variadic" } else { "non-variadic" } + ), ProjectionMismatched(ref values) => ty::tls::with(|tcx| { - write!(f, "expected {}, found {}", - tcx.def_path_str(values.expected), - tcx.def_path_str(values.found)) + write!( + f, + "expected {}, found {}", + tcx.def_path_str(values.expected), + tcx.def_path_str(values.found) + ) }), - ProjectionBoundsLength(ref values) => { - write!(f, "expected {} associated type binding{}, found {}", - values.expected, - pluralize!(values.expected), - values.found) - }, - ExistentialMismatch(ref values) => { - report_maybe_different(f, &format!("trait `{}`", values.expected), - &format!("trait `{}`", values.found)) - } + ProjectionBoundsLength(ref values) => write!( + f, + "expected {} associated type binding{}, found {}", + values.expected, + pluralize!(values.expected), + values.found + ), + ExistentialMismatch(ref values) => report_maybe_different( + f, + &format!("trait `{}`", values.expected), + &format!("trait `{}`", values.found), + ), ConstMismatch(ref values) => { write!(f, "expected `{}`, found `{}`", values.expected, values.found) } - IntrinsicCast => { - write!(f, "cannot coerce intrinsics to function pointers") - } + IntrinsicCast => write!(f, "cannot coerce intrinsics to function pointers"), ObjectUnsafeCoercion(_) => write!(f, "coercion to object-unsafe trait object"), } } @@ -191,30 +182,23 @@ impl<'tcx> TypeError<'tcx> { pub fn must_include_note(&self) -> bool { use self::TypeError::*; match self { - CyclicTy(_) | - UnsafetyMismatch(_) | - Mismatch | - AbiMismatch(_) | - FixedArraySize(_) | - Sorts(_) | - IntMismatch(_) | - FloatMismatch(_) | - VariadicMismatch(_) => false, + CyclicTy(_) | UnsafetyMismatch(_) | Mismatch | AbiMismatch(_) | FixedArraySize(_) + | Sorts(_) | IntMismatch(_) | FloatMismatch(_) | VariadicMismatch(_) => false, - Mutability | - TupleSize(_) | - ArgCount | - RegionsDoesNotOutlive(..) | - RegionsInsufficientlyPolymorphic(..) | - RegionsOverlyPolymorphic(..) | - RegionsPlaceholderMismatch | - Traits(_) | - ProjectionMismatched(_) | - ProjectionBoundsLength(_) | - ExistentialMismatch(_) | - ConstMismatch(_) | - IntrinsicCast | - ObjectUnsafeCoercion(_) => true, + Mutability + | TupleSize(_) + | ArgCount + | RegionsDoesNotOutlive(..) + | RegionsInsufficientlyPolymorphic(..) + | RegionsOverlyPolymorphic(..) + | RegionsPlaceholderMismatch + | Traits(_) + | ProjectionMismatched(_) + | ProjectionBoundsLength(_) + | ExistentialMismatch(_) + | ConstMismatch(_) + | IntrinsicCast + | ObjectUnsafeCoercion(_) => true, } } } @@ -222,8 +206,9 @@ impl<'tcx> TypeError<'tcx> { impl<'tcx> ty::TyS<'tcx> { pub fn sort_string(&self, tcx: TyCtxt<'_>) -> Cow<'static, str> { match self.kind { - ty::Bool | ty::Char | ty::Int(_) | - ty::Uint(_) | ty::Float(_) | ty::Str | ty::Never => format!("`{}`", self).into(), + ty::Bool | ty::Char | ty::Int(_) | ty::Uint(_) | ty::Float(_) | ty::Str | ty::Never => { + format!("`{}`", self).into() + } ty::Tuple(ref tys) if tys.is_empty() => format!("`{}`", self).into(), ty::Adt(def, _) => format!("{} `{}`", def.descr(), tcx.def_path_str(def.did)).into(), @@ -242,24 +227,26 @@ impl<'tcx> ty::TyS<'tcx> { ty::Ref(_, ty, mutbl) => { let tymut = ty::TypeAndMut { ty, mutbl }; let tymut_string = tymut.to_string(); - if tymut_string != "_" && ( - ty.is_simple_text() || tymut_string.len() < "mutable reference".len() - ) { + if tymut_string != "_" + && (ty.is_simple_text() || tymut_string.len() < "mutable reference".len()) + { format!("`&{}`", tymut_string).into() - } else { // Unknown type name, it's long or has type arguments + } else { + // Unknown type name, it's long or has type arguments match mutbl { - hir::Mutability::Mutable => "mutable reference", + hir::Mutability::Mut => "mutable reference", _ => "reference", - }.into() + } + .into() } } ty::FnDef(..) => "fn item".into(), ty::FnPtr(_) => "fn pointer".into(), ty::Dynamic(ref inner, ..) => { if let Some(principal) = inner.principal() { - format!("trait `{}`", tcx.def_path_str(principal.def_id())).into() + format!("trait object `dyn {}`", tcx.def_path_str(principal.def_id())).into() } else { - "trait".into() + "trait object".into() } } ty::Closure(..) => "closure".into(), @@ -284,8 +271,15 @@ impl<'tcx> ty::TyS<'tcx> { pub fn prefix_string(&self) -> Cow<'static, str> { match self.kind { - ty::Infer(_) | ty::Error | ty::Bool | ty::Char | ty::Int(_) | - ty::Uint(_) | ty::Float(_) | ty::Str | ty::Never => "type".into(), + ty::Infer(_) + | ty::Error + | ty::Bool + | ty::Char + | ty::Int(_) + | ty::Uint(_) + | ty::Float(_) + | ty::Str + | ty::Never => "type".into(), ty::Tuple(ref tys) if tys.is_empty() => "unit type".into(), ty::Adt(def, _) => def.descr().into(), ty::Foreign(_) => "extern type".into(), @@ -293,9 +287,10 @@ impl<'tcx> ty::TyS<'tcx> { ty::Slice(_) => "slice".into(), ty::RawPtr(_) => "raw pointer".into(), ty::Ref(.., mutbl) => match mutbl { - hir::Mutability::Mutable => "mutable reference", - _ => "reference" - }.into(), + hir::Mutability::Mut => "mutable reference", + _ => "reference", + } + .into(), ty::FnDef(..) => "fn item".into(), ty::FnPtr(_) => "fn pointer".into(), ty::Dynamic(..) => "trait object".into(), @@ -331,29 +326,36 @@ impl<'tcx> TyCtxt<'tcx> { db.note("no two closures, even if identical, have the same type"); db.help("consider boxing your closure and/or using it as a trait object"); } - if expected_str == found_str && expected_str == "opaque type" { // Issue #63167 + if expected_str == found_str && expected_str == "opaque type" { + // Issue #63167 db.note("distinct uses of `impl Trait` result in different opaque types"); let e_str = values.expected.to_string(); let f_str = values.found.to_string(); if &e_str == &f_str && &e_str == "impl std::future::Future" { // FIXME: use non-string based check. - db.help("if both `Future`s have the same `Output` type, consider \ - `.await`ing on both of them"); + db.help( + "if both `Future`s have the same `Output` type, consider \ + `.await`ing on both of them", + ); } } match (&values.expected.kind, &values.found.kind) { - (ty::Float(_), ty::Infer(ty::IntVar(_))) => if let Ok( // Issue #53280 - snippet, - ) = self.sess.source_map().span_to_snippet(sp) { - if snippet.chars().all(|c| c.is_digit(10) || c == '-' || c == '_') { - db.span_suggestion( - sp, - "use a float literal", - format!("{}.0", snippet), - Applicability::MachineApplicable - ); + (ty::Float(_), ty::Infer(ty::IntVar(_))) => { + if let Ok( + // Issue #53280 + snippet, + ) = self.sess.source_map().span_to_snippet(sp) + { + if snippet.chars().all(|c| c.is_digit(10) || c == '-' || c == '_') { + db.span_suggestion( + sp, + "use a float literal", + format!("{}.0", snippet), + Applicability::MachineApplicable, + ); + } } - }, + } (ty::Param(expected), ty::Param(found)) => { let generics = self.generics_of(body_owner_def_id); let e_span = self.def_span(generics.type_param(expected, self).def_id); @@ -364,11 +366,15 @@ impl<'tcx> TyCtxt<'tcx> { if !sp.contains(f_span) { db.span_label(f_span, "found type parameter"); } - db.note("a type parameter was expected, but a different one was found; \ - you might be missing a type parameter or trait bound"); - db.note("for more information, visit \ + db.note( + "a type parameter was expected, but a different one was found; \ + you might be missing a type parameter or trait bound", + ); + db.note( + "for more information, visit \ https://doc.rust-lang.org/book/ch10-02-traits.html\ - #traits-as-parameters"); + #traits-as-parameters", + ); } (ty::Projection(_), ty::Projection(_)) => { db.note("an associated type was expected, but a different one was found"); @@ -384,7 +390,8 @@ impl<'tcx> TyCtxt<'tcx> { } db.help("type parameters must be constrained to match other types"); if self.sess.teach(&db.get_code().unwrap()) { - db.help("given a type parameter `T` and a method `foo`: + db.help( + "given a type parameter `T` and a method `foo`: ``` trait Trait { fn foo(&self) -> T; } ``` @@ -406,22 +413,24 @@ impl Trait for X { impl Trait for X { fn foo(&self, x: T) -> T { x } } -```"); +```", + ); } - db.note("for more information, visit \ + db.note( + "for more information, visit \ https://doc.rust-lang.org/book/ch10-02-traits.html\ - #traits-as-parameters"); + #traits-as-parameters", + ); } (ty::Projection(_), _) => { db.note(&format!( "consider constraining the associated type `{}` to `{}` or calling a \ method that returns `{}`", - values.expected, - values.found, - values.expected, + values.expected, values.found, values.expected, )); if self.sess.teach(&db.get_code().unwrap()) { - db.help("given an associated type `T` and a method `foo`: + db.help( + "given an associated type `T` and a method `foo`: ``` trait Trait { type T; @@ -434,36 +443,39 @@ impl Trait for X { type T = String; fn foo(&self) -> Self::T { String::new() } } -```"); +```", + ); } - db.note("for more information, visit \ - https://doc.rust-lang.org/book/ch19-03-advanced-traits.html"); + db.note( + "for more information, visit \ + https://doc.rust-lang.org/book/ch19-03-advanced-traits.html", + ); } (_, ty::Projection(_)) => { db.note(&format!( "consider constraining the associated type `{}` to `{}`", - values.found, - values.expected, + values.found, values.expected, )); - db.note("for more information, visit \ - https://doc.rust-lang.org/book/ch19-03-advanced-traits.html"); + db.note( + "for more information, visit \ + https://doc.rust-lang.org/book/ch19-03-advanced-traits.html", + ); } _ => {} } debug!( "note_and_explain_type_err expected={:?} ({:?}) found={:?} ({:?})", - values.expected, - values.expected.kind, - values.found, - values.found.kind, + values.expected, values.expected.kind, values.found, values.found.kind, ); - }, + } CyclicTy(ty) => { // Watch out for various cases of cyclic types and try to explain. if ty.is_closure() || ty.is_generator() { - db.note("closures cannot capture themselves or take themselves as argument;\n\ + db.note( + "closures cannot capture themselves or take themselves as argument;\n\ this error may be the result of a recent compiler bug-fix,\n\ - see https://github.com/rust-lang/rust/issues/46062 for more details"); + see https://github.com/rust-lang/rust/issues/46062 for more details", + ); } } _ => {} diff --git a/src/librustc/ty/fast_reject.rs b/src/librustc/ty/fast_reject.rs index 27a09b394b..5aa8bd9df2 100644 --- a/src/librustc/ty/fast_reject.rs +++ b/src/librustc/ty/fast_reject.rs @@ -1,11 +1,11 @@ -use crate::hir::def_id::DefId; use crate::ich::StableHashingContext; -use rustc_data_structures::stable_hasher::{StableHasher, HashStable}; +use crate::ty::{self, Ty, TyCtxt}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_hir::def_id::DefId; use std::fmt::Debug; use std::hash::Hash; use std::mem; use syntax::ast; -use crate::ty::{self, Ty, TyCtxt}; use self::SimplifiedTypeGen::*; @@ -19,7 +19,8 @@ pub type SimplifiedType = SimplifiedTypeGen; /// the non-stable but fast to construct DefId-version is the better choice. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, RustcEncodable, RustcDecodable)] pub enum SimplifiedTypeGen - where D: Copy + Debug + Ord + Eq +where + D: Copy + Debug + Ord + Eq, { BoolSimplifiedType, CharSimplifiedType, @@ -69,37 +70,26 @@ pub fn simplify_type( ty::Str => Some(StrSimplifiedType), ty::Array(..) | ty::Slice(_) => Some(ArraySimplifiedType), ty::RawPtr(_) => Some(PtrSimplifiedType), - ty::Dynamic(ref trait_info, ..) => { - match trait_info.principal_def_id() { - Some(principal_def_id) if !tcx.trait_is_auto(principal_def_id) => { - Some(TraitSimplifiedType(principal_def_id)) - } - _ => Some(MarkerTraitObjectSimplifiedType) + ty::Dynamic(ref trait_info, ..) => match trait_info.principal_def_id() { + Some(principal_def_id) if !tcx.trait_is_auto(principal_def_id) => { + Some(TraitSimplifiedType(principal_def_id)) } - } + _ => Some(MarkerTraitObjectSimplifiedType), + }, ty::Ref(_, ty, _) => { // since we introduce auto-refs during method lookup, we // just treat &T and T as equivalent from the point of // view of possibly unifying simplify_type(tcx, ty, can_simplify_params) } - ty::FnDef(def_id, _) | - ty::Closure(def_id, _) => { - Some(ClosureSimplifiedType(def_id)) - } - ty::Generator(def_id, _, _) => { - Some(GeneratorSimplifiedType(def_id)) - } + ty::FnDef(def_id, _) | ty::Closure(def_id, _) => Some(ClosureSimplifiedType(def_id)), + ty::Generator(def_id, _, _) => Some(GeneratorSimplifiedType(def_id)), ty::GeneratorWitness(ref tys) => { Some(GeneratorWitnessSimplifiedType(tys.skip_binder().len())) } ty::Never => Some(NeverSimplifiedType), - ty::Tuple(ref tys) => { - Some(TupleSimplifiedType(tys.len())) - } - ty::FnPtr(ref f) => { - Some(FunctionSimplifiedType(f.skip_binder().inputs().len())) - } + ty::Tuple(ref tys) => Some(TupleSimplifiedType(tys.len())), + ty::FnPtr(ref f) => Some(FunctionSimplifiedType(f.skip_binder().inputs().len())), ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"), ty::Projection(_) | ty::Param(_) => { if can_simplify_params { @@ -113,20 +103,17 @@ pub fn simplify_type( None } } - ty::Opaque(def_id, _) => { - Some(OpaqueSimplifiedType(def_id)) - } - ty::Foreign(def_id) => { - Some(ForeignSimplifiedType(def_id)) - } + ty::Opaque(def_id, _) => Some(OpaqueSimplifiedType(def_id)), + ty::Foreign(def_id) => Some(ForeignSimplifiedType(def_id)), ty::Placeholder(..) | ty::Bound(..) | ty::Infer(_) | ty::Error => None, } } impl SimplifiedTypeGen { pub fn map_def(self, map: F) -> SimplifiedTypeGen - where F: Fn(D) -> U, - U: Copy + Debug + Ord + Eq, + where + F: Fn(D) -> U, + U: Copy + Debug + Ord + Eq, { match self { BoolSimplifiedType => BoolSimplifiedType, @@ -160,14 +147,14 @@ where fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { mem::discriminant(self).hash_stable(hcx, hasher); match *self { - BoolSimplifiedType | - CharSimplifiedType | - StrSimplifiedType | - ArraySimplifiedType | - PtrSimplifiedType | - NeverSimplifiedType | - ParameterSimplifiedType | - MarkerTraitObjectSimplifiedType => { + BoolSimplifiedType + | CharSimplifiedType + | StrSimplifiedType + | ArraySimplifiedType + | PtrSimplifiedType + | NeverSimplifiedType + | ParameterSimplifiedType + | MarkerTraitObjectSimplifiedType => { // nothing to do } IntSimplifiedType(t) => t.hash_stable(hcx, hasher), diff --git a/src/librustc/ty/flags.rs b/src/librustc/ty/flags.rs index aee0ec7806..4a4280ba7d 100644 --- a/src/librustc/ty/flags.rs +++ b/src/librustc/ty/flags.rs @@ -1,5 +1,5 @@ -use crate::ty::subst::{SubstsRef, GenericArgKind}; -use crate::ty::{self, Ty, TypeFlags, InferConst}; +use crate::ty::subst::{GenericArgKind, SubstsRef}; +use crate::ty::{self, InferConst, Ty, TypeFlags}; #[derive(Debug)] pub struct FlagComputation { @@ -11,10 +11,7 @@ pub struct FlagComputation { impl FlagComputation { fn new() -> FlagComputation { - FlagComputation { - flags: TypeFlags::empty(), - outer_exclusive_binder: ty::INNERMOST, - } + FlagComputation { flags: TypeFlags::empty(), outer_exclusive_binder: ty::INNERMOST } } #[allow(rustc::usage_of_ty_tykind)] @@ -64,15 +61,14 @@ impl FlagComputation { #[allow(rustc::usage_of_ty_tykind)] fn add_kind(&mut self, kind: &ty::TyKind<'_>) { match kind { - &ty::Bool | - &ty::Char | - &ty::Int(_) | - &ty::Float(_) | - &ty::Uint(_) | - &ty::Never | - &ty::Str | - &ty::Foreign(..) => { - } + &ty::Bool + | &ty::Char + | &ty::Int(_) + | &ty::Float(_) + | &ty::Uint(_) + | &ty::Never + | &ty::Str + | &ty::Foreign(..) => {} // You might think that we could just return Error for // any type containing Error as a component, and get @@ -81,9 +77,7 @@ impl FlagComputation { // But doing so caused sporadic memory corruption, and // neither I (tjc) nor nmatsakis could figure out why, // so we're doing it this way. - &ty::Error => { - self.add_flags(TypeFlags::HAS_TY_ERR) - } + &ty::Error => self.add_flags(TypeFlags::HAS_TY_ERR), &ty::Param(_) => { self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES); @@ -121,13 +115,9 @@ impl FlagComputation { self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES); // it might, right? self.add_flags(TypeFlags::HAS_TY_INFER); match infer { - ty::FreshTy(_) | - ty::FreshIntTy(_) | - ty::FreshFloatTy(_) => {} + ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_) => {} - ty::TyVar(_) | - ty::IntVar(_) | - ty::FloatVar(_) => { + ty::TyVar(_) | ty::IntVar(_) | ty::FloatVar(_) => { self.add_flags(TypeFlags::KEEP_IN_LOCAL_TCX) } } @@ -145,7 +135,7 @@ impl FlagComputation { &ty::UnnormalizedProjection(ref data) => { self.add_flags(TypeFlags::HAS_PROJECTION); self.add_projection_ty(data); - }, + } &ty::Opaque(_, substs) => { self.add_flags(TypeFlags::HAS_PROJECTION); @@ -174,9 +164,7 @@ impl FlagComputation { self.add_const(len); } - &ty::Slice(tt) => { - self.add_ty(tt) - } + &ty::Slice(tt) => self.add_ty(tt), &ty::RawPtr(ref m) => { self.add_ty(m.ty); @@ -231,10 +219,10 @@ impl FlagComputation { fn add_const(&mut self, c: &ty::Const<'_>) { self.add_ty(c.ty); match c.val { - ty::ConstKind::Unevaluated(_, substs) => { + ty::ConstKind::Unevaluated(_, substs, _) => { self.add_substs(substs); self.add_flags(TypeFlags::HAS_PROJECTION); - }, + } ty::ConstKind::Infer(infer) => { self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES | TypeFlags::HAS_CT_INFER); match infer { diff --git a/src/librustc/ty/fold.rs b/src/librustc/ty/fold.rs index 8b78b0f335..0dddca98c6 100644 --- a/src/librustc/ty/fold.rs +++ b/src/librustc/ty/fold.rs @@ -31,12 +31,12 @@ //! These methods return true to indicate that the visitor has found what it is //! looking for, and does not need to visit anything else. -use crate::hir::def_id::DefId; -use crate::ty::{self, Binder, Ty, TyCtxt, TypeFlags, flags::FlagComputation}; +use crate::ty::{self, flags::FlagComputation, Binder, Ty, TyCtxt, TypeFlags}; +use rustc_hir::def_id::DefId; +use rustc_data_structures::fx::FxHashSet; use std::collections::BTreeMap; use std::fmt; -use crate::util::nodemap::FxHashSet; /// This trait is implemented for every type that can be folded. /// Basically, every type that has a corresponding method in `TypeFolder`. @@ -94,14 +94,14 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone { } fn needs_infer(&self) -> bool { self.has_type_flags( - TypeFlags::HAS_TY_INFER | TypeFlags::HAS_RE_INFER | TypeFlags::HAS_CT_INFER + TypeFlags::HAS_TY_INFER | TypeFlags::HAS_RE_INFER | TypeFlags::HAS_CT_INFER, ) } fn has_placeholders(&self) -> bool { self.has_type_flags( - TypeFlags::HAS_RE_PLACEHOLDER | - TypeFlags::HAS_TY_PLACEHOLDER | - TypeFlags::HAS_CT_PLACEHOLDER + TypeFlags::HAS_RE_PLACEHOLDER + | TypeFlags::HAS_TY_PLACEHOLDER + | TypeFlags::HAS_CT_PLACEHOLDER, ) } fn needs_subst(&self) -> bool { @@ -138,7 +138,6 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone { /// A visitor that does not recurse into types, works like `fn walk_shallow` in `Ty`. fn visit_tys_shallow(&self, visit: impl FnMut(Ty<'tcx>) -> bool) -> bool { - pub struct Visitor(F); impl<'tcx, F: FnMut(Ty<'tcx>) -> bool> TypeVisitor<'tcx> for Visitor { @@ -151,6 +150,15 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone { } } +impl TypeFoldable<'tcx> for syntax::ast::Constness { + fn super_fold_with>(&self, _: &mut F) -> Self { + *self + } + fn super_visit_with>(&self, _: &mut V) -> bool { + false + } +} + /// The `TypeFolder` trait defines the actual *folding*. There is a /// method defined for every foldable type. Each of these has a /// default implementation that does an "identity" fold. Within each @@ -160,7 +168,8 @@ pub trait TypeFolder<'tcx>: Sized { fn tcx<'a>(&'a self) -> TyCtxt<'tcx>; fn fold_binder(&mut self, t: &Binder) -> Binder - where T : TypeFoldable<'tcx> + where + T: TypeFoldable<'tcx>, { t.super_fold_with(self) } @@ -178,7 +187,7 @@ pub trait TypeFolder<'tcx>: Sized { } } -pub trait TypeVisitor<'tcx> : Sized { +pub trait TypeVisitor<'tcx>: Sized { fn visit_binder>(&mut self, t: &Binder) -> bool { t.super_visit_with(self) } @@ -219,7 +228,7 @@ where { fn tcx<'b>(&'b self) -> TyCtxt<'tcx> { self.tcx - } + } fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { let t = ty.super_fold_with(self); @@ -243,11 +252,9 @@ where impl<'tcx> TyCtxt<'tcx> { /// Collects the free and escaping regions in `value` into `region_set`. Returns /// whether any late-bound regions were skipped - pub fn collect_regions(self, - value: &T, - region_set: &mut FxHashSet>) - -> bool - where T : TypeFoldable<'tcx> + pub fn collect_regions(self, value: &T, region_set: &mut FxHashSet>) -> bool + where + T: TypeFoldable<'tcx>, { let mut have_bound_regions = false; self.fold_regions(value, &mut have_bound_regions, |r, d| { @@ -267,7 +274,7 @@ impl<'tcx> TyCtxt<'tcx> { mut f: impl FnMut(ty::Region<'tcx>, ty::DebruijnIndex) -> ty::Region<'tcx>, ) -> T where - T : TypeFoldable<'tcx>, + T: TypeFoldable<'tcx>, { value.fold_with(&mut RegionFolder::new(self, skipped_regions, &mut f)) } @@ -299,10 +306,7 @@ impl<'tcx> TyCtxt<'tcx> { value: &impl TypeFoldable<'tcx>, callback: impl FnMut(ty::Region<'tcx>) -> bool, ) -> bool { - return value.visit_with(&mut RegionVisitor { - outer_index: ty::INNERMOST, - callback - }); + return value.visit_with(&mut RegionVisitor { outer_index: ty::INNERMOST, callback }); struct RegionVisitor { /// The index of a binder *just outside* the things we have @@ -327,7 +331,8 @@ impl<'tcx> TyCtxt<'tcx> { } impl<'tcx, F> TypeVisitor<'tcx> for RegionVisitor - where F: FnMut(ty::Region<'tcx>) -> bool + where + F: FnMut(ty::Region<'tcx>) -> bool, { fn visit_binder>(&mut self, t: &Binder) -> bool { self.outer_index.shift_in(1); @@ -389,19 +394,14 @@ impl<'a, 'tcx> RegionFolder<'a, 'tcx> { skipped_regions: &'a mut bool, fold_region_fn: &'a mut dyn FnMut(ty::Region<'tcx>, ty::DebruijnIndex) -> ty::Region<'tcx>, ) -> RegionFolder<'a, 'tcx> { - RegionFolder { - tcx, - skipped_regions, - current_index: ty::INNERMOST, - fold_region_fn, - } + RegionFolder { tcx, skipped_regions, current_index: ty::INNERMOST, fold_region_fn } } } impl<'a, 'tcx> TypeFolder<'tcx> for RegionFolder<'a, 'tcx> { fn tcx<'b>(&'b self) -> TyCtxt<'tcx> { self.tcx - } + } fn fold_binder>(&mut self, t: &ty::Binder) -> ty::Binder { self.current_index.shift_in(1); @@ -413,14 +413,18 @@ impl<'a, 'tcx> TypeFolder<'tcx> for RegionFolder<'a, 'tcx> { fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> { match *r { ty::ReLateBound(debruijn, _) if debruijn < self.current_index => { - debug!("RegionFolder.fold_region({:?}) skipped bound region (current index={:?})", - r, self.current_index); + debug!( + "RegionFolder.fold_region({:?}) skipped bound region (current index={:?})", + r, self.current_index + ); *self.skipped_regions = true; r } _ => { - debug!("RegionFolder.fold_region({:?}) folding free region (current_index={:?})", - r, self.current_index); + debug!( + "RegionFolder.fold_region({:?}) folding free region (current_index={:?})", + r, self.current_index + ); (self.fold_region_fn)(r, self.current_index) } } @@ -450,20 +454,14 @@ impl<'a, 'tcx> BoundVarReplacer<'a, 'tcx> { G: FnMut(ty::BoundTy) -> Ty<'tcx>, H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx>, { - BoundVarReplacer { - tcx, - current_index: ty::INNERMOST, - fld_r, - fld_t, - fld_c, - } + BoundVarReplacer { tcx, current_index: ty::INNERMOST, fld_r, fld_t, fld_c } } } impl<'a, 'tcx> TypeFolder<'tcx> for BoundVarReplacer<'a, 'tcx> { fn tcx<'b>(&'b self) -> TyCtxt<'tcx> { self.tcx - } + } fn fold_binder>(&mut self, t: &ty::Binder) -> ty::Binder { self.current_index.shift_in(1); @@ -478,11 +476,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for BoundVarReplacer<'a, 'tcx> { if debruijn == self.current_index { let fld_t = &mut self.fld_t; let ty = fld_t(bound_ty); - ty::fold::shift_vars( - self.tcx, - &ty, - self.current_index.as_u32() - ) + ty::fold::shift_vars(self.tcx, &ty, self.current_index.as_u32()) } else { t } @@ -514,7 +508,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for BoundVarReplacer<'a, 'tcx> { region } } - _ => r + _ => r, } } @@ -523,11 +517,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for BoundVarReplacer<'a, 'tcx> { if debruijn == self.current_index { let fld_c = &mut self.fld_c; let ct = fld_c(bound_const, ty); - ty::fold::shift_vars( - self.tcx, - &ct, - self.current_index.as_u32() - ) + ty::fold::shift_vars(self.tcx, &ct, self.current_index.as_u32()) } else { ct } @@ -557,18 +547,16 @@ impl<'tcx> TyCtxt<'tcx> { pub fn replace_late_bound_regions( self, value: &Binder, - fld_r: F + fld_r: F, ) -> (T, BTreeMap>) - where F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>, - T: TypeFoldable<'tcx> + where + F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>, + T: TypeFoldable<'tcx>, { // identity for bound types and consts let fld_t = |bound_ty| self.mk_ty(ty::Bound(ty::INNERMOST, bound_ty)); let fld_c = |bound_ct, ty| { - self.mk_const(ty::Const { - val: ty::ConstKind::Bound(ty::INNERMOST, bound_ct), - ty, - }) + self.mk_const(ty::Const { val: ty::ConstKind::Bound(ty::INNERMOST, bound_ct), ty }) }; self.replace_escaping_bound_vars(value.skip_binder(), fld_r, fld_t, fld_c) } @@ -583,10 +571,11 @@ impl<'tcx> TyCtxt<'tcx> { mut fld_t: G, mut fld_c: H, ) -> (T, BTreeMap>) - where F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>, - G: FnMut(ty::BoundTy) -> Ty<'tcx>, - H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx>, - T: TypeFoldable<'tcx>, + where + F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>, + G: FnMut(ty::BoundTy) -> Ty<'tcx>, + H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx>, + T: TypeFoldable<'tcx>, { use rustc_data_structures::fx::FxHashMap; @@ -597,24 +586,16 @@ impl<'tcx> TyCtxt<'tcx> { if !value.has_escaping_bound_vars() { (value.clone(), region_map) } else { - let mut real_fld_r = |br| { - *region_map.entry(br).or_insert_with(|| fld_r(br)) - }; - - let mut real_fld_t = |bound_ty| { - *type_map.entry(bound_ty).or_insert_with(|| fld_t(bound_ty)) - }; - - let mut real_fld_c = |bound_ct, ty| { - *const_map.entry(bound_ct).or_insert_with(|| fld_c(bound_ct, ty)) - }; - - let mut replacer = BoundVarReplacer::new( - self, - &mut real_fld_r, - &mut real_fld_t, - &mut real_fld_c, - ); + let mut real_fld_r = |br| *region_map.entry(br).or_insert_with(|| fld_r(br)); + + let mut real_fld_t = + |bound_ty| *type_map.entry(bound_ty).or_insert_with(|| fld_t(bound_ty)); + + let mut real_fld_c = + |bound_ct, ty| *const_map.entry(bound_ct).or_insert_with(|| fld_c(bound_ct, ty)); + + let mut replacer = + BoundVarReplacer::new(self, &mut real_fld_r, &mut real_fld_t, &mut real_fld_c); let result = value.fold_with(&mut replacer); (result, region_map) } @@ -630,10 +611,11 @@ impl<'tcx> TyCtxt<'tcx> { fld_t: G, fld_c: H, ) -> (T, BTreeMap>) - where F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>, - G: FnMut(ty::BoundTy) -> Ty<'tcx>, - H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx>, - T: TypeFoldable<'tcx> + where + F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>, + G: FnMut(ty::BoundTy) -> Ty<'tcx>, + H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx>, + T: TypeFoldable<'tcx>, { self.replace_escaping_bound_vars(value.skip_binder(), fld_r, fld_t, fld_c) } @@ -643,39 +625,52 @@ impl<'tcx> TyCtxt<'tcx> { pub fn liberate_late_bound_regions( &self, all_outlive_scope: DefId, - value: &ty::Binder + value: &ty::Binder, ) -> T - where T: TypeFoldable<'tcx> { + where + T: TypeFoldable<'tcx>, + { self.replace_late_bound_regions(value, |br| { self.mk_region(ty::ReFree(ty::FreeRegion { scope: all_outlive_scope, - bound_region: br + bound_region: br, })) - }).0 + }) + .0 } /// Returns a set of all late-bound regions that are constrained /// by `value`, meaning that if we instantiate those LBR with /// variables and equate `value` with something else, those /// variables will also be equated. - pub fn collect_constrained_late_bound_regions(&self, value: &Binder) - -> FxHashSet - where T : TypeFoldable<'tcx> + pub fn collect_constrained_late_bound_regions( + &self, + value: &Binder, + ) -> FxHashSet + where + T: TypeFoldable<'tcx>, { self.collect_late_bound_regions(value, true) } /// Returns a set of all late-bound regions that appear in `value` anywhere. - pub fn collect_referenced_late_bound_regions(&self, value: &Binder) - -> FxHashSet - where T : TypeFoldable<'tcx> + pub fn collect_referenced_late_bound_regions( + &self, + value: &Binder, + ) -> FxHashSet + where + T: TypeFoldable<'tcx>, { self.collect_late_bound_regions(value, false) } - fn collect_late_bound_regions(&self, value: &Binder, just_constraint: bool) - -> FxHashSet - where T : TypeFoldable<'tcx> + fn collect_late_bound_regions( + &self, + value: &Binder, + just_constraint: bool, + ) -> FxHashSet + where + T: TypeFoldable<'tcx>, { let mut collector = LateBoundRegionsCollector::new(just_constraint); let result = value.skip_binder().visit_with(&mut collector); @@ -686,7 +681,8 @@ impl<'tcx> TyCtxt<'tcx> { /// Replaces any late-bound regions bound in `value` with `'erased`. Useful in codegen but also /// method lookup and a few other places where precise region relationships are not required. pub fn erase_late_bound_regions(self, value: &Binder) -> T - where T : TypeFoldable<'tcx> + where + T: TypeFoldable<'tcx>, { self.replace_late_bound_regions(value, |_| self.lifetimes.re_erased).0 } @@ -700,13 +696,17 @@ impl<'tcx> TyCtxt<'tcx> { /// structurally identical. For example, `for<'a, 'b> fn(&'a isize, &'b isize)` and /// `for<'a, 'b> fn(&'b isize, &'a isize)` will become identical after anonymization. pub fn anonymize_late_bound_regions(self, sig: &Binder) -> Binder - where T : TypeFoldable<'tcx>, + where + T: TypeFoldable<'tcx>, { let mut counter = 0; - Binder::bind(self.replace_late_bound_regions(sig, |_| { - counter += 1; - self.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BrAnon(counter))) - }).0) + Binder::bind( + self.replace_late_bound_regions(sig, |_| { + counter += 1; + self.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BrAnon(counter))) + }) + .0, + ) } } @@ -733,19 +733,14 @@ struct Shifter<'tcx> { impl Shifter<'tcx> { pub fn new(tcx: TyCtxt<'tcx>, amount: u32, direction: Direction) -> Self { - Shifter { - tcx, - current_index: ty::INNERMOST, - amount, - direction, - } + Shifter { tcx, current_index: ty::INNERMOST, amount, direction } } } impl TypeFolder<'tcx> for Shifter<'tcx> { fn tcx<'b>(&'b self) -> TyCtxt<'tcx> { self.tcx - } + } fn fold_binder>(&mut self, t: &ty::Binder) -> ty::Binder { self.current_index.shift_in(1); @@ -771,7 +766,7 @@ impl TypeFolder<'tcx> for Shifter<'tcx> { self.tcx.mk_region(shifted) } } - _ => r + _ => r, } } @@ -788,9 +783,7 @@ impl TypeFolder<'tcx> for Shifter<'tcx> { debruijn.shifted_out(self.amount) } }; - self.tcx.mk_ty( - ty::Bound(debruijn, bound_ty) - ) + self.tcx.mk_ty(ty::Bound(debruijn, bound_ty)) } } @@ -810,10 +803,7 @@ impl TypeFolder<'tcx> for Shifter<'tcx> { debruijn.shifted_out(self.amount) } }; - self.tcx.mk_const(ty::Const { - val: ty::ConstKind::Bound(debruijn, bound_ct), - ty, - }) + self.tcx.mk_const(ty::Const { val: ty::ConstKind::Bound(debruijn, bound_ct), ty }) } } else { ct.super_fold_with(self) @@ -830,9 +820,7 @@ pub fn shift_region<'tcx>( ty::ReLateBound(debruijn, br) if amount > 0 => { tcx.mk_region(ty::ReLateBound(debruijn.shifted_in(amount), *br)) } - _ => { - region - } + _ => region, } } @@ -840,8 +828,7 @@ pub fn shift_vars<'tcx, T>(tcx: TyCtxt<'tcx>, value: &T, amount: u32) -> T where T: TypeFoldable<'tcx>, { - debug!("shift_vars(value={:?}, amount={})", - value, amount); + debug!("shift_vars(value={:?}, amount={})", value, amount); value.fold_with(&mut Shifter::new(tcx, amount, Direction::In)) } @@ -850,8 +837,7 @@ pub fn shift_out_vars<'tcx, T>(tcx: TyCtxt<'tcx>, value: &T, amount: u32) -> T where T: TypeFoldable<'tcx>, { - debug!("shift_out_vars(value={:?}, amount={})", - value, amount); + debug!("shift_out_vars(value={:?}, amount={})", value, amount); value.fold_with(&mut Shifter::new(tcx, amount, Direction::Out)) } @@ -987,8 +973,10 @@ impl<'tcx> TypeVisitor<'tcx> for LateBoundRegionsCollector { // in the normalized form if self.just_constrained { match t.kind { - ty::Projection(..) | ty::Opaque(..) => { return false; } - _ => { } + ty::Projection(..) | ty::Opaque(..) => { + return false; + } + _ => {} } } @@ -997,7 +985,7 @@ impl<'tcx> TypeVisitor<'tcx> for LateBoundRegionsCollector { fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool { if let ty::ReLateBound(debruijn, br) = *r { - if debruijn == self.current_index { + if debruijn == self.current_index { self.regions.insert(br); } } diff --git a/src/librustc/infer/outlives/free_region_map.rs b/src/librustc/ty/free_region_map.rs similarity index 85% rename from src/librustc/infer/outlives/free_region_map.rs rename to src/librustc/ty/free_region_map.rs index fd8ccce683..42f506606e 100644 --- a/src/librustc/infer/outlives/free_region_map.rs +++ b/src/librustc/ty/free_region_map.rs @@ -1,4 +1,4 @@ -use crate::ty::{self, Lift, TyCtxt, Region}; +use crate::ty::{self, Lift, Region, TyCtxt}; use rustc_data_structures::transitive_relation::TransitiveRelation; #[derive(Clone, RustcEncodable, RustcDecodable, Debug, Default, HashStable)] @@ -7,11 +7,11 @@ pub struct FreeRegionMap<'tcx> { // // Invariant: only free regions like `'x` or `'static` are stored // in this relation, not scopes. - relation: TransitiveRelation> + relation: TransitiveRelation>, } impl<'tcx> FreeRegionMap<'tcx> { - pub fn elements(&self) -> impl Iterator> { + pub fn elements(&self) -> impl Iterator> { self.relation.elements() } @@ -41,7 +41,9 @@ impl<'tcx> FreeRegionMap<'tcx> { debug!("lub_free_regions(r_a={:?}, r_b={:?})", r_a, r_b); assert!(is_free(r_a)); assert!(is_free(r_b)); - let result = if r_a == r_b { r_a } else { + let result = if r_a == r_b { + r_a + } else { match self.relation.postdom_upper_bound(&r_a, &r_b) { None => tcx.mk_region(ty::ReStatic), Some(r) => *r, @@ -62,10 +64,7 @@ pub trait FreeRegionRelations<'tcx> { } impl<'tcx> FreeRegionRelations<'tcx> for FreeRegionMap<'tcx> { - fn sub_free_regions(&self, - r_a: Region<'tcx>, - r_b: Region<'tcx>) - -> bool { + fn sub_free_regions(&self, r_a: Region<'tcx>, r_b: Region<'tcx>) -> bool { assert!(is_free_or_static(r_a) && is_free_or_static(r_b)); if let ty::ReStatic = r_b { true // `'a <= 'static` is just always true, and not stored in the relation explicitly @@ -78,7 +77,7 @@ impl<'tcx> FreeRegionRelations<'tcx> for FreeRegionMap<'tcx> { fn is_free(r: Region<'_>) -> bool { match *r { ty::ReEarlyBound(_) | ty::ReFree(_) => true, - _ => false + _ => false, } } @@ -92,7 +91,6 @@ fn is_free_or_static(r: Region<'_>) -> bool { impl<'a, 'tcx> Lift<'tcx> for FreeRegionMap<'a> { type Lifted = FreeRegionMap<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option> { - self.relation.maybe_map(|&fr| tcx.lift(&fr)) - .map(|relation| FreeRegionMap { relation }) + self.relation.maybe_map(|&fr| tcx.lift(&fr)).map(|relation| FreeRegionMap { relation }) } } diff --git a/src/librustc/ty/inhabitedness/def_id_forest.rs b/src/librustc/ty/inhabitedness/def_id_forest.rs index 227fbf967c..14ead77653 100644 --- a/src/librustc/ty/inhabitedness/def_id_forest.rs +++ b/src/librustc/ty/inhabitedness/def_id_forest.rs @@ -1,8 +1,8 @@ -use std::mem; -use smallvec::SmallVec; -use rustc::hir::CRATE_HIR_ID; use crate::ty::context::TyCtxt; use crate::ty::{DefId, DefIdTree}; +use rustc_hir::CRATE_HIR_ID; +use smallvec::SmallVec; +use std::mem; /// Represents a forest of `DefId`s closed under the ancestor relation. That is, /// if a `DefId` representing a module is contained in the forest then all @@ -24,9 +24,7 @@ pub struct DefIdForest { impl<'tcx> DefIdForest { /// Creates an empty forest. pub fn empty() -> DefIdForest { - DefIdForest { - root_ids: SmallVec::new(), - } + DefIdForest { root_ids: SmallVec::new() } } /// Creates a forest consisting of a single tree representing the entire @@ -41,9 +39,7 @@ impl<'tcx> DefIdForest { pub fn from_id(id: DefId) -> DefIdForest { let mut root_ids = SmallVec::new(); root_ids.push(id); - DefIdForest { - root_ids, - } + DefIdForest { root_ids } } /// Tests whether the forest is empty. diff --git a/src/librustc/ty/inhabitedness/mod.rs b/src/librustc/ty/inhabitedness/mod.rs index bc0cf4deaa..144e3bc9c8 100644 --- a/src/librustc/ty/inhabitedness/mod.rs +++ b/src/librustc/ty/inhabitedness/mod.rs @@ -1,11 +1,11 @@ pub use self::def_id_forest::DefIdForest; +use crate::ty; use crate::ty::context::TyCtxt; -use crate::ty::{AdtDef, VariantDef, FieldDef, Ty, TyS}; -use crate::ty::{DefId, SubstsRef}; -use crate::ty::{AdtKind, Visibility}; use crate::ty::TyKind::*; -use crate::ty; +use crate::ty::{AdtDef, FieldDef, Ty, TyS, VariantDef}; +use crate::ty::{AdtKind, Visibility}; +use crate::ty::{DefId, SubstsRef}; mod def_id_forest; @@ -96,15 +96,11 @@ impl<'tcx> TyCtxt<'tcx> { // ``` // forest.is_empty() // ``` - self.ty_inhabitedness_forest(ty).contains(self, module) + ty.uninhabited_from(self).contains(self, module) } pub fn is_ty_uninhabited_from_any_module(self, ty: Ty<'tcx>) -> bool { - !self.ty_inhabitedness_forest(ty).is_empty() - } - - fn ty_inhabitedness_forest(self, ty: Ty<'tcx>) -> DefIdForest { - ty.uninhabited_from(self) + !ty.uninhabited_from(self).is_empty() } } @@ -115,9 +111,10 @@ impl<'tcx> AdtDef { if self.is_variant_list_non_exhaustive() && !self.did.is_local() { DefIdForest::empty() } else { - DefIdForest::intersection(tcx, self.variants.iter().map(|v| { - v.uninhabited_from(tcx, substs, self.adt_kind()) - })) + DefIdForest::intersection( + tcx, + self.variants.iter().map(|v| v.uninhabited_from(tcx, substs, self.adt_kind())), + ) } } } @@ -141,9 +138,10 @@ impl<'tcx> VariantDef { if self.is_field_list_non_exhaustive() && !self.def_id.is_local() { DefIdForest::empty() } else { - DefIdForest::union(tcx, self.fields.iter().map(|f| { - f.uninhabited_from(tcx, substs, is_enum) - })) + DefIdForest::union( + tcx, + self.fields.iter().map(|f| f.uninhabited_from(tcx, substs, is_enum)), + ) } } } @@ -156,9 +154,7 @@ impl<'tcx> FieldDef { substs: SubstsRef<'tcx>, is_enum: bool, ) -> DefIdForest { - let data_uninhabitedness = move || { - self.ty(tcx, substs).uninhabited_from(tcx) - }; + let data_uninhabitedness = move || self.ty(tcx, substs).uninhabited_from(tcx); // FIXME(canndrew): Currently enum fields are (incorrectly) stored with // `Visibility::Invisible` so we need to override `self.vis` if we're // dealing with an enum. @@ -171,7 +167,7 @@ impl<'tcx> FieldDef { let forest = DefIdForest::from_id(from); let iter = Some(forest).into_iter().chain(Some(data_uninhabitedness())); DefIdForest::intersection(tcx, iter) - }, + } Visibility::Public => data_uninhabitedness(), } } @@ -187,16 +183,14 @@ impl<'tcx> TyS<'tcx> { Never => DefIdForest::full(tcx), Tuple(ref tys) => { - DefIdForest::union(tcx, tys.iter().map(|ty| { - ty.expect_ty().uninhabited_from(tcx) - })) + DefIdForest::union(tcx, tys.iter().map(|ty| ty.expect_ty().uninhabited_from(tcx))) } Array(ty, len) => match len.try_eval_usize(tcx, ty::ParamEnv::empty()) { // If the array is definitely non-empty, it's uninhabited if // the type of its elements is uninhabited. Some(n) if n != 0 => ty.uninhabited_from(tcx), - _ => DefIdForest::empty() + _ => DefIdForest::empty(), }, // References to uninitialised memory is valid for any type, including diff --git a/src/librustc/ty/instance.rs b/src/librustc/ty/instance.rs index 366951bc9f..51a18f8eae 100644 --- a/src/librustc/ty/instance.rs +++ b/src/librustc/ty/instance.rs @@ -1,12 +1,12 @@ -use crate::hir::CodegenFnAttrFlags; -use crate::hir::def::Namespace; -use crate::hir::def_id::DefId; -use crate::ty::{self, Ty, TypeFoldable, SubstsRef, TyCtxt}; -use crate::ty::print::{FmtPrinter, Printer}; -use crate::traits; +use crate::middle::codegen_fn_attrs::CodegenFnAttrFlags; use crate::middle::lang_items::DropInPlaceFnLangItem; -use rustc_target::spec::abi::Abi; +use crate::traits; +use crate::ty::print::{FmtPrinter, Printer}; +use crate::ty::{self, SubstsRef, Ty, TyCtxt, TypeFoldable}; +use rustc_hir::def::Namespace; +use rustc_hir::def_id::{CrateNum, DefId}; use rustc_macros::HashStable; +use rustc_target::spec::abi::Abi; use std::fmt; @@ -50,7 +50,9 @@ pub enum InstanceDef<'tcx> { Virtual(DefId, usize), /// `<[mut closure] as FnOnce>::call_once` - ClosureOnceShim { call_once: DefId }, + ClosureOnceShim { + call_once: DefId, + }, /// `drop_in_place::; None` for empty drop glue. DropGlue(DefId, Option>), @@ -60,13 +62,68 @@ pub enum InstanceDef<'tcx> { } impl<'tcx> Instance<'tcx> { - pub fn ty(&self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> { + /// Returns the `Ty` corresponding to this `Instance`, + /// with generic substitutions applied and lifetimes erased. + /// + /// This method can only be called when the 'substs' for this Instance + /// are fully monomorphic (no `ty::Param`'s are present). + /// This is usually the case (e.g. during codegen). + /// However, during constant evaluation, we may want + /// to try to resolve a `Instance` using generic parameters + /// (e.g. when we are attempting to to do const-propagation). + /// In this case, `Instance.ty_env` should be used to provide + /// the `ParamEnv` for our generic context. + pub fn monomorphic_ty(&self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> { + let ty = tcx.type_of(self.def.def_id()); + // There shouldn't be any params - if there are, then + // Instance.ty_env should have been used to provide the proper + // ParamEnv + if self.substs.has_param_types() { + bug!("Instance.ty called for type {:?} with params in substs: {:?}", ty, self.substs); + } + tcx.subst_and_normalize_erasing_regions(self.substs, ty::ParamEnv::reveal_all(), &ty) + } + + /// Like `Instance.ty`, but allows a `ParamEnv` to be specified for use during + /// normalization. This method is only really useful during constant evaluation, + /// where we are dealing with potentially generic types. + pub fn ty_env(&self, tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) -> Ty<'tcx> { let ty = tcx.type_of(self.def.def_id()); - tcx.subst_and_normalize_erasing_regions( - self.substs, - ty::ParamEnv::reveal_all(), - &ty, - ) + tcx.subst_and_normalize_erasing_regions(self.substs, param_env, &ty) + } + + /// Finds a crate that contains a monomorphization of this instance that + /// can be linked to from the local crate. A return value of `None` means + /// no upstream crate provides such an exported monomorphization. + /// + /// This method already takes into account the global `-Zshare-generics` + /// setting, always returning `None` if `share-generics` is off. + pub fn upstream_monomorphization(&self, tcx: TyCtxt<'tcx>) -> Option { + // If we are not in share generics mode, we don't link to upstream + // monomorphizations but always instantiate our own internal versions + // instead. + if !tcx.sess.opts.share_generics() { + return None; + } + + // If this is an item that is defined in the local crate, no upstream + // crate can know about it/provide a monomorphization. + if self.def_id().is_local() { + return None; + } + + // If this a non-generic instance, it cannot be a shared monomorphization. + if self.substs.non_erasable_generics().next().is_none() { + return None; + } + + match self.def { + InstanceDef::Item(def_id) => tcx + .upstream_monomorphizations_for(def_id) + .and_then(|monos| monos.get(&self.substs).cloned()), + InstanceDef::DropGlue(_, Some(_)) => tcx.upstream_drop_glue_for(self.substs), + _ => None, + } } } @@ -74,15 +131,15 @@ impl<'tcx> InstanceDef<'tcx> { #[inline] pub fn def_id(&self) -> DefId { match *self { - InstanceDef::Item(def_id) | - InstanceDef::VtableShim(def_id) | - InstanceDef::ReifyShim(def_id) | - InstanceDef::FnPtrShim(def_id, _) | - InstanceDef::Virtual(def_id, _) | - InstanceDef::Intrinsic(def_id, ) | - InstanceDef::ClosureOnceShim { call_once: def_id } | - InstanceDef::DropGlue(def_id, _) | - InstanceDef::CloneShim(def_id, _) => def_id + InstanceDef::Item(def_id) + | InstanceDef::VtableShim(def_id) + | InstanceDef::ReifyShim(def_id) + | InstanceDef::FnPtrShim(def_id, _) + | InstanceDef::Virtual(def_id, _) + | InstanceDef::Intrinsic(def_id) + | InstanceDef::ClosureOnceShim { call_once: def_id } + | InstanceDef::DropGlue(def_id, _) + | InstanceDef::CloneShim(def_id, _) => def_id, } } @@ -91,34 +148,51 @@ impl<'tcx> InstanceDef<'tcx> { tcx.get_attrs(self.def_id()) } - pub fn is_inline(&self, tcx: TyCtxt<'tcx>) -> bool { + /// Returns `true` if the LLVM version of this instance is unconditionally + /// marked with `inline`. This implies that a copy of this instance is + /// generated in every codegen unit. + /// Note that this is only a hint. See the documentation for + /// `generates_cgu_internal_copy` for more information. + pub fn requires_inline(&self, tcx: TyCtxt<'tcx>) -> bool { use crate::hir::map::DefPathData; let def_id = match *self { ty::InstanceDef::Item(def_id) => def_id, ty::InstanceDef::DropGlue(_, Some(_)) => return false, - _ => return true + _ => return true, }; match tcx.def_key(def_id).disambiguated_data.data { DefPathData::Ctor | DefPathData::ClosureExpr => true, - _ => false + _ => false, } } - pub fn requires_local(&self, tcx: TyCtxt<'tcx>) -> bool { - if self.is_inline(tcx) { - return true + /// Returns `true` if the machine code for this instance is instantiated in + /// each codegen unit that references it. + /// Note that this is only a hint! The compiler can globally decide to *not* + /// do this in order to speed up compilation. CGU-internal copies are + /// only exist to enable inlining. If inlining is not performed (e.g. at + /// `-Copt-level=0`) then the time for generating them is wasted and it's + /// better to create a single copy with external linkage. + pub fn generates_cgu_internal_copy(&self, tcx: TyCtxt<'tcx>) -> bool { + if self.requires_inline(tcx) { + return true; } if let ty::InstanceDef::DropGlue(..) = *self { // Drop glue wants to be instantiated at every codegen // unit, but without an #[inline] hint. We should make this // available to normal end-users. - return true + return true; } tcx.codegen_fn_attrs(self.def_id()).requests_inline() } pub fn requires_caller_location(&self, tcx: TyCtxt<'_>) -> bool { - tcx.codegen_fn_attrs(self.def_id()).flags.contains(CodegenFnAttrFlags::TRACK_CALLER) + match *self { + InstanceDef::Item(def_id) => { + tcx.codegen_fn_attrs(def_id).flags.contains(CodegenFnAttrFlags::TRACK_CALLER) + } + _ => false, + } } } @@ -133,40 +207,26 @@ impl<'tcx> fmt::Display for Instance<'tcx> { match self.def { InstanceDef::Item(_) => Ok(()), - InstanceDef::VtableShim(_) => { - write!(f, " - shim(vtable)") - } - InstanceDef::ReifyShim(_) => { - write!(f, " - shim(reify)") - } - InstanceDef::Intrinsic(_) => { - write!(f, " - intrinsic") - } - InstanceDef::Virtual(_, num) => { - write!(f, " - virtual#{}", num) - } - InstanceDef::FnPtrShim(_, ty) => { - write!(f, " - shim({:?})", ty) - } - InstanceDef::ClosureOnceShim { .. } => { - write!(f, " - shim") - } - InstanceDef::DropGlue(_, ty) => { - write!(f, " - shim({:?})", ty) - } - InstanceDef::CloneShim(_, ty) => { - write!(f, " - shim({:?})", ty) - } + InstanceDef::VtableShim(_) => write!(f, " - shim(vtable)"), + InstanceDef::ReifyShim(_) => write!(f, " - shim(reify)"), + InstanceDef::Intrinsic(_) => write!(f, " - intrinsic"), + InstanceDef::Virtual(_, num) => write!(f, " - virtual#{}", num), + InstanceDef::FnPtrShim(_, ty) => write!(f, " - shim({:?})", ty), + InstanceDef::ClosureOnceShim { .. } => write!(f, " - shim"), + InstanceDef::DropGlue(_, ty) => write!(f, " - shim({:?})", ty), + InstanceDef::CloneShim(_, ty) => write!(f, " - shim({:?})", ty), } } } impl<'tcx> Instance<'tcx> { - pub fn new(def_id: DefId, substs: SubstsRef<'tcx>) - -> Instance<'tcx> { - assert!(!substs.has_escaping_bound_vars(), - "substs of instance {:?} not normalized for codegen: {:?}", - def_id, substs); + pub fn new(def_id: DefId, substs: SubstsRef<'tcx>) -> Instance<'tcx> { + assert!( + !substs.has_escaping_bound_vars(), + "substs of instance {:?} not normalized for codegen: {:?}", + def_id, + substs + ); Instance { def: InstanceDef::Item(def_id), substs: substs } } @@ -210,18 +270,14 @@ impl<'tcx> Instance<'tcx> { resolve_associated_item(tcx, &item, param_env, trait_def_id, substs) } else { let ty = tcx.type_of(def_id); - let item_type = tcx.subst_and_normalize_erasing_regions( - substs, - param_env, - &ty, - ); + let item_type = tcx.subst_and_normalize_erasing_regions(substs, param_env, &ty); let def = match item_type.kind { - ty::FnDef(..) if { - let f = item_type.fn_sig(tcx); - f.abi() == Abi::RustIntrinsic || - f.abi() == Abi::PlatformIntrinsic - } => + ty::FnDef(..) + if { + let f = item_type.fn_sig(tcx); + f.abi() == Abi::RustIntrinsic || f.abi() == Abi::PlatformIntrinsic + } => { debug!(" => intrinsic"); ty::InstanceDef::Intrinsic(def_id) @@ -242,10 +298,7 @@ impl<'tcx> Instance<'tcx> { } } }; - Some(Instance { - def: def, - substs: substs - }) + Some(Instance { def: def, substs: substs }) }; debug!("resolve(def_id={:?}, substs={:?}) = {:?}", def_id, substs, result); result @@ -288,10 +341,7 @@ impl<'tcx> Instance<'tcx> { && tcx.generics_of(def_id).has_self; if is_vtable_shim { debug!(" => associated item with unsizeable self: Self"); - Some(Instance { - def: InstanceDef::VtableShim(def_id), - substs, - }) + Some(Instance { def: InstanceDef::VtableShim(def_id), substs }) } else { Instance::resolve(tcx, param_env, def_id, substs) } @@ -307,7 +357,7 @@ impl<'tcx> Instance<'tcx> { match needs_fn_once_adapter_shim(actual_kind, requested_kind) { Ok(true) => Instance::fn_once_adapter_instance(tcx, def_id, substs), - _ => Instance::new(def_id, substs) + _ => Instance::new(def_id, substs), } } @@ -322,13 +372,13 @@ impl<'tcx> Instance<'tcx> { closure_did: DefId, substs: ty::SubstsRef<'tcx>, ) -> Instance<'tcx> { - debug!("fn_once_adapter_shim({:?}, {:?})", - closure_did, - substs); + debug!("fn_once_adapter_shim({:?}, {:?})", closure_did, substs); let fn_once = tcx.lang_items().fn_once_trait().unwrap(); - let call_once = tcx.associated_items(fn_once) + let call_once = tcx + .associated_items(fn_once) .find(|it| it.kind == ty::AssocKind::Method) - .unwrap().def_id; + .unwrap() + .def_id; let def = ty::InstanceDef::ClosureOnceShim { call_once }; let self_ty = tcx.mk_closure(closure_did, substs); @@ -343,11 +393,7 @@ impl<'tcx> Instance<'tcx> { } pub fn is_vtable_shim(&self) -> bool { - if let InstanceDef::VtableShim(..) = self.def { - true - } else { - false - } + if let InstanceDef::VtableShim(..) = self.def { true } else { false } } } @@ -359,11 +405,13 @@ fn resolve_associated_item<'tcx>( rcvr_substs: SubstsRef<'tcx>, ) -> Option> { let def_id = trait_item.def_id; - debug!("resolve_associated_item(trait_item={:?}, \ + debug!( + "resolve_associated_item(trait_item={:?}, \ param_env={:?}, \ trait_id={:?}, \ rcvr_substs={:?})", - def_id, param_env, trait_id, rcvr_substs); + def_id, param_env, trait_id, rcvr_substs + ); let trait_ref = ty::TraitRef::from_method(tcx, trait_id, rcvr_substs); let vtbl = tcx.codegen_fulfill_obligation((param_env, ty::Binder::bind(trait_ref))); @@ -372,48 +420,62 @@ fn resolve_associated_item<'tcx>( // the actual function: match vtbl { traits::VtableImpl(impl_data) => { - let (def_id, substs) = traits::find_associated_item( - tcx, param_env, trait_item, rcvr_substs, &impl_data); + let (def_id, substs) = + traits::find_associated_item(tcx, param_env, trait_item, rcvr_substs, &impl_data); + + let resolved_item = tcx.associated_item(def_id); + + // Since this is a trait item, we need to see if the item is either a trait default item + // or a specialization because we can't resolve those unless we can `Reveal::All`. + // NOTE: This should be kept in sync with the similar code in + // `rustc::traits::project::assemble_candidates_from_impls()`. + let eligible = if !resolved_item.defaultness.is_default() { + true + } else if param_env.reveal == traits::Reveal::All { + !trait_ref.needs_subst() + } else { + false + }; + + if !eligible { + return None; + } + let substs = tcx.erase_regions(&substs); Some(ty::Instance::new(def_id, substs)) } - traits::VtableGenerator(generator_data) => { - Some(Instance { - def: ty::InstanceDef::Item(generator_data.generator_def_id), - substs: generator_data.substs - }) - } + traits::VtableGenerator(generator_data) => Some(Instance { + def: ty::InstanceDef::Item(generator_data.generator_def_id), + substs: generator_data.substs, + }), traits::VtableClosure(closure_data) => { let trait_closure_kind = tcx.lang_items().fn_trait_kind(trait_id).unwrap(); - Some(Instance::resolve_closure(tcx, closure_data.closure_def_id, closure_data.substs, - trait_closure_kind)) - } - traits::VtableFnPointer(ref data) => { - Some(Instance { - def: ty::InstanceDef::FnPtrShim(trait_item.def_id, data.fn_ty), - substs: rcvr_substs - }) + Some(Instance::resolve_closure( + tcx, + closure_data.closure_def_id, + closure_data.substs, + trait_closure_kind, + )) } + traits::VtableFnPointer(ref data) => Some(Instance { + def: ty::InstanceDef::FnPtrShim(trait_item.def_id, data.fn_ty), + substs: rcvr_substs, + }), traits::VtableObject(ref data) => { - let index = tcx.get_vtable_index_of_object_method(data, def_id); - Some(Instance { - def: ty::InstanceDef::Virtual(def_id, index), - substs: rcvr_substs - }) + let index = traits::get_vtable_index_of_object_method(tcx, data, def_id); + Some(Instance { def: ty::InstanceDef::Virtual(def_id, index), substs: rcvr_substs }) } traits::VtableBuiltin(..) => { if tcx.lang_items().clone_trait().is_some() { Some(Instance { def: ty::InstanceDef::CloneShim(def_id, trait_ref.self_ty()), - substs: rcvr_substs + substs: rcvr_substs, }) } else { None } } - traits::VtableAutoImpl(..) | - traits::VtableParam(..) | - traits::VtableTraitAlias(..) => None + traits::VtableAutoImpl(..) | traits::VtableParam(..) | traits::VtableTraitAlias(..) => None, } } @@ -422,31 +484,30 @@ fn needs_fn_once_adapter_shim( trait_closure_kind: ty::ClosureKind, ) -> Result { match (actual_closure_kind, trait_closure_kind) { - (ty::ClosureKind::Fn, ty::ClosureKind::Fn) | - (ty::ClosureKind::FnMut, ty::ClosureKind::FnMut) | - (ty::ClosureKind::FnOnce, ty::ClosureKind::FnOnce) => { - // No adapter needed. - Ok(false) - } + (ty::ClosureKind::Fn, ty::ClosureKind::Fn) + | (ty::ClosureKind::FnMut, ty::ClosureKind::FnMut) + | (ty::ClosureKind::FnOnce, ty::ClosureKind::FnOnce) => { + // No adapter needed. + Ok(false) + } (ty::ClosureKind::Fn, ty::ClosureKind::FnMut) => { // The closure fn `llfn` is a `fn(&self, ...)`. We want a // `fn(&mut self, ...)`. In fact, at codegen time, these are // basically the same thing, so we can just return llfn. Ok(false) } - (ty::ClosureKind::Fn, ty::ClosureKind::FnOnce) | - (ty::ClosureKind::FnMut, ty::ClosureKind::FnOnce) => { - // The closure fn `llfn` is a `fn(&self, ...)` or `fn(&mut - // self, ...)`. We want a `fn(self, ...)`. We can produce - // this by doing something like: - // - // fn call_once(self, ...) { call_mut(&self, ...) } - // fn call_once(mut self, ...) { call_mut(&mut self, ...) } - // - // These are both the same at codegen time. - Ok(true) + (ty::ClosureKind::Fn, ty::ClosureKind::FnOnce) + | (ty::ClosureKind::FnMut, ty::ClosureKind::FnOnce) => { + // The closure fn `llfn` is a `fn(&self, ...)` or `fn(&mut + // self, ...)`. We want a `fn(self, ...)`. We can produce + // this by doing something like: + // + // fn call_once(self, ...) { call_mut(&self, ...) } + // fn call_once(mut self, ...) { call_mut(&mut self, ...) } + // + // These are both the same at codegen time. + Ok(true) } - (ty::ClosureKind::FnMut, _) | - (ty::ClosureKind::FnOnce, _) => Err(()) + (ty::ClosureKind::FnMut, _) | (ty::ClosureKind::FnOnce, _) => Err(()), } } diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index c7278dc4fa..acaa4eec94 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -1,9 +1,9 @@ use crate::session::{self, DataTypeKind}; -use crate::ty::{self, Ty, TyCtxt, TypeFoldable, ReprOptions, subst::SubstsRef}; +use crate::ty::{self, subst::SubstsRef, ReprOptions, Ty, TyCtxt, TypeFoldable}; +use rustc_span::DUMMY_SP; use syntax::ast::{self, Ident, IntTy, UintTy}; use syntax::attr; -use syntax_pos::DUMMY_SP; use std::cmp; use std::fmt; @@ -12,19 +12,19 @@ use std::iter; use std::mem; use std::ops::Bound; -use crate::hir; use crate::ich::StableHashingContext; use crate::mir::{GeneratorLayout, GeneratorSavedLocal}; use crate::ty::subst::Subst; -use rustc_index::bit_set::BitSet; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; -use rustc_index::vec::{IndexVec, Idx}; +use rustc_hir as hir; +use rustc_index::bit_set::BitSet; +use rustc_index::vec::{Idx, IndexVec}; -pub use rustc_target::abi::*; -use rustc_target::spec::{HasTargetSpec, abi::Abi as SpecAbi}; use rustc_target::abi::call::{ - ArgAttribute, ArgAttributes, ArgAbi, Conv, FnAbi, PassMode, Reg, RegKind + ArgAbi, ArgAttribute, ArgAttributes, Conv, FnAbi, PassMode, Reg, RegKind, }; +pub use rustc_target::abi::*; +use rustc_target::spec::{abi::Abi as SpecAbi, HasTargetSpec}; pub trait IntegerExt { fn to_ty<'tcx>(&self, tcx: TyCtxt<'tcx>, signed: bool) -> Ty<'tcx>; @@ -95,8 +95,11 @@ impl IntegerExt for Integer { let discr = Integer::from_attr(&tcx, ity); let fit = if ity.is_signed() { signed_fit } else { unsigned_fit }; if discr < fit { - bug!("Integer::repr_discr: `#[repr]` hint too small for \ - discriminant range of enum `{}", ty) + bug!( + "Integer::repr_discr: `#[repr]` hint too small for \ + discriminant range of enum `{}", + ty + ) } return (discr, ity.is_signed()); } @@ -164,15 +167,13 @@ pub const FAT_PTR_EXTRA: usize = 1; #[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable)] pub enum LayoutError<'tcx> { Unknown(Ty<'tcx>), - SizeOverflow(Ty<'tcx>) + SizeOverflow(Ty<'tcx>), } impl<'tcx> fmt::Display for LayoutError<'tcx> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { - LayoutError::Unknown(ty) => { - write!(f, "the type `{:?}` has an unknown layout", ty) - } + LayoutError::Unknown(ty) => write!(f, "the type `{:?}` has an unknown layout", ty), LayoutError::SizeOverflow(ty) => { write!(f, "the type `{:?}` is too big for the current architecture", ty) } @@ -189,15 +190,11 @@ fn layout_raw<'tcx>( let (param_env, ty) = query.into_parts(); if icx.layout_depth > rec_limit { - tcx.sess.fatal( - &format!("overflow representing the type `{}`", ty)); + tcx.sess.fatal(&format!("overflow representing the type `{}`", ty)); } // Update the ImplicitCtxt to increase the layout_depth - let icx = ty::tls::ImplicitCtxt { - layout_depth: icx.layout_depth + 1, - ..icx.clone() - }; + let icx = ty::tls::ImplicitCtxt { layout_depth: icx.layout_depth + 1, ..icx.clone() }; ty::tls::enter_context(&icx, |_| { let cx = LayoutCx { tcx, param_env }; @@ -214,10 +211,7 @@ fn layout_raw<'tcx>( } pub fn provide(providers: &mut ty::query::Providers<'_>) { - *providers = ty::query::Providers { - layout_raw, - ..*providers - }; + *providers = ty::query::Providers { layout_raw, ..*providers }; } pub struct LayoutCx<'tcx, C> { @@ -267,31 +261,29 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { variants: Variants::Single { index: VariantIdx::new(0) }, fields: FieldPlacement::Arbitrary { offsets: vec![Size::ZERO, b_offset], - memory_index: vec![0, 1] + memory_index: vec![0, 1], }, abi: Abi::ScalarPair(a, b), largest_niche, align, - size + size, } } - fn univariant_uninterned(&self, - ty: Ty<'tcx>, - fields: &[TyLayout<'_>], - repr: &ReprOptions, - kind: StructKind) -> Result> { + fn univariant_uninterned( + &self, + ty: Ty<'tcx>, + fields: &[TyLayout<'_>], + repr: &ReprOptions, + kind: StructKind, + ) -> Result> { let dl = self.data_layout(); let pack = repr.pack; if pack.is_some() && repr.align.is_some() { bug!("struct cannot be packed and aligned"); } - let mut align = if pack.is_some() { - dl.i8_align - } else { - dl.aggregate_align - }; + let mut align = if pack.is_some() { dl.i8_align } else { dl.aggregate_align }; let mut sized = true; let mut offsets = vec![Size::ZERO; fields.len()]; @@ -303,18 +295,14 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { } if optimize { - let end = if let StructKind::MaybeUnsized = kind { - fields.len() - 1 - } else { - fields.len() - }; + let end = + if let StructKind::MaybeUnsized = kind { fields.len() - 1 } else { fields.len() }; let optimizing = &mut inverse_memory_index[..end]; let field_align = |f: &TyLayout<'_>| { if let Some(pack) = pack { f.align.abi.min(pack) } else { f.align.abi } }; match kind { - StructKind::AlwaysSized | - StructKind::MaybeUnsized => { + StructKind::AlwaysSized | StructKind::MaybeUnsized => { optimizing.sort_by_key(|&x| { // Place ZSTs first to avoid "interesting offsets", // especially with only one or two non-ZST fields. @@ -335,17 +323,13 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { // At the bottom of this function, we invert `inverse_memory_index` to // produce `memory_index` (see `invert_mapping`). - let mut offset = Size::ZERO; let mut largest_niche = None; let mut largest_niche_available = 0; if let StructKind::Prefixed(prefix_size, prefix_align) = kind { - let prefix_align = if let Some(pack) = pack { - prefix_align.min(pack) - } else { - prefix_align - }; + let prefix_align = + if let Some(pack) = pack { prefix_align.min(pack) } else { prefix_align }; align = align.max(AbiAndPrefAlign::new(prefix_align)); offset = prefix_size.align_to(prefix_align); } @@ -353,8 +337,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { for &i in &inverse_memory_index { let field = fields[i as usize]; if !sized { - bug!("univariant: field #{} of `{}` comes after unsized field", - offsets.len(), ty); + bug!("univariant: field #{} of `{}` comes after unsized field", offsets.len(), ty); } if field.is_unsized() { @@ -382,8 +365,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { } } - offset = offset.checked_add(field.size, dl) - .ok_or(LayoutError::SizeOverflow(ty))?; + offset = offset.checked_add(field.size, dl).ok_or(LayoutError::SizeOverflow(ty))?; } if let Some(repr_align) = repr.align { @@ -413,19 +395,18 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { // Unpack newtype ABIs and find scalar pairs. if sized && size.bytes() > 0 { // All other fields must be ZSTs, and we need them to all start at 0. - let mut zst_offsets = - offsets.iter().enumerate().filter(|&(i, _)| fields[i].is_zst()); + let mut zst_offsets = offsets.iter().enumerate().filter(|&(i, _)| fields[i].is_zst()); if zst_offsets.all(|(_, o)| o.bytes() == 0) { - let mut non_zst_fields = - fields.iter().enumerate().filter(|&(_, f)| !f.is_zst()); + let mut non_zst_fields = fields.iter().enumerate().filter(|&(_, f)| !f.is_zst()); match (non_zst_fields.next(), non_zst_fields.next(), non_zst_fields.next()) { // We have exactly one non-ZST field. (Some((i, field)), None, None) => { // Field fills the struct and it has a scalar or scalar pair ABI. - if offsets[i].bytes() == 0 && - align.abi == field.align.abi && - size == field.size { + if offsets[i].bytes() == 0 + && align.abi == field.align.abi + && size == field.size + { match field.abi { // For plain scalars, or vectors of them, we can't unpack // newtypes for `#[repr(C)]`, as that affects C ABIs. @@ -443,11 +424,23 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { } // Two non-ZST fields, and they're both scalars. - (Some((i, &TyLayout { - details: &LayoutDetails { abi: Abi::Scalar(ref a), .. }, .. - })), Some((j, &TyLayout { - details: &LayoutDetails { abi: Abi::Scalar(ref b), .. }, .. - })), None) => { + ( + Some(( + i, + &TyLayout { + details: &LayoutDetails { abi: Abi::Scalar(ref a), .. }, + .. + }, + )), + Some(( + j, + &TyLayout { + details: &LayoutDetails { abi: Abi::Scalar(ref b), .. }, + .. + }, + )), + None, + ) => { // Order by the memory placement, not source order. let ((i, a), (j, b)) = if offsets[i] < offsets[j] { ((i, a), (j, b)) @@ -456,19 +449,17 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { }; let pair = self.scalar_pair(a.clone(), b.clone()); let pair_offsets = match pair.fields { - FieldPlacement::Arbitrary { - ref offsets, - ref memory_index - } => { + FieldPlacement::Arbitrary { ref offsets, ref memory_index } => { assert_eq!(memory_index, &[0, 1]); offsets } - _ => bug!() + _ => bug!(), }; - if offsets[i] == pair_offsets[0] && - offsets[j] == pair_offsets[1] && - align == pair.align && - size == pair.size { + if offsets[i] == pair_offsets[0] + && offsets[j] == pair_offsets[1] + && align == pair.align + && size == pair.size + { // We can use `ScalarPair` only when it matches our // already computed layout (including `#[repr(C)]`). abi = pair.abi; @@ -486,14 +477,11 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { Ok(LayoutDetails { variants: Variants::Single { index: VariantIdx::new(0) }, - fields: FieldPlacement::Arbitrary { - offsets, - memory_index - }, + fields: FieldPlacement::Arbitrary { offsets, memory_index }, abi, largest_niche, align, - size + size, }) } @@ -504,14 +492,10 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let scalar_unit = |value: Primitive| { let bits = value.size(dl).bits(); assert!(bits <= 128); - Scalar { - value, - valid_range: 0..=(!0 >> (128 - bits)) - } - }; - let scalar = |value: Primitive| { - tcx.intern_layout(LayoutDetails::scalar(self, scalar_unit(value))) + Scalar { value, valid_range: 0..=(!0 >> (128 - bits)) } }; + let scalar = + |value: Primitive| tcx.intern_layout(LayoutDetails::scalar(self, scalar_unit(value))); let univariant = |fields: &[TyLayout<'_>], repr: &ReprOptions, kind| { Ok(tcx.intern_layout(self.univariant_uninterned(ty, fields, repr, kind)?)) @@ -520,24 +504,16 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { Ok(match ty.kind { // Basic scalars. - ty::Bool => { - tcx.intern_layout(LayoutDetails::scalar(self, Scalar { - value: Int(I8, false), - valid_range: 0..=1 - })) - } - ty::Char => { - tcx.intern_layout(LayoutDetails::scalar(self, Scalar { - value: Int(I32, false), - valid_range: 0..=0x10FFFF - })) - } - ty::Int(ity) => { - scalar(Int(Integer::from_attr(dl, attr::SignedInt(ity)), true)) - } - ty::Uint(ity) => { - scalar(Int(Integer::from_attr(dl, attr::UnsignedInt(ity)), false)) - } + ty::Bool => tcx.intern_layout(LayoutDetails::scalar( + self, + Scalar { value: Int(I8, false), valid_range: 0..=1 }, + )), + ty::Char => tcx.intern_layout(LayoutDetails::scalar( + self, + Scalar { value: Int(I32, false), valid_range: 0..=0x10FFFF }, + )), + ty::Int(ity) => scalar(Int(Integer::from_attr(dl, attr::SignedInt(ity)), true)), + ty::Uint(ity) => scalar(Int(Integer::from_attr(dl, attr::UnsignedInt(ity)), false)), ty::Float(fty) => scalar(match fty { ast::FloatTy::F32 => F32, ast::FloatTy::F64 => F64, @@ -549,20 +525,17 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { } // The never type. - ty::Never => { - tcx.intern_layout(LayoutDetails { - variants: Variants::Single { index: VariantIdx::new(0) }, - fields: FieldPlacement::Union(0), - abi: Abi::Uninhabited, - largest_niche: None, - align: dl.i8_align, - size: Size::ZERO - }) - } + ty::Never => tcx.intern_layout(LayoutDetails { + variants: Variants::Single { index: VariantIdx::new(0) }, + fields: FieldPlacement::Union(0), + abi: Abi::Uninhabited, + largest_niche: None, + align: dl.i8_align, + size: Size::ZERO, + }), // Potentially-fat pointers. - ty::Ref(_, pointee, _) | - ty::RawPtr(ty::TypeAndMut { ty: pointee, .. }) => { + ty::Ref(_, pointee, _) | ty::RawPtr(ty::TypeAndMut { ty: pointee, .. }) => { let mut data_ptr = scalar_unit(Pointer); if !ty.is_unsafe_ptr() { data_ptr.valid_range = 1..=*data_ptr.valid_range.end(); @@ -578,15 +551,13 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { ty::Foreign(..) => { return Ok(tcx.intern_layout(LayoutDetails::scalar(self, data_ptr))); } - ty::Slice(_) | ty::Str => { - scalar_unit(Int(dl.ptr_sized_integer(), false)) - } + ty::Slice(_) | ty::Str => scalar_unit(Int(dl.ptr_sized_integer(), false)), ty::Dynamic(..) => { let mut vtable = scalar_unit(Pointer); vtable.valid_range = 1..=*vtable.valid_range.end(); vtable } - _ => return Err(LayoutError::Unknown(unsized_part)) + _ => return Err(LayoutError::Unknown(unsized_part)), }; // Effectively a (ptr, meta) tuple. @@ -604,8 +575,8 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let count = count.try_eval_usize(tcx, param_env).ok_or(LayoutError::Unknown(ty))?; let element = self.layout_of(element)?; - let size = element.size.checked_mul(count, dl) - .ok_or(LayoutError::SizeOverflow(ty))?; + let size = + element.size.checked_mul(count, dl).ok_or(LayoutError::SizeOverflow(ty))?; let abi = if count != 0 && ty.conservative_is_privately_uninhabited(tcx) { Abi::Uninhabited @@ -613,62 +584,49 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { Abi::Aggregate { sized: true } }; - let largest_niche = if count != 0 { - element.largest_niche.clone() - } else { - None - }; + let largest_niche = if count != 0 { element.largest_niche.clone() } else { None }; tcx.intern_layout(LayoutDetails { variants: Variants::Single { index: VariantIdx::new(0) }, - fields: FieldPlacement::Array { - stride: element.size, - count - }, + fields: FieldPlacement::Array { stride: element.size, count }, abi, largest_niche, align: element.align, - size + size, }) } ty::Slice(element) => { let element = self.layout_of(element)?; tcx.intern_layout(LayoutDetails { variants: Variants::Single { index: VariantIdx::new(0) }, - fields: FieldPlacement::Array { - stride: element.size, - count: 0 - }, + fields: FieldPlacement::Array { stride: element.size, count: 0 }, abi: Abi::Aggregate { sized: false }, largest_niche: None, align: element.align, - size: Size::ZERO - }) - } - ty::Str => { - tcx.intern_layout(LayoutDetails { - variants: Variants::Single { index: VariantIdx::new(0) }, - fields: FieldPlacement::Array { - stride: Size::from_bytes(1), - count: 0 - }, - abi: Abi::Aggregate { sized: false }, - largest_niche: None, - align: dl.i8_align, - size: Size::ZERO + size: Size::ZERO, }) } + ty::Str => tcx.intern_layout(LayoutDetails { + variants: Variants::Single { index: VariantIdx::new(0) }, + fields: FieldPlacement::Array { stride: Size::from_bytes(1), count: 0 }, + abi: Abi::Aggregate { sized: false }, + largest_niche: None, + align: dl.i8_align, + size: Size::ZERO, + }), // Odd unit types. - ty::FnDef(..) => { - univariant(&[], &ReprOptions::default(), StructKind::AlwaysSized)? - } + ty::FnDef(..) => univariant(&[], &ReprOptions::default(), StructKind::AlwaysSized)?, ty::Dynamic(..) | ty::Foreign(..) => { - let mut unit = self.univariant_uninterned(ty, &[], &ReprOptions::default(), - StructKind::AlwaysSized)?; + let mut unit = self.univariant_uninterned( + ty, + &[], + &ReprOptions::default(), + StructKind::AlwaysSized, + )?; match unit.abi { Abi::Aggregate { ref mut sized } => *sized = false, - _ => bug!() + _ => bug!(), } tcx.intern_layout(unit) } @@ -677,21 +635,24 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { ty::Closure(def_id, ref substs) => { let tys = substs.as_closure().upvar_tys(def_id, tcx); - univariant(&tys.map(|ty| self.layout_of(ty)).collect::, _>>()?, + univariant( + &tys.map(|ty| self.layout_of(ty)).collect::, _>>()?, &ReprOptions::default(), - StructKind::AlwaysSized)? + StructKind::AlwaysSized, + )? } ty::Tuple(tys) => { - let kind = if tys.len() == 0 { - StructKind::AlwaysSized - } else { - StructKind::MaybeUnsized - }; + let kind = + if tys.len() == 0 { StructKind::AlwaysSized } else { StructKind::MaybeUnsized }; - univariant(&tys.iter().map(|k| { - self.layout_of(k.expect_ty()) - }).collect::, _>>()?, &ReprOptions::default(), kind)? + univariant( + &tys.iter() + .map(|k| self.layout_of(k.expect_ty())) + .collect::, _>>()?, + &ReprOptions::default(), + kind, + )? } // SIMD vector types. @@ -702,26 +663,22 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let scalar = match element.abi { Abi::Scalar(ref scalar) => scalar.clone(), _ => { - tcx.sess.fatal(&format!("monomorphising SIMD type `{}` with \ + tcx.sess.fatal(&format!( + "monomorphising SIMD type `{}` with \ a non-machine element type `{}`", - ty, element.ty)); + ty, element.ty + )); } }; - let size = element.size.checked_mul(count, dl) - .ok_or(LayoutError::SizeOverflow(ty))?; + let size = + element.size.checked_mul(count, dl).ok_or(LayoutError::SizeOverflow(ty))?; let align = dl.vector_align(size); let size = size.align_to(align.abi); tcx.intern_layout(LayoutDetails { variants: Variants::Single { index: VariantIdx::new(0) }, - fields: FieldPlacement::Array { - stride: element.size, - count - }, - abi: Abi::Vector { - element: scalar, - count - }, + fields: FieldPlacement::Array { stride: element.size, count }, + abi: Abi::Vector { element: scalar, count }, largest_niche: element.largest_niche.clone(), size, align, @@ -731,22 +688,24 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { // ADTs. ty::Adt(def, substs) => { // Cache the field layouts. - let variants = def.variants.iter().map(|v| { - v.fields.iter().map(|field| { - self.layout_of(field.ty(tcx, substs)) - }).collect::, _>>() - }).collect::, _>>()?; + let variants = def + .variants + .iter() + .map(|v| { + v.fields + .iter() + .map(|field| self.layout_of(field.ty(tcx, substs))) + .collect::, _>>() + }) + .collect::, _>>()?; if def.is_union() { if def.repr.pack.is_some() && def.repr.align.is_some() { bug!("union cannot be packed and aligned"); } - let mut align = if def.repr.pack.is_some() { - dl.i8_align - } else { - dl.aggregate_align - }; + let mut align = + if def.repr.pack.is_some() { dl.i8_align } else { dl.aggregate_align }; if let Some(repr_align) = def.repr.align { align = align.max(AbiAndPrefAlign::new(repr_align)); @@ -766,25 +725,20 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let field_abi = match &field.abi { Abi::Scalar(x) => Abi::Scalar(scalar_unit(x.value)), Abi::ScalarPair(x, y) => { - Abi::ScalarPair( - scalar_unit(x.value), - scalar_unit(y.value), - ) + Abi::ScalarPair(scalar_unit(x.value), scalar_unit(y.value)) } Abi::Vector { element: x, count } => { - Abi::Vector { - element: scalar_unit(x.value), - count: *count, - } + Abi::Vector { element: scalar_unit(x.value), count: *count } + } + Abi::Uninhabited | Abi::Aggregate { .. } => { + Abi::Aggregate { sized: true } } - Abi::Uninhabited | - Abi::Aggregate { .. } => Abi::Aggregate { sized: true }, }; if size == Size::ZERO { // first non ZST: initialize 'abi' abi = field_abi; - } else if abi != field_abi { + } else if abi != field_abi { // different fields have different ABI: reset to Aggregate abi = Abi::Aggregate { sized: true }; } @@ -803,7 +757,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { abi, largest_niche: None, align, - size: size.align_to(align.abi) + size: size.align_to(align.abi), })); } @@ -818,13 +772,9 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { uninhabited && is_zst }; let (present_first, present_second) = { - let mut present_variants = variants.iter_enumerated().filter_map(|(i, v)| { - if absent(v) { - None - } else { - Some(i) - } - }); + let mut present_variants = variants + .iter_enumerated() + .filter_map(|(i, v)| if absent(v) { None } else { Some(i) }); (present_variants.next(), present_variants.next()) }; let present_first = match present_first { @@ -851,18 +801,20 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { } else { let param_env = tcx.param_env(def.did); let last_field = def.variants[v].fields.last().unwrap(); - let always_sized = tcx.type_of(last_field.did) - .is_sized(tcx.at(DUMMY_SP), param_env); - if !always_sized { StructKind::MaybeUnsized } - else { StructKind::AlwaysSized } + let always_sized = + tcx.type_of(last_field.did).is_sized(tcx.at(DUMMY_SP), param_env); + if !always_sized { + StructKind::MaybeUnsized + } else { + StructKind::AlwaysSized + } }; let mut st = self.univariant_uninterned(ty, &variants[v], &def.repr, kind)?; st.variants = Variants::Single { index: v }; let (start, end) = self.tcx.layout_scalar_valid_range(def.did); match st.abi { - Abi::Scalar(ref mut scalar) | - Abi::ScalarPair(ref mut scalar, _) => { + Abi::Scalar(ref mut scalar) | Abi::ScalarPair(ref mut scalar, _) => { // the asserts ensure that we are not using the // `#[rustc_layout_scalar_valid_range(n)]` // attribute to widen the range of anything as that would probably @@ -914,7 +866,9 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { // The current code for niche-filling relies on variant indices // instead of actual discriminants, so dataful enums with // explicit discriminants (RFC #2363) would misbehave. - let no_explicit_discriminants = def.variants.iter_enumerated() + let no_explicit_discriminants = def + .variants + .iter_enumerated() .all(|(i, v)| v.discr == ty::VariantDiscr::Relative(i.as_u32())); // Niche-filling enum optimization. @@ -946,9 +900,9 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { } if let Some(i) = dataful_variant { - let count = ( - niche_variants.end().as_u32() - niche_variants.start().as_u32() + 1 - ) as u128; + let count = (niche_variants.end().as_u32() + - niche_variants.start().as_u32() + + 1) as u128; // FIXME(#62691) use the largest niche across all fields, // not just the first one. for (field_index, &field) in variants[i].iter().enumerate() { @@ -962,15 +916,22 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { }; let mut align = dl.aggregate_align; - let st = variants.iter_enumerated().map(|(j, v)| { - let mut st = self.univariant_uninterned(ty, v, - &def.repr, StructKind::AlwaysSized)?; - st.variants = Variants::Single { index: j }; - - align = align.max(st.align); - - Ok(st) - }).collect::, _>>()?; + let st = variants + .iter_enumerated() + .map(|(j, v)| { + let mut st = self.univariant_uninterned( + ty, + v, + &def.repr, + StructKind::AlwaysSized, + )?; + st.variants = Variants::Single { index: j }; + + align = align.max(st.align); + + Ok(st) + }) + .collect::, _>>()?; let offset = st[i].fields.offset(field_index) + niche.offset; let size = st[i].size; @@ -1002,7 +963,6 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { abi = Abi::Uninhabited; } - let largest_niche = Niche::from_scalar(dl, offset, niche_scalar.clone()); @@ -1019,7 +979,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { }, fields: FieldPlacement::Arbitrary { offsets: vec![offset], - memory_index: vec![0] + memory_index: vec![0], }, abi, largest_niche, @@ -1042,8 +1002,12 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { // sign extend the raw representation to be an i128 x = (x << (128 - bits)) >> (128 - bits); } - if x < min { min = x; } - if x > max { max = x; } + if x < min { + min = x; + } + if x > max { + max = x; + } } // We might have no inhabited variants, so pretend there's at least one. if (min, max) == (i128::max_value(), i128::min_value()) { @@ -1075,22 +1039,31 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { } // Create the set of structs that represent each variant. - let mut layout_variants = variants.iter_enumerated().map(|(i, field_layouts)| { - let mut st = self.univariant_uninterned(ty, &field_layouts, - &def.repr, StructKind::Prefixed(min_ity.size(), prefix_align))?; - st.variants = Variants::Single { index: i }; - // Find the first field we can't move later - // to make room for a larger discriminant. - for field in st.fields.index_by_increasing_offset().map(|j| field_layouts[j]) { - if !field.is_zst() || field.align.abi.bytes() != 1 { - start_align = start_align.min(field.align.abi); - break; + let mut layout_variants = variants + .iter_enumerated() + .map(|(i, field_layouts)| { + let mut st = self.univariant_uninterned( + ty, + &field_layouts, + &def.repr, + StructKind::Prefixed(min_ity.size(), prefix_align), + )?; + st.variants = Variants::Single { index: i }; + // Find the first field we can't move later + // to make room for a larger discriminant. + for field in + st.fields.index_by_increasing_offset().map(|j| field_layouts[j]) + { + if !field.is_zst() || field.align.abi.bytes() != 1 { + start_align = start_align.min(field.align.abi); + break; + } } - } - size = cmp::max(size, st.size); - align = align.max(st.align); - Ok(st) - }).collect::, _>>()?; + size = cmp::max(size, st.size); + align = align.max(st.align); + Ok(st) + }) + .collect::, _>>()?; // Align the maximum variant size to the largest alignment. size = size.align_to(align.abi); @@ -1110,8 +1083,11 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { // to store this 16-bit discriminant into 8-bit sized temporary some of the // space necessary to represent would have to be discarded (or layout is wrong // on thinking it needs 16 bits) - bug!("layout decided on a larger discriminant type ({:?}) than typeck ({:?})", - min_ity, typeck_ity); + bug!( + "layout decided on a larger discriminant type ({:?}) than typeck ({:?})", + min_ity, + typeck_ity + ); // However, it is fine to make discr type however large (as an optimisation) // after this point – we’ll just truncate the value we load in codegen. } @@ -1154,7 +1130,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { variant.size = new_ity_size; } } - _ => bug!() + _ => bug!(), } } } @@ -1175,10 +1151,8 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { FieldPlacement::Arbitrary { ref offsets, .. } => offsets, _ => bug!(), }; - let mut fields = field_layouts - .iter() - .zip(offsets) - .filter(|p| !p.0.is_zst()); + let mut fields = + field_layouts.iter().zip(offsets).filter(|p| !p.0.is_zst()); let (field, offset) = match (fields.next(), fields.next()) { (None, None) => continue, (Some(pair), None) => pair, @@ -1210,19 +1184,17 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { if let Some((prim, offset)) = common_prim { let pair = self.scalar_pair(tag.clone(), scalar_unit(prim)); let pair_offsets = match pair.fields { - FieldPlacement::Arbitrary { - ref offsets, - ref memory_index - } => { + FieldPlacement::Arbitrary { ref offsets, ref memory_index } => { assert_eq!(memory_index, &[0, 1]); offsets } - _ => bug!() + _ => bug!(), }; - if pair_offsets[0] == Size::ZERO && - pair_offsets[1] == *offset && - align == pair.align && - size == pair.size { + if pair_offsets[0] == Size::ZERO + && pair_offsets[1] == *offset + && align == pair.align + && size == pair.size + { // We can use `ScalarPair` only when it matches our // already computed layout (including `#[repr(C)]`). abi = pair.abi; @@ -1245,12 +1217,12 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { }, fields: FieldPlacement::Arbitrary { offsets: vec![Size::ZERO], - memory_index: vec![0] + memory_index: vec![0], }, largest_niche, abi, align, - size + size, }) } @@ -1263,13 +1235,11 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { tcx.layout_raw(param_env.and(normalized))? } - ty::Bound(..) | - ty::Placeholder(..) | - ty::UnnormalizedProjection(..) | - ty::GeneratorWitness(..) | - ty::Infer(_) => { - bug!("LayoutDetails::compute: unexpected type `{}`", ty) - } + ty::Bound(..) + | ty::Placeholder(..) + | ty::UnnormalizedProjection(..) + | ty::GeneratorWitness(..) + | ty::Infer(_) => bug!("LayoutDetails::compute: unexpected type `{}`", ty), ty::Param(_) | ty::Error => { return Err(LayoutError::Unknown(ty)); @@ -1307,8 +1277,10 @@ enum SavedLocalEligibility { // of any variant. impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { /// Compute the eligibility and assignment of each local. - fn generator_saved_local_eligibility(&self, info: &GeneratorLayout<'tcx>) - -> (BitSet, IndexVec) { + fn generator_saved_local_eligibility( + &self, + info: &GeneratorLayout<'tcx>, + ) -> (BitSet, IndexVec) { use SavedLocalEligibility::*; let mut assignments: IndexVec = @@ -1329,12 +1301,16 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { Assigned(idx) => { // We've already seen this local at another suspension // point, so it is no longer a candidate. - trace!("removing local {:?} in >1 variant ({:?}, {:?})", - local, variant_index, idx); + trace!( + "removing local {:?} in >1 variant ({:?}, {:?})", + local, + variant_index, + idx + ); ineligible_locals.insert(*local); assignments[*local] = Ineligible(None); } - Ineligible(_) => {}, + Ineligible(_) => {} } } } @@ -1352,8 +1328,8 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { // cannot overlap in the generator layout. The only way to guarantee // this is if they are in the same variant, or one is ineligible // (which means it is stored in every variant). - if ineligible_locals.contains(local_b) || - assignments[local_a] == assignments[local_b] + if ineligible_locals.contains(local_b) + || assignments[local_a] == assignments[local_b] { continue; } @@ -1362,11 +1338,8 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { // This is not always optimal; it's just a greedy heuristic that // seems to produce good results most of the time. let conflicts_b = info.storage_conflicts.count(local_b); - let (remove, other) = if conflicts_a > conflicts_b { - (local_a, local_b) - } else { - (local_b, local_a) - }; + let (remove, other) = + if conflicts_a > conflicts_b { (local_a, local_b) } else { (local_b, local_a) }; ineligible_locals.insert(remove); assignments[remove] = Ineligible(None); trace!("removing local {:?} due to conflict with {:?}", remove, other); @@ -1382,7 +1355,9 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let mut used_variants = BitSet::new_empty(info.variant_fields.len()); for assignment in &assignments { match assignment { - Assigned(idx) => { used_variants.insert(*idx); } + Assigned(idx) => { + used_variants.insert(*idx); + } _ => {} } } @@ -1417,7 +1392,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { use SavedLocalEligibility::*; let tcx = self.tcx; - let subst_field = |ty: Ty<'tcx>| { ty.subst(tcx, substs) }; + let subst_field = |ty: Ty<'tcx>| ty.subst(tcx, substs); let info = tcx.generator_layout(def_id); let (ineligible_locals, assignments) = self.generator_saved_local_eligibility(&info); @@ -1432,11 +1407,14 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { Abi::Scalar(s) => s.clone(), _ => bug!(), }; - let promoted_layouts = ineligible_locals.iter() + let promoted_layouts = ineligible_locals + .iter() .map(|local| subst_field(info.field_tys[local])) .map(|ty| tcx.mk_maybe_uninit(ty)) .map(|ty| self.layout_of(ty)); - let prefix_layouts = substs.as_generator().prefix_tys(def_id, tcx) + let prefix_layouts = substs + .as_generator() + .prefix_tys(def_id, tcx) .map(|ty| self.layout_of(ty)) .chain(iter::once(Ok(discr_layout))) .chain(promoted_layouts) @@ -1478,10 +1456,8 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let memory_index_a = invert_mapping(&inverse_memory_index_a); let memory_index_b = invert_mapping(&inverse_memory_index_b); - let outer_fields = FieldPlacement::Arbitrary { - offsets: offsets_a, - memory_index: memory_index_a, - }; + let outer_fields = + FieldPlacement::Arbitrary { offsets: offsets_a, memory_index: memory_index_a }; (outer_fields, offsets_b, memory_index_b) } _ => bug!(), @@ -1489,84 +1465,90 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let mut size = prefix.size; let mut align = prefix.align; - let variants = info.variant_fields.iter_enumerated().map(|(index, variant_fields)| { - // Only include overlap-eligible fields when we compute our variant layout. - let variant_only_tys = variant_fields - .iter() - .filter(|local| { - match assignments[**local] { + let variants = info + .variant_fields + .iter_enumerated() + .map(|(index, variant_fields)| { + // Only include overlap-eligible fields when we compute our variant layout. + let variant_only_tys = variant_fields + .iter() + .filter(|local| match assignments[**local] { Unassigned => bug!(), Assigned(v) if v == index => true, Assigned(_) => bug!("assignment does not match variant"), Ineligible(_) => false, - } - }) - .map(|local| subst_field(info.field_tys[*local])); - - let mut variant = self.univariant_uninterned( - ty, - &variant_only_tys - .map(|ty| self.layout_of(ty)) - .collect::, _>>()?, - &ReprOptions::default(), - StructKind::Prefixed(prefix_size, prefix_align.abi))?; - variant.variants = Variants::Single { index }; - - let (offsets, memory_index) = match variant.fields { - FieldPlacement::Arbitrary { offsets, memory_index } => { - (offsets, memory_index) - } - _ => bug!(), - }; + }) + .map(|local| subst_field(info.field_tys[*local])); - // Now, stitch the promoted and variant-only fields back together in - // the order they are mentioned by our GeneratorLayout. - // Because we only use some subset (that can differ between variants) - // of the promoted fields, we can't just pick those elements of the - // `promoted_memory_index` (as we'd end up with gaps). - // So instead, we build an "inverse memory_index", as if all of the - // promoted fields were being used, but leave the elements not in the - // subset as `INVALID_FIELD_IDX`, which we can filter out later to - // obtain a valid (bijective) mapping. - const INVALID_FIELD_IDX: u32 = !0; - let mut combined_inverse_memory_index = - vec![INVALID_FIELD_IDX; promoted_memory_index.len() + memory_index.len()]; - let mut offsets_and_memory_index = offsets.into_iter().zip(memory_index); - let combined_offsets = variant_fields.iter().enumerate().map(|(i, local)| { - let (offset, memory_index) = match assignments[*local] { - Unassigned => bug!(), - Assigned(_) => { - let (offset, memory_index) = offsets_and_memory_index.next().unwrap(); - (offset, promoted_memory_index.len() as u32 + memory_index) - } - Ineligible(field_idx) => { - let field_idx = field_idx.unwrap() as usize; - (promoted_offsets[field_idx], promoted_memory_index[field_idx]) - } + let mut variant = self.univariant_uninterned( + ty, + &variant_only_tys + .map(|ty| self.layout_of(ty)) + .collect::, _>>()?, + &ReprOptions::default(), + StructKind::Prefixed(prefix_size, prefix_align.abi), + )?; + variant.variants = Variants::Single { index }; + + let (offsets, memory_index) = match variant.fields { + FieldPlacement::Arbitrary { offsets, memory_index } => (offsets, memory_index), + _ => bug!(), }; - combined_inverse_memory_index[memory_index as usize] = i as u32; - offset - }).collect(); - - // Remove the unused slots and invert the mapping to obtain the - // combined `memory_index` (also see previous comment). - combined_inverse_memory_index.retain(|&i| i != INVALID_FIELD_IDX); - let combined_memory_index = invert_mapping(&combined_inverse_memory_index); - - variant.fields = FieldPlacement::Arbitrary { - offsets: combined_offsets, - memory_index: combined_memory_index, - }; - size = size.max(variant.size); - align = align.max(variant.align); - Ok(variant) - }).collect::, _>>()?; + // Now, stitch the promoted and variant-only fields back together in + // the order they are mentioned by our GeneratorLayout. + // Because we only use some subset (that can differ between variants) + // of the promoted fields, we can't just pick those elements of the + // `promoted_memory_index` (as we'd end up with gaps). + // So instead, we build an "inverse memory_index", as if all of the + // promoted fields were being used, but leave the elements not in the + // subset as `INVALID_FIELD_IDX`, which we can filter out later to + // obtain a valid (bijective) mapping. + const INVALID_FIELD_IDX: u32 = !0; + let mut combined_inverse_memory_index = + vec![INVALID_FIELD_IDX; promoted_memory_index.len() + memory_index.len()]; + let mut offsets_and_memory_index = offsets.into_iter().zip(memory_index); + let combined_offsets = variant_fields + .iter() + .enumerate() + .map(|(i, local)| { + let (offset, memory_index) = match assignments[*local] { + Unassigned => bug!(), + Assigned(_) => { + let (offset, memory_index) = + offsets_and_memory_index.next().unwrap(); + (offset, promoted_memory_index.len() as u32 + memory_index) + } + Ineligible(field_idx) => { + let field_idx = field_idx.unwrap() as usize; + (promoted_offsets[field_idx], promoted_memory_index[field_idx]) + } + }; + combined_inverse_memory_index[memory_index as usize] = i as u32; + offset + }) + .collect(); + + // Remove the unused slots and invert the mapping to obtain the + // combined `memory_index` (also see previous comment). + combined_inverse_memory_index.retain(|&i| i != INVALID_FIELD_IDX); + let combined_memory_index = invert_mapping(&combined_inverse_memory_index); + + variant.fields = FieldPlacement::Arbitrary { + offsets: combined_offsets, + memory_index: combined_memory_index, + }; + + size = size.max(variant.size); + align = align.max(variant.align); + Ok(variant) + }) + .collect::, _>>()?; size = size.align_to(align.abi); - let abi = if prefix.abi.is_uninhabited() || - variants.iter().all(|v| v.abi.is_uninhabited()) { + let abi = if prefix.abi.is_uninhabited() || variants.iter().all(|v| v.abi.is_uninhabited()) + { Abi::Uninhabited } else { Abi::Aggregate { sized: true } @@ -1604,23 +1586,22 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { // Ignore layouts that are done with non-empty environments or // non-monomorphic layouts, as the user only wants to see the stuff // resulting from the final codegen session. - if - layout.ty.has_param_types() || - !self.param_env.caller_bounds.is_empty() - { + if layout.ty.has_param_types() || !self.param_env.caller_bounds.is_empty() { return; } // (delay format until we actually need it) let record = |kind, packed, opt_discr_size, variants| { let type_desc = format!("{:?}", layout.ty); - self.tcx.sess.code_stats.record_type_size(kind, - type_desc, - layout.align.abi, - layout.size, - packed, - opt_discr_size, - variants); + self.tcx.sess.code_stats.record_type_size( + kind, + type_desc, + layout.align.abi, + layout.size, + packed, + opt_discr_size, + variants, + ); }; let adt_def = match layout.ty.kind { @@ -1644,12 +1625,12 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let adt_kind = adt_def.adt_kind(); let adt_packed = adt_def.repr.pack.is_some(); - let build_variant_info = |n: Option, - flds: &[ast::Name], - layout: TyLayout<'tcx>| { + let build_variant_info = |n: Option, flds: &[ast::Name], layout: TyLayout<'tcx>| { let mut min_size = Size::ZERO; - let field_info: Vec<_> = flds.iter().enumerate().map(|(i, &name)| { - match layout.field(self, i) { + let field_info: Vec<_> = flds + .iter() + .enumerate() + .map(|(i, &name)| match layout.field(self, i) { Err(err) => { bug!("no layout found for field {}: `{:?}`", name, err); } @@ -1666,8 +1647,8 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { align: field_layout.align.abi.bytes(), } } - } - }).collect(); + }) + .collect(); session::VariantInfo { name: n.map(|n| n.to_string()), @@ -1677,29 +1658,23 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { session::SizeKind::Exact }, align: layout.align.abi.bytes(), - size: if min_size.bytes() == 0 { - layout.size.bytes() - } else { - min_size.bytes() - }, + size: if min_size.bytes() == 0 { layout.size.bytes() } else { min_size.bytes() }, fields: field_info, } }; match layout.variants { Variants::Single { index } => { - debug!("print-type-size `{:#?}` variant {}", - layout, adt_def.variants[index].ident); + debug!("print-type-size `{:#?}` variant {}", layout, adt_def.variants[index].ident); if !adt_def.variants.is_empty() { let variant_def = &adt_def.variants[index]; - let fields: Vec<_> = - variant_def.fields.iter().map(|f| f.ident.name).collect(); - record(adt_kind.into(), - adt_packed, - None, - vec![build_variant_info(Some(variant_def.ident), - &fields, - layout)]); + let fields: Vec<_> = variant_def.fields.iter().map(|f| f.ident.name).collect(); + record( + adt_kind.into(), + adt_packed, + None, + vec![build_variant_info(Some(variant_def.ident), &fields, layout)], + ); } else { // (This case arises for *empty* enums; so give it // zero variants.) @@ -1708,21 +1683,33 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { } Variants::Multiple { ref discr, ref discr_kind, .. } => { - debug!("print-type-size `{:#?}` adt general variants def {}", - layout.ty, adt_def.variants.len()); - let variant_infos: Vec<_> = - adt_def.variants.iter_enumerated().map(|(i, variant_def)| { + debug!( + "print-type-size `{:#?}` adt general variants def {}", + layout.ty, + adt_def.variants.len() + ); + let variant_infos: Vec<_> = adt_def + .variants + .iter_enumerated() + .map(|(i, variant_def)| { let fields: Vec<_> = variant_def.fields.iter().map(|f| f.ident.name).collect(); - build_variant_info(Some(variant_def.ident), - &fields, - layout.for_variant(self, i)) + build_variant_info( + Some(variant_def.ident), + &fields, + layout.for_variant(self, i), + ) }) .collect(); - record(adt_kind.into(), adt_packed, match discr_kind { - DiscriminantKind::Tag => Some(discr.value.size(self)), - _ => None - }, variant_infos); + record( + adt_kind.into(), + adt_packed, + match discr_kind { + DiscriminantKind::Tag => Some(discr.value.size(self)), + _ => None, + }, + variant_infos, + ); } } } @@ -1744,8 +1731,8 @@ pub enum SizeSkeleton<'tcx> { /// The type which determines the unsized metadata, if any, /// of this pointer. Either a type parameter or a projection /// depending on one, with regions erased. - tail: Ty<'tcx> - } + tail: Ty<'tcx>, + }, } impl<'tcx> SizeSkeleton<'tcx> { @@ -1761,27 +1748,25 @@ impl<'tcx> SizeSkeleton<'tcx> { Ok(layout) => { return Ok(SizeSkeleton::Known(layout.size)); } - Err(err) => err + Err(err) => err, }; match ty.kind { - ty::Ref(_, pointee, _) | - ty::RawPtr(ty::TypeAndMut { ty: pointee, .. }) => { + ty::Ref(_, pointee, _) | ty::RawPtr(ty::TypeAndMut { ty: pointee, .. }) => { let non_zero = !ty.is_unsafe_ptr(); let tail = tcx.struct_tail_erasing_lifetimes(pointee, param_env); match tail.kind { ty::Param(_) | ty::Projection(_) => { debug_assert!(tail.has_param_types()); - Ok(SizeSkeleton::Pointer { - non_zero, - tail: tcx.erase_regions(&tail) - }) + Ok(SizeSkeleton::Pointer { non_zero, tail: tcx.erase_regions(&tail) }) } - _ => { - bug!("SizeSkeleton::compute({}): layout errored ({}), yet \ + _ => bug!( + "SizeSkeleton::compute({}): layout errored ({}), yet \ tail `{}` is not a type parameter or a projection", - ty, err, tail) - } + ty, + err, + tail + ), } } @@ -1794,9 +1779,10 @@ impl<'tcx> SizeSkeleton<'tcx> { // Get a zero-sized variant or a pointer newtype. let zero_or_ptr_variant = |i| { let i = VariantIdx::new(i); - let fields = def.variants[i].fields.iter().map(|field| { - SizeSkeleton::compute(field.ty(tcx, substs), tcx, param_env) - }); + let fields = def.variants[i] + .fields + .iter() + .map(|field| SizeSkeleton::compute(field.ty(tcx, substs), tcx, param_env)); let mut ptr = None; for field in fields { let field = field?; @@ -1806,7 +1792,7 @@ impl<'tcx> SizeSkeleton<'tcx> { return Err(err); } } - SizeSkeleton::Pointer {..} => { + SizeSkeleton::Pointer { .. } => { if ptr.is_some() { return Err(err); } @@ -1822,12 +1808,14 @@ impl<'tcx> SizeSkeleton<'tcx> { if def.variants.len() == 1 { if let Some(SizeSkeleton::Pointer { non_zero, tail }) = v0 { return Ok(SizeSkeleton::Pointer { - non_zero: non_zero || match tcx.layout_scalar_valid_range(def.did) { - (Bound::Included(start), Bound::Unbounded) => start > 0, - (Bound::Included(start), Bound::Included(end)) => - 0 < start && start < end, - _ => false, - }, + non_zero: non_zero + || match tcx.layout_scalar_valid_range(def.did) { + (Bound::Included(start), Bound::Unbounded) => start > 0, + (Bound::Included(start), Bound::Included(end)) => { + 0 < start && start < end + } + _ => false, + }, tail, }); } else { @@ -1838,14 +1826,11 @@ impl<'tcx> SizeSkeleton<'tcx> { let v1 = zero_or_ptr_variant(1)?; // Nullable pointer enum optimization. match (v0, v1) { - (Some(SizeSkeleton::Pointer { non_zero: true, tail }), None) | - (None, Some(SizeSkeleton::Pointer { non_zero: true, tail })) => { - Ok(SizeSkeleton::Pointer { - non_zero: false, - tail, - }) + (Some(SizeSkeleton::Pointer { non_zero: true, tail }), None) + | (None, Some(SizeSkeleton::Pointer { non_zero: true, tail })) => { + Ok(SizeSkeleton::Pointer { non_zero: false, tail }) } - _ => Err(err) + _ => Err(err), } } @@ -1858,16 +1843,17 @@ impl<'tcx> SizeSkeleton<'tcx> { } } - _ => Err(err) + _ => Err(err), } } pub fn same_size(self, other: SizeSkeleton<'_>) -> bool { match (self, other) { (SizeSkeleton::Known(a), SizeSkeleton::Known(b)) => a == b, - (SizeSkeleton::Pointer { tail: a, .. }, - SizeSkeleton::Pointer { tail: b, .. }) => a == b, - _ => false + (SizeSkeleton::Pointer { tail: a, .. }, SizeSkeleton::Pointer { tail: b, .. }) => { + a == b + } + _ => false, } } } @@ -1952,10 +1938,7 @@ impl<'tcx> LayoutOf for LayoutCx<'tcx, TyCtxt<'tcx>> { let param_env = self.param_env.with_reveal_all(); let ty = self.tcx.normalize_erasing_regions(param_env, ty); let details = self.tcx.layout_raw(param_env.and(ty))?; - let layout = TyLayout { - ty, - details - }; + let layout = TyLayout { ty, details }; // N.B., this recording is normally disabled; when enabled, it // can however trigger recursive invocations of `layout_of`. @@ -1979,10 +1962,7 @@ impl LayoutOf for LayoutCx<'tcx, ty::query::TyCtxtAt<'tcx>> { let param_env = self.param_env.with_reveal_all(); let ty = self.tcx.normalize_erasing_regions(param_env, ty); let details = self.tcx.layout_raw(param_env.and(ty))?; - let layout = TyLayout { - ty, - details - }; + let layout = TyLayout { ty, details }; // N.B., this recording is normally disabled; when enabled, it // can however trigger recursive invocations of `layout_of`. @@ -1990,10 +1970,7 @@ impl LayoutOf for LayoutCx<'tcx, ty::query::TyCtxtAt<'tcx>> { // completed, to avoid problems around recursive structures // and the like. (Admittedly, I wasn't able to reproduce a problem // here, but it seems like the right thing to do. -nmatsakis) - let cx = LayoutCx { - tcx: *self.tcx, - param_env: self.param_env - }; + let cx = LayoutCx { tcx: *self.tcx, param_env: self.param_env }; cx.record_layout_for_printing(layout); Ok(layout) @@ -2005,12 +1982,11 @@ impl TyCtxt<'tcx> { /// Computes the layout of a type. Note that this implicitly /// executes in "reveal all" mode. #[inline] - pub fn layout_of(self, param_env_and_ty: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) - -> Result, LayoutError<'tcx>> { - let cx = LayoutCx { - tcx: self, - param_env: param_env_and_ty.param_env - }; + pub fn layout_of( + self, + param_env_and_ty: ty::ParamEnvAnd<'tcx, Ty<'tcx>>, + ) -> Result, LayoutError<'tcx>> { + let cx = LayoutCx { tcx: self, param_env: param_env_and_ty.param_env }; cx.layout_of(param_env_and_ty.value) } } @@ -2019,12 +1995,11 @@ impl ty::query::TyCtxtAt<'tcx> { /// Computes the layout of a type. Note that this implicitly /// executes in "reveal all" mode. #[inline] - pub fn layout_of(self, param_env_and_ty: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) - -> Result, LayoutError<'tcx>> { - let cx = LayoutCx { - tcx: self.at(self.span), - param_env: param_env_and_ty.param_env - }; + pub fn layout_of( + self, + param_env_and_ty: ty::ParamEnvAnd<'tcx, Ty<'tcx>>, + ) -> Result, LayoutError<'tcx>> { + let cx = LayoutCx { tcx: self.at(self.span), param_env: param_env_and_ty.param_env }; cx.layout_of(param_env_and_ty.value) } } @@ -2047,7 +2022,7 @@ where let fields = match this.ty.kind { ty::Adt(def, _) => def.variants[variant_index].fields.len(), - _ => bug!() + _ => bug!(), }; let tcx = cx.tcx(); tcx.intern_layout(LayoutDetails { @@ -2056,21 +2031,16 @@ where abi: Abi::Uninhabited, largest_niche: None, align: tcx.data_layout.i8_align, - size: Size::ZERO + size: Size::ZERO, }) } - Variants::Multiple { ref variants, .. } => { - &variants[variant_index] - } + Variants::Multiple { ref variants, .. } => &variants[variant_index], }; assert_eq!(details.variants, Variants::Single { index: variant_index }); - TyLayout { - ty: this.ty, - details - } + TyLayout { ty: this.ty, details } } fn field(this: TyLayout<'tcx>, cx: &C, i: usize) -> C::TyLayout { @@ -2084,23 +2054,20 @@ where }; cx.layout_of(match this.ty.kind { - ty::Bool | - ty::Char | - ty::Int(_) | - ty::Uint(_) | - ty::Float(_) | - ty::FnPtr(_) | - ty::Never | - ty::FnDef(..) | - ty::GeneratorWitness(..) | - ty::Foreign(..) | - ty::Dynamic(..) => { - bug!("TyLayout::field_type({:?}): not applicable", this) - } + ty::Bool + | ty::Char + | ty::Int(_) + | ty::Uint(_) + | ty::Float(_) + | ty::FnPtr(_) + | ty::Never + | ty::FnDef(..) + | ty::GeneratorWitness(..) + | ty::Foreign(..) + | ty::Dynamic(..) => bug!("TyLayout::field_type({:?}): not applicable", this), // Potentially-fat pointers. - ty::Ref(_, pointee, _) | - ty::RawPtr(ty::TypeAndMut { ty: pointee, .. }) => { + ty::Ref(_, pointee, _) | ty::RawPtr(ty::TypeAndMut { ty: pointee, .. }) => { assert!(i < this.fields.count()); // Reuse the fat `*T` type as its own thin pointer data field. @@ -2114,20 +2081,18 @@ where } else { tcx.mk_mut_ref(tcx.lifetimes.re_static, nil) }; - return MaybeResult::from(cx.layout_of(ptr_ty).to_result().map(|mut ptr_layout| { - ptr_layout.ty = this.ty; - ptr_layout - })); + return MaybeResult::from(cx.layout_of(ptr_ty).to_result().map( + |mut ptr_layout| { + ptr_layout.ty = this.ty; + ptr_layout + }, + )); } match tcx.struct_tail_erasing_lifetimes(pointee, cx.param_env()).kind { - ty::Slice(_) | - ty::Str => tcx.types.usize, + ty::Slice(_) | ty::Str => tcx.types.usize, ty::Dynamic(_, _) => { - tcx.mk_imm_ref( - tcx.lifetimes.re_static, - tcx.mk_array(tcx.types.usize, 3), - ) + tcx.mk_imm_ref(tcx.lifetimes.re_static, tcx.mk_array(tcx.types.usize, 3)) /* FIXME: use actual fn pointers Warning: naively computing the number of entries in the vtable by counting the methods on the trait + methods on @@ -2142,13 +2107,12 @@ where ]) */ } - _ => bug!("TyLayout::field_type({:?}): not applicable", this) + _ => bug!("TyLayout::field_type({:?}): not applicable", this), } } // Arrays and slices. - ty::Array(element, _) | - ty::Slice(element) => element, + ty::Array(element, _) | ty::Slice(element) => element, ty::Str => tcx.types.u8, // Tuples, generators and closures. @@ -2156,35 +2120,31 @@ where substs.as_closure().upvar_tys(def_id, tcx).nth(i).unwrap() } - ty::Generator(def_id, ref substs, _) => { - match this.variants { - Variants::Single { index } => { - substs.as_generator().state_tys(def_id, tcx) - .nth(index.as_usize()).unwrap() - .nth(i).unwrap() - } - Variants::Multiple { ref discr, discr_index, .. } => { - if i == discr_index { - return discr_layout(discr); - } - substs.as_generator().prefix_tys(def_id, tcx).nth(i).unwrap() + ty::Generator(def_id, ref substs, _) => match this.variants { + Variants::Single { index } => substs + .as_generator() + .state_tys(def_id, tcx) + .nth(index.as_usize()) + .unwrap() + .nth(i) + .unwrap(), + Variants::Multiple { ref discr, discr_index, .. } => { + if i == discr_index { + return discr_layout(discr); } + substs.as_generator().prefix_tys(def_id, tcx).nth(i).unwrap() } - } + }, ty::Tuple(tys) => tys[i].expect_ty(), // SIMD vector types. - ty::Adt(def, ..) if def.repr.simd() => { - this.ty.simd_type(tcx) - } + ty::Adt(def, ..) if def.repr.simd() => this.ty.simd_type(tcx), // ADTs. ty::Adt(def, substs) => { match this.variants { - Variants::Single { index } => { - def.variants[index].fields[i].ty(tcx, substs) - } + Variants::Single { index } => def.variants[index].fields[i].ty(tcx, substs), // Discriminant field for enums (where applicable). Variants::Multiple { ref discr, .. } => { @@ -2194,39 +2154,39 @@ where } } - ty::Projection(_) | ty::UnnormalizedProjection(..) | ty::Bound(..) | - ty::Placeholder(..) | ty::Opaque(..) | ty::Param(_) | ty::Infer(_) | - ty::Error => { - bug!("TyLayout::field_type: unexpected type `{}`", this.ty) - } + ty::Projection(_) + | ty::UnnormalizedProjection(..) + | ty::Bound(..) + | ty::Placeholder(..) + | ty::Opaque(..) + | ty::Param(_) + | ty::Infer(_) + | ty::Error => bug!("TyLayout::field_type: unexpected type `{}`", this.ty), }) } - fn pointee_info_at( - this: TyLayout<'tcx>, - cx: &C, - offset: Size, - ) -> Option { + fn pointee_info_at(this: TyLayout<'tcx>, cx: &C, offset: Size) -> Option { match this.ty.kind { ty::RawPtr(mt) if offset.bytes() == 0 => { - cx.layout_of(mt.ty).to_result().ok() - .map(|layout| PointeeInfo { - size: layout.size, - align: layout.align.abi, - safe: None, - }) + cx.layout_of(mt.ty).to_result().ok().map(|layout| PointeeInfo { + size: layout.size, + align: layout.align.abi, + safe: None, + }) } ty::Ref(_, ty, mt) if offset.bytes() == 0 => { let tcx = cx.tcx(); let is_freeze = ty.is_freeze(tcx, cx.param_env(), DUMMY_SP); let kind = match mt { - hir::Mutability::Immutable => if is_freeze { - PointerKind::Frozen - } else { - PointerKind::Shared - }, - hir::Mutability::Mutable => { + hir::Mutability::Not => { + if is_freeze { + PointerKind::Frozen + } else { + PointerKind::Shared + } + } + hir::Mutability::Mut => { // Previously we would only emit noalias annotations for LLVM >= 6 or in // panic=abort mode. That was deemed right, as prior versions had many bugs // in conjunction with unwinding, but later versions didn’t seem to have @@ -2238,8 +2198,8 @@ where // // For now, do not enable mutable_noalias by default at all, while the // issue is being figured out. - let mutable_noalias = tcx.sess.opts.debugging_opts.mutable_noalias - .unwrap_or(false); + let mutable_noalias = + tcx.sess.opts.debugging_opts.mutable_noalias.unwrap_or(false); if mutable_noalias { PointerKind::UniqueBorrowed } else { @@ -2248,12 +2208,11 @@ where } }; - cx.layout_of(ty).to_result().ok() - .map(|layout| PointeeInfo { - size: layout.size, - align: layout.align.abi, - safe: Some(kind), - }) + cx.layout_of(ty).to_result().ok().map(|layout| PointeeInfo { + size: layout.size, + align: layout.align.abi, + safe: Some(kind), + }) } _ => { @@ -2270,14 +2229,12 @@ where // using more niches than just null (e.g., the first page of // the address space, or unaligned pointers). Variants::Multiple { - discr_kind: DiscriminantKind::Niche { - dataful_variant, - .. - }, + discr_kind: DiscriminantKind::Niche { dataful_variant, .. }, discr_index, .. - } if this.fields.offset(discr_index) == offset => - Some(this.for_variant(cx, dataful_variant)), + } if this.fields.offset(discr_index) == offset => { + Some(this.for_variant(cx, dataful_variant)) + } _ => Some(this), }; @@ -2296,15 +2253,14 @@ where let field_start = variant.fields.offset(i); if field_start <= offset { let field = variant.field(cx, i); - result = field.to_result().ok() - .and_then(|field| { - if ptr_end <= field_start + field.size { - // We found the right field, look inside it. - field.pointee_info_at(cx, offset - field_start) - } else { - None - } - }); + result = field.to_result().ok().and_then(|field| { + if ptr_end <= field_start + field.size { + // We found the right field, look inside it. + field.pointee_info_at(cx, offset - field_start) + } else { + None + } + }); if result.is_some() { break; } @@ -2333,13 +2289,11 @@ impl<'a, 'tcx> HashStable> for LayoutError<'tcx> { mem::discriminant(self).hash_stable(hcx, hasher); match *self { - Unknown(t) | - SizeOverflow(t) => t.hash_stable(hcx, hasher) + Unknown(t) | SizeOverflow(t) => t.hash_stable(hcx, hasher), } } } - impl<'tcx> ty::Instance<'tcx> { // NOTE(eddyb) this is private to avoid using it from outside of // `FnAbi::of_instance` - any other uses are either too high-level @@ -2347,7 +2301,7 @@ impl<'tcx> ty::Instance<'tcx> { // or should go through `FnAbi` instead, to avoid losing any // adjustments `FnAbi::of_instance` might be performing. fn fn_sig_for_fn_abi(&self, tcx: TyCtxt<'tcx>) -> ty::PolyFnSig<'tcx> { - let ty = self.ty(tcx); + let ty = self.monomorphic_ty(tcx); match ty.kind { ty::FnDef(..) | // Shims currently have type FnPtr. Not sure this should remain. @@ -2495,10 +2449,7 @@ where } } - bug!( - "receiver has no non-zero-sized fields {:?}", - fat_pointer_layout - ); + bug!("receiver has no non-zero-sized fields {:?}", fat_pointer_layout); } fat_pointer_layout.ty @@ -2524,9 +2475,7 @@ where ) -> Self { debug!("FnAbi::new_internal({:?}, {:?})", sig, extra_args); - let sig = cx - .tcx() - .normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig); + let sig = cx.tcx().normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig); use rustc_target::spec::abi::Abi::*; let conv = match cx.tcx().sess.target.target.adjust_abi(sig.abi) { @@ -2558,17 +2507,21 @@ where let extra_args = if sig.abi == RustCall { assert!(!sig.c_variadic && extra_args.is_empty()); - match sig.inputs().last().unwrap().kind { - ty::Tuple(tupled_arguments) => { + if let Some(input) = sig.inputs().last() { + if let ty::Tuple(tupled_arguments) = input.kind { inputs = &sig.inputs()[0..sig.inputs().len() - 1]; tupled_arguments.iter().map(|k| k.expect_ty()).collect() - } - _ => { + } else { bug!( "argument to function with \"rust-call\" ABI \ - is not a tuple" + is not a tuple" ); } + } else { + bug!( + "argument to function with \"rust-call\" ABI \ + is not a tuple" + ); } } else { assert!(sig.c_variadic || extra_args.is_empty()); @@ -2619,7 +2572,7 @@ where // any time. Set their valid size to 0. attrs.pointee_size = match kind { PointerKind::UniqueOwned => Size::ZERO, - _ => pointee.size + _ => pointee.size, }; // `Box` pointer parameters never alias because ownership is transferred @@ -2758,10 +2711,7 @@ where // We want to pass small aggregates as immediates, but using // a LLVM aggregate type for this leads to bad optimizations, // so we pick an appropriately sized integer type instead. - arg.cast_to(Reg { - kind: RegKind::Integer, - size, - }); + arg.cast_to(Reg { kind: RegKind::Integer, size }); } }; fixup(&mut self.ret); diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 78a31f4e54..4889f751f6 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -1,94 +1,90 @@ // ignore-tidy-filelength -pub use self::Variance::*; +pub use self::fold::{TypeFoldable, TypeVisitor}; pub use self::AssocItemContainer::*; pub use self::BorrowKind::*; pub use self::IntVarValue::*; -pub use self::fold::{TypeFoldable, TypeVisitor}; +pub use self::Variance::*; + +use crate::arena::Arena; +use crate::hir::exports::ExportMap; +use crate::hir::map as hir_map; -use crate::hir::{map as hir_map, GlobMap, TraitMap}; -use crate::hir::Node; -use crate::hir::def::{Res, DefKind, CtorOf, CtorKind, ExportMap}; -use crate::hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; -use rustc_data_structures::svh::Svh; -use rustc_macros::HashStable; use crate::ich::Fingerprint; use crate::ich::StableHashingContext; use crate::infer::canonical::Canonical; use crate::middle::cstore::CrateStoreDyn; -use crate::middle::lang_items::{FnTraitLangItem, FnMutTraitLangItem, FnOnceTraitLangItem}; +use crate::middle::lang_items::{FnMutTraitLangItem, FnOnceTraitLangItem, FnTraitLangItem}; use crate::middle::resolve_lifetime::ObjectLifetimeDefault; -use crate::mir::ReadOnlyBodyAndCache; -use crate::mir::interpret::{GlobalId, ErrorHandled}; +use crate::mir::interpret::ErrorHandled; use crate::mir::GeneratorLayout; -use crate::session::CrateDisambiguator; +use crate::mir::ReadOnlyBodyAndCache; +use crate::session::DataTypeKind; use crate::traits::{self, Reveal}; use crate::ty; use crate::ty::layout::VariantIdx; -use crate::ty::subst::{Subst, InternalSubsts, SubstsRef}; -use crate::ty::util::{IntTypeExt, Discr}; +use crate::ty::subst::{InternalSubsts, Subst, SubstsRef}; +use crate::ty::util::{Discr, IntTypeExt}; use crate::ty::walk::TypeWalker; -use crate::util::captures::Captures; -use crate::util::nodemap::{NodeMap, NodeSet, DefIdMap, FxHashMap}; -use arena::SyncDroplessArena; -use crate::session::DataTypeKind; - +use rustc_data_structures::captures::Captures; +use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::fx::FxIndexMap; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_data_structures::sync::{self, par_iter, Lrc, ParallelIterator}; +use rustc_hir as hir; +use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res}; +use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; +use rustc_hir::{GlobMap, Node, TraitMap}; +use rustc_index::vec::{Idx, IndexVec}; +use rustc_macros::HashStable; use rustc_serialize::{self, Encodable, Encoder}; +use rustc_session::node_id::{NodeMap, NodeSet}; +use rustc_span::hygiene::ExpnId; +use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_span::Span; use rustc_target::abi::Align; +use smallvec; use std::cell::RefCell; use std::cmp::{self, Ordering}; use std::fmt; use std::hash::{Hash, Hasher}; use std::ops::Deref; -use rustc_data_structures::sync::{self, Lrc, ParallelIterator, par_iter}; +use std::ops::Range; use std::slice; use std::{mem, ptr}; -use std::ops::Range; -use syntax::ast::{self, Name, Ident, NodeId}; +use syntax::ast::{self, Constness, Ident, Name, NodeId}; use syntax::attr; -use syntax_pos::symbol::{kw, sym, Symbol}; -use syntax_pos::hygiene::ExpnId; -use syntax_pos::Span; - -use smallvec; -use rustc_data_structures::fx::{FxIndexMap}; -use rustc_data_structures::stable_hasher::{StableHasher, HashStable}; -use rustc_index::vec::{Idx, IndexVec}; -use crate::hir; - -pub use self::sty::{Binder, BoundTy, BoundTyKind, BoundVar, DebruijnIndex, INNERMOST}; -pub use self::sty::{FnSig, GenSig, CanonicalPolyFnSig, PolyFnSig, PolyGenSig}; -pub use self::sty::{InferTy, ParamTy, ParamConst, InferConst, ProjectionTy, ExistentialPredicate}; -pub use self::sty::{ClosureSubsts, GeneratorSubsts, UpvarSubsts, TypeAndMut}; -pub use self::sty::{TraitRef, TyKind, PolyTraitRef}; -pub use self::sty::{ExistentialTraitRef, PolyExistentialTraitRef}; -pub use self::sty::{ExistentialProjection, PolyExistentialProjection, Const, ConstKind}; -pub use self::sty::{BoundRegion, EarlyBoundRegion, FreeRegion, Region}; -pub use self::sty::RegionKind; -pub use self::sty::{TyVid, IntVid, FloatVid, ConstVid, RegionVid}; pub use self::sty::BoundRegion::*; pub use self::sty::InferTy::*; +pub use self::sty::RegionKind; pub use self::sty::RegionKind::*; pub use self::sty::TyKind::*; +pub use self::sty::{Binder, BoundTy, BoundTyKind, BoundVar, DebruijnIndex, INNERMOST}; +pub use self::sty::{BoundRegion, EarlyBoundRegion, FreeRegion, Region}; +pub use self::sty::{CanonicalPolyFnSig, FnSig, GenSig, PolyFnSig, PolyGenSig}; +pub use self::sty::{ClosureSubsts, GeneratorSubsts, TypeAndMut, UpvarSubsts}; +pub use self::sty::{Const, ConstKind, ExistentialProjection, PolyExistentialProjection}; +pub use self::sty::{ConstVid, FloatVid, IntVid, RegionVid, TyVid}; +pub use self::sty::{ExistentialPredicate, InferConst, InferTy, ParamConst, ParamTy, ProjectionTy}; +pub use self::sty::{ExistentialTraitRef, PolyExistentialTraitRef}; +pub use self::sty::{PolyTraitRef, TraitRef, TyKind}; pub use crate::ty::diagnostics::*; pub use self::binding::BindingMode; pub use self::binding::BindingMode::*; -pub use self::context::{TyCtxt, FreeRegionInfo, AllArenas, tls, keep_local}; -pub use self::context::{Lift, GeneratorInteriorTypeCause, TypeckTables, CtxtInterners, GlobalCtxt}; +pub use self::context::{keep_local, tls, FreeRegionInfo, TyCtxt}; +pub use self::context::{ + CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, ResolvedOpaqueTy, + UserType, UserTypeAnnotationIndex, +}; pub use self::context::{ - UserTypeAnnotationIndex, UserType, CanonicalUserType, - CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, ResolvedOpaqueTy, + CtxtInterners, GeneratorInteriorTypeCause, GlobalCtxt, Lift, TypeckTables, }; pub use self::instance::{Instance, InstanceDef}; -pub use self::structural_match::search_for_structural_match_violation; -pub use self::structural_match::type_marked_structural; -pub use self::structural_match::NonStructuralMatchTy; - pub use self::trait_def::TraitDef; pub use self::query::queries; @@ -98,15 +94,16 @@ pub mod binding; pub mod cast; #[macro_use] pub mod codec; -mod constness; -pub mod error; +pub mod _match; mod erase_regions; +pub mod error; pub mod fast_reject; pub mod flags; pub mod fold; +pub mod free_region_map; pub mod inhabitedness; pub mod layout; -pub mod _match; +pub mod normalize_erasing_regions; pub mod outlives; pub mod print; pub mod query; @@ -114,16 +111,14 @@ pub mod relate; pub mod steal; pub mod subst; pub mod trait_def; -pub mod walk; -pub mod wf; pub mod util; +pub mod walk; mod context; +mod diagnostics; mod instance; mod structural_impls; -mod structural_match; mod sty; -mod diagnostics; // Data types @@ -153,7 +148,7 @@ impl AssocItemContainer { pub fn assert_trait(&self) -> DefId { match *self { TraitContainer(id) => id, - _ => bug!("associated item has wrong container type: {:?}", self) + _ => bug!("associated item has wrong container type: {:?}", self), } } @@ -209,7 +204,17 @@ pub enum AssocKind { Const, Method, OpaqueTy, - Type + Type, +} + +impl AssocKind { + pub fn suggestion_descr(&self) -> &'static str { + match self { + ty::AssocKind::Method => "method call", + ty::AssocKind::Type | ty::AssocKind::OpaqueTy => "associated type", + ty::AssocKind::Const => "associated constant", + } + } } impl AssocItem { @@ -226,9 +231,7 @@ impl AssocItem { /// for ! pub fn relevant_for_never(&self) -> bool { match self.kind { - AssocKind::OpaqueTy | - AssocKind::Const | - AssocKind::Type => true, + AssocKind::OpaqueTy | AssocKind::Const | AssocKind::Type => true, // FIXME(canndrew): Be more thorough here, check if any argument is uninhabited. AssocKind::Method => !self.method_has_self_argument, } @@ -288,7 +291,7 @@ impl<'tcx> DefIdTree for TyCtxt<'tcx> { } impl Visibility { - pub fn from_hir(visibility: &hir::Visibility, id: hir::HirId, tcx: TyCtxt<'_>) -> Self { + pub fn from_hir(visibility: &hir::Visibility<'_>, id: hir::HirId, tcx: TyCtxt<'_>) -> Self { match visibility.node { hir::VisibilityKind::Public => Visibility::Public, hir::VisibilityKind::Crate(_) => Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)), @@ -342,10 +345,10 @@ impl Visibility { #[derive(Copy, Clone, PartialEq, RustcDecodable, RustcEncodable, HashStable)] pub enum Variance { - Covariant, // T <: T iff A <: B -- e.g., function return type - Invariant, // T <: T iff B == A -- e.g., type of mutable cell - Contravariant, // T <: T iff B <: A -- e.g., function param type - Bivariant, // T <: T -- e.g., unused type parameter + Covariant, // T <: T iff A <: B -- e.g., function return type + Invariant, // T <: T iff B == A -- e.g., type of mutable cell + Contravariant, // T <: T iff B <: A -- e.g., function param type + Bivariant, // T <: T -- e.g., unused type parameter } /// The crate variances map is computed during typeck and contains the @@ -578,7 +581,7 @@ impl<'tcx> rustc_serialize::UseSpecializedDecodable for Ty<'tcx> {} pub type CanonicalTy<'tcx> = Canonical<'tcx, Ty<'tcx>>; -extern { +extern "C" { /// A dummy type used to force `List` to be unsized while not requiring references to it be wide /// pointers. type OpaqueListContents; @@ -601,7 +604,7 @@ unsafe impl Sync for List {} impl List { #[inline] - fn from_arena<'tcx>(arena: &'tcx SyncDroplessArena, slice: &[T]) -> &'tcx List { + fn from_arena<'tcx>(arena: &'tcx Arena<'tcx>, slice: &[T]) -> &'tcx List { assert!(!mem::needs_drop::()); assert!(mem::size_of::() != 0); assert!(slice.len() != 0); @@ -614,9 +617,9 @@ impl List { let size = offset + slice.len() * mem::size_of::(); - let mem = arena.alloc_raw( - size, - cmp::max(mem::align_of::(), mem::align_of::())); + let mem = arena + .dropless + .alloc_raw(size, cmp::max(mem::align_of::(), mem::align_of::())); unsafe { let result = &mut *(mem.as_mut_ptr() as *mut List); // Write the length @@ -644,17 +647,23 @@ impl Encodable for List { } } -impl Ord for List where T: Ord { +impl Ord for List +where + T: Ord, +{ fn cmp(&self, other: &List) -> Ordering { - if self == other { Ordering::Equal } else { - <[T] as Ord>::cmp(&**self, &**other) - } + if self == other { Ordering::Equal } else { <[T] as Ord>::cmp(&**self, &**other) } } } -impl PartialOrd for List where T: PartialOrd { +impl PartialOrd for List +where + T: PartialOrd, +{ fn partial_cmp(&self, other: &List) -> Option { - if self == other { Some(Ordering::Equal) } else { + if self == other { + Some(Ordering::Equal) + } else { <[T] as PartialOrd>::partial_cmp(&**self, &**other) } } @@ -686,9 +695,7 @@ impl Deref for List { impl AsRef<[T]> for List { #[inline(always)] fn as_ref(&self) -> &[T] { - unsafe { - slice::from_raw_parts(self.data.as_ptr(), self.len) - } + unsafe { slice::from_raw_parts(self.data.as_ptr(), self.len) } } } @@ -710,9 +717,7 @@ impl List { struct EmptySlice([u8; 64]); static EMPTY_SLICE: EmptySlice = EmptySlice([0; 64]); assert!(mem::align_of::() <= 64); - unsafe { - &*(&EMPTY_SLICE as *const _ as *const List) - } + unsafe { &*(&EMPTY_SLICE as *const _ as *const List) } } } @@ -773,7 +778,7 @@ pub enum BorrowKind { UniqueImmBorrow, /// Data is mutable and not aliasable. - MutBorrow + MutBorrow, } /// Information describing the capture of an upvar. This is computed @@ -803,13 +808,6 @@ pub struct UpvarBorrow<'tcx> { pub type UpvarListMap = FxHashMap>; pub type UpvarCaptureMap<'tcx> = FxHashMap>; -#[derive(Copy, Clone, TypeFoldable)] -pub struct ClosureUpvar<'tcx> { - pub res: Res, - pub span: Span, - pub ty: Ty<'tcx>, -} - #[derive(Clone, Copy, PartialEq, Eq)] pub enum IntVarValue { IntType(ast::IntTy), @@ -859,11 +857,7 @@ pub struct GenericParamDef { impl GenericParamDef { pub fn to_early_bound_region_data(&self) -> ty::EarlyBoundRegion { if let GenericParamDefKind::Lifetime = self.kind { - ty::EarlyBoundRegion { - def_id: self.def_id, - index: self.index, - name: self.name, - } + ty::EarlyBoundRegion { def_id: self.def_id, index: self.index, name: self.name } } else { bug!("cannot convert a non-lifetime parameter def to an early bound region") } @@ -958,11 +952,11 @@ impl<'tcx> Generics { let param = &self.params[index as usize]; match param.kind { GenericParamDefKind::Lifetime => param, - _ => bug!("expected lifetime parameter, but found another generic parameter") + _ => bug!("expected lifetime parameter, but found another generic parameter"), } } else { tcx.generics_of(self.parent.expect("parent_count > 0 but no parent?")) - .region_param(param, tcx) + .region_param(param, tcx) } } @@ -972,11 +966,11 @@ impl<'tcx> Generics { let param = &self.params[index as usize]; match param.kind { GenericParamDefKind::Type { .. } => param, - _ => bug!("expected type parameter, but found another generic parameter") + _ => bug!("expected type parameter, but found another generic parameter"), } } else { tcx.generics_of(self.parent.expect("parent_count > 0 but no parent?")) - .type_param(param, tcx) + .type_param(param, tcx) } } @@ -986,7 +980,7 @@ impl<'tcx> Generics { let param = &self.params[index as usize]; match param.kind { GenericParamDefKind::Const => param, - _ => bug!("expected const parameter, but found another generic parameter") + _ => bug!("expected const parameter, but found another generic parameter"), } } else { tcx.generics_of(self.parent.expect("parent_count>0 but no parent?")) @@ -1032,9 +1026,7 @@ impl<'tcx> GenericPredicates<'tcx> { if let Some(def_id) = self.parent { tcx.predicates_of(def_id).instantiate_into(tcx, instantiated, substs); } - instantiated.predicates.extend( - self.predicates.iter().map(|(p, _)| p.subst(tcx, substs)), - ); + instantiated.predicates.extend(self.predicates.iter().map(|(p, _)| p.subst(tcx, substs))); } pub fn instantiate_identity(&self, tcx: TyCtxt<'tcx>) -> InstantiatedPredicates<'tcx> { @@ -1061,9 +1053,11 @@ impl<'tcx> GenericPredicates<'tcx> { ) -> InstantiatedPredicates<'tcx> { assert_eq!(self.parent, None); InstantiatedPredicates { - predicates: self.predicates.iter().map(|(pred, _)| { - pred.subst_supertrait(tcx, poly_trait_ref) - }).collect() + predicates: self + .predicates + .iter() + .map(|(pred, _)| pred.subst_supertrait(tcx, poly_trait_ref)) + .collect(), } } } @@ -1074,7 +1068,11 @@ pub enum Predicate<'tcx> { /// Corresponds to `where Foo: Bar`. `Foo` here would be /// the `Self` type of the trait reference and `A`, `B`, and `C` /// would be the type parameters. - Trait(PolyTraitPredicate<'tcx>), + /// + /// A trait predicate will have `Constness::Const` if it originates + /// from a bound on a `const fn` without the `?const` opt-out (e.g., + /// `const fn foobar() {}`). + Trait(PolyTraitPredicate<'tcx>, Constness), /// `where 'a: 'b` RegionOutlives(PolyRegionOutlivesPredicate<'tcx>), @@ -1197,24 +1195,29 @@ impl<'tcx> Predicate<'tcx> { let substs = &trait_ref.skip_binder().substs; match *self { - Predicate::Trait(ref binder) => - Predicate::Trait(binder.map_bound(|data| data.subst(tcx, substs))), - Predicate::Subtype(ref binder) => - Predicate::Subtype(binder.map_bound(|data| data.subst(tcx, substs))), - Predicate::RegionOutlives(ref binder) => - Predicate::RegionOutlives(binder.map_bound(|data| data.subst(tcx, substs))), - Predicate::TypeOutlives(ref binder) => - Predicate::TypeOutlives(binder.map_bound(|data| data.subst(tcx, substs))), - Predicate::Projection(ref binder) => - Predicate::Projection(binder.map_bound(|data| data.subst(tcx, substs))), - Predicate::WellFormed(data) => - Predicate::WellFormed(data.subst(tcx, substs)), - Predicate::ObjectSafe(trait_def_id) => - Predicate::ObjectSafe(trait_def_id), - Predicate::ClosureKind(closure_def_id, closure_substs, kind) => - Predicate::ClosureKind(closure_def_id, closure_substs.subst(tcx, substs), kind), - Predicate::ConstEvaluatable(def_id, const_substs) => - Predicate::ConstEvaluatable(def_id, const_substs.subst(tcx, substs)), + Predicate::Trait(ref binder, constness) => { + Predicate::Trait(binder.map_bound(|data| data.subst(tcx, substs)), constness) + } + Predicate::Subtype(ref binder) => { + Predicate::Subtype(binder.map_bound(|data| data.subst(tcx, substs))) + } + Predicate::RegionOutlives(ref binder) => { + Predicate::RegionOutlives(binder.map_bound(|data| data.subst(tcx, substs))) + } + Predicate::TypeOutlives(ref binder) => { + Predicate::TypeOutlives(binder.map_bound(|data| data.subst(tcx, substs))) + } + Predicate::Projection(ref binder) => { + Predicate::Projection(binder.map_bound(|data| data.subst(tcx, substs))) + } + Predicate::WellFormed(data) => Predicate::WellFormed(data.subst(tcx, substs)), + Predicate::ObjectSafe(trait_def_id) => Predicate::ObjectSafe(trait_def_id), + Predicate::ClosureKind(closure_def_id, closure_substs, kind) => { + Predicate::ClosureKind(closure_def_id, closure_substs.subst(tcx, substs), kind) + } + Predicate::ConstEvaluatable(def_id, const_substs) => { + Predicate::ConstEvaluatable(def_id, const_substs.subst(tcx, substs)) + } } } } @@ -1222,7 +1225,7 @@ impl<'tcx> Predicate<'tcx> { #[derive(Clone, Copy, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable)] #[derive(HashStable, TypeFoldable)] pub struct TraitPredicate<'tcx> { - pub trait_ref: TraitRef<'tcx> + pub trait_ref: TraitRef<'tcx>, } pub type PolyTraitPredicate<'tcx> = ty::Binder>; @@ -1262,7 +1265,7 @@ pub type PolyTypeOutlivesPredicate<'tcx> = ty::Binder { pub a_is_expected: bool, pub a: Ty<'tcx>, - pub b: Ty<'tcx> + pub b: Ty<'tcx>, } pub type PolySubtypePredicate<'tcx> = ty::Binder>; @@ -1294,7 +1297,7 @@ impl<'tcx> PolyProjectionPredicate<'tcx> { } #[inline] - pub fn to_poly_trait_ref(&self, tcx: TyCtxt<'_>) -> PolyTraitRef<'tcx> { + pub fn to_poly_trait_ref(&self, tcx: TyCtxt<'tcx>) -> PolyTraitRef<'tcx> { // Note: unlike with `TraitRef::to_poly_trait_ref()`, // `self.0.trait_ref` is permitted to have escaping regions. // This is because here `self` has a `Binder` and so does our @@ -1323,7 +1326,7 @@ pub trait ToPolyTraitRef<'tcx> { impl<'tcx> ToPolyTraitRef<'tcx> for TraitRef<'tcx> { fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx> { - ty::Binder::dummy(self.clone()) + ty::Binder::dummy(*self) } } @@ -1337,56 +1340,74 @@ pub trait ToPredicate<'tcx> { fn to_predicate(&self) -> Predicate<'tcx>; } -impl<'tcx> ToPredicate<'tcx> for TraitRef<'tcx> { +impl<'tcx> ToPredicate<'tcx> for ConstnessAnd> { fn to_predicate(&self) -> Predicate<'tcx> { - ty::Predicate::Trait(ty::Binder::dummy(ty::TraitPredicate { - trait_ref: self.clone() - })) + ty::Predicate::Trait( + ty::Binder::dummy(ty::TraitPredicate { trait_ref: self.value.clone() }), + self.constness, + ) + } +} + +impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<&TraitRef<'tcx>> { + fn to_predicate(&self) -> Predicate<'tcx> { + ty::Predicate::Trait( + ty::Binder::dummy(ty::TraitPredicate { trait_ref: self.value.clone() }), + self.constness, + ) } } -impl<'tcx> ToPredicate<'tcx> for PolyTraitRef<'tcx> { +impl<'tcx> ToPredicate<'tcx> for ConstnessAnd> { fn to_predicate(&self) -> Predicate<'tcx> { - ty::Predicate::Trait(self.to_poly_trait_predicate()) + ty::Predicate::Trait(self.value.to_poly_trait_predicate(), self.constness) + } +} + +impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<&PolyTraitRef<'tcx>> { + fn to_predicate(&self) -> Predicate<'tcx> { + ty::Predicate::Trait(self.value.to_poly_trait_predicate(), self.constness) } } impl<'tcx> ToPredicate<'tcx> for PolyRegionOutlivesPredicate<'tcx> { fn to_predicate(&self) -> Predicate<'tcx> { - Predicate::RegionOutlives(self.clone()) + Predicate::RegionOutlives(*self) } } impl<'tcx> ToPredicate<'tcx> for PolyTypeOutlivesPredicate<'tcx> { fn to_predicate(&self) -> Predicate<'tcx> { - Predicate::TypeOutlives(self.clone()) + Predicate::TypeOutlives(*self) } } impl<'tcx> ToPredicate<'tcx> for PolyProjectionPredicate<'tcx> { fn to_predicate(&self) -> Predicate<'tcx> { - Predicate::Projection(self.clone()) + Predicate::Projection(*self) } } // A custom iterator used by `Predicate::walk_tys`. enum WalkTysIter<'tcx, I, J, K> - where I: Iterator>, - J: Iterator>, - K: Iterator> +where + I: Iterator>, + J: Iterator>, + K: Iterator>, { None, One(Ty<'tcx>), Two(Ty<'tcx>, Ty<'tcx>), Types(I), InputTypes(J), - ProjectionTypes(K) + ProjectionTypes(K), } impl<'tcx, I, J, K> Iterator for WalkTysIter<'tcx, I, J, K> - where I: Iterator>, - J: Iterator>, - K: Iterator> +where + I: Iterator>, + J: Iterator>, + K: Iterator>, { type Item = Ty<'tcx>; @@ -1396,20 +1417,14 @@ impl<'tcx, I, J, K> Iterator for WalkTysIter<'tcx, I, J, K> WalkTysIter::One(item) => { *self = WalkTysIter::None; Some(item) - }, + } WalkTysIter::Two(item1, item2) => { *self = WalkTysIter::One(item2); Some(item1) - }, - WalkTysIter::Types(ref mut iter) => { - iter.next() - }, - WalkTysIter::InputTypes(ref mut iter) => { - iter.next() - }, - WalkTysIter::ProjectionTypes(ref mut iter) => { - iter.next() } + WalkTysIter::Types(ref mut iter) => iter.next(), + WalkTysIter::InputTypes(ref mut iter) => iter.next(), + WalkTysIter::ProjectionTypes(ref mut iter) => iter.next(), } } } @@ -1420,72 +1435,55 @@ impl<'tcx> Predicate<'tcx> { /// with depth 0 are bound by the predicate. pub fn walk_tys(&'a self) -> impl Iterator> + 'a { match *self { - ty::Predicate::Trait(ref data) => { + ty::Predicate::Trait(ref data, _) => { WalkTysIter::InputTypes(data.skip_binder().input_types()) } ty::Predicate::Subtype(binder) => { let SubtypePredicate { a, b, a_is_expected: _ } = binder.skip_binder(); WalkTysIter::Two(a, b) } - ty::Predicate::TypeOutlives(binder) => { - WalkTysIter::One(binder.skip_binder().0) - } - ty::Predicate::RegionOutlives(..) => { - WalkTysIter::None - } + ty::Predicate::TypeOutlives(binder) => WalkTysIter::One(binder.skip_binder().0), + ty::Predicate::RegionOutlives(..) => WalkTysIter::None, ty::Predicate::Projection(ref data) => { let inner = data.skip_binder(); WalkTysIter::ProjectionTypes( - inner.projection_ty.substs.types().chain(Some(inner.ty))) - } - ty::Predicate::WellFormed(data) => { - WalkTysIter::One(data) - } - ty::Predicate::ObjectSafe(_trait_def_id) => { - WalkTysIter::None + inner.projection_ty.substs.types().chain(Some(inner.ty)), + ) } + ty::Predicate::WellFormed(data) => WalkTysIter::One(data), + ty::Predicate::ObjectSafe(_trait_def_id) => WalkTysIter::None, ty::Predicate::ClosureKind(_closure_def_id, closure_substs, _kind) => { WalkTysIter::Types(closure_substs.types()) } - ty::Predicate::ConstEvaluatable(_, substs) => { - WalkTysIter::Types(substs.types()) - } + ty::Predicate::ConstEvaluatable(_, substs) => WalkTysIter::Types(substs.types()), } } pub fn to_opt_poly_trait_ref(&self) -> Option> { match *self { - Predicate::Trait(ref t) => { - Some(t.to_poly_trait_ref()) - } - Predicate::Projection(..) | - Predicate::Subtype(..) | - Predicate::RegionOutlives(..) | - Predicate::WellFormed(..) | - Predicate::ObjectSafe(..) | - Predicate::ClosureKind(..) | - Predicate::TypeOutlives(..) | - Predicate::ConstEvaluatable(..) => { - None - } + Predicate::Trait(ref t, _) => Some(t.to_poly_trait_ref()), + Predicate::Projection(..) + | Predicate::Subtype(..) + | Predicate::RegionOutlives(..) + | Predicate::WellFormed(..) + | Predicate::ObjectSafe(..) + | Predicate::ClosureKind(..) + | Predicate::TypeOutlives(..) + | Predicate::ConstEvaluatable(..) => None, } } pub fn to_opt_type_outlives(&self) -> Option> { match *self { - Predicate::TypeOutlives(data) => { - Some(data) - } - Predicate::Trait(..) | - Predicate::Projection(..) | - Predicate::Subtype(..) | - Predicate::RegionOutlives(..) | - Predicate::WellFormed(..) | - Predicate::ObjectSafe(..) | - Predicate::ClosureKind(..) | - Predicate::ConstEvaluatable(..) => { - None - } + Predicate::TypeOutlives(data) => Some(data), + Predicate::Trait(..) + | Predicate::Projection(..) + | Predicate::Subtype(..) + | Predicate::RegionOutlives(..) + | Predicate::WellFormed(..) + | Predicate::ObjectSafe(..) + | Predicate::ClosureKind(..) + | Predicate::ConstEvaluatable(..) => None, } } } @@ -1677,7 +1675,7 @@ impl<'tcx> ParamEnv<'tcx> { pub fn new( caller_bounds: &'tcx List>, reveal: Reveal, - def_id: Option + def_id: Option, ) -> Self { ty::ParamEnv { caller_bounds, reveal, def_id } } @@ -1711,33 +1709,46 @@ impl<'tcx> ParamEnv<'tcx> { /// although the surrounding function is never reachable. pub fn and>(self, value: T) -> ParamEnvAnd<'tcx, T> { match self.reveal { - Reveal::UserFacing => { - ParamEnvAnd { - param_env: self, - value, - } - } + Reveal::UserFacing => ParamEnvAnd { param_env: self, value }, Reveal::All => { - if value.has_placeholders() - || value.needs_infer() - || value.has_param_types() - { - ParamEnvAnd { - param_env: self, - value, - } + if value.has_placeholders() || value.needs_infer() || value.has_param_types() { + ParamEnvAnd { param_env: self, value } } else { - ParamEnvAnd { - param_env: self.without_caller_bounds(), - value, - } + ParamEnvAnd { param_env: self.without_caller_bounds(), value } } } } } } +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] +pub struct ConstnessAnd { + pub constness: Constness, + pub value: T, +} + +// FIXME(ecstaticmorse): Audit all occurrences of `without_const().to_predicate()` to ensure that +// the constness of trait bounds is being propagated correctly. +pub trait WithConstness: Sized { + #[inline] + fn with_constness(self, constness: Constness) -> ConstnessAnd { + ConstnessAnd { constness, value: self } + } + + #[inline] + fn with_const(self) -> ConstnessAnd { + self.with_constness(Constness::Const) + } + + #[inline] + fn without_const(self) -> ConstnessAnd { + self.with_constness(Constness::NotConst) + } +} + +impl WithConstness for T {} + #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, TypeFoldable)] pub struct ParamEnvAnd<'tcx, T> { pub param_env: ParamEnv<'tcx>, @@ -1755,10 +1766,7 @@ where T: HashStable>, { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let ParamEnvAnd { - ref param_env, - ref value - } = *self; + let ParamEnvAnd { ref param_env, ref value } = *self; param_env.hash_stable(hcx, hasher); value.hash_stable(hcx, hasher); @@ -1865,7 +1873,7 @@ impl<'tcx> VariantDef { debug!( "VariantDef::new(ident = {:?}, variant_did = {:?}, ctor_def_id = {:?}, discr = {:?}, fields = {:?}, ctor_kind = {:?}, adt_kind = {:?}, parent_did = {:?})", - ident, variant_did, ctor_def_id, discr, fields, ctor_kind, adt_kind, parent_did, + ident, variant_did, ctor_def_id, discr, fields, ctor_kind, adt_kind, parent_did, ); let mut flags = VariantFlags::NO_VARIANT_FLAGS; @@ -1956,7 +1964,9 @@ impl Ord for AdtDef { impl PartialEq for AdtDef { // `AdtDef`s are always interned, and this is part of `TyS` equality. #[inline] - fn eq(&self, other: &Self) -> bool { ptr::eq(self, other) } + fn eq(&self, other: &Self) -> bool { + ptr::eq(self, other) + } } impl Eq for AdtDef {} @@ -1985,12 +1995,7 @@ impl<'a> HashStable> for AdtDef { let hash: Fingerprint = CACHE.with(|cache| { let addr = self as *const AdtDef as usize; *cache.borrow_mut().entry(addr).or_insert_with(|| { - let ty::AdtDef { - did, - ref variants, - ref flags, - ref repr, - } = *self; + let ty::AdtDef { did, ref variants, ref flags, ref repr } = *self; let mut hasher = StableHasher::new(); did.hash_stable(hcx, &mut hasher); @@ -1999,7 +2004,7 @@ impl<'a> HashStable> for AdtDef { repr.hash_stable(hcx, &mut hasher); hasher.finish() - }) + }) }); hash.hash_stable(hcx, hasher); @@ -2007,7 +2012,11 @@ impl<'a> HashStable> for AdtDef { } #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] -pub enum AdtKind { Struct, Union, Enum } +pub enum AdtKind { + Struct, + Union, + Enum, +} impl Into for AdtKind { fn into(self) -> DataTypeKind { @@ -2036,8 +2045,7 @@ bitflags! { } /// Represents the repr options provided by the user, -#[derive(Copy, Clone, Debug, Eq, PartialEq, RustcEncodable, RustcDecodable, - Default, HashStable)] +#[derive(Copy, Clone, Debug, Eq, PartialEq, RustcEncodable, RustcDecodable, Default, HashStable)] pub struct ReprOptions { pub int: Option, pub align: Option, @@ -2063,17 +2071,17 @@ impl ReprOptions { pack }); ReprFlags::empty() - }, + } attr::ReprTransparent => ReprFlags::IS_TRANSPARENT, attr::ReprSimd => ReprFlags::IS_SIMD, attr::ReprInt(i) => { size = Some(i); ReprFlags::empty() - }, + } attr::ReprAlign(align) => { max_align = max_align.max(Some(Align::from_bytes(align as u64).unwrap())); ReprFlags::empty() - }, + } }); } } @@ -2086,15 +2094,25 @@ impl ReprOptions { } #[inline] - pub fn simd(&self) -> bool { self.flags.contains(ReprFlags::IS_SIMD) } + pub fn simd(&self) -> bool { + self.flags.contains(ReprFlags::IS_SIMD) + } #[inline] - pub fn c(&self) -> bool { self.flags.contains(ReprFlags::IS_C) } + pub fn c(&self) -> bool { + self.flags.contains(ReprFlags::IS_C) + } #[inline] - pub fn packed(&self) -> bool { self.pack.is_some() } + pub fn packed(&self) -> bool { + self.pack.is_some() + } #[inline] - pub fn transparent(&self) -> bool { self.flags.contains(ReprFlags::IS_TRANSPARENT) } + pub fn transparent(&self) -> bool { + self.flags.contains(ReprFlags::IS_TRANSPARENT) + } #[inline] - pub fn linear(&self) -> bool { self.flags.contains(ReprFlags::IS_LINEAR) } + pub fn linear(&self) -> bool { + self.flags.contains(ReprFlags::IS_LINEAR) + } pub fn discr_type(&self) -> attr::IntType { self.int.unwrap_or(attr::SignedInt(ast::IntTy::Isize)) @@ -2168,12 +2186,7 @@ impl<'tcx> AdtDef { flags |= AdtFlags::IS_RC; } - AdtDef { - did, - variants, - flags, - repr, - } + AdtDef { did, variants, flags, repr } } /// Returns `true` if this is a struct. @@ -2285,47 +2298,56 @@ impl<'tcx> AdtDef { /// Returns an iterator over all fields contained /// by this ADT. #[inline] - pub fn all_fields(&self) -> impl Iterator + Clone { + pub fn all_fields(&self) -> impl Iterator + Clone { self.variants.iter().flat_map(|v| v.fields.iter()) } pub fn is_payloadfree(&self) -> bool { - !self.variants.is_empty() && - self.variants.iter().all(|v| v.fields.is_empty()) + !self.variants.is_empty() && self.variants.iter().all(|v| v.fields.is_empty()) } /// Return a `VariantDef` given a variant id. pub fn variant_with_id(&self, vid: DefId) -> &VariantDef { - self.variants.iter().find(|v| v.def_id == vid) - .expect("variant_with_id: unknown variant") + self.variants.iter().find(|v| v.def_id == vid).expect("variant_with_id: unknown variant") } /// Return a `VariantDef` given a constructor id. pub fn variant_with_ctor_id(&self, cid: DefId) -> &VariantDef { - self.variants.iter().find(|v| v.ctor_def_id == Some(cid)) + self.variants + .iter() + .find(|v| v.ctor_def_id == Some(cid)) .expect("variant_with_ctor_id: unknown variant") } /// Return the index of `VariantDef` given a variant id. pub fn variant_index_with_id(&self, vid: DefId) -> VariantIdx { - self.variants.iter_enumerated().find(|(_, v)| v.def_id == vid) - .expect("variant_index_with_id: unknown variant").0 + self.variants + .iter_enumerated() + .find(|(_, v)| v.def_id == vid) + .expect("variant_index_with_id: unknown variant") + .0 } /// Return the index of `VariantDef` given a constructor id. pub fn variant_index_with_ctor_id(&self, cid: DefId) -> VariantIdx { - self.variants.iter_enumerated().find(|(_, v)| v.ctor_def_id == Some(cid)) - .expect("variant_index_with_ctor_id: unknown variant").0 + self.variants + .iter_enumerated() + .find(|(_, v)| v.ctor_def_id == Some(cid)) + .expect("variant_index_with_ctor_id: unknown variant") + .0 } pub fn variant_of_res(&self, res: Res) -> &VariantDef { match res { Res::Def(DefKind::Variant, vid) => self.variant_with_id(vid), Res::Def(DefKind::Ctor(..), cid) => self.variant_with_ctor_id(cid), - Res::Def(DefKind::Struct, _) | Res::Def(DefKind::Union, _) | - Res::Def(DefKind::TyAlias, _) | Res::Def(DefKind::AssocTy, _) | Res::SelfTy(..) | - Res::SelfCtor(..) => self.non_enum_variant(), - _ => bug!("unexpected res {:?} in variant_of_res", res) + Res::Def(DefKind::Struct, _) + | Res::Def(DefKind::Union, _) + | Res::Def(DefKind::TyAlias, _) + | Res::Def(DefKind::AssocTy, _) + | Res::SelfTy(..) + | Res::SelfCtor(..) => self.non_enum_variant(), + _ => bug!("unexpected res {:?} in variant_of_res", res), } } @@ -2333,42 +2355,35 @@ impl<'tcx> AdtDef { pub fn eval_explicit_discr(&self, tcx: TyCtxt<'tcx>, expr_did: DefId) -> Option> { let param_env = tcx.param_env(expr_did); let repr_type = self.repr.discr_type(); - let substs = InternalSubsts::identity_for_item(tcx, expr_did); - let instance = ty::Instance::new(expr_did, substs); - let cid = GlobalId { - instance, - promoted: None - }; - match tcx.const_eval(param_env.and(cid)) { + match tcx.const_eval_poly(expr_did) { Ok(val) => { // FIXME: Find the right type and use it instead of `val.ty` here if let Some(b) = val.try_eval_bits(tcx, param_env, val.ty) { trace!("discriminants: {} ({:?})", b, repr_type); - Some(Discr { - val: b, - ty: val.ty, - }) + Some(Discr { val: b, ty: val.ty }) } else { info!("invalid enum discriminant: {:#?}", val); crate::mir::interpret::struct_error( tcx.at(tcx.def_span(expr_did)), "constant evaluation of enum discriminant resulted in non-integer", - ).emit(); + ) + .emit(); None } } Err(ErrorHandled::Reported) => { if !expr_did.is_local() { - span_bug!(tcx.def_span(expr_did), + span_bug!( + tcx.def_span(expr_did), "variant discriminant evaluation succeeded \ - in its crate but failed locally"); + in its crate but failed locally" + ); } None } - Err(ErrorHandled::TooGeneric) => span_bug!( - tcx.def_span(expr_did), - "enum discriminant depends on generic arguments", - ), + Err(ErrorHandled::TooGeneric) => { + span_bug!(tcx.def_span(expr_did), "enum discriminant depends on generic arguments",) + } } } @@ -2395,7 +2410,7 @@ impl<'tcx> AdtDef { #[inline] pub fn variant_range(&self) -> Range { - (VariantIdx::new(0)..VariantIdx::new(self.variants.len())) + VariantIdx::new(0)..VariantIdx::new(self.variants.len()) } /// Computes the discriminant value used by a specific variant. @@ -2419,10 +2434,7 @@ impl<'tcx> AdtDef { /// Yields a `DefId` for the discriminant and an offset to add to it /// Alternatively, if there is no explicit discriminant, returns the /// inferred discriminant directly. - pub fn discriminant_def_for_variant( - &self, - variant_index: VariantIdx, - ) -> (Option, u32) { + pub fn discriminant_def_for_variant(&self, variant_index: VariantIdx) -> (Option, u32) { let mut explicit_index = variant_index.as_u32(); let expr_did; loop { @@ -2430,7 +2442,7 @@ impl<'tcx> AdtDef { ty::VariantDiscr::Relative(0) => { expr_did = None; break; - }, + } ty::VariantDiscr::Relative(distance) => { explicit_index -= distance; } @@ -2460,82 +2472,6 @@ impl<'tcx> AdtDef { pub fn sized_constraint(&self, tcx: TyCtxt<'tcx>) -> &'tcx [Ty<'tcx>] { tcx.adt_sized_constraint(self.did).0 } - - fn sized_constraint_for_ty(&self, tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Vec> { - let result = match ty.kind { - Bool | Char | Int(..) | Uint(..) | Float(..) | - RawPtr(..) | Ref(..) | FnDef(..) | FnPtr(_) | - Array(..) | Closure(..) | Generator(..) | Never => { - vec![] - } - - Str | - Dynamic(..) | - Slice(_) | - Foreign(..) | - Error | - GeneratorWitness(..) => { - // these are never sized - return the target type - vec![ty] - } - - Tuple(ref tys) => { - match tys.last() { - None => vec![], - Some(ty) => self.sized_constraint_for_ty(tcx, ty.expect_ty()), - } - } - - Adt(adt, substs) => { - // recursive case - let adt_tys = adt.sized_constraint(tcx); - debug!("sized_constraint_for_ty({:?}) intermediate = {:?}", - ty, adt_tys); - adt_tys.iter() - .map(|ty| ty.subst(tcx, substs)) - .flat_map(|ty| self.sized_constraint_for_ty(tcx, ty)) - .collect() - } - - Projection(..) | Opaque(..) => { - // must calculate explicitly. - // FIXME: consider special-casing always-Sized projections - vec![ty] - } - - UnnormalizedProjection(..) => bug!("only used with chalk-engine"), - - Param(..) => { - // perf hack: if there is a `T: Sized` bound, then - // we know that `T` is Sized and do not need to check - // it on the impl. - - let sized_trait = match tcx.lang_items().sized_trait() { - Some(x) => x, - _ => return vec![ty] - }; - let sized_predicate = Binder::dummy(TraitRef { - def_id: sized_trait, - substs: tcx.mk_substs_trait(ty, &[]) - }).to_predicate(); - let predicates = tcx.predicates_of(self.did).predicates; - if predicates.iter().any(|(p, _)| *p == sized_predicate) { - vec![] - } else { - vec![ty] - } - } - - Placeholder(..) | - Bound(..) | - Infer(..) => { - bug!("unexpected type `{:?}` in sized_constraint_for_ty", - ty) - } - }; - debug!("sized_constraint_for_ty({:?}) = {:?}", ty, result); - result - } } impl<'tcx> FieldDef { @@ -2552,8 +2488,19 @@ impl<'tcx> FieldDef { /// /// You can get the environment type of a closure using /// `tcx.closure_env_ty()`. -#[derive(Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash, Debug, - RustcEncodable, RustcDecodable, HashStable)] +#[derive( + Clone, + Copy, + PartialOrd, + Ord, + PartialEq, + Eq, + Hash, + Debug, + RustcEncodable, + RustcDecodable, + HashStable +)] pub enum ClosureKind { // Warning: Ordering is significant here! The ordering is chosen // because the trait Fn is a subtrait of FnMut and so in turn, and @@ -2570,12 +2517,8 @@ impl<'tcx> ClosureKind { pub fn trait_did(&self, tcx: TyCtxt<'tcx>) -> DefId { match *self { ClosureKind::Fn => tcx.require_lang_item(FnTraitLangItem, None), - ClosureKind::FnMut => { - tcx.require_lang_item(FnMutTraitLangItem, None) - } - ClosureKind::FnOnce => { - tcx.require_lang_item(FnOnceTraitLangItem, None) - } + ClosureKind::FnMut => tcx.require_lang_item(FnMutTraitLangItem, None), + ClosureKind::FnOnce => tcx.require_lang_item(FnOnceTraitLangItem, None), } } @@ -2632,7 +2575,8 @@ impl<'tcx> TyS<'tcx> { /// /// Note: prefer `ty.walk()` where possible. pub fn maybe_walk(&'tcx self, mut f: F) - where F: FnMut(Ty<'tcx>) -> bool + where + F: FnMut(Ty<'tcx>) -> bool, { let mut walker = self.walk(); while let Some(ty) = walker.next() { @@ -2646,8 +2590,8 @@ impl<'tcx> TyS<'tcx> { impl BorrowKind { pub fn from_mutbl(m: hir::Mutability) -> BorrowKind { match m { - hir::Mutability::Mutable => MutBorrow, - hir::Mutability::Immutable => ImmBorrow, + hir::Mutability::Mut => MutBorrow, + hir::Mutability::Not => ImmBorrow, } } @@ -2657,13 +2601,13 @@ impl BorrowKind { /// question. pub fn to_mutbl_lossy(self) -> hir::Mutability { match self { - MutBorrow => hir::Mutability::Mutable, - ImmBorrow => hir::Mutability::Immutable, + MutBorrow => hir::Mutability::Mut, + ImmBorrow => hir::Mutability::Not, // We have no type corresponding to a unique imm borrow, so // use `&mut`. It gives all the capabilities of an `&uniq` // and hence is a safe "over approximation". - UniqueImmBorrow => hir::Mutability::Mutable, + UniqueImmBorrow => hir::Mutability::Mut, } } @@ -2688,7 +2632,7 @@ impl<'tcx> ::std::ops::Deref for Attributes<'tcx> { fn deref(&self) -> &[ast::Attribute] { match self { &Attributes::Owned(ref data) => &data, - &Attributes::Borrowed(data) => data + &Attributes::Borrowed(data) => data, } } } @@ -2696,7 +2640,12 @@ impl<'tcx> ::std::ops::Deref for Attributes<'tcx> { #[derive(Debug, PartialEq, Eq)] pub enum ImplOverlapKind { /// These impls are always allowed to overlap. - Permitted, + Permitted { + /// Whether or not the impl is permitted due to the trait being + /// a marker trait (a trait with #[marker], or a trait with + /// no associated items and #![feature(overlapping_marker_traits)] enabled) + marker: bool, + }, /// These impls are allowed to overlap, but that raises /// an issue #33140 future-compatibility warning. /// @@ -2729,7 +2678,7 @@ pub enum ImplOverlapKind { /// 4. Neither of the impls can have any where-clauses. /// /// Once `traitobject` 0.1.0 is no longer an active concern, this hack can be removed. - Issue33140 + Issue33140, } impl<'tcx> TyCtxt<'tcx> { @@ -2741,16 +2690,16 @@ impl<'tcx> TyCtxt<'tcx> { /// crate. If you would prefer to iterate over the bodies /// themselves, you can do `self.hir().krate().body_ids.iter()`. pub fn body_owners(self) -> impl Iterator + Captures<'tcx> + 'tcx { - self.hir().krate() - .body_ids - .iter() - .map(move |&body_id| self.hir().body_owner_def_id(body_id)) + self.hir() + .krate() + .body_ids + .iter() + .map(move |&body_id| self.hir().body_owner_def_id(body_id)) } pub fn par_body_owners(self, f: F) { - par_iter(&self.hir().krate().body_ids).for_each(|&body_id| { - f(self.hir().body_owner_def_id(body_id)) - }); + par_iter(&self.hir().krate().body_ids) + .for_each(|&body_id| f(self.hir().body_owner_def_id(body_id))); } pub fn provided_trait_methods(self, id: DefId) -> Vec { @@ -2760,9 +2709,7 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn trait_relevant_for_never(self, did: DefId) -> bool { - self.associated_items(did).any(|item| { - item.relevant_for_never() - }) + self.associated_items(did).any(|item| item.relevant_for_never()) } pub fn opt_item_name(self, def_id: DefId) -> Option { @@ -2777,9 +2724,7 @@ impl<'tcx> TyCtxt<'tcx> { } } else { match self.def_kind(def_id).expect("no def for `DefId`") { - DefKind::AssocConst - | DefKind::Method - | DefKind::AssocTy => true, + DefKind::AssocConst | DefKind::Method | DefKind::AssocTy => true, _ => false, } }; @@ -2787,67 +2732,12 @@ impl<'tcx> TyCtxt<'tcx> { is_associated_item.then(|| self.associated_item(def_id)) } - fn associated_item_from_trait_item_ref(self, - parent_def_id: DefId, - parent_vis: &hir::Visibility, - trait_item_ref: &hir::TraitItemRef) - -> AssocItem { - let def_id = self.hir().local_def_id(trait_item_ref.id.hir_id); - let (kind, has_self) = match trait_item_ref.kind { - hir::AssocItemKind::Const => (ty::AssocKind::Const, false), - hir::AssocItemKind::Method { has_self } => { - (ty::AssocKind::Method, has_self) - } - hir::AssocItemKind::Type => (ty::AssocKind::Type, false), - hir::AssocItemKind::OpaqueTy => bug!("only impls can have opaque types"), - }; - - AssocItem { - ident: trait_item_ref.ident, - kind, - // Visibility of trait items is inherited from their traits. - vis: Visibility::from_hir(parent_vis, trait_item_ref.id.hir_id, self), - defaultness: trait_item_ref.defaultness, - def_id, - container: TraitContainer(parent_def_id), - method_has_self_argument: has_self - } - } - - fn associated_item_from_impl_item_ref(self, - parent_def_id: DefId, - impl_item_ref: &hir::ImplItemRef) - -> AssocItem { - let def_id = self.hir().local_def_id(impl_item_ref.id.hir_id); - let (kind, has_self) = match impl_item_ref.kind { - hir::AssocItemKind::Const => (ty::AssocKind::Const, false), - hir::AssocItemKind::Method { has_self } => { - (ty::AssocKind::Method, has_self) - } - hir::AssocItemKind::Type => (ty::AssocKind::Type, false), - hir::AssocItemKind::OpaqueTy => (ty::AssocKind::OpaqueTy, false), - }; - - AssocItem { - ident: impl_item_ref.ident, - kind, - // Visibility of trait impl items doesn't matter. - vis: ty::Visibility::from_hir(&impl_item_ref.vis, impl_item_ref.id.hir_id, self), - defaultness: impl_item_ref.defaultness, - def_id, - container: ImplContainer(parent_def_id), - method_has_self_argument: has_self - } - } - pub fn field_index(self, hir_id: hir::HirId, tables: &TypeckTables<'_>) -> usize { tables.field_indices().get(hir_id).cloned().expect("no index for a field") } pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option { - variant.fields.iter().position(|field| { - self.hygienic_eq(ident, field.ident, variant.def_id) - }) + variant.fields.iter().position(|field| self.hygienic_eq(ident, field.ident, variant.def_id)) } pub fn associated_items(self, def_id: DefId) -> AssocItemsIterator<'tcx> { @@ -2865,44 +2755,48 @@ impl<'tcx> TyCtxt<'tcx> { /// Returns `true` if the impls are the same polarity and the trait either /// has no items or is annotated #[marker] and prevents item overrides. - pub fn impls_are_allowed_to_overlap(self, def_id1: DefId, def_id2: DefId) - -> Option - { + pub fn impls_are_allowed_to_overlap( + self, + def_id1: DefId, + def_id2: DefId, + ) -> Option { // If either trait impl references an error, they're allowed to overlap, // as one of them essentially doesn't exist. - if self.impl_trait_ref(def_id1).map_or(false, |tr| tr.references_error()) || - self.impl_trait_ref(def_id2).map_or(false, |tr| tr.references_error()) { - return Some(ImplOverlapKind::Permitted); + if self.impl_trait_ref(def_id1).map_or(false, |tr| tr.references_error()) + || self.impl_trait_ref(def_id2).map_or(false, |tr| tr.references_error()) + { + return Some(ImplOverlapKind::Permitted { marker: false }); } match (self.impl_polarity(def_id1), self.impl_polarity(def_id2)) { - (ImplPolarity::Reservation, _) | - (_, ImplPolarity::Reservation) => { + (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => { // `#[rustc_reservation_impl]` impls don't overlap with anything - debug!("impls_are_allowed_to_overlap({:?}, {:?}) = Some(Permitted) (reservations)", - def_id1, def_id2); - return Some(ImplOverlapKind::Permitted); + debug!( + "impls_are_allowed_to_overlap({:?}, {:?}) = Some(Permitted) (reservations)", + def_id1, def_id2 + ); + return Some(ImplOverlapKind::Permitted { marker: false }); } - (ImplPolarity::Positive, ImplPolarity::Negative) | - (ImplPolarity::Negative, ImplPolarity::Positive) => { + (ImplPolarity::Positive, ImplPolarity::Negative) + | (ImplPolarity::Negative, ImplPolarity::Positive) => { // `impl AutoTrait for Type` + `impl !AutoTrait for Type` - debug!("impls_are_allowed_to_overlap({:?}, {:?}) - None (differing polarities)", - def_id1, def_id2); + debug!( + "impls_are_allowed_to_overlap({:?}, {:?}) - None (differing polarities)", + def_id1, def_id2 + ); return None; } - (ImplPolarity::Positive, ImplPolarity::Positive) | - (ImplPolarity::Negative, ImplPolarity::Negative) => {} + (ImplPolarity::Positive, ImplPolarity::Positive) + | (ImplPolarity::Negative, ImplPolarity::Negative) => {} }; let is_marker_overlap = if self.features().overlapping_marker_traits { - let trait1_is_empty = self.impl_trait_ref(def_id1) - .map_or(false, |trait_ref| { - self.associated_item_def_ids(trait_ref.def_id).is_empty() - }); - let trait2_is_empty = self.impl_trait_ref(def_id2) - .map_or(false, |trait_ref| { - self.associated_item_def_ids(trait_ref.def_id).is_empty() - }); + let trait1_is_empty = self.impl_trait_ref(def_id1).map_or(false, |trait_ref| { + self.associated_item_def_ids(trait_ref.def_id).is_empty() + }); + let trait2_is_empty = self.impl_trait_ref(def_id2).map_or(false, |trait_ref| { + self.associated_item_def_ids(trait_ref.def_id).is_empty() + }); trait1_is_empty && trait2_is_empty } else { let is_marker_impl = |def_id: DefId| -> bool { @@ -2912,27 +2806,31 @@ impl<'tcx> TyCtxt<'tcx> { is_marker_impl(def_id1) && is_marker_impl(def_id2) }; - if is_marker_overlap { - debug!("impls_are_allowed_to_overlap({:?}, {:?}) = Some(Permitted) (marker overlap)", - def_id1, def_id2); - Some(ImplOverlapKind::Permitted) + debug!( + "impls_are_allowed_to_overlap({:?}, {:?}) = Some(Permitted) (marker overlap)", + def_id1, def_id2 + ); + Some(ImplOverlapKind::Permitted { marker: true }) } else { if let Some(self_ty1) = self.issue33140_self_ty(def_id1) { if let Some(self_ty2) = self.issue33140_self_ty(def_id2) { if self_ty1 == self_ty2 { - debug!("impls_are_allowed_to_overlap({:?}, {:?}) - issue #33140 HACK", - def_id1, def_id2); + debug!( + "impls_are_allowed_to_overlap({:?}, {:?}) - issue #33140 HACK", + def_id1, def_id2 + ); return Some(ImplOverlapKind::Issue33140); } else { - debug!("impls_are_allowed_to_overlap({:?}, {:?}) - found {:?} != {:?}", - def_id1, def_id2, self_ty1, self_ty2); + debug!( + "impls_are_allowed_to_overlap({:?}, {:?}) - found {:?} != {:?}", + def_id1, def_id2, self_ty1, self_ty2 + ); } } } - debug!("impls_are_allowed_to_overlap({:?}, {:?}) = None", - def_id1, def_id2); + debug!("impls_are_allowed_to_overlap({:?}, {:?}) = None", def_id1, def_id2); None } } @@ -2957,7 +2855,7 @@ impl<'tcx> TyCtxt<'tcx> { let struct_did = self.parent(ctor_did).expect("struct ctor has no parent"); self.adt_def(struct_did).non_enum_variant() } - _ => bug!("expect_variant_res used with unexpected res {:?}", res) + _ => bug!("expect_variant_res used with unexpected res {:?}", res), } } @@ -2968,11 +2866,9 @@ impl<'tcx> TyCtxt<'tcx> { let def_key = self.def_key(id); match def_key.disambiguated_data.data { // The name of a constructor is that of its parent. - hir_map::DefPathData::Ctor => - self.item_name(DefId { - krate: id.krate, - index: def_key.parent.unwrap() - }), + hir_map::DefPathData::Ctor => { + self.item_name(DefId { krate: id.krate, index: def_key.parent.unwrap() }) + } _ => def_key.disambiguated_data.data.get_opt_name().unwrap_or_else(|| { bug!("item_name: no name for {:?}", self.def_path(id)); }), @@ -2983,19 +2879,15 @@ impl<'tcx> TyCtxt<'tcx> { /// Returns the possibly-auto-generated MIR of a `(DefId, Subst)` pair. pub fn instance_mir(self, instance: ty::InstanceDef<'tcx>) -> ReadOnlyBodyAndCache<'tcx, 'tcx> { match instance { - ty::InstanceDef::Item(did) => { - self.optimized_mir(did).unwrap_read_only() - } - ty::InstanceDef::VtableShim(..) | - ty::InstanceDef::ReifyShim(..) | - ty::InstanceDef::Intrinsic(..) | - ty::InstanceDef::FnPtrShim(..) | - ty::InstanceDef::Virtual(..) | - ty::InstanceDef::ClosureOnceShim { .. } | - ty::InstanceDef::DropGlue(..) | - ty::InstanceDef::CloneShim(..) => { - self.mir_shims(instance).unwrap_read_only() - } + ty::InstanceDef::Item(did) => self.optimized_mir(did).unwrap_read_only(), + ty::InstanceDef::VtableShim(..) + | ty::InstanceDef::ReifyShim(..) + | ty::InstanceDef::Intrinsic(..) + | ty::InstanceDef::FnPtrShim(..) + | ty::InstanceDef::Virtual(..) + | ty::InstanceDef::ClosureOnceShim { .. } + | ty::InstanceDef::DropGlue(..) + | ty::InstanceDef::CloneShim(..) => self.mir_shims(instance).unwrap_read_only(), } } @@ -3041,12 +2933,10 @@ impl<'tcx> TyCtxt<'tcx> { self.opt_associated_item(def_id) }; - item.and_then(|trait_item| - match trait_item.container { - TraitContainer(_) => None, - ImplContainer(def_id) => Some(def_id), - } - ) + item.and_then(|trait_item| match trait_item.container { + TraitContainer(_) => None, + ImplContainer(def_id) => Some(def_id), + }) } /// Looks up the span of `impl_did` if the impl is local; otherwise returns `Err` @@ -3067,9 +2957,11 @@ impl<'tcx> TyCtxt<'tcx> { // We could use `Ident::eq` here, but we deliberately don't. The name // comparison fails frequently, and we want to avoid the expensive // `modern()` calls required for the span comparison whenever possible. - use_name.name == def_name.name && - use_name.span.ctxt().hygienic_eq(def_name.span.ctxt(), - self.expansion_that_defined(def_parent_def_id)) + use_name.name == def_name.name + && use_name + .span + .ctxt() + .hygienic_eq(def_name.span.ctxt(), self.expansion_that_defined(def_parent_def_id)) } fn expansion_that_defined(self, scope: DefId) -> ExpnId { @@ -3084,11 +2976,16 @@ impl<'tcx> TyCtxt<'tcx> { ident } - pub fn adjust_ident_and_get_scope(self, mut ident: Ident, scope: DefId, block: hir::HirId) - -> (Ident, DefId) { + pub fn adjust_ident_and_get_scope( + self, + mut ident: Ident, + scope: DefId, + block: hir::HirId, + ) -> (Ident, DefId) { let scope = match ident.span.modernize_and_adjust(self.expansion_that_defined(scope)) { - Some(actual_expansion) => - self.hir().definitions().parent_module_of_macro_def(actual_expansion), + Some(actual_expansion) => { + self.hir().definitions().parent_module_of_macro_def(actual_expansion) + } None => self.hir().get_module_parent(block), }; (ident, scope) @@ -3112,105 +3009,9 @@ impl Iterator for AssocItemsIterator<'_> { } } -fn associated_item(tcx: TyCtxt<'_>, def_id: DefId) -> AssocItem { - let id = tcx.hir().as_local_hir_id(def_id).unwrap(); - let parent_id = tcx.hir().get_parent_item(id); - let parent_def_id = tcx.hir().local_def_id(parent_id); - let parent_item = tcx.hir().expect_item(parent_id); - match parent_item.kind { - hir::ItemKind::Impl(.., ref impl_item_refs) => { - if let Some(impl_item_ref) = impl_item_refs.iter().find(|i| i.id.hir_id == id) { - let assoc_item = tcx.associated_item_from_impl_item_ref(parent_def_id, - impl_item_ref); - debug_assert_eq!(assoc_item.def_id, def_id); - return assoc_item; - } - } - - hir::ItemKind::Trait(.., ref trait_item_refs) => { - if let Some(trait_item_ref) = trait_item_refs.iter().find(|i| i.id.hir_id == id) { - let assoc_item = tcx.associated_item_from_trait_item_ref(parent_def_id, - &parent_item.vis, - trait_item_ref); - debug_assert_eq!(assoc_item.def_id, def_id); - return assoc_item; - } - } - - _ => { } - } - - span_bug!(parent_item.span, - "unexpected parent of trait or impl item or item not found: {:?}", - parent_item.kind) -} - #[derive(Clone, HashStable)] pub struct AdtSizedConstraint<'tcx>(pub &'tcx [Ty<'tcx>]); -/// Calculates the `Sized` constraint. -/// -/// In fact, there are only a few options for the types in the constraint: -/// - an obviously-unsized type -/// - a type parameter or projection whose Sizedness can't be known -/// - a tuple of type parameters or projections, if there are multiple -/// such. -/// - a Error, if a type contained itself. The representability -/// check should catch this case. -fn adt_sized_constraint(tcx: TyCtxt<'_>, def_id: DefId) -> AdtSizedConstraint<'_> { - let def = tcx.adt_def(def_id); - - let result = tcx.mk_type_list(def.variants.iter().flat_map(|v| { - v.fields.last() - }).flat_map(|f| { - def.sized_constraint_for_ty(tcx, tcx.type_of(f.did)) - })); - - debug!("adt_sized_constraint: {:?} => {:?}", def, result); - - AdtSizedConstraint(result) -} - -fn associated_item_def_ids(tcx: TyCtxt<'_>, def_id: DefId) -> &[DefId] { - let id = tcx.hir().as_local_hir_id(def_id).unwrap(); - let item = tcx.hir().expect_item(id); - match item.kind { - hir::ItemKind::Trait(.., ref trait_item_refs) => { - tcx.arena.alloc_from_iter( - trait_item_refs.iter() - .map(|trait_item_ref| trait_item_ref.id) - .map(|id| tcx.hir().local_def_id(id.hir_id)) - ) - } - hir::ItemKind::Impl(.., ref impl_item_refs) => { - tcx.arena.alloc_from_iter( - impl_item_refs.iter() - .map(|impl_item_ref| impl_item_ref.id) - .map(|id| tcx.hir().local_def_id(id.hir_id)) - ) - } - hir::ItemKind::TraitAlias(..) => &[], - _ => span_bug!(item.span, "associated_item_def_ids: not impl or trait") - } -} - -fn def_span(tcx: TyCtxt<'_>, def_id: DefId) -> Span { - tcx.hir().span_if_local(def_id).unwrap() -} - -/// If the given `DefId` describes an item belonging to a trait, -/// returns the `DefId` of the trait that the trait item belongs to; -/// otherwise, returns `None`. -fn trait_of_item(tcx: TyCtxt<'_>, def_id: DefId) -> Option { - tcx.opt_associated_item(def_id) - .and_then(|associated_item| { - match associated_item.container { - TraitContainer(def_id) => Some(def_id), - ImplContainer(_) => None - } - }) -} - /// Yields the parent function's `DefId` if `def_id` is an `impl Trait` definition. pub fn is_impl_trait_defn(tcx: TyCtxt<'_>, def_id: DefId) -> Option { if let Some(hir_id) = tcx.hir().as_local_hir_id(def_id) { @@ -3223,155 +3024,12 @@ pub fn is_impl_trait_defn(tcx: TyCtxt<'_>, def_id: DefId) -> Option { None } -/// See `ParamEnv` struct definition for details. -fn param_env(tcx: TyCtxt<'_>, def_id: DefId) -> ParamEnv<'_> { - // The param_env of an impl Trait type is its defining function's param_env - if let Some(parent) = is_impl_trait_defn(tcx, def_id) { - return param_env(tcx, parent); - } - // Compute the bounds on Self and the type parameters. - - let InstantiatedPredicates { predicates } = - tcx.predicates_of(def_id).instantiate_identity(tcx); - - // Finally, we have to normalize the bounds in the environment, in - // case they contain any associated type projections. This process - // can yield errors if the put in illegal associated types, like - // `::Bar` where `i32` does not implement `Foo`. We - // report these errors right here; this doesn't actually feel - // right to me, because constructing the environment feels like a - // kind of a "idempotent" action, but I'm not sure where would be - // a better place. In practice, we construct environments for - // every fn once during type checking, and we'll abort if there - // are any errors at that point, so after type checking you can be - // sure that this will succeed without errors anyway. - - let unnormalized_env = ty::ParamEnv::new( - tcx.intern_predicates(&predicates), - traits::Reveal::UserFacing, - tcx.sess.opts.debugging_opts.chalk.then_some(def_id), - ); - - let body_id = tcx.hir().as_local_hir_id(def_id).map_or(hir::DUMMY_HIR_ID, |id| { - tcx.hir().maybe_body_owned_by(id).map_or(id, |body| body.hir_id) - }); - let cause = traits::ObligationCause::misc(tcx.def_span(def_id), body_id); - traits::normalize_param_env_or_error(tcx, def_id, unnormalized_env, cause) -} - -fn crate_disambiguator(tcx: TyCtxt<'_>, crate_num: CrateNum) -> CrateDisambiguator { - assert_eq!(crate_num, LOCAL_CRATE); - tcx.sess.local_crate_disambiguator() -} - -fn original_crate_name(tcx: TyCtxt<'_>, crate_num: CrateNum) -> Symbol { - assert_eq!(crate_num, LOCAL_CRATE); - tcx.crate_name.clone() -} - -fn crate_hash(tcx: TyCtxt<'_>, crate_num: CrateNum) -> Svh { - assert_eq!(crate_num, LOCAL_CRATE); - tcx.hir().crate_hash -} - -fn instance_def_size_estimate<'tcx>(tcx: TyCtxt<'tcx>, instance_def: InstanceDef<'tcx>) -> usize { - match instance_def { - InstanceDef::Item(..) | - InstanceDef::DropGlue(..) => { - let mir = tcx.instance_mir(instance_def); - mir.basic_blocks().iter().map(|bb| bb.statements.len()).sum() - }, - // Estimate the size of other compiler-generated shims to be 1. - _ => 1 - } -} - -/// If `def_id` is an issue 33140 hack impl, returns its self type; otherwise, returns `None`. -/// -/// See [`ImplOverlapKind::Issue33140`] for more details. -fn issue33140_self_ty(tcx: TyCtxt<'_>, def_id: DefId) -> Option> { - debug!("issue33140_self_ty({:?})", def_id); - - let trait_ref = tcx.impl_trait_ref(def_id).unwrap_or_else(|| { - bug!("issue33140_self_ty called on inherent impl {:?}", def_id) - }); - - debug!("issue33140_self_ty({:?}), trait-ref={:?}", def_id, trait_ref); - - let is_marker_like = - tcx.impl_polarity(def_id) == ty::ImplPolarity::Positive && - tcx.associated_item_def_ids(trait_ref.def_id).is_empty(); - - // Check whether these impls would be ok for a marker trait. - if !is_marker_like { - debug!("issue33140_self_ty - not marker-like!"); - return None; - } - - // impl must be `impl Trait for dyn Marker1 + Marker2 + ...` - if trait_ref.substs.len() != 1 { - debug!("issue33140_self_ty - impl has substs!"); - return None; - } - - let predicates = tcx.predicates_of(def_id); - if predicates.parent.is_some() || !predicates.predicates.is_empty() { - debug!("issue33140_self_ty - impl has predicates {:?}!", predicates); - return None; - } - - let self_ty = trait_ref.self_ty(); - let self_ty_matches = match self_ty.kind { - ty::Dynamic(ref data, ty::ReStatic) => data.principal().is_none(), - _ => false - }; - - if self_ty_matches { - debug!("issue33140_self_ty - MATCHES!"); - Some(self_ty) - } else { - debug!("issue33140_self_ty - non-matching self type"); - None - } -} - -/// Check if a function is async. -fn asyncness(tcx: TyCtxt<'_>, def_id: DefId) -> hir::IsAsync { - let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap_or_else(|| { - bug!("asyncness: expected local `DefId`, got `{:?}`", def_id) - }); - - let node = tcx.hir().get(hir_id); - - let fn_like = hir::map::blocks::FnLikeNode::from_node(node).unwrap_or_else(|| { - bug!("asyncness: expected fn-like node but got `{:?}`", def_id); - }); - - fn_like.asyncness() -} - pub fn provide(providers: &mut ty::query::Providers<'_>) { context::provide(providers); erase_regions::provide(providers); layout::provide(providers); - util::provide(providers); - constness::provide(providers); - *providers = ty::query::Providers { - asyncness, - associated_item, - associated_item_def_ids, - adt_sized_constraint, - def_span, - param_env, - trait_of_item, - crate_disambiguator, - original_crate_name, - crate_hash, - trait_impls_of: trait_def::trait_impls_of_provider, - instance_def_size_estimate, - issue33140_self_ty, - ..*providers - }; + *providers = + ty::query::Providers { trait_impls_of: trait_def::trait_impls_of_provider, ..*providers }; } /// A map for the local crate mapping each type to a vector of its @@ -3388,14 +3046,12 @@ pub struct CrateInherentImpls { pub struct SymbolName { // FIXME: we don't rely on interning or equality here - better have // this be a `&'tcx str`. - pub name: Symbol + pub name: Symbol, } impl SymbolName { pub fn new(name: &str) -> SymbolName { - SymbolName { - name: Symbol::intern(name) - } + SymbolName { name: Symbol::intern(name) } } } diff --git a/src/librustc/traits/query/normalize_erasing_regions.rs b/src/librustc/ty/normalize_erasing_regions.rs similarity index 78% rename from src/librustc/traits/query/normalize_erasing_regions.rs rename to src/librustc/ty/normalize_erasing_regions.rs index d09288461d..dc64482907 100644 --- a/src/librustc/traits/query/normalize_erasing_regions.rs +++ b/src/librustc/ty/normalize_erasing_regions.rs @@ -7,8 +7,9 @@ //! `normalize_ty_after_erasing_regions` query for each type found //! within. (This underlying query is what is cached.) -use crate::ty::{self, Ty, TyCtxt}; use crate::ty::fold::{TypeFoldable, TypeFolder}; +use crate::ty::subst::{Subst, SubstsRef}; +use crate::ty::{self, Ty, TyCtxt}; impl<'tcx> TyCtxt<'tcx> { /// Erase the regions in `value` and then fully normalize all the @@ -60,6 +61,29 @@ impl<'tcx> TyCtxt<'tcx> { let value = self.erase_late_bound_regions(value); self.normalize_erasing_regions(param_env, value) } + + /// Monomorphizes a type from the AST by first applying the + /// in-scope substitutions and then normalizing any associated + /// types. + pub fn subst_and_normalize_erasing_regions( + self, + param_substs: SubstsRef<'tcx>, + param_env: ty::ParamEnv<'tcx>, + value: &T, + ) -> T + where + T: TypeFoldable<'tcx>, + { + debug!( + "subst_and_normalize_erasing_regions(\ + param_substs={:?}, \ + value={:?}, \ + param_env={:?})", + param_substs, value, param_env, + ); + let substituted = value.subst(self, param_substs); + self.normalize_erasing_regions(param_env, substituted) + } } struct NormalizeAfterErasingRegionsFolder<'tcx> { diff --git a/src/librustc/ty/outlives.rs b/src/librustc/ty/outlives.rs index 80e77cdfad..b397a2c80d 100644 --- a/src/librustc/ty/outlives.rs +++ b/src/librustc/ty/outlives.rs @@ -2,8 +2,8 @@ // refers to rules defined in RFC 1214 (`OutlivesFooBar`), so see that // RFC for reference. -use smallvec::SmallVec; use crate::ty::{self, Ty, TyCtxt, TypeFoldable}; +use smallvec::SmallVec; #[derive(Debug)] pub enum Component<'tcx> { @@ -48,29 +48,29 @@ pub enum Component<'tcx> { impl<'tcx> TyCtxt<'tcx> { /// Push onto `out` all the things that must outlive `'a` for the condition /// `ty0: 'a` to hold. Note that `ty0` must be a **fully resolved type**. - pub fn push_outlives_components(&self, ty0: Ty<'tcx>, - out: &mut SmallVec<[Component<'tcx>; 4]>) { - self.compute_components(ty0, out); + pub fn push_outlives_components(self, ty0: Ty<'tcx>, out: &mut SmallVec<[Component<'tcx>; 4]>) { + compute_components(self, ty0, out); debug!("components({:?}) = {:?}", ty0, out); } +} - fn compute_components(&self, ty: Ty<'tcx>, out: &mut SmallVec<[Component<'tcx>; 4]>) { - // Descend through the types, looking for the various "base" - // components and collecting them into `out`. This is not written - // with `collect()` because of the need to sometimes skip subtrees - // in the `subtys` iterator (e.g., when encountering a - // projection). - match ty.kind { +fn compute_components(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, out: &mut SmallVec<[Component<'tcx>; 4]>) { + // Descend through the types, looking for the various "base" + // components and collecting them into `out`. This is not written + // with `collect()` because of the need to sometimes skip subtrees + // in the `subtys` iterator (e.g., when encountering a + // projection). + match ty.kind { ty::Closure(def_id, ref substs) => { - for upvar_ty in substs.as_closure().upvar_tys(def_id, *self) { - self.compute_components(upvar_ty, out); + for upvar_ty in substs.as_closure().upvar_tys(def_id, tcx) { + compute_components(tcx, upvar_ty, out); } } ty::Generator(def_id, ref substs, _) => { // Same as the closure case - for upvar_ty in substs.as_generator().upvar_tys(def_id, *self) { - self.compute_components(upvar_ty, out); + for upvar_ty in substs.as_generator().upvar_tys(def_id, tcx) { + compute_components(tcx, upvar_ty, out); } // We ignore regions in the generator interior as we don't @@ -107,7 +107,7 @@ impl<'tcx> TyCtxt<'tcx> { // fallback case: hard code // OutlivesProjectionComponents. Continue walking // through and constrain Pi. - let subcomponents = self.capture_components(ty); + let subcomponents = capture_components(tcx, ty); out.push(Component::EscapingProjection(subcomponents)); } } @@ -156,20 +156,19 @@ impl<'tcx> TyCtxt<'tcx> { push_region_constraints(ty, out); for subty in ty.walk_shallow() { - self.compute_components(subty, out); + compute_components(tcx, subty, out); } } } - } +} - fn capture_components(&self, ty: Ty<'tcx>) -> Vec> { - let mut temp = smallvec![]; - push_region_constraints(ty, &mut temp); - for subty in ty.walk_shallow() { - self.compute_components(subty, &mut temp); - } - temp.into_iter().collect() +fn capture_components(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Vec> { + let mut temp = smallvec![]; + push_region_constraints(ty, &mut temp); + for subty in ty.walk_shallow() { + compute_components(tcx, subty, &mut temp); } + temp.into_iter().collect() } fn push_region_constraints<'tcx>(ty: Ty<'tcx>, out: &mut SmallVec<[Component<'tcx>; 4]>) { diff --git a/src/librustc/ty/print/mod.rs b/src/librustc/ty/print/mod.rs index d216c81f8a..3ade966191 100644 --- a/src/librustc/ty/print/mod.rs +++ b/src/librustc/ty/print/mod.rs @@ -1,9 +1,9 @@ use crate::hir::map::{DefPathData, DisambiguatedDefPathData}; -use crate::hir::def_id::{CrateNum, DefId}; -use crate::ty::{self, DefIdTree, Ty, TyCtxt}; use crate::ty::subst::{GenericArg, Subst}; +use crate::ty::{self, DefIdTree, Ty, TyCtxt}; use rustc_data_structures::fx::FxHashSet; +use rustc_hir::def_id::{CrateNum, DefId}; // `pretty` is a separate module only for organization. mod pretty; @@ -58,30 +58,18 @@ pub trait Printer<'tcx>: Sized { self.default_print_impl_path(impl_def_id, substs, self_ty, trait_ref) } - fn print_region( - self, - region: ty::Region<'_>, - ) -> Result; + fn print_region(self, region: ty::Region<'_>) -> Result; - fn print_type( - self, - ty: Ty<'tcx>, - ) -> Result; + fn print_type(self, ty: Ty<'tcx>) -> Result; fn print_dyn_existential( self, predicates: &'tcx ty::List>, ) -> Result; - fn print_const( - self, - ct: &'tcx ty::Const<'tcx>, - ) -> Result; + fn print_const(self, ct: &'tcx ty::Const<'tcx>) -> Result; - fn path_crate( - self, - cnum: CrateNum, - ) -> Result; + fn path_crate(self, cnum: CrateNum) -> Result; fn path_qualified( self, @@ -152,33 +140,36 @@ pub trait Printer<'tcx>: Sized { // If we have any generic arguments to print, we do that // on top of the same path, but without its own generics. - _ => if !generics.params.is_empty() && substs.len() >= generics.count() { - let args = self.generic_args_to_print(generics, substs); - return self.path_generic_args( - |cx| cx.print_def_path(def_id, parent_substs), - args, - ); + _ => { + if !generics.params.is_empty() && substs.len() >= generics.count() { + let args = self.generic_args_to_print(generics, substs); + return self.path_generic_args( + |cx| cx.print_def_path(def_id, parent_substs), + args, + ); + } } } // FIXME(eddyb) try to move this into the parent's printing // logic, instead of doing it when printing the child. - trait_qualify_parent = - generics.has_self && - generics.parent == Some(parent_def_id) && - parent_substs.len() == generics.parent_count && - self.tcx().generics_of(parent_def_id).parent_count == 0; + trait_qualify_parent = generics.has_self + && generics.parent == Some(parent_def_id) + && parent_substs.len() == generics.parent_count + && self.tcx().generics_of(parent_def_id).parent_count == 0; } self.path_append( - |cx: Self| if trait_qualify_parent { - let trait_ref = ty::TraitRef::new( - parent_def_id, - cx.tcx().intern_substs(parent_substs), - ); - cx.path_qualified(trait_ref.self_ty(), Some(trait_ref)) - } else { - cx.print_def_path(parent_def_id, parent_substs) + |cx: Self| { + if trait_qualify_parent { + let trait_ref = ty::TraitRef::new( + parent_def_id, + cx.tcx().intern_substs(parent_substs), + ); + cx.path_qualified(trait_ref.self_ty(), Some(trait_ref)) + } else { + cx.print_def_path(parent_def_id, parent_substs) + } }, &key.disambiguated_data, ) @@ -199,17 +190,24 @@ pub trait Printer<'tcx>: Sized { } // Don't print args that are the defaults of their respective parameters. - own_params.end -= generics.params.iter().rev().take_while(|param| { - match param.kind { - ty::GenericParamDefKind::Lifetime => false, - ty::GenericParamDefKind::Type { has_default, .. } => { - has_default && substs[param.index as usize] == GenericArg::from( - self.tcx().type_of(param.def_id).subst(self.tcx(), substs) - ) + own_params.end -= generics + .params + .iter() + .rev() + .take_while(|param| { + match param.kind { + ty::GenericParamDefKind::Lifetime => false, + ty::GenericParamDefKind::Type { has_default, .. } => { + has_default + && substs[param.index as usize] + == GenericArg::from( + self.tcx().type_of(param.def_id).subst(self.tcx(), substs), + ) + } + ty::GenericParamDefKind::Const => false, // FIXME(const_generics:defaults) } - ty::GenericParamDefKind::Const => false, // FIXME(const_generics:defaults) - } - }).count(); + }) + .count(); &substs[own_params] } @@ -221,8 +219,10 @@ pub trait Printer<'tcx>: Sized { self_ty: Ty<'tcx>, impl_trait_ref: Option>, ) -> Result { - debug!("default_print_impl_path: impl_def_id={:?}, self_ty={}, impl_trait_ref={:?}", - impl_def_id, self_ty, impl_trait_ref); + debug!( + "default_print_impl_path: impl_def_id={:?}, self_ty={}, impl_trait_ref={:?}", + impl_def_id, self_ty, impl_trait_ref + ); let key = self.tcx().def_key(impl_def_id); let parent_def_id = DefId { index: key.parent.unwrap(), ..impl_def_id }; @@ -271,39 +271,38 @@ pub fn characteristic_def_id_of_type(ty: Ty<'_>) -> Option { ty::Dynamic(data, ..) => data.principal_def_id(), - ty::Array(subty, _) | - ty::Slice(subty) => characteristic_def_id_of_type(subty), + ty::Array(subty, _) | ty::Slice(subty) => characteristic_def_id_of_type(subty), ty::RawPtr(mt) => characteristic_def_id_of_type(mt.ty), ty::Ref(_, ty, _) => characteristic_def_id_of_type(ty), - ty::Tuple(ref tys) => tys.iter() - .filter_map(|ty| characteristic_def_id_of_type(ty.expect_ty())) - .next(), - - ty::FnDef(def_id, _) | - ty::Closure(def_id, _) | - ty::Generator(def_id, _, _) | - ty::Foreign(def_id) => Some(def_id), - - ty::Bool | - ty::Char | - ty::Int(_) | - ty::Uint(_) | - ty::Str | - ty::FnPtr(_) | - ty::Projection(_) | - ty::Placeholder(..) | - ty::UnnormalizedProjection(..) | - ty::Param(_) | - ty::Opaque(..) | - ty::Infer(_) | - ty::Bound(..) | - ty::Error | - ty::GeneratorWitness(..) | - ty::Never | - ty::Float(_) => None, + ty::Tuple(ref tys) => { + tys.iter().filter_map(|ty| characteristic_def_id_of_type(ty.expect_ty())).next() + } + + ty::FnDef(def_id, _) + | ty::Closure(def_id, _) + | ty::Generator(def_id, _, _) + | ty::Foreign(def_id) => Some(def_id), + + ty::Bool + | ty::Char + | ty::Int(_) + | ty::Uint(_) + | ty::Str + | ty::FnPtr(_) + | ty::Projection(_) + | ty::Placeholder(..) + | ty::UnnormalizedProjection(..) + | ty::Param(_) + | ty::Opaque(..) + | ty::Infer(_) + | ty::Bound(..) + | ty::Error + | ty::GeneratorWitness(..) + | ty::Never + | ty::Float(_) => None, } } diff --git a/src/librustc/ty/print/obsolete.rs b/src/librustc/ty/print/obsolete.rs index 7eb774849b..7605d44c7f 100644 --- a/src/librustc/ty/print/obsolete.rs +++ b/src/librustc/ty/print/obsolete.rs @@ -5,10 +5,11 @@ //! Note: A lot of this could looks very similar to what's already in `ty::print`. //! FIXME(eddyb) implement a custom `PrettyPrinter` for this. -use rustc::hir::def_id::DefId; +use rustc::bug; use rustc::ty::subst::SubstsRef; use rustc::ty::{self, Const, Instance, Ty, TyCtxt}; -use rustc::{bug, hir}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; use std::fmt::Write; use std::iter; @@ -59,8 +60,8 @@ impl DefPathBasedNames<'tcx> { ty::RawPtr(ty::TypeAndMut { ty: inner_type, mutbl }) => { output.push('*'); match mutbl { - hir::Mutability::Immutable => output.push_str("const "), - hir::Mutability::Mutable => output.push_str("mut "), + hir::Mutability::Not => output.push_str("const "), + hir::Mutability::Mut => output.push_str("mut "), } self.push_type_name(inner_type, output, debug); @@ -137,8 +138,7 @@ impl DefPathBasedNames<'tcx> { self.push_type_name(sig.output(), output, debug); } } - ty::Generator(def_id, substs, _) - | ty::Closure(def_id, substs) => { + ty::Generator(def_id, substs, _) | ty::Closure(def_id, substs) => { self.push_def_path(def_id, output); let generics = self.tcx.generics_of(self.tcx.closure_base_def_id(def_id)); let substs = substs.truncate_to(self.tcx, generics); @@ -166,22 +166,12 @@ impl DefPathBasedNames<'tcx> { } // Pushes the the name of the specified const to the provided string. - // If `debug` is true, usually-unprintable consts (such as `Infer`) will be printed, - // as well as the unprintable types of constants (see `push_type_name` for more details). - pub fn push_const_name(&self, c: &Const<'tcx>, output: &mut String, debug: bool) { - if let ty::ConstKind::Value(_) = c.val { - // FIXME(const_generics): we could probably do a better job here. - write!(output, "{:?}", c).unwrap() - } else if debug { - write!(output, "{:?}", c).unwrap() - } else { - bug!( - "DefPathBasedNames: trying to create const name for unexpected const: {:?}", - c, - ); - } + // If `debug` is true, the unprintable types of constants will be printed with `fmt::Debug` + // (see `push_type_name` for more details). + pub fn push_const_name(&self, ct: &Const<'tcx>, output: &mut String, debug: bool) { + write!(output, "{}", ct).unwrap(); output.push_str(": "); - self.push_type_name(c.ty, output, debug); + self.push_type_name(ct.ty, output, debug); } pub fn push_def_path(&self, def_id: DefId, output: &mut String) { @@ -198,8 +188,7 @@ impl DefPathBasedNames<'tcx> { if self.omit_disambiguators { write!(output, "{}::", part.data.as_symbol()).unwrap(); } else { - write!(output, "{}[{}]::", part.data.as_symbol(), part.disambiguator) - .unwrap(); + write!(output, "{}[{}]::", part.data.as_symbol(), part.disambiguator).unwrap(); } } diff --git a/src/librustc/ty/print/pretty.rs b/src/librustc/ty/print/pretty.rs index 745f7d0276..db539f9195 100644 --- a/src/librustc/ty/print/pretty.rs +++ b/src/librustc/ty/print/pretty.rs @@ -1,20 +1,20 @@ -use crate::hir; -use crate::hir::def::{Namespace, DefKind}; use crate::hir::map::{DefPathData, DisambiguatedDefPathData}; -use crate::hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use crate::middle::cstore::{ExternCrate, ExternCrateSource}; use crate::middle::region; -use crate::ty::{self, DefIdTree, ParamConst, Ty, TyCtxt, TypeFoldable}; -use crate::ty::subst::{GenericArg, Subst, GenericArgKind}; +use crate::mir::interpret::{sign_extend, truncate, ConstValue, Scalar}; use crate::ty::layout::{Integer, IntegerExt, Size}; -use crate::mir::interpret::{ConstValue, sign_extend, Scalar, truncate}; +use crate::ty::subst::{GenericArg, GenericArgKind, Subst}; +use crate::ty::{self, DefIdTree, ParamConst, Ty, TyCtxt, TypeFoldable}; +use rustc_hir as hir; +use rustc_hir::def::{DefKind, Namespace}; +use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_apfloat::ieee::{Double, Single}; use rustc_apfloat::Float; +use rustc_span::symbol::{kw, Symbol}; use rustc_target::spec::abi::Abi; use syntax::ast; use syntax::attr::{SignedInt, UnsignedInt}; -use syntax::symbol::{kw, Symbol}; use std::cell::Cell; use std::collections::BTreeMap; @@ -42,7 +42,9 @@ macro_rules! define_scoped_cx { ($cx:ident) => { #[allow(unused_macros)] macro_rules! scoped_cx { - () => ($cx) + () => { + $cx + }; } }; } @@ -134,37 +136,23 @@ impl RegionHighlightMode { } /// Highlights the region inference variable `vid` as `'N`. - pub fn highlighting_region( - &mut self, - region: ty::Region<'_>, - number: usize, - ) { + pub fn highlighting_region(&mut self, region: ty::Region<'_>, number: usize) { let num_slots = self.highlight_regions.len(); - let first_avail_slot = self.highlight_regions.iter_mut() - .filter(|s| s.is_none()) - .next() - .unwrap_or_else(|| { - bug!( - "can only highlight {} placeholders at a time", - num_slots, - ) + let first_avail_slot = + self.highlight_regions.iter_mut().filter(|s| s.is_none()).next().unwrap_or_else(|| { + bug!("can only highlight {} placeholders at a time", num_slots,) }); *first_avail_slot = Some((*region, number)); } /// Convenience wrapper for `highlighting_region`. - pub fn highlighting_region_vid( - &mut self, - vid: ty::RegionVid, - number: usize, - ) { + pub fn highlighting_region_vid(&mut self, vid: ty::RegionVid, number: usize) { self.highlighting_region(&ty::ReVar(vid), number) } /// Returns `Some(n)` with the number to use for the given region, if any. fn region_highlighted(&self, region: ty::Region<'_>) -> Option { - self - .highlight_regions + self.highlight_regions .iter() .filter_map(|h| match h { Some((r, n)) if r == region => Some(*n), @@ -176,11 +164,7 @@ impl RegionHighlightMode { /// Highlight the given bound region. /// We can only highlight one bound region at a time. See /// the field `highlight_bound_region` for more detailed notes. - pub fn highlighting_bound_region( - &mut self, - br: ty::BoundRegion, - number: usize, - ) { + pub fn highlighting_bound_region(&mut self, br: ty::BoundRegion, number: usize) { assert!(self.highlight_bound_region.is_none()); self.highlight_bound_region = Some((br, number)); } @@ -238,20 +222,14 @@ pub trait PrettyPrinter<'tcx>: /// Returns `true` if the region should be printed in /// optional positions, e.g., `&'a T` or `dyn Tr + 'b`. /// This is typically the case for all non-`'_` regions. - fn region_should_not_be_omitted( - &self, - region: ty::Region<'_>, - ) -> bool; + fn region_should_not_be_omitted(&self, region: ty::Region<'_>) -> bool; // Defaults (should not be overriden): /// If possible, this returns a global path resolving to `def_id` that is visible /// from at least one local module, and returns `true`. If the crate defining `def_id` is /// declared with an `extern crate`, the path is guaranteed to use the `extern crate`. - fn try_print_visible_def_path( - self, - def_id: DefId, - ) -> Result<(Self, bool), Self::Error> { + fn try_print_visible_def_path(self, def_id: DefId) -> Result<(Self, bool), Self::Error> { let mut callers = Vec::new(); self.try_print_visible_def_path_recur(def_id, &mut callers) } @@ -302,16 +280,19 @@ pub trait PrettyPrinter<'tcx>: .. }) => { debug!("try_print_visible_def_path: def_id={:?}", def_id); - return Ok((if !span.is_dummy() { - self.print_def_path(def_id, &[])? - } else { - self.path_crate(cnum)? - }, true)); + return Ok(( + if !span.is_dummy() { + self.print_def_path(def_id, &[])? + } else { + self.path_crate(cnum)? + }, + true, + )); } None => { return Ok((self.path_crate(cnum)?, true)); } - _ => {}, + _ => {} } } @@ -329,13 +310,14 @@ pub trait PrettyPrinter<'tcx>: DefPathData::Ctor => { let parent = DefId { krate: def_id.krate, - index: cur_def_key.parent + index: cur_def_key + .parent .expect("`DefPathData::Ctor` / `VariantData` missing a parent"), }; cur_def_key = self.tcx().def_key(parent); - }, - _ => {}, + } + _ => {} } let visible_parent = match visible_parent_map.get(&def_id).cloned() { @@ -400,7 +382,9 @@ pub trait PrettyPrinter<'tcx>: // `visible_parent_map`), looking for the specific child we currently have and then // have access to the re-exported name. DefPathData::TypeNs(ref mut name) if Some(visible_parent) != actual_parent => { - let reexport = self.tcx().item_children(visible_parent) + let reexport = self + .tcx() + .item_children(visible_parent) .iter() .find(|child| child.res.def_id() == def_id) .map(|child| child.ident.name); @@ -410,18 +394,13 @@ pub trait PrettyPrinter<'tcx>: } // Re-exported `extern crate` (#43189). DefPathData::CrateRoot => { - data = DefPathData::TypeNs( - self.tcx().original_crate_name(def_id.krate), - ); + data = DefPathData::TypeNs(self.tcx().original_crate_name(def_id.krate)); } _ => {} } debug!("try_print_visible_def_path: data={:?}", data); - Ok((self.path_append(Ok, &DisambiguatedDefPathData { - data, - disambiguator: 0, - })?, true)) + Ok((self.path_append(Ok, &DisambiguatedDefPathData { data, disambiguator: 0 })?, true)) } fn pretty_path_qualified( @@ -434,9 +413,14 @@ pub trait PrettyPrinter<'tcx>: // impl on `Foo`, but fallback to `::bar` if self-type is // anything other than a simple path. match self_ty.kind { - ty::Adt(..) | ty::Foreign(_) | - ty::Bool | ty::Char | ty::Str | - ty::Int(_) | ty::Uint(_) | ty::Float(_) => { + ty::Adt(..) + | ty::Foreign(_) + | ty::Bool + | ty::Char + | ty::Str + | ty::Int(_) + | ty::Uint(_) + | ty::Float(_) => { return self_ty.print(self); } @@ -476,10 +460,7 @@ pub trait PrettyPrinter<'tcx>: }) } - fn pretty_print_type( - mut self, - ty: Ty<'tcx>, - ) -> Result { + fn pretty_print_type(mut self, ty: Ty<'tcx>) -> Result { define_scoped_cx!(self); match ty.kind { @@ -489,10 +470,13 @@ pub trait PrettyPrinter<'tcx>: ty::Uint(t) => p!(write("{}", t.name_str())), ty::Float(t) => p!(write("{}", t.name_str())), ty::RawPtr(ref tm) => { - p!(write("*{} ", match tm.mutbl { - hir::Mutability::Mutable => "mut", - hir::Mutability::Immutable => "const", - })); + p!(write( + "*{} ", + match tm.mutbl { + hir::Mutability::Mut => "mut", + hir::Mutability::Not => "const", + } + )); p!(print(tm.ty)) } ty::Ref(r, ty, mutbl) => { @@ -521,9 +505,7 @@ pub trait PrettyPrinter<'tcx>: let sig = self.tcx().fn_sig(def_id).subst(self.tcx(), substs); p!(print(sig), write(" {{"), print_value_path(def_id, substs), write("}}")); } - ty::FnPtr(ref bare_fn) => { - p!(print(bare_fn)) - } + ty::FnPtr(ref bare_fn) => p!(print(bare_fn)), ty::Infer(infer_ty) => { if let ty::TyVar(ty_vid) = infer_ty { if let Some(name) = self.infer_ty_name(ty_vid) { @@ -534,22 +516,20 @@ pub trait PrettyPrinter<'tcx>: } else { p!(write("{}", infer_ty)) } - }, + } ty::Error => p!(write("[type error]")), ty::Param(ref param_ty) => p!(write("{}", param_ty)), - ty::Bound(debruijn, bound_ty) => { - match bound_ty.kind { - ty::BoundTyKind::Anon => { - if debruijn == ty::INNERMOST { - p!(write("^{}", bound_ty.var.index())) - } else { - p!(write("^{}_{}", debruijn.index(), bound_ty.var.index())) - } + ty::Bound(debruijn, bound_ty) => match bound_ty.kind { + ty::BoundTyKind::Anon => { + if debruijn == ty::INNERMOST { + p!(write("^{}", bound_ty.var.index())) + } else { + p!(write("^{}_{}", debruijn.index(), bound_ty.var.index())) } - - ty::BoundTyKind::Param(p) => p!(write("{}", p)), } - } + + ty::BoundTyKind::Param(p) => p!(write("{}", p)), + }, ty::Adt(def, substs) => { p!(print_def_path(def.did, substs)); } @@ -570,9 +550,7 @@ pub trait PrettyPrinter<'tcx>: ty::UnnormalizedProjection(ref data) => { p!(write("Unnormalized("), print(data), write(")")) } - ty::Placeholder(placeholder) => { - p!(write("Placeholder({:?})", placeholder)) - } + ty::Placeholder(placeholder) => p!(write("Placeholder({:?})", placeholder)), ty::Opaque(def_id, substs) => { // FIXME(eddyb) print this with `print_def_path`. // We use verbose printing in 'NO_QUERIES' mode, to @@ -580,13 +558,12 @@ pub trait PrettyPrinter<'tcx>: // only affect certain debug messages (e.g. messages printed // from `rustc::ty` during the computation of `tcx.predicates_of`), // and should have no effect on any compiler output. - if self.tcx().sess.verbose() || NO_QUERIES.with(|q| q.get()) { + if self.tcx().sess.verbose() || NO_QUERIES.with(|q| q.get()) { p!(write("Opaque({:?}, {:?})", def_id, substs)); return Ok(self); } return Ok(with_no_queries(|| { - let def_key = self.tcx().def_key(def_id); if let Some(name) = def_key.disambiguated_data.data.get_opt_name() { p!(write("{}", name)); @@ -618,8 +595,9 @@ pub trait PrettyPrinter<'tcx>: } p!( - write("{}", if first { " " } else { "+" }), - print(trait_ref.print_only_trait_path())); + write("{}", if first { " " } else { "+" }), + print(trait_ref.print_only_trait_path()) + ); first = false; } } @@ -637,24 +615,17 @@ pub trait PrettyPrinter<'tcx>: let witness = substs.as_generator().witness(did, self.tcx()); match movability { hir::Movability::Movable => p!(write("[generator")), - hir::Movability::Static => p!(write("[static generator")), + hir::Movability::Static => p!(write("[static generator")), } // FIXME(eddyb) should use `def_span`. if let Some(hir_id) = self.tcx().hir().as_local_hir_id(did) { p!(write("@{:?}", self.tcx().hir().span(hir_id))); let mut sep = " "; - for (&var_id, upvar_ty) in self.tcx().upvars(did) - .as_ref() - .iter() - .flat_map(|v| v.keys()) - .zip(upvar_tys) + for (&var_id, upvar_ty) in + self.tcx().upvars(did).as_ref().iter().flat_map(|v| v.keys()).zip(upvar_tys) { - p!( - write("{}{}:", - sep, - self.tcx().hir().name(var_id)), - print(upvar_ty)); + p!(write("{}{}:", sep, self.tcx().hir().name(var_id)), print(upvar_ty)); sep = ", "; } } else { @@ -663,15 +634,13 @@ pub trait PrettyPrinter<'tcx>: p!(write("@{:?}", did)); let mut sep = " "; for (index, upvar_ty) in upvar_tys.enumerate() { - p!( - write("{}{}:", sep, index), - print(upvar_ty)); + p!(write("{}{}:", sep, index), print(upvar_ty)); sep = ", "; } } p!(write(" "), print(witness), write("]")) - }, + } ty::GeneratorWitness(types) => { p!(in_binder(&types)); } @@ -687,17 +656,10 @@ pub trait PrettyPrinter<'tcx>: p!(write("@{:?}", self.tcx().hir().span(hir_id))); } let mut sep = " "; - for (&var_id, upvar_ty) in self.tcx().upvars(did) - .as_ref() - .iter() - .flat_map(|v| v.keys()) - .zip(upvar_tys) + for (&var_id, upvar_ty) in + self.tcx().upvars(did).as_ref().iter().flat_map(|v| v.keys()).zip(upvar_tys) { - p!( - write("{}{}:", - sep, - self.tcx().hir().name(var_id)), - print(upvar_ty)); + p!(write("{}{}:", sep, self.tcx().hir().name(var_id)), print(upvar_ty)); sep = ", "; } } else { @@ -706,9 +668,7 @@ pub trait PrettyPrinter<'tcx>: p!(write("@{:?}", did)); let mut sep = " "; for (index, upvar_ty) in upvar_tys.enumerate() { - p!( - write("{}{}:", sep, index), - print(upvar_ty)); + p!(write("{}{}:", sep, index), print(upvar_ty)); sep = ", "; } } @@ -722,7 +682,7 @@ pub trait PrettyPrinter<'tcx>: } p!(write("]")) - }, + } ty::Array(ty, sz) => { p!(write("["), print(ty), write("; ")); if self.tcx().sess.verbose() { @@ -739,9 +699,7 @@ pub trait PrettyPrinter<'tcx>: } p!(write("]")) } - ty::Slice(ty) => { - p!(write("["), print(ty), write("]")) - } + ty::Slice(ty) => p!(write("["), print(ty), write("]")), } Ok(self) @@ -791,17 +749,13 @@ pub trait PrettyPrinter<'tcx>: ); // Don't print `'_` if there's no unerased regions. - let print_regions = args.iter().any(|arg| { - match arg.unpack() { - GenericArgKind::Lifetime(r) => *r != ty::ReErased, - _ => false, - } + let print_regions = args.iter().any(|arg| match arg.unpack() { + GenericArgKind::Lifetime(r) => *r != ty::ReErased, + _ => false, }); - let mut args = args.iter().cloned().filter(|arg| { - match arg.unpack() { - GenericArgKind::Lifetime(_) => print_regions, - _ => true, - } + let mut args = args.iter().cloned().filter(|arg| match arg.unpack() { + GenericArgKind::Lifetime(_) => print_regions, + _ => true, }); let mut projections = predicates.projection_bounds(); @@ -826,9 +780,8 @@ pub trait PrettyPrinter<'tcx>: // Builtin bounds. // FIXME(eddyb) avoid printing twice (needed to ensure // that the auto traits are sorted *and* printed via cx). - let mut auto_traits: Vec<_> = predicates.auto_traits().map(|did| { - (self.tcx().def_path_str(did), did) - }).collect(); + let mut auto_traits: Vec<_> = + predicates.auto_traits().map(|did| (self.tcx().def_path_str(did), did)).collect(); // The auto traits come ordered by `DefPathHash`. While // `DefPathHash` is *stable* in the sense that it depends on @@ -881,6 +834,7 @@ pub trait PrettyPrinter<'tcx>: fn pretty_print_const( mut self, ct: &'tcx ty::Const<'tcx>, + print_ty: bool, ) -> Result { define_scoped_cx!(self); @@ -889,32 +843,54 @@ pub trait PrettyPrinter<'tcx>: return Ok(self); } + macro_rules! print_underscore { + () => {{ + p!(write("_")); + if print_ty { + p!(write(": "), print(ct.ty)); + } + }}; + } + match (ct.val, &ct.ty.kind) { - (_, ty::FnDef(did, substs)) => p!(print_value_path(*did, substs)), - (ty::ConstKind::Unevaluated(did, substs), _) => { - match self.tcx().def_kind(did) { - | Some(DefKind::Static) - | Some(DefKind::Const) - | Some(DefKind::AssocConst) => p!(print_value_path(did, substs)), - _ => if did.is_local() { - let span = self.tcx().def_span(did); - if let Ok(snip) = self.tcx().sess.source_map().span_to_snippet(span) { - p!(write("{}", snip)) - } else { - p!(write("_: "), print(ct.ty)) + (_, ty::FnDef(did, substs)) => p!(print_value_path(*did, substs)), + (ty::ConstKind::Unevaluated(did, substs, promoted), _) => { + if let Some(promoted) = promoted { + p!(print_value_path(did, substs)); + p!(write("::{:?}", promoted)); + } else { + match self.tcx().def_kind(did) { + Some(DefKind::Static) + | Some(DefKind::Const) + | Some(DefKind::AssocConst) => p!(print_value_path(did, substs)), + _ => { + if did.is_local() { + let span = self.tcx().def_span(did); + if let Ok(snip) = self.tcx().sess.source_map().span_to_snippet(span) + { + p!(write("{}", snip)) + } else { + print_underscore!() + } + } else { + print_underscore!() + } } - } else { - p!(write("_: "), print(ct.ty)) - }, + } } - }, - (ty::ConstKind::Infer(..), _) => p!(write("_: "), print(ct.ty)), + } + (ty::ConstKind::Infer(..), _) => print_underscore!(), (ty::ConstKind::Param(ParamConst { name, .. }), _) => p!(write("{}", name)), - (ty::ConstKind::Value(value), _) => return self.pretty_print_const_value(value, ct.ty), + (ty::ConstKind::Value(value), _) => { + return self.pretty_print_const_value(value, ct.ty, print_ty); + } _ => { // fallback - p!(write("{:?} : ", ct.val), print(ct.ty)) + p!(write("{:?}", ct.val)); + if print_ty { + p!(write(": "), print(ct.ty)); + } } }; Ok(self) @@ -924,6 +900,7 @@ pub trait PrettyPrinter<'tcx>: mut self, ct: ConstValue<'tcx>, ty: Ty<'tcx>, + print_ty: bool, ) -> Result { define_scoped_cx!(self); @@ -935,12 +912,15 @@ pub trait PrettyPrinter<'tcx>: let u8 = self.tcx().types.u8; match (ct, &ty.kind) { - (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Bool) => - p!(write("{}", if data == 0 { "false" } else { "true" })), - (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Float(ast::FloatTy::F32)) => - p!(write("{}f32", Single::from_bits(data))), - (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Float(ast::FloatTy::F64)) => - p!(write("{}f64", Double::from_bits(data))), + (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Bool) => { + p!(write("{}", if data == 0 { "false" } else { "true" })) + } + (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Float(ast::FloatTy::F32)) => { + p!(write("{}f32", Single::from_bits(data))) + } + (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Float(ast::FloatTy::F64)) => { + p!(write("{}f64", Double::from_bits(data))) + } (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Uint(ui)) => { let bit_size = Integer::from_attr(&self.tcx(), UnsignedInt(*ui)).size(); let max = truncate(u128::max_value(), bit_size); @@ -951,26 +931,24 @@ pub trait PrettyPrinter<'tcx>: } else { p!(write("{}{}", data, ui_str)) }; - }, + } (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Int(i)) => { - let bit_size = Integer::from_attr(&self.tcx(), SignedInt(*i)) - .size().bits() as u128; + let bit_size = Integer::from_attr(&self.tcx(), SignedInt(*i)).size().bits() as u128; let min = 1u128 << (bit_size - 1); let max = min - 1; let ty = self.tcx().lift(&ty).unwrap(); - let size = self.tcx().layout_of(ty::ParamEnv::empty().and(ty)) - .unwrap() - .size; + let size = self.tcx().layout_of(ty::ParamEnv::empty().and(ty)).unwrap().size; let i_str = i.name_str(); match data { d if d == min => p!(write("std::{}::MIN", i_str)), d if d == max => p!(write("std::{}::MAX", i_str)), - _ => p!(write("{}{}", sign_extend(data, size) as i128, i_str)) + _ => p!(write("{}{}", sign_extend(data, size) as i128, i_str)), } - }, - (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Char) => - p!(write("{:?}", ::std::char::from_u32(data as u32).unwrap())), + } + (ConstValue::Scalar(Scalar::Raw { data, .. }), ty::Char) => { + p!(write("{:?}", ::std::char::from_u32(data as u32).unwrap())) + } (ConstValue::Scalar(_), ty::RawPtr(_)) => p!(write("{{pointer}}")), (ConstValue::Scalar(Scalar::Ptr(ptr)), ty::FnPtr(_)) => { let instance = { @@ -978,23 +956,27 @@ pub trait PrettyPrinter<'tcx>: alloc_map.unwrap_fn(ptr.alloc_id) }; p!(print_value_path(instance.def_id(), instance.substs)); - }, + } _ => { let printed = if let ty::Ref(_, ref_ty, _) = ty.kind { let byte_str = match (ct, &ref_ty.kind) { (ConstValue::Scalar(Scalar::Ptr(ptr)), ty::Array(t, n)) if *t == u8 => { let n = n.eval_usize(self.tcx(), ty::ParamEnv::empty()); - Some(self.tcx() - .alloc_map.lock() - .unwrap_memory(ptr.alloc_id) - .get_bytes(&self.tcx(), ptr, Size::from_bytes(n)).unwrap()) - }, + Some( + self.tcx() + .alloc_map + .lock() + .unwrap_memory(ptr.alloc_id) + .get_bytes(&self.tcx(), ptr, Size::from_bytes(n)) + .unwrap(), + ) + } (ConstValue::Slice { data, start, end }, ty::Slice(t)) if *t == u8 => { // The `inspect` here is okay since we checked the bounds, and there are // no relocations (we have an active slice reference here). We don't use // this result to affect interpreter execution. Some(data.inspect_with_undef_and_ptr_outside_interpreter(start..end)) - }, + } _ => None, }; @@ -1014,8 +996,7 @@ pub trait PrettyPrinter<'tcx>: // relocations (we have an active `str` reference here). We don't use this // result to affect interpreter execution. let slice = data.inspect_with_undef_and_ptr_outside_interpreter(start..end); - let s = ::std::str::from_utf8(slice) - .expect("non utf8 str from miri"); + let s = ::std::str::from_utf8(slice).expect("non utf8 str from miri"); p!(write("{:?}", s)); true } else { @@ -1026,7 +1007,10 @@ pub trait PrettyPrinter<'tcx>: }; if !printed { // fallback - p!(write("{:?} : ", ct), print(ty)) + p!(write("{:?}", ct)); + if print_ty { + p!(write(": "), print(ty)); + } } } }; @@ -1082,26 +1066,26 @@ impl FmtPrinter<'a, 'tcx, F> { } } -impl TyCtxt<'t> { - // HACK(eddyb) get rid of `def_path_str` and/or pass `Namespace` explicitly always - // (but also some things just print a `DefId` generally so maybe we need this?) - fn guess_def_namespace(self, def_id: DefId) -> Namespace { - match self.def_key(def_id).disambiguated_data.data { - DefPathData::TypeNs(..) - | DefPathData::CrateRoot - | DefPathData::ImplTrait => Namespace::TypeNS, - - DefPathData::ValueNs(..) - | DefPathData::AnonConst - | DefPathData::ClosureExpr - | DefPathData::Ctor => Namespace::ValueNS, - - DefPathData::MacroNs(..) => Namespace::MacroNS, - - _ => Namespace::TypeNS, +// HACK(eddyb) get rid of `def_path_str` and/or pass `Namespace` explicitly always +// (but also some things just print a `DefId` generally so maybe we need this?) +fn guess_def_namespace(tcx: TyCtxt<'_>, def_id: DefId) -> Namespace { + match tcx.def_key(def_id).disambiguated_data.data { + DefPathData::TypeNs(..) | DefPathData::CrateRoot | DefPathData::ImplTrait => { + Namespace::TypeNS } + + DefPathData::ValueNs(..) + | DefPathData::AnonConst + | DefPathData::ClosureExpr + | DefPathData::Ctor => Namespace::ValueNS, + + DefPathData::MacroNs(..) => Namespace::MacroNS, + + _ => Namespace::TypeNS, } +} +impl TyCtxt<'t> { /// Returns a string identifying this `DefId`. This string is /// suitable for user output. pub fn def_path_str(self, def_id: DefId) -> String { @@ -1109,7 +1093,7 @@ impl TyCtxt<'t> { } pub fn def_path_str_with_substs(self, def_id: DefId, substs: &'t [GenericArg<'t>]) -> String { - let ns = self.guess_def_namespace(def_id); + let ns = guess_def_namespace(self, def_id); debug!("def_path_str: def_id={:?}, ns={:?}", def_id, ns); let mut s = String::new(); let _ = FmtPrinter::new(self, &mut s, ns).print_def_path(def_id, substs); @@ -1154,12 +1138,11 @@ impl Printer<'tcx> for FmtPrinter<'_, 'tcx, F> { if let DefPathData::Impl = key.disambiguated_data.data { // Always use types for non-local impls, where types are always // available, and filename/line-number is mostly uninteresting. - let use_types = - !def_id.is_local() || { - // Otherwise, use filename/line-number if forced. - let force_no_types = FORCE_IMPL_FILENAME_LINE.with(|f| f.get()); - !force_no_types - }; + let use_types = !def_id.is_local() || { + // Otherwise, use filename/line-number if forced. + let force_no_types = FORCE_IMPL_FILENAME_LINE.with(|f| f.get()); + !force_no_types + }; if !use_types { // If no type info is available, fall back to @@ -1185,17 +1168,11 @@ impl Printer<'tcx> for FmtPrinter<'_, 'tcx, F> { self.default_print_def_path(def_id, substs) } - fn print_region( - self, - region: ty::Region<'_>, - ) -> Result { + fn print_region(self, region: ty::Region<'_>) -> Result { self.pretty_print_region(region) } - fn print_type( - self, - ty: Ty<'tcx>, - ) -> Result { + fn print_type(self, ty: Ty<'tcx>) -> Result { self.pretty_print_type(ty) } @@ -1206,17 +1183,11 @@ impl Printer<'tcx> for FmtPrinter<'_, 'tcx, F> { self.pretty_print_dyn_existential(predicates) } - fn print_const( - self, - ct: &'tcx ty::Const<'tcx>, - ) -> Result { - self.pretty_print_const(ct) + fn print_const(self, ct: &'tcx ty::Const<'tcx>) -> Result { + self.pretty_print_const(ct, true) } - fn path_crate( - mut self, - cnum: CrateNum, - ) -> Result { + fn path_crate(mut self, cnum: CrateNum) -> Result { self.empty_path = true; if cnum == LOCAL_CRATE { if self.tcx.sess.rust_2018() { @@ -1250,14 +1221,18 @@ impl Printer<'tcx> for FmtPrinter<'_, 'tcx, F> { self_ty: Ty<'tcx>, trait_ref: Option>, ) -> Result { - self = self.pretty_path_append_impl(|mut cx| { - cx = print_prefix(cx)?; - if !cx.empty_path { - write!(cx, "::")?; - } + self = self.pretty_path_append_impl( + |mut cx| { + cx = print_prefix(cx)?; + if !cx.empty_path { + write!(cx, "::")?; + } - Ok(cx) - }, self_ty, trait_ref)?; + Ok(cx) + }, + self_ty, + trait_ref, + )?; self.empty_path = false; Ok(self) } @@ -1290,9 +1265,8 @@ impl Printer<'tcx> for FmtPrinter<'_, 'tcx, F> { // FIXME(eddyb) this will print e.g. `{{closure}}#3`, but it // might be nicer to use something else, e.g. `{closure#3}`. let dis = disambiguated_data.disambiguator; - let print_dis = - disambiguated_data.data.get_opt_name().is_none() || - dis != 0 && self.tcx.sess.verbose(); + let print_dis = disambiguated_data.data.get_opt_name().is_none() + || dis != 0 && self.tcx.sess.verbose(); if print_dis { write!(self, "#{}", dis)?; } @@ -1311,17 +1285,13 @@ impl Printer<'tcx> for FmtPrinter<'_, 'tcx, F> { self = print_prefix(self)?; // Don't print `'_` if there's no unerased regions. - let print_regions = args.iter().any(|arg| { - match arg.unpack() { - GenericArgKind::Lifetime(r) => *r != ty::ReErased, - _ => false, - } + let print_regions = args.iter().any(|arg| match arg.unpack() { + GenericArgKind::Lifetime(r) => *r != ty::ReErased, + _ => false, }); - let args = args.iter().cloned().filter(|arg| { - match arg.unpack() { - GenericArgKind::Lifetime(_) => print_regions, - _ => true, - } + let args = args.iter().cloned().filter(|arg| match arg.unpack() { + GenericArgKind::Lifetime(_) => print_regions, + _ => true, }); if args.clone().next().is_some() { @@ -1373,10 +1343,7 @@ impl PrettyPrinter<'tcx> for FmtPrinter<'_, 'tcx, F> { Ok(inner) } - fn region_should_not_be_omitted( - &self, - region: ty::Region<'_>, - ) -> bool { + fn region_should_not_be_omitted(&self, region: ty::Region<'_>) -> bool { let highlight = self.region_highlight_mode; if highlight.region_highlighted(region).is_some() { return true; @@ -1390,16 +1357,14 @@ impl PrettyPrinter<'tcx> for FmtPrinter<'_, 'tcx, F> { match *region { ty::ReEarlyBound(ref data) => { - data.name != kw::Invalid && - data.name != kw::UnderscoreLifetime + data.name != kw::Invalid && data.name != kw::UnderscoreLifetime } - ty::ReLateBound(_, br) | - ty::ReFree(ty::FreeRegion { bound_region: br, .. }) | - ty::RePlaceholder(ty::Placeholder { name: br, .. }) => { + ty::ReLateBound(_, br) + | ty::ReFree(ty::FreeRegion { bound_region: br, .. }) + | ty::RePlaceholder(ty::Placeholder { name: br, .. }) => { if let ty::BrNamed(_, name) = br { - if name != kw::Invalid && - name != kw::UnderscoreLifetime { + if name != kw::Invalid && name != kw::UnderscoreLifetime { return true; } } @@ -1413,26 +1378,18 @@ impl PrettyPrinter<'tcx> for FmtPrinter<'_, 'tcx, F> { false } - ty::ReScope(_) | - ty::ReVar(_) if identify_regions => true, + ty::ReScope(_) | ty::ReVar(_) if identify_regions => true, - ty::ReVar(_) | - ty::ReScope(_) | - ty::ReErased => false, + ty::ReVar(_) | ty::ReScope(_) | ty::ReErased => false, - ty::ReStatic | - ty::ReEmpty | - ty::ReClosureBound(_) => true, + ty::ReStatic | ty::ReEmpty | ty::ReClosureBound(_) => true, } } } // HACK(eddyb) limited to `FmtPrinter` because of `region_highlight_mode`. impl FmtPrinter<'_, '_, F> { - pub fn pretty_print_region( - mut self, - region: ty::Region<'_>, - ) -> Result { + pub fn pretty_print_region(mut self, region: ty::Region<'_>) -> Result { define_scoped_cx!(self); // Watch out for region highlights. @@ -1460,12 +1417,11 @@ impl FmtPrinter<'_, '_, F> { return Ok(self); } } - ty::ReLateBound(_, br) | - ty::ReFree(ty::FreeRegion { bound_region: br, .. }) | - ty::RePlaceholder(ty::Placeholder { name: br, .. }) => { + ty::ReLateBound(_, br) + | ty::ReFree(ty::FreeRegion { bound_region: br, .. }) + | ty::RePlaceholder(ty::Placeholder { name: br, .. }) => { if let ty::BrNamed(_, name) = br { - if name != kw::Invalid && - name != kw::UnderscoreLifetime { + if name != kw::Invalid && name != kw::UnderscoreLifetime { p!(write("{}", name)); return Ok(self); } @@ -1480,14 +1436,16 @@ impl FmtPrinter<'_, '_, F> { } ty::ReScope(scope) if identify_regions => { match scope.data { - region::ScopeData::Node => - p!(write("'{}s", scope.item_local_id().as_usize())), - region::ScopeData::CallSite => - p!(write("'{}cs", scope.item_local_id().as_usize())), - region::ScopeData::Arguments => - p!(write("'{}as", scope.item_local_id().as_usize())), - region::ScopeData::Destruction => - p!(write("'{}ds", scope.item_local_id().as_usize())), + region::ScopeData::Node => p!(write("'{}s", scope.item_local_id().as_usize())), + region::ScopeData::CallSite => { + p!(write("'{}cs", scope.item_local_id().as_usize())) + } + region::ScopeData::Arguments => { + p!(write("'{}as", scope.item_local_id().as_usize())) + } + region::ScopeData::Destruction => { + p!(write("'{}ds", scope.item_local_id().as_usize())) + } region::ScopeData::Remainder(first_statement_index) => p!(write( "'{}_{}rs", scope.item_local_id().as_usize(), @@ -1501,8 +1459,7 @@ impl FmtPrinter<'_, '_, F> { return Ok(self); } ty::ReVar(_) => {} - ty::ReScope(_) | - ty::ReErased => {} + ty::ReScope(_) | ty::ReErased => {} ty::ReStatic => { p!(write("'static")); return Ok(self); @@ -1539,7 +1496,7 @@ impl FmtPrinter<'_, 'tcx, F> { match index { 0 => Symbol::intern("'r"), 1 => Symbol::intern("'s"), - i => Symbol::intern(&format!("'t{}", i-2)), + i => Symbol::intern(&format!("'t{}", i - 2)), } } @@ -1554,12 +1511,16 @@ impl FmtPrinter<'_, 'tcx, F> { let mut empty = true; let mut start_or_continue = |cx: &mut Self, start: &str, cont: &str| { - write!(cx, "{}", if empty { - empty = false; - start - } else { - cont - }) + write!( + cx, + "{}", + if empty { + empty = false; + start + } else { + cont + } + ) }; define_scoped_cx!(self); @@ -1572,8 +1533,7 @@ impl FmtPrinter<'_, 'tcx, F> { let _ = write!(self, "{}", name); br } - ty::BrAnon(_) | - ty::BrEnv => { + ty::BrAnon(_) | ty::BrEnv => { let name = loop { let name = name_by_region_index(region_index); region_index += 1; @@ -1607,17 +1567,17 @@ impl FmtPrinter<'_, 'tcx, F> { } fn prepare_late_bound_region_info(&mut self, value: &ty::Binder) - where T: TypeFoldable<'tcx> + where + T: TypeFoldable<'tcx>, { - struct LateBoundRegionNameCollector<'a>(&'a mut FxHashSet); impl<'tcx> ty::fold::TypeVisitor<'tcx> for LateBoundRegionNameCollector<'_> { fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool { match *r { ty::ReLateBound(_, ty::BrNamed(_, name)) => { self.0.insert(name); - }, - _ => {}, + } + _ => {} } r.super_visit_with(self) } @@ -1650,7 +1610,7 @@ where type Error = P::Error; fn print(&self, mut cx: P) -> Result { define_scoped_cx!(cx); - p!(print(self.0), write(" : "), print(self.1)); + p!(print(self.0), write(": "), print(self.1)); Ok(cx) } } @@ -1853,7 +1813,12 @@ define_print_and_forward_display! { ty::Predicate<'tcx> { match *self { - ty::Predicate::Trait(ref data) => p!(print(data)), + ty::Predicate::Trait(ref data, constness) => { + if let ast::Constness::Const = constness { + p!(write("const ")); + } + p!(print(data)) + } ty::Predicate::Subtype(ref predicate) => p!(print(predicate)), ty::Predicate::RegionOutlives(ref predicate) => p!(print(predicate)), ty::Predicate::TypeOutlives(ref predicate) => p!(print(predicate)), diff --git a/src/librustc/ty/query/config.rs b/src/librustc/ty/query/config.rs index 7e126459dc..dbb6a1080e 100644 --- a/src/librustc/ty/query/config.rs +++ b/src/librustc/ty/query/config.rs @@ -1,26 +1,25 @@ use crate::dep_graph::SerializedDepNodeIndex; use crate::dep_graph::{DepKind, DepNode}; -use crate::hir::def_id::{CrateNum, DefId}; -use crate::ty::TyCtxt; -use crate::ty::query::queries; -use crate::ty::query::{Query, QueryName}; -use crate::ty::query::QueryCache; use crate::ty::query::plumbing::CycleError; +use crate::ty::query::queries; +use crate::ty::query::{Query, QueryCache}; +use crate::ty::TyCtxt; use rustc_data_structures::profiling::ProfileCategory; +use rustc_hir::def_id::{CrateNum, DefId}; +use crate::ich::StableHashingContext; +use rustc_data_structures::fingerprint::Fingerprint; +use rustc_data_structures::sharded::Sharded; use std::borrow::Cow; -use std::hash::Hash; use std::fmt::Debug; -use rustc_data_structures::sharded::Sharded; -use rustc_data_structures::fingerprint::Fingerprint; -use crate::ich::StableHashingContext; +use std::hash::Hash; // Query configuration and description traits. // FIXME(eddyb) false positive, the lifetime parameter is used for `Key`/`Value`. #[allow(unused_lifetimes)] pub trait QueryConfig<'tcx> { - const NAME: QueryName; + const NAME: &'static str; const CATEGORY: ProfileCategory; type Key: Eq + Hash + Clone + Debug; @@ -43,10 +42,8 @@ pub(crate) trait QueryAccessors<'tcx>: QueryConfig<'tcx> { // Don't use this method to compute query results, instead use the methods on TyCtxt fn compute(tcx: TyCtxt<'tcx>, key: Self::Key) -> Self::Value; - fn hash_result( - hcx: &mut StableHashingContext<'_>, - result: &Self::Value - ) -> Option; + fn hash_result(hcx: &mut StableHashingContext<'_>, result: &Self::Value) + -> Option; fn handle_cycle_error(tcx: TyCtxt<'tcx>, error: CycleError<'tcx>) -> Self::Value; } diff --git a/src/librustc/ty/query/job.rs b/src/librustc/ty/query/job.rs index 2f30b797fb..dd8274dcf2 100644 --- a/src/librustc/ty/query/job.rs +++ b/src/librustc/ty/query/job.rs @@ -4,22 +4,22 @@ use crate::ty::query::Query; use crate::ty::tls; use rustc_data_structures::sync::Lrc; -use syntax_pos::Span; +use rustc_span::Span; #[cfg(not(parallel_compiler))] use std::ptr; #[cfg(parallel_compiler)] use { - parking_lot::{Mutex, Condvar}, - rustc_data_structures::{jobserver, OnDrop}, + parking_lot::{Condvar, Mutex}, rustc_data_structures::fx::FxHashSet, - rustc_data_structures::stable_hasher::{StableHasher, HashStable}, + rustc_data_structures::stable_hasher::{HashStable, StableHasher}, rustc_data_structures::sync::Lock, + rustc_data_structures::{jobserver, OnDrop}, rustc_rayon_core as rayon_core, - syntax_pos::DUMMY_SP, - std::{mem, process, thread}, + rustc_span::DUMMY_SP, std::iter::FromIterator, + std::{mem, process, thread}, }; /// Represents a span and a query key. @@ -55,11 +55,7 @@ impl<'tcx> QueryJob<'tcx> { /// Awaits for the query job to complete. #[cfg(parallel_compiler)] - pub(super) fn r#await( - &self, - tcx: TyCtxt<'tcx>, - span: Span, - ) -> Result<(), CycleError<'tcx>> { + pub(super) fn r#await(&self, tcx: TyCtxt<'tcx>, span: Span) -> Result<(), CycleError<'tcx>> { tls::with_related_context(tcx, move |icx| { let waiter = Lrc::new(QueryWaiter { query: icx.query.clone(), @@ -74,7 +70,7 @@ impl<'tcx> QueryJob<'tcx> { let mut cycle = waiter.cycle.lock(); match cycle.take() { None => Ok(()), - Some(cycle) => Err(cycle) + Some(cycle) => Err(cycle), } }) } @@ -97,9 +93,8 @@ impl<'tcx> QueryJob<'tcx> { // Replace it with the span which caused the cycle to form cycle[0].span = span; // Find out why the cycle itself was used - let usage = job.parent.as_ref().map(|parent| { - (job.info.span, parent.info.query.clone()) - }); + let usage = + job.parent.as_ref().map(|parent| (job.info.span, parent.info.query.clone())); return CycleError { usage, cycle }; } @@ -154,12 +149,7 @@ struct QueryLatch<'tcx> { #[cfg(parallel_compiler)] impl<'tcx> QueryLatch<'tcx> { fn new() -> Self { - QueryLatch { - info: Mutex::new(QueryLatchInfo { - complete: false, - waiters: Vec::new(), - }), - } + QueryLatch { info: Mutex::new(QueryLatchInfo { complete: false, waiters: Vec::new() }) } } /// Awaits the caller on this latch by blocking the current thread. @@ -197,10 +187,7 @@ impl<'tcx> QueryLatch<'tcx> { /// Removes a single waiter from the list of waiters. /// This is used to break query cycles. - fn extract_waiter( - &self, - waiter: usize, - ) -> Lrc> { + fn extract_waiter(&self, waiter: usize) -> Lrc> { let mut info = self.info.lock(); debug_assert!(!info.complete); // Remove the waiter from the list of waiters @@ -224,7 +211,7 @@ type Waiter<'tcx> = (Lrc>, usize); #[cfg(parallel_compiler)] fn visit_waiters<'tcx, F>(query: Lrc>, mut visit: F) -> Option>> where - F: FnMut(Span, Lrc>) -> Option>> + F: FnMut(Span, Lrc>) -> Option>>, { // Visit the parent query which is a non-resumable waiter since it's on the same stack if let Some(ref parent) = query.parent { @@ -250,10 +237,11 @@ where /// If a cycle is detected, this initial value is replaced with the span causing /// the cycle. #[cfg(parallel_compiler)] -fn cycle_check<'tcx>(query: Lrc>, - span: Span, - stack: &mut Vec<(Span, Lrc>)>, - visited: &mut FxHashSet<*const QueryJob<'tcx>> +fn cycle_check<'tcx>( + query: Lrc>, + span: Span, + stack: &mut Vec<(Span, Lrc>)>, + visited: &mut FxHashSet<*const QueryJob<'tcx>>, ) -> Option>> { if !visited.insert(query.as_ptr()) { return if let Some(p) = stack.iter().position(|q| q.1.as_ptr() == query.as_ptr()) { @@ -266,16 +254,14 @@ fn cycle_check<'tcx>(query: Lrc>, Some(None) } else { None - } + }; } // Query marked as visited is added it to the stack stack.push((span, query.clone())); // Visit all the waiters - let r = visit_waiters(query, |span, successor| { - cycle_check(successor, span, stack, visited) - }); + let r = visit_waiters(query, |span, successor| cycle_check(successor, span, stack, visited)); // Remove the entry in our stack if we didn't find a cycle if r.is_none() { @@ -291,7 +277,7 @@ fn cycle_check<'tcx>(query: Lrc>, #[cfg(parallel_compiler)] fn connected_to_root<'tcx>( query: Lrc>, - visited: &mut FxHashSet<*const QueryJob<'tcx>> + visited: &mut FxHashSet<*const QueryJob<'tcx>>, ) -> bool { // We already visited this or we're deliberately ignoring it if !visited.insert(query.as_ptr()) { @@ -317,16 +303,19 @@ fn pick_query<'a, 'tcx, T, F: Fn(&T) -> (Span, Lrc>)>( // Deterministically pick an entry point // FIXME: Sort this instead let mut hcx = tcx.create_stable_hashing_context(); - queries.iter().min_by_key(|v| { - let (span, query) = f(v); - let mut stable_hasher = StableHasher::new(); - query.info.query.hash_stable(&mut hcx, &mut stable_hasher); - // Prefer entry points which have valid spans for nicer error messages - // We add an integer to the tuple ensuring that entry points - // with valid spans are picked first - let span_cmp = if span == DUMMY_SP { 1 } else { 0 }; - (span_cmp, stable_hasher.finish::()) - }).unwrap() + queries + .iter() + .min_by_key(|v| { + let (span, query) = f(v); + let mut stable_hasher = StableHasher::new(); + query.info.query.hash_stable(&mut hcx, &mut stable_hasher); + // Prefer entry points which have valid spans for nicer error messages + // We add an integer to the tuple ensuring that entry points + // with valid spans are picked first + let span_cmp = if span == DUMMY_SP { 1 } else { 0 }; + (span_cmp, stable_hasher.finish::()) + }) + .unwrap() } /// Looks for query cycles starting from the last query in `jobs`. @@ -343,10 +332,7 @@ fn remove_cycle<'tcx>( let mut visited = FxHashSet::default(); let mut stack = Vec::new(); // Look for a cycle starting with the last query in `jobs` - if let Some(waiter) = cycle_check(jobs.pop().unwrap(), - DUMMY_SP, - &mut stack, - &mut visited) { + if let Some(waiter) = cycle_check(jobs.pop().unwrap(), DUMMY_SP, &mut stack, &mut visited) { // The stack is a vector of pairs of spans and queries; reverse it so that // the earlier entries require later entries let (mut spans, queries): (Vec<_>, Vec<_>) = stack.into_iter().rev().unzip(); @@ -366,40 +352,42 @@ fn remove_cycle<'tcx>( // Find the queries in the cycle which are // connected to queries outside the cycle - let entry_points = stack.iter().filter_map(|(span, query)| { - if query.parent.is_none() { - // This query is connected to the root (it has no query parent) - Some((*span, query.clone(), None)) - } else { - let mut waiters = Vec::new(); - // Find all the direct waiters who lead to the root - visit_waiters(query.clone(), |span, waiter| { - // Mark all the other queries in the cycle as already visited - let mut visited = FxHashSet::from_iter(stack.iter().map(|q| q.1.as_ptr())); - - if connected_to_root(waiter.clone(), &mut visited) { - waiters.push((span, waiter)); - } - - None - }); - if waiters.is_empty() { - None + let entry_points = stack + .iter() + .filter_map(|(span, query)| { + if query.parent.is_none() { + // This query is connected to the root (it has no query parent) + Some((*span, query.clone(), None)) } else { - // Deterministically pick one of the waiters to show to the user - let waiter = pick_query(tcx, &waiters, |s| s.clone()).clone(); - Some((*span, query.clone(), Some(waiter))) + let mut waiters = Vec::new(); + // Find all the direct waiters who lead to the root + visit_waiters(query.clone(), |span, waiter| { + // Mark all the other queries in the cycle as already visited + let mut visited = FxHashSet::from_iter(stack.iter().map(|q| q.1.as_ptr())); + + if connected_to_root(waiter.clone(), &mut visited) { + waiters.push((span, waiter)); + } + + None + }); + if waiters.is_empty() { + None + } else { + // Deterministically pick one of the waiters to show to the user + let waiter = pick_query(tcx, &waiters, |s| s.clone()).clone(); + Some((*span, query.clone(), Some(waiter))) + } } - } - }).collect::>, Option<(Span, Lrc>)>)>>(); + }) + .collect::>, Option<(Span, Lrc>)>)>>(); // Deterministically pick an entry point let (_, entry_point, usage) = pick_query(tcx, &entry_points, |e| (e.0, e.1.clone())); // Shift the stack so that our entry point is first - let entry_point_pos = stack.iter().position(|(_, query)| { - query.as_ptr() == entry_point.as_ptr() - }); + let entry_point_pos = + stack.iter().position(|(_, query)| query.as_ptr() == entry_point.as_ptr()); if let Some(pos) = entry_point_pos { stack.rotate_left(pos); } @@ -409,10 +397,10 @@ fn remove_cycle<'tcx>( // Create the cycle error let error = CycleError { usage, - cycle: stack.iter().map(|&(s, ref q)| QueryInfo { - span: s, - query: q.info.query.clone(), - } ).collect(), + cycle: stack + .iter() + .map(|&(s, ref q)| QueryInfo { span: s, query: q.info.query.clone() }) + .collect(), }; // We unwrap `waiter` here since there must always be one @@ -441,24 +429,20 @@ fn remove_cycle<'tcx>( pub unsafe fn handle_deadlock() { let registry = rayon_core::Registry::current(); - let gcx_ptr = tls::GCX_PTR.with(|gcx_ptr| { - gcx_ptr as *const _ - }); + let gcx_ptr = tls::GCX_PTR.with(|gcx_ptr| gcx_ptr as *const _); let gcx_ptr = &*gcx_ptr; - let syntax_pos_globals = syntax_pos::GLOBALS.with(|syntax_pos_globals| { - syntax_pos_globals as *const _ - }); - let syntax_pos_globals = &*syntax_pos_globals; + let rustc_span_globals = + rustc_span::GLOBALS.with(|rustc_span_globals| rustc_span_globals as *const _); + let rustc_span_globals = &*rustc_span_globals; + let syntax_globals = syntax::GLOBALS.with(|syntax_globals| syntax_globals as *const _); + let syntax_globals = &*syntax_globals; thread::spawn(move || { tls::GCX_PTR.set(gcx_ptr, || { - syntax_pos::GLOBALS.set(syntax_pos_globals, || { - syntax_pos::GLOBALS.set(syntax_pos_globals, || { - tls::with_thread_locals(|| { - tls::with_global(|tcx| deadlock(tcx, ®istry)) - }) - }) - }) + syntax::GLOBALS.set(syntax_globals, || { + rustc_span::GLOBALS + .set(rustc_span_globals, || tls::with_global(|tcx| deadlock(tcx, ®istry))) + }); }) }); } diff --git a/src/librustc/ty/query/keys.rs b/src/librustc/ty/query/keys.rs index a9e0a5d6ab..c1c88e96f9 100644 --- a/src/librustc/ty/query/keys.rs +++ b/src/librustc/ty/query/keys.rs @@ -1,15 +1,14 @@ //! Defines the set of legal keys that can be used in queries. use crate::infer::canonical::Canonical; -use crate::hir::def_id::{CrateNum, DefId, LOCAL_CRATE, DefIndex}; +use crate::mir; use crate::traits; -use crate::ty::{self, Ty, TyCtxt}; -use crate::ty::subst::SubstsRef; use crate::ty::fast_reject::SimplifiedType; -use crate::mir; - -use syntax_pos::{Span, DUMMY_SP}; -use syntax_pos::symbol::Symbol; +use crate::ty::subst::SubstsRef; +use crate::ty::{self, Ty, TyCtxt}; +use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LOCAL_CRATE}; +use rustc_span::symbol::Symbol; +use rustc_span::{Span, DUMMY_SP}; /// The `Key` trait controls what types can legally be used as the key /// for a query. @@ -53,6 +52,16 @@ impl<'tcx> Key for mir::interpret::GlobalId<'tcx> { } } +impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> { + fn query_crate(&self) -> CrateNum { + LOCAL_CRATE + } + + fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { + DUMMY_SP + } +} + impl Key for CrateNum { fn query_crate(&self) -> CrateNum { *self @@ -107,6 +116,15 @@ impl Key for (DefId, SimplifiedType) { } } +impl<'tcx> Key for SubstsRef<'tcx> { + fn query_crate(&self) -> CrateNum { + LOCAL_CRATE + } + fn default_span(&self, _: TyCtxt<'_>) -> Span { + DUMMY_SP + } +} + impl<'tcx> Key for (DefId, SubstsRef<'tcx>) { fn query_crate(&self) -> CrateNum { self.0.krate @@ -143,7 +161,7 @@ impl<'tcx> Key for ty::PolyTraitRef<'tcx> { } } -impl<'tcx> Key for ty::Const<'tcx> { +impl<'tcx> Key for &'tcx ty::Const<'tcx> { fn query_crate(&self) -> CrateNum { LOCAL_CRATE } diff --git a/src/librustc/ty/query/mod.rs b/src/librustc/ty/query/mod.rs index 5b4a6ac8a2..0f09a08b19 100644 --- a/src/librustc/ty/query/mod.rs +++ b/src/librustc/ty/query/mod.rs @@ -1,62 +1,62 @@ use crate::dep_graph::{self, DepNode}; -use crate::hir::def_id::{CrateNum, DefId, DefIndex}; -use crate::hir::def::{DefKind, Export}; -use crate::hir::{self, TraitCandidate, ItemLocalId, CodegenFnAttrs}; +use crate::hir::exports::Export; use crate::infer::canonical::{self, Canonical}; -use crate::lint; -use crate::middle::cstore::{ExternCrate, LinkagePreference, NativeLibrary, ForeignModule}; -use crate::middle::cstore::{NativeLibraryKind, DepKind, CrateSource}; +use crate::lint::LintLevelMap; +use crate::middle::codegen_fn_attrs::CodegenFnAttrs; +use crate::middle::cstore::{CrateSource, DepKind, NativeLibraryKind}; +use crate::middle::cstore::{ExternCrate, ForeignModule, LinkagePreference, NativeLibrary}; +use crate::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel}; +use crate::middle::lang_items::{LangItem, LanguageItems}; +use crate::middle::lib_features::LibFeatures; use crate::middle::privacy::AccessLevels; -use crate::middle::reachable::ReachableSet; use crate::middle::region; -use crate::middle::resolve_lifetime::{ResolveLifetimes, Region, ObjectLifetimeDefault}; +use crate::middle::resolve_lifetime::{ObjectLifetimeDefault, Region, ResolveLifetimes}; use crate::middle::stability::{self, DeprecationEntry}; -use crate::middle::lib_features::LibFeatures; -use crate::middle::lang_items::{LanguageItems, LangItem}; -use crate::middle::exported_symbols::{SymbolExportLevel, ExportedSymbol}; -use crate::mir::interpret::{ConstEvalRawResult, ConstEvalResult}; -use crate::mir::mono::CodegenUnit; use crate::mir; use crate::mir::interpret::GlobalId; +use crate::mir::interpret::{ConstEvalRawResult, ConstEvalResult}; +use crate::mir::interpret::{LitToConstError, LitToConstInput}; +use crate::mir::mono::CodegenUnit; +use crate::session::config::{EntryFnType, OptLevel, OutputFilenames, SymbolManglingVersion}; use crate::session::CrateDisambiguator; -use crate::session::config::{EntryFnType, OutputFilenames, OptLevel, SymbolManglingVersion}; -use crate::traits::{self, Vtable}; -use crate::traits::query::{ - CanonicalPredicateGoal, CanonicalProjectionGoal, - CanonicalTyGoal, CanonicalTypeOpAscribeUserTypeGoal, - CanonicalTypeOpEqGoal, CanonicalTypeOpSubtypeGoal, CanonicalTypeOpProvePredicateGoal, - CanonicalTypeOpNormalizeGoal, NoSolution, -}; +use crate::traits::query::dropck_outlives::{DropckOutlivesResult, DtorckConstraint}; use crate::traits::query::method_autoderef::MethodAutoderefStepsResult; -use crate::traits::query::dropck_outlives::{DtorckConstraint, DropckOutlivesResult}; use crate::traits::query::normalize::NormalizationResult; use crate::traits::query::outlives_bounds::OutlivesBound; +use crate::traits::query::{ + CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal, + CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, + CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal, NoSolution, +}; use crate::traits::specialization_graph; use crate::traits::Clauses; -use crate::ty::{self, CrateInherentImpls, ParamEnvAnd, Ty, TyCtxt, AdtSizedConstraint}; +use crate::traits::{self, Vtable}; use crate::ty::steal::Steal; -use crate::ty::util::NeedsDrop; use crate::ty::subst::SubstsRef; -use crate::util::nodemap::{DefIdSet, DefIdMap}; +use crate::ty::util::NeedsDrop; +use crate::ty::{self, AdtSizedConstraint, CrateInherentImpls, ParamEnvAnd, Ty, TyCtxt}; use crate::util::common::ErrorReported; +use rustc_data_structures::fingerprint::Fingerprint; +use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap}; use rustc_data_structures::profiling::ProfileCategory::*; - -use rustc_data_structures::svh::Svh; -use rustc_index::vec::IndexVec; -use rustc_data_structures::fx::{FxIndexMap, FxHashMap, FxHashSet}; use rustc_data_structures::stable_hasher::StableVec; +use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::Lrc; -use rustc_data_structures::fingerprint::Fingerprint; +use rustc_hir as hir; +use rustc_hir::def::DefKind; +use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, DefIndex}; +use rustc_hir::{HirIdSet, ItemLocalId, TraitCandidate}; +use rustc_index::vec::IndexVec; use rustc_target::spec::PanicStrategy; +use rustc_span::symbol::Symbol; +use rustc_span::{Span, DUMMY_SP}; +use std::any::type_name; use std::borrow::Cow; use std::ops::Deref; use std::sync::Arc; -use std::any::type_name; -use syntax_pos::{Span, DUMMY_SP}; -use syntax::attr; use syntax::ast; -use syntax::symbol::Symbol; +use syntax::attr; #[macro_use] mod plumbing; @@ -64,9 +64,9 @@ use self::plumbing::*; pub use self::plumbing::{force_from_dep_node, CycleError}; mod job; -pub use self::job::{QueryJob, QueryInfo}; #[cfg(parallel_compiler)] pub use self::job::handle_deadlock; +pub use self::job::{QueryInfo, QueryJob}; mod keys; use self::keys::Key; @@ -75,13 +75,16 @@ mod values; use self::values::Value; mod config; -pub(crate) use self::config::QueryDescription; -pub use self::config::QueryConfig; use self::config::QueryAccessors; +pub use self::config::QueryConfig; +pub(crate) use self::config::QueryDescription; mod on_disk_cache; pub use self::on_disk_cache::OnDiskCache; +mod profiling_support; +pub use self::profiling_support::{IntoSelfProfilingString, QueryKeyStringBuilder}; + // Each of these queries corresponds to a function pointer field in the // `Providers` struct for requesting a value of that type, and a method // on `tcx: TyCtxt` (and `tcx.at(span)`) for doing that request in a way diff --git a/src/librustc/ty/query/on_disk_cache.rs b/src/librustc/ty/query/on_disk_cache.rs index 4031eb6219..a81fe33831 100644 --- a/src/librustc/ty/query/on_disk_cache.rs +++ b/src/librustc/ty/query/on_disk_cache.rs @@ -1,30 +1,28 @@ use crate::dep_graph::{DepNodeIndex, SerializedDepNodeIndex}; -use crate::hir; -use crate::hir::def_id::{CrateNum, DefIndex, DefId, LocalDefId, LOCAL_CRATE}; use crate::hir::map::definitions::DefPathHash; use crate::ich::{CachingSourceMapView, Fingerprint}; -use crate::mir::{self, interpret}; use crate::mir::interpret::{AllocDecodingSession, AllocDecodingState}; +use crate::mir::{self, interpret}; use crate::session::{CrateDisambiguator, Session}; -use crate::ty::{self, Ty}; use crate::ty::codec::{self as ty_codec, TyDecoder, TyEncoder}; use crate::ty::context::TyCtxt; -use crate::util::common::{time, time_ext}; - -use errors::Diagnostic; +use crate::ty::{self, Ty}; use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::sync::{HashMapExt, Lock, Lrc, Once}; use rustc_data_structures::thin_vec::ThinVec; -use rustc_data_structures::sync::{Lrc, Lock, HashMapExt, Once}; -use rustc_index::vec::{IndexVec, Idx}; +use rustc_errors::Diagnostic; +use rustc_hir as hir; +use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, LOCAL_CRATE}; +use rustc_index::vec::{Idx, IndexVec}; use rustc_serialize::{ - Decodable, Decoder, Encodable, Encoder, SpecializedDecoder, SpecializedEncoder, - UseSpecializedDecodable, UseSpecializedEncodable, opaque, + opaque, Decodable, Decoder, Encodable, Encoder, SpecializedDecoder, SpecializedEncoder, + UseSpecializedDecodable, UseSpecializedEncodable, }; +use rustc_span::hygiene::{ExpnId, SyntaxContext}; +use rustc_span::source_map::{SourceMap, StableSourceFileId}; +use rustc_span::{BytePos, SourceFile, Span, DUMMY_SP}; use std::mem; use syntax::ast::{Ident, NodeId}; -use syntax::source_map::{SourceMap, StableSourceFileId}; -use syntax_pos::{BytePos, Span, DUMMY_SP, SourceFile}; -use syntax_pos::hygiene::{ExpnId, SyntaxContext}; const TAG_FILE_FOOTER: u128 = 0xC0FFEE_C0FFEE_C0FFEE_C0FFEE_C0FFEE; @@ -165,10 +163,10 @@ impl<'sess> OnDiskCache<'sess> { // Allocate `SourceFileIndex`es. let (file_to_file_index, file_index_to_stable_id) = { let files = tcx.sess.source_map().files(); - let mut file_to_file_index = FxHashMap::with_capacity_and_hasher( - files.len(), Default::default()); - let mut file_index_to_stable_id = FxHashMap::with_capacity_and_hasher( - files.len(), Default::default()); + let mut file_to_file_index = + FxHashMap::with_capacity_and_hasher(files.len(), Default::default()); + let mut file_index_to_stable_id = + FxHashMap::with_capacity_and_hasher(files.len(), Default::default()); for (index, file) in files.iter().enumerate() { let index = SourceFileIndex(index as u32); @@ -200,7 +198,7 @@ impl<'sess> OnDiskCache<'sess> { // Encode query results. let mut query_result_index = EncodedQueryResultIndex::new(); - time(tcx.sess, "encode query results", || { + tcx.sess.time("encode_query_results", || { let enc = &mut encoder; let qri = &mut query_result_index; @@ -222,7 +220,9 @@ impl<'sess> OnDiskCache<'sess> { })?; // Encode diagnostics. - let diagnostics_index: EncodedDiagnosticsIndex = self.current_diagnostics.borrow() + let diagnostics_index: EncodedDiagnosticsIndex = self + .current_diagnostics + .borrow() .iter() .map(|(dep_node_index, diagnostics)| { let pos = AbsoluteBytePos::new(encoder.position()); @@ -250,11 +250,7 @@ impl<'sess> OnDiskCache<'sess> { let id = encoder.interpret_allocs_inverse[idx]; let pos = encoder.position() as u32; interpret_alloc_index.push(pos); - interpret::specialized_encode_alloc_id( - &mut encoder, - tcx, - id, - )?; + interpret::specialized_encode_alloc_id(&mut encoder, tcx, id)?; } n = new_n; } @@ -262,7 +258,8 @@ impl<'sess> OnDiskCache<'sess> { }; let sorted_cnums = sorted_cnums_including_local_crate(tcx); - let prev_cnums: Vec<_> = sorted_cnums.iter() + let prev_cnums: Vec<_> = sorted_cnums + .iter() .map(|&cnum| { let crate_name = tcx.original_crate_name(cnum).to_string(); let crate_disambiguator = tcx.crate_disambiguator(cnum); @@ -272,13 +269,16 @@ impl<'sess> OnDiskCache<'sess> { // Encode the file footer. let footer_pos = encoder.position() as u64; - encoder.encode_tagged(TAG_FILE_FOOTER, &Footer { - file_index_to_stable_id, - prev_cnums, - query_result_index, - diagnostics_index, - interpret_alloc_index, - })?; + encoder.encode_tagged( + TAG_FILE_FOOTER, + &Footer { + file_index_to_stable_id, + prev_cnums, + query_result_index, + diagnostics_index, + interpret_alloc_index, + }, + )?; // Encode the position of the footer as the last 8 bytes of the // file so we know where to look for it. @@ -306,11 +306,8 @@ impl<'sess> OnDiskCache<'sess> { tcx: TyCtxt<'_>, dep_node_index: SerializedDepNodeIndex, ) -> Vec { - let diagnostics: Option = self.load_indexed( - tcx, - dep_node_index, - &self.prev_diagnostics_index, - "diagnostics"); + let diagnostics: Option = + self.load_indexed(tcx, dep_node_index, &self.prev_diagnostics_index, "diagnostics"); diagnostics.unwrap_or_default() } @@ -320,9 +317,11 @@ impl<'sess> OnDiskCache<'sess> { /// the next compilation session. #[inline(never)] #[cold] - pub fn store_diagnostics(&self, - dep_node_index: DepNodeIndex, - diagnostics: ThinVec) { + pub fn store_diagnostics( + &self, + dep_node_index: DepNodeIndex, + diagnostics: ThinVec, + ) { let mut current_diagnostics = self.current_diagnostics.borrow_mut(); let prev = current_diagnostics.insert(dep_node_index, diagnostics.into()); debug_assert!(prev.is_none()); @@ -338,10 +337,7 @@ impl<'sess> OnDiskCache<'sess> { where T: Decodable, { - self.load_indexed(tcx, - dep_node_index, - &self.query_result_index, - "query result") + self.load_indexed(tcx, dep_node_index, &self.query_result_index, "query result") } /// Stores a diagnostic emitted during computation of an anonymous query. @@ -350,9 +346,11 @@ impl<'sess> OnDiskCache<'sess> { /// 1:1 relationship between query-key and `DepNode`. #[inline(never)] #[cold] - pub fn store_diagnostics_for_anon_node(&self, - dep_node_index: DepNodeIndex, - diagnostics: ThinVec) { + pub fn store_diagnostics_for_anon_node( + &self, + dep_node_index: DepNodeIndex, + diagnostics: ThinVec, + ) { let mut current_diagnostics = self.current_diagnostics.borrow_mut(); let x = current_diagnostics.entry(dep_node_index).or_insert(Vec::new()); @@ -373,9 +371,7 @@ impl<'sess> OnDiskCache<'sess> { let pos = index.get(&dep_node_index).cloned()?; // Initialize `cnum_map` using the value from the thread that finishes the closure first. - self.cnum_map.init_nonlocking_same(|| { - Self::compute_cnum_map(tcx, &self.prev_cnums[..]) - }); + self.cnum_map.init_nonlocking_same(|| Self::compute_cnum_map(tcx, &self.prev_cnums[..])); let mut decoder = CacheDecoder { tcx, @@ -403,17 +399,17 @@ impl<'sess> OnDiskCache<'sess> { prev_cnums: &[(u32, String, CrateDisambiguator)], ) -> IndexVec> { tcx.dep_graph.with_ignore(|| { - let current_cnums = tcx.all_crate_nums(LOCAL_CRATE).iter().map(|&cnum| { - let crate_name = tcx.original_crate_name(cnum) - .to_string(); - let crate_disambiguator = tcx.crate_disambiguator(cnum); - ((crate_name, crate_disambiguator), cnum) - }).collect::>(); - - let map_size = prev_cnums.iter() - .map(|&(cnum, ..)| cnum) - .max() - .unwrap_or(0) + 1; + let current_cnums = tcx + .all_crate_nums(LOCAL_CRATE) + .iter() + .map(|&cnum| { + let crate_name = tcx.original_crate_name(cnum).to_string(); + let crate_disambiguator = tcx.crate_disambiguator(cnum); + ((crate_name, crate_disambiguator), cnum) + }) + .collect::>(); + + let map_size = prev_cnums.iter().map(|&(cnum, ..)| cnum).max().unwrap_or(0) + 1; let mut map = IndexVec::from_elem_n(None, map_size as usize); for &(prev_cnum, ref crate_name, crate_disambiguator) in prev_cnums { @@ -452,11 +448,16 @@ impl<'a, 'tcx> CacheDecoder<'a, 'tcx> { .. } = *self; - file_index_to_file.borrow_mut().entry(index).or_insert_with(|| { - let stable_id = file_index_to_stable_id[&index]; - source_map.source_file_by_stable_id(stable_id) - .expect("failed to lookup `SourceFile` in new context") - }).clone() + file_index_to_file + .borrow_mut() + .entry(index) + .or_insert_with(|| { + let stable_id = file_index_to_stable_id[&index]; + source_map + .source_file_by_stable_id(stable_id) + .expect("failed to lookup `SourceFile` in new context") + }) + .clone() } } @@ -513,18 +514,18 @@ impl<'a, 'tcx> TyDecoder<'tcx> for CacheDecoder<'a, 'tcx> { self.opaque.data[self.opaque.position()] } - fn cached_ty_for_shorthand(&mut self, - shorthand: usize, - or_insert_with: F) - -> Result, Self::Error> - where F: FnOnce(&mut Self) -> Result, Self::Error> + fn cached_ty_for_shorthand( + &mut self, + shorthand: usize, + or_insert_with: F, + ) -> Result, Self::Error> + where + F: FnOnce(&mut Self) -> Result, Self::Error>, { let tcx = self.tcx(); - let cache_key = ty::CReaderCacheKey { - cnum: CrateNum::ReservedForIncrCompCache, - pos: shorthand, - }; + let cache_key = + ty::CReaderCacheKey { cnum: CrateNum::ReservedForIncrCompCache, pos: shorthand }; if let Some(&ty) = tcx.rcache.borrow().get(&cache_key) { return Ok(ty); @@ -537,7 +538,8 @@ impl<'a, 'tcx> TyDecoder<'tcx> for CacheDecoder<'a, 'tcx> { } fn with_position(&mut self, pos: usize, f: F) -> R - where F: FnOnce(&mut Self) -> R + where + F: FnOnce(&mut Self) -> R, { debug_assert!(pos < self.opaque.data.len()); @@ -549,9 +551,7 @@ impl<'a, 'tcx> TyDecoder<'tcx> for CacheDecoder<'a, 'tcx> { } fn map_encoded_cnum_to_current(&self, cnum: CrateNum) -> CrateNum { - self.cnum_map[cnum].unwrap_or_else(|| { - bug!("could not find new `CrateNum` for {:?}", cnum) - }) + self.cnum_map[cnum].unwrap_or_else(|| bug!("could not find new `CrateNum` for {:?}", cnum)) } } @@ -597,13 +597,14 @@ impl<'a, 'tcx> SpecializedDecoder for CacheDecoder<'a, 'tcx> { span }; Ok(match expn_data_tag { - TAG_NO_EXPN_DATA => { - location() - } + TAG_NO_EXPN_DATA => location(), TAG_EXPN_DATA_INLINE => { let (expn_data, transparency) = Decodable::decode(self)?; recover_from_expn_data( - self, expn_data, transparency, AbsoluteBytePos::new(self.opaque.position()) + self, + expn_data, + transparency, + AbsoluteBytePos::new(self.opaque.position()), ) } TAG_EXPN_DATA_SHORTHAND => { @@ -617,9 +618,7 @@ impl<'a, 'tcx> SpecializedDecoder for CacheDecoder<'a, 'tcx> { recover_from_expn_data(self, expn_data, transparency, pos) } } - _ => { - unreachable!() - } + _ => unreachable!(), }) } } @@ -668,10 +667,7 @@ impl<'a, 'tcx> SpecializedDecoder for CacheDecoder<'a, 'tcx> { let def_path_hash = DefPathHash::decode(self)?; // Use the `DefPathHash` to map to the current `DefId`. - let def_id = self.tcx() - .def_path_hash_to_def_id - .as_ref() - .unwrap()[&def_path_hash]; + let def_id = self.tcx().def_path_hash_to_def_id.as_ref().unwrap()[&def_path_hash]; debug_assert!(def_id.is_local()); @@ -680,10 +676,7 @@ impl<'a, 'tcx> SpecializedDecoder for CacheDecoder<'a, 'tcx> { // Reconstruct the `HirId` and look up the corresponding `NodeId` in the // context of the current session. - Ok(hir::HirId { - owner: def_id.index, - local_id - }) + Ok(hir::HirId { owner: def_id.index, local_id }) } } @@ -716,9 +709,7 @@ impl<'a, 'tcx, T: Decodable> SpecializedDecoder> let val = T::decode(self)?; Ok(mir::ClearCrossCrate::Set(val)) } - _ => { - unreachable!() - } + _ => unreachable!(), } } } @@ -754,7 +745,7 @@ where fn encode_tagged( &mut self, tag: T, - value: &V + value: &V, ) -> Result<(), E::Error> { let start_pos = self.position(); @@ -779,7 +770,7 @@ where self.interpret_allocs_inverse.push(*alloc_id); e.insert(idx); idx - }, + } }; index.encode(self) @@ -796,11 +787,11 @@ where } let span_data = span.data(); - let (file_lo, line_lo, col_lo) = match self.source_map - .byte_pos_to_line_and_col(span_data.lo) { - Some(pos) => pos, - None => return TAG_INVALID_SPAN.encode(self) - }; + let (file_lo, line_lo, col_lo) = + match self.source_map.byte_pos_to_line_and_col(span_data.lo) { + Some(pos) => pos, + None => return TAG_INVALID_SPAN.encode(self), + }; if !file_lo.contains(span_data.hi) { return TAG_INVALID_SPAN.encode(self); @@ -872,8 +863,7 @@ where { #[inline] fn specialized_encode(&mut self, ty: &Ty<'tcx>) -> Result<(), Self::Error> { - ty_codec::encode_with_shorthand(self, ty, - |encoder| &mut encoder.type_shorthands) + ty_codec::encode_with_shorthand(self, ty, |encoder| &mut encoder.type_shorthands) } } @@ -883,11 +873,13 @@ where E: 'a + TyEncoder, { #[inline] - fn specialized_encode(&mut self, - predicates: &&'tcx [(ty::Predicate<'tcx>, Span)]) - -> Result<(), Self::Error> { - ty_codec::encode_spanned_predicates(self, predicates, - |encoder| &mut encoder.predicate_shorthands) + fn specialized_encode( + &mut self, + predicates: &&'tcx [(ty::Predicate<'tcx>, Span)], + ) -> Result<(), Self::Error> { + ty_codec::encode_spanned_predicates(self, predicates, |encoder| { + &mut encoder.predicate_shorthands + }) } } @@ -897,10 +889,7 @@ where { #[inline] fn specialized_encode(&mut self, id: &hir::HirId) -> Result<(), Self::Error> { - let hir::HirId { - owner, - local_id, - } = *id; + let hir::HirId { owner, local_id } = *id; let def_path_hash = self.tcx.hir().definitions().def_path_hash(owner); @@ -964,13 +953,9 @@ where T: Encodable, { #[inline] - fn specialized_encode(&mut self, - val: &mir::ClearCrossCrate) - -> Result<(), Self::Error> { + fn specialized_encode(&mut self, val: &mir::ClearCrossCrate) -> Result<(), Self::Error> { match *val { - mir::ClearCrossCrate::Clear => { - TAG_CLEAR_CROSS_CRATE_CLEAR.encode(self) - } + mir::ClearCrossCrate::Clear => TAG_CLEAR_CROSS_CRATE_CLEAR.encode(self), mir::ClearCrossCrate::Set(ref val) => { TAG_CLEAR_CROSS_CRATE_SET.encode(self)?; val.encode(self) @@ -1047,7 +1032,7 @@ impl<'a> SpecializedDecoder for opaque::Decoder<'a> { let mut value: u64 = 0; let start_pos = self.position(); - for i in 0 .. IntEncodedWithFixedSize::ENCODED_SIZE { + for i in 0..IntEncodedWithFixedSize::ENCODED_SIZE { let byte: u8 = Decodable::decode(self)?; value |= (byte as u64) << (i * 8); } @@ -1068,25 +1053,23 @@ where Q: super::config::QueryDescription<'tcx, Value: Encodable>, E: 'a + TyEncoder, { - let desc = &format!("encode_query_results for {}", - ::std::any::type_name::()); - - time_ext(tcx.sess.time_extended(), desc, || { - let shards = Q::query_cache(tcx).lock_shards(); - assert!(shards.iter().all(|shard| shard.active.is_empty())); - for (key, entry) in shards.iter().flat_map(|shard| shard.results.iter()) { - if Q::cache_on_disk(tcx, key.clone(), Some(&entry.value)) { - let dep_node = SerializedDepNodeIndex::new(entry.index.index()); - - // Record position of the cache entry. - query_result_index.push((dep_node, AbsoluteBytePos::new(encoder.position()))); - - // Encode the type check tables with the `SerializedDepNodeIndex` - // as tag. - encoder.encode_tagged(dep_node, &entry.value)?; - } + let desc = &format!("encode_query_results_for_{}", ::std::any::type_name::()); + let _timer = tcx.sess.prof.extra_verbose_generic_activity(desc); + + let shards = Q::query_cache(tcx).lock_shards(); + assert!(shards.iter().all(|shard| shard.active.is_empty())); + for (key, entry) in shards.iter().flat_map(|shard| shard.results.iter()) { + if Q::cache_on_disk(tcx, key.clone(), Some(&entry.value)) { + let dep_node = SerializedDepNodeIndex::new(entry.index.index()); + + // Record position of the cache entry. + query_result_index.push((dep_node, AbsoluteBytePos::new(encoder.position()))); + + // Encode the type check tables with the `SerializedDepNodeIndex` + // as tag. + encoder.encode_tagged(dep_node, &entry.value)?; } + } - Ok(()) - }) + Ok(()) } diff --git a/src/librustc/ty/query/plumbing.rs b/src/librustc/ty/query/plumbing.rs index fc55b665c1..117a38c655 100644 --- a/src/librustc/ty/query/plumbing.rs +++ b/src/librustc/ty/query/plumbing.rs @@ -2,32 +2,28 @@ //! generate the actual methods on tcx which find and execute the provider, //! manage the caches, and so forth. -use crate::dep_graph::{DepNodeIndex, DepNode, DepKind, SerializedDepNodeIndex}; +use crate::dep_graph::{DepKind, DepNode, DepNodeIndex, SerializedDepNodeIndex}; +use crate::ty::query::config::{QueryConfig, QueryDescription}; +use crate::ty::query::job::{QueryInfo, QueryJob}; +use crate::ty::query::Query; use crate::ty::tls; use crate::ty::{self, TyCtxt}; -use crate::ty::query::Query; -use crate::ty::query::config::{QueryConfig, QueryDescription}; -use crate::ty::query::job::{QueryJob, QueryInfo}; - -use errors::DiagnosticBuilder; -use errors::Level; -use errors::Diagnostic; -use errors::FatalError; -use errors::Handler; -use rustc_data_structures::fx::{FxHasher, FxHashMap}; -use rustc_data_structures::sync::{Lrc, Lock}; -use rustc_data_structures::sharded::Sharded; -use rustc_data_structures::thin_vec::ThinVec; + #[cfg(not(parallel_compiler))] use rustc_data_structures::cold_path; +use rustc_data_structures::fx::{FxHashMap, FxHasher}; +#[cfg(parallel_compiler)] +use rustc_data_structures::profiling::TimingGuard; +use rustc_data_structures::sharded::Sharded; +use rustc_data_structures::sync::{Lock, Lrc}; +use rustc_data_structures::thin_vec::ThinVec; +use rustc_errors::{struct_span_err, Diagnostic, DiagnosticBuilder, FatalError, Handler, Level}; +use rustc_span::source_map::DUMMY_SP; +use rustc_span::Span; +use std::collections::hash_map::Entry; use std::hash::{Hash, Hasher}; use std::mem; use std::ptr; -use std::collections::hash_map::Entry; -use syntax_pos::Span; -use syntax::source_map::DUMMY_SP; - -use rustc_error_codes::*; pub struct QueryCache<'tcx, D: QueryConfig<'tcx> + ?Sized> { pub(super) results: FxHashMap>, @@ -42,13 +38,8 @@ pub(super) struct QueryValue { } impl QueryValue { - pub(super) fn new(value: T, - dep_node_index: DepNodeIndex) - -> QueryValue { - QueryValue { - value, - index: dep_node_index, - } + pub(super) fn new(value: T, dep_node_index: DepNodeIndex) -> QueryValue { + QueryValue { value, index: dep_node_index } } } @@ -91,6 +82,19 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> { /// for some compile-time benchmarks. #[inline(always)] pub(super) fn try_get(tcx: TyCtxt<'tcx>, span: Span, key: &Q::Key) -> TryGetJob<'a, 'tcx, Q> { + // Handling the `query_blocked_prof_timer` is a bit weird because of the + // control flow in this function: Blocking is implemented by + // awaiting a running job and, once that is done, entering the loop below + // again from the top. In that second iteration we will hit the + // cache which provides us with the information we need for + // finishing the "query-blocked" event. + // + // We thus allocate `query_blocked_prof_timer` outside the loop, + // initialize it during the first iteration and finish it during the + // second iteration. + #[cfg(parallel_compiler)] + let mut query_blocked_prof_timer: Option> = None; + let cache = Q::query_cache(tcx); loop { // We compute the key's hash once and then use it for both the @@ -104,7 +108,17 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> { if let Some((_, value)) = lock.results.raw_entry().from_key_hashed_nocheck(key_hash, key) { - tcx.prof.query_cache_hit(Q::NAME); + if unlikely!(tcx.prof.enabled()) { + tcx.prof.query_cache_hit(value.index.into()); + + #[cfg(parallel_compiler)] + { + if let Some(prof_timer) = query_blocked_prof_timer.take() { + prof_timer.finish_with_query_invocation_id(value.index.into()); + } + } + } + let result = (value.value.clone(), value.index); #[cfg(debug_assertions)] { @@ -113,9 +127,6 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> { return TryGetJob::JobCompleted(result); } - #[cfg(parallel_compiler)] - let query_blocked_prof_timer; - let job = match lock.active.entry((*key).clone()) { Entry::Occupied(entry) => { match *entry.get() { @@ -125,11 +136,11 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> { // self-profiler. #[cfg(parallel_compiler)] { - query_blocked_prof_timer = tcx.prof.query_blocked(Q::NAME); + query_blocked_prof_timer = Some(tcx.prof.query_blocked()); } job.clone() - }, + } QueryResult::Poisoned => FatalError.raise(), } } @@ -139,19 +150,12 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> { // Create the `parent` variable before `info`. This allows LLVM // to elide the move of `info` let parent = icx.query.clone(); - let info = QueryInfo { - span, - query: Q::query(key.clone()), - }; + let info = QueryInfo { span, query: Q::query(key.clone()) }; let job = Lrc::new(QueryJob::new(info, parent)); - let owner = JobOwner { - cache, - job: job.clone(), - key: (*key).clone(), - }; + let owner = JobOwner { cache, job: job.clone(), key: (*key).clone() }; entry.insert(QueryResult::Started(job)); TryGetJob::NotYetStarted(owner) - }) + }); } }; mem::drop(lock); @@ -169,11 +173,6 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> { { let result = job.r#await(tcx, span); - // This `drop()` is not strictly necessary as the binding - // would go out of scope anyway. But it's good to have an - // explicit marker of how far the measurement goes. - drop(query_blocked_prof_timer); - if let Err(cycle) = result { return TryGetJob::Cycle(Q::handle_cycle_error(tcx, cycle)); } @@ -207,7 +206,7 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> { #[inline(always)] fn with_diagnostics(f: F) -> (R, ThinVec) where - F: FnOnce(Option<&Lock>>) -> R + F: FnOnce(Option<&Lock>>) -> R, { let diagnostics = Lock::new(ThinVec::new()); let result = f(Some(&diagnostics)); @@ -276,9 +275,7 @@ impl<'tcx> TyCtxt<'tcx> { }; // Use the `ImplicitCtxt` while we execute the query. - tls::enter_context(&new_icx, |_| { - compute(self) - }) + tls::enter_context(&new_icx, |_| compute(self)) }) } @@ -300,11 +297,13 @@ impl<'tcx> TyCtxt<'tcx> { // collect/coherence phases anyhow.) ty::print::with_forced_impl_filename_line(|| { let span = fix_span(stack[1 % stack.len()].span, &stack[0].query); - let mut err = struct_span_err!(self.sess, - span, - E0391, - "cycle detected when {}", - stack[0].query.describe(self)); + let mut err = struct_span_err!( + self.sess, + span, + E0391, + "cycle detected when {}", + stack[0].query.describe(self) + ); for i in 1..stack.len() { let query = &stack[i].query; @@ -312,12 +311,16 @@ impl<'tcx> TyCtxt<'tcx> { err.span_note(span, &format!("...which requires {}...", query.describe(self))); } - err.note(&format!("...which again requires {}, completing the cycle", - stack[0].query.describe(self))); + err.note(&format!( + "...which again requires {}, completing the cycle", + stack[0].query.describe(self) + )); if let Some((span, query)) = usage { - err.span_note(fix_span(span, &query), - &format!("cycle used when {}", query.describe(self))); + err.span_note( + fix_span(span, &query), + &format!("cycle used when {}", query.describe(self)), + ); } err @@ -336,11 +339,15 @@ impl<'tcx> TyCtxt<'tcx> { let mut i = 0; while let Some(query) = current_query { - let mut diag = Diagnostic::new(Level::FailureNote, - &format!("#{} [{}] {}", - i, - query.info.query.name(), - query.info.query.describe(icx.tcx))); + let mut diag = Diagnostic::new( + Level::FailureNote, + &format!( + "#{} [{}] {}", + i, + query.info.query.name(), + query.info.query.describe(icx.tcx) + ), + ); diag.span = icx.tcx.sess.source_map().def_span(query.info.span).into(); handler.force_print_diagnostic(diag); @@ -355,17 +362,14 @@ impl<'tcx> TyCtxt<'tcx> { #[inline(never)] pub(super) fn get_query>(self, span: Span, key: Q::Key) -> Q::Value { - debug!("ty::query::get_query<{}>(key={:?}, span={:?})", - Q::NAME.as_str(), - key, - span); + debug!("ty::query::get_query<{}>(key={:?}, span={:?})", Q::NAME, key, span); let job = match JobOwner::try_get(self, span, &key) { TryGetJob::NotYetStarted(job) => job, TryGetJob::Cycle(result) => return result, TryGetJob::JobCompleted((v, index)) => { self.dep_graph.read_index(index); - return v + return v; } }; @@ -377,23 +381,21 @@ impl<'tcx> TyCtxt<'tcx> { } if Q::ANON { - - let prof_timer = self.prof.query_provider(Q::NAME); + let prof_timer = self.prof.query_provider(); let ((result, dep_node_index), diagnostics) = with_diagnostics(|diagnostics| { self.start_query(job.job.clone(), diagnostics, |tcx| { - tcx.dep_graph.with_anon_task(Q::dep_kind(), || { - Q::compute(tcx, key) - }) + tcx.dep_graph.with_anon_task(Q::dep_kind(), || Q::compute(tcx, key)) }) }); - drop(prof_timer); + prof_timer.finish_with_query_invocation_id(dep_node_index.into()); self.dep_graph.read_index(dep_node_index); if unlikely!(!diagnostics.is_empty()) { - self.queries.on_disk_cache + self.queries + .on_disk_cache .store_diagnostics_for_anon_node(dep_node_index, diagnostics); } @@ -411,12 +413,15 @@ impl<'tcx> TyCtxt<'tcx> { let loaded = self.start_query(job.job.clone(), None, |tcx| { let marked = tcx.dep_graph.try_mark_green_and_read(tcx, &dep_node); marked.map(|(prev_dep_node_index, dep_node_index)| { - (tcx.load_from_disk_and_cache_in_memory::( - key.clone(), - prev_dep_node_index, + ( + tcx.load_from_disk_and_cache_in_memory::( + key.clone(), + prev_dep_node_index, + dep_node_index, + &dep_node, + ), dep_node_index, - &dep_node - ), dep_node_index) + ) }) }); if let Some((result, dep_node_index)) = loaded { @@ -443,17 +448,20 @@ impl<'tcx> TyCtxt<'tcx> { debug_assert!(self.dep_graph.is_green(dep_node)); // First we try to load the result from the on-disk cache. - let result = if Q::cache_on_disk(self, key.clone(), None) && - self.sess.opts.debugging_opts.incremental_queries { - let _prof_timer = self.prof.incr_cache_loading(Q::NAME); + let result = if Q::cache_on_disk(self, key.clone(), None) + && self.sess.opts.debugging_opts.incremental_queries + { + let prof_timer = self.prof.incr_cache_loading(); let result = Q::try_load_from_disk(self, prev_dep_node_index); + prof_timer.finish_with_query_invocation_id(dep_node_index.into()); // We always expect to find a cached result for things that // can be forced from `DepNode`. - debug_assert!(!dep_node.kind.can_reconstruct_query_key() || - result.is_some(), - "missing on-disk cache entry for {:?}", - dep_node); + debug_assert!( + !dep_node.kind.can_reconstruct_query_key() || result.is_some(), + "missing on-disk cache entry for {:?}", + dep_node + ); result } else { // Some things are never cached on disk. @@ -465,12 +473,12 @@ impl<'tcx> TyCtxt<'tcx> { } else { // We could not load a result from the on-disk cache, so // recompute. - let _prof_timer = self.prof.query_provider(Q::NAME); + let prof_timer = self.prof.query_provider(); // The dep-graph for this computation is already in-place. - let result = self.dep_graph.with_ignore(|| { - Q::compute(self, key) - }); + let result = self.dep_graph.with_ignore(|| Q::compute(self, key)); + + prof_timer.finish_with_query_invocation_id(dep_node_index.into()); result }; @@ -495,8 +503,8 @@ impl<'tcx> TyCtxt<'tcx> { use crate::ich::Fingerprint; assert!( - Some(self.dep_graph.fingerprint_of(dep_node_index)) == - self.dep_graph.prev_fingerprint_of(dep_node), + Some(self.dep_graph.fingerprint_of(dep_node_index)) + == self.dep_graph.prev_fingerprint_of(dep_node), "fingerprint for green query instance not loaded from cache: {:?}", dep_node, ); @@ -509,11 +517,7 @@ impl<'tcx> TyCtxt<'tcx> { let old_hash = self.dep_graph.fingerprint_of(dep_node_index); - assert!( - new_hash == old_hash, - "found unstable fingerprints for {:?}", - dep_node, - ); + assert!(new_hash == old_hash, "found unstable fingerprints for {:?}", dep_node,); } #[inline(always)] @@ -528,38 +532,38 @@ impl<'tcx> TyCtxt<'tcx> { // in `DepGraph::try_mark_green()`. // 2. Two distinct query keys get mapped to the same `DepNode` // (see for example #48923). - assert!(!self.dep_graph.dep_node_exists(&dep_node), - "forcing query with already existing `DepNode`\n\ + assert!( + !self.dep_graph.dep_node_exists(&dep_node), + "forcing query with already existing `DepNode`\n\ - query-key: {:?}\n\ - dep-node: {:?}", - key, dep_node); + key, + dep_node + ); - let prof_timer = self.prof.query_provider(Q::NAME); + let prof_timer = self.prof.query_provider(); let ((result, dep_node_index), diagnostics) = with_diagnostics(|diagnostics| { self.start_query(job.job.clone(), diagnostics, |tcx| { if Q::EVAL_ALWAYS { - tcx.dep_graph.with_eval_always_task(dep_node, - tcx, - key, - Q::compute, - Q::hash_result) + tcx.dep_graph.with_eval_always_task( + dep_node, + tcx, + key, + Q::compute, + Q::hash_result, + ) } else { - tcx.dep_graph.with_task(dep_node, - tcx, - key, - Q::compute, - Q::hash_result) + tcx.dep_graph.with_task(dep_node, tcx, key, Q::compute, Q::hash_result) } }) }); - drop(prof_timer); + prof_timer.finish_with_query_invocation_id(dep_node_index.into()); if unlikely!(!diagnostics.is_empty()) { if dep_node.kind != crate::dep_graph::DepKind::Null { - self.queries.on_disk_cache - .store_diagnostics(dep_node_index, diagnostics); + self.queries.on_disk_cache.store_diagnostics(dep_node_index, diagnostics); } } @@ -586,17 +590,19 @@ impl<'tcx> TyCtxt<'tcx> { let dep_node = Q::to_dep_node(self, &key); - if self.dep_graph.try_mark_green_and_read(self, &dep_node).is_none() { - // A None return from `try_mark_green_and_read` means that this is either - // a new dep node or that the dep node has already been marked red. - // Either way, we can't call `dep_graph.read()` as we don't have the - // DepNodeIndex. We must invoke the query itself. The performance cost - // this introduces should be negligible as we'll immediately hit the - // in-memory cache, or another query down the line will. - - let _ = self.get_query::(DUMMY_SP, key); - } else { - self.prof.query_cache_hit(Q::NAME); + match self.dep_graph.try_mark_green_and_read(self, &dep_node) { + None => { + // A None return from `try_mark_green_and_read` means that this is either + // a new dep node or that the dep node has already been marked red. + // Either way, we can't call `dep_graph.read()` as we don't have the + // DepNodeIndex. We must invoke the query itself. The performance cost + // this introduces should be negligible as we'll immediately hit the + // in-memory cache, or another query down the line will. + let _ = self.get_query::(DUMMY_SP, key); + } + Some((_, dep_node_index)) => { + self.prof.query_cache_hit(dep_node_index.into()); + } } } @@ -606,10 +612,7 @@ impl<'tcx> TyCtxt<'tcx> { // Ensure that only one of them runs the query. let job = match JobOwner::try_get(self, span, &key) { TryGetJob::NotYetStarted(job) => job, - TryGetJob::Cycle(_) | - TryGetJob::JobCompleted(_) => { - return - } + TryGetJob::Cycle(_) | TryGetJob::JobCompleted(_) => return, }; self.force_query_with_job::(key, job, dep_node); } @@ -830,36 +833,6 @@ macro_rules! define_queries_inner { } } - #[allow(nonstandard_style)] - #[derive(Clone, Copy)] - pub enum QueryName { - $($name),* - } - - impl rustc_data_structures::profiling::QueryName for QueryName { - fn discriminant(self) -> std::mem::Discriminant { - std::mem::discriminant(&self) - } - - fn as_str(self) -> &'static str { - QueryName::as_str(&self) - } - } - - impl QueryName { - pub fn register_with_profiler( - profiler: &rustc_data_structures::profiling::SelfProfiler, - ) { - $(profiler.register_query_name(QueryName::$name);)* - } - - pub fn as_str(&self) -> &'static str { - match self { - $(QueryName::$name => stringify!($name),)* - } - } - } - #[allow(nonstandard_style)] #[derive(Clone, Debug)] pub enum Query<$tcx> { @@ -900,12 +873,6 @@ macro_rules! define_queries_inner { $(Query::$name(key) => key.default_span(tcx),)* } } - - pub fn query_name(&self) -> QueryName { - match self { - $(Query::$name(_) => QueryName::$name,)* - } - } } impl<'a, $tcx> HashStable> for Query<$tcx> { @@ -940,7 +907,7 @@ macro_rules! define_queries_inner { type Key = $K; type Value = $V; - const NAME: QueryName = QueryName::$name; + const NAME: &'static str = stringify!($name); const CATEGORY: ProfileCategory = $category; } @@ -1052,6 +1019,35 @@ macro_rules! define_queries_inner { pub fn $name(self, key: $K) -> $V { self.at(DUMMY_SP).$name(key) })* + + /// All self-profiling events generated by the query engine use + /// virtual `StringId`s for their `event_id`. This method makes all + /// those virtual `StringId`s point to actual strings. + /// + /// If we are recording only summary data, the ids will point to + /// just the query names. If we are recording query keys too, we + /// allocate the corresponding strings here. + pub fn alloc_self_profile_query_strings(self) { + use crate::ty::query::profiling_support::{ + alloc_self_profile_query_strings_for_query_cache, + QueryKeyStringCache, + }; + + if !self.prof.enabled() { + return; + } + + let mut string_cache = QueryKeyStringCache::new(); + + $({ + alloc_self_profile_query_strings_for_query_cache( + self, + stringify!($name), + &self.queries.$name, + &mut string_cache, + ); + })* + } } impl TyCtxtAt<$tcx> { @@ -1110,7 +1106,6 @@ macro_rules! define_provider_struct { }; } - /// The red/green evaluation system will try to mark a specific DepNode in the /// dependency graph as green by recursively trying to mark the dependencies of /// that `DepNode` as green. While doing so, it will sometimes encounter a `DepNode` @@ -1169,11 +1164,13 @@ pub fn force_from_dep_node(tcx: TyCtxt<'_>, dep_node: &DepNode) -> bool { // each CGU, right after partitioning. This way `try_mark_green` will always // hit the cache instead of having to go through `force_from_dep_node`. // This assertion makes sure, we actually keep applying the solution above. - debug_assert!(dep_node.kind != DepKind::codegen_unit, - "calling force_from_dep_node() on DepKind::codegen_unit"); + debug_assert!( + dep_node.kind != DepKind::codegen_unit, + "calling force_from_dep_node() on DepKind::codegen_unit" + ); if !dep_node.kind.can_reconstruct_query_key() { - return false + return false; } rustc_dep_node_force!([dep_node, tcx] diff --git a/src/librustc/ty/query/profiling_support.rs b/src/librustc/ty/query/profiling_support.rs new file mode 100644 index 0000000000..79b32ba83a --- /dev/null +++ b/src/librustc/ty/query/profiling_support.rs @@ -0,0 +1,235 @@ +use crate::hir::map::definitions::DefPathData; +use crate::ty::context::TyCtxt; +use crate::ty::query::config::QueryConfig; +use crate::ty::query::plumbing::QueryCache; +use measureme::{StringComponent, StringId}; +use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::profiling::SelfProfiler; +use rustc_data_structures::sharded::Sharded; +use rustc_hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE}; +use std::fmt::Debug; +use std::io::Write; + +pub struct QueryKeyStringCache { + def_id_cache: FxHashMap, +} + +impl QueryKeyStringCache { + pub fn new() -> QueryKeyStringCache { + QueryKeyStringCache { def_id_cache: Default::default() } + } +} + +pub struct QueryKeyStringBuilder<'p, 'c, 'tcx> { + profiler: &'p SelfProfiler, + tcx: TyCtxt<'tcx>, + string_cache: &'c mut QueryKeyStringCache, +} + +impl<'p, 'c, 'tcx> QueryKeyStringBuilder<'p, 'c, 'tcx> { + pub fn new( + profiler: &'p SelfProfiler, + tcx: TyCtxt<'tcx>, + string_cache: &'c mut QueryKeyStringCache, + ) -> QueryKeyStringBuilder<'p, 'c, 'tcx> { + QueryKeyStringBuilder { profiler, tcx, string_cache } + } + + // The current implementation is rather crude. In the future it might be a + // good idea to base this on `ty::print` in order to get nicer and more + // efficient query keys. + fn def_id_to_string_id(&mut self, def_id: DefId) -> StringId { + if let Some(&string_id) = self.string_cache.def_id_cache.get(&def_id) { + return string_id; + } + + let def_key = self.tcx.def_key(def_id); + + let (parent_string_id, start_index) = match def_key.parent { + Some(parent_index) => { + let parent_def_id = DefId { index: parent_index, krate: def_id.krate }; + + (self.def_id_to_string_id(parent_def_id), 0) + } + None => (StringId::INVALID, 2), + }; + + let dis_buffer = &mut [0u8; 16]; + let name; + let dis; + let end_index; + + match def_key.disambiguated_data.data { + DefPathData::CrateRoot => { + name = self.tcx.original_crate_name(def_id.krate).as_str(); + dis = ""; + end_index = 3; + } + other => { + name = other.as_symbol().as_str(); + if def_key.disambiguated_data.disambiguator == 0 { + dis = ""; + end_index = 3; + } else { + write!(&mut dis_buffer[..], "[{}]", def_key.disambiguated_data.disambiguator) + .unwrap(); + let end_of_dis = dis_buffer.iter().position(|&c| c == b']').unwrap(); + dis = std::str::from_utf8(&dis_buffer[..end_of_dis + 1]).unwrap(); + end_index = 4; + } + } + } + + let components = [ + StringComponent::Ref(parent_string_id), + StringComponent::Value("::"), + StringComponent::Value(&name[..]), + StringComponent::Value(dis), + ]; + + let string_id = self.profiler.alloc_string(&components[start_index..end_index]); + + self.string_cache.def_id_cache.insert(def_id, string_id); + + string_id + } +} + +pub trait IntoSelfProfilingString { + fn to_self_profile_string(&self, builder: &mut QueryKeyStringBuilder<'_, '_, '_>) -> StringId; +} + +// The default implementation of `IntoSelfProfilingString` just uses `Debug` +// which is slow and causes lots of duplication of string data. +// The specialized impls below take care of making the `DefId` case more +// efficient. +impl IntoSelfProfilingString for T { + default fn to_self_profile_string( + &self, + builder: &mut QueryKeyStringBuilder<'_, '_, '_>, + ) -> StringId { + let s = format!("{:?}", self); + builder.profiler.alloc_string(&s[..]) + } +} + +impl IntoSelfProfilingString for DefId { + fn to_self_profile_string(&self, builder: &mut QueryKeyStringBuilder<'_, '_, '_>) -> StringId { + builder.def_id_to_string_id(*self) + } +} + +impl IntoSelfProfilingString for CrateNum { + fn to_self_profile_string(&self, builder: &mut QueryKeyStringBuilder<'_, '_, '_>) -> StringId { + builder.def_id_to_string_id(DefId { krate: *self, index: CRATE_DEF_INDEX }) + } +} + +impl IntoSelfProfilingString for DefIndex { + fn to_self_profile_string(&self, builder: &mut QueryKeyStringBuilder<'_, '_, '_>) -> StringId { + builder.def_id_to_string_id(DefId { krate: LOCAL_CRATE, index: *self }) + } +} + +impl IntoSelfProfilingString for (T0, T1) +where + T0: IntoSelfProfilingString + Debug, + T1: IntoSelfProfilingString + Debug, +{ + default fn to_self_profile_string( + &self, + builder: &mut QueryKeyStringBuilder<'_, '_, '_>, + ) -> StringId { + let val0 = self.0.to_self_profile_string(builder); + let val1 = self.1.to_self_profile_string(builder); + + let components = &[ + StringComponent::Value("("), + StringComponent::Ref(val0), + StringComponent::Value(","), + StringComponent::Ref(val1), + StringComponent::Value(")"), + ]; + + builder.profiler.alloc_string(components) + } +} + +/// Allocate the self-profiling query strings for a single query cache. This +/// method is called from `alloc_self_profile_query_strings` which knows all +/// the queries via macro magic. +pub(super) fn alloc_self_profile_query_strings_for_query_cache<'tcx, Q>( + tcx: TyCtxt<'tcx>, + query_name: &'static str, + query_cache: &Sharded>, + string_cache: &mut QueryKeyStringCache, +) where + Q: QueryConfig<'tcx>, +{ + tcx.prof.with_profiler(|profiler| { + let event_id_builder = profiler.event_id_builder(); + + // Walk the entire query cache and allocate the appropriate + // string representations. Each cache entry is uniquely + // identified by its dep_node_index. + if profiler.query_key_recording_enabled() { + let mut query_string_builder = QueryKeyStringBuilder::new(profiler, tcx, string_cache); + + let query_name = profiler.get_or_alloc_cached_string(query_name); + + // Since building the string representation of query keys might + // need to invoke queries itself, we cannot keep the query caches + // locked while doing so. Instead we copy out the + // `(query_key, dep_node_index)` pairs and release the lock again. + let query_keys_and_indices = { + let shards = query_cache.lock_shards(); + let len = shards.iter().map(|shard| shard.results.len()).sum(); + + let mut query_keys_and_indices = Vec::with_capacity(len); + + for shard in &shards { + query_keys_and_indices.extend( + shard.results.iter().map(|(q_key, q_val)| (q_key.clone(), q_val.index)), + ); + } + + query_keys_and_indices + }; + + // Now actually allocate the strings. If allocating the strings + // generates new entries in the query cache, we'll miss them but + // we don't actually care. + for (query_key, dep_node_index) in query_keys_and_indices { + // Translate the DepNodeIndex into a QueryInvocationId + let query_invocation_id = dep_node_index.into(); + + // Create the string version of the query-key + let query_key = query_key.to_self_profile_string(&mut query_string_builder); + let event_id = event_id_builder.from_label_and_arg(query_name, query_key); + + // Doing this in bulk might be a good idea: + profiler.map_query_invocation_id_to_string( + query_invocation_id, + event_id.to_string_id(), + ); + } + } else { + // In this branch we don't allocate query keys + let query_name = profiler.get_or_alloc_cached_string(query_name); + let event_id = event_id_builder.from_label(query_name).to_string_id(); + + let shards = query_cache.lock_shards(); + + for shard in shards.iter() { + let query_invocation_ids = shard + .results + .values() + .map(|v| v.index) + .map(|dep_node_index| dep_node_index.into()); + + profiler + .bulk_map_query_invocation_id_to_single_string(query_invocation_ids, event_id); + } + } + }); +} diff --git a/src/librustc/ty/query/values.rs b/src/librustc/ty/query/values.rs index f0d1639f72..900a91fe5c 100644 --- a/src/librustc/ty/query/values.rs +++ b/src/librustc/ty/query/values.rs @@ -1,7 +1,7 @@ -use crate::ty::{self, Ty, TyCtxt, AdtSizedConstraint}; use crate::ty::util::NeedsDrop; +use crate::ty::{self, AdtSizedConstraint, Ty, TyCtxt}; -use syntax::symbol::Symbol; +use rustc_span::symbol::Symbol; pub(super) trait Value<'tcx>: Sized { fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self; diff --git a/src/librustc/ty/relate.rs b/src/librustc/ty/relate.rs index efdf40fd6b..3b9df72266 100644 --- a/src/librustc/ty/relate.rs +++ b/src/librustc/ty/relate.rs @@ -4,16 +4,16 @@ //! types or regions but can be other things. Examples of type relations are //! subtyping, type equality, etc. -use crate::hir::def_id::DefId; +use crate::mir::interpret::{get_slice_bytes, ConstValue}; +use crate::traits; +use crate::ty::error::{ExpectedFound, TypeError}; use crate::ty::subst::{GenericArg, GenericArgKind, SubstsRef}; use crate::ty::{self, Ty, TyCtxt, TypeFoldable}; -use crate::ty::error::{ExpectedFound, TypeError}; -use crate::mir::interpret::{ConstValue, get_slice_bytes}; -use std::rc::Rc; -use std::iter; +use rustc_hir as ast; +use rustc_hir::def_id::DefId; use rustc_target::spec::abi; -use crate::hir as ast; -use crate::traits; +use std::iter; +use std::rc::Rc; pub type RelateResult<'tcx, T> = Result>; @@ -34,8 +34,9 @@ pub trait TypeRelation<'tcx>: Sized { /// relation. Just affects error messages. fn a_is_expected(&self) -> bool; - fn with_cause(&mut self, _cause: Cause, f: F) -> R - where F: FnOnce(&mut Self) -> R + fn with_cause(&mut self, _cause: Cause, f: F) -> R + where + F: FnOnce(&mut Self) -> R, { f(self) } @@ -48,27 +49,28 @@ pub trait TypeRelation<'tcx>: Sized { /// Relate the two substitutions for the given item. The default /// is to look up the variance for the item and proceed /// accordingly. - fn relate_item_substs(&mut self, - item_def_id: DefId, - a_subst: SubstsRef<'tcx>, - b_subst: SubstsRef<'tcx>) - -> RelateResult<'tcx, SubstsRef<'tcx>> - { - debug!("relate_item_substs(item_def_id={:?}, a_subst={:?}, b_subst={:?})", - item_def_id, - a_subst, - b_subst); + fn relate_item_substs( + &mut self, + item_def_id: DefId, + a_subst: SubstsRef<'tcx>, + b_subst: SubstsRef<'tcx>, + ) -> RelateResult<'tcx, SubstsRef<'tcx>> { + debug!( + "relate_item_substs(item_def_id={:?}, a_subst={:?}, b_subst={:?})", + item_def_id, a_subst, b_subst + ); let opt_variances = self.tcx().variances_of(item_def_id); relate_substs(self, Some(opt_variances), a_subst, b_subst) } /// Switch variance for the purpose of relating `a` and `b`. - fn relate_with_variance>(&mut self, - variance: ty::Variance, - a: &T, - b: &T) - -> RelateResult<'tcx, T>; + fn relate_with_variance>( + &mut self, + variance: ty::Variance, + a: &T, + b: &T, + ) -> RelateResult<'tcx, T>; // Overrideable relations. You shouldn't typically call these // directly, instead call `relate()`, which in turn calls @@ -81,18 +83,22 @@ pub trait TypeRelation<'tcx>: Sized { fn regions( &mut self, a: ty::Region<'tcx>, - b: ty::Region<'tcx> + b: ty::Region<'tcx>, ) -> RelateResult<'tcx, ty::Region<'tcx>>; fn consts( &mut self, a: &'tcx ty::Const<'tcx>, - b: &'tcx ty::Const<'tcx> + b: &'tcx ty::Const<'tcx>, ) -> RelateResult<'tcx, &'tcx ty::Const<'tcx>>; - fn binders(&mut self, a: &ty::Binder, b: &ty::Binder) - -> RelateResult<'tcx, ty::Binder> - where T: Relate<'tcx>; + fn binders( + &mut self, + a: &ty::Binder, + b: &ty::Binder, + ) -> RelateResult<'tcx, ty::Binder> + where + T: Relate<'tcx>; } pub trait Relate<'tcx>: TypeFoldable<'tcx> { @@ -112,17 +118,14 @@ impl<'tcx> Relate<'tcx> for ty::TypeAndMut<'tcx> { a: &ty::TypeAndMut<'tcx>, b: &ty::TypeAndMut<'tcx>, ) -> RelateResult<'tcx, ty::TypeAndMut<'tcx>> { - debug!("{}.mts({:?}, {:?})", - relation.tag(), - a, - b); + debug!("{}.mts({:?}, {:?})", relation.tag(), a, b); if a.mutbl != b.mutbl { Err(TypeError::Mutability) } else { let mutbl = a.mutbl; let variance = match mutbl { - ast::Mutability::Immutable => ty::Covariant, - ast::Mutability::Mutable => ty::Invariant, + ast::Mutability::Not => ty::Covariant, + ast::Mutability::Mut => ty::Invariant, }; let ty = relation.relate_with_variance(variance, &a.ty, &b.ty)?; Ok(ty::TypeAndMut { ty, mutbl }) @@ -155,8 +158,11 @@ impl<'tcx> Relate<'tcx> for ty::FnSig<'tcx> { let tcx = relation.tcx(); if a.c_variadic != b.c_variadic { - return Err(TypeError::VariadicMismatch( - expected_found(relation, &a.c_variadic, &b.c_variadic))); + return Err(TypeError::VariadicMismatch(expected_found( + relation, + &a.c_variadic, + &b.c_variadic, + ))); } let unsafety = relation.relate(&a.unsafety, &b.unsafety)?; let abi = relation.relate(&a.abi, &b.abi)?; @@ -165,7 +171,10 @@ impl<'tcx> Relate<'tcx> for ty::FnSig<'tcx> { return Err(TypeError::ArgCount); } - let inputs_and_output = a.inputs().iter().cloned() + let inputs_and_output = a + .inputs() + .iter() + .cloned() .zip(b.inputs().iter().cloned()) .map(|x| (x, false)) .chain(iter::once(((a.output(), b.output()), true))) @@ -205,11 +214,7 @@ impl<'tcx> Relate<'tcx> for abi::Abi { a: &abi::Abi, b: &abi::Abi, ) -> RelateResult<'tcx, abi::Abi> { - if a == b { - Ok(*a) - } else { - Err(TypeError::AbiMismatch(expected_found(relation, a, b))) - } + if a == b { Ok(*a) } else { Err(TypeError::AbiMismatch(expected_found(relation, a, b))) } } } @@ -220,14 +225,14 @@ impl<'tcx> Relate<'tcx> for ty::ProjectionTy<'tcx> { b: &ty::ProjectionTy<'tcx>, ) -> RelateResult<'tcx, ty::ProjectionTy<'tcx>> { if a.item_def_id != b.item_def_id { - Err(TypeError::ProjectionMismatched( - expected_found(relation, &a.item_def_id, &b.item_def_id))) + Err(TypeError::ProjectionMismatched(expected_found( + relation, + &a.item_def_id, + &b.item_def_id, + ))) } else { let substs = relation.relate(&a.substs, &b.substs)?; - Ok(ty::ProjectionTy { - item_def_id: a.item_def_id, - substs: &substs, - }) + Ok(ty::ProjectionTy { item_def_id: a.item_def_id, substs: &substs }) } } } @@ -239,16 +244,15 @@ impl<'tcx> Relate<'tcx> for ty::ExistentialProjection<'tcx> { b: &ty::ExistentialProjection<'tcx>, ) -> RelateResult<'tcx, ty::ExistentialProjection<'tcx>> { if a.item_def_id != b.item_def_id { - Err(TypeError::ProjectionMismatched( - expected_found(relation, &a.item_def_id, &b.item_def_id))) + Err(TypeError::ProjectionMismatched(expected_found( + relation, + &a.item_def_id, + &b.item_def_id, + ))) } else { let ty = relation.relate(&a.ty, &b.ty)?; let substs = relation.relate(&a.substs, &b.substs)?; - Ok(ty::ExistentialProjection { - item_def_id: a.item_def_id, - substs, - ty, - }) + Ok(ty::ExistentialProjection { item_def_id: a.item_def_id, substs, ty }) } } } @@ -267,10 +271,7 @@ impl<'tcx> Relate<'tcx> for Vec> { if a.len() != b.len() { Err(TypeError::ProjectionBoundsLength(expected_found(relation, &a.len(), &b.len()))) } else { - a.iter() - .zip(b) - .map(|(a, b)| relation.relate(a, b)) - .collect() + a.iter().zip(b).map(|(a, b)| relation.relate(a, b)).collect() } } } @@ -344,9 +345,7 @@ pub fn super_relate_tys>( let tcx = relation.tcx(); debug!("super_relate_tys: a={:?} b={:?}", a, b); match (&a.kind, &b.kind) { - (&ty::Infer(_), _) | - (_, &ty::Infer(_)) => - { + (&ty::Infer(_), _) | (_, &ty::Infer(_)) => { // The caller should handle these cases! bug!("var types encountered in super_relate_tys") } @@ -355,59 +354,39 @@ pub fn super_relate_tys>( bug!("bound types encountered in super_relate_tys") } - (&ty::Error, _) | (_, &ty::Error) => - { - Ok(tcx.types.err) - } + (&ty::Error, _) | (_, &ty::Error) => Ok(tcx.types.err), - (&ty::Never, _) | - (&ty::Char, _) | - (&ty::Bool, _) | - (&ty::Int(_), _) | - (&ty::Uint(_), _) | - (&ty::Float(_), _) | - (&ty::Str, _) + (&ty::Never, _) + | (&ty::Char, _) + | (&ty::Bool, _) + | (&ty::Int(_), _) + | (&ty::Uint(_), _) + | (&ty::Float(_), _) + | (&ty::Str, _) if a == b => { Ok(a) } - (&ty::Param(ref a_p), &ty::Param(ref b_p)) - if a_p.index == b_p.index => - { - Ok(a) - } + (&ty::Param(ref a_p), &ty::Param(ref b_p)) if a_p.index == b_p.index => Ok(a), - (ty::Placeholder(p1), ty::Placeholder(p2)) if p1 == p2 => { - Ok(a) - } + (ty::Placeholder(p1), ty::Placeholder(p2)) if p1 == p2 => Ok(a), - (&ty::Adt(a_def, a_substs), &ty::Adt(b_def, b_substs)) - if a_def == b_def => - { + (&ty::Adt(a_def, a_substs), &ty::Adt(b_def, b_substs)) if a_def == b_def => { let substs = relation.relate_item_substs(a_def.did, a_substs, b_substs)?; Ok(tcx.mk_adt(a_def, substs)) } - (&ty::Foreign(a_id), &ty::Foreign(b_id)) - if a_id == b_id => - { - Ok(tcx.mk_foreign(a_id)) - } + (&ty::Foreign(a_id), &ty::Foreign(b_id)) if a_id == b_id => Ok(tcx.mk_foreign(a_id)), (&ty::Dynamic(ref a_obj, ref a_region), &ty::Dynamic(ref b_obj, ref b_region)) => { - let region_bound = relation.with_cause(Cause::ExistentialRegionBound, - |relation| { - relation.relate_with_variance( - ty::Contravariant, - a_region, - b_region) - })?; + let region_bound = relation.with_cause(Cause::ExistentialRegionBound, |relation| { + relation.relate_with_variance(ty::Contravariant, a_region, b_region) + })?; Ok(tcx.mk_dynamic(relation.relate(a_obj, b_obj)?, region_bound)) } - (&ty::Generator(a_id, a_substs, movability), - &ty::Generator(b_id, b_substs, _)) + (&ty::Generator(a_id, a_substs, movability), &ty::Generator(b_id, b_substs, _)) if a_id == b_id => { // All Generator types with the same id represent @@ -417,8 +396,7 @@ pub fn super_relate_tys>( Ok(tcx.mk_generator(a_id, substs, movability)) } - (&ty::GeneratorWitness(a_types), &ty::GeneratorWitness(b_types)) => - { + (&ty::GeneratorWitness(a_types), &ty::GeneratorWitness(b_types)) => { // Wrap our types with a temporary GeneratorWitness struct // inside the binder so we can related them let a_types = a_types.map_bound(GeneratorWitness); @@ -428,10 +406,7 @@ pub fn super_relate_tys>( Ok(tcx.mk_generator_witness(types)) } - (&ty::Closure(a_id, a_substs), - &ty::Closure(b_id, b_substs)) - if a_id == b_id => - { + (&ty::Closure(a_id, a_substs), &ty::Closure(b_id, b_substs)) if a_id == b_id => { // All Closure types with the same id represent // the (anonymous) type of the same closure expression. So // all of their regions should be equated. @@ -439,14 +414,12 @@ pub fn super_relate_tys>( Ok(tcx.mk_closure(a_id, &substs)) } - (&ty::RawPtr(ref a_mt), &ty::RawPtr(ref b_mt)) => - { + (&ty::RawPtr(ref a_mt), &ty::RawPtr(ref b_mt)) => { let mt = relation.relate(a_mt, b_mt)?; Ok(tcx.mk_ptr(mt)) } - (&ty::Ref(a_r, a_ty, a_mutbl), &ty::Ref(b_r, b_ty, b_mutbl)) => - { + (&ty::Ref(a_r, a_ty, a_mutbl), &ty::Ref(b_r, b_ty, b_mutbl)) => { let r = relation.relate_with_variance(ty::Contravariant, &a_r, &b_r)?; let a_mt = ty::TypeAndMut { ty: a_ty, mutbl: a_mutbl }; let b_mt = ty::TypeAndMut { ty: b_ty, mutbl: b_mutbl }; @@ -454,8 +427,7 @@ pub fn super_relate_tys>( Ok(tcx.mk_ref(r, mt)) } - (&ty::Array(a_t, sz_a), &ty::Array(b_t, sz_b)) => - { + (&ty::Array(a_t, sz_a), &ty::Array(b_t, sz_b)) => { let t = relation.relate(&a_t, &b_t)?; match relation.relate(&sz_a, &sz_b) { Ok(sz) => Ok(tcx.mk_ty(ty::Array(t, sz))), @@ -465,32 +437,29 @@ pub fn super_relate_tys>( let sz_a = sz_a.try_eval_usize(tcx, relation.param_env()); let sz_b = sz_b.try_eval_usize(tcx, relation.param_env()); match (sz_a, sz_b) { - (Some(sz_a_val), Some(sz_b_val)) => { - Err(TypeError::FixedArraySize( - expected_found(relation, &sz_a_val, &sz_b_val) - )) - } + (Some(sz_a_val), Some(sz_b_val)) => Err(TypeError::FixedArraySize( + expected_found(relation, &sz_a_val, &sz_b_val), + )), _ => return Err(err), } } } } - (&ty::Slice(a_t), &ty::Slice(b_t)) => - { + (&ty::Slice(a_t), &ty::Slice(b_t)) => { let t = relation.relate(&a_t, &b_t)?; Ok(tcx.mk_slice(t)) } - (&ty::Tuple(as_), &ty::Tuple(bs)) => - { + (&ty::Tuple(as_), &ty::Tuple(bs)) => { if as_.len() == bs.len() { - Ok(tcx.mk_tup(as_.iter().zip(bs).map(|(a, b)| { - relation.relate(&a.expect_ty(), &b.expect_ty()) - }))?) + Ok(tcx.mk_tup( + as_.iter() + .zip(bs) + .map(|(a, b)| relation.relate(&a.expect_ty(), &b.expect_ty())), + )?) } else if !(as_.is_empty() || bs.is_empty()) { - Err(TypeError::TupleSize( - expected_found(relation, &as_.len(), &bs.len()))) + Err(TypeError::TupleSize(expected_found(relation, &as_.len(), &bs.len()))) } else { Err(TypeError::Sorts(expected_found(relation, &a, &b))) } @@ -503,8 +472,7 @@ pub fn super_relate_tys>( Ok(tcx.mk_fn_def(a_def_id, substs)) } - (&ty::FnPtr(a_fty), &ty::FnPtr(b_fty)) => - { + (&ty::FnPtr(a_fty), &ty::FnPtr(b_fty)) => { let fty = relation.relate(&a_fty, &b_fty)?; Ok(tcx.mk_fn_ptr(fty)) } @@ -527,10 +495,7 @@ pub fn super_relate_tys>( Ok(tcx.mk_opaque(a_def_id, substs)) } - _ => - { - Err(TypeError::Sorts(expected_found(relation, &a, &b))) - } + _ => Err(TypeError::Sorts(expected_found(relation, &a, &b))), } } @@ -572,8 +537,8 @@ pub fn super_relate_consts>( Ok(ConstValue::Scalar(a_val)) } else if let ty::FnPtr(_) = a.ty.kind { let alloc_map = tcx.alloc_map.lock(); - let a_instance = alloc_map.unwrap_fn(a_val.to_ptr().unwrap().alloc_id); - let b_instance = alloc_map.unwrap_fn(b_val.to_ptr().unwrap().alloc_id); + let a_instance = alloc_map.unwrap_fn(a_val.assert_ptr().alloc_id); + let b_instance = alloc_map.unwrap_fn(b_val.assert_ptr().alloc_id); if a_instance == b_instance { Ok(ConstValue::Scalar(a_val)) } else { @@ -595,26 +560,24 @@ pub fn super_relate_consts>( } // FIXME(const_generics): handle `ConstValue::ByRef`. - - _ => Err(TypeError::ConstMismatch(expected_found(relation, &a, &b))), + _ => Err(TypeError::ConstMismatch(expected_found(relation, &a, &b))), }; new_val.map(ty::ConstKind::Value) - }, + } // FIXME(const_generics): this is wrong, as it is a projection - (ty::ConstKind::Unevaluated(a_def_id, a_substs), - ty::ConstKind::Unevaluated(b_def_id, b_substs)) if a_def_id == b_def_id => { + ( + ty::ConstKind::Unevaluated(a_def_id, a_substs, a_promoted), + ty::ConstKind::Unevaluated(b_def_id, b_substs, b_promoted), + ) if a_def_id == b_def_id && a_promoted == b_promoted => { let substs = relation.relate_with_variance(ty::Variance::Invariant, &a_substs, &b_substs)?; - Ok(ty::ConstKind::Unevaluated(a_def_id, &substs)) + Ok(ty::ConstKind::Unevaluated(a_def_id, &substs, a_promoted)) } - _ => Err(TypeError::ConstMismatch(expected_found(relation, &a, &b))), + _ => Err(TypeError::ConstMismatch(expected_found(relation, &a, &b))), }; - new_const_val.map(|val| tcx.mk_const(ty::Const { - val, - ty: a.ty, - })) + new_const_val.map(|val| tcx.mk_const(ty::Const { val, ty: a.ty })) } impl<'tcx> Relate<'tcx> for &'tcx ty::List> { @@ -634,7 +597,7 @@ impl<'tcx> Relate<'tcx> for &'tcx ty::List> { (Trait(ref a), Trait(ref b)) => Ok(Trait(relation.relate(a, b)?)), (Projection(ref a), Projection(ref b)) => Ok(Projection(relation.relate(a, b)?)), (AutoTrait(ref a), AutoTrait(ref b)) if a == b => Ok(AutoTrait(*a)), - _ => Err(TypeError::ExistentialMismatch(expected_found(relation, a, b))) + _ => Err(TypeError::ExistentialMismatch(expected_found(relation, a, b))), } }); Ok(tcx.mk_existential_predicates(v)?) @@ -762,9 +725,7 @@ impl<'tcx> Relate<'tcx> for ty::TraitPredicate<'tcx> { a: &ty::TraitPredicate<'tcx>, b: &ty::TraitPredicate<'tcx>, ) -> RelateResult<'tcx, ty::TraitPredicate<'tcx>> { - Ok(ty::TraitPredicate { - trait_ref: relation.relate(&a.trait_ref, &b.trait_ref)?, - }) + Ok(ty::TraitPredicate { trait_ref: relation.relate(&a.trait_ref, &b.trait_ref)? }) } } @@ -811,7 +772,7 @@ impl<'tcx> Relate<'tcx> for traits::WhereClause<'tcx> { ))) } - _ => Err(TypeError::Mismatch), + _ => Err(TypeError::Mismatch), } } } @@ -826,7 +787,7 @@ impl<'tcx> Relate<'tcx> for traits::WellFormed<'tcx> { match (a, b) { (Trait(a_pred), Trait(b_pred)) => Ok(Trait(relation.relate(a_pred, b_pred)?)), (Ty(a_ty), Ty(b_ty)) => Ok(Ty(relation.relate(a_ty, b_ty)?)), - _ => Err(TypeError::Mismatch), + _ => Err(TypeError::Mismatch), } } } @@ -841,7 +802,7 @@ impl<'tcx> Relate<'tcx> for traits::FromEnv<'tcx> { match (a, b) { (Trait(a_pred), Trait(b_pred)) => Ok(Trait(relation.relate(a_pred, b_pred)?)), (Ty(a_ty), Ty(b_ty)) => Ok(Ty(relation.relate(a_ty, b_ty)?)), - _ => Err(TypeError::Mismatch), + _ => Err(TypeError::Mismatch), } } } @@ -862,7 +823,7 @@ impl<'tcx> Relate<'tcx> for traits::DomainGoal<'tcx> { Ok(Normalize(relation.relate(a_pred, b_pred)?)) } - _ => Err(TypeError::Mismatch), + _ => Err(TypeError::Mismatch), } } } @@ -897,9 +858,7 @@ impl<'tcx> Relate<'tcx> for traits::Goal<'tcx> { Ok(relation.tcx().mk_goal(DomainGoal(goal))) } - (Quantified(a_qkind, a_goal), Quantified(b_qkind, b_goal)) - if a_qkind == b_qkind => - { + (Quantified(a_qkind, a_goal), Quantified(b_qkind, b_goal)) if a_qkind == b_qkind => { let goal = relation.relate(a_goal, b_goal)?; Ok(relation.tcx().mk_goal(Quantified(*a_qkind, goal))) } @@ -986,9 +945,7 @@ impl<'tcx> Relate<'tcx> for traits::Environment<'tcx> { a: &traits::Environment<'tcx>, b: &traits::Environment<'tcx>, ) -> RelateResult<'tcx, traits::Environment<'tcx>> { - Ok(traits::Environment { - clauses: relation.relate(&a.clauses, &b.clauses)?, - }) + Ok(traits::Environment { clauses: relation.relate(&a.clauses, &b.clauses)? }) } } @@ -1019,17 +976,15 @@ where expected_found_bool(relation.a_is_expected(), a, b) } -pub fn expected_found_bool(a_is_expected: bool, - a: &T, - b: &T) - -> ExpectedFound - where T: Clone +pub fn expected_found_bool(a_is_expected: bool, a: &T, b: &T) -> ExpectedFound +where + T: Clone, { let a = a.clone(); let b = b.clone(); if a_is_expected { - ExpectedFound {expected: a, found: b} + ExpectedFound { expected: a, found: b } } else { - ExpectedFound {expected: b, found: a} + ExpectedFound { expected: b, found: a } } } diff --git a/src/librustc/ty/steal.rs b/src/librustc/ty/steal.rs index 711e59dbcc..224e76845d 100644 --- a/src/librustc/ty/steal.rs +++ b/src/librustc/ty/steal.rs @@ -1,4 +1,4 @@ -use rustc_data_structures::sync::{RwLock, ReadGuard, MappedReadGuard}; +use rustc_data_structures::sync::{MappedReadGuard, ReadGuard, RwLock}; /// The `Steal` struct is intended to used as the value for a query. /// Specifically, we sometimes have queries (*cough* MIR *cough*) @@ -21,20 +21,18 @@ use rustc_data_structures::sync::{RwLock, ReadGuard, MappedReadGuard}; // // FIXME(#41710): what is the best way to model linear queries? pub struct Steal { - value: RwLock> + value: RwLock>, } impl Steal { pub fn new(value: T) -> Self { - Steal { - value: RwLock::new(Some(value)) - } + Steal { value: RwLock::new(Some(value)) } } pub fn borrow(&self) -> MappedReadGuard<'_, T> { ReadGuard::map(self.value.borrow(), |opt| match *opt { None => bug!("attempted to read from stolen value"), - Some(ref v) => v + Some(ref v) => v, }) } diff --git a/src/librustc/ty/structural_impls.rs b/src/librustc/ty/structural_impls.rs index ce76a4c831..c1ae4d9fe1 100644 --- a/src/librustc/ty/structural_impls.rs +++ b/src/librustc/ty/structural_impls.rs @@ -2,41 +2,36 @@ //! traits for various types in the Rust compiler. Most are written by //! hand, though we've recently added some macros and proc-macros to help with the tedium. -use crate::hir::def::Namespace; -use crate::hir::def_id::CRATE_DEF_INDEX; -use crate::mir::ProjectionKind; use crate::mir::interpret; -use crate::ty::{self, Lift, Ty, TyCtxt, InferConst}; +use crate::mir::ProjectionKind; use crate::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor}; use crate::ty::print::{FmtPrinter, Printer}; +use crate::ty::{self, InferConst, Lift, Ty, TyCtxt}; +use rustc_hir::def::Namespace; +use rustc_hir::def_id::CRATE_DEF_INDEX; +use rustc_index::vec::{Idx, IndexVec}; -use rustc_index::vec::{IndexVec, Idx}; use smallvec::SmallVec; - use std::fmt; use std::rc::Rc; use std::sync::Arc; +use syntax::ast; impl fmt::Debug for ty::GenericParamDef { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let type_name = match self.kind { ty::GenericParamDefKind::Lifetime => "Lifetime", - ty::GenericParamDefKind::Type {..} => "Type", + ty::GenericParamDefKind::Type { .. } => "Type", ty::GenericParamDefKind::Const => "Const", }; - write!(f, "{}({}, {:?}, {})", - type_name, - self.name, - self.def_id, - self.index) + write!(f, "{}({}, {:?}, {})", type_name, self.name, self.def_id, self.index) } } impl fmt::Debug for ty::TraitDef { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { ty::tls::with(|tcx| { - FmtPrinter::new(tcx, f, Namespace::TypeNS) - .print_def_path(self.def_id, &[])?; + FmtPrinter::new(tcx, f, Namespace::TypeNS).print_def_path(self.def_id, &[])?; Ok(()) }) } @@ -45,37 +40,22 @@ impl fmt::Debug for ty::TraitDef { impl fmt::Debug for ty::AdtDef { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { ty::tls::with(|tcx| { - FmtPrinter::new(tcx, f, Namespace::TypeNS) - .print_def_path(self.did, &[])?; + FmtPrinter::new(tcx, f, Namespace::TypeNS).print_def_path(self.did, &[])?; Ok(()) }) } } -impl fmt::Debug for ty::ClosureUpvar<'tcx> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "ClosureUpvar({:?},{:?})", - self.res, - self.ty) - } -} - impl fmt::Debug for ty::UpvarId { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let name = ty::tls::with(|tcx| { - tcx.hir().name(self.var_path.hir_id) - }); - write!(f, "UpvarId({:?};`{}`;{:?})", - self.var_path.hir_id, - name, - self.closure_expr_id) + let name = ty::tls::with(|tcx| tcx.hir().name(self.var_path.hir_id)); + write!(f, "UpvarId({:?};`{}`;{:?})", self.var_path.hir_id, name, self.closure_expr_id) } } impl fmt::Debug for ty::UpvarBorrow<'tcx> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "UpvarBorrow({:?}, {:?})", - self.kind, self.region) + write!(f, "UpvarBorrow({:?}, {:?})", self.kind, self.region) } } @@ -110,15 +90,9 @@ impl fmt::Debug for ty::BoundRegion { impl fmt::Debug for ty::RegionKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { - ty::ReEarlyBound(ref data) => { - write!(f, "ReEarlyBound({}, {})", - data.index, - data.name) - } + ty::ReEarlyBound(ref data) => write!(f, "ReEarlyBound({}, {})", data.index, data.name), - ty::ReClosureBound(ref vid) => { - write!(f, "ReClosureBound({:?})", vid) - } + ty::ReClosureBound(ref vid) => write!(f, "ReClosureBound({:?})", vid), ty::ReLateBound(binder_id, ref bound_region) => { write!(f, "ReLateBound({:?}, {:?})", binder_id, bound_region) @@ -132,9 +106,7 @@ impl fmt::Debug for ty::RegionKind { ty::ReVar(ref vid) => vid.fmt(f), - ty::RePlaceholder(placeholder) => { - write!(f, "RePlaceholder({:?})", placeholder) - } + ty::RePlaceholder(placeholder) => write!(f, "RePlaceholder({:?})", placeholder), ty::ReEmpty => write!(f, "ReEmpty"), @@ -162,8 +134,7 @@ impl fmt::Debug for ty::Variance { impl fmt::Debug for ty::FnSig<'tcx> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "({:?}; c_variadic: {})->{:?}", - self.inputs(), self.c_variadic, self.output()) + write!(f, "({:?}; c_variadic: {})->{:?}", self.inputs(), self.c_variadic, self.output()) } } @@ -264,18 +235,20 @@ impl fmt::Debug for ty::ProjectionPredicate<'tcx> { impl fmt::Debug for ty::Predicate<'tcx> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { - ty::Predicate::Trait(ref a) => a.fmt(f), + ty::Predicate::Trait(ref a, constness) => { + if let ast::Constness::Const = constness { + write!(f, "const ")?; + } + a.fmt(f) + } ty::Predicate::Subtype(ref pair) => pair.fmt(f), ty::Predicate::RegionOutlives(ref pair) => pair.fmt(f), ty::Predicate::TypeOutlives(ref pair) => pair.fmt(f), ty::Predicate::Projection(ref pair) => pair.fmt(f), ty::Predicate::WellFormed(ty) => write!(f, "WellFormed({:?})", ty), - ty::Predicate::ObjectSafe(trait_def_id) => { - write!(f, "ObjectSafe({:?})", trait_def_id) - } + ty::Predicate::ObjectSafe(trait_def_id) => write!(f, "ObjectSafe({:?})", trait_def_id), ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => { - write!(f, "ClosureKind({:?}, {:?}, {:?})", - closure_def_id, closure_substs, kind) + write!(f, "ClosureKind({:?}, {:?}, {:?})", closure_def_id, closure_substs, kind) } ty::Predicate::ConstEvaluatable(def_id, substs) => { write!(f, "ConstEvaluatable({:?}, {:?})", def_id, substs) @@ -300,13 +273,13 @@ CloneTypeFoldableAndLiftImpls! { crate::middle::region::Scope, ::syntax::ast::FloatTy, ::syntax::ast::NodeId, - ::syntax_pos::symbol::Symbol, - crate::hir::def::Res, - crate::hir::def_id::DefId, - crate::hir::InlineAsmInner, - crate::hir::MatchSource, - crate::hir::Mutability, - crate::hir::Unsafety, + ::rustc_span::symbol::Symbol, + ::rustc_hir::def::Res, + ::rustc_hir::def_id::DefId, + ::rustc_hir::InlineAsmInner, + ::rustc_hir::MatchSource, + ::rustc_hir::Mutability, + ::rustc_hir::Unsafety, ::rustc_target::spec::abi::Abi, crate::mir::Local, crate::mir::Promoted, @@ -329,7 +302,7 @@ CloneTypeFoldableAndLiftImpls! { crate::ty::RegionVid, crate::ty::UniverseIndex, crate::ty::Variance, - ::syntax_pos::Span, + ::rustc_span::Span, } /////////////////////////////////////////////////////////////////////////// @@ -346,10 +319,9 @@ impl<'tcx, A: Lift<'tcx>, B: Lift<'tcx>> Lift<'tcx> for (A, B) { impl<'tcx, A: Lift<'tcx>, B: Lift<'tcx>, C: Lift<'tcx>> Lift<'tcx> for (A, B, C) { type Lifted = (A::Lifted, B::Lifted, C::Lifted); fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.0).and_then(|a| { - tcx.lift(&self.1).and_then(|b| tcx.lift(&self.2).map(|c| (a, b, c))) - }) - } + tcx.lift(&self.0) + .and_then(|a| tcx.lift(&self.1).and_then(|b| tcx.lift(&self.2).map(|c| (a, b, c)))) + } } impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for Option { @@ -357,7 +329,7 @@ impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for Option { fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { match *self { Some(ref x) => tcx.lift(x).map(Some), - None => Some(None) + None => Some(None), } } } @@ -367,7 +339,7 @@ impl<'tcx, T: Lift<'tcx>, E: Lift<'tcx>> Lift<'tcx> for Result { fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { match *self { Ok(ref x) => tcx.lift(x).map(Ok), - Err(ref e) => tcx.lift(e).map(Err) + Err(ref e) => tcx.lift(e).map(Err), } } } @@ -397,8 +369,7 @@ impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for [T] { type Lifted = Vec; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { // type annotation needed to inform `projection_must_outlive` - let mut result : Vec<>::Lifted> - = Vec::with_capacity(self.len()); + let mut result: Vec<>::Lifted> = Vec::with_capacity(self.len()); for x in self { if let Some(value) = tcx.lift(x) { result.push(value); @@ -420,29 +391,21 @@ impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for Vec { impl<'tcx, I: Idx, T: Lift<'tcx>> Lift<'tcx> for IndexVec { type Lifted = IndexVec; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - self.iter() - .map(|e| tcx.lift(e)) - .collect() + self.iter().map(|e| tcx.lift(e)).collect() } } impl<'a, 'tcx> Lift<'tcx> for ty::TraitRef<'a> { type Lifted = ty::TraitRef<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.substs).map(|substs| ty::TraitRef { - def_id: self.def_id, - substs, - }) + tcx.lift(&self.substs).map(|substs| ty::TraitRef { def_id: self.def_id, substs }) } } impl<'a, 'tcx> Lift<'tcx> for ty::ExistentialTraitRef<'a> { type Lifted = ty::ExistentialTraitRef<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.substs).map(|substs| ty::ExistentialTraitRef { - def_id: self.def_id, - substs, - }) + tcx.lift(&self.substs).map(|substs| ty::ExistentialTraitRef { def_id: self.def_id, substs }) } } @@ -450,9 +413,7 @@ impl<'a, 'tcx> Lift<'tcx> for ty::ExistentialPredicate<'a> { type Lifted = ty::ExistentialPredicate<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { match self { - ty::ExistentialPredicate::Trait(x) => { - tcx.lift(x).map(ty::ExistentialPredicate::Trait) - } + ty::ExistentialPredicate::Trait(x) => tcx.lift(x).map(ty::ExistentialPredicate::Trait), ty::ExistentialPredicate::Projection(x) => { tcx.lift(x).map(ty::ExistentialPredicate::Projection) } @@ -466,9 +427,7 @@ impl<'a, 'tcx> Lift<'tcx> for ty::ExistentialPredicate<'a> { impl<'a, 'tcx> Lift<'tcx> for ty::TraitPredicate<'a> { type Lifted = ty::TraitPredicate<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option> { - tcx.lift(&self.trait_ref).map(|trait_ref| ty::TraitPredicate { - trait_ref, - }) + tcx.lift(&self.trait_ref).map(|trait_ref| ty::TraitPredicate { trait_ref }) } } @@ -493,36 +452,26 @@ impl<'tcx, A: Copy + Lift<'tcx>, B: Copy + Lift<'tcx>> Lift<'tcx> for ty::Outliv impl<'a, 'tcx> Lift<'tcx> for ty::ProjectionTy<'a> { type Lifted = ty::ProjectionTy<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option> { - tcx.lift(&self.substs).map(|substs| { - ty::ProjectionTy { - item_def_id: self.item_def_id, - substs, - } - }) + tcx.lift(&self.substs) + .map(|substs| ty::ProjectionTy { item_def_id: self.item_def_id, substs }) } } impl<'a, 'tcx> Lift<'tcx> for ty::ProjectionPredicate<'a> { type Lifted = ty::ProjectionPredicate<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option> { - tcx.lift(&(self.projection_ty, self.ty)).map(|(projection_ty, ty)| { - ty::ProjectionPredicate { - projection_ty, - ty, - } - }) + tcx.lift(&(self.projection_ty, self.ty)) + .map(|(projection_ty, ty)| ty::ProjectionPredicate { projection_ty, ty }) } } impl<'a, 'tcx> Lift<'tcx> for ty::ExistentialProjection<'a> { type Lifted = ty::ExistentialProjection<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.substs).map(|substs| { - ty::ExistentialProjection { - substs, - ty: tcx.lift(&self.ty).expect("type must lift when substs do"), - item_def_id: self.item_def_id, - } + tcx.lift(&self.substs).map(|substs| ty::ExistentialProjection { + substs, + ty: tcx.lift(&self.ty).expect("type must lift when substs do"), + item_def_id: self.item_def_id, }) } } @@ -531,12 +480,10 @@ impl<'a, 'tcx> Lift<'tcx> for ty::Predicate<'a> { type Lifted = ty::Predicate<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { match *self { - ty::Predicate::Trait(ref binder) => { - tcx.lift(binder).map(ty::Predicate::Trait) - } - ty::Predicate::Subtype(ref binder) => { - tcx.lift(binder).map(ty::Predicate::Subtype) + ty::Predicate::Trait(ref binder, constness) => { + tcx.lift(binder).map(|binder| ty::Predicate::Trait(binder, constness)) } + ty::Predicate::Subtype(ref binder) => tcx.lift(binder).map(ty::Predicate::Subtype), ty::Predicate::RegionOutlives(ref binder) => { tcx.lift(binder).map(ty::Predicate::RegionOutlives) } @@ -546,22 +493,17 @@ impl<'a, 'tcx> Lift<'tcx> for ty::Predicate<'a> { ty::Predicate::Projection(ref binder) => { tcx.lift(binder).map(ty::Predicate::Projection) } - ty::Predicate::WellFormed(ty) => { - tcx.lift(&ty).map(ty::Predicate::WellFormed) - } + ty::Predicate::WellFormed(ty) => tcx.lift(&ty).map(ty::Predicate::WellFormed), ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => { - tcx.lift(&closure_substs) - .map(|closure_substs| ty::Predicate::ClosureKind(closure_def_id, - closure_substs, - kind)) + tcx.lift(&closure_substs).map(|closure_substs| { + ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) + }) } ty::Predicate::ObjectSafe(trait_def_id) => { Some(ty::Predicate::ObjectSafe(trait_def_id)) } ty::Predicate::ConstEvaluatable(def_id, substs) => { - tcx.lift(&substs).map(|substs| { - ty::Predicate::ConstEvaluatable(def_id, substs) - }) + tcx.lift(&substs).map(|substs| ty::Predicate::ConstEvaluatable(def_id, substs)) } } } @@ -577,12 +519,10 @@ impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for ty::Binder { impl<'a, 'tcx> Lift<'tcx> for ty::ParamEnv<'a> { type Lifted = ty::ParamEnv<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.caller_bounds).map(|caller_bounds| { - ty::ParamEnv { - reveal: self.reveal, - caller_bounds, - def_id: self.def_id, - } + tcx.lift(&self.caller_bounds).map(|caller_bounds| ty::ParamEnv { + reveal: self.reveal, + caller_bounds, + def_id: self.def_id, }) } } @@ -591,12 +531,7 @@ impl<'a, 'tcx, T: Lift<'tcx>> Lift<'tcx> for ty::ParamEnvAnd<'a, T> { type Lifted = ty::ParamEnvAnd<'tcx, T::Lifted>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { tcx.lift(&self.param_env).and_then(|param_env| { - tcx.lift(&self.value).map(|value| { - ty::ParamEnvAnd { - param_env, - value, - } - }) + tcx.lift(&self.value).map(|value| ty::ParamEnvAnd { param_env, value }) }) } } @@ -604,18 +539,14 @@ impl<'a, 'tcx, T: Lift<'tcx>> Lift<'tcx> for ty::ParamEnvAnd<'a, T> { impl<'a, 'tcx> Lift<'tcx> for ty::ClosureSubsts<'a> { type Lifted = ty::ClosureSubsts<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.substs).map(|substs| { - ty::ClosureSubsts { substs } - }) + tcx.lift(&self.substs).map(|substs| ty::ClosureSubsts { substs }) } } impl<'a, 'tcx> Lift<'tcx> for ty::GeneratorSubsts<'a> { type Lifted = ty::GeneratorSubsts<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.substs).map(|substs| { - ty::GeneratorSubsts { substs } - }) + tcx.lift(&self.substs).map(|substs| ty::GeneratorSubsts { substs }) } } @@ -623,9 +554,7 @@ impl<'a, 'tcx> Lift<'tcx> for ty::adjustment::Adjustment<'a> { type Lifted = ty::adjustment::Adjustment<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { tcx.lift(&self.kind).and_then(|kind| { - tcx.lift(&self.target).map(|target| { - ty::adjustment::Adjustment { kind, target } - }) + tcx.lift(&self.target).map(|target| ty::adjustment::Adjustment { kind, target }) }) } } @@ -634,10 +563,8 @@ impl<'a, 'tcx> Lift<'tcx> for ty::adjustment::Adjust<'a> { type Lifted = ty::adjustment::Adjust<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { match *self { - ty::adjustment::Adjust::NeverToAny => - Some(ty::adjustment::Adjust::NeverToAny), - ty::adjustment::Adjust::Pointer(ptr) => - Some(ty::adjustment::Adjust::Pointer(ptr)), + ty::adjustment::Adjust::NeverToAny => Some(ty::adjustment::Adjust::NeverToAny), + ty::adjustment::Adjust::Pointer(ptr) => Some(ty::adjustment::Adjust::Pointer(ptr)), ty::adjustment::Adjust::Deref(ref overloaded) => { tcx.lift(overloaded).map(ty::adjustment::Adjust::Deref) } @@ -651,12 +578,8 @@ impl<'a, 'tcx> Lift<'tcx> for ty::adjustment::Adjust<'a> { impl<'a, 'tcx> Lift<'tcx> for ty::adjustment::OverloadedDeref<'a> { type Lifted = ty::adjustment::OverloadedDeref<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.region).map(|region| { - ty::adjustment::OverloadedDeref { - region, - mutbl: self.mutbl, - } - }) + tcx.lift(&self.region) + .map(|region| ty::adjustment::OverloadedDeref { region, mutbl: self.mutbl }) } } @@ -667,9 +590,7 @@ impl<'a, 'tcx> Lift<'tcx> for ty::adjustment::AutoBorrow<'a> { ty::adjustment::AutoBorrow::Ref(r, m) => { tcx.lift(&r).map(|r| ty::adjustment::AutoBorrow::Ref(r, m)) } - ty::adjustment::AutoBorrow::RawPtr(m) => { - Some(ty::adjustment::AutoBorrow::RawPtr(m)) - } + ty::adjustment::AutoBorrow::RawPtr(m) => Some(ty::adjustment::AutoBorrow::RawPtr(m)), } } } @@ -678,25 +599,18 @@ impl<'a, 'tcx> Lift<'tcx> for ty::GenSig<'a> { type Lifted = ty::GenSig<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { tcx.lift(&(self.yield_ty, self.return_ty)) - .map(|(yield_ty, return_ty)| { - ty::GenSig { - yield_ty, - return_ty, - } - }) + .map(|(yield_ty, return_ty)| ty::GenSig { yield_ty, return_ty }) } } impl<'a, 'tcx> Lift<'tcx> for ty::FnSig<'a> { type Lifted = ty::FnSig<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.lift(&self.inputs_and_output).map(|x| { - ty::FnSig { - inputs_and_output: x, - c_variadic: self.c_variadic, - unsafety: self.unsafety, - abi: self.abi, - } + tcx.lift(&self.inputs_and_output).map(|x| ty::FnSig { + inputs_and_output: x, + c_variadic: self.c_variadic, + unsafety: self.unsafety, + abi: self.abi, }) } } @@ -705,12 +619,7 @@ impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for ty::error::ExpectedFound { type Lifted = ty::error::ExpectedFound; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { tcx.lift(&self.expected).and_then(|expected| { - tcx.lift(&self.found).map(|found| { - ty::error::ExpectedFound { - expected, - found, - } - }) + tcx.lift(&self.found).map(|found| ty::error::ExpectedFound { expected, found }) }) } } @@ -729,13 +638,13 @@ impl<'a, 'tcx> Lift<'tcx> for ty::error::TypeError<'a> { FixedArraySize(x) => FixedArraySize(x), ArgCount => ArgCount, RegionsDoesNotOutlive(a, b) => { - return tcx.lift(&(a, b)).map(|(a, b)| RegionsDoesNotOutlive(a, b)) + return tcx.lift(&(a, b)).map(|(a, b)| RegionsDoesNotOutlive(a, b)); } RegionsInsufficientlyPolymorphic(a, b) => { - return tcx.lift(&b).map(|b| RegionsInsufficientlyPolymorphic(a, b)) + return tcx.lift(&b).map(|b| RegionsInsufficientlyPolymorphic(a, b)); } RegionsOverlyPolymorphic(a, b) => { - return tcx.lift(&b).map(|b| RegionsOverlyPolymorphic(a, b)) + return tcx.lift(&b).map(|b| RegionsOverlyPolymorphic(a, b)); } RegionsPlaceholderMismatch => RegionsPlaceholderMismatch, IntMismatch(x) => IntMismatch(x), @@ -758,24 +667,23 @@ impl<'a, 'tcx> Lift<'tcx> for ty::InstanceDef<'a> { type Lifted = ty::InstanceDef<'tcx>; fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option { match *self { - ty::InstanceDef::Item(def_id) => - Some(ty::InstanceDef::Item(def_id)), - ty::InstanceDef::VtableShim(def_id) => - Some(ty::InstanceDef::VtableShim(def_id)), - ty::InstanceDef::ReifyShim(def_id) => - Some(ty::InstanceDef::ReifyShim(def_id)), - ty::InstanceDef::Intrinsic(def_id) => - Some(ty::InstanceDef::Intrinsic(def_id)), - ty::InstanceDef::FnPtrShim(def_id, ref ty) => - Some(ty::InstanceDef::FnPtrShim(def_id, tcx.lift(ty)?)), - ty::InstanceDef::Virtual(def_id, n) => - Some(ty::InstanceDef::Virtual(def_id, n)), - ty::InstanceDef::ClosureOnceShim { call_once } => - Some(ty::InstanceDef::ClosureOnceShim { call_once }), - ty::InstanceDef::DropGlue(def_id, ref ty) => - Some(ty::InstanceDef::DropGlue(def_id, tcx.lift(ty)?)), - ty::InstanceDef::CloneShim(def_id, ref ty) => - Some(ty::InstanceDef::CloneShim(def_id, tcx.lift(ty)?)), + ty::InstanceDef::Item(def_id) => Some(ty::InstanceDef::Item(def_id)), + ty::InstanceDef::VtableShim(def_id) => Some(ty::InstanceDef::VtableShim(def_id)), + ty::InstanceDef::ReifyShim(def_id) => Some(ty::InstanceDef::ReifyShim(def_id)), + ty::InstanceDef::Intrinsic(def_id) => Some(ty::InstanceDef::Intrinsic(def_id)), + ty::InstanceDef::FnPtrShim(def_id, ref ty) => { + Some(ty::InstanceDef::FnPtrShim(def_id, tcx.lift(ty)?)) + } + ty::InstanceDef::Virtual(def_id, n) => Some(ty::InstanceDef::Virtual(def_id, n)), + ty::InstanceDef::ClosureOnceShim { call_once } => { + Some(ty::InstanceDef::ClosureOnceShim { call_once }) + } + ty::InstanceDef::DropGlue(def_id, ref ty) => { + Some(ty::InstanceDef::DropGlue(def_id, tcx.lift(ty)?)) + } + ty::InstanceDef::CloneShim(def_id, ref ty) => { + Some(ty::InstanceDef::CloneShim(def_id, tcx.lift(ty)?)) + } } } } @@ -897,8 +805,7 @@ impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for ty::Binder { impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List> { fn super_fold_with>(&self, folder: &mut F) -> Self { - let v = self.iter().map(|p| p.fold_with(folder)).collect::>(); - folder.tcx().intern_existential_predicates(&v) + fold_list(*self, folder, |tcx, v| tcx.intern_existential_predicates(v)) } fn super_visit_with>(&self, visitor: &mut V) -> bool { @@ -908,8 +815,7 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List> impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List> { fn super_fold_with>(&self, folder: &mut F) -> Self { - let v = self.iter().map(|t| t.fold_with(folder)).collect::>(); - folder.tcx().intern_type_list(&v) + fold_list(*self, folder, |tcx, v| tcx.intern_type_list(v)) } fn super_visit_with>(&self, visitor: &mut V) -> bool { @@ -919,8 +825,7 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List> { impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List { fn super_fold_with>(&self, folder: &mut F) -> Self { - let v = self.iter().map(|t| t.fold_with(folder)).collect::>(); - folder.tcx().intern_projs(&v) + fold_list(*self, folder, |tcx, v| tcx.intern_projs(v)) } fn super_visit_with>(&self, visitor: &mut V) -> bool { @@ -938,53 +843,36 @@ impl<'tcx> TypeFoldable<'tcx> for ty::instance::Instance<'tcx> { VtableShim(did) => VtableShim(did.fold_with(folder)), ReifyShim(did) => ReifyShim(did.fold_with(folder)), Intrinsic(did) => Intrinsic(did.fold_with(folder)), - FnPtrShim(did, ty) => FnPtrShim( - did.fold_with(folder), - ty.fold_with(folder), - ), - Virtual(did, i) => Virtual( - did.fold_with(folder), - i, - ), - ClosureOnceShim { call_once } => ClosureOnceShim { - call_once: call_once.fold_with(folder), - }, - DropGlue(did, ty) => DropGlue( - did.fold_with(folder), - ty.fold_with(folder), - ), - CloneShim(did, ty) => CloneShim( - did.fold_with(folder), - ty.fold_with(folder), - ), + FnPtrShim(did, ty) => FnPtrShim(did.fold_with(folder), ty.fold_with(folder)), + Virtual(did, i) => Virtual(did.fold_with(folder), i), + ClosureOnceShim { call_once } => { + ClosureOnceShim { call_once: call_once.fold_with(folder) } + } + DropGlue(did, ty) => DropGlue(did.fold_with(folder), ty.fold_with(folder)), + CloneShim(did, ty) => CloneShim(did.fold_with(folder), ty.fold_with(folder)), }, } } fn super_visit_with>(&self, visitor: &mut V) -> bool { use crate::ty::InstanceDef::*; - self.substs.visit_with(visitor) || - match self.def { - Item(did) | VtableShim(did) | ReifyShim(did) | Intrinsic(did) | Virtual(did, _) => { - did.visit_with(visitor) - }, - FnPtrShim(did, ty) | CloneShim(did, ty) => { - did.visit_with(visitor) || ty.visit_with(visitor) - }, - DropGlue(did, ty) => { - did.visit_with(visitor) || ty.visit_with(visitor) - }, - ClosureOnceShim { call_once } => call_once.visit_with(visitor), - } + self.substs.visit_with(visitor) + || match self.def { + Item(did) | VtableShim(did) | ReifyShim(did) | Intrinsic(did) | Virtual(did, _) => { + did.visit_with(visitor) + } + FnPtrShim(did, ty) | CloneShim(did, ty) => { + did.visit_with(visitor) || ty.visit_with(visitor) + } + DropGlue(did, ty) => did.visit_with(visitor) || ty.visit_with(visitor), + ClosureOnceShim { call_once } => call_once.visit_with(visitor), + } } } impl<'tcx> TypeFoldable<'tcx> for interpret::GlobalId<'tcx> { fn super_fold_with>(&self, folder: &mut F) -> Self { - Self { - instance: self.instance.fold_with(folder), - promoted: self.promoted - } + Self { instance: self.instance.fold_with(folder), promoted: self.promoted } } fn super_visit_with>(&self, visitor: &mut V) -> bool { @@ -999,21 +887,15 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> { ty::Array(typ, sz) => ty::Array(typ.fold_with(folder), sz.fold_with(folder)), ty::Slice(typ) => ty::Slice(typ.fold_with(folder)), ty::Adt(tid, substs) => ty::Adt(tid, substs.fold_with(folder)), - ty::Dynamic(ref trait_ty, ref region) => - ty::Dynamic(trait_ty.fold_with(folder), region.fold_with(folder)), - ty::Tuple(ts) => ty::Tuple(ts.fold_with(folder)), - ty::FnDef(def_id, substs) => { - ty::FnDef(def_id, substs.fold_with(folder)) + ty::Dynamic(ref trait_ty, ref region) => { + ty::Dynamic(trait_ty.fold_with(folder), region.fold_with(folder)) } + ty::Tuple(ts) => ty::Tuple(ts.fold_with(folder)), + ty::FnDef(def_id, substs) => ty::FnDef(def_id, substs.fold_with(folder)), ty::FnPtr(f) => ty::FnPtr(f.fold_with(folder)), - ty::Ref(ref r, ty, mutbl) => { - ty::Ref(r.fold_with(folder), ty.fold_with(folder), mutbl) - } + ty::Ref(ref r, ty, mutbl) => ty::Ref(r.fold_with(folder), ty.fold_with(folder), mutbl), ty::Generator(did, substs, movability) => { - ty::Generator( - did, - substs.fold_with(folder), - movability) + ty::Generator(did, substs.fold_with(folder), movability) } ty::GeneratorWitness(types) => ty::GeneratorWitness(types.fold_with(folder)), ty::Closure(did, substs) => ty::Closure(did, substs.fold_with(folder)), @@ -1023,26 +905,22 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> { } ty::Opaque(did, substs) => ty::Opaque(did, substs.fold_with(folder)), - ty::Bool | - ty::Char | - ty::Str | - ty::Int(_) | - ty::Uint(_) | - ty::Float(_) | - ty::Error | - ty::Infer(_) | - ty::Param(..) | - ty::Bound(..) | - ty::Placeholder(..) | - ty::Never | - ty::Foreign(..) => return self, + ty::Bool + | ty::Char + | ty::Str + | ty::Int(_) + | ty::Uint(_) + | ty::Float(_) + | ty::Error + | ty::Infer(_) + | ty::Param(..) + | ty::Bound(..) + | ty::Placeholder(..) + | ty::Never + | ty::Foreign(..) => return self, }; - if self.kind == kind { - self - } else { - folder.tcx().mk_ty(kind) - } + if self.kind == kind { self } else { folder.tcx().mk_ty(kind) } } fn fold_with>(&self, folder: &mut F) -> Self { @@ -1055,15 +933,14 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> { ty::Array(typ, sz) => typ.visit_with(visitor) || sz.visit_with(visitor), ty::Slice(typ) => typ.visit_with(visitor), ty::Adt(_, substs) => substs.visit_with(visitor), - ty::Dynamic(ref trait_ty, ref reg) => - trait_ty.visit_with(visitor) || reg.visit_with(visitor), + ty::Dynamic(ref trait_ty, ref reg) => { + trait_ty.visit_with(visitor) || reg.visit_with(visitor) + } ty::Tuple(ts) => ts.visit_with(visitor), ty::FnDef(_, substs) => substs.visit_with(visitor), ty::FnPtr(ref f) => f.visit_with(visitor), ty::Ref(r, ty, _) => r.visit_with(visitor) || ty.visit_with(visitor), - ty::Generator(_did, ref substs, _) => { - substs.visit_with(visitor) - } + ty::Generator(_did, ref substs, _) => substs.visit_with(visitor), ty::GeneratorWitness(ref types) => types.visit_with(visitor), ty::Closure(_did, ref substs) => substs.visit_with(visitor), ty::Projection(ref data) | ty::UnnormalizedProjection(ref data) => { @@ -1071,19 +948,19 @@ impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> { } ty::Opaque(_, ref substs) => substs.visit_with(visitor), - ty::Bool | - ty::Char | - ty::Str | - ty::Int(_) | - ty::Uint(_) | - ty::Float(_) | - ty::Error | - ty::Infer(_) | - ty::Bound(..) | - ty::Placeholder(..) | - ty::Param(..) | - ty::Never | - ty::Foreign(..) => false, + ty::Bool + | ty::Char + | ty::Str + | ty::Int(_) + | ty::Uint(_) + | ty::Float(_) + | ty::Error + | ty::Infer(_) + | ty::Bound(..) + | ty::Placeholder(..) + | ty::Param(..) + | ty::Never + | ty::Foreign(..) => false, } } @@ -1112,21 +989,7 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Region<'tcx> { impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List> { fn super_fold_with>(&self, folder: &mut F) -> Self { - // This code is hot enough that it's worth specializing for a list of - // length 0. (No other length is common enough to be worth singling - // out). - if self.len() == 0 { - self - } else { - // Don't bother interning if nothing changed, which is the common - // case. - let v = self.iter().map(|p| p.fold_with(folder)).collect::>(); - if v[..] == self[..] { - self - } else { - folder.tcx().intern_predicates(&v) - } - } + fold_list(*self, folder, |tcx, v| tcx.intern_predicates(v)) } fn super_visit_with>(&self, visitor: &mut V) -> bool { @@ -1148,10 +1011,7 @@ impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::Const<'tcx> { fn super_fold_with>(&self, folder: &mut F) -> Self { let ty = self.ty.fold_with(folder); let val = self.val.fold_with(folder); - folder.tcx().mk_const(ty::Const { - ty, - val - }) + folder.tcx().mk_const(ty::Const { ty, val }) } fn fold_with>(&self, folder: &mut F) -> Self { @@ -1172,10 +1032,12 @@ impl<'tcx> TypeFoldable<'tcx> for ty::ConstKind<'tcx> { match *self { ty::ConstKind::Infer(ic) => ty::ConstKind::Infer(ic.fold_with(folder)), ty::ConstKind::Param(p) => ty::ConstKind::Param(p.fold_with(folder)), - ty::ConstKind::Unevaluated(did, substs) - => ty::ConstKind::Unevaluated(did, substs.fold_with(folder)), - ty::ConstKind::Value(_) | ty::ConstKind::Bound(..) - | ty::ConstKind::Placeholder(..) => *self, + ty::ConstKind::Unevaluated(did, substs, promoted) => { + ty::ConstKind::Unevaluated(did, substs.fold_with(folder), promoted) + } + ty::ConstKind::Value(_) | ty::ConstKind::Bound(..) | ty::ConstKind::Placeholder(..) => { + *self + } } } @@ -1183,9 +1045,10 @@ impl<'tcx> TypeFoldable<'tcx> for ty::ConstKind<'tcx> { match *self { ty::ConstKind::Infer(ic) => ic.visit_with(visitor), ty::ConstKind::Param(p) => p.visit_with(visitor), - ty::ConstKind::Unevaluated(_, substs) => substs.visit_with(visitor), - ty::ConstKind::Value(_) | ty::ConstKind::Bound(..) - | ty::ConstKind::Placeholder(_) => false, + ty::ConstKind::Unevaluated(_, substs, _) => substs.visit_with(visitor), + ty::ConstKind::Value(_) | ty::ConstKind::Bound(..) | ty::ConstKind::Placeholder(_) => { + false + } } } } @@ -1199,3 +1062,34 @@ impl<'tcx> TypeFoldable<'tcx> for InferConst<'tcx> { false } } + +// Does the equivalent of +// ``` +// let v = self.iter().map(|p| p.fold_with(folder)).collect::>(); +// folder.tcx().intern_*(&v) +// ``` +fn fold_list<'tcx, F, T>( + list: &'tcx ty::List, + folder: &mut F, + intern: impl FnOnce(TyCtxt<'tcx>, &[T]) -> &'tcx ty::List, +) -> &'tcx ty::List +where + F: TypeFolder<'tcx>, + T: TypeFoldable<'tcx> + PartialEq + Copy, +{ + let mut iter = list.iter(); + // Look for the first element that changed + if let Some((i, new_t)) = iter.by_ref().enumerate().find_map(|(i, t)| { + let new_t = t.fold_with(folder); + if new_t == *t { None } else { Some((i, new_t)) } + }) { + // An element changed, prepare to intern the resulting list + let mut new_list = SmallVec::<[_; 8]>::with_capacity(list.len()); + new_list.extend_from_slice(&list[..i]); + new_list.push(new_t); + new_list.extend(iter.map(|t| t.fold_with(folder))); + intern(folder.tcx(), &new_list) + } else { + list + } +} diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index 6cb0d1e994..dffe86d946 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -5,21 +5,24 @@ use self::InferTy::*; use self::TyKind::*; -use crate::hir; -use crate::hir::def_id::DefId; use crate::infer::canonical::Canonical; -use crate::mir::interpret::ConstValue; use crate::middle::region; -use crate::ty::subst::{InternalSubsts, Subst, SubstsRef, GenericArg, GenericArgKind}; -use crate::ty::{self, AdtDef, Discr, DefIdTree, TypeFlags, Ty, TyCtxt, TypeFoldable}; -use crate::ty::{List, TyS, ParamEnvAnd, ParamEnv}; +use crate::mir::interpret::ConstValue; +use crate::mir::interpret::Scalar; +use crate::mir::Promoted; use crate::ty::layout::VariantIdx; -use crate::util::captures::Captures; -use crate::mir::interpret::{Scalar, GlobalId}; - +use crate::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef}; +use crate::ty::{ + self, AdtDef, DefIdTree, Discr, Ty, TyCtxt, TypeFlags, TypeFoldable, WithConstness, +}; +use crate::ty::{List, ParamEnv, ParamEnvAnd, TyS}; use polonius_engine::Atom; +use rustc_data_structures::captures::Captures; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; use rustc_index::vec::Idx; use rustc_macros::HashStable; +use rustc_span::symbol::{kw, Symbol}; use rustc_target::spec::abi; use smallvec::SmallVec; use std::borrow::Cow; @@ -27,11 +30,21 @@ use std::cmp::Ordering; use std::marker::PhantomData; use std::ops::Range; use syntax::ast::{self, Ident}; -use syntax::symbol::{kw, Symbol}; #[derive( - Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, RustcEncodable, RustcDecodable, - HashStable, TypeFoldable, Lift, + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Debug, + RustcEncodable, + RustcDecodable, + HashStable, + TypeFoldable, + Lift )] pub struct TypeAndMut<'tcx> { pub ty: Ty<'tcx>, @@ -39,7 +52,16 @@ pub struct TypeAndMut<'tcx> { } #[derive( - Clone, PartialEq, PartialOrd, Eq, Ord, Hash, RustcEncodable, RustcDecodable, Copy, HashStable, + Clone, + PartialEq, + PartialOrd, + Eq, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + Copy, + HashStable )] /// A "free" region `fr` can be interpreted as "some region /// at least as big as the scope `fr.scope`". @@ -49,7 +71,16 @@ pub struct FreeRegion { } #[derive( - Clone, PartialEq, PartialOrd, Eq, Ord, Hash, RustcEncodable, RustcDecodable, Copy, HashStable, + Clone, + PartialEq, + PartialOrd, + Eq, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + Copy, + HashStable )] pub enum BoundRegion { /// An anonymous region parameter for a given fn (&T) @@ -88,8 +119,18 @@ impl BoundRegion { /// N.B., if you change this, you'll probably want to change the corresponding /// AST structure in `libsyntax/ast.rs` as well. -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, - RustcEncodable, RustcDecodable, HashStable, Debug)] +#[derive( + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + HashStable, + Debug +)] #[rustc_diagnostic_item = "TyKind"] pub enum TyKind<'tcx> { /// The primitive boolean type. Written as `bool`. @@ -467,10 +508,7 @@ impl<'tcx> GeneratorSubsts<'tcx> { /// Returns the "generator signature", which consists of its yield /// and return types. pub fn sig(self, def_id: DefId, tcx: TyCtxt<'_>) -> GenSig<'tcx> { - ty::GenSig { - yield_ty: self.yield_ty(def_id, tcx), - return_ty: self.return_ty(def_id, tcx), - } + ty::GenSig { yield_ty: self.yield_ty(def_id, tcx), return_ty: self.return_ty(def_id, tcx) } } } @@ -491,7 +529,7 @@ impl<'tcx> GeneratorSubsts<'tcx> { pub fn variant_range(&self, def_id: DefId, tcx: TyCtxt<'tcx>) -> Range { // FIXME requires optimized MIR let num_variants = tcx.generator_layout(def_id).variant_fields.len(); - (VariantIdx::new(0)..VariantIdx::new(num_variants)) + VariantIdx::new(0)..VariantIdx::new(num_variants) } /// The discriminant for the given variant. Panics if the `variant_index` is @@ -530,7 +568,7 @@ impl<'tcx> GeneratorSubsts<'tcx> { Self::UNRESUMED => Cow::from(Self::UNRESUMED_NAME), Self::RETURNED => Cow::from(Self::RETURNED_NAME), Self::POISONED => Cow::from(Self::POISONED_NAME), - _ => Cow::from(format!("Suspend{}", v.as_usize() - 3)) + _ => Cow::from(format!("Suspend{}", v.as_usize() - 3)), } } @@ -554,9 +592,7 @@ impl<'tcx> GeneratorSubsts<'tcx> { ) -> impl Iterator> + Captures<'tcx>> { let layout = tcx.generator_layout(def_id); layout.variant_fields.iter().map(move |variant| { - variant.iter().map(move |field| { - layout.field_tys[*field].subst(tcx, self.substs) - }) + variant.iter().map(move |field| layout.field_tys[*field].subst(tcx, self.substs)) }) } @@ -613,10 +649,12 @@ impl<'tcx> ExistentialPredicate<'tcx> { use self::ExistentialPredicate::*; match (*self, *other) { (Trait(_), Trait(_)) => Ordering::Equal, - (Projection(ref a), Projection(ref b)) => - tcx.def_path_hash(a.item_def_id).cmp(&tcx.def_path_hash(b.item_def_id)), - (AutoTrait(ref a), AutoTrait(ref b)) => - tcx.trait_def(*a).def_path_hash.cmp(&tcx.trait_def(*b).def_path_hash), + (Projection(ref a), Projection(ref b)) => { + tcx.def_path_hash(a.item_def_id).cmp(&tcx.def_path_hash(b.item_def_id)) + } + (AutoTrait(ref a), AutoTrait(ref b)) => { + tcx.trait_def(*a).def_path_hash.cmp(&tcx.trait_def(*b).def_path_hash) + } (Trait(_), _) => Ordering::Less, (Projection(_), Trait(_)) => Ordering::Greater, (Projection(_), _) => Ordering::Less, @@ -629,15 +667,16 @@ impl<'tcx> Binder> { pub fn with_self_ty(&self, tcx: TyCtxt<'tcx>, self_ty: Ty<'tcx>) -> ty::Predicate<'tcx> { use crate::ty::ToPredicate; match *self.skip_binder() { - ExistentialPredicate::Trait(tr) => Binder(tr).with_self_ty(tcx, self_ty).to_predicate(), - ExistentialPredicate::Projection(p) => - ty::Predicate::Projection(Binder(p.with_self_ty(tcx, self_ty))), + ExistentialPredicate::Trait(tr) => { + Binder(tr).with_self_ty(tcx, self_ty).without_const().to_predicate() + } + ExistentialPredicate::Projection(p) => { + ty::Predicate::Projection(Binder(p.with_self_ty(tcx, self_ty))) + } ExistentialPredicate::AutoTrait(did) => { - let trait_ref = Binder(ty::TraitRef { - def_id: did, - substs: tcx.mk_substs_trait(self_ty, &[]), - }); - trait_ref.to_predicate() + let trait_ref = + Binder(ty::TraitRef { def_id: did, substs: tcx.mk_substs_trait(self_ty, &[]) }); + trait_ref.without_const().to_predicate() } } } @@ -683,24 +722,20 @@ impl<'tcx> List> { } #[inline] - pub fn projection_bounds<'a>(&'a self) -> - impl Iterator> + 'a - { - self.iter().filter_map(|predicate| { - match *predicate { - ExistentialPredicate::Projection(projection) => Some(projection), - _ => None, - } + pub fn projection_bounds<'a>( + &'a self, + ) -> impl Iterator> + 'a { + self.iter().filter_map(|predicate| match *predicate { + ExistentialPredicate::Projection(projection) => Some(projection), + _ => None, }) } #[inline] pub fn auto_traits<'a>(&'a self) -> impl Iterator + 'a { - self.iter().filter_map(|predicate| { - match *predicate { - ExistentialPredicate::AutoTrait(did) => Some(did), - _ => None, - } + self.iter().filter_map(|predicate| match *predicate { + ExistentialPredicate::AutoTrait(did) => Some(did), + _ => None, }) } } @@ -715,8 +750,9 @@ impl<'tcx> Binder<&'tcx List>> { } #[inline] - pub fn projection_bounds<'a>(&'a self) -> - impl Iterator> + 'a { + pub fn projection_bounds<'a>( + &'a self, + ) -> impl Iterator> + 'a { self.skip_binder().projection_bounds().map(Binder::bind) } @@ -725,9 +761,9 @@ impl<'tcx> Binder<&'tcx List>> { self.skip_binder().auto_traits() } - pub fn iter<'a>(&'a self) - -> impl DoubleEndedIterator>> + 'tcx - { + pub fn iter<'a>( + &'a self, + ) -> impl DoubleEndedIterator>> + 'tcx { self.skip_binder().iter().cloned().map(Binder::bind) } } @@ -762,10 +798,7 @@ impl<'tcx> TraitRef<'tcx> { /// Returns a `TraitRef` of the form `P0: Foo` where `Pi` /// are the parameters defined on trait. pub fn identity(tcx: TyCtxt<'tcx>, def_id: DefId) -> TraitRef<'tcx> { - TraitRef { - def_id, - substs: InternalSubsts::identity_for_item(tcx, def_id), - } + TraitRef { def_id, substs: InternalSubsts::identity_for_item(tcx, def_id) } } #[inline] @@ -788,10 +821,7 @@ impl<'tcx> TraitRef<'tcx> { ) -> ty::TraitRef<'tcx> { let defs = tcx.generics_of(trait_id); - ty::TraitRef { - def_id: trait_id, - substs: tcx.intern_substs(&substs[..defs.params.len()]) - } + ty::TraitRef { def_id: trait_id, substs: tcx.intern_substs(&substs[..defs.params.len()]) } } } @@ -808,7 +838,7 @@ impl<'tcx> PolyTraitRef<'tcx> { pub fn to_poly_trait_predicate(&self) -> ty::PolyTraitPredicate<'tcx> { // Note that we preserve binding levels - Binder(ty::TraitPredicate { trait_ref: self.skip_binder().clone() }) + Binder(ty::TraitPredicate { trait_ref: *self.skip_binder() }) } } @@ -844,7 +874,7 @@ impl<'tcx> ExistentialTraitRef<'tcx> { ty::ExistentialTraitRef { def_id: trait_ref.def_id, - substs: tcx.intern_substs(&trait_ref.substs[1..]) + substs: tcx.intern_substs(&trait_ref.substs[1..]), } } @@ -856,10 +886,7 @@ impl<'tcx> ExistentialTraitRef<'tcx> { // otherwise the escaping vars would be captured by the binder // debug_assert!(!self_ty.has_escaping_bound_vars()); - ty::TraitRef { - def_id: self.def_id, - substs: tcx.mk_substs_trait(self_ty, self.substs) - } + ty::TraitRef { def_id: self.def_id, substs: tcx.mk_substs_trait(self_ty, self.substs) } } } @@ -895,7 +922,8 @@ impl Binder { /// binder. This is commonly used to 'inject' a value T into a /// different binding level. pub fn dummy<'tcx>(value: T) -> Binder - where T: TypeFoldable<'tcx> + where + T: TypeFoldable<'tcx>, { debug_assert!(!value.has_escaping_bound_vars()); Binder(value) @@ -931,13 +959,15 @@ impl Binder { } pub fn map_bound_ref(&self, f: F) -> Binder - where F: FnOnce(&T) -> U + where + F: FnOnce(&T) -> U, { self.as_ref().map_bound(f) } pub fn map_bound(self, f: F) -> Binder - where F: FnOnce(T) -> U + where + F: FnOnce(T) -> U, { Binder(f(self.0)) } @@ -953,7 +983,8 @@ impl Binder { /// indices, and given the shallow binding structure we often use, /// would not be that useful.) pub fn no_bound_vars<'tcx>(self) -> Option - where T: TypeFoldable<'tcx> + where + T: TypeFoldable<'tcx>, { if self.skip_binder().has_escaping_bound_vars() { None @@ -969,8 +1000,9 @@ impl Binder { /// `f` should consider bound regions at depth 1 to be free, and /// anything it produces with bound regions at depth 1 will be /// bound in the resulting return value. - pub fn fuse(self, u: Binder, f: F) -> Binder - where F: FnOnce(T, U) -> R + pub fn fuse(self, u: Binder, f: F) -> Binder + where + F: FnOnce(T, U) -> R, { Binder(f(self.0, u.0)) } @@ -981,8 +1013,9 @@ impl Binder { /// `f` should consider bound regions at depth 1 to be free, and /// anything it produces with bound regions at depth 1 will be /// bound in the resulting return values. - pub fn split(self, f: F) -> (Binder, Binder) - where F: FnOnce(T) -> (U, V) + pub fn split(self, f: F) -> (Binder, Binder) + where + F: FnOnce(T) -> (U, V), { let (u, v) = f(self.0); (Binder(u), Binder(v)) @@ -1012,26 +1045,24 @@ impl<'tcx> ProjectionTy<'tcx> { trait_ref: ty::TraitRef<'tcx>, item_name: Ident, ) -> ProjectionTy<'tcx> { - let item_def_id = tcx.associated_items(trait_ref.def_id).find(|item| { - item.kind == ty::AssocKind::Type && - tcx.hygienic_eq(item_name, item.ident, trait_ref.def_id) - }).unwrap().def_id; + let item_def_id = tcx + .associated_items(trait_ref.def_id) + .find(|item| { + item.kind == ty::AssocKind::Type + && tcx.hygienic_eq(item_name, item.ident, trait_ref.def_id) + }) + .unwrap() + .def_id; - ProjectionTy { - substs: trait_ref.substs, - item_def_id, - } + ProjectionTy { substs: trait_ref.substs, item_def_id } } /// Extracts the underlying trait reference from this projection. /// For example, if this is a projection of `::Item`, /// then this function would return a `T: Iterator` trait reference. - pub fn trait_ref(&self, tcx: TyCtxt<'_>) -> ty::TraitRef<'tcx> { + pub fn trait_ref(&self, tcx: TyCtxt<'tcx>) -> ty::TraitRef<'tcx> { let def_id = tcx.associated_item(self.item_def_id).container.id(); - ty::TraitRef { - def_id, - substs: self.substs, - } + ty::TraitRef { def_id, substs: self.substs.truncate_to(tcx, tcx.generics_of(def_id)) } } pub fn self_ty(&self) -> Ty<'tcx> { @@ -1123,8 +1154,18 @@ impl<'tcx> PolyFnSig<'tcx> { pub type CanonicalPolyFnSig<'tcx> = Canonical<'tcx, Binder>>; -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, - Hash, RustcEncodable, RustcDecodable, HashStable)] +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + HashStable +)] pub struct ParamTy { pub index: u32, pub name: Symbol, @@ -1148,8 +1189,18 @@ impl<'tcx> ParamTy { } } -#[derive(Copy, Clone, Hash, RustcEncodable, RustcDecodable, - Eq, PartialEq, Ord, PartialOrd, HashStable)] +#[derive( + Copy, + Clone, + Hash, + RustcEncodable, + RustcDecodable, + Eq, + PartialEq, + Ord, + PartialOrd, + HashStable +)] pub struct ParamConst { pub index: u32, pub name: Symbol, @@ -1366,8 +1417,18 @@ impl Atom for RegionVid { } } -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, - Hash, RustcEncodable, RustcDecodable, HashStable)] +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + HashStable +)] pub enum InferTy { TyVar(TyVid), IntVar(IntVid), @@ -1385,15 +1446,37 @@ rustc_index::newtype_index! { pub struct BoundVar { .. } } -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, - RustcEncodable, RustcDecodable, HashStable)] +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Debug, + RustcEncodable, + RustcDecodable, + HashStable +)] pub struct BoundTy { pub var: BoundVar, pub kind: BoundTyKind, } -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, - RustcEncodable, RustcDecodable, HashStable)] +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Debug, + RustcEncodable, + RustcDecodable, + HashStable +)] pub enum BoundTyKind { Anon, Param(Symbol), @@ -1401,10 +1484,7 @@ pub enum BoundTyKind { impl From for BoundTy { fn from(var: BoundVar) -> Self { - BoundTy { - var, - kind: BoundTyKind::Anon, - } + BoundTy { var, kind: BoundTyKind::Anon } } } @@ -1426,10 +1506,7 @@ impl<'tcx> ExistentialProjection<'tcx> { /// reference. pub fn trait_ref(&self, tcx: TyCtxt<'_>) -> ty::ExistentialTraitRef<'tcx> { let def_id = tcx.associated_item(self.item_def_id).container.id(); - ty::ExistentialTraitRef{ - def_id, - substs: self.substs, - } + ty::ExistentialTraitRef { def_id, substs: self.substs } } pub fn with_self_ty( @@ -1584,20 +1661,15 @@ impl RegionKind { /// error (and should fail an assertion failure). pub fn shifted_out_to_binder(&self, to_binder: ty::DebruijnIndex) -> RegionKind { match *self { - ty::ReLateBound(debruijn, r) => ty::ReLateBound( - debruijn.shifted_out_to_binder(to_binder), - r, - ), - r => r + ty::ReLateBound(debruijn, r) => { + ty::ReLateBound(debruijn.shifted_out_to_binder(to_binder), r) + } + r => r, } } pub fn keep_in_local_tcx(&self) -> bool { - if let ty::ReVar(..) = self { - true - } else { - false - } + if let ty::ReVar(..) = self { true } else { false } } pub fn type_flags(&self) -> TypeFlags { @@ -1623,14 +1695,10 @@ impl RegionKind { flags = flags | TypeFlags::HAS_FREE_REGIONS; flags = flags | TypeFlags::HAS_RE_EARLY_BOUND; } - ty::ReEmpty | - ty::ReStatic | - ty::ReFree { .. } | - ty::ReScope { .. } => { + ty::ReEmpty | ty::ReStatic | ty::ReFree { .. } | ty::ReScope { .. } => { flags = flags | TypeFlags::HAS_FREE_REGIONS; } - ty::ReErased => { - } + ty::ReErased => {} ty::ReClosureBound(..) => { flags = flags | TypeFlags::HAS_FREE_REGIONS; } @@ -1667,9 +1735,7 @@ impl RegionKind { /// function might return the `DefId` of a closure. pub fn free_region_binding_scope(&self, tcx: TyCtxt<'_>) -> DefId { match self { - ty::ReEarlyBound(br) => { - tcx.parent(br.def_id).unwrap() - } + ty::ReEarlyBound(br) => tcx.parent(br.def_id).unwrap(), ty::ReFree(fr) => fr.scope, _ => bug!("free_region_binding_scope invoked on inappropriate region: {:?}", self), } @@ -1720,15 +1786,15 @@ impl<'tcx> TyS<'tcx> { }) }) } - ty::Tuple(..) => self.tuple_fields().any(|ty| { - ty.conservative_is_privately_uninhabited(tcx) - }), + ty::Tuple(..) => { + self.tuple_fields().any(|ty| ty.conservative_is_privately_uninhabited(tcx)) + } ty::Array(ty, len) => { match len.try_eval_usize(tcx, ParamEnv::empty()) { // If the array is definitely non-empty, it's uninhabited if // the type of its elements is uninhabited. Some(n) if n != 0 => ty.conservative_is_privately_uninhabited(tcx), - _ => false + _ => false, } } ty::Ref(..) => { @@ -1767,19 +1833,19 @@ impl<'tcx> TyS<'tcx> { #[inline] pub fn is_phantom_data(&self) -> bool { - if let Adt(def, _) = self.kind { - def.is_phantom_data() - } else { - false - } + if let Adt(def, _) = self.kind { def.is_phantom_data() } else { false } } #[inline] - pub fn is_bool(&self) -> bool { self.kind == Bool } + pub fn is_bool(&self) -> bool { + self.kind == Bool + } /// Returns `true` if this type is a `str`. #[inline] - pub fn is_str(&self) -> bool { self.kind == Str } + pub fn is_str(&self) -> bool { + self.kind == Str + } #[inline] pub fn is_param(&self, index: u32) -> bool { @@ -1796,7 +1862,7 @@ impl<'tcx> TyS<'tcx> { Slice(_) | Str => true, _ => false, }, - _ => false + _ => false, } } @@ -1853,9 +1919,9 @@ impl<'tcx> TyS<'tcx> { #[inline] pub fn is_mutable_ptr(&self) -> bool { match self.kind { - RawPtr(TypeAndMut { mutbl: hir::Mutability::Mutable, .. }) | - Ref(_, _, hir::Mutability::Mutable) => true, - _ => false + RawPtr(TypeAndMut { mutbl: hir::Mutability::Mut, .. }) + | Ref(_, _, hir::Mutability::Mut) => true, + _ => false, } } @@ -1913,10 +1979,9 @@ impl<'tcx> TyS<'tcx> { #[inline] pub fn is_scalar(&self) -> bool { match self.kind { - Bool | Char | Int(_) | Float(_) | Uint(_) | - Infer(IntVar(_)) | Infer(FloatVar(_)) | - FnDef(..) | FnPtr(_) | RawPtr(_) => true, - _ => false + Bool | Char | Int(_) | Float(_) | Uint(_) | Infer(IntVar(_)) | Infer(FloatVar(_)) + | FnDef(..) | FnPtr(_) | RawPtr(_) => true, + _ => false, } } @@ -1924,8 +1989,7 @@ impl<'tcx> TyS<'tcx> { #[inline] pub fn is_floating_point(&self) -> bool { match self.kind { - Float(_) | - Infer(FloatVar(_)) => true, + Float(_) | Infer(FloatVar(_)) => true, _ => false, } } @@ -1941,9 +2005,7 @@ impl<'tcx> TyS<'tcx> { #[inline] pub fn is_enum(&self) -> bool { match self.kind { - Adt(adt_def, _) => { - adt_def.is_enum() - } + Adt(adt_def, _) => adt_def.is_enum(), _ => false, } } @@ -1968,7 +2030,7 @@ impl<'tcx> TyS<'tcx> { pub fn is_integral(&self) -> bool { match self.kind { Infer(IntVar(_)) | Int(_) | Uint(_) => true, - _ => false + _ => false, } } @@ -2042,11 +2104,8 @@ impl<'tcx> TyS<'tcx> { pub fn builtin_deref(&self, explicit: bool) -> Option> { match self.kind { Adt(def, _) if def.is_box() => { - Some(TypeAndMut { - ty: self.boxed_ty(), - mutbl: hir::Mutability::Immutable, - }) - }, + Some(TypeAndMut { ty: self.boxed_ty(), mutbl: hir::Mutability::Not }) + } Ref(_, ty, mutbl) => Some(TypeAndMut { ty, mutbl }), RawPtr(mt) if explicit => Some(mt), _ => None, @@ -2063,17 +2122,16 @@ impl<'tcx> TyS<'tcx> { pub fn fn_sig(&self, tcx: TyCtxt<'tcx>) -> PolyFnSig<'tcx> { match self.kind { - FnDef(def_id, substs) => { - tcx.fn_sig(def_id).subst(tcx, substs) - } + FnDef(def_id, substs) => tcx.fn_sig(def_id).subst(tcx, substs), FnPtr(f) => f, - Error => { // ignore errors (#54954) + Error => { + // ignore errors (#54954) ty::Binder::dummy(FnSig::fake()) } - Closure(..) => bug!( - "to get the signature of a closure, use `closure_sig()` not `fn_sig()`", - ), - _ => bug!("Ty::fn_sig() called on non-fn type: {:?}", self) + Closure(..) => { + bug!("to get the signature of a closure, use `closure_sig()` not `fn_sig()`",) + } + _ => bug!("Ty::fn_sig() called on non-fn type: {:?}", self), } } @@ -2111,7 +2169,7 @@ impl<'tcx> TyS<'tcx> { /// Iterates over tuple fields. /// Panics when called on anything but a tuple. - pub fn tuple_fields(&self) -> impl DoubleEndedIterator> { + pub fn tuple_fields(&self) -> impl DoubleEndedIterator> { match self.kind { Tuple(substs) => substs.iter().map(|field| field.expect_ty()), _ => bug!("tuple_fields called on non-tuple"), @@ -2125,8 +2183,9 @@ impl<'tcx> TyS<'tcx> { pub fn variant_range(&self, tcx: TyCtxt<'tcx>) -> Option> { match self.kind { TyKind::Adt(adt, _) => Some(adt.variant_range()), - TyKind::Generator(def_id, substs, _) => - Some(substs.as_generator().variant_range(def_id, tcx)), + TyKind::Generator(def_id, substs, _) => { + Some(substs.as_generator().variant_range(def_id, tcx)) + } _ => None, } } @@ -2143,8 +2202,9 @@ impl<'tcx> TyS<'tcx> { ) -> Option> { match self.kind { TyKind::Adt(adt, _) => Some(adt.discriminant_for_variant(tcx, variant_index)), - TyKind::Generator(def_id, substs, _) => - Some(substs.as_generator().discriminant_for_variant(def_id, tcx, variant_index)), + TyKind::Generator(def_id, substs, _) => { + Some(substs.as_generator().discriminant_for_variant(def_id, tcx, variant_index)) + } _ => None, } } @@ -2163,36 +2223,14 @@ impl<'tcx> TyS<'tcx> { out.extend(principal.skip_binder().substs.regions()); } } - Adt(_, substs) | Opaque(_, substs) => { - out.extend(substs.regions()) - } - Closure(_, ref substs ) | - Generator(_, ref substs, _) => { - out.extend(substs.regions()) - } + Adt(_, substs) | Opaque(_, substs) => out.extend(substs.regions()), + Closure(_, ref substs) | Generator(_, ref substs, _) => out.extend(substs.regions()), Projection(ref data) | UnnormalizedProjection(ref data) => { out.extend(data.substs.regions()) } - FnDef(..) | - FnPtr(_) | - GeneratorWitness(..) | - Bool | - Char | - Int(_) | - Uint(_) | - Float(_) | - Str | - Array(..) | - Slice(_) | - RawPtr(_) | - Never | - Tuple(..) | - Foreign(..) | - Param(_) | - Bound(..) | - Placeholder(..) | - Infer(_) | - Error => {} + FnDef(..) | FnPtr(_) | GeneratorWitness(..) | Bool | Char | Int(_) | Uint(_) + | Float(_) | Str | Array(..) | Slice(_) | RawPtr(_) | Never | Tuple(..) + | Foreign(..) | Param(_) | Bound(..) | Placeholder(..) | Infer(_) | Error => {} } } @@ -2233,23 +2271,29 @@ impl<'tcx> TyS<'tcx> { /// `false` means nothing -- could be sized, might not be. pub fn is_trivially_sized(&self, tcx: TyCtxt<'tcx>) -> bool { match self.kind { - ty::Infer(ty::IntVar(_)) | ty::Infer(ty::FloatVar(_)) | - ty::Uint(_) | ty::Int(_) | ty::Bool | ty::Float(_) | - ty::FnDef(..) | ty::FnPtr(_) | ty::RawPtr(..) | - ty::Char | ty::Ref(..) | ty::Generator(..) | - ty::GeneratorWitness(..) | ty::Array(..) | ty::Closure(..) | - ty::Never | ty::Error => - true, - - ty::Str | ty::Slice(_) | ty::Dynamic(..) | ty::Foreign(..) => - false, - - ty::Tuple(tys) => { - tys.iter().all(|ty| ty.expect_ty().is_trivially_sized(tcx)) - } - - ty::Adt(def, _substs) => - def.sized_constraint(tcx).is_empty(), + ty::Infer(ty::IntVar(_)) + | ty::Infer(ty::FloatVar(_)) + | ty::Uint(_) + | ty::Int(_) + | ty::Bool + | ty::Float(_) + | ty::FnDef(..) + | ty::FnPtr(_) + | ty::RawPtr(..) + | ty::Char + | ty::Ref(..) + | ty::Generator(..) + | ty::GeneratorWitness(..) + | ty::Array(..) + | ty::Closure(..) + | ty::Never + | ty::Error => true, + + ty::Str | ty::Slice(_) | ty::Dynamic(..) | ty::Foreign(..) => false, + + ty::Tuple(tys) => tys.iter().all(|ty| ty.expect_ty().is_trivially_sized(tcx)), + + ty::Adt(def, _substs) => def.sized_constraint(tcx).is_empty(), ty::Projection(_) | ty::Param(_) | ty::Opaque(..) => false, @@ -2257,19 +2301,31 @@ impl<'tcx> TyS<'tcx> { ty::Infer(ty::TyVar(_)) => false, - ty::Bound(..) | - ty::Placeholder(..) | - ty::Infer(ty::FreshTy(_)) | - ty::Infer(ty::FreshIntTy(_)) | - ty::Infer(ty::FreshFloatTy(_)) => - bug!("`is_trivially_sized` applied to unexpected type: {:?}", self), + ty::Bound(..) + | ty::Placeholder(..) + | ty::Infer(ty::FreshTy(_)) + | ty::Infer(ty::FreshIntTy(_)) + | ty::Infer(ty::FreshFloatTy(_)) => { + bug!("`is_trivially_sized` applied to unexpected type: {:?}", self) + } } } } /// Typed constant value. -#[derive(Copy, Clone, Debug, Hash, RustcEncodable, RustcDecodable, - Eq, PartialEq, Ord, PartialOrd, HashStable)] +#[derive( + Copy, + Clone, + Debug, + Hash, + RustcEncodable, + RustcDecodable, + Eq, + PartialEq, + Ord, + PartialOrd, + HashStable +)] pub struct Const<'tcx> { pub ty: Ty<'tcx>, @@ -2282,17 +2338,15 @@ static_assert_size!(Const<'_>, 48); impl<'tcx> Const<'tcx> { #[inline] pub fn from_scalar(tcx: TyCtxt<'tcx>, val: Scalar, ty: Ty<'tcx>) -> &'tcx Self { - tcx.mk_const(Self { - val: ConstKind::Value(ConstValue::Scalar(val)), - ty, - }) + tcx.mk_const(Self { val: ConstKind::Value(ConstValue::Scalar(val)), ty }) } #[inline] pub fn from_bits(tcx: TyCtxt<'tcx>, bits: u128, ty: ParamEnvAnd<'tcx, Ty<'tcx>>) -> &'tcx Self { - let size = tcx.layout_of(ty).unwrap_or_else(|e| { - panic!("could not compute layout for {:?}: {:?}", ty, e) - }).size; + let size = tcx + .layout_of(ty) + .unwrap_or_else(|e| panic!("could not compute layout for {:?}: {:?}", ty, e)) + .size; Self::from_scalar(tcx, Scalar::from_uint(bits, size), ty.value) } @@ -2325,12 +2379,8 @@ impl<'tcx> Const<'tcx> { } #[inline] - pub fn eval( - &self, - tcx: TyCtxt<'tcx>, - param_env: ParamEnv<'tcx>, - ) -> &Const<'tcx> { - let try_const_eval = |did, param_env: ParamEnv<'tcx>, substs| { + pub fn eval(&self, tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>) -> &Const<'tcx> { + let try_const_eval = |did, param_env: ParamEnv<'tcx>, substs, promoted| { let param_env_and_substs = param_env.with_reveal_all().and(substs); // Avoid querying `tcx.const_eval(...)` with any e.g. inference vars. @@ -2340,17 +2390,13 @@ impl<'tcx> Const<'tcx> { let (param_env, substs) = param_env_and_substs.into_parts(); - // try to resolve e.g. associated constants to their definition on an impl - let instance = ty::Instance::resolve(tcx, param_env, did, substs)?; - let gid = GlobalId { - instance, - promoted: None, - }; - tcx.const_eval(param_env.and(gid)).ok() + // try to resolve e.g. associated constants to their definition on an impl, and then + // evaluate the const. + tcx.const_eval_resolve(param_env, did, substs, promoted, None).ok() }; match self.val { - ConstKind::Unevaluated(did, substs) => { + ConstKind::Unevaluated(did, substs, promoted) => { // HACK(eddyb) when substs contain e.g. inference variables, // attempt using identity substs instead, that will succeed // when the expression doesn't depend on any parameters. @@ -2360,14 +2406,14 @@ impl<'tcx> Const<'tcx> { let identity_substs = InternalSubsts::identity_for_item(tcx, did); // The `ParamEnv` needs to match the `identity_substs`. let identity_param_env = tcx.param_env(did); - match try_const_eval(did, identity_param_env, identity_substs) { + match try_const_eval(did, identity_param_env, identity_substs, promoted) { Some(ct) => ct.subst(tcx, substs), None => self, } } else { - try_const_eval(did, param_env, substs).unwrap_or(self) + try_const_eval(did, param_env, substs, promoted).unwrap_or(self) } - }, + } _ => self, } } @@ -2388,8 +2434,8 @@ impl<'tcx> Const<'tcx> { #[inline] pub fn eval_bits(&self, tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>, ty: Ty<'tcx>) -> u128 { - self.try_eval_bits(tcx, param_env, ty).unwrap_or_else(|| - bug!("expected bits of {:#?}, got {:#?}", ty, self)) + self.try_eval_bits(tcx, param_env, ty) + .unwrap_or_else(|| bug!("expected bits of {:#?}, got {:#?}", ty, self)) } #[inline] @@ -2401,8 +2447,19 @@ impl<'tcx> Const<'tcx> { impl<'tcx> rustc_serialize::UseSpecializedDecodable for &'tcx Const<'tcx> {} /// Represents a constant in Rust. -#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, - RustcEncodable, RustcDecodable, Hash, HashStable)] +#[derive( + Copy, + Clone, + Debug, + Eq, + PartialEq, + PartialOrd, + Ord, + RustcEncodable, + RustcDecodable, + Hash, + HashStable +)] pub enum ConstKind<'tcx> { /// A const generic parameter. Param(ParamConst), @@ -2418,7 +2475,7 @@ pub enum ConstKind<'tcx> { /// Used in the HIR by using `Unevaluated` everywhere and later normalizing to one of the other /// variants when the code is monomorphic enough for that. - Unevaluated(DefId, SubstsRef<'tcx>), + Unevaluated(DefId, SubstsRef<'tcx>, Option), /// Used to hold computed value. Value(ConstValue<'tcx>), @@ -2430,11 +2487,7 @@ static_assert_size!(ConstKind<'_>, 40); impl<'tcx> ConstKind<'tcx> { #[inline] pub fn try_to_scalar(&self) -> Option { - if let ConstKind::Value(val) = self { - val.try_to_scalar() - } else { - None - } + if let ConstKind::Value(val) = self { val.try_to_scalar() } else { None } } #[inline] @@ -2444,8 +2497,19 @@ impl<'tcx> ConstKind<'tcx> { } /// An inference variable for a const, for use in const generics. -#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, - Ord, RustcEncodable, RustcDecodable, Hash, HashStable)] +#[derive( + Copy, + Clone, + Debug, + Eq, + PartialEq, + PartialOrd, + Ord, + RustcEncodable, + RustcDecodable, + Hash, + HashStable +)] pub enum InferConst<'tcx> { /// Infer the value of the const. Var(ConstVid<'tcx>), diff --git a/src/librustc/ty/subst.rs b/src/librustc/ty/subst.rs index a8a17fe9d7..a005581283 100644 --- a/src/librustc/ty/subst.rs +++ b/src/librustc/ty/subst.rs @@ -1,19 +1,19 @@ // Type substitutions. -use crate::hir::def_id::DefId; use crate::infer::canonical::Canonical; -use crate::ty::{self, Lift, List, Ty, TyCtxt, ParamConst}; use crate::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor}; use crate::ty::sty::{ClosureSubsts, GeneratorSubsts}; +use crate::ty::{self, Lift, List, ParamConst, Ty, TyCtxt}; -use rustc_serialize::{self, Encodable, Encoder, Decodable, Decoder}; -use syntax_pos::{Span, DUMMY_SP}; -use smallvec::SmallVec; +use rustc_hir::def_id::DefId; use rustc_macros::HashStable; +use rustc_serialize::{self, Decodable, Decoder, Encodable, Encoder}; +use rustc_span::{Span, DUMMY_SP}; +use smallvec::SmallVec; use core::intrinsics; -use std::fmt; use std::cmp::Ordering; +use std::fmt; use std::marker::PhantomData; use std::mem; use std::num::NonZeroUsize; @@ -26,7 +26,7 @@ use std::num::NonZeroUsize; #[derive(Copy, Clone, PartialEq, Eq, Hash)] pub struct GenericArg<'tcx> { ptr: NonZeroUsize, - marker: PhantomData<(Ty<'tcx>, ty::Region<'tcx>, &'tcx ty::Const<'tcx>)> + marker: PhantomData<(Ty<'tcx>, ty::Region<'tcx>, &'tcx ty::Const<'tcx>)>, } const TAG_MASK: usize = 0b11; @@ -61,12 +61,7 @@ impl<'tcx> GenericArgKind<'tcx> { } }; - GenericArg { - ptr: unsafe { - NonZeroUsize::new_unchecked(ptr | tag) - }, - marker: PhantomData - } + GenericArg { ptr: unsafe { NonZeroUsize::new_unchecked(ptr | tag) }, marker: PhantomData } } } @@ -119,7 +114,7 @@ impl<'tcx> GenericArg<'tcx> { REGION_TAG => GenericArgKind::Lifetime(&*((ptr & !TAG_MASK) as *const _)), TYPE_TAG => GenericArgKind::Type(&*((ptr & !TAG_MASK) as *const _)), CONST_TAG => GenericArgKind::Const(&*((ptr & !TAG_MASK) as *const _)), - _ => intrinsics::unreachable() + _ => intrinsics::unreachable(), } } } @@ -188,9 +183,7 @@ impl<'a, 'tcx> InternalSubsts<'tcx> { /// compiler that encodes information like the signature and closure kind; /// see `ty::ClosureSubsts` struct for more comments. pub fn as_closure(&'a self) -> ClosureSubsts<'a> { - ClosureSubsts { - substs: self, - } + ClosureSubsts { substs: self } } /// Interpret these substitutions as the substitutions of a generator type. @@ -203,9 +196,7 @@ impl<'a, 'tcx> InternalSubsts<'tcx> { /// Creates a `InternalSubsts` that maps each generic parameter to itself. pub fn identity_for_item(tcx: TyCtxt<'tcx>, def_id: DefId) -> SubstsRef<'tcx> { - Self::for_item(tcx, def_id, |param, _| { - tcx.mk_param_from_def(param) - }) + Self::for_item(tcx, def_id, |param, _| tcx.mk_param_from_def(param)) } /// Creates a `InternalSubsts` that maps each generic parameter to a higher-ranked @@ -213,31 +204,30 @@ impl<'a, 'tcx> InternalSubsts<'tcx> { /// the type parameter index. For regions, we use the `BoundRegion::BrNamed` /// variant (which has a `DefId`). pub fn bound_vars_for_item(tcx: TyCtxt<'tcx>, def_id: DefId) -> SubstsRef<'tcx> { - Self::for_item(tcx, def_id, |param, _| { - match param.kind { - ty::GenericParamDefKind::Type { .. } => { - tcx.mk_ty( - ty::Bound(ty::INNERMOST, ty::BoundTy { - var: ty::BoundVar::from(param.index), - kind: ty::BoundTyKind::Param(param.name), - }) - ).into() - } - - ty::GenericParamDefKind::Lifetime => { - tcx.mk_region(ty::RegionKind::ReLateBound( - ty::INNERMOST, - ty::BoundRegion::BrNamed(param.def_id, param.name) - )).into() - } - - ty::GenericParamDefKind::Const => { - tcx.mk_const(ty::Const { - val: ty::ConstKind::Bound(ty::INNERMOST, ty::BoundVar::from(param.index)), - ty: tcx.type_of(def_id), - }).into() - } - } + Self::for_item(tcx, def_id, |param, _| match param.kind { + ty::GenericParamDefKind::Type { .. } => tcx + .mk_ty(ty::Bound( + ty::INNERMOST, + ty::BoundTy { + var: ty::BoundVar::from(param.index), + kind: ty::BoundTyKind::Param(param.name), + }, + )) + .into(), + + ty::GenericParamDefKind::Lifetime => tcx + .mk_region(ty::RegionKind::ReLateBound( + ty::INNERMOST, + ty::BoundRegion::BrNamed(param.def_id, param.name), + )) + .into(), + + ty::GenericParamDefKind::Const => tcx + .mk_const(ty::Const { + val: ty::ConstKind::Bound(ty::INNERMOST, ty::BoundVar::from(param.index)), + ty: tcx.type_of(param.def_id), + }) + .into(), }) } @@ -262,9 +252,7 @@ impl<'a, 'tcx> InternalSubsts<'tcx> { F: FnMut(&ty::GenericParamDef, &[GenericArg<'tcx>]) -> GenericArg<'tcx>, { Self::for_item(tcx, def_id, |param, substs| { - self.get(param.index as usize) - .cloned() - .unwrap_or_else(|| mk_kind(param, substs)) + self.get(param.index as usize).cloned().unwrap_or_else(|| mk_kind(param, substs)) }) } @@ -283,10 +271,12 @@ impl<'a, 'tcx> InternalSubsts<'tcx> { Self::fill_single(substs, defs, mk_kind) } - fn fill_single(substs: &mut SmallVec<[GenericArg<'tcx>; 8]>, - defs: &ty::Generics, - mk_kind: &mut F) - where F: FnMut(&ty::GenericParamDef, &[GenericArg<'tcx>]) -> GenericArg<'tcx> + fn fill_single( + substs: &mut SmallVec<[GenericArg<'tcx>; 8]>, + defs: &ty::Generics, + mk_kind: &mut F, + ) where + F: FnMut(&ty::GenericParamDef, &[GenericArg<'tcx>]) -> GenericArg<'tcx>, { substs.reserve(defs.params.len()); for param in &defs.params { @@ -302,46 +292,31 @@ impl<'a, 'tcx> InternalSubsts<'tcx> { #[inline] pub fn types(&'a self) -> impl DoubleEndedIterator> + 'a { - self.iter().filter_map(|k| { - if let GenericArgKind::Type(ty) = k.unpack() { - Some(ty) - } else { - None - } - }) + self.iter() + .filter_map(|k| if let GenericArgKind::Type(ty) = k.unpack() { Some(ty) } else { None }) } #[inline] pub fn regions(&'a self) -> impl DoubleEndedIterator> + 'a { self.iter().filter_map(|k| { - if let GenericArgKind::Lifetime(lt) = k.unpack() { - Some(lt) - } else { - None - } + if let GenericArgKind::Lifetime(lt) = k.unpack() { Some(lt) } else { None } }) } #[inline] pub fn consts(&'a self) -> impl DoubleEndedIterator> + 'a { self.iter().filter_map(|k| { - if let GenericArgKind::Const(ct) = k.unpack() { - Some(ct) - } else { - None - } + if let GenericArgKind::Const(ct) = k.unpack() { Some(ct) } else { None } }) } #[inline] pub fn non_erasable_generics( - &'a self + &'a self, ) -> impl DoubleEndedIterator> + 'a { - self.iter().filter_map(|k| { - match k.unpack() { - GenericArgKind::Lifetime(_) => None, - generic => Some(generic), - } + self.iter().filter_map(|k| match k.unpack() { + GenericArgKind::Lifetime(_) => None, + generic => Some(generic), }) } @@ -408,11 +383,7 @@ impl<'tcx> TypeFoldable<'tcx> for SubstsRef<'tcx> { match self.len() { 1 => { let param0 = self[0].fold_with(folder); - if param0 == self[0] { - self - } else { - folder.tcx().intern_substs(&[param0]) - } + if param0 == self[0] { self } else { folder.tcx().intern_substs(&[param0]) } } 2 => { let param0 = self[0].fold_with(folder); @@ -423,16 +394,10 @@ impl<'tcx> TypeFoldable<'tcx> for SubstsRef<'tcx> { folder.tcx().intern_substs(&[param0, param1]) } } - 0 => { - self - } + 0 => self, _ => { let params: SmallVec<[_; 8]> = self.iter().map(|k| k.fold_with(folder)).collect(); - if params[..] == self[..] { - self - } else { - folder.tcx().intern_substs(¶ms) - } + if params[..] == self[..] { self } else { folder.tcx().intern_substs(¶ms) } } } } @@ -471,12 +436,8 @@ impl<'tcx, T: TypeFoldable<'tcx>> Subst<'tcx> for T { substs: &[GenericArg<'tcx>], span: Option, ) -> T { - let mut folder = SubstFolder { tcx, - substs, - span, - root_ty: None, - ty_stack_depth: 0, - binders_passed: 0 }; + let mut folder = + SubstFolder { tcx, substs, span, root_ty: None, ty_stack_depth: 0, binders_passed: 0 }; (*self).fold_with(&mut folder) } } @@ -502,7 +463,9 @@ struct SubstFolder<'a, 'tcx> { } impl<'a, 'tcx> TypeFolder<'tcx> for SubstFolder<'a, 'tcx> { - fn tcx<'b>(&'b self) -> TyCtxt<'tcx> { self.tcx } + fn tcx<'b>(&'b self) -> TyCtxt<'tcx> { + self.tcx + } fn fold_binder>(&mut self, t: &ty::Binder) -> ty::Binder { self.binders_passed += 1; @@ -521,24 +484,20 @@ impl<'a, 'tcx> TypeFolder<'tcx> for SubstFolder<'a, 'tcx> { ty::ReEarlyBound(data) => { let rk = self.substs.get(data.index as usize).map(|k| k.unpack()); match rk { - Some(GenericArgKind::Lifetime(lt)) => { - self.shift_region_through_binders(lt) - } + Some(GenericArgKind::Lifetime(lt)) => self.shift_region_through_binders(lt), _ => { let span = self.span.unwrap_or(DUMMY_SP); let msg = format!( "Region parameter out of range \ when substituting in region {} (root type={:?}) \ (index={})", - data.name, - self.root_ty, - data.index); - self.tcx.sess.delay_span_bug(span, &msg); - r + data.name, self.root_ty, data.index + ); + span_bug!(span, "{}", msg); } } } - _ => r + _ => r, } } @@ -555,12 +514,8 @@ impl<'a, 'tcx> TypeFolder<'tcx> for SubstFolder<'a, 'tcx> { self.ty_stack_depth += 1; let t1 = match t.kind { - ty::Param(p) => { - self.ty_for_param(p, t) - } - _ => { - t.super_fold_with(self) - } + ty::Param(p) => self.ty_for_param(p, t), + _ => t.super_fold_with(self), }; assert_eq!(depth + 1, self.ty_stack_depth); @@ -626,7 +581,7 @@ impl<'a, 'tcx> SubstFolder<'a, 'tcx> { fn const_for_param( &self, p: ParamConst, - source_ct: &'tcx ty::Const<'tcx> + source_ct: &'tcx ty::Const<'tcx>, ) -> &'tcx ty::Const<'tcx> { // Look up the const in the substitutions. It really should be in there. let opt_ct = self.substs.get(p.index as usize).map(|k| k.unpack()); @@ -705,8 +660,12 @@ impl<'a, 'tcx> SubstFolder<'a, 'tcx> { /// first case we do not increase the De Bruijn index and in the second case we do. The reason /// is that only in the second case have we passed through a fn binder. fn shift_vars_through_binders>(&self, val: T) -> T { - debug!("shift_vars(val={:?}, binders_passed={:?}, has_escaping_bound_vars={:?})", - val, self.binders_passed, val.has_escaping_bound_vars()); + debug!( + "shift_vars(val={:?}, binders_passed={:?}, has_escaping_bound_vars={:?})", + val, + self.binders_passed, + val.has_escaping_bound_vars() + ); if self.binders_passed == 0 || !val.has_escaping_bound_vars() { return val; diff --git a/src/librustc/ty/trait_def.rs b/src/librustc/ty/trait_def.rs index 49ec908231..0cf1c39764 100644 --- a/src/librustc/ty/trait_def.rs +++ b/src/librustc/ty/trait_def.rs @@ -1,11 +1,11 @@ -use crate::hir; -use crate::hir::def_id::DefId; use crate::hir::map::DefPathHash; use crate::ich::{self, StableHashingContext}; use crate::traits::specialization_graph; use crate::ty::fast_reject; use crate::ty::fold::TypeFoldable; use crate::ty::{Ty, TyCtxt}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; @@ -46,21 +46,15 @@ pub struct TraitImpls { } impl<'tcx> TraitDef { - pub fn new(def_id: DefId, - unsafety: hir::Unsafety, - paren_sugar: bool, - has_auto_impl: bool, - is_marker: bool, - def_path_hash: DefPathHash) - -> TraitDef { - TraitDef { - def_id, - unsafety, - paren_sugar, - has_auto_impl, - is_marker, - def_path_hash, - } + pub fn new( + def_id: DefId, + unsafety: hir::Unsafety, + paren_sugar: bool, + has_auto_impl: bool, + is_marker: bool, + def_path_hash: DefPathHash, + ) -> TraitDef { + TraitDef { def_id, unsafety, paren_sugar, has_auto_impl, is_marker, def_path_hash } } pub fn ancestors( @@ -89,11 +83,12 @@ impl<'tcx> TyCtxt<'tcx> { /// Iterate over every impl that could possibly match the /// self type `self_ty`. - pub fn for_each_relevant_impl(self, - def_id: DefId, - self_ty: Ty<'tcx>, - mut f: F) - { + pub fn for_each_relevant_impl( + self, + def_id: DefId, + self_ty: Ty<'tcx>, + mut f: F, + ) { let impls = self.trait_impls_of(def_id); for &impl_def_id in impls.blanket_impls.iter() { @@ -142,17 +137,17 @@ impl<'tcx> TyCtxt<'tcx> { pub fn all_impls(self, def_id: DefId) -> Vec { let impls = self.trait_impls_of(def_id); - impls.blanket_impls.iter().chain( - impls.non_blanket_impls.values().flatten() - ).cloned().collect() + impls + .blanket_impls + .iter() + .chain(impls.non_blanket_impls.values().flatten()) + .cloned() + .collect() } } // Query provider for `trait_impls_of`. -pub(super) fn trait_impls_of_provider( - tcx: TyCtxt<'_>, - trait_id: DefId, -) -> &TraitImpls { +pub(super) fn trait_impls_of_provider(tcx: TyCtxt<'_>, trait_id: DefId) -> &TraitImpls { let mut impls = TraitImpls::default(); { @@ -162,13 +157,8 @@ pub(super) fn trait_impls_of_provider( return; } - if let Some(simplified_self_ty) = - fast_reject::simplify_type(tcx, impl_self_ty, false) - { - impls.non_blanket_impls - .entry(simplified_self_ty) - .or_default() - .push(impl_def_id); + if let Some(simplified_self_ty) = fast_reject::simplify_type(tcx, impl_self_ty, false) { + impls.non_blanket_impls.entry(simplified_self_ty).or_default().push(impl_def_id); } else { impls.blanket_impls.push(impl_def_id); } @@ -194,10 +184,7 @@ pub(super) fn trait_impls_of_provider( impl<'a> HashStable> for TraitImpls { fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let TraitImpls { - ref blanket_impls, - ref non_blanket_impls, - } = *self; + let TraitImpls { ref blanket_impls, ref non_blanket_impls } = *self; ich::hash_stable_trait_impls(hcx, hasher, blanket_impls, non_blanket_impls); } diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs index 2b83cecf1e..8d22ac9dbb 100644 --- a/src/librustc/ty/util.rs +++ b/src/librustc/ty/util.rs @@ -1,103 +1,96 @@ //! Miscellaneous type-system utilities that are too small to deserve their own modules. -use crate::hir; -use crate::hir::def::DefKind; -use crate::hir::def_id::DefId; use crate::hir::map::DefPathData; -use crate::mir::interpret::{sign_extend, truncate}; use crate::ich::NodeIdHashingMode; -use crate::traits::{self, ObligationCause}; -use crate::ty::{self, DefIdTree, Ty, TyCtxt, GenericParamDefKind, TypeFoldable}; -use crate::ty::subst::{Subst, InternalSubsts, SubstsRef, GenericArgKind}; +use crate::mir::interpret::{sign_extend, truncate}; +use crate::ty::layout::{Integer, IntegerExt, Size}; use crate::ty::query::TyCtxtAt; +use crate::ty::subst::{GenericArgKind, InternalSubsts, Subst, SubstsRef}; use crate::ty::TyKind::*; -use crate::ty::layout::{Integer, IntegerExt}; +use crate::ty::{self, DefIdTree, GenericParamDefKind, Ty, TyCtxt, TypeFoldable}; use crate::util::common::ErrorReported; -use crate::middle::lang_items; - -use rustc_data_structures::stable_hasher::{StableHasher, HashStable}; +use rustc_apfloat::Float as _; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_hir as hir; +use rustc_hir::def::DefKind; +use rustc_hir::def_id::DefId; use rustc_macros::HashStable; +use rustc_span::Span; use std::{cmp, fmt}; use syntax::ast; use syntax::attr::{self, SignedInt, UnsignedInt}; -use syntax_pos::{Span, DUMMY_SP}; #[derive(Copy, Clone, Debug)] pub struct Discr<'tcx> { /// Bit representation of the discriminant (e.g., `-128i8` is `0xFF_u128`). pub val: u128, - pub ty: Ty<'tcx> + pub ty: Ty<'tcx>, } impl<'tcx> fmt::Display for Discr<'tcx> { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { match self.ty.kind { ty::Int(ity) => { - let size = ty::tls::with(|tcx| { - Integer::from_attr(&tcx, SignedInt(ity)).size() - }); + let size = ty::tls::with(|tcx| Integer::from_attr(&tcx, SignedInt(ity)).size()); let x = self.val; // sign extend the raw representation to be an i128 let x = sign_extend(x, size) as i128; write!(fmt, "{}", x) - }, + } _ => write!(fmt, "{}", self.val), } } } +fn signed_min(size: Size) -> i128 { + sign_extend(1_u128 << (size.bits() - 1), size) as i128 +} + +fn signed_max(size: Size) -> i128 { + i128::max_value() >> (128 - size.bits()) +} + +fn unsigned_max(size: Size) -> u128 { + u128::max_value() >> (128 - size.bits()) +} + +fn int_size_and_signed<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> (Size, bool) { + let (int, signed) = match ty.kind { + Int(ity) => (Integer::from_attr(&tcx, SignedInt(ity)), true), + Uint(uty) => (Integer::from_attr(&tcx, UnsignedInt(uty)), false), + _ => bug!("non integer discriminant"), + }; + (int.size(), signed) +} + impl<'tcx> Discr<'tcx> { /// Adds `1` to the value and wraps around if the maximum for the type is reached. pub fn wrap_incr(self, tcx: TyCtxt<'tcx>) -> Self { self.checked_add(tcx, 1).0 } pub fn checked_add(self, tcx: TyCtxt<'tcx>, n: u128) -> (Self, bool) { - let (int, signed) = match self.ty.kind { - Int(ity) => (Integer::from_attr(&tcx, SignedInt(ity)), true), - Uint(uty) => (Integer::from_attr(&tcx, UnsignedInt(uty)), false), - _ => bug!("non integer discriminant"), - }; - - let size = int.size(); - let bit_size = int.size().bits(); - let shift = 128 - bit_size; - if signed { - let sext = |u| { - sign_extend(u, size) as i128 - }; - let min = sext(1_u128 << (bit_size - 1)); - let max = i128::max_value() >> shift; - let val = sext(self.val); + let (size, signed) = int_size_and_signed(tcx, self.ty); + let (val, oflo) = if signed { + let min = signed_min(size); + let max = signed_max(size); + let val = sign_extend(self.val, size) as i128; assert!(n < (i128::max_value() as u128)); let n = n as i128; let oflo = val > max - n; - let val = if oflo { - min + (n - (max - val) - 1) - } else { - val + n - }; + let val = if oflo { min + (n - (max - val) - 1) } else { val + n }; // zero the upper bits let val = val as u128; let val = truncate(val, size); - (Self { - val: val as u128, - ty: self.ty, - }, oflo) + (val, oflo) } else { - let max = u128::max_value() >> shift; + let max = unsigned_max(size); let val = self.val; let oflo = val > max - n; - let val = if oflo { - n - (max - val) - 1 - } else { - val + n - }; - (Self { - val: val, - ty: self.ty, - }, oflo) - } + let val = if oflo { n - (max - val) - 1 } else { val + n }; + (val, oflo) + }; + (Self { val, ty: self.ty }, oflo) } } @@ -110,51 +103,36 @@ pub trait IntTypeExt { impl IntTypeExt for attr::IntType { fn to_ty<'tcx>(&self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> { match *self { - SignedInt(ast::IntTy::I8) => tcx.types.i8, - SignedInt(ast::IntTy::I16) => tcx.types.i16, - SignedInt(ast::IntTy::I32) => tcx.types.i32, - SignedInt(ast::IntTy::I64) => tcx.types.i64, - SignedInt(ast::IntTy::I128) => tcx.types.i128, - SignedInt(ast::IntTy::Isize) => tcx.types.isize, - UnsignedInt(ast::UintTy::U8) => tcx.types.u8, - UnsignedInt(ast::UintTy::U16) => tcx.types.u16, - UnsignedInt(ast::UintTy::U32) => tcx.types.u32, - UnsignedInt(ast::UintTy::U64) => tcx.types.u64, - UnsignedInt(ast::UintTy::U128) => tcx.types.u128, + SignedInt(ast::IntTy::I8) => tcx.types.i8, + SignedInt(ast::IntTy::I16) => tcx.types.i16, + SignedInt(ast::IntTy::I32) => tcx.types.i32, + SignedInt(ast::IntTy::I64) => tcx.types.i64, + SignedInt(ast::IntTy::I128) => tcx.types.i128, + SignedInt(ast::IntTy::Isize) => tcx.types.isize, + UnsignedInt(ast::UintTy::U8) => tcx.types.u8, + UnsignedInt(ast::UintTy::U16) => tcx.types.u16, + UnsignedInt(ast::UintTy::U32) => tcx.types.u32, + UnsignedInt(ast::UintTy::U64) => tcx.types.u64, + UnsignedInt(ast::UintTy::U128) => tcx.types.u128, UnsignedInt(ast::UintTy::Usize) => tcx.types.usize, } } fn initial_discriminant<'tcx>(&self, tcx: TyCtxt<'tcx>) -> Discr<'tcx> { - Discr { - val: 0, - ty: self.to_ty(tcx) - } + Discr { val: 0, ty: self.to_ty(tcx) } } fn disr_incr<'tcx>(&self, tcx: TyCtxt<'tcx>, val: Option>) -> Option> { if let Some(val) = val { assert_eq!(self.to_ty(tcx), val.ty); let (new, oflo) = val.checked_add(tcx, 1); - if oflo { - None - } else { - Some(new) - } + if oflo { None } else { Some(new) } } else { Some(self.initial_discriminant(tcx)) } } } - -#[derive(Clone)] -pub enum CopyImplementationError<'tcx> { - InfrigingFields(Vec<&'tcx ty::FieldDef>), - NotAnAdt, - HasDestructor, -} - /// Describes whether a type is representable. For types that are not /// representable, 'SelfRecursive' and 'ContainsRecursive' are used to /// distinguish between types that are recursive with themselves and types that @@ -170,58 +148,6 @@ pub enum Representability { SelfRecursive(Vec), } -impl<'tcx> ty::ParamEnv<'tcx> { - pub fn can_type_implement_copy( - self, - tcx: TyCtxt<'tcx>, - self_type: Ty<'tcx>, - ) -> Result<(), CopyImplementationError<'tcx>> { - // FIXME: (@jroesch) float this code up - tcx.infer_ctxt().enter(|infcx| { - let (adt, substs) = match self_type.kind { - // These types used to have a builtin impl. - // Now libcore provides that impl. - ty::Uint(_) | ty::Int(_) | ty::Bool | ty::Float(_) | - ty::Char | ty::RawPtr(..) | ty::Never | - ty::Ref(_, _, hir::Mutability::Immutable) => return Ok(()), - - ty::Adt(adt, substs) => (adt, substs), - - _ => return Err(CopyImplementationError::NotAnAdt), - }; - - let mut infringing = Vec::new(); - for variant in &adt.variants { - for field in &variant.fields { - let ty = field.ty(tcx, substs); - if ty.references_error() { - continue; - } - let span = tcx.def_span(field.did); - let cause = ObligationCause { span, ..ObligationCause::dummy() }; - let ctx = traits::FulfillmentContext::new(); - match traits::fully_normalize(&infcx, ctx, cause, self, &ty) { - Ok(ty) => if !infcx.type_is_copy_modulo_regions(self, ty, span) { - infringing.push(field); - } - Err(errors) => { - infcx.report_fulfillment_errors(&errors, None, false); - } - }; - } - } - if !infringing.is_empty() { - return Err(CopyImplementationError::InfrigingFields(infringing)); - } - if adt.has_dtor(tcx) { - return Err(CopyImplementationError::HasDestructor); - } - - Ok(()) - }) - } -} - impl<'tcx> TyCtxt<'tcx> { /// Creates a hash of the type `Ty` which will be the same no matter what crate /// context it's calculated within. This is used by the `type_id` intrinsic. @@ -259,8 +185,7 @@ impl<'tcx> TyCtxt<'tcx> { /// Attempts to returns the deeply last field of nested structures, but /// does not apply any normalization in its search. Returns the same type /// if input `ty` is not a structure at all. - pub fn struct_tail_without_normalization(self, ty: Ty<'tcx>) -> Ty<'tcx> - { + pub fn struct_tail_without_normalization(self, ty: Ty<'tcx>) -> Ty<'tcx> { let tcx = self; tcx.struct_tail_with_normalize(ty, |ty| ty) } @@ -272,11 +197,11 @@ impl<'tcx> TyCtxt<'tcx> { /// Should only be called if `ty` has no inference variables and does not /// need its lifetimes preserved (e.g. as part of codegen); otherwise /// normalization attempt may cause compiler bugs. - pub fn struct_tail_erasing_lifetimes(self, - ty: Ty<'tcx>, - param_env: ty::ParamEnv<'tcx>) - -> Ty<'tcx> - { + pub fn struct_tail_erasing_lifetimes( + self, + ty: Ty<'tcx>, + param_env: ty::ParamEnv<'tcx>, + ) -> Ty<'tcx> { let tcx = self; tcx.struct_tail_with_normalize(ty, |ty| tcx.normalize_erasing_regions(param_env, ty)) } @@ -291,11 +216,11 @@ impl<'tcx> TyCtxt<'tcx> { /// /// See also `struct_tail_erasing_lifetimes`, which is suitable for use /// during codegen. - pub fn struct_tail_with_normalize(self, - mut ty: Ty<'tcx>, - normalize: impl Fn(Ty<'tcx>) -> Ty<'tcx>) - -> Ty<'tcx> - { + pub fn struct_tail_with_normalize( + self, + mut ty: Ty<'tcx>, + normalize: impl Fn(Ty<'tcx>) -> Ty<'tcx>, + ) -> Ty<'tcx> { loop { match ty.kind { ty::Adt(def, substs) => { @@ -342,15 +267,16 @@ impl<'tcx> TyCtxt<'tcx> { /// Should only be called if the types have no inference variables and do /// not need their lifetimes preserved (e.g., as part of codegen); otherwise, /// normalization attempt may cause compiler bugs. - pub fn struct_lockstep_tails_erasing_lifetimes(self, - source: Ty<'tcx>, - target: Ty<'tcx>, - param_env: ty::ParamEnv<'tcx>) - -> (Ty<'tcx>, Ty<'tcx>) - { + pub fn struct_lockstep_tails_erasing_lifetimes( + self, + source: Ty<'tcx>, + target: Ty<'tcx>, + param_env: ty::ParamEnv<'tcx>, + ) -> (Ty<'tcx>, Ty<'tcx>) { let tcx = self; - tcx.struct_lockstep_tails_with_normalize( - source, target, |ty| tcx.normalize_erasing_regions(param_env, ty)) + tcx.struct_lockstep_tails_with_normalize(source, target, |ty| { + tcx.normalize_erasing_regions(param_env, ty) + }) } /// Same as applying `struct_tail` on `source` and `target`, but only @@ -361,35 +287,37 @@ impl<'tcx> TyCtxt<'tcx> { /// /// See also `struct_lockstep_tails_erasing_lifetimes`, which is suitable for use /// during codegen. - pub fn struct_lockstep_tails_with_normalize(self, - source: Ty<'tcx>, - target: Ty<'tcx>, - normalize: impl Fn(Ty<'tcx>) -> Ty<'tcx>) - -> (Ty<'tcx>, Ty<'tcx>) - { + pub fn struct_lockstep_tails_with_normalize( + self, + source: Ty<'tcx>, + target: Ty<'tcx>, + normalize: impl Fn(Ty<'tcx>) -> Ty<'tcx>, + ) -> (Ty<'tcx>, Ty<'tcx>) { let (mut a, mut b) = (source, target); loop { match (&a.kind, &b.kind) { (&Adt(a_def, a_substs), &Adt(b_def, b_substs)) - if a_def == b_def && a_def.is_struct() => { + if a_def == b_def && a_def.is_struct() => + { if let Some(f) = a_def.non_enum_variant().fields.last() { a = f.ty(self, a_substs); b = f.ty(self, b_substs); } else { break; } - }, - (&Tuple(a_tys), &Tuple(b_tys)) - if a_tys.len() == b_tys.len() => { + } + (&Tuple(a_tys), &Tuple(b_tys)) if a_tys.len() == b_tys.len() => { if let Some(a_last) = a_tys.last() { a = a_last.expect_ty(); b = b_tys.last().unwrap().expect_ty(); } else { break; } - }, - (ty::Projection(_), _) | (ty::Opaque(..), _) | - (_, ty::Projection(_)) | (_, ty::Opaque(..)) => { + } + (ty::Projection(_), _) + | (ty::Opaque(..), _) + | (_, ty::Projection(_)) + | (_, ty::Opaque(..)) => { // If either side is a projection, attempt to // progress via normalization. (Should be safe to // apply to both sides as normalization is @@ -410,75 +338,11 @@ impl<'tcx> TyCtxt<'tcx> { (a, b) } - /// Given a set of predicates that apply to an object type, returns - /// the region bounds that the (erased) `Self` type must - /// outlive. Precisely *because* the `Self` type is erased, the - /// parameter `erased_self_ty` must be supplied to indicate what type - /// has been used to represent `Self` in the predicates - /// themselves. This should really be a unique type; `FreshTy(0)` is a - /// popular choice. - /// - /// N.B., in some cases, particularly around higher-ranked bounds, - /// this function returns a kind of conservative approximation. - /// That is, all regions returned by this function are definitely - /// required, but there may be other region bounds that are not - /// returned, as well as requirements like `for<'a> T: 'a`. - /// - /// Requires that trait definitions have been processed so that we can - /// elaborate predicates and walk supertraits. - // - // FIXME: callers may only have a `&[Predicate]`, not a `Vec`, so that's - // what this code should accept. - pub fn required_region_bounds(self, - erased_self_ty: Ty<'tcx>, - predicates: Vec>) - -> Vec> { - debug!("required_region_bounds(erased_self_ty={:?}, predicates={:?})", - erased_self_ty, - predicates); - - assert!(!erased_self_ty.has_escaping_bound_vars()); - - traits::elaborate_predicates(self, predicates) - .filter_map(|predicate| { - match predicate { - ty::Predicate::Projection(..) | - ty::Predicate::Trait(..) | - ty::Predicate::Subtype(..) | - ty::Predicate::WellFormed(..) | - ty::Predicate::ObjectSafe(..) | - ty::Predicate::ClosureKind(..) | - ty::Predicate::RegionOutlives(..) | - ty::Predicate::ConstEvaluatable(..) => { - None - } - ty::Predicate::TypeOutlives(predicate) => { - // Search for a bound of the form `erased_self_ty - // : 'a`, but be wary of something like `for<'a> - // erased_self_ty : 'a` (we interpret a - // higher-ranked bound like that as 'static, - // though at present the code in `fulfill.rs` - // considers such bounds to be unsatisfiable, so - // it's kind of a moot point since you could never - // construct such an object, but this seems - // correct even if that code changes). - let ty::OutlivesPredicate(ref t, ref r) = predicate.skip_binder(); - if t == &erased_self_ty && !r.has_escaping_bound_vars() { - Some(*r) - } else { - None - } - } - } - }) - .collect() - } - /// Calculate the destructor of a given type. pub fn calculate_dtor( self, adt_did: DefId, - validate: &mut dyn FnMut(Self, DefId) -> Result<(), ErrorReported> + validate: &mut dyn FnMut(Self, DefId) -> Result<(), ErrorReported>, ) -> Option { let drop_trait = if let Some(def_id) = self.lang_items().drop_trait() { def_id @@ -508,15 +372,13 @@ impl<'tcx> TyCtxt<'tcx> { /// Note that this returns only the constraints for the /// destructor of `def` itself. For the destructors of the /// contents, you need `adt_dtorck_constraint`. - pub fn destructor_constraints(self, def: &'tcx ty::AdtDef) - -> Vec> - { + pub fn destructor_constraints(self, def: &'tcx ty::AdtDef) -> Vec> { let dtor = match def.destructor(self) { None => { debug!("destructor_constraints({:?}) - no dtor", def.did); - return vec![] + return vec![]; } - Some(dtor) => dtor.did + Some(dtor) => dtor.did, }; let impl_def_id = self.associated_item(dtor).container.id(); @@ -545,34 +407,31 @@ impl<'tcx> TyCtxt<'tcx> { let impl_substs = match self.type_of(impl_def_id).kind { ty::Adt(def_, substs) if def_ == def => substs, - _ => bug!() + _ => bug!(), }; let item_substs = match self.type_of(def.did).kind { ty::Adt(def_, substs) if def_ == def => substs, - _ => bug!() + _ => bug!(), }; - let result = item_substs.iter().zip(impl_substs.iter()) + let result = item_substs + .iter() + .zip(impl_substs.iter()) .filter(|&(_, &k)| { match k.unpack() { GenericArgKind::Lifetime(&ty::RegionKind::ReEarlyBound(ref ebr)) => { !impl_generics.region_param(ebr, self).pure_wrt_drop } - GenericArgKind::Type(&ty::TyS { - kind: ty::Param(ref pt), .. - }) => { + GenericArgKind::Type(&ty::TyS { kind: ty::Param(ref pt), .. }) => { !impl_generics.type_param(pt, self).pure_wrt_drop } GenericArgKind::Const(&ty::Const { - val: ty::ConstKind::Param(ref pc), - .. - }) => { - !impl_generics.const_param(pc, self).pure_wrt_drop - } - GenericArgKind::Lifetime(_) | - GenericArgKind::Type(_) | - GenericArgKind::Const(_) => { + val: ty::ConstKind::Param(ref pc), .. + }) => !impl_generics.const_param(pc, self).pure_wrt_drop, + GenericArgKind::Lifetime(_) + | GenericArgKind::Type(_) + | GenericArgKind::Const(_) => { // Not a type, const or region param: this should be reported // as an error. false @@ -639,11 +498,11 @@ impl<'tcx> TyCtxt<'tcx> { /// /// Note that the return value is a late-bound region and hence /// wrapped in a binder. - pub fn closure_env_ty(self, - closure_def_id: DefId, - closure_substs: SubstsRef<'tcx>) - -> Option>> - { + pub fn closure_env_ty( + self, + closure_def_id: DefId, + closure_substs: SubstsRef<'tcx>, + ) -> Option>> { let closure_ty = self.mk_closure(closure_def_id, closure_substs); let env_region = ty::ReLateBound(ty::INNERMOST, ty::BrEnv); let closure_kind_ty = closure_substs.as_closure().kind_ty(closure_def_id, self); @@ -659,15 +518,13 @@ impl<'tcx> TyCtxt<'tcx> { /// Given the `DefId` of some item that has no type or const parameters, make /// a suitable "empty substs" for it. pub fn empty_substs_for_def_id(self, item_def_id: DefId) -> SubstsRef<'tcx> { - InternalSubsts::for_item(self, item_def_id, |param, _| { - match param.kind { - GenericParamDefKind::Lifetime => self.lifetimes.re_erased.into(), - GenericParamDefKind::Type { .. } => { - bug!("empty_substs_for_def_id: {:?} has type parameters", item_def_id) - } - GenericParamDefKind::Const { .. } => { - bug!("empty_substs_for_def_id: {:?} has const parameters", item_def_id) - } + InternalSubsts::for_item(self, item_def_id, |param, _| match param.kind { + GenericParamDefKind::Lifetime => self.lifetimes.re_erased.into(), + GenericParamDefKind::Type { .. } => { + bug!("empty_substs_for_def_id: {:?} has type parameters", item_def_id) + } + GenericParamDefKind::Const { .. } => { + bug!("empty_substs_for_def_id: {:?} has const parameters", item_def_id) } }) } @@ -679,16 +536,13 @@ impl<'tcx> TyCtxt<'tcx> { /// Returns `true` if the node pointed to by `def_id` is a mutable `static` item. pub fn is_mutable_static(&self, def_id: DefId) -> bool { - self.static_mutability(def_id) == Some(hir::Mutability::Mutable) + self.static_mutability(def_id) == Some(hir::Mutability::Mut) } /// Get the type of the pointer to the static that we use in MIR. pub fn static_ptr_ty(&self, def_id: DefId) -> Ty<'tcx> { // Make sure that any constants in the static's type are evaluated. - let static_ty = self.normalize_erasing_regions( - ty::ParamEnv::empty(), - self.type_of(def_id), - ); + let static_ty = self.normalize_erasing_regions(ty::ParamEnv::empty(), self.type_of(def_id)); if self.is_mutable_static(def_id) { self.mk_mut_ptr(static_ty) @@ -775,15 +629,49 @@ impl<'tcx> TyCtxt<'tcx> { tcx: self, }; let expanded_type = visitor.expand_opaque_ty(def_id, substs).unwrap(); - if visitor.found_recursion { - Err(expanded_type) - } else { - Ok(expanded_type) - } + if visitor.found_recursion { Err(expanded_type) } else { Ok(expanded_type) } } } impl<'tcx> ty::TyS<'tcx> { + /// Returns the maximum value for the given numeric type (including `char`s) + /// or returns `None` if the type is not numeric. + pub fn numeric_max_val(&'tcx self, tcx: TyCtxt<'tcx>) -> Option<&'tcx ty::Const<'tcx>> { + let val = match self.kind { + ty::Int(_) | ty::Uint(_) => { + let (size, signed) = int_size_and_signed(tcx, self); + let val = if signed { signed_max(size) as u128 } else { unsigned_max(size) }; + Some(val) + } + ty::Char => Some(std::char::MAX as u128), + ty::Float(fty) => Some(match fty { + ast::FloatTy::F32 => ::rustc_apfloat::ieee::Single::INFINITY.to_bits(), + ast::FloatTy::F64 => ::rustc_apfloat::ieee::Double::INFINITY.to_bits(), + }), + _ => None, + }; + val.map(|v| ty::Const::from_bits(tcx, v, ty::ParamEnv::empty().and(self))) + } + + /// Returns the minimum value for the given numeric type (including `char`s) + /// or returns `None` if the type is not numeric. + pub fn numeric_min_val(&'tcx self, tcx: TyCtxt<'tcx>) -> Option<&'tcx ty::Const<'tcx>> { + let val = match self.kind { + ty::Int(_) | ty::Uint(_) => { + let (size, signed) = int_size_and_signed(tcx, self); + let val = if signed { truncate(signed_min(size) as u128, size) } else { 0 }; + Some(val) + } + ty::Char => Some(0), + ty::Float(fty) => Some(match fty { + ast::FloatTy::F32 => (-::rustc_apfloat::ieee::Single::INFINITY).to_bits(), + ast::FloatTy::F64 => (-::rustc_apfloat::ieee::Double::INFINITY).to_bits(), + }), + _ => None, + }; + val.map(|v| ty::Const::from_bits(tcx, v, ty::ParamEnv::empty().and(self))) + } + /// Checks whether values of this type `T` are *moved* or *copied* /// when referenced -- this amounts to a check for whether `T: /// Copy`, but note that we **don't** consider lifetimes when @@ -856,15 +744,12 @@ impl<'tcx> ty::TyS<'tcx> { /// structural recursion. This check is needed for structs and enums. pub fn is_representable(&'tcx self, tcx: TyCtxt<'tcx>, sp: Span) -> Representability { // Iterate until something non-representable is found - fn fold_repr>(iter: It) -> Representability { - iter.fold(Representability::Representable, |r1, r2| { - match (r1, r2) { - (Representability::SelfRecursive(v1), - Representability::SelfRecursive(v2)) => { - Representability::SelfRecursive(v1.into_iter().chain(v2).collect()) - } - (r1, r2) => cmp::max(r1, r2) + fn fold_repr>(iter: It) -> Representability { + iter.fold(Representability::Representable, |r1, r2| match (r1, r2) { + (Representability::SelfRecursive(v1), Representability::SelfRecursive(v2)) => { + Representability::SelfRecursive(v1.into_iter().chain(v2).collect()) } + (r1, r2) => cmp::max(r1, r2), }) } @@ -879,13 +764,7 @@ impl<'tcx> ty::TyS<'tcx> { Tuple(..) => { // Find non representable fold_repr(ty.tuple_fields().map(|ty| { - is_type_structurally_recursive( - tcx, - sp, - seen, - representable_cache, - ty, - ) + is_type_structurally_recursive(tcx, sp, seen, representable_cache, ty) })) } // Fixed-length vectors. @@ -898,9 +777,13 @@ impl<'tcx> ty::TyS<'tcx> { fold_repr(def.all_fields().map(|field| { let ty = field.ty(tcx, substs); let span = tcx.hir().span_if_local(field.did).unwrap_or(sp); - match is_type_structurally_recursive(tcx, span, seen, - representable_cache, ty) - { + match is_type_structurally_recursive( + tcx, + span, + seen, + representable_cache, + ty, + ) { Representability::SelfRecursive(_) => { Representability::SelfRecursive(vec![span]) } @@ -919,10 +802,8 @@ impl<'tcx> ty::TyS<'tcx> { fn same_struct_or_enum<'tcx>(ty: Ty<'tcx>, def: &'tcx ty::AdtDef) -> bool { match ty.kind { - Adt(ty_def, _) => { - ty_def == def - } - _ => false + Adt(ty_def, _) => ty_def == def, + _ => false, } } @@ -937,13 +818,15 @@ impl<'tcx> ty::TyS<'tcx> { ) -> Representability { debug!("is_type_structurally_recursive: {:?} {:?}", ty, sp); if let Some(representability) = representable_cache.get(ty) { - debug!("is_type_structurally_recursive: {:?} {:?} - (cached) {:?}", - ty, sp, representability); + debug!( + "is_type_structurally_recursive: {:?} {:?} - (cached) {:?}", + ty, sp, representability + ); return representability.clone(); } - let representability = is_type_structurally_recursive_inner( - tcx, sp, seen, representable_cache, ty); + let representability = + is_type_structurally_recursive_inner(tcx, sp, seen, representable_cache, ty); representable_cache.insert(ty, representability.clone()); representability @@ -972,9 +855,7 @@ impl<'tcx> ty::TyS<'tcx> { if let Some(&seen_type) = iter.next() { if same_struct_or_enum(seen_type, def) { - debug!("SelfRecursive: {:?} contains {:?}", - seen_type, - ty); + debug!("SelfRecursive: {:?} contains {:?}", seen_type, ty); return Representability::SelfRecursive(vec![sp]); } } @@ -991,9 +872,7 @@ impl<'tcx> ty::TyS<'tcx> { for &seen_type in iter { if ty::TyS::same_type(ty, seen_type) { - debug!("ContainsRecursive: {:?} contains {:?}", - seen_type, - ty); + debug!("ContainsRecursive: {:?} contains {:?}", seen_type, ty); return Representability::ContainsRecursive; } } @@ -1020,8 +899,7 @@ impl<'tcx> ty::TyS<'tcx> { // of seen types and check recursion for each of them (issues #3008, #3779). let mut seen: Vec> = Vec::new(); let mut representable_cache = FxHashMap::default(); - let r = is_type_structurally_recursive( - tcx, sp, &mut seen, &mut representable_cache, self); + let r = is_type_structurally_recursive(tcx, sp, &mut seen, &mut representable_cache, self); debug!("is_type_representable: {:?} is {:?}", self, r); r } @@ -1045,120 +923,15 @@ impl<'tcx> ty::TyS<'tcx> { } } -fn is_copy_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool { - is_item_raw(tcx, query, lang_items::CopyTraitLangItem) -} - -fn is_sized_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool { - is_item_raw(tcx, query, lang_items::SizedTraitLangItem) - -} - -fn is_freeze_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool { - is_item_raw(tcx, query, lang_items::FreezeTraitLangItem) -} - -fn is_item_raw<'tcx>( - tcx: TyCtxt<'tcx>, - query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>, - item: lang_items::LangItem, -) -> bool { - let (param_env, ty) = query.into_parts(); - let trait_def_id = tcx.require_lang_item(item, None); - tcx.infer_ctxt() - .enter(|infcx| traits::type_known_to_meet_bound_modulo_regions( - &infcx, - param_env, - ty, - trait_def_id, - DUMMY_SP, - )) -} - #[derive(Clone, HashStable)] pub struct NeedsDrop(pub bool); -fn needs_drop_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> NeedsDrop { - let (param_env, ty) = query.into_parts(); - - let needs_drop = |ty: Ty<'tcx>| -> bool { - tcx.needs_drop_raw(param_env.and(ty)).0 - }; - - assert!(!ty.needs_infer()); - - NeedsDrop(match ty.kind { - // Fast-path for primitive types - ty::Infer(ty::FreshIntTy(_)) | ty::Infer(ty::FreshFloatTy(_)) | - ty::Bool | ty::Int(_) | ty::Uint(_) | ty::Float(_) | ty::Never | - ty::FnDef(..) | ty::FnPtr(_) | ty::Char | ty::GeneratorWitness(..) | - ty::RawPtr(_) | ty::Ref(..) | ty::Str => false, - - // Foreign types can never have destructors - ty::Foreign(..) => false, - - // `ManuallyDrop` doesn't have a destructor regardless of field types. - ty::Adt(def, _) if Some(def.did) == tcx.lang_items().manually_drop() => false, - - // Issue #22536: We first query `is_copy_modulo_regions`. It sees a - // normalized version of the type, and therefore will definitely - // know whether the type implements Copy (and thus needs no - // cleanup/drop/zeroing) ... - _ if ty.is_copy_modulo_regions(tcx, param_env, DUMMY_SP) => false, - - // ... (issue #22536 continued) but as an optimization, still use - // prior logic of asking for the structural "may drop". - - // FIXME(#22815): Note that this is a conservative heuristic; - // it may report that the type "may drop" when actual type does - // not actually have a destructor associated with it. But since - // the type absolutely did not have the `Copy` bound attached - // (see above), it is sound to treat it as having a destructor. - - // User destructors are the only way to have concrete drop types. - ty::Adt(def, _) if def.has_dtor(tcx) => true, - - // Can refer to a type which may drop. - // FIXME(eddyb) check this against a ParamEnv. - ty::Dynamic(..) | ty::Projection(..) | ty::Param(_) | ty::Bound(..) | - ty::Placeholder(..) | ty::Opaque(..) | ty::Infer(_) | ty::Error => true, - - ty::UnnormalizedProjection(..) => bug!("only used with chalk-engine"), - - // Zero-length arrays never contain anything to drop. - ty::Array(_, len) if len.try_eval_usize(tcx, param_env) == Some(0) => false, - - // Structural recursion. - ty::Array(ty, _) | ty::Slice(ty) => needs_drop(ty), - - ty::Closure(def_id, ref substs) => { - substs.as_closure().upvar_tys(def_id, tcx).any(needs_drop) - } - - // Pessimistically assume that all generators will require destructors - // as we don't know if a destructor is a noop or not until after the MIR - // state transformation pass - ty::Generator(..) => true, - - ty::Tuple(..) => ty.tuple_fields().any(needs_drop), - - // unions don't have destructors because of the child types, - // only if they manually implement `Drop` (handled above). - ty::Adt(def, _) if def.is_union() => false, - - ty::Adt(def, substs) => - def.variants.iter().any( - |variant| variant.fields.iter().any( - |field| needs_drop(field.ty(tcx, substs)))), - }) -} - pub enum ExplicitSelf<'tcx> { ByValue, ByReference(ty::Region<'tcx>, hir::Mutability), ByRawPointer(hir::Mutability), ByBox, - Other + Other, } impl<'tcx> ExplicitSelf<'tcx> { @@ -1186,37 +959,18 @@ impl<'tcx> ExplicitSelf<'tcx> { /// } /// ``` /// - pub fn determine

( - self_arg_ty: Ty<'tcx>, - is_self_ty: P - ) -> ExplicitSelf<'tcx> + pub fn determine

(self_arg_ty: Ty<'tcx>, is_self_ty: P) -> ExplicitSelf<'tcx> where - P: Fn(Ty<'tcx>) -> bool + P: Fn(Ty<'tcx>) -> bool, { use self::ExplicitSelf::*; match self_arg_ty.kind { _ if is_self_ty(self_arg_ty) => ByValue, - ty::Ref(region, ty, mutbl) if is_self_ty(ty) => { - ByReference(region, mutbl) - } - ty::RawPtr(ty::TypeAndMut { ty, mutbl }) if is_self_ty(ty) => { - ByRawPointer(mutbl) - } - ty::Adt(def, _) if def.is_box() && is_self_ty(self_arg_ty.boxed_ty()) => { - ByBox - } - _ => Other + ty::Ref(region, ty, mutbl) if is_self_ty(ty) => ByReference(region, mutbl), + ty::RawPtr(ty::TypeAndMut { ty, mutbl }) if is_self_ty(ty) => ByRawPointer(mutbl), + ty::Adt(def, _) if def.is_box() && is_self_ty(self_arg_ty.boxed_ty()) => ByBox, + _ => Other, } } } - -pub fn provide(providers: &mut ty::query::Providers<'_>) { - *providers = ty::query::Providers { - is_copy_raw, - is_sized_raw, - is_freeze_raw, - needs_drop_raw, - ..*providers - }; -} diff --git a/src/librustc/ty/walk.rs b/src/librustc/ty/walk.rs index 8d0f9a4716..da08fbcf14 100644 --- a/src/librustc/ty/walk.rs +++ b/src/librustc/ty/walk.rs @@ -16,7 +16,7 @@ pub struct TypeWalker<'tcx> { impl<'tcx> TypeWalker<'tcx> { pub fn new(ty: Ty<'tcx>) -> TypeWalker<'tcx> { - TypeWalker { stack: smallvec![ty], last_subtree: 1, } + TypeWalker { stack: smallvec![ty], last_subtree: 1 } } /// Skips the subtree of types corresponding to the last type @@ -42,9 +42,7 @@ impl<'tcx> Iterator for TypeWalker<'tcx> { fn next(&mut self) -> Option> { debug!("next(): stack={:?}", self.stack); match self.stack.pop() { - None => { - None - } + None => None, Some(ty) => { self.last_subtree = self.stack.len(); push_subtypes(&mut self.stack, ty); @@ -69,12 +67,22 @@ pub fn walk_shallow(ty: Ty<'_>) -> smallvec::IntoIter> { // types as they are written). fn push_subtypes<'tcx>(stack: &mut TypeWalkerStack<'tcx>, parent_ty: Ty<'tcx>) { match parent_ty.kind { - ty::Bool | ty::Char | ty::Int(_) | ty::Uint(_) | ty::Float(_) | - ty::Str | ty::Infer(_) | ty::Param(_) | ty::Never | ty::Error | - ty::Placeholder(..) | ty::Bound(..) | ty::Foreign(..) => { - } + ty::Bool + | ty::Char + | ty::Int(_) + | ty::Uint(_) + | ty::Float(_) + | ty::Str + | ty::Infer(_) + | ty::Param(_) + | ty::Never + | ty::Error + | ty::Placeholder(..) + | ty::Bound(..) + | ty::Foreign(..) => {} ty::Array(ty, len) => { - if let ty::ConstKind::Unevaluated(_, substs) = len.val { + if let ty::ConstKind::Unevaluated(_, substs, promoted) = len.val { + assert!(promoted.is_none()); stack.extend(substs.types().rev()); } stack.push(len.ty); @@ -96,11 +104,12 @@ fn push_subtypes<'tcx>(stack: &mut TypeWalkerStack<'tcx>, parent_ty: Ty<'tcx>) { stack.extend(obj.iter().rev().flat_map(|predicate| { let (substs, opt_ty) = match *predicate.skip_binder() { ty::ExistentialPredicate::Trait(tr) => (tr.substs, None), - ty::ExistentialPredicate::Projection(p) => - (p.substs, Some(p.ty)), + ty::ExistentialPredicate::Projection(p) => (p.substs, Some(p.ty)), ty::ExistentialPredicate::AutoTrait(_) => - // Empty iterator - (ty::InternalSubsts::empty(), None), + // Empty iterator + { + (ty::InternalSubsts::empty(), None) + } }; substs.types().rev().chain(opt_ty) @@ -109,8 +118,7 @@ fn push_subtypes<'tcx>(stack: &mut TypeWalkerStack<'tcx>, parent_ty: Ty<'tcx>) { ty::Adt(_, substs) | ty::Opaque(_, substs) => { stack.extend(substs.types().rev()); } - ty::Closure(_, ref substs) - | ty::Generator(_, ref substs, _) => { + ty::Closure(_, ref substs) | ty::Generator(_, ref substs, _) => { stack.extend(substs.types().rev()); } ty::GeneratorWitness(ts) => { diff --git a/src/librustc/util/bug.rs b/src/librustc/util/bug.rs index 02ddfab6d8..c12b2859f7 100644 --- a/src/librustc/util/bug.rs +++ b/src/librustc/util/bug.rs @@ -1,8 +1,8 @@ // These functions are used by macro expansion for bug! and span_bug! use crate::ty::tls; +use rustc_span::{MultiSpan, Span}; use std::fmt; -use syntax_pos::{Span, MultiSpan}; #[cold] #[inline(never)] diff --git a/src/librustc/util/common.rs b/src/librustc/util/common.rs index 7515d30e46..19b43bfd16 100644 --- a/src/librustc/util/common.rs +++ b/src/librustc/util/common.rs @@ -2,93 +2,13 @@ use rustc_data_structures::sync::Lock; -use std::cell::Cell; use std::fmt::Debug; use std::time::{Duration, Instant}; -use syntax::symbol::{Symbol, sym}; -use crate::session::Session; - #[cfg(test)] mod tests; -// The name of the associated type for `Fn` return types. -pub const FN_OUTPUT_NAME: Symbol = sym::Output; - -pub use errors::ErrorReported; - -thread_local!(static TIME_DEPTH: Cell = Cell::new(0)); - -#[allow(nonstandard_style)] -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct QueryMsg { - pub query: &'static str, - pub msg: Option, -} - -/// Read the current depth of `time()` calls. This is used to -/// encourage indentation across threads. -pub fn time_depth() -> usize { - TIME_DEPTH.with(|slot| slot.get()) -} - -/// Sets the current depth of `time()` calls. The idea is to call -/// `set_time_depth()` with the result from `time_depth()` in the -/// parent thread. -pub fn set_time_depth(depth: usize) { - TIME_DEPTH.with(|slot| slot.set(depth)); -} - -pub fn time(sess: &Session, what: &str, f: F) -> T where - F: FnOnce() -> T, -{ - time_ext(sess.time_passes(), what, f) -} - -pub fn time_ext(do_it: bool, what: &str, f: F) -> T where - F: FnOnce() -> T, -{ - if !do_it { return f(); } - - let old = TIME_DEPTH.with(|slot| { - let r = slot.get(); - slot.set(r + 1); - r - }); - - let start = Instant::now(); - let rv = f(); - let dur = start.elapsed(); - - print_time_passes_entry(true, what, dur); - - TIME_DEPTH.with(|slot| slot.set(old)); - - rv -} - -pub fn print_time_passes_entry(do_it: bool, what: &str, dur: Duration) { - if !do_it { - return - } - - let indentation = TIME_DEPTH.with(|slot| slot.get()); - - let mem_string = match get_resident() { - Some(n) => { - let mb = n as f64 / 1_000_000.0; - format!("; rss: {}MB", mb.round() as usize) - } - None => String::new(), - }; - println!("{}time: {}{}\t{}", - " ".repeat(indentation), - duration_to_secs_str(dur), - mem_string, - what); -} - -pub use rustc_session::utils::duration_to_secs_str; +pub use rustc_errors::ErrorReported; pub fn to_readable_str(mut val: usize) -> String { let mut groups = vec![]; @@ -110,7 +30,8 @@ pub fn to_readable_str(mut val: usize) -> String { groups.join("_") } -pub fn record_time(accu: &Lock, f: F) -> T where +pub fn record_time(accu: &Lock, f: F) -> T +where F: FnOnce() -> T, { let start = Instant::now(); @@ -121,57 +42,8 @@ pub fn record_time(accu: &Lock, f: F) -> T where rv } -// Memory reporting -#[cfg(unix)] -fn get_resident() -> Option { - use std::fs; - - let field = 1; - let contents = fs::read("/proc/self/statm").ok()?; - let contents = String::from_utf8(contents).ok()?; - let s = contents.split_whitespace().nth(field)?; - let npages = s.parse::().ok()?; - Some(npages * 4096) -} - -#[cfg(windows)] -fn get_resident() -> Option { - type BOOL = i32; - type DWORD = u32; - type HANDLE = *mut u8; - use libc::size_t; - use std::mem; - #[repr(C)] - #[allow(non_snake_case)] - struct PROCESS_MEMORY_COUNTERS { - cb: DWORD, - PageFaultCount: DWORD, - PeakWorkingSetSize: size_t, - WorkingSetSize: size_t, - QuotaPeakPagedPoolUsage: size_t, - QuotaPagedPoolUsage: size_t, - QuotaPeakNonPagedPoolUsage: size_t, - QuotaNonPagedPoolUsage: size_t, - PagefileUsage: size_t, - PeakPagefileUsage: size_t, - } - type PPROCESS_MEMORY_COUNTERS = *mut PROCESS_MEMORY_COUNTERS; - #[link(name = "psapi")] - extern "system" { - fn GetCurrentProcess() -> HANDLE; - fn GetProcessMemoryInfo(Process: HANDLE, - ppsmemCounters: PPROCESS_MEMORY_COUNTERS, - cb: DWORD) -> BOOL; - } - let mut pmc: PROCESS_MEMORY_COUNTERS = unsafe { mem::zeroed() }; - pmc.cb = mem::size_of_val(&pmc) as DWORD; - match unsafe { GetProcessMemoryInfo(GetCurrentProcess(), &mut pmc, pmc.cb) } { - 0 => None, - _ => Some(pmc.WorkingSetSize as usize), - } -} - -pub fn indent(op: F) -> R where +pub fn indent(op: F) -> R +where R: Debug, F: FnOnce() -> R, { @@ -188,7 +60,9 @@ pub struct Indenter { } impl Drop for Indenter { - fn drop(&mut self) { debug!("<<"); } + fn drop(&mut self) { + debug!("<<"); + } } pub fn indenter() -> Indenter { diff --git a/src/librustc/util/nodemap.rs b/src/librustc/util/nodemap.rs deleted file mode 100644 index 63c7b76d1b..0000000000 --- a/src/librustc/util/nodemap.rs +++ /dev/null @@ -1,20 +0,0 @@ -//! An efficient hash map for `NodeId`s. - -use crate::hir::def_id::DefId; -use crate::hir::{HirId, ItemLocalId}; -use syntax::ast; - -pub use rustc_data_structures::fx::FxHashMap; -pub use rustc_data_structures::fx::FxHashSet; - -macro_rules! define_id_collections { - ($map_name:ident, $set_name:ident, $key:ty) => { - pub type $map_name = FxHashMap<$key, T>; - pub type $set_name = FxHashSet<$key>; - } -} - -define_id_collections!(NodeMap, NodeSet, ast::NodeId); -define_id_collections!(DefIdMap, DefIdSet, DefId); -define_id_collections!(HirIdMap, HirIdSet, HirId); -define_id_collections!(ItemLocalMap, ItemLocalSet, ItemLocalId); diff --git a/src/librustc_apfloat/ieee.rs b/src/librustc_apfloat/ieee.rs index 4abb86a525..dd56835edb 100644 --- a/src/librustc_apfloat/ieee.rs +++ b/src/librustc_apfloat/ieee.rs @@ -7,7 +7,7 @@ use core::fmt::{self, Write}; use core::marker::PhantomData; use core::mem; use core::ops::Neg; -use smallvec::{SmallVec, smallvec}; +use smallvec::{smallvec, SmallVec}; #[must_use] pub struct IeeeFloat { @@ -42,9 +42,9 @@ fn limbs_for_bits(bits: usize) -> usize { #[derive(Copy, Clone, PartialEq, Eq, Debug)] enum Loss { // Example of truncated bits: - ExactlyZero, // 000000 + ExactlyZero, // 000000 LessThanHalf, // 0xxxxx x's not all zero - ExactlyHalf, // 100000 + ExactlyHalf, // 100000 MoreThanHalf, // 1xxxxx x's not all zero } @@ -264,18 +264,19 @@ impl PartialEq for IeeeFloat { impl PartialOrd for IeeeFloat { fn partial_cmp(&self, rhs: &Self) -> Option { match (self.category, rhs.category) { - (Category::NaN, _) | - (_, Category::NaN) => None, + (Category::NaN, _) | (_, Category::NaN) => None, (Category::Infinity, Category::Infinity) => Some((!self.sign).cmp(&(!rhs.sign))), (Category::Zero, Category::Zero) => Some(Ordering::Equal), - (Category::Infinity, _) | - (Category::Normal, Category::Zero) => Some((!self.sign).cmp(&self.sign)), + (Category::Infinity, _) | (Category::Normal, Category::Zero) => { + Some((!self.sign).cmp(&self.sign)) + } - (_, Category::Infinity) | - (Category::Zero, Category::Normal) => Some(rhs.sign.cmp(&(!rhs.sign))), + (_, Category::Infinity) | (Category::Zero, Category::Normal) => { + Some(rhs.sign.cmp(&(!rhs.sign))) + } (Category::Normal, Category::Normal) => { // Two normal numbers. Do they have the same sign? @@ -615,11 +616,15 @@ impl fmt::Display for IeeeFloat { impl fmt::Debug for IeeeFloat { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}({:?} | {}{:?} * 2^{})", - self, self.category, - if self.sign { "-" } else { "+" }, - self.sig, - self.exp) + write!( + f, + "{}({:?} | {}{:?} * 2^{})", + self, + self.category, + if self.sign { "-" } else { "+" }, + self.sig, + self.exp + ) } } @@ -656,13 +661,11 @@ impl Float for IeeeFloat { fn qnan(payload: Option) -> Self { IeeeFloat { - sig: [ - S::QNAN_SIGNIFICAND | - payload.map_or(0, |payload| { - // Zero out the excess bits of the significand. - payload & ((1 << S::QNAN_BIT) - 1) - }), - ], + sig: [S::QNAN_SIGNIFICAND + | payload.map_or(0, |payload| { + // Zero out the excess bits of the significand. + payload & ((1 << S::QNAN_BIT) - 1) + })], exp: S::MAX_EXP + 1, category: Category::NaN, sign: false, @@ -737,13 +740,11 @@ impl Float for IeeeFloat { } // Sign may depend on rounding mode; handled below. - (_, Category::Zero) | - (Category::NaN, _) | - (Category::Infinity, Category::Normal) => Status::OK, + (_, Category::Zero) | (Category::NaN, _) | (Category::Infinity, Category::Normal) => { + Status::OK + } - (Category::Zero, _) | - (_, Category::NaN) | - (_, Category::Infinity) => { + (Category::Zero, _) | (_, Category::NaN) | (_, Category::Infinity) => { self = rhs; Status::OK } @@ -771,8 +772,8 @@ impl Float for IeeeFloat { // If two numbers add (exactly) to zero, IEEE 754 decrees it is a // positive zero unless rounding to minus infinity, except that // adding two like-signed zeroes gives that zero. - if self.category == Category::Zero && - (rhs.category != Category::Zero || self.sign != rhs.sign) + if self.category == Category::Zero + && (rhs.category != Category::Zero || self.sign != rhs.sign) { self.sign = round == Round::TowardNegative; } @@ -796,17 +797,16 @@ impl Float for IeeeFloat { Status::OK.and(self) } - (Category::Zero, Category::Infinity) | - (Category::Infinity, Category::Zero) => Status::INVALID_OP.and(Self::NAN), + (Category::Zero, Category::Infinity) | (Category::Infinity, Category::Zero) => { + Status::INVALID_OP.and(Self::NAN) + } - (_, Category::Infinity) | - (Category::Infinity, _) => { + (_, Category::Infinity) | (Category::Infinity, _) => { self.category = Category::Infinity; Status::OK.and(self) } - (Category::Zero, _) | - (_, Category::Zero) => { + (Category::Zero, _) | (_, Category::Zero) => { self.category = Category::Zero; Status::OK.and(self) } @@ -814,13 +814,8 @@ impl Float for IeeeFloat { (Category::Normal, Category::Normal) => { self.exp += rhs.exp; let mut wide_sig = [0; 2]; - let loss = sig::mul( - &mut wide_sig, - &mut self.exp, - &self.sig, - &rhs.sig, - S::PRECISION, - ); + let loss = + sig::mul(&mut wide_sig, &mut self.exp, &self.sig, &rhs.sig, S::PRECISION); self.sig = [wide_sig[0]]; let mut status; self = unpack!(status=, self.normalize(round, loss)); @@ -891,11 +886,7 @@ impl Float for IeeeFloat { // Extend the addend significand to ext_precision - 1. This guarantees // that the high bit of the significand is zero (same as wide_sig), // so the addition will overflow (if it does overflow at all) into the top bit. - sig::shift_left( - &mut ext_addend_sig, - &mut 0, - ext_precision - 1 - S::PRECISION, - ); + sig::shift_left(&mut ext_addend_sig, &mut 0, ext_precision - 1 - S::PRECISION); loss = sig::add_or_sub( &mut wide_sig, &mut self.exp, @@ -933,8 +924,9 @@ impl Float for IeeeFloat { // If two numbers add (exactly) to zero, IEEE 754 decrees it is a // positive zero unless rounding to minus infinity, except that // adding two like-signed zeroes gives that zero. - if self.category == Category::Zero && !status.intersects(Status::UNDERFLOW) && - self.sign != addend.sign + if self.category == Category::Zero + && !status.intersects(Status::UNDERFLOW) + && self.sign != addend.sign { self.sign = round == Round::TowardNegative; } @@ -958,11 +950,11 @@ impl Float for IeeeFloat { Status::OK.and(self) } - (Category::Infinity, Category::Infinity) | - (Category::Zero, Category::Zero) => Status::INVALID_OP.and(Self::NAN), + (Category::Infinity, Category::Infinity) | (Category::Zero, Category::Zero) => { + Status::INVALID_OP.and(Self::NAN) + } - (Category::Infinity, _) | - (Category::Zero, _) => Status::OK.and(self), + (Category::Infinity, _) | (Category::Zero, _) => Status::OK.and(self), (Category::Normal, Category::Infinity) => { self.category = Category::Zero; @@ -996,10 +988,10 @@ impl Float for IeeeFloat { fn c_fmod(mut self, rhs: Self) -> StatusAnd { match (self.category, rhs.category) { - (Category::NaN, _) | - (Category::Zero, Category::Infinity) | - (Category::Zero, Category::Normal) | - (Category::Normal, Category::Infinity) => Status::OK.and(self), + (Category::NaN, _) + | (Category::Zero, Category::Infinity) + | (Category::Zero, Category::Normal) + | (Category::Normal, Category::Infinity) => Status::OK.and(self), (_, Category::NaN) => { self.sign = false; @@ -1008,12 +1000,12 @@ impl Float for IeeeFloat { Status::OK.and(self) } - (Category::Infinity, _) | - (_, Category::Zero) => Status::INVALID_OP.and(Self::NAN), + (Category::Infinity, _) | (_, Category::Zero) => Status::INVALID_OP.and(Self::NAN), (Category::Normal, Category::Normal) => { - while self.is_finite_non_zero() && rhs.is_finite_non_zero() && - self.cmp_abs_normal(rhs) != Ordering::Less + while self.is_finite_non_zero() + && rhs.is_finite_non_zero() + && self.cmp_abs_normal(rhs) != Ordering::Less { let mut v = rhs.scalbn(self.ilogb() - rhs.ilogb()); if self.cmp_abs_normal(v) == Ordering::Less { @@ -1113,8 +1105,8 @@ impl Float for IeeeFloat { // 1. exponent != S::MIN_EXP. This implies we are not in the // smallest binade or are dealing with denormals. // 2. Our significand excluding the integral bit is all zeros. - let crossing_binade_boundary = self.exp != S::MIN_EXP && - self.sig[0] & sig_mask == 0; + let crossing_binade_boundary = + self.exp != S::MIN_EXP && self.sig[0] & sig_mask == 0; // Decrement the significand. // @@ -1147,8 +1139,8 @@ impl Float for IeeeFloat { // the integral bit to 1, and increment the exponent. If we have a // denormal always increment since moving denormals and the numbers in the // smallest normal binade have the same exponent in our representation. - let crossing_binade_boundary = !self.is_denormal() && - self.sig[0] & sig_mask == sig_mask; + let crossing_binade_boundary = + !self.is_denormal() && self.sig[0] & sig_mask == sig_mask; if crossing_binade_boundary { self.sig = [0]; @@ -1181,7 +1173,8 @@ impl Float for IeeeFloat { category: Category::Normal, sign: false, marker: PhantomData, - }.normalize(round, Loss::ExactlyZero) + } + .normalize(round, Loss::ExactlyZero) } fn from_str_r(mut s: &str, mut round: Round) -> Result, ParseError> { @@ -1289,8 +1282,8 @@ impl Float for IeeeFloat { let mut loss = Loss::ExactlyZero; if truncated_bits > 0 { loss = Loss::through_truncation(&self.sig, truncated_bits); - if loss != Loss::ExactlyZero && - self.round_away_from_zero(round, loss, truncated_bits) + if loss != Loss::ExactlyZero + && self.round_away_from_zero(round, loss, truncated_bits) { r = r.wrapping_add(1); if r == 0 { @@ -1319,9 +1312,7 @@ impl Float for IeeeFloat { assert!(rhs.is_finite_non_zero()); // If exponents are equal, do an unsigned comparison of the significands. - self.exp.cmp(&rhs.exp).then_with( - || sig::cmp(&self.sig, &rhs.sig), - ) + self.exp.cmp(&rhs.exp).then_with(|| sig::cmp(&self.sig, &rhs.sig)) } fn bitwise_eq(self, rhs: Self) -> bool { @@ -1345,8 +1336,9 @@ impl Float for IeeeFloat { } fn is_denormal(self) -> bool { - self.is_finite_non_zero() && self.exp == S::MIN_EXP && - !sig::get_bit(&self.sig, S::PRECISION - 1) + self.is_finite_non_zero() + && self.exp == S::MIN_EXP + && !sig::get_bit(&self.sig, S::PRECISION - 1) } fn is_signaling(self) -> bool { @@ -1407,8 +1399,7 @@ impl Float for IeeeFloat { let sig_bits = (S::PRECISION - 1) as ExpInt; self.exp += sig_bits; - self = self.normalize(Round::NearestTiesToEven, Loss::ExactlyZero) - .value; + self = self.normalize(Round::NearestTiesToEven, Loss::ExactlyZero).value; self.exp - sig_bits } @@ -1471,9 +1462,10 @@ impl FloatConvert> for IeeeFloat { fn is_x87_double_extended() -> bool { S::QNAN_SIGNIFICAND == X87DoubleExtendedS::QNAN_SIGNIFICAND } - let x87_special_nan = is_x87_double_extended::() && !is_x87_double_extended::() && - r.category == Category::NaN && - (r.sig[0] & S::QNAN_SIGNIFICAND) != S::QNAN_SIGNIFICAND; + let x87_special_nan = is_x87_double_extended::() + && !is_x87_double_extended::() + && r.category == Category::NaN + && (r.sig[0] & S::QNAN_SIGNIFICAND) != S::QNAN_SIGNIFICAND; // If this is a truncation of a denormal number, and the target semantics // has larger exponent range than the source semantics (this can happen @@ -1593,9 +1585,7 @@ impl IeeeFloat { // OMSB is numbered from 1. We want to place it in the integer // bit numbered PRECISION if possible, with a compensating change in // the exponent. - let mut final_exp = self.exp.saturating_add( - omsb as ExpInt - S::PRECISION as ExpInt, - ); + let mut final_exp = self.exp.saturating_add(omsb as ExpInt - S::PRECISION as ExpInt); // If the resulting exponent is too high, overflow according to // the rounding mode. @@ -1910,8 +1900,8 @@ impl IeeeFloat { } else { dec_exp = dec_exp.saturating_sub((last_sig_digit - dot) as i32); } - let significand_digits = last_sig_digit - first_sig_digit + 1 - - (dot > first_sig_digit && dot < last_sig_digit) as usize; + let significand_digits = last_sig_digit - first_sig_digit + 1 + - (dot > first_sig_digit && dot < last_sig_digit) as usize; let normalized_exp = dec_exp.saturating_add(significand_digits as i32 - 1); // Handle the cases where exponents are obviously too large or too @@ -1936,15 +1926,12 @@ impl IeeeFloat { } // Check for MIN_EXP. - if normalized_exp.saturating_add(1).saturating_mul(28738) <= - 8651 * (S::MIN_EXP as i32 - S::PRECISION as i32) + if normalized_exp.saturating_add(1).saturating_mul(28738) + <= 8651 * (S::MIN_EXP as i32 - S::PRECISION as i32) { // Underflow to zero and round. - let r = if round == Round::TowardPositive { - IeeeFloat::SMALLEST - } else { - IeeeFloat::ZERO - }; + let r = + if round == Round::TowardPositive { IeeeFloat::SMALLEST } else { IeeeFloat::ZERO }; return Ok((Status::UNDERFLOW | Status::INEXACT).and(r)); } @@ -2030,13 +2017,8 @@ impl IeeeFloat { if power & 1 != 0 { r_scratch.resize(r.len() + p5.len(), 0); - let _: Loss = sig::mul( - &mut r_scratch, - &mut 0, - &r, - &p5, - (r.len() + p5.len()) * LIMB_BITS, - ); + let _: Loss = + sig::mul(&mut r_scratch, &mut 0, &r, &p5, (r.len() + p5.len()) * LIMB_BITS); while r_scratch.last() == Some(&0) { r_scratch.pop(); } @@ -2168,8 +2150,8 @@ impl IeeeFloat { used_bits = calc_precision.saturating_sub(truncated_bits); } // Extra half-ulp lost in reciprocal of exponent. - half_ulp_err2 = 2 * - (pow5_status != Status::OK || calc_loss != Loss::ExactlyZero) as Limb; + half_ulp_err2 = + 2 * (pow5_status != Status::OK || calc_loss != Loss::ExactlyZero) as Limb; } // Both sig::mul and sig::div return the @@ -2182,9 +2164,7 @@ impl IeeeFloat { // than the returned value. // // See "How to Read Floating Point Numbers Accurately" by William D Clinger. - assert!( - half_ulp_err1 < 2 || half_ulp_err2 < 2 || (half_ulp_err1 + half_ulp_err2 < 8) - ); + assert!(half_ulp_err1 < 2 || half_ulp_err2 < 2 || (half_ulp_err1 + half_ulp_err2 < 8)); let inexact = (calc_loss != Loss::ExactlyZero) as Limb; let half_ulp_err = if half_ulp_err1 + half_ulp_err2 == 0 { @@ -2287,9 +2267,9 @@ impl Loss { /// Implementation details of IeeeFloat significands, such as big integer arithmetic. /// As a rule of thumb, no functions in this module should dynamically allocate. mod sig { + use super::{limbs_for_bits, ExpInt, Limb, Loss, LIMB_BITS}; use core::cmp::Ordering; use core::mem; - use super::{ExpInt, Limb, LIMB_BITS, limbs_for_bits, Loss}; pub(super) fn is_all_zeros(limbs: &[Limb]) -> bool { limbs.iter().all(|&l| l == 0) @@ -2297,14 +2277,20 @@ mod sig { /// One, not zero, based LSB. That is, returns 0 for a zeroed significand. pub(super) fn olsb(limbs: &[Limb]) -> usize { - limbs.iter().enumerate().find(|(_, &limb)| limb != 0).map_or(0, - |(i, limb)| i * LIMB_BITS + limb.trailing_zeros() as usize + 1) + limbs + .iter() + .enumerate() + .find(|(_, &limb)| limb != 0) + .map_or(0, |(i, limb)| i * LIMB_BITS + limb.trailing_zeros() as usize + 1) } /// One, not zero, based MSB. That is, returns 0 for a zeroed significand. pub(super) fn omsb(limbs: &[Limb]) -> usize { - limbs.iter().enumerate().rfind(|(_, &limb)| limb != 0).map_or(0, - |(i, limb)| (i + 1) * LIMB_BITS - limb.leading_zeros() as usize) + limbs + .iter() + .enumerate() + .rfind(|(_, &limb)| limb != 0) + .map_or(0, |(i, limb)| (i + 1) * LIMB_BITS - limb.leading_zeros() as usize) } /// Comparison (unsigned) of two significands. @@ -2444,10 +2430,7 @@ mod sig { if precision <= omsb { extract(dst, src, precision, omsb - precision); - ( - Loss::through_truncation(src, omsb - precision), - omsb as ExpInt - 1, - ) + (Loss::through_truncation(src, omsb - precision), omsb as ExpInt - 1) } else { extract(dst, src, omsb, 0); (Loss::ExactlyZero, precision as ExpInt - 1) @@ -2670,11 +2653,7 @@ mod sig { // caller needs to call IeeeFloat::normalize() if normalized value is // expected. let omsb = omsb(dst); - if omsb <= precision { - Loss::ExactlyZero - } else { - shift_right(dst, exp, omsb - precision) - } + if omsb <= precision { Loss::ExactlyZero } else { shift_right(dst, exp, omsb - precision) } } /// `quotient = dividend / divisor`. Returns the lost fraction. @@ -2686,7 +2665,6 @@ mod sig { divisor: &mut [Limb], precision: usize, ) -> Loss { - // Normalize the divisor. let bits = precision - omsb(divisor); shift_left(divisor, &mut 0, bits); @@ -2712,16 +2690,14 @@ mod sig { } // Helper for figuring out the lost fraction. - let lost_fraction = |dividend: &[Limb], divisor: &[Limb]| { - match cmp(dividend, divisor) { - Ordering::Greater => Loss::MoreThanHalf, - Ordering::Equal => Loss::ExactlyHalf, - Ordering::Less => { - if is_all_zeros(dividend) { - Loss::ExactlyZero - } else { - Loss::LessThanHalf - } + let lost_fraction = |dividend: &[Limb], divisor: &[Limb]| match cmp(dividend, divisor) { + Ordering::Greater => Loss::MoreThanHalf, + Ordering::Equal => Loss::ExactlyHalf, + Ordering::Less => { + if is_all_zeros(dividend) { + Loss::ExactlyZero + } else { + Loss::LessThanHalf } } }; @@ -2751,7 +2727,7 @@ mod sig { return lost_fraction(&[(rem as Limb) << 1], &[divisor as Limb]); } - } + }; } try_short_div!(u32, u16, 16); diff --git a/src/librustc_apfloat/lib.rs b/src/librustc_apfloat/lib.rs index 5efe4fda8c..d08ff60a36 100644 --- a/src/librustc_apfloat/lib.rs +++ b/src/librustc_apfloat/lib.rs @@ -33,7 +33,6 @@ #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")] #![no_std] #![forbid(unsafe_code)] - #![feature(nll)] #[macro_use] @@ -41,8 +40,8 @@ extern crate alloc; use core::cmp::Ordering; use core::fmt; -use core::ops::{Neg, Add, Sub, Mul, Div, Rem}; -use core::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; +use core::ops::{Add, Div, Mul, Neg, Rem, Sub}; +use core::ops::{AddAssign, DivAssign, MulAssign, RemAssign, SubAssign}; use core::str::FromStr; bitflags::bitflags! { @@ -69,19 +68,13 @@ pub struct StatusAnd { impl Status { pub fn and(self, value: T) -> StatusAnd { - StatusAnd { - status: self, - value, - } + StatusAnd { status: self, value } } } impl StatusAnd { pub fn map U, U>(self, f: F) -> StatusAnd { - StatusAnd { - status: self.status, - value: f(self.value), - } + StatusAnd { status: self.status, value: f(self.value) } } } @@ -102,7 +95,7 @@ macro_rules! unpack { value } } - } + }; } /// Category of internally-represented number. @@ -219,8 +212,8 @@ pub struct ParseError(pub &'static str); /// /// New operations: sqrt, nexttoward. /// -pub trait Float - : Copy +pub trait Float: + Copy + Default + FromStr + PartialOrd @@ -235,7 +228,8 @@ pub trait Float + Sub> + Mul> + Div> - + Rem> { + + Rem> +{ /// Total number of bits in the in-memory format. const BITS: usize; @@ -348,11 +342,7 @@ pub trait Float if self.is_negative() { -self } else { self } } fn copy_sign(self, rhs: Self) -> Self { - if self.is_negative() != rhs.is_negative() { - -self - } else { - self - } + if self.is_negative() != rhs.is_negative() { -self } else { self } } // Conversions @@ -409,9 +399,7 @@ pub trait Float } else { // Positive case is simpler, can pretend it's a smaller unsigned // integer, and `to_u128` will take care of all the edge cases. - self.to_u128_r(width - 1, round, is_exact).map( - |r| r as i128, - ) + self.to_u128_r(width - 1, round, is_exact).map(|r| r as i128) } } fn to_i128(self, width: usize) -> StatusAnd { @@ -535,9 +523,7 @@ pub trait Float if !self.is_finite() { return false; } - self.round_to_integral(Round::TowardZero).value.bitwise_eq( - self, - ) + self.round_to_integral(Round::TowardZero).value.bitwise_eq(self) } /// If this value has an exact multiplicative inverse, return it. @@ -586,13 +572,19 @@ pub trait FloatConvert: Float { macro_rules! float_common_impls { ($ty:ident<$t:tt>) => { - impl<$t> Default for $ty<$t> where Self: Float { + impl<$t> Default for $ty<$t> + where + Self: Float, + { fn default() -> Self { Self::ZERO } } - impl<$t> ::core::str::FromStr for $ty<$t> where Self: Float { + impl<$t> ::core::str::FromStr for $ty<$t> + where + Self: Float, + { type Err = ParseError; fn from_str(s: &str) -> Result { Self::from_str_r(s, Round::NearestTiesToEven).map(|x| x.value) @@ -601,71 +593,101 @@ macro_rules! float_common_impls { // Rounding ties to the nearest even, by default. - impl<$t> ::core::ops::Add for $ty<$t> where Self: Float { + impl<$t> ::core::ops::Add for $ty<$t> + where + Self: Float, + { type Output = StatusAnd; fn add(self, rhs: Self) -> StatusAnd { self.add_r(rhs, Round::NearestTiesToEven) } } - impl<$t> ::core::ops::Sub for $ty<$t> where Self: Float { + impl<$t> ::core::ops::Sub for $ty<$t> + where + Self: Float, + { type Output = StatusAnd; fn sub(self, rhs: Self) -> StatusAnd { self.sub_r(rhs, Round::NearestTiesToEven) } } - impl<$t> ::core::ops::Mul for $ty<$t> where Self: Float { + impl<$t> ::core::ops::Mul for $ty<$t> + where + Self: Float, + { type Output = StatusAnd; fn mul(self, rhs: Self) -> StatusAnd { self.mul_r(rhs, Round::NearestTiesToEven) } } - impl<$t> ::core::ops::Div for $ty<$t> where Self: Float { + impl<$t> ::core::ops::Div for $ty<$t> + where + Self: Float, + { type Output = StatusAnd; fn div(self, rhs: Self) -> StatusAnd { self.div_r(rhs, Round::NearestTiesToEven) } } - impl<$t> ::core::ops::Rem for $ty<$t> where Self: Float { + impl<$t> ::core::ops::Rem for $ty<$t> + where + Self: Float, + { type Output = StatusAnd; fn rem(self, rhs: Self) -> StatusAnd { self.c_fmod(rhs) } } - impl<$t> ::core::ops::AddAssign for $ty<$t> where Self: Float { + impl<$t> ::core::ops::AddAssign for $ty<$t> + where + Self: Float, + { fn add_assign(&mut self, rhs: Self) { *self = (*self + rhs).value; } } - impl<$t> ::core::ops::SubAssign for $ty<$t> where Self: Float { + impl<$t> ::core::ops::SubAssign for $ty<$t> + where + Self: Float, + { fn sub_assign(&mut self, rhs: Self) { *self = (*self - rhs).value; } } - impl<$t> ::core::ops::MulAssign for $ty<$t> where Self: Float { + impl<$t> ::core::ops::MulAssign for $ty<$t> + where + Self: Float, + { fn mul_assign(&mut self, rhs: Self) { *self = (*self * rhs).value; } } - impl<$t> ::core::ops::DivAssign for $ty<$t> where Self: Float { + impl<$t> ::core::ops::DivAssign for $ty<$t> + where + Self: Float, + { fn div_assign(&mut self, rhs: Self) { *self = (*self / rhs).value; } } - impl<$t> ::core::ops::RemAssign for $ty<$t> where Self: Float { + impl<$t> ::core::ops::RemAssign for $ty<$t> + where + Self: Float, + { fn rem_assign(&mut self, rhs: Self) { *self = (*self % rhs).value; } } - } + }; } pub mod ieee; diff --git a/src/librustc_apfloat/ppc.rs b/src/librustc_apfloat/ppc.rs index 8e2e390568..e0b306ac47 100644 --- a/src/librustc_apfloat/ppc.rs +++ b/src/librustc_apfloat/ppc.rs @@ -1,5 +1,5 @@ -use crate::{Category, ExpInt, Float, FloatConvert, Round, ParseError, Status, StatusAnd}; use crate::ieee; +use crate::{Category, ExpInt, Float, FloatConvert, ParseError, Round, Status, StatusAnd}; use core::cmp::Ordering; use core::fmt; @@ -165,10 +165,7 @@ where const SMALLEST: Self = DoubleFloat(F::SMALLEST, F::ZERO); fn smallest_normalized() -> Self { - DoubleFloat( - F::smallest_normalized().scalbn(F::PRECISION as ExpInt), - F::ZERO, - ) + DoubleFloat(F::smallest_normalized().scalbn(F::PRECISION as ExpInt), F::ZERO) } // Implement addition, subtraction, multiplication and division based on: @@ -185,13 +182,13 @@ where } } - (_, Category::Zero) | - (Category::NaN, _) | - (Category::Infinity, Category::Normal) => Status::OK.and(self), + (_, Category::Zero) | (Category::NaN, _) | (Category::Infinity, Category::Normal) => { + Status::OK.and(self) + } - (Category::Zero, _) | - (_, Category::NaN) | - (_, Category::Infinity) => Status::OK.and(rhs), + (Category::Zero, _) | (_, Category::NaN) | (_, Category::Infinity) => { + Status::OK.and(rhs) + } (Category::Normal, Category::Normal) => { let mut status = Status::OK; @@ -287,14 +284,13 @@ where (_, Category::NaN) => Status::OK.and(rhs), - (Category::Zero, Category::Infinity) | - (Category::Infinity, Category::Zero) => Status::OK.and(Self::NAN), + (Category::Zero, Category::Infinity) | (Category::Infinity, Category::Zero) => { + Status::OK.and(Self::NAN) + } - (Category::Zero, _) | - (Category::Infinity, _) => Status::OK.and(self), + (Category::Zero, _) | (Category::Infinity, _) => Status::OK.and(self), - (_, Category::Zero) | - (_, Category::Infinity) => Status::OK.and(rhs), + (_, Category::Zero) | (_, Category::Infinity) => Status::OK.and(rhs), (Category::Normal, Category::Normal) => { let mut status = Status::OK; @@ -343,21 +339,15 @@ where } fn div_r(self, rhs: Self, round: Round) -> StatusAnd { - Fallback::from(self).div_r(Fallback::from(rhs), round).map( - Self::from, - ) + Fallback::from(self).div_r(Fallback::from(rhs), round).map(Self::from) } fn c_fmod(self, rhs: Self) -> StatusAnd { - Fallback::from(self).c_fmod(Fallback::from(rhs)).map( - Self::from, - ) + Fallback::from(self).c_fmod(Fallback::from(rhs)).map(Self::from) } fn round_to_integral(self, round: Round) -> StatusAnd { - Fallback::from(self).round_to_integral(round).map( - Self::from, - ) + Fallback::from(self).round_to_integral(round).map(Self::from) } fn next_up(self) -> StatusAnd { @@ -366,10 +356,7 @@ where fn from_bits(input: u128) -> Self { let (a, b) = (input, input >> F::BITS); - DoubleFloat( - F::from_bits(a & ((1 << F::BITS) - 1)), - F::from_bits(b & ((1 << F::BITS) - 1)), - ) + DoubleFloat(F::from_bits(a & ((1 << F::BITS) - 1)), F::from_bits(b & ((1 << F::BITS) - 1))) } fn from_u128_r(input: u128, round: Round) -> StatusAnd { @@ -394,11 +381,9 @@ where if result != Ordering::Equal { let against = self.0.is_negative() ^ self.1.is_negative(); let rhs_against = rhs.0.is_negative() ^ rhs.1.is_negative(); - (!against).cmp(&!rhs_against).then_with(|| if against { - result.reverse() - } else { - result - }) + (!against) + .cmp(&!rhs_against) + .then_with(|| if against { result.reverse() } else { result }) } else { result } @@ -414,8 +399,8 @@ where } fn is_denormal(self) -> bool { - self.category() == Category::Normal && - (self.0.is_denormal() || self.0.is_denormal() || + self.category() == Category::Normal + && (self.0.is_denormal() || self.0.is_denormal() || // (double)(Hi + Lo) == Hi defines a normal number. !(self.0 + self.1).value.bitwise_eq(self.0)) } diff --git a/src/librustc_apfloat/tests/ieee.rs b/src/librustc_apfloat/tests/ieee.rs index 7158efae8f..e5b06cf225 100644 --- a/src/librustc_apfloat/tests/ieee.rs +++ b/src/librustc_apfloat/tests/ieee.rs @@ -1,9 +1,9 @@ // ignore-tidy-filelength +use rustc_apfloat::ieee::{Double, Half, Quad, Single, X87DoubleExtended}; +use rustc_apfloat::unpack; use rustc_apfloat::{Category, ExpInt, IEK_INF, IEK_NAN, IEK_ZERO}; use rustc_apfloat::{Float, FloatConvert, ParseError, Round, Status}; -use rustc_apfloat::ieee::{Half, Single, Double, Quad, X87DoubleExtended}; -use rustc_apfloat::unpack; trait SingleExt { fn from_f32(input: f32) -> Self; @@ -108,18 +108,14 @@ fn next() { // = -(-largest + inc) // = largest - inc. let test = unpack!(status=, Quad::largest().next_down()); - let expected = "0x1.fffffffffffffffffffffffffffep+16383" - .parse::() - .unwrap(); + let expected = "0x1.fffffffffffffffffffffffffffep+16383".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(!test.is_infinite() && !test.is_negative()); assert!(test.bitwise_eq(expected)); // nextUp(-largest) = -largest + inc. let test = unpack!(status=, (-Quad::largest()).next_up()); - let expected = "-0x1.fffffffffffffffffffffffffffep+16383" - .parse::() - .unwrap(); + let expected = "-0x1.fffffffffffffffffffffffffffep+16383".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.bitwise_eq(expected)); @@ -135,9 +131,7 @@ fn next() { .parse::() .unwrap() .next_up()); - let expected = "0x0.0000000000000000000000000002p-16382" - .parse::() - .unwrap(); + let expected = "0x0.0000000000000000000000000002p-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.bitwise_eq(expected)); @@ -166,9 +160,7 @@ fn next() { .parse::() .unwrap() .next_down()); - let expected = "-0x0.0000000000000000000000000002p-16382" - .parse::() - .unwrap(); + let expected = "-0x0.0000000000000000000000000002p-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.bitwise_eq(expected)); @@ -233,9 +225,7 @@ fn next() { .parse::() .unwrap() .next_up()); - let expected = "0x1.0000000000000000000000000000p-16382" - .parse::() - .unwrap(); + let expected = "0x1.0000000000000000000000000000p-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(!test.is_denormal()); assert!(test.bitwise_eq(expected)); @@ -245,9 +235,7 @@ fn next() { .parse::() .unwrap() .next_down()); - let expected = "-0x1.0000000000000000000000000000p-16382" - .parse::() - .unwrap(); + let expected = "-0x1.0000000000000000000000000000p-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(!test.is_denormal()); assert!(test.bitwise_eq(expected)); @@ -257,9 +245,7 @@ fn next() { .parse::() .unwrap() .next_up()); - let expected = "-0x0.ffffffffffffffffffffffffffffp-16382" - .parse::() - .unwrap(); + let expected = "-0x0.ffffffffffffffffffffffffffffp-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.is_denormal()); assert!(test.bitwise_eq(expected)); @@ -269,9 +255,7 @@ fn next() { .parse::() .unwrap() .next_down()); - let expected = "+0x0.ffffffffffffffffffffffffffffp-16382" - .parse::() - .unwrap(); + let expected = "+0x0.ffffffffffffffffffffffffffffp-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.is_denormal()); assert!(test.bitwise_eq(expected)); @@ -284,17 +268,13 @@ fn next() { // nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1. let test = unpack!(status=, "-0x1p+1".parse::().unwrap().next_up()); - let expected = "-0x1.ffffffffffffffffffffffffffffp+0" - .parse::() - .unwrap(); + let expected = "-0x1.ffffffffffffffffffffffffffffp+0".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.bitwise_eq(expected)); // nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1. let test = unpack!(status=, "0x1p+1".parse::().unwrap().next_down()); - let expected = "0x1.ffffffffffffffffffffffffffffp+0" - .parse::() - .unwrap(); + let expected = "0x1.ffffffffffffffffffffffffffffp+0".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.bitwise_eq(expected)); @@ -332,9 +312,7 @@ fn next() { .parse::() .unwrap() .next_up()); - let expected = "-0x0.fffffffffffffffffffffffffffep-16382" - .parse::() - .unwrap(); + let expected = "-0x0.fffffffffffffffffffffffffffep-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.is_denormal()); assert!(test.is_negative()); @@ -345,9 +323,7 @@ fn next() { .parse::() .unwrap() .next_down()); - let expected = "0x0.fffffffffffffffffffffffffffep-16382" - .parse::() - .unwrap(); + let expected = "0x0.fffffffffffffffffffffffffffep-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.is_denormal()); assert!(!test.is_negative()); @@ -358,9 +334,7 @@ fn next() { .parse::() .unwrap() .next_up()); - let expected = "0x1.0000000000000000000000000001p-16382" - .parse::() - .unwrap(); + let expected = "0x1.0000000000000000000000000001p-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(!test.is_denormal()); assert!(!test.is_negative()); @@ -371,9 +345,7 @@ fn next() { .parse::() .unwrap() .next_down()); - let expected = "-0x1.0000000000000000000000000001p-16382" - .parse::() - .unwrap(); + let expected = "-0x1.0000000000000000000000000001p-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(!test.is_denormal()); assert!(test.is_negative()); @@ -390,9 +362,7 @@ fn next() { // nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382 let test = unpack!(status=, "-0x1p-16381".parse::().unwrap().next_up()); - let expected = "-0x1.ffffffffffffffffffffffffffffp-16382" - .parse::() - .unwrap(); + let expected = "-0x1.ffffffffffffffffffffffffffffp-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.bitwise_eq(expected)); @@ -417,9 +387,7 @@ fn next() { // nextDown(0x1p-16381) -> 0x1.ffffffffffffffffffffffffffffp-16382 let test = unpack!(status=, "0x1p-16381".parse::().unwrap().next_down()); - let expected = "0x1.ffffffffffffffffffffffffffffp-16382" - .parse::() - .unwrap(); + let expected = "0x1.ffffffffffffffffffffffffffffp-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.bitwise_eq(expected)); @@ -439,9 +407,7 @@ fn next() { .parse::() .unwrap() .next_up()); - let expected = "0x0.ffffffffffffffffffffffff000dp-16382" - .parse::() - .unwrap(); + let expected = "0x0.ffffffffffffffffffffffff000dp-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.is_denormal()); assert!(!test.is_negative()); @@ -452,9 +418,7 @@ fn next() { .parse::() .unwrap() .next_down()); - let expected = "0x0.ffffffffffffffffffffffff000bp-16382" - .parse::() - .unwrap(); + let expected = "0x0.ffffffffffffffffffffffff000bp-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.is_denormal()); assert!(!test.is_negative()); @@ -465,9 +429,7 @@ fn next() { .parse::() .unwrap() .next_up()); - let expected = "-0x0.ffffffffffffffffffffffff000bp-16382" - .parse::() - .unwrap(); + let expected = "-0x0.ffffffffffffffffffffffff000bp-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.is_denormal()); assert!(test.is_negative()); @@ -478,9 +440,7 @@ fn next() { .parse::() .unwrap() .next_down()); - let expected = "-0x0.ffffffffffffffffffffffff000dp-16382" - .parse::() - .unwrap(); + let expected = "-0x0.ffffffffffffffffffffffff000dp-16382".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(test.is_denormal()); assert!(test.is_negative()); @@ -491,9 +451,7 @@ fn next() { .parse::() .unwrap() .next_up()); - let expected = "0x1.ffffffffffffffffffffffff000dp-16000" - .parse::() - .unwrap(); + let expected = "0x1.ffffffffffffffffffffffff000dp-16000".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(!test.is_denormal()); assert!(!test.is_negative()); @@ -504,9 +462,7 @@ fn next() { .parse::() .unwrap() .next_down()); - let expected = "0x1.ffffffffffffffffffffffff000bp-16000" - .parse::() - .unwrap(); + let expected = "0x1.ffffffffffffffffffffffff000bp-16000".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(!test.is_denormal()); assert!(!test.is_negative()); @@ -517,9 +473,7 @@ fn next() { .parse::() .unwrap() .next_up()); - let expected = "-0x1.ffffffffffffffffffffffff000bp-16000" - .parse::() - .unwrap(); + let expected = "-0x1.ffffffffffffffffffffffff000bp-16000".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(!test.is_denormal()); assert!(test.is_negative()); @@ -530,9 +484,7 @@ fn next() { .parse::() .unwrap() .next_down()); - let expected = "-0x1.ffffffffffffffffffffffff000dp-16000" - .parse::() - .unwrap(); + let expected = "-0x1.ffffffffffffffffffffffff000dp-16000".parse::().unwrap(); assert_eq!(status, Status::OK); assert!(!test.is_denormal()); assert!(test.is_negative()); @@ -668,9 +620,7 @@ fn denormal() { { assert!(!X87DoubleExtended::from_u128(0).value.is_denormal()); - let mut t = "3.36210314311209350626e-4932" - .parse::() - .unwrap(); + let mut t = "3.36210314311209350626e-4932".parse::().unwrap(); assert!(!t.is_denormal()); t /= X87DoubleExtended::from_u128(2).value; @@ -681,9 +631,7 @@ fn denormal() { { assert!(!Quad::from_u128(0).value.is_denormal()); - let mut t = "3.36210314311209350626267781732175260e-4932" - .parse::() - .unwrap(); + let mut t = "3.36210314311209350626267781732175260e-4932".parse::().unwrap(); assert!(!t.is_denormal()); t /= Quad::from_u128(2).value; @@ -707,7 +655,6 @@ fn decimal_strings_without_null_terminators() { assert_eq!(val.to_f64(), 0.00); let val = "0e+3"[..4].parse::().unwrap(); assert_eq!(val.to_f64(), 0.00); - } #[test] @@ -755,7 +702,6 @@ fn from_zero_decimal_single_exponent_string() { assert_eq!(0.0, "+0e-1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0e-1".parse::().unwrap().to_f64()); - assert_eq!(0.0, "0.e1".parse::().unwrap().to_f64()); assert_eq!(0.0, "+0.e1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0.e1".parse::().unwrap().to_f64()); @@ -780,7 +726,6 @@ fn from_zero_decimal_single_exponent_string() { assert_eq!(0.0, "+.0e-1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-.0e-1".parse::().unwrap().to_f64()); - assert_eq!(0.0, "0.0e1".parse::().unwrap().to_f64()); assert_eq!(0.0, "+0.0e1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0.0e1".parse::().unwrap().to_f64()); @@ -793,7 +738,6 @@ fn from_zero_decimal_single_exponent_string() { assert_eq!(0.0, "+0.0e-1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0.0e-1".parse::().unwrap().to_f64()); - assert_eq!(0.0, "000.0000e1".parse::().unwrap().to_f64()); assert_eq!(0.0, "+000.0000e+1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-000.0000e+1".parse::().unwrap().to_f64()); @@ -831,7 +775,6 @@ fn from_zero_hexadecimal_string() { assert_eq!(0.0, "+0x0p-1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0x0p-1".parse::().unwrap().to_f64()); - assert_eq!(0.0, "0x0.p1".parse::().unwrap().to_f64()); assert_eq!(0.0, "+0x0.p1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0x0.p1".parse::().unwrap().to_f64()); @@ -844,7 +787,6 @@ fn from_zero_hexadecimal_string() { assert_eq!(0.0, "+0x0.p-1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0x0.p-1".parse::().unwrap().to_f64()); - assert_eq!(0.0, "0x.0p1".parse::().unwrap().to_f64()); assert_eq!(0.0, "+0x.0p1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0x.0p1".parse::().unwrap().to_f64()); @@ -857,7 +799,6 @@ fn from_zero_hexadecimal_string() { assert_eq!(0.0, "+0x.0p-1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0x.0p-1".parse::().unwrap().to_f64()); - assert_eq!(0.0, "0x0.0p1".parse::().unwrap().to_f64()); assert_eq!(0.0, "+0x0.0p1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0x0.0p1".parse::().unwrap().to_f64()); @@ -870,7 +811,6 @@ fn from_zero_hexadecimal_string() { assert_eq!(0.0, "+0x0.0p-1".parse::().unwrap().to_f64()); assert_eq!(-0.0, "-0x0.0p-1".parse::().unwrap().to_f64()); - assert_eq!(0.0, "0x00000.p1".parse::().unwrap().to_f64()); assert_eq!(0.0, "0x0000.00000p1".parse::().unwrap().to_f64()); assert_eq!(0.0, "0x.00000p1".parse::().unwrap().to_f64()); @@ -907,14 +847,8 @@ fn from_decimal_string() { assert_eq!(2.05e+2, "002.05000e+2".parse::().unwrap().to_f64()); assert_eq!(2.05e-2, "002.05000e-2".parse::().unwrap().to_f64()); assert_eq!(2.05e12, "002.05000e12".parse::().unwrap().to_f64()); - assert_eq!( - 2.05e+12, - "002.05000e+12".parse::().unwrap().to_f64() - ); - assert_eq!( - 2.05e-12, - "002.05000e-12".parse::().unwrap().to_f64() - ); + assert_eq!(2.05e+12, "002.05000e+12".parse::().unwrap().to_f64()); + assert_eq!(2.05e-12, "002.05000e-12".parse::().unwrap().to_f64()); // These are "carefully selected" to overflow the fast log-base // calculations in the implementation. @@ -940,7 +874,6 @@ fn from_hexadecimal_string() { assert_eq!(1.0, "+0x1p-0".parse::().unwrap().to_f64()); assert_eq!(-1.0, "-0x1p-0".parse::().unwrap().to_f64()); - assert_eq!(2.0, "0x1p1".parse::().unwrap().to_f64()); assert_eq!(2.0, "+0x1p1".parse::().unwrap().to_f64()); assert_eq!(-2.0, "-0x1p1".parse::().unwrap().to_f64()); @@ -953,7 +886,6 @@ fn from_hexadecimal_string() { assert_eq!(0.5, "+0x1p-1".parse::().unwrap().to_f64()); assert_eq!(-0.5, "-0x1p-1".parse::().unwrap().to_f64()); - assert_eq!(3.0, "0x1.8p1".parse::().unwrap().to_f64()); assert_eq!(3.0, "+0x1.8p1".parse::().unwrap().to_f64()); assert_eq!(-3.0, "-0x1.8p1".parse::().unwrap().to_f64()); @@ -966,25 +898,17 @@ fn from_hexadecimal_string() { assert_eq!(0.75, "+0x1.8p-1".parse::().unwrap().to_f64()); assert_eq!(-0.75, "-0x1.8p-1".parse::().unwrap().to_f64()); - assert_eq!(8192.0, "0x1000.000p1".parse::().unwrap().to_f64()); assert_eq!(8192.0, "+0x1000.000p1".parse::().unwrap().to_f64()); assert_eq!(-8192.0, "-0x1000.000p1".parse::().unwrap().to_f64()); assert_eq!(8192.0, "0x1000.000p+1".parse::().unwrap().to_f64()); assert_eq!(8192.0, "+0x1000.000p+1".parse::().unwrap().to_f64()); - assert_eq!( - -8192.0, - "-0x1000.000p+1".parse::().unwrap().to_f64() - ); + assert_eq!(-8192.0, "-0x1000.000p+1".parse::().unwrap().to_f64()); assert_eq!(2048.0, "0x1000.000p-1".parse::().unwrap().to_f64()); assert_eq!(2048.0, "+0x1000.000p-1".parse::().unwrap().to_f64()); - assert_eq!( - -2048.0, - "-0x1000.000p-1".parse::().unwrap().to_f64() - ); - + assert_eq!(-2048.0, "-0x1000.000p-1".parse::().unwrap().to_f64()); assert_eq!(8192.0, "0x1000p1".parse::().unwrap().to_f64()); assert_eq!(8192.0, "+0x1000p1".parse::().unwrap().to_f64()); @@ -998,7 +922,6 @@ fn from_hexadecimal_string() { assert_eq!(2048.0, "+0x1000p-1".parse::().unwrap().to_f64()); assert_eq!(-2048.0, "-0x1000p-1".parse::().unwrap().to_f64()); - assert_eq!(16384.0, "0x10p10".parse::().unwrap().to_f64()); assert_eq!(16384.0, "+0x10p10".parse::().unwrap().to_f64()); assert_eq!(-16384.0, "-0x10p10".parse::().unwrap().to_f64()); @@ -1016,17 +939,11 @@ fn from_hexadecimal_string() { assert_eq!( "0x1p-150".parse::().unwrap().to_f64(), - "+0x800000000000000001.p-221" - .parse::() - .unwrap() - .to_f64() + "+0x800000000000000001.p-221".parse::().unwrap().to_f64() ); assert_eq!( 2251799813685248.5, - "0x80000000000004000000.010p-28" - .parse::() - .unwrap() - .to_f64() + "0x80000000000004000000.010p-28".parse::().unwrap().to_f64() ); } @@ -1048,20 +965,11 @@ fn to_string() { assert_eq!("0.0101", to_string(1.01E-2, 5, 2)); assert_eq!("0.0101", to_string(1.01E-2, 4, 2)); assert_eq!("1.01E-2", to_string(1.01E-2, 5, 1)); - assert_eq!( - "0.78539816339744828", - to_string(0.78539816339744830961, 0, 3) - ); - assert_eq!( - "4.9406564584124654E-324", - to_string(4.9406564584124654e-324, 0, 3) - ); + assert_eq!("0.78539816339744828", to_string(0.78539816339744830961, 0, 3)); + assert_eq!("4.9406564584124654E-324", to_string(4.9406564584124654e-324, 0, 3)); assert_eq!("873.18340000000001", to_string(873.1834, 0, 1)); assert_eq!("8.7318340000000001E+2", to_string(873.1834, 0, 0)); - assert_eq!( - "1.7976931348623157E+308", - to_string(1.7976931348623157E+308, 0, 0) - ); + assert_eq!("1.7976931348623157E+308", to_string(1.7976931348623157E+308, 0, 0)); let to_string = |d: f64, precision: usize, width: usize| { let x = Double::from_f64(d); @@ -1079,20 +987,11 @@ fn to_string() { assert_eq!("0.0101", to_string(1.01E-2, 5, 2)); assert_eq!("0.0101", to_string(1.01E-2, 4, 2)); assert_eq!("1.01000e-02", to_string(1.01E-2, 5, 1)); - assert_eq!( - "0.78539816339744828", - to_string(0.78539816339744830961, 0, 3) - ); - assert_eq!( - "4.94065645841246540e-324", - to_string(4.9406564584124654e-324, 0, 3) - ); + assert_eq!("0.78539816339744828", to_string(0.78539816339744830961, 0, 3)); + assert_eq!("4.94065645841246540e-324", to_string(4.9406564584124654e-324, 0, 3)); assert_eq!("873.18340000000001", to_string(873.1834, 0, 1)); assert_eq!("8.73183400000000010e+02", to_string(873.1834, 0, 0)); - assert_eq!( - "1.79769313486231570e+308", - to_string(1.7976931348623157E+308, 0, 0) - ); + assert_eq!("1.79769313486231570e+308", to_string(1.7976931348623157E+308, 0, 0)); } #[test] @@ -1101,71 +1000,43 @@ fn to_integer() { assert_eq!( Status::OK.and(10), - "10".parse::().unwrap().to_u128_r( - 5, - Round::TowardZero, - &mut is_exact, - ) + "10".parse::().unwrap().to_u128_r(5, Round::TowardZero, &mut is_exact,) ); assert!(is_exact); assert_eq!( Status::INVALID_OP.and(0), - "-10".parse::().unwrap().to_u128_r( - 5, - Round::TowardZero, - &mut is_exact, - ) + "-10".parse::().unwrap().to_u128_r(5, Round::TowardZero, &mut is_exact,) ); assert!(!is_exact); assert_eq!( Status::INVALID_OP.and(31), - "32".parse::().unwrap().to_u128_r( - 5, - Round::TowardZero, - &mut is_exact, - ) + "32".parse::().unwrap().to_u128_r(5, Round::TowardZero, &mut is_exact,) ); assert!(!is_exact); assert_eq!( Status::INEXACT.and(7), - "7.9".parse::().unwrap().to_u128_r( - 5, - Round::TowardZero, - &mut is_exact, - ) + "7.9".parse::().unwrap().to_u128_r(5, Round::TowardZero, &mut is_exact,) ); assert!(!is_exact); assert_eq!( Status::OK.and(-10), - "-10".parse::().unwrap().to_i128_r( - 5, - Round::TowardZero, - &mut is_exact, - ) + "-10".parse::().unwrap().to_i128_r(5, Round::TowardZero, &mut is_exact,) ); assert!(is_exact); assert_eq!( Status::INVALID_OP.and(-16), - "-17".parse::().unwrap().to_i128_r( - 5, - Round::TowardZero, - &mut is_exact, - ) + "-17".parse::().unwrap().to_i128_r(5, Round::TowardZero, &mut is_exact,) ); assert!(!is_exact); assert_eq!( Status::INVALID_OP.and(15), - "16".parse::().unwrap().to_i128_r( - 5, - Round::TowardZero, - &mut is_exact, - ) + "16".parse::().unwrap().to_i128_r(5, Round::TowardZero, &mut is_exact,) ); assert!(!is_exact); } @@ -1173,16 +1044,8 @@ fn to_integer() { #[test] fn nan() { fn nanbits(signaling: bool, negative: bool, fill: u128) -> u128 { - let x = if signaling { - T::snan(Some(fill)) - } else { - T::qnan(Some(fill)) - }; - if negative { - (-x).to_bits() - } else { - x.to_bits() - } + let x = if signaling { T::snan(Some(fill)) } else { T::qnan(Some(fill)) }; + if negative { (-x).to_bits() } else { x.to_bits() } } assert_eq!(0x7fc00000, nanbits::(false, false, 0)); @@ -1197,241 +1060,85 @@ fn nan() { assert_eq!(0x7ff8000000000000, nanbits::(false, false, 0)); assert_eq!(0xfff8000000000000, nanbits::(false, true, 0)); assert_eq!(0x7ff800000000ae72, nanbits::(false, false, 0xae72)); - assert_eq!( - 0x7fffffffffffae72, - nanbits::(false, false, 0xffffffffffffae72) - ); + assert_eq!(0x7fffffffffffae72, nanbits::(false, false, 0xffffffffffffae72)); assert_eq!(0x7ff4000000000000, nanbits::(true, false, 0)); assert_eq!(0xfff4000000000000, nanbits::(true, true, 0)); assert_eq!(0x7ff000000000ae72, nanbits::(true, false, 0xae72)); - assert_eq!( - 0x7ff7ffffffffae72, - nanbits::(true, false, 0xffffffffffffae72) - ); + assert_eq!(0x7ff7ffffffffae72, nanbits::(true, false, 0xffffffffffffae72)); } #[test] fn string_decimal_death() { - assert_eq!( - "".parse::(), - Err(ParseError("Invalid string length")) - ); - assert_eq!( - "+".parse::(), - Err(ParseError("String has no digits")) - ); - assert_eq!( - "-".parse::(), - Err(ParseError("String has no digits")) - ); - - assert_eq!( - "\0".parse::(), - Err(ParseError("Invalid character in significand")) - ); - assert_eq!( - "1\0".parse::(), - Err(ParseError("Invalid character in significand")) - ); - assert_eq!( - "1\02".parse::(), - Err(ParseError("Invalid character in significand")) - ); - assert_eq!( - "1\02e1".parse::(), - Err(ParseError("Invalid character in significand")) - ); - assert_eq!( - "1e\0".parse::(), - Err(ParseError("Invalid character in exponent")) - ); - assert_eq!( - "1e1\0".parse::(), - Err(ParseError("Invalid character in exponent")) - ); - assert_eq!( - "1e1\02".parse::(), - Err(ParseError("Invalid character in exponent")) - ); - - assert_eq!( - "1.0f".parse::(), - Err(ParseError("Invalid character in significand")) - ); - - assert_eq!( - "..".parse::(), - Err(ParseError("String contains multiple dots")) - ); - assert_eq!( - "..0".parse::(), - Err(ParseError("String contains multiple dots")) - ); - assert_eq!( - "1.0.0".parse::(), - Err(ParseError("String contains multiple dots")) - ); + assert_eq!("".parse::(), Err(ParseError("Invalid string length"))); + assert_eq!("+".parse::(), Err(ParseError("String has no digits"))); + assert_eq!("-".parse::(), Err(ParseError("String has no digits"))); + + assert_eq!("\0".parse::(), Err(ParseError("Invalid character in significand"))); + assert_eq!("1\0".parse::(), Err(ParseError("Invalid character in significand"))); + assert_eq!("1\02".parse::(), Err(ParseError("Invalid character in significand"))); + assert_eq!("1\02e1".parse::(), Err(ParseError("Invalid character in significand"))); + assert_eq!("1e\0".parse::(), Err(ParseError("Invalid character in exponent"))); + assert_eq!("1e1\0".parse::(), Err(ParseError("Invalid character in exponent"))); + assert_eq!("1e1\02".parse::(), Err(ParseError("Invalid character in exponent"))); + + assert_eq!("1.0f".parse::(), Err(ParseError("Invalid character in significand"))); + + assert_eq!("..".parse::(), Err(ParseError("String contains multiple dots"))); + assert_eq!("..0".parse::(), Err(ParseError("String contains multiple dots"))); + assert_eq!("1.0.0".parse::(), Err(ParseError("String contains multiple dots"))); } #[test] fn string_decimal_significand_death() { - assert_eq!( - ".".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+.".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-.".parse::(), - Err(ParseError("Significand has no digits")) - ); - - - assert_eq!( - "e".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+e".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-e".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!(".".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+.".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-.".parse::(), Err(ParseError("Significand has no digits"))); - assert_eq!( - "e1".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+e1".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-e1".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!("e".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+e".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-e".parse::(), Err(ParseError("Significand has no digits"))); - assert_eq!( - ".e1".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+.e1".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-.e1".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!("e1".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+e1".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-e1".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!(".e1".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+.e1".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-.e1".parse::(), Err(ParseError("Significand has no digits"))); - assert_eq!( - ".e".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+.e".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-.e".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!(".e".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+.e".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-.e".parse::(), Err(ParseError("Significand has no digits"))); } #[test] fn string_decimal_exponent_death() { - assert_eq!( - "1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - - assert_eq!( - "1.e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+1.e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-1.e".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("1e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+1e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-1e".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - ".1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+.1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-.1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("1.e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+1.e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-1.e".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "1.1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+1.1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-1.1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!(".1e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+.1e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-.1e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("1.1e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+1.1e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-1.1e".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "1e+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "1e-".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("1e+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("1e-".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - ".1e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - ".1e+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - ".1e-".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!(".1e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!(".1e+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!(".1e-".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "1.0e".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "1.0e+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "1.0e-".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("1.0e".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("1.0e+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("1.0e-".parse::(), Err(ParseError("Exponent has no digits"))); } #[test] @@ -1440,378 +1147,124 @@ fn string_hexadecimal_death() { assert_eq!("+0x".parse::(), Err(ParseError("Invalid string"))); assert_eq!("-0x".parse::(), Err(ParseError("Invalid string"))); - assert_eq!( - "0x0".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); - assert_eq!( - "+0x0".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); - assert_eq!( - "-0x0".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); + assert_eq!("0x0".parse::(), Err(ParseError("Hex strings require an exponent"))); + assert_eq!("+0x0".parse::(), Err(ParseError("Hex strings require an exponent"))); + assert_eq!("-0x0".parse::(), Err(ParseError("Hex strings require an exponent"))); - assert_eq!( - "0x0.".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); - assert_eq!( - "+0x0.".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); - assert_eq!( - "-0x0.".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); + assert_eq!("0x0.".parse::(), Err(ParseError("Hex strings require an exponent"))); + assert_eq!("+0x0.".parse::(), Err(ParseError("Hex strings require an exponent"))); + assert_eq!("-0x0.".parse::(), Err(ParseError("Hex strings require an exponent"))); - assert_eq!( - "0x.0".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); - assert_eq!( - "+0x.0".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); - assert_eq!( - "-0x.0".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); + assert_eq!("0x.0".parse::(), Err(ParseError("Hex strings require an exponent"))); + assert_eq!("+0x.0".parse::(), Err(ParseError("Hex strings require an exponent"))); + assert_eq!("-0x.0".parse::(), Err(ParseError("Hex strings require an exponent"))); - assert_eq!( - "0x0.0".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); - assert_eq!( - "+0x0.0".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); - assert_eq!( - "-0x0.0".parse::(), - Err(ParseError("Hex strings require an exponent")) - ); + assert_eq!("0x0.0".parse::(), Err(ParseError("Hex strings require an exponent"))); + assert_eq!("+0x0.0".parse::(), Err(ParseError("Hex strings require an exponent"))); + assert_eq!("-0x0.0".parse::(), Err(ParseError("Hex strings require an exponent"))); - assert_eq!( - "0x\0".parse::(), - Err(ParseError("Invalid character in significand")) - ); - assert_eq!( - "0x1\0".parse::(), - Err(ParseError("Invalid character in significand")) - ); - assert_eq!( - "0x1\02".parse::(), - Err(ParseError("Invalid character in significand")) - ); - assert_eq!( - "0x1\02p1".parse::(), - Err(ParseError("Invalid character in significand")) - ); - assert_eq!( - "0x1p\0".parse::(), - Err(ParseError("Invalid character in exponent")) - ); - assert_eq!( - "0x1p1\0".parse::(), - Err(ParseError("Invalid character in exponent")) - ); - assert_eq!( - "0x1p1\02".parse::(), - Err(ParseError("Invalid character in exponent")) - ); + assert_eq!("0x\0".parse::(), Err(ParseError("Invalid character in significand"))); + assert_eq!("0x1\0".parse::(), Err(ParseError("Invalid character in significand"))); + assert_eq!("0x1\02".parse::(), Err(ParseError("Invalid character in significand"))); + assert_eq!("0x1\02p1".parse::(), Err(ParseError("Invalid character in significand"))); + assert_eq!("0x1p\0".parse::(), Err(ParseError("Invalid character in exponent"))); + assert_eq!("0x1p1\0".parse::(), Err(ParseError("Invalid character in exponent"))); + assert_eq!("0x1p1\02".parse::(), Err(ParseError("Invalid character in exponent"))); - assert_eq!( - "0x1p0f".parse::(), - Err(ParseError("Invalid character in exponent")) - ); + assert_eq!("0x1p0f".parse::(), Err(ParseError("Invalid character in exponent"))); - assert_eq!( - "0x..p1".parse::(), - Err(ParseError("String contains multiple dots")) - ); - assert_eq!( - "0x..0p1".parse::(), - Err(ParseError("String contains multiple dots")) - ); - assert_eq!( - "0x1.0.0p1".parse::(), - Err(ParseError("String contains multiple dots")) - ); + assert_eq!("0x..p1".parse::(), Err(ParseError("String contains multiple dots"))); + assert_eq!("0x..0p1".parse::(), Err(ParseError("String contains multiple dots"))); + assert_eq!("0x1.0.0p1".parse::(), Err(ParseError("String contains multiple dots"))); } #[test] fn string_hexadecimal_significand_death() { - assert_eq!( - "0x.".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+0x.".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-0x.".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!("0x.".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+0x.".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-0x.".parse::(), Err(ParseError("Significand has no digits"))); - assert_eq!( - "0xp".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+0xp".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-0xp".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!("0xp".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+0xp".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-0xp".parse::(), Err(ParseError("Significand has no digits"))); - assert_eq!( - "0xp+".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+0xp+".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-0xp+".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!("0xp+".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+0xp+".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-0xp+".parse::(), Err(ParseError("Significand has no digits"))); - assert_eq!( - "0xp-".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+0xp-".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-0xp-".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!("0xp-".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+0xp-".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-0xp-".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("0x.p".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+0x.p".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-0x.p".parse::(), Err(ParseError("Significand has no digits"))); - assert_eq!( - "0x.p".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+0x.p".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-0x.p".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!("0x.p+".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+0x.p+".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-0x.p+".parse::(), Err(ParseError("Significand has no digits"))); - assert_eq!( - "0x.p+".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+0x.p+".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-0x.p+".parse::(), - Err(ParseError("Significand has no digits")) - ); - - assert_eq!( - "0x.p-".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "+0x.p-".parse::(), - Err(ParseError("Significand has no digits")) - ); - assert_eq!( - "-0x.p-".parse::(), - Err(ParseError("Significand has no digits")) - ); + assert_eq!("0x.p-".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("+0x.p-".parse::(), Err(ParseError("Significand has no digits"))); + assert_eq!("-0x.p-".parse::(), Err(ParseError("Significand has no digits"))); } #[test] fn string_hexadecimal_exponent_death() { - assert_eq!( - "0x1p".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x1p".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x1p".parse::(), - Err(ParseError("Exponent has no digits")) - ); - - assert_eq!( - "0x1p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x1p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x1p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - - assert_eq!( - "0x1p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x1p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x1p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); - + assert_eq!("0x1p".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x1p".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x1p".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "0x1.p".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x1.p".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x1.p".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("0x1p+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x1p+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x1p+".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "0x1.p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x1.p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x1.p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("0x1p-".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x1p-".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x1p-".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "0x1.p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x1.p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x1.p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("0x1.p".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x1.p".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x1.p".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("0x1.p+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x1.p+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x1.p+".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "0x.1p".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x.1p".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x.1p".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("0x1.p-".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x1.p-".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x1.p-".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "0x.1p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x.1p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x.1p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("0x.1p".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x.1p".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x.1p".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "0x.1p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x.1p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x.1p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("0x.1p+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x.1p+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x.1p+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("0x.1p-".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x.1p-".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x.1p-".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "0x1.1p".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x1.1p".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x1.1p".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("0x1.1p".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x1.1p".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x1.1p".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "0x1.1p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x1.1p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x1.1p+".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("0x1.1p+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x1.1p+".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x1.1p+".parse::(), Err(ParseError("Exponent has no digits"))); - assert_eq!( - "0x1.1p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "+0x1.1p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); - assert_eq!( - "-0x1.1p-".parse::(), - Err(ParseError("Exponent has no digits")) - ); + assert_eq!("0x1.1p-".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("+0x1.1p-".parse::(), Err(ParseError("Exponent has no digits"))); + assert_eq!("-0x1.1p-".parse::(), Err(ParseError("Exponent has no digits"))); } #[test] fn exact_inverse() { // Trivial operation. - assert!( - Double::from_f64(2.0) - .get_exact_inverse() - .unwrap() - .bitwise_eq(Double::from_f64(0.5)) - ); - assert!( - Single::from_f32(2.0) - .get_exact_inverse() - .unwrap() - .bitwise_eq(Single::from_f32(0.5)) - ); + assert!(Double::from_f64(2.0).get_exact_inverse().unwrap().bitwise_eq(Double::from_f64(0.5))); + assert!(Single::from_f32(2.0).get_exact_inverse().unwrap().bitwise_eq(Single::from_f32(0.5))); assert!( "2.0" .parse::() @@ -1842,62 +1295,28 @@ fn exact_inverse() { // Zero assert!(Double::from_f64(0.0).get_exact_inverse().is_none()); // Denormalized float - assert!( - Single::from_f32(1.40129846e-45) - .get_exact_inverse() - .is_none() - ); + assert!(Single::from_f32(1.40129846e-45).get_exact_inverse().is_none()); } #[test] fn round_to_integral() { let t = Double::from_f64(-0.5); assert_eq!(-0.0, t.round_to_integral(Round::TowardZero).value.to_f64()); - assert_eq!( - -1.0, - t.round_to_integral(Round::TowardNegative).value.to_f64() - ); - assert_eq!( - -0.0, - t.round_to_integral(Round::TowardPositive).value.to_f64() - ); - assert_eq!( - -0.0, - t.round_to_integral(Round::NearestTiesToEven).value.to_f64() - ); + assert_eq!(-1.0, t.round_to_integral(Round::TowardNegative).value.to_f64()); + assert_eq!(-0.0, t.round_to_integral(Round::TowardPositive).value.to_f64()); + assert_eq!(-0.0, t.round_to_integral(Round::NearestTiesToEven).value.to_f64()); let s = Double::from_f64(3.14); assert_eq!(3.0, s.round_to_integral(Round::TowardZero).value.to_f64()); - assert_eq!( - 3.0, - s.round_to_integral(Round::TowardNegative).value.to_f64() - ); - assert_eq!( - 4.0, - s.round_to_integral(Round::TowardPositive).value.to_f64() - ); - assert_eq!( - 3.0, - s.round_to_integral(Round::NearestTiesToEven).value.to_f64() - ); + assert_eq!(3.0, s.round_to_integral(Round::TowardNegative).value.to_f64()); + assert_eq!(4.0, s.round_to_integral(Round::TowardPositive).value.to_f64()); + assert_eq!(3.0, s.round_to_integral(Round::NearestTiesToEven).value.to_f64()); let r = Double::largest(); - assert_eq!( - r.to_f64(), - r.round_to_integral(Round::TowardZero).value.to_f64() - ); - assert_eq!( - r.to_f64(), - r.round_to_integral(Round::TowardNegative).value.to_f64() - ); - assert_eq!( - r.to_f64(), - r.round_to_integral(Round::TowardPositive).value.to_f64() - ); - assert_eq!( - r.to_f64(), - r.round_to_integral(Round::NearestTiesToEven).value.to_f64() - ); + assert_eq!(r.to_f64(), r.round_to_integral(Round::TowardZero).value.to_f64()); + assert_eq!(r.to_f64(), r.round_to_integral(Round::TowardNegative).value.to_f64()); + assert_eq!(r.to_f64(), r.round_to_integral(Round::TowardPositive).value.to_f64()); + assert_eq!(r.to_f64(), r.round_to_integral(Round::NearestTiesToEven).value.to_f64()); let p = Double::ZERO.round_to_integral(Round::TowardZero).value; assert_eq!(0.0, p.to_f64()); @@ -1907,9 +1326,7 @@ fn round_to_integral() { assert!(p.to_f64().is_nan()); let p = Double::INFINITY.round_to_integral(Round::TowardZero).value; assert!(p.to_f64().is_infinite() && p.to_f64() > 0.0); - let p = (-Double::INFINITY) - .round_to_integral(Round::TowardZero) - .value; + let p = (-Double::INFINITY).round_to_integral(Round::TowardZero).value; assert!(p.to_f64().is_infinite() && p.to_f64() < 0.0); } @@ -1952,18 +1369,14 @@ fn smallest() { assert!(test.bitwise_eq(expected)); let test = Quad::SMALLEST; - let expected = "0x0.0000000000000000000000000001p-16382" - .parse::() - .unwrap(); + let expected = "0x0.0000000000000000000000000001p-16382".parse::().unwrap(); assert!(!test.is_negative()); assert!(test.is_finite_non_zero()); assert!(test.is_denormal()); assert!(test.bitwise_eq(expected)); let test = -Quad::SMALLEST; - let expected = "-0x0.0000000000000000000000000001p-16382" - .parse::() - .unwrap(); + let expected = "-0x0.0000000000000000000000000001p-16382".parse::().unwrap(); assert!(test.is_negative()); assert!(test.is_finite_non_zero()); assert!(test.is_denormal()); @@ -2034,26 +1447,22 @@ fn zero() { #[test] fn copy_sign() { - assert!(Double::from_f64(-42.0).bitwise_eq( - Double::from_f64(42.0).copy_sign( - Double::from_f64(-1.0), - ), - )); - assert!(Double::from_f64(42.0).bitwise_eq( - Double::from_f64(-42.0).copy_sign( - Double::from_f64(1.0), - ), - )); - assert!(Double::from_f64(-42.0).bitwise_eq( - Double::from_f64(-42.0).copy_sign( - Double::from_f64(-1.0), - ), - )); - assert!(Double::from_f64(42.0).bitwise_eq( - Double::from_f64(42.0).copy_sign( - Double::from_f64(1.0), - ), - )); + assert!( + Double::from_f64(-42.0) + .bitwise_eq(Double::from_f64(42.0).copy_sign(Double::from_f64(-1.0),),) + ); + assert!( + Double::from_f64(42.0) + .bitwise_eq(Double::from_f64(-42.0).copy_sign(Double::from_f64(1.0),),) + ); + assert!( + Double::from_f64(-42.0) + .bitwise_eq(Double::from_f64(-42.0).copy_sign(Double::from_f64(-1.0),),) + ); + assert!( + Double::from_f64(42.0) + .bitwise_eq(Double::from_f64(42.0).copy_sign(Double::from_f64(1.0),),) + ); } #[test] @@ -2232,535 +1641,474 @@ fn add() { (p_inf, m_zero, "inf", Status::OK, Category::Infinity), (p_inf, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_inf, snan, "nan", Status::INVALID_OP, Category::NaN), - */ + // See Note 1. + (p_inf, snan, "nan", Status::INVALID_OP, Category::NaN), + */ (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity), (p_inf, m_normal_value, "inf", Status::OK, Category::Infinity), - ( - p_inf, - p_largest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_largest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_smallest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_smallest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_smallest_normalized, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_smallest_normalized, - "inf", - Status::OK, - Category::Infinity, - ), + (p_inf, p_largest_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_largest_value, "inf", Status::OK, Category::Infinity), + (p_inf, p_smallest_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_smallest_value, "inf", Status::OK, Category::Infinity), + (p_inf, p_smallest_normalized, "inf", Status::OK, Category::Infinity), + (p_inf, m_smallest_normalized, "inf", Status::OK, Category::Infinity), (m_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN), (m_inf, m_inf, "-inf", Status::OK, Category::Infinity), (m_inf, p_zero, "-inf", Status::OK, Category::Infinity), (m_inf, m_zero, "-inf", Status::OK, Category::Infinity), (m_inf, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(m_inf, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_inf, - p_normal_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_normal_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_largest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_largest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_smallest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_smallest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_smallest_normalized, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_smallest_normalized, - "-inf", - Status::OK, - Category::Infinity, - ), + // See Note 1. + (m_inf, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_inf, p_normal_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_normal_value, "-inf", Status::OK, Category::Infinity), + (m_inf, p_largest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_largest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, p_smallest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_smallest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, p_smallest_normalized, "-inf", Status::OK, Category::Infinity), + (m_inf, m_smallest_normalized, "-inf", Status::OK, Category::Infinity), (p_zero, p_inf, "inf", Status::OK, Category::Infinity), (p_zero, m_inf, "-inf", Status::OK, Category::Infinity), (p_zero, p_zero, "0x0p+0", Status::OK, Category::Zero), (p_zero, m_zero, "0x0p+0", Status::OK, Category::Zero), (p_zero, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_zero, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_zero, - p_normal_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_zero, - m_normal_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_zero, - p_largest_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_zero, - m_largest_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_zero, - p_smallest_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_zero, - m_smallest_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_zero, - p_smallest_normalized, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_zero, - m_smallest_normalized, - "-0x1p-126", - Status::OK, - Category::Normal, - ), + // See Note 1. + (p_zero, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_zero, p_normal_value, "0x1p+0", Status::OK, Category::Normal), + (p_zero, m_normal_value, "-0x1p+0", Status::OK, Category::Normal), + (p_zero, p_largest_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (p_zero, m_largest_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (p_zero, p_smallest_value, "0x1p-149", Status::OK, Category::Normal), + (p_zero, m_smallest_value, "-0x1p-149", Status::OK, Category::Normal), + (p_zero, p_smallest_normalized, "0x1p-126", Status::OK, Category::Normal), + (p_zero, m_smallest_normalized, "-0x1p-126", Status::OK, Category::Normal), (m_zero, p_inf, "inf", Status::OK, Category::Infinity), (m_zero, m_inf, "-inf", Status::OK, Category::Infinity), (m_zero, p_zero, "0x0p+0", Status::OK, Category::Zero), (m_zero, m_zero, "-0x0p+0", Status::OK, Category::Zero), (m_zero, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(m_zero, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_zero, - p_normal_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_zero, - m_normal_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_zero, - p_largest_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_zero, - m_largest_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_zero, - p_smallest_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_zero, - m_smallest_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_zero, - p_smallest_normalized, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_zero, - m_smallest_normalized, - "-0x1p-126", - Status::OK, - Category::Normal, - ), + // See Note 1. + (m_zero, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_zero, p_normal_value, "0x1p+0", Status::OK, Category::Normal), + (m_zero, m_normal_value, "-0x1p+0", Status::OK, Category::Normal), + (m_zero, p_largest_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (m_zero, m_largest_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (m_zero, p_smallest_value, "0x1p-149", Status::OK, Category::Normal), + (m_zero, m_smallest_value, "-0x1p-149", Status::OK, Category::Normal), + (m_zero, p_smallest_normalized, "0x1p-126", Status::OK, Category::Normal), + (m_zero, m_smallest_normalized, "-0x1p-126", Status::OK, Category::Normal), (qnan, p_inf, "nan", Status::OK, Category::NaN), (qnan, m_inf, "nan", Status::OK, Category::NaN), (qnan, p_zero, "nan", Status::OK, Category::NaN), (qnan, m_zero, "nan", Status::OK, Category::NaN), (qnan, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(qnan, snan, "nan", Status::INVALID_OP, Category::NaN), - */ + // See Note 1. + (qnan, snan, "nan", Status::INVALID_OP, Category::NaN), + */ (qnan, p_normal_value, "nan", Status::OK, Category::NaN), (qnan, m_normal_value, "nan", Status::OK, Category::NaN), (qnan, p_largest_value, "nan", Status::OK, Category::NaN), (qnan, m_largest_value, "nan", Status::OK, Category::NaN), (qnan, p_smallest_value, "nan", Status::OK, Category::NaN), (qnan, m_smallest_value, "nan", Status::OK, Category::NaN), - ( - qnan, - p_smallest_normalized, - "nan", - Status::OK, - Category::NaN, - ), - ( - qnan, - m_smallest_normalized, - "nan", - Status::OK, - Category::NaN, - ), + (qnan, p_smallest_normalized, "nan", Status::OK, Category::NaN), + (qnan, m_smallest_normalized, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(snan, p_inf, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_inf, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_zero, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_zero, "nan", Status::INVALID_OP, Category::NaN), -(snan, qnan, "nan", Status::INVALID_OP, Category::NaN), -(snan, snan, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), - */ + // See Note 1. + (snan, p_inf, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_inf, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_zero, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_zero, "nan", Status::INVALID_OP, Category::NaN), + (snan, qnan, "nan", Status::INVALID_OP, Category::NaN), + (snan, snan, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), + */ (p_normal_value, p_inf, "inf", Status::OK, Category::Infinity), - ( - p_normal_value, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_normal_value, - p_zero, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - m_zero, - "0x1p+0", - Status::OK, - Category::Normal, - ), + (p_normal_value, m_inf, "-inf", Status::OK, Category::Infinity), + (p_normal_value, p_zero, "0x1p+0", Status::OK, Category::Normal), + (p_normal_value, m_zero, "0x1p+0", Status::OK, Category::Normal), (p_normal_value, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ + // See Note 1. + (p_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_normal_value, p_normal_value, "0x1p+1", Status::OK, Category::Normal), + (p_normal_value, m_normal_value, "0x0p+0", Status::OK, Category::Zero), + (p_normal_value, p_largest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_normal_value, m_largest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_normal_value, p_smallest_value, "0x1p+0", Status::INEXACT, Category::Normal), + (p_normal_value, m_smallest_value, "0x1p+0", Status::INEXACT, Category::Normal), + (p_normal_value, p_smallest_normalized, "0x1p+0", Status::INEXACT, Category::Normal), + (p_normal_value, m_smallest_normalized, "0x1p+0", Status::INEXACT, Category::Normal), + (m_normal_value, p_inf, "inf", Status::OK, Category::Infinity), + (m_normal_value, m_inf, "-inf", Status::OK, Category::Infinity), + (m_normal_value, p_zero, "-0x1p+0", Status::OK, Category::Normal), + (m_normal_value, m_zero, "-0x1p+0", Status::OK, Category::Normal), + (m_normal_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_normal_value, p_normal_value, "0x0p+0", Status::OK, Category::Zero), + (m_normal_value, m_normal_value, "-0x1p+1", Status::OK, Category::Normal), + (m_normal_value, p_largest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_normal_value, m_largest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_normal_value, p_smallest_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (m_normal_value, m_smallest_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (m_normal_value, p_smallest_normalized, "-0x1p+0", Status::INEXACT, Category::Normal), + (m_normal_value, m_smallest_normalized, "-0x1p+0", Status::INEXACT, Category::Normal), + (p_largest_value, p_inf, "inf", Status::OK, Category::Infinity), + (p_largest_value, m_inf, "-inf", Status::OK, Category::Infinity), + (p_largest_value, p_zero, "0x1.fffffep+127", Status::OK, Category::Normal), + (p_largest_value, m_zero, "0x1.fffffep+127", Status::OK, Category::Normal), + (p_largest_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_largest_value, p_normal_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_largest_value, m_normal_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_largest_value, p_largest_value, "inf", overflow_status, Category::Infinity), + (p_largest_value, m_largest_value, "0x0p+0", Status::OK, Category::Zero), + (p_largest_value, p_smallest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_largest_value, m_smallest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), ( - p_normal_value, - p_normal_value, - "0x1p+1", - Status::OK, + p_largest_value, + p_smallest_normalized, + "0x1.fffffep+127", + Status::INEXACT, Category::Normal, ), ( - p_normal_value, - m_normal_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_normal_value, p_largest_value, + m_smallest_normalized, "0x1.fffffep+127", Status::INEXACT, Category::Normal, ), + (m_largest_value, p_inf, "inf", Status::OK, Category::Infinity), + (m_largest_value, m_inf, "-inf", Status::OK, Category::Infinity), + (m_largest_value, p_zero, "-0x1.fffffep+127", Status::OK, Category::Normal), + (m_largest_value, m_zero, "-0x1.fffffep+127", Status::OK, Category::Normal), + (m_largest_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_largest_value, p_normal_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_largest_value, m_normal_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_largest_value, p_largest_value, "0x0p+0", Status::OK, Category::Zero), + (m_largest_value, m_largest_value, "-inf", overflow_status, Category::Infinity), + (m_largest_value, p_smallest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_largest_value, m_smallest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), ( - p_normal_value, m_largest_value, + p_smallest_normalized, "-0x1.fffffep+127", Status::INEXACT, Category::Normal, ), ( - p_normal_value, - p_smallest_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_normal_value, - m_smallest_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_normal_value, - p_smallest_normalized, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_normal_value, + m_largest_value, m_smallest_normalized, - "0x1p+0", + "-0x1.fffffep+127", Status::INEXACT, Category::Normal, ), - (m_normal_value, p_inf, "inf", Status::OK, Category::Infinity), - ( - m_normal_value, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_normal_value, - p_zero, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - m_zero, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - (m_normal_value, qnan, "nan", Status::OK, Category::NaN), + (p_smallest_value, p_inf, "inf", Status::OK, Category::Infinity), + (p_smallest_value, m_inf, "-inf", Status::OK, Category::Infinity), + (p_smallest_value, p_zero, "0x1p-149", Status::OK, Category::Normal), + (p_smallest_value, m_zero, "0x1p-149", Status::OK, Category::Normal), + (p_smallest_value, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(m_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_normal_value, - p_normal_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_normal_value, - m_normal_value, - "-0x1p+1", - Status::OK, - Category::Normal, - ), + // See Note 1. + (p_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_smallest_value, p_normal_value, "0x1p+0", Status::INEXACT, Category::Normal), + (p_smallest_value, m_normal_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (p_smallest_value, p_largest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_smallest_value, m_largest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_smallest_value, p_smallest_value, "0x1p-148", Status::OK, Category::Normal), + (p_smallest_value, m_smallest_value, "0x0p+0", Status::OK, Category::Zero), + (p_smallest_value, p_smallest_normalized, "0x1.000002p-126", Status::OK, Category::Normal), + (p_smallest_value, m_smallest_normalized, "-0x1.fffffcp-127", Status::OK, Category::Normal), + (m_smallest_value, p_inf, "inf", Status::OK, Category::Infinity), + (m_smallest_value, m_inf, "-inf", Status::OK, Category::Infinity), + (m_smallest_value, p_zero, "-0x1p-149", Status::OK, Category::Normal), + (m_smallest_value, m_zero, "-0x1p-149", Status::OK, Category::Normal), + (m_smallest_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_smallest_value, p_normal_value, "0x1p+0", Status::INEXACT, Category::Normal), + (m_smallest_value, m_normal_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (m_smallest_value, p_largest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_smallest_value, m_largest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_smallest_value, p_smallest_value, "0x0p+0", Status::OK, Category::Zero), + (m_smallest_value, m_smallest_value, "-0x1p-148", Status::OK, Category::Normal), + (m_smallest_value, p_smallest_normalized, "0x1.fffffcp-127", Status::OK, Category::Normal), + (m_smallest_value, m_smallest_normalized, "-0x1.000002p-126", Status::OK, Category::Normal), + (p_smallest_normalized, p_inf, "inf", Status::OK, Category::Infinity), + (p_smallest_normalized, m_inf, "-inf", Status::OK, Category::Infinity), + (p_smallest_normalized, p_zero, "0x1p-126", Status::OK, Category::Normal), + (p_smallest_normalized, m_zero, "0x1p-126", Status::OK, Category::Normal), + (p_smallest_normalized, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_smallest_normalized, p_normal_value, "0x1p+0", Status::INEXACT, Category::Normal), + (p_smallest_normalized, m_normal_value, "-0x1p+0", Status::INEXACT, Category::Normal), ( - m_normal_value, + p_smallest_normalized, p_largest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal, ), ( - m_normal_value, + p_smallest_normalized, m_largest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal, ), - ( - m_normal_value, - p_smallest_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_normal_value, - m_smallest_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_normal_value, - p_smallest_normalized, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_normal_value, - m_smallest_normalized, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_largest_value, - p_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_largest_value, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_largest_value, - p_zero, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - m_zero, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - (p_largest_value, qnan, "nan", Status::OK, Category::NaN), + (p_smallest_normalized, p_smallest_value, "0x1.000002p-126", Status::OK, Category::Normal), + (p_smallest_normalized, m_smallest_value, "0x1.fffffcp-127", Status::OK, Category::Normal), + (p_smallest_normalized, p_smallest_normalized, "0x1p-125", Status::OK, Category::Normal), + (p_smallest_normalized, m_smallest_normalized, "0x0p+0", Status::OK, Category::Zero), + (m_smallest_normalized, p_inf, "inf", Status::OK, Category::Infinity), + (m_smallest_normalized, m_inf, "-inf", Status::OK, Category::Infinity), + (m_smallest_normalized, p_zero, "-0x1p-126", Status::OK, Category::Normal), + (m_smallest_normalized, m_zero, "-0x1p-126", Status::OK, Category::Normal), + (m_smallest_normalized, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_largest_value, - p_normal_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), + // See Note 1. + (m_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_smallest_normalized, p_normal_value, "0x1p+0", Status::INEXACT, Category::Normal), + (m_smallest_normalized, m_normal_value, "-0x1p+0", Status::INEXACT, Category::Normal), ( + m_smallest_normalized, p_largest_value, - m_normal_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal, ), ( - p_largest_value, - p_largest_value, - "inf", - overflow_status, - Category::Infinity, - ), - ( - p_largest_value, + m_smallest_normalized, m_largest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_largest_value, - p_smallest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_largest_value, - m_smallest_value, - "0x1.fffffep+127", + "-0x1.fffffep+127", Status::INEXACT, Category::Normal, ), + (m_smallest_normalized, p_smallest_value, "-0x1.fffffcp-127", Status::OK, Category::Normal), + (m_smallest_normalized, m_smallest_value, "-0x1.000002p-126", Status::OK, Category::Normal), + (m_smallest_normalized, p_smallest_normalized, "0x0p+0", Status::OK, Category::Zero), + (m_smallest_normalized, m_smallest_normalized, "-0x1p-125", Status::OK, Category::Normal), + ]; + + for &(x, y, e_result, e_status, e_category) in &special_cases[..] { + let status; + let result = unpack!(status=, x + y); + assert_eq!(status, e_status); + assert_eq!(result.category(), e_category); + assert!(result.bitwise_eq(e_result.parse::().unwrap())); + } +} + +#[test] +fn subtract() { + // Test Special Cases against each other and normal values. + + // FIXMES/NOTES: + // 1. Since we perform only default exception handling all operations with + // signaling NaNs should have a result that is a quiet NaN. Currently they + // return sNaN. + + let p_inf = Single::INFINITY; + let m_inf = -Single::INFINITY; + let p_zero = Single::ZERO; + let m_zero = -Single::ZERO; + let qnan = Single::NAN; + let p_normal_value = "0x1p+0".parse::().unwrap(); + let m_normal_value = "-0x1p+0".parse::().unwrap(); + let p_largest_value = Single::largest(); + let m_largest_value = -Single::largest(); + let p_smallest_value = Single::SMALLEST; + let m_smallest_value = -Single::SMALLEST; + let p_smallest_normalized = Single::smallest_normalized(); + let m_smallest_normalized = -Single::smallest_normalized(); + + let overflow_status = Status::OVERFLOW | Status::INEXACT; + + let special_cases = [ + (p_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN), + (p_inf, m_inf, "inf", Status::OK, Category::Infinity), + (p_inf, p_zero, "inf", Status::OK, Category::Infinity), + (p_inf, m_zero, "inf", Status::OK, Category::Infinity), + (p_inf, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_inf, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_normal_value, "inf", Status::OK, Category::Infinity), + (p_inf, p_largest_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_largest_value, "inf", Status::OK, Category::Infinity), + (p_inf, p_smallest_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_smallest_value, "inf", Status::OK, Category::Infinity), + (p_inf, p_smallest_normalized, "inf", Status::OK, Category::Infinity), + (p_inf, m_smallest_normalized, "inf", Status::OK, Category::Infinity), + (m_inf, p_inf, "-inf", Status::OK, Category::Infinity), + (m_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN), + (m_inf, p_zero, "-inf", Status::OK, Category::Infinity), + (m_inf, m_zero, "-inf", Status::OK, Category::Infinity), + (m_inf, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_inf, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (m_inf, p_normal_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_normal_value, "-inf", Status::OK, Category::Infinity), + (m_inf, p_largest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_largest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, p_smallest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_smallest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, p_smallest_normalized, "-inf", Status::OK, Category::Infinity), + (m_inf, m_smallest_normalized, "-inf", Status::OK, Category::Infinity), + (p_zero, p_inf, "-inf", Status::OK, Category::Infinity), + (p_zero, m_inf, "inf", Status::OK, Category::Infinity), + (p_zero, p_zero, "0x0p+0", Status::OK, Category::Zero), + (p_zero, m_zero, "0x0p+0", Status::OK, Category::Zero), + (p_zero, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_zero, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (p_zero, p_normal_value, "-0x1p+0", Status::OK, Category::Normal), + (p_zero, m_normal_value, "0x1p+0", Status::OK, Category::Normal), + (p_zero, p_largest_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (p_zero, m_largest_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (p_zero, p_smallest_value, "-0x1p-149", Status::OK, Category::Normal), + (p_zero, m_smallest_value, "0x1p-149", Status::OK, Category::Normal), + (p_zero, p_smallest_normalized, "-0x1p-126", Status::OK, Category::Normal), + (p_zero, m_smallest_normalized, "0x1p-126", Status::OK, Category::Normal), + (m_zero, p_inf, "-inf", Status::OK, Category::Infinity), + (m_zero, m_inf, "inf", Status::OK, Category::Infinity), + (m_zero, p_zero, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_zero, "0x0p+0", Status::OK, Category::Zero), + (m_zero, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_zero, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (m_zero, p_normal_value, "-0x1p+0", Status::OK, Category::Normal), + (m_zero, m_normal_value, "0x1p+0", Status::OK, Category::Normal), + (m_zero, p_largest_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (m_zero, m_largest_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (m_zero, p_smallest_value, "-0x1p-149", Status::OK, Category::Normal), + (m_zero, m_smallest_value, "0x1p-149", Status::OK, Category::Normal), + (m_zero, p_smallest_normalized, "-0x1p-126", Status::OK, Category::Normal), + (m_zero, m_smallest_normalized, "0x1p-126", Status::OK, Category::Normal), + (qnan, p_inf, "nan", Status::OK, Category::NaN), + (qnan, m_inf, "nan", Status::OK, Category::NaN), + (qnan, p_zero, "nan", Status::OK, Category::NaN), + (qnan, m_zero, "nan", Status::OK, Category::NaN), + (qnan, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (qnan, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (qnan, p_normal_value, "nan", Status::OK, Category::NaN), + (qnan, m_normal_value, "nan", Status::OK, Category::NaN), + (qnan, p_largest_value, "nan", Status::OK, Category::NaN), + (qnan, m_largest_value, "nan", Status::OK, Category::NaN), + (qnan, p_smallest_value, "nan", Status::OK, Category::NaN), + (qnan, m_smallest_value, "nan", Status::OK, Category::NaN), + (qnan, p_smallest_normalized, "nan", Status::OK, Category::NaN), + (qnan, m_smallest_normalized, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (snan, p_inf, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_inf, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_zero, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_zero, "nan", Status::INVALID_OP, Category::NaN), + (snan, qnan, "nan", Status::INVALID_OP, Category::NaN), + (snan, snan, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_normal_value, p_inf, "-inf", Status::OK, Category::Infinity), + (p_normal_value, m_inf, "inf", Status::OK, Category::Infinity), + (p_normal_value, p_zero, "0x1p+0", Status::OK, Category::Normal), + (p_normal_value, m_zero, "0x1p+0", Status::OK, Category::Normal), + (p_normal_value, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_normal_value, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (p_normal_value, p_normal_value, "0x0p+0", Status::OK, Category::Zero), + (p_normal_value, m_normal_value, "0x1p+1", Status::OK, Category::Normal), + (p_normal_value, p_largest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_normal_value, m_largest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_normal_value, p_smallest_value, "0x1p+0", Status::INEXACT, Category::Normal), + (p_normal_value, m_smallest_value, "0x1p+0", Status::INEXACT, Category::Normal), + (p_normal_value, p_smallest_normalized, "0x1p+0", Status::INEXACT, Category::Normal), + (p_normal_value, m_smallest_normalized, "0x1p+0", Status::INEXACT, Category::Normal), + (m_normal_value, p_inf, "-inf", Status::OK, Category::Infinity), + (m_normal_value, m_inf, "inf", Status::OK, Category::Infinity), + (m_normal_value, p_zero, "-0x1p+0", Status::OK, Category::Normal), + (m_normal_value, m_zero, "-0x1p+0", Status::OK, Category::Normal), + (m_normal_value, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_normal_value, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (m_normal_value, p_normal_value, "-0x1p+1", Status::OK, Category::Normal), + (m_normal_value, m_normal_value, "0x0p+0", Status::OK, Category::Zero), + (m_normal_value, p_largest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_normal_value, m_largest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_normal_value, p_smallest_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (m_normal_value, m_smallest_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (m_normal_value, p_smallest_normalized, "-0x1p+0", Status::INEXACT, Category::Normal), + (m_normal_value, m_smallest_normalized, "-0x1p+0", Status::INEXACT, Category::Normal), + (p_largest_value, p_inf, "-inf", Status::OK, Category::Infinity), + (p_largest_value, m_inf, "inf", Status::OK, Category::Infinity), + (p_largest_value, p_zero, "0x1.fffffep+127", Status::OK, Category::Normal), + (p_largest_value, m_zero, "0x1.fffffep+127", Status::OK, Category::Normal), + (p_largest_value, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_largest_value, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (p_largest_value, p_normal_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_largest_value, m_normal_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_largest_value, p_largest_value, "0x0p+0", Status::OK, Category::Zero), + (p_largest_value, m_largest_value, "inf", overflow_status, Category::Infinity), + (p_largest_value, p_smallest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_largest_value, m_smallest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), ( p_largest_value, p_smallest_normalized, @@ -2775,468 +2123,132 @@ fn add() { Status::INEXACT, Category::Normal, ), - ( - m_largest_value, - p_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_largest_value, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_largest_value, - p_zero, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - m_zero, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - (m_largest_value, qnan, "nan", Status::OK, Category::NaN), + (m_largest_value, p_inf, "-inf", Status::OK, Category::Infinity), + (m_largest_value, m_inf, "inf", Status::OK, Category::Infinity), + (m_largest_value, p_zero, "-0x1.fffffep+127", Status::OK, Category::Normal), + (m_largest_value, m_zero, "-0x1.fffffep+127", Status::OK, Category::Normal), + (m_largest_value, qnan, "-nan", Status::OK, Category::NaN), /* -// See Note 1. -(m_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ + // See Note 1. + (m_largest_value, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (m_largest_value, p_normal_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_largest_value, m_normal_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_largest_value, p_largest_value, "-inf", overflow_status, Category::Infinity), + (m_largest_value, m_largest_value, "0x0p+0", Status::OK, Category::Zero), + (m_largest_value, p_smallest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_largest_value, m_smallest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), ( m_largest_value, - p_normal_value, + p_smallest_normalized, "-0x1.fffffep+127", Status::INEXACT, Category::Normal, ), ( m_largest_value, - m_normal_value, + m_smallest_normalized, "-0x1.fffffep+127", Status::INEXACT, Category::Normal, ), + (p_smallest_value, p_inf, "-inf", Status::OK, Category::Infinity), + (p_smallest_value, m_inf, "inf", Status::OK, Category::Infinity), + (p_smallest_value, p_zero, "0x1p-149", Status::OK, Category::Normal), + (p_smallest_value, m_zero, "0x1p-149", Status::OK, Category::Normal), + (p_smallest_value, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_smallest_value, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (p_smallest_value, p_normal_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (p_smallest_value, m_normal_value, "0x1p+0", Status::INEXACT, Category::Normal), + (p_smallest_value, p_largest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_smallest_value, m_largest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (p_smallest_value, p_smallest_value, "0x0p+0", Status::OK, Category::Zero), + (p_smallest_value, m_smallest_value, "0x1p-148", Status::OK, Category::Normal), + (p_smallest_value, p_smallest_normalized, "-0x1.fffffcp-127", Status::OK, Category::Normal), + (p_smallest_value, m_smallest_normalized, "0x1.000002p-126", Status::OK, Category::Normal), + (m_smallest_value, p_inf, "-inf", Status::OK, Category::Infinity), + (m_smallest_value, m_inf, "inf", Status::OK, Category::Infinity), + (m_smallest_value, p_zero, "-0x1p-149", Status::OK, Category::Normal), + (m_smallest_value, m_zero, "-0x1p-149", Status::OK, Category::Normal), + (m_smallest_value, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_smallest_value, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (m_smallest_value, p_normal_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (m_smallest_value, m_normal_value, "0x1p+0", Status::INEXACT, Category::Normal), + (m_smallest_value, p_largest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_smallest_value, m_largest_value, "0x1.fffffep+127", Status::INEXACT, Category::Normal), + (m_smallest_value, p_smallest_value, "-0x1p-148", Status::OK, Category::Normal), + (m_smallest_value, m_smallest_value, "0x0p+0", Status::OK, Category::Zero), + (m_smallest_value, p_smallest_normalized, "-0x1.000002p-126", Status::OK, Category::Normal), + (m_smallest_value, m_smallest_normalized, "0x1.fffffcp-127", Status::OK, Category::Normal), + (p_smallest_normalized, p_inf, "-inf", Status::OK, Category::Infinity), + (p_smallest_normalized, m_inf, "inf", Status::OK, Category::Infinity), + (p_smallest_normalized, p_zero, "0x1p-126", Status::OK, Category::Normal), + (p_smallest_normalized, m_zero, "0x1p-126", Status::OK, Category::Normal), + (p_smallest_normalized, qnan, "-nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_smallest_normalized, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (p_smallest_normalized, p_normal_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (p_smallest_normalized, m_normal_value, "0x1p+0", Status::INEXACT, Category::Normal), ( - m_largest_value, + p_smallest_normalized, p_largest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_largest_value, - m_largest_value, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - m_largest_value, - p_smallest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_largest_value, - m_smallest_value, "-0x1.fffffep+127", Status::INEXACT, Category::Normal, ), ( - m_largest_value, p_smallest_normalized, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( m_largest_value, - m_smallest_normalized, - "-0x1.fffffep+127", + "0x1.fffffep+127", Status::INEXACT, Category::Normal, ), - ( - p_smallest_value, - p_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_value, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_value, - p_zero, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_zero, - "0x1p-149", - Status::OK, - Category::Normal, - ), - (p_smallest_value, qnan, "nan", Status::OK, Category::NaN), + (p_smallest_normalized, p_smallest_value, "0x1.fffffcp-127", Status::OK, Category::Normal), + (p_smallest_normalized, m_smallest_value, "0x1.000002p-126", Status::OK, Category::Normal), + (p_smallest_normalized, p_smallest_normalized, "0x0p+0", Status::OK, Category::Zero), + (p_smallest_normalized, m_smallest_normalized, "0x1p-125", Status::OK, Category::Normal), + (m_smallest_normalized, p_inf, "-inf", Status::OK, Category::Infinity), + (m_smallest_normalized, m_inf, "inf", Status::OK, Category::Infinity), + (m_smallest_normalized, p_zero, "-0x1p-126", Status::OK, Category::Normal), + (m_smallest_normalized, m_zero, "-0x1p-126", Status::OK, Category::Normal), + (m_smallest_normalized, qnan, "-nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_smallest_value, - p_normal_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_value, - m_normal_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), + // See Note 1. + (m_smallest_normalized, snan, "-nan", Status::INVALID_OP, Category::NaN), + */ + (m_smallest_normalized, p_normal_value, "-0x1p+0", Status::INEXACT, Category::Normal), + (m_smallest_normalized, m_normal_value, "0x1p+0", Status::INEXACT, Category::Normal), ( - p_smallest_value, + m_smallest_normalized, p_largest_value, - "0x1.fffffep+127", + "-0x1.fffffep+127", Status::INEXACT, Category::Normal, ), ( - p_smallest_value, + m_smallest_normalized, m_largest_value, - "-0x1.fffffep+127", + "0x1.fffffep+127", Status::INEXACT, Category::Normal, ), - ( - p_smallest_value, - p_smallest_value, - "0x1p-148", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_smallest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_value, - p_smallest_normalized, - "0x1.000002p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_smallest_normalized, - "-0x1.fffffcp-127", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - p_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_value, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_value, - p_zero, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_zero, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - (m_smallest_value, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_smallest_value, - p_normal_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_value, - m_normal_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_value, - p_largest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_value, - m_largest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_value, - p_smallest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_value, - m_smallest_value, - "-0x1p-148", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - p_smallest_normalized, - "0x1.fffffcp-127", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_smallest_normalized, - "-0x1.000002p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - p_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_normalized, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_normalized, - p_zero, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_zero, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - qnan, - "nan", - Status::OK, - Category::NaN, - ), - /* -// See Note 1. -(p_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_smallest_normalized, - p_normal_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_normalized, - m_normal_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_normalized, - p_largest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_normalized, - m_largest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_normalized, - p_smallest_value, - "0x1.000002p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_smallest_value, - "0x1.fffffcp-127", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - p_smallest_normalized, - "0x1p-125", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_smallest_normalized, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_normalized, - p_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_normalized, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_normalized, - p_zero, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_zero, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - qnan, - "nan", - Status::OK, - Category::NaN, - ), - /* -// See Note 1. -(m_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_smallest_normalized, - p_normal_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_normalized, - m_normal_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_normalized, - p_largest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_normalized, - m_largest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_normalized, - p_smallest_value, - "-0x1.fffffcp-127", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_smallest_value, - "-0x1.000002p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - p_smallest_normalized, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_normalized, - m_smallest_normalized, - "-0x1p-125", - Status::OK, - Category::Normal, - ), + (m_smallest_normalized, p_smallest_value, "-0x1.000002p-126", Status::OK, Category::Normal), + (m_smallest_normalized, m_smallest_value, "-0x1.fffffcp-127", Status::OK, Category::Normal), + (m_smallest_normalized, p_smallest_normalized, "-0x1p-125", Status::OK, Category::Normal), + (m_smallest_normalized, m_smallest_normalized, "0x0p+0", Status::OK, Category::Zero), ]; for &(x, y, e_result, e_status, e_category) in &special_cases[..] { let status; - let result = unpack!(status=, x + y); + let result = unpack!(status=, x - y); assert_eq!(status, e_status); assert_eq!(result.category(), e_category); assert!(result.bitwise_eq(e_result.parse::().unwrap())); @@ -3244,7 +2256,7 @@ fn add() { } #[test] -fn subtract() { +fn multiply() { // Test Special Cases against each other and normal values. // FIXMES/NOTES: @@ -3267,3042 +2279,523 @@ fn subtract() { let m_smallest_normalized = -Single::smallest_normalized(); let overflow_status = Status::OVERFLOW | Status::INEXACT; + let underflow_status = Status::UNDERFLOW | Status::INEXACT; let special_cases = [ - (p_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN), - (p_inf, m_inf, "inf", Status::OK, Category::Infinity), - (p_inf, p_zero, "inf", Status::OK, Category::Infinity), - (p_inf, m_zero, "inf", Status::OK, Category::Infinity), - (p_inf, qnan, "-nan", Status::OK, Category::NaN), + (p_inf, p_inf, "inf", Status::OK, Category::Infinity), + (p_inf, m_inf, "-inf", Status::OK, Category::Infinity), + (p_inf, p_zero, "nan", Status::INVALID_OP, Category::NaN), + (p_inf, m_zero, "nan", Status::INVALID_OP, Category::NaN), + (p_inf, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_inf, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ + // See Note 1. + (p_inf, snan, "nan", Status::INVALID_OP, Category::NaN), + */ (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity), - (p_inf, m_normal_value, "inf", Status::OK, Category::Infinity), - ( - p_inf, - p_largest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_largest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_smallest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_smallest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_smallest_normalized, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_smallest_normalized, - "inf", - Status::OK, - Category::Infinity, - ), + (p_inf, m_normal_value, "-inf", Status::OK, Category::Infinity), + (p_inf, p_largest_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_largest_value, "-inf", Status::OK, Category::Infinity), + (p_inf, p_smallest_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_smallest_value, "-inf", Status::OK, Category::Infinity), + (p_inf, p_smallest_normalized, "inf", Status::OK, Category::Infinity), + (p_inf, m_smallest_normalized, "-inf", Status::OK, Category::Infinity), (m_inf, p_inf, "-inf", Status::OK, Category::Infinity), - (m_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN), - (m_inf, p_zero, "-inf", Status::OK, Category::Infinity), - (m_inf, m_zero, "-inf", Status::OK, Category::Infinity), - (m_inf, qnan, "-nan", Status::OK, Category::NaN), + (m_inf, m_inf, "inf", Status::OK, Category::Infinity), + (m_inf, p_zero, "nan", Status::INVALID_OP, Category::NaN), + (m_inf, m_zero, "nan", Status::INVALID_OP, Category::NaN), + (m_inf, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(m_inf, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_inf, - p_normal_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_normal_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_largest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_largest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_smallest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_smallest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_smallest_normalized, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_smallest_normalized, - "-inf", - Status::OK, - Category::Infinity, - ), - (p_zero, p_inf, "-inf", Status::OK, Category::Infinity), - (p_zero, m_inf, "inf", Status::OK, Category::Infinity), + // See Note 1. + (m_inf, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_inf, p_normal_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_normal_value, "inf", Status::OK, Category::Infinity), + (m_inf, p_largest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_largest_value, "inf", Status::OK, Category::Infinity), + (m_inf, p_smallest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_smallest_value, "inf", Status::OK, Category::Infinity), + (m_inf, p_smallest_normalized, "-inf", Status::OK, Category::Infinity), + (m_inf, m_smallest_normalized, "inf", Status::OK, Category::Infinity), + (p_zero, p_inf, "nan", Status::INVALID_OP, Category::NaN), + (p_zero, m_inf, "nan", Status::INVALID_OP, Category::NaN), (p_zero, p_zero, "0x0p+0", Status::OK, Category::Zero), - (p_zero, m_zero, "0x0p+0", Status::OK, Category::Zero), - (p_zero, qnan, "-nan", Status::OK, Category::NaN), + (p_zero, m_zero, "-0x0p+0", Status::OK, Category::Zero), + (p_zero, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_zero, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_zero, - p_normal_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_zero, - m_normal_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_zero, - p_largest_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_zero, - m_largest_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_zero, - p_smallest_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_zero, - m_smallest_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_zero, - p_smallest_normalized, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_zero, - m_smallest_normalized, - "0x1p-126", - Status::OK, - Category::Normal, - ), - (m_zero, p_inf, "-inf", Status::OK, Category::Infinity), - (m_zero, m_inf, "inf", Status::OK, Category::Infinity), - (m_zero, p_zero, "-0x0p+0", Status::OK, Category::Zero), - (m_zero, m_zero, "0x0p+0", Status::OK, Category::Zero), - (m_zero, qnan, "-nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_zero, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_zero, - p_normal_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_zero, - m_normal_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_zero, - p_largest_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_zero, - m_largest_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_zero, - p_smallest_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_zero, - m_smallest_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_zero, - p_smallest_normalized, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_zero, - m_smallest_normalized, - "0x1p-126", - Status::OK, - Category::Normal, - ), - (qnan, p_inf, "nan", Status::OK, Category::NaN), - (qnan, m_inf, "nan", Status::OK, Category::NaN), - (qnan, p_zero, "nan", Status::OK, Category::NaN), - (qnan, m_zero, "nan", Status::OK, Category::NaN), - (qnan, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(qnan, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - (qnan, p_normal_value, "nan", Status::OK, Category::NaN), - (qnan, m_normal_value, "nan", Status::OK, Category::NaN), - (qnan, p_largest_value, "nan", Status::OK, Category::NaN), - (qnan, m_largest_value, "nan", Status::OK, Category::NaN), - (qnan, p_smallest_value, "nan", Status::OK, Category::NaN), - (qnan, m_smallest_value, "nan", Status::OK, Category::NaN), - ( - qnan, - p_smallest_normalized, - "nan", - Status::OK, - Category::NaN, - ), - ( - qnan, - m_smallest_normalized, - "nan", - Status::OK, - Category::NaN, - ), - /* -// See Note 1. -(snan, p_inf, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_inf, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_zero, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_zero, "nan", Status::INVALID_OP, Category::NaN), -(snan, qnan, "nan", Status::INVALID_OP, Category::NaN), -(snan, snan, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_normal_value, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - (p_normal_value, m_inf, "inf", Status::OK, Category::Infinity), - ( - p_normal_value, - p_zero, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - m_zero, - "0x1p+0", - Status::OK, - Category::Normal, - ), - (p_normal_value, qnan, "-nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_normal_value, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_normal_value, - p_normal_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_normal_value, - m_normal_value, - "0x1p+1", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - p_largest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_normal_value, - m_largest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_normal_value, - p_smallest_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_normal_value, - m_smallest_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_normal_value, - p_smallest_normalized, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_normal_value, - m_smallest_normalized, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_normal_value, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - (m_normal_value, m_inf, "inf", Status::OK, Category::Infinity), - ( - m_normal_value, - p_zero, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - m_zero, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - (m_normal_value, qnan, "-nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_normal_value, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_normal_value, - p_normal_value, - "-0x1p+1", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - m_normal_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_normal_value, - p_largest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_normal_value, - m_largest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_normal_value, - p_smallest_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_normal_value, - m_smallest_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_normal_value, - p_smallest_normalized, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_normal_value, - m_smallest_normalized, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_largest_value, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_largest_value, - m_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_largest_value, - p_zero, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - m_zero, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - (p_largest_value, qnan, "-nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_largest_value, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_largest_value, - p_normal_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_largest_value, - m_normal_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_largest_value, - p_largest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_largest_value, - m_largest_value, - "inf", - overflow_status, - Category::Infinity, - ), - ( - p_largest_value, - p_smallest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_largest_value, - m_smallest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_largest_value, - p_smallest_normalized, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_largest_value, - m_smallest_normalized, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_largest_value, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_largest_value, - m_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_largest_value, - p_zero, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - m_zero, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - (m_largest_value, qnan, "-nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_largest_value, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_largest_value, - p_normal_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_largest_value, - m_normal_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_largest_value, - p_largest_value, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - m_largest_value, - m_largest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_largest_value, - p_smallest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_largest_value, - m_smallest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_largest_value, - p_smallest_normalized, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_largest_value, - m_smallest_normalized, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_value, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_value, - m_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_value, - p_zero, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_zero, - "0x1p-149", - Status::OK, - Category::Normal, - ), - (p_smallest_value, qnan, "-nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_smallest_value, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_smallest_value, - p_normal_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_value, - m_normal_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_value, - p_largest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_value, - m_largest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_value, - p_smallest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_value, - m_smallest_value, - "0x1p-148", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - p_smallest_normalized, - "-0x1.fffffcp-127", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_smallest_normalized, - "0x1.000002p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_value, - m_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_value, - p_zero, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_zero, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - (m_smallest_value, qnan, "-nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_smallest_value, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_smallest_value, - p_normal_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_value, - m_normal_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_value, - p_largest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_value, - m_largest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_value, - p_smallest_value, - "-0x1p-148", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_smallest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_value, - p_smallest_normalized, - "-0x1.000002p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_smallest_normalized, - "0x1.fffffcp-127", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_normalized, - m_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_normalized, - p_zero, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_zero, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - qnan, - "-nan", - Status::OK, - Category::NaN, - ), - /* -// See Note 1. -(p_smallest_normalized, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_smallest_normalized, - p_normal_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_normalized, - m_normal_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_normalized, - p_largest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_normalized, - m_largest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - p_smallest_normalized, - p_smallest_value, - "0x1.fffffcp-127", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_smallest_value, - "0x1.000002p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - p_smallest_normalized, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_normalized, - m_smallest_normalized, - "0x1p-125", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_normalized, - m_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_normalized, - p_zero, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_zero, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - qnan, - "-nan", - Status::OK, - Category::NaN, - ), - /* -// See Note 1. -(m_smallest_normalized, snan, "-nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_smallest_normalized, - p_normal_value, - "-0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_normalized, - m_normal_value, - "0x1p+0", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_normalized, - p_largest_value, - "-0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_normalized, - m_largest_value, - "0x1.fffffep+127", - Status::INEXACT, - Category::Normal, - ), - ( - m_smallest_normalized, - p_smallest_value, - "-0x1.000002p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_smallest_value, - "-0x1.fffffcp-127", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - p_smallest_normalized, - "-0x1p-125", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_smallest_normalized, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ]; - - for &(x, y, e_result, e_status, e_category) in &special_cases[..] { - let status; - let result = unpack!(status=, x - y); - assert_eq!(status, e_status); - assert_eq!(result.category(), e_category); - assert!(result.bitwise_eq(e_result.parse::().unwrap())); - } -} - -#[test] -fn multiply() { - // Test Special Cases against each other and normal values. - - // FIXMES/NOTES: - // 1. Since we perform only default exception handling all operations with - // signaling NaNs should have a result that is a quiet NaN. Currently they - // return sNaN. - - let p_inf = Single::INFINITY; - let m_inf = -Single::INFINITY; - let p_zero = Single::ZERO; - let m_zero = -Single::ZERO; - let qnan = Single::NAN; - let p_normal_value = "0x1p+0".parse::().unwrap(); - let m_normal_value = "-0x1p+0".parse::().unwrap(); - let p_largest_value = Single::largest(); - let m_largest_value = -Single::largest(); - let p_smallest_value = Single::SMALLEST; - let m_smallest_value = -Single::SMALLEST; - let p_smallest_normalized = Single::smallest_normalized(); - let m_smallest_normalized = -Single::smallest_normalized(); - - let overflow_status = Status::OVERFLOW | Status::INEXACT; - let underflow_status = Status::UNDERFLOW | Status::INEXACT; - - let special_cases = [ - (p_inf, p_inf, "inf", Status::OK, Category::Infinity), - (p_inf, m_inf, "-inf", Status::OK, Category::Infinity), - (p_inf, p_zero, "nan", Status::INVALID_OP, Category::NaN), - (p_inf, m_zero, "nan", Status::INVALID_OP, Category::NaN), - (p_inf, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_inf, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity), - ( - p_inf, - m_normal_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_largest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_largest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_smallest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_smallest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_smallest_normalized, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_smallest_normalized, - "-inf", - Status::OK, - Category::Infinity, - ), - (m_inf, p_inf, "-inf", Status::OK, Category::Infinity), - (m_inf, m_inf, "inf", Status::OK, Category::Infinity), - (m_inf, p_zero, "nan", Status::INVALID_OP, Category::NaN), - (m_inf, m_zero, "nan", Status::INVALID_OP, Category::NaN), - (m_inf, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_inf, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_inf, - p_normal_value, - "-inf", - Status::OK, - Category::Infinity, - ), - (m_inf, m_normal_value, "inf", Status::OK, Category::Infinity), - ( - m_inf, - p_largest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_largest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_smallest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_smallest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_smallest_normalized, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_smallest_normalized, - "inf", - Status::OK, - Category::Infinity, - ), - (p_zero, p_inf, "nan", Status::INVALID_OP, Category::NaN), - (p_zero, m_inf, "nan", Status::INVALID_OP, Category::NaN), - (p_zero, p_zero, "0x0p+0", Status::OK, Category::Zero), - (p_zero, m_zero, "-0x0p+0", Status::OK, Category::Zero), - (p_zero, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_zero, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - (p_zero, p_normal_value, "0x0p+0", Status::OK, Category::Zero), - ( - p_zero, - m_normal_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - p_largest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - m_largest_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - p_smallest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - m_smallest_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - p_smallest_normalized, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - m_smallest_normalized, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - (m_zero, p_inf, "nan", Status::INVALID_OP, Category::NaN), - (m_zero, m_inf, "nan", Status::INVALID_OP, Category::NaN), - (m_zero, p_zero, "-0x0p+0", Status::OK, Category::Zero), - (m_zero, m_zero, "0x0p+0", Status::OK, Category::Zero), - (m_zero, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_zero, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_zero, - p_normal_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - (m_zero, m_normal_value, "0x0p+0", Status::OK, Category::Zero), - ( - m_zero, - p_largest_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - m_largest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - p_smallest_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - m_smallest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - p_smallest_normalized, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - m_smallest_normalized, - "0x0p+0", - Status::OK, - Category::Zero, - ), - (qnan, p_inf, "nan", Status::OK, Category::NaN), - (qnan, m_inf, "nan", Status::OK, Category::NaN), - (qnan, p_zero, "nan", Status::OK, Category::NaN), - (qnan, m_zero, "nan", Status::OK, Category::NaN), - (qnan, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(qnan, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - (qnan, p_normal_value, "nan", Status::OK, Category::NaN), - (qnan, m_normal_value, "nan", Status::OK, Category::NaN), - (qnan, p_largest_value, "nan", Status::OK, Category::NaN), - (qnan, m_largest_value, "nan", Status::OK, Category::NaN), - (qnan, p_smallest_value, "nan", Status::OK, Category::NaN), - (qnan, m_smallest_value, "nan", Status::OK, Category::NaN), - ( - qnan, - p_smallest_normalized, - "nan", - Status::OK, - Category::NaN, - ), - ( - qnan, - m_smallest_normalized, - "nan", - Status::OK, - Category::NaN, - ), - /* -// See Note 1. -(snan, p_inf, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_inf, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_zero, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_zero, "nan", Status::INVALID_OP, Category::NaN), -(snan, qnan, "nan", Status::INVALID_OP, Category::NaN), -(snan, snan, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), - */ - (p_normal_value, p_inf, "inf", Status::OK, Category::Infinity), - ( - p_normal_value, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - (p_normal_value, p_zero, "0x0p+0", Status::OK, Category::Zero), - ( - p_normal_value, - m_zero, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - (p_normal_value, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_normal_value, - p_normal_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - m_normal_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - p_largest_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - m_largest_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - p_smallest_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - m_smallest_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - p_smallest_normalized, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - m_smallest_normalized, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - (m_normal_value, m_inf, "inf", Status::OK, Category::Infinity), - ( - m_normal_value, - p_zero, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - (m_normal_value, m_zero, "0x0p+0", Status::OK, Category::Zero), - (m_normal_value, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_normal_value, - p_normal_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - m_normal_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - p_largest_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - m_largest_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - p_smallest_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - m_smallest_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - p_smallest_normalized, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - m_smallest_normalized, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - p_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_largest_value, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_largest_value, - p_zero, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_largest_value, - m_zero, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - (p_largest_value, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_largest_value, - p_normal_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - m_normal_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - p_largest_value, - "inf", - overflow_status, - Category::Infinity, - ), - ( - p_largest_value, - m_largest_value, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - p_largest_value, - p_smallest_value, - "0x1.fffffep-22", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - m_smallest_value, - "-0x1.fffffep-22", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - p_smallest_normalized, - "0x1.fffffep+1", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - m_smallest_normalized, - "-0x1.fffffep+1", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_largest_value, - m_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_largest_value, - p_zero, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_largest_value, - m_zero, - "0x0p+0", - Status::OK, - Category::Zero, - ), - (m_largest_value, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_largest_value, - p_normal_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - m_normal_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - p_largest_value, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - m_largest_value, - m_largest_value, - "inf", - overflow_status, - Category::Infinity, - ), - ( - m_largest_value, - p_smallest_value, - "-0x1.fffffep-22", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - m_smallest_value, - "0x1.fffffep-22", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - p_smallest_normalized, - "-0x1.fffffep+1", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - m_smallest_normalized, - "0x1.fffffep+1", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - p_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_value, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_value, - p_zero, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_value, - m_zero, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - (p_smallest_value, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_smallest_value, - p_normal_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_normal_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - p_largest_value, - "0x1.fffffep-22", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_largest_value, - "-0x1.fffffep-22", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - p_smallest_value, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_value, - m_smallest_value, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_value, - p_smallest_normalized, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_value, - m_smallest_normalized, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_value, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_value, - m_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_value, - p_zero, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_value, - m_zero, - "0x0p+0", - Status::OK, - Category::Zero, - ), - (m_smallest_value, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_smallest_value, - p_normal_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_normal_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - p_largest_value, - "-0x1.fffffep-22", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_largest_value, - "0x1.fffffep-22", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - p_smallest_value, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_value, - m_smallest_value, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_value, - p_smallest_normalized, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_value, - m_smallest_normalized, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_normalized, - p_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_normalized, - m_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_smallest_normalized, - p_zero, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_normalized, - m_zero, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_normalized, - qnan, - "nan", - Status::OK, - Category::NaN, - ), - /* -// See Note 1. -(p_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_smallest_normalized, - p_normal_value, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_normal_value, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - p_largest_value, - "0x1.fffffep+1", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_largest_value, - "-0x1.fffffep+1", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - p_smallest_value, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_normalized, - m_smallest_value, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_normalized, - p_smallest_normalized, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_normalized, - m_smallest_normalized, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_normalized, - p_inf, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_normalized, - m_inf, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_smallest_normalized, - p_zero, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_normalized, - m_zero, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_normalized, - qnan, - "nan", - Status::OK, - Category::NaN, - ), - /* -// See Note 1. -(m_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_smallest_normalized, - p_normal_value, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_normal_value, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - p_largest_value, - "-0x1.fffffep+1", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_largest_value, - "0x1.fffffep+1", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - p_smallest_value, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_normalized, - m_smallest_value, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_normalized, - p_smallest_normalized, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_normalized, - m_smallest_normalized, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ]; - - for &(x, y, e_result, e_status, e_category) in &special_cases[..] { - let status; - let result = unpack!(status=, x * y); - assert_eq!(status, e_status); - assert_eq!(result.category(), e_category); - assert!(result.bitwise_eq(e_result.parse::().unwrap())); - } -} - -#[test] -fn divide() { - // Test Special Cases against each other and normal values. - - // FIXMES/NOTES: - // 1. Since we perform only default exception handling all operations with - // signaling NaNs should have a result that is a quiet NaN. Currently they - // return sNaN. - - let p_inf = Single::INFINITY; - let m_inf = -Single::INFINITY; - let p_zero = Single::ZERO; - let m_zero = -Single::ZERO; - let qnan = Single::NAN; - let p_normal_value = "0x1p+0".parse::().unwrap(); - let m_normal_value = "-0x1p+0".parse::().unwrap(); - let p_largest_value = Single::largest(); - let m_largest_value = -Single::largest(); - let p_smallest_value = Single::SMALLEST; - let m_smallest_value = -Single::SMALLEST; - let p_smallest_normalized = Single::smallest_normalized(); - let m_smallest_normalized = -Single::smallest_normalized(); - - let overflow_status = Status::OVERFLOW | Status::INEXACT; - let underflow_status = Status::UNDERFLOW | Status::INEXACT; - - let special_cases = [ - (p_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN), - (p_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN), - (p_inf, p_zero, "inf", Status::OK, Category::Infinity), - (p_inf, m_zero, "-inf", Status::OK, Category::Infinity), - (p_inf, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_inf, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity), - ( - p_inf, - m_normal_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_largest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_largest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_smallest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_smallest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - p_smallest_normalized, - "inf", - Status::OK, - Category::Infinity, - ), - ( - p_inf, - m_smallest_normalized, - "-inf", - Status::OK, - Category::Infinity, - ), - (m_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN), - (m_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN), - (m_inf, p_zero, "-inf", Status::OK, Category::Infinity), - (m_inf, m_zero, "inf", Status::OK, Category::Infinity), - (m_inf, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_inf, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_inf, - p_normal_value, - "-inf", - Status::OK, - Category::Infinity, - ), - (m_inf, m_normal_value, "inf", Status::OK, Category::Infinity), - ( - m_inf, - p_largest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_largest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_smallest_value, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_smallest_value, - "inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - p_smallest_normalized, - "-inf", - Status::OK, - Category::Infinity, - ), - ( - m_inf, - m_smallest_normalized, - "inf", - Status::OK, - Category::Infinity, - ), - (p_zero, p_inf, "0x0p+0", Status::OK, Category::Zero), - (p_zero, m_inf, "-0x0p+0", Status::OK, Category::Zero), - (p_zero, p_zero, "nan", Status::INVALID_OP, Category::NaN), - (p_zero, m_zero, "nan", Status::INVALID_OP, Category::NaN), - (p_zero, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(p_zero, snan, "nan", Status::INVALID_OP, Category::NaN), - */ + // See Note 1. + (p_zero, snan, "nan", Status::INVALID_OP, Category::NaN), + */ (p_zero, p_normal_value, "0x0p+0", Status::OK, Category::Zero), - ( - p_zero, - m_normal_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - p_largest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - m_largest_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - p_smallest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - m_smallest_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - p_smallest_normalized, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_zero, - m_smallest_normalized, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - (m_zero, p_inf, "-0x0p+0", Status::OK, Category::Zero), - (m_zero, m_inf, "0x0p+0", Status::OK, Category::Zero), - (m_zero, p_zero, "nan", Status::INVALID_OP, Category::NaN), - (m_zero, m_zero, "nan", Status::INVALID_OP, Category::NaN), + (p_zero, m_normal_value, "-0x0p+0", Status::OK, Category::Zero), + (p_zero, p_largest_value, "0x0p+0", Status::OK, Category::Zero), + (p_zero, m_largest_value, "-0x0p+0", Status::OK, Category::Zero), + (p_zero, p_smallest_value, "0x0p+0", Status::OK, Category::Zero), + (p_zero, m_smallest_value, "-0x0p+0", Status::OK, Category::Zero), + (p_zero, p_smallest_normalized, "0x0p+0", Status::OK, Category::Zero), + (p_zero, m_smallest_normalized, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, p_inf, "nan", Status::INVALID_OP, Category::NaN), + (m_zero, m_inf, "nan", Status::INVALID_OP, Category::NaN), + (m_zero, p_zero, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_zero, "0x0p+0", Status::OK, Category::Zero), (m_zero, qnan, "nan", Status::OK, Category::NaN), - /* -// See Note 1. -(m_zero, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_zero, - p_normal_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), + /* + // See Note 1. + (m_zero, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_zero, p_normal_value, "-0x0p+0", Status::OK, Category::Zero), (m_zero, m_normal_value, "0x0p+0", Status::OK, Category::Zero), - ( - m_zero, - p_largest_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - m_largest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - p_smallest_value, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - m_smallest_value, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - p_smallest_normalized, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_zero, - m_smallest_normalized, - "0x0p+0", - Status::OK, - Category::Zero, - ), + (m_zero, p_largest_value, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_largest_value, "0x0p+0", Status::OK, Category::Zero), + (m_zero, p_smallest_value, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_smallest_value, "0x0p+0", Status::OK, Category::Zero), + (m_zero, p_smallest_normalized, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_smallest_normalized, "0x0p+0", Status::OK, Category::Zero), (qnan, p_inf, "nan", Status::OK, Category::NaN), (qnan, m_inf, "nan", Status::OK, Category::NaN), (qnan, p_zero, "nan", Status::OK, Category::NaN), (qnan, m_zero, "nan", Status::OK, Category::NaN), (qnan, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(qnan, snan, "nan", Status::INVALID_OP, Category::NaN), - */ + // See Note 1. + (qnan, snan, "nan", Status::INVALID_OP, Category::NaN), + */ (qnan, p_normal_value, "nan", Status::OK, Category::NaN), (qnan, m_normal_value, "nan", Status::OK, Category::NaN), (qnan, p_largest_value, "nan", Status::OK, Category::NaN), (qnan, m_largest_value, "nan", Status::OK, Category::NaN), (qnan, p_smallest_value, "nan", Status::OK, Category::NaN), (qnan, m_smallest_value, "nan", Status::OK, Category::NaN), - ( - qnan, - p_smallest_normalized, - "nan", - Status::OK, - Category::NaN, - ), - ( - qnan, - m_smallest_normalized, - "nan", - Status::OK, - Category::NaN, - ), + (qnan, p_smallest_normalized, "nan", Status::OK, Category::NaN), + (qnan, m_smallest_normalized, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(snan, p_inf, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_inf, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_zero, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_zero, "nan", Status::INVALID_OP, Category::NaN), -(snan, qnan, "nan", Status::INVALID_OP, Category::NaN), -(snan, snan, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN), -(snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), -(snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), - */ - (p_normal_value, p_inf, "0x0p+0", Status::OK, Category::Zero), - (p_normal_value, m_inf, "-0x0p+0", Status::OK, Category::Zero), - ( - p_normal_value, - p_zero, - "inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - p_normal_value, - m_zero, - "-inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), + // See Note 1. + (snan, p_inf, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_inf, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_zero, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_zero, "nan", Status::INVALID_OP, Category::NaN), + (snan, qnan, "nan", Status::INVALID_OP, Category::NaN), + (snan, snan, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_normal_value, p_inf, "inf", Status::OK, Category::Infinity), + (p_normal_value, m_inf, "-inf", Status::OK, Category::Infinity), + (p_normal_value, p_zero, "0x0p+0", Status::OK, Category::Zero), + (p_normal_value, m_zero, "-0x0p+0", Status::OK, Category::Zero), (p_normal_value, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_normal_value, - p_normal_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - m_normal_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - p_largest_value, - "0x1p-128", - underflow_status, - Category::Normal, - ), - ( - p_normal_value, - m_largest_value, - "-0x1p-128", - underflow_status, - Category::Normal, - ), - ( - p_normal_value, - p_smallest_value, - "inf", - overflow_status, - Category::Infinity, - ), - ( - p_normal_value, - m_smallest_value, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - p_normal_value, - p_smallest_normalized, - "0x1p+126", - Status::OK, - Category::Normal, - ), - ( - p_normal_value, - m_smallest_normalized, - "-0x1p+126", - Status::OK, - Category::Normal, - ), - (m_normal_value, p_inf, "-0x0p+0", Status::OK, Category::Zero), - (m_normal_value, m_inf, "0x0p+0", Status::OK, Category::Zero), - ( - m_normal_value, - p_zero, - "-inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - m_normal_value, - m_zero, - "inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), + // See Note 1. + (p_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_normal_value, p_normal_value, "0x1p+0", Status::OK, Category::Normal), + (p_normal_value, m_normal_value, "-0x1p+0", Status::OK, Category::Normal), + (p_normal_value, p_largest_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (p_normal_value, m_largest_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (p_normal_value, p_smallest_value, "0x1p-149", Status::OK, Category::Normal), + (p_normal_value, m_smallest_value, "-0x1p-149", Status::OK, Category::Normal), + (p_normal_value, p_smallest_normalized, "0x1p-126", Status::OK, Category::Normal), + (p_normal_value, m_smallest_normalized, "-0x1p-126", Status::OK, Category::Normal), + (m_normal_value, p_inf, "-inf", Status::OK, Category::Infinity), + (m_normal_value, m_inf, "inf", Status::OK, Category::Infinity), + (m_normal_value, p_zero, "-0x0p+0", Status::OK, Category::Zero), + (m_normal_value, m_zero, "0x0p+0", Status::OK, Category::Zero), (m_normal_value, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(m_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_normal_value, - p_normal_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - m_normal_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - p_largest_value, - "-0x1p-128", - underflow_status, - Category::Normal, - ), - ( - m_normal_value, - m_largest_value, - "0x1p-128", - underflow_status, - Category::Normal, - ), - ( - m_normal_value, - p_smallest_value, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - m_normal_value, - m_smallest_value, - "inf", - overflow_status, - Category::Infinity, - ), - ( - m_normal_value, - p_smallest_normalized, - "-0x1p+126", - Status::OK, - Category::Normal, - ), - ( - m_normal_value, - m_smallest_normalized, - "0x1p+126", - Status::OK, - Category::Normal, - ), - (p_largest_value, p_inf, "0x0p+0", Status::OK, Category::Zero), - ( - p_largest_value, - m_inf, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_largest_value, - p_zero, - "inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - p_largest_value, - m_zero, - "-inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), + // See Note 1. + (m_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_normal_value, p_normal_value, "-0x1p+0", Status::OK, Category::Normal), + (m_normal_value, m_normal_value, "0x1p+0", Status::OK, Category::Normal), + (m_normal_value, p_largest_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (m_normal_value, m_largest_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (m_normal_value, p_smallest_value, "-0x1p-149", Status::OK, Category::Normal), + (m_normal_value, m_smallest_value, "0x1p-149", Status::OK, Category::Normal), + (m_normal_value, p_smallest_normalized, "-0x1p-126", Status::OK, Category::Normal), + (m_normal_value, m_smallest_normalized, "0x1p-126", Status::OK, Category::Normal), + (p_largest_value, p_inf, "inf", Status::OK, Category::Infinity), + (p_largest_value, m_inf, "-inf", Status::OK, Category::Infinity), + (p_largest_value, p_zero, "0x0p+0", Status::OK, Category::Zero), + (p_largest_value, m_zero, "-0x0p+0", Status::OK, Category::Zero), (p_largest_value, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_largest_value, - p_normal_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - m_normal_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - p_largest_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - m_largest_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_largest_value, - p_smallest_value, - "inf", - overflow_status, - Category::Infinity, - ), - ( - p_largest_value, - m_smallest_value, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - p_largest_value, - p_smallest_normalized, - "inf", - overflow_status, - Category::Infinity, - ), - ( - p_largest_value, - m_smallest_normalized, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - m_largest_value, - p_inf, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - (m_largest_value, m_inf, "0x0p+0", Status::OK, Category::Zero), - ( - m_largest_value, - p_zero, - "-inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - m_largest_value, - m_zero, - "inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), + // See Note 1. + (p_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_largest_value, p_normal_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (p_largest_value, m_normal_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (p_largest_value, p_largest_value, "inf", overflow_status, Category::Infinity), + (p_largest_value, m_largest_value, "-inf", overflow_status, Category::Infinity), + (p_largest_value, p_smallest_value, "0x1.fffffep-22", Status::OK, Category::Normal), + (p_largest_value, m_smallest_value, "-0x1.fffffep-22", Status::OK, Category::Normal), + (p_largest_value, p_smallest_normalized, "0x1.fffffep+1", Status::OK, Category::Normal), + (p_largest_value, m_smallest_normalized, "-0x1.fffffep+1", Status::OK, Category::Normal), + (m_largest_value, p_inf, "-inf", Status::OK, Category::Infinity), + (m_largest_value, m_inf, "inf", Status::OK, Category::Infinity), + (m_largest_value, p_zero, "-0x0p+0", Status::OK, Category::Zero), + (m_largest_value, m_zero, "0x0p+0", Status::OK, Category::Zero), (m_largest_value, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(m_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_largest_value, - p_normal_value, - "-0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - m_normal_value, - "0x1.fffffep+127", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - p_largest_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - m_largest_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_largest_value, - p_smallest_value, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - m_largest_value, - m_smallest_value, - "inf", - overflow_status, - Category::Infinity, - ), - ( - m_largest_value, - p_smallest_normalized, - "-inf", - overflow_status, - Category::Infinity, - ), - ( - m_largest_value, - m_smallest_normalized, - "inf", - overflow_status, - Category::Infinity, - ), - ( - p_smallest_value, - p_inf, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_value, - m_inf, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_value, - p_zero, - "inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - p_smallest_value, - m_zero, - "-inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), + // See Note 1. + (m_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_largest_value, p_normal_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (m_largest_value, m_normal_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (m_largest_value, p_largest_value, "-inf", overflow_status, Category::Infinity), + (m_largest_value, m_largest_value, "inf", overflow_status, Category::Infinity), + (m_largest_value, p_smallest_value, "-0x1.fffffep-22", Status::OK, Category::Normal), + (m_largest_value, m_smallest_value, "0x1.fffffep-22", Status::OK, Category::Normal), + (m_largest_value, p_smallest_normalized, "-0x1.fffffep+1", Status::OK, Category::Normal), + (m_largest_value, m_smallest_normalized, "0x1.fffffep+1", Status::OK, Category::Normal), + (p_smallest_value, p_inf, "inf", Status::OK, Category::Infinity), + (p_smallest_value, m_inf, "-inf", Status::OK, Category::Infinity), + (p_smallest_value, p_zero, "0x0p+0", Status::OK, Category::Zero), + (p_smallest_value, m_zero, "-0x0p+0", Status::OK, Category::Zero), + (p_smallest_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_smallest_value, p_normal_value, "0x1p-149", Status::OK, Category::Normal), + (p_smallest_value, m_normal_value, "-0x1p-149", Status::OK, Category::Normal), + (p_smallest_value, p_largest_value, "0x1.fffffep-22", Status::OK, Category::Normal), + (p_smallest_value, m_largest_value, "-0x1.fffffep-22", Status::OK, Category::Normal), + (p_smallest_value, p_smallest_value, "0x0p+0", underflow_status, Category::Zero), + (p_smallest_value, m_smallest_value, "-0x0p+0", underflow_status, Category::Zero), + (p_smallest_value, p_smallest_normalized, "0x0p+0", underflow_status, Category::Zero), + (p_smallest_value, m_smallest_normalized, "-0x0p+0", underflow_status, Category::Zero), + (m_smallest_value, p_inf, "-inf", Status::OK, Category::Infinity), + (m_smallest_value, m_inf, "inf", Status::OK, Category::Infinity), + (m_smallest_value, p_zero, "-0x0p+0", Status::OK, Category::Zero), + (m_smallest_value, m_zero, "0x0p+0", Status::OK, Category::Zero), + (m_smallest_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_smallest_value, p_normal_value, "-0x1p-149", Status::OK, Category::Normal), + (m_smallest_value, m_normal_value, "0x1p-149", Status::OK, Category::Normal), + (m_smallest_value, p_largest_value, "-0x1.fffffep-22", Status::OK, Category::Normal), + (m_smallest_value, m_largest_value, "0x1.fffffep-22", Status::OK, Category::Normal), + (m_smallest_value, p_smallest_value, "-0x0p+0", underflow_status, Category::Zero), + (m_smallest_value, m_smallest_value, "0x0p+0", underflow_status, Category::Zero), + (m_smallest_value, p_smallest_normalized, "-0x0p+0", underflow_status, Category::Zero), + (m_smallest_value, m_smallest_normalized, "0x0p+0", underflow_status, Category::Zero), + (p_smallest_normalized, p_inf, "inf", Status::OK, Category::Infinity), + (p_smallest_normalized, m_inf, "-inf", Status::OK, Category::Infinity), + (p_smallest_normalized, p_zero, "0x0p+0", Status::OK, Category::Zero), + (p_smallest_normalized, m_zero, "-0x0p+0", Status::OK, Category::Zero), + (p_smallest_normalized, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_smallest_normalized, p_normal_value, "0x1p-126", Status::OK, Category::Normal), + (p_smallest_normalized, m_normal_value, "-0x1p-126", Status::OK, Category::Normal), + (p_smallest_normalized, p_largest_value, "0x1.fffffep+1", Status::OK, Category::Normal), + (p_smallest_normalized, m_largest_value, "-0x1.fffffep+1", Status::OK, Category::Normal), + (p_smallest_normalized, p_smallest_value, "0x0p+0", underflow_status, Category::Zero), + (p_smallest_normalized, m_smallest_value, "-0x0p+0", underflow_status, Category::Zero), + (p_smallest_normalized, p_smallest_normalized, "0x0p+0", underflow_status, Category::Zero), + (p_smallest_normalized, m_smallest_normalized, "-0x0p+0", underflow_status, Category::Zero), + (m_smallest_normalized, p_inf, "-inf", Status::OK, Category::Infinity), + (m_smallest_normalized, m_inf, "inf", Status::OK, Category::Infinity), + (m_smallest_normalized, p_zero, "-0x0p+0", Status::OK, Category::Zero), + (m_smallest_normalized, m_zero, "0x0p+0", Status::OK, Category::Zero), + (m_smallest_normalized, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_smallest_normalized, p_normal_value, "-0x1p-126", Status::OK, Category::Normal), + (m_smallest_normalized, m_normal_value, "0x1p-126", Status::OK, Category::Normal), + (m_smallest_normalized, p_largest_value, "-0x1.fffffep+1", Status::OK, Category::Normal), + (m_smallest_normalized, m_largest_value, "0x1.fffffep+1", Status::OK, Category::Normal), + (m_smallest_normalized, p_smallest_value, "-0x0p+0", underflow_status, Category::Zero), + (m_smallest_normalized, m_smallest_value, "0x0p+0", underflow_status, Category::Zero), + (m_smallest_normalized, p_smallest_normalized, "-0x0p+0", underflow_status, Category::Zero), + (m_smallest_normalized, m_smallest_normalized, "0x0p+0", underflow_status, Category::Zero), + ]; + + for &(x, y, e_result, e_status, e_category) in &special_cases[..] { + let status; + let result = unpack!(status=, x * y); + assert_eq!(status, e_status); + assert_eq!(result.category(), e_category); + assert!(result.bitwise_eq(e_result.parse::().unwrap())); + } +} + +#[test] +fn divide() { + // Test Special Cases against each other and normal values. + + // FIXMES/NOTES: + // 1. Since we perform only default exception handling all operations with + // signaling NaNs should have a result that is a quiet NaN. Currently they + // return sNaN. + + let p_inf = Single::INFINITY; + let m_inf = -Single::INFINITY; + let p_zero = Single::ZERO; + let m_zero = -Single::ZERO; + let qnan = Single::NAN; + let p_normal_value = "0x1p+0".parse::().unwrap(); + let m_normal_value = "-0x1p+0".parse::().unwrap(); + let p_largest_value = Single::largest(); + let m_largest_value = -Single::largest(); + let p_smallest_value = Single::SMALLEST; + let m_smallest_value = -Single::SMALLEST; + let p_smallest_normalized = Single::smallest_normalized(); + let m_smallest_normalized = -Single::smallest_normalized(); + + let overflow_status = Status::OVERFLOW | Status::INEXACT; + let underflow_status = Status::UNDERFLOW | Status::INEXACT; + + let special_cases = [ + (p_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN), + (p_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN), + (p_inf, p_zero, "inf", Status::OK, Category::Infinity), + (p_inf, m_zero, "-inf", Status::OK, Category::Infinity), + (p_inf, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_inf, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_inf, p_normal_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_normal_value, "-inf", Status::OK, Category::Infinity), + (p_inf, p_largest_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_largest_value, "-inf", Status::OK, Category::Infinity), + (p_inf, p_smallest_value, "inf", Status::OK, Category::Infinity), + (p_inf, m_smallest_value, "-inf", Status::OK, Category::Infinity), + (p_inf, p_smallest_normalized, "inf", Status::OK, Category::Infinity), + (p_inf, m_smallest_normalized, "-inf", Status::OK, Category::Infinity), + (m_inf, p_inf, "nan", Status::INVALID_OP, Category::NaN), + (m_inf, m_inf, "nan", Status::INVALID_OP, Category::NaN), + (m_inf, p_zero, "-inf", Status::OK, Category::Infinity), + (m_inf, m_zero, "inf", Status::OK, Category::Infinity), + (m_inf, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_inf, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_inf, p_normal_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_normal_value, "inf", Status::OK, Category::Infinity), + (m_inf, p_largest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_largest_value, "inf", Status::OK, Category::Infinity), + (m_inf, p_smallest_value, "-inf", Status::OK, Category::Infinity), + (m_inf, m_smallest_value, "inf", Status::OK, Category::Infinity), + (m_inf, p_smallest_normalized, "-inf", Status::OK, Category::Infinity), + (m_inf, m_smallest_normalized, "inf", Status::OK, Category::Infinity), + (p_zero, p_inf, "0x0p+0", Status::OK, Category::Zero), + (p_zero, m_inf, "-0x0p+0", Status::OK, Category::Zero), + (p_zero, p_zero, "nan", Status::INVALID_OP, Category::NaN), + (p_zero, m_zero, "nan", Status::INVALID_OP, Category::NaN), + (p_zero, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_zero, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_zero, p_normal_value, "0x0p+0", Status::OK, Category::Zero), + (p_zero, m_normal_value, "-0x0p+0", Status::OK, Category::Zero), + (p_zero, p_largest_value, "0x0p+0", Status::OK, Category::Zero), + (p_zero, m_largest_value, "-0x0p+0", Status::OK, Category::Zero), + (p_zero, p_smallest_value, "0x0p+0", Status::OK, Category::Zero), + (p_zero, m_smallest_value, "-0x0p+0", Status::OK, Category::Zero), + (p_zero, p_smallest_normalized, "0x0p+0", Status::OK, Category::Zero), + (p_zero, m_smallest_normalized, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, p_inf, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_inf, "0x0p+0", Status::OK, Category::Zero), + (m_zero, p_zero, "nan", Status::INVALID_OP, Category::NaN), + (m_zero, m_zero, "nan", Status::INVALID_OP, Category::NaN), + (m_zero, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_zero, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_zero, p_normal_value, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_normal_value, "0x0p+0", Status::OK, Category::Zero), + (m_zero, p_largest_value, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_largest_value, "0x0p+0", Status::OK, Category::Zero), + (m_zero, p_smallest_value, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_smallest_value, "0x0p+0", Status::OK, Category::Zero), + (m_zero, p_smallest_normalized, "-0x0p+0", Status::OK, Category::Zero), + (m_zero, m_smallest_normalized, "0x0p+0", Status::OK, Category::Zero), + (qnan, p_inf, "nan", Status::OK, Category::NaN), + (qnan, m_inf, "nan", Status::OK, Category::NaN), + (qnan, p_zero, "nan", Status::OK, Category::NaN), + (qnan, m_zero, "nan", Status::OK, Category::NaN), + (qnan, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (qnan, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (qnan, p_normal_value, "nan", Status::OK, Category::NaN), + (qnan, m_normal_value, "nan", Status::OK, Category::NaN), + (qnan, p_largest_value, "nan", Status::OK, Category::NaN), + (qnan, m_largest_value, "nan", Status::OK, Category::NaN), + (qnan, p_smallest_value, "nan", Status::OK, Category::NaN), + (qnan, m_smallest_value, "nan", Status::OK, Category::NaN), + (qnan, p_smallest_normalized, "nan", Status::OK, Category::NaN), + (qnan, m_smallest_normalized, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (snan, p_inf, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_inf, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_zero, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_zero, "nan", Status::INVALID_OP, Category::NaN), + (snan, qnan, "nan", Status::INVALID_OP, Category::NaN), + (snan, snan, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_normal_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_normal_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_largest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_largest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_smallest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_smallest_value, "nan", Status::INVALID_OP, Category::NaN), + (snan, p_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), + (snan, m_smallest_normalized, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_normal_value, p_inf, "0x0p+0", Status::OK, Category::Zero), + (p_normal_value, m_inf, "-0x0p+0", Status::OK, Category::Zero), + (p_normal_value, p_zero, "inf", Status::DIV_BY_ZERO, Category::Infinity), + (p_normal_value, m_zero, "-inf", Status::DIV_BY_ZERO, Category::Infinity), + (p_normal_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_normal_value, p_normal_value, "0x1p+0", Status::OK, Category::Normal), + (p_normal_value, m_normal_value, "-0x1p+0", Status::OK, Category::Normal), + (p_normal_value, p_largest_value, "0x1p-128", underflow_status, Category::Normal), + (p_normal_value, m_largest_value, "-0x1p-128", underflow_status, Category::Normal), + (p_normal_value, p_smallest_value, "inf", overflow_status, Category::Infinity), + (p_normal_value, m_smallest_value, "-inf", overflow_status, Category::Infinity), + (p_normal_value, p_smallest_normalized, "0x1p+126", Status::OK, Category::Normal), + (p_normal_value, m_smallest_normalized, "-0x1p+126", Status::OK, Category::Normal), + (m_normal_value, p_inf, "-0x0p+0", Status::OK, Category::Zero), + (m_normal_value, m_inf, "0x0p+0", Status::OK, Category::Zero), + (m_normal_value, p_zero, "-inf", Status::DIV_BY_ZERO, Category::Infinity), + (m_normal_value, m_zero, "inf", Status::DIV_BY_ZERO, Category::Infinity), + (m_normal_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_normal_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_normal_value, p_normal_value, "-0x1p+0", Status::OK, Category::Normal), + (m_normal_value, m_normal_value, "0x1p+0", Status::OK, Category::Normal), + (m_normal_value, p_largest_value, "-0x1p-128", underflow_status, Category::Normal), + (m_normal_value, m_largest_value, "0x1p-128", underflow_status, Category::Normal), + (m_normal_value, p_smallest_value, "-inf", overflow_status, Category::Infinity), + (m_normal_value, m_smallest_value, "inf", overflow_status, Category::Infinity), + (m_normal_value, p_smallest_normalized, "-0x1p+126", Status::OK, Category::Normal), + (m_normal_value, m_smallest_normalized, "0x1p+126", Status::OK, Category::Normal), + (p_largest_value, p_inf, "0x0p+0", Status::OK, Category::Zero), + (p_largest_value, m_inf, "-0x0p+0", Status::OK, Category::Zero), + (p_largest_value, p_zero, "inf", Status::DIV_BY_ZERO, Category::Infinity), + (p_largest_value, m_zero, "-inf", Status::DIV_BY_ZERO, Category::Infinity), + (p_largest_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (p_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_largest_value, p_normal_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (p_largest_value, m_normal_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (p_largest_value, p_largest_value, "0x1p+0", Status::OK, Category::Normal), + (p_largest_value, m_largest_value, "-0x1p+0", Status::OK, Category::Normal), + (p_largest_value, p_smallest_value, "inf", overflow_status, Category::Infinity), + (p_largest_value, m_smallest_value, "-inf", overflow_status, Category::Infinity), + (p_largest_value, p_smallest_normalized, "inf", overflow_status, Category::Infinity), + (p_largest_value, m_smallest_normalized, "-inf", overflow_status, Category::Infinity), + (m_largest_value, p_inf, "-0x0p+0", Status::OK, Category::Zero), + (m_largest_value, m_inf, "0x0p+0", Status::OK, Category::Zero), + (m_largest_value, p_zero, "-inf", Status::DIV_BY_ZERO, Category::Infinity), + (m_largest_value, m_zero, "inf", Status::DIV_BY_ZERO, Category::Infinity), + (m_largest_value, qnan, "nan", Status::OK, Category::NaN), + /* + // See Note 1. + (m_largest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_largest_value, p_normal_value, "-0x1.fffffep+127", Status::OK, Category::Normal), + (m_largest_value, m_normal_value, "0x1.fffffep+127", Status::OK, Category::Normal), + (m_largest_value, p_largest_value, "-0x1p+0", Status::OK, Category::Normal), + (m_largest_value, m_largest_value, "0x1p+0", Status::OK, Category::Normal), + (m_largest_value, p_smallest_value, "-inf", overflow_status, Category::Infinity), + (m_largest_value, m_smallest_value, "inf", overflow_status, Category::Infinity), + (m_largest_value, p_smallest_normalized, "-inf", overflow_status, Category::Infinity), + (m_largest_value, m_smallest_normalized, "inf", overflow_status, Category::Infinity), + (p_smallest_value, p_inf, "0x0p+0", Status::OK, Category::Zero), + (p_smallest_value, m_inf, "-0x0p+0", Status::OK, Category::Zero), + (p_smallest_value, p_zero, "inf", Status::DIV_BY_ZERO, Category::Infinity), + (p_smallest_value, m_zero, "-inf", Status::DIV_BY_ZERO, Category::Infinity), (p_smallest_value, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_smallest_value, - p_normal_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_normal_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - p_largest_value, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_value, - m_largest_value, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_value, - p_smallest_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_smallest_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - p_smallest_normalized, - "0x1p-23", - Status::OK, - Category::Normal, - ), - ( - p_smallest_value, - m_smallest_normalized, - "-0x1p-23", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - p_inf, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_value, - m_inf, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_value, - p_zero, - "-inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - m_smallest_value, - m_zero, - "inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), + // See Note 1. + (p_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_smallest_value, p_normal_value, "0x1p-149", Status::OK, Category::Normal), + (p_smallest_value, m_normal_value, "-0x1p-149", Status::OK, Category::Normal), + (p_smallest_value, p_largest_value, "0x0p+0", underflow_status, Category::Zero), + (p_smallest_value, m_largest_value, "-0x0p+0", underflow_status, Category::Zero), + (p_smallest_value, p_smallest_value, "0x1p+0", Status::OK, Category::Normal), + (p_smallest_value, m_smallest_value, "-0x1p+0", Status::OK, Category::Normal), + (p_smallest_value, p_smallest_normalized, "0x1p-23", Status::OK, Category::Normal), + (p_smallest_value, m_smallest_normalized, "-0x1p-23", Status::OK, Category::Normal), + (m_smallest_value, p_inf, "-0x0p+0", Status::OK, Category::Zero), + (m_smallest_value, m_inf, "0x0p+0", Status::OK, Category::Zero), + (m_smallest_value, p_zero, "-inf", Status::DIV_BY_ZERO, Category::Infinity), + (m_smallest_value, m_zero, "inf", Status::DIV_BY_ZERO, Category::Infinity), (m_smallest_value, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(m_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_smallest_value, - p_normal_value, - "-0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_normal_value, - "0x1p-149", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - p_largest_value, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_value, - m_largest_value, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_value, - p_smallest_value, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_smallest_value, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - p_smallest_normalized, - "-0x1p-23", - Status::OK, - Category::Normal, - ), - ( - m_smallest_value, - m_smallest_normalized, - "0x1p-23", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - p_inf, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_normalized, - m_inf, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - p_smallest_normalized, - p_zero, - "inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - p_smallest_normalized, - m_zero, - "-inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - p_smallest_normalized, - qnan, - "nan", - Status::OK, - Category::NaN, - ), + // See Note 1. + (m_smallest_value, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_smallest_value, p_normal_value, "-0x1p-149", Status::OK, Category::Normal), + (m_smallest_value, m_normal_value, "0x1p-149", Status::OK, Category::Normal), + (m_smallest_value, p_largest_value, "-0x0p+0", underflow_status, Category::Zero), + (m_smallest_value, m_largest_value, "0x0p+0", underflow_status, Category::Zero), + (m_smallest_value, p_smallest_value, "-0x1p+0", Status::OK, Category::Normal), + (m_smallest_value, m_smallest_value, "0x1p+0", Status::OK, Category::Normal), + (m_smallest_value, p_smallest_normalized, "-0x1p-23", Status::OK, Category::Normal), + (m_smallest_value, m_smallest_normalized, "0x1p-23", Status::OK, Category::Normal), + (p_smallest_normalized, p_inf, "0x0p+0", Status::OK, Category::Zero), + (p_smallest_normalized, m_inf, "-0x0p+0", Status::OK, Category::Zero), + (p_smallest_normalized, p_zero, "inf", Status::DIV_BY_ZERO, Category::Infinity), + (p_smallest_normalized, m_zero, "-inf", Status::DIV_BY_ZERO, Category::Infinity), + (p_smallest_normalized, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(p_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - p_smallest_normalized, - p_normal_value, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_normal_value, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - p_largest_value, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_normalized, - m_largest_value, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - p_smallest_normalized, - p_smallest_value, - "0x1p+23", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_smallest_value, - "-0x1p+23", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - p_smallest_normalized, - "0x1p+0", - Status::OK, - Category::Normal, - ), - ( - p_smallest_normalized, - m_smallest_normalized, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - p_inf, - "-0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_normalized, - m_inf, - "0x0p+0", - Status::OK, - Category::Zero, - ), - ( - m_smallest_normalized, - p_zero, - "-inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - m_smallest_normalized, - m_zero, - "inf", - Status::DIV_BY_ZERO, - Category::Infinity, - ), - ( - m_smallest_normalized, - qnan, - "nan", - Status::OK, - Category::NaN, - ), + // See Note 1. + (p_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (p_smallest_normalized, p_normal_value, "0x1p-126", Status::OK, Category::Normal), + (p_smallest_normalized, m_normal_value, "-0x1p-126", Status::OK, Category::Normal), + (p_smallest_normalized, p_largest_value, "0x0p+0", underflow_status, Category::Zero), + (p_smallest_normalized, m_largest_value, "-0x0p+0", underflow_status, Category::Zero), + (p_smallest_normalized, p_smallest_value, "0x1p+23", Status::OK, Category::Normal), + (p_smallest_normalized, m_smallest_value, "-0x1p+23", Status::OK, Category::Normal), + (p_smallest_normalized, p_smallest_normalized, "0x1p+0", Status::OK, Category::Normal), + (p_smallest_normalized, m_smallest_normalized, "-0x1p+0", Status::OK, Category::Normal), + (m_smallest_normalized, p_inf, "-0x0p+0", Status::OK, Category::Zero), + (m_smallest_normalized, m_inf, "0x0p+0", Status::OK, Category::Zero), + (m_smallest_normalized, p_zero, "-inf", Status::DIV_BY_ZERO, Category::Infinity), + (m_smallest_normalized, m_zero, "inf", Status::DIV_BY_ZERO, Category::Infinity), + (m_smallest_normalized, qnan, "nan", Status::OK, Category::NaN), /* -// See Note 1. -(m_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), - */ - ( - m_smallest_normalized, - p_normal_value, - "-0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_normal_value, - "0x1p-126", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - p_largest_value, - "-0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_normalized, - m_largest_value, - "0x0p+0", - underflow_status, - Category::Zero, - ), - ( - m_smallest_normalized, - p_smallest_value, - "-0x1p+23", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_smallest_value, - "0x1p+23", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - p_smallest_normalized, - "-0x1p+0", - Status::OK, - Category::Normal, - ), - ( - m_smallest_normalized, - m_smallest_normalized, - "0x1p+0", - Status::OK, - Category::Normal, - ), + // See Note 1. + (m_smallest_normalized, snan, "nan", Status::INVALID_OP, Category::NaN), + */ + (m_smallest_normalized, p_normal_value, "-0x1p-126", Status::OK, Category::Normal), + (m_smallest_normalized, m_normal_value, "0x1p-126", Status::OK, Category::Normal), + (m_smallest_normalized, p_largest_value, "-0x0p+0", underflow_status, Category::Zero), + (m_smallest_normalized, m_largest_value, "0x0p+0", underflow_status, Category::Zero), + (m_smallest_normalized, p_smallest_value, "-0x1p+23", Status::OK, Category::Normal), + (m_smallest_normalized, m_smallest_value, "0x1p+23", Status::OK, Category::Normal), + (m_smallest_normalized, p_smallest_normalized, "-0x1p+0", Status::OK, Category::Normal), + (m_smallest_normalized, m_smallest_normalized, "0x1p+0", Status::OK, Category::Normal), ]; for &(x, y, e_result, e_status, e_category) in &special_cases[..] { @@ -6358,12 +2851,8 @@ fn abs() { assert!(p_largest_value.bitwise_eq(m_largest_value.abs())); assert!(p_smallest_value.bitwise_eq(p_smallest_value.abs())); assert!(p_smallest_value.bitwise_eq(m_smallest_value.abs())); - assert!(p_smallest_normalized.bitwise_eq( - p_smallest_normalized.abs(), - )); - assert!(p_smallest_normalized.bitwise_eq( - m_smallest_normalized.abs(), - )); + assert!(p_smallest_normalized.bitwise_eq(p_smallest_normalized.abs(),)); + assert!(p_smallest_normalized.bitwise_eq(m_smallest_normalized.abs(),)); } #[test] @@ -6393,32 +2882,16 @@ fn neg() { fn ilogb() { assert_eq!(-1074, Double::SMALLEST.ilogb()); assert_eq!(-1074, (-Double::SMALLEST).ilogb()); - assert_eq!( - -1023, - "0x1.ffffffffffffep-1024".parse::().unwrap().ilogb() - ); - assert_eq!( - -1023, - "0x1.ffffffffffffep-1023".parse::().unwrap().ilogb() - ); - assert_eq!( - -1023, - "-0x1.ffffffffffffep-1023" - .parse::() - .unwrap() - .ilogb() - ); + assert_eq!(-1023, "0x1.ffffffffffffep-1024".parse::().unwrap().ilogb()); + assert_eq!(-1023, "0x1.ffffffffffffep-1023".parse::().unwrap().ilogb()); + assert_eq!(-1023, "-0x1.ffffffffffffep-1023".parse::().unwrap().ilogb()); assert_eq!(-51, "0x1p-51".parse::().unwrap().ilogb()); - assert_eq!( - -1023, - "0x1.c60f120d9f87cp-1023".parse::().unwrap().ilogb() - ); + assert_eq!(-1023, "0x1.c60f120d9f87cp-1023".parse::().unwrap().ilogb()); assert_eq!(-2, "0x0.ffffp-1".parse::().unwrap().ilogb()); assert_eq!(-1023, "0x1.fffep-1023".parse::().unwrap().ilogb()); assert_eq!(1023, Double::largest().ilogb()); assert_eq!(1023, (-Double::largest()).ilogb()); - assert_eq!(0, "0x1p+0".parse::().unwrap().ilogb()); assert_eq!(0, "-0x1p+0".parse::().unwrap().ilogb()); assert_eq!(42, "0x1p+42".parse::().unwrap().ilogb()); @@ -6442,15 +2915,24 @@ fn ilogb() { #[test] fn scalbn() { - assert!("0x1p+0".parse::().unwrap().bitwise_eq( - "0x1p+0".parse::().unwrap().scalbn(0), - )); - assert!("0x1p+42".parse::().unwrap().bitwise_eq( - "0x1p+0".parse::().unwrap().scalbn(42), - )); - assert!("0x1p-42".parse::().unwrap().bitwise_eq( - "0x1p+0".parse::().unwrap().scalbn(-42), - )); + assert!( + "0x1p+0" + .parse::() + .unwrap() + .bitwise_eq("0x1p+0".parse::().unwrap().scalbn(0),) + ); + assert!( + "0x1p+42" + .parse::() + .unwrap() + .bitwise_eq("0x1p+0".parse::().unwrap().scalbn(42),) + ); + assert!( + "0x1p-42" + .parse::() + .unwrap() + .bitwise_eq("0x1p+0".parse::().unwrap().scalbn(-42),) + ); let p_inf = Single::INFINITY; let m_inf = -Single::INFINITY; @@ -6479,28 +2961,18 @@ fn scalbn() { assert!(quiet_payload.is_nan() && !quiet_payload.is_signaling()); assert_eq!(payload, quiet_payload.to_bits() & ((1 << 51) - 1)); - assert!(p_inf.bitwise_eq( - "0x1p+0".parse::().unwrap().scalbn(128), - )); - assert!(m_inf.bitwise_eq( - "-0x1p+0".parse::().unwrap().scalbn(128), - )); - assert!(p_inf.bitwise_eq( - "0x1p+127".parse::().unwrap().scalbn(1), - )); - assert!(p_zero.bitwise_eq( - "0x1p-127".parse::().unwrap().scalbn(-127), - )); - assert!(m_zero.bitwise_eq( - "-0x1p-127".parse::().unwrap().scalbn(-127), - )); - assert!("-0x1p-149".parse::().unwrap().bitwise_eq( - "-0x1p-127".parse::().unwrap().scalbn(-22), - )); - assert!(p_zero.bitwise_eq( - "0x1p-126".parse::().unwrap().scalbn(-24), - )); - + assert!(p_inf.bitwise_eq("0x1p+0".parse::().unwrap().scalbn(128),)); + assert!(m_inf.bitwise_eq("-0x1p+0".parse::().unwrap().scalbn(128),)); + assert!(p_inf.bitwise_eq("0x1p+127".parse::().unwrap().scalbn(1),)); + assert!(p_zero.bitwise_eq("0x1p-127".parse::().unwrap().scalbn(-127),)); + assert!(m_zero.bitwise_eq("-0x1p-127".parse::().unwrap().scalbn(-127),)); + assert!( + "-0x1p-149" + .parse::() + .unwrap() + .bitwise_eq("-0x1p-127".parse::().unwrap().scalbn(-22),) + ); + assert!(p_zero.bitwise_eq("0x1p-126".parse::().unwrap().scalbn(-24),)); let smallest_f64 = Double::SMALLEST; let neg_smallest_f64 = -Double::SMALLEST; @@ -6511,33 +2983,16 @@ fn scalbn() { let largest_denormal_f64 = "0x1.ffffffffffffep-1023".parse::().unwrap(); let neg_largest_denormal_f64 = "-0x1.ffffffffffffep-1023".parse::().unwrap(); + assert!(smallest_f64.bitwise_eq("0x1p-1074".parse::().unwrap().scalbn(0),)); + assert!(neg_smallest_f64.bitwise_eq("-0x1p-1074".parse::().unwrap().scalbn(0),)); - assert!(smallest_f64.bitwise_eq( - "0x1p-1074".parse::().unwrap().scalbn(0), - )); - assert!(neg_smallest_f64.bitwise_eq( - "-0x1p-1074".parse::().unwrap().scalbn(0), - )); - - assert!("0x1p+1023".parse::().unwrap().bitwise_eq( - smallest_f64.scalbn( - 2097, - ), - )); + assert!("0x1p+1023".parse::().unwrap().bitwise_eq(smallest_f64.scalbn(2097,),)); assert!(smallest_f64.scalbn(-2097).is_pos_zero()); assert!(smallest_f64.scalbn(-2098).is_pos_zero()); assert!(smallest_f64.scalbn(-2099).is_pos_zero()); - assert!("0x1p+1022".parse::().unwrap().bitwise_eq( - smallest_f64.scalbn( - 2096, - ), - )); - assert!("0x1p+1023".parse::().unwrap().bitwise_eq( - smallest_f64.scalbn( - 2097, - ), - )); + assert!("0x1p+1022".parse::().unwrap().bitwise_eq(smallest_f64.scalbn(2096,),)); + assert!("0x1p+1023".parse::().unwrap().bitwise_eq(smallest_f64.scalbn(2097,),)); assert!(smallest_f64.scalbn(2098).is_infinite()); assert!(smallest_f64.scalbn(2099).is_infinite()); @@ -6545,12 +3000,8 @@ fn scalbn() { assert!(smallest_f64.scalbn(-ExpInt::max_value()).is_pos_zero()); assert!(largest_f64.scalbn(ExpInt::max_value()).is_infinite()); - assert!(largest_denormal_f64.bitwise_eq( - largest_denormal_f64.scalbn(0), - )); - assert!(neg_largest_denormal_f64.bitwise_eq( - neg_largest_denormal_f64.scalbn(0), - )); + assert!(largest_denormal_f64.bitwise_eq(largest_denormal_f64.scalbn(0),)); + assert!(neg_largest_denormal_f64.bitwise_eq(neg_largest_denormal_f64.scalbn(0),)); assert!( "0x1.ffffffffffffep-1022" @@ -6602,11 +3053,7 @@ fn scalbn() { .unwrap() .bitwise_eq(largest_denormal_f64.scalbn(2046)) ); - assert!("0x1p+974".parse::().unwrap().bitwise_eq( - smallest_f64.scalbn( - 2048, - ), - )); + assert!("0x1p+974".parse::().unwrap().bitwise_eq(smallest_f64.scalbn(2048,),)); let random_denormal_f64 = "0x1.c60f120d9f87cp+51".parse::().unwrap(); assert!( @@ -6637,40 +3084,30 @@ fn scalbn() { assert!(random_denormal_f64.scalbn(-2097).is_pos_zero()); assert!(random_denormal_f64.scalbn(-2090).is_pos_zero()); + assert!("-0x1p-1073".parse::().unwrap().bitwise_eq(neg_largest_f64.scalbn(-2097),)); - assert!("-0x1p-1073".parse::().unwrap().bitwise_eq( - neg_largest_f64.scalbn(-2097), - )); - - assert!("-0x1p-1024".parse::().unwrap().bitwise_eq( - neg_largest_f64.scalbn(-2048), - )); + assert!("-0x1p-1024".parse::().unwrap().bitwise_eq(neg_largest_f64.scalbn(-2048),)); - assert!("0x1p-1073".parse::().unwrap().bitwise_eq( - largest_f64.scalbn( - -2097, - ), - )); + assert!("0x1p-1073".parse::().unwrap().bitwise_eq(largest_f64.scalbn(-2097,),)); - assert!("0x1p-1074".parse::().unwrap().bitwise_eq( - largest_f64.scalbn( - -2098, - ), - )); - assert!("-0x1p-1074".parse::().unwrap().bitwise_eq( - neg_largest_f64.scalbn(-2098), - )); + assert!("0x1p-1074".parse::().unwrap().bitwise_eq(largest_f64.scalbn(-2098,),)); + assert!("-0x1p-1074".parse::().unwrap().bitwise_eq(neg_largest_f64.scalbn(-2098),)); assert!(neg_largest_f64.scalbn(-2099).is_neg_zero()); assert!(largest_f64.scalbn(1).is_infinite()); + assert!( + "0x1p+0" + .parse::() + .unwrap() + .bitwise_eq("0x1p+52".parse::().unwrap().scalbn(-52),) + ); - assert!("0x1p+0".parse::().unwrap().bitwise_eq( - "0x1p+52".parse::().unwrap().scalbn(-52), - )); - - assert!("0x1p-103".parse::().unwrap().bitwise_eq( - "0x1p-51".parse::().unwrap().scalbn(-52), - )); + assert!( + "0x1p-103" + .parse::() + .unwrap() + .bitwise_eq("0x1p-51".parse::().unwrap().scalbn(-52),) + ); } #[test] @@ -6711,7 +3148,6 @@ fn frexp() { assert_eq!(0, exp); assert!(frac.is_neg_zero()); - let frac = one.frexp(&mut exp); assert_eq!(1, exp); assert!("0x1p-1".parse::().unwrap().bitwise_eq(frac)); @@ -6722,22 +3158,11 @@ fn frexp() { let frac = largest_denormal.frexp(&mut exp); assert_eq!(-1022, exp); - assert!( - "0x1.ffffffffffffep-1" - .parse::() - .unwrap() - .bitwise_eq(frac) - ); + assert!("0x1.ffffffffffffep-1".parse::().unwrap().bitwise_eq(frac)); let frac = neg_largest_denormal.frexp(&mut exp); assert_eq!(-1022, exp); - assert!( - "-0x1.ffffffffffffep-1" - .parse::() - .unwrap() - .bitwise_eq(frac) - ); - + assert!("-0x1.ffffffffffffep-1".parse::().unwrap().bitwise_eq(frac)); let frac = smallest.frexp(&mut exp); assert_eq!(-1073, exp); @@ -6747,25 +3172,13 @@ fn frexp() { assert_eq!(-1073, exp); assert!("-0x1p-1".parse::().unwrap().bitwise_eq(frac)); - let frac = largest.frexp(&mut exp); assert_eq!(1024, exp); - assert!( - "0x1.fffffffffffffp-1" - .parse::() - .unwrap() - .bitwise_eq(frac) - ); + assert!("0x1.fffffffffffffp-1".parse::().unwrap().bitwise_eq(frac)); let frac = neg_largest.frexp(&mut exp); assert_eq!(1024, exp); - assert!( - "-0x1.fffffffffffffp-1" - .parse::() - .unwrap() - .bitwise_eq(frac) - ); - + assert!("-0x1.fffffffffffffp-1".parse::().unwrap().bitwise_eq(frac)); let frac = p_inf.frexp(&mut exp); assert_eq!(IEK_INF, exp); @@ -6800,16 +3213,9 @@ fn frexp() { assert_eq!(-50, exp); assert!("0x1p-1".parse::().unwrap().bitwise_eq(frac)); - let frac = "0x1.c60f120d9f87cp+51".parse::().unwrap().frexp( - &mut exp, - ); + let frac = "0x1.c60f120d9f87cp+51".parse::().unwrap().frexp(&mut exp); assert_eq!(52, exp); - assert!( - "0x1.c60f120d9f87cp-1" - .parse::() - .unwrap() - .bitwise_eq(frac) - ); + assert!("0x1.c60f120d9f87cp-1".parse::().unwrap().bitwise_eq(frac)); } #[test] diff --git a/src/librustc_apfloat/tests/ppc.rs b/src/librustc_apfloat/tests/ppc.rs index 02cdeb90a1..5a8de71cb3 100644 --- a/src/librustc_apfloat/tests/ppc.rs +++ b/src/librustc_apfloat/tests/ppc.rs @@ -1,5 +1,5 @@ -use rustc_apfloat::{Category, Float, Round}; use rustc_apfloat::ppc::DoubleDouble; +use rustc_apfloat::{Category, Float, Round}; use std::cmp::Ordering; @@ -23,15 +23,11 @@ fn ppc_double_double() { assert_eq!(0x3ff0000000000000, test.to_bits()); // LDBL_MAX - let test = "1.79769313486231580793728971405301e+308" - .parse::() - .unwrap(); + let test = "1.79769313486231580793728971405301e+308".parse::().unwrap(); assert_eq!(0x7c8ffffffffffffe_7fefffffffffffff, test.to_bits()); // LDBL_MIN - let test = "2.00416836000897277799610805135016e-292" - .parse::() - .unwrap(); + let test = "2.00416836000897277799610805135016e-292".parse::().unwrap(); assert_eq!(0x0000000000000000_0360000000000000, test.to_bits()); } @@ -39,12 +35,7 @@ fn ppc_double_double() { fn ppc_double_double_add_special() { let data = [ // (1 + 0) + (-1 + 0) = Category::Zero - ( - 0x3ff0000000000000, - 0xbff0000000000000, - Category::Zero, - Round::NearestTiesToEven, - ), + (0x3ff0000000000000, 0xbff0000000000000, Category::Zero, Round::NearestTiesToEven), // LDBL_MAX + (1.1 >> (1023 - 106) + 0)) = Category::Infinity ( 0x7c8ffffffffffffe_7fefffffffffffff, @@ -70,12 +61,7 @@ fn ppc_double_double_add_special() { Round::NearestTiesToEven, ), // NaN + (1 + 0) = Category::NaN - ( - 0x7ff8000000000000, - 0x3ff0000000000000, - Category::NaN, - Round::NearestTiesToEven, - ), + (0x7ff8000000000000, 0x3ff0000000000000, Category::NaN, Round::NearestTiesToEven), ]; for &(op1, op2, expected, round) in &data { @@ -199,63 +185,23 @@ fn ppc_double_double_subtract() { fn ppc_double_double_multiply_special() { let data = [ // Category::NaN * Category::NaN = Category::NaN - ( - 0x7ff8000000000000, - 0x7ff8000000000000, - Category::NaN, - Round::NearestTiesToEven, - ), + (0x7ff8000000000000, 0x7ff8000000000000, Category::NaN, Round::NearestTiesToEven), // Category::NaN * Category::Zero = Category::NaN - ( - 0x7ff8000000000000, - 0, - Category::NaN, - Round::NearestTiesToEven, - ), + (0x7ff8000000000000, 0, Category::NaN, Round::NearestTiesToEven), // Category::NaN * Category::Infinity = Category::NaN - ( - 0x7ff8000000000000, - 0x7ff0000000000000, - Category::NaN, - Round::NearestTiesToEven, - ), + (0x7ff8000000000000, 0x7ff0000000000000, Category::NaN, Round::NearestTiesToEven), // Category::NaN * Category::Normal = Category::NaN - ( - 0x7ff8000000000000, - 0x3ff0000000000000, - Category::NaN, - Round::NearestTiesToEven, - ), + (0x7ff8000000000000, 0x3ff0000000000000, Category::NaN, Round::NearestTiesToEven), // Category::Infinity * Category::Infinity = Category::Infinity - ( - 0x7ff0000000000000, - 0x7ff0000000000000, - Category::Infinity, - Round::NearestTiesToEven, - ), + (0x7ff0000000000000, 0x7ff0000000000000, Category::Infinity, Round::NearestTiesToEven), // Category::Infinity * Category::Zero = Category::NaN - ( - 0x7ff0000000000000, - 0, - Category::NaN, - Round::NearestTiesToEven, - ), + (0x7ff0000000000000, 0, Category::NaN, Round::NearestTiesToEven), // Category::Infinity * Category::Normal = Category::Infinity - ( - 0x7ff0000000000000, - 0x3ff0000000000000, - Category::Infinity, - Round::NearestTiesToEven, - ), + (0x7ff0000000000000, 0x3ff0000000000000, Category::Infinity, Round::NearestTiesToEven), // Category::Zero * Category::Zero = Category::Zero (0, 0, Category::Zero, Round::NearestTiesToEven), // Category::Zero * Category::Normal = Category::Zero - ( - 0, - 0x3ff0000000000000, - Category::Zero, - Round::NearestTiesToEven, - ), + (0, 0x3ff0000000000000, Category::Zero, Round::NearestTiesToEven), ]; for &(op1, op2, expected, round) in &data { @@ -407,13 +353,7 @@ fn ppc_double_double_remainder() { let a2 = DoubleDouble::from_bits(op2); let result = a1.ieee_rem(a2).value; - assert_eq!( - expected, - result.to_bits(), - "ieee_rem({:#x}, {:#x})", - op1, - op2 - ); + assert_eq!(expected, result.to_bits(), "ieee_rem({:#x}, {:#x})", op1, op2); } } @@ -449,14 +389,8 @@ fn ppc_double_double_mod() { fn ppc_double_double_fma() { // Sanity check for now. let mut a = "2".parse::().unwrap(); - a = a.mul_add( - "3".parse::().unwrap(), - "4".parse::().unwrap(), - ).value; - assert_eq!( - Some(Ordering::Equal), - "10".parse::().unwrap().partial_cmp(&a) - ); + a = a.mul_add("3".parse::().unwrap(), "4".parse::().unwrap()).value; + assert_eq!(Some(Ordering::Equal), "10".parse::().unwrap().partial_cmp(&a)); } #[test] @@ -464,18 +398,12 @@ fn ppc_double_double_round_to_integral() { { let a = "1.5".parse::().unwrap(); let a = a.round_to_integral(Round::NearestTiesToEven).value; - assert_eq!( - Some(Ordering::Equal), - "2".parse::().unwrap().partial_cmp(&a) - ); + assert_eq!(Some(Ordering::Equal), "2".parse::().unwrap().partial_cmp(&a)); } { let a = "2.5".parse::().unwrap(); let a = a.round_to_integral(Round::NearestTiesToEven).value; - assert_eq!( - Some(Ordering::Equal), - "2".parse::().unwrap().partial_cmp(&a) - ); + assert_eq!(Some(Ordering::Equal), "2".parse::().unwrap().partial_cmp(&a)); } } @@ -483,47 +411,25 @@ fn ppc_double_double_round_to_integral() { fn ppc_double_double_compare() { let data = [ // (1 + 0) = (1 + 0) - ( - 0x3ff0000000000000, - 0x3ff0000000000000, - Some(Ordering::Equal), - ), + (0x3ff0000000000000, 0x3ff0000000000000, Some(Ordering::Equal)), // (1 + 0) < (1.00...1 + 0) (0x3ff0000000000000, 0x3ff0000000000001, Some(Ordering::Less)), // (1.00...1 + 0) > (1 + 0) - ( - 0x3ff0000000000001, - 0x3ff0000000000000, - Some(Ordering::Greater), - ), + (0x3ff0000000000001, 0x3ff0000000000000, Some(Ordering::Greater)), // (1 + 0) < (1 + epsilon) - ( - 0x3ff0000000000000, - 0x0000000000000001_3ff0000000000001, - Some(Ordering::Less), - ), + (0x3ff0000000000000, 0x0000000000000001_3ff0000000000001, Some(Ordering::Less)), // NaN != NaN (0x7ff8000000000000, 0x7ff8000000000000, None), // (1 + 0) != NaN (0x3ff0000000000000, 0x7ff8000000000000, None), // Inf = Inf - ( - 0x7ff0000000000000, - 0x7ff0000000000000, - Some(Ordering::Equal), - ), + (0x7ff0000000000000, 0x7ff0000000000000, Some(Ordering::Equal)), ]; for &(op1, op2, expected) in &data { let a1 = DoubleDouble::from_bits(op1); let a2 = DoubleDouble::from_bits(op2); - assert_eq!( - expected, - a1.partial_cmp(&a2), - "compare({:#x}, {:#x})", - op1, - op2, - ); + assert_eq!(expected, a1.partial_cmp(&a2), "compare({:#x}, {:#x})", op1, op2,); } } @@ -537,11 +443,7 @@ fn ppc_double_double_bitwise_eq() { // NaN = NaN (0x7ff8000000000000, 0x7ff8000000000000, true), // NaN != NaN with a different bit pattern - ( - 0x7ff8000000000000, - 0x3ff0000000000000_7ff8000000000000, - false, - ), + (0x7ff8000000000000, 0x3ff0000000000000_7ff8000000000000, false), // Inf = Inf (0x7ff0000000000000, 0x7ff0000000000000, true), ]; @@ -569,27 +471,12 @@ fn ppc_double_double_change_sign() { #[test] fn ppc_double_double_factories() { assert_eq!(0, DoubleDouble::ZERO.to_bits()); - assert_eq!( - 0x7c8ffffffffffffe_7fefffffffffffff, - DoubleDouble::largest().to_bits() - ); + assert_eq!(0x7c8ffffffffffffe_7fefffffffffffff, DoubleDouble::largest().to_bits()); assert_eq!(0x0000000000000001, DoubleDouble::SMALLEST.to_bits()); - assert_eq!( - 0x0360000000000000, - DoubleDouble::smallest_normalized().to_bits() - ); - assert_eq!( - 0x0000000000000000_8000000000000000, - (-DoubleDouble::ZERO).to_bits() - ); - assert_eq!( - 0xfc8ffffffffffffe_ffefffffffffffff, - (-DoubleDouble::largest()).to_bits() - ); - assert_eq!( - 0x0000000000000000_8000000000000001, - (-DoubleDouble::SMALLEST).to_bits() - ); + assert_eq!(0x0360000000000000, DoubleDouble::smallest_normalized().to_bits()); + assert_eq!(0x0000000000000000_8000000000000000, (-DoubleDouble::ZERO).to_bits()); + assert_eq!(0xfc8ffffffffffffe_ffefffffffffffff, (-DoubleDouble::largest()).to_bits()); + assert_eq!(0x0000000000000000_8000000000000001, (-DoubleDouble::SMALLEST).to_bits()); assert_eq!( 0x0000000000000000_8360000000000000, (-DoubleDouble::smallest_normalized()).to_bits() diff --git a/src/librustc_asan/Cargo.toml b/src/librustc_asan/Cargo.toml deleted file mode 100644 index df117de872..0000000000 --- a/src/librustc_asan/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -authors = ["The Rust Project Developers"] -build = "build.rs" -name = "rustc_asan" -version = "0.0.0" -edition = "2018" - -[lib] -name = "rustc_asan" -path = "lib.rs" -test = false - -[build-dependencies] -build_helper = { path = "../build_helper" } -cmake = "0.1.38" - -[dependencies] -alloc = { path = "../liballoc" } -core = { path = "../libcore" } -compiler_builtins = "0.1.0" diff --git a/src/librustc_asan/build.rs b/src/librustc_asan/build.rs deleted file mode 100644 index 645707ccc0..0000000000 --- a/src/librustc_asan/build.rs +++ /dev/null @@ -1,30 +0,0 @@ -use std::env; -use build_helper::sanitizer_lib_boilerplate; - -use cmake::Config; - -fn main() { - println!("cargo:rerun-if-env-changed=RUSTC_BUILD_SANITIZERS"); - if env::var("RUSTC_BUILD_SANITIZERS") != Ok("1".to_string()) { - return; - } - if let Some(llvm_config) = env::var_os("LLVM_CONFIG") { - build_helper::restore_library_path(); - - let (native, target) = match sanitizer_lib_boilerplate("asan") { - Ok(native) => native, - _ => return, - }; - - Config::new(&native.src_dir) - .define("COMPILER_RT_BUILD_SANITIZERS", "ON") - .define("COMPILER_RT_BUILD_BUILTINS", "OFF") - .define("COMPILER_RT_BUILD_XRAY", "OFF") - .define("LLVM_CONFIG_PATH", llvm_config) - .out_dir(&native.out_dir) - .build_target(&target) - .build(); - native.fixup_sanitizer_lib_name("asan"); - } - println!("cargo:rerun-if-env-changed=LLVM_CONFIG"); -} diff --git a/src/librustc_asan/lib.rs b/src/librustc_asan/lib.rs deleted file mode 100644 index d6c8e54c18..0000000000 --- a/src/librustc_asan/lib.rs +++ /dev/null @@ -1,8 +0,0 @@ -#![sanitizer_runtime] -#![feature(nll)] -#![feature(sanitizer_runtime)] -#![feature(staged_api)] -#![no_std] -#![unstable(feature = "sanitizer_runtime_lib", - reason = "internal implementation detail of sanitizers", - issue = "0")] diff --git a/src/librustc_ast_lowering/Cargo.toml b/src/librustc_ast_lowering/Cargo.toml new file mode 100644 index 0000000000..4b786d6245 --- /dev/null +++ b/src/librustc_ast_lowering/Cargo.toml @@ -0,0 +1,23 @@ +[package] +authors = ["The Rust Project Developers"] +name = "rustc_ast_lowering" +version = "0.0.0" +edition = "2018" + +[lib] +name = "rustc_ast_lowering" +path = "lib.rs" +doctest = false + +[dependencies] +log = { version = "0.4", features = ["release_max_level_info", "std"] } +rustc = { path = "../librustc" } +rustc_hir = { path = "../librustc_hir" } +rustc_target = { path = "../librustc_target" } +rustc_data_structures = { path = "../librustc_data_structures" } +rustc_index = { path = "../librustc_index" } +rustc_span = { path = "../librustc_span" } +rustc_errors = { path = "../librustc_errors" } +rustc_session = { path = "../librustc_session" } +syntax = { path = "../libsyntax" } +smallvec = { version = "1.0", features = ["union", "may_dangle"] } diff --git a/src/librustc/hir/lowering/expr.rs b/src/librustc_ast_lowering/expr.rs similarity index 67% rename from src/librustc/hir/lowering/expr.rs rename to src/librustc_ast_lowering/expr.rs index f8465baeb1..5dc855e935 100644 --- a/src/librustc/hir/lowering/expr.rs +++ b/src/librustc_ast_lowering/expr.rs @@ -1,39 +1,41 @@ -use super::{LoweringContext, ParamMode, ParenthesizedGenericArgs, ImplTraitContext}; -use crate::hir::{self, HirVec}; -use crate::hir::def::Res; -use crate::hir::ptr::P; +use super::{ImplTraitContext, LoweringContext, ParamMode, ParenthesizedGenericArgs}; +use rustc::bug; use rustc_data_structures::thin_vec::ThinVec; - +use rustc_errors::struct_span_err; +use rustc_hir as hir; +use rustc_hir::def::Res; +use rustc_span::source_map::{respan, DesugaringKind, Span, Spanned}; +use rustc_span::symbol::{sym, Symbol}; +use syntax::ast::*; use syntax::attr; use syntax::ptr::P as AstP; -use syntax::ast::*; -use syntax::source_map::{respan, DesugaringKind, Span, Spanned}; -use syntax::symbol::{sym, Symbol}; -use rustc_error_codes::*; +impl<'hir> LoweringContext<'_, 'hir> { + fn lower_exprs(&mut self, exprs: &[AstP]) -> &'hir [hir::Expr<'hir>] { + self.arena.alloc_from_iter(exprs.iter().map(|x| self.lower_expr_mut(x))) + } -impl LoweringContext<'_> { - fn lower_exprs(&mut self, exprs: &[AstP]) -> HirVec { - exprs.iter().map(|x| self.lower_expr(x)).collect() + pub(super) fn lower_expr(&mut self, e: &Expr) -> &'hir hir::Expr<'hir> { + self.arena.alloc(self.lower_expr_mut(e)) } - pub(super) fn lower_expr(&mut self, e: &Expr) -> hir::Expr { + pub(super) fn lower_expr_mut(&mut self, e: &Expr) -> hir::Expr<'hir> { let kind = match e.kind { - ExprKind::Box(ref inner) => hir::ExprKind::Box(P(self.lower_expr(inner))), + ExprKind::Box(ref inner) => hir::ExprKind::Box(self.lower_expr(inner)), ExprKind::Array(ref exprs) => hir::ExprKind::Array(self.lower_exprs(exprs)), ExprKind::Repeat(ref expr, ref count) => { - let expr = P(self.lower_expr(expr)); + let expr = self.lower_expr(expr); let count = self.lower_anon_const(count); hir::ExprKind::Repeat(expr, count) } ExprKind::Tup(ref elts) => hir::ExprKind::Tup(self.lower_exprs(elts)), ExprKind::Call(ref f, ref args) => { - let f = P(self.lower_expr(f)); + let f = self.lower_expr(f); hir::ExprKind::Call(f, self.lower_exprs(args)) } ExprKind::MethodCall(ref seg, ref args) => { - let hir_seg = P(self.lower_path_segment( + let hir_seg = self.arena.alloc(self.lower_path_segment( e.span, seg, ParamMode::Optional, @@ -47,26 +49,28 @@ impl LoweringContext<'_> { } ExprKind::Binary(binop, ref lhs, ref rhs) => { let binop = self.lower_binop(binop); - let lhs = P(self.lower_expr(lhs)); - let rhs = P(self.lower_expr(rhs)); + let lhs = self.lower_expr(lhs); + let rhs = self.lower_expr(rhs); hir::ExprKind::Binary(binop, lhs, rhs) } ExprKind::Unary(op, ref ohs) => { let op = self.lower_unop(op); - let ohs = P(self.lower_expr(ohs)); + let ohs = self.lower_expr(ohs); hir::ExprKind::Unary(op, ohs) } ExprKind::Lit(ref l) => hir::ExprKind::Lit(respan(l.span, l.kind.clone())), ExprKind::Cast(ref expr, ref ty) => { - let expr = P(self.lower_expr(expr)); - hir::ExprKind::Cast(expr, self.lower_ty(ty, ImplTraitContext::disallowed())) + let expr = self.lower_expr(expr); + let ty = self.lower_ty(ty, ImplTraitContext::disallowed()); + hir::ExprKind::Cast(expr, ty) } ExprKind::Type(ref expr, ref ty) => { - let expr = P(self.lower_expr(expr)); - hir::ExprKind::Type(expr, self.lower_ty(ty, ImplTraitContext::disallowed())) + let expr = self.lower_expr(expr); + let ty = self.lower_ty(ty, ImplTraitContext::disallowed()); + hir::ExprKind::Type(expr, ty) } ExprKind::AddrOf(k, m, ref ohs) => { - let ohs = P(self.lower_expr(ohs)); + let ohs = self.lower_expr(ohs); hir::ExprKind::AddrOf(k, m, ohs) } ExprKind::Let(ref pat, ref scrutinee) => self.lower_expr_let(e.span, pat, scrutinee), @@ -77,52 +81,57 @@ impl LoweringContext<'_> { this.lower_expr_while_in_loop_scope(e.span, cond, body, opt_label) }), ExprKind::Loop(ref body, opt_label) => self.with_loop_scope(e.id, |this| { - hir::ExprKind::Loop( - this.lower_block(body, false), - this.lower_label(opt_label), - hir::LoopSource::Loop, - ) + hir::ExprKind::Loop(this.lower_block(body, false), opt_label, hir::LoopSource::Loop) }), ExprKind::TryBlock(ref body) => self.lower_expr_try_block(body), ExprKind::Match(ref expr, ref arms) => hir::ExprKind::Match( - P(self.lower_expr(expr)), - arms.iter().map(|x| self.lower_arm(x)).collect(), + self.lower_expr(expr), + self.arena.alloc_from_iter(arms.iter().map(|x| self.lower_arm(x))), hir::MatchSource::Normal, ), - ExprKind::Async(capture_clause, closure_node_id, ref block) => { - self.make_async_expr( - capture_clause, - closure_node_id, - None, - block.span, - hir::AsyncGeneratorKind::Block, - |this| this.with_new_scopes(|this| this.lower_block_expr(block)), - ) - } + ExprKind::Async(capture_clause, closure_node_id, ref block) => self.make_async_expr( + capture_clause, + closure_node_id, + None, + block.span, + hir::AsyncGeneratorKind::Block, + |this| this.with_new_scopes(|this| this.lower_block_expr(block)), + ), ExprKind::Await(ref expr) => self.lower_expr_await(e.span, expr), ExprKind::Closure( - capture_clause, asyncness, movability, ref decl, ref body, fn_decl_span - ) => if let IsAsync::Async { closure_id, .. } = asyncness { - self.lower_expr_async_closure(capture_clause, closure_id, decl, body, fn_decl_span) - } else { - self.lower_expr_closure(capture_clause, movability, decl, body, fn_decl_span) + capture_clause, + asyncness, + movability, + ref decl, + ref body, + fn_decl_span, + ) => { + if let IsAsync::Async { closure_id, .. } = asyncness { + self.lower_expr_async_closure( + capture_clause, + closure_id, + decl, + body, + fn_decl_span, + ) + } else { + self.lower_expr_closure(capture_clause, movability, decl, body, fn_decl_span) + } } ExprKind::Block(ref blk, opt_label) => { - hir::ExprKind::Block(self.lower_block(blk, - opt_label.is_some()), - self.lower_label(opt_label)) + hir::ExprKind::Block(self.lower_block(blk, opt_label.is_some()), opt_label) } - ExprKind::Assign(ref el, ref er) => { - hir::ExprKind::Assign(P(self.lower_expr(el)), P(self.lower_expr(er))) + ExprKind::Assign(ref el, ref er, span) => { + hir::ExprKind::Assign(self.lower_expr(el), self.lower_expr(er), span) } ExprKind::AssignOp(op, ref el, ref er) => hir::ExprKind::AssignOp( self.lower_binop(op), - P(self.lower_expr(el)), - P(self.lower_expr(er)), + self.lower_expr(el), + self.lower_expr(er), ), - ExprKind::Field(ref el, ident) => hir::ExprKind::Field(P(self.lower_expr(el)), ident), + ExprKind::Field(ref el, ident) => hir::ExprKind::Field(self.lower_expr(el), ident), ExprKind::Index(ref el, ref er) => { - hir::ExprKind::Index(P(self.lower_expr(el)), P(self.lower_expr(er))) + hir::ExprKind::Index(self.lower_expr(el), self.lower_expr(er)) } ExprKind::Range(Some(ref e1), Some(ref e2), RangeLimits::Closed) => { self.lower_expr_range_closed(e.span, e1, e2) @@ -141,29 +150,33 @@ impl LoweringContext<'_> { hir::ExprKind::Path(qpath) } ExprKind::Break(opt_label, ref opt_expr) => { - hir::ExprKind::Break( - self.lower_jump_destination(e.id, opt_label), - opt_expr.as_ref().map(|x| P(self.lower_expr(x))), - ) + let opt_expr = opt_expr.as_ref().map(|x| self.lower_expr(x)); + hir::ExprKind::Break(self.lower_jump_destination(e.id, opt_label), opt_expr) } ExprKind::Continue(opt_label) => { hir::ExprKind::Continue(self.lower_jump_destination(e.id, opt_label)) } - ExprKind::Ret(ref e) => hir::ExprKind::Ret(e.as_ref().map(|x| P(self.lower_expr(x)))), + ExprKind::Ret(ref e) => { + let e = e.as_ref().map(|x| self.lower_expr(x)); + hir::ExprKind::Ret(e) + } ExprKind::InlineAsm(ref asm) => self.lower_expr_asm(asm), - ExprKind::Struct(ref path, ref fields, ref maybe_expr) => hir::ExprKind::Struct( - P(self.lower_qpath( - e.id, - &None, - path, - ParamMode::Optional, - ImplTraitContext::disallowed(), - )), - fields.iter().map(|x| self.lower_field(x)).collect(), - maybe_expr.as_ref().map(|x| P(self.lower_expr(x))), - ), + ExprKind::Struct(ref path, ref fields, ref maybe_expr) => { + let maybe_expr = maybe_expr.as_ref().map(|x| self.lower_expr(x)); + hir::ExprKind::Struct( + self.arena.alloc(self.lower_qpath( + e.id, + &None, + path, + ParamMode::Optional, + ImplTraitContext::disallowed(), + )), + self.arena.alloc_from_iter(fields.iter().map(|x| self.lower_field(x))), + maybe_expr, + ) + } ExprKind::Paren(ref ex) => { - let mut ex = self.lower_expr(ex); + let mut ex = self.lower_expr_mut(ex); // Include parens in span, but only if it is a super-span. if e.span.contains(ex.span) { ex.span = e.span; @@ -192,15 +205,15 @@ impl LoweringContext<'_> { hir_id: self.lower_node_id(e.id), kind, span: e.span, - attrs: e.attrs.clone(), + attrs: e.attrs.iter().map(|a| self.lower_attr(a)).collect::>().into(), } } fn lower_unop(&mut self, u: UnOp) -> hir::UnOp { match u { - UnOp::Deref => hir::UnDeref, - UnOp::Not => hir::UnNot, - UnOp::Neg => hir::UnNeg, + UnOp::Deref => hir::UnOp::UnDeref, + UnOp::Not => hir::UnOp::UnNot, + UnOp::Neg => hir::UnOp::UnNeg, } } @@ -234,7 +247,7 @@ impl LoweringContext<'_> { /// ```rust /// match scrutinee { pats => true, _ => false } /// ``` - fn lower_expr_let(&mut self, span: Span, pat: &Pat, scrutinee: &Expr) -> hir::ExprKind { + fn lower_expr_let(&mut self, span: Span, pat: &Pat, scrutinee: &Expr) -> hir::ExprKind<'hir> { // If we got here, the `let` expression is not allowed. if self.sess.opts.unstable_features.is_nightly_build() { @@ -243,8 +256,7 @@ impl LoweringContext<'_> { .note("only supported directly in conditions of `if`- and `while`-expressions") .note("as well as when nested within `&&` and parenthesis in those conditions") .emit(); - } - else { + } else { self.sess .struct_span_err(span, "expected expression, found statement (`let`)") .note("variable declaration using `let` is a statement") @@ -264,16 +276,16 @@ impl LoweringContext<'_> { let then_arm = { let pat = self.lower_pat(pat); let expr = self.expr_bool(span, true); - self.arm(pat, P(expr)) + self.arm(pat, expr) }; let else_arm = { let pat = self.pat_wild(span); let expr = self.expr_bool(span, false); - self.arm(pat, P(expr)) + self.arm(pat, expr) }; hir::ExprKind::Match( - P(scrutinee), - vec![then_arm, else_arm].into(), + scrutinee, + arena_vec![self; then_arm, else_arm], hir::MatchSource::Normal, ) } @@ -284,7 +296,7 @@ impl LoweringContext<'_> { cond: &Expr, then: &Block, else_opt: Option<&Expr>, - ) -> hir::ExprKind { + ) -> hir::ExprKind<'hir> { // FIXME(#53667): handle lowering of && and parens. // `_ => else_block` where `else_block` is `{}` if there's `None`: @@ -293,7 +305,7 @@ impl LoweringContext<'_> { None => (self.expr_block_empty(span), false), Some(els) => (self.lower_expr(els), true), }; - let else_arm = self.arm(else_pat, P(else_expr)); + let else_arm = self.arm(else_pat, else_expr); // Handle then + scrutinee: let then_expr = self.lower_block_expr(then); @@ -308,22 +320,19 @@ impl LoweringContext<'_> { _ => { // Lower condition: let cond = self.lower_expr(cond); - let span_block = self.mark_span_with_reason( - DesugaringKind::CondTemporary, - cond.span, - None - ); + let span_block = + self.mark_span_with_reason(DesugaringKind::CondTemporary, cond.span, None); // Wrap in a construct equivalent to `{ let _t = $cond; _t }` // to preserve drop semantics since `if cond { ... }` does not // let temporaries live outside of `cond`. - let cond = self.expr_drop_temps(span_block, P(cond), ThinVec::new()); + let cond = self.expr_drop_temps(span_block, cond, ThinVec::new()); let pat = self.pat_bool(span, true); (pat, cond, hir::MatchSource::IfDesugar { contains_else_clause }) } }; - let then_arm = self.arm(then_pat, P(then_expr)); + let then_arm = self.arm(then_pat, self.arena.alloc(then_expr)); - hir::ExprKind::Match(P(scrutinee), vec![then_arm, else_arm].into(), desugar) + hir::ExprKind::Match(scrutinee, arena_vec![self; then_arm, else_arm], desugar) } fn lower_expr_while_in_loop_scope( @@ -331,8 +340,8 @@ impl LoweringContext<'_> { span: Span, cond: &Expr, body: &Block, - opt_label: Option

  • Ok(LinkOrCopy::Link), - Err(_) => { - match fs::copy(p, q) { - Ok(_) => Ok(LinkOrCopy::Copy), - Err(e) => Err(e), - } - } + Err(_) => match fs::copy(p, q) { + Ok(_) => Ok(LinkOrCopy::Copy), + Err(e) => Err(e), + }, } } @@ -86,29 +84,28 @@ pub enum RenameOrCopyRemove { /// Rename `p` into `q`, preferring to use `rename` if possible. /// If `rename` fails (rename may fail for reasons such as crossing /// filesystem), fallback to copy & remove -pub fn rename_or_copy_remove, Q: AsRef>(p: P, - q: Q) - -> io::Result { +pub fn rename_or_copy_remove, Q: AsRef>( + p: P, + q: Q, +) -> io::Result { let p = p.as_ref(); let q = q.as_ref(); match fs::rename(p, q) { Ok(()) => Ok(RenameOrCopyRemove::Rename), - Err(_) => { - match fs::copy(p, q) { - Ok(_) => { - fs::remove_file(p)?; - Ok(RenameOrCopyRemove::CopyRemove) - } - Err(e) => Err(e), + Err(_) => match fs::copy(p, q) { + Ok(_) => { + fs::remove_file(p)?; + Ok(RenameOrCopyRemove::CopyRemove) } - } + Err(e) => Err(e), + }, } } #[cfg(unix)] pub fn path_to_c_string(p: &Path) -> CString { - use std::os::unix::ffi::OsStrExt; use std::ffi::OsStr; + use std::os::unix::ffi::OsStrExt; let p: &OsStr = p.as_ref(); CString::new(p.as_bytes()).unwrap() } diff --git a/src/librustc_hir/Cargo.toml b/src/librustc_hir/Cargo.toml new file mode 100644 index 0000000000..f2e420dbae --- /dev/null +++ b/src/librustc_hir/Cargo.toml @@ -0,0 +1,22 @@ +[package] +authors = ["The Rust Project Developers"] +name = "rustc_hir" +version = "0.0.0" +edition = "2018" + +[lib] +name = "rustc_hir" +path = "lib.rs" +doctest = false + +[dependencies] +rustc_target = { path = "../librustc_target" } +rustc_macros = { path = "../librustc_macros" } +rustc_data_structures = { path = "../librustc_data_structures" } +rustc_index = { path = "../librustc_index" } +rustc_span = { path = "../librustc_span" } +rustc_errors = { path = "../librustc_errors" } +rustc_serialize = { path = "../libserialize", package = "serialize" } +rustc_session = { path = "../librustc_session" } +syntax = { path = "../libsyntax" } +smallvec = { version = "1.0", features = ["union", "may_dangle"] } diff --git a/src/librustc/hir/def.rs b/src/librustc_hir/def.rs similarity index 81% rename from src/librustc/hir/def.rs rename to src/librustc_hir/def.rs index 231b054f97..83e30d85c5 100644 --- a/src/librustc/hir/def.rs +++ b/src/librustc_hir/def.rs @@ -1,20 +1,16 @@ -use self::Namespace::*; - -use crate::hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; +use crate::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use crate::hir; -use crate::ty; -use crate::util::nodemap::DefIdMap; +use rustc_macros::HashStable_Generic; +use rustc_span::hygiene::MacroKind; use syntax::ast; use syntax::ast::NodeId; -use syntax_pos::hygiene::MacroKind; -use syntax_pos::Span; -use rustc_macros::HashStable; use std::fmt::Debug; /// Encodes if a `DefKind::Ctor` is the constructor of an enum variant or a struct. -#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, HashStable)] +#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] +#[derive(HashStable_Generic)] pub enum CtorOf { /// This `DefKind::Ctor` is a synthesized constructor of a tuple or unit struct. Struct, @@ -22,7 +18,8 @@ pub enum CtorOf { Variant, } -#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, HashStable)] +#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] +#[derive(HashStable_Generic)] pub enum CtorKind { /// Constructor function automatically created by a tuple struct/variant. Fn, @@ -32,7 +29,8 @@ pub enum CtorKind { Fictive, } -#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, HashStable)] +#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] +#[derive(HashStable_Generic)] pub enum NonMacroAttrKind { /// Single-segment attribute defined by the language (`#[inline]`) Builtin, @@ -44,7 +42,8 @@ pub enum NonMacroAttrKind { Registered, } -#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, HashStable)] +#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] +#[derive(HashStable_Generic)] pub enum DefKind { // Type namespace Mod, @@ -84,8 +83,9 @@ impl DefKind { pub fn descr(self, def_id: DefId) -> &'static str { match self { DefKind::Fn => "function", - DefKind::Mod if def_id.index == CRATE_DEF_INDEX && def_id.krate != LOCAL_CRATE => - "crate", + DefKind::Mod if def_id.index == CRATE_DEF_INDEX && def_id.krate != LOCAL_CRATE => { + "crate" + } DefKind::Mod => "module", DefKind::Static => "static", DefKind::Enum => "enum", @@ -96,8 +96,9 @@ impl DefKind { DefKind::Struct => "struct", DefKind::Ctor(CtorOf::Struct, CtorKind::Fn) => "tuple struct", DefKind::Ctor(CtorOf::Struct, CtorKind::Const) => "unit struct", - DefKind::Ctor(CtorOf::Struct, CtorKind::Fictive) => - bug!("impossible struct constructor"), + DefKind::Ctor(CtorOf::Struct, CtorKind::Fictive) => { + panic!("impossible struct constructor") + } DefKind::OpaqueTy => "opaque type", DefKind::TyAlias => "type alias", DefKind::TraitAlias => "trait alias", @@ -157,27 +158,24 @@ impl DefKind { } } -#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, HashStable)] +#[derive(Clone, Copy, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] +#[derive(HashStable_Generic)] pub enum Res { Def(DefKind, DefId), // Type namespace - PrimTy(hir::PrimTy), SelfTy(Option /* trait */, Option /* impl */), ToolMod, // e.g., `rustfmt` in `#[rustfmt::skip]` // Value namespace - - SelfCtor(DefId /* impl */), // `DefId` refers to the impl + SelfCtor(DefId /* impl */), // `DefId` refers to the impl Local(Id), // Macro namespace - NonMacroAttr(NonMacroAttrKind), // e.g., `#[inline]` or `#[rustfmt::skip]` // All namespaces - Err, } @@ -211,7 +209,9 @@ impl PartialRes { #[inline] pub fn with_unresolved_segments(base_res: Res, mut unresolved_segments: usize) -> Self { - if base_res == Res::Err { unresolved_segments = 0 } + if base_res == Res::Err { + unresolved_segments = 0 + } PartialRes { base_res, unresolved_segments } } @@ -239,9 +239,9 @@ pub enum Namespace { impl Namespace { pub fn descr(self) -> &'static str { match self { - TypeNS => "type", - ValueNS => "value", - MacroNS => "macro", + Self::TypeNS => "type", + Self::ValueNS => "value", + Self::MacroNS => "macro", } } } @@ -256,11 +256,7 @@ pub struct PerNS { impl PerNS { pub fn map U>(self, mut f: F) -> PerNS { - PerNS { - value_ns: f(self.value_ns), - type_ns: f(self.type_ns), - macro_ns: f(self.macro_ns), - } + PerNS { value_ns: f(self.value_ns), type_ns: f(self.type_ns), macro_ns: f(self.macro_ns) } } } @@ -269,9 +265,9 @@ impl ::std::ops::Index for PerNS { fn index(&self, ns: Namespace) -> &T { match ns { - ValueNS => &self.value_ns, - TypeNS => &self.type_ns, - MacroNS => &self.macro_ns, + Namespace::ValueNS => &self.value_ns, + Namespace::TypeNS => &self.type_ns, + Namespace::MacroNS => &self.macro_ns, } } } @@ -279,9 +275,9 @@ impl ::std::ops::Index for PerNS { impl ::std::ops::IndexMut for PerNS { fn index_mut(&mut self, ns: Namespace) -> &mut T { match ns { - ValueNS => &mut self.value_ns, - TypeNS => &mut self.type_ns, - MacroNS => &mut self.macro_ns, + Namespace::ValueNS => &mut self.value_ns, + Namespace::TypeNS => &mut self.type_ns, + Namespace::MacroNS => &mut self.macro_ns, } } } @@ -293,41 +289,10 @@ impl PerNS> { } /// Returns an iterator over the items which are `Some`. - pub fn present_items(self) -> impl Iterator { + pub fn present_items(self) -> impl Iterator { use std::iter::once; - once(self.type_ns) - .chain(once(self.value_ns)) - .chain(once(self.macro_ns)) - .filter_map(|it| it) - } -} - -/// This is the replacement export map. It maps a module to all of the exports -/// within. -pub type ExportMap = DefIdMap>>; - -#[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] -pub struct Export { - /// The name of the target. - pub ident: ast::Ident, - /// The resolution of the target. - pub res: Res, - /// The span of the target. - pub span: Span, - /// The visibility of the export. - /// We include non-`pub` exports for hygienic macros that get used from extern crates. - pub vis: ty::Visibility, -} - -impl Export { - pub fn map_id(self, map: impl FnMut(Id) -> R) -> Export { - Export { - ident: self.ident, - res: self.res.map_id(map), - span: self.span, - vis: self.vis, - } + once(self.type_ns).chain(once(self.value_ns)).chain(once(self.macro_ns)).filter_map(|it| it) } } @@ -340,7 +305,7 @@ impl CtorKind { } } - pub fn from_hir(vdata: &hir::VariantData) -> CtorKind { + pub fn from_hir(vdata: &hir::VariantData<'_>) -> CtorKind { match *vdata { hir::VariantData::Tuple(..) => CtorKind::Fn, hir::VariantData::Unit(..) => CtorKind::Const, @@ -370,7 +335,7 @@ impl NonMacroAttrKind { pub fn is_used(self) -> bool { match self { NonMacroAttrKind::Tool | NonMacroAttrKind::DeriveHelper => true, - NonMacroAttrKind::Builtin | NonMacroAttrKind::Registered => false, + NonMacroAttrKind::Builtin | NonMacroAttrKind::Registered => false, } } } @@ -381,9 +346,8 @@ impl Res { where Id: Debug, { - self.opt_def_id().unwrap_or_else(|| { - bug!("attempted .def_id() on invalid res: {:?}", self) - }) + self.opt_def_id() + .unwrap_or_else(|| panic!("attempted .def_id() on invalid res: {:?}", self)) } /// Return `Some(..)` with the `DefId` of this `Res` if it has a ID, else `None`. @@ -391,15 +355,13 @@ impl Res { match *self { Res::Def(_, id) => Some(id), - Res::Local(..) | - Res::PrimTy(..) | - Res::SelfTy(..) | - Res::SelfCtor(..) | - Res::ToolMod | - Res::NonMacroAttr(..) | - Res::Err => { - None - } + Res::Local(..) + | Res::PrimTy(..) + | Res::SelfTy(..) + | Res::SelfCtor(..) + | Res::ToolMod + | Res::NonMacroAttr(..) + | Res::Err => None, } } diff --git a/src/librustc/hir/def_id.rs b/src/librustc_hir/def_id.rs similarity index 65% rename from src/librustc/hir/def_id.rs rename to src/librustc_hir/def_id.rs index 13200b38f2..7ee778ddd8 100644 --- a/src/librustc/hir/def_id.rs +++ b/src/librustc_hir/def_id.rs @@ -1,7 +1,8 @@ -use crate::ty::{self, TyCtxt}; +use rustc_data_structures::AtomicRef; use rustc_index::vec::Idx; +use rustc_serialize::{Decoder, Encoder}; use std::fmt; -use std::u32; +use std::{u32, u64}; rustc_index::newtype_index! { pub struct CrateId { @@ -40,7 +41,7 @@ impl Idx for CrateNum { fn index(self) -> usize { match self { CrateNum::Index(idx) => Idx::index(idx), - _ => bug!("Tried to get crate index of {:?}", self), + _ => panic!("Tried to get crate index of {:?}", self), } } } @@ -61,18 +62,20 @@ impl CrateNum { pub fn as_usize(self) -> usize { match self { CrateNum::Index(id) => id.as_usize(), - _ => bug!("tried to get index of non-standard crate {:?}", self), + _ => panic!("tried to get index of non-standard crate {:?}", self), } } pub fn as_u32(self) -> u32 { match self { CrateNum::Index(id) => id.as_u32(), - _ => bug!("tried to get index of non-standard crate {:?}", self), + _ => panic!("tried to get index of non-standard crate {:?}", self), } } - pub fn as_def_id(&self) -> DefId { DefId { krate: *self, index: CRATE_DEF_INDEX } } + pub fn as_def_id(&self) -> DefId { + DefId { krate: *self, index: CRATE_DEF_INDEX } + } } impl fmt::Display for CrateNum { @@ -84,8 +87,18 @@ impl fmt::Display for CrateNum { } } -impl rustc_serialize::UseSpecializedEncodable for CrateNum {} -impl rustc_serialize::UseSpecializedDecodable for CrateNum {} +/// As a local identifier, a `CrateNum` is only meaningful within its context, e.g. within a tcx. +/// Therefore, make sure to include the context when encode a `CrateNum`. +impl rustc_serialize::UseSpecializedEncodable for CrateNum { + fn default_encode(&self, e: &mut E) -> Result<(), E::Error> { + e.emit_u32(self.as_u32()) + } +} +impl rustc_serialize::UseSpecializedDecodable for CrateNum { + fn default_decode(d: &mut D) -> Result { + Ok(CrateNum::from_u32(d.read_u32()?)) + } +} rustc_index::newtype_index! { /// A DefIndex is an index into the hir-map for a crate, identifying a @@ -111,21 +124,6 @@ pub struct DefId { pub index: DefIndex, } -impl fmt::Debug for DefId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "DefId({}:{}", self.krate, self.index.index())?; - - ty::tls::with_opt(|opt_tcx| { - if let Some(tcx) = opt_tcx { - write!(f, " ~ {}", tcx.def_path_debug_str(*self))?; - } - Ok(()) - })?; - - write!(f, ")") - } -} - impl DefId { /// Makes a local `DefId` from the given `DefIndex`. #[inline] @@ -143,17 +141,41 @@ impl DefId { LocalDefId::from_def_id(self) } - pub fn describe_as_module(&self, tcx: TyCtxt<'_>) -> String { - if self.is_local() && self.index == CRATE_DEF_INDEX { - format!("top-level module") - } else { - format!("module `{}`", tcx.def_path_str(*self)) - } + pub fn is_top_level_module(self) -> bool { + self.is_local() && self.index == CRATE_DEF_INDEX } } -impl rustc_serialize::UseSpecializedEncodable for DefId {} -impl rustc_serialize::UseSpecializedDecodable for DefId {} +impl rustc_serialize::UseSpecializedEncodable for DefId { + fn default_encode(&self, s: &mut S) -> Result<(), S::Error> { + let krate = u64::from(self.krate.as_u32()); + let index = u64::from(self.index.as_u32()); + s.emit_u64((krate << 32) | index) + } +} +impl rustc_serialize::UseSpecializedDecodable for DefId { + fn default_decode(d: &mut D) -> Result { + let def_id = d.read_u64()?; + let krate = CrateNum::from_u32((def_id >> 32) as u32); + let index = DefIndex::from_u32((def_id & 0xffffffff) as u32); + Ok(DefId { krate, index }) + } +} + +pub fn default_def_id_debug(def_id: DefId, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("DefId").field("krate", &def_id.krate).field("index", &def_id.index).finish() +} + +pub static DEF_ID_DEBUG: AtomicRef) -> fmt::Result> = + AtomicRef::new(&(default_def_id_debug as fn(_, &mut fmt::Formatter<'_>) -> _)); + +impl fmt::Debug for DefId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + (*DEF_ID_DEBUG)(*self, f) + } +} + +rustc_data_structures::define_id_collections!(DefIdMap, DefIdSet, DefId); /// A LocalDefId is equivalent to a DefId with `krate == LOCAL_CRATE`. Since /// we encode this information in the type, we can ensure at compile time that @@ -173,10 +195,7 @@ impl LocalDefId { #[inline] pub fn to_def_id(self) -> DefId { - DefId { - krate: LOCAL_CRATE, - index: self.0 - } + DefId { krate: LOCAL_CRATE, index: self.0 } } } diff --git a/src/librustc_hir/hir.rs b/src/librustc_hir/hir.rs new file mode 100644 index 0000000000..b62a7e413e --- /dev/null +++ b/src/librustc_hir/hir.rs @@ -0,0 +1,2633 @@ +use crate::def::{DefKind, Res}; +use crate::def_id::DefId; +crate use crate::hir_id::HirId; +use crate::itemlikevisit; +use crate::print; + +crate use BlockCheckMode::*; +crate use FunctionRetTy::*; +crate use UnsafeSource::*; + +use rustc_data_structures::fx::FxHashSet; +use rustc_data_structures::sync::{par_for_each_in, Send, Sync}; +use rustc_errors::FatalError; +use rustc_macros::HashStable_Generic; +use rustc_session::node_id::NodeMap; +use rustc_span::source_map::{SourceMap, Spanned}; +use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_span::{MultiSpan, Span, DUMMY_SP}; +use rustc_target::spec::abi::Abi; +use smallvec::SmallVec; +use std::collections::{BTreeMap, BTreeSet}; +use std::fmt; +use syntax::ast::{self, AsmDialect, CrateSugar, Ident, Name, NodeId}; +use syntax::ast::{AttrVec, Attribute, FloatTy, IntTy, Label, LitKind, StrStyle, UintTy}; +pub use syntax::ast::{BorrowKind, ImplPolarity, IsAuto}; +pub use syntax::ast::{CaptureBy, Constness, Movability, Mutability, Unsafety}; +use syntax::tokenstream::TokenStream; +use syntax::util::parser::ExprPrecedence; + +#[derive(Copy, Clone, RustcEncodable, RustcDecodable, HashStable_Generic)] +pub struct Lifetime { + pub hir_id: HirId, + pub span: Span, + + /// Either "`'a`", referring to a named lifetime definition, + /// or "``" (i.e., `kw::Invalid`), for elision placeholders. + /// + /// HIR lowering inserts these placeholders in type paths that + /// refer to type definitions needing lifetime parameters, + /// `&T` and `&mut T`, and trait objects without `... + 'a`. + pub name: LifetimeName, +} + +#[derive(Debug, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Copy)] +#[derive(HashStable_Generic)] +pub enum ParamName { + /// Some user-given name like `T` or `'x`. + Plain(Ident), + + /// Synthetic name generated when user elided a lifetime in an impl header. + /// + /// E.g., the lifetimes in cases like these: + /// + /// impl Foo for &u32 + /// impl Foo<'_> for u32 + /// + /// in that case, we rewrite to + /// + /// impl<'f> Foo for &'f u32 + /// impl<'f> Foo<'f> for u32 + /// + /// where `'f` is something like `Fresh(0)`. The indices are + /// unique per impl, but not necessarily continuous. + Fresh(usize), + + /// Indicates an illegal name was given and an error has been + /// reported (so we should squelch other derived errors). Occurs + /// when, e.g., `'_` is used in the wrong place. + Error, +} + +impl ParamName { + pub fn ident(&self) -> Ident { + match *self { + ParamName::Plain(ident) => ident, + ParamName::Fresh(_) | ParamName::Error => { + Ident::with_dummy_span(kw::UnderscoreLifetime) + } + } + } + + pub fn modern(&self) -> ParamName { + match *self { + ParamName::Plain(ident) => ParamName::Plain(ident.modern()), + param_name => param_name, + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Copy)] +#[derive(HashStable_Generic)] +pub enum LifetimeName { + /// User-given names or fresh (synthetic) names. + Param(ParamName), + + /// User wrote nothing (e.g., the lifetime in `&u32`). + Implicit, + + /// Implicit lifetime in a context like `dyn Foo`. This is + /// distinguished from implicit lifetimes elsewhere because the + /// lifetime that they default to must appear elsewhere within the + /// enclosing type. This means that, in an `impl Trait` context, we + /// don't have to create a parameter for them. That is, `impl + /// Trait` expands to an opaque type like `type + /// Foo<'a> = impl Trait`, but `impl Trait` expands to `type Foo = impl Trait`. The latter uses `ImplicitObjectLifetimeDefault` so + /// that surrounding code knows not to create a lifetime + /// parameter. + ImplicitObjectLifetimeDefault, + + /// Indicates an error during lowering (usually `'_` in wrong place) + /// that was already reported. + Error, + + /// User wrote specifies `'_`. + Underscore, + + /// User wrote `'static`. + Static, +} + +impl LifetimeName { + pub fn ident(&self) -> Ident { + match *self { + LifetimeName::ImplicitObjectLifetimeDefault + | LifetimeName::Implicit + | LifetimeName::Error => Ident::invalid(), + LifetimeName::Underscore => Ident::with_dummy_span(kw::UnderscoreLifetime), + LifetimeName::Static => Ident::with_dummy_span(kw::StaticLifetime), + LifetimeName::Param(param_name) => param_name.ident(), + } + } + + pub fn is_elided(&self) -> bool { + match self { + LifetimeName::ImplicitObjectLifetimeDefault + | LifetimeName::Implicit + | LifetimeName::Underscore => true, + + // It might seem surprising that `Fresh(_)` counts as + // *not* elided -- but this is because, as far as the code + // in the compiler is concerned -- `Fresh(_)` variants act + // equivalently to "some fresh name". They correspond to + // early-bound regions on an impl, in other words. + LifetimeName::Error | LifetimeName::Param(_) | LifetimeName::Static => false, + } + } + + fn is_static(&self) -> bool { + self == &LifetimeName::Static + } + + pub fn modern(&self) -> LifetimeName { + match *self { + LifetimeName::Param(param_name) => LifetimeName::Param(param_name.modern()), + lifetime_name => lifetime_name, + } + } +} + +impl fmt::Display for Lifetime { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.name.ident().fmt(f) + } +} + +impl fmt::Debug for Lifetime { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "lifetime({}: {})", + self.hir_id, + print::to_string(print::NO_ANN, |s| s.print_lifetime(self)) + ) + } +} + +impl Lifetime { + pub fn is_elided(&self) -> bool { + self.name.is_elided() + } + + pub fn is_static(&self) -> bool { + self.name.is_static() + } +} + +/// A `Path` is essentially Rust's notion of a name; for instance, +/// `std::cmp::PartialEq`. It's represented as a sequence of identifiers, +/// along with a bunch of supporting information. +#[derive(RustcEncodable, RustcDecodable, HashStable_Generic)] +pub struct Path<'hir> { + pub span: Span, + /// The resolution for the path. + pub res: Res, + /// The segments in the path: the things separated by `::`. + pub segments: &'hir [PathSegment<'hir>], +} + +impl Path<'_> { + pub fn is_global(&self) -> bool { + !self.segments.is_empty() && self.segments[0].ident.name == kw::PathRoot + } +} + +impl fmt::Debug for Path<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "path({})", self) + } +} + +impl fmt::Display for Path<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", print::to_string(print::NO_ANN, |s| s.print_path(self, false))) + } +} + +/// A segment of a path: an identifier, an optional lifetime, and a set of +/// types. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct PathSegment<'hir> { + /// The identifier portion of this path segment. + #[stable_hasher(project(name))] + pub ident: Ident, + // `id` and `res` are optional. We currently only use these in save-analysis, + // any path segments without these will not have save-analysis info and + // therefore will not have 'jump to def' in IDEs, but otherwise will not be + // affected. (In general, we don't bother to get the defs for synthesized + // segments, only for segments which have come from the AST). + pub hir_id: Option, + pub res: Option, + + /// Type/lifetime parameters attached to this path. They come in + /// two flavors: `Path` and `Path(A,B) -> C`. Note that + /// this is more than just simple syntactic sugar; the use of + /// parens affects the region binding rules, so we preserve the + /// distinction. + pub args: Option<&'hir GenericArgs<'hir>>, + + /// Whether to infer remaining type parameters, if any. + /// This only applies to expression and pattern paths, and + /// out of those only the segments with no type parameters + /// to begin with, e.g., `Vec::new` is `>::new::<..>`. + pub infer_args: bool, +} + +impl<'hir> PathSegment<'hir> { + /// Converts an identifier to the corresponding segment. + pub fn from_ident(ident: Ident) -> PathSegment<'hir> { + PathSegment { ident, hir_id: None, res: None, infer_args: true, args: None } + } + + pub fn generic_args(&self) -> &GenericArgs<'hir> { + if let Some(ref args) = self.args { + args + } else { + const DUMMY: &GenericArgs<'_> = &GenericArgs::none(); + DUMMY + } + } +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct ConstArg { + pub value: AnonConst, + pub span: Span, +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum GenericArg<'hir> { + Lifetime(Lifetime), + Type(Ty<'hir>), + Const(ConstArg), +} + +impl GenericArg<'_> { + pub fn span(&self) -> Span { + match self { + GenericArg::Lifetime(l) => l.span, + GenericArg::Type(t) => t.span, + GenericArg::Const(c) => c.span, + } + } + + pub fn id(&self) -> HirId { + match self { + GenericArg::Lifetime(l) => l.hir_id, + GenericArg::Type(t) => t.hir_id, + GenericArg::Const(c) => c.value.hir_id, + } + } + + pub fn is_const(&self) -> bool { + match self { + GenericArg::Const(_) => true, + _ => false, + } + } +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct GenericArgs<'hir> { + /// The generic arguments for this path segment. + pub args: &'hir [GenericArg<'hir>], + /// Bindings (equality constraints) on associated types, if present. + /// E.g., `Foo`. + pub bindings: &'hir [TypeBinding<'hir>], + /// Were arguments written in parenthesized form `Fn(T) -> U`? + /// This is required mostly for pretty-printing and diagnostics, + /// but also for changing lifetime elision rules to be "function-like". + pub parenthesized: bool, +} + +impl GenericArgs<'_> { + pub const fn none() -> Self { + Self { args: &[], bindings: &[], parenthesized: false } + } + + pub fn is_empty(&self) -> bool { + self.args.is_empty() && self.bindings.is_empty() && !self.parenthesized + } + + pub fn inputs(&self) -> &[Ty<'_>] { + if self.parenthesized { + for arg in self.args { + match arg { + GenericArg::Lifetime(_) => {} + GenericArg::Type(ref ty) => { + if let TyKind::Tup(ref tys) = ty.kind { + return tys; + } + break; + } + GenericArg::Const(_) => {} + } + } + } + panic!("GenericArgs::inputs: not a `Fn(T) -> U`"); + } + + pub fn own_counts(&self) -> GenericParamCount { + // We could cache this as a property of `GenericParamCount`, but + // the aim is to refactor this away entirely eventually and the + // presence of this method will be a constant reminder. + let mut own_counts: GenericParamCount = Default::default(); + + for arg in self.args { + match arg { + GenericArg::Lifetime(_) => own_counts.lifetimes += 1, + GenericArg::Type(_) => own_counts.types += 1, + GenericArg::Const(_) => own_counts.consts += 1, + }; + } + + own_counts + } +} + +/// A modifier on a bound, currently this is only used for `?Sized`, where the +/// modifier is `Maybe`. Negative bounds should also be handled here. +#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] +#[derive(HashStable_Generic)] +pub enum TraitBoundModifier { + None, + Maybe, + MaybeConst, +} + +/// The AST represents all type param bounds as types. +/// `typeck::collect::compute_bounds` matches these against +/// the "special" built-in traits (see `middle::lang_items`) and +/// detects `Copy`, `Send` and `Sync`. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum GenericBound<'hir> { + Trait(PolyTraitRef<'hir>, TraitBoundModifier), + Outlives(Lifetime), +} + +impl GenericBound<'_> { + pub fn trait_def_id(&self) -> Option { + match self { + GenericBound::Trait(data, _) => Some(data.trait_ref.trait_def_id()), + _ => None, + } + } + + pub fn span(&self) -> Span { + match self { + &GenericBound::Trait(ref t, ..) => t.span, + &GenericBound::Outlives(ref l) => l.span, + } + } +} + +pub type GenericBounds<'hir> = &'hir [GenericBound<'hir>]; + +#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum LifetimeParamKind { + // Indicates that the lifetime definition was explicitly declared (e.g., in + // `fn foo<'a>(x: &'a u8) -> &'a u8 { x }`). + Explicit, + + // Indicates that the lifetime definition was synthetically added + // as a result of an in-band lifetime usage (e.g., in + // `fn foo(x: &'a u8) -> &'a u8 { x }`). + InBand, + + // Indication that the lifetime was elided (e.g., in both cases in + // `fn foo(x: &u8) -> &'_ u8 { x }`). + Elided, + + // Indication that the lifetime name was somehow in error. + Error, +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum GenericParamKind<'hir> { + /// A lifetime definition (e.g., `'a: 'b + 'c + 'd`). + Lifetime { + kind: LifetimeParamKind, + }, + Type { + default: Option<&'hir Ty<'hir>>, + synthetic: Option, + }, + Const { + ty: &'hir Ty<'hir>, + }, +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct GenericParam<'hir> { + pub hir_id: HirId, + pub name: ParamName, + pub attrs: &'hir [Attribute], + pub bounds: GenericBounds<'hir>, + pub span: Span, + pub pure_wrt_drop: bool, + pub kind: GenericParamKind<'hir>, +} + +#[derive(Default)] +pub struct GenericParamCount { + pub lifetimes: usize, + pub types: usize, + pub consts: usize, +} + +/// Represents lifetimes and type parameters attached to a declaration +/// of a function, enum, trait, etc. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct Generics<'hir> { + pub params: &'hir [GenericParam<'hir>], + pub where_clause: WhereClause<'hir>, + pub span: Span, +} + +impl Generics<'hir> { + pub const fn empty() -> Generics<'hir> { + Generics { + params: &[], + where_clause: WhereClause { predicates: &[], span: DUMMY_SP }, + span: DUMMY_SP, + } + } + + pub fn own_counts(&self) -> GenericParamCount { + // We could cache this as a property of `GenericParamCount`, but + // the aim is to refactor this away entirely eventually and the + // presence of this method will be a constant reminder. + let mut own_counts: GenericParamCount = Default::default(); + + for param in self.params { + match param.kind { + GenericParamKind::Lifetime { .. } => own_counts.lifetimes += 1, + GenericParamKind::Type { .. } => own_counts.types += 1, + GenericParamKind::Const { .. } => own_counts.consts += 1, + }; + } + + own_counts + } + + pub fn get_named(&self, name: Symbol) -> Option<&GenericParam<'_>> { + for param in self.params { + if name == param.name.ident().name { + return Some(param); + } + } + None + } + + pub fn spans(&self) -> MultiSpan { + if self.params.is_empty() { + self.span.into() + } else { + self.params.iter().map(|p| p.span).collect::>().into() + } + } +} + +/// Synthetic type parameters are converted to another form during lowering; this allows +/// us to track the original form they had, and is useful for error messages. +#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] +#[derive(HashStable_Generic)] +pub enum SyntheticTyParamKind { + ImplTrait, +} + +/// A where-clause in a definition. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct WhereClause<'hir> { + pub predicates: &'hir [WherePredicate<'hir>], + // Only valid if predicates isn't empty. + pub span: Span, +} + +impl WhereClause<'_> { + pub fn span(&self) -> Option { + if self.predicates.is_empty() { None } else { Some(self.span) } + } + + /// The `WhereClause` under normal circumstances points at either the predicates or the empty + /// space where the `where` clause should be. Only of use for diagnostic suggestions. + pub fn span_for_predicates_or_empty_place(&self) -> Span { + self.span + } +} + +/// A single predicate in a where-clause. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum WherePredicate<'hir> { + /// A type binding (e.g., `for<'c> Foo: Send + Clone + 'c`). + BoundPredicate(WhereBoundPredicate<'hir>), + /// A lifetime predicate (e.g., `'a: 'b + 'c`). + RegionPredicate(WhereRegionPredicate<'hir>), + /// An equality predicate (unsupported). + EqPredicate(WhereEqPredicate<'hir>), +} + +impl WherePredicate<'_> { + pub fn span(&self) -> Span { + match self { + &WherePredicate::BoundPredicate(ref p) => p.span, + &WherePredicate::RegionPredicate(ref p) => p.span, + &WherePredicate::EqPredicate(ref p) => p.span, + } + } +} + +/// A type bound (e.g., `for<'c> Foo: Send + Clone + 'c`). +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct WhereBoundPredicate<'hir> { + pub span: Span, + /// Any generics from a `for` binding. + pub bound_generic_params: &'hir [GenericParam<'hir>], + /// The type being bounded. + pub bounded_ty: &'hir Ty<'hir>, + /// Trait and lifetime bounds (e.g., `Clone + Send + 'static`). + pub bounds: GenericBounds<'hir>, +} + +/// A lifetime predicate (e.g., `'a: 'b + 'c`). +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct WhereRegionPredicate<'hir> { + pub span: Span, + pub lifetime: Lifetime, + pub bounds: GenericBounds<'hir>, +} + +/// An equality predicate (e.g., `T = int`); currently unsupported. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct WhereEqPredicate<'hir> { + pub hir_id: HirId, + pub span: Span, + pub lhs_ty: &'hir Ty<'hir>, + pub rhs_ty: &'hir Ty<'hir>, +} + +#[derive(RustcEncodable, RustcDecodable, Debug)] +pub struct ModuleItems { + // Use BTreeSets here so items are in the same order as in the + // list of all items in Crate + pub items: BTreeSet, + pub trait_items: BTreeSet, + pub impl_items: BTreeSet, +} + +/// The top-level data structure that stores the entire contents of +/// the crate currently being compiled. +/// +/// For more details, see the [rustc guide]. +/// +/// [rustc guide]: https://rust-lang.github.io/rustc-guide/hir.html +#[derive(RustcEncodable, RustcDecodable, Debug)] +pub struct Crate<'hir> { + pub module: Mod<'hir>, + pub attrs: &'hir [Attribute], + pub span: Span, + pub exported_macros: &'hir [MacroDef<'hir>], + // Attributes from non-exported macros, kept only for collecting the library feature list. + pub non_exported_macro_attrs: &'hir [Attribute], + + // N.B., we use a `BTreeMap` here so that `visit_all_items` iterates + // over the ids in increasing order. In principle it should not + // matter what order we visit things in, but in *practice* it + // does, because it can affect the order in which errors are + // detected, which in turn can make compile-fail tests yield + // slightly different results. + pub items: BTreeMap>, + + pub trait_items: BTreeMap>, + pub impl_items: BTreeMap>, + pub bodies: BTreeMap>, + pub trait_impls: BTreeMap>, + + /// A list of the body ids written out in the order in which they + /// appear in the crate. If you're going to process all the bodies + /// in the crate, you should iterate over this list rather than the keys + /// of bodies. + pub body_ids: Vec, + + /// A list of modules written out in the order in which they + /// appear in the crate. This includes the main crate module. + pub modules: BTreeMap, +} + +impl Crate<'hir> { + pub fn item(&self, id: HirId) -> &Item<'hir> { + &self.items[&id] + } + + pub fn trait_item(&self, id: TraitItemId) -> &TraitItem<'hir> { + &self.trait_items[&id] + } + + pub fn impl_item(&self, id: ImplItemId) -> &ImplItem<'hir> { + &self.impl_items[&id] + } + + pub fn body(&self, id: BodyId) -> &Body<'hir> { + &self.bodies[&id] + } +} + +impl Crate<'_> { + /// Visits all items in the crate in some deterministic (but + /// unspecified) order. If you just need to process every item, + /// but don't care about nesting, this method is the best choice. + /// + /// If you do care about nesting -- usually because your algorithm + /// follows lexical scoping rules -- then you want a different + /// approach. You should override `visit_nested_item` in your + /// visitor and then call `intravisit::walk_crate` instead. + pub fn visit_all_item_likes<'hir, V>(&'hir self, visitor: &mut V) + where + V: itemlikevisit::ItemLikeVisitor<'hir>, + { + for (_, item) in &self.items { + visitor.visit_item(item); + } + + for (_, trait_item) in &self.trait_items { + visitor.visit_trait_item(trait_item); + } + + for (_, impl_item) in &self.impl_items { + visitor.visit_impl_item(impl_item); + } + } + + /// A parallel version of `visit_all_item_likes`. + pub fn par_visit_all_item_likes<'hir, V>(&'hir self, visitor: &V) + where + V: itemlikevisit::ParItemLikeVisitor<'hir> + Sync + Send, + { + parallel!( + { + par_for_each_in(&self.items, |(_, item)| { + visitor.visit_item(item); + }); + }, + { + par_for_each_in(&self.trait_items, |(_, trait_item)| { + visitor.visit_trait_item(trait_item); + }); + }, + { + par_for_each_in(&self.impl_items, |(_, impl_item)| { + visitor.visit_impl_item(impl_item); + }); + } + ); + } +} + +/// A macro definition, in this crate or imported from another. +/// +/// Not parsed directly, but created on macro import or `macro_rules!` expansion. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct MacroDef<'hir> { + pub name: Name, + pub vis: Visibility<'hir>, + pub attrs: &'hir [Attribute], + pub hir_id: HirId, + pub span: Span, + pub body: TokenStream, + pub legacy: bool, +} + +/// A block of statements `{ .. }`, which may have a label (in this case the +/// `targeted_by_break` field will be `true`) and may be `unsafe` by means of +/// the `rules` being anything but `DefaultBlock`. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct Block<'hir> { + /// Statements in a block. + pub stmts: &'hir [Stmt<'hir>], + /// An expression at the end of the block + /// without a semicolon, if any. + pub expr: Option<&'hir Expr<'hir>>, + #[stable_hasher(ignore)] + pub hir_id: HirId, + /// Distinguishes between `unsafe { ... }` and `{ ... }`. + pub rules: BlockCheckMode, + pub span: Span, + /// If true, then there may exist `break 'a` values that aim to + /// break out of this block early. + /// Used by `'label: {}` blocks and by `try {}` blocks. + pub targeted_by_break: bool, +} + +#[derive(RustcEncodable, RustcDecodable, HashStable_Generic)] +pub struct Pat<'hir> { + #[stable_hasher(ignore)] + pub hir_id: HirId, + pub kind: PatKind<'hir>, + pub span: Span, +} + +impl fmt::Debug for Pat<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "pat({}: {})", + self.hir_id, + print::to_string(print::NO_ANN, |s| s.print_pat(self)) + ) + } +} + +impl Pat<'_> { + // FIXME(#19596) this is a workaround, but there should be a better way + fn walk_short_(&self, it: &mut impl FnMut(&Pat<'_>) -> bool) -> bool { + if !it(self) { + return false; + } + + use PatKind::*; + match &self.kind { + Wild | Lit(_) | Range(..) | Binding(.., None) | Path(_) => true, + Box(s) | Ref(s, _) | Binding(.., Some(s)) => s.walk_short_(it), + Struct(_, fields, _) => fields.iter().all(|field| field.pat.walk_short_(it)), + TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().all(|p| p.walk_short_(it)), + Slice(before, slice, after) => { + before.iter().chain(slice.iter()).chain(after.iter()).all(|p| p.walk_short_(it)) + } + } + } + + /// Walk the pattern in left-to-right order, + /// short circuiting (with `.all(..)`) if `false` is returned. + /// + /// Note that when visiting e.g. `Tuple(ps)`, + /// if visiting `ps[0]` returns `false`, + /// then `ps[1]` will not be visited. + pub fn walk_short(&self, mut it: impl FnMut(&Pat<'_>) -> bool) -> bool { + self.walk_short_(&mut it) + } + + // FIXME(#19596) this is a workaround, but there should be a better way + fn walk_(&self, it: &mut impl FnMut(&Pat<'_>) -> bool) { + if !it(self) { + return; + } + + use PatKind::*; + match &self.kind { + Wild | Lit(_) | Range(..) | Binding(.., None) | Path(_) => {} + Box(s) | Ref(s, _) | Binding(.., Some(s)) => s.walk_(it), + Struct(_, fields, _) => fields.iter().for_each(|field| field.pat.walk_(it)), + TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().for_each(|p| p.walk_(it)), + Slice(before, slice, after) => { + before.iter().chain(slice.iter()).chain(after.iter()).for_each(|p| p.walk_(it)) + } + } + } + + /// Walk the pattern in left-to-right order. + /// + /// If `it(pat)` returns `false`, the children are not visited. + pub fn walk(&self, mut it: impl FnMut(&Pat<'_>) -> bool) { + self.walk_(&mut it) + } + + /// Walk the pattern in left-to-right order. + /// + /// If you always want to recurse, prefer this method over `walk`. + pub fn walk_always(&self, mut it: impl FnMut(&Pat<'_>)) { + self.walk(|p| { + it(p); + true + }) + } +} + +/// A single field in a struct pattern. +/// +/// Patterns like the fields of Foo `{ x, ref y, ref mut z }` +/// are treated the same as` x: x, y: ref y, z: ref mut z`, +/// except `is_shorthand` is true. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct FieldPat<'hir> { + #[stable_hasher(ignore)] + pub hir_id: HirId, + /// The identifier for the field. + #[stable_hasher(project(name))] + pub ident: Ident, + /// The pattern the field is destructured to. + pub pat: &'hir Pat<'hir>, + pub is_shorthand: bool, + pub span: Span, +} + +/// Explicit binding annotations given in the HIR for a binding. Note +/// that this is not the final binding *mode* that we infer after type +/// inference. +#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum BindingAnnotation { + /// No binding annotation given: this means that the final binding mode + /// will depend on whether we have skipped through a `&` reference + /// when matching. For example, the `x` in `Some(x)` will have binding + /// mode `None`; if you do `let Some(x) = &Some(22)`, it will + /// ultimately be inferred to be by-reference. + /// + /// Note that implicit reference skipping is not implemented yet (#42640). + Unannotated, + + /// Annotated with `mut x` -- could be either ref or not, similar to `None`. + Mutable, + + /// Annotated as `ref`, like `ref x` + Ref, + + /// Annotated as `ref mut x`. + RefMut, +} + +#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum RangeEnd { + Included, + Excluded, +} + +impl fmt::Display for RangeEnd { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self { + RangeEnd::Included => "..=", + RangeEnd::Excluded => "..", + }) + } +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum PatKind<'hir> { + /// Represents a wildcard pattern (i.e., `_`). + Wild, + + /// A fresh binding `ref mut binding @ OPT_SUBPATTERN`. + /// The `HirId` is the canonical ID for the variable being bound, + /// (e.g., in `Ok(x) | Err(x)`, both `x` use the same canonical ID), + /// which is the pattern ID of the first `x`. + Binding(BindingAnnotation, HirId, Ident, Option<&'hir Pat<'hir>>), + + /// A struct or struct variant pattern (e.g., `Variant {x, y, ..}`). + /// The `bool` is `true` in the presence of a `..`. + Struct(QPath<'hir>, &'hir [FieldPat<'hir>], bool), + + /// A tuple struct/variant pattern `Variant(x, y, .., z)`. + /// If the `..` pattern fragment is present, then `Option` denotes its position. + /// `0 <= position <= subpats.len()` + TupleStruct(QPath<'hir>, &'hir [&'hir Pat<'hir>], Option), + + /// An or-pattern `A | B | C`. + /// Invariant: `pats.len() >= 2`. + Or(&'hir [&'hir Pat<'hir>]), + + /// A path pattern for an unit struct/variant or a (maybe-associated) constant. + Path(QPath<'hir>), + + /// A tuple pattern (e.g., `(a, b)`). + /// If the `..` pattern fragment is present, then `Option` denotes its position. + /// `0 <= position <= subpats.len()` + Tuple(&'hir [&'hir Pat<'hir>], Option), + + /// A `box` pattern. + Box(&'hir Pat<'hir>), + + /// A reference pattern (e.g., `&mut (a, b)`). + Ref(&'hir Pat<'hir>, Mutability), + + /// A literal. + Lit(&'hir Expr<'hir>), + + /// A range pattern (e.g., `1..=2` or `1..2`). + Range(Option<&'hir Expr<'hir>>, Option<&'hir Expr<'hir>>, RangeEnd), + + /// A slice pattern, `[before_0, ..., before_n, (slice, after_0, ..., after_n)?]`. + /// + /// Here, `slice` is lowered from the syntax `($binding_mode $ident @)? ..`. + /// If `slice` exists, then `after` can be non-empty. + /// + /// The representation for e.g., `[a, b, .., c, d]` is: + /// ``` + /// PatKind::Slice([Binding(a), Binding(b)], Some(Wild), [Binding(c), Binding(d)]) + /// ``` + Slice(&'hir [&'hir Pat<'hir>], Option<&'hir Pat<'hir>>, &'hir [&'hir Pat<'hir>]), +} + +#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum BinOpKind { + /// The `+` operator (addition). + Add, + /// The `-` operator (subtraction). + Sub, + /// The `*` operator (multiplication). + Mul, + /// The `/` operator (division). + Div, + /// The `%` operator (modulus). + Rem, + /// The `&&` operator (logical and). + And, + /// The `||` operator (logical or). + Or, + /// The `^` operator (bitwise xor). + BitXor, + /// The `&` operator (bitwise and). + BitAnd, + /// The `|` operator (bitwise or). + BitOr, + /// The `<<` operator (shift left). + Shl, + /// The `>>` operator (shift right). + Shr, + /// The `==` operator (equality). + Eq, + /// The `<` operator (less than). + Lt, + /// The `<=` operator (less than or equal to). + Le, + /// The `!=` operator (not equal to). + Ne, + /// The `>=` operator (greater than or equal to). + Ge, + /// The `>` operator (greater than). + Gt, +} + +impl BinOpKind { + pub fn as_str(self) -> &'static str { + match self { + BinOpKind::Add => "+", + BinOpKind::Sub => "-", + BinOpKind::Mul => "*", + BinOpKind::Div => "/", + BinOpKind::Rem => "%", + BinOpKind::And => "&&", + BinOpKind::Or => "||", + BinOpKind::BitXor => "^", + BinOpKind::BitAnd => "&", + BinOpKind::BitOr => "|", + BinOpKind::Shl => "<<", + BinOpKind::Shr => ">>", + BinOpKind::Eq => "==", + BinOpKind::Lt => "<", + BinOpKind::Le => "<=", + BinOpKind::Ne => "!=", + BinOpKind::Ge => ">=", + BinOpKind::Gt => ">", + } + } + + pub fn is_lazy(self) -> bool { + match self { + BinOpKind::And | BinOpKind::Or => true, + _ => false, + } + } + + pub fn is_shift(self) -> bool { + match self { + BinOpKind::Shl | BinOpKind::Shr => true, + _ => false, + } + } + + pub fn is_comparison(self) -> bool { + match self { + BinOpKind::Eq + | BinOpKind::Lt + | BinOpKind::Le + | BinOpKind::Ne + | BinOpKind::Gt + | BinOpKind::Ge => true, + BinOpKind::And + | BinOpKind::Or + | BinOpKind::Add + | BinOpKind::Sub + | BinOpKind::Mul + | BinOpKind::Div + | BinOpKind::Rem + | BinOpKind::BitXor + | BinOpKind::BitAnd + | BinOpKind::BitOr + | BinOpKind::Shl + | BinOpKind::Shr => false, + } + } + + /// Returns `true` if the binary operator takes its arguments by value. + pub fn is_by_value(self) -> bool { + !self.is_comparison() + } +} + +impl Into for BinOpKind { + fn into(self) -> ast::BinOpKind { + match self { + BinOpKind::Add => ast::BinOpKind::Add, + BinOpKind::Sub => ast::BinOpKind::Sub, + BinOpKind::Mul => ast::BinOpKind::Mul, + BinOpKind::Div => ast::BinOpKind::Div, + BinOpKind::Rem => ast::BinOpKind::Rem, + BinOpKind::And => ast::BinOpKind::And, + BinOpKind::Or => ast::BinOpKind::Or, + BinOpKind::BitXor => ast::BinOpKind::BitXor, + BinOpKind::BitAnd => ast::BinOpKind::BitAnd, + BinOpKind::BitOr => ast::BinOpKind::BitOr, + BinOpKind::Shl => ast::BinOpKind::Shl, + BinOpKind::Shr => ast::BinOpKind::Shr, + BinOpKind::Eq => ast::BinOpKind::Eq, + BinOpKind::Lt => ast::BinOpKind::Lt, + BinOpKind::Le => ast::BinOpKind::Le, + BinOpKind::Ne => ast::BinOpKind::Ne, + BinOpKind::Ge => ast::BinOpKind::Ge, + BinOpKind::Gt => ast::BinOpKind::Gt, + } + } +} + +pub type BinOp = Spanned; + +#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum UnOp { + /// The `*` operator (deferencing). + UnDeref, + /// The `!` operator (logical negation). + UnNot, + /// The `-` operator (negation). + UnNeg, +} + +impl UnOp { + pub fn as_str(self) -> &'static str { + match self { + Self::UnDeref => "*", + Self::UnNot => "!", + Self::UnNeg => "-", + } + } + + /// Returns `true` if the unary operator takes its argument by value. + pub fn is_by_value(self) -> bool { + match self { + Self::UnNeg | Self::UnNot => true, + _ => false, + } + } +} + +/// A statement. +#[derive(RustcEncodable, RustcDecodable, HashStable_Generic)] +pub struct Stmt<'hir> { + pub hir_id: HirId, + pub kind: StmtKind<'hir>, + pub span: Span, +} + +impl fmt::Debug for Stmt<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "stmt({}: {})", + self.hir_id, + print::to_string(print::NO_ANN, |s| s.print_stmt(self)) + ) + } +} + +/// The contents of a statement. +#[derive(RustcEncodable, RustcDecodable, HashStable_Generic)] +pub enum StmtKind<'hir> { + /// A local (`let`) binding. + Local(&'hir Local<'hir>), + + /// An item binding. + Item(ItemId), + + /// An expression without a trailing semi-colon (must have unit type). + Expr(&'hir Expr<'hir>), + + /// An expression with a trailing semi-colon (may have any type). + Semi(&'hir Expr<'hir>), +} + +impl StmtKind<'hir> { + pub fn attrs(&self) -> &'hir [Attribute] { + match *self { + StmtKind::Local(ref l) => &l.attrs, + StmtKind::Item(_) => &[], + StmtKind::Expr(ref e) | StmtKind::Semi(ref e) => &e.attrs, + } + } +} + +/// Represents a `let` statement (i.e., `let : = ;`). +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct Local<'hir> { + pub pat: &'hir Pat<'hir>, + /// Type annotation, if any (otherwise the type will be inferred). + pub ty: Option<&'hir Ty<'hir>>, + /// Initializer expression to set the value, if any. + pub init: Option<&'hir Expr<'hir>>, + pub hir_id: HirId, + pub span: Span, + pub attrs: AttrVec, + /// Can be `ForLoopDesugar` if the `let` statement is part of a `for` loop + /// desugaring. Otherwise will be `Normal`. + pub source: LocalSource, +} + +/// Represents a single arm of a `match` expression, e.g. +/// ` (if ) => `. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct Arm<'hir> { + #[stable_hasher(ignore)] + pub hir_id: HirId, + pub span: Span, + pub attrs: &'hir [Attribute], + /// If this pattern and the optional guard matches, then `body` is evaluated. + pub pat: &'hir Pat<'hir>, + /// Optional guard clause. + pub guard: Option>, + /// The expression the arm evaluates to if this arm matches. + pub body: &'hir Expr<'hir>, +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum Guard<'hir> { + If(&'hir Expr<'hir>), +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct Field<'hir> { + #[stable_hasher(ignore)] + pub hir_id: HirId, + pub ident: Ident, + pub expr: &'hir Expr<'hir>, + pub span: Span, + pub is_shorthand: bool, +} + +#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum BlockCheckMode { + DefaultBlock, + UnsafeBlock(UnsafeSource), + PushUnsafeBlock(UnsafeSource), + PopUnsafeBlock(UnsafeSource), +} + +#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum UnsafeSource { + CompilerGenerated, + UserProvided, +} + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, RustcEncodable, RustcDecodable, Hash, Debug)] +pub struct BodyId { + pub hir_id: HirId, +} + +/// The body of a function, closure, or constant value. In the case of +/// a function, the body contains not only the function body itself +/// (which is an expression), but also the argument patterns, since +/// those are something that the caller doesn't really care about. +/// +/// # Examples +/// +/// ``` +/// fn foo((x, y): (u32, u32)) -> u32 { +/// x + y +/// } +/// ``` +/// +/// Here, the `Body` associated with `foo()` would contain: +/// +/// - an `params` array containing the `(x, y)` pattern +/// - a `value` containing the `x + y` expression (maybe wrapped in a block) +/// - `generator_kind` would be `None` +/// +/// All bodies have an **owner**, which can be accessed via the HIR +/// map using `body_owner_def_id()`. +#[derive(RustcEncodable, RustcDecodable, Debug)] +pub struct Body<'hir> { + pub params: &'hir [Param<'hir>], + pub value: Expr<'hir>, + pub generator_kind: Option, +} + +impl Body<'hir> { + pub fn id(&self) -> BodyId { + BodyId { hir_id: self.value.hir_id } + } + + pub fn generator_kind(&self) -> Option { + self.generator_kind + } +} + +/// The type of source expression that caused this generator to be created. +#[derive(Clone, PartialEq, Eq, HashStable_Generic, RustcEncodable, RustcDecodable, Debug, Copy)] +pub enum GeneratorKind { + /// An explicit `async` block or the body of an async function. + Async(AsyncGeneratorKind), + + /// A generator literal created via a `yield` inside a closure. + Gen, +} + +impl fmt::Display for GeneratorKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + GeneratorKind::Async(k) => fmt::Display::fmt(k, f), + GeneratorKind::Gen => f.write_str("generator"), + } + } +} + +/// In the case of a generator created as part of an async construct, +/// which kind of async construct caused it to be created? +/// +/// This helps error messages but is also used to drive coercions in +/// type-checking (see #60424). +#[derive(Clone, PartialEq, Eq, HashStable_Generic, RustcEncodable, RustcDecodable, Debug, Copy)] +pub enum AsyncGeneratorKind { + /// An explicit `async` block written by the user. + Block, + + /// An explicit `async` block written by the user. + Closure, + + /// The `async` block generated as the body of an async function. + Fn, +} + +impl fmt::Display for AsyncGeneratorKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self { + AsyncGeneratorKind::Block => "`async` block", + AsyncGeneratorKind::Closure => "`async` closure body", + AsyncGeneratorKind::Fn => "`async fn` body", + }) + } +} + +#[derive(Copy, Clone, Debug)] +pub enum BodyOwnerKind { + /// Functions and methods. + Fn, + + /// Closures + Closure, + + /// Constants and associated constants. + Const, + + /// Initializer of a `static` item. + Static(Mutability), +} + +impl BodyOwnerKind { + pub fn is_fn_or_closure(self) -> bool { + match self { + BodyOwnerKind::Fn | BodyOwnerKind::Closure => true, + BodyOwnerKind::Const | BodyOwnerKind::Static(_) => false, + } + } +} + +/// A literal. +pub type Lit = Spanned; + +/// A constant (expression) that's not an item or associated item, +/// but needs its own `DefId` for type-checking, const-eval, etc. +/// These are usually found nested inside types (e.g., array lengths) +/// or expressions (e.g., repeat counts), and also used to define +/// explicit discriminant values for enum variants. +#[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct AnonConst { + pub hir_id: HirId, + pub body: BodyId, +} + +/// An expression. +#[derive(RustcEncodable, RustcDecodable)] +pub struct Expr<'hir> { + pub hir_id: HirId, + pub kind: ExprKind<'hir>, + pub attrs: AttrVec, + pub span: Span, +} + +// `Expr` is used a lot. Make sure it doesn't unintentionally get bigger. +#[cfg(target_arch = "x86_64")] +rustc_data_structures::static_assert_size!(Expr<'static>, 64); + +impl Expr<'_> { + pub fn precedence(&self) -> ExprPrecedence { + match self.kind { + ExprKind::Box(_) => ExprPrecedence::Box, + ExprKind::Array(_) => ExprPrecedence::Array, + ExprKind::Call(..) => ExprPrecedence::Call, + ExprKind::MethodCall(..) => ExprPrecedence::MethodCall, + ExprKind::Tup(_) => ExprPrecedence::Tup, + ExprKind::Binary(op, ..) => ExprPrecedence::Binary(op.node.into()), + ExprKind::Unary(..) => ExprPrecedence::Unary, + ExprKind::Lit(_) => ExprPrecedence::Lit, + ExprKind::Type(..) | ExprKind::Cast(..) => ExprPrecedence::Cast, + ExprKind::DropTemps(ref expr, ..) => expr.precedence(), + ExprKind::Loop(..) => ExprPrecedence::Loop, + ExprKind::Match(..) => ExprPrecedence::Match, + ExprKind::Closure(..) => ExprPrecedence::Closure, + ExprKind::Block(..) => ExprPrecedence::Block, + ExprKind::Assign(..) => ExprPrecedence::Assign, + ExprKind::AssignOp(..) => ExprPrecedence::AssignOp, + ExprKind::Field(..) => ExprPrecedence::Field, + ExprKind::Index(..) => ExprPrecedence::Index, + ExprKind::Path(..) => ExprPrecedence::Path, + ExprKind::AddrOf(..) => ExprPrecedence::AddrOf, + ExprKind::Break(..) => ExprPrecedence::Break, + ExprKind::Continue(..) => ExprPrecedence::Continue, + ExprKind::Ret(..) => ExprPrecedence::Ret, + ExprKind::InlineAsm(..) => ExprPrecedence::InlineAsm, + ExprKind::Struct(..) => ExprPrecedence::Struct, + ExprKind::Repeat(..) => ExprPrecedence::Repeat, + ExprKind::Yield(..) => ExprPrecedence::Yield, + ExprKind::Err => ExprPrecedence::Err, + } + } + + // Whether this looks like a place expr, without checking for deref + // adjustments. + // This will return `true` in some potentially surprising cases such as + // `CONSTANT.field`. + pub fn is_syntactic_place_expr(&self) -> bool { + self.is_place_expr(|_| true) + } + + // Whether this is a place expression. + // `allow_projections_from` should return `true` if indexing a field or + // index expression based on the given expression should be considered a + // place expression. + pub fn is_place_expr(&self, mut allow_projections_from: impl FnMut(&Self) -> bool) -> bool { + match self.kind { + ExprKind::Path(QPath::Resolved(_, ref path)) => match path.res { + Res::Local(..) | Res::Def(DefKind::Static, _) | Res::Err => true, + _ => false, + }, + + // Type ascription inherits its place expression kind from its + // operand. See: + // https://github.com/rust-lang/rfcs/blob/master/text/0803-type-ascription.md#type-ascription-and-temporaries + ExprKind::Type(ref e, _) => e.is_place_expr(allow_projections_from), + + ExprKind::Unary(UnOp::UnDeref, _) => true, + + ExprKind::Field(ref base, _) | ExprKind::Index(ref base, _) => { + allow_projections_from(base) || base.is_place_expr(allow_projections_from) + } + + // Partially qualified paths in expressions can only legally + // refer to associated items which are always rvalues. + ExprKind::Path(QPath::TypeRelative(..)) + | ExprKind::Call(..) + | ExprKind::MethodCall(..) + | ExprKind::Struct(..) + | ExprKind::Tup(..) + | ExprKind::Match(..) + | ExprKind::Closure(..) + | ExprKind::Block(..) + | ExprKind::Repeat(..) + | ExprKind::Array(..) + | ExprKind::Break(..) + | ExprKind::Continue(..) + | ExprKind::Ret(..) + | ExprKind::Loop(..) + | ExprKind::Assign(..) + | ExprKind::InlineAsm(..) + | ExprKind::AssignOp(..) + | ExprKind::Lit(_) + | ExprKind::Unary(..) + | ExprKind::Box(..) + | ExprKind::AddrOf(..) + | ExprKind::Binary(..) + | ExprKind::Yield(..) + | ExprKind::Cast(..) + | ExprKind::DropTemps(..) + | ExprKind::Err => false, + } + } + + /// If `Self.kind` is `ExprKind::DropTemps(expr)`, drill down until we get a non-`DropTemps` + /// `Expr`. This is used in suggestions to ignore this `ExprKind` as it is semantically + /// silent, only signaling the ownership system. By doing this, suggestions that check the + /// `ExprKind` of any given `Expr` for presentation don't have to care about `DropTemps` + /// beyond remembering to call this function before doing analysis on it. + pub fn peel_drop_temps(&self) -> &Self { + let mut expr = self; + while let ExprKind::DropTemps(inner) = &expr.kind { + expr = inner; + } + expr + } +} + +impl fmt::Debug for Expr<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "expr({}: {})", + self.hir_id, + print::to_string(print::NO_ANN, |s| s.print_expr(self)) + ) + } +} + +/// Checks if the specified expression is a built-in range literal. +/// (See: `LoweringContext::lower_expr()`). +/// +/// FIXME(#60607): This function is a hack. If and when we have `QPath::Lang(...)`, +/// we can use that instead as simpler, more reliable mechanism, as opposed to using `SourceMap`. +pub fn is_range_literal(sm: &SourceMap, expr: &Expr<'_>) -> bool { + // Returns whether the given path represents a (desugared) range, + // either in std or core, i.e. has either a `::std::ops::Range` or + // `::core::ops::Range` prefix. + fn is_range_path(path: &Path<'_>) -> bool { + let segs: Vec<_> = path.segments.iter().map(|seg| seg.ident.to_string()).collect(); + let segs: Vec<_> = segs.iter().map(|seg| &**seg).collect(); + + // "{{root}}" is the equivalent of `::` prefix in `Path`. + if let ["{{root}}", std_core, "ops", range] = segs.as_slice() { + (*std_core == "std" || *std_core == "core") && range.starts_with("Range") + } else { + false + } + }; + + // Check whether a span corresponding to a range expression is a + // range literal, rather than an explicit struct or `new()` call. + fn is_lit(sm: &SourceMap, span: &Span) -> bool { + let end_point = sm.end_point(*span); + + if let Ok(end_string) = sm.span_to_snippet(end_point) { + !(end_string.ends_with("}") || end_string.ends_with(")")) + } else { + false + } + }; + + match expr.kind { + // All built-in range literals but `..=` and `..` desugar to `Struct`s. + ExprKind::Struct(ref qpath, _, _) => { + if let QPath::Resolved(None, ref path) = **qpath { + return is_range_path(&path) && is_lit(sm, &expr.span); + } + } + + // `..` desugars to its struct path. + ExprKind::Path(QPath::Resolved(None, ref path)) => { + return is_range_path(&path) && is_lit(sm, &expr.span); + } + + // `..=` desugars into `::std::ops::RangeInclusive::new(...)`. + ExprKind::Call(ref func, _) => { + if let ExprKind::Path(QPath::TypeRelative(ref ty, ref segment)) = func.kind { + if let TyKind::Path(QPath::Resolved(None, ref path)) = ty.kind { + let new_call = segment.ident.name == sym::new; + return is_range_path(&path) && is_lit(sm, &expr.span) && new_call; + } + } + } + + _ => {} + } + + false +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum ExprKind<'hir> { + /// A `box x` expression. + Box(&'hir Expr<'hir>), + /// An array (e.g., `[a, b, c, d]`). + Array(&'hir [Expr<'hir>]), + /// A function call. + /// + /// The first field resolves to the function itself (usually an `ExprKind::Path`), + /// and the second field is the list of arguments. + /// This also represents calling the constructor of + /// tuple-like ADTs such as tuple structs and enum variants. + Call(&'hir Expr<'hir>, &'hir [Expr<'hir>]), + /// A method call (e.g., `x.foo::<'static, Bar, Baz>(a, b, c, d)`). + /// + /// The `PathSegment`/`Span` represent the method name and its generic arguments + /// (within the angle brackets). + /// The first element of the vector of `Expr`s is the expression that evaluates + /// to the object on which the method is being called on (the receiver), + /// and the remaining elements are the rest of the arguments. + /// Thus, `x.foo::(a, b, c, d)` is represented as + /// `ExprKind::MethodCall(PathSegment { foo, [Bar, Baz] }, [x, a, b, c, d])`. + /// + /// To resolve the called method to a `DefId`, call [`type_dependent_def_id`] with + /// the `hir_id` of the `MethodCall` node itself. + /// + /// [`type_dependent_def_id`]: ../ty/struct.TypeckTables.html#method.type_dependent_def_id + MethodCall(&'hir PathSegment<'hir>, Span, &'hir [Expr<'hir>]), + /// A tuple (e.g., `(a, b, c, d)`). + Tup(&'hir [Expr<'hir>]), + /// A binary operation (e.g., `a + b`, `a * b`). + Binary(BinOp, &'hir Expr<'hir>, &'hir Expr<'hir>), + /// A unary operation (e.g., `!x`, `*x`). + Unary(UnOp, &'hir Expr<'hir>), + /// A literal (e.g., `1`, `"foo"`). + Lit(Lit), + /// A cast (e.g., `foo as f64`). + Cast(&'hir Expr<'hir>, &'hir Ty<'hir>), + /// A type reference (e.g., `Foo`). + Type(&'hir Expr<'hir>, &'hir Ty<'hir>), + /// Wraps the expression in a terminating scope. + /// This makes it semantically equivalent to `{ let _t = expr; _t }`. + /// + /// This construct only exists to tweak the drop order in HIR lowering. + /// An example of that is the desugaring of `for` loops. + DropTemps(&'hir Expr<'hir>), + /// A conditionless loop (can be exited with `break`, `continue`, or `return`). + /// + /// I.e., `'label: loop { }`. + Loop(&'hir Block<'hir>, Option, D}`. + Enum(EnumDef<'hir>, Generics<'hir>), + /// A struct definition, e.g., `struct Foo {x: A}`. + Struct(VariantData<'hir>, Generics<'hir>), + /// A union definition, e.g., `union Foo {x: A, y: B}`. + Union(VariantData<'hir>, Generics<'hir>), + /// A trait definition. + Trait(IsAuto, Unsafety, Generics<'hir>, GenericBounds<'hir>, &'hir [TraitItemRef]), + /// A trait alias. + TraitAlias(Generics<'hir>, GenericBounds<'hir>), + + /// An implementation, e.g., `impl Trait for Foo { .. }`. + Impl { + unsafety: Unsafety, + polarity: ImplPolarity, + defaultness: Defaultness, + constness: Constness, + generics: Generics<'hir>, + + /// The trait being implemented, if any. + of_trait: Option>, + + self_ty: &'hir Ty<'hir>, + items: &'hir [ImplItemRef<'hir>], + }, +} + +impl ItemKind<'_> { + pub fn descriptive_variant(&self) -> &str { + match *self { + ItemKind::ExternCrate(..) => "extern crate", + ItemKind::Use(..) => "use", + ItemKind::Static(..) => "static item", + ItemKind::Const(..) => "constant item", + ItemKind::Fn(..) => "function", + ItemKind::Mod(..) => "module", + ItemKind::ForeignMod(..) => "foreign module", + ItemKind::GlobalAsm(..) => "global asm", + ItemKind::TyAlias(..) => "type alias", + ItemKind::OpaqueTy(..) => "opaque type", + ItemKind::Enum(..) => "enum", + ItemKind::Struct(..) => "struct", + ItemKind::Union(..) => "union", + ItemKind::Trait(..) => "trait", + ItemKind::TraitAlias(..) => "trait alias", + ItemKind::Impl { .. } => "impl", + } + } + + pub fn generics(&self) -> Option<&Generics<'_>> { + Some(match *self { + ItemKind::Fn(_, ref generics, _) + | ItemKind::TyAlias(_, ref generics) + | ItemKind::OpaqueTy(OpaqueTy { ref generics, impl_trait_fn: None, .. }) + | ItemKind::Enum(_, ref generics) + | ItemKind::Struct(_, ref generics) + | ItemKind::Union(_, ref generics) + | ItemKind::Trait(_, _, ref generics, _, _) + | ItemKind::Impl { ref generics, .. } => generics, + _ => return None, + }) + } +} + +/// A reference from an trait to one of its associated items. This +/// contains the item's id, naturally, but also the item's name and +/// some other high-level details (like whether it is an associated +/// type or method, and whether it is public). This allows other +/// passes to find the impl they want without loading the ID (which +/// means fewer edges in the incremental compilation graph). +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct TraitItemRef { + pub id: TraitItemId, + #[stable_hasher(project(name))] + pub ident: Ident, + pub kind: AssocItemKind, + pub span: Span, + pub defaultness: Defaultness, +} + +/// A reference from an impl to one of its associated items. This +/// contains the item's ID, naturally, but also the item's name and +/// some other high-level details (like whether it is an associated +/// type or method, and whether it is public). This allows other +/// passes to find the impl they want without loading the ID (which +/// means fewer edges in the incremental compilation graph). +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct ImplItemRef<'hir> { + pub id: ImplItemId, + #[stable_hasher(project(name))] + pub ident: Ident, + pub kind: AssocItemKind, + pub span: Span, + pub vis: Visibility<'hir>, + pub defaultness: Defaultness, +} + +#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum AssocItemKind { + Const, + Method { has_self: bool }, + Type, + OpaqueTy, +} + +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub struct ForeignItem<'hir> { + #[stable_hasher(project(name))] + pub ident: Ident, + pub attrs: &'hir [Attribute], + pub kind: ForeignItemKind<'hir>, + pub hir_id: HirId, + pub span: Span, + pub vis: Visibility<'hir>, +} + +/// An item within an `extern` block. +#[derive(RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +pub enum ForeignItemKind<'hir> { + /// A foreign function. + Fn(&'hir FnDecl<'hir>, &'hir [Ident], Generics<'hir>), + /// A foreign static item (`static ext: u8`). + Static(&'hir Ty<'hir>, Mutability), + /// A foreign type. + Type, +} + +impl ForeignItemKind<'hir> { + pub fn descriptive_variant(&self) -> &str { + match *self { + ForeignItemKind::Fn(..) => "foreign function", + ForeignItemKind::Static(..) => "foreign static item", + ForeignItemKind::Type => "foreign type", + } + } +} + +/// A variable captured by a closure. +#[derive(Debug, Copy, Clone, RustcEncodable, RustcDecodable, HashStable_Generic)] +pub struct Upvar { + // First span where it is accessed (there can be multiple). + pub span: Span, +} + +pub type CaptureModeMap = NodeMap; + +// The TraitCandidate's import_ids is empty if the trait is defined in the same module, and +// has length > 0 if the trait is found through an chain of imports, starting with the +// import/use statement in the scope where the trait is used. +#[derive(Clone, Debug)] +pub struct TraitCandidate { + pub def_id: DefId, + pub import_ids: SmallVec<[NodeId; 1]>, +} + +// Trait method resolution +pub type TraitMap = NodeMap>; + +// Map from the NodeId of a glob import to a list of items which are actually +// imported. +pub type GlobMap = NodeMap>; + +#[derive(Copy, Clone, Debug)] +pub enum Node<'hir> { + Param(&'hir Param<'hir>), + Item(&'hir Item<'hir>), + ForeignItem(&'hir ForeignItem<'hir>), + TraitItem(&'hir TraitItem<'hir>), + ImplItem(&'hir ImplItem<'hir>), + Variant(&'hir Variant<'hir>), + Field(&'hir StructField<'hir>), + AnonConst(&'hir AnonConst), + Expr(&'hir Expr<'hir>), + Stmt(&'hir Stmt<'hir>), + PathSegment(&'hir PathSegment<'hir>), + Ty(&'hir Ty<'hir>), + TraitRef(&'hir TraitRef<'hir>), + Binding(&'hir Pat<'hir>), + Pat(&'hir Pat<'hir>), + Arm(&'hir Arm<'hir>), + Block(&'hir Block<'hir>), + Local(&'hir Local<'hir>), + MacroDef(&'hir MacroDef<'hir>), + + /// `Ctor` refers to the constructor of an enum variant or struct. Only tuple or unit variants + /// with synthesized constructors. + Ctor(&'hir VariantData<'hir>), + + Lifetime(&'hir Lifetime), + GenericParam(&'hir GenericParam<'hir>), + Visibility(&'hir Visibility<'hir>), + + Crate, +} + +impl Node<'_> { + pub fn ident(&self) -> Option { + match self { + Node::TraitItem(TraitItem { ident, .. }) + | Node::ImplItem(ImplItem { ident, .. }) + | Node::ForeignItem(ForeignItem { ident, .. }) + | Node::Item(Item { ident, .. }) => Some(*ident), + _ => None, + } + } +} diff --git a/src/librustc_hir/hir_id.rs b/src/librustc_hir/hir_id.rs new file mode 100644 index 0000000000..6d2ec44576 --- /dev/null +++ b/src/librustc_hir/hir_id.rs @@ -0,0 +1,78 @@ +use crate::def_id::{DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX}; +use rustc_serialize::{self, Decodable, Decoder, Encodable, Encoder}; +use std::fmt; + +/// Uniquely identifies a node in the HIR of the current crate. It is +/// composed of the `owner`, which is the `DefIndex` of the directly enclosing +/// `hir::Item`, `hir::TraitItem`, or `hir::ImplItem` (i.e., the closest "item-like"), +/// and the `local_id` which is unique within the given owner. +/// +/// This two-level structure makes for more stable values: One can move an item +/// around within the source code, or add or remove stuff before it, without +/// the `local_id` part of the `HirId` changing, which is a very useful property in +/// incremental compilation where we have to persist things through changes to +/// the code base. +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)] +pub struct HirId { + pub owner: DefIndex, + pub local_id: ItemLocalId, +} + +impl HirId { + pub fn owner_def_id(self) -> DefId { + DefId::local(self.owner) + } + + pub fn owner_local_def_id(self) -> LocalDefId { + LocalDefId::from_def_id(DefId::local(self.owner)) + } +} + +impl rustc_serialize::UseSpecializedEncodable for HirId { + fn default_encode(&self, s: &mut S) -> Result<(), S::Error> { + let HirId { owner, local_id } = *self; + + owner.encode(s)?; + local_id.encode(s)?; + Ok(()) + } +} + +impl rustc_serialize::UseSpecializedDecodable for HirId { + fn default_decode(d: &mut D) -> Result { + let owner = DefIndex::decode(d)?; + let local_id = ItemLocalId::decode(d)?; + + Ok(HirId { owner, local_id }) + } +} + +impl fmt::Display for HirId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", self) + } +} + +rustc_data_structures::define_id_collections!(HirIdMap, HirIdSet, HirId); +rustc_data_structures::define_id_collections!(ItemLocalMap, ItemLocalSet, ItemLocalId); + +rustc_index::newtype_index! { + /// An `ItemLocalId` uniquely identifies something within a given "item-like"; + /// that is, within a `hir::Item`, `hir::TraitItem`, or `hir::ImplItem`. There is no + /// guarantee that the numerical value of a given `ItemLocalId` corresponds to + /// the node's position within the owning item in any way, but there is a + /// guarantee that the `LocalItemId`s within an owner occupy a dense range of + /// integers starting at zero, so a mapping that maps all or most nodes within + /// an "item-like" to something else can be implemented by a `Vec` instead of a + /// tree or hash map. + pub struct ItemLocalId { .. } +} +rustc_data_structures::impl_stable_hash_via_hash!(ItemLocalId); + +/// The `HirId` corresponding to `CRATE_NODE_ID` and `CRATE_DEF_INDEX`. +pub const CRATE_HIR_ID: HirId = + HirId { owner: CRATE_DEF_INDEX, local_id: ItemLocalId::from_u32_const(0) }; + +pub const DUMMY_HIR_ID: HirId = HirId { owner: CRATE_DEF_INDEX, local_id: DUMMY_ITEM_LOCAL_ID }; + +pub const DUMMY_ITEM_LOCAL_ID: ItemLocalId = ItemLocalId::MAX; diff --git a/src/librustc/hir/intravisit.rs b/src/librustc_hir/intravisit.rs similarity index 68% rename from src/librustc/hir/intravisit.rs rename to src/librustc_hir/intravisit.rs index a4557a0776..539a0eee0e 100644 --- a/src/librustc/hir/intravisit.rs +++ b/src/librustc_hir/intravisit.rs @@ -31,21 +31,71 @@ //! This order consistency is required in a few places in rustc, for //! example generator inference, and possibly also HIR borrowck. -use super::itemlikevisit::DeepVisitor; - use crate::hir::*; -use crate::hir::map::Map; +use crate::hir_id::CRATE_HIR_ID; +use crate::itemlikevisit::{ItemLikeVisitor, ParItemLikeVisitor}; +use rustc_span::Span; +use syntax::ast::{Attribute, Ident, Label, Name}; +use syntax::walk_list; + +pub struct DeepVisitor<'v, V> { + visitor: &'v mut V, +} + +impl<'v, V> DeepVisitor<'v, V> { + pub fn new(base: &'v mut V) -> Self { + DeepVisitor { visitor: base } + } +} + +impl<'v, 'hir, V> ItemLikeVisitor<'hir> for DeepVisitor<'v, V> +where + V: Visitor<'hir>, +{ + fn visit_item(&mut self, item: &'hir Item<'hir>) { + self.visitor.visit_item(item); + } + + fn visit_trait_item(&mut self, trait_item: &'hir TraitItem<'hir>) { + self.visitor.visit_trait_item(trait_item); + } + + fn visit_impl_item(&mut self, impl_item: &'hir ImplItem<'hir>) { + self.visitor.visit_impl_item(impl_item); + } +} + +pub trait IntoVisitor<'hir> { + type Visitor: Visitor<'hir>; + fn into_visitor(&self) -> Self::Visitor; +} + +pub struct ParDeepVisitor(pub V); -use syntax::ast::{Ident, Name, Attribute}; -use syntax_pos::Span; +impl<'hir, V> ParItemLikeVisitor<'hir> for ParDeepVisitor +where + V: IntoVisitor<'hir>, +{ + fn visit_item(&self, item: &'hir Item<'hir>) { + self.0.into_visitor().visit_item(item); + } + + fn visit_trait_item(&self, trait_item: &'hir TraitItem<'hir>) { + self.0.into_visitor().visit_trait_item(trait_item); + } + + fn visit_impl_item(&self, impl_item: &'hir ImplItem<'hir>) { + self.0.into_visitor().visit_impl_item(impl_item); + } +} #[derive(Copy, Clone)] pub enum FnKind<'a> { /// `#[xxx] pub async/const/extern "Abi" fn foo()` - ItemFn(Ident, &'a Generics, FnHeader, &'a Visibility, &'a [Attribute]), + ItemFn(Ident, &'a Generics<'a>, FnHeader, &'a Visibility<'a>, &'a [Attribute]), /// `fn foo(&self)` - Method(Ident, &'a FnSig, Option<&'a Visibility>, &'a [Attribute]), + Method(Ident, &'a FnSig<'a>, Option<&'a Visibility<'a>>, &'a [Attribute]), /// `|x, y| {}` Closure(&'a [Attribute]), @@ -69,6 +119,14 @@ impl<'a> FnKind<'a> { } } +/// An abstract representation of the HIR `rustc::hir::map::Map`. +pub trait Map<'hir> { + fn body(&self, id: BodyId) -> &'hir Body<'hir>; + fn item(&self, id: HirId) -> &'hir Item<'hir>; + fn trait_item(&self, id: TraitItemId) -> &'hir TraitItem<'hir>; + fn impl_item(&self, id: ImplItemId) -> &'hir ImplItem<'hir>; +} + /// Specifies what nested things a visitor wants to visit. The most /// common choice is `OnlyBodies`, which will cause the visitor to /// visit fn bodies for fns that it encounters, but skip over nested @@ -76,7 +134,7 @@ impl<'a> FnKind<'a> { /// /// See the comments on `ItemLikeVisitor` for more details on the overall /// visit strategy. -pub enum NestedVisitorMap<'this, 'tcx> { +pub enum NestedVisitorMap<'this, M> { /// Do not visit any nested things. When you add a new /// "non-nested" thing, you will want to audit such uses to see if /// they remain valid. @@ -93,20 +151,20 @@ pub enum NestedVisitorMap<'this, 'tcx> { /// to use `visit_all_item_likes()` as an outer loop, /// and to have the visitor that visits the contents of each item /// using this setting. - OnlyBodies(&'this Map<'tcx>), + OnlyBodies(&'this M), /// Visits all nested things, including item-likes. /// /// **This is an unusual choice.** It is used when you want to /// process everything within their lexical context. Typically you /// kick off the visit by doing `walk_krate()`. - All(&'this Map<'tcx>), + All(&'this M), } -impl<'this, 'tcx> NestedVisitorMap<'this, 'tcx> { +impl<'this, M> NestedVisitorMap<'this, M> { /// Returns the map to use for an "intra item-like" thing (if any). /// E.g., function body. - pub fn intra(self) -> Option<&'this Map<'tcx>> { + fn intra(self) -> Option<&'this M> { match self { NestedVisitorMap::None => None, NestedVisitorMap::OnlyBodies(map) => Some(map), @@ -116,7 +174,7 @@ impl<'this, 'tcx> NestedVisitorMap<'this, 'tcx> { /// Returns the map to use for an "item-like" thing (if any). /// E.g., item, impl-item. - pub fn inter(self) -> Option<&'this Map<'tcx>> { + fn inter(self) -> Option<&'this M> { match self { NestedVisitorMap::None => None, NestedVisitorMap::OnlyBodies(_) => None, @@ -142,6 +200,8 @@ impl<'this, 'tcx> NestedVisitorMap<'this, 'tcx> { /// to monitor future changes to `Visitor` in case a new method with a /// new default implementation gets introduced.) pub trait Visitor<'v>: Sized { + type Map: Map<'v>; + /////////////////////////////////////////////////////////////////////////// // Nested items. @@ -161,7 +221,7 @@ pub trait Visitor<'v>: Sized { /// `panic!()`. This way, if a new `visit_nested_XXX` variant is /// added in the future, we will see the panic in your code and /// fix it appropriately. - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'v>; + fn nested_visit_map(&mut self) -> NestedVisitorMap<'_, Self::Map>; /// Invoked when a nested item is encountered. By default does /// nothing unless you override `nested_visit_map` to return other than @@ -173,10 +233,8 @@ pub trait Visitor<'v>: Sized { /// but cannot supply a `Map`; see `nested_visit_map` for advice. #[allow(unused_variables)] fn visit_nested_item(&mut self, id: ItemId) { - let opt_item = self.nested_visit_map().inter().map(|map| map.expect_item(id.id)); - if let Some(item) = opt_item { - self.visit_item(item); - } + let opt_item = self.nested_visit_map().inter().map(|map| map.item(id.id)); + walk_list!(self, visit_item, opt_item); } /// Like `visit_nested_item()`, but for trait items. See @@ -185,9 +243,7 @@ pub trait Visitor<'v>: Sized { #[allow(unused_variables)] fn visit_nested_trait_item(&mut self, id: TraitItemId) { let opt_item = self.nested_visit_map().inter().map(|map| map.trait_item(id)); - if let Some(item) = opt_item { - self.visit_trait_item(item); - } + walk_list!(self, visit_trait_item, opt_item); } /// Like `visit_nested_item()`, but for impl items. See @@ -196,9 +252,7 @@ pub trait Visitor<'v>: Sized { #[allow(unused_variables)] fn visit_nested_impl_item(&mut self, id: ImplItemId) { let opt_item = self.nested_visit_map().inter().map(|map| map.impl_item(id)); - if let Some(item) = opt_item { - self.visit_impl_item(item); - } + walk_list!(self, visit_impl_item, opt_item); } /// Invoked to visit the body of a function, method or closure. Like @@ -207,22 +261,20 @@ pub trait Visitor<'v>: Sized { /// the body. fn visit_nested_body(&mut self, id: BodyId) { let opt_body = self.nested_visit_map().intra().map(|map| map.body(id)); - if let Some(body) = opt_body { - self.visit_body(body); - } + walk_list!(self, visit_body, opt_body); } - fn visit_param(&mut self, param: &'v Param) { + fn visit_param(&mut self, param: &'v Param<'v>) { walk_param(self, param) } /// Visits the top-level item and (optionally) nested items / impl items. See /// `visit_nested_item` for details. - fn visit_item(&mut self, i: &'v Item) { + fn visit_item(&mut self, i: &'v Item<'v>) { walk_item(self, i) } - fn visit_body(&mut self, b: &'v Body) { + fn visit_body(&mut self, b: &'v Body<'v>) { walk_body(self, b); } @@ -247,100 +299,104 @@ pub trait Visitor<'v>: Sized { fn visit_ident(&mut self, ident: Ident) { walk_ident(self, ident) } - fn visit_mod(&mut self, m: &'v Mod, _s: Span, n: HirId) { + fn visit_mod(&mut self, m: &'v Mod<'v>, _s: Span, n: HirId) { walk_mod(self, m, n) } - fn visit_foreign_item(&mut self, i: &'v ForeignItem) { + fn visit_foreign_item(&mut self, i: &'v ForeignItem<'v>) { walk_foreign_item(self, i) } - fn visit_local(&mut self, l: &'v Local) { + fn visit_local(&mut self, l: &'v Local<'v>) { walk_local(self, l) } - fn visit_block(&mut self, b: &'v Block) { + fn visit_block(&mut self, b: &'v Block<'v>) { walk_block(self, b) } - fn visit_stmt(&mut self, s: &'v Stmt) { + fn visit_stmt(&mut self, s: &'v Stmt<'v>) { walk_stmt(self, s) } - fn visit_arm(&mut self, a: &'v Arm) { + fn visit_arm(&mut self, a: &'v Arm<'v>) { walk_arm(self, a) } - fn visit_pat(&mut self, p: &'v Pat) { + fn visit_pat(&mut self, p: &'v Pat<'v>) { walk_pat(self, p) } fn visit_anon_const(&mut self, c: &'v AnonConst) { walk_anon_const(self, c) } - fn visit_expr(&mut self, ex: &'v Expr) { + fn visit_expr(&mut self, ex: &'v Expr<'v>) { walk_expr(self, ex) } - fn visit_ty(&mut self, t: &'v Ty) { + fn visit_ty(&mut self, t: &'v Ty<'v>) { walk_ty(self, t) } - fn visit_generic_param(&mut self, p: &'v GenericParam) { + fn visit_generic_param(&mut self, p: &'v GenericParam<'v>) { walk_generic_param(self, p) } - fn visit_generics(&mut self, g: &'v Generics) { + fn visit_generics(&mut self, g: &'v Generics<'v>) { walk_generics(self, g) } - fn visit_where_predicate(&mut self, predicate: &'v WherePredicate) { + fn visit_where_predicate(&mut self, predicate: &'v WherePredicate<'v>) { walk_where_predicate(self, predicate) } - fn visit_fn_decl(&mut self, fd: &'v FnDecl) { + fn visit_fn_decl(&mut self, fd: &'v FnDecl<'v>) { walk_fn_decl(self, fd) } - fn visit_fn(&mut self, fk: FnKind<'v>, fd: &'v FnDecl, b: BodyId, s: Span, id: HirId) { + fn visit_fn(&mut self, fk: FnKind<'v>, fd: &'v FnDecl<'v>, b: BodyId, s: Span, id: HirId) { walk_fn(self, fk, fd, b, s, id) } - fn visit_use(&mut self, path: &'v Path, hir_id: HirId) { + fn visit_use(&mut self, path: &'v Path<'v>, hir_id: HirId) { walk_use(self, path, hir_id) } - fn visit_trait_item(&mut self, ti: &'v TraitItem) { + fn visit_trait_item(&mut self, ti: &'v TraitItem<'v>) { walk_trait_item(self, ti) } fn visit_trait_item_ref(&mut self, ii: &'v TraitItemRef) { walk_trait_item_ref(self, ii) } - fn visit_impl_item(&mut self, ii: &'v ImplItem) { + fn visit_impl_item(&mut self, ii: &'v ImplItem<'v>) { walk_impl_item(self, ii) } - fn visit_impl_item_ref(&mut self, ii: &'v ImplItemRef) { + fn visit_impl_item_ref(&mut self, ii: &'v ImplItemRef<'v>) { walk_impl_item_ref(self, ii) } - fn visit_trait_ref(&mut self, t: &'v TraitRef) { + fn visit_trait_ref(&mut self, t: &'v TraitRef<'v>) { walk_trait_ref(self, t) } - fn visit_param_bound(&mut self, bounds: &'v GenericBound) { + fn visit_param_bound(&mut self, bounds: &'v GenericBound<'v>) { walk_param_bound(self, bounds) } - fn visit_poly_trait_ref(&mut self, t: &'v PolyTraitRef, m: TraitBoundModifier) { + fn visit_poly_trait_ref(&mut self, t: &'v PolyTraitRef<'v>, m: TraitBoundModifier) { walk_poly_trait_ref(self, t, m) } - fn visit_variant_data(&mut self, - s: &'v VariantData, - _: Name, - _: &'v Generics, - _parent_id: HirId, - _: Span) { + fn visit_variant_data( + &mut self, + s: &'v VariantData<'v>, + _: Name, + _: &'v Generics<'v>, + _parent_id: HirId, + _: Span, + ) { walk_struct_def(self, s) } - fn visit_struct_field(&mut self, s: &'v StructField) { + fn visit_struct_field(&mut self, s: &'v StructField<'v>) { walk_struct_field(self, s) } - fn visit_enum_def(&mut self, - enum_definition: &'v EnumDef, - generics: &'v Generics, - item_id: HirId, - _: Span) { + fn visit_enum_def( + &mut self, + enum_definition: &'v EnumDef<'v>, + generics: &'v Generics<'v>, + item_id: HirId, + _: Span, + ) { walk_enum_def(self, enum_definition, generics, item_id) } - fn visit_variant(&mut self, v: &'v Variant, g: &'v Generics, item_id: HirId) { + fn visit_variant(&mut self, v: &'v Variant<'v>, g: &'v Generics<'v>, item_id: HirId) { walk_variant(self, v, g, item_id) } fn visit_label(&mut self, label: &'v Label) { walk_label(self, label) } - fn visit_generic_arg(&mut self, generic_arg: &'v GenericArg) { + fn visit_generic_arg(&mut self, generic_arg: &'v GenericArg<'v>) { match generic_arg { GenericArg::Lifetime(lt) => self.visit_lifetime(lt), GenericArg::Type(ty) => self.visit_ty(ty), @@ -350,27 +406,26 @@ pub trait Visitor<'v>: Sized { fn visit_lifetime(&mut self, lifetime: &'v Lifetime) { walk_lifetime(self, lifetime) } - fn visit_qpath(&mut self, qpath: &'v QPath, id: HirId, span: Span) { + fn visit_qpath(&mut self, qpath: &'v QPath<'v>, id: HirId, span: Span) { walk_qpath(self, qpath, id, span) } - fn visit_path(&mut self, path: &'v Path, _id: HirId) { + fn visit_path(&mut self, path: &'v Path<'v>, _id: HirId) { walk_path(self, path) } - fn visit_path_segment(&mut self, path_span: Span, path_segment: &'v PathSegment) { + fn visit_path_segment(&mut self, path_span: Span, path_segment: &'v PathSegment<'v>) { walk_path_segment(self, path_span, path_segment) } - fn visit_generic_args(&mut self, path_span: Span, generic_args: &'v GenericArgs) { + fn visit_generic_args(&mut self, path_span: Span, generic_args: &'v GenericArgs<'v>) { walk_generic_args(self, path_span, generic_args) } - fn visit_assoc_type_binding(&mut self, type_binding: &'v TypeBinding) { + fn visit_assoc_type_binding(&mut self, type_binding: &'v TypeBinding<'v>) { walk_assoc_type_binding(self, type_binding) } - fn visit_attribute(&mut self, _attr: &'v Attribute) { - } - fn visit_macro_def(&mut self, macro_def: &'v MacroDef) { + fn visit_attribute(&mut self, _attr: &'v Attribute) {} + fn visit_macro_def(&mut self, macro_def: &'v MacroDef<'v>) { walk_macro_def(self, macro_def) } - fn visit_vis(&mut self, vis: &'v Visibility) { + fn visit_vis(&mut self, vis: &'v Visibility<'v>) { walk_vis(self, vis) } fn visit_associated_item_kind(&mut self, kind: &'v AssocItemKind) { @@ -382,31 +437,31 @@ pub trait Visitor<'v>: Sized { } /// Walks the contents of a crate. See also `Crate::visit_all_items`. -pub fn walk_crate<'v, V: Visitor<'v>>(visitor: &mut V, krate: &'v Crate) { +pub fn walk_crate<'v, V: Visitor<'v>>(visitor: &mut V, krate: &'v Crate<'v>) { visitor.visit_mod(&krate.module, krate.span, CRATE_HIR_ID); - walk_list!(visitor, visit_attribute, &krate.attrs); - walk_list!(visitor, visit_macro_def, &krate.exported_macros); + walk_list!(visitor, visit_attribute, krate.attrs); + walk_list!(visitor, visit_macro_def, krate.exported_macros); } -pub fn walk_macro_def<'v, V: Visitor<'v>>(visitor: &mut V, macro_def: &'v MacroDef) { +pub fn walk_macro_def<'v, V: Visitor<'v>>(visitor: &mut V, macro_def: &'v MacroDef<'v>) { visitor.visit_id(macro_def.hir_id); visitor.visit_name(macro_def.span, macro_def.name); - walk_list!(visitor, visit_attribute, ¯o_def.attrs); + walk_list!(visitor, visit_attribute, macro_def.attrs); } -pub fn walk_mod<'v, V: Visitor<'v>>(visitor: &mut V, module: &'v Mod, mod_hir_id: HirId) { +pub fn walk_mod<'v, V: Visitor<'v>>(visitor: &mut V, module: &'v Mod<'v>, mod_hir_id: HirId) { visitor.visit_id(mod_hir_id); - for &item_id in &module.item_ids { + for &item_id in module.item_ids { visitor.visit_nested_item(item_id); } } -pub fn walk_body<'v, V: Visitor<'v>>(visitor: &mut V, body: &'v Body) { - walk_list!(visitor, visit_param, &body.params); +pub fn walk_body<'v, V: Visitor<'v>>(visitor: &mut V, body: &'v Body<'v>) { + walk_list!(visitor, visit_param, body.params); visitor.visit_expr(&body.value); } -pub fn walk_local<'v, V: Visitor<'v>>(visitor: &mut V, local: &'v Local) { +pub fn walk_local<'v, V: Visitor<'v>>(visitor: &mut V, local: &'v Local<'v>) { // Intentionally visiting the expr first - the initialization expr // dominates the local's definition. walk_list!(visitor, visit_expr, &local.init); @@ -430,39 +485,37 @@ pub fn walk_lifetime<'v, V: Visitor<'v>>(visitor: &mut V, lifetime: &'v Lifetime LifetimeName::Param(ParamName::Plain(ident)) => { visitor.visit_ident(ident); } - LifetimeName::Param(ParamName::Fresh(_)) | - LifetimeName::Param(ParamName::Error) | - LifetimeName::Static | - LifetimeName::Error | - LifetimeName::Implicit | - LifetimeName::ImplicitObjectLifetimeDefault | - LifetimeName::Underscore => {} + LifetimeName::Param(ParamName::Fresh(_)) + | LifetimeName::Param(ParamName::Error) + | LifetimeName::Static + | LifetimeName::Error + | LifetimeName::Implicit + | LifetimeName::ImplicitObjectLifetimeDefault + | LifetimeName::Underscore => {} } } -pub fn walk_poly_trait_ref<'v, V>(visitor: &mut V, - trait_ref: &'v PolyTraitRef, - _modifier: TraitBoundModifier) - where V: Visitor<'v> -{ - walk_list!(visitor, visit_generic_param, &trait_ref.bound_generic_params); +pub fn walk_poly_trait_ref<'v, V: Visitor<'v>>( + visitor: &mut V, + trait_ref: &'v PolyTraitRef<'v>, + _modifier: TraitBoundModifier, +) { + walk_list!(visitor, visit_generic_param, trait_ref.bound_generic_params); visitor.visit_trait_ref(&trait_ref.trait_ref); } -pub fn walk_trait_ref<'v, V>(visitor: &mut V, trait_ref: &'v TraitRef) - where V: Visitor<'v> -{ +pub fn walk_trait_ref<'v, V: Visitor<'v>>(visitor: &mut V, trait_ref: &'v TraitRef<'v>) { visitor.visit_id(trait_ref.hir_ref_id); visitor.visit_path(&trait_ref.path, trait_ref.hir_ref_id) } -pub fn walk_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v Param) { +pub fn walk_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v Param<'v>) { visitor.visit_id(param.hir_id); visitor.visit_pat(¶m.pat); - walk_list!(visitor, visit_attribute, ¶m.attrs); + walk_list!(visitor, visit_attribute, param.attrs); } -pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) { +pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) { visitor.visit_vis(&item.vis); visitor.visit_ident(item.ident); match item.kind { @@ -475,30 +528,25 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) { ItemKind::Use(ref path, _) => { visitor.visit_use(path, item.hir_id); } - ItemKind::Static(ref typ, _, body) | - ItemKind::Const(ref typ, body) => { + ItemKind::Static(ref typ, _, body) | ItemKind::Const(ref typ, body) => { visitor.visit_id(item.hir_id); visitor.visit_ty(typ); visitor.visit_nested_body(body); } - ItemKind::Fn(ref sig, ref generics, body_id) => { - visitor.visit_fn(FnKind::ItemFn(item.ident, - generics, - sig.header, - &item.vis, - &item.attrs), - &sig.decl, - body_id, - item.span, - item.hir_id) - } + ItemKind::Fn(ref sig, ref generics, body_id) => visitor.visit_fn( + FnKind::ItemFn(item.ident, generics, sig.header, &item.vis, &item.attrs), + &sig.decl, + body_id, + item.span, + item.hir_id, + ), ItemKind::Mod(ref module) => { // `visit_mod()` takes care of visiting the `Item`'s `HirId`. visitor.visit_mod(module, item.span, item.hir_id) } ItemKind::ForeignMod(ref foreign_module) => { visitor.visit_id(item.hir_id); - walk_list!(visitor, visit_foreign_item, &foreign_module.items); + walk_list!(visitor, visit_foreign_item, foreign_module.items); } ItemKind::GlobalAsm(_) => { visitor.visit_id(item.hir_id); @@ -508,11 +556,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) { visitor.visit_ty(ty); visitor.visit_generics(generics) } - ItemKind::OpaqueTy(OpaqueTy { - ref generics, - ref bounds, - .. - }) => { + ItemKind::OpaqueTy(OpaqueTy { ref generics, bounds, .. }) => { visitor.visit_id(item.hir_id); walk_generics(visitor, generics); walk_list!(visitor, visit_param_bound, bounds); @@ -522,101 +566,105 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) { // `visit_enum_def()` takes care of visiting the `Item`'s `HirId`. visitor.visit_enum_def(enum_definition, generics, item.hir_id, item.span) } - ItemKind::Impl( - .., + ItemKind::Impl { + unsafety: _, + defaultness: _, + polarity: _, + constness: _, ref generics, - ref opt_trait_reference, - ref typ, - ref impl_item_refs - ) => { + ref of_trait, + ref self_ty, + items, + } => { visitor.visit_id(item.hir_id); visitor.visit_generics(generics); - walk_list!(visitor, visit_trait_ref, opt_trait_reference); - visitor.visit_ty(typ); - walk_list!(visitor, visit_impl_item_ref, impl_item_refs); + walk_list!(visitor, visit_trait_ref, of_trait); + visitor.visit_ty(self_ty); + walk_list!(visitor, visit_impl_item_ref, items); } - ItemKind::Struct(ref struct_definition, ref generics) | - ItemKind::Union(ref struct_definition, ref generics) => { + ItemKind::Struct(ref struct_definition, ref generics) + | ItemKind::Union(ref struct_definition, ref generics) => { visitor.visit_generics(generics); visitor.visit_id(item.hir_id); - visitor.visit_variant_data(struct_definition, item.ident.name, generics, item.hir_id, - item.span); - } - ItemKind::Trait(.., ref generics, ref bounds, ref trait_item_refs) => { + visitor.visit_variant_data( + struct_definition, + item.ident.name, + generics, + item.hir_id, + item.span, + ); + } + ItemKind::Trait(.., ref generics, bounds, trait_item_refs) => { visitor.visit_id(item.hir_id); visitor.visit_generics(generics); walk_list!(visitor, visit_param_bound, bounds); walk_list!(visitor, visit_trait_item_ref, trait_item_refs); } - ItemKind::TraitAlias(ref generics, ref bounds) => { + ItemKind::TraitAlias(ref generics, bounds) => { visitor.visit_id(item.hir_id); visitor.visit_generics(generics); walk_list!(visitor, visit_param_bound, bounds); } } - walk_list!(visitor, visit_attribute, &item.attrs); + walk_list!(visitor, visit_attribute, item.attrs); } -pub fn walk_use<'v, V: Visitor<'v>>(visitor: &mut V, - path: &'v Path, - hir_id: HirId) { +pub fn walk_use<'v, V: Visitor<'v>>(visitor: &mut V, path: &'v Path<'v>, hir_id: HirId) { visitor.visit_id(hir_id); visitor.visit_path(path, hir_id); } -pub fn walk_enum_def<'v, V: Visitor<'v>>(visitor: &mut V, - enum_definition: &'v EnumDef, - generics: &'v Generics, - item_id: HirId) { +pub fn walk_enum_def<'v, V: Visitor<'v>>( + visitor: &mut V, + enum_definition: &'v EnumDef<'v>, + generics: &'v Generics<'v>, + item_id: HirId, +) { visitor.visit_id(item_id); - walk_list!(visitor, - visit_variant, - &enum_definition.variants, - generics, - item_id); + walk_list!(visitor, visit_variant, enum_definition.variants, generics, item_id); } -pub fn walk_variant<'v, V: Visitor<'v>>(visitor: &mut V, - variant: &'v Variant, - generics: &'v Generics, - parent_item_id: HirId) { +pub fn walk_variant<'v, V: Visitor<'v>>( + visitor: &mut V, + variant: &'v Variant<'v>, + generics: &'v Generics<'v>, + parent_item_id: HirId, +) { visitor.visit_ident(variant.ident); visitor.visit_id(variant.id); - visitor.visit_variant_data(&variant.data, - variant.ident.name, - generics, - parent_item_id, - variant.span); + visitor.visit_variant_data( + &variant.data, + variant.ident.name, + generics, + parent_item_id, + variant.span, + ); walk_list!(visitor, visit_anon_const, &variant.disr_expr); - walk_list!(visitor, visit_attribute, &variant.attrs); + walk_list!(visitor, visit_attribute, variant.attrs); } -pub fn walk_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty) { +pub fn walk_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty<'v>) { visitor.visit_id(typ.hir_id); match typ.kind { - TyKind::Slice(ref ty) => { - visitor.visit_ty(ty) - } - TyKind::Ptr(ref mutable_type) => { - visitor.visit_ty(&mutable_type.ty) - } + TyKind::Slice(ref ty) => visitor.visit_ty(ty), + TyKind::Ptr(ref mutable_type) => visitor.visit_ty(&mutable_type.ty), TyKind::Rptr(ref lifetime, ref mutable_type) => { visitor.visit_lifetime(lifetime); visitor.visit_ty(&mutable_type.ty) } TyKind::Never => {} - TyKind::Tup(ref tuple_element_types) => { + TyKind::Tup(tuple_element_types) => { walk_list!(visitor, visit_ty, tuple_element_types); } TyKind::BareFn(ref function_declaration) => { - walk_list!(visitor, visit_generic_param, &function_declaration.generic_params); + walk_list!(visitor, visit_generic_param, function_declaration.generic_params); visitor.visit_fn_decl(&function_declaration.decl); } TyKind::Path(ref qpath) => { visitor.visit_qpath(qpath, typ.hir_id, typ.span); } - TyKind::Def(item_id, ref lifetimes) => { + TyKind::Def(item_id, lifetimes) => { visitor.visit_nested_item(item_id); walk_list!(visitor, visit_generic_arg, lifetimes); } @@ -624,25 +672,26 @@ pub fn walk_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty) { visitor.visit_ty(ty); visitor.visit_anon_const(length) } - TyKind::TraitObject(ref bounds, ref lifetime) => { + TyKind::TraitObject(bounds, ref lifetime) => { for bound in bounds { visitor.visit_poly_trait_ref(bound, TraitBoundModifier::None); } visitor.visit_lifetime(lifetime); } - TyKind::Typeof(ref expression) => { - visitor.visit_anon_const(expression) - } + TyKind::Typeof(ref expression) => visitor.visit_anon_const(expression), TyKind::Infer | TyKind::Err => {} } } -pub fn walk_qpath<'v, V: Visitor<'v>>(visitor: &mut V, qpath: &'v QPath, id: HirId, span: Span) { +pub fn walk_qpath<'v, V: Visitor<'v>>( + visitor: &mut V, + qpath: &'v QPath<'v>, + id: HirId, + span: Span, +) { match *qpath { QPath::Resolved(ref maybe_qself, ref path) => { - if let Some(ref qself) = *maybe_qself { - visitor.visit_ty(qself); - } + walk_list!(visitor, visit_ty, maybe_qself); visitor.visit_path(path, id) } QPath::TypeRelative(ref qself, ref segment) => { @@ -652,56 +701,60 @@ pub fn walk_qpath<'v, V: Visitor<'v>>(visitor: &mut V, qpath: &'v QPath, id: Hir } } -pub fn walk_path<'v, V: Visitor<'v>>(visitor: &mut V, path: &'v Path) { - for segment in &path.segments { +pub fn walk_path<'v, V: Visitor<'v>>(visitor: &mut V, path: &'v Path<'v>) { + for segment in path.segments { visitor.visit_path_segment(path.span, segment); } } -pub fn walk_path_segment<'v, V: Visitor<'v>>(visitor: &mut V, - path_span: Span, - segment: &'v PathSegment) { +pub fn walk_path_segment<'v, V: Visitor<'v>>( + visitor: &mut V, + path_span: Span, + segment: &'v PathSegment<'v>, +) { visitor.visit_ident(segment.ident); - if let Some(id) = segment.hir_id { - visitor.visit_id(id); - } + walk_list!(visitor, visit_id, segment.hir_id); if let Some(ref args) = segment.args { visitor.visit_generic_args(path_span, args); } } -pub fn walk_generic_args<'v, V: Visitor<'v>>(visitor: &mut V, - _path_span: Span, - generic_args: &'v GenericArgs) { - walk_list!(visitor, visit_generic_arg, &generic_args.args); - walk_list!(visitor, visit_assoc_type_binding, &generic_args.bindings); +pub fn walk_generic_args<'v, V: Visitor<'v>>( + visitor: &mut V, + _path_span: Span, + generic_args: &'v GenericArgs<'v>, +) { + walk_list!(visitor, visit_generic_arg, generic_args.args); + walk_list!(visitor, visit_assoc_type_binding, generic_args.bindings); } -pub fn walk_assoc_type_binding<'v, V: Visitor<'v>>(visitor: &mut V, - type_binding: &'v TypeBinding) { +pub fn walk_assoc_type_binding<'v, V: Visitor<'v>>( + visitor: &mut V, + type_binding: &'v TypeBinding<'v>, +) { visitor.visit_id(type_binding.hir_id); visitor.visit_ident(type_binding.ident); match type_binding.kind { TypeBindingKind::Equality { ref ty } => { visitor.visit_ty(ty); } - TypeBindingKind::Constraint { ref bounds } => { + TypeBindingKind::Constraint { bounds } => { walk_list!(visitor, visit_param_bound, bounds); } } } -pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat) { +pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat<'v>) { visitor.visit_id(pattern.hir_id); match pattern.kind { - PatKind::TupleStruct(ref qpath, ref children, _) => { + PatKind::TupleStruct(ref qpath, children, _) => { visitor.visit_qpath(qpath, pattern.hir_id, pattern.span); walk_list!(visitor, visit_pat, children); } PatKind::Path(ref qpath) => { visitor.visit_qpath(qpath, pattern.hir_id, pattern.span); } - PatKind::Struct(ref qpath, ref fields, _) => { + PatKind::Struct(ref qpath, fields, _) => { visitor.visit_qpath(qpath, pattern.hir_id, pattern.span); for field in fields { visitor.visit_id(field.hir_id); @@ -709,12 +762,11 @@ pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat) { visitor.visit_pat(&field.pat) } } - PatKind::Or(ref pats) => walk_list!(visitor, visit_pat, pats), - PatKind::Tuple(ref tuple_elements, _) => { + PatKind::Or(pats) => walk_list!(visitor, visit_pat, pats), + PatKind::Tuple(tuple_elements, _) => { walk_list!(visitor, visit_pat, tuple_elements); } - PatKind::Box(ref subpattern) | - PatKind::Ref(ref subpattern, _) => { + PatKind::Box(ref subpattern) | PatKind::Ref(ref subpattern, _) => { visitor.visit_pat(subpattern) } PatKind::Binding(_, _hir_id, ident, ref optional_subpattern) => { @@ -723,11 +775,11 @@ pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat) { } PatKind::Lit(ref expression) => visitor.visit_expr(expression), PatKind::Range(ref lower_bound, ref upper_bound, _) => { - visitor.visit_expr(lower_bound); - visitor.visit_expr(upper_bound) + walk_list!(visitor, visit_expr, lower_bound); + walk_list!(visitor, visit_expr, upper_bound); } PatKind::Wild => (), - PatKind::Slice(ref prepatterns, ref slice_pattern, ref postpatterns) => { + PatKind::Slice(prepatterns, ref slice_pattern, postpatterns) => { walk_list!(visitor, visit_pat, prepatterns); walk_list!(visitor, visit_pat, slice_pattern); walk_list!(visitor, visit_pat, postpatterns); @@ -735,13 +787,13 @@ pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat) { } } -pub fn walk_foreign_item<'v, V: Visitor<'v>>(visitor: &mut V, foreign_item: &'v ForeignItem) { +pub fn walk_foreign_item<'v, V: Visitor<'v>>(visitor: &mut V, foreign_item: &'v ForeignItem<'v>) { visitor.visit_id(foreign_item.hir_id); visitor.visit_vis(&foreign_item.vis); visitor.visit_ident(foreign_item.ident); match foreign_item.kind { - ForeignItemKind::Fn(ref function_declaration, ref param_names, ref generics) => { + ForeignItemKind::Fn(ref function_declaration, param_names, ref generics) => { visitor.visit_generics(generics); visitor.visit_fn_decl(function_declaration); for ¶m_name in param_names { @@ -752,10 +804,10 @@ pub fn walk_foreign_item<'v, V: Visitor<'v>>(visitor: &mut V, foreign_item: &'v ForeignItemKind::Type => (), } - walk_list!(visitor, visit_attribute, &foreign_item.attrs); + walk_list!(visitor, visit_attribute, foreign_item.attrs); } -pub fn walk_param_bound<'v, V: Visitor<'v>>(visitor: &mut V, bound: &'v GenericBound) { +pub fn walk_param_bound<'v, V: Visitor<'v>>(visitor: &mut V, bound: &'v GenericBound<'v>) { match *bound { GenericBound::Trait(ref typ, modifier) => { visitor.visit_poly_trait_ref(typ, modifier); @@ -764,9 +816,9 @@ pub fn walk_param_bound<'v, V: Visitor<'v>>(visitor: &mut V, bound: &'v GenericB } } -pub fn walk_generic_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v GenericParam) { +pub fn walk_generic_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v GenericParam<'v>) { visitor.visit_id(param.hir_id); - walk_list!(visitor, visit_attribute, ¶m.attrs); + walk_list!(visitor, visit_attribute, param.attrs); match param.name { ParamName::Plain(ident) => visitor.visit_ident(ident), ParamName::Error | ParamName::Fresh(_) => {} @@ -776,37 +828,36 @@ pub fn walk_generic_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v Generi GenericParamKind::Type { ref default, .. } => walk_list!(visitor, visit_ty, default), GenericParamKind::Const { ref ty } => visitor.visit_ty(ty), } - walk_list!(visitor, visit_param_bound, ¶m.bounds); + walk_list!(visitor, visit_param_bound, param.bounds); } -pub fn walk_generics<'v, V: Visitor<'v>>(visitor: &mut V, generics: &'v Generics) { - walk_list!(visitor, visit_generic_param, &generics.params); - walk_list!(visitor, visit_where_predicate, &generics.where_clause.predicates); +pub fn walk_generics<'v, V: Visitor<'v>>(visitor: &mut V, generics: &'v Generics<'v>) { + walk_list!(visitor, visit_generic_param, generics.params); + walk_list!(visitor, visit_where_predicate, generics.where_clause.predicates); } pub fn walk_where_predicate<'v, V: Visitor<'v>>( visitor: &mut V, - predicate: &'v WherePredicate) -{ + predicate: &'v WherePredicate<'v>, +) { match predicate { - &WherePredicate::BoundPredicate(WhereBoundPredicate{ref bounded_ty, - ref bounds, - ref bound_generic_params, - ..}) => { + &WherePredicate::BoundPredicate(WhereBoundPredicate { + ref bounded_ty, + bounds, + bound_generic_params, + .. + }) => { visitor.visit_ty(bounded_ty); walk_list!(visitor, visit_param_bound, bounds); walk_list!(visitor, visit_generic_param, bound_generic_params); } - &WherePredicate::RegionPredicate(WhereRegionPredicate{ref lifetime, - ref bounds, - ..}) => { + &WherePredicate::RegionPredicate(WhereRegionPredicate { ref lifetime, bounds, .. }) => { visitor.visit_lifetime(lifetime); walk_list!(visitor, visit_param_bound, bounds); } - &WherePredicate::EqPredicate(WhereEqPredicate{hir_id, - ref lhs_ty, - ref rhs_ty, - ..}) => { + &WherePredicate::EqPredicate(WhereEqPredicate { + hir_id, ref lhs_ty, ref rhs_ty, .. + }) => { visitor.visit_id(hir_id); visitor.visit_ty(lhs_ty); visitor.visit_ty(rhs_ty); @@ -814,14 +865,14 @@ pub fn walk_where_predicate<'v, V: Visitor<'v>>( } } -pub fn walk_fn_ret_ty<'v, V: Visitor<'v>>(visitor: &mut V, ret_ty: &'v FunctionRetTy) { - if let Return(ref output_ty) = *ret_ty { +pub fn walk_fn_ret_ty<'v, V: Visitor<'v>>(visitor: &mut V, ret_ty: &'v FunctionRetTy<'v>) { + if let FunctionRetTy::Return(ref output_ty) = *ret_ty { visitor.visit_ty(output_ty) } } -pub fn walk_fn_decl<'v, V: Visitor<'v>>(visitor: &mut V, function_declaration: &'v FnDecl) { - for ty in &function_declaration.inputs { +pub fn walk_fn_decl<'v, V: Visitor<'v>>(visitor: &mut V, function_declaration: &'v FnDecl<'v>) { + for ty in function_declaration.inputs { visitor.visit_ty(ty) } walk_fn_ret_ty(visitor, &function_declaration.output) @@ -832,26 +883,27 @@ pub fn walk_fn_kind<'v, V: Visitor<'v>>(visitor: &mut V, function_kind: FnKind<' FnKind::ItemFn(_, generics, ..) => { visitor.visit_generics(generics); } - FnKind::Method(..) | - FnKind::Closure(_) => {} + FnKind::Method(..) | FnKind::Closure(_) => {} } } -pub fn walk_fn<'v, V: Visitor<'v>>(visitor: &mut V, - function_kind: FnKind<'v>, - function_declaration: &'v FnDecl, - body_id: BodyId, - _span: Span, - id: HirId) { +pub fn walk_fn<'v, V: Visitor<'v>>( + visitor: &mut V, + function_kind: FnKind<'v>, + function_declaration: &'v FnDecl<'v>, + body_id: BodyId, + _span: Span, + id: HirId, +) { visitor.visit_id(id); visitor.visit_fn_decl(function_declaration); walk_fn_kind(visitor, function_kind); visitor.visit_nested_body(body_id) } -pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v TraitItem) { +pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v TraitItem<'v>) { visitor.visit_ident(trait_item.ident); - walk_list!(visitor, visit_attribute, &trait_item.attrs); + walk_list!(visitor, visit_attribute, trait_item.attrs); visitor.visit_generics(&trait_item.generics); match trait_item.kind { TraitItemKind::Const(ref ty, default) => { @@ -859,7 +911,7 @@ pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v Trai visitor.visit_ty(ty); walk_list!(visitor, visit_nested_body, default); } - TraitItemKind::Method(ref sig, TraitMethod::Required(ref param_names)) => { + TraitItemKind::Method(ref sig, TraitMethod::Required(param_names)) => { visitor.visit_id(trait_item.hir_id); visitor.visit_fn_decl(&sig.decl); for ¶m_name in param_names { @@ -867,16 +919,15 @@ pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v Trai } } TraitItemKind::Method(ref sig, TraitMethod::Provided(body_id)) => { - visitor.visit_fn(FnKind::Method(trait_item.ident, - sig, - None, - &trait_item.attrs), - &sig.decl, - body_id, - trait_item.span, - trait_item.hir_id); - } - TraitItemKind::Type(ref bounds, ref default) => { + visitor.visit_fn( + FnKind::Method(trait_item.ident, sig, None, &trait_item.attrs), + &sig.decl, + body_id, + trait_item.span, + trait_item.hir_id, + ); + } + TraitItemKind::Type(bounds, ref default) => { visitor.visit_id(trait_item.hir_id); walk_list!(visitor, visit_param_bound, bounds); walk_list!(visitor, visit_ty, default); @@ -893,14 +944,14 @@ pub fn walk_trait_item_ref<'v, V: Visitor<'v>>(visitor: &mut V, trait_item_ref: visitor.visit_defaultness(defaultness); } -pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplItem) { +pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplItem<'v>) { // N.B., deliberately force a compilation error if/when new fields are added. let ImplItem { hir_id: _, ident, ref vis, ref defaultness, - ref attrs, + attrs, ref generics, ref kind, span: _, @@ -918,27 +969,26 @@ pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplIt visitor.visit_nested_body(body); } ImplItemKind::Method(ref sig, body_id) => { - visitor.visit_fn(FnKind::Method(impl_item.ident, - sig, - Some(&impl_item.vis), - &impl_item.attrs), - &sig.decl, - body_id, - impl_item.span, - impl_item.hir_id); + visitor.visit_fn( + FnKind::Method(impl_item.ident, sig, Some(&impl_item.vis), &impl_item.attrs), + &sig.decl, + body_id, + impl_item.span, + impl_item.hir_id, + ); } ImplItemKind::TyAlias(ref ty) => { visitor.visit_id(impl_item.hir_id); visitor.visit_ty(ty); } - ImplItemKind::OpaqueTy(ref bounds) => { + ImplItemKind::OpaqueTy(bounds) => { visitor.visit_id(impl_item.hir_id); walk_list!(visitor, visit_param_bound, bounds); } } } -pub fn walk_impl_item_ref<'v, V: Visitor<'v>>(visitor: &mut V, impl_item_ref: &'v ImplItemRef) { +pub fn walk_impl_item_ref<'v, V: Visitor<'v>>(visitor: &mut V, impl_item_ref: &'v ImplItemRef<'v>) { // N.B., deliberately force a compilation error if/when new fields are added. let ImplItemRef { id, ident, ref kind, span: _, ref vis, ref defaultness } = *impl_item_ref; visitor.visit_nested_impl_item(id); @@ -948,34 +998,34 @@ pub fn walk_impl_item_ref<'v, V: Visitor<'v>>(visitor: &mut V, impl_item_ref: &' visitor.visit_defaultness(defaultness); } -pub fn walk_struct_def<'v, V: Visitor<'v>>(visitor: &mut V, struct_definition: &'v VariantData) { - if let Some(ctor_hir_id) = struct_definition.ctor_hir_id() { - visitor.visit_id(ctor_hir_id); - } +pub fn walk_struct_def<'v, V: Visitor<'v>>( + visitor: &mut V, + struct_definition: &'v VariantData<'v>, +) { + walk_list!(visitor, visit_id, struct_definition.ctor_hir_id()); walk_list!(visitor, visit_struct_field, struct_definition.fields()); } -pub fn walk_struct_field<'v, V: Visitor<'v>>(visitor: &mut V, struct_field: &'v StructField) { +pub fn walk_struct_field<'v, V: Visitor<'v>>(visitor: &mut V, struct_field: &'v StructField<'v>) { visitor.visit_id(struct_field.hir_id); visitor.visit_vis(&struct_field.vis); visitor.visit_ident(struct_field.ident); visitor.visit_ty(&struct_field.ty); - walk_list!(visitor, visit_attribute, &struct_field.attrs); + walk_list!(visitor, visit_attribute, struct_field.attrs); } -pub fn walk_block<'v, V: Visitor<'v>>(visitor: &mut V, block: &'v Block) { +pub fn walk_block<'v, V: Visitor<'v>>(visitor: &mut V, block: &'v Block<'v>) { visitor.visit_id(block.hir_id); - walk_list!(visitor, visit_stmt, &block.stmts); + walk_list!(visitor, visit_stmt, block.stmts); walk_list!(visitor, visit_expr, &block.expr); } -pub fn walk_stmt<'v, V: Visitor<'v>>(visitor: &mut V, statement: &'v Stmt) { +pub fn walk_stmt<'v, V: Visitor<'v>>(visitor: &mut V, statement: &'v Stmt<'v>) { visitor.visit_id(statement.hir_id); match statement.kind { StmtKind::Local(ref local) => visitor.visit_local(local), StmtKind::Item(item) => visitor.visit_nested_item(item), - StmtKind::Expr(ref expression) | - StmtKind::Semi(ref expression) => { + StmtKind::Expr(ref expression) | StmtKind::Semi(ref expression) => { visitor.visit_expr(expression) } } @@ -986,21 +1036,19 @@ pub fn walk_anon_const<'v, V: Visitor<'v>>(visitor: &mut V, constant: &'v AnonCo visitor.visit_nested_body(constant.body); } -pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) { +pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr<'v>) { visitor.visit_id(expression.hir_id); walk_list!(visitor, visit_attribute, expression.attrs.iter()); match expression.kind { - ExprKind::Box(ref subexpression) => { - visitor.visit_expr(subexpression) - } - ExprKind::Array(ref subexpressions) => { + ExprKind::Box(ref subexpression) => visitor.visit_expr(subexpression), + ExprKind::Array(subexpressions) => { walk_list!(visitor, visit_expr, subexpressions); } ExprKind::Repeat(ref element, ref count) => { visitor.visit_expr(element); visitor.visit_anon_const(count) } - ExprKind::Struct(ref qpath, ref fields, ref optional_base) => { + ExprKind::Struct(ref qpath, fields, ref optional_base) => { visitor.visit_qpath(qpath, expression.hir_id, expression.span); for field in fields { visitor.visit_id(field.hir_id); @@ -1009,14 +1057,14 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) { } walk_list!(visitor, visit_expr, optional_base); } - ExprKind::Tup(ref subexpressions) => { + ExprKind::Tup(subexpressions) => { walk_list!(visitor, visit_expr, subexpressions); } - ExprKind::Call(ref callee_expression, ref arguments) => { + ExprKind::Call(ref callee_expression, arguments) => { visitor.visit_expr(callee_expression); walk_list!(visitor, visit_expr, arguments); } - ExprKind::MethodCall(ref segment, _, ref arguments) => { + ExprKind::MethodCall(ref segment, _, arguments) => { visitor.visit_path_segment(expression.span, segment); walk_list!(visitor, visit_expr, arguments); } @@ -1038,24 +1086,25 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) { walk_list!(visitor, visit_label, opt_label); visitor.visit_block(block); } - ExprKind::Match(ref subexpression, ref arms, _) => { + ExprKind::Match(ref subexpression, arms, _) => { visitor.visit_expr(subexpression); walk_list!(visitor, visit_arm, arms); } - ExprKind::Closure(_, ref function_declaration, body, _fn_decl_span, _gen) => { - visitor.visit_fn(FnKind::Closure(&expression.attrs), - function_declaration, - body, - expression.span, - expression.hir_id) - } + ExprKind::Closure(_, ref function_declaration, body, _fn_decl_span, _gen) => visitor + .visit_fn( + FnKind::Closure(&expression.attrs), + function_declaration, + body, + expression.span, + expression.hir_id, + ), ExprKind::Block(ref block, ref opt_label) => { walk_list!(visitor, visit_label, opt_label); visitor.visit_block(block); } - ExprKind::Assign(ref left_hand_expression, ref right_hand_expression) => { - visitor.visit_expr(right_hand_expression); - visitor.visit_expr(left_hand_expression) + ExprKind::Assign(ref lhs, ref rhs, _) => { + visitor.visit_expr(rhs); + visitor.visit_expr(lhs) } ExprKind::AssignOp(_, ref left_expression, ref right_expression) => { visitor.visit_expr(right_expression); @@ -1073,22 +1122,18 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) { visitor.visit_qpath(qpath, expression.hir_id, expression.span); } ExprKind::Break(ref destination, ref opt_expr) => { - if let Some(ref label) = destination.label { - visitor.visit_label(label); - } + walk_list!(visitor, visit_label, &destination.label); walk_list!(visitor, visit_expr, opt_expr); } ExprKind::Continue(ref destination) => { - if let Some(ref label) = destination.label { - visitor.visit_label(label); - } + walk_list!(visitor, visit_label, &destination.label); } ExprKind::Ret(ref optional_expression) => { walk_list!(visitor, visit_expr, optional_expression); } ExprKind::InlineAsm(ref asm) => { - walk_list!(visitor, visit_expr, &asm.outputs_exprs); - walk_list!(visitor, visit_expr, &asm.inputs_exprs); + walk_list!(visitor, visit_expr, asm.outputs_exprs); + walk_list!(visitor, visit_expr, asm.inputs_exprs); } ExprKind::Yield(ref subexpression, _) => { visitor.visit_expr(subexpression); @@ -1097,7 +1142,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) { } } -pub fn walk_arm<'v, V: Visitor<'v>>(visitor: &mut V, arm: &'v Arm) { +pub fn walk_arm<'v, V: Visitor<'v>>(visitor: &mut V, arm: &'v Arm<'v>) { visitor.visit_id(arm.hir_id); visitor.visit_pat(&arm.pat); if let Some(ref g) = arm.guard { @@ -1106,10 +1151,10 @@ pub fn walk_arm<'v, V: Visitor<'v>>(visitor: &mut V, arm: &'v Arm) { } } visitor.visit_expr(&arm.body); - walk_list!(visitor, visit_attribute, &arm.attrs); + walk_list!(visitor, visit_attribute, arm.attrs); } -pub fn walk_vis<'v, V: Visitor<'v>>(visitor: &mut V, vis: &'v Visibility) { +pub fn walk_vis<'v, V: Visitor<'v>>(visitor: &mut V, vis: &'v Visibility<'v>) { if let VisibilityKind::Restricted { ref path, hir_id } = vis.node { visitor.visit_id(hir_id); visitor.visit_path(path, hir_id) diff --git a/src/librustc/hir/itemlikevisit.rs b/src/librustc_hir/itemlikevisit.rs similarity index 63% rename from src/librustc/hir/itemlikevisit.rs rename to src/librustc_hir/itemlikevisit.rs index 39dd46c2d2..369cd49621 100644 --- a/src/librustc/hir/itemlikevisit.rs +++ b/src/librustc_hir/itemlikevisit.rs @@ -1,5 +1,4 @@ -use super::{Item, ImplItem, TraitItem}; -use super::intravisit::Visitor; +use super::{ImplItem, Item, TraitItem}; /// The "item-like visitor" defines only the top-level methods /// that can be invoked by `Crate::visit_all_item_likes()`. Whether @@ -45,65 +44,14 @@ use super::intravisit::Visitor; /// existing `fn visit_nested` methods to see where changes are /// needed. pub trait ItemLikeVisitor<'hir> { - fn visit_item(&mut self, item: &'hir Item); - fn visit_trait_item(&mut self, trait_item: &'hir TraitItem); - fn visit_impl_item(&mut self, impl_item: &'hir ImplItem); -} - -pub struct DeepVisitor<'v, V> { - visitor: &'v mut V, -} - -impl<'v, 'hir, V> DeepVisitor<'v, V> - where V: Visitor<'hir> + 'v -{ - pub fn new(base: &'v mut V) -> Self { - DeepVisitor { visitor: base } - } -} - -impl<'v, 'hir, V> ItemLikeVisitor<'hir> for DeepVisitor<'v, V> - where V: Visitor<'hir> -{ - fn visit_item(&mut self, item: &'hir Item) { - self.visitor.visit_item(item); - } - - fn visit_trait_item(&mut self, trait_item: &'hir TraitItem) { - self.visitor.visit_trait_item(trait_item); - } - - fn visit_impl_item(&mut self, impl_item: &'hir ImplItem) { - self.visitor.visit_impl_item(impl_item); - } + fn visit_item(&mut self, item: &'hir Item<'hir>); + fn visit_trait_item(&mut self, trait_item: &'hir TraitItem<'hir>); + fn visit_impl_item(&mut self, impl_item: &'hir ImplItem<'hir>); } /// A parallel variant of `ItemLikeVisitor`. pub trait ParItemLikeVisitor<'hir> { - fn visit_item(&self, item: &'hir Item); - fn visit_trait_item(&self, trait_item: &'hir TraitItem); - fn visit_impl_item(&self, impl_item: &'hir ImplItem); -} - -pub trait IntoVisitor<'hir> { - type Visitor: Visitor<'hir>; - fn into_visitor(&self) -> Self::Visitor; -} - -pub struct ParDeepVisitor(pub V); - -impl<'hir, V> ParItemLikeVisitor<'hir> for ParDeepVisitor - where V: IntoVisitor<'hir> -{ - fn visit_item(&self, item: &'hir Item) { - self.0.into_visitor().visit_item(item); - } - - fn visit_trait_item(&self, trait_item: &'hir TraitItem) { - self.0.into_visitor().visit_trait_item(trait_item); - } - - fn visit_impl_item(&self, impl_item: &'hir ImplItem) { - self.0.into_visitor().visit_impl_item(impl_item); - } + fn visit_item(&self, item: &'hir Item<'hir>); + fn visit_trait_item(&self, trait_item: &'hir TraitItem<'hir>); + fn visit_impl_item(&self, impl_item: &'hir ImplItem<'hir>); } diff --git a/src/librustc_hir/lib.rs b/src/librustc_hir/lib.rs new file mode 100644 index 0000000000..f54fa291bd --- /dev/null +++ b/src/librustc_hir/lib.rs @@ -0,0 +1,25 @@ +//! HIR datatypes. See the [rustc guide] for more info. +//! +//! [rustc guide]: https://rust-lang.github.io/rustc-guide/hir.html + +#![feature(crate_visibility_modifier)] +#![feature(const_fn)] // For the unsizing cast on `&[]` +#![feature(in_band_lifetimes)] +#![feature(specialization)] +#![recursion_limit = "256"] + +#[macro_use] +extern crate rustc_data_structures; + +pub mod def; +pub mod def_id; +mod hir; +pub mod hir_id; +pub mod intravisit; +pub mod itemlikevisit; +pub mod pat_util; +pub mod print; +mod stable_hash_impls; +pub use hir::*; +pub use hir_id::*; +pub use stable_hash_impls::HashStableContext; diff --git a/src/librustc/hir/pat_util.rs b/src/librustc_hir/pat_util.rs similarity index 65% rename from src/librustc/hir/pat_util.rs rename to src/librustc_hir/pat_util.rs index 97228c8f24..6bca45b4f8 100644 --- a/src/librustc/hir/pat_util.rs +++ b/src/librustc_hir/pat_util.rs @@ -1,8 +1,8 @@ -use crate::hir::def::{CtorOf, Res, DefKind}; -use crate::hir::def_id::DefId; +use crate::def::{CtorOf, DefKind, Res}; +use crate::def_id::DefId; use crate::hir::{self, HirId, PatKind}; +use rustc_span::Span; use syntax::ast; -use syntax_pos::Span; use std::iter::{Enumerate, ExactSizeIterator}; @@ -12,13 +12,16 @@ pub struct EnumerateAndAdjust { gap_len: usize, } -impl Iterator for EnumerateAndAdjust where I: Iterator { +impl Iterator for EnumerateAndAdjust +where + I: Iterator, +{ type Item = (usize, ::Item); fn next(&mut self) -> Option<(usize, ::Item)> { - self.enumerate.next().map(|(i, elem)| { - (if i < self.gap_pos { i } else { i + self.gap_len }, elem) - }) + self.enumerate + .next() + .map(|(i, elem)| (if i < self.gap_pos { i } else { i + self.gap_len }, elem)) } fn size_hint(&self) -> (usize, Option) { @@ -27,13 +30,24 @@ impl Iterator for EnumerateAndAdjust where I: Iterator { } pub trait EnumerateAndAdjustIterator { - fn enumerate_and_adjust(self, expected_len: usize, gap_pos: Option) - -> EnumerateAndAdjust where Self: Sized; + fn enumerate_and_adjust( + self, + expected_len: usize, + gap_pos: Option, + ) -> EnumerateAndAdjust + where + Self: Sized; } impl EnumerateAndAdjustIterator for T { - fn enumerate_and_adjust(self, expected_len: usize, gap_pos: Option) - -> EnumerateAndAdjust where Self: Sized { + fn enumerate_and_adjust( + self, + expected_len: usize, + gap_pos: Option, + ) -> EnumerateAndAdjust + where + Self: Sized, + { let actual_len = self.len(); EnumerateAndAdjust { enumerate: self.enumerate(), @@ -43,35 +57,32 @@ impl EnumerateAndAdjustIterator for T { } } -impl hir::Pat { +impl hir::Pat<'_> { pub fn is_refutable(&self) -> bool { match self.kind { - PatKind::Lit(_) | - PatKind::Range(..) | - PatKind::Path(hir::QPath::Resolved(Some(..), _)) | - PatKind::Path(hir::QPath::TypeRelative(..)) => true, - - PatKind::Path(hir::QPath::Resolved(_, ref path)) | - PatKind::TupleStruct(hir::QPath::Resolved(_, ref path), ..) | - PatKind::Struct(hir::QPath::Resolved(_, ref path), ..) => { - match path.res { - Res::Def(DefKind::Variant, _) => true, - _ => false - } - } + PatKind::Lit(_) + | PatKind::Range(..) + | PatKind::Path(hir::QPath::Resolved(Some(..), _)) + | PatKind::Path(hir::QPath::TypeRelative(..)) => true, + + PatKind::Path(hir::QPath::Resolved(_, ref path)) + | PatKind::TupleStruct(hir::QPath::Resolved(_, ref path), ..) + | PatKind::Struct(hir::QPath::Resolved(_, ref path), ..) => match path.res { + Res::Def(DefKind::Variant, _) => true, + _ => false, + }, PatKind::Slice(..) => true, - _ => false + _ => false, } } /// Call `f` on every "binding" in a pattern, e.g., on `a` in /// `match foo() { Some(a) => (), None => () }` pub fn each_binding(&self, mut f: impl FnMut(hir::BindingAnnotation, HirId, Span, ast::Ident)) { - self.walk(|p| { + self.walk_always(|p| { if let PatKind::Binding(binding_mode, _, ident, _) = p.kind { f(binding_mode, p.hir_id, p.span, ident); } - true }); } @@ -87,8 +98,8 @@ impl hir::Pat { PatKind::Or(ps) => { ps[0].each_binding_or_first(f); false - }, - PatKind::Binding(bm, _, ident, _) => { + } + PatKind::Binding(bm, _, ident, _) => { f(*bm, p.hir_id, p.span, *ident); true } @@ -115,7 +126,7 @@ impl hir::Pat { } /// Checks if the pattern satisfies the given predicate on some sub-pattern. - fn satisfies(&self, pred: impl Fn(&Self) -> bool) -> bool { + fn satisfies(&self, pred: impl Fn(&hir::Pat<'_>) -> bool) -> bool { let mut satisfies = false; self.walk_short(|p| { if pred(p) { @@ -130,8 +141,8 @@ impl hir::Pat { pub fn simple_ident(&self) -> Option { match self.kind { - PatKind::Binding(hir::BindingAnnotation::Unannotated, _, ident, None) | - PatKind::Binding(hir::BindingAnnotation::Mutable, _, ident, None) => Some(ident), + PatKind::Binding(hir::BindingAnnotation::Unannotated, _, ident, None) + | PatKind::Binding(hir::BindingAnnotation::Mutable, _, ident, None) => Some(ident), _ => None, } } @@ -141,12 +152,11 @@ impl hir::Pat { let mut variants = vec![]; self.walk(|p| match &p.kind { PatKind::Or(_) => false, - PatKind::Path(hir::QPath::Resolved(_, path)) | - PatKind::TupleStruct(hir::QPath::Resolved(_, path), ..) | - PatKind::Struct(hir::QPath::Resolved(_, path), ..) => { + PatKind::Path(hir::QPath::Resolved(_, path)) + | PatKind::TupleStruct(hir::QPath::Resolved(_, path), ..) + | PatKind::Struct(hir::QPath::Resolved(_, path), ..) => { if let Res::Def(DefKind::Variant, id) - | Res::Def(DefKind::Ctor(CtorOf::Variant, ..), id) - = path.res + | Res::Def(DefKind::Ctor(CtorOf::Variant, ..), id) = path.res { variants.push(id); } @@ -166,16 +176,13 @@ impl hir::Pat { // ref bindings are be implicit after #42640 (default match binding modes). See issue #44848. pub fn contains_explicit_ref_binding(&self) -> Option { let mut result = None; - self.each_binding(|annotation, _, _, _| { - match annotation { - hir::BindingAnnotation::Ref => match result { - None | Some(hir::Mutability::Immutable) => - result = Some(hir::Mutability::Immutable), - _ => {} - } - hir::BindingAnnotation::RefMut => result = Some(hir::Mutability::Mutable), + self.each_binding(|annotation, _, _, _| match annotation { + hir::BindingAnnotation::Ref => match result { + None | Some(hir::Mutability::Not) => result = Some(hir::Mutability::Not), _ => {} - } + }, + hir::BindingAnnotation::RefMut => result = Some(hir::Mutability::Mut), + _ => {} }); result } diff --git a/src/librustc/hir/print.rs b/src/librustc_hir/print.rs similarity index 78% rename from src/librustc/hir/print.rs rename to src/librustc_hir/print.rs index a069331582..b9598c9376 100644 --- a/src/librustc/hir/print.rs +++ b/src/librustc_hir/print.rs @@ -1,18 +1,17 @@ +use rustc_span::source_map::{SourceMap, Spanned}; +use rustc_span::symbol::kw; +use rustc_span::{self, BytePos, FileName}; use rustc_target::spec::abi::Abi; use syntax::ast; -use syntax::source_map::{SourceMap, Spanned}; -use syntax::print::pp::{self, Breaks}; use syntax::print::pp::Breaks::{Consistent, Inconsistent}; +use syntax::print::pp::{self, Breaks}; use syntax::print::pprust::{self, Comments, PrintState}; use syntax::sess::ParseSess; -use syntax::symbol::kw; use syntax::util::parser::{self, AssocOp, Fixity}; -use syntax_pos::{self, BytePos, FileName}; use crate::hir; -use crate::hir::{PatKind, GenericBound, TraitBoundModifier, RangeEnd}; -use crate::hir::{GenericParam, GenericParamKind, GenericArg}; -use crate::hir::ptr::P; +use crate::hir::{GenericArg, GenericParam, GenericParamKind, Node}; +use crate::hir::{GenericBound, PatKind, RangeEnd, TraitBoundModifier}; use std::borrow::Cow; use std::cell::Cell; @@ -20,12 +19,12 @@ use std::vec; pub enum AnnNode<'a> { Name(&'a ast::Name), - Block(&'a hir::Block), - Item(&'a hir::Item), + Block(&'a hir::Block<'a>), + Item(&'a hir::Item<'a>), SubItem(hir::HirId), - Expr(&'a hir::Expr), - Pat(&'a hir::Pat), - Arm(&'a hir::Arm), + Expr(&'a hir::Expr<'a>), + Pat(&'a hir::Pat<'a>), + Arm(&'a hir::Arm<'a>), } pub enum Nested { @@ -33,17 +32,14 @@ pub enum Nested { TraitItem(hir::TraitItemId), ImplItem(hir::ImplItemId), Body(hir::BodyId), - BodyParamPat(hir::BodyId, usize) + BodyParamPat(hir::BodyId, usize), } pub trait PpAnn { - fn nested(&self, _state: &mut State<'_>, _nested: Nested) { - } - fn pre(&self, _state: &mut State<'_>, _node: AnnNode<'_>) { - } - fn post(&self, _state: &mut State<'_>, _node: AnnNode<'_>) { - } - fn try_fetch_item(&self, _: hir::HirId) -> Option<&hir::Item> { + fn nested(&self, _state: &mut State<'_>, _nested: Nested) {} + fn pre(&self, _state: &mut State<'_>, _node: AnnNode<'_>) {} + fn post(&self, _state: &mut State<'_>, _node: AnnNode<'_>) {} + fn try_fetch_item(&self, _: hir::HirId) -> Option<&hir::Item<'_>> { None } } @@ -52,8 +48,8 @@ pub struct NoAnn; impl PpAnn for NoAnn {} pub const NO_ANN: &dyn PpAnn = &NoAnn; -impl PpAnn for hir::Crate { - fn try_fetch_item(&self, item: hir::HirId) -> Option<&hir::Item> { +impl PpAnn for hir::Crate<'a> { + fn try_fetch_item(&self, item: hir::HirId) -> Option<&hir::Item<'_>> { Some(self.item(item)) } fn nested(&self, state: &mut State<'_>, nested: Nested) { @@ -62,7 +58,7 @@ impl PpAnn for hir::Crate { Nested::TraitItem(id) => state.print_trait_item(self.trait_item(id)), Nested::ImplItem(id) => state.print_impl_item(self.impl_item(id)), Nested::Body(id) => state.print_expr(&self.body(id).value), - Nested::BodyParamPat(id, i) => state.print_pat(&self.body(id).params[i].pat) + Nested::BodyParamPat(id, i) => state.print_pat(&self.body(id).params[i].pat), } } } @@ -73,6 +69,45 @@ pub struct State<'a> { ann: &'a (dyn PpAnn + 'a), } +impl<'a> State<'a> { + pub fn print_node(&mut self, node: Node<'_>) { + match node { + Node::Param(a) => self.print_param(&a), + Node::Item(a) => self.print_item(&a), + Node::ForeignItem(a) => self.print_foreign_item(&a), + Node::TraitItem(a) => self.print_trait_item(a), + Node::ImplItem(a) => self.print_impl_item(a), + Node::Variant(a) => self.print_variant(&a), + Node::AnonConst(a) => self.print_anon_const(&a), + Node::Expr(a) => self.print_expr(&a), + Node::Stmt(a) => self.print_stmt(&a), + Node::PathSegment(a) => self.print_path_segment(&a), + Node::Ty(a) => self.print_type(&a), + Node::TraitRef(a) => self.print_trait_ref(&a), + Node::Binding(a) | Node::Pat(a) => self.print_pat(&a), + Node::Arm(a) => self.print_arm(&a), + Node::Block(a) => { + // Containing cbox, will be closed by print-block at `}`. + self.cbox(INDENT_UNIT); + // Head-ibox, will be closed by print-block after `{`. + self.ibox(0); + self.print_block(&a) + } + Node::Lifetime(a) => self.print_lifetime(&a), + Node::Visibility(a) => self.print_visibility(&a), + Node::GenericParam(_) => panic!("cannot print Node::GenericParam"), + Node::Field(_) => panic!("cannot print StructField"), + // These cases do not carry enough information in the + // `hir_map` to reconstruct their full structure for pretty + // printing. + Node::Ctor(..) => panic!("cannot print isolated Ctor"), + Node::Local(a) => self.print_local_decl(&a), + Node::MacroDef(_) => panic!("cannot print MacroDef"), + Node::Crate => panic!("cannot print Crate"), + } + } +} + impl std::ops::Deref for State<'_> { type Target = pp::Printer; fn deref(&self) -> &Self::Target { @@ -96,8 +131,8 @@ impl<'a> PrintState<'a> for State<'a> { self.ann.post(self, AnnNode::Name(&ident.name)) } - fn print_generic_args(&mut self, args: &ast::GenericArgs, _colons_before_params: bool) { - span_bug!(args.span(), "AST generic args printed by HIR pretty-printer"); + fn print_generic_args(&mut self, _: &ast::GenericArgs, _colons_before_params: bool) { + panic!("AST generic args printed by HIR pretty-printer"); } } @@ -105,12 +140,14 @@ pub const INDENT_UNIT: usize = 4; /// Requires you to pass an input filename and reader so that /// it can scan the input text for comments to copy forward. -pub fn print_crate<'a>(cm: &'a SourceMap, - sess: &ParseSess, - krate: &hir::Crate, - filename: FileName, - input: String, - ann: &'a dyn PpAnn) -> String { +pub fn print_crate<'a>( + cm: &'a SourceMap, + sess: &ParseSess, + krate: &hir::Crate<'_>, + filename: FileName, + input: String, + ann: &'a dyn PpAnn, +) -> String { let mut s = State::new_from_input(cm, sess, filename, input, ann); // When printing the AST, we sometimes need to inject `#[no_std]` here. @@ -122,33 +159,27 @@ pub fn print_crate<'a>(cm: &'a SourceMap, } impl<'a> State<'a> { - pub fn new_from_input(cm: &'a SourceMap, - sess: &ParseSess, - filename: FileName, - input: String, - ann: &'a dyn PpAnn) - -> State<'a> { - State { - s: pp::mk_printer(), - comments: Some(Comments::new(cm, sess, filename, input)), - ann, - } + pub fn new_from_input( + cm: &'a SourceMap, + sess: &ParseSess, + filename: FileName, + input: String, + ann: &'a dyn PpAnn, + ) -> State<'a> { + State { s: pp::mk_printer(), comments: Some(Comments::new(cm, sess, filename, input)), ann } } } pub fn to_string(ann: &dyn PpAnn, f: F) -> String - where F: FnOnce(&mut State<'_>) +where + F: FnOnce(&mut State<'_>), { - let mut printer = State { - s: pp::mk_printer(), - comments: None, - ann, - }; + let mut printer = State { s: pp::mk_printer(), comments: None, ann }; f(&mut printer); printer.s.eof() } -pub fn visibility_qualified>>(vis: &hir::Visibility, w: S) -> String { +pub fn visibility_qualified>>(vis: &hir::Visibility<'_>, w: S) -> String { to_string(NO_ANN, |s| { s.print_visibility(vis); s.s.word(w) @@ -186,10 +217,7 @@ impl<'a> State<'a> { self.end(); // close the head-box } - pub fn bclose_maybe_open(&mut self, - span: syntax_pos::Span, - close_box: bool) - { + pub fn bclose_maybe_open(&mut self, span: rustc_span::Span, close_box: bool) { self.maybe_print_comment(span.hi()); self.break_offset_if_not_bol(1, -(INDENT_UNIT as isize)); self.s.word("}"); @@ -198,7 +226,7 @@ impl<'a> State<'a> { } } - pub fn bclose(&mut self, span: syntax_pos::Span) { + pub fn bclose(&mut self, span: rustc_span::Span) { self.bclose_maybe_open(span, true) } @@ -231,13 +259,10 @@ impl<'a> State<'a> { self.s.word("*/") } - pub fn commasep_cmnt(&mut self, - b: Breaks, - elts: &[T], - mut op: F, - mut get_span: G) - where F: FnMut(&mut State<'_>, &T), - G: FnMut(&T) -> syntax_pos::Span + pub fn commasep_cmnt(&mut self, b: Breaks, elts: &[T], mut op: F, mut get_span: G) + where + F: FnMut(&mut State<'_>, &T), + G: FnMut(&T) -> rustc_span::Span, { self.rbox(0, b); let len = elts.len(); @@ -255,23 +280,20 @@ impl<'a> State<'a> { self.end(); } - pub fn commasep_exprs(&mut self, b: Breaks, exprs: &[hir::Expr]) { + pub fn commasep_exprs(&mut self, b: Breaks, exprs: &[hir::Expr<'_>]) { self.commasep_cmnt(b, exprs, |s, e| s.print_expr(&e), |e| e.span) } - pub fn print_mod(&mut self, _mod: &hir::Mod, attrs: &[ast::Attribute]) { + pub fn print_mod(&mut self, _mod: &hir::Mod<'_>, attrs: &[ast::Attribute]) { self.print_inner_attributes(attrs); - for &item_id in &_mod.item_ids { + for &item_id in _mod.item_ids { self.ann.nested(self, Nested::Item(item_id)); } } - pub fn print_foreign_mod(&mut self, - nmod: &hir::ForeignMod, - attrs: &[ast::Attribute]) - { + pub fn print_foreign_mod(&mut self, nmod: &hir::ForeignMod<'_>, attrs: &[ast::Attribute]) { self.print_inner_attributes(attrs); - for item in &nmod.items { + for item in nmod.items { self.print_foreign_item(item); } } @@ -283,7 +305,7 @@ impl<'a> State<'a> { } } - pub fn print_type(&mut self, ty: &hir::Ty) { + pub fn print_type(&mut self, ty: &hir::Ty<'_>) { self.maybe_print_comment(ty.span.lo()); self.ibox(0); match ty.kind { @@ -303,7 +325,7 @@ impl<'a> State<'a> { } hir::TyKind::Never => { self.s.word("!"); - }, + } hir::TyKind::Tup(ref elts) => { self.popen(); self.commasep(Inconsistent, &elts[..], |s, ty| s.print_type(&ty)); @@ -313,14 +335,18 @@ impl<'a> State<'a> { self.pclose(); } hir::TyKind::BareFn(ref f) => { - self.print_ty_fn(f.abi, f.unsafety, &f.decl, None, &f.generic_params, - &f.param_names[..]); - } - hir::TyKind::Def(..) => {}, - hir::TyKind::Path(ref qpath) => { - self.print_qpath(qpath, false) - } - hir::TyKind::TraitObject(ref bounds, ref lifetime) => { + self.print_ty_fn( + f.abi, + f.unsafety, + &f.decl, + None, + &f.generic_params, + &f.param_names[..], + ); + } + hir::TyKind::Def(..) => {} + hir::TyKind::Path(ref qpath) => self.print_qpath(qpath, false), + hir::TyKind::TraitObject(bounds, ref lifetime) => { let mut first = true; for bound in bounds { if first { @@ -361,32 +387,34 @@ impl<'a> State<'a> { self.end() } - pub fn print_foreign_item(&mut self, item: &hir::ForeignItem) { + pub fn print_foreign_item(&mut self, item: &hir::ForeignItem<'_>) { self.hardbreak_if_not_bol(); self.maybe_print_comment(item.span.lo()); self.print_outer_attributes(&item.attrs); match item.kind { hir::ForeignItemKind::Fn(ref decl, ref arg_names, ref generics) => { self.head(""); - self.print_fn(decl, - hir::FnHeader { - unsafety: hir::Unsafety::Normal, - constness: hir::Constness::NotConst, - abi: Abi::Rust, - asyncness: hir::IsAsync::NotAsync, - }, - Some(item.ident.name), - generics, - &item.vis, - arg_names, - None); + self.print_fn( + decl, + hir::FnHeader { + unsafety: hir::Unsafety::Normal, + constness: hir::Constness::NotConst, + abi: Abi::Rust, + asyncness: hir::IsAsync::NotAsync, + }, + Some(item.ident.name), + generics, + &item.vis, + arg_names, + None, + ); self.end(); // end head-ibox self.s.word(";"); self.end() // end the outer fn box } hir::ForeignItemKind::Static(ref t, m) => { self.head(visibility_qualified(&item.vis, "static")); - if m == hir::Mutability::Mutable { + if m == hir::Mutability::Mut { self.word_space("mut"); } self.print_ident(item.ident); @@ -406,12 +434,13 @@ impl<'a> State<'a> { } } - fn print_associated_const(&mut self, - ident: ast::Ident, - ty: &hir::Ty, - default: Option, - vis: &hir::Visibility) - { + fn print_associated_const( + &mut self, + ident: ast::Ident, + ty: &hir::Ty<'_>, + default: Option, + vis: &hir::Visibility<'_>, + ) { self.s.word(visibility_qualified(vis, "")); self.word_space("const"); self.print_ident(ident); @@ -425,11 +454,12 @@ impl<'a> State<'a> { self.s.word(";") } - fn print_associated_type(&mut self, - ident: ast::Ident, - bounds: Option<&hir::GenericBounds>, - ty: Option<&hir::Ty>) - { + fn print_associated_type( + &mut self, + ident: ast::Ident, + bounds: Option>, + ty: Option<&hir::Ty<'_>>, + ) { self.word_space("type"); self.print_ident(ident); if let Some(bounds) = bounds { @@ -445,8 +475,8 @@ impl<'a> State<'a> { fn print_item_type( &mut self, - item: &hir::Item, - generics: &hir::Generics, + item: &hir::Item<'_>, + generics: &hir::Generics<'_>, inner: impl Fn(&mut Self), ) { self.head(visibility_qualified(&item.vis, "type")); @@ -462,7 +492,7 @@ impl<'a> State<'a> { } /// Pretty-print an item - pub fn print_item(&mut self, item: &hir::Item) { + pub fn print_item(&mut self, item: &hir::Item<'_>) { self.hardbreak_if_not_bol(); self.maybe_print_comment(item.span.lo()); self.print_outer_attributes(&item.attrs); @@ -495,14 +525,14 @@ impl<'a> State<'a> { self.s.word(";"); } hir::UseKind::Glob => self.s.word("::*;"), - hir::UseKind::ListStem => self.s.word("::{};") + hir::UseKind::ListStem => self.s.word("::{};"), } self.end(); // end inner head-block self.end(); // end outer head-block } hir::ItemKind::Static(ref ty, m, expr) => { self.head(visibility_qualified(&item.vis, "static")); - if m == hir::Mutability::Mutable { + if m == hir::Mutability::Mut { self.word_space("mut"); } self.print_ident(item.ident); @@ -531,13 +561,15 @@ impl<'a> State<'a> { } hir::ItemKind::Fn(ref sig, ref param_names, body) => { self.head(""); - self.print_fn(&sig.decl, - sig.header, - Some(item.ident.name), - param_names, - &item.vis, - &[], - Some(body)); + self.print_fn( + &sig.decl, + sig.header, + Some(item.ident.name), + param_names, + &item.vis, + &[], + Some(body), + ); self.s.word(" "); self.end(); // need to close a box self.end(); // need to close a box @@ -595,13 +627,16 @@ impl<'a> State<'a> { self.head(visibility_qualified(&item.vis, "union")); self.print_struct(struct_def, generics, item.ident.name, item.span, true); } - hir::ItemKind::Impl(unsafety, - polarity, - defaultness, - ref generics, - ref opt_trait, - ref ty, - ref impl_items) => { + hir::ItemKind::Impl { + unsafety, + polarity, + defaultness, + constness, + ref generics, + ref of_trait, + ref self_ty, + items, + } => { self.head(""); self.print_visibility(&item.vis); self.print_defaultness(defaultness); @@ -613,28 +648,32 @@ impl<'a> State<'a> { self.s.space(); } + if constness == ast::Constness::Const { + self.word_nbsp("const"); + } + if let hir::ImplPolarity::Negative = polarity { self.s.word("!"); } - if let Some(ref t) = opt_trait { + if let Some(ref t) = of_trait { self.print_trait_ref(t); self.s.space(); self.word_space("for"); } - self.print_type(&ty); + self.print_type(&self_ty); self.print_where_clause(&generics.where_clause); self.s.space(); self.bopen(); self.print_inner_attributes(&item.attrs); - for impl_item in impl_items { + for impl_item in items { self.ann.nested(self, Nested::ImplItem(impl_item.id)); } self.bclose(item.span); } - hir::ItemKind::Trait(is_auto, unsafety, ref generics, ref bounds, ref trait_items) => { + hir::ItemKind::Trait(is_auto, unsafety, ref generics, ref bounds, trait_items) => { self.head(""); self.print_visibility(&item.vis); self.print_is_auto(is_auto); @@ -687,14 +726,11 @@ impl<'a> State<'a> { self.ann.post(self, AnnNode::Item(item)) } - pub fn print_trait_ref(&mut self, t: &hir::TraitRef) { + pub fn print_trait_ref(&mut self, t: &hir::TraitRef<'_>) { self.print_path(&t.path, false) } - fn print_formal_generic_params( - &mut self, - generic_params: &[hir::GenericParam] - ) { + fn print_formal_generic_params(&mut self, generic_params: &[hir::GenericParam<'_>]) { if !generic_params.is_empty() { self.s.word("for"); self.print_generic_params(generic_params); @@ -702,18 +738,19 @@ impl<'a> State<'a> { } } - fn print_poly_trait_ref(&mut self, t: &hir::PolyTraitRef) { + fn print_poly_trait_ref(&mut self, t: &hir::PolyTraitRef<'_>) { self.print_formal_generic_params(&t.bound_generic_params); self.print_trait_ref(&t.trait_ref) } - pub fn print_enum_def(&mut self, - enum_definition: &hir::EnumDef, - generics: &hir::Generics, - name: ast::Name, - span: syntax_pos::Span, - visibility: &hir::Visibility) - { + pub fn print_enum_def( + &mut self, + enum_definition: &hir::EnumDef<'_>, + generics: &hir::Generics<'_>, + name: ast::Name, + span: rustc_span::Span, + visibility: &hir::Visibility<'_>, + ) { self.head(visibility_qualified(visibility, "enum")); self.print_name(name); self.print_generic_params(&generics.params); @@ -722,10 +759,7 @@ impl<'a> State<'a> { self.print_variants(&enum_definition.variants, span) } - pub fn print_variants(&mut self, - variants: &[hir::Variant], - span: syntax_pos::Span) - { + pub fn print_variants(&mut self, variants: &[hir::Variant<'_>], span: rustc_span::Span) { self.bopen(); for v in variants { self.space_if_not_bol(); @@ -740,15 +774,14 @@ impl<'a> State<'a> { self.bclose(span) } - pub fn print_visibility(&mut self, vis: &hir::Visibility) { + pub fn print_visibility(&mut self, vis: &hir::Visibility<'_>) { match vis.node { hir::VisibilityKind::Public => self.word_nbsp("pub"), hir::VisibilityKind::Crate(ast::CrateSugar::JustCrate) => self.word_nbsp("crate"), hir::VisibilityKind::Crate(ast::CrateSugar::PubCrate) => self.word_nbsp("pub(crate)"), hir::VisibilityKind::Restricted { ref path, .. } => { self.s.word("pub("); - if path.segments.len() == 1 && - path.segments[0].ident.name == kw::Super { + if path.segments.len() == 1 && path.segments[0].ident.name == kw::Super { // Special case: `super` can print like `pub(super)`. self.s.word("super"); } else { @@ -758,7 +791,7 @@ impl<'a> State<'a> { } self.word_nbsp(")"); } - hir::VisibilityKind::Inherited => () + hir::VisibilityKind::Inherited => (), } } @@ -769,13 +802,14 @@ impl<'a> State<'a> { } } - pub fn print_struct(&mut self, - struct_def: &hir::VariantData, - generics: &hir::Generics, - name: ast::Name, - span: syntax_pos::Span, - print_finalizer: bool) - { + pub fn print_struct( + &mut self, + struct_def: &hir::VariantData<'_>, + generics: &hir::Generics<'_>, + name: ast::Name, + span: rustc_span::Span, + print_finalizer: bool, + ) { self.print_name(name); self.print_generic_params(&generics.params); match struct_def { @@ -819,7 +853,7 @@ impl<'a> State<'a> { } } - pub fn print_variant(&mut self, v: &hir::Variant) { + pub fn print_variant(&mut self, v: &hir::Variant<'_>) { self.head(""); let generics = hir::Generics::empty(); self.print_struct(&v.data, &generics, v.ident.name, v.span, false); @@ -829,43 +863,38 @@ impl<'a> State<'a> { self.print_anon_const(d); } } - pub fn print_method_sig(&mut self, - ident: ast::Ident, - m: &hir::FnSig, - generics: &hir::Generics, - vis: &hir::Visibility, - arg_names: &[ast::Ident], - body_id: Option) - { - self.print_fn(&m.decl, - m.header, - Some(ident.name), - generics, - vis, - arg_names, - body_id) - } - - pub fn print_trait_item(&mut self, ti: &hir::TraitItem) { + pub fn print_method_sig( + &mut self, + ident: ast::Ident, + m: &hir::FnSig<'_>, + generics: &hir::Generics<'_>, + vis: &hir::Visibility<'_>, + arg_names: &[ast::Ident], + body_id: Option, + ) { + self.print_fn(&m.decl, m.header, Some(ident.name), generics, vis, arg_names, body_id) + } + + pub fn print_trait_item(&mut self, ti: &hir::TraitItem<'_>) { self.ann.pre(self, AnnNode::SubItem(ti.hir_id)); self.hardbreak_if_not_bol(); self.maybe_print_comment(ti.span.lo()); self.print_outer_attributes(&ti.attrs); match ti.kind { hir::TraitItemKind::Const(ref ty, default) => { - let vis = Spanned { span: syntax_pos::DUMMY_SP, - node: hir::VisibilityKind::Inherited }; + let vis = + Spanned { span: rustc_span::DUMMY_SP, node: hir::VisibilityKind::Inherited }; self.print_associated_const(ti.ident, &ty, default, &vis); } hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Required(ref arg_names)) => { - let vis = Spanned { span: syntax_pos::DUMMY_SP, - node: hir::VisibilityKind::Inherited }; + let vis = + Spanned { span: rustc_span::DUMMY_SP, node: hir::VisibilityKind::Inherited }; self.print_method_sig(ti.ident, sig, &ti.generics, &vis, arg_names, None); self.s.word(";"); } hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) => { - let vis = Spanned { span: syntax_pos::DUMMY_SP, - node: hir::VisibilityKind::Inherited }; + let vis = + Spanned { span: rustc_span::DUMMY_SP, node: hir::VisibilityKind::Inherited }; self.head(""); self.print_method_sig(ti.ident, sig, &ti.generics, &vis, &[], Some(body)); self.nbsp(); @@ -874,15 +903,17 @@ impl<'a> State<'a> { self.ann.nested(self, Nested::Body(body)); } hir::TraitItemKind::Type(ref bounds, ref default) => { - self.print_associated_type(ti.ident, - Some(bounds), - default.as_ref().map(|ty| &**ty)); + self.print_associated_type( + ti.ident, + Some(bounds), + default.as_ref().map(|ty| &**ty), + ); } } self.ann.post(self, AnnNode::SubItem(ti.hir_id)) } - pub fn print_impl_item(&mut self, ii: &hir::ImplItem) { + pub fn print_impl_item(&mut self, ii: &hir::ImplItem<'_>) { self.ann.pre(self, AnnNode::SubItem(ii.hir_id)); self.hardbreak_if_not_bol(); self.maybe_print_comment(ii.span.lo()); @@ -904,7 +935,7 @@ impl<'a> State<'a> { hir::ImplItemKind::TyAlias(ref ty) => { self.print_associated_type(ii.ident, None, Some(ty)); } - hir::ImplItemKind::OpaqueTy(ref bounds) => { + hir::ImplItemKind::OpaqueTy(bounds) => { self.word_space("type"); self.print_ident(ii.ident); self.print_bounds("= impl", bounds); @@ -914,11 +945,7 @@ impl<'a> State<'a> { self.ann.post(self, AnnNode::SubItem(ii.hir_id)) } - pub fn print_local( - &mut self, - init: Option<&hir::Expr>, - decl: impl Fn(&mut Self) - ) { + pub fn print_local(&mut self, init: Option<&hir::Expr<'_>>, decl: impl Fn(&mut Self)) { self.space_if_not_bol(); self.ibox(INDENT_UNIT); self.word_nbsp("let"); @@ -935,15 +962,13 @@ impl<'a> State<'a> { self.end() } - pub fn print_stmt(&mut self, st: &hir::Stmt) { + pub fn print_stmt(&mut self, st: &hir::Stmt<'_>) { self.maybe_print_comment(st.span.lo()); match st.kind { hir::StmtKind::Local(ref loc) => { self.print_local(loc.init.as_deref(), |this| this.print_local_decl(&loc)); } - hir::StmtKind::Item(item) => { - self.ann.nested(self, Nested::Item(item)) - } + hir::StmtKind::Item(item) => self.ann.nested(self, Nested::Item(item)), hir::StmtKind::Expr(ref expr) => { self.space_if_not_bol(); self.print_expr(&expr); @@ -960,26 +985,24 @@ impl<'a> State<'a> { self.maybe_print_trailing_comment(st.span, None) } - pub fn print_block(&mut self, blk: &hir::Block) { + pub fn print_block(&mut self, blk: &hir::Block<'_>) { self.print_block_with_attrs(blk, &[]) } - pub fn print_block_unclosed(&mut self, blk: &hir::Block) { + pub fn print_block_unclosed(&mut self, blk: &hir::Block<'_>) { self.print_block_maybe_unclosed(blk, &[], false) } - pub fn print_block_with_attrs(&mut self, - blk: &hir::Block, - attrs: &[ast::Attribute]) - { + pub fn print_block_with_attrs(&mut self, blk: &hir::Block<'_>, attrs: &[ast::Attribute]) { self.print_block_maybe_unclosed(blk, attrs, true) } - pub fn print_block_maybe_unclosed(&mut self, - blk: &hir::Block, - attrs: &[ast::Attribute], - close_box: bool) - { + pub fn print_block_maybe_unclosed( + &mut self, + blk: &hir::Block<'_>, + attrs: &[ast::Attribute], + close_box: bool, + ) { match blk.rules { hir::UnsafeBlock(..) => self.word_space("unsafe"), hir::PushUnsafeBlock(..) => self.word_space("push_unsafe"), @@ -992,7 +1015,7 @@ impl<'a> State<'a> { self.print_inner_attributes(attrs); - for st in &blk.stmts { + for st in blk.stmts { self.print_stmt(st); } if let Some(ref expr) = blk.expr { @@ -1008,13 +1031,13 @@ impl<'a> State<'a> { self.ann.nested(self, Nested::Body(constant.body)) } - fn print_call_post(&mut self, args: &[hir::Expr]) { + fn print_call_post(&mut self, args: &[hir::Expr<'_>]) { self.popen(); self.commasep_exprs(Inconsistent, args); self.pclose() } - pub fn print_expr_maybe_paren(&mut self, expr: &hir::Expr, prec: i8) { + pub fn print_expr_maybe_paren(&mut self, expr: &hir::Expr<'_>, prec: i8) { let needs_par = expr.precedence().order() < prec; if needs_par { self.popen(); @@ -1027,13 +1050,11 @@ impl<'a> State<'a> { /// Print an expr using syntax that's acceptable in a condition position, such as the `cond` in /// `if cond { ... }`. - pub fn print_expr_as_cond(&mut self, expr: &hir::Expr) { + pub fn print_expr_as_cond(&mut self, expr: &hir::Expr<'_>) { let needs_par = match expr.kind { // These cases need parens due to the parse error observed in #26461: `if return {}` // parses as the erroneous construct `if (return {})`, not `if (return) {}`. - hir::ExprKind::Closure(..) | - hir::ExprKind::Ret(..) | - hir::ExprKind::Break(..) => true, + hir::ExprKind::Closure(..) | hir::ExprKind::Ret(..) | hir::ExprKind::Break(..) => true, _ => contains_exterior_struct_lit(expr), }; @@ -1047,7 +1068,7 @@ impl<'a> State<'a> { } } - fn print_expr_vec(&mut self, exprs: &[hir::Expr]) { + fn print_expr_vec(&mut self, exprs: &[hir::Expr<'_>]) { self.ibox(INDENT_UNIT); self.s.word("["); self.commasep_exprs(Inconsistent, exprs); @@ -1055,7 +1076,7 @@ impl<'a> State<'a> { self.end() } - fn print_expr_repeat(&mut self, element: &hir::Expr, count: &hir::AnonConst) { + fn print_expr_repeat(&mut self, element: &hir::Expr<'_>, count: &hir::AnonConst) { self.ibox(INDENT_UNIT); self.s.word("["); self.print_expr(element); @@ -1065,25 +1086,28 @@ impl<'a> State<'a> { self.end() } - fn print_expr_struct(&mut self, - qpath: &hir::QPath, - fields: &[hir::Field], - wth: &Option>) - { + fn print_expr_struct( + &mut self, + qpath: &hir::QPath<'_>, + fields: &[hir::Field<'_>], + wth: &Option<&'hir hir::Expr<'_>>, + ) { self.print_qpath(qpath, true); self.s.word("{"); - self.commasep_cmnt(Consistent, - &fields[..], - |s, field| { - s.ibox(INDENT_UNIT); - if !field.is_shorthand { - s.print_ident(field.ident); - s.word_space(":"); - } - s.print_expr(&field.expr); - s.end() - }, - |f| f.span); + self.commasep_cmnt( + Consistent, + &fields[..], + |s, field| { + s.ibox(INDENT_UNIT); + if !field.is_shorthand { + s.print_ident(field.ident); + s.word_space(":"); + } + s.print_expr(&field.expr); + s.end() + }, + |f| f.span, + ); match *wth { Some(ref expr) => { self.ibox(INDENT_UNIT); @@ -1095,14 +1119,16 @@ impl<'a> State<'a> { self.print_expr(&expr); self.end(); } - _ => if !fields.is_empty() { - self.s.word(",") - }, + _ => { + if !fields.is_empty() { + self.s.word(",") + } + } } self.s.word("}"); } - fn print_expr_tup(&mut self, exprs: &[hir::Expr]) { + fn print_expr_tup(&mut self, exprs: &[hir::Expr<'_>]) { self.popen(); self.commasep_exprs(Inconsistent, exprs); if exprs.len() == 1 { @@ -1111,7 +1137,7 @@ impl<'a> State<'a> { self.pclose() } - fn print_expr_call(&mut self, func: &hir::Expr, args: &[hir::Expr]) { + fn print_expr_call(&mut self, func: &hir::Expr<'_>, args: &[hir::Expr<'_>]) { let prec = match func.kind { hir::ExprKind::Field(..) => parser::PREC_FORCE_PAREN, _ => parser::PREC_POSTFIX, @@ -1121,10 +1147,7 @@ impl<'a> State<'a> { self.print_call_post(args) } - fn print_expr_method_call(&mut self, - segment: &hir::PathSegment, - args: &[hir::Expr]) - { + fn print_expr_method_call(&mut self, segment: &hir::PathSegment<'_>, args: &[hir::Expr<'_>]) { let base_args = &args[1..]; self.print_expr_maybe_paren(&args[0], parser::PREC_POSTFIX); self.s.word("."); @@ -1138,11 +1161,7 @@ impl<'a> State<'a> { self.print_call_post(base_args) } - fn print_expr_binary(&mut self, - op: hir::BinOp, - lhs: &hir::Expr, - rhs: &hir::Expr) - { + fn print_expr_binary(&mut self, op: hir::BinOp, lhs: &hir::Expr<'_>, rhs: &hir::Expr<'_>) { let assoc_op = bin_op_to_assoc_op(op.node); let prec = assoc_op.precedence() as i8; let fixity = assoc_op.fixity(); @@ -1157,8 +1176,8 @@ impl<'a> State<'a> { // These cases need parens: `x as i32 < y` has the parser thinking that `i32 < y` is // the beginning of a path type. It starts trying to parse `x as (i32 < y ...` instead // of `(x as i32) < ...`. We need to convince it _not_ to do that. - (&hir::ExprKind::Cast { .. }, hir::BinOpKind::Lt) | - (&hir::ExprKind::Cast { .. }, hir::BinOpKind::Shl) => parser::PREC_FORCE_PAREN, + (&hir::ExprKind::Cast { .. }, hir::BinOpKind::Lt) + | (&hir::ExprKind::Cast { .. }, hir::BinOpKind::Shl) => parser::PREC_FORCE_PAREN, _ => left_prec, }; @@ -1168,16 +1187,17 @@ impl<'a> State<'a> { self.print_expr_maybe_paren(rhs, right_prec) } - fn print_expr_unary(&mut self, op: hir::UnOp, expr: &hir::Expr) { + fn print_expr_unary(&mut self, op: hir::UnOp, expr: &hir::Expr<'_>) { self.s.word(op.as_str()); self.print_expr_maybe_paren(expr, parser::PREC_PREFIX) } - fn print_expr_addr_of(&mut self, - kind: hir::BorrowKind, - mutability: hir::Mutability, - expr: &hir::Expr) - { + fn print_expr_addr_of( + &mut self, + kind: hir::BorrowKind, + mutability: hir::Mutability, + expr: &hir::Expr<'_>, + ) { self.s.word("&"); match kind { hir::BorrowKind::Ref => self.print_mutability(mutability, false), @@ -1194,7 +1214,7 @@ impl<'a> State<'a> { self.word(lit.node.to_lit_token().to_string()) } - pub fn print_expr(&mut self, expr: &hir::Expr) { + pub fn print_expr(&mut self, expr: &hir::Expr<'_>) { self.maybe_print_comment(expr.span.lo()); self.print_outer_attributes(&expr.attrs); self.ibox(INDENT_UNIT); @@ -1210,8 +1230,8 @@ impl<'a> State<'a> { hir::ExprKind::Repeat(ref element, ref count) => { self.print_expr_repeat(&element, count); } - hir::ExprKind::Struct(ref qpath, ref fields, ref wth) => { - self.print_expr_struct(qpath, &fields[..], wth); + hir::ExprKind::Struct(ref qpath, fields, ref wth) => { + self.print_expr_struct(qpath, fields, wth); } hir::ExprKind::Tup(ref exprs) => { self.print_expr_tup(exprs); @@ -1274,7 +1294,7 @@ impl<'a> State<'a> { self.s.space(); self.print_block(&blk); } - hir::ExprKind::Match(ref expr, ref arms, _) => { + hir::ExprKind::Match(ref expr, arms, _) => { self.cbox(INDENT_UNIT); self.ibox(INDENT_UNIT); self.word_nbsp("match"); @@ -1312,7 +1332,7 @@ impl<'a> State<'a> { self.ibox(0); self.print_block(&blk); } - hir::ExprKind::Assign(ref lhs, ref rhs) => { + hir::ExprKind::Assign(ref lhs, ref rhs, _) => { let prec = AssocOp::Assign.precedence() as i8; self.print_expr_maybe_paren(&lhs, prec + 1); self.s.space(); @@ -1338,9 +1358,7 @@ impl<'a> State<'a> { self.print_expr(&index); self.s.word("]"); } - hir::ExprKind::Path(ref qpath) => { - self.print_qpath(qpath, true) - } + hir::ExprKind::Path(ref qpath) => self.print_qpath(qpath, true), hir::ExprKind::Break(destination, ref opt_expr) => { self.s.word("break"); self.s.space(); @@ -1381,8 +1399,7 @@ impl<'a> State<'a> { let mut ch = constraint.chars(); match ch.next() { Some('=') if out.is_rw => { - s.print_string(&format!("+{}", ch.as_str()), - ast::StrStyle::Cooked) + s.print_string(&format!("+{}", ch.as_str()), ast::StrStyle::Cooked) } _ => s.print_string(&constraint, ast::StrStyle::Cooked), } @@ -1444,7 +1461,7 @@ impl<'a> State<'a> { self.end() } - pub fn print_local_decl(&mut self, loc: &hir::Local) { + pub fn print_local_decl(&mut self, loc: &hir::Local<'_>) { self.print_pat(&loc.pat); if let Some(ref ty) = loc.ty { self.word_space(":"); @@ -1460,17 +1477,14 @@ impl<'a> State<'a> { self.print_ident(ast::Ident::with_dummy_span(name)) } - pub fn print_for_decl(&mut self, loc: &hir::Local, coll: &hir::Expr) { + pub fn print_for_decl(&mut self, loc: &hir::Local<'_>, coll: &hir::Expr<'_>) { self.print_local_decl(loc); self.s.space(); self.word_space("in"); self.print_expr(coll) } - pub fn print_path(&mut self, - path: &hir::Path, - colons_before_params: bool) - { + pub fn print_path(&mut self, path: &hir::Path<'_>, colons_before_params: bool) { self.maybe_print_comment(path.span.lo()); for (i, segment) in path.segments.iter().enumerate() { @@ -1479,27 +1493,25 @@ impl<'a> State<'a> { } if segment.ident.name != kw::PathRoot { self.print_ident(segment.ident); - self.print_generic_args(segment.generic_args(), segment.infer_args, - colons_before_params); + self.print_generic_args( + segment.generic_args(), + segment.infer_args, + colons_before_params, + ); } } } - pub fn print_path_segment(&mut self, segment: &hir::PathSegment) { + pub fn print_path_segment(&mut self, segment: &hir::PathSegment<'_>) { if segment.ident.name != kw::PathRoot { self.print_ident(segment.ident); self.print_generic_args(segment.generic_args(), segment.infer_args, false); } } - pub fn print_qpath(&mut self, - qpath: &hir::QPath, - colons_before_params: bool) - { + pub fn print_qpath(&mut self, qpath: &hir::QPath<'_>, colons_before_params: bool) { match *qpath { - hir::QPath::Resolved(None, ref path) => { - self.print_path(path, colons_before_params) - } + hir::QPath::Resolved(None, ref path) => self.print_path(path, colons_before_params), hir::QPath::Resolved(Some(ref qself), ref path) => { self.s.word("<"); self.print_type(qself); @@ -1512,9 +1524,11 @@ impl<'a> State<'a> { } if segment.ident.name != kw::PathRoot { self.print_ident(segment.ident); - self.print_generic_args(segment.generic_args(), - segment.infer_args, - colons_before_params); + self.print_generic_args( + segment.generic_args(), + segment.infer_args, + colons_before_params, + ); } } @@ -1522,9 +1536,11 @@ impl<'a> State<'a> { self.s.word("::"); let item_segment = path.segments.last().unwrap(); self.print_ident(item_segment.ident); - self.print_generic_args(item_segment.generic_args(), - item_segment.infer_args, - colons_before_params) + self.print_generic_args( + item_segment.generic_args(), + item_segment.infer_args, + colons_before_params, + ) } hir::QPath::TypeRelative(ref qself, ref item_segment) => { // If we've got a compound-qualified-path, let's push an additional pair of angle @@ -1540,18 +1556,21 @@ impl<'a> State<'a> { self.s.word("::"); self.print_ident(item_segment.ident); - self.print_generic_args(item_segment.generic_args(), - item_segment.infer_args, - colons_before_params) + self.print_generic_args( + item_segment.generic_args(), + item_segment.infer_args, + colons_before_params, + ) } } } - fn print_generic_args(&mut self, - generic_args: &hir::GenericArgs, - infer_args: bool, - colons_before_params: bool) - { + fn print_generic_args( + &mut self, + generic_args: &hir::GenericArgs<'_>, + infer_args: bool, + colons_before_params: bool, + ) { if generic_args.parenthesized { self.s.word("("); self.commasep(Inconsistent, generic_args.inputs(), |s, ty| s.print_type(&ty)); @@ -1583,14 +1602,16 @@ impl<'a> State<'a> { if nonelided_generic_args { start_or_comma(self); - self.commasep(Inconsistent, &generic_args.args, |s, generic_arg| { - match generic_arg { + self.commasep( + Inconsistent, + &generic_args.args, + |s, generic_arg| match generic_arg { GenericArg::Lifetime(lt) if !elide_lifetimes => s.print_lifetime(lt), - GenericArg::Lifetime(_) => {}, + GenericArg::Lifetime(_) => {} GenericArg::Type(ty) => s.print_type(ty), GenericArg::Const(ct) => s.print_anon_const(&ct.value), - } - }); + }, + ); } // FIXME(eddyb): this would leak into error messages (e.g., @@ -1609,7 +1630,7 @@ impl<'a> State<'a> { self.word_space("="); self.print_type(ty); } - hir::TypeBindingKind::Constraint { ref bounds } => { + hir::TypeBindingKind::Constraint { bounds } => { self.print_bounds(":", bounds); } } @@ -1621,7 +1642,7 @@ impl<'a> State<'a> { } } - pub fn print_pat(&mut self, pat: &hir::Pat) { + pub fn print_pat(&mut self, pat: &hir::Pat<'_>) { self.maybe_print_comment(pat.span.lo()); self.ann.pre(self, AnnNode::Pat(pat)); // Pat isn't normalized, but the beauty of it @@ -1632,11 +1653,11 @@ impl<'a> State<'a> { match binding_mode { hir::BindingAnnotation::Ref => { self.word_nbsp("ref"); - self.print_mutability(hir::Mutability::Immutable, false); + self.print_mutability(hir::Mutability::Not, false); } hir::BindingAnnotation::RefMut => { self.word_nbsp("ref"); - self.print_mutability(hir::Mutability::Mutable, false); + self.print_mutability(hir::Mutability::Mut, false); } hir::BindingAnnotation::Unannotated => {} hir::BindingAnnotation::Mutable => { @@ -1674,18 +1695,20 @@ impl<'a> State<'a> { self.print_qpath(qpath, true); self.nbsp(); self.word_space("{"); - self.commasep_cmnt(Consistent, - &fields[..], - |s, f| { - s.cbox(INDENT_UNIT); - if !f.is_shorthand { - s.print_ident(f.ident); - s.word_nbsp(":"); - } - s.print_pat(&f.pat); - s.end() - }, - |f| f.pat.span); + self.commasep_cmnt( + Consistent, + &fields[..], + |s, f| { + s.cbox(INDENT_UNIT); + if !f.is_shorthand { + s.print_ident(f.ident); + s.word_nbsp(":"); + } + s.print_pat(&f.pat); + s.end() + }, + |f| f.pat.span, + ); if etc { if !fields.is_empty() { self.word_space(","); @@ -1749,13 +1772,17 @@ impl<'a> State<'a> { } PatKind::Lit(ref e) => self.print_expr(&e), PatKind::Range(ref begin, ref end, ref end_kind) => { - self.print_expr(&begin); - self.s.space(); + if let Some(expr) = begin { + self.print_expr(expr); + self.s.space(); + } match *end_kind { RangeEnd::Included => self.s.word("..."), RangeEnd::Excluded => self.s.word(".."), } - self.print_expr(&end); + if let Some(expr) = end { + self.print_expr(expr); + } } PatKind::Slice(ref before, ref slice, ref after) => { self.s.word("["); @@ -1781,12 +1808,12 @@ impl<'a> State<'a> { self.ann.post(self, AnnNode::Pat(pat)) } - pub fn print_param(&mut self, arg: &hir::Param) { + pub fn print_param(&mut self, arg: &hir::Param<'_>) { self.print_outer_attributes(&arg.attrs); self.print_pat(&arg.pat); } - pub fn print_arm(&mut self, arm: &hir::Arm) { + pub fn print_arm(&mut self, arm: &hir::Arm<'_>) { // I have no idea why this check is necessary, but here it // is :( if arm.attrs.is_empty() { @@ -1833,15 +1860,16 @@ impl<'a> State<'a> { self.end() // close enclosing cbox } - pub fn print_fn(&mut self, - decl: &hir::FnDecl, - header: hir::FnHeader, - name: Option, - generics: &hir::Generics, - vis: &hir::Visibility, - arg_names: &[ast::Ident], - body_id: Option) - { + pub fn print_fn( + &mut self, + decl: &hir::FnDecl<'_>, + header: hir::FnHeader, + name: Option, + generics: &hir::Generics<'_>, + vis: &hir::Visibility<'_>, + arg_names: &[ast::Ident], + body_id: Option, + ) { self.print_fn_header_info(header, vis); if let Some(name) = name { @@ -1878,7 +1906,7 @@ impl<'a> State<'a> { self.print_where_clause(&generics.where_clause) } - fn print_closure_params(&mut self, decl: &hir::FnDecl, body_id: hir::BodyId) { + fn print_closure_params(&mut self, decl: &hir::FnDecl<'_>, body_id: hir::BodyId) { self.s.word("|"); let mut i = 0; self.commasep(Inconsistent, &decl.inputs, |s, ty| { @@ -1916,14 +1944,14 @@ impl<'a> State<'a> { pub fn print_capture_clause(&mut self, capture_clause: hir::CaptureBy) { match capture_clause { hir::CaptureBy::Value => self.word_space("move"), - hir::CaptureBy::Ref => {}, + hir::CaptureBy::Ref => {} } } pub fn print_bounds<'b>( &mut self, prefix: &'static str, - bounds: impl IntoIterator, + bounds: impl IntoIterator>, ) { let mut first = true; for bound in bounds { @@ -1953,19 +1981,17 @@ impl<'a> State<'a> { } } - pub fn print_generic_params(&mut self, generic_params: &[GenericParam]) { + pub fn print_generic_params(&mut self, generic_params: &[GenericParam<'_>]) { if !generic_params.is_empty() { self.s.word("<"); - self.commasep(Inconsistent, generic_params, |s, param| { - s.print_generic_param(param) - }); + self.commasep(Inconsistent, generic_params, |s, param| s.print_generic_param(param)); self.s.word(">"); } } - pub fn print_generic_param(&mut self, param: &GenericParam) { + pub fn print_generic_param(&mut self, param: &GenericParam<'_>) { if let GenericParamKind::Const { .. } = param.kind { self.word_space("const"); } @@ -1975,19 +2001,19 @@ impl<'a> State<'a> { match param.kind { GenericParamKind::Lifetime { .. } => { let mut sep = ":"; - for bound in ¶m.bounds { + for bound in param.bounds { match bound { - GenericBound::Outlives(lt) => { + GenericBound::Outlives(ref lt) => { self.s.word(sep); self.print_lifetime(lt); sep = "+"; } - _ => bug!(), + _ => panic!(), } } } GenericParamKind::Type { ref default, .. } => { - self.print_bounds(":", ¶m.bounds); + self.print_bounds(":", param.bounds); match default { Some(default) => { self.s.space(); @@ -2008,7 +2034,7 @@ impl<'a> State<'a> { self.print_ident(lifetime.name.ident()) } - pub fn print_where_clause(&mut self, where_clause: &hir::WhereClause) { + pub fn print_where_clause(&mut self, where_clause: &hir::WhereClause<'_>) { if where_clause.predicates.is_empty() { return; } @@ -2025,16 +2051,18 @@ impl<'a> State<'a> { &hir::WherePredicate::BoundPredicate(hir::WhereBoundPredicate { ref bound_generic_params, ref bounded_ty, - ref bounds, + bounds, .. }) => { self.print_formal_generic_params(bound_generic_params); self.print_type(&bounded_ty); self.print_bounds(":", bounds); } - &hir::WherePredicate::RegionPredicate(hir::WhereRegionPredicate{ref lifetime, - ref bounds, - ..}) => { + &hir::WherePredicate::RegionPredicate(hir::WhereRegionPredicate { + ref lifetime, + ref bounds, + .. + }) => { self.print_lifetime(lifetime); self.s.word(":"); @@ -2043,7 +2071,7 @@ impl<'a> State<'a> { GenericBound::Outlives(lt) => { self.print_lifetime(lt); } - _ => bug!(), + _ => panic!(), } if i != 0 { @@ -2051,9 +2079,11 @@ impl<'a> State<'a> { } } } - &hir::WherePredicate::EqPredicate(hir::WhereEqPredicate{ref lhs_ty, - ref rhs_ty, - ..}) => { + &hir::WherePredicate::EqPredicate(hir::WhereEqPredicate { + ref lhs_ty, + ref rhs_ty, + .. + }) => { self.print_type(lhs_ty); self.s.space(); self.word_space("="); @@ -2065,17 +2095,21 @@ impl<'a> State<'a> { pub fn print_mutability(&mut self, mutbl: hir::Mutability, print_const: bool) { match mutbl { - hir::Mutability::Mutable => self.word_nbsp("mut"), - hir::Mutability::Immutable => if print_const { self.word_nbsp("const") }, + hir::Mutability::Mut => self.word_nbsp("mut"), + hir::Mutability::Not => { + if print_const { + self.word_nbsp("const") + } + } } } - pub fn print_mt(&mut self, mt: &hir::MutTy, print_const: bool) { + pub fn print_mt(&mut self, mt: &hir::MutTy<'_>, print_const: bool) { self.print_mutability(mt.mutbl, print_const); self.print_type(&mt.ty) } - pub fn print_fn_output(&mut self, decl: &hir::FnDecl) { + pub fn print_fn_output(&mut self, decl: &hir::FnDecl<'_>) { if let hir::DefaultReturn(..) = decl.output { return; } @@ -2091,51 +2125,51 @@ impl<'a> State<'a> { match decl.output { hir::Return(ref output) => self.maybe_print_comment(output.span.lo()), - _ => {}, + _ => {} } } - pub fn print_ty_fn(&mut self, - abi: Abi, - unsafety: hir::Unsafety, - decl: &hir::FnDecl, - name: Option, - generic_params: &[hir::GenericParam], - arg_names: &[ast::Ident]) - { + pub fn print_ty_fn( + &mut self, + abi: Abi, + unsafety: hir::Unsafety, + decl: &hir::FnDecl<'_>, + name: Option, + generic_params: &[hir::GenericParam<'_>], + arg_names: &[ast::Ident], + ) { self.ibox(INDENT_UNIT); if !generic_params.is_empty() { self.s.word("for"); self.print_generic_params(generic_params); } let generics = hir::Generics { - params: hir::HirVec::new(), - where_clause: hir::WhereClause { - predicates: hir::HirVec::new(), - span: syntax_pos::DUMMY_SP, - }, - span: syntax_pos::DUMMY_SP, + params: &[], + where_clause: hir::WhereClause { predicates: &[], span: rustc_span::DUMMY_SP }, + span: rustc_span::DUMMY_SP, }; - self.print_fn(decl, - hir::FnHeader { - unsafety, - abi, - constness: hir::Constness::NotConst, - asyncness: hir::IsAsync::NotAsync, - }, - name, - &generics, - &Spanned { span: syntax_pos::DUMMY_SP, - node: hir::VisibilityKind::Inherited }, - arg_names, - None); + self.print_fn( + decl, + hir::FnHeader { + unsafety, + abi, + constness: hir::Constness::NotConst, + asyncness: hir::IsAsync::NotAsync, + }, + name, + &generics, + &Spanned { span: rustc_span::DUMMY_SP, node: hir::VisibilityKind::Inherited }, + arg_names, + None, + ); self.end(); } - pub fn maybe_print_trailing_comment(&mut self, - span: syntax_pos::Span, - next_pos: Option) - { + pub fn maybe_print_trailing_comment( + &mut self, + span: rustc_span::Span, + next_pos: Option, + ) { if let Some(cmnts) = self.comments() { if let Some(cmnt) = cmnts.trailing_comment(span, next_pos) { self.print_comment(&cmnt); @@ -2154,16 +2188,14 @@ impl<'a> State<'a> { } } - pub fn print_opt_abi_and_extern_if_nondefault(&mut self, - opt_abi: Option) - { + pub fn print_opt_abi_and_extern_if_nondefault(&mut self, opt_abi: Option) { match opt_abi { - Some(Abi::Rust) => {}, + Some(Abi::Rust) => {} Some(abi) => { self.word_nbsp("extern"); self.word_nbsp(abi.to_string()) } - None => {}, + None => {} } } @@ -2173,14 +2205,11 @@ impl<'a> State<'a> { self.word_nbsp("extern"); self.word_nbsp(abi.to_string()) } - None => {}, + None => {} } } - pub fn print_fn_header_info(&mut self, - header: hir::FnHeader, - vis: &hir::Visibility) - { + pub fn print_fn_header_info(&mut self, header: hir::FnHeader, vis: &hir::Visibility<'_>) { self.s.word(visibility_qualified(vis, "")); match header.constness { @@ -2213,7 +2242,7 @@ impl<'a> State<'a> { pub fn print_is_auto(&mut self, s: hir::IsAuto) { match s { hir::IsAuto::Yes => self.word_nbsp("auto"), - hir::IsAuto::No => {}, + hir::IsAuto::No => {} } } } @@ -2227,11 +2256,9 @@ impl<'a> State<'a> { /// isn't parsed as (if true {...} else {...} | x) | 5 // // Duplicated from `parse::classify`, but adapted for the HIR. -fn expr_requires_semi_to_be_stmt(e: &hir::Expr) -> bool { +fn expr_requires_semi_to_be_stmt(e: &hir::Expr<'_>) -> bool { match e.kind { - hir::ExprKind::Match(..) | - hir::ExprKind::Block(..) | - hir::ExprKind::Loop(..) => false, + hir::ExprKind::Match(..) | hir::ExprKind::Block(..) | hir::ExprKind::Loop(..) => false, _ => true, } } @@ -2239,7 +2266,7 @@ fn expr_requires_semi_to_be_stmt(e: &hir::Expr) -> bool { /// This statement requires a semicolon after it. /// note that in one case (stmt_semi), we've already /// seen the semicolon, and thus don't need another. -fn stmt_ends_with_semi(stmt: &hir::StmtKind) -> bool { +fn stmt_ends_with_semi(stmt: &hir::StmtKind<'_>) -> bool { match *stmt { hir::StmtKind::Local(_) => true, hir::StmtKind::Item(_) => false, @@ -2278,21 +2305,21 @@ fn bin_op_to_assoc_op(op: hir::BinOpKind) -> AssocOp { /// Expressions that syntactically contain an "exterior" struct literal, i.e., not surrounded by any /// parens or other delimiters, e.g., `X { y: 1 }`, `X { y: 1 }.method()`, `foo == X { y: 1 }` and /// `X { y: 1 } == foo` all do, but `(X { y: 1 }) == foo` does not. -fn contains_exterior_struct_lit(value: &hir::Expr) -> bool { +fn contains_exterior_struct_lit(value: &hir::Expr<'_>) -> bool { match value.kind { hir::ExprKind::Struct(..) => true, - hir::ExprKind::Assign(ref lhs, ref rhs) | - hir::ExprKind::AssignOp(_, ref lhs, ref rhs) | - hir::ExprKind::Binary(_, ref lhs, ref rhs) => { + hir::ExprKind::Assign(ref lhs, ref rhs, _) + | hir::ExprKind::AssignOp(_, ref lhs, ref rhs) + | hir::ExprKind::Binary(_, ref lhs, ref rhs) => { // `X { y: 1 } + X { y: 2 }` contains_exterior_struct_lit(&lhs) || contains_exterior_struct_lit(&rhs) } - hir::ExprKind::Unary(_, ref x) | - hir::ExprKind::Cast(ref x, _) | - hir::ExprKind::Type(ref x, _) | - hir::ExprKind::Field(ref x, _) | - hir::ExprKind::Index(ref x, _) => { + hir::ExprKind::Unary(_, ref x) + | hir::ExprKind::Cast(ref x, _) + | hir::ExprKind::Type(ref x, _) + | hir::ExprKind::Field(ref x, _) + | hir::ExprKind::Index(ref x, _) => { // `&X { y: 1 }, X { y: 1 }.y` contains_exterior_struct_lit(&x) } diff --git a/src/librustc_hir/stable_hash_impls.rs b/src/librustc_hir/stable_hash_impls.rs new file mode 100644 index 0000000000..696a350ebd --- /dev/null +++ b/src/librustc_hir/stable_hash_impls.rs @@ -0,0 +1,81 @@ +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; + +use crate::def_id::DefId; +use crate::hir::{BodyId, Expr, ImplItemId, ItemId, Mod, TraitItemId, Ty, VisibilityKind}; +use crate::hir_id::HirId; + +/// Requirements for a `StableHashingContext` to be used in this crate. +/// This is a hack to allow using the `HashStable_Generic` derive macro +/// instead of implementing everything in librustc. +pub trait HashStableContext: syntax::HashStableContext + rustc_target::HashStableContext { + fn hash_def_id(&mut self, _: DefId, hasher: &mut StableHasher); + fn hash_hir_id(&mut self, _: HirId, hasher: &mut StableHasher); + fn hash_body_id(&mut self, _: BodyId, hasher: &mut StableHasher); + fn hash_item_id(&mut self, _: ItemId, hasher: &mut StableHasher); + fn hash_impl_item_id(&mut self, _: ImplItemId, hasher: &mut StableHasher); + fn hash_trait_item_id(&mut self, _: TraitItemId, hasher: &mut StableHasher); + fn hash_hir_mod(&mut self, _: &Mod<'_>, hasher: &mut StableHasher); + fn hash_hir_expr(&mut self, _: &Expr<'_>, hasher: &mut StableHasher); + fn hash_hir_ty(&mut self, _: &Ty<'_>, hasher: &mut StableHasher); + fn hash_hir_visibility_kind(&mut self, _: &VisibilityKind<'_>, hasher: &mut StableHasher); +} + +impl HashStable for HirId { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_hir_id(*self, hasher) + } +} + +impl HashStable for DefId { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_def_id(*self, hasher) + } +} + +impl HashStable for BodyId { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_body_id(*self, hasher) + } +} + +impl HashStable for ItemId { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_item_id(*self, hasher) + } +} + +impl HashStable for ImplItemId { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_impl_item_id(*self, hasher) + } +} + +impl HashStable for TraitItemId { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_trait_item_id(*self, hasher) + } +} + +impl HashStable for Mod<'_> { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_hir_mod(self, hasher) + } +} + +impl HashStable for Expr<'_> { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_hir_expr(self, hasher) + } +} + +impl HashStable for Ty<'_> { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_hir_ty(self, hasher) + } +} + +impl HashStable for VisibilityKind<'_> { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + hcx.hash_hir_visibility_kind(self, hasher) + } +} diff --git a/src/librustc_incremental/Cargo.toml b/src/librustc_incremental/Cargo.toml index 8dac7263f4..09b33a6c83 100644 --- a/src/librustc_incremental/Cargo.toml +++ b/src/librustc_incremental/Cargo.toml @@ -15,8 +15,9 @@ log = "0.4" rand = "0.7" rustc = { path = "../librustc" } rustc_data_structures = { path = "../librustc_data_structures" } +rustc_hir = { path = "../librustc_hir" } rustc_serialize = { path = "../libserialize", package = "serialize" } syntax = { path = "../libsyntax" } -syntax_pos = { path = "../libsyntax_pos" } +rustc_span = { path = "../librustc_span" } rustc_fs_util = { path = "../librustc_fs_util" } rustc_session = { path = "../librustc_session" } diff --git a/src/librustc_incremental/assert_dep_graph.rs b/src/librustc_incremental/assert_dep_graph.rs index 07d426af6e..9490128e32 100644 --- a/src/librustc_incremental/assert_dep_graph.rs +++ b/src/librustc_incremental/assert_dep_graph.rs @@ -34,22 +34,22 @@ //! ``` use graphviz as dot; -use rustc::dep_graph::{DepGraphQuery, DepNode, DepKind}; use rustc::dep_graph::debug::{DepNodeFilter, EdgeFilter}; -use rustc::hir::def_id::DefId; +use rustc::dep_graph::{DepGraphQuery, DepKind, DepNode}; +use rustc::hir::map::Map; use rustc::ty::TyCtxt; use rustc_data_structures::fx::FxHashSet; -use rustc_data_structures::graph::implementation::{ - Direction, INCOMING, OUTGOING, NodeIndex -}; -use rustc::hir; -use rustc::hir::intravisit::{self, NestedVisitorMap, Visitor}; -use rustc::ich::{ATTR_IF_THIS_CHANGED, ATTR_THEN_THIS_WOULD_NEED}; +use rustc_data_structures::graph::implementation::{Direction, NodeIndex, INCOMING, OUTGOING}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_span::symbol::sym; +use rustc_span::Span; +use syntax::ast; + use std::env; use std::fs::{self, File}; use std::io::Write; -use syntax::ast; -use syntax_pos::Span; pub fn assert_dep_graph(tcx: TyCtxt<'_>) { tcx.dep_graph.with_ignore(|| { @@ -66,19 +66,21 @@ pub fn assert_dep_graph(tcx: TyCtxt<'_>) { // Find annotations supplied by user (if any). let (if_this_changed, then_this_would_need) = { - let mut visitor = IfThisChanged { tcx, - if_this_changed: vec![], - then_this_would_need: vec![] }; + let mut visitor = + IfThisChanged { tcx, if_this_changed: vec![], then_this_would_need: vec![] }; visitor.process_attrs(hir::CRATE_HIR_ID, &tcx.hir().krate().attrs); tcx.hir().krate().visit_all_item_likes(&mut visitor.as_deep_visitor()); (visitor.if_this_changed, visitor.then_this_would_need) }; if !if_this_changed.is_empty() || !then_this_would_need.is_empty() { - assert!(tcx.sess.opts.debugging_opts.query_dep_graph, - "cannot use the `#[{}]` or `#[{}]` annotations \ + assert!( + tcx.sess.opts.debugging_opts.query_dep_graph, + "cannot use the `#[{}]` or `#[{}]` annotations \ without supplying `-Z query-dep-graph`", - ATTR_IF_THIS_CHANGED, ATTR_THEN_THIS_WOULD_NEED); + sym::rustc_if_this_changed, + sym::rustc_then_this_would_need + ); } // Check paths. @@ -100,11 +102,12 @@ impl IfThisChanged<'tcx> { let mut value = None; for list_item in attr.meta_item_list().unwrap_or_default() { match list_item.ident() { - Some(ident) if list_item.is_word() && value.is_none() => - value = Some(ident.name), + Some(ident) if list_item.is_word() && value.is_none() => value = Some(ident.name), _ => - // FIXME better-encapsulate meta_item (don't directly access `node`) - span_bug!(list_item.span(), "unexpected meta-item {:?}", list_item), + // FIXME better-encapsulate meta_item (don't directly access `node`) + { + span_bug!(list_item.span(), "unexpected meta-item {:?}", list_item) + } } } value @@ -114,71 +117,71 @@ impl IfThisChanged<'tcx> { let def_id = self.tcx.hir().local_def_id(hir_id); let def_path_hash = self.tcx.def_path_hash(def_id); for attr in attrs { - if attr.check_name(ATTR_IF_THIS_CHANGED) { + if attr.check_name(sym::rustc_if_this_changed) { let dep_node_interned = self.argument(attr); let dep_node = match dep_node_interned { None => def_path_hash.to_dep_node(DepKind::Hir), - Some(n) => { - match DepNode::from_label_string(&n.as_str(), def_path_hash) { - Ok(n) => n, - Err(()) => { - self.tcx.sess.span_fatal( - attr.span, - &format!("unrecognized DepNode variant {:?}", n)); - } + Some(n) => match DepNode::from_label_string(&n.as_str(), def_path_hash) { + Ok(n) => n, + Err(()) => { + self.tcx.sess.span_fatal( + attr.span, + &format!("unrecognized DepNode variant {:?}", n), + ); } - } + }, }; self.if_this_changed.push((attr.span, def_id, dep_node)); - } else if attr.check_name(ATTR_THEN_THIS_WOULD_NEED) { + } else if attr.check_name(sym::rustc_then_this_would_need) { let dep_node_interned = self.argument(attr); let dep_node = match dep_node_interned { - Some(n) => { - match DepNode::from_label_string(&n.as_str(), def_path_hash) { - Ok(n) => n, - Err(()) => { - self.tcx.sess.span_fatal( - attr.span, - &format!("unrecognized DepNode variant {:?}", n)); - } + Some(n) => match DepNode::from_label_string(&n.as_str(), def_path_hash) { + Ok(n) => n, + Err(()) => { + self.tcx.sess.span_fatal( + attr.span, + &format!("unrecognized DepNode variant {:?}", n), + ); } - } + }, None => { - self.tcx.sess.span_fatal( - attr.span, - "missing DepNode variant"); + self.tcx.sess.span_fatal(attr.span, "missing DepNode variant"); } }; - self.then_this_would_need.push((attr.span, - dep_node_interned.unwrap(), - hir_id, - dep_node)); + self.then_this_would_need.push(( + attr.span, + dep_node_interned.unwrap(), + hir_id, + dep_node, + )); } } } } impl Visitor<'tcx> for IfThisChanged<'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, Self::Map> { NestedVisitorMap::OnlyBodies(&self.tcx.hir()) } - fn visit_item(&mut self, item: &'tcx hir::Item) { + fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { self.process_attrs(item.hir_id, &item.attrs); intravisit::walk_item(self, item); } - fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem) { + fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) { self.process_attrs(trait_item.hir_id, &trait_item.attrs); intravisit::walk_trait_item(self, trait_item); } - fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem) { + fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { self.process_attrs(impl_item.hir_id, &impl_item.attrs); intravisit::walk_impl_item(self, impl_item); } - fn visit_struct_field(&mut self, s: &'tcx hir::StructField) { + fn visit_struct_field(&mut self, s: &'tcx hir::StructField<'tcx>) { self.process_attrs(s.hir_id, &s.attrs); intravisit::walk_struct_field(self, s); } @@ -188,10 +191,7 @@ fn check_paths<'tcx>(tcx: TyCtxt<'tcx>, if_this_changed: &Sources, then_this_wou // Return early here so as not to construct the query, which is not cheap. if if_this_changed.is_empty() { for &(target_span, _, _, _) in then_this_would_need { - tcx.sess.span_err( - target_span, - "no `#[rustc_if_this_changed]` annotation detected"); - + tcx.sess.span_err(target_span, "no `#[rustc_if_this_changed]` annotation detected"); } return; } @@ -202,13 +202,14 @@ fn check_paths<'tcx>(tcx: TyCtxt<'tcx>, if_this_changed: &Sources, then_this_wou if !dependents.contains(&target_dep_node) { tcx.sess.span_err( target_span, - &format!("no path from `{}` to `{}`", - tcx.def_path_str(source_def_id), - target_pass)); + &format!( + "no path from `{}` to `{}`", + tcx.def_path_str(source_def_id), + target_pass + ), + ); } else { - tcx.sess.span_err( - target_span, - "OK"); + tcx.sess.span_err(target_span, "OK"); } } } @@ -221,22 +222,18 @@ fn dump_graph(tcx: TyCtxt<'_>) { let nodes = match env::var("RUST_DEP_GRAPH_FILTER") { Ok(string) => { // Expect one of: "-> target", "source -> target", or "source ->". - let edge_filter = EdgeFilter::new(&string).unwrap_or_else(|e| { - bug!("invalid filter: {}", e) - }); + let edge_filter = + EdgeFilter::new(&string).unwrap_or_else(|e| bug!("invalid filter: {}", e)); let sources = node_set(&query, &edge_filter.source); let targets = node_set(&query, &edge_filter.target); filter_nodes(&query, &sources, &targets) } - Err(_) => { - query.nodes() - .into_iter() - .collect() - } + Err(_) => query.nodes().into_iter().collect(), }; let edges = filter_edges(&query, &nodes); - { // dump a .txt file with just the edges: + { + // dump a .txt file with just the edges: let txt_path = format!("{}.txt", path); let mut file = File::create(&txt_path).unwrap(); for &(ref source, ref target) in &edges { @@ -244,7 +241,8 @@ fn dump_graph(tcx: TyCtxt<'_>) { } } - { // dump a .dot file in graphviz format: + { + // dump a .dot file in graphviz format: let dot_path = format!("{}.dot", path); let mut v = Vec::new(); dot::render(&GraphvizDepGraph(nodes, edges), &mut v).unwrap(); @@ -252,8 +250,7 @@ fn dump_graph(tcx: TyCtxt<'_>) { } } -pub struct GraphvizDepGraph<'q>(FxHashSet<&'q DepNode>, - Vec<(&'q DepNode, &'q DepNode)>); +pub struct GraphvizDepGraph<'q>(FxHashSet<&'q DepNode>, Vec<(&'q DepNode, &'q DepNode)>); impl<'a, 'q> dot::GraphWalk<'a> for GraphvizDepGraph<'q> { type Node = &'q DepNode; @@ -280,10 +277,10 @@ impl<'a, 'q> dot::Labeller<'a> for GraphvizDepGraph<'q> { dot::Id::new("DependencyGraph").unwrap() } fn node_id(&self, n: &&'q DepNode) -> dot::Id<'_> { - let s: String = - format!("{:?}", n).chars() - .map(|c| if c == '_' || c.is_alphanumeric() { c } else { '_' }) - .collect(); + let s: String = format!("{:?}", n) + .chars() + .map(|c| if c == '_' || c.is_alphanumeric() { c } else { '_' }) + .collect(); debug!("n={:?} s={:?}", n, s); dot::Id::new(s).unwrap() } @@ -295,9 +292,10 @@ impl<'a, 'q> dot::Labeller<'a> for GraphvizDepGraph<'q> { // Given an optional filter like `"x,y,z"`, returns either `None` (no // filter) or the set of nodes whose labels contain all of those // substrings. -fn node_set<'q>(query: &'q DepGraphQuery, filter: &DepNodeFilter) - -> Option> -{ +fn node_set<'q>( + query: &'q DepGraphQuery, + filter: &DepNodeFilter, +) -> Option> { debug!("node_set(filter={:?})", filter); if filter.accepts_all() { @@ -307,11 +305,11 @@ fn node_set<'q>(query: &'q DepGraphQuery, filter: &DepNodeFilter) Some(query.nodes().into_iter().filter(|n| filter.test(n)).collect()) } -fn filter_nodes<'q>(query: &'q DepGraphQuery, - sources: &Option>, - targets: &Option>) - -> FxHashSet<&'q DepNode> -{ +fn filter_nodes<'q>( + query: &'q DepGraphQuery, + sources: &Option>, + targets: &Option>, +) -> FxHashSet<&'q DepNode> { if let &Some(ref sources) = sources { if let &Some(ref targets) = targets { walk_between(query, sources, targets) @@ -325,11 +323,11 @@ fn filter_nodes<'q>(query: &'q DepGraphQuery, } } -fn walk_nodes<'q>(query: &'q DepGraphQuery, - starts: &FxHashSet<&'q DepNode>, - direction: Direction) - -> FxHashSet<&'q DepNode> -{ +fn walk_nodes<'q>( + query: &'q DepGraphQuery, + starts: &FxHashSet<&'q DepNode>, + direction: Direction, +) -> FxHashSet<&'q DepNode> { let mut set = FxHashSet::default(); for &start in starts { debug!("walk_nodes: start={:?} outgoing?={:?}", start, direction == OUTGOING); @@ -349,18 +347,23 @@ fn walk_nodes<'q>(query: &'q DepGraphQuery, set } -fn walk_between<'q>(query: &'q DepGraphQuery, - sources: &FxHashSet<&'q DepNode>, - targets: &FxHashSet<&'q DepNode>) - -> FxHashSet<&'q DepNode> -{ +fn walk_between<'q>( + query: &'q DepGraphQuery, + sources: &FxHashSet<&'q DepNode>, + targets: &FxHashSet<&'q DepNode>, +) -> FxHashSet<&'q DepNode> { // This is a bit tricky. We want to include a node only if it is: // (a) reachable from a source and (b) will reach a target. And we // have to be careful about cycles etc. Luckily efficiency is not // a big concern! #[derive(Copy, Clone, PartialEq)] - enum State { Undecided, Deciding, Included, Excluded } + enum State { + Undecided, + Deciding, + Included, + Excluded, + } let mut node_states = vec![State::Undecided; query.graph.len_nodes()]; @@ -372,19 +375,16 @@ fn walk_between<'q>(query: &'q DepGraphQuery, recurse(query, &mut node_states, source); } - return query.nodes() - .into_iter() - .filter(|&n| { - let index = query.indices[n]; - node_states[index.0] == State::Included - }) - .collect(); - - fn recurse(query: &DepGraphQuery, - node_states: &mut [State], - node: NodeIndex) - -> bool - { + return query + .nodes() + .into_iter() + .filter(|&n| { + let index = query.indices[n]; + node_states[index.0] == State::Included + }) + .collect(); + + fn recurse(query: &DepGraphQuery, node_states: &mut [State], node: NodeIndex) -> bool { match node_states[node.0] { // known to reach a target State::Included => return true, @@ -395,7 +395,7 @@ fn walk_between<'q>(query: &'q DepGraphQuery, // backedge, not yet known, say false State::Deciding => return false, - State::Undecided => { } + State::Undecided => {} } node_states[node.0] = State::Deciding; @@ -417,12 +417,13 @@ fn walk_between<'q>(query: &'q DepGraphQuery, } } -fn filter_edges<'q>(query: &'q DepGraphQuery, - nodes: &FxHashSet<&'q DepNode>) - -> Vec<(&'q DepNode, &'q DepNode)> -{ - query.edges() - .into_iter() - .filter(|&(source, target)| nodes.contains(source) && nodes.contains(target)) - .collect() +fn filter_edges<'q>( + query: &'q DepGraphQuery, + nodes: &FxHashSet<&'q DepNode>, +) -> Vec<(&'q DepNode, &'q DepNode)> { + query + .edges() + .into_iter() + .filter(|&(source, target)| nodes.contains(source) && nodes.contains(target)) + .collect() } diff --git a/src/librustc_incremental/assert_module_sources.rs b/src/librustc_incremental/assert_module_sources.rs index c2e3fa8f28..70abb38278 100644 --- a/src/librustc_incremental/assert_module_sources.rs +++ b/src/librustc_incremental/assert_module_sources.rs @@ -21,15 +21,13 @@ //! allows for doing a more fine-grained check to see if pre- or post-lto data //! was re-used. -use rustc::hir::def_id::LOCAL_CRATE; -use rustc_session::cgu_reuse_tracker::*; use rustc::mir::mono::CodegenUnitNameBuilder; use rustc::ty::TyCtxt; +use rustc_hir::def_id::LOCAL_CRATE; +use rustc_session::cgu_reuse_tracker::*; +use rustc_span::symbol::{sym, Symbol}; use std::collections::BTreeSet; use syntax::ast; -use syntax::symbol::{Symbol, sym}; -use rustc::ich::{ATTR_PARTITION_REUSED, ATTR_PARTITION_CODEGENED, - ATTR_EXPECTED_CGU_REUSE}; pub fn assert_module_sources(tcx: TyCtxt<'_>) { tcx.dep_graph.with_ignore(|| { @@ -44,12 +42,9 @@ pub fn assert_module_sources(tcx: TyCtxt<'_>) { .map(|cgu| cgu.name()) .collect::>(); - let ams = AssertModuleSource { - tcx, - available_cgus - }; + let ams = AssertModuleSource { tcx, available_cgus }; - for attr in &tcx.hir().krate().attrs { + for attr in tcx.hir().krate().attrs { ams.check_attr(attr); } }) @@ -62,11 +57,11 @@ struct AssertModuleSource<'tcx> { impl AssertModuleSource<'tcx> { fn check_attr(&self, attr: &ast::Attribute) { - let (expected_reuse, comp_kind) = if attr.check_name(ATTR_PARTITION_REUSED) { + let (expected_reuse, comp_kind) = if attr.check_name(sym::rustc_partition_reused) { (CguReuse::PreLto, ComparisonKind::AtLeast) - } else if attr.check_name(ATTR_PARTITION_CODEGENED) { + } else if attr.check_name(sym::rustc_partition_codegened) { (CguReuse::No, ComparisonKind::Exact) - } else if attr.check_name(ATTR_EXPECTED_CGU_REUSE) { + } else if attr.check_name(sym::rustc_expected_cgu_reuse) { match &*self.field(attr, sym::kind).as_str() { "no" => (CguReuse::No, ComparisonKind::Exact), "pre-lto" => (CguReuse::PreLto, ComparisonKind::Exact), @@ -75,7 +70,8 @@ impl AssertModuleSource<'tcx> { other => { self.tcx.sess.span_fatal( attr.span, - &format!("unknown cgu-reuse-kind `{}` specified", other)); + &format!("unknown cgu-reuse-kind `{}` specified", other), + ); } } } else { @@ -85,8 +81,11 @@ impl AssertModuleSource<'tcx> { if !self.tcx.sess.opts.debugging_opts.query_dep_graph { self.tcx.sess.span_fatal( attr.span, - &format!("found CGU-reuse attribute but `-Zquery-dep-graph` \ - was not specified")); + &format!( + "found CGU-reuse attribute but `-Zquery-dep-graph` \ + was not specified" + ), + ); } if !self.check_config(attr) { @@ -98,15 +97,18 @@ impl AssertModuleSource<'tcx> { let crate_name = self.tcx.crate_name(LOCAL_CRATE).to_string(); if !user_path.starts_with(&crate_name) { - let msg = format!("Found malformed codegen unit name `{}`. \ + let msg = format!( + "Found malformed codegen unit name `{}`. \ Codegen units names must always start with the name of the \ - crate (`{}` in this case).", user_path, crate_name); + crate (`{}` in this case).", + user_path, crate_name + ); self.tcx.sess.span_fatal(attr.span, &msg); } // Split of the "special suffix" if there is one. let (user_path, cgu_special_suffix) = if let Some(index) = user_path.rfind(".") { - (&user_path[..index], Some(&user_path[index + 1 ..])) + (&user_path[..index], Some(&user_path[index + 1..])) } else { (&user_path[..], None) }; @@ -117,15 +119,16 @@ impl AssertModuleSource<'tcx> { assert_eq!(cgu_path_components.remove(0), crate_name); let cgu_name_builder = &mut CodegenUnitNameBuilder::new(self.tcx); - let cgu_name = cgu_name_builder.build_cgu_name(LOCAL_CRATE, - cgu_path_components, - cgu_special_suffix); + let cgu_name = + cgu_name_builder.build_cgu_name(LOCAL_CRATE, cgu_path_components, cgu_special_suffix); debug!("mapping '{}' to cgu name '{}'", self.field(attr, sym::module), cgu_name); if !self.available_cgus.contains(&cgu_name) { - self.tcx.sess.span_err(attr.span, - &format!("no module named `{}` (mangled: {}). \ + self.tcx.sess.span_err( + attr.span, + &format!( + "no module named `{}` (mangled: {}). \ Available modules: {}", user_path, cgu_name, @@ -133,14 +136,18 @@ impl AssertModuleSource<'tcx> { .iter() .map(|cgu| cgu.to_string()) .collect::>() - .join(", "))); + .join(", ") + ), + ); } - self.tcx.sess.cgu_reuse_tracker.set_expectation(&cgu_name.as_str(), - &user_path, - attr.span, - expected_reuse, - comp_kind); + self.tcx.sess.cgu_reuse_tracker.set_expectation( + &cgu_name.as_str(), + &user_path, + attr.span, + expected_reuse, + comp_kind, + ); } fn field(&self, attr: &ast::Attribute, name: Symbol) -> ast::Name { @@ -151,14 +158,13 @@ impl AssertModuleSource<'tcx> { } else { self.tcx.sess.span_fatal( item.span(), - &format!("associated value expected for `{}`", name)); + &format!("associated value expected for `{}`", name), + ); } } } - self.tcx.sess.span_fatal( - attr.span, - &format!("no field `{}`", name)); + self.tcx.sess.span_fatal(attr.span, &format!("no field `{}`", name)); } /// Scan for a `cfg="foo"` attribute and check whether we have a diff --git a/src/librustc_incremental/lib.rs b/src/librustc_incremental/lib.rs index b257311138..7ce4def288 100644 --- a/src/librustc_incremental/lib.rs +++ b/src/librustc_incremental/lib.rs @@ -1,31 +1,31 @@ //! Support for serializing the dep-graph and reloading it. #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")] - #![feature(in_band_lifetimes)] #![feature(nll)] #![feature(specialization)] +#![recursion_limit = "256"] -#![recursion_limit="256"] - -#[macro_use] extern crate rustc; -#[macro_use] extern crate log; +#[macro_use] +extern crate rustc; +#[macro_use] +extern crate log; mod assert_dep_graph; pub mod assert_module_sources; mod persist; pub use assert_dep_graph::assert_dep_graph; -pub use persist::dep_graph_tcx_init; -pub use persist::{DepGraphFuture, load_dep_graph}; -pub use persist::load_query_result_cache; -pub use persist::LoadResult; pub use persist::copy_cgu_workproducts_to_incr_comp_cache_dir; -pub use persist::save_dep_graph; -pub use persist::save_work_product_index; +pub use persist::delete_workproduct_files; +pub use persist::dep_graph_tcx_init; +pub use persist::finalize_session_directory; +pub use persist::garbage_collect_session_directories; pub use persist::in_incr_comp_dir; pub use persist::in_incr_comp_dir_sess; +pub use persist::load_query_result_cache; pub use persist::prepare_session_directory; -pub use persist::finalize_session_directory; -pub use persist::delete_workproduct_files; -pub use persist::garbage_collect_session_directories; +pub use persist::save_dep_graph; +pub use persist::save_work_product_index; +pub use persist::LoadResult; +pub use persist::{load_dep_graph, DepGraphFuture}; diff --git a/src/librustc_incremental/persist/dirty_clean.rs b/src/librustc_incremental/persist/dirty_clean.rs index ea156a94ea..c5e74868bd 100644 --- a/src/librustc_incremental/persist/dirty_clean.rs +++ b/src/librustc_incremental/persist/dirty_clean.rs @@ -13,22 +13,22 @@ //! Errors are reported if we are in the suitable configuration but //! the required condition is not met. -use std::iter::FromIterator; -use std::vec::Vec; -use rustc::dep_graph::{DepNode, label_strs}; -use rustc::hir; -use rustc::hir::{ItemKind as HirItem, ImplItemKind, TraitItemKind}; -use rustc::hir::Node as HirNode; -use rustc::hir::def_id::DefId; -use rustc::hir::itemlikevisit::ItemLikeVisitor; -use rustc::hir::intravisit; -use rustc::ich::{ATTR_DIRTY, ATTR_CLEAN}; +use rustc::dep_graph::{label_strs, DepNode}; +use rustc::hir::map::Map; use rustc::ty::TyCtxt; use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::FxHashSet; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::intravisit; +use rustc_hir::itemlikevisit::ItemLikeVisitor; +use rustc_hir::Node as HirNode; +use rustc_hir::{ImplItemKind, ItemKind as HirItem, TraitItemKind}; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; +use std::iter::FromIterator; +use std::vec::Vec; use syntax::ast::{self, Attribute, NestedMetaItem}; -use syntax::symbol::{Symbol, sym}; -use syntax_pos::Span; const EXCEPT: Symbol = sym::except; const LABEL: Symbol = sym::label; @@ -37,9 +37,7 @@ const CFG: Symbol = sym::cfg; // Base and Extra labels to build up the labels /// For typedef, constants, and statics -const BASE_CONST: &[&str] = &[ - label_strs::type_of, -]; +const BASE_CONST: &[&str] = &[label_strs::type_of]; /// DepNodes for functions + methods const BASE_FN: &[&str] = &[ @@ -48,7 +46,6 @@ const BASE_FN: &[&str] = &[ label_strs::generics_of, label_strs::predicates_of, label_strs::type_of, - // And a big part of compilation (that we eventually want to cache) is type inference // information: label_strs::typeck_tables_of, @@ -62,29 +59,20 @@ const BASE_HIR: &[&str] = &[ ]; /// `impl` implementation of struct/trait -const BASE_IMPL: &[&str] = &[ - label_strs::associated_item_def_ids, - label_strs::generics_of, - label_strs::impl_trait_ref, -]; +const BASE_IMPL: &[&str] = + &[label_strs::associated_item_def_ids, label_strs::generics_of, label_strs::impl_trait_ref]; /// DepNodes for mir_built/Optimized, which is relevant in "executable" /// code, i.e., functions+methods -const BASE_MIR: &[&str] = &[ - label_strs::optimized_mir, - label_strs::promoted_mir, - label_strs::mir_built, -]; +const BASE_MIR: &[&str] = + &[label_strs::optimized_mir, label_strs::promoted_mir, label_strs::mir_built]; /// Struct, Enum and Union DepNodes /// /// Note that changing the type of a field does not change the type of the struct or enum, but /// adding/removing fields or changing a fields name or visibility does. -const BASE_STRUCT: &[&str] = &[ - label_strs::generics_of, - label_strs::predicates_of, - label_strs::type_of, -]; +const BASE_STRUCT: &[&str] = + &[label_strs::generics_of, label_strs::predicates_of, label_strs::type_of]; /// Trait definition `DepNode`s. const BASE_TRAIT_DEF: &[&str] = &[ @@ -98,84 +86,42 @@ const BASE_TRAIT_DEF: &[&str] = &[ ]; /// Extra `DepNode`s for functions and methods. -const EXTRA_ASSOCIATED: &[&str] = &[ - label_strs::associated_item, -]; +const EXTRA_ASSOCIATED: &[&str] = &[label_strs::associated_item]; -const EXTRA_TRAIT: &[&str] = &[ - label_strs::trait_of_item, -]; +const EXTRA_TRAIT: &[&str] = &[label_strs::trait_of_item]; // Fully Built Labels -const LABELS_CONST: &[&[&str]] = &[ - BASE_HIR, - BASE_CONST, -]; +const LABELS_CONST: &[&[&str]] = &[BASE_HIR, BASE_CONST]; /// Constant/Typedef in an impl -const LABELS_CONST_IN_IMPL: &[&[&str]] = &[ - BASE_HIR, - BASE_CONST, - EXTRA_ASSOCIATED, -]; +const LABELS_CONST_IN_IMPL: &[&[&str]] = &[BASE_HIR, BASE_CONST, EXTRA_ASSOCIATED]; /// Trait-Const/Typedef DepNodes -const LABELS_CONST_IN_TRAIT: &[&[&str]] = &[ - BASE_HIR, - BASE_CONST, - EXTRA_ASSOCIATED, - EXTRA_TRAIT, -]; +const LABELS_CONST_IN_TRAIT: &[&[&str]] = &[BASE_HIR, BASE_CONST, EXTRA_ASSOCIATED, EXTRA_TRAIT]; /// Function `DepNode`s. -const LABELS_FN: &[&[&str]] = &[ - BASE_HIR, - BASE_MIR, - BASE_FN, -]; +const LABELS_FN: &[&[&str]] = &[BASE_HIR, BASE_MIR, BASE_FN]; /// Method `DepNode`s. -const LABELS_FN_IN_IMPL: &[&[&str]] = &[ - BASE_HIR, - BASE_MIR, - BASE_FN, - EXTRA_ASSOCIATED, -]; +const LABELS_FN_IN_IMPL: &[&[&str]] = &[BASE_HIR, BASE_MIR, BASE_FN, EXTRA_ASSOCIATED]; /// Trait method `DepNode`s. -const LABELS_FN_IN_TRAIT: &[&[&str]] = &[ - BASE_HIR, - BASE_MIR, - BASE_FN, - EXTRA_ASSOCIATED, - EXTRA_TRAIT, -]; +const LABELS_FN_IN_TRAIT: &[&[&str]] = + &[BASE_HIR, BASE_MIR, BASE_FN, EXTRA_ASSOCIATED, EXTRA_TRAIT]; /// For generic cases like inline-assembly, modules, etc. -const LABELS_HIR_ONLY: &[&[&str]] = &[ - BASE_HIR, -]; +const LABELS_HIR_ONLY: &[&[&str]] = &[BASE_HIR]; /// Impl `DepNode`s. -const LABELS_IMPL: &[&[&str]] = &[ - BASE_HIR, - BASE_IMPL, -]; +const LABELS_IMPL: &[&[&str]] = &[BASE_HIR, BASE_IMPL]; /// Abstract data type (struct, enum, union) `DepNode`s. -const LABELS_ADT: &[&[&str]] = &[ - BASE_HIR, - BASE_STRUCT, -]; +const LABELS_ADT: &[&[&str]] = &[BASE_HIR, BASE_STRUCT]; /// Trait definition `DepNode`s. #[allow(dead_code)] -const LABELS_TRAIT: &[&[&str]] = &[ - BASE_HIR, - BASE_TRAIT_DEF, -]; - +const LABELS_TRAIT: &[&[&str]] = &[BASE_HIR, BASE_TRAIT_DEF]; // FIXME: Struct/Enum/Unions Fields (there is currently no way to attach these) // @@ -194,17 +140,11 @@ struct Assertion { impl Assertion { fn from_clean_labels(labels: Labels) -> Assertion { - Assertion { - clean: labels, - dirty: Labels::default(), - } + Assertion { clean: labels, dirty: Labels::default() } } fn from_dirty_labels(labels: Labels) -> Assertion { - Assertion { - clean: Labels::default(), - dirty: labels, - } + Assertion { clean: Labels::default(), dirty: labels } } } @@ -216,15 +156,12 @@ pub fn check_dirty_clean_annotations(tcx: TyCtxt<'_>) { tcx.dep_graph.with_ignore(|| { let krate = tcx.hir().krate(); - let mut dirty_clean_visitor = DirtyCleanVisitor { - tcx, - checked_attrs: Default::default(), - }; + let mut dirty_clean_visitor = DirtyCleanVisitor { tcx, checked_attrs: Default::default() }; krate.visit_all_item_likes(&mut dirty_clean_visitor); let mut all_attrs = FindAllAttrs { tcx, - attr_names: vec![ATTR_DIRTY, ATTR_CLEAN], + attr_names: vec![sym::rustc_dirty, sym::rustc_clean], found_attrs: vec![], }; intravisit::walk_crate(&mut all_attrs, krate); @@ -243,16 +180,14 @@ pub struct DirtyCleanVisitor<'tcx> { impl DirtyCleanVisitor<'tcx> { /// Possibly "deserialize" the attribute into a clean/dirty assertion - fn assertion_maybe(&mut self, item_id: hir::HirId, attr: &Attribute) - -> Option - { - let is_clean = if attr.check_name(ATTR_DIRTY) { + fn assertion_maybe(&mut self, item_id: hir::HirId, attr: &Attribute) -> Option { + let is_clean = if attr.check_name(sym::rustc_dirty) { false - } else if attr.check_name(ATTR_CLEAN) { + } else if attr.check_name(sym::rustc_clean) { true } else { // skip: not rustc_clean/dirty - return None + return None; }; if !check_config(self.tcx, attr) { // skip: not the correct `cfg=` @@ -271,31 +206,27 @@ impl DirtyCleanVisitor<'tcx> { } /// Gets the "auto" assertion on pre-validated attr, along with the `except` labels. - fn assertion_auto(&mut self, item_id: hir::HirId, attr: &Attribute, is_clean: bool) - -> Assertion - { + fn assertion_auto( + &mut self, + item_id: hir::HirId, + attr: &Attribute, + is_clean: bool, + ) -> Assertion { let (name, mut auto) = self.auto_labels(item_id, attr); let except = self.except(attr); for e in except.iter() { if !auto.remove(e) { let msg = format!( "`except` specified DepNodes that can not be affected for \"{}\": \"{}\"", - name, - e + name, e ); self.tcx.sess.span_fatal(attr.span, &msg); } } if is_clean { - Assertion { - clean: auto, - dirty: except, - } + Assertion { clean: auto, dirty: except } } else { - Assertion { - clean: except, - dirty: auto, - } + Assertion { clean: except, dirty: auto } } } @@ -347,7 +278,7 @@ impl DirtyCleanVisitor<'tcx> { HirItem::Fn(..) => ("ItemFn", LABELS_FN), // // A module - HirItem::Mod(..) =>("ItemMod", LABELS_HIR_ONLY), + HirItem::Mod(..) => ("ItemMod", LABELS_HIR_ONLY), // // An external module HirItem::ForeignMod(..) => ("ItemForeignMod", LABELS_HIR_ONLY), @@ -384,7 +315,7 @@ impl DirtyCleanVisitor<'tcx> { //HirItem::Trait(..) => ("ItemTrait", LABELS_TRAIT), // An implementation, eg `impl Trait for Foo { .. }` - HirItem::Impl(..) => ("ItemKind::Impl", LABELS_IMPL), + HirItem::Impl { .. } => ("ItemKind::Impl", LABELS_IMPL), _ => self.tcx.sess.span_fatal( attr.span, @@ -392,36 +323,27 @@ impl DirtyCleanVisitor<'tcx> { "clean/dirty auto-assertions not yet defined \ for Node::Item.node={:?}", item.kind - ) + ), ), } + } + HirNode::TraitItem(item) => match item.kind { + TraitItemKind::Method(..) => ("Node::TraitItem", LABELS_FN_IN_TRAIT), + TraitItemKind::Const(..) => ("NodeTraitConst", LABELS_CONST_IN_TRAIT), + TraitItemKind::Type(..) => ("NodeTraitType", LABELS_CONST_IN_TRAIT), }, - HirNode::TraitItem(item) => { - match item.kind { - TraitItemKind::Method(..) => ("Node::TraitItem", LABELS_FN_IN_TRAIT), - TraitItemKind::Const(..) => ("NodeTraitConst", LABELS_CONST_IN_TRAIT), - TraitItemKind::Type(..) => ("NodeTraitType", LABELS_CONST_IN_TRAIT), - } - }, - HirNode::ImplItem(item) => { - match item.kind { - ImplItemKind::Method(..) => ("Node::ImplItem", LABELS_FN_IN_IMPL), - ImplItemKind::Const(..) => ("NodeImplConst", LABELS_CONST_IN_IMPL), - ImplItemKind::TyAlias(..) => ("NodeImplType", LABELS_CONST_IN_IMPL), - ImplItemKind::OpaqueTy(..) => ("NodeImplType", LABELS_CONST_IN_IMPL), - } + HirNode::ImplItem(item) => match item.kind { + ImplItemKind::Method(..) => ("Node::ImplItem", LABELS_FN_IN_IMPL), + ImplItemKind::Const(..) => ("NodeImplConst", LABELS_CONST_IN_IMPL), + ImplItemKind::TyAlias(..) => ("NodeImplType", LABELS_CONST_IN_IMPL), + ImplItemKind::OpaqueTy(..) => ("NodeImplType", LABELS_CONST_IN_IMPL), }, _ => self.tcx.sess.span_fatal( attr.span, - &format!( - "clean/dirty auto-assertions not yet defined for {:?}", - node - ) + &format!("clean/dirty auto-assertions not yet defined for {:?}", node), ), }; - let labels = Labels::from_iter( - labels.iter().flat_map(|s| s.iter().map(|l| l.to_string())) - ); + let labels = Labels::from_iter(labels.iter().flat_map(|s| s.iter().map(|l| l.to_string()))); (name, labels) } @@ -433,13 +355,14 @@ impl DirtyCleanVisitor<'tcx> { if out.contains(label) { self.tcx.sess.span_fatal( item.span(), - &format!("dep-node label `{}` is repeated", label)); + &format!("dep-node label `{}` is repeated", label), + ); } out.insert(label.to_string()); } else { - self.tcx.sess.span_fatal( - item.span(), - &format!("dep-node label `{}` not recognized", label)); + self.tcx + .sess + .span_fatal(item.span(), &format!("dep-node label `{}` not recognized", label)); } } out @@ -448,24 +371,18 @@ impl DirtyCleanVisitor<'tcx> { fn dep_nodes<'l>( &self, labels: &'l Labels, - def_id: DefId + def_id: DefId, ) -> impl Iterator + 'l { let def_path_hash = self.tcx.def_path_hash(def_id); - labels - .iter() - .map(move |label| { - match DepNode::from_label_string(label, def_path_hash) { - Ok(dep_node) => dep_node, - Err(()) => unreachable!(), - } - }) + labels.iter().map(move |label| match DepNode::from_label_string(label, def_path_hash) { + Ok(dep_node) => dep_node, + Err(()) => unreachable!(), + }) } fn dep_node_str(&self, dep_node: &DepNode) -> String { if let Some(def_id) = dep_node.extract_def_id(self.tcx) { - format!("{:?}({})", - dep_node.kind, - self.tcx.def_path_str(def_id)) + format!("{:?}({})", dep_node.kind, self.tcx.def_path_str(def_id)) } else { format!("{:?}({:?})", dep_node.kind, dep_node.hash) } @@ -479,9 +396,9 @@ impl DirtyCleanVisitor<'tcx> { if current_fingerprint == prev_fingerprint { let dep_node_str = self.dep_node_str(&dep_node); - self.tcx.sess.span_err( - item_span, - &format!("`{}` should be dirty but is not", dep_node_str)); + self.tcx + .sess + .span_err(item_span, &format!("`{}` should be dirty but is not", dep_node_str)); } } @@ -508,9 +425,9 @@ impl DirtyCleanVisitor<'tcx> { if current_fingerprint != prev_fingerprint { let dep_node_str = self.dep_node_str(&dep_node); - self.tcx.sess.span_err( - item_span, - &format!("`{}` should be clean but is not", dep_node_str)); + self.tcx + .sess + .span_err(item_span, &format!("`{}` should be clean but is not", dep_node_str)); } } @@ -533,15 +450,15 @@ impl DirtyCleanVisitor<'tcx> { } impl ItemLikeVisitor<'tcx> for DirtyCleanVisitor<'tcx> { - fn visit_item(&mut self, item: &'tcx hir::Item) { + fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { self.check_item(item.hir_id, item.span); } - fn visit_trait_item(&mut self, item: &hir::TraitItem) { + fn visit_trait_item(&mut self, item: &hir::TraitItem<'_>) { self.check_item(item.hir_id, item.span); } - fn visit_impl_item(&mut self, item: &hir::ImplItem) { + fn visit_impl_item(&mut self, item: &hir::ImplItem<'_>) { self.check_item(item.hir_id, item.span); } } @@ -572,17 +489,11 @@ fn check_config(tcx: TyCtxt<'_>, attr: &Attribute) -> bool { } if label && except { - tcx.sess.span_fatal( - attr.span, - "must specify only one of: `label`, `except`" - ); + tcx.sess.span_fatal(attr.span, "must specify only one of: `label`, `except`"); } match cfg { - None => tcx.sess.span_fatal( - attr.span, - "no cfg attribute" - ), + None => tcx.sess.span_fatal(attr.span, "no cfg attribute"), Some(c) => c, } } @@ -624,15 +535,22 @@ impl FindAllAttrs<'tcx> { fn report_unchecked_attrs(&self, checked_attrs: &FxHashSet) { for attr in &self.found_attrs { if !checked_attrs.contains(&attr.id) { - self.tcx.sess.span_err(attr.span, &format!("found unchecked \ - `#[rustc_dirty]` / `#[rustc_clean]` attribute")); + self.tcx.sess.span_err( + attr.span, + &format!( + "found unchecked \ + `#[rustc_dirty]` / `#[rustc_clean]` attribute" + ), + ); } } } } impl intravisit::Visitor<'tcx> for FindAllAttrs<'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, Self::Map> { intravisit::NestedVisitorMap::All(&self.tcx.hir()) } diff --git a/src/librustc_incremental/persist/file_format.rs b/src/librustc_incremental/persist/file_format.rs index f363f71849..7534b7e9ef 100644 --- a/src/librustc_incremental/persist/file_format.rs +++ b/src/librustc_incremental/persist/file_format.rs @@ -9,10 +9,10 @@ //! compiler versions don't change frequently for the typical user, being //! conservative here practically has no downside. +use std::env; +use std::fs; use std::io::{self, Read}; use std::path::Path; -use std::fs; -use std::env; use rustc::session::config::nightly_options; use rustc_serialize::opaque::Encoder; @@ -30,8 +30,8 @@ const RUSTC_VERSION: Option<&str> = option_env!("CFG_VERSION"); pub fn write_file_header(stream: &mut Encoder) { stream.emit_raw_bytes(FILE_MAGIC); - stream.emit_raw_bytes(&[(HEADER_FORMAT_VERSION >> 0) as u8, - (HEADER_FORMAT_VERSION >> 8) as u8]); + stream + .emit_raw_bytes(&[(HEADER_FORMAT_VERSION >> 0) as u8, (HEADER_FORMAT_VERSION >> 8) as u8]); let rustc_version = rustc_version(); assert_eq!(rustc_version.len(), (rustc_version.len() as u8) as usize); @@ -48,9 +48,10 @@ pub fn write_file_header(stream: &mut Encoder) { /// incompatible version of the compiler. /// - Returns `Err(..)` if some kind of IO error occurred while reading the /// file. -pub fn read_file(report_incremental_info: bool, path: &Path) - -> io::Result, usize)>> -{ +pub fn read_file( + report_incremental_info: bool, + path: &Path, +) -> io::Result, usize)>> { if !path.exists() { return Ok(None); } @@ -66,7 +67,7 @@ pub fn read_file(report_incremental_info: bool, path: &Path) file.read_exact(&mut file_magic)?; if file_magic != FILE_MAGIC { report_format_mismatch(report_incremental_info, path, "Wrong FILE_MAGIC"); - return Ok(None) + return Ok(None); } } @@ -75,12 +76,12 @@ pub fn read_file(report_incremental_info: bool, path: &Path) debug_assert!(::std::mem::size_of_val(&HEADER_FORMAT_VERSION) == 2); let mut header_format_version = [0u8; 2]; file.read_exact(&mut header_format_version)?; - let header_format_version = (header_format_version[0] as u16) | - ((header_format_version[1] as u16) << 8); + let header_format_version = + (header_format_version[0] as u16) | ((header_format_version[1] as u16) << 8); if header_format_version != HEADER_FORMAT_VERSION { report_format_mismatch(report_incremental_info, path, "Wrong HEADER_FORMAT_VERSION"); - return Ok(None) + return Ok(None); } } @@ -107,20 +108,25 @@ fn report_format_mismatch(report_incremental_info: bool, file: &Path, message: & debug!("read_file: {}", message); if report_incremental_info { - println!("[incremental] ignoring cache artifact `{}`: {}", - file.file_name().unwrap().to_string_lossy(), - message); + println!( + "[incremental] ignoring cache artifact `{}`: {}", + file.file_name().unwrap().to_string_lossy(), + message + ); } } fn rustc_version() -> String { if nightly_options::is_nightly_build() { if let Some(val) = env::var_os("RUSTC_FORCE_INCR_COMP_ARTIFACT_HEADER") { - return val.to_string_lossy().into_owned() + return val.to_string_lossy().into_owned(); } } - RUSTC_VERSION.expect("Cannot use rustc without explicit version for \ - incremental compilation") - .to_string() + RUSTC_VERSION + .expect( + "Cannot use rustc without explicit version for \ + incremental compilation", + ) + .to_string() } diff --git a/src/librustc_incremental/persist/fs.rs b/src/librustc_incremental/persist/fs.rs index cbebdeb602..ba20006d73 100644 --- a/src/librustc_incremental/persist/fs.rs +++ b/src/librustc_incremental/persist/fs.rs @@ -103,19 +103,19 @@ //! unsupported file system and emit a warning in that case. This is not yet //! implemented. -use rustc::session::{Session, CrateDisambiguator}; -use rustc_fs_util::{link_or_copy, LinkOrCopy}; -use rustc_data_structures::{flock, base_n}; -use rustc_data_structures::fx::{FxHashSet, FxHashMap}; +use rustc::session::{CrateDisambiguator, Session}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::svh::Svh; +use rustc_data_structures::{base_n, flock}; +use rustc_fs_util::{link_or_copy, LinkOrCopy}; use std::fs as std_fs; use std::io; use std::mem; use std::path::{Path, PathBuf}; -use std::time::{UNIX_EPOCH, SystemTime, Duration}; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use rand::{RngCore, thread_rng}; +use rand::{thread_rng, RngCore}; #[cfg(test)] mod tests; @@ -152,17 +152,16 @@ pub fn lock_file_path(session_dir: &Path) -> PathBuf { let directory_name = session_dir.file_name().unwrap().to_string_lossy(); assert_no_characters_lost(&directory_name); - let dash_indices: Vec<_> = directory_name.match_indices("-") - .map(|(idx, _)| idx) - .collect(); + let dash_indices: Vec<_> = directory_name.match_indices("-").map(|(idx, _)| idx).collect(); if dash_indices.len() != 3 { - bug!("Encountered incremental compilation session directory with \ + bug!( + "Encountered incremental compilation session directory with \ malformed name: {}", - session_dir.display()) + session_dir.display() + ) } - crate_dir.join(&directory_name[0 .. dash_indices[2]]) - .with_extension(&LOCK_FILE_EXT[1..]) + crate_dir.join(&directory_name[0..dash_indices[2]]).with_extension(&LOCK_FILE_EXT[1..]) } pub fn in_incr_comp_dir_sess(sess: &Session, file_name: &str) -> PathBuf { @@ -182,20 +181,24 @@ pub fn in_incr_comp_dir(incr_comp_session_dir: &Path, file_name: &str) -> PathBu /// a dep-graph and work products from a previous session. /// If the call fails, the fn may leave behind an invalid session directory. /// The garbage collection will take care of it. -pub fn prepare_session_directory(sess: &Session, - crate_name: &str, - crate_disambiguator: CrateDisambiguator) { +pub fn prepare_session_directory( + sess: &Session, + crate_name: &str, + crate_disambiguator: CrateDisambiguator, +) { if sess.opts.incremental.is_none() { - return + return; } + let _timer = sess.timer("incr_comp_prepare_session_directory"); + debug!("prepare_session_directory"); // {incr-comp-dir}/{crate-name-and-disambiguator} let crate_dir = crate_path(sess, crate_name, crate_disambiguator); debug!("crate-dir: {}", crate_dir.display()); if create_dir(sess, &crate_dir, "crate").is_err() { - return + return; } // Hack: canonicalize the path *after creating the directory* @@ -205,9 +208,12 @@ pub fn prepare_session_directory(sess: &Session, let crate_dir = match crate_dir.canonicalize() { Ok(v) => v, Err(err) => { - sess.err(&format!("incremental compilation: error canonicalizing path `{}`: {}", - crate_dir.display(), err)); - return + sess.err(&format!( + "incremental compilation: error canonicalizing path `{}`: {}", + crate_dir.display(), + err + )); + return; } }; @@ -230,51 +236,47 @@ pub fn prepare_session_directory(sess: &Session, // Now that we have the lock, we can actually create the session // directory if create_dir(sess, &session_dir, "session").is_err() { - return + return; } // Find a suitable source directory to copy from. Ignore those that we // have already tried before. - let source_directory = find_source_directory(&crate_dir, - &source_directories_already_tried); + let source_directory = find_source_directory(&crate_dir, &source_directories_already_tried); let source_directory = if let Some(dir) = source_directory { dir } else { // There's nowhere to copy from, we're done - debug!("no source directory found. Continuing with empty session \ - directory."); + debug!( + "no source directory found. Continuing with empty session \ + directory." + ); sess.init_incr_comp_session(session_dir, directory_lock, false); - return + return; }; - debug!("attempting to copy data from source: {}", - source_directory.display()); - - + debug!("attempting to copy data from source: {}", source_directory.display()); // Try copying over all files from the source directory - if let Ok(allows_links) = copy_files(sess, - &session_dir, - &source_directory) { - debug!("successfully copied data from: {}", - source_directory.display()); + if let Ok(allows_links) = copy_files(sess, &session_dir, &source_directory) { + debug!("successfully copied data from: {}", source_directory.display()); if !allows_links { - sess.warn(&format!("Hard linking files in the incremental \ + sess.warn(&format!( + "Hard linking files in the incremental \ compilation cache failed. Copying files \ instead. Consider moving the cache \ directory to a file system which supports \ hard linking in session dir `{}`", - session_dir.display()) - ); + session_dir.display() + )); } sess.init_incr_comp_session(session_dir, directory_lock, true); - return + return; } else { - debug!("copying failed - trying next directory"); + debug!("copying failed - trying next directory"); // Something went wrong while trying to copy/link files from the // source directory. Try again with a different one. @@ -283,10 +285,12 @@ pub fn prepare_session_directory(sess: &Session, // Try to remove the session directory we just allocated. We don't // know if there's any garbage in it from the failed copy action. if let Err(err) = safe_remove_dir_all(&session_dir) { - sess.warn(&format!("Failed to delete partly initialized \ + sess.warn(&format!( + "Failed to delete partly initialized \ session dir `{}`: {}", - session_dir.display(), - err)); + session_dir.display(), + err + )); } delete_session_dir_lock_file(sess, &lock_file_path); @@ -295,7 +299,6 @@ pub fn prepare_session_directory(sess: &Session, } } - /// This function finalizes and thus 'publishes' the session directory by /// renaming it to `s-{timestamp}-{svh}` and releasing the file lock. /// If there have been compilation errors, however, this function will just @@ -305,20 +308,26 @@ pub fn finalize_session_directory(sess: &Session, svh: Svh) { return; } + let _timer = sess.timer("incr_comp_finalize_session_directory"); + let incr_comp_session_dir: PathBuf = sess.incr_comp_session_dir().clone(); if sess.has_errors_or_delayed_span_bugs() { // If there have been any errors during compilation, we don't want to // publish this session directory. Rather, we'll just delete it. - debug!("finalize_session_directory() - invalidating session directory: {}", - incr_comp_session_dir.display()); + debug!( + "finalize_session_directory() - invalidating session directory: {}", + incr_comp_session_dir.display() + ); if let Err(err) = safe_remove_dir_all(&*incr_comp_session_dir) { - sess.warn(&format!("Error deleting incremental compilation \ + sess.warn(&format!( + "Error deleting incremental compilation \ session directory `{}`: {}", - incr_comp_session_dir.display(), - err)); + incr_comp_session_dir.display(), + err + )); } let lock_file_path = lock_file_path(&*incr_comp_session_dir); @@ -326,27 +335,24 @@ pub fn finalize_session_directory(sess: &Session, svh: Svh) { sess.mark_incr_comp_session_as_invalid(); } - debug!("finalize_session_directory() - session directory: {}", - incr_comp_session_dir.display()); + debug!("finalize_session_directory() - session directory: {}", incr_comp_session_dir.display()); - let old_sub_dir_name = incr_comp_session_dir.file_name() - .unwrap() - .to_string_lossy(); + let old_sub_dir_name = incr_comp_session_dir.file_name().unwrap().to_string_lossy(); assert_no_characters_lost(&old_sub_dir_name); // Keep the 's-{timestamp}-{random-number}' prefix, but replace the // '-working' part with the SVH of the crate - let dash_indices: Vec<_> = old_sub_dir_name.match_indices("-") - .map(|(idx, _)| idx) - .collect(); + let dash_indices: Vec<_> = old_sub_dir_name.match_indices("-").map(|(idx, _)| idx).collect(); if dash_indices.len() != 3 { - bug!("Encountered incremental compilation session directory with \ + bug!( + "Encountered incremental compilation session directory with \ malformed name: {}", - incr_comp_session_dir.display()) + incr_comp_session_dir.display() + ) } // State: "s-{timestamp}-{random-number}-" - let mut new_sub_dir_name = String::from(&old_sub_dir_name[..= dash_indices[2]]); + let mut new_sub_dir_name = String::from(&old_sub_dir_name[..=dash_indices[2]]); // Append the svh base_n::push_str(svh.as_u64() as u128, INT_ENCODE_BASE, &mut new_sub_dir_name); @@ -364,10 +370,12 @@ pub fn finalize_session_directory(sess: &Session, svh: Svh) { } Err(e) => { // Warn about the error. However, no need to abort compilation now. - sess.warn(&format!("Error finalizing incremental compilation \ + sess.warn(&format!( + "Error finalizing incremental compilation \ session directory `{}`: {}", - incr_comp_session_dir.display(), - e)); + incr_comp_session_dir.display(), + e + )); debug!("finalize_session_directory() - error, marking as invalid"); // Drop the file lock, so we can garage collect @@ -387,26 +395,26 @@ pub fn delete_all_session_dir_contents(sess: &Session) -> io::Result<()> { Ok(()) } -fn copy_files(sess: &Session, - target_dir: &Path, - source_dir: &Path) - -> Result { +fn copy_files(sess: &Session, target_dir: &Path, source_dir: &Path) -> Result { // We acquire a shared lock on the lock file of the directory, so that // nobody deletes it out from under us while we are reading from it. let lock_file_path = lock_file_path(source_dir); - let _lock = if let Ok(lock) = flock::Lock::new(&lock_file_path, - false, // don't wait, - false, // don't create - false) { // not exclusive + let _lock = if let Ok(lock) = flock::Lock::new( + &lock_file_path, + false, // don't wait, + false, // don't create + false, + ) { + // not exclusive lock } else { // Could not acquire the lock, don't try to copy from here - return Err(()) + return Err(()); }; let source_dir_iterator = match source_dir.read_dir() { Ok(it) => it, - Err(_) => return Err(()) + Err(_) => return Err(()), }; let mut files_linked = 0; @@ -422,26 +430,26 @@ fn copy_files(sess: &Session, debug!("copying into session dir: {}", source_path.display()); match link_or_copy(source_path, target_file_path) { - Ok(LinkOrCopy::Link) => { - files_linked += 1 - } - Ok(LinkOrCopy::Copy) => { - files_copied += 1 - } - Err(_) => return Err(()) + Ok(LinkOrCopy::Link) => files_linked += 1, + Ok(LinkOrCopy::Copy) => files_copied += 1, + Err(_) => return Err(()), } } - Err(_) => { - return Err(()) - } + Err(_) => return Err(()), } } if sess.opts.debugging_opts.incremental_info { - println!("[incremental] session directory: \ - {} files hard-linked", files_linked); - println!("[incremental] session directory: \ - {} files copied", files_copied); + println!( + "[incremental] session directory: \ + {} files hard-linked", + files_linked + ); + println!( + "[incremental] session directory: \ + {} files copied", + files_copied + ); } Ok(files_linked > 0 || files_copied == 0) @@ -455,100 +463,111 @@ fn generate_session_dir_path(crate_dir: &Path) -> PathBuf { let random_number = thread_rng().next_u32(); debug!("generate_session_dir_path: random_number = {}", random_number); - let directory_name = format!("s-{}-{}-working", - timestamp, - base_n::encode(random_number as u128, - INT_ENCODE_BASE)); + let directory_name = format!( + "s-{}-{}-working", + timestamp, + base_n::encode(random_number as u128, INT_ENCODE_BASE) + ); debug!("generate_session_dir_path: directory_name = {}", directory_name); let directory_path = crate_dir.join(directory_name); debug!("generate_session_dir_path: directory_path = {}", directory_path.display()); directory_path } -fn create_dir(sess: &Session, path: &Path, dir_tag: &str) -> Result<(),()> { +fn create_dir(sess: &Session, path: &Path, dir_tag: &str) -> Result<(), ()> { match std_fs::create_dir_all(path) { Ok(()) => { debug!("{} directory created successfully", dir_tag); Ok(()) } Err(err) => { - sess.err(&format!("Could not create incremental compilation {} \ + sess.err(&format!( + "Could not create incremental compilation {} \ directory `{}`: {}", - dir_tag, - path.display(), - err)); + dir_tag, + path.display(), + err + )); Err(()) } } } /// Allocate the lock-file and lock it. -fn lock_directory(sess: &Session, - session_dir: &Path) - -> Result<(flock::Lock, PathBuf), ()> { +fn lock_directory(sess: &Session, session_dir: &Path) -> Result<(flock::Lock, PathBuf), ()> { let lock_file_path = lock_file_path(session_dir); debug!("lock_directory() - lock_file: {}", lock_file_path.display()); - match flock::Lock::new(&lock_file_path, - false, // don't wait - true, // create the lock file - true) { // the lock should be exclusive + match flock::Lock::new( + &lock_file_path, + false, // don't wait + true, // create the lock file + true, + ) { + // the lock should be exclusive Ok(lock) => Ok((lock, lock_file_path)), Err(err) => { - sess.err(&format!("incremental compilation: could not create \ - session directory lock file: {}", err)); + sess.err(&format!( + "incremental compilation: could not create \ + session directory lock file: {}", + err + )); Err(()) } } } -fn delete_session_dir_lock_file(sess: &Session, - lock_file_path: &Path) { +fn delete_session_dir_lock_file(sess: &Session, lock_file_path: &Path) { if let Err(err) = safe_remove_file(&lock_file_path) { - sess.warn(&format!("Error deleting lock file for incremental \ + sess.warn(&format!( + "Error deleting lock file for incremental \ compilation session directory `{}`: {}", - lock_file_path.display(), - err)); + lock_file_path.display(), + err + )); } } /// Finds the most recent published session directory that is not in the /// ignore-list. -fn find_source_directory(crate_dir: &Path, - source_directories_already_tried: &FxHashSet) - -> Option { - let iter = crate_dir.read_dir() - .unwrap() // FIXME - .filter_map(|e| e.ok().map(|e| e.path())); +fn find_source_directory( + crate_dir: &Path, + source_directories_already_tried: &FxHashSet, +) -> Option { + let iter = crate_dir + .read_dir() + .unwrap() // FIXME + .filter_map(|e| e.ok().map(|e| e.path())); find_source_directory_in_iter(iter, source_directories_already_tried) } -fn find_source_directory_in_iter(iter: I, - source_directories_already_tried: &FxHashSet) - -> Option - where I: Iterator +fn find_source_directory_in_iter( + iter: I, + source_directories_already_tried: &FxHashSet, +) -> Option +where + I: Iterator, { let mut best_candidate = (UNIX_EPOCH, None); for session_dir in iter { - debug!("find_source_directory_in_iter - inspecting `{}`", - session_dir.display()); + debug!("find_source_directory_in_iter - inspecting `{}`", session_dir.display()); let directory_name = session_dir.file_name().unwrap().to_string_lossy(); assert_no_characters_lost(&directory_name); - if source_directories_already_tried.contains(&session_dir) || - !is_session_directory(&directory_name) || - !is_finalized(&directory_name) { + if source_directories_already_tried.contains(&session_dir) + || !is_session_directory(&directory_name) + || !is_finalized(&directory_name) + { debug!("find_source_directory_in_iter - ignoring"); - continue + continue; } - let timestamp = extract_timestamp_from_session_dir(&directory_name) - .unwrap_or_else(|_| { - bug!("unexpected incr-comp session dir: {}", session_dir.display()) - }); + let timestamp = extract_timestamp_from_session_dir(&directory_name).unwrap_or_else(|_| { + bug!("unexpected incr-comp session dir: {}", session_dir.display()) + }); if timestamp > best_candidate.0 { best_candidate = (timestamp, Some(session_dir.clone())); @@ -563,34 +582,29 @@ fn is_finalized(directory_name: &str) -> bool { } fn is_session_directory(directory_name: &str) -> bool { - directory_name.starts_with("s-") && - !directory_name.ends_with(LOCK_FILE_EXT) + directory_name.starts_with("s-") && !directory_name.ends_with(LOCK_FILE_EXT) } fn is_session_directory_lock_file(file_name: &str) -> bool { file_name.starts_with("s-") && file_name.ends_with(LOCK_FILE_EXT) } -fn extract_timestamp_from_session_dir(directory_name: &str) - -> Result { +fn extract_timestamp_from_session_dir(directory_name: &str) -> Result { if !is_session_directory(directory_name) { - return Err(()) + return Err(()); } - let dash_indices: Vec<_> = directory_name.match_indices("-") - .map(|(idx, _)| idx) - .collect(); + let dash_indices: Vec<_> = directory_name.match_indices("-").map(|(idx, _)| idx).collect(); if dash_indices.len() != 3 { - return Err(()) + return Err(()); } - string_to_timestamp(&directory_name[dash_indices[0]+1 .. dash_indices[1]]) + string_to_timestamp(&directory_name[dash_indices[0] + 1..dash_indices[1]]) } fn timestamp_to_string(timestamp: SystemTime) -> String { let duration = timestamp.duration_since(UNIX_EPOCH).unwrap(); - let micros = duration.as_secs() * 1_000_000 + - (duration.subsec_nanos() as u64) / 1000; + let micros = duration.as_secs() * 1_000_000 + (duration.subsec_nanos() as u64) / 1000; base_n::encode(micros as u128, INT_ENCODE_BASE) } @@ -598,28 +612,29 @@ fn string_to_timestamp(s: &str) -> Result { let micros_since_unix_epoch = u64::from_str_radix(s, INT_ENCODE_BASE as u32); if micros_since_unix_epoch.is_err() { - return Err(()) + return Err(()); } let micros_since_unix_epoch = micros_since_unix_epoch.unwrap(); - let duration = Duration::new(micros_since_unix_epoch / 1_000_000, - 1000 * (micros_since_unix_epoch % 1_000_000) as u32); + let duration = Duration::new( + micros_since_unix_epoch / 1_000_000, + 1000 * (micros_since_unix_epoch % 1_000_000) as u32, + ); Ok(UNIX_EPOCH + duration) } -fn crate_path(sess: &Session, - crate_name: &str, - crate_disambiguator: CrateDisambiguator) - -> PathBuf { - +fn crate_path( + sess: &Session, + crate_name: &str, + crate_disambiguator: CrateDisambiguator, +) -> PathBuf { let incr_dir = sess.opts.incremental.as_ref().unwrap().clone(); // The full crate disambiguator is really long. 64 bits of it should be // sufficient. let crate_disambiguator = crate_disambiguator.to_fingerprint().to_smaller_hash(); - let crate_disambiguator = base_n::encode(crate_disambiguator as u128, - INT_ENCODE_BASE); + let crate_disambiguator = base_n::encode(crate_disambiguator as u128, INT_ENCODE_BASE); let crate_name = format!("{}-{}", crate_name, crate_disambiguator); incr_dir.join(crate_name) @@ -639,12 +654,16 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> { debug!("garbage_collect_session_directories() - begin"); let session_directory = sess.incr_comp_session_dir(); - debug!("garbage_collect_session_directories() - session directory: {}", - session_directory.display()); + debug!( + "garbage_collect_session_directories() - session directory: {}", + session_directory.display() + ); let crate_directory = session_directory.parent().unwrap(); - debug!("garbage_collect_session_directories() - crate directory: {}", - crate_directory.display()); + debug!( + "garbage_collect_session_directories() - crate directory: {}", + crate_directory.display() + ); // First do a pass over the crate directory, collecting lock files and // session directories @@ -656,7 +675,7 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> { Ok(dir_entry) => dir_entry, _ => { // Ignore any errors - continue + continue; } }; @@ -675,19 +694,18 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> { } // Now map from lock files to session directories - let lock_file_to_session_dir: FxHashMap> = - lock_files.into_iter() - .map(|lock_file_name| { - assert!(lock_file_name.ends_with(LOCK_FILE_EXT)); - let dir_prefix_end = lock_file_name.len() - LOCK_FILE_EXT.len(); - let session_dir = { - let dir_prefix = &lock_file_name[0 .. dir_prefix_end]; - session_directories.iter() - .find(|dir_name| dir_name.starts_with(dir_prefix)) - }; - (lock_file_name, session_dir.map(String::clone)) - }) - .collect(); + let lock_file_to_session_dir: FxHashMap> = lock_files + .into_iter() + .map(|lock_file_name| { + assert!(lock_file_name.ends_with(LOCK_FILE_EXT)); + let dir_prefix_end = lock_file_name.len() - LOCK_FILE_EXT.len(); + let session_dir = { + let dir_prefix = &lock_file_name[0..dir_prefix_end]; + session_directories.iter().find(|dir_name| dir_name.starts_with(dir_prefix)) + }; + (lock_file_name, session_dir.map(String::clone)) + }) + .collect(); // Delete all lock files, that don't have an associated directory. They must // be some kind of leftover @@ -696,44 +714,51 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> { let timestamp = match extract_timestamp_from_session_dir(lock_file_name) { Ok(timestamp) => timestamp, Err(()) => { - debug!("found lock-file with malformed timestamp: {}", - crate_directory.join(&lock_file_name).display()); + debug!( + "found lock-file with malformed timestamp: {}", + crate_directory.join(&lock_file_name).display() + ); // Ignore it - continue + continue; } }; let lock_file_path = crate_directory.join(&**lock_file_name); if is_old_enough_to_be_collected(timestamp) { - debug!("garbage_collect_session_directories() - deleting \ - garbage lock file: {}", lock_file_path.display()); + debug!( + "garbage_collect_session_directories() - deleting \ + garbage lock file: {}", + lock_file_path.display() + ); delete_session_dir_lock_file(sess, &lock_file_path); } else { - debug!("garbage_collect_session_directories() - lock file with \ + debug!( + "garbage_collect_session_directories() - lock file with \ no session dir not old enough to be collected: {}", - lock_file_path.display()); + lock_file_path.display() + ); } } } // Filter out `None` directories - let lock_file_to_session_dir: FxHashMap = - lock_file_to_session_dir.into_iter() - .filter_map(|(lock_file_name, directory_name)| { - directory_name.map(|n| (lock_file_name, n)) - }) - .collect(); + let lock_file_to_session_dir: FxHashMap = lock_file_to_session_dir + .into_iter() + .filter_map(|(lock_file_name, directory_name)| directory_name.map(|n| (lock_file_name, n))) + .collect(); // Delete all session directories that don't have a lock file. for directory_name in session_directories { if !lock_file_to_session_dir.values().any(|dir| *dir == directory_name) { let path = crate_directory.join(directory_name); if let Err(err) = safe_remove_dir_all(&path) { - sess.warn(&format!("Failed to garbage collect invalid incremental \ + sess.warn(&format!( + "Failed to garbage collect invalid incremental \ compilation session directory `{}`: {}", - path.display(), - err)); + path.display(), + err + )); } } } @@ -743,39 +768,52 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> { let mut definitely_delete = vec![]; for (lock_file_name, directory_name) in &lock_file_to_session_dir { - debug!("garbage_collect_session_directories() - inspecting: {}", - directory_name); + debug!("garbage_collect_session_directories() - inspecting: {}", directory_name); let timestamp = match extract_timestamp_from_session_dir(directory_name) { Ok(timestamp) => timestamp, Err(()) => { - debug!("found session-dir with malformed timestamp: {}", - crate_directory.join(directory_name).display()); + debug!( + "found session-dir with malformed timestamp: {}", + crate_directory.join(directory_name).display() + ); // Ignore it - continue + continue; } }; if is_finalized(directory_name) { let lock_file_path = crate_directory.join(lock_file_name); - match flock::Lock::new(&lock_file_path, - false, // don't wait - false, // don't create the lock-file - true) { // get an exclusive lock + match flock::Lock::new( + &lock_file_path, + false, // don't wait + false, // don't create the lock-file + true, + ) { + // get an exclusive lock Ok(lock) => { - debug!("garbage_collect_session_directories() - \ - successfully acquired lock"); - debug!("garbage_collect_session_directories() - adding \ - deletion candidate: {}", directory_name); + debug!( + "garbage_collect_session_directories() - \ + successfully acquired lock" + ); + debug!( + "garbage_collect_session_directories() - adding \ + deletion candidate: {}", + directory_name + ); // Note that we are holding on to the lock - deletion_candidates.push((timestamp, - crate_directory.join(directory_name), - Some(lock))); + deletion_candidates.push(( + timestamp, + crate_directory.join(directory_name), + Some(lock), + )); } Err(_) => { - debug!("garbage_collect_session_directories() - \ - not collecting, still in use"); + debug!( + "garbage_collect_session_directories() - \ + not collecting, still in use" + ); } } } else if is_old_enough_to_be_collected(timestamp) { @@ -791,58 +829,67 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> { // means that the owning process is still alive and we // leave this directory alone. let lock_file_path = crate_directory.join(lock_file_name); - match flock::Lock::new(&lock_file_path, - false, // don't wait - false, // don't create the lock-file - true) { // get an exclusive lock + match flock::Lock::new( + &lock_file_path, + false, // don't wait + false, // don't create the lock-file + true, + ) { + // get an exclusive lock Ok(lock) => { - debug!("garbage_collect_session_directories() - \ - successfully acquired lock"); + debug!( + "garbage_collect_session_directories() - \ + successfully acquired lock" + ); // Note that we are holding on to the lock - definitely_delete.push((crate_directory.join(directory_name), - Some(lock))); + definitely_delete.push((crate_directory.join(directory_name), Some(lock))); } Err(_) => { - debug!("garbage_collect_session_directories() - \ - not collecting, still in use"); + debug!( + "garbage_collect_session_directories() - \ + not collecting, still in use" + ); } } } else { - debug!("garbage_collect_session_directories() - not finalized, not \ - old enough"); + debug!( + "garbage_collect_session_directories() - not finalized, not \ + old enough" + ); } } // Delete all but the most recent of the candidates for (path, lock) in all_except_most_recent(deletion_candidates) { - debug!("garbage_collect_session_directories() - deleting `{}`", - path.display()); + debug!("garbage_collect_session_directories() - deleting `{}`", path.display()); if let Err(err) = safe_remove_dir_all(&path) { - sess.warn(&format!("Failed to garbage collect finalized incremental \ + sess.warn(&format!( + "Failed to garbage collect finalized incremental \ compilation session directory `{}`: {}", - path.display(), - err)); + path.display(), + err + )); } else { delete_session_dir_lock_file(sess, &lock_file_path(&path)); } - // Let's make it explicit that the file lock is released at this point, // or rather, that we held on to it until here mem::drop(lock); } for (path, lock) in definitely_delete { - debug!("garbage_collect_session_directories() - deleting `{}`", - path.display()); + debug!("garbage_collect_session_directories() - deleting `{}`", path.display()); if let Err(err) = safe_remove_dir_all(&path) { - sess.warn(&format!("Failed to garbage collect incremental \ + sess.warn(&format!( + "Failed to garbage collect incremental \ compilation session directory `{}`: {}", - path.display(), - err)); + path.display(), + err + )); } else { delete_session_dir_lock_file(sess, &lock_file_path(&path)); } @@ -855,17 +902,17 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> { Ok(()) } -fn all_except_most_recent(deletion_candidates: Vec<(SystemTime, PathBuf, Option)>) - -> FxHashMap> { - let most_recent = deletion_candidates.iter() - .map(|&(timestamp, ..)| timestamp) - .max(); +fn all_except_most_recent( + deletion_candidates: Vec<(SystemTime, PathBuf, Option)>, +) -> FxHashMap> { + let most_recent = deletion_candidates.iter().map(|&(timestamp, ..)| timestamp).max(); if let Some(most_recent) = most_recent { - deletion_candidates.into_iter() - .filter(|&(timestamp, ..)| timestamp != most_recent) - .map(|(_, path, lock)| (path, lock)) - .collect() + deletion_candidates + .into_iter() + .filter(|&(timestamp, ..)| timestamp != most_recent) + .map(|(_, path, lock)| (path, lock)) + .collect() } else { FxHashMap::default() } diff --git a/src/librustc_incremental/persist/fs/tests.rs b/src/librustc_incremental/persist/fs/tests.rs index 09c2fc1463..652ef6bcdc 100644 --- a/src/librustc_incremental/persist/fs/tests.rs +++ b/src/librustc_incremental/persist/fs/tests.rs @@ -2,32 +2,31 @@ use super::*; #[test] fn test_all_except_most_recent() { - assert_eq!(all_except_most_recent( - vec![ + assert_eq!( + all_except_most_recent(vec![ (UNIX_EPOCH + Duration::new(4, 0), PathBuf::from("4"), None), (UNIX_EPOCH + Duration::new(1, 0), PathBuf::from("1"), None), (UNIX_EPOCH + Duration::new(5, 0), PathBuf::from("5"), None), (UNIX_EPOCH + Duration::new(3, 0), PathBuf::from("3"), None), (UNIX_EPOCH + Duration::new(2, 0), PathBuf::from("2"), None), - ]).keys().cloned().collect::>(), - vec![ - PathBuf::from("1"), - PathBuf::from("2"), - PathBuf::from("3"), - PathBuf::from("4"), - ].into_iter().collect::>() + ]) + .keys() + .cloned() + .collect::>(), + vec![PathBuf::from("1"), PathBuf::from("2"), PathBuf::from("3"), PathBuf::from("4"),] + .into_iter() + .collect::>() ); - assert_eq!(all_except_most_recent( - vec![ - ]).keys().cloned().collect::>(), + assert_eq!( + all_except_most_recent(vec![]).keys().cloned().collect::>(), FxHashSet::default() ); } #[test] fn test_timestamp_serialization() { - for i in 0 .. 1_000u64 { + for i in 0..1_000u64 { let time = UNIX_EPOCH + Duration::new(i * 1_434_578, (i as u32) * 239_000); let s = timestamp_to_string(time); assert_eq!(Ok(time), string_to_timestamp(&s)); @@ -39,27 +38,47 @@ fn test_find_source_directory_in_iter() { let already_visited = FxHashSet::default(); // Find newest - assert_eq!(find_source_directory_in_iter( - vec![PathBuf::from("crate-dir/s-3234-0000-svh"), - PathBuf::from("crate-dir/s-2234-0000-svh"), - PathBuf::from("crate-dir/s-1234-0000-svh")].into_iter(), &already_visited), - Some(PathBuf::from("crate-dir/s-3234-0000-svh"))); + assert_eq!( + find_source_directory_in_iter( + vec![ + PathBuf::from("crate-dir/s-3234-0000-svh"), + PathBuf::from("crate-dir/s-2234-0000-svh"), + PathBuf::from("crate-dir/s-1234-0000-svh") + ] + .into_iter(), + &already_visited + ), + Some(PathBuf::from("crate-dir/s-3234-0000-svh")) + ); // Filter out "-working" - assert_eq!(find_source_directory_in_iter( - vec![PathBuf::from("crate-dir/s-3234-0000-working"), - PathBuf::from("crate-dir/s-2234-0000-svh"), - PathBuf::from("crate-dir/s-1234-0000-svh")].into_iter(), &already_visited), - Some(PathBuf::from("crate-dir/s-2234-0000-svh"))); + assert_eq!( + find_source_directory_in_iter( + vec![ + PathBuf::from("crate-dir/s-3234-0000-working"), + PathBuf::from("crate-dir/s-2234-0000-svh"), + PathBuf::from("crate-dir/s-1234-0000-svh") + ] + .into_iter(), + &already_visited + ), + Some(PathBuf::from("crate-dir/s-2234-0000-svh")) + ); // Handle empty - assert_eq!(find_source_directory_in_iter(vec![].into_iter(), &already_visited), - None); + assert_eq!(find_source_directory_in_iter(vec![].into_iter(), &already_visited), None); // Handle only working - assert_eq!(find_source_directory_in_iter( - vec![PathBuf::from("crate-dir/s-3234-0000-working"), - PathBuf::from("crate-dir/s-2234-0000-working"), - PathBuf::from("crate-dir/s-1234-0000-working")].into_iter(), &already_visited), - None); + assert_eq!( + find_source_directory_in_iter( + vec![ + PathBuf::from("crate-dir/s-3234-0000-working"), + PathBuf::from("crate-dir/s-2234-0000-working"), + PathBuf::from("crate-dir/s-1234-0000-working") + ] + .into_iter(), + &already_visited + ), + None + ); } diff --git a/src/librustc_incremental/persist/load.rs b/src/librustc_incremental/persist/load.rs index 673da52c32..6c57f79e1a 100644 --- a/src/librustc_incremental/persist/load.rs +++ b/src/librustc_incremental/persist/load.rs @@ -1,23 +1,22 @@ //! Code to save/load the dep-graph from files. -use rustc_data_structures::fx::FxHashMap; use rustc::dep_graph::{PreviousDepGraph, SerializedDepGraph, WorkProduct, WorkProductId}; use rustc::session::Session; -use rustc::ty::TyCtxt; use rustc::ty::query::OnDiskCache; -use rustc::util::common::time_ext; -use rustc_serialize::Decodable as RustcDecodable; +use rustc::ty::TyCtxt; +use rustc_data_structures::fx::FxHashMap; use rustc_serialize::opaque::Decoder; +use rustc_serialize::Decodable as RustcDecodable; use std::path::Path; use super::data::*; -use super::fs::*; use super::file_format; +use super::fs::*; use super::work_product; pub fn dep_graph_tcx_init(tcx: TyCtxt<'_>) { if !tcx.dep_graph.is_fully_enabled() { - return + return; } tcx.allocate_metadata_dep_nodes(); @@ -37,42 +36,38 @@ impl LoadResult<(PreviousDepGraph, WorkProductMap)> { LoadResult::Error { message } => { sess.warn(&message); Default::default() - }, + } LoadResult::DataOutOfDate => { if let Err(err) = delete_all_session_dir_contents(sess) { - sess.err(&format!("Failed to delete invalidated or incompatible \ + sess.err(&format!( + "Failed to delete invalidated or incompatible \ incremental compilation session directory contents `{}`: {}.", - dep_graph_path(sess).display(), err)); + dep_graph_path(sess).display(), + err + )); } Default::default() } - LoadResult::Ok { data } => data + LoadResult::Ok { data } => data, } } } - fn load_data(report_incremental_info: bool, path: &Path) -> LoadResult<(Vec, usize)> { match file_format::read_file(report_incremental_info, path) { - Ok(Some(data_and_pos)) => LoadResult::Ok { - data: data_and_pos - }, + Ok(Some(data_and_pos)) => LoadResult::Ok { data: data_and_pos }, Ok(None) => { // The file either didn't exist or was produced by an incompatible // compiler version. Neither is an error. LoadResult::DataOutOfDate } - Err(err) => { - LoadResult::Error { - message: format!("could not load dep-graph from `{}`: {}", - path.display(), err) - } - } + Err(err) => LoadResult::Error { + message: format!("could not load dep-graph from `{}`: {}", path.display(), err), + }, } } -fn delete_dirty_work_product(sess: &Session, - swp: SerializedWorkProduct) { +fn delete_dirty_work_product(sess: &Session, swp: SerializedWorkProduct) { debug!("delete_dirty_work_product({:?})", swp); work_product::delete_workproduct_files(sess, &swp.work_product); } @@ -82,13 +77,13 @@ fn delete_dirty_work_product(sess: &Session, /// by a background thread. pub enum MaybeAsync { Sync(T), - Async(std::thread::JoinHandle) + Async(std::thread::JoinHandle), } impl MaybeAsync { pub fn open(self) -> std::thread::Result { match self { MaybeAsync::Sync(result) => Ok(result), - MaybeAsync::Async(handle) => handle.join() + MaybeAsync::Async(handle) => handle.join(), } } } @@ -100,16 +95,15 @@ pub fn load_dep_graph(sess: &Session) -> DepGraphFuture { // Since `sess` isn't `Sync`, we perform all accesses to `sess` // before we fire the background thread. - let time_passes = sess.time_passes(); let prof = sess.prof.clone(); if sess.opts.incremental.is_none() { // No incremental compilation. - return MaybeAsync::Sync(LoadResult::Ok { - data: Default::default(), - }); + return MaybeAsync::Sync(LoadResult::Ok { data: Default::default() }); } + let _timer = sess.prof.generic_activity("incr_comp_prepare_load_dep_graph"); + // Calling `sess.incr_comp_session_dir()` will panic if `sess.opts.incremental.is_none()`. // Fortunately, we just checked that this isn't the case. let path = dep_graph_path_from(&sess.incr_comp_session_dir()); @@ -130,8 +124,11 @@ pub fn load_dep_graph(sess: &Session) -> DepGraphFuture { let mut work_product_decoder = Decoder::new(&work_products_data[..], start_pos); let work_products: Vec = RustcDecodable::decode(&mut work_product_decoder).unwrap_or_else(|e| { - let msg = format!("Error decoding `work-products` from incremental \ - compilation session directory: {}", e); + let msg = format!( + "Error decoding `work-products` from incremental \ + compilation session directory: {}", + e + ); sess.fatal(&msg[..]) }); @@ -143,8 +140,11 @@ pub fn load_dep_graph(sess: &Session) -> DepGraphFuture { all_files_exist = false; if sess.opts.debugging_opts.incremental_info { - eprintln!("incremental: could not find file for work \ - product: {}", path.display()); + eprintln!( + "incremental: could not find file for work \ + product: {}", + path.display() + ); } } } @@ -161,50 +161,48 @@ pub fn load_dep_graph(sess: &Session) -> DepGraphFuture { } MaybeAsync::Async(std::thread::spawn(move || { - time_ext(time_passes, "background load prev dep-graph", move || { - let _prof_timer = prof.generic_activity("incr_comp_load_dep_graph"); - - match load_data(report_incremental_info, &path) { - LoadResult::DataOutOfDate => LoadResult::DataOutOfDate, - LoadResult::Error { message } => LoadResult::Error { message }, - LoadResult::Ok { data: (bytes, start_pos) } => { - - let mut decoder = Decoder::new(&bytes, start_pos); - let prev_commandline_args_hash = u64::decode(&mut decoder) - .expect("Error reading commandline arg hash from cached dep-graph"); - - if prev_commandline_args_hash != expected_hash { - if report_incremental_info { - println!("[incremental] completely ignoring cache because of \ - differing commandline arguments"); - } - // We can't reuse the cache, purge it. - debug!("load_dep_graph_new: differing commandline arg hashes"); - - // No need to do any further work - return LoadResult::DataOutOfDate; + let _prof_timer = prof.generic_activity("incr_comp_load_dep_graph"); + + match load_data(report_incremental_info, &path) { + LoadResult::DataOutOfDate => LoadResult::DataOutOfDate, + LoadResult::Error { message } => LoadResult::Error { message }, + LoadResult::Ok { data: (bytes, start_pos) } => { + let mut decoder = Decoder::new(&bytes, start_pos); + let prev_commandline_args_hash = u64::decode(&mut decoder) + .expect("Error reading commandline arg hash from cached dep-graph"); + + if prev_commandline_args_hash != expected_hash { + if report_incremental_info { + println!( + "[incremental] completely ignoring cache because of \ + differing commandline arguments" + ); } + // We can't reuse the cache, purge it. + debug!("load_dep_graph_new: differing commandline arg hashes"); - let dep_graph = SerializedDepGraph::decode(&mut decoder) - .expect("Error reading cached dep-graph"); - - LoadResult::Ok { data: (PreviousDepGraph::new(dep_graph), prev_work_products) } + // No need to do any further work + return LoadResult::DataOutOfDate; } + + let dep_graph = SerializedDepGraph::decode(&mut decoder) + .expect("Error reading cached dep-graph"); + + LoadResult::Ok { data: (PreviousDepGraph::new(dep_graph), prev_work_products) } } - }) + } })) } pub fn load_query_result_cache(sess: &Session) -> OnDiskCache<'_> { - if sess.opts.incremental.is_none() || - !sess.opts.debugging_opts.incremental_queries { + if sess.opts.incremental.is_none() || !sess.opts.debugging_opts.incremental_queries { return OnDiskCache::new_empty(sess.source_map()); } let _prof_timer = sess.prof.generic_activity("incr_comp_load_query_result_cache"); match load_data(sess.opts.debugging_opts.incremental_info, &query_cache_path(sess)) { - LoadResult::Ok{ data: (bytes, start_pos) } => OnDiskCache::new(sess, bytes, start_pos), - _ => OnDiskCache::new_empty(sess.source_map()) + LoadResult::Ok { data: (bytes, start_pos) } => OnDiskCache::new(sess, bytes, start_pos), + _ => OnDiskCache::new_empty(sess.source_map()), } } diff --git a/src/librustc_incremental/persist/mod.rs b/src/librustc_incremental/persist/mod.rs index bf404140f1..6a03a01430 100644 --- a/src/librustc_incremental/persist/mod.rs +++ b/src/librustc_incremental/persist/mod.rs @@ -4,11 +4,11 @@ mod data; mod dirty_clean; +mod file_format; mod fs; mod load; mod save; mod work_product; -mod file_format; pub use fs::finalize_session_directory; pub use fs::garbage_collect_session_directories; @@ -16,9 +16,9 @@ pub use fs::in_incr_comp_dir; pub use fs::in_incr_comp_dir_sess; pub use fs::prepare_session_directory; pub use load::dep_graph_tcx_init; -pub use load::{DepGraphFuture, load_dep_graph}; pub use load::load_query_result_cache; pub use load::LoadResult; +pub use load::{load_dep_graph, DepGraphFuture}; pub use save::save_dep_graph; pub use save::save_work_product_index; pub use work_product::copy_cgu_workproducts_to_incr_comp_cache_dir; diff --git a/src/librustc_incremental/persist/save.rs b/src/librustc_incremental/persist/save.rs index ecc66e6017..87f39dedd0 100644 --- a/src/librustc_incremental/persist/save.rs +++ b/src/librustc_incremental/persist/save.rs @@ -1,18 +1,17 @@ use rustc::dep_graph::{DepGraph, DepKind, WorkProduct, WorkProductId}; use rustc::session::Session; use rustc::ty::TyCtxt; -use rustc::util::common::time; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::sync::join; -use rustc_serialize::Encodable as RustcEncodable; use rustc_serialize::opaque::Encoder; +use rustc_serialize::Encodable as RustcEncodable; use std::fs; use std::path::PathBuf; use super::data::*; -use super::fs::*; use super::dirty_clean; use super::file_format; +use super::fs::*; use super::work_product; pub fn save_dep_graph(tcx: TyCtxt<'_>) { @@ -30,43 +29,38 @@ pub fn save_dep_graph(tcx: TyCtxt<'_>) { let query_cache_path = query_cache_path(sess); let dep_graph_path = dep_graph_path(sess); - join(move || { - if tcx.sess.opts.debugging_opts.incremental_queries { - let _timer = tcx.prof.generic_activity("incr_comp_persist_result_cache"); - - time(sess, "persist query result cache", || { - save_in(sess, - query_cache_path, - |e| encode_query_cache(tcx, e)); + join( + move || { + if tcx.sess.opts.debugging_opts.incremental_queries { + sess.time("incr_comp_persist_result_cache", || { + save_in(sess, query_cache_path, |e| encode_query_cache(tcx, e)); + }); + } + }, + || { + sess.time("incr_comp_persist_dep_graph", || { + save_in(sess, dep_graph_path, |e| { + sess.time("incr_comp_encode_dep_graph", || encode_dep_graph(tcx, e)) + }); }); - } - }, || { - time(sess, "persist dep-graph", || { - let _timer = tcx.prof.generic_activity("incr_comp_persist_dep_graph"); - - save_in(sess, - dep_graph_path, - |e| { - time(sess, "encode dep-graph", || { - encode_dep_graph(tcx, e) - }) - }); - }); - }); + }, + ); dirty_clean::check_dirty_clean_annotations(tcx); }) } -pub fn save_work_product_index(sess: &Session, - dep_graph: &DepGraph, - new_work_products: FxHashMap) { +pub fn save_work_product_index( + sess: &Session, + dep_graph: &DepGraph, + new_work_products: FxHashMap, +) { if sess.opts.incremental.is_none() { return; } // This is going to be deleted in finalize_session_directory, so let's not create it if sess.has_errors_or_delayed_span_bugs() { - return; + return; } debug!("save_work_product_index()"); @@ -81,25 +75,27 @@ pub fn save_work_product_index(sess: &Session, for (id, wp) in previous_work_products.iter() { if !new_work_products.contains_key(id) { work_product::delete_workproduct_files(sess, wp); - debug_assert!(wp.saved_files.iter().all(|&(_, ref file_name)| { - !in_incr_comp_dir_sess(sess, file_name).exists() - })); + debug_assert!( + wp.saved_files.iter().all(|&(_, ref file_name)| { + !in_incr_comp_dir_sess(sess, file_name).exists() + }) + ); } } // Check that we did not delete one of the current work-products: debug_assert!({ - new_work_products.iter() - .flat_map(|(_, wp)| wp.saved_files - .iter() - .map(|&(_, ref name)| name)) - .map(|name| in_incr_comp_dir_sess(sess, name)) - .all(|path| path.exists()) + new_work_products + .iter() + .flat_map(|(_, wp)| wp.saved_files.iter().map(|&(_, ref name)| name)) + .map(|name| in_incr_comp_dir_sess(sess, name)) + .all(|path| path.exists()) }); } fn save_in(sess: &Session, path_buf: PathBuf, encode: F) - where F: FnOnce(&mut Encoder) +where + F: FnOnce(&mut Encoder), { debug!("save: storing data in {}", path_buf.display()); @@ -113,9 +109,11 @@ fn save_in(sess: &Session, path_buf: PathBuf, encode: F) debug!("save: remove old file"); } Err(err) => { - sess.err(&format!("unable to delete old dep-graph at `{}`: {}", - path_buf.display(), - err)); + sess.err(&format!( + "unable to delete old dep-graph at `{}`: {}", + path_buf.display(), + err + )); return; } } @@ -133,9 +131,7 @@ fn save_in(sess: &Session, path_buf: PathBuf, encode: F) debug!("save: data written to disk successfully"); } Err(err) => { - sess.err(&format!("failed to write dep-graph to `{}`: {}", - path_buf.display(), - err)); + sess.err(&format!("failed to write dep-graph to `{}`: {}", path_buf.display(), err)); return; } } @@ -146,10 +142,8 @@ fn encode_dep_graph(tcx: TyCtxt<'_>, encoder: &mut Encoder) { tcx.sess.opts.dep_tracking_hash().encode(encoder).unwrap(); // Encode the graph data. - let serialized_graph = time(tcx.sess, "getting serialized graph", || { - let _timer = tcx.prof.generic_activity("incr_comp_serialize_dep_graph"); - tcx.dep_graph.serialize() - }); + let serialized_graph = + tcx.sess.time("incr_comp_serialize_dep_graph", || tcx.dep_graph.serialize()); if tcx.sess.opts.debugging_opts.incremental_info { #[derive(Clone)] @@ -179,13 +173,13 @@ fn encode_dep_graph(tcx: TyCtxt<'_>, encoder: &mut Encoder) { let mut counts: Vec<_> = counts.values().cloned().collect(); counts.sort_by_key(|s| -(s.node_counter as i64)); - let percentage_of_all_nodes: Vec = counts.iter().map(|s| { - (100.0 * (s.node_counter as f64)) / (total_node_count as f64) - }).collect(); + let percentage_of_all_nodes: Vec = counts + .iter() + .map(|s| (100.0 * (s.node_counter as f64)) / (total_node_count as f64)) + .collect(); - let average_edges_per_kind: Vec = counts.iter().map(|s| { - (s.edge_counter as f64) / (s.node_counter as f64) - }).collect(); + let average_edges_per_kind: Vec = + counts.iter().map(|s| (s.edge_counter as f64) / (s.node_counter as f64)).collect(); println!("[incremental]"); println!("[incremental] DepGraph Statistics"); @@ -198,49 +192,52 @@ fn encode_dep_graph(tcx: TyCtxt<'_>, encoder: &mut Encoder) { println!("[incremental]"); println!("[incremental] Total Node Count: {}", total_node_count); println!("[incremental] Total Edge Count: {}", total_edge_count); - if let Some((total_edge_reads, - total_duplicate_edge_reads)) = tcx.dep_graph.edge_deduplication_data() { + if let Some((total_edge_reads, total_duplicate_edge_reads)) = + tcx.dep_graph.edge_deduplication_data() + { println!("[incremental] Total Edge Reads: {}", total_edge_reads); println!("[incremental] Total Duplicate Edge Reads: {}", total_duplicate_edge_reads); } println!("[incremental]"); - println!("[incremental] {:<36}| {:<17}| {:<12}| {:<17}|", - "Node Kind", - "Node Frequency", - "Node Count", - "Avg. Edge Count"); - println!("[incremental] -------------------------------------\ + println!( + "[incremental] {:<36}| {:<17}| {:<12}| {:<17}|", + "Node Kind", "Node Frequency", "Node Count", "Avg. Edge Count" + ); + println!( + "[incremental] -------------------------------------\ |------------------\ |-------------\ - |------------------|"); + |------------------|" + ); for (i, stat) in counts.iter().enumerate() { - println!("[incremental] {:<36}|{:>16.1}% |{:>12} |{:>17.1} |", + println!( + "[incremental] {:<36}|{:>16.1}% |{:>12} |{:>17.1} |", format!("{:?}", stat.kind), percentage_of_all_nodes[i], stat.node_counter, - average_edges_per_kind[i]); + average_edges_per_kind[i] + ); } println!("{}", SEPARATOR); println!("[incremental]"); } - time(tcx.sess, "encoding serialized graph", || { - let _timer = tcx.prof.generic_activity("incr_comp_encode_serialized_dep_graph"); + tcx.sess.time("incr_comp_encode_serialized_dep_graph", || { serialized_graph.encode(encoder).unwrap(); }); } -fn encode_work_product_index(work_products: &FxHashMap, - encoder: &mut Encoder) { +fn encode_work_product_index( + work_products: &FxHashMap, + encoder: &mut Encoder, +) { let serialized_products: Vec<_> = work_products .iter() - .map(|(id, work_product)| { - SerializedWorkProduct { - id: id.clone(), - work_product: work_product.clone(), - } + .map(|(id, work_product)| SerializedWorkProduct { + id: *id, + work_product: work_product.clone(), }) .collect(); @@ -248,9 +245,7 @@ fn encode_work_product_index(work_products: &FxHashMap, encoder: &mut Encoder) { - time(tcx.sess, "serialize query result cache", || { - let _timer = tcx.prof.generic_activity("incr_comp_serialize_result_cache"); - + tcx.sess.time("incr_comp_serialize_result_cache", || { tcx.serialize_query_result_cache(encoder).unwrap(); }) } diff --git a/src/librustc_incremental/persist/work_product.rs b/src/librustc_incremental/persist/work_product.rs index 3495b27c5e..65a742a202 100644 --- a/src/librustc_incremental/persist/work_product.rs +++ b/src/librustc_incremental/persist/work_product.rs @@ -1,52 +1,49 @@ //! This module contains files for saving intermediate work-products. use crate::persist::fs::*; -use rustc::dep_graph::{WorkProduct, WorkProductId, WorkProductFileKind}; +use rustc::dep_graph::{WorkProduct, WorkProductFileKind, WorkProductId}; use rustc::session::Session; use rustc_fs_util::link_or_copy; -use std::path::PathBuf; use std::fs as std_fs; +use std::path::PathBuf; pub fn copy_cgu_workproducts_to_incr_comp_cache_dir( sess: &Session, cgu_name: &str, - files: &[(WorkProductFileKind, PathBuf)] + files: &[(WorkProductFileKind, PathBuf)], ) -> Option<(WorkProductId, WorkProduct)> { - debug!("copy_cgu_workproducts_to_incr_comp_cache_dir({:?},{:?})", - cgu_name, - files); + debug!("copy_cgu_workproducts_to_incr_comp_cache_dir({:?},{:?})", cgu_name, files); if sess.opts.incremental.is_none() { - return None + return None; } - let saved_files = - files.iter() - .map(|&(kind, ref path)| { - let extension = match kind { - WorkProductFileKind::Object => "o", - WorkProductFileKind::Bytecode => "bc", - WorkProductFileKind::BytecodeCompressed => "bc.z", - }; - let file_name = format!("{}.{}", cgu_name, extension); - let path_in_incr_dir = in_incr_comp_dir_sess(sess, &file_name); - match link_or_copy(path, &path_in_incr_dir) { - Ok(_) => Some((kind, file_name)), - Err(err) => { - sess.warn(&format!("error copying object file `{}` \ + let saved_files = files + .iter() + .map(|&(kind, ref path)| { + let extension = match kind { + WorkProductFileKind::Object => "o", + WorkProductFileKind::Bytecode => "bc", + WorkProductFileKind::BytecodeCompressed => "bc.z", + }; + let file_name = format!("{}.{}", cgu_name, extension); + let path_in_incr_dir = in_incr_comp_dir_sess(sess, &file_name); + match link_or_copy(path, &path_in_incr_dir) { + Ok(_) => Some((kind, file_name)), + Err(err) => { + sess.warn(&format!( + "error copying object file `{}` \ to incremental directory as `{}`: {}", - path.display(), - path_in_incr_dir.display(), - err)); - None - } - } - }) - .collect::>>()?; + path.display(), + path_in_incr_dir.display(), + err + )); + None + } + } + }) + .collect::>>()?; - let work_product = WorkProduct { - cgu_name: cgu_name.to_string(), - saved_files, - }; + let work_product = WorkProduct { cgu_name: cgu_name.to_string(), saved_files }; let work_product_id = WorkProductId::from_cgu_name(cgu_name); Some((work_product_id, work_product)) @@ -56,11 +53,13 @@ pub fn delete_workproduct_files(sess: &Session, work_product: &WorkProduct) { for &(_, ref file_name) in &work_product.saved_files { let path = in_incr_comp_dir_sess(sess, file_name); match std_fs::remove_file(&path) { - Ok(()) => { } + Ok(()) => {} Err(err) => { - sess.warn( - &format!("file-system error deleting outdated file `{}`: {}", - path.display(), err)); + sess.warn(&format!( + "file-system error deleting outdated file `{}`: {}", + path.display(), + err + )); } } } diff --git a/src/librustc_index/bit_set.rs b/src/librustc_index/bit_set.rs index 9ed5ef5a53..2a1a560767 100644 --- a/src/librustc_index/bit_set.rs +++ b/src/librustc_index/bit_set.rs @@ -37,22 +37,14 @@ impl BitSet { #[inline] pub fn new_empty(domain_size: usize) -> BitSet { let num_words = num_words(domain_size); - BitSet { - domain_size, - words: vec![0; num_words], - marker: PhantomData, - } + BitSet { domain_size, words: vec![0; num_words], marker: PhantomData } } /// Creates a new, filled bitset with a given `domain_size`. #[inline] pub fn new_filled(domain_size: usize) -> BitSet { let num_words = num_words(domain_size); - let mut result = BitSet { - domain_size, - words: vec![!0; num_words], - marker: PhantomData, - }; + let mut result = BitSet { domain_size, words: vec![!0; num_words], marker: PhantomData }; result.clear_excess_bits(); result } @@ -160,7 +152,7 @@ impl BitSet { /// (i.e., if any bits were removed). pub fn intersect(&mut self, other: &BitSet) -> bool { assert_eq!(self.domain_size, other.domain_size); - bitwise(&mut self.words, &other.words, |a, b| { a & b }) + bitwise(&mut self.words, &other.words, |a, b| a & b) } /// Gets a slice of the underlying words. @@ -200,7 +192,7 @@ impl BitSet { // Were there any bits in the old word that did not occur in the sparse set? not_already |= (self.words[current_index] ^ new_bit_mask) != 0; // Check all words we skipped for any set bit. - not_already |= self.words[current_index+1..word_index].iter().any(|&x| x != 0); + not_already |= self.words[current_index + 1..word_index].iter().any(|&x| x != 0); // Update next word. current_index = word_index; // Reset bit mask, no bits have been merged yet. @@ -214,7 +206,7 @@ impl BitSet { // Any bits in the last inspected word that were not in the sparse set? not_already |= (self.words[current_index] ^ new_bit_mask) != 0; // Any bits in the tail? Note `clear_excess_bits` before. - not_already |= self.words[current_index+1..].iter().any(|&x| x != 0); + not_already |= self.words[current_index + 1..].iter().any(|&x| x != 0); not_already } @@ -237,22 +229,20 @@ pub trait SubtractFromBitSet { impl UnionIntoBitSet for BitSet { fn union_into(&self, other: &mut BitSet) -> bool { assert_eq!(self.domain_size, other.domain_size); - bitwise(&mut other.words, &self.words, |a, b| { a | b }) + bitwise(&mut other.words, &self.words, |a, b| a | b) } } impl SubtractFromBitSet for BitSet { fn subtract_from(&self, other: &mut BitSet) -> bool { assert_eq!(self.domain_size, other.domain_size); - bitwise(&mut other.words, &self.words, |a, b| { a & !b }) + bitwise(&mut other.words, &self.words, |a, b| a & !b) } } impl fmt::Debug for BitSet { fn fmt(&self, w: &mut fmt::Formatter<'_>) -> fmt::Result { - w.debug_list() - .entries(self.iter()) - .finish() + w.debug_list().entries(self.iter()).finish() } } @@ -267,7 +257,8 @@ impl ToString for BitSet { let mut i = 0; for word in &self.words { let mut word = *word; - for _ in 0..WORD_BYTES { // for each byte in `word`: + for _ in 0..WORD_BYTES { + // for each byte in `word`: let remain = self.domain_size - i; // If less than a byte remains, then mask just that many bits. let mask = if remain <= 8 { (1 << remain) - 1 } else { 0xFF }; @@ -276,7 +267,9 @@ impl ToString for BitSet { result.push_str(&format!("{}{:02x}", sep, byte)); - if remain <= 8 { break; } + if remain <= 8 { + break; + } word >>= 8; i += 8; sep = '-'; @@ -301,7 +294,7 @@ pub struct BitIter<'a, T: Idx> { /// Underlying iterator over the words. iter: slice::Iter<'a, Word>, - marker: PhantomData + marker: PhantomData, } impl<'a, T: Idx> BitIter<'a, T> { @@ -331,7 +324,7 @@ impl<'a, T: Idx> Iterator for BitIter<'a, T> { let bit_pos = self.word.trailing_zeros() as usize; let bit = 1 << bit_pos; self.word ^= bit; - return Some(T::new(bit_pos + self.offset)) + return Some(T::new(bit_pos + self.offset)); } // Move onto the next word. `wrapping_add()` is needed to handle @@ -345,7 +338,8 @@ impl<'a, T: Idx> Iterator for BitIter<'a, T> { #[inline] fn bitwise(out_vec: &mut [Word], in_vec: &[Word], op: Op) -> bool - where Op: Fn(Word, Word) -> Word +where + Op: Fn(Word, Word) -> Word, { assert_eq!(out_vec.len(), in_vec.len()); let mut changed = false; @@ -374,10 +368,7 @@ pub struct SparseBitSet { impl SparseBitSet { fn new_empty(domain_size: usize) -> Self { - SparseBitSet { - domain_size, - elems: SmallVec::new() - } + SparseBitSet { domain_size, elems: SmallVec::new() } } fn len(&self) -> usize { @@ -698,11 +689,7 @@ impl GrowableBitSet { #[inline] pub fn contains(&self, elem: T) -> bool { let (word_index, mask) = word_index_and_mask(elem); - if let Some(word) = self.bit_set.words.get(word_index) { - (word & mask) != 0 - } else { - false - } + if let Some(word) = self.bit_set.words.get(word_index) { (word & mask) != 0 } else { false } } } @@ -913,10 +900,7 @@ where impl SparseBitMatrix { /// Creates a new empty sparse bit matrix with no rows or columns. pub fn new(num_columns: usize) -> Self { - Self { - num_columns, - rows: IndexVec::new(), - } + Self { num_columns, rows: IndexVec::new() } } fn ensure_row(&mut self, row: R) -> &mut HybridBitSet { @@ -986,11 +970,7 @@ impl SparseBitMatrix { } pub fn row(&self, row: R) -> Option<&HybridBitSet> { - if let Some(Some(row)) = self.rows.get(row) { - Some(row) - } else { - None - } + if let Some(Some(row)) = self.rows.get(row) { Some(row) } else { None } } } diff --git a/src/librustc_index/bit_set/tests.rs b/src/librustc_index/bit_set/tests.rs index ac7913815f..6cc3e9427d 100644 --- a/src/librustc_index/bit_set/tests.rs +++ b/src/librustc_index/bit_set/tests.rs @@ -25,10 +25,7 @@ fn bitset_iter_works() { bitset.insert(65); bitset.insert(66); bitset.insert(99); - assert_eq!( - bitset.iter().collect::>(), - [1, 10, 19, 62, 63, 64, 65, 66, 99] - ); + assert_eq!(bitset.iter().collect::>(), [1, 10, 19, 62, 63, 64, 65, 66, 99]); } #[test] @@ -100,14 +97,14 @@ fn hybrid_bitset() { assert!(dense256.contains(i)); } - assert!(sparse038.superset(&sparse038)); // sparse + sparse (self) - assert!(sparse01358.superset(&sparse038)); // sparse + sparse - assert!(dense10.superset(&sparse038)); // dense + sparse - assert!(dense10.superset(&dense10)); // dense + dense (self) - assert!(dense256.superset(&dense10)); // dense + dense + assert!(sparse038.superset(&sparse038)); // sparse + sparse (self) + assert!(sparse01358.superset(&sparse038)); // sparse + sparse + assert!(dense10.superset(&sparse038)); // dense + sparse + assert!(dense10.superset(&dense10)); // dense + dense (self) + assert!(dense256.superset(&dense10)); // dense + dense let mut hybrid = sparse038; - assert!(!sparse01358.union(&hybrid)); // no change + assert!(!sparse01358.union(&hybrid)); // no change assert!(hybrid.union(&sparse01358)); assert!(hybrid.superset(&sparse01358) && sparse01358.superset(&hybrid)); assert!(!dense10.union(&sparse01358)); @@ -320,13 +317,13 @@ fn union_hybrid_sparse_full_to_dense(b: &mut Bencher) { /// Merge dense hybrid set into full hybrid set with indices over the whole domain. #[bench] fn union_hybrid_sparse_domain_to_dense(b: &mut Bencher) { - let mut pre_dense: HybridBitSet = HybridBitSet::new_empty(SPARSE_MAX*64); + let mut pre_dense: HybridBitSet = HybridBitSet::new_empty(SPARSE_MAX * 64); for i in 0..10 { assert!(pre_dense.insert(i)); } - let mut pre_sparse: HybridBitSet = HybridBitSet::new_empty(SPARSE_MAX*64); + let mut pre_sparse: HybridBitSet = HybridBitSet::new_empty(SPARSE_MAX * 64); for i in 0..SPARSE_MAX { - assert!(pre_sparse.insert(i*64)); + assert!(pre_sparse.insert(i * 64)); } b.iter(|| { let dense = pre_dense.clone(); diff --git a/src/librustc_index/lib.rs b/src/librustc_index/lib.rs index ad242dfd2e..86dd1a29d0 100644 --- a/src/librustc_index/lib.rs +++ b/src/librustc_index/lib.rs @@ -3,5 +3,5 @@ #![feature(test)] #![feature(fn_traits)] -pub mod vec; pub mod bit_set; +pub mod vec; diff --git a/src/librustc_index/vec.rs b/src/librustc_index/vec.rs index 6e80b48a68..d14bafb44f 100644 --- a/src/librustc_index/vec.rs +++ b/src/librustc_index/vec.rs @@ -1,14 +1,14 @@ -use rustc_serialize::{Encodable, Decodable, Encoder, Decoder}; +use rustc_serialize::{Decodable, Decoder, Encodable, Encoder}; +use std::fmt; use std::fmt::Debug; +use std::hash::Hash; use std::iter::{self, FromIterator}; -use std::slice; use std::marker::PhantomData; use std::ops::{Index, IndexMut, Range, RangeBounds}; -use std::fmt; -use std::hash::Hash; -use std::vec; +use std::slice; use std::u32; +use std::vec; /// Represents some newtyped `usize` wrapper. /// @@ -29,16 +29,25 @@ pub trait Idx: Copy + 'static + Ord + Debug + Hash { impl Idx for usize { #[inline] - fn new(idx: usize) -> Self { idx } + fn new(idx: usize) -> Self { + idx + } #[inline] - fn index(self) -> usize { self } + fn index(self) -> usize { + self + } } impl Idx for u32 { #[inline] - fn new(idx: usize) -> Self { assert!(idx <= u32::MAX as usize); idx as u32 } + fn new(idx: usize) -> Self { + assert!(idx <= u32::MAX as usize); + idx as u32 + } #[inline] - fn index(self) -> usize { self as usize } + fn index(self) -> usize { + self as usize + } } /// Creates a struct type `S` that can be used as an index with @@ -111,13 +120,13 @@ macro_rules! newtype_index { impl $type { $v const MAX_AS_U32: u32 = $max; - $v const MAX: $type = $type::from_u32_const($max); + $v const MAX: Self = Self::from_u32_const($max); #[inline] $v fn from_usize(value: usize) -> Self { assert!(value <= ($max as usize)); unsafe { - $type::from_u32_unchecked(value as u32) + Self::from_u32_unchecked(value as u32) } } @@ -125,7 +134,7 @@ macro_rules! newtype_index { $v fn from_u32(value: u32) -> Self { assert!(value <= $max); unsafe { - $type::from_u32_unchecked(value) + Self::from_u32_unchecked(value) } } @@ -143,13 +152,13 @@ macro_rules! newtype_index { ]; unsafe { - $type { private: value } + Self { private: value } } } #[inline] $v const unsafe fn from_u32_unchecked(value: u32) -> Self { - $type { private: value } + Self { private: value } } /// Extracts the value of this index as an integer. @@ -175,14 +184,14 @@ macro_rules! newtype_index { type Output = Self; fn add(self, other: usize) -> Self { - Self::new(self.index() + other) + Self::from_usize(self.index() + other) } } - impl Idx for $type { + impl $crate::vec::Idx for $type { #[inline] fn new(value: usize) -> Self { - Self::from(value) + Self::from_usize(value) } #[inline] @@ -195,39 +204,39 @@ macro_rules! newtype_index { #[inline] fn steps_between(start: &Self, end: &Self) -> Option { ::steps_between( - &Idx::index(*start), - &Idx::index(*end), + &Self::index(*start), + &Self::index(*end), ) } #[inline] fn replace_one(&mut self) -> Self { - ::std::mem::replace(self, Self::new(1)) + ::std::mem::replace(self, Self::from_u32(1)) } #[inline] fn replace_zero(&mut self) -> Self { - ::std::mem::replace(self, Self::new(0)) + ::std::mem::replace(self, Self::from_u32(0)) } #[inline] fn add_one(&self) -> Self { - Self::new(Idx::index(*self) + 1) + Self::from_usize(Self::index(*self) + 1) } #[inline] fn sub_one(&self) -> Self { - Self::new(Idx::index(*self) - 1) + Self::from_usize(Self::index(*self) - 1) } #[inline] fn add_usize(&self, u: usize) -> Option { - Idx::index(*self).checked_add(u).map(Self::new) + Self::index(*self).checked_add(u).map(Self::from_usize) } #[inline] fn sub_usize(&self, u: usize) -> Option { - Idx::index(*self).checked_sub(u).map(Self::new) + Self::index(*self).checked_sub(u).map(Self::from_usize) } } @@ -248,14 +257,14 @@ macro_rules! newtype_index { impl From for $type { #[inline] fn from(value: usize) -> Self { - $type::from_usize(value) + Self::from_usize(value) } } impl From for $type { #[inline] fn from(value: u32) -> Self { - $type::from_u32(value) + Self::from_u32(value) } } @@ -400,7 +409,7 @@ macro_rules! newtype_index { (@decodable $type:ident) => ( impl ::rustc_serialize::Decodable for $type { fn decode(d: &mut D) -> Result { - d.read_u32().map(Self::from) + d.read_u32().map(Self::from_u32) } } ); @@ -491,7 +500,7 @@ macro_rules! newtype_index { const $name:ident = $constant:expr, $($tokens:tt)*) => ( $(#[doc = $doc])* - pub const $name: $type = $type::from_u32_const($constant); + $v const $name: $type = $type::from_u32_const($constant); $crate::newtype_index!( @derives [$($derives,)*] @attrs [$(#[$attrs])*] @@ -506,7 +515,7 @@ macro_rules! newtype_index { #[derive(Clone, PartialEq, Eq, Hash)] pub struct IndexVec { pub raw: Vec, - _marker: PhantomData + _marker: PhantomData, } // Whether `IndexVec` is `Send` depends only on the data, @@ -521,9 +530,7 @@ impl Encodable for IndexVec { impl Decodable for IndexVec { fn decode(d: &mut D) -> Result { - Decodable::decode(d).map(|v| { - IndexVec { raw: v, _marker: PhantomData } - }) + Decodable::decode(d).map(|v| IndexVec { raw: v, _marker: PhantomData }) } } @@ -553,14 +560,16 @@ impl IndexVec { #[inline] pub fn from_elem(elem: T, universe: &IndexVec) -> Self - where T: Clone + where + T: Clone, { IndexVec { raw: vec![elem; universe.len()], _marker: PhantomData } } #[inline] pub fn from_elem_n(elem: T, n: usize) -> Self - where T: Clone + where + T: Clone, { IndexVec { raw: vec![elem; n], _marker: PhantomData } } @@ -600,8 +609,7 @@ impl IndexVec { } #[inline] - pub fn into_iter_enumerated(self) -> Enumerated> - { + pub fn into_iter_enumerated(self) -> Enumerated> { self.raw.into_iter().enumerate().map(IntoIdx { _marker: PhantomData }) } @@ -611,8 +619,7 @@ impl IndexVec { } #[inline] - pub fn iter_enumerated(&self) -> Enumerated> - { + pub fn iter_enumerated(&self) -> Enumerated> { self.raw.iter().enumerate().map(IntoIdx { _marker: PhantomData }) } @@ -627,20 +634,23 @@ impl IndexVec { } #[inline] - pub fn iter_enumerated_mut(&mut self) -> Enumerated> - { + pub fn iter_enumerated_mut(&mut self) -> Enumerated> { self.raw.iter_mut().enumerate().map(IntoIdx { _marker: PhantomData }) } #[inline] pub fn drain<'a, R: RangeBounds>( - &'a mut self, range: R) -> impl Iterator + 'a { + &'a mut self, + range: R, + ) -> impl Iterator + 'a { self.raw.drain(range) } #[inline] pub fn drain_enumerated<'a, R: RangeBounds>( - &'a mut self, range: R) -> impl Iterator + 'a { + &'a mut self, + range: R, + ) -> impl Iterator + 'a { self.raw.drain(range).enumerate().map(IntoIdx { _marker: PhantomData }) } @@ -690,10 +700,7 @@ impl IndexVec { } pub fn convert_index_type(self) -> IndexVec { - IndexVec { - raw: self.raw, - _marker: PhantomData, - } + IndexVec { raw: self.raw, _marker: PhantomData } } } @@ -764,7 +771,10 @@ impl Extend for IndexVec { impl FromIterator for IndexVec { #[inline] - fn from_iter(iter: J) -> Self where J: IntoIterator { + fn from_iter(iter: J) -> Self + where + J: IntoIterator, + { IndexVec { raw: FromIterator::from_iter(iter), _marker: PhantomData } } } @@ -777,7 +787,6 @@ impl IntoIterator for IndexVec { fn into_iter(self) -> vec::IntoIter { self.raw.into_iter() } - } impl<'a, I: Idx, T> IntoIterator for &'a IndexVec { @@ -800,7 +809,9 @@ impl<'a, I: Idx, T> IntoIterator for &'a mut IndexVec { } } -pub struct IntoIdx { _marker: PhantomData } +pub struct IntoIdx { + _marker: PhantomData, +} impl FnOnce<((usize, T),)> for IntoIdx { type Output = (I, T); @@ -828,3 +839,6 @@ impl FnMut<(usize,)> for IntoIdx { I::new(n) } } + +#[cfg(test)] +mod tests; diff --git a/src/librustc_index/vec/tests.rs b/src/librustc_index/vec/tests.rs new file mode 100644 index 0000000000..15c43c72c7 --- /dev/null +++ b/src/librustc_index/vec/tests.rs @@ -0,0 +1,51 @@ +#![allow(dead_code)] +newtype_index!(struct MyIdx { MAX = 0xFFFF_FFFA }); + +#[test] +fn index_size_is_optimized() { + use std::mem::size_of; + + assert_eq!(size_of::(), 4); + // Uses 0xFFFF_FFFB + assert_eq!(size_of::>(), 4); + // Uses 0xFFFF_FFFC + assert_eq!(size_of::>>(), 4); + // Uses 0xFFFF_FFFD + assert_eq!(size_of::>>>(), 4); + // Uses 0xFFFF_FFFE + assert_eq!(size_of::>>>>(), 4); + // Uses 0xFFFF_FFFF + assert_eq!(size_of::>>>>>(), 4); + // Uses a tag + assert_eq!(size_of::>>>>>>(), 8); +} + +#[test] +fn range_iterator_iterates_forwards() { + let range = MyIdx::from_u32(1)..MyIdx::from_u32(4); + assert_eq!( + range.collect::>(), + [MyIdx::from_u32(1), MyIdx::from_u32(2), MyIdx::from_u32(3)] + ); +} + +#[test] +fn range_iterator_iterates_backwards() { + let range = MyIdx::from_u32(1)..MyIdx::from_u32(4); + assert_eq!( + range.rev().collect::>(), + [MyIdx::from_u32(3), MyIdx::from_u32(2), MyIdx::from_u32(1)] + ); +} + +#[test] +fn range_count_is_correct() { + let range = MyIdx::from_u32(1)..MyIdx::from_u32(4); + assert_eq!(range.count(), 3); +} + +#[test] +fn range_size_hint_is_correct() { + let range = MyIdx::from_u32(1)..MyIdx::from_u32(4); + assert_eq!(range.size_hint(), (3, Some(3))); +} diff --git a/src/librustc_interface/Cargo.toml b/src/librustc_interface/Cargo.toml index 58fd92822e..1fe5248dbf 100644 --- a/src/librustc_interface/Cargo.toml +++ b/src/librustc_interface/Cargo.toml @@ -14,20 +14,25 @@ log = "0.4" rayon = { version = "0.3.0", package = "rustc-rayon" } smallvec = { version = "1.0", features = ["union", "may_dangle"] } syntax = { path = "../libsyntax" } -syntax_ext = { path = "../libsyntax_ext" } -syntax_expand = { path = "../libsyntax_expand" } +rustc_builtin_macros = { path = "../librustc_builtin_macros" } +rustc_expand = { path = "../librustc_expand" } rustc_parse = { path = "../librustc_parse" } -syntax_pos = { path = "../libsyntax_pos" } +rustc_session = { path = "../librustc_session" } +rustc_span = { path = "../librustc_span" } rustc_serialize = { path = "../libserialize", package = "serialize" } rustc = { path = "../librustc" } +rustc_ast_lowering = { path = "../librustc_ast_lowering" } +rustc_ast_passes = { path = "../librustc_ast_passes" } rustc_incremental = { path = "../librustc_incremental" } rustc_traits = { path = "../librustc_traits" } rustc_data_structures = { path = "../librustc_data_structures" } rustc_codegen_ssa = { path = "../librustc_codegen_ssa" } rustc_codegen_utils = { path = "../librustc_codegen_utils" } rustc_codegen_llvm = { path = "../librustc_codegen_llvm", optional = true } +rustc_hir = { path = "../librustc_hir" } rustc_metadata = { path = "../librustc_metadata" } rustc_mir = { path = "../librustc_mir" } +rustc_mir_build = { path = "../librustc_mir_build" } rustc_passes = { path = "../librustc_passes" } rustc_typeck = { path = "../librustc_typeck" } rustc_lint = { path = "../librustc_lint" } @@ -35,9 +40,13 @@ rustc_errors = { path = "../librustc_errors" } rustc_plugin_impl = { path = "../librustc_plugin_impl" } rustc_privacy = { path = "../librustc_privacy" } rustc_resolve = { path = "../librustc_resolve" } +rustc_ty = { path = "../librustc_ty" } tempfile = "3.0.5" once_cell = "1" +[target.'cfg(windows)'.dependencies] +winapi = { version = "0.3", features = ["libloaderapi"] } + [dev-dependencies] rustc_target = { path = "../librustc_target" } diff --git a/src/librustc_interface/callbacks.rs b/src/librustc_interface/callbacks.rs new file mode 100644 index 0000000000..eb9c118bb0 --- /dev/null +++ b/src/librustc_interface/callbacks.rs @@ -0,0 +1,62 @@ +//! Throughout the compiler tree, there are several places which want to have +//! access to state or queries while being inside crates that are dependencies +//! of librustc. To facilitate this, we have the +//! `rustc_data_structures::AtomicRef` type, which allows us to setup a global +//! static which can then be set in this file at program startup. +//! +//! See `SPAN_DEBUG` for an example of how to set things up. +//! +//! The functions in this file should fall back to the default set in their +//! origin crate when the `TyCtxt` is not present in TLS. + +use rustc::ty::tls; +use rustc_errors::{Diagnostic, TRACK_DIAGNOSTICS}; +use rustc_span; +use std::fmt; + +/// This is a callback from libsyntax as it cannot access the implicit state +/// in librustc otherwise. +fn span_debug(span: rustc_span::Span, f: &mut fmt::Formatter<'_>) -> fmt::Result { + tls::with_opt(|tcx| { + if let Some(tcx) = tcx { + write!(f, "{}", tcx.sess.source_map().span_to_string(span)) + } else { + rustc_span::default_span_debug(span, f) + } + }) +} + +/// This is a callback from libsyntax as it cannot access the implicit state +/// in librustc otherwise. It is used to when diagnostic messages are +/// emitted and stores them in the current query, if there is one. +fn track_diagnostic(diagnostic: &Diagnostic) { + tls::with_context_opt(|icx| { + if let Some(icx) = icx { + if let Some(ref diagnostics) = icx.diagnostics { + let mut diagnostics = diagnostics.lock(); + diagnostics.extend(Some(diagnostic.clone())); + } + } + }) +} + +/// This is a callback from librustc_hir as it cannot access the implicit state +/// in librustc otherwise. +fn def_id_debug(def_id: rustc_hir::def_id::DefId, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "DefId({}:{}", def_id.krate, def_id.index.index())?; + tls::with_opt(|opt_tcx| { + if let Some(tcx) = opt_tcx { + write!(f, " ~ {}", tcx.def_path_debug_str(def_id))?; + } + Ok(()) + })?; + write!(f, ")") +} + +/// Sets up the callbacks in prior crates which we want to refer to the +/// TyCtxt in. +pub fn setup_callbacks() { + rustc_span::SPAN_DEBUG.swap(&(span_debug as fn(_, &mut fmt::Formatter<'_>) -> _)); + rustc_hir::def_id::DEF_ID_DEBUG.swap(&(def_id_debug as fn(_, &mut fmt::Formatter<'_>) -> _)); + TRACK_DIAGNOSTICS.swap(&(track_diagnostic as fn(&_))); +} diff --git a/src/librustc_interface/interface.rs b/src/librustc_interface/interface.rs index beb2465bd4..9cd9eb66cf 100644 --- a/src/librustc_interface/interface.rs +++ b/src/librustc_interface/interface.rs @@ -1,31 +1,32 @@ -use crate::util; pub use crate::passes::BoxedResolver; +use crate::util; use rustc::lint; +use rustc::session::config::{self, ErrorOutputType, Input}; use rustc::session::early_error; -use rustc::session::config::{self, Input, ErrorOutputType}; use rustc::session::{DiagnosticOutput, Session}; +use rustc::ty; use rustc::util::common::ErrorReported; use rustc_codegen_utils::codegen_backend::CodegenBackend; -use rustc_data_structures::OnDrop; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::sync::Lrc; -use rustc_data_structures::fx::{FxHashSet, FxHashMap}; +use rustc_data_structures::OnDrop; use rustc_errors::registry::Registry; +use rustc_lint::LintStore; use rustc_parse::new_parser_from_source_str; -use rustc::ty; +use rustc_span::edition; +use rustc_span::source_map::{FileLoader, FileName, SourceMap}; use std::path::PathBuf; use std::result; use std::sync::{Arc, Mutex}; use syntax::ast::{self, MetaItemKind}; -use syntax::token; -use syntax::source_map::{FileName, FileLoader, SourceMap}; use syntax::sess::ParseSess; -use syntax_pos::edition; +use syntax::token; pub type Result = result::Result; /// Represents a compiler session. -/// Can be used run `rustc_interface` queries. +/// Can be used to run `rustc_interface` queries. /// Created by passing `Config` to `run_compiler`. pub struct Compiler { pub(crate) sess: Lrc, @@ -36,7 +37,7 @@ pub struct Compiler { pub(crate) output_dir: Option, pub(crate) output_file: Option, pub(crate) crate_name: Option, - pub(crate) register_lints: Option>, + pub(crate) register_lints: Option>, pub(crate) override_queries: Option, &mut ty::query::Providers<'_>)>, } @@ -65,43 +66,48 @@ impl Compiler { /// Converts strings provided as `--cfg [cfgspec]` into a `crate_cfg`. pub fn parse_cfgspecs(cfgspecs: Vec) -> FxHashSet<(String, Option)> { syntax::with_default_globals(move || { - let cfg = cfgspecs.into_iter().map(|s| { - let sess = ParseSess::with_silent_emitter(); - let filename = FileName::cfg_spec_source_code(&s); - let mut parser = new_parser_from_source_str(&sess, filename, s.to_string()); - - macro_rules! error {($reason: expr) => { - early_error(ErrorOutputType::default(), - &format!(concat!("invalid `--cfg` argument: `{}` (", $reason, ")"), s)); - }} - - match &mut parser.parse_meta_item() { - Ok(meta_item) if parser.token == token::Eof => { - if meta_item.path.segments.len() != 1 { - error!("argument key must be an identifier"); - } - match &meta_item.kind { - MetaItemKind::List(..) => { - error!(r#"expected `key` or `key="value"`"#); - } - MetaItemKind::NameValue(lit) if !lit.kind.is_str() => { - error!("argument value must be a string"); + let cfg = cfgspecs + .into_iter() + .map(|s| { + let sess = ParseSess::with_silent_emitter(); + let filename = FileName::cfg_spec_source_code(&s); + let mut parser = new_parser_from_source_str(&sess, filename, s.to_string()); + + macro_rules! error { + ($reason: expr) => { + early_error( + ErrorOutputType::default(), + &format!(concat!("invalid `--cfg` argument: `{}` (", $reason, ")"), s), + ); + }; + } + + match &mut parser.parse_meta_item() { + Ok(meta_item) if parser.token == token::Eof => { + if meta_item.path.segments.len() != 1 { + error!("argument key must be an identifier"); } - MetaItemKind::NameValue(..) | MetaItemKind::Word => { - let ident = meta_item.ident().expect("multi-segment cfg key"); - return (ident.name, meta_item.value_str()); + match &meta_item.kind { + MetaItemKind::List(..) => { + error!(r#"expected `key` or `key="value"`"#); + } + MetaItemKind::NameValue(lit) if !lit.kind.is_str() => { + error!("argument value must be a string"); + } + MetaItemKind::NameValue(..) | MetaItemKind::Word => { + let ident = meta_item.ident().expect("multi-segment cfg key"); + return (ident.name, meta_item.value_str()); + } } } + Ok(..) => {} + Err(err) => err.cancel(), } - Ok(..) => {} - Err(err) => err.cancel(), - } - - error!(r#"expected `key` or `key="value"`"#); - }).collect::(); - cfg.into_iter().map(|(a, b)| { - (a.to_string(), b.map(|b| b.to_string())) - }).collect() + + error!(r#"expected `key` or `key="value"`"#); + }) + .collect::(); + cfg.into_iter().map(|(a, b)| (a.to_string(), b.map(|b| b.to_string()))).collect() }) } @@ -131,7 +137,7 @@ pub struct Config { /// /// Note that if you find a Some here you probably want to call that function in the new /// function being registered. - pub register_lints: Option>, + pub register_lints: Option>, /// This is a callback from the driver that is called just after we have populated /// the list of queries. @@ -172,11 +178,17 @@ pub fn run_compiler_in_existing_thread_pool( override_queries: config.override_queries, }; - let _sess_abort_error = OnDrop(|| { - compiler.sess.diagnostic().print_error_count(registry); - }); + let r = { + let _sess_abort_error = OnDrop(|| { + compiler.sess.diagnostic().print_error_count(registry); + }); + + f(&compiler) + }; - f(&compiler) + let prof = compiler.sess.prof.clone(); + prof.generic_activity("drop_compiler").run(move || drop(compiler)); + r } pub fn run_compiler(mut config: Config, f: impl FnOnce(&Compiler) -> R + Send) -> R { diff --git a/src/librustc_interface/lib.rs b/src/librustc_interface/lib.rs index 9bb1878817..e4e6849ab8 100644 --- a/src/librustc_interface/lib.rs +++ b/src/librustc_interface/lib.rs @@ -6,17 +6,17 @@ #![feature(generator_trait)] #![feature(generators)] #![cfg_attr(unix, feature(libc))] - -#![recursion_limit="256"] +#![recursion_limit = "256"] #[cfg(unix)] extern crate libc; +mod callbacks; pub mod interface; mod passes; +mod proc_macro_decls; mod queries; pub mod util; -mod proc_macro_decls; pub use interface::{run_compiler, Config}; pub use queries::Queries; diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index 2a4bc41f85..d62c7539d5 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -1,89 +1,78 @@ use crate::interface::{Compiler, Result}; -use crate::util; use crate::proc_macro_decls; +use crate::util; -use log::{info, warn, log_enabled}; +use log::{info, log_enabled, warn}; use rustc::arena::Arena; use rustc::dep_graph::DepGraph; -use rustc::hir; -use rustc::hir::lowering::lower_crate; -use rustc::hir::def_id::{CrateNum, LOCAL_CRATE}; +use rustc::hir::map; use rustc::lint; -use rustc::middle::{self, reachable, resolve_lifetime, stability}; +use rustc::middle; use rustc::middle::cstore::{CrateStore, MetadataLoader, MetadataLoaderDyn}; -use rustc::ty::{self, AllArenas, ResolverOutputs, TyCtxt, GlobalCtxt}; -use rustc::ty::steal::Steal; -use rustc::traits; -use rustc::util::common::{time, ErrorReported}; -use rustc::session::Session; use rustc::session::config::{self, CrateType, Input, OutputFilenames, OutputType}; use rustc::session::config::{PpMode, PpSourceMode}; use rustc::session::search_paths::PathKind; +use rustc::session::Session; +use rustc::traits; +use rustc::ty::steal::Steal; +use rustc::ty::{self, GlobalCtxt, ResolverOutputs, TyCtxt}; +use rustc::util::common::ErrorReported; +use rustc_builtin_macros; use rustc_codegen_ssa::back::link::emit_metadata; use rustc_codegen_utils::codegen_backend::CodegenBackend; use rustc_codegen_utils::link::filename_for_metadata; +use rustc_data_structures::sync::{par_iter, Lrc, Once, ParallelIterator, WorkerLocal}; use rustc_data_structures::{box_region_allow_access, declare_box_region_type, parallel}; -use rustc_data_structures::sync::{Lrc, Once, ParallelIterator, par_iter, WorkerLocal}; use rustc_errors::PResult; +use rustc_expand::base::ExtCtxt; +use rustc_hir::def_id::{CrateNum, LOCAL_CRATE}; use rustc_incremental; +use rustc_lint::LintStore; use rustc_mir as mir; +use rustc_mir_build as mir_build; use rustc_parse::{parse_crate_from_file, parse_crate_from_source_str}; -use rustc_passes::{self, ast_validation, hir_stats, layout_test}; +use rustc_passes::{self, hir_stats, layout_test}; use rustc_plugin_impl as plugin; use rustc_privacy; use rustc_resolve::{Resolver, ResolverArenas}; +use rustc_span::symbol::Symbol; +use rustc_span::FileName; use rustc_traits; use rustc_typeck as typeck; -use syntax::{self, ast, visit}; -use syntax::early_buffered_lints::BufferedEarlyLint; -use syntax_expand::base::ExtCtxt; use syntax::mut_visit::MutVisitor; use syntax::util::node_count::NodeCounter; -use syntax::symbol::Symbol; -use syntax_pos::FileName; -use syntax_ext; +use syntax::{self, ast, visit}; use rustc_serialize::json; use tempfile::Builder as TempFileBuilder; -use std::{env, fs, iter, mem}; use std::any::Any; +use std::cell::RefCell; use std::ffi::OsString; use std::io::{self, Write}; use std::path::PathBuf; -use std::cell::RefCell; use std::rc::Rc; +use std::{env, fs, iter, mem}; pub fn parse<'a>(sess: &'a Session, input: &Input) -> PResult<'a, ast::Crate> { - sess.diagnostic() - .set_continue_after_error(sess.opts.debugging_opts.continue_parse_after_error); - let krate = time(sess, "parsing", || { - let _prof_timer = sess.prof.generic_activity("parse_crate"); - - match input { - Input::File(file) => parse_crate_from_file(file, &sess.parse_sess), - Input::Str { input, name } => { - parse_crate_from_source_str(name.clone(), input.clone(), &sess.parse_sess) - } + let krate = sess.time("parse_crate", || match input { + Input::File(file) => parse_crate_from_file(file, &sess.parse_sess), + Input::Str { input, name } => { + parse_crate_from_source_str(name.clone(), input.clone(), &sess.parse_sess) } })?; - sess.diagnostic().set_continue_after_error(true); - if sess.opts.debugging_opts.ast_json_noexpand { println!("{}", json::as_json(&krate)); } if sess.opts.debugging_opts.input_stats { - println!( - "Lines of code: {}", - sess.source_map().count_lines() - ); + println!("Lines of code: {}", sess.source_map().count_lines()); println!("Pre-expansion node count: {}", count_nodes(&krate)); } if let Some(ref s) = sess.opts.debugging_opts.show_span { - syntax::show_span::run(sess.diagnostic(), s, &krate); + rustc_ast_passes::show_span::run(sess.diagnostic(), s, &krate); } if sess.opts.debugging_opts.hir_stats { @@ -113,7 +102,7 @@ declare_box_region_type!( /// Returns `None` if we're aborting after handling -W help. pub fn configure_and_expand( sess: Lrc, - lint_store: Lrc, + lint_store: Lrc, metadata_loader: Box, krate: ast::Crate, crate_name: &str, @@ -163,17 +152,19 @@ impl BoxedResolver { pub fn register_plugins<'a>( sess: &'a Session, metadata_loader: &'a dyn MetadataLoader, - register_lints: impl Fn(&Session, &mut lint::LintStore), + register_lints: impl Fn(&Session, &mut LintStore), mut krate: ast::Crate, crate_name: &str, -) -> Result<(ast::Crate, Lrc)> { - krate = time(sess, "attributes injection", || { - syntax_ext::cmdline_attrs::inject( - krate, &sess.parse_sess, &sess.opts.debugging_opts.crate_attr +) -> Result<(ast::Crate, Lrc)> { + krate = sess.time("attributes_injection", || { + rustc_builtin_macros::cmdline_attrs::inject( + krate, + &sess.parse_sess, + &sess.opts.debugging_opts.crate_attr, ) }); - let (krate, features) = syntax_expand::config::features( + let (krate, features) = rustc_expand::config::features( krate, &sess.parse_sess, sess.edition(), @@ -190,9 +181,7 @@ pub fn register_plugins<'a>( rustc_incremental::prepare_session_directory(sess, &crate_name, disambiguator); if sess.opts.incremental.is_some() { - time(sess, "garbage-collect incremental cache directory", || { - let _prof_timer = - sess.prof.generic_activity("incr_comp_garbage_collect_session_directories"); + sess.time("incr_comp_garbage_collect_session_directories", || { if let Err(e) = rustc_incremental::garbage_collect_session_directories(sess) { warn!( "Error while trying to garbage collect incremental \ @@ -203,7 +192,7 @@ pub fn register_plugins<'a>( }); } - time(sess, "recursion limit", || { + sess.time("recursion_limit", || { middle::recursion_limit::update_limits(sess, &krate); }); @@ -213,10 +202,9 @@ pub fn register_plugins<'a>( ); register_lints(&sess, &mut lint_store); - let registrars = time(sess, "plugin loading", || { - plugin::load::load_plugins(sess, metadata_loader, &krate) - }); - time(sess, "plugin registration", || { + let registrars = + sess.time("plugin_loading", || plugin::load::load_plugins(sess, metadata_loader, &krate)); + sess.time("plugin_registration", || { let mut registry = plugin::Registry { lint_store: &mut lint_store }; for registrar in registrars { registrar(&mut registry); @@ -228,34 +216,29 @@ pub fn register_plugins<'a>( fn configure_and_expand_inner<'a>( sess: &'a Session, - lint_store: &'a lint::LintStore, + lint_store: &'a LintStore, mut krate: ast::Crate, crate_name: &str, resolver_arenas: &'a ResolverArenas<'a>, metadata_loader: &'a MetadataLoaderDyn, ) -> Result<(ast::Crate, Resolver<'a>)> { - time(sess, "pre-AST-expansion lint checks", || { - lint::check_ast_crate( + sess.time("pre_AST_expansion_lint_checks", || { + rustc_lint::check_ast_crate( sess, lint_store, &krate, true, None, - rustc_lint::BuiltinCombinedPreExpansionLintPass::new()); + rustc_lint::BuiltinCombinedPreExpansionLintPass::new(), + ); }); - let mut resolver = Resolver::new( - sess, - &krate, - crate_name, - metadata_loader, - &resolver_arenas, - ); - syntax_ext::register_builtin_macros(&mut resolver, sess.edition()); + let mut resolver = Resolver::new(sess, &krate, crate_name, metadata_loader, &resolver_arenas); + rustc_builtin_macros::register_builtin_macros(&mut resolver, sess.edition()); - krate = time(sess, "crate injection", || { + krate = sess.time("crate_injection", || { let alt_std_name = sess.opts.alt_std_name.as_ref().map(|s| Symbol::intern(s)); - let (krate, name) = syntax_ext::standard_library_imports::inject( + let (krate, name) = rustc_builtin_macros::standard_library_imports::inject( krate, &mut resolver, &sess.parse_sess, @@ -270,8 +253,7 @@ fn configure_and_expand_inner<'a>( util::check_attr_crate_type(&krate.attrs, &mut resolver.lint_buffer()); // Expand all macros - krate = time(sess, "expansion", || { - let _prof_timer = sess.prof.generic_activity("macro_expand_crate"); + krate = sess.time("macro_expand_crate", || { // Windows dlls do not have rpaths, so they don't know how to find their // dependencies. It's up to us to tell the system where to find all the // dependent dlls. Note that this uses cfg!(windows) as opposed to @@ -297,42 +279,35 @@ fn configure_and_expand_inner<'a>( env::set_var( "PATH", &env::join_paths( - new_path - .iter() - .filter(|p| env::join_paths(iter::once(p)).is_ok()), - ).unwrap(), + new_path.iter().filter(|p| env::join_paths(iter::once(p)).is_ok()), + ) + .unwrap(), ); } // Create the config for macro expansion let features = sess.features_untracked(); - let cfg = syntax_expand::expand::ExpansionConfig { + let cfg = rustc_expand::expand::ExpansionConfig { features: Some(&features), recursion_limit: *sess.recursion_limit.get(), trace_mac: sess.opts.debugging_opts.trace_macros, should_test: sess.opts.test, - ..syntax_expand::expand::ExpansionConfig::default(crate_name.to_string()) + ..rustc_expand::expand::ExpansionConfig::default(crate_name.to_string()) }; let mut ecx = ExtCtxt::new(&sess.parse_sess, cfg, &mut resolver); // Expand macros now! - let krate = time(sess, "expand crate", || { - ecx.monotonic_expander().expand_crate(krate) - }); + let krate = sess.time("expand_crate", || ecx.monotonic_expander().expand_crate(krate)); // The rest is error reporting - time(sess, "check unused macros", || { + sess.time("check_unused_macros", || { ecx.check_unused_macros(); }); - let mut missing_fragment_specifiers: Vec<_> = ecx.parse_sess - .missing_fragment_specifiers - .borrow() - .iter() - .cloned() - .collect(); + let mut missing_fragment_specifiers: Vec<_> = + ecx.parse_sess.missing_fragment_specifiers.borrow().iter().cloned().collect(); missing_fragment_specifiers.sort(); for span in missing_fragment_specifiers { @@ -346,8 +321,8 @@ fn configure_and_expand_inner<'a>( krate }); - time(sess, "maybe building test harness", || { - syntax_ext::test_harness::inject( + sess.time("maybe_building_test_harness", || { + rustc_builtin_macros::test_harness::inject( &sess.parse_sess, &mut resolver, sess.opts.test, @@ -370,11 +345,10 @@ fn configure_and_expand_inner<'a>( util::ReplaceBodyWithLoop::new(&mut resolver).visit_crate(&mut krate); } - let has_proc_macro_decls = time(sess, "AST validation", || { - ast_validation::check_crate(sess, &krate, &mut resolver.lint_buffer()) + let has_proc_macro_decls = sess.time("AST_validation", || { + rustc_ast_passes::ast_validation::check_crate(sess, &krate, &mut resolver.lint_buffer()) }); - let crate_types = sess.crate_types.borrow(); let is_proc_macro_crate = crate_types.contains(&config::CrateType::ProcMacro); @@ -385,16 +359,18 @@ fn configure_and_expand_inner<'a>( // However, we do emit a warning, to let such users know that they should // start passing '--crate-type proc-macro' if has_proc_macro_decls && sess.opts.actually_rustdoc && !is_proc_macro_crate { - let mut msg = sess.diagnostic().struct_warn(&"Trying to document proc macro crate \ - without passing '--crate-type proc-macro to rustdoc"); + let mut msg = sess.diagnostic().struct_warn( + &"Trying to document proc macro crate \ + without passing '--crate-type proc-macro to rustdoc", + ); msg.warn("The generated documentation may be incorrect"); msg.emit() } else { - krate = time(sess, "maybe creating a macro crate", || { + krate = sess.time("maybe_create_a_macro_crate", || { let num_crate_types = crate_types.len(); let is_test_crate = sess.opts.test; - syntax_ext::proc_macro_harness::inject( + rustc_builtin_macros::proc_macro_harness::inject( &sess.parse_sess, &mut resolver, krate, @@ -421,13 +397,11 @@ fn configure_and_expand_inner<'a>( println!("{}", json::as_json(&krate)); } - time(sess, "name resolution", || { - resolver.resolve_crate(&krate); - }); + resolver.resolve_crate(&krate); // Needs to go *after* expansion to be able to check the results of macro expansion. - time(sess, "complete gated feature checking", || { - syntax::feature_gate::check_crate( + sess.time("complete_gated_feature_checking", || { + rustc_ast_passes::feature_gate::check_crate( &krate, &sess.parse_sess, &sess.features_untracked(), @@ -438,35 +412,40 @@ fn configure_and_expand_inner<'a>( // Add all buffered lints from the `ParseSess` to the `Session`. sess.parse_sess.buffered_lints.with_lock(|buffered_lints| { info!("{} parse sess buffered_lints", buffered_lints.len()); - for BufferedEarlyLint{id, span, msg, lint_id} in buffered_lints.drain(..) { - resolver.lint_buffer().buffer_lint(lint_id, id, span, &msg); + for early_lint in buffered_lints.drain(..) { + resolver.lint_buffer().add_early_lint(early_lint); } }); Ok((krate, resolver)) } -pub fn lower_to_hir( - sess: &Session, - lint_store: &lint::LintStore, - resolver: &mut Resolver<'_>, - dep_graph: &DepGraph, - krate: &ast::Crate, -) -> Result { +pub fn lower_to_hir<'res, 'tcx>( + sess: &'tcx Session, + lint_store: &LintStore, + resolver: &'res mut Resolver<'_>, + dep_graph: &'res DepGraph, + krate: &'res ast::Crate, + arena: &'tcx Arena<'tcx>, +) -> Result> { // Lower AST to HIR. - let hir_forest = time(sess, "lowering AST -> HIR", || { - let nt_to_tokenstream = rustc_parse::nt_to_tokenstream; - let hir_crate = lower_crate(sess, &dep_graph, &krate, resolver, nt_to_tokenstream); + let hir_crate = rustc_ast_lowering::lower_crate( + sess, + &dep_graph, + &krate, + resolver, + rustc_parse::nt_to_tokenstream, + arena, + ); - if sess.opts.debugging_opts.hir_stats { - hir_stats::print_hir_stats(&hir_crate); - } + if sess.opts.debugging_opts.hir_stats { + hir_stats::print_hir_stats(&hir_crate); + } - hir::map::Forest::new(hir_crate, &dep_graph) - }); + let hir_forest = map::Forest::new(hir_crate, &dep_graph); - time(sess, "early lint checks", || { - lint::check_ast_crate( + sess.time("early_lint_checks", || { + rustc_lint::check_ast_crate( sess, lint_store, &krate, @@ -478,7 +457,7 @@ pub fn lower_to_hir( // Discard hygiene data, which isn't required after lowering to HIR. if !sess.opts.debugging_opts.keep_hygiene_data { - syntax_pos::hygiene::clear_syntax_context_map(); + rustc_span::hygiene::clear_syntax_context_map(); } Ok(hir_forest) @@ -497,15 +476,17 @@ fn generated_output_paths( match *output_type { // If the filename has been overridden using `-o`, it will not be modified // by appending `.rlib`, `.exe`, etc., so we can skip this transformation. - OutputType::Exe if !exact_name => for crate_type in sess.crate_types.borrow().iter() { - let p = ::rustc_codegen_utils::link::filename_for_input( - sess, - *crate_type, - crate_name, - outputs, - ); - out_filenames.push(p); - }, + OutputType::Exe if !exact_name => { + for crate_type in sess.crate_types.borrow().iter() { + let p = ::rustc_codegen_utils::link::filename_for_input( + sess, + *crate_type, + crate_name, + outputs, + ); + out_filenames.push(p); + } + } OutputType::DepInfo if sess.opts.debugging_opts.dep_info_omit_d_target => { // Don't add the dep-info output when omitting it from dep-info targets } @@ -537,11 +518,7 @@ fn output_contains_path(output_paths: &[PathBuf], input_path: &PathBuf) -> bool return false; } let check = |output_path: &PathBuf| { - if output_path.canonicalize().ok() == input_path { - Some(()) - } else { - None - } + if output_path.canonicalize().ok() == input_path { Some(()) } else { None } }; check_output(output_paths, check).is_some() } @@ -572,7 +549,8 @@ fn write_out_deps( let result = (|| -> io::Result<()> { // Build a list of files used to compile the output and // write Makefile-compatible dependency rules - let mut files: Vec = sess.source_map() + let mut files: Vec = sess + .source_map() .files() .iter() .filter(|fmap| fmap.is_real_file()) @@ -614,17 +592,16 @@ fn write_out_deps( match result { Ok(_) => { if sess.opts.json_artifact_notifications { - sess.parse_sess.span_diagnostic + sess.parse_sess + .span_diagnostic .emit_artifact_notification(&deps_filename, "dep-info"); } - }, - Err(e) => { - sess.fatal(&format!( - "error writing dependencies to `{}`: {}", - deps_filename.display(), - e - )) } + Err(e) => sess.fatal(&format!( + "error writing dependencies to `{}`: {}", + deps_filename.display(), + e + )), } } @@ -633,24 +610,22 @@ pub fn prepare_outputs( compiler: &Compiler, krate: &ast::Crate, boxed_resolver: &Steal>>, - crate_name: &str + crate_name: &str, ) -> Result { + let _timer = sess.timer("prepare_outputs"); + // FIXME: rustdoc passes &[] instead of &krate.attrs here let outputs = util::build_output_filenames( &compiler.input, &compiler.output_dir, &compiler.output_file, &krate.attrs, - sess - ); - - let output_paths = generated_output_paths( sess, - &outputs, - compiler.output_file.is_some(), - &crate_name, ); + let output_paths = + generated_output_paths(sess, &outputs, compiler.output_file.is_some(), &crate_name); + // Ensure the source file isn't accidentally overwritten during compilation. if let Some(ref input_path) = compiler.input_path { if sess.opts.will_create_output_file() { @@ -695,21 +670,18 @@ pub fn default_provide(providers: &mut ty::query::Providers<'_>) { providers.analysis = analysis; proc_macro_decls::provide(providers); plugin::build::provide(providers); - hir::provide(providers); + rustc::hir::provide(providers); mir::provide(providers); - reachable::provide(providers); - resolve_lifetime::provide(providers); + mir_build::provide(providers); rustc_privacy::provide(providers); typeck::provide(providers); ty::provide(providers); traits::provide(providers); - stability::provide(providers); - reachable::provide(providers); rustc_passes::provide(providers); + rustc_resolve::provide(providers); rustc_traits::provide(providers); - middle::region::provide(providers); + rustc_ty::provide(providers); rustc_metadata::provide(providers); - lint::provide(providers); rustc_lint::provide(providers); rustc_codegen_utils::provide(providers); rustc_codegen_ssa::provide(providers); @@ -737,26 +709,21 @@ impl<'tcx> QueryContext<'tcx> { pub fn create_global_ctxt<'tcx>( compiler: &'tcx Compiler, - lint_store: Lrc, - hir_forest: &'tcx hir::map::Forest, + lint_store: Lrc, + hir_forest: &'tcx map::Forest<'tcx>, mut resolver_outputs: ResolverOutputs, outputs: OutputFilenames, crate_name: &str, global_ctxt: &'tcx Once>, - all_arenas: &'tcx AllArenas, arena: &'tcx WorkerLocal>, ) -> QueryContext<'tcx> { let sess = &compiler.session(); let defs = mem::take(&mut resolver_outputs.definitions); // Construct the HIR map. - let hir_map = time(sess, "indexing HIR", || { - hir::map::map_crate(sess, &*resolver_outputs.cstore, &hir_forest, defs) - }); + let hir_map = map::map_crate(sess, &*resolver_outputs.cstore, &hir_forest, defs); - let query_result_on_disk_cache = time(sess, "load query result cache", || { - rustc_incremental::load_query_result_cache(sess) - }); + let query_result_on_disk_cache = rustc_incremental::load_query_result_cache(sess); let codegen_backend = compiler.codegen_backend(); let mut local_providers = ty::query::Providers::default(); @@ -771,23 +738,26 @@ pub fn create_global_ctxt<'tcx>( callback(sess, &mut local_providers, &mut extern_providers); } - let gcx = global_ctxt.init_locking(|| TyCtxt::create_global_ctxt( - sess, - lint_store, - local_providers, - extern_providers, - &all_arenas, - arena, - resolver_outputs, - hir_map, - query_result_on_disk_cache, - &crate_name, - &outputs - )); + let gcx = sess.time("setup_global_ctxt", || { + global_ctxt.init_locking(|| { + TyCtxt::create_global_ctxt( + sess, + lint_store, + local_providers, + extern_providers, + arena, + resolver_outputs, + hir_map, + query_result_on_disk_cache, + &crate_name, + &outputs, + ) + }) + }); // Do some initialization of the DepGraph that can only be done with the tcx available. ty::tls::enter_global(&gcx, |tcx| { - time(tcx.sess, "dep graph tcx init", || rustc_incremental::dep_graph_tcx_init(tcx)); + tcx.sess.time("dep_graph_tcx_init", || rustc_incremental::dep_graph_tcx_init(tcx)); }); QueryContext(gcx) @@ -801,71 +771,74 @@ fn analysis(tcx: TyCtxt<'_>, cnum: CrateNum) -> Result<()> { let sess = tcx.sess; let mut entry_point = None; - time(sess, "misc checking 1", || { - parallel!({ - entry_point = time(sess, "looking for entry point", || { - rustc_passes::entry::find_entry_point(tcx) - }); + sess.time("misc_checking_1", || { + parallel!( + { + entry_point = sess + .time("looking_for_entry_point", || rustc_passes::entry::find_entry_point(tcx)); - time(sess, "looking for plugin registrar", || { - plugin::build::find_plugin_registrar(tcx) - }); + sess.time("looking_for_plugin_registrar", || { + plugin::build::find_plugin_registrar(tcx) + }); - time(sess, "looking for derive registrar", || { - proc_macro_decls::find(tcx) - }); - }, { - par_iter(&tcx.hir().krate().modules).for_each(|(&module, _)| { - let local_def_id = tcx.hir().local_def_id(module); - tcx.ensure().check_mod_loops(local_def_id); - tcx.ensure().check_mod_attrs(local_def_id); - tcx.ensure().check_mod_unstable_api_usage(local_def_id); - tcx.ensure().check_mod_const_bodies(local_def_id); - }); - }); + sess.time("looking_for_derive_registrar", || proc_macro_decls::find(tcx)); + }, + { + par_iter(&tcx.hir().krate().modules).for_each(|(&module, _)| { + let local_def_id = tcx.hir().local_def_id(module); + tcx.ensure().check_mod_loops(local_def_id); + tcx.ensure().check_mod_attrs(local_def_id); + tcx.ensure().check_mod_unstable_api_usage(local_def_id); + tcx.ensure().check_mod_const_bodies(local_def_id); + }); + } + ); }); // passes are timed inside typeck typeck::check_crate(tcx)?; - time(sess, "misc checking 2", || { - parallel!({ - time(sess, "match checking", || { - tcx.par_body_owners(|def_id| { - tcx.ensure().check_match(def_id); + sess.time("misc_checking_2", || { + parallel!( + { + sess.time("match_checking", || { + tcx.par_body_owners(|def_id| { + tcx.ensure().check_match(def_id); + }); }); - }); - }, { - time(sess, "liveness checking + intrinsic checking", || { - par_iter(&tcx.hir().krate().modules).for_each(|(&module, _)| { - // this must run before MIR dump, because - // "not all control paths return a value" is reported here. - // - // maybe move the check to a MIR pass? - let local_def_id = tcx.hir().local_def_id(module); - - tcx.ensure().check_mod_liveness(local_def_id); - tcx.ensure().check_mod_intrinsics(local_def_id); + }, + { + sess.time("liveness_and_intrinsic_checking", || { + par_iter(&tcx.hir().krate().modules).for_each(|(&module, _)| { + // this must run before MIR dump, because + // "not all control paths return a value" is reported here. + // + // maybe move the check to a MIR pass? + let local_def_id = tcx.hir().local_def_id(module); + + tcx.ensure().check_mod_liveness(local_def_id); + tcx.ensure().check_mod_intrinsics(local_def_id); + }); }); - }); - }); + } + ); }); - time(sess, "MIR borrow checking", || { + sess.time("MIR_borrow_checking", || { tcx.par_body_owners(|def_id| tcx.ensure().mir_borrowck(def_id)); }); - time(sess, "dumping Chalk-like clauses", || { + sess.time("dumping_chalk_like_clauses", || { rustc_traits::lowering::dump_program_clauses(tcx); }); - time(sess, "MIR effect checking", || { + sess.time("MIR_effect_checking", || { for def_id in tcx.body_owners() { mir::transform::check_unsafety::check_unsafety(tcx, def_id) } }); - time(sess, "layout testing", || layout_test::test_layout(tcx)); + sess.time("layout_testing", || layout_test::test_layout(tcx)); // Avoid overwhelming user with errors if borrow checking failed. // I'm not sure how helpful this is, to be honest, but it avoids a @@ -876,33 +849,40 @@ fn analysis(tcx: TyCtxt<'_>, cnum: CrateNum) -> Result<()> { return Err(ErrorReported); } - time(sess, "misc checking 3", || { - parallel!({ - time(sess, "privacy access levels", || { + sess.time("misc_checking_3", || { + parallel!( + { tcx.ensure().privacy_access_levels(LOCAL_CRATE); - }); - parallel!({ - time(sess, "private in public", || { - tcx.ensure().check_private_in_public(LOCAL_CRATE); - }); - }, { - time(sess, "death checking", || rustc_passes::dead::check_crate(tcx)); - }, { - time(sess, "unused lib feature checking", || { - stability::check_unused_or_stable_features(tcx) - }); - }, { - time(sess, "lint checking", || { - lint::check_crate(tcx, || rustc_lint::BuiltinCombinedLateLintPass::new()); - }); - }); - }, { - time(sess, "privacy checking modules", || { - par_iter(&tcx.hir().krate().modules).for_each(|(&module, _)| { - tcx.ensure().check_mod_privacy(tcx.hir().local_def_id(module)); + + parallel!( + { + tcx.ensure().check_private_in_public(LOCAL_CRATE); + }, + { + sess.time("death_checking", || rustc_passes::dead::check_crate(tcx)); + }, + { + sess.time("unused_lib_feature_checking", || { + rustc_passes::stability::check_unused_or_stable_features(tcx) + }); + }, + { + sess.time("lint_checking", || { + rustc_lint::check_crate(tcx, || { + rustc_lint::BuiltinCombinedLateLintPass::new() + }); + }); + } + ); + }, + { + sess.time("privacy_checking_modules", || { + par_iter(&tcx.hir().krate().modules).for_each(|(&module, _)| { + tcx.ensure().check_mod_privacy(tcx.hir().local_def_id(module)); + }); }); - }); - }); + } + ); }); Ok(()) @@ -916,28 +896,31 @@ fn encode_and_write_metadata( enum MetadataKind { None, Uncompressed, - Compressed + Compressed, } - let metadata_kind = tcx.sess.crate_types.borrow().iter().map(|ty| { - match *ty { - CrateType::Executable | - CrateType::Staticlib | - CrateType::Cdylib => MetadataKind::None, + let metadata_kind = tcx + .sess + .crate_types + .borrow() + .iter() + .map(|ty| match *ty { + CrateType::Executable | CrateType::Staticlib | CrateType::Cdylib => MetadataKind::None, CrateType::Rlib => MetadataKind::Uncompressed, - CrateType::Dylib | - CrateType::ProcMacro => MetadataKind::Compressed, - } - }).max().unwrap_or(MetadataKind::None); + CrateType::Dylib | CrateType::ProcMacro => MetadataKind::Compressed, + }) + .max() + .unwrap_or(MetadataKind::None); let metadata = match metadata_kind { MetadataKind::None => middle::cstore::EncodedMetadata::new(), - MetadataKind::Uncompressed | - MetadataKind::Compressed => tcx.encode_metadata(), + MetadataKind::Uncompressed | MetadataKind::Compressed => tcx.encode_metadata(), }; + let _prof_timer = tcx.sess.prof.generic_activity("write_crate_metadata"); + let need_metadata_file = tcx.sess.opts.output_types.contains_key(&OutputType::Metadata); if need_metadata_file { let crate_name = &tcx.crate_name(LOCAL_CRATE).as_str(); @@ -950,15 +933,15 @@ fn encode_and_write_metadata( let metadata_tmpdir = TempFileBuilder::new() .prefix("rmeta") .tempdir_in(out_filename.parent().unwrap()) - .unwrap_or_else(|err| { - tcx.sess.fatal(&format!("couldn't create a temp dir: {}", err)) - }); + .unwrap_or_else(|err| tcx.sess.fatal(&format!("couldn't create a temp dir: {}", err))); let metadata_filename = emit_metadata(tcx.sess, &metadata, &metadata_tmpdir); if let Err(e) = fs::rename(&metadata_filename, &out_filename) { tcx.sess.fatal(&format!("failed to write {}: {}", out_filename.display(), e)); } if tcx.sess.opts.json_artifact_notifications { - tcx.sess.parse_sess.span_diagnostic + tcx.sess + .parse_sess + .span_diagnostic .emit_artifact_notification(&out_filename, "metadata"); } } @@ -980,12 +963,9 @@ pub fn start_codegen<'tcx>( tcx.print_debug_stats(); } - let (metadata, need_metadata_module) = time(tcx.sess, "metadata encoding and writing", || { - encode_and_write_metadata(tcx, outputs) - }); + let (metadata, need_metadata_module) = encode_and_write_metadata(tcx, outputs); - let codegen = time(tcx.sess, "codegen", move || { - let _prof_timer = tcx.prof.generic_activity("codegen_crate"); + let codegen = tcx.sess.time("codegen_crate", move || { codegen_backend.codegen_crate(tcx, metadata, need_metadata_module) }); diff --git a/src/librustc_interface/proc_macro_decls.rs b/src/librustc_interface/proc_macro_decls.rs index 56180bcad0..9238f88b2b 100644 --- a/src/librustc_interface/proc_macro_decls.rs +++ b/src/librustc_interface/proc_macro_decls.rs @@ -1,10 +1,10 @@ -use rustc::hir::itemlikevisit::ItemLikeVisitor; -use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; -use rustc::hir; -use rustc::ty::TyCtxt; use rustc::ty::query::Providers; +use rustc::ty::TyCtxt; +use rustc_hir as hir; +use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; +use rustc_hir::itemlikevisit::ItemLikeVisitor; +use rustc_span::symbol::sym; use syntax::attr; -use syntax::symbol::sym; pub fn find(tcx: TyCtxt<'_>) -> Option { tcx.proc_macro_decls_static(LOCAL_CRATE) @@ -24,22 +24,17 @@ struct Finder { } impl<'v> ItemLikeVisitor<'v> for Finder { - fn visit_item(&mut self, item: &hir::Item) { + fn visit_item(&mut self, item: &hir::Item<'_>) { if attr::contains_name(&item.attrs, sym::rustc_proc_macro_decls) { self.decls = Some(item.hir_id); } } - fn visit_trait_item(&mut self, _trait_item: &hir::TraitItem) { - } + fn visit_trait_item(&mut self, _trait_item: &hir::TraitItem<'_>) {} - fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem) { - } + fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem<'_>) {} } pub(crate) fn provide(providers: &mut Providers<'_>) { - *providers = Providers { - proc_macro_decls_static, - ..*providers - }; + *providers = Providers { proc_macro_decls_static, ..*providers }; } diff --git a/src/librustc_interface/queries.rs b/src/librustc_interface/queries.rs index e429b4d101..0af9b17a29 100644 --- a/src/librustc_interface/queries.rs +++ b/src/librustc_interface/queries.rs @@ -1,24 +1,23 @@ use crate::interface::{Compiler, Result}; use crate::passes::{self, BoxedResolver, QueryContext}; -use rustc_incremental::DepGraphFuture; -use rustc_data_structures::sync::{Lrc, Once, WorkerLocal}; -use rustc_codegen_utils::codegen_backend::CodegenBackend; -use rustc::session::config::{OutputFilenames, OutputType}; -use rustc::util::common::{time, ErrorReported}; use rustc::arena::Arena; -use rustc::hir; -use rustc::lint; +use rustc::dep_graph::DepGraph; +use rustc::hir::map; +use rustc::session::config::{OutputFilenames, OutputType}; use rustc::session::Session; -use rustc::lint::LintStore; -use rustc::hir::def_id::LOCAL_CRATE; use rustc::ty::steal::Steal; -use rustc::ty::{AllArenas, ResolverOutputs, GlobalCtxt}; -use rustc::dep_graph::DepGraph; -use std::cell::{Ref, RefMut, RefCell}; -use std::rc::Rc; +use rustc::ty::{GlobalCtxt, ResolverOutputs}; +use rustc::util::common::ErrorReported; +use rustc_codegen_utils::codegen_backend::CodegenBackend; +use rustc_data_structures::sync::{Lrc, Once, WorkerLocal}; +use rustc_hir::def_id::LOCAL_CRATE; +use rustc_incremental::DepGraphFuture; +use rustc_lint::LintStore; use std::any::Any; +use std::cell::{Ref, RefCell, RefMut}; use std::mem; +use std::rc::Rc; use syntax::{self, ast}; /// Represent the result of a query. @@ -39,11 +38,7 @@ impl Query { /// Takes ownership of the query result. Further attempts to take or peek the query /// result will panic unless it is generated by calling the `compute` method. pub fn take(&self) -> T { - self.result - .borrow_mut() - .take() - .expect("missing query result") - .unwrap() + self.result.borrow_mut().take().expect("missing query result").unwrap() } /// Borrows the query result using the RefCell. Panics if the result is stolen. @@ -63,9 +58,7 @@ impl Query { impl Default for Query { fn default() -> Self { - Query { - result: RefCell::new(None), - } + Query { result: RefCell::new(None) } } } @@ -73,7 +66,6 @@ pub struct Queries<'tcx> { compiler: &'tcx Compiler, gcx: Once>, - all_arenas: AllArenas, arena: WorkerLocal>, dep_graph_future: Query>, @@ -82,7 +74,7 @@ pub struct Queries<'tcx> { register_plugins: Query<(ast::Crate, Lrc)>, expansion: Query<(ast::Crate, Steal>>, Lrc)>, dep_graph: Query, - lower_to_hir: Query<(&'tcx hir::map::Forest, Steal)>, + lower_to_hir: Query<(&'tcx map::Forest<'tcx>, Steal)>, prepare_outputs: Query, global_ctxt: Query>, ongoing_codegen: Query>, @@ -93,7 +85,6 @@ impl<'tcx> Queries<'tcx> { Queries { compiler, gcx: Once::new(), - all_arenas: AllArenas::new(), arena: WorkerLocal::new(|_| Arena::default()), dep_graph_future: Default::default(), parse: Default::default(), @@ -117,20 +108,20 @@ impl<'tcx> Queries<'tcx> { pub fn dep_graph_future(&self) -> Result<&Query>> { self.dep_graph_future.compute(|| { - Ok(self.session().opts.build_dep_graph().then(|| { - rustc_incremental::load_dep_graph(self.session()) - })) + Ok(self + .session() + .opts + .build_dep_graph() + .then(|| rustc_incremental::load_dep_graph(self.session()))) }) } pub fn parse(&self) -> Result<&Query> { self.parse.compute(|| { - passes::parse(self.session(), &self.compiler.input).map_err( - |mut parse_error| { - parse_error.emit(); - ErrorReported - }, - ) + passes::parse(self.session(), &self.compiler.input).map_err(|mut parse_error| { + parse_error.emit(); + ErrorReported + }) }) } @@ -139,14 +130,11 @@ impl<'tcx> Queries<'tcx> { let crate_name = self.crate_name()?.peek().clone(); let krate = self.parse()?.take(); - let empty: &(dyn Fn(&Session, &mut lint::LintStore) + Sync + Send) = &|_, _| {}; + let empty: &(dyn Fn(&Session, &mut LintStore) + Sync + Send) = &|_, _| {}; let result = passes::register_plugins( self.session(), &*self.codegen_backend().metadata_loader(), - self.compiler.register_lints - .as_ref() - .map(|p| &**p) - .unwrap_or_else(|| empty), + self.compiler.register_lints.as_ref().map(|p| &**p).unwrap_or_else(|| empty), krate, &crate_name, ); @@ -172,7 +160,7 @@ impl<'tcx> Queries<'tcx> { rustc_codegen_utils::link::find_crate_name( Some(self.session()), &krate.attrs, - &self.compiler.input + &self.compiler.input, ) } }) @@ -180,18 +168,20 @@ impl<'tcx> Queries<'tcx> { } pub fn expansion( - &self + &self, ) -> Result<&Query<(ast::Crate, Steal>>, Lrc)>> { self.expansion.compute(|| { let crate_name = self.crate_name()?.peek().clone(); let (krate, lint_store) = self.register_plugins()?.take(); + let _timer = self.session().timer("configure_and_expand"); passes::configure_and_expand( self.session().clone(), lint_store.clone(), self.codegen_backend().metadata_loader(), krate, &crate_name, - ).map(|(krate, resolver)| { + ) + .map(|(krate, resolver)| { (krate, Steal::new(Rc::new(RefCell::new(resolver))), lint_store) }) }) @@ -203,10 +193,13 @@ impl<'tcx> Queries<'tcx> { None => DepGraph::new_disabled(), Some(future) => { let (prev_graph, prev_work_products) = - time(self.session(), "blocked while dep-graph loading finishes", || { - future.open().unwrap_or_else(|e| rustc_incremental::LoadResult::Error { - message: format!("could not decode incremental cache: {:?}", e), - }).open(self.session()) + self.session().time("blocked_on_dep_graph_loading", || { + future + .open() + .unwrap_or_else(|e| rustc_incremental::LoadResult::Error { + message: format!("could not decode incremental cache: {:?}", e), + }) + .open(self.session()) }); DepGraph::new(prev_graph, prev_work_products) } @@ -216,7 +209,7 @@ impl<'tcx> Queries<'tcx> { pub fn lower_to_hir( &'tcx self, - ) -> Result<&Query<(&'tcx hir::map::Forest, Steal)>> { + ) -> Result<&Query<(&'tcx map::Forest<'tcx>, Steal)>> { self.lower_to_hir.compute(|| { let expansion_result = self.expansion()?; let peeked = expansion_result.peek(); @@ -229,7 +222,8 @@ impl<'tcx> Queries<'tcx> { lint_store, resolver, &*self.dep_graph()?.peek(), - &krate + &krate, + &self.arena, ) })?; let hir = self.arena.alloc(hir); @@ -244,7 +238,11 @@ impl<'tcx> Queries<'tcx> { let crate_name = self.crate_name()?; let crate_name = crate_name.peek(); passes::prepare_outputs( - self.session(), self.compiler, &krate, &boxed_resolver, &crate_name + self.session(), + self.compiler, + &krate, + &boxed_resolver, + &crate_name, ) }) } @@ -256,6 +254,7 @@ impl<'tcx> Queries<'tcx> { let lint_store = self.expansion()?.peek().2.clone(); let hir = self.lower_to_hir()?.peek(); let (ref hir_forest, ref resolver_outputs) = &*hir; + let _timer = self.session().timer("create_global_ctxt"); Ok(passes::create_global_ctxt( self.compiler, lint_store, @@ -264,7 +263,6 @@ impl<'tcx> Queries<'tcx> { outputs, &crate_name, &self.gcx, - &self.all_arenas, &self.arena, )) }) @@ -279,11 +277,7 @@ impl<'tcx> Queries<'tcx> { // Don't do code generation if there were any errors self.session().compile_status()?; - Ok(passes::start_codegen( - &***self.codegen_backend(), - tcx, - &*outputs.peek() - )) + Ok(passes::start_codegen(&***self.codegen_backend(), tcx, &*outputs.peek())) }) }) } @@ -316,19 +310,28 @@ pub struct Linker { impl Linker { pub fn link(self) -> Result<()> { - self.codegen_backend.join_codegen_and_link( - self.ongoing_codegen, - &self.sess, - &self.dep_graph, - &self.prepare_outputs, - ).map_err(|_| ErrorReported) + let r = self + .codegen_backend + .join_codegen_and_link( + self.ongoing_codegen, + &self.sess, + &self.dep_graph, + &self.prepare_outputs, + ) + .map_err(|_| ErrorReported); + let prof = self.sess.prof.clone(); + let dep_graph = self.dep_graph; + prof.generic_activity("drop_dep_graph").run(move || drop(dep_graph)); + r } } impl Compiler { pub fn enter(&self, f: F) -> T - where F: for<'tcx> FnOnce(&'tcx Queries<'tcx>) -> T + where + F: for<'tcx> FnOnce(&'tcx Queries<'tcx>) -> T, { + let mut _timer = None; let queries = Queries::new(&self); let ret = f(&queries); @@ -338,6 +341,8 @@ impl Compiler { } } + _timer = Some(self.session().timer("free_global_ctxt")); + ret } @@ -353,7 +358,7 @@ impl Compiler { if self.session().opts.output_types.contains_key(&OutputType::DepInfo) && self.session().opts.output_types.len() == 1 { - return Ok(None) + return Ok(None); } queries.global_ctxt()?; diff --git a/src/librustc_interface/tests.rs b/src/librustc_interface/tests.rs index d4b5e833df..ec75a1c6a3 100644 --- a/src/librustc_interface/tests.rs +++ b/src/librustc_interface/tests.rs @@ -2,23 +2,23 @@ extern crate getopts; use crate::interface::parse_cfgspecs; -use rustc::lint; +use rustc::lint::Level; use rustc::middle::cstore; use rustc::session::config::{build_configuration, build_session_options, to_crate_config}; -use rustc::session::config::{LtoCli, LinkerPluginLto, SwitchWithOptPath, ExternEntry}; +use rustc::session::config::{rustc_optgroups, ErrorOutputType, ExternLocation, Options, Passes}; +use rustc::session::config::{ExternEntry, LinkerPluginLto, LtoCli, SwitchWithOptPath}; use rustc::session::config::{Externs, OutputType, OutputTypes, SymbolManglingVersion}; -use rustc::session::config::{rustc_optgroups, Options, ErrorOutputType, Passes, ExternLocation}; -use rustc::session::{build_session, Session}; use rustc::session::search_paths::SearchPath; +use rustc::session::{build_session, Session}; +use rustc_data_structures::fx::FxHashSet; +use rustc_errors::{emitter::HumanReadableErrorType, registry, ColorConfig}; +use rustc_span::edition::{Edition, DEFAULT_EDITION}; +use rustc_span::symbol::sym; +use rustc_target::spec::{MergeFunctions, PanicStrategy, RelroLevel}; use std::collections::{BTreeMap, BTreeSet}; use std::iter::FromIterator; use std::path::PathBuf; -use rustc_target::spec::{MergeFunctions, PanicStrategy, RelroLevel}; -use syntax::symbol::sym; -use syntax::edition::{Edition, DEFAULT_EDITION}; use syntax; -use rustc_data_structures::fx::FxHashSet; -use rustc_errors::{ColorConfig, emitter::HumanReadableErrorType, registry}; type CfgSpecs = FxHashSet<(String, Option)>; @@ -40,8 +40,7 @@ where S: Into, I: IntoIterator, { - let locations: BTreeSet<_> = locations.into_iter().map(|s| s.into()) - .collect(); + let locations: BTreeSet<_> = locations.into_iter().map(|s| s.into()).collect(); ExternEntry { location: ExternLocation::ExactPaths(locations), @@ -95,9 +94,8 @@ fn test_can_print_warnings() { }); syntax::with_default_globals(|| { - let matches = optgroups() - .parse(&["-Awarnings".to_string(), "-Dwarnings".to_string()]) - .unwrap(); + let matches = + optgroups().parse(&["-Awarnings".to_string(), "-Dwarnings".to_string()]).unwrap(); let (sess, _) = mk_session(matches); assert!(sess.diagnostic().can_emit_warnings()); }); @@ -115,10 +113,8 @@ fn test_output_types_tracking_hash_different_paths() { let mut v2 = Options::default(); let mut v3 = Options::default(); - v1.output_types = - OutputTypes::new(&[(OutputType::Exe, Some(PathBuf::from("./some/thing")))]); - v2.output_types = - OutputTypes::new(&[(OutputType::Exe, Some(PathBuf::from("/some/thing")))]); + v1.output_types = OutputTypes::new(&[(OutputType::Exe, Some(PathBuf::from("./some/thing")))]); + v2.output_types = OutputTypes::new(&[(OutputType::Exe, Some(PathBuf::from("/some/thing")))]); v3.output_types = OutputTypes::new(&[(OutputType::Exe, None)]); assert!(v1.dep_tracking_hash() != v2.dep_tracking_hash()); @@ -159,36 +155,18 @@ fn test_externs_tracking_hash_different_construction_order() { let mut v3 = Options::default(); v1.externs = Externs::new(mk_map(vec![ - ( - String::from("a"), - new_public_extern_entry(vec!["b", "c"]) - ), - ( - String::from("d"), - new_public_extern_entry(vec!["e", "f"]) - ), + (String::from("a"), new_public_extern_entry(vec!["b", "c"])), + (String::from("d"), new_public_extern_entry(vec!["e", "f"])), ])); v2.externs = Externs::new(mk_map(vec![ - ( - String::from("d"), - new_public_extern_entry(vec!["e", "f"]) - ), - ( - String::from("a"), - new_public_extern_entry(vec!["b", "c"]) - ), + (String::from("d"), new_public_extern_entry(vec!["e", "f"])), + (String::from("a"), new_public_extern_entry(vec!["b", "c"])), ])); v3.externs = Externs::new(mk_map(vec![ - ( - String::from("a"), - new_public_extern_entry(vec!["b", "c"]) - ), - ( - String::from("d"), - new_public_extern_entry(vec!["f", "e"]) - ), + (String::from("a"), new_public_extern_entry(vec!["b", "c"])), + (String::from("d"), new_public_extern_entry(vec!["f", "e"])), ])); assert_eq!(v1.dep_tracking_hash(), v2.dep_tracking_hash()); @@ -208,24 +186,24 @@ fn test_lints_tracking_hash_different_values() { let mut v3 = Options::default(); v1.lint_opts = vec![ - (String::from("a"), lint::Allow), - (String::from("b"), lint::Warn), - (String::from("c"), lint::Deny), - (String::from("d"), lint::Forbid), + (String::from("a"), Level::Allow), + (String::from("b"), Level::Warn), + (String::from("c"), Level::Deny), + (String::from("d"), Level::Forbid), ]; v2.lint_opts = vec![ - (String::from("a"), lint::Allow), - (String::from("b"), lint::Warn), - (String::from("X"), lint::Deny), - (String::from("d"), lint::Forbid), + (String::from("a"), Level::Allow), + (String::from("b"), Level::Warn), + (String::from("X"), Level::Deny), + (String::from("d"), Level::Forbid), ]; v3.lint_opts = vec![ - (String::from("a"), lint::Allow), - (String::from("b"), lint::Warn), - (String::from("c"), lint::Forbid), - (String::from("d"), lint::Deny), + (String::from("a"), Level::Allow), + (String::from("b"), Level::Warn), + (String::from("c"), Level::Forbid), + (String::from("d"), Level::Deny), ]; assert!(v1.dep_tracking_hash() != v2.dep_tracking_hash()); @@ -244,17 +222,17 @@ fn test_lints_tracking_hash_different_construction_order() { let mut v2 = Options::default(); v1.lint_opts = vec![ - (String::from("a"), lint::Allow), - (String::from("b"), lint::Warn), - (String::from("c"), lint::Deny), - (String::from("d"), lint::Forbid), + (String::from("a"), Level::Allow), + (String::from("b"), Level::Warn), + (String::from("c"), Level::Deny), + (String::from("d"), Level::Forbid), ]; v2.lint_opts = vec![ - (String::from("a"), lint::Allow), - (String::from("c"), lint::Deny), - (String::from("b"), lint::Warn), - (String::from("d"), lint::Forbid), + (String::from("a"), Level::Allow), + (String::from("c"), Level::Deny), + (String::from("b"), Level::Warn), + (String::from("d"), Level::Forbid), ]; assert_eq!(v1.dep_tracking_hash(), v2.dep_tracking_hash()); @@ -277,49 +255,29 @@ fn test_search_paths_tracking_hash_different_order() { }; // Reference - v1.search_paths - .push(SearchPath::from_cli_opt("native=abc", JSON)); - v1.search_paths - .push(SearchPath::from_cli_opt("crate=def", JSON)); - v1.search_paths - .push(SearchPath::from_cli_opt("dependency=ghi", JSON)); - v1.search_paths - .push(SearchPath::from_cli_opt("framework=jkl", JSON)); - v1.search_paths - .push(SearchPath::from_cli_opt("all=mno", JSON)); - - v2.search_paths - .push(SearchPath::from_cli_opt("native=abc", JSON)); - v2.search_paths - .push(SearchPath::from_cli_opt("dependency=ghi", JSON)); - v2.search_paths - .push(SearchPath::from_cli_opt("crate=def", JSON)); - v2.search_paths - .push(SearchPath::from_cli_opt("framework=jkl", JSON)); - v2.search_paths - .push(SearchPath::from_cli_opt("all=mno", JSON)); - - v3.search_paths - .push(SearchPath::from_cli_opt("crate=def", JSON)); - v3.search_paths - .push(SearchPath::from_cli_opt("framework=jkl", JSON)); - v3.search_paths - .push(SearchPath::from_cli_opt("native=abc", JSON)); - v3.search_paths - .push(SearchPath::from_cli_opt("dependency=ghi", JSON)); - v3.search_paths - .push(SearchPath::from_cli_opt("all=mno", JSON)); - - v4.search_paths - .push(SearchPath::from_cli_opt("all=mno", JSON)); - v4.search_paths - .push(SearchPath::from_cli_opt("native=abc", JSON)); - v4.search_paths - .push(SearchPath::from_cli_opt("crate=def", JSON)); - v4.search_paths - .push(SearchPath::from_cli_opt("dependency=ghi", JSON)); - v4.search_paths - .push(SearchPath::from_cli_opt("framework=jkl", JSON)); + v1.search_paths.push(SearchPath::from_cli_opt("native=abc", JSON)); + v1.search_paths.push(SearchPath::from_cli_opt("crate=def", JSON)); + v1.search_paths.push(SearchPath::from_cli_opt("dependency=ghi", JSON)); + v1.search_paths.push(SearchPath::from_cli_opt("framework=jkl", JSON)); + v1.search_paths.push(SearchPath::from_cli_opt("all=mno", JSON)); + + v2.search_paths.push(SearchPath::from_cli_opt("native=abc", JSON)); + v2.search_paths.push(SearchPath::from_cli_opt("dependency=ghi", JSON)); + v2.search_paths.push(SearchPath::from_cli_opt("crate=def", JSON)); + v2.search_paths.push(SearchPath::from_cli_opt("framework=jkl", JSON)); + v2.search_paths.push(SearchPath::from_cli_opt("all=mno", JSON)); + + v3.search_paths.push(SearchPath::from_cli_opt("crate=def", JSON)); + v3.search_paths.push(SearchPath::from_cli_opt("framework=jkl", JSON)); + v3.search_paths.push(SearchPath::from_cli_opt("native=abc", JSON)); + v3.search_paths.push(SearchPath::from_cli_opt("dependency=ghi", JSON)); + v3.search_paths.push(SearchPath::from_cli_opt("all=mno", JSON)); + + v4.search_paths.push(SearchPath::from_cli_opt("all=mno", JSON)); + v4.search_paths.push(SearchPath::from_cli_opt("native=abc", JSON)); + v4.search_paths.push(SearchPath::from_cli_opt("crate=def", JSON)); + v4.search_paths.push(SearchPath::from_cli_opt("dependency=ghi", JSON)); + v4.search_paths.push(SearchPath::from_cli_opt("framework=jkl", JSON)); assert!(v1.dep_tracking_hash() == v2.dep_tracking_hash()); assert!(v1.dep_tracking_hash() == v3.dep_tracking_hash()); @@ -363,11 +321,7 @@ fn test_native_libs_tracking_hash_different_values() { // Change new-name v4.libs = vec![ (String::from("a"), None, Some(cstore::NativeStatic)), - ( - String::from("b"), - Some(String::from("X")), - Some(cstore::NativeFramework), - ), + (String::from("b"), Some(String::from("X")), Some(cstore::NativeFramework)), (String::from("c"), None, Some(cstore::NativeUnknown)), ]; @@ -647,10 +601,6 @@ fn test_debugging_options_tracking_hash() { opts.debugging_opts.report_delayed_bugs = true; assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); - opts = reference.clone(); - opts.debugging_opts.continue_parse_after_error = true; - assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); - opts = reference.clone(); opts.debugging_opts.force_overflow_checks = Some(true); assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); @@ -686,9 +636,7 @@ fn test_edition_parsing() { let options = Options::default(); assert!(options.edition == DEFAULT_EDITION); - let matches = optgroups() - .parse(&["--edition=2018".to_string()]) - .unwrap(); + let matches = optgroups().parse(&["--edition=2018".to_string()]).unwrap(); let (sessopts, _) = build_session_options_and_crate_config(matches); assert!(sessopts.edition == Edition::Edition2018) } diff --git a/src/librustc_interface/util.rs b/src/librustc_interface/util.rs index c78b3ee076..3e65da9c47 100644 --- a/src/librustc_interface/util.rs +++ b/src/librustc_interface/util.rs @@ -1,37 +1,38 @@ use log::info; -use rustc::session::config::{Input, OutputFilenames, ErrorOutputType}; -use rustc::session::{self, config, early_error, filesearch, Session, DiagnosticOutput}; -use rustc::session::CrateDisambiguator; -use rustc::ty; use rustc::lint; +use rustc::ty; use rustc_codegen_utils::codegen_backend::CodegenBackend; +use rustc_data_structures::fingerprint::Fingerprint; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; #[cfg(parallel_compiler)] use rustc_data_structures::jobserver; -use rustc_data_structures::sync::{Lock, Lrc}; use rustc_data_structures::stable_hasher::StableHasher; -use rustc_data_structures::fingerprint::Fingerprint; -use rustc_data_structures::thin_vec::ThinVec; -use rustc_data_structures::fx::{FxHashSet, FxHashMap}; +use rustc_data_structures::sync::{Lock, Lrc}; use rustc_errors::registry::Registry; use rustc_metadata::dynamic_lib::DynamicLibrary; use rustc_resolve::{self, Resolver}; +use rustc_session as session; +use rustc_session::config::{ErrorOutputType, Input, OutputFilenames}; +use rustc_session::lint::{BuiltinLintDiagnostics, LintBuffer}; +use rustc_session::CrateDisambiguator; +use rustc_session::{config, early_error, filesearch, DiagnosticOutput, Session}; +use rustc_span::edition::Edition; +use rustc_span::source_map::{FileLoader, RealFileLoader, SourceMap}; +use rustc_span::symbol::{sym, Symbol}; +use smallvec::SmallVec; use std::env; use std::io::{self, Write}; use std::mem; +use std::ops::DerefMut; use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex, Once}; -use std::ops::DerefMut; -use smallvec::SmallVec; +#[cfg(not(parallel_compiler))] +use std::{panic, thread}; +use syntax::ast::{AttrVec, BlockCheckMode}; +use syntax::mut_visit::{visit_clobber, MutVisitor, *}; use syntax::ptr::P; -use syntax::mut_visit::{*, MutVisitor, visit_clobber}; -use syntax::ast::BlockCheckMode; use syntax::util::lev_distance::find_best_match_for_name; -use syntax::source_map::{FileLoader, RealFileLoader, SourceMap}; -use syntax::symbol::{Symbol, sym}; use syntax::{self, ast, attr}; -use syntax_pos::edition::Edition; -#[cfg(not(parallel_compiler))] -use std::{thread, panic}; /// Adds `target_feature = "..."` cfgs for a variety of platform /// specific features (SSE, NEON etc.). @@ -45,12 +46,7 @@ pub fn add_configuration( ) { let tf = sym::target_feature; - cfg.extend( - codegen_backend - .target_features(sess) - .into_iter() - .map(|feat| (tf, Some(feat))), - ); + cfg.extend(codegen_backend.target_features(sess).into_iter().map(|feat| (tf, Some(feat)))); if sess.crt_static_feature() { cfg.insert((tf, Some(Symbol::intern("crt-static")))); @@ -67,10 +63,7 @@ pub fn create_session( descriptions: Registry, ) -> (Lrc, Lrc>, Lrc) { let loader = file_loader.unwrap_or(box RealFileLoader); - let source_map = Lrc::new(SourceMap::with_file_loader( - loader, - sopts.file_path_mapping(), - )); + let source_map = Lrc::new(SourceMap::with_file_loader(loader, sopts.file_path_mapping())); let mut sess = session::build_session_with_source_map( sopts, input_path, @@ -80,10 +73,6 @@ pub fn create_session( lint_caps, ); - sess.prof.register_queries(|profiler| { - rustc::ty::query::QueryName::register_with_profiler(&profiler); - }); - let codegen_backend = get_codegen_backend(&sess); let mut cfg = config::build_configuration(&sess, config::to_crate_config(cfg)); @@ -113,7 +102,9 @@ impl Write for Sink { fn write(&mut self, data: &[u8]) -> io::Result { Write::write(&mut *self.0.lock().unwrap(), data) } - fn flush(&mut self) -> io::Result<()> { Ok(()) } + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } } #[cfg(not(parallel_compiler))] @@ -152,13 +143,15 @@ pub fn spawn_thread_pool R + Send, R: Send>( cfg = cfg.stack_size(size); } + crate::callbacks::setup_callbacks(); + scoped_thread(cfg, || { syntax::with_globals(edition, || { ty::tls::GCX_PTR.set(&Lock::new(0), || { if let Some(stderr) = stderr { io::set_panic(Some(box Sink(stderr.clone()))); } - ty::tls::with_thread_locals(|| f()) + f() }) }) }) @@ -174,6 +167,7 @@ pub fn spawn_thread_pool R + Send, R: Send>( use rayon::{ThreadBuilder, ThreadPool, ThreadPoolBuilder}; let gcx_ptr = &Lock::new(0); + crate::callbacks::setup_callbacks(); let mut config = ThreadPoolBuilder::new() .thread_name(|_| "rustc".to_string()) @@ -190,20 +184,18 @@ pub fn spawn_thread_pool R + Send, R: Send>( syntax::with_globals(edition, || { syntax::GLOBALS.with(|syntax_globals| { - syntax_pos::GLOBALS.with(|syntax_pos_globals| { + rustc_span::GLOBALS.with(|rustc_span_globals| { // The main handler runs for each Rayon worker thread and sets up - // the thread local rustc uses. syntax_globals and syntax_pos_globals are + // the thread local rustc uses. syntax_globals and rustc_span_globals are // captured and set on the new threads. ty::tls::with_thread_locals sets up // thread local callbacks from libsyntax let main_handler = move |thread: ThreadBuilder| { syntax::GLOBALS.set(syntax_globals, || { - syntax_pos::GLOBALS.set(syntax_pos_globals, || { + rustc_span::GLOBALS.set(rustc_span_globals, || { if let Some(stderr) = stderr { io::set_panic(Some(box Sink(stderr.clone()))); } - ty::tls::with_thread_locals(|| { - ty::tls::GCX_PTR.set(gcx_ptr, || thread.run()) - }) + ty::tls::GCX_PTR.set(gcx_ptr, || thread.run()) }) }) }; @@ -226,9 +218,12 @@ fn load_backend_from_dylib(path: &Path) -> fn() -> Box { mem::transmute::<*mut u8, _>(f) } Err(e) => { - let err = format!("couldn't load codegen backend as it \ + let err = format!( + "couldn't load codegen backend as it \ doesn't export the `__rustc_codegen_backend` \ - symbol: {:?}", e); + symbol: {:?}", + e + ); early_error(ErrorOutputType::default(), &err); } } @@ -241,12 +236,14 @@ pub fn get_codegen_backend(sess: &Session) -> Box { static mut LOAD: fn() -> Box = || unreachable!(); INIT.call_once(|| { - let codegen_name = sess.opts.debugging_opts.codegen_backend.as_ref() + let codegen_name = sess + .opts + .debugging_opts + .codegen_backend + .as_ref() .unwrap_or(&sess.target.target.options.codegen_backend); let backend = match &codegen_name[..] { - filename if filename.contains(".") => { - load_backend_from_dylib(filename.as_ref()) - } + filename if filename.contains(".") => load_backend_from_dylib(filename.as_ref()), codegen_name => get_builtin_codegen_backend(codegen_name), }; @@ -272,7 +269,8 @@ pub fn rustc_path<'a>() -> Option<&'a Path> { } fn get_rustc_path_inner(bin_path: &str) -> Option { - sysroot_candidates().iter() + sysroot_candidates() + .iter() .filter_map(|sysroot| { let candidate = sysroot.join(bin_path).join(if cfg!(target_os = "windows") { "rustc.exe" @@ -304,10 +302,12 @@ fn sysroot_candidates() -> Vec { sysroot_candidates.push(path.to_owned()); if path.ends_with(target) { - sysroot_candidates.extend(path.parent() // chop off `$target` - .and_then(|p| p.parent()) // chop off `rustlib` - .and_then(|p| p.parent()) // chop off `lib` - .map(|s| s.to_owned())); + sysroot_candidates.extend( + path.parent() // chop off `$target` + .and_then(|p| p.parent()) // chop off `rustlib` + .and_then(|p| p.parent()) // chop off `lib` + .map(|s| s.to_owned()), + ); } } } @@ -316,7 +316,7 @@ fn sysroot_candidates() -> Vec { #[cfg(unix)] fn current_dll_path() -> Option { - use std::ffi::{OsStr, CStr}; + use std::ffi::{CStr, OsStr}; use std::os::unix::prelude::*; unsafe { @@ -324,11 +324,11 @@ fn sysroot_candidates() -> Vec { let mut info = mem::zeroed(); if libc::dladdr(addr, &mut info) == 0 { info!("dladdr failed"); - return None + return None; } if info.dli_fname.is_null() { info!("dladdr returned null pointer"); - return None + return None; } let bytes = CStr::from_ptr(info.dli_fname).to_bytes(); let os = OsStr::from_bytes(bytes); @@ -340,40 +340,33 @@ fn sysroot_candidates() -> Vec { fn current_dll_path() -> Option { use std::ffi::OsString; use std::os::windows::prelude::*; + use std::ptr; - extern "system" { - fn GetModuleHandleExW(dwFlags: u32, - lpModuleName: usize, - phModule: *mut usize) -> i32; - fn GetModuleFileNameW(hModule: usize, - lpFilename: *mut u16, - nSize: u32) -> u32; - } - - const GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS: u32 = 0x00000004; + use winapi::um::libloaderapi::{ + GetModuleFileNameW, GetModuleHandleExW, GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, + }; unsafe { - let mut module = 0; - let r = GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, - current_dll_path as usize, - &mut module); + let mut module = ptr::null_mut(); + let r = GetModuleHandleExW( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, + current_dll_path as usize as *mut _, + &mut module, + ); if r == 0 { info!("GetModuleHandleExW failed: {}", io::Error::last_os_error()); - return None + return None; } let mut space = Vec::with_capacity(1024); - let r = GetModuleFileNameW(module, - space.as_mut_ptr(), - space.capacity() as u32); + let r = GetModuleFileNameW(module, space.as_mut_ptr(), space.capacity() as u32); if r == 0 { info!("GetModuleFileNameW failed: {}", io::Error::last_os_error()); - return None + return None; } let r = r as usize; if r >= space.capacity() { - info!("our buffer was too small? {}", - io::Error::last_os_error()); - return None + info!("our buffer was too small? {}", io::Error::last_os_error()); + return None; } space.set_len(r); let os = OsString::from_wide(&space); @@ -421,16 +414,13 @@ pub(crate) fn compute_crate_disambiguator(session: &Session) -> CrateDisambiguat // Also incorporate crate type, so that we don't get symbol conflicts when // linking against a library of the same name, if this is an executable. - let is_exe = session - .crate_types - .borrow() - .contains(&config::CrateType::Executable); + let is_exe = session.crate_types.borrow().contains(&config::CrateType::Executable); hasher.write(if is_exe { b"exe" } else { b"lib" }); CrateDisambiguator::from(hasher.finish::()) } -pub(crate) fn check_attr_crate_type(attrs: &[ast::Attribute], lint_buffer: &mut lint::LintBuffer) { +pub(crate) fn check_attr_crate_type(attrs: &[ast::Attribute], lint_buffer: &mut LintBuffer) { // Unconditionally collect crate types from attributes to make them used for a in attrs.iter() { if a.check_name(sym::crate_type) { @@ -444,7 +434,7 @@ pub(crate) fn check_attr_crate_type(attrs: &[ast::Attribute], lint_buffer: &mut let lev_candidate = find_best_match_for_name( CRATE_TYPES.iter().map(|(k, _)| k), &n.as_str(), - None + None, ); if let Some(candidate) = lev_candidate { lint_buffer.buffer_lint_with_diagnostic( @@ -452,19 +442,18 @@ pub(crate) fn check_attr_crate_type(attrs: &[ast::Attribute], lint_buffer: &mut ast::CRATE_NODE_ID, span, "invalid `crate_type` value", - lint::builtin::BuiltinLintDiagnostics:: - UnknownCrateTypes( - span, - "did you mean".to_string(), - format!("\"{}\"", candidate) - ) + BuiltinLintDiagnostics::UnknownCrateTypes( + span, + "did you mean".to_string(), + format!("\"{}\"", candidate), + ), ); } else { lint_buffer.buffer_lint( lint::builtin::UNKNOWN_CRATE_TYPES, ast::CRATE_NODE_ID, span, - "invalid `crate_type` value" + "invalid `crate_type` value", ); } } @@ -516,9 +505,7 @@ pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec { - let unnamed_output_types = sess.opts - .output_types - .values() - .filter(|a| a.is_none()) - .count(); + let unnamed_output_types = + sess.opts.output_types.values().filter(|a| a.is_none()).count(); let ofile = if unnamed_output_types > 1 { sess.warn( "due to multiple output types requested, the explicitly specified \ @@ -593,18 +578,13 @@ pub fn build_output_filenames( sess.warn("ignoring --out-dir flag due to -o flag"); } - OutputFilenames { - out_directory: out_file.parent().unwrap_or_else(|| Path::new("")).to_path_buf(), - out_filestem: out_file - .file_stem() - .unwrap_or_default() - .to_str() - .unwrap() - .to_string(), - single_output_file: ofile, - extra: sess.opts.cg.extra_filename.clone(), - outputs: sess.opts.output_types.clone(), - } + OutputFilenames::new( + out_file.parent().unwrap_or_else(|| Path::new("")).to_path_buf(), + out_file.file_stem().unwrap_or_default().to_str().unwrap().to_string(), + ofile, + sess.opts.cg.extra_filename.clone(), + sess.opts.output_types.clone(), + ) } } } @@ -627,11 +607,7 @@ pub struct ReplaceBodyWithLoop<'a, 'b> { impl<'a, 'b> ReplaceBodyWithLoop<'a, 'b> { pub fn new(resolver: &'a mut Resolver<'b>) -> ReplaceBodyWithLoop<'a, 'b> { - ReplaceBodyWithLoop { - within_static_or_const: false, - nested_blocks: None, - resolver, - } + ReplaceBodyWithLoop { within_static_or_const: false, nested_blocks: None, resolver } } fn run R>(&mut self, is_const: bool, action: F) -> R { @@ -643,16 +619,16 @@ impl<'a, 'b> ReplaceBodyWithLoop<'a, 'b> { ret } - fn should_ignore_fn(ret_ty: &ast::FnDecl) -> bool { - if let ast::FunctionRetTy::Ty(ref ty) = ret_ty.output { + fn should_ignore_fn(ret_ty: &ast::FunctionRetTy) -> bool { + if let ast::FunctionRetTy::Ty(ref ty) = ret_ty { fn involves_impl_trait(ty: &ast::Ty) -> bool { match ty.kind { ast::TyKind::ImplTrait(..) => true, - ast::TyKind::Slice(ref subty) | - ast::TyKind::Array(ref subty, _) | - ast::TyKind::Ptr(ast::MutTy { ty: ref subty, .. }) | - ast::TyKind::Rptr(_, ast::MutTy { ty: ref subty, .. }) | - ast::TyKind::Paren(ref subty) => involves_impl_trait(subty), + ast::TyKind::Slice(ref subty) + | ast::TyKind::Array(ref subty, _) + | ast::TyKind::Ptr(ast::MutTy { ty: ref subty, .. }) + | ast::TyKind::Rptr(_, ast::MutTy { ty: ref subty, .. }) + | ast::TyKind::Paren(ref subty) => involves_impl_trait(subty), ast::TyKind::Tup(ref tys) => any_involves_impl_trait(tys.iter()), ast::TyKind::Path(_, ref path) => path.segments.iter().any(|seg| { match seg.args.as_ref().map(|generic_arg| &**generic_arg) { @@ -662,18 +638,17 @@ impl<'a, 'b> ReplaceBodyWithLoop<'a, 'b> { ast::GenericArg::Type(ty) => Some(ty), _ => None, }); - any_involves_impl_trait(types.into_iter()) || - data.constraints.iter().any(|c| { - match c.kind { + any_involves_impl_trait(types.into_iter()) + || data.constraints.iter().any(|c| match c.kind { ast::AssocTyConstraintKind::Bound { .. } => true, - ast::AssocTyConstraintKind::Equality { ref ty } => - involves_impl_trait(ty), - } - }) - }, + ast::AssocTyConstraintKind::Equality { ref ty } => { + involves_impl_trait(ty) + } + }) + } Some(&ast::GenericArgs::Parenthesized(ref data)) => { - any_involves_impl_trait(data.inputs.iter()) || - any_involves_impl_trait(data.output.iter()) + any_involves_impl_trait(data.inputs.iter()) + || ReplaceBodyWithLoop::should_ignore_fn(&data.output) } } }), @@ -692,8 +667,8 @@ impl<'a, 'b> ReplaceBodyWithLoop<'a, 'b> { } fn is_sig_const(sig: &ast::FnSig) -> bool { - sig.header.constness.node == ast::Constness::Const || - ReplaceBodyWithLoop::should_ignore_fn(&sig.decl) + sig.header.constness.node == ast::Constness::Const + || ReplaceBodyWithLoop::should_ignore_fn(&sig.decl.output) } } @@ -707,22 +682,17 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_> { self.run(is_const, |s| noop_visit_item_kind(i, s)) } - fn flat_map_trait_item(&mut self, i: ast::TraitItem) -> SmallVec<[ast::TraitItem; 1]> { + fn flat_map_trait_item(&mut self, i: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> { let is_const = match i.kind { - ast::TraitItemKind::Const(..) => true, - ast::TraitItemKind::Method(ref sig, _) => Self::is_sig_const(sig), + ast::AssocItemKind::Const(..) => true, + ast::AssocItemKind::Fn(ref sig, _) => Self::is_sig_const(sig), _ => false, }; - self.run(is_const, |s| noop_flat_map_trait_item(i, s)) + self.run(is_const, |s| noop_flat_map_assoc_item(i, s)) } - fn flat_map_impl_item(&mut self, i: ast::ImplItem) -> SmallVec<[ast::ImplItem; 1]> { - let is_const = match i.kind { - ast::ImplItemKind::Const(..) => true, - ast::ImplItemKind::Method(ref sig, _) => Self::is_sig_const(sig), - _ => false, - }; - self.run(is_const, |s| noop_flat_map_impl_item(i, s)) + fn flat_map_impl_item(&mut self, i: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> { + self.flat_map_trait_item(i) } fn visit_anon_const(&mut self, c: &mut ast::AnonConst) { @@ -730,14 +700,16 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_> { } fn visit_block(&mut self, b: &mut P) { - fn stmt_to_block(rules: ast::BlockCheckMode, - s: Option, - resolver: &mut Resolver<'_>) -> ast::Block { + fn stmt_to_block( + rules: ast::BlockCheckMode, + s: Option, + resolver: &mut Resolver<'_>, + ) -> ast::Block { ast::Block { stmts: s.into_iter().collect(), rules, id: resolver.next_node_id(), - span: syntax_pos::DUMMY_SP, + span: rustc_span::DUMMY_SP, } } @@ -745,14 +717,14 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_> { let expr = P(ast::Expr { id: resolver.next_node_id(), kind: ast::ExprKind::Block(P(b), None), - span: syntax_pos::DUMMY_SP, - attrs: ThinVec::new(), + span: rustc_span::DUMMY_SP, + attrs: AttrVec::new(), }); ast::Stmt { id: resolver.next_node_id(), kind: ast::StmtKind::Expr(expr), - span: syntax_pos::DUMMY_SP, + span: rustc_span::DUMMY_SP, } } @@ -760,13 +732,13 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_> { let loop_expr = P(ast::Expr { kind: ast::ExprKind::Loop(P(empty_block), None), id: self.resolver.next_node_id(), - span: syntax_pos::DUMMY_SP, - attrs: ThinVec::new(), + span: rustc_span::DUMMY_SP, + attrs: AttrVec::new(), }); let loop_stmt = ast::Stmt { id: self.resolver.next_node_id(), - span: syntax_pos::DUMMY_SP, + span: rustc_span::DUMMY_SP, kind: ast::StmtKind::Expr(loop_expr), }; @@ -786,10 +758,7 @@ impl<'a> MutVisitor for ReplaceBodyWithLoop<'a, '_> { stmts.extend(new_blocks.into_iter().map(|b| block_to_stmt(b, self.resolver))); } - let mut new_block = ast::Block { - stmts, - ..b - }; + let mut new_block = ast::Block { stmts, ..b }; if let Some(old_blocks) = self.nested_blocks.as_mut() { //push our fresh block onto the cache and yield an empty block with `loop {}` diff --git a/src/librustc_lexer/src/lib.rs b/src/librustc_lexer/src/lib.rs index 3cecb4317b..969ce9b06e 100644 --- a/src/librustc_lexer/src/lib.rs +++ b/src/librustc_lexer/src/lib.rs @@ -17,9 +17,9 @@ mod cursor; pub mod unescape; -use crate::cursor::{Cursor, EOF_CHAR}; -use self::TokenKind::*; use self::LiteralKind::*; +use self::TokenKind::*; +use crate::cursor::{Cursor, EOF_CHAR}; /// Parsed token. /// It doesn't contain information about data that has been parsed, @@ -39,7 +39,6 @@ impl Token { #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum TokenKind { // Multi-char tokens: - /// "// comment" LineComment, /// "/* block comment */" @@ -59,7 +58,6 @@ pub enum TokenKind { Lifetime { starts_with_number: bool }, // One-char tokens: - /// ";" Semi, /// "," @@ -405,11 +403,7 @@ impl Cursor<'_> { } fn raw_ident(&mut self) -> TokenKind { - debug_assert!( - self.prev() == 'r' - && self.first() == '#' - && is_id_start(self.second()) - ); + debug_assert!(self.prev() == 'r' && self.first() == '#' && is_id_start(self.second())); // Eat "#" symbol. self.bump(); // Eat the identifier part of RawIdent. @@ -467,9 +461,7 @@ impl Cursor<'_> { // Don't be greedy if this is actually an // integer literal followed by field/method access or a range pattern // (`0..2` and `12.foo()`) - '.' if self.second() != '.' - && !is_id_start(self.second()) => - { + '.' if self.second() != '.' && !is_id_start(self.second()) => { // might have stuff after the ., and if it does, it needs to start // with a number self.bump(); @@ -710,7 +702,7 @@ impl Cursor<'_> { /// Returns amount of eaten symbols. fn eat_while(&mut self, mut predicate: F) -> usize where - F: FnMut(char) -> bool + F: FnMut(char) -> bool, { let mut eaten: usize = 0; while predicate(self.first()) && !self.is_eof() { diff --git a/src/librustc_lexer/src/unescape.rs b/src/librustc_lexer/src/unescape.rs index dee7bc2260..4f5e03d008 100644 --- a/src/librustc_lexer/src/unescape.rs +++ b/src/librustc_lexer/src/unescape.rs @@ -1,8 +1,8 @@ //! Utilities for validating string and char literals and turning them into //! values they represent. -use std::str::Chars; use std::ops::Range; +use std::str::Chars; #[cfg(test)] mod tests; @@ -152,7 +152,6 @@ impl Mode { } } - fn scan_escape(first_char: char, chars: &mut Chars<'_>, mode: Mode) -> Result { if first_char != '\\' { // Previous character was not a slash, and we don't expect it to be @@ -246,7 +245,8 @@ fn scan_escape(first_char: char, chars: &mut Chars<'_>, mode: Mode) -> Result { - let digit = c.to_digit(16).ok_or(EscapeError::InvalidCharInUnicodeEscape)?; + let digit = + c.to_digit(16).ok_or(EscapeError::InvalidCharInUnicodeEscape)?; n_digits += 1; if n_digits > 6 { // Stop updating value since we're sure that it's is incorrect already. @@ -334,8 +334,7 @@ where let result = match curr { '\r' => Err(EscapeError::BareCarriageReturnInRawString), - c if mode.is_bytes() && !c.is_ascii() => - Err(EscapeError::NonAsciiCharInByteString), + c if mode.is_bytes() && !c.is_ascii() => Err(EscapeError::NonAsciiCharInByteString), c => Ok(c), }; let end = initial_len - chars.as_str().len(); diff --git a/src/librustc_lint/Cargo.toml b/src/librustc_lint/Cargo.toml index e834b87896..7e23e70577 100644 --- a/src/librustc_lint/Cargo.toml +++ b/src/librustc_lint/Cargo.toml @@ -10,12 +10,14 @@ path = "lib.rs" [dependencies] log = "0.4" +unicode-security = "0.0.2" rustc = { path = "../librustc" } +rustc_errors = { path = "../librustc_errors" } +rustc_hir = { path = "../librustc_hir" } rustc_target = { path = "../librustc_target" } syntax = { path = "../libsyntax" } -syntax_pos = { path = "../libsyntax_pos" } +rustc_span = { path = "../librustc_span" } rustc_data_structures = { path = "../librustc_data_structures" } rustc_feature = { path = "../librustc_feature" } rustc_index = { path = "../librustc_index" } -rustc_error_codes = { path = "../librustc_error_codes" } rustc_session = { path = "../librustc_session" } diff --git a/src/librustc_lint/array_into_iter.rs b/src/librustc_lint/array_into_iter.rs index e73414174f..fb11b6771e 100644 --- a/src/librustc_lint/array_into_iter.rs +++ b/src/librustc_lint/array_into_iter.rs @@ -1,17 +1,10 @@ -use crate::lint::{LateContext, LateLintPass, LintArray, LintContext, LintPass}; -use rustc::{ - lint::FutureIncompatibleInfo, - hir, - ty::{ - self, - adjustment::{Adjust, Adjustment}, - }, -}; -use syntax::{ - errors::Applicability, - symbol::sym, -}; - +use crate::{LateContext, LateLintPass, LintContext}; +use rustc::ty; +use rustc::ty::adjustment::{Adjust, Adjustment}; +use rustc_errors::Applicability; +use rustc_hir as hir; +use rustc_session::lint::FutureIncompatibleInfo; +use rustc_span::symbol::sym; declare_lint! { pub ARRAY_INTO_ITER, @@ -29,7 +22,7 @@ declare_lint_pass!( ); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ArrayIntoIter { - fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr) { + fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx hir::Expr<'tcx>) { // We only care about method call expressions. if let hir::ExprKind::MethodCall(call, span, args) = &expr.kind { if call.ident.name != sym::into_iter { @@ -40,7 +33,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ArrayIntoIter { // `IntoIterator::into_iter`. let def_id = cx.tables.type_dependent_def_id(expr.hir_id).unwrap(); match cx.tcx.trait_of_item(def_id) { - Some(trait_id) if cx.tcx.is_diagnostic_item(sym::IntoIterator, trait_id) => {}, + Some(trait_id) if cx.tcx.is_diagnostic_item(sym::IntoIterator, trait_id) => {} _ => return, }; @@ -48,22 +41,34 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ArrayIntoIter { // argument. let receiver_arg = &args[0]; - // Test if the original `self` type is an array type. - match cx.tables.expr_ty(receiver_arg).kind { - ty::Array(..) => {} - _ => return, + // Peel all `Box<_>` layers. We have to special case `Box` here as + // `Box` is the only thing that values can be moved out of via + // method call. `Box::new([1]).into_iter()` should trigger this + // lint. + let mut recv_ty = cx.tables.expr_ty(receiver_arg); + let mut num_box_derefs = 0; + while recv_ty.is_box() { + num_box_derefs += 1; + recv_ty = recv_ty.boxed_ty(); + } + + // Make sure we found an array after peeling the boxes. + if !matches!(recv_ty.kind, ty::Array(..)) { + return; } - // Make sure that the first adjustment is an autoref coercion. - match cx.tables.expr_adjustments(receiver_arg).get(0) { + // Make sure that there is an autoref coercion at the expected + // position. The first `num_box_derefs` adjustments are the derefs + // of the box. + match cx.tables.expr_adjustments(receiver_arg).get(num_box_derefs) { Some(Adjustment { kind: Adjust::Borrow(_), .. }) => {} _ => return, } // Emit lint diagnostic. let target = match cx.tables.expr_ty_adjusted(receiver_arg).kind { - ty::Ref(_, ty::TyS { kind: ty::Array(..), ..}, _) => "[T; N]", - ty::Ref(_, ty::TyS { kind: ty::Slice(..), ..}, _) => "[T]", + ty::Ref(_, ty::TyS { kind: ty::Array(..), .. }, _) => "[T; N]", + ty::Ref(_, ty::TyS { kind: ty::Slice(..), .. }, _) => "[T]", // We know the original first argument type is an array type, // we know that the first adjustment was an autoref coercion diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index 10b00d35d9..c8d3d5f9c8 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -21,42 +21,37 @@ //! If you define a new `LateLintPass`, you will also need to add it to the //! `late_lint_methods!` invocation in `lib.rs`. -use std::fmt::Write; - -use rustc::hir::def::{Res, DefKind}; -use rustc::hir::def_id::DefId; -use rustc::ty::{self, Ty, TyCtxt, layout::VariantIdx}; -use rustc::{lint, util}; -use rustc::lint::FutureIncompatibleInfo; -use hir::Node; -use util::nodemap::HirIdSet; -use lint::{LateContext, LintContext, LintArray}; -use lint::{LintPass, LateLintPass, EarlyLintPass, EarlyContext}; - -use rustc::util::nodemap::FxHashSet; -use rustc_feature::{AttributeGate, AttributeTemplate, AttributeType, deprecated_attributes}; +use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext}; +use rustc::hir::map::Map; +use rustc::traits::misc::can_type_implement_copy; +use rustc::ty::{self, layout::VariantIdx, Ty, TyCtxt}; +use rustc_data_structures::fx::FxHashSet; +use rustc_errors::{Applicability, DiagnosticBuilder}; use rustc_feature::Stability; - -use syntax::tokenstream::{TokenTree, TokenStream}; +use rustc_feature::{deprecated_attributes, AttributeGate, AttributeTemplate, AttributeType}; +use rustc_hir as hir; +use rustc_hir::def::{DefKind, Res}; +use rustc_hir::def_id::DefId; +use rustc_hir::{GenericParamKind, PatKind}; +use rustc_hir::{HirIdSet, Node}; +use rustc_session::lint::FutureIncompatibleInfo; +use rustc_span::edition::Edition; +use rustc_span::source_map::Spanned; +use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_span::{BytePos, Span}; use syntax::ast::{self, Expr}; -use syntax::ptr::P; use syntax::attr::{self, HasAttrs}; -use syntax::source_map::Spanned; -use syntax::edition::Edition; -use syntax_pos::{BytePos, Span}; -use syntax::symbol::{Symbol, kw, sym}; -use syntax::errors::{Applicability, DiagnosticBuilder}; use syntax::print::pprust::{self, expr_to_string}; +use syntax::tokenstream::{TokenStream, TokenTree}; use syntax::visit::FnKind; -use rustc::hir::{self, GenericParamKind, PatKind}; - -use crate::nonstandard_style::{MethodLateContext, method_context}; +use crate::nonstandard_style::{method_context, MethodLateContext}; use log::debug; +use std::fmt::Write; // hardwired lints from librustc -pub use lint::builtin::*; +pub use rustc_session::lint::builtin::*; declare_lint! { WHILE_TRUE, @@ -87,7 +82,7 @@ impl EarlyLintPass for WhileTrue { condition_span, "use `loop`", "loop".to_owned(), - Applicability::MachineApplicable + Applicability::MachineApplicable, ) .emit(); } @@ -117,34 +112,32 @@ impl BoxPointers { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for BoxPointers { - fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item<'_>) { match it.kind { - hir::ItemKind::Fn(..) | - hir::ItemKind::TyAlias(..) | - hir::ItemKind::Enum(..) | - hir::ItemKind::Struct(..) | - hir::ItemKind::Union(..) => { + hir::ItemKind::Fn(..) + | hir::ItemKind::TyAlias(..) + | hir::ItemKind::Enum(..) + | hir::ItemKind::Struct(..) + | hir::ItemKind::Union(..) => { let def_id = cx.tcx.hir().local_def_id(it.hir_id); self.check_heap_type(cx, it.span, cx.tcx.type_of(def_id)) } - _ => () + _ => (), } // If it's a struct, we also have to check the fields' types match it.kind { - hir::ItemKind::Struct(ref struct_def, _) | - hir::ItemKind::Union(ref struct_def, _) => { + hir::ItemKind::Struct(ref struct_def, _) | hir::ItemKind::Union(ref struct_def, _) => { for struct_field in struct_def.fields() { let def_id = cx.tcx.hir().local_def_id(struct_field.hir_id); - self.check_heap_type(cx, struct_field.span, - cx.tcx.type_of(def_id)); + self.check_heap_type(cx, struct_field.span, cx.tcx.type_of(def_id)); } } _ => (), } } - fn check_expr(&mut self, cx: &LateContext<'_, '_>, e: &hir::Expr) { + fn check_expr(&mut self, cx: &LateContext<'_, '_>, e: &hir::Expr<'_>) { let ty = cx.tables.node_type(e.hir_id); self.check_heap_type(cx, e.span, ty); } @@ -159,11 +152,14 @@ declare_lint! { declare_lint_pass!(NonShorthandFieldPatterns => [NON_SHORTHAND_FIELD_PATTERNS]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonShorthandFieldPatterns { - fn check_pat(&mut self, cx: &LateContext<'_, '_>, pat: &hir::Pat) { - if let PatKind::Struct(ref qpath, ref field_pats, _) = pat.kind { - let variant = cx.tables.pat_ty(pat).ty_adt_def() - .expect("struct pattern type is not an ADT") - .variant_of_res(cx.tables.qpath_res(qpath, pat.hir_id)); + fn check_pat(&mut self, cx: &LateContext<'_, '_>, pat: &hir::Pat<'_>) { + if let PatKind::Struct(ref qpath, field_pats, _) = pat.kind { + let variant = cx + .tables + .pat_ty(pat) + .ty_adt_def() + .expect("struct pattern type is not an ADT") + .variant_of_res(cx.tables.qpath_res(qpath, pat.hir_id)); for fieldpat in field_pats { if fieldpat.is_shorthand { continue; @@ -174,19 +170,31 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonShorthandFieldPatterns { // (Issue #49588) continue; } - if let PatKind::Binding(_, _, ident, None) = fieldpat.pat.kind { - if cx.tcx.find_field_index(ident, &variant) == - Some(cx.tcx.field_index(fieldpat.hir_id, cx.tables)) { - let mut err = cx.struct_span_lint(NON_SHORTHAND_FIELD_PATTERNS, - fieldpat.span, - &format!("the `{}:` in this pattern is redundant", ident)); - let subspan = cx.tcx.sess.source_map().span_through_char(fieldpat.span, - ':'); - err.span_suggestion_short( - subspan, - "remove this", - ident.to_string(), - Applicability::MachineApplicable + if let PatKind::Binding(binding_annot, _, ident, None) = fieldpat.pat.kind { + if cx.tcx.find_field_index(ident, &variant) + == Some(cx.tcx.field_index(fieldpat.hir_id, cx.tables)) + { + let mut err = cx.struct_span_lint( + NON_SHORTHAND_FIELD_PATTERNS, + fieldpat.span, + &format!("the `{}:` in this pattern is redundant", ident), + ); + let binding = match binding_annot { + hir::BindingAnnotation::Unannotated => None, + hir::BindingAnnotation::Mutable => Some("mut"), + hir::BindingAnnotation::Ref => Some("ref"), + hir::BindingAnnotation::RefMut => Some("ref mut"), + }; + let ident = if let Some(binding) = binding { + format!("{} {}", binding, ident) + } else { + ident.to_string() + }; + err.span_suggestion( + fieldpat.span, + "use shorthand field pattern", + ident, + Applicability::MachineApplicable, ); err.emit(); } @@ -218,9 +226,13 @@ impl UnsafeCode { impl EarlyLintPass for UnsafeCode { fn check_attribute(&mut self, cx: &EarlyContext<'_>, attr: &ast::Attribute) { if attr.check_name(sym::allow_internal_unsafe) { - self.report_unsafe(cx, attr.span, "`allow_internal_unsafe` allows defining \ + self.report_unsafe( + cx, + attr.span, + "`allow_internal_unsafe` allows defining \ macros using unsafe without triggering \ - the `unsafe_code` lint at their call site"); + the `unsafe_code` lint at their call site", + ); } } @@ -239,7 +251,7 @@ impl EarlyLintPass for UnsafeCode { self.report_unsafe(cx, it.span, "declaration of an `unsafe` trait") } - ast::ItemKind::Impl(ast::Unsafety::Unsafe, ..) => { + ast::ItemKind::Impl { unsafety: ast::Unsafety::Unsafe, .. } => { self.report_unsafe(cx, it.span, "implementation of an `unsafe` trait") } @@ -247,12 +259,14 @@ impl EarlyLintPass for UnsafeCode { } } - fn check_fn(&mut self, - cx: &EarlyContext<'_>, - fk: FnKind<'_>, - _: &ast::FnDecl, - span: Span, - _: ast::NodeId) { + fn check_fn( + &mut self, + cx: &EarlyContext<'_>, + fk: FnKind<'_>, + _: &ast::FnDecl, + span: Span, + _: ast::NodeId, + ) { match fk { FnKind::ItemFn(_, ast::FnHeader { unsafety: ast::Unsafety::Unsafe, .. }, ..) => { self.report_unsafe(cx, span, "declaration of an `unsafe` function") @@ -268,8 +282,8 @@ impl EarlyLintPass for UnsafeCode { } } - fn check_trait_item(&mut self, cx: &EarlyContext<'_>, item: &ast::TraitItem) { - if let ast::TraitItemKind::Method(ref sig, None) = item.kind { + fn check_trait_item(&mut self, cx: &EarlyContext<'_>, item: &ast::AssocItem) { + if let ast::AssocItemKind::Fn(ref sig, None) = item.kind { if sig.header.unsafety == ast::Unsafety::Unsafe { self.report_unsafe(cx, item.span, "declaration of an `unsafe` method") } @@ -295,6 +309,10 @@ pub struct MissingDoc { impl_lint_pass!(MissingDoc => [MISSING_DOCS]); fn has_doc(attr: &ast::Attribute) -> bool { + if attr.is_doc_comment() { + return true; + } + if !attr.check_name(sym::doc) { return false; } @@ -316,22 +334,21 @@ fn has_doc(attr: &ast::Attribute) -> bool { impl MissingDoc { pub fn new() -> MissingDoc { - MissingDoc { - doc_hidden_stack: vec![false], - private_traits: FxHashSet::default(), - } + MissingDoc { doc_hidden_stack: vec![false], private_traits: FxHashSet::default() } } fn doc_hidden(&self) -> bool { *self.doc_hidden_stack.last().expect("empty doc_hidden_stack") } - fn check_missing_docs_attrs(&self, - cx: &LateContext<'_, '_>, - id: Option, - attrs: &[ast::Attribute], - sp: Span, - desc: &'static str) { + fn check_missing_docs_attrs( + &self, + cx: &LateContext<'_, '_>, + id: Option, + attrs: &[ast::Attribute], + sp: Span, + desc: &'static str, + ) { // If we're building a test harness, then warning about // documentation is probably not really relevant right now. if cx.sess().opts.test { @@ -354,23 +371,25 @@ impl MissingDoc { let has_doc = attrs.iter().any(|a| has_doc(a)); if !has_doc { - cx.span_lint(MISSING_DOCS, - cx.tcx.sess.source_map().def_span(sp), - &format!("missing documentation for {}", desc)); + cx.span_lint( + MISSING_DOCS, + cx.tcx.sess.source_map().def_span(sp), + &format!("missing documentation for {}", desc), + ); } } } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc { fn enter_lint_attrs(&mut self, _: &LateContext<'_, '_>, attrs: &[ast::Attribute]) { - let doc_hidden = self.doc_hidden() || - attrs.iter().any(|attr| { - attr.check_name(sym::doc) && - match attr.meta_item_list() { - None => false, - Some(l) => attr::list_contains_name(&l, sym::hidden), - } - }); + let doc_hidden = self.doc_hidden() + || attrs.iter().any(|attr| { + attr.check_name(sym::doc) + && match attr.meta_item_list() { + None => false, + Some(l) => attr::list_contains_name(&l, sym::hidden), + } + }); self.doc_hidden_stack.push(doc_hidden); } @@ -378,27 +397,29 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc { self.doc_hidden_stack.pop().expect("empty doc_hidden_stack"); } - fn check_crate(&mut self, cx: &LateContext<'_, '_>, krate: &hir::Crate) { + fn check_crate(&mut self, cx: &LateContext<'_, '_>, krate: &hir::Crate<'_>) { self.check_missing_docs_attrs(cx, None, &krate.attrs, krate.span, "crate"); - for macro_def in &krate.exported_macros { + for macro_def in krate.exported_macros { let has_doc = macro_def.attrs.iter().any(|a| has_doc(a)); if !has_doc { - cx.span_lint(MISSING_DOCS, - cx.tcx.sess.source_map().def_span(macro_def.span), - "missing documentation for macro"); + cx.span_lint( + MISSING_DOCS, + cx.tcx.sess.source_map().def_span(macro_def.span), + "missing documentation for macro", + ); } } } - fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item<'_>) { let desc = match it.kind { hir::ItemKind::Fn(..) => "a function", hir::ItemKind::Mod(..) => "a module", hir::ItemKind::Enum(..) => "an enum", hir::ItemKind::Struct(..) => "a struct", hir::ItemKind::Union(..) => "a union", - hir::ItemKind::Trait(.., ref trait_item_refs) => { + hir::ItemKind::Trait(.., trait_item_refs) => { // Issue #11592: traits are always considered exported, even when private. if let hir::VisibilityKind::Inherited = it.vis.node { self.private_traits.insert(it.hir_id); @@ -410,7 +431,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc { "a trait" } hir::ItemKind::TyAlias(..) => "a type alias", - hir::ItemKind::Impl(.., Some(ref trait_ref), _, ref impl_item_refs) => { + hir::ItemKind::Impl { of_trait: Some(ref trait_ref), items, .. } => { // If the trait is private, add the impl items to `private_traits` so they don't get // reported for missing docs. let real_trait = trait_ref.path.res.def_id(); @@ -418,7 +439,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc { match cx.tcx.hir().find(hir_id) { Some(Node::Item(item)) => { if let hir::VisibilityKind::Inherited = item.vis.node { - for impl_item_ref in impl_item_refs { + for impl_item_ref in items { self.private_traits.insert(impl_item_ref.id.hir_id); } } @@ -436,7 +457,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc { self.check_missing_docs_attrs(cx, Some(it.hir_id), &it.attrs, it.span, desc); } - fn check_trait_item(&mut self, cx: &LateContext<'_, '_>, trait_item: &hir::TraitItem) { + fn check_trait_item(&mut self, cx: &LateContext<'_, '_>, trait_item: &hir::TraitItem<'_>) { if self.private_traits.contains(&trait_item.hir_id) { return; } @@ -447,14 +468,16 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc { hir::TraitItemKind::Type(..) => "an associated type", }; - self.check_missing_docs_attrs(cx, - Some(trait_item.hir_id), - &trait_item.attrs, - trait_item.span, - desc); + self.check_missing_docs_attrs( + cx, + Some(trait_item.hir_id), + &trait_item.attrs, + trait_item.span, + desc, + ); } - fn check_impl_item(&mut self, cx: &LateContext<'_, '_>, impl_item: &hir::ImplItem) { + fn check_impl_item(&mut self, cx: &LateContext<'_, '_>, impl_item: &hir::ImplItem<'_>) { // If the method is an impl for a trait, don't doc. if method_context(cx, impl_item.hir_id) == MethodLateContext::TraitImpl { return; @@ -466,29 +489,23 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc { hir::ImplItemKind::TyAlias(_) => "an associated type", hir::ImplItemKind::OpaqueTy(_) => "an associated `impl Trait` type", }; - self.check_missing_docs_attrs(cx, - Some(impl_item.hir_id), - &impl_item.attrs, - impl_item.span, - desc); + self.check_missing_docs_attrs( + cx, + Some(impl_item.hir_id), + &impl_item.attrs, + impl_item.span, + desc, + ); } - fn check_struct_field(&mut self, cx: &LateContext<'_, '_>, sf: &hir::StructField) { + fn check_struct_field(&mut self, cx: &LateContext<'_, '_>, sf: &hir::StructField<'_>) { if !sf.is_positional() { - self.check_missing_docs_attrs(cx, - Some(sf.hir_id), - &sf.attrs, - sf.span, - "a struct field") + self.check_missing_docs_attrs(cx, Some(sf.hir_id), &sf.attrs, sf.span, "a struct field") } } - fn check_variant(&mut self, cx: &LateContext<'_, '_>, v: &hir::Variant) { - self.check_missing_docs_attrs(cx, - Some(v.id), - &v.attrs, - v.span, - "a variant"); + fn check_variant(&mut self, cx: &LateContext<'_, '_>, v: &hir::Variant<'_>) { + self.check_missing_docs_attrs(cx, Some(v.id), &v.attrs, v.span, "a variant"); } } @@ -501,7 +518,7 @@ declare_lint! { declare_lint_pass!(MissingCopyImplementations => [MISSING_COPY_IMPLEMENTATIONS]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingCopyImplementations { - fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item<'_>) { if !cx.access_levels.is_reachable(item.hir_id) { return; } @@ -536,11 +553,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingCopyImplementations { if ty.is_copy_modulo_regions(cx.tcx, param_env, item.span) { return; } - if param_env.can_type_implement_copy(cx.tcx, ty).is_ok() { - cx.span_lint(MISSING_COPY_IMPLEMENTATIONS, - item.span, - "type could implement `Copy`; consider adding `impl \ - Copy`") + if can_type_implement_copy(cx.tcx, param_env, ty).is_ok() { + cx.span_lint( + MISSING_COPY_IMPLEMENTATIONS, + item.span, + "type could implement `Copy`; consider adding `impl \ + Copy`", + ) } } } @@ -559,15 +578,13 @@ pub struct MissingDebugImplementations { impl_lint_pass!(MissingDebugImplementations => [MISSING_DEBUG_IMPLEMENTATIONS]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDebugImplementations { - fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item<'_>) { if !cx.access_levels.is_reachable(item.hir_id) { return; } match item.kind { - hir::ItemKind::Struct(..) | - hir::ItemKind::Union(..) | - hir::ItemKind::Enum(..) => {} + hir::ItemKind::Struct(..) | hir::ItemKind::Union(..) | hir::ItemKind::Enum(..) => {} _ => return, } @@ -591,10 +608,12 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDebugImplementations { } if !self.impling_types.as_ref().unwrap().contains(&item.hir_id) { - cx.span_lint(MISSING_DEBUG_IMPLEMENTATIONS, - item.span, - "type does not implement `fmt::Debug`; consider adding `#[derive(Debug)]` \ - or a manual implementation") + cx.span_lint( + MISSING_DEBUG_IMPLEMENTATIONS, + item.span, + "type does not implement `fmt::Debug`; consider adding `#[derive(Debug)]` \ + or a manual implementation", + ) } } } @@ -615,17 +634,14 @@ declare_lint_pass!( ); impl EarlyLintPass for AnonymousParameters { - fn check_trait_item(&mut self, cx: &EarlyContext<'_>, it: &ast::TraitItem) { + fn check_trait_item(&mut self, cx: &EarlyContext<'_>, it: &ast::AssocItem) { match it.kind { - ast::TraitItemKind::Method(ref sig, _) => { + ast::AssocItemKind::Fn(ref sig, _) => { for arg in sig.decl.inputs.iter() { match arg.pat.kind { ast::PatKind::Ident(_, ident, None) => { if ident.name == kw::Invalid { - let ty_snip = cx - .sess - .source_map() - .span_to_snippet(arg.ty.span); + let ty_snip = cx.sess.source_map().span_to_snippet(arg.ty.span); let (ty_snip, appl) = if let Ok(snip) = ty_snip { (snip, Applicability::MachineApplicable) @@ -637,20 +653,22 @@ impl EarlyLintPass for AnonymousParameters { ANONYMOUS_PARAMETERS, arg.pat.span, "anonymous parameters are deprecated and will be \ - removed in the next edition." - ).span_suggestion( + removed in the next edition.", + ) + .span_suggestion( arg.pat.span, - "Try naming the parameter or explicitly \ + "try naming the parameter or explicitly \ ignoring it", format!("_: {}", ty_snip), - appl - ).emit(); + appl, + ) + .emit(); } } _ => (), } } - }, + } _ => (), } } @@ -668,9 +686,7 @@ impl_lint_pass!(DeprecatedAttr => []); impl DeprecatedAttr { pub fn new() -> DeprecatedAttr { - DeprecatedAttr { - depr_attrs: deprecated_attributes(), - } + DeprecatedAttr { depr_attrs: deprecated_attributes() } } } @@ -685,7 +701,7 @@ fn lint_deprecated_attr( attr.span, suggestion.unwrap_or("remove this attribute"), String::new(), - Applicability::MachineApplicable + Applicability::MachineApplicable, ) .emit(); } @@ -694,12 +710,15 @@ impl EarlyLintPass for DeprecatedAttr { fn check_attribute(&mut self, cx: &EarlyContext<'_>, attr: &ast::Attribute) { for &&(n, _, _, ref g) in &self.depr_attrs { if attr.ident().map(|ident| ident.name) == Some(n) { - if let &AttributeGate::Gated(Stability::Deprecated(link, suggestion), - ref name, - ref reason, - _) = g { - let msg = format!("use of deprecated attribute `{}`: {}. See {}", - name, reason, link); + if let &AttributeGate::Gated( + Stability::Deprecated(link, suggestion), + ref name, + ref reason, + _, + ) = g + { + let msg = + format!("use of deprecated attribute `{}`: {}. See {}", name, reason, link); lint_deprecated_attr(cx, attr, &msg, suggestion); } return; @@ -728,7 +747,7 @@ impl UnusedDocComment { node_span: Span, node_kind: &str, is_macro_expansion: bool, - attrs: &[ast::Attribute] + attrs: &[ast::Attribute], ) { let mut attrs = attrs.into_iter().peekable(); @@ -738,10 +757,7 @@ impl UnusedDocComment { while let Some(attr) = attrs.next() { if attr.is_doc_comment() { sugared_span = Some( - sugared_span.map_or_else( - || attr.span, - |span| span.with_hi(attr.span.hi()), - ), + sugared_span.map_or_else(|| attr.span, |span| span.with_hi(attr.span.hi())), ); } @@ -751,17 +767,19 @@ impl UnusedDocComment { let span = sugared_span.take().unwrap_or_else(|| attr.span); - if attr.check_name(sym::doc) { + if attr.is_doc_comment() || attr.check_name(sym::doc) { let mut err = cx.struct_span_lint(UNUSED_DOC_COMMENTS, span, "unused doc comment"); err.span_label( node_span, - format!("rustdoc does not generate documentation for {}", node_kind) + format!("rustdoc does not generate documentation for {}", node_kind), ); if is_macro_expansion { - err.help("to document an item produced by a macro, \ - the macro must produce the documentation as part of its expansion"); + err.help( + "to document an item produced by a macro, \ + the macro must produce the documentation as part of its expansion", + ); } err.emit(); @@ -783,8 +801,7 @@ impl EarlyLintPass for UnusedDocComment { ast::StmtKind::Item(..) => ("inner items", false), ast::StmtKind::Mac(..) => ("macro expansions", true), // expressions will be reported by `check_expr`. - ast::StmtKind::Semi(..) | - ast::StmtKind::Expr(..) => return, + ast::StmtKind::Semi(..) | ast::StmtKind::Expr(..) => return, }; self.warn_if_doc(cx, stmt.span, kind, is_macro_expansion, stmt.kind.attrs()); @@ -815,15 +832,14 @@ declare_lint! { declare_lint_pass!(InvalidNoMangleItems => [NO_MANGLE_CONST_ITEMS, NO_MANGLE_GENERIC_ITEMS]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems { - fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item<'_>) { match it.kind { hir::ItemKind::Fn(.., ref generics, _) => { if let Some(no_mangle_attr) = attr::find_by_name(&it.attrs, sym::no_mangle) { - for param in &generics.params { + for param in generics.params { match param.kind { GenericParamKind::Lifetime { .. } => {} - GenericParamKind::Type { .. } | - GenericParamKind::Const { .. } => { + GenericParamKind::Type { .. } | GenericParamKind::Const { .. } => { let mut err = cx.struct_span_lint( NO_MANGLE_GENERIC_ITEMS, it.span, @@ -835,7 +851,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems { String::new(), // Use of `#[no_mangle]` suggests FFI intent; correct // fix may be to monomorphize source by hand - Applicability::MaybeIncorrect + Applicability::MaybeIncorrect, ); err.emit(); break; @@ -852,7 +868,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems { let mut err = cx.struct_span_lint(NO_MANGLE_CONST_ITEMS, it.span, msg); // account for "pub const" (#45562) - let start = cx.tcx.sess.source_map().span_to_snippet(it.span) + let start = cx + .tcx + .sess + .source_map() + .span_to_snippet(it.span) .map(|snippet| snippet.find("const").unwrap_or(0)) .unwrap_or(0) as u32; // `const` is 5 chars @@ -861,7 +881,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems { const_span, "try a static value", "pub static".to_owned(), - Applicability::MachineApplicable + Applicability::MachineApplicable, ); err.emit(); } @@ -880,25 +900,24 @@ declare_lint! { declare_lint_pass!(MutableTransmutes => [MUTABLE_TRANSMUTES]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MutableTransmutes { - fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &hir::Expr) { + fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>) { use rustc_target::spec::abi::Abi::RustIntrinsic; let msg = "mutating transmuted &mut T from &T may cause undefined behavior, \ consider instead using an UnsafeCell"; match get_transmute_from_to(cx, expr).map(|(ty1, ty2)| (&ty1.kind, &ty2.kind)) { Some((&ty::Ref(_, _, from_mt), &ty::Ref(_, _, to_mt))) => { - if to_mt == hir::Mutability::Mutable && - from_mt == hir::Mutability::Immutable { + if to_mt == hir::Mutability::Mut && from_mt == hir::Mutability::Not { cx.span_lint(MUTABLE_TRANSMUTES, expr.span, msg); } } _ => (), } - fn get_transmute_from_to<'a, 'tcx> - (cx: &LateContext<'a, 'tcx>, - expr: &hir::Expr) - -> Option<(Ty<'tcx>, Ty<'tcx>)> { + fn get_transmute_from_to<'a, 'tcx>( + cx: &LateContext<'a, 'tcx>, + expr: &hir::Expr<'_>, + ) -> Option<(Ty<'tcx>, Ty<'tcx>)> { let def = if let hir::ExprKind::Path(ref qpath) = expr.kind { cx.tables.qpath_res(qpath, expr.hir_id) } else { @@ -917,8 +936,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MutableTransmutes { } fn def_id_is_transmute(cx: &LateContext<'_, '_>, def_id: DefId) -> bool { - cx.tcx.fn_sig(def_id).abi() == RustIntrinsic && - cx.tcx.item_name(def_id) == sym::transmute + cx.tcx.fn_sig(def_id).abi() == RustIntrinsic + && cx.tcx.item_name(def_id) == sym::transmute } } } @@ -958,8 +977,15 @@ declare_lint_pass!( ); impl UnreachablePub { - fn perform_lint(&self, cx: &LateContext<'_, '_>, what: &str, id: hir::HirId, - vis: &hir::Visibility, span: Span, exportable: bool) { + fn perform_lint( + &self, + cx: &LateContext<'_, '_>, + what: &str, + id: hir::HirId, + vis: &hir::Visibility<'_>, + span: Span, + exportable: bool, + ) { let mut applicability = Applicability::MachineApplicable; match vis.node { hir::VisibilityKind::Public if !cx.access_levels.is_reachable(id) => { @@ -967,13 +993,17 @@ impl UnreachablePub { applicability = Applicability::MaybeIncorrect; } let def_span = cx.tcx.sess.source_map().def_span(span); - let mut err = cx.struct_span_lint(UNREACHABLE_PUB, def_span, - &format!("unreachable `pub` {}", what)); + let mut err = cx.struct_span_lint( + UNREACHABLE_PUB, + def_span, + &format!("unreachable `pub` {}", what), + ); let replacement = if cx.tcx.features().crate_visibility_modifier { "crate" } else { "pub(crate)" - }.to_owned(); + } + .to_owned(); err.span_suggestion( vis.span, @@ -985,27 +1015,37 @@ impl UnreachablePub { err.help("or consider exporting it for use by other crates"); } err.emit(); - }, + } _ => {} } } } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnreachablePub { - fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item<'_>) { self.perform_lint(cx, "item", item.hir_id, &item.vis, item.span, true); } - fn check_foreign_item(&mut self, cx: &LateContext<'_, '_>, foreign_item: &hir::ForeignItem) { - self.perform_lint(cx, "item", foreign_item.hir_id, &foreign_item.vis, - foreign_item.span, true); + fn check_foreign_item( + &mut self, + cx: &LateContext<'_, '_>, + foreign_item: &hir::ForeignItem<'tcx>, + ) { + self.perform_lint( + cx, + "item", + foreign_item.hir_id, + &foreign_item.vis, + foreign_item.span, + true, + ); } - fn check_struct_field(&mut self, cx: &LateContext<'_, '_>, field: &hir::StructField) { + fn check_struct_field(&mut self, cx: &LateContext<'_, '_>, field: &hir::StructField<'_>) { self.perform_lint(cx, "field", field.hir_id, &field.vis, field.span, false); } - fn check_impl_item(&mut self, cx: &LateContext<'_, '_>, impl_item: &hir::ImplItem) { + fn check_impl_item(&mut self, cx: &LateContext<'_, '_>, impl_item: &hir::ImplItem<'_>) { self.perform_lint(cx, "item", impl_item.hir_id, &impl_item.vis, impl_item.span, false); } } @@ -1024,44 +1064,45 @@ declare_lint_pass!( ); impl TypeAliasBounds { - fn is_type_variable_assoc(qpath: &hir::QPath) -> bool { + fn is_type_variable_assoc(qpath: &hir::QPath<'_>) -> bool { match *qpath { hir::QPath::TypeRelative(ref ty, _) => { // If this is a type variable, we found a `T::Assoc`. match ty.kind { - hir::TyKind::Path(hir::QPath::Resolved(None, ref path)) => { - match path.res { - Res::Def(DefKind::TyParam, _) => true, - _ => false - } - } - _ => false + hir::TyKind::Path(hir::QPath::Resolved(None, ref path)) => match path.res { + Res::Def(DefKind::TyParam, _) => true, + _ => false, + }, + _ => false, } } hir::QPath::Resolved(..) => false, } } - fn suggest_changing_assoc_types(ty: &hir::Ty, err: &mut DiagnosticBuilder<'_>) { + fn suggest_changing_assoc_types(ty: &hir::Ty<'_>, err: &mut DiagnosticBuilder<'_>) { // Access to associates types should use `::Assoc`, which does not need a // bound. Let's see if this type does that. // We use a HIR visitor to walk the type. - use rustc::hir::intravisit::{self, Visitor}; + use rustc_hir::intravisit::{self, Visitor}; struct WalkAssocTypes<'a, 'db> { - err: &'a mut DiagnosticBuilder<'db> + err: &'a mut DiagnosticBuilder<'db>, } impl<'a, 'db, 'v> Visitor<'v> for WalkAssocTypes<'a, 'db> { - fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'v> - { + type Map = Map<'v>; + + fn nested_visit_map(&mut self) -> intravisit::NestedVisitorMap<'_, Self::Map> { intravisit::NestedVisitorMap::None } - fn visit_qpath(&mut self, qpath: &'v hir::QPath, id: hir::HirId, span: Span) { + fn visit_qpath(&mut self, qpath: &'v hir::QPath<'v>, id: hir::HirId, span: Span) { if TypeAliasBounds::is_type_variable_assoc(qpath) { - self.err.span_help(span, + self.err.span_help( + span, "use fully disambiguated paths (i.e., `::Assoc`) to refer to \ - associated types in type aliases"); + associated types in type aliases", + ); } intravisit::walk_qpath(self, qpath, id, span) } @@ -1074,7 +1115,7 @@ impl TypeAliasBounds { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypeAliasBounds { - fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::Item<'_>) { let (ty, type_alias_generics) = match item.kind { hir::ItemKind::TyAlias(ref ty, ref generics) => (&*ty, generics), _ => return, @@ -1082,10 +1123,17 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypeAliasBounds { let mut suggested_changing_assoc_types = false; // There must not be a where clause if !type_alias_generics.where_clause.predicates.is_empty() { - let spans : Vec<_> = type_alias_generics.where_clause.predicates.iter() - .map(|pred| pred.span()).collect(); - let mut err = cx.struct_span_lint(TYPE_ALIAS_BOUNDS, spans, - "where clauses are not enforced in type aliases"); + let spans: Vec<_> = type_alias_generics + .where_clause + .predicates + .iter() + .map(|pred| pred.span()) + .collect(); + let mut err = cx.struct_span_lint( + TYPE_ALIAS_BOUNDS, + spans, + "where clauses are not enforced in type aliases", + ); err.span_suggestion( type_alias_generics.where_clause.span_for_predicates_or_empty_place(), "the clause will not be checked when the type alias is used, and should be removed", @@ -1101,10 +1149,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypeAliasBounds { // The parameters must not have bounds for param in type_alias_generics.params.iter() { let spans: Vec<_> = param.bounds.iter().map(|b| b.span()).collect(); - let suggestion = spans.iter().map(|sp| { - let start = param.span.between(*sp); // Include the `:` in `T: Bound`. - (start.to(*sp), String::new()) - }).collect(); + let suggestion = spans + .iter() + .map(|sp| { + let start = param.span.between(*sp); // Include the `:` in `T: Bound`. + (start.to(*sp), String::new()) + }) + .collect(); if !spans.is_empty() { let mut err = cx.struct_span_lint( TYPE_ALIAS_BOUNDS, @@ -1134,31 +1185,21 @@ declare_lint_pass!( fn check_const(cx: &LateContext<'_, '_>, body_id: hir::BodyId) { let def_id = cx.tcx.hir().body_owner_def_id(body_id); - let param_env = if cx.tcx.is_static(def_id) { - // Use the same param_env as `codegen_static_initializer`, to reuse the cache. - ty::ParamEnv::reveal_all() - } else { - cx.tcx.param_env(def_id) - }; - let cid = ::rustc::mir::interpret::GlobalId { - instance: ty::Instance::mono(cx.tcx, def_id), - promoted: None - }; // trigger the query once for all constants since that will already report the errors // FIXME: Use ensure here - let _ = cx.tcx.const_eval(param_env.and(cid)); + let _ = cx.tcx.const_eval_poly(def_id); } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedBrokenConst { - fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item<'_>) { match it.kind { hir::ItemKind::Const(_, body_id) => { check_const(cx, body_id); - }, + } hir::ItemKind::Static(_, _, body_id) => { check_const(cx, body_id); - }, - _ => {}, + } + _ => {} } } } @@ -1176,11 +1217,7 @@ declare_lint_pass!( ); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TrivialConstraints { - fn check_item( - &mut self, - cx: &LateContext<'a, 'tcx>, - item: &'tcx hir::Item, - ) { + fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::Item<'tcx>) { use rustc::ty::fold::TypeFoldable; use rustc::ty::Predicate::*; @@ -1207,8 +1244,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TrivialConstraints { cx.span_lint( TRIVIAL_BOUNDS, span, - &format!("{} bound {} does not depend on any type \ - or lifetime parameters", predicate_kind_name, predicate), + &format!( + "{} bound {} does not depend on any type \ + or lifetime parameters", + predicate_kind_name, predicate + ), ); } } @@ -1258,18 +1298,20 @@ impl EarlyLintPass for EllipsisInclusiveRangePatterns { fn check_pat(&mut self, cx: &EarlyContext<'_>, pat: &ast::Pat) { if self.node_id.is_some() { // Don't recursively warn about patterns inside range endpoints. - return + return; } use self::ast::{PatKind, RangeEnd, RangeSyntax::DotDotDot}; /// If `pat` is a `...` pattern, return the start and end of the range, as well as the span /// corresponding to the ellipsis. - fn matches_ellipsis_pat(pat: &ast::Pat) -> Option<(&P, &P, Span)> { + fn matches_ellipsis_pat(pat: &ast::Pat) -> Option<(Option<&Expr>, &Expr, Span)> { match &pat.kind { - PatKind::Range(a, b, Spanned { span, node: RangeEnd::Included(DotDotDot), .. }) => { - Some((a, b, *span)) - } + PatKind::Range( + a, + Some(b), + Spanned { span, node: RangeEnd::Included(DotDotDot) }, + ) => Some((a.as_deref(), b, *span)), _ => None, } } @@ -1284,11 +1326,16 @@ impl EarlyLintPass for EllipsisInclusiveRangePatterns { let suggestion = "use `..=` for an inclusive range"; if parenthesise { self.node_id = Some(pat.id); + let end = expr_to_string(&end); + let replace = match start { + Some(start) => format!("&({}..={})", expr_to_string(&start), end), + None => format!("&(..={})", end), + }; let mut err = cx.struct_span_lint(ELLIPSIS_INCLUSIVE_RANGE_PATTERNS, pat.span, msg); err.span_suggestion( pat.span, suggestion, - format!("&({}..={})", expr_to_string(&start), expr_to_string(&end)), + replace, Applicability::MachineApplicable, ); err.emit(); @@ -1330,18 +1377,15 @@ impl_lint_pass!(UnnameableTestItems => [UNNAMEABLE_TEST_ITEMS]); impl UnnameableTestItems { pub fn new() -> Self { - Self { - boundary: hir::DUMMY_HIR_ID, - items_nameable: true - } + Self { boundary: hir::DUMMY_HIR_ID, items_nameable: true } } } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnnameableTestItems { - fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item<'_>) { if self.items_nameable { - if let hir::ItemKind::Mod(..) = it.kind {} - else { + if let hir::ItemKind::Mod(..) = it.kind { + } else { self.items_nameable = false; self.boundary = it.hir_id; } @@ -1349,15 +1393,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnnameableTestItems { } if let Some(attr) = attr::find_by_name(&it.attrs, sym::rustc_test_marker) { - cx.struct_span_lint( - UNNAMEABLE_TEST_ITEMS, - attr.span, - "cannot test inner items", - ).emit(); + cx.struct_span_lint(UNNAMEABLE_TEST_ITEMS, attr.span, "cannot test inner items").emit(); } } - fn check_item_post(&mut self, _cx: &LateContext<'_, '_>, it: &hir::Item) { + fn check_item_post(&mut self, _cx: &LateContext<'_, '_>, it: &hir::Item<'_>) { if !self.items_nameable && self.boundary == it.hir_id { self.items_nameable = true; } @@ -1386,21 +1426,22 @@ impl KeywordIdents { for tt in tokens.into_trees() { match tt { // Only report non-raw idents. - TokenTree::Token(token) => if let Some((ident, false)) = token.ident() { - self.check_ident_token(cx, UnderMacro(true), ident); + TokenTree::Token(token) => { + if let Some((ident, false)) = token.ident() { + self.check_ident_token(cx, UnderMacro(true), ident); + } } - TokenTree::Delimited(_, _, tts) => { - self.check_tokens(cx, tts) - }, + TokenTree::Delimited(_, _, tts) => self.check_tokens(cx, tts), } } } - fn check_ident_token(&mut self, - cx: &EarlyContext<'_>, - UnderMacro(under_macro): UnderMacro, - ident: ast::Ident) - { + fn check_ident_token( + &mut self, + cx: &EarlyContext<'_>, + UnderMacro(under_macro): UnderMacro, + ident: ast::Ident, + ) { let next_edition = match cx.sess.edition() { Edition::Edition2015 => { match ident.name { @@ -1467,46 +1508,45 @@ impl ExplicitOutlivesRequirements { inferred_outlives: &'tcx [(ty::Predicate<'tcx>, Span)], index: u32, ) -> Vec> { - inferred_outlives.iter().filter_map(|(pred, _)| { - match pred { + inferred_outlives + .iter() + .filter_map(|(pred, _)| match pred { ty::Predicate::RegionOutlives(outlives) => { let outlives = outlives.skip_binder(); match outlives.0 { - ty::ReEarlyBound(ebr) if ebr.index == index => { - Some(outlives.1) - } + ty::ReEarlyBound(ebr) if ebr.index == index => Some(outlives.1), _ => None, } } - _ => None - } - }).collect() + _ => None, + }) + .collect() } fn lifetimes_outliving_type<'tcx>( inferred_outlives: &'tcx [(ty::Predicate<'tcx>, Span)], index: u32, ) -> Vec> { - inferred_outlives.iter().filter_map(|(pred, _)| { - match pred { + inferred_outlives + .iter() + .filter_map(|(pred, _)| match pred { ty::Predicate::TypeOutlives(outlives) => { let outlives = outlives.skip_binder(); outlives.0.is_param(index).then_some(outlives.1) } - _ => None - } - }).collect() + _ => None, + }) + .collect() } fn collect_outlived_lifetimes<'tcx>( &self, - param: &'tcx hir::GenericParam, + param: &'tcx hir::GenericParam<'tcx>, tcx: TyCtxt<'tcx>, inferred_outlives: &'tcx [(ty::Predicate<'tcx>, Span)], ty_generics: &'tcx ty::Generics, ) -> Vec> { - let index = ty_generics.param_def_id_to_index[ - &tcx.hir().local_def_id(param.hir_id)]; + let index = ty_generics.param_def_id_to_index[&tcx.hir().local_def_id(param.hir_id)]; match param.kind { hir::GenericParamKind::Lifetime { .. } => { @@ -1519,11 +1559,10 @@ impl ExplicitOutlivesRequirements { } } - fn collect_outlives_bound_spans<'tcx>( &self, tcx: TyCtxt<'tcx>, - bounds: &hir::GenericBounds, + bounds: &hir::GenericBounds<'_>, inferred_outlives: &[ty::Region<'tcx>], infer_static: bool, ) -> Vec<(usize, Span)> { @@ -1535,19 +1574,12 @@ impl ExplicitOutlivesRequirements { .filter_map(|(i, bound)| { if let hir::GenericBound::Outlives(lifetime) = bound { let is_inferred = match tcx.named_region(lifetime.hir_id) { - Some(Region::Static) if infer_static => { - inferred_outlives.iter() - .any(|r| if let ty::ReStatic = r { true } else { false }) - } - Some(Region::EarlyBound(index, ..)) => inferred_outlives + Some(Region::Static) if infer_static => inferred_outlives .iter() - .any(|r| { - if let ty::ReEarlyBound(ebr) = r { - ebr.index == index - } else { - false - } - }), + .any(|r| if let ty::ReStatic = r { true } else { false }), + Some(Region::EarlyBound(index, ..)) => inferred_outlives.iter().any(|r| { + if let ty::ReEarlyBound(ebr) = r { ebr.index == index } else { false } + }), _ => false, }; is_inferred.then_some((i, bound.span())) @@ -1561,14 +1593,14 @@ impl ExplicitOutlivesRequirements { fn consolidate_outlives_bound_spans( &self, lo: Span, - bounds: &hir::GenericBounds, - bound_spans: Vec<(usize, Span)> + bounds: &hir::GenericBounds<'_>, + bound_spans: Vec<(usize, Span)>, ) -> Vec { if bounds.is_empty() { return Vec::new(); } if bound_spans.len() == bounds.len() { - let (_, last_bound_span) = bound_spans[bound_spans.len()-1]; + let (_, last_bound_span) = bound_spans[bound_spans.len() - 1]; // If all bounds are inferable, we want to delete the colon, so // start from just after the parameter (span passed as argument) vec![lo.to(last_bound_span)] @@ -1583,14 +1615,14 @@ impl ExplicitOutlivesRequirements { None if i == 0 => { merged.push(bound_span.to(bounds[1].span().shrink_to_lo())); last_merged_i = Some(0); - }, + } // If consecutive bounds are inferable, merge their spans - Some(h) if i == h+1 => { + Some(h) if i == h + 1 => { if let Some(tail) = merged.last_mut() { // Also eat the trailing `+` if the first // more-than-one bound is inferable let to_span = if from_start && i < bounds.len() { - bounds[i+1].span().shrink_to_lo() + bounds[i + 1].span().shrink_to_lo() } else { bound_span }; @@ -1599,13 +1631,13 @@ impl ExplicitOutlivesRequirements { } else { bug!("another bound-span visited earlier"); } - }, + } _ => { // When we find a non-inferable bound, subsequent inferable bounds // won't be consecutive from the start (and we'll eat the leading // `+` rather than the trailing one) from_start = false; - merged.push(bounds[i-1].span().shrink_to_hi().to(bound_span)); + merged.push(bounds[i - 1].span().shrink_to_hi().to(bound_span)); last_merged_i = Some(i); } } @@ -1616,14 +1648,14 @@ impl ExplicitOutlivesRequirements { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExplicitOutlivesRequirements { - fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::Item) { + fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::Item<'_>) { use rustc::middle::resolve_lifetime::Region; let infer_static = cx.tcx.features().infer_static_outlives_requirements; let def_id = cx.tcx.hir().local_def_id(item.hir_id); if let hir::ItemKind::Struct(_, ref hir_generics) - | hir::ItemKind::Enum(_, ref hir_generics) - | hir::ItemKind::Union(_, ref hir_generics) = item.kind + | hir::ItemKind::Enum(_, ref hir_generics) + | hir::ItemKind::Union(_, ref hir_generics) = item.kind { let inferred_outlives = cx.tcx.inferred_outlives_of(def_id); if inferred_outlives.is_empty() { @@ -1635,37 +1667,32 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExplicitOutlivesRequirements { let mut bound_count = 0; let mut lint_spans = Vec::new(); - for param in &hir_generics.params { + for param in hir_generics.params { let has_lifetime_bounds = param.bounds.iter().any(|bound| { - if let hir::GenericBound::Outlives(_) = bound { - true - } else { - false - } + if let hir::GenericBound::Outlives(_) = bound { true } else { false } }); if !has_lifetime_bounds { continue; } - let relevant_lifetimes = self.collect_outlived_lifetimes( - param, - cx.tcx, - inferred_outlives, - ty_generics, - ); + let relevant_lifetimes = + self.collect_outlived_lifetimes(param, cx.tcx, inferred_outlives, ty_generics); if relevant_lifetimes.is_empty() { continue; } let bound_spans = self.collect_outlives_bound_spans( - cx.tcx, ¶m.bounds, &relevant_lifetimes, infer_static, + cx.tcx, + ¶m.bounds, + &relevant_lifetimes, + infer_static, ); bound_count += bound_spans.len(); - lint_spans.extend( - self.consolidate_outlives_bound_spans( - param.span.shrink_to_hi(), ¶m.bounds, bound_spans - ) - ); + lint_spans.extend(self.consolidate_outlives_bound_spans( + param.span.shrink_to_hi(), + ¶m.bounds, + bound_spans, + )); } let mut where_lint_spans = Vec::new(); @@ -1674,8 +1701,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExplicitOutlivesRequirements { for (i, where_predicate) in hir_generics.where_clause.predicates.iter().enumerate() { let (relevant_lifetimes, bounds, span) = match where_predicate { hir::WherePredicate::RegionPredicate(predicate) => { - if let Some(Region::EarlyBound(index, ..)) - = cx.tcx.named_region(predicate.lifetime.hir_id) + if let Some(Region::EarlyBound(index, ..)) = + cx.tcx.named_region(predicate.lifetime.hir_id) { ( Self::lifetimes_outliving_lifetime(inferred_outlives, index), @@ -1690,10 +1717,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExplicitOutlivesRequirements { // FIXME we can also infer bounds on associated types, // and should check for them here. match predicate.bounded_ty.kind { - hir::TyKind::Path(hir::QPath::Resolved( - None, - ref path, - )) => { + hir::TyKind::Path(hir::QPath::Resolved(None, ref path)) => { if let Res::Def(DefKind::TyParam, def_id) = path.res { let index = ty_generics.param_def_id_to_index[&def_id]; ( @@ -1704,8 +1728,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExplicitOutlivesRequirements { } else { continue; } - }, - _ => { continue; } + } + _ => { + continue; + } } } _ => continue, @@ -1715,7 +1741,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExplicitOutlivesRequirements { } let bound_spans = self.collect_outlives_bound_spans( - cx.tcx, bounds, &relevant_lifetimes, infer_static, + cx.tcx, + bounds, + &relevant_lifetimes, + infer_static, ); bound_count += bound_spans.len(); @@ -1728,38 +1757,33 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExplicitOutlivesRequirements { // further predicates, we want to eat the trailing comma. if drop_predicate && i + 1 < num_predicates { let next_predicate_span = hir_generics.where_clause.predicates[i + 1].span(); - where_lint_spans.push( - span.to(next_predicate_span.shrink_to_lo()) - ); + where_lint_spans.push(span.to(next_predicate_span.shrink_to_lo())); } else { - where_lint_spans.extend( - self.consolidate_outlives_bound_spans( - span.shrink_to_lo(), - bounds, - bound_spans - ) - ); + where_lint_spans.extend(self.consolidate_outlives_bound_spans( + span.shrink_to_lo(), + bounds, + bound_spans, + )); } } // If all predicates are inferable, drop the entire clause // (including the `where`) if num_predicates > 0 && dropped_predicate_count == num_predicates { - let where_span = hir_generics.where_clause.span() + let where_span = hir_generics + .where_clause + .span() .expect("span of (nonempty) where clause should exist"); // Extend the where clause back to the closing `>` of the // generics, except for tuple struct, which have the `where` // after the fields of the struct. - let full_where_span = if let hir::ItemKind::Struct(hir::VariantData::Tuple(..), _) - = item.kind - { - where_span - } else { - hir_generics.span.shrink_to_hi().to(where_span) - }; - lint_spans.push( - full_where_span - ); + let full_where_span = + if let hir::ItemKind::Struct(hir::VariantData::Tuple(..), _) = item.kind { + where_span + } else { + hir_generics.span.shrink_to_hi().to(where_span) + }; + lint_spans.push(full_where_span); } else { lint_spans.extend(where_lint_spans); } @@ -1768,16 +1792,12 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExplicitOutlivesRequirements { let mut err = cx.struct_span_lint( EXPLICIT_OUTLIVES_REQUIREMENTS, lint_spans.clone(), - "outlives requirements can be inferred" + "outlives requirements can be inferred", ); err.multipart_suggestion( - if bound_count == 1 { - "remove this bound" - } else { - "remove these bounds" - }, + if bound_count == 1 { "remove this bound" } else { "remove these bounds" }, lint_spans.into_iter().map(|span| (span, "".to_owned())).collect::>(), - Applicability::MachineApplicable + Applicability::MachineApplicable, ); err.emit(); } @@ -1792,15 +1812,17 @@ declare_lint! { } declare_lint_pass!( - /// Check for used feature gates in `INCOMPLETE_FEATURES` in `feature_gate.rs`. + /// Check for used feature gates in `INCOMPLETE_FEATURES` in `librustc_feature/active.rs`. IncompleteFeatures => [INCOMPLETE_FEATURES] ); impl EarlyLintPass for IncompleteFeatures { fn check_crate(&mut self, cx: &EarlyContext<'_>, _: &ast::Crate) { let features = cx.sess.features_untracked(); - features.declared_lang_features - .iter().map(|(name, span, _)| (name, span)) + features + .declared_lang_features + .iter() + .map(|(name, span, _)| (name, span)) .chain(features.declared_lib_features.iter().map(|(name, span)| (name, span))) .filter(|(name, _)| rustc_feature::INCOMPLETE_FEATURES.iter().any(|f| name == &f)) .for_each(|(name, &span)| { @@ -1810,7 +1832,7 @@ impl EarlyLintPass for IncompleteFeatures { &format!( "the feature `{}` is incomplete and may cause the compiler to crash", name, - ) + ), ) .emit(); }); @@ -1826,35 +1848,36 @@ declare_lint! { declare_lint_pass!(InvalidValue => [INVALID_VALUE]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { - fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &hir::Expr) { - + fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &hir::Expr<'_>) { #[derive(Debug, Copy, Clone, PartialEq)] - enum InitKind { Zeroed, Uninit }; + enum InitKind { + Zeroed, + Uninit, + }; /// Information about why a type cannot be initialized this way. /// Contains an error message and optionally a span to point at. type InitError = (String, Option); /// Test if this constant is all-0. - fn is_zero(expr: &hir::Expr) -> bool { + fn is_zero(expr: &hir::Expr<'_>) -> bool { use hir::ExprKind::*; use syntax::ast::LitKind::*; match &expr.kind { - Lit(lit) => + Lit(lit) => { if let Int(i, _) = lit.node { i == 0 } else { false - }, - Tup(tup) => - tup.iter().all(is_zero), - _ => - false + } + } + Tup(tup) => tup.iter().all(is_zero), + _ => false, } } /// Determine if this expression is a "dangerous initialization". - fn is_dangerous_init(cx: &LateContext<'_, '_>, expr: &hir::Expr) -> Option { + fn is_dangerous_init(cx: &LateContext<'_, '_>, expr: &hir::Expr<'_>) -> Option { // `transmute` is inside an anonymous module (the `extern` block?); // `Invalid` represents the empty string and matches that. // FIXME(#66075): use diagnostic items. Somehow, that does not seem to work @@ -1885,7 +1908,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { // See if the `self` parameter is one of the dangerous constructors. if let hir::ExprKind::Call(ref path_expr, _) = args[0].kind { if let hir::ExprKind::Path(ref qpath) = path_expr.kind { - let def_id = cx.tables.qpath_res(qpath, path_expr.hir_id).opt_def_id()?; + let def_id = + cx.tables.qpath_res(qpath, path_expr.hir_id).opt_def_id()?; if cx.tcx.is_diagnostic_item(sym::maybe_uninit_zeroed, def_id) { return Some(InitKind::Zeroed); @@ -1910,17 +1934,22 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { use rustc::ty::TyKind::*; match ty.kind { // Primitive types that don't like 0 as a value. - Ref(..) => Some((format!("References must be non-null"), None)), + Ref(..) => Some((format!("references must be non-null"), None)), Adt(..) if ty.is_box() => Some((format!("`Box` must be non-null"), None)), - FnPtr(..) => Some((format!("Function pointers must be non-null"), None)), - Never => Some((format!("The never type (`!`) has no valid value"), None)), - RawPtr(tm) if matches!(tm.ty.kind, Dynamic(..)) => // raw ptr to dyn Trait - Some((format!("The vtable of a wide raw pointer must be non-null"), None)), + FnPtr(..) => Some((format!("function pointers must be non-null"), None)), + Never => Some((format!("the `!` type has no valid value"), None)), + RawPtr(tm) if matches!(tm.ty.kind, Dynamic(..)) => + // raw ptr to dyn Trait + { + Some((format!("the vtable of a wide raw pointer must be non-null"), None)) + } // Primitive types with other constraints. - Bool if init == InitKind::Uninit => - Some((format!("Booleans must be `true` or `false`"), None)), - Char if init == InitKind::Uninit => - Some((format!("Characters must be a valid unicode codepoint"), None)), + Bool if init == InitKind::Uninit => { + Some((format!("booleans must be either `true` or `false`"), None)) + } + Char if init == InitKind::Uninit => { + Some((format!("characters must be a valid Unicode codepoint"), None)) + } // Recurse and checks for some compound types. Adt(adt_def, substs) if !adt_def.is_union() => { // First check f this ADT has a layout attribute (like `NonNull` and friends). @@ -1929,39 +1958,49 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { // We exploit here that `layout_scalar_valid_range` will never // return `Bound::Excluded`. (And we have tests checking that we // handle the attribute correctly.) - (Bound::Included(lo), _) if lo > 0 => - return Some((format!("{} must be non-null", ty), None)), + (Bound::Included(lo), _) if lo > 0 => { + return Some((format!("`{}` must be non-null", ty), None)); + } (Bound::Included(_), _) | (_, Bound::Included(_)) - if init == InitKind::Uninit => + if init == InitKind::Uninit => + { return Some(( - format!("{} must be initialized inside its custom valid range", ty), + format!( + "`{}` must be initialized inside its custom valid range", + ty, + ), None, - )), + )); + } _ => {} } // Now, recurse. match adt_def.variants.len() { - 0 => Some((format!("0-variant enums have no valid value"), None)), + 0 => Some((format!("enums with no variants have no valid value"), None)), 1 => { // Struct, or enum with exactly one variant. // Proceed recursively, check all fields. let variant = &adt_def.variants[VariantIdx::from_u32(0)]; variant.fields.iter().find_map(|field| { - ty_find_init_error( - tcx, - field.ty(tcx, substs), - init, - ).map(|(mut msg, span)| if span.is_none() { - // Point to this field, should be helpful for figuring - // out where the source of the error is. - let span = tcx.def_span(field.did); - write!(&mut msg, " (in this {} field)", adt_def.descr()) - .unwrap(); - (msg, Some(span)) - } else { - // Just forward. - (msg, span) - }) + ty_find_init_error(tcx, field.ty(tcx, substs), init).map( + |(mut msg, span)| { + if span.is_none() { + // Point to this field, should be helpful for figuring + // out where the source of the error is. + let span = tcx.def_span(field.did); + write!( + &mut msg, + " (in this {} field)", + adt_def.descr() + ) + .unwrap(); + (msg, Some(span)) + } else { + // Just forward. + (msg, span) + } + }, + ) }) } // Multi-variant enums are tricky: if all but one variant are @@ -1997,10 +2036,12 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue { }, ), ); - err.span_label(expr.span, - "this code causes undefined behavior when executed"); - err.span_label(expr.span, "help: use `MaybeUninit` instead, \ - and only call `assume_init` after initialization is done"); + err.span_label(expr.span, "this code causes undefined behavior when executed"); + err.span_label( + expr.span, + "help: use `MaybeUninit` instead, \ + and only call `assume_init` after initialization is done", + ); if let Some(span) = span { err.span_note(span, &msg); } else { diff --git a/src/librustc_lint/context.rs b/src/librustc_lint/context.rs new file mode 100644 index 0000000000..3b8cce5635 --- /dev/null +++ b/src/librustc_lint/context.rs @@ -0,0 +1,841 @@ +//! Implementation of lint checking. +//! +//! The lint checking is mostly consolidated into one pass which runs +//! after all other analyses. Throughout compilation, lint warnings +//! can be added via the `add_lint` method on the Session structure. This +//! requires a span and an ID of the node that the lint is being added to. The +//! lint isn't actually emitted at that time because it is unknown what the +//! actual lint level at that location is. +//! +//! To actually emit lint warnings/errors, a separate pass is used. +//! A context keeps track of the current state of all lint levels. +//! Upon entering a node of the ast which can modify the lint settings, the +//! previous lint state is pushed onto a stack and the ast is then recursed +//! upon. As the ast is traversed, this keeps track of the current lint level +//! for all lint attributes. + +use self::TargetLint::*; + +use crate::levels::LintLevelsBuilder; +use crate::passes::{EarlyLintPassObject, LateLintPassObject}; +use rustc::hir::map::definitions::{DefPathData, DisambiguatedDefPathData}; +use rustc::lint::add_elided_lifetime_in_path_suggestion; +use rustc::middle::privacy::AccessLevels; +use rustc::middle::stability; +use rustc::ty::layout::{LayoutError, LayoutOf, TyLayout}; +use rustc::ty::{self, print::Printer, subst::GenericArg, Ty, TyCtxt}; +use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::sync; +use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder}; +use rustc_hir as hir; +use rustc_hir::def_id::{CrateNum, DefId}; +use rustc_session::lint::BuiltinLintDiagnostics; +use rustc_session::lint::{FutureIncompatibleInfo, Level, Lint, LintBuffer, LintId}; +use rustc_session::Session; +use rustc_span::{symbol::Symbol, MultiSpan, Span, DUMMY_SP}; +use syntax::ast; +use syntax::util::lev_distance::find_best_match_for_name; + +use std::slice; + +/// Information about the registered lints. +/// +/// This is basically the subset of `Context` that we can +/// build early in the compile pipeline. +pub struct LintStore { + /// Registered lints. + lints: Vec<&'static Lint>, + + /// Constructor functions for each variety of lint pass. + /// + /// These should only be called once, but since we want to avoid locks or + /// interior mutability, we don't enforce this (and lints should, in theory, + /// be compatible with being constructed more than once, though not + /// necessarily in a sane manner. This is safe though.) + pub pre_expansion_passes: Vec EarlyLintPassObject + sync::Send + sync::Sync>>, + pub early_passes: Vec EarlyLintPassObject + sync::Send + sync::Sync>>, + pub late_passes: Vec LateLintPassObject + sync::Send + sync::Sync>>, + /// This is unique in that we construct them per-module, so not once. + pub late_module_passes: Vec LateLintPassObject + sync::Send + sync::Sync>>, + + /// Lints indexed by name. + by_name: FxHashMap, + + /// Map of registered lint groups to what lints they expand to. + lint_groups: FxHashMap<&'static str, LintGroup>, +} + +/// The target of the `by_name` map, which accounts for renaming/deprecation. +enum TargetLint { + /// A direct lint target + Id(LintId), + + /// Temporary renaming, used for easing migration pain; see #16545 + Renamed(String, LintId), + + /// Lint with this name existed previously, but has been removed/deprecated. + /// The string argument is the reason for removal. + Removed(String), +} + +pub enum FindLintError { + NotFound, + Removed, +} + +struct LintAlias { + name: &'static str, + /// Whether deprecation warnings should be suppressed for this alias. + silent: bool, +} + +struct LintGroup { + lint_ids: Vec, + from_plugin: bool, + depr: Option, +} + +pub enum CheckLintNameResult<'a> { + Ok(&'a [LintId]), + /// Lint doesn't exist. Potentially contains a suggestion for a correct lint name. + NoLint(Option), + /// The lint is either renamed or removed. This is the warning + /// message, and an optional new name (`None` if removed). + Warning(String, Option), + /// The lint is from a tool. If the Option is None, then either + /// the lint does not exist in the tool or the code was not + /// compiled with the tool and therefore the lint was never + /// added to the `LintStore`. Otherwise the `LintId` will be + /// returned as if it where a rustc lint. + Tool(Result<&'a [LintId], (Option<&'a [LintId]>, String)>), +} + +impl LintStore { + pub fn new() -> LintStore { + LintStore { + lints: vec![], + pre_expansion_passes: vec![], + early_passes: vec![], + late_passes: vec![], + late_module_passes: vec![], + by_name: Default::default(), + lint_groups: Default::default(), + } + } + + pub fn get_lints<'t>(&'t self) -> &'t [&'static Lint] { + &self.lints + } + + pub fn get_lint_groups<'t>(&'t self) -> Vec<(&'static str, Vec, bool)> { + self.lint_groups + .iter() + .filter(|(_, LintGroup { depr, .. })| { + // Don't display deprecated lint groups. + depr.is_none() + }) + .map(|(k, LintGroup { lint_ids, from_plugin, .. })| { + (*k, lint_ids.clone(), *from_plugin) + }) + .collect() + } + + pub fn register_early_pass( + &mut self, + pass: impl Fn() -> EarlyLintPassObject + 'static + sync::Send + sync::Sync, + ) { + self.early_passes.push(Box::new(pass)); + } + + pub fn register_pre_expansion_pass( + &mut self, + pass: impl Fn() -> EarlyLintPassObject + 'static + sync::Send + sync::Sync, + ) { + self.pre_expansion_passes.push(Box::new(pass)); + } + + pub fn register_late_pass( + &mut self, + pass: impl Fn() -> LateLintPassObject + 'static + sync::Send + sync::Sync, + ) { + self.late_passes.push(Box::new(pass)); + } + + pub fn register_late_mod_pass( + &mut self, + pass: impl Fn() -> LateLintPassObject + 'static + sync::Send + sync::Sync, + ) { + self.late_module_passes.push(Box::new(pass)); + } + + // Helper method for register_early/late_pass + pub fn register_lints(&mut self, lints: &[&'static Lint]) { + for lint in lints { + self.lints.push(lint); + + let id = LintId::of(lint); + if self.by_name.insert(lint.name_lower(), Id(id)).is_some() { + bug!("duplicate specification of lint {}", lint.name_lower()) + } + + if let Some(FutureIncompatibleInfo { edition, .. }) = lint.future_incompatible { + if let Some(edition) = edition { + self.lint_groups + .entry(edition.lint_name()) + .or_insert(LintGroup { + lint_ids: vec![], + from_plugin: lint.is_plugin, + depr: None, + }) + .lint_ids + .push(id); + } + + self.lint_groups + .entry("future_incompatible") + .or_insert(LintGroup { + lint_ids: vec![], + from_plugin: lint.is_plugin, + depr: None, + }) + .lint_ids + .push(id); + } + } + } + + pub fn register_group_alias(&mut self, lint_name: &'static str, alias: &'static str) { + self.lint_groups.insert( + alias, + LintGroup { + lint_ids: vec![], + from_plugin: false, + depr: Some(LintAlias { name: lint_name, silent: true }), + }, + ); + } + + pub fn register_group( + &mut self, + from_plugin: bool, + name: &'static str, + deprecated_name: Option<&'static str>, + to: Vec, + ) { + let new = self + .lint_groups + .insert(name, LintGroup { lint_ids: to, from_plugin, depr: None }) + .is_none(); + if let Some(deprecated) = deprecated_name { + self.lint_groups.insert( + deprecated, + LintGroup { + lint_ids: vec![], + from_plugin, + depr: Some(LintAlias { name, silent: false }), + }, + ); + } + + if !new { + bug!("duplicate specification of lint group {}", name); + } + } + + pub fn register_renamed(&mut self, old_name: &str, new_name: &str) { + let target = match self.by_name.get(new_name) { + Some(&Id(lint_id)) => lint_id, + _ => bug!("invalid lint renaming of {} to {}", old_name, new_name), + }; + self.by_name.insert(old_name.to_string(), Renamed(new_name.to_string(), target)); + } + + pub fn register_removed(&mut self, name: &str, reason: &str) { + self.by_name.insert(name.into(), Removed(reason.into())); + } + + pub fn find_lints(&self, mut lint_name: &str) -> Result, FindLintError> { + match self.by_name.get(lint_name) { + Some(&Id(lint_id)) => Ok(vec![lint_id]), + Some(&Renamed(_, lint_id)) => Ok(vec![lint_id]), + Some(&Removed(_)) => Err(FindLintError::Removed), + None => loop { + return match self.lint_groups.get(lint_name) { + Some(LintGroup { lint_ids, depr, .. }) => { + if let Some(LintAlias { name, .. }) = depr { + lint_name = name; + continue; + } + Ok(lint_ids.clone()) + } + None => Err(FindLintError::Removed), + }; + }, + } + } + + /// Checks the validity of lint names derived from the command line + pub fn check_lint_name_cmdline(&self, sess: &Session, lint_name: &str, level: Level) { + let db = match self.check_lint_name(lint_name, None) { + CheckLintNameResult::Ok(_) => None, + CheckLintNameResult::Warning(ref msg, _) => Some(sess.struct_warn(msg)), + CheckLintNameResult::NoLint(suggestion) => { + let mut err = + struct_span_err!(sess, DUMMY_SP, E0602, "unknown lint: `{}`", lint_name); + + if let Some(suggestion) = suggestion { + err.help(&format!("did you mean: `{}`", suggestion)); + } + + Some(err) + } + CheckLintNameResult::Tool(result) => match result { + Err((Some(_), new_name)) => Some(sess.struct_warn(&format!( + "lint name `{}` is deprecated \ + and does not have an effect anymore. \ + Use: {}", + lint_name, new_name + ))), + _ => None, + }, + }; + + if let Some(mut db) = db { + let msg = format!( + "requested on the command line with `{} {}`", + match level { + Level::Allow => "-A", + Level::Warn => "-W", + Level::Deny => "-D", + Level::Forbid => "-F", + }, + lint_name + ); + db.note(&msg); + db.emit(); + } + } + + /// Checks the name of a lint for its existence, and whether it was + /// renamed or removed. Generates a DiagnosticBuilder containing a + /// warning for renamed and removed lints. This is over both lint + /// names from attributes and those passed on the command line. Since + /// it emits non-fatal warnings and there are *two* lint passes that + /// inspect attributes, this is only run from the late pass to avoid + /// printing duplicate warnings. + pub fn check_lint_name( + &self, + lint_name: &str, + tool_name: Option, + ) -> CheckLintNameResult<'_> { + let complete_name = if let Some(tool_name) = tool_name { + format!("{}::{}", tool_name, lint_name) + } else { + lint_name.to_string() + }; + // If the lint was scoped with `tool::` check if the tool lint exists + if let Some(_) = tool_name { + match self.by_name.get(&complete_name) { + None => match self.lint_groups.get(&*complete_name) { + None => return CheckLintNameResult::Tool(Err((None, String::new()))), + Some(LintGroup { lint_ids, .. }) => { + return CheckLintNameResult::Tool(Ok(&lint_ids)); + } + }, + Some(&Id(ref id)) => return CheckLintNameResult::Tool(Ok(slice::from_ref(id))), + // If the lint was registered as removed or renamed by the lint tool, we don't need + // to treat tool_lints and rustc lints different and can use the code below. + _ => {} + } + } + match self.by_name.get(&complete_name) { + Some(&Renamed(ref new_name, _)) => CheckLintNameResult::Warning( + format!("lint `{}` has been renamed to `{}`", complete_name, new_name), + Some(new_name.to_owned()), + ), + Some(&Removed(ref reason)) => CheckLintNameResult::Warning( + format!("lint `{}` has been removed: `{}`", complete_name, reason), + None, + ), + None => match self.lint_groups.get(&*complete_name) { + // If neither the lint, nor the lint group exists check if there is a `clippy::` + // variant of this lint + None => self.check_tool_name_for_backwards_compat(&complete_name, "clippy"), + Some(LintGroup { lint_ids, depr, .. }) => { + // Check if the lint group name is deprecated + if let Some(LintAlias { name, silent }) = depr { + let LintGroup { lint_ids, .. } = self.lint_groups.get(name).unwrap(); + return if *silent { + CheckLintNameResult::Ok(&lint_ids) + } else { + CheckLintNameResult::Tool(Err((Some(&lint_ids), name.to_string()))) + }; + } + CheckLintNameResult::Ok(&lint_ids) + } + }, + Some(&Id(ref id)) => CheckLintNameResult::Ok(slice::from_ref(id)), + } + } + + fn check_tool_name_for_backwards_compat( + &self, + lint_name: &str, + tool_name: &str, + ) -> CheckLintNameResult<'_> { + let complete_name = format!("{}::{}", tool_name, lint_name); + match self.by_name.get(&complete_name) { + None => match self.lint_groups.get(&*complete_name) { + // Now we are sure, that this lint exists nowhere + None => { + let symbols = + self.by_name.keys().map(|name| Symbol::intern(&name)).collect::>(); + + let suggestion = + find_best_match_for_name(symbols.iter(), &lint_name.to_lowercase(), None); + + CheckLintNameResult::NoLint(suggestion) + } + Some(LintGroup { lint_ids, depr, .. }) => { + // Reaching this would be weird, but let's cover this case anyway + if let Some(LintAlias { name, silent }) = depr { + let LintGroup { lint_ids, .. } = self.lint_groups.get(name).unwrap(); + return if *silent { + CheckLintNameResult::Tool(Err((Some(&lint_ids), complete_name))) + } else { + CheckLintNameResult::Tool(Err((Some(&lint_ids), name.to_string()))) + }; + } + CheckLintNameResult::Tool(Err((Some(&lint_ids), complete_name))) + } + }, + Some(&Id(ref id)) => { + CheckLintNameResult::Tool(Err((Some(slice::from_ref(id)), complete_name))) + } + _ => CheckLintNameResult::NoLint(None), + } + } +} + +/// Context for lint checking after type checking. +pub struct LateContext<'a, 'tcx> { + /// Type context we're checking in. + pub tcx: TyCtxt<'tcx>, + + /// Side-tables for the body we are in. + // FIXME: Make this lazy to avoid running the TypeckTables query? + pub tables: &'a ty::TypeckTables<'tcx>, + + /// Parameter environment for the item we are in. + pub param_env: ty::ParamEnv<'tcx>, + + /// Items accessible from the crate being checked. + pub access_levels: &'a AccessLevels, + + /// The store of registered lints and the lint levels. + pub lint_store: &'tcx LintStore, + + pub last_node_with_lint_attrs: hir::HirId, + + /// Generic type parameters in scope for the item we are in. + pub generics: Option<&'tcx hir::Generics<'tcx>>, + + /// We are only looking at one module + pub only_module: bool, +} + +/// Context for lint checking of the AST, after expansion, before lowering to +/// HIR. +pub struct EarlyContext<'a> { + /// Type context we're checking in. + pub sess: &'a Session, + + /// The crate being checked. + pub krate: &'a ast::Crate, + + pub builder: LintLevelsBuilder<'a>, + + /// The store of registered lints and the lint levels. + pub lint_store: &'a LintStore, + + pub buffered: LintBuffer, +} + +pub trait LintPassObject: Sized {} + +impl LintPassObject for EarlyLintPassObject {} + +impl LintPassObject for LateLintPassObject {} + +pub trait LintContext: Sized { + type PassObject: LintPassObject; + + fn sess(&self) -> &Session; + fn lints(&self) -> &LintStore; + + fn lookup_and_emit>(&self, lint: &'static Lint, span: Option, msg: &str) { + self.lookup(lint, span, msg).emit(); + } + + fn lookup_and_emit_with_diagnostics>( + &self, + lint: &'static Lint, + span: Option, + msg: &str, + diagnostic: BuiltinLintDiagnostics, + ) { + let mut db = self.lookup(lint, span, msg); + + let sess = self.sess(); + match diagnostic { + BuiltinLintDiagnostics::Normal => (), + BuiltinLintDiagnostics::BareTraitObject(span, is_global) => { + let (sugg, app) = match sess.source_map().span_to_snippet(span) { + Ok(s) if is_global => { + (format!("dyn ({})", s), Applicability::MachineApplicable) + } + Ok(s) => (format!("dyn {}", s), Applicability::MachineApplicable), + Err(_) => ("dyn ".to_string(), Applicability::HasPlaceholders), + }; + db.span_suggestion(span, "use `dyn`", sugg, app); + } + BuiltinLintDiagnostics::AbsPathWithModule(span) => { + let (sugg, app) = match sess.source_map().span_to_snippet(span) { + Ok(ref s) => { + // FIXME(Manishearth) ideally the emitting code + // can tell us whether or not this is global + let opt_colon = if s.trim_start().starts_with("::") { "" } else { "::" }; + + (format!("crate{}{}", opt_colon, s), Applicability::MachineApplicable) + } + Err(_) => ("crate::".to_string(), Applicability::HasPlaceholders), + }; + db.span_suggestion(span, "use `crate`", sugg, app); + } + BuiltinLintDiagnostics::ProcMacroDeriveResolutionFallback(span) => { + db.span_label( + span, + "names from parent modules are not accessible without an explicit import", + ); + } + BuiltinLintDiagnostics::MacroExpandedMacroExportsAccessedByAbsolutePaths(span_def) => { + db.span_note(span_def, "the macro is defined here"); + } + BuiltinLintDiagnostics::ElidedLifetimesInPaths( + n, + path_span, + incl_angl_brckt, + insertion_span, + anon_lts, + ) => { + add_elided_lifetime_in_path_suggestion( + sess, + &mut db, + n, + path_span, + incl_angl_brckt, + insertion_span, + anon_lts, + ); + } + BuiltinLintDiagnostics::UnknownCrateTypes(span, note, sugg) => { + db.span_suggestion(span, ¬e, sugg, Applicability::MaybeIncorrect); + } + BuiltinLintDiagnostics::UnusedImports(message, replaces) => { + if !replaces.is_empty() { + db.tool_only_multipart_suggestion( + &message, + replaces, + Applicability::MachineApplicable, + ); + } + } + BuiltinLintDiagnostics::RedundantImport(spans, ident) => { + for (span, is_imported) in spans { + let introduced = if is_imported { "imported" } else { "defined" }; + db.span_label( + span, + format!("the item `{}` is already {} here", ident, introduced), + ); + } + } + BuiltinLintDiagnostics::DeprecatedMacro(suggestion, span) => { + stability::deprecation_suggestion(&mut db, suggestion, span) + } + } + + db.emit(); + } + + fn lookup>( + &self, + lint: &'static Lint, + span: Option, + msg: &str, + ) -> DiagnosticBuilder<'_>; + + /// Emit a lint at the appropriate level, for a particular span. + fn span_lint>(&self, lint: &'static Lint, span: S, msg: &str) { + self.lookup_and_emit(lint, Some(span), msg); + } + + fn struct_span_lint>( + &self, + lint: &'static Lint, + span: S, + msg: &str, + ) -> DiagnosticBuilder<'_> { + self.lookup(lint, Some(span), msg) + } + + /// Emit a lint and note at the appropriate level, for a particular span. + fn span_lint_note( + &self, + lint: &'static Lint, + span: Span, + msg: &str, + note_span: Span, + note: &str, + ) { + let mut err = self.lookup(lint, Some(span), msg); + if note_span == span { + err.note(note); + } else { + err.span_note(note_span, note); + } + err.emit(); + } + + /// Emit a lint and help at the appropriate level, for a particular span. + fn span_lint_help(&self, lint: &'static Lint, span: Span, msg: &str, help: &str) { + let mut err = self.lookup(lint, Some(span), msg); + self.span_lint(lint, span, msg); + err.span_help(span, help); + err.emit(); + } + + /// Emit a lint at the appropriate level, with no associated span. + fn lint(&self, lint: &'static Lint, msg: &str) { + self.lookup_and_emit(lint, None as Option, msg); + } +} + +impl<'a> EarlyContext<'a> { + pub fn new( + sess: &'a Session, + lint_store: &'a LintStore, + krate: &'a ast::Crate, + buffered: LintBuffer, + warn_about_weird_lints: bool, + ) -> EarlyContext<'a> { + EarlyContext { + sess, + krate, + lint_store, + builder: LintLevelsBuilder::new(sess, warn_about_weird_lints, lint_store), + buffered, + } + } +} + +impl LintContext for LateContext<'_, '_> { + type PassObject = LateLintPassObject; + + /// Gets the overall compiler `Session` object. + fn sess(&self) -> &Session { + &self.tcx.sess + } + + fn lints(&self) -> &LintStore { + &*self.lint_store + } + + fn lookup>( + &self, + lint: &'static Lint, + span: Option, + msg: &str, + ) -> DiagnosticBuilder<'_> { + let hir_id = self.last_node_with_lint_attrs; + + match span { + Some(s) => self.tcx.struct_span_lint_hir(lint, hir_id, s, msg), + None => self.tcx.struct_lint_node(lint, hir_id, msg), + } + } +} + +impl LintContext for EarlyContext<'_> { + type PassObject = EarlyLintPassObject; + + /// Gets the overall compiler `Session` object. + fn sess(&self) -> &Session { + &self.sess + } + + fn lints(&self) -> &LintStore { + &*self.lint_store + } + + fn lookup>( + &self, + lint: &'static Lint, + span: Option, + msg: &str, + ) -> DiagnosticBuilder<'_> { + self.builder.struct_lint(lint, span.map(|s| s.into()), msg) + } +} + +impl<'a, 'tcx> LateContext<'a, 'tcx> { + pub fn current_lint_root(&self) -> hir::HirId { + self.last_node_with_lint_attrs + } + + /// Check if a `DefId`'s path matches the given absolute type path usage. + /// + /// Anonymous scopes such as `extern` imports are matched with `kw::Invalid`; + /// inherent `impl` blocks are matched with the name of the type. + /// + /// # Examples + /// + /// ```rust,ignore (no context or def id available) + /// if cx.match_def_path(def_id, &[sym::core, sym::option, sym::Option]) { + /// // The given `def_id` is that of an `Option` type + /// } + /// ``` + pub fn match_def_path(&self, def_id: DefId, path: &[Symbol]) -> bool { + let names = self.get_def_path(def_id); + + names.len() == path.len() && names.into_iter().zip(path.iter()).all(|(a, &b)| a == b) + } + + /// Gets the absolute path of `def_id` as a vector of `Symbol`. + /// + /// # Examples + /// + /// ```rust,ignore (no context or def id available) + /// let def_path = cx.get_def_path(def_id); + /// if let &[sym::core, sym::option, sym::Option] = &def_path[..] { + /// // The given `def_id` is that of an `Option` type + /// } + /// ``` + pub fn get_def_path(&self, def_id: DefId) -> Vec { + pub struct AbsolutePathPrinter<'tcx> { + pub tcx: TyCtxt<'tcx>, + } + + impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> { + type Error = !; + + type Path = Vec; + type Region = (); + type Type = (); + type DynExistential = (); + type Const = (); + + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn print_region(self, _region: ty::Region<'_>) -> Result { + Ok(()) + } + + fn print_type(self, _ty: Ty<'tcx>) -> Result { + Ok(()) + } + + fn print_dyn_existential( + self, + _predicates: &'tcx ty::List>, + ) -> Result { + Ok(()) + } + + fn print_const(self, _ct: &'tcx ty::Const<'tcx>) -> Result { + Ok(()) + } + + fn path_crate(self, cnum: CrateNum) -> Result { + Ok(vec![self.tcx.original_crate_name(cnum)]) + } + + fn path_qualified( + self, + self_ty: Ty<'tcx>, + trait_ref: Option>, + ) -> Result { + if trait_ref.is_none() { + if let ty::Adt(def, substs) = self_ty.kind { + return self.print_def_path(def.did, substs); + } + } + + // This shouldn't ever be needed, but just in case: + Ok(vec![match trait_ref { + Some(trait_ref) => Symbol::intern(&format!("{:?}", trait_ref)), + None => Symbol::intern(&format!("<{}>", self_ty)), + }]) + } + + fn path_append_impl( + self, + print_prefix: impl FnOnce(Self) -> Result, + _disambiguated_data: &DisambiguatedDefPathData, + self_ty: Ty<'tcx>, + trait_ref: Option>, + ) -> Result { + let mut path = print_prefix(self)?; + + // This shouldn't ever be needed, but just in case: + path.push(match trait_ref { + Some(trait_ref) => Symbol::intern(&format!( + "", + trait_ref.print_only_trait_path(), + self_ty + )), + None => Symbol::intern(&format!("", self_ty)), + }); + + Ok(path) + } + + fn path_append( + self, + print_prefix: impl FnOnce(Self) -> Result, + disambiguated_data: &DisambiguatedDefPathData, + ) -> Result { + let mut path = print_prefix(self)?; + + // Skip `::{{constructor}}` on tuple/unit structs. + match disambiguated_data.data { + DefPathData::Ctor => return Ok(path), + _ => {} + } + + path.push(disambiguated_data.data.as_symbol()); + Ok(path) + } + + fn path_generic_args( + self, + print_prefix: impl FnOnce(Self) -> Result, + _args: &[GenericArg<'tcx>], + ) -> Result { + print_prefix(self) + } + } + + AbsolutePathPrinter { tcx: self.tcx }.print_def_path(def_id, &[]).unwrap() + } +} + +impl<'a, 'tcx> LayoutOf for LateContext<'a, 'tcx> { + type Ty = Ty<'tcx>; + type TyLayout = Result, LayoutError<'tcx>>; + + fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout { + self.tcx.layout_of(self.param_env.and(ty)) + } +} diff --git a/src/librustc_lint/early.rs b/src/librustc_lint/early.rs new file mode 100644 index 0000000000..490114b2d4 --- /dev/null +++ b/src/librustc_lint/early.rs @@ -0,0 +1,384 @@ +//! Implementation of lint checking. +//! +//! The lint checking is mostly consolidated into one pass which runs +//! after all other analyses. Throughout compilation, lint warnings +//! can be added via the `add_lint` method on the Session structure. This +//! requires a span and an ID of the node that the lint is being added to. The +//! lint isn't actually emitted at that time because it is unknown what the +//! actual lint level at that location is. +//! +//! To actually emit lint warnings/errors, a separate pass is used. +//! A context keeps track of the current state of all lint levels. +//! Upon entering a node of the ast which can modify the lint settings, the +//! previous lint state is pushed onto a stack and the ast is then recursed +//! upon. As the ast is traversed, this keeps track of the current lint level +//! for all lint attributes. + +use crate::context::{EarlyContext, LintContext, LintStore}; +use crate::passes::{EarlyLintPass, EarlyLintPassObject}; +use rustc_session::lint::{LintBuffer, LintPass}; +use rustc_session::Session; +use rustc_span::Span; +use syntax::ast; +use syntax::visit as ast_visit; + +use log::debug; +use std::slice; + +macro_rules! run_early_pass { ($cx:expr, $f:ident, $($args:expr),*) => ({ + $cx.pass.$f(&$cx.context, $($args),*); +}) } + +struct EarlyContextAndPass<'a, T: EarlyLintPass> { + context: EarlyContext<'a>, + pass: T, +} + +impl<'a, T: EarlyLintPass> EarlyContextAndPass<'a, T> { + fn check_id(&mut self, id: ast::NodeId) { + for early_lint in self.context.buffered.take(id) { + self.context.lookup_and_emit_with_diagnostics( + early_lint.lint_id.lint, + Some(early_lint.span.clone()), + &early_lint.msg, + early_lint.diagnostic, + ); + } + } + + /// Merge the lints specified by any lint attributes into the + /// current lint context, call the provided function, then reset the + /// lints in effect to their previous state. + fn with_lint_attrs(&mut self, id: ast::NodeId, attrs: &'a [ast::Attribute], f: F) + where + F: FnOnce(&mut Self), + { + let push = self.context.builder.push(attrs, &self.context.lint_store); + self.check_id(id); + self.enter_attrs(attrs); + f(self); + self.exit_attrs(attrs); + self.context.builder.pop(push); + } + + fn enter_attrs(&mut self, attrs: &'a [ast::Attribute]) { + debug!("early context: enter_attrs({:?})", attrs); + run_early_pass!(self, enter_lint_attrs, attrs); + } + + fn exit_attrs(&mut self, attrs: &'a [ast::Attribute]) { + debug!("early context: exit_attrs({:?})", attrs); + run_early_pass!(self, exit_lint_attrs, attrs); + } +} + +impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T> { + fn visit_param(&mut self, param: &'a ast::Param) { + self.with_lint_attrs(param.id, ¶m.attrs, |cx| { + run_early_pass!(cx, check_param, param); + ast_visit::walk_param(cx, param); + }); + } + + fn visit_item(&mut self, it: &'a ast::Item) { + self.with_lint_attrs(it.id, &it.attrs, |cx| { + run_early_pass!(cx, check_item, it); + ast_visit::walk_item(cx, it); + run_early_pass!(cx, check_item_post, it); + }) + } + + fn visit_foreign_item(&mut self, it: &'a ast::ForeignItem) { + self.with_lint_attrs(it.id, &it.attrs, |cx| { + run_early_pass!(cx, check_foreign_item, it); + ast_visit::walk_foreign_item(cx, it); + run_early_pass!(cx, check_foreign_item_post, it); + }) + } + + fn visit_pat(&mut self, p: &'a ast::Pat) { + run_early_pass!(self, check_pat, p); + self.check_id(p.id); + ast_visit::walk_pat(self, p); + run_early_pass!(self, check_pat_post, p); + } + + fn visit_expr(&mut self, e: &'a ast::Expr) { + self.with_lint_attrs(e.id, &e.attrs, |cx| { + run_early_pass!(cx, check_expr, e); + ast_visit::walk_expr(cx, e); + }) + } + + fn visit_stmt(&mut self, s: &'a ast::Stmt) { + run_early_pass!(self, check_stmt, s); + self.check_id(s.id); + ast_visit::walk_stmt(self, s); + } + + fn visit_fn( + &mut self, + fk: ast_visit::FnKind<'a>, + decl: &'a ast::FnDecl, + span: Span, + id: ast::NodeId, + ) { + run_early_pass!(self, check_fn, fk, decl, span, id); + self.check_id(id); + ast_visit::walk_fn(self, fk, decl, span); + run_early_pass!(self, check_fn_post, fk, decl, span, id); + } + + fn visit_variant_data(&mut self, s: &'a ast::VariantData) { + run_early_pass!(self, check_struct_def, s); + if let Some(ctor_hir_id) = s.ctor_id() { + self.check_id(ctor_hir_id); + } + ast_visit::walk_struct_def(self, s); + run_early_pass!(self, check_struct_def_post, s); + } + + fn visit_struct_field(&mut self, s: &'a ast::StructField) { + self.with_lint_attrs(s.id, &s.attrs, |cx| { + run_early_pass!(cx, check_struct_field, s); + ast_visit::walk_struct_field(cx, s); + }) + } + + fn visit_variant(&mut self, v: &'a ast::Variant) { + self.with_lint_attrs(v.id, &v.attrs, |cx| { + run_early_pass!(cx, check_variant, v); + ast_visit::walk_variant(cx, v); + run_early_pass!(cx, check_variant_post, v); + }) + } + + fn visit_ty(&mut self, t: &'a ast::Ty) { + run_early_pass!(self, check_ty, t); + self.check_id(t.id); + ast_visit::walk_ty(self, t); + } + + fn visit_ident(&mut self, ident: ast::Ident) { + run_early_pass!(self, check_ident, ident); + } + + fn visit_mod(&mut self, m: &'a ast::Mod, s: Span, _a: &[ast::Attribute], n: ast::NodeId) { + run_early_pass!(self, check_mod, m, s, n); + self.check_id(n); + ast_visit::walk_mod(self, m); + run_early_pass!(self, check_mod_post, m, s, n); + } + + fn visit_local(&mut self, l: &'a ast::Local) { + self.with_lint_attrs(l.id, &l.attrs, |cx| { + run_early_pass!(cx, check_local, l); + ast_visit::walk_local(cx, l); + }) + } + + fn visit_block(&mut self, b: &'a ast::Block) { + run_early_pass!(self, check_block, b); + self.check_id(b.id); + ast_visit::walk_block(self, b); + run_early_pass!(self, check_block_post, b); + } + + fn visit_arm(&mut self, a: &'a ast::Arm) { + run_early_pass!(self, check_arm, a); + ast_visit::walk_arm(self, a); + } + + fn visit_expr_post(&mut self, e: &'a ast::Expr) { + run_early_pass!(self, check_expr_post, e); + } + + fn visit_generic_param(&mut self, param: &'a ast::GenericParam) { + run_early_pass!(self, check_generic_param, param); + ast_visit::walk_generic_param(self, param); + } + + fn visit_generics(&mut self, g: &'a ast::Generics) { + run_early_pass!(self, check_generics, g); + ast_visit::walk_generics(self, g); + } + + fn visit_where_predicate(&mut self, p: &'a ast::WherePredicate) { + run_early_pass!(self, check_where_predicate, p); + ast_visit::walk_where_predicate(self, p); + } + + fn visit_poly_trait_ref(&mut self, t: &'a ast::PolyTraitRef, m: &'a ast::TraitBoundModifier) { + run_early_pass!(self, check_poly_trait_ref, t, m); + ast_visit::walk_poly_trait_ref(self, t, m); + } + + fn visit_trait_item(&mut self, trait_item: &'a ast::AssocItem) { + self.with_lint_attrs(trait_item.id, &trait_item.attrs, |cx| { + run_early_pass!(cx, check_trait_item, trait_item); + ast_visit::walk_trait_item(cx, trait_item); + run_early_pass!(cx, check_trait_item_post, trait_item); + }); + } + + fn visit_impl_item(&mut self, impl_item: &'a ast::AssocItem) { + self.with_lint_attrs(impl_item.id, &impl_item.attrs, |cx| { + run_early_pass!(cx, check_impl_item, impl_item); + ast_visit::walk_impl_item(cx, impl_item); + run_early_pass!(cx, check_impl_item_post, impl_item); + }); + } + + fn visit_lifetime(&mut self, lt: &'a ast::Lifetime) { + run_early_pass!(self, check_lifetime, lt); + self.check_id(lt.id); + } + + fn visit_path(&mut self, p: &'a ast::Path, id: ast::NodeId) { + run_early_pass!(self, check_path, p, id); + self.check_id(id); + ast_visit::walk_path(self, p); + } + + fn visit_attribute(&mut self, attr: &'a ast::Attribute) { + run_early_pass!(self, check_attribute, attr); + } + + fn visit_mac_def(&mut self, mac: &'a ast::MacroDef, id: ast::NodeId) { + run_early_pass!(self, check_mac_def, mac, id); + self.check_id(id); + } + + fn visit_mac(&mut self, mac: &'a ast::Mac) { + // FIXME(#54110): So, this setup isn't really right. I think + // that (a) the libsyntax visitor ought to be doing this as + // part of `walk_mac`, and (b) we should be calling + // `visit_path`, *but* that would require a `NodeId`, and I + // want to get #53686 fixed quickly. -nmatsakis + ast_visit::walk_path(self, &mac.path); + + run_early_pass!(self, check_mac, mac); + } +} + +struct EarlyLintPassObjects<'a> { + lints: &'a mut [EarlyLintPassObject], +} + +#[allow(rustc::lint_pass_impl_without_macro)] +impl LintPass for EarlyLintPassObjects<'_> { + fn name(&self) -> &'static str { + panic!() + } +} + +macro_rules! expand_early_lint_pass_impl_methods { + ([$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( + $(fn $name(&mut self, context: &EarlyContext<'_>, $($param: $arg),*) { + for obj in self.lints.iter_mut() { + obj.$name(context, $($param),*); + } + })* + ) +} + +macro_rules! early_lint_pass_impl { + ([], [$($methods:tt)*]) => ( + impl EarlyLintPass for EarlyLintPassObjects<'_> { + expand_early_lint_pass_impl_methods!([$($methods)*]); + } + ) +} + +crate::early_lint_methods!(early_lint_pass_impl, []); + +fn early_lint_crate( + sess: &Session, + lint_store: &LintStore, + krate: &ast::Crate, + pass: T, + buffered: LintBuffer, + warn_about_weird_lints: bool, +) -> LintBuffer { + let mut cx = EarlyContextAndPass { + context: EarlyContext::new(sess, lint_store, krate, buffered, warn_about_weird_lints), + pass, + }; + + // Visit the whole crate. + cx.with_lint_attrs(ast::CRATE_NODE_ID, &krate.attrs, |cx| { + // since the root module isn't visited as an item (because it isn't an + // item), warn for it here. + run_early_pass!(cx, check_crate, krate); + + ast_visit::walk_crate(cx, krate); + + run_early_pass!(cx, check_crate_post, krate); + }); + cx.context.buffered +} + +pub fn check_ast_crate( + sess: &Session, + lint_store: &LintStore, + krate: &ast::Crate, + pre_expansion: bool, + lint_buffer: Option, + builtin_lints: T, +) { + let mut passes: Vec<_> = if pre_expansion { + lint_store.pre_expansion_passes.iter().map(|p| (p)()).collect() + } else { + lint_store.early_passes.iter().map(|p| (p)()).collect() + }; + let mut buffered = lint_buffer.unwrap_or_default(); + + if !sess.opts.debugging_opts.no_interleave_lints { + buffered = + early_lint_crate(sess, lint_store, krate, builtin_lints, buffered, pre_expansion); + + if !passes.is_empty() { + buffered = early_lint_crate( + sess, + lint_store, + krate, + EarlyLintPassObjects { lints: &mut passes[..] }, + buffered, + pre_expansion, + ); + } + } else { + for pass in &mut passes { + buffered = sess + .prof + .extra_verbose_generic_activity(&format!("running lint: {}", pass.name())) + .run(|| { + early_lint_crate( + sess, + lint_store, + krate, + EarlyLintPassObjects { lints: slice::from_mut(pass) }, + buffered, + pre_expansion, + ) + }); + } + } + + // All of the buffered lints should have been emitted at this point. + // If not, that means that we somehow buffered a lint for a node id + // that was not lint-checked (perhaps it doesn't exist?). This is a bug. + // + // Rustdoc runs everybody-loops before the early lints and removes + // function bodies, so it's totally possible for linted + // node ids to not exist (e.g., macros defined within functions for the + // unused_macro lint) anymore. So we only run this check + // when we're not in rustdoc mode. (see issue #47639) + if !sess.opts.actually_rustdoc { + for (_id, lints) in buffered.map { + for early_lint in lints { + sess.delay_span_bug(early_lint.span, "failed to process buffered lint here"); + } + } + } +} diff --git a/src/librustc/lint/internal.rs b/src/librustc_lint/internal.rs similarity index 86% rename from src/librustc/lint/internal.rs rename to src/librustc_lint/internal.rs index 10c0c63995..8480c85075 100644 --- a/src/librustc/lint/internal.rs +++ b/src/librustc_lint/internal.rs @@ -1,20 +1,20 @@ //! Some lints that are only useful in the compiler or crates that use compiler internals, such as //! Clippy. -use crate::hir::{GenericArg, HirId, MutTy, Mutability, Path, PathSegment, QPath, Ty, TyKind}; -use crate::lint::{ - EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintArray, LintContext, LintPass, -}; -use errors::Applicability; +use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext}; use rustc_data_structures::fx::FxHashMap; +use rustc_errors::Applicability; +use rustc_hir::{GenericArg, HirId, MutTy, Mutability, Path, PathSegment, QPath, Ty, TyKind}; +use rustc_session::{declare_lint_pass, declare_tool_lint, impl_lint_pass}; +use rustc_span::hygiene::{ExpnKind, MacroKind}; +use rustc_span::symbol::{sym, Symbol}; use syntax::ast::{Ident, Item, ItemKind}; -use syntax::symbol::{sym, Symbol}; -use rustc_session::declare_tool_lint; declare_tool_lint! { pub rustc::DEFAULT_HASH_TYPES, Allow, - "forbid HashMap and HashSet and suggest the FxHash* variants" + "forbid HashMap and HashSet and suggest the FxHash* variants", + report_in_external_macro: true } pub struct DefaultHashTypes { @@ -54,19 +54,22 @@ impl EarlyLintPass for DefaultHashTypes { declare_tool_lint! { pub rustc::USAGE_OF_TY_TYKIND, Allow, - "usage of `ty::TyKind` outside of the `ty::sty` module" + "usage of `ty::TyKind` outside of the `ty::sty` module", + report_in_external_macro: true } declare_tool_lint! { pub rustc::TY_PASS_BY_REFERENCE, Allow, - "passing `Ty` or `TyCtxt` by reference" + "passing `Ty` or `TyCtxt` by reference", + report_in_external_macro: true } declare_tool_lint! { pub rustc::USAGE_OF_QUALIFIED_TY, Allow, - "using `ty::{Ty,TyCtxt}` instead of importing it" + "using `ty::{Ty,TyCtxt}` instead of importing it", + report_in_external_macro: true } declare_lint_pass!(TyTyKind => [ @@ -76,7 +79,7 @@ declare_lint_pass!(TyTyKind => [ ]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TyTyKind { - fn check_path(&mut self, cx: &LateContext<'_, '_>, path: &'tcx Path, _: HirId) { + fn check_path(&mut self, cx: &LateContext<'_, '_>, path: &'tcx Path<'tcx>, _: HirId) { let segments = path.segments.iter().rev().skip(1).rev(); if let Some(last) = segments.last() { @@ -94,7 +97,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TyTyKind { } } - fn check_ty(&mut self, cx: &LateContext<'_, '_>, ty: &'tcx Ty) { + fn check_ty(&mut self, cx: &LateContext<'_, '_>, ty: &'tcx Ty<'tcx>) { match &ty.kind { TyKind::Path(qpath) => { if let QPath::Resolved(_, path) = qpath { @@ -132,7 +135,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TyTyKind { } } } - TyKind::Rptr(_, MutTy { ty: inner_ty, mutbl: Mutability::Immutable }) => { + TyKind::Rptr(_, MutTy { ty: inner_ty, mutbl: Mutability::Not }) => { if let Some(impl_did) = cx.tcx.impl_of_method(ty.hir_id.owner_def_id()) { if cx.tcx.impl_trait_ref(impl_did).is_some() { return; @@ -159,7 +162,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TyTyKind { } } -fn lint_ty_kind_usage(cx: &LateContext<'_, '_>, segment: &PathSegment) -> bool { +fn lint_ty_kind_usage(cx: &LateContext<'_, '_>, segment: &PathSegment<'_>) -> bool { if let Some(res) = segment.res { if let Some(did) = res.opt_def_id() { return cx.tcx.is_diagnostic_item(sym::TyKind, did); @@ -169,7 +172,7 @@ fn lint_ty_kind_usage(cx: &LateContext<'_, '_>, segment: &PathSegment) -> bool { false } -fn is_ty_or_ty_ctxt(cx: &LateContext<'_, '_>, ty: &Ty) -> Option { +fn is_ty_or_ty_ctxt(cx: &LateContext<'_, '_>, ty: &Ty<'_>) -> Option { match &ty.kind { TyKind::Path(qpath) => { if let QPath::Resolved(_, path) = qpath { @@ -187,7 +190,7 @@ fn is_ty_or_ty_ctxt(cx: &LateContext<'_, '_>, ty: &Ty) -> Option { None } -fn gen_args(segment: &PathSegment) -> String { +fn gen_args(segment: &PathSegment<'_>) -> String { if let Some(args) = &segment.args { let lifetimes = args .args @@ -219,13 +222,15 @@ declare_lint_pass!(LintPassImpl => [LINT_PASS_IMPL_WITHOUT_MACRO]); impl EarlyLintPass for LintPassImpl { fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) { - if let ItemKind::Impl(_, _, _, _, Some(lint_pass), _, _) = &item.kind { + if let ItemKind::Impl { of_trait: Some(lint_pass), .. } = &item.kind { if let Some(last) = lint_pass.path.segments.last() { if last.ident.name == sym::LintPass { let expn_data = lint_pass.path.span.ctxt().outer_expn_data(); let call_site = expn_data.call_site; - if expn_data.kind.descr() != sym::impl_lint_pass && - call_site.ctxt().outer_expn_data().kind.descr() != sym::declare_lint_pass { + if expn_data.kind != ExpnKind::Macro(MacroKind::Bang, sym::impl_lint_pass) + && call_site.ctxt().outer_expn_data().kind + != ExpnKind::Macro(MacroKind::Bang, sym::declare_lint_pass) + { cx.struct_span_lint( LINT_PASS_IMPL_WITHOUT_MACRO, lint_pass.path.span, diff --git a/src/librustc_lint/late.rs b/src/librustc_lint/late.rs new file mode 100644 index 0000000000..30a3788377 --- /dev/null +++ b/src/librustc_lint/late.rs @@ -0,0 +1,490 @@ +//! Implementation of lint checking. +//! +//! The lint checking is mostly consolidated into one pass which runs +//! after all other analyses. Throughout compilation, lint warnings +//! can be added via the `add_lint` method on the Session structure. This +//! requires a span and an ID of the node that the lint is being added to. The +//! lint isn't actually emitted at that time because it is unknown what the +//! actual lint level at that location is. +//! +//! To actually emit lint warnings/errors, a separate pass is used. +//! A context keeps track of the current state of all lint levels. +//! Upon entering a node of the ast which can modify the lint settings, the +//! previous lint state is pushed onto a stack and the ast is then recursed +//! upon. As the ast is traversed, this keeps track of the current lint level +//! for all lint attributes. + +use crate::{passes::LateLintPassObject, LateContext, LateLintPass, LintStore}; +use rustc::hir::map::Map; +use rustc::ty::{self, TyCtxt}; +use rustc_data_structures::sync::{join, par_iter, ParallelIterator}; +use rustc_hir as hir; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; +use rustc_hir::intravisit as hir_visit; +use rustc_hir::intravisit::Visitor; +use rustc_session::lint::LintPass; +use rustc_span::Span; +use syntax::ast; +use syntax::walk_list; + +use log::debug; +use std::any::Any; +use std::slice; + +/// Extract the `LintStore` from the query context. +/// This function exists because we've erased `LintStore` as `dyn Any` in the context. +crate fn unerased_lint_store<'tcx>(tcx: TyCtxt<'tcx>) -> &'tcx LintStore { + let store: &dyn Any = &*tcx.lint_store; + store.downcast_ref().unwrap() +} + +macro_rules! lint_callback { ($cx:expr, $f:ident, $($args:expr),*) => ({ + $cx.pass.$f(&$cx.context, $($args),*); +}) } + +struct LateContextAndPass<'a, 'tcx, T: LateLintPass<'a, 'tcx>> { + context: LateContext<'a, 'tcx>, + pass: T, +} + +impl<'a, 'tcx, T: LateLintPass<'a, 'tcx>> LateContextAndPass<'a, 'tcx, T> { + /// Merge the lints specified by any lint attributes into the + /// current lint context, call the provided function, then reset the + /// lints in effect to their previous state. + fn with_lint_attrs(&mut self, id: hir::HirId, attrs: &'tcx [ast::Attribute], f: F) + where + F: FnOnce(&mut Self), + { + let prev = self.context.last_node_with_lint_attrs; + self.context.last_node_with_lint_attrs = id; + self.enter_attrs(attrs); + f(self); + self.exit_attrs(attrs); + self.context.last_node_with_lint_attrs = prev; + } + + fn with_param_env(&mut self, id: hir::HirId, f: F) + where + F: FnOnce(&mut Self), + { + let old_param_env = self.context.param_env; + self.context.param_env = + self.context.tcx.param_env(self.context.tcx.hir().local_def_id(id)); + f(self); + self.context.param_env = old_param_env; + } + + fn process_mod(&mut self, m: &'tcx hir::Mod<'tcx>, s: Span, n: hir::HirId) { + lint_callback!(self, check_mod, m, s, n); + hir_visit::walk_mod(self, m, n); + lint_callback!(self, check_mod_post, m, s, n); + } + + fn enter_attrs(&mut self, attrs: &'tcx [ast::Attribute]) { + debug!("late context: enter_attrs({:?})", attrs); + lint_callback!(self, enter_lint_attrs, attrs); + } + + fn exit_attrs(&mut self, attrs: &'tcx [ast::Attribute]) { + debug!("late context: exit_attrs({:?})", attrs); + lint_callback!(self, exit_lint_attrs, attrs); + } +} + +impl<'a, 'tcx, T: LateLintPass<'a, 'tcx>> hir_visit::Visitor<'tcx> + for LateContextAndPass<'a, 'tcx, T> +{ + type Map = Map<'tcx>; + + /// Because lints are scoped lexically, we want to walk nested + /// items in the context of the outer item, so enable + /// deep-walking. + fn nested_visit_map<'this>(&'this mut self) -> hir_visit::NestedVisitorMap<'this, Self::Map> { + hir_visit::NestedVisitorMap::All(&self.context.tcx.hir()) + } + + fn visit_nested_body(&mut self, body: hir::BodyId) { + let old_tables = self.context.tables; + self.context.tables = self.context.tcx.body_tables(body); + let body = self.context.tcx.hir().body(body); + self.visit_body(body); + self.context.tables = old_tables; + } + + fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { + self.with_lint_attrs(param.hir_id, ¶m.attrs, |cx| { + lint_callback!(cx, check_param, param); + hir_visit::walk_param(cx, param); + }); + } + + fn visit_body(&mut self, body: &'tcx hir::Body<'tcx>) { + lint_callback!(self, check_body, body); + hir_visit::walk_body(self, body); + lint_callback!(self, check_body_post, body); + } + + fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) { + let generics = self.context.generics.take(); + self.context.generics = it.kind.generics(); + self.with_lint_attrs(it.hir_id, &it.attrs, |cx| { + cx.with_param_env(it.hir_id, |cx| { + lint_callback!(cx, check_item, it); + hir_visit::walk_item(cx, it); + lint_callback!(cx, check_item_post, it); + }); + }); + self.context.generics = generics; + } + + fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) { + self.with_lint_attrs(it.hir_id, &it.attrs, |cx| { + cx.with_param_env(it.hir_id, |cx| { + lint_callback!(cx, check_foreign_item, it); + hir_visit::walk_foreign_item(cx, it); + lint_callback!(cx, check_foreign_item_post, it); + }); + }) + } + + fn visit_pat(&mut self, p: &'tcx hir::Pat<'tcx>) { + lint_callback!(self, check_pat, p); + hir_visit::walk_pat(self, p); + } + + fn visit_expr(&mut self, e: &'tcx hir::Expr<'tcx>) { + self.with_lint_attrs(e.hir_id, &e.attrs, |cx| { + lint_callback!(cx, check_expr, e); + hir_visit::walk_expr(cx, e); + lint_callback!(cx, check_expr_post, e); + }) + } + + fn visit_stmt(&mut self, s: &'tcx hir::Stmt<'tcx>) { + // statement attributes are actually just attributes on one of + // - item + // - local + // - expression + // so we keep track of lint levels there + lint_callback!(self, check_stmt, s); + hir_visit::walk_stmt(self, s); + } + + fn visit_fn( + &mut self, + fk: hir_visit::FnKind<'tcx>, + decl: &'tcx hir::FnDecl<'tcx>, + body_id: hir::BodyId, + span: Span, + id: hir::HirId, + ) { + // Wrap in tables here, not just in visit_nested_body, + // in order for `check_fn` to be able to use them. + let old_tables = self.context.tables; + self.context.tables = self.context.tcx.body_tables(body_id); + let body = self.context.tcx.hir().body(body_id); + lint_callback!(self, check_fn, fk, decl, body, span, id); + hir_visit::walk_fn(self, fk, decl, body_id, span, id); + lint_callback!(self, check_fn_post, fk, decl, body, span, id); + self.context.tables = old_tables; + } + + fn visit_variant_data( + &mut self, + s: &'tcx hir::VariantData<'tcx>, + _: ast::Name, + _: &'tcx hir::Generics<'tcx>, + _: hir::HirId, + _: Span, + ) { + lint_callback!(self, check_struct_def, s); + hir_visit::walk_struct_def(self, s); + lint_callback!(self, check_struct_def_post, s); + } + + fn visit_struct_field(&mut self, s: &'tcx hir::StructField<'tcx>) { + self.with_lint_attrs(s.hir_id, &s.attrs, |cx| { + lint_callback!(cx, check_struct_field, s); + hir_visit::walk_struct_field(cx, s); + }) + } + + fn visit_variant( + &mut self, + v: &'tcx hir::Variant<'tcx>, + g: &'tcx hir::Generics<'tcx>, + item_id: hir::HirId, + ) { + self.with_lint_attrs(v.id, &v.attrs, |cx| { + lint_callback!(cx, check_variant, v); + hir_visit::walk_variant(cx, v, g, item_id); + lint_callback!(cx, check_variant_post, v); + }) + } + + fn visit_ty(&mut self, t: &'tcx hir::Ty<'tcx>) { + lint_callback!(self, check_ty, t); + hir_visit::walk_ty(self, t); + } + + fn visit_name(&mut self, sp: Span, name: ast::Name) { + lint_callback!(self, check_name, sp, name); + } + + fn visit_mod(&mut self, m: &'tcx hir::Mod<'tcx>, s: Span, n: hir::HirId) { + if !self.context.only_module { + self.process_mod(m, s, n); + } + } + + fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) { + self.with_lint_attrs(l.hir_id, &l.attrs, |cx| { + lint_callback!(cx, check_local, l); + hir_visit::walk_local(cx, l); + }) + } + + fn visit_block(&mut self, b: &'tcx hir::Block<'tcx>) { + lint_callback!(self, check_block, b); + hir_visit::walk_block(self, b); + lint_callback!(self, check_block_post, b); + } + + fn visit_arm(&mut self, a: &'tcx hir::Arm<'tcx>) { + lint_callback!(self, check_arm, a); + hir_visit::walk_arm(self, a); + } + + fn visit_generic_param(&mut self, p: &'tcx hir::GenericParam<'tcx>) { + lint_callback!(self, check_generic_param, p); + hir_visit::walk_generic_param(self, p); + } + + fn visit_generics(&mut self, g: &'tcx hir::Generics<'tcx>) { + lint_callback!(self, check_generics, g); + hir_visit::walk_generics(self, g); + } + + fn visit_where_predicate(&mut self, p: &'tcx hir::WherePredicate<'tcx>) { + lint_callback!(self, check_where_predicate, p); + hir_visit::walk_where_predicate(self, p); + } + + fn visit_poly_trait_ref( + &mut self, + t: &'tcx hir::PolyTraitRef<'tcx>, + m: hir::TraitBoundModifier, + ) { + lint_callback!(self, check_poly_trait_ref, t, m); + hir_visit::walk_poly_trait_ref(self, t, m); + } + + fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) { + let generics = self.context.generics.take(); + self.context.generics = Some(&trait_item.generics); + self.with_lint_attrs(trait_item.hir_id, &trait_item.attrs, |cx| { + cx.with_param_env(trait_item.hir_id, |cx| { + lint_callback!(cx, check_trait_item, trait_item); + hir_visit::walk_trait_item(cx, trait_item); + lint_callback!(cx, check_trait_item_post, trait_item); + }); + }); + self.context.generics = generics; + } + + fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { + let generics = self.context.generics.take(); + self.context.generics = Some(&impl_item.generics); + self.with_lint_attrs(impl_item.hir_id, &impl_item.attrs, |cx| { + cx.with_param_env(impl_item.hir_id, |cx| { + lint_callback!(cx, check_impl_item, impl_item); + hir_visit::walk_impl_item(cx, impl_item); + lint_callback!(cx, check_impl_item_post, impl_item); + }); + }); + self.context.generics = generics; + } + + fn visit_lifetime(&mut self, lt: &'tcx hir::Lifetime) { + lint_callback!(self, check_lifetime, lt); + hir_visit::walk_lifetime(self, lt); + } + + fn visit_path(&mut self, p: &'tcx hir::Path<'tcx>, id: hir::HirId) { + lint_callback!(self, check_path, p, id); + hir_visit::walk_path(self, p); + } + + fn visit_attribute(&mut self, attr: &'tcx ast::Attribute) { + lint_callback!(self, check_attribute, attr); + } +} + +struct LateLintPassObjects<'a> { + lints: &'a mut [LateLintPassObject], +} + +#[allow(rustc::lint_pass_impl_without_macro)] +impl LintPass for LateLintPassObjects<'_> { + fn name(&self) -> &'static str { + panic!() + } +} + +macro_rules! expand_late_lint_pass_impl_methods { + ([$a:tt, $hir:tt], [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( + $(fn $name(&mut self, context: &LateContext<$a, $hir>, $($param: $arg),*) { + for obj in self.lints.iter_mut() { + obj.$name(context, $($param),*); + } + })* + ) +} + +macro_rules! late_lint_pass_impl { + ([], [$hir:tt], $methods:tt) => ( + impl<'a, $hir> LateLintPass<'a, $hir> for LateLintPassObjects<'_> { + expand_late_lint_pass_impl_methods!(['a, $hir], $methods); + } + ) +} + +crate::late_lint_methods!(late_lint_pass_impl, [], ['tcx]); + +fn late_lint_mod_pass<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>( + tcx: TyCtxt<'tcx>, + module_def_id: DefId, + pass: T, +) { + let access_levels = &tcx.privacy_access_levels(LOCAL_CRATE); + + let context = LateContext { + tcx, + tables: &ty::TypeckTables::empty(None), + param_env: ty::ParamEnv::empty(), + access_levels, + lint_store: unerased_lint_store(tcx), + last_node_with_lint_attrs: tcx.hir().as_local_hir_id(module_def_id).unwrap(), + generics: None, + only_module: true, + }; + + let mut cx = LateContextAndPass { context, pass }; + + let (module, span, hir_id) = tcx.hir().get_module(module_def_id); + cx.process_mod(module, span, hir_id); + + // Visit the crate attributes + if hir_id == hir::CRATE_HIR_ID { + walk_list!(cx, visit_attribute, tcx.hir().attrs(hir::CRATE_HIR_ID)); + } +} + +pub fn late_lint_mod<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>( + tcx: TyCtxt<'tcx>, + module_def_id: DefId, + builtin_lints: T, +) { + if tcx.sess.opts.debugging_opts.no_interleave_lints { + // These passes runs in late_lint_crate with -Z no_interleave_lints + return; + } + + late_lint_mod_pass(tcx, module_def_id, builtin_lints); + + let mut passes: Vec<_> = + unerased_lint_store(tcx).late_module_passes.iter().map(|pass| (pass)()).collect(); + + if !passes.is_empty() { + late_lint_mod_pass(tcx, module_def_id, LateLintPassObjects { lints: &mut passes[..] }); + } +} + +fn late_lint_pass_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(tcx: TyCtxt<'tcx>, pass: T) { + let access_levels = &tcx.privacy_access_levels(LOCAL_CRATE); + + let krate = tcx.hir().krate(); + + let context = LateContext { + tcx, + tables: &ty::TypeckTables::empty(None), + param_env: ty::ParamEnv::empty(), + access_levels, + lint_store: unerased_lint_store(tcx), + last_node_with_lint_attrs: hir::CRATE_HIR_ID, + generics: None, + only_module: false, + }; + + let mut cx = LateContextAndPass { context, pass }; + + // Visit the whole crate. + cx.with_lint_attrs(hir::CRATE_HIR_ID, &krate.attrs, |cx| { + // since the root module isn't visited as an item (because it isn't an + // item), warn for it here. + lint_callback!(cx, check_crate, krate); + + hir_visit::walk_crate(cx, krate); + + lint_callback!(cx, check_crate_post, krate); + }) +} + +fn late_lint_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(tcx: TyCtxt<'tcx>, builtin_lints: T) { + let mut passes = unerased_lint_store(tcx).late_passes.iter().map(|p| (p)()).collect::>(); + + if !tcx.sess.opts.debugging_opts.no_interleave_lints { + if !passes.is_empty() { + late_lint_pass_crate(tcx, LateLintPassObjects { lints: &mut passes[..] }); + } + + late_lint_pass_crate(tcx, builtin_lints); + } else { + for pass in &mut passes { + tcx.sess + .prof + .extra_verbose_generic_activity(&format!("running late lint: {}", pass.name())) + .run(|| { + late_lint_pass_crate(tcx, LateLintPassObjects { lints: slice::from_mut(pass) }); + }); + } + + let mut passes: Vec<_> = + unerased_lint_store(tcx).late_module_passes.iter().map(|pass| (pass)()).collect(); + + for pass in &mut passes { + tcx.sess + .prof + .extra_verbose_generic_activity(&format!( + "running late module lint: {}", + pass.name() + )) + .run(|| { + late_lint_pass_crate(tcx, LateLintPassObjects { lints: slice::from_mut(pass) }); + }); + } + } +} + +/// Performs lint checking on a crate. +pub fn check_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>( + tcx: TyCtxt<'tcx>, + builtin_lints: impl FnOnce() -> T + Send, +) { + join( + || { + tcx.sess.time("crate_lints", || { + // Run whole crate non-incremental lints + late_lint_crate(tcx, builtin_lints()); + }); + }, + || { + tcx.sess.time("module_lints", || { + // Run per-module lints + par_iter(&tcx.hir().krate().modules).for_each(|(&module, _)| { + tcx.ensure().lint_mod(tcx.hir().local_def_id(module)); + }); + }); + }, + ); +} diff --git a/src/librustc/lint/levels.rs b/src/librustc_lint/levels.rs similarity index 55% rename from src/librustc/lint/levels.rs rename to src/librustc_lint/levels.rs index f29d1a3789..d5bbdc5316 100644 --- a/src/librustc/lint/levels.rs +++ b/src/librustc_lint/levels.rs @@ -1,62 +1,75 @@ -use std::cmp; - -use crate::hir::HirId; -use crate::ich::StableHashingContext; -use crate::lint::builtin; -use crate::lint::context::{LintStore, CheckLintNameResult}; -use crate::lint::{self, Lint, LintId, Level, LintSource}; -use crate::session::Session; -use crate::util::nodemap::FxHashMap; -use errors::{Applicability, DiagnosticBuilder}; -use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use crate::context::{CheckLintNameResult, LintStore}; +use crate::late::unerased_lint_store; +use rustc::hir::map::Map; +use rustc::lint::struct_lint_level; +use rustc::lint::{LintLevelMap, LintLevelSets, LintSet, LintSource}; +use rustc::ty::query::Providers; +use rustc::ty::TyCtxt; +use rustc_data_structures::fx::FxHashMap; +use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder}; +use rustc_hir as hir; +use rustc_hir::def_id::{CrateNum, LOCAL_CRATE}; +use rustc_hir::hir_id::HirId; +use rustc_hir::intravisit; +use rustc_session::lint::{builtin, Level, Lint}; +use rustc_session::Session; +use rustc_span::{sym, MultiSpan, Symbol}; use syntax::ast; use syntax::attr; -use syntax::feature_gate; use syntax::print::pprust; -use syntax::source_map::MultiSpan; -use syntax::symbol::{Symbol, sym}; +use syntax::sess::feature_err; +use syntax::unwrap_or; + +use std::cmp; -use rustc_error_codes::*; +fn lint_levels(tcx: TyCtxt<'_>, cnum: CrateNum) -> &LintLevelMap { + assert_eq!(cnum, LOCAL_CRATE); + let store = unerased_lint_store(tcx); + let levels = LintLevelsBuilder::new(tcx.sess, false, &store); + let mut builder = LintLevelMapBuilder { levels, tcx, store }; + let krate = tcx.hir().krate(); + + let push = builder.levels.push(&krate.attrs, &store); + builder.levels.register_id(hir::CRATE_HIR_ID); + for macro_def in krate.exported_macros { + builder.levels.register_id(macro_def.hir_id); + } + intravisit::walk_crate(&mut builder, krate); + builder.levels.pop(push); -pub struct LintLevelSets { - list: Vec, - lint_cap: Level, + tcx.arena.alloc(builder.levels.build_map()) } -enum LintSet { - CommandLine { - // -A,-W,-D flags, a `Symbol` for the flag itself and `Level` for which - // flag. - specs: FxHashMap, - }, - - Node { - specs: FxHashMap, - parent: u32, - }, +pub struct LintLevelsBuilder<'a> { + sess: &'a Session, + sets: LintLevelSets, + id_to_set: FxHashMap, + cur: u32, + warn_about_weird_lints: bool, } -impl LintLevelSets { - pub fn new(sess: &Session, lint_store: &LintStore) -> LintLevelSets { - let mut me = LintLevelSets { - list: Vec::new(), - lint_cap: Level::Forbid, - }; - me.process_command_line(sess, lint_store); - return me - } +pub struct BuilderPush { + prev: u32, + pub changed: bool, +} - pub fn builder<'a>( - sess: &'a Session, - warn_about_weird_lints: bool, - store: &LintStore, - ) -> LintLevelsBuilder<'a> { - LintLevelsBuilder::new(sess, warn_about_weird_lints, LintLevelSets::new(sess, store)) +impl<'a> LintLevelsBuilder<'a> { + pub fn new(sess: &'a Session, warn_about_weird_lints: bool, store: &LintStore) -> Self { + let mut builder = LintLevelsBuilder { + sess, + sets: LintLevelSets::new(), + cur: 0, + id_to_set: Default::default(), + warn_about_weird_lints, + }; + builder.process_command_line(sess, store); + assert_eq!(builder.sets.list.len(), 1); + builder } fn process_command_line(&mut self, sess: &Session, store: &LintStore) { let mut specs = FxHashMap::default(); - self.lint_cap = sess.opts.lint_cap.unwrap_or(Level::Forbid); + self.sets.lint_cap = sess.opts.lint_cap.unwrap_or(Level::Forbid); for &(ref lint_name, level) in &sess.opts.lint_opts { store.check_lint_name_cmdline(sess, &lint_name, level); @@ -64,7 +77,7 @@ impl LintLevelSets { // If the cap is less than this specified level, e.g., if we've got // `--cap-lints allow` but we've also got `-D foo` then we ignore // this specification as the lint cap will set it to allow anyway. - let level = cmp::min(level, self.lint_cap); + let level = cmp::min(level, self.sets.lint_cap); let lint_flag_val = Symbol::intern(lint_name); let ids = match store.find_lints(&lint_name) { @@ -77,108 +90,7 @@ impl LintLevelSets { } } - self.list.push(LintSet::CommandLine { - specs: specs, - }); - } - - fn get_lint_level(&self, - lint: &'static Lint, - idx: u32, - aux: Option<&FxHashMap>, - sess: &Session) - -> (Level, LintSource) - { - let (level, mut src) = self.get_lint_id_level(LintId::of(lint), idx, aux); - - // If `level` is none then we actually assume the default level for this - // lint. - let mut level = level.unwrap_or_else(|| lint.default_level(sess.edition())); - - // If we're about to issue a warning, check at the last minute for any - // directives against the warnings "lint". If, for example, there's an - // `allow(warnings)` in scope then we want to respect that instead. - if level == Level::Warn { - let (warnings_level, warnings_src) = - self.get_lint_id_level(LintId::of(lint::builtin::WARNINGS), - idx, - aux); - if let Some(configured_warning_level) = warnings_level { - if configured_warning_level != Level::Warn { - level = configured_warning_level; - src = warnings_src; - } - } - } - - // Ensure that we never exceed the `--cap-lints` argument. - level = cmp::min(level, self.lint_cap); - - if let Some(driver_level) = sess.driver_lint_caps.get(&LintId::of(lint)) { - // Ensure that we never exceed driver level. - level = cmp::min(*driver_level, level); - } - - return (level, src) - } - - fn get_lint_id_level(&self, - id: LintId, - mut idx: u32, - aux: Option<&FxHashMap>) - -> (Option, LintSource) - { - if let Some(specs) = aux { - if let Some(&(level, src)) = specs.get(&id) { - return (Some(level), src) - } - } - loop { - match self.list[idx as usize] { - LintSet::CommandLine { ref specs } => { - if let Some(&(level, src)) = specs.get(&id) { - return (Some(level), src) - } - return (None, LintSource::Default) - } - LintSet::Node { ref specs, parent } => { - if let Some(&(level, src)) = specs.get(&id) { - return (Some(level), src) - } - idx = parent; - } - } - } - } -} - -pub struct LintLevelsBuilder<'a> { - sess: &'a Session, - sets: LintLevelSets, - id_to_set: FxHashMap, - cur: u32, - warn_about_weird_lints: bool, -} - -pub struct BuilderPush { - prev: u32, - pub(super) changed: bool, -} - -impl<'a> LintLevelsBuilder<'a> { - pub fn new( - sess: &'a Session, - warn_about_weird_lints: bool, - sets: LintLevelSets, - ) -> LintLevelsBuilder<'a> { - assert_eq!(sets.list.len(), 1); - LintLevelsBuilder { - sess, - sets, - cur: 0, - id_to_set: Default::default(), - warn_about_weird_lints, - } + self.sets.list.push(LintSet::CommandLine { specs }); } /// Pushes a list of AST lint attributes onto this context. @@ -198,9 +110,7 @@ impl<'a> LintLevelsBuilder<'a> { pub fn push(&mut self, attrs: &[ast::Attribute], store: &LintStore) -> BuilderPush { let mut specs = FxHashMap::default(); let sess = self.sess; - let bad_attr = |span| { - struct_span_err!(sess, span, E0452, "malformed lint attribute input") - }; + let bad_attr = |span| struct_span_err!(sess, span, E0452, "malformed lint attribute input"); for attr in attrs { let level = match Level::from_symbol(attr.name_or_empty()) { None => continue, @@ -220,23 +130,23 @@ impl<'a> LintLevelsBuilder<'a> { // Before processing the lint names, look for a reason (RFC 2383) // at the end. let mut reason = None; - let tail_li = &metas[metas.len()-1]; + let tail_li = &metas[metas.len() - 1]; if let Some(item) = tail_li.meta_item() { match item.kind { - ast::MetaItemKind::Word => {} // actual lint names handled later + ast::MetaItemKind::Word => {} // actual lint names handled later ast::MetaItemKind::NameValue(ref name_value) => { if item.path == sym::reason { // found reason, reslice meta list to exclude it - metas = &metas[0..metas.len()-1]; + metas = &metas[0..metas.len() - 1]; // FIXME (#55112): issue unused-attributes lint if we thereby // don't have any lint names (`#[level(reason = "foo")]`) if let ast::LitKind::Str(rationale, _) = name_value.kind { if !self.sess.features_untracked().lint_reasons { - feature_gate::feature_err( + feature_err( &self.sess.parse_sess, sym::lint_reasons, item.span, - "lint reasons are experimental" + "lint reasons are experimental", ) .emit(); } @@ -251,11 +161,9 @@ impl<'a> LintLevelsBuilder<'a> { .span_label(item.span, "bad attribute argument") .emit(); } - }, + } ast::MetaItemKind::List(_) => { - bad_attr(item.span) - .span_label(item.span, "bad attribute argument") - .emit(); + bad_attr(item.span).span_label(item.span, "bad attribute argument").emit(); } } } @@ -285,13 +193,14 @@ impl<'a> LintLevelsBuilder<'a> { let tool_name = if meta_item.path.segments.len() > 1 { let tool_ident = meta_item.path.segments[0].ident; if !attr::is_known_lint_tool(tool_ident) { - span_err!( + struct_span_err!( sess, tool_ident.span, E0710, "an unknown tool name found in scoped lint: `{}`", pprust::path_to_string(&meta_item.path), - ); + ) + .emit(); continue; } @@ -313,7 +222,9 @@ impl<'a> LintLevelsBuilder<'a> { Ok(ids) => { let complete_name = &format!("{}::{}", tool_name.unwrap(), name); let src = LintSource::Node( - Symbol::intern(complete_name), li.span(), reason + Symbol::intern(complete_name), + li.span(), + reason, ); for id in ids { specs.insert(*id, (level, src)); @@ -322,30 +233,33 @@ impl<'a> LintLevelsBuilder<'a> { Err((Some(ids), new_lint_name)) => { let lint = builtin::RENAMED_AND_REMOVED_LINTS; let (lvl, src) = - self.sets - .get_lint_level(lint, self.cur, Some(&specs), &sess); + self.sets.get_lint_level(lint, self.cur, Some(&specs), &sess); let msg = format!( "lint name `{}` is deprecated \ and may not have an effect in the future. \ Also `cfg_attr(cargo-clippy)` won't be necessary anymore", name ); - lint::struct_lint_level( + struct_lint_level( self.sess, lint, lvl, src, Some(li.span().into()), &msg, - ).span_suggestion( + ) + .span_suggestion( li.span(), "change it to", new_lint_name.to_string(), Applicability::MachineApplicable, - ).emit(); + ) + .emit(); let src = LintSource::Node( - Symbol::intern(&new_lint_name), li.span(), reason + Symbol::intern(&new_lint_name), + li.span(), + reason, ); for id in ids { specs.insert(*id, (level, src)); @@ -364,39 +278,39 @@ impl<'a> LintLevelsBuilder<'a> { CheckLintNameResult::Warning(msg, renamed) => { let lint = builtin::RENAMED_AND_REMOVED_LINTS; - let (level, src) = self.sets.get_lint_level(lint, - self.cur, - Some(&specs), - &sess); - let mut err = lint::struct_lint_level(self.sess, - lint, - level, - src, - Some(li.span().into()), - &msg); + let (level, src) = + self.sets.get_lint_level(lint, self.cur, Some(&specs), &sess); + let mut err = struct_lint_level( + self.sess, + lint, + level, + src, + Some(li.span().into()), + &msg, + ); if let Some(new_name) = renamed { err.span_suggestion( li.span(), "use the new name", new_name, - Applicability::MachineApplicable + Applicability::MachineApplicable, ); } err.emit(); } CheckLintNameResult::NoLint(suggestion) => { let lint = builtin::UNKNOWN_LINTS; - let (level, src) = self.sets.get_lint_level(lint, - self.cur, - Some(&specs), - self.sess); + let (level, src) = + self.sets.get_lint_level(lint, self.cur, Some(&specs), self.sess); let msg = format!("unknown lint: `{}`", name); - let mut db = lint::struct_lint_level(self.sess, - lint, - level, - src, - Some(li.span().into()), - &msg); + let mut db = struct_lint_level( + self.sess, + lint, + level, + src, + Some(li.span().into()), + &msg, + ); if let Some(suggestion) = suggestion { db.span_suggestion( @@ -415,7 +329,7 @@ impl<'a> LintLevelsBuilder<'a> { for (id, &(level, ref src)) in specs.iter() { if level == Level::Forbid { - continue + continue; } let forbid_src = match self.sets.get_lint_id_level(*id, self.cur, None) { (Some(Level::Forbid), src) => src, @@ -430,45 +344,40 @@ impl<'a> LintLevelsBuilder<'a> { LintSource::Node(name, span, _) => (name, span), _ => continue, }; - let mut diag_builder = struct_span_err!(self.sess, - lint_attr_span, - E0453, - "{}({}) overruled by outer forbid({})", - level.as_str(), - lint_attr_name, - forbidden_lint_name); + let mut diag_builder = struct_span_err!( + self.sess, + lint_attr_span, + E0453, + "{}({}) overruled by outer forbid({})", + level.as_str(), + lint_attr_name, + forbidden_lint_name + ); diag_builder.span_label(lint_attr_span, "overruled by previous forbid"); match forbid_src { - LintSource::Default => {}, + LintSource::Default => {} LintSource::Node(_, forbid_source_span, reason) => { - diag_builder.span_label(forbid_source_span, - "`forbid` level set here"); + diag_builder.span_label(forbid_source_span, "`forbid` level set here"); if let Some(rationale) = reason { diag_builder.note(&rationale.as_str()); } - }, + } LintSource::CommandLine(_) => { diag_builder.note("`forbid` lint level was set on command line"); } } diag_builder.emit(); // don't set a separate error for every lint in the group - break + break; } let prev = self.cur; if specs.len() > 0 { self.cur = self.sets.list.len() as u32; - self.sets.list.push(LintSet::Node { - specs: specs, - parent: prev, - }); + self.sets.list.push(LintSet::Node { specs: specs, parent: prev }); } - BuilderPush { - prev: prev, - changed: prev != self.cur, - } + BuilderPush { prev: prev, changed: prev != self.cur } } /// Called after `push` when the scope of a set of attributes are exited. @@ -478,14 +387,14 @@ impl<'a> LintLevelsBuilder<'a> { /// Used to emit a lint-related diagnostic based on the current state of /// this lint context. - pub fn struct_lint(&self, - lint: &'static Lint, - span: Option, - msg: &str) - -> DiagnosticBuilder<'a> - { + pub fn struct_lint( + &self, + lint: &'static Lint, + span: Option, + msg: &str, + ) -> DiagnosticBuilder<'a> { let (level, src) = self.sets.get_lint_level(lint, self.cur, None, self.sess); - lint::struct_lint_level(self.sess, lint, level, src, span, msg) + struct_lint_level(self.sess, lint, level, src, span, msg) } /// Registers the ID provided with the current set of lints stored in @@ -499,70 +408,103 @@ impl<'a> LintLevelsBuilder<'a> { } pub fn build_map(self) -> LintLevelMap { - LintLevelMap { - sets: self.sets, - id_to_set: self.id_to_set, - } + LintLevelMap { sets: self.sets, id_to_set: self.id_to_set } } } -pub struct LintLevelMap { - sets: LintLevelSets, - id_to_set: FxHashMap, +struct LintLevelMapBuilder<'a, 'tcx> { + levels: LintLevelsBuilder<'tcx>, + tcx: TyCtxt<'tcx>, + store: &'a LintStore, } -impl LintLevelMap { - /// If the `id` was previously registered with `register_id` when building - /// this `LintLevelMap` this returns the corresponding lint level and source - /// of the lint level for the lint provided. - /// - /// If the `id` was not previously registered, returns `None`. If `None` is - /// returned then the parent of `id` should be acquired and this function - /// should be called again. - pub fn level_and_source(&self, lint: &'static Lint, id: HirId, session: &Session) - -> Option<(Level, LintSource)> +impl LintLevelMapBuilder<'_, '_> { + fn with_lint_attrs(&mut self, id: hir::HirId, attrs: &[ast::Attribute], f: F) + where + F: FnOnce(&mut Self), { - self.id_to_set.get(&id).map(|idx| { - self.sets.get_lint_level(lint, *idx, None, session) - }) + let push = self.levels.push(attrs, self.store); + if push.changed { + self.levels.register_id(id); + } + f(self); + self.levels.pop(push); } } -impl<'a> HashStable> for LintLevelMap { - #[inline] - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - let LintLevelMap { - ref sets, - ref id_to_set, - } = *self; +impl<'tcx> intravisit::Visitor<'tcx> for LintLevelMapBuilder<'_, 'tcx> { + type Map = Map<'tcx>; - id_to_set.hash_stable(hcx, hasher); + fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, Self::Map> { + intravisit::NestedVisitorMap::All(&self.tcx.hir()) + } - let LintLevelSets { - ref list, - lint_cap, - } = *sets; + fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { + self.with_lint_attrs(param.hir_id, ¶m.attrs, |builder| { + intravisit::walk_param(builder, param); + }); + } - lint_cap.hash_stable(hcx, hasher); + fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) { + self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { + intravisit::walk_item(builder, it); + }); + } - hcx.while_hashing_spans(true, |hcx| { - list.len().hash_stable(hcx, hasher); + fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) { + self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { + intravisit::walk_foreign_item(builder, it); + }) + } + + fn visit_expr(&mut self, e: &'tcx hir::Expr<'tcx>) { + self.with_lint_attrs(e.hir_id, &e.attrs, |builder| { + intravisit::walk_expr(builder, e); + }) + } - // We are working under the assumption here that the list of - // lint-sets is built in a deterministic order. - for lint_set in list { - ::std::mem::discriminant(lint_set).hash_stable(hcx, hasher); + fn visit_struct_field(&mut self, s: &'tcx hir::StructField<'tcx>) { + self.with_lint_attrs(s.hir_id, &s.attrs, |builder| { + intravisit::walk_struct_field(builder, s); + }) + } - match *lint_set { - LintSet::CommandLine { ref specs } => { - specs.hash_stable(hcx, hasher); - } - LintSet::Node { ref specs, parent } => { - specs.hash_stable(hcx, hasher); - parent.hash_stable(hcx, hasher); - } - } - } + fn visit_variant( + &mut self, + v: &'tcx hir::Variant<'tcx>, + g: &'tcx hir::Generics<'tcx>, + item_id: hir::HirId, + ) { + self.with_lint_attrs(v.id, &v.attrs, |builder| { + intravisit::walk_variant(builder, v, g, item_id); }) } + + fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) { + self.with_lint_attrs(l.hir_id, &l.attrs, |builder| { + intravisit::walk_local(builder, l); + }) + } + + fn visit_arm(&mut self, a: &'tcx hir::Arm<'tcx>) { + self.with_lint_attrs(a.hir_id, &a.attrs, |builder| { + intravisit::walk_arm(builder, a); + }) + } + + fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) { + self.with_lint_attrs(trait_item.hir_id, &trait_item.attrs, |builder| { + intravisit::walk_trait_item(builder, trait_item); + }); + } + + fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { + self.with_lint_attrs(impl_item.hir_id, &impl_item.attrs, |builder| { + intravisit::walk_impl_item(builder, impl_item); + }); + } +} + +pub fn provide(providers: &mut Providers<'_>) { + providers.lint_levels = lint_levels; } diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index b77f2cb8d6..78e9d0f14f 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -1,24 +1,39 @@ -//! # Lints in the Rust compiler +//! Lints, aka compiler warnings. //! -//! This currently only contains the definitions and implementations -//! of most of the lints that `rustc` supports directly, it does not -//! contain the infrastructure for defining/registering lints. That is -//! available in `rustc::lint` and `rustc_driver::plugin` respectively. +//! A 'lint' check is a kind of miscellaneous constraint that a user _might_ +//! want to enforce, but might reasonably want to permit as well, on a +//! module-by-module basis. They contrast with static constraints enforced by +//! other phases of the compiler, which are generally required to hold in order +//! to compile the program at all. +//! +//! Most lints can be written as `LintPass` instances. These run after +//! all other analyses. The `LintPass`es built into rustc are defined +//! within `rustc_session::lint::builtin`, +//! which has further comments on how to add such a lint. +//! rustc can also load user-defined lint plugins via the plugin mechanism. +//! +//! Some of rustc's lints are defined elsewhere in the compiler and work by +//! calling `add_lint()` on the overall `Session` object. This works when +//! it happens before the main lint pass, which emits the lints stored by +//! `add_lint()`. To emit lints after the main lint pass (from codegen, for +//! example) requires more effort. See `emit_lint` and `GatherNodeLevels` +//! in `context.rs`. +//! +//! Some code also exists in `rustc_session::lint`, `rustc::lint`. //! //! ## Note //! //! This API is completely unstable and subject to change. #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")] - #![cfg_attr(test, feature(test))] #![feature(bool_to_option)] #![feature(box_patterns)] #![feature(box_syntax)] +#![feature(crate_visibility_modifier)] +#![feature(never_type)] #![feature(nll)] -#![feature(matches_macro)] - -#![recursion_limit="256"] +#![recursion_limit = "256"] #[macro_use] extern crate rustc; @@ -26,81 +41,83 @@ extern crate rustc; extern crate rustc_session; mod array_into_iter; +pub mod builtin; +mod context; +mod early; +mod internal; +mod late; +mod levels; +mod non_ascii_idents; mod nonstandard_style; +mod passes; mod redundant_semicolon; -pub mod builtin; mod types; mod unused; -mod non_ascii_idents; -use rustc::lint; -use rustc::lint::{EarlyContext, LateContext, LateLintPass, EarlyLintPass, LintPass, LintArray}; -use rustc::lint::builtin::{ - BARE_TRAIT_OBJECTS, - ELIDED_LIFETIMES_IN_PATHS, - EXPLICIT_OUTLIVES_REQUIREMENTS, - INTRA_DOC_LINK_RESOLUTION_FAILURE, - MISSING_DOC_CODE_EXAMPLES, - PRIVATE_DOC_TESTS, -}; -use rustc::hir; -use rustc::hir::def_id::DefId; use rustc::ty::query::Providers; use rustc::ty::TyCtxt; - +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_session::lint::builtin::{ + BARE_TRAIT_OBJECTS, ELIDED_LIFETIMES_IN_PATHS, EXPLICIT_OUTLIVES_REQUIREMENTS, + INTRA_DOC_LINK_RESOLUTION_FAILURE, MISSING_DOC_CODE_EXAMPLES, PRIVATE_DOC_TESTS, +}; +use rustc_span::Span; use syntax::ast; -use syntax_pos::Span; - -use lint::LintId; -use redundant_semicolon::*; -use nonstandard_style::*; +use array_into_iter::ArrayIntoIter; use builtin::*; +use internal::*; +use non_ascii_idents::*; +use nonstandard_style::*; +use redundant_semicolon::*; use types::*; use unused::*; -use non_ascii_idents::*; -use rustc::lint::internal::*; -use array_into_iter::ArrayIntoIter; -/// Useful for other parts of the compiler. +/// Useful for other parts of the compiler / Clippy. pub use builtin::SoftLints; +pub use context::{CheckLintNameResult, EarlyContext, LateContext, LintContext, LintStore}; +pub use early::check_ast_crate; +pub use late::check_crate; +pub use passes::{EarlyLintPass, LateLintPass}; +pub use rustc_session::lint::Level::{self, *}; +pub use rustc_session::lint::{BufferedEarlyLint, FutureIncompatibleInfo, Lint, LintId}; +pub use rustc_session::lint::{LintArray, LintPass}; pub fn provide(providers: &mut Providers<'_>) { - *providers = Providers { - lint_mod, - ..*providers - }; + levels::provide(providers); + *providers = Providers { lint_mod, ..*providers }; } fn lint_mod(tcx: TyCtxt<'_>, module_def_id: DefId) { - lint::late_lint_mod(tcx, module_def_id, BuiltinCombinedModuleLateLintPass::new()); + late::late_lint_mod(tcx, module_def_id, BuiltinCombinedModuleLateLintPass::new()); } macro_rules! pre_expansion_lint_passes { - ($macro:path, $args:tt) => ( - $macro!($args, [ - KeywordIdents: KeywordIdents, - UnusedDocComment: UnusedDocComment, - ]); - ) + ($macro:path, $args:tt) => { + $macro!($args, [KeywordIdents: KeywordIdents, UnusedDocComment: UnusedDocComment,]); + }; } macro_rules! early_lint_passes { - ($macro:path, $args:tt) => ( - $macro!($args, [ - UnusedParens: UnusedParens, - UnusedImportBraces: UnusedImportBraces, - UnsafeCode: UnsafeCode, - AnonymousParameters: AnonymousParameters, - EllipsisInclusiveRangePatterns: EllipsisInclusiveRangePatterns::default(), - NonCamelCaseTypes: NonCamelCaseTypes, - DeprecatedAttr: DeprecatedAttr::new(), - WhileTrue: WhileTrue, - NonAsciiIdents: NonAsciiIdents, - IncompleteFeatures: IncompleteFeatures, - RedundantSemicolon: RedundantSemicolon, - ]); - ) + ($macro:path, $args:tt) => { + $macro!( + $args, + [ + UnusedParens: UnusedParens, + UnusedImportBraces: UnusedImportBraces, + UnsafeCode: UnsafeCode, + AnonymousParameters: AnonymousParameters, + EllipsisInclusiveRangePatterns: EllipsisInclusiveRangePatterns::default(), + NonCamelCaseTypes: NonCamelCaseTypes, + DeprecatedAttr: DeprecatedAttr::new(), + WhileTrue: WhileTrue, + NonAsciiIdents: NonAsciiIdents, + IncompleteFeatures: IncompleteFeatures, + RedundantSemicolon: RedundantSemicolon, + ] + ); + }; } macro_rules! declare_combined_early_pass { @@ -113,71 +130,62 @@ pre_expansion_lint_passes!(declare_combined_early_pass, [BuiltinCombinedPreExpan early_lint_passes!(declare_combined_early_pass, [BuiltinCombinedEarlyLintPass]); macro_rules! late_lint_passes { - ($macro:path, $args:tt) => ( - $macro!($args, [ - // FIXME: Look into regression when this is used as a module lint - // May Depend on constants elsewhere - UnusedBrokenConst: UnusedBrokenConst, - - // Uses attr::is_used which is untracked, can't be an incremental module pass. - UnusedAttributes: UnusedAttributes::new(), - - // Needs to run after UnusedAttributes as it marks all `feature` attributes as used. - UnstableFeatures: UnstableFeatures, - - // Tracks state across modules - UnnameableTestItems: UnnameableTestItems::new(), - - // Tracks attributes of parents - MissingDoc: MissingDoc::new(), - - // Depends on access levels - // FIXME: Turn the computation of types which implement Debug into a query - // and change this to a module lint pass - MissingDebugImplementations: MissingDebugImplementations::default(), - - ArrayIntoIter: ArrayIntoIter, - ]); - ) + ($macro:path, $args:tt) => { + $macro!( + $args, + [ + // FIXME: Look into regression when this is used as a module lint + // May Depend on constants elsewhere + UnusedBrokenConst: UnusedBrokenConst, + // Uses attr::is_used which is untracked, can't be an incremental module pass. + UnusedAttributes: UnusedAttributes::new(), + // Needs to run after UnusedAttributes as it marks all `feature` attributes as used. + UnstableFeatures: UnstableFeatures, + // Tracks state across modules + UnnameableTestItems: UnnameableTestItems::new(), + // Tracks attributes of parents + MissingDoc: MissingDoc::new(), + // Depends on access levels + // FIXME: Turn the computation of types which implement Debug into a query + // and change this to a module lint pass + MissingDebugImplementations: MissingDebugImplementations::default(), + ArrayIntoIter: ArrayIntoIter, + ] + ); + }; } macro_rules! late_lint_mod_passes { - ($macro:path, $args:tt) => ( - $macro!($args, [ - HardwiredLints: HardwiredLints, - ImproperCTypes: ImproperCTypes, - VariantSizeDifferences: VariantSizeDifferences, - BoxPointers: BoxPointers, - PathStatements: PathStatements, - - // Depends on referenced function signatures in expressions - UnusedResults: UnusedResults, - - NonUpperCaseGlobals: NonUpperCaseGlobals, - NonShorthandFieldPatterns: NonShorthandFieldPatterns, - UnusedAllocation: UnusedAllocation, - - // Depends on types used in type definitions - MissingCopyImplementations: MissingCopyImplementations, - - // Depends on referenced function signatures in expressions - MutableTransmutes: MutableTransmutes, - - TypeAliasBounds: TypeAliasBounds, - - TrivialConstraints: TrivialConstraints, - TypeLimits: TypeLimits::new(), - - NonSnakeCase: NonSnakeCase, - InvalidNoMangleItems: InvalidNoMangleItems, - - // Depends on access levels - UnreachablePub: UnreachablePub, - - ExplicitOutlivesRequirements: ExplicitOutlivesRequirements, - InvalidValue: InvalidValue, - ]); - ) + ($macro:path, $args:tt) => { + $macro!( + $args, + [ + HardwiredLints: HardwiredLints, + ImproperCTypes: ImproperCTypes, + VariantSizeDifferences: VariantSizeDifferences, + BoxPointers: BoxPointers, + PathStatements: PathStatements, + // Depends on referenced function signatures in expressions + UnusedResults: UnusedResults, + NonUpperCaseGlobals: NonUpperCaseGlobals, + NonShorthandFieldPatterns: NonShorthandFieldPatterns, + UnusedAllocation: UnusedAllocation, + // Depends on types used in type definitions + MissingCopyImplementations: MissingCopyImplementations, + // Depends on referenced function signatures in expressions + MutableTransmutes: MutableTransmutes, + TypeAliasBounds: TypeAliasBounds, + TrivialConstraints: TrivialConstraints, + TypeLimits: TypeLimits::new(), + NonSnakeCase: NonSnakeCase, + InvalidNoMangleItems: InvalidNoMangleItems, + // Depends on access levels + UnreachablePub: UnreachablePub, + ExplicitOutlivesRequirements: ExplicitOutlivesRequirements, + InvalidValue: InvalidValue, + ] + ); + }; } macro_rules! declare_combined_late_pass { @@ -191,8 +199,8 @@ late_lint_passes!(declare_combined_late_pass, [pub BuiltinCombinedLateLintPass]) late_lint_mod_passes!(declare_combined_late_pass, [BuiltinCombinedModuleLateLintPass]); -pub fn new_lint_store(no_interleave_lints: bool, internal_lints: bool) -> lint::LintStore { - let mut lint_store = lint::LintStore::new(); +pub fn new_lint_store(no_interleave_lints: bool, internal_lints: bool) -> LintStore { + let mut lint_store = LintStore::new(); register_builtins(&mut lint_store, no_interleave_lints); if internal_lints { @@ -205,7 +213,7 @@ pub fn new_lint_store(no_interleave_lints: bool, internal_lints: bool) -> lint:: /// Tell the `LintStore` about all the built-in lints (the ones /// defined in this crate and the ones defined in /// `rustc::lint::builtin`). -fn register_builtins(store: &mut lint::LintStore, no_interleave_lints: bool) { +fn register_builtins(store: &mut LintStore, no_interleave_lints: bool) { macro_rules! add_lint_group { ($name:expr, $($lint:ident),*) => ( store.register_group(false, $name, None, vec![$(LintId::of($lint)),*]); @@ -213,10 +221,10 @@ fn register_builtins(store: &mut lint::LintStore, no_interleave_lints: bool) { } macro_rules! register_pass { - ($method:ident, $ty:ident, $constructor:expr) => ( + ($method:ident, $ty:ident, $constructor:expr) => { store.register_lints(&$ty::get_lints()); store.$method(|| box $constructor); - ) + }; } macro_rules! register_passes { @@ -239,52 +247,57 @@ fn register_builtins(store: &mut lint::LintStore, no_interleave_lints: bool) { store.register_lints(&BuiltinCombinedLateLintPass::get_lints()); } - add_lint_group!("nonstandard_style", - NON_CAMEL_CASE_TYPES, - NON_SNAKE_CASE, - NON_UPPER_CASE_GLOBALS); - - add_lint_group!("unused", - UNUSED_IMPORTS, - UNUSED_VARIABLES, - UNUSED_ASSIGNMENTS, - DEAD_CODE, - UNUSED_MUT, - UNREACHABLE_CODE, - UNREACHABLE_PATTERNS, - OVERLAPPING_PATTERNS, - UNUSED_MUST_USE, - UNUSED_UNSAFE, - PATH_STATEMENTS, - UNUSED_ATTRIBUTES, - UNUSED_MACROS, - UNUSED_ALLOCATION, - UNUSED_DOC_COMMENTS, - UNUSED_EXTERN_CRATES, - UNUSED_FEATURES, - UNUSED_LABELS, - UNUSED_PARENS); - - add_lint_group!("rust_2018_idioms", - BARE_TRAIT_OBJECTS, - UNUSED_EXTERN_CRATES, - ELLIPSIS_INCLUSIVE_RANGE_PATTERNS, - ELIDED_LIFETIMES_IN_PATHS, - EXPLICIT_OUTLIVES_REQUIREMENTS + add_lint_group!( + "nonstandard_style", + NON_CAMEL_CASE_TYPES, + NON_SNAKE_CASE, + NON_UPPER_CASE_GLOBALS + ); - // FIXME(#52665, #47816) not always applicable and not all - // macros are ready for this yet. - // UNREACHABLE_PUB, + add_lint_group!( + "unused", + UNUSED_IMPORTS, + UNUSED_VARIABLES, + UNUSED_ASSIGNMENTS, + DEAD_CODE, + UNUSED_MUT, + UNREACHABLE_CODE, + UNREACHABLE_PATTERNS, + OVERLAPPING_PATTERNS, + UNUSED_MUST_USE, + UNUSED_UNSAFE, + PATH_STATEMENTS, + UNUSED_ATTRIBUTES, + UNUSED_MACROS, + UNUSED_ALLOCATION, + UNUSED_DOC_COMMENTS, + UNUSED_EXTERN_CRATES, + UNUSED_FEATURES, + UNUSED_LABELS, + UNUSED_PARENS + ); - // FIXME macro crates are not up for this yet, too much - // breakage is seen if we try to encourage this lint. - // MACRO_USE_EXTERN_CRATE, - ); + add_lint_group!( + "rust_2018_idioms", + BARE_TRAIT_OBJECTS, + UNUSED_EXTERN_CRATES, + ELLIPSIS_INCLUSIVE_RANGE_PATTERNS, + ELIDED_LIFETIMES_IN_PATHS, + EXPLICIT_OUTLIVES_REQUIREMENTS // FIXME(#52665, #47816) not always applicable and not all + // macros are ready for this yet. + // UNREACHABLE_PUB, + + // FIXME macro crates are not up for this yet, too much + // breakage is seen if we try to encourage this lint. + // MACRO_USE_EXTERN_CRATE + ); - add_lint_group!("rustdoc", - INTRA_DOC_LINK_RESOLUTION_FAILURE, - MISSING_DOC_CODE_EXAMPLES, - PRIVATE_DOC_TESTS); + add_lint_group!( + "rustdoc", + INTRA_DOC_LINK_RESOLUTION_FAILURE, + MISSING_DOC_CODE_EXAMPLES, + PRIVATE_DOC_TESTS + ); // Register renamed and removed lints. store.register_renamed("single_use_lifetime", "single_use_lifetimes"); @@ -305,56 +318,99 @@ fn register_builtins(store: &mut lint::LintStore, no_interleave_lints: bool) { store.register_removed("drop_with_repr_extern", "drop flags have been removed"); store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014"); store.register_removed("deprecated_attr", "use `deprecated` instead"); - store.register_removed("transmute_from_fn_item_types", - "always cast functions before transmuting them"); - store.register_removed("hr_lifetime_in_assoc_type", - "converted into hard error, see https://github.com/rust-lang/rust/issues/33685"); - store.register_removed("inaccessible_extern_crate", - "converted into hard error, see https://github.com/rust-lang/rust/issues/36886"); - store.register_removed("super_or_self_in_global_path", - "converted into hard error, see https://github.com/rust-lang/rust/issues/36888"); - store.register_removed("overlapping_inherent_impls", - "converted into hard error, see https://github.com/rust-lang/rust/issues/36889"); - store.register_removed("illegal_floating_point_constant_pattern", - "converted into hard error, see https://github.com/rust-lang/rust/issues/36890"); - store.register_removed("illegal_struct_or_enum_constant_pattern", - "converted into hard error, see https://github.com/rust-lang/rust/issues/36891"); - store.register_removed("lifetime_underscore", - "converted into hard error, see https://github.com/rust-lang/rust/issues/36892"); - store.register_removed("extra_requirement_in_impl", - "converted into hard error, see https://github.com/rust-lang/rust/issues/37166"); - store.register_removed("legacy_imports", - "converted into hard error, see https://github.com/rust-lang/rust/issues/38260"); - store.register_removed("coerce_never", - "converted into hard error, see https://github.com/rust-lang/rust/issues/48950"); - store.register_removed("resolve_trait_on_defaulted_unit", - "converted into hard error, see https://github.com/rust-lang/rust/issues/48950"); - store.register_removed("private_no_mangle_fns", - "no longer a warning, `#[no_mangle]` functions always exported"); - store.register_removed("private_no_mangle_statics", - "no longer a warning, `#[no_mangle]` statics always exported"); - store.register_removed("bad_repr", - "replaced with a generic attribute input check"); - store.register_removed("duplicate_matcher_binding_name", - "converted into hard error, see https://github.com/rust-lang/rust/issues/57742"); - store.register_removed("incoherent_fundamental_impls", - "converted into hard error, see https://github.com/rust-lang/rust/issues/46205"); - store.register_removed("legacy_constructor_visibility", - "converted into hard error, see https://github.com/rust-lang/rust/issues/39207"); - store.register_removed("legacy_directory_ownership", - "converted into hard error, see https://github.com/rust-lang/rust/issues/37872"); - store.register_removed("safe_extern_statics", - "converted into hard error, see https://github.com/rust-lang/rust/issues/36247"); - store.register_removed("parenthesized_params_in_types_and_modules", - "converted into hard error, see https://github.com/rust-lang/rust/issues/42238"); - store.register_removed("duplicate_macro_exports", - "converted into hard error, see https://github.com/rust-lang/rust/issues/35896"); - store.register_removed("nested_impl_trait", - "converted into hard error, see https://github.com/rust-lang/rust/issues/59014"); + store.register_removed( + "transmute_from_fn_item_types", + "always cast functions before transmuting them", + ); + store.register_removed( + "hr_lifetime_in_assoc_type", + "converted into hard error, see https://github.com/rust-lang/rust/issues/33685", + ); + store.register_removed( + "inaccessible_extern_crate", + "converted into hard error, see https://github.com/rust-lang/rust/issues/36886", + ); + store.register_removed( + "super_or_self_in_global_path", + "converted into hard error, see https://github.com/rust-lang/rust/issues/36888", + ); + store.register_removed( + "overlapping_inherent_impls", + "converted into hard error, see https://github.com/rust-lang/rust/issues/36889", + ); + store.register_removed( + "illegal_floating_point_constant_pattern", + "converted into hard error, see https://github.com/rust-lang/rust/issues/36890", + ); + store.register_removed( + "illegal_struct_or_enum_constant_pattern", + "converted into hard error, see https://github.com/rust-lang/rust/issues/36891", + ); + store.register_removed( + "lifetime_underscore", + "converted into hard error, see https://github.com/rust-lang/rust/issues/36892", + ); + store.register_removed( + "extra_requirement_in_impl", + "converted into hard error, see https://github.com/rust-lang/rust/issues/37166", + ); + store.register_removed( + "legacy_imports", + "converted into hard error, see https://github.com/rust-lang/rust/issues/38260", + ); + store.register_removed( + "coerce_never", + "converted into hard error, see https://github.com/rust-lang/rust/issues/48950", + ); + store.register_removed( + "resolve_trait_on_defaulted_unit", + "converted into hard error, see https://github.com/rust-lang/rust/issues/48950", + ); + store.register_removed( + "private_no_mangle_fns", + "no longer a warning, `#[no_mangle]` functions always exported", + ); + store.register_removed( + "private_no_mangle_statics", + "no longer a warning, `#[no_mangle]` statics always exported", + ); + store.register_removed("bad_repr", "replaced with a generic attribute input check"); + store.register_removed( + "duplicate_matcher_binding_name", + "converted into hard error, see https://github.com/rust-lang/rust/issues/57742", + ); + store.register_removed( + "incoherent_fundamental_impls", + "converted into hard error, see https://github.com/rust-lang/rust/issues/46205", + ); + store.register_removed( + "legacy_constructor_visibility", + "converted into hard error, see https://github.com/rust-lang/rust/issues/39207", + ); + store.register_removed( + "legacy_directory_ownership", + "converted into hard error, see https://github.com/rust-lang/rust/issues/37872", + ); + store.register_removed( + "safe_extern_statics", + "converted into hard error, see https://github.com/rust-lang/rust/issues/36247", + ); + store.register_removed( + "parenthesized_params_in_types_and_modules", + "converted into hard error, see https://github.com/rust-lang/rust/issues/42238", + ); + store.register_removed( + "duplicate_macro_exports", + "converted into hard error, see https://github.com/rust-lang/rust/issues/35896", + ); + store.register_removed( + "nested_impl_trait", + "converted into hard error, see https://github.com/rust-lang/rust/issues/59014", + ); store.register_removed("plugin_as_library", "plugins have been deprecated and retired"); } -fn register_internals(store: &mut lint::LintStore) { +fn register_internals(store: &mut LintStore) { store.register_lints(&DefaultHashTypes::get_lints()); store.register_early_pass(|| box DefaultHashTypes::new()); store.register_lints(&LintPassImpl::get_lints()); diff --git a/src/librustc_lint/non_ascii_idents.rs b/src/librustc_lint/non_ascii_idents.rs index aa39211efc..3c85a1b31b 100644 --- a/src/librustc_lint/non_ascii_idents.rs +++ b/src/librustc_lint/non_ascii_idents.rs @@ -1,4 +1,4 @@ -use crate::lint::{EarlyContext, EarlyLintPass, LintArray, LintContext, LintPass}; +use crate::{EarlyContext, EarlyLintPass, LintContext}; use syntax::ast; declare_lint! { @@ -7,16 +7,34 @@ declare_lint! { "detects non-ASCII identifiers" } -declare_lint_pass!(NonAsciiIdents => [NON_ASCII_IDENTS]); +declare_lint! { + pub UNCOMMON_CODEPOINTS, + Warn, + "detects uncommon Unicode codepoints in identifiers" +} + +declare_lint_pass!(NonAsciiIdents => [NON_ASCII_IDENTS, UNCOMMON_CODEPOINTS]); impl EarlyLintPass for NonAsciiIdents { fn check_ident(&mut self, cx: &EarlyContext<'_>, ident: ast::Ident) { - if !ident.name.as_str().is_ascii() { + use unicode_security::GeneralSecurityProfile; + let name_str = ident.name.as_str(); + if name_str.is_ascii() { + return; + } + cx.struct_span_lint( + NON_ASCII_IDENTS, + ident.span, + "identifier contains non-ASCII characters", + ) + .emit(); + if !name_str.chars().all(GeneralSecurityProfile::identifier_allowed) { cx.struct_span_lint( - NON_ASCII_IDENTS, + UNCOMMON_CODEPOINTS, ident.span, - "identifier contains non-ASCII characters", - ).emit(); + "identifier contains uncommon Unicode codepoints", + ) + .emit(); } } } diff --git a/src/librustc_lint/nonstandard_style.rs b/src/librustc_lint/nonstandard_style.rs index dceb79fd30..394da4a5bb 100644 --- a/src/librustc_lint/nonstandard_style.rs +++ b/src/librustc_lint/nonstandard_style.rs @@ -1,16 +1,15 @@ -use rustc::hir::{self, GenericParamKind, PatKind}; -use rustc::hir::def::{Res, DefKind}; -use rustc::hir::intravisit::FnKind; -use rustc::lint; +use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext}; use rustc::ty; +use rustc_errors::Applicability; +use rustc_hir as hir; +use rustc_hir::def::{DefKind, Res}; +use rustc_hir::intravisit::FnKind; +use rustc_hir::{GenericParamKind, PatKind}; +use rustc_span::symbol::sym; +use rustc_span::{symbol::Ident, BytePos, Span}; use rustc_target::spec::abi::Abi; -use lint::{EarlyContext, LateContext, LintContext, LintArray}; -use lint::{EarlyLintPass, LintPass, LateLintPass}; use syntax::ast; use syntax::attr; -use syntax::errors::Applicability; -use syntax::symbol::sym; -use syntax_pos::{BytePos, symbol::Ident, Span}; #[derive(PartialEq)] pub enum MethodLateContext { @@ -24,12 +23,10 @@ pub fn method_context(cx: &LateContext<'_, '_>, id: hir::HirId) -> MethodLateCon let item = cx.tcx.associated_item(def_id); match item.container { ty::TraitContainer(..) => MethodLateContext::TraitAutoImpl, - ty::ImplContainer(cid) => { - match cx.tcx.impl_trait_ref(cid) { - Some(_) => MethodLateContext::TraitImpl, - None => MethodLateContext::PlainImpl, - } - } + ty::ImplContainer(cid) => match cx.tcx.impl_trait_ref(cid) { + Some(_) => MethodLateContext::TraitImpl, + None => MethodLateContext::PlainImpl, + }, } } @@ -90,21 +87,18 @@ fn to_camel_case(s: &str) -> String { camel_cased_component }) - .fold( - (String::new(), None), - |(acc, prev): (String, Option), next| { - // separate two components with an underscore if their boundary cannot - // be distinguished using a uppercase/lowercase case distinction - let join = if let Some(prev) = prev { - let l = prev.chars().last().unwrap(); - let f = next.chars().next().unwrap(); - !char_has_case(l) && !char_has_case(f) - } else { - false - }; - (acc + if join { "_" } else { "" } + &next, Some(next)) - }, - ) + .fold((String::new(), None), |(acc, prev): (String, Option), next| { + // separate two components with an underscore if their boundary cannot + // be distinguished using a uppercase/lowercase case distinction + let join = if let Some(prev) = prev { + let l = prev.chars().last().unwrap(); + let f = next.chars().next().unwrap(); + !char_has_case(l) && !char_has_case(f) + } else { + false + }; + (acc + if join { "_" } else { "" } + &next, Some(next)) + }) .0 } @@ -128,7 +122,8 @@ impl NonCamelCaseTypes { impl EarlyLintPass for NonCamelCaseTypes { fn check_item(&mut self, cx: &EarlyContext<'_>, it: &ast::Item) { - let has_repr_c = it.attrs + let has_repr_c = it + .attrs .iter() .any(|attr| attr::find_repr_attrs(&cx.sess.parse_sess, attr).contains(&attr::ReprC)); @@ -137,15 +132,21 @@ impl EarlyLintPass for NonCamelCaseTypes { } match it.kind { - ast::ItemKind::TyAlias(..) | - ast::ItemKind::Enum(..) | - ast::ItemKind::Struct(..) | - ast::ItemKind::Union(..) => self.check_case(cx, "type", &it.ident), + ast::ItemKind::TyAlias(..) + | ast::ItemKind::Enum(..) + | ast::ItemKind::Struct(..) + | ast::ItemKind::Union(..) => self.check_case(cx, "type", &it.ident), ast::ItemKind::Trait(..) => self.check_case(cx, "trait", &it.ident), _ => (), } } + fn check_trait_item(&mut self, cx: &EarlyContext<'_>, it: &ast::AssocItem) { + if let ast::AssocItemKind::TyAlias(..) = it.kind { + self.check_case(cx, "associated type", &it.ident); + } + } + fn check_variant(&mut self, cx: &EarlyContext<'_>, v: &ast::Variant) { self.check_case(cx, "variant", &v.ident); } @@ -246,7 +247,13 @@ impl NonSnakeCase { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonSnakeCase { - fn check_mod(&mut self, cx: &LateContext<'_, '_>, _: &'tcx hir::Mod, _: Span, id: hir::HirId) { + fn check_mod( + &mut self, + cx: &LateContext<'_, '_>, + _: &'tcx hir::Mod<'tcx>, + _: Span, + id: hir::HirId, + ) { if id != hir::CRATE_HIR_ID { return; } @@ -260,11 +267,15 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonSnakeCase { meta.name_value_literal().and_then(|lit| { if let ast::LitKind::Str(name, ..) = lit.kind { // Discard the double quotes surrounding the literal. - let sp = cx.sess().source_map().span_to_snippet(lit.span) + let sp = cx + .sess() + .source_map() + .span_to_snippet(lit.span) .ok() .and_then(|snippet| { let left = snippet.find('"')?; - let right = snippet.rfind('"').map(|pos| snippet.len() - pos)?; + let right = + snippet.rfind('"').map(|pos| snippet.len() - pos)?; Some( lit.span @@ -287,7 +298,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonSnakeCase { } } - fn check_generic_param(&mut self, cx: &LateContext<'_, '_>, param: &hir::GenericParam) { + fn check_generic_param(&mut self, cx: &LateContext<'_, '_>, param: &hir::GenericParam<'_>) { if let GenericParamKind::Lifetime { .. } = param.kind { self.check_snake_case(cx, "lifetime", ¶m.name.ident()); } @@ -297,23 +308,21 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonSnakeCase { &mut self, cx: &LateContext<'_, '_>, fk: FnKind<'_>, - _: &hir::FnDecl, - _: &hir::Body, + _: &hir::FnDecl<'_>, + _: &hir::Body<'_>, _: Span, id: hir::HirId, ) { match &fk { - FnKind::Method(ident, ..) => { - match method_context(cx, id) { - MethodLateContext::PlainImpl => { - self.check_snake_case(cx, "method", ident); - } - MethodLateContext::TraitAutoImpl => { - self.check_snake_case(cx, "trait method", ident); - } - _ => (), + FnKind::Method(ident, ..) => match method_context(cx, id) { + MethodLateContext::PlainImpl => { + self.check_snake_case(cx, "method", ident); } - } + MethodLateContext::TraitAutoImpl => { + self.check_snake_case(cx, "trait method", ident); + } + _ => (), + }, FnKind::ItemFn(ident, _, header, _, attrs) => { // Skip foreign-ABI #[no_mangle] functions (Issue #31924) if header.abi != Abi::Rust && attr::contains_name(attrs, sym::no_mangle) { @@ -325,14 +334,14 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonSnakeCase { } } - fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item<'_>) { if let hir::ItemKind::Mod(_) = it.kind { self.check_snake_case(cx, "module", &it.ident); } } - fn check_trait_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::TraitItem) { - if let hir::TraitItemKind::Method(_, hir::TraitMethod::Required(pnames)) = &item.kind { + fn check_trait_item(&mut self, cx: &LateContext<'_, '_>, item: &hir::TraitItem<'_>) { + if let hir::TraitItemKind::Method(_, hir::TraitMethod::Required(pnames)) = item.kind { self.check_snake_case(cx, "trait method", &item.ident); for param_name in pnames { self.check_snake_case(cx, "variable", param_name); @@ -340,17 +349,26 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonSnakeCase { } } - fn check_pat(&mut self, cx: &LateContext<'_, '_>, p: &hir::Pat) { - if let &PatKind::Binding(_, _, ident, _) = &p.kind { + fn check_pat(&mut self, cx: &LateContext<'_, '_>, p: &hir::Pat<'_>) { + if let &PatKind::Binding(_, hid, ident, _) = &p.kind { + if let hir::Node::Pat(parent_pat) = cx.tcx.hir().get(cx.tcx.hir().get_parent_node(hid)) + { + if let PatKind::Struct(_, field_pats, _) = &parent_pat.kind { + for field in field_pats.iter() { + if field.ident != ident { + // Only check if a new name has been introduced, to avoid warning + // on both the struct definition and this pattern. + self.check_snake_case(cx, "variable", &ident); + } + } + return; + } + } self.check_snake_case(cx, "variable", &ident); } } - fn check_struct_def( - &mut self, - cx: &LateContext<'_, '_>, - s: &hir::VariantData, - ) { + fn check_struct_def(&mut self, cx: &LateContext<'_, '_>, s: &hir::VariantData<'_>) { for sf in s.fields() { self.check_snake_case(cx, "structure field", &sf.ident); } @@ -386,7 +404,7 @@ impl NonUpperCaseGlobals { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonUpperCaseGlobals { - fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item<'_>) { match it.kind { hir::ItemKind::Static(..) if !attr::contains_name(&it.attrs, sym::no_mangle) => { NonUpperCaseGlobals::check_upper_case(cx, "static variable", &it.ident); @@ -398,19 +416,19 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonUpperCaseGlobals { } } - fn check_trait_item(&mut self, cx: &LateContext<'_, '_>, ti: &hir::TraitItem) { + fn check_trait_item(&mut self, cx: &LateContext<'_, '_>, ti: &hir::TraitItem<'_>) { if let hir::TraitItemKind::Const(..) = ti.kind { NonUpperCaseGlobals::check_upper_case(cx, "associated constant", &ti.ident); } } - fn check_impl_item(&mut self, cx: &LateContext<'_, '_>, ii: &hir::ImplItem) { + fn check_impl_item(&mut self, cx: &LateContext<'_, '_>, ii: &hir::ImplItem<'_>) { if let hir::ImplItemKind::Const(..) = ii.kind { NonUpperCaseGlobals::check_upper_case(cx, "associated constant", &ii.ident); } } - fn check_pat(&mut self, cx: &LateContext<'_, '_>, p: &hir::Pat) { + fn check_pat(&mut self, cx: &LateContext<'_, '_>, p: &hir::Pat<'_>) { // Lint for constants that look like binding identifiers (#7526) if let PatKind::Path(hir::QPath::Resolved(None, ref path)) = p.kind { if let Res::Def(DefKind::Const, _) = path.res { @@ -418,20 +436,16 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonUpperCaseGlobals { NonUpperCaseGlobals::check_upper_case( cx, "constant in pattern", - &path.segments[0].ident + &path.segments[0].ident, ); } } } } - fn check_generic_param(&mut self, cx: &LateContext<'_, '_>, param: &hir::GenericParam) { + fn check_generic_param(&mut self, cx: &LateContext<'_, '_>, param: &hir::GenericParam<'_>) { if let GenericParamKind::Const { .. } = param.kind { - NonUpperCaseGlobals::check_upper_case( - cx, - "const parameter", - ¶m.name.ident(), - ); + NonUpperCaseGlobals::check_upper_case(cx, "const parameter", ¶m.name.ident()); } } } diff --git a/src/librustc_lint/passes.rs b/src/librustc_lint/passes.rs new file mode 100644 index 0000000000..7e5d670767 --- /dev/null +++ b/src/librustc_lint/passes.rs @@ -0,0 +1,284 @@ +use crate::context::{EarlyContext, LateContext}; + +use rustc_data_structures::sync; +use rustc_hir as hir; +use rustc_session::lint::builtin::HardwiredLints; +use rustc_session::lint::LintPass; +use rustc_span::Span; +use syntax::ast; + +#[macro_export] +macro_rules! late_lint_methods { + ($macro:path, $args:tt, [$hir:tt]) => ( + $macro!($args, [$hir], [ + fn check_param(a: &$hir hir::Param<$hir>); + fn check_body(a: &$hir hir::Body<$hir>); + fn check_body_post(a: &$hir hir::Body<$hir>); + fn check_name(a: Span, b: ast::Name); + fn check_crate(a: &$hir hir::Crate<$hir>); + fn check_crate_post(a: &$hir hir::Crate<$hir>); + fn check_mod(a: &$hir hir::Mod<$hir>, b: Span, c: hir::HirId); + fn check_mod_post(a: &$hir hir::Mod<$hir>, b: Span, c: hir::HirId); + fn check_foreign_item(a: &$hir hir::ForeignItem<$hir>); + fn check_foreign_item_post(a: &$hir hir::ForeignItem<$hir>); + fn check_item(a: &$hir hir::Item<$hir>); + fn check_item_post(a: &$hir hir::Item<$hir>); + fn check_local(a: &$hir hir::Local<$hir>); + fn check_block(a: &$hir hir::Block<$hir>); + fn check_block_post(a: &$hir hir::Block<$hir>); + fn check_stmt(a: &$hir hir::Stmt<$hir>); + fn check_arm(a: &$hir hir::Arm<$hir>); + fn check_pat(a: &$hir hir::Pat<$hir>); + fn check_expr(a: &$hir hir::Expr<$hir>); + fn check_expr_post(a: &$hir hir::Expr<$hir>); + fn check_ty(a: &$hir hir::Ty<$hir>); + fn check_generic_param(a: &$hir hir::GenericParam<$hir>); + fn check_generics(a: &$hir hir::Generics<$hir>); + fn check_where_predicate(a: &$hir hir::WherePredicate<$hir>); + fn check_poly_trait_ref(a: &$hir hir::PolyTraitRef<$hir>, b: hir::TraitBoundModifier); + fn check_fn( + a: rustc_hir::intravisit::FnKind<$hir>, + b: &$hir hir::FnDecl<$hir>, + c: &$hir hir::Body<$hir>, + d: Span, + e: hir::HirId); + fn check_fn_post( + a: rustc_hir::intravisit::FnKind<$hir>, + b: &$hir hir::FnDecl<$hir>, + c: &$hir hir::Body<$hir>, + d: Span, + e: hir::HirId + ); + fn check_trait_item(a: &$hir hir::TraitItem<$hir>); + fn check_trait_item_post(a: &$hir hir::TraitItem<$hir>); + fn check_impl_item(a: &$hir hir::ImplItem<$hir>); + fn check_impl_item_post(a: &$hir hir::ImplItem<$hir>); + fn check_struct_def(a: &$hir hir::VariantData<$hir>); + fn check_struct_def_post(a: &$hir hir::VariantData<$hir>); + fn check_struct_field(a: &$hir hir::StructField<$hir>); + fn check_variant(a: &$hir hir::Variant<$hir>); + fn check_variant_post(a: &$hir hir::Variant<$hir>); + fn check_lifetime(a: &$hir hir::Lifetime); + fn check_path(a: &$hir hir::Path<$hir>, b: hir::HirId); + fn check_attribute(a: &$hir ast::Attribute); + + /// Called when entering a syntax node that can have lint attributes such + /// as `#[allow(...)]`. Called with *all* the attributes of that node. + fn enter_lint_attrs(a: &$hir [ast::Attribute]); + + /// Counterpart to `enter_lint_attrs`. + fn exit_lint_attrs(a: &$hir [ast::Attribute]); + ]); + ) +} + +/// Trait for types providing lint checks. +/// +/// Each `check` method checks a single syntax node, and should not +/// invoke methods recursively (unlike `Visitor`). By default they +/// do nothing. +// +// FIXME: eliminate the duplication with `Visitor`. But this also +// contains a few lint-specific methods with no equivalent in `Visitor`. + +macro_rules! expand_lint_pass_methods { + ($context:ty, [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( + $(#[inline(always)] fn $name(&mut self, _: $context, $(_: $arg),*) {})* + ) +} + +macro_rules! declare_late_lint_pass { + ([], [$hir:tt], [$($methods:tt)*]) => ( + pub trait LateLintPass<'a, $hir>: LintPass { + expand_lint_pass_methods!(&LateContext<'a, $hir>, [$($methods)*]); + } + ) +} + +late_lint_methods!(declare_late_lint_pass, [], ['tcx]); + +impl LateLintPass<'_, '_> for HardwiredLints {} + +#[macro_export] +macro_rules! expand_combined_late_lint_pass_method { + ([$($passes:ident),*], $self: ident, $name: ident, $params:tt) => ({ + $($self.$passes.$name $params;)* + }) +} + +#[macro_export] +macro_rules! expand_combined_late_lint_pass_methods { + ($passes:tt, [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( + $(fn $name(&mut self, context: &LateContext<'a, 'tcx>, $($param: $arg),*) { + expand_combined_late_lint_pass_method!($passes, self, $name, (context, $($param),*)); + })* + ) +} + +#[macro_export] +macro_rules! declare_combined_late_lint_pass { + ([$v:vis $name:ident, [$($passes:ident: $constructor:expr,)*]], [$hir:tt], $methods:tt) => ( + #[allow(non_snake_case)] + $v struct $name { + $($passes: $passes,)* + } + + impl $name { + $v fn new() -> Self { + Self { + $($passes: $constructor,)* + } + } + + $v fn get_lints() -> LintArray { + let mut lints = Vec::new(); + $(lints.extend_from_slice(&$passes::get_lints());)* + lints + } + } + + impl<'a, 'tcx> LateLintPass<'a, 'tcx> for $name { + expand_combined_late_lint_pass_methods!([$($passes),*], $methods); + } + + #[allow(rustc::lint_pass_impl_without_macro)] + impl LintPass for $name { + fn name(&self) -> &'static str { + panic!() + } + } + ) +} + +#[macro_export] +macro_rules! early_lint_methods { + ($macro:path, $args:tt) => ( + $macro!($args, [ + fn check_param(a: &ast::Param); + fn check_ident(a: ast::Ident); + fn check_crate(a: &ast::Crate); + fn check_crate_post(a: &ast::Crate); + fn check_mod(a: &ast::Mod, b: Span, c: ast::NodeId); + fn check_mod_post(a: &ast::Mod, b: Span, c: ast::NodeId); + fn check_foreign_item(a: &ast::ForeignItem); + fn check_foreign_item_post(a: &ast::ForeignItem); + fn check_item(a: &ast::Item); + fn check_item_post(a: &ast::Item); + fn check_local(a: &ast::Local); + fn check_block(a: &ast::Block); + fn check_block_post(a: &ast::Block); + fn check_stmt(a: &ast::Stmt); + fn check_arm(a: &ast::Arm); + fn check_pat(a: &ast::Pat); + fn check_pat_post(a: &ast::Pat); + fn check_expr(a: &ast::Expr); + fn check_expr_post(a: &ast::Expr); + fn check_ty(a: &ast::Ty); + fn check_generic_param(a: &ast::GenericParam); + fn check_generics(a: &ast::Generics); + fn check_where_predicate(a: &ast::WherePredicate); + fn check_poly_trait_ref(a: &ast::PolyTraitRef, + b: &ast::TraitBoundModifier); + fn check_fn(a: syntax::visit::FnKind<'_>, b: &ast::FnDecl, c: Span, d_: ast::NodeId); + fn check_fn_post( + a: syntax::visit::FnKind<'_>, + b: &ast::FnDecl, + c: Span, + d: ast::NodeId + ); + fn check_trait_item(a: &ast::AssocItem); + fn check_trait_item_post(a: &ast::AssocItem); + fn check_impl_item(a: &ast::AssocItem); + fn check_impl_item_post(a: &ast::AssocItem); + fn check_struct_def(a: &ast::VariantData); + fn check_struct_def_post(a: &ast::VariantData); + fn check_struct_field(a: &ast::StructField); + fn check_variant(a: &ast::Variant); + fn check_variant_post(a: &ast::Variant); + fn check_lifetime(a: &ast::Lifetime); + fn check_path(a: &ast::Path, b: ast::NodeId); + fn check_attribute(a: &ast::Attribute); + fn check_mac_def(a: &ast::MacroDef, b: ast::NodeId); + fn check_mac(a: &ast::Mac); + + /// Called when entering a syntax node that can have lint attributes such + /// as `#[allow(...)]`. Called with *all* the attributes of that node. + fn enter_lint_attrs(a: &[ast::Attribute]); + + /// Counterpart to `enter_lint_attrs`. + fn exit_lint_attrs(a: &[ast::Attribute]); + ]); + ) +} + +macro_rules! expand_early_lint_pass_methods { + ($context:ty, [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( + $(#[inline(always)] fn $name(&mut self, _: $context, $(_: $arg),*) {})* + ) +} + +macro_rules! declare_early_lint_pass { + ([], [$($methods:tt)*]) => ( + pub trait EarlyLintPass: LintPass { + expand_early_lint_pass_methods!(&EarlyContext<'_>, [$($methods)*]); + } + ) +} + +early_lint_methods!(declare_early_lint_pass, []); + +#[macro_export] +macro_rules! expand_combined_early_lint_pass_method { + ([$($passes:ident),*], $self: ident, $name: ident, $params:tt) => ({ + $($self.$passes.$name $params;)* + }) +} + +#[macro_export] +macro_rules! expand_combined_early_lint_pass_methods { + ($passes:tt, [$($(#[$attr:meta])* fn $name:ident($($param:ident: $arg:ty),*);)*]) => ( + $(fn $name(&mut self, context: &EarlyContext<'_>, $($param: $arg),*) { + expand_combined_early_lint_pass_method!($passes, self, $name, (context, $($param),*)); + })* + ) +} + +#[macro_export] +macro_rules! declare_combined_early_lint_pass { + ([$v:vis $name:ident, [$($passes:ident: $constructor:expr,)*]], $methods:tt) => ( + #[allow(non_snake_case)] + $v struct $name { + $($passes: $passes,)* + } + + impl $name { + $v fn new() -> Self { + Self { + $($passes: $constructor,)* + } + } + + $v fn get_lints() -> LintArray { + let mut lints = Vec::new(); + $(lints.extend_from_slice(&$passes::get_lints());)* + lints + } + } + + impl EarlyLintPass for $name { + expand_combined_early_lint_pass_methods!([$($passes),*], $methods); + } + + #[allow(rustc::lint_pass_impl_without_macro)] + impl LintPass for $name { + fn name(&self) -> &'static str { + panic!() + } + } + ) +} + +/// A lint pass boxed up as a trait object. +pub type EarlyLintPassObject = Box; +pub type LateLintPassObject = + Box LateLintPass<'a, 'tcx> + sync::Send + sync::Sync + 'static>; diff --git a/src/librustc_lint/redundant_semicolon.rs b/src/librustc_lint/redundant_semicolon.rs index 0adf1eeb41..21b244ad75 100644 --- a/src/librustc_lint/redundant_semicolon.rs +++ b/src/librustc_lint/redundant_semicolon.rs @@ -1,6 +1,6 @@ -use crate::lint::{EarlyLintPass, LintPass, EarlyContext, LintArray, LintContext}; -use syntax::ast::{Stmt, StmtKind, ExprKind}; -use syntax::errors::Applicability; +use crate::{EarlyContext, EarlyLintPass, LintContext}; +use rustc_errors::Applicability; +use syntax::ast::{ExprKind, Stmt, StmtKind}; declare_lint! { pub REDUNDANT_SEMICOLON, @@ -26,11 +26,7 @@ impl EarlyLintPass for RedundantSemicolon { } else { "unnecessary trailing semicolon" }; - let mut err = cx.struct_span_lint( - REDUNDANT_SEMICOLON, - stmt.span, - &msg - ); + let mut err = cx.struct_span_lint(REDUNDANT_SEMICOLON, stmt.span, &msg); let suggest_msg = if multiple { "remove these semicolons" } else { @@ -40,7 +36,7 @@ impl EarlyLintPass for RedundantSemicolon { stmt.span, &suggest_msg, String::new(), - Applicability::MaybeIncorrect + Applicability::MaybeIncorrect, ); err.emit(); } diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs index 34241b845b..674a82b619 100644 --- a/src/librustc_lint/types.rs +++ b/src/librustc_lint/types.rs @@ -1,31 +1,25 @@ #![allow(non_snake_case)] -use rustc::hir::{ExprKind, Node}; -use crate::hir::def_id::DefId; -use rustc::hir::lowering::is_range_literal; +use crate::{LateContext, LateLintPass, LintContext}; +use rustc::mir::interpret::{sign_extend, truncate}; +use rustc::ty::layout::{self, IntegerExt, LayoutOf, SizeSkeleton, VariantIdx}; use rustc::ty::subst::SubstsRef; use rustc::ty::{self, AdtKind, ParamEnv, Ty, TyCtxt}; -use rustc::ty::layout::{self, IntegerExt, LayoutOf, VariantIdx, SizeSkeleton}; -use rustc::{lint, util}; +use rustc_data_structures::fx::FxHashSet; +use rustc_errors::Applicability; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::{is_range_literal, ExprKind, Node}; use rustc_index::vec::Idx; -use util::nodemap::FxHashSet; -use lint::{LateContext, LintContext, LintArray}; -use lint::{LintPass, LateLintPass}; - -use std::cmp; -use std::{i8, i16, i32, i64, u8, u16, u32, u64, f32, f64}; - -use syntax::{ast, attr, source_map}; -use syntax::errors::Applicability; -use syntax::symbol::sym; +use rustc_span::source_map; +use rustc_span::symbol::sym; +use rustc_span::Span; use rustc_target::spec::abi::Abi; -use syntax_pos::Span; - -use rustc::hir; - -use rustc::mir::interpret::{sign_extend, truncate}; +use syntax::{ast, attr}; use log::debug; +use std::cmp; +use std::{f32, f64, i16, i32, i64, i8, u16, u32, u64, u8}; declare_lint! { UNUSED_COMPARISONS, @@ -66,8 +60,8 @@ fn lint_overflowing_range_endpoint<'a, 'tcx>( lit: &hir::Lit, lit_val: u128, max: u128, - expr: &'tcx hir::Expr, - parent_expr: &'tcx hir::Expr, + expr: &'tcx hir::Expr<'tcx>, + parent_expr: &'tcx hir::Expr<'tcx>, ty: &str, ) -> bool { // We only want to handle exclusive (`..`) ranges, @@ -86,7 +80,7 @@ fn lint_overflowing_range_endpoint<'a, 'tcx>( &format!("range endpoint is out of range for `{}`", ty), ); if let Ok(start) = cx.sess().source_map().span_to_snippet(eps[0].span) { - use ast::{LitKind, LitIntType}; + use ast::{LitIntType, LitKind}; // We need to preserve the literal's suffix, // as it may determine typing information. let suffix = match lit.node { @@ -120,7 +114,7 @@ fn int_ty_range(int_ty: ast::IntTy) -> (i128, i128) { ast::IntTy::I16 => (i16::min_value() as i64 as i128, i16::max_value() as i128), ast::IntTy::I32 => (i32::min_value() as i64 as i128, i32::max_value() as i128), ast::IntTy::I64 => (i64::min_value() as i128, i64::max_value() as i128), - ast::IntTy::I128 =>(i128::min_value() as i128, i128::max_value()), + ast::IntTy::I128 => (i128::min_value() as i128, i128::max_value()), } } @@ -151,7 +145,7 @@ fn get_bin_hex_repr(cx: &LateContext<'_, '_>, lit: &hir::Lit) -> Option fn report_bin_hex_error( cx: &LateContext<'_, '_>, - expr: &hir::Expr, + expr: &hir::Expr<'_>, ty: attr::IntType, repr_str: String, val: u128, @@ -178,16 +172,14 @@ fn report_bin_hex_error( an `{}` and will become `{}{}`", repr_str, val, t, actually, t )); - if let Some(sugg_ty) = - get_type_suggestion(&cx.tables.node_type(expr.hir_id), val, negative) - { + if let Some(sugg_ty) = get_type_suggestion(&cx.tables.node_type(expr.hir_id), val, negative) { if let Some(pos) = repr_str.chars().position(|c| c == 'i' || c == 'u') { let (sans_suffix, _) = repr_str.split_at(pos); err.span_suggestion( expr.span, &format!("consider using `{}` instead", sugg_ty), format!("{}{}", sans_suffix, sugg_ty), - Applicability::MachineApplicable + Applicability::MachineApplicable, ); } else { err.help(&format!("consider using `{}` instead", sugg_ty)); @@ -247,7 +239,7 @@ fn get_type_suggestion(t: Ty<'_>, val: u128, negative: bool) -> Option<&'static fn lint_int_literal<'a, 'tcx>( cx: &LateContext<'a, 'tcx>, type_limits: &TypeLimits, - e: &'tcx hir::Expr, + e: &'tcx hir::Expr<'tcx>, lit: &hir::Lit, t: ast::IntTy, v: u128, @@ -261,21 +253,14 @@ fn lint_int_literal<'a, 'tcx>( // avoiding use of -min to prevent overflow/panic if (negative && v > max + 1) || (!negative && v > max) { if let Some(repr_str) = get_bin_hex_repr(cx, lit) { - report_bin_hex_error( - cx, - e, - attr::IntType::SignedInt(t), - repr_str, - v, - negative, - ); + report_bin_hex_error(cx, e, attr::IntType::SignedInt(t), repr_str, v, negative); return; } let par_id = cx.tcx.hir().get_parent_node(e.hir_id); if let Node::Expr(par_e) = cx.tcx.hir().get(par_id) { if let hir::ExprKind::Struct(..) = par_e.kind { - if is_range_literal(cx.sess(), par_e) + if is_range_literal(cx.sess().source_map(), par_e) && lint_overflowing_range_endpoint(cx, lit, v, max, e, par_e, t.name_str()) { // The overflowing literal lint was overridden. @@ -294,7 +279,7 @@ fn lint_int_literal<'a, 'tcx>( fn lint_uint_literal<'a, 'tcx>( cx: &LateContext<'a, 'tcx>, - e: &'tcx hir::Expr, + e: &'tcx hir::Expr<'tcx>, lit: &hir::Lit, t: ast::UintTy, ) { @@ -327,14 +312,13 @@ fn lint_uint_literal<'a, 'tcx>( return; } } - hir::ExprKind::Struct(..) - if is_range_literal(cx.sess(), par_e) => { - let t = t.name_str(); - if lint_overflowing_range_endpoint(cx, lit, lit_val, max, e, par_e, t) { - // The overflowing literal lint was overridden. - return; - } + hir::ExprKind::Struct(..) if is_range_literal(cx.sess().source_map(), par_e) => { + let t = t.name_str(); + if lint_overflowing_range_endpoint(cx, lit, lit_val, max, e, par_e, t) { + // The overflowing literal lint was overridden. + return; } + } _ => {} } } @@ -353,30 +337,26 @@ fn lint_uint_literal<'a, 'tcx>( fn lint_literal<'a, 'tcx>( cx: &LateContext<'a, 'tcx>, type_limits: &TypeLimits, - e: &'tcx hir::Expr, + e: &'tcx hir::Expr<'tcx>, lit: &hir::Lit, ) { match cx.tables.node_type(e.hir_id).kind { ty::Int(t) => { match lit.node { - ast::LitKind::Int(v, ast::LitIntType::Signed(_)) | - ast::LitKind::Int(v, ast::LitIntType::Unsuffixed) => { + ast::LitKind::Int(v, ast::LitIntType::Signed(_)) + | ast::LitKind::Int(v, ast::LitIntType::Unsuffixed) => { lint_int_literal(cx, type_limits, e, lit, t, v) } _ => bug!(), }; } - ty::Uint(t) => { - lint_uint_literal(cx, e, lit, t) - } + ty::Uint(t) => lint_uint_literal(cx, e, lit, t), ty::Float(t) => { let is_infinite = match lit.node { - ast::LitKind::Float(v, _) => { - match t { - ast::FloatTy::F32 => v.as_str().parse().map(f32::is_infinite), - ast::FloatTy::F64 => v.as_str().parse().map(f64::is_infinite), - } - } + ast::LitKind::Float(v, _) => match t { + ast::FloatTy::F32 => v.as_str().parse().map(f32::is_infinite), + ast::FloatTy::F64 => v.as_str().parse().map(f64::is_infinite), + }, _ => bug!(), }; if is_infinite == Ok(true) { @@ -392,9 +372,9 @@ fn lint_literal<'a, 'tcx>( } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypeLimits { - fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx hir::Expr) { + fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx hir::Expr<'tcx>) { match e.kind { - hir::ExprKind::Unary(hir::UnNeg, ref expr) => { + hir::ExprKind::Unary(hir::UnOp::UnNeg, ref expr) => { // propagate negation, if the negation itself isn't negated if self.negated_expr_id != e.hir_id { self.negated_expr_id = expr.hir_id; @@ -402,9 +382,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypeLimits { } hir::ExprKind::Binary(binop, ref l, ref r) => { if is_comparison(binop) && !check_limits(cx, binop, &l, &r) { - cx.span_lint(UNUSED_COMPARISONS, - e.span, - "comparison is useless due to type limits"); + cx.span_lint( + UNUSED_COMPARISONS, + e.span, + "comparison is useless due to type limits", + ); } } hir::ExprKind::Lit(ref lit) => lint_literal(cx, self, e, lit), @@ -423,21 +405,24 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypeLimits { } fn rev_binop(binop: hir::BinOp) -> hir::BinOp { - source_map::respan(binop.span, - match binop.node { - hir::BinOpKind::Lt => hir::BinOpKind::Gt, - hir::BinOpKind::Le => hir::BinOpKind::Ge, - hir::BinOpKind::Gt => hir::BinOpKind::Lt, - hir::BinOpKind::Ge => hir::BinOpKind::Le, - _ => return binop, - }) + source_map::respan( + binop.span, + match binop.node { + hir::BinOpKind::Lt => hir::BinOpKind::Gt, + hir::BinOpKind::Le => hir::BinOpKind::Ge, + hir::BinOpKind::Gt => hir::BinOpKind::Lt, + hir::BinOpKind::Ge => hir::BinOpKind::Le, + _ => return binop, + }, + ) } - fn check_limits(cx: &LateContext<'_, '_>, - binop: hir::BinOp, - l: &hir::Expr, - r: &hir::Expr) - -> bool { + fn check_limits( + cx: &LateContext<'_, '_>, + binop: hir::BinOp, + l: &hir::Expr<'_>, + r: &hir::Expr<'_>, + ) -> bool { let (lit, expr, swap) = match (&l.kind, &r.kind) { (&hir::ExprKind::Lit(_), _) => (l, r, true), (_, &hir::ExprKind::Lit(_)) => (r, l, false), @@ -450,27 +435,23 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypeLimits { ty::Int(int_ty) => { let (min, max) = int_ty_range(int_ty); let lit_val: i128 = match lit.kind { - hir::ExprKind::Lit(ref li) => { - match li.node { - ast::LitKind::Int(v, ast::LitIntType::Signed(_)) | - ast::LitKind::Int(v, ast::LitIntType::Unsuffixed) => v as i128, - _ => return true - } + hir::ExprKind::Lit(ref li) => match li.node { + ast::LitKind::Int(v, ast::LitIntType::Signed(_)) + | ast::LitKind::Int(v, ast::LitIntType::Unsuffixed) => v as i128, + _ => return true, }, - _ => bug!() + _ => bug!(), }; is_valid(norm_binop, lit_val, min, max) } ty::Uint(uint_ty) => { - let (min, max) :(u128, u128) = uint_ty_range(uint_ty); + let (min, max): (u128, u128) = uint_ty_range(uint_ty); let lit_val: u128 = match lit.kind { - hir::ExprKind::Lit(ref li) => { - match li.node { - ast::LitKind::Int(v, _) => v, - _ => return true - } + hir::ExprKind::Lit(ref li) => match li.node { + ast::LitKind::Int(v, _) => v, + _ => return true, }, - _ => bug!() + _ => bug!(), }; is_valid(norm_binop, lit_val, min, max) } @@ -480,12 +461,12 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypeLimits { fn is_comparison(binop: hir::BinOp) -> bool { match binop.node { - hir::BinOpKind::Eq | - hir::BinOpKind::Lt | - hir::BinOpKind::Le | - hir::BinOpKind::Ne | - hir::BinOpKind::Ge | - hir::BinOpKind::Gt => true, + hir::BinOpKind::Eq + | hir::BinOpKind::Lt + | hir::BinOpKind::Le + | hir::BinOpKind::Ne + | hir::BinOpKind::Ge + | hir::BinOpKind::Gt => true, _ => false, } } @@ -507,11 +488,7 @@ struct ImproperCTypesVisitor<'a, 'tcx> { enum FfiResult<'tcx> { FfiSafe, FfiPhantom(Ty<'tcx>), - FfiUnsafe { - ty: Ty<'tcx>, - reason: &'static str, - help: Option<&'static str>, - }, + FfiUnsafe { ty: Ty<'tcx>, reason: &'static str, help: Option<&'static str> }, } fn is_zst<'tcx>(tcx: TyCtxt<'tcx>, did: DefId, ty: Ty<'tcx>) -> bool { @@ -524,17 +501,16 @@ fn ty_is_known_nonnull<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> bool { ty::Ref(..) => true, ty::Adt(field_def, substs) if field_def.repr.transparent() && !field_def.is_union() => { for field in field_def.all_fields() { - let field_ty = tcx.normalize_erasing_regions( - ParamEnv::reveal_all(), - field.ty(tcx, substs), - ); + let field_ty = + tcx.normalize_erasing_regions(ParamEnv::reveal_all(), field.ty(tcx, substs)); if is_zst(tcx, field.did, field_ty) { continue; } let attrs = tcx.get_attrs(field_def.did); - if attrs.iter().any(|a| a.check_name(sym::rustc_nonnull_optimization_guaranteed)) || - ty_is_known_nonnull(tcx, field_ty) { + if attrs.iter().any(|a| a.check_name(sym::rustc_nonnull_optimization_guaranteed)) + || ty_is_known_nonnull(tcx, field_ty) + { return true; } } @@ -591,7 +567,6 @@ fn is_repr_nullable_ptr<'tcx>( } impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { - /// Check if the type is array and emit an unsafe type lint. fn check_for_array_ty(&mut self, sp: Span, ty: Ty<'tcx>) -> bool { if let ty::Array(..) = ty.kind { @@ -607,12 +582,9 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { } } - /// Checks if the given type is "ffi-safe" (has a stable, well-defined /// representation which can be exported to C code). - fn check_type_for_ffi(&self, - cache: &mut FxHashSet>, - ty: Ty<'tcx>) -> FfiResult<'tcx> { + fn check_type_for_ffi(&self, cache: &mut FxHashSet>, ty: Ty<'tcx>) -> FfiResult<'tcx> { use FfiResult::*; let cx = self.cx.tcx; @@ -636,8 +608,10 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { return FfiUnsafe { ty, reason: "this struct has unspecified layout", - help: Some("consider adding a `#[repr(C)]` or \ - `#[repr(transparent)]` attribute to this struct"), + help: Some( + "consider adding a `#[repr(C)]` or \ + `#[repr(transparent)]` attribute to this struct", + ), }; } @@ -691,8 +665,10 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { return FfiUnsafe { ty, reason: "this union has unspecified layout", - help: Some("consider adding a `#[repr(C)]` or \ - `#[repr(transparent)]` attribute to this union"), + help: Some( + "consider adding a `#[repr(C)]` or \ + `#[repr(transparent)]` attribute to this union", + ), }; } @@ -743,9 +719,11 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { return FfiUnsafe { ty, reason: "enum has no representation hint", - help: Some("consider adding a `#[repr(C)]`, \ + help: Some( + "consider adding a `#[repr(C)]`, \ `#[repr(transparent)]`, or integer `#[repr(...)]` \ - attribute to this enum"), + attribute to this enum", + ), }; } } @@ -821,11 +799,9 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { help: Some("consider using a raw pointer instead"), }, - ty::Dynamic(..) => FfiUnsafe { - ty, - reason: "trait objects have no C equivalent", - help: None, - }, + ty::Dynamic(..) => { + FfiUnsafe { ty, reason: "trait objects have no C equivalent", help: None } + } ty::Str => FfiUnsafe { ty, @@ -839,8 +815,9 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { help: Some("consider using a struct instead"), }, - ty::RawPtr(ty::TypeAndMut { ty, .. }) | - ty::Ref(_, ty, _) => self.check_type_for_ffi(cache, ty), + ty::RawPtr(ty::TypeAndMut { ty, .. }) | ty::Ref(_, ty, _) => { + self.check_type_for_ffi(cache, ty) + } ty::Array(inner_ty, _) => self.check_type_for_ffi(cache, inner_ty), @@ -850,9 +827,11 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { return FfiUnsafe { ty, reason: "this function pointer has Rust-specific calling convention", - help: Some("consider using an `extern fn(...) -> ...` \ - function pointer instead"), - } + help: Some( + "consider using an `extern fn(...) -> ...` \ + function pointer instead", + ), + }; } _ => {} } @@ -881,18 +860,18 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { ty::Foreign(..) => FfiSafe, - ty::Param(..) | - ty::Infer(..) | - ty::Bound(..) | - ty::Error | - ty::Closure(..) | - ty::Generator(..) | - ty::GeneratorWitness(..) | - ty::Placeholder(..) | - ty::UnnormalizedProjection(..) | - ty::Projection(..) | - ty::Opaque(..) | - ty::FnDef(..) => bug!("unexpected type in foreign function: {:?}", ty), + ty::Param(..) + | ty::Infer(..) + | ty::Bound(..) + | ty::Error + | ty::Closure(..) + | ty::Generator(..) + | ty::GeneratorWitness(..) + | ty::Placeholder(..) + | ty::UnnormalizedProjection(..) + | ty::Projection(..) + | ty::Opaque(..) + | ty::FnDef(..) => bug!("unexpected type in foreign function: {:?}", ty), } } @@ -942,12 +921,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { let mut visitor = ProhibitOpaqueTypes { ty: None }; ty.visit_with(&mut visitor); if let Some(ty) = visitor.ty { - self.emit_ffi_unsafe_type_lint( - ty, - sp, - "opaque types have no C equivalent", - None, - ); + self.emit_ffi_unsafe_type_lint(ty, sp, "opaque types have no C equivalent", None); true } else { false @@ -984,16 +958,16 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { } } - fn check_foreign_fn(&mut self, id: hir::HirId, decl: &hir::FnDecl) { + fn check_foreign_fn(&mut self, id: hir::HirId, decl: &hir::FnDecl<'_>) { let def_id = self.cx.tcx.hir().local_def_id(id); let sig = self.cx.tcx.fn_sig(def_id); let sig = self.cx.tcx.erase_late_bound_regions(&sig); - for (input_ty, input_hir) in sig.inputs().iter().zip(&decl.inputs) { + for (input_ty, input_hir) in sig.inputs().iter().zip(decl.inputs) { self.check_type_for_ffi_and_report_errors(input_hir.span, input_ty, false); } - if let hir::Return(ref ret_hir) = decl.output { + if let hir::FunctionRetTy::Return(ref ret_hir) = decl.output { let ret_ty = sig.output(); if !ret_ty.is_unit() { self.check_type_for_ffi_and_report_errors(ret_hir.span, ret_ty, false); @@ -1009,7 +983,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypes { - fn check_foreign_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::ForeignItem) { + fn check_foreign_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::ForeignItem<'_>) { let mut vis = ImproperCTypesVisitor { cx }; let abi = cx.tcx.hir().get_foreign_abi(it.hir_id); if let Abi::Rust | Abi::RustCall | Abi::RustIntrinsic | Abi::PlatformIntrinsic = abi { @@ -1022,7 +996,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypes { hir::ForeignItemKind::Static(ref ty, _) => { vis.check_foreign_static(it.hir_id, ty.span); } - hir::ForeignItemKind::Type => () + hir::ForeignItemKind::Type => (), } } } @@ -1031,7 +1005,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypes { declare_lint_pass!(VariantSizeDifferences => [VARIANT_SIZE_DIFFERENCES]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for VariantSizeDifferences { - fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item) { + fn check_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::Item<'_>) { if let hir::ItemKind::Enum(ref enum_definition, _) = it.kind { let item_def_id = cx.tcx.hir().local_def_id(it.hir_id); let t = cx.tcx.type_of(item_def_id); @@ -1055,38 +1029,47 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for VariantSizeDifferences { let discr_size = tag.value.size(&cx.tcx).bytes(); - debug!("enum `{}` is {} bytes large with layout:\n{:#?}", - t, layout.size.bytes(), layout); + debug!( + "enum `{}` is {} bytes large with layout:\n{:#?}", + t, + layout.size.bytes(), + layout + ); - let (largest, slargest, largest_index) = enum_definition.variants + let (largest, slargest, largest_index) = enum_definition + .variants .iter() .zip(variants) .map(|(variant, variant_layout)| { // Subtract the size of the enum discriminant. let bytes = variant_layout.size.bytes().saturating_sub(discr_size); - debug!("- variant `{}` is {} bytes large", - variant.ident, - bytes); + debug!("- variant `{}` is {} bytes large", variant.ident, bytes); bytes }) .enumerate() - .fold((0, 0, 0), |(l, s, li), (idx, size)| if size > l { - (size, l, idx) - } else if size > s { - (l, size, li) - } else { - (l, s, li) + .fold((0, 0, 0), |(l, s, li), (idx, size)| { + if size > l { + (size, l, idx) + } else if size > s { + (l, size, li) + } else { + (l, s, li) + } }); // We only warn if the largest variant is at least thrice as large as // the second-largest. if largest > slargest * 3 && slargest > 0 { - cx.span_lint(VARIANT_SIZE_DIFFERENCES, - enum_definition.variants[largest_index].span, - &format!("enum variant is more than three times \ + cx.span_lint( + VARIANT_SIZE_DIFFERENCES, + enum_definition.variants[largest_index].span, + &format!( + "enum variant is more than three times \ larger ({} bytes) than the next largest", - largest)); + largest + ), + ); } } } diff --git a/src/librustc_lint/unused.rs b/src/librustc_lint/unused.rs index e6f39cca6d..bb2c4fa1aa 100644 --- a/src/librustc_lint/unused.rs +++ b/src/librustc_lint/unused.rs @@ -1,23 +1,20 @@ -use rustc::hir; -use rustc::hir::def::{Res, DefKind}; -use rustc::hir::def_id::DefId; -use rustc::lint; -use rustc::lint::builtin::UNUSED_ATTRIBUTES; -use rustc::ty::{self, Ty}; +use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext}; use rustc::ty::adjustment; +use rustc::ty::{self, Ty}; use rustc_data_structures::fx::FxHashMap; -use lint::{LateContext, EarlyContext, LintContext, LintArray}; -use lint::{LintPass, EarlyLintPass, LateLintPass}; +use rustc_errors::{pluralize, Applicability}; use rustc_feature::{AttributeType, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP}; - +use rustc_hir as hir; +use rustc_hir::def::{DefKind, Res}; +use rustc_hir::def_id::DefId; +use rustc_session::lint::builtin::UNUSED_ATTRIBUTES; +use rustc_span::symbol::Symbol; +use rustc_span::symbol::{kw, sym}; +use rustc_span::{BytePos, Span}; use syntax::ast; use syntax::attr; -use syntax::errors::{Applicability, pluralize}; use syntax::print::pprust; -use syntax::symbol::{kw, sym}; -use syntax::symbol::Symbol; use syntax::util::parser; -use syntax_pos::{Span, BytePos}; use log::debug; @@ -37,7 +34,7 @@ declare_lint! { declare_lint_pass!(UnusedResults => [UNUSED_MUST_USE, UNUSED_RESULTS]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { - fn check_stmt(&mut self, cx: &LateContext<'_, '_>, s: &hir::Stmt) { + fn check_stmt(&mut self, cx: &LateContext<'_, '_>, s: &hir::Stmt<'_>) { let expr = match s.kind { hir::StmtKind::Semi(ref expr) => &**expr, _ => return, @@ -57,20 +54,19 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { match callee.kind { hir::ExprKind::Path(ref qpath) => { match cx.tables.qpath_res(qpath, callee.hir_id) { - Res::Def(DefKind::Fn, def_id) - | Res::Def(DefKind::Method, def_id) => Some(def_id), + Res::Def(DefKind::Fn, def_id) | Res::Def(DefKind::Method, def_id) => { + Some(def_id) + } // `Res::Local` if it was a closure, for which we // do not currently support must-use linting - _ => None + _ => None, } - }, - _ => None + } + _ => None, } - }, - hir::ExprKind::MethodCall(..) => { - cx.tables.type_dependent_def_id(expr.hir_id) - }, - _ => None + } + hir::ExprKind::MethodCall(..) => cx.tables.type_dependent_def_id(expr.hir_id), + _ => None, }; if let Some(def_id) = maybe_def_id { fn_warned = check_must_use_def(cx, def_id, s.span, "return value of ", ""); @@ -84,42 +80,35 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { // Hardcoding operators here seemed more expedient than the // refactoring that would be needed to look up the `#[must_use]` // attribute which does exist on the comparison trait methods - hir::ExprKind::Binary(bin_op, ..) => { - match bin_op.node { - hir::BinOpKind::Eq | - hir::BinOpKind::Lt | - hir::BinOpKind::Le | - hir::BinOpKind::Ne | - hir::BinOpKind::Ge | - hir::BinOpKind::Gt => { - Some("comparison") - }, - hir::BinOpKind::Add | - hir::BinOpKind::Sub | - hir::BinOpKind::Div | - hir::BinOpKind::Mul | - hir::BinOpKind::Rem => { - Some("arithmetic operation") - }, - hir::BinOpKind::And | hir::BinOpKind::Or => { - Some("logical operation") - }, - hir::BinOpKind::BitXor | - hir::BinOpKind::BitAnd | - hir::BinOpKind::BitOr | - hir::BinOpKind::Shl | - hir::BinOpKind::Shr => { - Some("bitwise operation") - }, - } + hir::ExprKind::Binary(bin_op, ..) => match bin_op.node { + hir::BinOpKind::Eq + | hir::BinOpKind::Lt + | hir::BinOpKind::Le + | hir::BinOpKind::Ne + | hir::BinOpKind::Ge + | hir::BinOpKind::Gt => Some("comparison"), + hir::BinOpKind::Add + | hir::BinOpKind::Sub + | hir::BinOpKind::Div + | hir::BinOpKind::Mul + | hir::BinOpKind::Rem => Some("arithmetic operation"), + hir::BinOpKind::And | hir::BinOpKind::Or => Some("logical operation"), + hir::BinOpKind::BitXor + | hir::BinOpKind::BitAnd + | hir::BinOpKind::BitOr + | hir::BinOpKind::Shl + | hir::BinOpKind::Shr => Some("bitwise operation"), }, hir::ExprKind::Unary(..) => Some("unary operation"), - _ => None + _ => None, }; if let Some(must_use_op) = must_use_op { - cx.span_lint(UNUSED_MUST_USE, expr.span, - &format!("unused {} that must be used", must_use_op)); + cx.span_lint( + UNUSED_MUST_USE, + expr.span, + &format!("unused {} that must be used", must_use_op), + ); op_warned = true; } @@ -131,14 +120,14 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { fn check_must_use_ty<'tcx>( cx: &LateContext<'_, 'tcx>, ty: Ty<'tcx>, - expr: &hir::Expr, + expr: &hir::Expr<'_>, span: Span, descr_pre: &str, descr_post: &str, plural_len: usize, ) -> bool { - if ty.is_unit() || cx.tcx.is_ty_uninhabited_from( - cx.tcx.hir().get_module_parent(expr.hir_id), ty) + if ty.is_unit() + || cx.tcx.is_ty_uninhabited_from(cx.tcx.hir().get_module_parent(expr.hir_id), ty) { return true; } @@ -151,20 +140,15 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { let descr_pre = &format!("{}boxed ", descr_pre); check_must_use_ty(cx, boxed_ty, expr, span, descr_pre, descr_post, plural_len) } - ty::Adt(def, _) => { - check_must_use_def(cx, def.did, span, descr_pre, descr_post) - } + ty::Adt(def, _) => check_must_use_def(cx, def.did, span, descr_pre, descr_post), ty::Opaque(def, _) => { let mut has_emitted = false; for (predicate, _) in cx.tcx.predicates_of(def).predicates { - if let ty::Predicate::Trait(ref poly_trait_predicate) = predicate { + if let ty::Predicate::Trait(ref poly_trait_predicate, _) = predicate { let trait_ref = poly_trait_predicate.skip_binder().trait_ref; let def_id = trait_ref.def_id; - let descr_pre = &format!( - "{}implementer{} of ", - descr_pre, - plural_suffix, - ); + let descr_pre = + &format!("{}implementer{} of ", descr_pre, plural_suffix,); if check_must_use_def(cx, def_id, span, descr_pre, descr_post) { has_emitted = true; break; @@ -178,11 +162,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { for predicate in binder.skip_binder().iter() { if let ty::ExistentialPredicate::Trait(ref trait_ref) = predicate { let def_id = trait_ref.def_id; - let descr_post = &format!( - " trait object{}{}", - plural_suffix, - descr_post, - ); + let descr_post = + &format!(" trait object{}{}", plural_suffix, descr_post,); if check_must_use_def(cx, def_id, span, descr_pre, descr_post) { has_emitted = true; break; @@ -202,15 +183,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { for (i, ty) in tys.iter().map(|k| k.expect_ty()).enumerate() { let descr_post = &format!(" in tuple element {}", i); let span = *spans.get(i).unwrap_or(&span); - if check_must_use_ty( - cx, - ty, - expr, - span, - descr_pre, - descr_post, - plural_len - ) { + if check_must_use_ty(cx, ty, expr, span, descr_pre, descr_post, plural_len) + { has_emitted = true; } } @@ -219,16 +193,12 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { ty::Array(ty, len) => match len.try_eval_usize(cx.tcx, cx.param_env) { // If the array is definitely non-empty, we can do `#[must_use]` checking. Some(n) if n != 0 => { - let descr_pre = &format!( - "{}array{} of ", - descr_pre, - plural_suffix, - ); + let descr_pre = &format!("{}array{} of ", descr_pre, plural_suffix,); check_must_use_ty(cx, ty, expr, span, descr_pre, descr_post, n as usize + 1) } // Otherwise, we don't lint, to avoid false positives. _ => false, - } + }, _ => false, } } @@ -243,8 +213,12 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { ) -> bool { for attr in cx.tcx.get_attrs(def_id).iter() { if attr.check_name(sym::must_use) { - let msg = format!("unused {}`{}`{} that must be used", - descr_pre_path, cx.tcx.def_path_str(def_id), descr_post_path); + let msg = format!( + "unused {}`{}`{} that must be used", + descr_pre_path, + cx.tcx.def_path_str(def_id), + descr_post_path + ); let mut err = cx.struct_span_lint(UNUSED_MUST_USE, span, &msg); // check for #[must_use = "..."] if let Some(note) = attr.value_str() { @@ -268,7 +242,7 @@ declare_lint! { declare_lint_pass!(PathStatements => [PATH_STATEMENTS]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for PathStatements { - fn check_stmt(&mut self, cx: &LateContext<'_, '_>, s: &hir::Stmt) { + fn check_stmt(&mut self, cx: &LateContext<'_, '_>, s: &hir::Stmt<'_>) { if let hir::StmtKind::Semi(ref expr) = s.kind { if let hir::ExprKind::Path(_) = expr.kind { cx.span_lint(PATH_STATEMENTS, s.span, "path statement with no effect"); @@ -284,9 +258,7 @@ pub struct UnusedAttributes { impl UnusedAttributes { pub fn new() -> Self { - UnusedAttributes { - builtin_attributes: &*BUILTIN_ATTRIBUTE_MAP, - } + UnusedAttributes { builtin_attributes: &*BUILTIN_ATTRIBUTE_MAP } } } @@ -296,6 +268,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedAttributes { fn check_attribute(&mut self, cx: &LateContext<'_, '_>, attr: &ast::Attribute) { debug!("checking attribute: {:?}", attr); + if attr.is_doc_comment() { + return; + } + let attr_info = attr.ident().and_then(|ident| self.builtin_attributes.get(&ident.name)); if let Some(&&(name, ty, ..)) = attr_info { @@ -337,29 +313,31 @@ declare_lint! { declare_lint_pass!(UnusedParens => [UNUSED_PARENS]); impl UnusedParens { - fn is_expr_parens_necessary(inner: &ast::Expr, followed_by_block: bool) -> bool { - followed_by_block && match inner.kind { - ast::ExprKind::Ret(_) | ast::ExprKind::Break(..) => true, - _ => parser::contains_exterior_struct_lit(&inner), - } + followed_by_block + && match inner.kind { + ast::ExprKind::Ret(_) | ast::ExprKind::Break(..) => true, + _ => parser::contains_exterior_struct_lit(&inner), + } } - fn check_unused_parens_expr(&self, - cx: &EarlyContext<'_>, - value: &ast::Expr, - msg: &str, - followed_by_block: bool, - left_pos: Option, - right_pos: Option) { + fn check_unused_parens_expr( + &self, + cx: &EarlyContext<'_>, + value: &ast::Expr, + msg: &str, + followed_by_block: bool, + left_pos: Option, + right_pos: Option, + ) { match value.kind { ast::ExprKind::Paren(ref inner) => { - if !Self::is_expr_parens_necessary(inner, followed_by_block) && - value.attrs.is_empty() && - !value.span.from_expansion() + if !Self::is_expr_parens_necessary(inner, followed_by_block) + && value.attrs.is_empty() + && !value.span.from_expansion() { - let expr_text = if let Ok(snippet) = cx.sess().source_map() - .span_to_snippet(value.span) { + let expr_text = + if let Ok(snippet) = cx.sess().source_map().span_to_snippet(value.span) { snippet } else { pprust::expr_to_string(value) @@ -375,10 +353,12 @@ impl UnusedParens { // FIXME(#60336): Properly handle `let true = (false && true)` // actually needing the parenthesis. self.check_unused_parens_expr( - cx, expr, + cx, + expr, "`let` head expression", followed_by_block, - None, None + None, + None, ); } _ => {} @@ -392,7 +372,7 @@ impl UnusedParens { avoid_or: bool, avoid_mut: bool, ) { - use ast::{PatKind, BindingMode::ByValue, Mutability::Mutable}; + use ast::{BindingMode, Mutability, PatKind}; if let PatKind::Paren(inner) = &value.kind { match inner.kind { @@ -404,13 +384,13 @@ impl UnusedParens { // Avoid `p0 | .. | pn` if we should. PatKind::Or(..) if avoid_or => return, // Avoid `mut x` and `mut x @ p` if we should: - PatKind::Ident(ByValue(Mutable), ..) if avoid_mut => return, + PatKind::Ident(BindingMode::ByValue(Mutability::Mut), ..) if avoid_mut => return, // Otherwise proceed with linting. _ => {} } - let pattern_text = if let Ok(snippet) = cx.sess().source_map() - .span_to_snippet(value.span) { + let pattern_text = + if let Ok(snippet) = cx.sess().source_map().span_to_snippet(value.span) { snippet } else { pprust::pat_to_string(value) @@ -419,37 +399,36 @@ impl UnusedParens { } } - fn remove_outer_parens(cx: &EarlyContext<'_>, - span: Span, - pattern: &str, - msg: &str, - keep_space: (bool, bool)) { + fn remove_outer_parens( + cx: &EarlyContext<'_>, + span: Span, + pattern: &str, + msg: &str, + keep_space: (bool, bool), + ) { let span_msg = format!("unnecessary parentheses around {}", msg); let mut err = cx.struct_span_lint(UNUSED_PARENS, span, &span_msg); let mut ate_left_paren = false; let mut ate_right_paren = false; - let parens_removed = pattern - .trim_matches(|c| { - match c { - '(' => { - if ate_left_paren { - false - } else { - ate_left_paren = true; - true - } - }, - ')' => { - if ate_right_paren { - false - } else { - ate_right_paren = true; - true - } - }, - _ => false, + let parens_removed = pattern.trim_matches(|c| match c { + '(' => { + if ate_left_paren { + false + } else { + ate_left_paren = true; + true } - }); + } + ')' => { + if ate_right_paren { + false + } else { + ate_right_paren = true; + true + } + } + _ => false, + }); let replace = { let mut replace = if keep_space.0 { @@ -486,16 +465,16 @@ impl EarlyLintPass for UnusedParens { } If(ref cond, ref block, ..) => { - let left = e.span.lo() + syntax_pos::BytePos(2); + let left = e.span.lo() + rustc_span::BytePos(2); let right = block.span.lo(); (cond, "`if` condition", true, Some(left), Some(right)) } While(ref cond, ref block, ..) => { - let left = e.span.lo() + syntax_pos::BytePos(5); + let left = e.span.lo() + rustc_span::BytePos(5); let right = block.span.lo(); (cond, "`while` condition", true, Some(left), Some(right)) - }, + } ForLoop(ref pat, ref cond, ref block, ..) => { self.check_unused_parens_pat(cx, pat, false, false); @@ -503,16 +482,16 @@ impl EarlyLintPass for UnusedParens { } Match(ref head, _) => { - let left = e.span.lo() + syntax_pos::BytePos(5); + let left = e.span.lo() + rustc_span::BytePos(5); (head, "`match` head expression", true, Some(left), None) } Ret(Some(ref value)) => { - let left = e.span.lo() + syntax_pos::BytePos(3); + let left = e.span.lo() + rustc_span::BytePos(3); (value, "`return` value", false, Some(left), None) } - Assign(_, ref value) => (value, "assigned value", false, None, None), + Assign(_, ref value, _) => (value, "assigned value", false, None, None), AssignOp(.., ref value) => (value, "assigned value", false, None, None), // either function/method call, or something this lint doesn't care about ref call_or_other => { @@ -543,7 +522,7 @@ impl EarlyLintPass for UnusedParens { } fn check_pat(&mut self, cx: &EarlyContext<'_>, p: &ast::Pat) { - use ast::{PatKind::*, Mutability}; + use ast::{Mutability, PatKind::*}; match &p.kind { // Do not lint on `(..)` as that will result in the other arms being useless. Paren(_) @@ -560,17 +539,25 @@ impl EarlyLintPass for UnusedParens { Ident(.., Some(p)) | Box(p) => self.check_unused_parens_pat(cx, p, true, false), // Avoid linting on `&(mut x)` as `&mut x` has a different meaning, #55342. // Also avoid linting on `& mut? (p0 | .. | pn)`, #64106. - Ref(p, m) => self.check_unused_parens_pat(cx, p, true, *m == Mutability::Immutable), + Ref(p, m) => self.check_unused_parens_pat(cx, p, true, *m == Mutability::Not), } } fn check_stmt(&mut self, cx: &EarlyContext<'_>, s: &ast::Stmt) { - if let ast::StmtKind::Local(ref local) = s.kind { - self.check_unused_parens_pat(cx, &local.pat, false, false); + use ast::StmtKind::*; + + match s.kind { + Local(ref local) => { + self.check_unused_parens_pat(cx, &local.pat, false, false); - if let Some(ref value) = local.init { - self.check_unused_parens_expr(cx, &value, "assigned value", false, None, None); + if let Some(ref value) = local.init { + self.check_unused_parens_expr(cx, &value, "assigned value", false, None, None); + } + } + Expr(ref expr) => { + self.check_unused_parens_expr(cx, &expr, "block return value", false, None, None); } + _ => {} } } @@ -588,8 +575,8 @@ impl EarlyLintPass for UnusedParens { &ast::TyKind::TraitObject(..) => {} &ast::TyKind::ImplTrait(_, ref bounds) if bounds.len() > 1 => {} _ => { - let pattern_text = if let Ok(snippet) = cx.sess().source_map() - .span_to_snippet(ty.span) { + let pattern_text = + if let Ok(snippet) = cx.sess().source_map().span_to_snippet(ty.span) { snippet } else { pprust::ty_to_string(ty) @@ -659,7 +646,7 @@ declare_lint! { declare_lint_pass!(UnusedAllocation => [UNUSED_ALLOCATION]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedAllocation { - fn check_expr(&mut self, cx: &LateContext<'_, '_>, e: &hir::Expr) { + fn check_expr(&mut self, cx: &LateContext<'_, '_>, e: &hir::Expr<'_>) { match e.kind { hir::ExprKind::Box(_) => {} _ => return, @@ -668,10 +655,12 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedAllocation { for adj in cx.tables.expr_adjustments(e) { if let adjustment::Adjust::Borrow(adjustment::AutoBorrow::Ref(_, m)) = adj.kind { let msg = match m { - adjustment::AutoBorrowMutability::Immutable => - "unnecessary allocation, use `&` instead", - adjustment::AutoBorrowMutability::Mutable { .. }=> + adjustment::AutoBorrowMutability::Not => { + "unnecessary allocation, use `&` instead" + } + adjustment::AutoBorrowMutability::Mut { .. } => { "unnecessary allocation, use `&mut` instead" + } }; cx.span_lint(UNUSED_ALLOCATION, e.span, msg); } diff --git a/src/librustc_llvm/build.rs b/src/librustc_llvm/build.rs index c5d5f066f4..405ce0307c 100644 --- a/src/librustc_llvm/build.rs +++ b/src/librustc_llvm/build.rs @@ -1,6 +1,6 @@ -use std::process::Command; use std::env; -use std::path::{PathBuf, Path}; +use std::path::{Path, PathBuf}; +use std::process::Command; use build_helper::output; @@ -24,22 +24,16 @@ fn main() { build_helper::restore_library_path(); let target = env::var("TARGET").expect("TARGET was not set"); - let llvm_config = env::var_os("LLVM_CONFIG") - .map(PathBuf::from) - .unwrap_or_else(|| { - if let Some(dir) = env::var_os("CARGO_TARGET_DIR").map(PathBuf::from) { - let to_test = dir.parent() - .unwrap() - .parent() - .unwrap() - .join(&target) - .join("llvm/bin/llvm-config"); - if Command::new(&to_test).output().is_ok() { - return to_test; - } + let llvm_config = env::var_os("LLVM_CONFIG").map(PathBuf::from).unwrap_or_else(|| { + if let Some(dir) = env::var_os("CARGO_TARGET_DIR").map(PathBuf::from) { + let to_test = + dir.parent().unwrap().parent().unwrap().join(&target).join("llvm/bin/llvm-config"); + if Command::new(&to_test).output().is_ok() { + return to_test; } - PathBuf::from("llvm-config") - }); + } + PathBuf::from("llvm-config") + }); println!("cargo:rerun-if-changed={}", llvm_config.display()); println!("cargo:rerun-if-env-changed=LLVM_CONFIG"); @@ -69,34 +63,38 @@ fn main() { let host = env::var("HOST").expect("HOST was not set"); let is_crossed = target != host; - let mut optional_components = - vec!["x86", "arm", "aarch64", "amdgpu", "mips", "powerpc", - "systemz", "jsbackend", "webassembly", "msp430", "sparc", "nvptx", - "hexagon"]; + let mut optional_components = vec![ + "x86", + "arm", + "aarch64", + "amdgpu", + "mips", + "powerpc", + "systemz", + "jsbackend", + "webassembly", + "msp430", + "sparc", + "nvptx", + "hexagon", + ]; let mut version_cmd = Command::new(&llvm_config); version_cmd.arg("--version"); let version_output = output(&mut version_cmd); - let mut parts = version_output.split('.').take(2) - .filter_map(|s| s.parse::().ok()); - let (major, _minor) = - if let (Some(major), Some(minor)) = (parts.next(), parts.next()) { - (major, minor) - } else { - (6, 0) - }; + let mut parts = version_output.split('.').take(2).filter_map(|s| s.parse::().ok()); + let (major, _minor) = if let (Some(major), Some(minor)) = (parts.next(), parts.next()) { + (major, minor) + } else { + (6, 0) + }; if major > 6 { optional_components.push("riscv"); } - let required_components = &["ipo", - "bitreader", - "bitwriter", - "linker", - "asmparser", - "lto", - "instrumentation"]; + let required_components = + &["ipo", "bitreader", "bitwriter", "linker", "asmparser", "lto", "instrumentation"]; let components = output(Command::new(&llvm_config).arg("--components")); let mut components = components.split_whitespace().collect::>(); @@ -157,12 +155,12 @@ fn main() { build_helper::rerun_if_changed_anything_in_dir(Path::new("../rustllvm")); cfg.file("../rustllvm/PassWrapper.cpp") - .file("../rustllvm/RustWrapper.cpp") - .file("../rustllvm/ArchiveWrapper.cpp") - .file("../rustllvm/Linker.cpp") - .cpp(true) - .cpp_link_stdlib(None) // we handle this below - .compile("rustllvm"); + .file("../rustllvm/RustWrapper.cpp") + .file("../rustllvm/ArchiveWrapper.cpp") + .file("../rustllvm/Linker.cpp") + .cpp(true) + .cpp_link_stdlib(None) // we handle this below + .compile("rustllvm"); let (llvm_kind, llvm_link_arg) = detect_llvm_link(); @@ -204,11 +202,7 @@ fn main() { continue; } - let kind = if name.starts_with("LLVM") { - llvm_kind - } else { - "dylib" - }; + let kind = if name.starts_with("LLVM") { llvm_kind } else { "dylib" }; println!("cargo:rustc-link-lib={}={}", kind, name); } @@ -221,13 +215,14 @@ fn main() { let mut cmd = Command::new(&llvm_config); cmd.arg(llvm_link_arg).arg("--ldflags"); for lib in output(&mut cmd).split_whitespace() { - if lib.starts_with("-LIBPATH:") { - println!("cargo:rustc-link-search=native={}", &lib[9..]); - } else if is_crossed { - if lib.starts_with("-L") { - println!("cargo:rustc-link-search=native={}", - lib[2..].replace(&host, &target)); + if is_crossed { + if lib.starts_with("-LIBPATH:") { + println!("cargo:rustc-link-search=native={}", lib[9..].replace(&host, &target)); + } else if lib.starts_with("-L") { + println!("cargo:rustc-link-search=native={}", lib[2..].replace(&host, &target)); } + } else if lib.starts_with("-LIBPATH:") { + println!("cargo:rustc-link-search=native={}", &lib[9..]); } else if lib.starts_with("-l") { println!("cargo:rustc-link-lib={}", &lib[2..]); } else if lib.starts_with("-L") { @@ -254,11 +249,7 @@ fn main() { let llvm_use_libcxx = env::var_os("LLVM_USE_LIBCXX"); let stdcppname = if target.contains("openbsd") { - if target.contains("sparc64") { - "estdc++" - } else { - "c++" - } + if target.contains("sparc64") { "estdc++" } else { "c++" } } else if target.contains("freebsd") { "c++" } else if target.contains("darwin") { @@ -277,8 +268,7 @@ fn main() { if let Some(s) = llvm_static_stdcpp { assert!(!cxxflags.contains("stdlib=libc++")); let path = PathBuf::from(s); - println!("cargo:rustc-link-search=native={}", - path.parent().unwrap().display()); + println!("cargo:rustc-link-search=native={}", path.parent().unwrap().display()); if target.contains("windows") { println!("cargo:rustc-link-lib=static-nobundle={}", stdcppname); } else { diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs index 9c8943a955..eca1808de3 100644 --- a/src/librustc_llvm/lib.rs +++ b/src/librustc_llvm/lib.rs @@ -1,14 +1,12 @@ #![feature(nll)] #![feature(static_nobundle)] - #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")] // NOTE: This crate only exists to allow linking on mingw targets. +use libc::{c_char, size_t}; use std::cell::RefCell; use std::slice; -use libc::{c_char, size_t}; - #[repr(C)] pub struct RustString { @@ -17,9 +15,11 @@ pub struct RustString { /// Appending to a Rust string -- used by RawRustStringOstream. #[no_mangle] -pub unsafe extern "C" fn LLVMRustStringWriteImpl(sr: &RustString, - ptr: *const c_char, - size: size_t) { +pub unsafe extern "C" fn LLVMRustStringWriteImpl( + sr: &RustString, + ptr: *const c_char, + size: size_t, +) { let slice = slice::from_raw_parts(ptr as *const u8, size as usize); sr.bytes.borrow_mut().extend_from_slice(slice); @@ -44,85 +44,115 @@ pub fn initialize_available_targets() { init(); } } ); - init_target!(llvm_component = "x86", - LLVMInitializeX86TargetInfo, - LLVMInitializeX86Target, - LLVMInitializeX86TargetMC, - LLVMInitializeX86AsmPrinter, - LLVMInitializeX86AsmParser); - init_target!(llvm_component = "arm", - LLVMInitializeARMTargetInfo, - LLVMInitializeARMTarget, - LLVMInitializeARMTargetMC, - LLVMInitializeARMAsmPrinter, - LLVMInitializeARMAsmParser); - init_target!(llvm_component = "aarch64", - LLVMInitializeAArch64TargetInfo, - LLVMInitializeAArch64Target, - LLVMInitializeAArch64TargetMC, - LLVMInitializeAArch64AsmPrinter, - LLVMInitializeAArch64AsmParser); - init_target!(llvm_component = "amdgpu", - LLVMInitializeAMDGPUTargetInfo, - LLVMInitializeAMDGPUTarget, - LLVMInitializeAMDGPUTargetMC, - LLVMInitializeAMDGPUAsmPrinter, - LLVMInitializeAMDGPUAsmParser); - init_target!(llvm_component = "mips", - LLVMInitializeMipsTargetInfo, - LLVMInitializeMipsTarget, - LLVMInitializeMipsTargetMC, - LLVMInitializeMipsAsmPrinter, - LLVMInitializeMipsAsmParser); - init_target!(llvm_component = "powerpc", - LLVMInitializePowerPCTargetInfo, - LLVMInitializePowerPCTarget, - LLVMInitializePowerPCTargetMC, - LLVMInitializePowerPCAsmPrinter, - LLVMInitializePowerPCAsmParser); - init_target!(llvm_component = "systemz", - LLVMInitializeSystemZTargetInfo, - LLVMInitializeSystemZTarget, - LLVMInitializeSystemZTargetMC, - LLVMInitializeSystemZAsmPrinter, - LLVMInitializeSystemZAsmParser); - init_target!(llvm_component = "jsbackend", - LLVMInitializeJSBackendTargetInfo, - LLVMInitializeJSBackendTarget, - LLVMInitializeJSBackendTargetMC); - init_target!(llvm_component = "msp430", - LLVMInitializeMSP430TargetInfo, - LLVMInitializeMSP430Target, - LLVMInitializeMSP430TargetMC, - LLVMInitializeMSP430AsmPrinter); - init_target!(all(llvm_component = "msp430", llvm_has_msp430_asm_parser), - LLVMInitializeMSP430AsmParser); - init_target!(llvm_component = "riscv", - LLVMInitializeRISCVTargetInfo, - LLVMInitializeRISCVTarget, - LLVMInitializeRISCVTargetMC, - LLVMInitializeRISCVAsmPrinter, - LLVMInitializeRISCVAsmParser); - init_target!(llvm_component = "sparc", - LLVMInitializeSparcTargetInfo, - LLVMInitializeSparcTarget, - LLVMInitializeSparcTargetMC, - LLVMInitializeSparcAsmPrinter, - LLVMInitializeSparcAsmParser); - init_target!(llvm_component = "nvptx", - LLVMInitializeNVPTXTargetInfo, - LLVMInitializeNVPTXTarget, - LLVMInitializeNVPTXTargetMC, - LLVMInitializeNVPTXAsmPrinter); - init_target!(llvm_component = "hexagon", - LLVMInitializeHexagonTargetInfo, - LLVMInitializeHexagonTarget, - LLVMInitializeHexagonTargetMC, - LLVMInitializeHexagonAsmPrinter, - LLVMInitializeHexagonAsmParser); - init_target!(llvm_component = "webassembly", - LLVMInitializeWebAssemblyTargetInfo, - LLVMInitializeWebAssemblyTarget, - LLVMInitializeWebAssemblyTargetMC, - LLVMInitializeWebAssemblyAsmPrinter); + init_target!( + llvm_component = "x86", + LLVMInitializeX86TargetInfo, + LLVMInitializeX86Target, + LLVMInitializeX86TargetMC, + LLVMInitializeX86AsmPrinter, + LLVMInitializeX86AsmParser + ); + init_target!( + llvm_component = "arm", + LLVMInitializeARMTargetInfo, + LLVMInitializeARMTarget, + LLVMInitializeARMTargetMC, + LLVMInitializeARMAsmPrinter, + LLVMInitializeARMAsmParser + ); + init_target!( + llvm_component = "aarch64", + LLVMInitializeAArch64TargetInfo, + LLVMInitializeAArch64Target, + LLVMInitializeAArch64TargetMC, + LLVMInitializeAArch64AsmPrinter, + LLVMInitializeAArch64AsmParser + ); + init_target!( + llvm_component = "amdgpu", + LLVMInitializeAMDGPUTargetInfo, + LLVMInitializeAMDGPUTarget, + LLVMInitializeAMDGPUTargetMC, + LLVMInitializeAMDGPUAsmPrinter, + LLVMInitializeAMDGPUAsmParser + ); + init_target!( + llvm_component = "mips", + LLVMInitializeMipsTargetInfo, + LLVMInitializeMipsTarget, + LLVMInitializeMipsTargetMC, + LLVMInitializeMipsAsmPrinter, + LLVMInitializeMipsAsmParser + ); + init_target!( + llvm_component = "powerpc", + LLVMInitializePowerPCTargetInfo, + LLVMInitializePowerPCTarget, + LLVMInitializePowerPCTargetMC, + LLVMInitializePowerPCAsmPrinter, + LLVMInitializePowerPCAsmParser + ); + init_target!( + llvm_component = "systemz", + LLVMInitializeSystemZTargetInfo, + LLVMInitializeSystemZTarget, + LLVMInitializeSystemZTargetMC, + LLVMInitializeSystemZAsmPrinter, + LLVMInitializeSystemZAsmParser + ); + init_target!( + llvm_component = "jsbackend", + LLVMInitializeJSBackendTargetInfo, + LLVMInitializeJSBackendTarget, + LLVMInitializeJSBackendTargetMC + ); + init_target!( + llvm_component = "msp430", + LLVMInitializeMSP430TargetInfo, + LLVMInitializeMSP430Target, + LLVMInitializeMSP430TargetMC, + LLVMInitializeMSP430AsmPrinter + ); + init_target!( + all(llvm_component = "msp430", llvm_has_msp430_asm_parser), + LLVMInitializeMSP430AsmParser + ); + init_target!( + llvm_component = "riscv", + LLVMInitializeRISCVTargetInfo, + LLVMInitializeRISCVTarget, + LLVMInitializeRISCVTargetMC, + LLVMInitializeRISCVAsmPrinter, + LLVMInitializeRISCVAsmParser + ); + init_target!( + llvm_component = "sparc", + LLVMInitializeSparcTargetInfo, + LLVMInitializeSparcTarget, + LLVMInitializeSparcTargetMC, + LLVMInitializeSparcAsmPrinter, + LLVMInitializeSparcAsmParser + ); + init_target!( + llvm_component = "nvptx", + LLVMInitializeNVPTXTargetInfo, + LLVMInitializeNVPTXTarget, + LLVMInitializeNVPTXTargetMC, + LLVMInitializeNVPTXAsmPrinter + ); + init_target!( + llvm_component = "hexagon", + LLVMInitializeHexagonTargetInfo, + LLVMInitializeHexagonTarget, + LLVMInitializeHexagonTargetMC, + LLVMInitializeHexagonAsmPrinter, + LLVMInitializeHexagonAsmParser + ); + init_target!( + llvm_component = "webassembly", + LLVMInitializeWebAssemblyTargetInfo, + LLVMInitializeWebAssemblyTarget, + LLVMInitializeWebAssemblyTargetMC, + LLVMInitializeWebAssemblyAsmPrinter + ); } diff --git a/src/librustc_lsan/Cargo.toml b/src/librustc_lsan/Cargo.toml deleted file mode 100644 index 9a24361f44..0000000000 --- a/src/librustc_lsan/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -authors = ["The Rust Project Developers"] -build = "build.rs" -name = "rustc_lsan" -version = "0.0.0" -edition = "2018" - -[lib] -name = "rustc_lsan" -path = "lib.rs" -test = false - -[build-dependencies] -build_helper = { path = "../build_helper" } -cmake = "0.1.38" - -[dependencies] -alloc = { path = "../liballoc" } -core = { path = "../libcore" } -compiler_builtins = "0.1.0" diff --git a/src/librustc_lsan/build.rs b/src/librustc_lsan/build.rs deleted file mode 100644 index 73720d8c2d..0000000000 --- a/src/librustc_lsan/build.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::env; -use build_helper::sanitizer_lib_boilerplate; - -use cmake::Config; - -fn main() { - println!("cargo:rerun-if-env-changed=RUSTC_BUILD_SANITIZERS"); - if env::var("RUSTC_BUILD_SANITIZERS") != Ok("1".to_string()) { - return; - } - if let Some(llvm_config) = env::var_os("LLVM_CONFIG") { - build_helper::restore_library_path(); - - let (native, target) = match sanitizer_lib_boilerplate("lsan") { - Ok(native) => native, - _ => return, - }; - - Config::new(&native.src_dir) - .define("COMPILER_RT_BUILD_SANITIZERS", "ON") - .define("COMPILER_RT_BUILD_BUILTINS", "OFF") - .define("COMPILER_RT_BUILD_XRAY", "OFF") - .define("LLVM_CONFIG_PATH", llvm_config) - .out_dir(&native.out_dir) - .build_target(&target) - .build(); - } - println!("cargo:rerun-if-env-changed=LLVM_CONFIG"); -} diff --git a/src/librustc_lsan/lib.rs b/src/librustc_lsan/lib.rs deleted file mode 100644 index d6c8e54c18..0000000000 --- a/src/librustc_lsan/lib.rs +++ /dev/null @@ -1,8 +0,0 @@ -#![sanitizer_runtime] -#![feature(nll)] -#![feature(sanitizer_runtime)] -#![feature(staged_api)] -#![no_std] -#![unstable(feature = "sanitizer_runtime_lib", - reason = "internal implementation detail of sanitizers", - issue = "0")] diff --git a/src/librustc_macros/src/hash_stable.rs b/src/librustc_macros/src/hash_stable.rs index 103fcd0e8e..e6f457dd66 100644 --- a/src/librustc_macros/src/hash_stable.rs +++ b/src/librustc_macros/src/hash_stable.rs @@ -1,7 +1,7 @@ -use synstructure; -use syn::{self, Meta, NestedMeta, parse_quote}; use proc_macro2::{self, Ident}; use quote::quote; +use syn::{self, parse_quote, Meta, NestedMeta}; +use synstructure; struct Attributes { ignore: bool, @@ -9,10 +9,7 @@ struct Attributes { } fn parse_attributes(field: &syn::Field) -> Attributes { - let mut attrs = Attributes { - ignore: false, - project: None, - }; + let mut attrs = Attributes { ignore: false, project: None }; for attr in &field.attrs { if let Ok(meta) = attr.parse_meta() { if !meta.path().is_ident("stable_hasher") { @@ -51,17 +48,17 @@ pub fn hash_stable_generic_derive(mut s: synstructure::Structure<'_>) -> proc_ma let generic: syn::GenericParam = parse_quote!(__CTX); s.add_bounds(synstructure::AddBounds::Generics); s.add_impl_generic(generic); - s.add_where_predicate(parse_quote!{ __CTX: crate::HashStableContext }); + s.add_where_predicate(parse_quote! { __CTX: crate::HashStableContext }); let body = s.each(|bi| { let attrs = parse_attributes(bi.ast()); if attrs.ignore { - quote!{} + quote! {} } else if let Some(project) = attrs.project { - quote!{ + quote! { &#bi.#project.hash_stable(__hcx, __hasher); } } else { - quote!{ + quote! { #bi.hash_stable(__hcx, __hasher); } } @@ -75,15 +72,18 @@ pub fn hash_stable_generic_derive(mut s: synstructure::Structure<'_>) -> proc_ma syn::Data::Union(_) => panic!("cannot derive on union"), }; - s.bound_impl(quote!(::rustc_data_structures::stable_hasher::HashStable<__CTX>), quote!{ - fn hash_stable( - &self, - __hcx: &mut __CTX, - __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher) { - #discriminant - match *self { #body } - } - }) + s.bound_impl( + quote!(::rustc_data_structures::stable_hasher::HashStable<__CTX>), + quote! { + fn hash_stable( + &self, + __hcx: &mut __CTX, + __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher) { + #discriminant + match *self { #body } + } + }, + ) } pub fn hash_stable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream { @@ -93,13 +93,13 @@ pub fn hash_stable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::To let body = s.each(|bi| { let attrs = parse_attributes(bi.ast()); if attrs.ignore { - quote!{} + quote! {} } else if let Some(project) = attrs.project { - quote!{ + quote! { &#bi.#project.hash_stable(__hcx, __hasher); } } else { - quote!{ + quote! { #bi.hash_stable(__hcx, __hasher); } } @@ -113,14 +113,20 @@ pub fn hash_stable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::To syn::Data::Union(_) => panic!("cannot derive on union"), }; - s.bound_impl(quote!(::rustc_data_structures::stable_hasher::HashStable - <::rustc::ich::StableHashingContext<'__ctx>>), quote!{ - fn hash_stable( - &self, - __hcx: &mut ::rustc::ich::StableHashingContext<'__ctx>, - __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher) { - #discriminant - match *self { #body } - } - }) + s.bound_impl( + quote!( + ::rustc_data_structures::stable_hasher::HashStable< + ::rustc::ich::StableHashingContext<'__ctx>, + > + ), + quote! { + fn hash_stable( + &self, + __hcx: &mut ::rustc::ich::StableHashingContext<'__ctx>, + __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher) { + #discriminant + match *self { #body } + } + }, + ) } diff --git a/src/librustc_macros/src/lib.rs b/src/librustc_macros/src/lib.rs index eee634ffeb..3f55d81ce7 100644 --- a/src/librustc_macros/src/lib.rs +++ b/src/librustc_macros/src/lib.rs @@ -1,6 +1,5 @@ #![allow(rustc::default_hash_types)] - -#![recursion_limit="128"] +#![recursion_limit = "128"] extern crate proc_macro; @@ -9,10 +8,10 @@ use synstructure::decl_derive; use proc_macro::TokenStream; mod hash_stable; -mod type_foldable; mod lift; mod query; mod symbols; +mod type_foldable; #[proc_macro] pub fn rustc_queries(input: TokenStream) -> TokenStream { diff --git a/src/librustc_macros/src/lift.rs b/src/librustc_macros/src/lift.rs index 23f30bcad2..1b91fc5018 100644 --- a/src/librustc_macros/src/lift.rs +++ b/src/librustc_macros/src/lift.rs @@ -1,7 +1,7 @@ -use synstructure; -use syn::{self, parse_quote}; use proc_macro2; use quote::quote; +use syn::{self, parse_quote}; +use synstructure; pub fn lift_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream { s.add_bounds(synstructure::AddBounds::Generics); @@ -15,36 +15,39 @@ pub fn lift_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStre // Replace `'tcx` lifetime by the `'__lifted` lifetime let (_, generics, _) = ast.generics.split_for_impl(); - let mut generics : syn::AngleBracketedGenericArguments = syn::parse_quote!{ #generics }; + let mut generics: syn::AngleBracketedGenericArguments = syn::parse_quote! { #generics }; for arg in generics.args.iter_mut() { match arg { syn::GenericArgument::Lifetime(l) if *l == tcx => { *arg = parse_quote!('__lifted); - }, + } syn::GenericArgument::Type(t) => { - *arg = syn::parse_quote!{ #t::Lifted }; - }, - _ => {}, + *arg = syn::parse_quote! { #t::Lifted }; + } + _ => {} } } - quote!{ #ident #generics } + quote! { #ident #generics } }; let body = s.each_variant(|vi| { let bindings = &vi.bindings(); vi.construct(|_, index| { let bi = &bindings[index]; - quote!{ __tcx.lift(#bi)? } + quote! { __tcx.lift(#bi)? } }) }); s.add_impl_generic(newtcx); - s.bound_impl(quote!(::rustc::ty::Lift<'__lifted>), quote!{ - type Lifted = #lifted; + s.bound_impl( + quote!(::rustc::ty::Lift<'__lifted>), + quote! { + type Lifted = #lifted; - fn lift_to_tcx(&self, __tcx: ::rustc::ty::TyCtxt<'__lifted>) -> Option<#lifted> { - Some(match *self { #body }) - } - }) + fn lift_to_tcx(&self, __tcx: ::rustc::ty::TyCtxt<'__lifted>) -> Option<#lifted> { + Some(match *self { #body }) + } + }, + ) } diff --git a/src/librustc_macros/src/query.rs b/src/librustc_macros/src/query.rs index 139e1b554c..f680b0d64c 100644 --- a/src/librustc_macros/src/query.rs +++ b/src/librustc_macros/src/query.rs @@ -1,15 +1,15 @@ +use itertools::Itertools; use proc_macro::TokenStream; -use proc_macro2::{TokenTree, Delimiter}; +use proc_macro2::{Delimiter, TokenTree}; +use quote::quote; +use syn; +use syn::parse::{Parse, ParseStream, Result}; +use syn::punctuated::Punctuated; +use syn::spanned::Spanned; use syn::{ - Token, Ident, Type, Attribute, ReturnType, Expr, Block, Error, - braced, parenthesized, parse_macro_input, + braced, parenthesized, parse_macro_input, Attribute, Block, Error, Expr, Ident, ReturnType, + Token, Type, }; -use syn::spanned::Spanned; -use syn::parse::{Result, Parse, ParseStream}; -use syn::punctuated::Punctuated; -use syn; -use quote::quote; -use itertools::Itertools; #[allow(non_camel_case_types)] mod kw { @@ -164,13 +164,7 @@ impl Parse for Query { braced!(content in input); let modifiers = content.parse()?; - Ok(Query { - modifiers, - name, - key, - arg, - result, - }) + Ok(Query { modifiers, name, key, arg, result }) } } @@ -198,10 +192,7 @@ impl Parse for Group { let name: Ident = input.parse()?; let content; braced!(content in input); - Ok(Group { - name, - queries: content.parse()?, - }) + Ok(Group { name, queries: content.parse()? }) } } @@ -352,14 +343,20 @@ fn add_query_description_impl( } }; - let tcx = args.as_ref().map(|t| { - let t = &(t.0).0; - quote! { #t } - }).unwrap_or(quote! { _ }); - let value = args.as_ref().map(|t| { - let t = &(t.1).0; - quote! { #t } - }).unwrap_or(quote! { _ }); + let tcx = args + .as_ref() + .map(|t| { + let t = &(t.0).0; + quote! { #t } + }) + .unwrap_or(quote! { _ }); + let value = args + .as_ref() + .map(|t| { + let t = &(t.1).0; + quote! { #t } + }) + .unwrap_or(quote! { _ }); quote! { #[inline] #[allow(unused_variables)] @@ -507,11 +504,7 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream { }); } - add_query_description_impl( - &query, - modifiers, - &mut query_description_stream, - ); + add_query_description_impl(&query, modifiers, &mut query_description_stream); } let name = &group.name; query_stream.extend(quote! { diff --git a/src/librustc_macros/src/symbols.rs b/src/librustc_macros/src/symbols.rs index 1f6e54807d..c692c7f399 100644 --- a/src/librustc_macros/src/symbols.rs +++ b/src/librustc_macros/src/symbols.rs @@ -1,12 +1,9 @@ use proc_macro::TokenStream; -use syn::{ - Token, Ident, LitStr, - braced, parse_macro_input, -}; -use syn::parse::{Result, Parse, ParseStream}; -use syn; -use std::collections::HashSet; use quote::quote; +use std::collections::HashSet; +use syn; +use syn::parse::{Parse, ParseStream, Result}; +use syn::{braced, parse_macro_input, Ident, LitStr, Token}; #[allow(non_camel_case_types)] mod kw { @@ -26,10 +23,7 @@ impl Parse for Keyword { let value = input.parse()?; input.parse::()?; - Ok(Keyword { - name, - value, - }) + Ok(Keyword { name, value }) } } @@ -47,10 +41,7 @@ impl Parse for Symbol { }; input.parse::()?; - Ok(Symbol { - name, - value, - }) + Ok(Symbol { name, value }) } } @@ -84,10 +75,7 @@ impl Parse for Input { braced!(content in input); let symbols = content.parse()?; - Ok(Input { - keywords, - symbols, - }) + Ok(Input { keywords, symbols }) } } diff --git a/src/librustc_macros/src/type_foldable.rs b/src/librustc_macros/src/type_foldable.rs index e6057767b4..3d58984a90 100644 --- a/src/librustc_macros/src/type_foldable.rs +++ b/src/librustc_macros/src/type_foldable.rs @@ -1,6 +1,6 @@ -use synstructure; -use syn; use quote::quote; +use syn; +use synstructure; pub fn type_foldable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream { if let syn::Data::Union(_) = s.ast().data { @@ -12,28 +12,31 @@ pub fn type_foldable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2:: let bindings = vi.bindings(); vi.construct(|_, index| { let bind = &bindings[index]; - quote!{ + quote! { ::rustc::ty::fold::TypeFoldable::fold_with(#bind, __folder) } }) }); let body_visit = s.fold(false, |acc, bind| { - quote!{ #acc || ::rustc::ty::fold::TypeFoldable::visit_with(#bind, __folder) } + quote! { #acc || ::rustc::ty::fold::TypeFoldable::visit_with(#bind, __folder) } }); - s.bound_impl(quote!(::rustc::ty::fold::TypeFoldable<'tcx>), quote!{ - fn super_fold_with<__F: ::rustc::ty::fold::TypeFolder<'tcx>>( - &self, - __folder: &mut __F - ) -> Self { - match *self { #body_fold } - } + s.bound_impl( + quote!(::rustc::ty::fold::TypeFoldable<'tcx>), + quote! { + fn super_fold_with<__F: ::rustc::ty::fold::TypeFolder<'tcx>>( + &self, + __folder: &mut __F + ) -> Self { + match *self { #body_fold } + } - fn super_visit_with<__F: ::rustc::ty::fold::TypeVisitor<'tcx>>( - &self, - __folder: &mut __F - ) -> bool { - match *self { #body_visit } - } - }) + fn super_visit_with<__F: ::rustc::ty::fold::TypeVisitor<'tcx>>( + &self, + __folder: &mut __F + ) -> bool { + match *self { #body_visit } + } + }, + ) } diff --git a/src/librustc_metadata/Cargo.toml b/src/librustc_metadata/Cargo.toml index 88d1c501ba..6da584733a 100644 --- a/src/librustc_metadata/Cargo.toml +++ b/src/librustc_metadata/Cargo.toml @@ -16,13 +16,16 @@ memmap = "0.7" smallvec = { version = "1.0", features = ["union", "may_dangle"] } rustc = { path = "../librustc" } rustc_data_structures = { path = "../librustc_data_structures" } -errors = { path = "../librustc_errors", package = "rustc_errors" } +rustc_errors = { path = "../librustc_errors" } +rustc_hir = { path = "../librustc_hir" } rustc_target = { path = "../librustc_target" } rustc_index = { path = "../librustc_index" } rustc_serialize = { path = "../libserialize", package = "serialize" } stable_deref_trait = "1.0.0" syntax = { path = "../libsyntax" } -syntax_expand = { path = "../libsyntax_expand" } +rustc_expand = { path = "../librustc_expand" } rustc_parse = { path = "../librustc_parse" } -syntax_pos = { path = "../libsyntax_pos" } -rustc_error_codes = { path = "../librustc_error_codes" } +rustc_span = { path = "../librustc_span" } + +[target.'cfg(windows)'.dependencies] +winapi = { version = "0.3", features = ["errhandlingapi", "libloaderapi"] } diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs index 0a0f2560b9..351e72d467 100644 --- a/src/librustc_metadata/creader.rs +++ b/src/librustc_metadata/creader.rs @@ -1,37 +1,33 @@ //! Validates all used crates and extern libraries and loads their metadata use crate::locator::{CrateLocator, CratePaths}; -use crate::rmeta::{CrateMetadata, CrateNumMap, CrateRoot, CrateDep, MetadataBlob}; +use crate::rmeta::{CrateDep, CrateMetadata, CrateNumMap, CrateRoot, MetadataBlob}; -use rustc::hir::def_id::CrateNum; +use rustc::hir::map::Definitions; +use rustc::middle::cstore::DepKind; +use rustc::middle::cstore::{CrateSource, ExternCrate, ExternCrateSource, MetadataLoaderDyn}; +use rustc::session::config; +use rustc::session::search_paths::PathKind; +use rustc::session::{CrateDisambiguator, Session}; +use rustc::ty::TyCtxt; use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::Lrc; +use rustc_errors::struct_span_err; +use rustc_expand::base::SyntaxExtension; +use rustc_hir::def_id::{CrateNum, LOCAL_CRATE}; use rustc_index::vec::IndexVec; -use rustc::middle::cstore::DepKind; -use rustc::session::{Session, CrateDisambiguator}; -use rustc::session::config::{Sanitizer, self}; +use rustc_span::edition::Edition; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::{Span, DUMMY_SP}; use rustc_target::spec::{PanicStrategy, TargetTriple}; -use rustc::session::search_paths::PathKind; -use rustc::middle::cstore::{CrateSource, ExternCrate, ExternCrateSource, MetadataLoaderDyn}; -use rustc::hir::map::Definitions; -use rustc::hir::def_id::LOCAL_CRATE; -use rustc::ty::TyCtxt; - -use std::path::Path; -use std::{cmp, fs}; - use syntax::ast; use syntax::attr; -use syntax::edition::Edition; use syntax::expand::allocator::{global_allocator_spans, AllocatorKind}; -use syntax::symbol::{Symbol, sym}; -use syntax::span_fatal; -use syntax_expand::base::SyntaxExtension; -use syntax_pos::{Span, DUMMY_SP}; + use log::{debug, info, log_enabled}; use proc_macro::bridge::client::ProcMacro; - -use rustc_error_codes::*; +use std::path::Path; +use std::{cmp, fs}; #[derive(Clone)] pub struct CStore { @@ -89,7 +85,7 @@ fn dump_crates(cstore: &CStore) { info!(" reqd: {:?}", data.dep_kind()); let CrateSource { dylib, rlib, rmeta } = data.source(); dylib.as_ref().map(|dl| info!(" dylib: {}", dl.0.display())); - rlib.as_ref().map(|rl| info!(" rlib: {}", rl.0.display())); + rlib.as_ref().map(|rl| info!(" rlib: {}", rl.0.display())); rmeta.as_ref().map(|rl| info!(" rmeta: {}", rl.0.display())); }); } @@ -105,7 +101,8 @@ impl CStore { } crate fn get_crate_data(&self, cnum: CrateNum) -> &CrateMetadata { - self.metas[cnum].as_ref() + self.metas[cnum] + .as_ref() .unwrap_or_else(|| panic!("Failed to get crate data for {:?}", cnum)) } @@ -183,7 +180,7 @@ impl<'a> CrateLoader<'a> { injected_panic_runtime: None, allocator_kind: None, has_global_allocator: false, - } + }, } } @@ -198,10 +195,15 @@ impl<'a> CrateLoader<'a> { fn existing_match(&self, name: Symbol, hash: Option, kind: PathKind) -> Option { let mut ret = None; self.cstore.iter_crate_data(|cnum, data| { - if data.name() != name { return } + if data.name() != name { + return; + } match hash { - Some(hash) if hash == data.hash() => { ret = Some(cnum); return } + Some(hash) if hash == data.hash() => { + ret = Some(cnum); + return; + } Some(..) => return, None => {} } @@ -221,13 +223,13 @@ impl<'a> CrateLoader<'a> { if let Some(mut files) = entry.files() { if files.any(|l| { let l = fs::canonicalize(l).ok(); - source.dylib.as_ref().map(|p| &p.0) == l.as_ref() || - source.rlib.as_ref().map(|p| &p.0) == l.as_ref() + source.dylib.as_ref().map(|p| &p.0) == l.as_ref() + || source.rlib.as_ref().map(|p| &p.0) == l.as_ref() }) { ret = Some(cnum); } } - return + return; } // Alright, so we've gotten this far which means that `data` has the @@ -236,9 +238,13 @@ impl<'a> CrateLoader<'a> { // have to make sure that this crate was found in the crate lookup // path (this is a top-level dependency) as we don't want to // implicitly load anything inside the dependency lookup path. - let prev_kind = source.dylib.as_ref().or(source.rlib.as_ref()) - .or(source.rmeta.as_ref()) - .expect("No sources for crate").1; + let prev_kind = source + .dylib + .as_ref() + .or(source.rlib.as_ref()) + .or(source.rmeta.as_ref()) + .expect("No sources for crate") + .1; if kind.matches(prev_kind) { ret = Some(cnum); } @@ -246,30 +252,41 @@ impl<'a> CrateLoader<'a> { return ret; } - fn verify_no_symbol_conflicts(&self, - span: Span, - root: &CrateRoot<'_>) { + fn verify_no_symbol_conflicts(&self, span: Span, root: &CrateRoot<'_>) { // Check for (potential) conflicts with the local crate - if self.local_crate_name == root.name() && - self.sess.local_crate_disambiguator() == root.disambiguator() { - span_fatal!(self.sess, span, E0519, - "the current crate is indistinguishable from one of its \ + if self.local_crate_name == root.name() + && self.sess.local_crate_disambiguator() == root.disambiguator() + { + struct_span_err!( + self.sess, + span, + E0519, + "the current crate is indistinguishable from one of its \ dependencies: it has the same crate-name `{}` and was \ compiled with the same `-C metadata` arguments. This \ will result in symbol conflicts between the two.", - root.name()) + root.name() + ) + .emit() } // Check for conflicts with any crate loaded so far self.cstore.iter_crate_data(|_, other| { if other.name() == root.name() && // same crate-name other.disambiguator() == root.disambiguator() && // same crate-disambiguator - other.hash() != root.hash() { // but different SVH - span_fatal!(self.sess, span, E0523, - "found two different crates with name `{}` that are \ + other.hash() != root.hash() + { + // but different SVH + struct_span_err!( + self.sess, + span, + E0523, + "found two different crates with name `{}` that are \ not distinguished by differing `-C metadata`. This \ will result in symbol conflicts between the two.", - root.name()) + root.name() + ) + .emit(); } }); } @@ -281,7 +298,7 @@ impl<'a> CrateLoader<'a> { span: Span, lib: Library, dep_kind: DepKind, - name: Symbol + name: Symbol, ) -> CrateNum { let _prof_timer = self.sess.prof.generic_activity("metadata_register_crate"); @@ -290,9 +307,8 @@ impl<'a> CrateLoader<'a> { let host_hash = host_lib.as_ref().map(|lib| lib.metadata.get_root().hash()); self.verify_no_symbol_conflicts(span, &crate_root); - let private_dep = self.sess.opts.externs.get(&name.as_str()) - .map(|e| e.is_private_dep) - .unwrap_or(false); + let private_dep = + self.sess.opts.externs.get(&name.as_str()).map(|e| e.is_private_dep).unwrap_or(false); info!("register crate `{}` (private_dep = {})", crate_root.name(), private_dep); @@ -314,8 +330,10 @@ impl<'a> CrateLoader<'a> { let raw_proc_macros = if crate_root.is_proc_macro_crate() { let temp_root; let (dlsym_source, dlsym_root) = match &host_lib { - Some(host_lib) => - (&host_lib.source, { temp_root = host_lib.metadata.get_root(); &temp_root }), + Some(host_lib) => (&host_lib.source, { + temp_root = host_lib.metadata.get_root(); + &temp_root + }), None => (&source, &crate_root), }; let dlsym_dylib = dlsym_source.dylib.as_ref().expect("no dylib for a proc-macro crate"); @@ -324,18 +342,21 @@ impl<'a> CrateLoader<'a> { None }; - self.cstore.set_crate_data(cnum, CrateMetadata::new( - self.sess, - metadata, - crate_root, - raw_proc_macros, + self.cstore.set_crate_data( cnum, - cnum_map, - dep_kind, - source, - private_dep, - host_hash, - )); + CrateMetadata::new( + self.sess, + metadata, + crate_root, + raw_proc_macros, + cnum, + cnum_map, + dep_kind, + source, + private_dep, + host_hash, + ), + ); cnum } @@ -360,7 +381,7 @@ impl<'a> CrateLoader<'a> { proc_macro_locator.reset(); let result = match self.load(&mut proc_macro_locator)? { LoadResult::Previous(cnum) => return Some((LoadResult::Previous(cnum), None)), - LoadResult::Loaded(library) => Some(LoadResult::Loaded(library)) + LoadResult::Loaded(library) => Some(LoadResult::Loaded(library)), }; locator.hash = locator.host_hash; // Use the locator when looking for the host proc macro crate, as that is required @@ -385,7 +406,7 @@ impl<'a> CrateLoader<'a> { LoadResult::Previous(..) => { panic!("host and target proc macros must be loaded in lock-step") } - LoadResult::Loaded(library) => library + LoadResult::Loaded(library) => library, }; (target_result.unwrap(), Some(host_result)) } else { @@ -439,10 +460,13 @@ impl<'a> CrateLoader<'a> { Some(false), // is_proc_macro ); - self.load(&mut locator).map(|r| (r, None)).or_else(|| { - dep_kind = DepKind::UnexportedMacrosOnly; - self.load_proc_macro(&mut locator, path_kind) - }).ok_or_else(move || LoadError::LocatorError(locator))? + self.load(&mut locator) + .map(|r| (r, None)) + .or_else(|| { + dep_kind = DepKind::UnexportedMacrosOnly; + self.load_proc_macro(&mut locator, path_kind) + }) + .ok_or_else(move || LoadError::LocatorError(locator))? }; match result { @@ -457,7 +481,7 @@ impl<'a> CrateLoader<'a> { (LoadResult::Loaded(library), host_library) => { Ok(self.register_crate(host_library, root, span, library, dep_kind, name)) } - _ => panic!() + _ => panic!(), } } @@ -500,14 +524,15 @@ impl<'a> CrateLoader<'a> { } // Go through the crate metadata and load any crates that it references - fn resolve_crate_deps(&mut self, - root: &CratePaths, - crate_root: &CrateRoot<'_>, - metadata: &MetadataBlob, - krate: CrateNum, - span: Span, - dep_kind: DepKind) - -> CrateNumMap { + fn resolve_crate_deps( + &mut self, + root: &CratePaths, + crate_root: &CrateRoot<'_>, + metadata: &MetadataBlob, + krate: CrateNum, + span: Span, + dep_kind: DepKind, + ) -> CrateNumMap { debug!("resolving deps of external crate"); if crate_root.is_proc_macro_crate() { return CrateNumMap::new(); @@ -516,27 +541,32 @@ impl<'a> CrateLoader<'a> { // The map from crate numbers in the crate we're resolving to local crate numbers. // We map 0 and all other holes in the map to our parent crate. The "additional" // self-dependencies should be harmless. - std::iter::once(krate).chain(crate_root.decode_crate_deps(metadata).map(|dep| { - info!("resolving dep crate {} hash: `{}` extra filename: `{}`", dep.name, dep.hash, - dep.extra_filename); - if dep.kind == DepKind::UnexportedMacrosOnly { - return krate; - } - let dep_kind = match dep_kind { - DepKind::MacrosOnly => DepKind::MacrosOnly, - _ => dep.kind, - }; - self.resolve_crate(dep.name, span, dep_kind, Some((root, &dep))) - })).collect() + std::iter::once(krate) + .chain(crate_root.decode_crate_deps(metadata).map(|dep| { + info!( + "resolving dep crate {} hash: `{}` extra filename: `{}`", + dep.name, dep.hash, dep.extra_filename + ); + if dep.kind == DepKind::UnexportedMacrosOnly { + return krate; + } + let dep_kind = match dep_kind { + DepKind::MacrosOnly => DepKind::MacrosOnly, + _ => dep.kind, + }; + self.resolve_crate(dep.name, span, dep_kind, Some((root, &dep))) + })) + .collect() } - fn dlsym_proc_macros(&self, - path: &Path, - disambiguator: CrateDisambiguator, - span: Span + fn dlsym_proc_macros( + &self, + path: &Path, + disambiguator: CrateDisambiguator, + span: Span, ) -> &'static [ProcMacro] { - use std::env; use crate::dynamic_lib::DynamicLibrary; + use std::env; // Make sure the path contains a / or the linker will search for it. let path = env::current_dir().unwrap().join(path); @@ -564,12 +594,11 @@ impl<'a> CrateLoader<'a> { fn inject_panic_runtime(&mut self, krate: &ast::Crate) { // If we're only compiling an rlib, then there's no need to select a // panic runtime, so we just skip this section entirely. - let any_non_rlib = self.sess.crate_types.borrow().iter().any(|ct| { - *ct != config::CrateType::Rlib - }); + let any_non_rlib = + self.sess.crate_types.borrow().iter().any(|ct| *ct != config::CrateType::Rlib); if !any_non_rlib { info!("panic runtime injection skipped, only generating rlib"); - return + return; } // If we need a panic runtime, we try to find an existing one here. At @@ -581,16 +610,16 @@ impl<'a> CrateLoader<'a> { // compilation mode also comes into play. let desired_strategy = self.sess.panic_strategy(); let mut runtime_found = false; - let mut needs_panic_runtime = attr::contains_name(&krate.attrs, - sym::needs_panic_runtime); + let mut needs_panic_runtime = attr::contains_name(&krate.attrs, sym::needs_panic_runtime); self.cstore.iter_crate_data(|cnum, data| { needs_panic_runtime = needs_panic_runtime || data.needs_panic_runtime(); if data.is_panic_runtime() { // Inject a dependency from all #![needs_panic_runtime] to this // #![panic_runtime] crate. - self.inject_dependency_if(cnum, "a panic runtime", - &|data| data.needs_panic_runtime()); + self.inject_dependency_if(cnum, "a panic runtime", &|data| { + data.needs_panic_runtime() + }); runtime_found = runtime_found || data.dep_kind() == DepKind::Explicit; } }); @@ -599,7 +628,7 @@ impl<'a> CrateLoader<'a> { // we just don't need one at all, then we're done here and there's // nothing else to do. if !needs_panic_runtime || runtime_found { - return + return; } // By this point we know that we (a) need a panic runtime and (b) no @@ -626,123 +655,23 @@ impl<'a> CrateLoader<'a> { // Sanity check the loaded crate to ensure it is indeed a panic runtime // and the panic strategy is indeed what we thought it was. if !data.is_panic_runtime() { - self.sess.err(&format!("the crate `{}` is not a panic runtime", - name)); + self.sess.err(&format!("the crate `{}` is not a panic runtime", name)); } if data.panic_strategy() != desired_strategy { - self.sess.err(&format!("the crate `{}` does not have the panic \ + self.sess.err(&format!( + "the crate `{}` does not have the panic \ strategy `{}`", - name, desired_strategy.desc())); + name, + desired_strategy.desc() + )); } self.cstore.injected_panic_runtime = Some(cnum); - self.inject_dependency_if(cnum, "a panic runtime", - &|data| data.needs_panic_runtime()); - } - - fn inject_sanitizer_runtime(&mut self) { - if let Some(ref sanitizer) = self.sess.opts.debugging_opts.sanitizer { - // Sanitizers can only be used on some tested platforms with - // executables linked to `std` - const ASAN_SUPPORTED_TARGETS: &[&str] = &["x86_64-unknown-linux-gnu", - "x86_64-apple-darwin"]; - const TSAN_SUPPORTED_TARGETS: &[&str] = &["x86_64-unknown-linux-gnu", - "x86_64-apple-darwin"]; - const LSAN_SUPPORTED_TARGETS: &[&str] = &["x86_64-unknown-linux-gnu"]; - const MSAN_SUPPORTED_TARGETS: &[&str] = &["x86_64-unknown-linux-gnu"]; - - let supported_targets = match *sanitizer { - Sanitizer::Address => ASAN_SUPPORTED_TARGETS, - Sanitizer::Thread => TSAN_SUPPORTED_TARGETS, - Sanitizer::Leak => LSAN_SUPPORTED_TARGETS, - Sanitizer::Memory => MSAN_SUPPORTED_TARGETS, - }; - if !supported_targets.contains(&&*self.sess.opts.target_triple.triple()) { - self.sess.err(&format!("{:?}Sanitizer only works with the `{}` target", - sanitizer, - supported_targets.join("` or `") - )); - return - } - - // firstyear 2017 - during testing I was unable to access an OSX machine - // to make this work on different crate types. As a result, today I have - // only been able to test and support linux as a target. - if self.sess.opts.target_triple.triple() == "x86_64-unknown-linux-gnu" { - if !self.sess.crate_types.borrow().iter().all(|ct| { - match *ct { - // Link the runtime - config::CrateType::Executable => true, - // This crate will be compiled with the required - // instrumentation pass - config::CrateType::Staticlib | - config::CrateType::Rlib | - config::CrateType::Dylib | - config::CrateType::Cdylib => - false, - _ => { - self.sess.err(&format!("Only executables, staticlibs, \ - cdylibs, dylibs and rlibs can be compiled with \ - `-Z sanitizer`")); - false - } - } - }) { - return - } - } else { - if !self.sess.crate_types.borrow().iter().all(|ct| { - match *ct { - // Link the runtime - config::CrateType::Executable => true, - // This crate will be compiled with the required - // instrumentation pass - config::CrateType::Rlib => false, - _ => { - self.sess.err(&format!("Only executables and rlibs can be \ - compiled with `-Z sanitizer`")); - false - } - } - }) { - return - } - } - - let mut uses_std = false; - self.cstore.iter_crate_data(|_, data| { - if data.name() == sym::std { - uses_std = true; - } - }); - - if uses_std { - let name = Symbol::intern(match sanitizer { - Sanitizer::Address => "rustc_asan", - Sanitizer::Leak => "rustc_lsan", - Sanitizer::Memory => "rustc_msan", - Sanitizer::Thread => "rustc_tsan", - }); - info!("loading sanitizer: {}", name); - - let cnum = self.resolve_crate(name, DUMMY_SP, DepKind::Explicit, None); - let data = self.cstore.get_crate_data(cnum); - - // Sanity check the loaded crate to ensure it is indeed a sanitizer runtime - if !data.is_sanitizer_runtime() { - self.sess.err(&format!("the crate `{}` is not a sanitizer runtime", - name)); - } - } else { - self.sess.err("Must link std to be compiled with `-Z sanitizer`"); - } - } + self.inject_dependency_if(cnum, "a panic runtime", &|data| data.needs_panic_runtime()); } fn inject_profiler_runtime(&mut self) { - if self.sess.opts.debugging_opts.profile || - self.sess.opts.cg.profile_generate.enabled() - { + if self.sess.opts.debugging_opts.profile || self.sess.opts.cg.profile_generate.enabled() { info!("loading profiler"); let name = Symbol::intern("profiler_builtins"); @@ -751,8 +680,10 @@ impl<'a> CrateLoader<'a> { // Sanity check the loaded crate to ensure it is indeed a profiler runtime if !data.is_profiler_runtime() { - self.sess.err(&format!("the crate `profiler_builtins` is not \ - a profiler runtime")); + self.sess.err(&format!( + "the crate `profiler_builtins` is not \ + a profiler runtime" + )); } } } @@ -760,40 +691,36 @@ impl<'a> CrateLoader<'a> { fn inject_allocator_crate(&mut self, krate: &ast::Crate) { self.cstore.has_global_allocator = match &*global_allocator_spans(krate) { [span1, span2, ..] => { - self.sess.struct_span_err(*span2, "cannot define multiple global allocators") + self.sess + .struct_span_err(*span2, "cannot define multiple global allocators") .span_label(*span2, "cannot define a new global allocator") .span_label(*span1, "previous global allocator is defined here") .emit(); true } - spans => !spans.is_empty() + spans => !spans.is_empty(), }; // Check to see if we actually need an allocator. This desire comes // about through the `#![needs_allocator]` attribute and is typically // written down in liballoc. - let mut needs_allocator = attr::contains_name(&krate.attrs, - sym::needs_allocator); + let mut needs_allocator = attr::contains_name(&krate.attrs, sym::needs_allocator); self.cstore.iter_crate_data(|_, data| { needs_allocator = needs_allocator || data.needs_allocator(); }); if !needs_allocator { - return + return; } // At this point we've determined that we need an allocator. Let's see // if our compilation session actually needs an allocator based on what // we're emitting. - let all_rlib = self.sess.crate_types.borrow() - .iter() - .all(|ct| { - match *ct { - config::CrateType::Rlib => true, - _ => false, - } - }); + let all_rlib = self.sess.crate_types.borrow().iter().all(|ct| match *ct { + config::CrateType::Rlib => true, + _ => false, + }); if all_rlib { - return + return; } // Ok, we need an allocator. Not only that but we're actually going to @@ -803,26 +730,28 @@ impl<'a> CrateLoader<'a> { // First up we check for global allocators. Look at the crate graph here // and see what's a global allocator, including if we ourselves are a // global allocator. - let mut global_allocator = self.cstore.has_global_allocator - .then(|| Symbol::intern("this crate")); + let mut global_allocator = + self.cstore.has_global_allocator.then(|| Symbol::intern("this crate")); self.cstore.iter_crate_data(|_, data| { if !data.has_global_allocator() { - return + return; } match global_allocator { Some(other_crate) => { - self.sess.err(&format!("the `#[global_allocator]` in {} \ + self.sess.err(&format!( + "the `#[global_allocator]` in {} \ conflicts with global \ allocator in: {}", - other_crate, - data.name())); + other_crate, + data.name() + )); } None => global_allocator = Some(data.name()), } }); if global_allocator.is_some() { self.cstore.allocator_kind = Some(AllocatorKind::Global); - return + return; } // Ok we haven't found a global allocator but we still need an @@ -837,23 +766,27 @@ impl<'a> CrateLoader<'a> { }); if !has_default { - self.sess.err("no global memory allocator found but one is \ + self.sess.err( + "no global memory allocator found but one is \ required; link to std or \ add `#[global_allocator]` to a static item \ - that implements the GlobalAlloc trait."); + that implements the GlobalAlloc trait.", + ); } self.cstore.allocator_kind = Some(AllocatorKind::Default); } - fn inject_dependency_if(&self, - krate: CrateNum, - what: &str, - needs_dep: &dyn Fn(&CrateMetadata) -> bool) { + fn inject_dependency_if( + &self, + krate: CrateNum, + what: &str, + needs_dep: &dyn Fn(&CrateMetadata) -> bool, + ) { // don't perform this validation if the session has errors, as one of // those errors may indicate a circular dependency which could cause // this to stack overflow. if self.sess.has_errors() { - return + return; } // Before we inject any dependencies, make sure we don't inject a @@ -862,12 +795,14 @@ impl<'a> CrateLoader<'a> { for dep in self.cstore.crate_dependencies_in_reverse_postorder(krate) { let data = self.cstore.get_crate_data(dep); if needs_dep(&data) { - self.sess.err(&format!("the crate `{}` cannot depend \ + self.sess.err(&format!( + "the crate `{}` cannot depend \ on a crate that needs {}, but \ it depends on `{}`", - self.cstore.get_crate_data(krate).name(), - what, - data.name())); + self.cstore.get_crate_data(krate).name(), + what, + data.name() + )); } } @@ -877,7 +812,7 @@ impl<'a> CrateLoader<'a> { // crates on the command line correctly). self.cstore.iter_crate_data(|cnum, data| { if !needs_dep(data) { - return + return; } info!("injecting a dep from {} to {}", cnum, krate); @@ -886,7 +821,6 @@ impl<'a> CrateLoader<'a> { } pub fn postprocess(&mut self, krate: &ast::Crate) { - self.inject_sanitizer_runtime(); self.inject_profiler_runtime(); self.inject_allocator_crate(krate); self.inject_panic_runtime(krate); @@ -903,12 +837,17 @@ impl<'a> CrateLoader<'a> { ) -> CrateNum { match item.kind { ast::ItemKind::ExternCrate(orig_name) => { - debug!("resolving extern crate stmt. ident: {} orig_name: {:?}", - item.ident, orig_name); + debug!( + "resolving extern crate stmt. ident: {} orig_name: {:?}", + item.ident, orig_name + ); let name = match orig_name { Some(orig_name) => { - crate::validate_crate_name(Some(self.sess), &orig_name.as_str(), - Some(item.span)); + crate::validate_crate_name( + Some(self.sess), + &orig_name.as_str(), + Some(item.span), + ); orig_name } None => item.ident.name, diff --git a/src/librustc_metadata/dependency_format.rs b/src/librustc_metadata/dependency_format.rs index d6d722c47b..375f372005 100644 --- a/src/librustc_metadata/dependency_format.rs +++ b/src/librustc_metadata/dependency_format.rs @@ -53,21 +53,26 @@ use crate::creader::CStore; -use rustc::hir::def_id::CrateNum; -use rustc::middle::cstore::LinkagePreference::{self, RequireStatic, RequireDynamic}; +use rustc::middle::cstore::LinkagePreference::{self, RequireDynamic, RequireStatic}; use rustc::middle::cstore::{self, DepKind}; -use rustc::middle::dependency_format::{DependencyList, Dependencies, Linkage}; +use rustc::middle::dependency_format::{Dependencies, DependencyList, Linkage}; use rustc::session::config; use rustc::ty::TyCtxt; -use rustc::util::nodemap::FxHashMap; +use rustc_data_structures::fx::FxHashMap; +use rustc_hir::def_id::CrateNum; use rustc_target::spec::PanicStrategy; crate fn calculate(tcx: TyCtxt<'_>) -> Dependencies { - tcx.sess.crate_types.borrow().iter().map(|&ty| { - let linkage = calculate_type(tcx, ty); - verify_ok(tcx, &linkage); - (ty, linkage) - }).collect::>() + tcx.sess + .crate_types + .borrow() + .iter() + .map(|&ty| { + let linkage = calculate_type(tcx, ty); + verify_ok(tcx, &linkage); + (ty, linkage) + }) + .collect::>() } fn calculate_type(tcx: TyCtxt<'_>, ty: config::CrateType) -> DependencyList { @@ -78,19 +83,23 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: config::CrateType) -> DependencyList { } let preferred_linkage = match ty { - // cdylibs must have all static dependencies. - config::CrateType::Cdylib => Linkage::Static, - // Generating a dylib without `-C prefer-dynamic` means that we're going // to try to eagerly statically link all dependencies. This is normally // done for end-product dylibs, not intermediate products. - config::CrateType::Dylib if !sess.opts.cg.prefer_dynamic => Linkage::Static, - config::CrateType::Dylib => Linkage::Dynamic, + // + // Treat cdylibs similarly. If `-C prefer-dynamic` is set, the caller may + // be code-size conscious, but without it, it makes sense to statically + // link a cdylib. + config::CrateType::Dylib | config::CrateType::Cdylib if !sess.opts.cg.prefer_dynamic => { + Linkage::Static + } + config::CrateType::Dylib | config::CrateType::Cdylib => Linkage::Dynamic, // If the global prefer_dynamic switch is turned off, or the final // executable will be statically linked, prefer static crate linkage. - config::CrateType::Executable if !sess.opts.cg.prefer_dynamic || - sess.crt_static() => Linkage::Static, + config::CrateType::Executable if !sess.opts.cg.prefer_dynamic || sess.crt_static() => { + Linkage::Static + } config::CrateType::Executable => Linkage::Dynamic, // proc-macro crates are mostly cdylibs, but we also need metadata. @@ -116,18 +125,26 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: config::CrateType) -> DependencyList { return v; } - // Staticlibs, cdylibs, and static executables must have all static - // dependencies. If any are not found, generate some nice pretty errors. - if ty == config::CrateType::Cdylib || ty == config::CrateType::Staticlib || - (ty == config::CrateType::Executable && sess.crt_static() && - !sess.target.target.options.crt_static_allows_dylibs) { + // Staticlibs and static executables must have all static dependencies. + // If any are not found, generate some nice pretty errors. + if ty == config::CrateType::Staticlib + || (ty == config::CrateType::Executable + && sess.crt_static() + && !sess.target.target.options.crt_static_allows_dylibs) + { for &cnum in tcx.crates().iter() { - if tcx.dep_kind(cnum).macros_only() { continue } + if tcx.dep_kind(cnum).macros_only() { + continue; + } let src = tcx.used_crate_source(cnum); - if src.rlib.is_some() { continue } - sess.err(&format!("crate `{}` required to be available in rlib format, \ + if src.rlib.is_some() { + continue; + } + sess.err(&format!( + "crate `{}` required to be available in rlib format, \ but was not found in this form", - tcx.crate_name(cnum))); + tcx.crate_name(cnum) + )); } return Vec::new(); } @@ -139,7 +156,9 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: config::CrateType) -> DependencyList { // dependencies, ensuring there are no conflicts. The only valid case for a // dependency to be relied upon twice is for both cases to rely on a dylib. for &cnum in tcx.crates().iter() { - if tcx.dep_kind(cnum).macros_only() { continue } + if tcx.dep_kind(cnum).macros_only() { + continue; + } let name = tcx.crate_name(cnum); let src = tcx.used_crate_source(cnum); if src.dylib.is_some() { @@ -155,13 +174,13 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: config::CrateType) -> DependencyList { // Collect what we've got so far in the return vector. let last_crate = tcx.crates().len(); - let mut ret = (1..last_crate+1).map(|cnum| { - match formats.get(&CrateNum::new(cnum)) { + let mut ret = (1..last_crate + 1) + .map(|cnum| match formats.get(&CrateNum::new(cnum)) { Some(&RequireDynamic) => Linkage::Dynamic, Some(&RequireStatic) => Linkage::IncludedFromDylib, None => Linkage::NotLinked, - } - }).collect::>(); + }) + .collect::>(); // Run through the dependency list again, and add any missing libraries as // static libraries. @@ -170,9 +189,10 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: config::CrateType) -> DependencyList { // (e.g., it's an allocator) then we skip it here as well. for &cnum in tcx.crates().iter() { let src = tcx.used_crate_source(cnum); - if src.dylib.is_none() && - !formats.contains_key(&cnum) && - tcx.dep_kind(cnum) == DepKind::Explicit { + if src.dylib.is_none() + && !formats.contains_key(&cnum) + && tcx.dep_kind(cnum) == DepKind::Explicit + { assert!(src.rlib.is_some() || src.rmeta.is_some()); log::info!("adding staticlib: {}", tcx.crate_name(cnum)); add_library(tcx, cnum, RequireStatic, &mut formats); @@ -186,8 +206,9 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: config::CrateType) -> DependencyList { // // Things like allocators and panic runtimes may not have been activated // quite yet, so do so here. - activate_injected_dep(CStore::from_tcx(tcx).injected_panic_runtime(), &mut ret, - &|cnum| tcx.is_panic_runtime(cnum)); + activate_injected_dep(CStore::from_tcx(tcx).injected_panic_runtime(), &mut ret, &|cnum| { + tcx.is_panic_runtime(cnum) + }); // When dylib B links to dylib A, then when using B we must also link to A. // It could be the case, however, that the rlib for A is present (hence we @@ -199,8 +220,7 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: config::CrateType) -> DependencyList { let cnum = CrateNum::new(cnum + 1); let src = tcx.used_crate_source(cnum); match *kind { - Linkage::NotLinked | - Linkage::IncludedFromDylib => {} + Linkage::NotLinked | Linkage::IncludedFromDylib => {} Linkage::Static if src.rlib.is_some() => continue, Linkage::Dynamic if src.dylib.is_some() => continue, kind => { @@ -208,9 +228,12 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: config::CrateType) -> DependencyList { Linkage::Static => "rlib", _ => "dylib", }; - sess.err(&format!("crate `{}` required to be available in {} format, \ + sess.err(&format!( + "crate `{}` required to be available in {} format, \ but was not found in this form", - tcx.crate_name(cnum), kind)); + tcx.crate_name(cnum), + kind + )); } } } @@ -234,39 +257,50 @@ fn add_library( // This error is probably a little obscure, but I imagine that it // can be refined over time. if link2 != link || link == RequireStatic { - tcx.sess.struct_err(&format!("cannot satisfy dependencies so `{}` only \ - shows up once", tcx.crate_name(cnum))) - .help("having upstream crates all available in one format \ - will likely make this go away") + tcx.sess + .struct_err(&format!( + "cannot satisfy dependencies so `{}` only \ + shows up once", + tcx.crate_name(cnum) + )) + .help( + "having upstream crates all available in one format \ + will likely make this go away", + ) .emit(); } } - None => { m.insert(cnum, link); } + None => { + m.insert(cnum, link); + } } } fn attempt_static(tcx: TyCtxt<'_>) -> Option { let crates = cstore::used_crates(tcx, RequireStatic); if !crates.iter().by_ref().all(|&(_, ref p)| p.is_some()) { - return None + return None; } // All crates are available in an rlib format, so we're just going to link // everything in explicitly so long as it's actually required. let last_crate = tcx.crates().len(); - let mut ret = (1..last_crate+1).map(|cnum| { - if tcx.dep_kind(CrateNum::new(cnum)) == DepKind::Explicit { - Linkage::Static - } else { - Linkage::NotLinked - } - }).collect::>(); + let mut ret = (1..last_crate + 1) + .map(|cnum| { + if tcx.dep_kind(CrateNum::new(cnum)) == DepKind::Explicit { + Linkage::Static + } else { + Linkage::NotLinked + } + }) + .collect::>(); // Our allocator/panic runtime may not have been linked above if it wasn't // explicitly linked, which is the case for any injected dependency. Handle // that here and activate them. - activate_injected_dep(CStore::from_tcx(tcx).injected_panic_runtime(), &mut ret, - &|cnum| tcx.is_panic_runtime(cnum)); + activate_injected_dep(CStore::from_tcx(tcx).injected_panic_runtime(), &mut ret, &|cnum| { + tcx.is_panic_runtime(cnum) + }); Some(ret) } @@ -280,16 +314,18 @@ fn attempt_static(tcx: TyCtxt<'_>) -> Option { // a required dependency) in one of the session's field. If this field is not // set then this compilation doesn't actually need the dependency and we can // also skip this step entirely. -fn activate_injected_dep(injected: Option, - list: &mut DependencyList, - replaces_injected: &dyn Fn(CrateNum) -> bool) { +fn activate_injected_dep( + injected: Option, + list: &mut DependencyList, + replaces_injected: &dyn Fn(CrateNum) -> bool, +) { for (i, slot) in list.iter().enumerate() { let cnum = CrateNum::new(i + 1); if !replaces_injected(cnum) { - continue + continue; } if *slot != Linkage::NotLinked { - return + return; } } if let Some(injected) = injected { @@ -304,12 +340,12 @@ fn activate_injected_dep(injected: Option, fn verify_ok(tcx: TyCtxt<'_>, list: &[Linkage]) { let sess = &tcx.sess; if list.len() == 0 { - return + return; } let mut panic_runtime = None; for (i, linkage) in list.iter().enumerate() { if let Linkage::NotLinked = *linkage { - continue + continue; } let cnum = CrateNum::new(i + 1); @@ -317,9 +353,11 @@ fn verify_ok(tcx: TyCtxt<'_>, list: &[Linkage]) { if let Some((prev, _)) = panic_runtime { let prev_name = tcx.crate_name(prev); let cur_name = tcx.crate_name(cnum); - sess.err(&format!("cannot link together two \ + sess.err(&format!( + "cannot link together two \ panic runtimes: {} and {}", - prev_name, cur_name)); + prev_name, cur_name + )); } panic_runtime = Some((cnum, tcx.panic_strategy(cnum))); } @@ -334,11 +372,13 @@ fn verify_ok(tcx: TyCtxt<'_>, list: &[Linkage]) { // First up, validate that our selected panic runtime is indeed exactly // our same strategy. if found_strategy != desired_strategy { - sess.err(&format!("the linked panic runtime `{}` is \ + sess.err(&format!( + "the linked panic runtime `{}` is \ not compiled with this crate's \ panic strategy `{}`", - tcx.crate_name(cnum), - desired_strategy.desc())); + tcx.crate_name(cnum), + desired_strategy.desc() + )); } // Next up, verify that all other crates are compatible with this panic @@ -347,25 +387,27 @@ fn verify_ok(tcx: TyCtxt<'_>, list: &[Linkage]) { // panic strategy must match our own. for (i, linkage) in list.iter().enumerate() { if let Linkage::NotLinked = *linkage { - continue + continue; } if desired_strategy == PanicStrategy::Abort { - continue + continue; } let cnum = CrateNum::new(i + 1); let found_strategy = tcx.panic_strategy(cnum); let is_compiler_builtins = tcx.is_compiler_builtins(cnum); if is_compiler_builtins || desired_strategy == found_strategy { - continue + continue; } - sess.err(&format!("the crate `{}` is compiled with the \ + sess.err(&format!( + "the crate `{}` is compiled with the \ panic strategy `{}` which is \ incompatible with this crate's \ strategy of `{}`", - tcx.crate_name(cnum), - found_strategy.desc(), - desired_strategy.desc())); + tcx.crate_name(cnum), + found_strategy.desc(), + desired_strategy.desc() + )); } } } diff --git a/src/librustc_metadata/dynamic_lib.rs b/src/librustc_metadata/dynamic_lib.rs index 3871eb89f7..f04d0239d4 100644 --- a/src/librustc_metadata/dynamic_lib.rs +++ b/src/librustc_metadata/dynamic_lib.rs @@ -6,14 +6,12 @@ use std::ffi::CString; use std::path::Path; pub struct DynamicLibrary { - handle: *mut u8 + handle: *mut u8, } impl Drop for DynamicLibrary { fn drop(&mut self) { - unsafe { - dl::close(self.handle) - } + unsafe { dl::close(self.handle) } } } @@ -28,7 +26,7 @@ impl DynamicLibrary { // run. match maybe_library { Err(err) => Err(err), - Ok(handle) => Ok(DynamicLibrary { handle }) + Ok(handle) => Ok(DynamicLibrary { handle }), } } @@ -44,7 +42,7 @@ impl DynamicLibrary { // the destructor does not run. match maybe_symbol_value { Err(err) => Err(err), - Ok(symbol_value) => Ok(symbol_value as *mut T) + Ok(symbol_value) => Ok(symbol_value as *mut T), } } } @@ -54,18 +52,16 @@ mod tests; #[cfg(unix)] mod dl { - use std::ffi::{CStr, OsStr, CString}; + use std::ffi::{CStr, CString, OsStr}; use std::os::unix::prelude::*; use std::ptr; use std::str; pub(super) fn open(filename: Option<&OsStr>) -> Result<*mut u8, String> { - check_for_errors_in(|| { - unsafe { - match filename { - Some(filename) => open_external(filename), - None => open_internal(), - } + check_for_errors_in(|| unsafe { + match filename { + Some(filename) => open_external(filename), + None => open_internal(), } }) } @@ -80,7 +76,8 @@ mod dl { } fn check_for_errors_in(f: F) -> Result - where F: FnOnce() -> T, + where + F: FnOnce() -> T, { use std::sync::{Mutex, Once}; static INIT: Once = Once::new(); @@ -112,12 +109,11 @@ mod dl { handle: *mut u8, symbol: *const libc::c_char, ) -> Result<*mut u8, String> { - check_for_errors_in(|| { - libc::dlsym(handle as *mut libc::c_void, symbol) as *mut u8 - }) + check_for_errors_in(|| libc::dlsym(handle as *mut libc::c_void, symbol) as *mut u8) } + pub(super) unsafe fn close(handle: *mut u8) { - libc::dlclose(handle as *mut libc::c_void); () + libc::dlclose(handle as *mut libc::c_void); } } @@ -128,54 +124,32 @@ mod dl { use std::os::windows::prelude::*; use std::ptr; - use libc::{c_uint, c_void, c_char}; - - type DWORD = u32; - type HMODULE = *mut u8; - type BOOL = i32; - type LPCWSTR = *const u16; - type LPCSTR = *const i8; - - extern "system" { - fn SetThreadErrorMode(dwNewMode: DWORD, - lpOldMode: *mut DWORD) -> c_uint; - fn LoadLibraryW(name: LPCWSTR) -> HMODULE; - fn GetModuleHandleExW(dwFlags: DWORD, - name: LPCWSTR, - handle: *mut HMODULE) -> BOOL; - fn GetProcAddress(handle: HMODULE, - name: LPCSTR) -> *mut c_void; - fn FreeLibrary(handle: HMODULE) -> BOOL; - } + use winapi::shared::minwindef::HMODULE; + use winapi::um::errhandlingapi::SetThreadErrorMode; + use winapi::um::libloaderapi::{FreeLibrary, GetModuleHandleExW, GetProcAddress, LoadLibraryW}; + use winapi::um::winbase::SEM_FAILCRITICALERRORS; pub(super) fn open(filename: Option<&OsStr>) -> Result<*mut u8, String> { // disable "dll load failed" error dialog. let prev_error_mode = unsafe { - // SEM_FAILCRITICALERRORS 0x01 - let new_error_mode = 1; + let new_error_mode = SEM_FAILCRITICALERRORS; let mut prev_error_mode = 0; - let result = SetThreadErrorMode(new_error_mode, - &mut prev_error_mode); + let result = SetThreadErrorMode(new_error_mode, &mut prev_error_mode); if result == 0 { - return Err(io::Error::last_os_error().to_string()) + return Err(io::Error::last_os_error().to_string()); } prev_error_mode }; let result = match filename { Some(filename) => { - let filename_str: Vec<_> = - filename.encode_wide().chain(Some(0)).collect(); - let result = unsafe { - LoadLibraryW(filename_str.as_ptr()) - }; + let filename_str: Vec<_> = filename.encode_wide().chain(Some(0)).collect(); + let result = unsafe { LoadLibraryW(filename_str.as_ptr()) } as *mut u8; ptr_result(result) } None => { let mut handle = ptr::null_mut(); - let succeeded = unsafe { - GetModuleHandleExW(0 as DWORD, ptr::null(), &mut handle) - }; + let succeeded = unsafe { GetModuleHandleExW(0, ptr::null(), &mut handle) }; if succeeded == 0 { Err(io::Error::last_os_error().to_string()) } else { @@ -193,7 +167,7 @@ mod dl { pub(super) unsafe fn symbol( handle: *mut u8, - symbol: *const c_char, + symbol: *const libc::c_char, ) -> Result<*mut u8, String> { let ptr = GetProcAddress(handle as HMODULE, symbol) as *mut u8; ptr_result(ptr) @@ -204,10 +178,6 @@ mod dl { } fn ptr_result(ptr: *mut T) -> Result<*mut T, String> { - if ptr.is_null() { - Err(io::Error::last_os_error().to_string()) - } else { - Ok(ptr) - } + if ptr.is_null() { Err(io::Error::last_os_error().to_string()) } else { Ok(ptr) } } } diff --git a/src/librustc_metadata/dynamic_lib/tests.rs b/src/librustc_metadata/dynamic_lib/tests.rs index b2302f2f1b..cbf2b181e3 100644 --- a/src/librustc_metadata/dynamic_lib/tests.rs +++ b/src/librustc_metadata/dynamic_lib/tests.rs @@ -4,19 +4,19 @@ use std::mem; #[test] fn test_loading_atoi() { if cfg!(windows) { - return + return; } // The C library does not need to be loaded since it is already linked in let lib = match DynamicLibrary::open(None) { Err(error) => panic!("Could not load self as module: {}", error), - Ok(lib) => lib + Ok(lib) => lib, }; - let atoi: extern fn(*const libc::c_char) -> libc::c_int = unsafe { + let atoi: extern "C" fn(*const libc::c_char) -> libc::c_int = unsafe { match lib.symbol("atoi") { Err(error) => panic!("Could not load function atoi: {}", error), - Ok(atoi) => mem::transmute::<*mut u8, _>(atoi) + Ok(atoi) => mem::transmute::<*mut u8, _>(atoi), } }; @@ -24,8 +24,7 @@ fn test_loading_atoi() { let expected_result = 0x52757374; let result = atoi(argument.as_ptr()); if result != expected_result { - panic!("atoi({:?}) != {} but equaled {} instead", argument, - expected_result, result) + panic!("atoi({:?}) != {} but equaled {} instead", argument, expected_result, result) } } @@ -34,7 +33,7 @@ fn test_errors_do_not_crash() { use std::path::Path; if !cfg!(unix) { - return + return; } // Open /dev/null as a library to get an error, and make sure @@ -42,6 +41,6 @@ fn test_errors_do_not_crash() { let path = Path::new("/dev/null"); match DynamicLibrary::open(Some(&path)) { Err(_) => {} - Ok(_) => panic!("Successfully opened the empty library.") + Ok(_) => panic!("Successfully opened the empty library."), } } diff --git a/src/librustc_metadata/foreign_modules.rs b/src/librustc_metadata/foreign_modules.rs index fa1402584e..fc988ec15c 100644 --- a/src/librustc_metadata/foreign_modules.rs +++ b/src/librustc_metadata/foreign_modules.rs @@ -1,13 +1,10 @@ -use rustc::hir::itemlikevisit::ItemLikeVisitor; -use rustc::hir; use rustc::middle::cstore::ForeignModule; use rustc::ty::TyCtxt; +use rustc_hir as hir; +use rustc_hir::itemlikevisit::ItemLikeVisitor; crate fn collect(tcx: TyCtxt<'_>) -> Vec { - let mut collector = Collector { - tcx, - modules: Vec::new(), - }; + let mut collector = Collector { tcx, modules: Vec::new() }; tcx.hir().krate().visit_all_item_likes(&mut collector); return collector.modules; } @@ -18,21 +15,18 @@ struct Collector<'tcx> { } impl ItemLikeVisitor<'tcx> for Collector<'tcx> { - fn visit_item(&mut self, it: &'tcx hir::Item) { + fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) { let fm = match it.kind { hir::ItemKind::ForeignMod(ref fm) => fm, _ => return, }; - let foreign_items = fm.items.iter() - .map(|it| self.tcx.hir().local_def_id(it.hir_id)) - .collect(); - self.modules.push(ForeignModule { - foreign_items, - def_id: self.tcx.hir().local_def_id(it.hir_id), - }); + let foreign_items = + fm.items.iter().map(|it| self.tcx.hir().local_def_id(it.hir_id)).collect(); + self.modules + .push(ForeignModule { foreign_items, def_id: self.tcx.hir().local_def_id(it.hir_id) }); } - fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem) {} - fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem) {} + fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {} + fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem<'tcx>) {} } diff --git a/src/librustc_metadata/lib.rs b/src/librustc_metadata/lib.rs index aaaff7e3b0..cf925ab918 100644 --- a/src/librustc_metadata/lib.rs +++ b/src/librustc_metadata/lib.rs @@ -1,5 +1,4 @@ #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")] - #![feature(bool_to_option)] #![feature(box_patterns)] #![feature(core_intrinsics)] @@ -11,11 +10,10 @@ #![feature(proc_macro_internals)] #![feature(proc_macro_quote)] #![feature(rustc_private)] -#![feature(slice_patterns)] +#![cfg_attr(bootstrap, feature(slice_patterns))] #![feature(specialization)] #![feature(stmt_expr_attributes)] - -#![recursion_limit="256"] +#![recursion_limit = "256"] extern crate libc; extern crate proc_macro; @@ -40,7 +38,7 @@ pub mod locator; pub fn validate_crate_name( sess: Option<&rustc::session::Session>, s: &str, - sp: Option + sp: Option, ) { let mut err_count = 0; { @@ -56,8 +54,12 @@ pub fn validate_crate_name( say("crate name must not be empty"); } for c in s.chars() { - if c.is_alphanumeric() { continue } - if c == '_' { continue } + if c.is_alphanumeric() { + continue; + } + if c == '_' { + continue; + } say(&format!("invalid character `{}` in crate name: `{}`", c, s)); } } diff --git a/src/librustc_metadata/link_args.rs b/src/librustc_metadata/link_args.rs index b40d58a681..8d018b9bb9 100644 --- a/src/librustc_metadata/link_args.rs +++ b/src/librustc_metadata/link_args.rs @@ -1,13 +1,11 @@ -use rustc::hir::itemlikevisit::ItemLikeVisitor; -use rustc::hir; use rustc::ty::TyCtxt; +use rustc_hir as hir; +use rustc_hir::itemlikevisit::ItemLikeVisitor; +use rustc_span::symbol::sym; use rustc_target::spec::abi::Abi; -use syntax::symbol::sym; crate fn collect(tcx: TyCtxt<'_>) -> Vec { - let mut collector = Collector { - args: Vec::new(), - }; + let mut collector = Collector { args: Vec::new() }; tcx.hir().krate().visit_all_item_likes(&mut collector); for attr in tcx.hir().krate().attrs.iter() { @@ -26,15 +24,13 @@ struct Collector { } impl<'tcx> ItemLikeVisitor<'tcx> for Collector { - fn visit_item(&mut self, it: &'tcx hir::Item) { + fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) { let fm = match it.kind { hir::ItemKind::ForeignMod(ref fm) => fm, _ => return, }; - if fm.abi == Abi::Rust || - fm.abi == Abi::RustIntrinsic || - fm.abi == Abi::PlatformIntrinsic { - return + if fm.abi == Abi::Rust || fm.abi == Abi::RustIntrinsic || fm.abi == Abi::PlatformIntrinsic { + return; } // First, add all of the custom #[link_args] attributes @@ -45,8 +41,8 @@ impl<'tcx> ItemLikeVisitor<'tcx> for Collector { } } - fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem) {} - fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem) {} + fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {} + fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem<'tcx>) {} } impl Collector { diff --git a/src/librustc_metadata/locator.rs b/src/librustc_metadata/locator.rs index 8a1eeea025..2157b8ce15 100644 --- a/src/librustc_metadata/locator.rs +++ b/src/librustc_metadata/locator.rs @@ -213,22 +213,18 @@ //! metadata::locator or metadata::creader for all the juicy details! use crate::creader::Library; -use crate::rmeta::{METADATA_HEADER, rustc_version, MetadataBlob}; +use crate::rmeta::{rustc_version, MetadataBlob, METADATA_HEADER}; -use rustc_data_structures::fx::FxHashSet; -use rustc_data_structures::svh::Svh; -use rustc_data_structures::sync::MetadataRef; use rustc::middle::cstore::{CrateSource, MetadataLoader}; -use rustc::session::{config, Session, CrateDisambiguator}; -use rustc::session::filesearch::{FileSearch, FileMatches, FileDoesntMatch}; +use rustc::session::filesearch::{FileDoesntMatch, FileMatches, FileSearch}; use rustc::session::search_paths::PathKind; -use rustc::util::nodemap::FxHashMap; - -use errors::DiagnosticBuilder; -use syntax::{span_err, span_fatal}; -use syntax::symbol::{Symbol, sym}; -use syntax::struct_span_err; -use syntax_pos::Span; +use rustc::session::{config, CrateDisambiguator, Session}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::svh::Svh; +use rustc_data_structures::sync::MetadataRef; +use rustc_errors::{struct_span_err, DiagnosticBuilder}; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; use rustc_target::spec::{Target, TargetTriple}; use std::cmp; @@ -245,8 +241,6 @@ use rustc_data_structures::owning_ref::OwningRef; use log::{debug, info, warn}; -use rustc_error_codes::*; - #[derive(Clone)] struct CrateMismatch { path: PathBuf, @@ -327,10 +321,14 @@ impl<'a> CrateLocator<'a> { metadata_loader, crate_name, exact_paths: if hash.is_none() { - sess.opts.externs.get(&crate_name.as_str()).into_iter() + sess.opts + .externs + .get(&crate_name.as_str()) + .into_iter() .filter_map(|entry| entry.files()) .flatten() - .map(|location| PathBuf::from(location)).collect() + .map(|location| PathBuf::from(location)) + .collect() } else { // SVH being specified means this is a transitive dependency, // so `--extern` options do not apply. @@ -375,9 +373,10 @@ impl<'a> CrateLocator<'a> { } let mut seen_paths = FxHashSet::default(); match self.extra_filename { - Some(s) => self.find_library_crate(s, &mut seen_paths) + Some(s) => self + .find_library_crate(s, &mut seen_paths) .or_else(|| self.find_library_crate("", &mut seen_paths)), - None => self.find_library_crate("", &mut seen_paths) + None => self.find_library_crate("", &mut seen_paths), } } @@ -388,12 +387,14 @@ impl<'a> CrateLocator<'a> { }; let mut msg = "the following crate versions were found:".to_string(); let mut err = if !self.rejected_via_hash.is_empty() { - let mut err = struct_span_err!(self.sess, - self.span, - E0460, - "found possibly newer version of crate `{}`{}", - self.crate_name, - add); + let mut err = struct_span_err!( + self.sess, + self.span, + E0460, + "found possibly newer version of crate `{}`{}", + self.crate_name, + add + ); err.note("perhaps that crate needs to be recompiled?"); let mismatches = self.rejected_via_hash.iter(); for &CrateMismatch { ref path, .. } in mismatches { @@ -410,30 +411,36 @@ impl<'a> CrateLocator<'a> { err.note(&msg); err } else if !self.rejected_via_triple.is_empty() { - let mut err = struct_span_err!(self.sess, - self.span, - E0461, - "couldn't find crate `{}` \ + let mut err = struct_span_err!( + self.sess, + self.span, + E0461, + "couldn't find crate `{}` \ with expected target triple {}{}", - self.crate_name, - self.triple, - add); + self.crate_name, + self.triple, + add + ); let mismatches = self.rejected_via_triple.iter(); for &CrateMismatch { ref path, ref got } in mismatches { - msg.push_str(&format!("\ncrate `{}`, target triple {}: {}", - self.crate_name, - got, - path.display())); + msg.push_str(&format!( + "\ncrate `{}`, target triple {}: {}", + self.crate_name, + got, + path.display() + )); } err.note(&msg); err } else if !self.rejected_via_kind.is_empty() { - let mut err = struct_span_err!(self.sess, - self.span, - E0462, - "found staticlib `{}` instead of rlib or dylib{}", - self.crate_name, - add); + let mut err = struct_span_err!( + self.sess, + self.span, + E0462, + "found staticlib `{}` instead of rlib or dylib{}", + self.crate_name, + add + ); err.help("please recompile that crate using --crate-type lib"); let mismatches = self.rejected_via_kind.iter(); for &CrateMismatch { ref path, .. } in mismatches { @@ -442,34 +449,43 @@ impl<'a> CrateLocator<'a> { err.note(&msg); err } else if !self.rejected_via_version.is_empty() { - let mut err = struct_span_err!(self.sess, - self.span, - E0514, - "found crate `{}` compiled by an incompatible version \ + let mut err = struct_span_err!( + self.sess, + self.span, + E0514, + "found crate `{}` compiled by an incompatible version \ of rustc{}", - self.crate_name, - add); - err.help(&format!("please recompile that crate using this compiler ({})", - rustc_version())); + self.crate_name, + add + ); + err.help(&format!( + "please recompile that crate using this compiler ({})", + rustc_version() + )); let mismatches = self.rejected_via_version.iter(); for &CrateMismatch { ref path, ref got } in mismatches { - msg.push_str(&format!("\ncrate `{}` compiled by {}: {}", - self.crate_name, - got, - path.display())); + msg.push_str(&format!( + "\ncrate `{}` compiled by {}: {}", + self.crate_name, + got, + path.display() + )); } err.note(&msg); err } else { - let mut err = struct_span_err!(self.sess, - self.span, - E0463, - "can't find crate for `{}`{}", - self.crate_name, - add); + let mut err = struct_span_err!( + self.sess, + self.span, + E0463, + "can't find crate for `{}`{}", + self.crate_name, + add + ); if (self.crate_name == sym::std || self.crate_name == sym::core) - && self.triple != TargetTriple::from_triple(config::host_triple()) { + && self.triple != TargetTriple::from_triple(config::host_triple()) + { err.note(&format!("the `{}` target may not be installed", self.triple)); } err.span_label(self.span, "can't find crate"); @@ -480,12 +496,15 @@ impl<'a> CrateLocator<'a> { let dylibname = self.dylibname(); let mismatches = self.rejected_via_filename.iter(); for &CrateMismatch { ref path, .. } in mismatches { - err.note(&format!("extern location for {} is of an unknown type: {}", - self.crate_name, - path.display())) - .help(&format!("file name should be lib*.rlib or {}*.{}", - dylibname.0, - dylibname.1)); + err.note(&format!( + "extern location for {} is of an unknown type: {}", + self.crate_name, + path.display() + )) + .help(&format!( + "file name should be lib*.rlib or {}*.{}", + dylibname.0, dylibname.1 + )); } } @@ -494,10 +513,11 @@ impl<'a> CrateLocator<'a> { unreachable!(); } - fn find_library_crate(&mut self, - extra_prefix: &str, - seen_paths: &mut FxHashSet) - -> Option { + fn find_library_crate( + &mut self, + extra_prefix: &str, + seen_paths: &mut FxHashSet, + ) -> Option { let dypair = self.dylibname(); let staticpair = self.staticlibname(); @@ -506,10 +526,8 @@ impl<'a> CrateLocator<'a> { let rlib_prefix = format!("lib{}{}", self.crate_name, extra_prefix); let staticlib_prefix = format!("{}{}{}", staticpair.0, self.crate_name, extra_prefix); - let mut candidates: FxHashMap< - _, - (FxHashMap<_, _>, FxHashMap<_, _>, FxHashMap<_, _>), - > = Default::default(); + let mut candidates: FxHashMap<_, (FxHashMap<_, _>, FxHashMap<_, _>, FxHashMap<_, _>)> = + Default::default(); let mut staticlibs = vec![]; // First, find all possible candidate rlibs and dylibs purely based on @@ -530,23 +548,21 @@ impl<'a> CrateLocator<'a> { None => return FileDoesntMatch, Some(file) => file, }; - let (hash, found_kind) = - if file.starts_with(&rlib_prefix) && file.ends_with(".rlib") { - (&file[(rlib_prefix.len())..(file.len() - ".rlib".len())], CrateFlavor::Rlib) - } else if file.starts_with(&rlib_prefix) && file.ends_with(".rmeta") { - (&file[(rlib_prefix.len())..(file.len() - ".rmeta".len())], CrateFlavor::Rmeta) - } else if file.starts_with(&dylib_prefix) && - file.ends_with(&dypair.1) { - (&file[(dylib_prefix.len())..(file.len() - dypair.1.len())], CrateFlavor::Dylib) - } else { - if file.starts_with(&staticlib_prefix) && file.ends_with(&staticpair.1) { - staticlibs.push(CrateMismatch { - path: path.to_path_buf(), - got: "static".to_string(), - }); - } - return FileDoesntMatch; - }; + let (hash, found_kind) = if file.starts_with(&rlib_prefix) && file.ends_with(".rlib") { + (&file[(rlib_prefix.len())..(file.len() - ".rlib".len())], CrateFlavor::Rlib) + } else if file.starts_with(&rlib_prefix) && file.ends_with(".rmeta") { + (&file[(rlib_prefix.len())..(file.len() - ".rmeta".len())], CrateFlavor::Rmeta) + } else if file.starts_with(&dylib_prefix) && file.ends_with(&dypair.1) { + (&file[(dylib_prefix.len())..(file.len() - dypair.1.len())], CrateFlavor::Dylib) + } else { + if file.starts_with(&staticlib_prefix) && file.ends_with(&staticpair.1) { + staticlibs.push(CrateMismatch { + path: path.to_path_buf(), + got: "static".to_string(), + }); + } + return FileDoesntMatch; + }; info!("lib candidate: {}", path.display()); @@ -556,13 +572,19 @@ impl<'a> CrateLocator<'a> { fs::canonicalize(path) .map(|p| { if seen_paths.contains(&p) { - return FileDoesntMatch + return FileDoesntMatch; }; seen_paths.insert(p.clone()); match found_kind { - CrateFlavor::Rlib => { rlibs.insert(p, kind); } - CrateFlavor::Rmeta => { rmetas.insert(p, kind); } - CrateFlavor::Dylib => { dylibs.insert(p, kind); } + CrateFlavor::Rlib => { + rlibs.insert(p, kind); + } + CrateFlavor::Rmeta => { + rmetas.insert(p, kind); + } + CrateFlavor::Dylib => { + dylibs.insert(p, kind); + } } FileMatches }) @@ -592,27 +614,32 @@ impl<'a> CrateLocator<'a> { 0 => None, 1 => Some(libraries.into_iter().next().unwrap().1), _ => { - let mut err = struct_span_err!(self.sess, - self.span, - E0464, - "multiple matching crates for `{}`", - self.crate_name); - let candidates = libraries.iter().filter_map(|(_, lib)| { - let crate_name = &lib.metadata.get_root().name().as_str(); - match &(&lib.source.dylib, &lib.source.rlib) { - &(&Some((ref pd, _)), &Some((ref pr, _))) => { - Some(format!("\ncrate `{}`: {}\n{:>padding$}", - crate_name, - pd.display(), - pr.display(), - padding=8 + crate_name.len())) + let mut err = struct_span_err!( + self.sess, + self.span, + E0464, + "multiple matching crates for `{}`", + self.crate_name + ); + let candidates = libraries + .iter() + .filter_map(|(_, lib)| { + let crate_name = &lib.metadata.get_root().name().as_str(); + match &(&lib.source.dylib, &lib.source.rlib) { + &(&Some((ref pd, _)), &Some((ref pr, _))) => Some(format!( + "\ncrate `{}`: {}\n{:>padding$}", + crate_name, + pd.display(), + pr.display(), + padding = 8 + crate_name.len() + )), + &(&Some((ref p, _)), &None) | &(&None, &Some((ref p, _))) => { + Some(format!("\ncrate `{}`: {}", crate_name, p.display())) + } + &(&None, &None) => None, } - &(&Some((ref p, _)), &None) | &(&None, &Some((ref p, _))) => { - Some(format!("\ncrate `{}`: {}", crate_name, p.display())) - } - &(&None, &None) => None, - } - }).collect::(); + }) + .collect::(); err.note(&format!("candidates:{}", candidates)); err.emit(); None @@ -627,14 +654,36 @@ impl<'a> CrateLocator<'a> { dylibs: FxHashMap, ) -> Option<(Svh, Library)> { let mut slot = None; + // Order here matters, rmeta should come first. See comment in + // `extract_one` below. let source = CrateSource { - rlib: self.extract_one(rlibs, CrateFlavor::Rlib, &mut slot), rmeta: self.extract_one(rmetas, CrateFlavor::Rmeta, &mut slot), + rlib: self.extract_one(rlibs, CrateFlavor::Rlib, &mut slot), dylib: self.extract_one(dylibs, CrateFlavor::Dylib, &mut slot), }; slot.map(|(svh, metadata)| (svh, Library { source, metadata })) } + fn needs_crate_flavor(&self, flavor: CrateFlavor) -> bool { + if flavor == CrateFlavor::Dylib && self.is_proc_macro == Some(true) { + return true; + } + + // The all loop is because `--crate-type=rlib --crate-type=rlib` is + // legal and produces both inside this type. + let is_rlib = self.sess.crate_types.borrow().iter().all(|c| *c == config::CrateType::Rlib); + let needs_object_code = self.sess.opts.output_types.should_codegen(); + // If we're producing an rlib, then we don't need object code. + // Or, if we're not producing object code, then we don't need it either + // (e.g., if we're a cdylib but emitting just metadata). + if is_rlib || !needs_object_code { + flavor == CrateFlavor::Rmeta + } else { + // we need all flavors (perhaps not true, but what we do for now) + true + } + } + // Attempts to extract *one* library from the set `m`. If the set has no // elements, `None` is returned. If the set has more than one element, then // the errors and notes are emitted about the set of libraries. @@ -643,20 +692,31 @@ impl<'a> CrateLocator<'a> { // read the metadata from it if `*slot` is `None`. If the metadata couldn't // be read, it is assumed that the file isn't a valid rust library (no // errors are emitted). - fn extract_one(&mut self, - m: FxHashMap, - flavor: CrateFlavor, - slot: &mut Option<(Svh, MetadataBlob)>) - -> Option<(PathBuf, PathKind)> { + fn extract_one( + &mut self, + m: FxHashMap, + flavor: CrateFlavor, + slot: &mut Option<(Svh, MetadataBlob)>, + ) -> Option<(PathBuf, PathKind)> { let mut ret: Option<(PathBuf, PathKind)> = None; let mut error = 0; + // If we are producing an rlib, and we've already loaded metadata, then + // we should not attempt to discover further crate sources (unless we're + // locating a proc macro; exact logic is in needs_crate_flavor). This means + // that under -Zbinary-dep-depinfo we will not emit a dependency edge on + // the *unused* rlib, and by returning `None` here immediately we + // guarantee that we do indeed not use it. + // + // See also #68149 which provides more detail on why emitting the + // dependency on the rlib is a bad thing. + // + // We currenty do not verify that these other sources are even in sync, + // and this is arguably a bug (see #10786), but because reading metadata + // is quite slow (especially from dylibs) we currently do not read it + // from the other crate sources. if slot.is_some() { - // FIXME(#10786): for an optimization, we only read one of the - // libraries' metadata sections. In theory we should - // read both, but reading dylib metadata is quite - // slow. - if m.is_empty() { + if m.is_empty() || !self.needs_crate_flavor(flavor) { return None; } else if m.len() == 1 { return Some(m.into_iter().next().unwrap()); @@ -683,18 +743,18 @@ impl<'a> CrateLocator<'a> { }; // If we see multiple hashes, emit an error about duplicate candidates. if slot.as_ref().map_or(false, |s| s.0 != hash) { - let mut e = struct_span_err!(self.sess, - self.span, - E0465, - "multiple {} candidates for `{}` found", - flavor, - self.crate_name); - e.span_note(self.span, - &format!(r"candidate #1: {}", - ret.as_ref() - .unwrap() - .0 - .display())); + let mut e = struct_span_err!( + self.sess, + self.span, + E0465, + "multiple {} candidates for `{}` found", + flavor, + self.crate_name + ); + e.span_note( + self.span, + &format!(r"candidate #1: {}", ret.as_ref().unwrap().0.display()), + ); if let Some(ref mut e) = err { e.emit(); } @@ -704,10 +764,9 @@ impl<'a> CrateLocator<'a> { } if error > 0 { error += 1; - err.as_mut().unwrap().span_note(self.span, - &format!(r"candidate #{}: {}", - error, - lib.display())); + err.as_mut() + .unwrap() + .span_note(self.span, &format!(r"candidate #{}: {}", error, lib.display())); continue; } @@ -732,10 +791,9 @@ impl<'a> CrateLocator<'a> { // as well. if let Some((ref prev, _)) = ret { let sysroot = &self.sess.sysroot; - let sysroot = sysroot.canonicalize() - .unwrap_or_else(|_| sysroot.to_path_buf()); + let sysroot = sysroot.canonicalize().unwrap_or_else(|_| sysroot.to_path_buf()); if prev.starts_with(&sysroot) { - continue + continue; } } *slot = Some((hash, metadata)); @@ -754,13 +812,9 @@ impl<'a> CrateLocator<'a> { let rustc_version = rustc_version(); let found_version = metadata.get_rustc_version(); if found_version != rustc_version { - info!("Rejecting via version: expected {} got {}", - rustc_version, - found_version); - self.rejected_via_version.push(CrateMismatch { - path: libpath.to_path_buf(), - got: found_version, - }); + info!("Rejecting via version: expected {} got {}", rustc_version, found_version); + self.rejected_via_version + .push(CrateMismatch { path: libpath.to_path_buf(), got: found_version }); return None; } @@ -768,8 +822,10 @@ impl<'a> CrateLocator<'a> { if let Some(expected_is_proc_macro) = self.is_proc_macro { let is_proc_macro = root.is_proc_macro_crate(); if is_proc_macro != expected_is_proc_macro { - info!("Rejecting via proc macro: expected {} got {}", - expected_is_proc_macro, is_proc_macro); + info!( + "Rejecting via proc macro: expected {} got {}", + expected_is_proc_macro, is_proc_macro + ); return None; } } @@ -782,9 +838,7 @@ impl<'a> CrateLocator<'a> { } if root.triple() != &self.triple { - info!("Rejecting via crate triple: expected {} got {}", - self.triple, - root.triple()); + info!("Rejecting via crate triple: expected {} got {}", self.triple, root.triple()); self.rejected_via_triple.push(CrateMismatch { path: libpath.to_path_buf(), got: root.triple().to_string(), @@ -796,10 +850,8 @@ impl<'a> CrateLocator<'a> { if let Some(expected_hash) = self.hash { if hash != expected_hash { info!("Rejecting via hash: expected {} got {}", expected_hash, hash); - self.rejected_via_hash.push(CrateMismatch { - path: libpath.to_path_buf(), - got: hash.to_string(), - }); + self.rejected_via_hash + .push(CrateMismatch { path: libpath.to_path_buf(), got: hash.to_string() }); return None; } } @@ -807,7 +859,6 @@ impl<'a> CrateLocator<'a> { Some(hash) } - // Returns the corresponding (prefix, suffix) that files need to have for // dynamic libraries fn dylibname(&self) -> (String, String) { @@ -832,26 +883,30 @@ impl<'a> CrateLocator<'a> { let mut rmetas = FxHashMap::default(); let mut dylibs = FxHashMap::default(); { - let crate_name = self.crate_name; - let rejected_via_filename = &mut self.rejected_via_filename; - let locs = self.exact_paths.iter().filter(|loc| { + let crate_name = self.crate_name; + let rejected_via_filename = &mut self.rejected_via_filename; + let locs = self.exact_paths.iter().filter(|loc| { if !loc.exists() { - sess.err(&format!("extern location for {} does not exist: {}", - crate_name, - loc.display())); + sess.err(&format!( + "extern location for {} does not exist: {}", + crate_name, + loc.display() + )); return false; } let file = match loc.file_name().and_then(|s| s.to_str()) { Some(file) => file, None => { - sess.err(&format!("extern location for {} is not a file: {}", - crate_name, - loc.display())); + sess.err(&format!( + "extern location for {} is not a file: {}", + crate_name, + loc.display() + )); return false; } }; - if file.starts_with("lib") && - (file.ends_with(".rlib") || file.ends_with(".rmeta")) { + if file.starts_with("lib") && (file.ends_with(".rlib") || file.ends_with(".rmeta")) + { return true; } else { let (ref prefix, ref suffix) = dylibname; @@ -860,10 +915,8 @@ impl<'a> CrateLocator<'a> { } } - rejected_via_filename.push(CrateMismatch { - path: (*loc).clone(), - got: String::new(), - }); + rejected_via_filename + .push(CrateMismatch { path: (*loc).clone(), got: String::new() }); false }); @@ -887,16 +940,15 @@ impl<'a> CrateLocator<'a> { } // Just a small wrapper to time how long reading metadata takes. -fn get_metadata_section(target: &Target, - flavor: CrateFlavor, - filename: &Path, - loader: &dyn MetadataLoader) - -> Result { +fn get_metadata_section( + target: &Target, + flavor: CrateFlavor, + filename: &Path, + loader: &dyn MetadataLoader, +) -> Result { let start = Instant::now(); let ret = get_metadata_section_imp(target, flavor, filename, loader); - info!("reading {:?} => {:?}", - filename.file_name().unwrap(), - start.elapsed()); + info!("reading {:?} => {:?}", filename.file_name().unwrap(), start.elapsed()); return ret; } @@ -913,11 +965,12 @@ impl Deref for StableDerefMmap { unsafe impl stable_deref_trait::StableDeref for StableDerefMmap {} -fn get_metadata_section_imp(target: &Target, - flavor: CrateFlavor, - filename: &Path, - loader: &dyn MetadataLoader) - -> Result { +fn get_metadata_section_imp( + target: &Target, + flavor: CrateFlavor, + filename: &Path, + loader: &dyn MetadataLoader, +) -> Result { if !filename.exists() { return Err(format!("no such file: '{}'", filename.display())); } @@ -930,8 +983,10 @@ fn get_metadata_section_imp(target: &Target, debug!("checking {} bytes of metadata-version stamp", header_len); let header = &buf[..cmp::min(header_len, buf.len())]; if header != METADATA_HEADER { - return Err(format!("incompatible metadata version found: '{}'", - filename.display())); + return Err(format!( + "incompatible metadata version found: '{}'", + filename.display() + )); } // Header is okay -> inflate the actual metadata @@ -939,9 +994,7 @@ fn get_metadata_section_imp(target: &Target, debug!("inflating {} bytes of compressed metadata", compressed_bytes.len()); let mut inflated = Vec::new(); match DeflateDecoder::new(compressed_bytes).read_to_end(&mut inflated) { - Ok(_) => { - rustc_erase_owner!(OwningRef::new(inflated).map_owner_box()) - } + Ok(_) => rustc_erase_owner!(OwningRef::new(inflated).map_owner_box()), Err(_) => { return Err(format!("failed to decompress metadata: {}", filename.display())); } @@ -949,11 +1002,11 @@ fn get_metadata_section_imp(target: &Target, } CrateFlavor::Rmeta => { // mmap the file, because only a small fraction of it is read. - let file = std::fs::File::open(filename).map_err(|_| - format!("failed to open rmeta metadata: '{}'", filename.display()))?; + let file = std::fs::File::open(filename) + .map_err(|_| format!("failed to open rmeta metadata: '{}'", filename.display()))?; let mmap = unsafe { memmap::Mmap::map(&file) }; - let mmap = mmap.map_err(|_| - format!("failed to mmap rmeta metadata: '{}'", filename.display()))?; + let mmap = mmap + .map_err(|_| format!("failed to mmap rmeta metadata: '{}'", filename.display()))?; rustc_erase_owner!(OwningRef::new(StableDerefMmap(mmap)).map_owner_box()) } @@ -994,7 +1047,7 @@ pub fn find_plugin_registrar( let library = locator.maybe_load_library_crate().or_else(|| { if !is_cross { - return None + return None; } // Try loading from target crates. This will abort later if we // try to load a plugin registrar function, @@ -1012,24 +1065,28 @@ pub fn find_plugin_registrar( }; if target_only { - // Need to abort before syntax expansion. - let message = format!("plugin `{}` is not available for triple `{}` \ - (only found {})", - name, - config::host_triple(), - sess.opts.target_triple); - span_fatal!(sess, span, E0456, "{}", &message); + let message = format!( + "plugin `{}` is not available for triple `{}` (only found {})", + name, + config::host_triple(), + sess.opts.target_triple + ); + struct_span_err!(sess, span, E0456, "{}", &message).emit(); + return None; } match library.source.dylib { - Some(dylib) => { - Some((dylib.0, library.metadata.get_root().disambiguator())) - } + Some(dylib) => Some((dylib.0, library.metadata.get_root().disambiguator())), None => { - span_err!(sess, span, E0457, - "plugin `{}` only found in rlib format, but must be available \ + struct_span_err!( + sess, + span, + E0457, + "plugin `{}` only found in rlib format, but must be available \ in dylib format", - name); + name + ) + .emit(); // No need to abort because the loading code will just ignore this // empty dylib. None @@ -1038,11 +1095,12 @@ pub fn find_plugin_registrar( } /// A diagnostic function for dumping crate metadata to an output stream. -pub fn list_file_metadata(target: &Target, - path: &Path, - metadata_loader: &dyn MetadataLoader, - out: &mut dyn io::Write) - -> io::Result<()> { +pub fn list_file_metadata( + target: &Target, + path: &Path, + metadata_loader: &dyn MetadataLoader, + out: &mut dyn io::Write, +) -> io::Result<()> { let filename = path.file_name().unwrap().to_str().unwrap(); let flavor = if filename.ends_with(".rlib") { CrateFlavor::Rlib diff --git a/src/librustc_metadata/native_libs.rs b/src/librustc_metadata/native_libs.rs index 425e5d1d82..bbf6973be5 100644 --- a/src/librustc_metadata/native_libs.rs +++ b/src/librustc_metadata/native_libs.rs @@ -1,23 +1,18 @@ -use rustc::hir::itemlikevisit::ItemLikeVisitor; -use rustc::hir; use rustc::middle::cstore::{self, NativeLibrary}; +use rustc::session::parse::feature_err; use rustc::session::Session; use rustc::ty::TyCtxt; -use rustc::util::nodemap::FxHashSet; +use rustc_data_structures::fx::FxHashSet; +use rustc_errors::struct_span_err; +use rustc_hir as hir; +use rustc_hir::itemlikevisit::ItemLikeVisitor; +use rustc_span::source_map::Span; +use rustc_span::symbol::{kw, sym, Symbol}; use rustc_target::spec::abi::Abi; use syntax::attr; -use syntax::source_map::Span; -use syntax::feature_gate::feature_err; -use syntax::symbol::{kw, sym, Symbol}; -use syntax::{span_err, struct_span_err}; - -use rustc_error_codes::*; crate fn collect(tcx: TyCtxt<'_>) -> Vec { - let mut collector = Collector { - tcx, - libs: Vec::new(), - }; + let mut collector = Collector { tcx, libs: Vec::new() }; tcx.hir().krate().visit_all_item_likes(&mut collector); collector.process_command_line(); return collector.libs; @@ -36,16 +31,14 @@ struct Collector<'tcx> { } impl ItemLikeVisitor<'tcx> for Collector<'tcx> { - fn visit_item(&mut self, it: &'tcx hir::Item) { + fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) { let fm = match it.kind { hir::ItemKind::ForeignMod(ref fm) => fm, _ => return, }; - if fm.abi == Abi::Rust || - fm.abi == Abi::RustIntrinsic || - fm.abi == Abi::PlatformIntrinsic { - return + if fm.abi == Abi::Rust || fm.abi == Abi::RustIntrinsic || fm.abi == Abi::PlatformIntrinsic { + return; } // Process all of the #[link(..)]-style arguments @@ -77,10 +70,16 @@ impl ItemLikeVisitor<'tcx> for Collector<'tcx> { "framework" => cstore::NativeFramework, "raw-dylib" => cstore::NativeRawDylib, k => { - struct_span_err!(self.tcx.sess, item.span(), E0458, - "unknown kind: `{}`", k) - .span_label(item.span(), "unknown kind") - .span_label(m.span, "").emit(); + struct_span_err!( + self.tcx.sess, + item.span(), + E0458, + "unknown kind: `{}`", + k + ) + .span_label(item.span(), "unknown kind") + .span_label(m.span, "") + .emit(); cstore::NativeUnknown } }; @@ -92,10 +91,7 @@ impl ItemLikeVisitor<'tcx> for Collector<'tcx> { None => continue, // skip like historical compilers }; if cfg.is_empty() { - self.tcx.sess.span_err( - item.span(), - "`cfg()` must have an argument", - ); + self.tcx.sess.span_err(item.span(), "`cfg()` must have an argument"); } else if let cfg @ Some(..) = cfg[0].meta_item() { lib.cfg = cfg.cloned(); } else { @@ -119,18 +115,22 @@ impl ItemLikeVisitor<'tcx> for Collector<'tcx> { // #[link(wasm_import_module = "...")] without the `name`. let requires_name = kind_specified || lib.wasm_import_module.is_none(); if lib.name.is_none() && requires_name { - struct_span_err!(self.tcx.sess, m.span, E0459, - "`#[link(...)]` specified without \ - `name = \"foo\"`") - .span_label(m.span, "missing `name` argument") - .emit(); + struct_span_err!( + self.tcx.sess, + m.span, + E0459, + "`#[link(...)]` specified without \ + `name = \"foo\"`" + ) + .span_label(m.span, "missing `name` argument") + .emit(); } self.register_native_lib(Some(m.span), lib); } } - fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem) {} - fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem) {} + fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {} + fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem<'tcx>) {} } impl Collector<'tcx> { @@ -138,22 +138,26 @@ impl Collector<'tcx> { if lib.name.as_ref().map(|&s| s == kw::Invalid).unwrap_or(false) { match span { Some(span) => { - struct_span_err!(self.tcx.sess, span, E0454, - "`#[link(name = \"\")]` given with empty name") - .span_label(span, "empty name given") - .emit(); + struct_span_err!( + self.tcx.sess, + span, + E0454, + "`#[link(name = \"\")]` given with empty name" + ) + .span_label(span, "empty name given") + .emit(); } None => { self.tcx.sess.err("empty library name given via `-l`"); } } - return + return; } let is_osx = self.tcx.sess.target.target.options.is_like_osx; if lib.kind == cstore::NativeFramework && !is_osx { let msg = "native frameworks are only available on macOS targets"; match span { - Some(span) => span_err!(self.tcx.sess, span, E0455, "{}", msg), + Some(span) => struct_span_err!(self.tcx.sess, span, E0455, "{}", msg).emit(), None => self.tcx.sess.err(msg), } } @@ -161,24 +165,21 @@ impl Collector<'tcx> { feature_err(&self.tcx.sess.parse_sess, sym::link_cfg, span.unwrap(), "is unstable") .emit(); } - if lib.kind == cstore::NativeStaticNobundle && - !self.tcx.features().static_nobundle - { + if lib.kind == cstore::NativeStaticNobundle && !self.tcx.features().static_nobundle { feature_err( &self.tcx.sess.parse_sess, sym::static_nobundle, - span.unwrap_or_else(|| syntax_pos::DUMMY_SP), - "kind=\"static-nobundle\" is unstable" + span.unwrap_or_else(|| rustc_span::DUMMY_SP), + "kind=\"static-nobundle\" is unstable", ) .emit(); } - if lib.kind == cstore::NativeRawDylib && - !self.tcx.features().raw_dylib { + if lib.kind == cstore::NativeRawDylib && !self.tcx.features().raw_dylib { feature_err( &self.tcx.sess.parse_sess, sym::raw_dylib, - span.unwrap_or_else(|| syntax_pos::DUMMY_SP), - "kind=\"raw-dylib\" is unstable" + span.unwrap_or_else(|| rustc_span::DUMMY_SP), + "kind=\"raw-dylib\" is unstable", ) .emit(); } @@ -191,21 +192,29 @@ impl Collector<'tcx> { let mut renames = FxHashSet::default(); for &(ref name, ref new_name, _) in &self.tcx.sess.opts.libs { if let &Some(ref new_name) = new_name { - let any_duplicate = self.libs + let any_duplicate = self + .libs .iter() .filter_map(|lib| lib.name.as_ref()) .any(|n| n.as_str() == *name); if new_name.is_empty() { - self.tcx.sess.err( - &format!("an empty renaming target was specified for library `{}`",name)); + self.tcx.sess.err(&format!( + "an empty renaming target was specified for library `{}`", + name + )); } else if !any_duplicate { - self.tcx.sess.err(&format!("renaming of the library `{}` was specified, \ + self.tcx.sess.err(&format!( + "renaming of the library `{}` was specified, \ however this crate contains no `#[link(...)]` \ - attributes referencing this library.", name)); + attributes referencing this library.", + name + )); } else if !renames.insert(name) { - self.tcx.sess.err(&format!("multiple renamings were \ + self.tcx.sess.err(&format!( + "multiple renamings were \ specified for library `{}` .", - name)); + name + )); } } } @@ -221,20 +230,23 @@ impl Collector<'tcx> { // If we've already added any native libraries with the same // name, they will be pulled out into `existing`, so that we // can move them to the end of the list below. - let mut existing = self.libs.drain_filter(|lib| { - if let Some(lib_name) = lib.name { - if lib_name.as_str() == *name { - if let Some(k) = kind { - lib.kind = k; - } - if let &Some(ref new_name) = new_name { - lib.name = Some(Symbol::intern(new_name)); + let mut existing = self + .libs + .drain_filter(|lib| { + if let Some(lib_name) = lib.name { + if lib_name.as_str() == *name { + if let Some(k) = kind { + lib.kind = k; + } + if let &Some(ref new_name) = new_name { + lib.name = Some(Symbol::intern(new_name)); + } + return true; } - return true; } - } - false - }).collect::>(); + false + }) + .collect::>(); if existing.is_empty() { // Add if not found let new_name = new_name.as_ref().map(|s| &**s); // &Option -> Option<&str> diff --git a/src/librustc_metadata/rmeta/decoder.rs b/src/librustc_metadata/rmeta/decoder.rs index a1f95e35cb..6280121f65 100644 --- a/src/librustc_metadata/rmeta/decoder.rs +++ b/src/librustc_metadata/rmeta/decoder.rs @@ -1,46 +1,47 @@ // Decoding metadata from a single crate's metadata -use crate::rmeta::*; use crate::rmeta::table::{FixedSizeEncoding, Table}; +use crate::rmeta::*; -use rustc_index::vec::{Idx, IndexVec}; -use rustc_data_structures::sync::{Lrc, Lock, LockGuard, Once, AtomicCell}; -use rustc::hir::map::{DefKey, DefPath, DefPathData, DefPathHash}; +use rustc::dep_graph::{self, DepNodeIndex}; +use rustc::hir::exports::Export; use rustc::hir::map::definitions::DefPathTable; -use rustc::hir; +use rustc::hir::map::{DefKey, DefPath, DefPathData, DefPathHash}; use rustc::middle::cstore::{CrateSource, ExternCrate}; -use rustc::middle::cstore::{LinkagePreference, NativeLibrary, ForeignModule}; +use rustc::middle::cstore::{ForeignModule, LinkagePreference, NativeLibrary}; use rustc::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel}; -use rustc::hir::def::{self, Res, DefKind, CtorOf, CtorKind}; -use rustc::hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; -use rustc_data_structures::fingerprint::Fingerprint; -use rustc_data_structures::fx::FxHashMap; -use rustc_data_structures::svh::Svh; -use rustc::dep_graph::{self, DepNodeIndex}; use rustc::middle::lang_items; -use rustc::mir::{self, BodyAndCache, interpret, Promoted}; use rustc::mir::interpret::{AllocDecodingSession, AllocDecodingState}; +use rustc::mir::{self, interpret, BodyAndCache, Promoted}; use rustc::session::Session; -use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::codec::TyDecoder; +use rustc::ty::{self, Ty, TyCtxt}; use rustc::util::common::record_time; -use rustc::util::captures::Captures; +use rustc_data_structures::captures::Captures; +use rustc_data_structures::fingerprint::Fingerprint; +use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::svh::Svh; +use rustc_data_structures::sync::{AtomicCell, Lock, LockGuard, Lrc, Once}; +use rustc_hir as hir; +use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res}; +use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; +use rustc_index::vec::{Idx, IndexVec}; use std::io; use std::mem; use std::num::NonZeroUsize; use std::u32; -use rustc_serialize::{Decodable, Decoder, SpecializedDecoder, opaque}; -use syntax::attr; -use syntax::ast::{self, Ident}; -use syntax::source_map::{self, respan, Spanned}; -use syntax_expand::base::{SyntaxExtensionKind, SyntaxExtension}; -use syntax_expand::proc_macro::{AttrProcMacro, ProcMacroDerive, BangProcMacro}; -use syntax_pos::{self, Span, BytePos, Pos, DUMMY_SP, hygiene::MacroKind}; -use syntax_pos::symbol::{Symbol, sym}; use log::debug; use proc_macro::bridge::client::ProcMacro; +use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind}; +use rustc_expand::proc_macro::{AttrProcMacro, BangProcMacro, ProcMacroDerive}; +use rustc_serialize::{opaque, Decodable, Decoder, SpecializedDecoder}; +use rustc_span::source_map::{self, respan, Spanned}; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::{self, hygiene::MacroKind, BytePos, Pos, Span, DUMMY_SP}; +use syntax::ast::{self, Ident}; +use syntax::attr; pub use cstore_impl::{provide, provide_extern}; @@ -59,7 +60,6 @@ crate struct CrateMetadata { blob: MetadataBlob, // --- Some data pre-decoded from the metadata blob, usually for performance --- - /// Properties of the whole crate. /// NOTE(eddyb) we pass `'static` to a `'tcx` parameter because this /// lifetime is only used behind `Lazy`, and therefore acts like an @@ -89,7 +89,6 @@ crate struct CrateMetadata { dep_node_index: AtomicCell, // --- Other significant crate properties --- - /// ID of this crate, from the current compilation session's point of view. cnum: CrateNum, /// Maps crate IDs as they are were seen from this crate's compilation sessions into @@ -108,21 +107,20 @@ crate struct CrateMetadata { host_hash: Option, // --- Data used only for improving diagnostics --- - /// Information about the `extern crate` item or path that caused this crate to be loaded. /// If this is `None`, then the crate was injected (e.g., by the allocator). extern_crate: Lock>, } -/// Holds information about a syntax_pos::SourceFile imported from another crate. +/// Holds information about a rustc_span::SourceFile imported from another crate. /// See `imported_source_files()` for more information. struct ImportedSourceFile { /// This SourceFile's byte-offset within the source_map of its original crate - original_start_pos: syntax_pos::BytePos, + original_start_pos: rustc_span::BytePos, /// The end of this SourceFile within the source_map of its original crate - original_end_pos: syntax_pos::BytePos, + original_end_pos: rustc_span::BytePos, /// The imported SourceFile's representation within the local source_map - translated_source_file: Lrc, + translated_source_file: Lrc, } pub(super) struct DecodeContext<'a, 'tcx> { @@ -143,9 +141,15 @@ pub(super) struct DecodeContext<'a, 'tcx> { /// Abstract over the various ways one can create metadata decoders. pub(super) trait Metadata<'a, 'tcx>: Copy { fn raw_bytes(self) -> &'a [u8]; - fn cdata(self) -> Option<&'a CrateMetadata> { None } - fn sess(self) -> Option<&'tcx Session> { None } - fn tcx(self) -> Option> { None } + fn cdata(self) -> Option<&'a CrateMetadata> { + None + } + fn sess(self) -> Option<&'tcx Session> { + None + } + fn tcx(self) -> Option> { + None + } fn decoder(self, pos: usize) -> DecodeContext<'a, 'tcx> { let tcx = self.tcx(); @@ -156,9 +160,9 @@ pub(super) trait Metadata<'a, 'tcx>: Copy { tcx, last_source_file_index: 0, lazy_state: LazyState::NoNode, - alloc_decoding_session: self.cdata().map(|cdata| { - cdata.alloc_decoding_state.new_decoding_session() - }), + alloc_decoding_session: self + .cdata() + .map(|cdata| cdata.alloc_decoding_state.new_decoding_session()), } } } @@ -169,7 +173,6 @@ impl<'a, 'tcx> Metadata<'a, 'tcx> for &'a MetadataBlob { } } - impl<'a, 'tcx> Metadata<'a, 'tcx> for (&'a MetadataBlob, &'tcx Session) { fn raw_bytes(self) -> &'a [u8] { let (blob, _) = self; @@ -182,7 +185,6 @@ impl<'a, 'tcx> Metadata<'a, 'tcx> for (&'a MetadataBlob, &'tcx Session) { } } - impl<'a, 'tcx> Metadata<'a, 'tcx> for &'a CrateMetadata { fn raw_bytes(self) -> &'a [u8] { self.blob.raw_bytes() @@ -280,18 +282,17 @@ impl<'a, 'tcx> TyDecoder<'tcx> for DecodeContext<'a, 'tcx> { self.opaque.position() } - fn cached_ty_for_shorthand(&mut self, - shorthand: usize, - or_insert_with: F) - -> Result, Self::Error> - where F: FnOnce(&mut Self) -> Result, Self::Error> + fn cached_ty_for_shorthand( + &mut self, + shorthand: usize, + or_insert_with: F, + ) -> Result, Self::Error> + where + F: FnOnce(&mut Self) -> Result, Self::Error>, { let tcx = self.tcx(); - let key = ty::CReaderCacheKey { - cnum: self.cdata().cnum, - pos: shorthand, - }; + let key = ty::CReaderCacheKey { cnum: self.cdata().cnum, pos: shorthand }; if let Some(&ty) = tcx.rcache.borrow().get(&key) { return Ok(ty); @@ -303,7 +304,8 @@ impl<'a, 'tcx> TyDecoder<'tcx> for DecodeContext<'a, 'tcx> { } fn with_position(&mut self, pos: usize, f: F) -> R - where F: FnOnce(&mut Self) -> R + where + F: FnOnce(&mut Self) -> R, { let new_opaque = opaque::Decoder::new(self.opaque.data, pos); let old_opaque = mem::replace(&mut self.opaque, new_opaque); @@ -315,11 +317,7 @@ impl<'a, 'tcx> TyDecoder<'tcx> for DecodeContext<'a, 'tcx> { } fn map_encoded_cnum_to_current(&self, cnum: CrateNum) -> CrateNum { - if cnum == LOCAL_CRATE { - self.cdata().cnum - } else { - self.cdata().cnum_map[cnum] - } + if cnum == LOCAL_CRATE { self.cdata().cnum } else { self.cdata().cnum_map[cnum] } } } @@ -332,16 +330,13 @@ impl<'a, 'tcx, T> SpecializedDecoder> for DecodeContext<'a, 'tcx> { impl<'a, 'tcx, T> SpecializedDecoder> for DecodeContext<'a, 'tcx> { fn specialized_decode(&mut self) -> Result, Self::Error> { let len = self.read_usize()?; - if len == 0 { - Ok(Lazy::empty()) - } else { - self.read_lazy_with_meta(len) - } + if len == 0 { Ok(Lazy::empty()) } else { self.read_lazy_with_meta(len) } } } impl<'a, 'tcx, I: Idx, T> SpecializedDecoder>> for DecodeContext<'a, 'tcx> - where Option: FixedSizeEncoding, +where + Option: FixedSizeEncoding, { fn specialized_decode(&mut self) -> Result>, Self::Error> { let len = self.read_usize()?; @@ -355,10 +350,7 @@ impl<'a, 'tcx> SpecializedDecoder for DecodeContext<'a, 'tcx> { let krate = CrateNum::decode(self)?; let index = DefIndex::decode(self)?; - Ok(DefId { - krate, - index, - }) + Ok(DefId { krate, index }) } } @@ -391,7 +383,7 @@ impl<'a, 'tcx> SpecializedDecoder for DecodeContext<'a, 'tcx> { let tag = u8::decode(self)?; if tag == TAG_INVALID_SPAN { - return Ok(DUMMY_SP) + return Ok(DUMMY_SP); } debug_assert_eq!(tag, TAG_VALID_SPAN); @@ -412,8 +404,8 @@ impl<'a, 'tcx> SpecializedDecoder for DecodeContext<'a, 'tcx> { // originate from the same source_file. let last_source_file = &imported_source_files[self.last_source_file_index]; - if lo >= last_source_file.original_start_pos && - lo <= last_source_file.original_end_pos { + if lo >= last_source_file.original_start_pos && lo <= last_source_file.original_end_pos + { last_source_file } else { let mut a = 0; @@ -434,17 +426,15 @@ impl<'a, 'tcx> SpecializedDecoder for DecodeContext<'a, 'tcx> { }; // Make sure our binary search above is correct. - debug_assert!(lo >= source_file.original_start_pos && - lo <= source_file.original_end_pos); + debug_assert!(lo >= source_file.original_start_pos && lo <= source_file.original_end_pos); // Make sure we correctly filtered out invalid spans during encoding - debug_assert!(hi >= source_file.original_start_pos && - hi <= source_file.original_end_pos); + debug_assert!(hi >= source_file.original_start_pos && hi <= source_file.original_end_pos); - let lo = (lo + source_file.translated_source_file.start_pos) - - source_file.original_start_pos; - let hi = (hi + source_file.translated_source_file.start_pos) - - source_file.original_start_pos; + let lo = + (lo + source_file.translated_source_file.start_pos) - source_file.original_start_pos; + let hi = + (hi + source_file.translated_source_file.start_pos) - source_file.original_start_pos; Ok(Span::with_root_ctxt(lo, hi)) } @@ -465,14 +455,15 @@ impl<'a, 'tcx> SpecializedDecoder for DecodeContext<'a, 'tcx> { } impl<'a, 'tcx, T: Decodable> SpecializedDecoder> -for DecodeContext<'a, 'tcx> { + for DecodeContext<'a, 'tcx> +{ #[inline] fn specialized_decode(&mut self) -> Result, Self::Error> { Ok(mir::ClearCrossCrate::Clear) } } -implement_ty_decoder!( DecodeContext<'a, 'tcx> ); +implement_ty_decoder!(DecodeContext<'a, 'tcx>); impl MetadataBlob { crate fn new(metadata_ref: MetadataRef) -> MetadataBlob { @@ -484,29 +475,24 @@ impl MetadataBlob { } crate fn get_rustc_version(&self) -> String { - Lazy::::from_position( - NonZeroUsize::new(METADATA_HEADER.len() + 4).unwrap(), - ).decode(self) + Lazy::::from_position(NonZeroUsize::new(METADATA_HEADER.len() + 4).unwrap()) + .decode(self) } crate fn get_root(&self) -> CrateRoot<'tcx> { let slice = self.raw_bytes(); let offset = METADATA_HEADER.len(); - let pos = (((slice[offset + 0] as u32) << 24) | ((slice[offset + 1] as u32) << 16) | - ((slice[offset + 2] as u32) << 8) | - ((slice[offset + 3] as u32) << 0)) as usize; - Lazy::>::from_position( - NonZeroUsize::new(pos).unwrap(), - ).decode(self) + let pos = (((slice[offset + 0] as u32) << 24) + | ((slice[offset + 1] as u32) << 16) + | ((slice[offset + 2] as u32) << 8) + | ((slice[offset + 3] as u32) << 0)) as usize; + Lazy::>::from_position(NonZeroUsize::new(pos).unwrap()).decode(self) } - crate fn list_crate_metadata(&self, - out: &mut dyn io::Write) -> io::Result<()> { + crate fn list_crate_metadata(&self, out: &mut dyn io::Write) -> io::Result<()> { write!(out, "=External Dependencies=\n")?; let root = self.get_root(); - for (i, dep) in root.crate_deps - .decode(self) - .enumerate() { + for (i, dep) in root.crate_deps.decode(self).enumerate() { write!(out, "{} {}{}\n", i + 1, dep.name, dep.extra_filename)?; } write!(out, "\n")?; @@ -519,14 +505,13 @@ impl<'tcx> EntryKind<'tcx> { Some(match *self { EntryKind::Const(..) => DefKind::Const, EntryKind::AssocConst(..) => DefKind::AssocConst, - EntryKind::ImmStatic | - EntryKind::MutStatic | - EntryKind::ForeignImmStatic | - EntryKind::ForeignMutStatic => DefKind::Static, + EntryKind::ImmStatic + | EntryKind::MutStatic + | EntryKind::ForeignImmStatic + | EntryKind::ForeignMutStatic => DefKind::Static, EntryKind::Struct(_, _) => DefKind::Struct, EntryKind::Union(_, _) => DefKind::Union, - EntryKind::Fn(_) | - EntryKind::ForeignFn(_) => DefKind::Fn, + EntryKind::Fn(_) | EntryKind::ForeignFn(_) => DefKind::Fn, EntryKind::Method(_) => DefKind::Method, EntryKind::Type => DefKind::TyAlias, EntryKind::TypeParam => DefKind::TyParam, @@ -542,12 +527,12 @@ impl<'tcx> EntryKind<'tcx> { EntryKind::MacroDef(_) => DefKind::Macro(MacroKind::Bang), EntryKind::ForeignType => DefKind::ForeignTy, - EntryKind::ForeignMod | - EntryKind::GlobalAsm | - EntryKind::Impl(_) | - EntryKind::Field | - EntryKind::Generator(_) | - EntryKind::Closure => return None, + EntryKind::ForeignMod + | EntryKind::GlobalAsm + | EntryKind::Impl(_) + | EntryKind::Field + | EntryKind::Generator(_) + | EntryKind::Closure => return None, }) } } @@ -597,8 +582,11 @@ impl<'a, 'tcx> CrateMetadata { let def_path_table = record_time(&sess.perf_stats.decode_def_path_tables_time, || { root.def_path_table.decode((&blob, sess)) }); - let trait_impls = root.impls.decode((&blob, sess)) - .map(|trait_impls| (trait_impls.trait_id, trait_impls.impls)).collect(); + let trait_impls = root + .impls + .decode((&blob, sess)) + .map(|trait_impls| (trait_impls.trait_id, trait_impls.impls)) + .collect(); let alloc_decoding_state = AllocDecodingState::new(root.interpret_alloc_index.decode(&blob).collect()); let dependencies = Lock::new(cnum_map.iter().cloned().collect()); @@ -643,17 +631,14 @@ impl<'a, 'tcx> CrateMetadata { } fn local_def_id(&self, index: DefIndex) -> DefId { - DefId { - krate: self.cnum, - index, - } + DefId { krate: self.cnum, index } } fn raw_proc_macro(&self, id: DefIndex) -> &ProcMacro { // DefIndex's in root.proc_macro_data have a one-to-one correspondence // with items in 'raw_proc_macros'. // NOTE: If you update the order of macros in 'proc_macro_data' for any reason, - // you must also update src/libsyntax_ext/proc_macro_harness.rs + // you must also update src/librustc_builtin_macros/proc_macro_harness.rs // Failing to do so will result in incorrect data being associated // with proc macros when deserialized. let pos = self.root.proc_macro_data.unwrap().decode(self).position(|i| i == id).unwrap(); @@ -676,9 +661,7 @@ impl<'a, 'tcx> CrateMetadata { if !self.is_proc_macro(index) { self.kind(index).def_kind() } else { - Some(DefKind::Macro( - macro_kind(self.raw_proc_macro(index)) - )) + Some(DefKind::Macro(macro_kind(self.raw_proc_macro(index)))) } } @@ -697,12 +680,12 @@ impl<'a, 'tcx> CrateMetadata { helper_attrs, ) } - ProcMacro::Attr { name, client } => ( - name, SyntaxExtensionKind::Attr(Box::new(AttrProcMacro { client })), Vec::new() - ), - ProcMacro::Bang { name, client } => ( - name, SyntaxExtensionKind::Bang(Box::new(BangProcMacro { client })), Vec::new() - ) + ProcMacro::Attr { name, client } => { + (name, SyntaxExtensionKind::Attr(Box::new(AttrProcMacro { client })), Vec::new()) + } + ProcMacro::Bang { name, client } => { + (name, SyntaxExtensionKind::Bang(Box::new(BangProcMacro { client })), Vec::new()) + } }; SyntaxExtension::new( @@ -720,21 +703,23 @@ impl<'a, 'tcx> CrateMetadata { match self.kind(item_id) { EntryKind::Trait(data) => { let data = data.decode((self, sess)); - ty::TraitDef::new(self.local_def_id(item_id), - data.unsafety, - data.paren_sugar, - data.has_auto_impl, - data.is_marker, - self.def_path_table.def_path_hash(item_id)) - }, - EntryKind::TraitAlias => { - ty::TraitDef::new(self.local_def_id(item_id), - hir::Unsafety::Normal, - false, - false, - false, - self.def_path_table.def_path_hash(item_id)) - }, + ty::TraitDef::new( + self.local_def_id(item_id), + data.unsafety, + data.paren_sugar, + data.has_auto_impl, + data.is_marker, + self.def_path_table.def_path_hash(item_id), + ) + } + EntryKind::TraitAlias => ty::TraitDef::new( + self.local_def_id(item_id), + hir::Unsafety::Normal, + false, + false, + false, + self.def_path_table.def_path_hash(item_id), + ), _ => bug!("def-index does not refer to trait or trait alias"), } } @@ -747,9 +732,9 @@ impl<'a, 'tcx> CrateMetadata { parent_did: DefId, ) -> ty::VariantDef { let data = match kind { - EntryKind::Variant(data) | - EntryKind::Struct(data, _) | - EntryKind::Union(data, _) => data.decode(self), + EntryKind::Variant(data) | EntryKind::Struct(data, _) | EntryKind::Union(data, _) => { + data.decode(self) + } _ => bug!(), }; @@ -760,11 +745,8 @@ impl<'a, 'tcx> CrateMetadata { _ => bug!(), }; - let variant_did = if adt_kind == ty::AdtKind::Enum { - Some(self.local_def_id(index)) - } else { - None - }; + let variant_did = + if adt_kind == ty::AdtKind::Enum { Some(self.local_def_id(index)) } else { None }; let ctor_did = data.ctor.map(|index| self.local_def_id(index)); ty::VariantDef::new( @@ -773,12 +755,18 @@ impl<'a, 'tcx> CrateMetadata { variant_did, ctor_did, data.discr, - self.root.per_def.children.get(self, index).unwrap_or(Lazy::empty()) - .decode(self).map(|index| ty::FieldDef { + self.root + .per_def + .children + .get(self, index) + .unwrap_or(Lazy::empty()) + .decode(self) + .map(|index| ty::FieldDef { did: self.local_def_id(index), ident: Ident::with_dummy_span(self.item_name(index)), vis: self.get_visibility(index), - }).collect(), + }) + .collect(), data.ctor_kind, adt_kind, parent_did, @@ -798,11 +786,13 @@ impl<'a, 'tcx> CrateMetadata { }; let variants = if let ty::AdtKind::Enum = adt_kind { - self.root.per_def.children.get(self, item_id).unwrap_or(Lazy::empty()) + self.root + .per_def + .children + .get(self, item_id) + .unwrap_or(Lazy::empty()) .decode(self) - .map(|index| { - self.get_variant(tcx, &self.kind(index), index, did) - }) + .map(|index| self.get_variant(tcx, &self.kind(index), index, did)) .collect() } else { std::iter::once(self.get_variant(tcx, &kind, item_id, did)).collect() @@ -824,9 +814,12 @@ impl<'a, 'tcx> CrateMetadata { item_id: DefIndex, tcx: TyCtxt<'tcx>, ) -> &'tcx [(ty::Predicate<'tcx>, Span)] { - self.root.per_def.inferred_outlives.get(self, item_id).map(|predicates| { - predicates.decode((self, tcx)) - }).unwrap_or_default() + self.root + .per_def + .inferred_outlives + .get(self, item_id) + .map(|predicates| predicates.decode((self, tcx))) + .unwrap_or_default() } fn get_super_predicates( @@ -847,7 +840,7 @@ impl<'a, 'tcx> CrateMetadata { fn get_stability(&self, id: DefIndex) -> Option { match self.is_proc_macro(id) { - true => self.root.proc_macro_stability.clone(), + true => self.root.proc_macro_stability, false => self.root.per_def.stability.get(self, id).map(|stab| stab.decode(self)), } } @@ -857,7 +850,10 @@ impl<'a, 'tcx> CrateMetadata { } fn get_deprecation(&self, id: DefIndex) -> Option { - self.root.per_def.deprecation.get(self, id) + self.root + .per_def + .deprecation + .get(self, id) .filter(|_| !self.is_proc_macro(id)) .map(|depr| depr.decode(self)) } @@ -888,10 +884,7 @@ impl<'a, 'tcx> CrateMetadata { self.get_impl_data(id).defaultness } - fn get_coerce_unsized_info( - &self, - id: DefIndex, - ) -> Option { + fn get_coerce_unsized_info(&self, id: DefIndex) -> Option { self.get_impl_data(id).coerce_unsized_info } @@ -903,9 +896,7 @@ impl<'a, 'tcx> CrateMetadata { fn get_lib_features(&self, tcx: TyCtxt<'tcx>) -> &'tcx [(ast::Name, Option)] { // FIXME: For a proc macro crate, not sure whether we should return the "host" // features or an empty Vec. Both don't cause ICEs. - tcx.arena.alloc_from_iter(self.root - .lib_features - .decode(self)) + tcx.arena.alloc_from_iter(self.root.lib_features.decode(self)) } /// Iterates over the language items in the given crate. @@ -914,18 +905,17 @@ impl<'a, 'tcx> CrateMetadata { // Proc macro crates do not export any lang-items to the target. &[] } else { - tcx.arena.alloc_from_iter(self.root - .lang_items - .decode(self) - .map(|(def_index, index)| (self.local_def_id(def_index), index))) + tcx.arena.alloc_from_iter( + self.root + .lang_items + .decode(self) + .map(|(def_index, index)| (self.local_def_id(def_index), index)), + ) } } /// Iterates over the diagnostic items in the given crate. - fn get_diagnostic_items( - &self, - tcx: TyCtxt<'tcx>, - ) -> &'tcx FxHashMap { + fn get_diagnostic_items(&self, tcx: TyCtxt<'tcx>) -> &'tcx FxHashMap { tcx.arena.alloc(if self.root.is_proc_macro_crate() { // Proc macro crates do not export any diagnostic-items to the target. Default::default() @@ -940,7 +930,8 @@ impl<'a, 'tcx> CrateMetadata { /// Iterates over each child of the given item. fn each_child_of_item(&self, id: DefIndex, mut callback: F, sess: &Session) - where F: FnMut(def::Export) + where + F: FnMut(Export), { if let Some(proc_macros_ids) = self.root.proc_macro_data.map(|d| d.decode(self)) { /* If we are loading as a proc macro, we want to return the view of this crate @@ -954,15 +945,10 @@ impl<'a, 'tcx> CrateMetadata { self.local_def_id(def_index), ); let ident = Ident::from_str(raw_macro.name()); - callback(def::Export { - ident: ident, - res: res, - vis: ty::Visibility::Public, - span: DUMMY_SP, - }); + callback(Export { ident, res, vis: ty::Visibility::Public, span: DUMMY_SP }); } } - return + return; } // Find the item. @@ -976,7 +962,7 @@ impl<'a, 'tcx> CrateMetadata { let children = self.root.per_def.children.get(self, id).unwrap_or(Lazy::empty()); for child_index in children.decode((self, sess)) { if macros_only { - continue + continue; } // Get the item. @@ -991,16 +977,24 @@ impl<'a, 'tcx> CrateMetadata { match child_kind { // FIXME(eddyb) Don't encode these in children. EntryKind::ForeignMod => { - let child_children = - self.root.per_def.children.get(self, child_index) - .unwrap_or(Lazy::empty()); + let child_children = self + .root + .per_def + .children + .get(self, child_index) + .unwrap_or(Lazy::empty()); for child_index in child_children.decode((self, sess)) { if let Some(kind) = self.def_kind(child_index) { - callback(def::Export { + callback(Export { res: Res::Def(kind, self.local_def_id(child_index)), ident: Ident::with_dummy_span(self.item_name(child_index)), vis: self.get_visibility(child_index), - span: self.root.per_def.span.get(self, child_index).unwrap() + span: self + .root + .per_def + .span + .get(self, child_index) + .unwrap() .decode((self, sess)), }); } @@ -1015,24 +1009,23 @@ impl<'a, 'tcx> CrateMetadata { let def_key = self.def_key(child_index); let span = self.get_span(child_index, sess); if let (Some(kind), Some(name)) = - (self.def_kind(child_index), def_key.disambiguated_data.data.get_opt_name()) { + (self.def_kind(child_index), def_key.disambiguated_data.data.get_opt_name()) + { let ident = Ident::with_dummy_span(name); let vis = self.get_visibility(child_index); let def_id = self.local_def_id(child_index); let res = Res::Def(kind, def_id); - callback(def::Export { res, ident, vis, span }); + callback(Export { res, ident, vis, span }); // For non-re-export structs and variants add their constructors to children. // Re-export lists automatically contain constructors when necessary. match kind { DefKind::Struct => { if let Some(ctor_def_id) = self.get_ctor_def_id(child_index) { let ctor_kind = self.get_ctor_kind(child_index); - let ctor_res = Res::Def( - DefKind::Ctor(CtorOf::Struct, ctor_kind), - ctor_def_id, - ); + let ctor_res = + Res::Def(DefKind::Ctor(CtorOf::Struct, ctor_kind), ctor_def_id); let vis = self.get_visibility(ctor_def_id.index); - callback(def::Export { res: ctor_res, vis, ident, span }); + callback(Export { res: ctor_res, vis, ident, span }); } } DefKind::Variant => { @@ -1042,10 +1035,8 @@ impl<'a, 'tcx> CrateMetadata { // error will be reported on any use of such resolution anyway. let ctor_def_id = self.get_ctor_def_id(child_index).unwrap_or(def_id); let ctor_kind = self.get_ctor_kind(child_index); - let ctor_res = Res::Def( - DefKind::Ctor(CtorOf::Variant, ctor_kind), - ctor_def_id, - ); + let ctor_res = + Res::Def(DefKind::Ctor(CtorOf::Variant, ctor_kind), ctor_def_id); let mut vis = self.get_visibility(ctor_def_id.index); if ctor_def_id == def_id && vis == ty::Visibility::Public { // For non-exhaustive variants lower the constructor visibility to @@ -1058,7 +1049,7 @@ impl<'a, 'tcx> CrateMetadata { vis = ty::Visibility::Restricted(crate_def_id); } } - callback(def::Export { res: ctor_res, ident, vis, span }); + callback(Export { res: ctor_res, ident, vis, span }); } _ => {} } @@ -1079,12 +1070,15 @@ impl<'a, 'tcx> CrateMetadata { } fn is_item_mir_available(&self, id: DefIndex) -> bool { - !self.is_proc_macro(id) && - self.root.per_def.mir.get(self, id).is_some() + !self.is_proc_macro(id) && self.root.per_def.mir.get(self, id).is_some() } fn get_optimized_mir(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> BodyAndCache<'tcx> { - let mut cache = self.root.per_def.mir.get(self, id) + let mut cache = self + .root + .per_def + .mir + .get(self, id) .filter(|_| !self.is_proc_macro(id)) .unwrap_or_else(|| { bug!("get_optimized_mir: missing MIR for `{:?}`", self.local_def_id(id)) @@ -1099,7 +1093,11 @@ impl<'a, 'tcx> CrateMetadata { tcx: TyCtxt<'tcx>, id: DefIndex, ) -> IndexVec> { - let mut cache = self.root.per_def.promoted_mir.get(self, id) + let mut cache = self + .root + .per_def + .promoted_mir + .get(self, id) .filter(|_| !self.is_proc_macro(id)) .unwrap_or_else(|| { bug!("get_promoted_mir: missing MIR for `{:?}`", self.local_def_id(id)) @@ -1113,11 +1111,9 @@ impl<'a, 'tcx> CrateMetadata { fn mir_const_qualif(&self, id: DefIndex) -> mir::ConstQualifs { match self.kind(id) { - EntryKind::Const(qualif, _) | - EntryKind::AssocConst(AssocContainer::ImplDefault, qualif, _) | - EntryKind::AssocConst(AssocContainer::ImplFinal, qualif, _) => { - qualif - } + EntryKind::Const(qualif, _) + | EntryKind::AssocConst(AssocContainer::ImplDefault, qualif, _) + | EntryKind::AssocConst(AssocContainer::ImplFinal, qualif, _) => qualif, _ => bug!(), } } @@ -1128,20 +1124,14 @@ impl<'a, 'tcx> CrateMetadata { let name = def_key.disambiguated_data.data.get_opt_name().unwrap(); let (kind, container, has_self) = match self.kind(id) { - EntryKind::AssocConst(container, _, _) => { - (ty::AssocKind::Const, container, false) - } + EntryKind::AssocConst(container, _, _) => (ty::AssocKind::Const, container, false), EntryKind::Method(data) => { let data = data.decode(self); (ty::AssocKind::Method, data.container, data.has_self) } - EntryKind::AssocType(container) => { - (ty::AssocKind::Type, container, false) - } - EntryKind::AssocOpaqueTy(container) => { - (ty::AssocKind::OpaqueTy, container, false) - } - _ => bug!("cannot get associated-item of `{:?}`", def_key) + EntryKind::AssocType(container) => (ty::AssocKind::Type, container, false), + EntryKind::AssocOpaqueTy(container) => (ty::AssocKind::OpaqueTy, container, false), + _ => bug!("cannot get associated-item of `{:?}`", def_key), }; ty::AssocItem { @@ -1151,20 +1141,19 @@ impl<'a, 'tcx> CrateMetadata { defaultness: container.defaultness(), def_id: self.local_def_id(id), container: container.with_def_id(parent), - method_has_self_argument: has_self + method_has_self_argument: has_self, } } fn get_item_variances(&self, id: DefIndex) -> Vec { - self.root.per_def.variances.get(self, id).unwrap_or(Lazy::empty()) - .decode(self).collect() + self.root.per_def.variances.get(self, id).unwrap_or(Lazy::empty()).decode(self).collect() } fn get_ctor_kind(&self, node_id: DefIndex) -> CtorKind { match self.kind(node_id) { - EntryKind::Struct(data, _) | - EntryKind::Union(data, _) | - EntryKind::Variant(data) => data.decode(self).ctor_kind, + EntryKind::Struct(data, _) | EntryKind::Union(data, _) | EntryKind::Variant(data) => { + data.decode(self).ctor_kind + } _ => CtorKind::Fictive, } } @@ -1192,17 +1181,23 @@ impl<'a, 'tcx> CrateMetadata { node_id }; - Lrc::from(self.root.per_def.attributes.get(self, item_id).unwrap_or(Lazy::empty()) - .decode((self, sess)) - .collect::>()) + Lrc::from( + self.root + .per_def + .attributes + .get(self, item_id) + .unwrap_or(Lazy::empty()) + .decode((self, sess)) + .collect::>(), + ) } - fn get_struct_field_names( - &self, - id: DefIndex, - sess: &Session, - ) -> Vec> { - self.root.per_def.children.get(self, id).unwrap_or(Lazy::empty()) + fn get_struct_field_names(&self, id: DefIndex, sess: &Session) -> Vec> { + self.root + .per_def + .children + .get(self, id) + .unwrap_or(Lazy::empty()) .decode(self) .map(|index| respan(self.get_span(index, sess), self.item_name(index))) .collect() @@ -1213,10 +1208,7 @@ impl<'a, 'tcx> CrateMetadata { fn reverse_translate_def_id(&self, did: DefId) -> Option { for (local, &global) in self.cnum_map.iter_enumerated() { if global == did.krate { - return Some(DefId { - krate: local, - index: did.index, - }); + return Some(DefId { krate: local, index: did.index }); } } @@ -1229,9 +1221,13 @@ impl<'a, 'tcx> CrateMetadata { id: DefIndex, ) -> &'tcx [DefId] { tcx.arena.alloc_from_iter( - self.root.per_def.inherent_impls.get(self, id).unwrap_or(Lazy::empty()) + self.root + .per_def + .inherent_impls + .get(self, id) + .unwrap_or(Lazy::empty()) .decode(self) - .map(|index| self.local_def_id(index)) + .map(|index| self.local_def_id(index)), ) } @@ -1242,7 +1238,7 @@ impl<'a, 'tcx> CrateMetadata { ) -> &'tcx [DefId] { if self.root.is_proc_macro_crate() { // proc-macro crates export no trait impls. - return &[] + return &[]; } // Do a reverse lookup beforehand to avoid touching the crate_num @@ -1260,9 +1256,11 @@ impl<'a, 'tcx> CrateMetadata { &[] } } else { - tcx.arena.alloc_from_iter(self.trait_impls.values().flat_map(|impls| { - impls.decode(self).map(|idx| self.local_def_id(idx)) - })) + tcx.arena.alloc_from_iter( + self.trait_impls + .values() + .flat_map(|impls| impls.decode(self).map(|idx| self.local_def_id(idx))), + ) } } @@ -1273,16 +1271,12 @@ impl<'a, 'tcx> CrateMetadata { // Not an associated item _ => return None, } - def_key.parent.and_then(|parent_index| { - match self.kind(parent_index) { - EntryKind::Trait(_) | - EntryKind::TraitAlias => Some(self.local_def_id(parent_index)), - _ => None, - } + def_key.parent.and_then(|parent_index| match self.kind(parent_index) { + EntryKind::Trait(_) | EntryKind::TraitAlias => Some(self.local_def_id(parent_index)), + _ => None, }) } - fn get_native_libraries(&self, sess: &Session) -> Vec { if self.root.is_proc_macro_crate() { // Proc macro crates do not have any *target* native libraries. @@ -1305,14 +1299,12 @@ impl<'a, 'tcx> CrateMetadata { &self, tcx: TyCtxt<'tcx>, ) -> &'tcx [(CrateNum, LinkagePreference)] { - tcx.arena.alloc_from_iter(self.root - .dylib_dependency_formats - .decode(self) - .enumerate() - .flat_map(|(i, link)| { + tcx.arena.alloc_from_iter( + self.root.dylib_dependency_formats.decode(self).enumerate().flat_map(|(i, link)| { let cnum = CrateNum::new(i + 1); link.map(|link| (self.cnum_map[cnum], link)) - })) + }), + ) } fn get_missing_lang_items(&self, tcx: TyCtxt<'tcx>) -> &'tcx [lang_items::LangItem] { @@ -1320,16 +1312,13 @@ impl<'a, 'tcx> CrateMetadata { // Proc macro crates do not depend on any target weak lang-items. &[] } else { - tcx.arena.alloc_from_iter(self.root - .lang_items_missing - .decode(self)) + tcx.arena.alloc_from_iter(self.root.lang_items_missing.decode(self)) } } fn get_fn_param_names(&self, id: DefIndex) -> Vec { let param_names = match self.kind(id) { - EntryKind::Fn(data) | - EntryKind::ForeignFn(data) => data.decode(self).param_names, + EntryKind::Fn(data) | EntryKind::ForeignFn(data) => data.decode(self).param_names, EntryKind::Method(data) => data.decode(self).fn_data.param_names, _ => Lazy::empty(), }; @@ -1351,8 +1340,7 @@ impl<'a, 'tcx> CrateMetadata { fn get_rendered_const(&self, id: DefIndex) -> String { match self.kind(id) { - EntryKind::Const(_, data) | - EntryKind::AssocConst(_, _, data) => data.decode(self).0, + EntryKind::Const(_, data) | EntryKind::AssocConst(_, _, data) => data.decode(self).0, _ => bug!(), } } @@ -1381,7 +1369,7 @@ impl<'a, 'tcx> CrateMetadata { } fn asyncness(&self, id: DefIndex) -> hir::IsAsync { - match self.kind(id) { + match self.kind(id) { EntryKind::Fn(data) => data.decode(self).asyncness, EntryKind::Method(data) => data.decode(self).fn_data.asyncness, EntryKind::ForeignFn(data) => data.decode(self).asyncness, @@ -1391,19 +1379,17 @@ impl<'a, 'tcx> CrateMetadata { fn is_foreign_item(&self, id: DefIndex) -> bool { match self.kind(id) { - EntryKind::ForeignImmStatic | - EntryKind::ForeignMutStatic | - EntryKind::ForeignFn(_) => true, + EntryKind::ForeignImmStatic | EntryKind::ForeignMutStatic | EntryKind::ForeignFn(_) => { + true + } _ => false, } } fn static_mutability(&self, id: DefIndex) -> Option { match self.kind(id) { - EntryKind::ImmStatic | - EntryKind::ForeignImmStatic => Some(hir::Mutability::Immutable), - EntryKind::MutStatic | - EntryKind::ForeignMutStatic => Some(hir::Mutability::Mutable), + EntryKind::ImmStatic | EntryKind::ForeignImmStatic => Some(hir::Mutability::Not), + EntryKind::MutStatic | EntryKind::ForeignMutStatic => Some(hir::Mutability::Mut), _ => None, } } @@ -1465,63 +1451,74 @@ impl<'a, 'tcx> CrateMetadata { self.source_map_import_info.init_locking(|| { let external_source_map = self.root.source_map.decode(self); - external_source_map.map(|source_file_to_import| { - // We can't reuse an existing SourceFile, so allocate a new one - // containing the information we need. - let syntax_pos::SourceFile { name, - name_was_remapped, - src_hash, - start_pos, - end_pos, - mut lines, - mut multibyte_chars, - mut non_narrow_chars, - mut normalized_pos, - name_hash, - .. } = source_file_to_import; - - let source_length = (end_pos - start_pos).to_usize(); - - // Translate line-start positions and multibyte character - // position into frame of reference local to file. - // `SourceMap::new_imported_source_file()` will then translate those - // coordinates to their new global frame of reference when the - // offset of the SourceFile is known. - for pos in &mut lines { - *pos = *pos - start_pos; - } - for mbc in &mut multibyte_chars { - mbc.pos = mbc.pos - start_pos; - } - for swc in &mut non_narrow_chars { - *swc = *swc - start_pos; - } - for np in &mut normalized_pos { - np.pos = np.pos - start_pos; - } + external_source_map + .map(|source_file_to_import| { + // We can't reuse an existing SourceFile, so allocate a new one + // containing the information we need. + let rustc_span::SourceFile { + name, + name_was_remapped, + src_hash, + start_pos, + end_pos, + mut lines, + mut multibyte_chars, + mut non_narrow_chars, + mut normalized_pos, + name_hash, + .. + } = source_file_to_import; + + let source_length = (end_pos - start_pos).to_usize(); + + // Translate line-start positions and multibyte character + // position into frame of reference local to file. + // `SourceMap::new_imported_source_file()` will then translate those + // coordinates to their new global frame of reference when the + // offset of the SourceFile is known. + for pos in &mut lines { + *pos = *pos - start_pos; + } + for mbc in &mut multibyte_chars { + mbc.pos = mbc.pos - start_pos; + } + for swc in &mut non_narrow_chars { + *swc = *swc - start_pos; + } + for np in &mut normalized_pos { + np.pos = np.pos - start_pos; + } - let local_version = local_source_map.new_imported_source_file(name, - name_was_remapped, - self.cnum.as_u32(), - src_hash, - name_hash, - source_length, - lines, - multibyte_chars, - non_narrow_chars, - normalized_pos); - debug!("CrateMetaData::imported_source_files alloc \ + let local_version = local_source_map.new_imported_source_file( + name, + name_was_remapped, + self.cnum.as_u32(), + src_hash, + name_hash, + source_length, + lines, + multibyte_chars, + non_narrow_chars, + normalized_pos, + ); + debug!( + "CrateMetaData::imported_source_files alloc \ source_file {:?} original (start_pos {:?} end_pos {:?}) \ translated (start_pos {:?} end_pos {:?})", - local_version.name, start_pos, end_pos, - local_version.start_pos, local_version.end_pos); + local_version.name, + start_pos, + end_pos, + local_version.start_pos, + local_version.end_pos + ); - ImportedSourceFile { - original_start_pos: start_pos, - original_end_pos: end_pos, - translated_source_file: local_version, - } - }).collect() + ImportedSourceFile { + original_start_pos: start_pos, + original_end_pos: end_pos, + translated_source_file: local_version, + } + }) + .collect() }) } @@ -1590,10 +1587,6 @@ impl<'a, 'tcx> CrateMetadata { self.root.panic_runtime } - crate fn is_sanitizer_runtime(&self) -> bool { - self.root.sanitizer_runtime - } - crate fn is_profiler_runtime(&self) -> bool { self.root.profiler_runtime } @@ -1633,6 +1626,6 @@ fn macro_kind(raw: &ProcMacro) -> MacroKind { match raw { ProcMacro::CustomDerive { .. } => MacroKind::Derive, ProcMacro::Attr { .. } => MacroKind::Attr, - ProcMacro::Bang { .. } => MacroKind::Bang + ProcMacro::Bang { .. } => MacroKind::Bang, } } diff --git a/src/librustc_metadata/rmeta/decoder/cstore_impl.rs b/src/librustc_metadata/rmeta/decoder/cstore_impl.rs index 4a6b25930c..fb7e5541e2 100644 --- a/src/librustc_metadata/rmeta/decoder/cstore_impl.rs +++ b/src/librustc_metadata/rmeta/decoder/cstore_impl.rs @@ -1,40 +1,39 @@ use crate::creader::{CStore, LoadedMacro}; +use crate::foreign_modules; use crate::link_args; use crate::native_libs; -use crate::foreign_modules; use crate::rmeta::{self, encoder}; -use rustc::ty::query::QueryConfig; +use rustc::hir::exports::Export; +use rustc::hir::map::definitions::DefPathTable; +use rustc::hir::map::{DefKey, DefPath, DefPathHash}; use rustc::middle::cstore::{CrateSource, CrateStore, DepKind, EncodedMetadata, NativeLibraryKind}; use rustc::middle::exported_symbols::ExportedSymbol; use rustc::middle::stability::DeprecationEntry; -use rustc::hir::def; -use rustc::hir; use rustc::session::{CrateDisambiguator, Session}; -use rustc::ty::{self, TyCtxt}; use rustc::ty::query::Providers; -use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE, CRATE_DEF_INDEX}; -use rustc::hir::map::{DefKey, DefPath, DefPathHash}; -use rustc::hir::map::definitions::DefPathTable; -use rustc::util::nodemap::DefIdMap; +use rustc::ty::query::QueryConfig; +use rustc::ty::{self, TyCtxt}; use rustc_data_structures::svh::Svh; -use rustc_parse::source_file_to_stream; +use rustc_hir as hir; +use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_parse::parser::emit_unclosed_delims; +use rustc_parse::source_file_to_stream; +use rustc_data_structures::sync::Lrc; use smallvec::SmallVec; use std::any::Any; -use rustc_data_structures::sync::Lrc; use std::sync::Arc; +use rustc_span::source_map; +use rustc_span::source_map::Spanned; +use rustc_span::symbol::Symbol; +use rustc_span::{FileName, Span}; use syntax::ast; use syntax::attr; -use syntax::source_map; -use syntax::source_map::Spanned; -use syntax::symbol::Symbol; use syntax::expand::allocator::AllocatorKind; use syntax::ptr::P; use syntax::tokenstream::DelimSpan; -use syntax_pos::{Span, FileName}; macro_rules! provide { (<$lt:tt> $tcx:ident, $def_id:ident, $other:ident, $cdata:ident, @@ -78,15 +77,21 @@ trait IntoArgs { } impl IntoArgs for DefId { - fn into_args(self) -> (DefId, DefId) { (self, self) } + fn into_args(self) -> (DefId, DefId) { + (self, self) + } } impl IntoArgs for CrateNum { - fn into_args(self) -> (DefId, DefId) { (self.as_def_id(), self.as_def_id()) } + fn into_args(self) -> (DefId, DefId) { + (self.as_def_id(), self.as_def_id()) + } } impl IntoArgs for (CrateNum, DefId) { - fn into_args(self) -> (DefId, DefId) { (self.0.as_def_id(), self.1) } + fn into_args(self) -> (DefId, DefId) { + (self.0.as_def_id(), self.1) + } } provide! { <'tcx> tcx, def_id, other, cdata, @@ -156,7 +161,6 @@ provide! { <'tcx> tcx, def_id, other, cdata, is_compiler_builtins => { cdata.root.compiler_builtins } has_global_allocator => { cdata.root.has_global_allocator } has_panic_handler => { cdata.root.has_panic_handler } - is_sanitizer_runtime => { cdata.root.sanitizer_runtime } is_profiler_runtime => { cdata.root.profiler_runtime } panic_strategy => { cdata.root.panic_strategy } extern_crate => { @@ -250,19 +254,16 @@ pub fn provide(providers: &mut Providers<'_>) { // therefore no actual inputs, they're just reading tables calculated in // resolve! Does this work? Unsure! That's what the issue is about *providers = Providers { - is_dllimport_foreign_item: |tcx, id| { - match tcx.native_library_kind(id) { - Some(NativeLibraryKind::NativeUnknown) | - Some(NativeLibraryKind::NativeRawDylib) => true, - _ => false, + is_dllimport_foreign_item: |tcx, id| match tcx.native_library_kind(id) { + Some(NativeLibraryKind::NativeUnknown) | Some(NativeLibraryKind::NativeRawDylib) => { + true } + _ => false, }, - is_statically_included_foreign_item: |tcx, id| { - match tcx.native_library_kind(id) { - Some(NativeLibraryKind::NativeStatic) | - Some(NativeLibraryKind::NativeStaticNobundle) => true, - _ => false, - } + is_statically_included_foreign_item: |tcx, id| match tcx.native_library_kind(id) { + Some(NativeLibraryKind::NativeStatic) + | Some(NativeLibraryKind::NativeStaticNobundle) => true, + _ => false, }, native_library_kind: |tcx, id| { tcx.native_libraries(id.krate) @@ -300,8 +301,8 @@ pub fn provide(providers: &mut Providers<'_>) { // sufficiently visible parent (considering modules that re-export the // external item to be parents). visible_parent_map: |tcx, cnum| { - use std::collections::vec_deque::VecDeque; use std::collections::hash_map::Entry; + use std::collections::vec_deque::VecDeque; assert_eq!(cnum, LOCAL_CRATE); let mut visible_parent_map: DefIdMap = Default::default(); @@ -331,41 +332,37 @@ pub fn provide(providers: &mut Providers<'_>) { for &cnum in crates.iter() { // Ignore crates without a corresponding local `extern crate` item. if tcx.missing_extern_crate_item(cnum) { - continue + continue; } - bfs_queue.push_back(DefId { - krate: cnum, - index: CRATE_DEF_INDEX - }); + bfs_queue.push_back(DefId { krate: cnum, index: CRATE_DEF_INDEX }); } // (restrict scope of mutable-borrow of `visible_parent_map`) { let visible_parent_map = &mut visible_parent_map; - let mut add_child = |bfs_queue: &mut VecDeque<_>, - child: &def::Export, - parent: DefId| { - if child.vis != ty::Visibility::Public { - return; - } + let mut add_child = + |bfs_queue: &mut VecDeque<_>, child: &Export, parent: DefId| { + if child.vis != ty::Visibility::Public { + return; + } - if let Some(child) = child.res.opt_def_id() { - match visible_parent_map.entry(child) { - Entry::Occupied(mut entry) => { - // If `child` is defined in crate `cnum`, ensure - // that it is mapped to a parent in `cnum`. - if child.krate == cnum && entry.get().krate != cnum { + if let Some(child) = child.res.opt_def_id() { + match visible_parent_map.entry(child) { + Entry::Occupied(mut entry) => { + // If `child` is defined in crate `cnum`, ensure + // that it is mapped to a parent in `cnum`. + if child.krate == cnum && entry.get().krate != cnum { + entry.insert(parent); + } + } + Entry::Vacant(entry) => { entry.insert(parent); + bfs_queue.push_back(child); } } - Entry::Vacant(entry) => { - entry.insert(parent); - bfs_queue.push_back(child); - } } - } - }; + }; while let Some(def) = bfs_queue.pop_front() { for child in tcx.item_children(def).iter() { @@ -410,11 +407,14 @@ impl CStore { pub fn item_children_untracked( &self, def_id: DefId, - sess: &Session - ) -> Vec> { + sess: &Session, + ) -> Vec> { let mut result = vec![]; - self.get_crate_data(def_id.krate) - .each_child_of_item(def_id.index, |child| result.push(child), sess); + self.get_crate_data(def_id.krate).each_child_of_item( + def_id.index, + |child| result.push(child), + sess, + ); result } @@ -442,24 +442,32 @@ impl CStore { attr::mark_used(attr); } - let name = data.def_key(id.index).disambiguated_data.data - .get_opt_name().expect("no name in load_macro"); - sess.imported_macro_spans.borrow_mut() + let name = data + .def_key(id.index) + .disambiguated_data + .data + .get_opt_name() + .expect("no name in load_macro"); + sess.imported_macro_spans + .borrow_mut() .insert(local_span, (name.to_string(), data.get_span(id.index, sess))); - LoadedMacro::MacroDef(ast::Item { - // FIXME: cross-crate hygiene - ident: ast::Ident::with_dummy_span(name), - id: ast::DUMMY_NODE_ID, - span: local_span, - attrs: attrs.iter().cloned().collect(), - kind: ast::ItemKind::MacroDef(ast::MacroDef { - body: P(ast::MacArgs::Delimited(dspan, ast::MacDelimiter::Brace, body)), - legacy: def.legacy, - }), - vis: source_map::respan(local_span.shrink_to_lo(), ast::VisibilityKind::Inherited), - tokens: None, - }, data.root.edition) + LoadedMacro::MacroDef( + ast::Item { + // FIXME: cross-crate hygiene + ident: ast::Ident::with_dummy_span(name), + id: ast::DUMMY_NODE_ID, + span: local_span, + attrs: attrs.iter().cloned().collect(), + kind: ast::ItemKind::MacroDef(ast::MacroDef { + body: P(ast::MacArgs::Delimited(dspan, ast::MacDelimiter::Brace, body)), + legacy: def.legacy, + }), + vis: source_map::respan(local_span.shrink_to_lo(), ast::VisibilityKind::Inherited), + tokens: None, + }, + data.root.edition, + ) } pub fn associated_item_cloned_untracked(&self, def: DefId) -> ty::AssocItem { @@ -469,6 +477,14 @@ impl CStore { pub fn crate_source_untracked(&self, cnum: CrateNum) -> CrateSource { self.get_crate_data(cnum).source.clone() } + + pub fn get_span_untracked(&self, def_id: DefId, sess: &Session) -> Span { + self.get_crate_data(def_id.krate).get_span(def_id.index, sess) + } + + pub fn item_generics_num_lifetimes(&self, def_id: DefId, sess: &Session) -> usize { + self.get_crate_data(def_id.krate).get_generics(def_id.index, sess).own_counts().lifetimes + } } impl CrateStore for CStore { @@ -476,12 +492,7 @@ impl CrateStore for CStore { self } - fn item_generics_cloned_untracked(&self, def: DefId, sess: &Session) -> ty::Generics { - self.get_crate_data(def.krate).get_generics(def.index, sess) - } - - fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol - { + fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol { self.get_crate_data(cnum).root.name } @@ -489,13 +500,11 @@ impl CrateStore for CStore { self.get_crate_data(cnum).private_dep } - fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator - { + fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator { self.get_crate_data(cnum).root.disambiguator } - fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh - { + fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh { self.get_crate_data(cnum).root.hash } @@ -518,8 +527,7 @@ impl CrateStore for CStore { &self.get_crate_data(cnum).def_path_table } - fn crates_untracked(&self) -> Vec - { + fn crates_untracked(&self) -> Vec { let mut result = vec![]; self.iter_crate_data(|cnum, _| result.push(cnum)); result @@ -529,8 +537,7 @@ impl CrateStore for CStore { encoder::encode_metadata(tcx) } - fn metadata_encoding_version(&self) -> &[u8] - { + fn metadata_encoding_version(&self) -> &[u8] { rmeta::METADATA_HEADER } diff --git a/src/librustc_metadata/rmeta/encoder.rs b/src/librustc_metadata/rmeta/encoder.rs index c1562a7734..9d2bea28c8 100644 --- a/src/librustc_metadata/rmeta/encoder.rs +++ b/src/librustc_metadata/rmeta/encoder.rs @@ -1,31 +1,33 @@ -use crate::rmeta::*; use crate::rmeta::table::FixedSizeEncoding; +use crate::rmeta::*; -use rustc::middle::cstore::{LinkagePreference, NativeLibrary, - EncodedMetadata, ForeignModule}; -use rustc::hir::def::CtorKind; -use rustc::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefIndex, DefId, LocalDefId, LOCAL_CRATE}; -use rustc::hir::{GenericParamKind, AnonConst}; use rustc::hir::map::definitions::DefPathTable; -use rustc_data_structures::fingerprint::Fingerprint; -use rustc_index::vec::Idx; +use rustc::hir::map::Map; +use rustc::middle::cstore::{EncodedMetadata, ForeignModule, LinkagePreference, NativeLibrary}; use rustc::middle::dependency_format::Linkage; -use rustc::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel, - metadata_symbol_name}; +use rustc::middle::exported_symbols::{metadata_symbol_name, ExportedSymbol, SymbolExportLevel}; use rustc::middle::lang_items; use rustc::mir::{self, interpret}; use rustc::traits::specialization_graph; -use rustc::ty::{self, Ty, TyCtxt, SymbolName}; use rustc::ty::codec::{self as ty_codec, TyEncoder}; use rustc::ty::layout::VariantIdx; +use rustc::ty::{self, SymbolName, Ty, TyCtxt}; +use rustc_data_structures::fingerprint::Fingerprint; +use rustc_hir::def::CtorKind; +use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; +use rustc_hir::{AnonConst, GenericParamKind}; +use rustc_index::vec::Idx; use rustc::session::config::{self, CrateType}; -use rustc::util::nodemap::FxHashMap; - +use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::StableHasher; use rustc_data_structures::sync::Lrc; -use rustc_serialize::{Encodable, Encoder, SpecializedEncoder, opaque}; +use rustc_serialize::{opaque, Encodable, Encoder, SpecializedEncoder}; +use log::{debug, trace}; +use rustc_span::source_map::Spanned; +use rustc_span::symbol::{kw, sym, Ident, Symbol}; +use rustc_span::{self, FileName, SourceFile, Span}; use std::hash::Hash; use std::num::NonZeroUsize; use std::path::Path; @@ -33,15 +35,10 @@ use std::u32; use syntax::ast; use syntax::attr; use syntax::expand::is_proc_macro_attr; -use syntax::source_map::Spanned; -use syntax::symbol::{kw, sym, Ident, Symbol}; -use syntax_pos::{self, FileName, SourceFile, Span}; -use log::{debug, trace}; -use rustc::hir::{self, PatKind}; -use rustc::hir::itemlikevisit::ItemLikeVisitor; -use rustc::hir::intravisit::{Visitor, NestedVisitorMap}; -use rustc::hir::intravisit; +use rustc_hir as hir; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_hir::itemlikevisit::ItemLikeVisitor; struct EncodeContext<'tcx> { opaque: opaque::Encoder, @@ -115,7 +112,8 @@ impl<'tcx, T> SpecializedEncoder> for EncodeContext<'tcx> { } impl<'tcx, I: Idx, T> SpecializedEncoder>> for EncodeContext<'tcx> - where Option: FixedSizeEncoding, +where + Option: FixedSizeEncoding, { fn specialized_encode(&mut self, lazy: &Lazy>) -> Result<(), Self::Error> { self.emit_usize(lazy.meta)?; @@ -133,10 +131,7 @@ impl<'tcx> SpecializedEncoder for EncodeContext<'tcx> { impl<'tcx> SpecializedEncoder for EncodeContext<'tcx> { #[inline] fn specialized_encode(&mut self, def_id: &DefId) -> Result<(), Self::Error> { - let DefId { - krate, - index, - } = *def_id; + let DefId { krate, index } = *def_id; krate.encode(self)?; index.encode(self) @@ -153,7 +148,7 @@ impl<'tcx> SpecializedEncoder for EncodeContext<'tcx> { impl<'tcx> SpecializedEncoder for EncodeContext<'tcx> { fn specialized_encode(&mut self, span: &Span) -> Result<(), Self::Error> { if span.is_dummy() { - return TAG_INVALID_SPAN.encode(self) + return TAG_INVALID_SPAN.encode(self); } let span = span.data(); @@ -170,14 +165,14 @@ impl<'tcx> SpecializedEncoder for EncodeContext<'tcx> { if !self.source_file_cache.contains(span.hi) { // Unfortunately, macro expansion still sometimes generates Spans // that malformed in this way. - return TAG_INVALID_SPAN.encode(self) + return TAG_INVALID_SPAN.encode(self); } // HACK(eddyb) there's no way to indicate which crate a Span is coming // from right now, so decoding would fail to find the SourceFile if // it's not local to the crate the Span is found in. if self.source_file_cache.is_imported() { - return TAG_INVALID_SPAN.encode(self) + return TAG_INVALID_SPAN.encode(self); } TAG_VALID_SPAN.encode(self)?; @@ -222,7 +217,7 @@ impl<'tcx> SpecializedEncoder for EncodeContext<'tcx> { self.interpret_allocs_inverse.push(*alloc_id); e.insert(idx); idx - }, + } }; index.encode(self) @@ -230,9 +225,10 @@ impl<'tcx> SpecializedEncoder for EncodeContext<'tcx> { } impl<'tcx> SpecializedEncoder<&'tcx [(ty::Predicate<'tcx>, Span)]> for EncodeContext<'tcx> { - fn specialized_encode(&mut self, - predicates: &&'tcx [(ty::Predicate<'tcx>, Span)]) - -> Result<(), Self::Error> { + fn specialized_encode( + &mut self, + predicates: &&'tcx [(ty::Predicate<'tcx>, Span)], + ) -> Result<(), Self::Error> { ty_codec::encode_spanned_predicates(self, predicates, |ecx| &mut ecx.predicate_shorthands) } } @@ -244,9 +240,7 @@ impl<'tcx> SpecializedEncoder for EncodeContext<'tcx> { } impl<'tcx, T: Encodable> SpecializedEncoder> for EncodeContext<'tcx> { - fn specialized_encode(&mut self, - _: &mir::ClearCrossCrate) - -> Result<(), Self::Error> { + fn specialized_encode(&mut self, _: &mir::ClearCrossCrate) -> Result<(), Self::Error> { Ok(()) } } @@ -275,8 +269,9 @@ impl EncodeContentsForLazy for T { } impl EncodeContentsForLazy<[T]> for I - where I: IntoIterator, - I::Item: EncodeContentsForLazy, +where + I: IntoIterator, + I::Item: EncodeContentsForLazy, { fn encode_contents_for_lazy(self, ecx: &mut EncodeContext<'tcx>) -> usize { self.into_iter().map(|value| value.encode_contents_for_lazy(ecx)).count() @@ -292,7 +287,7 @@ macro_rules! record { let lazy = $self.lazy(value); $self.$tables.$table.set($def_id.index, lazy); } - }} + }}; } impl<'tcx> EncodeContext<'tcx> { @@ -321,10 +316,7 @@ impl<'tcx> EncodeContext<'tcx> { self.emit_usize(distance) } - fn lazy( - &mut self, - value: impl EncodeContentsForLazy, - ) -> Lazy { + fn lazy(&mut self, value: impl EncodeContentsForLazy) -> Lazy { let pos = NonZeroUsize::new(self.position()).unwrap(); assert_eq!(self.lazy_state, LazyState::NoNode); @@ -339,10 +331,10 @@ impl<'tcx> EncodeContext<'tcx> { fn encode_info_for_items(&mut self) { let krate = self.tcx.hir().krate(); - let vis = Spanned { span: syntax_pos::DUMMY_SP, node: hir::VisibilityKind::Public }; + let vis = Spanned { span: rustc_span::DUMMY_SP, node: hir::VisibilityKind::Public }; self.encode_info_for_mod(hir::CRATE_HIR_ID, &krate.module, &krate.attrs, &vis); krate.visit_all_item_likes(&mut self.as_deep_visitor()); - for macro_def in &krate.exported_macros { + for macro_def in krate.exported_macros { self.visit_macro_def(macro_def); } } @@ -352,13 +344,14 @@ impl<'tcx> EncodeContext<'tcx> { self.lazy(definitions.def_path_table()) } - fn encode_source_map(&mut self) -> Lazy<[syntax_pos::SourceFile]> { + fn encode_source_map(&mut self) -> Lazy<[rustc_span::SourceFile]> { let source_map = self.tcx.sess.source_map(); let all_source_files = source_map.files(); let (working_dir, _cwd_remapped) = self.tcx.sess.working_dir.clone(); - let adapted = all_source_files.iter() + let adapted = all_source_files + .iter() .filter(|source_file| { // No need to re-export imported source_files, as any downstream // crate will import them from their original source. @@ -370,7 +363,7 @@ impl<'tcx> EncodeContext<'tcx> { // This path of this SourceFile has been modified by // path-remapping, so we use it verbatim (and avoid // cloning the whole map in the process). - _ if source_file.name_was_remapped => source_file.clone(), + _ if source_file.name_was_remapped => source_file.clone(), // Otherwise expand all paths to absolute paths because // any relative paths are potentially relative to a @@ -384,7 +377,7 @@ impl<'tcx> EncodeContext<'tcx> { hasher.finish::() }; Lrc::new(adapted) - }, + } // expanded code, not from a file _ => source_file.clone(), @@ -472,18 +465,13 @@ impl<'tcx> EncodeContext<'tcx> { let id = self.interpret_allocs_inverse[idx]; let pos = self.position() as u32; interpret_alloc_index.push(pos); - interpret::specialized_encode_alloc_id( - self, - tcx, - id, - ).unwrap(); + interpret::specialized_encode_alloc_id(self, tcx, id).unwrap(); } n = new_n; } self.lazy(interpret_alloc_index) }; - i = self.position(); let per_def = self.per_def.encode(&mut self.opaque); let per_def_bytes = self.position() - i; @@ -493,7 +481,6 @@ impl<'tcx> EncodeContext<'tcx> { let proc_macro_data = self.encode_proc_macros(); let proc_macro_data_bytes = self.position() - i; - let attrs = tcx.hir().krate_attrs(); let has_default_lib_allocator = attr::contains_name(&attrs, sym::default_lib_allocator); @@ -517,7 +504,7 @@ impl<'tcx> EncodeContext<'tcx> { }, proc_macro_data, proc_macro_stability: if is_proc_macro { - tcx.lookup_stability(DefId::local(CRATE_DEF_INDEX)).map(|stab| stab.clone()) + tcx.lookup_stability(DefId::local(CRATE_DEF_INDEX)).map(|stab| *stab) } else { None }, @@ -527,7 +514,6 @@ impl<'tcx> EncodeContext<'tcx> { no_builtins: attr::contains_name(&attrs, sym::no_builtins), panic_runtime: attr::contains_name(&attrs, sym::panic_runtime), profiler_runtime: attr::contains_name(&attrs, sym::profiler_runtime), - sanitizer_runtime: attr::contains_name(&attrs, sym::sanitizer_runtime), symbol_mangling_version: tcx.sess.opts.debugging_opts.symbol_mangling_version, crate_deps, @@ -588,11 +574,7 @@ impl EncodeContext<'tcx> { record!(self.per_def.ty[def_id] <- self.tcx.type_of(def_id)); } - fn encode_enum_variant_info( - &mut self, - enum_did: DefId, - index: VariantIdx, - ) { + fn encode_enum_variant_info(&mut self, enum_did: DefId, index: VariantIdx) { let tcx = self.tcx; let def = tcx.adt_def(enum_did); let variant = &def.variants[index]; @@ -635,11 +617,7 @@ impl EncodeContext<'tcx> { self.encode_promoted_mir(def_id); } - fn encode_enum_variant_ctor( - &mut self, - enum_did: DefId, - index: VariantIdx, - ) { + fn encode_enum_variant_ctor(&mut self, enum_did: DefId, index: VariantIdx) { let tcx = self.tcx; let def = tcx.adt_def(enum_did); let variant = &def.variants[index]; @@ -682,9 +660,9 @@ impl EncodeContext<'tcx> { fn encode_info_for_mod( &mut self, id: hir::HirId, - md: &hir::Mod, + md: &hir::Mod<'_>, attrs: &[ast::Attribute], - vis: &hir::Visibility, + vis: &hir::Visibility<'_>, ) { let tcx = self.tcx; let def_id = tcx.hir().local_def_id(id); @@ -708,12 +686,7 @@ impl EncodeContext<'tcx> { self.encode_deprecation(def_id); } - fn encode_field( - &mut self, - adt_def_id: DefId, - variant_index: VariantIdx, - field_index: usize, - ) { + fn encode_field(&mut self, adt_def_id: DefId, variant_index: VariantIdx, field_index: usize) { let tcx = self.tcx; let variant = &tcx.adt_def(adt_def_id).variants[variant_index]; let field = &variant.fields[field_index]; @@ -727,7 +700,7 @@ impl EncodeContext<'tcx> { record!(self.per_def.kind[def_id] <- EntryKind::Field); record!(self.per_def.visibility[def_id] <- field.vis); record!(self.per_def.span[def_id] <- self.tcx.def_span(def_id)); - record!(self.per_def.attributes[def_id] <- &variant_data.fields()[field_index].attrs); + record!(self.per_def.attributes[def_id] <- variant_data.fields()[field_index].attrs); self.encode_stability(def_id); self.encode_deprecation(def_id); self.encode_item_type(def_id); @@ -759,8 +732,8 @@ impl EncodeContext<'tcx> { // If the structure is marked as non_exhaustive then lower the visibility // to within the crate. - if adt_def.non_enum_variant().is_field_list_non_exhaustive() && - ctor_vis == ty::Visibility::Public + if adt_def.non_enum_variant().is_field_list_non_exhaustive() + && ctor_vis == ty::Visibility::Public { ctor_vis = ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)); } @@ -815,12 +788,9 @@ impl EncodeContext<'tcx> { let trait_item = tcx.associated_item(def_id); let container = match trait_item.defaultness { - hir::Defaultness::Default { has_value: true } => - AssocContainer::TraitWithDefault, - hir::Defaultness::Default { has_value: false } => - AssocContainer::TraitRequired, - hir::Defaultness::Final => - span_bug!(ast_item.span, "traits cannot have final items"), + hir::Defaultness::Default { has_value: true } => AssocContainer::TraitWithDefault, + hir::Defaultness::Default { has_value: false } => AssocContainer::TraitRequired, + hir::Defaultness::Final => span_bug!(ast_item.span, "traits cannot have final items"), }; record!(self.per_def.kind[def_id] <- match trait_item.kind { @@ -864,13 +834,12 @@ impl EncodeContext<'tcx> { }); record!(self.per_def.visibility[def_id] <- trait_item.vis); record!(self.per_def.span[def_id] <- ast_item.span); - record!(self.per_def.attributes[def_id] <- &ast_item.attrs); + record!(self.per_def.attributes[def_id] <- ast_item.attrs); self.encode_stability(def_id); self.encode_const_stability(def_id); self.encode_deprecation(def_id); match trait_item.kind { - ty::AssocKind::Const | - ty::AssocKind::Method => { + ty::AssocKind::Const | ty::AssocKind::Method => { self.encode_item_type(def_id); } ty::AssocKind::Type => { @@ -907,8 +876,9 @@ impl EncodeContext<'tcx> { let container = match impl_item.defaultness { hir::Defaultness::Default { has_value: true } => AssocContainer::ImplDefault, hir::Defaultness::Final => AssocContainer::ImplFinal, - hir::Defaultness::Default { has_value: false } => - span_bug!(ast_item.span, "impl items always have values (currently)"), + hir::Defaultness::Default { has_value: false } => { + span_bug!(ast_item.span, "impl items always have values (currently)") + } }; record!(self.per_def.kind[def_id] <- match impl_item.kind { @@ -945,7 +915,7 @@ impl EncodeContext<'tcx> { }); record!(self.per_def.visibility[def_id] <- impl_item.vis); record!(self.per_def.span[def_id] <- ast_item.span); - record!(self.per_def.attributes[def_id] <- &ast_item.attrs); + record!(self.per_def.attributes[def_id] <- ast_item.attrs); self.encode_stability(def_id); self.encode_const_stability(def_id); self.encode_deprecation(def_id); @@ -961,15 +931,14 @@ impl EncodeContext<'tcx> { hir::ImplItemKind::Const(..) => true, hir::ImplItemKind::Method(ref sig, _) => { let generics = self.tcx.generics_of(def_id); - let needs_inline = (generics.requires_monomorphization(self.tcx) || - tcx.codegen_fn_attrs(def_id).requests_inline()) && - !self.metadata_output_only(); + let needs_inline = (generics.requires_monomorphization(self.tcx) + || tcx.codegen_fn_attrs(def_id).requests_inline()) + && !self.metadata_output_only(); let is_const_fn = sig.header.constness == hir::Constness::Const; let always_encode_mir = self.tcx.sess.opts.debugging_opts.always_encode_mir; needs_inline || is_const_fn || always_encode_mir - }, - hir::ImplItemKind::OpaqueTy(..) | - hir::ImplItemKind::TyAlias(..) => false, + } + hir::ImplItemKind::OpaqueTy(..) | hir::ImplItemKind::TyAlias(..) => false, }; if mir { self.encode_optimized_mir(def_id); @@ -977,15 +946,12 @@ impl EncodeContext<'tcx> { } } - fn encode_fn_param_names_for_body(&mut self, body_id: hir::BodyId) - -> Lazy<[ast::Name]> { + fn encode_fn_param_names_for_body(&mut self, body_id: hir::BodyId) -> Lazy<[ast::Name]> { self.tcx.dep_graph.with_ignore(|| { let body = self.tcx.hir().body(body_id); - self.lazy(body.params.iter().map(|arg| { - match arg.pat.kind { - PatKind::Binding(_, _, ident, _) => ident.name, - _ => kw::Invalid, - } + self.lazy(body.params.iter().map(|arg| match arg.pat.kind { + hir::PatKind::Binding(_, _, ident, _) => ident.name, + _ => kw::Invalid, })) }) } @@ -1048,14 +1014,14 @@ impl EncodeContext<'tcx> { self.lazy(rendered_const) } - fn encode_info_for_item(&mut self, def_id: DefId, item: &'tcx hir::Item) { + fn encode_info_for_item(&mut self, def_id: DefId, item: &'tcx hir::Item<'tcx>) { let tcx = self.tcx; debug!("EncodeContext::encode_info_for_item({:?})", def_id); record!(self.per_def.kind[def_id] <- match item.kind { - hir::ItemKind::Static(_, hir::Mutability::Mutable, _) => EntryKind::MutStatic, - hir::ItemKind::Static(_, hir::Mutability::Immutable, _) => EntryKind::ImmStatic, + hir::ItemKind::Static(_, hir::Mutability::Mut, _) => EntryKind::MutStatic, + hir::ItemKind::Static(_, hir::Mutability::Not, _) => EntryKind::ImmStatic, hir::ItemKind::Const(_, body_id) => { let qualifs = self.tcx.at(item.span).mir_const_qualif(def_id); EntryKind::Const( @@ -1107,7 +1073,7 @@ impl EncodeContext<'tcx> { ctor: None, }), adt_def.repr) } - hir::ItemKind::Impl(_, _, defaultness, ..) => { + hir::ItemKind::Impl { defaultness, .. } => { let trait_ref = self.tcx.impl_trait_ref(def_id); let polarity = self.tcx.impl_polarity(def_id); let parent = if let Some(trait_ref) = trait_ref { @@ -1160,7 +1126,7 @@ impl EncodeContext<'tcx> { record!(self.per_def.visibility[def_id] <- ty::Visibility::from_hir(&item.vis, item.hir_id, tcx)); record!(self.per_def.span[def_id] <- item.span); - record!(self.per_def.attributes[def_id] <- &item.attrs); + record!(self.per_def.attributes[def_id] <- item.attrs); // FIXME(eddyb) there should be a nicer way to do this. match item.kind { hir::ItemKind::ForeignMod(ref fm) => record!(self.per_def.children[def_id] <- @@ -1175,15 +1141,15 @@ impl EncodeContext<'tcx> { v.def_id.index }) ), - hir::ItemKind::Struct(..) | - hir::ItemKind::Union(..) => record!(self.per_def.children[def_id] <- - self.tcx.adt_def(def_id).non_enum_variant().fields.iter().map(|f| { - assert!(f.did.is_local()); - f.did.index - }) - ), - hir::ItemKind::Impl(..) | - hir::ItemKind::Trait(..) => { + hir::ItemKind::Struct(..) | hir::ItemKind::Union(..) => { + record!(self.per_def.children[def_id] <- + self.tcx.adt_def(def_id).non_enum_variant().fields.iter().map(|f| { + assert!(f.did.is_local()); + f.did.index + }) + ) + } + hir::ItemKind::Impl { .. } | hir::ItemKind::Trait(..) => { let associated_item_def_ids = self.tcx.associated_item_def_ids(def_id); record!(self.per_def.children[def_id] <- associated_item_def_ids.iter().map(|&def_id| { @@ -1198,45 +1164,45 @@ impl EncodeContext<'tcx> { self.encode_const_stability(def_id); self.encode_deprecation(def_id); match item.kind { - hir::ItemKind::Static(..) | - hir::ItemKind::Const(..) | - hir::ItemKind::Fn(..) | - hir::ItemKind::TyAlias(..) | - hir::ItemKind::OpaqueTy(..) | - hir::ItemKind::Enum(..) | - hir::ItemKind::Struct(..) | - hir::ItemKind::Union(..) | - hir::ItemKind::Impl(..) => self.encode_item_type(def_id), + hir::ItemKind::Static(..) + | hir::ItemKind::Const(..) + | hir::ItemKind::Fn(..) + | hir::ItemKind::TyAlias(..) + | hir::ItemKind::OpaqueTy(..) + | hir::ItemKind::Enum(..) + | hir::ItemKind::Struct(..) + | hir::ItemKind::Union(..) + | hir::ItemKind::Impl { .. } => self.encode_item_type(def_id), _ => {} } if let hir::ItemKind::Fn(..) = item.kind { record!(self.per_def.fn_sig[def_id] <- tcx.fn_sig(def_id)); } - if let hir::ItemKind::Impl(..) = item.kind { + if let hir::ItemKind::Impl { .. } = item.kind { if let Some(trait_ref) = self.tcx.impl_trait_ref(def_id) { record!(self.per_def.impl_trait_ref[def_id] <- trait_ref); } } self.encode_inherent_implementations(def_id); match item.kind { - hir::ItemKind::Enum(..) | - hir::ItemKind::Struct(..) | - hir::ItemKind::Union(..) | - hir::ItemKind::Fn(..) => self.encode_variances_of(def_id), + hir::ItemKind::Enum(..) + | hir::ItemKind::Struct(..) + | hir::ItemKind::Union(..) + | hir::ItemKind::Fn(..) => self.encode_variances_of(def_id), _ => {} } match item.kind { - hir::ItemKind::Static(..) | - hir::ItemKind::Const(..) | - hir::ItemKind::Fn(..) | - hir::ItemKind::TyAlias(..) | - hir::ItemKind::Enum(..) | - hir::ItemKind::Struct(..) | - hir::ItemKind::Union(..) | - hir::ItemKind::Impl(..) | - hir::ItemKind::OpaqueTy(..) | - hir::ItemKind::Trait(..) | - hir::ItemKind::TraitAlias(..) => { + hir::ItemKind::Static(..) + | hir::ItemKind::Const(..) + | hir::ItemKind::Fn(..) + | hir::ItemKind::TyAlias(..) + | hir::ItemKind::Enum(..) + | hir::ItemKind::Struct(..) + | hir::ItemKind::Union(..) + | hir::ItemKind::Impl { .. } + | hir::ItemKind::OpaqueTy(..) + | hir::ItemKind::Trait(..) + | hir::ItemKind::TraitAlias(..) => { self.encode_generics(def_id); self.encode_explicit_predicates(def_id); self.encode_inferred_outlives(def_id); @@ -1244,8 +1210,7 @@ impl EncodeContext<'tcx> { _ => {} } match item.kind { - hir::ItemKind::Trait(..) | - hir::ItemKind::TraitAlias(..) => { + hir::ItemKind::Trait(..) | hir::ItemKind::TraitAlias(..) => { self.encode_super_predicates(def_id); } _ => {} @@ -1255,10 +1220,9 @@ impl EncodeContext<'tcx> { hir::ItemKind::Static(..) | hir::ItemKind::Const(..) => true, hir::ItemKind::Fn(ref sig, ..) => { let generics = tcx.generics_of(def_id); - let needs_inline = - (generics.requires_monomorphization(tcx) || - tcx.codegen_fn_attrs(def_id).requests_inline()) && - !self.metadata_output_only(); + let needs_inline = (generics.requires_monomorphization(tcx) + || tcx.codegen_fn_attrs(def_id).requests_inline()) + && !self.metadata_output_only(); let always_encode_mir = self.tcx.sess.opts.debugging_opts.always_encode_mir; needs_inline || sig.header.constness == hir::Constness::Const || always_encode_mir } @@ -1271,7 +1235,7 @@ impl EncodeContext<'tcx> { } /// Serialize the text of exported macros - fn encode_info_for_macro_def(&mut self, macro_def: &hir::MacroDef) { + fn encode_info_for_macro_def(&mut self, macro_def: &hir::MacroDef<'_>) { use syntax::print::pprust; let def_id = self.tcx.hir().local_def_id(macro_def.hir_id); record!(self.per_def.kind[def_id] <- EntryKind::MacroDef(self.lazy(MacroDef { @@ -1280,7 +1244,7 @@ impl EncodeContext<'tcx> { }))); record!(self.per_def.visibility[def_id] <- ty::Visibility::Public); record!(self.per_def.span[def_id] <- macro_def.span); - record!(self.per_def.attributes[def_id] <- ¯o_def.attrs); + record!(self.per_def.attributes[def_id] <- macro_def.attrs); self.encode_stability(def_id); self.encode_deprecation(def_id); } @@ -1446,18 +1410,13 @@ impl EncodeContext<'tcx> { fn encode_impls(&mut self) -> Lazy<[TraitImpls]> { debug!("EncodeContext::encode_impls()"); let tcx = self.tcx; - let mut visitor = ImplVisitor { - tcx, - impls: FxHashMap::default(), - }; + let mut visitor = ImplVisitor { tcx, impls: FxHashMap::default() }; tcx.hir().krate().visit_all_item_likes(&mut visitor); let mut all_impls: Vec<_> = visitor.impls.into_iter().collect(); // Bring everything into deterministic order for hashing - all_impls.sort_by_cached_key(|&(trait_def_id, _)| { - tcx.def_path_hash(trait_def_id) - }); + all_impls.sort_by_cached_key(|&(trait_def_id, _)| tcx.def_path_hash(trait_def_id)); let all_impls: Vec<_> = all_impls .into_iter() @@ -1483,24 +1442,23 @@ impl EncodeContext<'tcx> { // middle::reachable module but filters out items that either don't have a // symbol associated with them (they weren't translated) or if they're an FFI // definition (as that's not defined in this crate). - fn encode_exported_symbols(&mut self, - exported_symbols: &[(ExportedSymbol<'tcx>, SymbolExportLevel)]) - -> Lazy<[(ExportedSymbol<'tcx>, SymbolExportLevel)]> { + fn encode_exported_symbols( + &mut self, + exported_symbols: &[(ExportedSymbol<'tcx>, SymbolExportLevel)], + ) -> Lazy<[(ExportedSymbol<'tcx>, SymbolExportLevel)]> { // The metadata symbol name is special. It should not show up in // downstream crates. let metadata_symbol_name = SymbolName::new(&metadata_symbol_name(self.tcx)); - self.lazy(exported_symbols - .iter() - .filter(|&&(ref exported_symbol, _)| { - match *exported_symbol { - ExportedSymbol::NoDefId(symbol_name) => { - symbol_name != metadata_symbol_name - }, + self.lazy( + exported_symbols + .iter() + .filter(|&&(ref exported_symbol, _)| match *exported_symbol { + ExportedSymbol::NoDefId(symbol_name) => symbol_name != metadata_symbol_name, _ => true, - } - }) - .cloned()) + }) + .cloned(), + ) } fn encode_dylib_dependency_formats(&mut self) -> Lazy<[Option]> { @@ -1509,24 +1467,17 @@ impl EncodeContext<'tcx> { if *ty != config::CrateType::Dylib { continue; } - return self.lazy(arr.iter().map(|slot| { - match *slot { - Linkage::NotLinked | - Linkage::IncludedFromDylib => None, + return self.lazy(arr.iter().map(|slot| match *slot { + Linkage::NotLinked | Linkage::IncludedFromDylib => None, - Linkage::Dynamic => Some(LinkagePreference::RequireDynamic), - Linkage::Static => Some(LinkagePreference::RequireStatic), - } + Linkage::Dynamic => Some(LinkagePreference::RequireDynamic), + Linkage::Static => Some(LinkagePreference::RequireStatic), })); } Lazy::empty() } - fn encode_info_for_foreign_item( - &mut self, - def_id: DefId, - nitem: &hir::ForeignItem, - ) { + fn encode_info_for_foreign_item(&mut self, def_id: DefId, nitem: &hir::ForeignItem<'_>) { let tcx = self.tcx; debug!("EncodeContext::encode_info_for_foreign_item({:?})", def_id); @@ -1544,16 +1495,14 @@ impl EncodeContext<'tcx> { }; EntryKind::ForeignFn(self.lazy(data)) } - hir::ForeignItemKind::Static(_, hir::Mutability::Mutable) => - EntryKind::ForeignMutStatic, - hir::ForeignItemKind::Static(_, hir::Mutability::Immutable) => - EntryKind::ForeignImmStatic, + hir::ForeignItemKind::Static(_, hir::Mutability::Mut) => EntryKind::ForeignMutStatic, + hir::ForeignItemKind::Static(_, hir::Mutability::Not) => EntryKind::ForeignImmStatic, hir::ForeignItemKind::Type => EntryKind::ForeignType, }); record!(self.per_def.visibility[def_id] <- ty::Visibility::from_hir(&nitem.vis, nitem.hir_id, self.tcx)); record!(self.per_def.span[def_id] <- nitem.span); - record!(self.per_def.attributes[def_id] <- &nitem.attrs); + record!(self.per_def.attributes[def_id] <- nitem.attrs); self.encode_stability(def_id); self.encode_const_stability(def_id); self.encode_deprecation(def_id); @@ -1570,10 +1519,12 @@ impl EncodeContext<'tcx> { // FIXME(eddyb) make metadata encoding walk over all definitions, instead of HIR. impl Visitor<'tcx> for EncodeContext<'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map(&mut self) -> NestedVisitorMap<'_, Self::Map> { NestedVisitorMap::OnlyBodies(&self.tcx.hir()) } - fn visit_expr(&mut self, ex: &'tcx hir::Expr) { + fn visit_expr(&mut self, ex: &'tcx hir::Expr<'tcx>) { intravisit::walk_expr(self, ex); self.encode_info_for_expr(ex); } @@ -1582,26 +1533,25 @@ impl Visitor<'tcx> for EncodeContext<'tcx> { let def_id = self.tcx.hir().local_def_id(c.hir_id); self.encode_info_for_anon_const(def_id); } - fn visit_item(&mut self, item: &'tcx hir::Item) { + fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { intravisit::walk_item(self, item); let def_id = self.tcx.hir().local_def_id(item.hir_id); match item.kind { - hir::ItemKind::ExternCrate(_) | - hir::ItemKind::Use(..) => {} // ignore these + hir::ItemKind::ExternCrate(_) | hir::ItemKind::Use(..) => {} // ignore these _ => self.encode_info_for_item(def_id, item), } self.encode_addl_info_for_item(item); } - fn visit_foreign_item(&mut self, ni: &'tcx hir::ForeignItem) { + fn visit_foreign_item(&mut self, ni: &'tcx hir::ForeignItem<'tcx>) { intravisit::walk_foreign_item(self, ni); let def_id = self.tcx.hir().local_def_id(ni.hir_id); self.encode_info_for_foreign_item(def_id, ni); } - fn visit_generics(&mut self, generics: &'tcx hir::Generics) { + fn visit_generics(&mut self, generics: &'tcx hir::Generics<'tcx>) { intravisit::walk_generics(self, generics); self.encode_info_for_generics(generics); } - fn visit_macro_def(&mut self, macro_def: &'tcx hir::MacroDef) { + fn visit_macro_def(&mut self, macro_def: &'tcx hir::MacroDef<'tcx>) { self.encode_info_for_macro_def(macro_def); } } @@ -1618,8 +1568,8 @@ impl EncodeContext<'tcx> { } } - fn encode_info_for_generics(&mut self, generics: &hir::Generics) { - for param in &generics.params { + fn encode_info_for_generics(&mut self, generics: &hir::Generics<'tcx>) { + for param in generics.params { let def_id = self.tcx.hir().local_def_id(param.hir_id); match param.kind { GenericParamKind::Lifetime { .. } => continue, @@ -1637,7 +1587,7 @@ impl EncodeContext<'tcx> { } } - fn encode_info_for_expr(&mut self, expr: &hir::Expr) { + fn encode_info_for_expr(&mut self, expr: &hir::Expr<'_>) { match expr.kind { hir::ExprKind::Closure(..) => { let def_id = self.tcx.hir().local_def_id(expr.hir_id); @@ -1651,20 +1601,20 @@ impl EncodeContext<'tcx> { /// encode some sub-items. Usually we want some info from the item /// so it's easier to do that here then to wait until we would encounter /// normally in the visitor walk. - fn encode_addl_info_for_item(&mut self, item: &hir::Item) { + fn encode_addl_info_for_item(&mut self, item: &hir::Item<'_>) { let def_id = self.tcx.hir().local_def_id(item.hir_id); match item.kind { - hir::ItemKind::Static(..) | - hir::ItemKind::Const(..) | - hir::ItemKind::Fn(..) | - hir::ItemKind::Mod(..) | - hir::ItemKind::ForeignMod(..) | - hir::ItemKind::GlobalAsm(..) | - hir::ItemKind::ExternCrate(..) | - hir::ItemKind::Use(..) | - hir::ItemKind::TyAlias(..) | - hir::ItemKind::OpaqueTy(..) | - hir::ItemKind::TraitAlias(..) => { + hir::ItemKind::Static(..) + | hir::ItemKind::Const(..) + | hir::ItemKind::Fn(..) + | hir::ItemKind::Mod(..) + | hir::ItemKind::ForeignMod(..) + | hir::ItemKind::GlobalAsm(..) + | hir::ItemKind::ExternCrate(..) + | hir::ItemKind::Use(..) + | hir::ItemKind::TyAlias(..) + | hir::ItemKind::OpaqueTy(..) + | hir::ItemKind::TraitAlias(..) => { // no sub-item recording needed in these cases } hir::ItemKind::Enum(..) => { @@ -1695,7 +1645,7 @@ impl EncodeContext<'tcx> { hir::ItemKind::Union(..) => { self.encode_fields(def_id); } - hir::ItemKind::Impl(..) => { + hir::ItemKind::Impl { .. } => { for &trait_item_def_id in self.tcx.associated_item_def_ids(def_id).iter() { self.encode_info_for_impl_item(trait_item_def_id); } @@ -1715,21 +1665,18 @@ struct ImplVisitor<'tcx> { } impl<'tcx, 'v> ItemLikeVisitor<'v> for ImplVisitor<'tcx> { - fn visit_item(&mut self, item: &hir::Item) { - if let hir::ItemKind::Impl(..) = item.kind { + fn visit_item(&mut self, item: &hir::Item<'_>) { + if let hir::ItemKind::Impl { .. } = item.kind { let impl_id = self.tcx.hir().local_def_id(item.hir_id); if let Some(trait_ref) = self.tcx.impl_trait_ref(impl_id) { - self.impls - .entry(trait_ref.def_id) - .or_default() - .push(impl_id.index); + self.impls.entry(trait_ref.def_id).or_default().push(impl_id.index); } } } - fn visit_trait_item(&mut self, _trait_item: &'v hir::TraitItem) {} + fn visit_trait_item(&mut self, _trait_item: &'v hir::TraitItem<'v>) {} - fn visit_impl_item(&mut self, _impl_item: &'v hir::ImplItem) { + fn visit_impl_item(&mut self, _impl_item: &'v hir::ImplItem<'v>) { // handled in `visit_item` above } } diff --git a/src/librustc_metadata/rmeta/mod.rs b/src/librustc_metadata/rmeta/mod.rs index e13edc2d62..426ea62b8c 100644 --- a/src/librustc_metadata/rmeta/mod.rs +++ b/src/librustc_metadata/rmeta/mod.rs @@ -1,25 +1,27 @@ use decoder::Metadata; use table::{Table, TableBuilder}; -use rustc::hir; -use rustc::hir::def::{self, CtorKind}; -use rustc::hir::def_id::{DefIndex, DefId}; +use rustc::hir::exports::Export; +use rustc::hir::map; +use rustc::middle::cstore::{DepKind, ForeignModule, LinkagePreference, NativeLibrary}; use rustc::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel}; -use rustc::middle::cstore::{DepKind, LinkagePreference, NativeLibrary, ForeignModule}; use rustc::middle::lang_items; use rustc::mir; -use rustc::session::CrateDisambiguator; use rustc::session::config::SymbolManglingVersion; -use rustc::ty::{self, Ty, ReprOptions}; -use rustc_target::spec::{PanicStrategy, TargetTriple}; -use rustc_index::vec::IndexVec; +use rustc::session::CrateDisambiguator; +use rustc::ty::{self, ReprOptions, Ty}; use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::MetadataRef; +use rustc_hir as hir; +use rustc_hir::def::CtorKind; +use rustc_hir::def_id::{DefId, DefIndex}; +use rustc_index::vec::IndexVec; use rustc_serialize::opaque::Encoder; +use rustc_span::edition::Edition; +use rustc_span::symbol::Symbol; +use rustc_span::{self, Span}; +use rustc_target::spec::{PanicStrategy, TargetTriple}; use syntax::{ast, attr}; -use syntax::edition::Edition; -use syntax::symbol::Symbol; -use syntax_pos::{self, Span}; use std::marker::PhantomData; use std::num::NonZeroUsize; @@ -32,8 +34,7 @@ mod encoder; mod table; crate fn rustc_version() -> String { - format!("rustc {}", - option_env!("CFG_VERSION").unwrap_or("unknown version")) + format!("rustc {}", option_env!("CFG_VERSION").unwrap_or("unknown version")) } /// Metadata encoding version. @@ -46,8 +47,7 @@ const METADATA_VERSION: u8 = 5; /// This header is followed by the position of the `CrateRoot`, /// which is encoded as a 32-bit big-endian unsigned integer, /// and further followed by the rustc version string. -crate const METADATA_HEADER: &[u8; 8] = - &[b'r', b'u', b's', b't', 0, 0, 0, METADATA_VERSION]; +crate const METADATA_HEADER: &[u8; 8] = &[b'r', b'u', b's', b't', 0, 0, 0, METADATA_VERSION]; /// Additional metadata for a `Lazy` where `T` may not be `Sized`, /// e.g. for `Lazy<[T]>`, this is the length (count of `T` values). @@ -106,8 +106,9 @@ impl LazyMeta for [T] { // FIXME(#59875) the `Meta` parameter only exists to dodge // invariance wrt `T` (coming from the `meta: T::Meta` field). struct Lazy::Meta> - where T: ?Sized + LazyMeta, - Meta: 'static + Copy, +where + T: ?Sized + LazyMeta, + Meta: 'static + Copy, { position: NonZeroUsize, meta: Meta, @@ -115,12 +116,8 @@ struct Lazy::Meta> } impl Lazy { - fn from_position_and_meta(position: NonZeroUsize, meta: T::Meta) -> Lazy { - Lazy { - position, - meta, - _marker: PhantomData, - } + fn from_position_and_meta(position: NonZeroUsize, meta: T::Meta) -> Lazy { + Lazy { position, meta, _marker: PhantomData } } } @@ -195,8 +192,8 @@ crate struct CrateRoot<'tcx> { diagnostic_items: Lazy<[(Symbol, DefIndex)]>, native_libraries: Lazy<[NativeLibrary]>, foreign_modules: Lazy<[ForeignModule]>, - source_map: Lazy<[syntax_pos::SourceFile]>, - def_path_table: Lazy, + source_map: Lazy<[rustc_span::SourceFile]>, + def_path_table: Lazy, impls: Lazy<[TraitImpls]>, exported_symbols: Lazy!([(ExportedSymbol<'tcx>, SymbolExportLevel)]), interpret_alloc_index: Lazy<[u32]>, @@ -212,7 +209,6 @@ crate struct CrateRoot<'tcx> { no_builtins: bool, panic_runtime: bool, profiler_runtime: bool, - sanitizer_runtime: bool, symbol_mangling_version: SymbolManglingVersion, } @@ -322,7 +318,7 @@ struct RenderedConst(String); #[derive(RustcEncodable, RustcDecodable)] struct ModData { - reexports: Lazy<[def::Export]>, + reexports: Lazy<[Export]>, } #[derive(RustcEncodable, RustcDecodable)] @@ -365,7 +361,6 @@ struct ImplData { coerce_unsized_info: Option, } - /// Describes whether the container of an associated item /// is a trait or an impl and whether, in a trait, it has /// a default, or an in impl, whether it's marked "default". @@ -380,24 +375,21 @@ enum AssocContainer { impl AssocContainer { fn with_def_id(&self, def_id: DefId) -> ty::AssocItemContainer { match *self { - AssocContainer::TraitRequired | - AssocContainer::TraitWithDefault => ty::TraitContainer(def_id), + AssocContainer::TraitRequired | AssocContainer::TraitWithDefault => { + ty::TraitContainer(def_id) + } - AssocContainer::ImplDefault | - AssocContainer::ImplFinal => ty::ImplContainer(def_id), + AssocContainer::ImplDefault | AssocContainer::ImplFinal => ty::ImplContainer(def_id), } } fn defaultness(&self) -> hir::Defaultness { match *self { - AssocContainer::TraitRequired => hir::Defaultness::Default { - has_value: false, - }, - - AssocContainer::TraitWithDefault | - AssocContainer::ImplDefault => hir::Defaultness::Default { - has_value: true, - }, + AssocContainer::TraitRequired => hir::Defaultness::Default { has_value: false }, + + AssocContainer::TraitWithDefault | AssocContainer::ImplDefault => { + hir::Defaultness::Default { has_value: true } + } AssocContainer::ImplFinal => hir::Defaultness::Final, } diff --git a/src/librustc_metadata/rmeta/table.rs b/src/librustc_metadata/rmeta/table.rs index 10122fbba1..752caff754 100644 --- a/src/librustc_metadata/rmeta/table.rs +++ b/src/librustc_metadata/rmeta/table.rs @@ -1,11 +1,11 @@ use crate::rmeta::*; +use log::debug; use rustc_index::vec::Idx; -use rustc_serialize::{Encodable, opaque::Encoder}; +use rustc_serialize::{opaque::Encoder, Encodable}; use std::convert::TryInto; use std::marker::PhantomData; use std::num::NonZeroUsize; -use log::debug; /// Helper trait, for encoding to, and decoding from, a fixed number of bytes. /// Used mainly for Lazy positions and lengths. @@ -107,8 +107,7 @@ impl FixedSizeEncoding for Option> { } fn write_to_bytes(self, b: &mut [u8]) { - self.map(|lazy| Lazy::::from_position(lazy.position)) - .write_to_bytes(b); + self.map(|lazy| Lazy::::from_position(lazy.position)).write_to_bytes(b); let len = self.map_or(0, |lazy| lazy.meta); let len: u32 = len.try_into().unwrap(); @@ -123,7 +122,10 @@ impl FixedSizeEncoding for Option> { /// A total of `(max_idx + 1) * as FixedSizeEncoding>::BYTE_LEN` bytes /// are used for a table, where `max_idx` is the largest index passed to /// `TableBuilder::set`. -pub(super) struct Table where Option: FixedSizeEncoding { +pub(super) struct Table +where + Option: FixedSizeEncoding, +{ _marker: PhantomData<(fn(&I), T)>, // NOTE(eddyb) this makes `Table` not implement `Sized`, but no // value of `Table` is ever created (it's always behind `Lazy`). @@ -131,7 +133,10 @@ pub(super) struct Table where Option: FixedSizeEncoding { } /// Helper for constructing a table's serialization (also see `Table`). -pub(super) struct TableBuilder where Option: FixedSizeEncoding { +pub(super) struct TableBuilder +where + Option: FixedSizeEncoding, +{ // FIXME(eddyb) use `IndexVec>::BYTE_LEN]>` instead of // `Vec`, once that starts working (i.e. lazy normalization). // Then again, that has the downside of not allowing `TableBuilder::encode` to @@ -140,16 +145,19 @@ pub(super) struct TableBuilder where Option: FixedSizeEncoding { _marker: PhantomData<(fn(&I), T)>, } -impl Default for TableBuilder where Option: FixedSizeEncoding { +impl Default for TableBuilder +where + Option: FixedSizeEncoding, +{ fn default() -> Self { - TableBuilder { - bytes: vec![], - _marker: PhantomData, - } + TableBuilder { bytes: vec![], _marker: PhantomData } } } -impl TableBuilder where Option: FixedSizeEncoding { +impl TableBuilder +where + Option: FixedSizeEncoding, +{ pub(super) fn set(&mut self, i: I, value: T) { // FIXME(eddyb) investigate more compact encodings for sparse tables. // On the PR @michaelwoerister mentioned: @@ -168,14 +176,14 @@ impl TableBuilder where Option: FixedSizeEncoding { pub(super) fn encode(&self, buf: &mut Encoder) -> Lazy> { let pos = buf.position(); buf.emit_raw_bytes(&self.bytes); - Lazy::from_position_and_meta( - NonZeroUsize::new(pos as usize).unwrap(), - self.bytes.len(), - ) + Lazy::from_position_and_meta(NonZeroUsize::new(pos as usize).unwrap(), self.bytes.len()) } } -impl LazyMeta for Table where Option: FixedSizeEncoding { +impl LazyMeta for Table +where + Option: FixedSizeEncoding, +{ type Meta = usize; fn min_size(len: usize) -> usize { @@ -183,14 +191,13 @@ impl LazyMeta for Table where Option: FixedSizeEncoding { } } -impl Lazy> where Option: FixedSizeEncoding { +impl Lazy> +where + Option: FixedSizeEncoding, +{ /// Given the metadata, extract out the value at a particular index (if any). #[inline(never)] - pub(super) fn get<'a, 'tcx, M: Metadata<'a, 'tcx>>( - &self, - metadata: M, - i: I, - ) -> Option { + pub(super) fn get<'a, 'tcx, M: Metadata<'a, 'tcx>>(&self, metadata: M, i: I) -> Option { debug!("Table::lookup: index={:?} len={:?}", i, self.meta); let start = self.position.get(); diff --git a/src/librustc_mir/Cargo.toml b/src/librustc_mir/Cargo.toml index 7e3bd98176..00881e3ea6 100644 --- a/src/librustc_mir/Cargo.toml +++ b/src/librustc_mir/Cargo.toml @@ -10,7 +10,6 @@ path = "lib.rs" doctest = false [dependencies] -arena = { path = "../libarena" } either = "1.5.0" dot = { path = "../libgraphviz", package = "graphviz" } itertools = "0.8" @@ -18,15 +17,15 @@ log = "0.4" log_settings = "0.1.1" polonius-engine = "0.11.0" rustc = { path = "../librustc" } -rustc_target = { path = "../librustc_target" } rustc_data_structures = { path = "../librustc_data_structures" } -rustc_index = { path = "../librustc_index" } rustc_errors = { path = "../librustc_errors" } +rustc_hir = { path = "../librustc_hir" } +rustc_index = { path = "../librustc_index" } rustc_lexer = { path = "../librustc_lexer" } rustc_macros = { path = "../librustc_macros" } rustc_serialize = { path = "../libserialize", package = "serialize" } +rustc_target = { path = "../librustc_target" } syntax = { path = "../libsyntax" } -syntax_pos = { path = "../libsyntax_pos" } +rustc_span = { path = "../librustc_span" } rustc_apfloat = { path = "../librustc_apfloat" } smallvec = { version = "1.0", features = ["union", "may_dangle"] } -rustc_error_codes = { path = "../librustc_error_codes" } diff --git a/src/librustc_mir/borrow_check/borrow_set.rs b/src/librustc_mir/borrow_check/borrow_set.rs index 2980483bfa..9d5cf3ec4b 100644 --- a/src/librustc_mir/borrow_check/borrow_set.rs +++ b/src/librustc_mir/borrow_check/borrow_set.rs @@ -1,15 +1,15 @@ -use crate::borrow_check::place_ext::PlaceExt; use crate::borrow_check::nll::ToRegionVid; use crate::borrow_check::path_utils::allow_two_phase_borrow; +use crate::borrow_check::place_ext::PlaceExt; use crate::dataflow::indexes::BorrowIndex; use crate::dataflow::move_paths::MoveData; use rustc::mir::traversal; -use rustc::mir::visit::{PlaceContext, Visitor, NonUseContext, MutatingUseContext}; -use rustc::mir::{self, Location, Body, Local, ReadOnlyBodyAndCache}; +use rustc::mir::visit::{MutatingUseContext, NonUseContext, PlaceContext, Visitor}; +use rustc::mir::{self, Body, Local, Location, ReadOnlyBodyAndCache}; use rustc::ty::{RegionVid, TyCtxt}; -use rustc::util::nodemap::{FxHashMap, FxHashSet}; -use rustc_index::vec::IndexVec; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_index::bit_set::BitSet; +use rustc_index::vec::IndexVec; use std::fmt; use std::ops::Index; @@ -84,14 +84,14 @@ impl<'tcx> fmt::Display for BorrowData<'tcx> { crate enum LocalsStateAtExit { AllAreInvalidated, - SomeAreInvalidated { has_storage_dead_or_moved: BitSet } + SomeAreInvalidated { has_storage_dead_or_moved: BitSet }, } impl LocalsStateAtExit { fn build( locals_are_invalidated_at_exit: bool, body: ReadOnlyBodyAndCache<'_, 'tcx>, - move_data: &MoveData<'tcx> + move_data: &MoveData<'tcx>, ) -> Self { struct HasStorageDead(BitSet); @@ -106,17 +106,15 @@ impl LocalsStateAtExit { if locals_are_invalidated_at_exit { LocalsStateAtExit::AllAreInvalidated } else { - let mut has_storage_dead - = HasStorageDead(BitSet::new_empty(body.local_decls.len())); + let mut has_storage_dead = HasStorageDead(BitSet::new_empty(body.local_decls.len())); has_storage_dead.visit_body(body); let mut has_storage_dead_or_moved = has_storage_dead.0; for move_out in &move_data.moves { if let Some(index) = move_data.base_local(move_out.path) { has_storage_dead_or_moved.insert(index); - } } - LocalsStateAtExit::SomeAreInvalidated{ has_storage_dead_or_moved } + LocalsStateAtExit::SomeAreInvalidated { has_storage_dead_or_moved } } } } @@ -136,8 +134,11 @@ impl<'tcx> BorrowSet<'tcx> { activation_map: Default::default(), local_map: Default::default(), pending_activations: Default::default(), - locals_state_at_exit: - LocalsStateAtExit::build(locals_are_invalidated_at_exit, body, move_data), + locals_state_at_exit: LocalsStateAtExit::build( + locals_are_invalidated_at_exit, + body, + move_data, + ), }; for (block, block_data) in traversal::preorder(&body) { @@ -154,10 +155,7 @@ impl<'tcx> BorrowSet<'tcx> { } crate fn activations_at_location(&self, location: Location) -> &[BorrowIndex] { - self.activation_map - .get(&location) - .map(|activations| &activations[..]) - .unwrap_or(&[]) + self.activation_map.get(&location).map(|activations| &activations[..]).unwrap_or(&[]) } } @@ -202,28 +200,21 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherBorrows<'a, 'tcx> { region, reserve_location: location, activation_location: TwoPhaseActivation::NotTwoPhase, - borrowed_place: borrowed_place.clone(), - assigned_place: assigned_place.clone(), + borrowed_place: *borrowed_place, + assigned_place: *assigned_place, }; let idx = self.idx_vec.push(borrow); self.location_map.insert(location, idx); self.insert_as_pending_if_two_phase(location, &assigned_place, kind, idx); - if let mir::PlaceBase::Local(local) = borrowed_place.base { - self.local_map.entry(local).or_default().insert(idx); - } + self.local_map.entry(borrowed_place.local).or_default().insert(idx); } self.super_assign(assigned_place, rvalue, location) } - fn visit_local( - &mut self, - temp: &Local, - context: PlaceContext, - location: Location, - ) { + fn visit_local(&mut self, temp: &Local, context: PlaceContext, location: Location) { if !context.is_use() { return; } @@ -237,14 +228,14 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherBorrows<'a, 'tcx> { // Watch out: the use of TMP in the borrow itself // doesn't count as an activation. =) - if borrow_data.reserve_location == location && - context == PlaceContext::MutatingUse(MutatingUseContext::Store) + if borrow_data.reserve_location == location + && context == PlaceContext::MutatingUse(MutatingUseContext::Store) { return; } - if let TwoPhaseActivation::ActivatedAt(other_location) = - borrow_data.activation_location { + if let TwoPhaseActivation::ActivatedAt(other_location) = borrow_data.activation_location + { span_bug!( self.body.source_info(location).span, "found two uses for 2-phase borrow temporary {:?}: \ @@ -264,10 +255,7 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherBorrows<'a, 'tcx> { TwoPhaseActivation::NotActivated, "never found an activation for this borrow!", ); - self.activation_map - .entry(location) - .or_default() - .push(borrow_index); + self.activation_map.entry(location).or_default().push(borrow_index); borrow_data.activation_location = TwoPhaseActivation::ActivatedAt(location); } @@ -290,7 +278,6 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherBorrows<'a, 'tcx> { } impl<'a, 'tcx> GatherBorrows<'a, 'tcx> { - /// If this is a two-phase borrow, then we will record it /// as "pending" until we find the activating use. fn insert_as_pending_if_two_phase( @@ -339,10 +326,14 @@ impl<'a, 'tcx> GatherBorrows<'a, 'tcx> { // assignment. let old_value = self.pending_activations.insert(temp, borrow_index); if let Some(old_index) = old_value { - span_bug!(self.body.source_info(start_location).span, - "found already pending activation for temp: {:?} \ + span_bug!( + self.body.source_info(start_location).span, + "found already pending activation for temp: {:?} \ at borrow_index: {:?} with associated data {:?}", - temp, old_index, self.idx_vec[old_index]); + temp, + old_index, + self.idx_vec[old_index] + ); } } } diff --git a/src/librustc_mir/borrow_check/constraint_generation.rs b/src/librustc_mir/borrow_check/constraint_generation.rs index 28a631a711..0f6a360c79 100644 --- a/src/librustc_mir/borrow_check/constraint_generation.rs +++ b/src/librustc_mir/borrow_check/constraint_generation.rs @@ -2,25 +2,20 @@ use rustc::infer::InferCtxt; use rustc::mir::visit::TyContext; use rustc::mir::visit::Visitor; use rustc::mir::{ - BasicBlock, BasicBlockData, Body, Local, Location, Place, PlaceBase, PlaceRef, ProjectionElem, - Rvalue, SourceInfo, Statement, StatementKind, Terminator, TerminatorKind, UserTypeProjection, + BasicBlock, BasicBlockData, Body, Local, Location, Place, PlaceRef, ProjectionElem, Rvalue, + SourceInfo, Statement, StatementKind, Terminator, TerminatorKind, UserTypeProjection, }; use rustc::ty::fold::TypeFoldable; -use rustc::ty::{self, RegionVid, Ty}; use rustc::ty::subst::SubstsRef; +use rustc::ty::{self, RegionVid, Ty}; use crate::borrow_check::{ - borrow_set::BorrowSet, - location::LocationTable, - nll::ToRegionVid, - facts::AllFacts, - region_infer::values::LivenessValues, - places_conflict, + borrow_set::BorrowSet, facts::AllFacts, location::LocationTable, nll::ToRegionVid, + places_conflict, region_infer::values::LivenessValues, }; pub(super) fn generate_constraints<'cx, 'tcx>( infcx: &InferCtxt<'cx, 'tcx>, - param_env: ty::ParamEnv<'tcx>, liveness_constraints: &mut LivenessValues, all_facts: &mut Option, location_table: &LocationTable, @@ -34,7 +29,6 @@ pub(super) fn generate_constraints<'cx, 'tcx>( location_table, all_facts, body, - param_env, }; for (bb, data) in body.basic_blocks().iter_enumerated() { @@ -45,7 +39,6 @@ pub(super) fn generate_constraints<'cx, 'tcx>( /// 'cg = the duration of the constraint generation process itself. struct ConstraintGeneration<'cg, 'cx, 'tcx> { infcx: &'cg InferCtxt<'cx, 'tcx>, - param_env: ty::ParamEnv<'tcx>, all_facts: &'cg mut Option, location_table: &'cg LocationTable, liveness_constraints: &'cg mut LivenessValues, @@ -80,11 +73,7 @@ impl<'cg, 'cx, 'tcx> Visitor<'tcx> for ConstraintGeneration<'cg, 'cx, 'tcx> { | TyContext::YieldTy(SourceInfo { span, .. }) | TyContext::UserTy(span) | TyContext::LocalDecl { source_info: SourceInfo { span, .. }, .. } => { - span_bug!( - span, - "should not be visiting outside of the CFG: {:?}", - ty_context - ); + span_bug!(span, "should not be visiting outside of the CFG: {:?}", ty_context); } TyContext::Location(location) => { self.add_regular_live_constraint(ty, location); @@ -94,11 +83,7 @@ impl<'cg, 'cx, 'tcx> Visitor<'tcx> for ConstraintGeneration<'cg, 'cx, 'tcx> { self.super_ty(ty); } - fn visit_statement( - &mut self, - statement: &Statement<'tcx>, - location: Location, - ) { + fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) { if let Some(all_facts) = self.all_facts { let _prof_timer = self.infcx.tcx.prof.generic_activity("polonius_fact_generation"); all_facts.cfg_edge.push(( @@ -108,8 +93,7 @@ impl<'cg, 'cx, 'tcx> Visitor<'tcx> for ConstraintGeneration<'cg, 'cx, 'tcx> { all_facts.cfg_edge.push(( self.location_table.mid_index(location), - self.location_table - .start_index(location.successor_within_block()), + self.location_table.start_index(location.successor_within_block()), )); // If there are borrows on this now dead local, we need to record them as `killed`. @@ -127,12 +111,7 @@ impl<'cg, 'cx, 'tcx> Visitor<'tcx> for ConstraintGeneration<'cg, 'cx, 'tcx> { self.super_statement(statement, location); } - fn visit_assign( - &mut self, - place: &Place<'tcx>, - rvalue: &Rvalue<'tcx>, - location: Location, - ) { + fn visit_assign(&mut self, place: &Place<'tcx>, rvalue: &Rvalue<'tcx>, location: Location) { // When we see `X = ...`, then kill borrows of // `(*X).foo` and so forth. self.record_killed_borrows_for_place(place, location); @@ -140,11 +119,7 @@ impl<'cg, 'cx, 'tcx> Visitor<'tcx> for ConstraintGeneration<'cg, 'cx, 'tcx> { self.super_assign(place, rvalue, location); } - fn visit_terminator( - &mut self, - terminator: &Terminator<'tcx>, - location: Location, - ) { + fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) { if let Some(all_facts) = self.all_facts { let _prof_timer = self.infcx.tcx.prof.generic_activity("polonius_fact_generation"); all_facts.cfg_edge.push(( @@ -157,8 +132,7 @@ impl<'cg, 'cx, 'tcx> Visitor<'tcx> for ConstraintGeneration<'cg, 'cx, 'tcx> { for successor_block in successor_blocks { all_facts.cfg_edge.push(( self.location_table.mid_index(location), - self.location_table - .start_index(successor_block.start_location()), + self.location_table.start_index(successor_block.start_location()), )); } } @@ -193,17 +167,12 @@ impl<'cx, 'cg, 'tcx> ConstraintGeneration<'cx, 'cg, 'tcx> { where T: TypeFoldable<'tcx>, { - debug!( - "add_regular_live_constraint(live_ty={:?}, location={:?})", - live_ty, location - ); + debug!("add_regular_live_constraint(live_ty={:?}, location={:?})", live_ty, location); - self.infcx - .tcx - .for_each_free_region(&live_ty, |live_region| { - let vid = live_region.to_region_vid(); - self.liveness_constraints.add_element(vid, location); - }); + self.infcx.tcx.for_each_free_region(&live_ty, |live_region| { + let vid = live_region.to_region_vid(); + self.liveness_constraints.add_element(vid, location); + }); } /// When recording facts for Polonius, records the borrows on the specified place @@ -219,14 +188,8 @@ impl<'cx, 'cg, 'tcx> ConstraintGeneration<'cx, 'cg, 'tcx> { // of the borrows are killed: the ones whose `borrowed_place` // conflicts with the `place`. match place.as_ref() { - PlaceRef { - base: &PlaceBase::Local(local), - projection: &[], - } | - PlaceRef { - base: &PlaceBase::Local(local), - projection: &[ProjectionElem::Deref], - } => { + PlaceRef { local, projection: &[] } + | PlaceRef { local, projection: &[ProjectionElem::Deref] } => { debug!( "Recording `killed` facts for borrows of local={:?} at location={:?}", local, location @@ -236,22 +199,12 @@ impl<'cx, 'cg, 'tcx> ConstraintGeneration<'cx, 'cg, 'tcx> { all_facts, self.borrow_set, self.location_table, - &local, + local, location, ); } - PlaceRef { - base: &PlaceBase::Static(_), - .. - } => { - // Ignore kills of static or static mut variables. - } - - PlaceRef { - base: &PlaceBase::Local(local), - projection: &[.., _], - } => { + PlaceRef { local, projection: &[.., _] } => { // Kill conflicting borrows of the innermost local. debug!( "Recording `killed` facts for borrows of \ @@ -259,11 +212,10 @@ impl<'cx, 'cg, 'tcx> ConstraintGeneration<'cx, 'cg, 'tcx> { local, location ); - if let Some(borrow_indices) = self.borrow_set.local_map.get(&local) { + if let Some(borrow_indices) = self.borrow_set.local_map.get(local) { for &borrow_index in borrow_indices { let places_conflict = places_conflict::places_conflict( self.infcx.tcx, - self.param_env, self.body, &self.borrow_set.borrows[borrow_index].borrowed_place, place, diff --git a/src/librustc_mir/borrow_check/constraints/graph.rs b/src/librustc_mir/borrow_check/constraints/graph.rs index 3e7aa67ef6..c60a11e348 100644 --- a/src/librustc_mir/borrow_check/constraints/graph.rs +++ b/src/librustc_mir/borrow_check/constraints/graph.rs @@ -2,12 +2,12 @@ use rustc::mir::ConstraintCategory; use rustc::ty::RegionVid; use rustc_data_structures::graph; use rustc_index::vec::IndexVec; -use syntax_pos::DUMMY_SP; +use rustc_span::DUMMY_SP; use crate::borrow_check::{ - type_check::Locations, constraints::OutlivesConstraintIndex, - constraints::{OutlivesConstraintSet, OutlivesConstraint}, + constraints::{OutlivesConstraint, OutlivesConstraintSet}, + type_check::Locations, }; /// The construct graph organizes the constraints by their end-points. @@ -78,11 +78,7 @@ impl ConstraintGraph { /// R2` is treated as an edge `R1 -> R2`. We use this graph to /// construct SCCs for region inference but also for error /// reporting. - crate fn new( - direction: D, - set: &OutlivesConstraintSet, - num_region_vars: usize, - ) -> Self { + crate fn new(direction: D, set: &OutlivesConstraintSet, num_region_vars: usize) -> Self { let mut first_constraints = IndexVec::from_elem_n(None, num_region_vars); let mut next_constraints = IndexVec::from_elem(None, &set.outlives); @@ -94,11 +90,7 @@ impl ConstraintGraph { *head = Some(idx); } - Self { - _direction: direction, - first_constraints, - next_constraints, - } + Self { _direction: direction, first_constraints, next_constraints } } /// Given the constraint set from which this graph was built @@ -132,13 +124,7 @@ impl ConstraintGraph { } else { //otherwise, just setup the iterator as normal let first = self.first_constraints[region_sup]; - Edges { - graph: self, - constraints, - pointer: first, - next_static_idx: None, - static_region, - } + Edges { graph: self, constraints, pointer: first, next_static_idx: None, static_region } } } } @@ -160,12 +146,11 @@ impl<'s, D: ConstraintGraphDirecton> Iterator for Edges<'s, D> { Some(self.constraints[p]) } else if let Some(next_static_idx) = self.next_static_idx { - self.next_static_idx = - if next_static_idx == (self.graph.first_constraints.len() - 1) { - None - } else { - Some(next_static_idx + 1) - }; + self.next_static_idx = if next_static_idx == (self.graph.first_constraints.len() - 1) { + None + } else { + Some(next_static_idx + 1) + }; Some(OutlivesConstraint { sup: self.static_region, @@ -198,11 +183,7 @@ impl<'s, D: ConstraintGraphDirecton> RegionGraph<'s, D> { constraint_graph: &'s ConstraintGraph, static_region: RegionVid, ) -> Self { - Self { - set, - constraint_graph, - static_region, - } + Self { set, constraint_graph, static_region } } /// Given a region `R`, iterate over all regions `R1` such that @@ -237,10 +218,7 @@ impl<'s, D: ConstraintGraphDirecton> graph::WithNumNodes for RegionGraph<'s, D> } impl<'s, D: ConstraintGraphDirecton> graph::WithSuccessors for RegionGraph<'s, D> { - fn successors( - &self, - node: Self::Node, - ) -> >::Iter { + fn successors(&self, node: Self::Node) -> >::Iter { self.outgoing_regions(node) } } diff --git a/src/librustc_mir/borrow_check/constraints/mod.rs b/src/librustc_mir/borrow_check/constraints/mod.rs index 96982b604c..ef70b127ac 100644 --- a/src/librustc_mir/borrow_check/constraints/mod.rs +++ b/src/librustc_mir/borrow_check/constraints/mod.rs @@ -1,7 +1,7 @@ use rustc::mir::ConstraintCategory; use rustc::ty::RegionVid; use rustc_data_structures::graph::scc::Sccs; -use rustc_index::vec::{Idx, IndexVec}; +use rustc_index::vec::IndexVec; use std::fmt; use std::ops::Index; @@ -93,11 +93,7 @@ pub struct OutlivesConstraint { impl fmt::Debug for OutlivesConstraint { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - formatter, - "({:?}: {:?}) due to {:?}", - self.sup, self.sub, self.locations - ) + write!(formatter, "({:?}: {:?}) due to {:?}", self.sup, self.sub, self.locations) } } diff --git a/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs b/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs index d2aaee4d20..521657ea49 100644 --- a/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs +++ b/src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs @@ -1,33 +1,30 @@ -use rustc::hir; -use rustc::hir::def_id::DefId; -use rustc::hir::{AsyncGeneratorKind, GeneratorKind}; use rustc::mir::{ self, AggregateKind, BindingForm, BorrowKind, ClearCrossCrate, ConstraintCategory, - FakeReadCause, Local, LocalDecl, LocalInfo, LocalKind, Location, Operand, Place, PlaceBase, - PlaceRef, ProjectionElem, Rvalue, Statement, StatementKind, TerminatorKind, VarBindingForm, + FakeReadCause, Local, LocalDecl, LocalInfo, LocalKind, Location, Operand, Place, PlaceRef, + ProjectionElem, Rvalue, Statement, StatementKind, TerminatorKind, VarBindingForm, }; -use rustc::ty::{self, Ty}; use rustc::traits::error_reporting::suggest_constraining_type_param; +use rustc::ty::{self, Ty}; use rustc_data_structures::fx::FxHashSet; -use rustc_index::vec::Idx; use rustc_errors::{Applicability, DiagnosticBuilder}; -use syntax_pos::Span; -use syntax::source_map::DesugaringKind; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::{AsyncGeneratorKind, GeneratorKind}; +use rustc_index::vec::Idx; +use rustc_span::source_map::DesugaringKind; +use rustc_span::Span; use crate::dataflow::drop_flag_effects; -use crate::dataflow::indexes::{MovePathIndex, MoveOutIndex}; +use crate::dataflow::indexes::{MoveOutIndex, MovePathIndex}; use crate::util::borrowck_errors; use crate::borrow_check::{ - prefixes::IsPrefixOf, - WriteKind, - borrow_set::BorrowData, - MirBorrowckCtxt, InitializationRequiringAction, PrefixSet + borrow_set::BorrowData, prefixes::IsPrefixOf, InitializationRequiringAction, MirBorrowckCtxt, + PrefixSet, WriteKind, }; use super::{ - IncludingDowncast, UseSpans, RegionName, RegionNameSource, - explain_borrow::BorrowExplanation, + explain_borrow::BorrowExplanation, IncludingDowncast, RegionName, RegionNameSource, UseSpans, }; #[derive(Debug)] @@ -38,7 +35,7 @@ struct MoveSite { /// `true` if we traversed a back edge while walking from the point /// of error to the move site. - traversed_back_edge: bool + traversed_back_edge: bool, } /// Which case a StorageDeadOrDrop is for. @@ -63,19 +60,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { location, desired_action, moved_place, used_place, span, mpi ); - let use_spans = self.move_spans(moved_place, location) - .or_else(|| self.borrow_spans(span, location)); + let use_spans = + self.move_spans(moved_place, location).or_else(|| self.borrow_spans(span, location)); let span = use_spans.args_or_use(); let move_site_vec = self.get_moved_indexes(location, mpi); - debug!( - "report_use_of_moved_or_uninitialized: move_site_vec={:?}", - move_site_vec - ); - let move_out_indices: Vec<_> = move_site_vec - .iter() - .map(|move_site| move_site.moi) - .collect(); + debug!("report_use_of_moved_or_uninitialized: move_site_vec={:?}", move_site_vec); + let move_out_indices: Vec<_> = + move_site_vec.iter().map(|move_site| move_site.moi).collect(); if move_out_indices.is_empty() { let root_place = PlaceRef { projection: &[], ..used_place }; @@ -88,15 +80,16 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { return; } - let item_msg = match self.describe_place_with_options(used_place, - IncludingDowncast(true)) { - Some(name) => format!("`{}`", name), - None => "value".to_owned(), - }; + let item_msg = + match self.describe_place_with_options(used_place, IncludingDowncast(true)) { + Some(name) => format!("`{}`", name), + None => "value".to_owned(), + }; let mut err = self.cannot_act_on_uninitialized_variable( span, desired_action.as_noun(), - &self.describe_place_with_options(moved_place, IncludingDowncast(true)) + &self + .describe_place_with_options(moved_place, IncludingDowncast(true)) .unwrap_or_else(|| "_".to_owned()), ); err.span_label(span, format!("use of possibly-uninitialized {}", item_msg)); @@ -109,9 +102,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { err.buffer(&mut self.errors_buffer); } else { if let Some((reported_place, _)) = self.move_error_reported.get(&move_out_indices) { - if self.prefixes(*reported_place, PrefixSet::All) - .any(|p| p == used_place) - { + if self.prefixes(*reported_place, PrefixSet::All).any(|p| p == used_place) { debug!( "report_use_of_moved_or_uninitialized place: error suppressed \ mois={:?}", @@ -130,18 +121,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { self.describe_place_with_options(moved_place, IncludingDowncast(true)), ); - self.add_moved_or_invoked_closure_note( - location, - used_place, - &mut err, - ); + self.add_moved_or_invoked_closure_note(location, used_place, &mut err); let mut is_loop_move = false; let is_partial_move = move_site_vec.iter().any(|move_site| { let move_out = self.move_data.moves[(*move_site).moi]; let moved_place = &self.move_data.move_paths[move_out.path].place; - used_place != moved_place.as_ref() - && used_place.is_prefix_of(moved_place.as_ref()) + used_place != moved_place.as_ref() && used_place.is_prefix_of(moved_place.as_ref()) }); for move_site in &move_site_vec { let move_out = self.move_data.moves[(*move_site).moi]; @@ -150,11 +136,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let move_spans = self.move_spans(moved_place.as_ref(), move_out.source); let move_span = move_spans.args_or_use(); - let move_msg = if move_spans.for_closure() { - " into closure" - } else { - "" - }; + let move_msg = if move_spans.for_closure() { " into closure" } else { "" }; if span == move_span { err.span_label( @@ -165,10 +147,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } else if move_site.traversed_back_edge { err.span_label( move_span, - format!( - "value moved{} here, in previous iteration of loop", - move_msg - ), + format!("value moved{} here, in previous iteration of loop", move_msg), ); } else { err.span_label(move_span, format!("value moved{} here", move_msg)); @@ -206,12 +185,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ); } - let ty = Place::ty_from( - used_place.base, - used_place.projection, - *self.body, - self.infcx.tcx - ).ty; + let ty = + Place::ty_from(used_place.local, used_place.projection, *self.body, self.infcx.tcx) + .ty; let needs_note = match ty.kind { ty::Closure(id, _) => { let tables = self.infcx.tcx.typeck_tables_of(id); @@ -238,7 +214,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let generics = tcx.generics_of(self.mir_def_id); let param = generics.type_param(¶m_ty, tcx); if let Some(generics) = - tcx.hir().get_generics(tcx.closure_base_def_id(self.mir_def_id)) { + tcx.hir().get_generics(tcx.closure_base_def_id(self.mir_def_id)) + { suggest_constraining_type_param( generics, &mut err, @@ -255,16 +232,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } else { None }; - self.note_type_does_not_implement_copy( - &mut err, - ¬e_msg, - ty, - span, - ); + self.note_type_does_not_implement_copy(&mut err, ¬e_msg, ty, span); } - if let Some((_, mut old_err)) = self.move_error_reported - .insert(move_out_indices, (used_place, err)) + if let Some((_, mut old_err)) = + self.move_error_reported.insert(move_out_indices, (used_place, err)) { // Cancel the old error so it doesn't ICE. old_err.cancel(); @@ -306,26 +278,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { borrow_spans.var_span_label( &mut err, - format!("borrow occurs due to use{}", borrow_spans.describe()) + format!("borrow occurs due to use{}", borrow_spans.describe()), ); - move_spans.var_span_label( - &mut err, - format!("move occurs due to use{}", move_spans.describe()) - ); + move_spans + .var_span_label(&mut err, format!("move occurs due to use{}", move_spans.describe())); - self.explain_why_borrow_contains_point( - location, - borrow, - None, - ).add_explanation_to_diagnostic( - self.infcx.tcx, - &self.body, - &self.local_names, - &mut err, - "", - Some(borrow_span), - ); + self.explain_why_borrow_contains_point(location, borrow, None) + .add_explanation_to_diagnostic( + self.infcx.tcx, + &self.body, + &self.local_names, + &mut err, + "", + Some(borrow_span), + ); err.buffer(&mut self.errors_buffer); } @@ -347,14 +314,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { span, &self.describe_place(place.as_ref()).unwrap_or_else(|| "_".to_owned()), borrow_span, - &self.describe_place(borrow.borrowed_place.as_ref()) - .unwrap_or_else(|| "_".to_owned()), + &self.describe_place(borrow.borrowed_place.as_ref()).unwrap_or_else(|| "_".to_owned()), ); borrow_spans.var_span_label(&mut err, { let place = &borrow.borrowed_place; - let desc_place = - self.describe_place(place.as_ref()).unwrap_or_else(|| "_".to_owned()); + let desc_place = self.describe_place(place.as_ref()).unwrap_or_else(|| "_".to_owned()); format!("borrow occurs due to use of `{}`{}", desc_place, borrow_spans.describe()) }); @@ -394,18 +359,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { self.describe_place_for_conflicting_borrow(place, &issued_borrow.borrowed_place); let explanation = self.explain_why_borrow_contains_point(location, issued_borrow, None); - let second_borrow_desc = if explanation.is_explained() { - "second " - } else { - "" - }; + let second_borrow_desc = if explanation.is_explained() { "second " } else { "" }; // FIXME: supply non-"" `opt_via` when appropriate let first_borrow_desc; - let mut err = match ( - gen_borrow_kind, - issued_borrow.kind, - ) { + let mut err = match (gen_borrow_kind, issued_borrow.kind) { (BorrowKind::Shared, BorrowKind::Mut { .. }) => { first_borrow_desc = "mutable "; self.cannot_reborrow_already_borrowed( @@ -449,19 +407,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { (BorrowKind::Unique, BorrowKind::Unique) => { first_borrow_desc = "first "; - self.cannot_uniquely_borrow_by_two_closures( - span, - &desc_place, - issued_span, - None, - ) + self.cannot_uniquely_borrow_by_two_closures(span, &desc_place, issued_span, None) } (BorrowKind::Mut { .. }, BorrowKind::Shallow) | (BorrowKind::Unique, BorrowKind::Shallow) => { - if let Some(immutable_section_description) = self.classify_immutable_section( - &issued_borrow.assigned_place, - ) { + if let Some(immutable_section_description) = + self.classify_immutable_section(&issued_borrow.assigned_place) + { let mut err = self.cannot_mutate_in_immutable_section( span, issued_span, @@ -507,7 +460,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { "", None, ) - }, + } (BorrowKind::Shared, BorrowKind::Unique) => { first_borrow_desc = "first "; @@ -554,8 +507,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ); } else { let borrow_place = &issued_borrow.borrowed_place; - let borrow_place_desc = self.describe_place(borrow_place.as_ref()) - .unwrap_or_else(|| "_".to_owned()); + let borrow_place_desc = + self.describe_place(borrow_place.as_ref()).unwrap_or_else(|| "_".to_owned()); issued_spans.var_span_label( &mut err, format!( @@ -625,12 +578,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // Define a small closure that we can use to check if the type of a place // is a union. let union_ty = |place_base, place_projection| { - let ty = Place::ty_from( - place_base, - place_projection, - *self.body, - self.infcx.tcx - ).ty; + let ty = Place::ty_from(place_base, place_projection, *self.body, self.infcx.tcx).ty; ty.ty_adt_def().filter(|adt| adt.is_union()).map(|_| ty) }; let describe_place = |place| self.describe_place(place).unwrap_or_else(|| "_".to_owned()); @@ -649,23 +597,17 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // field access to a union. If we find that, then we will keep the place of the // union being accessed and the field that was being accessed so we can check the // second borrowed place for the same union and a access to a different field. - let Place { - base, - projection, - } = first_borrowed_place; + let Place { local, projection } = first_borrowed_place; let mut cursor = projection.as_ref(); while let [proj_base @ .., elem] = cursor { cursor = proj_base; match elem { - ProjectionElem::Field(field, _) if union_ty(base, proj_base).is_some() => { - return Some((PlaceRef { - base: base, - projection: proj_base, - }, field)); - }, - _ => {}, + ProjectionElem::Field(field, _) if union_ty(local, proj_base).is_some() => { + return Some((PlaceRef { local, projection: proj_base }, field)); + } + _ => {} } } None @@ -673,25 +615,22 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { .and_then(|(target_base, target_field)| { // With the place of a union and a field access into it, we traverse the second // borrowed place and look for a access to a different field of the same union. - let Place { - base, - projection, - } = second_borrowed_place; + let Place { local, projection } = second_borrowed_place; let mut cursor = projection.as_ref(); while let [proj_base @ .., elem] = cursor { cursor = proj_base; if let ProjectionElem::Field(field, _) = elem { - if let Some(union_ty) = union_ty(base, proj_base) { + if let Some(union_ty) = union_ty(local, proj_base) { if field != target_field - && base == target_base.base - && proj_base == target_base.projection { + && local == target_base.local + && proj_base == target_base.projection + { // FIXME when we avoid clone reuse describe_place closure - let describe_base_place = self.describe_place(PlaceRef { - base: base, - projection: proj_base, - }).unwrap_or_else(|| "_".to_owned()); + let describe_base_place = self + .describe_place(PlaceRef { local, projection: proj_base }) + .unwrap_or_else(|| "_".to_owned()); return Some(( describe_base_place, @@ -740,27 +679,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ); let drop_span = place_span.1; - let root_place = self.prefixes(borrow.borrowed_place.as_ref(), PrefixSet::All) - .last() - .unwrap(); + let root_place = + self.prefixes(borrow.borrowed_place.as_ref(), PrefixSet::All).last().unwrap(); let borrow_spans = self.retrieve_borrow_spans(borrow); let borrow_span = borrow_spans.var_or_use(); assert!(root_place.projection.is_empty()); - let proper_span = match root_place.base { - PlaceBase::Local(local) => self.body.local_decls[*local].source_info.span, - _ => drop_span, - }; + let proper_span = self.body.local_decls[*root_place.local].source_info.span; let root_place_projection = self.infcx.tcx.intern_place_elems(root_place.projection); - if self.access_place_error_reported - .contains(&(Place { - base: root_place.base.clone(), - projection: root_place_projection, - }, borrow_span)) - { + if self.access_place_error_reported.contains(&( + Place { local: *root_place.local, projection: root_place_projection }, + borrow_span, + )) { debug!( "suppressing access_place error when borrow doesn't live long enough for {:?}", borrow_span @@ -768,22 +701,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { return; } - self.access_place_error_reported - .insert((Place { - base: root_place.base.clone(), - projection: root_place_projection, - }, borrow_span)); + self.access_place_error_reported.insert(( + Place { local: *root_place.local, projection: root_place_projection }, + borrow_span, + )); - if let PlaceBase::Local(local) = borrow.borrowed_place.base { - if self.body.local_decls[local].is_ref_to_thread_local() { - let err = self.report_thread_local_value_does_not_live_long_enough( - drop_span, - borrow_span, - ); - err.buffer(&mut self.errors_buffer); - return; - } - }; + let borrowed_local = borrow.borrowed_place.local; + if self.body.local_decls[borrowed_local].is_ref_to_thread_local() { + let err = + self.report_thread_local_value_does_not_live_long_enough(drop_span, borrow_span); + err.buffer(&mut self.errors_buffer); + return; + } if let StorageDeadOrDrop::Destructor(dropped_ty) = self.classify_drop_access_kind(borrow.borrowed_place.as_ref()) @@ -807,8 +736,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { debug!( "report_borrowed_value_does_not_live_long_enough(place_desc: {:?}, explanation: {:?})", - place_desc, - explanation + place_desc, explanation ); let err = match (place_desc, explanation) { // If the outlives constraint comes from inside the closure, @@ -856,7 +784,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { span, .. }, - ) if borrow_spans.for_generator() => self.report_escaping_closure_capture( borrow_spans, borrow_span, @@ -870,10 +797,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { BorrowExplanation::MustBeValidFor { category: ConstraintCategory::Assignment, from_closure: false, - region_name: RegionName { - source: RegionNameSource::AnonRegionFromUpvar(upvar_span, ref upvar_name), - .. - }, + region_name: + RegionName { + source: + RegionNameSource::AnonRegionFromUpvar(upvar_span, ref upvar_name), + .. + }, span, .. }, @@ -922,7 +851,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ref opt_place_desc, from_closure: false, .. - } = explanation { + } = explanation + { if let Some(diag) = self.try_report_cannot_return_reference_to_local( borrow, borrow_span, @@ -934,10 +864,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } } - let mut err = self.path_does_not_live_long_enough( - borrow_span, - &format!("`{}`", name), - ); + let mut err = self.path_does_not_live_long_enough(borrow_span, &format!("`{}`", name)); if let Some(annotation) = self.annotate_argument_and_return_for_borrow(borrow) { let region_name = annotation.emit(self, &mut err); @@ -1003,24 +930,20 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } } else { err.span_label(borrow_span, "borrowed value does not live long enough"); - err.span_label( - drop_span, - format!("`{}` dropped here while still borrowed", name), - ); + err.span_label(drop_span, format!("`{}` dropped here while still borrowed", name)); - let within = if borrow_spans.for_generator() { - " by generator" - } else { - "" - }; + let within = if borrow_spans.for_generator() { " by generator" } else { "" }; - borrow_spans.args_span_label( - &mut err, - format!("value captured here{}", within), - ); + borrow_spans.args_span_label(&mut err, format!("value captured here{}", within)); explanation.add_explanation_to_diagnostic( - self.infcx.tcx, &self.body, &self.local_names, &mut err, "", None); + self.infcx.tcx, + &self.body, + &self.local_names, + &mut err, + "", + None, + ); } err @@ -1129,12 +1052,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { location, borrow, drop_span, proper_span ); - if let BorrowExplanation::MustBeValidFor { - category, - span, - from_closure: false, - .. - } = explanation { + if let BorrowExplanation::MustBeValidFor { category, span, from_closure: false, .. } = + explanation + { if let Some(diag) = self.try_report_cannot_return_reference_to_local( borrow, proper_span, @@ -1147,14 +1067,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } let mut err = self.temporary_value_borrowed_for_too_long(proper_span); - err.span_label( - proper_span, - "creates a temporary which is freed while still in use", - ); - err.span_label( - drop_span, - "temporary value is freed at the end of this statement", - ); + err.span_label(proper_span, "creates a temporary which is freed while still in use"); + err.span_label(drop_span, "temporary value is freed at the end of this statement"); match explanation { BorrowExplanation::UsedLater(..) @@ -1174,16 +1088,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { None, ); - let within = if borrow_spans.for_generator() { - " by generator" - } else { - "" - }; + let within = if borrow_spans.for_generator() { " by generator" } else { "" }; - borrow_spans.args_span_label( - &mut err, - format!("value captured here{}", within), - ); + borrow_spans.args_span_label(&mut err, format!("value captured here{}", within)); err } @@ -1203,27 +1110,23 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { }; // FIXME use a better heuristic than Spans - let reference_desc - = if return_span == self.body.source_info(borrow.reserve_location).span { - "reference to" - } else { - "value referencing" - }; + let reference_desc = if return_span == self.body.source_info(borrow.reserve_location).span { + "reference to" + } else { + "value referencing" + }; let (place_desc, note) = if let Some(place_desc) = opt_place_desc { let local_kind = if let Some(local) = borrow.borrowed_place.as_local() { match self.body.local_kind(local) { - LocalKind::ReturnPointer - | LocalKind::Temp => bug!("temporary or return pointer with a name"), + LocalKind::ReturnPointer | LocalKind::Temp => { + bug!("temporary or return pointer with a name") + } LocalKind::Var => "local variable ", - LocalKind::Arg - if !self.upvars.is_empty() - && local == Local::new(1) => { + LocalKind::Arg if !self.upvars.is_empty() && local == Local::new(1) => { "variable captured by `move` " } - LocalKind::Arg => { - "function parameter " - } + LocalKind::Arg => "function parameter ", } } else { "local data " @@ -1233,31 +1136,20 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { format!("`{}` is borrowed here", place_desc), ) } else { - let root_place = self.prefixes(borrow.borrowed_place.as_ref(), - PrefixSet::All) - .last() - .unwrap(); - let local = if let PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } = root_place { - local - } else { - bug!("try_report_cannot_return_reference_to_local: not a local") - }; + let root_place = + self.prefixes(borrow.borrowed_place.as_ref(), PrefixSet::All).last().unwrap(); + let local = root_place.local; match self.body.local_kind(*local) { - LocalKind::ReturnPointer | LocalKind::Temp => ( - "temporary value".to_string(), - "temporary value created here".to_string(), - ), + LocalKind::ReturnPointer | LocalKind::Temp => { + ("temporary value".to_string(), "temporary value created here".to_string()) + } LocalKind::Arg => ( "function parameter".to_string(), "function parameter borrowed here".to_string(), ), - LocalKind::Var => ( - "local binding".to_string(), - "local binding introduced here".to_string(), - ), + LocalKind::Var => { + ("local binding".to_string(), "local binding introduced here".to_string()) + } } }; @@ -1286,11 +1178,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ) -> DiagnosticBuilder<'cx> { let tcx = self.infcx.tcx; let args_span = use_span.args_or_use(); - let mut err = self.cannot_capture_in_long_lived_closure( - args_span, - captured_var, - var_span, - ); + let mut err = self.cannot_capture_in_long_lived_closure(args_span, captured_var, var_span); let suggestion = match tcx.sess.source_map().span_to_snippet(args_span) { Ok(mut string) => { @@ -1302,8 +1190,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { string.insert_str(0, "move "); }; string - }, - Err(_) => "move || ".to_string() + } + Err(_) => "move || ".to_string(), }; let kind = match use_span.generator_kind() { Some(generator_kind) => match generator_kind { @@ -1313,7 +1201,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { _ => bug!("async block/closure expected, but async funtion found."), }, GeneratorKind::Gen => "generator", - } + }, None => "closure", }; err.span_suggestion( @@ -1321,8 +1209,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { &format!( "to force the {} to take ownership of {} (and any \ other referenced variables), use the `move` keyword", - kind, - captured_var + kind, captured_var ), suggestion, Applicability::MachineApplicable, @@ -1335,8 +1222,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { fr_name.highlight_region_name(&mut err); format!("function requires argument type to outlive `{}`", fr_name) } - _ => bug!("report_escaping_closure_capture called with unexpected constraint \ - category: `{:?}`", category), + _ => bug!( + "report_escaping_closure_capture called with unexpected constraint \ + category: `{:?}`", + category + ), }; err.span_note(constraint_span, &msg); err @@ -1364,27 +1254,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { "function" }; - let mut err = borrowck_errors::borrowed_data_escapes_closure( - tcx, - escape_span, - escapes_from, - ); + let mut err = + borrowck_errors::borrowed_data_escapes_closure(tcx, escape_span, escapes_from); err.span_label( upvar_span, - format!( - "`{}` is declared here, outside of the {} body", - upvar_name, escapes_from - ), + format!("`{}` is declared here, outside of the {} body", upvar_name, escapes_from), ); - err.span_label( - borrow_span, - format!( - "borrow is only valid in the {} body", - escapes_from - ), - ); + err.span_label(borrow_span, format!("borrow is only valid in the {} body", escapes_from)); if let Some(name) = name { err.span_label( @@ -1422,10 +1300,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } // check for moves - let stmt_kind = self.body[location.block] - .statements - .get(location.statement_index) - .map(|s| &s.kind); + let stmt_kind = + self.body[location.block].statements.get(location.statement_index).map(|s| &s.kind); if let Some(StatementKind::StorageDead(..)) = stmt_kind { // this analysis only tries to find moves explicitly // written by the user, so we ignore the move-outs @@ -1447,10 +1323,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { debug!("report_use_of_moved_or_uninitialized: moi={:?}", moi); if mpis.contains(&self.move_data.moves[*moi].path) { debug!("report_use_of_moved_or_uninitialized: found"); - result.push(MoveSite { - moi: *moi, - traversed_back_edge: is_back_edge, - }); + result.push(MoveSite { moi: *moi, traversed_back_edge: is_back_edge }); // Strictly speaking, we could continue our DFS here. There may be // other moves that can reach the point of error. But it is kind of @@ -1534,21 +1407,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { &self.describe_place(place.as_ref()).unwrap_or_else(|| "_".to_owned()), ); - loan_spans.var_span_label( + loan_spans + .var_span_label(&mut err, format!("borrow occurs due to use{}", loan_spans.describe())); + + self.explain_why_borrow_contains_point(location, loan, None).add_explanation_to_diagnostic( + self.infcx.tcx, + &self.body, + &self.local_names, &mut err, - format!("borrow occurs due to use{}", loan_spans.describe()), + "", + None, ); - self.explain_why_borrow_contains_point(location, loan, None) - .add_explanation_to_diagnostic( - self.infcx.tcx, - &self.body, - &self.local_names, - &mut err, - "", - None, - ); - err.buffer(&mut self.errors_buffer); } @@ -1578,25 +1448,17 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // PATTERN;) then make the error refer to that local, rather than the // place being assigned later. let (place_description, assigned_span) = match local_decl { - Some(LocalDecl { - local_info: LocalInfo::User(ClearCrossCrate::Clear), - .. - }) - | Some(LocalDecl { - local_info: LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm { - opt_match_place: None, - .. - }))), - .. - }) - | Some(LocalDecl { - local_info: LocalInfo::StaticRef { .. }, - .. - }) + Some(LocalDecl { local_info: LocalInfo::User(ClearCrossCrate::Clear), .. }) | Some(LocalDecl { - local_info: LocalInfo::Other, + local_info: + LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm { + opt_match_place: None, + .. + }))), .. }) + | Some(LocalDecl { local_info: LocalInfo::StaticRef { .. }, .. }) + | Some(LocalDecl { local_info: LocalInfo::Other, .. }) | None => (self.describe_place(place.as_ref()), assigned_span), Some(decl) => (self.describe_place(err_place.as_ref()), decl.source_info.span), }; @@ -1639,13 +1501,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { fn classify_drop_access_kind(&self, place: PlaceRef<'cx, 'tcx>) -> StorageDeadOrDrop<'tcx> { let tcx = self.infcx.tcx; match place.projection { - [] => { - StorageDeadOrDrop::LocalStorageDead - } + [] => StorageDeadOrDrop::LocalStorageDead, [proj_base @ .., elem] => { // FIXME(spastorino) make this iterate let base_access = self.classify_drop_access_kind(PlaceRef { - base: place.base, + local: place.local, projection: proj_base, }); match elem { @@ -1653,12 +1513,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { StorageDeadOrDrop::LocalStorageDead | StorageDeadOrDrop::BoxedStorageDead => { assert!( - Place::ty_from( - &place.base, - proj_base, - *self.body, - tcx - ).ty.is_box(), + Place::ty_from(&place.local, proj_base, *self.body, tcx) + .ty + .is_box(), "Drop of value behind a reference or raw pointer" ); StorageDeadOrDrop::BoxedStorageDead @@ -1666,12 +1523,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { StorageDeadOrDrop::Destructor(_) => base_access, }, ProjectionElem::Field(..) | ProjectionElem::Downcast(..) => { - let base_ty = Place::ty_from( - &place.base, - proj_base, - *self.body, - tcx - ).ty; + let base_ty = Place::ty_from(&place.local, proj_base, *self.body, tcx).ty; match base_ty.kind { ty::Adt(def, _) if def.has_dtor(tcx) => { // Report the outermost adt with a destructor @@ -1705,10 +1557,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { impl<'tcx> Visitor<'tcx> for FakeReadCauseFinder<'_, 'tcx> { fn visit_statement(&mut self, statement: &Statement<'tcx>, _: Location) { match statement { - Statement { - kind: StatementKind::FakeRead(cause, box ref place), - .. - } if *place == *self.place => { + Statement { kind: StatementKind::FakeRead(cause, box ref place), .. } + if *place == *self.place => + { self.cause = Some(*cause); } _ => (), @@ -1738,10 +1589,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } else { let ty = self.infcx.tcx.type_of(self.mir_def_id); match ty.kind { - ty::FnDef(_, _) | ty::FnPtr(_) => self.annotate_fn_sig( - self.mir_def_id, - self.infcx.tcx.fn_sig(self.mir_def_id), - ), + ty::FnDef(_, _) | ty::FnPtr(_) => self + .annotate_fn_sig(self.mir_def_id, self.infcx.tcx.fn_sig(self.mir_def_id)), _ => None, } } @@ -1754,17 +1603,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // place. If it was, we can add annotations about the function's return type and arguments // and it'll make sense. let location = borrow.reserve_location; - debug!( - "annotate_argument_and_return_for_borrow: location={:?}", - location - ); - if let Some(&Statement { kind: StatementKind::Assign(box(ref reservation, _)), ..}) - = &self.body[location.block].statements.get(location.statement_index) + debug!("annotate_argument_and_return_for_borrow: location={:?}", location); + if let Some(&Statement { kind: StatementKind::Assign(box (ref reservation, _)), .. }) = + &self.body[location.block].statements.get(location.statement_index) { - debug!( - "annotate_argument_and_return_for_borrow: reservation={:?}", - reservation - ); + debug!("annotate_argument_and_return_for_borrow: reservation={:?}", reservation); // Check that the initial assignment of the reserve location is into a temporary. let mut target = match reservation.as_local() { Some(local) if self.body.local_kind(local) == LocalKind::Temp => local, @@ -1774,13 +1617,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // Next, look through the rest of the block, checking if we are assigning the // `target` (that is, the place that contains our borrow) to anything. let mut annotated_closure = None; - for stmt in &self.body[location.block].statements[location.statement_index + 1..] - { + for stmt in &self.body[location.block].statements[location.statement_index + 1..] { debug!( "annotate_argument_and_return_for_borrow: target={:?} stmt={:?}", target, stmt ); - if let StatementKind::Assign(box(place, rvalue)) = &stmt.kind { + if let StatementKind::Assign(box (place, rvalue)) = &stmt.kind { if let Some(assigned_to) = place.as_local() { debug!( "annotate_argument_and_return_for_borrow: assigned_to={:?} \ @@ -1905,11 +1747,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { "annotate_argument_and_return_for_borrow: target={:?} terminator={:?}", target, terminator ); - if let TerminatorKind::Call { - destination: Some((place, _)), - args, - .. - } = &terminator.kind + if let TerminatorKind::Call { destination: Some((place, _)), args, .. } = + &terminator.kind { if let Some(assigned_to) = place.as_local() { debug!( @@ -1993,7 +1832,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if let ty::Ref(argument_region, _, _) = argument.kind { if argument_region == return_region { // Need to use the `rustc::ty` types to compare against the - // `return_region`. Then use the `rustc::hir` type to get only + // `return_region`. Then use the `rustc_hir` type to get only // the lifetime span. if let hir::TyKind::Rptr(lifetime, _) = &fn_decl.inputs[index].kind { // With access to the lifetime, we can get @@ -2107,10 +1946,7 @@ impl<'tcx> AnnotatedBorrowFnSignature<'tcx> { diag: &mut DiagnosticBuilder<'_>, ) -> String { match self { - AnnotatedBorrowFnSignature::Closure { - argument_ty, - argument_span, - } => { + AnnotatedBorrowFnSignature::Closure { argument_ty, argument_span } => { diag.span_label( *argument_span, format!("has type `{}`", cx.get_name_for_ty(argument_ty, 0)), @@ -2148,21 +1984,14 @@ impl<'tcx> AnnotatedBorrowFnSignature<'tcx> { cx.get_region_name_for_ty(return_ty, 0) } - AnnotatedBorrowFnSignature::NamedFunction { - arguments, - return_ty, - return_span, - } => { + AnnotatedBorrowFnSignature::NamedFunction { arguments, return_ty, return_span } => { // Region of return type and arguments checked to be the same earlier. let region_name = cx.get_region_name_for_ty(return_ty, 0); for (_, argument_span) in arguments { diag.span_label(*argument_span, format!("has lifetime `{}`", region_name)); } - diag.span_label( - *return_span, - format!("also has lifetime `{}`", region_name,), - ); + diag.span_label(*return_span, format!("also has lifetime `{}`", region_name,)); diag.help(&format!( "use data from the highlighted arguments which match the `{}` lifetime of \ diff --git a/src/librustc_mir/borrow_check/diagnostics/explain_borrow.rs b/src/librustc_mir/borrow_check/diagnostics/explain_borrow.rs index a463d2cb29..01b7c5645f 100644 --- a/src/librustc_mir/borrow_check/diagnostics/explain_borrow.rs +++ b/src/librustc_mir/borrow_check/diagnostics/explain_borrow.rs @@ -2,26 +2,25 @@ use std::collections::VecDeque; +use rustc::infer::NLLRegionVariableOrigin; use rustc::mir::{ - CastKind, ConstraintCategory, FakeReadCause, Local, Location, Body, Operand, Place, Rvalue, + Body, CastKind, ConstraintCategory, FakeReadCause, Local, Location, Operand, Place, Rvalue, Statement, StatementKind, TerminatorKind, }; -use rustc::ty::{self, TyCtxt}; -use rustc::ty::adjustment::{PointerCast}; -use rustc_index::vec::IndexVec; +use rustc::ty::adjustment::PointerCast; +use rustc::ty::{self, RegionVid, TyCtxt}; use rustc_data_structures::fx::FxHashSet; -use rustc_errors::DiagnosticBuilder; -use syntax_pos::Span; -use syntax_pos::symbol::Symbol; +use rustc_errors::{Applicability, DiagnosticBuilder}; +use rustc_index::vec::IndexVec; +use rustc_span::symbol::Symbol; +use rustc_span::Span; use crate::borrow_check::{ - borrow_set::BorrowData, - region_infer::Cause, - nll::ConstraintDescription, - MirBorrowckCtxt, WriteKind, + borrow_set::BorrowData, nll::ConstraintDescription, region_infer::Cause, MirBorrowckCtxt, + WriteKind, }; -use super::{UseSpans, find_use, RegionName}; +use super::{find_use, RegionName, UseSpans}; #[derive(Debug)] pub(in crate::borrow_check) enum BorrowExplanation { @@ -106,10 +105,9 @@ impl BorrowExplanation { let (dtor_desc, type_desc) = match local_decl.ty.kind { // If type is an ADT that implements Drop, then // simplify output by reporting just the ADT name. - ty::Adt(adt, _substs) if adt.has_dtor(tcx) && !adt.is_box() => ( - "`Drop` code", - format!("type `{}`", tcx.def_path_str(adt.did)), - ), + ty::Adt(adt, _substs) if adt.has_dtor(tcx) && !adt.is_box() => { + ("`Drop` code", format!("type `{}`", tcx.def_path_str(adt.did))) + } // Otherwise, just report the whole type (and use // the intentionally fuzzy phrase "destructor") @@ -209,6 +207,47 @@ impl BorrowExplanation { ), ); }; + + self.add_lifetime_bound_suggestion_to_diagnostic( + tcx, + err, + &category, + span, + region_name, + ); + } + _ => {} + } + } + pub(in crate::borrow_check) fn add_lifetime_bound_suggestion_to_diagnostic<'tcx>( + &self, + tcx: TyCtxt<'tcx>, + err: &mut DiagnosticBuilder<'_>, + category: &ConstraintCategory, + span: Span, + region_name: &RegionName, + ) { + match category { + ConstraintCategory::OpaqueType => { + if let Ok(snippet) = tcx.sess.source_map().span_to_snippet(span) { + let suggestable_name = if region_name.was_named() { + region_name.to_string() + } else { + "'_".to_string() + }; + + err.span_suggestion( + span, + &format!( + "you can add a bound to the {}to make it last less than \ + `'static` and match `{}`", + category.description(), + region_name, + ), + format!("{} + {}", snippet, suggestable_name), + Applicability::Unspecified, + ); + } } _ => {} } @@ -216,6 +255,23 @@ impl BorrowExplanation { } impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { + fn free_region_constraint_info( + &self, + borrow_region: RegionVid, + outlived_region: RegionVid, + ) -> (ConstraintCategory, bool, Span, Option) { + let (category, from_closure, span) = self.regioncx.best_blame_constraint( + &self.body, + borrow_region, + NLLRegionVariableOrigin::FreeRegion, + |r| self.regioncx.provides_universal_region(r, borrow_region, outlived_region), + ); + + let outlived_fr_name = self.give_region_a_name(outlived_region); + + (category, from_closure, span, outlived_fr_name) + } + /// Returns structured explanation for *why* the borrow contains the /// point from `location`. This is key for the "3-point errors" /// [described in the NLL RFC][d]. @@ -240,21 +296,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { location, borrow, kind_place ); - let regioncx = &self.nonlexical_regioncx; + let regioncx = &self.regioncx; let body: &Body<'_> = &self.body; let tcx = self.infcx.tcx; let borrow_region_vid = borrow.region; - debug!( - "explain_why_borrow_contains_point: borrow_region_vid={:?}", - borrow_region_vid - ); + debug!("explain_why_borrow_contains_point: borrow_region_vid={:?}", borrow_region_vid); - let region_sub = regioncx.find_sub_region_live_at(borrow_region_vid, location); - debug!( - "explain_why_borrow_contains_point: region_sub={:?}", - region_sub - ); + let region_sub = self.regioncx.find_sub_region_live_at(borrow_region_vid, location); + debug!("explain_why_borrow_contains_point: region_sub={:?}", region_sub); match find_use::find(body, regioncx, tcx, region_sub, location) { Some(Cause::LiveVar(local, location)) => { @@ -281,8 +331,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if self.local_names[local].is_some() { if let Some((WriteKind::StorageDeadOrDrop, place)) = kind_place { if let Some(borrowed_local) = place.as_local() { - if self.local_names[borrowed_local].is_some() - && local != borrowed_local + if self.local_names[borrowed_local].is_some() && local != borrowed_local { should_note_order = true; } @@ -298,20 +347,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } None => { - if let Some(region) = regioncx.to_error_region_vid(borrow_region_vid) { + if let Some(region) = self.to_error_region_vid(borrow_region_vid) { let (category, from_closure, span, region_name) = - self.nonlexical_regioncx.free_region_constraint_info( - &self.body, - &self.local_names, - &self.upvars, - self.mir_def_id, - self.infcx, - borrow_region_vid, - region, - ); + self.free_region_constraint_info(borrow_region_vid, region); if let Some(region_name) = region_name { - let opt_place_desc = - self.describe_place(borrow.borrowed_place.as_ref()); + let opt_place_desc = self.describe_place(borrow.borrowed_place.as_ref()); BorrowExplanation::MustBeValidFor { category, from_closure, @@ -320,13 +360,17 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { opt_place_desc, } } else { - debug!("explain_why_borrow_contains_point: \ - Could not generate a region name"); + debug!( + "explain_why_borrow_contains_point: \ + Could not generate a region name" + ); BorrowExplanation::Unexplained } } else { - debug!("explain_why_borrow_contains_point: \ - Could not generate an error region vid"); + debug!( + "explain_why_borrow_contains_point: \ + Could not generate an error region vid" + ); BorrowExplanation::Unexplained } } @@ -341,9 +385,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { use_location: Location, ) -> bool { let back_edge = self.reach_through_backedge(borrow_location, use_location); - back_edge.map_or(false, |back_edge| { - self.can_reach_head_of_loop(use_location, back_edge) - }) + back_edge.map_or(false, |back_edge| self.can_reach_head_of_loop(use_location, back_edge)) } /// Returns the outmost back edge if `from` location can reach `to` location passing through @@ -381,10 +423,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { block .terminator() .successors() - .map(|bb| Location { - statement_index: 0, - block: *bb, - }) + .map(|bb| Location { statement_index: 0, block: *bb }) .filter(|s| visited_locations.insert(*s)) .map(|s| { if self.is_back_edge(location, s) { @@ -443,10 +482,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } } else { for bb in block.terminator().successors() { - let successor = Location { - statement_index: 0, - block: *bb, - }; + let successor = Location { statement_index: 0, block: *bb }; if !visited_locations.contains(&successor) && self.find_loop_head_dfs(successor, loop_head, visited_locations) @@ -490,17 +526,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } else if self.was_captured_by_trait_object(borrow) { LaterUseKind::TraitCapture } else if location.statement_index == block.statements.len() { - if let TerminatorKind::Call { - ref func, - from_hir_call: true, - .. - } = block.terminator().kind + if let TerminatorKind::Call { ref func, from_hir_call: true, .. } = + block.terminator().kind { // Just point to the function, to reduce the chance of overlapping spans. let function_span = match func { Operand::Constant(c) => c.span, - Operand::Copy(place) | - Operand::Move(place) => { + Operand::Copy(place) | Operand::Move(place) => { if let Some(l) = place.as_local() { let local_decl = &self.body.local_decls[l]; if self.local_names[l].is_none() { @@ -534,19 +566,17 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let location = borrow.reserve_location; let block = &self.body[location.block]; let stmt = block.statements.get(location.statement_index); - debug!( - "was_captured_by_trait_object: location={:?} stmt={:?}", - location, stmt - ); + debug!("was_captured_by_trait_object: location={:?} stmt={:?}", location, stmt); // We make a `queue` vector that has the locations we want to visit. As of writing, this // will only ever have one item at any given time, but by using a vector, we can pop from // it which simplifies the termination logic. let mut queue = vec![location]; let mut target = if let Some(&Statement { - kind: StatementKind::Assign(box(ref place, _)), + kind: StatementKind::Assign(box (ref place, _)), .. - }) = stmt { + }) = stmt + { if let Some(local) = place.as_local() { local } else { @@ -556,10 +586,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { return false; }; - debug!( - "was_captured_by_trait: target={:?} queue={:?}", - target, queue - ); + debug!("was_captured_by_trait: target={:?} queue={:?}", target, queue); while let Some(current_location) = queue.pop() { debug!("was_captured_by_trait: target={:?}", target); let block = &self.body[current_location.block]; @@ -570,7 +597,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { debug!("was_captured_by_trait_object: stmt={:?}", stmt); // The only kind of statement that we care about is assignments... - if let StatementKind::Assign(box(place, rvalue)) = &stmt.kind { + if let StatementKind::Assign(box (place, rvalue)) = &stmt.kind { let into = match place.local_or_deref_local() { Some(into) => into, None => { @@ -584,8 +611,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // If we see a use, we should check whether it is our data, and if so // update the place that we're looking for to that new place. Rvalue::Use(operand) => match operand { - Operand::Copy(place) - | Operand::Move(place) => { + Operand::Copy(place) | Operand::Move(place) => { if let Some(from) = place.as_local() { if from == target { target = into; @@ -596,31 +622,32 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { }, // If we see a unsized cast, then if it is our data we should check // whether it is being cast to a trait object. - Rvalue::Cast( - CastKind::Pointer(PointerCast::Unsize), operand, ty - ) => match operand { - Operand::Copy(place) - | Operand::Move(place) => { - if let Some(from) = place.as_local() { - if from == target { - debug!("was_captured_by_trait_object: ty={:?}", ty); - // Check the type for a trait object. - return match ty.kind { - // `&dyn Trait` - ty::Ref(_, ty, _) if ty.is_trait() => true, - // `Box` - _ if ty.is_box() && ty.boxed_ty().is_trait() => true, - // `dyn Trait` - _ if ty.is_trait() => true, - // Anything else. - _ => false, - }; + Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), operand, ty) => { + match operand { + Operand::Copy(place) | Operand::Move(place) => { + if let Some(from) = place.as_local() { + if from == target { + debug!("was_captured_by_trait_object: ty={:?}", ty); + // Check the type for a trait object. + return match ty.kind { + // `&dyn Trait` + ty::Ref(_, ty, _) if ty.is_trait() => true, + // `Box` + _ if ty.is_box() && ty.boxed_ty().is_trait() => { + true + } + // `dyn Trait` + _ if ty.is_trait() => true, + // Anything else. + _ => false, + }; + } } + return false; } - return false; + _ => return false, } - _ => return false, - }, + } _ => {} } } @@ -632,11 +659,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let terminator = block.terminator(); debug!("was_captured_by_trait_object: terminator={:?}", terminator); - if let TerminatorKind::Call { - destination: Some((place, block)), - args, - .. - } = &terminator.kind { + if let TerminatorKind::Call { destination: Some((place, block)), args, .. } = + &terminator.kind + { if let Some(dest) = place.as_local() { debug!( "was_captured_by_trait_object: target={:?} dest={:?} args={:?}", diff --git a/src/librustc_mir/borrow_check/diagnostics/find_use.rs b/src/librustc_mir/borrow_check/diagnostics/find_use.rs index c557e52876..ca4141d5fa 100644 --- a/src/librustc_mir/borrow_check/diagnostics/find_use.rs +++ b/src/librustc_mir/borrow_check/diagnostics/find_use.rs @@ -1,10 +1,13 @@ use std::collections::VecDeque; use std::rc::Rc; -use crate::borrow_check::{nll::ToRegionVid, region_infer::{Cause, RegionInferenceContext}}; +use crate::borrow_check::{ + nll::ToRegionVid, + region_infer::{Cause, RegionInferenceContext}, +}; use crate::util::liveness::{self, DefUse}; use rustc::mir::visit::{MirVisitable, PlaceContext, Visitor}; -use rustc::mir::{Local, Location, Body}; +use rustc::mir::{Body, Local, Location}; use rustc::ty::{RegionVid, TyCtxt}; use rustc_data_structures::fx::FxHashSet; @@ -15,13 +18,7 @@ crate fn find<'tcx>( region_vid: RegionVid, start_point: Location, ) -> Option { - let mut uf = UseFinder { - body, - regioncx, - tcx, - region_vid, - start_point, - }; + let mut uf = UseFinder { body, regioncx, tcx, region_vid, start_point }; uf.find() } @@ -71,10 +68,7 @@ impl<'cx, 'tcx> UseFinder<'cx, 'tcx> { .terminator() .successors() .filter(|&bb| Some(&Some(*bb)) != block_data.terminator().unwind()) - .map(|&bb| Location { - statement_index: 0, - block: bb, - }), + .map(|&bb| Location { statement_index: 0, block: bb }), ); } } diff --git a/src/librustc_mir/borrow_check/diagnostics/mod.rs b/src/librustc_mir/borrow_check/diagnostics/mod.rs index 1a76265fbd..0fc73d33f9 100644 --- a/src/librustc_mir/borrow_check/diagnostics/mod.rs +++ b/src/librustc_mir/borrow_check/diagnostics/mod.rs @@ -1,39 +1,38 @@ //! Borrow checker diagnostics. -use rustc::hir; -use rustc::hir::def::Namespace; -use rustc::hir::def_id::DefId; -use rustc::hir::GeneratorKind; use rustc::mir::{ - AggregateKind, Constant, Field, Local, LocalInfo, LocalKind, Location, Operand, - Place, PlaceBase, PlaceRef, ProjectionElem, Rvalue, Statement, StatementKind, - Static, StaticKind, Terminator, TerminatorKind, + AggregateKind, Constant, Field, Local, LocalInfo, LocalKind, Location, Operand, Place, + PlaceRef, ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind, }; -use rustc::ty::{self, DefIdTree, Ty, TyCtxt}; use rustc::ty::layout::VariantIdx; use rustc::ty::print::Print; +use rustc::ty::{self, DefIdTree, Ty, TyCtxt}; use rustc_errors::DiagnosticBuilder; -use syntax_pos::Span; +use rustc_hir as hir; +use rustc_hir::def::Namespace; +use rustc_hir::def_id::DefId; +use rustc_hir::GeneratorKind; +use rustc_span::Span; use super::borrow_set::BorrowData; use super::MirBorrowckCtxt; use crate::dataflow::move_paths::{InitLocation, LookupResult}; mod find_use; -mod var_name; -mod region_name; mod outlives_suggestion; +mod region_name; +mod var_name; mod conflict_errors; +mod explain_borrow; mod move_errors; mod mutability_errors; mod region_errors; -mod explain_borrow; crate use mutability_errors::AccessKind; -crate use region_name::{RegionName, RegionNameSource, RegionErrorNamingCtx}; -crate use region_errors::{ErrorReportingCtx, ErrorConstraintInfo}; crate use outlives_suggestion::OutlivesSuggestionBuilder; +crate use region_errors::{ErrorConstraintInfo, RegionErrorKind, RegionErrors}; +crate use region_name::{RegionName, RegionNameSource}; pub(super) struct IncludingDowncast(pub(super) bool); @@ -59,13 +58,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let mut target = place.local_or_deref_local(); for stmt in &self.body[location.block].statements[location.statement_index..] { debug!("add_moved_or_invoked_closure_note: stmt={:?} target={:?}", stmt, target); - if let StatementKind::Assign(box(into, Rvalue::Use(from))) = &stmt.kind { + if let StatementKind::Assign(box (into, Rvalue::Use(from))) = &stmt.kind { debug!("add_fnonce_closure_note: into={:?} from={:?}", into, from); match from { - Operand::Copy(ref place) | - Operand::Move(ref place) if target == place.local_or_deref_local() => - target = into.local_or_deref_local(), - _ => {}, + Operand::Copy(ref place) | Operand::Move(ref place) + if target == place.local_or_deref_local() => + { + target = into.local_or_deref_local() + } + _ => {} } } } @@ -74,22 +75,23 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let terminator = self.body[location.block].terminator(); debug!("add_moved_or_invoked_closure_note: terminator={:?}", terminator); if let TerminatorKind::Call { - func: Operand::Constant(box Constant { - literal: ty::Const { - ty: &ty::TyS { kind: ty::FnDef(id, _), .. }, + func: + Operand::Constant(box Constant { + literal: ty::Const { ty: &ty::TyS { kind: ty::FnDef(id, _), .. }, .. }, .. - }, - .. - }), + }), args, .. - } = &terminator.kind { + } = &terminator.kind + { debug!("add_moved_or_invoked_closure_note: id={:?}", id); if self.infcx.tcx.parent(id) == self.infcx.tcx.lang_items().fn_once_trait() { let closure = match args.first() { - Some(Operand::Copy(ref place)) | - Some(Operand::Move(ref place)) if target == place.local_or_deref_local() => - place.local_or_deref_local().unwrap(), + Some(Operand::Copy(ref place)) | Some(Operand::Move(ref place)) + if target == place.local_or_deref_local() => + { + place.local_or_deref_local().unwrap() + } _ => return, }; @@ -97,9 +99,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if let ty::Closure(did, _) = self.body.local_decls[closure].ty.kind { let hir_id = self.infcx.tcx.hir().as_local_hir_id(did).unwrap(); - if let Some((span, name)) = self.infcx.tcx.typeck_tables_of(did) - .closure_kind_origins() - .get(hir_id) + if let Some((span, name)) = + self.infcx.tcx.typeck_tables_of(did).closure_kind_origins().get(hir_id) { diag.span_note( *span, @@ -120,16 +121,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if let ty::Closure(did, _) = self.body.local_decls[target].ty.kind { let hir_id = self.infcx.tcx.hir().as_local_hir_id(did).unwrap(); - if let Some((span, name)) = self.infcx.tcx.typeck_tables_of(did) - .closure_kind_origins() - .get(hir_id) + if let Some((span, name)) = + self.infcx.tcx.typeck_tables_of(did).closure_kind_origins().get(hir_id) { diag.span_note( *span, &format!( "closure cannot be moved more than once as it is not `Copy` due to \ moving the variable `{}` out of its environment", - name + name ), ); } @@ -168,66 +168,33 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { including_downcast: &IncludingDowncast, ) -> Result<(), ()> { match place { - PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } => { + PlaceRef { local, projection: [] } => { self.append_local_to_string(*local, buf)?; } - PlaceRef { - base: - PlaceBase::Static(box Static { - kind: StaticKind::Promoted(..), - .. - }), - projection: [], - } => { - buf.push_str("promoted"); - } - PlaceRef { - base: - PlaceBase::Static(box Static { - kind: StaticKind::Static, - def_id, - .. - }), - projection: [], - } => { - buf.push_str(&self.infcx.tcx.item_name(*def_id).to_string()); - } - PlaceRef { - base: &PlaceBase::Local(local), - projection: [ProjectionElem::Deref] - } if self.body.local_decls[local].is_ref_for_guard() => { + PlaceRef { local, projection: [ProjectionElem::Deref] } + if self.body.local_decls[*local].is_ref_for_guard() => + { self.append_place_to_string( - PlaceRef { - base: &PlaceBase::Local(local), - projection: &[], - }, + PlaceRef { local: local, projection: &[] }, buf, autoderef, &including_downcast, )?; - }, - PlaceRef { - base: &PlaceBase::Local(local), - projection: [ProjectionElem::Deref] - } if self.body.local_decls[local].is_ref_to_static() => { - let local_info = &self.body.local_decls[local].local_info; + } + PlaceRef { local, projection: [ProjectionElem::Deref] } + if self.body.local_decls[*local].is_ref_to_static() => + { + let local_info = &self.body.local_decls[*local].local_info; if let LocalInfo::StaticRef { def_id, .. } = *local_info { buf.push_str(&self.infcx.tcx.item_name(def_id).as_str()); } else { unreachable!(); } - }, - PlaceRef { - base, - projection: [proj_base @ .., elem], - } => { + } + PlaceRef { local, projection: [proj_base @ .., elem] } => { match elem { ProjectionElem::Deref => { - let upvar_field_projection = - self.is_upvar_field_projection(place); + let upvar_field_projection = self.is_upvar_field_projection(place); if let Some(field) = upvar_field_projection { let var_index = field.index(); let name = self.upvars[var_index].name.to_string(); @@ -240,38 +207,25 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if autoderef { // FIXME turn this recursion into iteration self.append_place_to_string( - PlaceRef { - base, - projection: proj_base, - }, + PlaceRef { local, projection: proj_base }, buf, autoderef, &including_downcast, )?; } else { - match (proj_base, base) { - _ => { - buf.push_str(&"*"); - self.append_place_to_string( - PlaceRef { - base, - projection: proj_base, - }, - buf, - autoderef, - &including_downcast, - )?; - } - } + buf.push_str(&"*"); + self.append_place_to_string( + PlaceRef { local, projection: proj_base }, + buf, + autoderef, + &including_downcast, + )?; } } } ProjectionElem::Downcast(..) => { self.append_place_to_string( - PlaceRef { - base, - projection: proj_base, - }, + PlaceRef { local, projection: proj_base }, buf, autoderef, &including_downcast, @@ -283,22 +237,16 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ProjectionElem::Field(field, _ty) => { autoderef = true; - let upvar_field_projection = - self.is_upvar_field_projection(place); + let upvar_field_projection = self.is_upvar_field_projection(place); if let Some(field) = upvar_field_projection { let var_index = field.index(); let name = self.upvars[var_index].name.to_string(); buf.push_str(&name); } else { - let field_name = self.describe_field(PlaceRef { - base, - projection: proj_base, - }, *field); + let field_name = self + .describe_field(PlaceRef { local, projection: proj_base }, *field); self.append_place_to_string( - PlaceRef { - base, - projection: proj_base, - }, + PlaceRef { local, projection: proj_base }, buf, autoderef, &including_downcast, @@ -310,10 +258,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { autoderef = true; self.append_place_to_string( - PlaceRef { - base, - projection: proj_base, - }, + PlaceRef { local, projection: proj_base }, buf, autoderef, &including_downcast, @@ -330,10 +275,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // then use another while the borrow is held, don't output indices details // to avoid confusing the end-user self.append_place_to_string( - PlaceRef { - base, - projection: proj_base, - }, + PlaceRef { local, projection: proj_base }, buf, autoderef, &including_downcast, @@ -364,34 +306,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { fn describe_field(&self, place: PlaceRef<'cx, 'tcx>, field: Field) -> String { // FIXME Place2 Make this work iteratively match place { - PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } => { + PlaceRef { local, projection: [] } => { let local = &self.body.local_decls[*local]; self.describe_field_from_ty(&local.ty, field, None) } - PlaceRef { - base: PlaceBase::Static(static_), - projection: [], - } => - self.describe_field_from_ty(&static_.ty, field, None), - PlaceRef { - base, - projection: [proj_base @ .., elem], - } => match elem { + PlaceRef { local, projection: [proj_base @ .., elem] } => match elem { ProjectionElem::Deref => { - self.describe_field(PlaceRef { - base, - projection: proj_base, - }, field) + self.describe_field(PlaceRef { local, projection: proj_base }, field) } ProjectionElem::Downcast(_, variant_index) => { - let base_ty = Place::ty_from( - place.base, - place.projection, - *self.body, - self.infcx.tcx).ty; + let base_ty = + Place::ty_from(place.local, place.projection, *self.body, self.infcx.tcx) + .ty; self.describe_field_from_ty(&base_ty, field, Some(*variant_index)) } ProjectionElem::Field(_, field_type) => { @@ -400,10 +326,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ProjectionElem::Index(..) | ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. } => { - self.describe_field(PlaceRef { - base, - projection: proj_base, - }, field) + self.describe_field(PlaceRef { local, projection: proj_base }, field) } }, } @@ -414,7 +337,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { &self, ty: Ty<'_>, field: Field, - variant_index: Option + variant_index: Option, ) -> String { if ty.is_box() { // If the type is a box, the field is described from the boxed type @@ -428,32 +351,28 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } else { def.non_enum_variant() }; - variant.fields[field.index()] - .ident - .to_string() - }, + variant.fields[field.index()].ident.to_string() + } ty::Tuple(_) => field.index().to_string(), ty::Ref(_, ty, _) | ty::RawPtr(ty::TypeAndMut { ty, .. }) => { self.describe_field_from_ty(&ty, field, variant_index) } - ty::Array(ty, _) | ty::Slice(ty) => - self.describe_field_from_ty(&ty, field, variant_index), + ty::Array(ty, _) | ty::Slice(ty) => { + self.describe_field_from_ty(&ty, field, variant_index) + } ty::Closure(def_id, _) | ty::Generator(def_id, _, _) => { // `tcx.upvars(def_id)` returns an `Option`, which is `None` in case // the closure comes from another crate. But in that case we wouldn't // be borrowck'ing it, so we can just unwrap: - let (&var_id, _) = self.infcx.tcx.upvars(def_id).unwrap() - .get_index(field.index()).unwrap(); + let (&var_id, _) = + self.infcx.tcx.upvars(def_id).unwrap().get_index(field.index()).unwrap(); self.infcx.tcx.hir().name(var_id).to_string() } _ => { // Might need a revision when the fields in trait RFC is implemented // (https://github.com/rust-lang/rfcs/pull/1546) - bug!( - "End-user description not implemented for field access on `{:?}`", - ty - ); + bug!("End-user description not implemented for field access on `{:?}`", ty); } } } @@ -469,8 +388,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ) { let message = format!( "move occurs because {} has type `{}`, which does not implement the `Copy` trait", - place_desc, - ty, + place_desc, ty, ); if let Some(span) = span { err.span_label(span, message); @@ -506,23 +424,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let is_terminator = bbd.statements.len() == loc.statement_index; debug!( "borrowed_content_source: loc={:?} is_terminator={:?}", - loc, - is_terminator, + loc, is_terminator, ); if !is_terminator { continue; } else if let Some(Terminator { - kind: TerminatorKind::Call { - ref func, - from_hir_call: false, - .. - }, + kind: TerminatorKind::Call { ref func, from_hir_call: false, .. }, .. - }) = bbd.terminator { - if let Some(source) = BorrowedContentSource::from_call( - func.ty(*self.body, tcx), - tcx - ) { + }) = bbd.terminator + { + if let Some(source) = + BorrowedContentSource::from_call(func.ty(*self.body, tcx), tcx) + { return source; } } @@ -534,12 +447,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // If we didn't find an overloaded deref or index, then assume it's a // built in deref and check the type of the base. - let base_ty = Place::ty_from( - deref_base.base, - deref_base.projection, - *self.body, - tcx - ).ty; + let base_ty = Place::ty_from(deref_base.local, deref_base.projection, *self.body, tcx).ty; if base_ty.is_unsafe_ptr() { BorrowedContentSource::DerefRawPointer } else if base_ty.is_mutable_ptr() { @@ -620,10 +528,7 @@ pub(super) enum UseSpans { impl UseSpans { pub(super) fn args_or_use(self) -> Span { match self { - UseSpans::ClosureUse { - args_span: span, .. - } - | UseSpans::OtherUse(span) => span, + UseSpans::ClosureUse { args_span: span, .. } | UseSpans::OtherUse(span) => span, } } @@ -681,11 +586,13 @@ impl UseSpans { /// Describe the span associated with a use of a place. pub(super) fn describe(&self) -> String { match *self { - UseSpans::ClosureUse { generator_kind, .. } => if generator_kind.is_some() { - " in generator".to_string() - } else { - " in closure".to_string() - }, + UseSpans::ClosureUse { generator_kind, .. } => { + if generator_kind.is_some() { + " in generator".to_string() + } else { + " in closure".to_string() + } + } _ => "".to_string(), } } @@ -714,12 +621,10 @@ impl BorrowedContentSource<'tcx> { match *self { BorrowedContentSource::DerefRawPointer => format!("a raw pointer"), BorrowedContentSource::DerefSharedRef => format!("a shared reference"), - BorrowedContentSource::DerefMutableRef => { - format!("a mutable reference") - } + BorrowedContentSource::DerefMutableRef => format!("a mutable reference"), BorrowedContentSource::OverloadedDeref(ty) => { if ty.is_rc() { - format!("an `Rc`") + format!("an `Rc`") } else if ty.is_arc() { format!("an `Arc`") } else { @@ -738,7 +643,7 @@ impl BorrowedContentSource<'tcx> { // Overloaded deref and index operators should be evaluated into a // temporary. So we don't need a description here. BorrowedContentSource::OverloadedDeref(_) - | BorrowedContentSource::OverloadedIndex(_) => None + | BorrowedContentSource::OverloadedIndex(_) => None, } } @@ -747,11 +652,11 @@ impl BorrowedContentSource<'tcx> { BorrowedContentSource::DerefRawPointer => format!("a `*const` pointer"), BorrowedContentSource::DerefSharedRef => format!("a `&` reference"), BorrowedContentSource::DerefMutableRef => { - bug!("describe_for_immutable_place: DerefMutableRef isn't immutable") - }, + bug!("describe_for_immutable_place: DerefMutableRef isn't immutable") + } BorrowedContentSource::OverloadedDeref(ty) => { if ty.is_rc() { - format!("an `Rc`") + format!("an `Rc`") } else if ty.is_arc() { format!("an `Arc`") } else { @@ -800,26 +705,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { }; debug!("move_spans: moved_place={:?} location={:?} stmt={:?}", moved_place, location, stmt); - if let StatementKind::Assign( - box(_, Rvalue::Aggregate(ref kind, ref places)) - ) = stmt.kind { + if let StatementKind::Assign(box (_, Rvalue::Aggregate(ref kind, ref places))) = stmt.kind { let def_id = match kind { box AggregateKind::Closure(def_id, _) | box AggregateKind::Generator(def_id, _, _) => def_id, _ => return OtherUse(stmt.source_info.span), }; - debug!( - "move_spans: def_id={:?} places={:?}", - def_id, places - ); - if let Some((args_span, generator_kind, var_span)) - = self.closure_span(*def_id, moved_place, places) { - return ClosureUse { - generator_kind, - args_span, - var_span, - }; + debug!("move_spans: def_id={:?} places={:?}", def_id, places); + if let Some((args_span, generator_kind, var_span)) = + self.closure_span(*def_id, moved_place, places) + { + return ClosureUse { generator_kind, args_span, var_span }; } } @@ -834,14 +731,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { use self::UseSpans::*; debug!("borrow_spans: use_span={:?} location={:?}", use_span, location); - let target = match self.body[location.block] - .statements - .get(location.statement_index) - { - Some(&Statement { - kind: StatementKind::Assign(box(ref place, _)), - .. - }) => { + let target = match self.body[location.block].statements.get(location.statement_index) { + Some(&Statement { kind: StatementKind::Assign(box (ref place, _)), .. }) => { if let Some(local) = place.as_local() { local } else { @@ -857,9 +748,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } for stmt in &self.body[location.block].statements[location.statement_index + 1..] { - if let StatementKind::Assign( - box(_, Rvalue::Aggregate(ref kind, ref places)) - ) = stmt.kind { + if let StatementKind::Assign(box (_, Rvalue::Aggregate(ref kind, ref places))) = + stmt.kind + { let (def_id, is_generator) = match kind { box AggregateKind::Closure(def_id, _) => (def_id, false), box AggregateKind::Generator(def_id, _, _) => (def_id, true), @@ -870,14 +761,10 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { "borrow_spans: def_id={:?} is_generator={:?} places={:?}", def_id, is_generator, places ); - if let Some((args_span, generator_kind, var_span)) = self.closure_span( - *def_id, Place::from(target).as_ref(), places - ) { - return ClosureUse { - generator_kind, - args_span, - var_span, - }; + if let Some((args_span, generator_kind, var_span)) = + self.closure_span(*def_id, Place::from(target).as_ref(), places) + { + return ClosureUse { generator_kind, args_span, var_span }; } else { return OtherUse(use_span); } @@ -905,22 +792,20 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let hir_id = self.infcx.tcx.hir().as_local_hir_id(def_id)?; let expr = &self.infcx.tcx.hir().expect_expr(hir_id).kind; debug!("closure_span: hir_id={:?} expr={:?}", hir_id, expr); - if let hir::ExprKind::Closure( - .., body_id, args_span, _ - ) = expr { + if let hir::ExprKind::Closure(.., body_id, args_span, _) = expr { for (upvar, place) in self.infcx.tcx.upvars(def_id)?.values().zip(places) { match place { - Operand::Copy(place) | - Operand::Move(place) if target_place == place.as_ref() => { + Operand::Copy(place) | Operand::Move(place) + if target_place == place.as_ref() => + { debug!("closure_span: found captured local {:?}", place); let body = self.infcx.tcx.hir().body(*body_id); let generator_kind = body.generator_kind(); return Some((*args_span, generator_kind, upvar.span)); - }, + } _ => {} } } - } None } diff --git a/src/librustc_mir/borrow_check/diagnostics/move_errors.rs b/src/librustc_mir/borrow_check/diagnostics/move_errors.rs index cc634101f0..c3ad6834dc 100644 --- a/src/librustc_mir/borrow_check/diagnostics/move_errors.rs +++ b/src/librustc_mir/borrow_check/diagnostics/move_errors.rs @@ -1,14 +1,14 @@ use rustc::mir::*; use rustc::ty; -use rustc_errors::{DiagnosticBuilder,Applicability}; -use syntax_pos::Span; +use rustc_errors::{Applicability, DiagnosticBuilder}; +use rustc_span::source_map::DesugaringKind; +use rustc_span::{Span, Symbol}; -use crate::borrow_check::MirBorrowckCtxt; -use crate::borrow_check::prefixes::PrefixSet; use crate::borrow_check::diagnostics::UseSpans; +use crate::borrow_check::prefixes::PrefixSet; +use crate::borrow_check::MirBorrowckCtxt; use crate::dataflow::move_paths::{ - IllegalMoveOrigin, IllegalMoveOriginKind, - LookupResult, MoveError, MovePathIndex, + IllegalMoveOrigin, IllegalMoveOriginKind, LookupResult, MoveError, MovePathIndex, }; // Often when desugaring a pattern match we may have many individual moves in @@ -62,7 +62,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { fn group_move_errors( &self, - errors: Vec<(Place<'tcx>, MoveError<'tcx>)> + errors: Vec<(Place<'tcx>, MoveError<'tcx>)>, ) -> Vec> { let mut grouped_errors = Vec::new(); for (original_path, error) in errors { @@ -81,16 +81,15 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { MoveError::UnionMove { .. } => { unimplemented!("don't know how to report union move errors yet.") } - MoveError::IllegalMove { - cannot_move_out_of: IllegalMoveOrigin { location, kind }, - } => { + MoveError::IllegalMove { cannot_move_out_of: IllegalMoveOrigin { location, kind } } => { // Note: that the only time we assign a place isn't a temporary // to a user variable is when initializing it. // If that ever stops being the case, then the ever initialized // flow could be used. - if let Some(StatementKind::Assign( - box(place, Rvalue::Use(Operand::Move(move_from))) - )) = self.body.basic_blocks()[location.block] + if let Some(StatementKind::Assign(box ( + place, + Rvalue::Use(Operand::Move(move_from)), + ))) = self.body.basic_blocks()[location.block] .statements .get(location.statement_index) .map(|stmt| &stmt.kind) @@ -111,7 +110,8 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { opt_ty_info: _, pat_span: _, }, - ))) = local_decl.local_info { + ))) = local_decl.local_info + { let stmt_source_info = self.body.source_info(location); self.append_binding_error( grouped_errors, @@ -149,10 +149,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { match_span: Span, statement_span: Span, ) { - debug!( - "append_binding_error(match_place={:?}, match_span={:?})", - match_place, match_span - ); + debug!("append_binding_error(match_place={:?}, match_span={:?})", match_place, match_span); let from_simple_let = match_place.is_none(); let match_place = match_place.as_ref().unwrap_or(move_from); @@ -181,7 +178,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { }; grouped_errors.push(GroupedMoveError::MovesFromPlace { span, - move_from: match_place.clone(), + move_from: *match_place, original_path, kind, binds_to, @@ -223,49 +220,43 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { fn report(&mut self, error: GroupedMoveError<'tcx>) { let (mut err, err_span) = { - let (span, use_spans, original_path, kind,): - ( + let (span, use_spans, original_path, kind): ( Span, Option, &Place<'tcx>, &IllegalMoveOriginKind<'_>, - ) = - match error { - GroupedMoveError::MovesFromPlace { span, ref original_path, ref kind, .. } | - GroupedMoveError::MovesFromValue { span, ref original_path, ref kind, .. } => { - (span, None, original_path, kind) - } - GroupedMoveError::OtherIllegalMove { - use_spans, - ref original_path, - ref kind - } => { - (use_spans.args_or_use(), Some(use_spans), original_path, kind) - }, - }; - debug!("report: original_path={:?} span={:?}, kind={:?} \ - original_path.is_upvar_field_projection={:?}", original_path, span, kind, - self.is_upvar_field_projection(original_path.as_ref())); + ) = match error { + GroupedMoveError::MovesFromPlace { span, ref original_path, ref kind, .. } + | GroupedMoveError::MovesFromValue { span, ref original_path, ref kind, .. } => { + (span, None, original_path, kind) + } + GroupedMoveError::OtherIllegalMove { use_spans, ref original_path, ref kind } => { + (use_spans.args_or_use(), Some(use_spans), original_path, kind) + } + }; + debug!( + "report: original_path={:?} span={:?}, kind={:?} \ + original_path.is_upvar_field_projection={:?}", + original_path, + span, + kind, + self.is_upvar_field_projection(original_path.as_ref()) + ); ( match kind { - IllegalMoveOriginKind::Static => { - unreachable!(); - } - IllegalMoveOriginKind::BorrowedContent { target_place } => { - self.report_cannot_move_from_borrowed_content( + IllegalMoveOriginKind::BorrowedContent { target_place } => self + .report_cannot_move_from_borrowed_content( original_path, target_place, span, use_spans, - ) - } + ), IllegalMoveOriginKind::InteriorOfTypeWithDestructor { container_ty: ty } => { self.cannot_move_out_of_interior_of_drop(span, ty) } - IllegalMoveOriginKind::InteriorOfSliceOrArray { ty, is_index } => - self.cannot_move_out_of_interior_noncopy( - span, ty, Some(*is_index), - ), + IllegalMoveOriginKind::InteriorOfSliceOrArray { ty, is_index } => { + self.cannot_move_out_of_interior_noncopy(span, ty, Some(*is_index)) + } }, span, ) @@ -278,15 +269,13 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { fn report_cannot_move_from_static( &mut self, place: &Place<'tcx>, - span: Span + span: Span, ) -> DiagnosticBuilder<'a> { let description = if place.projection.len() == 1 { format!("static item `{}`", self.describe_place(place.as_ref()).unwrap()) } else { - let base_static = PlaceRef { - base: &place.base, - projection: &[ProjectionElem::Deref], - }; + let base_static = + PlaceRef { local: &place.local, projection: &[ProjectionElem::Deref] }; format!( "`{:?}` as `{:?}` is a static item", @@ -309,23 +298,18 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { // borrow to provide feedback about why this // was a move rather than a copy. let ty = deref_target_place.ty(*self.body, self.infcx.tcx).ty; - let upvar_field = self.prefixes(move_place.as_ref(), PrefixSet::All) + let upvar_field = self + .prefixes(move_place.as_ref(), PrefixSet::All) .find_map(|p| self.is_upvar_field_projection(p)); let deref_base = match deref_target_place.projection.as_ref() { &[ref proj_base @ .., ProjectionElem::Deref] => { - PlaceRef { - base: &deref_target_place.base, - projection: &proj_base, - } + PlaceRef { local: &deref_target_place.local, projection: &proj_base } } _ => bug!("deref_target_place is not a deref projection"), }; - if let PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } = deref_base { + if let PlaceRef { local, projection: [] } = deref_base { let decl = &self.body.local_decls[*local]; if decl.is_ref_for_guard() { let mut err = self.cannot_move_out_of( @@ -334,7 +318,8 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { ); err.note( "variables bound in patterns cannot be moved from \ - until after the end of the pattern guard"); + until after the end of the pattern guard", + ); return err; } else if decl.is_ref_to_static() { return self.report_cannot_move_from_static(move_place, span); @@ -343,21 +328,17 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { debug!("report: ty={:?}", ty); let mut err = match ty.kind { - ty::Array(..) | ty::Slice(..) => - self.cannot_move_out_of_interior_noncopy(span, ty, None), + ty::Array(..) | ty::Slice(..) => { + self.cannot_move_out_of_interior_noncopy(span, ty, None) + } ty::Closure(def_id, closure_substs) - if def_id == self.mir_def_id && upvar_field.is_some() - => { - let closure_kind_ty = closure_substs - .as_closure().kind_ty(def_id, self.infcx.tcx); + if def_id == self.mir_def_id && upvar_field.is_some() => + { + let closure_kind_ty = closure_substs.as_closure().kind_ty(def_id, self.infcx.tcx); let closure_kind = closure_kind_ty.to_opt_closure_kind(); let capture_description = match closure_kind { - Some(ty::ClosureKind::Fn) => { - "captured variable in an `Fn` closure" - } - Some(ty::ClosureKind::FnMut) => { - "captured variable in an `FnMut` closure" - } + Some(ty::ClosureKind::Fn) => "captured variable in an `Fn` closure", + Some(ty::ClosureKind::FnMut) => "captured variable in an `FnMut` closure", Some(ty::ClosureKind::FnOnce) => { bug!("closure kind does not match first argument type") } @@ -377,12 +358,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { { format!("`{}`, a {}", place_name, capture_description) } else { - format!( - "`{}`, as `{}` is a {}", - place_name, - upvar_name, - capture_description, - ) + format!("`{}`, as `{}` is a {}", place_name, upvar_name, capture_description,) }; debug!( @@ -398,43 +374,50 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { } _ => { let source = self.borrowed_content_source(deref_base); - match ( - self.describe_place(move_place.as_ref()), - source.describe_for_named_place(), - ) { - (Some(place_desc), Some(source_desc)) => { - self.cannot_move_out_of( - span, - &format!("`{}` which is behind a {}", place_desc, source_desc), - ) - } - (_, _) => { - self.cannot_move_out_of( - span, - &source.describe_for_unnamed_place(), - ) - } + match (self.describe_place(move_place.as_ref()), source.describe_for_named_place()) + { + (Some(place_desc), Some(source_desc)) => self.cannot_move_out_of( + span, + &format!("`{}` which is behind a {}", place_desc, source_desc), + ), + (_, _) => self.cannot_move_out_of(span, &source.describe_for_unnamed_place()), } - }, + } }; - let move_ty = format!( - "{:?}", - move_place.ty(*self.body, self.infcx.tcx).ty, - ); if let Ok(snippet) = self.infcx.tcx.sess.source_map().span_to_snippet(span) { - let is_option = move_ty.starts_with("std::option::Option"); - let is_result = move_ty.starts_with("std::result::Result"); + let def_id = match move_place.ty(*self.body, self.infcx.tcx).ty.kind { + ty::Adt(self_def, _) => self_def.did, + ty::Foreign(def_id) + | ty::FnDef(def_id, _) + | ty::Closure(def_id, _) + | ty::Generator(def_id, ..) + | ty::Opaque(def_id, _) => def_id, + _ => return err, + }; + let is_option = + self.infcx.tcx.is_diagnostic_item(Symbol::intern("option_type"), def_id); + let is_result = + self.infcx.tcx.is_diagnostic_item(Symbol::intern("result_type"), def_id); if (is_option || is_result) && use_spans.map_or(true, |v| !v.for_closure()) { err.span_suggestion( span, - &format!("consider borrowing the `{}`'s content", if is_option { - "Option" - } else { - "Result" - }), + &format!( + "consider borrowing the `{}`'s content", + if is_option { "Option" } else { "Result" } + ), format!("{}.as_ref()", snippet), Applicability::MaybeIncorrect, ); + } else if span.is_desugaring(DesugaringKind::ForLoop) + && self.infcx.tcx.is_diagnostic_item(Symbol::intern("vec_type"), def_id) + { + // FIXME: suggest for anything that implements `IntoIterator`. + err.span_suggestion( + span, + "consider iterating over a slice of the `Vec<_>`'s content", + format!("&{}", snippet), + Applicability::MaybeIncorrect, + ); } } err @@ -447,11 +430,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { span: Span, ) { match error { - GroupedMoveError::MovesFromPlace { - mut binds_to, - move_from, - .. - } => { + GroupedMoveError::MovesFromPlace { mut binds_to, move_from, .. } => { if let Ok(snippet) = self.infcx.tcx.sess.source_map().span_to_snippet(span) { err.span_suggestion( span, @@ -468,12 +447,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { None => format!("value"), }; - self.note_type_does_not_implement_copy( - err, - &place_desc, - place_ty, - Some(span) - ); + self.note_type_does_not_implement_copy(err, &place_desc, place_ty, Some(span)); } else { binds_to.sort(); binds_to.dedup(); @@ -495,36 +469,24 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { Some(desc) => format!("`{}`", desc), None => format!("value"), }; - self.note_type_does_not_implement_copy( - err, - &place_desc, - place_ty, - Some(span), - ); + self.note_type_does_not_implement_copy(err, &place_desc, place_ty, Some(span)); use_spans.args_span_label(err, format!("move out of {} occurs here", place_desc)); - use_spans.var_span_label( - err, - format!("move occurs due to use{}", use_spans.describe()), - ); - }, + use_spans + .var_span_label(err, format!("move occurs due to use{}", use_spans.describe())); + } } } - fn add_move_error_suggestions( - &self, - err: &mut DiagnosticBuilder<'a>, - binds_to: &[Local], - ) { + fn add_move_error_suggestions(&self, err: &mut DiagnosticBuilder<'a>, binds_to: &[Local]) { let mut suggestions: Vec<(Span, &str, String)> = Vec::new(); for local in binds_to { let bind_to = &self.body.local_decls[*local]; - if let LocalInfo::User( - ClearCrossCrate::Set(BindingForm::Var(VarBindingForm { - pat_span, - .. - })) - ) = bind_to.local_info { + if let LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm { + pat_span, + .. + }))) = bind_to.local_info + { if let Ok(pat_snippet) = self.infcx.tcx.sess.source_map().span_to_snippet(pat_span) { if pat_snippet.starts_with('&') { @@ -540,11 +502,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { suggestion = pat_snippet; to_remove = "&"; } - suggestions.push(( - pat_span, - to_remove, - suggestion.to_owned(), - )); + suggestions.push((pat_span, to_remove, suggestion.to_owned())); } } } @@ -561,11 +519,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { } } - fn add_move_error_details( - &self, - err: &mut DiagnosticBuilder<'a>, - binds_to: &[Local], - ) { + fn add_move_error_details(&self, err: &mut DiagnosticBuilder<'a>, binds_to: &[Local]) { for (j, local) in binds_to.into_iter().enumerate() { let bind_to = &self.body.local_decls[*local]; let binding_span = bind_to.source_info.span; @@ -581,13 +535,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { err, &format!("`{}`", self.local_names[*local].unwrap()), bind_to.ty, - Some(binding_span) + Some(binding_span), ); } } if binds_to.len() > 1 { - err.note("move occurs because these variables have types that \ + err.note( + "move occurs because these variables have types that \ don't implement the `Copy` trait", ); } diff --git a/src/librustc_mir/borrow_check/diagnostics/mutability_errors.rs b/src/librustc_mir/borrow_check/diagnostics/mutability_errors.rs index 016a3195c9..ae468e83ae 100644 --- a/src/librustc_mir/borrow_check/diagnostics/mutability_errors.rs +++ b/src/librustc_mir/borrow_check/diagnostics/mutability_errors.rs @@ -1,14 +1,14 @@ -use rustc::hir; -use rustc::hir::Node; use rustc::mir::{self, ClearCrossCrate, Local, LocalInfo, Location, ReadOnlyBodyAndCache}; -use rustc::mir::{Mutability, Place, PlaceRef, PlaceBase, ProjectionElem}; +use rustc::mir::{Mutability, Place, PlaceRef, ProjectionElem}; use rustc::ty::{self, Ty, TyCtxt}; +use rustc_hir as hir; +use rustc_hir::Node; use rustc_index::vec::Idx; -use syntax_pos::Span; -use syntax_pos::symbol::kw; +use rustc_span::symbol::kw; +use rustc_span::Span; -use crate::borrow_check::MirBorrowckCtxt; use crate::borrow_check::diagnostics::BorrowedContentSource; +use crate::borrow_check::MirBorrowckCtxt; use crate::util::collect_writes::FindAssignments; use rustc_errors::Applicability; @@ -42,31 +42,23 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { debug!("report_mutability_error: access_place_desc={:?}", access_place_desc); match the_place_err { - PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } => { + PlaceRef { local, projection: [] } => { item_msg = format!("`{}`", access_place_desc.unwrap()); if access_place.as_local().is_some() { reason = ", as it is not declared as mutable".to_string(); } else { - let name = self.local_names[*local] - .expect("immutable unnamed local"); + let name = self.local_names[*local].expect("immutable unnamed local"); reason = format!(", as `{}` is not declared as mutable", name); } } PlaceRef { - base: _, + local, projection: [proj_base @ .., ProjectionElem::Field(upvar_index, _)], } => { debug_assert!(is_closure_or_generator( - Place::ty_from( - &the_place_err.base, - proj_base, - *self.body, - self.infcx.tcx - ).ty)); + Place::ty_from(local, proj_base, *self.body, self.infcx.tcx).ty + )); item_msg = format!("`{}`", access_place_desc.unwrap()); if self.is_upvar_field_projection(access_place.as_ref()).is_some() { @@ -77,23 +69,21 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { } } - PlaceRef { - base: &PlaceBase::Local(local), - projection: [ProjectionElem::Deref], - } if self.body.local_decls[local].is_ref_for_guard() => { + PlaceRef { local, projection: [ProjectionElem::Deref] } + if self.body.local_decls[*local].is_ref_for_guard() => + { item_msg = format!("`{}`", access_place_desc.unwrap()); reason = ", as it is immutable for the pattern guard".to_string(); } - PlaceRef { - base: &PlaceBase::Local(local), - projection: [ProjectionElem::Deref], - } if self.body.local_decls[local].is_ref_to_static() => { + PlaceRef { local, projection: [ProjectionElem::Deref] } + if self.body.local_decls[*local].is_ref_to_static() => + { if access_place.projection.len() == 1 { item_msg = format!("immutable static item `{}`", access_place_desc.unwrap()); reason = String::new(); } else { item_msg = format!("`{}`", access_place_desc.unwrap()); - let local_info = &self.body.local_decls[local].local_info; + let local_info = &self.body.local_decls[*local].local_info; if let LocalInfo::StaticRef { def_id, .. } = *local_info { let static_name = &self.infcx.tcx.item_name(def_id); reason = format!(", as `{}` is an immutable static item", static_name); @@ -102,18 +92,16 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { } } } - PlaceRef { - base: _, - projection: [proj_base @ .., ProjectionElem::Deref], - } => { - if the_place_err.base == &PlaceBase::Local(Local::new(1)) && - proj_base.is_empty() && - !self.upvars.is_empty() { + PlaceRef { local: _, projection: [proj_base @ .., ProjectionElem::Deref] } => { + if *the_place_err.local == Local::new(1) + && proj_base.is_empty() + && !self.upvars.is_empty() + { item_msg = format!("`{}`", access_place_desc.unwrap()); debug_assert!(self.body.local_decls[Local::new(1)].ty.is_region_ptr()); debug_assert!(is_closure_or_generator( Place::ty_from( - the_place_err.base, + the_place_err.local, the_place_err.projection, *self.body, self.infcx.tcx @@ -121,15 +109,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { .ty )); - reason = - if self.is_upvar_field_projection(access_place.as_ref()).is_some() { - ", as it is a captured variable in a `Fn` closure".to_string() - } else { - ", as `Fn` closures cannot mutate their captured variables".to_string() - } + reason = if self.is_upvar_field_projection(access_place.as_ref()).is_some() { + ", as it is a captured variable in a `Fn` closure".to_string() + } else { + ", as `Fn` closures cannot mutate their captured variables".to_string() + } } else { let source = self.borrowed_content_source(PlaceRef { - base: the_place_err.base, + local: the_place_err.local, projection: proj_base, }); let pointer_type = source.describe_for_immutable_place(); @@ -149,26 +136,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { } } - PlaceRef { - base: PlaceBase::Static(_), - .. - } - | PlaceRef { - base: _, - projection: [.., ProjectionElem::Index(_)], - } - | PlaceRef { - base: _, - projection: [.., ProjectionElem::ConstantIndex { .. }], - } - | PlaceRef { - base: _, - projection: [.., ProjectionElem::Subslice { .. }], + PlaceRef { local: _, projection: [.., ProjectionElem::Index(_)] } + | PlaceRef { local: _, projection: [.., ProjectionElem::ConstantIndex { .. }] } + | PlaceRef { local: _, projection: [.., ProjectionElem::Subslice { .. }] } + | PlaceRef { local: _, projection: [.., ProjectionElem::Downcast(..)] } => { + bug!("Unexpected immutable place.") } - | PlaceRef { - base: _, - projection: [.., ProjectionElem::Downcast(..)], - } => bug!("Unexpected immutable place."), } debug!("report_mutability_error: item_msg={:?}, reason={:?}", item_msg, reason); @@ -191,18 +164,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { let borrow_spans = self.borrow_spans(span, location); let borrow_span = borrow_spans.args_or_use(); - err = self.cannot_borrow_path_as_mutable_because( - borrow_span, - &item_msg, - &reason, - ); + err = self.cannot_borrow_path_as_mutable_because(borrow_span, &item_msg, &reason); borrow_spans.var_span_label( &mut err, format!( "mutable borrow occurs due to use of `{}` in closure", // always Some() if the message is printed. self.describe_place(access_place.as_ref()).unwrap_or_default(), - ) + ), ); borrow_span } @@ -218,18 +187,15 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { // struct we've got a field access of (it must be a reference since there's a deref // after the field access). PlaceRef { - base, - projection: [proj_base @ .., - ProjectionElem::Deref, - ProjectionElem::Field(field, _), - ProjectionElem::Deref, - ], + local, + projection: + [proj_base @ .., ProjectionElem::Deref, ProjectionElem::Field(field, _), ProjectionElem::Deref], } => { err.span_label(span, format!("cannot {ACT}", ACT = act)); if let Some((span, message)) = annotate_struct_field( self.infcx.tcx, - Place::ty_from(base, proj_base, *self.body, self.infcx.tcx).ty, + Place::ty_from(local, proj_base, *self.body, self.infcx.tcx).ty, field, ) { err.span_suggestion( @@ -239,49 +205,50 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { Applicability::MaybeIncorrect, ); } - }, + } // Suggest removing a `&mut` from the use of a mutable reference. - PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } if { - self.body.local_decls.get(*local).map(|local_decl| { - if let LocalInfo::User(ClearCrossCrate::Set( - mir::BindingForm::ImplicitSelf(kind) - )) = local_decl.local_info { - // Check if the user variable is a `&mut self` and we can therefore - // suggest removing the `&mut`. - // - // Deliberately fall into this case for all implicit self types, - // so that we don't fall in to the next case with them. - kind == mir::ImplicitSelfKind::MutRef - } else if Some(kw::SelfLower) == self.local_names[*local] { - // Otherwise, check if the name is the self kewyord - in which case - // we have an explicit self. Do the same thing in this case and check - // for a `self: &mut Self` to suggest removing the `&mut`. - if let ty::Ref( - _, _, hir::Mutability::Mutable - ) = local_decl.ty.kind { - true - } else { - false - } - } else { - false - } - }).unwrap_or(false) - } => { + PlaceRef { local, projection: [] } + if { + self.body + .local_decls + .get(*local) + .map(|local_decl| { + if let LocalInfo::User(ClearCrossCrate::Set( + mir::BindingForm::ImplicitSelf(kind), + )) = local_decl.local_info + { + // Check if the user variable is a `&mut self` and we can therefore + // suggest removing the `&mut`. + // + // Deliberately fall into this case for all implicit self types, + // so that we don't fall in to the next case with them. + kind == mir::ImplicitSelfKind::MutRef + } else if Some(kw::SelfLower) == self.local_names[*local] { + // Otherwise, check if the name is the self kewyord - in which case + // we have an explicit self. Do the same thing in this case and check + // for a `self: &mut Self` to suggest removing the `&mut`. + if let ty::Ref(_, _, hir::Mutability::Mut) = local_decl.ty.kind { + true + } else { + false + } + } else { + false + } + }) + .unwrap_or(false) + } => + { err.span_label(span, format!("cannot {ACT}", ACT = act)); err.span_label(span, "try removing `&mut` here"); - }, + } // We want to suggest users use `let mut` for local (user // variable) mutations... - PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } if self.body.local_decls[*local].can_be_made_mutable() => { + PlaceRef { local, projection: [] } + if self.body.local_decls[*local].can_be_made_mutable() => + { // ... but it doesn't make sense to suggest it on // variables that are `ref x`, `ref mut x`, `&self`, // or `&mut self` (such variables are simply not @@ -300,18 +267,17 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { // Also suggest adding mut for upvars PlaceRef { - base, + local, projection: [proj_base @ .., ProjectionElem::Field(upvar_index, _)], } => { debug_assert!(is_closure_or_generator( - Place::ty_from(base, proj_base, *self.body, self.infcx.tcx).ty + Place::ty_from(local, proj_base, *self.body, self.infcx.tcx).ty )); err.span_label(span, format!("cannot {ACT}", ACT = act)); let upvar_hir_id = self.upvars[upvar_index.index()].var_hir_id; - if let Some(Node::Binding(pat)) = self.infcx.tcx.hir().find(upvar_hir_id) - { + if let Some(Node::Binding(pat)) = self.infcx.tcx.hir().find(upvar_hir_id) { if let hir::PatKind::Binding( hir::BindingAnnotation::Unannotated, _, @@ -332,10 +298,8 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { // complete hack to approximate old AST-borrowck // diagnostic: if the span starts with a mutable borrow of // a local variable, then just suggest the user remove it. - PlaceRef { - base: PlaceBase::Local(_), - projection: [], - } if { + PlaceRef { local: _, projection: [] } + if { if let Ok(snippet) = self.infcx.tcx.sess.source_map().span_to_snippet(span) { snippet.starts_with("&mut ") } else { @@ -347,10 +311,9 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { err.span_label(span, "try removing `&mut` here"); } - PlaceRef { - base: PlaceBase::Local(local), - projection: [ProjectionElem::Deref], - } if self.body.local_decls[*local].is_ref_for_guard() => { + PlaceRef { local, projection: [ProjectionElem::Deref] } + if self.body.local_decls[*local].is_ref_for_guard() => + { err.span_label(span, format!("cannot {ACT}", ACT = act)); err.note( "variables bound in patterns are immutable until the end of the pattern guard", @@ -362,10 +325,8 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { // // FIXME: can this case be generalized to work for an // arbitrary base for the projection? - PlaceRef { - base: PlaceBase::Local(local), - projection: [ProjectionElem::Deref], - } if self.body.local_decls[*local].is_user_variable() => + PlaceRef { local, projection: [ProjectionElem::Deref] } + if self.body.local_decls[*local].is_user_variable() => { let local_decl = &self.body.local_decls[*local]; let suggestion = match local_decl.local_info { @@ -447,43 +408,34 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { } PlaceRef { - base, + local, projection: [ProjectionElem::Deref], - // FIXME document what is this 1 magic number about - } if *base == PlaceBase::Local(Local::new(1)) && - !self.upvars.is_empty() => - { + // FIXME document what is this 1 magic number about + } if *local == Local::new(1) && !self.upvars.is_empty() => { err.span_label(span, format!("cannot {ACT}", ACT = act)); err.span_help( self.body.span, - "consider changing this to accept closures that implement `FnMut`" + "consider changing this to accept closures that implement `FnMut`", ); } - PlaceRef { - base: _, - projection: [.., ProjectionElem::Deref], - } => { + PlaceRef { local: _, projection: [.., ProjectionElem::Deref] } => { err.span_label(span, format!("cannot {ACT}", ACT = act)); match opt_source { Some(BorrowedContentSource::OverloadedDeref(ty)) => { - err.help( - &format!( - "trait `DerefMut` is required to modify through a dereference, \ + err.help(&format!( + "trait `DerefMut` is required to modify through a dereference, \ but it is not implemented for `{}`", - ty, - ), - ); - }, + ty, + )); + } Some(BorrowedContentSource::OverloadedIndex(ty)) => { - err.help( - &format!( - "trait `IndexMut` is required to modify indexed content, \ + err.help(&format!( + "trait `IndexMut` is required to modify indexed content, \ but it is not implemented for `{}`", - ty, - ), - ); + ty, + )); } _ => (), } @@ -503,17 +455,20 @@ fn suggest_ampmut_self<'tcx>( local_decl: &mir::LocalDecl<'tcx>, ) -> (Span, String) { let sp = local_decl.source_info.span; - (sp, match tcx.sess.source_map().span_to_snippet(sp) { - Ok(snippet) => { - let lt_pos = snippet.find('\''); - if let Some(lt_pos) = lt_pos { - format!("&{}mut self", &snippet[lt_pos..snippet.len() - 4]) - } else { - "&mut self".to_string() + ( + sp, + match tcx.sess.source_map().span_to_snippet(sp) { + Ok(snippet) => { + let lt_pos = snippet.find('\''); + if let Some(lt_pos) = lt_pos { + format!("&{}mut self", &snippet[lt_pos..snippet.len() - 4]) + } else { + "&mut self".to_string() + } } - } - _ => "&mut self".to_string() - }) + _ => "&mut self".to_string(), + }, + ) } // When we want to suggest a user change a local variable to be a `&mut`, there @@ -542,10 +497,9 @@ fn suggest_ampmut<'tcx>( if !locations.is_empty() { let assignment_rhs_span = body.source_info(locations[0]).span; if let Ok(src) = tcx.sess.source_map().span_to_snippet(assignment_rhs_span) { - if let (true, Some(ws_pos)) = ( - src.starts_with("&'"), - src.find(|c: char| -> bool { c.is_whitespace() }), - ) { + if let (true, Some(ws_pos)) = + (src.starts_with("&'"), src.find(|c: char| -> bool { c.is_whitespace() })) + { let lt_name = &src[1..ws_pos]; let ty = &src[ws_pos..]; return (assignment_rhs_span, format!("&{} mut {}", lt_name, ty)); @@ -567,10 +521,9 @@ fn suggest_ampmut<'tcx>( }; if let Ok(src) = tcx.sess.source_map().span_to_snippet(highlight_span) { - if let (true, Some(ws_pos)) = ( - src.starts_with("&'"), - src.find(|c: char| -> bool { c.is_whitespace() }), - ) { + if let (true, Some(ws_pos)) = + (src.starts_with("&'"), src.find(|c: char| -> bool { c.is_whitespace() })) + { let lt_name = &src[1..ws_pos]; let ty = &src[ws_pos..]; return (highlight_span, format!("&{} mut{}", lt_name, ty)); @@ -578,13 +531,15 @@ fn suggest_ampmut<'tcx>( } let ty_mut = local_decl.ty.builtin_deref(true).unwrap(); - assert_eq!(ty_mut.mutbl, hir::Mutability::Immutable); - (highlight_span, - if local_decl.ty.is_region_ptr() { - format!("&mut {}", ty_mut.ty) - } else { - format!("*mut {}", ty_mut.ty) - }) + assert_eq!(ty_mut.mutbl, hir::Mutability::Not); + ( + highlight_span, + if local_decl.ty.is_region_ptr() { + format!("&mut {}", ty_mut.ty) + } else { + format!("*mut {}", ty_mut.ty) + }, + ) } fn is_closure_or_generator(ty: Ty<'_>) -> bool { @@ -613,10 +568,11 @@ fn annotate_struct_field( // Now we're dealing with the actual struct that we're going to suggest a change to, // we can expect a field that is an immutable reference to a type. if let hir::Node::Field(field) = node { - if let hir::TyKind::Rptr(lifetime, hir::MutTy { - mutbl: hir::Mutability::Immutable, - ref ty - }) = field.ty.kind { + if let hir::TyKind::Rptr( + lifetime, + hir::MutTy { mutbl: hir::Mutability::Not, ref ty }, + ) = field.ty.kind + { // Get the snippets in two parts - the named lifetime (if there is one) and // type being referenced, that way we can reconstruct the snippet without loss // of detail. @@ -629,10 +585,7 @@ fn annotate_struct_field( return Some(( field.ty.span, - format!( - "&{}mut {}", - lifetime_snippet, &*type_snippet, - ), + format!("&{}mut {}", lifetime_snippet, &*type_snippet,), )); } } @@ -645,9 +598,7 @@ fn annotate_struct_field( /// If possible, suggest replacing `ref` with `ref mut`. fn suggest_ref_mut(tcx: TyCtxt<'_>, binding_span: Span) -> Option { let hi_src = tcx.sess.source_map().span_to_snippet(binding_span).ok()?; - if hi_src.starts_with("ref") - && hi_src["ref".len()..].starts_with(rustc_lexer::is_whitespace) - { + if hi_src.starts_with("ref") && hi_src["ref".len()..].starts_with(rustc_lexer::is_whitespace) { let replacement = format!("ref mut{}", &hi_src["ref".len()..]); Some(replacement) } else { diff --git a/src/librustc_mir/borrow_check/diagnostics/outlives_suggestion.rs b/src/librustc_mir/borrow_check/diagnostics/outlives_suggestion.rs index b61c37b061..ee9489078b 100644 --- a/src/librustc_mir/borrow_check/diagnostics/outlives_suggestion.rs +++ b/src/librustc_mir/borrow_check/diagnostics/outlives_suggestion.rs @@ -4,20 +4,15 @@ use std::collections::BTreeMap; use log::debug; -use rustc::{hir::def_id::DefId, infer::InferCtxt, ty::RegionVid}; -use rustc::mir::{Body, Local}; +use rustc::ty::RegionVid; use rustc_data_structures::fx::FxHashSet; -use rustc_errors::{Diagnostic, DiagnosticBuilder}; -use rustc_index::vec::IndexVec; -use syntax_pos::symbol::Symbol; +use rustc_errors::DiagnosticBuilder; use smallvec::SmallVec; -use crate::borrow_check::region_infer::RegionInferenceContext; +use crate::borrow_check::MirBorrowckCtxt; -use super::{ - RegionName, RegionNameSource, ErrorConstraintInfo, ErrorReportingCtx, RegionErrorNamingCtx, -}; +use super::{ErrorConstraintInfo, RegionName, RegionNameSource}; /// The different things we could suggest. enum SuggestedConstraint { @@ -35,12 +30,8 @@ enum SuggestedConstraint { /// corresponding to a function definition. /// /// Adds a help note suggesting adding a where clause with the needed constraints. -pub struct OutlivesSuggestionBuilder<'a> { - /// The MIR DefId of the fn with the lifetime error. - mir_def_id: DefId, - - local_names: &'a IndexVec>, - +#[derive(Default)] +pub struct OutlivesSuggestionBuilder { /// The list of outlives constraints that need to be added. Specifically, we map each free /// region to all other regions that it must outlive. I will use the shorthand `fr: /// outlived_frs`. Not all of these regions will already have names necessarily. Some could be @@ -49,19 +40,7 @@ pub struct OutlivesSuggestionBuilder<'a> { constraints_to_add: BTreeMap>, } -impl OutlivesSuggestionBuilder<'a> { - /// Create a new builder for the given MIR node representing a fn definition. - crate fn new( - mir_def_id: DefId, - local_names: &'a IndexVec>, - ) -> Self { - OutlivesSuggestionBuilder { - mir_def_id, - local_names, - constraints_to_add: BTreeMap::default(), - } - } - +impl OutlivesSuggestionBuilder { /// Returns `true` iff the `RegionNameSource` is a valid source for an outlives /// suggestion. // @@ -97,23 +76,16 @@ impl OutlivesSuggestionBuilder<'a> { /// Returns a name for the region if it is suggestable. See `region_name_is_suggestable`. fn region_vid_to_name( &self, - errctx: &ErrorReportingCtx<'_, '_, '_>, - renctx: &mut RegionErrorNamingCtx, + mbcx: &MirBorrowckCtxt<'_, '_>, region: RegionVid, ) -> Option { - errctx - .region_infcx - .give_region_a_name(errctx, renctx, region) - .filter(Self::region_name_is_suggestable) + mbcx.give_region_a_name(region).filter(Self::region_name_is_suggestable) } /// Compiles a list of all suggestions to be printed in the final big suggestion. - fn compile_all_suggestions<'tcx>( + fn compile_all_suggestions( &self, - body: &Body<'tcx>, - region_infcx: &RegionInferenceContext<'tcx>, - infcx: &InferCtxt<'_, 'tcx>, - renctx: &mut RegionErrorNamingCtx, + mbcx: &MirBorrowckCtxt<'_, '_>, ) -> SmallVec<[SuggestedConstraint; 2]> { let mut suggested = SmallVec::new(); @@ -121,20 +93,8 @@ impl OutlivesSuggestionBuilder<'a> { // out silly duplicate messages. let mut unified_already = FxHashSet::default(); - let errctx = ErrorReportingCtx { - region_infcx, - infcx, - body, - mir_def_id: self.mir_def_id, - local_names: self.local_names, - - // We should not be suggesting naming upvars, so we pass in a dummy set of upvars that - // should never be used. - upvars: &[], - }; - for (fr, outlived) in &self.constraints_to_add { - let fr_name = if let Some(fr_name) = self.region_vid_to_name(&errctx, renctx, *fr) { + let fr_name = if let Some(fr_name) = self.region_vid_to_name(mbcx, *fr) { fr_name } else { continue; @@ -143,9 +103,7 @@ impl OutlivesSuggestionBuilder<'a> { let outlived = outlived .iter() // if there is a `None`, we will just omit that constraint - .filter_map(|fr| { - self.region_vid_to_name(&errctx, renctx, *fr).map(|rname| (fr, rname)) - }) + .filter_map(|fr| self.region_vid_to_name(mbcx, *fr).map(|rname| (fr, rname))) .collect::>(); // No suggestable outlived lifetimes. @@ -160,11 +118,7 @@ impl OutlivesSuggestionBuilder<'a> { // 3) Suggest unifying 'a with 'b if we have both 'a: 'b and 'b: 'a if outlived.iter().any(|(_, outlived_name)| { - if let RegionNameSource::Static = outlived_name.source { - true - } else { - false - } + if let RegionNameSource::Static = outlived_name.source { true } else { false } }) { suggested.push(SuggestedConstraint::Static(fr_name)); } else { @@ -211,14 +165,13 @@ impl OutlivesSuggestionBuilder<'a> { /// suggestable. crate fn intermediate_suggestion( &mut self, - errctx: &ErrorReportingCtx<'_, '_, '_>, + mbcx: &MirBorrowckCtxt<'_, '_>, errci: &ErrorConstraintInfo, - renctx: &mut RegionErrorNamingCtx, diag: &mut DiagnosticBuilder<'_>, ) { // Emit an intermediate note. - let fr_name = self.region_vid_to_name(errctx, renctx, errci.fr); - let outlived_fr_name = self.region_vid_to_name(errctx, renctx, errci.outlived_fr); + let fr_name = self.region_vid_to_name(mbcx, errci.fr); + let outlived_fr_name = self.region_vid_to_name(mbcx, errci.outlived_fr); if let (Some(fr_name), Some(outlived_fr_name)) = (fr_name, outlived_fr_name) { if let RegionNameSource::Static = outlived_fr_name.source { @@ -234,14 +187,7 @@ impl OutlivesSuggestionBuilder<'a> { /// If there is a suggestion to emit, add a diagnostic to the buffer. This is the final /// suggestion including all collected constraints. - crate fn add_suggestion<'tcx>( - &self, - body: &Body<'tcx>, - region_infcx: &RegionInferenceContext<'tcx>, - infcx: &InferCtxt<'_, 'tcx>, - errors_buffer: &mut Vec, - renctx: &mut RegionErrorNamingCtx, - ) { + crate fn add_suggestion(&self, mbcx: &mut MirBorrowckCtxt<'_, '_>) { // No constraints to add? Done. if self.constraints_to_add.is_empty() { debug!("No constraints to suggest."); @@ -250,13 +196,15 @@ impl OutlivesSuggestionBuilder<'a> { // If there is only one constraint to suggest, then we already suggested it in the // intermediate suggestion above. - if self.constraints_to_add.len() == 1 { + if self.constraints_to_add.len() == 1 + && self.constraints_to_add.values().next().unwrap().len() == 1 + { debug!("Only 1 suggestion. Skipping."); return; } // Get all suggestable constraints. - let suggested = self.compile_all_suggestions(body, region_infcx, infcx, renctx); + let suggested = self.compile_all_suggestions(mbcx); // If there are no suggestable constraints... if suggested.is_empty() { @@ -267,7 +215,7 @@ impl OutlivesSuggestionBuilder<'a> { // If there is exactly one suggestable constraints, then just suggest it. Otherwise, emit a // list of diagnostics. let mut diag = if suggested.len() == 1 { - infcx.tcx.sess.diagnostic().struct_help(&match suggested.last().unwrap() { + mbcx.infcx.tcx.sess.diagnostic().struct_help(&match suggested.last().unwrap() { SuggestedConstraint::Outlives(a, bs) => { let bs: SmallVec<[String; 2]> = bs.iter().map(|r| format!("{}", r)).collect(); format!("add bound `{}: {}`", a, bs.join(" + ")) @@ -280,7 +228,8 @@ impl OutlivesSuggestionBuilder<'a> { }) } else { // Create a new diagnostic. - let mut diag = infcx + let mut diag = mbcx + .infcx .tcx .sess .diagnostic() @@ -310,10 +259,10 @@ impl OutlivesSuggestionBuilder<'a> { }; // We want this message to appear after other messages on the mir def. - let mir_span = infcx.tcx.def_span(self.mir_def_id); + let mir_span = mbcx.infcx.tcx.def_span(mbcx.mir_def_id); diag.sort_span = mir_span.shrink_to_hi(); // Buffer the diagnostic - diag.buffer(errors_buffer); + diag.buffer(&mut mbcx.errors_buffer); } } diff --git a/src/librustc_mir/borrow_check/diagnostics/region_errors.rs b/src/librustc_mir/borrow_check/diagnostics/region_errors.rs index 8a37e2d02e..b999dfa303 100644 --- a/src/librustc_mir/borrow_check/diagnostics/region_errors.rs +++ b/src/librustc_mir/borrow_check/diagnostics/region_errors.rs @@ -1,31 +1,25 @@ //! Error reporting machinery for lifetime errors. -use rustc::hir::def_id::DefId; -use rustc::infer::error_reporting::nice_region_error::NiceRegionError; -use rustc::infer::InferCtxt; -use rustc::infer::NLLRegionVariableOrigin; -use rustc::mir::{ConstraintCategory, Local, Location, Body}; -use rustc::ty::{self, RegionVid}; -use rustc_index::vec::IndexVec; -use rustc_errors::DiagnosticBuilder; -use std::collections::VecDeque; -use syntax::errors::Applicability; -use syntax::symbol::kw; -use syntax_pos::Span; -use syntax_pos::symbol::Symbol; +use rustc::infer::{ + error_reporting::nice_region_error::NiceRegionError, opaque_types, NLLRegionVariableOrigin, +}; +use rustc::mir::ConstraintCategory; +use rustc::ty::{self, RegionVid, Ty}; +use rustc_errors::{Applicability, DiagnosticBuilder}; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::kw; +use rustc_span::Span; use crate::util::borrowck_errors; use crate::borrow_check::{ - constraints::OutlivesConstraint, - region_infer::RegionInferenceContext, - type_check::Locations, - universal_regions::DefiningTy, nll::ConstraintDescription, - Upvar, + region_infer::{values::RegionElement, TypeTest}, + universal_regions::DefiningTy, + MirBorrowckCtxt, }; -use super::{OutlivesSuggestionBuilder, RegionName, RegionNameSource, RegionErrorNamingCtx}; +use super::{OutlivesSuggestionBuilder, RegionName, RegionNameSource}; impl ConstraintDescription for ConstraintCategory { fn description(&self) -> &'static str { @@ -50,32 +44,50 @@ impl ConstraintDescription for ConstraintCategory { } } -#[derive(Copy, Clone, PartialEq, Eq)] -enum Trace { - StartRegion, - FromOutlivesConstraint(OutlivesConstraint), - NotVisited, -} - -/// Various pieces of state used when reporting borrow checker errors. -pub struct ErrorReportingCtx<'a, 'b, 'tcx> { - /// The region inference context used for borrow chekcing this MIR body. - pub(super) region_infcx: &'b RegionInferenceContext<'tcx>, - - /// The inference context used for type checking. - pub(super) infcx: &'b InferCtxt<'a, 'tcx>, - - /// The MIR def we are reporting errors on. - pub(super) mir_def_id: DefId, - - /// The MIR body we are reporting errors on (for convenience). - pub(super) body: &'b Body<'tcx>, +/// A collection of errors encountered during region inference. This is needed to efficiently +/// report errors after borrow checking. +/// +/// Usually we expect this to either be empty or contain a small number of items, so we can avoid +/// allocation most of the time. +crate type RegionErrors<'tcx> = Vec>; - /// User variable names for MIR locals (where applicable). - pub(super) local_names: &'b IndexVec>, +#[derive(Clone, Debug)] +crate enum RegionErrorKind<'tcx> { + /// A generic bound failure for a type test (`T: 'a`). + TypeTestError { type_test: TypeTest<'tcx> }, + + /// An unexpected hidden region for an opaque type. + UnexpectedHiddenRegion { + /// The def id of the opaque type. + opaque_type_def_id: DefId, + /// The hidden type. + hidden_ty: Ty<'tcx>, + /// The unexpected region. + member_region: ty::Region<'tcx>, + }, + + /// Higher-ranked subtyping error. + BoundUniversalRegionError { + /// The placeholder free region. + longer_fr: RegionVid, + /// The region element that erroneously must be outlived by `longer_fr`. + error_element: RegionElement, + /// The origin of the placeholder region. + fr_origin: NLLRegionVariableOrigin, + }, - /// Any upvars for the MIR body we have kept track of during borrow checking. - pub(super) upvars: &'b [Upvar], + /// Any other lifetime error. + RegionError { + /// The origin of the region. + fr_origin: NLLRegionVariableOrigin, + /// The region that should outlive `shorter_fr`. + longer_fr: RegionVid, + /// The region that should be shorter, but we can't prove it. + shorter_fr: RegionVid, + /// Indicates whether this is a reported error. We currently only report the first error + /// encountered and leave the rest unreported so as not to overwhelm the user. + is_reported: bool, + }, } /// Information about the various region constraints involved in a borrow checker error. @@ -92,271 +104,161 @@ pub struct ErrorConstraintInfo { pub(super) span: Span, } -impl<'tcx> RegionInferenceContext<'tcx> { - /// Tries to find the best constraint to blame for the fact that - /// `R: from_region`, where `R` is some region that meets - /// `target_test`. This works by following the constraint graph, - /// creating a constraint path that forces `R` to outlive - /// `from_region`, and then finding the best choices within that - /// path to blame. - fn best_blame_constraint( - &self, - body: &Body<'tcx>, - from_region: RegionVid, - from_region_origin: NLLRegionVariableOrigin, - target_test: impl Fn(RegionVid) -> bool, - ) -> (ConstraintCategory, bool, Span) { - debug!("best_blame_constraint(from_region={:?}, from_region_origin={:?})", - from_region, from_region_origin); - - // Find all paths - let (path, target_region) = - self.find_constraint_paths_between_regions(from_region, target_test) - .unwrap(); - debug!( - "best_blame_constraint: path={:#?}", - path.iter() - .map(|&c| format!( - "{:?} ({:?}: {:?})", - c, - self.constraint_sccs.scc(c.sup), - self.constraint_sccs.scc(c.sub), - )) - .collect::>() - ); - - // Classify each of the constraints along the path. - let mut categorized_path: Vec<(ConstraintCategory, bool, Span)> = path.iter() - .map(|constraint| { - if constraint.category == ConstraintCategory::ClosureBounds { - self.retrieve_closure_constraint_info(body, &constraint) - } else { - (constraint.category, false, constraint.locations.span(body)) - } - }) - .collect(); - debug!( - "best_blame_constraint: categorized_path={:#?}", - categorized_path - ); - - // To find the best span to cite, we first try to look for the - // final constraint that is interesting and where the `sup` is - // not unified with the ultimate target region. The reason - // for this is that we have a chain of constraints that lead - // from the source to the target region, something like: - // - // '0: '1 ('0 is the source) - // '1: '2 - // '2: '3 - // '3: '4 - // '4: '5 - // '5: '6 ('6 is the target) - // - // Some of those regions are unified with `'6` (in the same - // SCC). We want to screen those out. After that point, the - // "closest" constraint we have to the end is going to be the - // most likely to be the point where the value escapes -- but - // we still want to screen for an "interesting" point to - // highlight (e.g., a call site or something). - let target_scc = self.constraint_sccs.scc(target_region); - let mut range = 0..path.len(); - - // As noted above, when reporting an error, there is typically a chain of constraints - // leading from some "source" region which must outlive some "target" region. - // In most cases, we prefer to "blame" the constraints closer to the target -- - // but there is one exception. When constraints arise from higher-ranked subtyping, - // we generally prefer to blame the source value, - // as the "target" in this case tends to be some type annotation that the user gave. - // Therefore, if we find that the region origin is some instantiation - // of a higher-ranked region, we start our search from the "source" point - // rather than the "target", and we also tweak a few other things. - // - // An example might be this bit of Rust code: - // - // ```rust - // let x: fn(&'static ()) = |_| {}; - // let y: for<'a> fn(&'a ()) = x; - // ``` - // - // In MIR, this will be converted into a combination of assignments and type ascriptions. - // In particular, the 'static is imposed through a type ascription: - // - // ```rust - // x = ...; - // AscribeUserType(x, fn(&'static ()) - // y = x; - // ``` - // - // We wind up ultimately with constraints like - // - // ```rust - // !a: 'temp1 // from the `y = x` statement - // 'temp1: 'temp2 - // 'temp2: 'static // from the AscribeUserType - // ``` - // - // and here we prefer to blame the source (the y = x statement). - let blame_source = match from_region_origin { - NLLRegionVariableOrigin::FreeRegion - | NLLRegionVariableOrigin::Existential { from_forall: false } => { - true - } - NLLRegionVariableOrigin::Placeholder(_) - | NLLRegionVariableOrigin::Existential { from_forall: true } => { - false - } - }; - - let find_region = |i: &usize| { - let constraint = path[*i]; +impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { + /// Converts a region inference variable into a `ty::Region` that + /// we can use for error reporting. If `r` is universally bound, + /// then we use the name that we have on record for it. If `r` is + /// existentially bound, then we check its inferred value and try + /// to find a good name from that. Returns `None` if we can't find + /// one (e.g., this is just some random part of the CFG). + pub(super) fn to_error_region(&self, r: RegionVid) -> Option> { + self.to_error_region_vid(r).and_then(|r| self.regioncx.region_definition(r).external_name) + } - let constraint_sup_scc = self.constraint_sccs.scc(constraint.sup); + /// Returns the `RegionVid` corresponding to the region returned by + /// `to_error_region`. + pub(super) fn to_error_region_vid(&self, r: RegionVid) -> Option { + if self.regioncx.universal_regions().is_universal_region(r) { + Some(r) + } else { + let upper_bound = self.regioncx.universal_upper_bound(r); - if blame_source { - match categorized_path[*i].0 { - ConstraintCategory::OpaqueType | ConstraintCategory::Boring | - ConstraintCategory::BoringNoLocation | ConstraintCategory::Internal => false, - ConstraintCategory::TypeAnnotation | ConstraintCategory::Return | - ConstraintCategory::Yield => true, - _ => constraint_sup_scc != target_scc, - } + if self.regioncx.upper_bound_in_region_scc(r, upper_bound) { + self.to_error_region_vid(upper_bound) } else { - match categorized_path[*i].0 { - ConstraintCategory::OpaqueType | ConstraintCategory::Boring | - ConstraintCategory::BoringNoLocation | ConstraintCategory::Internal => false, - _ => true - } + None } - }; - - let best_choice = if blame_source { - range.rev().find(find_region) - } else { - range.find(find_region) - }; - - debug!("best_blame_constraint: best_choice={:?} blame_source={}", - best_choice, blame_source); + } + } - if let Some(i) = best_choice { - if let Some(next) = categorized_path.get(i + 1) { - if categorized_path[i].0 == ConstraintCategory::Return - && next.0 == ConstraintCategory::OpaqueType + /// Returns `true` if a closure is inferred to be an `FnMut` closure. + fn is_closure_fn_mut(&self, fr: RegionVid) -> bool { + if let Some(ty::ReFree(free_region)) = self.to_error_region(fr) { + if let ty::BoundRegion::BrEnv = free_region.bound_region { + if let DefiningTy::Closure(def_id, substs) = + self.regioncx.universal_regions().defining_ty { - // The return expression is being influenced by the return type being - // impl Trait, point at the return type and not the return expr. - return *next; + return substs.as_closure().kind(def_id, self.infcx.tcx) + == ty::ClosureKind::FnMut; } } - return categorized_path[i]; } - // If that search fails, that is.. unusual. Maybe everything - // is in the same SCC or something. In that case, find what - // appears to be the most interesting point to report to the - // user via an even more ad-hoc guess. - categorized_path.sort_by(|p0, p1| p0.0.cmp(&p1.0)); - debug!("`: sorted_path={:#?}", categorized_path); - - *categorized_path.first().unwrap() + false } - /// Walks the graph of constraints (where `'a: 'b` is considered - /// an edge `'a -> 'b`) to find all paths from `from_region` to - /// `to_region`. The paths are accumulated into the vector - /// `results`. The paths are stored as a series of - /// `ConstraintIndex` values -- in other words, a list of *edges*. - /// - /// Returns: a series of constraints as well as the region `R` - /// that passed the target test. - fn find_constraint_paths_between_regions( - &self, - from_region: RegionVid, - target_test: impl Fn(RegionVid) -> bool, - ) -> Option<(Vec, RegionVid)> { - let mut context = IndexVec::from_elem(Trace::NotVisited, &self.definitions); - context[from_region] = Trace::StartRegion; - - // Use a deque so that we do a breadth-first search. We will - // stop at the first match, which ought to be the shortest - // path (fewest constraints). - let mut deque = VecDeque::new(); - deque.push_back(from_region); - - while let Some(r) = deque.pop_front() { - debug!( - "find_constraint_paths_between_regions: from_region={:?} r={:?} value={}", - from_region, - r, - self.region_value_str(r), - ); - - // Check if we reached the region we were looking for. If so, - // we can reconstruct the path that led to it and return it. - if target_test(r) { - let mut result = vec![]; - let mut p = r; - loop { - match context[p] { - Trace::NotVisited => { - bug!("found unvisited region {:?} on path to {:?}", p, r) - } - - Trace::FromOutlivesConstraint(c) => { - result.push(c); - p = c.sup; - } - - Trace::StartRegion => { - result.reverse(); - return Some((result, r)); - } + /// Produces nice borrowck error diagnostics for all the errors collected in `nll_errors`. + pub(in crate::borrow_check) fn report_region_errors(&mut self, nll_errors: RegionErrors<'tcx>) { + // Iterate through all the errors, producing a diagnostic for each one. The diagnostics are + // buffered in the `MirBorrowckCtxt`. + + let mut outlives_suggestion = OutlivesSuggestionBuilder::default(); + + for nll_error in nll_errors.into_iter() { + match nll_error { + RegionErrorKind::TypeTestError { type_test } => { + // Try to convert the lower-bound region into something named we can print for the user. + let lower_bound_region = self.to_error_region(type_test.lower_bound); + + let type_test_span = type_test.locations.span(&self.body); + + if let Some(lower_bound_region) = lower_bound_region { + let region_scope_tree = &self.infcx.tcx.region_scope_tree(self.mir_def_id); + self.infcx + .construct_generic_bound_failure( + region_scope_tree, + type_test_span, + None, + type_test.generic_kind, + lower_bound_region, + ) + .buffer(&mut self.errors_buffer); + } else { + // FIXME. We should handle this case better. It + // indicates that we have e.g., some region variable + // whose value is like `'a+'b` where `'a` and `'b` are + // distinct unrelated univesal regions that are not + // known to outlive one another. It'd be nice to have + // some examples where this arises to decide how best + // to report it; we could probably handle it by + // iterating over the universal regions and reporting + // an error that multiple bounds are required. + self.infcx + .tcx + .sess + .struct_span_err( + type_test_span, + &format!("`{}` does not live long enough", type_test.generic_kind), + ) + .buffer(&mut self.errors_buffer); } } - } - // Otherwise, walk over the outgoing constraints and - // enqueue any regions we find, keeping track of how we - // reached them. - - // A constraint like `'r: 'x` can come from our constraint - // graph. - let fr_static = self.universal_regions.fr_static; - let outgoing_edges_from_graph = self.constraint_graph - .outgoing_edges(r, &self.constraints, fr_static); - - // Always inline this closure because it can be hot. - let mut handle_constraint = #[inline(always)] |constraint: OutlivesConstraint| { - debug_assert_eq!(constraint.sup, r); - let sub_region = constraint.sub; - if let Trace::NotVisited = context[sub_region] { - context[sub_region] = Trace::FromOutlivesConstraint(constraint); - deque.push_back(sub_region); + RegionErrorKind::UnexpectedHiddenRegion { + opaque_type_def_id, + hidden_ty, + member_region, + } => { + let region_scope_tree = &self.infcx.tcx.region_scope_tree(self.mir_def_id); + opaque_types::unexpected_hidden_region_diagnostic( + self.infcx.tcx, + Some(region_scope_tree), + opaque_type_def_id, + hidden_ty, + member_region, + ) + .buffer(&mut self.errors_buffer); } - }; - // This loop can be hot. - for constraint in outgoing_edges_from_graph { - handle_constraint(constraint); - } + RegionErrorKind::BoundUniversalRegionError { + longer_fr, + fr_origin, + error_element, + } => { + let error_region = self.regioncx.region_from_element(longer_fr, error_element); + + // Find the code to blame for the fact that `longer_fr` outlives `error_fr`. + let (_, span) = self.regioncx.find_outlives_blame_span( + &self.body, + longer_fr, + fr_origin, + error_region, + ); + + // FIXME: improve this error message + self.infcx + .tcx + .sess + .struct_span_err(span, "higher-ranked subtype error") + .buffer(&mut self.errors_buffer); + } - // Member constraints can also give rise to `'r: 'x` edges that - // were not part of the graph initially, so watch out for those. - // (But they are extremely rare; this loop is very cold.) - for constraint in self.applied_member_constraints(r) { - let p_c = &self.member_constraints[constraint.member_constraint_index]; - let constraint = OutlivesConstraint { - sup: r, - sub: constraint.min_choice, - locations: Locations::All(p_c.definition_span), - category: ConstraintCategory::OpaqueType, - }; - handle_constraint(constraint); + RegionErrorKind::RegionError { fr_origin, longer_fr, shorter_fr, is_reported } => { + if is_reported { + self.report_region_error( + longer_fr, + fr_origin, + shorter_fr, + &mut outlives_suggestion, + ); + } else { + // We only report the first error, so as not to overwhelm the user. See + // `RegRegionErrorKind` docs. + // + // FIXME: currently we do nothing with these, but perhaps we can do better? + // FIXME: try collecting these constraints on the outlives suggestion + // builder. Does it make the suggestions any better? + debug!( + "Unreported region error: can't prove that {:?}: {:?}", + longer_fr, shorter_fr + ); + } + } } } - None + // Emit one outlives suggestions for each MIR def we borrowck + outlives_suggestion.add_suggestion(self); } /// Report an error because the universal region `fr` was required to outlive @@ -367,107 +269,74 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// ``` /// /// Here we would be invoked with `fr = 'a` and `outlived_fr = `'b`. - pub(in crate::borrow_check) fn report_error<'a>( - &'a self, - body: &Body<'tcx>, - local_names: &IndexVec>, - upvars: &[Upvar], - infcx: &'a InferCtxt<'a, 'tcx>, - mir_def_id: DefId, + pub(in crate::borrow_check) fn report_region_error( + &mut self, fr: RegionVid, fr_origin: NLLRegionVariableOrigin, outlived_fr: RegionVid, - outlives_suggestion: &mut OutlivesSuggestionBuilder<'_>, - renctx: &mut RegionErrorNamingCtx, - ) -> DiagnosticBuilder<'a> { - debug!("report_error(fr={:?}, outlived_fr={:?})", fr, outlived_fr); + outlives_suggestion: &mut OutlivesSuggestionBuilder, + ) { + debug!("report_region_error(fr={:?}, outlived_fr={:?})", fr, outlived_fr); - let (category, _, span) = self.best_blame_constraint(body, fr, fr_origin, |r| { - self.provides_universal_region(r, fr, outlived_fr) - }); + let (category, _, span) = + self.regioncx.best_blame_constraint(&self.body, fr, fr_origin, |r| { + self.regioncx.provides_universal_region(r, fr, outlived_fr) + }); - debug!("report_error: category={:?} {:?}", category, span); + debug!("report_region_error: category={:?} {:?}", category, span); // Check if we can use one of the "nice region errors". if let (Some(f), Some(o)) = (self.to_error_region(fr), self.to_error_region(outlived_fr)) { - let tables = infcx.tcx.typeck_tables_of(mir_def_id); - let nice = NiceRegionError::new_from_span(infcx, span, o, f, Some(tables)); + let tables = self.infcx.tcx.typeck_tables_of(self.mir_def_id); + let nice = NiceRegionError::new_from_span(self.infcx, span, o, f, Some(tables)); if let Some(diag) = nice.try_report_from_nll() { - return diag; + diag.buffer(&mut self.errors_buffer); + return; } } let (fr_is_local, outlived_fr_is_local): (bool, bool) = ( - self.universal_regions.is_local_free_region(fr), - self.universal_regions.is_local_free_region(outlived_fr), + self.regioncx.universal_regions().is_local_free_region(fr), + self.regioncx.universal_regions().is_local_free_region(outlived_fr), ); debug!( - "report_error: fr_is_local={:?} outlived_fr_is_local={:?} category={:?}", + "report_region_error: fr_is_local={:?} outlived_fr_is_local={:?} category={:?}", fr_is_local, outlived_fr_is_local, category ); - let errctx = ErrorReportingCtx { - region_infcx: self, - infcx, - mir_def_id, - body, - local_names, - upvars, - }; - let errci = ErrorConstraintInfo { - fr, outlived_fr, fr_is_local, outlived_fr_is_local, category, span + fr, + outlived_fr, + fr_is_local, + outlived_fr_is_local, + category, + span, }; - match (category, fr_is_local, outlived_fr_is_local) { - (ConstraintCategory::Return, true, false) if self.is_closure_fn_mut(infcx, fr) => { - self.report_fnmut_error(&errctx, &errci, renctx) + let diag = match (category, fr_is_local, outlived_fr_is_local) { + (ConstraintCategory::Return, true, false) if self.is_closure_fn_mut(fr) => { + self.report_fnmut_error(&errci) } (ConstraintCategory::Assignment, true, false) | (ConstraintCategory::CallArgument, true, false) => { - let mut db = self.report_escaping_data_error(&errctx, &errci, renctx); + let mut db = self.report_escaping_data_error(&errci); - outlives_suggestion.intermediate_suggestion(&errctx, &errci, renctx, &mut db); + outlives_suggestion.intermediate_suggestion(self, &errci, &mut db); outlives_suggestion.collect_constraint(fr, outlived_fr); db } _ => { - let mut db = self.report_general_error(&errctx, &errci, renctx); + let mut db = self.report_general_error(&errci); - outlives_suggestion.intermediate_suggestion(&errctx, &errci, renctx, &mut db); + outlives_suggestion.intermediate_suggestion(self, &errci, &mut db); outlives_suggestion.collect_constraint(fr, outlived_fr); db } - } - } - - /// We have a constraint `fr1: fr2` that is not satisfied, where - /// `fr2` represents some universal region. Here, `r` is some - /// region where we know that `fr1: r` and this function has the - /// job of determining whether `r` is "to blame" for the fact that - /// `fr1: fr2` is required. - /// - /// This is true under two conditions: - /// - /// - `r == fr2` - /// - `fr2` is `'static` and `r` is some placeholder in a universe - /// that cannot be named by `fr1`; in that case, we will require - /// that `fr1: 'static` because it is the only way to `fr1: r` to - /// be satisfied. (See `add_incompatible_universe`.) - fn provides_universal_region(&self, r: RegionVid, fr1: RegionVid, fr2: RegionVid) -> bool { - debug!( - "provides_universal_region(r={:?}, fr1={:?}, fr2={:?})", - r, fr1, fr2 - ); - let result = { - r == fr2 || { - fr2 == self.universal_regions.fr_static && self.cannot_name_placeholder(fr1, r) - } }; - debug!("provides_universal_region: result = {:?}", result); - result + + diag.buffer(&mut self.errors_buffer); } /// Report a specialized error when `FnMut` closures return a reference to a captured variable. @@ -486,17 +355,10 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// executing... /// = note: ...therefore, returned references to captured variables will escape the closure /// ``` - fn report_fnmut_error( - &self, - errctx: &ErrorReportingCtx<'_, '_, 'tcx>, - errci: &ErrorConstraintInfo, - renctx: &mut RegionErrorNamingCtx, - ) -> DiagnosticBuilder<'_> { - let ErrorConstraintInfo { - outlived_fr, span, .. - } = errci; + fn report_fnmut_error(&self, errci: &ErrorConstraintInfo) -> DiagnosticBuilder<'tcx> { + let ErrorConstraintInfo { outlived_fr, span, .. } = errci; - let mut diag = errctx + let mut diag = self .infcx .tcx .sess @@ -504,7 +366,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { // We should check if the return type of this closure is in fact a closure - in that // case, we can special case the error further. - let return_type_is_closure = self.universal_regions.unnormalized_output_ty.is_closure(); + let return_type_is_closure = + self.regioncx.universal_regions().unnormalized_output_ty.is_closure(); let message = if return_type_is_closure { "returns a closure that contains a reference to a captured variable, which then \ escapes the closure body" @@ -514,7 +377,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { diag.span_label(*span, message); - match self.give_region_a_name(errctx, renctx, *outlived_fr).unwrap().source { + match self.give_region_a_name(*outlived_fr).unwrap().source { RegionNameSource::NamedEarlyBoundRegion(fr_span) | RegionNameSource::NamedFreeRegion(fr_span) | RegionNameSource::SynthesizedFreeEnvRegion(fr_span, _) @@ -549,31 +412,25 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// LL | ref_obj(x) /// | ^^^^^^^^^^ `x` escapes the function body here /// ``` - fn report_escaping_data_error( - &self, - errctx: &ErrorReportingCtx<'_, '_, 'tcx>, - errci: &ErrorConstraintInfo, - renctx: &mut RegionErrorNamingCtx, - ) -> DiagnosticBuilder<'_> { - let ErrorReportingCtx { - infcx, body, upvars, local_names, .. - } = errctx; - - let ErrorConstraintInfo { - span, category, .. - } = errci; - - let fr_name_and_span = - self.get_var_name_and_span_for_region(infcx.tcx, body, local_names, upvars, errci.fr); - let outlived_fr_name_and_span = self.get_var_name_and_span_for_region( - infcx.tcx, - body, - local_names, - upvars, + fn report_escaping_data_error(&self, errci: &ErrorConstraintInfo) -> DiagnosticBuilder<'tcx> { + let ErrorConstraintInfo { span, category, .. } = errci; + + let fr_name_and_span = self.regioncx.get_var_name_and_span_for_region( + self.infcx.tcx, + &self.body, + &self.local_names, + &self.upvars, + errci.fr, + ); + let outlived_fr_name_and_span = self.regioncx.get_var_name_and_span_for_region( + self.infcx.tcx, + &self.body, + &self.local_names, + &self.upvars, errci.outlived_fr, ); - let escapes_from = match self.universal_regions.defining_ty { + let escapes_from = match self.regioncx.universal_regions().defining_ty { DefiningTy::Closure(..) => "closure", DefiningTy::Generator(..) => "generator", DefiningTy::FnDef(..) => "function", @@ -586,22 +443,15 @@ impl<'tcx> RegionInferenceContext<'tcx> { || (*category == ConstraintCategory::Assignment && escapes_from == "function") || escapes_from == "const" { - return self.report_general_error( - errctx, - &ErrorConstraintInfo { - fr_is_local: true, - outlived_fr_is_local: false, - .. *errci - }, - renctx, - ); + return self.report_general_error(&ErrorConstraintInfo { + fr_is_local: true, + outlived_fr_is_local: false, + ..*errci + }); } - let mut diag = borrowck_errors::borrowed_data_escapes_closure( - infcx.tcx, - *span, - escapes_from, - ); + let mut diag = + borrowck_errors::borrowed_data_escapes_closure(self.infcx.tcx, *span, escapes_from); if let Some((Some(outlived_fr_name), outlived_fr_span)) = outlived_fr_name_and_span { diag.span_label( @@ -622,10 +472,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { ), ); - diag.span_label( - *span, - format!("`{}` escapes the {} body here", fr_name, escapes_from), - ); + diag.span_label(*span, format!("`{}` escapes the {} body here", fr_name, escapes_from)); } diag @@ -646,33 +493,26 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// | ^^^^^^^^^^^^^^ function was supposed to return data with lifetime `'a` but it /// | is returning data with lifetime `'b` /// ``` - fn report_general_error( - &self, - errctx: &ErrorReportingCtx<'_, '_, 'tcx>, - errci: &ErrorConstraintInfo, - renctx: &mut RegionErrorNamingCtx, - ) -> DiagnosticBuilder<'_> { - let ErrorReportingCtx { - infcx, mir_def_id, .. - } = errctx; + fn report_general_error(&self, errci: &ErrorConstraintInfo) -> DiagnosticBuilder<'tcx> { let ErrorConstraintInfo { - fr, fr_is_local, outlived_fr, outlived_fr_is_local, span, category, .. + fr, + fr_is_local, + outlived_fr, + outlived_fr_is_local, + span, + category, + .. } = errci; - let mut diag = infcx.tcx.sess.struct_span_err( - *span, - "lifetime may not live long enough" - ); + let mut diag = + self.infcx.tcx.sess.struct_span_err(*span, "lifetime may not live long enough"); - let mir_def_name = if infcx.tcx.is_closure(*mir_def_id) { - "closure" - } else { - "function" - }; + let mir_def_name = + if self.infcx.tcx.is_closure(self.mir_def_id) { "closure" } else { "function" }; - let fr_name = self.give_region_a_name(errctx, renctx, *fr).unwrap(); + let fr_name = self.give_region_a_name(*fr).unwrap(); fr_name.highlight_region_name(&mut diag); - let outlived_fr_name = self.give_region_a_name(errctx, renctx, *outlived_fr).unwrap(); + let outlived_fr_name = self.give_region_a_name(*outlived_fr).unwrap(); outlived_fr_name.highlight_region_name(&mut diag); match (category, outlived_fr_is_local, fr_is_local) { @@ -699,7 +539,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { } } - self.add_static_impl_trait_suggestion(infcx, &mut diag, *fr, fr_name, *outlived_fr); + self.add_static_impl_trait_suggestion(&mut diag, *fr, fr_name, *outlived_fr); diag } @@ -715,8 +555,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// ``` fn add_static_impl_trait_suggestion( &self, - infcx: &InferCtxt<'_, 'tcx>, - diag: &mut DiagnosticBuilder<'_>, + diag: &mut DiagnosticBuilder<'tcx>, fr: RegionVid, // We need to pass `fr_name` - computing it again will label it twice. fr_name: RegionName, @@ -725,14 +564,12 @@ impl<'tcx> RegionInferenceContext<'tcx> { if let (Some(f), Some(ty::RegionKind::ReStatic)) = (self.to_error_region(fr), self.to_error_region(outlived_fr)) { - if let Some((ty::TyS { - kind: ty::Opaque(did, substs), - .. - }, _)) = infcx + if let Some((ty::TyS { kind: ty::Opaque(did, substs), .. }, _)) = self + .infcx .tcx .is_suitable_region(f) .map(|r| r.def_id) - .map(|id| infcx.tcx.return_type_impl_trait(id)) + .map(|id| self.infcx.tcx.return_type_impl_trait(id)) .unwrap_or(None) { // Check whether or not the impl trait return type is intended to capture @@ -740,8 +577,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { // // eg. check for `impl Trait + 'static` instead of `impl Trait`. let has_static_predicate = { - let predicates_of = infcx.tcx.predicates_of(*did); - let bounds = predicates_of.instantiate(infcx.tcx, substs); + let predicates_of = self.infcx.tcx.predicates_of(*did); + let bounds = predicates_of.instantiate(self.infcx.tcx, substs); let mut found = false; for predicate in bounds.predicates { @@ -766,28 +603,30 @@ impl<'tcx> RegionInferenceContext<'tcx> { // If there is a static predicate, then the only sensible suggestion is to replace // fr with `'static`. if has_static_predicate { - diag.help(&format!( - "consider replacing `{}` with `{}`", - fr_name, static_str, - )); + diag.help(&format!("consider replacing `{}` with `{}`", fr_name, static_str)); } else { // Otherwise, we should suggest adding a constraint on the return type. - let span = infcx.tcx.def_span(*did); - if let Ok(snippet) = infcx.tcx.sess.source_map().span_to_snippet(span) { + let span = self.infcx.tcx.def_span(*did); + if let Ok(snippet) = self.infcx.tcx.sess.source_map().span_to_snippet(span) { let suggestable_fr_name = if fr_name.was_named() { fr_name.to_string() } else { "'_".to_string() }; - + let suggestion = if snippet.ends_with(";") { + // `type X = impl Trait;` + format!("{} + {};", &snippet[..snippet.len() - 1], suggestable_fr_name) + } else { + format!("{} + {}", snippet, suggestable_fr_name) + }; diag.span_suggestion( span, &format!( "to allow this `impl Trait` to capture borrowed data with lifetime \ - `{}`, add `{}` as a constraint", + `{}`, add `{}` as a bound", fr_name, suggestable_fr_name, ), - format!("{} + {}", snippet, suggestable_fr_name), + suggestion, Applicability::MachineApplicable, ); } @@ -795,142 +634,4 @@ impl<'tcx> RegionInferenceContext<'tcx> { } } } - - crate fn free_region_constraint_info( - &self, - body: &Body<'tcx>, - local_names: &IndexVec>, - upvars: &[Upvar], - mir_def_id: DefId, - infcx: &InferCtxt<'_, 'tcx>, - borrow_region: RegionVid, - outlived_region: RegionVid, - ) -> (ConstraintCategory, bool, Span, Option) { - let (category, from_closure, span) = self.best_blame_constraint( - body, - borrow_region, - NLLRegionVariableOrigin::FreeRegion, - |r| self.provides_universal_region(r, borrow_region, outlived_region) - ); - - let mut renctx = RegionErrorNamingCtx::new(); - let errctx = ErrorReportingCtx { - infcx, body, local_names, upvars, mir_def_id, - region_infcx: self, - }; - let outlived_fr_name = self.give_region_a_name(&errctx, &mut renctx, outlived_region); - - (category, from_closure, span, outlived_fr_name) - } - - // Finds some region R such that `fr1: R` and `R` is live at - // `elem`. - crate fn find_sub_region_live_at( - &self, - fr1: RegionVid, - elem: Location, - ) -> RegionVid { - debug!("find_sub_region_live_at(fr1={:?}, elem={:?})", fr1, elem); - self.find_constraint_paths_between_regions(fr1, |r| { - // First look for some `r` such that `fr1: r` and `r` is live at `elem` - debug!( - "find_sub_region_live_at: liveness_constraints for {:?} are {:?}", - r, - self.liveness_constraints.region_value_str(r), - ); - self.liveness_constraints.contains(r, elem) - }).or_else(|| { - // If we fail to find that, we may find some `r` such that - // `fr1: r` and `r` is a placeholder from some universe - // `fr1` cannot name. This would force `fr1` to be - // `'static`. - self.find_constraint_paths_between_regions(fr1, |r| { - self.cannot_name_placeholder(fr1, r) - }) - }) - .or_else(|| { - // If we fail to find THAT, it may be that `fr1` is a - // placeholder that cannot "fit" into its SCC. In that - // case, there should be some `r` where `fr1: r`, both - // `fr1` and `r` are in the same SCC, and `fr1` is a - // placeholder that `r` cannot name. We can blame that - // edge. - self.find_constraint_paths_between_regions(fr1, |r| { - self.constraint_sccs.scc(fr1) == self.constraint_sccs.scc(r) - && self.cannot_name_placeholder(r, fr1) - }) - }) - .map(|(_path, r)| r) - .unwrap() - } - - // Finds a good span to blame for the fact that `fr1` outlives `fr2`. - crate fn find_outlives_blame_span( - &self, - body: &Body<'tcx>, - fr1: RegionVid, - fr1_origin: NLLRegionVariableOrigin, - fr2: RegionVid, - ) -> (ConstraintCategory, Span) { - let (category, _, span) = self.best_blame_constraint( - body, - fr1, - fr1_origin, - |r| self.provides_universal_region(r, fr1, fr2), - ); - (category, span) - } - - fn retrieve_closure_constraint_info( - &self, - body: &Body<'tcx>, - constraint: &OutlivesConstraint, - ) -> (ConstraintCategory, bool, Span) { - let loc = match constraint.locations { - Locations::All(span) => return (constraint.category, false, span), - Locations::Single(loc) => loc, - }; - - let opt_span_category = - self.closure_bounds_mapping[&loc].get(&(constraint.sup, constraint.sub)); - opt_span_category - .map(|&(category, span)| (category, true, span)) - .unwrap_or((constraint.category, false, body.source_info(loc).span)) - } - - /// Returns `true` if a closure is inferred to be an `FnMut` closure. - crate fn is_closure_fn_mut(&self, infcx: &InferCtxt<'_, 'tcx>, fr: RegionVid) -> bool { - if let Some(ty::ReFree(free_region)) = self.to_error_region(fr) { - if let ty::BoundRegion::BrEnv = free_region.bound_region { - if let DefiningTy::Closure(def_id, substs) = self.universal_regions.defining_ty { - let closure_kind_ty = substs.as_closure().kind_ty(def_id, infcx.tcx); - return Some(ty::ClosureKind::FnMut) == closure_kind_ty.to_opt_closure_kind(); - } - } - } - - false - } - - /// If `r2` represents a placeholder region, then this returns - /// `true` if `r1` cannot name that placeholder in its - /// value; otherwise, returns `false`. - fn cannot_name_placeholder(&self, r1: RegionVid, r2: RegionVid) -> bool { - debug!("cannot_name_value_of(r1={:?}, r2={:?})", r1, r2); - - match self.definitions[r2].origin { - NLLRegionVariableOrigin::Placeholder(placeholder) => { - let universe1 = self.definitions[r1].universe; - debug!( - "cannot_name_value_of: universe1={:?} placeholder={:?}", - universe1, placeholder - ); - universe1.cannot_name(placeholder.universe) - } - - NLLRegionVariableOrigin::FreeRegion | NLLRegionVariableOrigin::Existential { .. } => { - false - } - } - } } diff --git a/src/librustc_mir/borrow_check/diagnostics/region_name.rs b/src/librustc_mir/borrow_check/diagnostics/region_name.rs index 720c77beaf..47eb2d8940 100644 --- a/src/librustc_mir/borrow_check/diagnostics/region_name.rs +++ b/src/librustc_mir/borrow_check/diagnostics/region_name.rs @@ -1,26 +1,15 @@ use std::fmt::{self, Display}; -use rustc::hir; -use rustc::hir::def::{Res, DefKind}; -use rustc::hir::def_id::DefId; -use rustc::infer::InferCtxt; -use rustc::mir::{Local, Body}; -use rustc::ty::subst::{SubstsRef, GenericArgKind}; -use rustc::ty::{self, RegionVid, Ty, TyCtxt}; use rustc::ty::print::RegionHighlightMode; -use rustc_index::vec::IndexVec; +use rustc::ty::subst::{GenericArgKind, SubstsRef}; +use rustc::ty::{self, RegionVid, Ty}; use rustc_errors::DiagnosticBuilder; -use syntax::symbol::kw; -use rustc_data_structures::fx::FxHashMap; -use syntax_pos::{Span, symbol::Symbol, DUMMY_SP}; - -use crate::borrow_check::{ - diagnostics::region_errors::ErrorReportingCtx, - region_infer::RegionInferenceContext, - universal_regions::DefiningTy, - nll::ToRegionVid, - Upvar, -}; +use rustc_hir as hir; +use rustc_hir::def::{DefKind, Res}; +use rustc_span::symbol::kw; +use rustc_span::{symbol::Symbol, Span, DUMMY_SP}; + +use crate::borrow_check::{nll::ToRegionVid, universal_regions::DefiningTy, MirBorrowckCtxt}; /// A name for a particular region used in emitting diagnostics. This name could be a generated /// name like `'1`, a name used by the user like `'a`, or a name like `'static`. @@ -62,63 +51,20 @@ crate enum RegionNameSource { AnonRegionFromAsyncFn(Span), } -/// Records region names that have been assigned before so that we can use the same ones in later -/// diagnostics. -#[derive(Debug, Clone)] -crate struct RegionErrorNamingCtx { - /// Record the region names generated for each region in the given - /// MIR def so that we can reuse them later in help/error messages. - renctx: FxHashMap, - - /// The counter for generating new region names. - counter: usize, -} - -impl RegionErrorNamingCtx { - crate fn new() -> Self { - Self { - counter: 1, - renctx: FxHashMap::default(), - } - } - - /// Get the name of `region` if it has previously been named. - crate fn get(&self, region: &RegionVid) -> Option<&RegionName> { - self.renctx.get(region) - } - - /// Give `region` the name `name`. - crate fn insert(&mut self, region: RegionVid, name: RegionName) { - self.renctx.insert(region, name); - } - - /// Creates a synthetic region named `'N`, where `N` is the next value of the counter. Then, - /// increment the counter. - /// - /// The name is not memoized. A separate call to `insert` should be made later. (Currently, - /// this happens at the end of `give_region_a_name`). - crate fn synthesize_region_name(&mut self) -> Symbol { - let c = self.counter; - self.counter += 1; - - Symbol::intern(&format!("'{:?}", c)) - } -} - impl RegionName { crate fn was_named(&self) -> bool { match self.source { - RegionNameSource::NamedEarlyBoundRegion(..) | - RegionNameSource::NamedFreeRegion(..) | - RegionNameSource::Static => true, - RegionNameSource::SynthesizedFreeEnvRegion(..) | - RegionNameSource::CannotMatchHirTy(..) | - RegionNameSource::MatchedHirTy(..) | - RegionNameSource::MatchedAdtAndSegment(..) | - RegionNameSource::AnonRegionFromUpvar(..) | - RegionNameSource::AnonRegionFromOutput(..) | - RegionNameSource::AnonRegionFromYieldTy(..) | - RegionNameSource::AnonRegionFromAsyncFn(..) => false, + RegionNameSource::NamedEarlyBoundRegion(..) + | RegionNameSource::NamedFreeRegion(..) + | RegionNameSource::Static => true, + RegionNameSource::SynthesizedFreeEnvRegion(..) + | RegionNameSource::CannotMatchHirTy(..) + | RegionNameSource::MatchedHirTy(..) + | RegionNameSource::MatchedAdtAndSegment(..) + | RegionNameSource::AnonRegionFromUpvar(..) + | RegionNameSource::AnonRegionFromOutput(..) + | RegionNameSource::AnonRegionFromYieldTy(..) + | RegionNameSource::AnonRegionFromAsyncFn(..) => false, } } @@ -138,8 +84,8 @@ impl RegionName { RegionNameSource::CannotMatchHirTy(span, type_name) => { diag.span_label(*span, format!("has type `{}`", type_name)); } - RegionNameSource::MatchedHirTy(span) | - RegionNameSource::AnonRegionFromAsyncFn(span) => { + RegionNameSource::MatchedHirTy(span) + | RegionNameSource::AnonRegionFromAsyncFn(span) => { diag.span_label( *span, format!("let's call the lifetime of this reference `{}`", self), @@ -151,25 +97,16 @@ impl RegionName { RegionNameSource::AnonRegionFromUpvar(span, upvar_name) => { diag.span_label( *span, - format!( - "lifetime `{}` appears in the type of `{}`", - self, upvar_name - ), + format!("lifetime `{}` appears in the type of `{}`", self, upvar_name), ); } RegionNameSource::AnonRegionFromOutput(span, mir_description, type_name) => { - diag.span_label( - *span, - format!("return type{} is {}", mir_description, type_name), - ); - }, + diag.span_label(*span, format!("return type{} is {}", mir_description, type_name)); + } RegionNameSource::AnonRegionFromYieldTy(span, type_name) => { - diag.span_label( - *span, - format!("yield type is {}", type_name), - ); + diag.span_label(*span, format!("yield type is {}", type_name)); } - RegionNameSource::Static => {}, + RegionNameSource::Static => {} } } } @@ -180,7 +117,16 @@ impl Display for RegionName { } } -impl<'tcx> RegionInferenceContext<'tcx> { +impl<'tcx> MirBorrowckCtxt<'_, 'tcx> { + /// Generate a synthetic region named `'N`, where `N` is the next value of the counter. Then, + /// increment the counter. + /// + /// This is _not_ idempotent. Call `give_region_a_name` when possible. + fn synthesize_region_name(&self) -> Symbol { + let c = self.next_region_name.replace_with(|counter| *counter + 1); + Symbol::intern(&format!("'{:?}", c)) + } + /// Maps from an internal MIR region vid to something that we can /// report to the user. In some cases, the region vids will map /// directly to lifetimes that the user has a name for (e.g., @@ -189,6 +135,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// that end, this function takes a "diagnostic" so that it can /// create auxiliary notes as needed. /// + /// The names are memoized, so this is both cheap to recompute and idempotent. + /// /// Example (function arguments): /// /// Suppose we are trying to give a name to the lifetime of the @@ -206,49 +154,28 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// ``` /// /// and then return the name `'1` for us to use. - crate fn give_region_a_name( - &self, - errctx: &ErrorReportingCtx<'_, '_, 'tcx>, - renctx: &mut RegionErrorNamingCtx, - fr: RegionVid, - ) -> Option { - let ErrorReportingCtx { - infcx, body, mir_def_id, local_names, upvars, .. - } = errctx; - - debug!("give_region_a_name(fr={:?}, counter={:?})", fr, renctx.counter); + crate fn give_region_a_name(&self, fr: RegionVid) -> Option { + debug!( + "give_region_a_name(fr={:?}, counter={:?})", + fr, + self.next_region_name.try_borrow().unwrap() + ); - assert!(self.universal_regions.is_universal_region(fr)); + assert!(self.regioncx.universal_regions().is_universal_region(fr)); - if let Some(value) = renctx.get(&fr) { + if let Some(value) = self.region_names.try_borrow_mut().unwrap().get(&fr) { return Some(value.clone()); } let value = self - .give_name_from_error_region(infcx.tcx, *mir_def_id, fr, renctx) - .or_else(|| { - self.give_name_if_anonymous_region_appears_in_arguments( - infcx, body, local_names, *mir_def_id, fr, renctx, - ) - }) - .or_else(|| { - self.give_name_if_anonymous_region_appears_in_upvars( - infcx.tcx, upvars, fr, renctx - ) - }) - .or_else(|| { - self.give_name_if_anonymous_region_appears_in_output( - infcx, body, *mir_def_id, fr, renctx, - ) - }) - .or_else(|| { - self.give_name_if_anonymous_region_appears_in_yield_ty( - infcx, body, *mir_def_id, fr, renctx, - ) - }); + .give_name_from_error_region(fr) + .or_else(|| self.give_name_if_anonymous_region_appears_in_arguments(fr)) + .or_else(|| self.give_name_if_anonymous_region_appears_in_upvars(fr)) + .or_else(|| self.give_name_if_anonymous_region_appears_in_output(fr)) + .or_else(|| self.give_name_if_anonymous_region_appears_in_yield_ty(fr)); if let Some(ref value) = value { - renctx.insert(fr, value.clone()); + self.region_names.try_borrow_mut().unwrap().insert(fr, value.clone()); } debug!("give_region_a_name: gave name {:?}", value); @@ -259,15 +186,11 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// *user* has a name for. In that case, we'll be able to map /// `fr` to a `Region<'tcx>`, and that region will be one of /// named variants. - fn give_name_from_error_region( - &self, - tcx: TyCtxt<'tcx>, - mir_def_id: DefId, - fr: RegionVid, - renctx: &mut RegionErrorNamingCtx, - ) -> Option { + fn give_name_from_error_region(&self, fr: RegionVid) -> Option { let error_region = self.to_error_region(fr)?; + let tcx = self.infcx.tcx; + debug!("give_region_a_name: error_region = {:?}", error_region); match error_region { ty::ReEarlyBound(ebr) => { @@ -282,31 +205,30 @@ impl<'tcx> RegionInferenceContext<'tcx> { } } - ty::ReStatic => Some(RegionName { - name: kw::StaticLifetime, - source: RegionNameSource::Static - }), + ty::ReStatic => { + Some(RegionName { name: kw::StaticLifetime, source: RegionNameSource::Static }) + } ty::ReFree(free_region) => match free_region.bound_region { ty::BoundRegion::BrNamed(region_def_id, name) => { // Get the span to point to, even if we don't use the name. let span = tcx.hir().span_if_local(region_def_id).unwrap_or(DUMMY_SP); - debug!("bound region named: {:?}, is_named: {:?}", - name, free_region.bound_region.is_named()); + debug!( + "bound region named: {:?}, is_named: {:?}", + name, + free_region.bound_region.is_named() + ); if free_region.bound_region.is_named() { // A named region that is actually named. - Some(RegionName { - name, - source: RegionNameSource::NamedFreeRegion(span), - }) + Some(RegionName { name, source: RegionNameSource::NamedFreeRegion(span) }) } else { // If we spuriously thought that the region is named, we should let the // system generate a true name for error messages. Currently this can // happen if we have an elided name in an async fn for example: the // compiler will generate a region named `'_`, but reporting such a name is // not actually useful, so we synthesize a name for it instead. - let name = renctx.synthesize_region_name(); + let name = self.synthesize_region_name(); Some(RegionName { name, source: RegionNameSource::AnonRegionFromAsyncFn(span), @@ -315,8 +237,13 @@ impl<'tcx> RegionInferenceContext<'tcx> { } ty::BoundRegion::BrEnv => { - let mir_hir_id = tcx.hir().as_local_hir_id(mir_def_id).expect("non-local mir"); - let def_ty = self.universal_regions.defining_ty; + let mir_hir_id = self + .infcx + .tcx + .hir() + .as_local_hir_id(self.mir_def_id) + .expect("non-local mir"); + let def_ty = self.regioncx.universal_regions().defining_ty; if let DefiningTy::Closure(def_id, substs) = def_ty { let args_span = if let hir::ExprKind::Closure(_, _, _, span, _) = @@ -326,7 +253,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { } else { bug!("Closure is not defined by a closure expr"); }; - let region_name = renctx.synthesize_region_name(); + let region_name = self.synthesize_region_name(); let closure_kind_ty = substs.as_closure().kind_ty(def_id, tcx); let note = match closure_kind_ty.to_opt_closure_kind() { @@ -380,44 +307,31 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// ``` fn give_name_if_anonymous_region_appears_in_arguments( &self, - infcx: &InferCtxt<'_, 'tcx>, - body: &Body<'tcx>, - local_names: &IndexVec>, - mir_def_id: DefId, fr: RegionVid, - renctx: &mut RegionErrorNamingCtx, ) -> Option { - let implicit_inputs = self.universal_regions.defining_ty.implicit_inputs(); - let argument_index = self.get_argument_index_for_region(infcx.tcx, fr)?; - - let arg_ty = - self.universal_regions.unnormalized_input_tys[implicit_inputs + argument_index]; - if let Some(region_name) = self.give_name_if_we_can_match_hir_ty_from_argument( - infcx, - mir_def_id, - fr, - arg_ty, - argument_index, - renctx, - ) { + let implicit_inputs = self.regioncx.universal_regions().defining_ty.implicit_inputs(); + let argument_index = self.regioncx.get_argument_index_for_region(self.infcx.tcx, fr)?; + + let arg_ty = self.regioncx.universal_regions().unnormalized_input_tys + [implicit_inputs + argument_index]; + if let Some(region_name) = + self.give_name_if_we_can_match_hir_ty_from_argument(fr, arg_ty, argument_index) + { return Some(region_name); } - self.give_name_if_we_cannot_match_hir_ty(infcx, body, local_names, fr, arg_ty, renctx) + self.give_name_if_we_cannot_match_hir_ty(fr, arg_ty) } fn give_name_if_we_can_match_hir_ty_from_argument( &self, - infcx: &InferCtxt<'_, 'tcx>, - mir_def_id: DefId, needle_fr: RegionVid, argument_ty: Ty<'tcx>, argument_index: usize, - renctx: &mut RegionErrorNamingCtx, ) -> Option { - let mir_hir_id = infcx.tcx.hir().as_local_hir_id(mir_def_id)?; - let fn_decl = infcx.tcx.hir().fn_decl_by_hir_id(mir_hir_id)?; - let argument_hir_ty: &hir::Ty = fn_decl.inputs.get(argument_index)?; + let mir_hir_id = self.infcx.tcx.hir().as_local_hir_id(self.mir_def_id)?; + let fn_decl = self.infcx.tcx.hir().fn_decl_by_hir_id(mir_hir_id)?; + let argument_hir_ty: &hir::Ty<'_> = fn_decl.inputs.get(argument_index)?; match argument_hir_ty.kind { // This indicates a variable with no type annotation, like // `|x|`... in that case, we can't highlight the type but @@ -426,13 +340,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { // (`give_name_if_anonymous_region_appears_in_arguments`). hir::TyKind::Infer => None, - _ => self.give_name_if_we_can_match_hir_ty( - infcx.tcx, - needle_fr, - argument_ty, - argument_hir_ty, - renctx, - ), + _ => self.give_name_if_we_can_match_hir_ty(needle_fr, argument_ty, argument_hir_ty), } } @@ -449,17 +357,13 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// ``` fn give_name_if_we_cannot_match_hir_ty( &self, - infcx: &InferCtxt<'_, 'tcx>, - body: &Body<'tcx>, - local_names: &IndexVec>, needle_fr: RegionVid, argument_ty: Ty<'tcx>, - renctx: &mut RegionErrorNamingCtx, ) -> Option { - let counter = renctx.counter; + let counter = *self.next_region_name.try_borrow().unwrap(); let mut highlight = RegionHighlightMode::default(); highlight.highlighting_region_vid(needle_fr, counter); - let type_name = infcx.extract_type_name(&argument_ty, Some(highlight)).0; + let type_name = self.infcx.extract_type_name(&argument_ty, Some(highlight)).0; debug!( "give_name_if_we_cannot_match_hir_ty: type_name={:?} needle_fr={:?}", @@ -467,15 +371,19 @@ impl<'tcx> RegionInferenceContext<'tcx> { ); let assigned_region_name = if type_name.find(&format!("'{}", counter)).is_some() { // Only add a label if we can confirm that a region was labelled. - let argument_index = self.get_argument_index_for_region(infcx.tcx, needle_fr)?; - let (_, span) = - self.get_argument_name_and_span_for_region(body, local_names, argument_index); + let argument_index = + self.regioncx.get_argument_index_for_region(self.infcx.tcx, needle_fr)?; + let (_, span) = self.regioncx.get_argument_name_and_span_for_region( + &self.body, + &self.local_names, + argument_index, + ); Some(RegionName { // This counter value will already have been used, so this function will increment // it so the next value will be used next and return the region name that would // have been used. - name: renctx.synthesize_region_name(), + name: self.synthesize_region_name(), source: RegionNameSource::CannotMatchHirTy(span, type_name), }) } else { @@ -508,13 +416,11 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// to highlighting that closest type instead. fn give_name_if_we_can_match_hir_ty( &self, - tcx: TyCtxt<'tcx>, needle_fr: RegionVid, argument_ty: Ty<'tcx>, - argument_hir_ty: &hir::Ty, - renctx: &mut RegionErrorNamingCtx, + argument_hir_ty: &hir::Ty<'_>, ) -> Option { - let search_stack: &mut Vec<(Ty<'tcx>, &hir::Ty)> = + let search_stack: &mut Vec<(Ty<'tcx>, &hir::Ty<'_>)> = &mut vec![(argument_ty, argument_hir_ty)]; while let Some((ty, hir_ty)) = search_stack.pop() { @@ -530,10 +436,10 @@ impl<'tcx> RegionInferenceContext<'tcx> { hir::TyKind::Rptr(_lifetime, referent_hir_ty), ) => { if region.to_region_vid() == needle_fr { - let region_name = renctx.synthesize_region_name(); + let region_name = self.synthesize_region_name(); // Just grab the first character, the `&`. - let source_map = tcx.sess.source_map(); + let source_map = self.infcx.tcx.sess.source_map(); let ampersand_span = source_map.start_point(hir_ty.span); return Some(RegionName { @@ -557,15 +463,16 @@ impl<'tcx> RegionInferenceContext<'tcx> { // FIXME: We should be able to do something similar to // match_adt_and_segment in this case. Res::Def(DefKind::TyAlias, _) => (), - _ => if let Some(last_segment) = path.segments.last() { - if let Some(name) = self.match_adt_and_segment( - substs, - needle_fr, - last_segment, - renctx, - search_stack, - ) { - return Some(name); + _ => { + if let Some(last_segment) = path.segments.last() { + if let Some(name) = self.match_adt_and_segment( + substs, + needle_fr, + last_segment, + search_stack, + ) { + return Some(name); + } } } } @@ -575,7 +482,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { // just worry about trying to match up the rustc type // with the HIR types: (ty::Tuple(elem_tys), hir::TyKind::Tup(elem_hir_tys)) => { - search_stack.extend(elem_tys.iter().map(|k| k.expect_ty()).zip(elem_hir_tys)); + search_stack.extend(elem_tys.iter().map(|k| k.expect_ty()).zip(*elem_hir_tys)); } (ty::Slice(elem_ty), hir::TyKind::Slice(elem_hir_ty)) @@ -605,9 +512,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { &self, substs: SubstsRef<'tcx>, needle_fr: RegionVid, - last_segment: &'hir hir::PathSegment, - renctx: &mut RegionErrorNamingCtx, - search_stack: &mut Vec<(Ty<'tcx>, &'hir hir::Ty)>, + last_segment: &'hir hir::PathSegment<'hir>, + search_stack: &mut Vec<(Ty<'tcx>, &'hir hir::Ty<'hir>)>, ) -> Option { // Did the user give explicit arguments? (e.g., `Foo<..>`) let args = last_segment.args.as_ref()?; @@ -618,7 +524,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { | hir::LifetimeName::Error | hir::LifetimeName::Static | hir::LifetimeName::Underscore => { - let region_name = renctx.synthesize_region_name(); + let region_name = self.synthesize_region_name(); let ampersand_span = lifetime.span; Some(RegionName { name: region_name, @@ -626,8 +532,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { }) } - hir::LifetimeName::ImplicitObjectLifetimeDefault - | hir::LifetimeName::Implicit => { + hir::LifetimeName::ImplicitObjectLifetimeDefault | hir::LifetimeName::Implicit => { // In this case, the user left off the lifetime; so // they wrote something like: // @@ -653,10 +558,10 @@ impl<'tcx> RegionInferenceContext<'tcx> { &self, substs: SubstsRef<'tcx>, needle_fr: RegionVid, - args: &'hir hir::GenericArgs, - search_stack: &mut Vec<(Ty<'tcx>, &'hir hir::Ty)>, + args: &'hir hir::GenericArgs<'hir>, + search_stack: &mut Vec<(Ty<'tcx>, &'hir hir::Ty<'hir>)>, ) -> Option<&'hir hir::Lifetime> { - for (kind, hir_arg) in substs.iter().zip(&args.args) { + for (kind, hir_arg) in substs.iter().zip(args.args) { match (kind.unpack(), hir_arg) { (GenericArgKind::Lifetime(r), hir::GenericArg::Lifetime(lt)) => { if r.to_region_vid() == needle_fr { @@ -700,17 +605,14 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// | let x = Some(&22); /// - fully elaborated type of `x` is `Option<&'1 u32>` /// ``` - fn give_name_if_anonymous_region_appears_in_upvars( - &self, - tcx: TyCtxt<'tcx>, - upvars: &[Upvar], - fr: RegionVid, - renctx: &mut RegionErrorNamingCtx, - ) -> Option { - let upvar_index = self.get_upvar_index_for_region(tcx, fr)?; - let (upvar_name, upvar_span) = - self.get_upvar_name_and_span_for_region(tcx, upvars, upvar_index); - let region_name = renctx.synthesize_region_name(); + fn give_name_if_anonymous_region_appears_in_upvars(&self, fr: RegionVid) -> Option { + let upvar_index = self.regioncx.get_upvar_index_for_region(self.infcx.tcx, fr)?; + let (upvar_name, upvar_span) = self.regioncx.get_upvar_name_and_span_for_region( + self.infcx.tcx, + &self.upvars, + upvar_index, + ); + let region_name = self.synthesize_region_name(); Some(RegionName { name: region_name, @@ -722,30 +624,20 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// must be a closure since, in a free fn, such an argument would /// have to either also appear in an argument (if using elision) /// or be early bound (named, not in argument). - fn give_name_if_anonymous_region_appears_in_output( - &self, - infcx: &InferCtxt<'_, 'tcx>, - body: &Body<'tcx>, - mir_def_id: DefId, - fr: RegionVid, - renctx: &mut RegionErrorNamingCtx, - ) -> Option { - let tcx = infcx.tcx; + fn give_name_if_anonymous_region_appears_in_output(&self, fr: RegionVid) -> Option { + let tcx = self.infcx.tcx; - let return_ty = self.universal_regions.unnormalized_output_ty; - debug!( - "give_name_if_anonymous_region_appears_in_output: return_ty = {:?}", - return_ty - ); + let return_ty = self.regioncx.universal_regions().unnormalized_output_ty; + debug!("give_name_if_anonymous_region_appears_in_output: return_ty = {:?}", return_ty); if !tcx.any_free_region_meets(&return_ty, |r| r.to_region_vid() == fr) { return None; } let mut highlight = RegionHighlightMode::default(); - highlight.highlighting_region_vid(fr, renctx.counter); - let type_name = infcx.extract_type_name(&return_ty, Some(highlight)).0; + highlight.highlighting_region_vid(fr, *self.next_region_name.try_borrow().unwrap()); + let type_name = self.infcx.extract_type_name(&return_ty, Some(highlight)).0; - let mir_hir_id = tcx.hir().as_local_hir_id(mir_def_id).expect("non-local mir"); + let mir_hir_id = tcx.hir().as_local_hir_id(self.mir_def_id).expect("non-local mir"); let (return_span, mir_description) = match tcx.hir().get(mir_hir_id) { hir::Node::Expr(hir::Expr { @@ -756,24 +648,20 @@ impl<'tcx> RegionInferenceContext<'tcx> { hir::FunctionRetTy::DefaultReturn(_) => tcx.sess.source_map().end_point(*span), hir::FunctionRetTy::Return(_) => return_ty.output.span(), }, - if gen_move.is_some() { - " of generator" - } else { - " of closure" - }, + if gen_move.is_some() { " of generator" } else { " of closure" }, ), hir::Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Method(method_sig, _), .. }) => (method_sig.decl.output.span(), ""), - _ => (body.span, ""), + _ => (self.body.span, ""), }; Some(RegionName { // This counter value will already have been used, so this function will increment it // so the next value will be used next and return the region name that would have been // used. - name: renctx.synthesize_region_name(), + name: self.synthesize_region_name(), source: RegionNameSource::AnonRegionFromOutput( return_span, mir_description.to_string(), @@ -784,51 +672,40 @@ impl<'tcx> RegionInferenceContext<'tcx> { fn give_name_if_anonymous_region_appears_in_yield_ty( &self, - infcx: &InferCtxt<'_, 'tcx>, - body: &Body<'tcx>, - mir_def_id: DefId, fr: RegionVid, - renctx: &mut RegionErrorNamingCtx, ) -> Option { // Note: generators from `async fn` yield `()`, so we don't have to // worry about them here. - let yield_ty = self.universal_regions.yield_ty?; - debug!( - "give_name_if_anonymous_region_appears_in_yield_ty: yield_ty = {:?}", - yield_ty, - ); + let yield_ty = self.regioncx.universal_regions().yield_ty?; + debug!("give_name_if_anonymous_region_appears_in_yield_ty: yield_ty = {:?}", yield_ty,); - let tcx = infcx.tcx; + let tcx = self.infcx.tcx; if !tcx.any_free_region_meets(&yield_ty, |r| r.to_region_vid() == fr) { return None; } let mut highlight = RegionHighlightMode::default(); - highlight.highlighting_region_vid(fr, renctx.counter); - let type_name = infcx.extract_type_name(&yield_ty, Some(highlight)).0; + highlight.highlighting_region_vid(fr, *self.next_region_name.try_borrow().unwrap()); + let type_name = self.infcx.extract_type_name(&yield_ty, Some(highlight)).0; - let mir_hir_id = tcx.hir().as_local_hir_id(mir_def_id).expect("non-local mir"); + let mir_hir_id = tcx.hir().as_local_hir_id(self.mir_def_id).expect("non-local mir"); let yield_span = match tcx.hir().get(mir_hir_id) { hir::Node::Expr(hir::Expr { - kind: hir::ExprKind::Closure(_, _, _, span, _), - .. - }) => ( - tcx.sess.source_map().end_point(*span) - ), - _ => body.span, + kind: hir::ExprKind::Closure(_, _, _, span, _), .. + }) => (tcx.sess.source_map().end_point(*span)), + _ => self.body.span, }; debug!( "give_name_if_anonymous_region_appears_in_yield_ty: \ type_name = {:?}, yield_span = {:?}", - yield_span, - type_name, + yield_span, type_name, ); Some(RegionName { - name: renctx.synthesize_region_name(), + name: self.synthesize_region_name(), source: RegionNameSource::AnonRegionFromYieldTy(yield_span, type_name), }) } diff --git a/src/librustc_mir/borrow_check/diagnostics/var_name.rs b/src/librustc_mir/borrow_check/diagnostics/var_name.rs index 839e09be7a..5f3585ce8b 100644 --- a/src/librustc_mir/borrow_check/diagnostics/var_name.rs +++ b/src/librustc_mir/borrow_check/diagnostics/var_name.rs @@ -1,10 +1,10 @@ -use crate::borrow_check::{nll::ToRegionVid, region_infer::RegionInferenceContext}; use crate::borrow_check::Upvar; -use rustc::mir::{Local, Body}; +use crate::borrow_check::{nll::ToRegionVid, region_infer::RegionInferenceContext}; +use rustc::mir::{Body, Local}; use rustc::ty::{RegionVid, TyCtxt}; use rustc_index::vec::{Idx, IndexVec}; -use syntax::source_map::Span; -use syntax_pos::symbol::Symbol; +use rustc_span::source_map::Span; +use rustc_span::symbol::Symbol; impl<'tcx> RegionInferenceContext<'tcx> { crate fn get_var_name_and_span_for_region( @@ -16,13 +16,12 @@ impl<'tcx> RegionInferenceContext<'tcx> { fr: RegionVid, ) -> Option<(Option, Span)> { debug!("get_var_name_and_span_for_region(fr={:?})", fr); - assert!(self.universal_regions.is_universal_region(fr)); + assert!(self.universal_regions().is_universal_region(fr)); debug!("get_var_name_and_span_for_region: attempting upvar"); self.get_upvar_index_for_region(tcx, fr) .map(|index| { - let (name, span) = - self.get_upvar_name_and_span_for_region(tcx, upvars, index); + let (name, span) = self.get_upvar_name_and_span_for_region(tcx, upvars, index); (Some(name), span) }) .or_else(|| { @@ -35,11 +34,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// Search the upvars (if any) to find one that references fr. Return its index. crate fn get_upvar_index_for_region(&self, tcx: TyCtxt<'tcx>, fr: RegionVid) -> Option { - let upvar_index = self - .universal_regions - .defining_ty - .upvar_tys(tcx) - .position(|upvar_ty| { + let upvar_index = + self.universal_regions().defining_ty.upvar_tys(tcx).position(|upvar_ty| { debug!("get_upvar_index_for_region: upvar_ty={:?}", upvar_ty); tcx.any_free_region_meets(&upvar_ty, |r| { let r = r.to_region_vid(); @@ -48,11 +44,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { }) })?; - let upvar_ty = self - .universal_regions - .defining_ty - .upvar_tys(tcx) - .nth(upvar_index); + let upvar_ty = self.universal_regions().defining_ty.upvar_tys(tcx).nth(upvar_index); debug!( "get_upvar_index_for_region: found {:?} in upvar {} which has type {:?}", @@ -75,8 +67,10 @@ impl<'tcx> RegionInferenceContext<'tcx> { let upvar_name = tcx.hir().name(upvar_hir_id); let upvar_span = tcx.hir().span(upvar_hir_id); - debug!("get_upvar_name_and_span_for_region: upvar_name={:?} upvar_span={:?}", - upvar_name, upvar_span); + debug!( + "get_upvar_name_and_span_for_region: upvar_name={:?} upvar_span={:?}", + upvar_name, upvar_span + ); (upvar_name, upvar_span) } @@ -91,23 +85,20 @@ impl<'tcx> RegionInferenceContext<'tcx> { tcx: TyCtxt<'tcx>, fr: RegionVid, ) -> Option { - let implicit_inputs = self.universal_regions.defining_ty.implicit_inputs(); - let argument_index = self - .universal_regions - .unnormalized_input_tys - .iter() - .skip(implicit_inputs) - .position(|arg_ty| { - debug!( - "get_argument_index_for_region: arg_ty = {:?}", - arg_ty - ); - tcx.any_free_region_meets(arg_ty, |r| r.to_region_vid() == fr) - })?; + let implicit_inputs = self.universal_regions().defining_ty.implicit_inputs(); + let argument_index = + self.universal_regions().unnormalized_input_tys.iter().skip(implicit_inputs).position( + |arg_ty| { + debug!("get_argument_index_for_region: arg_ty = {:?}", arg_ty); + tcx.any_free_region_meets(arg_ty, |r| r.to_region_vid() == fr) + }, + )?; debug!( "get_argument_index_for_region: found {:?} in argument {} which has type {:?}", - fr, argument_index, self.universal_regions.unnormalized_input_tys[argument_index], + fr, + argument_index, + self.universal_regions().unnormalized_input_tys[argument_index], ); Some(argument_index) @@ -121,14 +112,16 @@ impl<'tcx> RegionInferenceContext<'tcx> { local_names: &IndexVec>, argument_index: usize, ) -> (Option, Span) { - let implicit_inputs = self.universal_regions.defining_ty.implicit_inputs(); + let implicit_inputs = self.universal_regions().defining_ty.implicit_inputs(); let argument_local = Local::new(implicit_inputs + argument_index + 1); debug!("get_argument_name_and_span_for_region: argument_local={:?}", argument_local); let argument_name = local_names[argument_local]; let argument_span = body.local_decls[argument_local].source_info.span; - debug!("get_argument_name_and_span_for_region: argument_name={:?} argument_span={:?}", - argument_name, argument_span); + debug!( + "get_argument_name_and_span_for_region: argument_name={:?} argument_span={:?}", + argument_name, argument_span + ); (argument_name, argument_span) } diff --git a/src/librustc_mir/borrow_check/invalidation.rs b/src/librustc_mir/borrow_check/invalidation.rs index 58fac5512d..bb56c11872 100644 --- a/src/librustc_mir/borrow_check/invalidation.rs +++ b/src/librustc_mir/borrow_check/invalidation.rs @@ -1,25 +1,21 @@ -use rustc::ty::{self, TyCtxt}; use rustc::mir::visit::Visitor; -use rustc::mir::{BasicBlock, Location, Body, Place, ReadOnlyBodyAndCache, Rvalue}; -use rustc::mir::{Statement, StatementKind}; use rustc::mir::TerminatorKind; -use rustc::mir::{Operand, BorrowKind}; +use rustc::mir::{BasicBlock, Body, Location, Place, ReadOnlyBodyAndCache, Rvalue}; +use rustc::mir::{BorrowKind, Mutability, Operand}; +use rustc::mir::{Statement, StatementKind}; +use rustc::ty::TyCtxt; use rustc_data_structures::graph::dominators::Dominators; use crate::dataflow::indexes::BorrowIndex; use crate::borrow_check::{ - borrow_set::BorrowSet, - location::LocationTable, - facts::AllFacts, - path_utils::*, - JustWrite, WriteAndRead, AccessDepth, Deep, Shallow, ReadOrWrite, Activation, Read, - Reservation, Write, LocalMutationIsAllowed, MutateMode, ArtificialField, ReadKind, WriteKind, + borrow_set::BorrowSet, facts::AllFacts, location::LocationTable, path_utils::*, AccessDepth, + Activation, ArtificialField, Deep, JustWrite, LocalMutationIsAllowed, MutateMode, Read, + ReadKind, ReadOrWrite, Reservation, Shallow, Write, WriteAndRead, WriteKind, }; pub(super) fn generate_invalidates<'tcx>( tcx: TyCtxt<'tcx>, - param_env: ty::ParamEnv<'tcx>, all_facts: &mut Option, location_table: &LocationTable, body: ReadOnlyBodyAndCache<'_, 'tcx>, @@ -36,7 +32,6 @@ pub(super) fn generate_invalidates<'tcx>( let mut ig = InvalidationGenerator { all_facts, borrow_set, - param_env, tcx, location_table, body: &body, @@ -48,7 +43,6 @@ pub(super) fn generate_invalidates<'tcx>( struct InvalidationGenerator<'cx, 'tcx> { tcx: TyCtxt<'tcx>, - param_env: ty::ParamEnv<'tcx>, all_facts: &'cx mut AllFacts, location_table: &'cx LocationTable, body: &'cx Body<'tcx>, @@ -59,40 +53,20 @@ struct InvalidationGenerator<'cx, 'tcx> { /// Visits the whole MIR and generates `invalidates()` facts. /// Most of the code implementing this was stolen from `borrow_check/mod.rs`. impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { - fn visit_statement( - &mut self, - statement: &Statement<'tcx>, - location: Location, - ) { + fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) { self.check_activations(location); match statement.kind { - StatementKind::Assign(box(ref lhs, ref rhs)) => { - self.consume_rvalue( - location, - rhs, - ); + StatementKind::Assign(box (ref lhs, ref rhs)) => { + self.consume_rvalue(location, rhs); - self.mutate_place( - location, - lhs, - Shallow(None), - JustWrite - ); + self.mutate_place(location, lhs, Shallow(None), JustWrite); } StatementKind::FakeRead(_, _) => { // Only relavent for initialized/liveness/safety checks. } - StatementKind::SetDiscriminant { - ref place, - variant_index: _, - } => { - self.mutate_place( - location, - place, - Shallow(None), - JustWrite, - ); + StatementKind::SetDiscriminant { ref place, variant_index: _ } => { + self.mutate_place(location, place, Shallow(None), JustWrite); } StatementKind::InlineAsm(ref asm) => { for (o, output) in asm.asm.outputs.iter().zip(asm.outputs.iter()) { @@ -118,10 +92,10 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { self.consume_operand(location, input); } } - StatementKind::Nop | - StatementKind::AscribeUserType(..) | - StatementKind::Retag { .. } | - StatementKind::StorageLive(..) => { + StatementKind::Nop + | StatementKind::AscribeUserType(..) + | StatementKind::Retag { .. } + | StatementKind::StorageLive(..) => { // `Nop`, `AscribeUserType`, `Retag`, and `StorageLive` are irrelevant // to borrow check. } @@ -138,27 +112,14 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { self.super_statement(statement, location); } - fn visit_terminator_kind( - &mut self, - kind: &TerminatorKind<'tcx>, - location: Location - ) { + fn visit_terminator_kind(&mut self, kind: &TerminatorKind<'tcx>, location: Location) { self.check_activations(location); match kind { - TerminatorKind::SwitchInt { - ref discr, - switch_ty: _, - values: _, - targets: _, - } => { + TerminatorKind::SwitchInt { ref discr, switch_ty: _, values: _, targets: _ } => { self.consume_operand(location, discr); } - TerminatorKind::Drop { - location: ref drop_place, - target: _, - unwind: _, - } => { + TerminatorKind::Drop { location: ref drop_place, target: _, unwind: _ } => { self.access_place( location, drop_place, @@ -172,16 +133,8 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { target: _, unwind: _, } => { - self.mutate_place( - location, - drop_place, - Deep, - JustWrite, - ); - self.consume_operand( - location, - new_value, - ); + self.mutate_place(location, drop_place, Deep, JustWrite); + self.consume_operand(location, new_value); } TerminatorKind::Call { ref func, @@ -195,21 +148,10 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { self.consume_operand(location, arg); } if let Some((ref dest, _ /*bb*/)) = *destination { - self.mutate_place( - location, - dest, - Deep, - JustWrite, - ); + self.mutate_place(location, dest, Deep, JustWrite); } } - TerminatorKind::Assert { - ref cond, - expected: _, - ref msg, - target: _, - cleanup: _, - } => { + TerminatorKind::Assert { ref cond, expected: _, ref msg, target: _, cleanup: _ } => { self.consume_operand(location, cond); use rustc::mir::interpret::PanicInfo; if let PanicInfo::BoundsCheck { ref len, ref index } = *msg { @@ -217,11 +159,7 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { self.consume_operand(location, index); } } - TerminatorKind::Yield { - ref value, - resume, - drop: _, - } => { + TerminatorKind::Yield { ref value, resume, drop: _ } => { self.consume_operand(location, value); // Invalidate all borrows of local places @@ -246,14 +184,8 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { TerminatorKind::Goto { target: _ } | TerminatorKind::Abort | TerminatorKind::Unreachable - | TerminatorKind::FalseEdges { - real_target: _, - imaginary_target: _, - } - | TerminatorKind::FalseUnwind { - real_target: _, - unwind: _, - } => { + | TerminatorKind::FalseEdges { real_target: _, imaginary_target: _ } + | TerminatorKind::FalseUnwind { real_target: _, unwind: _ } => { // no data used, thus irrelevant to borrowck } } @@ -280,11 +212,7 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { } /// Simulates consumption of an operand. - fn consume_operand( - &mut self, - location: Location, - operand: &Operand<'tcx>, - ) { + fn consume_operand(&mut self, location: Location, operand: &Operand<'tcx>) { match *operand { Operand::Copy(ref place) => { self.access_place( @@ -307,17 +235,13 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { } // Simulates consumption of an rvalue - fn consume_rvalue( - &mut self, - location: Location, - rvalue: &Rvalue<'tcx>, - ) { + fn consume_rvalue(&mut self, location: Location, rvalue: &Rvalue<'tcx>) { match *rvalue { Rvalue::Ref(_ /*rgn*/, bk, ref place) => { let access_kind = match bk { BorrowKind::Shallow => { (Shallow(Some(ArtificialField::ShallowBorrow)), Read(ReadKind::Borrow(bk))) - }, + } BorrowKind::Shared => (Deep, Read(ReadKind::Borrow(bk))), BorrowKind::Unique | BorrowKind::Mut { .. } => { let wk = WriteKind::MutableBorrow(bk); @@ -329,12 +253,21 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { } }; - self.access_place( - location, - place, - access_kind, - LocalMutationIsAllowed::No, - ); + self.access_place(location, place, access_kind, LocalMutationIsAllowed::No); + } + + Rvalue::AddressOf(mutability, ref place) => { + let access_kind = match mutability { + Mutability::Mut => ( + Deep, + Write(WriteKind::MutableBorrow(BorrowKind::Mut { + allow_two_phase_borrow: false, + })), + ), + Mutability::Not => (Deep, Read(ReadKind::Borrow(BorrowKind::Shared))), + }; + + self.access_place(location, place, access_kind, LocalMutationIsAllowed::No); } Rvalue::Use(ref operand) @@ -364,8 +297,7 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { self.consume_operand(location, operand2); } - Rvalue::NullaryOp(_op, _ty) => { - } + Rvalue::NullaryOp(_op, _ty) => {} Rvalue::Aggregate(_, ref operands) => { for operand in operands { @@ -398,20 +330,15 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { debug!( "invalidation::check_access_for_conflict(location={:?}, place={:?}, sd={:?}, \ rw={:?})", - location, - place, - sd, - rw, + location, place, sd, rw, ); let tcx = self.tcx; let body = self.body; - let param_env = self.param_env; let borrow_set = self.borrow_set.clone(); let indices = self.borrow_set.borrows.indices(); each_borrow_involving_path( self, tcx, - param_env, body, location, (sd, place), @@ -450,9 +377,7 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { this.generate_invalidates(borrow_index, location); } - (Reservation(_), _) - | (Activation(_, _), _) - | (Write(_), _) => { + (Reservation(_), _) | (Activation(_, _), _) | (Write(_), _) => { // unique or mutable borrows are invalidated by writes. // Reservations count as writes since we need to check // that activating the borrow will be OK @@ -465,17 +390,13 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { ); } - /// Generates a new `invalidates(L, B)` fact. fn generate_invalidates(&mut self, b: BorrowIndex, l: Location) { let lidx = self.location_table.start_index(l); self.all_facts.invalidates.push((lidx, b)); } - fn check_activations( - &mut self, - location: Location, - ) { + fn check_activations(&mut self, location: Location) { // Two-phase borrow support: For each activation that is newly // generated at this statement, check if it interferes with // another borrow. @@ -491,10 +412,7 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { self.access_place( location, &borrow.borrowed_place, - ( - Deep, - Activation(WriteKind::MutableBorrow(borrow.kind), borrow_index), - ), + (Deep, Activation(WriteKind::MutableBorrow(borrow.kind), borrow_index)), LocalMutationIsAllowed::No, ); diff --git a/src/librustc_mir/borrow_check/location.rs b/src/librustc_mir/borrow_check/location.rs index 9e94317b87..7bc746b181 100644 --- a/src/librustc_mir/borrow_check/location.rs +++ b/src/librustc_mir/borrow_check/location.rs @@ -1,4 +1,4 @@ -use rustc::mir::{BasicBlock, Location, Body}; +use rustc::mir::{BasicBlock, Body, Location}; use rustc_index::vec::{Idx, IndexVec}; /// Maps between a MIR Location, which identifies a particular @@ -32,7 +32,8 @@ crate enum RichLocation { impl LocationTable { crate fn new(body: &Body<'_>) -> Self { let mut num_points = 0; - let statements_before_block = body.basic_blocks() + let statements_before_block = body + .basic_blocks() .iter() .map(|block_data| { let v = num_points; @@ -41,16 +42,10 @@ impl LocationTable { }) .collect(); - debug!( - "LocationTable(statements_before_block={:#?})", - statements_before_block - ); + debug!("LocationTable(statements_before_block={:#?})", statements_before_block); debug!("LocationTable: num_points={:#?}", num_points); - Self { - num_points, - statements_before_block, - } + Self { num_points, statements_before_block } } crate fn all_points(&self) -> impl Iterator { @@ -58,19 +53,13 @@ impl LocationTable { } crate fn start_index(&self, location: Location) -> LocationIndex { - let Location { - block, - statement_index, - } = location; + let Location { block, statement_index } = location; let start_index = self.statements_before_block[block]; LocationIndex::new(start_index + statement_index * 2) } crate fn mid_index(&self, location: Location) -> LocationIndex { - let Location { - block, - statement_index, - } = location; + let Location { block, statement_index } = location; let start_index = self.statements_before_block[block]; LocationIndex::new(start_index + statement_index * 2 + 1) } @@ -94,7 +83,8 @@ impl LocationTable { // the last point where the "first index" (0, 10, or 20) // was less than the statement index (22). In our case, this will // be (BB2, 20). - let (block, &first_index) = self.statements_before_block + let (block, &first_index) = self + .statements_before_block .iter_enumerated() .filter(|(_, first_index)| **first_index <= point_index) .last() diff --git a/src/librustc_mir/borrow_check/member_constraints.rs b/src/librustc_mir/borrow_check/member_constraints.rs index 75213d3098..c95919685b 100644 --- a/src/librustc_mir/borrow_check/member_constraints.rs +++ b/src/librustc_mir/borrow_check/member_constraints.rs @@ -1,11 +1,11 @@ use crate::rustc::ty::{self, Ty}; -use rustc::hir::def_id::DefId; use rustc::infer::region_constraints::MemberConstraint; use rustc_data_structures::fx::FxHashMap; -use rustc_index::vec::{Idx, IndexVec}; +use rustc_hir::def_id::DefId; +use rustc_index::vec::IndexVec; +use rustc_span::Span; use std::hash::Hash; use std::ops::Index; -use syntax_pos::Span; /// Compactly stores a set of `R0 member of [R1...Rn]` constraints, /// indexed by the region `R0`. @@ -141,11 +141,7 @@ where first_constraints2.insert(r2, start1); } - MemberConstraintSet { - first_constraints: first_constraints2, - constraints, - choice_regions, - } + MemberConstraintSet { first_constraints: first_constraints2, constraints, choice_regions } } } @@ -153,9 +149,7 @@ impl MemberConstraintSet<'tcx, R> where R: Copy + Hash + Eq, { - crate fn all_indices( - &self, - ) -> impl Iterator { + crate fn all_indices(&self) -> impl Iterator { self.constraints.indices() } diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 11012ef2fc..3bfe510a72 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -1,78 +1,79 @@ //! This query borrow-checks the MIR to (further) ensure it is not broken. -use rustc::hir::{self, HirId}; -use rustc::hir::Node; -use rustc::hir::def_id::DefId; use rustc::infer::InferCtxt; +use rustc::lint::builtin::MUTABLE_BORROW_RESERVATION_CONFLICT; use rustc::lint::builtin::UNUSED_MUT; -use rustc::lint::builtin::{MUTABLE_BORROW_RESERVATION_CONFLICT}; -use rustc::mir::{AggregateKind, BasicBlock, BorrowCheckResult, BorrowKind}; use rustc::mir::{ - ClearCrossCrate, Local, Location, Body, BodyAndCache, Mutability, Operand, Place, PlaceBase, - PlaceElem, PlaceRef, ReadOnlyBodyAndCache, Static, StaticKind, read_only + read_only, Body, BodyAndCache, ClearCrossCrate, Local, Location, Mutability, Operand, Place, + PlaceElem, PlaceRef, ReadOnlyBodyAndCache, }; +use rustc::mir::{AggregateKind, BasicBlock, BorrowCheckResult, BorrowKind}; use rustc::mir::{Field, ProjectionElem, Promoted, Rvalue, Statement, StatementKind}; use rustc::mir::{Terminator, TerminatorKind}; use rustc::ty::query::Providers; -use rustc::ty::{self, TyCtxt}; +use rustc::ty::{self, RegionVid, TyCtxt}; -use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder}; -use rustc_index::bit_set::BitSet; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::graph::dominators::Dominators; +use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder}; +use rustc_hir as hir; +use rustc_hir::{def_id::DefId, HirId, Node}; +use rustc_index::bit_set::BitSet; use rustc_index::vec::IndexVec; -use smallvec::SmallVec; +use smallvec::SmallVec; +use std::cell::RefCell; use std::collections::BTreeMap; use std::mem; use std::rc::Rc; +use rustc_span::{Span, DUMMY_SP}; use syntax::ast::Name; -use syntax_pos::{Span, DUMMY_SP}; use crate::dataflow::indexes::{BorrowIndex, InitIndex, MoveOutIndex, MovePathIndex}; use crate::dataflow::move_paths::{HasMoveData, InitLocation, LookupResult, MoveData, MoveError}; use crate::dataflow::Borrows; use crate::dataflow::DataflowResultsConsumer; +use crate::dataflow::EverInitializedPlaces; use crate::dataflow::FlowAtLocation; use crate::dataflow::MoveDataParamEnv; use crate::dataflow::{do_dataflow, DebugFormatted}; -use crate::dataflow::EverInitializedPlaces; use crate::dataflow::{MaybeInitializedPlaces, MaybeUninitializedPlaces}; +use crate::transform::MirSource; +use self::diagnostics::{AccessKind, RegionName}; use self::flows::Flows; use self::location::LocationTable; use self::prefixes::PrefixSet; use self::MutateMode::{JustWrite, WriteAndRead}; -use self::diagnostics::AccessKind; use self::path_utils::*; +mod borrow_set; +mod constraint_generation; +mod constraints; mod diagnostics; +mod facts; mod flows; +mod invalidation; mod location; +mod member_constraints; +mod nll; mod path_utils; +mod place_ext; +mod places_conflict; mod prefixes; -mod used_muts; -mod constraint_generation; -mod facts; -mod invalidation; +mod region_infer; mod renumber; -mod member_constraints; -mod constraints; -mod universal_regions; mod type_check; -mod region_infer; -mod borrow_set; -mod place_ext; -mod places_conflict; -mod nll; +mod universal_regions; +mod used_muts; -crate use region_infer::RegionInferenceContext; -crate use borrow_set::{BorrowSet, BorrowData}; -crate use places_conflict::{places_conflict, PlaceConflictBias}; -crate use place_ext::PlaceExt; +crate use borrow_set::{BorrowData, BorrowSet}; crate use nll::ToRegionVid; +crate use place_ext::PlaceExt; +crate use places_conflict::{places_conflict, PlaceConflictBias}; +crate use region_infer::RegionInferenceContext; // FIXME(eddyb) perhaps move this somewhere more centrally. #[derive(Debug)] @@ -88,10 +89,7 @@ crate struct Upvar { } pub fn provide(providers: &mut Providers<'_>) { - *providers = Providers { - mir_borrowck, - ..*providers - }; + *providers = Providers { mir_borrowck, ..*providers }; } fn mir_borrowck(tcx: TyCtxt<'_>, def_id: DefId) -> BorrowCheckResult<'_> { @@ -119,19 +117,20 @@ fn do_mir_borrowck<'a, 'tcx>( let tcx = infcx.tcx; let attributes = tcx.get_attrs(def_id); let param_env = tcx.param_env(def_id); - let id = tcx - .hir() - .as_local_hir_id(def_id) - .expect("do_mir_borrowck: non-local DefId"); + let id = tcx.hir().as_local_hir_id(def_id).expect("do_mir_borrowck: non-local DefId"); let mut local_names = IndexVec::from_elem(None, &input_body.local_decls); for var_debug_info in &input_body.var_debug_info { if let Some(local) = var_debug_info.place.as_local() { if let Some(prev_name) = local_names[local] { if var_debug_info.name != prev_name { - span_bug!(var_debug_info.source_info.span, + span_bug!( + var_debug_info.source_info.span, "local {:?} has many names (`{}` vs `{}`)", - local, prev_name, var_debug_info.name); + local, + prev_name, + var_debug_info.name + ); } } local_names[local] = Some(var_debug_info.name); @@ -158,9 +157,8 @@ fn do_mir_borrowck<'a, 'tcx>( by_ref, mutability: Mutability::Not, }; - let bm = *tables.pat_binding_modes().get(var_hir_id) - .expect("missing binding mode"); - if bm == ty::BindByValue(hir::Mutability::Mutable) { + let bm = *tables.pat_binding_modes().get(var_hir_id).expect("missing binding mode"); + if bm == ty::BindByValue(hir::Mutability::Mut) { upvar.mutability = Mutability::Mut; } upvar @@ -177,10 +175,7 @@ fn do_mir_borrowck<'a, 'tcx>( let free_regions = nll::replace_regions_in_mir(infcx, def_id, param_env, &mut body, &mut promoted); let body = read_only!(body); // no further changes - let promoted: IndexVec<_, _> = promoted - .iter_mut() - .map(|body| read_only!(body)) - .collect(); + let promoted: IndexVec<_, _> = promoted.iter_mut().map(|body| read_only!(body)).collect(); let location_table = &LocationTable::new(&body); @@ -191,10 +186,7 @@ fn do_mir_borrowck<'a, 'tcx>( Err((move_data, move_errors)) => (move_data, Some(move_errors)), }; - let mdpe = MoveDataParamEnv { - move_data, - param_env, - }; + let mdpe = MoveDataParamEnv { move_data, param_env }; let dead_unwinds = BitSet::new_empty(body.basic_blocks().len()); let mut flow_inits = FlowAtLocation::new(do_dataflow( @@ -208,25 +200,31 @@ fn do_mir_borrowck<'a, 'tcx>( )); let locals_are_invalidated_at_exit = tcx.hir().body_owner_kind(id).is_fn_or_closure(); - let borrow_set = Rc::new(BorrowSet::build( - tcx, body, locals_are_invalidated_at_exit, &mdpe.move_data)); + let borrow_set = + Rc::new(BorrowSet::build(tcx, body, locals_are_invalidated_at_exit, &mdpe.move_data)); + + // Compute non-lexical lifetimes. + let nll::NllOutput { regioncx, polonius_output, opt_closure_req, nll_errors } = + nll::compute_regions( + infcx, + def_id, + free_regions, + body, + &promoted, + location_table, + param_env, + &mut flow_inits, + &mdpe.move_data, + &borrow_set, + ); - // If we are in non-lexical mode, compute the non-lexical lifetimes. - let (regioncx, polonius_output, opt_closure_req) = nll::compute_regions( - infcx, - def_id, - free_regions, - body, - &promoted, - &local_names, - &upvars, - location_table, - param_env, - &mut flow_inits, - &mdpe.move_data, - &borrow_set, - &mut errors_buffer, - ); + // Dump MIR results into a file, if that is enabled. This let us + // write unit-tests, as well as helping with debugging. + nll::dump_mir_results(infcx, MirSource::item(def_id), &body, ®ioncx, &opt_closure_req); + + // We also have a `#[rustc_nll]` annotation that causes us to dump + // information. + nll::dump_annotation(infcx, &body, def_id, ®ioncx, &opt_closure_req, &mut errors_buffer); // The various `flow_*` structures can be large. We drop `flow_inits` here // so it doesn't overlap with the others below. This reduces peak memory @@ -241,7 +239,7 @@ fn do_mir_borrowck<'a, 'tcx>( def_id, &attributes, &dead_unwinds, - Borrows::new(tcx, &body, param_env, regioncx.clone(), &borrow_set), + Borrows::new(tcx, &body, regioncx.clone(), &borrow_set), |rs, i| DebugFormatted::new(&rs.location(i)), )); let flow_uninits = FlowAtLocation::new(do_dataflow( @@ -277,7 +275,6 @@ fn do_mir_borrowck<'a, 'tcx>( infcx, body, mir_def_id: def_id, - param_env, move_data: &mdpe.move_data, location_table, movable_generator, @@ -288,21 +285,21 @@ fn do_mir_borrowck<'a, 'tcx>( move_error_reported: BTreeMap::new(), uninitialized_error_reported: Default::default(), errors_buffer, - nonlexical_regioncx: regioncx, + regioncx, used_mut: Default::default(), used_mut_upvars: SmallVec::new(), borrow_set, dominators, upvars, local_names, + region_names: RefCell::default(), + next_region_name: RefCell::new(1), }; - let mut state = Flows::new( - flow_borrows, - flow_uninits, - flow_ever_inits, - polonius_output, - ); + // Compute and report region errors, if any. + mbcx.report_region_errors(nll_errors); + + let mut state = Flows::new(flow_borrows, flow_uninits, flow_ever_inits, polonius_output); if let Some(errors) = move_errors { mbcx.report_move_errors(errors); @@ -323,7 +320,11 @@ fn do_mir_borrowck<'a, 'tcx>( // Span and message don't matter; we overwrite them below anyway let mut diag = mbcx.infcx.tcx.struct_span_lint_hir( - MUTABLE_BORROW_RESERVATION_CONFLICT, lint_root, DUMMY_SP, ""); + MUTABLE_BORROW_RESERVATION_CONFLICT, + lint_root, + DUMMY_SP, + "", + ); diag.message = initial_diag.styled_message().clone(); diag.span = initial_diag.span.clone(); @@ -337,22 +338,22 @@ fn do_mir_borrowck<'a, 'tcx>( // Note that this set is expected to be small - only upvars from closures // would have a chance of erroneously adding non-user-defined mutable vars // to the set. - let temporary_used_locals: FxHashSet = mbcx.used_mut.iter() + let temporary_used_locals: FxHashSet = mbcx + .used_mut + .iter() .filter(|&local| !mbcx.body.local_decls[*local].is_user_variable()) .cloned() .collect(); // For the remaining unused locals that are marked as mutable, we avoid linting any that // were never initialized. These locals may have been removed as unreachable code; or will be // linted as unused variables. - let unused_mut_locals = mbcx.body.mut_vars_iter() - .filter(|local| !mbcx.used_mut.contains(local)) - .collect(); + let unused_mut_locals = + mbcx.body.mut_vars_iter().filter(|local| !mbcx.used_mut.contains(local)).collect(); mbcx.gather_used_muts(temporary_used_locals, unused_mut_locals); debug!("mbcx.used_mut: {:?}", mbcx.used_mut); let used_mut = mbcx.used_mut; - for local in mbcx.body.mut_vars_and_args_iter().filter(|local| !used_mut.contains(local)) - { + for local in mbcx.body.mut_vars_and_args_iter().filter(|local| !used_mut.contains(local)) { let local_decl = &mbcx.body.local_decls[local]; let lint_root = match &mbcx.body.source_scopes[local_decl.source_info.scope].local_data { ClearCrossCrate::Set(data) => data.lint_root, @@ -361,9 +362,11 @@ fn do_mir_borrowck<'a, 'tcx>( // Skip over locals that begin with an underscore or have no name match mbcx.local_names[local] { - Some(name) => if name.as_str().starts_with("_") { - continue; - }, + Some(name) => { + if name.as_str().starts_with("_") { + continue; + } + } None => continue, } @@ -416,7 +419,6 @@ crate struct MirBorrowckCtxt<'cx, 'tcx> { crate infcx: &'cx InferCtxt<'cx, 'tcx>, body: ReadOnlyBodyAndCache<'cx, 'tcx>, mir_def_id: DefId, - param_env: ty::ParamEnv<'tcx>, move_data: &'cx MoveData<'tcx>, /// Map from MIR `Location` to `LocationIndex`; created @@ -448,10 +450,8 @@ crate struct MirBorrowckCtxt<'cx, 'tcx> { /// Migration warnings to be reported for #56254. We delay reporting these /// so that we can suppress the warning if there's a corresponding error /// for the activation of the borrow. - reservation_warnings: FxHashMap< - BorrowIndex, - (Place<'tcx>, Span, Location, BorrowKind, BorrowData<'tcx>) - >, + reservation_warnings: + FxHashMap, Span, Location, BorrowKind, BorrowData<'tcx>)>, /// This field keeps track of move errors that are to be reported for given move indicies. /// /// There are situations where many errors can be reported for a single move out (see #53807) @@ -478,10 +478,9 @@ crate struct MirBorrowckCtxt<'cx, 'tcx> { /// If the function we're checking is a closure, then we'll need to report back the list of /// mutable upvars that have been used. This field keeps track of them. used_mut_upvars: SmallVec<[Field; 8]>, - /// Non-lexical region inference context, if NLL is enabled. This - /// contains the results from region inference and lets us e.g. + /// Region inference context. This contains the results from region inference and lets us e.g. /// find out which CFG points are contained in each borrow region. - nonlexical_regioncx: Rc>, + regioncx: Rc>, /// The set of borrows extracted from the MIR borrow_set: Rc>, @@ -494,6 +493,13 @@ crate struct MirBorrowckCtxt<'cx, 'tcx> { /// Names of local (user) variables (extracted from `var_debug_info`). local_names: IndexVec>, + + /// Record the region names generated for each region in the given + /// MIR def so that we can reuse them later in help/error messages. + region_names: RefCell>, + + /// The counter for generating new region names. + next_region_name: RefCell, } // Check that: @@ -518,29 +524,16 @@ impl<'cx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tcx stmt: &'cx Statement<'tcx>, flow_state: &Self::FlowState, ) { - debug!( - "MirBorrowckCtxt::process_statement({:?}, {:?}): {}", - location, stmt, flow_state - ); + debug!("MirBorrowckCtxt::process_statement({:?}, {:?}): {}", location, stmt, flow_state); let span = stmt.source_info.span; self.check_activations(location, span, flow_state); match stmt.kind { - StatementKind::Assign(box(ref lhs, ref rhs)) => { - self.consume_rvalue( - location, - (rhs, span), - flow_state, - ); + StatementKind::Assign(box (ref lhs, ref rhs)) => { + self.consume_rvalue(location, (rhs, span), flow_state); - self.mutate_place( - location, - (lhs, span), - Shallow(None), - JustWrite, - flow_state, - ); + self.mutate_place(location, (lhs, span), Shallow(None), JustWrite, flow_state); } StatementKind::FakeRead(_, box ref place) => { // Read for match doesn't access any memory and is used to @@ -560,17 +553,8 @@ impl<'cx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tcx flow_state, ); } - StatementKind::SetDiscriminant { - ref place, - variant_index: _, - } => { - self.mutate_place( - location, - (place, span), - Shallow(None), - JustWrite, - flow_state, - ); + StatementKind::SetDiscriminant { ref place, variant_index: _ } => { + self.mutate_place(location, (place, span), Shallow(None), JustWrite, flow_state); } StatementKind::InlineAsm(ref asm) => { for (o, output) in asm.asm.outputs.iter().zip(asm.outputs.iter()) { @@ -630,28 +614,16 @@ impl<'cx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tcx flow_state: &Self::FlowState, ) { let loc = location; - debug!( - "MirBorrowckCtxt::process_terminator({:?}, {:?}): {}", - location, term, flow_state - ); + debug!("MirBorrowckCtxt::process_terminator({:?}, {:?}): {}", location, term, flow_state); let span = term.source_info.span; self.check_activations(location, span, flow_state); match term.kind { - TerminatorKind::SwitchInt { - ref discr, - switch_ty: _, - values: _, - targets: _, - } => { + TerminatorKind::SwitchInt { ref discr, switch_ty: _, values: _, targets: _ } => { self.consume_operand(loc, (discr, span), flow_state); } - TerminatorKind::Drop { - location: ref drop_place, - target: _, - unwind: _, - } => { + TerminatorKind::Drop { location: ref drop_place, target: _, unwind: _ } => { let tcx = self.infcx.tcx; // Compute the type with accurate region information. @@ -665,9 +637,11 @@ impl<'cx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tcx // that is useful later. tcx.lift(&drop_place_ty).unwrap(); - debug!("visit_terminator_drop \ - loc: {:?} term: {:?} drop_place: {:?} drop_place_ty: {:?} span: {:?}", - loc, term, drop_place, drop_place_ty, span); + debug!( + "visit_terminator_drop \ + loc: {:?} term: {:?} drop_place: {:?} drop_place_ty: {:?} span: {:?}", + loc, term, drop_place, drop_place_ty, span + ); self.access_place( loc, @@ -683,18 +657,8 @@ impl<'cx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tcx target: _, unwind: _, } => { - self.mutate_place( - loc, - (drop_place, span), - Deep, - JustWrite, - flow_state, - ); - self.consume_operand( - loc, - (new_value, span), - flow_state, - ); + self.mutate_place(loc, (drop_place, span), Deep, JustWrite, flow_state); + self.consume_operand(loc, (new_value, span), flow_state); } TerminatorKind::Call { ref func, @@ -705,29 +669,13 @@ impl<'cx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tcx } => { self.consume_operand(loc, (func, span), flow_state); for arg in args { - self.consume_operand( - loc, - (arg, span), - flow_state, - ); + self.consume_operand(loc, (arg, span), flow_state); } if let Some((ref dest, _ /*bb*/)) = *destination { - self.mutate_place( - loc, - (dest, span), - Deep, - JustWrite, - flow_state, - ); + self.mutate_place(loc, (dest, span), Deep, JustWrite, flow_state); } } - TerminatorKind::Assert { - ref cond, - expected: _, - ref msg, - target: _, - cleanup: _, - } => { + TerminatorKind::Assert { ref cond, expected: _, ref msg, target: _, cleanup: _ } => { self.consume_operand(loc, (cond, span), flow_state); use rustc::mir::interpret::PanicInfo; if let PanicInfo::BoundsCheck { ref len, ref index } = *msg { @@ -736,11 +684,7 @@ impl<'cx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tcx } } - TerminatorKind::Yield { - ref value, - resume: _, - drop: _, - } => { + TerminatorKind::Yield { ref value, resume: _, drop: _ } => { self.consume_operand(loc, (value, span), flow_state); if self.movable_generator { @@ -771,14 +715,8 @@ impl<'cx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tcx TerminatorKind::Goto { target: _ } | TerminatorKind::Abort | TerminatorKind::Unreachable - | TerminatorKind::FalseEdges { - real_target: _, - imaginary_target: _, - } - | TerminatorKind::FalseUnwind { - real_target: _, - unwind: _, - } => { + | TerminatorKind::FalseEdges { real_target: _, imaginary_target: _ } + | TerminatorKind::FalseUnwind { real_target: _, unwind: _ } => { // no data used, thus irrelevant to borrowck } } @@ -791,8 +729,8 @@ enum MutateMode { WriteAndRead, } -use self::ReadOrWrite::{Activation, Read, Reservation, Write}; use self::AccessDepth::{Deep, Shallow}; +use self::ReadOrWrite::{Activation, Read, Reservation, Write}; #[derive(Copy, Clone, PartialEq, Eq, Debug)] enum ArtificialField { @@ -885,7 +823,7 @@ enum InitializationRequiringAction { } struct RootPlace<'d, 'tcx> { - place_base: &'d PlaceBase<'tcx>, + place_local: &'d Local, place_projection: &'d [PlaceElem<'tcx>], is_local_mutation_allowed: LocalMutationIsAllowed, } @@ -944,10 +882,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // Check is_empty() first because it's the common case, and doing that // way we avoid the clone() call. - if !self.access_place_error_reported.is_empty() && - self - .access_place_error_reported - .contains(&(place_span.0.clone(), place_span.1)) + if !self.access_place_error_reported.is_empty() + && self.access_place_error_reported.contains(&(*place_span.0, place_span.1)) { debug!( "access_place: suppressing error place_span=`{:?}` kind=`{:?}`", @@ -956,14 +892,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { return; } - let mutability_error = - self.check_access_permissions( - place_span, - rw, - is_local_mutation_allowed, - flow_state, - location, - ); + let mutability_error = self.check_access_permissions( + place_span, + rw, + is_local_mutation_allowed, + flow_state, + location, + ); let conflict_error = self.check_access_for_conflict(location, place_span, sd, rw, flow_state); @@ -974,13 +909,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } if conflict_error || mutability_error { - debug!( - "access_place: logging error place_span=`{:?}` kind=`{:?}`", - place_span, kind - ); + debug!("access_place: logging error place_span=`{:?}` kind=`{:?}`", place_span, kind); - self.access_place_error_reported - .insert((place_span.0.clone(), place_span.1)); + self.access_place_error_reported.insert((*place_span.0, place_span.1)); } } @@ -1001,13 +932,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let tcx = self.infcx.tcx; let body = self.body; let body: &Body<'_> = &body; - let param_env = self.param_env; let location_table = self.location_table.start_index(location); let borrow_set = self.borrow_set.clone(); each_borrow_involving_path( self, tcx, - param_env, body, location, (sd, place_span.0), @@ -1053,7 +982,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { error_reported = true; match kind { - ReadKind::Copy => { + ReadKind::Copy => { this.report_use_while_mutably_borrowed(location, place_span, borrow) .buffer(&mut this.errors_buffer); } @@ -1066,32 +995,30 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } (Reservation(WriteKind::MutableBorrow(bk)), BorrowKind::Shallow) - | (Reservation(WriteKind::MutableBorrow(bk)), BorrowKind::Shared) if { - tcx.migrate_borrowck() && this.borrow_set.location_map.contains_key(&location) - } => { + | (Reservation(WriteKind::MutableBorrow(bk)), BorrowKind::Shared) + if { + tcx.migrate_borrowck() + && this.borrow_set.location_map.contains_key(&location) + } => + { let bi = this.borrow_set.location_map[&location]; debug!( "recording invalid reservation of place: {:?} with \ borrow index {:?} as warning", - place_span.0, - bi, + place_span.0, bi, ); // rust-lang/rust#56254 - This was previously permitted on // the 2018 edition so we emit it as a warning. We buffer // these sepately so that we only emit a warning if borrow // checking was otherwise successful. - this.reservation_warnings.insert( - bi, - (place_span.0.clone(), place_span.1, location, bk, borrow.clone()), - ); + this.reservation_warnings + .insert(bi, (*place_span.0, place_span.1, location, bk, borrow.clone())); // Don't suppress actual errors. Control::Continue } - (Reservation(kind), _) - | (Activation(kind, _), _) - | (Write(kind), _) => { + (Reservation(kind), _) | (Activation(kind, _), _) | (Write(kind), _) => { match rw { Reservation(..) => { debug!( @@ -1117,13 +1044,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { this.report_conflicting_borrow(location, place_span, bk, borrow) .buffer(&mut this.errors_buffer); } - WriteKind::StorageDeadOrDrop => { - this.report_borrowed_value_does_not_live_long_enough( + WriteKind::StorageDeadOrDrop => this + .report_borrowed_value_does_not_live_long_enough( location, borrow, place_span, - Some(kind)) - } + Some(kind), + ), WriteKind::Mutate => { this.report_illegal_mutation_of_borrowed(location, place_span, borrow) } @@ -1169,10 +1096,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if let Mutability::Not = self.body.local_decls[local].mutability { // check for reassignments to immutable local variables self.check_if_reassignment_to_immutable_state( - location, - local, - place_span, - flow_state, + location, local, place_span, flow_state, ); return; } @@ -1199,7 +1123,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let access_kind = match bk { BorrowKind::Shallow => { (Shallow(Some(ArtificialField::ShallowBorrow)), Read(ReadKind::Borrow(bk))) - }, + } BorrowKind::Shared => (Deep, Read(ReadKind::Borrow(bk))), BorrowKind::Unique | BorrowKind::Mut { .. } => { let wk = WriteKind::MutableBorrow(bk); @@ -1233,6 +1157,33 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ); } + Rvalue::AddressOf(mutability, ref place) => { + let access_kind = match mutability { + Mutability::Mut => ( + Deep, + Write(WriteKind::MutableBorrow(BorrowKind::Mut { + allow_two_phase_borrow: false, + })), + ), + Mutability::Not => (Deep, Read(ReadKind::Borrow(BorrowKind::Shared))), + }; + + self.access_place( + location, + (place, span), + access_kind, + LocalMutationIsAllowed::No, + flow_state, + ); + + self.check_if_path_or_subpath_is_moved( + location, + InitializationRequiringAction::Borrow, + (place.as_ref(), span), + flow_state, + ); + } + Rvalue::Use(ref operand) | Rvalue::Repeat(ref operand, _) | Rvalue::UnaryOp(_ /*un_op*/, ref operand) @@ -1280,11 +1231,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // moved into the closure and subsequently used by the closure, // in order to populate our used_mut set. match **aggregate_kind { - AggregateKind::Closure(def_id, _) - | AggregateKind::Generator(def_id, _, _) => { - let BorrowCheckResult { - used_mut_upvars, .. - } = self.infcx.tcx.mir_borrowck(def_id); + AggregateKind::Closure(def_id, _) | AggregateKind::Generator(def_id, _, _) => { + let BorrowCheckResult { used_mut_upvars, .. } = + self.infcx.tcx.mir_borrowck(def_id); debug!("{:?} used_mut_upvars={:?}", def_id, used_mut_upvars); for field in used_mut_upvars { self.propagate_closure_used_mut_upvar(&operands[field.index()]); @@ -1308,8 +1257,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if let Some(field) = this.is_upvar_field_projection(place.as_ref()) { this.used_mut_upvars.push(field); } - } else if let PlaceBase::Local(local) = place.base { - this.used_mut.insert(local); + } else { + this.used_mut.insert(place.local); } }; @@ -1433,7 +1382,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { debug!("check_for_invalidation_at_exit({:?})", borrow); let place = &borrow.borrowed_place; let deref = [ProjectionElem::Deref]; - let mut root_place = PlaceRef { base: &place.base, projection: &[] }; + let mut root_place = PlaceRef { local: &place.local, projection: &[] }; // FIXME(nll-rfc#40): do more precise destructor tracking here. For now // we just know that all locals are dropped at function exit (otherwise @@ -1441,28 +1390,19 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // // FIXME: allow thread-locals to borrow other thread locals? - let (might_be_alive, will_be_dropped) = match root_place.base { - PlaceBase::Static(_) => { - (true, false) - } - PlaceBase::Local(local) => { - if self.body.local_decls[*local].is_ref_to_thread_local() { - // Thread-locals might be dropped after the function exits - // We have to dereference the outer reference because - // borrows don't conflict behind shared references. - root_place.projection = &deref; - (true, true) - } else { - (false, self.locals_are_invalidated_at_exit) - } - } - }; + let (might_be_alive, will_be_dropped) = + if self.body.local_decls[*root_place.local].is_ref_to_thread_local() { + // Thread-locals might be dropped after the function exits + // We have to dereference the outer reference because + // borrows don't conflict behind shared references. + root_place.projection = &deref; + (true, true) + } else { + (false, self.locals_are_invalidated_at_exit) + }; if !will_be_dropped { - debug!( - "place_is_invalidated_at_exit({:?}) - won't be dropped", - place - ); + debug!("place_is_invalidated_at_exit({:?}) - won't be dropped", place); return; } @@ -1470,7 +1410,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if places_conflict::borrow_conflicts_with_place( self.infcx.tcx, - self.param_env, &self.body, place, borrow.kind, @@ -1492,15 +1431,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } /// Reports an error if this is a borrow of local data. - /// This is called for all Yield statements on movable generators + /// This is called for all Yield expressions on movable generators fn check_for_local_borrow(&mut self, borrow: &BorrowData<'tcx>, yield_span: Span) { debug!("check_for_local_borrow({:?})", borrow); if borrow_of_local_data(&borrow.borrowed_place) { let err = self.cannot_borrow_across_generator_yield( - self.retrieve_borrow_spans(borrow).var_or_use(), - yield_span, - ); + self.retrieve_borrow_spans(borrow).var_or_use(), + yield_span, + ); err.buffer(&mut self.errors_buffer); } @@ -1523,10 +1462,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { self.access_place( location, (&borrow.borrowed_place, span), - ( - Deep, - Activation(WriteKind::MutableBorrow(borrow.kind), borrow_index), - ), + (Deep, Activation(WriteKind::MutableBorrow(borrow.kind), borrow_index)), LocalMutationIsAllowed::No, flow_state, ); @@ -1552,9 +1488,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // And, if so, report an error. let init = &self.move_data.inits[init_index]; let span = init.span(&self.body); - self.report_illegal_reassignment( - location, place_span, span, place_span.0 - ); + self.report_illegal_reassignment(location, place_span, span, place_span.0); } } @@ -1603,26 +1537,20 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // This code covers scenarios 1, 2, and 3. debug!("check_if_full_path_is_moved place: {:?}", place_span.0); - match self.move_path_closest_to(place_span.0) { - Ok((prefix, mpi)) => { - if maybe_uninits.contains(mpi) { - self.report_use_of_moved_or_uninitialized( - location, - desired_action, - (prefix, place_span.0, place_span.1), - mpi, - ); - } - } - Err(NoMovePathFound::ReachedStatic) => { - // Okay: we do not build MoveData for static variables - } // Only query longest prefix with a MovePath, not further - // ancestors; dataflow recurs on children when parents - // move (to support partial (re)inits). - // - // (I.e., querying parents breaks scenario 7; but may want - // to do such a query based on partial-init feature-gate.) - } + let (prefix, mpi) = self.move_path_closest_to(place_span.0); + if maybe_uninits.contains(mpi) { + self.report_use_of_moved_or_uninitialized( + location, + desired_action, + (prefix, place_span.0, place_span.1), + mpi, + ); + } // Only query longest prefix with a MovePath, not further + // ancestors; dataflow recurs on children when parents + // move (to support partial (re)inits). + // + // (I.e., querying parents breaks scenario 7; but may want + // to do such a query based on partial-init feature-gate.) } /// Subslices correspond to multiple move paths, so we iterate through the @@ -1691,18 +1619,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { self.check_if_full_path_is_moved(location, desired_action, place_span, flow_state); - if let [ - base_proj @ .., - ProjectionElem::Subslice { from, to, from_end: false }, - ] = place_span.0.projection { - let place_ty = Place::ty_from( - place_span.0.base, - base_proj, - self.body(), - self.infcx.tcx, - ); + if let [base_proj @ .., ProjectionElem::Subslice { from, to, from_end: false }] = + place_span.0.projection + { + let place_ty = + Place::ty_from(place_span.0.local, base_proj, self.body(), self.infcx.tcx); if let ty::Array(..) = place_ty.ty.kind { - let array_place = PlaceRef { base: place_span.0.base, projection: base_proj }; + let array_place = PlaceRef { local: place_span.0.local, projection: base_proj }; self.check_if_subslice_element_is_moved( location, desired_action, @@ -1751,11 +1674,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { fn move_path_closest_to( &mut self, place: PlaceRef<'_, 'tcx>, - ) -> Result<(PlaceRef<'cx, 'tcx>, MovePathIndex), NoMovePathFound> { + ) -> (PlaceRef<'cx, 'tcx>, MovePathIndex) { match self.move_data.rev_lookup.find(place) { - LookupResult::Parent(Some(mpi)) - | LookupResult::Exact(mpi) => Ok((self.move_data.move_paths[mpi].place.as_ref(), mpi)), - LookupResult::Parent(None) => Err(NoMovePathFound::ReachedStatic), + LookupResult::Parent(Some(mpi)) | LookupResult::Exact(mpi) => { + (self.move_data.move_paths[mpi].place.as_ref(), mpi) + } + LookupResult::Parent(None) => panic!("should have move path for every Local"), } } @@ -1798,7 +1722,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { self.check_if_full_path_is_moved( location, InitializationRequiringAction::Use, (PlaceRef { - base: &place.base, + local: &place.local, projection: proj_base, }, span), flow_state); // (base initialized; no need to @@ -1816,13 +1740,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // assigning to `P.f` requires `P` itself // be already initialized let tcx = self.infcx.tcx; - let base_ty = Place::ty_from(&place.base, proj_base, self.body(), tcx).ty; + let base_ty = Place::ty_from(&place.local, proj_base, self.body(), tcx).ty; match base_ty.kind { ty::Adt(def, _) if def.has_dtor(tcx) => { self.check_if_path_or_subpath_is_moved( location, InitializationRequiringAction::Assignment, (PlaceRef { - base: &place.base, + local: &place.local, projection: proj_base, }, span), flow_state); @@ -1835,21 +1759,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // is allowed, remove this match arm. ty::Adt(..) | ty::Tuple(..) => { check_parent_of_field(self, location, PlaceRef { - base: &place.base, + local: &place.local, projection: proj_base, }, span, flow_state); - if let PlaceBase::Local(local) = place.base { - // rust-lang/rust#21232, - // #54499, #54986: during - // period where we reject - // partial initialization, do - // not complain about - // unnecessary `mut` on an - // attempt to do a partial - // initialization. - self.used_mut.insert(local); - } + // rust-lang/rust#21232, #54499, #54986: during period where we reject + // partial initialization, do not complain about unnecessary `mut` on + // an attempt to do a partial initialization. + self.used_mut.insert(place.local); } _ => {} @@ -1903,12 +1820,16 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let mut shortest_uninit_seen = None; for prefix in this.prefixes(base, PrefixSet::Shallow) { let mpi = match this.move_path_for_place(prefix) { - Some(mpi) => mpi, None => continue, + Some(mpi) => mpi, + None => continue, }; if maybe_uninits.contains(mpi) { - debug!("check_parent_of_field updating shortest_uninit_seen from {:?} to {:?}", - shortest_uninit_seen, Some((prefix, mpi))); + debug!( + "check_parent_of_field updating shortest_uninit_seen from {:?} to {:?}", + shortest_uninit_seen, + Some((prefix, mpi)) + ); shortest_uninit_seen = Some((prefix, mpi)); } else { debug!("check_parent_of_field {:?} is definitely initialized", (prefix, mpi)); @@ -1923,13 +1844,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // of the union - we should error in that case. let tcx = this.infcx.tcx; if let ty::Adt(def, _) = - Place::ty_from(base.base, base.projection, this.body(), tcx).ty.kind + Place::ty_from(base.local, base.projection, this.body(), tcx).ty.kind { if def.is_union() { if this.move_data.path_map[mpi].iter().any(|moi| { - this.move_data.moves[*moi].source.is_predecessor_of( - location, this.body, - ) + this.move_data.moves[*moi].source.is_predecessor_of(location, this.body) }) { return; } @@ -2009,18 +1928,20 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { | Write(WriteKind::MutableBorrow(BorrowKind::Shallow)) => { if let (Err(_), true) = ( self.is_mutable(place.as_ref(), is_local_mutation_allowed), - self.errors_buffer.is_empty() + self.errors_buffer.is_empty(), ) { // rust-lang/rust#46908: In pure NLL mode this code path should be // unreachable, but we use `delay_span_bug` because we can hit this when // dereferencing a non-Copy raw pointer *and* have `-Ztreat-err-as-bug` // enabled. We don't want to ICE for that case, as other errors will have // been emitted (#52262). - self.infcx.tcx.sess.delay_span_bug(span, &format!( - "Accessing `{:?}` with the kind `{:?}` shouldn't be possible", - place, - kind, - )); + self.infcx.tcx.sess.delay_span_bug( + span, + &format!( + "Accessing `{:?}` with the kind `{:?}` shouldn't be possible", + place, kind, + ), + ); } return false; } @@ -2042,21 +1963,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // partial initialization, do not complain about mutability // errors except for actual mutation (as opposed to an attempt // to do a partial initialization). - let previously_initialized = if let PlaceBase::Local(local) = place.base { - self.is_local_ever_initialized(local, flow_state).is_some() - } else { - true - }; + let previously_initialized = + self.is_local_ever_initialized(place.local, flow_state).is_some(); // at this point, we have set up the error reporting state. if previously_initialized { - self.report_mutability_error( - place, - span, - the_place_err, - error_access, - location, - ); + self.report_mutability_error(place, span, the_place_err, error_access, location); true } else { false @@ -2081,42 +1993,33 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { /// Adds the place into the used mutable variables set fn add_used_mut<'d>(&mut self, root_place: RootPlace<'d, 'tcx>, flow_state: &Flows<'cx, 'tcx>) { match root_place { - RootPlace { - place_base: PlaceBase::Local(local), - place_projection: [], - is_local_mutation_allowed, - } => { + RootPlace { place_local: local, place_projection: [], is_local_mutation_allowed } => { // If the local may have been initialized, and it is now currently being // mutated, then it is justified to be annotated with the `mut` // keyword, since the mutation may be a possible reassignment. - if is_local_mutation_allowed != LocalMutationIsAllowed::Yes && - self.is_local_ever_initialized(*local, flow_state).is_some() + if is_local_mutation_allowed != LocalMutationIsAllowed::Yes + && self.is_local_ever_initialized(*local, flow_state).is_some() { self.used_mut.insert(*local); } } RootPlace { - place_base: _, + place_local: _, place_projection: _, is_local_mutation_allowed: LocalMutationIsAllowed::Yes, } => {} RootPlace { - place_base, + place_local, place_projection: place_projection @ [.., _], is_local_mutation_allowed: _, } => { if let Some(field) = self.is_upvar_field_projection(PlaceRef { - base: &place_base, - projection: &place_projection, + local: place_local, + projection: place_projection, }) { self.used_mut_upvars.push(field); } } - RootPlace { - place_base: PlaceBase::Static(..), - place_projection: [], - is_local_mutation_allowed: _, - } => {} } } @@ -2128,120 +2031,76 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { is_local_mutation_allowed: LocalMutationIsAllowed, ) -> Result, PlaceRef<'d, 'tcx>> { match place { - PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } => { + PlaceRef { local, projection: [] } => { let local = &self.body.local_decls[*local]; match local.mutability { Mutability::Not => match is_local_mutation_allowed { LocalMutationIsAllowed::Yes => Ok(RootPlace { - place_base: place.base, + place_local: place.local, place_projection: place.projection, is_local_mutation_allowed: LocalMutationIsAllowed::Yes, }), LocalMutationIsAllowed::ExceptUpvars => Ok(RootPlace { - place_base: place.base, + place_local: place.local, place_projection: place.projection, is_local_mutation_allowed: LocalMutationIsAllowed::ExceptUpvars, }), LocalMutationIsAllowed::No => Err(place), }, Mutability::Mut => Ok(RootPlace { - place_base: place.base, + place_local: place.local, place_projection: place.projection, is_local_mutation_allowed, }), } } - // The rules for promotion are made by `qualify_consts`, there wouldn't even be a - // `Place::Promoted` if the promotion weren't 100% legal. So we just forward this - PlaceRef { - base: PlaceBase::Static(box Static { - kind: StaticKind::Promoted(..), - .. - }), - projection: [], - } => - Ok(RootPlace { - place_base: place.base, - place_projection: place.projection, - is_local_mutation_allowed, - }), - PlaceRef { - base: PlaceBase::Static(box Static { - kind: StaticKind::Static, - def_id, - .. - }), - projection: [], - } => { - if !self.infcx.tcx.is_mutable_static(*def_id) { - Err(place) - } else { - Ok(RootPlace { - place_base: place.base, - place_projection: place.projection, - is_local_mutation_allowed, - }) - } - } - PlaceRef { - base: _, - projection: [proj_base @ .., elem], - } => { + PlaceRef { local: _, projection: [proj_base @ .., elem] } => { match elem { ProjectionElem::Deref => { let base_ty = - Place::ty_from(place.base, proj_base, self.body(), self.infcx.tcx).ty; + Place::ty_from(place.local, proj_base, self.body(), self.infcx.tcx).ty; // Check the kind of deref to decide match base_ty.kind { ty::Ref(_, _, mutbl) => { match mutbl { // Shared borrowed data is never mutable - hir::Mutability::Immutable => Err(place), + hir::Mutability::Not => Err(place), // Mutably borrowed data is mutable, but only if we have a // unique path to the `&mut` - hir::Mutability::Mutable => { + hir::Mutability::Mut => { let mode = match self.is_upvar_field_projection(place) { - Some(field) - if self.upvars[field.index()].by_ref => - { + Some(field) if self.upvars[field.index()].by_ref => { is_local_mutation_allowed } _ => LocalMutationIsAllowed::Yes, }; - self.is_mutable(PlaceRef { - base: place.base, - projection: proj_base, - }, mode) + self.is_mutable( + PlaceRef { local: place.local, projection: proj_base }, + mode, + ) } } } ty::RawPtr(tnm) => { match tnm.mutbl { // `*const` raw pointers are not mutable - hir::Mutability::Immutable => Err(place), + hir::Mutability::Not => Err(place), // `*mut` raw pointers are always mutable, regardless of // context. The users have to check by themselves. - hir::Mutability::Mutable => { - Ok(RootPlace { - place_base: place.base, - place_projection: place.projection, - is_local_mutation_allowed, - }) - } + hir::Mutability::Mut => Ok(RootPlace { + place_local: place.local, + place_projection: place.projection, + is_local_mutation_allowed, + }), } } // `Box` owns its content, so mutable if its location is mutable - _ if base_ty.is_box() => { - self.is_mutable(PlaceRef { - base: place.base, - projection: proj_base, - }, is_local_mutation_allowed) - } + _ if base_ty.is_box() => self.is_mutable( + PlaceRef { local: place.local, projection: proj_base }, + is_local_mutation_allowed, + ), // Deref should only be for reference, pointers or boxes _ => bug!("Deref of unexpected type: {:?}", base_ty), } @@ -2258,7 +2117,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let upvar = &self.upvars[field.index()]; debug!( "upvar.mutability={:?} local_mutation_is_allowed={:?} \ - place={:?}", + place={:?}", upvar, is_local_mutation_allowed, place ); match (upvar.mutability, is_local_mutation_allowed) { @@ -2294,22 +2153,22 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // }); // } // ``` - let _ = self.is_mutable(PlaceRef { - base: place.base, - projection: proj_base, - }, is_local_mutation_allowed)?; + let _ = self.is_mutable( + PlaceRef { local: place.local, projection: proj_base }, + is_local_mutation_allowed, + )?; Ok(RootPlace { - place_base: place.base, + place_local: place.local, place_projection: place.projection, is_local_mutation_allowed, }) } } } else { - self.is_mutable(PlaceRef { - base: place.base, - projection: proj_base, - }, is_local_mutation_allowed) + self.is_mutable( + PlaceRef { local: place.local, projection: proj_base }, + is_local_mutation_allowed, + ) } } } @@ -2333,10 +2192,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { match place_projection { [base @ .., ProjectionElem::Field(field, _ty)] => { let tcx = self.infcx.tcx; - let base_ty = Place::ty_from(place_ref.base, base, self.body(), tcx).ty; + let base_ty = Place::ty_from(place_ref.local, base, self.body(), tcx).ty; - if (base_ty.is_closure() || base_ty.is_generator()) && - (!by_ref || self.upvars[field.index()].by_ref) { + if (base_ty.is_closure() || base_ty.is_generator()) + && (!by_ref || self.upvars[field.index()].by_ref) + { Some(*field) } else { None @@ -2348,11 +2208,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } } -#[derive(Copy, Clone, PartialEq, Eq, Debug)] -enum NoMovePathFound { - ReachedStatic, -} - /// The degree of overlap between 2 places for borrow-checking. enum Overlap { /// The places might partially overlap - in this case, we give diff --git a/src/librustc_mir/borrow_check/nll.rs b/src/librustc_mir/borrow_check/nll.rs index 6d28a8caa9..73718d5834 100644 --- a/src/librustc_mir/borrow_check/nll.rs +++ b/src/librustc_mir/borrow_check/nll.rs @@ -1,47 +1,58 @@ //! The entry point of the NLL borrow checker. -use rustc::hir::def_id::DefId; use rustc::infer::InferCtxt; -use rustc::mir::{ClosureOutlivesSubject, ClosureRegionRequirements, - Local, Location, Body, BodyAndCache, LocalKind, BasicBlock, - Promoted, ReadOnlyBodyAndCache}; +use rustc::mir::{ + BasicBlock, Body, BodyAndCache, ClosureOutlivesSubject, ClosureRegionRequirements, LocalKind, + Location, Promoted, ReadOnlyBodyAndCache, +}; use rustc::ty::{self, RegionKind, RegionVid}; -use rustc_index::vec::IndexVec; use rustc_errors::Diagnostic; -use syntax_pos::symbol::Symbol; -use std::fmt::Debug; +use rustc_hir::def_id::DefId; +use rustc_index::vec::IndexVec; +use rustc_span::symbol::sym; use std::env; +use std::fmt::Debug; use std::io; use std::path::PathBuf; use std::rc::Rc; use std::str::FromStr; -use syntax::symbol::sym; use self::mir_util::PassWhere; use polonius_engine::{Algorithm, Output}; -use crate::util as mir_util; -use crate::util::pretty; -use crate::dataflow::move_paths::{InitLocation, MoveData, InitKind}; +use crate::dataflow::move_paths::{InitKind, InitLocation, MoveData}; use crate::dataflow::FlowAtLocation; use crate::dataflow::MaybeInitializedPlaces; use crate::transform::MirSource; +use crate::util as mir_util; +use crate::util::pretty; use crate::borrow_check::{ borrow_set::BorrowSet, - location::LocationTable, + constraint_generation, + diagnostics::RegionErrors, facts::{AllFacts, AllFactsExt, RustcFacts}, - region_infer::{RegionInferenceContext, values::RegionValueElements}, + invalidation, + location::LocationTable, + region_infer::{values::RegionValueElements, RegionInferenceContext}, + renumber, + type_check::{self, MirTypeckRegionConstraints, MirTypeckResults}, universal_regions::UniversalRegions, - type_check::{self, MirTypeckResults, MirTypeckRegionConstraints}, - Upvar, renumber, constraint_generation, invalidation, }; crate type PoloniusOutput = Output; -/// Rewrites the regions in the MIR to use NLL variables, also -/// scraping out the set of universal regions (e.g., region parameters) -/// declared on the function. That set will need to be given to +/// The output of `nll::compute_regions`. This includes the computed `RegionInferenceContext`, any +/// closure requirements to propagate, and any generated errors. +crate struct NllOutput<'tcx> { + pub regioncx: RegionInferenceContext<'tcx>, + pub polonius_output: Option>, + pub opt_closure_req: Option>, + pub nll_errors: RegionErrors<'tcx>, +} + +/// Rewrites the regions in the MIR to use NLL variables, also scraping out the set of universal +/// regions (e.g., region parameters) declared on the function. That set will need to be given to /// `compute_regions`. pub(in crate::borrow_check) fn replace_regions_in_mir<'cx, 'tcx>( infcx: &InferCtxt<'cx, 'tcx>, @@ -64,35 +75,26 @@ pub(in crate::borrow_check) fn replace_regions_in_mir<'cx, 'tcx>( universal_regions } - // This function populates an AllFacts instance with base facts related to // MovePaths and needed for the move analysis. fn populate_polonius_move_facts( all_facts: &mut AllFacts, move_data: &MoveData<'_>, location_table: &LocationTable, - body: &Body<'_>) { + body: &Body<'_>, +) { all_facts .path_belongs_to_var - .extend( - move_data - .rev_lookup - .iter_locals_enumerated() - .map(|(v, &m)| (m, v))); + .extend(move_data.rev_lookup.iter_locals_enumerated().map(|(v, &m)| (m, v))); for (child, move_path) in move_data.move_paths.iter_enumerated() { all_facts .child - .extend( - move_path - .parents(&move_data.move_paths) - .iter() - .map(|&parent| (child, parent))); + .extend(move_path.parents(&move_data.move_paths).iter().map(|&parent| (child, parent))); } // initialized_at for init in move_data.inits.iter() { - match init.location { InitLocation::Statement(location) => { let block_data = &body[location.block]; @@ -109,38 +111,31 @@ fn populate_polonius_move_facts( // The initialization happened in (or rather, when arriving at) // the successors, but not in the unwind block. - let first_statement = Location { block: successor, statement_index: 0}; + let first_statement = Location { block: successor, statement_index: 0 }; all_facts .initialized_at .push((init.path, location_table.start_index(first_statement))); } - } else { // In all other cases, the initialization just happens at the // midpoint, like any other effect. all_facts.initialized_at.push((init.path, location_table.mid_index(location))); } - }, + } // Arguments are initialized on function entry InitLocation::Argument(local) => { assert!(body.local_kind(local) == LocalKind::Arg); - let fn_entry = Location {block: BasicBlock::from_u32(0u32), statement_index: 0 }; + let fn_entry = Location { block: BasicBlock::from_u32(0u32), statement_index: 0 }; all_facts.initialized_at.push((init.path, location_table.start_index(fn_entry))); - } } } - // moved_out_at // deinitialisation is assumed to always happen! all_facts .moved_out_at - .extend( - move_data - .moves - .iter() - .map(|mo| (mo.path, location_table.mid_index(mo.source)))); + .extend(move_data.moves.iter().map(|mo| (mo.path, location_table.mid_index(mo.source)))); } /// Computes the (non-lexical) regions from the input MIR. @@ -152,31 +147,20 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>( universal_regions: UniversalRegions<'tcx>, body: ReadOnlyBodyAndCache<'_, 'tcx>, promoted: &IndexVec>, - local_names: &IndexVec>, - upvars: &[Upvar], location_table: &LocationTable, param_env: ty::ParamEnv<'tcx>, flow_inits: &mut FlowAtLocation<'tcx, MaybeInitializedPlaces<'cx, 'tcx>>, move_data: &MoveData<'tcx>, borrow_set: &BorrowSet<'tcx>, - errors_buffer: &mut Vec, -) -> ( - RegionInferenceContext<'tcx>, - Option>, - Option>, -) { +) -> NllOutput<'tcx> { let mut all_facts = AllFacts::enabled(infcx.tcx).then_some(AllFacts::default()); let universal_regions = Rc::new(universal_regions); - let elements - = &Rc::new(RegionValueElements::new(&body)); + let elements = &Rc::new(RegionValueElements::new(&body)); // Run the MIR type-checker. - let MirTypeckResults { - constraints, - universal_region_relations, - } = type_check::type_check( + let MirTypeckResults { constraints, universal_region_relations } = type_check::type_check( infcx, param_env, body, @@ -193,9 +177,7 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>( if let Some(all_facts) = &mut all_facts { let _prof_timer = infcx.tcx.prof.generic_activity("polonius_fact_generation"); - all_facts - .universal_region - .extend(universal_regions.universal_regions()); + all_facts.universal_region.extend(universal_regions.universal_regions()); populate_polonius_move_facts(all_facts, move_data, location_table, &body); // Emit universal regions facts, and their relations, for Polonius. @@ -249,7 +231,6 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>( constraint_generation::generate_constraints( infcx, - param_env, &mut liveness_constraints, &mut all_facts, location_table, @@ -271,14 +252,7 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>( ); // Generate various additional constraints. - invalidation::generate_invalidates( - infcx.tcx, - param_env, - &mut all_facts, - location_table, - body, - borrow_set, - ); + invalidation::generate_invalidates(infcx.tcx, &mut all_facts, location_table, body, borrow_set); // Dump facts if requested. let polonius_output = all_facts.and_then(|all_facts| { @@ -290,56 +264,30 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>( } if infcx.tcx.sess.opts.debugging_opts.polonius { - let algorithm = env::var("POLONIUS_ALGORITHM") - .unwrap_or_else(|_| String::from("Naive")); + let algorithm = + env::var("POLONIUS_ALGORITHM").unwrap_or_else(|_| String::from("Naive")); let algorithm = Algorithm::from_str(&algorithm).unwrap(); debug!("compute_regions: using polonius algorithm {:?}", algorithm); let _prof_timer = infcx.tcx.prof.generic_activity("polonius_analysis"); - Some(Rc::new(Output::compute( - &all_facts, - algorithm, - false, - ))) + Some(Rc::new(Output::compute(&all_facts, algorithm, false))) } else { None } }); // Solve the region constraints. - let closure_region_requirements = regioncx.solve( - infcx, - &body, - local_names, - upvars, - def_id, - errors_buffer, - polonius_output.clone(), - ); - - // Dump MIR results into a file, if that is enabled. This let us - // write unit-tests, as well as helping with debugging. - dump_mir_results( - infcx, - MirSource::item(def_id), - &body, - ®ioncx, - &closure_region_requirements, - ); - - // We also have a `#[rustc_nll]` annotation that causes us to dump - // information - dump_annotation( - infcx, - &body, - def_id, - ®ioncx, - &closure_region_requirements, - errors_buffer); - - (regioncx, polonius_output, closure_region_requirements) + let (closure_region_requirements, nll_errors) = + regioncx.solve(infcx, &body, def_id, polonius_output.clone()); + + NllOutput { + regioncx, + polonius_output, + opt_closure_req: closure_region_requirements, + nll_errors, + } } -fn dump_mir_results<'a, 'tcx>( +pub(super) fn dump_mir_results<'a, 'tcx>( infcx: &InferCtxt<'a, 'tcx>, source: MirSource<'tcx>, body: &Body<'tcx>, @@ -350,40 +298,30 @@ fn dump_mir_results<'a, 'tcx>( return; } - mir_util::dump_mir( - infcx.tcx, - None, - "nll", - &0, - source, - body, - |pass_where, out| { - match pass_where { - // Before the CFG, dump out the values for each region variable. - PassWhere::BeforeCFG => { - regioncx.dump_mir(out)?; + mir_util::dump_mir(infcx.tcx, None, "nll", &0, source, body, |pass_where, out| { + match pass_where { + // Before the CFG, dump out the values for each region variable. + PassWhere::BeforeCFG => { + regioncx.dump_mir(out)?; + writeln!(out, "|")?; + + if let Some(closure_region_requirements) = closure_region_requirements { + writeln!(out, "| Free Region Constraints")?; + for_each_region_constraint(closure_region_requirements, &mut |msg| { + writeln!(out, "| {}", msg) + })?; writeln!(out, "|")?; - - if let Some(closure_region_requirements) = closure_region_requirements { - writeln!(out, "| Free Region Constraints")?; - for_each_region_constraint(closure_region_requirements, &mut |msg| { - writeln!(out, "| {}", msg) - })?; - writeln!(out, "|")?; - } } + } - PassWhere::BeforeLocation(_) => { - } + PassWhere::BeforeLocation(_) => {} - PassWhere::AfterTerminator(_) => { - } + PassWhere::AfterTerminator(_) => {} - PassWhere::BeforeBlock(_) | PassWhere::AfterLocation(_) | PassWhere::AfterCFG => {} - } - Ok(()) - }, - ); + PassWhere::BeforeBlock(_) | PassWhere::AfterLocation(_) | PassWhere::AfterCFG => {} + } + Ok(()) + }); // Also dump the inference graph constraints as a graphviz file. let _: io::Result<()> = try { @@ -400,7 +338,7 @@ fn dump_mir_results<'a, 'tcx>( }; } -fn dump_annotation<'a, 'tcx>( +pub(super) fn dump_annotation<'a, 'tcx>( infcx: &InferCtxt<'a, 'tcx>, body: &Body<'tcx>, mir_def_id: DefId, @@ -422,10 +360,7 @@ fn dump_annotation<'a, 'tcx>( // better. if let Some(closure_region_requirements) = closure_region_requirements { - let mut err = tcx - .sess - .diagnostic() - .span_note_diag(body.span, "External requirements"); + let mut err = tcx.sess.diagnostic().span_note_diag(body.span, "external requirements"); regioncx.annotate(tcx, &mut err); @@ -439,14 +374,12 @@ fn dump_annotation<'a, 'tcx>( for_each_region_constraint(closure_region_requirements, &mut |msg| { err.note(msg); Ok(()) - }).unwrap(); + }) + .unwrap(); err.buffer(errors_buffer); } else { - let mut err = tcx - .sess - .diagnostic() - .span_note_diag(body.span, "No external requirements"); + let mut err = tcx.sess.diagnostic().span_note_diag(body.span, "no external requirements"); regioncx.annotate(tcx, &mut err); err.buffer(errors_buffer); @@ -462,10 +395,7 @@ fn for_each_region_constraint( ClosureOutlivesSubject::Region(subject) => subject, ClosureOutlivesSubject::Ty(ty) => ty, }; - with_msg(&format!( - "where {:?}: {:?}", - subject, req.outlived_free_region, - ))?; + with_msg(&format!("where {:?}: {:?}", subject, req.outlived_free_region,))?; } Ok(()) } @@ -481,11 +411,7 @@ pub trait ToRegionVid { impl<'tcx> ToRegionVid for &'tcx RegionKind { fn to_region_vid(self) -> RegionVid { - if let ty::ReVar(vid) = self { - *vid - } else { - bug!("region is not an ReVar: {:?}", self) - } + if let ty::ReVar(vid) = self { *vid } else { bug!("region is not an ReVar: {:?}", self) } } } diff --git a/src/librustc_mir/borrow_check/path_utils.rs b/src/librustc_mir/borrow_check/path_utils.rs index bac0809081..deec6f386f 100644 --- a/src/librustc_mir/borrow_check/path_utils.rs +++ b/src/librustc_mir/borrow_check/path_utils.rs @@ -1,10 +1,10 @@ -use crate::borrow_check::borrow_set::{BorrowSet, BorrowData, TwoPhaseActivation}; +use crate::borrow_check::borrow_set::{BorrowData, BorrowSet, TwoPhaseActivation}; use crate::borrow_check::places_conflict; use crate::borrow_check::AccessDepth; use crate::dataflow::indexes::BorrowIndex; -use rustc::mir::{BasicBlock, Location, Body, Place, PlaceBase}; use rustc::mir::BorrowKind; -use rustc::ty::{self, TyCtxt}; +use rustc::mir::{BasicBlock, Body, Location, Place}; +use rustc::ty::TyCtxt; use rustc_data_structures::graph::dominators::Dominators; /// Returns `true` if the borrow represented by `kind` is @@ -25,7 +25,6 @@ pub(super) enum Control { pub(super) fn each_borrow_involving_path<'tcx, F, I, S>( s: &mut S, tcx: TyCtxt<'tcx>, - param_env: ty::ParamEnv<'tcx>, body: &Body<'tcx>, _location: Location, access_place: (AccessDepth, &Place<'tcx>), @@ -48,7 +47,6 @@ pub(super) fn each_borrow_involving_path<'tcx, F, I, S>( if places_conflict::borrow_conflicts_with_place( tcx, - param_env, body, &borrowed.borrowed_place, borrowed.kind, @@ -71,7 +69,7 @@ pub(super) fn each_borrow_involving_path<'tcx, F, I, S>( pub(super) fn is_active<'tcx>( dominators: &Dominators, borrow_data: &BorrowData<'tcx>, - location: Location + location: Location, ) -> bool { debug!("is_active(borrow_data={:?}, location={:?})", borrow_data, location); @@ -131,13 +129,9 @@ pub(super) fn is_active<'tcx>( } /// Determines if a given borrow is borrowing local data -/// This is called for all Yield statements on movable generators +/// This is called for all Yield expressions on movable generators pub(super) fn borrow_of_local_data(place: &Place<'_>) -> bool { - match place.base { - PlaceBase::Static(_) => false, - - // Reborrow of already borrowed data is ignored - // Any errors will be caught on the initial borrow - PlaceBase::Local(_) => !place.is_indirect(), - } + // Reborrow of already borrowed data is ignored + // Any errors will be caught on the initial borrow + !place.is_indirect() } diff --git a/src/librustc_mir/borrow_check/place_ext.rs b/src/librustc_mir/borrow_check/place_ext.rs index c62de2af55..ac02da2661 100644 --- a/src/librustc_mir/borrow_check/place_ext.rs +++ b/src/librustc_mir/borrow_check/place_ext.rs @@ -1,8 +1,8 @@ -use rustc::hir; +use crate::borrow_check::borrow_set::LocalsStateAtExit; use rustc::mir::ProjectionElem; -use rustc::mir::{Body, Place, PlaceBase, Mutability}; +use rustc::mir::{Body, Mutability, Place}; use rustc::ty::{self, TyCtxt}; -use crate::borrow_check::borrow_set::LocalsStateAtExit; +use rustc_hir as hir; /// Extension methods for the `Place` type. crate trait PlaceExt<'tcx> { @@ -25,48 +25,40 @@ impl<'tcx> PlaceExt<'tcx> for Place<'tcx> { body: &Body<'tcx>, locals_state_at_exit: &LocalsStateAtExit, ) -> bool { - let local = match self.base { - // If a local variable is immutable, then we only need to track borrows to guard - // against two kinds of errors: - // * The variable being dropped while still borrowed (e.g., because the fn returns - // a reference to a local variable) - // * The variable being moved while still borrowed - // - // In particular, the variable cannot be mutated -- the "access checks" will fail -- - // so we don't have to worry about mutation while borrowed. - PlaceBase::Local(local) => { - match locals_state_at_exit { - LocalsStateAtExit::AllAreInvalidated => local, - LocalsStateAtExit::SomeAreInvalidated { has_storage_dead_or_moved } => { - let ignore = !has_storage_dead_or_moved.contains(local) && - body.local_decls[local].mutability == Mutability::Not; - debug!("ignore_borrow: local {:?} => {:?}", local, ignore); - if ignore { - return true; - } else { - local - } - } - } + // If a local variable is immutable, then we only need to track borrows to guard + // against two kinds of errors: + // * The variable being dropped while still borrowed (e.g., because the fn returns + // a reference to a local variable) + // * The variable being moved while still borrowed + // + // In particular, the variable cannot be mutated -- the "access checks" will fail -- + // so we don't have to worry about mutation while borrowed. + if let LocalsStateAtExit::SomeAreInvalidated { has_storage_dead_or_moved } = + locals_state_at_exit + { + let ignore = !has_storage_dead_or_moved.contains(self.local) + && body.local_decls[self.local].mutability == Mutability::Not; + debug!("ignore_borrow: local {:?} => {:?}", self.local, ignore); + if ignore { + return true; } - PlaceBase::Static(_) => return true, - }; + } for (i, elem) in self.projection.iter().enumerate() { let proj_base = &self.projection[..i]; if *elem == ProjectionElem::Deref { - let ty = Place::ty_from(&self.base, proj_base, body, tcx).ty; + let ty = Place::ty_from(&self.local, proj_base, body, tcx).ty; match ty.kind { - ty::Ref(_, _, hir::Mutability::Immutable) if i == 0 => { + ty::Ref(_, _, hir::Mutability::Not) if i == 0 => { // For references to thread-local statics, we do need // to track the borrow. - if body.local_decls[local].is_ref_to_thread_local() { + if body.local_decls[self.local].is_ref_to_thread_local() { continue; } return true; } - ty::RawPtr(..) | ty::Ref(_, _, hir::Mutability::Immutable) => { + ty::RawPtr(..) | ty::Ref(_, _, hir::Mutability::Not) => { // For both derefs of raw pointers and `&T` // references, the original path is `Copy` and // therefore not significant. In particular, diff --git a/src/librustc_mir/borrow_check/places_conflict.rs b/src/librustc_mir/borrow_check/places_conflict.rs index 9245064f87..b95d1af11a 100644 --- a/src/librustc_mir/borrow_check/places_conflict.rs +++ b/src/librustc_mir/borrow_check/places_conflict.rs @@ -1,11 +1,9 @@ use crate::borrow_check::ArtificialField; use crate::borrow_check::Overlap; -use crate::borrow_check::{Deep, Shallow, AccessDepth}; -use rustc::hir; -use rustc::mir::{ - Body, BorrowKind, Place, PlaceBase, PlaceElem, PlaceRef, ProjectionElem, StaticKind, -}; +use crate::borrow_check::{AccessDepth, Deep, Shallow}; +use rustc::mir::{Body, BorrowKind, Local, Place, PlaceElem, PlaceRef, ProjectionElem}; use rustc::ty::{self, TyCtxt}; +use rustc_hir as hir; use std::cmp::max; /// When checking if a place conflicts with another place, this enum is used to influence decisions @@ -25,7 +23,6 @@ crate enum PlaceConflictBias { /// dataflow). crate fn places_conflict<'tcx>( tcx: TyCtxt<'tcx>, - param_env: ty::ParamEnv<'tcx>, body: &Body<'tcx>, borrow_place: &Place<'tcx>, access_place: &Place<'tcx>, @@ -33,7 +30,6 @@ crate fn places_conflict<'tcx>( ) -> bool { borrow_conflicts_with_place( tcx, - param_env, body, borrow_place, BorrowKind::Mut { allow_two_phase_borrow: true }, @@ -49,7 +45,6 @@ crate fn places_conflict<'tcx>( /// order to make the conservative choice and preserve soundness. pub(super) fn borrow_conflicts_with_place<'tcx>( tcx: TyCtxt<'tcx>, - param_env: ty::ParamEnv<'tcx>, body: &Body<'tcx>, borrow_place: &Place<'tcx>, borrow_kind: BorrowKind, @@ -70,21 +65,11 @@ pub(super) fn borrow_conflicts_with_place<'tcx>( } } - place_components_conflict( - tcx, - param_env, - body, - borrow_place, - borrow_kind, - access_place, - access, - bias, - ) + place_components_conflict(tcx, body, borrow_place, borrow_kind, access_place, access, bias) } fn place_components_conflict<'tcx>( tcx: TyCtxt<'tcx>, - param_env: ty::ParamEnv<'tcx>, body: &Body<'tcx>, borrow_place: &Place<'tcx>, borrow_kind: BorrowKind, @@ -134,10 +119,10 @@ fn place_components_conflict<'tcx>( // and either equal or disjoint. // - If we did run out of access, the borrow can access a part of it. - let borrow_base = &borrow_place.base; - let access_base = access_place.base; + let borrow_local = &borrow_place.local; + let access_local = access_place.local; - match place_base_conflict(tcx, param_env, borrow_base, access_base) { + match place_base_conflict(borrow_local, access_local) { Overlap::Arbitrary => { bug!("Two base can't return Arbitrary"); } @@ -176,7 +161,7 @@ fn place_components_conflict<'tcx>( match place_projection_conflict( tcx, body, - borrow_base, + borrow_local, borrow_proj_base, borrow_c, access_c, @@ -223,7 +208,7 @@ fn place_components_conflict<'tcx>( // access cares about. let proj_base = &borrow_place.projection[..access_place.projection.len() + i]; - let base_ty = Place::ty_from(borrow_base, proj_base, body, tcx).ty; + let base_ty = Place::ty_from(borrow_local, proj_base, body, tcx).ty; match (elem, &base_ty.kind, access) { (_, _, Shallow(Some(ArtificialField::ArrayLength))) @@ -246,13 +231,11 @@ fn place_components_conflict<'tcx>( debug!("borrow_conflicts_with_place: shallow access behind ptr"); return false; } - (ProjectionElem::Deref, ty::Ref(_, _, hir::Mutability::Immutable), _) => { + (ProjectionElem::Deref, ty::Ref(_, _, hir::Mutability::Not), _) => { // Shouldn't be tracked bug!("Tracking borrow behind shared reference."); } - (ProjectionElem::Deref, - ty::Ref(_, _, hir::Mutability::Mutable), - AccessDepth::Drop) => { + (ProjectionElem::Deref, ty::Ref(_, _, hir::Mutability::Mut), AccessDepth::Drop) => { // Values behind a mutable reference are not access either by dropping a // value, or by StorageDead debug!("borrow_conflicts_with_place: drop access behind ptr"); @@ -310,68 +293,15 @@ fn place_components_conflict<'tcx>( // Given that the bases of `elem1` and `elem2` are always either equal // or disjoint (and have the same type!), return the overlap situation // between `elem1` and `elem2`. -fn place_base_conflict<'tcx>( - tcx: TyCtxt<'tcx>, - param_env: ty::ParamEnv<'tcx>, - elem1: &PlaceBase<'tcx>, - elem2: &PlaceBase<'tcx>, -) -> Overlap { - match (elem1, elem2) { - (PlaceBase::Local(l1), PlaceBase::Local(l2)) => { - if l1 == l2 { - // the same local - base case, equal - debug!("place_element_conflict: DISJOINT-OR-EQ-LOCAL"); - Overlap::EqualOrDisjoint - } else { - // different locals - base case, disjoint - debug!("place_element_conflict: DISJOINT-LOCAL"); - Overlap::Disjoint - } - } - (PlaceBase::Static(s1), PlaceBase::Static(s2)) => { - match (&s1.kind, &s2.kind) { - (StaticKind::Static, StaticKind::Static) => { - if s1.def_id != s2.def_id { - debug!("place_element_conflict: DISJOINT-STATIC"); - Overlap::Disjoint - } else if tcx.is_mutable_static(s1.def_id) { - // We ignore mutable statics - they can only be unsafe code. - debug!("place_element_conflict: IGNORE-STATIC-MUT"); - Overlap::Disjoint - } else { - debug!("place_element_conflict: DISJOINT-OR-EQ-STATIC"); - Overlap::EqualOrDisjoint - } - }, - (StaticKind::Promoted(promoted_1, _), StaticKind::Promoted(promoted_2, _)) => { - if promoted_1 == promoted_2 { - if let ty::Array(_, len) = s1.ty.kind { - if let Some(0) = len.try_eval_usize(tcx, param_env) { - // Ignore conflicts with promoted [T; 0]. - debug!("place_element_conflict: IGNORE-LEN-0-PROMOTED"); - return Overlap::Disjoint; - } - } - // the same promoted - base case, equal - debug!("place_element_conflict: DISJOINT-OR-EQ-PROMOTED"); - Overlap::EqualOrDisjoint - } else { - // different promoteds - base case, disjoint - debug!("place_element_conflict: DISJOINT-PROMOTED"); - Overlap::Disjoint - } - }, - (_, _) => { - debug!("place_element_conflict: DISJOINT-STATIC-PROMOTED"); - Overlap::Disjoint - } - } - } - (PlaceBase::Local(_), PlaceBase::Static(_)) | - (PlaceBase::Static(_), PlaceBase::Local(_)) => { - debug!("place_element_conflict: DISJOINT-STATIC-LOCAL-PROMOTED"); - Overlap::Disjoint - } +fn place_base_conflict(l1: &Local, l2: &Local) -> Overlap { + if l1 == l2 { + // the same local - base case, equal + debug!("place_element_conflict: DISJOINT-OR-EQ-LOCAL"); + Overlap::EqualOrDisjoint + } else { + // different locals - base case, disjoint + debug!("place_element_conflict: DISJOINT-LOCAL"); + Overlap::Disjoint } } @@ -381,7 +311,7 @@ fn place_base_conflict<'tcx>( fn place_projection_conflict<'tcx>( tcx: TyCtxt<'tcx>, body: &Body<'tcx>, - pi1_base: &PlaceBase<'tcx>, + pi1_local: &Local, pi1_proj_base: &[PlaceElem<'tcx>], pi1_elem: &PlaceElem<'tcx>, pi2_elem: &PlaceElem<'tcx>, @@ -399,7 +329,7 @@ fn place_projection_conflict<'tcx>( debug!("place_element_conflict: DISJOINT-OR-EQ-FIELD"); Overlap::EqualOrDisjoint } else { - let ty = Place::ty_from(pi1_base, pi1_proj_base, body, tcx).ty; + let ty = Place::ty_from(pi1_local, pi1_proj_base, body, tcx).ty; match ty.kind { ty::Adt(def, _) if def.is_union() => { // Different fields of a union, we are basically stuck. @@ -468,11 +398,14 @@ fn place_projection_conflict<'tcx>( } } } - (ProjectionElem::ConstantIndex { offset: o1, min_length: _, from_end: false }, - ProjectionElem::ConstantIndex { offset: o2, min_length: _, from_end: false }) - | (ProjectionElem::ConstantIndex { offset: o1, min_length: _, from_end: true }, - ProjectionElem::ConstantIndex { - offset: o2, min_length: _, from_end: true }) => { + ( + ProjectionElem::ConstantIndex { offset: o1, min_length: _, from_end: false }, + ProjectionElem::ConstantIndex { offset: o2, min_length: _, from_end: false }, + ) + | ( + ProjectionElem::ConstantIndex { offset: o1, min_length: _, from_end: true }, + ProjectionElem::ConstantIndex { offset: o2, min_length: _, from_end: true }, + ) => { if o1 == o2 { debug!("place_element_conflict: DISJOINT-OR-EQ-ARRAY-CONSTANT-INDEX"); Overlap::EqualOrDisjoint @@ -481,14 +414,30 @@ fn place_projection_conflict<'tcx>( Overlap::Disjoint } } - (ProjectionElem::ConstantIndex { - offset: offset_from_begin, min_length: min_length1, from_end: false }, + ( ProjectionElem::ConstantIndex { - offset: offset_from_end, min_length: min_length2, from_end: true }) - | (ProjectionElem::ConstantIndex { - offset: offset_from_end, min_length: min_length1, from_end: true }, - ProjectionElem::ConstantIndex { - offset: offset_from_begin, min_length: min_length2, from_end: false }) => { + offset: offset_from_begin, + min_length: min_length1, + from_end: false, + }, + ProjectionElem::ConstantIndex { + offset: offset_from_end, + min_length: min_length2, + from_end: true, + }, + ) + | ( + ProjectionElem::ConstantIndex { + offset: offset_from_end, + min_length: min_length1, + from_end: true, + }, + ProjectionElem::ConstantIndex { + offset: offset_from_begin, + min_length: min_length2, + from_end: false, + }, + ) => { // both patterns matched so it must be at least the greater of the two let min_length = max(min_length1, min_length2); // `offset_from_end` can be in range `[1..min_length]`, 1 indicates the last @@ -505,11 +454,11 @@ fn place_projection_conflict<'tcx>( } ( ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false }, - ProjectionElem::Subslice { from, to, from_end: false } + ProjectionElem::Subslice { from, to, from_end: false }, ) | ( ProjectionElem::Subslice { from, to, from_end: false }, - ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false } + ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false }, ) => { if (from..to).contains(&offset) { debug!("place_element_conflict: DISJOINT-OR-EQ-ARRAY-CONSTANT-INDEX-SUBSLICE"); @@ -519,26 +468,35 @@ fn place_projection_conflict<'tcx>( Overlap::Disjoint } } - (ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false }, - ProjectionElem::Subslice {from, .. }) - | (ProjectionElem::Subslice {from, .. }, - ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false }) => { + ( + ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false }, + ProjectionElem::Subslice { from, .. }, + ) + | ( + ProjectionElem::Subslice { from, .. }, + ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false }, + ) => { if offset >= from { - debug!( - "place_element_conflict: DISJOINT-OR-EQ-SLICE-CONSTANT-INDEX-SUBSLICE"); + debug!("place_element_conflict: DISJOINT-OR-EQ-SLICE-CONSTANT-INDEX-SUBSLICE"); Overlap::EqualOrDisjoint } else { debug!("place_element_conflict: DISJOINT-SLICE-CONSTANT-INDEX-SUBSLICE"); Overlap::Disjoint } } - (ProjectionElem::ConstantIndex { offset, min_length: _, from_end: true }, - ProjectionElem::Subslice { to, from_end: true, .. }) - | (ProjectionElem::Subslice { to, from_end: true, .. }, - ProjectionElem::ConstantIndex { offset, min_length: _, from_end: true }) => { + ( + ProjectionElem::ConstantIndex { offset, min_length: _, from_end: true }, + ProjectionElem::Subslice { to, from_end: true, .. }, + ) + | ( + ProjectionElem::Subslice { to, from_end: true, .. }, + ProjectionElem::ConstantIndex { offset, min_length: _, from_end: true }, + ) => { if offset > to { - debug!("place_element_conflict: \ - DISJOINT-OR-EQ-SLICE-CONSTANT-INDEX-SUBSLICE-FE"); + debug!( + "place_element_conflict: \ + DISJOINT-OR-EQ-SLICE-CONSTANT-INDEX-SUBSLICE-FE" + ); Overlap::EqualOrDisjoint } else { debug!("place_element_conflict: DISJOINT-SLICE-CONSTANT-INDEX-SUBSLICE-FE"); @@ -547,7 +505,7 @@ fn place_projection_conflict<'tcx>( } ( ProjectionElem::Subslice { from: f1, to: t1, from_end: false }, - ProjectionElem::Subslice { from: f2, to: t2, from_end: false } + ProjectionElem::Subslice { from: f2, to: t2, from_end: false }, ) => { if f2 >= t1 || f1 >= t2 { debug!("place_element_conflict: DISJOINT-ARRAY-SUBSLICES"); @@ -559,7 +517,7 @@ fn place_projection_conflict<'tcx>( } (ProjectionElem::Subslice { .. }, ProjectionElem::Subslice { .. }) => { debug!("place_element_conflict: DISJOINT-OR-EQ-SLICE-SUBSLICES"); - Overlap::EqualOrDisjoint + Overlap::EqualOrDisjoint } (ProjectionElem::Deref, _) | (ProjectionElem::Field(..), _) diff --git a/src/librustc_mir/borrow_check/prefixes.rs b/src/librustc_mir/borrow_check/prefixes.rs index 248faa5677..31bee460fa 100644 --- a/src/librustc_mir/borrow_check/prefixes.rs +++ b/src/librustc_mir/borrow_check/prefixes.rs @@ -9,9 +9,9 @@ use super::MirBorrowckCtxt; -use rustc::hir; +use rustc::mir::{Place, PlaceRef, ProjectionElem, ReadOnlyBodyAndCache}; use rustc::ty::{self, TyCtxt}; -use rustc::mir::{Place, PlaceBase, PlaceRef, ProjectionElem, ReadOnlyBodyAndCache}; +use rustc_hir as hir; pub trait IsPrefixOf<'cx, 'tcx> { fn is_prefix_of(&self, other: PlaceRef<'cx, 'tcx>) -> bool; @@ -19,7 +19,7 @@ pub trait IsPrefixOf<'cx, 'tcx> { impl<'cx, 'tcx> IsPrefixOf<'cx, 'tcx> for PlaceRef<'cx, 'tcx> { fn is_prefix_of(&self, other: PlaceRef<'cx, 'tcx>) -> bool { - self.base == other.base + self.local == other.local && self.projection.len() <= other.projection.len() && self.projection == &other.projection[..self.projection.len()] } @@ -53,12 +53,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { place_ref: PlaceRef<'cx, 'tcx>, kind: PrefixSet, ) -> Prefixes<'cx, 'tcx> { - Prefixes { - next: Some(place_ref), - kind, - body: self.body, - tcx: self.infcx.tcx, - } + Prefixes { next: Some(place_ref), kind, body: self.body, tcx: self.infcx.tcx } } } @@ -74,39 +69,23 @@ impl<'cx, 'tcx> Iterator for Prefixes<'cx, 'tcx> { 'cursor: loop { match &cursor { - PlaceRef { - base: PlaceBase::Local(_), - projection: [], - } - | // search yielded this leaf - PlaceRef { - base: PlaceBase::Static(_), - projection: [], - } => { + PlaceRef { local: _, projection: [] } => { self.next = None; return Some(cursor); } - PlaceRef { - base: _, - projection: [proj_base @ .., elem], - } => { + PlaceRef { local: _, projection: [proj_base @ .., elem] } => { match elem { ProjectionElem::Field(_ /*field*/, _ /*ty*/) => { // FIXME: add union handling - self.next = Some(PlaceRef { - base: cursor.base, - projection: proj_base, - }); + self.next = + Some(PlaceRef { local: cursor.local, projection: proj_base }); return Some(cursor); } - ProjectionElem::Downcast(..) | - ProjectionElem::Subslice { .. } | - ProjectionElem::ConstantIndex { .. } | - ProjectionElem::Index(_) => { - cursor = PlaceRef { - base: cursor.base, - projection: proj_base, - }; + ProjectionElem::Downcast(..) + | ProjectionElem::Subslice { .. } + | ProjectionElem::ConstantIndex { .. } + | ProjectionElem::Index(_) => { + cursor = PlaceRef { local: cursor.local, projection: proj_base }; continue 'cursor; } ProjectionElem::Deref => { @@ -127,10 +106,8 @@ impl<'cx, 'tcx> Iterator for Prefixes<'cx, 'tcx> { PrefixSet::All => { // All prefixes: just blindly enqueue the base // of the projection. - self.next = Some(PlaceRef { - base: cursor.base, - projection: proj_base, - }); + self.next = + Some(PlaceRef { local: cursor.local, projection: proj_base }); return Some(cursor); } PrefixSet::Supporting => { @@ -143,37 +120,24 @@ impl<'cx, 'tcx> Iterator for Prefixes<'cx, 'tcx> { // derefs, except we stop at the deref of a shared // reference. - let ty = Place::ty_from(cursor.base, proj_base, *self.body, self.tcx).ty; + let ty = Place::ty_from(cursor.local, proj_base, *self.body, self.tcx).ty; match ty.kind { - ty::RawPtr(_) | - ty::Ref( - _, /*rgn*/ - _, /*ty*/ - hir::Mutability::Immutable - ) => { + ty::RawPtr(_) | ty::Ref(_ /*rgn*/, _ /*ty*/, hir::Mutability::Not) => { // don't continue traversing over derefs of raw pointers or shared // borrows. self.next = None; return Some(cursor); } - ty::Ref( - _, /*rgn*/ - _, /*ty*/ - hir::Mutability::Mutable, - ) => { - self.next = Some(PlaceRef { - base: cursor.base, - projection: proj_base, - }); + ty::Ref(_ /*rgn*/, _ /*ty*/, hir::Mutability::Mut) => { + self.next = + Some(PlaceRef { local: cursor.local, projection: proj_base }); return Some(cursor); } ty::Adt(..) if ty.is_box() => { - self.next = Some(PlaceRef { - base: cursor.base, - projection: proj_base, - }); + self.next = + Some(PlaceRef { local: cursor.local, projection: proj_base }); return Some(cursor); } diff --git a/src/librustc_mir/borrow_check/region_infer/dump_mir.rs b/src/librustc_mir/borrow_check/region_infer/dump_mir.rs index d4f6ce8801..b236ffe807 100644 --- a/src/librustc_mir/borrow_check/region_infer/dump_mir.rs +++ b/src/librustc_mir/borrow_check/region_infer/dump_mir.rs @@ -3,9 +3,9 @@ //! state of region inference. This code handles emitting the region //! context internal state. +use super::{OutlivesConstraint, RegionInferenceContext}; use rustc::infer::NLLRegionVariableOrigin; use std::io::{self, Write}; -use super::{OutlivesConstraint, RegionInferenceContext}; // Room for "'_#NNNNr" before things get misaligned. // Easy enough to fix if this ever doesn't seem like @@ -19,10 +19,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { for region in self.regions() { if let NLLRegionVariableOrigin::FreeRegion = self.definitions[region].origin { - let classification = self - .universal_regions - .region_classification(region) - .unwrap(); + let classification = self.universal_regions.region_classification(region).unwrap(); let outlived_by = self.universal_region_relations.regions_outlived_by(region); writeln!( out, @@ -74,19 +71,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { let mut constraints: Vec<_> = self.constraints.outlives().iter().collect(); constraints.sort(); for constraint in &constraints { - let OutlivesConstraint { - sup, - sub, - locations, - category, - } = constraint; - with_msg(&format!( - "{:?}: {:?} due to {:?} at {:?}", - sup, - sub, - category, - locations, - ))?; + let OutlivesConstraint { sup, sub, locations, category } = constraint; + with_msg(&format!("{:?}: {:?} due to {:?} at {:?}", sup, sub, category, locations,))?; } Ok(()) diff --git a/src/librustc_mir/borrow_check/region_infer/graphviz.rs b/src/librustc_mir/borrow_check/region_infer/graphviz.rs index 29c6f32526..39b396ba4e 100644 --- a/src/librustc_mir/borrow_check/region_infer/graphviz.rs +++ b/src/librustc_mir/borrow_check/region_infer/graphviz.rs @@ -16,10 +16,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// Write out the region constraint graph. crate fn dump_graphviz_scc_constraints(&self, mut w: &mut dyn Write) -> io::Result<()> { - let mut nodes_per_scc: IndexVec = self.constraint_sccs - .all_sccs() - .map(|_| Vec::new()) - .collect(); + let mut nodes_per_scc: IndexVec = + self.constraint_sccs.all_sccs().map(|_| Vec::new()).collect(); for region in self.definitions.indices() { let scc = self.constraint_sccs.scc(region); @@ -112,7 +110,8 @@ impl<'a, 'this, 'tcx> dot::GraphWalk<'this> for SccConstraints<'a, 'tcx> { vids.into() } fn edges(&'this self) -> dot::Edges<'this, (ConstraintSccIndex, ConstraintSccIndex)> { - let edges: Vec<_> = self.regioncx + let edges: Vec<_> = self + .regioncx .constraint_sccs .all_sccs() .flat_map(|scc_a| { diff --git a/src/librustc_mir/borrow_check/region_infer/mod.rs b/src/librustc_mir/borrow_check/region_infer/mod.rs index b6946e2f73..26d9cf2e04 100644 --- a/src/librustc_mir/borrow_check/region_infer/mod.rs +++ b/src/librustc_mir/borrow_check/region_infer/mod.rs @@ -1,8 +1,7 @@ +use std::collections::VecDeque; use std::rc::Rc; -use rustc::hir::def_id::DefId; use rustc::infer::canonical::QueryOutlivesConstraint; -use rustc::infer::opaque_types; use rustc::infer::region_constraints::{GenericKind, VarInfos, VerifyBound}; use rustc::infer::{InferCtxt, NLLRegionVariableOrigin, RegionVariableOrigin}; use rustc::mir::{ @@ -10,37 +9,29 @@ use rustc::mir::{ ConstraintCategory, Local, Location, }; use rustc::ty::{self, subst::SubstsRef, RegionVid, Ty, TyCtxt, TypeFoldable}; -use rustc::util::common::ErrorReported; use rustc_data_structures::binary_search_util; -use rustc_index::bit_set::BitSet; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; -use rustc_data_structures::graph::WithSuccessors; use rustc_data_structures::graph::scc::Sccs; use rustc_data_structures::graph::vec_graph::VecGraph; +use rustc_data_structures::graph::WithSuccessors; +use rustc_hir::def_id::DefId; +use rustc_index::bit_set::BitSet; use rustc_index::vec::IndexVec; -use rustc_errors::{Diagnostic, DiagnosticBuilder}; -use syntax_pos::Span; -use syntax_pos::symbol::Symbol; +use rustc_span::Span; use crate::borrow_check::{ constraints::{ - graph::NormalConstraintGraph, - ConstraintSccIndex, - OutlivesConstraint, - OutlivesConstraintSet, + graph::NormalConstraintGraph, ConstraintSccIndex, OutlivesConstraint, OutlivesConstraintSet, }, + diagnostics::{RegionErrorKind, RegionErrors}, member_constraints::{MemberConstraintSet, NllMemberConstraintIndex}, + nll::{PoloniusOutput, ToRegionVid}, region_infer::values::{ - PlaceholderIndices, RegionElement, ToElementIndex, LivenessValues, RegionValueElements, - RegionValues, + LivenessValues, PlaceholderIndices, RegionElement, RegionValueElements, RegionValues, + ToElementIndex, }, type_check::{free_region_relations::UniversalRegionRelations, Locations}, - diagnostics::{ - OutlivesSuggestionBuilder, RegionErrorNamingCtx, - }, - nll::{ToRegionVid, PoloniusOutput}, universal_regions::UniversalRegions, - Upvar, }; mod dump_mir; @@ -53,51 +44,48 @@ pub struct RegionInferenceContext<'tcx> { /// variables are identified by their index (`RegionVid`). The /// definition contains information about where the region came /// from as well as its final inferred value. - pub(in crate::borrow_check) definitions: IndexVec>, + definitions: IndexVec>, /// The liveness constraints added to each region. For most /// regions, these start out empty and steadily grow, though for /// each universally quantified region R they start out containing /// the entire CFG and `end(R)`. - pub(in crate::borrow_check) liveness_constraints: LivenessValues, + liveness_constraints: LivenessValues, /// The outlives constraints computed by the type-check. - pub(in crate::borrow_check) constraints: Rc, + constraints: Rc, /// The constraint-set, but in graph form, making it easy to traverse /// the constraints adjacent to a particular region. Used to construct /// the SCC (see `constraint_sccs`) and for error reporting. - pub(in crate::borrow_check) constraint_graph: Rc, + constraint_graph: Rc, /// The SCC computed from `constraints` and the constraint /// graph. We have an edge from SCC A to SCC B if `A: B`. Used to /// compute the values of each region. - pub(in crate::borrow_check) constraint_sccs: Rc>, + constraint_sccs: Rc>, /// Reverse of the SCC constraint graph -- i.e., an edge `A -> B` /// exists if `B: A`. Computed lazilly. - pub(in crate::borrow_check) rev_constraint_graph: - Option>>, + rev_constraint_graph: Option>>, /// The "R0 member of [R1..Rn]" constraints, indexed by SCC. - pub(in crate::borrow_check) member_constraints: - Rc>, + member_constraints: Rc>, /// Records the member constraints that we applied to each scc. /// This is useful for error reporting. Once constraint /// propagation is done, this vector is sorted according to /// `member_region_scc`. - pub(in crate::borrow_check) member_constraints_applied: Vec, + member_constraints_applied: Vec, /// Map closure bounds to a `Span` that should be used for error reporting. - pub(in crate::borrow_check) closure_bounds_mapping: + closure_bounds_mapping: FxHashMap>, /// Contains the minimum universe of any variable within the same /// SCC. We will ensure that no SCC contains values that are not /// visible from this index. - pub(in crate::borrow_check) scc_universes: - IndexVec, + scc_universes: IndexVec, /// Contains a "representative" from each SCC. This will be the /// minimal RegionVid belonging to that universe. It is used as a @@ -106,25 +94,23 @@ pub struct RegionInferenceContext<'tcx> { /// of its SCC and be sure that -- if they have the same repr -- /// they *must* be equal (though not having the same repr does not /// mean they are unequal). - pub(in crate::borrow_check) scc_representatives: - IndexVec, + scc_representatives: IndexVec, /// The final inferred values of the region variables; we compute /// one value per SCC. To get the value for any given *region*, /// you first find which scc it is a part of. - pub(in crate::borrow_check) scc_values: RegionValues, + scc_values: RegionValues, /// Type constraints that we check after solving. - pub(in crate::borrow_check) type_tests: Vec>, + type_tests: Vec>, /// Information about the universally quantified regions in scope /// on this function. - pub (in crate::borrow_check) universal_regions: Rc>, + universal_regions: Rc>, /// Information about how the universally quantified regions in /// scope on this function relate to one another. - pub(in crate::borrow_check) universal_region_relations: - Rc>, + universal_region_relations: Rc>, } /// Each time that `apply_member_constraint` is successful, it appends @@ -230,6 +216,22 @@ pub struct TypeTest<'tcx> { pub verify_bound: VerifyBound<'tcx>, } +/// When we have an unmet lifetime constraint, we try to propagate it outward (e.g. to a closure +/// environment). If we can't, it is an error. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum RegionRelationCheckResult { + Ok, + Propagated, + Error, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +enum Trace { + StartRegion, + FromOutlivesConstraint(OutlivesConstraint), + NotVisited, +} + impl<'tcx> RegionInferenceContext<'tcx> { /// Creates a new region inference context with a total of /// `num_region_variables` valid inference variables; the first N @@ -432,7 +434,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { } /// Adds annotations for `#[rustc_regions]`; see `UniversalRegions::annotate`. - crate fn annotate(&self, tcx: TyCtxt<'tcx>, err: &mut DiagnosticBuilder<'_>) { + crate fn annotate(&self, tcx: TyCtxt<'tcx>, err: &mut rustc_errors::DiagnosticBuilder<'_>) { self.universal_regions.annotate(tcx, err) } @@ -460,7 +462,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// the member constraints that were applied to the value of a given /// region `r`. See `AppliedMemberConstraint`. pub(in crate::borrow_check) fn applied_member_constraints( - &self, r: impl ToRegionVid + &self, + r: impl ToRegionVid, ) -> &[AppliedMemberConstraint] { let scc = self.constraint_sccs.scc(r.to_region_vid()); binary_search_util::binary_search_slice( @@ -477,73 +480,48 @@ impl<'tcx> RegionInferenceContext<'tcx> { &mut self, infcx: &InferCtxt<'_, 'tcx>, body: &Body<'tcx>, - local_names: &IndexVec>, - upvars: &[Upvar], mir_def_id: DefId, - errors_buffer: &mut Vec, polonius_output: Option>, - ) -> Option> { + ) -> (Option>, RegionErrors<'tcx>) { self.propagate_constraints(body); + let mut errors_buffer = RegionErrors::new(); + // If this is a closure, we can propagate unsatisfied // `outlives_requirements` to our creator, so create a vector // to store those. Otherwise, we'll pass in `None` to the // functions below, which will trigger them to report errors // eagerly. - let mut outlives_requirements = - infcx.tcx.is_closure(mir_def_id).then(|| vec![]); - - self.check_type_tests( - infcx, - body, - mir_def_id, - outlives_requirements.as_mut(), - errors_buffer, - ); + let mut outlives_requirements = infcx.tcx.is_closure(mir_def_id).then(|| vec![]); - // If we produce any errors, we keep track of the names of all regions, so that we can use - // the same error names in any suggestions we produce. Note that we need names to be unique - // across different errors for the same MIR def so that we can make suggestions that fix - // multiple problems. - let mut region_naming = RegionErrorNamingCtx::new(); + self.check_type_tests(infcx, body, outlives_requirements.as_mut(), &mut errors_buffer); // In Polonius mode, the errors about missing universal region relations are in the output // and need to be emitted or propagated. Otherwise, we need to check whether the // constraints were too strong, and if so, emit or propagate those errors. if infcx.tcx.sess.opts.debugging_opts.polonius { self.check_polonius_subset_errors( - infcx, body, - local_names, - upvars, - mir_def_id, outlives_requirements.as_mut(), - errors_buffer, - &mut region_naming, + &mut errors_buffer, polonius_output.expect("Polonius output is unavailable despite `-Z polonius`"), ); } else { - self.check_universal_regions( - infcx, - body, - local_names, - upvars, - mir_def_id, - outlives_requirements.as_mut(), - errors_buffer, - &mut region_naming, - ); + self.check_universal_regions(body, outlives_requirements.as_mut(), &mut errors_buffer); } - self.check_member_constraints(infcx, mir_def_id, errors_buffer); + self.check_member_constraints(infcx, &mut errors_buffer); let outlives_requirements = outlives_requirements.unwrap_or(vec![]); if outlives_requirements.is_empty() { - None + (None, errors_buffer) } else { let num_external_vids = self.universal_regions.num_global_and_external_regions(); - Some(ClosureRegionRequirements { num_external_vids, outlives_requirements }) + ( + Some(ClosureRegionRequirements { num_external_vids, outlives_requirements }), + errors_buffer, + ) } } @@ -624,11 +602,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { // Now take member constraints into account. let member_constraints = self.member_constraints.clone(); for m_c_i in member_constraints.indices(scc_a) { - self.apply_member_constraint( - scc_a, - m_c_i, - member_constraints.choice_regions(m_c_i), - ); + self.apply_member_constraint(scc_a, m_c_i, member_constraints.choice_regions(m_c_i)); } debug!( @@ -752,8 +726,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { let min_choice_scc = self.constraint_sccs.scc(min_choice); debug!( "apply_member_constraint: min_choice={:?} best_choice_scc={:?}", - min_choice, - min_choice_scc, + min_choice, min_choice_scc, ); if self.scc_values.add_region(scc, min_choice_scc) { self.member_constraints_applied.push(AppliedMemberConstraint { @@ -784,9 +757,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { } /// Compute and return the reverse SCC-based constraint graph (lazilly). - fn rev_constraint_graph( - &mut self, - ) -> Rc> { + fn rev_constraint_graph(&mut self) -> Rc> { if let Some(g) = &self.rev_constraint_graph { return g.clone(); } @@ -838,9 +809,8 @@ impl<'tcx> RegionInferenceContext<'tcx> { &self, infcx: &InferCtxt<'_, 'tcx>, body: &Body<'tcx>, - mir_def_id: DefId, mut propagated_outlives_requirements: Option<&mut Vec>>, - errors_buffer: &mut Vec, + errors_buffer: &mut RegionErrors<'tcx>, ) { let tcx = infcx.tcx; @@ -875,81 +845,22 @@ impl<'tcx> RegionInferenceContext<'tcx> { } // Type-test failed. Report the error. - - // Try to convert the lower-bound region into something named we can print for the user. - let lower_bound_region = self.to_error_region(type_test.lower_bound); + let erased_generic_kind = infcx.tcx.erase_regions(&type_test.generic_kind); // Skip duplicate-ish errors. - let type_test_span = type_test.locations.span(body); - let erased_generic_kind = tcx.erase_regions(&type_test.generic_kind); - if !deduplicate_errors.insert(( + if deduplicate_errors.insert(( erased_generic_kind, - lower_bound_region, + type_test.lower_bound, type_test.locations, )) { - continue; - } else { debug!( "check_type_test: reporting error for erased_generic_kind={:?}, \ lower_bound_region={:?}, \ type_test.locations={:?}", - erased_generic_kind, lower_bound_region, type_test.locations, + erased_generic_kind, type_test.lower_bound, type_test.locations, ); - } - - if let Some(lower_bound_region) = lower_bound_region { - let region_scope_tree = &tcx.region_scope_tree(mir_def_id); - infcx - .construct_generic_bound_failure( - region_scope_tree, - type_test_span, - None, - type_test.generic_kind, - lower_bound_region, - ) - .buffer(errors_buffer); - } else { - // FIXME. We should handle this case better. It - // indicates that we have e.g., some region variable - // whose value is like `'a+'b` where `'a` and `'b` are - // distinct unrelated univesal regions that are not - // known to outlive one another. It'd be nice to have - // some examples where this arises to decide how best - // to report it; we could probably handle it by - // iterating over the universal regions and reporting - // an error that multiple bounds are required. - tcx.sess - .struct_span_err( - type_test_span, - &format!("`{}` does not live long enough", type_test.generic_kind,), - ) - .buffer(errors_buffer); - } - } - } - /// Converts a region inference variable into a `ty::Region` that - /// we can use for error reporting. If `r` is universally bound, - /// then we use the name that we have on record for it. If `r` is - /// existentially bound, then we check its inferred value and try - /// to find a good name from that. Returns `None` if we can't find - /// one (e.g., this is just some random part of the CFG). - pub fn to_error_region(&self, r: RegionVid) -> Option> { - self.to_error_region_vid(r).and_then(|r| self.definitions[r].external_name) - } - - /// Returns the [RegionVid] corresponding to the region returned by - /// `to_error_region`. - pub fn to_error_region_vid(&self, r: RegionVid) -> Option { - if self.universal_regions.is_universal_region(r) { - Some(r) - } else { - let r_scc = self.constraint_sccs.scc(r); - let upper_bound = self.universal_upper_bound(r); - if self.scc_values.contains(r_scc, upper_bound) { - self.to_error_region_vid(upper_bound) - } else { - None + errors_buffer.push(RegionErrorKind::TypeTestError { type_test: type_test.clone() }); } } } @@ -1164,7 +1075,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// include the CFG anyhow. /// - For each `end('x)` element in `'r`, compute the mutual LUB, yielding /// a result `'y`. - fn universal_upper_bound(&self, r: RegionVid) -> RegionVid { + pub(in crate::borrow_check) fn universal_upper_bound(&self, r: RegionVid) -> RegionVid { debug!("universal_upper_bound(r={:?}={})", r, self.region_value_str(r)); // Find the smallest universal region that contains all other @@ -1342,17 +1253,10 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// report them as errors. fn check_universal_regions( &self, - infcx: &InferCtxt<'_, 'tcx>, body: &Body<'tcx>, - local_names: &IndexVec>, - upvars: &[Upvar], - mir_def_id: DefId, mut propagated_outlives_requirements: Option<&mut Vec>>, - errors_buffer: &mut Vec, - region_naming: &mut RegionErrorNamingCtx, + errors_buffer: &mut RegionErrors<'tcx>, ) { - let mut outlives_suggestion = OutlivesSuggestionBuilder::new(mir_def_id, local_names); - for (fr, fr_definition) in self.definitions.iter_enumerated() { match fr_definition.origin { NLLRegionVariableOrigin::FreeRegion => { @@ -1360,21 +1264,15 @@ impl<'tcx> RegionInferenceContext<'tcx> { // they did not grow too large, accumulating any requirements // for our caller into the `outlives_requirements` vector. self.check_universal_region( - infcx, body, - local_names, - upvars, - mir_def_id, fr, &mut propagated_outlives_requirements, - &mut outlives_suggestion, errors_buffer, - region_naming, ); } NLLRegionVariableOrigin::Placeholder(placeholder) => { - self.check_bound_universal_region(infcx, body, mir_def_id, fr, placeholder); + self.check_bound_universal_region(fr, placeholder, errors_buffer); } NLLRegionVariableOrigin::Existential { .. } => { @@ -1382,9 +1280,6 @@ impl<'tcx> RegionInferenceContext<'tcx> { } } } - - // Emit outlives suggestions - outlives_suggestion.add_suggestion(body, self, infcx, errors_buffer, region_naming); } /// Checks if Polonius has found any unexpected free region relations. @@ -1410,14 +1305,9 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// report them as errors. fn check_polonius_subset_errors( &self, - infcx: &InferCtxt<'_, 'tcx>, body: &Body<'tcx>, - local_names: &IndexVec>, - upvars: &[Upvar], - mir_def_id: DefId, mut propagated_outlives_requirements: Option<&mut Vec>>, - errors_buffer: &mut Vec, - region_naming: &mut RegionErrorNamingCtx, + errors_buffer: &mut RegionErrors<'tcx>, polonius_output: Rc, ) { debug!( @@ -1425,8 +1315,6 @@ impl<'tcx> RegionInferenceContext<'tcx> { polonius_output.subset_errors.len() ); - let mut outlives_suggestion = OutlivesSuggestionBuilder::new(mir_def_id, local_names); - // Similarly to `check_universal_regions`: a free region relation, which was not explicitly // declared ("known") was found by Polonius, so emit an error, or propagate the // requirements for our caller into the `propagated_outlives_requirements` vector. @@ -1455,22 +1343,26 @@ impl<'tcx> RegionInferenceContext<'tcx> { subset_errors.dedup(); for (longer_fr, shorter_fr) in subset_errors.into_iter() { - debug!("check_polonius_subset_errors: subset_error longer_fr={:?},\ - shorter_fr={:?}", longer_fr, shorter_fr); + debug!( + "check_polonius_subset_errors: subset_error longer_fr={:?},\ + shorter_fr={:?}", + longer_fr, shorter_fr + ); - self.report_or_propagate_universal_region_error( + let propagated = self.try_propagate_universal_region_error( *longer_fr, *shorter_fr, - infcx, body, - local_names, - upvars, - mir_def_id, &mut propagated_outlives_requirements, - &mut outlives_suggestion, - errors_buffer, - region_naming, ); + if propagated == RegionRelationCheckResult::Error { + errors_buffer.push(RegionErrorKind::RegionError { + longer_fr: *longer_fr, + shorter_fr: *shorter_fr, + fr_origin: NLLRegionVariableOrigin::FreeRegion, + is_reported: true, + }); + } } // Handle the placeholder errors as usual, until the chalk-rustc-polonius triumvirate has @@ -1482,7 +1374,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { } NLLRegionVariableOrigin::Placeholder(placeholder) => { - self.check_bound_universal_region(infcx, body, mir_def_id, fr, placeholder); + self.check_bound_universal_region(fr, placeholder, errors_buffer); } NLLRegionVariableOrigin::Existential { .. } => { @@ -1490,9 +1382,6 @@ impl<'tcx> RegionInferenceContext<'tcx> { } } } - - // Emit outlives suggestions - outlives_suggestion.add_suggestion(body, self, infcx, errors_buffer, region_naming); } /// Checks the final value for the free region `fr` to see if it @@ -1505,16 +1394,10 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// `outlives_requirements` vector. fn check_universal_region( &self, - infcx: &InferCtxt<'_, 'tcx>, body: &Body<'tcx>, - local_names: &IndexVec>, - upvars: &[Upvar], - mir_def_id: DefId, longer_fr: RegionVid, propagated_outlives_requirements: &mut Option<&mut Vec>>, - outlives_suggestion: &mut OutlivesSuggestionBuilder<'_>, - errors_buffer: &mut Vec, - region_naming: &mut RegionErrorNamingCtx, + errors_buffer: &mut RegionErrors<'tcx>, ) { debug!("check_universal_region(fr={:?})", longer_fr); @@ -1533,122 +1416,107 @@ impl<'tcx> RegionInferenceContext<'tcx> { // one in this SCC, so we will always check the representative here. let representative = self.scc_representatives[longer_fr_scc]; if representative != longer_fr { - self.check_universal_region_relation( + if let RegionRelationCheckResult::Error = self.check_universal_region_relation( longer_fr, representative, - infcx, body, - local_names, - upvars, - mir_def_id, propagated_outlives_requirements, - outlives_suggestion, - errors_buffer, - region_naming, - ); + ) { + errors_buffer.push(RegionErrorKind::RegionError { + longer_fr, + shorter_fr: representative, + fr_origin: NLLRegionVariableOrigin::FreeRegion, + is_reported: true, + }); + } return; } // Find every region `o` such that `fr: o` // (because `fr` includes `end(o)`). + let mut error_reported = false; for shorter_fr in self.scc_values.universal_regions_outlived_by(longer_fr_scc) { - if let Some(ErrorReported) = self.check_universal_region_relation( + if let RegionRelationCheckResult::Error = self.check_universal_region_relation( longer_fr, shorter_fr, - infcx, body, - local_names, - upvars, - mir_def_id, propagated_outlives_requirements, - outlives_suggestion, - errors_buffer, - region_naming, ) { - // continuing to iterate just reports more errors than necessary - // - // FIXME It would also allow us to report more Outlives Suggestions, though, so - // it's not clear that that's a bad thing. Somebody should try commenting out this - // line and see it is actually a regression. - return; + // We only report the first region error. Subsequent errors are hidden so as + // not to overwhelm the user, but we do record them so as to potentially print + // better diagnostics elsewhere... + errors_buffer.push(RegionErrorKind::RegionError { + longer_fr, + shorter_fr, + fr_origin: NLLRegionVariableOrigin::FreeRegion, + is_reported: !error_reported, + }); + + error_reported = true; } } } + /// Checks that we can prove that `longer_fr: shorter_fr`. If we can't we attempt to propagate + /// the constraint outward (e.g. to a closure environment), but if that fails, there is an + /// error. fn check_universal_region_relation( &self, longer_fr: RegionVid, shorter_fr: RegionVid, - infcx: &InferCtxt<'_, 'tcx>, body: &Body<'tcx>, - local_names: &IndexVec>, - upvars: &[Upvar], - mir_def_id: DefId, propagated_outlives_requirements: &mut Option<&mut Vec>>, - outlives_suggestion: &mut OutlivesSuggestionBuilder<'_>, - errors_buffer: &mut Vec, - region_naming: &mut RegionErrorNamingCtx, - ) -> Option { + ) -> RegionRelationCheckResult { // If it is known that `fr: o`, carry on. if self.universal_region_relations.outlives(longer_fr, shorter_fr) { - return None; + RegionRelationCheckResult::Ok + } else { + // If we are not in a context where we can't propagate errors, or we + // could not shrink `fr` to something smaller, then just report an + // error. + // + // Note: in this case, we use the unapproximated regions to report the + // error. This gives better error messages in some cases. + self.try_propagate_universal_region_error( + longer_fr, + shorter_fr, + body, + propagated_outlives_requirements, + ) } - - self.report_or_propagate_universal_region_error( - longer_fr, - shorter_fr, - infcx, - body, - local_names, - upvars, - mir_def_id, - propagated_outlives_requirements, - outlives_suggestion, - errors_buffer, - region_naming, - ) } - fn report_or_propagate_universal_region_error( + /// Attempt to propagate a region error (e.g. `'a: 'b`) that is not met to a closure's + /// creator. If we cannot, then the caller should report an error to the user. + fn try_propagate_universal_region_error( &self, longer_fr: RegionVid, shorter_fr: RegionVid, - infcx: &InferCtxt<'_, 'tcx>, body: &Body<'tcx>, - local_names: &IndexVec>, - upvars: &[Upvar], - mir_def_id: DefId, propagated_outlives_requirements: &mut Option<&mut Vec>>, - outlives_suggestion: &mut OutlivesSuggestionBuilder<'_>, - errors_buffer: &mut Vec, - region_naming: &mut RegionErrorNamingCtx, - ) -> Option { - debug!( - "report_or_propagate_universal_region_error: fr={:?} does not outlive shorter_fr={:?}", - longer_fr, shorter_fr, - ); - + ) -> RegionRelationCheckResult { if let Some(propagated_outlives_requirements) = propagated_outlives_requirements { // Shrink `longer_fr` until we find a non-local region (if we do). // We'll call it `fr-` -- it's ever so slightly smaller than // `longer_fr`. + if let Some(fr_minus) = self.universal_region_relations.non_local_lower_bound(longer_fr) + { + debug!("try_propagate_universal_region_error: fr_minus={:?}", fr_minus); - if let Some(fr_minus) = - self.universal_region_relations.non_local_lower_bound(longer_fr) { - debug!("report_or_propagate_universal_region_error: fr_minus={:?}", fr_minus); - - let blame_span_category = - self.find_outlives_blame_span(body, longer_fr, - NLLRegionVariableOrigin::FreeRegion,shorter_fr); + let blame_span_category = self.find_outlives_blame_span( + body, + longer_fr, + NLLRegionVariableOrigin::FreeRegion, + shorter_fr, + ); // Grow `shorter_fr` until we find some non-local regions. (We // always will.) We'll call them `shorter_fr+` -- they're ever // so slightly larger than `shorter_fr`. - let shorter_fr_plus = self - .universal_region_relations - .non_local_upper_bounds(&shorter_fr); + let shorter_fr_plus = + self.universal_region_relations.non_local_upper_bounds(&shorter_fr); debug!( - "report_or_propagate_universal_region_error: shorter_fr_plus={:?}", + "try_propagate_universal_region_error: shorter_fr_plus={:?}", shorter_fr_plus ); for &&fr in &shorter_fr_plus { @@ -1660,41 +1528,18 @@ impl<'tcx> RegionInferenceContext<'tcx> { category: blame_span_category.0, }); } - return None; + return RegionRelationCheckResult::Propagated; } } - // If we are not in a context where we can't propagate errors, or we - // could not shrink `fr` to something smaller, then just report an - // error. - // - // Note: in this case, we use the unapproximated regions to report the - // error. This gives better error messages in some cases. - let db = self.report_error( - body, - local_names, - upvars, - infcx, - mir_def_id, - longer_fr, - NLLRegionVariableOrigin::FreeRegion, - shorter_fr, - outlives_suggestion, - region_naming, - ); - - db.buffer(errors_buffer); - - Some(ErrorReported) + RegionRelationCheckResult::Error } fn check_bound_universal_region( &self, - infcx: &InferCtxt<'_, 'tcx>, - body: &Body<'tcx>, - _mir_def_id: DefId, longer_fr: RegionVid, placeholder: ty::PlaceholderRegion, + errors_buffer: &mut RegionErrors<'tcx>, ) { debug!("check_bound_universal_region(fr={:?}, placeholder={:?})", longer_fr, placeholder,); @@ -1717,39 +1562,17 @@ impl<'tcx> RegionInferenceContext<'tcx> { debug!("check_bound_universal_region: error_element = {:?}", error_element); // Find the region that introduced this `error_element`. - let error_region = match error_element { - RegionElement::Location(l) => self.find_sub_region_live_at(longer_fr, l), - RegionElement::RootUniversalRegion(r) => r, - RegionElement::PlaceholderRegion(error_placeholder) => self - .definitions - .iter_enumerated() - .filter_map(|(r, definition)| match definition.origin { - NLLRegionVariableOrigin::Placeholder(p) if p == error_placeholder => Some(r), - _ => None, - }) - .next() - .unwrap(), - }; - - // Find the code to blame for the fact that `longer_fr` outlives `error_fr`. - let (_, span) = self.find_outlives_blame_span( - body, longer_fr, NLLRegionVariableOrigin::Placeholder(placeholder), error_region - ); - - // Obviously, this error message is far from satisfactory. - // At present, though, it only appears in unit tests -- - // the AST-based checker uses a more conservative check, - // so to even see this error, one must pass in a special - // flag. - let mut diag = infcx.tcx.sess.struct_span_err(span, "higher-ranked subtype error"); - diag.emit(); + errors_buffer.push(RegionErrorKind::BoundUniversalRegionError { + longer_fr, + error_element, + fr_origin: NLLRegionVariableOrigin::Placeholder(placeholder), + }); } fn check_member_constraints( &self, infcx: &InferCtxt<'_, 'tcx>, - mir_def_id: DefId, - errors_buffer: &mut Vec, + errors_buffer: &mut RegionErrors<'tcx>, ) { let member_constraints = self.member_constraints.clone(); for m_c_i in member_constraints.all_indices() { @@ -1765,26 +1588,441 @@ impl<'tcx> RegionInferenceContext<'tcx> { debug!("check_member_constraint: choice_regions={:?}", choice_regions); // Did the member region wind up equal to any of the option regions? - if let Some(o) = choice_regions.iter().find(|&&o_r| { - self.eval_equal(o_r, m_c.member_region_vid) - }) { + if let Some(o) = + choice_regions.iter().find(|&&o_r| self.eval_equal(o_r, m_c.member_region_vid)) + { debug!("check_member_constraint: evaluated as equal to {:?}", o); continue; } // If not, report an error. - let region_scope_tree = &infcx.tcx.region_scope_tree(mir_def_id); let member_region = infcx.tcx.mk_region(ty::ReVar(member_region_vid)); - opaque_types::unexpected_hidden_region_diagnostic( - infcx.tcx, - Some(region_scope_tree), - m_c.opaque_type_def_id, - m_c.hidden_ty, + errors_buffer.push(RegionErrorKind::UnexpectedHiddenRegion { + opaque_type_def_id: m_c.opaque_type_def_id, + hidden_ty: m_c.hidden_ty, member_region, - ) - .buffer(errors_buffer); + }); } } + + /// We have a constraint `fr1: fr2` that is not satisfied, where + /// `fr2` represents some universal region. Here, `r` is some + /// region where we know that `fr1: r` and this function has the + /// job of determining whether `r` is "to blame" for the fact that + /// `fr1: fr2` is required. + /// + /// This is true under two conditions: + /// + /// - `r == fr2` + /// - `fr2` is `'static` and `r` is some placeholder in a universe + /// that cannot be named by `fr1`; in that case, we will require + /// that `fr1: 'static` because it is the only way to `fr1: r` to + /// be satisfied. (See `add_incompatible_universe`.) + crate fn provides_universal_region( + &self, + r: RegionVid, + fr1: RegionVid, + fr2: RegionVid, + ) -> bool { + debug!("provides_universal_region(r={:?}, fr1={:?}, fr2={:?})", r, fr1, fr2); + let result = { + r == fr2 || { + fr2 == self.universal_regions.fr_static && self.cannot_name_placeholder(fr1, r) + } + }; + debug!("provides_universal_region: result = {:?}", result); + result + } + + /// If `r2` represents a placeholder region, then this returns + /// `true` if `r1` cannot name that placeholder in its + /// value; otherwise, returns `false`. + crate fn cannot_name_placeholder(&self, r1: RegionVid, r2: RegionVid) -> bool { + debug!("cannot_name_value_of(r1={:?}, r2={:?})", r1, r2); + + match self.definitions[r2].origin { + NLLRegionVariableOrigin::Placeholder(placeholder) => { + let universe1 = self.definitions[r1].universe; + debug!( + "cannot_name_value_of: universe1={:?} placeholder={:?}", + universe1, placeholder + ); + universe1.cannot_name(placeholder.universe) + } + + NLLRegionVariableOrigin::FreeRegion | NLLRegionVariableOrigin::Existential { .. } => { + false + } + } + } + + crate fn retrieve_closure_constraint_info( + &self, + body: &Body<'tcx>, + constraint: &OutlivesConstraint, + ) -> (ConstraintCategory, bool, Span) { + let loc = match constraint.locations { + Locations::All(span) => return (constraint.category, false, span), + Locations::Single(loc) => loc, + }; + + let opt_span_category = + self.closure_bounds_mapping[&loc].get(&(constraint.sup, constraint.sub)); + opt_span_category.map(|&(category, span)| (category, true, span)).unwrap_or(( + constraint.category, + false, + body.source_info(loc).span, + )) + } + + /// Finds a good span to blame for the fact that `fr1` outlives `fr2`. + crate fn find_outlives_blame_span( + &self, + body: &Body<'tcx>, + fr1: RegionVid, + fr1_origin: NLLRegionVariableOrigin, + fr2: RegionVid, + ) -> (ConstraintCategory, Span) { + let (category, _, span) = self.best_blame_constraint(body, fr1, fr1_origin, |r| { + self.provides_universal_region(r, fr1, fr2) + }); + (category, span) + } + + /// Walks the graph of constraints (where `'a: 'b` is considered + /// an edge `'a -> 'b`) to find all paths from `from_region` to + /// `to_region`. The paths are accumulated into the vector + /// `results`. The paths are stored as a series of + /// `ConstraintIndex` values -- in other words, a list of *edges*. + /// + /// Returns: a series of constraints as well as the region `R` + /// that passed the target test. + crate fn find_constraint_paths_between_regions( + &self, + from_region: RegionVid, + target_test: impl Fn(RegionVid) -> bool, + ) -> Option<(Vec, RegionVid)> { + let mut context = IndexVec::from_elem(Trace::NotVisited, &self.definitions); + context[from_region] = Trace::StartRegion; + + // Use a deque so that we do a breadth-first search. We will + // stop at the first match, which ought to be the shortest + // path (fewest constraints). + let mut deque = VecDeque::new(); + deque.push_back(from_region); + + while let Some(r) = deque.pop_front() { + debug!( + "find_constraint_paths_between_regions: from_region={:?} r={:?} value={}", + from_region, + r, + self.region_value_str(r), + ); + + // Check if we reached the region we were looking for. If so, + // we can reconstruct the path that led to it and return it. + if target_test(r) { + let mut result = vec![]; + let mut p = r; + loop { + match context[p] { + Trace::NotVisited => { + bug!("found unvisited region {:?} on path to {:?}", p, r) + } + + Trace::FromOutlivesConstraint(c) => { + result.push(c); + p = c.sup; + } + + Trace::StartRegion => { + result.reverse(); + return Some((result, r)); + } + } + } + } + + // Otherwise, walk over the outgoing constraints and + // enqueue any regions we find, keeping track of how we + // reached them. + + // A constraint like `'r: 'x` can come from our constraint + // graph. + let fr_static = self.universal_regions.fr_static; + let outgoing_edges_from_graph = + self.constraint_graph.outgoing_edges(r, &self.constraints, fr_static); + + // Always inline this closure because it can be hot. + let mut handle_constraint = #[inline(always)] + |constraint: OutlivesConstraint| { + debug_assert_eq!(constraint.sup, r); + let sub_region = constraint.sub; + if let Trace::NotVisited = context[sub_region] { + context[sub_region] = Trace::FromOutlivesConstraint(constraint); + deque.push_back(sub_region); + } + }; + + // This loop can be hot. + for constraint in outgoing_edges_from_graph { + handle_constraint(constraint); + } + + // Member constraints can also give rise to `'r: 'x` edges that + // were not part of the graph initially, so watch out for those. + // (But they are extremely rare; this loop is very cold.) + for constraint in self.applied_member_constraints(r) { + let p_c = &self.member_constraints[constraint.member_constraint_index]; + let constraint = OutlivesConstraint { + sup: r, + sub: constraint.min_choice, + locations: Locations::All(p_c.definition_span), + category: ConstraintCategory::OpaqueType, + }; + handle_constraint(constraint); + } + } + + None + } + + /// Finds some region R such that `fr1: R` and `R` is live at `elem`. + crate fn find_sub_region_live_at(&self, fr1: RegionVid, elem: Location) -> RegionVid { + debug!("find_sub_region_live_at(fr1={:?}, elem={:?})", fr1, elem); + self.find_constraint_paths_between_regions(fr1, |r| { + // First look for some `r` such that `fr1: r` and `r` is live at `elem` + debug!( + "find_sub_region_live_at: liveness_constraints for {:?} are {:?}", + r, + self.liveness_constraints.region_value_str(r), + ); + self.liveness_constraints.contains(r, elem) + }) + .or_else(|| { + // If we fail to find that, we may find some `r` such that + // `fr1: r` and `r` is a placeholder from some universe + // `fr1` cannot name. This would force `fr1` to be + // `'static`. + self.find_constraint_paths_between_regions(fr1, |r| { + self.cannot_name_placeholder(fr1, r) + }) + }) + .or_else(|| { + // If we fail to find THAT, it may be that `fr1` is a + // placeholder that cannot "fit" into its SCC. In that + // case, there should be some `r` where `fr1: r`, both + // `fr1` and `r` are in the same SCC, and `fr1` is a + // placeholder that `r` cannot name. We can blame that + // edge. + self.find_constraint_paths_between_regions(fr1, |r| { + self.constraint_sccs.scc(fr1) == self.constraint_sccs.scc(r) + && self.cannot_name_placeholder(r, fr1) + }) + }) + .map(|(_path, r)| r) + .unwrap() + } + + /// Get the region outlived by `longer_fr` and live at `element`. + crate fn region_from_element(&self, longer_fr: RegionVid, element: RegionElement) -> RegionVid { + match element { + RegionElement::Location(l) => self.find_sub_region_live_at(longer_fr, l), + RegionElement::RootUniversalRegion(r) => r, + RegionElement::PlaceholderRegion(error_placeholder) => self + .definitions + .iter_enumerated() + .filter_map(|(r, definition)| match definition.origin { + NLLRegionVariableOrigin::Placeholder(p) if p == error_placeholder => Some(r), + _ => None, + }) + .next() + .unwrap(), + } + } + + /// Get the region definition of `r`. + crate fn region_definition(&self, r: RegionVid) -> &RegionDefinition<'tcx> { + &self.definitions[r] + } + + /// Check if the SCC of `r` contains `upper`. + crate fn upper_bound_in_region_scc(&self, r: RegionVid, upper: RegionVid) -> bool { + let r_scc = self.constraint_sccs.scc(r); + self.scc_values.contains(r_scc, upper) + } + + crate fn universal_regions(&self) -> &UniversalRegions<'tcx> { + self.universal_regions.as_ref() + } + + /// Tries to find the best constraint to blame for the fact that + /// `R: from_region`, where `R` is some region that meets + /// `target_test`. This works by following the constraint graph, + /// creating a constraint path that forces `R` to outlive + /// `from_region`, and then finding the best choices within that + /// path to blame. + crate fn best_blame_constraint( + &self, + body: &Body<'tcx>, + from_region: RegionVid, + from_region_origin: NLLRegionVariableOrigin, + target_test: impl Fn(RegionVid) -> bool, + ) -> (ConstraintCategory, bool, Span) { + debug!( + "best_blame_constraint(from_region={:?}, from_region_origin={:?})", + from_region, from_region_origin + ); + + // Find all paths + let (path, target_region) = + self.find_constraint_paths_between_regions(from_region, target_test).unwrap(); + debug!( + "best_blame_constraint: path={:#?}", + path.iter() + .map(|&c| format!( + "{:?} ({:?}: {:?})", + c, + self.constraint_sccs.scc(c.sup), + self.constraint_sccs.scc(c.sub), + )) + .collect::>() + ); + + // Classify each of the constraints along the path. + let mut categorized_path: Vec<(ConstraintCategory, bool, Span)> = path + .iter() + .map(|constraint| { + if constraint.category == ConstraintCategory::ClosureBounds { + self.retrieve_closure_constraint_info(body, &constraint) + } else { + (constraint.category, false, constraint.locations.span(body)) + } + }) + .collect(); + debug!("best_blame_constraint: categorized_path={:#?}", categorized_path); + + // To find the best span to cite, we first try to look for the + // final constraint that is interesting and where the `sup` is + // not unified with the ultimate target region. The reason + // for this is that we have a chain of constraints that lead + // from the source to the target region, something like: + // + // '0: '1 ('0 is the source) + // '1: '2 + // '2: '3 + // '3: '4 + // '4: '5 + // '5: '6 ('6 is the target) + // + // Some of those regions are unified with `'6` (in the same + // SCC). We want to screen those out. After that point, the + // "closest" constraint we have to the end is going to be the + // most likely to be the point where the value escapes -- but + // we still want to screen for an "interesting" point to + // highlight (e.g., a call site or something). + let target_scc = self.constraint_sccs.scc(target_region); + let mut range = 0..path.len(); + + // As noted above, when reporting an error, there is typically a chain of constraints + // leading from some "source" region which must outlive some "target" region. + // In most cases, we prefer to "blame" the constraints closer to the target -- + // but there is one exception. When constraints arise from higher-ranked subtyping, + // we generally prefer to blame the source value, + // as the "target" in this case tends to be some type annotation that the user gave. + // Therefore, if we find that the region origin is some instantiation + // of a higher-ranked region, we start our search from the "source" point + // rather than the "target", and we also tweak a few other things. + // + // An example might be this bit of Rust code: + // + // ```rust + // let x: fn(&'static ()) = |_| {}; + // let y: for<'a> fn(&'a ()) = x; + // ``` + // + // In MIR, this will be converted into a combination of assignments and type ascriptions. + // In particular, the 'static is imposed through a type ascription: + // + // ```rust + // x = ...; + // AscribeUserType(x, fn(&'static ()) + // y = x; + // ``` + // + // We wind up ultimately with constraints like + // + // ```rust + // !a: 'temp1 // from the `y = x` statement + // 'temp1: 'temp2 + // 'temp2: 'static // from the AscribeUserType + // ``` + // + // and here we prefer to blame the source (the y = x statement). + let blame_source = match from_region_origin { + NLLRegionVariableOrigin::FreeRegion + | NLLRegionVariableOrigin::Existential { from_forall: false } => true, + NLLRegionVariableOrigin::Placeholder(_) + | NLLRegionVariableOrigin::Existential { from_forall: true } => false, + }; + + let find_region = |i: &usize| { + let constraint = path[*i]; + + let constraint_sup_scc = self.constraint_sccs.scc(constraint.sup); + + if blame_source { + match categorized_path[*i].0 { + ConstraintCategory::OpaqueType + | ConstraintCategory::Boring + | ConstraintCategory::BoringNoLocation + | ConstraintCategory::Internal => false, + ConstraintCategory::TypeAnnotation + | ConstraintCategory::Return + | ConstraintCategory::Yield => true, + _ => constraint_sup_scc != target_scc, + } + } else { + match categorized_path[*i].0 { + ConstraintCategory::OpaqueType + | ConstraintCategory::Boring + | ConstraintCategory::BoringNoLocation + | ConstraintCategory::Internal => false, + _ => true, + } + } + }; + + let best_choice = + if blame_source { range.rev().find(find_region) } else { range.find(find_region) }; + + debug!( + "best_blame_constraint: best_choice={:?} blame_source={}", + best_choice, blame_source + ); + + if let Some(i) = best_choice { + if let Some(next) = categorized_path.get(i + 1) { + if categorized_path[i].0 == ConstraintCategory::Return + && next.0 == ConstraintCategory::OpaqueType + { + // The return expression is being influenced by the return type being + // impl Trait, point at the return type and not the return expr. + return *next; + } + } + return categorized_path[i]; + } + + // If that search fails, that is.. unusual. Maybe everything + // is in the same SCC or something. In that case, find what + // appears to be the most interesting point to report to the + // user via an even more ad-hoc guess. + categorized_path.sort_by(|p0, p1| p0.0.cmp(&p1.0)); + debug!("`: sorted_path={:#?}", categorized_path); + + *categorized_path.first().unwrap() + } } impl<'tcx> RegionDefinition<'tcx> { diff --git a/src/librustc_mir/borrow_check/region_infer/values.rs b/src/librustc_mir/borrow_check/region_infer/values.rs index 0bf0cd37cd..3126d44014 100644 --- a/src/librustc_mir/borrow_check/region_infer/values.rs +++ b/src/librustc_mir/borrow_check/region_infer/values.rs @@ -1,7 +1,7 @@ -use rustc::mir::{BasicBlock, Location, Body, ReadOnlyBodyAndCache}; +use rustc::mir::{BasicBlock, Body, Location, ReadOnlyBodyAndCache}; use rustc::ty::{self, RegionVid}; -use rustc_index::bit_set::{HybridBitSet, SparseBitMatrix}; use rustc_data_structures::fx::FxHashMap; +use rustc_index::bit_set::{HybridBitSet, SparseBitMatrix}; use rustc_index::vec::Idx; use rustc_index::vec::IndexVec; use std::fmt::Debug; @@ -22,7 +22,8 @@ crate struct RegionValueElements { impl RegionValueElements { crate fn new(body: &Body<'_>) -> Self { let mut num_points = 0; - let statements_before_block: IndexVec = body.basic_blocks() + let statements_before_block: IndexVec = body + .basic_blocks() .iter() .map(|block_data| { let v = num_points; @@ -30,10 +31,7 @@ impl RegionValueElements { v }) .collect(); - debug!( - "RegionValueElements: statements_before_block={:#?}", - statements_before_block - ); + debug!("RegionValueElements: statements_before_block={:#?}", statements_before_block); debug!("RegionValueElements: num_points={:#?}", num_points); let mut basic_blocks = IndexVec::with_capacity(num_points); @@ -41,11 +39,7 @@ impl RegionValueElements { basic_blocks.extend((0..=bb_data.statements.len()).map(|_| bb)); } - Self { - statements_before_block, - basic_blocks, - num_points, - } + Self { statements_before_block, basic_blocks, num_points } } /// Total number of point indices @@ -55,10 +49,7 @@ impl RegionValueElements { /// Converts a `Location` into a `PointIndex`. O(1). crate fn point_from_location(&self, location: Location) -> PointIndex { - let Location { - block, - statement_index, - } = location; + let Location { block, statement_index } = location; let start_index = self.statements_before_block[block]; PointIndex::new(start_index + statement_index) } @@ -75,10 +66,7 @@ impl RegionValueElements { let block = self.basic_blocks[index]; let start_index = self.statements_before_block[block]; let statement_index = index.index() - start_index; - Location { - block, - statement_index, - } + Location { block, statement_index } } /// Sometimes we get point-indices back from bitsets that may be @@ -96,10 +84,7 @@ impl RegionValueElements { index: PointIndex, stack: &mut Vec, ) { - let Location { - block, - statement_index, - } = self.to_location(index); + let Location { block, statement_index } = self.to_location(index); if statement_index == 0 { // If this is a basic block head, then the predecessors are // the terminators of other basic blocks @@ -129,7 +114,7 @@ rustc_index::newtype_index! { /// An individual element in a region value -- the value of a /// particular region variable consists of a set of these elements. -#[derive(Debug)] +#[derive(Debug, Clone)] crate enum RegionElement { /// A point in the control-flow graph. Location(Location), @@ -155,14 +140,11 @@ impl LivenessValues { /// Each of the regions in num_region_variables will be initialized with an /// empty set of points and no causal information. crate fn new(elements: Rc) -> Self { - Self { - points: SparseBitMatrix::new(elements.num_points), - elements: elements, - } + Self { points: SparseBitMatrix::new(elements.num_points), elements: elements } } /// Iterate through each region that has a value in this set. - crate fn rows(&self) -> impl Iterator { + crate fn rows(&self) -> impl Iterator { self.points.rows() } @@ -177,10 +159,7 @@ impl LivenessValues { /// Adds all the elements in the given bit array into the given /// region. Returns whether any of them are newly added. crate fn add_elements(&mut self, row: N, locations: &HybridBitSet) -> bool { - debug!( - "LivenessValues::add_elements(row={:?}, locations={:?})", - row, locations - ); + debug!("LivenessValues::add_elements(row={:?}, locations={:?})", row, locations); self.points.union_into_row(row, locations) } @@ -220,13 +199,8 @@ crate struct PlaceholderIndices { impl PlaceholderIndices { crate fn insert(&mut self, placeholder: ty::PlaceholderRegion) -> PlaceholderIndex { - let PlaceholderIndices { - to_index, - from_index, - } = self; - *to_index - .entry(placeholder) - .or_insert_with(|| from_index.push(placeholder)) + let PlaceholderIndices { to_index, from_index } = self; + *to_index.entry(placeholder).or_insert_with(|| from_index.push(placeholder)) } crate fn lookup_index(&self, placeholder: ty::PlaceholderRegion) -> PlaceholderIndex { @@ -355,10 +329,7 @@ impl RegionValues { &'a self, r: N, ) -> impl Iterator + 'a { - self.free_regions - .row(r) - .into_iter() - .flat_map(|set| set.iter()) + self.free_regions.row(r).into_iter().flat_map(|set| set.iter()) } /// Returns all the elements contained in a given region's value. @@ -377,15 +348,13 @@ impl RegionValues { crate fn elements_contained_in<'a>(&'a self, r: N) -> impl Iterator + 'a { let points_iter = self.locations_outlived_by(r).map(RegionElement::Location); - let free_regions_iter = self.universal_regions_outlived_by(r) - .map(RegionElement::RootUniversalRegion); + let free_regions_iter = + self.universal_regions_outlived_by(r).map(RegionElement::RootUniversalRegion); - let placeholder_universes_iter = self.placeholders_contained_in(r) - .map(RegionElement::PlaceholderRegion); + let placeholder_universes_iter = + self.placeholders_contained_in(r).map(RegionElement::PlaceholderRegion); - points_iter - .chain(free_regions_iter) - .chain(placeholder_universes_iter) + points_iter.chain(free_regions_iter).chain(placeholder_universes_iter) } /// Returns a "pretty" string value of the region. Meant for debugging. diff --git a/src/librustc_mir/borrow_check/renumber.rs b/src/librustc_mir/borrow_check/renumber.rs index ba323b113e..ab08cb0a31 100644 --- a/src/librustc_mir/borrow_check/renumber.rs +++ b/src/librustc_mir/borrow_check/renumber.rs @@ -1,8 +1,8 @@ +use rustc::infer::{InferCtxt, NLLRegionVariableOrigin}; +use rustc::mir::visit::{MutVisitor, TyContext}; +use rustc::mir::{BodyAndCache, Location, PlaceElem, Promoted}; use rustc::ty::subst::SubstsRef; use rustc::ty::{self, Ty, TyCtxt, TypeFoldable}; -use rustc::mir::{BodyAndCache, Location, PlaceElem, Promoted}; -use rustc::mir::visit::{MutVisitor, TyContext}; -use rustc::infer::{InferCtxt, NLLRegionVariableOrigin}; use rustc_index::vec::IndexVec; /// Replaces all free regions appearing in the MIR with fresh @@ -32,12 +32,10 @@ where { debug!("renumber_regions(value={:?})", value); - infcx - .tcx - .fold_regions(value, &mut false, |_region, _depth| { - let origin = NLLRegionVariableOrigin::Existential { from_forall: false }; - infcx.next_nll_region_var(origin) - }) + infcx.tcx.fold_regions(value, &mut false, |_region, _depth| { + let origin = NLLRegionVariableOrigin::Existential { from_forall: false }; + infcx.next_nll_region_var(origin) + }) } struct NLLVisitor<'a, 'tcx> { @@ -66,10 +64,7 @@ impl<'a, 'tcx> MutVisitor<'tcx> for NLLVisitor<'a, 'tcx> { debug!("visit_ty: ty={:?}", ty); } - fn process_projection_elem( - &mut self, - elem: &PlaceElem<'tcx>, - ) -> Option> { + fn process_projection_elem(&mut self, elem: &PlaceElem<'tcx>) -> Option> { if let PlaceElem::Field(field, ty) = elem { let new_ty = self.renumber_regions(ty); diff --git a/src/librustc_mir/borrow_check/type_check/constraint_conversion.rs b/src/librustc_mir/borrow_check/type_check/constraint_conversion.rs index 334477dff2..8f65a0f01c 100644 --- a/src/librustc_mir/borrow_check/type_check/constraint_conversion.rs +++ b/src/librustc_mir/borrow_check/type_check/constraint_conversion.rs @@ -1,5 +1,5 @@ -use rustc::infer::canonical::QueryRegionConstraints; use rustc::infer::canonical::QueryOutlivesConstraint; +use rustc::infer::canonical::QueryRegionConstraints; use rustc::infer::outlives::env::RegionBoundPairs; use rustc::infer::outlives::obligations::{TypeOutlives, TypeOutlivesDelegate}; use rustc::infer::region_constraints::{GenericKind, VerifyBound}; @@ -7,14 +7,14 @@ use rustc::infer::{self, InferCtxt, SubregionOrigin}; use rustc::mir::ConstraintCategory; use rustc::ty::subst::GenericArgKind; use rustc::ty::{self, TyCtxt}; -use syntax_pos::DUMMY_SP; +use rustc_span::DUMMY_SP; use crate::borrow_check::{ constraints::OutlivesConstraint, + nll::ToRegionVid, region_infer::TypeTest, type_check::{Locations, MirTypeckRegionConstraints}, universal_regions::UniversalRegions, - nll::ToRegionVid, }; crate struct ConstraintConversion<'a, 'tcx> { @@ -62,15 +62,10 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> { // `self.constraints`, but we also want to be mutating // `self.member_constraints`. For now, just swap out the value // we want and replace at the end. - let mut tmp = std::mem::replace( - &mut self.constraints.member_constraints, - Default::default(), - ); + let mut tmp = + std::mem::replace(&mut self.constraints.member_constraints, Default::default()); for member_constraint in member_constraints { - tmp.push_constraint( - member_constraint, - |r| self.to_region_vid(r), - ); + tmp.push_constraint(member_constraint, |r| self.to_region_vid(r)); } self.constraints.member_constraints = tmp; @@ -84,24 +79,16 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> { // Extract out various useful fields we'll need below. let ConstraintConversion { - tcx, - region_bound_pairs, - implicit_region_bound, - param_env, - .. + tcx, region_bound_pairs, implicit_region_bound, param_env, .. } = *self; // At the moment, we never generate any "higher-ranked" // region constraints like `for<'a> 'a: 'b`. At some point // when we move to universes, we will, and this assertion // will start to fail. - let ty::OutlivesPredicate(k1, r2) = - query_constraint.no_bound_vars().unwrap_or_else(|| { - bug!( - "query_constraint {:?} contained bound vars", - query_constraint, - ); - }); + let ty::OutlivesPredicate(k1, r2) = query_constraint.no_bound_vars().unwrap_or_else(|| { + bug!("query_constraint {:?} contained bound vars", query_constraint,); + }); match k1.unpack() { GenericArgKind::Lifetime(r1) => { @@ -121,7 +108,8 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> { region_bound_pairs, implicit_region_bound, param_env, - ).type_must_outlive(origin, t1, r2); + ) + .type_must_outlive(origin, t1, r2); } GenericArgKind::Const(_) => { @@ -139,33 +127,24 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> { ) -> TypeTest<'tcx> { let lower_bound = self.to_region_vid(region); - TypeTest { - generic_kind, - lower_bound, - locations: self.locations, - verify_bound, - } + TypeTest { generic_kind, lower_bound, locations: self.locations, verify_bound } } fn to_region_vid(&mut self, r: ty::Region<'tcx>) -> ty::RegionVid { if let ty::RePlaceholder(placeholder) = r { - self.constraints - .placeholder_region(self.infcx, *placeholder) - .to_region_vid() + self.constraints.placeholder_region(self.infcx, *placeholder).to_region_vid() } else { self.universal_regions.to_region_vid(r) } } fn add_outlives(&mut self, sup: ty::RegionVid, sub: ty::RegionVid) { - self.constraints - .outlives_constraints - .push(OutlivesConstraint { - locations: self.locations, - category: self.category, - sub, - sup, - }); + self.constraints.outlives_constraints.push(OutlivesConstraint { + locations: self.locations, + category: self.category, + sub, + sup, + }); } fn add_type_test(&mut self, type_test: TypeTest<'tcx>) { diff --git a/src/librustc_mir/borrow_check/type_check/free_region_relations.rs b/src/librustc_mir/borrow_check/type_check/free_region_relations.rs index 03a7f97ac5..f0dc94f417 100644 --- a/src/librustc_mir/borrow_check/type_check/free_region_relations.rs +++ b/src/librustc_mir/borrow_check/type_check/free_region_relations.rs @@ -1,20 +1,20 @@ use rustc::infer::canonical::QueryRegionConstraints; -use rustc::infer::outlives::free_region_map::FreeRegionRelations; use rustc::infer::region_constraints::GenericKind; use rustc::infer::InferCtxt; use rustc::mir::ConstraintCategory; use rustc::traits::query::outlives_bounds::{self, OutlivesBound}; use rustc::traits::query::type_op::{self, TypeOp}; +use rustc::ty::free_region_map::FreeRegionRelations; use rustc::ty::{self, RegionVid, Ty}; use rustc_data_structures::transitive_relation::TransitiveRelation; +use rustc_span::DUMMY_SP; use std::rc::Rc; -use syntax_pos::DUMMY_SP; use crate::borrow_check::{ + nll::ToRegionVid, type_check::constraint_conversion, type_check::{Locations, MirTypeckRegionConstraints}, universal_regions::UniversalRegions, - nll::ToRegionVid, }; #[derive(Debug)] @@ -76,7 +76,8 @@ crate fn create( outlives: Default::default(), inverse_outlives: Default::default(), }, - }.create() + } + .create() } impl UniversalRegionRelations<'tcx> { @@ -84,10 +85,7 @@ impl UniversalRegionRelations<'tcx> { /// `inverse_outlives_relation`) that `fr_a: fr_b`. Invoked by the /// builder below. fn relate_universal_regions(&mut self, fr_a: RegionVid, fr_b: RegionVid) { - debug!( - "relate_universal_regions: fr_a={:?} outlives fr_b={:?}", - fr_a, fr_b - ); + debug!("relate_universal_regions: fr_a={:?} outlives fr_b={:?}", fr_a, fr_b); self.outlives.add(fr_a, fr_b); self.inverse_outlives.add(fr_b, fr_a); } @@ -126,9 +124,7 @@ impl UniversalRegionRelations<'tcx> { // In case we find more than one, reduce to one for // convenience. This is to prevent us from generating more // complex constraints, but it will cause spurious errors. - let post_dom = self - .inverse_outlives - .mutual_immediate_postdominator(upper_bounds); + let post_dom = self.inverse_outlives.mutual_immediate_postdominator(upper_bounds); debug!("non_local_bound: post_dom={:?}", post_dom); @@ -145,7 +141,6 @@ impl UniversalRegionRelations<'tcx> { .unwrap_or(self.universal_regions.fr_static) } - /// Finds a "lower bound" for `fr` that is not local. In other /// words, returns the largest (*) known region `fr1` that (a) is /// outlived by `fr` and (b) is not local. @@ -159,22 +154,19 @@ impl UniversalRegionRelations<'tcx> { // In case we find more than one, reduce to one for // convenience. This is to prevent us from generating more // complex constraints, but it will cause spurious errors. - let post_dom = self - .outlives - .mutual_immediate_postdominator(lower_bounds); + let post_dom = self.outlives.mutual_immediate_postdominator(lower_bounds); debug!("non_local_bound: post_dom={:?}", post_dom); - post_dom - .and_then(|&post_dom| { - // If the mutual immediate postdom is not local, then - // there is no non-local result we can return. - if !self.universal_regions.is_local_free_region(post_dom) { - Some(post_dom) - } else { - None - } - }) + post_dom.and_then(|&post_dom| { + // If the mutual immediate postdom is not local, then + // there is no non-local result we can return. + if !self.universal_regions.is_local_free_region(post_dom) { + Some(post_dom) + } else { + None + } + }) } /// Helper for `non_local_upper_bounds` and `non_local_lower_bounds`. @@ -222,7 +214,7 @@ impl UniversalRegionRelations<'tcx> { } /// Returns the _non-transitive_ set of known `outlives` constraints between free regions. - crate fn known_outlives(&self) -> impl Iterator { + crate fn known_outlives(&self) -> impl Iterator { self.outlives.base_edges() } } @@ -268,9 +260,7 @@ impl UniversalRegionRelationsBuilder<'cx, 'tcx> { .unwrap_or_else(|_| bug!("failed to normalize {:?}", ty)); let constraints2 = self.add_implied_bounds(ty); normalized_inputs_and_output.push(ty); - constraints1 - .into_iter() - .chain(constraints2) + constraints1.into_iter().chain(constraints2) }) .collect(); @@ -286,10 +276,7 @@ impl UniversalRegionRelationsBuilder<'cx, 'tcx> { let fr_static = self.universal_regions.fr_static; let fr_fn_body = self.universal_regions.fr_fn_body; for fr in self.universal_regions.universal_regions() { - debug!( - "build: relating free region {:?} to itself and to 'static", - fr - ); + debug!("build: relating free region {:?} to itself and to 'static", fr); self.relations.relate_universal_regions(fr, fr); self.relations.relate_universal_regions(fr_static, fr); self.relations.relate_universal_regions(fr, fr_fn_body); @@ -305,7 +292,8 @@ impl UniversalRegionRelationsBuilder<'cx, 'tcx> { Locations::All(DUMMY_SP), ConstraintCategory::Internal, &mut self.constraints, - ).convert_all(data); + ) + .convert_all(data); } CreateResult { @@ -321,8 +309,8 @@ impl UniversalRegionRelationsBuilder<'cx, 'tcx> { /// from this local. fn add_implied_bounds(&mut self, ty: Ty<'tcx>) -> Option>> { debug!("add_implied_bounds(ty={:?})", ty); - let (bounds, constraints) = - self.param_env + let (bounds, constraints) = self + .param_env .and(type_op::implied_outlives_bounds::ImpliedOutlivesBounds { ty }) .fully_perform(self.infcx) .unwrap_or_else(|_| bug!("failed to compute implied bounds {:?}", ty)); @@ -356,13 +344,11 @@ impl UniversalRegionRelationsBuilder<'cx, 'tcx> { } OutlivesBound::RegionSubParam(r_a, param_b) => { - self.region_bound_pairs - .push((r_a, GenericKind::Param(param_b))); + self.region_bound_pairs.push((r_a, GenericKind::Param(param_b))); } OutlivesBound::RegionSubProjection(r_a, projection_b) => { - self.region_bound_pairs - .push((r_a, GenericKind::Projection(projection_b))); + self.region_bound_pairs.push((r_a, GenericKind::Projection(projection_b))); } } } diff --git a/src/librustc_mir/borrow_check/type_check/input_output.rs b/src/librustc_mir/borrow_check/type_check/input_output.rs index 3df04909d0..3d3b1e5cbf 100644 --- a/src/librustc_mir/borrow_check/type_check/input_output.rs +++ b/src/librustc_mir/borrow_check/type_check/input_output.rs @@ -12,7 +12,7 @@ use rustc::mir::*; use rustc::ty::Ty; use rustc_index::vec::Idx; -use syntax_pos::Span; +use rustc_span::Span; use crate::borrow_check::universal_regions::UniversalRegions; @@ -69,10 +69,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { // In MIR, argument N is stored in local N+1. let local = Local::new(argument_index + 1); - debug!( - "equate_inputs_and_outputs: normalized_input_ty = {:?}", - normalized_input_ty - ); + debug!("equate_inputs_and_outputs: normalized_input_ty = {:?}", normalized_input_ty); let mir_input_ty = body.local_decls[local].ty; let mir_input_span = body.local_decls[local].source_info.span; @@ -145,7 +142,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { user_provided_output_ty, self.mir_def_id, Locations::All(output_span), - ConstraintCategory::BoringNoLocation + ConstraintCategory::BoringNoLocation, ) { span_mirbug!( self, @@ -162,12 +159,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { fn equate_normalized_input_or_output(&mut self, a: Ty<'tcx>, b: Ty<'tcx>, span: Span) { debug!("equate_normalized_input_or_output(a={:?}, b={:?})", a, b); - if let Err(terr) = self.eq_types( - a, - b, - Locations::All(span), - ConstraintCategory::BoringNoLocation, - ) { + if let Err(terr) = + self.eq_types(a, b, Locations::All(span), ConstraintCategory::BoringNoLocation) + { span_mirbug!( self, Location::START, diff --git a/src/librustc_mir/borrow_check/type_check/liveness/local_use_map.rs b/src/librustc_mir/borrow_check/type_check/liveness/local_use_map.rs index 75e4f61245..8155aa0ee0 100644 --- a/src/librustc_mir/borrow_check/type_check/liveness/local_use_map.rs +++ b/src/librustc_mir/borrow_check/type_check/liveness/local_use_map.rs @@ -1,7 +1,7 @@ use rustc::mir::visit::{PlaceContext, Visitor}; use rustc::mir::{Local, Location, ReadOnlyBodyAndCache}; -use rustc_index::vec::{Idx, IndexVec}; use rustc_data_structures::vec_linked_list as vll; +use rustc_index::vec::IndexVec; use crate::util::liveness::{categorize, DefUse}; diff --git a/src/librustc_mir/borrow_check/type_check/liveness/mod.rs b/src/librustc_mir/borrow_check/type_check/liveness/mod.rs index ee3d89e741..e461ce739a 100644 --- a/src/librustc_mir/borrow_check/type_check/liveness/mod.rs +++ b/src/librustc_mir/borrow_check/type_check/liveness/mod.rs @@ -8,12 +8,12 @@ use crate::dataflow::FlowAtLocation; use crate::dataflow::MaybeInitializedPlaces; use crate::borrow_check::{ - location::LocationTable, constraints::OutlivesConstraintSet, facts::{AllFacts, AllFactsExt}, + location::LocationTable, + nll::ToRegionVid, region_infer::values::RegionValueElements, universal_regions::UniversalRegions, - nll::ToRegionVid, }; use super::TypeChecker; @@ -50,13 +50,7 @@ pub(super) fn generate<'tcx>( let polonius_drop_used = if facts_enabled { let mut drop_used = Vec::new(); - polonius::populate_access_facts( - typeck, - body, - location_table, - move_data, - &mut drop_used, - ); + polonius::populate_access_facts(typeck, body, location_table, move_data, &mut drop_used); Some(drop_used) } else { None diff --git a/src/librustc_mir/borrow_check/type_check/liveness/polonius.rs b/src/librustc_mir/borrow_check/type_check/liveness/polonius.rs index 0354b0d6b9..055415f287 100644 --- a/src/librustc_mir/borrow_check/type_check/liveness/polonius.rs +++ b/src/librustc_mir/borrow_check/type_check/liveness/polonius.rs @@ -103,9 +103,9 @@ pub(super) fn populate_access_facts( }; extractor.visit_body(body); - facts.var_drop_used.extend(drop_used.iter().map(|&(local, location)| { - (local, location_table.mid_index(location)) - })); + facts.var_drop_used.extend( + drop_used.iter().map(|&(local, location)| (local, location_table.mid_index(location))), + ); for (local, local_decl) in body.local_decls.iter_enumerated() { debug!("add var_uses_regions facts - local={:?}, type={:?}", local, local_decl.ty); diff --git a/src/librustc_mir/borrow_check/type_check/liveness/trace.rs b/src/librustc_mir/borrow_check/type_check/liveness/trace.rs index 9afd25a0f7..ebb925ae0c 100644 --- a/src/librustc_mir/borrow_check/type_check/liveness/trace.rs +++ b/src/librustc_mir/borrow_check/type_check/liveness/trace.rs @@ -4,8 +4,8 @@ use rustc::traits::query::dropck_outlives::DropckOutlivesResult; use rustc::traits::query::type_op::outlives::DropckOutlives; use rustc::traits::query::type_op::TypeOp; use rustc::ty::{Ty, TypeFoldable}; -use rustc_index::bit_set::HybridBitSet; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_index::bit_set::HybridBitSet; use std::rc::Rc; use crate::dataflow::indexes::MovePathIndex; @@ -171,12 +171,7 @@ impl LivenessResults<'me, 'typeck, 'flow, 'tcx> { if !live_locals.contains(&local) { let local_ty = self.cx.body.local_decls[local].ty; if local_ty.has_free_regions() { - self.cx.add_drop_live_facts_for( - local, - local_ty, - &[location], - &locations, - ); + self.cx.add_drop_live_facts_for(local, local_ty, &[location], &locations); } } } diff --git a/src/librustc_mir/borrow_check/type_check/mod.rs b/src/librustc_mir/borrow_check/type_check/mod.rs index b48f45b209..7d98cf90ee 100644 --- a/src/librustc_mir/borrow_check/type_check/mod.rs +++ b/src/librustc_mir/borrow_check/type_check/mod.rs @@ -1,60 +1,58 @@ //! This pass type-checks the MIR to ensure it is not broken. -use std::{fmt, iter, mem}; use std::rc::Rc; +use std::{fmt, iter, mem}; use either::Either; -use rustc::hir; -use rustc::hir::def_id::DefId; -use rustc::infer::{InferCtxt, InferOk, LateBoundRegionConversionTime, NLLRegionVariableOrigin}; use rustc::infer::canonical::QueryRegionConstraints; use rustc::infer::outlives::env::RegionBoundPairs; use rustc::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; -use rustc::mir::*; +use rustc::infer::{InferCtxt, InferOk, LateBoundRegionConversionTime, NLLRegionVariableOrigin}; use rustc::mir::interpret::PanicInfo; use rustc::mir::tcx::PlaceTy; use rustc::mir::visit::{NonMutatingUseContext, PlaceContext, Visitor}; -use rustc::traits::{self, ObligationCause, PredicateObligations}; -use rustc::traits::query::{Fallible, NoSolution}; +use rustc::mir::*; use rustc::traits::query::type_op; use rustc::traits::query::type_op::custom::CustomTypeOp; -use rustc::ty::{ - self, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, RegionVid, ToPolyTraitRef, Ty, - TyCtxt, UserType, - UserTypeAnnotationIndex, -}; +use rustc::traits::query::{Fallible, NoSolution}; +use rustc::traits::{self, ObligationCause, PredicateObligations}; use rustc::ty::adjustment::PointerCast; use rustc::ty::cast::CastTy; use rustc::ty::fold::TypeFoldable; use rustc::ty::layout::VariantIdx; use rustc::ty::subst::{GenericArgKind, Subst, SubstsRef, UserSubsts}; +use rustc::ty::{ + self, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, RegionVid, ToPolyTraitRef, Ty, + TyCtxt, UserType, UserTypeAnnotationIndex, +}; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; -use rustc_error_codes::*; +use rustc_errors::struct_span_err; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; use rustc_index::vec::{Idx, IndexVec}; -use syntax_pos::{DUMMY_SP, Span}; +use rustc_span::{Span, DUMMY_SP}; +use syntax::ast; +use crate::dataflow::move_paths::MoveData; use crate::dataflow::FlowAtLocation; use crate::dataflow::MaybeInitializedPlaces; -use crate::dataflow::move_paths::MoveData; use crate::transform::promote_consts::should_suggest_const_in_array_repeat_expressions_attribute; use crate::borrow_check::{ borrow_set::BorrowSet, + constraints::{OutlivesConstraint, OutlivesConstraintSet}, + facts::AllFacts, location::LocationTable, - constraints::{OutlivesConstraintSet, OutlivesConstraint}, member_constraints::MemberConstraintSet, - facts::AllFacts, + nll::ToRegionVid, region_infer::values::{ LivenessValues, PlaceholderIndex, PlaceholderIndices, RegionValueElements, }, region_infer::{ClosureRegionRequirementsExt, TypeTest}, - type_check::free_region_relations::{ - CreateResult, UniversalRegionRelations, - }, - universal_regions::{DefiningTy, UniversalRegions}, - nll::ToRegionVid, renumber, + type_check::free_region_relations::{CreateResult, UniversalRegionRelations}, + universal_regions::{DefiningTy, UniversalRegions}, }; macro_rules! span_mirbug { @@ -172,26 +170,14 @@ pub(crate) fn type_check<'tcx>( &mut borrowck_context, &universal_region_relations, |mut cx| { - cx.equate_inputs_and_outputs( - &body, - universal_regions, - &normalized_inputs_and_output); - liveness::generate( - &mut cx, - body, - elements, - flow_inits, - move_data, - location_table); + cx.equate_inputs_and_outputs(&body, universal_regions, &normalized_inputs_and_output); + liveness::generate(&mut cx, body, elements, flow_inits, move_data, location_table); translate_outlives_facts(&mut cx); }, ); - MirTypeckResults { - constraints, - universal_region_relations, - } + MirTypeckResults { constraints, universal_region_relations } } fn type_check_internal<'a, 'tcx, R>( @@ -235,25 +221,23 @@ fn translate_outlives_facts(typeck: &mut TypeChecker<'_, '_>) { if let Some(facts) = cx.all_facts { let _prof_timer = typeck.infcx.tcx.prof.generic_activity("polonius_fact_generation"); let location_table = cx.location_table; - facts - .outlives - .extend(cx.constraints.outlives_constraints.outlives().iter().flat_map( - |constraint: &OutlivesConstraint| { - if let Some(from_location) = constraint.locations.from_location() { - Either::Left(iter::once(( - constraint.sup, - constraint.sub, - location_table.mid_index(from_location), - ))) - } else { - Either::Right( - location_table - .all_points() - .map(move |location| (constraint.sup, constraint.sub, location)), - ) - } - }, - )); + facts.outlives.extend(cx.constraints.outlives_constraints.outlives().iter().flat_map( + |constraint: &OutlivesConstraint| { + if let Some(from_location) = constraint.locations.from_location() { + Either::Left(iter::once(( + constraint.sup, + constraint.sub, + location_table.mid_index(from_location), + ))) + } else { + Either::Right( + location_table + .all_points() + .map(move |location| (constraint.sup, constraint.sub, location)), + ) + } + }, + )); } } @@ -311,7 +295,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> { if let Err(terr) = self.cx.relate_type_and_user_type( constant.literal.ty, ty::Variance::Invariant, - &UserTypeProjection { base: annotation_index, projs: vec![], }, + &UserTypeProjection { base: annotation_index, projs: vec![] }, location.to_locations(), ConstraintCategory::Boring, ) { @@ -327,23 +311,54 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> { } } else { let tcx = self.tcx(); - if let ty::ConstKind::Unevaluated(def_id, substs) = constant.literal.val { - if let Err(terr) = self.cx.fully_perform_op( - location.to_locations(), - ConstraintCategory::Boring, - self.cx.param_env.and(type_op::ascribe_user_type::AscribeUserType::new( - constant.literal.ty, - def_id, - UserSubsts { substs, user_self_ty: None }, - )), - ) { - span_mirbug!( - self, - constant, - "bad constant type {:?} ({:?})", - constant, - terr - ); + if let ty::ConstKind::Unevaluated(def_id, substs, promoted) = constant.literal.val { + if let Some(promoted) = promoted { + let check_err = |verifier: &mut TypeVerifier<'a, 'b, 'tcx>, + promoted: &ReadOnlyBodyAndCache<'_, 'tcx>, + ty, + san_ty| { + if let Err(terr) = verifier.cx.eq_types( + san_ty, + ty, + location.to_locations(), + ConstraintCategory::Boring, + ) { + span_mirbug!( + verifier, + promoted, + "bad promoted type ({:?}: {:?}): {:?}", + ty, + san_ty, + terr + ); + }; + }; + + if !self.errors_reported { + let promoted_body = self.promoted[promoted]; + self.sanitize_promoted(promoted_body, location); + + let promoted_ty = promoted_body.return_ty(); + check_err(self, &promoted_body, ty, promoted_ty); + } + } else { + if let Err(terr) = self.cx.fully_perform_op( + location.to_locations(), + ConstraintCategory::Boring, + self.cx.param_env.and(type_op::ascribe_user_type::AscribeUserType::new( + constant.literal.ty, + def_id, + UserSubsts { substs, user_self_ty: None }, + )), + ) { + span_mirbug!( + self, + constant, + "bad constant type {:?} ({:?})", + constant, + terr + ); + } } } else if let Some(static_def_id) = constant.check_static_ptr(tcx) { let unnormalized_ty = tcx.type_of(static_def_id); @@ -360,10 +375,9 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> { span_mirbug!(self, constant, "bad static type {:?} ({:?})", constant, terr); } } + if let ty::FnDef(def_id, substs) = constant.literal.ty.kind { - let instantiated_predicates = tcx - .predicates_of(def_id) - .instantiate(tcx, substs); + let instantiated_predicates = tcx.predicates_of(def_id).instantiate(tcx, substs); self.cx.normalize_and_prove_instantiated_predicates( instantiated_predicates, location.to_locations(), @@ -465,52 +479,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { ) -> PlaceTy<'tcx> { debug!("sanitize_place: {:?}", place); - let mut place_ty = match &place.base { - PlaceBase::Local(index) => - PlaceTy::from_ty(self.body.local_decls[*index].ty), - PlaceBase::Static(box Static { kind, ty, def_id }) => { - let san_ty = self.sanitize_type(place, ty); - let check_err = - |verifier: &mut TypeVerifier<'a, 'b, 'tcx>, - place: &Place<'tcx>, - ty, - san_ty| { - if let Err(terr) = verifier.cx.eq_types( - san_ty, - ty, - location.to_locations(), - ConstraintCategory::Boring, - ) { - span_mirbug!( - verifier, - place, - "bad promoted type ({:?}: {:?}): {:?}", - ty, - san_ty, - terr - ); - }; - }; - match kind { - StaticKind::Promoted(promoted, _) => { - if !self.errors_reported { - let promoted_body_cache = self.promoted[*promoted]; - self.sanitize_promoted(promoted_body_cache, location); - - let promoted_ty = promoted_body_cache.return_ty(); - check_err(self, place, promoted_ty, san_ty); - } - } - StaticKind::Static => { - let ty = self.tcx().type_of(*def_id); - let ty = self.cx.normalize(ty, location); - - check_err(self, place, ty, san_ty); - } - } - PlaceTy::from_ty(san_ty) - } - }; + let mut place_ty = PlaceTy::from_ty(self.body.local_decls[place.local].ty); for elem in place.projection.iter() { if place_ty.variant_index.is_none() { @@ -523,41 +492,28 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { } if let PlaceContext::NonMutatingUse(NonMutatingUseContext::Copy) = context { - let is_promoted = match place.as_ref() { - PlaceRef { - base: &PlaceBase::Static(box Static { - kind: StaticKind::Promoted(..), - .. - }), - projection: &[], - } => true, - _ => false, + let tcx = self.tcx(); + let trait_ref = ty::TraitRef { + def_id: tcx.lang_items().copy_trait().unwrap(), + substs: tcx.mk_substs_trait(place_ty.ty, &[]), }; - if !is_promoted { - let tcx = self.tcx(); - let trait_ref = ty::TraitRef { - def_id: tcx.lang_items().copy_trait().unwrap(), - substs: tcx.mk_substs_trait(place_ty.ty, &[]), - }; - - // To have a `Copy` operand, the type `T` of the - // value must be `Copy`. Note that we prove that `T: Copy`, - // rather than using the `is_copy_modulo_regions` - // test. This is important because - // `is_copy_modulo_regions` ignores the resulting region - // obligations and assumes they pass. This can result in - // bounds from `Copy` impls being unsoundly ignored (e.g., - // #29149). Note that we decide to use `Copy` before knowing - // whether the bounds fully apply: in effect, the rule is - // that if a value of some type could implement `Copy`, then - // it must. - self.cx.prove_trait_ref( - trait_ref, - location.to_locations(), - ConstraintCategory::CopyBound, - ); - } + // To have a `Copy` operand, the type `T` of the + // value must be `Copy`. Note that we prove that `T: Copy`, + // rather than using the `is_copy_modulo_regions` + // test. This is important because + // `is_copy_modulo_regions` ignores the resulting region + // obligations and assumes they pass. This can result in + // bounds from `Copy` impls being unsoundly ignored (e.g., + // #29149). Note that we decide to use `Copy` before knowing + // whether the bounds fully apply: in effect, the rule is + // that if a value of some type could implement `Copy`, then + // it must. + self.cx.prove_trait_ref( + trait_ref, + location.to_locations(), + ConstraintCategory::CopyBound, + ); } place_ty @@ -566,7 +522,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { fn sanitize_promoted( &mut self, promoted_body: ReadOnlyBodyAndCache<'b, 'tcx>, - location: Location + location: Location, ) { // Determine the constraints from the promoted MIR by running the type // checker on the promoted MIR, then transfer the constraints back to @@ -579,24 +535,23 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { let all_facts = &mut None; let mut constraints = Default::default(); let mut closure_bounds = Default::default(); - let mut liveness_constraints = LivenessValues::new( - Rc::new(RegionValueElements::new(&promoted_body)), - ); + let mut liveness_constraints = + LivenessValues::new(Rc::new(RegionValueElements::new(&promoted_body))); // Don't try to add borrow_region facts for the promoted MIR let mut swap_constraints = |this: &mut Self| { mem::swap(this.cx.borrowck_context.all_facts, all_facts); mem::swap( &mut this.cx.borrowck_context.constraints.outlives_constraints, - &mut constraints + &mut constraints, ); mem::swap( &mut this.cx.borrowck_context.constraints.closure_bounds_mapping, - &mut closure_bounds + &mut closure_bounds, ); mem::swap( &mut this.cx.borrowck_context.constraints.liveness_constraints, - &mut liveness_constraints + &mut liveness_constraints, ); }; @@ -604,7 +559,6 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { self.visit_body(promoted_body); - if !self.errors_reported { // if verifier failed, don't do further checks to avoid ICEs self.cx.typeck_mir(promoted_body); @@ -629,23 +583,23 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { self.cx.borrowck_context.constraints.outlives_constraints.push(constraint) } for live_region in liveness_constraints.rows() { - self.cx.borrowck_context.constraints.liveness_constraints + self.cx + .borrowck_context + .constraints + .liveness_constraints .add_element(live_region, location); } if !closure_bounds.is_empty() { - let combined_bounds_mapping = closure_bounds - .into_iter() - .flat_map(|(_, value)| value) - .collect(); - let existing = self.cx.borrowck_context + let combined_bounds_mapping = + closure_bounds.into_iter().flat_map(|(_, value)| value).collect(); + let existing = self + .cx + .borrowck_context .constraints .closure_bounds_mapping .insert(location, combined_bounds_mapping); - assert!( - existing.is_none(), - "Multiple promoteds/closures at the same location." - ); + assert!(existing.is_none(), "Multiple promoteds/closures at the same location."); } } @@ -662,36 +616,28 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { match *pi { ProjectionElem::Deref => { let deref_ty = base_ty.builtin_deref(true); - PlaceTy::from_ty( - deref_ty.map(|t| t.ty).unwrap_or_else(|| { - span_mirbug_and_err!(self, place, "deref of non-pointer {:?}", base_ty) - }) - ) + PlaceTy::from_ty(deref_ty.map(|t| t.ty).unwrap_or_else(|| { + span_mirbug_and_err!(self, place, "deref of non-pointer {:?}", base_ty) + })) } ProjectionElem::Index(i) => { let index_ty = Place::from(i).ty(self.body, tcx).ty; if index_ty != tcx.types.usize { - PlaceTy::from_ty( - span_mirbug_and_err!(self, i, "index by non-usize {:?}", i), - ) + PlaceTy::from_ty(span_mirbug_and_err!(self, i, "index by non-usize {:?}", i)) } else { - PlaceTy::from_ty( - base_ty.builtin_index().unwrap_or_else(|| { - span_mirbug_and_err!(self, place, "index of non-array {:?}", base_ty) - }), - ) + PlaceTy::from_ty(base_ty.builtin_index().unwrap_or_else(|| { + span_mirbug_and_err!(self, place, "index of non-array {:?}", base_ty) + })) } } ProjectionElem::ConstantIndex { .. } => { // consider verifying in-bounds - PlaceTy::from_ty( - base_ty.builtin_index().unwrap_or_else(|| { - span_mirbug_and_err!(self, place, "index of non-array {:?}", base_ty) - }), - ) + PlaceTy::from_ty(base_ty.builtin_index().unwrap_or_else(|| { + span_mirbug_and_err!(self, place, "index of non-array {:?}", base_ty) + })) } - ProjectionElem::Subslice { from, to, from_end } => PlaceTy::from_ty( - match base_ty.kind { + ProjectionElem::Subslice { from, to, from_end } => { + PlaceTy::from_ty(match base_ty.kind { ty::Array(inner, _) => { assert!(!from_end, "array subslices should not use from_end"); tcx.mk_array(inner, (to - from) as u64) @@ -699,27 +645,22 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { ty::Slice(..) => { assert!(from_end, "slice subslices should use from_end"); base_ty - }, + } _ => span_mirbug_and_err!(self, place, "slice of non-array {:?}", base_ty), - }, - ), + }) + } ProjectionElem::Downcast(maybe_name, index) => match base_ty.kind { ty::Adt(adt_def, _substs) if adt_def.is_enum() => { if index.as_usize() >= adt_def.variants.len() { - PlaceTy::from_ty( - span_mirbug_and_err!( - self, - place, - "cast to variant #{:?} but enum only has {:?}", - index, - adt_def.variants.len() - ), - ) + PlaceTy::from_ty(span_mirbug_and_err!( + self, + place, + "cast to variant #{:?} but enum only has {:?}", + index, + adt_def.variants.len() + )) } else { - PlaceTy { - ty: base_ty, - variant_index: Some(index), - } + PlaceTy { ty: base_ty, variant_index: Some(index) } } } // We do not need to handle generators here, because this runs @@ -737,26 +678,28 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { span_mirbug_and_err!(self, place, "can't downcast {:?}", base_ty) }; PlaceTy::from_ty(ty) - }, + } }, ProjectionElem::Field(field, fty) => { let fty = self.sanitize_type(place, fty); match self.field_ty(place, base, field, location) { - Ok(ty) => if let Err(terr) = self.cx.eq_types( - ty, - fty, - location.to_locations(), - ConstraintCategory::Boring, - ) { - span_mirbug!( - self, - place, - "bad field access ({:?}: {:?}): {:?}", + Ok(ty) => { + if let Err(terr) = self.cx.eq_types( ty, fty, - terr - ); - }, + location.to_locations(), + ConstraintCategory::Boring, + ) { + span_mirbug!( + self, + place, + "bad field access ({:?}: {:?}): {:?}", + ty, + fty, + terr + ); + } + } Err(FieldAccessError::OutOfRange { field_count }) => span_mirbug!( self, place, @@ -791,31 +734,30 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { let mut variants = substs.as_generator().state_tys(def_id, tcx); let mut variant = match variants.nth(variant_index.into()) { Some(v) => v, - None => { - bug!("variant_index of generator out of range: {:?}/{:?}", - variant_index, - substs.as_generator().state_tys(def_id, tcx).count()) - } + None => bug!( + "variant_index of generator out of range: {:?}/{:?}", + variant_index, + substs.as_generator().state_tys(def_id, tcx).count() + ), }; return match variant.nth(field.index()) { Some(ty) => Ok(ty), - None => Err(FieldAccessError::OutOfRange { - field_count: variant.count(), - }), - } + None => Err(FieldAccessError::OutOfRange { field_count: variant.count() }), + }; } _ => bug!("can't have downcast of non-adt non-generator type"), - } + }, PlaceTy { ty, variant_index: None } => match ty.kind { - ty::Adt(adt_def, substs) if !adt_def.is_enum() => - (&adt_def.variants[VariantIdx::new(0)], substs), + ty::Adt(adt_def, substs) if !adt_def.is_enum() => { + (&adt_def.variants[VariantIdx::new(0)], substs) + } ty::Closure(def_id, substs) => { return match substs.as_closure().upvar_tys(def_id, tcx).nth(field.index()) { Some(ty) => Ok(ty), None => Err(FieldAccessError::OutOfRange { field_count: substs.as_closure().upvar_tys(def_id, tcx).count(), }), - } + }; } ty::Generator(def_id, substs, _) => { // Only prefix fields (upvars and current state) are @@ -825,15 +767,13 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { None => Err(FieldAccessError::OutOfRange { field_count: substs.as_generator().prefix_tys(def_id, tcx).count(), }), - } + }; } ty::Tuple(tys) => { return match tys.get(field.index()) { Some(&ty) => Ok(ty.expect_ty()), - None => Err(FieldAccessError::OutOfRange { - field_count: tys.len(), - }), - } + None => Err(FieldAccessError::OutOfRange { field_count: tys.len() }), + }; } _ => { return Ok(span_mirbug_and_err!( @@ -841,7 +781,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { parent, "can't project out of {:?}", base_ty - )) + )); } }, }; @@ -849,9 +789,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { if let Some(field) = variant.fields.get(field.index()) { Ok(self.cx.normalize(&field.ty(tcx, substs), location)) } else { - Err(FieldAccessError::OutOfRange { - field_count: variant.fields.len(), - }) + Err(FieldAccessError::OutOfRange { field_count: variant.fields.len() }) } } } @@ -1042,13 +980,12 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { fn check_user_type_annotations(&mut self) { debug!( "check_user_type_annotations: user_type_annotations={:?}", - self.user_type_annotations + self.user_type_annotations ); for user_annotation in self.user_type_annotations { let CanonicalUserTypeAnnotation { span, ref user_ty, inferred_ty } = *user_annotation; - let (annotation, _) = self.infcx.instantiate_canonical_with_fresh_inference_vars( - span, user_ty - ); + let (annotation, _) = + self.infcx.instantiate_canonical_with_fresh_inference_vars(span, user_ty); match annotation { UserType::Ty(mut ty) => { ty = self.normalize(ty, Locations::All(span)); @@ -1074,13 +1011,15 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { Locations::All(span), ConstraintCategory::TypeAnnotation, ); - }, + } UserType::TypeOf(def_id, user_substs) => { if let Err(terr) = self.fully_perform_op( Locations::All(span), ConstraintCategory::BoringNoLocation, self.param_env.and(type_op::ascribe_user_type::AscribeUserType::new( - inferred_ty, def_id, user_substs, + inferred_ty, + def_id, + user_substs, )), ) { span_mirbug!( @@ -1093,7 +1032,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { terr ); } - }, + } } } } @@ -1129,10 +1068,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { category: ConstraintCategory, data: &QueryRegionConstraints<'tcx>, ) { - debug!( - "push_region_constraints: constraints generated at {:?} are {:#?}", - locations, data - ); + debug!("push_region_constraints: constraints generated at {:?} are {:#?}", locations, data); constraint_conversion::ConstraintConversion::new( self.infcx, @@ -1143,7 +1079,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { locations, category, &mut self.borrowck_context.constraints, - ).convert_all(data); + ) + .convert_all(data); } /// Convenient wrapper around `relate_tys::relate_types` -- see @@ -1242,8 +1179,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { ); curr_projected_ty = projected_ty; } - debug!("user_ty base: {:?} freshened: {:?} projs: {:?} yields: {:?}", - user_ty.base, annotated_type, user_ty.projs, curr_projected_ty); + debug!( + "user_ty base: {:?} freshened: {:?} projs: {:?} yields: {:?}", + user_ty.base, annotated_type, user_ty.projs, curr_projected_ty + ); let ty = curr_projected_ty.ty; self.relate_types(a, v, ty, locations, category)?; @@ -1293,16 +1232,19 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { revealed_ty={:?}", output_ty, opaque_type_map, revealed_ty ); - obligations.add(infcx - .at(&ObligationCause::dummy(), param_env) - .eq(output_ty, revealed_ty)?); + obligations.add( + infcx + .at(&ObligationCause::dummy(), param_env) + .eq(output_ty, revealed_ty)?, + ); for (&opaque_def_id, opaque_decl) in &opaque_type_map { let opaque_defn_ty = tcx.type_of(opaque_def_id); let opaque_defn_ty = opaque_defn_ty.subst(tcx, opaque_decl.substs); let opaque_defn_ty = renumber::renumber_regions(infcx, &opaque_defn_ty); let concrete_is_opaque = infcx - .resolve_vars_if_possible(&opaque_decl.concrete_ty).is_impl_trait(); + .resolve_vars_if_possible(&opaque_decl.concrete_ty) + .is_impl_trait(); debug!( "eq_opaque_type_and_type: concrete_ty={:?}={:?} opaque_defn_ty={:?} \ @@ -1334,9 +1276,11 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { // gets 'revealed' into if !concrete_is_opaque { - obligations.add(infcx - .at(&ObligationCause::dummy(), param_env) - .eq(opaque_decl.concrete_ty, opaque_defn_ty)?); + obligations.add( + infcx + .at(&ObligationCause::dummy(), param_env) + .eq(opaque_decl.concrete_ty, opaque_defn_ty)?, + ); } } @@ -1369,10 +1313,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { &opaque_decl, universal_region_relations, ); - Ok(InferOk { - value: (), - obligations: vec![], - }) + Ok(InferOk { value: (), obligations: vec![] }) }, || "opaque_type_map".to_string(), ), @@ -1390,33 +1331,33 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { &mut self, body: ReadOnlyBodyAndCache<'_, 'tcx>, stmt: &Statement<'tcx>, - location: Location) - { + location: Location, + ) { debug!("check_stmt: {:?}", stmt); let tcx = self.tcx(); match stmt.kind { - StatementKind::Assign(box(ref place, ref rv)) => { + StatementKind::Assign(box (ref place, ref rv)) => { // Assignments to temporaries are not "interesting"; // they are not caused by the user, but rather artifacts // of lowering. Assignments to other sorts of places *are* interesting // though. let category = match place.as_local() { - Some(RETURN_PLACE) => if let BorrowCheckContext { - universal_regions: - UniversalRegions { - defining_ty: DefiningTy::Const(def_id, _), - .. - }, - .. - } = self.borrowck_context { - if tcx.is_static(*def_id) { - ConstraintCategory::UseAsStatic + Some(RETURN_PLACE) => { + if let BorrowCheckContext { + universal_regions: + UniversalRegions { defining_ty: DefiningTy::Const(def_id, _), .. }, + .. + } = self.borrowck_context + { + if tcx.is_static(*def_id) { + ConstraintCategory::UseAsStatic + } else { + ConstraintCategory::UseAsConst + } } else { - ConstraintCategory::UseAsConst + ConstraintCategory::Return } - } else { - ConstraintCategory::Return - }, + } Some(l) if !body.local_decls[l].is_user_variable() => { ConstraintCategory::Boring } @@ -1444,7 +1385,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { if let Err(terr) = self.relate_type_and_user_type( rv_ty, ty::Variance::Invariant, - &UserTypeProjection { base: annotation_index, projs: vec![], }, + &UserTypeProjection { base: annotation_index, projs: vec![] }, location.to_locations(), ConstraintCategory::Boring, ) { @@ -1473,10 +1414,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { ); } } - StatementKind::SetDiscriminant { - ref place, - variant_index, - } => { + StatementKind::SetDiscriminant { ref place, variant_index } => { let place_type = place.ty(*body, tcx).ty; let adt = match place_type.kind { ty::Adt(adt, _) if adt.is_enum() => adt, @@ -1498,7 +1436,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { ); }; } - StatementKind::AscribeUserType(box(ref place, ref projection), variance) => { + StatementKind::AscribeUserType(box (ref place, ref projection), variance) => { let place_ty = place.ty(*body, tcx).ty; if let Err(terr) = self.relate_type_and_user_type( place_ty, @@ -1549,12 +1487,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { // no checks needed for these } - TerminatorKind::DropAndReplace { - ref location, - ref value, - target: _, - unwind: _, - } => { + TerminatorKind::DropAndReplace { ref location, ref value, target: _, unwind: _ } => { let place_ty = location.ty(body, tcx).ty; let rv_ty = value.ty(body, tcx); @@ -1572,11 +1505,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { ); } } - TerminatorKind::SwitchInt { - ref discr, - switch_ty, - .. - } => { + TerminatorKind::SwitchInt { ref discr, switch_ty, .. } => { let discr_ty = discr.ty(body, tcx); if let Err(terr) = self.sub_types( discr_ty, @@ -1598,13 +1527,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } // FIXME: check the values } - TerminatorKind::Call { - ref func, - ref args, - ref destination, - from_hir_call, - .. - } => { + TerminatorKind::Call { ref func, ref args, ref destination, from_hir_call, .. } => { let func_ty = func.ty(body, tcx); debug!("check_terminator: call, func_ty={:?}", func_ty); let sig = match func_ty.kind { @@ -1636,9 +1559,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { // output) types in the signature must be live, since // all the inputs that fed into it were live. for &late_bound_region in map.values() { - let region_vid = self.borrowck_context - .universal_regions - .to_region_vid(late_bound_region); + let region_vid = + self.borrowck_context.universal_regions.to_region_vid(late_bound_region); self.borrowck_context .constraints .liveness_constraints @@ -1647,9 +1569,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { self.check_call_inputs(body, term, &sig, args, term_location, from_hir_call); } - TerminatorKind::Assert { - ref cond, ref msg, .. - } => { + TerminatorKind::Assert { ref cond, ref msg, .. } => { let cond_ty = cond.ty(body, tcx); if cond_ty != tcx.types.bool { span_mirbug!(self, term, "bad Assert ({:?}, not bool", cond_ty); @@ -1707,10 +1627,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { Some(RETURN_PLACE) => { if let BorrowCheckContext { universal_regions: - UniversalRegions { - defining_ty: DefiningTy::Const(def_id, _), - .. - }, + UniversalRegions { defining_ty: DefiningTy::Const(def_id, _), .. }, .. } = self.borrowck_context { @@ -1802,21 +1719,31 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { TerminatorKind::Goto { target } => { self.assert_iscleanup(body, block_data, target, is_cleanup) } - TerminatorKind::SwitchInt { ref targets, .. } => for target in targets { - self.assert_iscleanup(body, block_data, *target, is_cleanup); - }, - TerminatorKind::Resume => if !is_cleanup { - span_mirbug!(self, block_data, "resume on non-cleanup block!") - }, - TerminatorKind::Abort => if !is_cleanup { - span_mirbug!(self, block_data, "abort on non-cleanup block!") - }, - TerminatorKind::Return => if is_cleanup { - span_mirbug!(self, block_data, "return on cleanup block") - }, - TerminatorKind::GeneratorDrop { .. } => if is_cleanup { - span_mirbug!(self, block_data, "generator_drop in cleanup block") - }, + TerminatorKind::SwitchInt { ref targets, .. } => { + for target in targets { + self.assert_iscleanup(body, block_data, *target, is_cleanup); + } + } + TerminatorKind::Resume => { + if !is_cleanup { + span_mirbug!(self, block_data, "resume on non-cleanup block!") + } + } + TerminatorKind::Abort => { + if !is_cleanup { + span_mirbug!(self, block_data, "abort on non-cleanup block!") + } + } + TerminatorKind::Return => { + if is_cleanup { + span_mirbug!(self, block_data, "return on cleanup block") + } + } + TerminatorKind::GeneratorDrop { .. } => { + if is_cleanup { + span_mirbug!(self, block_data, "generator_drop in cleanup block") + } + } TerminatorKind::Yield { resume, drop, .. } => { if is_cleanup { span_mirbug!(self, block_data, "yield in cleanup block") @@ -1829,11 +1756,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { TerminatorKind::Unreachable => {} TerminatorKind::Drop { target, unwind, .. } | TerminatorKind::DropAndReplace { target, unwind, .. } - | TerminatorKind::Assert { - target, - cleanup: unwind, - .. - } => { + | TerminatorKind::Assert { target, cleanup: unwind, .. } => { self.assert_iscleanup(body, block_data, target, is_cleanup); if let Some(unwind) = unwind { if is_cleanup { @@ -1842,11 +1765,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { self.assert_iscleanup(body, block_data, unwind, true); } } - TerminatorKind::Call { - ref destination, - cleanup, - .. - } => { + TerminatorKind::Call { ref destination, cleanup, .. } => { if let &Some((_, target)) = destination { self.assert_iscleanup(body, block_data, target, is_cleanup); } @@ -1857,25 +1776,15 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { self.assert_iscleanup(body, block_data, cleanup, true); } } - TerminatorKind::FalseEdges { - real_target, - imaginary_target, - } => { + TerminatorKind::FalseEdges { real_target, imaginary_target } => { self.assert_iscleanup(body, block_data, real_target, is_cleanup); self.assert_iscleanup(body, block_data, imaginary_target, is_cleanup); } - TerminatorKind::FalseUnwind { - real_target, - unwind, - } => { + TerminatorKind::FalseUnwind { real_target, unwind } => { self.assert_iscleanup(body, block_data, real_target, is_cleanup); if let Some(unwind) = unwind { if is_cleanup { - span_mirbug!( - self, - block_data, - "cleanup in cleanup block via false unwind" - ); + span_mirbug!(self, block_data, "cleanup in cleanup block via false unwind"); } self.assert_iscleanup(body, block_data, unwind, true); } @@ -1891,13 +1800,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { iscleanuppad: bool, ) { if body[bb].is_cleanup != iscleanuppad { - span_mirbug!( - self, - ctxt, - "cleanuppad mismatch: {:?} should be {:?}", - bb, - iscleanuppad - ); + span_mirbug!(self, ctxt, "cleanuppad mismatch: {:?} should be {:?}", bb, iscleanuppad); } } @@ -1971,9 +1874,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { if let Some(field) = variant.fields.get(adj_field_index) { Ok(self.normalize(field.ty(tcx, substs), location)) } else { - Err(FieldAccessError::OutOfRange { - field_count: variant.fields.len(), - }) + Err(FieldAccessError::OutOfRange { field_count: variant.fields.len() }) } } AggregateKind::Closure(def_id, substs) => { @@ -2006,8 +1907,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { &mut self, body: ReadOnlyBodyAndCache<'_, 'tcx>, rvalue: &Rvalue<'tcx>, - location: Location) - { + location: Location, + ) { let tcx = self.tcx(); match rvalue { @@ -2015,42 +1916,51 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { self.check_aggregate_rvalue(&body, rvalue, ak, ops, location) } - Rvalue::Repeat(operand, len) => if *len > 1 { - if let Operand::Move(_) = operand { - // While this is located in `nll::typeck` this error is not an NLL error, it's - // a required check to make sure that repeated elements implement `Copy`. - let span = body.source_info(location).span; - let ty = operand.ty(*body, tcx); - if !self.infcx.type_is_copy_modulo_regions(self.param_env, ty, span) { - // To determine if `const_in_array_repeat_expressions` feature gate should - // be mentioned, need to check if the rvalue is promotable. - let should_suggest = - should_suggest_const_in_array_repeat_expressions_attribute( - tcx, self.mir_def_id, body, operand); - debug!("check_rvalue: should_suggest={:?}", should_suggest); - - self.infcx.report_selection_error( - &traits::Obligation::new( - ObligationCause::new( - span, - self.tcx().hir().def_index_to_hir_id(self.mir_def_id.index), - traits::ObligationCauseCode::RepeatVec(should_suggest), - ), - self.param_env, - ty::Predicate::Trait(ty::Binder::bind(ty::TraitPredicate { - trait_ref: ty::TraitRef::new( - self.tcx().lang_items().copy_trait().unwrap(), - tcx.mk_substs_trait(ty, &[]), + Rvalue::Repeat(operand, len) => { + if *len > 1 { + if let Operand::Move(_) = operand { + // While this is located in `nll::typeck` this error is not an NLL error, it's + // a required check to make sure that repeated elements implement `Copy`. + let span = body.source_info(location).span; + let ty = operand.ty(*body, tcx); + if !self.infcx.type_is_copy_modulo_regions(self.param_env, ty, span) { + // To determine if `const_in_array_repeat_expressions` feature gate should + // be mentioned, need to check if the rvalue is promotable. + let should_suggest = + should_suggest_const_in_array_repeat_expressions_attribute( + tcx, + self.mir_def_id, + body, + operand, + ); + debug!("check_rvalue: should_suggest={:?}", should_suggest); + + self.infcx.report_selection_error( + &traits::Obligation::new( + ObligationCause::new( + span, + self.tcx().hir().def_index_to_hir_id(self.mir_def_id.index), + traits::ObligationCauseCode::RepeatVec(should_suggest), ), - })), - ), - &traits::SelectionError::Unimplemented, - false, - false, - ); + self.param_env, + ty::Predicate::Trait( + ty::Binder::bind(ty::TraitPredicate { + trait_ref: ty::TraitRef::new( + self.tcx().lang_items().copy_trait().unwrap(), + tcx.mk_substs_trait(ty, &[]), + ), + }), + ast::Constness::NotConst, + ), + ), + &traits::SelectionError::Unimplemented, + false, + false, + ); + } } } - }, + } Rvalue::NullaryOp(_, ty) => { // Even with unsized locals cannot box an unsized value. @@ -2175,7 +2085,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { let ty_from = match op.ty(*body, tcx).kind { ty::RawPtr(ty::TypeAndMut { ty: ty_from, - mutbl: hir::Mutability::Mutable, + mutbl: hir::Mutability::Mut, }) => ty_from, _ => { span_mirbug!( @@ -2190,7 +2100,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { let ty_to = match ty.kind { ty::RawPtr(ty::TypeAndMut { ty: ty_to, - mutbl: hir::Mutability::Immutable, + mutbl: hir::Mutability::Not, }) => ty_to, _ => { span_mirbug!( @@ -2219,18 +2129,17 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } } - CastKind::Pointer(PointerCast::ArrayToPointer) => { + CastKind::Pointer(PointerCast::ArrayToPointer) => { let ty_from = op.ty(*body, tcx); let opt_ty_elem = match ty_from.kind { - ty::RawPtr( - ty::TypeAndMut { mutbl: hir::Mutability::Immutable, ty: array_ty } - ) => { - match array_ty.kind { - ty::Array(ty_elem, _) => Some(ty_elem), - _ => None, - } - } + ty::RawPtr(ty::TypeAndMut { + mutbl: hir::Mutability::Not, + ty: array_ty, + }) => match array_ty.kind { + ty::Array(ty_elem, _) => Some(ty_elem), + _ => None, + }, _ => None, }; @@ -2248,11 +2157,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { }; let ty_to = match ty.kind { - ty::RawPtr( - ty::TypeAndMut { mutbl: hir::Mutability::Immutable, ty: ty_to } - ) => { - ty_to - } + ty::RawPtr(ty::TypeAndMut { + mutbl: hir::Mutability::Not, + ty: ty_to, + }) => ty_to, _ => { span_mirbug!( self, @@ -2286,54 +2194,23 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { let cast_ty_from = CastTy::from_ty(ty_from); let cast_ty_to = CastTy::from_ty(ty); match (cast_ty_from, cast_ty_to) { - (Some(CastTy::RPtr(ref_tm)), Some(CastTy::Ptr(ptr_tm))) => { - if let hir::Mutability::Mutable = ptr_tm.mutbl { - if let Err(terr) = self.eq_types( - ref_tm.ty, - ptr_tm.ty, - location.to_locations(), - ConstraintCategory::Cast, - ) { - span_mirbug!( - self, - rvalue, - "equating {:?} with {:?} yields {:?}", - ref_tm.ty, - ptr_tm.ty, - terr - ) - } - } else { - if let Err(terr) = self.sub_types( - ref_tm.ty, - ptr_tm.ty, - location.to_locations(), - ConstraintCategory::Cast, - ) { - span_mirbug!( - self, - rvalue, - "relating {:?} with {:?} yields {:?}", - ref_tm.ty, - ptr_tm.ty, - terr - ) - } - } - }, (None, _) | (_, None) | (_, Some(CastTy::FnPtr)) | (Some(CastTy::Float), Some(CastTy::Ptr(_))) | (Some(CastTy::Ptr(_)), Some(CastTy::Float)) - | (Some(CastTy::FnPtr), Some(CastTy::Float)) => span_mirbug!( - self, - rvalue, - "Invalid cast {:?} -> {:?}", - ty_from, - ty, - ), - _ => (), + | (Some(CastTy::FnPtr), Some(CastTy::Float)) => { + span_mirbug!(self, rvalue, "Invalid cast {:?} -> {:?}", ty_from, ty,) + } + (Some(CastTy::Int(_)), Some(CastTy::Int(_))) + | (Some(CastTy::Float), Some(CastTy::Int(_))) + | (Some(CastTy::Int(_)), Some(CastTy::Float)) + | (Some(CastTy::Float), Some(CastTy::Float)) + | (Some(CastTy::Ptr(_)), Some(CastTy::Int(_))) + | (Some(CastTy::FnPtr), Some(CastTy::Int(_))) + | (Some(CastTy::Int(_)), Some(CastTy::Ptr(_))) + | (Some(CastTy::Ptr(_)), Some(CastTy::Ptr(_))) + | (Some(CastTy::FnPtr), Some(CastTy::Ptr(_))) => (), } } } @@ -2352,25 +2229,24 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { let ty_left = left.ty(*body, tcx); if let ty::RawPtr(_) | ty::FnPtr(_) = ty_left.kind { let ty_right = right.ty(*body, tcx); - let common_ty = self.infcx.next_ty_var( - TypeVariableOrigin { - kind: TypeVariableOriginKind::MiscVariable, - span: body.source_info(location).span, - } - ); + let common_ty = self.infcx.next_ty_var(TypeVariableOrigin { + kind: TypeVariableOriginKind::MiscVariable, + span: body.source_info(location).span, + }); self.sub_types( common_ty, ty_left, location.to_locations(), - ConstraintCategory::Boring - ).unwrap_or_else(|err| { + ConstraintCategory::Boring, + ) + .unwrap_or_else(|err| { bug!("Could not equate type variable with {:?}: {:?}", ty_left, err) }); if let Err(terr) = self.sub_types( common_ty, ty_right, location.to_locations(), - ConstraintCategory::Boring + ConstraintCategory::Boring, ) { span_mirbug!( self, @@ -2384,7 +2260,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } } - Rvalue::Use(..) + Rvalue::AddressOf(..) + | Rvalue::Use(..) | Rvalue::Len(..) | Rvalue::BinaryOp(..) | Rvalue::CheckedBinaryOp(..) @@ -2401,6 +2278,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { Rvalue::Use(_) | Rvalue::Repeat(..) | Rvalue::Ref(..) + | Rvalue::AddressOf(..) | Rvalue::Len(..) | Rvalue::Cast(..) | Rvalue::BinaryOp(..) @@ -2485,13 +2363,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { borrowed_place: &Place<'tcx>, ) { // These constraints are only meaningful during borrowck: - let BorrowCheckContext { - borrow_set, - location_table, - all_facts, - constraints, - .. - } = self.borrowck_context; + let BorrowCheckContext { borrow_set, location_table, all_facts, constraints, .. } = + self.borrowck_context; // In Polonius mode, we also push a `borrow_region` fact // linking the loan to the region (in some cases, though, @@ -2529,7 +2402,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { match elem { ProjectionElem::Deref => { let tcx = self.infcx.tcx; - let base_ty = Place::ty_from(&borrowed_place.base, proj_base, body, tcx).ty; + let base_ty = Place::ty_from(&borrowed_place.local, proj_base, body, tcx).ty; debug!("add_reborrow_constraint - base_ty = {:?}", base_ty); match base_ty.kind { @@ -2542,13 +2415,13 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { }); match mutbl { - hir::Mutability::Immutable => { + hir::Mutability::Not => { // Immutable reference. We don't need the base // to be valid for the entire lifetime of // the borrow. break; } - hir::Mutability::Mutable => { + hir::Mutability::Mut => { // Mutable reference. We *do* need the base // to be valid, because after the base becomes // invalid, someone else can use our mutable deref. @@ -2684,10 +2557,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { &closure_region_requirements.outlives_requirements[idx]; Some(( (r1_vid, r2_vid), - ( - outlives_requirements.category, - outlives_requirements.blame_span, - ), + (outlives_requirements.category, outlives_requirements.blame_span), )) } GenericArgKind::Type(_) | GenericArgKind::Const(_) => None, @@ -2695,14 +2565,12 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { }) .collect(); - let existing = self.borrowck_context + let existing = self + .borrowck_context .constraints .closure_bounds_mapping .insert(location, bounds_mapping); - assert!( - existing.is_none(), - "Multiple closures at the same location." - ); + assert!(existing.is_none(), "Multiple closures at the same location."); self.push_region_constraints( location.to_locations(), @@ -2723,6 +2591,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { self.prove_predicates( Some(ty::Predicate::Trait( trait_ref.to_poly_trait_ref().to_poly_trait_predicate(), + ast::Constness::NotConst, )), locations, category, @@ -2747,10 +2616,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { category: ConstraintCategory, ) { for predicate in predicates { - debug!( - "prove_predicates(predicate={:?}, locations={:?})", - predicate, locations, - ); + debug!("prove_predicates(predicate={:?}, locations={:?})", predicate, locations,); self.prove_predicate(predicate, locations, category); } @@ -2762,17 +2628,15 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { locations: Locations, category: ConstraintCategory, ) { - debug!( - "prove_predicate(predicate={:?}, location={:?})", - predicate, locations, - ); + debug!("prove_predicate(predicate={:?}, location={:?})", predicate, locations,); let param_env = self.param_env; self.fully_perform_op( locations, category, param_env.and(type_op::prove_predicate::ProvePredicate::new(predicate)), - ).unwrap_or_else(|NoSolution| { + ) + .unwrap_or_else(|NoSolution| { span_mirbug!(self, NoSolution, "could not prove {:?}", predicate); }) } @@ -2786,10 +2650,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } for (block, block_data) in body.basic_blocks().iter_enumerated() { - let mut location = Location { - block, - statement_index: 0, - }; + let mut location = Location { block, statement_index: 0 }; for stmt in &block_data.statements { if !stmt.source_info.span.is_dummy() { self.last_span = stmt.source_info.span; @@ -2813,7 +2674,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { location.to_locations(), ConstraintCategory::Boring, param_env.and(type_op::normalize::Normalize::new(value)), - ).unwrap_or_else(|NoSolution| { + ) + .unwrap_or_else(|NoSolution| { span_mirbug!(self, NoSolution, "failed to normalize `{:?}`", value); value }) diff --git a/src/librustc_mir/borrow_check/type_check/relate_tys.rs b/src/librustc_mir/borrow_check/type_check/relate_tys.rs index 80da8a82c5..edbcd71515 100644 --- a/src/librustc_mir/borrow_check/type_check/relate_tys.rs +++ b/src/librustc_mir/borrow_check/type_check/relate_tys.rs @@ -1,4 +1,4 @@ -use rustc::infer::nll_relate::{TypeRelating, TypeRelatingDelegate, NormalizationStrategy}; +use rustc::infer::nll_relate::{NormalizationStrategy, TypeRelating, TypeRelatingDelegate}; use rustc::infer::{InferCtxt, NLLRegionVariableOrigin}; use rustc::mir::ConstraintCategory; use rustc::traits::query::Fallible; @@ -30,8 +30,9 @@ pub(super) fn relate_types<'tcx>( TypeRelating::new( infcx, NllTypeRelatingDelegate::new(infcx, borrowck_context, locations, category), - v - ).relate(&a, &b)?; + v, + ) + .relate(&a, &b)?; Ok(()) } @@ -53,12 +54,7 @@ impl NllTypeRelatingDelegate<'me, 'bccx, 'tcx> { locations: Locations, category: ConstraintCategory, ) -> Self { - Self { - infcx, - borrowck_context, - locations, - category, - } + Self { infcx, borrowck_context, locations, category } } } @@ -76,10 +72,7 @@ impl TypeRelatingDelegate<'tcx> for NllTypeRelatingDelegate<'_, '_, 'tcx> { } } - fn next_placeholder_region( - &mut self, - placeholder: ty::PlaceholderRegion - ) -> ty::Region<'tcx> { + fn next_placeholder_region(&mut self, placeholder: ty::PlaceholderRegion) -> ty::Region<'tcx> { if let Some(borrowck_context) = &mut self.borrowck_context { borrowck_context.constraints.placeholder_region(self.infcx, placeholder) } else { @@ -88,25 +81,22 @@ impl TypeRelatingDelegate<'tcx> for NllTypeRelatingDelegate<'_, '_, 'tcx> { } fn generalize_existential(&mut self, universe: ty::UniverseIndex) -> ty::Region<'tcx> { - self.infcx - .next_nll_region_var_in_universe(NLLRegionVariableOrigin::Existential { - from_forall: false - }, universe) + self.infcx.next_nll_region_var_in_universe( + NLLRegionVariableOrigin::Existential { from_forall: false }, + universe, + ) } fn push_outlives(&mut self, sup: ty::Region<'tcx>, sub: ty::Region<'tcx>) { if let Some(borrowck_context) = &mut self.borrowck_context { let sub = borrowck_context.universal_regions.to_region_vid(sub); let sup = borrowck_context.universal_regions.to_region_vid(sup); - borrowck_context - .constraints - .outlives_constraints - .push(OutlivesConstraint { - sup, - sub, - locations: self.locations, - category: self.category, - }); + borrowck_context.constraints.outlives_constraints.push(OutlivesConstraint { + sup, + sub, + locations: self.locations, + category: self.category, + }); } } diff --git a/src/librustc_mir/borrow_check/universal_regions.rs b/src/librustc_mir/borrow_check/universal_regions.rs index c0353039b6..6e36508ed6 100644 --- a/src/librustc_mir/borrow_check/universal_regions.rs +++ b/src/librustc_mir/borrow_check/universal_regions.rs @@ -5,7 +5,7 @@ //! fn foo<'a, 'b, 'c: 'b>() { } //! ``` //! -//! here we would be returning a map assigning each of `{'a, 'b, 'c}` +//! here we would return a map assigning each of `{'a, 'b, 'c}` //! to an index, as well as the `FreeRegionMap` which can compute //! relationships between them. //! @@ -13,16 +13,17 @@ //! just returns them for other code to use. use either::Either; -use rustc::hir::def_id::DefId; -use rustc::hir::{self, BodyOwnerKind, HirId}; use rustc::infer::{InferCtxt, NLLRegionVariableOrigin}; use rustc::middle::lang_items; use rustc::ty::fold::TypeFoldable; -use rustc::ty::subst::{InternalSubsts, SubstsRef, Subst}; +use rustc::ty::subst::{InternalSubsts, Subst, SubstsRef}; use rustc::ty::{self, RegionVid, Ty, TyCtxt}; -use rustc::util::nodemap::FxHashMap; -use rustc_index::vec::{Idx, IndexVec}; +use rustc_data_structures::fx::FxHashMap; use rustc_errors::DiagnosticBuilder; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::{BodyOwnerKind, HirId}; +use rustc_index::vec::{Idx, IndexVec}; use std::iter; use crate::borrow_check::nll::ToRegionVid; @@ -109,9 +110,9 @@ impl<'tcx> DefiningTy<'tcx> { /// match up with the upvar order in the HIR, typesystem, and MIR. pub fn upvar_tys(self, tcx: TyCtxt<'tcx>) -> impl Iterator> + 'tcx { match self { - DefiningTy::Closure(def_id, substs) => Either::Left( - substs.as_closure().upvar_tys(def_id, tcx) - ), + DefiningTy::Closure(def_id, substs) => { + Either::Left(substs.as_closure().upvar_tys(def_id, tcx)) + } DefiningTy::Generator(def_id, substs, _) => { Either::Right(Either::Left(substs.as_generator().upvar_tys(def_id, tcx))) } @@ -203,12 +204,7 @@ impl<'tcx> UniversalRegions<'tcx> { ) -> Self { let tcx = infcx.tcx; let mir_hir_id = tcx.hir().as_local_hir_id(mir_def_id).unwrap(); - UniversalRegionsBuilder { - infcx, - mir_def_id, - mir_hir_id, - param_env, - }.build() + UniversalRegionsBuilder { infcx, mir_def_id, mir_hir_id, param_env }.build() } /// Given a reference to a closure type, extracts all the values @@ -324,10 +320,7 @@ impl<'tcx> UniversalRegions<'tcx> { // So we just include the region-vid. Annoying. let closure_base_def_id = tcx.closure_base_def_id(def_id); for_each_late_bound_region_defined_on(tcx, closure_base_def_id, |r| { - err.note(&format!( - "late-bound region is {:?}", - self.to_region_vid(r), - )); + err.note(&format!("late-bound region is {:?}", self.to_region_vid(r),)); }); } DefiningTy::Generator(def_id, substs, _) => { @@ -342,10 +335,7 @@ impl<'tcx> UniversalRegions<'tcx> { // and so forth. let closure_base_def_id = tcx.closure_base_def_id(def_id); for_each_late_bound_region_defined_on(tcx, closure_base_def_id, |r| { - err.note(&format!( - "late-bound region is {:?}", - self.to_region_vid(r), - )); + err.note(&format!("late-bound region is {:?}", self.to_region_vid(r),)); }); } DefiningTy::FnDef(def_id, substs) => { @@ -404,8 +394,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> { // let c = || { let x: &'a u32 = ...; } // } if self.mir_def_id != closure_base_def_id { - self.infcx - .replace_late_bound_regions_with_nll_infer_vars(self.mir_def_id, &mut indices) + self.infcx.replace_late_bound_regions_with_nll_infer_vars(self.mir_def_id, &mut indices) } let bound_inputs_and_output = self.compute_inputs_and_output(&indices, defining_ty); @@ -435,17 +424,17 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> { if self.infcx.tcx.fn_sig(def_id).c_variadic() { let va_list_did = self.infcx.tcx.require_lang_item( lang_items::VaListTypeLangItem, - Some(self.infcx.tcx.def_span(self.mir_def_id),), + Some(self.infcx.tcx.def_span(self.mir_def_id)), ); - let region = self.infcx.tcx.mk_region(ty::ReVar( - self.infcx.next_nll_region_var(FR).to_region_vid(), - )); - let va_list_ty = self.infcx.tcx.type_of(va_list_did) - .subst(self.infcx.tcx, &[region.into()]); + let region = self + .infcx + .tcx + .mk_region(ty::ReVar(self.infcx.next_nll_region_var(FR).to_region_vid())); + let va_list_ty = + self.infcx.tcx.type_of(va_list_did).subst(self.infcx.tcx, &[region.into()]); unnormalized_input_tys = self.infcx.tcx.mk_type_list( - unnormalized_input_tys.iter().copied() - .chain(iter::once(va_list_ty)), + unnormalized_input_tys.iter().copied().chain(iter::once(va_list_ty)), ); } } @@ -453,18 +442,9 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> { let fr_fn_body = self.infcx.next_nll_region_var(FR).to_region_vid(); let num_universals = self.infcx.num_region_vars(); - debug!( - "build: global regions = {}..{}", - FIRST_GLOBAL_INDEX, first_extern_index - ); - debug!( - "build: extern regions = {}..{}", - first_extern_index, first_local_index - ); - debug!( - "build: local regions = {}..{}", - first_local_index, num_universals - ); + debug!("build: global regions = {}..{}", FIRST_GLOBAL_INDEX, first_extern_index); + debug!("build: extern regions = {}..{}", first_extern_index, first_local_index); + debug!("build: local regions = {}..{}", first_local_index, num_universals); let yield_ty = match defining_ty { DefiningTy::Generator(def_id, substs, _) => { @@ -494,8 +474,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> { let closure_base_def_id = tcx.closure_base_def_id(self.mir_def_id); match tcx.hir().body_owner_kind(self.mir_hir_id) { - BodyOwnerKind::Closure | - BodyOwnerKind::Fn => { + BodyOwnerKind::Closure | BodyOwnerKind::Fn => { let defining_ty = if self.mir_def_id == closure_base_def_id { tcx.type_of(closure_base_def_id) } else { @@ -505,8 +484,8 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> { debug!("defining_ty (pre-replacement): {:?}", defining_ty); - let defining_ty = self.infcx - .replace_free_regions_with_nll_infer_vars(FR, &defining_ty); + let defining_ty = + self.infcx.replace_free_regions_with_nll_infer_vars(FR, &defining_ty); match defining_ty.kind { ty::Closure(def_id, substs) => DefiningTy::Closure(def_id, substs), @@ -526,8 +505,8 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> { BodyOwnerKind::Const | BodyOwnerKind::Static(..) => { assert_eq!(closure_base_def_id, self.mir_def_id); let identity_substs = InternalSubsts::identity_for_item(tcx, closure_base_def_id); - let substs = self.infcx - .replace_free_regions_with_nll_infer_vars(FR, &identity_substs); + let substs = + self.infcx.replace_free_regions_with_nll_infer_vars(FR, &identity_substs); DefiningTy::Const(self.mir_def_id, substs) } } @@ -546,8 +525,7 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> { let closure_base_def_id = tcx.closure_base_def_id(self.mir_def_id); let identity_substs = InternalSubsts::identity_for_item(tcx, closure_base_def_id); let fr_substs = match defining_ty { - DefiningTy::Closure(_, ref substs) - | DefiningTy::Generator(_, ref substs, _) => { + DefiningTy::Closure(_, ref substs) | DefiningTy::Generator(_, ref substs, _) => { // In the case of closures, we rely on the fact that // the first N elements in the ClosureSubsts are // inherited from the `closure_base_def_id`. @@ -564,13 +542,10 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> { }; let global_mapping = iter::once((tcx.lifetimes.re_static, fr_static)); - let subst_mapping = identity_substs - .regions() - .zip(fr_substs.regions().map(|r| r.to_region_vid())); + let subst_mapping = + identity_substs.regions().zip(fr_substs.regions().map(|r| r.to_region_vid())); - UniversalRegionIndices { - indices: global_mapping.chain(subst_mapping).collect(), - } + UniversalRegionIndices { indices: global_mapping.chain(subst_mapping).collect() } } fn compute_inputs_and_output( @@ -585,27 +560,23 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> { let closure_sig = substs.as_closure().sig_ty(def_id, tcx).fn_sig(tcx); let inputs_and_output = closure_sig.inputs_and_output(); let closure_ty = tcx.closure_env_ty(def_id, substs).unwrap(); - ty::Binder::fuse( - closure_ty, - inputs_and_output, - |closure_ty, inputs_and_output| { - // The "inputs" of the closure in the - // signature appear as a tuple. The MIR side - // flattens this tuple. - let (&output, tuplized_inputs) = inputs_and_output.split_last().unwrap(); - assert_eq!(tuplized_inputs.len(), 1, "multiple closure inputs"); - let inputs = match tuplized_inputs[0].kind { - ty::Tuple(inputs) => inputs, - _ => bug!("closure inputs not a tuple: {:?}", tuplized_inputs[0]), - }; - - tcx.mk_type_list( - iter::once(closure_ty) - .chain(inputs.iter().map(|k| k.expect_ty())) - .chain(iter::once(output)), - ) - }, - ) + ty::Binder::fuse(closure_ty, inputs_and_output, |closure_ty, inputs_and_output| { + // The "inputs" of the closure in the + // signature appear as a tuple. The MIR side + // flattens this tuple. + let (&output, tuplized_inputs) = inputs_and_output.split_last().unwrap(); + assert_eq!(tuplized_inputs.len(), 1, "multiple closure inputs"); + let inputs = match tuplized_inputs[0].kind { + ty::Tuple(inputs) => inputs, + _ => bug!("closure inputs not a tuple: {:?}", tuplized_inputs[0]), + }; + + tcx.mk_type_list( + iter::once(closure_ty) + .chain(inputs.iter().map(|k| k.expect_ty())) + .chain(iter::once(output)), + ) + }) } DefiningTy::Generator(def_id, substs, movability) => { @@ -669,9 +640,7 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'tcx> { where T: TypeFoldable<'tcx>, { - self.tcx.fold_regions(value, &mut false, |_region, _depth| { - self.next_nll_region_var(origin) - }) + self.tcx.fold_regions(value, &mut false, |_region, _depth| self.next_nll_region_var(origin)) } fn replace_bound_regions_with_nll_infer_vars( @@ -719,10 +688,7 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'tcx> { mir_def_id: DefId, indices: &mut UniversalRegionIndices<'tcx>, ) { - debug!( - "replace_late_bound_regions_with_nll_infer_vars(mir_def_id={:?})", - mir_def_id - ); + debug!("replace_late_bound_regions_with_nll_infer_vars(mir_def_id={:?})", mir_def_id); let closure_base_def_id = self.tcx.closure_base_def_id(mir_def_id); for_each_late_bound_region_defined_on(self.tcx, closure_base_def_id, |r| { debug!("replace_late_bound_regions_with_nll_infer_vars: r={:?}", r); @@ -757,7 +723,8 @@ impl<'tcx> UniversalRegionIndices<'tcx> { if let ty::ReVar(..) = r { r.to_region_vid() } else { - *self.indices + *self + .indices .get(&r) .unwrap_or_else(|| bug!("cannot convert `{:?}` to a region vid", r)) } @@ -784,10 +751,7 @@ fn for_each_late_bound_region_defined_on<'tcx>( ) { if let Some(late_bounds) = tcx.is_late_bound_map(fn_def_id.index) { for late_bound in late_bounds.iter() { - let hir_id = HirId { - owner: fn_def_id.index, - local_id: *late_bound, - }; + let hir_id = HirId { owner: fn_def_id.index, local_id: *late_bound }; let name = tcx.hir().name(hir_id); let region_def_id = tcx.hir().local_def_id(hir_id); let liberated_region = tcx.mk_region(ty::ReFree(ty::FreeRegion { diff --git a/src/librustc_mir/borrow_check/used_muts.rs b/src/librustc_mir/borrow_check/used_muts.rs index 95471afb78..5e4eebb771 100644 --- a/src/librustc_mir/borrow_check/used_muts.rs +++ b/src/librustc_mir/borrow_check/used_muts.rs @@ -1,5 +1,5 @@ use rustc::mir::visit::{PlaceContext, Visitor}; -use rustc::mir::{Local, Location, Place, PlaceBase, Statement, StatementKind, TerminatorKind}; +use rustc::mir::{Local, Location, Place, Statement, StatementKind, TerminatorKind}; use rustc_data_structures::fx::FxHashSet; @@ -57,56 +57,39 @@ impl GatherUsedMutsVisitor<'_, '_, '_> { // be those that were never initialized - we will consider those as being used as // they will either have been removed by unreachable code optimizations; or linted // as unused variables. - if let PlaceBase::Local(local) = into.base { - let _ = self.never_initialized_mut_locals.remove(&local); - } + self.never_initialized_mut_locals.remove(&into.local); } } impl<'visit, 'cx, 'tcx> Visitor<'tcx> for GatherUsedMutsVisitor<'visit, 'cx, 'tcx> { - fn visit_terminator_kind( - &mut self, - kind: &TerminatorKind<'tcx>, - _location: Location, - ) { + fn visit_terminator_kind(&mut self, kind: &TerminatorKind<'tcx>, _location: Location) { debug!("visit_terminator_kind: kind={:?}", kind); match &kind { TerminatorKind::Call { destination: Some((into, _)), .. } => { self.remove_never_initialized_mut_locals(&into); - }, + } TerminatorKind::DropAndReplace { location, .. } => { self.remove_never_initialized_mut_locals(&location); - }, - _ => {}, + } + _ => {} } } - fn visit_statement( - &mut self, - statement: &Statement<'tcx>, - _location: Location, - ) { + fn visit_statement(&mut self, statement: &Statement<'tcx>, _location: Location) { match &statement.kind { - StatementKind::Assign(box(into, _)) => { - if let PlaceBase::Local(local) = into.base { - debug!( - "visit_statement: statement={:?} local={:?} \ - never_initialized_mut_locals={:?}", - statement, local, self.never_initialized_mut_locals - ); - } + StatementKind::Assign(box (into, _)) => { + debug!( + "visit_statement: statement={:?} local={:?} \ + never_initialized_mut_locals={:?}", + statement, into.local, self.never_initialized_mut_locals + ); self.remove_never_initialized_mut_locals(into); - }, - _ => {}, + } + _ => {} } } - fn visit_local( - &mut self, - local: &Local, - place_context: PlaceContext, - location: Location, - ) { + fn visit_local(&mut self, local: &Local, place_context: PlaceContext, location: Location) { if place_context.is_place_assignment() && self.temporary_used_locals.contains(local) { // Propagate the Local assigned at this Location as a used mutable local variable for moi in &self.mbcx.move_data.loc_map[location] { diff --git a/src/librustc_mir/build/cfg.rs b/src/librustc_mir/build/cfg.rs deleted file mode 100644 index 6bd8d2f7c0..0000000000 --- a/src/librustc_mir/build/cfg.rs +++ /dev/null @@ -1,88 +0,0 @@ -//! Routines for manipulating the control-flow graph. - -use crate::build::CFG; -use rustc::mir::*; - -impl<'tcx> CFG<'tcx> { - pub fn block_data(&self, blk: BasicBlock) -> &BasicBlockData<'tcx> { - &self.basic_blocks[blk] - } - - pub fn block_data_mut(&mut self, blk: BasicBlock) -> &mut BasicBlockData<'tcx> { - &mut self.basic_blocks[blk] - } - - // llvm.org/PR32488 makes this function use an excess of stack space. Mark - // it as #[inline(never)] to keep rustc's stack use in check. - #[inline(never)] - pub fn start_new_block(&mut self) -> BasicBlock { - self.basic_blocks.push(BasicBlockData::new(None)) - } - - pub fn start_new_cleanup_block(&mut self) -> BasicBlock { - let bb = self.start_new_block(); - self.block_data_mut(bb).is_cleanup = true; - bb - } - - pub fn push(&mut self, block: BasicBlock, statement: Statement<'tcx>) { - debug!("push({:?}, {:?})", block, statement); - self.block_data_mut(block).statements.push(statement); - } - - pub fn push_assign(&mut self, - block: BasicBlock, - source_info: SourceInfo, - place: &Place<'tcx>, - rvalue: Rvalue<'tcx>) { - self.push(block, Statement { - source_info, - kind: StatementKind::Assign(box(place.clone(), rvalue)) - }); - } - - pub fn push_assign_constant(&mut self, - block: BasicBlock, - source_info: SourceInfo, - temp: &Place<'tcx>, - constant: Constant<'tcx>) { - self.push_assign(block, source_info, temp, - Rvalue::Use(Operand::Constant(box constant))); - } - - pub fn push_assign_unit(&mut self, - block: BasicBlock, - source_info: SourceInfo, - place: &Place<'tcx>) { - self.push_assign(block, source_info, place, Rvalue::Aggregate( - box AggregateKind::Tuple, vec![] - )); - } - - pub fn push_fake_read( - &mut self, - block: BasicBlock, - source_info: SourceInfo, - cause: FakeReadCause, - place: Place<'tcx>, - ) { - let kind = StatementKind::FakeRead(cause, box place); - let stmt = Statement { source_info, kind }; - self.push(block, stmt); - } - - pub fn terminate(&mut self, - block: BasicBlock, - source_info: SourceInfo, - kind: TerminatorKind<'tcx>) { - debug!("terminating block {:?} <- {:?}", block, kind); - debug_assert!(self.block_data(block).terminator.is_none(), - "terminate: block {:?}={:?} already has a terminator set", - block, - self.block_data(block)); - self.block_data_mut(block).terminator = Some(Terminator { - source_info, - kind, - }); - } -} diff --git a/src/librustc_mir/build/matches/util.rs b/src/librustc_mir/build/matches/util.rs deleted file mode 100644 index ec8b3c5e24..0000000000 --- a/src/librustc_mir/build/matches/util.rs +++ /dev/null @@ -1,132 +0,0 @@ -use crate::build::Builder; -use crate::build::matches::MatchPair; -use crate::hair::*; -use rustc::mir::*; -use rustc::ty; -use smallvec::SmallVec; -use std::u32; -use std::convert::TryInto; - -impl<'a, 'tcx> Builder<'a, 'tcx> { - pub fn field_match_pairs<'pat>( - &mut self, - place: Place<'tcx>, - subpatterns: &'pat [FieldPat<'tcx>], - ) -> Vec> { - subpatterns - .iter() - .map(|fieldpat| { - let place = self.hir.tcx().mk_place_field( - place.clone(), - fieldpat.field, - fieldpat.pattern.ty, - ); - MatchPair::new(place, &fieldpat.pattern) - }) - .collect() - } - - pub fn prefix_slice_suffix<'pat>(&mut self, - match_pairs: &mut SmallVec<[MatchPair<'pat, 'tcx>; 1]>, - place: &Place<'tcx>, - prefix: &'pat [Pat<'tcx>], - opt_slice: Option<&'pat Pat<'tcx>>, - suffix: &'pat [Pat<'tcx>]) { - let tcx = self.hir.tcx(); - let (min_length, exact_size) = match place.ty(&self.local_decls, tcx).ty.kind { - ty::Array(_, length) => ( - length.eval_usize(tcx, self.hir.param_env).try_into().unwrap(), - true - ), - _ => ( - (prefix.len() + suffix.len()).try_into().unwrap(), - false, - ), - }; - - match_pairs.extend( - prefix.iter() - .enumerate() - .map(|(idx, subpattern)| { - let elem = ProjectionElem::ConstantIndex { - offset: idx as u32, - min_length, - from_end: false, - }; - let place = tcx.mk_place_elem(place.clone(), elem); - MatchPair::new(place, subpattern) - }) - ); - - if let Some(subslice_pat) = opt_slice { - let suffix_len = suffix.len() as u32; - let subslice = tcx.mk_place_elem( - place.clone(), - ProjectionElem::Subslice { - from: prefix.len() as u32, - to: if exact_size { min_length - suffix_len } else { suffix_len }, - from_end: !exact_size, - }, - ); - match_pairs.push(MatchPair::new(subslice, subslice_pat)); - } - - match_pairs.extend( - suffix.iter() - .rev() - .enumerate() - .map(|(idx, subpattern)| { - let end_offset = (idx + 1) as u32; - let elem = ProjectionElem::ConstantIndex { - offset: if exact_size { min_length - end_offset } else { end_offset }, - min_length, - from_end: !exact_size, - }; - let place = tcx.mk_place_elem(place.clone(), elem); - MatchPair::new(place, subpattern) - }) - ); - } - - /// Creates a false edge to `imaginary_target` and a real edge to - /// real_target. If `imaginary_target` is none, or is the same as the real - /// target, a Goto is generated instead to simplify the generated MIR. - pub fn false_edges( - &mut self, - from_block: BasicBlock, - real_target: BasicBlock, - imaginary_target: Option, - source_info: SourceInfo, - ) { - match imaginary_target { - Some(target) if target != real_target => { - self.cfg.terminate( - from_block, - source_info, - TerminatorKind::FalseEdges { - real_target, - imaginary_target: target, - }, - ); - } - _ => { - self.cfg.terminate( - from_block, - source_info, - TerminatorKind::Goto { - target: real_target - } - ); - } - } - } -} - -impl<'pat, 'tcx> MatchPair<'pat, 'tcx> { - pub fn new(place: Place<'tcx>, pattern: &'pat Pat<'tcx>) -> MatchPair<'pat, 'tcx> { - MatchPair { - place, - pattern, - } - } -} diff --git a/src/librustc_mir/const_eval.rs b/src/librustc_mir/const_eval.rs index b219fec31d..aad0e16293 100644 --- a/src/librustc_mir/const_eval.rs +++ b/src/librustc_mir/const_eval.rs @@ -1,538 +1,26 @@ // Not in interpret to make sure we do not use private implementation details -use std::fmt; -use std::error::Error; -use std::borrow::{Borrow, Cow}; -use std::hash::Hash; -use std::collections::hash_map::Entry; -use std::convert::TryInto; - -use rustc::hir::def::DefKind; -use rustc::hir::def_id::DefId; -use rustc::mir::interpret::{ConstEvalErr, ErrorHandled, ScalarMaybeUndef}; use rustc::mir; -use rustc::ty::{self, Ty, TyCtxt, subst::Subst}; -use rustc::ty::layout::{self, HasTyCtxt, LayoutOf, VariantIdx}; -use rustc::traits::Reveal; -use rustc_data_structures::fx::FxHashMap; -use crate::interpret::eval_nullary_intrinsic; - -use syntax::{source_map::{Span, DUMMY_SP}, symbol::Symbol}; - -use crate::interpret::{self, - PlaceTy, MPlaceTy, OpTy, ImmTy, Immediate, Scalar, Pointer, - RawConst, ConstValue, Machine, - InterpResult, InterpErrorInfo, GlobalId, InterpCx, StackPopCleanup, AssertMessage, - Allocation, AllocId, MemoryKind, Memory, - snapshot, RefTracking, intern_const_alloc_recursive, -}; - -/// Number of steps until the detector even starts doing anything. -/// Also, a warning is shown to the user when this number is reached. -const STEPS_UNTIL_DETECTOR_ENABLED: isize = 1_000_000; -/// The number of steps between loop detector snapshots. -/// Should be a power of two for performance reasons. -const DETECTOR_SNAPSHOT_PERIOD: isize = 256; - -/// The `InterpCx` is only meant to be used to do field and index projections into constants for -/// `simd_shuffle` and const patterns in match arms. -/// -/// The function containing the `match` that is currently being analyzed may have generic bounds -/// that inform us about the generic bounds of the constant. E.g., using an associated constant -/// of a function's generic parameter will require knowledge about the bounds on the generic -/// parameter. These bounds are passed to `mk_eval_cx` via the `ParamEnv` argument. -fn mk_eval_cx<'mir, 'tcx>( - tcx: TyCtxt<'tcx>, - span: Span, - param_env: ty::ParamEnv<'tcx>, -) -> CompileTimeEvalContext<'mir, 'tcx> { - debug!("mk_eval_cx: {:?}", param_env); - InterpCx::new(tcx.at(span), param_env, CompileTimeInterpreter::new(), Default::default()) -} - -fn op_to_const<'tcx>( - ecx: &CompileTimeEvalContext<'_, 'tcx>, - op: OpTy<'tcx>, -) -> &'tcx ty::Const<'tcx> { - // We do not have value optimizations for everything. - // Only scalars and slices, since they are very common. - // Note that further down we turn scalars of undefined bits back to `ByRef`. These can result - // from scalar unions that are initialized with one of their zero sized variants. We could - // instead allow `ConstValue::Scalar` to store `ScalarMaybeUndef`, but that would affect all - // the usual cases of extracting e.g. a `usize`, without there being a real use case for the - // `Undef` situation. - let try_as_immediate = match op.layout.abi { - layout::Abi::Scalar(..) => true, - layout::Abi::ScalarPair(..) => match op.layout.ty.kind { - ty::Ref(_, inner, _) => match inner.kind { - ty::Slice(elem) => elem == ecx.tcx.types.u8, - ty::Str => true, - _ => false, - }, - _ => false, - }, - _ => false, - }; - let immediate = if try_as_immediate { - Err(ecx.read_immediate(op).expect("normalization works on validated constants")) - } else { - // It is guaranteed that any non-slice scalar pair is actually ByRef here. - // When we come back from raw const eval, we are always by-ref. The only way our op here is - // by-val is if we are in const_field, i.e., if this is (a field of) something that we - // "tried to make immediate" before. We wouldn't do that for non-slice scalar pairs or - // structs containing such. - op.try_as_mplace() - }; - let val = match immediate { - Ok(mplace) => { - let ptr = mplace.ptr.to_ptr().unwrap(); - let alloc = ecx.tcx.alloc_map.lock().unwrap_memory(ptr.alloc_id); - ConstValue::ByRef { alloc, offset: ptr.offset } - }, - // see comment on `let try_as_immediate` above - Err(ImmTy { imm: Immediate::Scalar(x), .. }) => match x { - ScalarMaybeUndef::Scalar(s) => ConstValue::Scalar(s), - ScalarMaybeUndef::Undef => { - // When coming out of "normal CTFE", we'll always have an `Indirect` operand as - // argument and we will not need this. The only way we can already have an - // `Immediate` is when we are called from `const_field`, and that `Immediate` - // comes from a constant so it can happen have `Undef`, because the indirect - // memory that was read had undefined bytes. - let mplace = op.assert_mem_place(); - let ptr = mplace.ptr.to_ptr().unwrap(); - let alloc = ecx.tcx.alloc_map.lock().unwrap_memory(ptr.alloc_id); - ConstValue::ByRef { alloc, offset: ptr.offset } - }, - }, - Err(ImmTy { imm: Immediate::ScalarPair(a, b), .. }) => { - let (data, start) = match a.not_undef().unwrap() { - Scalar::Ptr(ptr) => ( - ecx.tcx.alloc_map.lock().unwrap_memory(ptr.alloc_id), - ptr.offset.bytes(), - ), - Scalar::Raw { .. } => ( - ecx.tcx.intern_const_alloc(Allocation::from_byte_aligned_bytes( - b"" as &[u8], - )), - 0, - ), - }; - let len = b.to_machine_usize(&ecx.tcx.tcx).unwrap(); - let start = start.try_into().unwrap(); - let len: usize = len.try_into().unwrap(); - ConstValue::Slice { - data, - start, - end: start + len, - } - }, - }; - ecx.tcx.mk_const(ty::Const { val: ty::ConstKind::Value(val), ty: op.layout.ty }) -} - -// Returns a pointer to where the result lives -fn eval_body_using_ecx<'mir, 'tcx>( - ecx: &mut CompileTimeEvalContext<'mir, 'tcx>, - cid: GlobalId<'tcx>, - body: &'mir mir::Body<'tcx>, -) -> InterpResult<'tcx, MPlaceTy<'tcx>> { - debug!("eval_body_using_ecx: {:?}, {:?}", cid, ecx.param_env); - let tcx = ecx.tcx.tcx; - let layout = ecx.layout_of(body.return_ty().subst(tcx, cid.instance.substs))?; - assert!(!layout.is_unsized()); - let ret = ecx.allocate(layout, MemoryKind::Stack); - - let name = ty::tls::with(|tcx| tcx.def_path_str(cid.instance.def_id())); - let prom = cid.promoted.map_or(String::new(), |p| format!("::promoted[{:?}]", p)); - trace!("eval_body_using_ecx: pushing stack frame for global: {}{}", name, prom); - - // Assert all args (if any) are zero-sized types; `eval_body_using_ecx` doesn't - // make sense if the body is expecting nontrivial arguments. - // (The alternative would be to use `eval_fn_call` with an args slice.) - for arg in body.args_iter() { - let decl = body.local_decls.get(arg).expect("arg missing from local_decls"); - let layout = ecx.layout_of(decl.ty.subst(tcx, cid.instance.substs))?; - assert!(layout.is_zst()) - }; - - ecx.push_stack_frame( - cid.instance, - body.span, - body, - Some(ret.into()), - StackPopCleanup::None { cleanup: false }, - )?; - - // The main interpreter loop. - ecx.run()?; - - // Intern the result - intern_const_alloc_recursive(ecx, tcx.static_mutability(cid.instance.def_id()), ret)?; - - debug!("eval_body_using_ecx done: {:?}", *ret); - Ok(ret) -} - -#[derive(Clone, Debug)] -pub enum ConstEvalError { - NeedsRfc(String), -} - -impl<'tcx> Into> for ConstEvalError { - fn into(self) -> InterpErrorInfo<'tcx> { - err_unsup!(Unsupported(self.to_string())).into() - } -} - -impl fmt::Display for ConstEvalError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use self::ConstEvalError::*; - match *self { - NeedsRfc(ref msg) => { - write!( - f, - "\"{}\" needs an rfc before being allowed inside constants", - msg - ) - } - } - } -} - -impl Error for ConstEvalError { - fn description(&self) -> &str { - use self::ConstEvalError::*; - match *self { - NeedsRfc(_) => "this feature needs an rfc before being allowed inside constants", - } - } - - fn cause(&self) -> Option<&dyn Error> { - None - } -} - -// Extra machine state for CTFE, and the Machine instance -pub struct CompileTimeInterpreter<'mir, 'tcx> { - /// When this value is negative, it indicates the number of interpreter - /// steps *until* the loop detector is enabled. When it is positive, it is - /// the number of steps after the detector has been enabled modulo the loop - /// detector period. - pub(super) steps_since_detector_enabled: isize, +use rustc::ty::layout::VariantIdx; +use rustc::ty::{self, TyCtxt}; +use rustc_span::{source_map::DUMMY_SP, symbol::Symbol}; - /// Extra state to detect loops. - pub(super) loop_detector: snapshot::InfiniteLoopDetector<'mir, 'tcx>, -} - -impl<'mir, 'tcx> CompileTimeInterpreter<'mir, 'tcx> { - fn new() -> Self { - CompileTimeInterpreter { - loop_detector: Default::default(), - steps_since_detector_enabled: -STEPS_UNTIL_DETECTOR_ENABLED, - } - } -} - -impl interpret::AllocMap for FxHashMap { - #[inline(always)] - fn contains_key(&mut self, k: &Q) -> bool - where K: Borrow - { - FxHashMap::contains_key(self, k) - } - - #[inline(always)] - fn insert(&mut self, k: K, v: V) -> Option - { - FxHashMap::insert(self, k, v) - } - - #[inline(always)] - fn remove(&mut self, k: &Q) -> Option - where K: Borrow - { - FxHashMap::remove(self, k) - } +use crate::interpret::{intern_const_alloc_recursive, ConstValue, InternKind, InterpCx}; - #[inline(always)] - fn filter_map_collect(&self, mut f: impl FnMut(&K, &V) -> Option) -> Vec { - self.iter() - .filter_map(move |(k, v)| f(k, &*v)) - .collect() - } +mod error; +mod eval_queries; +mod fn_queries; +mod machine; - #[inline(always)] - fn get_or( - &self, - k: K, - vacant: impl FnOnce() -> Result - ) -> Result<&V, E> - { - match self.get(&k) { - Some(v) => Ok(v), - None => { - vacant()?; - bug!("The CTFE machine shouldn't ever need to extend the alloc_map when reading") - } - } - } - - #[inline(always)] - fn get_mut_or( - &mut self, - k: K, - vacant: impl FnOnce() -> Result - ) -> Result<&mut V, E> - { - match self.entry(k) { - Entry::Occupied(e) => Ok(e.into_mut()), - Entry::Vacant(e) => { - let v = vacant()?; - Ok(e.insert(v)) - } - } - } -} - -crate type CompileTimeEvalContext<'mir, 'tcx> = - InterpCx<'mir, 'tcx, CompileTimeInterpreter<'mir, 'tcx>>; - -impl interpret::MayLeak for ! { - #[inline(always)] - fn may_leak(self) -> bool { - // `self` is uninhabited - self - } -} - -impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, 'tcx> { - type MemoryKinds = !; - type PointerTag = (); - type ExtraFnVal = !; - - type FrameExtra = (); - type MemoryExtra = (); - type AllocExtra = (); - - type MemoryMap = FxHashMap, Allocation)>; - - const STATIC_KIND: Option = None; // no copying of statics allowed - - // We do not check for alignment to avoid having to carry an `Align` - // in `ConstValue::ByRef`. - const CHECK_ALIGN: bool = false; - - #[inline(always)] - fn enforce_validity(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool { - false // for now, we don't enforce validity - } - - fn find_mir_or_eval_fn( - ecx: &mut InterpCx<'mir, 'tcx, Self>, - instance: ty::Instance<'tcx>, - args: &[OpTy<'tcx>], - ret: Option<(PlaceTy<'tcx>, mir::BasicBlock)>, - _unwind: Option // unwinding is not supported in consts - ) -> InterpResult<'tcx, Option<&'mir mir::Body<'tcx>>> { - debug!("find_mir_or_eval_fn: {:?}", instance); - - // Only check non-glue functions - if let ty::InstanceDef::Item(def_id) = instance.def { - // Execution might have wandered off into other crates, so we cannot do a stability- - // sensitive check here. But we can at least rule out functions that are not const - // at all. - if ecx.tcx.is_const_fn_raw(def_id) { - // If this function is a `const fn` then as an optimization we can query this - // evaluation immediately. - // - // For the moment we only do this for functions which take no arguments - // (or all arguments are ZSTs) so that we don't memoize too much. - // - // Because `#[track_caller]` adds an implicit non-ZST argument, we also cannot - // perform this optimization on items tagged with it. - let no_implicit_args = !instance.def.requires_caller_location(ecx.tcx()); - if args.iter().all(|a| a.layout.is_zst()) && no_implicit_args { - let gid = GlobalId { instance, promoted: None }; - ecx.eval_const_fn_call(gid, ret)?; - return Ok(None); - } - } else { - // Some functions we support even if they are non-const -- but avoid testing - // that for const fn! We certainly do *not* want to actually call the fn - // though, so be sure we return here. - return if ecx.hook_panic_fn(instance, args, ret)? { - Ok(None) - } else { - throw_unsup_format!("calling non-const function `{}`", instance) - }; - } - } - // This is a const fn. Call it. - Ok(Some(match ecx.load_mir(instance.def, None) { - Ok(body) => *body, - Err(err) => { - if let err_unsup!(NoMirFor(ref path)) = err.kind { - return Err( - ConstEvalError::NeedsRfc(format!("calling extern function `{}`", path)) - .into(), - ); - } - return Err(err); - } - })) - } - - fn call_extra_fn( - _ecx: &mut InterpCx<'mir, 'tcx, Self>, - fn_val: !, - _args: &[OpTy<'tcx>], - _ret: Option<(PlaceTy<'tcx>, mir::BasicBlock)>, - _unwind: Option - ) -> InterpResult<'tcx> { - match fn_val {} - } - - fn call_intrinsic( - ecx: &mut InterpCx<'mir, 'tcx, Self>, - span: Span, - instance: ty::Instance<'tcx>, - args: &[OpTy<'tcx>], - ret: Option<(PlaceTy<'tcx>, mir::BasicBlock)>, - _unwind: Option - ) -> InterpResult<'tcx> { - if ecx.emulate_intrinsic(span, instance, args, ret)? { - return Ok(()); - } - // An intrinsic that we do not support - let intrinsic_name = ecx.tcx.item_name(instance.def_id()); - Err( - ConstEvalError::NeedsRfc(format!("calling intrinsic `{}`", intrinsic_name)).into() - ) - } - - fn assert_panic( - ecx: &mut InterpCx<'mir, 'tcx, Self>, - _span: Span, - msg: &AssertMessage<'tcx>, - _unwind: Option, - ) -> InterpResult<'tcx> { - use rustc::mir::interpret::PanicInfo::*; - Err(match msg { - BoundsCheck { ref len, ref index } => { - let len = ecx - .read_immediate(ecx.eval_operand(len, None)?) - .expect("can't eval len") - .to_scalar()? - .to_machine_usize(&*ecx)?; - let index = ecx - .read_immediate(ecx.eval_operand(index, None)?) - .expect("can't eval index") - .to_scalar()? - .to_machine_usize(&*ecx)?; - err_panic!(BoundsCheck { len, index }) - } - Overflow(op) => err_panic!(Overflow(*op)), - OverflowNeg => err_panic!(OverflowNeg), - DivisionByZero => err_panic!(DivisionByZero), - RemainderByZero => err_panic!(RemainderByZero), - ResumedAfterReturn(generator_kind) - => err_panic!(ResumedAfterReturn(*generator_kind)), - ResumedAfterPanic(generator_kind) - => err_panic!(ResumedAfterPanic(*generator_kind)), - Panic { .. } => bug!("`Panic` variant cannot occur in MIR"), - } - .into()) - } - - fn ptr_to_int( - _mem: &Memory<'mir, 'tcx, Self>, - _ptr: Pointer, - ) -> InterpResult<'tcx, u64> { - Err( - ConstEvalError::NeedsRfc("pointer-to-integer cast".to_string()).into(), - ) - } - - fn binary_ptr_op( - _ecx: &InterpCx<'mir, 'tcx, Self>, - _bin_op: mir::BinOp, - _left: ImmTy<'tcx>, - _right: ImmTy<'tcx>, - ) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)> { - Err( - ConstEvalError::NeedsRfc("pointer arithmetic or comparison".to_string()).into(), - ) - } - - fn find_foreign_static( - _tcx: TyCtxt<'tcx>, - _def_id: DefId, - ) -> InterpResult<'tcx, Cow<'tcx, Allocation>> { - throw_unsup!(ReadForeignStatic) - } - - #[inline(always)] - fn init_allocation_extra<'b>( - _memory_extra: &(), - _id: AllocId, - alloc: Cow<'b, Allocation>, - _kind: Option>, - ) -> (Cow<'b, Allocation>, Self::PointerTag) { - // We do not use a tag so we can just cheaply forward the allocation - (alloc, ()) - } - - #[inline(always)] - fn tag_static_base_pointer( - _memory_extra: &(), - _id: AllocId, - ) -> Self::PointerTag { - () - } - - fn box_alloc( - _ecx: &mut InterpCx<'mir, 'tcx, Self>, - _dest: PlaceTy<'tcx>, - ) -> InterpResult<'tcx> { - Err( - ConstEvalError::NeedsRfc("heap allocations via `box` keyword".to_string()).into(), - ) - } - - fn before_terminator(ecx: &mut InterpCx<'mir, 'tcx, Self>) -> InterpResult<'tcx> { - { - let steps = &mut ecx.machine.steps_since_detector_enabled; - - *steps += 1; - if *steps < 0 { - return Ok(()); - } - - *steps %= DETECTOR_SNAPSHOT_PERIOD; - if *steps != 0 { - return Ok(()); - } - } - - let span = ecx.frame().span; - ecx.machine.loop_detector.observe_and_analyze( - *ecx.tcx, - span, - &ecx.memory, - &ecx.stack[..], - ) - } - - #[inline(always)] - fn stack_push(_ecx: &mut InterpCx<'mir, 'tcx, Self>) -> InterpResult<'tcx> { - Ok(()) - } -} +pub use error::*; +pub use eval_queries::*; +pub use fn_queries::*; +pub use machine::*; /// Extracts a field of a (variant of a) const. // this function uses `unwrap` copiously, because an already validated constant must have valid // fields and can thus never fail outside of compiler bugs -pub fn const_field<'tcx>( +pub(crate) fn const_field<'tcx>( tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>, variant: Option, @@ -540,7 +28,7 @@ pub fn const_field<'tcx>( value: &'tcx ty::Const<'tcx>, ) -> &'tcx ty::Const<'tcx> { trace!("const_field: {:?}, {:?}", field, value); - let ecx = mk_eval_cx(tcx, DUMMY_SP, param_env); + let ecx = mk_eval_cx(tcx, DUMMY_SP, param_env, false); // get the operand again let op = ecx.eval_const_to_op(value, None).unwrap(); // downcast @@ -555,16 +43,16 @@ pub fn const_field<'tcx>( op_to_const(&ecx, field) } -pub fn const_caller_location<'tcx>( +pub(crate) fn const_caller_location<'tcx>( tcx: TyCtxt<'tcx>, (file, line, col): (Symbol, u32, u32), ) -> &'tcx ty::Const<'tcx> { trace!("const_caller_location: {}:{}:{}", file, line, col); - let mut ecx = mk_eval_cx(tcx, DUMMY_SP, ty::ParamEnv::reveal_all()); + let mut ecx = mk_eval_cx(tcx, DUMMY_SP, ty::ParamEnv::reveal_all(), false); let loc_ty = tcx.caller_location_ty(); let loc_place = ecx.alloc_caller_location(file, line, col); - intern_const_alloc_recursive(&mut ecx, None, loc_place).unwrap(); + intern_const_alloc_recursive(&mut ecx, InternKind::Constant, loc_place, false).unwrap(); let loc_const = ty::Const { ty: loc_ty, val: ty::ConstKind::Value(ConstValue::Scalar(loc_place.ptr.into())), @@ -573,240 +61,32 @@ pub fn const_caller_location<'tcx>( tcx.mk_const(loc_const) } -// this function uses `unwrap` copiously, because an already validated constant must have valid -// fields and can thus never fail outside of compiler bugs -pub fn const_variant_index<'tcx>( +// this function uses `unwrap` copiously, because an already validated constant +// must have valid fields and can thus never fail outside of compiler bugs +pub(crate) fn destructure_const<'tcx>( tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>, val: &'tcx ty::Const<'tcx>, -) -> VariantIdx { - trace!("const_variant_index: {:?}", val); - let ecx = mk_eval_cx(tcx, DUMMY_SP, param_env); +) -> mir::DestructuredConst<'tcx> { + trace!("destructure_const: {:?}", val); + let ecx = mk_eval_cx(tcx, DUMMY_SP, param_env, false); let op = ecx.eval_const_to_op(val, None).unwrap(); - ecx.read_discriminant(op).unwrap().1 -} - -/// Turn an interpreter error into something to report to the user. -/// As a side-effect, if RUSTC_CTFE_BACKTRACE is set, this prints the backtrace. -/// Should be called only if the error is actually going to to be reported! -pub fn error_to_const_error<'mir, 'tcx, M: Machine<'mir, 'tcx>>( - ecx: &InterpCx<'mir, 'tcx, M>, - mut error: InterpErrorInfo<'tcx>, -) -> ConstEvalErr<'tcx> { - error.print_backtrace(); - let stacktrace = ecx.generate_stacktrace(None); - ConstEvalErr { error: error.kind, stacktrace, span: ecx.tcx.span } -} -pub fn note_on_undefined_behavior_error() -> &'static str { - "The rules on what exactly is undefined behavior aren't clear, \ - so this check might be overzealous. Please open an issue on the rustc \ - repository if you believe it should not be considered undefined behavior." -} - -fn validate_and_turn_into_const<'tcx>( - tcx: TyCtxt<'tcx>, - constant: RawConst<'tcx>, - key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>, -) -> ::rustc::mir::interpret::ConstEvalResult<'tcx> { - let cid = key.value; - let ecx = mk_eval_cx(tcx, tcx.def_span(key.value.instance.def_id()), key.param_env); - let val = (|| { - let mplace = ecx.raw_const_to_mplace(constant)?; - let mut ref_tracking = RefTracking::new(mplace); - while let Some((mplace, path)) = ref_tracking.todo.pop() { - ecx.validate_operand( - mplace.into(), - path, - Some(&mut ref_tracking), - )?; - } - // Now that we validated, turn this into a proper constant. - // Statics/promoteds are always `ByRef`, for the rest `op_to_const` decides - // whether they become immediates. - let def_id = cid.instance.def.def_id(); - if tcx.is_static(def_id) || cid.promoted.is_some() { - let ptr = mplace.ptr.to_ptr()?; - Ok(tcx.mk_const(ty::Const { - val: ty::ConstKind::Value(ConstValue::ByRef { - alloc: ecx.tcx.alloc_map.lock().unwrap_memory(ptr.alloc_id), - offset: ptr.offset, - }), - ty: mplace.layout.ty, - })) - } else { - Ok(op_to_const(&ecx, mplace.into())) - } - })(); - - val.map_err(|error| { - let err = error_to_const_error(&ecx, error); - match err.struct_error(ecx.tcx, "it is undefined behavior to use this value") { - Ok(mut diag) => { - diag.note(note_on_undefined_behavior_error()); - diag.emit(); - ErrorHandled::Reported - } - Err(err) => err, - } - }) -} + let variant = ecx.read_discriminant(op).unwrap().1; -pub fn const_eval_provider<'tcx>( - tcx: TyCtxt<'tcx>, - key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>, -) -> ::rustc::mir::interpret::ConstEvalResult<'tcx> { - // see comment in const_eval_raw_provider for what we're doing here - if key.param_env.reveal == Reveal::All { - let mut key = key.clone(); - key.param_env.reveal = Reveal::UserFacing; - match tcx.const_eval(key) { - // try again with reveal all as requested - Err(ErrorHandled::TooGeneric) => { - // Promoteds should never be "too generic" when getting evaluated. - // They either don't get evaluated, or we are in a monomorphic context - assert!(key.value.promoted.is_none()); - }, - // dedupliate calls - other => return other, - } - } - - // We call `const_eval` for zero arg intrinsics, too, in order to cache their value. - // Catch such calls and evaluate them instead of trying to load a constant's MIR. - if let ty::InstanceDef::Intrinsic(def_id) = key.value.instance.def { - let ty = key.value.instance.ty(tcx); - let substs = match ty.kind { - ty::FnDef(_, substs) => substs, - _ => bug!("intrinsic with type {:?}", ty), - }; - return eval_nullary_intrinsic(tcx, key.param_env, def_id, substs) - .map_err(|error| { - let span = tcx.def_span(def_id); - let error = ConstEvalErr { error: error.kind, stacktrace: vec![], span }; - error.report_as_error(tcx.at(span), "could not evaluate nullary intrinsic") - }) - } - - tcx.const_eval_raw(key).and_then(|val| { - validate_and_turn_into_const(tcx, val, key) - }) -} - -pub fn const_eval_raw_provider<'tcx>( - tcx: TyCtxt<'tcx>, - key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>, -) -> ::rustc::mir::interpret::ConstEvalRawResult<'tcx> { - // Because the constant is computed twice (once per value of `Reveal`), we are at risk of - // reporting the same error twice here. To resolve this, we check whether we can evaluate the - // constant in the more restrictive `Reveal::UserFacing`, which most likely already was - // computed. For a large percentage of constants that will already have succeeded. Only - // associated constants of generic functions will fail due to not enough monomorphization - // information being available. - - // In case we fail in the `UserFacing` variant, we just do the real computation. - if key.param_env.reveal == Reveal::All { - let mut key = key.clone(); - key.param_env.reveal = Reveal::UserFacing; - match tcx.const_eval_raw(key) { - // try again with reveal all as requested - Err(ErrorHandled::TooGeneric) => {}, - // dedupliate calls - other => return other, - } - } - if cfg!(debug_assertions) { - // Make sure we format the instance even if we do not print it. - // This serves as a regression test against an ICE on printing. - // The next two lines concatenated contain some discussion: - // https://rust-lang.zulipchat.com/#narrow/stream/146212-t-compiler.2Fconst-eval/ - // subject/anon_const_instance_printing/near/135980032 - let instance = key.value.instance.to_string(); - trace!("const eval: {:?} ({})", key, instance); - } - - let cid = key.value; - let def_id = cid.instance.def.def_id(); - - if def_id.is_local() && tcx.typeck_tables_of(def_id).tainted_by_errors { - return Err(ErrorHandled::Reported); - } + let field_count = match val.ty.kind { + ty::Array(_, len) => len.eval_usize(tcx, param_env), + ty::Adt(def, _) => def.variants[variant].fields.len() as u64, + ty::Tuple(substs) => substs.len() as u64, + _ => bug!("cannot destructure constant {:?}", val), + }; - let span = tcx.def_span(cid.instance.def_id()); - let mut ecx = InterpCx::new( - tcx.at(span), - key.param_env, - CompileTimeInterpreter::new(), - Default::default() - ); + let down = ecx.operand_downcast(op, variant).unwrap(); + let fields_iter = (0..field_count).map(|i| { + let field_op = ecx.operand_field(down, i).unwrap(); + op_to_const(&ecx, field_op) + }); + let fields = tcx.arena.alloc_from_iter(fields_iter); - let res = ecx.load_mir(cid.instance.def, cid.promoted); - res.and_then( - |body| eval_body_using_ecx(&mut ecx, cid, *body) - ).and_then(|place| { - Ok(RawConst { - alloc_id: place.ptr.assert_ptr().alloc_id, - ty: place.layout.ty - }) - }).map_err(|error| { - let err = error_to_const_error(&ecx, error); - // errors in statics are always emitted as fatal errors - if tcx.is_static(def_id) { - // Ensure that if the above error was either `TooGeneric` or `Reported` - // an error must be reported. - let v = err.report_as_error(ecx.tcx, "could not evaluate static initializer"); - tcx.sess.delay_span_bug( - err.span, - &format!("static eval failure did not emit an error: {:#?}", v) - ); - v - } else if def_id.is_local() { - // constant defined in this crate, we can figure out a lint level! - match tcx.def_kind(def_id) { - // constants never produce a hard error at the definition site. Anything else is - // a backwards compatibility hazard (and will break old versions of winapi for sure) - // - // note that validation may still cause a hard error on this very same constant, - // because any code that existed before validation could not have failed validation - // thus preventing such a hard error from being a backwards compatibility hazard - Some(DefKind::Const) | Some(DefKind::AssocConst) => { - let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); - err.report_as_lint( - tcx.at(tcx.def_span(def_id)), - "any use of this value will cause an error", - hir_id, - Some(err.span), - ) - }, - // promoting runtime code is only allowed to error if it references broken constants - // any other kind of error will be reported to the user as a deny-by-default lint - _ => if let Some(p) = cid.promoted { - let span = tcx.promoted_mir(def_id)[p].span; - if let err_inval!(ReferencedConstant) = err.error { - err.report_as_error( - tcx.at(span), - "evaluation of constant expression failed", - ) - } else { - err.report_as_lint( - tcx.at(span), - "reaching this expression at runtime will panic or abort", - tcx.hir().as_local_hir_id(def_id).unwrap(), - Some(err.span), - ) - } - // anything else (array lengths, enum initializers, constant patterns) are reported - // as hard errors - } else { - err.report_as_error( - ecx.tcx, - "evaluation of constant value failed", - ) - }, - } - } else { - // use of broken constant from other crate - err.report_as_error(ecx.tcx, "could not evaluate constant") - } - }) + mir::DestructuredConst { variant, fields } } diff --git a/src/librustc_mir/const_eval/error.rs b/src/librustc_mir/const_eval/error.rs new file mode 100644 index 0000000000..c2db3c31f8 --- /dev/null +++ b/src/librustc_mir/const_eval/error.rs @@ -0,0 +1,42 @@ +use std::error::Error; +use std::fmt; + +use super::InterpCx; +use crate::interpret::{ConstEvalErr, InterpErrorInfo, Machine}; +#[derive(Clone, Debug)] +pub enum ConstEvalError { + NeedsRfc(String), + ConstAccessesStatic, +} + +impl<'tcx> Into> for ConstEvalError { + fn into(self) -> InterpErrorInfo<'tcx> { + err_unsup!(Unsupported(self.to_string())).into() + } +} + +impl fmt::Display for ConstEvalError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + use self::ConstEvalError::*; + match *self { + NeedsRfc(ref msg) => { + write!(f, "\"{}\" needs an rfc before being allowed inside constants", msg) + } + ConstAccessesStatic => write!(f, "constant accesses static"), + } + } +} + +impl Error for ConstEvalError {} + +/// Turn an interpreter error into something to report to the user. +/// As a side-effect, if RUSTC_CTFE_BACKTRACE is set, this prints the backtrace. +/// Should be called only if the error is actually going to to be reported! +pub fn error_to_const_error<'mir, 'tcx, M: Machine<'mir, 'tcx>>( + ecx: &InterpCx<'mir, 'tcx, M>, + mut error: InterpErrorInfo<'tcx>, +) -> ConstEvalErr<'tcx> { + error.print_backtrace(); + let stacktrace = ecx.generate_stacktrace(None); + ConstEvalErr { error: error.kind, stacktrace, span: ecx.tcx.span } +} diff --git a/src/librustc_mir/const_eval/eval_queries.rs b/src/librustc_mir/const_eval/eval_queries.rs new file mode 100644 index 0000000000..428db8356b --- /dev/null +++ b/src/librustc_mir/const_eval/eval_queries.rs @@ -0,0 +1,382 @@ +use super::{error_to_const_error, CompileTimeEvalContext, CompileTimeInterpreter, MemoryExtra}; +use crate::interpret::eval_nullary_intrinsic; +use crate::interpret::{ + intern_const_alloc_recursive, Allocation, ConstValue, GlobalId, ImmTy, Immediate, InternKind, + InterpCx, InterpResult, MPlaceTy, MemoryKind, OpTy, RawConst, RefTracking, Scalar, + ScalarMaybeUndef, StackPopCleanup, +}; +use rustc::mir; +use rustc::mir::interpret::{ConstEvalErr, ErrorHandled}; +use rustc::traits::Reveal; +use rustc::ty::{self, layout, layout::LayoutOf, subst::Subst, TyCtxt}; +use rustc_hir::def::DefKind; +use rustc_span::source_map::Span; +use std::convert::TryInto; + +pub fn note_on_undefined_behavior_error() -> &'static str { + "The rules on what exactly is undefined behavior aren't clear, \ + so this check might be overzealous. Please open an issue on the rustc \ + repository if you believe it should not be considered undefined behavior." +} + +// Returns a pointer to where the result lives +fn eval_body_using_ecx<'mir, 'tcx>( + ecx: &mut CompileTimeEvalContext<'mir, 'tcx>, + cid: GlobalId<'tcx>, + body: &'mir mir::Body<'tcx>, +) -> InterpResult<'tcx, MPlaceTy<'tcx>> { + debug!("eval_body_using_ecx: {:?}, {:?}", cid, ecx.param_env); + let tcx = ecx.tcx.tcx; + let layout = ecx.layout_of(body.return_ty().subst(tcx, cid.instance.substs))?; + assert!(!layout.is_unsized()); + let ret = ecx.allocate(layout, MemoryKind::Stack); + + let name = ty::tls::with(|tcx| tcx.def_path_str(cid.instance.def_id())); + let prom = cid.promoted.map_or(String::new(), |p| format!("::promoted[{:?}]", p)); + trace!("eval_body_using_ecx: pushing stack frame for global: {}{}", name, prom); + + // Assert all args (if any) are zero-sized types; `eval_body_using_ecx` doesn't + // make sense if the body is expecting nontrivial arguments. + // (The alternative would be to use `eval_fn_call` with an args slice.) + for arg in body.args_iter() { + let decl = body.local_decls.get(arg).expect("arg missing from local_decls"); + let layout = ecx.layout_of(decl.ty.subst(tcx, cid.instance.substs))?; + assert!(layout.is_zst()) + } + + ecx.push_stack_frame( + cid.instance, + body.span, + body, + Some(ret.into()), + StackPopCleanup::None { cleanup: false }, + )?; + + // The main interpreter loop. + ecx.run()?; + + // Intern the result + let intern_kind = match tcx.static_mutability(cid.instance.def_id()) { + Some(m) => InternKind::Static(m), + None if cid.promoted.is_some() => InternKind::Promoted, + _ => InternKind::Constant, + }; + intern_const_alloc_recursive( + ecx, + intern_kind, + ret, + body.ignore_interior_mut_in_const_validation, + )?; + + debug!("eval_body_using_ecx done: {:?}", *ret); + Ok(ret) +} + +/// The `InterpCx` is only meant to be used to do field and index projections into constants for +/// `simd_shuffle` and const patterns in match arms. +/// +/// The function containing the `match` that is currently being analyzed may have generic bounds +/// that inform us about the generic bounds of the constant. E.g., using an associated constant +/// of a function's generic parameter will require knowledge about the bounds on the generic +/// parameter. These bounds are passed to `mk_eval_cx` via the `ParamEnv` argument. +pub(super) fn mk_eval_cx<'mir, 'tcx>( + tcx: TyCtxt<'tcx>, + span: Span, + param_env: ty::ParamEnv<'tcx>, + can_access_statics: bool, +) -> CompileTimeEvalContext<'mir, 'tcx> { + debug!("mk_eval_cx: {:?}", param_env); + InterpCx::new( + tcx.at(span), + param_env, + CompileTimeInterpreter::new(), + MemoryExtra { can_access_statics }, + ) +} + +pub(super) fn op_to_const<'tcx>( + ecx: &CompileTimeEvalContext<'_, 'tcx>, + op: OpTy<'tcx>, +) -> &'tcx ty::Const<'tcx> { + // We do not have value optimizations for everything. + // Only scalars and slices, since they are very common. + // Note that further down we turn scalars of undefined bits back to `ByRef`. These can result + // from scalar unions that are initialized with one of their zero sized variants. We could + // instead allow `ConstValue::Scalar` to store `ScalarMaybeUndef`, but that would affect all + // the usual cases of extracting e.g. a `usize`, without there being a real use case for the + // `Undef` situation. + let try_as_immediate = match op.layout.abi { + layout::Abi::Scalar(..) => true, + layout::Abi::ScalarPair(..) => match op.layout.ty.kind { + ty::Ref(_, inner, _) => match inner.kind { + ty::Slice(elem) => elem == ecx.tcx.types.u8, + ty::Str => true, + _ => false, + }, + _ => false, + }, + _ => false, + }; + let immediate = if try_as_immediate { + Err(ecx.read_immediate(op).expect("normalization works on validated constants")) + } else { + // It is guaranteed that any non-slice scalar pair is actually ByRef here. + // When we come back from raw const eval, we are always by-ref. The only way our op here is + // by-val is if we are in const_field, i.e., if this is (a field of) something that we + // "tried to make immediate" before. We wouldn't do that for non-slice scalar pairs or + // structs containing such. + op.try_as_mplace(ecx) + }; + + let to_const_value = |mplace: MPlaceTy<'_>| match mplace.ptr { + Scalar::Ptr(ptr) => { + let alloc = ecx.tcx.alloc_map.lock().unwrap_memory(ptr.alloc_id); + ConstValue::ByRef { alloc, offset: ptr.offset } + } + Scalar::Raw { data, .. } => { + assert!(mplace.layout.is_zst()); + assert_eq!( + data, + mplace.layout.align.abi.bytes().into(), + "this MPlaceTy must come from `try_as_mplace` being used on a zst, so we know what + value this integer address must have", + ); + ConstValue::Scalar(Scalar::zst()) + } + }; + let val = match immediate { + Ok(mplace) => to_const_value(mplace), + // see comment on `let try_as_immediate` above + Err(ImmTy { imm: Immediate::Scalar(x), .. }) => match x { + ScalarMaybeUndef::Scalar(s) => ConstValue::Scalar(s), + ScalarMaybeUndef::Undef => to_const_value(op.assert_mem_place(ecx)), + }, + Err(ImmTy { imm: Immediate::ScalarPair(a, b), .. }) => { + let (data, start) = match a.not_undef().unwrap() { + Scalar::Ptr(ptr) => { + (ecx.tcx.alloc_map.lock().unwrap_memory(ptr.alloc_id), ptr.offset.bytes()) + } + Scalar::Raw { .. } => ( + ecx.tcx.intern_const_alloc(Allocation::from_byte_aligned_bytes(b"" as &[u8])), + 0, + ), + }; + let len = b.to_machine_usize(&ecx.tcx.tcx).unwrap(); + let start = start.try_into().unwrap(); + let len: usize = len.try_into().unwrap(); + ConstValue::Slice { data, start, end: start + len } + } + }; + ecx.tcx.mk_const(ty::Const { val: ty::ConstKind::Value(val), ty: op.layout.ty }) +} + +fn validate_and_turn_into_const<'tcx>( + tcx: TyCtxt<'tcx>, + constant: RawConst<'tcx>, + key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>, +) -> ::rustc::mir::interpret::ConstEvalResult<'tcx> { + let cid = key.value; + let def_id = cid.instance.def.def_id(); + let is_static = tcx.is_static(def_id); + let ecx = mk_eval_cx(tcx, tcx.def_span(key.value.instance.def_id()), key.param_env, is_static); + let val = (|| { + let mplace = ecx.raw_const_to_mplace(constant)?; + + // FIXME do not validate promoteds until a decision on + // https://github.com/rust-lang/rust/issues/67465 is made + if cid.promoted.is_none() { + let mut ref_tracking = RefTracking::new(mplace); + while let Some((mplace, path)) = ref_tracking.todo.pop() { + ecx.validate_operand(mplace.into(), path, Some(&mut ref_tracking))?; + } + } + // Now that we validated, turn this into a proper constant. + // Statics/promoteds are always `ByRef`, for the rest `op_to_const` decides + // whether they become immediates. + if is_static || cid.promoted.is_some() { + let ptr = mplace.ptr.assert_ptr(); + Ok(tcx.mk_const(ty::Const { + val: ty::ConstKind::Value(ConstValue::ByRef { + alloc: ecx.tcx.alloc_map.lock().unwrap_memory(ptr.alloc_id), + offset: ptr.offset, + }), + ty: mplace.layout.ty, + })) + } else { + Ok(op_to_const(&ecx, mplace.into())) + } + })(); + + val.map_err(|error| { + let err = error_to_const_error(&ecx, error); + match err.struct_error(ecx.tcx, "it is undefined behavior to use this value") { + Ok(mut diag) => { + diag.note(note_on_undefined_behavior_error()); + diag.emit(); + ErrorHandled::Reported + } + Err(err) => err, + } + }) +} + +pub fn const_eval_validated_provider<'tcx>( + tcx: TyCtxt<'tcx>, + key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>, +) -> ::rustc::mir::interpret::ConstEvalResult<'tcx> { + // see comment in const_eval_raw_provider for what we're doing here + if key.param_env.reveal == Reveal::All { + let mut key = key; + key.param_env.reveal = Reveal::UserFacing; + match tcx.const_eval_validated(key) { + // try again with reveal all as requested + Err(ErrorHandled::TooGeneric) => {} + // dedupliate calls + other => return other, + } + } + + // We call `const_eval` for zero arg intrinsics, too, in order to cache their value. + // Catch such calls and evaluate them instead of trying to load a constant's MIR. + if let ty::InstanceDef::Intrinsic(def_id) = key.value.instance.def { + let ty = key.value.instance.ty_env(tcx, key.param_env); + let substs = match ty.kind { + ty::FnDef(_, substs) => substs, + _ => bug!("intrinsic with type {:?}", ty), + }; + return eval_nullary_intrinsic(tcx, key.param_env, def_id, substs).map_err(|error| { + let span = tcx.def_span(def_id); + let error = ConstEvalErr { error: error.kind, stacktrace: vec![], span }; + error.report_as_error(tcx.at(span), "could not evaluate nullary intrinsic") + }); + } + + tcx.const_eval_raw(key).and_then(|val| validate_and_turn_into_const(tcx, val, key)) +} + +pub fn const_eval_raw_provider<'tcx>( + tcx: TyCtxt<'tcx>, + key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>, +) -> ::rustc::mir::interpret::ConstEvalRawResult<'tcx> { + // Because the constant is computed twice (once per value of `Reveal`), we are at risk of + // reporting the same error twice here. To resolve this, we check whether we can evaluate the + // constant in the more restrictive `Reveal::UserFacing`, which most likely already was + // computed. For a large percentage of constants that will already have succeeded. Only + // associated constants of generic functions will fail due to not enough monomorphization + // information being available. + + // In case we fail in the `UserFacing` variant, we just do the real computation. + if key.param_env.reveal == Reveal::All { + let mut key = key; + key.param_env.reveal = Reveal::UserFacing; + match tcx.const_eval_raw(key) { + // try again with reveal all as requested + Err(ErrorHandled::TooGeneric) => {} + // dedupliate calls + other => return other, + } + } + if cfg!(debug_assertions) { + // Make sure we format the instance even if we do not print it. + // This serves as a regression test against an ICE on printing. + // The next two lines concatenated contain some discussion: + // https://rust-lang.zulipchat.com/#narrow/stream/146212-t-compiler.2Fconst-eval/ + // subject/anon_const_instance_printing/near/135980032 + let instance = key.value.instance.to_string(); + trace!("const eval: {:?} ({})", key, instance); + } + + let cid = key.value; + let def_id = cid.instance.def.def_id(); + + if def_id.is_local() && tcx.typeck_tables_of(def_id).tainted_by_errors { + return Err(ErrorHandled::Reported); + } + + let is_static = tcx.is_static(def_id); + + let span = tcx.def_span(cid.instance.def_id()); + let mut ecx = InterpCx::new( + tcx.at(span), + key.param_env, + CompileTimeInterpreter::new(), + MemoryExtra { can_access_statics: is_static }, + ); + + let res = ecx.load_mir(cid.instance.def, cid.promoted); + res.and_then(|body| eval_body_using_ecx(&mut ecx, cid, *body)) + .and_then(|place| { + Ok(RawConst { alloc_id: place.ptr.assert_ptr().alloc_id, ty: place.layout.ty }) + }) + .map_err(|error| { + let err = error_to_const_error(&ecx, error); + // errors in statics are always emitted as fatal errors + if is_static { + // Ensure that if the above error was either `TooGeneric` or `Reported` + // an error must be reported. + let v = err.report_as_error(ecx.tcx, "could not evaluate static initializer"); + + // If this is `Reveal:All`, then we need to make sure an error is reported but if + // this is `Reveal::UserFacing`, then it's expected that we could get a + // `TooGeneric` error. When we fall back to `Reveal::All`, then it will either + // succeed or we'll report this error then. + if key.param_env.reveal == Reveal::All { + tcx.sess.delay_span_bug( + err.span, + &format!("static eval failure did not emit an error: {:#?}", v), + ); + } + + v + } else if def_id.is_local() { + // constant defined in this crate, we can figure out a lint level! + match tcx.def_kind(def_id) { + // constants never produce a hard error at the definition site. Anything else is + // a backwards compatibility hazard (and will break old versions of winapi for + // sure) + // + // note that validation may still cause a hard error on this very same constant, + // because any code that existed before validation could not have failed + // validation thus preventing such a hard error from being a backwards + // compatibility hazard + Some(DefKind::Const) | Some(DefKind::AssocConst) => { + let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); + err.report_as_lint( + tcx.at(tcx.def_span(def_id)), + "any use of this value will cause an error", + hir_id, + Some(err.span), + ) + } + // promoting runtime code is only allowed to error if it references broken + // constants any other kind of error will be reported to the user as a + // deny-by-default lint + _ => { + if let Some(p) = cid.promoted { + let span = tcx.promoted_mir(def_id)[p].span; + if let err_inval!(ReferencedConstant) = err.error { + err.report_as_error( + tcx.at(span), + "evaluation of constant expression failed", + ) + } else { + err.report_as_lint( + tcx.at(span), + "reaching this expression at runtime will panic or abort", + tcx.hir().as_local_hir_id(def_id).unwrap(), + Some(err.span), + ) + } + // anything else (array lengths, enum initializers, constant patterns) are + // reported as hard errors + } else { + err.report_as_error(ecx.tcx, "evaluation of constant value failed") + } + } + } + } else { + // use of broken constant from other crate + err.report_as_error(ecx.tcx, "could not evaluate constant") + } + }) +} diff --git a/src/librustc_mir/const_eval/fn_queries.rs b/src/librustc_mir/const_eval/fn_queries.rs new file mode 100644 index 0000000000..5eeb92f583 --- /dev/null +++ b/src/librustc_mir/const_eval/fn_queries.rs @@ -0,0 +1,155 @@ +use rustc::hir::map::blocks::FnLikeNode; +use rustc::ty::query::Providers; +use rustc::ty::TyCtxt; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::Symbol; +use rustc_target::spec::abi::Abi; +use syntax::attr; + +/// Whether the `def_id` counts as const fn in your current crate, considering all active +/// feature gates +pub fn is_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool { + tcx.is_const_fn_raw(def_id) + && match is_unstable_const_fn(tcx, def_id) { + Some(feature_name) => { + // has a `rustc_const_unstable` attribute, check whether the user enabled the + // corresponding feature gate. + tcx.features().declared_lib_features.iter().any(|&(sym, _)| sym == feature_name) + } + // functions without const stability are either stable user written + // const fn or the user is using feature gates and we thus don't + // care what they do + None => true, + } +} + +/// Whether the `def_id` is an unstable const fn and what feature gate is necessary to enable it +pub fn is_unstable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> Option { + if tcx.is_const_fn_raw(def_id) { + let const_stab = tcx.lookup_const_stability(def_id)?; + if const_stab.level.is_unstable() { Some(const_stab.feature) } else { None } + } else { + None + } +} + +/// Returns `true` if this function must conform to `min_const_fn` +pub fn is_min_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool { + // Bail out if the signature doesn't contain `const` + if !tcx.is_const_fn_raw(def_id) { + return false; + } + + if tcx.features().staged_api { + // In order for a libstd function to be considered min_const_fn + // it needs to be stable and have no `rustc_const_unstable` attribute. + match tcx.lookup_const_stability(def_id) { + // `rustc_const_unstable` functions don't need to conform. + Some(&attr::ConstStability { ref level, .. }) if level.is_unstable() => false, + None => { + if let Some(stab) = tcx.lookup_stability(def_id) { + if stab.level.is_stable() { + tcx.sess.span_err( + tcx.def_span(def_id), + "stable const functions must have either `rustc_const_stable` or \ + `rustc_const_unstable` attribute", + ); + // While we errored above, because we don't know if we need to conform, we + // err on the "safe" side and require min_const_fn. + true + } else { + // Unstable functions need not conform to min_const_fn. + false + } + } else { + // Internal functions are forced to conform to min_const_fn. + // Annotate the internal function with a const stability attribute if + // you need to use unstable features. + // Note: this is an arbitrary choice that does not affect stability or const + // safety or anything, it just changes whether we need to annotate some + // internal functions with `rustc_const_stable` or with `rustc_const_unstable` + true + } + } + // Everything else needs to conform, because it would be callable from + // other `min_const_fn` functions. + _ => true, + } + } else { + // users enabling the `const_fn` feature gate can do what they want + !tcx.features().const_fn + } +} + +pub fn provide(providers: &mut Providers<'_>) { + /// Const evaluability whitelist is here to check evaluability at the + /// top level beforehand. + fn is_const_intrinsic(tcx: TyCtxt<'_>, def_id: DefId) -> Option { + if tcx.is_closure(def_id) { + return None; + } + + match tcx.fn_sig(def_id).abi() { + Abi::RustIntrinsic | Abi::PlatformIntrinsic => { + Some(tcx.lookup_const_stability(def_id).is_some()) + } + _ => None, + } + } + + /// Checks whether the function has a `const` modifier or, in case it is an intrinsic, whether + /// said intrinsic is on the whitelist for being const callable. + fn is_const_fn_raw(tcx: TyCtxt<'_>, def_id: DefId) -> bool { + let hir_id = tcx + .hir() + .as_local_hir_id(def_id) + .expect("Non-local call to local provider is_const_fn"); + + let node = tcx.hir().get(hir_id); + + if let Some(whitelisted) = is_const_intrinsic(tcx, def_id) { + whitelisted + } else if let Some(fn_like) = FnLikeNode::from_node(node) { + fn_like.constness() == hir::Constness::Const + } else if let hir::Node::Ctor(_) = node { + true + } else { + false + } + } + + fn is_promotable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool { + is_const_fn(tcx, def_id) + && match tcx.lookup_const_stability(def_id) { + Some(stab) => { + if cfg!(debug_assertions) && stab.promotable { + let sig = tcx.fn_sig(def_id); + assert_eq!( + sig.unsafety(), + hir::Unsafety::Normal, + "don't mark const unsafe fns as promotable", + // https://github.com/rust-lang/rust/pull/53851#issuecomment-418760682 + ); + } + stab.promotable + } + None => false, + } + } + + fn const_fn_is_allowed_fn_ptr(tcx: TyCtxt<'_>, def_id: DefId) -> bool { + is_const_fn(tcx, def_id) + && tcx + .lookup_const_stability(def_id) + .map(|stab| stab.allow_const_fn_ptr) + .unwrap_or(false) + } + + *providers = Providers { + is_const_fn_raw, + is_promotable_const_fn, + const_fn_is_allowed_fn_ptr, + ..*providers + }; +} diff --git a/src/librustc_mir/const_eval/machine.rs b/src/librustc_mir/const_eval/machine.rs new file mode 100644 index 0000000000..1aed91baba --- /dev/null +++ b/src/librustc_mir/const_eval/machine.rs @@ -0,0 +1,365 @@ +use rustc::mir; +use rustc::ty::layout::HasTyCtxt; +use rustc::ty::{self, Ty, TyCtxt}; +use rustc_hir::def_id::DefId; +use std::borrow::{Borrow, Cow}; +use std::collections::hash_map::Entry; +use std::hash::Hash; + +use rustc_data_structures::fx::FxHashMap; + +use rustc_span::source_map::Span; + +use crate::interpret::{ + self, snapshot, AllocId, Allocation, AssertMessage, GlobalId, ImmTy, InterpCx, InterpResult, + Memory, MemoryKind, OpTy, PlaceTy, Pointer, Scalar, +}; + +use super::error::*; + +impl<'mir, 'tcx> InterpCx<'mir, 'tcx, CompileTimeInterpreter<'mir, 'tcx>> { + /// Evaluate a const function where all arguments (if any) are zero-sized types. + /// The evaluation is memoized thanks to the query system. + /// + /// Returns `true` if the call has been evaluated. + fn try_eval_const_fn_call( + &mut self, + instance: ty::Instance<'tcx>, + ret: Option<(PlaceTy<'tcx>, mir::BasicBlock)>, + args: &[OpTy<'tcx>], + ) -> InterpResult<'tcx, bool> { + trace!("try_eval_const_fn_call: {:?}", instance); + // Because `#[track_caller]` adds an implicit non-ZST argument, we also cannot + // perform this optimization on items tagged with it. + if instance.def.requires_caller_location(self.tcx()) { + return Ok(false); + } + // For the moment we only do this for functions which take no arguments + // (or all arguments are ZSTs) so that we don't memoize too much. + if args.iter().any(|a| !a.layout.is_zst()) { + return Ok(false); + } + + let dest = match ret { + Some((dest, _)) => dest, + // Don't memoize diverging function calls. + None => return Ok(false), + }; + + let gid = GlobalId { instance, promoted: None }; + + let place = self.const_eval_raw(gid)?; + + self.copy_op(place.into(), dest)?; + + self.return_to_block(ret.map(|r| r.1))?; + self.dump_place(*dest); + return Ok(true); + } +} + +/// Number of steps until the detector even starts doing anything. +/// Also, a warning is shown to the user when this number is reached. +const STEPS_UNTIL_DETECTOR_ENABLED: isize = 1_000_000; +/// The number of steps between loop detector snapshots. +/// Should be a power of two for performance reasons. +const DETECTOR_SNAPSHOT_PERIOD: isize = 256; + +// Extra machine state for CTFE, and the Machine instance +pub struct CompileTimeInterpreter<'mir, 'tcx> { + /// When this value is negative, it indicates the number of interpreter + /// steps *until* the loop detector is enabled. When it is positive, it is + /// the number of steps after the detector has been enabled modulo the loop + /// detector period. + pub(super) steps_since_detector_enabled: isize, + + /// Extra state to detect loops. + pub(super) loop_detector: snapshot::InfiniteLoopDetector<'mir, 'tcx>, +} + +#[derive(Copy, Clone, Debug)] +pub struct MemoryExtra { + /// Whether this machine may read from statics + pub(super) can_access_statics: bool, +} + +impl<'mir, 'tcx> CompileTimeInterpreter<'mir, 'tcx> { + pub(super) fn new() -> Self { + CompileTimeInterpreter { + loop_detector: Default::default(), + steps_since_detector_enabled: -STEPS_UNTIL_DETECTOR_ENABLED, + } + } +} + +impl interpret::AllocMap for FxHashMap { + #[inline(always)] + fn contains_key(&mut self, k: &Q) -> bool + where + K: Borrow, + { + FxHashMap::contains_key(self, k) + } + + #[inline(always)] + fn insert(&mut self, k: K, v: V) -> Option { + FxHashMap::insert(self, k, v) + } + + #[inline(always)] + fn remove(&mut self, k: &Q) -> Option + where + K: Borrow, + { + FxHashMap::remove(self, k) + } + + #[inline(always)] + fn filter_map_collect(&self, mut f: impl FnMut(&K, &V) -> Option) -> Vec { + self.iter().filter_map(move |(k, v)| f(k, &*v)).collect() + } + + #[inline(always)] + fn get_or(&self, k: K, vacant: impl FnOnce() -> Result) -> Result<&V, E> { + match self.get(&k) { + Some(v) => Ok(v), + None => { + vacant()?; + bug!("The CTFE machine shouldn't ever need to extend the alloc_map when reading") + } + } + } + + #[inline(always)] + fn get_mut_or(&mut self, k: K, vacant: impl FnOnce() -> Result) -> Result<&mut V, E> { + match self.entry(k) { + Entry::Occupied(e) => Ok(e.into_mut()), + Entry::Vacant(e) => { + let v = vacant()?; + Ok(e.insert(v)) + } + } + } +} + +crate type CompileTimeEvalContext<'mir, 'tcx> = + InterpCx<'mir, 'tcx, CompileTimeInterpreter<'mir, 'tcx>>; + +impl interpret::MayLeak for ! { + #[inline(always)] + fn may_leak(self) -> bool { + // `self` is uninhabited + self + } +} + +impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, 'tcx> { + type MemoryKinds = !; + type PointerTag = (); + type ExtraFnVal = !; + + type FrameExtra = (); + type MemoryExtra = MemoryExtra; + type AllocExtra = (); + + type MemoryMap = FxHashMap, Allocation)>; + + const STATIC_KIND: Option = None; // no copying of statics allowed + + // We do not check for alignment to avoid having to carry an `Align` + // in `ConstValue::ByRef`. + const CHECK_ALIGN: bool = false; + + #[inline(always)] + fn enforce_validity(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool { + false // for now, we don't enforce validity + } + + fn find_mir_or_eval_fn( + ecx: &mut InterpCx<'mir, 'tcx, Self>, + span: Span, + instance: ty::Instance<'tcx>, + args: &[OpTy<'tcx>], + ret: Option<(PlaceTy<'tcx>, mir::BasicBlock)>, + _unwind: Option, // unwinding is not supported in consts + ) -> InterpResult<'tcx, Option<&'mir mir::Body<'tcx>>> { + debug!("find_mir_or_eval_fn: {:?}", instance); + + // Only check non-glue functions + if let ty::InstanceDef::Item(def_id) = instance.def { + // Execution might have wandered off into other crates, so we cannot do a stability- + // sensitive check here. But we can at least rule out functions that are not const + // at all. + if ecx.tcx.is_const_fn_raw(def_id) { + // If this function is a `const fn` then under certain circumstances we + // can evaluate call via the query system, thus memoizing all future calls. + if ecx.try_eval_const_fn_call(instance, ret, args)? { + return Ok(None); + } + } else { + // Some functions we support even if they are non-const -- but avoid testing + // that for const fn! We certainly do *not* want to actually call the fn + // though, so be sure we return here. + return if ecx.hook_panic_fn(span, instance, args)? { + Ok(None) + } else { + throw_unsup_format!("calling non-const function `{}`", instance) + }; + } + } + // This is a const fn. Call it. + Ok(Some(match ecx.load_mir(instance.def, None) { + Ok(body) => *body, + Err(err) => { + if let err_unsup!(NoMirFor(ref path)) = err.kind { + return Err(ConstEvalError::NeedsRfc(format!( + "calling extern function `{}`", + path + )) + .into()); + } + return Err(err); + } + })) + } + + fn call_extra_fn( + _ecx: &mut InterpCx<'mir, 'tcx, Self>, + fn_val: !, + _args: &[OpTy<'tcx>], + _ret: Option<(PlaceTy<'tcx>, mir::BasicBlock)>, + _unwind: Option, + ) -> InterpResult<'tcx> { + match fn_val {} + } + + fn call_intrinsic( + ecx: &mut InterpCx<'mir, 'tcx, Self>, + span: Span, + instance: ty::Instance<'tcx>, + args: &[OpTy<'tcx>], + ret: Option<(PlaceTy<'tcx>, mir::BasicBlock)>, + _unwind: Option, + ) -> InterpResult<'tcx> { + if ecx.emulate_intrinsic(span, instance, args, ret)? { + return Ok(()); + } + // An intrinsic that we do not support + let intrinsic_name = ecx.tcx.item_name(instance.def_id()); + Err(ConstEvalError::NeedsRfc(format!("calling intrinsic `{}`", intrinsic_name)).into()) + } + + fn assert_panic( + ecx: &mut InterpCx<'mir, 'tcx, Self>, + _span: Span, + msg: &AssertMessage<'tcx>, + _unwind: Option, + ) -> InterpResult<'tcx> { + use rustc::mir::interpret::PanicInfo::*; + Err(match msg { + BoundsCheck { ref len, ref index } => { + let len = ecx + .read_immediate(ecx.eval_operand(len, None)?) + .expect("can't eval len") + .to_scalar()? + .to_machine_usize(&*ecx)?; + let index = ecx + .read_immediate(ecx.eval_operand(index, None)?) + .expect("can't eval index") + .to_scalar()? + .to_machine_usize(&*ecx)?; + err_panic!(BoundsCheck { len, index }) + } + Overflow(op) => err_panic!(Overflow(*op)), + OverflowNeg => err_panic!(OverflowNeg), + DivisionByZero => err_panic!(DivisionByZero), + RemainderByZero => err_panic!(RemainderByZero), + ResumedAfterReturn(generator_kind) => err_panic!(ResumedAfterReturn(*generator_kind)), + ResumedAfterPanic(generator_kind) => err_panic!(ResumedAfterPanic(*generator_kind)), + Panic { .. } => bug!("`Panic` variant cannot occur in MIR"), + } + .into()) + } + + fn ptr_to_int(_mem: &Memory<'mir, 'tcx, Self>, _ptr: Pointer) -> InterpResult<'tcx, u64> { + Err(ConstEvalError::NeedsRfc("pointer-to-integer cast".to_string()).into()) + } + + fn binary_ptr_op( + _ecx: &InterpCx<'mir, 'tcx, Self>, + _bin_op: mir::BinOp, + _left: ImmTy<'tcx>, + _right: ImmTy<'tcx>, + ) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)> { + Err(ConstEvalError::NeedsRfc("pointer arithmetic or comparison".to_string()).into()) + } + + fn find_foreign_static( + _tcx: TyCtxt<'tcx>, + _def_id: DefId, + ) -> InterpResult<'tcx, Cow<'tcx, Allocation>> { + throw_unsup!(ReadForeignStatic) + } + + #[inline(always)] + fn init_allocation_extra<'b>( + _memory_extra: &MemoryExtra, + _id: AllocId, + alloc: Cow<'b, Allocation>, + _kind: Option>, + ) -> (Cow<'b, Allocation>, Self::PointerTag) { + // We do not use a tag so we can just cheaply forward the allocation + (alloc, ()) + } + + #[inline(always)] + fn tag_static_base_pointer(_memory_extra: &MemoryExtra, _id: AllocId) -> Self::PointerTag { + () + } + + fn box_alloc( + _ecx: &mut InterpCx<'mir, 'tcx, Self>, + _dest: PlaceTy<'tcx>, + ) -> InterpResult<'tcx> { + Err(ConstEvalError::NeedsRfc("heap allocations via `box` keyword".to_string()).into()) + } + + fn before_terminator(ecx: &mut InterpCx<'mir, 'tcx, Self>) -> InterpResult<'tcx> { + { + let steps = &mut ecx.machine.steps_since_detector_enabled; + + *steps += 1; + if *steps < 0 { + return Ok(()); + } + + *steps %= DETECTOR_SNAPSHOT_PERIOD; + if *steps != 0 { + return Ok(()); + } + } + + let span = ecx.frame().span; + ecx.machine.loop_detector.observe_and_analyze(*ecx.tcx, span, &ecx.memory, &ecx.stack[..]) + } + + #[inline(always)] + fn stack_push(_ecx: &mut InterpCx<'mir, 'tcx, Self>) -> InterpResult<'tcx> { + Ok(()) + } + + fn before_access_static( + memory_extra: &MemoryExtra, + _allocation: &Allocation, + ) -> InterpResult<'tcx> { + if memory_extra.can_access_statics { + Ok(()) + } else { + Err(ConstEvalError::ConstAccessesStatic.into()) + } + } +} + +// Please do not add any code below the above `Machine` trait impl. I (oli-obk) plan more cleanups +// so we can end up having a file with just that impl, but for now, let's keep the impl discoverable +// at the bottom of this file. diff --git a/src/librustc_mir/dataflow/at_location.rs b/src/librustc_mir/dataflow/at_location.rs index e0ca105352..c6d29211d4 100644 --- a/src/librustc_mir/dataflow/at_location.rs +++ b/src/librustc_mir/dataflow/at_location.rs @@ -4,11 +4,11 @@ use rustc::mir::{BasicBlock, Location}; use rustc_index::bit_set::{BitIter, BitSet, HybridBitSet}; -use crate::dataflow::{BitDenotation, DataflowResults, GenKillSet}; use crate::dataflow::move_paths::{HasMoveData, MovePathIndex}; +use crate::dataflow::{BitDenotation, DataflowResults, GenKillSet}; -use std::iter; use std::borrow::Borrow; +use std::iter; /// A trait for "cartesian products" of multiple FlowAtLocation. /// @@ -98,11 +98,7 @@ where let bits_per_block = results.borrow().sets().bits_per_block(); let curr_state = BitSet::new_empty(bits_per_block); let stmt_trans = GenKillSet::from_elem(HybridBitSet::new_empty(bits_per_block)); - FlowAtLocation { - base_results: results, - curr_state, - stmt_trans, - } + FlowAtLocation { base_results: results, curr_state, stmt_trans } } /// Access the underlying operator. @@ -154,30 +150,18 @@ where fn reconstruct_statement_effect(&mut self, loc: Location) { self.stmt_trans.clear(); - self.base_results - .borrow() - .operator() - .before_statement_effect(&mut self.stmt_trans, loc); + self.base_results.borrow().operator().before_statement_effect(&mut self.stmt_trans, loc); self.stmt_trans.apply(&mut self.curr_state); - self.base_results - .borrow() - .operator() - .statement_effect(&mut self.stmt_trans, loc); + self.base_results.borrow().operator().statement_effect(&mut self.stmt_trans, loc); } fn reconstruct_terminator_effect(&mut self, loc: Location) { self.stmt_trans.clear(); - self.base_results - .borrow() - .operator() - .before_terminator_effect(&mut self.stmt_trans, loc); + self.base_results.borrow().operator().before_terminator_effect(&mut self.stmt_trans, loc); self.stmt_trans.apply(&mut self.curr_state); - self.base_results - .borrow() - .operator() - .terminator_effect(&mut self.stmt_trans, loc); + self.base_results.borrow().operator().terminator_effect(&mut self.stmt_trans, loc); } fn apply_local_effect(&mut self, _loc: Location) { @@ -185,7 +169,6 @@ where } } - impl<'tcx, T, DR> FlowAtLocation<'tcx, T, DR> where T: HasMoveData<'tcx> + BitDenotation<'tcx, Idx = MovePathIndex>, diff --git a/src/librustc_mir/dataflow/drop_flag_effects.rs b/src/librustc_mir/dataflow/drop_flag_effects.rs index 0fe58c07b1..720b17e7ff 100644 --- a/src/librustc_mir/dataflow/drop_flag_effects.rs +++ b/src/librustc_mir/dataflow/drop_flag_effects.rs @@ -1,23 +1,25 @@ +use crate::util::elaborate_drops::DropFlagState; use rustc::mir::{self, Body, Location}; use rustc::ty::{self, TyCtxt}; -use crate::util::elaborate_drops::DropFlagState; -use super::{MoveDataParamEnv}; use super::indexes::MovePathIndex; -use super::move_paths::{MoveData, LookupResult, InitKind}; +use super::move_paths::{InitKind, LookupResult, MoveData}; +use super::MoveDataParamEnv; -pub fn move_path_children_matching<'tcx, F>(move_data: &MoveData<'tcx>, - path: MovePathIndex, - mut cond: F) - -> Option - where F: FnMut(&mir::PlaceElem<'tcx>) -> bool +pub fn move_path_children_matching<'tcx, F>( + move_data: &MoveData<'tcx>, + path: MovePathIndex, + mut cond: F, +) -> Option +where + F: FnMut(&mir::PlaceElem<'tcx>) -> bool, { let mut next_child = move_data.move_paths[path].first_child; while let Some(child_index) = next_child { let move_path_children = &move_data.move_paths[child_index]; if let Some(elem) = move_path_children.place.projection.last() { if cond(elem) { - return Some(child_index) + return Some(child_index); } } next_child = move_path_children.next_sibling; @@ -52,23 +54,27 @@ fn place_contents_drop_state_cannot_differ<'tcx>( let ty = place.ty(body, tcx).ty; match ty.kind { ty::Array(..) => { - debug!("place_contents_drop_state_cannot_differ place: {:?} ty: {:?} => false", - place, ty); + debug!( + "place_contents_drop_state_cannot_differ place: {:?} ty: {:?} => false", + place, ty + ); false } ty::Slice(..) | ty::Ref(..) | ty::RawPtr(..) => { - debug!("place_contents_drop_state_cannot_differ place: {:?} ty: {:?} refd => true", - place, ty); + debug!( + "place_contents_drop_state_cannot_differ place: {:?} ty: {:?} refd => true", + place, ty + ); true } ty::Adt(def, _) if (def.has_dtor(tcx) && !def.is_box()) || def.is_union() => { - debug!("place_contents_drop_state_cannot_differ place: {:?} ty: {:?} Drop => true", - place, ty); + debug!( + "place_contents_drop_state_cannot_differ place: {:?} ty: {:?} Drop => true", + place, ty + ); true } - _ => { - false - } + _ => false, } } @@ -85,9 +91,7 @@ pub(crate) fn on_lookup_result_bits<'tcx, F>( LookupResult::Parent(..) => { // access to untracked value - do not touch children } - LookupResult::Exact(e) => { - on_all_children_bits(tcx, body, move_data, e, each_child) - } + LookupResult::Exact(e) => on_all_children_bits(tcx, body, move_data, e, each_child), } } @@ -106,8 +110,7 @@ pub(crate) fn on_all_children_bits<'tcx, F>( move_data: &MoveData<'tcx>, path: MovePathIndex, ) -> bool { - place_contents_drop_state_cannot_differ( - tcx, body, &move_data.move_paths[path].place) + place_contents_drop_state_cannot_differ(tcx, body, &move_data.move_paths[path].place) } fn on_all_children_bits<'tcx, F>( @@ -122,7 +125,7 @@ pub(crate) fn on_all_children_bits<'tcx, F>( each_child(move_path_index); if is_terminal_path(tcx, body, move_data, move_path_index) { - return + return; } let mut next_child_index = move_data.move_paths[move_path_index].first_child; @@ -169,9 +172,9 @@ pub(crate) fn drop_flag_effects_for_function_entry<'tcx, F>( for arg in body.args_iter() { let place = mir::Place::from(arg); let lookup_result = move_data.rev_lookup.find(place.as_ref()); - on_lookup_result_bits(tcx, body, move_data, - lookup_result, - |mpi| callback(mpi, DropFlagState::Present)); + on_lookup_result_bits(tcx, body, move_data, lookup_result, |mpi| { + callback(mpi, DropFlagState::Present) + }); } } @@ -192,20 +195,12 @@ pub(crate) fn drop_flag_effects_for_location<'tcx, F>( let path = mi.move_path_index(move_data); debug!("moving out of path {:?}", move_data.move_paths[path]); - on_all_children_bits(tcx, body, move_data, - path, - |mpi| callback(mpi, DropFlagState::Absent)) + on_all_children_bits(tcx, body, move_data, path, |mpi| callback(mpi, DropFlagState::Absent)) } debug!("drop_flag_effects: assignment for location({:?})", loc); - for_location_inits( - tcx, - body, - move_data, - loc, - |mpi| callback(mpi, DropFlagState::Present) - ); + for_location_inits(tcx, body, move_data, loc, |mpi| callback(mpi, DropFlagState::Present)); } pub(crate) fn for_location_inits<'tcx, F>( @@ -223,10 +218,8 @@ pub(crate) fn for_location_inits<'tcx, F>( InitKind::Deep => { let path = init.path; - on_all_children_bits(tcx, body, move_data, - path, - &mut callback) - }, + on_all_children_bits(tcx, body, move_data, path, &mut callback) + } InitKind::Shallow => { let mpi = init.path; callback(mpi); diff --git a/src/librustc_mir/dataflow/generic.rs b/src/librustc_mir/dataflow/generic.rs deleted file mode 100644 index dd6238b80d..0000000000 --- a/src/librustc_mir/dataflow/generic.rs +++ /dev/null @@ -1,613 +0,0 @@ -//! Dataflow analysis with arbitrary transfer functions. -//! -//! This module is a work in progress. You should instead use `BitDenotation` in -//! `librustc_mir/dataflow/mod.rs` and encode your transfer function as a [gen/kill set][gk]. In -//! doing so, your analysis will run faster and you will be able to generate graphviz diagrams for -//! debugging with no extra effort. The interface in this module is intended only for dataflow -//! problems that cannot be expressed using gen/kill sets. -//! -//! FIXME(ecstaticmorse): In the long term, the plan is to preserve the existing `BitDenotation` -//! interface, but make `Engine` and `ResultsCursor` the canonical way to perform and inspect a -//! dataflow analysis. This requires porting the graphviz debugging logic to this module, deciding -//! on a way to handle the `before` methods in `BitDenotation` and creating an adapter so that -//! gen-kill problems can still be evaluated efficiently. See the discussion in [#64566][] for more -//! information. -//! -//! [gk]: https://en.wikipedia.org/wiki/Data-flow_analysis#Bit_vector_problems -//! [#64566]: https://github.com/rust-lang/rust/pull/64566 - -use std::borrow::Borrow; -use std::cmp::Ordering; -use std::ffi::OsString; -use std::path::{Path, PathBuf}; -use std::{fs, io, ops}; - -use rustc::hir::def_id::DefId; -use rustc::mir::{self, traversal, BasicBlock, Location}; -use rustc::ty::{self, TyCtxt}; -use rustc_data_structures::work_queue::WorkQueue; -use rustc_index::bit_set::BitSet; -use rustc_index::vec::{Idx, IndexVec}; -use syntax::symbol::sym; - -use crate::dataflow::BottomValue; - -mod graphviz; - -/// A specific kind of dataflow analysis. -/// -/// To run a dataflow analysis, one must set the initial state of the `START_BLOCK` via -/// `initialize_start_block` and define a transfer function for each statement or terminator via -/// the various `effect` methods. The entry set for all other basic blocks is initialized to -/// `Self::BOTTOM_VALUE`. The dataflow `Engine` then iteratively updates the various entry sets for -/// each block with the cumulative effects of the transfer functions of all preceding blocks. -/// -/// You should use an `Engine` to actually run an analysis, and a `ResultsCursor` to inspect the -/// results of that analysis like so: -/// -/// ```ignore(cross-crate-imports) -/// fn do_my_analysis(body: &mir::Body<'tcx>, dead_unwinds: &BitSet) { -/// // `MyAnalysis` implements `Analysis`. -/// let analysis = MyAnalysis::new(); -/// -/// let results = Engine::new(body, dead_unwinds, analysis).iterate_to_fixpoint(); -/// let mut cursor = ResultsCursor::new(body, results); -/// -/// for (_, statement_index) in body.block_data[START_BLOCK].statements.iter_enumerated() { -/// cursor.seek_after(Location { block: START_BLOCK, statement_index }); -/// let state = cursor.get(); -/// println!("{:?}", state); -/// } -/// } -/// ``` -pub trait Analysis<'tcx>: BottomValue { - /// The index type used to access the dataflow state. - type Idx: Idx; - - /// A name, used for debugging, that describes this dataflow analysis. - /// - /// The name should be suitable as part of a filename, so avoid whitespace, slashes or periods - /// and try to keep it short. - const NAME: &'static str; - - /// How each element of your dataflow state will be displayed during debugging. - /// - /// By default, this is the `fmt::Debug` representation of `Self::Idx`. - fn pretty_print_idx(&self, w: &mut impl io::Write, idx: Self::Idx) -> io::Result<()> { - write!(w, "{:?}", idx) - } - - /// The size of each bitvector allocated for each block. - fn bits_per_block(&self, body: &mir::Body<'tcx>) -> usize; - - /// Mutates the entry set of the `START_BLOCK` to contain the initial state for dataflow - /// analysis. - fn initialize_start_block(&self, body: &mir::Body<'tcx>, state: &mut BitSet); - - /// Updates the current dataflow state with the effect of evaluating a statement. - fn apply_statement_effect( - &self, - state: &mut BitSet, - statement: &mir::Statement<'tcx>, - location: Location, - ); - - /// Updates the current dataflow state with the effect of evaluating a terminator. - /// - /// Note that the effect of a successful return from a `Call` terminator should **not** be - /// acounted for in this function. That should go in `apply_call_return_effect`. For example, - /// in the `InitializedPlaces` analyses, the return place is not marked as initialized here. - fn apply_terminator_effect( - &self, - state: &mut BitSet, - terminator: &mir::Terminator<'tcx>, - location: Location, - ); - - /// Updates the current dataflow state with the effect of a successful return from a `Call` - /// terminator. - /// - /// This is separated from `apply_terminator_effect` to properly track state across - /// unwind edges for `Call`s. - fn apply_call_return_effect( - &self, - state: &mut BitSet, - block: BasicBlock, - func: &mir::Operand<'tcx>, - args: &[mir::Operand<'tcx>], - return_place: &mir::Place<'tcx>, - ); - - /// Applies the cumulative effect of an entire basic block to the dataflow state (except for - /// `call_return_effect`, which is handled in the `Engine`). - /// - /// The default implementation calls `statement_effect` for every statement in the block before - /// finally calling `terminator_effect`. However, some dataflow analyses are able to coalesce - /// transfer functions for an entire block and apply them at once. Such analyses should - /// override `block_effect`. - fn apply_whole_block_effect( - &self, - state: &mut BitSet, - block: BasicBlock, - block_data: &mir::BasicBlockData<'tcx>, - ) { - for (statement_index, stmt) in block_data.statements.iter().enumerate() { - let location = Location { block, statement_index }; - self.apply_statement_effect(state, stmt, location); - } - - let location = Location { block, statement_index: block_data.statements.len() }; - self.apply_terminator_effect(state, block_data.terminator(), location); - } - - /// Applies the cumulative effect of a sequence of statements (and possibly a terminator) - /// within a single basic block. - /// - /// When called with `0..block_data.statements.len() + 1` as the statement range, this function - /// is equivalent to `apply_whole_block_effect`. - fn apply_partial_block_effect( - &self, - state: &mut BitSet, - block: BasicBlock, - block_data: &mir::BasicBlockData<'tcx>, - mut range: ops::Range, - ) { - if range.is_empty() { - return; - } - - // The final location might be a terminator, so iterate through all statements until the - // final one, then check to see whether the final one is a statement or terminator. - // - // This can't cause the range to wrap-around since we check that the range contains at - // least one element above. - range.end -= 1; - let final_location = Location { block, statement_index: range.end }; - - for statement_index in range { - let location = Location { block, statement_index }; - let stmt = &block_data.statements[statement_index]; - self.apply_statement_effect(state, stmt, location); - } - - if final_location.statement_index == block_data.statements.len() { - let terminator = block_data.terminator(); - self.apply_terminator_effect(state, terminator, final_location); - } else { - let stmt = &block_data.statements[final_location.statement_index]; - self.apply_statement_effect(state, stmt, final_location); - } - } -} - -#[derive(Clone, Copy, Debug)] -enum CursorPosition { - AtBlockStart(BasicBlock), - After(Location), -} - -impl CursorPosition { - fn block(&self) -> BasicBlock { - match *self { - Self::AtBlockStart(block) => block, - Self::After(Location { block, .. }) => block, - } - } -} - -type ResultsRefCursor<'a, 'mir, 'tcx, A> = - ResultsCursor<'mir, 'tcx, A, &'a Results<'tcx, A>>; - -/// Inspect the results of dataflow analysis. -/// -/// This cursor has linear performance when visiting statements in a block in order. Visiting -/// statements within a block in reverse order is `O(n^2)`, where `n` is the number of statements -/// in that block. -pub struct ResultsCursor<'mir, 'tcx, A, R = Results<'tcx, A>> -where - A: Analysis<'tcx>, -{ - body: &'mir mir::Body<'tcx>, - results: R, - state: BitSet, - - pos: CursorPosition, - - /// Whether the effects of `apply_call_return_effect` are currently stored in `state`. - /// - /// This flag ensures that multiple calls to `seek_after_assume_call_returns` with the same - /// target only result in one invocation of `apply_call_return_effect`. - is_call_return_effect_applied: bool, -} - -impl<'mir, 'tcx, A, R> ResultsCursor<'mir, 'tcx, A, R> -where - A: Analysis<'tcx>, - R: Borrow>, -{ - /// Returns a new cursor for `results` that points to the start of the `START_BLOCK`. - pub fn new(body: &'mir mir::Body<'tcx>, results: R) -> Self { - ResultsCursor { - body, - pos: CursorPosition::AtBlockStart(mir::START_BLOCK), - is_call_return_effect_applied: false, - state: results.borrow().entry_sets[mir::START_BLOCK].clone(), - results, - } - } - - pub fn analysis(&self) -> &A { - &self.results.borrow().analysis - } - - /// Resets the cursor to the start of the given `block`. - pub fn seek_to_block_start(&mut self, block: BasicBlock) { - self.state.overwrite(&self.results.borrow().entry_sets[block]); - self.pos = CursorPosition::AtBlockStart(block); - self.is_call_return_effect_applied = false; - } - - /// Updates the cursor to hold the dataflow state immediately before `target`. - pub fn seek_before(&mut self, target: Location) { - assert!(target <= self.body.terminator_loc(target.block)); - - if target.statement_index == 0 { - self.seek_to_block_start(target.block); - } else { - self._seek_after(Location { - block: target.block, - statement_index: target.statement_index - 1, - }); - } - } - - /// Updates the cursor to hold the dataflow state at `target`. - /// - /// If `target` is a `Call` terminator, `apply_call_return_effect` will not be called. See - /// `seek_after_assume_call_returns` if you wish to observe the dataflow state upon a - /// successful return. - pub fn seek_after(&mut self, target: Location) { - assert!(target <= self.body.terminator_loc(target.block)); - - // This check ensures the correctness of a call to `seek_after_assume_call_returns` - // followed by one to `seek_after` with the same target. - if self.is_call_return_effect_applied { - self.seek_to_block_start(target.block); - } - - self._seek_after(target); - } - - /// Equivalent to `seek_after`, but also calls `apply_call_return_effect` if `target` is a - /// `Call` terminator whose callee is convergent. - pub fn seek_after_assume_call_returns(&mut self, target: Location) { - assert!(target <= self.body.terminator_loc(target.block)); - - self._seek_after(target); - - if target != self.body.terminator_loc(target.block) { - return; - } - - let term = self.body.basic_blocks()[target.block].terminator(); - if let mir::TerminatorKind::Call { - destination: Some((return_place, _)), - func, - args, - .. - } = &term.kind { - if !self.is_call_return_effect_applied { - self.is_call_return_effect_applied = true; - self.results.borrow().analysis.apply_call_return_effect( - &mut self.state, - target.block, - func, - args, - return_place, - ); - } - } - } - - fn _seek_after(&mut self, target: Location) { - let Location { block: target_block, statement_index: target_index } = target; - - if self.pos.block() != target_block { - self.seek_to_block_start(target_block); - } - - // If we're in the same block but after the target statement, we need to reset to the start - // of the block. - if let CursorPosition::After(Location { statement_index: curr_index, .. }) = self.pos { - match curr_index.cmp(&target_index) { - Ordering::Equal => return, - Ordering::Less => {}, - Ordering::Greater => self.seek_to_block_start(target_block), - } - } - - // The cursor is now in the same block as the target location pointing at an earlier - // statement. - debug_assert_eq!(self.pos.block(), target_block); - if let CursorPosition::After(Location { statement_index, .. }) = self.pos { - debug_assert!(statement_index < target_index); - } - - let first_unapplied_statement = match self.pos { - CursorPosition::AtBlockStart(_) => 0, - CursorPosition::After(Location { statement_index, .. }) => statement_index + 1, - }; - - let block_data = &self.body.basic_blocks()[target_block]; - self.results.borrow().analysis.apply_partial_block_effect( - &mut self.state, - target_block, - block_data, - first_unapplied_statement..target_index + 1, - ); - - self.pos = CursorPosition::After(target); - self.is_call_return_effect_applied = false; - } - - /// Gets the dataflow state at the current location. - pub fn get(&self) -> &BitSet { - &self.state - } -} - -/// A completed dataflow analysis. -pub struct Results<'tcx, A> -where - A: Analysis<'tcx>, -{ - analysis: A, - entry_sets: IndexVec>, -} - -/// All information required to iterate a dataflow analysis to fixpoint. -pub struct Engine<'a, 'tcx, A> -where - A: Analysis<'tcx>, -{ - analysis: A, - bits_per_block: usize, - tcx: TyCtxt<'tcx>, - body: &'a mir::Body<'tcx>, - def_id: DefId, - dead_unwinds: &'a BitSet, - entry_sets: IndexVec>, -} - -impl Engine<'a, 'tcx, A> -where - A: Analysis<'tcx>, -{ - pub fn new( - tcx: TyCtxt<'tcx>, - body: &'a mir::Body<'tcx>, - def_id: DefId, - dead_unwinds: &'a BitSet, - analysis: A, - ) -> Self { - let bits_per_block = analysis.bits_per_block(body); - - let bottom_value_set = if A::BOTTOM_VALUE == true { - BitSet::new_filled(bits_per_block) - } else { - BitSet::new_empty(bits_per_block) - }; - - let mut entry_sets = IndexVec::from_elem(bottom_value_set, body.basic_blocks()); - analysis.initialize_start_block(body, &mut entry_sets[mir::START_BLOCK]); - - Engine { - analysis, - bits_per_block, - tcx, - body, - def_id, - dead_unwinds, - entry_sets, - } - } - - pub fn iterate_to_fixpoint(mut self) -> Results<'tcx, A> { - let mut temp_state = BitSet::new_empty(self.bits_per_block); - - let mut dirty_queue: WorkQueue = - WorkQueue::with_none(self.body.basic_blocks().len()); - - for (bb, _) in traversal::reverse_postorder(self.body) { - dirty_queue.insert(bb); - } - - // Add blocks that are not reachable from START_BLOCK to the work queue. These blocks will - // be processed after the ones added above. - for bb in self.body.basic_blocks().indices() { - dirty_queue.insert(bb); - } - - while let Some(bb) = dirty_queue.pop() { - let bb_data = &self.body[bb]; - let on_entry = &self.entry_sets[bb]; - - temp_state.overwrite(on_entry); - self.analysis.apply_whole_block_effect(&mut temp_state, bb, bb_data); - - self.propagate_bits_into_graph_successors_of( - &mut temp_state, - (bb, bb_data), - &mut dirty_queue, - ); - } - - let Engine { - tcx, - body, - def_id, - analysis, - entry_sets, - .. - } = self; - - let results = Results { analysis, entry_sets }; - - let attrs = tcx.get_attrs(def_id); - if let Some(path) = get_dataflow_graphviz_output_path(tcx, attrs, A::NAME) { - let result = write_dataflow_graphviz_results(body, def_id, &path, &results); - if let Err(e) = result { - warn!("Failed to write dataflow results to {}: {}", path.display(), e); - } - } - - results - } - - fn propagate_bits_into_graph_successors_of( - &mut self, - in_out: &mut BitSet, - (bb, bb_data): (BasicBlock, &'a mir::BasicBlockData<'tcx>), - dirty_list: &mut WorkQueue, - ) { - match bb_data.terminator().kind { - mir::TerminatorKind::Return - | mir::TerminatorKind::Resume - | mir::TerminatorKind::Abort - | mir::TerminatorKind::GeneratorDrop - | mir::TerminatorKind::Unreachable => {} - - mir::TerminatorKind::Goto { target } - | mir::TerminatorKind::Assert { target, cleanup: None, .. } - | mir::TerminatorKind::Yield { resume: target, drop: None, .. } - | mir::TerminatorKind::Drop { target, location: _, unwind: None } - | mir::TerminatorKind::DropAndReplace { target, value: _, location: _, unwind: None } => - { - self.propagate_bits_into_entry_set_for(in_out, target, dirty_list); - } - - mir::TerminatorKind::Yield { resume: target, drop: Some(drop), .. } => { - self.propagate_bits_into_entry_set_for(in_out, target, dirty_list); - self.propagate_bits_into_entry_set_for(in_out, drop, dirty_list); - } - - mir::TerminatorKind::Assert { target, cleanup: Some(unwind), .. } - | mir::TerminatorKind::Drop { target, location: _, unwind: Some(unwind) } - | mir::TerminatorKind::DropAndReplace { - target, - value: _, - location: _, - unwind: Some(unwind), - } => { - self.propagate_bits_into_entry_set_for(in_out, target, dirty_list); - if !self.dead_unwinds.contains(bb) { - self.propagate_bits_into_entry_set_for(in_out, unwind, dirty_list); - } - } - - mir::TerminatorKind::SwitchInt { ref targets, .. } => { - for target in targets { - self.propagate_bits_into_entry_set_for(in_out, *target, dirty_list); - } - } - - mir::TerminatorKind::Call { cleanup, ref destination, ref func, ref args, .. } => { - if let Some(unwind) = cleanup { - if !self.dead_unwinds.contains(bb) { - self.propagate_bits_into_entry_set_for(in_out, unwind, dirty_list); - } - } - - if let Some((ref dest_place, dest_bb)) = *destination { - // N.B.: This must be done *last*, after all other - // propagation, as documented in comment above. - self.analysis.apply_call_return_effect(in_out, bb, func, args, dest_place); - self.propagate_bits_into_entry_set_for(in_out, dest_bb, dirty_list); - } - } - - mir::TerminatorKind::FalseEdges { real_target, imaginary_target } => { - self.propagate_bits_into_entry_set_for(in_out, real_target, dirty_list); - self.propagate_bits_into_entry_set_for(in_out, imaginary_target, dirty_list); - } - - mir::TerminatorKind::FalseUnwind { real_target, unwind } => { - self.propagate_bits_into_entry_set_for(in_out, real_target, dirty_list); - if let Some(unwind) = unwind { - if !self.dead_unwinds.contains(bb) { - self.propagate_bits_into_entry_set_for(in_out, unwind, dirty_list); - } - } - } - } - } - - fn propagate_bits_into_entry_set_for( - &mut self, - in_out: &BitSet, - bb: BasicBlock, - dirty_queue: &mut WorkQueue, - ) { - let entry_set = &mut self.entry_sets[bb]; - let set_changed = self.analysis.join(entry_set, &in_out); - if set_changed { - dirty_queue.insert(bb); - } - } -} - -/// Looks for attributes like `#[rustc_mir(borrowck_graphviz_postflow="./path/to/suffix.dot")]` and -/// extracts the path with the given analysis name prepended to the suffix. -/// -/// Returns `None` if no such attribute exists. -fn get_dataflow_graphviz_output_path( - tcx: TyCtxt<'tcx>, - attrs: ty::Attributes<'tcx>, - analysis: &str, -) -> Option { - let mut rustc_mir_attrs = attrs - .into_iter() - .filter(|attr| attr.check_name(sym::rustc_mir)) - .flat_map(|attr| attr.meta_item_list().into_iter().flat_map(|v| v.into_iter())); - - let borrowck_graphviz_postflow = rustc_mir_attrs - .find(|attr| attr.check_name(sym::borrowck_graphviz_postflow))?; - - let path_and_suffix = match borrowck_graphviz_postflow.value_str() { - Some(p) => p, - None => { - tcx.sess.span_err( - borrowck_graphviz_postflow.span(), - "borrowck_graphviz_postflow requires a path", - ); - - return None; - } - }; - - // Change "path/suffix.dot" to "path/analysis_name_suffix.dot" - let mut ret = PathBuf::from(path_and_suffix.to_string()); - let suffix = ret.file_name().unwrap(); - - let mut file_name: OsString = analysis.into(); - file_name.push("_"); - file_name.push(suffix); - ret.set_file_name(file_name); - - Some(ret) -} - -fn write_dataflow_graphviz_results>( - body: &mir::Body<'tcx>, - def_id: DefId, - path: &Path, - results: &Results<'tcx, A> -) -> io::Result<()> { - debug!("printing dataflow results for {:?} to {}", def_id, path.display()); - - let mut buf = Vec::new(); - let graphviz = graphviz::Formatter::new(body, def_id, results); - - dot::render(&graphviz, &mut buf)?; - fs::write(path, buf) -} diff --git a/src/librustc_mir/dataflow/generic/cursor.rs b/src/librustc_mir/dataflow/generic/cursor.rs new file mode 100644 index 0000000000..d2eff494ad --- /dev/null +++ b/src/librustc_mir/dataflow/generic/cursor.rs @@ -0,0 +1,265 @@ +//! Random access inspection of the results of a dataflow analysis. + +use std::borrow::Borrow; + +use rustc::mir::{self, BasicBlock, Location}; +use rustc_index::bit_set::BitSet; + +use super::{Analysis, Results}; + +/// A `ResultsCursor` that borrows the underlying `Results`. +pub type ResultsRefCursor<'a, 'mir, 'tcx, A> = ResultsCursor<'mir, 'tcx, A, &'a Results<'tcx, A>>; + +/// Allows random access inspection of the results of a dataflow analysis. +/// +/// This cursor only has linear performance within a basic block when its statements are visited in +/// order. In the worst case—when statements are visited in *reverse* order—performance will be +/// quadratic in the number of statements in the block. The order in which basic blocks are +/// inspected has no impact on performance. +/// +/// A `ResultsCursor` can either own (the default) or borrow the dataflow results it inspects. The +/// type of ownership is determined by `R` (see `ResultsRefCursor` above). +pub struct ResultsCursor<'mir, 'tcx, A, R = Results<'tcx, A>> +where + A: Analysis<'tcx>, +{ + body: &'mir mir::Body<'tcx>, + results: R, + state: BitSet, + + pos: CursorPosition, + + /// When this flag is set, the cursor is pointing at a `Call` terminator whose call return + /// effect has been applied to `state`. + /// + /// This flag helps to ensure that multiple calls to `seek_after_assume_call_returns` with the + /// same target will result in exactly one invocation of `apply_call_return_effect`. It is + /// sufficient to clear this only in `seek_to_block_start`, since seeking away from a + /// terminator will always require a cursor reset. + call_return_effect_applied: bool, +} + +impl<'mir, 'tcx, A, R> ResultsCursor<'mir, 'tcx, A, R> +where + A: Analysis<'tcx>, + R: Borrow>, +{ + /// Returns a new cursor for `results` that points to the start of the `START_BLOCK`. + pub fn new(body: &'mir mir::Body<'tcx>, results: R) -> Self { + ResultsCursor { + body, + pos: CursorPosition::BlockStart(mir::START_BLOCK), + state: results.borrow().entry_sets[mir::START_BLOCK].clone(), + call_return_effect_applied: false, + results, + } + } + + /// Returns the `Analysis` used to generate the underlying results. + pub fn analysis(&self) -> &A { + &self.results.borrow().analysis + } + + /// Returns the dataflow state at the current location. + pub fn get(&self) -> &BitSet { + &self.state + } + + /// Resets the cursor to the start of the given basic block. + pub fn seek_to_block_start(&mut self, block: BasicBlock) { + self.state.overwrite(&self.results.borrow().entry_sets[block]); + self.pos = CursorPosition::BlockStart(block); + self.call_return_effect_applied = false; + } + + /// Advances the cursor to hold all effects up to and including to the "before" effect of the + /// statement (or terminator) at the given location. + /// + /// If you wish to observe the full effect of a statement or terminator, not just the "before" + /// effect, use `seek_after` or `seek_after_assume_call_returns`. + pub fn seek_before(&mut self, target: Location) { + assert!(target <= self.body.terminator_loc(target.block)); + self.seek_(target, false); + } + + /// Advances the cursor to hold the full effect of all statements (and possibly closing + /// terminators) up to and including the `target`. + /// + /// If the `target` is a `Call` terminator, any call return effect for that terminator will + /// **not** be observed. Use `seek_after_assume_call_returns` if you wish to observe the call + /// return effect. + pub fn seek_after(&mut self, target: Location) { + assert!(target <= self.body.terminator_loc(target.block)); + + // If we have already applied the call return effect, we are currently pointing at a `Call` + // terminator. Unconditionally reset the dataflow cursor, since there is no way to "undo" + // the call return effect. + if self.call_return_effect_applied { + self.seek_to_block_start(target.block); + } + + self.seek_(target, true); + } + + /// Advances the cursor to hold all effects up to and including of the statement (or + /// terminator) at the given location. + /// + /// If the `target` is a `Call` terminator, any call return effect for that terminator will + /// be observed. Use `seek_after` if you do **not** wish to observe the call return effect. + pub fn seek_after_assume_call_returns(&mut self, target: Location) { + let terminator_loc = self.body.terminator_loc(target.block); + assert!(target.statement_index <= terminator_loc.statement_index); + + self.seek_(target, true); + + if target != terminator_loc { + return; + } + + let terminator = self.body.basic_blocks()[target.block].terminator(); + if let mir::TerminatorKind::Call { + destination: Some((return_place, _)), func, args, .. + } = &terminator.kind + { + if !self.call_return_effect_applied { + self.call_return_effect_applied = true; + self.results.borrow().analysis.apply_call_return_effect( + &mut self.state, + target.block, + func, + args, + return_place, + ); + } + } + } + + fn seek_(&mut self, target: Location, apply_after_effect_at_target: bool) { + use CursorPosition::*; + + match self.pos { + // Return early if we are already at the target location. + Before(curr) if curr == target && !apply_after_effect_at_target => return, + After(curr) if curr == target && apply_after_effect_at_target => return, + + // Otherwise, we must reset to the start of the target block if... + + // we are in a different block entirely. + BlockStart(block) | Before(Location { block, .. }) | After(Location { block, .. }) + if block != target.block => + { + self.seek_to_block_start(target.block) + } + + // we are in the same block but have advanced past the target statement. + Before(curr) | After(curr) if curr.statement_index > target.statement_index => { + self.seek_to_block_start(target.block) + } + + // we have already applied the entire effect of a statement but only wish to observe + // its "before" effect. + After(curr) + if curr.statement_index == target.statement_index + && !apply_after_effect_at_target => + { + self.seek_to_block_start(target.block) + } + + // N.B., `call_return_effect_applied` is checked in `seek_after`, not here. + _ => (), + } + + let analysis = &self.results.borrow().analysis; + let block_data = &self.body.basic_blocks()[target.block]; + + // At this point, the cursor is in the same block as the target location at an earlier + // statement. + debug_assert_eq!(target.block, self.pos.block()); + + // Find the first statement whose transfer function has not yet been applied. + let first_unapplied_statement = match self.pos { + BlockStart(_) => 0, + After(Location { statement_index, .. }) => statement_index + 1, + + // If we have only applied the "before" effect for the current statement, apply the + // remainder before continuing. + Before(curr) => { + if curr.statement_index == block_data.statements.len() { + let terminator = block_data.terminator(); + analysis.apply_terminator_effect(&mut self.state, terminator, curr); + } else { + let statement = &block_data.statements[curr.statement_index]; + analysis.apply_statement_effect(&mut self.state, statement, curr); + } + + // If all we needed to do was go from `Before` to `After` in the same statement, + // we are now done. + if curr.statement_index == target.statement_index { + debug_assert!(apply_after_effect_at_target); + self.pos = After(target); + return; + } + + curr.statement_index + 1 + } + }; + + // We have now applied all effects prior to `first_unapplied_statement`. + + // Apply the effects of all statements before `target`. + let mut location = Location { block: target.block, statement_index: 0 }; + for statement_index in first_unapplied_statement..target.statement_index { + location.statement_index = statement_index; + let statement = &block_data.statements[statement_index]; + analysis.apply_before_statement_effect(&mut self.state, statement, location); + analysis.apply_statement_effect(&mut self.state, statement, location); + } + + // Apply the effect of the statement (or terminator) at `target`. + location.statement_index = target.statement_index; + if target.statement_index == block_data.statements.len() { + let terminator = &block_data.terminator(); + analysis.apply_before_terminator_effect(&mut self.state, terminator, location); + + if apply_after_effect_at_target { + analysis.apply_terminator_effect(&mut self.state, terminator, location); + self.pos = After(target); + } else { + self.pos = Before(target); + } + } else { + let statement = &block_data.statements[target.statement_index]; + analysis.apply_before_statement_effect(&mut self.state, statement, location); + + if apply_after_effect_at_target { + analysis.apply_statement_effect(&mut self.state, statement, location); + self.pos = After(target) + } else { + self.pos = Before(target); + } + } + } +} + +#[derive(Clone, Copy, Debug)] +enum CursorPosition { + /// No effects within this block have been applied. + BlockStart(BasicBlock), + + /// Only the "before" effect of the statement (or terminator) at this location has been + /// applied (along with the effects of all previous statements). + Before(Location), + + /// The effects of all statements up to and including the one at this location have been + /// applied. + After(Location), +} + +impl CursorPosition { + fn block(&self) -> BasicBlock { + match *self { + Self::BlockStart(block) => block, + Self::Before(loc) | Self::After(loc) => loc.block, + } + } +} diff --git a/src/librustc_mir/dataflow/generic/engine.rs b/src/librustc_mir/dataflow/generic/engine.rs new file mode 100644 index 0000000000..c0152b0c7d --- /dev/null +++ b/src/librustc_mir/dataflow/generic/engine.rs @@ -0,0 +1,427 @@ +//! A solver for dataflow problems. + +use std::ffi::OsString; +use std::fs; +use std::path::PathBuf; + +use rustc::mir::{self, traversal, BasicBlock, Location}; +use rustc::ty::TyCtxt; +use rustc_data_structures::work_queue::WorkQueue; +use rustc_hir::def_id::DefId; +use rustc_index::bit_set::BitSet; +use rustc_index::vec::IndexVec; +use rustc_span::symbol::{sym, Symbol}; +use syntax::ast; + +use super::graphviz; +use super::{Analysis, GenKillAnalysis, GenKillSet, Results}; + +/// A solver for dataflow problems. +pub struct Engine<'a, 'tcx, A> +where + A: Analysis<'tcx>, +{ + bits_per_block: usize, + tcx: TyCtxt<'tcx>, + body: &'a mir::Body<'tcx>, + def_id: DefId, + dead_unwinds: Option<&'a BitSet>, + entry_sets: IndexVec>, + analysis: A, + + /// Cached, cumulative transfer functions for each block. + trans_for_block: Option>>, +} + +impl Engine<'a, 'tcx, A> +where + A: GenKillAnalysis<'tcx>, +{ + /// Creates a new `Engine` to solve a gen-kill dataflow problem. + pub fn new_gen_kill( + tcx: TyCtxt<'tcx>, + body: &'a mir::Body<'tcx>, + def_id: DefId, + analysis: A, + ) -> Self { + let bits_per_block = analysis.bits_per_block(body); + let mut trans_for_block = + IndexVec::from_elem(GenKillSet::identity(bits_per_block), body.basic_blocks()); + + // Compute cumulative block transfer functions. + // + // FIXME: we may want to skip this if the MIR is acyclic, since we will never access a + // block transfer function more than once. + + for (block, block_data) in body.basic_blocks().iter_enumerated() { + let trans = &mut trans_for_block[block]; + + for (i, statement) in block_data.statements.iter().enumerate() { + let loc = Location { block, statement_index: i }; + analysis.before_statement_effect(trans, statement, loc); + analysis.statement_effect(trans, statement, loc); + } + + if let Some(terminator) = &block_data.terminator { + let loc = Location { block, statement_index: block_data.statements.len() }; + analysis.before_terminator_effect(trans, terminator, loc); + analysis.terminator_effect(trans, terminator, loc); + } + } + + Self::new(tcx, body, def_id, analysis, Some(trans_for_block)) + } +} + +impl Engine<'a, 'tcx, A> +where + A: Analysis<'tcx>, +{ + /// Creates a new `Engine` to solve a dataflow problem with an arbitrary transfer + /// function. + /// + /// Gen-kill problems should use `new_gen_kill`, which will coalesce transfer functions for + /// better performance. + pub fn new_generic( + tcx: TyCtxt<'tcx>, + body: &'a mir::Body<'tcx>, + def_id: DefId, + analysis: A, + ) -> Self { + Self::new(tcx, body, def_id, analysis, None) + } + + fn new( + tcx: TyCtxt<'tcx>, + body: &'a mir::Body<'tcx>, + def_id: DefId, + analysis: A, + trans_for_block: Option>>, + ) -> Self { + let bits_per_block = analysis.bits_per_block(body); + + let bottom_value_set = if A::BOTTOM_VALUE == true { + BitSet::new_filled(bits_per_block) + } else { + BitSet::new_empty(bits_per_block) + }; + + let mut entry_sets = IndexVec::from_elem(bottom_value_set, body.basic_blocks()); + analysis.initialize_start_block(body, &mut entry_sets[mir::START_BLOCK]); + + Engine { + analysis, + bits_per_block, + tcx, + body, + def_id, + dead_unwinds: None, + entry_sets, + trans_for_block, + } + } + + /// Signals that we do not want dataflow state to propagate across unwind edges for these + /// `BasicBlock`s. + /// + /// You must take care that `dead_unwinds` does not contain a `BasicBlock` that *can* actually + /// unwind during execution. Otherwise, your dataflow results will not be correct. + pub fn dead_unwinds(mut self, dead_unwinds: &'a BitSet) -> Self { + self.dead_unwinds = Some(dead_unwinds); + self + } + + /// Computes the fixpoint for this dataflow problem and returns it. + pub fn iterate_to_fixpoint(mut self) -> Results<'tcx, A> { + let mut temp_state = BitSet::new_empty(self.bits_per_block); + + let mut dirty_queue: WorkQueue = + WorkQueue::with_none(self.body.basic_blocks().len()); + + for (bb, _) in traversal::reverse_postorder(self.body) { + dirty_queue.insert(bb); + } + + // Add blocks that are not reachable from START_BLOCK to the work queue. These blocks will + // be processed after the ones added above. + for bb in self.body.basic_blocks().indices() { + dirty_queue.insert(bb); + } + + while let Some(bb) = dirty_queue.pop() { + let bb_data = &self.body[bb]; + let on_entry = &self.entry_sets[bb]; + + temp_state.overwrite(on_entry); + self.apply_whole_block_effect(&mut temp_state, bb, bb_data); + + self.propagate_bits_into_graph_successors_of( + &mut temp_state, + (bb, bb_data), + &mut dirty_queue, + ); + } + + let Engine { tcx, body, def_id, trans_for_block, entry_sets, analysis, .. } = self; + let results = Results { analysis, entry_sets }; + + let res = write_graphviz_results(tcx, def_id, body, &results, trans_for_block); + if let Err(e) = res { + warn!("Failed to write graphviz dataflow results: {}", e); + } + + results + } + + /// Applies the cumulative effect of an entire block, excluding the call return effect if one + /// exists. + fn apply_whole_block_effect( + &self, + state: &mut BitSet, + block: BasicBlock, + block_data: &mir::BasicBlockData<'tcx>, + ) { + // Use the cached block transfer function if available. + if let Some(trans_for_block) = &self.trans_for_block { + trans_for_block[block].apply(state); + return; + } + + // Otherwise apply effects one-by-one. + + for (statement_index, statement) in block_data.statements.iter().enumerate() { + let location = Location { block, statement_index }; + self.analysis.apply_before_statement_effect(state, statement, location); + self.analysis.apply_statement_effect(state, statement, location); + } + + let terminator = block_data.terminator(); + let location = Location { block, statement_index: block_data.statements.len() }; + self.analysis.apply_before_terminator_effect(state, terminator, location); + self.analysis.apply_terminator_effect(state, terminator, location); + } + + fn propagate_bits_into_graph_successors_of( + &mut self, + in_out: &mut BitSet, + (bb, bb_data): (BasicBlock, &'a mir::BasicBlockData<'tcx>), + dirty_list: &mut WorkQueue, + ) { + use mir::TerminatorKind::*; + + match bb_data.terminator().kind { + Return | Resume | Abort | GeneratorDrop | Unreachable => {} + + Goto { target } + | Assert { target, cleanup: None, .. } + | Yield { resume: target, drop: None, .. } + | Drop { target, location: _, unwind: None } + | DropAndReplace { target, value: _, location: _, unwind: None } => { + self.propagate_bits_into_entry_set_for(in_out, target, dirty_list) + } + + Yield { resume: target, drop: Some(drop), .. } => { + self.propagate_bits_into_entry_set_for(in_out, target, dirty_list); + self.propagate_bits_into_entry_set_for(in_out, drop, dirty_list); + } + + Assert { target, cleanup: Some(unwind), .. } + | Drop { target, location: _, unwind: Some(unwind) } + | DropAndReplace { target, value: _, location: _, unwind: Some(unwind) } => { + self.propagate_bits_into_entry_set_for(in_out, target, dirty_list); + if self.dead_unwinds.map_or(true, |bbs| !bbs.contains(bb)) { + self.propagate_bits_into_entry_set_for(in_out, unwind, dirty_list); + } + } + + SwitchInt { ref targets, .. } => { + for target in targets { + self.propagate_bits_into_entry_set_for(in_out, *target, dirty_list); + } + } + + Call { cleanup, ref destination, ref func, ref args, .. } => { + if let Some(unwind) = cleanup { + if self.dead_unwinds.map_or(true, |bbs| !bbs.contains(bb)) { + self.propagate_bits_into_entry_set_for(in_out, unwind, dirty_list); + } + } + + if let Some((ref dest_place, dest_bb)) = *destination { + // N.B.: This must be done *last*, otherwise the unwind path will see the call + // return effect. + self.analysis.apply_call_return_effect(in_out, bb, func, args, dest_place); + self.propagate_bits_into_entry_set_for(in_out, dest_bb, dirty_list); + } + } + + FalseEdges { real_target, imaginary_target } => { + self.propagate_bits_into_entry_set_for(in_out, real_target, dirty_list); + self.propagate_bits_into_entry_set_for(in_out, imaginary_target, dirty_list); + } + + FalseUnwind { real_target, unwind } => { + self.propagate_bits_into_entry_set_for(in_out, real_target, dirty_list); + if let Some(unwind) = unwind { + if self.dead_unwinds.map_or(true, |bbs| !bbs.contains(bb)) { + self.propagate_bits_into_entry_set_for(in_out, unwind, dirty_list); + } + } + } + } + } + + fn propagate_bits_into_entry_set_for( + &mut self, + in_out: &BitSet, + bb: BasicBlock, + dirty_queue: &mut WorkQueue, + ) { + let entry_set = &mut self.entry_sets[bb]; + let set_changed = self.analysis.join(entry_set, &in_out); + if set_changed { + dirty_queue.insert(bb); + } + } +} + +// Graphviz + +/// Writes a DOT file containing the results of a dataflow analysis if the user requested it via +/// `rustc_mir` attributes. +fn write_graphviz_results( + tcx: TyCtxt<'tcx>, + def_id: DefId, + body: &mir::Body<'tcx>, + results: &Results<'tcx, A>, + block_transfer_functions: Option>>, +) -> std::io::Result<()> +where + A: Analysis<'tcx>, +{ + let attrs = match RustcMirAttrs::parse(tcx, def_id) { + Ok(attrs) => attrs, + + // Invalid `rustc_mir` attrs will be reported using `span_err`. + Err(()) => return Ok(()), + }; + + let path = match attrs.output_path(A::NAME) { + Some(path) => path, + None => return Ok(()), + }; + + let bits_per_block = results.analysis.bits_per_block(body); + + let mut formatter: Box> = match attrs.formatter { + Some(sym::two_phase) => Box::new(graphviz::TwoPhaseDiff::new(bits_per_block)), + Some(sym::gen_kill) => { + if let Some(trans_for_block) = block_transfer_functions { + Box::new(graphviz::BlockTransferFunc::new(body, trans_for_block)) + } else { + Box::new(graphviz::SimpleDiff::new(bits_per_block)) + } + } + + // Default to the `SimpleDiff` output style. + _ => Box::new(graphviz::SimpleDiff::new(bits_per_block)), + }; + + debug!("printing dataflow results for {:?} to {}", def_id, path.display()); + let mut buf = Vec::new(); + + let graphviz = graphviz::Formatter::new(body, def_id, results, &mut *formatter); + dot::render(&graphviz, &mut buf)?; + fs::write(&path, buf)?; + Ok(()) +} + +#[derive(Default)] +struct RustcMirAttrs { + basename_and_suffix: Option, + formatter: Option, +} + +impl RustcMirAttrs { + fn parse(tcx: TyCtxt<'tcx>, def_id: DefId) -> Result { + let attrs = tcx.get_attrs(def_id); + + let mut result = Ok(()); + let mut ret = RustcMirAttrs::default(); + + let rustc_mir_attrs = attrs + .into_iter() + .filter(|attr| attr.check_name(sym::rustc_mir)) + .flat_map(|attr| attr.meta_item_list().into_iter().flat_map(|v| v.into_iter())); + + for attr in rustc_mir_attrs { + let attr_result = if attr.check_name(sym::borrowck_graphviz_postflow) { + Self::set_field(&mut ret.basename_and_suffix, tcx, &attr, |s| { + let path = PathBuf::from(s.to_string()); + match path.file_name() { + Some(_) => Ok(path), + None => { + tcx.sess.span_err(attr.span(), "path must end in a filename"); + Err(()) + } + } + }) + } else if attr.check_name(sym::borrowck_graphviz_format) { + Self::set_field(&mut ret.formatter, tcx, &attr, |s| match s { + sym::gen_kill | sym::two_phase => Ok(s), + _ => { + tcx.sess.span_err(attr.span(), "unknown formatter"); + Err(()) + } + }) + } else { + Ok(()) + }; + + result = result.and(attr_result); + } + + result.map(|()| ret) + } + + fn set_field( + field: &mut Option, + tcx: TyCtxt<'tcx>, + attr: &ast::NestedMetaItem, + mapper: impl FnOnce(Symbol) -> Result, + ) -> Result<(), ()> { + if field.is_some() { + tcx.sess + .span_err(attr.span(), &format!("duplicate values for `{}`", attr.name_or_empty())); + + return Err(()); + } + + if let Some(s) = attr.value_str() { + *field = Some(mapper(s)?); + Ok(()) + } else { + tcx.sess + .span_err(attr.span(), &format!("`{}` requires an argument", attr.name_or_empty())); + Err(()) + } + } + + /// Returns the path where dataflow results should be written, or `None` + /// `borrowck_graphviz_postflow` was not specified. + /// + /// This performs the following transformation to the argument of `borrowck_graphviz_postflow`: + /// + /// "path/suffix.dot" -> "path/analysis_name_suffix.dot" + fn output_path(&self, analysis_name: &str) -> Option { + let mut ret = self.basename_and_suffix.as_ref().cloned()?; + let suffix = ret.file_name().unwrap(); // Checked when parsing attrs + + let mut file_name: OsString = analysis_name.into(); + file_name.push("_"); + file_name.push(suffix); + ret.set_file_name(file_name); + + Some(ret) + } +} diff --git a/src/librustc_mir/dataflow/generic/graphviz.rs b/src/librustc_mir/dataflow/generic/graphviz.rs index 47ace8f33e..fdf86e7b53 100644 --- a/src/librustc_mir/dataflow/generic/graphviz.rs +++ b/src/librustc_mir/dataflow/generic/graphviz.rs @@ -1,14 +1,15 @@ +//! A helpful diagram for debugging dataflow problems. + use std::cell::RefCell; -use std::io::{self, Write}; -use std::{ops, str}; +use std::{io, ops, str}; -use rustc::hir::def_id::DefId; use rustc::mir::{self, BasicBlock, Body, Location}; +use rustc_hir::def_id::DefId; use rustc_index::bit_set::{BitSet, HybridBitSet}; -use rustc_index::vec::Idx; +use rustc_index::vec::{Idx, IndexVec}; +use super::{Analysis, GenKillSet, Results, ResultsRefCursor}; use crate::util::graphviz_safe_def_name; -use super::{Analysis, Results, ResultsRefCursor}; pub struct Formatter<'a, 'tcx, A> where @@ -29,18 +30,15 @@ where body: &'a Body<'tcx>, def_id: DefId, results: &'a Results<'tcx, A>, + state_formatter: &'a mut dyn StateFormatter<'tcx, A>, ) -> Self { let block_formatter = BlockFormatter { bg: Background::Light, - prev_state: BitSet::new_empty(results.analysis.bits_per_block(body)), results: ResultsRefCursor::new(body, results), + state_formatter, }; - Formatter { - body, - def_id, - block_formatter: RefCell::new(block_formatter), - } + Formatter { body, def_id, block_formatter: RefCell::new(block_formatter) } } } @@ -78,10 +76,7 @@ where fn node_label(&self, block: &Self::Node) -> dot::LabelText<'_> { let mut label = Vec::new(); - self.block_formatter - .borrow_mut() - .write_node_label(&mut label, self.body, *block) - .unwrap(); + self.block_formatter.borrow_mut().write_node_label(&mut label, self.body, *block).unwrap(); dot::LabelText::html(String::from_utf8(label).unwrap()) } @@ -90,12 +85,7 @@ where } fn edge_label(&self, e: &Self::Edge) -> dot::LabelText<'_> { - let label = &self.body - [e.source] - .terminator() - .kind - .fmt_successor_labels() - [e.index]; + let label = &self.body[e.source].terminator().kind.fmt_successor_labels()[e.index]; dot::LabelText::label(label.clone()) } } @@ -108,11 +98,7 @@ where type Edge = CfgEdge; fn nodes(&self) -> dot::Nodes<'_, Self::Node> { - self.body - .basic_blocks() - .indices() - .collect::>() - .into() + self.body.basic_blocks().indices().collect::>().into() } fn edges(&self) -> dot::Edges<'_, Self::Edge> { @@ -129,13 +115,7 @@ where } fn target(&self, edge: &Self::Edge) -> Self::Node { - self.body - [edge.source] - .terminator() - .successors() - .nth(edge.index) - .copied() - .unwrap() + self.body[edge.source].terminator().successors().nth(edge.index).copied().unwrap() } } @@ -143,15 +123,21 @@ struct BlockFormatter<'a, 'tcx, A> where A: Analysis<'tcx>, { - prev_state: BitSet, results: ResultsRefCursor<'a, 'a, 'tcx, A>, bg: Background, + state_formatter: &'a mut dyn StateFormatter<'tcx, A>, } impl BlockFormatter<'a, 'tcx, A> where A: Analysis<'tcx>, { + const HEADER_COLOR: &'static str = "#a0a0a0"; + + fn num_state_columns(&self) -> usize { + std::cmp::max(1, self.state_formatter.column_names().len()) + } + fn toggle_background(&mut self) -> Background { let bg = self.bg; self.bg = !bg; @@ -190,199 +176,470 @@ where r#""#, )?; - // A: Block info - write!( - w, - r#" - - "#, - num_headers = 3, - block_id = block.index(), - )?; - - // B: Column headings - write!( - w, - r#" - - - "#, - fmt = r##"bgcolor="#a0a0a0" sides="tl""##, - )?; + // A + B: Block header + if self.state_formatter.column_names().is_empty() { + self.write_block_header_simple(w, block)?; + } else { + self.write_block_header_with_state_columns(w, block)?; + } // C: Entry state self.bg = Background::Light; self.results.seek_to_block_start(block); - self.write_row_with_curr_state(w, "", "(on entry)")?; - self.prev_state.overwrite(self.results.get()); + self.write_row_with_full_state(w, "", "(on_entry)")?; // D: Statement transfer functions for (i, statement) in body[block].statements.iter().enumerate() { let location = Location { block, statement_index: i }; - - let mir_col = format!("{:?}", statement); - let i_col = i.to_string(); - - self.results.seek_after(location); - self.write_row_with_curr_diff(w, &i_col, &mir_col)?; - self.prev_state.overwrite(self.results.get()); + let statement_str = format!("{:?}", statement); + self.write_row_for_location(w, &i.to_string(), &statement_str, location)?; } // E: Terminator transfer function let terminator = body[block].terminator(); - let location = body.terminator_loc(block); + let terminator_loc = body.terminator_loc(block); + let mut terminator_str = String::new(); + terminator.kind.fmt_head(&mut terminator_str).unwrap(); - let mut mir_col = String::new(); - terminator.kind.fmt_head(&mut mir_col).unwrap(); - - self.results.seek_after(location); - self.write_row_with_curr_diff(w, "T", &mir_col)?; - self.prev_state.overwrite(self.results.get()); + self.write_row_for_location(w, "T", &terminator_str, terminator_loc)?; // F: Exit state - if let mir::TerminatorKind::Call { destination: Some(_), .. } = &terminator.kind { - self.write_row_with_curr_state(w, "", "(on unwind)")?; - - self.results.seek_after_assume_call_returns(location); - self.write_row_with_curr_diff(w, "", "(on successful return)")?; + self.results.seek_after(terminator_loc); + if let mir::TerminatorKind::Call { destination: Some(_), .. } = &terminator.kind { + self.write_row_with_full_state(w, "", "(on unwind)")?; + + let num_state_columns = self.num_state_columns(); + self.write_row(w, "", "(on successful return)", |this, w, fmt| { + write!( + w, + r#"") + })?; } else { - self.write_row_with_curr_state(w, "", "(on exit)")?; + self.write_row_with_full_state(w, "", "(on exit)")?; } write!(w, "
    bb{block_id}
    MIRSTATE
    "#, + colspan = num_state_columns, + fmt = fmt, + )?; + + let state_on_unwind = this.results.get().clone(); + this.results.seek_after_assume_call_returns(terminator_loc); + write_diff(w, this.results.analysis(), &state_on_unwind, this.results.get())?; + + write!(w, "
    ") } - fn write_row_with_curr_state( + fn write_block_header_simple( &mut self, w: &mut impl io::Write, - i: &str, - mir: &str, + block: BasicBlock, ) -> io::Result<()> { - let bg = self.toggle_background(); + // +-------------------------------------------------+ + // A | bb4 | + // +-----------------------------------+-------------+ + // B | MIR | STATE | + // +-+---------------------------------+-------------+ + // | | ... | | - let mut out = Vec::new(); - write!(&mut out, "{{")?; - pretty_print_state_elems(&mut out, self.results.analysis(), self.results.get().iter())?; - write!(&mut out, "}}")?; + // A + write!( + w, + concat!("", r#"bb{block_id}"#, "",), + block_id = block.index(), + )?; + // B write!( w, - r#" - {i} - {mir} - {state} - "#, - fmt = &["sides=\"tl\"", bg.attr()].join(" "), - i = i, - mir = dot::escape_html(mir), - state = dot::escape_html(str::from_utf8(&out).unwrap()), + concat!( + "", + r#"MIR"#, + r#"STATE"#, + "", + ), + fmt = format!("bgcolor=\"{}\" sides=\"tl\"", Self::HEADER_COLOR), ) } - fn write_row_with_curr_diff( + fn write_block_header_with_state_columns( &mut self, w: &mut impl io::Write, - i: &str, - mir: &str, + block: BasicBlock, ) -> io::Result<()> { - let bg = self.toggle_background(); - let analysis = self.results.analysis(); + // +------------------------------------+-------------+ + // A | bb4 | STATE | + // +------------------------------------+------+------+ + // B | MIR | GEN | KILL | + // +-+----------------------------------+------+------+ + // | | ... | | | + + let state_column_names = self.state_formatter.column_names(); + + // A + write!( + w, + concat!( + "", + r#"bb{block_id}"#, + r#"STATE"#, + "", + ), + fmt = "sides=\"tl\"", + num_state_cols = state_column_names.len(), + block_id = block.index(), + )?; - let diff = BitSetDiff::compute(&self.prev_state, self.results.get()); + // B + let fmt = format!("bgcolor=\"{}\" sides=\"tl\"", Self::HEADER_COLOR); + write!(w, concat!("", r#"MIR"#,), fmt = fmt,)?; - let mut set = Vec::new(); - pretty_print_state_elems(&mut set, analysis, diff.set.iter())?; + for name in state_column_names { + write!(w, "{name}", fmt = fmt, name = name)?; + } - let mut clear = Vec::new(); - pretty_print_state_elems(&mut clear, analysis, diff.clear.iter())?; + write!(w, "") + } + + /// Write a row with the given index and MIR, using the function argument to fill in the + /// "STATE" column(s). + fn write_row( + &mut self, + w: &mut W, + i: &str, + mir: &str, + f: impl FnOnce(&mut Self, &mut W, &str) -> io::Result<()>, + ) -> io::Result<()> { + let bg = self.toggle_background(); + let fmt = format!("sides=\"tl\" {}", bg.attr()); write!( w, - r#" - {i} - {mir} - "#, + concat!( + "", + r#"{i}"#, + r#"{mir}"#, + ), i = i, - fmt = &["sides=\"tl\"", bg.attr()].join(" "), + fmt = fmt, mir = dot::escape_html(mir), )?; - if !set.is_empty() { + f(self, w, &fmt)?; + write!(w, "") + } + + fn write_row_with_full_state( + &mut self, + w: &mut impl io::Write, + i: &str, + mir: &str, + ) -> io::Result<()> { + self.write_row(w, i, mir, |this, w, fmt| { + let state = this.results.get(); + let analysis = this.results.analysis(); + write!( w, - r#"+{}"#, - dot::escape_html(str::from_utf8(&set).unwrap()), + r#"{{"#, + colspan = this.num_state_columns(), + fmt = fmt, )?; + pretty_print_state_elems(w, analysis, state.iter(), ",", LIMIT_40_ALIGN_1)?; + write!(w, "}}") + }) + } + + fn write_row_for_location( + &mut self, + w: &mut impl io::Write, + i: &str, + mir: &str, + location: Location, + ) -> io::Result<()> { + self.write_row(w, i, mir, |this, w, fmt| { + this.state_formatter.write_state_for_location(w, fmt, &mut this.results, location) + }) + } +} + +/// Controls what gets printed under the `STATE` header. +pub trait StateFormatter<'tcx, A> +where + A: Analysis<'tcx>, +{ + /// The columns that will get printed under `STATE`. + fn column_names(&self) -> &[&str]; + + fn write_state_for_location( + &mut self, + w: &mut dyn io::Write, + fmt: &str, + results: &mut ResultsRefCursor<'_, '_, 'tcx, A>, + location: Location, + ) -> io::Result<()>; +} + +/// Prints a single column containing the state vector immediately *after* each statement. +pub struct SimpleDiff { + prev_state: BitSet, + prev_loc: Location, +} + +impl SimpleDiff { + #![allow(unused)] + pub fn new(bits_per_block: usize) -> Self { + SimpleDiff { prev_state: BitSet::new_empty(bits_per_block), prev_loc: Location::START } + } +} + +impl
    StateFormatter<'tcx, A> for SimpleDiff +where + A: Analysis<'tcx>, +{ + fn column_names(&self) -> &[&str] { + &[] + } + + fn write_state_for_location( + &mut self, + mut w: &mut dyn io::Write, + fmt: &str, + results: &mut ResultsRefCursor<'_, '_, 'tcx, A>, + location: Location, + ) -> io::Result<()> { + if location.statement_index == 0 { + results.seek_to_block_start(location.block); + self.prev_state.overwrite(results.get()); + } else { + // Ensure that we are visiting statements in order, so `prev_state` is correct. + assert_eq!(self.prev_loc.successor_within_block(), location); } - if !set.is_empty() && !clear.is_empty() { - write!(w, " ")?; + self.prev_loc = location; + write!(w, r#""#, fmt = fmt)?; + results.seek_before(location); + let curr_state = results.get(); + write_diff(&mut w, results.analysis(), &self.prev_state, curr_state)?; + self.prev_state.overwrite(curr_state); + write!(w, "") + } +} + +/// Prints two state columns, one containing only the "before" effect of each statement and one +/// containing the full effect. +pub struct TwoPhaseDiff { + prev_state: BitSet, + prev_loc: Location, +} + +impl TwoPhaseDiff { + #![allow(unused)] + pub fn new(bits_per_block: usize) -> Self { + TwoPhaseDiff { prev_state: BitSet::new_empty(bits_per_block), prev_loc: Location::START } + } +} + +impl StateFormatter<'tcx, A> for TwoPhaseDiff +where + A: Analysis<'tcx>, +{ + fn column_names(&self) -> &[&str] { + &["ENTRY", " EXIT"] + } + + fn write_state_for_location( + &mut self, + mut w: &mut dyn io::Write, + fmt: &str, + results: &mut ResultsRefCursor<'_, '_, 'tcx, A>, + location: Location, + ) -> io::Result<()> { + if location.statement_index == 0 { + results.seek_to_block_start(location.block); + self.prev_state.overwrite(results.get()); + } else { + // Ensure that we are visiting statements in order, so `prev_state` is correct. + assert_eq!(self.prev_loc.successor_within_block(), location); } - if !clear.is_empty() { + self.prev_loc = location; + + // Entry + + write!(w, r#""#, fmt = fmt)?; + results.seek_before(location); + let curr_state = results.get(); + write_diff(&mut w, results.analysis(), &self.prev_state, curr_state)?; + self.prev_state.overwrite(curr_state); + write!(w, "")?; + + // Exit + + write!(w, r#""#, fmt = fmt)?; + results.seek_after(location); + let curr_state = results.get(); + write_diff(&mut w, results.analysis(), &self.prev_state, curr_state)?; + self.prev_state.overwrite(curr_state); + write!(w, "") + } +} + +/// Prints the gen/kill set for the entire block. +pub struct BlockTransferFunc<'a, 'tcx, T: Idx> { + body: &'a mir::Body<'tcx>, + trans_for_block: IndexVec>, +} + +impl BlockTransferFunc<'mir, 'tcx, T> { + #![allow(unused)] + pub fn new( + body: &'mir mir::Body<'tcx>, + trans_for_block: IndexVec>, + ) -> Self { + BlockTransferFunc { body, trans_for_block } + } +} + +impl StateFormatter<'tcx, A> for BlockTransferFunc<'mir, 'tcx, A::Idx> +where + A: Analysis<'tcx>, +{ + fn column_names(&self) -> &[&str] { + &["GEN", "KILL"] + } + + fn write_state_for_location( + &mut self, + mut w: &mut dyn io::Write, + fmt: &str, + results: &mut ResultsRefCursor<'_, '_, 'tcx, A>, + location: Location, + ) -> io::Result<()> { + // Only print a single row. + if location.statement_index != 0 { + return Ok(()); + } + + let block_trans = &self.trans_for_block[location.block]; + let rowspan = self.body.basic_blocks()[location.block].statements.len(); + + for set in &[&block_trans.gen, &block_trans.kill] { write!( w, - r#"-{}"#, - dot::escape_html(str::from_utf8(&clear).unwrap()), + r#""#, + fmt = fmt, + rowspan = rowspan )?; + + pretty_print_state_elems(&mut w, results.analysis(), set.iter(), "\n", None)?; + write!(w, "")?; } - write!(w, "") + Ok(()) } } -/// The operations required to transform one `BitSet` into another. -struct BitSetDiff { - set: HybridBitSet, - clear: HybridBitSet, -} +/// Writes two lines, one containing the added bits and one the removed bits. +fn write_diff>( + w: &mut impl io::Write, + analysis: &A, + from: &BitSet, + to: &BitSet, +) -> io::Result<()> { + assert_eq!(from.domain_size(), to.domain_size()); + let len = from.domain_size(); + + let mut set = HybridBitSet::new_empty(len); + let mut clear = HybridBitSet::new_empty(len); + + // FIXME: Implement a lazy iterator over the symmetric difference of two bitsets. + for i in (0..len).map(|i| A::Idx::new(i)) { + match (from.contains(i), to.contains(i)) { + (false, true) => set.insert(i), + (true, false) => clear.insert(i), + _ => continue, + }; + } -impl BitSetDiff { - fn compute(from: &BitSet, to: &BitSet) -> Self { - assert_eq!(from.domain_size(), to.domain_size()); - let len = from.domain_size(); - - let mut set = HybridBitSet::new_empty(len); - let mut clear = HybridBitSet::new_empty(len); - - // FIXME: This could be made faster if `BitSet::xor` were implemented. - for i in (0..len).map(|i| T::new(i)) { - match (from.contains(i), to.contains(i)) { - (false, true) => set.insert(i), - (true, false) => clear.insert(i), - _ => continue, - }; - } + if !set.is_empty() { + write!(w, r#"+"#)?; + pretty_print_state_elems(w, analysis, set.iter(), ",", LIMIT_40_ALIGN_1)?; + write!(w, r#""#)?; + } - BitSetDiff { - set, - clear, - } + if !set.is_empty() && !clear.is_empty() { + write!(w, "
    ")?; + } + + if !clear.is_empty() { + write!(w, r#"-"#)?; + pretty_print_state_elems(w, analysis, clear.iter(), ",", LIMIT_40_ALIGN_1)?; + write!(w, r#""#)?; } + + Ok(()) } -/// Formats each `elem` using the pretty printer provided by `analysis` into a comma-separated -/// list. +/// Line break policy that breaks at 40 characters and starts the next line with a single space. +const LIMIT_40_ALIGN_1: Option = Some(LineBreak { sequence: "
    ", limit: 40 }); + +struct LineBreak { + sequence: &'static str, + limit: usize, +} + +/// Formats each `elem` using the pretty printer provided by `analysis` into a list with the given +/// separator (`sep`). +/// +/// Optionally, it will break lines using the given character sequence (usually `
    `) and +/// character limit. fn pretty_print_state_elems
    ( w: &mut impl io::Write, analysis: &A, elems: impl Iterator, -) -> io::Result<()> + sep: &str, + line_break: Option, +) -> io::Result where A: Analysis<'tcx>, { + let sep_width = sep.chars().count(); + + let mut buf = Vec::new(); + let mut first = true; + let mut curr_line_width = 0; + let mut line_break_inserted = false; + for idx in elems { if first { first = false; } else { - write!(w, ",")?; + write!(w, "{}", sep)?; + curr_line_width += sep_width; + } + + buf.clear(); + analysis.pretty_print_idx(&mut buf, idx)?; + let idx_str = + str::from_utf8(&buf).expect("Output of `pretty_print_idx` must be valid UTF-8"); + let escaped = dot::escape_html(idx_str); + let escaped_width = escaped.chars().count(); + + if let Some(line_break) = &line_break { + if curr_line_width + sep_width + escaped_width > line_break.limit { + write!(w, "{}", line_break.sequence)?; + line_break_inserted = true; + curr_line_width = 0; + } } - analysis.pretty_print_idx(w, idx)?; + write!(w, "{}", escaped)?; + curr_line_width += escaped_width; } - Ok(()) + Ok(line_break_inserted) } /// The background color used for zebra-striping the table. diff --git a/src/librustc_mir/dataflow/generic/mod.rs b/src/librustc_mir/dataflow/generic/mod.rs new file mode 100644 index 0000000000..c9b4f875eb --- /dev/null +++ b/src/librustc_mir/dataflow/generic/mod.rs @@ -0,0 +1,358 @@ +//! A framework that can express both [gen-kill] and generic dataflow problems. +//! +//! There is another interface for dataflow in the compiler in `librustc_mir/dataflow/mod.rs`. The +//! interface in this module will eventually [replace that one][design-meeting]. +//! +//! To actually use this framework, you must implement either the `Analysis` or the `GenKillAnalysis` +//! trait. If your transfer function can be expressed with only gen/kill operations, prefer +//! `GenKillAnalysis` since it will run faster while iterating to fixpoint. Create an `Engine` using +//! the appropriate constructor and call `iterate_to_fixpoint`. You can use a `ResultsCursor` to +//! inspect the fixpoint solution to your dataflow problem. +//! +//! ```ignore(cross-crate-imports) +//! fn do_my_analysis(tcx: TyCtxt<'tcx>, body: &mir::Body<'tcx>, did: DefId) { +//! let analysis = MyAnalysis::new(); +//! +//! // If `MyAnalysis` implements `GenKillAnalysis`. +//! let results = Engine::new_gen_kill(tcx, body, did, analysis).iterate_to_fixpoint(); +//! +//! // If `MyAnalysis` implements `Analysis`. +//! // let results = Engine::new_generic(tcx, body, did, analysis).iterate_to_fixpoint(); +//! +//! let mut cursor = ResultsCursor::new(body, results); +//! +//! for (_, statement_index) in body.block_data[START_BLOCK].statements.iter_enumerated() { +//! cursor.seek_after(Location { block: START_BLOCK, statement_index }); +//! let state = cursor.get(); +//! println!("{:?}", state); +//! } +//! } +//! ``` +//! +//! [gen-kill]: https://en.wikipedia.org/wiki/Data-flow_analysis#Bit_vector_problems +//! [design-meeting]https://github.com/rust-lang/compiler-team/issues/202 + +use std::io; + +use rustc::mir::{self, BasicBlock, Location}; +use rustc_index::bit_set::{BitSet, HybridBitSet}; +use rustc_index::vec::{Idx, IndexVec}; + +use crate::dataflow::BottomValue; + +mod cursor; +mod engine; +mod graphviz; + +pub use self::cursor::{ResultsCursor, ResultsRefCursor}; +pub use self::engine::Engine; + +/// A dataflow analysis that has converged to fixpoint. +pub struct Results<'tcx, A> +where + A: Analysis<'tcx>, +{ + pub analysis: A, + entry_sets: IndexVec>, +} + +impl Results<'tcx, A> +where + A: Analysis<'tcx>, +{ + /// Creates a `ResultsCursor` that can inspect these `Results`. + pub fn into_results_cursor(self, body: &'mir mir::Body<'tcx>) -> ResultsCursor<'mir, 'tcx, A> { + ResultsCursor::new(body, self) + } + + /// Gets the entry set for the given block. + pub fn entry_set_for_block(&self, block: BasicBlock) -> &BitSet { + &self.entry_sets[block] + } +} + +/// Define the domain of a dataflow problem. +/// +/// This trait specifies the lattice on which this analysis operates. For now, this must be a +/// powerset of values of type `Idx`. The elements of this lattice are represented with a `BitSet` +/// and referred to as the state vector. +/// +/// This trait also defines the initial value for the dataflow state upon entry to the +/// `START_BLOCK`, as well as some names used to refer to this analysis when debugging. +pub trait AnalysisDomain<'tcx>: BottomValue { + /// The type of the elements in the state vector. + type Idx: Idx; + + /// A descriptive name for this analysis. Used only for debugging. + /// + /// This name should be brief and contain no spaces, periods or other characters that are not + /// suitable as part of a filename. + const NAME: &'static str; + + /// The size of the state vector. + fn bits_per_block(&self, body: &mir::Body<'tcx>) -> usize; + + /// Mutates the entry set of the `START_BLOCK` to contain the initial state for dataflow + /// analysis. + fn initialize_start_block(&self, body: &mir::Body<'tcx>, state: &mut BitSet); + + /// Prints an element in the state vector for debugging. + fn pretty_print_idx(&self, w: &mut impl io::Write, idx: Self::Idx) -> io::Result<()> { + write!(w, "{:?}", idx) + } +} + +/// A dataflow problem with an arbitrarily complex transfer function. +pub trait Analysis<'tcx>: AnalysisDomain<'tcx> { + /// Updates the current dataflow state with the effect of evaluating a statement. + fn apply_statement_effect( + &self, + state: &mut BitSet, + statement: &mir::Statement<'tcx>, + location: Location, + ); + + /// Updates the current dataflow state with an effect that occurs immediately *before* the + /// given statement. + /// + /// This method is useful if the consumer of the results of this analysis needs only to observe + /// *part* of the effect of a statement (e.g. for two-phase borrows). As a general rule, + /// analyses should not implement this without implementing `apply_statement_effect`. + fn apply_before_statement_effect( + &self, + _state: &mut BitSet, + _statement: &mir::Statement<'tcx>, + _location: Location, + ) { + } + + /// Updates the current dataflow state with the effect of evaluating a terminator. + /// + /// The effect of a successful return from a `Call` terminator should **not** be accounted for + /// in this function. That should go in `apply_call_return_effect`. For example, in the + /// `InitializedPlaces` analyses, the return place for a function call is not marked as + /// initialized here. + fn apply_terminator_effect( + &self, + state: &mut BitSet, + terminator: &mir::Terminator<'tcx>, + location: Location, + ); + + /// Updates the current dataflow state with an effect that occurs immediately *before* the + /// given terminator. + /// + /// This method is useful if the consumer of the results of this analysis needs only to observe + /// *part* of the effect of a terminator (e.g. for two-phase borrows). As a general rule, + /// analyses should not implement this without implementing `apply_terminator_effect`. + fn apply_before_terminator_effect( + &self, + _state: &mut BitSet, + _terminator: &mir::Terminator<'tcx>, + _location: Location, + ) { + } + + /// Updates the current dataflow state with the effect of a successful return from a `Call` + /// terminator. + /// + /// This is separate from `apply_terminator_effect` to properly track state across unwind + /// edges. + fn apply_call_return_effect( + &self, + state: &mut BitSet, + block: BasicBlock, + func: &mir::Operand<'tcx>, + args: &[mir::Operand<'tcx>], + return_place: &mir::Place<'tcx>, + ); +} + +/// A gen/kill dataflow problem. +/// +/// Each method in this trait has a corresponding one in `Analysis`. However, these methods only +/// allow modification of the dataflow state via "gen" and "kill" operations. By defining transfer +/// functions for each statement in this way, the transfer function for an entire basic block can +/// be computed efficiently. +/// +/// `Analysis` is automatically implemented for all implementers of `GenKillAnalysis`. +pub trait GenKillAnalysis<'tcx>: Analysis<'tcx> { + /// See `Analysis::apply_statement_effect`. + fn statement_effect( + &self, + trans: &mut impl GenKill, + statement: &mir::Statement<'tcx>, + location: Location, + ); + + /// See `Analysis::apply_before_statement_effect`. + fn before_statement_effect( + &self, + _trans: &mut impl GenKill, + _statement: &mir::Statement<'tcx>, + _location: Location, + ) { + } + + /// See `Analysis::apply_terminator_effect`. + fn terminator_effect( + &self, + trans: &mut impl GenKill, + terminator: &mir::Terminator<'tcx>, + location: Location, + ); + + /// See `Analysis::apply_before_terminator_effect`. + fn before_terminator_effect( + &self, + _trans: &mut impl GenKill, + _terminator: &mir::Terminator<'tcx>, + _location: Location, + ) { + } + + /// See `Analysis::apply_call_return_effect`. + fn call_return_effect( + &self, + trans: &mut impl GenKill, + block: BasicBlock, + func: &mir::Operand<'tcx>, + args: &[mir::Operand<'tcx>], + return_place: &mir::Place<'tcx>, + ); +} + +impl Analysis<'tcx> for A +where + A: GenKillAnalysis<'tcx>, +{ + fn apply_statement_effect( + &self, + state: &mut BitSet, + statement: &mir::Statement<'tcx>, + location: Location, + ) { + self.statement_effect(state, statement, location); + } + + fn apply_before_statement_effect( + &self, + state: &mut BitSet, + statement: &mir::Statement<'tcx>, + location: Location, + ) { + self.before_statement_effect(state, statement, location); + } + + fn apply_terminator_effect( + &self, + state: &mut BitSet, + terminator: &mir::Terminator<'tcx>, + location: Location, + ) { + self.terminator_effect(state, terminator, location); + } + + fn apply_before_terminator_effect( + &self, + state: &mut BitSet, + terminator: &mir::Terminator<'tcx>, + location: Location, + ) { + self.before_terminator_effect(state, terminator, location); + } + + fn apply_call_return_effect( + &self, + state: &mut BitSet, + block: BasicBlock, + func: &mir::Operand<'tcx>, + args: &[mir::Operand<'tcx>], + return_place: &mir::Place<'tcx>, + ) { + self.call_return_effect(state, block, func, args, return_place); + } +} + +/// The legal operations for a transfer function in a gen/kill problem. +/// +/// This abstraction exists because there are two different contexts in which we call the methods in +/// `GenKillAnalysis`. Sometimes we need to store a single transfer function that can be efficiently +/// applied multiple times, such as when computing the cumulative transfer function for each block. +/// These cases require a `GenKillSet`, which in turn requires two `BitSet`s of storage. Oftentimes, +/// however, we only need to apply an effect once. In *these* cases, it is more efficient to pass the +/// `BitSet` representing the state vector directly into the `*_effect` methods as opposed to +/// building up a `GenKillSet` and then throwing it away. +pub trait GenKill { + /// Inserts `elem` into the state vector. + fn gen(&mut self, elem: T); + + /// Removes `elem` from the state vector. + fn kill(&mut self, elem: T); + + /// Calls `gen` for each element in `elems`. + fn gen_all(&mut self, elems: impl IntoIterator) { + for elem in elems { + self.gen(elem); + } + } + + /// Calls `kill` for each element in `elems`. + fn kill_all(&mut self, elems: impl IntoIterator) { + for elem in elems { + self.kill(elem); + } + } +} + +/// Stores a transfer function for a gen/kill problem. +/// +/// Calling `gen`/`kill` on a `GenKillSet` will "build up" a transfer function so that it can be +/// applied multiple times efficiently. When there are multiple calls to `gen` and/or `kill` for +/// the same element, the most recent one takes precedence. +#[derive(Clone)] +pub struct GenKillSet { + gen: HybridBitSet, + kill: HybridBitSet, +} + +impl GenKillSet { + /// Creates a new transfer function that will leave the dataflow state unchanged. + pub fn identity(universe: usize) -> Self { + GenKillSet { + gen: HybridBitSet::new_empty(universe), + kill: HybridBitSet::new_empty(universe), + } + } + + /// Applies this transfer function to the given state vector. + pub fn apply(&self, state: &mut BitSet) { + state.union(&self.gen); + state.subtract(&self.kill); + } +} + +impl GenKill for GenKillSet { + fn gen(&mut self, elem: T) { + self.gen.insert(elem); + self.kill.remove(elem); + } + + fn kill(&mut self, elem: T) { + self.kill.insert(elem); + self.gen.remove(elem); + } +} + +impl GenKill for BitSet { + fn gen(&mut self, elem: T) { + self.insert(elem); + } + + fn kill(&mut self, elem: T) { + self.remove(elem); + } +} + +#[cfg(test)] +mod tests; diff --git a/src/librustc_mir/dataflow/generic/tests.rs b/src/librustc_mir/dataflow/generic/tests.rs new file mode 100644 index 0000000000..50d4bdb67f --- /dev/null +++ b/src/librustc_mir/dataflow/generic/tests.rs @@ -0,0 +1,332 @@ +//! A test for the logic that updates the state in a `ResultsCursor` during seek. + +use rustc::mir::{self, BasicBlock, Location}; +use rustc::ty; +use rustc_index::bit_set::BitSet; +use rustc_index::vec::IndexVec; +use rustc_span::DUMMY_SP; + +use super::*; +use crate::dataflow::BottomValue; + +/// Returns `true` if the given location points to a `Call` terminator that can return +/// successfully. +fn is_call_terminator_non_diverging(body: &mir::Body<'_>, loc: Location) -> bool { + loc == body.terminator_loc(loc.block) + && matches!( + body[loc.block].terminator().kind, + mir::TerminatorKind::Call { destination: Some(_), .. } + ) +} + +/// Creates a `mir::Body` with a few disconnected basic blocks. +/// +/// This is the `Body` that will be used by the `MockAnalysis` below. The shape of its CFG is not +/// important. +fn mock_body() -> mir::Body<'static> { + let source_info = mir::SourceInfo { scope: mir::OUTERMOST_SOURCE_SCOPE, span: DUMMY_SP }; + + let mut blocks = IndexVec::new(); + let mut block = |n, kind| { + let nop = mir::Statement { source_info, kind: mir::StatementKind::Nop }; + + blocks.push(mir::BasicBlockData { + statements: std::iter::repeat(&nop).cloned().take(n).collect(), + terminator: Some(mir::Terminator { source_info, kind }), + is_cleanup: false, + }) + }; + + let dummy_place = mir::Place { local: mir::RETURN_PLACE, projection: ty::List::empty() }; + + block(4, mir::TerminatorKind::Return); + block(1, mir::TerminatorKind::Return); + block( + 2, + mir::TerminatorKind::Call { + func: mir::Operand::Copy(dummy_place.clone()), + args: vec![], + destination: Some((dummy_place.clone(), mir::START_BLOCK)), + cleanup: None, + from_hir_call: false, + }, + ); + block(3, mir::TerminatorKind::Return); + block(0, mir::TerminatorKind::Return); + block( + 4, + mir::TerminatorKind::Call { + func: mir::Operand::Copy(dummy_place.clone()), + args: vec![], + destination: Some((dummy_place.clone(), mir::START_BLOCK)), + cleanup: None, + from_hir_call: false, + }, + ); + + mir::Body::new_cfg_only(blocks) +} + +/// A dataflow analysis whose state is unique at every possible `SeekTarget`. +/// +/// Uniqueness is achieved by having a *locally* unique effect before and after each statement and +/// terminator (see `effect_at_target`) while ensuring that the entry set for each block is +/// *globally* unique (see `mock_entry_set`). +/// +/// For example, a `BasicBlock` with ID `2` and a `Call` terminator has the following state at each +/// location ("+x" indicates that "x" is added to the state). +/// +/// | Location | Before | After | +/// |------------------------|-------------------|--------| +/// | (on_entry) | {102} || +/// | Statement 0 | +0 | +1 | +/// | statement 1 | +2 | +3 | +/// | `Call` terminator | +4 | +5 | +/// | (on unwind) | {102,0,1,2,3,4,5} || +/// | (on successful return) | +6 || +/// +/// The `102` in the block's entry set is derived from the basic block index and ensures that the +/// expected state is unique across all basic blocks. Remember, it is generated by +/// `mock_entry_sets`, not from actually running `MockAnalysis` to fixpoint. +struct MockAnalysis<'tcx> { + body: &'tcx mir::Body<'tcx>, +} + +impl MockAnalysis<'tcx> { + const BASIC_BLOCK_OFFSET: usize = 100; + + /// The entry set for each `BasicBlock` is the ID of that block offset by a fixed amount to + /// avoid colliding with the statement/terminator effects. + fn mock_entry_set(&self, bb: BasicBlock) -> BitSet { + let mut ret = BitSet::new_empty(self.bits_per_block(self.body)); + ret.insert(Self::BASIC_BLOCK_OFFSET + bb.index()); + ret + } + + fn mock_entry_sets(&self) -> IndexVec> { + let empty = BitSet::new_empty(self.bits_per_block(self.body)); + let mut ret = IndexVec::from_elem(empty, &self.body.basic_blocks()); + + for (bb, _) in self.body.basic_blocks().iter_enumerated() { + ret[bb] = self.mock_entry_set(bb); + } + + ret + } + + /// Returns the index that should be added to the dataflow state at the given target. + /// + /// This index is only unique within a given basic block. `SeekAfter` and + /// `SeekAfterAssumeCallReturns` have the same effect unless `target` is a `Call` terminator. + fn effect_at_target(&self, target: SeekTarget) -> Option { + use SeekTarget::*; + + let idx = match target { + BlockStart(_) => return None, + + AfterAssumeCallReturns(loc) if is_call_terminator_non_diverging(self.body, loc) => { + loc.statement_index * 2 + 2 + } + + Before(loc) => loc.statement_index * 2, + After(loc) | AfterAssumeCallReturns(loc) => loc.statement_index * 2 + 1, + }; + + assert!(idx < Self::BASIC_BLOCK_OFFSET, "Too many statements in basic block"); + Some(idx) + } + + /// Returns the expected state at the given `SeekTarget`. + /// + /// This is the union of index of the target basic block, the index assigned to the + /// target statement or terminator, and the indices of all preceding statements in the target + /// basic block. + /// + /// For example, the expected state when calling + /// `seek_before(Location { block: 2, statement_index: 2 })` would be `[102, 0, 1, 2, 3, 4]`. + fn expected_state_at_target(&self, target: SeekTarget) -> BitSet { + let mut ret = BitSet::new_empty(self.bits_per_block(self.body)); + ret.insert(Self::BASIC_BLOCK_OFFSET + target.block().index()); + + if let Some(target_effect) = self.effect_at_target(target) { + for i in 0..=target_effect { + ret.insert(i); + } + } + + ret + } +} + +impl BottomValue for MockAnalysis<'tcx> { + const BOTTOM_VALUE: bool = false; +} + +impl AnalysisDomain<'tcx> for MockAnalysis<'tcx> { + type Idx = usize; + + const NAME: &'static str = "mock"; + + fn bits_per_block(&self, body: &mir::Body<'tcx>) -> usize { + Self::BASIC_BLOCK_OFFSET + body.basic_blocks().len() + } + + fn initialize_start_block(&self, _: &mir::Body<'tcx>, _: &mut BitSet) { + unimplemented!("This is never called since `MockAnalysis` is never iterated to fixpoint"); + } +} + +impl Analysis<'tcx> for MockAnalysis<'tcx> { + fn apply_statement_effect( + &self, + state: &mut BitSet, + _statement: &mir::Statement<'tcx>, + location: Location, + ) { + let idx = self.effect_at_target(SeekTarget::After(location)).unwrap(); + assert!(state.insert(idx)); + } + + fn apply_before_statement_effect( + &self, + state: &mut BitSet, + _statement: &mir::Statement<'tcx>, + location: Location, + ) { + let idx = self.effect_at_target(SeekTarget::Before(location)).unwrap(); + assert!(state.insert(idx)); + } + + fn apply_terminator_effect( + &self, + state: &mut BitSet, + _terminator: &mir::Terminator<'tcx>, + location: Location, + ) { + let idx = self.effect_at_target(SeekTarget::After(location)).unwrap(); + assert!(state.insert(idx)); + } + + fn apply_before_terminator_effect( + &self, + state: &mut BitSet, + _terminator: &mir::Terminator<'tcx>, + location: Location, + ) { + let idx = self.effect_at_target(SeekTarget::Before(location)).unwrap(); + assert!(state.insert(idx)); + } + + fn apply_call_return_effect( + &self, + state: &mut BitSet, + block: BasicBlock, + _func: &mir::Operand<'tcx>, + _args: &[mir::Operand<'tcx>], + _return_place: &mir::Place<'tcx>, + ) { + let location = self.body.terminator_loc(block); + let idx = self.effect_at_target(SeekTarget::AfterAssumeCallReturns(location)).unwrap(); + assert!(state.insert(idx)); + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +enum SeekTarget { + BlockStart(BasicBlock), + Before(Location), + After(Location), + AfterAssumeCallReturns(Location), +} + +impl SeekTarget { + fn block(&self) -> BasicBlock { + use SeekTarget::*; + + match *self { + BlockStart(block) => block, + Before(loc) | After(loc) | AfterAssumeCallReturns(loc) => loc.block, + } + } + + /// An iterator over all possible `SeekTarget`s in a given block in order, starting with + /// `BlockStart`. + /// + /// This includes both `After` and `AfterAssumeCallReturns` for every `Location`. + fn iter_in_block(body: &mir::Body<'_>, block: BasicBlock) -> impl Iterator { + let statements_and_terminator = (0..=body[block].statements.len()) + .flat_map(|i| (0..3).map(move |j| (i, j))) + .map(move |(i, kind)| { + let loc = Location { block, statement_index: i }; + match kind { + 0 => SeekTarget::Before(loc), + 1 => SeekTarget::After(loc), + 2 => SeekTarget::AfterAssumeCallReturns(loc), + _ => unreachable!(), + } + }); + + std::iter::once(SeekTarget::BlockStart(block)).chain(statements_and_terminator) + } +} + +#[test] +fn cursor_seek() { + let body = mock_body(); + let body = &body; + let analysis = MockAnalysis { body }; + + let mut cursor = + Results { entry_sets: analysis.mock_entry_sets(), analysis }.into_results_cursor(body); + + // Sanity check: the mock call return effect is unique and actually being applied. + let call_terminator_loc = Location { block: BasicBlock::from_usize(2), statement_index: 2 }; + assert!(is_call_terminator_non_diverging(body, call_terminator_loc)); + + let call_return_effect = cursor + .analysis() + .effect_at_target(SeekTarget::AfterAssumeCallReturns(call_terminator_loc)) + .unwrap(); + assert_ne!( + call_return_effect, + cursor.analysis().effect_at_target(SeekTarget::After(call_terminator_loc)).unwrap() + ); + + cursor.seek_after(call_terminator_loc); + assert!(!cursor.get().contains(call_return_effect)); + cursor.seek_after_assume_call_returns(call_terminator_loc); + assert!(cursor.get().contains(call_return_effect)); + + let every_target = || { + body.basic_blocks() + .iter_enumerated() + .flat_map(|(bb, _)| SeekTarget::iter_in_block(body, bb)) + }; + + let mut seek_to_target = |targ| { + use SeekTarget::*; + + match targ { + BlockStart(block) => cursor.seek_to_block_start(block), + Before(loc) => cursor.seek_before(loc), + After(loc) => cursor.seek_after(loc), + AfterAssumeCallReturns(loc) => cursor.seek_after_assume_call_returns(loc), + } + + assert_eq!(cursor.get(), &cursor.analysis().expected_state_at_target(targ)); + }; + + // Seek *to* every possible `SeekTarget` *from* every possible `SeekTarget`. + // + // By resetting the cursor to `from` each time it changes, we end up checking some edges twice. + // What we really want is an Eulerian cycle for the complete digraph over all possible + // `SeekTarget`s, but it's not worth spending the time to compute it. + for from in every_target() { + seek_to_target(from); + + for to in every_target() { + seek_to_target(to); + seek_to_target(from); + } + } +} diff --git a/src/librustc_mir/dataflow/graphviz.rs b/src/librustc_mir/dataflow/graphviz.rs index b0d8581784..45d2b1a71f 100644 --- a/src/librustc_mir/dataflow/graphviz.rs +++ b/src/librustc_mir/dataflow/graphviz.rs @@ -1,7 +1,7 @@ //! Hook into libgraphviz for rendering dataflow graphs for MIR. -use rustc::hir::def_id::DefId; use rustc::mir::{BasicBlock, Body}; +use rustc_hir::def_id::DefId; use std::fs; use std::io; @@ -10,9 +10,9 @@ use std::path::Path; use crate::util::graphviz_safe_def_name; -use super::{BitDenotation, DataflowState}; use super::DataflowBuilder; use super::DebugFormatted; +use super::{BitDenotation, DataflowState}; pub trait MirWithFlowState<'tcx> { type BD: BitDenotation<'tcx>; @@ -22,16 +22,24 @@ pub trait MirWithFlowState<'tcx> { } impl<'a, 'tcx, BD> MirWithFlowState<'tcx> for DataflowBuilder<'a, 'tcx, BD> - where BD: BitDenotation<'tcx> +where + BD: BitDenotation<'tcx>, { type BD = BD; - fn def_id(&self) -> DefId { self.def_id } - fn body(&self) -> &Body<'tcx> { self.flow_state.body() } - fn flow_state(&self) -> &DataflowState<'tcx, Self::BD> { &self.flow_state.flow_state } + fn def_id(&self) -> DefId { + self.def_id + } + fn body(&self) -> &Body<'tcx> { + self.flow_state.body() + } + fn flow_state(&self) -> &DataflowState<'tcx, Self::BD> { + &self.flow_state.flow_state + } } -struct Graph<'a, 'tcx, MWF, P> where - MWF: MirWithFlowState<'tcx> +struct Graph<'a, 'tcx, MWF, P> +where + MWF: MirWithFlowState<'tcx>, { mbcx: &'a MWF, phantom: PhantomData<&'tcx ()>, @@ -41,32 +49,37 @@ struct Graph<'a, 'tcx, MWF, P> where pub(crate) fn print_borrowck_graph_to<'a, 'tcx, BD, P>( mbcx: &DataflowBuilder<'a, 'tcx, BD>, path: &Path, - render_idx: P) - -> io::Result<()> - where BD: BitDenotation<'tcx>, - P: Fn(&BD, BD::Idx) -> DebugFormatted, + render_idx: P, +) -> io::Result<()> +where + BD: BitDenotation<'tcx>, + P: Fn(&BD, BD::Idx) -> DebugFormatted, { let g = Graph { mbcx, phantom: PhantomData, render_idx }; let mut v = Vec::new(); dot::render(&g, &mut v)?; - debug!("print_borrowck_graph_to path: {} def_id: {:?}", - path.display(), mbcx.def_id); + debug!("print_borrowck_graph_to path: {} def_id: {:?}", path.display(), mbcx.def_id); fs::write(path, v) } pub type Node = BasicBlock; #[derive(Copy, Clone, PartialEq, Eq, Debug)] -pub struct Edge { source: BasicBlock, index: usize } +pub struct Edge { + source: BasicBlock, + index: usize, +} fn outgoing(body: &Body<'_>, bb: BasicBlock) -> Vec { (0..body[bb].terminator().successors().count()) - .map(|index| Edge { source: bb, index: index}).collect() + .map(|index| Edge { source: bb, index: index }) + .collect() } impl<'a, 'tcx, MWF, P> dot::Labeller<'a> for Graph<'a, 'tcx, MWF, P> - where MWF: MirWithFlowState<'tcx>, - P: Fn(&MWF::BD, >::Idx) -> DebugFormatted, +where + MWF: MirWithFlowState<'tcx>, + P: Fn(&MWF::BD, >::Idx) -> DebugFormatted, { type Node = Node; type Edge = Edge; @@ -76,8 +89,7 @@ impl<'a, 'tcx, MWF, P> dot::Labeller<'a> for Graph<'a, 'tcx, MWF, P> } fn node_id(&self, n: &Node) -> dot::Id<'_> { - dot::Id::new(format!("bb_{}", n.index())) - .unwrap() + dot::Id::new(format!("bb_{}", n.index())).unwrap() } fn node_label(&self, n: &Node) -> dot::LabelText<'_> { @@ -103,7 +115,6 @@ impl<'a, 'tcx, MWF, P> dot::Labeller<'a> for Graph<'a, 'tcx, MWF, P> dot::LabelText::html(String::from_utf8(v).unwrap()) } - fn node_shape(&self, _n: &Node) -> Option> { Some(dot::LabelText::label("none")) } @@ -116,15 +127,18 @@ impl<'a, 'tcx, MWF, P> dot::Labeller<'a> for Graph<'a, 'tcx, MWF, P> } impl<'a, 'tcx, MWF, P> Graph<'a, 'tcx, MWF, P> -where MWF: MirWithFlowState<'tcx>, - P: Fn(&MWF::BD, >::Idx) -> DebugFormatted, +where + MWF: MirWithFlowState<'tcx>, + P: Fn(&MWF::BD, >::Idx) -> DebugFormatted, { /// Generate the node label - fn node_label_internal(&self, - n: &Node, - w: &mut W, - block: BasicBlock, - body: &Body<'_>) -> io::Result<()> { + fn node_label_internal( + &self, + n: &Node, + w: &mut W, + block: BasicBlock, + body: &Body<'_>, + ) -> io::Result<()> { // Header rows const HDRS: [&str; 4] = ["ENTRY", "MIR", "BLOCK GENS", "BLOCK KILLS"]; const HDR_FMT: &str = "bgcolor=\"grey\""; @@ -145,12 +159,13 @@ where MWF: MirWithFlowState<'tcx>, } /// Builds the verbose row: full MIR data, and detailed gen/kill/entry sets. - fn node_label_verbose_row(&self, - n: &Node, - w: &mut W, - block: BasicBlock, - body: &Body<'_>) - -> io::Result<()> { + fn node_label_verbose_row( + &self, + n: &Node, + w: &mut W, + block: BasicBlock, + body: &Body<'_>, + ) -> io::Result<()> { let i = n.index(); macro_rules! dump_set_for { @@ -158,14 +173,13 @@ where MWF: MirWithFlowState<'tcx>, write!(w, "")?; let flow = self.mbcx.flow_state(); - let entry_interp = flow.$interpret(&flow.operator, - flow.sets.$set(i), - &self.render_idx); + let entry_interp = + flow.$interpret(&flow.operator, flow.sets.$set(i), &self.render_idx); for e in &entry_interp { write!(w, "{:?}
    ", e)?; } write!(w, "")?; - } + }; } write!(w, "")?; @@ -177,8 +191,11 @@ where MWF: MirWithFlowState<'tcx>, { let data = &body[block]; for (i, statement) in data.statements.iter().enumerate() { - write!(w, "{}
    ", - dot::escape_html(&format!("{:3}: {:?}", i, statement)))?; + write!( + w, + "{}
    ", + dot::escape_html(&format!("{:3}: {:?}", i, statement)) + )?; } } write!(w, "")?; @@ -195,12 +212,13 @@ where MWF: MirWithFlowState<'tcx>, } /// Builds the summary row: terminator, gen/kill/entry bit sets. - fn node_label_final_row(&self, - n: &Node, - w: &mut W, - block: BasicBlock, - body: &Body<'_>) - -> io::Result<()> { + fn node_label_final_row( + &self, + n: &Node, + w: &mut W, + block: BasicBlock, + body: &Body<'_>, + ) -> io::Result<()> { let i = n.index(); let flow = self.mbcx.flow_state(); @@ -233,26 +251,19 @@ where MWF: MirWithFlowState<'tcx>, } impl<'a, 'tcx, MWF, P> dot::GraphWalk<'a> for Graph<'a, 'tcx, MWF, P> - where MWF: MirWithFlowState<'tcx> +where + MWF: MirWithFlowState<'tcx>, { type Node = Node; type Edge = Edge; fn nodes(&self) -> dot::Nodes<'_, Node> { - self.mbcx.body() - .basic_blocks() - .indices() - .collect::>() - .into() + self.mbcx.body().basic_blocks().indices().collect::>().into() } fn edges(&self) -> dot::Edges<'_, Edge> { let body = self.mbcx.body(); - body.basic_blocks() - .indices() - .flat_map(|bb| outgoing(body, bb)) - .collect::>() - .into() + body.basic_blocks().indices().flat_map(|bb| outgoing(body, bb)).collect::>().into() } fn source(&self, edge: &Edge) -> Node { diff --git a/src/librustc_mir/dataflow/impls/borrowed_locals.rs b/src/librustc_mir/dataflow/impls/borrowed_locals.rs index 1c43a553cc..63834d0ecd 100644 --- a/src/librustc_mir/dataflow/impls/borrowed_locals.rs +++ b/src/librustc_mir/dataflow/impls/borrowed_locals.rs @@ -1,8 +1,8 @@ pub use super::*; -use rustc::mir::*; -use rustc::mir::visit::Visitor; use crate::dataflow::{BitDenotation, GenKillSet}; +use rustc::mir::visit::Visitor; +use rustc::mir::*; /// This calculates if any part of a MIR local could have previously been borrowed. /// This means that once a local has been borrowed, its bit will be set @@ -16,8 +16,7 @@ pub struct HaveBeenBorrowedLocals<'a, 'tcx> { } impl<'a, 'tcx> HaveBeenBorrowedLocals<'a, 'tcx> { - pub fn new(body: &'a Body<'tcx>) - -> Self { + pub fn new(body: &'a Body<'tcx>) -> Self { HaveBeenBorrowedLocals { body } } @@ -28,7 +27,9 @@ impl<'a, 'tcx> HaveBeenBorrowedLocals<'a, 'tcx> { impl<'a, 'tcx> BitDenotation<'tcx> for HaveBeenBorrowedLocals<'a, 'tcx> { type Idx = Local; - fn name() -> &'static str { "has_been_borrowed_locals" } + fn name() -> &'static str { + "has_been_borrowed_locals" + } fn bits_per_block(&self) -> usize { self.body.local_decls.len() } @@ -37,14 +38,10 @@ impl<'a, 'tcx> BitDenotation<'tcx> for HaveBeenBorrowedLocals<'a, 'tcx> { // Nothing is borrowed on function entry } - fn statement_effect(&self, - trans: &mut GenKillSet, - loc: Location) { + fn statement_effect(&self, trans: &mut GenKillSet, loc: Location) { let stmt = &self.body[loc.block].statements[loc.statement_index]; - BorrowedLocalsVisitor { - trans, - }.visit_statement(stmt, loc); + BorrowedLocalsVisitor { trans }.visit_statement(stmt, loc); // StorageDead invalidates all borrows and raw pointers to a local match stmt.kind { @@ -53,17 +50,13 @@ impl<'a, 'tcx> BitDenotation<'tcx> for HaveBeenBorrowedLocals<'a, 'tcx> { } } - fn terminator_effect(&self, - trans: &mut GenKillSet, - loc: Location) { + fn terminator_effect(&self, trans: &mut GenKillSet, loc: Location) { let terminator = self.body[loc.block].terminator(); - BorrowedLocalsVisitor { - trans, - }.visit_terminator(terminator, loc); + BorrowedLocalsVisitor { trans }.visit_terminator(terminator, loc); match &terminator.kind { // Drop terminators borrows the location - TerminatorKind::Drop { location, .. } | - TerminatorKind::DropAndReplace { location, .. } => { + TerminatorKind::Drop { location, .. } + | TerminatorKind::DropAndReplace { location, .. } => { if let Some(local) = find_local(location) { trans.gen(local); } @@ -93,16 +86,11 @@ struct BorrowedLocalsVisitor<'gk> { } fn find_local(place: &Place<'_>) -> Option { - match place.base { - PlaceBase::Local(local) if !place.is_indirect() => Some(local), - _ => None, - } + if !place.is_indirect() { Some(place.local) } else { None } } impl<'tcx> Visitor<'tcx> for BorrowedLocalsVisitor<'_> { - fn visit_rvalue(&mut self, - rvalue: &Rvalue<'tcx>, - location: Location) { + fn visit_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location) { if let Rvalue::Ref(_, _, ref place) = *rvalue { if let Some(local) = find_local(place) { self.trans.gen(local); diff --git a/src/librustc_mir/dataflow/impls/borrows.rs b/src/librustc_mir/dataflow/impls/borrows.rs index 5433b7f5f7..f94ee67f2b 100644 --- a/src/librustc_mir/dataflow/impls/borrows.rs +++ b/src/librustc_mir/dataflow/impls/borrows.rs @@ -1,14 +1,14 @@ -use rustc::mir::{self, Location, Place, PlaceBase, Body}; -use rustc::ty::{self, TyCtxt}; +use rustc::mir::{self, Body, Location, Place}; use rustc::ty::RegionVid; +use rustc::ty::TyCtxt; -use rustc_index::bit_set::BitSet; use rustc_data_structures::fx::FxHashMap; -use rustc_index::vec::{Idx, IndexVec}; +use rustc_index::bit_set::BitSet; +use rustc_index::vec::IndexVec; use crate::borrow_check::{ - ToRegionVid, BorrowSet, BorrowData, RegionInferenceContext, PlaceExt, PlaceConflictBias, - places_conflict, + places_conflict, BorrowData, BorrowSet, PlaceConflictBias, PlaceExt, RegionInferenceContext, + ToRegionVid, }; use crate::dataflow::{BitDenotation, BottomValue, GenKillSet}; @@ -30,7 +30,6 @@ rustc_index::newtype_index! { pub struct Borrows<'a, 'tcx> { tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, - param_env: ty::ParamEnv<'tcx>, borrow_set: Rc>, borrows_out_of_scope_at_location: FxHashMap>, @@ -43,7 +42,7 @@ struct StackEntry { bb: mir::BasicBlock, lo: usize, hi: usize, - first_part_only: bool + first_part_only: bool, } fn precompute_borrows_out_of_scope<'tcx>( @@ -77,16 +76,13 @@ fn precompute_borrows_out_of_scope<'tcx>( while let Some(StackEntry { bb, lo, hi, first_part_only }) = stack.pop() { let mut finished_early = first_part_only; - for i in lo ..= hi { + for i in lo..=hi { let location = Location { block: bb, statement_index: i }; // If region does not contain a point at the location, then add to list and skip // successor locations. if !regioncx.region_contains(borrow_region, location) { debug!("borrow {:?} gets killed at {:?}", borrow_index, location); - borrows_out_of_scope_at_location - .entry(location) - .or_default() - .push(borrow_index); + borrows_out_of_scope_at_location.entry(location).or_default().push(borrow_index); finished_early = true; break; } @@ -97,7 +93,8 @@ fn precompute_borrows_out_of_scope<'tcx>( let bb_data = &body[bb]; assert!(hi == bb_data.statements.len()); for &succ_bb in bb_data.terminator().successors() { - visited.entry(succ_bb) + visited + .entry(succ_bb) .and_modify(|lo| { // `succ_bb` has been seen before. If it wasn't // fully processed, add its first part to `stack` @@ -136,7 +133,6 @@ impl<'a, 'tcx> Borrows<'a, 'tcx> { crate fn new( tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, - param_env: ty::ParamEnv<'tcx>, nonlexical_regioncx: Rc>, borrow_set: &Rc>, ) -> Self { @@ -145,22 +141,28 @@ impl<'a, 'tcx> Borrows<'a, 'tcx> { let borrow_region = borrow_data.region.to_region_vid(); let location = borrow_set.borrows[borrow_index].reserve_location; - precompute_borrows_out_of_scope(body, &nonlexical_regioncx, - &mut borrows_out_of_scope_at_location, - borrow_index, borrow_region, location); + precompute_borrows_out_of_scope( + body, + &nonlexical_regioncx, + &mut borrows_out_of_scope_at_location, + borrow_index, + borrow_region, + location, + ); } Borrows { tcx, body, - param_env, borrow_set: borrow_set.clone(), borrows_out_of_scope_at_location, _nonlexical_regioncx: nonlexical_regioncx, } } - crate fn borrows(&self) -> &IndexVec> { &self.borrow_set.borrows } + crate fn borrows(&self) -> &IndexVec> { + &self.borrow_set.borrows + } pub fn location(&self, idx: BorrowIndex) -> &Location { &self.borrow_set.borrows[idx].reserve_location @@ -168,9 +170,11 @@ impl<'a, 'tcx> Borrows<'a, 'tcx> { /// Add all borrows to the kill set, if those borrows are out of scope at `location`. /// That means they went out of a nonlexical scope - fn kill_loans_out_of_scope_at_location(&self, - trans: &mut GenKillSet, - location: Location) { + fn kill_loans_out_of_scope_at_location( + &self, + trans: &mut GenKillSet, + location: Location, + ) { // NOTE: The state associated with a given `location` // reflects the dataflow on entry to the statement. // Iterate over each of the borrows that we've precomputed @@ -188,54 +192,45 @@ impl<'a, 'tcx> Borrows<'a, 'tcx> { } /// Kill any borrows that conflict with `place`. - fn kill_borrows_on_place( - &self, - trans: &mut GenKillSet, - place: &Place<'tcx> - ) { + fn kill_borrows_on_place(&self, trans: &mut GenKillSet, place: &Place<'tcx>) { debug!("kill_borrows_on_place: place={:?}", place); - if let PlaceBase::Local(local) = place.base { - let other_borrows_of_local = self - .borrow_set - .local_map - .get(&local) - .into_iter() - .flat_map(|bs| bs.into_iter()); - - // If the borrowed place is a local with no projections, all other borrows of this - // local must conflict. This is purely an optimization so we don't have to call - // `places_conflict` for every borrow. - if place.projection.is_empty() { - if !self.body.local_decls[local].is_ref_to_static() { - trans.kill_all(other_borrows_of_local); - } - return; + let other_borrows_of_local = + self.borrow_set.local_map.get(&place.local).into_iter().flat_map(|bs| bs.into_iter()); + + // If the borrowed place is a local with no projections, all other borrows of this + // local must conflict. This is purely an optimization so we don't have to call + // `places_conflict` for every borrow. + if place.projection.is_empty() { + if !self.body.local_decls[place.local].is_ref_to_static() { + trans.kill_all(other_borrows_of_local); } + return; + } - // By passing `PlaceConflictBias::NoOverlap`, we conservatively assume that any given - // pair of array indices are unequal, so that when `places_conflict` returns true, we - // will be assured that two places being compared definitely denotes the same sets of - // locations. - let definitely_conflicting_borrows = other_borrows_of_local - .filter(|&&i| { - places_conflict( - self.tcx, - self.param_env, - self.body, - &self.borrow_set.borrows[i].borrowed_place, - place, - PlaceConflictBias::NoOverlap) - }); + // By passing `PlaceConflictBias::NoOverlap`, we conservatively assume that any given + // pair of array indices are unequal, so that when `places_conflict` returns true, we + // will be assured that two places being compared definitely denotes the same sets of + // locations. + let definitely_conflicting_borrows = other_borrows_of_local.filter(|&&i| { + places_conflict( + self.tcx, + self.body, + &self.borrow_set.borrows[i].borrowed_place, + place, + PlaceConflictBias::NoOverlap, + ) + }); - trans.kill_all(definitely_conflicting_borrows); - } + trans.kill_all(definitely_conflicting_borrows); } } impl<'a, 'tcx> BitDenotation<'tcx> for Borrows<'a, 'tcx> { type Idx = BorrowIndex; - fn name() -> &'static str { "borrows" } + fn name() -> &'static str { + "borrows" + } fn bits_per_block(&self) -> usize { self.borrow_set.borrows.len() * 2 } @@ -245,19 +240,13 @@ impl<'a, 'tcx> BitDenotation<'tcx> for Borrows<'a, 'tcx> { // function execution, so this method has no effect. } - fn before_statement_effect(&self, - trans: &mut GenKillSet, - location: Location) { - debug!("Borrows::before_statement_effect trans: {:?} location: {:?}", - trans, location); + fn before_statement_effect(&self, trans: &mut GenKillSet, location: Location) { + debug!("Borrows::before_statement_effect trans: {:?} location: {:?}", trans, location); self.kill_loans_out_of_scope_at_location(trans, location); } - fn statement_effect(&self, - trans: &mut GenKillSet, - location: Location) { - debug!("Borrows::statement_effect: trans={:?} location={:?}", - trans, location); + fn statement_effect(&self, trans: &mut GenKillSet, location: Location) { + debug!("Borrows::statement_effect: trans={:?} location={:?}", trans, location); let block = &self.body.basic_blocks().get(location.block).unwrap_or_else(|| { panic!("could not find block at location {:?}", location); @@ -268,7 +257,7 @@ impl<'a, 'tcx> BitDenotation<'tcx> for Borrows<'a, 'tcx> { debug!("Borrows::statement_effect: stmt={:?}", stmt); match stmt.kind { - mir::StatementKind::Assign(box(ref lhs, ref rhs)) => { + mir::StatementKind::Assign(box (ref lhs, ref rhs)) => { if let mir::Rvalue::Ref(_, _, ref place) = *rhs { if place.ignore_borrow( self.tcx, @@ -303,27 +292,21 @@ impl<'a, 'tcx> BitDenotation<'tcx> for Borrows<'a, 'tcx> { } } - mir::StatementKind::FakeRead(..) | - mir::StatementKind::SetDiscriminant { .. } | - mir::StatementKind::StorageLive(..) | - mir::StatementKind::Retag { .. } | - mir::StatementKind::AscribeUserType(..) | - mir::StatementKind::Nop => {} - + mir::StatementKind::FakeRead(..) + | mir::StatementKind::SetDiscriminant { .. } + | mir::StatementKind::StorageLive(..) + | mir::StatementKind::Retag { .. } + | mir::StatementKind::AscribeUserType(..) + | mir::StatementKind::Nop => {} } } - fn before_terminator_effect(&self, - trans: &mut GenKillSet, - location: Location) { - debug!("Borrows::before_terminator_effect: trans={:?} location={:?}", - trans, location); + fn before_terminator_effect(&self, trans: &mut GenKillSet, location: Location) { + debug!("Borrows::before_terminator_effect: trans={:?} location={:?}", trans, location); self.kill_loans_out_of_scope_at_location(trans, location); } - fn terminator_effect(&self, - _: &mut GenKillSet, - _: Location) {} + fn terminator_effect(&self, _: &mut GenKillSet, _: Location) {} fn propagate_call_return( &self, diff --git a/src/librustc_mir/dataflow/impls/indirect_mutation.rs b/src/librustc_mir/dataflow/impls/indirect_mutation.rs index bc09e32717..85bf342c8a 100644 --- a/src/librustc_mir/dataflow/impls/indirect_mutation.rs +++ b/src/librustc_mir/dataflow/impls/indirect_mutation.rs @@ -2,7 +2,7 @@ use rustc::mir::visit::Visitor; use rustc::mir::{self, Local, Location}; use rustc::ty::{self, TyCtxt}; use rustc_index::bit_set::BitSet; -use syntax_pos::DUMMY_SP; +use rustc_span::DUMMY_SP; use crate::dataflow::{self, GenKillSet}; @@ -33,19 +33,16 @@ impl<'mir, 'tcx> IndirectlyMutableLocals<'mir, 'tcx> { &self, trans: &'a mut GenKillSet, ) -> TransferFunction<'a, 'mir, 'tcx> { - TransferFunction { - body: self.body, - tcx: self.tcx, - param_env: self.param_env, - trans - } + TransferFunction { body: self.body, tcx: self.tcx, param_env: self.param_env, trans } } } impl<'mir, 'tcx> dataflow::BitDenotation<'tcx> for IndirectlyMutableLocals<'mir, 'tcx> { type Idx = Local; - fn name() -> &'static str { "mut_borrowed_locals" } + fn name() -> &'static str { + "mut_borrowed_locals" + } fn bits_per_block(&self) -> usize { self.body.local_decls.len() @@ -55,20 +52,12 @@ impl<'mir, 'tcx> dataflow::BitDenotation<'tcx> for IndirectlyMutableLocals<'mir, // Nothing is borrowed on function entry } - fn statement_effect( - &self, - trans: &mut GenKillSet, - loc: Location, - ) { + fn statement_effect(&self, trans: &mut GenKillSet, loc: Location) { let stmt = &self.body[loc.block].statements[loc.statement_index]; self.transfer_function(trans).visit_statement(stmt, loc); } - fn terminator_effect( - &self, - trans: &mut GenKillSet, - loc: Location, - ) { + fn terminator_effect(&self, trans: &mut GenKillSet, loc: Location) { let terminator = self.body[loc.block].terminator(); self.transfer_function(trans).visit_terminator(terminator, loc); } @@ -107,30 +96,23 @@ impl<'tcx> TransferFunction<'_, '_, 'tcx> { match kind { mir::BorrowKind::Mut { .. } => true, - | mir::BorrowKind::Shared - | mir::BorrowKind::Shallow - | mir::BorrowKind::Unique - => !borrowed_place - .ty(self.body, self.tcx) - .ty - .is_freeze(self.tcx, self.param_env, DUMMY_SP), + mir::BorrowKind::Shared | mir::BorrowKind::Shallow | mir::BorrowKind::Unique => { + !borrowed_place.ty(self.body, self.tcx).ty.is_freeze( + self.tcx, + self.param_env, + DUMMY_SP, + ) + } } } } impl<'tcx> Visitor<'tcx> for TransferFunction<'_, '_, 'tcx> { - fn visit_rvalue( - &mut self, - rvalue: &mir::Rvalue<'tcx>, - location: Location, - ) { + fn visit_rvalue(&mut self, rvalue: &mir::Rvalue<'tcx>, location: Location) { if let mir::Rvalue::Ref(_, kind, ref borrowed_place) = *rvalue { if self.borrow_allows_mutation(kind, borrowed_place) { - match borrowed_place.base { - mir::PlaceBase::Local(borrowed_local) if !borrowed_place.is_indirect() - => self.trans.gen(borrowed_local), - - _ => (), + if !borrowed_place.is_indirect() { + self.trans.gen(borrowed_place.local); } } } @@ -138,7 +120,6 @@ impl<'tcx> Visitor<'tcx> for TransferFunction<'_, '_, 'tcx> { self.super_rvalue(rvalue, location); } - fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: Location) { // This method purposely does nothing except call `super_terminator`. It exists solely to // document the subtleties around drop terminators. @@ -146,7 +127,7 @@ impl<'tcx> Visitor<'tcx> for TransferFunction<'_, '_, 'tcx> { self.super_terminator(terminator, location); if let mir::TerminatorKind::Drop { location: _, .. } - | mir::TerminatorKind::DropAndReplace { location: _, .. } = &terminator.kind + | mir::TerminatorKind::DropAndReplace { location: _, .. } = &terminator.kind { // Although drop terminators mutably borrow the location being dropped, that borrow // cannot live beyond the drop terminator because the dropped location is invalidated. diff --git a/src/librustc_mir/dataflow/impls/mod.rs b/src/librustc_mir/dataflow/impls/mod.rs index 0fb912b5fc..6b66406338 100644 --- a/src/librustc_mir/dataflow/impls/mod.rs +++ b/src/librustc_mir/dataflow/impls/mod.rs @@ -2,8 +2,8 @@ //! bitvectors attached to each basic block, represented via a //! zero-sized structure. -use rustc::ty::TyCtxt; use rustc::mir::{self, Body, Location}; +use rustc::ty::TyCtxt; use rustc_index::bit_set::BitSet; use rustc_index::vec::Idx; @@ -11,7 +11,7 @@ use super::MoveDataParamEnv; use crate::util::elaborate_drops::DropFlagState; -use super::move_paths::{HasMoveData, MoveData, MovePathIndex, InitIndex, InitKind}; +use super::move_paths::{HasMoveData, InitIndex, InitKind, MoveData, MovePathIndex}; use super::{BitDenotation, BottomValue, GenKillSet}; use super::drop_flag_effects_for_function_entry; @@ -76,7 +76,9 @@ impl<'a, 'tcx> MaybeInitializedPlaces<'a, 'tcx> { } impl<'a, 'tcx> HasMoveData<'tcx> for MaybeInitializedPlaces<'a, 'tcx> { - fn move_data(&self) -> &MoveData<'tcx> { &self.mdpe.move_data } + fn move_data(&self) -> &MoveData<'tcx> { + &self.mdpe.move_data + } } /// `MaybeUninitializedPlaces` tracks all places that might be @@ -127,7 +129,9 @@ impl<'a, 'tcx> MaybeUninitializedPlaces<'a, 'tcx> { } impl<'a, 'tcx> HasMoveData<'tcx> for MaybeUninitializedPlaces<'a, 'tcx> { - fn move_data(&self) -> &MoveData<'tcx> { &self.mdpe.move_data } + fn move_data(&self) -> &MoveData<'tcx> { + &self.mdpe.move_data + } } /// `DefinitelyInitializedPlaces` tracks all places that are definitely @@ -177,7 +181,9 @@ impl<'a, 'tcx> DefinitelyInitializedPlaces<'a, 'tcx> { } impl<'a, 'tcx> HasMoveData<'tcx> for DefinitelyInitializedPlaces<'a, 'tcx> { - fn move_data(&self) -> &MoveData<'tcx> { &self.mdpe.move_data } + fn move_data(&self) -> &MoveData<'tcx> { + &self.mdpe.move_data + } } /// `EverInitializedPlaces` tracks all places that might have ever been @@ -222,14 +228,17 @@ impl<'a, 'tcx> EverInitializedPlaces<'a, 'tcx> { } impl<'a, 'tcx> HasMoveData<'tcx> for EverInitializedPlaces<'a, 'tcx> { - fn move_data(&self) -> &MoveData<'tcx> { &self.mdpe.move_data } + fn move_data(&self) -> &MoveData<'tcx> { + &self.mdpe.move_data + } } impl<'a, 'tcx> MaybeInitializedPlaces<'a, 'tcx> { - fn update_bits(trans: &mut GenKillSet, - path: MovePathIndex, - state: DropFlagState) - { + fn update_bits( + trans: &mut GenKillSet, + path: MovePathIndex, + state: DropFlagState, + ) { match state { DropFlagState::Absent => trans.kill(path), DropFlagState::Present => trans.gen(path), @@ -238,10 +247,11 @@ impl<'a, 'tcx> MaybeInitializedPlaces<'a, 'tcx> { } impl<'a, 'tcx> MaybeUninitializedPlaces<'a, 'tcx> { - fn update_bits(trans: &mut GenKillSet, - path: MovePathIndex, - state: DropFlagState) - { + fn update_bits( + trans: &mut GenKillSet, + path: MovePathIndex, + state: DropFlagState, + ) { match state { DropFlagState::Absent => trans.gen(path), DropFlagState::Present => trans.kill(path), @@ -250,10 +260,11 @@ impl<'a, 'tcx> MaybeUninitializedPlaces<'a, 'tcx> { } impl<'a, 'tcx> DefinitelyInitializedPlaces<'a, 'tcx> { - fn update_bits(trans: &mut GenKillSet, - path: MovePathIndex, - state: DropFlagState) - { + fn update_bits( + trans: &mut GenKillSet, + path: MovePathIndex, + state: DropFlagState, + ) { match state { DropFlagState::Absent => trans.kill(path), DropFlagState::Present => trans.gen(path), @@ -263,40 +274,30 @@ impl<'a, 'tcx> DefinitelyInitializedPlaces<'a, 'tcx> { impl<'a, 'tcx> BitDenotation<'tcx> for MaybeInitializedPlaces<'a, 'tcx> { type Idx = MovePathIndex; - fn name() -> &'static str { "maybe_init" } + fn name() -> &'static str { + "maybe_init" + } fn bits_per_block(&self) -> usize { self.move_data().move_paths.len() } fn start_block_effect(&self, entry_set: &mut BitSet) { - drop_flag_effects_for_function_entry( - self.tcx, self.body, self.mdpe, - |path, s| { - assert!(s == DropFlagState::Present); - entry_set.insert(path); - }); - } - - fn statement_effect(&self, - trans: &mut GenKillSet, - location: Location) - { - drop_flag_effects_for_location( - self.tcx, self.body, self.mdpe, - location, - |path, s| Self::update_bits(trans, path, s) - ) - } - - fn terminator_effect(&self, - trans: &mut GenKillSet, - location: Location) - { - drop_flag_effects_for_location( - self.tcx, self.body, self.mdpe, - location, - |path, s| Self::update_bits(trans, path, s) - ) + drop_flag_effects_for_function_entry(self.tcx, self.body, self.mdpe, |path, s| { + assert!(s == DropFlagState::Present); + entry_set.insert(path); + }); + } + + fn statement_effect(&self, trans: &mut GenKillSet, location: Location) { + drop_flag_effects_for_location(self.tcx, self.body, self.mdpe, location, |path, s| { + Self::update_bits(trans, path, s) + }) + } + + fn terminator_effect(&self, trans: &mut GenKillSet, location: Location) { + drop_flag_effects_for_location(self.tcx, self.body, self.mdpe, location, |path, s| { + Self::update_bits(trans, path, s) + }) } fn propagate_call_return( @@ -308,15 +309,23 @@ impl<'a, 'tcx> BitDenotation<'tcx> for MaybeInitializedPlaces<'a, 'tcx> { ) { // when a call returns successfully, that means we need to set // the bits for that dest_place to 1 (initialized). - on_lookup_result_bits(self.tcx, self.body, self.move_data(), - self.move_data().rev_lookup.find(dest_place.as_ref()), - |mpi| { in_out.insert(mpi); }); + on_lookup_result_bits( + self.tcx, + self.body, + self.move_data(), + self.move_data().rev_lookup.find(dest_place.as_ref()), + |mpi| { + in_out.insert(mpi); + }, + ); } } impl<'a, 'tcx> BitDenotation<'tcx> for MaybeUninitializedPlaces<'a, 'tcx> { type Idx = MovePathIndex; - fn name() -> &'static str { "maybe_uninit" } + fn name() -> &'static str { + "maybe_uninit" + } fn bits_per_block(&self) -> usize { self.move_data().move_paths.len() } @@ -327,34 +336,22 @@ impl<'a, 'tcx> BitDenotation<'tcx> for MaybeUninitializedPlaces<'a, 'tcx> { assert!(self.bits_per_block() == entry_set.domain_size()); entry_set.insert_all(); - drop_flag_effects_for_function_entry( - self.tcx, self.body, self.mdpe, - |path, s| { - assert!(s == DropFlagState::Present); - entry_set.remove(path); - }); + drop_flag_effects_for_function_entry(self.tcx, self.body, self.mdpe, |path, s| { + assert!(s == DropFlagState::Present); + entry_set.remove(path); + }); } - fn statement_effect(&self, - trans: &mut GenKillSet, - location: Location) - { - drop_flag_effects_for_location( - self.tcx, self.body, self.mdpe, - location, - |path, s| Self::update_bits(trans, path, s) - ) + fn statement_effect(&self, trans: &mut GenKillSet, location: Location) { + drop_flag_effects_for_location(self.tcx, self.body, self.mdpe, location, |path, s| { + Self::update_bits(trans, path, s) + }) } - fn terminator_effect(&self, - trans: &mut GenKillSet, - location: Location) - { - drop_flag_effects_for_location( - self.tcx, self.body, self.mdpe, - location, - |path, s| Self::update_bits(trans, path, s) - ) + fn terminator_effect(&self, trans: &mut GenKillSet, location: Location) { + drop_flag_effects_for_location(self.tcx, self.body, self.mdpe, location, |path, s| { + Self::update_bits(trans, path, s) + }) } fn propagate_call_return( @@ -366,15 +363,23 @@ impl<'a, 'tcx> BitDenotation<'tcx> for MaybeUninitializedPlaces<'a, 'tcx> { ) { // when a call returns successfully, that means we need to set // the bits for that dest_place to 0 (initialized). - on_lookup_result_bits(self.tcx, self.body, self.move_data(), - self.move_data().rev_lookup.find(dest_place.as_ref()), - |mpi| { in_out.remove(mpi); }); + on_lookup_result_bits( + self.tcx, + self.body, + self.move_data(), + self.move_data().rev_lookup.find(dest_place.as_ref()), + |mpi| { + in_out.remove(mpi); + }, + ); } } impl<'a, 'tcx> BitDenotation<'tcx> for DefinitelyInitializedPlaces<'a, 'tcx> { type Idx = MovePathIndex; - fn name() -> &'static str { "definite_init" } + fn name() -> &'static str { + "definite_init" + } fn bits_per_block(&self) -> usize { self.move_data().move_paths.len() } @@ -383,34 +388,22 @@ impl<'a, 'tcx> BitDenotation<'tcx> for DefinitelyInitializedPlaces<'a, 'tcx> { fn start_block_effect(&self, entry_set: &mut BitSet) { entry_set.clear(); - drop_flag_effects_for_function_entry( - self.tcx, self.body, self.mdpe, - |path, s| { - assert!(s == DropFlagState::Present); - entry_set.insert(path); - }); + drop_flag_effects_for_function_entry(self.tcx, self.body, self.mdpe, |path, s| { + assert!(s == DropFlagState::Present); + entry_set.insert(path); + }); } - fn statement_effect(&self, - trans: &mut GenKillSet, - location: Location) - { - drop_flag_effects_for_location( - self.tcx, self.body, self.mdpe, - location, - |path, s| Self::update_bits(trans, path, s) - ) + fn statement_effect(&self, trans: &mut GenKillSet, location: Location) { + drop_flag_effects_for_location(self.tcx, self.body, self.mdpe, location, |path, s| { + Self::update_bits(trans, path, s) + }) } - fn terminator_effect(&self, - trans: &mut GenKillSet, - location: Location) - { - drop_flag_effects_for_location( - self.tcx, self.body, self.mdpe, - location, - |path, s| Self::update_bits(trans, path, s) - ) + fn terminator_effect(&self, trans: &mut GenKillSet, location: Location) { + drop_flag_effects_for_location(self.tcx, self.body, self.mdpe, location, |path, s| { + Self::update_bits(trans, path, s) + }) } fn propagate_call_return( @@ -422,15 +415,23 @@ impl<'a, 'tcx> BitDenotation<'tcx> for DefinitelyInitializedPlaces<'a, 'tcx> { ) { // when a call returns successfully, that means we need to set // the bits for that dest_place to 1 (initialized). - on_lookup_result_bits(self.tcx, self.body, self.move_data(), - self.move_data().rev_lookup.find(dest_place.as_ref()), - |mpi| { in_out.insert(mpi); }); + on_lookup_result_bits( + self.tcx, + self.body, + self.move_data(), + self.move_data().rev_lookup.find(dest_place.as_ref()), + |mpi| { + in_out.insert(mpi); + }, + ); } } impl<'a, 'tcx> BitDenotation<'tcx> for EverInitializedPlaces<'a, 'tcx> { type Idx = InitIndex; - fn name() -> &'static str { "ever_init" } + fn name() -> &'static str { + "ever_init" + } fn bits_per_block(&self) -> usize { self.move_data().inits.len() } @@ -441,17 +442,17 @@ impl<'a, 'tcx> BitDenotation<'tcx> for EverInitializedPlaces<'a, 'tcx> { } } - fn statement_effect(&self, - trans: &mut GenKillSet, - location: Location) { + fn statement_effect(&self, trans: &mut GenKillSet, location: Location) { let (_, body, move_data) = (self.tcx, self.body, self.move_data()); let stmt = &body[location.block].statements[location.statement_index]; let init_path_map = &move_data.init_path_map; let init_loc_map = &move_data.init_loc_map; let rev_lookup = &move_data.rev_lookup; - debug!("statement {:?} at loc {:?} initializes move_indexes {:?}", - stmt, location, &init_loc_map[location]); + debug!( + "statement {:?} at loc {:?} initializes move_indexes {:?}", + stmt, location, &init_loc_map[location] + ); trans.gen_all(&init_loc_map[location]); match stmt.kind { @@ -459,27 +460,28 @@ impl<'a, 'tcx> BitDenotation<'tcx> for EverInitializedPlaces<'a, 'tcx> { // End inits for StorageDead, so that an immutable variable can // be reinitialized on the next iteration of the loop. let move_path_index = rev_lookup.find_local(local); - debug!("stmt {:?} at loc {:?} clears the ever initialized status of {:?}", - stmt, location, &init_path_map[move_path_index]); + debug!( + "stmt {:?} at loc {:?} clears the ever initialized status of {:?}", + stmt, location, &init_path_map[move_path_index] + ); trans.kill_all(&init_path_map[move_path_index]); } _ => {} } } - fn terminator_effect(&self, - trans: &mut GenKillSet, - location: Location) - { + fn terminator_effect(&self, trans: &mut GenKillSet, location: Location) { let (body, move_data) = (self.body, self.move_data()); let term = body[location.block].terminator(); let init_loc_map = &move_data.init_loc_map; - debug!("terminator {:?} at loc {:?} initializes move_indexes {:?}", - term, location, &init_loc_map[location]); + debug!( + "terminator {:?} at loc {:?} initializes move_indexes {:?}", + term, location, &init_loc_map[location] + ); trans.gen_all( init_loc_map[location].iter().filter(|init_index| { move_data.inits[**init_index].kind != InitKind::NonPanicPathOnly - }) + }), ); } @@ -494,10 +496,8 @@ impl<'a, 'tcx> BitDenotation<'tcx> for EverInitializedPlaces<'a, 'tcx> { let bits_per_block = self.bits_per_block(); let init_loc_map = &move_data.init_loc_map; - let call_loc = Location { - block: call_bb, - statement_index: self.body[call_bb].statements.len(), - }; + let call_loc = + Location { block: call_bb, statement_index: self.body[call_bb].statements.len() }; for init_index in &init_loc_map[call_loc] { assert!(init_index.index() < bits_per_block); in_out.insert(*init_index); diff --git a/src/librustc_mir/dataflow/impls/storage_liveness.rs b/src/librustc_mir/dataflow/impls/storage_liveness.rs index b8abe6d70e..6a48d1e980 100644 --- a/src/librustc_mir/dataflow/impls/storage_liveness.rs +++ b/src/librustc_mir/dataflow/impls/storage_liveness.rs @@ -1,13 +1,11 @@ pub use super::*; -use rustc::mir::*; -use rustc::mir::visit::{ - PlaceContext, Visitor, NonMutatingUseContext, -}; -use std::cell::RefCell; use crate::dataflow::BitDenotation; use crate::dataflow::HaveBeenBorrowedLocals; use crate::dataflow::{DataflowResults, DataflowResultsCursor, DataflowResultsRefCursor}; +use rustc::mir::visit::{NonMutatingUseContext, PlaceContext, Visitor}; +use rustc::mir::*; +use std::cell::RefCell; #[derive(Copy, Clone)] pub struct MaybeStorageLive<'a, 'tcx> { @@ -15,8 +13,7 @@ pub struct MaybeStorageLive<'a, 'tcx> { } impl<'a, 'tcx> MaybeStorageLive<'a, 'tcx> { - pub fn new(body: &'a Body<'tcx>) - -> Self { + pub fn new(body: &'a Body<'tcx>) -> Self { MaybeStorageLive { body } } @@ -27,7 +24,9 @@ impl<'a, 'tcx> MaybeStorageLive<'a, 'tcx> { impl<'a, 'tcx> BitDenotation<'tcx> for MaybeStorageLive<'a, 'tcx> { type Idx = Local; - fn name() -> &'static str { "maybe_storage_live" } + fn name() -> &'static str { + "maybe_storage_live" + } fn bits_per_block(&self) -> usize { self.body.local_decls.len() } @@ -38,9 +37,7 @@ impl<'a, 'tcx> BitDenotation<'tcx> for MaybeStorageLive<'a, 'tcx> { assert_eq!(1, self.body.arg_count); } - fn statement_effect(&self, - trans: &mut GenKillSet, - loc: Location) { + fn statement_effect(&self, trans: &mut GenKillSet, loc: Location) { let stmt = &self.body[loc.block].statements[loc.statement_index]; match stmt.kind { @@ -50,9 +47,7 @@ impl<'a, 'tcx> BitDenotation<'tcx> for MaybeStorageLive<'a, 'tcx> { } } - fn terminator_effect(&self, - _trans: &mut GenKillSet, - _loc: Location) { + fn terminator_effect(&self, _trans: &mut GenKillSet, _loc: Location) { // Terminators have no effect } @@ -87,9 +82,7 @@ impl<'mir, 'tcx: 'mir> RequiresStorage<'mir, 'tcx> { ) -> Self { RequiresStorage { body, - borrowed_locals: RefCell::new( - DataflowResultsCursor::new(borrowed_locals, *body) - ), + borrowed_locals: RefCell::new(DataflowResultsCursor::new(borrowed_locals, *body)), } } @@ -100,7 +93,9 @@ impl<'mir, 'tcx: 'mir> RequiresStorage<'mir, 'tcx> { impl<'mir, 'tcx> BitDenotation<'tcx> for RequiresStorage<'mir, 'tcx> { type Idx = Local; - fn name() -> &'static str { "requires_storage" } + fn name() -> &'static str { + "requires_storage" + } fn bits_per_block(&self) -> usize { self.body.local_decls.len() } @@ -119,17 +114,13 @@ impl<'mir, 'tcx> BitDenotation<'tcx> for RequiresStorage<'mir, 'tcx> { let stmt = &self.body[loc.block].statements[loc.statement_index]; match stmt.kind { StatementKind::StorageDead(l) => sets.kill(l), - StatementKind::Assign(box(ref place, _)) + StatementKind::Assign(box (ref place, _)) | StatementKind::SetDiscriminant { box ref place, .. } => { - if let PlaceBase::Local(local) = place.base { - sets.gen(local); - } + sets.gen(place.local); } StatementKind::InlineAsm(box InlineAsm { ref outputs, .. }) => { - for p in &**outputs { - if let PlaceBase::Local(local) = p.base { - sets.gen(local); - } + for place in &**outputs { + sets.gen(place.local); } } _ => (), @@ -145,10 +136,9 @@ impl<'mir, 'tcx> BitDenotation<'tcx> for RequiresStorage<'mir, 'tcx> { fn before_terminator_effect(&self, sets: &mut GenKillSet, loc: Location) { self.check_for_borrow(sets, loc); - if let TerminatorKind::Call { - destination: Some((Place { base: PlaceBase::Local(local), .. }, _)), - .. - } = self.body[loc.block].terminator().kind { + if let TerminatorKind::Call { destination: Some((Place { local, .. }, _)), .. } = + self.body[loc.block].terminator().kind + { sets.gen(local); } } @@ -158,10 +148,9 @@ impl<'mir, 'tcx> BitDenotation<'tcx> for RequiresStorage<'mir, 'tcx> { // and after the call returns successfully, but not after a panic. // Since `propagate_call_unwind` doesn't exist, we have to kill the // destination here, and then gen it again in `propagate_call_return`. - if let TerminatorKind::Call { - destination: Some((ref place, _)), - .. - } = self.body[loc.block].terminator().kind { + if let TerminatorKind::Call { destination: Some((ref place, _)), .. } = + self.body[loc.block].terminator().kind + { if let Some(local) = place.as_local() { sets.kill(local); } @@ -176,19 +165,14 @@ impl<'mir, 'tcx> BitDenotation<'tcx> for RequiresStorage<'mir, 'tcx> { _dest_bb: mir::BasicBlock, dest_place: &mir::Place<'tcx>, ) { - if let PlaceBase::Local(local) = dest_place.base { - in_out.insert(local); - } + in_out.insert(dest_place.local); } } impl<'mir, 'tcx> RequiresStorage<'mir, 'tcx> { /// Kill locals that are fully moved and have not been borrowed. fn check_for_move(&self, sets: &mut GenKillSet, loc: Location) { - let mut visitor = MoveVisitor { - sets, - borrowed_locals: &self.borrowed_locals, - }; + let mut visitor = MoveVisitor { sets, borrowed_locals: &self.borrowed_locals }; visitor.visit_location(self.body, loc); } diff --git a/src/librustc_mir/dataflow/mod.rs b/src/librustc_mir/dataflow/mod.rs index ad0f75d772..e29730f267 100644 --- a/src/librustc_mir/dataflow/mod.rs +++ b/src/librustc_mir/dataflow/mod.rs @@ -1,16 +1,16 @@ +use rustc_span::symbol::{sym, Symbol}; use syntax::ast::{self, MetaItem}; use syntax::print::pprust; -use syntax::symbol::{Symbol, sym}; +use rustc_data_structures::work_queue::WorkQueue; use rustc_index::bit_set::{BitSet, HybridBitSet}; use rustc_index::vec::Idx; -use rustc_data_structures::work_queue::WorkQueue; -use rustc::hir::def_id::DefId; -use rustc::ty::{self, TyCtxt}; -use rustc::mir::{self, Body, BasicBlock, BasicBlockData, Location, Statement, Terminator}; use rustc::mir::traversal; +use rustc::mir::{self, BasicBlock, BasicBlockData, Body, Location, Statement, Terminator}; use rustc::session::Session; +use rustc::ty::{self, TyCtxt}; +use rustc_hir::def_id::DefId; use std::borrow::Borrow; use std::fmt; @@ -18,15 +18,15 @@ use std::io; use std::path::PathBuf; use std::usize; -pub use self::impls::{MaybeStorageLive, RequiresStorage}; -pub use self::impls::{MaybeInitializedPlaces, MaybeUninitializedPlaces}; +pub use self::at_location::{FlowAtLocation, FlowsAtLocation}; +pub(crate) use self::drop_flag_effects::*; +pub use self::impls::borrows::Borrows; pub use self::impls::DefinitelyInitializedPlaces; pub use self::impls::EverInitializedPlaces; -pub use self::impls::borrows::Borrows; pub use self::impls::HaveBeenBorrowedLocals; pub use self::impls::IndirectlyMutableLocals; -pub use self::at_location::{FlowAtLocation, FlowsAtLocation}; -pub(crate) use self::drop_flag_effects::*; +pub use self::impls::{MaybeInitializedPlaces, MaybeUninitializedPlaces}; +pub use self::impls::{MaybeStorageLive, RequiresStorage}; use self::move_paths::MoveData; @@ -39,8 +39,8 @@ pub mod move_paths; pub(crate) mod indexes { pub(crate) use super::{ - move_paths::{MovePathIndex, MoveOutIndex, InitIndex}, impls::borrows::BorrowIndex, + move_paths::{InitIndex, MoveOutIndex, MovePathIndex}, }; } @@ -76,7 +76,10 @@ impl fmt::Debug for DebugFormatted { pub trait Dataflow<'tcx, BD: BitDenotation<'tcx>> { /// Sets up and runs the dataflow problem, using `p` to render results if /// implementation so chooses. - fn dataflow

    (&mut self, p: P) where P: Fn(&BD, BD::Idx) -> DebugFormatted { + fn dataflow

    (&mut self, p: P) + where + P: Fn(&BD, BD::Idx) -> DebugFormatted, + { let _ = p; // default implementation does not instrument process. self.build_sets(); self.propagate(); @@ -93,15 +96,22 @@ impl<'a, 'tcx, BD> Dataflow<'tcx, BD> for DataflowBuilder<'a, 'tcx, BD> where BD: BitDenotation<'tcx>, { - fn dataflow

    (&mut self, p: P) where P: Fn(&BD, BD::Idx) -> DebugFormatted { + fn dataflow

    (&mut self, p: P) + where + P: Fn(&BD, BD::Idx) -> DebugFormatted, + { self.flow_state.build_sets(); - self.pre_dataflow_instrumentation(|c,i| p(c,i)).unwrap(); + self.pre_dataflow_instrumentation(|c, i| p(c, i)).unwrap(); self.flow_state.propagate(); - self.post_dataflow_instrumentation(|c,i| p(c,i)).unwrap(); + self.post_dataflow_instrumentation(|c, i| p(c, i)).unwrap(); } - fn build_sets(&mut self) { self.flow_state.build_sets(); } - fn propagate(&mut self) { self.flow_state.propagate(); } + fn build_sets(&mut self) { + self.flow_state.build_sets(); + } + fn propagate(&mut self) { + self.flow_state.propagate(); + } } pub(crate) fn has_rustc_mir_with(attrs: &[ast::Attribute], name: Symbol) -> Option { @@ -111,7 +121,7 @@ pub(crate) fn has_rustc_mir_with(attrs: &[ast::Attribute], name: Symbol) -> Opti for item in items.iter().flat_map(|l| l.iter()) { match item.meta_item() { Some(mi) if mi.check_name(name) => return Some(mi.clone()), - _ => continue + _ => continue, } } } @@ -158,7 +168,7 @@ where let name_found = |sess: &Session, attrs: &[ast::Attribute], name| -> Option { if let Some(item) = has_rustc_mir_with(attrs, name) { if let Some(s) = item.value_str() { - return Some(s.to_string()) + return Some(s.to_string()); } else { let path = pprust::path_to_string(&item.path); sess.span_err(item.span, &format!("{} attribute requires a path", path)); @@ -171,10 +181,8 @@ where let print_preflow_to = name_found(tcx.sess, attributes, sym::borrowck_graphviz_preflow); let print_postflow_to = name_found(tcx.sess, attributes, sym::borrowck_graphviz_postflow); - let mut mbcx = DataflowBuilder { - def_id, - print_preflow_to, print_postflow_to, flow_state: self, - }; + let mut mbcx = + DataflowBuilder { def_id, print_preflow_to, print_postflow_to, flow_state: self }; mbcx.dataflow(p); mbcx.flow_state.results() @@ -194,9 +202,7 @@ where { fn propagate(&mut self) { let mut temp = BitSet::new_empty(self.flow_state.sets.bits_per_block); - let mut propcx = PropagationContext { - builder: self, - }; + let mut propcx = PropagationContext { builder: self }; propcx.walk_cfg(&mut temp); } @@ -257,7 +263,10 @@ where let bb_data = &body[bb]; self.builder.propagate_bits_into_graph_successors_of( - in_out, (bb, bb_data), &mut dirty_queue); + in_out, + (bb, bb_data), + &mut dirty_queue, + ); } } } @@ -277,7 +286,8 @@ where BD: BitDenotation<'tcx>, { fn pre_dataflow_instrumentation

    (&self, p: P) -> io::Result<()> - where P: Fn(&BD, BD::Idx) -> DebugFormatted + where + P: Fn(&BD, BD::Idx) -> DebugFormatted, { if let Some(ref path_str) = self.print_preflow_to { let path = dataflow_path(BD::name(), path_str); @@ -288,7 +298,8 @@ where } fn post_dataflow_instrumentation

    (&self, p: P) -> io::Result<()> - where P: Fn(&BD, BD::Idx) -> DebugFormatted + where + P: Fn(&BD, BD::Idx) -> DebugFormatted, { if let Some(ref path_str) = self.print_postflow_to { let path = dataflow_path(BD::name(), path_str); @@ -310,19 +321,23 @@ pub(crate) trait DataflowResultsConsumer<'a, 'tcx: 'a> { type FlowState: FlowsAtLocation; // Observation Hooks: override (at least one of) these to get analysis feedback. - fn visit_block_entry(&mut self, - _bb: BasicBlock, - _flow_state: &Self::FlowState) {} + fn visit_block_entry(&mut self, _bb: BasicBlock, _flow_state: &Self::FlowState) {} - fn visit_statement_entry(&mut self, - _loc: Location, - _stmt: &'a Statement<'tcx>, - _flow_state: &Self::FlowState) {} + fn visit_statement_entry( + &mut self, + _loc: Location, + _stmt: &'a Statement<'tcx>, + _flow_state: &Self::FlowState, + ) { + } - fn visit_terminator_entry(&mut self, - _loc: Location, - _term: &'a Terminator<'tcx>, - _flow_state: &Self::FlowState) {} + fn visit_terminator_entry( + &mut self, + _loc: Location, + _term: &'a Terminator<'tcx>, + _flow_state: &Self::FlowState, + ) { + } // Main entry point: this drives the processing of results. @@ -337,8 +352,7 @@ pub(crate) trait DataflowResultsConsumer<'a, 'tcx: 'a> { fn process_basic_block(&mut self, bb: BasicBlock, flow_state: &mut Self::FlowState) { self.visit_block_entry(bb, flow_state); - let BasicBlockData { ref statements, ref terminator, is_cleanup: _ } = - self.body()[bb]; + let BasicBlockData { ref statements, ref terminator, is_cleanup: _ } = self.body()[bb]; let mut location = Location { block: bb, statement_index: 0 }; for stmt in statements.iter() { flow_state.reconstruct_statement_effect(location); @@ -388,11 +402,7 @@ where DR: Borrow>, { pub fn new(result: DR, body: &'mir Body<'tcx>) -> Self { - DataflowResultsCursor { - flow_state: FlowAtLocation::new(result), - curr_loc: None, - body, - } + DataflowResultsCursor { flow_state: FlowAtLocation::new(result), curr_loc: None, body } } /// Seek to the given location in MIR. This method is fast if you are @@ -414,8 +424,9 @@ where let start_index; let should_reset = match self.curr_loc { None => true, - Some(cur) - if loc.block != cur.block || loc.statement_index < cur.statement_index => true, + Some(cur) if loc.block != cur.block || loc.statement_index < cur.statement_index => { + true + } _ => false, }; if should_reset { @@ -478,10 +489,14 @@ where DataflowResults(self.flow_state) } - pub fn body(&self) -> &'a Body<'tcx> { self.body } + pub fn body(&self) -> &'a Body<'tcx> { + self.body + } } -pub struct DataflowResults<'tcx, O>(pub(crate) DataflowState<'tcx, O>) where O: BitDenotation<'tcx>; +pub struct DataflowResults<'tcx, O>(pub(crate) DataflowState<'tcx, O>) +where + O: BitDenotation<'tcx>; impl<'tcx, O: BitDenotation<'tcx>> DataflowResults<'tcx, O> { pub fn sets(&self) -> &AllSets { @@ -495,8 +510,7 @@ impl<'tcx, O: BitDenotation<'tcx>> DataflowResults<'tcx, O> { /// State of a dataflow analysis; couples a collection of bit sets /// with operator used to initialize and merge bits during analysis. -pub struct DataflowState<'tcx, O: BitDenotation<'tcx>> -{ +pub struct DataflowState<'tcx, O: BitDenotation<'tcx>> { /// All the sets for the analysis. (Factored into its /// own structure so that we can borrow it mutably /// on its own separate from other fields.) @@ -507,22 +521,26 @@ pub struct DataflowState<'tcx, O: BitDenotation<'tcx>> } impl<'tcx, O: BitDenotation<'tcx>> DataflowState<'tcx, O> { - pub(crate) fn interpret_set<'c, P>(&self, - o: &'c O, - set: &BitSet, - render_idx: &P) - -> Vec - where P: Fn(&O, O::Idx) -> DebugFormatted + pub(crate) fn interpret_set<'c, P>( + &self, + o: &'c O, + set: &BitSet, + render_idx: &P, + ) -> Vec + where + P: Fn(&O, O::Idx) -> DebugFormatted, { set.iter().map(|i| render_idx(o, i)).collect() } - pub(crate) fn interpret_hybrid_set<'c, P>(&self, - o: &'c O, - set: &HybridBitSet, - render_idx: &P) - -> Vec - where P: Fn(&O, O::Idx) -> DebugFormatted + pub(crate) fn interpret_hybrid_set<'c, P>( + &self, + o: &'c O, + set: &HybridBitSet, + render_idx: &P, + ) -> Vec + where + P: Fn(&O, O::Idx) -> DebugFormatted, { set.iter().map(|i| render_idx(o, i)).collect() } @@ -548,16 +566,14 @@ pub type GenKillSet = GenKill>; impl GenKill { /// Creates a new tuple where `gen_set == kill_set == elem`. pub(crate) fn from_elem(elem: T) -> Self - where T: Clone + where + T: Clone, { - GenKill { - gen_set: elem.clone(), - kill_set: elem, - } + GenKill { gen_set: elem.clone(), kill_set: elem } } } -impl GenKillSet { +impl GenKillSet { pub fn clear(&mut self) { self.gen_set.clear(); self.kill_set.clear(); @@ -608,8 +624,10 @@ pub struct AllSets { trans: Vec>, } -impl AllSets { - pub fn bits_per_block(&self) -> usize { self.bits_per_block } +impl AllSets { + pub fn bits_per_block(&self) -> usize { + self.bits_per_block + } pub fn get_mut(&mut self, block_idx: usize) -> (&mut BitSet, &mut GenKillSet) { (&mut self.on_entry[block_idx], &mut self.trans[block_idx]) @@ -650,6 +668,26 @@ pub trait BottomValue { const BOTTOM_VALUE: bool; /// Merges `in_set` into `inout_set`, returning `true` if `inout_set` changed. + /// + /// It is almost certainly wrong to override this, since it automatically applies + /// * `inout_set & in_set` if `BOTTOM_VALUE == true` + /// * `inout_set | in_set` if `BOTTOM_VALUE == false` + /// + /// This means that if a bit is not `BOTTOM_VALUE`, it is propagated into all target blocks. + /// For clarity, the above statement again from a different perspective: + /// A bit in the block's entry set is `!BOTTOM_VALUE` if *any* predecessor block's bit value is + /// `!BOTTOM_VALUE`. + /// + /// There are situations where you want the opposite behaviour: propagate only if *all* + /// predecessor blocks's value is `!BOTTOM_VALUE`. + /// E.g. if you want to know whether a bit is *definitely* set at a specific location. This + /// means that all code paths leading to the location must have set the bit, instead of any + /// code path leading there. + /// + /// If you want this kind of "definitely set" analysis, you need to + /// 1. Invert `BOTTOM_VALUE` + /// 2. Reset the `entry_set` in `start_block_effect` to `!BOTTOM_VALUE` + /// 3. Override `join` to do the opposite from what it's doing now. #[inline] fn join(&self, inout_set: &mut BitSet, in_set: &BitSet) -> bool { if Self::BOTTOM_VALUE == false { @@ -667,7 +705,9 @@ pub trait BottomValue { /// for each block individually. The entry set for all other basic blocks is /// initialized to `Self::BOTTOM_VALUE`. The dataflow analysis then /// iteratively modifies the various entry sets (but leaves the the transfer -/// function unchanged). +/// function unchanged). `BottomValue::join` is used to merge the bitsets from +/// two blocks (e.g. when two blocks' terminator jumps to a single block, that +/// target block's state is the merged state of both incoming blocks). pub trait BitDenotation<'tcx>: BottomValue { /// Specifies what index type is used to access the bitvector. type Idx: Idx; @@ -703,9 +743,7 @@ pub trait BitDenotation<'tcx>: BottomValue { /// Both the before-statement and after-statement effects are /// applied, in that order, before moving for the next /// statement. - fn before_statement_effect(&self, - _trans: &mut GenKillSet, - _location: Location) {} + fn before_statement_effect(&self, _trans: &mut GenKillSet, _location: Location) {} /// Mutates the block-sets (the flow sets for the given /// basic block) according to the effects of evaluating statement. @@ -717,9 +755,7 @@ pub trait BitDenotation<'tcx>: BottomValue { /// The statement is identified as `bb_data[idx_stmt]`, where /// `bb_data` is the sequence of statements identified by `bb` in /// the MIR. - fn statement_effect(&self, - trans: &mut GenKillSet, - location: Location); + fn statement_effect(&self, trans: &mut GenKillSet, location: Location); /// Similar to `terminator_effect`, except it applies /// *just before* the terminator rather than *just after* it. @@ -732,9 +768,7 @@ pub trait BitDenotation<'tcx>: BottomValue { /// Both the before-terminator and after-terminator effects are /// applied, in that order, before moving for the next /// terminator. - fn before_terminator_effect(&self, - _trans: &mut GenKillSet, - _location: Location) {} + fn before_terminator_effect(&self, _trans: &mut GenKillSet, _location: Location) {} /// Mutates the block-sets (the flow sets for the given /// basic block) according to the effects of evaluating @@ -746,9 +780,7 @@ pub trait BitDenotation<'tcx>: BottomValue { /// /// The effects applied here cannot depend on which branch the /// terminator took. - fn terminator_effect(&self, - trans: &mut GenKillSet, - location: Location); + fn terminator_effect(&self, trans: &mut GenKillSet, location: Location); /// Mutates the block-sets according to the (flow-dependent) /// effect of a successful return from a Call terminator. @@ -778,11 +810,15 @@ pub trait BitDenotation<'tcx>: BottomValue { ); } -impl<'a, 'tcx, D> DataflowAnalysis<'a, 'tcx, D> where D: BitDenotation<'tcx> +impl<'a, 'tcx, D> DataflowAnalysis<'a, 'tcx, D> +where + D: BitDenotation<'tcx>, { - pub fn new(body: &'a Body<'tcx>, - dead_unwinds: &'a BitSet, - denotation: D) -> Self { + pub fn new( + body: &'a Body<'tcx>, + dead_unwinds: &'a BitSet, + denotation: D, + ) -> Self { let bits_per_block = denotation.bits_per_block(); let num_blocks = body.basic_blocks().len(); @@ -797,13 +833,9 @@ impl<'a, 'tcx, D> DataflowAnalysis<'a, 'tcx, D> where D: BitDenotation<'tcx> body, dead_unwinds, flow_state: DataflowState { - sets: AllSets { - bits_per_block, - on_entry, - trans: vec![nop; num_blocks], - }, + sets: AllSets { bits_per_block, on_entry, trans: vec![nop; num_blocks] }, operator: denotation, - } + }, } } } @@ -829,31 +861,33 @@ where &mut self, in_out: &mut BitSet, (bb, bb_data): (mir::BasicBlock, &mir::BasicBlockData<'tcx>), - dirty_list: &mut WorkQueue) - { + dirty_list: &mut WorkQueue, + ) { match bb_data.terminator().kind { - mir::TerminatorKind::Return | - mir::TerminatorKind::Resume | - mir::TerminatorKind::Abort | - mir::TerminatorKind::GeneratorDrop | - mir::TerminatorKind::Unreachable => {} - mir::TerminatorKind::Goto { target } | - mir::TerminatorKind::Assert { target, cleanup: None, .. } | - mir::TerminatorKind::Yield { resume: target, drop: None, .. } | - mir::TerminatorKind::Drop { target, location: _, unwind: None } | - mir::TerminatorKind::DropAndReplace { - target, value: _, location: _, unwind: None - } => { + mir::TerminatorKind::Return + | mir::TerminatorKind::Resume + | mir::TerminatorKind::Abort + | mir::TerminatorKind::GeneratorDrop + | mir::TerminatorKind::Unreachable => {} + mir::TerminatorKind::Goto { target } + | mir::TerminatorKind::Assert { target, cleanup: None, .. } + | mir::TerminatorKind::Yield { resume: target, drop: None, .. } + | mir::TerminatorKind::Drop { target, location: _, unwind: None } + | mir::TerminatorKind::DropAndReplace { target, value: _, location: _, unwind: None } => + { self.propagate_bits_into_entry_set_for(in_out, target, dirty_list); } mir::TerminatorKind::Yield { resume: target, drop: Some(drop), .. } => { self.propagate_bits_into_entry_set_for(in_out, target, dirty_list); self.propagate_bits_into_entry_set_for(in_out, drop, dirty_list); } - mir::TerminatorKind::Assert { target, cleanup: Some(unwind), .. } | - mir::TerminatorKind::Drop { target, location: _, unwind: Some(unwind) } | - mir::TerminatorKind::DropAndReplace { - target, value: _, location: _, unwind: Some(unwind) + mir::TerminatorKind::Assert { target, cleanup: Some(unwind), .. } + | mir::TerminatorKind::Drop { target, location: _, unwind: Some(unwind) } + | mir::TerminatorKind::DropAndReplace { + target, + value: _, + location: _, + unwind: Some(unwind), } => { self.propagate_bits_into_entry_set_for(in_out, target, dirty_list); if !self.dead_unwinds.contains(bb) { @@ -874,8 +908,7 @@ where if let Some((ref dest_place, dest_bb)) = *destination { // N.B.: This must be done *last*, after all other // propagation, as documented in comment above. - self.flow_state.operator.propagate_call_return( - in_out, bb, dest_bb, dest_place); + self.flow_state.operator.propagate_call_return(in_out, bb, dest_bb, dest_place); self.propagate_bits_into_entry_set_for(in_out, dest_bb, dirty_list); } } @@ -894,10 +927,12 @@ where } } - fn propagate_bits_into_entry_set_for(&mut self, - in_out: &BitSet, - bb: mir::BasicBlock, - dirty_queue: &mut WorkQueue) { + fn propagate_bits_into_entry_set_for( + &mut self, + in_out: &BitSet, + bb: mir::BasicBlock, + dirty_queue: &mut WorkQueue, + ) { let entry_set = self.flow_state.sets.entry_set_mut_for(bb.index()); let set_changed = self.flow_state.operator.join(entry_set, &in_out); if set_changed { diff --git a/src/librustc_mir/dataflow/move_paths/abs_domain.rs b/src/librustc_mir/dataflow/move_paths/abs_domain.rs index 0665c0fb72..0ecf22ae23 100644 --- a/src/librustc_mir/dataflow/move_paths/abs_domain.rs +++ b/src/librustc_mir/dataflow/move_paths/abs_domain.rs @@ -47,7 +47,7 @@ impl<'tcx> Lift for PlaceElem<'tcx> { fn lift(&self) -> Self::Abstract { match *self { ProjectionElem::Deref => ProjectionElem::Deref, - ProjectionElem::Field(ref f, ty) => ProjectionElem::Field(f.clone(), ty.lift()), + ProjectionElem::Field(f, ty) => ProjectionElem::Field(f, ty.lift()), ProjectionElem::Index(ref i) => ProjectionElem::Index(i.lift()), ProjectionElem::Subslice { from, to, from_end } => { ProjectionElem::Subslice { from, to, from_end } @@ -55,7 +55,7 @@ impl<'tcx> Lift for PlaceElem<'tcx> { ProjectionElem::ConstantIndex { offset, min_length, from_end } => { ProjectionElem::ConstantIndex { offset, min_length, from_end } } - ProjectionElem::Downcast(a, u) => ProjectionElem::Downcast(a, u.clone()), + ProjectionElem::Downcast(a, u) => ProjectionElem::Downcast(a, u), } } } diff --git a/src/librustc_mir/dataflow/move_paths/builder.rs b/src/librustc_mir/dataflow/move_paths/builder.rs index 971e9a1b3b..adba38d2a8 100644 --- a/src/librustc_mir/dataflow/move_paths/builder.rs +++ b/src/librustc_mir/dataflow/move_paths/builder.rs @@ -96,12 +96,7 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { /// Maybe we should have separate "borrowck" and "moveck" modes. fn move_path_for(&mut self, place: &Place<'tcx>) -> Result> { debug!("lookup({:?})", place); - let mut base = match place.base { - PlaceBase::Local(local) => self.builder.data.rev_lookup.locals[local], - PlaceBase::Static(..) => { - return Err(MoveError::cannot_move_out_of(self.loc, Static)); - } - }; + let mut base = self.builder.data.rev_lookup.locals[place.local]; // The move path index of the first union that we find. Once this is // some we stop creating child move paths, since moves from unions @@ -114,15 +109,15 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { let proj_base = &place.projection[..i]; let body = self.builder.body; let tcx = self.builder.tcx; - let place_ty = Place::ty_from(&place.base, proj_base, body, tcx).ty; + let place_ty = Place::ty_from(&place.local, proj_base, body, tcx).ty; match place_ty.kind { ty::Ref(..) | ty::RawPtr(..) => { - let proj = &place.projection[..i+1]; + let proj = &place.projection[..i + 1]; return Err(MoveError::cannot_move_out_of( self.loc, BorrowedContent { target_place: Place { - base: place.base.clone(), + local: place.local, projection: tcx.intern_place_elems(proj), }, }, @@ -162,11 +157,9 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { }; if union_path.is_none() { - base = self.add_move_path(base, elem, |tcx| { - Place { - base: place.base.clone(), - projection: tcx.intern_place_elems(&place.projection[..i+1]), - } + base = self.add_move_path(base, elem, |tcx| Place { + local: place.local, + projection: tcx.intern_place_elems(&place.projection[..i + 1]), }); } } @@ -190,18 +183,16 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { tcx, .. } = self.builder; - *rev_lookup.projections - .entry((base, elem.lift())) - .or_insert_with(move || { - let path = MoveDataBuilder::new_move_path( - move_paths, - path_map, - init_path_map, - Some(base), - mk_place(*tcx), - ); - path - }) + *rev_lookup.projections.entry((base, elem.lift())).or_insert_with(move || { + let path = MoveDataBuilder::new_move_path( + move_paths, + path_map, + init_path_map, + Some(base), + mk_place(*tcx), + ); + path + }) } fn create_move_path(&mut self, place: &Place<'tcx>) { @@ -289,7 +280,7 @@ struct Gatherer<'b, 'a, 'tcx> { impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { fn gather_statement(&mut self, stmt: &Statement<'tcx>) { match stmt.kind { - StatementKind::Assign(box(ref place, ref rval)) => { + StatementKind::Assign(box (ref place, ref rval)) => { self.create_move_path(place); if let RvalueInitializationState::Shallow = rval.initialization_state() { // Box starts out uninitialized - need to create a separate @@ -348,6 +339,7 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { } } Rvalue::Ref(..) + | Rvalue::AddressOf(..) | Rvalue::Discriminant(..) | Rvalue::Len(..) | Rvalue::NullaryOp(NullOp::SizeOf, _) @@ -432,17 +424,14 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { fn gather_move(&mut self, place: &Place<'tcx>) { debug!("gather_move({:?}, {:?})", self.loc, place); - if let [ - ref base @ .., - ProjectionElem::Subslice { from, to, from_end: false }, - ] = **place.projection { + if let [ref base @ .., ProjectionElem::Subslice { from, to, from_end: false }] = + **place.projection + { // Split `Subslice` patterns into the corresponding list of // `ConstIndex` patterns. This is done to ensure that all move paths // are disjoint, which is expected by drop elaboration. - let base_place = Place { - base: place.base.clone(), - projection: self.builder.tcx.intern_place_elems(base), - }; + let base_place = + Place { local: place.local, projection: self.builder.tcx.intern_place_elems(base) }; let base_path = match self.move_path_for(&base_place) { Ok(path) => path, Err(MoveError::UnionMove { path }) => { @@ -458,30 +447,25 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { let len: u32 = match base_ty.kind { ty::Array(_, size) => { let length = size.eval_usize(self.builder.tcx, self.builder.param_env); - length.try_into().expect( - "slice pattern of array with more than u32::MAX elements" - ) + length + .try_into() + .expect("slice pattern of array with more than u32::MAX elements") } _ => bug!("from_end: false slice pattern of non-array type"), }; for offset in from..to { - let elem = ProjectionElem::ConstantIndex { - offset, - min_length: len, - from_end: false, - }; - let path = self.add_move_path( - base_path, - &elem, - |tcx| tcx.mk_place_elem(base_place.clone(), elem), - ); + let elem = + ProjectionElem::ConstantIndex { offset, min_length: len, from_end: false }; + let path = self.add_move_path(base_path, &elem, |tcx| { + tcx.mk_place_elem(base_place.clone(), elem) + }); self.record_move(place, path); } } else { match self.move_path_for(place) { Ok(path) | Err(MoveError::UnionMove { path }) => self.record_move(place, path), Err(error @ MoveError::IllegalMove { .. }) => { - self.builder.errors.push((place.clone(), error)); + self.builder.errors.push((*place, error)); } }; } @@ -506,10 +490,10 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { // of the union so it is marked as initialized again. if let [proj_base @ .., ProjectionElem::Field(_, _)] = place.projection { if let ty::Adt(def, _) = - Place::ty_from(place.base, proj_base, self.builder.body, self.builder.tcx).ty.kind + Place::ty_from(place.local, proj_base, self.builder.body, self.builder.tcx).ty.kind { if def.is_union() { - place = PlaceRef { base: place.base, projection: proj_base } + place = PlaceRef { local: place.local, projection: proj_base } } } } diff --git a/src/librustc_mir/dataflow/move_paths/mod.rs b/src/librustc_mir/dataflow/move_paths/mod.rs index 89ef9b245c..a46465ab49 100644 --- a/src/librustc_mir/dataflow/move_paths/mod.rs +++ b/src/librustc_mir/dataflow/move_paths/mod.rs @@ -1,10 +1,10 @@ use core::slice::Iter; use rustc::mir::*; -use rustc::ty::{Ty, TyCtxt, ParamEnv}; -use rustc::util::nodemap::FxHashMap; -use rustc_index::vec::{Enumerated, Idx, IndexVec}; +use rustc::ty::{ParamEnv, Ty, TyCtxt}; +use rustc_data_structures::fx::FxHashMap; +use rustc_index::vec::{Enumerated, IndexVec}; +use rustc_span::Span; use smallvec::SmallVec; -use syntax_pos::Span; use std::fmt; use std::ops::{Index, IndexMut}; @@ -246,10 +246,7 @@ impl MovePathLookup { // unknown place, but will rather return the nearest available // parent. pub fn find(&self, place: PlaceRef<'_, '_>) -> LookupResult { - let mut result = match place.base { - PlaceBase::Local(local) => self.locals[*local], - PlaceBase::Static(..) => return LookupResult::Parent(None), - }; + let mut result = self.locals[*place.local]; for elem in place.projection.iter() { if let Some(&subpath) = self.projections.get(&(result, elem.lift())) { @@ -281,9 +278,6 @@ pub struct IllegalMoveOrigin<'tcx> { #[derive(Debug)] pub(crate) enum IllegalMoveOriginKind<'tcx> { - /// Illegal move due to attempt to move from `static` variable. - Static, - /// Illegal move due to attempt to move from behind a reference. BorrowedContent { /// The place the reference refers to: if erroneous code was trying to diff --git a/src/librustc_mir/interpret/cast.rs b/src/librustc_mir/interpret/cast.rs index e9602ecfa4..9461a06690 100644 --- a/src/librustc_mir/interpret/cast.rs +++ b/src/librustc_mir/interpret/cast.rs @@ -1,17 +1,15 @@ +use rustc::ty::adjustment::PointerCast; +use rustc::ty::layout::{self, Size, TyLayout}; use rustc::ty::{self, Ty, TypeAndMut, TypeFoldable}; -use rustc::ty::layout::{self, TyLayout, Size}; -use rustc::ty::adjustment::{PointerCast}; +use rustc_span::symbol::sym; use syntax::ast::FloatTy; -use syntax::symbol::sym; -use rustc_apfloat::ieee::{Single, Double}; -use rustc_apfloat::{Float, FloatConvert}; -use rustc::mir::interpret::{ - Scalar, InterpResult, PointerArithmetic, -}; +use rustc::mir::interpret::{InterpResult, PointerArithmetic, Scalar}; use rustc::mir::CastKind; +use rustc_apfloat::ieee::{Double, Single}; +use rustc_apfloat::{Float, FloatConvert}; -use super::{InterpCx, Machine, PlaceTy, OpTy, ImmTy, Immediate, FnVal}; +use super::{FnVal, ImmTy, Immediate, InterpCx, Machine, OpTy, PlaceTy}; impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn cast( @@ -52,7 +50,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { self.param_env, def_id, substs, - ).ok_or_else(|| err_inval!(TooGeneric))?; + ) + .ok_or_else(|| err_inval!(TooGeneric))?; let fn_ptr = self.memory.create_fn_alloc(FnVal::Instance(instance)); self.write_scalar(fn_ptr, dest)?; @@ -107,55 +106,61 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { match src.layout.ty.kind { // Floating point - Float(FloatTy::F32) => - return Ok(self.cast_from_float(src.to_scalar()?.to_f32()?, dest_layout.ty)?.into()), - Float(FloatTy::F64) => - return Ok(self.cast_from_float(src.to_scalar()?.to_f64()?, dest_layout.ty)?.into()), + Float(FloatTy::F32) => { + return Ok(self + .cast_from_float(src.to_scalar()?.to_f32()?, dest_layout.ty)? + .into()); + } + Float(FloatTy::F64) => { + return Ok(self + .cast_from_float(src.to_scalar()?.to_f64()?, dest_layout.ty)? + .into()); + } // The rest is integer/pointer-"like", including fn ptr casts and casts from enums that // are represented as integers. - _ => - assert!( - src.layout.ty.is_bool() || src.layout.ty.is_char() || - src.layout.ty.is_enum() || src.layout.ty.is_integral() || - src.layout.ty.is_any_ptr(), - "Unexpected cast from type {:?}", src.layout.ty - ) + _ => assert!( + src.layout.ty.is_bool() + || src.layout.ty.is_char() + || src.layout.ty.is_enum() + || src.layout.ty.is_integral() + || src.layout.ty.is_any_ptr(), + "Unexpected cast from type {:?}", + src.layout.ty + ), } // Handle cast from a univariant (ZST) enum. match src.layout.variants { layout::Variants::Single { index } => { - if let Some(discr) = - src.layout.ty.discriminant_for_variant(*self.tcx, index) - { + if let Some(discr) = src.layout.ty.discriminant_for_variant(*self.tcx, index) { assert!(src.layout.is_zst()); return Ok(Scalar::from_uint(discr.val, dest_layout.size).into()); } } - layout::Variants::Multiple { .. } => {}, + layout::Variants::Multiple { .. } => {} } // Handle casting the metadata away from a fat pointer. - if src.layout.ty.is_unsafe_ptr() && dest_layout.ty.is_unsafe_ptr() && - dest_layout.size != src.layout.size + if src.layout.ty.is_unsafe_ptr() + && dest_layout.ty.is_unsafe_ptr() + && dest_layout.size != src.layout.size { - assert_eq!(src.layout.size, 2*self.memory.pointer_size()); + assert_eq!(src.layout.size, 2 * self.memory.pointer_size()); assert_eq!(dest_layout.size, self.memory.pointer_size()); assert!(dest_layout.ty.is_unsafe_ptr()); match *src { - Immediate::ScalarPair(data, _) => - return Ok(data.into()), - Immediate::Scalar(..) => - bug!( - "{:?} input to a fat-to-thin cast ({:?} -> {:?})", - *src, src.layout.ty, dest_layout.ty - ), + Immediate::ScalarPair(data, _) => return Ok(data.into()), + Immediate::Scalar(..) => bug!( + "{:?} input to a fat-to-thin cast ({:?} -> {:?})", + *src, + src.layout.ty, + dest_layout.ty + ), }; } // Handle casting any ptr to raw ptr (might be a fat ptr). - if src.layout.ty.is_any_ptr() && dest_layout.ty.is_unsafe_ptr() - { + if src.layout.ty.is_any_ptr() && dest_layout.ty.is_unsafe_ptr() { // The only possible size-unequal case was handled above. assert_eq!(src.layout.size, dest_layout.size); return Ok(*src); @@ -177,11 +182,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { ) -> InterpResult<'tcx, Scalar> { // Let's make sure v is sign-extended *if* it has a signed type. let signed = src_layout.abi.is_signed(); - let v = if signed { - self.sign_extend(v, src_layout) - } else { - v - }; + let v = if signed { self.sign_extend(v, src_layout) } else { v }; trace!("cast_from_int: {}, {}, {}", v, src_layout.ty, dest_layout.ty); use rustc::ty::TyKind::*; match dest_layout.ty.kind { @@ -190,24 +191,20 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Ok(Scalar::from_uint(v, dest_layout.size)) } - Float(FloatTy::F32) if signed => Ok(Scalar::from_f32( - Single::from_i128(v as i128).value - )), - Float(FloatTy::F64) if signed => Ok(Scalar::from_f64( - Double::from_i128(v as i128).value - )), - Float(FloatTy::F32) => Ok(Scalar::from_f32( - Single::from_u128(v).value - )), - Float(FloatTy::F64) => Ok(Scalar::from_f64( - Double::from_u128(v).value - )), + Float(FloatTy::F32) if signed => { + Ok(Scalar::from_f32(Single::from_i128(v as i128).value)) + } + Float(FloatTy::F64) if signed => { + Ok(Scalar::from_f64(Double::from_i128(v as i128).value)) + } + Float(FloatTy::F32) => Ok(Scalar::from_f32(Single::from_u128(v).value)), + Float(FloatTy::F64) => Ok(Scalar::from_f64(Double::from_u128(v).value)), Char => { // `u8` to `char` cast debug_assert_eq!(v as u8 as u128, v); Ok(Scalar::from_uint(v, Size::from_bytes(4))) - }, + } // Casts to bool are not permitted by rustc, no need to handle them here. _ => bug!("invalid int to {:?} cast", dest_layout.ty), @@ -217,9 +214,10 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { fn cast_from_float( &self, f: F, - dest_ty: Ty<'tcx> + dest_ty: Ty<'tcx>, ) -> InterpResult<'tcx, Scalar> - where F: Float + Into> + FloatConvert + FloatConvert + where + F: Float + Into> + FloatConvert + FloatConvert, { use rustc::ty::TyKind::*; match dest_ty.kind { @@ -229,19 +227,17 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let v = f.to_u128(width).value; // This should already fit the bit width Ok(Scalar::from_uint(v, Size::from_bits(width as u64))) - }, + } // float -> int Int(t) => { let width = t.bit_width().unwrap_or_else(|| self.pointer_size().bits() as usize); let v = f.to_i128(width).value; Ok(Scalar::from_int(v, Size::from_bits(width as u64))) - }, + } // float -> f32 - Float(FloatTy::F32) => - Ok(Scalar::from_f32(f.convert(&mut false).value)), + Float(FloatTy::F32) => Ok(Scalar::from_f32(f.convert(&mut false).value)), // float -> f64 - Float(FloatTy::F64) => - Ok(Scalar::from_f64(f.convert(&mut false).value)), + Float(FloatTy::F64) => Ok(Scalar::from_f64(f.convert(&mut false).value)), // That's it. _ => bug!("invalid float to {:?} cast", dest_ty), } @@ -296,10 +292,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { ) -> InterpResult<'tcx> { trace!("Unsizing {:?} into {:?}", src, dest); match (&src.layout.ty.kind, &dest.layout.ty.kind) { - (&ty::Ref(_, s, _), &ty::Ref(_, d, _)) | - (&ty::Ref(_, s, _), &ty::RawPtr(TypeAndMut { ty: d, .. })) | - (&ty::RawPtr(TypeAndMut { ty: s, .. }), - &ty::RawPtr(TypeAndMut { ty: d, .. })) => { + (&ty::Ref(_, s, _), &ty::Ref(_, d, _)) + | (&ty::Ref(_, s, _), &ty::RawPtr(TypeAndMut { ty: d, .. })) + | (&ty::RawPtr(TypeAndMut { ty: s, .. }), &ty::RawPtr(TypeAndMut { ty: d, .. })) => { self.unsize_into_ptr(src, dest, s, d) } (&ty::Adt(def_a, _), &ty::Adt(def_b, _)) => { @@ -333,13 +328,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } Ok(()) } - _ => { - bug!( - "unsize_into: invalid conversion: {:?} -> {:?}", - src.layout, - dest.layout - ) - } + _ => bug!("unsize_into: invalid conversion: {:?} -> {:?}", src.layout, dest.layout), } } } diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 653718c462..206d3d1567 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -2,29 +2,26 @@ use std::cell::Cell; use std::fmt::Write; use std::mem; -use syntax::source_map::{self, Span, DUMMY_SP}; use rustc::ich::StableHashingContext; -use rustc::hir::def_id::DefId; -use rustc::hir::def::DefKind; use rustc::mir; -use rustc::ty::layout::{ - self, Size, Align, HasDataLayout, LayoutOf, TyLayout +use rustc::mir::interpret::{ + sign_extend, truncate, AllocId, FrameInfo, GlobalId, InterpResult, Pointer, Scalar, }; +use rustc::ty::layout::{self, Align, HasDataLayout, LayoutOf, Size, TyLayout}; +use rustc::ty::query::TyCtxtAt; use rustc::ty::subst::SubstsRef; use rustc::ty::{self, Ty, TyCtxt, TypeFoldable}; -use rustc::ty::query::TyCtxtAt; -use rustc_index::vec::IndexVec; -use rustc::mir::interpret::{ - GlobalId, Scalar, Pointer, FrameInfo, AllocId, - InterpResult, truncate, sign_extend, -}; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_hir::def::DefKind; +use rustc_hir::def_id::DefId; +use rustc_index::vec::IndexVec; use rustc_macros::HashStable; +use rustc_span::source_map::{self, Span, DUMMY_SP}; use super::{ - Immediate, Operand, MemPlace, MPlaceTy, Place, PlaceTy, ScalarMaybeUndef, - Memory, Machine, StackPopInfo + Immediate, MPlaceTy, Machine, MemPlace, MemPlaceMeta, Memory, OpTy, Operand, Place, PlaceTy, + ScalarMaybeUndef, StackPopInfo, }; pub struct InterpCx<'mir, 'tcx, M: Machine<'mir, 'tcx>> { @@ -50,7 +47,7 @@ pub struct InterpCx<'mir, 'tcx, M: Machine<'mir, 'tcx>> { /// A stack frame. #[derive(Clone)] -pub struct Frame<'mir, 'tcx, Tag=(), Extra=()> { +pub struct Frame<'mir, 'tcx, Tag = (), Extra = ()> { //////////////////////////////////////////////////////////////////////////////// // Function and callsite information //////////////////////////////////////////////////////////////////////////////// @@ -113,7 +110,7 @@ pub enum StackPopCleanup { /// State of a local variable including a memoized layout #[derive(Clone, PartialEq, Eq, HashStable)] -pub struct LocalState<'tcx, Tag=(), Id=AllocId> { +pub struct LocalState<'tcx, Tag = (), Id = AllocId> { pub value: LocalValue, /// Don't modify if `Some`, this is only used to prevent computing the layout twice #[stable_hasher(ignore)] @@ -121,8 +118,8 @@ pub struct LocalState<'tcx, Tag=(), Id=AllocId> { } /// Current value of a local variable -#[derive(Clone, PartialEq, Eq, Debug, HashStable)] // Miri debug-prints these -pub enum LocalValue { +#[derive(Copy, Clone, PartialEq, Eq, Debug, HashStable)] // Miri debug-prints these +pub enum LocalValue { /// This local is not currently alive, and cannot be used at all. Dead, /// This local is alive but not yet initialized. It can be written to @@ -142,8 +139,9 @@ impl<'tcx, Tag: Copy + 'static> LocalState<'tcx, Tag> { pub fn access(&self) -> InterpResult<'tcx, Operand> { match self.value { LocalValue::Dead => throw_unsup!(DeadLocal), - LocalValue::Uninitialized => - bug!("The type checker should prevent reading from a never-written local"), + LocalValue::Uninitialized => { + bug!("The type checker should prevent reading from a never-written local") + } LocalValue::Live(val) => Ok(val), } } @@ -156,10 +154,8 @@ impl<'tcx, Tag: Copy + 'static> LocalState<'tcx, Tag> { match self.value { LocalValue::Dead => throw_unsup!(DeadLocal), LocalValue::Live(Operand::Indirect(mplace)) => Ok(Err(mplace)), - ref mut local @ LocalValue::Live(Operand::Immediate(_)) | - ref mut local @ LocalValue::Uninitialized => { - Ok(Ok(local)) - } + ref mut local @ LocalValue::Live(Operand::Immediate(_)) + | ref mut local @ LocalValue::Uninitialized => Ok(Ok(local)), } } } @@ -245,7 +241,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn force_bits( &self, scalar: Scalar, - size: Size + size: Size, ) -> InterpResult<'tcx, u128> { self.memory.force_bits(scalar, size) } @@ -326,11 +322,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { return Ok(self.tcx.promoted_mir(did)[promoted].unwrap_read_only()); } match instance { - ty::InstanceDef::Item(def_id) => if self.tcx.is_mir_available(did) { - Ok(self.tcx.optimized_mir(did).unwrap_read_only()) - } else { - throw_unsup!(NoMirFor(self.tcx.def_path_str(def_id))) - }, + ty::InstanceDef::Item(def_id) => { + if self.tcx.is_mir_available(did) { + Ok(self.tcx.optimized_mir(did).unwrap_read_only()) + } else { + throw_unsup!(NoMirFor(self.tcx.def_path_str(def_id))) + } + } _ => Ok(self.tcx.instance_mir(instance)), } } @@ -352,17 +350,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub(super) fn resolve( &self, def_id: DefId, - substs: SubstsRef<'tcx> + substs: SubstsRef<'tcx>, ) -> InterpResult<'tcx, ty::Instance<'tcx>> { trace!("resolve: {:?}, {:#?}", def_id, substs); trace!("param_env: {:#?}", self.param_env); trace!("substs: {:#?}", substs); - ty::Instance::resolve( - *self.tcx, - self.param_env, - def_id, - substs, - ).ok_or_else(|| err_inval!(TooGeneric).into()) + ty::Instance::resolve(*self.tcx, self.param_env, def_id, substs) + .ok_or_else(|| err_inval!(TooGeneric).into()) } pub fn layout_of_local( @@ -399,7 +393,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// This can fail to provide an answer for extern types. pub(super) fn size_and_align_of( &self, - metadata: Option>, + metadata: MemPlaceMeta, layout: TyLayout<'tcx>, ) -> InterpResult<'tcx, Option<(Size, Align)>> { if !layout.is_unsized() { @@ -436,7 +430,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // of `extern type`, this should be adapted. It is just a temporary hack // to get some code to work that probably ought to work. if sized_size == Size::ZERO { - return Ok(None) + return Ok(None); } else { bug!("Fields cannot be extern types, unless they are at offset 0") } @@ -463,31 +457,34 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // Check if this brought us over the size limit. if size.bytes() >= self.tcx.data_layout().obj_size_bound() { - throw_ub_format!("wide pointer metadata contains invalid information: \ - total size is bigger than largest supported object"); + throw_ub_format!( + "wide pointer metadata contains invalid information: \ + total size is bigger than largest supported object" + ); } Ok(Some((size, align))) } ty::Dynamic(..) => { - let vtable = metadata.expect("dyn trait fat ptr must have vtable"); + let vtable = metadata.unwrap_meta(); // Read size and align from vtable (already checks size). Ok(Some(self.read_size_and_align_from_vtable(vtable)?)) } ty::Slice(_) | ty::Str => { - let len = metadata.expect("slice fat ptr must have length").to_machine_usize(self)?; + let len = metadata.unwrap_meta().to_machine_usize(self)?; let elem = layout.field(self, 0)?; // Make sure the slice is not too big. - let size = elem.size.checked_mul(len, &*self.tcx) - .ok_or_else(|| err_ub_format!("invalid slice: \ - total size is bigger than largest supported object"))?; + let size = elem.size.checked_mul(len, &*self.tcx).ok_or_else(|| { + err_ub_format!( + "invalid slice: \ + total size is bigger than largest supported object" + ) + })?; Ok(Some((size, elem.align.abi))) } - ty::Foreign(_) => { - Ok(None) - } + ty::Foreign(_) => Ok(None), _ => bug!("size_and_align_of::<{:?}> not supported", layout.ty), } @@ -495,7 +492,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { #[inline] pub fn size_and_align_of_mplace( &self, - mplace: MPlaceTy<'tcx, M::PointerTag> + mplace: MPlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, Option<(Size, Align)>> { self.size_and_align_of(mplace.meta, mplace.layout) } @@ -532,10 +529,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // don't allocate at all for trivial constants if body.local_decls.len() > 1 { // Locals are initially uninitialized. - let dummy = LocalState { - value: LocalValue::Uninitialized, - layout: Cell::new(None), - }; + let dummy = LocalState { value: LocalValue::Uninitialized, layout: Cell::new(None) }; let mut locals = IndexVec::from_elem(dummy, &body.local_decls); // Return place is handled specially by the `eval_place` functions, and the // entry in `locals` should never be used. Make it dead, to be sure. @@ -543,24 +537,21 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // Now mark those locals as dead that we do not want to initialize match self.tcx.def_kind(instance.def_id()) { // statics and constants don't have `Storage*` statements, no need to look for them - Some(DefKind::Static) - | Some(DefKind::Const) - | Some(DefKind::AssocConst) => {}, + Some(DefKind::Static) | Some(DefKind::Const) | Some(DefKind::AssocConst) => {} _ => { trace!("push_stack_frame: {:?}: num_bbs: {}", span, body.basic_blocks().len()); for block in body.basic_blocks() { for stmt in block.statements.iter() { use rustc::mir::StatementKind::{StorageDead, StorageLive}; match stmt.kind { - StorageLive(local) | - StorageDead(local) => { + StorageLive(local) | StorageDead(local) => { locals[local].value = LocalValue::Dead; } _ => {} } } } - }, + } } // done self.frame_mut().locals = locals; @@ -619,26 +610,25 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// `Drop` impls for any locals that have been initialized at this point. /// The cleanup block ends with a special `Resume` terminator, which will /// cause us to continue unwinding. - pub(super) fn pop_stack_frame( - &mut self, - unwinding: bool - ) -> InterpResult<'tcx> { - info!("LEAVING({}) {} (unwinding = {})", - self.cur_frame(), self.frame().instance, unwinding); + pub(super) fn pop_stack_frame(&mut self, unwinding: bool) -> InterpResult<'tcx> { + info!( + "LEAVING({}) {} (unwinding = {})", + self.cur_frame(), + self.frame().instance, + unwinding + ); // Sanity check `unwinding`. assert_eq!( unwinding, match self.frame().block { None => true, - Some(block) => self.body().basic_blocks()[block].is_cleanup + Some(block) => self.body().basic_blocks()[block].is_cleanup, } ); ::log_settings::settings().indentation -= 1; - let frame = self.stack.pop().expect( - "tried to pop a stack frame, but there were none", - ); + let frame = self.stack.pop().expect("tried to pop a stack frame, but there were none"); let stack_pop_info = M::stack_pop(self, frame.extra, unwinding)?; if let (false, StackPopInfo::StopUnwinding) = (unwinding, stack_pop_info) { bug!("Attempted to stop unwinding while there is no unwinding!"); @@ -647,11 +637,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // Now where do we jump next? // Determine if we leave this function normally or via unwinding. - let cur_unwinding = if let StackPopInfo::StopUnwinding = stack_pop_info { - false - } else { - unwinding - }; + let cur_unwinding = + if let StackPopInfo::StopUnwinding = stack_pop_info { false } else { unwinding }; // Usually we want to clean up (deallocate locals), but in a few rare cases we don't. // In that case, we return early. We also avoid validation in that case, @@ -659,8 +646,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let (cleanup, next_block) = match frame.return_to_block { StackPopCleanup::Goto { ret, unwind } => { (true, Some(if cur_unwinding { unwind } else { ret })) - }, - StackPopCleanup::None { cleanup, .. } => (cleanup, None) + } + StackPopCleanup::None { cleanup, .. } => (cleanup, None), }; if !cleanup { @@ -675,9 +662,12 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { self.deallocate_local(local.value)?; } - - trace!("StackPopCleanup: {:?} StackPopInfo: {:?} cur_unwinding = {:?}", - frame.return_to_block, stack_pop_info, cur_unwinding); + trace!( + "StackPopCleanup: {:?} StackPopInfo: {:?} cur_unwinding = {:?}", + frame.return_to_block, + stack_pop_info, + cur_unwinding + ); if cur_unwinding { // Follow the unwind edge. let unwind = next_block.expect("Encounted StackPopCleanup::None when unwinding!"); @@ -695,11 +685,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // invariant -- that is, unless a function somehow has a ptr to // its return place... but the way MIR is currently generated, the // return place is always a local and then this cannot happen. - self.validate_operand( - self.place_to_op(return_place)?, - vec![], - None, - )?; + self.validate_operand(self.place_to_op(return_place)?, vec![], None)?; } } else { // Uh, that shouldn't happen... the function did not intend to return @@ -713,8 +699,12 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } if self.stack.len() > 0 { - info!("CONTINUING({}) {} (unwinding = {})", - self.cur_frame(), self.frame().instance, cur_unwinding); + info!( + "CONTINUING({}) {} (unwinding = {})", + self.cur_frame(), + self.frame().instance, + cur_unwinding + ); } Ok(()) @@ -724,7 +714,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Remember to deallocate that! pub fn storage_live( &mut self, - local: mir::Local + local: mir::Local, ) -> InterpResult<'tcx, LocalValue> { assert!(local != mir::RETURN_PLACE, "Cannot make return place live"); trace!("{:?} is now live", local); @@ -752,7 +742,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // FIXME: should we tell the user that there was a local which was never written to? if let LocalValue::Live(Operand::Indirect(MemPlace { ptr, .. })) = local { trace!("deallocating local"); - let ptr = ptr.to_ptr()?; + // All locals have a backing allocation, even if the allocation is empty + // due to the local having ZST type. + let ptr = ptr.assert_ptr(); if log_enabled!(::log::Level::Trace) { self.memory.dump_alloc(ptr.alloc_id); } @@ -761,13 +753,42 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Ok(()) } + pub(super) fn const_eval( + &self, + gid: GlobalId<'tcx>, + ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { + // For statics we pick `ParamEnv::reveal_all`, because statics don't have generics + // and thus don't care about the parameter environment. While we could just use + // `self.param_env`, that would mean we invoke the query to evaluate the static + // with different parameter environments, thus causing the static to be evaluated + // multiple times. + let param_env = if self.tcx.is_static(gid.instance.def_id()) { + ty::ParamEnv::reveal_all() + } else { + self.param_env + }; + let val = if let Some(promoted) = gid.promoted { + self.tcx.const_eval_promoted(param_env, gid.instance, promoted)? + } else { + self.tcx.const_eval_instance(param_env, gid.instance, Some(self.tcx.span))? + }; + + // Even though `ecx.const_eval` is called from `eval_const_to_op` we can never have a + // recursion deeper than one level, because the `tcx.const_eval` above is guaranteed to not + // return `ConstValue::Unevaluated`, which is the only way that `eval_const_to_op` will call + // `ecx.const_eval`. + self.eval_const_to_op(val, None) + } + pub fn const_eval_raw( &self, gid: GlobalId<'tcx>, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { - // FIXME(oli-obk): make this check an assertion that it's not a static here - // FIXME(RalfJ, oli-obk): document that `Place::Static` can never be anything but a static - // and `ConstValue::Unevaluated` can never be a static + // For statics we pick `ParamEnv::reveal_all`, because statics don't have generics + // and thus don't care about the parameter environment. While we could just use + // `self.param_env`, that would mean we invoke the query to evaluate the static + // with different parameter environments, thus causing the static to be evaluated + // multiple times. let param_env = if self.tcx.is_static(gid.instance.def_id()) { ty::ParamEnv::reveal_all() } else { @@ -798,21 +819,22 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { match self.stack[frame].locals[local].value { LocalValue::Dead => write!(msg, " is dead").unwrap(), LocalValue::Uninitialized => write!(msg, " is uninitialized").unwrap(), - LocalValue::Live(Operand::Indirect(mplace)) => { - match mplace.ptr { - Scalar::Ptr(ptr) => { - write!(msg, " by align({}){} ref:", - mplace.align.bytes(), - match mplace.meta { - Some(meta) => format!(" meta({:?})", meta), - None => String::new() - } - ).unwrap(); - allocs.push(ptr.alloc_id); - } - ptr => write!(msg, " by integral ref: {:?}", ptr).unwrap(), + LocalValue::Live(Operand::Indirect(mplace)) => match mplace.ptr { + Scalar::Ptr(ptr) => { + write!( + msg, + " by align({}){} ref:", + mplace.align.bytes(), + match mplace.meta { + MemPlaceMeta::Meta(meta) => format!(" meta({:?})", meta), + MemPlaceMeta::Poison | MemPlaceMeta::None => String::new(), + } + ) + .unwrap(); + allocs.push(ptr.alloc_id); } - } + ptr => write!(msg, " by integral ref: {:?}", ptr).unwrap(), + }, LocalValue::Live(Operand::Immediate(Immediate::Scalar(val))) => { write!(msg, " {:?}", val).unwrap(); if let ScalarMaybeUndef::Scalar(Scalar::Ptr(ptr)) = val { @@ -833,15 +855,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { trace!("{}", msg); self.memory.dump_allocs(allocs); } - Place::Ptr(mplace) => { - match mplace.ptr { - Scalar::Ptr(ptr) => { - trace!("by align({}) ref:", mplace.align.bytes()); - self.memory.dump_alloc(ptr.alloc_id); - } - ptr => trace!(" integral by ref: {:?}", ptr), + Place::Ptr(mplace) => match mplace.ptr { + Scalar::Ptr(ptr) => { + trace!("by align({}) ref:", mplace.align.bytes()); + self.memory.dump_alloc(ptr.alloc_id); } - } + ptr => trace!(" integral by ref: {:?}", ptr), + }, } } @@ -877,9 +897,10 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } impl<'ctx, 'mir, 'tcx, Tag, Extra> HashStable> -for Frame<'mir, 'tcx, Tag, Extra> - where Extra: HashStable>, - Tag: HashStable> + for Frame<'mir, 'tcx, Tag, Extra> +where + Extra: HashStable>, + Tag: HashStable>, { fn hash_stable(&self, hcx: &mut StableHashingContext<'ctx>, hasher: &mut StableHasher) { self.body.hash_stable(hcx, hasher); diff --git a/src/librustc_mir/interpret/intern.rs b/src/librustc_mir/interpret/intern.rs index f9cb40ffe9..0c65b77a38 100644 --- a/src/librustc_mir/interpret/intern.rs +++ b/src/librustc_mir/interpret/intern.rs @@ -4,29 +4,25 @@ //! memory, we need to extract all memory allocations to the global memory pool so they stay around. use super::validity::RefTracking; -use rustc::hir; use rustc::mir::interpret::{ErrorHandled, InterpResult}; use rustc::ty::{self, Ty}; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_hir as hir; use syntax::ast::Mutability; -use super::{ - AllocId, Allocation, InterpCx, Machine, MemoryKind, MPlaceTy, Scalar, ValueVisitor, -}; +use super::{AllocId, Allocation, InterpCx, MPlaceTy, Machine, MemoryKind, Scalar, ValueVisitor}; -pub trait CompileTimeMachine<'mir, 'tcx> = - Machine< - 'mir, - 'tcx, - MemoryKinds = !, - PointerTag = (), - ExtraFnVal = !, - FrameExtra = (), - MemoryExtra = (), - AllocExtra = (), - MemoryMap = FxHashMap, Allocation)>, - >; +pub trait CompileTimeMachine<'mir, 'tcx> = Machine< + 'mir, + 'tcx, + MemoryKinds = !, + PointerTag = (), + ExtraFnVal = !, + FrameExtra = (), + AllocExtra = (), + MemoryMap = FxHashMap, Allocation)>, +>; struct InternVisitor<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx>> { /// The ectx from which we intern. @@ -45,6 +41,11 @@ struct InternVisitor<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx>> { /// despite the nested mutable reference! /// The field gets updated when an `UnsafeCell` is encountered. mutability: Mutability, + + /// This flag is to avoid triggering UnsafeCells are not allowed behind references in constants + /// for promoteds. + /// It's a copy of `mir::Body`'s ignore_interior_mut_in_const_validation field + ignore_interior_mut_in_const_validation: bool, } #[derive(Copy, Clone, Debug, PartialEq, Hash, Eq)] @@ -95,31 +96,27 @@ fn intern_shallow<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx>>( // treat dangling pointers like other statics // just to stop trying to recurse into them return Ok(Some(IsStaticOrFn)); - }, + } }; // This match is just a canary for future changes to `MemoryKind`, which most likely need // changes in this function. match kind { - MemoryKind::Stack | MemoryKind::Vtable | MemoryKind::CallerLocation => {}, + MemoryKind::Stack | MemoryKind::Vtable | MemoryKind::CallerLocation => {} } // Set allocation mutability as appropriate. This is used by LLVM to put things into // read-only memory, and also by Miri when evluating other constants/statics that // access this one. if mode == InternMode::Static { // When `ty` is `None`, we assume no interior mutability. - let frozen = ty.map_or(true, |ty| ty.is_freeze( - ecx.tcx.tcx, - ecx.param_env, - ecx.tcx.span, - )); + let frozen = ty.map_or(true, |ty| ty.is_freeze(ecx.tcx.tcx, ecx.param_env, ecx.tcx.span)); // For statics, allocation mutability is the combination of the place mutability and // the type mutability. // The entire allocation needs to be mutable if it contains an `UnsafeCell` anywhere. - if mutability == Mutability::Immutable && frozen { - alloc.mutability = Mutability::Immutable; + if mutability == Mutability::Not && frozen { + alloc.mutability = Mutability::Not; } else { // Just making sure we are not "upgrading" an immutable allocation to mutable. - assert_eq!(alloc.mutability, Mutability::Mutable); + assert_eq!(alloc.mutability, Mutability::Mut); } } else { // We *could* be non-frozen at `ConstBase`, for constants like `Cell::new(0)`. @@ -127,10 +124,11 @@ fn intern_shallow<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx>>( // initial value was computed. // Constants are never mutable. assert_eq!( - mutability, Mutability::Immutable, + mutability, + Mutability::Not, "Something went very wrong: mutability requested for a constant" ); - alloc.mutability = Mutability::Immutable; + alloc.mutability = Mutability::Not; }; // link the alloc id to the actual allocation let alloc = tcx.intern_const_alloc(alloc); @@ -146,21 +144,12 @@ impl<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx>> InternVisitor<'rt, 'mir mutability: Mutability, ty: Option>, ) -> InterpResult<'tcx, Option> { - intern_shallow( - self.ecx, - self.leftover_allocations, - self.mode, - alloc_id, - mutability, - ty, - ) + intern_shallow(self.ecx, self.leftover_allocations, self.mode, alloc_id, mutability, ty) } } -impl<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx>> - ValueVisitor<'mir, 'tcx, M> -for - InternVisitor<'rt, 'mir, 'tcx, M> +impl<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> + for InternVisitor<'rt, 'mir, 'tcx, M> { type V = MPlaceTy<'tcx>; @@ -172,21 +161,24 @@ for fn visit_aggregate( &mut self, mplace: MPlaceTy<'tcx>, - fields: impl Iterator>, + fields: impl Iterator>, ) -> InterpResult<'tcx> { if let Some(def) = mplace.layout.ty.ty_adt_def() { if Some(def.did) == self.ecx.tcx.lang_items().unsafe_cell_type() { // We are crossing over an `UnsafeCell`, we can mutate again. This means that // References we encounter inside here are interned as pointing to mutable // allocations. - let old = std::mem::replace(&mut self.mutability, Mutability::Mutable); - assert_ne!( - self.mode, InternMode::Const, - "UnsafeCells are not allowed behind references in constants. This should have \ - been prevented statically by const qualification. If this were allowed one \ - would be able to change a constant at one use site and other use sites could \ - observe that mutation.", - ); + let old = std::mem::replace(&mut self.mutability, Mutability::Mut); + if !self.ignore_interior_mut_in_const_validation { + assert_ne!( + self.mode, + InternMode::Const, + "UnsafeCells are not allowed behind references in constants. This should \ + have been prevented statically by const qualification. If this were \ + allowed one would be able to change a constant at one use site and other \ + use sites could observe that mutation.", + ); + } let walked = self.walk_aggregate(mplace, fields); self.mutability = old; return walked; @@ -202,15 +194,21 @@ for if let ty::Ref(_, referenced_ty, mutability) = ty.kind { let value = self.ecx.read_immediate(mplace.into())?; let mplace = self.ecx.ref_to_mplace(value)?; - // Handle trait object vtables + // Handle trait object vtables. if let ty::Dynamic(..) = - self.ecx.tcx.struct_tail_erasing_lifetimes( - referenced_ty, self.ecx.param_env).kind + self.ecx.tcx.struct_tail_erasing_lifetimes(referenced_ty, self.ecx.param_env).kind { - if let Ok(vtable) = mplace.meta.unwrap().to_ptr() { - // explitly choose `Immutable` here, since vtables are immutable, even - // if the reference of the fat pointer is mutable - self.intern_shallow(vtable.alloc_id, Mutability::Immutable, None)?; + // Validation has already errored on an invalid vtable pointer so we can safely not + // do anything if this is not a real pointer. + if let Scalar::Ptr(vtable) = mplace.meta.unwrap_meta() { + // Explicitly choose `Immutable` here, since vtables are immutable, even + // if the reference of the fat pointer is mutable. + self.intern_shallow(vtable.alloc_id, Mutability::Not, None)?; + } else { + self.ecx().tcx.sess.delay_span_bug( + rustc_span::DUMMY_SP, + "vtables pointers cannot be integer pointers", + ); } } // Check if we have encountered this pointer+layout combination before. @@ -223,36 +221,32 @@ for // const qualification enforces it. We can lift it in the future. match (self.mode, mutability) { // immutable references are fine everywhere - (_, hir::Mutability::Immutable) => {}, + (_, hir::Mutability::Not) => {} // all is "good and well" in the unsoundness of `static mut` // mutable references are ok in `static`. Either they are treated as immutable // because they are behind an immutable one, or they are behind an `UnsafeCell` // and thus ok. - (InternMode::Static, hir::Mutability::Mutable) => {}, + (InternMode::Static, hir::Mutability::Mut) => {} // we statically prevent `&mut T` via `const_qualif` and double check this here - (InternMode::ConstBase, hir::Mutability::Mutable) | - (InternMode::Const, hir::Mutability::Mutable) => { - match referenced_ty.kind { - ty::Array(_, n) - if n.eval_usize(self.ecx.tcx.tcx, self.ecx.param_env) == 0 => {} - ty::Slice(_) - if mplace.meta.unwrap().to_machine_usize(self.ecx)? == 0 => {} - _ => bug!("const qualif failed to prevent mutable references"), - } + (InternMode::ConstBase, hir::Mutability::Mut) + | (InternMode::Const, hir::Mutability::Mut) => match referenced_ty.kind { + ty::Array(_, n) + if n.eval_usize(self.ecx.tcx.tcx, self.ecx.param_env) == 0 => {} + ty::Slice(_) + if mplace.meta.unwrap_meta().to_machine_usize(self.ecx)? == 0 => {} + _ => bug!("const qualif failed to prevent mutable references"), }, } // Compute the mutability with which we'll start visiting the allocation. This is - // what gets changed when we encounter an `UnsafeCell` - let mutability = match (self.mutability, mutability) { - // The only way a mutable reference actually works as a mutable reference is - // by being in a `static mut` directly or behind another mutable reference. - // If there's an immutable reference or we are inside a static, then our - // mutable reference is equivalent to an immutable one. As an example: - // `&&mut Foo` is semantically equivalent to `&&Foo` - (Mutability::Mutable, hir::Mutability::Mutable) => Mutability::Mutable, - _ => Mutability::Immutable, - }; + // what gets changed when we encounter an `UnsafeCell`. + // + // The only way a mutable reference actually works as a mutable reference is + // by being in a `static mut` directly or behind another mutable reference. + // If there's an immutable reference or we are inside a static, then our + // mutable reference is equivalent to an immutable one. As an example: + // `&&mut Foo` is semantically equivalent to `&&Foo` + let mutability = self.mutability.and(mutability); // Recursing behind references changes the intern mode for constants in order to // cause assertions to trigger if we encounter any `UnsafeCell`s. let mode = match self.mode { @@ -262,7 +256,7 @@ for match self.intern_shallow(ptr.alloc_id, mutability, Some(mplace.layout.ty))? { // No need to recurse, these are interned already and statics may have // cycles, so we don't want to recurse there - Some(IsStaticOrFn) => {}, + Some(IsStaticOrFn) => {} // intern everything referenced by this value. The mutability is taken from the // reference. It is checked above that mutable references only happen in // `static mut` @@ -274,19 +268,27 @@ for } } +pub enum InternKind { + /// The `mutability` of the static, ignoring the type which may have interior mutability. + Static(hir::Mutability), + Constant, + Promoted, + ConstProp, +} + pub fn intern_const_alloc_recursive>( ecx: &mut InterpCx<'mir, 'tcx, M>, - // The `mutability` of the place, ignoring the type. - place_mut: Option, + intern_kind: InternKind, ret: MPlaceTy<'tcx>, + ignore_interior_mut_in_const_validation: bool, ) -> InterpResult<'tcx> { let tcx = ecx.tcx; - let (base_mutability, base_intern_mode) = match place_mut { - Some(hir::Mutability::Immutable) => (Mutability::Immutable, InternMode::Static), + let (base_mutability, base_intern_mode) = match intern_kind { // `static mut` doesn't care about interior mutability, it's mutable anyway - Some(hir::Mutability::Mutable) => (Mutability::Mutable, InternMode::Static), - // consts, promoteds. FIXME: what about array lengths, array initializers? - None => (Mutability::Immutable, InternMode::ConstBase), + InternKind::Static(mutbl) => (mutbl, InternMode::Static), + // FIXME: what about array lengths, array initializers? + InternKind::Constant | InternKind::ConstProp => (Mutability::Not, InternMode::ConstBase), + InternKind::Promoted => (Mutability::Not, InternMode::ConstBase), }; // Type based interning. @@ -302,9 +304,11 @@ pub fn intern_const_alloc_recursive>( ecx, leftover_allocations, base_intern_mode, - ret.ptr.to_ptr()?.alloc_id, + // The outermost allocation must exist, because we allocated it with + // `Memory::allocate`. + ret.ptr.assert_ptr().alloc_id, base_mutability, - Some(ret.layout.ty) + Some(ret.layout.ty), )?; while let Some(((mplace, mutability, mode), _)) = ref_tracking.todo.pop() { @@ -314,7 +318,9 @@ pub fn intern_const_alloc_recursive>( mode, leftover_allocations, mutability, - }.visit_value(mplace); + ignore_interior_mut_in_const_validation, + } + .visit_value(mplace); if let Err(error) = interned { // This can happen when e.g. the tag of an enum is not a valid discriminant. We do have // to read enum discriminants in order to find references in enum variant fields. @@ -325,8 +331,7 @@ pub fn intern_const_alloc_recursive>( diag.note(crate::const_eval::note_on_undefined_behavior_error()); diag.emit(); } - Err(ErrorHandled::TooGeneric) | - Err(ErrorHandled::Reported) => {}, + Err(ErrorHandled::TooGeneric) | Err(ErrorHandled::Reported) => {} } } } @@ -341,12 +346,34 @@ pub fn intern_const_alloc_recursive>( // We can't call the `intern_shallow` method here, as its logic is tailored to safe // references and a `leftover_allocations` set (where we only have a todo-list here). // So we hand-roll the interning logic here again. - if base_intern_mode != InternMode::Static { - // If it's not a static, it *must* be immutable. - // We cannot have mutable memory inside a constant. - // FIXME: ideally we would assert that they already are immutable, to double- - // check our static checks. - alloc.mutability = Mutability::Immutable; + match intern_kind { + // Statics may contain mutable allocations even behind relocations. + // Even for immutable statics it would be ok to have mutable allocations behind + // raw pointers, e.g. for `static FOO: *const AtomicUsize = &AtomicUsize::new(42)`. + InternKind::Static(_) => {} + // Raw pointers in promoteds may only point to immutable things so we mark + // everything as immutable. + // It is UB to mutate through a raw pointer obtained via an immutable reference. + // Since all references and pointers inside a promoted must by their very definition + // be created from an immutable reference (and promotion also excludes interior + // mutability), mutating through them would be UB. + // There's no way we can check whether the user is using raw pointers correctly, + // so all we can do is mark this as immutable here. + InternKind::Promoted => { + alloc.mutability = Mutability::Not; + } + InternKind::Constant | InternKind::ConstProp => { + // If it's a constant, it *must* be immutable. + // We cannot have mutable memory inside a constant. + // We use `delay_span_bug` here, because this can be reached in the presence + // of fancy transmutes. + if alloc.mutability == Mutability::Mut { + // For better errors later, mark the allocation as immutable + // (on top of the delayed ICE). + alloc.mutability = Mutability::Not; + ecx.tcx.sess.delay_span_bug(ecx.tcx.span, "mutable allocation in constant"); + } + } } let alloc = tcx.intern_const_alloc(alloc); tcx.alloc_map.lock().set_alloc_id_memory(alloc_id, alloc); @@ -358,6 +385,10 @@ pub fn intern_const_alloc_recursive>( } else if ecx.memory.dead_alloc_map.contains_key(&alloc_id) { // dangling pointer throw_unsup!(ValidationFailure("encountered dangling pointer in final constant".into())) + } else if ecx.tcx.alloc_map.lock().get(alloc_id).is_none() { + // We have hit an `AllocId` that is neither in local or global memory and isn't marked + // as dangling by local memory. + span_bug!(ecx.tcx.span, "encountered unknown alloc id {:?}", alloc_id); } } Ok(()) diff --git a/src/librustc_mir/interpret/intrinsics.rs b/src/librustc_mir/interpret/intrinsics.rs index 67f0aed243..cd6d94357e 100644 --- a/src/librustc_mir/interpret/intrinsics.rs +++ b/src/librustc_mir/interpret/intrinsics.rs @@ -2,21 +2,20 @@ //! looking at their MIR. Intrinsics/functions supported here are shared by CTFE //! and miri. -use syntax_pos::symbol::{sym, Symbol}; -use syntax_pos::Span; +use rustc::mir::{ + self, + interpret::{ConstValue, GlobalId, InterpResult, Scalar}, + BinOp, +}; use rustc::ty; use rustc::ty::layout::{LayoutOf, Primitive, Size}; use rustc::ty::subst::SubstsRef; -use rustc::hir::def_id::DefId; use rustc::ty::TyCtxt; -use rustc::mir::{ - self, BinOp, - interpret::{InterpResult, Scalar, GlobalId, ConstValue} -}; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; -use super::{ - Machine, PlaceTy, OpTy, InterpCx, ImmTy, -}; +use super::{ImmTy, InterpCx, Machine, OpTy, PlaceTy}; mod caller_location; mod type_name; @@ -63,11 +62,9 @@ crate fn eval_nullary_intrinsic<'tcx>( }), ty: tcx.mk_static_str(), }) - }, + } sym::needs_drop => ty::Const::from_bool(tcx, tp_ty.needs_drop(tcx, param_env)), - sym::size_of | - sym::min_align_of | - sym::pref_align_of => { + sym::size_of | sym::min_align_of | sym::pref_align_of => { let layout = tcx.layout_of(param_env.and(tp_ty)).map_err(|e| err_inval!(Layout(e)))?; let n = match name { sym::pref_align_of => layout.align.pref.bytes(), @@ -76,12 +73,10 @@ crate fn eval_nullary_intrinsic<'tcx>( _ => bug!(), }; ty::Const::from_usize(tcx, n) - }, - sym::type_id => ty::Const::from_bits( - tcx, - tcx.type_id_hash(tp_ty).into(), - param_env.and(tcx.types.u64), - ), + } + sym::type_id => { + ty::Const::from_bits(tcx, tcx.type_id_hash(tp_ty).into(), param_env.and(tcx.types.u64)) + } other => bug!("`{}` is not a zero arg intrinsic", other), }) } @@ -105,7 +100,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { None => match intrinsic_name { sym::transmute => throw_ub!(Unreachable), _ => return Ok(false), - } + }, }; // Keep the patterns in this match ordered the same as the list in @@ -117,22 +112,18 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { self.write_scalar(location.ptr, dest)?; } - sym::min_align_of | - sym::pref_align_of | - sym::needs_drop | - sym::size_of | - sym::type_id | - sym::type_name => { - let gid = GlobalId { - instance, - promoted: None, - }; - let val = self.tcx.const_eval(self.param_env.and(gid))?; - let val = self.eval_const_to_op(val, None)?; + sym::min_align_of + | sym::pref_align_of + | sym::needs_drop + | sym::size_of + | sym::type_id + | sym::type_name => { + let gid = GlobalId { instance, promoted: None }; + let val = self.const_eval(gid)?; self.copy_op(val, dest)?; } - | sym::ctpop + sym::ctpop | sym::cttz | sym::cttz_nonzero | sym::ctlz @@ -158,7 +149,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let out_val = numeric_intrinsic(intrinsic_name, bits, kind)?; self.write_scalar(out_val, dest)?; } - | sym::wrapping_add + sym::wrapping_add | sym::wrapping_sub | sym::wrapping_mul | sym::add_with_overflow @@ -173,7 +164,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { sym::add_with_overflow => (BinOp::Add, false), sym::sub_with_overflow => (BinOp::Sub, false), sym::mul_with_overflow => (BinOp::Mul, false), - _ => bug!("Already checked for int ops") + _ => bug!("Already checked for int ops"), }; if ignore_overflow { self.binop_ignore_overflow(bin_op, lhs, rhs, dest)?; @@ -185,11 +176,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let l = self.read_immediate(args[0])?; let r = self.read_immediate(args[1])?; let is_add = intrinsic_name == sym::saturating_add; - let (val, overflowed, _ty) = self.overflowing_binary_op(if is_add { - BinOp::Add - } else { - BinOp::Sub - }, l, r)?; + let (val, overflowed, _ty) = + self.overflowing_binary_op(if is_add { BinOp::Add } else { BinOp::Sub }, l, r)?; let val = if overflowed { let num_bits = l.layout.size.bits(); if l.layout.abi.is_signed() { @@ -198,24 +186,30 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // the fact that the operation has overflowed (if either is 0 no // overflow can occur) let first_term: u128 = self.force_bits(l.to_scalar()?, l.layout.size)?; - let first_term_positive = first_term & (1 << (num_bits-1)) == 0; + let first_term_positive = first_term & (1 << (num_bits - 1)) == 0; if first_term_positive { // Negative overflow not possible since the positive first term // can only increase an (in range) negative term for addition // or corresponding negated positive term for subtraction - Scalar::from_uint((1u128 << (num_bits - 1)) - 1, // max positive - Size::from_bits(num_bits)) + Scalar::from_uint( + (1u128 << (num_bits - 1)) - 1, // max positive + Size::from_bits(num_bits), + ) } else { // Positive overflow not possible for similar reason // max negative Scalar::from_uint(1u128 << (num_bits - 1), Size::from_bits(num_bits)) } - } else { // unsigned + } else { + // unsigned if is_add { // max unsigned - Scalar::from_uint(u128::max_value() >> (128 - num_bits), - Size::from_bits(num_bits)) - } else { // underflow to 0 + Scalar::from_uint( + u128::max_value() >> (128 - num_bits), + Size::from_bits(num_bits), + ) + } else { + // underflow to 0 Scalar::from_uint(0u128, Size::from_bits(num_bits)) } } @@ -230,7 +224,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let bin_op = match intrinsic_name { sym::unchecked_shl => BinOp::Shl, sym::unchecked_shr => BinOp::Shr, - _ => bug!("Already checked for int ops") + _ => bug!("Already checked for int ops"), }; let (val, overflowed, _ty) = self.overflowing_binary_op(bin_op, l, r)?; if overflowed { @@ -281,8 +275,12 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { if a == b && a != 0 { self.write_scalar(Scalar::from_int(0, isize_layout.size), dest)?; true - } else { false } - } else { false }; + } else { + false + } + } else { + false + }; if !done { // General case: we need two pointers. @@ -297,9 +295,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let usize_layout = self.layout_of(self.tcx.types.usize)?; let a_offset = ImmTy::from_uint(a.offset.bytes(), usize_layout); let b_offset = ImmTy::from_uint(b.offset.bytes(), usize_layout); - let (val, _overflowed, _ty) = self.overflowing_binary_op( - BinOp::Sub, a_offset, b_offset, - )?; + let (val, _overflowed, _ty) = + self.overflowing_binary_op(BinOp::Sub, a_offset, b_offset)?; let pointee_layout = self.layout_of(substs.type_at(0))?; let val = ImmTy::from_scalar(val, isize_layout); let size = ImmTy::from_int(pointee_layout.size.bytes(), isize_layout); @@ -318,7 +315,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { assert!( index < len, "Index `{}` must be in bounds of vector type `{}`: `[0, {})`", - index, e_ty, len + index, + e_ty, + len ); assert_eq!( input.layout, dest.layout, @@ -333,11 +332,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { for i in 0..len { let place = self.place_field(dest, i)?; - let value = if i == index { - elem - } else { - self.operand_field(input, i)? - }; + let value = if i == index { elem } else { self.operand_field(input, i)? }; self.copy_op(value, place)?; } } @@ -347,7 +342,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { assert!( index < len, "index `{}` is out-of-bounds of vector type `{}` with length `{}`", - index, e_ty, len + index, + e_ty, + len ); assert_eq!( e_ty, dest.layout.ty, @@ -369,47 +366,21 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Returns `true` if an intercept happened. pub fn hook_panic_fn( &mut self, + span: Span, instance: ty::Instance<'tcx>, args: &[OpTy<'tcx, M::PointerTag>], - _ret: Option<(PlaceTy<'tcx, M::PointerTag>, mir::BasicBlock)>, ) -> InterpResult<'tcx, bool> { let def_id = instance.def_id(); - if Some(def_id) == self.tcx.lang_items().panic_fn() { - // &'static str, &core::panic::Location { &'static str, u32, u32 } - assert!(args.len() == 2); + if Some(def_id) == self.tcx.lang_items().panic_fn() + || Some(def_id) == self.tcx.lang_items().begin_panic_fn() + { + // &'static str + assert!(args.len() == 1); let msg_place = self.deref_operand(args[0])?; let msg = Symbol::intern(self.read_str(msg_place)?); - - let location = self.deref_operand(args[1])?; - let (file, line, col) = ( - self.mplace_field(location, 0)?, - self.mplace_field(location, 1)?, - self.mplace_field(location, 2)?, - ); - - let file_place = self.deref_operand(file.into())?; - let file = Symbol::intern(self.read_str(file_place)?); - let line = self.read_scalar(line.into())?.to_u32()?; - let col = self.read_scalar(col.into())?.to_u32()?; - throw_panic!(Panic { msg, file, line, col }) - } else if Some(def_id) == self.tcx.lang_items().begin_panic_fn() { - assert!(args.len() == 2); - // &'static str, &(&'static str, u32, u32) - let msg = args[0]; - let place = self.deref_operand(args[1])?; - let (file, line, col) = ( - self.mplace_field(place, 0)?, - self.mplace_field(place, 1)?, - self.mplace_field(place, 2)?, - ); - - let msg_place = self.deref_operand(msg.into())?; - let msg = Symbol::intern(self.read_str(msg_place)?); - let file_place = self.deref_operand(file.into())?; - let file = Symbol::intern(self.read_str(file_place)?); - let line = self.read_scalar(line.into())?.to_u32()?; - let col = self.read_scalar(col.into())?.to_u32()?; + let span = self.find_closest_untracked_caller_location().unwrap_or(span); + let (file, line, col) = self.location_triple_for_span(span); throw_panic!(Panic { msg, file, line, col }) } else { return Ok(false); @@ -432,11 +403,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { if b_scalar == minus1 { throw_ub_format!("exact_div: result of dividing MIN by -1 cannot be represented") } else { - throw_ub_format!( - "exact_div: {} cannot be divided by {} without remainder", - a, - b, - ) + throw_ub_format!("exact_div: {} cannot be divided by {} without remainder", a, b,) } } self.binop_ignore_overflow(BinOp::Div, a, b, dest) diff --git a/src/librustc_mir/interpret/intrinsics/caller_location.rs b/src/librustc_mir/interpret/intrinsics/caller_location.rs index ec843ef7a4..0525108d2d 100644 --- a/src/librustc_mir/interpret/intrinsics/caller_location.rs +++ b/src/librustc_mir/interpret/intrinsics/caller_location.rs @@ -1,13 +1,17 @@ use rustc::middle::lang_items::PanicLocationLangItem; use rustc::ty::subst::Subst; +use rustc_span::{Span, Symbol}; use rustc_target::abi::LayoutOf; -use syntax_pos::{Symbol, Span}; -use crate::interpret::{Scalar, MemoryKind, MPlaceTy, intrinsics::{InterpCx, Machine}}; +use crate::interpret::{ + intrinsics::{InterpCx, Machine}, + MPlaceTy, MemoryKind, Scalar, +}; impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { - /// Walks up the callstack from the intrinsic's callsite, searching for the first frame which is - /// not `#[track_caller]`. + /// Walks up the callstack from the intrinsic's callsite, searching for the first callsite in a + /// frame which is not `#[track_caller]`. If the first frame found lacks `#[track_caller]`, then + /// `None` is returned and the callsite of the function invocation itself should be used. crate fn find_closest_untracked_caller_location(&self) -> Option { let mut caller_span = None; for next_caller in self.stack.iter().rev() { @@ -32,7 +36,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let col = Scalar::from_u32(col); // Allocate memory for `CallerLocation` struct. - let loc_ty = self.tcx.type_of(self.tcx.require_lang_item(PanicLocationLangItem, None)) + let loc_ty = self + .tcx + .type_of(self.tcx.require_lang_item(PanicLocationLangItem, None)) .subst(*self.tcx, self.tcx.mk_substs([self.tcx.lifetimes.re_static.into()].iter())); let loc_layout = self.layout_of(loc_ty).unwrap(); let location = self.allocate(loc_layout, MemoryKind::CallerLocation); @@ -48,13 +54,15 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { location } - pub fn alloc_caller_location_for_span( - &mut self, - span: Span, - ) -> MPlaceTy<'tcx, M::PointerTag> { + pub fn alloc_caller_location_for_span(&mut self, span: Span) -> MPlaceTy<'tcx, M::PointerTag> { + let (file, line, column) = self.location_triple_for_span(span); + self.alloc_caller_location(file, line, column) + } + + pub(super) fn location_triple_for_span(&self, span: Span) -> (Symbol, u32, u32) { let topmost = span.ctxt().outer_expn().expansion_cause().unwrap_or(span); let caller = self.tcx.sess.source_map().lookup_char_pos(topmost.lo()); - self.alloc_caller_location( + ( Symbol::intern(&caller.file.name.to_string()), caller.line as u32, caller.col_display as u32 + 1, diff --git a/src/librustc_mir/interpret/intrinsics/type_name.rs b/src/librustc_mir/interpret/intrinsics/type_name.rs index f1f9fac08c..cd8bf7085d 100644 --- a/src/librustc_mir/interpret/intrinsics/type_name.rs +++ b/src/librustc_mir/interpret/intrinsics/type_name.rs @@ -1,13 +1,13 @@ +use rustc::hir::map::{DefPathData, DisambiguatedDefPathData}; +use rustc::mir::interpret::Allocation; use rustc::ty::{ - TyCtxt, Ty, - subst::{GenericArgKind, GenericArg}, - print::{Printer, PrettyPrinter, Print}, self, + print::{PrettyPrinter, Print, Printer}, + subst::{GenericArg, GenericArgKind}, + Ty, TyCtxt, }; -use rustc::hir::map::{DefPathData, DisambiguatedDefPathData}; -use rustc::hir::def_id::CrateNum; +use rustc_hir::def_id::CrateNum; use std::fmt::Write; -use rustc::mir::interpret::Allocation; struct AbsolutePathPrinter<'tcx> { tcx: TyCtxt<'tcx>, @@ -34,7 +34,7 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> { fn print_type(mut self, ty: Ty<'tcx>) -> Result { match ty.kind { // Types without identity. - | ty::Bool + ty::Bool | ty::Char | ty::Int(_) | ty::Uint(_) @@ -47,22 +47,16 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> { | ty::FnPtr(_) | ty::Never | ty::Tuple(_) - | ty::Dynamic(_, _) - => self.pretty_print_type(ty), + | ty::Dynamic(_, _) => self.pretty_print_type(ty), // Placeholders (all printed as `_` to uniformize them). - | ty::Param(_) - | ty::Bound(..) - | ty::Placeholder(_) - | ty::Infer(_) - | ty::Error - => { + ty::Param(_) | ty::Bound(..) | ty::Placeholder(_) | ty::Infer(_) | ty::Error => { write!(self, "_")?; Ok(self) } // Types with identity (print the module path). - | ty::Adt(&ty::AdtDef { did: def_id, .. }, substs) + ty::Adt(&ty::AdtDef { did: def_id, .. }, substs) | ty::FnDef(def_id, substs) | ty::Opaque(def_id, substs) | ty::Projection(ty::ProjectionTy { item_def_id: def_id, substs }) @@ -71,18 +65,12 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> { | ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs), ty::Foreign(def_id) => self.print_def_path(def_id, &[]), - ty::GeneratorWitness(_) => { - bug!("type_name: unexpected `GeneratorWitness`") - } + ty::GeneratorWitness(_) => bug!("type_name: unexpected `GeneratorWitness`"), } } - fn print_const( - self, - _: &'tcx ty::Const<'tcx>, - ) -> Result { - // don't print constants to the user - Ok(self) + fn print_const(self, ct: &'tcx ty::Const<'tcx>) -> Result { + self.pretty_print_const(ct, false) } fn print_dyn_existential( @@ -158,11 +146,9 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> { args: &[GenericArg<'tcx>], ) -> Result { self = print_prefix(self)?; - let args = args.iter().cloned().filter(|arg| { - match arg.unpack() { - GenericArgKind::Lifetime(_) => false, - _ => true, - } + let args = args.iter().cloned().filter(|arg| match arg.unpack() { + GenericArgKind::Lifetime(_) => false, + _ => true, }); if args.clone().next().is_some() { self.generic_delimiters(|cx| cx.comma_sep(args)) @@ -172,10 +158,7 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> { } } impl PrettyPrinter<'tcx> for AbsolutePathPrinter<'tcx> { - fn region_should_not_be_omitted( - &self, - _region: ty::Region<'_>, - ) -> bool { + fn region_should_not_be_omitted(&self, _region: ty::Region<'_>) -> bool { false } fn comma_sep(mut self, mut elems: impl Iterator) -> Result @@ -213,10 +196,7 @@ impl Write for AbsolutePathPrinter<'_> { } /// Directly returns an `Allocation` containing an absolute path representation of the given type. -crate fn alloc_type_name<'tcx>( - tcx: TyCtxt<'tcx>, - ty: Ty<'tcx> -) -> &'tcx Allocation { +crate fn alloc_type_name<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> &'tcx Allocation { let path = AbsolutePathPrinter { tcx, path: String::new() }.print_type(ty).unwrap().path; let alloc = Allocation::from_byte_aligned_bytes(path.into_bytes()); tcx.intern_const_alloc(alloc) diff --git a/src/librustc_mir/interpret/machine.rs b/src/librustc_mir/interpret/machine.rs index 74206ad287..3309e9b9b6 100644 --- a/src/librustc_mir/interpret/machine.rs +++ b/src/librustc_mir/interpret/machine.rs @@ -5,15 +5,14 @@ use std::borrow::{Borrow, Cow}; use std::hash::Hash; -use rustc::hir::def_id::DefId; use rustc::mir; use rustc::ty::{self, Ty, TyCtxt}; -use syntax_pos::Span; +use rustc_hir::def_id::DefId; +use rustc_span::Span; use super::{ - Allocation, AllocId, InterpResult, Scalar, AllocationExtra, AssertMessage, - InterpCx, PlaceTy, OpTy, ImmTy, MemoryKind, Pointer, Memory, - Frame, Operand, + AllocId, Allocation, AllocationExtra, AssertMessage, Frame, ImmTy, InterpCx, InterpResult, + Memory, MemoryKind, OpTy, Operand, PlaceTy, Pointer, Scalar, }; /// Data returned by Machine::stack_pop, @@ -28,7 +27,7 @@ pub enum StackPopInfo { /// Indicates that we should stop unwinding, /// as we've reached a catch frame - StopUnwinding + StopUnwinding, } /// Whether this kind of memory is allowed to leak @@ -42,14 +41,16 @@ pub trait AllocMap { /// Deliberately takes `&mut` because that is sufficient, and some implementations /// can be more efficient then (using `RefCell::get_mut`). fn contains_key(&mut self, k: &Q) -> bool - where K: Borrow; + where + K: Borrow; /// Inserts a new entry into the map. fn insert(&mut self, k: K, v: V) -> Option; /// Removes an entry from the map. fn remove(&mut self, k: &Q) -> Option - where K: Borrow; + where + K: Borrow; /// Returns data based the keys and values in the map. fn filter_map_collect(&self, f: impl FnMut(&K, &V) -> Option) -> Vec; @@ -57,20 +58,12 @@ pub trait AllocMap { /// Returns a reference to entry `k`. If no such entry exists, call /// `vacant` and either forward its error, or add its result to the map /// and return a reference to *that*. - fn get_or( - &self, - k: K, - vacant: impl FnOnce() -> Result - ) -> Result<&V, E>; + fn get_or(&self, k: K, vacant: impl FnOnce() -> Result) -> Result<&V, E>; /// Returns a mutable reference to entry `k`. If no such entry exists, call /// `vacant` and either forward its error, or add its result to the map /// and return a reference to *that*. - fn get_mut_or( - &mut self, - k: K, - vacant: impl FnOnce() -> Result - ) -> Result<&mut V, E>; + fn get_mut_or(&mut self, k: K, vacant: impl FnOnce() -> Result) -> Result<&mut V, E>; /// Read-only lookup. fn get(&self, k: K) -> Option<&V> { @@ -111,13 +104,11 @@ pub trait Machine<'mir, 'tcx>: Sized { type AllocExtra: AllocationExtra + 'static; /// Memory's allocation map - type MemoryMap: - AllocMap< + type MemoryMap: AllocMap< AllocId, - (MemoryKind, Allocation) - > + - Default + - Clone; + (MemoryKind, Allocation), + > + Default + + Clone; /// The memory kind to use for copied statics -- or None if statics should not be mutated /// and thus any such attempt will cause a `ModifiedStatic` error to be raised. @@ -148,6 +139,7 @@ pub trait Machine<'mir, 'tcx>: Sized { /// was used. fn find_mir_or_eval_fn( ecx: &mut InterpCx<'mir, 'tcx, Self>, + span: Span, instance: ty::Instance<'tcx>, args: &[OpTy<'tcx, Self::PointerTag>], ret: Option<(PlaceTy<'tcx, Self::PointerTag>, mir::BasicBlock)>, @@ -220,8 +212,9 @@ pub trait Machine<'mir, 'tcx>: Sized { frame.locals[local].access() } - /// Called before a `StaticKind::Static` value is accessed. + /// Called before a `Static` value is accessed. fn before_access_static( + _memory_extra: &Self::MemoryExtra, _allocation: &Allocation, ) -> InterpResult<'tcx> { Ok(()) @@ -254,10 +247,7 @@ pub trait Machine<'mir, 'tcx>: Sized { /// Return the "base" tag for the given *static* allocation: the one that is used for direct /// accesses to this static/const/fn allocation. If `id` is not a static allocation, /// this will return an unusable tag (i.e., accesses will be UB)! - fn tag_static_base_pointer( - memory_extra: &Self::MemoryExtra, - id: AllocId, - ) -> Self::PointerTag; + fn tag_static_base_pointer(memory_extra: &Self::MemoryExtra, id: AllocId) -> Self::PointerTag; /// Executes a retagging operation #[inline] @@ -276,7 +266,7 @@ pub trait Machine<'mir, 'tcx>: Sized { fn stack_pop( _ecx: &mut InterpCx<'mir, 'tcx, Self>, _extra: Self::FrameExtra, - _unwinding: bool + _unwinding: bool, ) -> InterpResult<'tcx, StackPopInfo> { // By default, we do not support unwinding from panics Ok(StackPopInfo::Normal) @@ -290,7 +280,8 @@ pub trait Machine<'mir, 'tcx>: Sized { err_unsup!(InvalidNullPointerUsage) } else { err_unsup!(ReadBytesAsPointer) - }).into()) + }) + .into()) } fn ptr_to_int( diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index 8f177ad122..0bcdf9ae3c 100644 --- a/src/librustc_mir/interpret/memory.rs +++ b/src/librustc_mir/interpret/memory.rs @@ -6,20 +6,19 @@ //! integer. It is crucial that these operations call `check_align` *before* //! short-circuiting the empty case! +use std::borrow::Cow; use std::collections::VecDeque; use std::ptr; -use std::borrow::Cow; -use rustc::ty::{self, Instance, ParamEnv, query::TyCtxtAt}; -use rustc::ty::layout::{Align, TargetDataLayout, Size, HasDataLayout}; -use rustc_data_structures::fx::{FxHashSet, FxHashMap}; +use rustc::ty::layout::{Align, HasDataLayout, Size, TargetDataLayout}; +use rustc::ty::{self, query::TyCtxtAt, Instance, ParamEnv}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use syntax::ast::Mutability; use super::{ - Pointer, AllocId, Allocation, GlobalId, AllocationExtra, - InterpResult, Scalar, GlobalAlloc, PointerArithmetic, - Machine, AllocMap, MayLeak, ErrorHandled, CheckInAllocMsg, + AllocId, AllocMap, Allocation, AllocationExtra, CheckInAllocMsg, ErrorHandled, GlobalAlloc, + GlobalId, InterpResult, Machine, MayLeak, Pointer, PointerArithmetic, Scalar, }; #[derive(Debug, PartialEq, Copy, Clone)] @@ -41,7 +40,7 @@ impl MayLeak for MemoryKind { MemoryKind::Stack => false, MemoryKind::Vtable => true, MemoryKind::CallerLocation => true, - MemoryKind::Machine(k) => k.may_leak() + MemoryKind::Machine(k) => k.may_leak(), } } } @@ -67,11 +66,10 @@ pub enum FnVal<'tcx, Other> { impl<'tcx, Other> FnVal<'tcx, Other> { pub fn as_instance(self) -> InterpResult<'tcx, Instance<'tcx>> { match self { - FnVal::Instance(instance) => - Ok(instance), - FnVal::Other(_) => throw_unsup_format!( - "'foreign' function pointers are not supported in this context" - ), + FnVal::Instance(instance) => Ok(instance), + FnVal::Other(_) => { + throw_unsup_format!("'foreign' function pointers are not supported in this context") + } } } } @@ -118,7 +116,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> HasDataLayout for Memory<'mir, 'tcx, M> // carefully copy only the reachable parts. impl<'mir, 'tcx, M> Clone for Memory<'mir, 'tcx, M> where - M: Machine<'mir, 'tcx, PointerTag = (), AllocExtra = (), MemoryExtra = ()>, + M: Machine<'mir, 'tcx, PointerTag = (), AllocExtra = ()>, + M::MemoryExtra: Copy, M::MemoryMap: AllocMap, Allocation)>, { fn clone(&self) -> Self { @@ -126,7 +125,7 @@ where alloc_map: self.alloc_map.clone(), extra_fn_ptr_map: self.extra_fn_ptr_map.clone(), dead_alloc_map: self.dead_alloc_map.clone(), - extra: (), + extra: self.extra, tcx: self.tcx, } } @@ -157,8 +156,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { pub fn create_fn_alloc( &mut self, fn_val: FnVal<'tcx, M::ExtraFnVal>, - ) -> Pointer - { + ) -> Pointer { let id = match fn_val { FnVal::Instance(instance) => self.tcx.alloc_map.lock().create_fn_alloc(instance), FnVal::Other(extra) => { @@ -197,8 +195,11 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { kind: MemoryKind, ) -> Pointer { let id = self.tcx.alloc_map.lock().reserve(); - debug_assert_ne!(Some(kind), M::STATIC_KIND.map(MemoryKind::Machine), - "dynamically allocating static memory"); + debug_assert_ne!( + Some(kind), + M::STATIC_KIND.map(MemoryKind::Machine), + "dynamically allocating static memory" + ); let (alloc, tag) = M::init_allocation_extra(&self.extra, id, Cow::Owned(alloc), Some(kind)); self.alloc_map.insert(id, (kind, alloc.into_owned())); Pointer::from(id).with_tag(tag) @@ -223,12 +224,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { Some((size, _align)) => size, None => self.get_raw(ptr.alloc_id)?.size, }; - self.copy( - ptr, - new_ptr, - old_size.min(new_size), - /*nonoverlapping*/ true, - )?; + self.copy(ptr, new_ptr, old_size.min(new_size), /*nonoverlapping*/ true)?; self.deallocate(ptr, old_size_and_align, kind)?; Ok(new_ptr) @@ -293,10 +289,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { AllocationExtra::memory_deallocated(&mut alloc, ptr, size)?; // Don't forget to remember size and align of this now-dead allocation - let old = self.dead_alloc_map.insert( - ptr.alloc_id, - (alloc.size, alloc.align) - ); + let old = self.dead_alloc_map.insert(ptr.alloc_id, (alloc.size, alloc.align)); if old.is_some() { bug!("Nothing can be deallocated twice"); } @@ -391,10 +384,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { // got picked we might be aligned even if this check fails. // We instead have to fall back to converting to an integer and checking // the "real" alignment. - throw_unsup!(AlignmentCheckFailed { - has: alloc_align, - required: align, - }); + throw_unsup!(AlignmentCheckFailed { has: alloc_align, required: align }); } check_offset_align(ptr.offset.bytes(), align)?; } @@ -407,11 +397,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } /// Test if the pointer might be NULL. - pub fn ptr_may_be_null( - &self, - ptr: Pointer, - ) -> bool { - let (size, _align) = self.get_size_and_align(ptr.alloc_id, AllocCheck::MaybeDead) + pub fn ptr_may_be_null(&self, ptr: Pointer) -> bool { + let (size, _align) = self + .get_size_and_align(ptr.alloc_id, AllocCheck::MaybeDead) .expect("alloc info with MaybeDead cannot fail"); ptr.check_inbounds_alloc(size, CheckInAllocMsg::NullPointerTest).is_err() } @@ -440,12 +428,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { ) -> InterpResult<'tcx, Cow<'tcx, Allocation>> { let alloc = tcx.alloc_map.lock().get(id); let alloc = match alloc { - Some(GlobalAlloc::Memory(mem)) => - Cow::Borrowed(mem), - Some(GlobalAlloc::Function(..)) => - throw_unsup!(DerefFunctionPointer), - None => - throw_unsup!(DanglingPointerDeref), + Some(GlobalAlloc::Memory(mem)) => Cow::Borrowed(mem), + Some(GlobalAlloc::Function(..)) => throw_unsup!(DerefFunctionPointer), + None => throw_unsup!(DanglingPointerDeref), Some(GlobalAlloc::Static(def_id)) => { // We got a "lazy" static that has not been computed yet. if tcx.is_foreign_item(def_id) { @@ -454,29 +439,24 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } else { trace!("static_alloc: Need to compute {:?}", def_id); let instance = Instance::mono(tcx.tcx, def_id); - let gid = GlobalId { - instance, - promoted: None, - }; + let gid = GlobalId { instance, promoted: None }; // use the raw query here to break validation cycles. Later uses of the static // will call the full query anyway - let raw_const = tcx.const_eval_raw(ty::ParamEnv::reveal_all().and(gid)) - .map_err(|err| { + let raw_const = + tcx.const_eval_raw(ty::ParamEnv::reveal_all().and(gid)).map_err(|err| { // no need to report anything, the const_eval call takes care of that // for statics assert!(tcx.is_static(def_id)); match err { - ErrorHandled::Reported => - err_inval!(ReferencedConstant), - ErrorHandled::TooGeneric => - err_inval!(TooGeneric), + ErrorHandled::Reported => err_inval!(ReferencedConstant), + ErrorHandled::TooGeneric => err_inval!(TooGeneric), } })?; // Make sure we use the ID of the resolved memory, not the lazy one! let id = raw_const.alloc_id; let allocation = tcx.alloc_map.lock().unwrap_memory(id); - M::before_access_static(allocation)?; + M::before_access_static(memory_extra, allocation)?; Cow::Borrowed(allocation) } } @@ -514,7 +494,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { // Need to put it into the map and return a ref to that let kind = M::STATIC_KIND.expect( "I got an owned allocation that I have to copy but the machine does \ - not expect that to happen" + not expect that to happen", ); Ok((MemoryKind::Machine(kind), alloc)) } @@ -523,7 +503,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { // Now unpack that funny error type match a { Ok(a) => Ok(&a.1), - Err(a) => a + Err(a) => a, } } @@ -539,7 +519,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { // Need to make a copy, even if `get_static_alloc` is able // to give us a cheap reference. let alloc = Self::get_static_alloc(memory_extra, tcx, id)?; - if alloc.mutability == Mutability::Immutable { + if alloc.mutability == Mutability::Not { throw_unsup!(ModifiedConstantMemory) } match M::STATIC_KIND { @@ -553,7 +533,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { Err(e) => Err(e), Ok(a) => { let a = &mut a.1; - if a.mutability == Mutability::Immutable { + if a.mutability == Mutability::Not { throw_unsup!(ModifiedConstantMemory) } Ok(a) @@ -599,23 +579,26 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { let ty = self.tcx.type_of(did); let layout = self.tcx.layout_of(ParamEnv::empty().and(ty)).unwrap(); Ok((layout.size, layout.align.abi)) - }, - Some(GlobalAlloc::Memory(alloc)) => + } + Some(GlobalAlloc::Memory(alloc)) => { // Need to duplicate the logic here, because the global allocations have // different associated types than the interpreter-local ones. - Ok((alloc.size, alloc.align)), - Some(GlobalAlloc::Function(_)) => - bug!("We already checked function pointers above"), + Ok((alloc.size, alloc.align)) + } + Some(GlobalAlloc::Function(_)) => bug!("We already checked function pointers above"), // The rest must be dead. - None => if let AllocCheck::MaybeDead = liveness { - // Deallocated pointers are allowed, we should be able to find - // them in the map. - Ok(*self.dead_alloc_map.get(&id) - .expect("deallocated pointers should all be recorded in \ - `dead_alloc_map`")) - } else { - throw_unsup!(DanglingPointerDeref) - }, + None => { + if let AllocCheck::MaybeDead = liveness { + // Deallocated pointers are allowed, we should be able to find + // them in the map. + Ok(*self.dead_alloc_map.get(&id).expect( + "deallocated pointers should all be recorded in \ + `dead_alloc_map`", + )) + } else { + throw_unsup!(DanglingPointerDeref) + } + } } } @@ -643,7 +626,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } pub fn mark_immutable(&mut self, id: AllocId) -> InterpResult<'tcx> { - self.get_raw_mut(id)?.mutability = Mutability::Immutable; + self.get_raw_mut(id)?.mutability = Mutability::Not; Ok(()) } @@ -681,7 +664,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { // Checked definedness (and thus range) and relocations. This access also doesn't // influence interpreter execution but is only for debugging. - let bytes = alloc.inspect_with_undef_and_ptr_outside_interpreter(i..i+1); + let bytes = alloc.inspect_with_undef_and_ptr_outside_interpreter(i..i + 1); write!(msg, "{:02x} ", bytes[0]).unwrap(); } else { msg.push_str("__ "); @@ -735,17 +718,23 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { MemoryKind::Machine(m) => format!(" ({:?})", m), }; self.dump_alloc_helper( - &mut allocs_seen, &mut allocs_to_print, - msg, alloc, extra + &mut allocs_seen, + &mut allocs_to_print, + msg, + alloc, + extra, ); - }, + } Err(()) => { // static alloc? match self.tcx.alloc_map.lock().get(id) { Some(GlobalAlloc::Memory(alloc)) => { self.dump_alloc_helper( - &mut allocs_seen, &mut allocs_to_print, - msg, alloc, " (immutable)".to_owned() + &mut allocs_seen, + &mut allocs_to_print, + msg, + alloc, + " (immutable)".to_owned(), ); } Some(GlobalAlloc::Function(func)) => { @@ -758,16 +747,15 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { eprintln!("{} (deallocated)", msg); } } - }, + } }; - } } pub fn leak_report(&self) -> usize { - let leaks: Vec<_> = self.alloc_map.filter_map_collect(|&id, &(kind, _)| { - if kind.may_leak() { None } else { Some(id) } - }); + let leaks: Vec<_> = self + .alloc_map + .filter_map_collect(|&id, &(kind, _)| if kind.may_leak() { None } else { Some(id) }); let n = leaks.len(); if n > 0 { eprintln!("### LEAK REPORT ###"); @@ -787,11 +775,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { /// Reads the given number of bytes from memory. Returns them as a slice. /// /// Performs appropriate bounds checks. - pub fn read_bytes( - &self, - ptr: Scalar, - size: Size, - ) -> InterpResult<'tcx, &[u8]> { + pub fn read_bytes(&self, ptr: Scalar, size: Size) -> InterpResult<'tcx, &[u8]> { let ptr = match self.check_ptr_access(ptr, size, Align::from_bytes(1).unwrap())? { Some(ptr) => ptr, None => return Ok(&[]), // zero-sized access @@ -813,9 +797,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { pub fn write_bytes( &mut self, ptr: Scalar, - src: impl IntoIterator, - ) -> InterpResult<'tcx> - { + src: impl IntoIterator, + ) -> InterpResult<'tcx> { let src = src.into_iter(); let size = Size::from_bytes(src.size_hint().0 as u64); // `write_bytes` checks that this lower bound matches the upper bound matches reality. @@ -852,18 +835,43 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { // since we don't want to keep any relocations at the target. // (`get_bytes_with_undef_and_ptr` below checks that there are no // relocations overlapping the edges; those would not be handled correctly). - let relocations = self.get_raw(src.alloc_id)? - .prepare_relocation_copy(self, src, size, dest, length); + let relocations = + self.get_raw(src.alloc_id)?.prepare_relocation_copy(self, src, size, dest, length); let tcx = self.tcx.tcx; + // The bits have to be saved locally before writing to dest in case src and dest overlap. + assert_eq!(size.bytes() as usize as u64, size.bytes()); + // This checks relocation edges on the src. - let src_bytes = self.get_raw(src.alloc_id)? - .get_bytes_with_undef_and_ptr(&tcx, src, size)? - .as_ptr(); - let dest_bytes = self.get_raw_mut(dest.alloc_id)? - .get_bytes_mut(&tcx, dest, size * length)? - .as_mut_ptr(); + let src_bytes = + self.get_raw(src.alloc_id)?.get_bytes_with_undef_and_ptr(&tcx, src, size)?.as_ptr(); + let dest_bytes = + self.get_raw_mut(dest.alloc_id)?.get_bytes_mut(&tcx, dest, size * length)?; + + // If `dest_bytes` is empty we just optimize to not run anything for zsts. + // See #67539 + if dest_bytes.is_empty() { + return Ok(()); + } + + let dest_bytes = dest_bytes.as_mut_ptr(); + + // Prepare a copy of the undef mask. + let compressed = self.get_raw(src.alloc_id)?.compress_undef_range(src, size); + + if compressed.all_bytes_undef() { + // Fast path: If all bytes are `undef` then there is nothing to copy. The target range + // is marked as undef but we otherwise omit changing the byte representation which may + // be arbitrary for undef bytes. + // This also avoids writing to the target bytes so that the backing allocation is never + // touched if the bytes stay undef for the whole interpreter execution. On contemporary + // operating system this can avoid physically allocating the page. + let dest_alloc = self.get_raw_mut(dest.alloc_id)?; + dest_alloc.mark_definedness(dest, size * length, false); + dest_alloc.mark_relocation_range(relocations); + return Ok(()); + } // SAFE: The above indexing would have panicked if there weren't at least `size` bytes // behind `src` and `dest`. Also, we use the overlapping-safe `ptr::copy` if `src` and @@ -874,31 +882,39 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { assert_eq!(size.bytes() as usize as u64, size.bytes()); if src.alloc_id == dest.alloc_id { if nonoverlapping { - if (src.offset <= dest.offset && src.offset + size > dest.offset) || - (dest.offset <= src.offset && dest.offset + size > src.offset) + if (src.offset <= dest.offset && src.offset + size > dest.offset) + || (dest.offset <= src.offset && dest.offset + size > src.offset) { - throw_ub_format!( - "copy_nonoverlapping called on overlapping ranges" - ) + throw_ub_format!("copy_nonoverlapping called on overlapping ranges") } } for i in 0..length { - ptr::copy(src_bytes, - dest_bytes.offset((size.bytes() * i) as isize), - size.bytes() as usize); + ptr::copy( + src_bytes, + dest_bytes.offset((size.bytes() * i) as isize), + size.bytes() as usize, + ); } } else { for i in 0..length { - ptr::copy_nonoverlapping(src_bytes, - dest_bytes.offset((size.bytes() * i) as isize), - size.bytes() as usize); + ptr::copy_nonoverlapping( + src_bytes, + dest_bytes.offset((size.bytes() * i) as isize), + size.bytes() as usize, + ); } } } - // copy definedness to the destination - self.copy_undef_mask(src, dest, size, length)?; + // now fill in all the data + self.get_raw_mut(dest.alloc_id)?.mark_compressed_undef_range( + &compressed, + dest, + size, + length, + ); + // copy the relocations to the destination self.get_raw_mut(dest.alloc_id)?.mark_relocation_range(relocations); @@ -906,47 +922,26 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } } -/// Undefined bytes +/// Machine pointer introspection. impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { - // FIXME: Add a fast version for the common, nonoverlapping case - fn copy_undef_mask( - &mut self, - src: Pointer, - dest: Pointer, - size: Size, - repeat: u64, - ) -> InterpResult<'tcx> { - // The bits have to be saved locally before writing to dest in case src and dest overlap. - assert_eq!(size.bytes() as usize as u64, size.bytes()); - - let src_alloc = self.get_raw(src.alloc_id)?; - let compressed = src_alloc.compress_undef_range(src, size); - - // now fill in all the data - let dest_allocation = self.get_raw_mut(dest.alloc_id)?; - dest_allocation.mark_compressed_undef_range(&compressed, dest, size, repeat); - - Ok(()) - } - pub fn force_ptr( &self, scalar: Scalar, ) -> InterpResult<'tcx, Pointer> { match scalar { Scalar::Ptr(ptr) => Ok(ptr), - _ => M::int_to_ptr(&self, scalar.to_machine_usize(self)?) + _ => M::int_to_ptr(&self, scalar.to_machine_usize(self)?), } } pub fn force_bits( &self, scalar: Scalar, - size: Size + size: Size, ) -> InterpResult<'tcx, u128> { match scalar.to_bits_or_ptr(size, self) { Ok(bits) => Ok(bits), - Err(ptr) => Ok(M::ptr_to_int(&self, ptr)? as u128) + Err(ptr) => Ok(M::ptr_to_int(&self, ptr)? as u128), } } } diff --git a/src/librustc_mir/interpret/mod.rs b/src/librustc_mir/interpret/mod.rs index 520bd434fa..a519f38e71 100644 --- a/src/librustc_mir/interpret/mod.rs +++ b/src/librustc_mir/interpret/mod.rs @@ -2,38 +2,36 @@ mod cast; mod eval_context; -mod place; -mod operand; +mod intern; +mod intrinsics; mod machine; mod memory; +mod operand; mod operator; +mod place; pub(crate) mod snapshot; // for const_eval mod step; mod terminator; mod traits; mod validity; -mod intrinsics; mod visitor; -mod intern; pub use rustc::mir::interpret::*; // have all the `interpret` symbols in one place: here -pub use self::eval_context::{ - InterpCx, Frame, StackPopCleanup, LocalState, LocalValue, -}; +pub use self::eval_context::{Frame, InterpCx, LocalState, LocalValue, StackPopCleanup}; -pub use self::place::{Place, PlaceTy, MemPlace, MPlaceTy}; +pub use self::place::{MPlaceTy, MemPlace, MemPlaceMeta, Place, PlaceTy}; -pub use self::memory::{Memory, MemoryKind, AllocCheck, FnVal}; +pub use self::memory::{AllocCheck, FnVal, Memory, MemoryKind}; -pub use self::machine::{Machine, AllocMap, MayLeak, StackPopInfo}; +pub use self::machine::{AllocMap, Machine, MayLeak, StackPopInfo}; -pub use self::operand::{ScalarMaybeUndef, Immediate, ImmTy, Operand, OpTy}; +pub use self::operand::{ImmTy, Immediate, OpTy, Operand, ScalarMaybeUndef}; -pub use self::visitor::{ValueVisitor, MutValueVisitor}; +pub use self::visitor::{MutValueVisitor, ValueVisitor}; pub use self::validity::RefTracking; -pub use self::intern::intern_const_alloc_recursive; +pub use self::intern::{intern_const_alloc_recursive, InternKind}; crate use self::intrinsics::eval_nullary_intrinsic; diff --git a/src/librustc_mir/interpret/operand.rs b/src/librustc_mir/interpret/operand.rs index 48e7193ec3..d1c08da6cb 100644 --- a/src/librustc_mir/interpret/operand.rs +++ b/src/librustc_mir/interpret/operand.rs @@ -1,23 +1,18 @@ //! Functions concerning immediate values and operands, and reading from operands. //! All high-level functions to read from memory work on operands as sources. -use std::convert::{TryInto, TryFrom}; +use std::convert::{TryFrom, TryInto}; -use rustc::{mir, ty}; use rustc::ty::layout::{ - self, Size, LayoutOf, TyLayout, HasDataLayout, IntegerExt, PrimitiveExt, VariantIdx, + self, HasDataLayout, IntegerExt, LayoutOf, PrimitiveExt, Size, TyLayout, VariantIdx, }; +use rustc::{mir, ty}; +use super::{InterpCx, MPlaceTy, Machine, MemPlace, Place, PlaceTy}; +pub use rustc::mir::interpret::ScalarMaybeUndef; use rustc::mir::interpret::{ - GlobalId, AllocId, - ConstValue, Pointer, Scalar, - InterpResult, sign_extend, truncate, + sign_extend, truncate, AllocId, ConstValue, GlobalId, InterpResult, Pointer, Scalar, }; -use super::{ - InterpCx, Machine, - MemPlace, MPlaceTy, PlaceTy, Place, -}; -pub use rustc::mir::interpret::ScalarMaybeUndef; use rustc_macros::HashStable; use syntax::ast; @@ -29,7 +24,7 @@ use syntax::ast; /// In particular, thanks to `ScalarPair`, arithmetic operations and casts can be entirely /// defined on `Immediate`, and do not have to work with a `Place`. #[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable, Hash)] -pub enum Immediate { +pub enum Immediate { Scalar(ScalarMaybeUndef), ScalarPair(ScalarMaybeUndef, ScalarMaybeUndef), } @@ -56,11 +51,7 @@ impl From> for Immediate { } impl<'tcx, Tag> Immediate { - pub fn new_slice( - val: Scalar, - len: u64, - cx: &impl HasDataLayout - ) -> Self { + pub fn new_slice(val: Scalar, len: u64, cx: &impl HasDataLayout) -> Self { Immediate::ScalarPair( val.into(), Scalar::from_uint(len, cx.data_layout().pointer_size).into(), @@ -88,7 +79,7 @@ impl<'tcx, Tag> Immediate { pub fn to_scalar_pair(self) -> InterpResult<'tcx, (Scalar, Scalar)> { match self { Immediate::Scalar(..) => bug!("Got a thin pointer where a scalar pair was expected"), - Immediate::ScalarPair(a, b) => Ok((a.not_undef()?, b.not_undef()?)) + Immediate::ScalarPair(a, b) => Ok((a.not_undef()?, b.not_undef()?)), } } } @@ -96,7 +87,7 @@ impl<'tcx, Tag> Immediate { // ScalarPair needs a type to interpret, so we often have an immediate and a type together // as input for binary and cast operations. #[derive(Copy, Clone, Debug)] -pub struct ImmTy<'tcx, Tag=()> { +pub struct ImmTy<'tcx, Tag = ()> { pub(crate) imm: Immediate, pub layout: TyLayout<'tcx>, } @@ -108,27 +99,35 @@ impl std::fmt::Display for ImmTy<'tcx, Tag> { Immediate::Scalar(ScalarMaybeUndef::Scalar(s)) => match s.to_bits(self.layout.size) { Ok(s) => { match self.layout.ty.kind { - ty::Int(_) => return write!( - fmt, "{}", - super::sign_extend(s, self.layout.size) as i128, - ), + ty::Int(_) => { + return write!( + fmt, + "{}", + super::sign_extend(s, self.layout.size) as i128, + ); + } ty::Uint(_) => return write!(fmt, "{}", s), ty::Bool if s == 0 => return fmt.write_str("false"), ty::Bool if s == 1 => return fmt.write_str("true"), - ty::Char => if let Some(c) = - u32::try_from(s).ok().and_then(std::char::from_u32) { - return write!(fmt, "{}", c); - }, - ty::Float(ast::FloatTy::F32) => if let Ok(u) = u32::try_from(s) { - return write!(fmt, "{}", f32::from_bits(u)); - }, - ty::Float(ast::FloatTy::F64) => if let Ok(u) = u64::try_from(s) { - return write!(fmt, "{}", f64::from_bits(u)); - }, - _ => {}, + ty::Char => { + if let Some(c) = u32::try_from(s).ok().and_then(std::char::from_u32) { + return write!(fmt, "{}", c); + } + } + ty::Float(ast::FloatTy::F32) => { + if let Ok(u) = u32::try_from(s) { + return write!(fmt, "{}", f32::from_bits(u)); + } + } + ty::Float(ast::FloatTy::F64) => { + if let Ok(u) = u64::try_from(s) { + return write!(fmt, "{}", f64::from_bits(u)); + } + } + _ => {} } write!(fmt, "{:x}", s) - }, + } Err(_) => fmt.write_str("{pointer}"), }, Immediate::Scalar(ScalarMaybeUndef::Undef) => fmt.write_str("{undef}"), @@ -149,37 +148,13 @@ impl<'tcx, Tag> ::std::ops::Deref for ImmTy<'tcx, Tag> { /// or still in memory. The latter is an optimization, to delay reading that chunk of /// memory and to avoid having to store arbitrary-sized data here. #[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable, Hash)] -pub enum Operand { +pub enum Operand { Immediate(Immediate), Indirect(MemPlace), } -impl Operand { - #[inline] - pub fn assert_mem_place(self) -> MemPlace - where Tag: ::std::fmt::Debug - { - match self { - Operand::Indirect(mplace) => mplace, - _ => bug!("assert_mem_place: expected Operand::Indirect, got {:?}", self), - - } - } - - #[inline] - pub fn assert_immediate(self) -> Immediate - where Tag: ::std::fmt::Debug - { - match self { - Operand::Immediate(imm) => imm, - _ => bug!("assert_immediate: expected Operand::Immediate, got {:?}", self), - - } - } -} - #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] -pub struct OpTy<'tcx, Tag=()> { +pub struct OpTy<'tcx, Tag = ()> { op: Operand, // Keep this private; it helps enforce invariants. pub layout: TyLayout<'tcx>, } @@ -195,20 +170,14 @@ impl<'tcx, Tag> ::std::ops::Deref for OpTy<'tcx, Tag> { impl<'tcx, Tag: Copy> From> for OpTy<'tcx, Tag> { #[inline(always)] fn from(mplace: MPlaceTy<'tcx, Tag>) -> Self { - OpTy { - op: Operand::Indirect(*mplace), - layout: mplace.layout - } + OpTy { op: Operand::Indirect(*mplace), layout: mplace.layout } } } impl<'tcx, Tag> From> for OpTy<'tcx, Tag> { #[inline(always)] fn from(val: ImmTy<'tcx, Tag>) -> Self { - OpTy { - op: Operand::Immediate(val.imm), - layout: val.layout - } + OpTy { op: Operand::Immediate(val.imm), layout: val.layout } } } @@ -218,11 +187,20 @@ impl<'tcx, Tag: Copy> ImmTy<'tcx, Tag> { ImmTy { imm: val.into(), layout } } + #[inline] + pub fn try_from_uint(i: impl Into, layout: TyLayout<'tcx>) -> Option { + Some(Self::from_scalar(Scalar::try_from_uint(i, layout.size)?, layout)) + } #[inline] pub fn from_uint(i: impl Into, layout: TyLayout<'tcx>) -> Self { Self::from_scalar(Scalar::from_uint(i, layout.size), layout) } + #[inline] + pub fn try_from_int(i: impl Into, layout: TyLayout<'tcx>) -> Option { + Some(Self::from_scalar(Scalar::try_from_int(i, layout.size)?, layout)) + } + #[inline] pub fn from_int(i: impl Into, layout: TyLayout<'tcx>) -> Self { Self::from_scalar(Scalar::from_int(i, layout.size), layout) @@ -239,16 +217,18 @@ impl<'tcx, Tag: Copy> ImmTy<'tcx, Tag> { #[inline(always)] pub(super) fn from_known_layout<'tcx>( layout: Option>, - compute: impl FnOnce() -> InterpResult<'tcx, TyLayout<'tcx>> + compute: impl FnOnce() -> InterpResult<'tcx, TyLayout<'tcx>>, ) -> InterpResult<'tcx, TyLayout<'tcx>> { match layout { None => compute(), Some(layout) => { if cfg!(debug_assertions) { let layout2 = compute()?; - assert_eq!(layout.details, layout2.details, + assert_eq!( + layout.details, layout2.details, "mismatch in layout of supposedly equal-layout types {:?} and {:?}", - layout.ty, layout2.ty); + layout.ty, layout2.ty + ); } Ok(layout) } @@ -263,7 +243,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { &self, op: OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { - match op.try_as_mplace() { + match op.try_as_mplace(self) { Ok(mplace) => Ok(self.force_mplace_ptr(mplace)?.into()), Err(imm) => Ok(imm.into()), // Nothing to cast/force } @@ -280,25 +260,28 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { return Ok(None); } - let ptr = match self.check_mplace_access(mplace, None) + let ptr = match self + .check_mplace_access(mplace, None) .expect("places should be checked on creation") { Some(ptr) => ptr, - None => return Ok(Some(ImmTy { // zero-sized type - imm: Scalar::zst().into(), - layout: mplace.layout, - })), + None => { + return Ok(Some(ImmTy { + // zero-sized type + imm: Scalar::zst().into(), + layout: mplace.layout, + })); + } }; match mplace.layout.abi { layout::Abi::Scalar(..) => { - let scalar = self.memory - .get_raw(ptr.alloc_id)? - .read_scalar(self, ptr, mplace.layout.size)?; - Ok(Some(ImmTy { - imm: scalar.into(), - layout: mplace.layout, - })) + let scalar = self.memory.get_raw(ptr.alloc_id)?.read_scalar( + self, + ptr, + mplace.layout.size, + )?; + Ok(Some(ImmTy { imm: scalar.into(), layout: mplace.layout })) } layout::Abi::ScalarPair(ref a, ref b) => { // We checked `ptr_align` above, so all fields will have the alignment they need. @@ -310,16 +293,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let b_offset = a_size.align_to(b.align(self).abi); assert!(b_offset.bytes() > 0); // we later use the offset to tell apart the fields let b_ptr = ptr.offset(b_offset, self)?; - let a_val = self.memory - .get_raw(ptr.alloc_id)? - .read_scalar(self, a_ptr, a_size)?; - let b_val = self.memory - .get_raw(ptr.alloc_id)? - .read_scalar(self, b_ptr, b_size)?; - Ok(Some(ImmTy { - imm: Immediate::ScalarPair(a_val, b_val), - layout: mplace.layout, - })) + let a_val = self.memory.get_raw(ptr.alloc_id)?.read_scalar(self, a_ptr, a_size)?; + let b_val = self.memory.get_raw(ptr.alloc_id)?.read_scalar(self, b_ptr, b_size)?; + Ok(Some(ImmTy { imm: Immediate::ScalarPair(a_val, b_val), layout: mplace.layout })) } _ => Ok(None), } @@ -335,14 +311,14 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { &self, src: OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, Result, MPlaceTy<'tcx, M::PointerTag>>> { - Ok(match src.try_as_mplace() { + Ok(match src.try_as_mplace(self) { Ok(mplace) => { if let Some(val) = self.try_read_immediate_from_mplace(mplace)? { Ok(val) } else { Err(mplace) } - }, + } Err(val) => Ok(val), }) } @@ -351,7 +327,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { #[inline(always)] pub fn read_immediate( &self, - op: OpTy<'tcx, M::PointerTag> + op: OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, ImmTy<'tcx, M::PointerTag>> { if let Ok(imm) = self.try_read_immediate(op)? { Ok(imm) @@ -363,21 +339,17 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Read a scalar from a place pub fn read_scalar( &self, - op: OpTy<'tcx, M::PointerTag> + op: OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, ScalarMaybeUndef> { Ok(self.read_immediate(op)?.to_scalar_or_undef()) } // Turn the wide MPlace into a string (must already be dereferenced!) - pub fn read_str( - &self, - mplace: MPlaceTy<'tcx, M::PointerTag>, - ) -> InterpResult<'tcx, &str> { + pub fn read_str(&self, mplace: MPlaceTy<'tcx, M::PointerTag>) -> InterpResult<'tcx, &str> { let len = mplace.len(self)?; let bytes = self.memory.read_bytes(mplace.ptr, Size::from_bytes(len as u64))?; - let str = ::std::str::from_utf8(bytes).map_err(|err| { - err_unsup!(ValidationFailure(err.to_string())) - })?; + let str = ::std::str::from_utf8(bytes) + .map_err(|err| err_unsup!(ValidationFailure(err.to_string())))?; Ok(str) } @@ -387,13 +359,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { op: OpTy<'tcx, M::PointerTag>, field: u64, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { - let base = match op.try_as_mplace() { + let base = match op.try_as_mplace(self) { Ok(mplace) => { // The easy case let field = self.mplace_field(mplace, field)?; return Ok(field.into()); - }, - Err(value) => value + } + Err(value) => value, }; let field = field.try_into().unwrap(); @@ -410,9 +382,10 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Immediate::ScalarPair(a, b) => { let val = if offset.bytes() == 0 { a } else { b }; Immediate::from(val) - }, - Immediate::Scalar(val) => - bug!("field access on non aggregate {:#?}, {:#?}", val, op.layout), + } + Immediate::Scalar(val) => { + bug!("field access on non aggregate {:#?}, {:#?}", val, op.layout) + } }; Ok(OpTy { op: Operand::Immediate(immediate), layout: field_layout }) } @@ -423,10 +396,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { variant: VariantIdx, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { // Downcasts only change the layout - Ok(match op.try_as_mplace() { - Ok(mplace) => { - self.mplace_downcast(mplace, variant)?.into() - }, + Ok(match op.try_as_mplace(self) { + Ok(mplace) => self.mplace_downcast(mplace, variant)?.into(), Err(..) => { let layout = op.layout.for_variant(self, variant); OpTy { layout, ..op } @@ -444,16 +415,10 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Field(field, _) => self.operand_field(base, field.index() as u64)?, Downcast(_, variant) => self.operand_downcast(base, variant)?, Deref => self.deref_operand(base)?.into(), - Subslice { .. } | ConstantIndex { .. } | Index(_) => if base.layout.is_zst() { - OpTy { - op: Operand::Immediate(Scalar::zst().into()), - // the actual index doesn't matter, so we just pick a convenient one like 0 - layout: base.layout.field(self, 0)?, - } - } else { + Subslice { .. } | ConstantIndex { .. } | Index(_) => { // The rest should only occur as mplace, we do not use Immediates for types // allowing such operations. This matches place_projection forcing an allocation. - let mplace = base.assert_mem_place(); + let mplace = base.assert_mem_place(self); self.mplace_projection(mplace, proj_elem)?.into() } }) @@ -481,14 +446,11 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { #[inline(always)] pub fn place_to_op( &self, - place: PlaceTy<'tcx, M::PointerTag> + place: PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { let op = match *place { - Place::Ptr(mplace) => { - Operand::Indirect(mplace) - } - Place::Local { frame, local } => - *self.access_local(&self.stack[frame], local, None)? + Place::Ptr(mplace) => Operand::Indirect(mplace), + Place::Local { frame, local } => *self.access_local(&self.stack[frame], local, None)?, }; Ok(OpTy { op, layout: place.layout }) } @@ -500,32 +462,21 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { place: &mir::Place<'tcx>, layout: Option>, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { - use rustc::mir::PlaceBase; - - let base_op = match &place.base { - PlaceBase::Local(mir::RETURN_PLACE) => - throw_unsup!(ReadFromReturnPointer), - PlaceBase::Local(local) => { + let base_op = match place.local { + mir::RETURN_PLACE => throw_unsup!(ReadFromReturnPointer), + local => { // Do not use the layout passed in as argument if the base we are looking at // here is not the entire place. - // FIXME use place_projection.is_empty() when is available - let layout = if place.projection.is_empty() { - layout - } else { - None - }; + let layout = if place.projection.is_empty() { layout } else { None }; - self.access_local(self.frame(), *local, layout)? - } - PlaceBase::Static(place_static) => { - self.eval_static_to_mplace(&place_static)?.into() + self.access_local(self.frame(), local, layout)? } }; - let op = place.projection.iter().try_fold( - base_op, - |op, elem| self.operand_projection(op, elem) - )?; + let op = place + .projection + .iter() + .try_fold(base_op, |op, elem| self.operand_projection(op, elem))?; trace!("eval_place_to_op: got {:?}", *op); Ok(op) @@ -542,9 +493,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { use rustc::mir::Operand::*; let op = match *mir_op { // FIXME: do some more logic on `move` to invalidate the old location - Copy(ref place) | - Move(ref place) => - self.eval_place_to_op(place, layout)?, + Copy(ref place) | Move(ref place) => self.eval_place_to_op(place, layout)?, Constant(ref constant) => { let val = self.subst_from_frame_and_normalize_erasing_regions(constant.literal); @@ -560,9 +509,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { &self, ops: &[mir::Operand<'tcx>], ) -> InterpResult<'tcx, Vec>> { - ops.into_iter() - .map(|op| self.eval_operand(op, None)) - .collect() + ops.into_iter().map(|op| self.eval_operand(op, None)).collect() } // Used when the miri-engine runs into a constant and for extracting information from constants @@ -580,25 +527,26 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { }; // Early-return cases. let val_val = match val.val { - ty::ConstKind::Param(_) => - throw_inval!(TooGeneric), - ty::ConstKind::Unevaluated(def_id, substs) => { + ty::ConstKind::Param(_) => throw_inval!(TooGeneric), + ty::ConstKind::Unevaluated(def_id, substs, promoted) => { let instance = self.resolve(def_id, substs)?; - return Ok(OpTy::from(self.const_eval_raw(GlobalId { - instance, - promoted: None, - })?)); + // We use `const_eval` here and `const_eval_raw` elsewhere in mir interpretation. + // The reason we use `const_eval_raw` everywhere else is to prevent cycles during + // validation, because validation automatically reads through any references, thus + // potentially requiring the current static to be evaluated again. This is not a + // problem here, because we are building an operand which means an actual read is + // happening. + return Ok(OpTy::from(self.const_eval(GlobalId { instance, promoted })?)); + } + ty::ConstKind::Infer(..) + | ty::ConstKind::Bound(..) + | ty::ConstKind::Placeholder(..) => { + bug!("eval_const_to_op: Unexpected ConstKind {:?}", val) } - ty::ConstKind::Infer(..) | - ty::ConstKind::Bound(..) | - ty::ConstKind::Placeholder(..) => - bug!("eval_const_to_op: Unexpected ConstKind {:?}", val), ty::ConstKind::Value(val_val) => val_val, }; // Other cases need layout. - let layout = from_known_layout(layout, || { - self.layout_of(val.ty) - })?; + let layout = from_known_layout(layout, || self.layout_of(val.ty))?; let op = match val_val { ConstValue::ByRef { alloc, offset } => { let id = self.tcx.alloc_map.lock().create_memory_alloc(alloc); @@ -606,7 +554,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // where none should happen. let ptr = self.tag_static_base_pointer(Pointer::new(id, offset)); Operand::Indirect(MemPlace::from_ptr(ptr, layout.align.abi)) - }, + } ConstValue::Scalar(x) => Operand::Immediate(tag_scalar(x).into()), ConstValue::Slice { data, start, end } => { // We rely on mutability being set correctly in `data` to prevent writes @@ -634,9 +582,11 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let (discr_layout, discr_kind, discr_index) = match rval.layout.variants { layout::Variants::Single { index } => { - let discr_val = rval.layout.ty.discriminant_for_variant(*self.tcx, index).map_or( - index.as_u32() as u128, - |discr| discr.val); + let discr_val = rval + .layout + .ty + .discriminant_for_variant(*self.tcx, index) + .map_or(index.as_u32() as u128, |discr| discr.val); return Ok((discr_val, index)); } layout::Variants::Multiple { @@ -644,8 +594,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { ref discr_kind, discr_index, .. - } => - (discr_layout, discr_kind, discr_index), + } => (discr_layout, discr_kind, discr_index), }; // read raw discriminant value @@ -665,8 +614,11 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // requires first sign extending with the discriminant layout let sexted = sign_extend(bits_discr, discr_val.layout.size) as i128; // and then zeroing with the typeck discriminant type - let discr_ty = rval.layout.ty - .ty_adt_def().expect("tagged layout corresponds to adt") + let discr_ty = rval + .layout + .ty + .ty_adt_def() + .expect("tagged layout corresponds to adt") .repr .discr_type(); let size = layout::Integer::from_attr(self, discr_ty).size(); @@ -677,9 +629,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { }; // Make sure we catch invalid discriminants let index = match rval.layout.ty.kind { - ty::Adt(adt, _) => adt - .discriminants(self.tcx.tcx) - .find(|(_, var)| var.val == real_discr), + ty::Adt(adt, _) => { + adt.discriminants(self.tcx.tcx).find(|(_, var)| var.val == real_discr) + } ty::Generator(def_id, substs, _) => { let substs = substs.as_generator(); substs @@ -687,12 +639,10 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { .find(|(_, var)| var.val == real_discr) } _ => bug!("tagged layout for non-adt non-generator"), - - }.ok_or_else( - || err_ub!(InvalidDiscriminant(raw_discr.erase_tag())) - )?; + } + .ok_or_else(|| err_ub!(InvalidDiscriminant(raw_discr.erase_tag())))?; (real_discr, index.0) - }, + } layout::DiscriminantKind::Niche { dataful_variant, ref niche_variants, @@ -700,30 +650,29 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } => { let variants_start = niche_variants.start().as_u32(); let variants_end = niche_variants.end().as_u32(); - let raw_discr = raw_discr.not_undef().map_err(|_| { - err_ub!(InvalidDiscriminant(ScalarMaybeUndef::Undef)) - })?; + let raw_discr = raw_discr + .not_undef() + .map_err(|_| err_ub!(InvalidDiscriminant(ScalarMaybeUndef::Undef)))?; match raw_discr.to_bits_or_ptr(discr_val.layout.size, self) { Err(ptr) => { // The niche must be just 0 (which an inbounds pointer value never is) - let ptr_valid = niche_start == 0 && variants_start == variants_end && - !self.memory.ptr_may_be_null(ptr); + let ptr_valid = niche_start == 0 + && variants_start == variants_end + && !self.memory.ptr_may_be_null(ptr); if !ptr_valid { throw_ub!(InvalidDiscriminant(raw_discr.erase_tag().into())) } (dataful_variant.as_u32() as u128, dataful_variant) - }, + } Ok(raw_discr) => { // We need to use machine arithmetic to get the relative variant idx: // variant_index_relative = discr_val - niche_start_val - let discr_layout = self.layout_of(discr_layout.value.to_int_ty(*self.tcx))?; + let discr_layout = + self.layout_of(discr_layout.value.to_int_ty(*self.tcx))?; let discr_val = ImmTy::from_uint(raw_discr, discr_layout); let niche_start_val = ImmTy::from_uint(niche_start, discr_layout); - let variant_index_relative_val = self.binary_op( - mir::BinOp::Sub, - discr_val, - niche_start_val, - )?; + let variant_index_relative_val = + self.binary_op(mir::BinOp::Sub, discr_val, niche_start_val)?; let variant_index_relative = variant_index_relative_val .to_scalar()? .assert_bits(discr_val.layout.size); @@ -735,15 +684,19 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let variant_index = variants_start .checked_add(variant_index_relative) .expect("oveflow computing absolute variant idx"); - assert!((variant_index as usize) < rval.layout.ty + let variants_len = rval + .layout + .ty .ty_adt_def() .expect("tagged layout for non adt") - .variants.len()); + .variants + .len(); + assert!((variant_index as usize) < variants_len); (u128::from(variant_index), VariantIdx::from_u32(variant_index)) } else { (u128::from(dataful_variant.as_u32()), dataful_variant) } - }, + } } } }) diff --git a/src/librustc_mir/interpret/operator.rs b/src/librustc_mir/interpret/operator.rs index 68004294c5..5050fe4906 100644 --- a/src/librustc_mir/interpret/operator.rs +++ b/src/librustc_mir/interpret/operator.rs @@ -1,11 +1,14 @@ use rustc::mir; -use rustc::ty::{self, Ty, layout::{TyLayout, LayoutOf}}; -use syntax::ast::FloatTy; -use rustc_apfloat::Float; use rustc::mir::interpret::{InterpResult, Scalar}; +use rustc::ty::{ + self, + layout::{LayoutOf, TyLayout}, + Ty, +}; +use rustc_apfloat::Float; +use syntax::ast::FloatTy; -use super::{InterpCx, PlaceTy, Immediate, Machine, ImmTy}; - +use super::{ImmTy, Immediate, InterpCx, Machine, PlaceTy}; impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Applies the binary operation `op` to the two operands and writes a tuple of the result @@ -21,7 +24,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { debug_assert_eq!( self.tcx.intern_tup(&[ty, self.tcx.types.bool]), dest.layout.ty, - "type mismatch for result of {:?}", op, + "type mismatch for result of {:?}", + op, ); let val = Immediate::ScalarPair(val.into(), Scalar::from_bool(overflowed).into()); self.write_immediate(val, dest) @@ -157,8 +161,10 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { bug!( "invalid asymmetric binary op {:?}: {:?} ({:?}), {:?} ({:?})", bin_op, - l, left_layout.ty, - r, right_layout.ty, + l, + left_layout.ty, + r, + right_layout.ty, ) } @@ -196,8 +202,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { if r == -1 && l == (1 << (size.bits() - 1)) { return Ok((Scalar::from_uint(l, size), true, left_layout.ty)); } - }, - _ => {}, + } + _ => {} } trace!("{}, {}, {}", l, l128, r); let (result, mut oflo) = op(l128, r); @@ -249,15 +255,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { )); } - _ => { - bug!( - "invalid binary op {:?}: {:?}, {:?} (both {:?})", - bin_op, - l, - r, - right_layout.ty, - ) - } + _ => bug!( + "invalid binary op {:?}: {:?}, {:?} (both {:?})", + bin_op, + l, + r, + right_layout.ty, + ), }; Ok((val, false, ty)) @@ -271,8 +275,14 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { left: ImmTy<'tcx, M::PointerTag>, right: ImmTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)> { - trace!("Running binary op {:?}: {:?} ({:?}), {:?} ({:?})", - bin_op, *left, left.layout.ty, *right, right.layout.ty); + trace!( + "Running binary op {:?}: {:?} ({:?}), {:?} ({:?})", + bin_op, + *left, + left.layout.ty, + *right, + right.layout.ty + ); match left.layout.ty.kind { ty::Char => { @@ -293,10 +303,12 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let left = left.to_scalar()?; let right = right.to_scalar()?; Ok(match fty { - FloatTy::F32 => - self.binary_float_op(bin_op, ty, left.to_f32()?, right.to_f32()?), - FloatTy::F64 => - self.binary_float_op(bin_op, ty, left.to_f64()?, right.to_f64()?), + FloatTy::F32 => { + self.binary_float_op(bin_op, ty, left.to_f32()?, right.to_f32()?) + } + FloatTy::F64 => { + self.binary_float_op(bin_op, ty, left.to_f64()?, right.to_f64()?) + } }) } _ if left.layout.ty.is_integral() => { @@ -304,7 +316,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { assert!( right.layout.ty.is_integral(), "Unexpected types for BinOp: {:?} {:?} {:?}", - left.layout.ty, bin_op, right.layout.ty + left.layout.ty, + bin_op, + right.layout.ty ); let l = self.force_bits(left.to_scalar()?, left.layout.size)?; @@ -316,7 +330,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { assert!( right.layout.ty == left.layout.ty || right.layout.ty.is_integral(), "Unexpected types for BinOp: {:?} {:?} {:?}", - left.layout.ty, bin_op, right.layout.ty + left.layout.ty, + bin_op, + right.layout.ty ); M::binary_ptr_op(self, bin_op, left, right) @@ -353,7 +369,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let val = val.to_bool()?; let res = match un_op { Not => !val, - _ => bug!("Invalid bool op {:?}", un_op) + _ => bug!("Invalid bool op {:?}", un_op), }; Ok(ImmTy::from_scalar(Scalar::from_bool(res), self.layout_of(self.tcx.types.bool)?)) } @@ -361,7 +377,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let res = match (un_op, fty) { (Neg, FloatTy::F32) => Scalar::from_f32(-val.to_f32()?), (Neg, FloatTy::F64) => Scalar::from_f64(-val.to_f64()?), - _ => bug!("Invalid float op {:?}", un_op) + _ => bug!("Invalid float op {:?}", un_op), }; Ok(ImmTy::from_scalar(res, layout)) } diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index 42fbfeca3f..721766cc93 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -7,21 +7,61 @@ use std::hash::Hash; use rustc::mir; use rustc::mir::interpret::truncate; -use rustc::ty::{self, Ty}; use rustc::ty::layout::{ - self, Size, Align, LayoutOf, TyLayout, HasDataLayout, VariantIdx, PrimitiveExt + self, Align, HasDataLayout, LayoutOf, PrimitiveExt, Size, TyLayout, VariantIdx, }; -use rustc::ty::TypeFoldable; +use rustc::ty::{self, Ty}; use rustc_macros::HashStable; use super::{ - GlobalId, AllocId, Allocation, Scalar, InterpResult, Pointer, PointerArithmetic, - InterpCx, Machine, AllocMap, AllocationExtra, - RawConst, Immediate, ImmTy, ScalarMaybeUndef, Operand, OpTy, MemoryKind, LocalValue, + AllocId, AllocMap, Allocation, AllocationExtra, ImmTy, Immediate, InterpCx, InterpResult, + LocalValue, Machine, MemoryKind, OpTy, Operand, Pointer, PointerArithmetic, RawConst, Scalar, + ScalarMaybeUndef, }; #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable)] -pub struct MemPlace { +/// Information required for the sound usage of a `MemPlace`. +pub enum MemPlaceMeta { + /// The unsized payload (e.g. length for slices or vtable pointer for trait objects). + Meta(Scalar), + /// `Sized` types or unsized `extern type` + None, + /// The address of this place may not be taken. This protects the `MemPlace` from coming from + /// a ZST Operand with a backing allocation and being converted to an integer address. This + /// should be impossible, because you can't take the address of an operand, but this is a second + /// protection layer ensuring that we don't mess up. + Poison, +} + +impl MemPlaceMeta { + pub fn unwrap_meta(self) -> Scalar { + match self { + Self::Meta(s) => s, + Self::None | Self::Poison => { + bug!("expected wide pointer extra data (e.g. slice length or trait object vtable)") + } + } + } + fn has_meta(self) -> bool { + match self { + Self::Meta(_) => true, + Self::None | Self::Poison => false, + } + } +} + +impl MemPlaceMeta { + pub fn erase_tag(self) -> MemPlaceMeta<()> { + match self { + Self::Meta(s) => MemPlaceMeta::Meta(s.erase_tag()), + Self::None => MemPlaceMeta::None, + Self::Poison => MemPlaceMeta::Poison, + } + } +} + +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable)] +pub struct MemPlace { /// A place may have an integral pointer for ZSTs, and since it might /// be turned back into a reference before ever being dereferenced. /// However, it may never be undef. @@ -30,24 +70,21 @@ pub struct MemPlace { /// Metadata for unsized places. Interpretation is up to the type. /// Must not be present for sized types, but can be missing for unsized types /// (e.g., `extern type`). - pub meta: Option>, + pub meta: MemPlaceMeta, } #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable)] -pub enum Place { +pub enum Place { /// A place referring to a value allocated in the `Memory` system. Ptr(MemPlace), /// To support alloc-free locals, we are able to write directly to a local. /// (Without that optimization, we'd just always be a `MemPlace`.) - Local { - frame: usize, - local: mir::Local, - }, + Local { frame: usize, local: mir::Local }, } #[derive(Copy, Clone, Debug)] -pub struct PlaceTy<'tcx, Tag=()> { +pub struct PlaceTy<'tcx, Tag = ()> { place: Place, // Keep this private; it helps enforce invariants. pub layout: TyLayout<'tcx>, } @@ -62,7 +99,7 @@ impl<'tcx, Tag> ::std::ops::Deref for PlaceTy<'tcx, Tag> { /// A MemPlace with its layout. Constructing it is only possible in this module. #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct MPlaceTy<'tcx, Tag=()> { +pub struct MPlaceTy<'tcx, Tag = ()> { mplace: MemPlace, pub layout: TyLayout<'tcx>, } @@ -78,10 +115,7 @@ impl<'tcx, Tag> ::std::ops::Deref for MPlaceTy<'tcx, Tag> { impl<'tcx, Tag> From> for PlaceTy<'tcx, Tag> { #[inline(always)] fn from(mplace: MPlaceTy<'tcx, Tag>) -> Self { - PlaceTy { - place: Place::Ptr(mplace.mplace), - layout: mplace.layout - } + PlaceTy { place: Place::Ptr(mplace.mplace), layout: mplace.layout } } } @@ -89,34 +123,22 @@ impl MemPlace { /// Replace ptr tag, maintain vtable tag (if any) #[inline] pub fn replace_tag(self, new_tag: Tag) -> Self { - MemPlace { - ptr: self.ptr.erase_tag().with_tag(new_tag), - align: self.align, - meta: self.meta, - } + MemPlace { ptr: self.ptr.erase_tag().with_tag(new_tag), align: self.align, meta: self.meta } } #[inline] pub fn erase_tag(self) -> MemPlace { - MemPlace { - ptr: self.ptr.erase_tag(), - align: self.align, - meta: self.meta.map(Scalar::erase_tag), - } + MemPlace { ptr: self.ptr.erase_tag(), align: self.align, meta: self.meta.erase_tag() } } #[inline(always)] - pub fn from_scalar_ptr(ptr: Scalar, align: Align) -> Self { - MemPlace { - ptr, - align, - meta: None, - } + fn from_scalar_ptr(ptr: Scalar, align: Align) -> Self { + MemPlace { ptr, align, meta: MemPlaceMeta::None } } /// Produces a Place that will error if attempted to be read from or written to #[inline(always)] - pub fn null(cx: &impl HasDataLayout) -> Self { + fn null(cx: &impl HasDataLayout) -> Self { Self::from_scalar_ptr(Scalar::ptr_null(cx), Align::from_bytes(1).unwrap()) } @@ -130,15 +152,19 @@ impl MemPlace { #[inline(always)] pub fn to_ref(self) -> Immediate { match self.meta { - None => Immediate::Scalar(self.ptr.into()), - Some(meta) => Immediate::ScalarPair(self.ptr.into(), meta.into()), + MemPlaceMeta::None => Immediate::Scalar(self.ptr.into()), + MemPlaceMeta::Meta(meta) => Immediate::ScalarPair(self.ptr.into(), meta.into()), + MemPlaceMeta::Poison => bug!( + "MPlaceTy::dangling may never be used to produce a \ + place that will have the address of its pointee taken" + ), } } pub fn offset( self, offset: Size, - meta: Option>, + meta: MemPlaceMeta, cx: &impl HasDataLayout, ) -> InterpResult<'tcx, Self> { Ok(MemPlace { @@ -153,36 +179,27 @@ impl<'tcx, Tag> MPlaceTy<'tcx, Tag> { /// Produces a MemPlace that works for ZST but nothing else #[inline] pub fn dangling(layout: TyLayout<'tcx>, cx: &impl HasDataLayout) -> Self { - MPlaceTy { - mplace: MemPlace::from_scalar_ptr( - Scalar::from_uint(layout.align.abi.bytes(), cx.pointer_size()), - layout.align.abi - ), - layout - } + let align = layout.align.abi; + let ptr = Scalar::from_uint(align.bytes(), cx.pointer_size()); + // `Poison` this to make sure that the pointer value `ptr` is never observable by the program. + MPlaceTy { mplace: MemPlace { ptr, align, meta: MemPlaceMeta::Poison }, layout } } /// Replace ptr tag, maintain vtable tag (if any) #[inline] pub fn replace_tag(self, new_tag: Tag) -> Self { - MPlaceTy { - mplace: self.mplace.replace_tag(new_tag), - layout: self.layout, - } + MPlaceTy { mplace: self.mplace.replace_tag(new_tag), layout: self.layout } } #[inline] pub fn offset( self, offset: Size, - meta: Option>, + meta: MemPlaceMeta, layout: TyLayout<'tcx>, cx: &impl HasDataLayout, ) -> InterpResult<'tcx, Self> { - Ok(MPlaceTy { - mplace: self.mplace.offset(offset, meta, cx)?, - layout, - }) + Ok(MPlaceTy { mplace: self.mplace.offset(offset, meta, cx)?, layout }) } #[inline] @@ -195,8 +212,9 @@ impl<'tcx, Tag> MPlaceTy<'tcx, Tag> { if self.layout.is_unsized() { // We need to consult `meta` metadata match self.layout.ty.kind { - ty::Slice(..) | ty::Str => - return self.mplace.meta.unwrap().to_machine_usize(cx), + ty::Slice(..) | ty::Str => { + return self.mplace.meta.unwrap_meta().to_machine_usize(cx); + } _ => bug!("len not supported on unsized type {:?}", self.layout.ty), } } else { @@ -212,7 +230,7 @@ impl<'tcx, Tag> MPlaceTy<'tcx, Tag> { #[inline] pub(super) fn vtable(self) -> Scalar { match self.layout.ty.kind { - ty::Dynamic(..) => self.mplace.meta.unwrap(), + ty::Dynamic(..) => self.mplace.meta.unwrap_meta(), _ => bug!("vtable not supported on type {:?}", self.layout.ty), } } @@ -221,42 +239,41 @@ impl<'tcx, Tag> MPlaceTy<'tcx, Tag> { // These are defined here because they produce a place. impl<'tcx, Tag: ::std::fmt::Debug + Copy> OpTy<'tcx, Tag> { #[inline(always)] - pub fn try_as_mplace(self) -> Result, ImmTy<'tcx, Tag>> { + /// Note: do not call `as_ref` on the resulting place. This function should only be used to + /// read from the resulting mplace, not to get its address back. + pub fn try_as_mplace( + self, + cx: &impl HasDataLayout, + ) -> Result, ImmTy<'tcx, Tag>> { match *self { Operand::Indirect(mplace) => Ok(MPlaceTy { mplace, layout: self.layout }), + Operand::Immediate(_) if self.layout.is_zst() => { + Ok(MPlaceTy::dangling(self.layout, cx)) + } Operand::Immediate(imm) => Err(ImmTy { imm, layout: self.layout }), } } #[inline(always)] - pub fn assert_mem_place(self) -> MPlaceTy<'tcx, Tag> { - self.try_as_mplace().unwrap() + /// Note: do not call `as_ref` on the resulting place. This function should only be used to + /// read from the resulting mplace, not to get its address back. + pub fn assert_mem_place(self, cx: &impl HasDataLayout) -> MPlaceTy<'tcx, Tag> { + self.try_as_mplace(cx).unwrap() } } impl Place { /// Produces a Place that will error if attempted to be read from or written to #[inline(always)] - pub fn null(cx: &impl HasDataLayout) -> Self { + fn null(cx: &impl HasDataLayout) -> Self { Place::Ptr(MemPlace::null(cx)) } - #[inline(always)] - pub fn from_scalar_ptr(ptr: Scalar, align: Align) -> Self { - Place::Ptr(MemPlace::from_scalar_ptr(ptr, align)) - } - - #[inline(always)] - pub fn from_ptr(ptr: Pointer, align: Align) -> Self { - Place::Ptr(MemPlace::from_ptr(ptr, align)) - } - #[inline] pub fn assert_mem_place(self) -> MemPlace { match self { Place::Ptr(mplace) => mplace, _ => bug!("assert_mem_place: expected Place::Ptr, got {:?}", self), - } } } @@ -288,13 +305,14 @@ where &self, val: ImmTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { - let pointee_type = val.layout.ty.builtin_deref(true) - .expect("`ref_to_mplace` called on non-ptr type") - .ty; + let pointee_type = + val.layout.ty.builtin_deref(true).expect("`ref_to_mplace` called on non-ptr type").ty; let layout = self.layout_of(pointee_type)?; let (ptr, meta) = match *val { - Immediate::Scalar(ptr) => (ptr.not_undef()?, None), - Immediate::ScalarPair(ptr, meta) => (ptr.not_undef()?, Some(meta.not_undef()?)), + Immediate::Scalar(ptr) => (ptr.not_undef()?, MemPlaceMeta::None), + Immediate::ScalarPair(ptr, meta) => { + (ptr.not_undef()?, MemPlaceMeta::Meta(meta.not_undef()?)) + } }; let mplace = MemPlace { @@ -328,14 +346,14 @@ where /// On success, returns `None` for zero-sized accesses (where nothing else is /// left to do) and a `Pointer` to use for the actual access otherwise. #[inline] - pub fn check_mplace_access( + pub(super) fn check_mplace_access( &self, place: MPlaceTy<'tcx, M::PointerTag>, size: Option, ) -> InterpResult<'tcx, Option>> { let size = size.unwrap_or_else(|| { assert!(!place.layout.is_unsized()); - assert!(place.meta.is_none()); + assert!(!place.meta.has_meta()); place.layout.size }); self.memory.check_ptr_access(place.ptr, size, place.align) @@ -347,7 +365,8 @@ where &self, mut place: MPlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { - let (size, align) = self.size_and_align_of_mplace(place)? + let (size, align) = self + .size_and_align_of_mplace(place)? .unwrap_or((place.layout.size, place.layout.align.abi)); assert!(place.mplace.align <= align, "dynamic alignment less strict than static one?"); place.mplace.align = align; // maximally strict checking @@ -360,7 +379,7 @@ where /// Force `place.ptr` to a `Pointer`. /// Can be helpful to avoid lots of `force_ptr` calls later, if this place is used a lot. - pub fn force_mplace_ptr( + pub(super) fn force_mplace_ptr( &self, mut place: MPlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { @@ -379,8 +398,9 @@ where ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { // Not using the layout method because we want to compute on u64 let offset = match base.layout.fields { - layout::FieldPlacement::Arbitrary { ref offsets, .. } => - offsets[usize::try_from(field).unwrap()], + layout::FieldPlacement::Arbitrary { ref offsets, .. } => { + offsets[usize::try_from(field).unwrap()] + } layout::FieldPlacement::Array { stride, .. } => { let len = base.len(self)?; if field >= len { @@ -390,9 +410,21 @@ where stride * field } layout::FieldPlacement::Union(count) => { - assert!(field < count as u64, - "Tried to access field {} of union {:#?} with {} fields", - field, base.layout, count); + // This is a narrow bug-fix for rust-lang/rust#69191: if we are + // trying to access absent field of uninhabited variant, then + // signal UB (but don't ICE the compiler). + // FIXME temporary hack to work around incoherence between + // layout computation and MIR building + if field >= count as u64 && base.layout.abi == layout::Abi::Uninhabited { + throw_ub!(Unreachable); + } + assert!( + field < count as u64, + "Tried to access field {} of union {:#?} with {} fields", + field, + base.layout, + count + ); // Offset is always 0 Size::from_bytes(0) } @@ -408,20 +440,20 @@ where // happens at run-time so that's okay. let align = match self.size_and_align_of(base.meta, field_layout)? { Some((_, align)) => align, - None if offset == Size::ZERO => + None if offset == Size::ZERO => { // An extern type at offset 0, we fall back to its static alignment. // FIXME: Once we have made decisions for how to handle size and alignment // of `extern type`, this should be adapted. It is just a temporary hack // to get some code to work that probably ought to work. - field_layout.align.abi, - None => - bug!("Cannot compute offset for extern type field at non-0 offset"), + field_layout.align.abi + } + None => bug!("Cannot compute offset for extern type field at non-0 offset"), }; (base.meta, offset.align_to(align)) } else { // base.meta could be present; we might be accessing a sized field of an unsized // struct. - (None, offset) + (MemPlaceMeta::None, offset) }; // We do not look at `base.layout.align` nor `field_layout.align`, unlike @@ -431,7 +463,7 @@ where // Iterates over all fields of an array. Much more efficient than doing the // same by repeatedly calling `mplace_array`. - pub fn mplace_array_fields( + pub(super) fn mplace_array_fields( &self, base: MPlaceTy<'tcx, Tag>, ) -> InterpResult<'tcx, impl Iterator>> + 'tcx> @@ -443,10 +475,10 @@ where }; let layout = base.layout.field(self, 0)?; let dl = &self.tcx.data_layout; - Ok((0..len).map(move |i| base.offset(i * stride, None, layout, dl))) + Ok((0..len).map(move |i| base.offset(i * stride, MemPlaceMeta::None, layout, dl))) } - pub fn mplace_subslice( + fn mplace_subslice( &self, base: MPlaceTy<'tcx, M::PointerTag>, from: u64, @@ -455,7 +487,10 @@ where ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { let len = base.len(self)?; // also asserts that we have a type where this makes sense let actual_to = if from_end { - assert!(from <= len - to); + if from + to > len { + // This can only be reached in ConstProp and non-rustc-MIR. + throw_ub!(BoundsCheckFailed { len: len as u64, index: from as u64 + to as u64 }); + } len - to } else { to @@ -464,8 +499,7 @@ where // Not using layout method because that works with usize, and does not work with slices // (that have count 0 in their layout). let from_offset = match base.layout.fields { - layout::FieldPlacement::Array { stride, .. } => - stride * from, + layout::FieldPlacement::Array { stride, .. } => stride * from, _ => bug!("Unexpected layout of index access: {:#?}", base.layout), }; @@ -474,31 +508,29 @@ where let (meta, ty) = match base.layout.ty.kind { // It is not nice to match on the type, but that seems to be the only way to // implement this. - ty::Array(inner, _) => - (None, self.tcx.mk_array(inner, inner_len)), + ty::Array(inner, _) => (MemPlaceMeta::None, self.tcx.mk_array(inner, inner_len)), ty::Slice(..) => { let len = Scalar::from_uint(inner_len, self.pointer_size()); - (Some(len), base.layout.ty) + (MemPlaceMeta::Meta(len), base.layout.ty) } - _ => - bug!("cannot subslice non-array type: `{:?}`", base.layout.ty), + _ => bug!("cannot subslice non-array type: `{:?}`", base.layout.ty), }; let layout = self.layout_of(ty)?; base.offset(from_offset, meta, layout, self) } - pub fn mplace_downcast( + pub(super) fn mplace_downcast( &self, base: MPlaceTy<'tcx, M::PointerTag>, variant: VariantIdx, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { // Downcasts only change the layout - assert!(base.meta.is_none()); + assert!(!base.meta.has_meta()); Ok(MPlaceTy { layout: base.layout.for_variant(self, variant), ..base }) } /// Project into an mplace - pub fn mplace_projection( + pub(super) fn mplace_projection( &self, base: MPlaceTy<'tcx, M::PointerTag>, proj_elem: &mir::PlaceElem<'tcx>, @@ -517,25 +549,27 @@ where self.mplace_field(base, u64::try_from(n).unwrap())? } - ConstantIndex { - offset, - min_length, - from_end, - } => { + ConstantIndex { offset, min_length, from_end } => { let n = base.len(self)?; - assert!(n >= min_length as u64); + if n < min_length as u64 { + // This can only be reached in ConstProp and non-rustc-MIR. + throw_ub!(BoundsCheckFailed { len: min_length as u64, index: n as u64 }); + } let index = if from_end { + assert!(0 < offset && offset - 1 < min_length); n - u64::from(offset) } else { + assert!(offset < min_length); u64::from(offset) }; self.mplace_field(base, index)? } - Subslice { from, to, from_end } => - self.mplace_subslice(base, u64::from(from), u64::from(to), from_end)?, + Subslice { from, to, from_end } => { + self.mplace_subslice(base, u64::from(from), u64::from(to), from_end)? + } }) } @@ -561,8 +595,9 @@ where ) -> InterpResult<'tcx, PlaceTy<'tcx, M::PointerTag>> { // Downcast just changes the layout Ok(match base.place { - Place::Ptr(mplace) => - self.mplace_downcast(MPlaceTy { mplace, layout: base.layout }, variant)?.into(), + Place::Ptr(mplace) => { + self.mplace_downcast(MPlaceTy { mplace, layout: base.layout }, variant)?.into() + } Place::Local { .. } => { let layout = base.layout.for_variant(self, variant); PlaceTy { layout, ..base } @@ -578,7 +613,7 @@ where ) -> InterpResult<'tcx, PlaceTy<'tcx, M::PointerTag>> { use rustc::mir::ProjectionElem::*; Ok(match *proj_elem { - Field(field, _) => self.place_field(base, field.index() as u64)?, + Field(field, _) => self.place_field(base, field.index() as u64)?, Downcast(_, variant) => self.place_downcast(base, variant)?, Deref => self.deref_operand(self.place_to_op(base)?)?.into(), // For the other variants, we have to force an allocation. @@ -590,72 +625,14 @@ where }) } - /// Evaluate statics and promoteds to an `MPlace`. Used to share some code between - /// `eval_place` and `eval_place_to_op`. - pub(super) fn eval_static_to_mplace( - &self, - place_static: &mir::Static<'tcx> - ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { - use rustc::mir::StaticKind; - - Ok(match place_static.kind { - StaticKind::Promoted(promoted, promoted_substs) => { - let substs = self.subst_from_frame_and_normalize_erasing_regions(promoted_substs); - let instance = ty::Instance::new(place_static.def_id, substs); - - // Even after getting `substs` from the frame, this instance may still be - // polymorphic because `ConstProp` will try to promote polymorphic MIR. - if instance.needs_subst() { - throw_inval!(TooGeneric); - } - - self.const_eval_raw(GlobalId { - instance, - promoted: Some(promoted), - })? - } - - StaticKind::Static => { - let ty = place_static.ty; - assert!(!ty.needs_subst()); - let layout = self.layout_of(ty)?; - let instance = ty::Instance::mono(*self.tcx, place_static.def_id); - let cid = GlobalId { - instance, - promoted: None - }; - // Just create a lazy reference, so we can support recursive statics. - // tcx takes care of assigning every static one and only one unique AllocId. - // When the data here is ever actually used, memory will notice, - // and it knows how to deal with alloc_id that are present in the - // global table but not in its local memory: It calls back into tcx through - // a query, triggering the CTFE machinery to actually turn this lazy reference - // into a bunch of bytes. IOW, statics are evaluated with CTFE even when - // this InterpCx uses another Machine (e.g., in miri). This is what we - // want! This way, computing statics works consistently between codegen - // and miri: They use the same query to eventually obtain a `ty::Const` - // and use that for further computation. - // - // Notice that statics have *two* AllocIds: the lazy one, and the resolved - // one. Here we make sure that the interpreted program never sees the - // resolved ID. Also see the doc comment of `Memory::get_static_alloc`. - let alloc_id = self.tcx.alloc_map.lock().create_static_alloc(cid.instance.def_id()); - let ptr = self.tag_static_base_pointer(Pointer::from(alloc_id)); - MPlaceTy::from_aligned_ptr(ptr, layout) - } - }) - } - /// Computes a place. You should only use this if you intend to write into this /// place; for reading, a more efficient alternative is `eval_place_for_read`. pub fn eval_place( &mut self, place: &mir::Place<'tcx>, ) -> InterpResult<'tcx, PlaceTy<'tcx, M::PointerTag>> { - use rustc::mir::PlaceBase; - - let mut place_ty = match &place.base { - PlaceBase::Local(mir::RETURN_PLACE) => { + let mut place_ty = match place.local { + mir::RETURN_PLACE => { // `return_place` has the *caller* layout, but we want to use our // `layout to verify our assumption. The caller will validate // their layout on return. @@ -671,22 +648,16 @@ where // bail out. None => Place::null(&*self), }, - layout: self.layout_of( - self.subst_from_frame_and_normalize_erasing_regions( - self.frame().body.return_ty() - ) - )?, + layout: self.layout_of(self.subst_from_frame_and_normalize_erasing_regions( + self.frame().body.return_ty(), + ))?, } - }, - PlaceBase::Local(local) => PlaceTy { + } + local => PlaceTy { // This works even for dead/uninitialized locals; we check further when writing - place: Place::Local { - frame: self.cur_frame(), - local: *local, - }, - layout: self.layout_of_local(self.frame(), *local, None)?, + place: Place::Local { frame: self.cur_frame(), local: local }, + layout: self.layout_of_local(self.frame(), local, None)?, }, - PlaceBase::Static(place_static) => self.eval_static_to_mplace(&place_static)?.into(), }; for elem in place.projection.iter() { @@ -753,13 +724,19 @@ where // This is a very common path, avoid some checks in release mode assert!(!dest.layout.is_unsized(), "Cannot write unsized data"); match src { - Immediate::Scalar(ScalarMaybeUndef::Scalar(Scalar::Ptr(_))) => - assert_eq!(self.pointer_size(), dest.layout.size, - "Size mismatch when writing pointer"), - Immediate::Scalar(ScalarMaybeUndef::Scalar(Scalar::Raw { size, .. })) => - assert_eq!(Size::from_bytes(size.into()), dest.layout.size, - "Size mismatch when writing bits"), - Immediate::Scalar(ScalarMaybeUndef::Undef) => {}, // undef can have any size + Immediate::Scalar(ScalarMaybeUndef::Scalar(Scalar::Ptr(_))) => assert_eq!( + self.pointer_size(), + dest.layout.size, + "Size mismatch when writing pointer" + ), + Immediate::Scalar(ScalarMaybeUndef::Scalar(Scalar::Raw { size, .. })) => { + assert_eq!( + Size::from_bytes(size.into()), + dest.layout.size, + "Size mismatch when writing bits" + ) + } + Immediate::Scalar(ScalarMaybeUndef::Undef) => {} // undef can have any size Immediate::ScalarPair(_, _) => { // FIXME: Can we check anything here? } @@ -782,7 +759,7 @@ where mplace } } - }, + } Place::Ptr(mplace) => mplace, // already referring to memory }; let dest = MPlaceTy { mplace, layout: dest.layout }; @@ -805,8 +782,7 @@ where // wrong type. // Invalid places are a thing: the return place of a diverging function - let ptr = match self.check_mplace_access(dest, None)? - { + let ptr = match self.check_mplace_access(dest, None)? { Some(ptr) => ptr, None => return Ok(()), // zero-sized access }; @@ -818,12 +794,16 @@ where match value { Immediate::Scalar(scalar) => { match dest.layout.abi { - layout::Abi::Scalar(_) => {}, // fine - _ => bug!("write_immediate_to_mplace: invalid Scalar layout: {:#?}", - dest.layout) + layout::Abi::Scalar(_) => {} // fine + _ => { + bug!("write_immediate_to_mplace: invalid Scalar layout: {:#?}", dest.layout) + } } self.memory.get_raw_mut(ptr.alloc_id)?.write_scalar( - tcx, ptr, scalar, dest.layout.size + tcx, + ptr, + scalar, + dest.layout.size, ) } Immediate::ScalarPair(a_val, b_val) => { @@ -832,8 +812,10 @@ where // which `ptr.offset(b_offset)` cannot possibly fail to satisfy. let (a, b) = match dest.layout.abi { layout::Abi::ScalarPair(ref a, ref b) => (&a.value, &b.value), - _ => bug!("write_immediate_to_mplace: invalid ScalarPair layout: {:#?}", - dest.layout) + _ => bug!( + "write_immediate_to_mplace: invalid ScalarPair layout: {:#?}", + dest.layout + ), }; let (a_size, b_size) = (a.size(self), b.size(self)); let b_offset = a_size.align_to(b.align(self).abi); @@ -843,12 +825,8 @@ where // but that does not work: We could be a newtype around a pair, then the // fields do not match the `ScalarPair` components. - self.memory - .get_raw_mut(ptr.alloc_id)? - .write_scalar(tcx, ptr, a_val, a_size)?; - self.memory - .get_raw_mut(b_ptr.alloc_id)? - .write_scalar(tcx, b_ptr, b_val, b_size) + self.memory.get_raw_mut(ptr.alloc_id)?.write_scalar(tcx, ptr, a_val, a_size)?; + self.memory.get_raw_mut(b_ptr.alloc_id)?.write_scalar(tcx, b_ptr, b_val, b_size) } } } @@ -882,8 +860,12 @@ where ) -> InterpResult<'tcx> { // We do NOT compare the types for equality, because well-typed code can // actually "transmute" `&mut T` to `&T` in an assignment without a cast. - assert!(src.layout.details == dest.layout.details, - "Layout mismatch when copying!\nsrc: {:#?}\ndest: {:#?}", src, dest); + assert!( + src.layout.details == dest.layout.details, + "Layout mismatch when copying!\nsrc: {:#?}\ndest: {:#?}", + src, + dest + ); // Let us see if the layout is simple so we take a shortcut, avoid force_allocation. let src = match self.try_read_immediate(src)? { @@ -903,15 +885,19 @@ where // is being initialized! let (dest, size) = self.force_allocation_maybe_sized(dest, src.meta)?; let size = size.unwrap_or_else(|| { - assert!(!dest.layout.is_unsized(), - "Cannot copy into already initialized unsized place"); + assert!( + !dest.layout.is_unsized(), + "Cannot copy into already initialized unsized place" + ); dest.layout.size }); assert_eq!(src.meta, dest.meta, "Can only copy between equally-sized instances"); - let src = self.check_mplace_access(src, Some(size)) + let src = self + .check_mplace_access(src, Some(size)) .expect("places should be checked on creation"); - let dest = self.check_mplace_access(dest, Some(size)) + let dest = self + .check_mplace_access(dest, Some(size)) .expect("places should be checked on creation"); let (src_ptr, dest_ptr) = match (src, dest) { (Some(src_ptr), Some(dest_ptr)) => (src_ptr, dest_ptr), @@ -919,12 +905,7 @@ where _ => bug!("The pointers should both be Some or both None"), }; - self.memory.copy( - src_ptr, - dest_ptr, - size, - /*nonoverlapping*/ true, - ) + self.memory.copy(src_ptr, dest_ptr, size, /*nonoverlapping*/ true) } /// Copies the data from an operand to a place. The layouts may disagree, but they must @@ -939,12 +920,20 @@ where return self.copy_op(src, dest); } // We still require the sizes to match. - assert!(src.layout.size == dest.layout.size, - "Size mismatch when transmuting!\nsrc: {:#?}\ndest: {:#?}", src, dest); + if src.layout.size != dest.layout.size { + // FIXME: This should be an assert instead of an error, but if we transmute within an + // array length computation, `typeck` may not have yet been run and errored out. In fact + // most likey we *are* running `typeck` right now. Investigate whether we can bail out + // on `typeck_tables().has_errors` at all const eval entry points. + debug!("Size mismatch when transmuting!\nsrc: {:#?}\ndest: {:#?}", src, dest); + throw_unsup!(TransmuteSizeDiff(src.layout.ty, dest.layout.ty)); + } // Unsized copies rely on interpreting `src.meta` with `dest.layout`, we want // to avoid that here. - assert!(!src.layout.is_unsized() && !dest.layout.is_unsized(), - "Cannot transmute unsized data"); + assert!( + !src.layout.is_unsized() && !dest.layout.is_unsized(), + "Cannot transmute unsized data" + ); // The hard case is `ScalarPair`. `src` is already read from memory in this case, // using `src.layout` to figure out which bytes to use for the 1st and 2nd field. @@ -979,35 +968,25 @@ where pub fn force_allocation_maybe_sized( &mut self, place: PlaceTy<'tcx, M::PointerTag>, - meta: Option>, + meta: MemPlaceMeta, ) -> InterpResult<'tcx, (MPlaceTy<'tcx, M::PointerTag>, Option)> { let (mplace, size) = match place.place { Place::Local { frame, local } => { match self.stack[frame].locals[local].access_mut()? { - Ok(local_val) => { + Ok(&mut local_val) => { // We need to make an allocation. - // FIXME: Consider not doing anything for a ZST, and just returning - // a fake pointer? Are we even called for ZST? - - // We cannot hold on to the reference `local_val` while allocating, - // but we can hold on to the value in there. - let old_val = - if let LocalValue::Live(Operand::Immediate(value)) = *local_val { - Some(value) - } else { - None - }; // We need the layout of the local. We can NOT use the layout we got, // that might e.g., be an inner field of a struct with `Scalar` layout, // that has different alignment than the outer field. - // We also need to support unsized types, and hence cannot use `allocate`. let local_layout = self.layout_of_local(&self.stack[frame], local, None)?; - let (size, align) = self.size_and_align_of(meta, local_layout)? + // We also need to support unsized types, and hence cannot use `allocate`. + let (size, align) = self + .size_and_align_of(meta, local_layout)? .expect("Cannot allocate for non-dyn-sized type"); let ptr = self.memory.allocate(size, align, MemoryKind::Stack); let mplace = MemPlace { ptr: ptr.into(), align, meta }; - if let Some(value) = old_val { + if let LocalValue::Live(Operand::Immediate(value)) = local_val { // Preserve old value. // We don't have to validate as we can assume the local // was already valid for its type. @@ -1023,7 +1002,7 @@ where Err(mplace) => (mplace, None), // this already was an indirect local } } - Place::Ptr(mplace) => (mplace, None) + Place::Ptr(mplace) => (mplace, None), }; // Return with the original layout, so that the caller can go on Ok((MPlaceTy { mplace, layout: place.layout }, size)) @@ -1034,7 +1013,7 @@ where &mut self, place: PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { - Ok(self.force_allocation_maybe_sized(place, None)?.0) + Ok(self.force_allocation_maybe_sized(place, MemPlaceMeta::None)?.0) } pub fn allocate( @@ -1057,7 +1036,7 @@ where let mplace = MemPlace { ptr: ptr.into(), align: Align::from_bytes(1).unwrap(), - meta: Some(meta), + meta: MemPlaceMeta::Meta(meta), }; let layout = self.layout_of(self.tcx.mk_static_str()).unwrap(); @@ -1069,7 +1048,6 @@ where variant_index: VariantIdx, dest: PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { - // Layout computation excludes uninhabited variants from consideration // therefore there's no way to represent those variants in the given layout. if dest.layout.for_variant(self, variant_index).abi.is_uninhabited() { @@ -1102,11 +1080,8 @@ where self.write_scalar(Scalar::from_uint(discr_val, size), discr_dest)?; } layout::Variants::Multiple { - discr_kind: layout::DiscriminantKind::Niche { - dataful_variant, - ref niche_variants, - niche_start, - }, + discr_kind: + layout::DiscriminantKind::Niche { dataful_variant, ref niche_variants, niche_start }, discr: ref discr_layout, discr_index, .. @@ -1116,7 +1091,8 @@ where if variant_index != dataful_variant { let variants_start = niche_variants.start().as_u32(); - let variant_index_relative = variant_index.as_u32() + let variant_index_relative = variant_index + .as_u32() .checked_sub(variants_start) .expect("overflow computing relative variant idx"); // We need to use machine arithmetic when taking into account `niche_start`: @@ -1153,8 +1129,10 @@ where /// Turn a place with a `dyn Trait` type into a place with the actual dynamic type. /// Also return some more information so drop doesn't have to run the same code twice. - pub(super) fn unpack_dyn_trait(&self, mplace: MPlaceTy<'tcx, M::PointerTag>) - -> InterpResult<'tcx, (ty::Instance<'tcx>, MPlaceTy<'tcx, M::PointerTag>)> { + pub(super) fn unpack_dyn_trait( + &self, + mplace: MPlaceTy<'tcx, M::PointerTag>, + ) -> InterpResult<'tcx, (ty::Instance<'tcx>, MPlaceTy<'tcx, M::PointerTag>)> { let vtable = mplace.vtable(); // also sanity checks the type let (instance, ty) = self.read_drop_type_from_vtable(vtable)?; let layout = self.layout_of(ty)?; @@ -1167,10 +1145,7 @@ where assert_eq!(align, layout.align.abi); } - let mplace = MPlaceTy { - mplace: MemPlace { meta: None, ..*mplace }, - layout - }; + let mplace = MPlaceTy { mplace: MemPlace { meta: MemPlaceMeta::None, ..*mplace }, layout }; Ok((instance, mplace)) } } diff --git a/src/librustc_mir/interpret/snapshot.rs b/src/librustc_mir/interpret/snapshot.rs index 3ea00d6922..a8e67c8f20 100644 --- a/src/librustc_mir/interpret/snapshot.rs +++ b/src/librustc_mir/interpret/snapshot.rs @@ -10,21 +10,22 @@ use std::hash::{Hash, Hasher}; use rustc::ich::StableHashingContextProvider; use rustc::mir; use rustc::mir::interpret::{ - AllocId, Pointer, Scalar, - Relocations, Allocation, UndefMask, InterpResult, + AllocId, Allocation, InterpResult, Pointer, Relocations, Scalar, UndefMask, }; -use rustc::ty::{self, TyCtxt}; use rustc::ty::layout::{Align, Size}; +use rustc::ty::{self, TyCtxt}; use rustc_data_structures::fx::FxHashSet; -use rustc_index::vec::IndexVec; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_index::vec::IndexVec; use rustc_macros::HashStable; +use rustc_span::source_map::Span; use syntax::ast::Mutability; -use syntax::source_map::Span; use super::eval_context::{LocalState, StackPopCleanup}; -use super::{Frame, Memory, Operand, MemPlace, Place, Immediate, ScalarMaybeUndef, LocalValue}; +use super::{ + Frame, Immediate, LocalValue, MemPlace, MemPlaceMeta, Memory, Operand, Place, ScalarMaybeUndef, +}; use crate::const_eval::CompileTimeInterpreter; #[derive(Default)] @@ -60,12 +61,14 @@ impl<'mir, 'tcx> InfiniteLoopDetector<'mir, 'tcx> { // Check if we know that hash already if self.hashes.is_empty() { // FIXME(#49980): make this warning a lint - tcx.sess.span_warn(span, - "Constant evaluating a complex constant, this might take some time"); + tcx.sess.span_warn( + span, + "Constant evaluating a complex constant, this might take some time", + ); } if self.hashes.insert(hash) { // No collision - return Ok(()) + return Ok(()); } // We need to make a full copy. NOW things that to get really expensive. @@ -73,7 +76,7 @@ impl<'mir, 'tcx> InfiniteLoopDetector<'mir, 'tcx> { if self.snapshots.insert(InterpSnapshot::new(memory, stack)) { // Spurious collision or first cycle - return Ok(()) + return Ok(()); } // Second cycle @@ -93,8 +96,12 @@ trait Snapshot<'a, Ctx: SnapshotContext<'a>> { } macro_rules! __impl_snapshot_field { - ($field:ident, $ctx:expr) => ($field.snapshot($ctx)); - ($field:ident, $ctx:expr, $delegate:expr) => ($delegate); + ($field:ident, $ctx:expr) => { + $field.snapshot($ctx) + }; + ($field:ident, $ctx:expr, $delegate:expr) => { + $delegate + }; } // This assumes the type has two type parameters, first for the tag (set to `()`), @@ -145,8 +152,9 @@ macro_rules! impl_snapshot_for { } impl<'a, Ctx, T> Snapshot<'a, Ctx> for Option - where Ctx: SnapshotContext<'a>, - T: Snapshot<'a, Ctx> +where + Ctx: SnapshotContext<'a>, + T: Snapshot<'a, Ctx>, { type Item = Option<>::Item>; @@ -162,7 +170,8 @@ impl<'a, Ctx, T> Snapshot<'a, Ctx> for Option struct AllocIdSnapshot<'a>(Option>); impl<'a, Ctx> Snapshot<'a, Ctx> for AllocId - where Ctx: SnapshotContext<'a>, +where + Ctx: SnapshotContext<'a>, { type Item = AllocIdSnapshot<'a>; @@ -178,25 +187,33 @@ impl_snapshot_for!(struct Pointer { }); impl<'a, Ctx> Snapshot<'a, Ctx> for Scalar - where Ctx: SnapshotContext<'a>, +where + Ctx: SnapshotContext<'a>, { type Item = Scalar<(), AllocIdSnapshot<'a>>; fn snapshot(&self, ctx: &'a Ctx) -> Self::Item { match self { Scalar::Ptr(p) => Scalar::Ptr(p.snapshot(ctx)), - Scalar::Raw{ size, data } => Scalar::Raw { - data: *data, - size: *size, - }, + Scalar::Raw { size, data } => Scalar::Raw { data: *data, size: *size }, } } } -impl_snapshot_for!(enum ScalarMaybeUndef { - Scalar(s), - Undef, -}); +impl_snapshot_for!( + enum ScalarMaybeUndef { + Scalar(s), + Undef, + } +); + +impl_snapshot_for!( + enum MemPlaceMeta { + Meta(s), + None, + Poison, + } +); impl_snapshot_for!(struct MemPlace { ptr, @@ -205,7 +222,8 @@ impl_snapshot_for!(struct MemPlace { }); impl<'a, Ctx> Snapshot<'a, Ctx> for Place - where Ctx: SnapshotContext<'a>, +where + Ctx: SnapshotContext<'a>, { type Item = Place<(), AllocIdSnapshot<'a>>; @@ -213,39 +231,43 @@ impl<'a, Ctx> Snapshot<'a, Ctx> for Place match self { Place::Ptr(p) => Place::Ptr(p.snapshot(ctx)), - Place::Local{ frame, local } => Place::Local{ - frame: *frame, - local: *local, - }, + Place::Local { frame, local } => Place::Local { frame: *frame, local: *local }, } } } -impl_snapshot_for!(enum Immediate { - Scalar(s), - ScalarPair(s, t), -}); +impl_snapshot_for!( + enum Immediate { + Scalar(s), + ScalarPair(s, t), + } +); -impl_snapshot_for!(enum Operand { - Immediate(v), - Indirect(m), -}); +impl_snapshot_for!( + enum Operand { + Immediate(v), + Indirect(m), + } +); -impl_snapshot_for!(enum LocalValue { - Dead, - Uninitialized, - Live(v), -}); +impl_snapshot_for!( + enum LocalValue { + Dead, + Uninitialized, + Live(v), + } +); impl<'a, Ctx> Snapshot<'a, Ctx> for Relocations - where Ctx: SnapshotContext<'a>, +where + Ctx: SnapshotContext<'a>, { type Item = Relocations<(), AllocIdSnapshot<'a>>; fn snapshot(&self, ctx: &'a Ctx) -> Self::Item { - Relocations::from_presorted(self.iter() - .map(|(size, ((), id))| (*size, ((), id.snapshot(ctx)))) - .collect()) + Relocations::from_presorted( + self.iter().map(|(size, ((), id))| (*size, ((), id.snapshot(ctx)))).collect(), + ) } } @@ -260,18 +282,13 @@ struct AllocationSnapshot<'a> { } impl<'a, Ctx> Snapshot<'a, Ctx> for &'a Allocation - where Ctx: SnapshotContext<'a>, +where + Ctx: SnapshotContext<'a>, { type Item = AllocationSnapshot<'a>; fn snapshot(&self, ctx: &'a Ctx) -> Self::Item { - let Allocation { - size, - align, - mutability, - extra: (), - .. - } = self; + let Allocation { size, align, mutability, extra: (), .. } = self; let all_bytes = 0..self.len(); // This 'inspect' is okay since following access respects undef and relocations. This does @@ -305,7 +322,8 @@ struct FrameSnapshot<'a, 'tcx> { } impl<'a, 'mir, 'tcx, Ctx> Snapshot<'a, Ctx> for &'a Frame<'mir, 'tcx> - where Ctx: SnapshotContext<'a>, +where + Ctx: SnapshotContext<'a>, { type Item = FrameSnapshot<'a, 'tcx>; @@ -335,7 +353,8 @@ impl<'a, 'mir, 'tcx, Ctx> Snapshot<'a, Ctx> for &'a Frame<'mir, 'tcx> } impl<'a, 'tcx, Ctx> Snapshot<'a, Ctx> for &'a LocalState<'tcx> - where Ctx: SnapshotContext<'a>, +where + Ctx: SnapshotContext<'a>, { type Item = LocalValue<(), AllocIdSnapshot<'a>>; @@ -369,16 +388,11 @@ impl InterpSnapshot<'mir, 'tcx> { memory: &Memory<'mir, 'tcx, CompileTimeInterpreter<'mir, 'tcx>>, stack: &[Frame<'mir, 'tcx>], ) -> Self { - InterpSnapshot { - memory: memory.clone(), - stack: stack.into(), - } + InterpSnapshot { memory: memory.clone(), stack: stack.into() } } // Used to compare two snapshots - fn snapshot(&'b self) - -> Vec> - { + fn snapshot(&'b self) -> Vec> { // Start with the stack, iterate and recursively snapshot self.stack.iter().map(|frame| frame.snapshot(&self.memory)).collect() } diff --git a/src/librustc_mir/interpret/step.rs b/src/librustc_mir/interpret/step.rs index 33ed69af6b..a99abc4cbf 100644 --- a/src/librustc_mir/interpret/step.rs +++ b/src/librustc_mir/interpret/step.rs @@ -3,8 +3,8 @@ //! The main entry point is the `step` method. use rustc::mir; +use rustc::mir::interpret::{InterpResult, PointerArithmetic, Scalar}; use rustc::ty::layout::LayoutOf; -use rustc::mir::interpret::{InterpResult, Scalar, PointerArithmetic}; use super::{InterpCx, Machine}; @@ -14,11 +14,8 @@ use super::{InterpCx, Machine}; fn binop_left_homogeneous(op: mir::BinOp) -> bool { use rustc::mir::BinOp::*; match op { - Add | Sub | Mul | Div | Rem | BitXor | BitAnd | BitOr | - Offset | Shl | Shr => - true, - Eq | Ne | Lt | Le | Gt | Ge => - false, + Add | Sub | Mul | Div | Rem | BitXor | BitAnd | BitOr | Offset | Shl | Shr => true, + Eq | Ne | Lt | Le | Gt | Ge => false, } } /// Classify whether an operator is "right-homogeneous", i.e., the RHS has the @@ -27,11 +24,8 @@ fn binop_left_homogeneous(op: mir::BinOp) -> bool { fn binop_right_homogeneous(op: mir::BinOp) -> bool { use rustc::mir::BinOp::*; match op { - Add | Sub | Mul | Div | Rem | BitXor | BitAnd | BitOr | - Eq | Ne | Lt | Le | Gt | Ge => - true, - Offset | Shl | Shr => - false, + Add | Sub | Mul | Div | Rem | BitXor | BitAnd | BitOr | Eq | Ne | Lt | Le | Gt | Ge => true, + Offset | Shl | Shr => false, } } @@ -56,7 +50,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // Just go on unwinding. trace!("unwinding: skipping frame"); self.pop_stack_frame(/* unwinding */ true)?; - return Ok(true) + return Ok(true); } }; let stmt_id = self.frame().stmt; @@ -91,12 +85,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { self.memory.tcx.span = stmt.source_info.span; match stmt.kind { - Assign(box(ref place, ref rvalue)) => self.eval_rvalue_into_place(rvalue, place)?, + Assign(box (ref place, ref rvalue)) => self.eval_rvalue_into_place(rvalue, place)?, - SetDiscriminant { - ref place, - variant_index, - } => { + SetDiscriminant { ref place, variant_index } => { let dest = self.eval_place(place)?; self.write_discriminant_index(variant_index, dest)?; } @@ -161,12 +152,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let left = self.read_immediate(self.eval_operand(left, layout)?)?; let layout = binop_right_homogeneous(bin_op).then_some(left.layout); let right = self.read_immediate(self.eval_operand(right, layout)?)?; - self.binop_ignore_overflow( - bin_op, - left, - right, - dest, - )?; + self.binop_ignore_overflow(bin_op, left, right, dest)?; } CheckedBinaryOp(bin_op, ref left, ref right) => { @@ -174,12 +160,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let left = self.read_immediate(self.eval_operand(left, None)?)?; let layout = binop_right_homogeneous(bin_op).then_some(left.layout); let right = self.read_immediate(self.eval_operand(right, layout)?)?; - self.binop_with_overflow( - bin_op, - left, - right, - dest, - )?; + self.binop_with_overflow(bin_op, left, right, dest)?; } UnaryOp(un_op, ref operand) => { @@ -200,7 +181,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { (dest, active_field_index) } } - _ => (dest, None) + _ => (dest, None), }; for (i, operand) in operands.iter().enumerate() { @@ -230,7 +211,11 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // for big static/const arrays! let rest_ptr = first_ptr.offset(elem_size, self)?; self.memory.copy_repeatedly( - first_ptr, rest_ptr, elem_size, length - 1, /*nonoverlapping:*/true + first_ptr, + rest_ptr, + elem_size, + length - 1, + /*nonoverlapping:*/ true, )?; } } @@ -242,13 +227,10 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let mplace = self.force_allocation(src)?; let len = mplace.len(self)?; let size = self.pointer_size(); - self.write_scalar( - Scalar::from_uint(len, size), - dest, - )?; + self.write_scalar(Scalar::from_uint(len, size), dest)?; } - Ref(_, _, ref place) => { + AddressOf(_, ref place) | Ref(_, _, ref place) => { let src = self.eval_place(place)?; let place = self.force_allocation(src)?; if place.layout.size.bytes() > 0 { @@ -265,13 +247,12 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { NullaryOp(mir::NullOp::SizeOf, ty) => { let ty = self.subst_from_frame_and_normalize_erasing_regions(ty); let layout = self.layout_of(ty)?; - assert!(!layout.is_unsized(), - "SizeOf nullary MIR operator called for unsized type"); + assert!( + !layout.is_unsized(), + "SizeOf nullary MIR operator called for unsized type" + ); let size = self.pointer_size(); - self.write_scalar( - Scalar::from_uint(layout.size.bytes(), size), - dest, - )?; + self.write_scalar(Scalar::from_uint(layout.size.bytes(), size), dest)?; } Cast(kind, ref operand, _) => { diff --git a/src/librustc_mir/interpret/terminator.rs b/src/librustc_mir/interpret/terminator.rs index b8dc15f451..37dcab512b 100644 --- a/src/librustc_mir/interpret/terminator.rs +++ b/src/librustc_mir/interpret/terminator.rs @@ -1,14 +1,13 @@ use std::borrow::Cow; -use rustc::{mir, ty}; +use rustc::ty::layout::{self, LayoutOf, TyLayout}; use rustc::ty::Instance; -use rustc::ty::layout::{self, TyLayout, LayoutOf}; -use syntax::source_map::Span; +use rustc::{mir, ty}; +use rustc_span::source_map::Span; use rustc_target::spec::abi::Abi; use super::{ - GlobalId, InterpResult, InterpCx, Machine, - OpTy, ImmTy, PlaceTy, MPlaceTy, StackPopCleanup, FnVal, + FnVal, ImmTy, InterpCx, InterpResult, MPlaceTy, Machine, OpTy, PlaceTy, StackPopCleanup, }; impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { @@ -25,12 +24,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Goto { target } => self.go_to_block(target), - SwitchInt { - ref discr, - ref values, - ref targets, - .. - } => { + SwitchInt { ref discr, ref values, ref targets, .. } => { let discr = self.read_immediate(self.eval_operand(discr, None)?)?; trace!("SwitchInt({:?})", *discr); @@ -39,10 +33,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { for (index, &const_int) in values.iter().enumerate() { // Compare using binary_op, to also support pointer values - let res = self.overflowing_binary_op(mir::BinOp::Eq, - discr, - ImmTy::from_uint(const_int, discr.layout), - )?.0; + let res = self + .overflowing_binary_op( + mir::BinOp::Eq, + discr, + ImmTy::from_uint(const_int, discr.layout), + )? + .0; if res.to_bool()? { target_block = targets[index]; break; @@ -52,13 +49,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { self.go_to_block(target_block); } - Call { - ref func, - ref args, - ref destination, - ref cleanup, - .. - } => { + Call { ref func, ref args, ref destination, ref cleanup, .. } => { let func = self.eval_operand(func, None)?; let (fn_val, abi) = match func.layout.ty.kind { ty::FnPtr(sig) => { @@ -70,10 +61,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { ty::FnDef(def_id, substs) => { let sig = func.layout.ty.fn_sig(*self.tcx); (FnVal::Instance(self.resolve(def_id, substs)?), sig.abi()) - }, - _ => { - bug!("invalid callee of type {:?}", func.layout.ty) } + _ => bug!("invalid callee of type {:?}", func.layout.ty), }; let args = self.eval_operands(args)?; let ret = match destination { @@ -86,39 +75,23 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { abi, &args[..], ret, - *cleanup + *cleanup, )?; } - Drop { - ref location, - target, - unwind, - } => { + Drop { ref location, target, unwind } => { // FIXME(CTFE): forbid drop in const eval let place = self.eval_place(location)?; let ty = place.layout.ty; trace!("TerminatorKind::drop: {:?}, type {}", location, ty); let instance = Instance::resolve_drop_in_place(*self.tcx, ty); - self.drop_in_place( - place, - instance, - terminator.source_info.span, - target, - unwind - )?; + self.drop_in_place(place, instance, terminator.source_info.span, target, unwind)?; } - Assert { - ref cond, - expected, - ref msg, - target, - cleanup, - } => { - let cond_val = self.read_immediate(self.eval_operand(cond, None)?)? - .to_scalar()?.to_bool()?; + Assert { ref cond, expected, ref msg, target, cleanup } => { + let cond_val = + self.read_immediate(self.eval_operand(cond, None)?)?.to_scalar()?.to_bool()?; if expected == cond_val { self.go_to_block(target); } else { @@ -126,7 +99,6 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } } - // When we encounter Resume, we've finished unwinding // cleanup for the current stack frame. We pop it in order // to continue unwinding the next frame @@ -135,24 +107,22 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // By definition, a Resume terminator means // that we're unwinding self.pop_stack_frame(/* unwinding */ true)?; - return Ok(()) - }, + return Ok(()); + } // It is UB to ever encounter this. Unreachable => throw_ub!(Unreachable), // These should never occur for MIR we actually run. - DropAndReplace { .. } | - FalseEdges { .. } | - FalseUnwind { .. } => - bug!("{:#?} should have been eliminated by MIR pass", terminator.kind), + DropAndReplace { .. } | FalseEdges { .. } | FalseUnwind { .. } => { + bug!("{:#?} should have been eliminated by MIR pass", terminator.kind) + } // These are not (yet) supported. It is unclear if they even can occur in // MIR that we actually run. - Yield { .. } | - GeneratorDrop | - Abort => - throw_unsup_format!("Unsupported terminator kind: {:#?}", terminator.kind), + Yield { .. } | GeneratorDrop | Abort => { + throw_unsup_format!("Unsupported terminator kind: {:#?}", terminator.kind) + } } Ok(()) @@ -176,13 +146,15 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // Different valid ranges are okay (once we enforce validity, // that will take care to make it UB to leave the range, just // like for transmute). - (layout::Abi::Scalar(ref caller), layout::Abi::Scalar(ref callee)) => - caller.value == callee.value, - (layout::Abi::ScalarPair(ref caller1, ref caller2), - layout::Abi::ScalarPair(ref callee1, ref callee2)) => - caller1.value == callee1.value && caller2.value == callee2.value, + (layout::Abi::Scalar(ref caller), layout::Abi::Scalar(ref callee)) => { + caller.value == callee.value + } + ( + layout::Abi::ScalarPair(ref caller1, ref caller2), + layout::Abi::ScalarPair(ref callee1, ref callee2), + ) => caller1.value == callee1.value && caller2.value == callee2.value, // Be conservative - _ => false + _ => false, } } @@ -190,7 +162,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { fn pass_argument( &mut self, rust_abi: bool, - caller_arg: &mut impl Iterator>, + caller_arg: &mut impl Iterator>, callee_arg: PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { if rust_abi && callee_arg.layout.is_zst() { @@ -198,8 +170,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { trace!("Skipping callee ZST"); return Ok(()); } - let caller_arg = caller_arg.next() - .ok_or_else(|| err_unsup!(FunctionArgCountMismatch)) ?; + let caller_arg = caller_arg.next().ok_or_else(|| err_unsup!(FunctionArgCountMismatch))?; if rust_abi { debug_assert!(!caller_arg.layout.is_zst(), "ZSTs must have been already filtered out"); } @@ -219,7 +190,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { caller_abi: Abi, args: &[OpTy<'tcx, M::PointerTag>], ret: Option<(PlaceTy<'tcx, M::PointerTag>, mir::BasicBlock)>, - unwind: Option + unwind: Option, ) -> InterpResult<'tcx> { trace!("eval_fn_call: {:#?}", fn_val); @@ -233,10 +204,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // ABI check { let callee_abi = { - let instance_ty = instance.ty(*self.tcx); + let instance_ty = instance.ty_env(*self.tcx, self.param_env); match instance_ty.kind { - ty::FnDef(..) => - instance_ty.fn_sig(*self.tcx).abi(), + ty::FnDef(..) => instance_ty.fn_sig(*self.tcx).abi(), ty::Closure(..) => Abi::RustCall, ty::Generator(..) => Abi::Rust, _ => bug!("unexpected callee ty: {:?}", instance_ty), @@ -244,10 +214,11 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { }; let normalize_abi = |abi| match abi { Abi::Rust | Abi::RustCall | Abi::RustIntrinsic | Abi::PlatformIntrinsic => - // These are all the same ABI, really. - Abi::Rust, - abi => - abi, + // These are all the same ABI, really. + { + Abi::Rust + } + abi => abi, }; if normalize_abi(caller_abi) != normalize_abi(callee_abi) { throw_unsup!(FunctionAbiMismatch(caller_abi, callee_abi)) @@ -259,15 +230,15 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { assert!(caller_abi == Abi::RustIntrinsic || caller_abi == Abi::PlatformIntrinsic); return M::call_intrinsic(self, span, instance, args, ret, unwind); } - ty::InstanceDef::VtableShim(..) | - ty::InstanceDef::ReifyShim(..) | - ty::InstanceDef::ClosureOnceShim { .. } | - ty::InstanceDef::FnPtrShim(..) | - ty::InstanceDef::DropGlue(..) | - ty::InstanceDef::CloneShim(..) | - ty::InstanceDef::Item(_) => { + ty::InstanceDef::VtableShim(..) + | ty::InstanceDef::ReifyShim(..) + | ty::InstanceDef::ClosureOnceShim { .. } + | ty::InstanceDef::FnPtrShim(..) + | ty::InstanceDef::DropGlue(..) + | ty::InstanceDef::CloneShim(..) + | ty::InstanceDef::Item(_) => { // We need MIR for this fn - let body = match M::find_mir_or_eval_fn(self, instance, args, ret, unwind)? { + let body = match M::find_mir_or_eval_fn(self, span, instance, args, ret, unwind)? { Some(body) => body, None => return Ok(()), }; @@ -277,119 +248,120 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { span, body, ret.map(|p| p.0), - StackPopCleanup::Goto { ret: ret.map(|p| p.1), unwind } + StackPopCleanup::Goto { ret: ret.map(|p| p.1), unwind }, )?; // We want to pop this frame again in case there was an error, to put // the blame in the right location. Until the 2018 edition is used in // the compiler, we have to do this with an immediately invoked function. - let res = (||{ - trace!( - "caller ABI: {:?}, args: {:#?}", - caller_abi, - args.iter() - .map(|arg| (arg.layout.ty, format!("{:?}", **arg))) - .collect::>() - ); - trace!( - "spread_arg: {:?}, locals: {:#?}", - body.spread_arg, - body.args_iter() - .map(|local| - (local, self.layout_of_local(self.frame(), local, None).unwrap().ty) - ) - .collect::>() - ); - - // Figure out how to pass which arguments. - // The Rust ABI is special: ZST get skipped. - let rust_abi = match caller_abi { - Abi::Rust | Abi::RustCall => true, - _ => false - }; - // We have two iterators: Where the arguments come from, - // and where they go to. - - // For where they come from: If the ABI is RustCall, we untuple the - // last incoming argument. These two iterators do not have the same type, - // so to keep the code paths uniform we accept an allocation - // (for RustCall ABI only). - let caller_args : Cow<'_, [OpTy<'tcx, M::PointerTag>]> = - if caller_abi == Abi::RustCall && !args.is_empty() { - // Untuple - let (&untuple_arg, args) = args.split_last().unwrap(); - trace!("eval_fn_call: Will pass last argument by untupling"); - Cow::from(args.iter().map(|&a| Ok(a)) + let res = + (|| { + trace!( + "caller ABI: {:?}, args: {:#?}", + caller_abi, + args.iter() + .map(|arg| (arg.layout.ty, format!("{:?}", **arg))) + .collect::>() + ); + trace!( + "spread_arg: {:?}, locals: {:#?}", + body.spread_arg, + body.args_iter() + .map(|local| ( + local, + self.layout_of_local(self.frame(), local, None).unwrap().ty + )) + .collect::>() + ); + + // Figure out how to pass which arguments. + // The Rust ABI is special: ZST get skipped. + let rust_abi = match caller_abi { + Abi::Rust | Abi::RustCall => true, + _ => false, + }; + // We have two iterators: Where the arguments come from, + // and where they go to. + + // For where they come from: If the ABI is RustCall, we untuple the + // last incoming argument. These two iterators do not have the same type, + // so to keep the code paths uniform we accept an allocation + // (for RustCall ABI only). + let caller_args: Cow<'_, [OpTy<'tcx, M::PointerTag>]> = + if caller_abi == Abi::RustCall && !args.is_empty() { + // Untuple + let (&untuple_arg, args) = args.split_last().unwrap(); + trace!("eval_fn_call: Will pass last argument by untupling"); + Cow::from(args.iter().map(|&a| Ok(a)) .chain((0..untuple_arg.layout.fields.count()).into_iter() .map(|i| self.operand_field(untuple_arg, i as u64)) ) .collect::>>>()?) - } else { - // Plain arg passing - Cow::from(args) - }; - // Skip ZSTs - let mut caller_iter = caller_args.iter() - .filter(|op| !rust_abi || !op.layout.is_zst()) - .map(|op| *op); - - // Now we have to spread them out across the callee's locals, - // taking into account the `spread_arg`. If we could write - // this is a single iterator (that handles `spread_arg`), then - // `pass_argument` would be the loop body. It takes care to - // not advance `caller_iter` for ZSTs. - let mut locals_iter = body.args_iter(); - while let Some(local) = locals_iter.next() { - let dest = self.eval_place( - &mir::Place::from(local) - )?; - if Some(local) == body.spread_arg { - // Must be a tuple - for i in 0..dest.layout.fields.count() { - let dest = self.place_field(dest, i as u64)?; + } else { + // Plain arg passing + Cow::from(args) + }; + // Skip ZSTs + let mut caller_iter = caller_args + .iter() + .filter(|op| !rust_abi || !op.layout.is_zst()) + .map(|op| *op); + + // Now we have to spread them out across the callee's locals, + // taking into account the `spread_arg`. If we could write + // this is a single iterator (that handles `spread_arg`), then + // `pass_argument` would be the loop body. It takes care to + // not advance `caller_iter` for ZSTs. + let mut locals_iter = body.args_iter(); + while let Some(local) = locals_iter.next() { + let dest = self.eval_place(&mir::Place::from(local))?; + if Some(local) == body.spread_arg { + // Must be a tuple + for i in 0..dest.layout.fields.count() { + let dest = self.place_field(dest, i as u64)?; + self.pass_argument(rust_abi, &mut caller_iter, dest)?; + } + } else { + // Normal argument self.pass_argument(rust_abi, &mut caller_iter, dest)?; } - } else { - // Normal argument - self.pass_argument(rust_abi, &mut caller_iter, dest)?; } - } - // Now we should have no more caller args - if caller_iter.next().is_some() { - trace!("Caller has passed too many args"); - throw_unsup!(FunctionArgCountMismatch) - } - // Don't forget to check the return type! - if let Some((caller_ret, _)) = ret { - let callee_ret = self.eval_place( - &mir::Place::return_place() - )?; - if !Self::check_argument_compat( - rust_abi, - caller_ret.layout, - callee_ret.layout, - ) { - throw_unsup!( - FunctionRetMismatch(caller_ret.layout.ty, callee_ret.layout.ty) - ) + // Now we should have no more caller args + if caller_iter.next().is_some() { + trace!("Caller has passed too many args"); + throw_unsup!(FunctionArgCountMismatch) } - } else { - let local = mir::RETURN_PLACE; - let callee_layout = self.layout_of_local(self.frame(), local, None)?; - if !callee_layout.abi.is_uninhabited() { - throw_unsup!(FunctionRetMismatch( - self.tcx.types.never, callee_layout.ty - )) + // Don't forget to check the return type! + if let Some((caller_ret, _)) = ret { + let callee_ret = self.eval_place(&mir::Place::return_place())?; + if !Self::check_argument_compat( + rust_abi, + caller_ret.layout, + callee_ret.layout, + ) { + throw_unsup!(FunctionRetMismatch( + caller_ret.layout.ty, + callee_ret.layout.ty + )) + } + } else { + let local = mir::RETURN_PLACE; + let callee_layout = self.layout_of_local(self.frame(), local, None)?; + if !callee_layout.abi.is_uninhabited() { + throw_unsup!(FunctionRetMismatch( + self.tcx.types.never, + callee_layout.ty + )) + } } - } - Ok(()) - })(); + Ok(()) + })(); match res { Err(err) => { self.stack.pop(); Err(err) } - Ok(v) => Ok(v) + Ok(v) => Ok(v), } } // cannot use the shim here, because that will only result in infinite recursion @@ -406,7 +378,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } None => { // Unsized self. - args[0].assert_mem_place() + args[0].assert_mem_place(self) } }; // Find and consult vtable @@ -420,10 +392,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let receiver_ptr_ty = self.tcx.mk_mut_ptr(receiver_place.layout.ty); let this_receiver_ptr = self.layout_of(receiver_ptr_ty)?.field(self, 0)?; // Adjust receiver argument. - args[0] = OpTy::from(ImmTy { - layout: this_receiver_ptr, - imm: receiver_place.ptr.into() - }); + args[0] = + OpTy::from(ImmTy { layout: this_receiver_ptr, imm: receiver_place.ptr.into() }); trace!("Patched self operand to {:#?}", args[0]); // recurse with concrete function self.eval_fn_call(drop_fn, span, caller_abi, &args, ret, unwind) @@ -431,33 +401,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } } - /// Evaluate a const function where all arguments (if any) are zero-sized types. - /// The evaluation is memoized thanks to the query system. - // FIXME: Consider moving this to `const_eval.rs`. - pub (crate) fn eval_const_fn_call( - &mut self, - gid: GlobalId<'tcx>, - ret: Option<(PlaceTy<'tcx, M::PointerTag>, mir::BasicBlock)>, - ) -> InterpResult<'tcx> { - trace!("eval_const_fn_call: {:?}", gid); - - let place = self.const_eval_raw(gid)?; - let dest = ret.ok_or_else(|| err_ub!(Unreachable))?.0; - - self.copy_op(place.into(), dest)?; - - self.return_to_block(ret.map(|r| r.1))?; - self.dump_place(*dest); - return Ok(()) - } - fn drop_in_place( &mut self, place: PlaceTy<'tcx, M::PointerTag>, instance: ty::Instance<'tcx>, span: Span, target: mir::BasicBlock, - unwind: Option + unwind: Option, ) -> InterpResult<'tcx> { trace!("drop_in_place: {:?},\n {:?}, {:?}", *place, place.layout.ty, instance); // We take the address of the object. This may well be unaligned, which is fine @@ -487,7 +437,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Abi::Rust, &[arg.into()], Some((dest.into(), target)), - unwind + unwind, ) } } diff --git a/src/librustc_mir/interpret/traits.rs b/src/librustc_mir/interpret/traits.rs index 916ea3dc39..efbbca5348 100644 --- a/src/librustc_mir/interpret/traits.rs +++ b/src/librustc_mir/interpret/traits.rs @@ -1,8 +1,8 @@ -use super::{InterpCx, Machine, MemoryKind, FnVal}; +use super::{FnVal, InterpCx, Machine, MemoryKind}; -use rustc::ty::{self, Ty, Instance, TypeFoldable}; -use rustc::ty::layout::{Size, Align, LayoutOf, HasDataLayout}; -use rustc::mir::interpret::{Scalar, Pointer, InterpResult, PointerArithmetic,}; +use rustc::mir::interpret::{InterpResult, Pointer, PointerArithmetic, Scalar}; +use rustc::ty::layout::{Align, HasDataLayout, LayoutOf, Size}; +use rustc::ty::{self, Instance, Ty, TypeFoldable}; impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Creates a dynamic vtable for the given type and vtable origin. This is used only for @@ -77,17 +77,17 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { for (i, method) in methods.iter().enumerate() { if let Some((def_id, substs)) = *method { // resolve for vtable: insert shims where needed - let instance = ty::Instance::resolve_for_vtable( - *tcx, - self.param_env, - def_id, - substs, - ).ok_or_else(|| err_inval!(TooGeneric))?; + let instance = + ty::Instance::resolve_for_vtable(*tcx, self.param_env, def_id, substs) + .ok_or_else(|| err_inval!(TooGeneric))?; let fn_ptr = self.memory.create_fn_alloc(FnVal::Instance(instance)); // We cannot use `vtable_allic` as we are creating fn ptrs in this loop. let method_ptr = vtable.offset(ptr_size * (3 + i as u64), tcx)?; - self.memory.get_raw_mut(vtable.alloc_id)? - .write_ptr_sized(tcx, method_ptr, fn_ptr.into())?; + self.memory.get_raw_mut(vtable.alloc_id)?.write_ptr_sized( + tcx, + method_ptr, + fn_ptr.into(), + )?; } } @@ -103,18 +103,20 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn get_vtable_slot( &self, vtable: Scalar, - idx: usize + idx: usize, ) -> InterpResult<'tcx, FnVal<'tcx, M::ExtraFnVal>> { let ptr_size = self.pointer_size(); // Skip over the 'drop_ptr', 'size', and 'align' fields. let vtable_slot = vtable.ptr_offset(ptr_size * (idx as u64 + 3), self)?; - let vtable_slot = self.memory.check_ptr_access( - vtable_slot, - ptr_size, - self.tcx.data_layout.pointer_align.abi, - )?.expect("cannot be a ZST"); - let fn_ptr = self.memory.get_raw(vtable_slot.alloc_id)? - .read_ptr_sized(self, vtable_slot)?.not_undef()?; + let vtable_slot = self + .memory + .check_ptr_access(vtable_slot, ptr_size, self.tcx.data_layout.pointer_align.abi)? + .expect("cannot be a ZST"); + let fn_ptr = self + .memory + .get_raw(vtable_slot.alloc_id)? + .read_ptr_sized(self, vtable_slot)? + .not_undef()?; Ok(self.memory.get_fn(fn_ptr)?) } @@ -124,33 +126,32 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { vtable: Scalar, ) -> InterpResult<'tcx, (ty::Instance<'tcx>, Ty<'tcx>)> { // We don't care about the pointee type; we just want a pointer. - let vtable = self.memory.check_ptr_access( - vtable, - self.tcx.data_layout.pointer_size, - self.tcx.data_layout.pointer_align.abi, - )?.expect("cannot be a ZST"); - let drop_fn = self.memory - .get_raw(vtable.alloc_id)? - .read_ptr_sized(self, vtable)? - .not_undef()?; + let vtable = self + .memory + .check_ptr_access( + vtable, + self.tcx.data_layout.pointer_size, + self.tcx.data_layout.pointer_align.abi, + )? + .expect("cannot be a ZST"); + let drop_fn = + self.memory.get_raw(vtable.alloc_id)?.read_ptr_sized(self, vtable)?.not_undef()?; // We *need* an instance here, no other kind of function value, to be able // to determine the type. let drop_instance = self.memory.get_fn(drop_fn)?.as_instance()?; trace!("Found drop fn: {:?}", drop_instance); - let fn_sig = drop_instance.ty(*self.tcx).fn_sig(*self.tcx); + let fn_sig = drop_instance.ty_env(*self.tcx, self.param_env).fn_sig(*self.tcx); let fn_sig = self.tcx.normalize_erasing_late_bound_regions(self.param_env, &fn_sig); // The drop function takes `*mut T` where `T` is the type being dropped, so get that. let args = fn_sig.inputs(); if args.len() != 1 { - throw_ub_format!( - "drop fn should have 1 argument, but signature is {:?}", fn_sig - ); + throw_ub_format!("drop fn should have 1 argument, but signature is {:?}", fn_sig); } - let ty = args[0].builtin_deref(true) - .ok_or_else(|| err_ub_format!( - "drop fn argument type {} is not a pointer type", - args[0] - ))? + let ty = args[0] + .builtin_deref(true) + .ok_or_else(|| { + err_ub_format!("drop fn argument type {} is not a pointer type", args[0]) + })? .ty; Ok((drop_instance, ty)) } @@ -162,26 +163,22 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let pointer_size = self.pointer_size(); // We check for `size = 3 * ptr_size`, which covers the drop fn (unused here), // the size, and the align (which we read below). - let vtable = self.memory.check_ptr_access( - vtable, - 3*pointer_size, - self.tcx.data_layout.pointer_align.abi, - )?.expect("cannot be a ZST"); + let vtable = self + .memory + .check_ptr_access(vtable, 3 * pointer_size, self.tcx.data_layout.pointer_align.abi)? + .expect("cannot be a ZST"); let alloc = self.memory.get_raw(vtable.alloc_id)?; - let size = alloc.read_ptr_sized( - self, - vtable.offset(pointer_size, self)? - )?.not_undef()?; + let size = alloc.read_ptr_sized(self, vtable.offset(pointer_size, self)?)?.not_undef()?; let size = self.force_bits(size, pointer_size)? as u64; - let align = alloc.read_ptr_sized( - self, - vtable.offset(pointer_size * 2, self)?, - )?.not_undef()?; + let align = + alloc.read_ptr_sized(self, vtable.offset(pointer_size * 2, self)?)?.not_undef()?; let align = self.force_bits(align, pointer_size)? as u64; if size >= self.tcx.data_layout().obj_size_bound() { - throw_ub_format!("invalid vtable: \ - size is bigger than largest supported object"); + throw_ub_format!( + "invalid vtable: \ + size is bigger than largest supported object" + ); } Ok((Size::from_bytes(size), Align::from_bytes(align).unwrap())) } diff --git a/src/librustc_mir/interpret/validity.rs b/src/librustc_mir/interpret/validity.rs index 448a2765fd..aa2b3040a7 100644 --- a/src/librustc_mir/interpret/validity.rs +++ b/src/librustc_mir/interpret/validity.rs @@ -7,16 +7,16 @@ use std::fmt::Write; use std::ops::RangeInclusive; -use rustc::hir; use rustc::ty; use rustc::ty::layout::{self, LayoutOf, TyLayout, VariantIdx}; use rustc_data_structures::fx::FxHashSet; -use syntax_pos::symbol::{sym, Symbol}; +use rustc_hir as hir; +use rustc_span::symbol::{sym, Symbol}; use std::hash::Hash; use super::{ - CheckInAllocMsg, GlobalAlloc, InterpCx, InterpResult, MPlaceTy, Machine, OpTy, Scalar, + CheckInAllocMsg, GlobalAlloc, InterpCx, InterpResult, MPlaceTy, Machine, MemPlaceMeta, OpTy, ValueVisitor, }; @@ -114,14 +114,11 @@ fn write_path(out: &mut String, path: &Vec) { ClosureVar(name) => write!(out, ".", name), TupleElem(idx) => write!(out, ".{}", idx), ArrayElem(idx) => write!(out, "[{}]", idx), - Deref => - // This does not match Rust syntax, but it is more readable for long paths -- and + // `.` does not match Rust syntax, but it is more readable for long paths -- and // some of the other items here also are not Rust syntax. Actually we can't // even use the usual syntax because we are just showing the projections, // not the root. - { - write!(out, ".") - } + Deref => write!(out, "."), Tag => write!(out, "."), DynDowncast => write!(out, "."), } @@ -206,9 +203,8 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, 'tcx, M ty::Adt(def, ..) if def.is_enum() => { // we might be projecting *to* a variant, or to a field *in*a variant. match layout.variants { - layout::Variants::Single { index } => - // Inside a variant - { + layout::Variants::Single { index } => { + // Inside a variant PathElem::Field(def.variants[index].fields[field].ident.name) } _ => bug!(), @@ -246,13 +242,13 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, 'tcx, M fn check_wide_ptr_meta( &mut self, - meta: Option>, + meta: MemPlaceMeta, pointee: TyLayout<'tcx>, ) -> InterpResult<'tcx> { let tail = self.ecx.tcx.struct_tail_erasing_lifetimes(pointee.ty, self.ecx.param_env); match tail.kind { ty::Dynamic(..) => { - let vtable = meta.unwrap(); + let vtable = meta.unwrap_meta(); try_validation!( self.ecx.memory.check_ptr_access( vtable, @@ -276,7 +272,7 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, 'tcx, M } ty::Slice(..) | ty::Str => { let _len = try_validation!( - meta.unwrap().to_machine_usize(self.ecx), + meta.unwrap_meta().to_machine_usize(self.ecx), "non-integer slice length in wide pointer", self.path ); @@ -571,7 +567,7 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> ) -> InterpResult<'tcx> { match op.layout.ty.kind { ty::Str => { - let mplace = op.assert_mem_place(); // strings are never immediate + let mplace = op.assert_mem_place(self.ecx); // strings are never immediate try_validation!( self.ecx.read_str(mplace), "uninitialized or non-UTF-8 data in str", @@ -587,34 +583,24 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> // padding. match tys.kind { ty::Int(..) | ty::Uint(..) | ty::Float(..) => true, - ty::Tuple(tys) if tys.len() == 0 => true, - ty::Adt(adt_def, _) - if adt_def.is_struct() && adt_def.all_fields().next().is_none() => - { - true - } _ => false, } } => { // Optimized handling for arrays of integer/float type. - // bailing out for zsts is ok, since the array element type can only be int/float - if op.layout.is_zst() { - return Ok(()); - } - // non-ZST array cannot be immediate, slices are never immediate - let mplace = op.assert_mem_place(); + // Arrays cannot be immediate, slices are never immediate. + let mplace = op.assert_mem_place(self.ecx); // This is the length of the array/slice. let len = mplace.len(self.ecx)?; - // zero length slices have nothing to be checked + // Zero length slices have nothing to be checked. if len == 0 { return Ok(()); } // This is the element type size. - let ty_size = self.ecx.layout_of(tys)?.size; + let layout = self.ecx.layout_of(tys)?; // This is the size in bytes of the whole array. - let size = ty_size * len; + let size = layout.size * len; // Size is not 0, get a pointer. let ptr = self.ecx.force_ptr(mplace.ptr)?; @@ -644,7 +630,7 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> // Some byte was undefined, determine which // element that byte belongs to so we can // provide an index. - let i = (offset.bytes() / ty_size.bytes()) as usize; + let i = (offset.bytes() / layout.size.bytes()) as usize; self.path.push(PathElem::ArrayElem(i)); throw_validation_failure!("undefined bytes", self.path) @@ -655,6 +641,13 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> } } } + // Fast path for arrays and slices of ZSTs. We only need to check a single ZST element + // of an array and not all of them, because there's only a single value of a specific + // ZST type, so either validation fails for all elements or none. + ty::Array(tys, ..) | ty::Slice(tys) if self.ecx.layout_of(tys)?.is_zst() => { + // Validate just the first element + self.walk_aggregate(op, fields.take(1))? + } _ => { self.walk_aggregate(op, fields)? // default handler } diff --git a/src/librustc_mir/interpret/visitor.rs b/src/librustc_mir/interpret/visitor.rs index 427f94f4fb..d2594e8707 100644 --- a/src/librustc_mir/interpret/visitor.rs +++ b/src/librustc_mir/interpret/visitor.rs @@ -1,15 +1,11 @@ //! Visitor for a run-time value with a given layout: Traverse enums, structs and other compound //! types until we arrive at the leaves, with custom handling for primitive types. -use rustc::ty::layout::{self, TyLayout, VariantIdx}; +use rustc::mir::interpret::InterpResult; use rustc::ty; -use rustc::mir::interpret::{ - InterpResult, -}; +use rustc::ty::layout::{self, TyLayout, VariantIdx}; -use super::{ - Machine, InterpCx, MPlaceTy, OpTy, -}; +use super::{InterpCx, MPlaceTy, Machine, OpTy}; // A thing that we can project into, and that has a layout. // This wouldn't have to depend on `Machine` but with the current type inference, @@ -19,10 +15,7 @@ pub trait Value<'mir, 'tcx, M: Machine<'mir, 'tcx>>: Copy { fn layout(&self) -> TyLayout<'tcx>; /// Makes this into an `OpTy`. - fn to_op( - self, - ecx: &InterpCx<'mir, 'tcx, M>, - ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>>; + fn to_op(self, ecx: &InterpCx<'mir, 'tcx, M>) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>>; /// Creates this from an `MPlaceTy`. fn from_mem_place(mplace: MPlaceTy<'tcx, M::PointerTag>) -> Self; @@ -35,11 +28,7 @@ pub trait Value<'mir, 'tcx, M: Machine<'mir, 'tcx>>: Copy { ) -> InterpResult<'tcx, Self>; /// Projects to the n-th field. - fn project_field( - self, - ecx: &InterpCx<'mir, 'tcx, M>, - field: u64, - ) -> InterpResult<'tcx, Self>; + fn project_field(self, ecx: &InterpCx<'mir, 'tcx, M>, field: u64) -> InterpResult<'tcx, Self>; } // Operands and memory-places are both values. @@ -73,11 +62,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> for OpTy<'tcx, M:: } #[inline(always)] - fn project_field( - self, - ecx: &InterpCx<'mir, 'tcx, M>, - field: u64, - ) -> InterpResult<'tcx, Self> { + fn project_field(self, ecx: &InterpCx<'mir, 'tcx, M>, field: u64) -> InterpResult<'tcx, Self> { ecx.operand_field(self, field) } } @@ -111,11 +96,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> for MPlaceTy<'tcx, } #[inline(always)] - fn project_field( - self, - ecx: &InterpCx<'mir, 'tcx, M>, - field: u64, - ) -> InterpResult<'tcx, Self> { + fn project_field(self, ecx: &InterpCx<'mir, 'tcx, M>, field: u64) -> InterpResult<'tcx, Self> { ecx.mplace_field(self, field) } } @@ -242,7 +223,7 @@ macro_rules! make_value_visitor { match v.layout().ty.kind { ty::Dynamic(..) => { // immediate trait objects are not a thing - let dest = v.to_op(self.ecx())?.assert_mem_place(); + let dest = v.to_op(self.ecx())?.assert_mem_place(self.ecx()); let inner = self.ecx().unpack_dyn_trait(dest)?.1; trace!("walk_value: dyn object layout: {:#?}", inner.layout); // recurse with the inner type @@ -311,13 +292,7 @@ macro_rules! make_value_visitor { }, layout::FieldPlacement::Array { .. } => { // Let's get an mplace first. - let mplace = if v.layout().is_zst() { - // it's a ZST, the memory content cannot matter - MPlaceTy::dangling(v.layout(), self.ecx()) - } else { - // non-ZST array/slice/str cannot be immediate - v.to_op(self.ecx())?.assert_mem_place() - }; + let mplace = v.to_op(self.ecx())?.assert_mem_place(self.ecx()); // Now we can go over all the fields. let iter = self.ecx().mplace_array_fields(mplace)? .map(|f| f.and_then(|f| { @@ -332,4 +307,4 @@ macro_rules! make_value_visitor { } make_value_visitor!(ValueVisitor,); -make_value_visitor!(MutValueVisitor,mut); +make_value_visitor!(MutValueVisitor, mut); diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs index f6b3c5b8e5..5e42ba3279 100644 --- a/src/librustc_mir/lib.rs +++ b/src/librustc_mir/lib.rs @@ -7,13 +7,12 @@ Rust MIR: a lowered representation of Rust. Also: an experiment! #![feature(nll)] #![feature(in_band_lifetimes)] #![feature(inner_deref)] -#![feature(slice_patterns)] +#![cfg_attr(bootstrap, feature(slice_patterns))] #![feature(bool_to_option)] #![feature(box_patterns)] #![feature(box_syntax)] #![feature(crate_visibility_modifier)] #![feature(core_intrinsics)] -#![feature(const_fn)] #![feature(decl_macro)] #![feature(drain_filter)] #![feature(exhaustive_patterns)] @@ -29,39 +28,39 @@ Rust MIR: a lowered representation of Rust. Also: an experiment! #![feature(range_is_empty)] #![feature(stmt_expr_attributes)] #![feature(trait_alias)] -#![feature(matches_macro)] +#![recursion_limit = "256"] -#![recursion_limit="256"] - -#[macro_use] extern crate log; -#[macro_use] extern crate rustc; -#[macro_use] extern crate syntax; +#[macro_use] +extern crate log; +#[macro_use] +extern crate rustc; mod borrow_check; -mod build; +pub mod const_eval; pub mod dataflow; -mod hair; -mod lints; +pub mod interpret; +pub mod monomorphize; mod shim; pub mod transform; pub mod util; -pub mod interpret; -pub mod monomorphize; -pub mod const_eval; use rustc::ty::query::Providers; pub fn provide(providers: &mut Providers<'_>) { borrow_check::provide(providers); + const_eval::provide(providers); shim::provide(providers); transform::provide(providers); monomorphize::partitioning::provide(providers); - providers.const_eval = const_eval::const_eval_provider; + providers.const_eval_validated = const_eval::const_eval_validated_provider; providers.const_eval_raw = const_eval::const_eval_raw_provider; - providers.check_match = hair::pattern::check_match; providers.const_caller_location = const_eval::const_caller_location; providers.const_field = |tcx, param_env_and_value| { let (param_env, (value, field)) = param_env_and_value.into_parts(); const_eval::const_field(tcx, param_env, None, field, value) }; + providers.destructure_const = |tcx, param_env_and_value| { + let (param_env, value) = param_env_and_value.into_parts(); + const_eval::destructure_const(tcx, param_env, value) + }; } diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 93a76712b2..dd2071a6c5 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -176,32 +176,31 @@ use crate::monomorphize; -use rustc::hir::{self, CodegenFnAttrFlags}; -use rustc::hir::itemlikevisit::ItemLikeVisitor; -use rustc::hir::def_id::{DefId, LOCAL_CRATE}; -use rustc::mir::interpret::{AllocId, ConstValue}; +use rustc::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc::middle::lang_items::{ExchangeMallocFnLangItem, StartFnLangItem}; -use rustc::ty::subst::{InternalSubsts, Subst, SubstsRef}; -use rustc::ty::{self, TypeFoldable, Ty, TyCtxt, GenericParamDefKind, Instance}; -use rustc::ty::print::obsolete::DefPathBasedNames; -use rustc::ty::adjustment::{CustomCoerceUnsized, PointerCast}; -use rustc::session::config::EntryFnType; -use rustc::mir::{self, Location, PlaceBase, Static, StaticKind}; +use rustc::mir::interpret::{AllocId, ConstValue}; +use rustc::mir::interpret::{ErrorHandled, GlobalAlloc, Scalar}; +use rustc::mir::mono::{InstantiationMode, MonoItem}; use rustc::mir::visit::Visitor as MirVisitor; -use rustc::mir::mono::{MonoItem, InstantiationMode}; -use rustc::mir::interpret::{Scalar, GlobalId, GlobalAlloc, ErrorHandled}; -use rustc::util::nodemap::{FxHashSet, FxHashMap, DefIdMap}; -use rustc::util::common::time; - +use rustc::mir::{self, Local, Location}; +use rustc::session::config::EntryFnType; +use rustc::ty::adjustment::{CustomCoerceUnsized, PointerCast}; +use rustc::ty::print::obsolete::DefPathBasedNames; +use rustc::ty::subst::{InternalSubsts, SubstsRef}; +use rustc::ty::{self, GenericParamDefKind, Instance, Ty, TyCtxt, TypeFoldable}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::sync::{par_iter, MTLock, MTRef, ParallelIterator}; +use rustc_hir as hir; +use rustc_hir::def_id::{DefId, DefIdMap, LOCAL_CRATE}; +use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_index::bit_set::GrowableBitSet; -use rustc_data_structures::sync::{MTRef, MTLock, ParallelIterator, par_iter}; - +use smallvec::SmallVec; use std::iter; #[derive(PartialEq)] pub enum MonoItemCollectionMode { Eager, - Lazy + Lazy, } /// Maps every mono item to all mono items it references in its @@ -220,7 +219,6 @@ pub struct InliningMap<'tcx> { } impl<'tcx> InliningMap<'tcx> { - fn new() -> InliningMap<'tcx> { InliningMap { index: FxHashMap::default(), @@ -229,13 +227,7 @@ impl<'tcx> InliningMap<'tcx> { } } - fn record_accesses(&mut self, - source: MonoItem<'tcx>, - new_targets: I) - where I: Iterator, bool)> + ExactSizeIterator - { - assert!(!self.index.contains_key(&source)); - + fn record_accesses(&mut self, source: MonoItem<'tcx>, new_targets: &[(MonoItem<'tcx>, bool)]) { let start_index = self.targets.len(); let new_items_count = new_targets.len(); let new_items_count_total = new_items_count + self.targets.len(); @@ -243,26 +235,25 @@ impl<'tcx> InliningMap<'tcx> { self.targets.reserve(new_items_count); self.inlines.ensure(new_items_count_total); - for (i, (target, inline)) in new_targets.enumerate() { - self.targets.push(target); - if inline { + for (i, (target, inline)) in new_targets.iter().enumerate() { + self.targets.push(*target); + if *inline { self.inlines.insert(i + start_index); } } let end_index = self.targets.len(); - self.index.insert(source, (start_index, end_index)); + assert!(self.index.insert(source, (start_index, end_index)).is_none()); } // Internally iterate over all items referenced by `source` which will be // made available for inlining. pub fn with_inlining_candidates(&self, source: MonoItem<'tcx>, mut f: F) - where F: FnMut(MonoItem<'tcx>) + where + F: FnMut(MonoItem<'tcx>), { if let Some(&(start_index, end_index)) = self.index.get(&source) { - for (i, candidate) in self.targets[start_index .. end_index] - .iter() - .enumerate() { + for (i, candidate) in self.targets[start_index..end_index].iter().enumerate() { if self.inlines.contains(start_index + i) { f(*candidate); } @@ -272,10 +263,11 @@ impl<'tcx> InliningMap<'tcx> { // Internally iterate over all items and the things each accesses. pub fn iter_accesses(&self, mut f: F) - where F: FnMut(MonoItem<'tcx>, &[MonoItem<'tcx>]) + where + F: FnMut(MonoItem<'tcx>, &[MonoItem<'tcx>]), { for (&accessor, &(start_index, end_index)) in &self.index { - f(accessor, &self.targets[start_index .. end_index]) + f(accessor, &self.targets[start_index..end_index]) } } } @@ -286,11 +278,8 @@ pub fn collect_crate_mono_items( ) -> (FxHashSet>, InliningMap<'_>) { let _prof_timer = tcx.prof.generic_activity("monomorphization_collector"); - let roots = time(tcx.sess, "collecting roots", || { - let _prof_timer = tcx.prof - .generic_activity("monomorphization_collector_root_collections"); - collect_roots(tcx, mode) - }); + let roots = + tcx.sess.time("monomorphization_collector_root_collections", || collect_roots(tcx, mode)); debug!("building mono item graph, beginning at roots"); @@ -298,20 +287,13 @@ pub fn collect_crate_mono_items( let mut inlining_map = MTLock::new(InliningMap::new()); { - let _prof_timer = tcx.prof - .generic_activity("monomorphization_collector_graph_walk"); - let visited: MTRef<'_, _> = &mut visited; let inlining_map: MTRef<'_, _> = &mut inlining_map; - time(tcx.sess, "collecting mono items", || { + tcx.sess.time("monomorphization_collector_graph_walk", || { par_iter(roots).for_each(|root| { let mut recursion_depths = DefIdMap::default(); - collect_items_rec(tcx, - root, - visited, - &mut recursion_depths, - inlining_map); + collect_items_rec(tcx, root, visited, &mut recursion_depths, inlining_map); }); }); } @@ -330,12 +312,7 @@ fn collect_roots(tcx: TyCtxt<'_>, mode: MonoItemCollectionMode) -> Vec( // Sanity check whether this ended up being collected accidentally debug_assert!(should_monomorphize_locally(tcx, &instance)); - let ty = instance.ty(tcx); + let ty = instance.monomorphic_ty(tcx); visit_drop_use(tcx, ty, true, &mut neighbors); recursion_depth_reset = None; - let cid = GlobalId { - instance, - promoted: None, - }; - let param_env = ty::ParamEnv::reveal_all(); - - if let Ok(val) = tcx.const_eval(param_env.and(cid)) { + if let Ok(val) = tcx.const_eval_poly(def_id) { collect_const(tcx, val, InternalSubsts::empty(), &mut neighbors); } } @@ -394,9 +365,7 @@ fn collect_items_rec<'tcx>( debug_assert!(should_monomorphize_locally(tcx, &instance)); // Keep track of the monomorphization recursion depth - recursion_depth_reset = Some(check_recursion_limit(tcx, - instance, - recursion_depths)); + recursion_depth_reset = Some(check_recursion_limit(tcx, instance, recursion_depths)); check_type_length_limit(tcx, instance); collect_neighbours(tcx, instance, &mut neighbors); @@ -429,12 +398,15 @@ fn record_accesses<'tcx>( mono_item.instantiation_mode(tcx) == InstantiationMode::LocalCopy }; - let accesses = callees.into_iter() - .map(|mono_item| { - (*mono_item, is_inlining_candidate(mono_item)) - }); + // We collect this into a `SmallVec` to avoid calling `is_inlining_candidate` in the lock. + // FIXME: Call `is_inlining_candidate` when pushing to `neighbors` in `collect_items_rec` + // instead to avoid creating this `SmallVec`. + let accesses: SmallVec<[_; 128]> = callees + .into_iter() + .map(|mono_item| (*mono_item, is_inlining_candidate(mono_item))) + .collect(); - inlining_map.lock_mut().record_accesses(caller, accesses); + inlining_map.lock_mut().record_accesses(caller, &accesses); } fn check_recursion_limit<'tcx>( @@ -446,7 +418,7 @@ fn check_recursion_limit<'tcx>( let recursion_depth = recursion_depths.get(&def_id).cloned().unwrap_or(0); debug!(" => recursion depth={}", recursion_depth); - let recursion_depth = if Some(def_id) == tcx.lang_items().drop_in_place_fn() { + let adjusted_recursion_depth = if Some(def_id) == tcx.lang_items().drop_in_place_fn() { // HACK: drop_in_place creates tight monomorphization loops. Give // it more margin. recursion_depth / 4 @@ -457,9 +429,8 @@ fn check_recursion_limit<'tcx>( // Code that needs to instantiate the same function recursively // more than the recursion limit is assumed to be causing an // infinite expansion. - if recursion_depth > *tcx.sess.recursion_limit.get() { - let error = format!("reached the recursion limit while instantiating `{}`", - instance); + if adjusted_recursion_depth > *tcx.sess.recursion_limit.get() { + let error = format!("reached the recursion limit while instantiating `{}`", instance); if let Some(hir_id) = tcx.hir().as_local_hir_id(def_id) { tcx.sess.span_fatal(tcx.hir().span(hir_id), &error); } else { @@ -504,18 +475,17 @@ fn check_type_length_limit<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) { // Only use the shrunk version if it's really shorter. // This also avoids the case where before and after slices overlap. - if shrunk.len() < s.len() { - shrunk - } else { - s - } + if shrunk.len() < s.len() { shrunk } else { s } }; - let msg = format!("reached the type-length limit while instantiating `{}`", - shrink(instance.to_string(), 32, 32)); + let msg = format!( + "reached the type-length limit while instantiating `{}`", + shrink(instance.to_string(), 32, 32) + ); let mut diag = tcx.sess.struct_span_fatal(tcx.def_span(instance.def_id()), &msg); diag.note(&format!( "consider adding a `#![type_length_limit=\"{}\"]` attribute to your crate", - type_length)); + type_length + )); diag.emit(); tcx.sess.abort_if_errors(); } @@ -537,7 +507,9 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { // have to instantiate all methods of the trait being cast to, so we // can build the appropriate vtable. mir::Rvalue::Cast( - mir::CastKind::Pointer(PointerCast::Unsize), ref operand, target_ty + mir::CastKind::Pointer(PointerCast::Unsize), + ref operand, + target_ty, ) => { let target_ty = self.tcx.subst_and_normalize_erasing_regions( self.param_substs, @@ -550,21 +522,24 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { ty::ParamEnv::reveal_all(), &source_ty, ); - let (source_ty, target_ty) = find_vtable_types_for_unsizing(self.tcx, - source_ty, - target_ty); + let (source_ty, target_ty) = + find_vtable_types_for_unsizing(self.tcx, source_ty, target_ty); // This could also be a different Unsize instruction, like // from a fixed sized array to a slice. But we are only // interested in things that produce a vtable. if target_ty.is_trait() && !source_ty.is_trait() { - create_mono_items_for_vtable_methods(self.tcx, - target_ty, - source_ty, - self.output); + create_mono_items_for_vtable_methods( + self.tcx, + target_ty, + source_ty, + self.output, + ); } } mir::Rvalue::Cast( - mir::CastKind::Pointer(PointerCast::ReifyFnPointer), ref operand, _ + mir::CastKind::Pointer(PointerCast::ReifyFnPointer), + ref operand, + _, ) => { let fn_ty = operand.ty(self.body, self.tcx); let fn_ty = self.tcx.subst_and_normalize_erasing_regions( @@ -575,7 +550,9 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { visit_fn_use(self.tcx, fn_ty, false, &mut self.output); } mir::Rvalue::Cast( - mir::CastKind::Pointer(PointerCast::ClosureFnPointer(_)), ref operand, _ + mir::CastKind::Pointer(PointerCast::ClosureFnPointer(_)), + ref operand, + _, ) => { let source_ty = operand.ty(self.body, self.tcx); let source_ty = self.tcx.subst_and_normalize_erasing_regions( @@ -586,8 +563,11 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { match source_ty.kind { ty::Closure(def_id, substs) => { let instance = Instance::resolve_closure( - self.tcx, def_id, - substs, ty::ClosureKind::FnOnce); + self.tcx, + def_id, + substs, + ty::ClosureKind::FnOnce, + ); if should_monomorphize_locally(self.tcx, &instance) { self.output.push(create_fn_mono_item(instance)); } @@ -620,9 +600,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { self.super_const(constant); } - fn visit_terminator_kind(&mut self, - kind: &mir::TerminatorKind<'tcx>, - location: Location) { + fn visit_terminator_kind(&mut self, kind: &mir::TerminatorKind<'tcx>, location: Location) { debug!("visiting terminator {:?} @ {:?}", kind, location); let tcx = self.tcx; @@ -636,8 +614,8 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { ); visit_fn_use(self.tcx, callee_ty, true, &mut self.output); } - mir::TerminatorKind::Drop { ref location, .. } | - mir::TerminatorKind::DropAndReplace { ref location, .. } => { + mir::TerminatorKind::Drop { ref location, .. } + | mir::TerminatorKind::DropAndReplace { ref location, .. } => { let ty = location.ty(self.body, self.tcx).ty; let ty = tcx.subst_and_normalize_erasing_regions( self.param_substs, @@ -646,59 +624,28 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { ); visit_drop_use(self.tcx, ty, true, self.output); } - mir::TerminatorKind::Goto { .. } | - mir::TerminatorKind::SwitchInt { .. } | - mir::TerminatorKind::Resume | - mir::TerminatorKind::Abort | - mir::TerminatorKind::Return | - mir::TerminatorKind::Unreachable | - mir::TerminatorKind::Assert { .. } => {} - mir::TerminatorKind::GeneratorDrop | - mir::TerminatorKind::Yield { .. } | - mir::TerminatorKind::FalseEdges { .. } | - mir::TerminatorKind::FalseUnwind { .. } => bug!(), + mir::TerminatorKind::Goto { .. } + | mir::TerminatorKind::SwitchInt { .. } + | mir::TerminatorKind::Resume + | mir::TerminatorKind::Abort + | mir::TerminatorKind::Return + | mir::TerminatorKind::Unreachable + | mir::TerminatorKind::Assert { .. } => {} + mir::TerminatorKind::GeneratorDrop + | mir::TerminatorKind::Yield { .. } + | mir::TerminatorKind::FalseEdges { .. } + | mir::TerminatorKind::FalseUnwind { .. } => bug!(), } self.super_terminator_kind(kind, location); } - fn visit_place_base(&mut self, - place_base: &mir::PlaceBase<'tcx>, - _context: mir::visit::PlaceContext, - location: Location) { - match place_base { - PlaceBase::Static(box Static { kind: StaticKind::Static, def_id, .. }) => { - debug!("visiting static {:?} @ {:?}", def_id, location); - - let tcx = self.tcx; - let instance = Instance::mono(tcx, *def_id); - if should_monomorphize_locally(tcx, &instance) { - self.output.push(MonoItem::Static(*def_id)); - } - } - PlaceBase::Static(box Static { - kind: StaticKind::Promoted(promoted, substs), - def_id, - .. - }) => { - let param_env = ty::ParamEnv::reveal_all(); - let cid = GlobalId { - instance: Instance::new(*def_id, substs.subst(self.tcx, self.param_substs)), - promoted: Some(*promoted), - }; - match self.tcx.const_eval(param_env.and(cid)) { - Ok(val) => collect_const(self.tcx, val, substs, self.output), - Err(ErrorHandled::Reported) => {}, - Err(ErrorHandled::TooGeneric) => { - let span = self.tcx.promoted_mir(*def_id)[*promoted].span; - span_bug!(span, "collection encountered polymorphic constant") - }, - } - } - PlaceBase::Local(_) => { - // Locals have no relevance for collector. - } - } + fn visit_place_base( + &mut self, + _place_local: &Local, + _context: mir::visit::PlaceContext, + _location: Location, + ) { } } @@ -719,11 +666,8 @@ fn visit_fn_use<'tcx>( output: &mut Vec>, ) { if let ty::FnDef(def_id, substs) = ty.kind { - let resolver = if is_direct_call { - ty::Instance::resolve - } else { - ty::Instance::resolve_for_fn_ptr - }; + let resolver = + if is_direct_call { ty::Instance::resolve } else { ty::Instance::resolve_for_fn_ptr }; let instance = resolver(tcx, ty::ParamEnv::reveal_all(), def_id, substs).unwrap(); visit_instance_use(tcx, instance, is_direct_call, output); } @@ -737,12 +681,11 @@ fn visit_instance_use<'tcx>( ) { debug!("visit_item_use({:?}, is_direct_call={:?})", instance, is_direct_call); if !should_monomorphize_locally(tcx, &instance) { - return + return; } match instance.def { - ty::InstanceDef::Virtual(..) | - ty::InstanceDef::Intrinsic(_) => { + ty::InstanceDef::Virtual(..) | ty::InstanceDef::Intrinsic(_) => { if !is_direct_call { bug!("{:?} being reified", instance); } @@ -753,13 +696,13 @@ fn visit_instance_use<'tcx>( output.push(create_fn_mono_item(instance)); } } - ty::InstanceDef::DropGlue(_, Some(_)) | - ty::InstanceDef::VtableShim(..) | - ty::InstanceDef::ReifyShim(..) | - ty::InstanceDef::ClosureOnceShim { .. } | - ty::InstanceDef::Item(..) | - ty::InstanceDef::FnPtrShim(..) | - ty::InstanceDef::CloneShim(..) => { + ty::InstanceDef::DropGlue(_, Some(_)) + | ty::InstanceDef::VtableShim(..) + | ty::InstanceDef::ReifyShim(..) + | ty::InstanceDef::ClosureOnceShim { .. } + | ty::InstanceDef::Item(..) + | ty::InstanceDef::FnPtrShim(..) + | ty::InstanceDef::CloneShim(..) => { output.push(create_fn_mono_item(instance)); } } @@ -770,29 +713,31 @@ fn visit_instance_use<'tcx>( // need a mono item. fn should_monomorphize_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: &Instance<'tcx>) -> bool { let def_id = match instance.def { - ty::InstanceDef::Item(def_id) => def_id, - ty::InstanceDef::VtableShim(..) | - ty::InstanceDef::ReifyShim(..) | - ty::InstanceDef::ClosureOnceShim { .. } | - ty::InstanceDef::Virtual(..) | - ty::InstanceDef::FnPtrShim(..) | - ty::InstanceDef::DropGlue(..) | - ty::InstanceDef::Intrinsic(_) | - ty::InstanceDef::CloneShim(..) => return true + ty::InstanceDef::Item(def_id) | ty::InstanceDef::DropGlue(def_id, Some(_)) => def_id, + + ty::InstanceDef::VtableShim(..) + | ty::InstanceDef::ReifyShim(..) + | ty::InstanceDef::ClosureOnceShim { .. } + | ty::InstanceDef::Virtual(..) + | ty::InstanceDef::FnPtrShim(..) + | ty::InstanceDef::DropGlue(..) + | ty::InstanceDef::Intrinsic(_) + | ty::InstanceDef::CloneShim(..) => return true, }; if tcx.is_foreign_item(def_id) { - // We can always link to foreign items. + // Foreign items are always linked against, there's no way of + // instantiating them. return false; } if def_id.is_local() { - // Local items cannot be referred to locally without monomorphizing them locally. + // Local items cannot be referred to locally without + // monomorphizing them locally. return true; } - if tcx.is_reachable_non_generic(def_id) || - is_available_upstream_generic(tcx, def_id, instance.substs) { + if tcx.is_reachable_non_generic(def_id) || instance.upstream_monomorphization(tcx).is_some() { // We can link to the item in question, no instance needed // in this crate. return false; @@ -801,35 +746,8 @@ fn should_monomorphize_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: &Instance<'tcx if !tcx.is_mir_available(def_id) { bug!("cannot create local mono-item for {:?}", def_id) } - return true; - - fn is_available_upstream_generic<'tcx>( - tcx: TyCtxt<'tcx>, - def_id: DefId, - substs: SubstsRef<'tcx>, - ) -> bool { - debug_assert!(!def_id.is_local()); - - // If we are not in share generics mode, we don't link to upstream - // monomorphizations but always instantiate our own internal versions - // instead. - if !tcx.sess.opts.share_generics() { - return false - } - - // If this instance has non-erasable parameters, it cannot be a shared - // monomorphization. Non-generic instances are already handled above - // by `is_reachable_non_generic()`. - if substs.non_erasable_generics().next().is_none() { - return false - } - // Take a look at the available monomorphizations listed in the metadata - // of upstream crates. - tcx.upstream_monomorphizations_for(def_id) - .map(|set| set.contains_key(substs)) - .unwrap_or(false) - } + return true; } /// For a given pair of source and target type that occur in an unsizing coercion, @@ -877,7 +795,7 @@ fn find_vtable_types_for_unsizing<'tcx>( let ptr_vtable = |inner_source: Ty<'tcx>, inner_target: Ty<'tcx>| { let param_env = ty::ParamEnv::reveal_all(); let type_has_metadata = |ty: Ty<'tcx>| -> bool { - use syntax_pos::DUMMY_SP; + use rustc_span::DUMMY_SP; if ty.is_sized(tcx.at(DUMMY_SP), param_env) { return false; } @@ -896,43 +814,42 @@ fn find_vtable_types_for_unsizing<'tcx>( }; match (&source_ty.kind, &target_ty.kind) { - (&ty::Ref(_, a, _), - &ty::Ref(_, b, _)) | - (&ty::Ref(_, a, _), - &ty::RawPtr(ty::TypeAndMut { ty: b, .. })) | - (&ty::RawPtr(ty::TypeAndMut { ty: a, .. }), - &ty::RawPtr(ty::TypeAndMut { ty: b, .. })) => { + (&ty::Ref(_, a, _), &ty::Ref(_, b, _)) + | (&ty::Ref(_, a, _), &ty::RawPtr(ty::TypeAndMut { ty: b, .. })) + | (&ty::RawPtr(ty::TypeAndMut { ty: a, .. }), &ty::RawPtr(ty::TypeAndMut { ty: b, .. })) => { ptr_vtable(a, b) } (&ty::Adt(def_a, _), &ty::Adt(def_b, _)) if def_a.is_box() && def_b.is_box() => { ptr_vtable(source_ty.boxed_ty(), target_ty.boxed_ty()) } - (&ty::Adt(source_adt_def, source_substs), - &ty::Adt(target_adt_def, target_substs)) => { + (&ty::Adt(source_adt_def, source_substs), &ty::Adt(target_adt_def, target_substs)) => { assert_eq!(source_adt_def, target_adt_def); - let kind = - monomorphize::custom_coerce_unsize_info(tcx, source_ty, target_ty); + let kind = monomorphize::custom_coerce_unsize_info(tcx, source_ty, target_ty); let coerce_index = match kind { - CustomCoerceUnsized::Struct(i) => i + CustomCoerceUnsized::Struct(i) => i, }; let source_fields = &source_adt_def.non_enum_variant().fields; let target_fields = &target_adt_def.non_enum_variant().fields; - assert!(coerce_index < source_fields.len() && - source_fields.len() == target_fields.len()); + assert!( + coerce_index < source_fields.len() && source_fields.len() == target_fields.len() + ); - find_vtable_types_for_unsizing(tcx, + find_vtable_types_for_unsizing( + tcx, source_fields[coerce_index].ty(tcx, source_substs), - target_fields[coerce_index].ty(tcx, target_substs) + target_fields[coerce_index].ty(tcx, target_substs), ) } - _ => bug!("find_vtable_types_for_unsizing: invalid coercion {:?} -> {:?}", - source_ty, - target_ty) + _ => bug!( + "find_vtable_types_for_unsizing: invalid coercion {:?} -> {:?}", + source_ty, + target_ty + ), } } @@ -949,8 +866,12 @@ fn create_mono_items_for_vtable_methods<'tcx>( impl_ty: Ty<'tcx>, output: &mut Vec>, ) { - assert!(!trait_ty.needs_subst() && !trait_ty.has_escaping_bound_vars() && - !impl_ty.needs_subst() && !impl_ty.has_escaping_bound_vars()); + assert!( + !trait_ty.needs_subst() + && !trait_ty.has_escaping_bound_vars() + && !impl_ty.needs_subst() + && !impl_ty.has_escaping_bound_vars() + ); if let ty::Dynamic(ref trait_ty, ..) = trait_ty.kind { if let Some(principal) = trait_ty.principal() { @@ -959,12 +880,19 @@ fn create_mono_items_for_vtable_methods<'tcx>( // Walk all methods of the trait, including those of its supertraits let methods = tcx.vtable_methods(poly_trait_ref); - let methods = methods.iter().cloned().filter_map(|method| method) - .map(|(def_id, substs)| ty::Instance::resolve_for_vtable( - tcx, - ty::ParamEnv::reveal_all(), - def_id, - substs).unwrap()) + let methods = methods + .iter() + .cloned() + .filter_map(|method| method) + .map(|(def_id, substs)| { + ty::Instance::resolve_for_vtable( + tcx, + ty::ParamEnv::reveal_all(), + def_id, + substs, + ) + .unwrap() + }) .filter(|&instance| should_monomorphize_locally(tcx, &instance)) .map(|instance| create_fn_mono_item(instance)); output.extend(methods); @@ -987,51 +915,52 @@ struct RootCollector<'a, 'tcx> { } impl ItemLikeVisitor<'v> for RootCollector<'_, 'v> { - fn visit_item(&mut self, item: &'v hir::Item) { + fn visit_item(&mut self, item: &'v hir::Item<'v>) { match item.kind { - hir::ItemKind::ExternCrate(..) | - hir::ItemKind::Use(..) | - hir::ItemKind::ForeignMod(..) | - hir::ItemKind::TyAlias(..) | - hir::ItemKind::Trait(..) | - hir::ItemKind::TraitAlias(..) | - hir::ItemKind::OpaqueTy(..) | - hir::ItemKind::Mod(..) => { + hir::ItemKind::ExternCrate(..) + | hir::ItemKind::Use(..) + | hir::ItemKind::ForeignMod(..) + | hir::ItemKind::TyAlias(..) + | hir::ItemKind::Trait(..) + | hir::ItemKind::TraitAlias(..) + | hir::ItemKind::OpaqueTy(..) + | hir::ItemKind::Mod(..) => { // Nothing to do, just keep recursing. } - hir::ItemKind::Impl(..) => { + hir::ItemKind::Impl { .. } => { if self.mode == MonoItemCollectionMode::Eager { - create_mono_items_for_default_impls(self.tcx, - item, - self.output); + create_mono_items_for_default_impls(self.tcx, item, self.output); } } - hir::ItemKind::Enum(_, ref generics) | - hir::ItemKind::Struct(_, ref generics) | - hir::ItemKind::Union(_, ref generics) => { + hir::ItemKind::Enum(_, ref generics) + | hir::ItemKind::Struct(_, ref generics) + | hir::ItemKind::Union(_, ref generics) => { if generics.params.is_empty() { if self.mode == MonoItemCollectionMode::Eager { let def_id = self.tcx.hir().local_def_id(item.hir_id); - debug!("RootCollector: ADT drop-glue for {}", - def_id_to_string(self.tcx, def_id)); + debug!( + "RootCollector: ADT drop-glue for {}", + def_id_to_string(self.tcx, def_id) + ); - let ty = Instance::new(def_id, InternalSubsts::empty()).ty(self.tcx); + let ty = + Instance::new(def_id, InternalSubsts::empty()).monomorphic_ty(self.tcx); visit_drop_use(self.tcx, ty, true, self.output); } } } hir::ItemKind::GlobalAsm(..) => { - debug!("RootCollector: ItemKind::GlobalAsm({})", - def_id_to_string(self.tcx, - self.tcx.hir().local_def_id(item.hir_id))); + debug!( + "RootCollector: ItemKind::GlobalAsm({})", + def_id_to_string(self.tcx, self.tcx.hir().local_def_id(item.hir_id)) + ); self.output.push(MonoItem::GlobalAsm(item.hir_id)); } hir::ItemKind::Static(..) => { let def_id = self.tcx.hir().local_def_id(item.hir_id); - debug!("RootCollector: ItemKind::Static({})", - def_id_to_string(self.tcx, def_id)); + debug!("RootCollector: ItemKind::Static({})", def_id_to_string(self.tcx, def_id)); self.output.push(MonoItem::Static(def_id)); } hir::ItemKind::Const(..) => { @@ -1041,14 +970,7 @@ impl ItemLikeVisitor<'v> for RootCollector<'_, 'v> { // but even just declaring them must collect the items they refer to let def_id = self.tcx.hir().local_def_id(item.hir_id); - let instance = Instance::mono(self.tcx, def_id); - let cid = GlobalId { - instance, - promoted: None, - }; - let param_env = ty::ParamEnv::reveal_all(); - - if let Ok(val) = self.tcx.const_eval(param_env.and(cid)) { + if let Ok(val) = self.tcx.const_eval_poly(def_id) { collect_const(self.tcx, val, InternalSubsts::empty(), &mut self.output); } } @@ -1059,12 +981,12 @@ impl ItemLikeVisitor<'v> for RootCollector<'_, 'v> { } } - fn visit_trait_item(&mut self, _: &'v hir::TraitItem) { + fn visit_trait_item(&mut self, _: &'v hir::TraitItem<'v>) { // Even if there's a default body with no explicit generics, // it's still generic over some `Self: Trait`, so not a root. } - fn visit_impl_item(&mut self, ii: &'v hir::ImplItem) { + fn visit_impl_item(&mut self, ii: &'v hir::ImplItem<'v>) { match ii.kind { hir::ImplItemKind::Method(hir::FnSig { .. }, _) => { let def_id = self.tcx.hir().local_def_id(ii.hir_id); @@ -1077,17 +999,19 @@ impl ItemLikeVisitor<'v> for RootCollector<'_, 'v> { impl RootCollector<'_, 'v> { fn is_root(&self, def_id: DefId) -> bool { - !item_requires_monomorphization(self.tcx, def_id) && match self.mode { - MonoItemCollectionMode::Eager => { - true - } - MonoItemCollectionMode::Lazy => { - self.entry_fn.map(|(id, _)| id) == Some(def_id) || - self.tcx.is_reachable_non_generic(def_id) || - self.tcx.codegen_fn_attrs(def_id).flags.contains( - CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL) + !item_requires_monomorphization(self.tcx, def_id) + && match self.mode { + MonoItemCollectionMode::Eager => true, + MonoItemCollectionMode::Lazy => { + self.entry_fn.map(|(id, _)| id) == Some(def_id) + || self.tcx.is_reachable_non_generic(def_id) + || self + .tcx + .codegen_fn_attrs(def_id) + .flags + .contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL) + } } - } } /// If `def_id` represents a root, pushes it onto the list of @@ -1123,16 +1047,15 @@ impl RootCollector<'_, 'v> { // late-bound regions, since late-bound // regions must appear in the argument // listing. - let main_ret_ty = self.tcx.erase_regions( - &main_ret_ty.no_bound_vars().unwrap(), - ); + let main_ret_ty = self.tcx.erase_regions(&main_ret_ty.no_bound_vars().unwrap()); let start_instance = Instance::resolve( self.tcx, ty::ParamEnv::reveal_all(), start_def_id, - self.tcx.intern_substs(&[main_ret_ty.into()]) - ).unwrap(); + self.tcx.intern_substs(&[main_ret_ty.into()]), + ) + .unwrap(); self.output.push(create_fn_mono_item(start_instance)); } @@ -1145,36 +1068,32 @@ fn item_requires_monomorphization(tcx: TyCtxt<'_>, def_id: DefId) -> bool { fn create_mono_items_for_default_impls<'tcx>( tcx: TyCtxt<'tcx>, - item: &'tcx hir::Item, + item: &'tcx hir::Item<'tcx>, output: &mut Vec>, ) { match item.kind { - hir::ItemKind::Impl(_, _, _, ref generics, .., ref impl_item_refs) => { - for param in &generics.params { + hir::ItemKind::Impl { ref generics, ref items, .. } => { + for param in generics.params { match param.kind { hir::GenericParamKind::Lifetime { .. } => {} - hir::GenericParamKind::Type { .. } | - hir::GenericParamKind::Const { .. } => { - return + hir::GenericParamKind::Type { .. } | hir::GenericParamKind::Const { .. } => { + return; } } } let impl_def_id = tcx.hir().local_def_id(item.hir_id); - debug!("create_mono_items_for_default_impls(item={})", - def_id_to_string(tcx, impl_def_id)); + debug!( + "create_mono_items_for_default_impls(item={})", + def_id_to_string(tcx, impl_def_id) + ); if let Some(trait_ref) = tcx.impl_trait_ref(impl_def_id) { let param_env = ty::ParamEnv::reveal_all(); - let trait_ref = tcx.normalize_erasing_regions( - param_env, - trait_ref, - ); + let trait_ref = tcx.normalize_erasing_regions(param_env, trait_ref); let overridden_methods: FxHashSet<_> = - impl_item_refs.iter() - .map(|iiref| iiref.ident.modern()) - .collect(); + items.iter().map(|iiref| iiref.ident.modern()).collect(); for method in tcx.provided_trait_methods(trait_ref.def_id) { if overridden_methods.contains(&method.ident.modern()) { continue; @@ -1184,31 +1103,25 @@ fn create_mono_items_for_default_impls<'tcx>( continue; } - let substs = InternalSubsts::for_item(tcx, method.def_id, |param, _| { - match param.kind { + let substs = + InternalSubsts::for_item(tcx, method.def_id, |param, _| match param.kind { GenericParamDefKind::Lifetime => tcx.lifetimes.re_erased.into(), - GenericParamDefKind::Type { .. } | - GenericParamDefKind::Const => { + GenericParamDefKind::Type { .. } | GenericParamDefKind::Const => { trait_ref.substs[param.index as usize] } - } - }); - let instance = ty::Instance::resolve(tcx, - param_env, - method.def_id, - substs).unwrap(); + }); + let instance = + ty::Instance::resolve(tcx, param_env, method.def_id, substs).unwrap(); let mono_item = create_fn_mono_item(instance); - if mono_item.is_instantiable(tcx) - && should_monomorphize_locally(tcx, &instance) { + if mono_item.is_instantiable(tcx) && should_monomorphize_locally(tcx, &instance) + { output.push(mono_item); } } } } - _ => { - bug!() - } + _ => bug!(), } } @@ -1228,7 +1141,7 @@ fn collect_miri<'tcx>(tcx: TyCtxt<'tcx>, alloc_id: AllocId, output: &mut Vec { if should_monomorphize_locally(tcx, &fn_instance) { trace!("collecting {:?} with {:#?}", alloc_id, fn_instance); @@ -1248,12 +1161,8 @@ fn collect_neighbours<'tcx>( debug!("collect_neighbours: {:?}", instance.def_id()); let body = tcx.instance_mir(instance.def); - MirNeighborCollector { - tcx, - body: &body, - output, - param_substs: instance.substs, - }.visit_body(body); + MirNeighborCollector { tcx, body: &body, output, param_substs: instance.substs } + .visit_body(body); } fn def_id_to_string(tcx: TyCtxt<'_>, def_id: DefId) -> String { @@ -1272,39 +1181,28 @@ fn collect_const<'tcx>( debug!("visiting const {:?}", constant); let param_env = ty::ParamEnv::reveal_all(); - let substituted_constant = tcx.subst_and_normalize_erasing_regions( - param_substs, - param_env, - &constant, - ); + let substituted_constant = + tcx.subst_and_normalize_erasing_regions(param_substs, param_env, &constant); match substituted_constant.val { - ty::ConstKind::Value(ConstValue::Scalar(Scalar::Ptr(ptr))) => - collect_miri(tcx, ptr.alloc_id, output), - ty::ConstKind::Value(ConstValue::Slice { data: alloc, start: _, end: _ }) | - ty::ConstKind::Value(ConstValue::ByRef { alloc, .. }) => { + ty::ConstKind::Value(ConstValue::Scalar(Scalar::Ptr(ptr))) => { + collect_miri(tcx, ptr.alloc_id, output) + } + ty::ConstKind::Value(ConstValue::Slice { data: alloc, start: _, end: _ }) + | ty::ConstKind::Value(ConstValue::ByRef { alloc, .. }) => { for &((), id) in alloc.relocations().values() { collect_miri(tcx, id, output); } } - ty::ConstKind::Unevaluated(def_id, substs) => { - let instance = ty::Instance::resolve(tcx, - param_env, - def_id, - substs).unwrap(); - - let cid = GlobalId { - instance, - promoted: None, - }; - match tcx.const_eval(param_env.and(cid)) { + ty::ConstKind::Unevaluated(def_id, substs, promoted) => { + match tcx.const_eval_resolve(param_env, def_id, substs, promoted, None) { Ok(val) => collect_const(tcx, val, param_substs, output), - Err(ErrorHandled::Reported) => {}, - Err(ErrorHandled::TooGeneric) => span_bug!( - tcx.def_span(def_id), "collection encountered polymorphic constant", - ), + Err(ErrorHandled::Reported) => {} + Err(ErrorHandled::TooGeneric) => { + span_bug!(tcx.def_span(def_id), "collection encountered polymorphic constant",) + } } - }, - _ => {}, + } + _ => {} } } diff --git a/src/librustc_mir/monomorphize/mod.rs b/src/librustc_mir/monomorphize/mod.rs index db8caed629..8bc63bfcfc 100644 --- a/src/librustc_mir/monomorphize/mod.rs +++ b/src/librustc_mir/monomorphize/mod.rs @@ -14,10 +14,10 @@ pub fn custom_coerce_unsize_info<'tcx>( let trait_ref = ty::Binder::bind(ty::TraitRef { def_id: def_id, - substs: tcx.mk_substs_trait(source_ty, &[target_ty.into()]) + substs: tcx.mk_substs_trait(source_ty, &[target_ty.into()]), }); - match tcx.codegen_fulfill_obligation( (ty::ParamEnv::reveal_all(), trait_ref)) { + match tcx.codegen_fulfill_obligation((ty::ParamEnv::reveal_all(), trait_ref)) { traits::VtableImpl(traits::VtableImplData { impl_def_id, .. }) => { tcx.coerce_unsized_info(impl_def_id).custom_kind.unwrap() } diff --git a/src/librustc_mir/monomorphize/partitioning.rs b/src/librustc_mir/monomorphize/partitioning.rs index 591f220549..de45808a48 100644 --- a/src/librustc_mir/monomorphize/partitioning.rs +++ b/src/librustc_mir/monomorphize/partitioning.rs @@ -92,22 +92,22 @@ //! source-level module, functions from the same module will be available for //! inlining, even when they are not marked `#[inline]`. -use std::collections::hash_map::Entry; use std::cmp; +use std::collections::hash_map::Entry; use std::sync::Arc; -use syntax::symbol::Symbol; -use rustc::hir::CodegenFnAttrFlags; -use rustc::hir::def::DefKind; -use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE, CRATE_DEF_INDEX}; -use rustc::mir::mono::{Linkage, Visibility, CodegenUnitNameBuilder, CodegenUnit}; +use rustc::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc::middle::exported_symbols::SymbolExportLevel; -use rustc::ty::{self, DefIdTree, TyCtxt, InstanceDef}; +use rustc::mir::mono::{CodegenUnit, CodegenUnitNameBuilder, Linkage, Visibility}; +use rustc::mir::mono::{InstantiationMode, MonoItem}; use rustc::ty::print::characteristic_def_id_of_type; use rustc::ty::query::Providers; -use rustc::util::common::time; -use rustc::util::nodemap::{DefIdSet, FxHashMap, FxHashSet}; -use rustc::mir::mono::{MonoItem, InstantiationMode}; +use rustc::ty::{self, DefIdTree, InstanceDef, TyCtxt}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::sync; +use rustc_hir::def::DefKind; +use rustc_hir::def_id::{CrateNum, DefId, DefIdSet, CRATE_DEF_INDEX, LOCAL_CRATE}; +use rustc_span::symbol::Symbol; use crate::monomorphize::collector::InliningMap; use crate::monomorphize::collector::{self, MonoItemCollectionMode}; @@ -117,7 +117,7 @@ pub enum PartitioningStrategy { PerModule, /// Partition the whole crate into a fixed number of codegen units. - FixedUnitCount(usize) + FixedUnitCount(usize), } // Anything we can't find a proper codegen unit for goes into this. @@ -161,8 +161,7 @@ where // monomorphizations can be drop-glue, functions from external crates, and // local functions the definition of which is marked with `#[inline]`. let mut post_inlining = { - let _prof_timer = - tcx.prof.generic_activity("cgu_partitioning_place_inline_items"); + let _prof_timer = tcx.prof.generic_activity("cgu_partitioning_place_inline_items"); place_inlined_mono_items(initial_partitioning, inlining_map) }; @@ -173,8 +172,7 @@ where // Next we try to make as many symbols "internal" as possible, so LLVM has // more freedom to optimize. if !tcx.sess.opts.cg.link_dead_code { - let _prof_timer = - tcx.prof.generic_activity("cgu_partitioning_internalize_symbols"); + let _prof_timer = tcx.prof.generic_activity("cgu_partitioning_internalize_symbols"); internalize_symbols(tcx, &mut post_inlining, inlining_map); } @@ -224,8 +222,7 @@ where // available to downstream crates. This depends on whether we are in // share-generics mode and whether the current crate can even have // downstream crates. - let export_generics = tcx.sess.opts.share_generics() && - tcx.local_crate_exports_generics(); + let export_generics = tcx.sess.opts.share_generics() && tcx.local_crate_exports_generics(); let cgu_name_builder = &mut CodegenUnitNameBuilder::new(tcx); let cgu_name_cache = &mut FxHashMap::default(); @@ -237,19 +234,21 @@ where } let characteristic_def_id = characteristic_def_id_of_mono_item(tcx, mono_item); - let is_volatile = is_incremental_build && - mono_item.is_generic_fn(); + let is_volatile = is_incremental_build && mono_item.is_generic_fn(); let codegen_unit_name = match characteristic_def_id { - Some(def_id) => compute_codegen_unit_name(tcx, - cgu_name_builder, - def_id, - is_volatile, - cgu_name_cache), + Some(def_id) => compute_codegen_unit_name( + tcx, + cgu_name_builder, + def_id, + is_volatile, + cgu_name_cache, + ), None => fallback_cgu_name(cgu_name_builder), }; - let codegen_unit = codegen_units.entry(codegen_unit_name) + let codegen_unit = codegen_units + .entry(codegen_unit_name) .or_insert_with(|| CodegenUnit::new(codegen_unit_name)); let mut can_be_internalized = true; @@ -275,9 +274,7 @@ where } PreInliningPartitioning { - codegen_units: codegen_units.into_iter() - .map(|(_, codegen_unit)| codegen_unit) - .collect(), + codegen_units: codegen_units.into_iter().map(|(_, codegen_unit)| codegen_unit).collect(), roots, internalization_candidates, } @@ -290,14 +287,9 @@ fn mono_item_linkage_and_visibility( export_generics: bool, ) -> (Linkage, Visibility) { if let Some(explicit_linkage) = mono_item.explicit_linkage(tcx) { - return (explicit_linkage, Visibility::Default) + return (explicit_linkage, Visibility::Default); } - let vis = mono_item_visibility( - tcx, - mono_item, - can_be_internalized, - export_generics, - ); + let vis = mono_item_visibility(tcx, mono_item, can_be_internalized, export_generics); (Linkage::External, vis) } @@ -332,19 +324,17 @@ fn mono_item_visibility( }; let def_id = match instance.def { - InstanceDef::Item(def_id) => def_id, + InstanceDef::Item(def_id) | InstanceDef::DropGlue(def_id, Some(_)) => def_id, // These are all compiler glue and such, never exported, always hidden. - InstanceDef::VtableShim(..) | - InstanceDef::ReifyShim(..) | - InstanceDef::FnPtrShim(..) | - InstanceDef::Virtual(..) | - InstanceDef::Intrinsic(..) | - InstanceDef::ClosureOnceShim { .. } | - InstanceDef::DropGlue(..) | - InstanceDef::CloneShim(..) => { - return Visibility::Hidden - } + InstanceDef::VtableShim(..) + | InstanceDef::ReifyShim(..) + | InstanceDef::FnPtrShim(..) + | InstanceDef::Virtual(..) + | InstanceDef::Intrinsic(..) + | InstanceDef::ClosureOnceShim { .. } + | InstanceDef::DropGlue(..) + | InstanceDef::CloneShim(..) => return Visibility::Hidden, }; // The `start_fn` lang item is actually a monomorphized instance of a @@ -362,7 +352,7 @@ fn mono_item_visibility( // This may be fixable with a new `InstanceDef` perhaps? Unsure! if tcx.lang_items().start_fn() == Some(def_id) { *can_be_internalized = false; - return Visibility::Hidden + return Visibility::Hidden; } let is_generic = instance.substs.non_erasable_generics().next().is_some(); @@ -376,7 +366,7 @@ fn mono_item_visibility( default_visibility(tcx, def_id, true) } else { Visibility::Hidden - } + }; } if is_generic { @@ -395,14 +385,13 @@ fn mono_item_visibility( Visibility::Hidden } } else { - // If this isn't a generic function then we mark this a `Default` if // this is a reachable item, meaning that it's a symbol other crates may // access when they link to us. if tcx.is_reachable_non_generic(def_id) { *can_be_internalized = false; debug_assert!(!is_generic); - return default_visibility(tcx, def_id, false) + return default_visibility(tcx, def_id, false); } // If this isn't reachable then we're gonna tag this with `Hidden` @@ -450,18 +439,18 @@ fn mono_item_visibility( fn default_visibility(tcx: TyCtxt<'_>, id: DefId, is_generic: bool) -> Visibility { if !tcx.sess.target.target.options.default_hidden_visibility { - return Visibility::Default + return Visibility::Default; } // Generic functions never have export-level C. if is_generic { - return Visibility::Hidden + return Visibility::Hidden; } // Things with export level C don't get instantiated in // downstream crates. if !id.is_local() { - return Visibility::Hidden + return Visibility::Hidden; } // C-export level items remain at `Default`, all other internal @@ -502,9 +491,11 @@ fn merge_codegen_units<'tcx>( for (k, v) in smallest.items_mut().drain() { second_smallest.items_mut().insert(k, v); } - debug!("CodegenUnit {} merged in to CodegenUnit {}", - smallest.name(), - second_smallest.name()); + debug!( + "CodegenUnit {} merged in to CodegenUnit {}", + smallest.name(), + second_smallest.name() + ); } let cgu_name_builder = &mut CodegenUnitNameBuilder::new(tcx); @@ -513,17 +504,15 @@ fn merge_codegen_units<'tcx>( } } -fn place_inlined_mono_items<'tcx>(initial_partitioning: PreInliningPartitioning<'tcx>, - inlining_map: &InliningMap<'tcx>) - -> PostInliningPartitioning<'tcx> { +fn place_inlined_mono_items<'tcx>( + initial_partitioning: PreInliningPartitioning<'tcx>, + inlining_map: &InliningMap<'tcx>, +) -> PostInliningPartitioning<'tcx> { let mut new_partitioning = Vec::new(); let mut mono_item_placements = FxHashMap::default(); - let PreInliningPartitioning { - codegen_units: initial_cgus, - roots, - internalization_candidates, - } = initial_partitioning; + let PreInliningPartitioning { codegen_units: initial_cgus, roots, internalization_candidates } = + initial_partitioning; let single_codegen_unit = initial_cgus.len() == 1; @@ -543,15 +532,17 @@ fn place_inlined_mono_items<'tcx>(initial_partitioning: PreInliningPartitioning< new_codegen_unit.items_mut().insert(mono_item, *linkage); } else { if roots.contains(&mono_item) { - bug!("GloballyShared mono-item inlined into other CGU: \ - {:?}", mono_item); + bug!( + "GloballyShared mono-item inlined into other CGU: \ + {:?}", + mono_item + ); } // This is a CGU-private copy. - new_codegen_unit.items_mut().insert( - mono_item, - (Linkage::Internal, Visibility::Default), - ); + new_codegen_unit + .items_mut() + .insert(mono_item, (Linkage::Internal, Visibility::Default)); } if !single_codegen_unit { @@ -570,7 +561,7 @@ fn place_inlined_mono_items<'tcx>(initial_partitioning: PreInliningPartitioning< } Entry::Vacant(e) => { e.insert(MonoItemPlacement::SingleCgu { - cgu_name: new_codegen_unit.name() + cgu_name: new_codegen_unit.name(), }); } } @@ -586,9 +577,11 @@ fn place_inlined_mono_items<'tcx>(initial_partitioning: PreInliningPartitioning< internalization_candidates, }; - fn follow_inlining<'tcx>(mono_item: MonoItem<'tcx>, - inlining_map: &InliningMap<'tcx>, - visited: &mut FxHashSet>) { + fn follow_inlining<'tcx>( + mono_item: MonoItem<'tcx>, + inlining_map: &InliningMap<'tcx>, + visited: &mut FxHashSet>, + ) { if !visited.insert(mono_item) { return; } @@ -610,8 +603,7 @@ fn internalize_symbols<'tcx>( // could be accessed from. for cgu in &mut partitioning.codegen_units { for candidate in &partitioning.internalization_candidates { - cgu.items_mut().insert(*candidate, - (Linkage::Internal, Visibility::Default)); + cgu.items_mut().insert(*candidate, (Linkage::Internal, Visibility::Default)); } } @@ -623,9 +615,7 @@ fn internalize_symbols<'tcx>( let mut accessor_map: FxHashMap, Vec>> = Default::default(); inlining_map.iter_accesses(|accessor, accessees| { for accessee in accessees { - accessor_map.entry(*accessee) - .or_default() - .push(accessor); + accessor_map.entry(*accessee).or_default().push(accessor); } }); @@ -634,28 +624,28 @@ fn internalize_symbols<'tcx>( // For each internalization candidates in each codegen unit, check if it is // accessed from outside its defining codegen unit. for cgu in &mut partitioning.codegen_units { - let home_cgu = MonoItemPlacement::SingleCgu { - cgu_name: cgu.name() - }; + let home_cgu = MonoItemPlacement::SingleCgu { cgu_name: cgu.name() }; for (accessee, linkage_and_visibility) in cgu.items_mut() { if !partitioning.internalization_candidates.contains(accessee) { // This item is no candidate for internalizing, so skip it. - continue + continue; } debug_assert_eq!(mono_item_placements[accessee], home_cgu); if let Some(accessors) = accessor_map.get(accessee) { - if accessors.iter() - .filter_map(|accessor| { - // Some accessors might not have been - // instantiated. We can safely ignore those. - mono_item_placements.get(accessor) - }) - .any(|placement| *placement != home_cgu) { + if accessors + .iter() + .filter_map(|accessor| { + // Some accessors might not have been + // instantiated. We can safely ignore those. + mono_item_placements.get(accessor) + }) + .any(|placement| *placement != home_cgu) + { // Found an accessor from another CGU, so skip to the next // item without marking this one as internal. - continue + continue; } } @@ -674,14 +664,14 @@ fn characteristic_def_id_of_mono_item<'tcx>( MonoItem::Fn(instance) => { let def_id = match instance.def { ty::InstanceDef::Item(def_id) => def_id, - ty::InstanceDef::VtableShim(..) | - ty::InstanceDef::ReifyShim(..) | - ty::InstanceDef::FnPtrShim(..) | - ty::InstanceDef::ClosureOnceShim { .. } | - ty::InstanceDef::Intrinsic(..) | - ty::InstanceDef::DropGlue(..) | - ty::InstanceDef::Virtual(..) | - ty::InstanceDef::CloneShim(..) => return None + ty::InstanceDef::VtableShim(..) + | ty::InstanceDef::ReifyShim(..) + | ty::InstanceDef::FnPtrShim(..) + | ty::InstanceDef::ClosureOnceShim { .. } + | ty::InstanceDef::Intrinsic(..) + | ty::InstanceDef::DropGlue(..) + | ty::InstanceDef::Virtual(..) + | ty::InstanceDef::CloneShim(..) => return None, }; // If this is a method, we want to put it into the same module as @@ -731,12 +721,9 @@ fn compute_codegen_unit_name( if current_def_id.index == CRATE_DEF_INDEX { if cgu_def_id.is_none() { // If we have not found a module yet, take the crate root. - cgu_def_id = Some(DefId { - krate: def_id.krate, - index: CRATE_DEF_INDEX, - }); + cgu_def_id = Some(DefId { krate: def_id.krate, index: CRATE_DEF_INDEX }); } - break + break; } else if tcx.def_kind(current_def_id) == Some(DefKind::Mod) { if cgu_def_id.is_none() { cgu_def_id = Some(current_def_id); @@ -753,18 +740,15 @@ fn compute_codegen_unit_name( let cgu_def_id = cgu_def_id.unwrap(); - cache.entry((cgu_def_id, volatile)).or_insert_with(|| { + *cache.entry((cgu_def_id, volatile)).or_insert_with(|| { let def_path = tcx.def_path(cgu_def_id); - let components = def_path - .data - .iter() - .map(|part| part.data.as_symbol()); + let components = def_path.data.iter().map(|part| part.data.as_symbol()); let volatile_suffix = volatile.then_some("volatile"); name_builder.build_cgu_name(def_path.krate, components, volatile_suffix) - }).clone() + }) } fn numbered_codegen_unit_name( @@ -787,14 +771,16 @@ where for (mono_item, linkage) in cgu.items() { let symbol_name = mono_item.symbol_name(tcx).name.as_str(); let symbol_hash_start = symbol_name.rfind('h'); - let symbol_hash = symbol_hash_start.map(|i| &symbol_name[i ..]) - .unwrap_or(""); - - debug!(" - {} [{:?}] [{}] estimated size {}", - mono_item.to_string(tcx, true), - linkage, - symbol_hash, - mono_item.size_estimate(tcx)); + let symbol_hash = + symbol_hash_start.map(|i| &symbol_name[i..]).unwrap_or(""); + + debug!( + " - {} [{:?}] [{}] estimated size {}", + mono_item.to_string(tcx, true), + linkage, + symbol_hash, + mono_item.size_estimate(tcx) + ); } debug!(""); @@ -808,9 +794,10 @@ where I: Iterator>, 'tcx: 'a, { - let mut symbols: Vec<_> = mono_items.map(|mono_item| { - (mono_item, mono_item.symbol_name(tcx)) - }).collect(); + let _prof_timer = tcx.prof.generic_activity("assert_symbols_are_distinct"); + + let mut symbols: Vec<_> = + mono_items.map(|mono_item| (mono_item, mono_item.symbol_name(tcx))).collect(); symbols.sort_by_key(|sym| sym.1); @@ -828,11 +815,7 @@ where // Deterministically select one of the spans for error reporting let span = match (span1, span2) { (Some(span1), Some(span2)) => { - Some(if span1.lo().0 > span2.lo().0 { - span1 - } else { - span2 - }) + Some(if span1.lo().0 > span2.lo().0 { span1 } else { span2 }) } (span1, span2) => span1.or(span2), }; @@ -862,9 +845,11 @@ fn collect_and_partition_mono_items( MonoItemCollectionMode::Eager } else { if mode_string != "lazy" { - let message = format!("Unknown codegen-item collection mode '{}'. \ + let message = format!( + "Unknown codegen-item collection mode '{}'. \ Falling back to 'lazy' mode.", - mode_string); + mode_string + ); tcx.sess.warn(&message); } @@ -880,49 +865,43 @@ fn collect_and_partition_mono_items( } }; - let (items, inlining_map) = - time(tcx.sess, "monomorphization collection", || { - collector::collect_crate_mono_items(tcx, collection_mode) - }); + let (items, inlining_map) = collector::collect_crate_mono_items(tcx, collection_mode); tcx.sess.abort_if_errors(); - assert_symbols_are_distinct(tcx, items.iter()); - - let strategy = if tcx.sess.opts.incremental.is_some() { - PartitioningStrategy::PerModule - } else { - PartitioningStrategy::FixedUnitCount(tcx.sess.codegen_units()) - }; - - let codegen_units = time(tcx.sess, "codegen unit partitioning", || { - partition( - tcx, - items.iter().cloned(), - strategy, - &inlining_map + let (codegen_units, _) = tcx.sess.time("partition_and_assert_distinct_symbols", || { + sync::join( + || { + let strategy = if tcx.sess.opts.incremental.is_some() { + PartitioningStrategy::PerModule + } else { + PartitioningStrategy::FixedUnitCount(tcx.sess.codegen_units()) + }; + + partition(tcx, items.iter().cloned(), strategy, &inlining_map) + .into_iter() + .map(Arc::new) + .collect::>() + }, + || assert_symbols_are_distinct(tcx, items.iter()), ) - .into_iter() - .map(Arc::new) - .collect::>() }); - let mono_items: DefIdSet = items.iter().filter_map(|mono_item| { - match *mono_item { + let mono_items: DefIdSet = items + .iter() + .filter_map(|mono_item| match *mono_item { MonoItem::Fn(ref instance) => Some(instance.def_id()), MonoItem::Static(def_id) => Some(def_id), _ => None, - } - }).collect(); + }) + .collect(); if tcx.sess.opts.debugging_opts.print_mono_items.is_some() { let mut item_to_cgus: FxHashMap<_, Vec<_>> = Default::default(); for cgu in &codegen_units { for (&mono_item, &linkage) in cgu.items() { - item_to_cgus.entry(mono_item) - .or_default() - .push((cgu.name(), linkage)); + item_to_cgus.entry(mono_item).or_default().push((cgu.name(), linkage)); } } @@ -972,12 +951,10 @@ fn collect_and_partition_mono_items( } pub fn provide(providers: &mut Providers<'_>) { - providers.collect_and_partition_mono_items = - collect_and_partition_mono_items; + providers.collect_and_partition_mono_items = collect_and_partition_mono_items; providers.is_codegened_item = |tcx, def_id| { - let (all_mono_items, _) = - tcx.collect_and_partition_mono_items(LOCAL_CRATE); + let (all_mono_items, _) = tcx.collect_and_partition_mono_items(LOCAL_CRATE); all_mono_items.contains(&def_id) }; diff --git a/src/librustc_mir/shim.rs b/src/librustc_mir/shim.rs index 47b08048f8..94a5f2b3bf 100644 --- a/src/librustc_mir/shim.rs +++ b/src/librustc_mir/shim.rs @@ -1,26 +1,26 @@ -use rustc::hir; -use rustc::hir::def_id::DefId; use rustc::mir::*; -use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::layout::VariantIdx; -use rustc::ty::subst::{Subst, InternalSubsts}; use rustc::ty::query::Providers; +use rustc::ty::subst::{InternalSubsts, Subst}; +use rustc::ty::{self, Ty, TyCtxt}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; -use rustc_index::vec::{IndexVec, Idx}; +use rustc_index::vec::{Idx, IndexVec}; +use rustc_span::{sym, Span}; use rustc_target::spec::abi::Abi; -use syntax_pos::{Span, sym}; use std::fmt; use std::iter; use crate::transform::{ - add_moves_for_packed_drops, add_call_guards, - remove_noop_landing_pads, no_landing_pads, simplify, run_passes + add_call_guards, add_moves_for_packed_drops, no_landing_pads, remove_noop_landing_pads, + run_passes, simplify, }; -use crate::util::elaborate_drops::{self, DropElaborator, DropStyle, DropFlagMode}; -use crate::util::patch::MirPatch; +use crate::util::elaborate_drops::{self, DropElaborator, DropFlagMode, DropStyle}; use crate::util::expand_aggregate; +use crate::util::patch::MirPatch; pub fn provide(providers: &mut Providers<'_>) { providers.mir_shims = make_shim; @@ -30,24 +30,20 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> &'tcx debug!("make_shim({:?})", instance); let mut result = match instance { - ty::InstanceDef::Item(..) => - bug!("item {:?} passed to make_shim", instance), - ty::InstanceDef::VtableShim(def_id) => { - build_call_shim( - tcx, - instance, - Adjustment::DerefMove, - CallKind::Direct(def_id), - None, - ) - } + ty::InstanceDef::Item(..) => bug!("item {:?} passed to make_shim", instance), + ty::InstanceDef::VtableShim(def_id) => build_call_shim( + tcx, + instance, + Some(Adjustment::DerefMove), + CallKind::Direct(def_id), + None, + ), ty::InstanceDef::FnPtrShim(def_id, ty) => { let trait_ = tcx.trait_of_item(def_id).unwrap(); let adjustment = match tcx.lang_items().fn_trait_kind(trait_) { Some(ty::ClosureKind::FnOnce) => Adjustment::Identity, - Some(ty::ClosureKind::FnMut) | - Some(ty::ClosureKind::Fn) => Adjustment::Deref, - None => bug!("fn pointer {:?} is not an fn", ty) + Some(ty::ClosureKind::FnMut) | Some(ty::ClosureKind::Fn) => Adjustment::Deref, + None => bug!("fn pointer {:?} is not an fn", ty), }; // HACK: we need the "real" argument types for the MIR, // but because our substs are (Self, Args), where Args @@ -58,13 +54,7 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> &'tcx let sig = tcx.erase_late_bound_regions(&ty.fn_sig(tcx)); let arg_tys = sig.inputs(); - build_call_shim( - tcx, - instance, - adjustment, - CallKind::Indirect, - Some(arg_tys) - ) + build_call_shim(tcx, instance, Some(adjustment), CallKind::Indirect, Some(arg_tys)) } // We are generating a call back to our def-id, which the // codegen backend knows to turn to an actual call, be it @@ -72,32 +62,25 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> &'tcx // indirect calls must be codegen'd differently than direct ones // (such as `#[track_caller]`). ty::InstanceDef::ReifyShim(def_id) => { - build_call_shim( - tcx, - instance, - Adjustment::Identity, - CallKind::Direct(def_id), - None - ) + build_call_shim(tcx, instance, None, CallKind::Direct(def_id), None) } ty::InstanceDef::ClosureOnceShim { call_once: _ } => { let fn_mut = tcx.lang_items().fn_mut_trait().unwrap(); let call_mut = tcx .associated_items(fn_mut) .find(|it| it.kind == ty::AssocKind::Method) - .unwrap().def_id; + .unwrap() + .def_id; build_call_shim( tcx, instance, - Adjustment::RefMut, + Some(Adjustment::RefMut), CallKind::Direct(call_mut), - None + None, ) } - ty::InstanceDef::DropGlue(def_id, ty) => { - build_drop_shim(tcx, def_id, ty) - } + ty::InstanceDef::DropGlue(def_id, ty) => build_drop_shim(tcx, def_id, ty), ty::InstanceDef::CloneShim(def_id, ty) => { let name = tcx.item_name(def_id); if name == sym::clone { @@ -118,13 +101,20 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> &'tcx }; debug!("make_shim({:?}) = untransformed {:?}", instance, result); - run_passes(tcx, &mut result, instance, None, MirPhase::Const, &[ - &add_moves_for_packed_drops::AddMovesForPackedDrops, - &no_landing_pads::NoLandingPads::new(tcx), - &remove_noop_landing_pads::RemoveNoopLandingPads, - &simplify::SimplifyCfg::new("make_shim"), - &add_call_guards::CriticalCallEdges, - ]); + run_passes( + tcx, + &mut result, + instance, + None, + MirPhase::Const, + &[ + &add_moves_for_packed_drops::AddMovesForPackedDrops, + &no_landing_pads::NoLandingPads::new(tcx), + &remove_noop_landing_pads::RemoveNoopLandingPads, + &simplify::SimplifyCfg::new("make_shim"), + &add_call_guards::CriticalCallEdges, + ], + ); debug!("make_shim({:?}) = {:?}", instance, result); @@ -159,17 +149,19 @@ fn temp_decl(mutability: Mutability, ty: Ty<'_>, span: Span) -> LocalDecl<'_> { } } -fn local_decls_for_sig<'tcx>(sig: &ty::FnSig<'tcx>, span: Span) - -> IndexVec> -{ +fn local_decls_for_sig<'tcx>( + sig: &ty::FnSig<'tcx>, + span: Span, +) -> IndexVec> { iter::once(temp_decl(Mutability::Mut, sig.output(), span)) - .chain(sig.inputs().iter().map( - |ity| temp_decl(Mutability::Not, ity, span))) + .chain(sig.inputs().iter().map(|ity| temp_decl(Mutability::Not, ity, span))) .collect() } fn build_drop_shim<'tcx>( - tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option> + tcx: TyCtxt<'tcx>, + def_id: DefId, + ty: Option>, ) -> BodyAndCache<'tcx> { debug!("build_drop_shim(def_id={:?}, ty={:?})", def_id, ty); @@ -196,38 +188,33 @@ fn build_drop_shim<'tcx>( blocks.push(BasicBlockData { statements: vec![], terminator: Some(Terminator { source_info, kind }), - is_cleanup: false + is_cleanup: false, }) }; block(&mut blocks, TerminatorKind::Goto { target: return_block }); block(&mut blocks, TerminatorKind::Return); - let body = new_body( - blocks, - local_decls_for_sig(&sig, span), - sig.inputs().len(), - span); + let body = new_body(blocks, local_decls_for_sig(&sig, span), sig.inputs().len(), span); let mut body = BodyAndCache::new(body); if let Some(..) = ty { // The first argument (index 0), but add 1 for the return value. - let dropee_ptr = Place::from(Local::new(1+0)); + let dropee_ptr = Place::from(Local::new(1 + 0)); if tcx.sess.opts.debugging_opts.mir_emit_retag { // Function arguments should be retagged, and we make this one raw. - body.basic_blocks_mut()[START_BLOCK].statements.insert(0, Statement { - source_info, - kind: StatementKind::Retag(RetagKind::Raw, box(dropee_ptr.clone())), - }); + body.basic_blocks_mut()[START_BLOCK].statements.insert( + 0, + Statement { + source_info, + kind: StatementKind::Retag(RetagKind::Raw, box (dropee_ptr)), + }, + ); } let patch = { let param_env = tcx.param_env(def_id).with_reveal_all(); - let mut elaborator = DropShimElaborator { - body: &body, - patch: MirPatch::new(&body), - tcx, - param_env - }; + let mut elaborator = + DropShimElaborator { body: &body, patch: MirPatch::new(&body), tcx, param_env }; let dropee = tcx.mk_place_deref(dropee_ptr); let resume_block = elaborator.patch.resume_block(); elaborate_drops::elaborate_drop( @@ -237,7 +224,7 @@ fn build_drop_shim<'tcx>( (), return_block, elaborate_drops::Unwind::To(resume_block), - START_BLOCK + START_BLOCK, ); elaborator.patch }; @@ -285,27 +272,28 @@ impl<'a, 'tcx> fmt::Debug for DropShimElaborator<'a, 'tcx> { impl<'a, 'tcx> DropElaborator<'a, 'tcx> for DropShimElaborator<'a, 'tcx> { type Path = (); - fn patch(&mut self) -> &mut MirPatch<'tcx> { &mut self.patch } - fn body(&self) -> &'a Body<'tcx> { self.body } + fn patch(&mut self) -> &mut MirPatch<'tcx> { + &mut self.patch + } + fn body(&self) -> &'a Body<'tcx> { + self.body + } fn tcx(&self) -> TyCtxt<'tcx> { self.tcx - } - fn param_env(&self) -> ty::ParamEnv<'tcx> { self.param_env } + } + fn param_env(&self) -> ty::ParamEnv<'tcx> { + self.param_env + } fn drop_style(&self, _path: Self::Path, mode: DropFlagMode) -> DropStyle { - if let DropFlagMode::Shallow = mode { - DropStyle::Static - } else { - DropStyle::Open - } + if let DropFlagMode::Shallow = mode { DropStyle::Static } else { DropStyle::Open } } fn get_drop_flag(&mut self, _path: Self::Path) -> Option> { None } - fn clear_drop_flag(&mut self, _location: Location, _path: Self::Path, _mode: DropFlagMode) { - } + fn clear_drop_flag(&mut self, _location: Location, _path: Self::Path, _mode: DropFlagMode) {} fn field_subpath(&self, _path: Self::Path, _field: Field) -> Option { None @@ -335,7 +323,7 @@ fn build_clone_shim<'tcx>( let is_copy = self_ty.is_copy_modulo_regions(tcx, param_env, builder.span); let dest = Place::return_place(); - let src = tcx.mk_place_deref(Place::from(Local::new(1+0))); + let src = tcx.mk_place_deref(Place::from(Local::new(1 + 0))); match self_ty.kind { _ if is_copy => builder.copy_shim(), @@ -344,15 +332,10 @@ fn build_clone_shim<'tcx>( builder.array_shim(dest, src, ty, len) } ty::Closure(def_id, substs) => { - builder.tuple_like_shim( - dest, src, - substs.as_closure().upvar_tys(def_id, tcx) - ) + builder.tuple_like_shim(dest, src, substs.as_closure().upvar_tys(def_id, tcx)) } ty::Tuple(..) => builder.tuple_like_shim(dest, src, self_ty.tuple_fields()), - _ => { - bug!("clone shim for `{:?}` which is not `Copy` and is not an aggregate", self_ty) - } + _ => bug!("clone shim for `{:?}` which is not `Copy` and is not an aggregate", self_ty), }; BodyAndCache::new(builder.into_mir()) @@ -388,12 +371,7 @@ impl CloneShimBuilder<'tcx> { } fn into_mir(self) -> Body<'tcx> { - new_body( - self.blocks, - self.local_decls, - self.sig.inputs().len(), - self.span, - ) + new_body(self.blocks, self.local_decls, self.sig.inputs().len(), self.span) } fn source_info(&self) -> SourceInfo { @@ -404,7 +382,7 @@ impl CloneShimBuilder<'tcx> { &mut self, statements: Vec>, kind: TerminatorKind<'tcx>, - is_cleanup: bool + is_cleanup: bool, ) -> BasicBlock { let source_info = self.source_info(); self.blocks.push(BasicBlockData { @@ -423,22 +401,15 @@ impl CloneShimBuilder<'tcx> { } fn make_statement(&self, kind: StatementKind<'tcx>) -> Statement<'tcx> { - Statement { - source_info: self.source_info(), - kind, - } + Statement { source_info: self.source_info(), kind } } fn copy_shim(&mut self) { - let rcvr = self.tcx.mk_place_deref(Place::from(Local::new(1+0))); - let ret_statement = self.make_statement( - StatementKind::Assign( - box( - Place::return_place(), - Rvalue::Use(Operand::Copy(rcvr)) - ) - ) - ); + let rcvr = self.tcx.mk_place_deref(Place::from(Local::new(1 + 0))); + let ret_statement = self.make_statement(StatementKind::Assign(box ( + Place::return_place(), + Rvalue::Use(Operand::Copy(rcvr)), + ))); self.block(vec![ret_statement], TerminatorKind::Return, false); } @@ -453,7 +424,7 @@ impl CloneShimBuilder<'tcx> { src: Place<'tcx>, ty: Ty<'tcx>, next: BasicBlock, - cleanup: BasicBlock + cleanup: BasicBlock, ) { let tcx = self.tcx; @@ -469,30 +440,27 @@ impl CloneShimBuilder<'tcx> { let ref_loc = self.make_place( Mutability::Not, - tcx.mk_ref(tcx.lifetimes.re_erased, ty::TypeAndMut { - ty, - mutbl: hir::Mutability::Immutable, - }) + tcx.mk_ref(tcx.lifetimes.re_erased, ty::TypeAndMut { ty, mutbl: hir::Mutability::Not }), ); // `let ref_loc: &ty = &src;` - let statement = self.make_statement( - StatementKind::Assign( - box( - ref_loc.clone(), - Rvalue::Ref(tcx.lifetimes.re_erased, BorrowKind::Shared, src) - ) - ) - ); + let statement = self.make_statement(StatementKind::Assign(box ( + ref_loc, + Rvalue::Ref(tcx.lifetimes.re_erased, BorrowKind::Shared, src), + ))); // `let loc = Clone::clone(ref_loc);` - self.block(vec![statement], TerminatorKind::Call { - func, - args: vec![Operand::Move(ref_loc)], - destination: Some((dest, next)), - cleanup: Some(cleanup), - from_hir_call: true, - }, false); + self.block( + vec![statement], + TerminatorKind::Call { + func, + args: vec![Operand::Move(ref_loc)], + destination: Some((dest, next)), + cleanup: Some(cleanup), + from_hir_call: true, + }, + false, + ); } fn loop_header( @@ -501,25 +469,21 @@ impl CloneShimBuilder<'tcx> { end: Place<'tcx>, loop_body: BasicBlock, loop_end: BasicBlock, - is_cleanup: bool + is_cleanup: bool, ) { let tcx = self.tcx; let cond = self.make_place(Mutability::Mut, tcx.types.bool); - let compute_cond = self.make_statement( - StatementKind::Assign( - box( - cond.clone(), - Rvalue::BinaryOp(BinOp::Ne, Operand::Copy(end), Operand::Copy(beg)) - ) - ) - ); + let compute_cond = self.make_statement(StatementKind::Assign(box ( + cond, + Rvalue::BinaryOp(BinOp::Ne, Operand::Copy(end), Operand::Copy(beg)), + ))); // `if end != beg { goto loop_body; } else { goto loop_end; }` self.block( vec![compute_cond], TerminatorKind::if_(tcx, Operand::Move(cond), loop_body, loop_end), - is_cleanup + is_cleanup, ); } @@ -543,22 +507,14 @@ impl CloneShimBuilder<'tcx> { // `let end = len;` // `goto #1;` let inits = vec![ - self.make_statement( - StatementKind::Assign( - box( - Place::from(beg), - Rvalue::Use(Operand::Constant(self.make_usize(0))) - ) - ) - ), - self.make_statement( - StatementKind::Assign( - box( - end.clone(), - Rvalue::Use(Operand::Constant(self.make_usize(len))) - ) - ) - ) + self.make_statement(StatementKind::Assign(box ( + Place::from(beg), + Rvalue::Use(Operand::Constant(self.make_usize(0))), + ))), + self.make_statement(StatementKind::Assign(box ( + end, + Rvalue::Use(Operand::Constant(self.make_usize(len))), + ))), ]; self.block(inits, TerminatorKind::Goto { target: BasicBlock::new(1) }, false); @@ -567,37 +523,26 @@ impl CloneShimBuilder<'tcx> { // BB #3; // } // BB #4; - self.loop_header(Place::from(beg), - end, - BasicBlock::new(2), - BasicBlock::new(4), - false); + self.loop_header(Place::from(beg), end, BasicBlock::new(2), BasicBlock::new(4), false); // BB #2 // `dest[i] = Clone::clone(src[beg])`; // Goto #3 if ok, #5 if unwinding happens. let dest_field = self.tcx.mk_place_index(dest.clone(), beg); let src_field = self.tcx.mk_place_index(src, beg); - self.make_clone_call(dest_field, src_field, ty, BasicBlock::new(3), - BasicBlock::new(5)); + self.make_clone_call(dest_field, src_field, ty, BasicBlock::new(3), BasicBlock::new(5)); // BB #3 // `beg = beg + 1;` // `goto #1`; - let statements = vec![ - self.make_statement( - StatementKind::Assign( - box( - Place::from(beg), - Rvalue::BinaryOp( - BinOp::Add, - Operand::Copy(Place::from(beg)), - Operand::Constant(self.make_usize(1)) - ) - ) - ) - ) - ]; + let statements = vec![self.make_statement(StatementKind::Assign(box ( + Place::from(beg), + Rvalue::BinaryOp( + BinOp::Add, + Operand::Copy(Place::from(beg)), + Operand::Constant(self.make_usize(1)), + ), + )))]; self.block(statements, TerminatorKind::Goto { target: BasicBlock::new(1) }, false); // BB #4 @@ -610,14 +555,10 @@ impl CloneShimBuilder<'tcx> { // goto #6; let end = beg; let beg = self.local_decls.push(temp_decl(Mutability::Mut, tcx.types.usize, span)); - let init = self.make_statement( - StatementKind::Assign( - box( - Place::from(beg), - Rvalue::Use(Operand::Constant(self.make_usize(0))) - ) - ) - ); + let init = self.make_statement(StatementKind::Assign(box ( + Place::from(beg), + Rvalue::Use(Operand::Constant(self.make_usize(0))), + ))); self.block(vec![init], TerminatorKind::Goto { target: BasicBlock::new(6) }, true); // BB #6 (cleanup): loop { @@ -625,41 +566,47 @@ impl CloneShimBuilder<'tcx> { // BB #8; // } // BB #9; - self.loop_header(Place::from(beg), Place::from(end), - BasicBlock::new(7), BasicBlock::new(9), true); + self.loop_header( + Place::from(beg), + Place::from(end), + BasicBlock::new(7), + BasicBlock::new(9), + true, + ); // BB #7 (cleanup) // `drop(dest[beg])`; - self.block(vec![], TerminatorKind::Drop { - location: self.tcx.mk_place_index(dest, beg), - target: BasicBlock::new(8), - unwind: None, - }, true); + self.block( + vec![], + TerminatorKind::Drop { + location: self.tcx.mk_place_index(dest, beg), + target: BasicBlock::new(8), + unwind: None, + }, + true, + ); // BB #8 (cleanup) // `beg = beg + 1;` // `goto #6;` - let statement = self.make_statement( - StatementKind::Assign( - box( - Place::from(beg), - Rvalue::BinaryOp( - BinOp::Add, - Operand::Copy(Place::from(beg)), - Operand::Constant(self.make_usize(1)) - ) - ) - ) - ); + let statement = self.make_statement(StatementKind::Assign(box ( + Place::from(beg), + Rvalue::BinaryOp( + BinOp::Add, + Operand::Copy(Place::from(beg)), + Operand::Constant(self.make_usize(1)), + ), + ))); self.block(vec![statement], TerminatorKind::Goto { target: BasicBlock::new(6) }, true); // BB #9 (resume) self.block(vec![], TerminatorKind::Resume, true); } - fn tuple_like_shim(&mut self, dest: Place<'tcx>, - src: Place<'tcx>, tys: I) - where I: Iterator> { + fn tuple_like_shim(&mut self, dest: Place<'tcx>, src: Place<'tcx>, tys: I) + where + I: Iterator>, + { let mut previous_field = None; for (i, ity) in tys.enumerate() { let field = Field::new(i); @@ -676,22 +623,20 @@ impl CloneShimBuilder<'tcx> { // BB #(2i) // `dest.i = Clone::clone(&src.i);` // Goto #(2i + 2) if ok, #(2i + 1) if unwinding happens. - self.make_clone_call( - dest_field.clone(), - src_field, - ity, - next_block, - cleanup_block, - ); + self.make_clone_call(dest_field.clone(), src_field, ity, next_block, cleanup_block); // BB #(2i + 1) (cleanup) if let Some((previous_field, previous_cleanup)) = previous_field.take() { // Drop previous field and goto previous cleanup block. - self.block(vec![], TerminatorKind::Drop { - location: previous_field, - target: previous_cleanup, - unwind: None, - }, true); + self.block( + vec![], + TerminatorKind::Drop { + location: previous_field, + target: previous_cleanup, + unwind: None, + }, + true, + ); } else { // Nothing to drop, just resume. self.block(vec![], TerminatorKind::Resume, true); @@ -713,13 +658,15 @@ impl CloneShimBuilder<'tcx> { fn build_call_shim<'tcx>( tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>, - rcvr_adjustment: Adjustment, + rcvr_adjustment: Option, call_kind: CallKind, untuple_args: Option<&[Ty<'tcx>]>, ) -> BodyAndCache<'tcx> { - debug!("build_call_shim(instance={:?}, rcvr_adjustment={:?}, \ + debug!( + "build_call_shim(instance={:?}, rcvr_adjustment={:?}, \ call_kind={:?}, untuple_args={:?})", - instance, rcvr_adjustment, call_kind, untuple_args); + instance, rcvr_adjustment, call_kind, untuple_args + ); let def_id = instance.def_id(); let sig = tcx.fn_sig(def_id); @@ -743,116 +690,137 @@ fn build_call_shim<'tcx>( let mut local_decls = local_decls_for_sig(&sig, span); let source_info = SourceInfo { span, scope: OUTERMOST_SOURCE_SCOPE }; - let rcvr_arg = Local::new(1+0); - let rcvr_l = Place::from(rcvr_arg); + let rcvr_place = || { + assert!(rcvr_adjustment.is_some()); + Place::from(Local::new(1 + 0)) + }; let mut statements = vec![]; - let rcvr = match rcvr_adjustment { - Adjustment::Identity => Operand::Move(rcvr_l), - Adjustment::Deref => Operand::Copy(tcx.mk_place_deref(rcvr_l)), - Adjustment::DerefMove => Operand::Move(tcx.mk_place_deref(rcvr_l)), + let rcvr = rcvr_adjustment.map(|rcvr_adjustment| match rcvr_adjustment { + Adjustment::Identity => Operand::Move(rcvr_place()), + Adjustment::Deref => Operand::Copy(tcx.mk_place_deref(rcvr_place())), + Adjustment::DerefMove => Operand::Move(tcx.mk_place_deref(rcvr_place())), Adjustment::RefMut => { // let rcvr = &mut rcvr; let ref_rcvr = local_decls.push(temp_decl( Mutability::Not, - tcx.mk_ref(tcx.lifetimes.re_erased, ty::TypeAndMut { - ty: sig.inputs()[0], - mutbl: hir::Mutability::Mutable - }), - span + tcx.mk_ref( + tcx.lifetimes.re_erased, + ty::TypeAndMut { ty: sig.inputs()[0], mutbl: hir::Mutability::Mut }, + ), + span, )); - let borrow_kind = BorrowKind::Mut { - allow_two_phase_borrow: false, - }; + let borrow_kind = BorrowKind::Mut { allow_two_phase_borrow: false }; statements.push(Statement { source_info, - kind: StatementKind::Assign( - box( - Place::from(ref_rcvr), - Rvalue::Ref(tcx.lifetimes.re_erased, borrow_kind, rcvr_l) - ) - ) + kind: StatementKind::Assign(box ( + Place::from(ref_rcvr), + Rvalue::Ref(tcx.lifetimes.re_erased, borrow_kind, rcvr_place()), + )), }); Operand::Move(Place::from(ref_rcvr)) } - }; + }); let (callee, mut args) = match call_kind { - CallKind::Indirect => (rcvr, vec![]), + CallKind::Indirect => (rcvr.unwrap(), vec![]), CallKind::Direct(def_id) => { let ty = tcx.type_of(def_id); - (Operand::Constant(box Constant { - span, - user_ty: None, - literal: ty::Const::zero_sized(tcx, ty), - }), - vec![rcvr]) + ( + Operand::Constant(box Constant { + span, + user_ty: None, + literal: ty::Const::zero_sized(tcx, ty), + }), + rcvr.into_iter().collect::>(), + ) } }; + let mut arg_range = 0..sig.inputs().len(); + + // Take the `self` ("receiver") argument out of the range (it's adjusted above). + if rcvr_adjustment.is_some() { + arg_range.start += 1; + } + + // Take the last argument, if we need to untuple it (handled below). + if untuple_args.is_some() { + arg_range.end -= 1; + } + + // Pass all of the non-special arguments directly. + args.extend(arg_range.map(|i| Operand::Move(Place::from(Local::new(1 + i))))); + + // Untuple the last argument, if we have to. if let Some(untuple_args) = untuple_args { + let tuple_arg = Local::new(1 + (sig.inputs().len() - 1)); args.extend(untuple_args.iter().enumerate().map(|(i, ity)| { - let arg_place = Place::from(Local::new(1+1)); - Operand::Move(tcx.mk_place_field(arg_place, Field::new(i), *ity)) - })); - } else { - args.extend((1..sig.inputs().len()).map(|i| { - Operand::Move(Place::from(Local::new(1+i))) + Operand::Move(tcx.mk_place_field(Place::from(tuple_arg), Field::new(i), *ity)) })); } - let n_blocks = if let Adjustment::RefMut = rcvr_adjustment { 5 } else { 2 }; + let n_blocks = if let Some(Adjustment::RefMut) = rcvr_adjustment { 5 } else { 2 }; let mut blocks = IndexVec::with_capacity(n_blocks); let block = |blocks: &mut IndexVec<_, _>, statements, kind, is_cleanup| { blocks.push(BasicBlockData { statements, terminator: Some(Terminator { source_info, kind }), - is_cleanup + is_cleanup, }) }; // BB #0 - block(&mut blocks, statements, TerminatorKind::Call { - func: callee, - args, - destination: Some((Place::return_place(), - BasicBlock::new(1))), - cleanup: if let Adjustment::RefMut = rcvr_adjustment { - Some(BasicBlock::new(3)) - } else { - None + block( + &mut blocks, + statements, + TerminatorKind::Call { + func: callee, + args, + destination: Some((Place::return_place(), BasicBlock::new(1))), + cleanup: if let Some(Adjustment::RefMut) = rcvr_adjustment { + Some(BasicBlock::new(3)) + } else { + None + }, + from_hir_call: true, }, - from_hir_call: true, - }, false); + false, + ); - if let Adjustment::RefMut = rcvr_adjustment { + if let Some(Adjustment::RefMut) = rcvr_adjustment { // BB #1 - drop for Self - block(&mut blocks, vec![], TerminatorKind::Drop { - location: Place::from(rcvr_arg), - target: BasicBlock::new(2), - unwind: None - }, false); + block( + &mut blocks, + vec![], + TerminatorKind::Drop { + location: rcvr_place(), + target: BasicBlock::new(2), + unwind: None, + }, + false, + ); } // BB #1/#2 - return block(&mut blocks, vec![], TerminatorKind::Return, false); - if let Adjustment::RefMut = rcvr_adjustment { + if let Some(Adjustment::RefMut) = rcvr_adjustment { // BB #3 - drop if closure panics - block(&mut blocks, vec![], TerminatorKind::Drop { - location: Place::from(rcvr_arg), - target: BasicBlock::new(4), - unwind: None - }, true); + block( + &mut blocks, + vec![], + TerminatorKind::Drop { + location: rcvr_place(), + target: BasicBlock::new(4), + unwind: None, + }, + true, + ); // BB #4 - resume block(&mut blocks, vec![], TerminatorKind::Resume, true); } - let mut body = new_body( - blocks, - local_decls, - sig.inputs().len(), - span, - ); + let mut body = new_body(blocks, local_decls, sig.inputs().len(), span); if let Abi::RustCall = sig.abi { body.spread_arg = Some(Local::new(sig.inputs().len())); @@ -863,30 +831,25 @@ fn build_call_shim<'tcx>( pub fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> &BodyAndCache<'_> { debug_assert!(tcx.is_constructor(ctor_id)); - let span = tcx.hir().span_if_local(ctor_id) - .unwrap_or_else(|| bug!("no span for ctor {:?}", ctor_id)); + let span = + tcx.hir().span_if_local(ctor_id).unwrap_or_else(|| bug!("no span for ctor {:?}", ctor_id)); let param_env = tcx.param_env(ctor_id); // Normalize the sig. - let sig = tcx.fn_sig(ctor_id) - .no_bound_vars() - .expect("LBR in ADT constructor signature"); + let sig = tcx.fn_sig(ctor_id).no_bound_vars().expect("LBR in ADT constructor signature"); let sig = tcx.normalize_erasing_regions(param_env, sig); let (adt_def, substs) = match sig.output().kind { ty::Adt(adt_def, substs) => (adt_def, substs), - _ => bug!("unexpected type for ADT ctor {:?}", sig.output()) + _ => bug!("unexpected type for ADT ctor {:?}", sig.output()), }; debug!("build_ctor: ctor_id={:?} sig={:?}", ctor_id, sig); let local_decls = local_decls_for_sig(&sig, span); - let source_info = SourceInfo { - span, - scope: OUTERMOST_SOURCE_SCOPE - }; + let source_info = SourceInfo { span, scope: OUTERMOST_SOURCE_SCOPE }; let variant_index = if adt_def.is_enum() { adt_def.variant_index_with_ctor_id(ctor_id) @@ -904,35 +867,23 @@ pub fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> &BodyAndCache<'_> { let statements = expand_aggregate( Place::return_place(), - adt_def - .variants[variant_index] - .fields - .iter() - .enumerate() - .map(|(idx, field_def)| ( - Operand::Move(Place::from(Local::new(idx + 1))), - field_def.ty(tcx, substs), - )), + adt_def.variants[variant_index].fields.iter().enumerate().map(|(idx, field_def)| { + (Operand::Move(Place::from(Local::new(idx + 1))), field_def.ty(tcx, substs)) + }), AggregateKind::Adt(adt_def, variant_index, substs, None, None), source_info, tcx, - ).collect(); + ) + .collect(); let start_block = BasicBlockData { statements, - terminator: Some(Terminator { - source_info, - kind: TerminatorKind::Return, - }), - is_cleanup: false + terminator: Some(Terminator { source_info, kind: TerminatorKind::Return }), + is_cleanup: false, }; - let body = new_body( - IndexVec::from_elem_n(start_block, 1), - local_decls, - sig.inputs().len(), - span, - ); + let body = + new_body(IndexVec::from_elem_n(start_block, 1), local_decls, sig.inputs().len(), span); crate::util::dump_mir( tcx, diff --git a/src/librustc_mir/transform/add_call_guards.rs b/src/librustc_mir/transform/add_call_guards.rs index d1832ebf96..c979b569ec 100644 --- a/src/librustc_mir/transform/add_call_guards.rs +++ b/src/librustc_mir/transform/add_call_guards.rs @@ -1,7 +1,7 @@ -use rustc::ty::TyCtxt; +use crate::transform::{MirPass, MirSource}; use rustc::mir::*; +use rustc::ty::TyCtxt; use rustc_index::vec::{Idx, IndexVec}; -use crate::transform::{MirPass, MirSource}; #[derive(PartialEq)] pub enum AddCallGuards { @@ -31,9 +31,7 @@ pub use self::AddCallGuards::*; */ impl<'tcx> MirPass<'tcx> for AddCallGuards { - fn run_pass( - &self, _tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx> - ) { + fn run_pass(&self, _tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { self.add_call_guards(body); } } @@ -50,13 +48,15 @@ impl AddCallGuards { for block in body.basic_blocks_mut() { match block.terminator { Some(Terminator { - kind: TerminatorKind::Call { - destination: Some((_, ref mut destination)), - cleanup, - .. - }, source_info - }) if pred_count[*destination] > 1 && - (cleanup.is_some() || self == &AllCallEdges) => + kind: + TerminatorKind::Call { + destination: Some((_, ref mut destination)), + cleanup, + .. + }, + source_info, + }) if pred_count[*destination] > 1 + && (cleanup.is_some() || self == &AllCallEdges) => { // It's a critical edge, break it let call_guard = BasicBlockData { @@ -64,8 +64,8 @@ impl AddCallGuards { is_cleanup: block.is_cleanup, terminator: Some(Terminator { source_info, - kind: TerminatorKind::Goto { target: *destination } - }) + kind: TerminatorKind::Goto { target: *destination }, + }), }; // Get the index it will be when inserted into the MIR diff --git a/src/librustc_mir/transform/add_moves_for_packed_drops.rs b/src/librustc_mir/transform/add_moves_for_packed_drops.rs index 861e7fea4f..38db9e5195 100644 --- a/src/librustc_mir/transform/add_moves_for_packed_drops.rs +++ b/src/librustc_mir/transform/add_moves_for_packed_drops.rs @@ -1,10 +1,10 @@ -use rustc::hir::def_id::DefId; use rustc::mir::*; use rustc::ty::TyCtxt; +use rustc_hir::def_id::DefId; use crate::transform::{MirPass, MirSource}; -use crate::util::patch::MirPatch; use crate::util; +use crate::util::patch::MirPatch; // This pass moves values being dropped that are within a packed // struct to a separate local before dropping them, to ensure that @@ -47,7 +47,9 @@ impl<'tcx> MirPass<'tcx> for AddMovesForPackedDrops { } pub fn add_moves_for_packed_drops<'tcx>( - tcx: TyCtxt<'tcx>, body: &mut BodyAndCache<'tcx>, def_id: DefId + tcx: TyCtxt<'tcx>, + body: &mut BodyAndCache<'tcx>, + def_id: DefId, ) { let patch = add_moves_for_packed_drops_patch(tcx, body, def_id); patch.apply(body); @@ -69,12 +71,10 @@ fn add_moves_for_packed_drops_patch<'tcx>( TerminatorKind::Drop { ref location, .. } if util::is_disaligned(tcx, body, param_env, location) => { - add_move_for_packed_drop(tcx, body, &mut patch, terminator, - loc, data.is_cleanup); + add_move_for_packed_drop(tcx, body, &mut patch, terminator, loc, data.is_cleanup); } TerminatorKind::DropAndReplace { .. } => { - span_bug!(terminator.source_info.span, - "replace in AddMovesForPackedDrops"); + span_bug!(terminator.source_info.span, "replace in AddMovesForPackedDrops"); } _ => {} } @@ -93,9 +93,8 @@ fn add_move_for_packed_drop<'tcx>( ) { debug!("add_move_for_packed_drop({:?} @ {:?})", terminator, loc); let (location, target, unwind) = match terminator.kind { - TerminatorKind::Drop { ref location, target, unwind } => - (location, target, unwind), - _ => unreachable!() + TerminatorKind::Drop { ref location, target, unwind } => (location, target, unwind), + _ => unreachable!(), }; let source_info = terminator.source_info; @@ -103,22 +102,15 @@ fn add_move_for_packed_drop<'tcx>( let temp = patch.new_temp(ty, terminator.source_info.span); let storage_dead_block = patch.new_block(BasicBlockData { - statements: vec![Statement { - source_info, kind: StatementKind::StorageDead(temp) - }], - terminator: Some(Terminator { - source_info, kind: TerminatorKind::Goto { target } - }), - is_cleanup + statements: vec![Statement { source_info, kind: StatementKind::StorageDead(temp) }], + terminator: Some(Terminator { source_info, kind: TerminatorKind::Goto { target } }), + is_cleanup, }); - patch.add_statement( - loc, StatementKind::StorageLive(temp)); - patch.add_assign(loc, Place::from(temp), - Rvalue::Use(Operand::Move(location.clone()))); - patch.patch_terminator(loc.block, TerminatorKind::Drop { - location: Place::from(temp), - target: storage_dead_block, - unwind - }); + patch.add_statement(loc, StatementKind::StorageLive(temp)); + patch.add_assign(loc, Place::from(temp), Rvalue::Use(Operand::Move(*location))); + patch.patch_terminator( + loc.block, + TerminatorKind::Drop { location: Place::from(temp), target: storage_dead_block, unwind }, + ); } diff --git a/src/librustc_mir/transform/add_retag.rs b/src/librustc_mir/transform/add_retag.rs index dc21c674ee..a5b467c1e1 100644 --- a/src/librustc_mir/transform/add_retag.rs +++ b/src/librustc_mir/transform/add_retag.rs @@ -4,9 +4,9 @@ //! of MIR building, and only after this pass we think of the program has having the //! normal MIR semantics. -use rustc::ty::{self, Ty, TyCtxt}; -use rustc::mir::*; use crate::transform::{MirPass, MirSource}; +use rustc::mir::*; +use rustc::ty::{self, Ty, TyCtxt}; pub struct AddRetag; @@ -14,9 +14,7 @@ pub struct AddRetag; /// after the assignment, we can be sure to obtain the same place value. /// (Concurrent accesses by other threads are no problem as these are anyway non-atomic /// copies. Data races are UB.) -fn is_stable( - place: PlaceRef<'_, '_>, -) -> bool { +fn is_stable(place: PlaceRef<'_, '_>) -> bool { place.projection.iter().all(|elem| { match elem { // Which place this evaluates to can change with any memory write, @@ -39,20 +37,21 @@ fn is_stable( fn may_be_reference<'tcx>(ty: Ty<'tcx>) -> bool { match ty.kind { // Primitive types that are not references - ty::Bool | ty::Char | - ty::Float(_) | ty::Int(_) | ty::Uint(_) | - ty::RawPtr(..) | ty::FnPtr(..) | - ty::Str | ty::FnDef(..) | ty::Never => - false, + ty::Bool + | ty::Char + | ty::Float(_) + | ty::Int(_) + | ty::Uint(_) + | ty::RawPtr(..) + | ty::FnPtr(..) + | ty::Str + | ty::FnDef(..) + | ty::Never => false, // References ty::Ref(..) => true, ty::Adt(..) if ty.is_box() => true, // Compound types are not references - ty::Array(..) | - ty::Slice(..) | - ty::Tuple(..) | - ty::Adt(..) => - false, + ty::Array(..) | ty::Slice(..) | ty::Tuple(..) | ty::Adt(..) => false, // Conservative fallback _ => true, } @@ -68,8 +67,7 @@ impl<'tcx> MirPass<'tcx> for AddRetag { let needs_retag = |place: &Place<'tcx>| { // FIXME: Instead of giving up for unstable places, we should introduce // a temporary and retag on that. - is_stable(place.as_ref()) - && may_be_reference(place.ty(&*local_decls, tcx).ty) + is_stable(place.as_ref()) && may_be_reference(place.ty(&*local_decls, tcx).ty) }; // PART 1 @@ -81,16 +79,20 @@ impl<'tcx> MirPass<'tcx> for AddRetag { // argument declaration. }; // Gather all arguments, skip return value. - let places = local_decls.iter_enumerated().skip(1).take(arg_count) - .map(|(local, _)| Place::from(local)) - .filter(needs_retag) - .collect::>(); + let places = local_decls + .iter_enumerated() + .skip(1) + .take(arg_count) + .map(|(local, _)| Place::from(local)) + .filter(needs_retag) + .collect::>(); // Emit their retags. - basic_blocks[START_BLOCK].statements.splice(0..0, + basic_blocks[START_BLOCK].statements.splice( + 0..0, places.into_iter().map(|place| Statement { source_info, - kind: StatementKind::Retag(RetagKind::FnEntry, box(place)), - }) + kind: StatementKind::Retag(RetagKind::FnEntry, box (place)), + }), ); } @@ -106,14 +108,13 @@ impl<'tcx> MirPass<'tcx> for AddRetag { if needs_retag(&destination.0) { returns.push(( block_data.terminator().source_info, - destination.0.clone(), + destination.0, destination.1, )); } } } - TerminatorKind::Drop { .. } | - TerminatorKind::DropAndReplace { .. } => { + TerminatorKind::Drop { .. } | TerminatorKind::DropAndReplace { .. } => { // `Drop` is also a call, but it doesn't return anything so we are good. } _ => { @@ -123,10 +124,13 @@ impl<'tcx> MirPass<'tcx> for AddRetag { } // Now we go over the returns we collected to retag the return values. for (source_info, dest_place, dest_block) in returns { - basic_blocks[dest_block].statements.insert(0, Statement { - source_info, - kind: StatementKind::Retag(RetagKind::Default, box(dest_place)), - }); + basic_blocks[dest_block].statements.insert( + 0, + Statement { + source_info, + kind: StatementKind::Retag(RetagKind::Default, box (dest_place)), + }, + ); } // PART 3 @@ -136,45 +140,33 @@ impl<'tcx> MirPass<'tcx> for AddRetag { // iterate backwards using indices. for i in (0..block_data.statements.len()).rev() { let (retag_kind, place) = match block_data.statements[i].kind { - // If we are casting *from* a reference, we may have to retag-as-raw. - StatementKind::Assign(box(ref place, Rvalue::Cast( - CastKind::Misc, - ref src, - dest_ty, - ))) => { - let src_ty = src.ty(&*local_decls, tcx); - if src_ty.is_region_ptr() { - // The only `Misc` casts on references are those creating raw pointers. - assert!(dest_ty.is_unsafe_ptr()); - (RetagKind::Raw, place.clone()) - } else { - // Some other cast, no retag - continue - } + // Retag-as-raw after escaping to a raw pointer. + StatementKind::Assign(box (place, Rvalue::AddressOf(..))) => { + (RetagKind::Raw, place) } // Assignments of reference or ptr type are the ones where we may have // to update tags. This includes `x = &[mut] ...` and hence // we also retag after taking a reference! - StatementKind::Assign(box(ref place, ref rvalue)) if needs_retag(place) => { + StatementKind::Assign(box (ref place, ref rvalue)) if needs_retag(place) => { let kind = match rvalue { Rvalue::Ref(_, borrow_kind, _) - if borrow_kind.allows_two_phase_borrow() - => - RetagKind::TwoPhase, - _ => - RetagKind::Default, + if borrow_kind.allows_two_phase_borrow() => + { + RetagKind::TwoPhase + } + _ => RetagKind::Default, }; - (kind, place.clone()) + (kind, *place) } // Do nothing for the rest _ => continue, }; // Insert a retag after the statement. let source_info = block_data.statements[i].source_info; - block_data.statements.insert(i+1, Statement { - source_info, - kind: StatementKind::Retag(retag_kind, box(place)), - }); + block_data.statements.insert( + i + 1, + Statement { source_info, kind: StatementKind::Retag(retag_kind, box (place)) }, + ); } } } diff --git a/src/librustc_mir/transform/check_consts/mod.rs b/src/librustc_mir/transform/check_consts/mod.rs index 89672e81c7..b738366393 100644 --- a/src/librustc_mir/transform/check_consts/mod.rs +++ b/src/librustc_mir/transform/check_consts/mod.rs @@ -4,9 +4,10 @@ //! has interior mutability or needs to be dropped, as well as the visitor that emits errors when //! it finds operations that are invalid in a certain context. -use rustc::hir::{self, def_id::DefId}; use rustc::mir; use rustc::ty::{self, TyCtxt}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; use std::fmt; @@ -36,13 +37,7 @@ impl Item<'mir, 'tcx> { let param_env = tcx.param_env(def_id); let const_kind = ConstKind::for_item(tcx, def_id); - Item { - body, - tcx, - def_id, - param_env, - const_kind, - } + Item { body, tcx, def_id, param_env, const_kind } } /// Returns the kind of const context this `Item` represents (`const`, `static`, etc.). @@ -87,8 +82,8 @@ impl ConstKind { HirKind::Const => ConstKind::Const, - HirKind::Static(hir::Mutability::Immutable) => ConstKind::Static, - HirKind::Static(hir::Mutability::Mutable) => ConstKind::StaticMut, + HirKind::Static(hir::Mutability::Not) => ConstKind::Static, + HirKind::Static(hir::Mutability::Mut) => ConstKind::StaticMut, }; Some(mode) @@ -114,6 +109,5 @@ impl fmt::Display for ConstKind { /// Returns `true` if this `DefId` points to one of the official `panic` lang items. pub fn is_lang_panic_fn(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool { - Some(def_id) == tcx.lang_items().panic_fn() || - Some(def_id) == tcx.lang_items().begin_panic_fn() + Some(def_id) == tcx.lang_items().panic_fn() || Some(def_id) == tcx.lang_items().begin_panic_fn() } diff --git a/src/librustc_mir/transform/check_consts/ops.rs b/src/librustc_mir/transform/check_consts/ops.rs index 3df60993d9..3263905ead 100644 --- a/src/librustc_mir/transform/check_consts/ops.rs +++ b/src/librustc_mir/transform/check_consts/ops.rs @@ -1,16 +1,15 @@ //! Concrete error types for all operations which may be invalid in a certain const context. -use rustc::hir::def_id::DefId; use rustc::session::config::nightly_options; +use rustc::session::parse::feature_err; use rustc::ty::TyCtxt; -use syntax::feature_gate::feature_err; -use syntax::symbol::sym; -use syntax_pos::{Span, Symbol}; +use rustc_errors::struct_span_err; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::sym; +use rustc_span::{Span, Symbol}; use super::{ConstKind, Item}; -use rustc_error_codes::*; - /// An operation that is not *always* allowed in a const context. pub trait NonConstOp: std::fmt::Debug { /// Whether this operation can be evaluated by miri. @@ -39,10 +38,14 @@ pub trait NonConstOp: std::fmt::Debug { item.const_kind() ); if item.tcx.sess.teach(&err.get_code().unwrap()) { - err.note("A function call isn't allowed in the const's initialization expression \ - because the expression's value must be known at compile-time."); - err.note("Remember: you can't use a function call inside a const's initialization \ - expression! However, you can use it anywhere else."); + err.note( + "A function call isn't allowed in the const's initialization expression \ + because the expression's value must be known at compile-time.", + ); + err.note( + "Remember: you can't use a function call inside a const's initialization \ + expression! However, you can use it anywhere else.", + ); } err.emit(); } @@ -62,9 +65,10 @@ impl NonConstOp for Downcast { pub struct FnCallIndirect; impl NonConstOp for FnCallIndirect { fn emit_error(&self, item: &Item<'_, '_>, span: Span) { - let mut err = item.tcx.sess.struct_span_err( - span, - &format!("function pointers are not allowed in const fn")); + let mut err = item + .tcx + .sess + .struct_span_err(span, &format!("function pointers are not allowed in const fn")); err.emit(); } } @@ -105,14 +109,12 @@ impl NonConstOp for FnCallUnstable { fn emit_error(&self, item: &Item<'_, '_>, span: Span) { let FnCallUnstable(def_id, feature) = *self; - let mut err = item.tcx.sess.struct_span_err(span, - &format!("`{}` is not yet stable as a const fn", - item.tcx.def_path_str(def_id))); + let mut err = item.tcx.sess.struct_span_err( + span, + &format!("`{}` is not yet stable as a const fn", item.tcx.def_path_str(def_id)), + ); if nightly_options::is_nightly_build() { - help!(&mut err, - "add `#![feature({})]` to the \ - crate attributes to enable", - feature); + err.help(&format!("add `#![feature({})]` to the crate attributes to enable", feature)); } err.emit(); } @@ -124,15 +126,20 @@ impl NonConstOp for HeapAllocation { const IS_SUPPORTED_IN_MIRI: bool = false; fn emit_error(&self, item: &Item<'_, '_>, span: Span) { - let mut err = struct_span_err!(item.tcx.sess, span, E0010, - "allocations are not allowed in {}s", item.const_kind()); + let mut err = struct_span_err!( + item.tcx.sess, + span, + E0010, + "allocations are not allowed in {}s", + item.const_kind() + ); err.span_label(span, format!("allocation not allowed in {}s", item.const_kind())); if item.tcx.sess.teach(&err.get_code().unwrap()) { err.note( "The value of statics and constants must be known at compile time, \ and they live for the entire lifetime of a program. Creating a boxed \ value allocates memory on the heap at runtime, and therefore cannot \ - be done at compile time." + be done at compile time.", ); } err.emit(); @@ -148,10 +155,7 @@ impl NonConstOp for IfOrMatch { fn emit_error(&self, item: &Item<'_, '_>, span: Span) { // This should be caught by the HIR const-checker. - item.tcx.sess.delay_span_bug( - span, - "complex control flow is forbidden in a const context", - ); + item.tcx.sess.delay_span_bug(span, "complex control flow is forbidden in a const context"); } } @@ -159,11 +163,14 @@ impl NonConstOp for IfOrMatch { pub struct LiveDrop; impl NonConstOp for LiveDrop { fn emit_error(&self, item: &Item<'_, '_>, span: Span) { - struct_span_err!(item.tcx.sess, span, E0493, - "destructors cannot be evaluated at compile-time") - .span_label(span, format!("{}s cannot evaluate destructors", - item.const_kind())) - .emit(); + struct_span_err!( + item.tcx.sess, + span, + E0493, + "destructors cannot be evaluated at compile-time" + ) + .span_label(span, format!("{}s cannot evaluate destructors", item.const_kind())) + .emit(); } } @@ -176,10 +183,7 @@ impl NonConstOp for Loop { fn emit_error(&self, item: &Item<'_, '_>, span: Span) { // This should be caught by the HIR const-checker. - item.tcx.sess.delay_span_bug( - span, - "complex control flow is forbidden in a const context", - ); + item.tcx.sess.delay_span_bug(span, "complex control flow is forbidden in a const context"); } } @@ -187,9 +191,14 @@ impl NonConstOp for Loop { pub struct CellBorrow; impl NonConstOp for CellBorrow { fn emit_error(&self, item: &Item<'_, '_>, span: Span) { - span_err!(item.tcx.sess, span, E0492, + struct_span_err!( + item.tcx.sess, + span, + E0492, "cannot borrow a constant which may contain \ - interior mutability, create a static instead"); + interior mutability, create a static instead" + ) + .emit(); } } @@ -205,25 +214,47 @@ impl NonConstOp for MutBorrow { &item.tcx.sess.parse_sess, sym::const_mut_refs, span, - &format!("references in {}s may only refer \ - to immutable values", item.const_kind()) + &format!( + "references in {}s may only refer \ + to immutable values", + item.const_kind() + ), ); - err.span_label(span, format!("{}s require immutable values", - item.const_kind())); + err.span_label(span, format!("{}s require immutable values", item.const_kind())); if item.tcx.sess.teach(&err.get_code().unwrap()) { - err.note("References in statics and constants may only refer \ + err.note( + "References in statics and constants may only refer \ to immutable values.\n\n\ Statics are shared everywhere, and if they refer to \ mutable data one might violate memory safety since \ holding multiple mutable references to shared data \ is not allowed.\n\n\ If you really want global mutable state, try using \ - static mut or a global UnsafeCell."); + static mut or a global UnsafeCell.", + ); } err.emit(); } } +#[derive(Debug)] +pub struct MutAddressOf; +impl NonConstOp for MutAddressOf { + fn feature_gate(tcx: TyCtxt<'_>) -> Option { + Some(tcx.features().const_mut_refs) + } + + fn emit_error(&self, item: &Item<'_, '_>, span: Span) { + feature_err( + &item.tcx.sess.parse_sess, + sym::const_mut_refs, + span, + &format!("`&raw mut` is not allowed in {}s", item.const_kind()), + ) + .emit(); + } +} + #[derive(Debug)] pub struct MutDeref; impl NonConstOp for MutDeref { @@ -277,11 +308,10 @@ impl NonConstOp for RawPtrDeref { fn emit_error(&self, item: &Item<'_, '_>, span: Span) { feature_err( - &item.tcx.sess.parse_sess, sym::const_raw_ptr_deref, span, - &format!( - "dereferencing raw pointers in {}s is unstable", - item.const_kind(), - ), + &item.tcx.sess.parse_sess, + sym::const_raw_ptr_deref, + span, + &format!("dereferencing raw pointers in {}s is unstable", item.const_kind(),), ) .emit(); } @@ -296,11 +326,10 @@ impl NonConstOp for RawPtrToIntCast { fn emit_error(&self, item: &Item<'_, '_>, span: Span) { feature_err( - &item.tcx.sess.parse_sess, sym::const_raw_ptr_to_usize_cast, span, - &format!( - "casting pointers to integers in {}s is unstable", - item.const_kind(), - ), + &item.tcx.sess.parse_sess, + sym::const_raw_ptr_to_usize_cast, + span, + &format!("casting pointers to integers in {}s is unstable", item.const_kind(),), ) .emit(); } @@ -315,17 +344,22 @@ impl NonConstOp for StaticAccess { } fn emit_error(&self, item: &Item<'_, '_>, span: Span) { - let mut err = struct_span_err!(item.tcx.sess, span, E0013, - "{}s cannot refer to statics, use \ - a constant instead", item.const_kind()); + let mut err = struct_span_err!( + item.tcx.sess, + span, + E0013, + "{}s cannot refer to statics", + item.const_kind() + ); + err.help( + "consider extracting the value of the `static` to a `const`, and referring to that", + ); if item.tcx.sess.teach(&err.get_code().unwrap()) { err.note( - "Static and const variables can refer to other const variables. \ - But a const variable cannot refer to a static variable." - ); - err.help( - "To fix this, the value can be extracted as a const and then used." + "`static` and `const` variables can refer to other `const` variables. \ + A `const` variable, however, cannot refer to a `static` variable.", ); + err.help("To fix this, the value can be extracted to a `const` and then used."); } err.emit(); } @@ -338,9 +372,14 @@ impl NonConstOp for ThreadLocalAccess { const IS_SUPPORTED_IN_MIRI: bool = false; fn emit_error(&self, item: &Item<'_, '_>, span: Span) { - span_err!(item.tcx.sess, span, E0625, + struct_span_err!( + item.tcx.sess, + span, + E0625, "thread-local statics cannot be \ - accessed at compile-time"); + accessed at compile-time" + ) + .emit(); } } @@ -358,7 +397,9 @@ impl NonConstOp for UnionAccess { fn emit_error(&self, item: &Item<'_, '_>, span: Span) { feature_err( - &item.tcx.sess.parse_sess, sym::const_fn_union, span, + &item.tcx.sess.parse_sess, + sym::const_fn_union, + span, "unions in const fn are unstable", ) .emit(); diff --git a/src/librustc_mir/transform/check_consts/qualifs.rs b/src/librustc_mir/transform/check_consts/qualifs.rs index 1f58a05302..577736f9bd 100644 --- a/src/librustc_mir/transform/check_consts/qualifs.rs +++ b/src/librustc_mir/transform/check_consts/qualifs.rs @@ -2,7 +2,7 @@ use rustc::mir::*; use rustc::ty::{self, Ty}; -use syntax_pos::DUMMY_SP; +use rustc_span::DUMMY_SP; use super::Item as ConstCx; @@ -38,22 +38,24 @@ pub trait Qualif { place: PlaceRef<'_, 'tcx>, ) -> bool { if let [proj_base @ .., elem] = place.projection { - let base_qualif = Self::in_place(cx, per_local, PlaceRef { - base: place.base, - projection: proj_base, - }); - let qualif = base_qualif && Self::in_any_value_of_ty( + let base_qualif = Self::in_place( cx, - Place::ty_from(place.base, proj_base, *cx.body, cx.tcx) - .projection_ty(cx.tcx, elem) - .ty, + per_local, + PlaceRef { local: place.local, projection: proj_base }, ); + let qualif = base_qualif + && Self::in_any_value_of_ty( + cx, + Place::ty_from(place.local, proj_base, *cx.body, cx.tcx) + .projection_ty(cx.tcx, elem) + .ty, + ); match elem { - ProjectionElem::Deref | - ProjectionElem::Subslice { .. } | - ProjectionElem::Field(..) | - ProjectionElem::ConstantIndex { .. } | - ProjectionElem::Downcast(..) => qualif, + ProjectionElem::Deref + | ProjectionElem::Subslice { .. } + | ProjectionElem::Field(..) + | ProjectionElem::ConstantIndex { .. } + | ProjectionElem::Downcast(..) => qualif, ProjectionElem::Index(local) => qualif || per_local(*local), } @@ -76,18 +78,8 @@ pub trait Qualif { place: PlaceRef<'_, 'tcx>, ) -> bool { match place { - PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } => per_local(*local), - PlaceRef { - base: PlaceBase::Static(_), - projection: [], - } => bug!("qualifying already promoted MIR"), - PlaceRef { - base: _, - projection: [.., _], - } => Self::in_projection(cx, per_local, place), + PlaceRef { local, projection: [] } => per_local(*local), + PlaceRef { local: _, projection: [.., _] } => Self::in_projection(cx, per_local, place), } } @@ -97,8 +89,9 @@ pub trait Qualif { operand: &Operand<'tcx>, ) -> bool { match *operand { - Operand::Copy(ref place) | - Operand::Move(ref place) => Self::in_place(cx, per_local, place.as_ref()), + Operand::Copy(ref place) | Operand::Move(ref place) => { + Self::in_place(cx, per_local, place.as_ref()) + } Operand::Constant(ref constant) => { if constant.check_static_ptr(cx.tcx).is_some() { @@ -109,7 +102,9 @@ pub trait Qualif { // Note: this uses `constant.literal.ty` which is a reference or pointer to the // type of the actual `static` item. Self::in_any_value_of_ty(cx, constant.literal.ty) - } else if let ty::ConstKind::Unevaluated(def_id, _) = constant.literal.val { + } else if let ty::ConstKind::Unevaluated(def_id, _, promoted) = constant.literal.val + { + assert!(promoted.is_none()); // Don't peek inside trait associated constants. if cx.tcx.trait_of_item(def_id).is_some() { Self::in_any_value_of_ty(cx, constant.literal.ty) @@ -137,30 +132,30 @@ pub trait Qualif { match *rvalue { Rvalue::NullaryOp(..) => false, - Rvalue::Discriminant(ref place) | - Rvalue::Len(ref place) => Self::in_place(cx, per_local, place.as_ref()), + Rvalue::Discriminant(ref place) | Rvalue::Len(ref place) => { + Self::in_place(cx, per_local, place.as_ref()) + } - Rvalue::Use(ref operand) | - Rvalue::Repeat(ref operand, _) | - Rvalue::UnaryOp(_, ref operand) | - Rvalue::Cast(_, ref operand, _) => Self::in_operand(cx, per_local, operand), + Rvalue::Use(ref operand) + | Rvalue::Repeat(ref operand, _) + | Rvalue::UnaryOp(_, ref operand) + | Rvalue::Cast(_, ref operand, _) => Self::in_operand(cx, per_local, operand), - Rvalue::BinaryOp(_, ref lhs, ref rhs) | - Rvalue::CheckedBinaryOp(_, ref lhs, ref rhs) => { + Rvalue::BinaryOp(_, ref lhs, ref rhs) + | Rvalue::CheckedBinaryOp(_, ref lhs, ref rhs) => { Self::in_operand(cx, per_local, lhs) || Self::in_operand(cx, per_local, rhs) } - Rvalue::Ref(_, _, ref place) => { + Rvalue::Ref(_, _, ref place) | Rvalue::AddressOf(_, ref place) => { // Special-case reborrows to be more like a copy of the reference. - if let &[ref proj_base @ .., elem] = place.projection.as_ref() { - if ProjectionElem::Deref == elem { - let base_ty = Place::ty_from(&place.base, proj_base, *cx.body, cx.tcx).ty; - if let ty::Ref(..) = base_ty.kind { - return Self::in_place(cx, per_local, PlaceRef { - base: &place.base, - projection: proj_base, - }); - } + if let [proj_base @ .., ProjectionElem::Deref] = place.projection.as_ref() { + let base_ty = Place::ty_from(&place.local, proj_base, *cx.body, cx.tcx).ty; + if let ty::Ref(..) = base_ty.kind { + return Self::in_place( + cx, + per_local, + PlaceRef { local: &place.local, projection: proj_base }, + ); } } diff --git a/src/librustc_mir/transform/check_consts/resolver.rs b/src/librustc_mir/transform/check_consts/resolver.rs index cb542484be..2cd2495eef 100644 --- a/src/librustc_mir/transform/check_consts/resolver.rs +++ b/src/librustc_mir/transform/check_consts/resolver.rs @@ -8,8 +8,8 @@ use rustc_index::bit_set::BitSet; use std::marker::PhantomData; -use crate::dataflow::{self as old_dataflow, generic as dataflow}; use super::{Item, Qualif}; +use crate::dataflow::{self as old_dataflow, generic as dataflow}; /// A `Visitor` that propagates qualifs between locals. This defines the transfer function of /// `FlowSensitiveAnalysis`. @@ -28,15 +28,8 @@ impl TransferFunction<'a, 'mir, 'tcx, Q> where Q: Qualif, { - fn new( - item: &'a Item<'mir, 'tcx>, - qualifs_per_local: &'a mut BitSet, - ) -> Self { - TransferFunction { - item, - qualifs_per_local, - _qualif: PhantomData, - } + fn new(item: &'a Item<'mir, 'tcx>, qualifs_per_local: &'a mut BitSet) -> Self { + TransferFunction { item, qualifs_per_local, _qualif: PhantomData } } fn initialize_state(&mut self) { @@ -54,15 +47,15 @@ where debug_assert!(!place.is_indirect()); match (value, place.as_ref()) { - (true, mir::PlaceRef { base: &mir::PlaceBase::Local(local), .. }) => { - self.qualifs_per_local.insert(local); + (true, mir::PlaceRef { local, .. }) => { + self.qualifs_per_local.insert(*local); } // For now, we do not clear the qualif if a local is overwritten in full by // an unqualified rvalue (e.g. `y = 5`). This is to be consistent // with aggregates where we overwrite all fields with assignments, which would not // get this feature. - (false, mir::PlaceRef { base: &mir::PlaceBase::Local(_local), projection: &[] }) => { + (false, mir::PlaceRef { local: _, projection: &[] }) => { // self.qualifs_per_local.remove(*local); } @@ -78,13 +71,8 @@ where return_place: &mir::Place<'tcx>, ) { let return_ty = return_place.ty(*self.item.body, self.item.tcx).ty; - let qualif = Q::in_call( - self.item, - &|l| self.qualifs_per_local.contains(l), - func, - args, - return_ty, - ); + let qualif = + Q::in_call(self.item, &|l| self.qualifs_per_local.contains(l), func, args, return_ty); if !return_place.is_indirect() { self.assign_qualif_direct(return_place, qualif); } @@ -155,10 +143,7 @@ where Q: Qualif, { pub(super) fn new(_: Q, item: &'a Item<'mir, 'tcx>) -> Self { - FlowSensitiveAnalysis { - item, - _qualif: PhantomData, - } + FlowSensitiveAnalysis { item, _qualif: PhantomData } } fn transfer_function( @@ -173,7 +158,7 @@ impl old_dataflow::BottomValue for FlowSensitiveAnalysis<'_, '_, '_, Q> { const BOTTOM_VALUE: bool = false; } -impl dataflow::Analysis<'tcx> for FlowSensitiveAnalysis<'_, '_, 'tcx, Q> +impl dataflow::AnalysisDomain<'tcx> for FlowSensitiveAnalysis<'_, '_, 'tcx, Q> where Q: Qualif, { @@ -188,7 +173,12 @@ where fn initialize_start_block(&self, _body: &mir::Body<'tcx>, state: &mut BitSet) { self.transfer_function(state).initialize_state(); } +} +impl dataflow::Analysis<'tcx> for FlowSensitiveAnalysis<'_, '_, 'tcx, Q> +where + Q: Qualif, +{ fn apply_statement_effect( &self, state: &mut BitSet, diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs index 6261315c71..44b2a90053 100644 --- a/src/librustc_mir/transform/check_consts/validation.rs +++ b/src/librustc_mir/transform/check_consts/validation.rs @@ -1,26 +1,27 @@ //! The `Visitor` responsible for actually checking a `mir::Body` for invalid operations. -use rustc::hir::{HirId, def_id::DefId}; use rustc::middle::lang_items; -use rustc::mir::visit::{PlaceContext, Visitor, MutatingUseContext, NonMutatingUseContext}; +use rustc::mir::visit::{MutatingUseContext, NonMutatingUseContext, PlaceContext, Visitor}; use rustc::mir::*; use rustc::traits::{self, TraitEngine}; use rustc::ty::cast::CastTy; use rustc::ty::{self, TyCtxt}; +use rustc_errors::struct_span_err; +use rustc_hir::{def_id::DefId, HirId}; use rustc_index::bit_set::BitSet; -use rustc_error_codes::*; -use syntax::symbol::sym; -use syntax_pos::Span; +use rustc_span::symbol::sym; +use rustc_span::Span; use std::borrow::Cow; use std::ops::Deref; -use crate::dataflow::{self as old_dataflow, generic as dataflow}; use self::old_dataflow::IndirectlyMutableLocals; use super::ops::{self, NonConstOp}; use super::qualifs::{self, HasMutInterior, NeedsDrop}; use super::resolver::FlowSensitiveAnalysis; -use super::{ConstKind, Item, Qualif, is_lang_panic_fn}; +use super::{is_lang_panic_fn, ConstKind, Item, Qualif}; +use crate::const_eval::{is_const_fn, is_unstable_const_fn}; +use crate::dataflow::{self as old_dataflow, generic as dataflow}; pub type IndirectlyMutableResults<'mir, 'tcx> = old_dataflow::DataflowResultsCursor<'mir, 'tcx, IndirectlyMutableLocals<'mir, 'tcx>>; @@ -31,15 +32,10 @@ struct QualifCursor<'a, 'mir, 'tcx, Q: Qualif> { } impl QualifCursor<'a, 'mir, 'tcx, Q> { - pub fn new( - q: Q, - item: &'a Item<'mir, 'tcx>, - dead_unwinds: &BitSet, - ) -> Self { + pub fn new(q: Q, item: &'a Item<'mir, 'tcx>) -> Self { let analysis = FlowSensitiveAnalysis::new(q, item); - let results = - dataflow::Engine::new(item.tcx, &item.body, item.def_id, dead_unwinds, analysis) - .iterate_to_fixpoint(); + let results = dataflow::Engine::new_generic(item.tcx, &item.body, item.def_id, analysis) + .iterate_to_fixpoint(); let cursor = dataflow::ResultsCursor::new(*item.body, results); let mut in_any_value_of_ty = BitSet::new_empty(item.body.local_decls.len()); @@ -49,10 +45,7 @@ impl QualifCursor<'a, 'mir, 'tcx, Q> { } } - QualifCursor { - cursor, - in_any_value_of_ty, - } + QualifCursor { cursor, in_any_value_of_ty } } } @@ -77,8 +70,7 @@ impl Qualifs<'a, 'mir, 'tcx> { } self.needs_drop.cursor.seek_before(location); - self.needs_drop.cursor.get().contains(local) - || self.indirectly_mutable(local, location) + self.needs_drop.cursor.get().contains(local) || self.indirectly_mutable(local, location) } /// Returns `true` if `local` is `HasMutInterior` at the given `Location`. @@ -110,14 +102,13 @@ impl Qualifs<'a, 'mir, 'tcx> { // // If no `Return` terminator exists, this MIR is divergent. Just return the conservative // qualifs for the return type. - let return_block = item.body + let return_block = item + .body .basic_blocks() .iter_enumerated() - .find(|(_, block)| { - match block.terminator().kind { - TerminatorKind::Return => true, - _ => false, - } + .find(|(_, block)| match block.terminator().kind { + TerminatorKind::Return => true, + _ => false, }) .map(|(bb, _)| bb); @@ -152,23 +143,11 @@ impl Deref for Validator<'_, 'mir, 'tcx> { } impl Validator<'a, 'mir, 'tcx> { - pub fn new( - item: &'a Item<'mir, 'tcx>, - ) -> Self { - let dead_unwinds = BitSet::new_empty(item.body.basic_blocks().len()); - - let needs_drop = QualifCursor::new( - NeedsDrop, - item, - &dead_unwinds, - ); - - let has_mut_interior = QualifCursor::new( - HasMutInterior, - item, - &dead_unwinds, - ); + pub fn new(item: &'a Item<'mir, 'tcx>) -> Self { + let needs_drop = QualifCursor::new(NeedsDrop, item); + let has_mut_interior = QualifCursor::new(HasMutInterior, item); + let dead_unwinds = BitSet::new_empty(item.body.basic_blocks().len()); let indirectly_mutable = old_dataflow::do_dataflow( item.tcx, &*item.body, @@ -179,29 +158,19 @@ impl Validator<'a, 'mir, 'tcx> { |_, local| old_dataflow::DebugFormatted::new(&local), ); - let indirectly_mutable = old_dataflow::DataflowResultsCursor::new( - indirectly_mutable, - *item.body, - ); + let indirectly_mutable = + old_dataflow::DataflowResultsCursor::new(indirectly_mutable, *item.body); - let qualifs = Qualifs { - needs_drop, - has_mut_interior, - indirectly_mutable, - }; + let qualifs = Qualifs { needs_drop, has_mut_interior, indirectly_mutable }; - Validator { - span: item.body.span, - item, - qualifs, - } + Validator { span: item.body.span, item, qualifs } } pub fn check_body(&mut self) { - let Item { tcx, body, def_id, const_kind, .. } = *self.item; + let Item { tcx, body, def_id, const_kind, .. } = *self.item; - let use_min_const_fn_checks = - (const_kind == Some(ConstKind::ConstFn) && tcx.is_min_const_fn(def_id)) + let use_min_const_fn_checks = (const_kind == Some(ConstKind::ConstFn) + && crate::const_eval::is_min_const_fn(tcx, def_id)) && !tcx.sess.opts.debugging_opts.unleash_the_miri_inside_of_you; if use_min_const_fn_checks { @@ -224,8 +193,8 @@ impl Validator<'a, 'mir, 'tcx> { self.visit_body(body); // Ensure that the end result is `Sync` in a non-thread local `static`. - let should_check_for_sync = const_kind == Some(ConstKind::Static) - && !tcx.has_attr(def_id, sym::thread_local); + let should_check_for_sync = + const_kind == Some(ConstKind::Static) && !tcx.has_attr(def_id, sym::thread_local); if should_check_for_sync { let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); @@ -241,7 +210,7 @@ impl Validator<'a, 'mir, 'tcx> { /// context. pub fn check_op_spanned(&mut self, op: O, span: Span) where - O: NonConstOp + O: NonConstOp, { trace!("check_op: op={:?}", op); @@ -251,8 +220,7 @@ impl Validator<'a, 'mir, 'tcx> { // If an operation is supported in miri (and is not already controlled by a feature gate) it // can be turned on with `-Zunleash-the-miri-inside-of-you`. - let is_unleashable = O::IS_SUPPORTED_IN_MIRI - && O::feature_gate(self.tcx).is_none(); + let is_unleashable = O::IS_SUPPORTED_IN_MIRI && O::feature_gate(self.tcx).is_none(); if is_unleashable && self.tcx.sess.opts.debugging_opts.unleash_the_miri_inside_of_you { self.tcx.sess.span_warn(span, "skipping const checks"); @@ -276,14 +244,27 @@ impl Validator<'a, 'mir, 'tcx> { self.check_op_spanned(ops::StaticAccess, span) } } + + fn check_immutable_borrow_like(&mut self, location: Location, place: &Place<'tcx>) { + // FIXME: Change the `in_*` methods to take a `FnMut` so we don't have to manually + // seek the cursors beforehand. + self.qualifs.has_mut_interior.cursor.seek_before(location); + self.qualifs.indirectly_mutable.seek(location); + + let borrowed_place_has_mut_interior = HasMutInterior::in_place( + &self.item, + &|local| self.qualifs.has_mut_interior_eager_seek(local), + place.as_ref(), + ); + + if borrowed_place_has_mut_interior { + self.check_op(ops::CellBorrow); + } + } } impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { - fn visit_basic_block_data( - &mut self, - bb: BasicBlock, - block: &BasicBlockData<'tcx>, - ) { + fn visit_basic_block_data(&mut self, bb: BasicBlock, block: &BasicBlockData<'tcx>) { trace!("visit_basic_block_data: bb={:?} is_cleanup={:?}", bb, block.is_cleanup); // Just as the old checker did, we skip const-checking basic blocks on the unwind path. @@ -302,50 +283,66 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { trace!("visit_rvalue: rvalue={:?} location={:?}", rvalue, location); // Special-case reborrows to be more like a copy of a reference. - if let Rvalue::Ref(_, kind, ref place) = *rvalue { - if let Some(reborrowed_proj) = place_as_reborrow(self.tcx, *self.body, place) { - let ctx = match kind { - BorrowKind::Shared => PlaceContext::NonMutatingUse( - NonMutatingUseContext::SharedBorrow, - ), - BorrowKind::Shallow => PlaceContext::NonMutatingUse( - NonMutatingUseContext::ShallowBorrow, - ), - BorrowKind::Unique => PlaceContext::NonMutatingUse( - NonMutatingUseContext::UniqueBorrow, - ), - BorrowKind::Mut { .. } => PlaceContext::MutatingUse( - MutatingUseContext::Borrow, - ), - }; - self.visit_place_base(&place.base, ctx, location); - self.visit_projection(&place.base, reborrowed_proj, ctx, location); - return; + match *rvalue { + Rvalue::Ref(_, kind, ref place) => { + if let Some(reborrowed_proj) = place_as_reborrow(self.tcx, *self.body, place) { + let ctx = match kind { + BorrowKind::Shared => { + PlaceContext::NonMutatingUse(NonMutatingUseContext::SharedBorrow) + } + BorrowKind::Shallow => { + PlaceContext::NonMutatingUse(NonMutatingUseContext::ShallowBorrow) + } + BorrowKind::Unique => { + PlaceContext::NonMutatingUse(NonMutatingUseContext::UniqueBorrow) + } + BorrowKind::Mut { .. } => { + PlaceContext::MutatingUse(MutatingUseContext::Borrow) + } + }; + self.visit_place_base(&place.local, ctx, location); + self.visit_projection(&place.local, reborrowed_proj, ctx, location); + return; + } } + Rvalue::AddressOf(mutbl, ref place) => { + if let Some(reborrowed_proj) = place_as_reborrow(self.tcx, *self.body, place) { + let ctx = match mutbl { + Mutability::Not => { + PlaceContext::NonMutatingUse(NonMutatingUseContext::AddressOf) + } + Mutability::Mut => PlaceContext::MutatingUse(MutatingUseContext::AddressOf), + }; + self.visit_place_base(&place.local, ctx, location); + self.visit_projection(&place.local, reborrowed_proj, ctx, location); + return; + } + } + _ => {} } self.super_rvalue(rvalue, location); match *rvalue { - Rvalue::Use(_) | - Rvalue::Repeat(..) | - Rvalue::UnaryOp(UnOp::Neg, _) | - Rvalue::UnaryOp(UnOp::Not, _) | - Rvalue::NullaryOp(NullOp::SizeOf, _) | - Rvalue::CheckedBinaryOp(..) | - Rvalue::Cast(CastKind::Pointer(_), ..) | - Rvalue::Discriminant(..) | - Rvalue::Len(_) | - Rvalue::Aggregate(..) => {} - - | Rvalue::Ref(_, kind @ BorrowKind::Mut { .. }, ref place) - | Rvalue::Ref(_, kind @ BorrowKind::Unique, ref place) - => { + Rvalue::Use(_) + | Rvalue::Repeat(..) + | Rvalue::UnaryOp(UnOp::Neg, _) + | Rvalue::UnaryOp(UnOp::Not, _) + | Rvalue::NullaryOp(NullOp::SizeOf, _) + | Rvalue::CheckedBinaryOp(..) + | Rvalue::Cast(CastKind::Pointer(_), ..) + | Rvalue::Discriminant(..) + | Rvalue::Len(_) + | Rvalue::Aggregate(..) => {} + + Rvalue::Ref(_, kind @ BorrowKind::Mut { .. }, ref place) + | Rvalue::Ref(_, kind @ BorrowKind::Unique, ref place) => { let ty = place.ty(*self.body, self.tcx).ty; let is_allowed = match ty.kind { // Inside a `static mut`, `&mut [...]` is allowed. - ty::Array(..) | ty::Slice(_) if self.const_kind() == ConstKind::StaticMut - => true, + ty::Array(..) | ty::Slice(_) if self.const_kind() == ConstKind::StaticMut => { + true + } // FIXME(ecstaticmorse): We could allow `&mut []` inside a const context given // that this is merely a ZST and it is already eligible for promotion. @@ -354,12 +351,11 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { ty::Array(_, len) if len.try_eval_usize(cx.tcx, cx.param_env) == Some(0) => true, */ - _ => false, }; if !is_allowed { - if let BorrowKind::Mut{ .. } = kind { + if let BorrowKind::Mut { .. } = kind { self.check_op(ops::MutBorrow); } else { self.check_op(ops::CellBorrow); @@ -367,33 +363,15 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { } } - // At the moment, `PlaceBase::Static` is only used for promoted MIR. - | Rvalue::Ref(_, BorrowKind::Shared, ref place) - | Rvalue::Ref(_, BorrowKind::Shallow, ref place) - if matches!(place.base, PlaceBase::Static(_)) - => bug!("Saw a promoted during const-checking, which must run before promotion"), - - | Rvalue::Ref(_, kind @ BorrowKind::Shared, ref place) - | Rvalue::Ref(_, kind @ BorrowKind::Shallow, ref place) - => { - // FIXME: Change the `in_*` methods to take a `FnMut` so we don't have to manually - // seek the cursors beforehand. - self.qualifs.has_mut_interior.cursor.seek_before(location); - self.qualifs.indirectly_mutable.seek(location); - - let borrowed_place_has_mut_interior = HasMutInterior::in_place( - &self.item, - &|local| self.qualifs.has_mut_interior_eager_seek(local), - place.as_ref(), - ); - - if borrowed_place_has_mut_interior { - if let BorrowKind::Mut{ .. } = kind { - self.check_op(ops::MutBorrow); - } else { - self.check_op(ops::CellBorrow); - } - } + Rvalue::AddressOf(Mutability::Mut, _) => self.check_op(ops::MutAddressOf), + + Rvalue::Ref(_, BorrowKind::Shared, ref place) + | Rvalue::Ref(_, BorrowKind::Shallow, ref place) => { + self.check_immutable_borrow_like(location, place) + } + + Rvalue::AddressOf(Mutability::Not, ref place) => { + self.check_immutable_borrow_like(location, place) } Rvalue::Cast(CastKind::Misc, ref operand, cast_ty) => { @@ -401,19 +379,24 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { let cast_in = CastTy::from_ty(operand_ty).expect("bad input type for cast"); let cast_out = CastTy::from_ty(cast_ty).expect("bad output type for cast"); - if let (CastTy::Ptr(_), CastTy::Int(_)) - | (CastTy::FnPtr, CastTy::Int(_)) = (cast_in, cast_out) { + if let (CastTy::Ptr(_), CastTy::Int(_)) | (CastTy::FnPtr, CastTy::Int(_)) = + (cast_in, cast_out) + { self.check_op(ops::RawPtrToIntCast); } } Rvalue::BinaryOp(op, ref lhs, _) => { if let ty::RawPtr(_) | ty::FnPtr(..) = lhs.ty(*self.body, self.tcx).kind { - assert!(op == BinOp::Eq || op == BinOp::Ne || - op == BinOp::Le || op == BinOp::Lt || - op == BinOp::Ge || op == BinOp::Gt || - op == BinOp::Offset); - + assert!( + op == BinOp::Eq + || op == BinOp::Ne + || op == BinOp::Le + || op == BinOp::Lt + || op == BinOp::Ge + || op == BinOp::Gt + || op == BinOp::Offset + ); self.check_op(ops::RawPtrComparison); } @@ -425,33 +408,17 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { } } - fn visit_place_base( - &mut self, - place_base: &PlaceBase<'tcx>, - context: PlaceContext, - location: Location, - ) { + fn visit_place_base(&mut self, place_local: &Local, context: PlaceContext, location: Location) { trace!( - "visit_place_base: place_base={:?} context={:?} location={:?}", - place_base, + "visit_place_base: place_local={:?} context={:?} location={:?}", + place_local, context, location, ); - self.super_place_base(place_base, context, location); - - match place_base { - PlaceBase::Local(_) => {} - PlaceBase::Static(_) => { - bug!("Promotion must be run after const validation"); - } - } + self.super_place_base(place_local, context, location); } - fn visit_operand( - &mut self, - op: &Operand<'tcx>, - location: Location, - ) { + fn visit_operand(&mut self, op: &Operand<'tcx>, location: Location) { self.super_operand(op, location); if let Operand::Constant(c) = op { if let Some(def_id) = c.check_static_ptr(self.tcx) { @@ -461,30 +428,30 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { } fn visit_projection_elem( &mut self, - place_base: &PlaceBase<'tcx>, + place_local: &Local, proj_base: &[PlaceElem<'tcx>], elem: &PlaceElem<'tcx>, context: PlaceContext, location: Location, ) { trace!( - "visit_projection_elem: place_base={:?} proj_base={:?} elem={:?} \ + "visit_projection_elem: place_local={:?} proj_base={:?} elem={:?} \ context={:?} location={:?}", - place_base, + place_local, proj_base, elem, context, location, ); - self.super_projection_elem(place_base, proj_base, elem, context, location); + self.super_projection_elem(place_local, proj_base, elem, context, location); match elem { ProjectionElem::Deref => { - let base_ty = Place::ty_from(place_base, proj_base, *self.body, self.tcx).ty; + let base_ty = Place::ty_from(place_local, proj_base, *self.body, self.tcx).ty; if let ty::RawPtr(_) = base_ty.kind { if proj_base.is_empty() { - if let (PlaceBase::Local(local), []) = (place_base, proj_base) { + if let (local, []) = (place_local, proj_base) { let decl = &self.body.local_decls[*local]; if let LocalInfo::StaticRef { def_id, .. } = decl.local_info { let span = decl.source_info.span; @@ -501,11 +468,11 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { } } - ProjectionElem::ConstantIndex {..} | - ProjectionElem::Subslice {..} | - ProjectionElem::Field(..) | - ProjectionElem::Index(_) => { - let base_ty = Place::ty_from(place_base, proj_base, *self.body, self.tcx).ty; + ProjectionElem::ConstantIndex { .. } + | ProjectionElem::Subslice { .. } + | ProjectionElem::Field(..) + | ProjectionElem::Index(_) => { + let base_ty = Place::ty_from(place_local, proj_base, *self.body, self.tcx).ty; match base_ty.ty_adt_def() { Some(def) if def.is_union() => { self.check_op(ops::UnionAccess); @@ -521,7 +488,6 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { } } - fn visit_source_info(&mut self, source_info: &SourceInfo) { trace!("visit_source_info: source_info={:?}", source_info); self.span = source_info.span; @@ -538,13 +504,13 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { self.check_op(ops::IfOrMatch); } // FIXME(eddyb) should these really do nothing? - StatementKind::FakeRead(..) | - StatementKind::StorageLive(_) | - StatementKind::StorageDead(_) | - StatementKind::InlineAsm {..} | - StatementKind::Retag { .. } | - StatementKind::AscribeUserType(..) | - StatementKind::Nop => {} + StatementKind::FakeRead(..) + | StatementKind::StorageLive(_) + | StatementKind::StorageDead(_) + | StatementKind::InlineAsm { .. } + | StatementKind::Retag { .. } + | StatementKind::AscribeUserType(..) + | StatementKind::Nop => {} } } @@ -570,13 +536,13 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { }; // At this point, we are calling a function whose `DefId` is known... - if self.tcx.is_const_fn(def_id) { + if is_const_fn(self.tcx, def_id) { return; } if is_lang_panic_fn(self.tcx, def_id) { self.check_op(ops::Panic); - } else if let Some(feature) = self.tcx.is_unstable_const_fn(def_id) { + } else if let Some(feature) = is_unstable_const_fn(self.tcx, def_id) { // Exempt unstable const fns inside of macros with // `#[allow_internal_unstable]`. if !self.span.allows_unstable(feature) { @@ -585,22 +551,18 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> { } else { self.check_op(ops::FnCallNonConst(def_id)); } - } // Forbid all `Drop` terminators unless the place being dropped is a local with no // projections that cannot be `NeedsDrop`. - | TerminatorKind::Drop { location: dropped_place, .. } - | TerminatorKind::DropAndReplace { location: dropped_place, .. } - => { + TerminatorKind::Drop { location: dropped_place, .. } + | TerminatorKind::DropAndReplace { location: dropped_place, .. } => { let mut err_span = self.span; // Check to see if the type of this place can ever have a drop impl. If not, this // `Drop` terminator is frivolous. - let ty_needs_drop = dropped_place - .ty(*self.body, self.tcx) - .ty - .needs_drop(self.tcx, self.param_env); + let ty_needs_drop = + dropped_place.ty(*self.body, self.tcx).ty.needs_drop(self.tcx, self.param_env); if !ty_needs_drop { return; @@ -652,10 +614,13 @@ fn check_short_circuiting_in_const_local(item: &Item<'_, 'tcx>) { for (span, kind) in body.control_flow_destroyed.iter() { error.span_note( *span, - &format!("use of {} here does not actually short circuit due to \ + &format!( + "use of {} here does not actually short circuit due to \ the const evaluator presently not being able to do control flow. \ See https://github.com/rust-lang/rust/issues/49146 for more \ - information.", kind), + information.", + kind + ), ); } for local in locals { @@ -684,30 +649,25 @@ fn place_as_reborrow( body: &Body<'tcx>, place: &'a Place<'tcx>, ) -> Option<&'a [PlaceElem<'tcx>]> { - place - .projection - .split_last() - .and_then(|(outermost, inner)| { - if outermost != &ProjectionElem::Deref { - return None; - } + place.projection.split_last().and_then(|(outermost, inner)| { + if outermost != &ProjectionElem::Deref { + return None; + } - // A borrow of a `static` also looks like `&(*_1)` in the MIR, but `_1` is a `const` - // that points to the allocation for the static. Don't treat these as reborrows. - if let PlaceBase::Local(local) = place.base { - if body.local_decls[local].is_ref_to_static() { - return None; - } - } + // A borrow of a `static` also looks like `&(*_1)` in the MIR, but `_1` is a `const` + // that points to the allocation for the static. Don't treat these as reborrows. + if body.local_decls[place.local].is_ref_to_static() { + return None; + } - // Ensure the type being derefed is a reference and not a raw pointer. - // - // This is sufficient to prevent an access to a `static mut` from being marked as a - // reborrow, even if the check above were to disappear. - let inner_ty = Place::ty_from(&place.base, inner, body, tcx).ty; - match inner_ty.kind { - ty::Ref(..) => Some(inner), - _ => None, - } - }) + // Ensure the type being derefed is a reference and not a raw pointer. + // + // This is sufficient to prevent an access to a `static mut` from being marked as a + // reborrow, even if the check above were to disappear. + let inner_ty = Place::ty_from(&place.local, inner, body, tcx).ty; + match inner_ty.kind { + ty::Ref(..) => Some(inner), + _ => None, + } + }) } diff --git a/src/librustc_mir/transform/check_unsafety.rs b/src/librustc_mir/transform/check_unsafety.rs index 7e091413e7..73bd6c1c6c 100644 --- a/src/librustc_mir/transform/check_unsafety.rs +++ b/src/librustc_mir/transform/check_unsafety.rs @@ -1,23 +1,23 @@ -use rustc_data_structures::fx::FxHashSet; - -use rustc::ty::query::Providers; -use rustc::ty::{self, TyCtxt}; -use rustc::ty::cast::CastTy; -use rustc::hir; -use rustc::hir::Node; -use rustc::hir::def_id::DefId; +use rustc::hir::map::Map; use rustc::lint::builtin::{SAFE_PACKED_BORROWS, UNUSED_UNSAFE}; +use rustc::mir::visit::{MutatingUseContext, PlaceContext, Visitor}; use rustc::mir::*; -use rustc::mir::visit::{PlaceContext, Visitor, MutatingUseContext}; - -use syntax::symbol::{Symbol, sym}; +use rustc::ty::cast::CastTy; +use rustc::ty::query::Providers; +use rustc::ty::{self, TyCtxt}; +use rustc_data_structures::fx::FxHashSet; +use rustc_errors::struct_span_err; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::intravisit; +use rustc_hir::Node; +use rustc_span::symbol::{sym, Symbol}; use std::ops::Bound; +use crate::const_eval::{is_const_fn, is_min_const_fn}; use crate::util; -use rustc_error_codes::*; - pub struct UnsafetyChecker<'a, 'tcx> { body: &'a Body<'tcx>, const_context: bool, @@ -48,10 +48,7 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { const_context, min_const_fn, violations: vec![], - source_info: SourceInfo { - span: body.span, - scope: OUTERMOST_SOURCE_SCOPE - }, + source_info: SourceInfo { span: body.span, scope: OUTERMOST_SOURCE_SCOPE }, tcx, param_env, used_unsafe: Default::default(), @@ -61,25 +58,22 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { } impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { - fn visit_terminator(&mut self, - terminator: &Terminator<'tcx>, - location: Location) - { + fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) { self.source_info = terminator.source_info; match terminator.kind { - TerminatorKind::Goto { .. } | - TerminatorKind::SwitchInt { .. } | - TerminatorKind::Drop { .. } | - TerminatorKind::Yield { .. } | - TerminatorKind::Assert { .. } | - TerminatorKind::DropAndReplace { .. } | - TerminatorKind::GeneratorDrop | - TerminatorKind::Resume | - TerminatorKind::Abort | - TerminatorKind::Return | - TerminatorKind::Unreachable | - TerminatorKind::FalseEdges { .. } | - TerminatorKind::FalseUnwind { .. } => { + TerminatorKind::Goto { .. } + | TerminatorKind::SwitchInt { .. } + | TerminatorKind::Drop { .. } + | TerminatorKind::Yield { .. } + | TerminatorKind::Assert { .. } + | TerminatorKind::DropAndReplace { .. } + | TerminatorKind::GeneratorDrop + | TerminatorKind::Resume + | TerminatorKind::Abort + | TerminatorKind::Return + | TerminatorKind::Unreachable + | TerminatorKind::FalseEdges { .. } + | TerminatorKind::FalseUnwind { .. } => { // safe (at least as emitted during MIR construction) } @@ -87,89 +81,86 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { let func_ty = func.ty(self.body, self.tcx); let sig = func_ty.fn_sig(self.tcx); if let hir::Unsafety::Unsafe = sig.unsafety() { - self.require_unsafe("call to unsafe function", + self.require_unsafe( + "call to unsafe function", "consult the function's documentation for information on how to avoid \ - undefined behavior", UnsafetyViolationKind::GeneralAndConstFn) + undefined behavior", + UnsafetyViolationKind::GeneralAndConstFn, + ) } } } self.super_terminator(terminator, location); } - fn visit_statement(&mut self, - statement: &Statement<'tcx>, - location: Location) - { + fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) { self.source_info = statement.source_info; match statement.kind { - StatementKind::Assign(..) | - StatementKind::FakeRead(..) | - StatementKind::SetDiscriminant { .. } | - StatementKind::StorageLive(..) | - StatementKind::StorageDead(..) | - StatementKind::Retag { .. } | - StatementKind::AscribeUserType(..) | - StatementKind::Nop => { + StatementKind::Assign(..) + | StatementKind::FakeRead(..) + | StatementKind::SetDiscriminant { .. } + | StatementKind::StorageLive(..) + | StatementKind::StorageDead(..) + | StatementKind::Retag { .. } + | StatementKind::AscribeUserType(..) + | StatementKind::Nop => { // safe (at least as emitted during MIR construction) } - StatementKind::InlineAsm { .. } => { - self.require_unsafe("use of inline assembly", - "inline assembly is entirely unchecked and can cause undefined behavior", - UnsafetyViolationKind::General) - }, + StatementKind::InlineAsm { .. } => self.require_unsafe( + "use of inline assembly", + "inline assembly is entirely unchecked and can cause undefined behavior", + UnsafetyViolationKind::General, + ), } self.super_statement(statement, location); } - fn visit_rvalue(&mut self, - rvalue: &Rvalue<'tcx>, - location: Location) - { + fn visit_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location) { match rvalue { - Rvalue::Aggregate(box ref aggregate, _) => { - match aggregate { - &AggregateKind::Array(..) | - &AggregateKind::Tuple => {} - &AggregateKind::Adt(ref def, ..) => { - match self.tcx.layout_scalar_valid_range(def.did) { - (Bound::Unbounded, Bound::Unbounded) => {}, - _ => self.require_unsafe( - "initializing type with `rustc_layout_scalar_valid_range` attr", - "initializing a layout restricted type's field with a value \ + Rvalue::Aggregate(box ref aggregate, _) => match aggregate { + &AggregateKind::Array(..) | &AggregateKind::Tuple => {} + &AggregateKind::Adt(ref def, ..) => { + match self.tcx.layout_scalar_valid_range(def.did) { + (Bound::Unbounded, Bound::Unbounded) => {} + _ => self.require_unsafe( + "initializing type with `rustc_layout_scalar_valid_range` attr", + "initializing a layout restricted type's field with a value \ outside the valid range is undefined behavior", - UnsafetyViolationKind::GeneralAndConstFn, - ), - } - } - &AggregateKind::Closure(def_id, _) | - &AggregateKind::Generator(def_id, _, _) => { - let UnsafetyCheckResult { - violations, unsafe_blocks - } = self.tcx.unsafety_check_result(def_id); - self.register_violations(&violations, &unsafe_blocks); + UnsafetyViolationKind::GeneralAndConstFn, + ), } } + &AggregateKind::Closure(def_id, _) | &AggregateKind::Generator(def_id, _, _) => { + let UnsafetyCheckResult { violations, unsafe_blocks } = + self.tcx.unsafety_check_result(def_id); + self.register_violations(&violations, &unsafe_blocks); + } }, // casting pointers to ints is unsafe in const fn because the const evaluator cannot // possibly know what the result of various operations like `address / 2` would be // pointers during const evaluation have no integral address, only an abstract one Rvalue::Cast(CastKind::Misc, ref operand, cast_ty) - if self.const_context && self.tcx.features().const_raw_ptr_to_usize_cast => { + if self.const_context && self.tcx.features().const_raw_ptr_to_usize_cast => + { let operand_ty = operand.ty(self.body, self.tcx); let cast_in = CastTy::from_ty(operand_ty).expect("bad input type for cast"); let cast_out = CastTy::from_ty(cast_ty).expect("bad output type for cast"); match (cast_in, cast_out) { - (CastTy::Ptr(_), CastTy::Int(_)) | - (CastTy::FnPtr, CastTy::Int(_)) => { - self.register_violations(&[UnsafetyViolation { - source_info: self.source_info, - description: Symbol::intern("cast of pointer to int"), - details: Symbol::intern("casting pointers to integers in constants"), - kind: UnsafetyViolationKind::General, - }], &[]); - }, - _ => {}, + (CastTy::Ptr(_), CastTy::Int(_)) | (CastTy::FnPtr, CastTy::Int(_)) => { + self.register_violations( + &[UnsafetyViolation { + source_info: self.source_info, + description: Symbol::intern("cast of pointer to int"), + details: Symbol::intern( + "casting pointers to integers in constants", + ), + kind: UnsafetyViolationKind::General, + }], + &[], + ); + } + _ => {} } } // raw pointer and fn pointer operations are unsafe as it is not clear whether one @@ -177,37 +168,26 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { // or the linker will place various statics in memory. Without this information the // result of a comparison of addresses would differ between runtime and compile-time. Rvalue::BinaryOp(_, ref lhs, _) - if self.const_context && self.tcx.features().const_compare_raw_pointers => { + if self.const_context && self.tcx.features().const_compare_raw_pointers => + { if let ty::RawPtr(_) | ty::FnPtr(..) = lhs.ty(self.body, self.tcx).kind { - self.register_violations(&[UnsafetyViolation { - source_info: self.source_info, - description: Symbol::intern("pointer operation"), - details: Symbol::intern("operations on pointers in constants"), - kind: UnsafetyViolationKind::General, - }], &[]); + self.register_violations( + &[UnsafetyViolation { + source_info: self.source_info, + description: Symbol::intern("pointer operation"), + details: Symbol::intern("operations on pointers in constants"), + kind: UnsafetyViolationKind::General, + }], + &[], + ); } } - _ => {}, + _ => {} } self.super_rvalue(rvalue, location); } - fn visit_place(&mut self, - place: &Place<'tcx>, - context: PlaceContext, - _location: Location) { - match place.base { - PlaceBase::Local(..) => { - // Locals are safe. - } - PlaceBase::Static(box Static { kind: StaticKind::Promoted(_, _), .. }) => { - bug!("unsafety checking should happen before promotion"); - } - PlaceBase::Static(box Static { kind: StaticKind::Static, .. }) => { - bug!("StaticKind::Static should not exist"); - } - } - + fn visit_place(&mut self, place: &Place<'tcx>, context: PlaceContext, _location: Location) { for (i, elem) in place.projection.iter().enumerate() { let proj_base = &place.projection[..i]; @@ -219,21 +199,27 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { .as_ref() .assert_crate_local() .lint_root; - self.register_violations(&[UnsafetyViolation { - source_info, - description: Symbol::intern("borrow of packed field"), - details: Symbol::intern( - "fields of packed structs might be misaligned: dereferencing a \ + self.register_violations( + &[UnsafetyViolation { + source_info, + description: Symbol::intern("borrow of packed field"), + details: Symbol::intern( + "fields of packed structs might be misaligned: dereferencing a \ misaligned pointer or even just creating a misaligned reference \ - is undefined behavior"), - kind: UnsafetyViolationKind::BorrowPacked(lint_root) - }], &[]); + is undefined behavior", + ), + kind: UnsafetyViolationKind::BorrowPacked(lint_root), + }], + &[], + ); } } - let is_borrow_of_interior_mut = context.is_borrow() && - !Place::ty_from(&place.base, proj_base, self.body, self.tcx) - .ty - .is_freeze(self.tcx, self.param_env, self.source_info.span); + let is_borrow_of_interior_mut = context.is_borrow() + && !Place::ty_from(&place.local, proj_base, self.body, self.tcx).ty.is_freeze( + self.tcx, + self.param_env, + self.source_info.span, + ); // prevent // * `&mut x.field` // * `x.field = y;` @@ -241,12 +227,10 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { // because either of these would allow modifying the layout constrained field and // insert values that violate the layout constraints. if context.is_mutating_use() || is_borrow_of_interior_mut { - self.check_mut_borrowing_layout_constrained_field( - place, context.is_mutating_use(), - ); + self.check_mut_borrowing_layout_constrained_field(place, context.is_mutating_use()); } let old_source_info = self.source_info; - if let (PlaceBase::Local(local), []) = (&place.base, proj_base) { + if let (local, []) = (&place.local, proj_base) { let decl = &self.body.local_decls[*local]; if decl.internal { if let LocalInfo::StaticRef { def_id, .. } = decl.local_info { @@ -276,28 +260,28 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { } } } - let base_ty = Place::ty_from(&place.base, proj_base, self.body, self.tcx).ty; + let base_ty = Place::ty_from(&place.local, proj_base, self.body, self.tcx).ty; match base_ty.kind { - ty::RawPtr(..) => { - self.require_unsafe("dereference of raw pointer", - "raw pointers may be NULL, dangling or unaligned; they can violate \ + ty::RawPtr(..) => self.require_unsafe( + "dereference of raw pointer", + "raw pointers may be NULL, dangling or unaligned; they can violate \ aliasing rules and cause data races: all of these are undefined \ - behavior", UnsafetyViolationKind::General) - } + behavior", + UnsafetyViolationKind::General, + ), ty::Adt(adt, _) => { if adt.is_union() { - if context == PlaceContext::MutatingUse(MutatingUseContext::Store) || - context == PlaceContext::MutatingUse(MutatingUseContext::Drop) || - context == PlaceContext::MutatingUse( - MutatingUseContext::AsmOutput - ) + if context == PlaceContext::MutatingUse(MutatingUseContext::Store) + || context == PlaceContext::MutatingUse(MutatingUseContext::Drop) + || context == PlaceContext::MutatingUse(MutatingUseContext::AsmOutput) { let elem_ty = match elem { ProjectionElem::Field(_, ty) => ty, _ => span_bug!( self.source_info.span, "non-field projection {:?} from union?", - place) + place + ), }; if !elem_ty.is_copy_modulo_regions( self.tcx, @@ -308,15 +292,19 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { "assignment to non-`Copy` union field", "the previous content of the field will be dropped, which \ causes undefined behavior if the field was not properly \ - initialized", UnsafetyViolationKind::GeneralAndConstFn) + initialized", + UnsafetyViolationKind::GeneralAndConstFn, + ) } else { // write to non-move union, safe } } else { - self.require_unsafe("access to union field", + self.require_unsafe( + "access to union field", "the field may not be properly initialized: using \ uninitialized data will cause undefined behavior", - UnsafetyViolationKind::GeneralAndConstFn) + UnsafetyViolationKind::GeneralAndConstFn, + ) } } } @@ -335,17 +323,22 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { kind: UnsafetyViolationKind, ) { let source_info = self.source_info; - self.register_violations(&[UnsafetyViolation { - source_info, - description: Symbol::intern(description), - details: Symbol::intern(details), - kind, - }], &[]); + self.register_violations( + &[UnsafetyViolation { + source_info, + description: Symbol::intern(description), + details: Symbol::intern(details), + kind, + }], + &[], + ); } - fn register_violations(&mut self, - violations: &[UnsafetyViolation], - unsafe_blocks: &[(hir::HirId, bool)]) { + fn register_violations( + &mut self, + violations: &[UnsafetyViolation], + unsafe_blocks: &[(hir::HirId, bool)], + ) { let safety = self.body.source_scopes[self.source_info.scope] .local_data .as_ref() @@ -355,16 +348,18 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { // `unsafe` blocks are required in safe code Safety::Safe => { for violation in violations { - let mut violation = violation.clone(); + let mut violation = *violation; match violation.kind { - UnsafetyViolationKind::GeneralAndConstFn | - UnsafetyViolationKind::General => {}, - UnsafetyViolationKind::BorrowPacked(_) => if self.min_const_fn { - // const fns don't need to be backwards compatible and can - // emit these violations as a hard error instead of a backwards - // compat lint - violation.kind = UnsafetyViolationKind::General; - }, + UnsafetyViolationKind::GeneralAndConstFn + | UnsafetyViolationKind::General => {} + UnsafetyViolationKind::BorrowPacked(_) => { + if self.min_const_fn { + // const fns don't need to be backwards compatible and can + // emit these violations as a hard error instead of a backwards + // compat lint + violation.kind = UnsafetyViolationKind::General; + } + } } if !self.violations.contains(&violation) { self.violations.push(violation) @@ -384,11 +379,11 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { for violation in violations { match violation.kind { // these unsafe things are stable in const fn - UnsafetyViolationKind::GeneralAndConstFn => {}, + UnsafetyViolationKind::GeneralAndConstFn => {} // these things are forbidden in const fns - UnsafetyViolationKind::General | - UnsafetyViolationKind::BorrowPacked(_) => { - let mut violation = violation.clone(); + UnsafetyViolationKind::General + | UnsafetyViolationKind::BorrowPacked(_) => { + let mut violation = *violation; // const fns don't need to be backwards compatible and can // emit these violations as a hard error instead of a backwards // compat lint @@ -396,16 +391,16 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { if !self.violations.contains(&violation) { self.violations.push(violation) } - }, + } } } } true } }; - self.inherited_blocks.extend(unsafe_blocks.iter().map(|&(hir_id, is_used)| { - (hir_id, is_used && !within_unsafe) - })); + self.inherited_blocks.extend( + unsafe_blocks.iter().map(|&(hir_id, is_used)| (hir_id, is_used && !within_unsafe)), + ); } fn check_mut_borrowing_layout_constrained_field( &mut self, @@ -419,11 +414,11 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { match elem { ProjectionElem::Field(..) => { let ty = - Place::ty_from(&place.base, proj_base, &self.body.local_decls, self.tcx) + Place::ty_from(&place.local, proj_base, &self.body.local_decls, self.tcx) .ty; match ty.kind { ty::Adt(def, _) => match self.tcx.layout_scalar_valid_range(def.did) { - (Bound::Unbounded, Bound::Unbounded) => {}, + (Bound::Unbounded, Bound::Unbounded) => {} _ => { let (description, details) = if is_mut_use { ( @@ -441,12 +436,15 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { ) }; let source_info = self.source_info; - self.register_violations(&[UnsafetyViolation { - source_info, - description: Symbol::intern(description), - details: Symbol::intern(details), - kind: UnsafetyViolationKind::GeneralAndConstFn, - }], &[]); + self.register_violations( + &[UnsafetyViolation { + source_info, + description: Symbol::intern(description), + details: Symbol::intern(details), + kind: UnsafetyViolationKind::GeneralAndConstFn, + }], + &[], + ); } }, _ => {} @@ -459,11 +457,7 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { } pub(crate) fn provide(providers: &mut Providers<'_>) { - *providers = Providers { - unsafety_check_result, - unsafe_derive_on_repr_packed, - ..*providers - }; + *providers = Providers { unsafety_check_result, unsafe_derive_on_repr_packed, ..*providers }; } struct UnusedUnsafeVisitor<'a> { @@ -471,17 +465,17 @@ struct UnusedUnsafeVisitor<'a> { unsafe_blocks: &'a mut Vec<(hir::HirId, bool)>, } -impl<'a, 'tcx> hir::intravisit::Visitor<'tcx> for UnusedUnsafeVisitor<'a> { - fn nested_visit_map<'this>(&'this mut self) -> - hir::intravisit::NestedVisitorMap<'this, 'tcx> - { - hir::intravisit::NestedVisitorMap::None +impl<'a, 'tcx> intravisit::Visitor<'tcx> for UnusedUnsafeVisitor<'a> { + type Map = Map<'tcx>; + + fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, Self::Map> { + intravisit::NestedVisitorMap::None } - fn visit_block(&mut self, block: &'tcx hir::Block) { - hir::intravisit::walk_block(self, block); + fn visit_block(&mut self, block: &'tcx hir::Block<'tcx>) { + intravisit::walk_block(self, block); - if let hir::UnsafeBlock(hir::UserProvided) = block.rules { + if let hir::BlockCheckMode::UnsafeBlock(hir::UnsafeSource::UserProvided) = block.rules { self.unsafe_blocks.push((block.hir_id, self.used_unsafe.contains(&block.hir_id))); } } @@ -494,23 +488,20 @@ fn check_unused_unsafe( unsafe_blocks: &mut Vec<(hir::HirId, bool)>, ) { let body_id = - tcx.hir().as_local_hir_id(def_id).and_then(|hir_id| { - tcx.hir().maybe_body_owned_by(hir_id) - }); + tcx.hir().as_local_hir_id(def_id).and_then(|hir_id| tcx.hir().maybe_body_owned_by(hir_id)); let body_id = match body_id { Some(body) => body, None => { debug!("check_unused_unsafe({:?}) - no body found", def_id); - return + return; } }; let body = tcx.hir().body(body_id); - debug!("check_unused_unsafe({:?}, body={:?}, used_unsafe={:?})", - def_id, body, used_unsafe); + debug!("check_unused_unsafe({:?}, body={:?}, used_unsafe={:?})", def_id, body, used_unsafe); - let mut visitor = UnusedUnsafeVisitor { used_unsafe, unsafe_blocks }; - hir::intravisit::Visitor::visit_body(&mut visitor, body); + let mut visitor = UnusedUnsafeVisitor { used_unsafe, unsafe_blocks }; + intravisit::Visitor::visit_body(&mut visitor, body); } fn unsafety_check_result(tcx: TyCtxt<'_>, def_id: DefId) -> UnsafetyCheckResult { @@ -525,9 +516,8 @@ fn unsafety_check_result(tcx: TyCtxt<'_>, def_id: DefId) -> UnsafetyCheckResult let id = tcx.hir().as_local_hir_id(def_id).unwrap(); let (const_context, min_const_fn) = match tcx.hir().body_owner_kind(id) { hir::BodyOwnerKind::Closure => (false, false), - hir::BodyOwnerKind::Fn => (tcx.is_const_fn(def_id), tcx.is_min_const_fn(def_id)), - hir::BodyOwnerKind::Const | - hir::BodyOwnerKind::Static(_) => (true, false), + hir::BodyOwnerKind::Fn => (is_const_fn(tcx, def_id), is_min_const_fn(tcx, def_id)), + hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) => (true, false), }; let mut checker = UnsafetyChecker::new(const_context, min_const_fn, body, tcx, param_env); // mir_built ensures that body has a computed cache, so we don't (and can't) attempt to @@ -538,27 +528,28 @@ fn unsafety_check_result(tcx: TyCtxt<'_>, def_id: DefId) -> UnsafetyCheckResult check_unused_unsafe(tcx, def_id, &checker.used_unsafe, &mut checker.inherited_blocks); UnsafetyCheckResult { violations: checker.violations.into(), - unsafe_blocks: checker.inherited_blocks.into() + unsafe_blocks: checker.inherited_blocks.into(), } } fn unsafe_derive_on_repr_packed(tcx: TyCtxt<'_>, def_id: DefId) { - let lint_hir_id = tcx.hir().as_local_hir_id(def_id).unwrap_or_else(|| - bug!("checking unsafety for non-local def id {:?}", def_id)); + let lint_hir_id = tcx + .hir() + .as_local_hir_id(def_id) + .unwrap_or_else(|| bug!("checking unsafety for non-local def id {:?}", def_id)); // FIXME: when we make this a hard error, this should have its // own error code. let message = if tcx.generics_of(def_id).own_requires_monomorphization() { "`#[derive]` can't be used on a `#[repr(packed)]` struct with \ - type or const parameters (error E0133)".to_string() + type or const parameters (error E0133)" + .to_string() } else { "`#[derive]` can't be used on a `#[repr(packed)]` struct that \ - does not derive Copy (error E0133)".to_string() + does not derive Copy (error E0133)" + .to_string() }; - tcx.lint_hir(SAFE_PACKED_BORROWS, - lint_hir_id, - tcx.def_span(def_id), - &message); + tcx.lint_hir(SAFE_PACKED_BORROWS, lint_hir_id, tcx.def_span(def_id), &message); } /// Returns the `HirId` for an enclosing scope that is also `unsafe`. @@ -572,9 +563,9 @@ fn is_enclosed( if used_unsafe.contains(&parent_id) { Some(("block".to_string(), parent_id)) } else if let Some(Node::Item(&hir::Item { - kind: hir::ItemKind::Fn(ref sig, _, _), - .. - })) = tcx.hir().find(parent_id) { + kind: hir::ItemKind::Fn(ref sig, _, _), .. + })) = tcx.hir().find(parent_id) + { match sig.header.unsafety { hir::Unsafety::Unsafe => Some(("fn".to_string(), parent_id)), hir::Unsafety::Normal => None, @@ -593,8 +584,10 @@ fn report_unused_unsafe(tcx: TyCtxt<'_>, used_unsafe: &FxHashSet, id let mut db = tcx.struct_span_lint_hir(UNUSED_UNSAFE, id, span, msg); db.span_label(span, msg); if let Some((kind, id)) = is_enclosed(tcx, used_unsafe, id) { - db.span_label(tcx.sess.source_map().def_span(tcx.hir().span(id)), - format!("because it's nested under this `unsafe` {}", kind)); + db.span_label( + tcx.sess.source_map().def_span(tcx.hir().span(id)), + format!("because it's nested under this `unsafe` {}", kind), + ); } db.emit(); } @@ -623,35 +616,38 @@ pub fn check_unsafety(tcx: TyCtxt<'_>, def_id: DefId) { return; } - let UnsafetyCheckResult { - violations, - unsafe_blocks - } = tcx.unsafety_check_result(def_id); + let UnsafetyCheckResult { violations, unsafe_blocks } = tcx.unsafety_check_result(def_id); - for &UnsafetyViolation { - source_info, description, details, kind - } in violations.iter() { + for &UnsafetyViolation { source_info, description, details, kind } in violations.iter() { // Report an error. match kind { - UnsafetyViolationKind::GeneralAndConstFn | - UnsafetyViolationKind::General => { + UnsafetyViolationKind::GeneralAndConstFn | UnsafetyViolationKind::General => { struct_span_err!( - tcx.sess, source_info.span, E0133, - "{} is unsafe and requires unsafe function or block", description) - .span_label(source_info.span, &*description.as_str()) - .note(&details.as_str()) - .emit(); + tcx.sess, + source_info.span, + E0133, + "{} is unsafe and requires unsafe function or block", + description + ) + .span_label(source_info.span, &*description.as_str()) + .note(&details.as_str()) + .emit(); } UnsafetyViolationKind::BorrowPacked(lint_hir_id) => { if let Some(impl_def_id) = builtin_derive_def_id(tcx, def_id) { tcx.unsafe_derive_on_repr_packed(impl_def_id); } else { - tcx.lint_node_note(SAFE_PACKED_BORROWS, - lint_hir_id, - source_info.span, - &format!("{} is unsafe and requires unsafe function or block \ - (error E0133)", description), - &details.as_str()); + tcx.struct_span_lint_hir( + SAFE_PACKED_BORROWS, + lint_hir_id, + source_info.span, + &format!( + "{} is unsafe and requires unsafe function or block (error E0133)", + description + ), + ) + .note(&details.as_str()) + .emit(); } } } @@ -659,9 +655,8 @@ pub fn check_unsafety(tcx: TyCtxt<'_>, def_id: DefId) { let mut unsafe_blocks: Vec<_> = unsafe_blocks.into_iter().collect(); unsafe_blocks.sort_by_cached_key(|(hir_id, _)| tcx.hir().hir_to_node_id(*hir_id)); - let used_unsafe: FxHashSet<_> = unsafe_blocks.iter() - .flat_map(|&&(id, used)| used.then_some(id)) - .collect(); + let used_unsafe: FxHashSet<_> = + unsafe_blocks.iter().flat_map(|&&(id, used)| used.then_some(id)).collect(); for &(block_id, is_used) in unsafe_blocks { if !is_used { report_unused_unsafe(tcx, &used_unsafe, block_id); diff --git a/src/librustc_mir/transform/cleanup_post_borrowck.rs b/src/librustc_mir/transform/cleanup_post_borrowck.rs index 34519bc9fa..5288b6b370 100644 --- a/src/librustc_mir/transform/cleanup_post_borrowck.rs +++ b/src/librustc_mir/transform/cleanup_post_borrowck.rs @@ -16,11 +16,11 @@ //! [`FakeRead`]: rustc::mir::StatementKind::FakeRead //! [`Nop`]: rustc::mir::StatementKind::Nop -use rustc::mir::{BodyAndCache, BorrowKind, Rvalue, Location}; -use rustc::mir::{Statement, StatementKind}; +use crate::transform::{MirPass, MirSource}; use rustc::mir::visit::MutVisitor; +use rustc::mir::{BodyAndCache, BorrowKind, Location, Rvalue}; +use rustc::mir::{Statement, StatementKind}; use rustc::ty::TyCtxt; -use crate::transform::{MirPass, MirSource}; pub struct CleanupNonCodegenStatements; @@ -29,9 +29,7 @@ pub struct DeleteNonCodegenStatements<'tcx> { } impl<'tcx> MirPass<'tcx> for CleanupNonCodegenStatements { - fn run_pass( - &self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx> - ) { + fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { let mut delete = DeleteNonCodegenStatements { tcx }; delete.visit_body(body); } @@ -42,12 +40,10 @@ impl<'tcx> MutVisitor<'tcx> for DeleteNonCodegenStatements<'tcx> { self.tcx } - fn visit_statement(&mut self, - statement: &mut Statement<'tcx>, - location: Location) { + fn visit_statement(&mut self, statement: &mut Statement<'tcx>, location: Location) { match statement.kind { StatementKind::AscribeUserType(..) - | StatementKind::Assign(box(_, Rvalue::Ref(_, BorrowKind::Shallow, _))) + | StatementKind::Assign(box (_, Rvalue::Ref(_, BorrowKind::Shallow, _))) | StatementKind::FakeRead(..) => statement.make_nop(), _ => (), } diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index c4d89b1494..d645f6cf18 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -4,36 +4,36 @@ use std::borrow::Cow; use std::cell::Cell; -use rustc::hir::def::DefKind; -use rustc::hir::def_id::DefId; +use rustc::mir::interpret::{InterpResult, PanicInfo, Scalar}; +use rustc::mir::visit::{ + MutVisitor, MutatingUseContext, NonMutatingUseContext, PlaceContext, Visitor, +}; use rustc::mir::{ - AggregateKind, Constant, Location, Place, PlaceBase, Body, BodyAndCache, Operand, Local, UnOp, - Rvalue, StatementKind, Statement, LocalKind, TerminatorKind, Terminator, ClearCrossCrate, - SourceInfo, BinOp, SourceScope, SourceScopeData, LocalDecl, BasicBlock, ReadOnlyBodyAndCache, - read_only, RETURN_PLACE + read_only, AggregateKind, BasicBlock, BinOp, Body, BodyAndCache, ClearCrossCrate, Constant, + Local, LocalDecl, LocalKind, Location, Operand, Place, ReadOnlyBodyAndCache, Rvalue, + SourceInfo, SourceScope, SourceScopeData, Statement, StatementKind, Terminator, TerminatorKind, + UnOp, RETURN_PLACE, }; -use rustc::mir::visit::{ - Visitor, PlaceContext, MutatingUseContext, MutVisitor, NonMutatingUseContext, +use rustc::traits; +use rustc::ty::layout::{ + HasDataLayout, HasTyCtxt, LayoutError, LayoutOf, Size, TargetDataLayout, TyLayout, }; -use rustc::mir::interpret::{Scalar, InterpResult, PanicInfo}; -use rustc::ty::{self, Instance, ParamEnv, Ty, TyCtxt}; -use syntax::ast::Mutability; -use syntax_pos::{Span, DUMMY_SP}; -use rustc::ty::subst::InternalSubsts; +use rustc::ty::subst::{InternalSubsts, Subst}; +use rustc::ty::{self, ConstKind, Instance, ParamEnv, Ty, TyCtxt, TypeFoldable}; use rustc_data_structures::fx::FxHashMap; +use rustc_hir::def::DefKind; +use rustc_hir::def_id::DefId; +use rustc_hir::HirId; use rustc_index::vec::IndexVec; -use rustc::ty::layout::{ - LayoutOf, TyLayout, LayoutError, HasTyCtxt, TargetDataLayout, HasDataLayout, Size, -}; +use rustc_span::{Span, DUMMY_SP}; +use syntax::ast::Mutability; -use crate::rustc::ty::subst::Subst; +use crate::const_eval::error_to_const_error; use crate::interpret::{ - self, InterpCx, ScalarMaybeUndef, Immediate, OpTy, - StackPopCleanup, LocalValue, LocalState, AllocId, Frame, - Allocation, MemoryKind, ImmTy, Pointer, Memory, PlaceTy, - Operand as InterpOperand, intern_const_alloc_recursive, + self, intern_const_alloc_recursive, AllocId, Allocation, Frame, ImmTy, Immediate, InternKind, + InterpCx, LocalState, LocalValue, Memory, MemoryKind, OpTy, Operand as InterpOperand, PlaceTy, + Pointer, ScalarMaybeUndef, StackPopCleanup, }; -use crate::const_eval::error_to_const_error; use crate::transform::{MirPass, MirSource}; /// The maximum number of bytes that we'll allocate space for a return value. @@ -42,17 +42,17 @@ const MAX_ALLOC_LIMIT: u64 = 1024; pub struct ConstProp; impl<'tcx> MirPass<'tcx> for ConstProp { - fn run_pass( - &self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx> - ) { + fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { // will be evaluated by miri and produce its errors there if source.promoted.is_some() { return; } use rustc::hir::map::blocks::FnLikeNode; - let hir_id = tcx.hir().as_local_hir_id(source.def_id()) - .expect("Non-local call to local provider is_const_fn"); + let hir_id = tcx + .hir() + .as_local_hir_id(source.def_id()) + .expect("Non-local call to local provider is_const_fn"); let is_fn_like = FnLikeNode::from_node(tcx.hir().get(hir_id)).is_some(); let is_assoc_const = match tcx.def_kind(source.def_id()) { @@ -61,10 +61,10 @@ impl<'tcx> MirPass<'tcx> for ConstProp { }; // Only run const prop on functions, methods, closures and associated constants - if !is_fn_like && !is_assoc_const { + if !is_fn_like && !is_assoc_const { // skip anon_const/statics/consts because they'll be evaluated by miri anyway trace!("ConstProp skipped for {:?}", source.def_id()); - return + return; } let is_generator = tcx.type_of(source.def_id()).is_generator(); @@ -72,34 +72,69 @@ impl<'tcx> MirPass<'tcx> for ConstProp { // computing their layout. if is_generator { trace!("ConstProp skipped for generator {:?}", source.def_id()); - return + return; + } + + // Check if it's even possible to satisfy the 'where' clauses + // for this item. + // This branch will never be taken for any normal function. + // However, it's possible to `#!feature(trivial_bounds)]` to write + // a function with impossible to satisfy clauses, e.g.: + // `fn foo() where String: Copy {}` + // + // We don't usually need to worry about this kind of case, + // since we would get a compilation error if the user tried + // to call it. However, since we can do const propagation + // even without any calls to the function, we need to make + // sure that it even makes sense to try to evaluate the body. + // If there are unsatisfiable where clauses, then all bets are + // off, and we just give up. + // + // We manually filter the predicates, skipping anything that's not + // "global". We are in a potentially generic context + // (e.g. we are evaluating a function without substituting generic + // parameters, so this filtering serves two purposes: + // + // 1. We skip evaluating any predicates that we would + // never be able prove are unsatisfiable (e.g. `` + // 2. We avoid trying to normalize predicates involving generic + // parameters (e.g. `::MyItem`). This can confuse + // the normalization code (leading to cycle errors), since + // it's usually never invoked in this way. + let predicates = tcx + .predicates_of(source.def_id()) + .predicates + .iter() + .filter_map(|(p, _)| if p.is_global() { Some(*p) } else { None }) + .collect(); + if !traits::normalize_and_test_predicates( + tcx, + traits::elaborate_predicates(tcx, predicates).collect(), + ) { + trace!("ConstProp skipped for {:?}: found unsatisfiable predicates", source.def_id()); + return; } trace!("ConstProp starting for {:?}", source.def_id()); - let dummy_body = - &Body::new( - body.basic_blocks().clone(), - body.source_scopes.clone(), - body.local_decls.clone(), - Default::default(), - body.arg_count, - Default::default(), - tcx.def_span(source.def_id()), - Default::default(), - body.generator_kind, - ); + let dummy_body = &Body::new( + body.basic_blocks().clone(), + body.source_scopes.clone(), + body.local_decls.clone(), + Default::default(), + body.arg_count, + Default::default(), + tcx.def_span(source.def_id()), + Default::default(), + body.generator_kind, + ); // FIXME(oli-obk, eddyb) Optimize locals (or even local paths) to hold // constants, instead of just checking for const-folding succeeding. // That would require an uniform one-def no-mutation analysis // and RPO (or recursing when needing the value of a local). - let mut optimization_finder = ConstPropagator::new( - read_only!(body), - dummy_body, - tcx, - source - ); + let mut optimization_finder = + ConstPropagator::new(read_only!(body), dummy_body, tcx, source); optimization_finder.visit_body(body); trace!("ConstProp done for {:?}", source.def_id()); @@ -130,6 +165,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine { fn find_mir_or_eval_fn( _ecx: &mut InterpCx<'mir, 'tcx, Self>, + _span: Span, _instance: ty::Instance<'tcx>, _args: &[OpTy<'tcx>], _ret: Option<(PlaceTy<'tcx>, BasicBlock)>, @@ -143,7 +179,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine { fn_val: !, _args: &[OpTy<'tcx>], _ret: Option<(PlaceTy<'tcx>, BasicBlock)>, - _unwind: Option + _unwind: Option, ) -> InterpResult<'tcx> { match fn_val {} } @@ -154,7 +190,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine { _instance: ty::Instance<'tcx>, _args: &[OpTy<'tcx>], _ret: Option<(PlaceTy<'tcx>, BasicBlock)>, - _unwind: Option + _unwind: Option, ) -> InterpResult<'tcx> { throw_unsup!(ConstPropUnsupported("calling intrinsics isn't supported in ConstProp")); } @@ -168,10 +204,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine { bug!("panics terminators are not evaluated in ConstProp"); } - fn ptr_to_int( - _mem: &Memory<'mir, 'tcx, Self>, - _ptr: Pointer, - ) -> InterpResult<'tcx, u64> { + fn ptr_to_int(_mem: &Memory<'mir, 'tcx, Self>, _ptr: Pointer) -> InterpResult<'tcx, u64> { throw_unsup!(ConstPropUnsupported("ptr-to-int casts aren't supported in ConstProp")); } @@ -182,8 +215,10 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine { _right: ImmTy<'tcx>, ) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)> { // We can't do this because aliasing of memory can differ between const eval and llvm - throw_unsup!(ConstPropUnsupported("pointer arithmetic or comparisons aren't supported \ - in ConstProp")); + throw_unsup!(ConstPropUnsupported( + "pointer arithmetic or comparisons aren't supported \ + in ConstProp" + )); } fn find_foreign_static( @@ -205,10 +240,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine { } #[inline(always)] - fn tag_static_base_pointer( - _memory_extra: &(), - _id: AllocId, - ) -> Self::PointerTag { + fn tag_static_base_pointer(_memory_extra: &(), _id: AllocId) -> Self::PointerTag { () } @@ -234,11 +266,12 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine { } fn before_access_static( + _memory_extra: &(), allocation: &Allocation, ) -> InterpResult<'tcx> { // if the static allocation is mutable or if it has relocations (it may be legal to mutate // the memory behind that in the future), then we can't const prop it - if allocation.mutability == Mutability::Mutable || allocation.relocations().len() > 0 { + if allocation.mutability == Mutability::Mut || allocation.relocations().len() > 0 { throw_unsup!(ConstPropUnsupported("can't eval mutable statics in ConstProp")); } @@ -255,20 +288,21 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine { } } -type Const<'tcx> = OpTy<'tcx>; - /// Finds optimization opportunities on the MIR. struct ConstPropagator<'mir, 'tcx> { ecx: InterpCx<'mir, 'tcx, ConstPropMachine>, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, - can_const_prop: IndexVec, + can_const_prop: IndexVec, param_env: ParamEnv<'tcx>, // FIXME(eddyb) avoid cloning these two fields more than once, // by accessing them through `ecx` instead. source_scopes: IndexVec, local_decls: IndexVec>, ret: Option>, + // Because we have `MutVisitor` we can't obtain the `SourceInfo` from a `Location`. So we store + // the last known `SourceInfo` here and just keep revisiting it. + source_info: Option, } impl<'mir, 'tcx> LayoutOf for ConstPropagator<'mir, 'tcx> { @@ -302,32 +336,38 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { source: MirSource<'tcx>, ) -> ConstPropagator<'mir, 'tcx> { let def_id = source.def_id(); - let param_env = tcx.param_env(def_id); + let substs = &InternalSubsts::identity_for_item(tcx, def_id); + let mut param_env = tcx.param_env(def_id); + + // If we're evaluating inside a monomorphic function, then use `Reveal::All` because + // we want to see the same instances that codegen will see. This allows us to `resolve()` + // specializations. + if !substs.needs_subst() { + param_env = param_env.with_reveal_all(); + } + let span = tcx.def_span(def_id); let mut ecx = InterpCx::new(tcx.at(span), param_env, ConstPropMachine, ()); let can_const_prop = CanConstProp::check(body); - let substs = &InternalSubsts::identity_for_item(tcx, def_id); - - let ret = - ecx - .layout_of(body.return_ty().subst(tcx, substs)) - .ok() - // Don't bother allocating memory for ZST types which have no values - // or for large values. - .filter(|ret_layout| !ret_layout.is_zst() && - ret_layout.size < Size::from_bytes(MAX_ALLOC_LIMIT)) - .map(|ret_layout| ecx.allocate(ret_layout, MemoryKind::Stack)); + let ret = ecx + .layout_of(body.return_ty().subst(tcx, substs)) + .ok() + // Don't bother allocating memory for ZST types which have no values + // or for large values. + .filter(|ret_layout| { + !ret_layout.is_zst() && ret_layout.size < Size::from_bytes(MAX_ALLOC_LIMIT) + }) + .map(|ret_layout| ecx.allocate(ret_layout, MemoryKind::Stack)); ecx.push_stack_frame( Instance::new(def_id, substs), span, dummy_body, ret.map(Into::into), - StackPopCleanup::None { - cleanup: false, - }, - ).expect("failed to push initial stack frame"); + StackPopCleanup::None { cleanup: false }, + ) + .expect("failed to push initial stack frame"); ConstPropagator { ecx, @@ -341,10 +381,11 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { //FIXME(wesleywiser) we can't steal this because `Visitor::super_visit_body()` needs it local_decls: body.local_decls.clone(), ret: ret.map(Into::into), + source_info: None, } } - fn get_const(&self, local: Local) -> Option> { + fn get_const(&self, local: Local) -> Option> { if local == RETURN_PLACE { // Try to read the return place as an immediate so that if it is representable as a // scalar, we can handle it as such, but otherwise, just return the value as is. @@ -358,17 +399,18 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { } fn remove_const(&mut self, local: Local) { - self.ecx.frame_mut().locals[local] = LocalState { - value: LocalValue::Uninitialized, - layout: Cell::new(None), - }; + self.ecx.frame_mut().locals[local] = + LocalState { value: LocalValue::Uninitialized, layout: Cell::new(None) }; } - fn use_ecx( - &mut self, - source_info: SourceInfo, - f: F - ) -> Option + fn lint_root(&self, source_info: SourceInfo) -> Option { + match &self.source_scopes[source_info.scope].local_data { + ClearCrossCrate::Set(data) => Some(data.lint_root), + ClearCrossCrate::Clear => None, + } + } + + fn use_ecx(&mut self, source_info: SourceInfo, f: F) -> Option where F: FnOnce(&mut Self) -> InterpResult<'tcx, T>, { @@ -376,17 +418,12 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { // FIXME(eddyb) move this to the `Panic(_)` error case, so that // `f(self)` is always called, and that the only difference when the // scope's `local_data` is missing, is that the lint isn't emitted. - let lint_root = match &self.source_scopes[source_info.scope].local_data { - ClearCrossCrate::Set(data) => data.lint_root, - ClearCrossCrate::Clear => return None, - }; + let lint_root = self.lint_root(source_info)?; let r = match f(self) { Ok(val) => Some(val), Err(error) => { use rustc::mir::interpret::{ - UnsupportedOpInfo, - UndefinedBehaviorInfo, - InterpError::* + InterpError::*, UndefinedBehaviorInfo, UnsupportedOpInfo, }; match error.kind { MachineStop(_) => bug!("ConstProp does not stop"), @@ -399,7 +436,8 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { | Unsupported(UnsupportedOpInfo::ValidationFailure(_)) | UndefinedBehavior(UndefinedBehaviorInfo::Ub(_)) | UndefinedBehavior(UndefinedBehaviorInfo::UbExperimental(_)) - if cfg!(debug_assertions) => { + if cfg!(debug_assertions) => + { bug!("const-prop encountered allocating error: {:?}", error.kind); } @@ -420,44 +458,136 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { } } None - }, + } }; self.ecx.tcx.span = DUMMY_SP; r } - fn eval_constant( - &mut self, - c: &Constant<'tcx>, - ) -> Option> { + fn eval_constant(&mut self, c: &Constant<'tcx>, source_info: SourceInfo) -> Option> { self.ecx.tcx.span = c.span; + + // FIXME we need to revisit this for #67176 + if c.needs_subst() { + return None; + } + match self.ecx.eval_const_to_op(c.literal, None) { - Ok(op) => { - Some(op) - }, + Ok(op) => Some(op), Err(error) => { let err = error_to_const_error(&self.ecx, error); - err.report_as_error(self.ecx.tcx, "erroneous constant used"); + if let Some(lint_root) = self.lint_root(source_info) { + let lint_only = match c.literal.val { + // Promoteds must lint and not error as the user didn't ask for them + ConstKind::Unevaluated(_, _, Some(_)) => true, + // Out of backwards compatibility we cannot report hard errors in unused + // generic functions using associated constants of the generic parameters. + _ => c.literal.needs_subst(), + }; + if lint_only { + // Out of backwards compatibility we cannot report hard errors in unused + // generic functions using associated constants of the generic parameters. + err.report_as_lint( + self.ecx.tcx, + "erroneous constant used", + lint_root, + Some(c.span), + ); + } else { + err.report_as_error(self.ecx.tcx, "erroneous constant used"); + } + } else { + err.report_as_error(self.ecx.tcx, "erroneous constant used"); + } None - }, + } } } - fn eval_place(&mut self, place: &Place<'tcx>, source_info: SourceInfo) -> Option> { + fn eval_place(&mut self, place: &Place<'tcx>, source_info: SourceInfo) -> Option> { trace!("eval_place(place={:?})", place); - self.use_ecx(source_info, |this| { - this.ecx.eval_place_to_op(place, None) - }) + self.use_ecx(source_info, |this| this.ecx.eval_place_to_op(place, None)) } - fn eval_operand(&mut self, op: &Operand<'tcx>, source_info: SourceInfo) -> Option> { + fn eval_operand(&mut self, op: &Operand<'tcx>, source_info: SourceInfo) -> Option> { match *op { - Operand::Constant(ref c) => self.eval_constant(c), - | Operand::Move(ref place) - | Operand::Copy(ref place) => self.eval_place(place, source_info), + Operand::Constant(ref c) => self.eval_constant(c, source_info), + Operand::Move(ref place) | Operand::Copy(ref place) => { + self.eval_place(place, source_info) + } } } + fn check_unary_op(&mut self, arg: &Operand<'tcx>, source_info: SourceInfo) -> Option<()> { + self.use_ecx(source_info, |this| { + let ty = arg.ty(&this.local_decls, this.tcx); + + if ty.is_integral() { + let arg = this.ecx.eval_operand(arg, None)?; + let prim = this.ecx.read_immediate(arg)?; + // Need to do overflow check here: For actual CTFE, MIR + // generation emits code that does this before calling the op. + if prim.to_bits()? == (1 << (prim.layout.size.bits() - 1)) { + throw_panic!(OverflowNeg) + } + } + + Ok(()) + })?; + + Some(()) + } + + fn check_binary_op( + &mut self, + op: BinOp, + left: &Operand<'tcx>, + right: &Operand<'tcx>, + source_info: SourceInfo, + place_layout: TyLayout<'tcx>, + overflow_check: bool, + ) -> Option<()> { + let r = self.use_ecx(source_info, |this| { + this.ecx.read_immediate(this.ecx.eval_operand(right, None)?) + })?; + if op == BinOp::Shr || op == BinOp::Shl { + let left_bits = place_layout.size.bits(); + let right_size = r.layout.size; + let r_bits = r.to_scalar().and_then(|r| r.to_bits(right_size)); + if r_bits.map_or(false, |b| b >= left_bits as u128) { + let lint_root = self.lint_root(source_info)?; + let dir = if op == BinOp::Shr { "right" } else { "left" }; + self.tcx.lint_hir( + ::rustc::lint::builtin::EXCEEDING_BITSHIFTS, + lint_root, + source_info.span, + &format!("attempt to shift {} with overflow", dir), + ); + return None; + } + } + + // If overflow checking is enabled (like in debug mode by default), + // then we'll already catch overflow when we evaluate the `Assert` statement + // in MIR. However, if overflow checking is disabled, then there won't be any + // `Assert` statement and so we have to do additional checking here. + if !overflow_check { + self.use_ecx(source_info, |this| { + let l = this.ecx.read_immediate(this.ecx.eval_operand(left, None)?)?; + let (_, overflow, _ty) = this.ecx.overflowing_binary_op(op, l, r)?; + + if overflow { + let err = err_panic!(Overflow(op)).into(); + return Err(err); + } + + Ok(()) + })?; + } + + Some(()) + } + fn const_prop( &mut self, rvalue: &Rvalue<'tcx>, @@ -465,13 +595,16 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { source_info: SourceInfo, place: &Place<'tcx>, ) -> Option<()> { - let span = source_info.span; - // #66397: Don't try to eval into large places as that can cause an OOM if place_layout.size >= Size::from_bytes(MAX_ALLOC_LIMIT) { return None; } + // FIXME we need to revisit this for #67176 + if rvalue.needs_subst() { + return None; + } + let overflow_check = self.tcx.sess.overflow_checks(); // Perform any special handling for specific Rvalue types. @@ -487,100 +620,24 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { // if an overflow would occur. Rvalue::UnaryOp(UnOp::Neg, arg) if !overflow_check => { trace!("checking UnaryOp(op = Neg, arg = {:?})", arg); - - self.use_ecx(source_info, |this| { - let ty = arg.ty(&this.local_decls, this.tcx); - - if ty.is_integral() { - let arg = this.ecx.eval_operand(arg, None)?; - let prim = this.ecx.read_immediate(arg)?; - // Need to do overflow check here: For actual CTFE, MIR - // generation emits code that does this before calling the op. - if prim.to_bits()? == (1 << (prim.layout.size.bits() - 1)) { - throw_panic!(OverflowNeg) - } - } - - Ok(()) - })?; + self.check_unary_op(arg, source_info)?; } // Additional checking: check for overflows on integer binary operations and report // them to the user as lints. Rvalue::BinaryOp(op, left, right) => { trace!("checking BinaryOp(op = {:?}, left = {:?}, right = {:?})", op, left, right); - - let r = self.use_ecx(source_info, |this| { - this.ecx.read_immediate(this.ecx.eval_operand(right, None)?) - })?; - if *op == BinOp::Shr || *op == BinOp::Shl { - let left_bits = place_layout.size.bits(); - let right_size = r.layout.size; - let r_bits = r.to_scalar().and_then(|r| r.to_bits(right_size)); - if r_bits.map_or(false, |b| b >= left_bits as u128) { - let lint_root = match &self.source_scopes[source_info.scope].local_data { - ClearCrossCrate::Set(data) => data.lint_root, - ClearCrossCrate::Clear => return None, - }; - let dir = if *op == BinOp::Shr { - "right" - } else { - "left" - }; - self.tcx.lint_hir( - ::rustc::lint::builtin::EXCEEDING_BITSHIFTS, - lint_root, - span, - &format!("attempt to shift {} with overflow", dir)); - return None; - } - } - - // If overflow checking is enabled (like in debug mode by default), - // then we'll already catch overflow when we evaluate the `Assert` statement - // in MIR. However, if overflow checking is disabled, then there won't be any - // `Assert` statement and so we have to do additional checking here. - if !overflow_check { - self.use_ecx(source_info, |this| { - let l = this.ecx.read_immediate(this.ecx.eval_operand(left, None)?)?; - let (_, overflow, _ty) = this.ecx.overflowing_binary_op(*op, l, r)?; - - if overflow { - let err = err_panic!(Overflow(*op)).into(); - return Err(err); - } - - Ok(()) - })?; - } + self.check_binary_op(*op, left, right, source_info, place_layout, overflow_check)?; } - // Work around: avoid ICE in miri. FIXME(wesleywiser) - // The Miri engine ICEs when taking a reference to an uninitialized unsized - // local. There's nothing it can do here: taking a reference needs an allocation - // which needs to know the size. Normally that's okay as during execution - // (e.g. for CTFE) it can never happen. But here in const_prop - // unknown data is uninitialized, so if e.g. a function argument is unsized - // and has a reference taken, we get an ICE. + // Do not try creating references (#67862) Rvalue::Ref(_, _, place_ref) => { - trace!("checking Ref({:?})", place_ref); - - if let Some(local) = place_ref.as_local() { - let alive = - if let LocalValue::Live(_) = self.ecx.frame().locals[local].value { - true - } else { - false - }; + trace!("skipping Ref({:?})", place_ref); - if !alive { - trace!("skipping Ref({:?}) to uninitialized local", place); - return None; - } - } + return None; } - _ => { } + _ => {} } self.use_ecx(source_info, |this| { @@ -591,23 +648,17 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { } fn operand_from_scalar(&self, scalar: Scalar, ty: Ty<'tcx>, span: Span) -> Operand<'tcx> { - Operand::Constant(Box::new( - Constant { - span, - user_ty: None, - literal: self.tcx.mk_const(*ty::Const::from_scalar( - self.tcx, - scalar, - ty, - )) - } - )) + Operand::Constant(Box::new(Constant { + span, + user_ty: None, + literal: self.tcx.mk_const(*ty::Const::from_scalar(self.tcx, scalar, ty)), + })) } fn replace_with_const( &mut self, rval: &mut Rvalue<'tcx>, - value: Const<'tcx>, + value: OpTy<'tcx>, source_info: SourceInfo, ) { trace!("attepting to replace {:?} with {:?}", rval, value); @@ -622,19 +673,20 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { } // FIXME> figure out what tho do when try_read_immediate fails - let imm = self.use_ecx(source_info, |this| { - this.ecx.try_read_immediate(value) - }); + let imm = self.use_ecx(source_info, |this| this.ecx.try_read_immediate(value)); if let Some(Ok(imm)) = imm { match *imm { interpret::Immediate::Scalar(ScalarMaybeUndef::Scalar(scalar)) => { - *rval = Rvalue::Use( - self.operand_from_scalar(scalar, value.layout.ty, source_info.span)); - }, + *rval = Rvalue::Use(self.operand_from_scalar( + scalar, + value.layout.ty, + source_info.span, + )); + } Immediate::ScalarPair( ScalarMaybeUndef::Scalar(one), - ScalarMaybeUndef::Scalar(two) + ScalarMaybeUndef::Scalar(two), ) => { // Found a value represented as a pair. For now only do cont-prop if type of // Rvalue is also a pair with two scalars. The more general case is more @@ -648,10 +700,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { let ty1 = substs[0].expect_ty(); let ty2 = substs[1].expect_ty(); let ty_is_scalar = |ty| { - this.ecx - .layout_of(ty) - .ok() - .map(|ty| ty.details.abi.is_scalar()) + this.ecx.layout_of(ty).ok().map(|ty| ty.details.abi.is_scalar()) == Some(true) }; if ty_is_scalar(ty1) && ty_is_scalar(ty2) { @@ -665,19 +714,15 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { *rval = Rvalue::Aggregate( Box::new(AggregateKind::Tuple), vec![ - self.operand_from_scalar( - one, ty1, source_info.span - ), - self.operand_from_scalar( - two, ty2, source_info.span - ), + self.operand_from_scalar(one, ty1, source_info.span), + self.operand_from_scalar(two, ty2, source_info.span), ], ); } } } - }, - _ => { } + } + _ => {} } } } @@ -690,35 +735,46 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { } match *op { - interpret::Operand::Immediate(Immediate::Scalar(ScalarMaybeUndef::Scalar(s))) => - s.is_bits(), - interpret::Operand::Immediate(Immediate::ScalarPair(ScalarMaybeUndef::Scalar(l), - ScalarMaybeUndef::Scalar(r))) => - l.is_bits() && r.is_bits(), + interpret::Operand::Immediate(Immediate::Scalar(ScalarMaybeUndef::Scalar(s))) => { + s.is_bits() + } + interpret::Operand::Immediate(Immediate::ScalarPair( + ScalarMaybeUndef::Scalar(l), + ScalarMaybeUndef::Scalar(r), + )) => l.is_bits() && r.is_bits(), interpret::Operand::Indirect(_) if mir_opt_level >= 2 => { - intern_const_alloc_recursive( - &mut self.ecx, - None, - op.assert_mem_place() - ).expect("failed to intern alloc"); + let mplace = op.assert_mem_place(&self.ecx); + intern_const_alloc_recursive(&mut self.ecx, InternKind::ConstProp, mplace, false) + .expect("failed to intern alloc"); true - }, - _ => false + } + _ => false, } } } +/// The mode that `ConstProp` is allowed to run in for a given `Local`. +#[derive(Clone, Copy, Debug, PartialEq)] +enum ConstPropMode { + /// The `Local` can be propagated into and reads of this `Local` can also be propagated. + FullConstProp, + /// The `Local` can be propagated into but reads cannot be propagated. + OnlyPropagateInto, + /// No propagation is allowed at all. + NoPropagation, +} + struct CanConstProp { - can_const_prop: IndexVec, + can_const_prop: IndexVec, // false at the beginning, once set, there are not allowed to be any more assignments found_assignment: IndexVec, } impl CanConstProp { /// returns true if `local` can be propagated - fn check(body: ReadOnlyBodyAndCache<'_, '_>) -> IndexVec { + fn check(body: ReadOnlyBodyAndCache<'_, '_>) -> IndexVec { let mut cpv = CanConstProp { - can_const_prop: IndexVec::from_elem(true, &body.local_decls), + can_const_prop: IndexVec::from_elem(ConstPropMode::FullConstProp, &body.local_decls), found_assignment: IndexVec::from_elem(false, &body.local_decls), }; for (local, val) in cpv.can_const_prop.iter_enumerated_mut() { @@ -728,10 +784,10 @@ impl CanConstProp { // FIXME(oli-obk): lint variables until they are used in a condition // FIXME(oli-obk): lint if return value is constant let local_kind = body.local_kind(local); - *val = local_kind == LocalKind::Temp || local_kind == LocalKind::ReturnPointer; - if !*val { - trace!("local {:?} can't be propagated because it's not a temporary", local); + if local_kind == LocalKind::Arg || local_kind == LocalKind::Var { + *val = ConstPropMode::OnlyPropagateInto; + trace!("local {:?} can't be const propagated because it's not a temporary", local); } } cpv.visit_body(body); @@ -740,34 +796,31 @@ impl CanConstProp { } impl<'tcx> Visitor<'tcx> for CanConstProp { - fn visit_local( - &mut self, - &local: &Local, - context: PlaceContext, - _: Location, - ) { + fn visit_local(&mut self, &local: &Local, context: PlaceContext, _: Location) { use rustc::mir::visit::PlaceContext::*; match context { // Constants must have at most one write // FIXME(oli-obk): we could be more powerful here, if the multiple writes // only occur in independent execution paths - MutatingUse(MutatingUseContext::Store) => if self.found_assignment[local] { - trace!("local {:?} can't be propagated because of multiple assignments", local); - self.can_const_prop[local] = false; - } else { - self.found_assignment[local] = true - }, + MutatingUse(MutatingUseContext::Store) => { + if self.found_assignment[local] { + trace!("local {:?} can't be propagated because of multiple assignments", local); + self.can_const_prop[local] = ConstPropMode::NoPropagation; + } else { + self.found_assignment[local] = true + } + } // Reading constants is allowed an arbitrary number of times - NonMutatingUse(NonMutatingUseContext::Copy) | - NonMutatingUse(NonMutatingUseContext::Move) | - NonMutatingUse(NonMutatingUseContext::Inspect) | - NonMutatingUse(NonMutatingUseContext::Projection) | - MutatingUse(MutatingUseContext::Projection) | - NonUse(_) => {}, + NonMutatingUse(NonMutatingUseContext::Copy) + | NonMutatingUse(NonMutatingUseContext::Move) + | NonMutatingUse(NonMutatingUseContext::Inspect) + | NonMutatingUse(NonMutatingUseContext::Projection) + | MutatingUse(MutatingUseContext::Projection) + | NonUse(_) => {} _ => { trace!("local {:?} can't be propagaged because it's used: {:?}", local, context); - self.can_const_prop[local] = false; - }, + self.can_const_prop[local] = ConstPropMode::NoPropagation; + } } } } @@ -777,56 +830,48 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { self.tcx } - fn visit_constant( - &mut self, - constant: &mut Constant<'tcx>, - location: Location, - ) { + fn visit_constant(&mut self, constant: &mut Constant<'tcx>, location: Location) { trace!("visit_constant: {:?}", constant); self.super_constant(constant, location); - self.eval_constant(constant); + self.eval_constant(constant, self.source_info.unwrap()); } - fn visit_statement( - &mut self, - statement: &mut Statement<'tcx>, - location: Location, - ) { + fn visit_statement(&mut self, statement: &mut Statement<'tcx>, location: Location) { trace!("visit_statement: {:?}", statement); - if let StatementKind::Assign(box(ref place, ref mut rval)) = statement.kind { - let place_ty: Ty<'tcx> = place - .ty(&self.local_decls, self.tcx) - .ty; + let source_info = statement.source_info; + self.source_info = Some(source_info); + if let StatementKind::Assign(box (ref place, ref mut rval)) = statement.kind { + let place_ty: Ty<'tcx> = place.ty(&self.local_decls, self.tcx).ty; if let Ok(place_layout) = self.tcx.layout_of(self.param_env.and(place_ty)) { if let Some(local) = place.as_local() { - let source = statement.source_info; - if let Some(()) = self.const_prop(rval, place_layout, source, place) { - if self.can_const_prop[local] { - trace!("propagated into {:?}", local); - + let can_const_prop = self.can_const_prop[local]; + if let Some(()) = self.const_prop(rval, place_layout, source_info, place) { + if can_const_prop == ConstPropMode::FullConstProp + || can_const_prop == ConstPropMode::OnlyPropagateInto + { if let Some(value) = self.get_const(local) { if self.should_const_prop(value) { trace!("replacing {:?} with {:?}", rval, value); - self.replace_with_const( - rval, - value, - statement.source_info, - ); + self.replace_with_const(rval, value, statement.source_info); + + if can_const_prop == ConstPropMode::FullConstProp { + trace!("propagated into {:?}", local); + } } } - } else { - trace!("can't propagate into {:?}", local); - if local != RETURN_PLACE { - self.remove_const(local); - } + } + } + if self.can_const_prop[local] != ConstPropMode::FullConstProp { + trace!("can't propagate into {:?}", local); + if local != RETURN_PLACE { + self.remove_const(local); } } } } } else { match statement.kind { - StatementKind::StorageLive(local) | - StatementKind::StorageDead(local) if self.can_const_prop[local] => { + StatementKind::StorageLive(local) | StatementKind::StorageDead(local) => { let frame = self.ecx.frame_mut(); frame.locals[local].value = if let StatementKind::StorageLive(_) = statement.kind { @@ -842,13 +887,10 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { self.super_statement(statement, location); } - fn visit_terminator( - &mut self, - terminator: &mut Terminator<'tcx>, - location: Location, - ) { - self.super_terminator(terminator, location); + fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: Location) { let source_info = terminator.source_info; + self.source_info = Some(source_info); + self.super_terminator(terminator, location); match &mut terminator.kind { TerminatorKind::Assert { expected, ref msg, ref mut cond, .. } => { if let Some(value) = self.eval_operand(&cond, source_info) { @@ -860,10 +902,8 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { // doesn't use the invalid value match cond { Operand::Move(ref place) | Operand::Copy(ref place) => { - if let PlaceBase::Local(local) = place.base { - self.remove_const(local); - } - }, + self.remove_const(place.local); + } Operand::Constant(_) => {} } let span = terminator.source_info.span; @@ -873,46 +913,34 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { .as_local_hir_id(self.source.def_id()) .expect("some part of a failing const eval must be local"); let msg = match msg { - PanicInfo::Overflow(_) | - PanicInfo::OverflowNeg | - PanicInfo::DivisionByZero | - PanicInfo::RemainderByZero => - msg.description().to_owned(), + PanicInfo::Overflow(_) + | PanicInfo::OverflowNeg + | PanicInfo::DivisionByZero + | PanicInfo::RemainderByZero => msg.description().to_owned(), PanicInfo::BoundsCheck { ref len, ref index } => { - let len = self - .eval_operand(len, source_info) - .expect("len must be const"); + let len = + self.eval_operand(len, source_info).expect("len must be const"); let len = match self.ecx.read_scalar(len) { - Ok(ScalarMaybeUndef::Scalar(Scalar::Raw { - data, .. - })) => data, + Ok(ScalarMaybeUndef::Scalar(Scalar::Raw { data, .. })) => data, other => bug!("const len not primitive: {:?}", other), }; let index = self .eval_operand(index, source_info) .expect("index must be const"); let index = match self.ecx.read_scalar(index) { - Ok(ScalarMaybeUndef::Scalar(Scalar::Raw { - data, .. - })) => data, + Ok(ScalarMaybeUndef::Scalar(Scalar::Raw { data, .. })) => data, other => bug!("const index not primitive: {:?}", other), }; format!( "index out of bounds: \ the len is {} but the index is {}", - len, - index, + len, index, ) - }, + } // Need proper const propagator for these _ => return, }; - self.tcx.lint_hir( - ::rustc::lint::builtin::CONST_ERR, - hir_id, - span, - &msg, - ); + self.tcx.lint_hir(::rustc::lint::builtin::CONST_ERR, hir_id, span, &msg); } else { if self.should_const_prop(value) { if let ScalarMaybeUndef::Scalar(scalar) = value_const { @@ -925,31 +953,32 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { } } } - }, + } TerminatorKind::SwitchInt { ref mut discr, switch_ty, .. } => { if let Some(value) = self.eval_operand(&discr, source_info) { if self.should_const_prop(value) { if let ScalarMaybeUndef::Scalar(scalar) = - self.ecx.read_scalar(value).unwrap() { + self.ecx.read_scalar(value).unwrap() + { *discr = self.operand_from_scalar(scalar, switch_ty, source_info.span); } } } - }, + } //none of these have Operands to const-propagate - TerminatorKind::Goto { .. } | - TerminatorKind::Resume | - TerminatorKind::Abort | - TerminatorKind::Return | - TerminatorKind::Unreachable | - TerminatorKind::Drop { .. } | - TerminatorKind::DropAndReplace { .. } | - TerminatorKind::Yield { .. } | - TerminatorKind::GeneratorDrop | - TerminatorKind::FalseEdges { .. } | - TerminatorKind::FalseUnwind { .. } => { } + TerminatorKind::Goto { .. } + | TerminatorKind::Resume + | TerminatorKind::Abort + | TerminatorKind::Return + | TerminatorKind::Unreachable + | TerminatorKind::Drop { .. } + | TerminatorKind::DropAndReplace { .. } + | TerminatorKind::Yield { .. } + | TerminatorKind::GeneratorDrop + | TerminatorKind::FalseEdges { .. } + | TerminatorKind::FalseUnwind { .. } => {} //FIXME(wesleywiser) Call does have Operands that could be const-propagated - TerminatorKind::Call { .. } => { } + TerminatorKind::Call { .. } => {} } } } diff --git a/src/librustc_mir/transform/copy_prop.rs b/src/librustc_mir/transform/copy_prop.rs index 272f6e9ce1..b8ca823a98 100644 --- a/src/librustc_mir/transform/copy_prop.rs +++ b/src/librustc_mir/transform/copy_prop.rs @@ -19,21 +19,19 @@ //! (non-mutating) use of `SRC`. These restrictions are conservative and may be relaxed in the //! future. +use crate::transform::{MirPass, MirSource}; +use crate::util::def_use::DefUseAnalysis; +use rustc::mir::visit::MutVisitor; use rustc::mir::{ - Constant, Local, LocalKind, Location, Place, Body, BodyAndCache, Operand, Rvalue, - StatementKind, read_only + read_only, Body, BodyAndCache, Constant, Local, LocalKind, Location, Operand, Place, Rvalue, + StatementKind, }; -use rustc::mir::visit::MutVisitor; use rustc::ty::TyCtxt; -use crate::transform::{MirPass, MirSource}; -use crate::util::def_use::DefUseAnalysis; pub struct CopyPropagation; impl<'tcx> MirPass<'tcx> for CopyPropagation { - fn run_pass( - &self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx> - ) { + fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { // We only run when the MIR optimization level is > 1. // This avoids a slow pass, and messing up debug info. if tcx.sess.opts.debugging_opts.mir_opt_level <= 1 { @@ -59,26 +57,25 @@ impl<'tcx> MirPass<'tcx> for CopyPropagation { let dest_use_info = def_use_analysis.local_info(dest_local); let dest_def_count = dest_use_info.def_count_not_including_drop(); if dest_def_count == 0 { - debug!(" Can't copy-propagate local: dest {:?} undefined", - dest_local); - continue + debug!(" Can't copy-propagate local: dest {:?} undefined", dest_local); + continue; } if dest_def_count > 1 { - debug!(" Can't copy-propagate local: dest {:?} defined {} times", - dest_local, - dest_use_info.def_count()); - continue + debug!( + " Can't copy-propagate local: dest {:?} defined {} times", + dest_local, + dest_use_info.def_count() + ); + continue; } if dest_use_info.use_count() == 0 { - debug!(" Can't copy-propagate local: dest {:?} unused", - dest_local); - continue + debug!(" Can't copy-propagate local: dest {:?} unused", dest_local); + continue; } // Conservatively gives up if the dest is an argument, // because there may be uses of the original argument value. if body.local_kind(dest_local) == LocalKind::Arg { - debug!(" Can't copy-propagate local: dest {:?} (argument)", - dest_local); + debug!(" Can't copy-propagate local: dest {:?} (argument)", dest_local); continue; } let dest_place_def = dest_use_info.defs_not_including_drop().next().unwrap(); @@ -90,22 +87,19 @@ impl<'tcx> MirPass<'tcx> for CopyPropagation { Some(statement) => statement, None => { debug!(" Can't copy-propagate local: used in terminator"); - continue + continue; } }; // That use of the source must be an assignment. match &statement.kind { - StatementKind::Assign(box(place, Rvalue::Use(operand))) => { + StatementKind::Assign(box (place, Rvalue::Use(operand))) => { if let Some(local) = place.as_local() { if local == dest_local { let maybe_action = match operand { - Operand::Copy(ref src_place) | - Operand::Move(ref src_place) => { - Action::local_copy( - &body, - &def_use_analysis, - src_place) + Operand::Copy(ref src_place) + | Operand::Move(ref src_place) => { + Action::local_copy(&body, &def_use_analysis, src_place) } Operand::Constant(ref src_constant) => { Action::constant(src_constant) @@ -116,41 +110,44 @@ impl<'tcx> MirPass<'tcx> for CopyPropagation { None => continue, } } else { - debug!(" Can't copy-propagate local: source use is not an \ - assignment"); - continue + debug!( + " Can't copy-propagate local: source use is not an \ + assignment" + ); + continue; } } else { - debug!(" Can't copy-propagate local: source use is not an \ - assignment"); - continue + debug!( + " Can't copy-propagate local: source use is not an \ + assignment" + ); + continue; } } _ => { - debug!(" Can't copy-propagate local: source use is not an \ - assignment"); - continue + debug!( + " Can't copy-propagate local: source use is not an \ + assignment" + ); + continue; } } } - changed = action.perform(body, &def_use_analysis, dest_local, location, tcx) - || changed; + changed = + action.perform(body, &def_use_analysis, dest_local, location, tcx) || changed; // FIXME(pcwalton): Update the use-def chains to delete the instructions instead of // regenerating the chains. - break + break; } if !changed { - break + break; } } } } -fn eliminate_self_assignments( - body: &mut Body<'_>, - def_use_analysis: &DefUseAnalysis, -) -> bool { +fn eliminate_self_assignments(body: &mut Body<'_>, def_use_analysis: &DefUseAnalysis) -> bool { let mut changed = false; for dest_local in body.local_decls.indices() { @@ -195,8 +192,11 @@ enum Action<'tcx> { } impl<'tcx> Action<'tcx> { - fn local_copy(body: &Body<'tcx>, def_use_analysis: &DefUseAnalysis, src_place: &Place<'tcx>) - -> Option> { + fn local_copy( + body: &Body<'tcx>, + def_use_analysis: &DefUseAnalysis, + src_place: &Place<'tcx>, + ) -> Option> { // The source must be a local. let src_local = if let Some(local) = src_place.as_local() { local @@ -211,11 +211,11 @@ impl<'tcx> Action<'tcx> { let src_use_count = src_use_info.use_count(); if src_use_count == 0 { debug!(" Can't copy-propagate local: no uses"); - return None + return None; } if src_use_count != 1 { debug!(" Can't copy-propagate local: {} uses", src_use_info.use_count()); - return None + return None; } // Verify that the source doesn't change in between. This is done conservatively for now, @@ -239,7 +239,7 @@ impl<'tcx> Action<'tcx> { src_def_count, if is_arg { " (argument)" } else { "" }, ); - return None + return None; } Some(Action::PropagateLocalCopy(src_local)) @@ -249,13 +249,14 @@ impl<'tcx> Action<'tcx> { Some(Action::PropagateConstant((*src_constant).clone())) } - fn perform(self, - body: &mut BodyAndCache<'tcx>, - def_use_analysis: &DefUseAnalysis, - dest_local: Local, - location: Location, - tcx: TyCtxt<'tcx>) - -> bool { + fn perform( + self, + body: &mut BodyAndCache<'tcx>, + def_use_analysis: &DefUseAnalysis, + dest_local: Local, + location: Location, + tcx: TyCtxt<'tcx>, + ) -> bool { match self { Action::PropagateLocalCopy(src_local) => { // Eliminate the destination and the assignment. @@ -263,9 +264,7 @@ impl<'tcx> Action<'tcx> { // First, remove all markers. // // FIXME(pcwalton): Don't do this. Merge live ranges instead. - debug!(" Replacing all uses of {:?} with {:?} (local)", - dest_local, - src_local); + debug!(" Replacing all uses of {:?} with {:?} (local)", dest_local, src_local); for place_use in &def_use_analysis.local_info(dest_local).defs_and_uses { if place_use.context.is_storage_marker() { body.make_statement_nop(place_use.location) @@ -278,8 +277,7 @@ impl<'tcx> Action<'tcx> { } // Replace all uses of the destination local with the source local. - def_use_analysis - .replace_all_defs_and_uses_with(dest_local, body, src_local, tcx); + def_use_analysis.replace_all_defs_and_uses_with(dest_local, body, src_local, tcx); // Finally, zap the now-useless assignment instruction. debug!(" Deleting assignment"); @@ -291,9 +289,10 @@ impl<'tcx> Action<'tcx> { // First, remove all markers. // // FIXME(pcwalton): Don't do this. Merge live ranges instead. - debug!(" Replacing all uses of {:?} with {:?} (constant)", - dest_local, - src_constant); + debug!( + " Replacing all uses of {:?} with {:?} (constant)", + dest_local, src_constant + ); let dest_local_info = def_use_analysis.local_info(dest_local); for place_use in &dest_local_info.defs_and_uses { if place_use.context.is_storage_marker() { @@ -302,9 +301,7 @@ impl<'tcx> Action<'tcx> { } // Replace all uses of the destination local with the constant. - let mut visitor = ConstantPropagationVisitor::new(dest_local, - src_constant, - tcx); + let mut visitor = ConstantPropagationVisitor::new(dest_local, src_constant, tcx); for dest_place_use in &dest_local_info.defs_and_uses { visitor.visit_location(body, dest_place_use.location) } @@ -314,18 +311,20 @@ impl<'tcx> Action<'tcx> { // must have places on their LHS. let use_count = dest_local_info.use_count(); if visitor.uses_replaced == use_count { - debug!(" {} of {} use(s) replaced; deleting assignment", - visitor.uses_replaced, - use_count); + debug!( + " {} of {} use(s) replaced; deleting assignment", + visitor.uses_replaced, use_count + ); body.make_statement_nop(location); true } else if visitor.uses_replaced == 0 { debug!(" No uses replaced; not deleting assignment"); false } else { - debug!(" {} of {} use(s) replaced; not deleting assignment", - visitor.uses_replaced, - use_count); + debug!( + " {} of {} use(s) replaced; not deleting assignment", + visitor.uses_replaced, use_count + ); true } } @@ -341,14 +340,12 @@ struct ConstantPropagationVisitor<'tcx> { } impl<'tcx> ConstantPropagationVisitor<'tcx> { - fn new(dest_local: Local, constant: Constant<'tcx>, tcx: TyCtxt<'tcx>) - -> ConstantPropagationVisitor<'tcx> { - ConstantPropagationVisitor { - dest_local, - constant, - tcx, - uses_replaced: 0, - } + fn new( + dest_local: Local, + constant: Constant<'tcx>, + tcx: TyCtxt<'tcx>, + ) -> ConstantPropagationVisitor<'tcx> { + ConstantPropagationVisitor { dest_local, constant, tcx, uses_replaced: 0 } } } @@ -361,8 +358,7 @@ impl<'tcx> MutVisitor<'tcx> for ConstantPropagationVisitor<'tcx> { self.super_operand(operand, location); match operand { - Operand::Copy(place) | - Operand::Move(place) => { + Operand::Copy(place) | Operand::Move(place) => { if let Some(local) = place.as_local() { if local == self.dest_local { } else { diff --git a/src/librustc_mir/transform/deaggregator.rs b/src/librustc_mir/transform/deaggregator.rs index cd77c9c60f..9f8964ee5a 100644 --- a/src/librustc_mir/transform/deaggregator.rs +++ b/src/librustc_mir/transform/deaggregator.rs @@ -1,20 +1,18 @@ -use rustc::mir::*; -use rustc::ty::TyCtxt; use crate::transform::{MirPass, MirSource}; use crate::util::expand_aggregate; +use rustc::mir::*; +use rustc::ty::TyCtxt; pub struct Deaggregator; impl<'tcx> MirPass<'tcx> for Deaggregator { - fn run_pass( - &self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx> - ) { + fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut(); let local_decls = &*local_decls; for bb in basic_blocks { bb.expand_statements(|stmt| { // FIXME(eddyb) don't match twice on `stmt.kind` (post-NLL). - if let StatementKind::Assign(box(_, ref rhs)) = stmt.kind { + if let StatementKind::Assign(box (_, ref rhs)) = stmt.kind { if let Rvalue::Aggregate(ref kind, _) = *rhs { // FIXME(#48193) Deaggregate arrays when it's cheaper to do so. if let AggregateKind::Array(_) = **kind { @@ -30,13 +28,11 @@ impl<'tcx> MirPass<'tcx> for Deaggregator { let stmt = stmt.replace_nop(); let source_info = stmt.source_info; let (lhs, kind, operands) = match stmt.kind { - StatementKind::Assign(box(lhs, rvalue)) => { - match rvalue { - Rvalue::Aggregate(kind, operands) => (lhs, kind, operands), - _ => bug!() - } - } - _ => bug!() + StatementKind::Assign(box (lhs, rvalue)) => match rvalue { + Rvalue::Aggregate(kind, operands) => (lhs, kind, operands), + _ => bug!(), + }, + _ => bug!(), }; Some(expand_aggregate( diff --git a/src/librustc_mir/transform/dump_mir.rs b/src/librustc_mir/transform/dump_mir.rs index 221ced3a71..2cbda33ad2 100644 --- a/src/librustc_mir/transform/dump_mir.rs +++ b/src/librustc_mir/transform/dump_mir.rs @@ -5,11 +5,11 @@ use std::fmt; use std::fs::File; use std::io; +use crate::transform::{MirPass, MirSource}; +use crate::util as mir_util; use rustc::mir::{Body, BodyAndCache}; use rustc::session::config::{OutputFilenames, OutputType}; use rustc::ty::TyCtxt; -use crate::transform::{MirPass, MirSource}; -use crate::util as mir_util; pub struct Marker(pub &'static str); @@ -19,12 +19,16 @@ impl<'tcx> MirPass<'tcx> for Marker { } fn run_pass( - &self, _tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, _body: &mut BodyAndCache<'tcx> - ) {} + &self, + _tcx: TyCtxt<'tcx>, + _source: MirSource<'tcx>, + _body: &mut BodyAndCache<'tcx>, + ) { + } } pub struct Disambiguator { - is_after: bool + is_after: bool, } impl fmt::Display for Disambiguator { @@ -43,13 +47,15 @@ pub fn on_mir_pass<'tcx>( is_after: bool, ) { if mir_util::dump_enabled(tcx, pass_name, source) { - mir_util::dump_mir(tcx, - Some(pass_num), - pass_name, - &Disambiguator { is_after }, - source, - body, - |_, _| Ok(()) ); + mir_util::dump_mir( + tcx, + Some(pass_num), + pass_name, + &Disambiguator { is_after }, + source, + body, + |_, _| Ok(()), + ); } } diff --git a/src/librustc_mir/transform/elaborate_drops.rs b/src/librustc_mir/transform/elaborate_drops.rs index 1cacf1f3b0..1c0b1b8c13 100644 --- a/src/librustc_mir/transform/elaborate_drops.rs +++ b/src/librustc_mir/transform/elaborate_drops.rs @@ -1,22 +1,22 @@ -use crate::dataflow::move_paths::{HasMoveData, MoveData, MovePathIndex, LookupResult}; -use crate::dataflow::{MaybeInitializedPlaces, MaybeUninitializedPlaces}; -use crate::dataflow::{DataflowResults}; -use crate::dataflow::{on_all_children_bits, on_all_drop_children_bits}; -use crate::dataflow::{drop_flag_effects_for_location, on_lookup_result_bits}; +use crate::dataflow::move_paths::{HasMoveData, LookupResult, MoveData, MovePathIndex}; +use crate::dataflow::DataflowResults; use crate::dataflow::MoveDataParamEnv; use crate::dataflow::{self, do_dataflow, DebugFormatted}; +use crate::dataflow::{drop_flag_effects_for_location, on_lookup_result_bits}; +use crate::dataflow::{on_all_children_bits, on_all_drop_children_bits}; +use crate::dataflow::{MaybeInitializedPlaces, MaybeUninitializedPlaces}; use crate::transform::{MirPass, MirSource}; +use crate::util::elaborate_drops::{elaborate_drop, DropFlagState, Unwind}; +use crate::util::elaborate_drops::{DropElaborator, DropFlagMode, DropStyle}; use crate::util::patch::MirPatch; -use crate::util::elaborate_drops::{DropFlagState, Unwind, elaborate_drop}; -use crate::util::elaborate_drops::{DropElaborator, DropStyle, DropFlagMode}; -use rustc::ty::{self, TyCtxt}; -use rustc::ty::layout::VariantIdx; -use rustc::hir; use rustc::mir::*; -use rustc::util::nodemap::FxHashMap; +use rustc::ty::layout::VariantIdx; +use rustc::ty::{self, TyCtxt}; +use rustc_data_structures::fx::FxHashMap; +use rustc_hir as hir; use rustc_index::bit_set::BitSet; +use rustc_span::Span; use std::fmt; -use syntax_pos::Span; pub struct ElaborateDrops; @@ -28,23 +28,36 @@ impl<'tcx> MirPass<'tcx> for ElaborateDrops { let param_env = tcx.param_env(src.def_id()).with_reveal_all(); let move_data = match MoveData::gather_moves(body, tcx, param_env) { Ok(move_data) => move_data, - Err(_) => bug!("No `move_errors` should be allowed in MIR borrowck"), + Err((move_data, _)) => { + tcx.sess.delay_span_bug( + body.span, + "No `move_errors` should be allowed in MIR borrowck", + ); + move_data + } }; let elaborate_patch = { let body = &*body; - let env = MoveDataParamEnv { - move_data, - param_env, - }; + let env = MoveDataParamEnv { move_data, param_env }; let dead_unwinds = find_dead_unwinds(tcx, body, def_id, &env); - let flow_inits = - do_dataflow(tcx, body, def_id, &[], &dead_unwinds, - MaybeInitializedPlaces::new(tcx, body, &env), - |bd, p| DebugFormatted::new(&bd.move_data().move_paths[p])); - let flow_uninits = - do_dataflow(tcx, body, def_id, &[], &dead_unwinds, - MaybeUninitializedPlaces::new(tcx, body, &env), - |bd, p| DebugFormatted::new(&bd.move_data().move_paths[p])); + let flow_inits = do_dataflow( + tcx, + body, + def_id, + &[], + &dead_unwinds, + MaybeInitializedPlaces::new(tcx, body, &env), + |bd, p| DebugFormatted::new(&bd.move_data().move_paths[p]), + ); + let flow_uninits = do_dataflow( + tcx, + body, + def_id, + &[], + &dead_unwinds, + MaybeUninitializedPlaces::new(tcx, body, &env), + |bd, p| DebugFormatted::new(&bd.move_data().move_paths[p]), + ); ElaborateDropsCtxt { tcx, @@ -54,7 +67,8 @@ impl<'tcx> MirPass<'tcx> for ElaborateDrops { flow_uninits, drop_flags: Default::default(), patch: MirPatch::new(body), - }.elaborate() + } + .elaborate() }; elaborate_patch.apply(body); } @@ -73,14 +87,19 @@ fn find_dead_unwinds<'tcx>( // We only need to do this pass once, because unwind edges can only // reach cleanup blocks, which can't have unwind edges themselves. let mut dead_unwinds = BitSet::new_empty(body.basic_blocks().len()); - let flow_inits = - do_dataflow(tcx, body, def_id, &[], &dead_unwinds, - MaybeInitializedPlaces::new(tcx, body, &env), - |bd, p| DebugFormatted::new(&bd.move_data().move_paths[p])); + let flow_inits = do_dataflow( + tcx, + body, + def_id, + &[], + &dead_unwinds, + MaybeInitializedPlaces::new(tcx, body, &env), + |bd, p| DebugFormatted::new(&bd.move_data().move_paths[p]), + ); for (bb, bb_data) in body.basic_blocks().iter_enumerated() { let location = match bb_data.terminator().kind { - TerminatorKind::Drop { ref location, unwind: Some(_), .. } | - TerminatorKind::DropAndReplace { ref location, unwind: Some(_), .. } => location, + TerminatorKind::Drop { ref location, unwind: Some(_), .. } + | TerminatorKind::DropAndReplace { ref location, unwind: Some(_), .. } => location, _ => continue, }; @@ -88,8 +107,7 @@ fn find_dead_unwinds<'tcx>( live: flow_inits.sets().entry_set_for(bb.index()).to_owned(), dead: BitSet::new_empty(env.move_data.move_paths.len()), }; - debug!("find_dead_unwinds @ {:?}: {:?}; init_data={:?}", - bb, bb_data, init_data.live); + debug!("find_dead_unwinds @ {:?}: {:?}; init_data={:?}", bb, bb_data, init_data.live); for stmt in 0..bb_data.statements.len() { let loc = Location { block: bb, statement_index: stmt }; init_data.apply_location(tcx, body, env, loc); @@ -99,7 +117,7 @@ fn find_dead_unwinds<'tcx>( LookupResult::Exact(e) => e, LookupResult::Parent(..) => { debug!("find_dead_unwinds: has parent; skipping"); - continue + continue; } }; @@ -122,7 +140,7 @@ fn find_dead_unwinds<'tcx>( struct InitializationData { live: BitSet, - dead: BitSet + dead: BitSet, } impl InitializationData { @@ -134,8 +152,7 @@ impl InitializationData { loc: Location, ) { drop_flag_effects_for_location(tcx, body, env, loc, |path, df| { - debug!("at location {:?}: setting {:?} to {:?}", - loc, path, df); + debug!("at location {:?}: setting {:?} to {:?}", loc, path, df); match df { DropFlagState::Present => { self.live.insert(path); @@ -191,15 +208,13 @@ impl<'a, 'b, 'tcx> DropElaborator<'a, 'tcx> for Elaborator<'a, 'b, 'tcx> { let mut some_live = false; let mut some_dead = false; let mut children_count = 0; - on_all_drop_children_bits( - self.tcx(), self.body(), self.ctxt.env, path, |child| { - let (live, dead) = self.init_data.state(child); - debug!("elaborate_drop: state({:?}) = {:?}", - child, (live, dead)); - some_live |= live; - some_dead |= dead; - children_count += 1; - }); + on_all_drop_children_bits(self.tcx(), self.body(), self.ctxt.env, path, |child| { + let (live, dead) = self.init_data.state(child); + debug!("elaborate_drop: state({:?}) = {:?}", child, (live, dead)); + some_live |= live; + some_dead |= dead; + children_count += 1; + }); ((some_live, some_dead), children_count != 1) } }; @@ -218,9 +233,12 @@ impl<'a, 'b, 'tcx> DropElaborator<'a, 'tcx> for Elaborator<'a, 'b, 'tcx> { } DropFlagMode::Deep => { on_all_children_bits( - self.tcx(), self.body(), self.ctxt.move_data(), path, - |child| self.ctxt.set_drop_flag(loc, child, DropFlagState::Absent) - ); + self.tcx(), + self.body(), + self.ctxt.move_data(), + path, + |child| self.ctxt.set_drop_flag(loc, child, DropFlagState::Absent), + ); } } } @@ -252,7 +270,7 @@ impl<'a, 'b, 'tcx> DropElaborator<'a, 'tcx> for Elaborator<'a, 'b, 'tcx> { fn downcast_subpath(&self, path: Self::Path, variant: VariantIdx) -> Option { dataflow::move_path_children_matching(self.ctxt.move_data(), path, |e| match e { ProjectionElem::Downcast(_, idx) => *idx == variant, - _ => false + _ => false, }) } @@ -272,7 +290,9 @@ struct ElaborateDropsCtxt<'a, 'tcx> { } impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { - fn move_data(&self) -> &'b MoveData<'tcx> { &self.env.move_data } + fn move_data(&self) -> &'b MoveData<'tcx> { + &self.env.move_data + } fn param_env(&self) -> ty::ParamEnv<'tcx> { self.env.param_env @@ -280,14 +300,16 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { fn initialization_data_at(&self, loc: Location) -> InitializationData { let mut data = InitializationData { - live: self.flow_inits.sets().entry_set_for(loc.block.index()) - .to_owned(), - dead: self.flow_uninits.sets().entry_set_for(loc.block.index()) - .to_owned(), + live: self.flow_inits.sets().entry_set_for(loc.block.index()).to_owned(), + dead: self.flow_uninits.sets().entry_set_for(loc.block.index()).to_owned(), }; for stmt in 0..loc.statement_index { - data.apply_location(self.tcx, self.body, self.env, - Location { block: loc.block, statement_index: stmt }); + data.apply_location( + self.tcx, + self.body, + self.env, + Location { block: loc.block, statement_index: stmt }, + ); } data } @@ -296,9 +318,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { let tcx = self.tcx; let patch = &mut self.patch; debug!("create_drop_flag({:?})", self.body.span); - self.drop_flags.entry(index).or_insert_with(|| { - patch.new_internal(tcx.types.bool, span) - }); + self.drop_flags.entry(index).or_insert_with(|| patch.new_internal(tcx.types.bool, span)); } fn drop_flag(&mut self, index: MovePathIndex) -> Option> { @@ -307,8 +327,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { /// create a patch that elaborates all drops in the input /// MIR. - fn elaborate(mut self) -> MirPatch<'tcx> - { + fn elaborate(mut self) -> MirPatch<'tcx> { self.collect_drop_flags(); self.elaborate_drops(); @@ -321,24 +340,22 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { self.patch } - fn collect_drop_flags(&mut self) - { + fn collect_drop_flags(&mut self) { for (bb, data) in self.body.basic_blocks().iter_enumerated() { let terminator = data.terminator(); let location = match terminator.kind { - TerminatorKind::Drop { ref location, .. } | - TerminatorKind::DropAndReplace { ref location, .. } => location, - _ => continue + TerminatorKind::Drop { ref location, .. } + | TerminatorKind::DropAndReplace { ref location, .. } => location, + _ => continue, }; let init_data = self.initialization_data_at(Location { block: bb, - statement_index: data.statements.len() + statement_index: data.statements.len(), }); let path = self.move_data().rev_lookup.find(location.as_ref()); - debug!("collect_drop_flags: {:?}, place {:?} ({:?})", - bb, location, path); + debug!("collect_drop_flags: {:?}, place {:?} ({:?})", bb, location, path); let path = match path { LookupResult::Exact(e) => e, @@ -346,18 +363,27 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { LookupResult::Parent(Some(parent)) => { let (_maybe_live, maybe_dead) = init_data.state(parent); if maybe_dead { - span_bug!(terminator.source_info.span, - "drop of untracked, uninitialized value {:?}, place {:?} ({:?})", - bb, location, path); + span_bug!( + terminator.source_info.span, + "drop of untracked, uninitialized value {:?}, place {:?} ({:?})", + bb, + location, + path + ); } - continue + continue; } }; on_all_drop_children_bits(self.tcx, self.body, self.env, path, |child| { let (maybe_live, maybe_dead) = init_data.state(child); - debug!("collect_drop_flags: collecting {:?} from {:?}@{:?} - {:?}", - child, location, path, (maybe_live, maybe_dead)); + debug!( + "collect_drop_flags: collecting {:?} from {:?}@{:?} - {:?}", + child, + location, + path, + (maybe_live, maybe_dead) + ); if maybe_live && maybe_dead { self.create_drop_flag(child, terminator.source_info.span) } @@ -365,8 +391,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { } } - fn elaborate_drops(&mut self) - { + fn elaborate_drops(&mut self) { for (bb, data) in self.body.basic_blocks().iter_enumerated() { let loc = Location { block: bb, statement_index: data.statements.len() }; let terminator = data.terminator(); @@ -376,41 +401,34 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { TerminatorKind::Drop { ref location, target, unwind } => { let init_data = self.initialization_data_at(loc); match self.move_data().rev_lookup.find(location.as_ref()) { - LookupResult::Exact(path) => { - elaborate_drop( - &mut Elaborator { - init_data: &init_data, - ctxt: self - }, - terminator.source_info, - location, - path, - target, - if data.is_cleanup { - Unwind::InCleanup - } else { - Unwind::To(Option::unwrap_or(unwind, resume_block)) - }, - bb) - } + LookupResult::Exact(path) => elaborate_drop( + &mut Elaborator { init_data: &init_data, ctxt: self }, + terminator.source_info, + location, + path, + target, + if data.is_cleanup { + Unwind::InCleanup + } else { + Unwind::To(Option::unwrap_or(unwind, resume_block)) + }, + bb, + ), LookupResult::Parent(..) => { - span_bug!(terminator.source_info.span, - "drop of untracked value {:?}", bb); + span_bug!( + terminator.source_info.span, + "drop of untracked value {:?}", + bb + ); } } } - TerminatorKind::DropAndReplace { ref location, ref value, - target, unwind } => - { + TerminatorKind::DropAndReplace { ref location, ref value, target, unwind } => { assert!(!data.is_cleanup); - self.elaborate_replace( - loc, - location, value, - target, unwind - ); + self.elaborate_replace(loc, location, value, target, unwind); } - _ => continue + _ => continue, } } } @@ -433,16 +451,16 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { location: &Place<'tcx>, value: &Operand<'tcx>, target: BasicBlock, - unwind: Option) - { + unwind: Option, + ) { let bb = loc.block; let data = &self.body[bb]; let terminator = data.terminator(); assert!(!data.is_cleanup, "DropAndReplace in unwind path not supported"); let assign = Statement { - kind: StatementKind::Assign(box(location.clone(), Rvalue::Use(value.clone()))), - source_info: terminator.source_info + kind: StatementKind::Assign(box (*location, Rvalue::Use(value.clone()))), + source_info: terminator.source_info, }; let unwind = unwind.unwrap_or_else(|| self.patch.resume_block()); @@ -452,15 +470,12 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { kind: TerminatorKind::Goto { target: unwind }, ..*terminator }), - is_cleanup: true + is_cleanup: true, }); let target = self.patch.new_block(BasicBlockData { statements: vec![assign], - terminator: Some(Terminator { - kind: TerminatorKind::Goto { target }, - ..*terminator - }), + terminator: Some(Terminator { kind: TerminatorKind::Goto { target }, ..*terminator }), is_cleanup: false, }); @@ -470,32 +485,35 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { let init_data = self.initialization_data_at(loc); elaborate_drop( - &mut Elaborator { - init_data: &init_data, - ctxt: self - }, + &mut Elaborator { init_data: &init_data, ctxt: self }, terminator.source_info, location, path, target, Unwind::To(unwind), - bb); + bb, + ); on_all_children_bits(self.tcx, self.body, self.move_data(), path, |child| { - self.set_drop_flag(Location { block: target, statement_index: 0 }, - child, DropFlagState::Present); - self.set_drop_flag(Location { block: unwind, statement_index: 0 }, - child, DropFlagState::Present); + self.set_drop_flag( + Location { block: target, statement_index: 0 }, + child, + DropFlagState::Present, + ); + self.set_drop_flag( + Location { block: unwind, statement_index: 0 }, + child, + DropFlagState::Present, + ); }); } LookupResult::Parent(parent) => { // drop and replace behind a pointer/array/whatever. The location // must be initialized. debug!("elaborate_drop_and_replace({:?}) - untracked {:?}", terminator, parent); - self.patch.patch_terminator(bb, TerminatorKind::Drop { - location: location.clone(), - target, - unwind: Some(unwind) - }); + self.patch.patch_terminator( + bb, + TerminatorKind::Drop { location: *location, target, unwind: Some(unwind) }, + ); } } } @@ -528,27 +546,27 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { fn drop_flags_for_fn_rets(&mut self) { for (bb, data) in self.body.basic_blocks().iter_enumerated() { if let TerminatorKind::Call { - destination: Some((ref place, tgt)), cleanup: Some(_), .. - } = data.terminator().kind { + destination: Some((ref place, tgt)), + cleanup: Some(_), + .. + } = data.terminator().kind + { assert!(!self.patch.is_patched(bb)); let loc = Location { block: tgt, statement_index: 0 }; let path = self.move_data().rev_lookup.find(place.as_ref()); - on_lookup_result_bits( - self.tcx, self.body, self.move_data(), path, - |child| self.set_drop_flag(loc, child, DropFlagState::Present) - ); + on_lookup_result_bits(self.tcx, self.body, self.move_data(), path, |child| { + self.set_drop_flag(loc, child, DropFlagState::Present) + }); } } } fn drop_flags_for_args(&mut self) { let loc = Location::START; - dataflow::drop_flag_effects_for_function_entry( - self.tcx, self.body, self.env, |path, ds| { - self.set_drop_flag(loc, path, ds); - } - ) + dataflow::drop_flag_effects_for_function_entry(self.tcx, self.body, self.env, |path, ds| { + self.set_drop_flag(loc, path, ds); + }) } fn drop_flags_for_locs(&mut self) { @@ -560,14 +578,14 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { for (bb, data) in self.body.basic_blocks().iter_enumerated() { debug!("drop_flags_for_locs({:?})", data); - for i in 0..(data.statements.len()+1) { + for i in 0..(data.statements.len() + 1) { debug!("drop_flag_for_locs: stmt {}", i); let mut allow_initializations = true; if i == data.statements.len() { match data.terminator().kind { TerminatorKind::Drop { .. } => { // drop elaboration should handle that by itself - continue + continue; } TerminatorKind::DropAndReplace { .. } => { // this contains the move of the source and @@ -590,11 +608,15 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { } let loc = Location { block: bb, statement_index: i }; dataflow::drop_flag_effects_for_location( - self.tcx, self.body, self.env, loc, |path, ds| { + self.tcx, + self.body, + self.env, + loc, + |path, ds| { if ds == DropFlagState::Absent || allow_initializations { self.set_drop_flag(loc, path, ds) } - } + }, ) } @@ -603,15 +625,15 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { // call. if let TerminatorKind::Call { destination: Some((ref place, _)), cleanup: None, .. - } = data.terminator().kind { + } = data.terminator().kind + { assert!(!self.patch.is_patched(bb)); let loc = Location { block: bb, statement_index: data.statements.len() }; let path = self.move_data().rev_lookup.find(place.as_ref()); - on_lookup_result_bits( - self.tcx, self.body, self.move_data(), path, - |child| self.set_drop_flag(loc, child, DropFlagState::Present) - ); + on_lookup_result_bits(self.tcx, self.body, self.move_data(), path, |child| { + self.set_drop_flag(loc, child, DropFlagState::Present) + }); } } } diff --git a/src/librustc_mir/transform/erase_regions.rs b/src/librustc_mir/transform/erase_regions.rs index 1eef3f254f..996b97c03b 100644 --- a/src/librustc_mir/transform/erase_regions.rs +++ b/src/librustc_mir/transform/erase_regions.rs @@ -4,11 +4,11 @@ //! N.B., we do _not_ erase regions of statements that are relevant for //! "types-as-contracts"-validation, namely, `AcquireValid` and `ReleaseValid`. +use crate::transform::{MirPass, MirSource}; +use rustc::mir::visit::{MutVisitor, TyContext}; +use rustc::mir::*; use rustc::ty::subst::SubstsRef; use rustc::ty::{self, Ty, TyCtxt}; -use rustc::mir::*; -use rustc::mir::visit::{MutVisitor, TyContext}; -use crate::transform::{MirPass, MirSource}; struct EraseRegionsVisitor<'tcx> { tcx: TyCtxt<'tcx>, @@ -16,9 +16,7 @@ struct EraseRegionsVisitor<'tcx> { impl EraseRegionsVisitor<'tcx> { pub fn new(tcx: TyCtxt<'tcx>) -> Self { - EraseRegionsVisitor { - tcx, - } + EraseRegionsVisitor { tcx } } } @@ -43,10 +41,7 @@ impl MutVisitor<'tcx> for EraseRegionsVisitor<'tcx> { *substs = self.tcx.erase_regions(substs); } - fn process_projection_elem( - &mut self, - elem: &PlaceElem<'tcx>, - ) -> Option> { + fn process_projection_elem(&mut self, elem: &PlaceElem<'tcx>) -> Option> { if let PlaceElem::Field(field, ty) = elem { let new_ty = self.tcx.erase_regions(ty); diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs index 3d15d04717..1c86d6f3f6 100644 --- a/src/librustc_mir/transform/generator.rs +++ b/src/librustc_mir/transform/generator.rs @@ -49,27 +49,27 @@ //! For generators with state 1 (returned) and state 2 (poisoned) it does nothing. //! Otherwise it drops all the values in scope at the last suspension point. -use rustc::hir; -use rustc::hir::def_id::DefId; +use crate::dataflow::{do_dataflow, DataflowResultsCursor, DebugFormatted}; +use crate::dataflow::{DataflowResults, DataflowResultsConsumer, FlowAtLocation}; +use crate::dataflow::{HaveBeenBorrowedLocals, MaybeStorageLive, RequiresStorage}; +use crate::transform::no_landing_pads::no_landing_pads; +use crate::transform::simplify; +use crate::transform::{MirPass, MirSource}; +use crate::util::dump_mir; +use crate::util::liveness; +use rustc::mir::visit::{MutVisitor, PlaceContext, Visitor}; use rustc::mir::*; -use rustc::mir::visit::{PlaceContext, Visitor, MutVisitor}; -use rustc::ty::{self, TyCtxt, AdtDef, Ty}; -use rustc::ty::GeneratorSubsts; use rustc::ty::layout::VariantIdx; use rustc::ty::subst::SubstsRef; +use rustc::ty::GeneratorSubsts; +use rustc::ty::{self, AdtDef, Ty, TyCtxt}; use rustc_data_structures::fx::FxHashMap; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_index::bit_set::{BitMatrix, BitSet}; use rustc_index::vec::{Idx, IndexVec}; -use rustc_index::bit_set::{BitSet, BitMatrix}; use std::borrow::Cow; use std::iter; -use crate::transform::{MirPass, MirSource}; -use crate::transform::simplify; -use crate::transform::no_landing_pads::no_landing_pads; -use crate::dataflow::{DataflowResults, DataflowResultsConsumer, FlowAtLocation}; -use crate::dataflow::{do_dataflow, DebugFormatted, DataflowResultsCursor}; -use crate::dataflow::{MaybeStorageLive, HaveBeenBorrowedLocals, RequiresStorage}; -use crate::util::dump_mir; -use crate::util::liveness; pub struct StateTransform; @@ -84,23 +84,15 @@ impl<'tcx> MutVisitor<'tcx> for RenameLocalVisitor<'tcx> { self.tcx } - fn visit_local(&mut self, - local: &mut Local, - _: PlaceContext, - _: Location) { + fn visit_local(&mut self, local: &mut Local, _: PlaceContext, _: Location) { if *local == self.from { *local = self.to; } } - fn process_projection_elem( - &mut self, - elem: &PlaceElem<'tcx>, - ) -> Option> { + fn process_projection_elem(&mut self, elem: &PlaceElem<'tcx>) -> Option> { match elem { - PlaceElem::Index(local) if *local == self.from => { - Some(PlaceElem::Index(self.to)) - } + PlaceElem::Index(local) if *local == self.from => Some(PlaceElem::Index(self.to)), _ => None, } } @@ -115,24 +107,22 @@ impl<'tcx> MutVisitor<'tcx> for DerefArgVisitor<'tcx> { self.tcx } - fn visit_local(&mut self, - local: &mut Local, - _: PlaceContext, - _: Location) { + fn visit_local(&mut self, local: &mut Local, _: PlaceContext, _: Location) { assert_ne!(*local, self_arg()); } - fn visit_place(&mut self, - place: &mut Place<'tcx>, - context: PlaceContext, - location: Location) { - if place.base == PlaceBase::Local(self_arg()) { - replace_base(place, Place { - base: PlaceBase::Local(self_arg()), - projection: self.tcx().intern_place_elems(&vec![ProjectionElem::Deref]), - }, self.tcx); + fn visit_place(&mut self, place: &mut Place<'tcx>, context: PlaceContext, location: Location) { + if place.local == self_arg() { + replace_base( + place, + Place { + local: self_arg(), + projection: self.tcx().intern_place_elems(&[ProjectionElem::Deref]), + }, + self.tcx, + ); } else { - self.visit_place_base(&mut place.base, context, location); + self.visit_place_base(&mut place.local, context, location); for elem in place.projection.iter() { if let PlaceElem::Index(local) = elem { @@ -153,28 +143,25 @@ impl<'tcx> MutVisitor<'tcx> for PinArgVisitor<'tcx> { self.tcx } - fn visit_local(&mut self, - local: &mut Local, - _: PlaceContext, - _: Location) { + fn visit_local(&mut self, local: &mut Local, _: PlaceContext, _: Location) { assert_ne!(*local, self_arg()); } fn visit_place(&mut self, place: &mut Place<'tcx>, context: PlaceContext, location: Location) { - if place.base == PlaceBase::Local(self_arg()) { + if place.local == self_arg() { replace_base( place, Place { - base: PlaceBase::Local(self_arg()), - projection: self.tcx().intern_place_elems(&vec![ProjectionElem::Field( - Field::new(0), - self.ref_gen_ty, + local: self_arg(), + projection: self.tcx().intern_place_elems(&[ProjectionElem::Field( + Field::new(0), + self.ref_gen_ty, )]), }, self.tcx, ); } else { - self.visit_place_base(&mut place.base, context, location); + self.visit_place_base(&mut place.local, context, location); for elem in place.projection.iter() { if let PlaceElem::Index(local) = elem { @@ -186,7 +173,7 @@ impl<'tcx> MutVisitor<'tcx> for PinArgVisitor<'tcx> { } fn replace_base<'tcx>(place: &mut Place<'tcx>, new_base: Place<'tcx>, tcx: TyCtxt<'tcx>) { - place.base = new_base.base; + place.local = new_base.local; let mut new_projection = new_base.projection.to_vec(); new_projection.append(&mut place.projection.to_vec()); @@ -249,10 +236,7 @@ impl TransformVisitor<'tcx> { let mut projection = base.projection.to_vec(); projection.push(ProjectionElem::Field(Field::new(idx), ty)); - Place { - base: base.base, - projection: self.tcx.intern_place_elems(&projection), - } + Place { local: base.local, projection: self.tcx.intern_place_elems(&projection) } } // Create a statement which changes the discriminant @@ -276,7 +260,7 @@ impl TransformVisitor<'tcx> { let self_place = Place::from(self_arg()); let assign = Statement { source_info: source_info(body), - kind: StatementKind::Assign(box(temp.clone(), Rvalue::Discriminant(self_place))), + kind: StatementKind::Assign(box (temp, Rvalue::Discriminant(self_place))), }; (assign, temp) } @@ -287,58 +271,42 @@ impl MutVisitor<'tcx> for TransformVisitor<'tcx> { self.tcx } - fn visit_local(&mut self, - local: &mut Local, - _: PlaceContext, - _: Location) { + fn visit_local(&mut self, local: &mut Local, _: PlaceContext, _: Location) { assert_eq!(self.remap.get(local), None); } fn visit_place( &mut self, place: &mut Place<'tcx>, - context: PlaceContext, - location: Location, + _context: PlaceContext, + _location: Location, ) { - if let PlaceBase::Local(l) = place.base { - // Replace an Local in the remap with a generator struct access - if let Some(&(ty, variant_index, idx)) = self.remap.get(&l) { - replace_base(place, self.make_field(variant_index, idx, ty), self.tcx); - } - } else { - self.visit_place_base(&mut place.base, context, location); - - for elem in place.projection.iter() { - if let PlaceElem::Index(local) = elem { - assert_ne!(*local, self_arg()); - } - } + // Replace an Local in the remap with a generator struct access + if let Some(&(ty, variant_index, idx)) = self.remap.get(&place.local) { + replace_base(place, self.make_field(variant_index, idx, ty), self.tcx); } } - fn visit_basic_block_data(&mut self, - block: BasicBlock, - data: &mut BasicBlockData<'tcx>) { + fn visit_basic_block_data(&mut self, block: BasicBlock, data: &mut BasicBlockData<'tcx>) { // Remove StorageLive and StorageDead statements for remapped locals - data.retain_statements(|s| { - match s.kind { - StatementKind::StorageLive(l) | StatementKind::StorageDead(l) => { - !self.remap.contains_key(&l) - } - _ => true + data.retain_statements(|s| match s.kind { + StatementKind::StorageLive(l) | StatementKind::StorageDead(l) => { + !self.remap.contains_key(&l) } + _ => true, }); let ret_val = match data.terminator().kind { - TerminatorKind::Return => Some((VariantIdx::new(1), + TerminatorKind::Return => Some(( + VariantIdx::new(1), None, Operand::Move(Place::from(self.new_ret_local)), - None)), - TerminatorKind::Yield { ref value, resume, drop } => Some((VariantIdx::new(0), - Some(resume), - value.clone(), - drop)), - _ => None + None, + )), + TerminatorKind::Yield { ref value, resume, drop } => { + Some((VariantIdx::new(0), Some(resume), value.clone(), drop)) + } + _ => None, }; if let Some((state_idx, resume, v, drop)) = ret_val { @@ -346,14 +314,13 @@ impl MutVisitor<'tcx> for TransformVisitor<'tcx> { // We must assign the value first in case it gets declared dead below data.statements.push(Statement { source_info, - kind: StatementKind::Assign( - box( - Place::return_place(), - self.make_state(state_idx, v) - ) - ), + kind: StatementKind::Assign(box ( + Place::return_place(), + self.make_state(state_idx, v), + )), }); - let state = if let Some(resume) = resume { // Yield + let state = if let Some(resume) = resume { + // Yield let state = 3 + self.suspension_points.len(); self.suspension_points.push(SuspensionPoint { @@ -364,7 +331,8 @@ impl MutVisitor<'tcx> for TransformVisitor<'tcx> { }); VariantIdx::new(state) - } else { // Return + } else { + // Return VariantIdx::new(RETURNED) // state for returned }; data.statements.push(self.set_discr(state, source_info)); @@ -382,17 +350,11 @@ fn make_generator_state_argument_indirect<'tcx>( ) { let gen_ty = body.local_decls.raw[1].ty; - let region = ty::ReFree(ty::FreeRegion { - scope: def_id, - bound_region: ty::BoundRegion::BrEnv, - }); + let region = ty::ReFree(ty::FreeRegion { scope: def_id, bound_region: ty::BoundRegion::BrEnv }); let region = tcx.mk_region(region); - let ref_gen_ty = tcx.mk_ref(region, ty::TypeAndMut { - ty: gen_ty, - mutbl: hir::Mutability::Mutable - }); + let ref_gen_ty = tcx.mk_ref(region, ty::TypeAndMut { ty: gen_ty, mutbl: hir::Mutability::Mut }); // Replace the by value generator argument body.local_decls.raw[1].ty = ref_gen_ty; @@ -429,17 +391,13 @@ fn replace_result_variable<'tcx>( source_info, internal: false, is_block_tail: None, - local_info: LocalInfo::Other + local_info: LocalInfo::Other, }; let new_ret_local = Local::new(body.local_decls.len()); body.local_decls.push(new_ret); body.local_decls.swap(RETURN_PLACE, new_ret_local); - RenameLocalVisitor { - from: RETURN_PLACE, - to: new_ret_local, - tcx, - }.visit_body(body); + RenameLocalVisitor { from: RETURN_PLACE, to: new_ret_local, tcx }.visit_body(body); new_ret_local } @@ -447,12 +405,11 @@ fn replace_result_variable<'tcx>( struct StorageIgnored(liveness::LiveVarSet); impl<'tcx> Visitor<'tcx> for StorageIgnored { - fn visit_statement(&mut self, - statement: &Statement<'tcx>, - _location: Location) { + fn visit_statement(&mut self, statement: &Statement<'tcx>, _location: Location) { match statement.kind { - StatementKind::StorageLive(l) | - StatementKind::StorageDead(l) => { self.0.remove(l); } + StatementKind::StorageLive(l) | StatementKind::StorageDead(l) => { + self.0.remove(l); + } _ => (), } } @@ -493,8 +450,9 @@ fn locals_live_across_suspend_points( // lifetimes. let storage_live_analysis = MaybeStorageLive::new(body_ref); let storage_live_results = - do_dataflow(tcx, body_ref, def_id, &[], &dead_unwinds, storage_live_analysis, - |bd, p| DebugFormatted::new(&bd.body().local_decls[p])); + do_dataflow(tcx, body_ref, def_id, &[], &dead_unwinds, storage_live_analysis, |bd, p| { + DebugFormatted::new(&bd.body().local_decls[p]) + }); let mut storage_live_cursor = DataflowResultsCursor::new(&storage_live_results, body_ref); // Find the MIR locals which do not use StorageLive/StorageDead statements. @@ -505,42 +463,43 @@ fn locals_live_across_suspend_points( // Calculate the MIR locals which have been previously // borrowed (even if they are still active). let borrowed_locals_analysis = HaveBeenBorrowedLocals::new(body_ref); - let borrowed_locals_results = - do_dataflow(tcx, body_ref, def_id, &[], &dead_unwinds, borrowed_locals_analysis, - |bd, p| DebugFormatted::new(&bd.body().local_decls[p])); + let borrowed_locals_results = do_dataflow( + tcx, + body_ref, + def_id, + &[], + &dead_unwinds, + borrowed_locals_analysis, + |bd, p| DebugFormatted::new(&bd.body().local_decls[p]), + ); let mut borrowed_locals_cursor = DataflowResultsCursor::new(&borrowed_locals_results, body_ref); // Calculate the MIR locals that we actually need to keep storage around // for. let requires_storage_analysis = RequiresStorage::new(body, &borrowed_locals_results); - let requires_storage_results = - do_dataflow(tcx, body_ref, def_id, &[], &dead_unwinds, requires_storage_analysis, - |bd, p| DebugFormatted::new(&bd.body().local_decls[p])); - let mut requires_storage_cursor - = DataflowResultsCursor::new(&requires_storage_results, body_ref); - - // Calculate the liveness of MIR locals ignoring borrows. - let mut live_locals = liveness::LiveVarSet::new_empty(body.local_decls.len()); - let mut liveness = liveness::liveness_of_locals( - body, - ); - liveness::dump_mir( + let requires_storage_results = do_dataflow( tcx, - "generator_liveness", - source, body_ref, - &liveness, + def_id, + &[], + &dead_unwinds, + requires_storage_analysis, + |bd, p| DebugFormatted::new(&bd.body().local_decls[p]), ); + let mut requires_storage_cursor = + DataflowResultsCursor::new(&requires_storage_results, body_ref); + + // Calculate the liveness of MIR locals ignoring borrows. + let mut live_locals = liveness::LiveVarSet::new_empty(body.local_decls.len()); + let mut liveness = liveness::liveness_of_locals(body); + liveness::dump_mir(tcx, "generator_liveness", source, body_ref, &liveness); let mut storage_liveness_map = FxHashMap::default(); let mut live_locals_at_suspension_points = Vec::new(); for (block, data) in body.basic_blocks().iter_enumerated() { if let TerminatorKind::Yield { .. } = data.terminator().kind { - let loc = Location { - block: block, - statement_index: data.statements.len(), - }; + let loc = Location { block: block, statement_index: data.statements.len() }; if !movable { // The `liveness` variable contains the liveness of MIR locals ignoring borrows. @@ -594,11 +553,8 @@ fn locals_live_across_suspend_points( .map(|live_here| renumber_bitset(&live_here, &live_locals)) .collect(); - let storage_conflicts = compute_storage_conflicts( - body_ref, - &live_locals, - &ignored, - requires_storage_results); + let storage_conflicts = + compute_storage_conflicts(body_ref, &live_locals, &ignored, requires_storage_results); LivenessInfo { live_locals, @@ -613,8 +569,10 @@ fn locals_live_across_suspend_points( /// /// For example, if `stored_locals = [1, 3, 5]`, this would be renumbered to /// `[0, 1, 2]`. Thus, if `input = [3, 5]` we would return `[1, 2]`. -fn renumber_bitset(input: &BitSet, stored_locals: &liveness::LiveVarSet) --> BitSet { +fn renumber_bitset( + input: &BitSet, + stored_locals: &liveness::LiveVarSet, +) -> BitSet { assert!(stored_locals.superset(&input), "{:?} not a superset of {:?}", stored_locals, input); let mut out = BitSet::new_empty(stored_locals.count()); for (idx, local) in stored_locals.iter().enumerate() { @@ -700,32 +658,36 @@ impl<'body, 'tcx, 's> DataflowResultsConsumer<'body, 'tcx> self.body } - fn visit_block_entry(&mut self, - block: BasicBlock, - flow_state: &Self::FlowState) { + fn visit_block_entry(&mut self, block: BasicBlock, flow_state: &Self::FlowState) { // statement_index is only used for logging, so this is fine. self.apply_state(flow_state, Location { block, statement_index: 0 }); } - fn visit_statement_entry(&mut self, - loc: Location, - _stmt: &Statement<'tcx>, - flow_state: &Self::FlowState) { + fn visit_statement_entry( + &mut self, + loc: Location, + _stmt: &Statement<'tcx>, + flow_state: &Self::FlowState, + ) { self.apply_state(flow_state, loc); } - fn visit_terminator_entry(&mut self, - loc: Location, - _term: &Terminator<'tcx>, - flow_state: &Self::FlowState) { + fn visit_terminator_entry( + &mut self, + loc: Location, + _term: &Terminator<'tcx>, + flow_state: &Self::FlowState, + ) { self.apply_state(flow_state, loc); } } impl<'body, 'tcx, 's> StorageConflictVisitor<'body, 'tcx, 's> { - fn apply_state(&mut self, - flow_state: &FlowAtLocation<'tcx, RequiresStorage<'body, 'tcx>>, - loc: Location) { + fn apply_state( + &mut self, + flow_state: &FlowAtLocation<'tcx, RequiresStorage<'body, 'tcx>>, + loc: Location, + ) { // Ignore unreachable blocks. match self.body.basic_blocks()[loc.block].terminator().kind { TerminatorKind::Unreachable => return, @@ -759,7 +721,10 @@ fn compute_layout<'tcx>( ) { // Use a liveness analysis to compute locals which are live across a suspension point let LivenessInfo { - live_locals, live_locals_at_suspension_points, storage_conflicts, storage_liveness + live_locals, + live_locals_at_suspension_points, + storage_conflicts, + storage_liveness, } = locals_live_across_suspend_points(tcx, read_only!(body), source, movable); // Erase regions from the types passed in from typeck so we can compare them with @@ -779,11 +744,13 @@ fn compute_layout<'tcx>( // Sanity check that typeck knows about the type of locals which are // live across a suspension point if !allowed.contains(&decl.ty) && !allowed_upvars.contains(&decl.ty) { - span_bug!(body.span, - "Broken MIR: generator contains type {} in MIR, \ + span_bug!( + body.span, + "Broken MIR: generator contains type {} in MIR, \ but typeck only knows about {}", - decl.ty, - interior); + decl.ty, + interior + ); } } @@ -820,11 +787,7 @@ fn compute_layout<'tcx>( debug!("generator variant_fields = {:?}", variant_fields); debug!("generator storage_conflicts = {:#?}", storage_conflicts); - let layout = GeneratorLayout { - field_tys: tys, - variant_fields, - storage_conflicts, - }; + let layout = GeneratorLayout { field_tys: tys, variant_fields, storage_conflicts }; (remap, layout, storage_liveness) } @@ -845,14 +808,14 @@ fn insert_switch<'tcx>( }; let source_info = source_info(body); - body.basic_blocks_mut().raw.insert(0, BasicBlockData { - statements: vec![assign], - terminator: Some(Terminator { - source_info, - kind: switch, - }), - is_cleanup: false, - }); + body.basic_blocks_mut().raw.insert( + 0, + BasicBlockData { + statements: vec![assign], + terminator: Some(Terminator { source_info, kind: switch }), + is_cleanup: false, + }, + ); let blocks = body.basic_blocks_mut().iter_mut(); @@ -862,11 +825,13 @@ fn insert_switch<'tcx>( } fn elaborate_generator_drops<'tcx>( - tcx: TyCtxt<'tcx>, def_id: DefId, body: &mut BodyAndCache<'tcx> + tcx: TyCtxt<'tcx>, + def_id: DefId, + body: &mut BodyAndCache<'tcx>, ) { + use crate::shim::DropShimElaborator; use crate::util::elaborate_drops::{elaborate_drop, Unwind}; use crate::util::patch::MirPatch; - use crate::shim::DropShimElaborator; // Note that `elaborate_drops` only drops the upvars of a generator, and // this is ok because `open_drop` can only be reached within that own @@ -875,23 +840,11 @@ fn elaborate_generator_drops<'tcx>( let param_env = tcx.param_env(def_id); let gen = self_arg(); - let mut elaborator = DropShimElaborator { - body, - patch: MirPatch::new(body), - tcx, - param_env - }; + let mut elaborator = DropShimElaborator { body, patch: MirPatch::new(body), tcx, param_env }; for (block, block_data) in body.basic_blocks().iter_enumerated() { let (target, unwind, source_info) = match block_data.terminator() { - Terminator { - source_info, - kind: TerminatorKind::Drop { - location, - target, - unwind - } - } => { + Terminator { source_info, kind: TerminatorKind::Drop { location, target, unwind } } => { if let Some(local) = location.as_local() { if local == gen { (target, unwind, source_info) @@ -959,7 +912,7 @@ fn create_generator_drop_shim<'tcx>( source_info, internal: false, is_block_tail: None, - local_info: LocalInfo::Other + local_info: LocalInfo::Other, }; make_generator_state_argument_indirect(tcx, def_id, &mut body); @@ -967,22 +920,22 @@ fn create_generator_drop_shim<'tcx>( // Change the generator argument from &mut to *mut body.local_decls[self_arg()] = LocalDecl { mutability: Mutability::Mut, - ty: tcx.mk_ptr(ty::TypeAndMut { - ty: gen_ty, - mutbl: hir::Mutability::Mutable, - }), + ty: tcx.mk_ptr(ty::TypeAndMut { ty: gen_ty, mutbl: hir::Mutability::Mut }), user_ty: UserTypeProjections::none(), source_info, internal: false, is_block_tail: None, - local_info: LocalInfo::Other + local_info: LocalInfo::Other, }; if tcx.sess.opts.debugging_opts.mir_emit_retag { // Alias tracking must know we changed the type - body.basic_blocks_mut()[START_BLOCK].statements.insert(0, Statement { - source_info, - kind: StatementKind::Retag(RetagKind::Raw, box Place::from(self_arg())), - }) + body.basic_blocks_mut()[START_BLOCK].statements.insert( + 0, + Statement { + source_info, + kind: StatementKind::Retag(RetagKind::Raw, box Place::from(self_arg())), + }, + ) } no_landing_pads(tcx, &mut body); @@ -991,22 +944,20 @@ fn create_generator_drop_shim<'tcx>( // unrelated code from the resume part of the function simplify::remove_dead_blocks(&mut body); - dump_mir(tcx, None, "generator_drop", &0, source, &mut body, |_, _| Ok(()) ); + dump_mir(tcx, None, "generator_drop", &0, source, &mut body, |_, _| Ok(())); body } fn insert_term_block<'tcx>( - body: &mut BodyAndCache<'tcx>, kind: TerminatorKind<'tcx> + body: &mut BodyAndCache<'tcx>, + kind: TerminatorKind<'tcx>, ) -> BasicBlock { let term_block = BasicBlock::new(body.basic_blocks().len()); let source_info = source_info(body); body.basic_blocks_mut().push(BasicBlockData { statements: Vec::new(), - terminator: Some(Terminator { - source_info, - kind, - }), + terminator: Some(Terminator { source_info, kind }), is_cleanup: false, }); term_block @@ -1033,10 +984,7 @@ fn insert_panic_block<'tcx>( let source_info = source_info(body); body.basic_blocks_mut().push(BasicBlockData { statements: Vec::new(), - terminator: Some(Terminator { - source_info, - kind: term, - }), + terminator: Some(Terminator { source_info, kind: term }), is_cleanup: false, }); @@ -1054,31 +1002,21 @@ fn create_generator_resume_function<'tcx>( for block in body.basic_blocks_mut() { let source_info = block.terminator().source_info; if let &TerminatorKind::Resume = &block.terminator().kind { - block.statements.push( - transform.set_discr(VariantIdx::new(POISONED), source_info)); + block.statements.push(transform.set_discr(VariantIdx::new(POISONED), source_info)); } } let mut cases = create_cases(body, &transform, |point| Some(point.resume)); - use rustc::mir::interpret::PanicInfo::{ - ResumedAfterPanic, - ResumedAfterReturn, - }; + use rustc::mir::interpret::PanicInfo::{ResumedAfterPanic, ResumedAfterReturn}; // Jump to the entry point on the unresumed cases.insert(0, (UNRESUMED, BasicBlock::new(0))); // Panic when resumed on the returned or poisoned state let generator_kind = body.generator_kind.unwrap(); - cases.insert(1, (RETURNED, insert_panic_block( - tcx, - body, - ResumedAfterReturn(generator_kind)))); - cases.insert(2, (POISONED, insert_panic_block( - tcx, - body, - ResumedAfterPanic(generator_kind)))); + cases.insert(1, (RETURNED, insert_panic_block(tcx, body, ResumedAfterReturn(generator_kind)))); + cases.insert(2, (POISONED, insert_panic_block(tcx, body, ResumedAfterPanic(generator_kind)))); insert_switch(body, cases, &transform, TerminatorKind::Unreachable); @@ -1091,14 +1029,11 @@ fn create_generator_resume_function<'tcx>( // unrelated code from the drop part of the function simplify::remove_dead_blocks(body); - dump_mir(tcx, None, "generator_resume", &0, source, body, |_, _| Ok(()) ); + dump_mir(tcx, None, "generator_resume", &0, source, body, |_, _| Ok(())); } fn source_info(body: &Body<'_>) -> SourceInfo { - SourceInfo { - span: body.span, - scope: OUTERMOST_SOURCE_SCOPE, - } + SourceInfo { span: body.span, scope: OUTERMOST_SOURCE_SCOPE } } fn insert_clean_drop(body: &mut BodyAndCache<'_>) -> BasicBlock { @@ -1114,10 +1049,7 @@ fn insert_clean_drop(body: &mut BodyAndCache<'_>) -> BasicBlock { let source_info = source_info(body); body.basic_blocks_mut().push(BasicBlockData { statements: Vec::new(), - terminator: Some(Terminator { - source_info, - kind: term, - }), + terminator: Some(Terminator { source_info, kind: term }), is_cleanup: false, }); @@ -1134,49 +1066,47 @@ where { let source_info = source_info(body); - transform.suspension_points.iter().filter_map(|point| { - // Find the target for this suspension point, if applicable - target(point).map(|target| { - let block = BasicBlock::new(body.basic_blocks().len()); - let mut statements = Vec::new(); - - // Create StorageLive instructions for locals with live storage - for i in 0..(body.local_decls.len()) { - let l = Local::new(i); - if point.storage_liveness.contains(l) && !transform.remap.contains_key(&l) { - statements.push(Statement { - source_info, - kind: StatementKind::StorageLive(l), - }); + transform + .suspension_points + .iter() + .filter_map(|point| { + // Find the target for this suspension point, if applicable + target(point).map(|target| { + let block = BasicBlock::new(body.basic_blocks().len()); + let mut statements = Vec::new(); + + // Create StorageLive instructions for locals with live storage + for i in 0..(body.local_decls.len()) { + let l = Local::new(i); + if point.storage_liveness.contains(l) && !transform.remap.contains_key(&l) { + statements + .push(Statement { source_info, kind: StatementKind::StorageLive(l) }); + } } - } - // Then jump to the real target - body.basic_blocks_mut().push(BasicBlockData { - statements, - terminator: Some(Terminator { - source_info, - kind: TerminatorKind::Goto { - target, - }, - }), - is_cleanup: false, - }); + // Then jump to the real target + body.basic_blocks_mut().push(BasicBlockData { + statements, + terminator: Some(Terminator { + source_info, + kind: TerminatorKind::Goto { target }, + }), + is_cleanup: false, + }); - (point.state, block) + (point.state, block) + }) }) - }).collect() + .collect() } impl<'tcx> MirPass<'tcx> for StateTransform { - fn run_pass( - &self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx> - ) { + fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { let yield_ty = if let Some(yield_ty) = body.yield_ty { yield_ty } else { // This only applies to generators - return + return; }; assert!(body.generator_drop.is_none()); @@ -1190,10 +1120,12 @@ impl<'tcx> MirPass<'tcx> for StateTransform { let (upvars, interior, discr_ty, movable) = match gen_ty.kind { ty::Generator(_, substs, movability) => { let substs = substs.as_generator(); - (substs.upvar_tys(def_id, tcx).collect(), - substs.witness(def_id, tcx), - substs.discr_ty(tcx), - movability == hir::Movability::Movable) + ( + substs.upvar_tys(def_id, tcx).collect(), + substs.witness(def_id, tcx), + substs.discr_ty(tcx), + movability == hir::Movability::Movable, + ) } _ => bug!(), }; @@ -1201,10 +1133,7 @@ impl<'tcx> MirPass<'tcx> for StateTransform { // Compute GeneratorState let state_did = tcx.lang_items().gen_state().unwrap(); let state_adt_ref = tcx.adt_def(state_did); - let state_substs = tcx.intern_substs(&[ - yield_ty.into(), - body.return_ty().into(), - ]); + let state_substs = tcx.intern_substs(&[yield_ty.into(), body.return_ty().into()]); let ret_ty = tcx.mk_adt(state_adt_ref, state_substs); // We rename RETURN_PLACE which has type mir.return_ty to new_ret_local @@ -1214,13 +1143,8 @@ impl<'tcx> MirPass<'tcx> for StateTransform { // Extract locals which are live across suspension point into `layout` // `remap` gives a mapping from local indices onto generator struct indices // `storage_liveness` tells us which locals have live storage at suspension points - let (remap, layout, storage_liveness) = compute_layout( - tcx, - source, - &upvars, - interior, - movable, - body); + let (remap, layout, storage_liveness) = + compute_layout(tcx, source, &upvars, interior, movable, body); // Run the transformation which converts Places from Local to generator struct // accesses for locals in `remap`. @@ -1249,23 +1173,18 @@ impl<'tcx> MirPass<'tcx> for StateTransform { // This is expanded to a drop ladder in `elaborate_generator_drops`. let drop_clean = insert_clean_drop(body); - dump_mir(tcx, None, "generator_pre-elab", &0, source, body, |_, _| Ok(()) ); + dump_mir(tcx, None, "generator_pre-elab", &0, source, body, |_, _| Ok(())); // Expand `drop(generator_struct)` to a drop ladder which destroys upvars. // If any upvars are moved out of, drop elaboration will handle upvar destruction. // However we need to also elaborate the code generated by `insert_clean_drop`. elaborate_generator_drops(tcx, def_id, body); - dump_mir(tcx, None, "generator_post-transform", &0, source, body, |_, _| Ok(()) ); + dump_mir(tcx, None, "generator_post-transform", &0, source, body, |_, _| Ok(())); // Create a copy of our MIR and use it to create the drop shim for the generator - let drop_shim = create_generator_drop_shim(tcx, - &transform, - def_id, - source, - gen_ty, - body, - drop_clean); + let drop_shim = + create_generator_drop_shim(tcx, &transform, def_id, source, gen_ty, body, drop_clean); body.generator_drop = Some(box drop_shim); diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs index 9763913082..96cd8fc135 100644 --- a/src/librustc_mir/transform/inline.rs +++ b/src/librustc_mir/transform/inline.rs @@ -1,23 +1,23 @@ //! Inlining pass for MIR functions -use rustc::hir::CodegenFnAttrFlags; -use rustc::hir::def_id::DefId; +use rustc_hir::def_id::DefId; use rustc_index::bit_set::BitSet; use rustc_index::vec::{Idx, IndexVec}; -use rustc::mir::*; +use rustc::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc::mir::visit::*; -use rustc::ty::{self, Instance, InstanceDef, ParamEnv, Ty, TyCtxt}; -use rustc::ty::subst::{Subst, SubstsRef}; +use rustc::mir::*; +use rustc::ty::subst::{InternalSubsts, Subst, SubstsRef}; +use rustc::ty::{self, Instance, InstanceDef, ParamEnv, Ty, TyCtxt, TypeFoldable}; +use super::simplify::{remove_dead_blocks, CfgSimplifier}; +use crate::transform::{MirPass, MirSource}; use std::collections::VecDeque; use std::iter; -use crate::transform::{MirPass, MirSource}; -use super::simplify::{remove_dead_blocks, CfgSimplifier}; -use syntax::attr; use rustc_target::spec::abi::Abi; +use syntax::attr; const DEFAULT_THRESHOLD: usize = 50; const HINT_THRESHOLD: usize = 100; @@ -38,9 +38,7 @@ struct CallSite<'tcx> { } impl<'tcx> MirPass<'tcx> for Inline { - fn run_pass( - &self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx> - ) { + fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { if tcx.sess.opts.debugging_opts.mir_opt_level >= 2 { Inliner { tcx, source }.run_pass(body); } @@ -68,18 +66,22 @@ impl Inliner<'tcx> { let mut callsites = VecDeque::new(); - let param_env = self.tcx.param_env(self.source.def_id()); + let mut param_env = self.tcx.param_env(self.source.def_id()); + + let substs = &InternalSubsts::identity_for_item(self.tcx, self.source.def_id()); + + // For monomorphic functions, we can use `Reveal::All` to resolve specialized instances. + if !substs.needs_subst() { + param_env = param_env.with_reveal_all(); + } // Only do inlining into fn bodies. let id = self.tcx.hir().as_local_hir_id(self.source.def_id()).unwrap(); - if self.tcx.hir().body_owner_kind(id).is_fn_or_closure() - && self.source.promoted.is_none() - { + if self.tcx.hir().body_owner_kind(id).is_fn_or_closure() && self.source.promoted.is_none() { for (bb, bb_data) in caller_body.basic_blocks().iter_enumerated() { - if let Some(callsite) = self.get_valid_function_call(bb, - bb_data, - caller_body, - param_env) { + if let Some(callsite) = + self.get_valid_function_call(bb, bb_data, caller_body, param_env) + { callsites.push_back(callsite); } } @@ -108,7 +110,8 @@ impl Inliner<'tcx> { // not inline us. This trick only works without incremental compilation. // So don't do it if that is enabled. if !self.tcx.dep_graph.is_fully_enabled() - && self_node_id.as_u32() < callee_node_id.as_u32() { + && self_node_id.as_u32() < callee_node_id.as_u32() + { self.tcx.optimized_mir(callsite.callee) } else { continue; @@ -138,12 +141,10 @@ impl Inliner<'tcx> { debug!("attempting to inline callsite {:?} - success", callsite); // Add callsites from inlined function - for (bb, bb_data) in caller_body.basic_blocks().iter_enumerated().skip(start) - { - if let Some(new_callsite) = self.get_valid_function_call(bb, - bb_data, - caller_body, - param_env) { + for (bb, bb_data) in caller_body.basic_blocks().iter_enumerated().skip(start) { + if let Some(new_callsite) = + self.get_valid_function_call(bb, bb_data, caller_body, param_env) + { // Don't inline the same function multiple times. if callsite.callee != new_callsite.callee { callsites.push_back(new_callsite); @@ -168,23 +169,23 @@ impl Inliner<'tcx> { } } - fn get_valid_function_call(&self, - bb: BasicBlock, - bb_data: &BasicBlockData<'tcx>, - caller_body: &Body<'tcx>, - param_env: ParamEnv<'tcx>, + fn get_valid_function_call( + &self, + bb: BasicBlock, + bb_data: &BasicBlockData<'tcx>, + caller_body: &Body<'tcx>, + param_env: ParamEnv<'tcx>, ) -> Option> { // Don't inline calls that are in cleanup blocks. - if bb_data.is_cleanup { return None; } + if bb_data.is_cleanup { + return None; + } // Only consider direct calls to functions let terminator = bb_data.terminator(); if let TerminatorKind::Call { func: ref op, .. } = terminator.kind { if let ty::FnDef(callee_def_id, substs) = op.ty(caller_body, self.tcx).kind { - let instance = Instance::resolve(self.tcx, - param_env, - callee_def_id, - substs)?; + let instance = Instance::resolve(self.tcx, param_env, callee_def_id, substs)?; if let InstanceDef::Virtual(..) = instance.def { return None; @@ -194,7 +195,7 @@ impl Inliner<'tcx> { callee: instance.def_id(), substs: instance.substs, bb, - location: terminator.source_info + location: terminator.source_info, }); } } @@ -202,23 +203,15 @@ impl Inliner<'tcx> { None } - fn consider_optimizing(&self, - callsite: CallSite<'tcx>, - callee_body: &Body<'tcx>) - -> bool - { + fn consider_optimizing(&self, callsite: CallSite<'tcx>, callee_body: &Body<'tcx>) -> bool { debug!("consider_optimizing({:?})", callsite); self.should_inline(callsite, callee_body) - && self.tcx.consider_optimizing(|| format!("Inline {:?} into {:?}", - callee_body.span, - callsite)) + && self.tcx.consider_optimizing(|| { + format!("Inline {:?} into {:?}", callee_body.span, callsite) + }) } - fn should_inline(&self, - callsite: CallSite<'tcx>, - callee_body: &Body<'tcx>) - -> bool - { + fn should_inline(&self, callsite: CallSite<'tcx>, callee_body: &Body<'tcx>) -> bool { debug!("should_inline({:?})", callsite); let tcx = self.tcx; @@ -242,7 +235,7 @@ impl Inliner<'tcx> { attr::InlineAttr::Always => true, attr::InlineAttr::Never => { debug!("`#[inline(never)]` present - not inlining"); - return false + return false; } attr::InlineAttr::Hint => true, attr::InlineAttr::None => false, @@ -258,11 +251,7 @@ impl Inliner<'tcx> { } } - let mut threshold = if hinted { - HINT_THRESHOLD - } else { - DEFAULT_THRESHOLD - }; + let mut threshold = if hinted { HINT_THRESHOLD } else { DEFAULT_THRESHOLD }; // Significantly lower the threshold for inlining cold functions if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::COLD) { @@ -289,23 +278,25 @@ impl Inliner<'tcx> { let mut work_list = vec![START_BLOCK]; let mut visited = BitSet::new_empty(callee_body.basic_blocks().len()); while let Some(bb) = work_list.pop() { - if !visited.insert(bb.index()) { continue; } + if !visited.insert(bb.index()) { + continue; + } let blk = &callee_body.basic_blocks()[bb]; for stmt in &blk.statements { // Don't count StorageLive/StorageDead in the inlining cost. match stmt.kind { - StatementKind::StorageLive(_) | - StatementKind::StorageDead(_) | - StatementKind::Nop => {} - _ => cost += INSTR_COST + StatementKind::StorageLive(_) + | StatementKind::StorageDead(_) + | StatementKind::Nop => {} + _ => cost += INSTR_COST, } } let term = blk.terminator(); let mut is_drop = false; match term.kind { - TerminatorKind::Drop { ref location, target, unwind } | - TerminatorKind::DropAndReplace { ref location, target, unwind, .. } => { + TerminatorKind::Drop { ref location, target, unwind } + | TerminatorKind::DropAndReplace { ref location, target, unwind, .. } => { is_drop = true; work_list.push(target); // If the location doesn't actually need dropping, treat it like @@ -321,14 +312,15 @@ impl Inliner<'tcx> { } } - TerminatorKind::Unreachable | - TerminatorKind::Call { destination: None, .. } if first_block => { + TerminatorKind::Unreachable | TerminatorKind::Call { destination: None, .. } + if first_block => + { // If the function always diverges, don't inline // unless the cost is zero threshold = 0; } - TerminatorKind::Call {func: Operand::Constant(ref f), .. } => { + TerminatorKind::Call { func: Operand::Constant(ref f), .. } => { if let ty::FnDef(def_id, _) = f.literal.ty.kind { // Don't give intrinsics the extra penalty for calls let f = tcx.fn_sig(def_id); @@ -340,7 +332,7 @@ impl Inliner<'tcx> { } } TerminatorKind::Assert { .. } => cost += CALL_PENALTY, - _ => cost += INSTR_COST + _ => cost += INSTR_COST, } if !is_drop { @@ -362,7 +354,7 @@ impl Inliner<'tcx> { let ty = v.ty.subst(tcx, callsite.substs); // Cost of the var is the size in machine-words, if we know // it. - if let Some(size) = type_size_of(tcx, param_env.clone(), ty) { + if let Some(size) = type_size_of(tcx, param_env, ty) { cost += (size / ptr_size) as usize; } else { cost += UNKNOWN_SIZE_COST; @@ -383,10 +375,12 @@ impl Inliner<'tcx> { } } - fn inline_call(&self, - callsite: CallSite<'tcx>, - caller_body: &mut BodyAndCache<'tcx>, - mut callee_body: BodyAndCache<'tcx>) -> bool { + fn inline_call( + &self, + callsite: CallSite<'tcx>, + caller_body: &mut BodyAndCache<'tcx>, + mut callee_body: BodyAndCache<'tcx>, + ) -> bool { let terminator = caller_body[callsite.bb].terminator.take().unwrap(); match terminator.kind { // FIXME: Handle inlining of diverging calls @@ -416,8 +410,7 @@ impl Inliner<'tcx> { for loc in callee_body.vars_and_temps_iter() { let mut local = callee_body.local_decls[loc].clone(); - local.source_info.scope = - scope_map[local.source_info.scope]; + local.source_info.scope = scope_map[local.source_info.scope]; local.source_info.span = callsite.location.span; let idx = caller_body.local_decls.push(local); @@ -432,18 +425,12 @@ impl Inliner<'tcx> { fn dest_needs_borrow(place: &Place<'_>) -> bool { for elem in place.projection.iter() { match elem { - ProjectionElem::Deref | - ProjectionElem::Index(_) => return true, + ProjectionElem::Deref | ProjectionElem::Index(_) => return true, _ => {} } } - match place.base { - // Static variables need a borrow because the callee - // might modify the same static. - PlaceBase::Static(_) => true, - _ => false - } + false } let dest = if dest_needs_borrow(&destination.0) { @@ -451,7 +438,8 @@ impl Inliner<'tcx> { let dest = Rvalue::Ref( self.tcx.lifetimes.re_erased, BorrowKind::Mut { allow_two_phase_borrow: false }, - destination.0); + destination.0, + ); let ty = dest.ty(&**caller_body, self.tcx); @@ -462,10 +450,9 @@ impl Inliner<'tcx> { let stmt = Statement { source_info: callsite.location, - kind: StatementKind::Assign(box(tmp.clone(), dest)) + kind: StatementKind::Assign(box (tmp, dest)), }; - caller_body[callsite.bb] - .statements.push(stmt); + caller_body[callsite.bb].statements.push(stmt); self.tcx.mk_place_deref(tmp) } else { destination.0 @@ -501,7 +488,7 @@ impl Inliner<'tcx> { let terminator = Terminator { source_info: callsite.location, - kind: TerminatorKind::Goto { target: BasicBlock::new(bb_len) } + kind: TerminatorKind::Goto { target: BasicBlock::new(bb_len) }, }; caller_body[callsite.bb].terminator = Some(terminator); @@ -509,10 +496,8 @@ impl Inliner<'tcx> { true } kind => { - caller_body[callsite.bb].terminator = Some(Terminator { - source_info: terminator.source_info, - kind, - }); + caller_body[callsite.bb].terminator = + Some(Terminator { source_info: terminator.source_info, kind }); false } } @@ -551,10 +536,8 @@ impl Inliner<'tcx> { // and the vector is `[closure_ref, tmp0, tmp1, tmp2]`. if tcx.is_closure(callsite.callee) { let mut args = args.into_iter(); - let self_ - = self.create_temp_if_necessary(args.next().unwrap(), callsite, caller_body); - let tuple - = self.create_temp_if_necessary(args.next().unwrap(), callsite, caller_body); + let self_ = self.create_temp_if_necessary(args.next().unwrap(), callsite, caller_body); + let tuple = self.create_temp_if_necessary(args.next().unwrap(), callsite, caller_body); assert!(args.next().is_none()); let tuple = Place::from(tuple); @@ -568,18 +551,14 @@ impl Inliner<'tcx> { let closure_ref_arg = iter::once(self_); // The `tmp0`, `tmp1`, and `tmp2` in our example abonve. - let tuple_tmp_args = - tuple_tys.iter().enumerate().map(|(i, ty)| { - // This is e.g., `tuple_tmp.0` in our example above. - let tuple_field = Operand::Move(tcx.mk_place_field( - tuple.clone(), - Field::new(i), - ty.expect_ty(), - )); - - // Spill to a local to make e.g., `tmp0`. - self.create_temp_if_necessary(tuple_field, callsite, caller_body) - }); + let tuple_tmp_args = tuple_tys.iter().enumerate().map(|(i, ty)| { + // This is e.g., `tuple_tmp.0` in our example above. + let tuple_field = + Operand::Move(tcx.mk_place_field(tuple.clone(), Field::new(i), ty.expect_ty())); + + // Spill to a local to make e.g., `tmp0`. + self.create_temp_if_necessary(tuple_field, callsite, caller_body) + }); closure_ref_arg.chain(tuple_tmp_args).collect() } else { @@ -620,7 +599,7 @@ impl Inliner<'tcx> { let stmt = Statement { source_info: callsite.location, - kind: StatementKind::Assign(box(Place::from(arg_tmp), arg)), + kind: StatementKind::Assign(box (Place::from(arg_tmp), arg)), }; caller_body[callsite.bb].statements.push(stmt); arg_tmp @@ -663,10 +642,7 @@ impl<'a, 'tcx> Integrator<'a, 'tcx> { fn make_integrate_local(&self, local: &Local) -> Local { if *local == RETURN_PLACE { - match self.destination.as_local() { - Some(l) => return l, - ref place => bug!("Return place is {:?}, not local", place), - } + return self.destination.local; } let idx = local.index() - 1; @@ -683,38 +659,31 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> { self.tcx } - fn visit_local( - &mut self, - local: &mut Local, - _ctxt: PlaceContext, - _location: Location, - ) { + fn visit_local(&mut self, local: &mut Local, _ctxt: PlaceContext, _location: Location) { *local = self.make_integrate_local(local); } - fn visit_place( - &mut self, - place: &mut Place<'tcx>, - context: PlaceContext, - location: Location, - ) { - if let Some(RETURN_PLACE) = place.as_local() { - // Return pointer; update the place itself - *place = self.destination.clone(); - } else { - self.super_place(place, context, location); + fn visit_place(&mut self, place: &mut Place<'tcx>, context: PlaceContext, location: Location) { + // If this is the `RETURN_PLACE`, we need to rebase any projections onto it. + let dest_proj_len = self.destination.projection.len(); + if place.local == RETURN_PLACE && dest_proj_len > 0 { + let mut projs = Vec::with_capacity(dest_proj_len + place.projection.len()); + projs.extend(self.destination.projection); + projs.extend(place.projection); + + place.projection = self.tcx.intern_place_elems(&*projs); } + // Handles integrating any locals that occur in the base + // or projections + self.super_place(place, context, location) } - fn process_projection_elem( - &mut self, - elem: &PlaceElem<'tcx>, - ) -> Option> { + fn process_projection_elem(&mut self, elem: &PlaceElem<'tcx>) -> Option> { if let PlaceElem::Index(local) = elem { let new_local = self.make_integrate_local(local); if new_local != *local { - return Some(PlaceElem::Index(new_local)) + return Some(PlaceElem::Index(new_local)); } } @@ -727,12 +696,7 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> { self.in_cleanup_block = false; } - fn visit_retag( - &mut self, - kind: &mut RetagKind, - place: &mut Place<'tcx>, - loc: Location, - ) { + fn visit_retag(&mut self, kind: &mut RetagKind, place: &mut Place<'tcx>, loc: Location) { self.super_retag(kind, place, loc); // We have to patch all inlined retags to be aware that they are no longer @@ -742,14 +706,12 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> { } } - fn visit_terminator_kind(&mut self, - kind: &mut TerminatorKind<'tcx>, loc: Location) { + fn visit_terminator_kind(&mut self, kind: &mut TerminatorKind<'tcx>, loc: Location) { self.super_terminator_kind(kind, loc); match *kind { - TerminatorKind::GeneratorDrop | - TerminatorKind::Yield { .. } => bug!(), - TerminatorKind::Goto { ref mut target} => { + TerminatorKind::GeneratorDrop | TerminatorKind::Yield { .. } => bug!(), + TerminatorKind::Goto { ref mut target } => { *target = self.update_target(*target); } TerminatorKind::SwitchInt { ref mut targets, .. } => { @@ -757,8 +719,8 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> { *tgt = self.update_target(*tgt); } } - TerminatorKind::Drop { ref mut target, ref mut unwind, .. } | - TerminatorKind::DropAndReplace { ref mut target, ref mut unwind, .. } => { + TerminatorKind::Drop { ref mut target, ref mut unwind, .. } + | TerminatorKind::DropAndReplace { ref mut target, ref mut unwind, .. } => { *target = self.update_target(*target); if let Some(tgt) = *unwind { *unwind = Some(self.update_target(tgt)); @@ -798,15 +760,17 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> { *kind = TerminatorKind::Goto { target: tgt } } } - TerminatorKind::Abort => { } - TerminatorKind::Unreachable => { } + TerminatorKind::Abort => {} + TerminatorKind::Unreachable => {} TerminatorKind::FalseEdges { ref mut real_target, ref mut imaginary_target } => { *real_target = self.update_target(*real_target); *imaginary_target = self.update_target(*imaginary_target); } - TerminatorKind::FalseUnwind { real_target: _ , unwind: _ } => - // see the ordering of passes in the optimized_mir query. + TerminatorKind::FalseUnwind { real_target: _, unwind: _ } => + // see the ordering of passes in the optimized_mir query. + { bug!("False unwinds should have been removed before inlining") + } } } diff --git a/src/librustc_mir/transform/instcombine.rs b/src/librustc_mir/transform/instcombine.rs index eca1b596a4..48b4d00a2e 100644 --- a/src/librustc_mir/transform/instcombine.rs +++ b/src/librustc_mir/transform/instcombine.rs @@ -1,15 +1,15 @@ //! Performs various peephole optimizations. +use crate::transform::{MirPass, MirSource}; +use rustc::mir::visit::{MutVisitor, Visitor}; use rustc::mir::{ - Constant, Location, Place, PlaceBase, PlaceRef, Body, BodyAndCache, Operand, ProjectionElem, - Rvalue, Local, read_only + read_only, Body, BodyAndCache, Constant, Local, Location, Operand, Place, PlaceRef, + ProjectionElem, Rvalue, }; -use rustc::mir::visit::{MutVisitor, Visitor}; use rustc::ty::{self, TyCtxt}; -use rustc::util::nodemap::{FxHashMap, FxHashSet}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_index::vec::Idx; use std::mem; -use crate::transform::{MirPass, MirSource}; pub struct InstCombine; @@ -17,7 +17,7 @@ impl<'tcx> MirPass<'tcx> for InstCombine { fn run_pass(&self, tcx: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { // We only run when optimizing MIR (at any level). if tcx.sess.opts.debugging_opts.mir_opt_level == 0 { - return + return; } // First, find optimization opportunities. This is done in a pre-pass to keep the MIR @@ -51,11 +51,11 @@ impl<'tcx> MutVisitor<'tcx> for InstCombineVisitor<'tcx> { let new_place = match rvalue { Rvalue::Ref(_, _, place) => { if let &[ref proj_l @ .., proj_r] = place.projection.as_ref() { - place.projection = self.tcx().intern_place_elems(&vec![proj_r.clone()]); + place.projection = self.tcx().intern_place_elems(&[proj_r]); Place { // Replace with dummy - base: mem::replace(&mut place.base, PlaceBase::Local(Local::new(0))), + local: mem::replace(&mut place.local, Local::new(0)), projection: self.tcx().intern_place_elems(proj_l), } } else { @@ -85,22 +85,17 @@ struct OptimizationFinder<'b, 'tcx> { impl OptimizationFinder<'b, 'tcx> { fn new(body: &'b Body<'tcx>, tcx: TyCtxt<'tcx>) -> OptimizationFinder<'b, 'tcx> { - OptimizationFinder { - body, - tcx, - optimizations: OptimizationList::default(), - } + OptimizationFinder { body, tcx, optimizations: OptimizationList::default() } } } impl Visitor<'tcx> for OptimizationFinder<'b, 'tcx> { fn visit_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location) { if let Rvalue::Ref(_, _, place) = rvalue { - if let PlaceRef { - base, - projection: &[ref proj_base @ .., ProjectionElem::Deref], - } = place.as_ref() { - if Place::ty_from(base, proj_base, self.body, self.tcx).ty.is_region_ptr() { + if let PlaceRef { local, projection: &[ref proj_base @ .., ProjectionElem::Deref] } = + place.as_ref() + { + if Place::ty_from(local, proj_base, self.body, self.tcx).ty.is_region_ptr() { self.optimizations.and_stars.insert(location); } } diff --git a/src/librustc_mir/transform/mod.rs b/src/librustc_mir/transform/mod.rs index 2e1a08a022..3c37eccc18 100644 --- a/src/librustc_mir/transform/mod.rs +++ b/src/librustc_mir/transform/mod.rs @@ -1,47 +1,47 @@ -use crate::{build, shim}; -use rustc_index::vec::IndexVec; -use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; -use rustc::mir::{BodyAndCache, MirPhase, Promoted, ConstQualifs}; -use rustc::ty::{TyCtxt, InstanceDef, TypeFoldable}; +use crate::{shim, util}; +use rustc::hir::map::Map; +use rustc::mir::{BodyAndCache, ConstQualifs, MirPhase, Promoted}; use rustc::ty::query::Providers; use rustc::ty::steal::Steal; -use rustc::hir; -use rustc::hir::intravisit::{self, Visitor, NestedVisitorMap}; -use rustc::util::nodemap::DefIdSet; +use rustc::ty::{InstanceDef, TyCtxt, TypeFoldable}; +use rustc_hir as hir; +use rustc_hir::def_id::{CrateNum, DefId, DefIdSet, LOCAL_CRATE}; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_index::vec::IndexVec; +use rustc_span::Span; use std::borrow::Cow; use syntax::ast; -use syntax_pos::Span; -pub mod add_retag; +pub mod add_call_guards; pub mod add_moves_for_packed_drops; -pub mod cleanup_post_borrowck; +pub mod add_retag; pub mod check_consts; pub mod check_unsafety; -pub mod simplify_branches; -pub mod simplify_try; -pub mod simplify; +pub mod cleanup_post_borrowck; +pub mod const_prop; +pub mod copy_prop; +pub mod deaggregator; +pub mod dump_mir; +pub mod elaborate_drops; pub mod erase_regions; +pub mod generator; +pub mod inline; +pub mod instcombine; pub mod no_landing_pads; -pub mod rustc_peek; -pub mod elaborate_drops; -pub mod add_call_guards; pub mod promote_consts; pub mod qualify_min_const_fn; pub mod remove_noop_landing_pads; -pub mod dump_mir; -pub mod deaggregator; -pub mod instcombine; -pub mod copy_prop; -pub mod const_prop; -pub mod generator; -pub mod inline; +pub mod rustc_peek; +pub mod simplify; +pub mod simplify_branches; +pub mod simplify_try; pub mod uninhabited_enum_branching; +pub mod unreachable_prop; pub(crate) fn provide(providers: &mut Providers<'_>) { self::check_unsafety::provide(providers); *providers = Providers { mir_keys, - mir_built, mir_const, mir_const_qualif, mir_validated, @@ -73,34 +73,31 @@ fn mir_keys(tcx: TyCtxt<'_>, krate: CrateNum) -> &DefIdSet { set: &'a mut DefIdSet, } impl<'a, 'tcx> Visitor<'tcx> for GatherCtors<'a, 'tcx> { - fn visit_variant_data(&mut self, - v: &'tcx hir::VariantData, - _: ast::Name, - _: &'tcx hir::Generics, - _: hir::HirId, - _: Span) { + fn visit_variant_data( + &mut self, + v: &'tcx hir::VariantData<'tcx>, + _: ast::Name, + _: &'tcx hir::Generics<'tcx>, + _: hir::HirId, + _: Span, + ) { if let hir::VariantData::Tuple(_, hir_id) = *v { self.set.insert(self.tcx.hir().local_def_id(hir_id)); } intravisit::walk_struct_def(self, v) } - fn nested_visit_map<'b>(&'b mut self) -> NestedVisitorMap<'b, 'tcx> { + type Map = Map<'tcx>; + fn nested_visit_map<'b>(&'b mut self) -> NestedVisitorMap<'b, Self::Map> { NestedVisitorMap::None } } - tcx.hir().krate().visit_all_item_likes(&mut GatherCtors { - tcx, - set: &mut set, - }.as_deep_visitor()); + tcx.hir() + .krate() + .visit_all_item_likes(&mut GatherCtors { tcx, set: &mut set }.as_deep_visitor()); tcx.arena.alloc(set) } -fn mir_built(tcx: TyCtxt<'_>, def_id: DefId) -> &Steal> { - let mir = build::mir_build(tcx, def_id); - tcx.alloc_steal_mir(mir) -} - /// Where a specific `mir::Body` comes from. #[derive(Debug, Copy, Clone)] pub struct MirSource<'tcx> { @@ -112,10 +109,7 @@ pub struct MirSource<'tcx> { impl<'tcx> MirSource<'tcx> { pub fn item(def_id: DefId) -> Self { - MirSource { - instance: InstanceDef::Item(def_id), - promoted: None - } + MirSource { instance: InstanceDef::Item(def_id), promoted: None } } #[inline] @@ -128,11 +122,7 @@ impl<'tcx> MirSource<'tcx> { /// type `T`. pub fn default_name() -> Cow<'static, str> { let name = ::std::any::type_name::(); - if let Some(tail) = name.rfind(":") { - Cow::from(&name[tail+1..]) - } else { - Cow::from(name) - } + if let Some(tail) = name.rfind(":") { Cow::from(&name[tail + 1..]) } else { Cow::from(name) } } /// A streamlined trait that you can implement to create a pass; the @@ -160,15 +150,18 @@ pub fn run_passes( return; } - let source = MirSource { - instance, - promoted, - }; + let source = MirSource { instance, promoted }; let mut index = 0; let mut run_pass = |pass: &dyn MirPass<'tcx>| { let run_hooks = |body: &_, index, is_after| { - dump_mir::on_mir_pass(tcx, &format_args!("{:03}-{:03}", phase_index, index), - &pass.name(), source, body, is_after); + dump_mir::on_mir_pass( + tcx, + &format_args!("{:03}-{:03}", phase_index, index), + &pass.name(), + source, + body, + is_after, + ); }; run_hooks(body, index, false); pass.run_pass(tcx, source, body); @@ -224,11 +217,21 @@ fn mir_const(tcx: TyCtxt<'_>, def_id: DefId) -> &Steal> { let _ = tcx.unsafety_check_result(def_id); let mut body = tcx.mir_built(def_id).steal(); - run_passes(tcx, &mut body, InstanceDef::Item(def_id), None, MirPhase::Const, &[ - // What we need to do constant evaluation. - &simplify::SimplifyCfg::new("initial"), - &rustc_peek::SanityCheck, - ]); + + util::dump_mir(tcx, None, "mir_map", &0, MirSource::item(def_id), &body, |_, _| Ok(())); + + run_passes( + tcx, + &mut body, + InstanceDef::Item(def_id), + None, + MirPhase::Const, + &[ + // What we need to do constant evaluation. + &simplify::SimplifyCfg::new("initial"), + &rustc_peek::SanityCheck, + ], + ); body.ensure_predecessors(); tcx.alloc_steal_mir(body) } @@ -243,11 +246,18 @@ fn mir_validated( let mut body = tcx.mir_const(def_id).steal(); let promote_pass = promote_consts::PromoteTemps::default(); - run_passes(tcx, &mut body, InstanceDef::Item(def_id), None, MirPhase::Validated, &[ - // What we need to run borrowck etc. - &promote_pass, - &simplify::SimplifyCfg::new("qualify-consts"), - ]); + run_passes( + tcx, + &mut body, + InstanceDef::Item(def_id), + None, + MirPhase::Validated, + &[ + // What we need to run borrowck etc. + &promote_pass, + &simplify::SimplifyCfg::new("qualify-consts"), + ], + ); let promoted = promote_pass.promoted_fragments.into_inner(); (tcx.alloc_steal_mir(body), tcx.alloc_steal_promoted(promoted)) @@ -259,61 +269,60 @@ fn run_optimization_passes<'tcx>( def_id: DefId, promoted: Option, ) { - run_passes(tcx, body, InstanceDef::Item(def_id), promoted, MirPhase::Optimized, &[ - // Remove all things only needed by analysis - &no_landing_pads::NoLandingPads::new(tcx), - &simplify_branches::SimplifyBranches::new("initial"), - &remove_noop_landing_pads::RemoveNoopLandingPads, - &cleanup_post_borrowck::CleanupNonCodegenStatements, - - &simplify::SimplifyCfg::new("early-opt"), - - // These next passes must be executed together - &add_call_guards::CriticalCallEdges, - &elaborate_drops::ElaborateDrops, - &no_landing_pads::NoLandingPads::new(tcx), - // AddMovesForPackedDrops needs to run after drop - // elaboration. - &add_moves_for_packed_drops::AddMovesForPackedDrops, - // AddRetag needs to run after ElaborateDrops, and it needs - // an AllCallEdges pass right before it. Otherwise it should - // run fairly late, but before optimizations begin. - &add_call_guards::AllCallEdges, - &add_retag::AddRetag, - - &simplify::SimplifyCfg::new("elaborate-drops"), - - // No lifetime analysis based on borrowing can be done from here on out. - - // From here on out, regions are gone. - &erase_regions::EraseRegions, - - - // Optimizations begin. - &uninhabited_enum_branching::UninhabitedEnumBranching, - &simplify::SimplifyCfg::new("after-uninhabited-enum-branching"), - &inline::Inline, - - // Lowering generator control-flow and variables - // has to happen before we do anything else to them. - &generator::StateTransform, - - &instcombine::InstCombine, - &const_prop::ConstProp, - &simplify_branches::SimplifyBranches::new("after-const-prop"), - &deaggregator::Deaggregator, - ©_prop::CopyPropagation, - &simplify_branches::SimplifyBranches::new("after-copy-prop"), - &remove_noop_landing_pads::RemoveNoopLandingPads, - &simplify::SimplifyCfg::new("after-remove-noop-landing-pads"), - &simplify_try::SimplifyArmIdentity, - &simplify_try::SimplifyBranchSame, - &simplify::SimplifyCfg::new("final"), - &simplify::SimplifyLocals, - - &add_call_guards::CriticalCallEdges, - &dump_mir::Marker("PreCodegen"), - ]); + run_passes( + tcx, + body, + InstanceDef::Item(def_id), + promoted, + MirPhase::Optimized, + &[ + // Remove all things only needed by analysis + &no_landing_pads::NoLandingPads::new(tcx), + &simplify_branches::SimplifyBranches::new("initial"), + &remove_noop_landing_pads::RemoveNoopLandingPads, + &cleanup_post_borrowck::CleanupNonCodegenStatements, + &simplify::SimplifyCfg::new("early-opt"), + // These next passes must be executed together + &add_call_guards::CriticalCallEdges, + &elaborate_drops::ElaborateDrops, + &no_landing_pads::NoLandingPads::new(tcx), + // AddMovesForPackedDrops needs to run after drop + // elaboration. + &add_moves_for_packed_drops::AddMovesForPackedDrops, + // AddRetag needs to run after ElaborateDrops, and it needs + // an AllCallEdges pass right before it. Otherwise it should + // run fairly late, but before optimizations begin. + &add_call_guards::AllCallEdges, + &add_retag::AddRetag, + &simplify::SimplifyCfg::new("elaborate-drops"), + // No lifetime analysis based on borrowing can be done from here on out. + + // From here on out, regions are gone. + &erase_regions::EraseRegions, + // Optimizations begin. + &unreachable_prop::UnreachablePropagation, + &uninhabited_enum_branching::UninhabitedEnumBranching, + &simplify::SimplifyCfg::new("after-uninhabited-enum-branching"), + &inline::Inline, + // Lowering generator control-flow and variables + // has to happen before we do anything else to them. + &generator::StateTransform, + &instcombine::InstCombine, + &const_prop::ConstProp, + &simplify_branches::SimplifyBranches::new("after-const-prop"), + &deaggregator::Deaggregator, + ©_prop::CopyPropagation, + &simplify_branches::SimplifyBranches::new("after-copy-prop"), + &remove_noop_landing_pads::RemoveNoopLandingPads, + &simplify::SimplifyCfg::new("after-remove-noop-landing-pads"), + &simplify_try::SimplifyArmIdentity, + &simplify_try::SimplifyBranchSame, + &simplify::SimplifyCfg::new("final"), + &simplify::SimplifyLocals, + &add_call_guards::CriticalCallEdges, + &dump_mir::Marker("PreCodegen"), + ], + ); } fn optimized_mir(tcx: TyCtxt<'_>, def_id: DefId) -> &BodyAndCache<'_> { diff --git a/src/librustc_mir/transform/no_landing_pads.rs b/src/librustc_mir/transform/no_landing_pads.rs index d4fe72f6ed..e17c733e8b 100644 --- a/src/librustc_mir/transform/no_landing_pads.rs +++ b/src/librustc_mir/transform/no_landing_pads.rs @@ -1,10 +1,10 @@ //! This pass removes the unwind branch of all the terminators when the no-landing-pads option is //! specified. -use rustc::ty::TyCtxt; -use rustc::mir::*; -use rustc::mir::visit::MutVisitor; use crate::transform::{MirPass, MirSource}; +use rustc::mir::visit::MutVisitor; +use rustc::mir::*; +use rustc::ty::TyCtxt; pub struct NoLandingPads<'tcx> { tcx: TyCtxt<'tcx>, @@ -33,9 +33,7 @@ impl<'tcx> MutVisitor<'tcx> for NoLandingPads<'tcx> { self.tcx } - fn visit_terminator_kind(&mut self, - kind: &mut TerminatorKind<'tcx>, - location: Location) { + fn visit_terminator_kind(&mut self, kind: &mut TerminatorKind<'tcx>, location: Location) { if let Some(unwind) = kind.unwind_mut() { unwind.take(); } diff --git a/src/librustc_mir/transform/promote_consts.rs b/src/librustc_mir/transform/promote_consts.rs index 4c72319910..f058ac834e 100644 --- a/src/librustc_mir/transform/promote_consts.rs +++ b/src/librustc_mir/transform/promote_consts.rs @@ -12,25 +12,26 @@ //! initialization and can otherwise silence errors, if //! move analysis runs after promotion on broken MIR. -use rustc::hir::def_id::DefId; -use rustc::mir::*; -use rustc::mir::visit::{PlaceContext, MutatingUseContext, MutVisitor, Visitor}; use rustc::mir::traversal::ReversePostorder; -use rustc::ty::{self, List, TyCtxt, TypeFoldable}; -use rustc::ty::subst::InternalSubsts; +use rustc::mir::visit::{MutVisitor, MutatingUseContext, PlaceContext, Visitor}; +use rustc::mir::*; use rustc::ty::cast::CastTy; +use rustc::ty::subst::InternalSubsts; +use rustc::ty::{self, List, TyCtxt, TypeFoldable}; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::sym; +use rustc_span::{Span, DUMMY_SP}; use syntax::ast::LitKind; -use syntax::symbol::sym; -use syntax_pos::{Span, DUMMY_SP}; -use rustc_index::vec::{IndexVec, Idx}; +use rustc_index::vec::{Idx, IndexVec}; use rustc_target::spec::abi::Abi; use std::cell::Cell; -use std::{iter, mem, usize}; +use std::{cmp, iter, mem, usize}; +use crate::const_eval::{is_const_fn, is_unstable_const_fn}; +use crate::transform::check_consts::{is_lang_panic_fn, qualifs, ConstKind, Item}; use crate::transform::{MirPass, MirSource}; -use crate::transform::check_consts::{qualifs, Item, ConstKind, is_lang_panic_fn}; /// A `MirPass` for promotion. /// @@ -38,7 +39,7 @@ use crate::transform::check_consts::{qualifs, Item, ConstKind, is_lang_panic_fn} /// errors when promotion of `#[rustc_args_required_const]` arguments fails. /// /// After this pass is run, `promoted_fragments` will hold the MIR body corresponding to each -/// newly created `StaticKind::Promoted`. +/// newly created `Constant`. #[derive(Default)] pub struct PromoteTemps<'tcx> { pub promoted_fragments: Cell>>, @@ -63,8 +64,8 @@ impl<'tcx> MirPass<'tcx> for PromoteTemps<'tcx> { let mut rpo = traversal::reverse_postorder(body); let (temps, all_candidates) = collect_temps_and_candidates(tcx, body, &mut rpo); - let promotable_candidates - = validate_candidates(tcx, read_only!(body), def_id, &temps, &all_candidates); + let promotable_candidates = + validate_candidates(tcx, read_only!(body), def_id, &temps, &all_candidates); let promoted = promote_candidates(def_id, body, tcx, temps, promotable_candidates); self.promoted_fragments.set(promoted); @@ -79,25 +80,18 @@ pub enum TempState { /// One direct assignment and any number of direct uses. /// A borrow of this temp is promotable if the assigned /// value is qualified as constant. - Defined { - location: Location, - uses: usize - }, + Defined { location: Location, uses: usize }, /// Any other combination of assignments/uses. Unpromotable, /// This temp was part of an rvalue which got extracted /// during promotion and needs cleanup. - PromotedOut + PromotedOut, } impl TempState { pub fn is_promotable(&self) -> bool { debug!("is_promotable: self={:?}", self); - if let TempState::Defined { .. } = *self { - true - } else { - false - } + if let TempState::Defined { .. } = *self { true } else { false } } } @@ -124,8 +118,7 @@ impl Candidate { /// Returns `true` if we should use the "explicit" rules for promotability for this `Candidate`. fn forces_explicit_promotion(&self) -> bool { match self { - Candidate::Ref(_) | - Candidate::Repeat(_) => false, + Candidate::Ref(_) | Candidate::Repeat(_) => false, Candidate::Argument { .. } => true, } } @@ -137,7 +130,9 @@ fn args_required_const(tcx: TyCtxt<'_>, def_id: DefId) -> Option> { let mut ret = vec![]; for meta in attr.meta_item_list()? { match meta.literal()?.kind { - LitKind::Int(a, _) => { ret.push(a as usize); } + LitKind::Int(a, _) => { + ret.push(a as usize); + } _ => return None, } } @@ -153,19 +148,12 @@ struct Collector<'a, 'tcx> { } impl<'tcx> Visitor<'tcx> for Collector<'_, 'tcx> { - fn visit_local(&mut self, - &index: &Local, - context: PlaceContext, - location: Location) { + fn visit_local(&mut self, &index: &Local, context: PlaceContext, location: Location) { debug!("visit_local: index={:?} context={:?} location={:?}", index, context, location); // We're only interested in temporaries and the return place match self.body.local_kind(index) { - | LocalKind::Temp - | LocalKind::ReturnPointer - => {}, - | LocalKind::Arg - | LocalKind::Var - => return, + LocalKind::Temp | LocalKind::ReturnPointer => {} + LocalKind::Arg | LocalKind::Var => return, } // Ignore drops, if the temp gets promoted, @@ -174,7 +162,8 @@ impl<'tcx> Visitor<'tcx> for Collector<'_, 'tcx> { if context.is_drop() || !context.is_use() { debug!( "visit_local: context.is_drop={:?} context.is_use={:?}", - context.is_drop(), context.is_use(), + context.is_drop(), + context.is_use(), ); return; } @@ -183,12 +172,9 @@ impl<'tcx> Visitor<'tcx> for Collector<'_, 'tcx> { debug!("visit_local: temp={:?}", temp); if *temp == TempState::Undefined { match context { - PlaceContext::MutatingUse(MutatingUseContext::Store) | - PlaceContext::MutatingUse(MutatingUseContext::Call) => { - *temp = TempState::Defined { - location, - uses: 0 - }; + PlaceContext::MutatingUse(MutatingUseContext::Store) + | PlaceContext::MutatingUse(MutatingUseContext::Call) => { + *temp = TempState::Defined { location, uses: 0 }; return; } _ => { /* mark as unpromotable below */ } @@ -196,7 +182,11 @@ impl<'tcx> Visitor<'tcx> for Collector<'_, 'tcx> { } else if let TempState::Defined { ref mut uses, .. } = *temp { // We always allow borrows, even mutable ones, as we need // to promote mutable borrows of some ZSTs e.g., `&mut []`. - let allowed_use = context.is_borrow() || context.is_nonmutating_use(); + let allowed_use = match context { + PlaceContext::MutatingUse(MutatingUseContext::Borrow) + | PlaceContext::NonMutatingUse(_) => true, + PlaceContext::MutatingUse(_) | PlaceContext::NonUse(_) => false, + }; debug!("visit_local: allowed_use={:?}", allowed_use); if allowed_use { *uses += 1; @@ -223,9 +213,7 @@ impl<'tcx> Visitor<'tcx> for Collector<'_, 'tcx> { } } - fn visit_terminator_kind(&mut self, - kind: &TerminatorKind<'tcx>, - location: Location) { + fn visit_terminator_kind(&mut self, kind: &TerminatorKind<'tcx>, location: Location) { self.super_terminator_kind(kind, location); if let TerminatorKind::Call { ref func, .. } = *kind { @@ -235,10 +223,7 @@ impl<'tcx> Visitor<'tcx> for Collector<'_, 'tcx> { let name = self.tcx.item_name(def_id); // FIXME(eddyb) use `#[rustc_args_required_const(2)]` for shuffles. if name.as_str().starts_with("simd_shuffle") { - self.candidates.push(Candidate::Argument { - bb: location.block, - index: 2, - }); + self.candidates.push(Candidate::Argument { bb: location.block, index: 2 }); return; // Don't double count `simd_shuffle` candidates } @@ -310,7 +295,7 @@ impl<'tcx> Validator<'_, 'tcx> { let statement = &self.body[loc.block].statements[loc.statement_index]; match &statement.kind { - StatementKind::Assign(box(_, Rvalue::Ref(_, kind, place))) => { + StatementKind::Assign(box (_, Rvalue::Ref(_, kind, place))) => { match kind { BorrowKind::Shared | BorrowKind::Mut { .. } => {} @@ -323,18 +308,14 @@ impl<'tcx> Validator<'_, 'tcx> { // We can only promote interior borrows of promotable temps (non-temps // don't get promoted anyway). - let base = match place.base { - PlaceBase::Local(local) => local, - _ => return Err(Unpromotable), - }; - self.validate_local(base)?; + self.validate_local(place.local)?; if place.projection.contains(&ProjectionElem::Deref) { return Err(Unpromotable); } let mut has_mut_interior = - self.qualif_local::(base); + self.qualif_local::(place.local); // HACK(eddyb) this should compute the same thing as // `::in_projection` from // `check_consts::qualifs` but without recursion. @@ -347,14 +328,10 @@ impl<'tcx> Validator<'_, 'tcx> { while let [proj_base @ .., elem] = place_projection { // FIXME(eddyb) this is probably excessive, with // the exception of `union` member accesses. - let ty = Place::ty_from( - &place.base, - proj_base, - *self.body, - self.tcx - ) - .projection_ty(self.tcx, elem) - .ty; + let ty = + Place::ty_from(&place.local, proj_base, *self.body, self.tcx) + .projection_ty(self.tcx, elem) + .ty; if ty.is_freeze(self.tcx, self.param_env, DUMMY_SP) { has_mut_interior = false; break; @@ -368,7 +345,7 @@ impl<'tcx> Validator<'_, 'tcx> { if has_mut_interior { return Err(Unpromotable); } - if self.qualif_local::(base) { + if self.qualif_local::(place.local) { return Err(Unpromotable); } @@ -388,7 +365,7 @@ impl<'tcx> Validator<'_, 'tcx> { // FIXME(eddyb) the `self.is_non_const_fn` condition // seems unnecessary, given that this is merely a ZST. match len.try_eval_usize(self.tcx, self.param_env) { - Some(0) if self.const_kind.is_none() => {}, + Some(0) if self.const_kind.is_none() => {} _ => return Err(Unpromotable), } } else { @@ -398,7 +375,7 @@ impl<'tcx> Validator<'_, 'tcx> { Ok(()) } - _ => bug!() + _ => bug!(), } } Candidate::Repeat(loc) => { @@ -406,25 +383,23 @@ impl<'tcx> Validator<'_, 'tcx> { let statement = &self.body[loc.block].statements[loc.statement_index]; match &statement.kind { - StatementKind::Assign(box(_, Rvalue::Repeat(ref operand, _))) => { + StatementKind::Assign(box (_, Rvalue::Repeat(ref operand, _))) => { if !self.tcx.features().const_in_array_repeat_expressions { return Err(Unpromotable); } self.validate_operand(operand) } - _ => bug!() + _ => bug!(), } - }, + } Candidate::Argument { bb, index } => { assert!(self.explicit); let terminator = self.body[bb].terminator(); match &terminator.kind { - TerminatorKind::Call { args, .. } => { - self.validate_operand(&args[index]) - } - _ => bug!() + TerminatorKind::Call { args, .. } => self.validate_operand(&args[index]), + _ => bug!(), } } } @@ -440,12 +415,13 @@ impl<'tcx> Validator<'_, 'tcx> { if loc.statement_index < num_stmts { let statement = &self.body[loc.block].statements[loc.statement_index]; match &statement.kind { - StatementKind::Assign(box(_, rhs)) => { - Q::in_rvalue(&self.item, per_local, rhs) - } + StatementKind::Assign(box (_, rhs)) => Q::in_rvalue(&self.item, per_local, rhs), _ => { - span_bug!(statement.source_info.span, "{:?} is not an assignment", - statement); + span_bug!( + statement.source_info.span, + "{:?} is not an assignment", + statement + ); } } } else { @@ -474,10 +450,13 @@ impl<'tcx> Validator<'_, 'tcx> { if loc.statement_index < num_stmts { let statement = &self.body[loc.block].statements[loc.statement_index]; match &statement.kind { - StatementKind::Assign(box(_, rhs)) => self.validate_rvalue(rhs), + StatementKind::Assign(box (_, rhs)) => self.validate_rvalue(rhs), _ => { - span_bug!(statement.source_info.span, "{:?} is not an assignment", - statement); + span_bug!( + statement.source_info.span, + "{:?} is not an assignment", + statement + ); } } } else { @@ -496,24 +475,14 @@ impl<'tcx> Validator<'_, 'tcx> { fn validate_place(&self, place: PlaceRef<'_, 'tcx>) -> Result<(), Unpromotable> { match place { - PlaceRef { - base: PlaceBase::Local(local), - projection: [], - } => self.validate_local(*local), - PlaceRef { - base: PlaceBase::Static(_), - projection: [], - } => bug!("qualifying already promoted MIR"), - PlaceRef { - base: _, - projection: [proj_base @ .., elem], - } => { + PlaceRef { local, projection: [] } => self.validate_local(*local), + PlaceRef { local: _, projection: [proj_base @ .., elem] } => { match *elem { - ProjectionElem::Deref | - ProjectionElem::Downcast(..) => return Err(Unpromotable), + ProjectionElem::Deref | ProjectionElem::Downcast(..) => { + return Err(Unpromotable); + } - ProjectionElem::ConstantIndex {..} | - ProjectionElem::Subslice {..} => {} + ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. } => {} ProjectionElem::Index(local) => { self.validate_local(local)?; @@ -522,7 +491,7 @@ impl<'tcx> Validator<'_, 'tcx> { ProjectionElem::Field(..) => { if self.const_kind.is_none() { let base_ty = - Place::ty_from(place.base, proj_base, *self.body, self.tcx).ty; + Place::ty_from(place.local, proj_base, *self.body, self.tcx).ty; if let Some(def) = base_ty.ty_adt_def() { // No promotion of union field accesses. if def.is_union() { @@ -533,18 +502,14 @@ impl<'tcx> Validator<'_, 'tcx> { } } - self.validate_place(PlaceRef { - base: place.base, - projection: proj_base, - }) + self.validate_place(PlaceRef { local: place.local, projection: proj_base }) } } } fn validate_operand(&self, operand: &Operand<'tcx>) -> Result<(), Unpromotable> { match operand { - Operand::Copy(place) | - Operand::Move(place) => self.validate_place(place.as_ref()), + Operand::Copy(place) | Operand::Move(place) => self.validate_place(place.as_ref()), // The qualifs for a constant (e.g. `HasMutInterior`) are checked in // `validate_rvalue` upon access. @@ -564,7 +529,7 @@ impl<'tcx> Validator<'_, 'tcx> { } Ok(()) - }, + } } } @@ -575,8 +540,7 @@ impl<'tcx> Validator<'_, 'tcx> { let cast_in = CastTy::from_ty(operand_ty).expect("bad input type for cast"); let cast_out = CastTy::from_ty(cast_ty).expect("bad output type for cast"); match (cast_in, cast_out) { - (CastTy::Ptr(_), CastTy::Int(_)) | - (CastTy::FnPtr, CastTy::Int(_)) => { + (CastTy::Ptr(_), CastTy::Int(_)) | (CastTy::FnPtr, CastTy::Int(_)) => { // in normal functions, mark such casts as not promotable return Err(Unpromotable); } @@ -586,10 +550,15 @@ impl<'tcx> Validator<'_, 'tcx> { Rvalue::BinaryOp(op, ref lhs, _) if self.const_kind.is_none() => { if let ty::RawPtr(_) | ty::FnPtr(..) = lhs.ty(*self.body, self.tcx).kind { - assert!(op == BinOp::Eq || op == BinOp::Ne || - op == BinOp::Le || op == BinOp::Lt || - op == BinOp::Ge || op == BinOp::Gt || - op == BinOp::Offset); + assert!( + op == BinOp::Eq + || op == BinOp::Ne + || op == BinOp::Le + || op == BinOp::Lt + || op == BinOp::Ge + || op == BinOp::Gt + || op == BinOp::Offset + ); // raw pointer operations are not allowed inside promoteds return Err(Unpromotable); @@ -604,20 +573,33 @@ impl<'tcx> Validator<'_, 'tcx> { match rvalue { Rvalue::NullaryOp(..) => Ok(()), - Rvalue::Discriminant(place) | - Rvalue::Len(place) => self.validate_place(place.as_ref()), + Rvalue::Discriminant(place) | Rvalue::Len(place) => self.validate_place(place.as_ref()), - Rvalue::Use(operand) | - Rvalue::Repeat(operand, _) | - Rvalue::UnaryOp(_, operand) | - Rvalue::Cast(_, operand, _) => self.validate_operand(operand), + Rvalue::Use(operand) + | Rvalue::Repeat(operand, _) + | Rvalue::UnaryOp(_, operand) + | Rvalue::Cast(_, operand, _) => self.validate_operand(operand), - Rvalue::BinaryOp(_, lhs, rhs) | - Rvalue::CheckedBinaryOp(_, lhs, rhs) => { + Rvalue::BinaryOp(_, lhs, rhs) | Rvalue::CheckedBinaryOp(_, lhs, rhs) => { self.validate_operand(lhs)?; self.validate_operand(rhs) } + Rvalue::AddressOf(_, place) => { + // Raw reborrows can come from reference to pointer coercions, + // so are allowed. + if let [proj_base @ .., ProjectionElem::Deref] = place.projection.as_ref() { + let base_ty = Place::ty_from(&place.local, proj_base, *self.body, self.tcx).ty; + if let ty::Ref(..) = base_ty.kind { + return self.validate_place(PlaceRef { + local: &place.local, + projection: proj_base, + }); + } + } + Err(Unpromotable) + } + Rvalue::Ref(_, kind, place) => { if let BorrowKind::Mut { .. } = kind { let ty = place.ty(*self.body, self.tcx).ty; @@ -635,7 +617,7 @@ impl<'tcx> Validator<'_, 'tcx> { // FIXME(eddyb): We only return `Unpromotable` for `&mut []` inside a // const context which seems unnecessary given that this is merely a ZST. match len.try_eval_usize(self.tcx, self.param_env) { - Some(0) if self.const_kind.is_none() => {}, + Some(0) if self.const_kind.is_none() => {} _ => return Err(Unpromotable), } } else { @@ -646,13 +628,9 @@ impl<'tcx> Validator<'_, 'tcx> { // Special-case reborrows to be more like a copy of the reference. let mut place = place.as_ref(); if let [proj_base @ .., ProjectionElem::Deref] = &place.projection { - let base_ty = - Place::ty_from(&place.base, proj_base, *self.body, self.tcx).ty; + let base_ty = Place::ty_from(&place.local, proj_base, *self.body, self.tcx).ty; if let ty::Ref(..) = base_ty.kind { - place = PlaceRef { - base: &place.base, - projection: proj_base, - }; + place = PlaceRef { local: &place.local, projection: proj_base }; } } @@ -661,19 +639,15 @@ impl<'tcx> Validator<'_, 'tcx> { // HACK(eddyb) this should compute the same thing as // `::in_projection` from // `check_consts::qualifs` but without recursion. - let mut has_mut_interior = match place.base { - PlaceBase::Local(local) => { - self.qualif_local::(*local) - } - PlaceBase::Static(_) => false, - }; + let mut has_mut_interior = + self.qualif_local::(*place.local); if has_mut_interior { let mut place_projection = place.projection; // FIXME(eddyb) use a forward loop instead of a reverse one. while let [proj_base @ .., elem] = place_projection { // FIXME(eddyb) this is probably excessive, with // the exception of `union` member accesses. - let ty = Place::ty_from(place.base, proj_base, *self.body, self.tcx) + let ty = Place::ty_from(place.local, proj_base, *self.body, self.tcx) .projection_ty(self.tcx, elem) .ty; if ty.is_freeze(self.tcx, self.param_env, DUMMY_SP) { @@ -720,9 +694,9 @@ impl<'tcx> Validator<'_, 'tcx> { let is_const_fn = match fn_ty.kind { ty::FnDef(def_id, _) => { - self.tcx.is_const_fn(def_id) || - self.tcx.is_unstable_const_fn(def_id).is_some() || - is_lang_panic_fn(self.tcx, self.def_id) + is_const_fn(self.tcx, def_id) + || is_unstable_const_fn(self.tcx, def_id).is_some() + || is_lang_panic_fn(self.tcx, self.def_id) } _ => false, }; @@ -747,30 +721,30 @@ pub fn validate_candidates( temps: &IndexVec, candidates: &[Candidate], ) -> Vec { - let mut validator = Validator { - item: Item::new(tcx, def_id, body), - temps, - explicit: false, - }; + let mut validator = Validator { item: Item::new(tcx, def_id, body), temps, explicit: false }; - candidates.iter().copied().filter(|&candidate| { - validator.explicit = candidate.forces_explicit_promotion(); + candidates + .iter() + .copied() + .filter(|&candidate| { + validator.explicit = candidate.forces_explicit_promotion(); - // FIXME(eddyb) also emit the errors for shuffle indices - // and `#[rustc_args_required_const]` arguments here. + // FIXME(eddyb) also emit the errors for shuffle indices + // and `#[rustc_args_required_const]` arguments here. - let is_promotable = validator.validate_candidate(candidate).is_ok(); - match candidate { - Candidate::Argument { bb, index } if !is_promotable => { - let span = body[bb].terminator().source_info.span; - let msg = format!("argument {} is required to be a constant", index + 1); - tcx.sess.span_err(span, &msg); + let is_promotable = validator.validate_candidate(candidate).is_ok(); + match candidate { + Candidate::Argument { bb, index } if !is_promotable => { + let span = body[bb].terminator().source_info.span; + let msg = format!("argument {} is required to be a constant", index + 1); + tcx.sess.span_err(span, &msg); + } + _ => (), } - _ => () - } - is_promotable - }).collect() + is_promotable + }) + .collect() } struct Promoter<'a, 'tcx> { @@ -778,6 +752,7 @@ struct Promoter<'a, 'tcx> { source: &'a mut BodyAndCache<'tcx>, promoted: BodyAndCache<'tcx>, temps: &'a mut IndexVec, + extra_statements: &'a mut Vec<(Location, Statement<'tcx>)>, /// If true, all nested temps are also kept in the /// source MIR, not moved to the promoted MIR. @@ -790,13 +765,10 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { self.promoted.basic_blocks_mut().push(BasicBlockData { statements: vec![], terminator: Some(Terminator { - source_info: SourceInfo { - span, - scope: OUTERMOST_SOURCE_SCOPE - }, - kind: TerminatorKind::Return + source_info: SourceInfo { span, scope: OUTERMOST_SOURCE_SCOPE }, + kind: TerminatorKind::Return, }), - is_cleanup: false + is_cleanup: false, }) } @@ -804,11 +776,8 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { let last = self.promoted.basic_blocks().last().unwrap(); let data = &mut self.promoted[last]; data.statements.push(Statement { - source_info: SourceInfo { - span, - scope: OUTERMOST_SOURCE_SCOPE - }, - kind: StatementKind::Assign(box(Place::from(dest), rvalue)) + source_info: SourceInfo { span, scope: OUTERMOST_SOURCE_SCOPE }, + kind: StatementKind::Assign(box (Place::from(dest), rvalue)), }); } @@ -827,9 +796,8 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { } location } - state => { - span_bug!(self.promoted.span, "{:?} not promotable: {:?}", - temp, state); + state => { + span_bug!(self.promoted.span, "{:?} not promotable: {:?}", temp, state); } }; if !self.keep_original { @@ -837,12 +805,12 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { } let num_stmts = self.source[loc.block].statements.len(); - let new_temp = self.promoted.local_decls.push( - LocalDecl::new_temp(self.source.local_decls[temp].ty, - self.source.local_decls[temp].source_info.span)); + let new_temp = self.promoted.local_decls.push(LocalDecl::new_temp( + self.source.local_decls[temp].ty, + self.source.local_decls[temp].source_info.span, + )); - debug!("promote({:?} @ {:?}/{:?}, {:?})", - temp, loc, num_stmts, self.keep_original); + debug!("promote({:?} @ {:?}/{:?}, {:?})", temp, loc, num_stmts, self.keep_original); // First, take the Rvalue or Call out of the source MIR, // or duplicate it, depending on keep_original. @@ -850,19 +818,25 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { let (mut rvalue, source_info) = { let statement = &mut self.source[loc.block].statements[loc.statement_index]; let rhs = match statement.kind { - StatementKind::Assign(box(_, ref mut rhs)) => rhs, + StatementKind::Assign(box (_, ref mut rhs)) => rhs, _ => { - span_bug!(statement.source_info.span, "{:?} is not an assignment", - statement); + span_bug!( + statement.source_info.span, + "{:?} is not an assignment", + statement + ); } }; - (if self.keep_original { - rhs.clone() - } else { - let unit = Rvalue::Aggregate(box AggregateKind::Tuple, vec![]); - mem::replace(rhs, unit) - }, statement.source_info) + ( + if self.keep_original { + rhs.clone() + } else { + let unit = Rvalue::Aggregate(box AggregateKind::Tuple, vec![]); + mem::replace(rhs, unit) + }, + statement.source_info, + ) }; self.visit_rvalue(&mut rvalue, loc); @@ -880,9 +854,7 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { }; Terminator { source_info: terminator.source_info, - kind: mem::replace(&mut terminator.kind, TerminatorKind::Goto { - target, - }) + kind: mem::replace(&mut terminator.kind, TerminatorKind::Goto { target }), } }; @@ -901,9 +873,7 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { func, args, cleanup: None, - destination: Some( - (Place::from(new_temp), new_target) - ), + destination: Some((Place::from(new_temp), new_target)), from_hir_call, }, ..terminator @@ -925,69 +895,100 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { candidate: Candidate, next_promoted_id: usize, ) -> Option> { - let mut operand = { + let mut rvalue = { let promoted = &mut self.promoted; let promoted_id = Promoted::new(next_promoted_id); let tcx = self.tcx; - let mut promoted_place = |ty, span| { + let mut promoted_operand = |ty, span| { promoted.span = span; promoted.local_decls[RETURN_PLACE] = LocalDecl::new_return_place(ty, span); - Place { - base: PlaceBase::Static(box Static { - kind: - StaticKind::Promoted( - promoted_id, - InternalSubsts::identity_for_item(tcx, def_id), - ), + + Operand::Constant(Box::new(Constant { + span, + user_ty: None, + literal: tcx.mk_const(ty::Const { ty, - def_id, + val: ty::ConstKind::Unevaluated( + def_id, + InternalSubsts::identity_for_item(tcx, def_id), + Some(promoted_id), + ), }), - projection: List::empty(), - } + })) }; let (blocks, local_decls) = self.source.basic_blocks_and_local_decls_mut(); match candidate { Candidate::Ref(loc) => { let ref mut statement = blocks[loc.block].statements[loc.statement_index]; match statement.kind { - StatementKind::Assign(box(_, Rvalue::Ref(_, _, ref mut place))) => { + StatementKind::Assign(box ( + _, + Rvalue::Ref(ref mut region, borrow_kind, ref mut place), + )) => { // Use the underlying local for this (necessarily interior) borrow. - let ty = place.base.ty(local_decls).ty; + let ty = local_decls.local_decls()[place.local].ty; let span = statement.source_info.span; - Operand::Move(Place { - base: mem::replace( - &mut place.base, - promoted_place(ty, span).base, - ), - projection: List::empty(), - }) + let ref_ty = tcx.mk_ref( + tcx.lifetimes.re_erased, + ty::TypeAndMut { ty, mutbl: borrow_kind.to_mutbl_lossy() }, + ); + + *region = tcx.lifetimes.re_erased; + + let mut projection = vec![PlaceElem::Deref]; + projection.extend(place.projection); + place.projection = tcx.intern_place_elems(&projection); + + // Create a temp to hold the promoted reference. + // This is because `*r` requires `r` to be a local, + // otherwise we would use the `promoted` directly. + let mut promoted_ref = LocalDecl::new_temp(ref_ty, span); + promoted_ref.source_info = statement.source_info; + let promoted_ref = local_decls.push(promoted_ref); + assert_eq!(self.temps.push(TempState::Unpromotable), promoted_ref); + + let promoted_ref_statement = Statement { + source_info: statement.source_info, + kind: StatementKind::Assign(Box::new(( + Place::from(promoted_ref), + Rvalue::Use(promoted_operand(ref_ty, span)), + ))), + }; + self.extra_statements.push((loc, promoted_ref_statement)); + + Rvalue::Ref( + tcx.lifetimes.re_erased, + borrow_kind, + Place { + local: mem::replace(&mut place.local, promoted_ref), + projection: List::empty(), + }, + ) } - _ => bug!() + _ => bug!(), } } Candidate::Repeat(loc) => { let ref mut statement = blocks[loc.block].statements[loc.statement_index]; match statement.kind { - StatementKind::Assign(box(_, Rvalue::Repeat(ref mut operand, _))) => { + StatementKind::Assign(box (_, Rvalue::Repeat(ref mut operand, _))) => { let ty = operand.ty(local_decls, self.tcx); let span = statement.source_info.span; - mem::replace( - operand, - Operand::Copy(promoted_place(ty, span)) - ) + + Rvalue::Use(mem::replace(operand, promoted_operand(ty, span))) } - _ => bug!() + _ => bug!(), } - }, + } Candidate::Argument { bb, index } => { let terminator = blocks[bb].terminator_mut(); match terminator.kind { TerminatorKind::Call { ref mut args, .. } => { let ty = args[index].ty(local_decls, self.tcx); let span = terminator.source_info.span; - let operand = Operand::Copy(promoted_place(ty, span)); - mem::replace(&mut args[index], operand) + + Rvalue::Use(mem::replace(&mut args[index], promoted_operand(ty, span))) } // We expected a `TerminatorKind::Call` for which we'd like to promote an // argument. `qualify_consts` saw a `TerminatorKind::Call` here, but @@ -997,20 +998,20 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { // providing a value whose computation contains another call to a function // requiring a constant argument. TerminatorKind::Goto { .. } => return None, - _ => bug!() + _ => bug!(), } } } }; assert_eq!(self.new_block(), START_BLOCK); - self.visit_operand(&mut operand, Location { - block: BasicBlock::new(0), - statement_index: usize::MAX - }); + self.visit_rvalue( + &mut rvalue, + Location { block: BasicBlock::new(0), statement_index: usize::MAX }, + ); let span = self.promoted.span; - self.assign(RETURN_PLACE, Rvalue::Use(operand), span); + self.assign(RETURN_PLACE, rvalue, span); Some(self.promoted) } } @@ -1021,19 +1022,13 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Promoter<'a, 'tcx> { self.tcx } - fn visit_local(&mut self, - local: &mut Local, - _: PlaceContext, - _: Location) { + fn visit_local(&mut self, local: &mut Local, _: PlaceContext, _: Location) { if self.is_temp_kind(*local) { *local = self.promote_temp(*local); } } - fn process_projection_elem( - &mut self, - elem: &PlaceElem<'tcx>, - ) -> Option> { + fn process_projection_elem(&mut self, elem: &PlaceElem<'tcx>) -> Option> { match elem { PlaceElem::Index(local) if self.is_temp_kind(*local) => { Some(PlaceElem::Index(self.promote_temp(*local))) @@ -1055,12 +1050,13 @@ pub fn promote_candidates<'tcx>( let mut promotions = IndexVec::new(); + let mut extra_statements = vec![]; for candidate in candidates.into_iter().rev() { match candidate { - Candidate::Repeat(Location { block, statement_index }) | - Candidate::Ref(Location { block, statement_index }) => { + Candidate::Repeat(Location { block, statement_index }) + | Candidate::Ref(Location { block, statement_index }) => { match &body[block].statements[statement_index].kind { - StatementKind::Assign(box(place, _)) => { + StatementKind::Assign(box (place, _)) => { if let Some(local) = place.as_local() { if temps[local] == TempState::PromotedOut { // Already promoted. @@ -1074,30 +1070,32 @@ pub fn promote_candidates<'tcx>( Candidate::Argument { .. } => {} } - // Declare return place local so that `mir::Body::new` doesn't complain. - let initial_locals = iter::once( - LocalDecl::new_return_place(tcx.types.never, body.span) - ).collect(); + let initial_locals = + iter::once(LocalDecl::new_return_place(tcx.types.never, body.span)).collect(); + + let mut promoted = Body::new( + IndexVec::new(), + // FIXME: maybe try to filter this to avoid blowing up + // memory usage? + body.source_scopes.clone(), + initial_locals, + IndexVec::new(), + 0, + vec![], + body.span, + vec![], + body.generator_kind, + ); + promoted.ignore_interior_mut_in_const_validation = true; let promoter = Promoter { - promoted: BodyAndCache::new(Body::new( - IndexVec::new(), - // FIXME: maybe try to filter this to avoid blowing up - // memory usage? - body.source_scopes.clone(), - initial_locals, - IndexVec::new(), - 0, - vec![], - body.span, - vec![], - body.generator_kind, - )), + promoted: BodyAndCache::new(promoted), tcx, source: body, temps: &mut temps, - keep_original: false + extra_statements: &mut extra_statements, + keep_original: false, }; //FIXME(oli-obk): having a `maybe_push()` method on `IndexVec` might be nice @@ -1106,33 +1104,35 @@ pub fn promote_candidates<'tcx>( } } + // Insert each of `extra_statements` before its indicated location, which + // has to be done in reverse location order, to not invalidate the rest. + extra_statements.sort_by_key(|&(loc, _)| cmp::Reverse(loc)); + for (loc, statement) in extra_statements { + body[loc.block].statements.insert(loc.statement_index, statement); + } + // Eliminate assignments to, and drops of promoted temps. let promoted = |index: Local| temps[index] == TempState::PromotedOut; for block in body.basic_blocks_mut() { - block.statements.retain(|statement| { - match &statement.kind { - StatementKind::Assign(box(place, _)) => { - if let Some(index) = place.as_local() { - !promoted(index) - } else { - true - } - } - StatementKind::StorageLive(index) | - StatementKind::StorageDead(index) => { - !promoted(*index) + block.statements.retain(|statement| match &statement.kind { + StatementKind::Assign(box (place, _)) => { + if let Some(index) = place.as_local() { + !promoted(index) + } else { + true } - _ => true } + StatementKind::StorageLive(index) | StatementKind::StorageDead(index) => { + !promoted(*index) + } + _ => true, }); let terminator = block.terminator_mut(); match &terminator.kind { TerminatorKind::Drop { location: place, target, .. } => { if let Some(index) = place.as_local() { if promoted(index) { - terminator.kind = TerminatorKind::Goto { - target: *target, - }; + terminator.kind = TerminatorKind::Goto { target: *target }; } } } @@ -1155,15 +1155,15 @@ crate fn should_suggest_const_in_array_repeat_expressions_attribute<'tcx>( ) -> bool { let mut rpo = traversal::reverse_postorder(&body); let (temps, _) = collect_temps_and_candidates(tcx, &body, &mut rpo); - let validator = Validator { - item: Item::new(tcx, mir_def_id, body), - temps: &temps, - explicit: false, - }; + let validator = + Validator { item: Item::new(tcx, mir_def_id, body), temps: &temps, explicit: false }; let should_promote = validator.validate_operand(operand).is_ok(); let feature_flag = tcx.features().const_in_array_repeat_expressions; - debug!("should_suggest_const_in_array_repeat_expressions_flag: mir_def_id={:?} \ - should_promote={:?} feature_flag={:?}", mir_def_id, should_promote, feature_flag); + debug!( + "should_suggest_const_in_array_repeat_expressions_flag: mir_def_id={:?} \ + should_promote={:?} feature_flag={:?}", + mir_def_id, should_promote, feature_flag + ); should_promote && !feature_flag } diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index e253079574..b047e534e4 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -1,11 +1,11 @@ -use rustc::hir::def_id::DefId; -use rustc::hir; use rustc::mir::*; -use rustc::ty::{self, Predicate, Ty, TyCtxt, adjustment::{PointerCast}}; +use rustc::ty::{self, adjustment::PointerCast, Predicate, Ty, TyCtxt}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; use std::borrow::Cow; -use syntax_pos::Span; -use syntax::symbol::{sym, Symbol}; -use syntax::attr; +use syntax::{ast, attr}; type McfResult = Result<(), (Span, Cow<'static, str>)>; @@ -15,24 +15,31 @@ pub fn is_min_const_fn(tcx: TyCtxt<'tcx>, def_id: DefId, body: &'a Body<'tcx>) - let predicates = tcx.predicates_of(current); for (predicate, _) in predicates.predicates { match predicate { - | Predicate::RegionOutlives(_) + Predicate::RegionOutlives(_) | Predicate::TypeOutlives(_) | Predicate::WellFormed(_) | Predicate::Projection(_) | Predicate::ConstEvaluatable(..) => continue, - | Predicate::ObjectSafe(_) => { + Predicate::ObjectSafe(_) => { bug!("object safe predicate on function: {:#?}", predicate) } Predicate::ClosureKind(..) => { bug!("closure kind predicate on function: {:#?}", predicate) } Predicate::Subtype(_) => bug!("subtype predicate on function: {:#?}", predicate), - Predicate::Trait(pred) => { + Predicate::Trait(pred, constness) => { if Some(pred.def_id()) == tcx.lang_items().sized_trait() { continue; } match pred.skip_binder().self_ty().kind { ty::Param(ref p) => { + // Allow `T: ?const Trait` + if *constness == ast::Constness::NotConst + && feature_allowed(tcx, def_id, sym::const_trait_bound_opt_out) + { + continue; + } + let generics = tcx.generics_of(current); let def = generics.type_param(p, tcx); let span = tcx.def_span(def.def_id); @@ -79,31 +86,28 @@ pub fn is_min_const_fn(tcx: TyCtxt<'tcx>, def_id: DefId, body: &'a Body<'tcx>) - fn check_ty(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, span: Span, fn_def_id: DefId) -> McfResult { for ty in ty.walk() { match ty.kind { - ty::Ref(_, _, hir::Mutability::Mutable) => { + ty::Ref(_, _, hir::Mutability::Mut) => { if !feature_allowed(tcx, fn_def_id, sym::const_mut_refs) { - return Err(( - span, - "mutable references in const fn are unstable".into(), - )) + return Err((span, "mutable references in const fn are unstable".into())); } } ty::Opaque(..) => return Err((span, "`impl Trait` in const fn is unstable".into())), ty::FnPtr(..) => { if !tcx.const_fn_is_allowed_fn_ptr(fn_def_id) { - return Err((span, "function pointers in const fn are unstable".into())) + return Err((span, "function pointers in const fn are unstable".into())); } } ty::Dynamic(preds, _) => { for pred in preds.iter() { match pred.skip_binder() { - | ty::ExistentialPredicate::AutoTrait(_) + ty::ExistentialPredicate::AutoTrait(_) | ty::ExistentialPredicate::Projection(_) => { return Err(( span, "trait bounds other than `Sized` \ on const fn parameters are unstable" .into(), - )) + )); } ty::ExistentialPredicate::Trait(trait_ref) => { if Some(trait_ref.def_id) != tcx.lang_items().sized_trait() { @@ -135,21 +139,18 @@ fn check_rvalue( Rvalue::Repeat(operand, _) | Rvalue::Use(operand) => { check_operand(tcx, operand, span, def_id, body) } - Rvalue::Len(place) | Rvalue::Discriminant(place) | Rvalue::Ref(_, _, place) => { - check_place(tcx, place, span, def_id, body) - } + Rvalue::Len(place) + | Rvalue::Discriminant(place) + | Rvalue::Ref(_, _, place) + | Rvalue::AddressOf(_, place) => check_place(tcx, place, span, def_id, body), Rvalue::Cast(CastKind::Misc, operand, cast_ty) => { use rustc::ty::cast::CastTy; let cast_in = CastTy::from_ty(operand.ty(body, tcx)).expect("bad input type for cast"); let cast_out = CastTy::from_ty(cast_ty).expect("bad output type for cast"); match (cast_in, cast_out) { - (CastTy::Ptr(_), CastTy::Int(_)) | (CastTy::FnPtr, CastTy::Int(_)) => Err(( - span, - "casting pointers to ints is unstable in const fn".into(), - )), - (CastTy::RPtr(_), CastTy::Float) => bug!(), - (CastTy::RPtr(_), CastTy::Int(_)) => bug!(), - (CastTy::Ptr(_), CastTy::RPtr(_)) => bug!(), + (CastTy::Ptr(_), CastTy::Int(_)) | (CastTy::FnPtr, CastTy::Int(_)) => { + Err((span, "casting pointers to ints is unstable in const fn".into())) + } _ => check_operand(tcx, operand, span, def_id, body), } } @@ -157,16 +158,14 @@ fn check_rvalue( | Rvalue::Cast(CastKind::Pointer(PointerCast::ArrayToPointer), operand, _) => { check_operand(tcx, operand, span, def_id, body) } - Rvalue::Cast(CastKind::Pointer(PointerCast::UnsafeFnPointer), _, _) | - Rvalue::Cast(CastKind::Pointer(PointerCast::ClosureFnPointer(_)), _, _) | - Rvalue::Cast(CastKind::Pointer(PointerCast::ReifyFnPointer), _, _) => Err(( - span, - "function pointer casts are not allowed in const fn".into(), - )), - Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), _, _) => Err(( - span, - "unsizing casts are not allowed in const fn".into(), - )), + Rvalue::Cast(CastKind::Pointer(PointerCast::UnsafeFnPointer), _, _) + | Rvalue::Cast(CastKind::Pointer(PointerCast::ClosureFnPointer(_)), _, _) + | Rvalue::Cast(CastKind::Pointer(PointerCast::ReifyFnPointer), _, _) => { + Err((span, "function pointer casts are not allowed in const fn".into())) + } + Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), _, _) => { + Err((span, "unsizing casts are not allowed in const fn".into())) + } // binops are fine on integers Rvalue::BinaryOp(_, lhs, rhs) | Rvalue::CheckedBinaryOp(_, lhs, rhs) => { check_operand(tcx, lhs, span, def_id, body)?; @@ -175,26 +174,19 @@ fn check_rvalue( if ty.is_integral() || ty.is_bool() || ty.is_char() { Ok(()) } else { - Err(( - span, - "only int, `bool` and `char` operations are stable in const fn".into(), - )) + Err((span, "only int, `bool` and `char` operations are stable in const fn".into())) } } Rvalue::NullaryOp(NullOp::SizeOf, _) => Ok(()), - Rvalue::NullaryOp(NullOp::Box, _) => Err(( - span, - "heap allocations are not allowed in const fn".into(), - )), + Rvalue::NullaryOp(NullOp::Box, _) => { + Err((span, "heap allocations are not allowed in const fn".into())) + } Rvalue::UnaryOp(_, operand) => { let ty = operand.ty(body, tcx); if ty.is_integral() || ty.is_bool() { check_operand(tcx, operand, span, def_id, body) } else { - Err(( - span, - "only int and `bool` operations are stable in const fn".into(), - )) + Err((span, "only int and `bool` operations are stable in const fn".into())) } } Rvalue::Aggregate(_, operands) => { @@ -214,14 +206,14 @@ fn check_statement( ) -> McfResult { let span = statement.source_info.span; match &statement.kind { - StatementKind::Assign(box(place, rval)) => { + StatementKind::Assign(box (place, rval)) => { check_place(tcx, place, span, def_id, body)?; check_rvalue(tcx, body, def_id, rval, span) } - | StatementKind::FakeRead(FakeReadCause::ForMatchedPlace, _) - if !feature_allowed(tcx, def_id, sym::const_if_match) - => { + StatementKind::FakeRead(FakeReadCause::ForMatchedPlace, _) + if !feature_allowed(tcx, def_id, sym::const_if_match) => + { Err((span, "loops and conditional expressions are not stable in const fn".into())) } @@ -230,12 +222,12 @@ fn check_statement( // just an assignment StatementKind::SetDiscriminant { place, .. } => check_place(tcx, place, span, def_id, body), - | StatementKind::InlineAsm { .. } => { + StatementKind::InlineAsm { .. } => { Err((span, "cannot use inline assembly in const fn".into())) } // These are all NOPs - | StatementKind::StorageLive(_) + StatementKind::StorageLive(_) | StatementKind::StorageDead(_) | StatementKind::Retag { .. } | StatementKind::AscribeUserType(..) @@ -248,12 +240,10 @@ fn check_operand( operand: &Operand<'tcx>, span: Span, def_id: DefId, - body: &Body<'tcx> + body: &Body<'tcx>, ) -> McfResult { match operand { - Operand::Move(place) | Operand::Copy(place) => { - check_place(tcx, place, span, def_id, body) - } + Operand::Move(place) | Operand::Copy(place) => check_place(tcx, place, span, def_id, body), Operand::Constant(c) => match c.check_static_ptr(tcx) { Some(_) => Err((span, "cannot access `static` items in const fn".into())), None => Ok(()), @@ -266,18 +256,19 @@ fn check_place( place: &Place<'tcx>, span: Span, def_id: DefId, - body: &Body<'tcx> + body: &Body<'tcx>, ) -> McfResult { let mut cursor = place.projection.as_ref(); while let &[ref proj_base @ .., elem] = cursor { cursor = proj_base; match elem { - ProjectionElem::Downcast(..) if !feature_allowed(tcx, def_id, sym::const_if_match) - => return Err((span, "`match` or `if let` in `const fn` is unstable".into())), + ProjectionElem::Downcast(..) if !feature_allowed(tcx, def_id, sym::const_if_match) => { + return Err((span, "`match` or `if let` in `const fn` is unstable".into())); + } ProjectionElem::Downcast(_symbol, _variant_index) => {} ProjectionElem::Field(..) => { - let base_ty = Place::ty_from(&place.base, &proj_base, body, tcx).ty; + let base_ty = Place::ty_from(&place.local, &proj_base, body, tcx).ty; if let Some(def) = base_ty.ty_adt_def() { // No union field accesses in `const fn` if def.is_union() { @@ -297,12 +288,22 @@ fn check_place( Ok(()) } -/// Returns whether `allow_internal_unstable(..., , ...)` is present. -fn feature_allowed( - tcx: TyCtxt<'tcx>, - def_id: DefId, - feature_gate: Symbol, -) -> bool { +/// Returns `true` if the given feature gate is allowed within the function with the given `DefId`. +fn feature_allowed(tcx: TyCtxt<'tcx>, def_id: DefId, feature_gate: Symbol) -> bool { + // All features require that the corresponding gate be enabled, + // even if the function has `#[allow_internal_unstable(the_gate)]`. + if !tcx.features().enabled(feature_gate) { + return false; + } + + // If this crate is not using stability attributes, or this function is not claiming to be a + // stable `const fn`, that is all that is required. + if !tcx.features().staged_api || tcx.has_attr(def_id, sym::rustc_const_unstable) { + return true; + } + + // However, we cannot allow stable `const fn`s to use unstable features without an explicit + // opt-in via `allow_internal_unstable`. attr::allow_internal_unstable(&tcx.get_attrs(def_id), &tcx.sess.diagnostic()) .map_or(false, |mut features| features.any(|name| name == feature_gate)) } @@ -315,27 +316,22 @@ fn check_terminator( ) -> McfResult { let span = terminator.source_info.span; match &terminator.kind { + TerminatorKind::FalseEdges { .. } + | TerminatorKind::FalseUnwind { .. } | TerminatorKind::Goto { .. } | TerminatorKind::Return | TerminatorKind::Resume => Ok(()), - TerminatorKind::Drop { location, .. } => { - check_place(tcx, location, span, def_id, body) - } + TerminatorKind::Drop { location, .. } => check_place(tcx, location, span, def_id, body), TerminatorKind::DropAndReplace { location, value, .. } => { check_place(tcx, location, span, def_id, body)?; check_operand(tcx, value, span, def_id, body) - }, + } - | TerminatorKind::FalseEdges { .. } - | TerminatorKind::SwitchInt { .. } - if !feature_allowed(tcx, def_id, sym::const_if_match) - => Err(( - span, - "loops and conditional expressions are not stable in const fn".into(), - )), + TerminatorKind::SwitchInt { .. } if !feature_allowed(tcx, def_id, sym::const_if_match) => { + Err((span, "loops and conditional expressions are not stable in const fn".into())) + } - TerminatorKind::FalseEdges { .. } => Ok(()), TerminatorKind::SwitchInt { discr, switch_ty: _, values: _, targets: _ } => { check_operand(tcx, discr, span, def_id, body) } @@ -343,23 +339,17 @@ fn check_terminator( // FIXME(ecstaticmorse): We probably want to allow `Unreachable` unconditionally. TerminatorKind::Unreachable if feature_allowed(tcx, def_id, sym::const_if_match) => Ok(()), - | TerminatorKind::Abort | TerminatorKind::Unreachable => { + TerminatorKind::Abort | TerminatorKind::Unreachable => { Err((span, "const fn with unreachable code is not stable".into())) } - | TerminatorKind::GeneratorDrop | TerminatorKind::Yield { .. } => { + TerminatorKind::GeneratorDrop | TerminatorKind::Yield { .. } => { Err((span, "const fn generators are unstable".into())) } - TerminatorKind::Call { - func, - args, - from_hir_call: _, - destination: _, - cleanup: _, - } => { + TerminatorKind::Call { func, args, from_hir_call: _, destination: _, cleanup: _ } => { let fn_ty = func.ty(body, tcx); if let ty::FnDef(def_id, _) = fn_ty.kind { - if !tcx.is_min_const_fn(def_id) { + if !crate::const_eval::is_min_const_fn(tcx, def_id) { return Err(( span, format!( @@ -382,20 +372,8 @@ fn check_terminator( } } - TerminatorKind::Assert { - cond, - expected: _, - msg: _, - target: _, - cleanup: _, - } => check_operand(tcx, cond, span, def_id, body), - - | TerminatorKind::FalseUnwind { .. } - if feature_allowed(tcx, def_id, sym::const_loop) - => Ok(()), - - TerminatorKind::FalseUnwind { .. } => { - Err((span, "loops are not allowed in const fn".into())) + TerminatorKind::Assert { cond, expected: _, msg: _, target: _, cleanup: _ } => { + check_operand(tcx, cond, span, def_id, body) } } } diff --git a/src/librustc_mir/transform/remove_noop_landing_pads.rs b/src/librustc_mir/transform/remove_noop_landing_pads.rs index 5799d0c38b..7ac9eccf46 100644 --- a/src/librustc_mir/transform/remove_noop_landing_pads.rs +++ b/src/librustc_mir/transform/remove_noop_landing_pads.rs @@ -1,8 +1,8 @@ -use rustc::ty::TyCtxt; -use rustc::mir::*; -use rustc_index::bit_set::BitSet; use crate::transform::{MirPass, MirSource}; use crate::util::patch::MirPatch; +use rustc::mir::*; +use rustc::ty::TyCtxt; +use rustc_index::bit_set::BitSet; /// A pass that removes noop landing pads and replaces jumps to them with /// `None`. This is important because otherwise LLVM generates terrible @@ -11,7 +11,7 @@ pub struct RemoveNoopLandingPads; pub fn remove_noop_landing_pads<'tcx>(tcx: TyCtxt<'tcx>, body: &mut BodyAndCache<'tcx>) { if tcx.sess.no_landing_pads() { - return + return; } debug!("remove_noop_landing_pads({:?})", body); @@ -33,15 +33,15 @@ impl RemoveNoopLandingPads { ) -> bool { for stmt in &body[bb].statements { match &stmt.kind { - StatementKind::FakeRead(..) | - StatementKind::StorageLive(_) | - StatementKind::StorageDead(_) | - StatementKind::AscribeUserType(..) | - StatementKind::Nop => { + StatementKind::FakeRead(..) + | StatementKind::StorageLive(_) + | StatementKind::StorageDead(_) + | StatementKind::AscribeUserType(..) + | StatementKind::Nop => { // These are all nops in a landing pad } - StatementKind::Assign(box(place, Rvalue::Use(_))) => { + StatementKind::Assign(box (place, Rvalue::Use(_))) => { if place.as_local().is_some() { // Writing to a local (e.g., a drop flag) does not // turn a landing pad to a non-nop @@ -50,10 +50,10 @@ impl RemoveNoopLandingPads { } } - StatementKind::Assign { .. } | - StatementKind::SetDiscriminant { .. } | - StatementKind::InlineAsm { .. } | - StatementKind::Retag { .. } => { + StatementKind::Assign { .. } + | StatementKind::SetDiscriminant { .. } + | StatementKind::InlineAsm { .. } + | StatementKind::Retag { .. } => { return false; } } @@ -61,26 +61,22 @@ impl RemoveNoopLandingPads { let terminator = body[bb].terminator(); match terminator.kind { - TerminatorKind::Goto { .. } | - TerminatorKind::Resume | - TerminatorKind::SwitchInt { .. } | - TerminatorKind::FalseEdges { .. } | - TerminatorKind::FalseUnwind { .. } => { - terminator.successors().all(|&succ| { - nop_landing_pads.contains(succ) - }) - }, - TerminatorKind::GeneratorDrop | - TerminatorKind::Yield { .. } | - TerminatorKind::Return | - TerminatorKind::Abort | - TerminatorKind::Unreachable | - TerminatorKind::Call { .. } | - TerminatorKind::Assert { .. } | - TerminatorKind::DropAndReplace { .. } | - TerminatorKind::Drop { .. } => { - false + TerminatorKind::Goto { .. } + | TerminatorKind::Resume + | TerminatorKind::SwitchInt { .. } + | TerminatorKind::FalseEdges { .. } + | TerminatorKind::FalseUnwind { .. } => { + terminator.successors().all(|&succ| nop_landing_pads.contains(succ)) } + TerminatorKind::GeneratorDrop + | TerminatorKind::Yield { .. } + | TerminatorKind::Return + | TerminatorKind::Abort + | TerminatorKind::Unreachable + | TerminatorKind::Call { .. } + | TerminatorKind::Assert { .. } + | TerminatorKind::DropAndReplace { .. } + | TerminatorKind::Drop { .. } => false, } } diff --git a/src/librustc_mir/transform/rustc_peek.rs b/src/librustc_mir/transform/rustc_peek.rs index 4345fc66bb..7a90cb0390 100644 --- a/src/librustc_mir/transform/rustc_peek.rs +++ b/src/librustc_mir/transform/rustc_peek.rs @@ -1,25 +1,25 @@ -use rustc_target::spec::abi::{Abi}; +use rustc_span::symbol::sym; +use rustc_span::Span; +use rustc_target::spec::abi::Abi; use syntax::ast; -use syntax::symbol::sym; -use syntax_pos::Span; -use rustc::ty::{self, TyCtxt, Ty}; -use rustc::hir::def_id::DefId; -use rustc::mir::{self, Body, BodyAndCache, Location, Local}; -use rustc_index::bit_set::BitSet; use crate::transform::{MirPass, MirSource}; +use rustc::mir::{self, Body, BodyAndCache, Local, Location}; +use rustc::ty::{self, Ty, TyCtxt}; +use rustc_hir::def_id::DefId; +use rustc_index::bit_set::BitSet; -use crate::dataflow::{do_dataflow, DebugFormatted}; -use crate::dataflow::MoveDataParamEnv; +use crate::dataflow::move_paths::{HasMoveData, MoveData}; +use crate::dataflow::move_paths::{LookupResult, MovePathIndex}; use crate::dataflow::BitDenotation; use crate::dataflow::DataflowResults; use crate::dataflow::DataflowResultsCursor; +use crate::dataflow::IndirectlyMutableLocals; +use crate::dataflow::MoveDataParamEnv; +use crate::dataflow::{do_dataflow, DebugFormatted}; use crate::dataflow::{ - DefinitelyInitializedPlaces, MaybeInitializedPlaces, MaybeUninitializedPlaces + DefinitelyInitializedPlaces, MaybeInitializedPlaces, MaybeUninitializedPlaces, }; -use crate::dataflow::IndirectlyMutableLocals; -use crate::dataflow::move_paths::{MovePathIndex, LookupResult}; -use crate::dataflow::move_paths::{HasMoveData, MoveData}; use crate::dataflow::has_rustc_mir_with; @@ -40,22 +40,42 @@ impl<'tcx> MirPass<'tcx> for SanityCheck { let move_data = MoveData::gather_moves(body, tcx, param_env).unwrap(); let mdpe = MoveDataParamEnv { move_data: move_data, param_env: param_env }; let dead_unwinds = BitSet::new_empty(body.basic_blocks().len()); - let flow_inits = - do_dataflow(tcx, body, def_id, &attributes, &dead_unwinds, - MaybeInitializedPlaces::new(tcx, body, &mdpe), - |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i])); - let flow_uninits = - do_dataflow(tcx, body, def_id, &attributes, &dead_unwinds, - MaybeUninitializedPlaces::new(tcx, body, &mdpe), - |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i])); - let flow_def_inits = - do_dataflow(tcx, body, def_id, &attributes, &dead_unwinds, - DefinitelyInitializedPlaces::new(tcx, body, &mdpe), - |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i])); - let flow_indirectly_mut = - do_dataflow(tcx, body, def_id, &attributes, &dead_unwinds, - IndirectlyMutableLocals::new(tcx, body, param_env), - |_, i| DebugFormatted::new(&i)); + let flow_inits = do_dataflow( + tcx, + body, + def_id, + &attributes, + &dead_unwinds, + MaybeInitializedPlaces::new(tcx, body, &mdpe), + |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i]), + ); + let flow_uninits = do_dataflow( + tcx, + body, + def_id, + &attributes, + &dead_unwinds, + MaybeUninitializedPlaces::new(tcx, body, &mdpe), + |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i]), + ); + let flow_def_inits = do_dataflow( + tcx, + body, + def_id, + &attributes, + &dead_unwinds, + DefinitelyInitializedPlaces::new(tcx, body, &mdpe), + |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i]), + ); + let flow_indirectly_mut = do_dataflow( + tcx, + body, + def_id, + &attributes, + &dead_unwinds, + IndirectlyMutableLocals::new(tcx, body, param_env), + |_, i| DebugFormatted::new(&i), + ); if has_rustc_mir_with(&attributes, sym::rustc_peek_maybe_init).is_some() { sanity_check_via_rustc_peek(tcx, body, def_id, &attributes, &flow_inits); @@ -64,20 +84,10 @@ impl<'tcx> MirPass<'tcx> for SanityCheck { sanity_check_via_rustc_peek(tcx, body, def_id, &attributes, &flow_uninits); } if has_rustc_mir_with(&attributes, sym::rustc_peek_definite_init).is_some() { - sanity_check_via_rustc_peek( - tcx, - body, - def_id, - &attributes, - &flow_def_inits); + sanity_check_via_rustc_peek(tcx, body, def_id, &attributes, &flow_def_inits); } if has_rustc_mir_with(&attributes, sym::rustc_peek_indirectly_mutable).is_some() { - sanity_check_via_rustc_peek( - tcx, - body, - def_id, - &attributes, - &flow_indirectly_mut); + sanity_check_via_rustc_peek(tcx, body, def_id, &attributes, &flow_indirectly_mut); } if has_rustc_mir_with(&attributes, sym::stop_after_dataflow).is_some() { tcx.sess.fatal("stop_after_dataflow ended compilation"); @@ -107,18 +117,16 @@ pub fn sanity_check_via_rustc_peek<'tcx, O>( def_id: DefId, _attributes: &[ast::Attribute], results: &DataflowResults<'tcx, O>, -) where O: RustcPeekAt<'tcx> { +) where + O: RustcPeekAt<'tcx>, +{ debug!("sanity_check_via_rustc_peek def_id: {:?}", def_id); let mut cursor = DataflowResultsCursor::new(results, body); - let peek_calls = body - .basic_blocks() - .iter_enumerated() - .filter_map(|(bb, block_data)| { - PeekCall::from_terminator(tcx, block_data.terminator()) - .map(|call| (bb, block_data, call)) - }); + let peek_calls = body.basic_blocks().iter_enumerated().filter_map(|(bb, block_data)| { + PeekCall::from_terminator(tcx, block_data.terminator()).map(|call| (bb, block_data, call)) + }); for (bb, block_data, call) in peek_calls { // Look for a sequence like the following to indicate that we should be peeking at `_1`: @@ -135,14 +143,15 @@ pub fn sanity_check_via_rustc_peek<'tcx, O>( .enumerate() .filter_map(|(i, stmt)| value_assigned_to_local(stmt, call.arg).map(|rval| (i, rval))) .next() - .expect("call to rustc_peek should be preceded by \ - assignment to temporary holding its argument"); + .expect( + "call to rustc_peek should be preceded by \ + assignment to temporary holding its argument", + ); match (call.kind, peek_rval) { - | (PeekCallKind::ByRef, mir::Rvalue::Ref(_, _, place)) + (PeekCallKind::ByRef, mir::Rvalue::Ref(_, _, place)) | (PeekCallKind::ByVal, mir::Rvalue::Use(mir::Operand::Move(place))) - | (PeekCallKind::ByVal, mir::Rvalue::Use(mir::Operand::Copy(place))) - => { + | (PeekCallKind::ByVal, mir::Rvalue::Use(mir::Operand::Copy(place))) => { let loc = Location { block: bb, statement_index }; cursor.seek(loc); let state = cursor.get(); @@ -238,11 +247,7 @@ impl PeekCall { } }; - return Some(PeekCall { - arg, - kind, - span, - }); + return Some(PeekCall { arg, kind, span }); } } @@ -261,7 +266,8 @@ pub trait RustcPeekAt<'tcx>: BitDenotation<'tcx> { } impl<'tcx, O> RustcPeekAt<'tcx> for O - where O: BitDenotation<'tcx, Idx = MovePathIndex> + HasMoveData<'tcx>, +where + O: BitDenotation<'tcx, Idx = MovePathIndex> + HasMoveData<'tcx>, { fn peek_at( &self, @@ -273,8 +279,7 @@ impl<'tcx, O> RustcPeekAt<'tcx> for O match self.move_data().rev_lookup.find(place.as_ref()) { LookupResult::Exact(peek_mpi) => { let bit_state = flow_state.contains(peek_mpi); - debug!("rustc_peek({:?} = &{:?}) bit_state: {}", - call.arg, place, bit_state); + debug!("rustc_peek({:?} = &{:?}) bit_state: {}", call.arg, place, bit_state); if !bit_state { tcx.sess.span_err(call.span, "rustc_peek: bit not set"); } diff --git a/src/librustc_mir/transform/simplify.rs b/src/librustc_mir/transform/simplify.rs index 628ac721ad..ddf8d73e54 100644 --- a/src/librustc_mir/transform/simplify.rs +++ b/src/librustc_mir/transform/simplify.rs @@ -27,15 +27,17 @@ //! naively generate still contains the `_a = ()` write in the unreachable block "after" the //! return. +use crate::transform::{MirPass, MirSource}; +use rustc::mir::visit::{MutVisitor, MutatingUseContext, PlaceContext, Visitor}; +use rustc::mir::*; +use rustc::ty::{self, TyCtxt}; use rustc_index::bit_set::BitSet; use rustc_index::vec::{Idx, IndexVec}; -use rustc::ty::{self, TyCtxt}; -use rustc::mir::*; -use rustc::mir::visit::{MutVisitor, Visitor, PlaceContext, MutatingUseContext}; use std::borrow::Cow; -use crate::transform::{MirPass, MirSource}; -pub struct SimplifyCfg { label: String } +pub struct SimplifyCfg { + label: String, +} impl SimplifyCfg { pub fn new(label: &str) -> Self { @@ -56,9 +58,7 @@ impl<'tcx> MirPass<'tcx> for SimplifyCfg { Cow::Borrowed(&self.label) } - fn run_pass( - &self, _tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx> - ) { + fn run_pass(&self, _tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { debug!("SimplifyCfg({:?}) - simplifying {:?}", self.label, body); simplify_cfg(body); } @@ -66,7 +66,7 @@ impl<'tcx> MirPass<'tcx> for SimplifyCfg { pub struct CfgSimplifier<'a, 'tcx> { basic_blocks: &'a mut IndexVec>, - pred_count: IndexVec + pred_count: IndexVec, } impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { @@ -87,10 +87,7 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { let basic_blocks = body.basic_blocks_mut(); - CfgSimplifier { - basic_blocks, - pred_count, - } + CfgSimplifier { basic_blocks, pred_count } } pub fn simplify(mut self) { @@ -105,13 +102,13 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { for bb in self.basic_blocks.indices() { if self.pred_count[bb] == 0 { - continue + continue; } debug!("simplifying {:?}", bb); - let mut terminator = self.basic_blocks[bb].terminator.take() - .expect("invalid terminator state"); + let mut terminator = + self.basic_blocks[bb].terminator.take().expect("invalid terminator state"); for successor in terminator.successors_mut() { self.collapse_goto_chain(successor, &mut changed); @@ -133,7 +130,9 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { changed |= inner_changed; } - if !changed { break } + if !changed { + break; + } } if start != START_BLOCK { @@ -163,13 +162,13 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { let mut terminator = match self.basic_blocks[*start] { BasicBlockData { ref statements, - terminator: ref mut terminator @ Some(Terminator { - kind: TerminatorKind::Goto { .. }, .. - }), .. + terminator: + ref mut terminator @ Some(Terminator { kind: TerminatorKind::Goto { .. }, .. }), + .. } if statements.is_empty() => terminator.take(), // if `terminator` is None, this means we are in a loop. In that // case, let all the loop collapse to its entry. - _ => return + _ => return, }; let target = match terminator { @@ -177,7 +176,7 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { self.collapse_goto_chain(target, changed); *target } - _ => unreachable!() + _ => unreachable!(), }; self.basic_blocks[*start].terminator = terminator; @@ -198,16 +197,14 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { } // merge a block with 1 `goto` predecessor to its parent - fn merge_successor(&mut self, - new_stmts: &mut Vec>, - terminator: &mut Terminator<'tcx>) - -> bool - { + fn merge_successor( + &mut self, + new_stmts: &mut Vec>, + terminator: &mut Terminator<'tcx>, + ) -> bool { let target = match terminator.kind { - TerminatorKind::Goto { target } - if self.pred_count[target] == 1 - => target, - _ => return false + TerminatorKind::Goto { target } if self.pred_count[target] == 1 => target, + _ => return false, }; debug!("merging block {:?} into {:?}", target, terminator); @@ -216,7 +213,7 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { None => { // unreachable loop - this should not be possible, as we // don't strand blocks, but handle it correctly. - return false + return false; } }; new_stmts.extend(self.basic_blocks[target].statements.drain(..)); @@ -228,8 +225,8 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { // turn a branch with all successors identical to a goto fn simplify_branch(&mut self, terminator: &mut Terminator<'tcx>) -> bool { match terminator.kind { - TerminatorKind::SwitchInt { .. } => {}, - _ => return false + TerminatorKind::SwitchInt { .. } => {} + _ => return false, }; let first_succ = { @@ -239,10 +236,10 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { self.pred_count[first_succ] -= (count - 1) as u32; first_succ } else { - return false + return false; } } else { - return false + return false; } }; @@ -253,11 +250,8 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> { fn strip_nops(&mut self) { for blk in self.basic_blocks.iter_mut() { - blk.statements.retain(|stmt| if let StatementKind::Nop = stmt.kind { - false - } else { - true - }) + blk.statements + .retain(|stmt| if let StatementKind::Nop = stmt.kind { false } else { true }) } } } @@ -271,7 +265,7 @@ pub fn remove_dead_blocks(body: &mut BodyAndCache<'_>) { let basic_blocks = body.basic_blocks_mut(); let num_blocks = basic_blocks.len(); - let mut replacements : Vec<_> = (0..num_blocks).map(BasicBlock::new).collect(); + let mut replacements: Vec<_> = (0..num_blocks).map(BasicBlock::new).collect(); let mut used_blocks = 0; for alive_index in seen.iter() { replacements[alive_index] = BasicBlock::new(used_blocks); @@ -291,20 +285,14 @@ pub fn remove_dead_blocks(body: &mut BodyAndCache<'_>) { } } - pub struct SimplifyLocals; impl<'tcx> MirPass<'tcx> for SimplifyLocals { - fn run_pass( - &self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx> - ) { + fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { trace!("running SimplifyLocals on {:?}", source); let locals = { let read_only_cache = read_only!(body); - let mut marker = DeclMarker { - locals: BitSet::new_empty(body.local_decls.len()), - body, - }; + let mut marker = DeclMarker { locals: BitSet::new_empty(body.local_decls.len()), body }; marker.visit_body(read_only_cache); // Return pointer and arguments are always live marker.locals.insert(RETURN_PLACE); @@ -357,24 +345,26 @@ impl<'a, 'tcx> Visitor<'tcx> for DeclMarker<'a, 'tcx> { // Ignore stores of constants because `ConstProp` and `CopyProp` can remove uses of many // of these locals. However, if the local is still needed, then it will be referenced in // another place and we'll mark it as being used there. - if ctx == PlaceContext::MutatingUse(MutatingUseContext::Store) || - ctx == PlaceContext::MutatingUse(MutatingUseContext::Projection) { + if ctx == PlaceContext::MutatingUse(MutatingUseContext::Store) + || ctx == PlaceContext::MutatingUse(MutatingUseContext::Projection) + { let block = &self.body.basic_blocks()[location.block]; if location.statement_index != block.statements.len() { - let stmt = - &block.statements[location.statement_index]; + let stmt = &block.statements[location.statement_index]; - if let StatementKind::Assign( - box (p, Rvalue::Use(Operand::Constant(c))) - ) = &stmt.kind { + if let StatementKind::Assign(box (p, Rvalue::Use(Operand::Constant(c)))) = + &stmt.kind + { match c.literal.val { // Keep assignments from unevaluated constants around, since the evaluation // may report errors, even if the use of the constant is dead code. ty::ConstKind::Unevaluated(..) => {} - _ => if !p.is_indirect() { - trace!("skipping store of const value {:?} to {:?}", c, p); - return; - }, + _ => { + if !p.is_indirect() { + trace!("skipping store of const value {:?} to {:?}", c, p); + return; + } + } } } } @@ -396,20 +386,10 @@ impl<'tcx> MutVisitor<'tcx> for LocalUpdater<'tcx> { fn visit_basic_block_data(&mut self, block: BasicBlock, data: &mut BasicBlockData<'tcx>) { // Remove unnecessary StorageLive and StorageDead annotations. - data.statements.retain(|stmt| { - match &stmt.kind { - StatementKind::StorageLive(l) | StatementKind::StorageDead(l) => { - self.map[*l].is_some() - } - StatementKind::Assign(box (place, _)) => { - if let PlaceBase::Local(local) = place.base { - self.map[local].is_some() - } else { - true - } - } - _ => true - } + data.statements.retain(|stmt| match &stmt.kind { + StatementKind::StorageLive(l) | StatementKind::StorageDead(l) => self.map[*l].is_some(), + StatementKind::Assign(box (place, _)) => self.map[place.local].is_some(), + _ => true, }); self.super_basic_block_data(block, data); } @@ -418,15 +398,10 @@ impl<'tcx> MutVisitor<'tcx> for LocalUpdater<'tcx> { *l = self.map[*l].unwrap(); } - fn process_projection_elem( - &mut self, - elem: &PlaceElem<'tcx>, - ) -> Option> { + fn process_projection_elem(&mut self, elem: &PlaceElem<'tcx>) -> Option> { match elem { - PlaceElem::Index(local) => { - Some(PlaceElem::Index(self.map[*local].unwrap())) - } - _ => None + PlaceElem::Index(local) => Some(PlaceElem::Index(self.map[*local].unwrap())), + _ => None, } } } diff --git a/src/librustc_mir/transform/simplify_branches.rs b/src/librustc_mir/transform/simplify_branches.rs index aa3c5b01be..c233d0b516 100644 --- a/src/librustc_mir/transform/simplify_branches.rs +++ b/src/librustc_mir/transform/simplify_branches.rs @@ -1,12 +1,14 @@ //! A pass that simplifies branches when their condition is known. -use rustc::ty::TyCtxt; -use rustc::mir::*; use crate::transform::{MirPass, MirSource}; +use rustc::mir::*; +use rustc::ty::TyCtxt; use std::borrow::Cow; -pub struct SimplifyBranches { label: String } +pub struct SimplifyBranches { + label: String, +} impl SimplifyBranches { pub fn new(label: &str) -> Self { @@ -25,7 +27,11 @@ impl<'tcx> MirPass<'tcx> for SimplifyBranches { let terminator = block.terminator_mut(); terminator.kind = match terminator.kind { TerminatorKind::SwitchInt { - discr: Operand::Constant(ref c), switch_ty, ref values, ref targets, .. + discr: Operand::Constant(ref c), + switch_ty, + ref values, + ref targets, + .. } => { let constant = c.literal.try_eval_bits(tcx, param_env, switch_ty); if let Some(constant) = constant { @@ -39,20 +45,21 @@ impl<'tcx> MirPass<'tcx> for SimplifyBranches { } ret } else { - continue + continue; } - }, + } TerminatorKind::Assert { target, cond: Operand::Constant(ref c), expected, .. - } if (c.literal.try_eval_bool(tcx, param_env) == Some(true)) == expected => - TerminatorKind::Goto { target }, + } if (c.literal.try_eval_bool(tcx, param_env) == Some(true)) == expected => { + TerminatorKind::Goto { target } + } TerminatorKind::FalseEdges { real_target, .. } => { TerminatorKind::Goto { target: real_target } - }, + } TerminatorKind::FalseUnwind { real_target, .. } => { TerminatorKind::Goto { target: real_target } - }, - _ => continue + } + _ => continue, }; } } diff --git a/src/librustc_mir/transform/simplify_try.rs b/src/librustc_mir/transform/simplify_try.rs index 752e852895..e733b0a5b5 100644 --- a/src/librustc_mir/transform/simplify_try.rs +++ b/src/librustc_mir/transform/simplify_try.rs @@ -9,11 +9,11 @@ //! //! into just `x`. -use crate::transform::{MirPass, MirSource, simplify}; -use rustc::ty::{TyCtxt, Ty}; +use crate::transform::{simplify, MirPass, MirSource}; +use itertools::Itertools as _; use rustc::mir::*; +use rustc::ty::{Ty, TyCtxt}; use rustc_target::abi::VariantIdx; -use itertools::Itertools as _; /// Simplifies arms of form `Variant(x) => Variant(x)` to just a move. /// @@ -119,10 +119,9 @@ fn match_set_variant_field<'tcx>(stmt: &Statement<'tcx>) -> Option<(Local, Local /// ``` fn match_set_discr<'tcx>(stmt: &Statement<'tcx>) -> Option<(Local, VariantIdx)> { match &stmt.kind { - StatementKind::SetDiscriminant { place, variant_index } => Some(( - place.as_local()?, - *variant_index - )), + StatementKind::SetDiscriminant { place, variant_index } => { + Some((place.as_local()?, *variant_index)) + } _ => None, } } @@ -138,9 +137,9 @@ struct VarField<'tcx> { fn match_variant_field_place<'tcx>(place: &Place<'tcx>) -> Option<(Local, VarField<'tcx>)> { match place.as_ref() { PlaceRef { - base: &PlaceBase::Local(local), + local, projection: &[ProjectionElem::Downcast(_, var_idx), ProjectionElem::Field(field, ty)], - } => Some((local, VarField { field, field_ty: ty, var_idx })), + } => Some((*local, VarField { field, field_ty: ty, var_idx })), _ => None, } } @@ -177,19 +176,14 @@ impl<'tcx> MirPass<'tcx> for SimplifyBranchSame { .peekable(); // We want to `goto -> bb_first`. - let bb_first = iter_bbs_reachable - .peek() - .map(|(idx, _)| *idx) - .unwrap_or(targets[0]); + let bb_first = iter_bbs_reachable.peek().map(|(idx, _)| *idx).unwrap_or(targets[0]); // All successor basic blocks should have the exact same form. - let all_successors_equivalent = iter_bbs_reachable - .map(|(_, bb)| bb) - .tuple_windows() - .all(|(bb_l, bb_r)| { + let all_successors_equivalent = + iter_bbs_reachable.map(|(_, bb)| bb).tuple_windows().all(|(bb_l, bb_r)| { bb_l.is_cleanup == bb_r.is_cleanup - && bb_l.terminator().kind == bb_r.terminator().kind - && bb_l.statements.iter().eq_by(&bb_r.statements, |x, y| x.kind == y.kind) + && bb_l.terminator().kind == bb_r.terminator().kind + && bb_l.statements.iter().eq_by(&bb_r.statements, |x, y| x.kind == y.kind) }); if all_successors_equivalent { diff --git a/src/librustc_mir/transform/unreachable_prop.rs b/src/librustc_mir/transform/unreachable_prop.rs new file mode 100644 index 0000000000..27173e0c17 --- /dev/null +++ b/src/librustc_mir/transform/unreachable_prop.rs @@ -0,0 +1,108 @@ +//! A pass that propagates the unreachable terminator of a block to its predecessors +//! when all of their successors are unreachable. This is achieved through a +//! post-order traversal of the blocks. + +use crate::transform::simplify; +use crate::transform::{MirPass, MirSource}; +use rustc::mir::*; +use rustc::ty::TyCtxt; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use std::borrow::Cow; + +pub struct UnreachablePropagation; + +impl MirPass<'_> for UnreachablePropagation { + fn run_pass<'tcx>(&self, tcx: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { + if tcx.sess.opts.debugging_opts.mir_opt_level < 3 { + // Enable only under -Zmir-opt-level=3 as in some cases (check the deeply-nested-opt + // perf benchmark) LLVM may spend quite a lot of time optimizing the generated code. + return; + } + + let mut unreachable_blocks = FxHashSet::default(); + let mut replacements = FxHashMap::default(); + + for (bb, bb_data) in traversal::postorder(body) { + let terminator = bb_data.terminator(); + // HACK: If the block contains any asm statement it is not regarded as unreachable. + // This is a temporary solution that handles possibly diverging asm statements. + // Accompanying testcases: mir-opt/unreachable_asm.rs and mir-opt/unreachable_asm_2.rs + let asm_stmt_in_block = || { + bb_data.statements.iter().any(|stmt: &Statement<'_>| match stmt.kind { + StatementKind::InlineAsm(..) => true, + _ => false, + }) + }; + + if terminator.kind == TerminatorKind::Unreachable && !asm_stmt_in_block() { + unreachable_blocks.insert(bb); + } else { + let is_unreachable = |succ: BasicBlock| unreachable_blocks.contains(&succ); + let terminator_kind_opt = remove_successors(&terminator.kind, is_unreachable); + + if let Some(terminator_kind) = terminator_kind_opt { + if terminator_kind == TerminatorKind::Unreachable && !asm_stmt_in_block() { + unreachable_blocks.insert(bb); + } + replacements.insert(bb, terminator_kind); + } + } + } + + let replaced = !replacements.is_empty(); + for (bb, terminator_kind) in replacements { + body.basic_blocks_mut()[bb].terminator_mut().kind = terminator_kind; + } + + if replaced { + simplify::remove_dead_blocks(body); + } + } +} + +fn remove_successors( + terminator_kind: &TerminatorKind<'tcx>, + predicate: F, +) -> Option> +where + F: Fn(BasicBlock) -> bool, +{ + match *terminator_kind { + TerminatorKind::Goto { target } if predicate(target) => Some(TerminatorKind::Unreachable), + TerminatorKind::SwitchInt { ref discr, switch_ty, ref values, ref targets } => { + let original_targets_len = targets.len(); + let (otherwise, targets) = targets.split_last().unwrap(); + let retained = values + .iter() + .zip(targets.iter()) + .filter(|(_, &t)| !predicate(t)) + .collect::>(); + let mut values = retained.iter().map(|&(v, _)| *v).collect::>(); + let mut targets = retained.iter().map(|&(_, d)| *d).collect::>(); + + if !predicate(*otherwise) { + targets.push(*otherwise); + } else { + values.pop(); + } + + let retained_targets_len = targets.len(); + + if targets.is_empty() { + Some(TerminatorKind::Unreachable) + } else if targets.len() == 1 { + Some(TerminatorKind::Goto { target: targets[0] }) + } else if original_targets_len != retained_targets_len { + Some(TerminatorKind::SwitchInt { + discr: discr.clone(), + switch_ty, + values: Cow::from(values), + targets, + }) + } else { + None + } + } + _ => None, + } +} diff --git a/src/librustc_mir/util/aggregate.rs b/src/librustc_mir/util/aggregate.rs index e6c3e4384d..be515ef571 100644 --- a/src/librustc_mir/util/aggregate.rs +++ b/src/librustc_mir/util/aggregate.rs @@ -1,6 +1,6 @@ use rustc::mir::*; -use rustc::ty::{Ty, TyCtxt}; use rustc::ty::layout::VariantIdx; +use rustc::ty::{Ty, TyCtxt}; use rustc_index::vec::Idx; use std::iter::TrustedLen; @@ -14,20 +14,17 @@ use std::iter::TrustedLen; /// discriminant(lhs) = variant_index; // If lhs is an enum or generator. pub fn expand_aggregate<'tcx>( mut lhs: Place<'tcx>, - operands: impl Iterator, Ty<'tcx>)> + TrustedLen, + operands: impl Iterator, Ty<'tcx>)> + TrustedLen, kind: AggregateKind<'tcx>, source_info: SourceInfo, tcx: TyCtxt<'tcx>, -) -> impl Iterator> + TrustedLen { +) -> impl Iterator> + TrustedLen { let mut set_discriminant = None; let active_field_index = match kind { AggregateKind::Adt(adt_def, variant_index, _, _, active_field_index) => { if adt_def.is_enum() { set_discriminant = Some(Statement { - kind: StatementKind::SetDiscriminant { - place: box(lhs.clone()), - variant_index, - }, + kind: StatementKind::SetDiscriminant { place: box (lhs), variant_index }, source_info, }); lhs = tcx.mk_place_downcast(lhs, adt_def, variant_index); @@ -39,10 +36,7 @@ pub fn expand_aggregate<'tcx>( // variant 0 (Unresumed). let variant_index = VariantIdx::new(0); set_discriminant = Some(Statement { - kind: StatementKind::SetDiscriminant { - place: box(lhs.clone()), - variant_index, - }, + kind: StatementKind::SetDiscriminant { place: box (lhs), variant_index }, source_info, }); @@ -51,27 +45,31 @@ pub fn expand_aggregate<'tcx>( None } - _ => None + _ => None, }; - operands.into_iter().enumerate().map(move |(i, (op, ty))| { - let lhs_field = if let AggregateKind::Array(_) = kind { - // FIXME(eddyb) `offset` should be u64. - let offset = i as u32; - assert_eq!(offset as usize, i); - tcx.mk_place_elem(lhs.clone(), ProjectionElem::ConstantIndex { - offset, - // FIXME(eddyb) `min_length` doesn't appear to be used. - min_length: offset + 1, - from_end: false - }) - } else { - let field = Field::new(active_field_index.unwrap_or(i)); - tcx.mk_place_field(lhs.clone(), field, ty) - }; - Statement { - source_info, - kind: StatementKind::Assign(box(lhs_field, Rvalue::Use(op))), - } - }).chain(set_discriminant) + operands + .into_iter() + .enumerate() + .map(move |(i, (op, ty))| { + let lhs_field = if let AggregateKind::Array(_) = kind { + // FIXME(eddyb) `offset` should be u64. + let offset = i as u32; + assert_eq!(offset as usize, i); + tcx.mk_place_elem( + lhs.clone(), + ProjectionElem::ConstantIndex { + offset, + // FIXME(eddyb) `min_length` doesn't appear to be used. + min_length: offset + 1, + from_end: false, + }, + ) + } else { + let field = Field::new(active_field_index.unwrap_or(i)); + tcx.mk_place_field(lhs.clone(), field, ty) + }; + Statement { source_info, kind: StatementKind::Assign(box (lhs_field, Rvalue::Use(op))) } + }) + .chain(set_discriminant) } diff --git a/src/librustc_mir/util/alignment.rs b/src/librustc_mir/util/alignment.rs index f949fcf074..e17c7a80f1 100644 --- a/src/librustc_mir/util/alignment.rs +++ b/src/librustc_mir/util/alignment.rs @@ -1,5 +1,5 @@ -use rustc::ty::{self, TyCtxt}; use rustc::mir::*; +use rustc::ty::{self, TyCtxt}; /// Returns `true` if this place is allowed to be less aligned /// than its containing struct (because it is within a packed @@ -16,7 +16,7 @@ where debug!("is_disaligned({:?})", place); if !is_within_packed(tcx, local_decls, place) { debug!("is_disaligned({:?}) - not within packed", place); - return false + return false; } let ty = place.ty(local_decls, tcx).ty; @@ -46,11 +46,9 @@ where // encountered a Deref, which is ABI-aligned ProjectionElem::Deref => break, ProjectionElem::Field(..) => { - let ty = Place::ty_from(&place.base, proj_base, local_decls, tcx).ty; + let ty = Place::ty_from(&place.local, proj_base, local_decls, tcx).ty; match ty.kind { - ty::Adt(def, _) if def.repr.packed() => { - return true - } + ty::Adt(def, _) if def.repr.packed() => return true, _ => {} } } diff --git a/src/librustc_mir/util/borrowck_errors.rs b/src/librustc_mir/util/borrowck_errors.rs index 9004b5e723..d8ee059f1a 100644 --- a/src/librustc_mir/util/borrowck_errors.rs +++ b/src/librustc_mir/util/borrowck_errors.rs @@ -1,22 +1,10 @@ use rustc::ty::{self, Ty, TyCtxt}; -use rustc_errors::{DiagnosticBuilder, DiagnosticId}; -use syntax_pos::{MultiSpan, Span}; - -use rustc_error_codes::*; +use rustc_errors::{struct_span_err, DiagnosticBuilder, DiagnosticId}; +use rustc_span::{MultiSpan, Span}; impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { - crate fn cannot_move_when_borrowed( - &self, - span: Span, - desc: &str, - ) -> DiagnosticBuilder<'cx> { - struct_span_err!( - self, - span, - E0505, - "cannot move out of `{}` because it is borrowed", - desc, - ) + crate fn cannot_move_when_borrowed(&self, span: Span, desc: &str) -> DiagnosticBuilder<'cx> { + struct_span_err!(self, span, E0505, "cannot move out of `{}` because it is borrowed", desc,) } crate fn cannot_use_when_mutably_borrowed( @@ -34,10 +22,7 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { desc, ); - err.span_label( - borrow_span, - format!("borrow of `{}` occurs here", borrow_desc), - ); + err.span_label(borrow_span, format!("borrow of `{}` occurs here", borrow_desc)); err.span_label(span, format!("use of borrowed `{}`", borrow_desc)); err } @@ -67,8 +52,8 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { old_opt_via: &str, old_load_end_span: Option, ) -> DiagnosticBuilder<'cx> { - let via = |msg: &str| - if msg.is_empty() { msg.to_string() } else { format!(" (via `{}`)", msg) }; + let via = + |msg: &str| if msg.is_empty() { msg.to_string() } else { format!(" (via `{}`)", msg) }; let mut err = struct_span_err!( self, new_loan_span, @@ -124,7 +109,7 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { if old_loan_span == new_loan_span { err.span_label( old_loan_span, - "closures are constructed here in different iterations of loop" + "closures are constructed here in different iterations of loop", ); } else { err.span_label(old_loan_span, "first closure is constructed here"); @@ -215,8 +200,8 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { msg_old: &str, old_load_end_span: Option, ) -> DiagnosticBuilder<'cx> { - let via = |msg: &str| - if msg.is_empty() { msg.to_string() } else { format!(" (via `{}`)", msg) }; + let via = + |msg: &str| if msg.is_empty() { msg.to_string() } else { format!(" (via `{}`)", msg) }; let mut err = struct_span_err!( self, span, @@ -242,12 +227,9 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { format!( "{} borrow of `{}` -- which overlaps with `{}` -- occurs here", kind_new, msg_new, msg_old, - ) - ); - err.span_label( - old_span, - format!("{} borrow occurs here{}", kind_old, via(msg_old)), + ), ); + err.span_label(old_span, format!("{} borrow occurs here{}", kind_old, via(msg_old))); } if let Some(old_load_end_span) = old_load_end_span { @@ -271,10 +253,7 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { ); err.span_label(borrow_span, format!("borrow of `{}` occurs here", desc)); - err.span_label( - span, - format!("assignment to borrowed `{}` occurs here", desc), - ); + err.span_label(span, format!("assignment to borrowed `{}` occurs here", desc)); err } @@ -284,19 +263,8 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { desc: &str, is_arg: bool, ) -> DiagnosticBuilder<'cx> { - let msg = if is_arg { - "to immutable argument" - } else { - "twice to immutable variable" - }; - struct_span_err!( - self, - span, - E0384, - "cannot assign {} `{}`", - msg, - desc, - ) + let msg = if is_arg { "to immutable argument" } else { "twice to immutable variable" }; + struct_span_err!(self, span, E0384, "cannot assign {} `{}`", msg, desc,) } crate fn cannot_assign(&self, span: Span, desc: &str) -> DiagnosticBuilder<'cx> { @@ -308,13 +276,7 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { move_from_span: Span, move_from_desc: &str, ) -> DiagnosticBuilder<'cx> { - struct_span_err!( - self, - move_from_span, - E0507, - "cannot move out of {}", - move_from_desc, - ) + struct_span_err!(self, move_from_span, E0507, "cannot move out of {}", move_from_desc,) } /// Signal an error due to an attempt to move out of the interior @@ -366,9 +328,7 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { optional_adverb_for_moved: &str, moved_path: Option, ) -> DiagnosticBuilder<'cx> { - let moved_path = moved_path - .map(|mp| format!(": `{}`", mp)) - .unwrap_or_default(); + let moved_path = moved_path.map(|mp| format!(": `{}`", mp)).unwrap_or_default(); struct_span_err!( self, @@ -387,14 +347,7 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { path: &str, reason: &str, ) -> DiagnosticBuilder<'cx> { - struct_span_err!( - self, - span, - E0596, - "cannot borrow {} as mutable{}", - path, - reason, - ) + struct_span_err!(self, span, E0596, "cannot borrow {} as mutable{}", path, reason,) } crate fn cannot_mutate_in_immutable_section( @@ -434,10 +387,7 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { err } - crate fn cannot_borrow_across_destructor( - &self, - borrow_span: Span, - ) -> DiagnosticBuilder<'cx> { + crate fn cannot_borrow_across_destructor(&self, borrow_span: Span) -> DiagnosticBuilder<'cx> { struct_span_err!( self, borrow_span, @@ -451,13 +401,7 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { span: Span, path: &str, ) -> DiagnosticBuilder<'cx> { - struct_span_err!( - self, - span, - E0597, - "{} does not live long enough", - path, - ) + struct_span_err!(self, span, E0597, "{} does not live long enough", path,) } crate fn cannot_return_reference_to_local( @@ -472,9 +416,9 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { span, E0515, "cannot {RETURN} {REFERENCE} {LOCAL}", - RETURN=return_kind, - REFERENCE=reference_desc, - LOCAL=path_desc, + RETURN = return_kind, + REFERENCE = reference_desc, + LOCAL = path_desc, ); err.span_label( @@ -501,10 +445,7 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { borrowed_path, ); err.span_label(capture_span, format!("{} is borrowed here", borrowed_path)) - .span_label( - closure_span, - format!("may outlive borrowed value {}", borrowed_path), - ); + .span_label(closure_span, format!("may outlive borrowed value {}", borrowed_path)); err } @@ -512,24 +453,11 @@ impl<'cx, 'tcx> crate::borrow_check::MirBorrowckCtxt<'cx, 'tcx> { &self, span: Span, ) -> DiagnosticBuilder<'cx> { - struct_span_err!( - self, - span, - E0712, - "thread-local variable borrowed past end of function", - ) + struct_span_err!(self, span, E0712, "thread-local variable borrowed past end of function",) } - crate fn temporary_value_borrowed_for_too_long( - &self, - span: Span, - ) -> DiagnosticBuilder<'cx> { - struct_span_err!( - self, - span, - E0716, - "temporary value dropped while borrowed", - ) + crate fn temporary_value_borrowed_for_too_long(&self, span: Span) -> DiagnosticBuilder<'cx> { + struct_span_err!(self, span, E0716, "temporary value dropped while borrowed",) } fn struct_span_err_with_code>( diff --git a/src/librustc_mir/util/collect_writes.rs b/src/librustc_mir/util/collect_writes.rs index 4006787f26..6cd2131649 100644 --- a/src/librustc_mir/util/collect_writes.rs +++ b/src/librustc_mir/util/collect_writes.rs @@ -1,7 +1,7 @@ -use rustc::mir::{Local, Location}; -use rustc::mir::ReadOnlyBodyAndCache; use rustc::mir::visit::PlaceContext; use rustc::mir::visit::Visitor; +use rustc::mir::ReadOnlyBodyAndCache; +use rustc::mir::{Local, Location}; crate trait FindAssignments { // Finds all statements that assign directly to local (i.e., X = ...) @@ -9,11 +9,11 @@ crate trait FindAssignments { fn find_assignments(&self, local: Local) -> Vec; } -impl<'a, 'tcx> FindAssignments for ReadOnlyBodyAndCache<'a, 'tcx>{ - fn find_assignments(&self, local: Local) -> Vec{ - let mut visitor = FindLocalAssignmentVisitor{ needle: local, locations: vec![]}; - visitor.visit_body(*self); - visitor.locations +impl<'a, 'tcx> FindAssignments for ReadOnlyBodyAndCache<'a, 'tcx> { + fn find_assignments(&self, local: Local) -> Vec { + let mut visitor = FindLocalAssignmentVisitor { needle: local, locations: vec![] }; + visitor.visit_body(*self); + visitor.locations } } @@ -25,10 +25,7 @@ struct FindLocalAssignmentVisitor { } impl<'tcx> Visitor<'tcx> for FindLocalAssignmentVisitor { - fn visit_local(&mut self, - local: &Local, - place_context: PlaceContext, - location: Location) { + fn visit_local(&mut self, local: &Local, place_context: PlaceContext, location: Location) { if self.needle != *local { return; } diff --git a/src/librustc_mir/util/def_use.rs b/src/librustc_mir/util/def_use.rs index cf98755eb6..aa9ddbdbda 100644 --- a/src/librustc_mir/util/def_use.rs +++ b/src/librustc_mir/util/def_use.rs @@ -1,9 +1,9 @@ //! Def-use analysis. +use rustc::mir::visit::{MutVisitor, PlaceContext, Visitor}; use rustc::mir::{ Body, BodyAndCache, Local, Location, PlaceElem, ReadOnlyBodyAndCache, VarDebugInfo, }; -use rustc::mir::visit::{PlaceContext, MutVisitor, Visitor}; use rustc::ty::TyCtxt; use rustc_index::vec::IndexVec; use std::mem; @@ -27,9 +27,7 @@ pub struct Use { impl DefUseAnalysis { pub fn new(body: &Body<'_>) -> DefUseAnalysis { - DefUseAnalysis { - info: IndexVec::from_elem_n(Info::new(), body.local_decls.len()), - } + DefUseAnalysis { info: IndexVec::from_elem_n(Info::new(), body.local_decls.len()) } } pub fn analyze(&mut self, body: ReadOnlyBodyAndCache<'_, '_>) { @@ -73,11 +71,13 @@ impl DefUseAnalysis { } // FIXME(pcwalton): this should update the def-use chains. - pub fn replace_all_defs_and_uses_with(&self, - local: Local, - body: &mut BodyAndCache<'tcx>, - new_local: Local, - tcx: TyCtxt<'tcx>) { + pub fn replace_all_defs_and_uses_with( + &self, + local: Local, + body: &mut BodyAndCache<'tcx>, + new_local: Local, + tcx: TyCtxt<'tcx>, + ) { self.mutate_defs_and_uses(local, body, new_local, tcx) } } @@ -89,18 +89,12 @@ struct DefUseFinder { } impl Visitor<'_> for DefUseFinder { - fn visit_local(&mut self, - &local: &Local, - context: PlaceContext, - location: Location) { + fn visit_local(&mut self, &local: &Local, context: PlaceContext, location: Location) { let info = &mut self.info[local]; if self.in_var_debug_info { info.var_debug_info_indices.push(self.var_debug_info_index); } else { - info.defs_and_uses.push(Use { - context, - location, - }); + info.defs_and_uses.push(Use { context, location }); } } fn visit_var_debug_info(&mut self, var_debug_info: &VarDebugInfo<'tcx>) { @@ -114,10 +108,7 @@ impl Visitor<'_> for DefUseFinder { impl Info { fn new() -> Info { - Info { - defs_and_uses: vec![], - var_debug_info_indices: vec![], - } + Info { defs_and_uses: vec![], var_debug_info_indices: vec![] } } fn clear(&mut self) { @@ -133,18 +124,14 @@ impl Info { self.defs_not_including_drop().count() } - pub fn defs_not_including_drop( - &self, - ) -> impl Iterator { - self.defs_and_uses.iter().filter(|place_use| { - place_use.context.is_mutating_use() && !place_use.context.is_drop() - }) + pub fn defs_not_including_drop(&self) -> impl Iterator { + self.defs_and_uses + .iter() + .filter(|place_use| place_use.context.is_mutating_use() && !place_use.context.is_drop()) } pub fn use_count(&self) -> usize { - self.defs_and_uses.iter().filter(|place_use| { - place_use.context.is_nonmutating_use() - }).count() + self.defs_and_uses.iter().filter(|place_use| place_use.context.is_nonmutating_use()).count() } } @@ -155,11 +142,7 @@ struct MutateUseVisitor<'tcx> { } impl MutateUseVisitor<'tcx> { - fn new( - query: Local, - new_local: Local, - tcx: TyCtxt<'tcx>, - ) -> MutateUseVisitor<'tcx> { + fn new(query: Local, new_local: Local, tcx: TyCtxt<'tcx>) -> MutateUseVisitor<'tcx> { MutateUseVisitor { query, new_local, tcx } } } @@ -169,19 +152,13 @@ impl MutVisitor<'tcx> for MutateUseVisitor<'tcx> { self.tcx } - fn visit_local(&mut self, - local: &mut Local, - _context: PlaceContext, - _location: Location) { + fn visit_local(&mut self, local: &mut Local, _context: PlaceContext, _location: Location) { if *local == self.query { *local = self.new_local; } } - fn process_projection_elem( - &mut self, - elem: &PlaceElem<'tcx>, - ) -> Option> { + fn process_projection_elem(&mut self, elem: &PlaceElem<'tcx>) -> Option> { match elem { PlaceElem::Index(local) if *local == self.query => { Some(PlaceElem::Index(self.new_local)) diff --git a/src/librustc_mir/util/elaborate_drops.rs b/src/librustc_mir/util/elaborate_drops.rs index 67e5bfafaf..1be3da4b3d 100644 --- a/src/librustc_mir/util/elaborate_drops.rs +++ b/src/librustc_mir/util/elaborate_drops.rs @@ -1,28 +1,28 @@ -use std::fmt; -use rustc::hir; -use rustc::mir::*; +use crate::util::patch::MirPatch; use rustc::middle::lang_items; +use rustc::mir::*; use rustc::traits::Reveal; -use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::layout::VariantIdx; use rustc::ty::subst::SubstsRef; use rustc::ty::util::IntTypeExt; +use rustc::ty::{self, Ty, TyCtxt}; +use rustc_hir as hir; use rustc_index::vec::Idx; -use crate::util::patch::MirPatch; +use std::fmt; use std::convert::TryInto; #[derive(Debug, PartialEq, Eq, Copy, Clone)] pub enum DropFlagState { Present, // i.e., initialized - Absent, // i.e., deinitialized or "moved" + Absent, // i.e., deinitialized or "moved" } impl DropFlagState { pub fn value(self) -> bool { match self { DropFlagState::Present => true, - DropFlagState::Absent => false + DropFlagState::Absent => false, } } } @@ -38,20 +38,20 @@ pub enum DropStyle { #[derive(Debug)] pub enum DropFlagMode { Shallow, - Deep + Deep, } #[derive(Copy, Clone, Debug)] pub enum Unwind { To(BasicBlock), - InCleanup + InCleanup, } impl Unwind { fn is_cleanup(self) -> bool { match self { Unwind::To(..) => false, - Unwind::InCleanup => true + Unwind::InCleanup => true, } } @@ -62,16 +62,19 @@ impl Unwind { } } - fn map(self, f: F) -> Self where F: FnOnce(BasicBlock) -> BasicBlock { + fn map(self, f: F) -> Self + where + F: FnOnce(BasicBlock) -> BasicBlock, + { match self { Unwind::To(bb) => Unwind::To(f(bb)), - Unwind::InCleanup => Unwind::InCleanup + Unwind::InCleanup => Unwind::InCleanup, } } } pub trait DropElaborator<'a, 'tcx>: fmt::Debug { - type Path : Copy + fmt::Debug; + type Path: Copy + fmt::Debug; fn patch(&mut self) -> &mut MirPatch<'tcx>; fn body(&self) -> &'a Body<'tcx>; @@ -82,7 +85,6 @@ pub trait DropElaborator<'a, 'tcx>: fmt::Debug { fn get_drop_flag(&mut self, path: Self::Path) -> Option>; fn clear_drop_flag(&mut self, location: Location, path: Self::Path, mode: DropFlagMode); - fn field_subpath(&self, path: Self::Path, field: Field) -> Option; fn deref_subpath(&self, path: Self::Path) -> Option; fn downcast_subpath(&self, path: Self::Path, variant: VariantIdx) -> Option; @@ -116,9 +118,7 @@ pub fn elaborate_drop<'b, 'tcx, D>( D: DropElaborator<'b, 'tcx>, 'tcx: 'b, { - DropCtxt { - elaborator, source_info, place, path, succ, unwind - }.elaborate_drop(bb) + DropCtxt { elaborator, source_info, place, path, succ, unwind }.elaborate_drop(bb) } impl<'l, 'b, 'tcx, D> DropCtxt<'l, 'b, 'tcx, D> @@ -158,85 +158,98 @@ where debug!("elaborate_drop({:?}): live - {:?}", self, style); match style { DropStyle::Dead => { - self.elaborator.patch().patch_terminator(bb, TerminatorKind::Goto { - target: self.succ - }); + self.elaborator + .patch() + .patch_terminator(bb, TerminatorKind::Goto { target: self.succ }); } DropStyle::Static => { let loc = self.terminator_loc(bb); self.elaborator.clear_drop_flag(loc, self.path, DropFlagMode::Deep); - self.elaborator.patch().patch_terminator(bb, TerminatorKind::Drop { - location: self.place.clone(), - target: self.succ, - unwind: self.unwind.into_option(), - }); + self.elaborator.patch().patch_terminator( + bb, + TerminatorKind::Drop { + location: *self.place, + target: self.succ, + unwind: self.unwind.into_option(), + }, + ); } DropStyle::Conditional => { let unwind = self.unwind; // FIXME(#43234) let succ = self.succ; let drop_bb = self.complete_drop(Some(DropFlagMode::Deep), succ, unwind); - self.elaborator.patch().patch_terminator(bb, TerminatorKind::Goto { - target: drop_bb - }); + self.elaborator + .patch() + .patch_terminator(bb, TerminatorKind::Goto { target: drop_bb }); } DropStyle::Open => { let drop_bb = self.open_drop(); - self.elaborator.patch().patch_terminator(bb, TerminatorKind::Goto { - target: drop_bb - }); + self.elaborator + .patch() + .patch_terminator(bb, TerminatorKind::Goto { target: drop_bb }); } } } /// Returns the place and move path for each field of `variant`, /// (the move path is `None` if the field is a rest field). - fn move_paths_for_fields(&self, - base_place: &Place<'tcx>, - variant_path: D::Path, - variant: &'tcx ty::VariantDef, - substs: SubstsRef<'tcx>) - -> Vec<(Place<'tcx>, Option)> - { - variant.fields.iter().enumerate().map(|(i, f)| { - let field = Field::new(i); - let subpath = self.elaborator.field_subpath(variant_path, field); - let tcx = self.tcx(); - - assert_eq!(self.elaborator.param_env().reveal, Reveal::All); - let field_ty = tcx.normalize_erasing_regions( - self.elaborator.param_env(), - f.ty(tcx, substs), - ); - (tcx.mk_place_field(base_place.clone(), field, field_ty), subpath) - }).collect() + fn move_paths_for_fields( + &self, + base_place: &Place<'tcx>, + variant_path: D::Path, + variant: &'tcx ty::VariantDef, + substs: SubstsRef<'tcx>, + ) -> Vec<(Place<'tcx>, Option)> { + variant + .fields + .iter() + .enumerate() + .map(|(i, f)| { + let field = Field::new(i); + let subpath = self.elaborator.field_subpath(variant_path, field); + let tcx = self.tcx(); + + assert_eq!(self.elaborator.param_env().reveal, Reveal::All); + let field_ty = + tcx.normalize_erasing_regions(self.elaborator.param_env(), f.ty(tcx, substs)); + (tcx.mk_place_field(base_place.clone(), field, field_ty), subpath) + }) + .collect() } - fn drop_subpath(&mut self, - place: &Place<'tcx>, - path: Option, - succ: BasicBlock, - unwind: Unwind) - -> BasicBlock - { + fn drop_subpath( + &mut self, + place: &Place<'tcx>, + path: Option, + succ: BasicBlock, + unwind: Unwind, + ) -> BasicBlock { if let Some(path) = path { debug!("drop_subpath: for std field {:?}", place); DropCtxt { elaborator: self.elaborator, source_info: self.source_info, - path, place, succ, unwind, - }.elaborated_drop_block() + path, + place, + succ, + unwind, + } + .elaborated_drop_block() } else { debug!("drop_subpath: for rest field {:?}", place); DropCtxt { elaborator: self.elaborator, source_info: self.source_info, - place, succ, unwind, + place, + succ, + unwind, // Using `self.path` here to condition the drop on // our own drop flag. - path: self.path - }.complete_drop(None, succ, unwind) + path: self.path, + } + .complete_drop(None, succ, unwind) } } @@ -246,19 +259,21 @@ where /// /// `unwind_ladder` is such a list of steps in reverse order, /// which is called if the matching step of the drop glue panics. - fn drop_halfladder(&mut self, - unwind_ladder: &[Unwind], - mut succ: BasicBlock, - fields: &[(Place<'tcx>, Option)]) - -> Vec - { - Some(succ).into_iter().chain( - fields.iter().rev().zip(unwind_ladder) - .map(|(&(ref place, path), &unwind_succ)| { + fn drop_halfladder( + &mut self, + unwind_ladder: &[Unwind], + mut succ: BasicBlock, + fields: &[(Place<'tcx>, Option)], + ) -> Vec { + Some(succ) + .into_iter() + .chain(fields.iter().rev().zip(unwind_ladder).map( + |(&(ref place, path), &unwind_succ)| { succ = self.drop_subpath(place, path, succ, unwind_succ); succ - }) - ).collect() + }, + )) + .collect() } fn drop_ladder_bottom(&mut self) -> (BasicBlock, Unwind) { @@ -270,7 +285,7 @@ where self.drop_flag_reset_block(DropFlagMode::Shallow, succ, unwind), unwind.map(|unwind| { self.drop_flag_reset_block(DropFlagMode::Shallow, unwind, Unwind::InCleanup) - }) + }), ) } @@ -314,8 +329,7 @@ where unwind_ladder }; - let normal_ladder = - self.drop_halfladder(&unwind_ladder, succ, &fields); + let normal_ladder = self.drop_halfladder(&unwind_ladder, succ, &fields); (*normal_ladder.last().unwrap(), *unwind_ladder.last().unwrap()) } @@ -323,10 +337,16 @@ where fn open_drop_for_tuple(&mut self, tys: &[Ty<'tcx>]) -> BasicBlock { debug!("open_drop_for_tuple({:?}, {:?})", self, tys); - let fields = tys.iter().enumerate().map(|(i, &ty)| { - (self.tcx().mk_place_field(self.place.clone(), Field::new(i), ty), - self.elaborator.field_subpath(self.path, Field::new(i))) - }).collect(); + let fields = tys + .iter() + .enumerate() + .map(|(i, &ty)| { + ( + self.tcx().mk_place_field(self.place.clone(), Field::new(i), ty), + self.elaborator.field_subpath(self.path, Field::new(i)), + ) + }) + .collect(); let (succ, unwind) = self.drop_ladder_bottom(); self.drop_ladder(fields, succ, unwind).0 @@ -341,9 +361,8 @@ where let succ = self.succ; // FIXME(#43234) let unwind = self.unwind; let succ = self.box_free_block(adt, substs, succ, unwind); - let unwind_succ = self.unwind.map(|unwind| { - self.box_free_block(adt, substs, unwind, Unwind::InCleanup) - }); + let unwind_succ = + self.unwind.map(|unwind| self.box_free_block(adt, substs, unwind, Unwind::InCleanup)); self.drop_subpath(&interior, interior_path, succ, unwind_succ) } @@ -355,9 +374,9 @@ where statements: vec![], terminator: Some(Terminator { source_info: self.source_info, - kind: TerminatorKind::Unreachable + kind: TerminatorKind::Unreachable, }), - is_cleanup: self.unwind.is_cleanup() + is_cleanup: self.unwind.is_cleanup(), }); } @@ -376,16 +395,18 @@ where } } - fn open_drop_for_adt_contents(&mut self, adt: &'tcx ty::AdtDef, - substs: SubstsRef<'tcx>) - -> (BasicBlock, Unwind) { + fn open_drop_for_adt_contents( + &mut self, + adt: &'tcx ty::AdtDef, + substs: SubstsRef<'tcx>, + ) -> (BasicBlock, Unwind) { let (succ, unwind) = self.drop_ladder_bottom(); if !adt.is_enum() { let fields = self.move_paths_for_fields( self.place, self.path, &adt.variants[VariantIdx::new(0)], - substs + substs, ); self.drop_ladder(fields, succ, unwind) } else { @@ -393,25 +414,23 @@ where } } - fn open_drop_for_multivariant(&mut self, adt: &'tcx ty::AdtDef, - substs: SubstsRef<'tcx>, - succ: BasicBlock, - unwind: Unwind) - -> (BasicBlock, Unwind) { + fn open_drop_for_multivariant( + &mut self, + adt: &'tcx ty::AdtDef, + substs: SubstsRef<'tcx>, + succ: BasicBlock, + unwind: Unwind, + ) -> (BasicBlock, Unwind) { let mut values = Vec::with_capacity(adt.variants.len()); let mut normal_blocks = Vec::with_capacity(adt.variants.len()); - let mut unwind_blocks = if unwind.is_cleanup() { - None - } else { - Some(Vec::with_capacity(adt.variants.len())) - }; + let mut unwind_blocks = + if unwind.is_cleanup() { None } else { Some(Vec::with_capacity(adt.variants.len())) }; let mut have_otherwise = false; let tcx = self.tcx(); for (variant_index, discr) in adt.discriminants(tcx) { - let subpath = self.elaborator.downcast_subpath( - self.path, variant_index); + let subpath = self.elaborator.downcast_subpath(self.path, variant_index); if let Some(variant_path) = subpath { let base_place = tcx.mk_place_elem( self.place.clone(), @@ -424,7 +443,8 @@ where &base_place, variant_path, &adt.variants[variant_index], - substs); + substs, + ); values.push(discr.val); if let Unwind::To(unwind) = unwind { // We can't use the half-ladder from the original @@ -447,8 +467,7 @@ where let unwind_blocks = unwind_blocks.as_mut().unwrap(); let unwind_ladder = vec![Unwind::InCleanup; fields.len() + 1]; - let halfladder = - self.drop_halfladder(&unwind_ladder, unwind, &fields); + let halfladder = self.drop_halfladder(&unwind_ladder, unwind, &fields); unwind_blocks.push(halfladder.last().cloned().unwrap()); } let (normal, _) = self.drop_ladder(fields, succ, unwind); @@ -461,29 +480,34 @@ where if have_otherwise { normal_blocks.push(self.drop_block(succ, unwind)); if let Unwind::To(unwind) = unwind { - unwind_blocks.as_mut().unwrap().push( - self.drop_block(unwind, Unwind::InCleanup) - ); + unwind_blocks.as_mut().unwrap().push(self.drop_block(unwind, Unwind::InCleanup)); } } else { values.pop(); } - (self.adt_switch_block(adt, normal_blocks, &values, succ, unwind), - unwind.map(|unwind| { - self.adt_switch_block( - adt, unwind_blocks.unwrap(), &values, unwind, Unwind::InCleanup - ) - })) - } - - fn adt_switch_block(&mut self, - adt: &'tcx ty::AdtDef, - blocks: Vec, - values: &[u128], - succ: BasicBlock, - unwind: Unwind) - -> BasicBlock { + ( + self.adt_switch_block(adt, normal_blocks, &values, succ, unwind), + unwind.map(|unwind| { + self.adt_switch_block( + adt, + unwind_blocks.unwrap(), + &values, + unwind, + Unwind::InCleanup, + ) + }), + ) + } + + fn adt_switch_block( + &mut self, + adt: &'tcx ty::AdtDef, + blocks: Vec, + values: &[u128], + succ: BasicBlock, + unwind: Unwind, + ) -> BasicBlock { // If there are multiple variants, then if something // is present within the enum the discriminant, tracked // by the rest path, must be initialized. @@ -493,7 +517,7 @@ where // way lies only trouble. let discr_ty = adt.repr.discr_type().to_ty(self.tcx()); let discr = Place::from(self.new_temp(discr_ty)); - let discr_rv = Rvalue::Discriminant(self.place.clone()); + let discr_rv = Rvalue::Discriminant(*self.place); let switch_block = BasicBlockData { statements: vec![self.assign(&discr, discr_rv)], terminator: Some(Terminator { @@ -503,7 +527,7 @@ where switch_ty: discr_ty, values: From::from(values.to_owned()), targets: blocks, - } + }, }), is_cleanup: unwind.is_cleanup(), }; @@ -519,24 +543,28 @@ where let ty = self.place_ty(self.place); let substs = tcx.mk_substs_trait(ty, &[]); - let ref_ty = tcx.mk_ref(tcx.lifetimes.re_erased, ty::TypeAndMut { - ty, - mutbl: hir::Mutability::Mutable - }); + let ref_ty = + tcx.mk_ref(tcx.lifetimes.re_erased, ty::TypeAndMut { ty, mutbl: hir::Mutability::Mut }); let ref_place = self.new_temp(ref_ty); let unit_temp = Place::from(self.new_temp(tcx.mk_unit())); let result = BasicBlockData { statements: vec![self.assign( &Place::from(ref_place), - Rvalue::Ref(tcx.lifetimes.re_erased, - BorrowKind::Mut { allow_two_phase_borrow: false }, - self.place.clone()) + Rvalue::Ref( + tcx.lifetimes.re_erased, + BorrowKind::Mut { allow_two_phase_borrow: false }, + *self.place, + ), )], terminator: Some(Terminator { kind: TerminatorKind::Call { - func: Operand::function_handle(tcx, drop_fn.def_id, substs, - self.source_info.span), + func: Operand::function_handle( + tcx, + drop_fn.def_id, + substs, + self.source_info.span, + ), args: vec![Operand::Move(Place::from(ref_place))], destination: Some((unit_temp, succ)), cleanup: unwind.into_option(), @@ -557,10 +585,10 @@ where /// if can_go then succ else drop-block /// drop-block: /// if ptr_based { - /// ptr = &mut *cur + /// ptr = cur /// cur = cur.offset(1) /// } else { - /// ptr = &mut P[cur] + /// ptr = &raw mut P[cur] /// cur = cur + 1 /// } /// drop(ptr) @@ -574,69 +602,56 @@ where unwind: Unwind, ptr_based: bool, ) -> BasicBlock { - let copy = |place: &Place<'tcx>| Operand::Copy(place.clone()); - let move_ = |place: &Place<'tcx>| Operand::Move(place.clone()); + let copy = |place: Place<'tcx>| Operand::Copy(place); + let move_ = |place: Place<'tcx>| Operand::Move(place); let tcx = self.tcx(); - let ref_ty = tcx.mk_ref(tcx.lifetimes.re_erased, ty::TypeAndMut { - ty: ety, - mutbl: hir::Mutability::Mutable - }); - let ptr = &Place::from(self.new_temp(ref_ty)); - let can_go = &Place::from(self.new_temp(tcx.types.bool)); + let ptr_ty = tcx.mk_ptr(ty::TypeAndMut { ty: ety, mutbl: hir::Mutability::Mut }); + let ptr = &Place::from(self.new_temp(ptr_ty)); + let can_go = Place::from(self.new_temp(tcx.types.bool)); let one = self.constant_usize(1); let (ptr_next, cur_next) = if ptr_based { - (Rvalue::Ref( - tcx.lifetimes.re_erased, - BorrowKind::Mut { allow_two_phase_borrow: false }, - Place { - base: PlaceBase::Local(cur), - projection: tcx.intern_place_elems(&vec![ProjectionElem::Deref]), - } - ), - Rvalue::BinaryOp(BinOp::Offset, move_(&Place::from(cur)), one)) + (Rvalue::Use(copy(cur.into())), Rvalue::BinaryOp(BinOp::Offset, move_(cur.into()), one)) } else { - (Rvalue::Ref( - tcx.lifetimes.re_erased, - BorrowKind::Mut { allow_two_phase_borrow: false }, - tcx.mk_place_index(self.place.clone(), cur)), - Rvalue::BinaryOp(BinOp::Add, move_(&Place::from(cur)), one)) + ( + Rvalue::AddressOf(Mutability::Mut, tcx.mk_place_index(self.place.clone(), cur)), + Rvalue::BinaryOp(BinOp::Add, move_(cur.into()), one), + ) }; let drop_block = BasicBlockData { - statements: vec![ - self.assign(ptr, ptr_next), - self.assign(&Place::from(cur), cur_next) - ], + statements: vec![self.assign(ptr, ptr_next), self.assign(&Place::from(cur), cur_next)], is_cleanup: unwind.is_cleanup(), terminator: Some(Terminator { source_info: self.source_info, // this gets overwritten by drop elaboration. kind: TerminatorKind::Unreachable, - }) + }), }; let drop_block = self.elaborator.patch().new_block(drop_block); let loop_block = BasicBlockData { - statements: vec![ - self.assign(can_go, Rvalue::BinaryOp(BinOp::Eq, - copy(&Place::from(cur)), - copy(length_or_end))) - ], + statements: vec![self.assign( + &can_go, + Rvalue::BinaryOp(BinOp::Eq, copy(Place::from(cur)), copy(*length_or_end)), + )], is_cleanup: unwind.is_cleanup(), terminator: Some(Terminator { source_info: self.source_info, - kind: TerminatorKind::if_(tcx, move_(can_go), succ, drop_block) - }) + kind: TerminatorKind::if_(tcx, move_(can_go), succ, drop_block), + }), }; let loop_block = self.elaborator.patch().new_block(loop_block); - self.elaborator.patch().patch_terminator(drop_block, TerminatorKind::Drop { - location: tcx.mk_place_deref(ptr.clone()), - target: loop_block, - unwind: unwind.into_option() - }); + self.elaborator.patch().patch_terminator( + drop_block, + TerminatorKind::Drop { + location: tcx.mk_place_deref(ptr.clone()), + target: loop_block, + unwind: unwind.into_option(), + }, + ); loop_block } @@ -672,13 +687,13 @@ where }) .collect(); - if fields.iter().any(|(_,path)| path.is_some()) { + if fields.iter().any(|(_, path)| path.is_some()) { let (succ, unwind) = self.drop_ladder_bottom(); - return self.drop_ladder(fields, succ, unwind).0 + return self.drop_ladder(fields, succ, unwind).0; } } - let move_ = |place: &Place<'tcx>| Operand::Move(place.clone()); + let move_ = |place: &Place<'tcx>| Operand::Move(*place); let elem_size = &Place::from(self.new_temp(tcx.types.usize)); let len = &Place::from(self.new_temp(tcx.types.usize)); @@ -687,7 +702,7 @@ where let base_block = BasicBlockData { statements: vec![ self.assign(elem_size, Rvalue::NullaryOp(NullOp::SizeOf, ety)), - self.assign(len, Rvalue::Len(self.place.clone())), + self.assign(len, Rvalue::Len(*self.place)), ], is_cleanup: self.unwind.is_cleanup(), terminator: Some(Terminator { @@ -701,7 +716,7 @@ where self.drop_loop_pair(ety, true, len.clone()), ], }, - }) + }), }; self.elaborator.patch().new_block(base_block) } @@ -717,59 +732,31 @@ where ) -> BasicBlock { debug!("drop_loop_pair({:?}, {:?})", ety, ptr_based); let tcx = self.tcx(); - let iter_ty = if ptr_based { - tcx.mk_mut_ptr(ety) - } else { - tcx.types.usize - }; + let iter_ty = if ptr_based { tcx.mk_mut_ptr(ety) } else { tcx.types.usize }; let cur = self.new_temp(iter_ty); - let length_or_end = if ptr_based { - // FIXME check if we want to make it return a `Place` directly - // if all use sites want a `Place::Base` anyway. - Place::from(self.new_temp(iter_ty)) - } else { - length.clone() - }; + let length_or_end = if ptr_based { Place::from(self.new_temp(iter_ty)) } else { length }; let unwind = self.unwind.map(|unwind| { - self.drop_loop(unwind, - cur, - &length_or_end, - ety, - Unwind::InCleanup, - ptr_based) + self.drop_loop(unwind, cur, &length_or_end, ety, Unwind::InCleanup, ptr_based) }); - let loop_block = self.drop_loop( - self.succ, - cur, - &length_or_end, - ety, - unwind, - ptr_based); + let loop_block = self.drop_loop(self.succ, cur, &length_or_end, ety, unwind, ptr_based); let cur = Place::from(cur); let drop_block_stmts = if ptr_based { let tmp_ty = tcx.mk_mut_ptr(self.place_ty(self.place)); let tmp = Place::from(self.new_temp(tmp_ty)); - // tmp = &mut P; + // tmp = &raw mut P; // cur = tmp as *mut T; // end = Offset(cur, len); vec![ - self.assign(&tmp, Rvalue::Ref( - tcx.lifetimes.re_erased, - BorrowKind::Mut { allow_two_phase_borrow: false }, - self.place.clone() - )), - self.assign( - &cur, - Rvalue::Cast(CastKind::Misc, Operand::Move(tmp), iter_ty), - ), + self.assign(&tmp, Rvalue::AddressOf(Mutability::Mut, *self.place)), + self.assign(&cur, Rvalue::Cast(CastKind::Misc, Operand::Move(tmp), iter_ty)), self.assign( &length_or_end, - Rvalue::BinaryOp(BinOp::Offset, Operand::Copy(cur), Operand::Move(length) - )), + Rvalue::BinaryOp(BinOp::Offset, Operand::Copy(cur), Operand::Move(length)), + ), ] } else { // cur = 0 (length already pushed) @@ -781,8 +768,8 @@ where is_cleanup: unwind.is_cleanup(), terminator: Some(Terminator { source_info: self.source_info, - kind: TerminatorKind::Goto { target: loop_block } - }) + kind: TerminatorKind::Goto { target: loop_block }, + }), }); // FIXME(#34708): handle partially-dropped array/slice elements. @@ -802,7 +789,7 @@ where let ty = self.place_ty(self.place); match ty.kind { ty::Closure(def_id, substs) => { - let tys : Vec<_> = substs.as_closure().upvar_tys(def_id, self.tcx()).collect(); + let tys: Vec<_> = substs.as_closure().upvar_tys(def_id, self.tcx()).collect(); self.open_drop_for_tuple(&tys) } // Note that `elaborate_drops` only drops the upvars of a generator, @@ -812,7 +799,7 @@ where // It effetively only contains upvars until the generator transformation runs. // See librustc_body/transform/generator.rs for more details. ty::Generator(def_id, substs, _) => { - let tys : Vec<_> = substs.as_generator().upvar_tys(def_id, self.tcx()).collect(); + let tys: Vec<_> = substs.as_generator().upvar_tys(def_id, self.tcx()).collect(); self.open_drop_for_tuple(&tys) } ty::Tuple(..) => { @@ -834,10 +821,10 @@ where ty::Array(ety, size) => { let size = size.try_eval_usize(self.tcx(), self.elaborator.param_env()); self.open_drop_for_array(ety, size) - }, + } ty::Slice(ety) => self.open_drop_for_array(ety, None), - _ => bug!("open drop from non-ADT `{:?}`", ty) + _ => bug!("open drop from non-ADT `{:?}`", ty), } } @@ -866,11 +853,12 @@ where self.drop_flag_test_block(drop_block, succ, unwind) } - fn drop_flag_reset_block(&mut self, - mode: DropFlagMode, - succ: BasicBlock, - unwind: Unwind) -> BasicBlock - { + fn drop_flag_reset_block( + &mut self, + mode: DropFlagMode, + succ: BasicBlock, + unwind: Unwind, + ) -> BasicBlock { debug!("drop_flag_reset_block({:?},{:?})", self, mode); let block = self.new_block(unwind, TerminatorKind::Goto { target: succ }); @@ -908,15 +896,18 @@ where ) -> BasicBlock { let tcx = self.tcx(); let unit_temp = Place::from(self.new_temp(tcx.mk_unit())); - let free_func = tcx.require_lang_item( - lang_items::BoxFreeFnLangItem, - Some(self.source_info.span) - ); - let args = adt.variants[VariantIdx::new(0)].fields.iter().enumerate().map(|(i, f)| { - let field = Field::new(i); - let field_ty = f.ty(tcx, substs); - Operand::Move(tcx.mk_place_field(self.place.clone(), field, field_ty)) - }).collect(); + let free_func = + tcx.require_lang_item(lang_items::BoxFreeFnLangItem, Some(self.source_info.span)); + let args = adt.variants[VariantIdx::new(0)] + .fields + .iter() + .enumerate() + .map(|(i, f)| { + let field = Field::new(i); + let field_ty = f.ty(tcx, substs); + Operand::Move(tcx.mk_place_field(self.place.clone(), field, field_ty)) + }) + .collect(); let call = TerminatorKind::Call { func: Operand::function_handle(tcx, free_func, substs, self.source_info.span), @@ -933,23 +924,22 @@ where } fn drop_block(&mut self, target: BasicBlock, unwind: Unwind) -> BasicBlock { - let block = TerminatorKind::Drop { - location: self.place.clone(), - target, - unwind: unwind.into_option() - }; + let block = + TerminatorKind::Drop { location: *self.place, target, unwind: unwind.into_option() }; self.new_block(unwind, block) } - fn drop_flag_test_block(&mut self, - on_set: BasicBlock, - on_unset: BasicBlock, - unwind: Unwind) - -> BasicBlock - { + fn drop_flag_test_block( + &mut self, + on_set: BasicBlock, + on_unset: BasicBlock, + unwind: Unwind, + ) -> BasicBlock { let style = self.elaborator.drop_style(self.path, DropFlagMode::Shallow); - debug!("drop_flag_test_block({:?},{:?},{:?},{:?}) - {:?}", - self, on_set, on_unset, unwind, style); + debug!( + "drop_flag_test_block({:?},{:?},{:?},{:?}) - {:?}", + self, on_set, on_unset, unwind, style + ); match style { DropStyle::Dead => on_unset, @@ -965,10 +955,8 @@ where fn new_block(&mut self, unwind: Unwind, k: TerminatorKind<'tcx>) -> BasicBlock { self.elaborator.patch().new_block(BasicBlockData { statements: vec![], - terminator: Some(Terminator { - source_info: self.source_info, kind: k - }), - is_cleanup: unwind.is_cleanup() + terminator: Some(Terminator { source_info: self.source_info, kind: k }), + is_cleanup: unwind.is_cleanup(), }) } @@ -990,9 +978,6 @@ where } fn assign(&self, lhs: &Place<'tcx>, rhs: Rvalue<'tcx>) -> Statement<'tcx> { - Statement { - source_info: self.source_info, - kind: StatementKind::Assign(box(lhs.clone(), rhs)) - } + Statement { source_info: self.source_info, kind: StatementKind::Assign(box (*lhs, rhs)) } } } diff --git a/src/librustc_mir/util/graphviz.rs b/src/librustc_mir/util/graphviz.rs index a44d4014b4..8291bc9588 100644 --- a/src/librustc_mir/util/graphviz.rs +++ b/src/librustc_mir/util/graphviz.rs @@ -1,6 +1,6 @@ -use rustc::hir::def_id::DefId; use rustc::mir::*; use rustc::ty::TyCtxt; +use rustc_hir::def_id::DefId; use rustc_index::vec::Idx; use std::fmt::Debug; use std::io::{self, Write}; @@ -8,11 +8,7 @@ use std::io::{self, Write}; use super::pretty::dump_mir_def_ids; /// Write a graphviz DOT graph of a list of MIRs. -pub fn write_mir_graphviz( - tcx: TyCtxt<'_>, - single: Option, - w: &mut W, -) -> io::Result<()> +pub fn write_mir_graphviz(tcx: TyCtxt<'_>, single: Option, w: &mut W) -> io::Result<()> where W: Write, { @@ -38,11 +34,7 @@ where // Must match `[0-9A-Za-z_]*`. This does not appear in the rendered graph, so // it does not have to be user friendly. pub fn graphviz_safe_def_name(def_id: DefId) -> String { - format!( - "{}_{}", - def_id.krate.index(), - def_id.index.index(), - ) + format!("{}_{}", def_id.krate.index(), def_id.index.index(),) } /// Write a graphviz DOT graph of the MIR. @@ -88,24 +80,30 @@ where /// /// `init` and `fini` are callbacks for emitting additional rows of /// data (using HTML enclosed with `` in the emitted text). -pub fn write_node_label(block: BasicBlock, - body: &Body<'_>, - w: &mut W, - num_cols: u32, - init: INIT, - fini: FINI) -> io::Result<()> - where INIT: Fn(&mut W) -> io::Result<()>, - FINI: Fn(&mut W) -> io::Result<()> +pub fn write_node_label( + block: BasicBlock, + body: &Body<'_>, + w: &mut W, + num_cols: u32, + init: INIT, + fini: FINI, +) -> io::Result<()> +where + INIT: Fn(&mut W) -> io::Result<()>, + FINI: Fn(&mut W) -> io::Result<()>, { let data = &body[block]; write!(w, r#""#)?; // Basic block number at the top. - write!(w, r#""#, - attrs=r#"bgcolor="gray" align="center""#, - colspan=num_cols, - blk=block.index())?; + write!( + w, + r#""#, + attrs = r#"bgcolor="gray" align="center""#, + colspan = num_cols, + blk = block.index() + )?; init(w)?; @@ -179,11 +177,7 @@ fn write_graph_label<'tcx, W: Write>( if i > 0 { write!(w, ", ")?; } - write!(w, - "{:?}: {}", - Place::from(arg), - escape(&body.local_decls[arg].ty) - )?; + write!(w, "{:?}: {}", Place::from(arg), escape(&body.local_decls[arg].ty))?; } write!(w, ") -> {}", escape(&body.return_ty()))?; @@ -197,13 +191,16 @@ fn write_graph_label<'tcx, W: Write>( write!(w, "mut ")?; } - write!(w, r#"{:?}: {};
    "#, - Place::from(local), escape(&decl.ty))?; + write!(w, r#"{:?}: {};
    "#, Place::from(local), escape(&decl.ty))?; } for var_debug_info in &body.var_debug_info { - write!(w, r#"debug {} => {};
    "#, - var_debug_info.name, escape(&var_debug_info.place))?; + write!( + w, + r#"debug {} => {};
    "#, + var_debug_info.name, + escape(&var_debug_info.place) + )?; } writeln!(w, ">;") diff --git a/src/librustc_mir/util/liveness.rs b/src/librustc_mir/util/liveness.rs index 68c2e16399..1488bfe4d6 100644 --- a/src/librustc_mir/util/liveness.rs +++ b/src/librustc_mir/util/liveness.rs @@ -24,20 +24,20 @@ //! generator yield points, all pre-existing references are invalidated, so this //! doesn't matter). +use crate::transform::MirSource; +use crate::util::pretty::{dump_enabled, write_basic_block, write_mir_intro}; use rustc::mir::visit::{ - PlaceContext, Visitor, MutatingUseContext, NonMutatingUseContext, NonUseContext, + MutatingUseContext, NonMutatingUseContext, NonUseContext, PlaceContext, Visitor, }; use rustc::mir::Local; use rustc::mir::*; use rustc::ty::{self, TyCtxt}; +use rustc_data_structures::work_queue::WorkQueue; use rustc_index::bit_set::BitSet; use rustc_index::vec::{Idx, IndexVec}; -use rustc_data_structures::work_queue::WorkQueue; use std::fs; use std::io::{self, Write}; use std::path::{Path, PathBuf}; -use crate::transform::MirSource; -use crate::util::pretty::{dump_enabled, write_basic_block, write_mir_intro}; pub type LiveVarSet = BitSet; @@ -56,22 +56,14 @@ pub struct LivenessResult { /// Computes which local variables are live within the given function /// `mir`, including drops. -pub fn liveness_of_locals( - body: ReadOnlyBodyAndCache<'_, '_>, -) -> LivenessResult { +pub fn liveness_of_locals(body: ReadOnlyBodyAndCache<'_, '_>) -> LivenessResult { let num_live_vars = body.local_decls.len(); - let def_use: IndexVec<_, DefsUses> = body - .basic_blocks() - .iter() - .map(|b| block(b, num_live_vars)) - .collect(); + let def_use: IndexVec<_, DefsUses> = + body.basic_blocks().iter().map(|b| block(b, num_live_vars)).collect(); - let mut outs: IndexVec<_, LiveVarSet> = body - .basic_blocks() - .indices() - .map(|_| LiveVarSet::new_empty(num_live_vars)) - .collect(); + let mut outs: IndexVec<_, LiveVarSet> = + body.basic_blocks().indices().map(|_| LiveVarSet::new_empty(num_live_vars)).collect(); let mut bits = LiveVarSet::new_empty(num_live_vars); @@ -83,8 +75,7 @@ pub fn liveness_of_locals( // FIXME(ecstaticmorse): Reverse post-order on the reverse CFG may generate a better iteration // order when cycles are present, but the overhead of computing the reverse CFG may outweigh // any benefits. Benchmark this and find out. - let mut dirty_queue: WorkQueue - = WorkQueue::with_none(body.basic_blocks().len()); + let mut dirty_queue: WorkQueue = WorkQueue::with_none(body.basic_blocks().len()); for (bb, _) in traversal::postorder(&body) { dirty_queue.insert(bb); } @@ -167,6 +158,8 @@ pub fn categorize(context: PlaceContext) -> Option { PlaceContext::NonMutatingUse(NonMutatingUseContext::ShallowBorrow) | PlaceContext::NonMutatingUse(NonMutatingUseContext::UniqueBorrow) | + PlaceContext::MutatingUse(MutatingUseContext::AddressOf) | + PlaceContext::NonMutatingUse(NonMutatingUseContext::AddressOf) | PlaceContext::NonMutatingUse(NonMutatingUseContext::Inspect) | PlaceContext::NonMutatingUse(NonMutatingUseContext::Copy) | PlaceContext::NonMutatingUse(NonMutatingUseContext::Move) | @@ -190,8 +183,7 @@ pub fn categorize(context: PlaceContext) -> Option { } } -struct DefsUsesVisitor -{ +struct DefsUsesVisitor { defs_uses: DefsUses, } @@ -236,8 +228,7 @@ impl DefsUses { } } -impl<'tcx> Visitor<'tcx> for DefsUsesVisitor -{ +impl<'tcx> Visitor<'tcx> for DefsUsesVisitor { fn visit_local(&mut self, &local: &Local, context: PlaceContext, _: Location) { match categorize(context) { Some(DefUse::Def) => self.defs_uses.add_def(local), @@ -247,10 +238,7 @@ impl<'tcx> Visitor<'tcx> for DefsUsesVisitor } } -fn block( - b: &BasicBlockData<'_>, - locals: usize, -) -> DefsUses { +fn block(b: &BasicBlockData<'_>, locals: usize) -> DefsUses { let mut visitor = DefsUsesVisitor { defs_uses: DefsUses { defs: LiveVarSet::new_empty(locals), @@ -258,10 +246,7 @@ fn block( }, }; - let dummy_location = Location { - block: BasicBlock::new(0), - statement_index: 0, - }; + let dummy_location = Location { block: BasicBlock::new(0), statement_index: 0 }; // Visit the various parts of the basic block in reverse. If we go // forward, the logic in `add_def` and `add_use` would be wrong. @@ -323,10 +308,8 @@ pub fn write_mir_fn<'tcx>( write_mir_intro(tcx, src, body, w)?; for block in body.basic_blocks().indices() { let print = |w: &mut dyn Write, prefix, result: &IndexVec| { - let live: Vec = result[block] - .iter() - .map(|local| format!("{:?}", local)) - .collect(); + let live: Vec = + result[block].iter().map(|local| format!("{:?}", local)).collect(); writeln!(w, "{} {{{}}}", prefix, live.join(", ")) }; write_basic_block(tcx, block, body, &mut |_, _| Ok(()), w)?; diff --git a/src/librustc_mir/util/mod.rs b/src/librustc_mir/util/mod.rs index c8a90a9891..bb9d168d91 100644 --- a/src/librustc_mir/util/mod.rs +++ b/src/librustc_mir/util/mod.rs @@ -1,17 +1,17 @@ pub mod aggregate; pub mod borrowck_errors; -pub mod elaborate_drops; pub mod def_use; +pub mod elaborate_drops; pub mod patch; mod alignment; +pub mod collect_writes; mod graphviz; -pub(crate) mod pretty; pub mod liveness; -pub mod collect_writes; +pub(crate) mod pretty; pub use self::aggregate::expand_aggregate; pub use self::alignment::is_disaligned; -pub use self::pretty::{dump_enabled, dump_mir, write_mir_pretty, PassWhere}; -pub use self::graphviz::{graphviz_safe_def_name, write_mir_graphviz}; pub use self::graphviz::write_node_label as write_graphviz_node_label; +pub use self::graphviz::{graphviz_safe_def_name, write_mir_graphviz}; +pub use self::pretty::{dump_enabled, dump_mir, write_mir_pretty, PassWhere}; diff --git a/src/librustc_mir/util/patch.rs b/src/librustc_mir/util/patch.rs index 575b6d25de..68aa82f902 100644 --- a/src/librustc_mir/util/patch.rs +++ b/src/librustc_mir/util/patch.rs @@ -1,7 +1,7 @@ -use rustc::ty::Ty; use rustc::mir::*; -use rustc_index::vec::{IndexVec, Idx}; -use syntax_pos::Span; +use rustc::ty::Ty; +use rustc_index::vec::{Idx, IndexVec}; +use rustc_span::Span; /// This struct represents a patch to MIR, which can add /// new statements and basic blocks and patch over block @@ -25,7 +25,7 @@ impl<'tcx> MirPatch<'tcx> { new_locals: vec![], next_local: body.local_decls.len(), resume_block: START_BLOCK, - make_nop: vec![] + make_nop: vec![], }; // make sure the MIR we create has a resume block. It is @@ -43,26 +43,23 @@ impl<'tcx> MirPatch<'tcx> { } else { resume_block = Some(bb); } - break + break; } } let resume_block = resume_block.unwrap_or_else(|| { result.new_block(BasicBlockData { statements: vec![], terminator: Some(Terminator { - source_info: SourceInfo { - span: body.span, - scope: OUTERMOST_SOURCE_SCOPE - }, - kind: TerminatorKind::Resume + source_info: SourceInfo { span: body.span, scope: OUTERMOST_SOURCE_SCOPE }, + kind: TerminatorKind::Resume, }), - is_cleanup: true - })}); + is_cleanup: true, + }) + }); result.resume_block = resume_block; if let Some(resume_stmt_block) = resume_stmt_block { - result.patch_terminator(resume_stmt_block, TerminatorKind::Goto { - target: resume_block - }); + result + .patch_terminator(resume_stmt_block, TerminatorKind::Goto { target: resume_block }); } result } @@ -78,12 +75,9 @@ impl<'tcx> MirPatch<'tcx> { pub fn terminator_loc(&self, body: &Body<'tcx>, bb: BasicBlock) -> Location { let offset = match bb.index().checked_sub(body.basic_blocks().len()) { Some(index) => self.new_blocks[index].statements.len(), - None => body[bb].statements.len() + None => body[bb].statements.len(), }; - Location { - block: bb, - statement_index: offset - } + Location { block: bb, statement_index: offset } } pub fn new_temp(&mut self, ty: Ty<'tcx>, span: Span) -> Local { @@ -120,7 +114,7 @@ impl<'tcx> MirPatch<'tcx> { } pub fn add_assign(&mut self, loc: Location, place: Place<'tcx>, rv: Rvalue<'tcx>) { - self.add_statement(loc, StatementKind::Assign(box(place, rv))); + self.add_statement(loc, StatementKind::Assign(box (place, rv))); } pub fn make_nop(&mut self, loc: Location) { @@ -132,10 +126,17 @@ impl<'tcx> MirPatch<'tcx> { for loc in self.make_nop { body.make_statement_nop(loc); } - debug!("MirPatch: {:?} new temps, starting from index {}: {:?}", - self.new_locals.len(), body.local_decls.len(), self.new_locals); - debug!("MirPatch: {} new blocks, starting from index {}", - self.new_blocks.len(), body.basic_blocks().len()); + debug!( + "MirPatch: {:?} new temps, starting from index {}: {:?}", + self.new_locals.len(), + body.local_decls.len(), + self.new_locals + ); + debug!( + "MirPatch: {} new blocks, starting from index {}", + self.new_blocks.len(), + body.basic_blocks().len() + ); body.basic_blocks_mut().extend(self.new_blocks); body.local_decls.extend(self.new_locals); for (src, patch) in self.patch_map.into_iter_enumerated() { @@ -155,17 +156,12 @@ impl<'tcx> MirPatch<'tcx> { delta = 0; last_bb = loc.block; } - debug!("MirPatch: adding statement {:?} at loc {:?}+{}", - stmt, loc, delta); + debug!("MirPatch: adding statement {:?} at loc {:?}+{}", stmt, loc, delta); loc.statement_index += delta; - let source_info = Self::source_info_for_index( - &body[loc.block], loc - ); - body[loc.block].statements.insert( - loc.statement_index, Statement { - source_info, - kind: stmt - }); + let source_info = Self::source_info_for_index(&body[loc.block], loc); + body[loc.block] + .statements + .insert(loc.statement_index, Statement { source_info, kind: stmt }); delta += 1; } } @@ -173,14 +169,14 @@ impl<'tcx> MirPatch<'tcx> { pub fn source_info_for_index(data: &BasicBlockData<'_>, loc: Location) -> SourceInfo { match data.statements.get(loc.statement_index) { Some(stmt) => stmt.source_info, - None => data.terminator().source_info + None => data.terminator().source_info, } } pub fn source_info_for_location(&self, body: &Body<'_>, loc: Location) -> SourceInfo { let data = match loc.block.index().checked_sub(body.basic_blocks().len()) { Some(new) => &self.new_blocks[new], - None => &body[loc.block] + None => &body[loc.block], }; Self::source_info_for_index(data, loc) } diff --git a/src/librustc_mir/util/pretty.rs b/src/librustc_mir/util/pretty.rs index 36194335a5..e0919e7e8f 100644 --- a/src/librustc_mir/util/pretty.rs +++ b/src/librustc_mir/util/pretty.rs @@ -1,16 +1,16 @@ -use rustc::hir::def_id::{DefId, LOCAL_CRATE}; -use rustc::mir::*; +use super::graphviz::write_mir_fn_graphviz; +use crate::transform::MirSource; use rustc::mir::visit::Visitor; +use rustc::mir::*; use rustc::ty::{self, TyCtxt}; use rustc_data_structures::fx::FxHashMap; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_index::vec::Idx; use std::fmt::Display; use std::fmt::Write as _; use std::fs; use std::io::{self, Write}; use std::path::{Path, PathBuf}; -use super::graphviz::write_mir_fn_graphviz; -use crate::transform::MirSource; const INDENT: &str = " "; /// Alignment for lining up comments following MIR statements @@ -178,9 +178,7 @@ fn dump_path( let mut file_path = PathBuf::new(); file_path.push(Path::new(&tcx.sess.opts.debugging_opts.dump_mir_dir)); - let item_name = tcx - .def_path(source.def_id()) - .to_filename_friendly_no_crate(); + let item_name = tcx.def_path(source.def_id()).to_filename_friendly_no_crate(); // All drop shims have the same DefId, so we have to add the type // to get unique file names. let shim_disambiguator = match source.instance { @@ -188,13 +186,11 @@ fn dump_path( // Unfortunately, pretty-printed typed are not very filename-friendly. // We dome some filtering. let mut s = ".".to_owned(); - s.extend(ty.to_string() - .chars() - .filter_map(|c| match c { - ' ' => None, - ':' | '<' | '>' => Some('_'), - c => Some(c) - })); + s.extend(ty.to_string().chars().filter_map(|c| match c { + ' ' => None, + ':' | '<' | '>' => Some('_'), + c => Some(c), + })); s } _ => String::new(), @@ -202,13 +198,7 @@ fn dump_path( let file_name = format!( "rustc.{}{}{}{}.{}.{}.{}", - item_name, - shim_disambiguator, - promotion_id, - pass_num, - pass_name, - disambiguator, - extension, + item_name, shim_disambiguator, promotion_id, pass_num, pass_name, disambiguator, extension, ); file_path.push(&file_name); @@ -241,14 +231,8 @@ pub fn write_mir_pretty<'tcx>( single: Option, w: &mut dyn Write, ) -> io::Result<()> { - writeln!( - w, - "// WARNING: This output format is intended for human consumers only" - )?; - writeln!( - w, - "// and is subject to change without notice. Knock yourself out." - )?; + writeln!(w, "// WARNING: This output format is intended for human consumers only")?; + writeln!(w, "// and is subject to change without notice. Knock yourself out.")?; let mut first = true; for def_id in dump_mir_def_ids(tcx, single) { @@ -265,10 +249,7 @@ pub fn write_mir_pretty<'tcx>( for (i, body) in tcx.promoted_mir(def_id).iter_enumerated() { writeln!(w, "")?; - let src = MirSource { - instance: ty::InstanceDef::Item(def_id), - promoted: Some(i), - }; + let src = MirSource { instance: ty::InstanceDef::Item(def_id), promoted: Some(i) }; write_mir_fn(tcx, src, body, &mut |_, _| Ok(()), w)?; } } @@ -316,10 +297,7 @@ where writeln!(w, "{}{:?}{}: {{", INDENT, block, cleanup_text)?; // List of statements in the middle. - let mut current_location = Location { - block: block, - statement_index: 0, - }; + let mut current_location = Location { block: block, statement_index: 0 }; for statement in &data.statements { extra_data(PassWhere::BeforeLocation(current_location), w)?; let indented_body = format!("{0}{0}{1:?};", INDENT, statement); @@ -370,10 +348,7 @@ fn write_extra<'tcx, F>(tcx: TyCtxt<'tcx>, write: &mut dyn Write, mut visit_op: where F: FnMut(&mut ExtraComments<'tcx>), { - let mut extra_comments = ExtraComments { - _tcx: tcx, - comments: vec![], - }; + let mut extra_comments = ExtraComments { _tcx: tcx, comments: vec![] }; visit_op(&mut extra_comments); for comment in extra_comments.comments { writeln!(write, "{:A$} // {}", "", comment, A = ALIGN)?; @@ -445,11 +420,7 @@ impl Visitor<'tcx> for ExtraComments<'tcx> { } fn comment(tcx: TyCtxt<'_>, SourceInfo { span, scope }: SourceInfo) -> String { - format!( - "scope {} at {}", - scope.index(), - tcx.sess.source_map().span_to_string(span) - ) + format!("scope {} at {}", scope.index(), tcx.sess.source_map().span_to_string(span)) } /// Prints local variables in a scope tree. @@ -472,10 +443,7 @@ fn write_scope_tree( let indented_debug_info = format!( "{0:1$}debug {2} => {3:?};", - INDENT, - indent, - var_debug_info.name, - var_debug_info.place, + INDENT, indent, var_debug_info.name, var_debug_info.place, ); writeln!( @@ -489,7 +457,7 @@ fn write_scope_tree( // Local variable types (including the user's name in a comment). for (local, local_decl) in body.local_decls.iter_enumerated() { - if (1..body.arg_count+1).contains(&local.index()) { + if (1..body.arg_count + 1).contains(&local.index()) { // Skip over argument locals, they're printed in the signature. continue; } @@ -499,30 +467,17 @@ fn write_scope_tree( continue; } - let mut_str = if local_decl.mutability == Mutability::Mut { - "mut " - } else { - "" - }; + let mut_str = if local_decl.mutability == Mutability::Mut { "mut " } else { "" }; - let mut indented_decl = format!( - "{0:1$}let {2}{3:?}: {4:?}", - INDENT, - indent, - mut_str, - local, - local_decl.ty - ); + let mut indented_decl = + format!("{0:1$}let {2}{3:?}: {4:?}", INDENT, indent, mut_str, local, local_decl.ty); for user_ty in local_decl.user_ty.projections() { write!(indented_decl, " as {:?}", user_ty).unwrap(); } indented_decl.push_str(";"); - let local_name = if local == RETURN_PLACE { - format!(" return place") - } else { - String::new() - }; + let local_name = + if local == RETURN_PLACE { format!(" return place") } else { String::new() }; writeln!( w, @@ -564,10 +519,7 @@ pub fn write_mir_intro<'tcx>( let mut scope_tree: FxHashMap> = Default::default(); for (index, scope_data) in body.source_scopes.iter().enumerate() { if let Some(parent) = scope_data.parent_scope { - scope_tree - .entry(parent) - .or_default() - .push(SourceScope::new(index)); + scope_tree.entry(parent).or_default().push(SourceScope::new(index)); } else { // Only the argument scope has no parent, because it's the root. assert_eq!(index, OUTERMOST_SOURCE_SCOPE.index()); @@ -588,24 +540,22 @@ fn write_mir_sig( body: &Body<'_>, w: &mut dyn Write, ) -> io::Result<()> { - use rustc::hir::def::DefKind; + use rustc_hir::def::DefKind; trace!("write_mir_sig: {:?}", src.instance); let kind = tcx.def_kind(src.def_id()); let is_function = match kind { - Some(DefKind::Fn) - | Some(DefKind::Method) - | Some(DefKind::Ctor(..)) => true, + Some(DefKind::Fn) | Some(DefKind::Method) | Some(DefKind::Ctor(..)) => true, _ => tcx.is_closure(src.def_id()), }; match (kind, src.promoted) { (_, Some(i)) => write!(w, "{:?} in ", i)?, - (Some(DefKind::Const), _) - | (Some(DefKind::AssocConst), _) => write!(w, "const ")?, - (Some(DefKind::Static), _) => - write!(w, "static {}", if tcx.is_mutable_static(src.def_id()) { "mut " } else { "" })?, + (Some(DefKind::Const), _) | (Some(DefKind::AssocConst), _) => write!(w, "const ")?, + (Some(DefKind::Static), _) => { + write!(w, "static {}", if tcx.is_mutable_static(src.def_id()) { "mut " } else { "" })? + } (_, _) if is_function => write!(w, "fn ")?, - (None, _) => {}, // things like anon const, not an item + (None, _) => {} // things like anon const, not an item _ => bug!("Unexpected def kind {:?}", kind), } @@ -656,9 +606,5 @@ fn write_user_type_annotations(body: &Body<'_>, w: &mut dyn Write) -> io::Result } pub fn dump_mir_def_ids(tcx: TyCtxt<'_>, single: Option) -> Vec { - if let Some(i) = single { - vec![i] - } else { - tcx.mir_keys(LOCAL_CRATE).iter().cloned().collect() - } + if let Some(i) = single { vec![i] } else { tcx.mir_keys(LOCAL_CRATE).iter().cloned().collect() } } diff --git a/src/librustc_mir_build/Cargo.toml b/src/librustc_mir_build/Cargo.toml new file mode 100644 index 0000000000..a22c4d18d5 --- /dev/null +++ b/src/librustc_mir_build/Cargo.toml @@ -0,0 +1,28 @@ +[package] +authors = ["The Rust Project Developers"] +name = "rustc_mir_build" +version = "0.0.0" +edition = "2018" + +[lib] +name = "rustc_mir_build" +path = "lib.rs" +doctest = false + +[dependencies] +arena = { path = "../libarena" } +itertools = "0.8" +log = "0.4" +rustc = { path = "../librustc" } +rustc_apfloat = { path = "../librustc_apfloat" } +rustc_data_structures = { path = "../librustc_data_structures" } +rustc_index = { path = "../librustc_index" } +rustc_errors = { path = "../librustc_errors" } +rustc_hir = { path = "../librustc_hir" } +rustc_macros = { path = "../librustc_macros" } +rustc_serialize = { path = "../libserialize", package = "serialize" } +rustc_session = { path = "../librustc_session" } +rustc_span = { path = "../librustc_span" } +rustc_target = { path = "../librustc_target" } +syntax = { path = "../libsyntax" } +smallvec = { version = "1.0", features = ["union", "may_dangle"] } diff --git a/src/librustc_mir/build/block.rs b/src/librustc_mir_build/build/block.rs similarity index 62% rename from src/librustc_mir/build/block.rs rename to src/librustc_mir_build/build/block.rs index 7353ca9285..c517d3113c 100644 --- a/src/librustc_mir/build/block.rs +++ b/src/librustc_mir_build/build/block.rs @@ -1,18 +1,19 @@ -use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder}; -use crate::build::ForGuard::OutsideGuard; use crate::build::matches::ArmHasGuard; +use crate::build::ForGuard::OutsideGuard; +use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder}; use crate::hair::*; use rustc::mir::*; -use rustc::hir; -use syntax_pos::Span; +use rustc_hir as hir; +use rustc_span::Span; impl<'a, 'tcx> Builder<'a, 'tcx> { - pub fn ast_block(&mut self, - destination: &Place<'tcx>, - block: BasicBlock, - ast_block: &'tcx hir::Block, - source_info: SourceInfo) - -> BlockAnd<()> { + crate fn ast_block( + &mut self, + destination: &Place<'tcx>, + block: BasicBlock, + ast_block: &'tcx hir::Block<'tcx>, + source_info: SourceInfo, + ) -> BlockAnd<()> { let Block { region_scope, opt_destruction_scope, @@ -20,38 +21,35 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { stmts, expr, targeted_by_break, - safety_mode - } = - self.hir.mirror(ast_block); - self.in_opt_scope(opt_destruction_scope.map(|de|(de, source_info)), move |this| { + safety_mode, + } = self.hir.mirror(ast_block); + self.in_opt_scope(opt_destruction_scope.map(|de| (de, source_info)), move |this| { this.in_scope((region_scope, source_info), LintLevel::Inherited, move |this| { if targeted_by_break { // This is a `break`-able block let exit_block = this.cfg.start_new_block(); - let block_exit = this.in_breakable_scope( - None, exit_block, destination.clone(), |this| { - this.ast_block_stmts(destination, block, span, stmts, expr, - safety_mode) + let block_exit = + this.in_breakable_scope(None, exit_block, destination.clone(), |this| { + this.ast_block_stmts(destination, block, span, stmts, expr, safety_mode) }); - this.cfg.terminate(unpack!(block_exit), source_info, - TerminatorKind::Goto { target: exit_block }); + this.cfg.goto(unpack!(block_exit), source_info, exit_block); exit_block.unit() } else { - this.ast_block_stmts(destination, block, span, stmts, expr, - safety_mode) + this.ast_block_stmts(destination, block, span, stmts, expr, safety_mode) } }) }) } - fn ast_block_stmts(&mut self, - destination: &Place<'tcx>, - mut block: BasicBlock, - span: Span, - stmts: Vec>, - expr: Option>, - safety_mode: BlockSafety) - -> BlockAnd<()> { + fn ast_block_stmts( + &mut self, + destination: &Place<'tcx>, + mut block: BasicBlock, + span: Span, + stmts: Vec>, + expr: Option>, + safety_mode: BlockSafety, + ) -> BlockAnd<()> { let this = self; // This convoluted structure is to avoid using recursion as we walk down a list @@ -82,27 +80,22 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { match kind { StmtKind::Expr { scope, expr } => { this.block_context.push(BlockFrame::Statement { ignores_expr_result: true }); - unpack!(block = this.in_opt_scope( - opt_destruction_scope.map(|de|(de, source_info)), |this| { - let si = (scope, source_info); - this.in_scope(si, LintLevel::Inherited, |this| { - let expr = this.hir.mirror(expr); - this.stmt_expr(block, expr, Some(scope)) - }) - })); + unpack!( + block = this.in_opt_scope( + opt_destruction_scope.map(|de| (de, source_info)), + |this| { + let si = (scope, source_info); + this.in_scope(si, LintLevel::Inherited, |this| { + let expr = this.hir.mirror(expr); + this.stmt_expr(block, expr, Some(scope)) + }) + } + ) + ); } - StmtKind::Let { - remainder_scope, - init_scope, - pattern, - initializer, - lint_level - } => { - let ignores_expr_result = if let PatKind::Wild = *pattern.kind { - true - } else { - false - }; + StmtKind::Let { remainder_scope, init_scope, pattern, initializer, lint_level } => { + let ignores_expr_result = + if let PatKind::Wild = *pattern.kind { true } else { false }; this.block_context.push(BlockFrame::Statement { ignores_expr_result }); // Enter the remainder scope, i.e., the bindings' destruction scope. @@ -110,8 +103,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let_scope_stack.push(remainder_scope); // Declare the bindings, which may create a source scope. - let remainder_span = remainder_scope.span(this.hir.tcx(), - &this.hir.region_scope_tree); + let remainder_span = + remainder_scope.span(this.hir.tcx(), &this.hir.region_scope_tree); let visibility_scope = Some(this.new_source_scope(remainder_span, LintLevel::Inherited, None)); @@ -120,20 +113,24 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { if let Some(init) = initializer { let initializer_span = init.span(); - unpack!(block = this.in_opt_scope( - opt_destruction_scope.map(|de|(de, source_info)), |this| { - let scope = (init_scope, source_info); - this.in_scope(scope, lint_level, |this| { - this.declare_bindings( - visibility_scope, - remainder_span, - &pattern, - ArmHasGuard(false), - Some((None, initializer_span)), - ); - this.expr_into_pattern(block, pattern, init) - }) - })); + unpack!( + block = this.in_opt_scope( + opt_destruction_scope.map(|de| (de, source_info)), + |this| { + let scope = (init_scope, source_info); + this.in_scope(scope, lint_level, |this| { + this.declare_bindings( + visibility_scope, + remainder_span, + &pattern, + ArmHasGuard(false), + Some((None, initializer_span)), + ); + this.expr_into_pattern(block, pattern, init) + }) + } + ) + ); } else { let scope = (init_scope, source_info); unpack!(this.in_scope(scope, lint_level, |this| { @@ -154,7 +151,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { &mut |this, _, _, _, node, span, _, _| { this.storage_live_binding(block, node, span, OutsideGuard); this.schedule_drop_for_binding(node, span, OutsideGuard); - }) + }, + ) } // Enter the visibility scope, after evaluating the initializer. @@ -165,7 +163,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } let popped = this.block_context.pop(); - assert!(popped.map_or(false, |bf|bf.is_statement())); + assert!(popped.map_or(false, |bf| bf.is_statement())); } // Then, the block may have an optional trailing expression which is a “return” value @@ -173,14 +171,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let tcx = this.hir.tcx(); let destination_ty = destination.ty(&this.local_decls, tcx).ty; if let Some(expr) = expr { - let tail_result_is_ignored = destination_ty.is_unit() || - this.block_context.currently_ignores_tail_results(); + let tail_result_is_ignored = + destination_ty.is_unit() || this.block_context.currently_ignores_tail_results(); this.block_context.push(BlockFrame::TailExpr { tail_result_is_ignored }); unpack!(block = this.into(destination, block, expr)); let popped = this.block_context.pop(); - assert!(popped.map_or(false, |bf|bf.is_tail_expr())); + assert!(popped.map_or(false, |bf| bf.is_tail_expr())); } else { // If a block has no trailing expression, then it is given an implicit return type. // This return type is usually `()`, unless the block is diverging, in which case the @@ -205,10 +203,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } /// If we are changing the safety mode, create a new source scope - fn update_source_scope_for_safety_mode(&mut self, - span: Span, - safety_mode: BlockSafety) - { + fn update_source_scope_for_safety_mode(&mut self, span: Span, safety_mode: BlockSafety) { debug!("update_source_scope_for({:?}, {:?})", span, safety_mode); let new_unsafety = match safety_mode { BlockSafety::Safe => None, @@ -216,7 +211,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { assert_eq!(self.push_unsafe_count, 0); match self.unpushed_unsafe { Safety::Safe => {} - _ => return + _ => return, } self.unpushed_unsafe = Safety::ExplicitUnsafe(hir_id); Some(Safety::ExplicitUnsafe(hir_id)) @@ -226,21 +221,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { Some(Safety::BuiltinUnsafe) } BlockSafety::PopUnsafe => { - self.push_unsafe_count = - self.push_unsafe_count.checked_sub(1).unwrap_or_else(|| { - span_bug!(span, "unsafe count underflow") - }); - if self.push_unsafe_count == 0 { - Some(self.unpushed_unsafe) - } else { - None - } + self.push_unsafe_count = self + .push_unsafe_count + .checked_sub(1) + .unwrap_or_else(|| span_bug!(span, "unsafe count underflow")); + if self.push_unsafe_count == 0 { Some(self.unpushed_unsafe) } else { None } } }; if let Some(unsafety) = new_unsafety { - self.source_scope = self.new_source_scope( - span, LintLevel::Inherited, Some(unsafety)); + self.source_scope = self.new_source_scope(span, LintLevel::Inherited, Some(unsafety)); } } } diff --git a/src/librustc_mir_build/build/cfg.rs b/src/librustc_mir_build/build/cfg.rs new file mode 100644 index 0000000000..883aba18ec --- /dev/null +++ b/src/librustc_mir_build/build/cfg.rs @@ -0,0 +1,102 @@ +//! Routines for manipulating the control-flow graph. + +use crate::build::CFG; +use rustc::mir::*; + +impl<'tcx> CFG<'tcx> { + crate fn block_data(&self, blk: BasicBlock) -> &BasicBlockData<'tcx> { + &self.basic_blocks[blk] + } + + crate fn block_data_mut(&mut self, blk: BasicBlock) -> &mut BasicBlockData<'tcx> { + &mut self.basic_blocks[blk] + } + + // llvm.org/PR32488 makes this function use an excess of stack space. Mark + // it as #[inline(never)] to keep rustc's stack use in check. + #[inline(never)] + crate fn start_new_block(&mut self) -> BasicBlock { + self.basic_blocks.push(BasicBlockData::new(None)) + } + + crate fn start_new_cleanup_block(&mut self) -> BasicBlock { + let bb = self.start_new_block(); + self.block_data_mut(bb).is_cleanup = true; + bb + } + + crate fn push(&mut self, block: BasicBlock, statement: Statement<'tcx>) { + debug!("push({:?}, {:?})", block, statement); + self.block_data_mut(block).statements.push(statement); + } + + crate fn push_assign( + &mut self, + block: BasicBlock, + source_info: SourceInfo, + place: &Place<'tcx>, + rvalue: Rvalue<'tcx>, + ) { + self.push( + block, + Statement { source_info, kind: StatementKind::Assign(box (*place, rvalue)) }, + ); + } + + crate fn push_assign_constant( + &mut self, + block: BasicBlock, + source_info: SourceInfo, + temp: &Place<'tcx>, + constant: Constant<'tcx>, + ) { + self.push_assign(block, source_info, temp, Rvalue::Use(Operand::Constant(box constant))); + } + + crate fn push_assign_unit( + &mut self, + block: BasicBlock, + source_info: SourceInfo, + place: &Place<'tcx>, + ) { + self.push_assign( + block, + source_info, + place, + Rvalue::Aggregate(box AggregateKind::Tuple, vec![]), + ); + } + + crate fn push_fake_read( + &mut self, + block: BasicBlock, + source_info: SourceInfo, + cause: FakeReadCause, + place: Place<'tcx>, + ) { + let kind = StatementKind::FakeRead(cause, box place); + let stmt = Statement { source_info, kind }; + self.push(block, stmt); + } + + crate fn terminate( + &mut self, + block: BasicBlock, + source_info: SourceInfo, + kind: TerminatorKind<'tcx>, + ) { + debug!("terminating block {:?} <- {:?}", block, kind); + debug_assert!( + self.block_data(block).terminator.is_none(), + "terminate: block {:?}={:?} already has a terminator set", + block, + self.block_data(block) + ); + self.block_data_mut(block).terminator = Some(Terminator { source_info, kind }); + } + + /// In the `origin` block, push a `goto -> target` terminator. + crate fn goto(&mut self, origin: BasicBlock, source_info: SourceInfo, target: BasicBlock) { + self.terminate(origin, source_info, TerminatorKind::Goto { target }) + } +} diff --git a/src/librustc_mir/build/expr/as_constant.rs b/src/librustc_mir_build/build/expr/as_constant.rs similarity index 61% rename from src/librustc_mir/build/expr/as_constant.rs rename to src/librustc_mir_build/build/expr/as_constant.rs index 6db7ec6509..e485626297 100644 --- a/src/librustc_mir/build/expr/as_constant.rs +++ b/src/librustc_mir_build/build/expr/as_constant.rs @@ -8,7 +8,7 @@ use rustc::ty::CanonicalUserTypeAnnotation; impl<'a, 'tcx> Builder<'a, 'tcx> { /// Compile `expr`, yielding a compile-time constant. Assumes that /// `expr` is a valid compile-time constant! - pub fn as_constant(&mut self, expr: M) -> Constant<'tcx> + crate fn as_constant(&mut self, expr: M) -> Constant<'tcx> where M: Mirror<'tcx, Output = Expr<'tcx>>, { @@ -18,18 +18,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fn expr_as_constant(&mut self, expr: Expr<'tcx>) -> Constant<'tcx> { let this = self; - let Expr { - ty, - temp_lifetime: _, - span, - kind, - } = expr; + let Expr { ty, temp_lifetime: _, span, kind } = expr; match kind { - ExprKind::Scope { - region_scope: _, - lint_level: _, - value, - } => this.as_constant(value), + ExprKind::Scope { region_scope: _, lint_level: _, value } => this.as_constant(value), ExprKind::Literal { literal, user_ty } => { let user_ty = user_ty.map(|user_ty| { this.canonical_user_type_annotations.push(CanonicalUserTypeAnnotation { @@ -39,19 +30,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { }) }); assert_eq!(literal.ty, ty); - Constant { - span, - user_ty, - literal, - } - }, - ExprKind::StaticRef { literal, .. } => { - Constant { - span, - user_ty: None, - literal, - } + Constant { span, user_ty, literal } } + ExprKind::StaticRef { literal, .. } => Constant { span, user_ty: None, literal }, _ => span_bug!(span, "expression is not a valid constant {:?}", kind), } } diff --git a/src/librustc_mir/build/expr/as_operand.rs b/src/librustc_mir_build/build/expr/as_operand.rs similarity index 81% rename from src/librustc_mir/build/expr/as_operand.rs rename to src/librustc_mir_build/build/expr/as_operand.rs index 207399fbdc..efe328d2b3 100644 --- a/src/librustc_mir/build/expr/as_operand.rs +++ b/src/librustc_mir_build/build/expr/as_operand.rs @@ -13,7 +13,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// The operand returned from this function will *not be valid* after /// an ExprKind::Scope is passed, so please do *not* return it from /// functions to avoid bad miscompiles. - pub fn as_local_operand(&mut self, block: BasicBlock, expr: M) -> BlockAnd> + crate fn as_local_operand(&mut self, block: BasicBlock, expr: M) -> BlockAnd> where M: Mirror<'tcx, Output = Expr<'tcx>>, { @@ -27,7 +27,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// this time. /// /// The operand is known to be live until the end of `scope`. - pub fn as_operand( + crate fn as_operand( &mut self, block: BasicBlock, scope: Option, @@ -49,24 +49,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { debug!("expr_as_operand(block={:?}, expr={:?})", block, expr); let this = self; - if let ExprKind::Scope { - region_scope, - lint_level, - value, - } = expr.kind - { + if let ExprKind::Scope { region_scope, lint_level, value } = expr.kind { let source_info = this.source_info(expr.span); let region_scope = (region_scope, source_info); - return this.in_scope(region_scope, lint_level, |this| { - this.as_operand(block, scope, value) - }); + return this + .in_scope(region_scope, lint_level, |this| this.as_operand(block, scope, value)); } let category = Category::of(&expr.kind).unwrap(); - debug!( - "expr_as_operand: category={:?} for={:?}", - category, expr.kind - ); + debug!("expr_as_operand: category={:?} for={:?}", category, expr.kind); match category { Category::Constant => { let constant = this.as_constant(expr); diff --git a/src/librustc_mir/build/expr/as_place.rs b/src/librustc_mir_build/build/expr/as_place.rs similarity index 75% rename from src/librustc_mir/build/expr/as_place.rs rename to src/librustc_mir_build/build/expr/as_place.rs index ddacda72e1..f27760f692 100644 --- a/src/librustc_mir/build/expr/as_place.rs +++ b/src/librustc_mir_build/build/expr/as_place.rs @@ -5,10 +5,10 @@ use crate::build::ForGuard::{OutsideGuard, RefWithinGuard}; use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::hair::*; use rustc::middle::region; -use rustc::mir::interpret::{PanicInfo::BoundsCheck}; +use rustc::mir::interpret::PanicInfo::BoundsCheck; use rustc::mir::*; use rustc::ty::{self, CanonicalUserTypeAnnotation, Ty, TyCtxt, Variance}; -use syntax_pos::Span; +use rustc_span::Span; use rustc_index::vec::Idx; @@ -20,16 +20,13 @@ use rustc_index::vec::Idx; /// and `c` can be progressively pushed onto the place builder that is created when converting `a`. #[derive(Clone)] struct PlaceBuilder<'tcx> { - base: PlaceBase<'tcx>, + local: Local, projection: Vec>, } -impl PlaceBuilder<'tcx> { +impl<'tcx> PlaceBuilder<'tcx> { fn into_place(self, tcx: TyCtxt<'tcx>) -> Place<'tcx> { - Place { - base: self.base, - projection: tcx.intern_place_elems(&self.projection), - } + Place { local: self.local, projection: tcx.intern_place_elems(&self.projection) } } fn field(self, f: Field, ty: Ty<'tcx>) -> Self { @@ -50,21 +47,9 @@ impl PlaceBuilder<'tcx> { } } -impl From for PlaceBuilder<'tcx> { +impl<'tcx> From for PlaceBuilder<'tcx> { fn from(local: Local) -> Self { - Self { - base: local.into(), - projection: Vec::new(), - } - } -} - -impl From> for PlaceBuilder<'tcx> { - fn from(base: PlaceBase<'tcx>) -> Self { - Self { - base, - projection: Vec::new(), - } + Self { local, projection: Vec::new() } } } @@ -81,7 +66,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// Extra care is needed if any user code is allowed to run between calling /// this method and using it, as is the case for `match` and index /// expressions. - pub fn as_place(&mut self, mut block: BasicBlock, expr: M) -> BlockAnd> + crate fn as_place(&mut self, mut block: BasicBlock, expr: M) -> BlockAnd> where M: Mirror<'tcx, Output = Expr<'tcx>>, { @@ -104,7 +89,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// place. The place itself may or may not be mutable: /// * If this expr is a place expr like a.b, then we will return that place. /// * Otherwise, a temporary is created: in that event, it will be an immutable temporary. - pub fn as_read_only_place(&mut self, mut block: BasicBlock, expr: M) -> BlockAnd> + crate fn as_read_only_place( + &mut self, + mut block: BasicBlock, + expr: M, + ) -> BlockAnd> where M: Mirror<'tcx, Output = Expr<'tcx>>, { @@ -137,55 +126,40 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { mutability: Mutability, fake_borrow_temps: Option<&mut Vec>, ) -> BlockAnd> { - debug!( - "expr_as_place(block={:?}, expr={:?}, mutability={:?})", - block, expr, mutability - ); + debug!("expr_as_place(block={:?}, expr={:?}, mutability={:?})", block, expr, mutability); let this = self; let expr_span = expr.span; let source_info = this.source_info(expr_span); match expr.kind { - ExprKind::Scope { - region_scope, - lint_level, - value, - } => this.in_scope((region_scope, source_info), lint_level, |this| { - let value = this.hir.mirror(value); - this.expr_as_place(block, value, mutability, fake_borrow_temps) - }), + ExprKind::Scope { region_scope, lint_level, value } => { + this.in_scope((region_scope, source_info), lint_level, |this| { + let value = this.hir.mirror(value); + this.expr_as_place(block, value, mutability, fake_borrow_temps) + }) + } ExprKind::Field { lhs, name } => { let lhs = this.hir.mirror(lhs); - let place_builder = unpack!(block = this.expr_as_place( - block, - lhs, - mutability, - fake_borrow_temps, - )); + let place_builder = + unpack!(block = this.expr_as_place(block, lhs, mutability, fake_borrow_temps,)); block.and(place_builder.field(name, expr.ty)) } ExprKind::Deref { arg } => { let arg = this.hir.mirror(arg); - let place_builder = unpack!(block = this.expr_as_place( - block, - arg, - mutability, - fake_borrow_temps, - )); + let place_builder = + unpack!(block = this.expr_as_place(block, arg, mutability, fake_borrow_temps,)); block.and(place_builder.deref()) } - ExprKind::Index { lhs, index } => { - this.lower_index_expression( - block, - lhs, - index, - mutability, - fake_borrow_temps, - expr.temp_lifetime, - expr_span, - source_info, - ) - } + ExprKind::Index { lhs, index } => this.lower_index_expression( + block, + lhs, + index, + mutability, + fake_borrow_temps, + expr.temp_lifetime, + expr_span, + source_info, + ), ExprKind::SelfRef => block.and(PlaceBuilder::from(Local::new(1))), ExprKind::VarRef { id } => { let place_builder = if this.is_bound_var_in_guard(id) { @@ -200,20 +174,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ExprKind::PlaceTypeAscription { source, user_ty } => { let source = this.hir.mirror(source); - let place_builder = unpack!(block = this.expr_as_place( - block, - source, - mutability, - fake_borrow_temps, - )); + let place_builder = unpack!( + block = this.expr_as_place(block, source, mutability, fake_borrow_temps,) + ); if let Some(user_ty) = user_ty { - let annotation_index = this.canonical_user_type_annotations.push( - CanonicalUserTypeAnnotation { + let annotation_index = + this.canonical_user_type_annotations.push(CanonicalUserTypeAnnotation { span: source_info.span, user_ty, inferred_ty: expr.ty, - } - ); + }); let place = place_builder.clone().into_place(this.hir.tcx()); this.cfg.push( @@ -221,9 +191,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { Statement { source_info, kind: StatementKind::AscribeUserType( - box( + box ( place, - UserTypeProjection { base: annotation_index, projs: vec![], } + UserTypeProjection { base: annotation_index, projs: vec![] }, ), Variance::Invariant, ), @@ -234,25 +204,23 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } ExprKind::ValueTypeAscription { source, user_ty } => { let source = this.hir.mirror(source); - let temp = unpack!( - block = this.as_temp(block, source.temp_lifetime, source, mutability) - ); + let temp = + unpack!(block = this.as_temp(block, source.temp_lifetime, source, mutability)); if let Some(user_ty) = user_ty { - let annotation_index = this.canonical_user_type_annotations.push( - CanonicalUserTypeAnnotation { + let annotation_index = + this.canonical_user_type_annotations.push(CanonicalUserTypeAnnotation { span: source_info.span, user_ty, inferred_ty: expr.ty, - } - ); + }); this.cfg.push( block, Statement { source_info, kind: StatementKind::AscribeUserType( - box( - Place::from(temp.clone()), - UserTypeProjection { base: annotation_index, projs: vec![], }, + box ( + Place::from(temp), + UserTypeProjection { base: annotation_index, projs: vec![] }, ), Variance::Invariant, ), @@ -276,6 +244,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { | ExprKind::Pointer { .. } | ExprKind::Repeat { .. } | ExprKind::Borrow { .. } + | ExprKind::AddressOf { .. } | ExprKind::Match { .. } | ExprKind::Loop { .. } | ExprKind::Block { .. } @@ -318,7 +287,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fake_borrow_temps: Option<&mut Vec>, temp_lifetime: Option, expr_span: Span, - source_info: SourceInfo + source_info: SourceInfo, ) -> BlockAnd> { let lhs = self.hir.mirror(base); @@ -326,22 +295,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let is_outermost_index = fake_borrow_temps.is_none(); let fake_borrow_temps = fake_borrow_temps.unwrap_or(base_fake_borrow_temps); - let base_place = unpack!(block = self.expr_as_place( - block, - lhs, - mutability, - Some(fake_borrow_temps), - )); + let base_place = + unpack!(block = self.expr_as_place(block, lhs, mutability, Some(fake_borrow_temps),)); // Making this a *fresh* temporary means we do not have to worry about // the index changing later: Nothing will ever change this temporary. // The "retagging" transformation (for Stacked Borrows) relies on this. - let idx = unpack!(block = self.as_temp( - block, - temp_lifetime, - index, - Mutability::Not, - )); + let idx = unpack!(block = self.as_temp(block, temp_lifetime, index, Mutability::Not,)); block = self.bounds_check( block, @@ -381,27 +341,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let lt = self.temp(bool_ty, expr_span); // len = len(slice) - self.cfg.push_assign( - block, - source_info, - &len, - Rvalue::Len(slice), - ); + self.cfg.push_assign(block, source_info, &len, Rvalue::Len(slice)); // lt = idx < len self.cfg.push_assign( block, source_info, <, - Rvalue::BinaryOp( - BinOp::Lt, - Operand::Copy(Place::from(index)), - Operand::Copy(len.clone()), - ), + Rvalue::BinaryOp(BinOp::Lt, Operand::Copy(Place::from(index)), Operand::Copy(len)), ); - let msg = BoundsCheck { - len: Operand::Move(len), - index: Operand::Copy(Place::from(index)), - }; + let msg = BoundsCheck { len: Operand::Move(len), index: Operand::Copy(Place::from(index)) }; // assert!(lt, "...") self.assert(block, Operand::Move(lt), true, msg, expr_span) } @@ -415,12 +363,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { source_info: SourceInfo, ) { let tcx = self.hir.tcx(); - let place_ty = Place::ty_from( - &base_place.base, - &base_place.projection, - &self.local_decls, - tcx, - ); + let place_ty = + Place::ty_from(&base_place.local, &base_place.projection, &self.local_decls, tcx); if let ty::Slice(_) = place_ty.ty.kind { // We need to create fake borrows to ensure that the bounds // check that we just did stays valid. Since we can't assign to @@ -430,18 +374,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { match elem { ProjectionElem::Deref => { let fake_borrow_deref_ty = Place::ty_from( - &base_place.base, + &base_place.local, &base_place.projection[..idx], &self.local_decls, tcx, - ).ty; - let fake_borrow_ty = tcx.mk_imm_ref( - tcx.lifetimes.re_erased, - fake_borrow_deref_ty, - ); - let fake_borrow_temp = self.local_decls.push( - LocalDecl::new_temp(fake_borrow_ty, expr_span) - ); + ) + .ty; + let fake_borrow_ty = + tcx.mk_imm_ref(tcx.lifetimes.re_erased, fake_borrow_deref_ty); + let fake_borrow_temp = + self.local_decls.push(LocalDecl::new_temp(fake_borrow_ty, expr_span)); let projection = tcx.intern_place_elems(&base_place.projection[..idx]); self.cfg.push_assign( block, @@ -450,17 +392,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { Rvalue::Ref( tcx.lifetimes.re_erased, BorrowKind::Shallow, - Place { - base: base_place.base.clone(), - projection, - } + Place { local: base_place.local, projection }, ), ); fake_borrow_temps.push(fake_borrow_temp); } ProjectionElem::Index(_) => { let index_ty = Place::ty_from( - &base_place.base, + &base_place.local, &base_place.projection[..idx], &self.local_decls, tcx, diff --git a/src/librustc_mir/build/expr/as_rvalue.rs b/src/librustc_mir_build/build/expr/as_rvalue.rs similarity index 85% rename from src/librustc_mir/build/expr/as_rvalue.rs rename to src/librustc_mir_build/build/expr/as_rvalue.rs index 37eb0cc9d9..5959b85225 100644 --- a/src/librustc_mir/build/expr/as_rvalue.rs +++ b/src/librustc_mir_build/build/expr/as_rvalue.rs @@ -9,7 +9,7 @@ use rustc::middle::region; use rustc::mir::interpret::PanicInfo; use rustc::mir::*; use rustc::ty::{self, Ty, UpvarSubsts}; -use syntax_pos::Span; +use rustc_span::Span; impl<'a, 'tcx> Builder<'a, 'tcx> { /// Returns an rvalue suitable for use until the end of the current @@ -18,7 +18,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// The operand returned from this function will *not be valid* after /// an ExprKind::Scope is passed, so please do *not* return it from /// functions to avoid bad miscompiles. - pub fn as_local_rvalue(&mut self, block: BasicBlock, expr: M) -> BlockAnd> + crate fn as_local_rvalue(&mut self, block: BasicBlock, expr: M) -> BlockAnd> where M: Mirror<'tcx, Output = Expr<'tcx>>, { @@ -46,25 +46,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { scope: Option, expr: Expr<'tcx>, ) -> BlockAnd> { - debug!( - "expr_as_rvalue(block={:?}, scope={:?}, expr={:?})", - block, scope, expr - ); + debug!("expr_as_rvalue(block={:?}, scope={:?}, expr={:?})", block, scope, expr); let this = self; let expr_span = expr.span; let source_info = this.source_info(expr_span); match expr.kind { - ExprKind::Scope { - region_scope, - lint_level, - value, - } => { + ExprKind::Scope { region_scope, lint_level, value } => { let region_scope = (region_scope, source_info); - this.in_scope(region_scope, lint_level, |this| { - this.as_rvalue(block, scope, value) - }) + this.in_scope(region_scope, lint_level, |this| this.as_rvalue(block, scope, value)) } ExprKind::Repeat { value, count } => { let value_operand = unpack!(block = this.as_operand(block, scope, value)); @@ -106,35 +97,26 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // The `Box` temporary created here is not a part of the HIR, // and therefore is not considered during generator OIBIT // determination. See the comment about `box` at `yield_in_scope`. - let result = this - .local_decls - .push(LocalDecl::new_internal(expr.ty, expr_span)); + let result = this.local_decls.push(LocalDecl::new_internal(expr.ty, expr_span)); this.cfg.push( block, - Statement { - source_info, - kind: StatementKind::StorageLive(result), - }, + Statement { source_info, kind: StatementKind::StorageLive(result) }, ); if let Some(scope) = scope { // schedule a shallow free of that memory, lest we unwind: - this.schedule_drop_storage_and_value( - expr_span, - scope, - result, - ); + this.schedule_drop_storage_and_value(expr_span, scope, result); } // malloc some memory of suitable type (thus far, uninitialized): let box_ = Rvalue::NullaryOp(NullOp::Box, value.ty); - this.cfg - .push_assign(block, source_info, &Place::from(result), box_); + this.cfg.push_assign(block, source_info, &Place::from(result), box_); // initialize the box contents: unpack!( block = this.into( &this.hir.tcx().mk_place_deref(Place::from(result)), - block, value + block, + value ) ); block.and(Rvalue::Use(Operand::Move(Place::from(result)))) @@ -193,12 +175,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block.and(Rvalue::Aggregate(box AggregateKind::Tuple, fields)) } - ExprKind::Closure { - closure_id, - substs, - upvars, - movability, - } => { + ExprKind::Closure { closure_id, substs, upvars, movability } => { // see (*) above let operands: Vec<_> = upvars .into_iter() @@ -225,9 +202,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { match upvar.kind { ExprKind::Borrow { borrow_kind: - BorrowKind::Mut { - allow_two_phase_borrow: false, - }, + BorrowKind::Mut { allow_two_phase_borrow: false }, arg, } => unpack!( block = this.limit_capture_mutability( @@ -238,7 +213,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } } - }).collect(); + }) + .collect(); let result = match substs { UpvarSubsts::Generator(substs) => { // We implicitly set the discriminant to 0. See @@ -261,11 +237,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.cfg.terminate( block, source_info, - TerminatorKind::Yield { - value: value, - resume: resume, - drop: cleanup, - }, + TerminatorKind::Yield { value: value, resume: resume, drop: cleanup }, ); resume.and(this.unit_rvalue()) } @@ -276,6 +248,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { | ExprKind::NeverToAny { .. } | ExprKind::Use { .. } | ExprKind::Borrow { .. } + | ExprKind::AddressOf { .. } | ExprKind::Adt { .. } | ExprKind::Loop { .. } | ExprKind::LogicalOp { .. } @@ -303,7 +276,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - pub fn build_binary_op( + crate fn build_binary_op( &mut self, mut block: BasicBlock, op: BinOp, @@ -413,51 +386,31 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let this = self; let source_info = this.source_info(upvar_span); - let temp = this - .local_decls - .push(LocalDecl::new_temp(upvar_ty, upvar_span)); + let temp = this.local_decls.push(LocalDecl::new_temp(upvar_ty, upvar_span)); - this.cfg.push( - block, - Statement { - source_info, - kind: StatementKind::StorageLive(temp), - }, - ); + this.cfg.push(block, Statement { source_info, kind: StatementKind::StorageLive(temp) }); let arg_place = unpack!(block = this.as_place(block, arg)); let mutability = match arg_place.as_ref() { - PlaceRef { - base: &PlaceBase::Local(local), - projection: &[], - } => this.local_decls[local].mutability, - PlaceRef { - base: &PlaceBase::Local(local), - projection: &[ProjectionElem::Deref], - } => { + PlaceRef { local, projection: &[] } => this.local_decls[*local].mutability, + PlaceRef { local, projection: &[ProjectionElem::Deref] } => { debug_assert!( - this.local_decls[local].is_ref_for_guard(), + this.local_decls[*local].is_ref_for_guard(), "Unexpected capture place", ); - this.local_decls[local].mutability + this.local_decls[*local].mutability } PlaceRef { - ref base, + ref local, projection: &[ref proj_base @ .., ProjectionElem::Field(upvar_index, _)], } | PlaceRef { - ref base, - projection: &[ - ref proj_base @ .., - ProjectionElem::Field(upvar_index, _), - ProjectionElem::Deref - ], + ref local, + projection: + &[ref proj_base @ .., ProjectionElem::Field(upvar_index, _), ProjectionElem::Deref], } => { - let place = PlaceRef { - base, - projection: proj_base, - }; + let place = PlaceRef { local, projection: proj_base }; // Not projected from the implicit `self` in a closure. debug_assert!( @@ -479,9 +432,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let borrow_kind = match mutability { Mutability::Not => BorrowKind::Unique, - Mutability::Mut => BorrowKind::Mut { - allow_two_phase_borrow: false, - }, + Mutability::Mut => BorrowKind::Mut { allow_two_phase_borrow: false }, }; this.cfg.push_assign( @@ -495,11 +446,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // anything because no values with a destructor can be created in // a constant at this time, even if the type may need dropping. if let Some(temp_lifetime) = temp_lifetime { - this.schedule_drop_storage_and_value( - upvar_span, - temp_lifetime, - temp, - ); + this.schedule_drop_storage_and_value(upvar_span, temp_lifetime, temp); } block.and(Operand::Move(Place::from(temp))) diff --git a/src/librustc_mir/build/expr/as_temp.rs b/src/librustc_mir_build/build/expr/as_temp.rs similarity index 75% rename from src/librustc_mir/build/expr/as_temp.rs rename to src/librustc_mir_build/build/expr/as_temp.rs index 169b71f281..34dd10cbc0 100644 --- a/src/librustc_mir/build/expr/as_temp.rs +++ b/src/librustc_mir_build/build/expr/as_temp.rs @@ -1,17 +1,17 @@ //! See docs in build/expr/mod.rs -use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::build::scope::DropKind; +use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::hair::*; -use rustc::hir; use rustc::middle::region; use rustc::mir::*; -use syntax_pos::symbol::sym; +use rustc_hir as hir; +use rustc_span::symbol::sym; impl<'a, 'tcx> Builder<'a, 'tcx> { /// Compile `expr` into a fresh temporary. This is used when building /// up rvalues so as to freeze the value that will be consumed. - pub fn as_temp( + crate fn as_temp( &mut self, block: BasicBlock, temp_lifetime: Option, @@ -40,12 +40,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let expr_span = expr.span; let source_info = this.source_info(expr_span); - if let ExprKind::Scope { - region_scope, - lint_level, - value, - } = expr.kind - { + if let ExprKind::Scope { region_scope, lint_level, value } = expr.kind { return this.in_scope((region_scope, source_info), lint_level, |this| { this.as_temp(block, temp_lifetime, value, mutability) }); @@ -67,7 +62,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { if let ExprKind::StaticRef { def_id, .. } = expr.kind { let is_thread_local = this.hir.tcx().has_attr(def_id, sym::thread_local); local_decl.internal = true; - local_decl.local_info = LocalInfo::StaticRef {def_id, is_thread_local }; + local_decl.local_info = LocalInfo::StaticRef { def_id, is_thread_local }; } this.local_decls.push(local_decl) }; @@ -76,20 +71,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { match expr.kind { // Don't bother with StorageLive and Dead for these temporaries, // they are never assigned. - ExprKind::Break { .. } | - ExprKind::Continue { .. } | - ExprKind::Return { .. } => (), - ExprKind::Block { - body: hir::Block { expr: None, targeted_by_break: false, .. } - } if expr_ty.is_never() => (), + ExprKind::Break { .. } | ExprKind::Continue { .. } | ExprKind::Return { .. } => (), + ExprKind::Block { body: hir::Block { expr: None, targeted_by_break: false, .. } } + if expr_ty.is_never() => + { + () + } _ => { - this.cfg.push( - block, - Statement { - source_info, - kind: StatementKind::StorageLive(temp), - }, - ); + this.cfg + .push(block, Statement { source_info, kind: StatementKind::StorageLive(temp) }); // In constants, `temp_lifetime` is `None` for temporaries that // live for the `'static` lifetime. Thus we do not drop these @@ -105,12 +95,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // `bar(&foo())` or anything within a block will keep the // regular drops just like runtime code. if let Some(temp_lifetime) = temp_lifetime { - this.schedule_drop( - expr_span, - temp_lifetime, - temp, - DropKind::Storage, - ); + this.schedule_drop(expr_span, temp_lifetime, temp, DropKind::Storage); } } } @@ -118,12 +103,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { unpack!(block = this.into(temp_place, block, expr)); if let Some(temp_lifetime) = temp_lifetime { - this.schedule_drop( - expr_span, - temp_lifetime, - temp, - DropKind::Value, - ); + this.schedule_drop(expr_span, temp_lifetime, temp, DropKind::Value); } block.and(temp) diff --git a/src/librustc_mir/build/expr/category.rs b/src/librustc_mir_build/build/expr/category.rs similarity index 91% rename from src/librustc_mir/build/expr/category.rs rename to src/librustc_mir_build/build/expr/category.rs index 270a1a6447..c4d340953c 100644 --- a/src/librustc_mir/build/expr/category.rs +++ b/src/librustc_mir_build/build/expr/category.rs @@ -1,7 +1,7 @@ use crate::hair::*; #[derive(Debug, PartialEq)] -pub enum Category { +crate enum Category { // An assignable memory location like `x`, `x.f`, `foo()[3]`, that // sort of thing. Something that could appear on the LHS of an `=` // sign. @@ -19,7 +19,7 @@ pub enum Category { // Rvalues fall into different "styles" that will determine which fn // is best suited to generate them. #[derive(Debug, PartialEq)] -pub enum RvalueFunc { +crate enum RvalueFunc { // Best generated by `into`. This is generally exprs that // cause branching, like `match`, but also includes calls. Into, @@ -31,7 +31,7 @@ pub enum RvalueFunc { /// Determines the category for a given expression. Note that scope /// and paren expressions have no category. impl Category { - pub fn of(ek: &ExprKind<'_>) -> Option { + crate fn of(ek: &ExprKind<'_>) -> Option { match *ek { ExprKind::Scope { .. } => None, @@ -49,6 +49,7 @@ impl Category { | ExprKind::Use { .. } | ExprKind::Adt { .. } | ExprKind::Borrow { .. } + | ExprKind::AddressOf { .. } | ExprKind::Call { .. } => Some(Category::Rvalue(RvalueFunc::Into)), ExprKind::Array { .. } @@ -65,8 +66,7 @@ impl Category { | ExprKind::Yield { .. } | ExprKind::InlineAsm { .. } => Some(Category::Rvalue(RvalueFunc::AsRvalue)), - ExprKind::Literal { .. } - | ExprKind::StaticRef { .. } => Some(Category::Constant), + ExprKind::Literal { .. } | ExprKind::StaticRef { .. } => Some(Category::Constant), ExprKind::Loop { .. } | ExprKind::Block { .. } diff --git a/src/librustc_mir/build/expr/into.rs b/src/librustc_mir_build/build/expr/into.rs similarity index 76% rename from src/librustc_mir/build/expr/into.rs rename to src/librustc_mir_build/build/expr/into.rs index 07a44b190b..5ef338c624 100644 --- a/src/librustc_mir/build/expr/into.rs +++ b/src/librustc_mir_build/build/expr/into.rs @@ -6,23 +6,21 @@ use crate::hair::*; use rustc::mir::*; use rustc::ty::{self, CanonicalUserTypeAnnotation}; use rustc_data_structures::fx::FxHashMap; -use syntax_pos::symbol::sym; +use rustc_hir as hir; +use rustc_span::symbol::sym; use rustc_target::spec::abi::Abi; impl<'a, 'tcx> Builder<'a, 'tcx> { /// Compile `expr`, storing the result into `destination`, which /// is assumed to be uninitialized. - pub fn into_expr( + crate fn into_expr( &mut self, destination: &Place<'tcx>, mut block: BasicBlock, expr: Expr<'tcx>, ) -> BlockAnd<()> { - debug!( - "into_expr(destination={:?}, block={:?}, expr={:?})", - destination, block, expr - ); + debug!("into_expr(destination={:?}, block={:?}, expr={:?})", destination, block, expr); // since we frequently have to reference `self` from within a // closure, where `self` would be shadowed, it's easier to @@ -42,15 +40,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } let block_and = match expr.kind { - ExprKind::Scope { - region_scope, - lint_level, - value, - } => { + ExprKind::Scope { region_scope, lint_level, value } => { let region_scope = (region_scope, source_info); - this.in_scope(region_scope, lint_level, |this| { - this.into(destination, block, value) - }) + this.in_scope(region_scope, lint_level, |this| this.into(destination, block, value)) } ExprKind::Block { body: ast_block } => { this.ast_block(destination, block, ast_block, source_info) @@ -67,20 +59,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // (#66975) Source could be a const of type `!`, so has to // exist in the generated MIR. - unpack!(block = this.as_temp( - block, - this.local_scope(), - source, - Mutability::Mut, - )); + unpack!(block = this.as_temp(block, this.local_scope(), source, Mutability::Mut,)); // This is an optimization. If the expression was a call then we already have an // unreachable block. Don't bother to terminate it and create a new one. if is_call { block.unit() } else { - this.cfg - .terminate(block, source_info, TerminatorKind::Unreachable); + this.cfg.terminate(block, source_info, TerminatorKind::Unreachable); let end_block = this.cfg.start_new_block(); end_block.unit() } @@ -121,35 +107,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { true_block, source_info, destination, - Constant { - span: expr_span, - user_ty: None, - literal: this.hir.true_literal(), - }, + Constant { span: expr_span, user_ty: None, literal: this.hir.true_literal() }, ); this.cfg.push_assign_constant( false_block, source_info, destination, - Constant { - span: expr_span, - user_ty: None, - literal: this.hir.false_literal(), - }, - ); - - this.cfg.terminate( - true_block, - source_info, - TerminatorKind::Goto { target: join_block }, - ); - this.cfg.terminate( - false_block, - source_info, - TerminatorKind::Goto { target: join_block }, + Constant { span: expr_span, user_ty: None, literal: this.hir.false_literal() }, ); + // Link up both branches: + this.cfg.goto(true_block, source_info, join_block); + this.cfg.goto(false_block, source_info, join_block); join_block.unit() } ExprKind::Loop { body } => { @@ -166,12 +136,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let loop_block = this.cfg.start_new_block(); let exit_block = this.cfg.start_new_block(); - // start the loop - this.cfg.terminate( - block, - source_info, - TerminatorKind::Goto { target: loop_block }, - ); + // Start the loop. + this.cfg.goto(block, source_info, loop_block); this.in_breakable_scope( Some(loop_block), @@ -195,11 +161,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let tmp = this.get_unit_temp(); // Execute the body, branching back to the test. let body_block_end = unpack!(this.into(&tmp, body_block, body)); - this.cfg.terminate( - body_block_end, - source_info, - TerminatorKind::Goto { target: loop_block }, - ); + this.cfg.goto(body_block_end, source_info, loop_block); }, ); exit_block.unit() @@ -266,7 +228,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { destination: if expr.ty.is_never() { None } else { - Some((destination.clone(), success)) + Some((*destination, success)) }, from_hir_call, }, @@ -274,9 +236,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { success.unit() } } - ExprKind::Use { source } => { - this.into(destination, block, source) - } + ExprKind::Use { source } => this.into(destination, block, source), ExprKind::Borrow { arg, borrow_kind } => { // We don't do this in `as_rvalue` because we use `as_place` // for borrow expressions, so we cannot create an `RValue` that @@ -287,67 +247,57 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { BorrowKind::Shared => unpack!(block = this.as_read_only_place(block, arg)), _ => unpack!(block = this.as_place(block, arg)), }; - let borrow = Rvalue::Ref( - this.hir.tcx().lifetimes.re_erased, - borrow_kind, - arg_place, - ); + let borrow = + Rvalue::Ref(this.hir.tcx().lifetimes.re_erased, borrow_kind, arg_place); this.cfg.push_assign(block, source_info, destination, borrow); block.unit() } - ExprKind::Adt { - adt_def, - variant_index, - substs, - user_ty, - fields, - base, - } => { + ExprKind::AddressOf { mutability, arg } => { + let place = match mutability { + hir::Mutability::Not => this.as_read_only_place(block, arg), + hir::Mutability::Mut => this.as_place(block, arg), + }; + let address_of = Rvalue::AddressOf(mutability, unpack!(block = place)); + this.cfg.push_assign(block, source_info, destination, address_of); + block.unit() + } + ExprKind::Adt { adt_def, variant_index, substs, user_ty, fields, base } => { // See the notes for `ExprKind::Array` in `as_rvalue` and for // `ExprKind::Borrow` above. let is_union = adt_def.is_union(); - let active_field_index = if is_union { - Some(fields[0].name.index()) - } else { - None - }; + let active_field_index = if is_union { Some(fields[0].name.index()) } else { None }; - let scope = this.local_scope(); + let scope = this.local_scope(); // first process the set of fields that were provided // (evaluating them in order given by user) let fields_map: FxHashMap<_, _> = fields .into_iter() - .map(|f| { - ( - f.name, - unpack!(block = this.as_operand(block, scope, f.expr)), - ) - }).collect(); + .map(|f| (f.name, unpack!(block = this.as_operand(block, scope, f.expr)))) + .collect(); let field_names = this.hir.all_fields(adt_def, variant_index); - let fields = if let Some(FruInfo { base, field_types }) = base { - let base = unpack!(block = this.as_place(block, base)); - - // MIR does not natively support FRU, so for each - // base-supplied field, generate an operand that - // reads it from the base. - field_names - .into_iter() - .zip(field_types.into_iter()) - .map(|(n, ty)| match fields_map.get(&n) { - Some(v) => v.clone(), - None => this.consume_by_copy_or_move( - this.hir.tcx().mk_place_field(base.clone(), n, ty), - ), - }).collect() - } else { - field_names - .iter() - .filter_map(|n| fields_map.get(n).cloned()) - .collect() - }; + let fields = + if let Some(FruInfo { base, field_types }) = base { + let base = unpack!(block = this.as_place(block, base)); + + // MIR does not natively support FRU, so for each + // base-supplied field, generate an operand that + // reads it from the base. + field_names + .into_iter() + .zip(field_types.into_iter()) + .map(|(n, ty)| match fields_map.get(&n) { + Some(v) => v.clone(), + None => this.consume_by_copy_or_move( + this.hir.tcx().mk_place_field(base.clone(), n, ty), + ), + }) + .collect() + } else { + field_names.iter().filter_map(|n| fields_map.get(n).cloned()).collect() + }; let inferred_ty = expr.ty; let user_ty = user_ty.map(|ty| { @@ -368,12 +318,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block, source_info, destination, - Rvalue::Aggregate(adt, fields) + Rvalue::Aggregate(adt, fields), ); block.unit() } - // These cases don't actually need a destination ExprKind::Assign { .. } | ExprKind::AssignOp { .. } @@ -387,16 +336,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } // Avoid creating a temporary - ExprKind::VarRef { .. } | - ExprKind::SelfRef | - ExprKind::PlaceTypeAscription { .. } | - ExprKind::ValueTypeAscription { .. } => { + ExprKind::VarRef { .. } + | ExprKind::SelfRef + | ExprKind::PlaceTypeAscription { .. } + | ExprKind::ValueTypeAscription { .. } => { debug_assert!(Category::of(&expr.kind) == Some(Category::Place)); let place = unpack!(block = this.as_place(block, expr)); let rvalue = Rvalue::Use(this.consume_by_copy_or_move(place)); - this.cfg - .push_assign(block, source_info, destination, rvalue); + this.cfg.push_assign(block, source_info, destination, rvalue); block.unit() } ExprKind::Index { .. } | ExprKind::Deref { .. } | ExprKind::Field { .. } => { @@ -406,16 +354,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // value is Sized. Usually, this is caught in type checking, but // in the case of box expr there is no such check. if !destination.projection.is_empty() { - this.local_decls - .push(LocalDecl::new_temp(expr.ty, expr.span)); + this.local_decls.push(LocalDecl::new_temp(expr.ty, expr.span)); } debug_assert!(Category::of(&expr.kind) == Some(Category::Place)); let place = unpack!(block = this.as_place(block, expr)); let rvalue = Rvalue::Use(this.consume_by_copy_or_move(place)); - this.cfg - .push_assign(block, source_info, destination, rvalue); + this.cfg.push_assign(block, source_info, destination, rvalue); block.unit() } diff --git a/src/librustc_mir/build/expr/mod.rs b/src/librustc_mir_build/build/expr/mod.rs similarity index 100% rename from src/librustc_mir/build/expr/mod.rs rename to src/librustc_mir_build/build/expr/mod.rs diff --git a/src/librustc_mir/build/expr/stmt.rs b/src/librustc_mir_build/build/expr/stmt.rs similarity index 85% rename from src/librustc_mir/build/expr/stmt.rs rename to src/librustc_mir_build/build/expr/stmt.rs index 0cd32acdb6..882c5e85bb 100644 --- a/src/librustc_mir/build/expr/stmt.rs +++ b/src/librustc_mir_build/build/expr/stmt.rs @@ -10,7 +10,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// (e.g., `some().code(&here());`) then `opt_stmt_span` is the /// span of that statement (including its semicolon, if any). /// The scope is used if a statement temporary must be dropped. - pub fn stmt_expr( + crate fn stmt_expr( &mut self, mut block: BasicBlock, expr: Expr<'tcx>, @@ -23,11 +23,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // avoids needing a mountain of temporary `()` variables. let expr2 = expr.clone(); match expr.kind { - ExprKind::Scope { - region_scope, - lint_level, - value, - } => { + ExprKind::Scope { region_scope, lint_level, value } => { let value = this.hir.mirror(value); this.in_scope((region_scope, source_info), lint_level, |this| { this.stmt_expr(block, value, statement_scope) @@ -83,14 +79,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // because AssignOp is only legal for Copy types // (overloaded ops should be desugared into a call). let result = unpack!( - block = this.build_binary_op( - block, - op, - expr_span, - lhs_ty, - Operand::Copy(lhs.clone()), - rhs - ) + block = + this.build_binary_op(block, op, expr_span, lhs_ty, Operand::Copy(lhs), rhs) ); this.cfg.push_assign(block, source_info, &lhs, result); @@ -106,11 +96,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ExprKind::Return { value } => { this.break_scope(block, value, BreakableTarget::Return, source_info) } - ExprKind::InlineAsm { - asm, - outputs, - inputs, - } => { + ExprKind::InlineAsm { asm, outputs, inputs } => { debug!("stmt_expr InlineAsm block_context.push(SubExpr) : {:?}", expr2); this.block_context.push(BlockFrame::SubExpr); let outputs = outputs @@ -121,11 +107,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let inputs = inputs .into_iter() .map(|input| { - ( - input.span(), - unpack!(block = this.as_local_operand(block, input)), - ) - }).collect::>() + (input.span(), unpack!(block = this.as_local_operand(block, input))) + }) + .collect::>() .into_boxed_slice(); this.cfg.push( block, @@ -159,24 +143,23 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { if let ExprKind::Block { body } = expr.kind { if let Some(tail_expr) = &body.expr { let mut expr = tail_expr; - while let rustc::hir::ExprKind::Block(subblock, _label) = &expr.kind { + while let rustc_hir::ExprKind::Block(subblock, _label) = &expr.kind { if let Some(subtail_expr) = &subblock.expr { expr = subtail_expr } else { break; } } - this.block_context.push(BlockFrame::TailExpr { - tail_result_is_ignored: true - }); + this.block_context + .push(BlockFrame::TailExpr { tail_result_is_ignored: true }); return Some(expr.span); } } None })(); - let temp = unpack!(block = - this.as_temp(block, statement_scope, expr, Mutability::Not)); + let temp = + unpack!(block = this.as_temp(block, statement_scope, expr, Mutability::Not)); if let Some(span) = adjusted_span { this.local_decls[temp].source_info.span = span; diff --git a/src/librustc_mir/build/into.rs b/src/librustc_mir_build/build/into.rs similarity index 85% rename from src/librustc_mir/build/into.rs rename to src/librustc_mir_build/build/into.rs index 077840c9cc..1a2a9d2bc0 100644 --- a/src/librustc_mir/build/into.rs +++ b/src/librustc_mir_build/build/into.rs @@ -18,12 +18,14 @@ pub(in crate::build) trait EvalInto<'tcx> { } impl<'a, 'tcx> Builder<'a, 'tcx> { - pub fn into(&mut self, - destination: &Place<'tcx>, - block: BasicBlock, - expr: E) - -> BlockAnd<()> - where E: EvalInto<'tcx> + crate fn into( + &mut self, + destination: &Place<'tcx>, + block: BasicBlock, + expr: E, + ) -> BlockAnd<()> + where + E: EvalInto<'tcx>, { expr.eval_into(self, destination, block) } diff --git a/src/librustc_mir/build/matches/mod.rs b/src/librustc_mir_build/build/matches/mod.rs similarity index 77% rename from src/librustc_mir/build/matches/mod.rs rename to src/librustc_mir_build/build/matches/mod.rs index bf0b2439c0..801e50eab8 100644 --- a/src/librustc_mir/build/matches/mod.rs +++ b/src/librustc_mir_build/build/matches/mod.rs @@ -10,22 +10,23 @@ use crate::build::ForGuard::{self, OutsideGuard, RefWithinGuard}; use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::build::{GuardFrame, GuardFrameLocal, LocalsForNode}; use crate::hair::{self, *}; -use rustc::hir::HirId; -use rustc::mir::*; use rustc::middle::region; -use rustc::ty::{self, CanonicalUserTypeAnnotation, Ty}; +use rustc::mir::*; use rustc::ty::layout::VariantIdx; -use rustc_index::bit_set::BitSet; +use rustc::ty::{self, CanonicalUserTypeAnnotation, Ty}; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; -use smallvec::{SmallVec, smallvec}; +use rustc_hir::HirId; +use rustc_index::bit_set::BitSet; +use rustc_span::Span; +use smallvec::{smallvec, SmallVec}; use syntax::ast::Name; -use syntax_pos::Span; // helper functions, broken out by category: mod simplify; mod test; mod util; +use itertools::Itertools; use std::convert::TryFrom; impl<'a, 'tcx> Builder<'a, 'tcx> { @@ -64,32 +65,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// /// We generate MIR in the following steps: /// - /// 1. Evaluate the scrutinee and add the fake read of it. - /// 2. Create the prebinding and otherwise blocks. - /// 3. Create the decision tree and record the places that we bind or test. - /// 4. Determine the fake borrows that are needed from the above places. - /// Create the required temporaries for them. - /// 5. Create everything else: the guards and the arms. - /// - /// ## Fake Reads and borrows - /// - /// Match exhaustiveness checking is not able to handle the case where the - /// place being matched on is mutated in the guards. There is an AST check - /// that tries to stop this but it is buggy and overly restrictive. Instead - /// we add "fake borrows" to the guards that prevent any mutation of the - /// place being matched. There are a some subtleties: - /// - /// 1. Borrowing `*x` doesn't prevent assigning to `x`. If `x` is a shared - /// refence, the borrow isn't even tracked. As such we have to add fake - /// borrows of any prefixes of a place - /// 2. We don't want `match x { _ => (), }` to conflict with mutable - /// borrows of `x`, so we only add fake borrows for places which are - /// bound or tested by the match. - /// 3. We don't want the fake borrows to conflict with `ref mut` bindings, - /// so we use a special BorrowKind for them. - /// 4. The fake borrows may be of places in inactive variants, so it would - /// be UB to generate code for them. They therefore have to be removed - /// by a MIR pass run after borrow checking. + /// 1. Evaluate the scrutinee and add the fake read of it ([Builder::lower_scrutinee]). + /// 2. Create the prebinding and otherwise blocks ([Builder::create_match_candidates]). + /// 3. Create the decision tree ([Builder::lower_match_tree]). + /// 4. Determine the fake borrows that are needed from the places that were + /// matched against and create the required temporaries for them + /// ([Builder::calculate_fake_borrows]). + /// 5. Create everything else: the guards and the arms ([Builder::lower_match_arms]). /// /// ## False edges /// @@ -99,7 +81,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// /// * From each prebinding block to the next prebinding block. /// * From each otherwise block to the next prebinding block. - pub fn match_expr( + crate fn match_expr( &mut self, destination: &Place<'tcx>, span: Span, @@ -107,13 +89,37 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { scrutinee: ExprRef<'tcx>, arms: Vec>, ) -> BlockAnd<()> { - let tcx = self.hir.tcx(); + let scrutinee_span = scrutinee.span(); + let scrutinee_place = + unpack!(block = self.lower_scrutinee(block, scrutinee, scrutinee_span,)); - // Step 1. Evaluate the scrutinee and add the fake read of it. + let mut arm_candidates = self.create_match_candidates(&scrutinee_place, &arms); - let scrutinee_span = scrutinee.span(); - let scrutinee_place = unpack!(block = self.as_place(block, scrutinee)); + let match_has_guard = arms.iter().any(|arm| arm.guard.is_some()); + let candidates = + arm_candidates.iter_mut().flat_map(|(_, candidates)| candidates).collect::>(); + + let fake_borrow_temps = + self.lower_match_tree(block, scrutinee_span, match_has_guard, candidates); + + self.lower_match_arms( + &destination, + scrutinee_place, + scrutinee_span, + arm_candidates, + self.source_info(span), + fake_borrow_temps, + ) + } + /// Evaluate the scrutinee and add the fake read of it. + fn lower_scrutinee( + &mut self, + mut block: BasicBlock, + scrutinee: ExprRef<'tcx>, + scrutinee_span: Span, + ) -> BlockAnd> { + let scrutinee_place = unpack!(block = self.as_place(block, scrutinee)); // Matching on a `scrutinee_place` with an uninhabited type doesn't // generate any memory reads by itself, and so if the place "expression" // contains unsafe operations like raw pointer dereferences or union @@ -129,160 +135,148 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // uninhabited value. If we get never patterns, those will check that // the place is initialized, and so this read would only be used to // check safety. - - let source_info = self.source_info(scrutinee_span); let cause_matched_place = FakeReadCause::ForMatchedPlace; + let source_info = self.source_info(scrutinee_span); self.cfg.push_fake_read(block, source_info, cause_matched_place, scrutinee_place.clone()); - // Step 2. Create the otherwise and prebinding blocks. + block.and(scrutinee_place) + } - // create binding start block for link them by false edges + /// Create the initial `Candidate`s for a `match` expression. + fn create_match_candidates<'pat>( + &mut self, + scrutinee: &Place<'tcx>, + arms: &'pat [Arm<'tcx>], + ) -> Vec<(&'pat Arm<'tcx>, Vec>)> { let candidate_count = arms.iter().map(|c| c.top_pats_hack().len()).sum::(); - let pre_binding_blocks: Vec<_> = (0..candidate_count) - .map(|_| self.cfg.start_new_block()) - .collect(); - - let mut match_has_guard = false; + let pre_binding_blocks: Vec<_> = + (0..candidate_count).map(|_| self.cfg.start_new_block()).collect(); let mut candidate_pre_binding_blocks = pre_binding_blocks.iter(); let mut next_candidate_pre_binding_blocks = pre_binding_blocks.iter().skip(1); // Assemble a list of candidates: there is one candidate per pattern, // which means there may be more than one candidate *per arm*. - let mut arm_candidates: Vec<_> = arms - .iter() + arms.iter() .map(|arm| { let arm_has_guard = arm.guard.is_some(); - match_has_guard |= arm_has_guard; - let arm_candidates: Vec<_> = arm.top_pats_hack() + let arm_candidates: Vec<_> = arm + .top_pats_hack() .iter() .zip(candidate_pre_binding_blocks.by_ref()) - .map( - |(pattern, pre_binding_block)| { - Candidate { - span: pattern.span, - match_pairs: smallvec![ - MatchPair::new(scrutinee_place.clone(), pattern), - ], - bindings: vec![], - ascriptions: vec![], - otherwise_block: if arm_has_guard { - Some(self.cfg.start_new_block()) - } else { - None - }, - pre_binding_block: *pre_binding_block, - next_candidate_pre_binding_block: - next_candidate_pre_binding_blocks.next().copied(), - } + .map(|(pattern, pre_binding_block)| Candidate { + span: pattern.span, + match_pairs: smallvec![MatchPair::new(*scrutinee, pattern)], + bindings: vec![], + ascriptions: vec![], + otherwise_block: if arm_has_guard { + Some(self.cfg.start_new_block()) + } else { + None }, - ) + pre_binding_block: *pre_binding_block, + next_candidate_pre_binding_block: next_candidate_pre_binding_blocks + .next() + .copied(), + }) .collect(); (arm, arm_candidates) }) - .collect(); - - // Step 3. Create the decision tree and record the places that we bind or test. + .collect() + } + /// Create the decision tree for the match expression, starting from `block`. + /// + /// Modifies `candidates` to store the bindings and type ascriptions for + /// that candidate. + /// + /// Returns the places that need fake borrows because we bind or test them. + fn lower_match_tree<'pat>( + &mut self, + block: BasicBlock, + scrutinee_span: Span, + match_has_guard: bool, + mut candidates: Vec<&mut Candidate<'pat, 'tcx>>, + ) -> Vec<(Place<'tcx>, Local)> { // The set of places that we are creating fake borrows of. If there are // no match guards then we don't need any fake borrows, so don't track // them. - let mut fake_borrows = if match_has_guard && tcx.generate_borrow_of_any_match_input() { - Some(FxHashSet::default()) - } else { - None - }; - - // These candidates are kept sorted such that the highest priority - // candidate comes first in the list. (i.e., same order as in source) - // As we gnerate the decision tree, - let candidates = &mut arm_candidates - .iter_mut() - .flat_map(|(_, candidates)| candidates) - .collect::>(); + let mut fake_borrows = if match_has_guard { Some(FxHashSet::default()) } else { None }; - let outer_source_info = self.source_info(span); - - // this will generate code to test scrutinee_place and + // This will generate code to test scrutinee_place and // branch to the appropriate arm block self.match_candidates( scrutinee_span, &mut Some(block), None, - candidates, + &mut candidates, &mut fake_borrows, ); - // Step 4. Determine the fake borrows that are needed from the above - // places. Create the required temporaries for them. - - let fake_borrow_temps = if let Some(ref borrows) = fake_borrows { + if let Some(ref borrows) = fake_borrows { self.calculate_fake_borrows(borrows, scrutinee_span) } else { Vec::new() - }; + } + } - // Step 5. Create everything else: the guards and the arms. + /// Lower the bindings, guards and arm bodies of a `match` expression. + /// + /// The decision tree should have already been created + /// (by [Builder::lower_match_tree]). + /// + /// `outer_source_info` is the SourceInfo for the whole match. + fn lower_match_arms( + &mut self, + destination: &Place<'tcx>, + scrutinee_place: Place<'tcx>, + scrutinee_span: Span, + arm_candidates: Vec<(&'_ Arm<'tcx>, Vec>)>, + outer_source_info: SourceInfo, + fake_borrow_temps: Vec<(Place<'tcx>, Local)>, + ) -> BlockAnd<()> { let match_scope = self.scopes.topmost(); - let arm_end_blocks: Vec<_> = arm_candidates.into_iter().map(|(arm, mut candidates)| { - let arm_source_info = self.source_info(arm.span); - let arm_scope = (arm.scope, arm_source_info); - self.in_scope(arm_scope, arm.lint_level, |this| { - let body = this.hir.mirror(arm.body.clone()); - let scope = this.declare_bindings( - None, - arm.span, - &arm.top_pats_hack()[0], - ArmHasGuard(arm.guard.is_some()), - Some((Some(&scrutinee_place), scrutinee_span)), - ); + let arm_end_blocks: Vec<_> = arm_candidates + .into_iter() + .map(|(arm, candidates)| { + debug!("lowering arm {:?}\ncanidates = {:?}", arm, candidates); + + let arm_source_info = self.source_info(arm.span); + let arm_scope = (arm.scope, arm_source_info); + self.in_scope(arm_scope, arm.lint_level, |this| { + let body = this.hir.mirror(arm.body.clone()); + let scope = this.declare_bindings( + None, + arm.span, + &arm.top_pats_hack()[0], + ArmHasGuard(arm.guard.is_some()), + Some((Some(&scrutinee_place), scrutinee_span)), + ); - let arm_block; - if candidates.len() == 1 { - arm_block = this.bind_and_guard_matched_candidate( - candidates.pop().unwrap(), - arm.guard.clone(), + let arm_block = this.bind_pattern( + outer_source_info, + candidates, + arm.guard.as_ref().map(|g| (g, match_scope)), &fake_borrow_temps, scrutinee_span, - match_scope, + arm.scope, ); - } else { - arm_block = this.cfg.start_new_block(); - for candidate in candidates { - this.clear_top_scope(arm.scope); - let binding_end = this.bind_and_guard_matched_candidate( - candidate, - arm.guard.clone(), - &fake_borrow_temps, - scrutinee_span, - match_scope, - ); - this.cfg.terminate( - binding_end, - source_info, - TerminatorKind::Goto { target: arm_block }, - ); - } - } - if let Some(source_scope) = scope { - this.source_scope = source_scope; - } + if let Some(source_scope) = scope { + this.source_scope = source_scope; + } - this.into(destination, arm_block, body) + this.into(destination, arm_block, body) + }) }) - }).collect(); + .collect(); // all the arm blocks will rejoin here let end_block = self.cfg.start_new_block(); for arm_block in arm_end_blocks { - self.cfg.terminate( - unpack!(arm_block), - outer_source_info, - TerminatorKind::Goto { target: end_block }, - ); + self.cfg.goto(unpack!(arm_block), outer_source_info, end_block); } self.source_scope = outer_source_info.scope; @@ -290,6 +284,44 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { end_block.unit() } + /// Binds the variables and ascribes types for a given `match` arm. + /// + /// Also check if the guard matches, if it's provided. + fn bind_pattern( + &mut self, + outer_source_info: SourceInfo, + mut candidates: Vec>, + guard: Option<(&Guard<'tcx>, region::Scope)>, + fake_borrow_temps: &Vec<(Place<'tcx>, Local)>, + scrutinee_span: Span, + arm_scope: region::Scope, + ) -> BasicBlock { + if candidates.len() == 1 { + // Avoid generating another `BasicBlock` when we only have one + // candidate. + self.bind_and_guard_matched_candidate( + candidates.pop().unwrap(), + guard, + fake_borrow_temps, + scrutinee_span, + ) + } else { + let arm_block = self.cfg.start_new_block(); + for candidate in candidates { + // Avoid scheduling drops multiple times. + self.clear_top_scope(arm_scope); + let binding_end = self.bind_and_guard_matched_candidate( + candidate, + guard, + fake_borrow_temps, + scrutinee_span, + ); + self.cfg.goto(binding_end, outer_source_info, arm_block); + } + arm_block + } + } + pub(super) fn expr_into_pattern( &mut self, mut block: BasicBlock, @@ -298,12 +330,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ) -> BlockAnd<()> { match *irrefutable_pat.kind { // Optimize the case of `let x = ...` to write directly into `x` - PatKind::Binding { - mode: BindingMode::ByValue, - var, - subpattern: None, - .. - } => { + PatKind::Binding { mode: BindingMode::ByValue, var, subpattern: None, .. } => { let place = self.storage_live_binding(block, var, irrefutable_pat.span, OutsideGuard); unpack!(block = self.into(&place, block, initializer)); @@ -325,20 +352,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // dubious way, so it may be that the test is kind of // broken. PatKind::AscribeUserType { - subpattern: Pat { - kind: box PatKind::Binding { - mode: BindingMode::ByValue, - var, - subpattern: None, + subpattern: + Pat { + kind: + box PatKind::Binding { + mode: BindingMode::ByValue, + var, + subpattern: None, + .. + }, .. }, - .. - }, - ascription: hair::pattern::Ascription { - user_ty: pat_ascription_ty, - variance: _, - user_ty_span, - }, + ascription: + hair::pattern::Ascription { user_ty: pat_ascription_ty, variance: _, user_ty_span }, } => { let place = self.storage_live_binding(block, var, irrefutable_pat.span, OutsideGuard); @@ -360,10 +386,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { Statement { source_info: ty_source_info, kind: StatementKind::AscribeUserType( - box( - place, - user_ty, - ), + box (place, user_ty), // We always use invariant as the variance here. This is because the // variance field from the ascription refers to the variance to use // when applying the type to the value being matched, but this @@ -394,7 +417,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - pub fn place_into_pattern( + crate fn place_into_pattern( &mut self, block: BasicBlock, irrefutable_pat: Pat<'tcx>, @@ -404,7 +427,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // create a dummy candidate let mut candidate = Candidate { span: irrefutable_pat.span, - match_pairs: smallvec![MatchPair::new(initializer.clone(), &irrefutable_pat)], + match_pairs: smallvec![MatchPair::new(*initializer, &irrefutable_pat)], bindings: vec![], ascriptions: vec![], @@ -446,7 +469,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { .. }))) = self.local_decls[local].local_info { - *match_place = Some(initializer.clone()); + *match_place = Some(*initializer); } else { bug!("Let binding to non-user variable.") } @@ -465,7 +488,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// scope for the bindings in these patterns, if such a scope had to be /// created. NOTE: Declaring the bindings should always be done in their /// drop scope. - pub fn declare_bindings( + crate fn declare_bindings( &mut self, mut visibility_scope: Option, scope_span: Span, @@ -502,7 +525,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { visibility_scope } - pub fn storage_live_binding( + crate fn storage_live_binding( &mut self, block: BasicBlock, var: HirId, @@ -511,27 +534,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ) -> Place<'tcx> { let local_id = self.var_local_id(var, for_guard); let source_info = self.source_info(span); - self.cfg.push( - block, - Statement { - source_info, - kind: StatementKind::StorageLive(local_id), - }, - ); + self.cfg.push(block, Statement { source_info, kind: StatementKind::StorageLive(local_id) }); let region_scope = self.hir.region_scope_tree.var_scope(var.local_id); self.schedule_drop(span, region_scope, local_id, DropKind::Storage); Place::from(local_id) } - pub fn schedule_drop_for_binding(&mut self, var: HirId, span: Span, for_guard: ForGuard) { + crate fn schedule_drop_for_binding(&mut self, var: HirId, span: Span, for_guard: ForGuard) { let local_id = self.var_local_id(var, for_guard); let region_scope = self.hir.region_scope_tree.var_scope(var.local_id); - self.schedule_drop( - span, - region_scope, - local_id, - DropKind::Value, - ); + self.schedule_drop(span, region_scope, local_id, DropKind::Value); } pub(super) fn visit_bindings( @@ -551,31 +563,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ) { debug!("visit_bindings: pattern={:?} pattern_user_ty={:?}", pattern, pattern_user_ty); match *pattern.kind { - PatKind::Binding { - mutability, - name, - mode, - var, - ty, - ref subpattern, - .. - } => { + PatKind::Binding { mutability, name, mode, var, ty, ref subpattern, .. } => { f(self, mutability, name, mode, var, pattern.span, ty, pattern_user_ty.clone()); if let Some(subpattern) = subpattern.as_ref() { self.visit_bindings(subpattern, pattern_user_ty, f); } } - PatKind::Array { - ref prefix, - ref slice, - ref suffix, - } - | PatKind::Slice { - ref prefix, - ref slice, - ref suffix, - } => { + PatKind::Array { ref prefix, ref slice, ref suffix } + | PatKind::Slice { ref prefix, ref slice, ref suffix } => { let from = u32::try_from(prefix.len()).unwrap(); let to = u32::try_from(suffix.len()).unwrap(); for subpattern in prefix { @@ -597,11 +593,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { PatKind::AscribeUserType { ref subpattern, - ascription: hair::pattern::Ascription { - ref user_ty, - user_ty_span, - variance: _, - }, + ascription: hair::pattern::Ascription { ref user_ty, user_ty_span, variance: _ }, } => { // This corresponds to something like // @@ -634,8 +626,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { PatKind::Variant { adt_def, substs: _, variant_index, ref subpatterns } => { for subpattern in subpatterns { - let subpattern_user_ty = pattern_user_ty.clone().variant( - adt_def, variant_index, subpattern.field); + let subpattern_user_ty = + pattern_user_ty.clone().variant(adt_def, variant_index, subpattern.field); self.visit_bindings(&subpattern.pattern, subpattern_user_ty, f); } } @@ -649,7 +641,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } #[derive(Debug)] -pub struct Candidate<'pat, 'tcx> { +crate struct Candidate<'pat, 'tcx> { // span of the original pattern that gave rise to this candidate span: Span, @@ -693,7 +685,7 @@ struct Ascription<'tcx> { } #[derive(Clone, Debug)] -pub struct MatchPair<'pat, 'tcx> { +crate struct MatchPair<'pat, 'tcx> { // this place... place: Place<'tcx>, @@ -743,14 +735,11 @@ enum TestKind<'tcx> { Range(PatRange<'tcx>), /// Test length of the slice is equal to len - Len { - len: u64, - op: BinOp, - }, + Len { len: u64, op: BinOp }, } #[derive(Debug)] -pub struct Test<'tcx> { +crate struct Test<'tcx> { span: Span, kind: TestKind<'tcx>, } @@ -758,7 +747,7 @@ pub struct Test<'tcx> { /// ArmHasGuard is isomorphic to a boolean flag. It indicates whether /// a match arm has a guard expression attached to it. #[derive(Copy, Clone, Debug)] -pub(crate) struct ArmHasGuard(pub bool); +crate struct ArmHasGuard(crate bool); /////////////////////////////////////////////////////////////////////////// // Main matching algorithm @@ -796,10 +785,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ) { debug!( "matched_candidate(span={:?}, candidates={:?}, start_block={:?}, otherwise_block={:?})", - span, - candidates, - start_block, - otherwise_block, + span, candidates, start_block, otherwise_block, ); // Start by simplifying candidates. Once this process is complete, all @@ -812,67 +798,41 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // The candidates are sorted by priority. Check to see whether the // higher priority candidates (and hence at the front of the slice) // have satisfied all their match pairs. - let fully_matched = candidates - .iter() - .take_while(|c| c.match_pairs.is_empty()) - .count(); - debug!( - "match_candidates: {:?} candidates fully matched", - fully_matched - ); + let fully_matched = candidates.iter().take_while(|c| c.match_pairs.is_empty()).count(); + debug!("match_candidates: {:?} candidates fully matched", fully_matched); let (matched_candidates, unmatched_candidates) = candidates.split_at_mut(fully_matched); - let block: BasicBlock; - - if !matched_candidates.is_empty() { - let otherwise_block = self.select_matched_candidates( - matched_candidates, - start_block, - fake_borrows, - ); + let block: BasicBlock = if !matched_candidates.is_empty() { + let otherwise_block = + self.select_matched_candidates(matched_candidates, start_block, fake_borrows); if let Some(last_otherwise_block) = otherwise_block { - block = last_otherwise_block + last_otherwise_block } else { // Any remaining candidates are unreachable. if unmatched_candidates.is_empty() { return; } - block = self.cfg.start_new_block(); - }; + self.cfg.start_new_block() + } } else { - block = *start_block.get_or_insert_with(|| self.cfg.start_new_block()); - } + *start_block.get_or_insert_with(|| self.cfg.start_new_block()) + }; // If there are no candidates that still need testing, we're // done. Since all matches are exhaustive, execution should // never reach this point. if unmatched_candidates.is_empty() { let source_info = self.source_info(span); - if let Some(otherwise) = otherwise_block { - self.cfg.terminate( - block, - source_info, - TerminatorKind::Goto { target: otherwise }, - ); - } else { - self.cfg.terminate( - block, - source_info, - TerminatorKind::Unreachable, - ) + match otherwise_block { + Some(otherwise) => self.cfg.goto(block, source_info, otherwise), + None => self.cfg.terminate(block, source_info, TerminatorKind::Unreachable), } return; } // Test for the remaining candidates. - self.test_candidates( - span, - unmatched_candidates, - block, - otherwise_block, - fake_borrows, - ); + self.test_candidates(span, unmatched_candidates, block, otherwise_block, fake_borrows); } /// Link up matched candidates. For example, if we have something like @@ -885,7 +845,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// ... /// /// We generate real edges from: - /// * `block` to the prebinding_block of the first pattern, + /// * `start_block` to the `prebinding_block` of the first pattern, /// * the otherwise block of the first pattern to the second pattern, /// * the otherwise block of the third pattern to the a block with an /// Unreachable terminator. @@ -921,8 +881,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // _ => 3, // } if let Some(fake_borrows) = fake_borrows { - for Binding { source, .. } - in matched_candidates.iter().flat_map(|candidate| &candidate.bindings) + for Binding { source, .. } in + matched_candidates.iter().flat_map(|candidate| &candidate.bindings) { if let Some(i) = source.projection.iter().rposition(|elem| *elem == ProjectionElem::Deref) @@ -930,7 +890,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let proj_base = &source.projection[..i]; fake_borrows.insert(Place { - base: source.base.clone(), + local: source.local, projection: self.hir.tcx().intern_place_elems(proj_base), }); } @@ -942,38 +902,31 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { .position(|c| c.otherwise_block.is_none()) .unwrap_or(matched_candidates.len() - 1); - let (reachable_candidates, unreachable_candidates) - = matched_candidates.split_at_mut(fully_matched_with_guard + 1); + let (reachable_candidates, unreachable_candidates) = + matched_candidates.split_at_mut(fully_matched_with_guard + 1); let first_candidate = &reachable_candidates[0]; let first_prebinding_block = first_candidate.pre_binding_block; + // `goto -> first_prebinding_block` from the `start_block` if there is one. if let Some(start_block) = *start_block { let source_info = self.source_info(first_candidate.span); - self.cfg.terminate( - start_block, - source_info, - TerminatorKind::Goto { target: first_prebinding_block }, - ); + self.cfg.goto(start_block, source_info, first_prebinding_block); } else { *start_block = Some(first_prebinding_block); } - for window in reachable_candidates.windows(2) { - if let [first_candidate, second_candidate] = window { - let source_info = self.source_info(first_candidate.span); - if let Some(otherwise_block) = first_candidate.otherwise_block { - self.false_edges( - otherwise_block, - second_candidate.pre_binding_block, - first_candidate.next_candidate_pre_binding_block, - source_info, - ); - } else { - bug!("candidate other than the last has no guard"); - } + for (first_candidate, second_candidate) in reachable_candidates.iter().tuple_windows() { + let source_info = self.source_info(first_candidate.span); + if let Some(otherwise_block) = first_candidate.otherwise_block { + self.false_edges( + otherwise_block, + second_candidate.pre_binding_block, + first_candidate.next_candidate_pre_binding_block, + source_info, + ); } else { - bug!("<[_]>::windows returned incorrectly sized window"); + bug!("candidate other than the last has no guard"); } } @@ -993,7 +946,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } let last_candidate = reachable_candidates.last().unwrap(); - if let Some(otherwise) = last_candidate.otherwise_block { let source_info = self.source_info(last_candidate.span); let block = self.cfg.start_new_block(); @@ -1132,18 +1084,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // extract the match-pair from the highest priority candidate let match_pair = &candidates.first().unwrap().match_pairs[0]; let mut test = self.test(match_pair); - let match_place = match_pair.place.clone(); + let match_place = match_pair.place; // most of the time, the test to perform is simply a function // of the main candidate; but for a test like SwitchInt, we // may want to add cases based on the candidates that are // available match test.kind { - TestKind::SwitchInt { - switch_ty, - ref mut options, - ref mut indices, - } => { + TestKind::SwitchInt { switch_ty, ref mut options, ref mut indices } => { for candidate in candidates.iter() { if !self.add_cases_to_switch( &match_place, @@ -1156,10 +1104,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } } - TestKind::Switch { - adt_def: _, - ref mut variants, - } => { + TestKind::Switch { adt_def: _, ref mut variants } => { for candidate in candidates.iter() { if !self.add_variants_to_switch(&match_place, candidate, variants) { break; @@ -1170,18 +1115,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } // Insert a Shallow borrow of any places that is switched on. - fake_borrows.as_mut().map(|fb| { - fb.insert(match_place.clone()) - }); + fake_borrows.as_mut().map(|fb| fb.insert(match_place.clone())); // perform the test, branching to one of N blocks. For each of // those N possible outcomes, create a (initially empty) // vector of candidates. Those are the candidates that still // apply if the test has that particular outcome. - debug!( - "match_candidates: test={:?} match_pair={:?}", - test, match_pair - ); + debug!("match_candidates: test={:?} match_pair={:?}", test, match_pair); let mut target_candidates: Vec>> = vec![]; target_candidates.resize_with(test.targets(), Default::default); @@ -1226,47 +1166,65 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { otherwise_block = Some(remainder_start.unwrap()); }; - target_candidates.into_iter().map(|mut candidates| { - if candidates.len() != 0 { - let candidate_start = &mut None; - this.match_candidates( - span, - candidate_start, - otherwise_block, - &mut *candidates, - fake_borrows, - ); - candidate_start.unwrap() - } else { - *otherwise_block.get_or_insert_with(|| { - let unreachable = this.cfg.start_new_block(); - let source_info = this.source_info(span); - this.cfg.terminate( - unreachable, - source_info, - TerminatorKind::Unreachable, + target_candidates + .into_iter() + .map(|mut candidates| { + if candidates.len() != 0 { + let candidate_start = &mut None; + this.match_candidates( + span, + candidate_start, + otherwise_block, + &mut *candidates, + fake_borrows, ); - unreachable - }) - } - }).collect() + candidate_start.unwrap() + } else { + *otherwise_block.get_or_insert_with(|| { + let unreachable = this.cfg.start_new_block(); + let source_info = this.source_info(span); + this.cfg.terminate( + unreachable, + source_info, + TerminatorKind::Unreachable, + ); + unreachable + }) + } + }) + .collect() }; - self.perform_test( - block, - &match_place, - &test, - make_target_blocks, - ); + self.perform_test(block, &match_place, &test, make_target_blocks); } - // Determine the fake borrows that are needed to ensure that the place - // will evaluate to the same thing until an arm has been chosen. + /// Determine the fake borrows that are needed from a set of places that + /// have to be stable across match guards. + /// + /// Returns a list of places that need a fake borrow and the temporary + /// that's used to store the fake borrow. + /// + /// Match exhaustiveness checking is not able to handle the case where the + /// place being matched on is mutated in the guards. We add "fake borrows" + /// to the guards that prevent any mutation of the place being matched. + /// There are a some subtleties: + /// + /// 1. Borrowing `*x` doesn't prevent assigning to `x`. If `x` is a shared + /// reference, the borrow isn't even tracked. As such we have to add fake + /// borrows of any prefixes of a place + /// 2. We don't want `match x { _ => (), }` to conflict with mutable + /// borrows of `x`, so we only add fake borrows for places which are + /// bound or tested by the match. + /// 3. We don't want the fake borrows to conflict with `ref mut` bindings, + /// so we use a special BorrowKind for them. + /// 4. The fake borrows may be of places in inactive variants, so it would + /// be UB to generate code for them. They therefore have to be removed + /// by a MIR pass run after borrow checking. fn calculate_fake_borrows<'b>( &mut self, fake_borrows: &'b FxHashSet>, temp_span: Span, - ) -> Vec<(PlaceRef<'b, 'tcx>, Local)> { + ) -> Vec<(Place<'tcx>, Local)> { let tcx = self.hir.tcx(); debug!("add_fake_borrows fake_borrows = {:?}", fake_borrows); @@ -1274,8 +1232,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let mut all_fake_borrows = Vec::with_capacity(fake_borrows.len()); // Insert a Shallow borrow of the prefixes of any fake borrows. - for place in fake_borrows - { + for place in fake_borrows { let mut cursor = place.projection.as_ref(); while let [proj_base @ .., elem] = cursor { cursor = proj_base; @@ -1284,10 +1241,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Insert a shallow borrow after a deref. For other // projections the borrow of prefix_cursor will // conflict with any mutation of base. - all_fake_borrows.push(PlaceRef { - base: &place.base, - projection: proj_base, - }); + all_fake_borrows.push(PlaceRef { local: &place.local, projection: proj_base }); } } @@ -1300,21 +1254,21 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { debug!("add_fake_borrows all_fake_borrows = {:?}", all_fake_borrows); - all_fake_borrows.into_iter().map(|matched_place| { - let fake_borrow_deref_ty = Place::ty_from( - matched_place.base, - matched_place.projection, - &self.local_decls, - tcx, - ) - .ty; - let fake_borrow_ty = tcx.mk_imm_ref(tcx.lifetimes.re_erased, fake_borrow_deref_ty); - let fake_borrow_temp = self.local_decls.push( - LocalDecl::new_temp(fake_borrow_ty, temp_span) - ); + all_fake_borrows + .into_iter() + .map(|matched_place_ref| { + let matched_place = Place { + local: *matched_place_ref.local, + projection: tcx.intern_place_elems(matched_place_ref.projection), + }; + let fake_borrow_deref_ty = matched_place.ty(&self.local_decls, tcx).ty; + let fake_borrow_ty = tcx.mk_imm_ref(tcx.lifetimes.re_erased, fake_borrow_deref_ty); + let fake_borrow_temp = + self.local_decls.push(LocalDecl::new_temp(fake_borrow_ty, temp_span)); - (matched_place, fake_borrow_temp) - }).collect() + (matched_place, fake_borrow_temp) + }) + .collect() } } @@ -1333,10 +1287,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fn bind_and_guard_matched_candidate<'pat>( &mut self, candidate: Candidate<'pat, 'tcx>, - guard: Option>, - fake_borrows: &Vec<(PlaceRef<'_, 'tcx>, Local)>, + guard: Option<(&Guard<'tcx>, region::Scope)>, + fake_borrows: &Vec<(Place<'tcx>, Local)>, scrutinee_span: Span, - region_scope: region::Scope, ) -> BasicBlock { debug!("bind_and_guard_matched_candidate(candidate={:?})", candidate); @@ -1446,13 +1399,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // the reference that we create for the arm. // * So we eagerly create the reference for the arm and then take a // reference to that. - if let Some(guard) = guard { + if let Some((guard, region_scope)) = guard { let tcx = self.hir.tcx(); - self.bind_matched_candidate_for_guard( - block, - &candidate.bindings, - ); + self.bind_matched_candidate_for_guard(block, &candidate.bindings); let guard_frame = GuardFrame { locals: candidate .bindings @@ -1466,36 +1416,21 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let re_erased = tcx.lifetimes.re_erased; let scrutinee_source_info = self.source_info(scrutinee_span); for (place, temp) in fake_borrows { - let borrow = Rvalue::Ref( - re_erased, - BorrowKind::Shallow, - Place { - base: place.base.clone(), - projection: tcx.intern_place_elems(place.projection), - }, - ); - self.cfg.push_assign( - block, - scrutinee_source_info, - &Place::from(*temp), - borrow, - ); + let borrow = Rvalue::Ref(re_erased, BorrowKind::Shallow, *place); + self.cfg.push_assign(block, scrutinee_source_info, &Place::from(*temp), borrow); } // the block to branch to if the guard fails; if there is no // guard, this block is simply unreachable let guard = match guard { - Guard::If(e) => self.hir.mirror(e), + Guard::If(e) => self.hir.mirror(e.clone()), }; let source_info = self.source_info(guard.span); let guard_end = self.source_info(tcx.sess.source_map().end_point(guard.span)); - let (post_guard_block, otherwise_post_guard_block) - = self.test_bool(block, guard, source_info); + let (post_guard_block, otherwise_post_guard_block) = + self.test_bool(block, guard, source_info); let guard_frame = self.guard_context.pop().unwrap(); - debug!( - "Exiting guard building context with locals: {:?}", - guard_frame - ); + debug!("Exiting guard building context with locals: {:?}", guard_frame); for &(_, temp) in fake_borrows { let cause = FakeReadCause::ForMatchGuard; @@ -1545,10 +1480,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let cause = FakeReadCause::ForGuardBinding; self.cfg.push_fake_read(post_guard_block, guard_end, cause, Place::from(local_id)); } - self.bind_matched_candidate_for_arm_body( - post_guard_block, - by_value_bindings, - ); + self.bind_matched_candidate_for_arm_body(post_guard_block, by_value_bindings); post_guard_block } else { @@ -1569,25 +1501,20 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { debug!( "adding user ascription at span {:?} of place {:?} and {:?}", - source_info.span, - ascription.source, - ascription.user_ty, + source_info.span, ascription.source, ascription.user_ty, ); let user_ty = ascription.user_ty.clone().user_ty( &mut self.canonical_user_type_annotations, ascription.source.ty(&self.local_decls, self.hir.tcx()).ty, - source_info.span + source_info.span, ); self.cfg.push( block, Statement { source_info, kind: StatementKind::AscribeUserType( - box( - ascription.source.clone(), - user_ty, - ), + box (ascription.source, user_ty), ascription.variance, ), }, @@ -1595,11 +1522,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - fn bind_matched_candidate_for_guard( - &mut self, - block: BasicBlock, - bindings: &[Binding<'tcx>], - ) { + fn bind_matched_candidate_for_guard(&mut self, block: BasicBlock, bindings: &[Binding<'tcx>]) { debug!("bind_matched_candidate_for_guard(block={:?}, bindings={:?})", block, bindings); // Assign each of the bindings. Since we are binding for a @@ -1617,9 +1540,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { self.storage_live_binding(block, binding.var_id, binding.span, RefWithinGuard); match binding.binding_mode { BindingMode::ByValue => { - let rvalue = Rvalue::Ref(re_erased, BorrowKind::Shared, binding.source.clone()); - self.cfg - .push_assign(block, source_info, &ref_for_guard, rvalue); + let rvalue = Rvalue::Ref(re_erased, BorrowKind::Shared, binding.source); + self.cfg.push_assign(block, source_info, &ref_for_guard, rvalue); } BindingMode::ByRef(borrow_kind) => { let value_for_arm = self.storage_live_binding( @@ -1629,12 +1551,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { OutsideGuard, ); - let rvalue = Rvalue::Ref(re_erased, borrow_kind, binding.source.clone()); - self.cfg - .push_assign(block, source_info, &value_for_arm, rvalue); + let rvalue = Rvalue::Ref(re_erased, borrow_kind, binding.source); + self.cfg.push_assign(block, source_info, &value_for_arm, rvalue); let rvalue = Rvalue::Ref(re_erased, BorrowKind::Shared, value_for_arm); - self.cfg - .push_assign(block, source_info, &ref_for_guard, rvalue); + self.cfg.push_assign(block, source_info, &ref_for_guard, rvalue); } } } @@ -1644,7 +1564,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { &mut self, block: BasicBlock, bindings: impl IntoIterator>, - ) where 'tcx: 'b { + ) where + 'tcx: 'b, + { debug!("bind_matched_candidate_for_arm_body(block={:?})", block); let re_erased = self.hir.tcx().lifetimes.re_erased; @@ -1659,7 +1581,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { Rvalue::Use(self.consume_by_copy_or_move(binding.source.clone())) } BindingMode::ByRef(borrow_kind) => { - Rvalue::Ref(re_erased, borrow_kind, binding.source.clone()) + Rvalue::Ref(re_erased, borrow_kind, binding.source) } }; self.cfg.push_assign(block, source_info, &local, rvalue); @@ -1692,10 +1614,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ); let tcx = self.hir.tcx(); - let debug_source_info = SourceInfo { - span: source_info.span, - scope: visibility_scope, - }; + let debug_source_info = SourceInfo { span: source_info.span, scope: visibility_scope }; let binding_mode = match mode { BindingMode::ByValue => ty::BindingMode::BindByValue(mutability.into()), BindingMode::ByRef(_) => ty::BindingMode::BindByReference(mutability.into()), @@ -1708,18 +1627,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { source_info, internal: false, is_block_tail: None, - local_info: LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var( - VarBindingForm { - binding_mode, - // hypothetically, `visit_bindings` could try to unzip - // an outermost hir::Ty as we descend, matching up - // idents in pat; but complex w/ unclear UI payoff. - // Instead, just abandon providing diagnostic info. - opt_ty_info: None, - opt_match_place, - pat_span, - }, - ))), + local_info: LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm { + binding_mode, + // hypothetically, `visit_bindings` could try to unzip + // an outermost hir::Ty as we descend, matching up + // idents in pat; but complex w/ unclear UI payoff. + // Instead, just abandon providing diagnostic info. + opt_ty_info: None, + opt_match_place, + pat_span, + }))), }; let for_arm_body = self.local_decls.push(local); self.var_debug_info.push(VarDebugInfo { @@ -1744,10 +1661,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { source_info: debug_source_info, place: ref_for_guard.into(), }); - LocalsForNode::ForGuard { - ref_for_guard, - for_arm_body, - } + LocalsForNode::ForGuard { ref_for_guard, for_arm_body } } else { LocalsForNode::One(for_arm_body) }; diff --git a/src/librustc_mir/build/matches/simplify.rs b/src/librustc_mir_build/build/matches/simplify.rs similarity index 79% rename from src/librustc_mir/build/matches/simplify.rs rename to src/librustc_mir_build/build/matches/simplify.rs index 3e71b87180..fb3babca32 100644 --- a/src/librustc_mir/build/matches/simplify.rs +++ b/src/librustc_mir_build/build/matches/simplify.rs @@ -12,20 +12,19 @@ //! sort of test: for example, testing which variant an enum is, or //! testing a value against a constant. +use crate::build::matches::{Ascription, Binding, Candidate, MatchPair}; use crate::build::Builder; -use crate::build::matches::{Ascription, Binding, MatchPair, Candidate}; use crate::hair::{self, *}; +use rustc::mir::interpret::truncate; use rustc::ty; use rustc::ty::layout::{Integer, IntegerExt, Size}; +use rustc_hir::RangeEnd; use syntax::attr::{SignedInt, UnsignedInt}; -use rustc::hir::RangeEnd; -use rustc::mir::interpret::truncate; use std::mem; impl<'a, 'tcx> Builder<'a, 'tcx> { - pub fn simplify_candidate<'pat>(&mut self, - candidate: &mut Candidate<'pat, 'tcx>) { + crate fn simplify_candidate<'pat>(&mut self, candidate: &mut Candidate<'pat, 'tcx>) { // repeatedly simplify match pairs until fixed point is reached loop { let match_pairs = mem::take(&mut candidate.match_pairs); @@ -51,26 +50,23 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// have been pushed into the candidate. If no simplification is /// possible, `Err` is returned and no changes are made to /// candidate. - fn simplify_match_pair<'pat>(&mut self, - match_pair: MatchPair<'pat, 'tcx>, - candidate: &mut Candidate<'pat, 'tcx>) - -> Result<(), MatchPair<'pat, 'tcx>> { + fn simplify_match_pair<'pat>( + &mut self, + match_pair: MatchPair<'pat, 'tcx>, + candidate: &mut Candidate<'pat, 'tcx>, + ) -> Result<(), MatchPair<'pat, 'tcx>> { let tcx = self.hir.tcx(); match *match_pair.pattern.kind { PatKind::AscribeUserType { ref subpattern, - ascription: hair::pattern::Ascription { - variance, - ref user_ty, - user_ty_span, - }, + ascription: hair::pattern::Ascription { variance, user_ty, user_ty_span }, } => { // Apply the type ascription to the value at `match_pair.place`, which is the // value being matched, taking the variance field into account. candidate.ascriptions.push(Ascription { span: user_ty_span, - user_ty: user_ty.clone(), - source: match_pair.place.clone(), + user_ty: user_ty, + source: match_pair.place, variance, }); @@ -89,7 +85,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { name, mutability, span: match_pair.pattern.span, - source: match_pair.place.clone(), + source: match_pair.place, var_id: var, var_ty: ty, binding_mode: mode, @@ -147,11 +143,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { PatKind::Slice { ref prefix, ref slice, ref suffix } => { if prefix.is_empty() && slice.is_some() && suffix.is_empty() { // irrefutable - self.prefix_slice_suffix(&mut candidate.match_pairs, - &match_pair.place, - prefix, - slice.as_ref(), - suffix); + self.prefix_slice_suffix( + &mut candidate.match_pairs, + &match_pair.place, + prefix, + slice.as_ref(), + suffix, + ); Ok(()) } else { Err(match_pair) @@ -161,10 +159,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { PatKind::Variant { adt_def, substs, variant_index, ref subpatterns } => { let irrefutable = adt_def.variants.iter_enumerated().all(|(i, v)| { i == variant_index || { - self.hir.tcx().features().exhaustive_patterns && - !v.uninhabited_from(self.hir.tcx(), substs, adt_def.adt_kind()).is_empty() + self.hir.tcx().features().exhaustive_patterns + && !v + .uninhabited_from(self.hir.tcx(), substs, adt_def.adt_kind()) + .is_empty() } - }) && (adt_def.did.is_local() || !adt_def.is_variant_list_non_exhaustive()); + }) && (adt_def.did.is_local() + || !adt_def.is_variant_list_non_exhaustive()); if irrefutable { let place = tcx.mk_place_downcast(match_pair.place, adt_def, variant_index); candidate.match_pairs.extend(self.field_match_pairs(place, subpatterns)); @@ -175,18 +176,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } PatKind::Array { ref prefix, ref slice, ref suffix } => { - self.prefix_slice_suffix(&mut candidate.match_pairs, - &match_pair.place, - prefix, - slice.as_ref(), - suffix); + self.prefix_slice_suffix( + &mut candidate.match_pairs, + &match_pair.place, + prefix, + slice.as_ref(), + suffix, + ); Ok(()) } PatKind::Leaf { ref subpatterns } => { // tuple struct, match subpats (if any) - candidate.match_pairs - .extend(self.field_match_pairs(match_pair.place, subpatterns)); + candidate.match_pairs.extend(self.field_match_pairs(match_pair.place, subpatterns)); Ok(()) } @@ -196,9 +198,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { Ok(()) } - PatKind::Or { .. } => { - Err(match_pair) - } + PatKind::Or { .. } => Err(match_pair), } } } diff --git a/src/librustc_mir/build/matches/test.rs b/src/librustc_mir_build/build/matches/test.rs similarity index 73% rename from src/librustc_mir/build/matches/test.rs rename to src/librustc_mir_build/build/matches/test.rs index e320811ca0..1f97f5f1b7 100644 --- a/src/librustc_mir/build/matches/test.rs +++ b/src/librustc_mir_build/build/matches/test.rs @@ -5,18 +5,18 @@ // identify what tests are needed, perform the tests, and then filter // the candidates based on the result. -use crate::build::Builder; use crate::build::matches::{Candidate, MatchPair, Test, TestKind}; -use crate::hair::*; +use crate::build::Builder; use crate::hair::pattern::compare_const_vals; -use rustc_index::bit_set::BitSet; -use rustc_data_structures::fx::FxHashMap; -use rustc::ty::{self, Ty, adjustment::PointerCast}; -use rustc::ty::util::IntTypeExt; -use rustc::ty::layout::VariantIdx; +use crate::hair::*; use rustc::mir::*; -use rustc::hir::RangeEnd; -use syntax_pos::symbol::sym; +use rustc::ty::layout::VariantIdx; +use rustc::ty::util::IntTypeExt; +use rustc::ty::{self, adjustment::PointerCast, Ty}; +use rustc_data_structures::fx::FxHashMap; +use rustc_hir::RangeEnd; +use rustc_index::bit_set::BitSet; +use rustc_span::symbol::sym; use std::cmp::Ordering; @@ -24,17 +24,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// Identifies what test is needed to decide if `match_pair` is applicable. /// /// It is a bug to call this with a simplifiable pattern. - pub fn test<'pat>(&mut self, match_pair: &MatchPair<'pat, 'tcx>) -> Test<'tcx> { + crate fn test<'pat>(&mut self, match_pair: &MatchPair<'pat, 'tcx>) -> Test<'tcx> { match *match_pair.pattern.kind { - PatKind::Variant { ref adt_def, substs: _, variant_index: _, subpatterns: _ } => { - Test { - span: match_pair.pattern.span, - kind: TestKind::Switch { - adt_def: adt_def.clone(), - variants: BitSet::new_empty(adt_def.variants.len()), - }, - } - } + PatKind::Variant { ref adt_def, substs: _, variant_index: _, subpatterns: _ } => Test { + span: match_pair.pattern.span, + kind: TestKind::Switch { + adt_def, + variants: BitSet::new_empty(adt_def.variants.len()), + }, + }, PatKind::Constant { .. } if is_switch_ty(match_pair.pattern.ty) => { // For integers, we use a `SwitchInt` match, which allows @@ -48,82 +46,66 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // added below in add_cases_to_switch options: vec![], indices: Default::default(), - } + }, } } - PatKind::Constant { value } => { - Test { - span: match_pair.pattern.span, - kind: TestKind::Eq { - value, - ty: match_pair.pattern.ty.clone() - } - } - } + PatKind::Constant { value } => Test { + span: match_pair.pattern.span, + kind: TestKind::Eq { value, ty: match_pair.pattern.ty.clone() }, + }, PatKind::Range(range) => { assert_eq!(range.lo.ty, match_pair.pattern.ty); assert_eq!(range.hi.ty, match_pair.pattern.ty); - Test { - span: match_pair.pattern.span, - kind: TestKind::Range(range), - } + Test { span: match_pair.pattern.span, kind: TestKind::Range(range) } } PatKind::Slice { ref prefix, ref slice, ref suffix } => { let len = prefix.len() + suffix.len(); - let op = if slice.is_some() { - BinOp::Ge - } else { - BinOp::Eq - }; + let op = if slice.is_some() { BinOp::Ge } else { BinOp::Eq }; Test { span: match_pair.pattern.span, kind: TestKind::Len { len: len as u64, op: op }, } } - PatKind::Or { .. } => { - self.hir.tcx().sess.span_fatal( - match_pair.pattern.span, - "or-patterns are not fully implemented yet" - ) - } - - PatKind::AscribeUserType { .. } | - PatKind::Array { .. } | - PatKind::Wild | - PatKind::Binding { .. } | - PatKind::Leaf { .. } | - PatKind::Deref { .. } => { - self.error_simplifyable(match_pair) - } + PatKind::Or { .. } => self + .hir + .tcx() + .sess + .span_fatal(match_pair.pattern.span, "or-patterns are not fully implemented yet"), + + PatKind::AscribeUserType { .. } + | PatKind::Array { .. } + | PatKind::Wild + | PatKind::Binding { .. } + | PatKind::Leaf { .. } + | PatKind::Deref { .. } => self.error_simplifyable(match_pair), } } - pub fn add_cases_to_switch<'pat>(&mut self, - test_place: &Place<'tcx>, - candidate: &Candidate<'pat, 'tcx>, - switch_ty: Ty<'tcx>, - options: &mut Vec, - indices: &mut FxHashMap<&'tcx ty::Const<'tcx>, usize>) - -> bool - { + crate fn add_cases_to_switch<'pat>( + &mut self, + test_place: &Place<'tcx>, + candidate: &Candidate<'pat, 'tcx>, + switch_ty: Ty<'tcx>, + options: &mut Vec, + indices: &mut FxHashMap<&'tcx ty::Const<'tcx>, usize>, + ) -> bool { let match_pair = match candidate.match_pairs.iter().find(|mp| mp.place == *test_place) { Some(match_pair) => match_pair, - _ => { return false; } + _ => { + return false; + } }; match *match_pair.pattern.kind { PatKind::Constant { value } => { - indices.entry(value) - .or_insert_with(|| { - options.push(value.eval_bits( - self.hir.tcx(), self.hir.param_env, switch_ty, - )); - options.len() - 1 - }); + indices.entry(value).or_insert_with(|| { + options.push(value.eval_bits(self.hir.tcx(), self.hir.param_env, switch_ty)); + options.len() - 1 + }); true } PatKind::Variant { .. } => { @@ -131,36 +113,37 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } PatKind::Range(range) => { // Check that none of the switch values are in the range. - self.values_not_contained_in_range(range, indices) - .unwrap_or(false) + self.values_not_contained_in_range(range, indices).unwrap_or(false) } - PatKind::Slice { .. } | - PatKind::Array { .. } | - PatKind::Wild | - PatKind::Or { .. } | - PatKind::Binding { .. } | - PatKind::AscribeUserType { .. } | - PatKind::Leaf { .. } | - PatKind::Deref { .. } => { + PatKind::Slice { .. } + | PatKind::Array { .. } + | PatKind::Wild + | PatKind::Or { .. } + | PatKind::Binding { .. } + | PatKind::AscribeUserType { .. } + | PatKind::Leaf { .. } + | PatKind::Deref { .. } => { // don't know how to add these patterns to a switch false } } } - pub fn add_variants_to_switch<'pat>(&mut self, - test_place: &Place<'tcx>, - candidate: &Candidate<'pat, 'tcx>, - variants: &mut BitSet) - -> bool - { + crate fn add_variants_to_switch<'pat>( + &mut self, + test_place: &Place<'tcx>, + candidate: &Candidate<'pat, 'tcx>, + variants: &mut BitSet, + ) -> bool { let match_pair = match candidate.match_pairs.iter().find(|mp| mp.place == *test_place) { Some(match_pair) => match_pair, - _ => { return false; } + _ => { + return false; + } }; match *match_pair.pattern.kind { - PatKind::Variant { adt_def: _ , variant_index, .. } => { + PatKind::Variant { adt_def: _, variant_index, .. } => { // We have a pattern testing for variant `variant_index` // set the corresponding index to true variants.insert(variant_index); @@ -173,18 +156,20 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - pub fn perform_test( + crate fn perform_test( &mut self, block: BasicBlock, place: &Place<'tcx>, test: &Test<'tcx>, make_target_blocks: impl FnOnce(&mut Self) -> Vec, ) { - debug!("perform_test({:?}, {:?}: {:?}, {:?})", - block, - place, - place.ty(&self.local_decls, self.hir.tcx()), - test); + debug!( + "perform_test({:?}, {:?}: {:?}, {:?})", + block, + place, + place.ty(&self.local_decls, self.hir.tcx()), + test + ); let source_info = self.source_info(test.span); match test.kind { @@ -218,19 +203,24 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } targets.push(otherwise_block); - debug!("num_enum_variants: {}, tested variants: {:?}, variants: {:?}", - num_enum_variants, values, variants); + debug!( + "num_enum_variants: {}, tested variants: {:?}, variants: {:?}", + num_enum_variants, values, variants + ); let discr_ty = adt_def.repr.discr_type().to_ty(tcx); let discr = self.temp(discr_ty, test.span); - self.cfg.push_assign(block, source_info, &discr, - Rvalue::Discriminant(place.clone())); + self.cfg.push_assign(block, source_info, &discr, Rvalue::Discriminant(*place)); assert_eq!(values.len() + 1, targets.len()); - self.cfg.terminate(block, source_info, TerminatorKind::SwitchInt { - discr: Operand::Move(discr), - switch_ty: discr_ty, - values: From::from(values), - targets, - }); + self.cfg.terminate( + block, + source_info, + TerminatorKind::SwitchInt { + discr: Operand::Move(discr), + switch_ty: discr_ty, + values: From::from(values), + targets, + }, + ); } TestKind::SwitchInt { switch_ty, ref options, indices: _ } => { @@ -241,11 +231,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let (true_bb, false_bb) = match options[0] { 1 => (first_bb, second_bb), 0 => (second_bb, first_bb), - v => span_bug!(test.span, "expected boolean value but got {:?}", v) + v => span_bug!(test.span, "expected boolean value but got {:?}", v), }; TerminatorKind::if_( self.hir.tcx(), - Operand::Copy(place.clone()), + Operand::Copy(*place), true_bb, false_bb, ) @@ -256,7 +246,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // The switch may be inexhaustive so we have a catch all block debug_assert_eq!(options.len() + 1, target_blocks.len()); TerminatorKind::SwitchInt { - discr: Operand::Copy(place.clone()), + discr: Operand::Copy(*place), switch_ty, values: options.clone().into(), targets: target_blocks, @@ -281,7 +271,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { if let [success, fail] = *make_target_blocks(self) { assert_eq!(value.ty, ty); let expect = self.literal_operand(test.span, value); - let val = Operand::Copy(place.clone()); + let val = Operand::Copy(*place); self.compare(block, success, fail, source_info, BinOp::Eq, expect, val); } else { bug!("`TestKind::Eq` should have two target blocks"); @@ -296,7 +286,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Test `val` by computing `lo <= val && val <= hi`, using primitive comparisons. let lo = self.literal_operand(test.span, lo); let hi = self.literal_operand(test.span, hi); - let val = Operand::Copy(place.clone()); + let val = Operand::Copy(*place); if let [success, fail] = *target_blocks { self.compare( @@ -325,8 +315,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let actual = self.temp(usize_ty, test.span); // actual = len(place) - self.cfg.push_assign(block, source_info, - &actual, Rvalue::Len(place.clone())); + self.cfg.push_assign(block, source_info, &actual, Rvalue::Len(*place)); // expected = let expected = self.push_usize(block, source_info, len); @@ -365,23 +354,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let result = self.temp(bool_ty, source_info.span); // result = op(left, right) - self.cfg.push_assign( - block, - source_info, - &result, - Rvalue::BinaryOp(op, left, right), - ); + self.cfg.push_assign(block, source_info, &result, Rvalue::BinaryOp(op, left, right)); // branch based on result self.cfg.terminate( block, source_info, - TerminatorKind::if_( - self.hir.tcx(), - Operand::Move(result), - success_block, - fail_block, - ), + TerminatorKind::if_(self.hir.tcx(), Operand::Move(result), success_block, fail_block), ); } @@ -398,7 +377,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { use rustc::middle::lang_items::EqTraitLangItem; let mut expect = self.literal_operand(source_info.span, value); - let mut val = Operand::Copy(place.clone()); + let mut val = Operand::Copy(*place); // If we're using `b"..."` as a pattern, we need to insert an // unsizing coercion, as the byte string has the type `&[u8; N]`. @@ -417,31 +396,32 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let opt_ref_test_ty = unsize(value.ty); match (opt_ref_ty, opt_ref_test_ty) { // nothing to do, neither is an array - (None, None) => {}, - (Some((region, elem_ty, _)), _) | - (None, Some((region, elem_ty, _))) => { + (None, None) => {} + (Some((region, elem_ty, _)), _) | (None, Some((region, elem_ty, _))) => { let tcx = self.hir.tcx(); // make both a slice ty = tcx.mk_imm_ref(region, tcx.mk_slice(elem_ty)); if opt_ref_ty.is_some() { let temp = self.temp(ty, source_info.span); self.cfg.push_assign( - block, source_info, &temp, Rvalue::Cast( - CastKind::Pointer(PointerCast::Unsize), val, ty - ) + block, + source_info, + &temp, + Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), val, ty), ); val = Operand::Move(temp); } if opt_ref_test_ty.is_some() { let slice = self.temp(ty, source_info.span); self.cfg.push_assign( - block, source_info, &slice, Rvalue::Cast( - CastKind::Pointer(PointerCast::Unsize), expect, ty - ) + block, + source_info, + &slice, + Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), expect, ty), ); expect = Operand::Move(slice); } - }, + } } let deref_ty = match ty.kind { @@ -456,23 +436,27 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let eq_result = self.temp(bool_ty, source_info.span); let eq_block = self.cfg.start_new_block(); let cleanup = self.diverge_cleanup(); - self.cfg.terminate(block, source_info, TerminatorKind::Call { - func: Operand::Constant(box Constant { - span: source_info.span, - - // FIXME(#54571): This constant comes from user input (a - // constant in a pattern). Are there forms where users can add - // type annotations here? For example, an associated constant? - // Need to experiment. - user_ty: None, - - literal: method, - }), - args: vec![val, expect], - destination: Some((eq_result.clone(), eq_block)), - cleanup: Some(cleanup), - from_hir_call: false, - }); + self.cfg.terminate( + block, + source_info, + TerminatorKind::Call { + func: Operand::Constant(box Constant { + span: source_info.span, + + // FIXME(#54571): This constant comes from user input (a + // constant in a pattern). Are there forms where users can add + // type annotations here? For example, an associated constant? + // Need to experiment. + user_ty: None, + + literal: method, + }), + args: vec![val, expect], + destination: Some((eq_result, eq_block)), + cleanup: Some(cleanup), + from_hir_call: false, + }, + ); if let [success_block, fail_block] = *make_target_blocks(self) { // check the result @@ -518,7 +502,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// that it *doesn't* apply. For now, we return false, indicate that the /// test does not apply to this candidate, but it might be we can get /// tighter match code if we do something a bit different. - pub fn sort_candidate<'pat>( + crate fn sort_candidate<'pat>( &mut self, test_place: &Place<'tcx>, test: &Test<'tcx>, @@ -530,22 +514,24 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // than one, but it'd be very unusual to have two sides that // both require tests; you'd expect one side to be simplified // away.) - let (match_pair_index, match_pair) = candidate.match_pairs - .iter() - .enumerate() - .find(|&(_, mp)| mp.place == *test_place)?; + let (match_pair_index, match_pair) = + candidate.match_pairs.iter().enumerate().find(|&(_, mp)| mp.place == *test_place)?; match (&test.kind, &*match_pair.pattern.kind) { // If we are performing a variant switch, then this // informs variant patterns, but nothing else. - (&TestKind::Switch { adt_def: tested_adt_def, .. }, - &PatKind::Variant { adt_def, variant_index, ref subpatterns, .. }) => { + ( + &TestKind::Switch { adt_def: tested_adt_def, .. }, + &PatKind::Variant { adt_def, variant_index, ref subpatterns, .. }, + ) => { assert_eq!(adt_def, tested_adt_def); - self.candidate_after_variant_switch(match_pair_index, - adt_def, - variant_index, - subpatterns, - candidate); + self.candidate_after_variant_switch( + match_pair_index, + adt_def, + variant_index, + subpatterns, + candidate, + ); Some(variant_index.as_usize()) } @@ -556,19 +542,21 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // // FIXME(#29623) we could use PatKind::Range to rule // things out here, in some cases. - (&TestKind::SwitchInt { switch_ty: _, options: _, ref indices }, - &PatKind::Constant { ref value }) - if is_switch_ty(match_pair.pattern.ty) => { + ( + &TestKind::SwitchInt { switch_ty: _, options: _, ref indices }, + &PatKind::Constant { ref value }, + ) if is_switch_ty(match_pair.pattern.ty) => { let index = indices[value]; self.candidate_without_match_pair(match_pair_index, candidate); Some(index) } - (&TestKind::SwitchInt { switch_ty: _, ref options, ref indices }, - &PatKind::Range(range)) => { - let not_contained = self - .values_not_contained_in_range(range, indices) - .unwrap_or(false); + ( + &TestKind::SwitchInt { switch_ty: _, ref options, ref indices }, + &PatKind::Range(range), + ) => { + let not_contained = + self.values_not_contained_in_range(range, indices).unwrap_or(false); if not_contained { // No switch values are contained in the pattern range, @@ -582,18 +570,22 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { (&TestKind::SwitchInt { .. }, _) => None, - (&TestKind::Len { len: test_len, op: BinOp::Eq }, - &PatKind::Slice { ref prefix, ref slice, ref suffix }) => { + ( + &TestKind::Len { len: test_len, op: BinOp::Eq }, + &PatKind::Slice { ref prefix, ref slice, ref suffix }, + ) => { let pat_len = (prefix.len() + suffix.len()) as u64; match (test_len.cmp(&pat_len), slice) { (Ordering::Equal, &None) => { // on true, min_len = len = $actual_length, // on false, len != $actual_length - self.candidate_after_slice_test(match_pair_index, - candidate, - prefix, - slice.as_ref(), - suffix); + self.candidate_after_slice_test( + match_pair_index, + candidate, + prefix, + slice.as_ref(), + suffix, + ); Some(0) } (Ordering::Less, _) => { @@ -615,19 +607,23 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - (&TestKind::Len { len: test_len, op: BinOp::Ge }, - &PatKind::Slice { ref prefix, ref slice, ref suffix }) => { + ( + &TestKind::Len { len: test_len, op: BinOp::Ge }, + &PatKind::Slice { ref prefix, ref slice, ref suffix }, + ) => { // the test is `$actual_len >= test_len` let pat_len = (prefix.len() + suffix.len()) as u64; match (test_len.cmp(&pat_len), slice) { - (Ordering::Equal, &Some(_)) => { + (Ordering::Equal, &Some(_)) => { // $actual_len >= test_len = pat_len, // so we can match. - self.candidate_after_slice_test(match_pair_index, - candidate, - prefix, - slice.as_ref(), - suffix); + self.candidate_after_slice_test( + match_pair_index, + candidate, + prefix, + slice.as_ref(), + suffix, + ); Some(0) } (Ordering::Less, _) | (Ordering::Equal, &None) => { @@ -649,19 +645,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - (&TestKind::Range(test), - &PatKind::Range(pat)) => { + (&TestKind::Range(test), &PatKind::Range(pat)) => { if test == pat { - self.candidate_without_match_pair( - match_pair_index, - candidate, - ); + self.candidate_without_match_pair(match_pair_index, candidate); return Some(0); } let no_overlap = (|| { + use rustc_hir::RangeEnd::*; use std::cmp::Ordering::*; - use rustc::hir::RangeEnd::*; let tcx = self.hir.tcx(); @@ -701,8 +693,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { (&TestKind::Range { .. }, _) => None, - (&TestKind::Eq { .. }, _) | - (&TestKind::Len { .. }, _) => { + (&TestKind::Eq { .. }, _) | (&TestKind::Len { .. }, _) => { // These are all binary tests. // // FIXME(#29623) we can be more clever here @@ -725,19 +716,22 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { candidate.match_pairs.remove(match_pair_index); } - fn candidate_after_slice_test<'pat>(&mut self, - match_pair_index: usize, - candidate: &mut Candidate<'pat, 'tcx>, - prefix: &'pat [Pat<'tcx>], - opt_slice: Option<&'pat Pat<'tcx>>, - suffix: &'pat [Pat<'tcx>]) { + fn candidate_after_slice_test<'pat>( + &mut self, + match_pair_index: usize, + candidate: &mut Candidate<'pat, 'tcx>, + prefix: &'pat [Pat<'tcx>], + opt_slice: Option<&'pat Pat<'tcx>>, + suffix: &'pat [Pat<'tcx>], + ) { let removed_place = candidate.match_pairs.remove(match_pair_index).place; self.prefix_slice_suffix( &mut candidate.match_pairs, &removed_place, prefix, opt_slice, - suffix); + suffix, + ); } fn candidate_after_variant_switch<'pat>( @@ -755,7 +749,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // we want to create a set of derived match-patterns like // `(x as Variant).0 @ P1` and `(x as Variant).1 @ P1`. let elem = ProjectionElem::Downcast( - Some(adt_def.variants[variant_index].ident.name), variant_index); + Some(adt_def.variants[variant_index].ident.name), + variant_index, + ); let downcast_place = tcx.mk_place_elem(match_pair.place, elem); // `(x as Variant)` let consequent_match_pairs = subpatterns.iter().map(|subpattern| { // e.g., `(x as Variant).0` @@ -769,9 +765,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } fn error_simplifyable<'pat>(&mut self, match_pair: &MatchPair<'pat, 'tcx>) -> ! { - span_bug!(match_pair.pattern.span, - "simplifyable pattern found: {:?}", - match_pair.pattern) + span_bug!(match_pair.pattern.span, "simplifyable pattern found: {:?}", match_pair.pattern) } fn const_range_contains( @@ -787,8 +781,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let b = compare_const_vals(tcx, value, range.hi, self.hir.param_env, range.lo.ty)?; match (b, range.end) { - (Less, _) | - (Equal, RangeEnd::Included) if a != Greater => Some(true), + (Less, _) | (Equal, RangeEnd::Included) if a != Greater => Some(true), _ => Some(false), } } @@ -811,9 +804,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { impl Test<'_> { pub(super) fn targets(&self) -> usize { match self.kind { - TestKind::Eq { .. } | TestKind::Range(_) | TestKind::Len { .. } => { - 2 - } + TestKind::Eq { .. } | TestKind::Range(_) | TestKind::Len { .. } => 2, TestKind::Switch { adt_def, .. } => { // While the switch that we generate doesn't test for all // variants, we have a target for each variant and the diff --git a/src/librustc_mir_build/build/matches/util.rs b/src/librustc_mir_build/build/matches/util.rs new file mode 100644 index 0000000000..def8d1b2fd --- /dev/null +++ b/src/librustc_mir_build/build/matches/util.rs @@ -0,0 +1,104 @@ +use crate::build::matches::MatchPair; +use crate::build::Builder; +use crate::hair::*; +use rustc::mir::*; +use rustc::ty; +use smallvec::SmallVec; +use std::convert::TryInto; +use std::u32; + +impl<'a, 'tcx> Builder<'a, 'tcx> { + crate fn field_match_pairs<'pat>( + &mut self, + place: Place<'tcx>, + subpatterns: &'pat [FieldPat<'tcx>], + ) -> Vec> { + subpatterns + .iter() + .map(|fieldpat| { + let place = self.hir.tcx().mk_place_field( + place.clone(), + fieldpat.field, + fieldpat.pattern.ty, + ); + MatchPair::new(place, &fieldpat.pattern) + }) + .collect() + } + + crate fn prefix_slice_suffix<'pat>( + &mut self, + match_pairs: &mut SmallVec<[MatchPair<'pat, 'tcx>; 1]>, + place: &Place<'tcx>, + prefix: &'pat [Pat<'tcx>], + opt_slice: Option<&'pat Pat<'tcx>>, + suffix: &'pat [Pat<'tcx>], + ) { + let tcx = self.hir.tcx(); + let (min_length, exact_size) = match place.ty(&self.local_decls, tcx).ty.kind { + ty::Array(_, length) => { + (length.eval_usize(tcx, self.hir.param_env).try_into().unwrap(), true) + } + _ => ((prefix.len() + suffix.len()).try_into().unwrap(), false), + }; + + match_pairs.extend(prefix.iter().enumerate().map(|(idx, subpattern)| { + let elem = + ProjectionElem::ConstantIndex { offset: idx as u32, min_length, from_end: false }; + let place = tcx.mk_place_elem(place.clone(), elem); + MatchPair::new(place, subpattern) + })); + + if let Some(subslice_pat) = opt_slice { + let suffix_len = suffix.len() as u32; + let subslice = tcx.mk_place_elem( + place.clone(), + ProjectionElem::Subslice { + from: prefix.len() as u32, + to: if exact_size { min_length - suffix_len } else { suffix_len }, + from_end: !exact_size, + }, + ); + match_pairs.push(MatchPair::new(subslice, subslice_pat)); + } + + match_pairs.extend(suffix.iter().rev().enumerate().map(|(idx, subpattern)| { + let end_offset = (idx + 1) as u32; + let elem = ProjectionElem::ConstantIndex { + offset: if exact_size { min_length - end_offset } else { end_offset }, + min_length, + from_end: !exact_size, + }; + let place = tcx.mk_place_elem(place.clone(), elem); + MatchPair::new(place, subpattern) + })); + } + + /// Creates a false edge to `imaginary_target` and a real edge to + /// real_target. If `imaginary_target` is none, or is the same as the real + /// target, a Goto is generated instead to simplify the generated MIR. + crate fn false_edges( + &mut self, + from_block: BasicBlock, + real_target: BasicBlock, + imaginary_target: Option, + source_info: SourceInfo, + ) { + match imaginary_target { + Some(target) if target != real_target => { + self.cfg.terminate( + from_block, + source_info, + TerminatorKind::FalseEdges { real_target, imaginary_target: target }, + ); + } + _ => self.cfg.goto(from_block, source_info, real_target), + } + } +} + +impl<'pat, 'tcx> MatchPair<'pat, 'tcx> { + crate fn new(place: Place<'tcx>, pattern: &'pat Pat<'tcx>) -> MatchPair<'pat, 'tcx> { + MatchPair { place, pattern } + } +} diff --git a/src/librustc_mir/build/misc.rs b/src/librustc_mir_build/build/misc.rs similarity index 62% rename from src/librustc_mir/build/misc.rs rename to src/librustc_mir_build/build/misc.rs index d038310dd4..3d5145b696 100644 --- a/src/librustc_mir/build/misc.rs +++ b/src/librustc_mir_build/build/misc.rs @@ -6,7 +6,7 @@ use crate::build::Builder; use rustc::ty::{self, Ty}; use rustc::mir::*; -use syntax_pos::{Span, DUMMY_SP}; +use rustc_span::{Span, DUMMY_SP}; impl<'a, 'tcx> Builder<'a, 'tcx> { /// Adds a new temporary value of type `ty` storing the result of @@ -14,58 +14,58 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// /// N.B., **No cleanup is scheduled for this temporary.** You should /// call `schedule_drop` once the temporary is initialized. - pub fn temp(&mut self, ty: Ty<'tcx>, span: Span) -> Place<'tcx> { + crate fn temp(&mut self, ty: Ty<'tcx>, span: Span) -> Place<'tcx> { let temp = self.local_decls.push(LocalDecl::new_temp(ty, span)); let place = Place::from(temp); - debug!("temp: created temp {:?} with type {:?}", - place, self.local_decls[temp].ty); + debug!("temp: created temp {:?} with type {:?}", place, self.local_decls[temp].ty); place } /// Convenience function for creating a literal operand, one /// without any user type annotation. - pub fn literal_operand(&mut self, - span: Span, - literal: &'tcx ty::Const<'tcx>) - -> Operand<'tcx> { - let constant = box Constant { - span, - user_ty: None, - literal, - }; + crate fn literal_operand( + &mut self, + span: Span, + literal: &'tcx ty::Const<'tcx>, + ) -> Operand<'tcx> { + let constant = box Constant { span, user_ty: None, literal }; Operand::Constant(constant) } - pub fn unit_rvalue(&mut self) -> Rvalue<'tcx> { + crate fn unit_rvalue(&mut self) -> Rvalue<'tcx> { Rvalue::Aggregate(box AggregateKind::Tuple, vec![]) } // Returns a zero literal operand for the appropriate type, works for // bool, char and integers. - pub fn zero_literal(&mut self, span: Span, ty: Ty<'tcx>) -> Operand<'tcx> { + crate fn zero_literal(&mut self, span: Span, ty: Ty<'tcx>) -> Operand<'tcx> { let literal = ty::Const::from_bits(self.hir.tcx(), 0, ty::ParamEnv::empty().and(ty)); self.literal_operand(span, literal) } - pub fn push_usize(&mut self, - block: BasicBlock, - source_info: SourceInfo, - value: u64) - -> Place<'tcx> { + crate fn push_usize( + &mut self, + block: BasicBlock, + source_info: SourceInfo, + value: u64, + ) -> Place<'tcx> { let usize_ty = self.hir.usize_ty(); let temp = self.temp(usize_ty, source_info.span); self.cfg.push_assign_constant( - block, source_info, &temp, + block, + source_info, + &temp, Constant { span: source_info.span, user_ty: None, literal: self.hir.usize_literal(value), - }); + }, + ); temp } - pub fn consume_by_copy_or_move(&self, place: Place<'tcx>) -> Operand<'tcx> { + crate fn consume_by_copy_or_move(&self, place: Place<'tcx>) -> Operand<'tcx> { let tcx = self.hir.tcx(); let ty = place.ty(&self.local_decls, tcx).ty; if !self.hir.type_is_copy_modulo_regions(ty, DUMMY_SP) { diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir_build/build/mod.rs similarity index 69% rename from src/librustc_mir/build/mod.rs rename to src/librustc_mir_build/build/mod.rs index 0009eb45cc..fa5f266c76 100644 --- a/src/librustc_mir/build/mod.rs +++ b/src/librustc_mir_build/build/mod.rs @@ -1,69 +1,59 @@ use crate::build; use crate::build::scope::DropKind; use crate::hair::cx::Cx; -use crate::hair::{LintLevel, BindingMode, PatKind}; -use crate::transform::MirSource; -use crate::util as mir_util; -use rustc::hir; -use rustc::hir::{Node, GeneratorKind}; -use rustc::hir::def_id::DefId; +use crate::hair::{BindingMode, LintLevel, PatKind}; use rustc::middle::lang_items; use rustc::middle::region; use rustc::mir::*; -use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::subst::Subst; -use rustc::util::nodemap::HirIdMap; +use rustc::ty::{self, Ty, TyCtxt}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::{GeneratorKind, HirIdMap, Node}; +use rustc_index::vec::{Idx, IndexVec}; +use rustc_span::symbol::kw; +use rustc_span::Span; +use rustc_target::spec::abi::Abi; use rustc_target::spec::PanicStrategy; -use rustc_index::vec::{IndexVec, Idx}; use std::u32; -use rustc_target::spec::abi::Abi; use syntax::attr::{self, UnwindAttr}; -use syntax::symbol::kw; -use syntax_pos::Span; use super::lints; +crate fn mir_built(tcx: TyCtxt<'_>, def_id: DefId) -> &ty::steal::Steal> { + tcx.alloc_steal_mir(mir_build(tcx, def_id)) +} + /// Construct the MIR for a given `DefId`. -pub fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> BodyAndCache<'_> { +fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> BodyAndCache<'_> { let id = tcx.hir().as_local_hir_id(def_id).unwrap(); // Figure out what primary body this item has. let (body_id, return_ty_span) = match tcx.hir().get(id) { - Node::Expr(hir::Expr { kind: hir::ExprKind::Closure(_, decl, body_id, _, _), .. }) - | Node::Item( - hir::Item { - kind: hir::ItemKind::Fn(hir::FnSig { decl, .. }, _, body_id), - .. - } - ) - | Node::ImplItem( - hir::ImplItem { - kind: hir::ImplItemKind::Method(hir::FnSig { decl, .. }, body_id), - .. - } - ) - | Node::TraitItem( - hir::TraitItem { - kind: hir::TraitItemKind::Method( - hir::FnSig { decl, .. }, - hir::TraitMethod::Provided(body_id), - ), - .. - } - ) => { + Node::Expr(hir::Expr { kind: hir::ExprKind::Closure(_, decl, body_id, _, _), .. }) => { (*body_id, decl.output.span()) } + Node::Item(hir::Item { + kind: hir::ItemKind::Fn(hir::FnSig { decl, .. }, _, body_id), + .. + }) + | Node::ImplItem(hir::ImplItem { + kind: hir::ImplItemKind::Method(hir::FnSig { decl, .. }, body_id), + .. + }) + | Node::TraitItem(hir::TraitItem { + kind: + hir::TraitItemKind::Method(hir::FnSig { decl, .. }, hir::TraitMethod::Provided(body_id)), + .. + }) => (*body_id, decl.output.span()), Node::Item(hir::Item { kind: hir::ItemKind::Static(ty, _, body_id), .. }) | Node::Item(hir::Item { kind: hir::ItemKind::Const(ty, body_id), .. }) | Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Const(ty, body_id), .. }) - | Node::TraitItem( - hir::TraitItem { kind: hir::TraitItemKind::Const(ty, Some(body_id)), .. } - ) => { - (*body_id, ty.span) - } - Node::AnonConst(hir::AnonConst { body, hir_id, .. }) => { - (*body, tcx.hir().span(*hir_id)) - } + | Node::TraitItem(hir::TraitItem { + kind: hir::TraitItemKind::Const(ty, Some(body_id)), + .. + }) => (*body_id, ty.span), + Node::AnonConst(hir::AnonConst { body, hir_id, .. }) => (*body, tcx.hir().span(*hir_id)), _ => span_bug!(tcx.hir().span(id), "can't build MIR for {:?}", def_id), }; @@ -75,7 +65,7 @@ pub fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> BodyAndCache<'_> { } else if cx.body_owner_kind.is_fn_or_closure() { // fetch the fully liberated fn signature (that is, all bound // types/lifetimes replaced) - let fn_sig = cx.tables().liberated_fn_sigs()[id].clone(); + let fn_sig = cx.tables().liberated_fn_sigs()[id]; let fn_def_id = tcx.hir().local_def_id(id); let ty = tcx.type_of(fn_def_id); @@ -100,61 +90,54 @@ pub fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> BodyAndCache<'_> { }; let body = tcx.hir().body(body_id); - let explicit_arguments = - body.params - .iter() - .enumerate() - .map(|(index, arg)| { - let owner_id = tcx.hir().body_owner(body_id); - let opt_ty_info; - let self_arg; - if let Some(ref fn_decl) = tcx.hir().fn_decl_by_hir_id(owner_id) { - opt_ty_info = fn_decl.inputs.get(index).map(|ty| ty.span); - self_arg = if index == 0 && fn_decl.implicit_self.has_implicit_self() { - match fn_decl.implicit_self { - hir::ImplicitSelfKind::Imm => Some(ImplicitSelfKind::Imm), - hir::ImplicitSelfKind::Mut => Some(ImplicitSelfKind::Mut), - hir::ImplicitSelfKind::ImmRef => Some(ImplicitSelfKind::ImmRef), - hir::ImplicitSelfKind::MutRef => Some(ImplicitSelfKind::MutRef), - _ => None, - } - } else { - None - }; - } else { - opt_ty_info = None; - self_arg = None; + let explicit_arguments = body.params.iter().enumerate().map(|(index, arg)| { + let owner_id = tcx.hir().body_owner(body_id); + let opt_ty_info; + let self_arg; + if let Some(ref fn_decl) = tcx.hir().fn_decl_by_hir_id(owner_id) { + opt_ty_info = fn_decl.inputs.get(index).map(|ty| ty.span); + self_arg = if index == 0 && fn_decl.implicit_self.has_implicit_self() { + match fn_decl.implicit_self { + hir::ImplicitSelfKind::Imm => Some(ImplicitSelfKind::Imm), + hir::ImplicitSelfKind::Mut => Some(ImplicitSelfKind::Mut), + hir::ImplicitSelfKind::ImmRef => Some(ImplicitSelfKind::ImmRef), + hir::ImplicitSelfKind::MutRef => Some(ImplicitSelfKind::MutRef), + _ => None, } + } else { + None + }; + } else { + opt_ty_info = None; + self_arg = None; + } - // C-variadic fns also have a `VaList` input that's not listed in `fn_sig` - // (as it's created inside the body itself, not passed in from outside). - let ty = if fn_sig.c_variadic && index == fn_sig.inputs().len() { - let va_list_did = tcx.require_lang_item( - lang_items::VaListTypeLangItem, - Some(arg.span), - ); - let region = tcx.mk_region(ty::ReScope(region::Scope { - id: body.value.hir_id.local_id, - data: region::ScopeData::CallSite - })); - - tcx.type_of(va_list_did).subst(tcx, &[region.into()]) - } else { - fn_sig.inputs()[index] - }; + // C-variadic fns also have a `VaList` input that's not listed in `fn_sig` + // (as it's created inside the body itself, not passed in from outside). + let ty = if fn_sig.c_variadic && index == fn_sig.inputs().len() { + let va_list_did = + tcx.require_lang_item(lang_items::VaListTypeLangItem, Some(arg.span)); + let region = tcx.mk_region(ty::ReScope(region::Scope { + id: body.value.hir_id.local_id, + data: region::ScopeData::CallSite, + })); + + tcx.type_of(va_list_did).subst(tcx, &[region.into()]) + } else { + fn_sig.inputs()[index] + }; - ArgInfo(ty, opt_ty_info, Some(&arg), self_arg) - }); + ArgInfo(ty, opt_ty_info, Some(&arg), self_arg) + }); let arguments = implicit_argument.into_iter().chain(explicit_arguments); let (yield_ty, return_ty) = if body.generator_kind.is_some() { let gen_sig = match ty.kind { - ty::Generator(gen_def_id, gen_substs, ..) => - gen_substs.as_generator().sig(gen_def_id, tcx), - _ => - span_bug!(tcx.hir().span(id), - "generator w/o generator type: {:?}", ty), + ty::Generator(gen_def_id, gen_substs, ..) => { + gen_substs.as_generator().sig(gen_def_id, tcx) + } + _ => span_bug!(tcx.hir().span(id), "generator w/o generator type: {:?}", ty), }; (Some(gen_sig.yield_ty), gen_sig.return_ty) } else { @@ -191,9 +174,6 @@ pub fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> BodyAndCache<'_> { build::construct_const(cx, body_id, return_ty, return_ty_span) }; - mir_util::dump_mir(tcx, None, "mir_map", &0, - MirSource::item(def_id), &body, |_, _| Ok(()) ); - lints::check(tcx, &body, def_id); let mut body = BodyAndCache::new(body); @@ -214,7 +194,7 @@ fn liberated_closure_env_ty( let (closure_def_id, closure_substs) = match closure_ty.kind { ty::Closure(closure_def_id, closure_substs) => (closure_def_id, closure_substs), - _ => bug!("closure expr does not have closure type: {:?}", closure_ty) + _ => bug!("closure expr does not have closure type: {:?}", closure_ty), }; let closure_env_ty = tcx.closure_env_ty(closure_def_id, closure_substs).unwrap(); @@ -222,7 +202,7 @@ fn liberated_closure_env_ty( } #[derive(Debug, PartialEq, Eq)] -pub enum BlockFrame { +enum BlockFrame { /// Evaluation is currently within a statement. /// /// Examples include: @@ -232,7 +212,7 @@ pub enum BlockFrame { Statement { /// If true, then statement discards result from evaluating /// the expression (such as examples 1 and 2 above). - ignores_expr_result: bool + ignores_expr_result: bool, }, /// Evaluation is currently within the tail expression of a block. @@ -243,7 +223,7 @@ pub enum BlockFrame { /// the result of evaluating the block's tail expression. /// /// Example: `let _ = { STMT_1; EXPR };` - tail_result_is_ignored: bool + tail_result_is_ignored: bool, }, /// Generic mark meaning that the block occurred as a subexpression @@ -258,19 +238,17 @@ impl BlockFrame { match *self { BlockFrame::TailExpr { .. } => true, - BlockFrame::Statement { .. } | - BlockFrame::SubExpr => false, + BlockFrame::Statement { .. } | BlockFrame::SubExpr => false, } } fn is_statement(&self) -> bool { match *self { BlockFrame::Statement { .. } => true, - BlockFrame::TailExpr { .. } | - BlockFrame::SubExpr => false, + BlockFrame::TailExpr { .. } | BlockFrame::SubExpr => false, } } - } +} #[derive(Debug)] struct BlockContext(Vec); @@ -348,9 +326,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } impl BlockContext { - fn new() -> Self { BlockContext(vec![]) } - fn push(&mut self, bf: BlockFrame) { self.0.push(bf); } - fn pop(&mut self) -> Option { self.0.pop() } + fn new() -> Self { + BlockContext(vec![]) + } + fn push(&mut self, bf: BlockFrame) { + self.0.push(bf); + } + fn pop(&mut self) -> Option { + self.0.pop() + } /// Traverses the frames on the `BlockContext`, searching for either /// the first block-tail expression frame with no intervening @@ -367,8 +351,9 @@ impl BlockContext { match bf { BlockFrame::SubExpr => continue, BlockFrame::Statement { .. } => break, - &BlockFrame::TailExpr { tail_result_is_ignored } => - return Some(BlockTailInfo { tail_result_is_ignored }) + &BlockFrame::TailExpr { tail_result_is_ignored } => { + return Some(BlockTailInfo { tail_result_is_ignored }); + } } } @@ -390,8 +375,8 @@ impl BlockContext { Some(BlockFrame::SubExpr) => false, // otherwise: use accumulated is_ignored state. - Some(BlockFrame::TailExpr { tail_result_is_ignored: ignored }) | - Some(BlockFrame::Statement { ignores_expr_result: ignored }) => *ignored, + Some(BlockFrame::TailExpr { tail_result_is_ignored: ignored }) + | Some(BlockFrame::Statement { ignores_expr_result: ignored }) => *ignored, } } } @@ -422,9 +407,7 @@ struct GuardFrameLocal { impl GuardFrameLocal { fn new(id: hir::HirId, _binding_mode: BindingMode) -> Self { - GuardFrameLocal { - id: id, - } + GuardFrameLocal { id: id } } } @@ -457,13 +440,18 @@ enum ForGuard { impl LocalsForNode { fn local_id(&self, for_guard: ForGuard) -> Local { match (self, for_guard) { - (&LocalsForNode::One(local_id), ForGuard::OutsideGuard) | - (&LocalsForNode::ForGuard { ref_for_guard: local_id, .. }, ForGuard::RefWithinGuard) | - (&LocalsForNode::ForGuard { for_arm_body: local_id, .. }, ForGuard::OutsideGuard) => - local_id, + (&LocalsForNode::One(local_id), ForGuard::OutsideGuard) + | ( + &LocalsForNode::ForGuard { ref_for_guard: local_id, .. }, + ForGuard::RefWithinGuard, + ) + | (&LocalsForNode::ForGuard { for_arm_body: local_id, .. }, ForGuard::OutsideGuard) => { + local_id + } - (&LocalsForNode::One(_), ForGuard::RefWithinGuard) => - bug!("anything with one local should never be within a guard."), + (&LocalsForNode::One(_), ForGuard::RefWithinGuard) => { + bug!("anything with one local should never be within a guard.") + } } } } @@ -473,7 +461,7 @@ struct CFG<'tcx> { } rustc_index::newtype_index! { - pub struct ScopeId { .. } + struct ScopeId { .. } } /////////////////////////////////////////////////////////////////////////// @@ -503,20 +491,16 @@ impl BlockAndExtension for BasicBlock { /// Update a block pointer and return the value. /// Use it like `let x = unpack!(block = self.foo(block, foo))`. macro_rules! unpack { - ($x:ident = $c:expr) => { - { - let BlockAnd(b, v) = $c; - $x = b; - v - } - }; - - ($c:expr) => { - { - let BlockAnd(b, ()) = $c; - b - } - }; + ($x:ident = $c:expr) => {{ + let BlockAnd(b, v) = $c; + $x = b; + v + }}; + + ($c:expr) => {{ + let BlockAnd(b, ()) = $c; + b + }}; } fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: DefId, _abi: Abi) -> bool { @@ -525,10 +509,14 @@ fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: DefId, _abi: Abi) -> bool { let unwind_attr = attr::find_unwind_attr(Some(tcx.sess.diagnostic()), attrs); // We never unwind, so it's not relevant to stop an unwind. - if tcx.sess.panic_strategy() != PanicStrategy::Unwind { return false; } + if tcx.sess.panic_strategy() != PanicStrategy::Unwind { + return false; + } // We cannot add landing pads, so don't add one. - if tcx.sess.no_landing_pads() { return false; } + if tcx.sess.no_landing_pads() { + return false; + } // This is a special case: some functions have a C abi but are meant to // unwind anyway. Don't stop them. @@ -542,7 +530,12 @@ fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: DefId, _abi: Abi) -> bool { /////////////////////////////////////////////////////////////////////////// /// the main entry point for building MIR for a function -struct ArgInfo<'tcx>(Ty<'tcx>, Option, Option<&'tcx hir::Param>, Option); +struct ArgInfo<'tcx>( + Ty<'tcx>, + Option, + Option<&'tcx hir::Param<'tcx>>, + Option, +); fn construct_fn<'a, 'tcx, A>( hir: Cx<'a, 'tcx>, @@ -552,10 +545,10 @@ fn construct_fn<'a, 'tcx, A>( abi: Abi, return_ty: Ty<'tcx>, return_ty_span: Span, - body: &'tcx hir::Body, + body: &'tcx hir::Body<'tcx>, ) -> Body<'tcx> where - A: Iterator> + A: Iterator>, { let arguments: Vec<_> = arguments.collect(); @@ -565,58 +558,63 @@ where let fn_def_id = tcx_hir.local_def_id(fn_id); - let mut builder = Builder::new(hir, + let mut builder = Builder::new( + hir, span, arguments.len(), safety, return_ty, return_ty_span, - body.generator_kind); + body.generator_kind, + ); - let call_site_scope = region::Scope { - id: body.value.hir_id.local_id, - data: region::ScopeData::CallSite - }; - let arg_scope = region::Scope { - id: body.value.hir_id.local_id, - data: region::ScopeData::Arguments - }; + let call_site_scope = + region::Scope { id: body.value.hir_id.local_id, data: region::ScopeData::CallSite }; + let arg_scope = + region::Scope { id: body.value.hir_id.local_id, data: region::ScopeData::Arguments }; let mut block = START_BLOCK; let source_info = builder.source_info(span); let call_site_s = (call_site_scope, source_info); - unpack!(block = builder.in_scope(call_site_s, LintLevel::Inherited, |builder| { - if should_abort_on_panic(tcx, fn_def_id, abi) { - builder.schedule_abort(); - } + unpack!( + block = builder.in_scope(call_site_s, LintLevel::Inherited, |builder| { + if should_abort_on_panic(tcx, fn_def_id, abi) { + builder.schedule_abort(); + } - let arg_scope_s = (arg_scope, source_info); - // `return_block` is called when we evaluate a `return` expression, so - // we just use `START_BLOCK` here. - unpack!(block = builder.in_breakable_scope( - None, - START_BLOCK, - Place::return_place(), - |builder| { - builder.in_scope(arg_scope_s, LintLevel::Inherited, |builder| { - builder.args_and_body(block, fn_def_id, &arguments, arg_scope, &body.value) - }) - }, - )); - // Attribute epilogue to function's closing brace - let fn_end = span.shrink_to_hi(); - let source_info = builder.source_info(fn_end); - let return_block = builder.return_block(); - builder.cfg.terminate(block, source_info, - TerminatorKind::Goto { target: return_block }); - builder.cfg.terminate(return_block, source_info, - TerminatorKind::Return); - // Attribute any unreachable codepaths to the function's closing brace - if let Some(unreachable_block) = builder.cached_unreachable_block { - builder.cfg.terminate(unreachable_block, source_info, - TerminatorKind::Unreachable); - } - return_block.unit() - })); + let arg_scope_s = (arg_scope, source_info); + // `return_block` is called when we evaluate a `return` expression, so + // we just use `START_BLOCK` here. + unpack!( + block = builder.in_breakable_scope( + None, + START_BLOCK, + Place::return_place(), + |builder| { + builder.in_scope(arg_scope_s, LintLevel::Inherited, |builder| { + builder.args_and_body( + block, + fn_def_id, + &arguments, + arg_scope, + &body.value, + ) + }) + }, + ) + ); + // Attribute epilogue to function's closing brace + let fn_end = span.shrink_to_hi(); + let source_info = builder.source_info(fn_end); + let return_block = builder.return_block(); + builder.cfg.goto(block, source_info, return_block); + builder.cfg.terminate(return_block, source_info, TerminatorKind::Return); + // Attribute any unreachable codepaths to the function's closing brace + if let Some(unreachable_block) = builder.cached_unreachable_block { + builder.cfg.terminate(unreachable_block, source_info, TerminatorKind::Unreachable); + } + return_block.unit() + }) + ); assert_eq!(block, builder.return_block()); let mut spread_arg = None; @@ -624,8 +622,7 @@ where // RustCall pseudo-ABI untuples the last argument. spread_arg = Some(Local::new(arguments.len())); } - info!("fn_id {:?} has attrs {:?}", fn_def_id, - tcx.get_attrs(fn_def_id)); + debug!("fn_id {:?} has attrs {:?}", fn_def_id, tcx.get_attrs(fn_def_id)); let mut body = builder.finish(); body.spread_arg = spread_arg; @@ -641,15 +638,7 @@ fn construct_const<'a, 'tcx>( let tcx = hir.tcx(); let owner_id = tcx.hir().body_owner(body_id); let span = tcx.hir().span(owner_id); - let mut builder = Builder::new( - hir, - span, - 0, - Safety::Safe, - const_ty, - const_ty_span, - None, - ); + let mut builder = Builder::new(hir, span, 0, Safety::Safe, const_ty, const_ty_span, None); let mut block = START_BLOCK; let ast_expr = &tcx.hir().body(body_id).value; @@ -665,17 +654,13 @@ fn construct_const<'a, 'tcx>( // Constants may be match expressions in which case an unreachable block may // be created, so terminate it properly. if let Some(unreachable_block) = builder.cached_unreachable_block { - builder.cfg.terminate(unreachable_block, source_info, - TerminatorKind::Unreachable); + builder.cfg.terminate(unreachable_block, source_info, TerminatorKind::Unreachable); } builder.finish() } -fn construct_error<'a, 'tcx>( - hir: Cx<'a, 'tcx>, - body_id: hir::BodyId -) -> Body<'tcx> { +fn construct_error<'a, 'tcx>(hir: Cx<'a, 'tcx>, body_id: hir::BodyId) -> Body<'tcx> { let owner_id = hir.tcx().hir().body_owner(body_id); let span = hir.tcx().hir().span(owner_id); let ty = hir.tcx().types.err; @@ -686,14 +671,15 @@ fn construct_error<'a, 'tcx>( } impl<'a, 'tcx> Builder<'a, 'tcx> { - fn new(hir: Cx<'a, 'tcx>, - span: Span, - arg_count: usize, - safety: Safety, - return_ty: Ty<'tcx>, - return_span: Span, - generator_kind: Option) - -> Builder<'a, 'tcx> { + fn new( + hir: Cx<'a, 'tcx>, + span: Span, + arg_count: usize, + safety: Safety, + return_ty: Ty<'tcx>, + return_span: Span, + generator_kind: Option, + ) -> Builder<'a, 'tcx> { let lint_level = LintLevel::Explicit(hir.root_lint_level); let mut builder = Builder { hir, @@ -725,7 +711,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { assert_eq!(builder.cfg.start_new_block(), START_BLOCK); assert_eq!( builder.new_source_scope(span, lint_level, Some(safety)), - OUTERMOST_SOURCE_SCOPE); + OUTERMOST_SOURCE_SCOPE + ); builder.source_scopes[OUTERMOST_SOURCE_SCOPE].parent_scope = None; builder @@ -747,23 +734,23 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { self.var_debug_info, self.fn_span, self.hir.control_flow_destroyed(), - self.generator_kind + self.generator_kind, ) } - fn args_and_body(&mut self, - mut block: BasicBlock, - fn_def_id: DefId, - arguments: &[ArgInfo<'tcx>], - argument_scope: region::Scope, - ast_body: &'tcx hir::Expr) - -> BlockAnd<()> - { + fn args_and_body( + &mut self, + mut block: BasicBlock, + fn_def_id: DefId, + arguments: &[ArgInfo<'tcx>], + argument_scope: region::Scope, + ast_body: &'tcx hir::Expr<'tcx>, + ) -> BlockAnd<()> { // Allocate locals for the function arguments for &ArgInfo(ty, _, arg_opt, _) in arguments.iter() { let source_info = SourceInfo { scope: OUTERMOST_SOURCE_SCOPE, - span: arg_opt.map_or(self.fn_span, |arg| arg.pat.span) + span: arg_opt.map_or(self.fn_span, |arg| arg.pat.span), }; let arg_local = self.local_decls.push(LocalDecl { mutability: Mutability::Mut, @@ -807,54 +794,54 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let (def_id, upvar_substs) = match closure_ty.kind { ty::Closure(def_id, substs) => (def_id, ty::UpvarSubsts::Closure(substs)), ty::Generator(def_id, substs, _) => (def_id, ty::UpvarSubsts::Generator(substs)), - _ => span_bug!(self.fn_span, "upvars with non-closure env ty {:?}", closure_ty) + _ => span_bug!(self.fn_span, "upvars with non-closure env ty {:?}", closure_ty), }; let upvar_tys = upvar_substs.upvar_tys(def_id, tcx); let upvars_with_tys = upvars.iter().zip(upvar_tys); - self.upvar_mutbls = upvars_with_tys.enumerate().map(|(i, ((&var_id, &upvar_id), ty))| { - let capture = hir_tables.upvar_capture(upvar_id); - - let mut mutability = Mutability::Not; - let mut name = kw::Invalid; - if let Some(Node::Binding(pat)) = tcx_hir.find(var_id) { - if let hir::PatKind::Binding(_, _, ident, _) = pat.kind { - name = ident.name; - - if let Some(&bm) = hir_tables.pat_binding_modes().get(pat.hir_id) { - if bm == ty::BindByValue(hir::Mutability::Mutable) { - mutability = Mutability::Mut; - } else { - mutability = Mutability::Not; + self.upvar_mutbls = upvars_with_tys + .enumerate() + .map(|(i, ((&var_id, &upvar_id), ty))| { + let capture = hir_tables.upvar_capture(upvar_id); + + let mut mutability = Mutability::Not; + let mut name = kw::Invalid; + if let Some(Node::Binding(pat)) = tcx_hir.find(var_id) { + if let hir::PatKind::Binding(_, _, ident, _) = pat.kind { + name = ident.name; + match hir_tables.extract_binding_mode(tcx.sess, pat.hir_id, pat.span) { + Some(ty::BindByValue(hir::Mutability::Mut)) => { + mutability = Mutability::Mut; + } + Some(_) => mutability = Mutability::Not, + _ => {} } - } else { - tcx.sess.delay_span_bug(pat.span, "missing binding mode"); } } - } - let mut projs = closure_env_projs.clone(); - projs.push(ProjectionElem::Field(Field::new(i), ty)); - match capture { - ty::UpvarCapture::ByValue => {} - ty::UpvarCapture::ByRef(..) => { - projs.push(ProjectionElem::Deref); - } - }; + let mut projs = closure_env_projs.clone(); + projs.push(ProjectionElem::Field(Field::new(i), ty)); + match capture { + ty::UpvarCapture::ByValue => {} + ty::UpvarCapture::ByRef(..) => { + projs.push(ProjectionElem::Deref); + } + }; - self.var_debug_info.push(VarDebugInfo { - name, - source_info: SourceInfo { - scope: OUTERMOST_SOURCE_SCOPE, - span: tcx_hir.span(var_id), - }, - place: Place { - base: closure_env_arg.into(), - projection: tcx.intern_place_elems(&projs), - }, - }); + self.var_debug_info.push(VarDebugInfo { + name, + source_info: SourceInfo { + scope: OUTERMOST_SOURCE_SCOPE, + span: tcx_hir.span(var_id), + }, + place: Place { + local: closure_env_arg.into(), + projection: tcx.intern_place_elems(&projs), + }, + }); - mutability - }).collect(); + mutability + }) + .collect(); } let mut scope = None; @@ -868,7 +855,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Make sure we drop (parts of) the argument even when not matched on. self.schedule_drop( arg_opt.as_ref().map_or(ast_body.span, |arg| arg.pat.span), - argument_scope, local, DropKind::Value, + argument_scope, + local, + DropKind::Value, ); if let Some(arg) = arg_opt { @@ -887,22 +876,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } => { self.local_decls[local].mutability = mutability; self.local_decls[local].source_info.scope = self.source_scope; - self.local_decls[local].local_info = - if let Some(kind) = self_binding { - LocalInfo::User(ClearCrossCrate::Set( - BindingForm::ImplicitSelf(*kind), - )) - } else { - let binding_mode = ty::BindingMode::BindByValue(mutability.into()); - LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var( - VarBindingForm { - binding_mode, - opt_ty_info, - opt_match_place: Some((Some(place.clone()), span)), - pat_span: span, - }, - ))) - }; + self.local_decls[local].local_info = if let Some(kind) = self_binding { + LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf(*kind))) + } else { + let binding_mode = ty::BindingMode::BindByValue(mutability.into()); + LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var( + VarBindingForm { + binding_mode, + opt_ty_info, + opt_match_place: Some((Some(place), span)), + pat_span: span, + }, + ))) + }; self.var_indices.insert(var, LocalsForNode::One(local)); } _ => { @@ -933,13 +919,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { &mut self, arg_hir_id: hir::HirId, original_source_scope: SourceScope, - pattern_span: Span + pattern_span: Span, ) { let tcx = self.hir.tcx(); - let current_root = tcx.maybe_lint_level_root_bounded( - arg_hir_id, - self.hir.root_lint_level - ); + let current_root = tcx.maybe_lint_level_root_bounded(arg_hir_id, self.hir.root_lint_level); let parent_root = tcx.maybe_lint_level_root_bounded( self.source_scopes[original_source_scope] .local_data @@ -949,22 +932,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { self.hir.root_lint_level, ); if current_root != parent_root { - self.source_scope = self.new_source_scope( - pattern_span, - LintLevel::Explicit(current_root), - None - ); + self.source_scope = + self.new_source_scope(pattern_span, LintLevel::Explicit(current_root), None); } } fn get_unit_temp(&mut self) -> Place<'tcx> { match self.unit_temp { - Some(ref tmp) => tmp.clone(), + Some(tmp) => tmp, None => { let ty = self.hir.unit_ty(); let fn_span = self.fn_span; let tmp = self.temp(ty, fn_span); - self.unit_temp = Some(tmp.clone()); + self.unit_temp = Some(tmp); tmp } } diff --git a/src/librustc_mir/build/scope.rs b/src/librustc_mir_build/build/scope.rs similarity index 80% rename from src/librustc_mir/build/scope.rs rename to src/librustc_mir_build/build/scope.rs index 00a30af806..a63ac06ec3 100644 --- a/src/librustc_mir/build/scope.rs +++ b/src/librustc_mir_build/build/scope.rs @@ -85,13 +85,13 @@ should go to. use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder, CFG}; use crate::hair::{Expr, ExprRef, LintLevel}; use rustc::middle::region; -use rustc::hir; use rustc::mir::*; -use syntax_pos::{DUMMY_SP, Span}; use rustc_data_structures::fx::FxHashMap; +use rustc_hir as hir; +use rustc_hir::GeneratorKind; +use rustc_span::{Span, DUMMY_SP}; use std::collections::hash_map::Entry; use std::mem; -use rustc::hir::GeneratorKind; #[derive(Debug)] struct Scope { @@ -123,7 +123,7 @@ struct Scope { } #[derive(Debug, Default)] -pub struct Scopes<'tcx> { +crate struct Scopes<'tcx> { scopes: Vec, /// The current set of breakable scopes. See module comment for more details. breakable_scopes: Vec>, @@ -183,7 +183,7 @@ struct BreakableScope<'tcx> { /// The target of an expression that breaks out of a scope #[derive(Clone, Copy, Debug)] -pub enum BreakableTarget { +crate enum BreakableTarget { Continue(region::Scope), Break(region::Scope), Return, @@ -195,19 +195,11 @@ impl CachedBlock { } fn get(&self, generator_drop: bool) -> Option { - if generator_drop { - self.generator_drop - } else { - self.unwind - } + if generator_drop { self.generator_drop } else { self.unwind } } fn ref_mut(&mut self, generator_drop: bool) -> &mut Option { - if generator_drop { - &mut self.generator_drop - } else { - &mut self.unwind - } + if generator_drop { &mut self.generator_drop } else { &mut self.unwind } } } @@ -224,7 +216,7 @@ impl Scope { &mut self, storage_only: bool, generator_kind: Option, - this_scope_only: bool + this_scope_only: bool, ) { // FIXME: maybe do shared caching of `cached_exits` etc. to handle functions // with lots of `try!`? @@ -249,13 +241,9 @@ impl Scope { /// Given a span and this scope's source scope, make a SourceInfo. fn source_info(&self, span: Span) -> SourceInfo { - SourceInfo { - span, - scope: self.source_scope - } + SourceInfo { span, scope: self.source_scope } } - /// Whether there's anything to do for the cleanup path, that is, /// when unwinding through this scope. This includes destructors, /// but not StorageDead statements, which don't get emitted at all @@ -300,8 +288,8 @@ impl<'tcx> Scopes<'tcx> { ) -> (Scope, Option) { let scope = self.scopes.pop().unwrap(); assert_eq!(scope.region_scope, region_scope.0); - let unwind_to = self.scopes.last() - .and_then(|next_scope| next_scope.cached_unwind.get(false)); + let unwind_to = + self.scopes.last().and_then(|next_scope| next_scope.cached_unwind.get(false)); (scope, unwind_to) } @@ -319,7 +307,8 @@ impl<'tcx> Scopes<'tcx> { ) -> (BasicBlock, region::Scope, Option>) { let get_scope = |scope: region::Scope| { // find the loop-scope by its `region::Scope`. - self.breakable_scopes.iter() + self.breakable_scopes + .iter() .rfind(|breakable_scope| breakable_scope.region_scope == scope) .unwrap_or_else(|| span_bug!(span, "no enclosing breakable scope found")) }; @@ -329,15 +318,16 @@ impl<'tcx> Scopes<'tcx> { if scope.break_destination != Place::return_place() { span_bug!(span, "`return` in item with no return scope"); } - (scope.break_block, scope.region_scope, Some(scope.break_destination.clone())) + (scope.break_block, scope.region_scope, Some(scope.break_destination)) } BreakableTarget::Break(scope) => { let scope = get_scope(scope); - (scope.break_block, scope.region_scope, Some(scope.break_destination.clone())) + (scope.break_block, scope.region_scope, Some(scope.break_destination)) } BreakableTarget::Continue(scope) => { let scope = get_scope(scope); - let continue_block = scope.continue_block + let continue_block = scope + .continue_block .unwrap_or_else(|| span_bug!(span, "missing `continue` block")); (continue_block, scope.region_scope, None) } @@ -345,21 +335,22 @@ impl<'tcx> Scopes<'tcx> { } fn num_scopes_above(&self, region_scope: region::Scope, span: Span) -> usize { - let scope_count = self.scopes.iter().rev() + let scope_count = self + .scopes + .iter() + .rev() .position(|scope| scope.region_scope == region_scope) - .unwrap_or_else(|| { - span_bug!(span, "region_scope {:?} does not enclose", region_scope) - }); + .unwrap_or_else(|| span_bug!(span, "region_scope {:?} does not enclose", region_scope)); let len = self.len(); assert!(scope_count < len, "should not use `exit_scope` to pop ALL scopes"); scope_count } - fn iter_mut(&mut self) -> impl DoubleEndedIterator + '_ { + fn iter_mut(&mut self) -> impl DoubleEndedIterator + '_ { self.scopes.iter_mut().rev() } - fn top_scopes(&mut self, count: usize) -> impl DoubleEndedIterator + '_ { + fn top_scopes(&mut self, count: usize) -> impl DoubleEndedIterator + '_ { let len = self.len(); self.scopes[len - count..].iter_mut() } @@ -380,12 +371,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // ========================== // Start a breakable scope, which tracks where `continue`, `break` and // `return` should branch to. - pub fn in_breakable_scope(&mut self, - loop_block: Option, - break_block: BasicBlock, - break_destination: Place<'tcx>, - f: F) -> R - where F: FnOnce(&mut Builder<'a, 'tcx>) -> R + crate fn in_breakable_scope( + &mut self, + loop_block: Option, + break_block: BasicBlock, + break_destination: Place<'tcx>, + f: F, + ) -> R + where + F: FnOnce(&mut Builder<'a, 'tcx>) -> R, { let region_scope = self.scopes.topmost(); let scope = BreakableScope { @@ -401,14 +395,18 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { res } - pub fn in_opt_scope(&mut self, - opt_scope: Option<(region::Scope, SourceInfo)>, - f: F) - -> BlockAnd - where F: FnOnce(&mut Builder<'a, 'tcx>) -> BlockAnd + crate fn in_opt_scope( + &mut self, + opt_scope: Option<(region::Scope, SourceInfo)>, + f: F, + ) -> BlockAnd + where + F: FnOnce(&mut Builder<'a, 'tcx>) -> BlockAnd, { debug!("in_opt_scope(opt_scope={:?})", opt_scope); - if let Some(region_scope) = opt_scope { self.push_scope(region_scope); } + if let Some(region_scope) = opt_scope { + self.push_scope(region_scope); + } let mut block; let rv = unpack!(block = f(self)); if let Some(region_scope) = opt_scope { @@ -420,12 +418,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// Convenience wrapper that pushes a scope and then executes `f` /// to build its contents, popping the scope afterwards. - pub fn in_scope(&mut self, - region_scope: (region::Scope, SourceInfo), - lint_level: LintLevel, - f: F) - -> BlockAnd - where F: FnOnce(&mut Builder<'a, 'tcx>) -> BlockAnd + crate fn in_scope( + &mut self, + region_scope: (region::Scope, SourceInfo), + lint_level: LintLevel, + f: F, + ) -> BlockAnd + where + F: FnOnce(&mut Builder<'a, 'tcx>) -> BlockAnd, { debug!("in_scope(region_scope={:?})", region_scope); let source_scope = self.source_scope; @@ -436,23 +436,17 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // We estimate the true lint roots here to avoid creating a lot of source scopes. let parent_root = tcx.maybe_lint_level_root_bounded( - self.source_scopes[source_scope] - .local_data - .as_ref() - .assert_crate_local() - .lint_root, + self.source_scopes[source_scope].local_data.as_ref().assert_crate_local().lint_root, self.hir.root_lint_level, ); - let current_root = tcx.maybe_lint_level_root_bounded( - current_hir_id, - self.hir.root_lint_level - ); + let current_root = + tcx.maybe_lint_level_root_bounded(current_hir_id, self.hir.root_lint_level); if parent_root != current_root { self.source_scope = self.new_source_scope( region_scope.1.span, LintLevel::Explicit(current_root), - None + None, ); } } @@ -469,17 +463,18 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// scope and call `pop_scope` afterwards. Note that these two /// calls must be paired; using `in_scope` as a convenience /// wrapper maybe preferable. - pub fn push_scope(&mut self, region_scope: (region::Scope, SourceInfo)) { + crate fn push_scope(&mut self, region_scope: (region::Scope, SourceInfo)) { self.scopes.push_scope(region_scope, self.source_scope); } /// Pops a scope, which should have region scope `region_scope`, /// adding any drops onto the end of `block` that are needed. /// This must match 1-to-1 with `push_scope`. - pub fn pop_scope(&mut self, - region_scope: (region::Scope, SourceInfo), - mut block: BasicBlock) - -> BlockAnd<()> { + crate fn pop_scope( + &mut self, + region_scope: (region::Scope, SourceInfo), + mut block: BasicBlock, + ) -> BlockAnd<()> { debug!("pop_scope({:?}, {:?})", region_scope, block); // If we are emitting a `drop` statement, we need to have the cached // diverge cleanup pads ready in case that drop panics. @@ -489,29 +484,31 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let (scope, unwind_to) = self.scopes.pop_scope(region_scope); let unwind_to = unwind_to.unwrap_or_else(|| self.resume_block()); - unpack!(block = build_scope_drops( - &mut self.cfg, - self.generator_kind, - &scope, - block, - unwind_to, - self.arg_count, - false, // not generator - false, // not unwind path - )); + unpack!( + block = build_scope_drops( + &mut self.cfg, + self.generator_kind, + &scope, + block, + unwind_to, + self.arg_count, + false, // not generator + false, // not unwind path + ) + ); block.unit() } - pub fn break_scope( + crate fn break_scope( &mut self, mut block: BasicBlock, value: Option>, scope: BreakableTarget, source_info: SourceInfo, ) -> BlockAnd<()> { - let (mut target_block, region_scope, destination) - = self.scopes.find_breakable_scope(source_info.span, scope); + let (mut target_block, region_scope, destination) = + self.scopes.find_breakable_scope(source_info.span, scope); if let BreakableTarget::Return = scope { // We call this now, rather than when we start lowering the // function so that the return block doesn't precede the entire @@ -538,13 +535,17 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// Branch out of `block` to `target`, exiting all scopes up to /// and including `region_scope`. This will insert whatever drops are /// needed. See module comment for details. - pub fn exit_scope(&mut self, - span: Span, - region_scope: region::Scope, - mut block: BasicBlock, - target: BasicBlock) { - debug!("exit_scope(region_scope={:?}, block={:?}, target={:?})", - region_scope, block, target); + crate fn exit_scope( + &mut self, + span: Span, + region_scope: region::Scope, + mut block: BasicBlock, + target: BasicBlock, + ) { + debug!( + "exit_scope(region_scope={:?}, block={:?}, target={:?})", + region_scope, block, target + ); let scope_count = self.scopes.num_scopes_above(region_scope, span); // If we are emitting a `drop` statement, we need to have the cached @@ -564,14 +565,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let source_info = scope.source_info(span); block = match scope.cached_exits.entry((target, region_scope)) { Entry::Occupied(e) => { - self.cfg.terminate(block, source_info, - TerminatorKind::Goto { target: *e.get() }); + self.cfg.goto(block, source_info, *e.get()); return; } Entry::Vacant(v) => { let b = self.cfg.start_new_block(); - self.cfg.terminate(block, source_info, - TerminatorKind::Goto { target: b }); + self.cfg.goto(block, source_info, b); v.insert(b); b } @@ -582,29 +581,30 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { START_BLOCK }); - unpack!(block = build_scope_drops( - &mut self.cfg, - self.generator_kind, - scope, - block, - unwind_to, - self.arg_count, - false, // not generator - false, // not unwind path - )); + unpack!( + block = build_scope_drops( + &mut self.cfg, + self.generator_kind, + scope, + block, + unwind_to, + self.arg_count, + false, // not generator + false, // not unwind path + ) + ); scope = next_scope; } - let source_info = self.scopes.source_info(scope_count, span); - self.cfg.terminate(block, source_info, TerminatorKind::Goto { target }); + self.cfg.goto(block, self.scopes.source_info(scope_count, span), target); } /// Creates a path that performs all required cleanup for dropping a generator. /// /// This path terminates in GeneratorDrop. Returns the start of the path. /// None indicates there’s no cleanup to do at this point. - pub fn generator_drop_cleanup(&mut self) -> Option { + crate fn generator_drop_cleanup(&mut self) -> Option { // Fill in the cache for unwinds self.diverge_cleanup_gen(true); @@ -616,33 +616,38 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { while let Some(scope) = scopes.next() { block = if let Some(b) = scope.cached_generator_drop { - self.cfg.terminate(block, src_info, - TerminatorKind::Goto { target: b }); + self.cfg.goto(block, src_info, b); return Some(result); } else { let b = self.cfg.start_new_block(); scope.cached_generator_drop = Some(b); - self.cfg.terminate(block, src_info, - TerminatorKind::Goto { target: b }); + self.cfg.goto(block, src_info, b); b }; - let unwind_to = scopes.peek().as_ref().map(|scope| { - scope.cached_unwind.get(true).unwrap_or_else(|| { - span_bug!(src_info.span, "cached block not present?") + let unwind_to = scopes + .peek() + .as_ref() + .map(|scope| { + scope + .cached_unwind + .get(true) + .unwrap_or_else(|| span_bug!(src_info.span, "cached block not present?")) }) - }).unwrap_or(resume_block); - - unpack!(block = build_scope_drops( - &mut self.cfg, - self.generator_kind, - scope, - block, - unwind_to, - self.arg_count, - true, // is generator - true, // is cached path - )); + .unwrap_or(resume_block); + + unpack!( + block = build_scope_drops( + &mut self.cfg, + self.generator_kind, + scope, + block, + unwind_to, + self.arg_count, + true, // is generator + true, // is cached path + ) + ); } self.cfg.terminate(block, src_info, TerminatorKind::GeneratorDrop); @@ -651,14 +656,21 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } /// Creates a new source scope, nested in the current one. - pub fn new_source_scope(&mut self, - span: Span, - lint_level: LintLevel, - safety: Option) -> SourceScope { + crate fn new_source_scope( + &mut self, + span: Span, + lint_level: LintLevel, + safety: Option, + ) -> SourceScope { let parent = self.source_scope; - debug!("new_source_scope({:?}, {:?}, {:?}) - parent({:?})={:?}", - span, lint_level, safety, - parent, self.source_scopes.get(parent)); + debug!( + "new_source_scope({:?}, {:?}, {:?}) - parent({:?})={:?}", + span, + lint_level, + safety, + parent, + self.source_scopes.get(parent) + ); let scope_local_data = SourceScopeLocalData { lint_root: if let LintLevel::Explicit(lint_root) = lint_level { lint_root @@ -667,7 +679,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { }, safety: safety.unwrap_or_else(|| { self.source_scopes[parent].local_data.as_ref().assert_crate_local().safety - }) + }), }; self.source_scopes.push(SourceScopeData { span, @@ -677,11 +689,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } /// Given a span and the current source scope, make a SourceInfo. - pub fn source_info(&self, span: Span) -> SourceInfo { - SourceInfo { - span, - scope: self.source_scope - } + crate fn source_info(&self, span: Span) -> SourceInfo { + SourceInfo { span, scope: self.source_scope } } // Finding scopes @@ -708,20 +717,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// /// When building statics/constants, returns `None` since /// intermediate values do not have to be dropped in that case. - pub fn local_scope(&self) -> Option { + crate fn local_scope(&self) -> Option { match self.hir.body_owner_kind { - hir::BodyOwnerKind::Const | - hir::BodyOwnerKind::Static(_) => - // No need to free storage in this context. - None, - hir::BodyOwnerKind::Closure | - hir::BodyOwnerKind::Fn => - Some(self.scopes.topmost()), + hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) => + // No need to free storage in this context. + { + None + } + hir::BodyOwnerKind::Closure | hir::BodyOwnerKind::Fn => Some(self.scopes.topmost()), } } // Schedule an abort block - this is used for some ABIs that cannot unwind - pub fn schedule_abort(&mut self) -> BasicBlock { + crate fn schedule_abort(&mut self) -> BasicBlock { let source_info = self.scopes.source_info(self.scopes.len(), self.fn_span); let abortblk = self.cfg.start_new_cleanup_block(); self.cfg.terminate(abortblk, source_info, TerminatorKind::Abort); @@ -731,7 +739,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Scheduling drops // ================ - pub fn schedule_drop_storage_and_value( + crate fn schedule_drop_storage_and_value( &mut self, span: Span, region_scope: region::Scope, @@ -746,7 +754,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// /// When called with `DropKind::Storage`, `place` should be a local /// with an index higher than the current `self.arg_count`. - pub fn schedule_drop( + crate fn schedule_drop( &mut self, span: Span, region_scope: region::Scope, @@ -755,13 +763,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ) { let needs_drop = match drop_kind { DropKind::Value => { - if !self.hir.needs_drop(self.local_decls[local].ty) { return } + if !self.hir.needs_drop(self.local_decls[local].ty) { + return; + } true - }, + } DropKind::Storage => { if local.index() <= self.arg_count { span_bug!( - span, "`schedule_drop` called with local {:?} and arg_count {}", + span, + "`schedule_drop` called with local {:?} and arg_count {}", local, self.arg_count, ) @@ -820,8 +831,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // cache of outer scope stays intact. scope.invalidate_cache(!needs_drop, self.generator_kind, this_scope); if this_scope { - let region_scope_span = region_scope.span(self.hir.tcx(), - &self.hir.region_scope_tree); + let region_scope_span = + region_scope.span(self.hir.tcx(), &self.hir.region_scope_tree); // Attribute scope exit drops to scope's closing brace. let scope_end = self.hir.tcx().sess.source_map().end_point(region_scope_span); @@ -873,20 +884,18 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// spurious borrow-check errors -- the problem, ironically, is /// not the `DROP(_X)` itself, but the (spurious) unwind pathways /// that it creates. See #64391 for an example. - pub fn record_operands_moved( - &mut self, - operands: &[Operand<'tcx>], - ) { + crate fn record_operands_moved(&mut self, operands: &[Operand<'tcx>]) { let scope = match self.local_scope() { None => { // if there is no local scope, operands won't be dropped anyway return; } - Some(local_scope) => { - self.scopes.iter_mut().find(|scope| scope.region_scope == local_scope) - .unwrap_or_else(|| bug!("scope {:?} not found in scope list!", local_scope)) - } + Some(local_scope) => self + .scopes + .iter_mut() + .find(|scope| scope.region_scope == local_scope) + .unwrap_or_else(|| bug!("scope {:?} not found in scope list!", local_scope)), }; // look for moves of a local variable, like `MOVE(_X)` @@ -912,7 +921,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// /// This is a special case because the temporary for the condition needs to /// be dropped on both the true and the false arm. - pub fn test_bool( + crate fn test_bool( &mut self, mut block: BasicBlock, condition: Expr<'tcx>, @@ -921,12 +930,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let cond = unpack!(block = self.as_local_operand(block, condition)); let true_block = self.cfg.start_new_block(); let false_block = self.cfg.start_new_block(); - let term = TerminatorKind::if_( - self.hir.tcx(), - cond.clone(), - true_block, - false_block, - ); + let term = TerminatorKind::if_(self.hir.tcx(), cond.clone(), true_block, false_block); self.cfg.terminate(block, source_info, term); match cond { @@ -935,8 +939,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // If constants and statics, we don't generate StorageLive for this // temporary, so don't try to generate StorageDead for it either. _ if self.local_scope().is_none() => (), - Operand::Copy(place) - | Operand::Move(place) => { + Operand::Copy(place) | Operand::Move(place) => { if let Some(cond_temp) = place.as_local() { // Manually drop the condition on both branches. let top_scope = self.scopes.scopes.last_mut().unwrap(); @@ -952,17 +955,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { assert_eq!(local, cond_temp, "Drop scheduled on top of condition"); self.cfg.push( true_block, - Statement { - source_info, - kind: StatementKind::StorageDead(local) - }, + Statement { source_info, kind: StatementKind::StorageDead(local) }, ); self.cfg.push( false_block, - Statement { - source_info, - kind: StatementKind::StorageDead(local) - }, + Statement { source_info, kind: StatementKind::StorageDead(local) }, ); } } @@ -981,7 +978,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// /// This path terminates in Resume. Returns the start of the path. /// See module comment for more details. - pub fn diverge_cleanup(&mut self) -> BasicBlock { + crate fn diverge_cleanup(&mut self) -> BasicBlock { self.diverge_cleanup_gen(false) } @@ -990,12 +987,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { target } else { let resumeblk = self.cfg.start_new_cleanup_block(); - self.cfg.terminate(resumeblk, - SourceInfo { - scope: OUTERMOST_SOURCE_SCOPE, - span: self.fn_span - }, - TerminatorKind::Resume); + self.cfg.terminate( + resumeblk, + SourceInfo { scope: OUTERMOST_SOURCE_SCOPE, span: self.fn_span }, + TerminatorKind::Resume, + ); self.cached_resume_block = Some(resumeblk); resumeblk } @@ -1015,63 +1011,78 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Find the last cached block debug!("diverge_cleanup_gen(self.scopes = {:?})", self.scopes); - let cached_cleanup = self.scopes.iter_mut().enumerate() - .find_map(|(idx, ref scope)| { - let cached_block = scope.cached_unwind.get(generator_drop)?; - Some((cached_block, idx)) - }); - let (mut target, first_uncached) = cached_cleanup - .unwrap_or_else(|| (self.resume_block(), self.scopes.len())); + let cached_cleanup = self.scopes.iter_mut().enumerate().find_map(|(idx, ref scope)| { + let cached_block = scope.cached_unwind.get(generator_drop)?; + Some((cached_block, idx)) + }); + let (mut target, first_uncached) = + cached_cleanup.unwrap_or_else(|| (self.resume_block(), self.scopes.len())); for scope in self.scopes.top_scopes(first_uncached) { - target = build_diverge_scope(&mut self.cfg, scope.region_scope_span, - scope, target, generator_drop, self.generator_kind); + target = build_diverge_scope( + &mut self.cfg, + scope.region_scope_span, + scope, + target, + generator_drop, + self.generator_kind, + ); } target } /// Utility function for *non*-scope code to build their own drops - pub fn build_drop_and_replace(&mut self, - block: BasicBlock, - span: Span, - location: Place<'tcx>, - value: Operand<'tcx>) -> BlockAnd<()> { + crate fn build_drop_and_replace( + &mut self, + block: BasicBlock, + span: Span, + location: Place<'tcx>, + value: Operand<'tcx>, + ) -> BlockAnd<()> { let source_info = self.source_info(span); let next_target = self.cfg.start_new_block(); let diverge_target = self.diverge_cleanup(); - self.cfg.terminate(block, source_info, - TerminatorKind::DropAndReplace { - location, - value, - target: next_target, - unwind: Some(diverge_target), - }); + self.cfg.terminate( + block, + source_info, + TerminatorKind::DropAndReplace { + location, + value, + target: next_target, + unwind: Some(diverge_target), + }, + ); next_target.unit() } /// Creates an Assert terminator and return the success block. /// If the boolean condition operand is not the expected value, /// a runtime panic will be caused with the given message. - pub fn assert(&mut self, block: BasicBlock, - cond: Operand<'tcx>, - expected: bool, - msg: AssertMessage<'tcx>, - span: Span) - -> BasicBlock { + crate fn assert( + &mut self, + block: BasicBlock, + cond: Operand<'tcx>, + expected: bool, + msg: AssertMessage<'tcx>, + span: Span, + ) -> BasicBlock { let source_info = self.source_info(span); let success_block = self.cfg.start_new_block(); let cleanup = self.diverge_cleanup(); - self.cfg.terminate(block, source_info, - TerminatorKind::Assert { - cond, - expected, - msg, - target: success_block, - cleanup: Some(cleanup), - }); + self.cfg.terminate( + block, + source_info, + TerminatorKind::Assert { + cond, + expected, + msg, + target: success_block, + cleanup: Some(cleanup), + }, + ); success_block } @@ -1143,20 +1154,21 @@ fn build_scope_drops<'tcx>( .unwrap_or(last_unwind_to); let next = cfg.start_new_block(); - cfg.terminate(block, source_info, TerminatorKind::Drop { - location: local.into(), - target: next, - unwind: Some(unwind_to) - }); + cfg.terminate( + block, + source_info, + TerminatorKind::Drop { + location: local.into(), + target: next, + unwind: Some(unwind_to), + }, + ); block = next; } DropKind::Storage => { // Only temps and vars need their storage dead. assert!(local.index() > arg_count); - cfg.push(block, Statement { - source_info, - kind: StatementKind::StorageDead(local) - }); + cfg.push(block, Statement { source_info, kind: StatementKind::StorageDead(local) }); } } } @@ -1188,14 +1200,14 @@ fn get_unwind_to( None } -fn build_diverge_scope<'tcx>(cfg: &mut CFG<'tcx>, - span: Span, - scope: &mut Scope, - mut target: BasicBlock, - generator_drop: bool, - generator_kind: Option) - -> BasicBlock -{ +fn build_diverge_scope<'tcx>( + cfg: &mut CFG<'tcx>, + span: Span, + scope: &mut Scope, + mut target: BasicBlock, + generator_drop: bool, + generator_kind: Option, +) -> BasicBlock { // Build up the drops in **reverse** order. The end result will // look like: // @@ -1207,10 +1219,7 @@ fn build_diverge_scope<'tcx>(cfg: &mut CFG<'tcx>, // left reading the cached results but never create anything. let source_scope = scope.source_scope; - let source_info = |span| SourceInfo { - span, - scope: source_scope - }; + let source_info = |span| SourceInfo { span, scope: source_scope }; // We keep track of StorageDead statements to prepend to our current block // and store them here, in reverse order. @@ -1236,15 +1245,14 @@ fn build_diverge_scope<'tcx>(cfg: &mut CFG<'tcx>, DropKind::Storage if generator_kind.is_some() => { storage_deads.push(Statement { source_info: source_info(drop_data.span), - kind: StatementKind::StorageDead(drop_data.local) + kind: StatementKind::StorageDead(drop_data.local), }); if !target_built_by_us { // We cannot add statements to an existing block, so we create a new // block for our StorageDead statements. let block = cfg.start_new_cleanup_block(); let source_info = SourceInfo { span: DUMMY_SP, scope: source_scope }; - cfg.terminate(block, source_info, - TerminatorKind::Goto { target: target }); + cfg.goto(block, source_info, target); target = block; target_built_by_us = true; } @@ -1266,7 +1274,7 @@ fn build_diverge_scope<'tcx>(cfg: &mut CFG<'tcx>, TerminatorKind::Drop { location: drop_data.local.into(), target, - unwind: None + unwind: None, }, ); *cached_block = Some(block); @@ -1285,14 +1293,20 @@ fn build_diverge_scope<'tcx>(cfg: &mut CFG<'tcx>, target } -fn push_storage_deads(cfg: &mut CFG<'tcx>, - target: BasicBlock, - storage_deads: &mut Vec>) { - if storage_deads.is_empty() { return; } +fn push_storage_deads<'tcx>( + cfg: &mut CFG<'tcx>, + target: BasicBlock, + storage_deads: &mut Vec>, +) { + if storage_deads.is_empty() { + return; + } let statements = &mut cfg.block_data_mut(target).statements; storage_deads.reverse(); - debug!("push_storage_deads({:?}), storage_deads={:?}, statements={:?}", - target, storage_deads, statements); + debug!( + "push_storage_deads({:?}), storage_deads={:?}, statements={:?}", + target, storage_deads, statements + ); storage_deads.append(statements); mem::swap(statements, storage_deads); assert!(storage_deads.is_empty()); diff --git a/src/librustc_mir/hair/constant.rs b/src/librustc_mir_build/hair/constant.rs similarity index 50% rename from src/librustc_mir/hair/constant.rs rename to src/librustc_mir_build/hair/constant.rs index 1abdcde10a..2d9ee62da3 100644 --- a/src/librustc_mir/hair/constant.rs +++ b/src/librustc_mir_build/hair/constant.rs @@ -1,21 +1,15 @@ +use rustc::mir::interpret::{ + truncate, Allocation, ConstValue, LitToConstError, LitToConstInput, Scalar, +}; +use rustc::ty::{self, layout::Size, ParamEnv, TyCtxt, TyS}; +use rustc_span::symbol::Symbol; use syntax::ast; -use rustc::ty::{self, Ty, TyCtxt, ParamEnv, layout::Size}; -use syntax_pos::symbol::Symbol; -use rustc::mir::interpret::{ConstValue, Scalar}; - -#[derive(PartialEq)] -crate enum LitToConstError { - UnparseableFloat, - Reported, -} crate fn lit_to_const<'tcx>( - lit: &'tcx ast::LitKind, tcx: TyCtxt<'tcx>, - ty: Ty<'tcx>, - neg: bool, + lit_input: LitToConstInput<'tcx>, ) -> Result<&'tcx ty::Const<'tcx>, LitToConstError> { - use syntax::ast::*; + let LitToConstInput { lit, ty, neg } = lit_input; let trunc = |n| { let param_ty = ParamEnv::reveal_all().and(ty); @@ -26,46 +20,42 @@ crate fn lit_to_const<'tcx>( Ok(ConstValue::Scalar(Scalar::from_uint(result, width))) }; - use rustc::mir::interpret::*; - let lit = match *lit { - LitKind::Str(ref s, _) => { + let lit = match (lit, &ty.kind) { + (ast::LitKind::Str(s, _), ty::Ref(_, TyS { kind: ty::Str, .. }, _)) => { let s = s.as_str(); let allocation = Allocation::from_byte_aligned_bytes(s.as_bytes()); let allocation = tcx.intern_const_alloc(allocation); ConstValue::Slice { data: allocation, start: 0, end: s.len() } - }, - LitKind::ByteStr(ref data) => { + } + (ast::LitKind::ByteStr(data), ty::Ref(_, TyS { kind: ty::Slice(_), .. }, _)) => { + let allocation = Allocation::from_byte_aligned_bytes(data as &Vec); + let allocation = tcx.intern_const_alloc(allocation); + ConstValue::Slice { data: allocation, start: 0, end: data.len() } + } + (ast::LitKind::ByteStr(data), ty::Ref(_, TyS { kind: ty::Array(_, _), .. }, _)) => { let id = tcx.allocate_bytes(data); ConstValue::Scalar(Scalar::Ptr(id.into())) - }, - LitKind::Byte(n) => ConstValue::Scalar(Scalar::from_uint(n, Size::from_bytes(1))), - LitKind::Int(n, _) if neg => { - let n = n as i128; - let n = n.overflowing_neg().0; - trunc(n as u128)? - }, - LitKind::Int(n, _) => trunc(n)?, - LitKind::Float(n, _) => { - let fty = match ty.kind { - ty::Float(fty) => fty, - _ => bug!() - }; - parse_float(n, fty, neg).map_err(|_| LitToConstError::UnparseableFloat)? } - LitKind::Bool(b) => ConstValue::Scalar(Scalar::from_bool(b)), - LitKind::Char(c) => ConstValue::Scalar(Scalar::from_char(c)), - LitKind::Err(_) => unreachable!(), + (ast::LitKind::Byte(n), ty::Uint(ast::UintTy::U8)) => { + ConstValue::Scalar(Scalar::from_uint(*n, Size::from_bytes(1))) + } + (ast::LitKind::Int(n, _), ty::Uint(_)) | (ast::LitKind::Int(n, _), ty::Int(_)) => { + trunc(if neg { (*n as i128).overflowing_neg().0 as u128 } else { *n })? + } + (ast::LitKind::Float(n, _), ty::Float(fty)) => { + parse_float(*n, *fty, neg).map_err(|_| LitToConstError::UnparseableFloat)? + } + (ast::LitKind::Bool(b), ty::Bool) => ConstValue::Scalar(Scalar::from_bool(*b)), + (ast::LitKind::Char(c), ty::Char) => ConstValue::Scalar(Scalar::from_char(*c)), + (ast::LitKind::Err(_), _) => return Err(LitToConstError::Reported), + _ => return Err(LitToConstError::TypeError), }; Ok(tcx.mk_const(ty::Const { val: ty::ConstKind::Value(lit), ty })) } -fn parse_float<'tcx>( - num: Symbol, - fty: ast::FloatTy, - neg: bool, -) -> Result, ()> { +fn parse_float<'tcx>(num: Symbol, fty: ast::FloatTy, neg: bool) -> Result, ()> { let num = num.as_str(); - use rustc_apfloat::ieee::{Single, Double}; + use rustc_apfloat::ieee::{Double, Single}; let scalar = match fty { ast::FloatTy::F32 => { num.parse::().map_err(|_| ())?; diff --git a/src/librustc_mir/hair/cx/block.rs b/src/librustc_mir_build/hair/cx/block.rs similarity index 74% rename from src/librustc_mir/hair/cx/block.rs rename to src/librustc_mir_build/hair/cx/block.rs index 8dda51cd77..a883b84f8f 100644 --- a/src/librustc_mir/hair/cx/block.rs +++ b/src/librustc_mir_build/hair/cx/block.rs @@ -1,14 +1,14 @@ -use crate::hair::{self, *}; -use crate::hair::cx::Cx; use crate::hair::cx::to_ref::ToRef; +use crate::hair::cx::Cx; +use crate::hair::{self, *}; use rustc::middle::region; -use rustc::hir; use rustc::ty; +use rustc_hir as hir; use rustc_index::vec::Idx; -impl<'tcx> Mirror<'tcx> for &'tcx hir::Block { +impl<'tcx> Mirror<'tcx> for &'tcx hir::Block<'tcx> { type Output = Block<'tcx>; fn make_mirror(self, cx: &mut Cx<'_, 'tcx>) -> Block<'tcx> { @@ -19,23 +19,16 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Block { cx.region_scope_tree.opt_destruction_scope(self.hir_id.local_id); Block { targeted_by_break: self.targeted_by_break, - region_scope: region::Scope { - id: self.hir_id.local_id, - data: region::ScopeData::Node - }, + region_scope: region::Scope { id: self.hir_id.local_id, data: region::ScopeData::Node }, opt_destruction_scope, span: self.span, stmts, expr: self.expr.to_ref(), safety_mode: match self.rules { - hir::BlockCheckMode::DefaultBlock => - BlockSafety::Safe, - hir::BlockCheckMode::UnsafeBlock(..) => - BlockSafety::ExplicitUnsafe(self.hir_id), - hir::BlockCheckMode::PushUnsafeBlock(..) => - BlockSafety::PushUnsafe, - hir::BlockCheckMode::PopUnsafeBlock(..) => - BlockSafety::PopUnsafe + hir::BlockCheckMode::DefaultBlock => BlockSafety::Safe, + hir::BlockCheckMode::UnsafeBlock(..) => BlockSafety::ExplicitUnsafe(self.hir_id), + hir::BlockCheckMode::PushUnsafeBlock(..) => BlockSafety::PushUnsafe, + hir::BlockCheckMode::PopUnsafeBlock(..) => BlockSafety::PopUnsafe, }, } } @@ -44,21 +37,17 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Block { fn mirror_stmts<'a, 'tcx>( cx: &mut Cx<'a, 'tcx>, block_id: hir::ItemLocalId, - stmts: &'tcx [hir::Stmt], + stmts: &'tcx [hir::Stmt<'tcx>], ) -> Vec> { let mut result = vec![]; for (index, stmt) in stmts.iter().enumerate() { let hir_id = stmt.hir_id; let opt_dxn_ext = cx.region_scope_tree.opt_destruction_scope(hir_id.local_id); match stmt.kind { - hir::StmtKind::Expr(ref expr) | - hir::StmtKind::Semi(ref expr) => { + hir::StmtKind::Expr(ref expr) | hir::StmtKind::Semi(ref expr) => { result.push(StmtRef::Mirror(Box::new(Stmt { kind: StmtKind::Expr { - scope: region::Scope { - id: hir_id.local_id, - data: region::ScopeData::Node - }, + scope: region::Scope { id: hir_id.local_id, data: region::ScopeData::Node }, expr: expr.to_ref(), }, opt_destruction_scope: opt_dxn_ext, @@ -70,8 +59,7 @@ fn mirror_stmts<'a, 'tcx>( hir::StmtKind::Local(ref local) => { let remainder_scope = region::Scope { id: block_id, - data: region::ScopeData::Remainder( - region::FirstStatementIndex::new(index)), + data: region::ScopeData::Remainder(region::FirstStatementIndex::new(index)), }; let mut pattern = cx.pattern_from_hir(&local.pat); @@ -89,7 +77,7 @@ fn mirror_stmts<'a, 'tcx>( variance: ty::Variance::Covariant, }, subpattern: pattern, - }) + }), }; } } @@ -99,7 +87,7 @@ fn mirror_stmts<'a, 'tcx>( remainder_scope: remainder_scope, init_scope: region::Scope { id: hir_id.local_id, - data: region::ScopeData::Node + data: region::ScopeData::Node, }, pattern, initializer: local.init.to_ref(), @@ -113,9 +101,9 @@ fn mirror_stmts<'a, 'tcx>( return result; } -pub fn to_expr_ref<'a, 'tcx>( +crate fn to_expr_ref<'a, 'tcx>( cx: &mut Cx<'a, 'tcx>, - block: &'tcx hir::Block, + block: &'tcx hir::Block<'tcx>, ) -> ExprRef<'tcx> { let block_ty = cx.tables().node_type(block.hir_id); let temp_lifetime = cx.region_scope_tree.temporary_scope(block.hir_id.local_id); diff --git a/src/librustc_mir/hair/cx/expr.rs b/src/librustc_mir_build/hair/cx/expr.rs similarity index 57% rename from src/librustc_mir/hair/cx/expr.rs rename to src/librustc_mir_build/hair/cx/expr.rs index 8c852854be..d6786ea247 100644 --- a/src/librustc_mir/hair/cx/expr.rs +++ b/src/librustc_mir_build/hair/cx/expr.rs @@ -1,28 +1,25 @@ -use crate::hair::*; -use crate::hair::cx::Cx; use crate::hair::cx::block; use crate::hair::cx::to_ref::ToRef; +use crate::hair::cx::Cx; use crate::hair::util::UserAnnotatedTyHelpers; -use rustc_index::vec::Idx; -use rustc::hir::def::{CtorOf, Res, DefKind, CtorKind}; -use rustc::mir::interpret::{GlobalId, ErrorHandled, Scalar}; -use rustc::ty::{self, AdtKind, Ty}; -use rustc::ty::adjustment::{Adjustment, Adjust, AutoBorrow, AutoBorrowMutability, PointerCast}; -use rustc::ty::subst::{InternalSubsts, SubstsRef}; -use rustc::hir; -use rustc::hir::def_id::LocalDefId; +use crate::hair::*; +use rustc::mir::interpret::{ErrorHandled, Scalar}; use rustc::mir::BorrowKind; -use syntax_pos::Span; +use rustc::ty::adjustment::{Adjust, Adjustment, AutoBorrow, AutoBorrowMutability, PointerCast}; +use rustc::ty::subst::{InternalSubsts, SubstsRef}; +use rustc::ty::{self, AdtKind, Ty}; +use rustc_hir as hir; +use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res}; +use rustc_hir::def_id::LocalDefId; +use rustc_index::vec::Idx; +use rustc_span::Span; -impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr { +impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr<'tcx> { type Output = Expr<'tcx>; fn make_mirror(self, cx: &mut Cx<'_, 'tcx>) -> Expr<'tcx> { let temp_lifetime = cx.region_scope_tree.temporary_scope(self.hir_id.local_id); - let expr_scope = region::Scope { - id: self.hir_id.local_id, - data: region::ScopeData::Node - }; + let expr_scope = region::Scope { id: self.hir_id.local_id, data: region::ScopeData::Node }; debug!("Expr::make_mirror(): id={}, span={:?}", self.hir_id, self.span); @@ -30,9 +27,7 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr { // Now apply adjustments, if any. for adjustment in cx.tables().expr_adjustments(self) { - debug!("make_mirror: expr={:?} applying adjustment={:?}", - expr, - adjustment); + debug!("make_mirror: expr={:?} applying adjustment={:?}", expr, adjustment); expr = apply_adjustment(cx, self, expr, adjustment); } @@ -49,19 +44,19 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr { }; // Finally, create a destruction scope, if any. - if let Some(region_scope) = - cx.region_scope_tree.opt_destruction_scope(self.hir_id.local_id) { - expr = Expr { - temp_lifetime, - ty: expr.ty, - span: self.span, - kind: ExprKind::Scope { - region_scope, - value: expr.to_ref(), - lint_level: LintLevel::Inherited, - }, - }; - } + if let Some(region_scope) = cx.region_scope_tree.opt_destruction_scope(self.hir_id.local_id) + { + expr = Expr { + temp_lifetime, + ty: expr.ty, + span: self.span, + kind: ExprKind::Scope { + region_scope, + value: expr.to_ref(), + lint_level: LintLevel::Inherited, + }, + }; + } // OK, all done! expr @@ -70,9 +65,9 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr { fn apply_adjustment<'a, 'tcx>( cx: &mut Cx<'a, 'tcx>, - hir_expr: &'tcx hir::Expr, + hir_expr: &'tcx hir::Expr<'tcx>, mut expr: Expr<'tcx>, - adjustment: &Adjustment<'tcx> + adjustment: &Adjustment<'tcx>, ) -> Expr<'tcx> { let Expr { temp_lifetime, mut span, .. } = expr; @@ -100,12 +95,8 @@ fn apply_adjustment<'a, 'tcx>( adjust_span(&mut expr); ExprKind::Pointer { cast: PointerCast::Unsize, source: expr.to_ref() } } - Adjust::Pointer(cast) => { - ExprKind::Pointer { cast, source: expr.to_ref() } - } - Adjust::NeverToAny => { - ExprKind::NeverToAny { source: expr.to_ref() } - } + Adjust::Pointer(cast) => ExprKind::Pointer { cast, source: expr.to_ref() }, + Adjust::NeverToAny => ExprKind::NeverToAny { source: expr.to_ref() }, Adjust::Deref(None) => { adjust_span(&mut expr); ExprKind::Deref { arg: expr.to_ref() } @@ -117,11 +108,7 @@ fn apply_adjustment<'a, 'tcx>( expr = Expr { temp_lifetime, - ty: cx.tcx.mk_ref(deref.region, - ty::TypeAndMut { - ty: expr.ty, - mutbl: deref.mutbl, - }), + ty: cx.tcx.mk_ref(deref.region, ty::TypeAndMut { ty: expr.ty, mutbl: deref.mutbl }), span, kind: ExprKind::Borrow { borrow_kind: deref.mutbl.to_borrow_kind(), @@ -132,27 +119,19 @@ fn apply_adjustment<'a, 'tcx>( overloaded_place(cx, hir_expr, adjustment.target, Some(call), vec![expr.to_ref()]) } Adjust::Borrow(AutoBorrow::Ref(_, m)) => { - ExprKind::Borrow { - borrow_kind: m.to_borrow_kind(), - arg: expr.to_ref(), - } + ExprKind::Borrow { borrow_kind: m.to_borrow_kind(), arg: expr.to_ref() } } - Adjust::Borrow(AutoBorrow::RawPtr(mutbl)) => { - raw_ref_shim(cx, expr.to_ref(), adjustment.target, mutbl, span, temp_lifetime) + Adjust::Borrow(AutoBorrow::RawPtr(mutability)) => { + ExprKind::AddressOf { mutability, arg: expr.to_ref() } } }; - Expr { - temp_lifetime, - ty: adjustment.target, - span, - kind, - } + Expr { temp_lifetime, ty: adjustment.target, span, kind } } fn make_mirror_unadjusted<'a, 'tcx>( cx: &mut Cx<'a, 'tcx>, - expr: &'tcx hir::Expr, + expr: &'tcx hir::Expr<'tcx>, ) -> Expr<'tcx> { let expr_ty = cx.tables().expr_ty(expr); let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); @@ -161,16 +140,9 @@ fn make_mirror_unadjusted<'a, 'tcx>( // Here comes the interesting stuff: hir::ExprKind::MethodCall(_, method_span, ref args) => { // Rewrite a.b(c) into UFCS form like Trait::b(a, c) - let expr = method_callee(cx, expr, method_span,None); - let args = args.iter() - .map(|e| e.to_ref()) - .collect(); - ExprKind::Call { - ty: expr.ty, - fun: expr.to_ref(), - args, - from_hir_call: true, - } + let expr = method_callee(cx, expr, method_span, None); + let args = args.iter().map(|e| e.to_ref()).collect(); + ExprKind::Call { ty: expr.ty, fun: expr.to_ref(), args, from_hir_call: true } } hir::ExprKind::Call(ref fun, ref args) => { @@ -182,7 +154,7 @@ fn make_mirror_unadjusted<'a, 'tcx>( // rewrite f(u, v) into FnOnce::call_once(f, (u, v)) - let method = method_callee(cx, expr, fun.span,None); + let method = method_callee(cx, expr, fun.span, None); let arg_tys = args.iter().map(|e| cx.tables().expr_ty_adjusted(e)); let tupled_args = Expr { @@ -199,27 +171,24 @@ fn make_mirror_unadjusted<'a, 'tcx>( from_hir_call: true, } } else { - let adt_data = if let hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) = - fun.kind - { - // Tuple-like ADTs are represented as ExprKind::Call. We convert them here. - expr_ty.ty_adt_def().and_then(|adt_def| { - match path.res { - Res::Def(DefKind::Ctor(_, CtorKind::Fn), ctor_id) => - Some((adt_def, adt_def.variant_index_with_ctor_id(ctor_id))), + let adt_data = + if let hir::ExprKind::Path(hir::QPath::Resolved(_, ref path)) = fun.kind { + // Tuple-like ADTs are represented as ExprKind::Call. We convert them here. + expr_ty.ty_adt_def().and_then(|adt_def| match path.res { + Res::Def(DefKind::Ctor(_, CtorKind::Fn), ctor_id) => { + Some((adt_def, adt_def.variant_index_with_ctor_id(ctor_id))) + } Res::SelfCtor(..) => Some((adt_def, VariantIdx::new(0))), _ => None, - } - }) - } else { - None - }; + }) + } else { + None + }; if let Some((adt_def, index)) = adt_data { let substs = cx.tables().node_substs(fun.hir_id); let user_provided_types = cx.tables().user_provided_types(); - let user_ty = user_provided_types.get(fun.hir_id) - .map(|u_ty| *u_ty) - .map(|mut u_ty| { + let user_ty = + user_provided_types.get(fun.hir_id).map(|u_ty| *u_ty).map(|mut u_ty| { if let UserType::TypeOf(ref mut did, _) = &mut u_ty.value { *did = adt_def.did; } @@ -227,14 +196,10 @@ fn make_mirror_unadjusted<'a, 'tcx>( }); debug!("make_mirror_unadjusted: (call) user_ty={:?}", user_ty); - let field_refs = args.iter() + let field_refs = args + .iter() .enumerate() - .map(|(idx, e)| { - FieldExprRef { - name: Field::new(idx), - expr: e.to_ref(), - } - }) + .map(|(idx, e)| FieldExprRef { name: Field::new(idx), expr: e.to_ref() }) .collect(); ExprKind::Adt { adt_def, @@ -256,43 +221,24 @@ fn make_mirror_unadjusted<'a, 'tcx>( } hir::ExprKind::AddrOf(hir::BorrowKind::Ref, mutbl, ref arg) => { - ExprKind::Borrow { - borrow_kind: mutbl.to_borrow_kind(), - arg: arg.to_ref(), - } + ExprKind::Borrow { borrow_kind: mutbl.to_borrow_kind(), arg: arg.to_ref() } } - hir::ExprKind::AddrOf(hir::BorrowKind::Raw, mutbl, ref arg) => { - cx.tcx.sess - .struct_span_err( - expr.span, - "raw borrows are not yet implemented" - ) - .note("for more information, see https://github.com/rust-lang/rust/issues/64490") - .emit(); - - // Lower to an approximation to avoid further errors. - raw_ref_shim(cx, arg.to_ref(), expr_ty, mutbl, expr.span, temp_lifetime) + hir::ExprKind::AddrOf(hir::BorrowKind::Raw, mutability, ref arg) => { + ExprKind::AddressOf { mutability, arg: arg.to_ref() } } hir::ExprKind::Block(ref blk, _) => ExprKind::Block { body: &blk }, - hir::ExprKind::Assign(ref lhs, ref rhs) => { - ExprKind::Assign { - lhs: lhs.to_ref(), - rhs: rhs.to_ref(), - } + hir::ExprKind::Assign(ref lhs, ref rhs, _) => { + ExprKind::Assign { lhs: lhs.to_ref(), rhs: rhs.to_ref() } } hir::ExprKind::AssignOp(op, ref lhs, ref rhs) => { if cx.tables().is_method_call(expr) { overloaded_operator(cx, expr, vec![lhs.to_ref(), rhs.to_ref()]) } else { - ExprKind::AssignOp { - op: bin_op(op.node), - lhs: lhs.to_ref(), - rhs: rhs.to_ref(), - } + ExprKind::AssignOp { op: bin_op(op.node), lhs: lhs.to_ref(), rhs: rhs.to_ref() } } } @@ -311,52 +257,30 @@ fn make_mirror_unadjusted<'a, 'tcx>( (hir::BinOpKind::And, hir::Constness::Const) if !cx.tcx.features().const_if_match => { - cx.control_flow_destroyed.push(( - op.span, - "`&&` operator".into(), - )); - ExprKind::Binary { - op: BinOp::BitAnd, - lhs: lhs.to_ref(), - rhs: rhs.to_ref(), - } + cx.control_flow_destroyed.push((op.span, "`&&` operator".into())); + ExprKind::Binary { op: BinOp::BitAnd, lhs: lhs.to_ref(), rhs: rhs.to_ref() } } (hir::BinOpKind::Or, hir::Constness::Const) if !cx.tcx.features().const_if_match => { - cx.control_flow_destroyed.push(( - op.span, - "`||` operator".into(), - )); - ExprKind::Binary { - op: BinOp::BitOr, - lhs: lhs.to_ref(), - rhs: rhs.to_ref(), - } + cx.control_flow_destroyed.push((op.span, "`||` operator".into())); + ExprKind::Binary { op: BinOp::BitOr, lhs: lhs.to_ref(), rhs: rhs.to_ref() } } - (hir::BinOpKind::And, _) => { - ExprKind::LogicalOp { - op: LogicalOp::And, - lhs: lhs.to_ref(), - rhs: rhs.to_ref(), - } - } - (hir::BinOpKind::Or, _) => { - ExprKind::LogicalOp { - op: LogicalOp::Or, - lhs: lhs.to_ref(), - rhs: rhs.to_ref(), - } - } + (hir::BinOpKind::And, _) => ExprKind::LogicalOp { + op: LogicalOp::And, + lhs: lhs.to_ref(), + rhs: rhs.to_ref(), + }, + (hir::BinOpKind::Or, _) => ExprKind::LogicalOp { + op: LogicalOp::Or, + lhs: lhs.to_ref(), + rhs: rhs.to_ref(), + }, _ => { let op = bin_op(op.node); - ExprKind::Binary { - op, - lhs: lhs.to_ref(), - rhs: rhs.to_ref(), - } + ExprKind::Binary { op, lhs: lhs.to_ref(), rhs: rhs.to_ref() } } } } @@ -366,10 +290,7 @@ fn make_mirror_unadjusted<'a, 'tcx>( if cx.tables().is_method_call(expr) { overloaded_place(cx, expr, expr_ty, None, vec![lhs.to_ref(), index.to_ref()]) } else { - ExprKind::Index { - lhs: lhs.to_ref(), - index: index.to_ref(), - } + ExprKind::Index { lhs: lhs.to_ref(), index: index.to_ref() } } } @@ -385,10 +306,7 @@ fn make_mirror_unadjusted<'a, 'tcx>( if cx.tables().is_method_call(expr) { overloaded_operator(cx, expr, vec![arg.to_ref()]) } else { - ExprKind::Unary { - op: UnOp::Not, - arg: arg.to_ref(), - } + ExprKind::Unary { op: UnOp::Not, arg: arg.to_ref() } } } @@ -402,81 +320,63 @@ fn make_mirror_unadjusted<'a, 'tcx>( user_ty: None, } } else { - ExprKind::Unary { - op: UnOp::Neg, - arg: arg.to_ref(), - } + ExprKind::Unary { op: UnOp::Neg, arg: arg.to_ref() } } } } - hir::ExprKind::Struct(ref qpath, ref fields, ref base) => { - match expr_ty.kind { - ty::Adt(adt, substs) => { - match adt.adt_kind() { - AdtKind::Struct | AdtKind::Union => { + hir::ExprKind::Struct(ref qpath, ref fields, ref base) => match expr_ty.kind { + ty::Adt(adt, substs) => match adt.adt_kind() { + AdtKind::Struct | AdtKind::Union => { + let user_provided_types = cx.tables().user_provided_types(); + let user_ty = user_provided_types.get(expr.hir_id).map(|u_ty| *u_ty); + debug!("make_mirror_unadjusted: (struct/union) user_ty={:?}", user_ty); + ExprKind::Adt { + adt_def: adt, + variant_index: VariantIdx::new(0), + substs, + user_ty, + fields: field_refs(cx, fields), + base: base.as_ref().map(|base| FruInfo { + base: base.to_ref(), + field_types: cx.tables().fru_field_types()[expr.hir_id].clone(), + }), + } + } + AdtKind::Enum => { + let res = cx.tables().qpath_res(qpath, expr.hir_id); + match res { + Res::Def(DefKind::Variant, variant_id) => { + assert!(base.is_none()); + + let index = adt.variant_index_with_id(variant_id); let user_provided_types = cx.tables().user_provided_types(); let user_ty = user_provided_types.get(expr.hir_id).map(|u_ty| *u_ty); - debug!("make_mirror_unadjusted: (struct/union) user_ty={:?}", user_ty); + debug!("make_mirror_unadjusted: (variant) user_ty={:?}", user_ty); ExprKind::Adt { adt_def: adt, - variant_index: VariantIdx::new(0), + variant_index: index, substs, user_ty, fields: field_refs(cx, fields), - base: base.as_ref().map(|base| { - FruInfo { - base: base.to_ref(), - field_types: cx.tables() - .fru_field_types()[expr.hir_id] - .clone(), - } - }), + base: None, } } - AdtKind::Enum => { - let res = cx.tables().qpath_res(qpath, expr.hir_id); - match res { - Res::Def(DefKind::Variant, variant_id) => { - assert!(base.is_none()); - - let index = adt.variant_index_with_id(variant_id); - let user_provided_types = cx.tables().user_provided_types(); - let user_ty = user_provided_types.get(expr.hir_id) - .map(|u_ty| *u_ty); - debug!( - "make_mirror_unadjusted: (variant) user_ty={:?}", - user_ty - ); - ExprKind::Adt { - adt_def: adt, - variant_index: index, - substs, - user_ty, - fields: field_refs(cx, fields), - base: None, - } - } - _ => { - span_bug!(expr.span, "unexpected res: {:?}", res); - } - } + _ => { + span_bug!(expr.span, "unexpected res: {:?}", res); } } } - _ => { - span_bug!(expr.span, - "unexpected type for struct literal: {:?}", - expr_ty); - } + }, + _ => { + span_bug!(expr.span, "unexpected type for struct literal: {:?}", expr_ty); } - } + }, hir::ExprKind::Closure(..) => { let closure_ty = cx.tables().expr_ty(expr); let (def_id, substs, movability) = match closure_ty.kind { - ty::Closure(def_id, substs) => (def_id, - UpvarSubsts::Closure(substs), None), + ty::Closure(def_id, substs) => (def_id, UpvarSubsts::Closure(substs), None), ty::Generator(def_id, substs, movability) => { (def_id, UpvarSubsts::Generator(substs), Some(movability)) } @@ -484,17 +384,15 @@ fn make_mirror_unadjusted<'a, 'tcx>( span_bug!(expr.span, "closure expr w/o closure type: {:?}", closure_ty); } }; - let upvars = cx.tcx.upvars(def_id).iter() + let upvars = cx + .tcx + .upvars(def_id) + .iter() .flat_map(|upvars| upvars.iter()) .zip(substs.upvar_tys(def_id, cx.tcx)) .map(|((&var_hir_id, _), ty)| capture_upvar(cx, expr, var_hir_id, ty)) .collect(); - ExprKind::Closure { - closure_id: def_id, - substs, - upvars, - movability, - } + ExprKind::Closure { closure_id: def_id, substs, upvars, movability } } hir::ExprKind::Path(ref qpath) => { @@ -502,84 +400,60 @@ fn make_mirror_unadjusted<'a, 'tcx>( convert_path_expr(cx, expr, res) } - hir::ExprKind::InlineAsm(ref asm) => { - ExprKind::InlineAsm { - asm: &asm.inner, - outputs: asm.outputs_exprs.to_ref(), - inputs: asm.inputs_exprs.to_ref(), - } - } + hir::ExprKind::InlineAsm(ref asm) => ExprKind::InlineAsm { + asm: &asm.inner, + outputs: asm.outputs_exprs.to_ref(), + inputs: asm.inputs_exprs.to_ref(), + }, // Now comes the rote stuff: hir::ExprKind::Repeat(ref v, ref count) => { let def_id = cx.tcx.hir().local_def_id(count.hir_id); let substs = InternalSubsts::identity_for_item(cx.tcx, def_id); - let instance = ty::Instance::resolve( - cx.tcx, - cx.param_env, + let span = cx.tcx.def_span(def_id); + let count = match cx.tcx.const_eval_resolve( + ty::ParamEnv::reveal_all(), def_id, substs, - ).unwrap(); - let global_id = GlobalId { - instance, - promoted: None - }; - let span = cx.tcx.def_span(def_id); - let count = match cx.tcx.at(span).const_eval(cx.param_env.and(global_id)) { - Ok(cv) => cv.eval_usize(cx.tcx, cx.param_env), + None, + Some(span), + ) { + Ok(cv) => cv.eval_usize(cx.tcx, ty::ParamEnv::reveal_all()), Err(ErrorHandled::Reported) => 0, Err(ErrorHandled::TooGeneric) => { + let span = cx.tcx.def_span(def_id); cx.tcx.sess.span_err(span, "array lengths can't depend on generic parameters"); 0 - }, + } }; - ExprKind::Repeat { - value: v.to_ref(), - count, - } + ExprKind::Repeat { value: v.to_ref(), count } } hir::ExprKind::Ret(ref v) => ExprKind::Return { value: v.to_ref() }, - hir::ExprKind::Break(dest, ref value) => { - match dest.target_id { - Ok(target_id) => ExprKind::Break { - label: region::Scope { - id: target_id.local_id, - data: region::ScopeData::Node - }, - value: value.to_ref(), - }, - Err(err) => bug!("invalid loop id for break: {}", err) - } - } - hir::ExprKind::Continue(dest) => { - match dest.target_id { - Ok(loop_id) => ExprKind::Continue { - label: region::Scope { - id: loop_id.local_id, - data: region::ScopeData::Node - }, - }, - Err(err) => bug!("invalid loop id for continue: {}", err) - } - } - hir::ExprKind::Match(ref discr, ref arms, _) => { - ExprKind::Match { - scrutinee: discr.to_ref(), - arms: arms.iter().map(|a| convert_arm(cx, a)).collect(), - } - } + hir::ExprKind::Break(dest, ref value) => match dest.target_id { + Ok(target_id) => ExprKind::Break { + label: region::Scope { id: target_id.local_id, data: region::ScopeData::Node }, + value: value.to_ref(), + }, + Err(err) => bug!("invalid loop id for break: {}", err), + }, + hir::ExprKind::Continue(dest) => match dest.target_id { + Ok(loop_id) => ExprKind::Continue { + label: region::Scope { id: loop_id.local_id, data: region::ScopeData::Node }, + }, + Err(err) => bug!("invalid loop id for continue: {}", err), + }, + hir::ExprKind::Match(ref discr, ref arms, _) => ExprKind::Match { + scrutinee: discr.to_ref(), + arms: arms.iter().map(|a| convert_arm(cx, a)).collect(), + }, hir::ExprKind::Loop(ref body, _, _) => { - ExprKind::Loop { - body: block::to_expr_ref(cx, body), - } - } - hir::ExprKind::Field(ref source, ..) => { - ExprKind::Field { - lhs: source.to_ref(), - name: Field::new(cx.tcx.field_index(expr.hir_id, cx.tables)), - } + ExprKind::Loop { body: block::to_expr_ref(cx, body) } } + hir::ExprKind::Field(ref source, ..) => ExprKind::Field { + lhs: source.to_ref(), + name: Field::new(cx.tcx.field_index(expr.hir_id, cx.tables)), + }, hir::ExprKind::Cast(ref source, ref cast_ty) => { // Check for a user-given type annotation on this `cast` let user_provided_types = cx.tables.user_provided_types(); @@ -587,9 +461,7 @@ fn make_mirror_unadjusted<'a, 'tcx>( debug!( "cast({:?}) has ty w/ hir_id {:?} and user provided ty {:?}", - expr, - cast_ty.hir_id, - user_ty, + expr, cast_ty.hir_id, user_ty, ); // Check to see if this cast is a "coercion cast", where the cast is actually done @@ -616,12 +488,8 @@ fn make_mirror_unadjusted<'a, 'tcx>( // so we wouldn't have to compute and store the actual value let var = if let hir::ExprKind::Path(ref qpath) = source.kind { let res = cx.tables().qpath_res(qpath, source.hir_id); - cx - .tables() - .node_type(source.hir_id) - .ty_adt_def() - .and_then(|adt_def| { - match res { + cx.tables().node_type(source.hir_id).ty_adt_def().and_then( + |adt_def| match res { Res::Def( DefKind::Ctor(CtorOf::Variant, CtorKind::Const), variant_ctor_id, @@ -634,22 +502,22 @@ fn make_mirror_unadjusted<'a, 'tcx>( Some((d, o, ty)) } _ => None, - } - }) + }, + ) } else { None }; let source = if let Some((did, offset, var_ty)) = var { - let mk_const = |literal| Expr { - temp_lifetime, - ty: var_ty, - span: expr.span, - kind: ExprKind::Literal { - literal, - user_ty: None - }, - }.to_ref(); + let mk_const = |literal| { + Expr { + temp_lifetime, + ty: var_ty, + span: expr.span, + kind: ExprKind::Literal { literal, user_ty: None }, + } + .to_ref() + }; let offset = mk_const(ty::Const::from_bits( cx.tcx, offset as u128, @@ -661,21 +529,12 @@ fn make_mirror_unadjusted<'a, 'tcx>( // and not the beginning of discriminants (which is always `0`) let substs = InternalSubsts::identity_for_item(cx.tcx(), did); let lhs = mk_const(cx.tcx().mk_const(ty::Const { - val: ty::ConstKind::Unevaluated(did, substs), + val: ty::ConstKind::Unevaluated(did, substs, None), ty: var_ty, })); - let bin = ExprKind::Binary { - op: BinOp::Add, - lhs, - rhs: offset, - }; - Expr { - temp_lifetime, - ty: var_ty, - span: expr.span, - kind: bin, - }.to_ref() - }, + let bin = ExprKind::Binary { op: BinOp::Add, lhs, rhs: offset }; + Expr { temp_lifetime, ty: var_ty, span: expr.span, kind: bin }.to_ref() + } None => offset, } } else { @@ -688,12 +547,7 @@ fn make_mirror_unadjusted<'a, 'tcx>( if let Some(user_ty) = user_ty { // NOTE: Creating a new Expr and wrapping a Cast inside of it may be // inefficient, revisit this when performance becomes an issue. - let cast_expr = Expr { - temp_lifetime, - ty: expr_ty, - span: expr.span, - kind: cast, - }; + let cast_expr = Expr { temp_lifetime, ty: expr_ty, span: expr.span, kind: cast }; debug!("make_mirror_unadjusted: (cast) user_ty={:?}", user_ty); ExprKind::ValueTypeAscription { @@ -709,25 +563,13 @@ fn make_mirror_unadjusted<'a, 'tcx>( let user_ty = user_provided_types.get(ty.hir_id).map(|u_ty| *u_ty); debug!("make_mirror_unadjusted: (type) user_ty={:?}", user_ty); if source.is_syntactic_place_expr() { - ExprKind::PlaceTypeAscription { - source: source.to_ref(), - user_ty, - } + ExprKind::PlaceTypeAscription { source: source.to_ref(), user_ty } } else { - ExprKind::ValueTypeAscription { - source: source.to_ref(), - user_ty, - } - } - } - hir::ExprKind::DropTemps(ref source) => { - ExprKind::Use { source: source.to_ref() } - } - hir::ExprKind::Box(ref value) => { - ExprKind::Box { - value: value.to_ref(), + ExprKind::ValueTypeAscription { source: source.to_ref(), user_ty } } } + hir::ExprKind::DropTemps(ref source) => ExprKind::Use { source: source.to_ref() }, + hir::ExprKind::Box(ref value) => ExprKind::Box { value: value.to_ref() }, hir::ExprKind::Array(ref fields) => ExprKind::Array { fields: fields.to_ref() }, hir::ExprKind::Tup(ref fields) => ExprKind::Tuple { fields: fields.to_ref() }, @@ -735,16 +577,11 @@ fn make_mirror_unadjusted<'a, 'tcx>( hir::ExprKind::Err => unreachable!(), }; - Expr { - temp_lifetime, - ty: expr_ty, - span: expr.span, - kind, - } + Expr { temp_lifetime, ty: expr_ty, span: expr.span, kind } } -fn user_substs_applied_to_res( - cx: &mut Cx<'a, 'tcx>, +fn user_substs_applied_to_res<'tcx>( + cx: &mut Cx<'_, 'tcx>, hir_id: hir::HirId, res: Res, ) -> Option> { @@ -753,26 +590,26 @@ fn user_substs_applied_to_res( // A reference to something callable -- e.g., a fn, method, or // a tuple-struct or tuple-variant. This has the type of a // `Fn` but with the user-given substitutions. - Res::Def(DefKind::Fn, _) | - Res::Def(DefKind::Method, _) | - Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) | - Res::Def(DefKind::Const, _) | - Res::Def(DefKind::AssocConst, _) => - cx.tables().user_provided_types().get(hir_id).map(|u_ty| *u_ty), + Res::Def(DefKind::Fn, _) + | Res::Def(DefKind::Method, _) + | Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) + | Res::Def(DefKind::Const, _) + | Res::Def(DefKind::AssocConst, _) => { + cx.tables().user_provided_types().get(hir_id).map(|u_ty| *u_ty) + } // A unit struct/variant which is used as a value (e.g., // `None`). This has the type of the enum/struct that defines // this variant -- but with the substitutions given by the // user. - Res::Def(DefKind::Ctor(_, CtorKind::Const), _) => - cx.user_substs_applied_to_ty_of_hir_id(hir_id), + Res::Def(DefKind::Ctor(_, CtorKind::Const), _) => { + cx.user_substs_applied_to_ty_of_hir_id(hir_id) + } // `Self` is used in expression as a tuple struct constructor or an unit struct constructor - Res::SelfCtor(_) => - cx.user_substs_applied_to_ty_of_hir_id(hir_id), + Res::SelfCtor(_) => cx.user_substs_applied_to_ty_of_hir_id(hir_id), - _ => - bug!("user_substs_applied_to_res: unexpected res {:?} at {:?}", res, hir_id) + _ => bug!("user_substs_applied_to_res: unexpected res {:?} at {:?}", res, hir_id), }; debug!("user_substs_applied_to_res: user_provided_type={:?}", user_provided_type); user_provided_type @@ -780,7 +617,7 @@ fn user_substs_applied_to_res( fn method_callee<'a, 'tcx>( cx: &mut Cx<'a, 'tcx>, - expr: &hir::Expr, + expr: &hir::Expr<'_>, span: Span, overloaded_callee: Option<(DefId, SubstsRef<'tcx>)>, ) -> Expr<'tcx> { @@ -788,10 +625,10 @@ fn method_callee<'a, 'tcx>( let (def_id, substs, user_ty) = match overloaded_callee { Some((def_id, substs)) => (def_id, substs, None), None => { - let (kind, def_id) = cx.tables().type_dependent_def(expr.hir_id) - .unwrap_or_else(|| { - span_bug!(expr.span, "no type-dependent def for method callee") - }); + let (kind, def_id) = cx + .tables() + .type_dependent_def(expr.hir_id) + .unwrap_or_else(|| span_bug!(expr.span, "no type-dependent def for method callee")); let user_ty = user_substs_applied_to_res(cx, expr.hir_id, Res::Def(kind, def_id)); debug!("method_callee: user_ty={:?}", user_ty); (def_id, cx.tables().node_substs(expr.hir_id), user_ty) @@ -802,26 +639,25 @@ fn method_callee<'a, 'tcx>( temp_lifetime, ty, span, - kind: ExprKind::Literal { - literal: ty::Const::zero_sized(cx.tcx(), ty), - user_ty, - }, + kind: ExprKind::Literal { literal: ty::Const::zero_sized(cx.tcx(), ty), user_ty }, } } -trait ToBorrowKind { fn to_borrow_kind(&self) -> BorrowKind; } +trait ToBorrowKind { + fn to_borrow_kind(&self) -> BorrowKind; +} impl ToBorrowKind for AutoBorrowMutability { fn to_borrow_kind(&self) -> BorrowKind { use rustc::ty::adjustment::AllowTwoPhase; match *self { - AutoBorrowMutability::Mutable { allow_two_phase_borrow } => - BorrowKind::Mut { allow_two_phase_borrow: match allow_two_phase_borrow { + AutoBorrowMutability::Mut { allow_two_phase_borrow } => BorrowKind::Mut { + allow_two_phase_borrow: match allow_two_phase_borrow { AllowTwoPhase::Yes => true, - AllowTwoPhase::No => false - }}, - AutoBorrowMutability::Immutable => - BorrowKind::Shared, + AllowTwoPhase::No => false, + }, + }, + AutoBorrowMutability::Not => BorrowKind::Shared, } } } @@ -829,48 +665,42 @@ impl ToBorrowKind for AutoBorrowMutability { impl ToBorrowKind for hir::Mutability { fn to_borrow_kind(&self) -> BorrowKind { match *self { - hir::Mutability::Mutable => BorrowKind::Mut { allow_two_phase_borrow: false }, - hir::Mutability::Immutable => BorrowKind::Shared, + hir::Mutability::Mut => BorrowKind::Mut { allow_two_phase_borrow: false }, + hir::Mutability::Not => BorrowKind::Shared, } } } -fn convert_arm<'tcx>(cx: &mut Cx<'_, 'tcx>, arm: &'tcx hir::Arm) -> Arm<'tcx> { +fn convert_arm<'tcx>(cx: &mut Cx<'_, 'tcx>, arm: &'tcx hir::Arm<'tcx>) -> Arm<'tcx> { Arm { pattern: cx.pattern_from_hir(&arm.pat), guard: match arm.guard { - Some(hir::Guard::If(ref e)) => Some(Guard::If(e.to_ref())), - _ => None, - }, + Some(hir::Guard::If(ref e)) => Some(Guard::If(e.to_ref())), + _ => None, + }, body: arm.body.to_ref(), lint_level: LintLevel::Explicit(arm.hir_id), - scope: region::Scope { - id: arm.hir_id.local_id, - data: region::ScopeData::Node - }, + scope: region::Scope { id: arm.hir_id.local_id, data: region::ScopeData::Node }, span: arm.span, } } fn convert_path_expr<'a, 'tcx>( cx: &mut Cx<'a, 'tcx>, - expr: &'tcx hir::Expr, + expr: &'tcx hir::Expr<'tcx>, res: Res, ) -> ExprKind<'tcx> { let substs = cx.tables().node_substs(expr.hir_id); match res { // A regular function, constructor function or a constant. - Res::Def(DefKind::Fn, _) | - Res::Def(DefKind::Method, _) | - Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) | - Res::SelfCtor(..) => { + Res::Def(DefKind::Fn, _) + | Res::Def(DefKind::Method, _) + | Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) + | Res::SelfCtor(..) => { let user_ty = user_substs_applied_to_res(cx, expr.hir_id, res); debug!("convert_path_expr: user_ty={:?}", user_ty); ExprKind::Literal { - literal: ty::Const::zero_sized( - cx.tcx, - cx.tables().node_type(expr.hir_id), - ), + literal: ty::Const::zero_sized(cx.tcx, cx.tables().node_type(expr.hir_id)), user_ty, } } @@ -885,28 +715,22 @@ fn convert_path_expr<'a, 'tcx>( let name = cx.tcx.hir().name(hir_id); let val = ty::ConstKind::Param(ty::ParamConst::new(index, name)); ExprKind::Literal { - literal: cx.tcx.mk_const( - ty::Const { - val, - ty: cx.tables().node_type(expr.hir_id), - } - ), + literal: cx.tcx.mk_const(ty::Const { val, ty: cx.tables().node_type(expr.hir_id) }), user_ty: None, } } - Res::Def(DefKind::Const, def_id) | - Res::Def(DefKind::AssocConst, def_id) => { + Res::Def(DefKind::Const, def_id) | Res::Def(DefKind::AssocConst, def_id) => { let user_ty = user_substs_applied_to_res(cx, expr.hir_id, res); debug!("convert_path_expr: (const) user_ty={:?}", user_ty); ExprKind::Literal { literal: cx.tcx.mk_const(ty::Const { - val: ty::ConstKind::Unevaluated(def_id, substs), + val: ty::ConstKind::Unevaluated(def_id, substs, None), ty: cx.tables().node_type(expr.hir_id), }), user_ty, } - }, + } Res::Def(DefKind::Ctor(_, CtorKind::Const), def_id) => { let user_provided_types = cx.tables.user_provided_types(); @@ -916,16 +740,14 @@ fn convert_path_expr<'a, 'tcx>( match ty.kind { // A unit struct/variant which is used as a value. // We return a completely different ExprKind here to account for this special case. - ty::Adt(adt_def, substs) => { - ExprKind::Adt { - adt_def, - variant_index: adt_def.variant_index_with_ctor_id(def_id), - substs, - user_ty: user_provided_type, - fields: vec![], - base: None, - } - } + ty::Adt(adt_def, substs) => ExprKind::Adt { + adt_def, + variant_index: adt_def.variant_index_with_ctor_id(def_id), + substs, + user_ty: user_provided_type, + fields: vec![], + base: None, + }, _ => bug!("unexpected ty: {:?}", ty), } } @@ -936,16 +758,19 @@ fn convert_path_expr<'a, 'tcx>( let ty = cx.tcx.static_ptr_ty(id); let ptr = cx.tcx.alloc_map.lock().create_static_alloc(id); let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); - ExprKind::Deref { arg: Expr { - ty, - temp_lifetime, - span: expr.span, - kind: ExprKind::StaticRef { - literal: ty::Const::from_scalar(cx.tcx, Scalar::Ptr(ptr.into()), ty), - def_id: id, + ExprKind::Deref { + arg: Expr { + ty, + temp_lifetime, + span: expr.span, + kind: ExprKind::StaticRef { + literal: ty::Const::from_scalar(cx.tcx, Scalar::Ptr(ptr.into()), ty), + def_id: id, + }, } - }.to_ref() } - }, + .to_ref(), + } + } Res::Local(var_hir_id) => convert_var(cx, expr, var_hir_id), @@ -953,16 +778,21 @@ fn convert_path_expr<'a, 'tcx>( } } -fn convert_var( +fn convert_var<'tcx>( cx: &mut Cx<'_, 'tcx>, - expr: &'tcx hir::Expr, + expr: &'tcx hir::Expr<'tcx>, var_hir_id: hir::HirId, ) -> ExprKind<'tcx> { - let upvar_index = cx.tables().upvar_list.get(&cx.body_owner) + let upvar_index = cx + .tables() + .upvar_list + .get(&cx.body_owner) .and_then(|upvars| upvars.get_full(&var_hir_id).map(|(i, _, _)| i)); - debug!("convert_var({:?}): upvar_index={:?}, body_owner={:?}", - var_hir_id, upvar_index, cx.body_owner); + debug!( + "convert_var({:?}): upvar_index={:?}, body_owner={:?}", + var_hir_id, upvar_index, cx.body_owner + ); let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); @@ -972,15 +802,15 @@ fn convert_var( Some(upvar_index) => { let closure_def_id = cx.body_owner; let upvar_id = ty::UpvarId { - var_path: ty::UpvarPath {hir_id: var_hir_id}, + var_path: ty::UpvarPath { hir_id: var_hir_id }, closure_expr_id: LocalDefId::from_def_id(closure_def_id), }; let var_ty = cx.tables().node_type(var_hir_id); // FIXME free regions in closures are not right - let closure_ty = cx.tables().node_type( - cx.tcx.hir().local_def_id_to_hir_id(upvar_id.closure_expr_id), - ); + let closure_ty = cx + .tables() + .node_type(cx.tcx.hir().local_def_id_to_hir_id(upvar_id.closure_expr_id)); // FIXME we're just hard-coding the idea that the // signature will be &self or &mut self and hence will @@ -994,11 +824,10 @@ fn convert_var( let self_expr = if let ty::Closure(_, closure_substs) = closure_ty.kind { match cx.infcx.closure_kind(closure_def_id, closure_substs).unwrap() { ty::ClosureKind::Fn => { - let ref_closure_ty = cx.tcx.mk_ref(region, - ty::TypeAndMut { - ty: closure_ty, - mutbl: hir::Mutability::Immutable, - }); + let ref_closure_ty = cx.tcx.mk_ref( + region, + ty::TypeAndMut { ty: closure_ty, mutbl: hir::Mutability::Not }, + ); Expr { ty: closure_ty, temp_lifetime, @@ -1015,11 +844,10 @@ fn convert_var( } } ty::ClosureKind::FnMut => { - let ref_closure_ty = cx.tcx.mk_ref(region, - ty::TypeAndMut { - ty: closure_ty, - mutbl: hir::Mutability::Mutable, - }); + let ref_closure_ty = cx.tcx.mk_ref( + region, + ty::TypeAndMut { ty: closure_ty, mutbl: hir::Mutability::Mut }, + ); Expr { ty: closure_ty, temp_lifetime, @@ -1030,119 +858,47 @@ fn convert_var( temp_lifetime, span: expr.span, kind: ExprKind::SelfRef, - }.to_ref(), + } + .to_ref(), }, } } - ty::ClosureKind::FnOnce => { - Expr { - ty: closure_ty, - temp_lifetime, - span: expr.span, - kind: ExprKind::SelfRef, - } - } + ty::ClosureKind::FnOnce => Expr { + ty: closure_ty, + temp_lifetime, + span: expr.span, + kind: ExprKind::SelfRef, + }, } } else { - Expr { - ty: closure_ty, - temp_lifetime, - span: expr.span, - kind: ExprKind::SelfRef, - } + Expr { ty: closure_ty, temp_lifetime, span: expr.span, kind: ExprKind::SelfRef } }; // at this point we have `self.n`, which loads up the upvar - let field_kind = ExprKind::Field { - lhs: self_expr.to_ref(), - name: Field::new(upvar_index), - }; + let field_kind = + ExprKind::Field { lhs: self_expr.to_ref(), name: Field::new(upvar_index) }; // ...but the upvar might be an `&T` or `&mut T` capture, at which // point we need an implicit deref match cx.tables().upvar_capture(upvar_id) { ty::UpvarCapture::ByValue => field_kind, - ty::UpvarCapture::ByRef(borrow) => { - ExprKind::Deref { - arg: Expr { - temp_lifetime, - ty: cx.tcx.mk_ref(borrow.region, - ty::TypeAndMut { - ty: var_ty, - mutbl: borrow.kind.to_mutbl_lossy(), - }), - span: expr.span, - kind: field_kind, - }.to_ref(), + ty::UpvarCapture::ByRef(borrow) => ExprKind::Deref { + arg: Expr { + temp_lifetime, + ty: cx.tcx.mk_ref( + borrow.region, + ty::TypeAndMut { ty: var_ty, mutbl: borrow.kind.to_mutbl_lossy() }, + ), + span: expr.span, + kind: field_kind, } - } + .to_ref(), + }, } } } } - -/// Fake `&raw [mut|const] expr` using a borrow and a cast until `AddressOf` -/// exists in MIR. -fn raw_ref_shim<'tcx>( - cx: &mut Cx<'_, 'tcx>, - arg: ExprRef<'tcx>, - ty: Ty<'tcx>, - mutbl: hir::Mutability, - span: Span, - temp_lifetime: Option, -) -> ExprKind<'tcx> { - let arg_tm = if let ty::RawPtr(type_mutbl) = ty.kind { - type_mutbl - } else { - bug!("raw_ref_shim called with non-raw pointer type"); - }; - // Convert this to a suitable `&foo` and - // then an unsafe coercion. - let borrow_expr = Expr { - temp_lifetime, - ty: cx.tcx.mk_ref(cx.tcx.lifetimes.re_erased, arg_tm), - span, - kind: ExprKind::Borrow { - borrow_kind: mutbl.to_borrow_kind(), - arg, - }, - }; - let cast_expr = Expr { - temp_lifetime, - ty, - span, - kind: ExprKind::Cast { source: borrow_expr.to_ref() } - }; - - // To ensure that both implicit and explicit coercions are - // handled the same way, we insert an extra layer of indirection here. - // For explicit casts (e.g., 'foo as *const T'), the source of the 'Use' - // will be an ExprKind::Hair with the appropriate cast expression. Here, - // we make our Use source the generated Cast from the original coercion. - // - // In both cases, this outer 'Use' ensures that the inner 'Cast' is handled by - // as_operand, not by as_rvalue - causing the cast result to be stored in a temporary. - // Ordinary, this is identical to using the cast directly as an rvalue. However, if the - // source of the cast was previously borrowed as mutable, storing the cast in a - // temporary gives the source a chance to expire before the cast is used. For - // structs with a self-referential *mut ptr, this allows assignment to work as - // expected. - // - // For example, consider the type 'struct Foo { field: *mut Foo }', - // The method 'fn bar(&mut self) { self.field = self }' - // triggers a coercion from '&mut self' to '*mut self'. In order - // for the assignment to be valid, the implicit borrow - // of 'self' involved in the coercion needs to end before the local - // containing the '*mut T' is assigned to 'self.field' - otherwise, - // we end up trying to assign to 'self.field' while we have another mutable borrow - // active. - // - // We only need to worry about this kind of thing for coercions from refs to ptrs, - // since they get rid of a borrow implicitly. - ExprKind::Use { source: cast_expr.to_ref() } -} - fn bin_op(op: hir::BinOpKind) -> BinOp { match op { hir::BinOpKind::Add => BinOp::Add, @@ -1167,21 +923,16 @@ fn bin_op(op: hir::BinOpKind) -> BinOp { fn overloaded_operator<'a, 'tcx>( cx: &mut Cx<'a, 'tcx>, - expr: &'tcx hir::Expr, - args: Vec> + expr: &'tcx hir::Expr<'tcx>, + args: Vec>, ) -> ExprKind<'tcx> { let fun = method_callee(cx, expr, expr.span, None); - ExprKind::Call { - ty: fun.ty, - fun: fun.to_ref(), - args, - from_hir_call: false, - } + ExprKind::Call { ty: fun.ty, fun: fun.to_ref(), args, from_hir_call: false } } fn overloaded_place<'a, 'tcx>( cx: &mut Cx<'a, 'tcx>, - expr: &'tcx hir::Expr, + expr: &'tcx hir::Expr<'tcx>, place_ty: Ty<'tcx>, overloaded_callee: Option<(DefId, SubstsRef<'tcx>)>, args: Vec>, @@ -1192,7 +943,7 @@ fn overloaded_place<'a, 'tcx>( let recv_ty = match args[0] { ExprRef::Hair(e) => cx.tables().expr_ty_adjusted(e), - ExprRef::Mirror(ref e) => e.ty + ExprRef::Mirror(ref e) => e.ty, }; // Reconstruct the output assuming it's a reference with the @@ -1202,10 +953,7 @@ fn overloaded_place<'a, 'tcx>( ty::Ref(region, _, mutbl) => (region, mutbl), _ => span_bug!(expr.span, "overloaded_place: receiver is not a reference"), }; - let ref_ty = cx.tcx.mk_ref(region, ty::TypeAndMut { - ty: place_ty, - mutbl, - }); + let ref_ty = cx.tcx.mk_ref(region, ty::TypeAndMut { ty: place_ty, mutbl }); // construct the complete expression `foo()` for the overloaded call, // which will yield the &T type @@ -1215,12 +963,7 @@ fn overloaded_place<'a, 'tcx>( temp_lifetime, ty: ref_ty, span: expr.span, - kind: ExprKind::Call { - ty: fun.ty, - fun: fun.to_ref(), - args, - from_hir_call: false, - }, + kind: ExprKind::Call { ty: fun.ty, fun: fun.to_ref(), args, from_hir_call: false }, }; // construct and return a deref wrapper `*foo()` @@ -1229,9 +972,9 @@ fn overloaded_place<'a, 'tcx>( fn capture_upvar<'tcx>( cx: &mut Cx<'_, 'tcx>, - closure_expr: &'tcx hir::Expr, + closure_expr: &'tcx hir::Expr<'tcx>, var_hir_id: hir::HirId, - upvar_ty: Ty<'tcx> + upvar_ty: Ty<'tcx>, ) -> ExprRef<'tcx> { let upvar_id = ty::UpvarId { var_path: ty::UpvarPath { hir_id: var_hir_id }, @@ -1252,17 +995,15 @@ fn capture_upvar<'tcx>( let borrow_kind = match upvar_borrow.kind { ty::BorrowKind::ImmBorrow => BorrowKind::Shared, ty::BorrowKind::UniqueImmBorrow => BorrowKind::Unique, - ty::BorrowKind::MutBorrow => BorrowKind::Mut { allow_two_phase_borrow: false } + ty::BorrowKind::MutBorrow => BorrowKind::Mut { allow_two_phase_borrow: false }, }; Expr { temp_lifetime, ty: upvar_ty, span: closure_expr.span, - kind: ExprKind::Borrow { - borrow_kind, - arg: captured_var.to_ref(), - }, - }.to_ref() + kind: ExprKind::Borrow { borrow_kind, arg: captured_var.to_ref() }, + } + .to_ref() } } } @@ -1270,14 +1011,13 @@ fn capture_upvar<'tcx>( /// Converts a list of named fields (i.e., for struct-like struct/enum ADTs) into FieldExprRef. fn field_refs<'a, 'tcx>( cx: &mut Cx<'a, 'tcx>, - fields: &'tcx [hir::Field] + fields: &'tcx [hir::Field<'tcx>], ) -> Vec> { - fields.iter() - .map(|field| { - FieldExprRef { - name: Field::new(cx.tcx.field_index(field.hir_id, cx.tables)), - expr: field.expr.to_ref(), - } + fields + .iter() + .map(|field| FieldExprRef { + name: Field::new(cx.tcx.field_index(field.hir_id, cx.tables)), + expr: field.expr.to_ref(), }) .collect() } diff --git a/src/librustc_mir/hair/cx/mod.rs b/src/librustc_mir_build/hair/cx/mod.rs similarity index 65% rename from src/librustc_mir/hair/cx/mod.rs rename to src/librustc_mir_build/hair/cx/mod.rs index e120b496d3..5503d1a86e 100644 --- a/src/librustc_mir/hair/cx/mod.rs +++ b/src/librustc_mir_build/hair/cx/mod.rs @@ -2,37 +2,37 @@ //! structures into the HAIR. The `builder` is generally ignorant of the tcx, //! etc., and instead goes through the `Cx` for most of its work. -use crate::hair::*; use crate::hair::util::UserAnnotatedTyHelpers; +use crate::hair::*; -use rustc_index::vec::Idx; -use rustc::hir::def_id::DefId; -use rustc::hir::Node; -use rustc::middle::region; use rustc::infer::InferCtxt; +use rustc::middle::region; +use rustc::mir::interpret::{LitToConstError, LitToConstInput}; +use rustc::ty::layout::VariantIdx; use rustc::ty::subst::Subst; -use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::subst::{GenericArg, InternalSubsts}; -use rustc::ty::layout::VariantIdx; +use rustc::ty::{self, Ty, TyCtxt}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_hir::Node; +use rustc_index::vec::Idx; +use rustc_span::symbol::{sym, Symbol}; use syntax::ast; use syntax::attr; -use syntax::symbol::{Symbol, sym}; -use rustc::hir; -use crate::hair::constant::{lit_to_const, LitToConstError}; #[derive(Clone)] -pub struct Cx<'a, 'tcx> { +crate struct Cx<'a, 'tcx> { tcx: TyCtxt<'tcx>, infcx: &'a InferCtxt<'a, 'tcx>, - pub root_lint_level: hir::HirId, - pub param_env: ty::ParamEnv<'tcx>, + crate root_lint_level: hir::HirId, + crate param_env: ty::ParamEnv<'tcx>, /// Identity `InternalSubsts` for use with const-evaluation. - pub identity_substs: &'tcx InternalSubsts<'tcx>, + crate identity_substs: &'tcx InternalSubsts<'tcx>, - pub region_scope_tree: &'tcx region::ScopeTree, - pub tables: &'a ty::TypeckTables<'tcx>, + crate region_scope_tree: &'tcx region::ScopeTree, + crate tables: &'a ty::TypeckTables<'tcx>, /// This is `Constness::Const` if we are compiling a `static`, /// `const`, or the body of a `const fn`. @@ -42,7 +42,7 @@ pub struct Cx<'a, 'tcx> { body_owner: DefId, /// What kind of body is being compiled. - pub body_owner_kind: hir::BodyOwnerKind, + crate body_owner_kind: hir::BodyOwnerKind, /// Whether this constant/function needs overflow checks. check_overflow: bool, @@ -52,17 +52,15 @@ pub struct Cx<'a, 'tcx> { } impl<'a, 'tcx> Cx<'a, 'tcx> { - pub fn new(infcx: &'a InferCtxt<'a, 'tcx>, src_id: hir::HirId) -> Cx<'a, 'tcx> { + crate fn new(infcx: &'a InferCtxt<'a, 'tcx>, src_id: hir::HirId) -> Cx<'a, 'tcx> { let tcx = infcx.tcx; let src_def_id = tcx.hir().local_def_id(src_id); let tables = tcx.typeck_tables_of(src_def_id); let body_owner_kind = tcx.hir().body_owner_kind(src_id); let constness = match body_owner_kind { - hir::BodyOwnerKind::Const | - hir::BodyOwnerKind::Static(_) => hir::Constness::Const, - hir::BodyOwnerKind::Closure | - hir::BodyOwnerKind::Fn => hir::Constness::NotConst, + hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) => hir::Constness::Const, + hir::BodyOwnerKind::Closure | hir::BodyOwnerKind::Fn => hir::Constness::NotConst, }; let attrs = tcx.hir().attrs(src_id); @@ -94,42 +92,42 @@ impl<'a, 'tcx> Cx<'a, 'tcx> { } } - pub fn control_flow_destroyed(self) -> Vec<(Span, String)> { + crate fn control_flow_destroyed(self) -> Vec<(Span, String)> { self.control_flow_destroyed } } impl<'a, 'tcx> Cx<'a, 'tcx> { /// Normalizes `ast` into the appropriate "mirror" type. - pub fn mirror>(&mut self, ast: M) -> M::Output { + crate fn mirror>(&mut self, ast: M) -> M::Output { ast.make_mirror(self) } - pub fn usize_ty(&mut self) -> Ty<'tcx> { + crate fn usize_ty(&mut self) -> Ty<'tcx> { self.tcx.types.usize } - pub fn usize_literal(&mut self, value: u64) -> &'tcx ty::Const<'tcx> { + crate fn usize_literal(&mut self, value: u64) -> &'tcx ty::Const<'tcx> { ty::Const::from_usize(self.tcx, value) } - pub fn bool_ty(&mut self) -> Ty<'tcx> { + crate fn bool_ty(&mut self) -> Ty<'tcx> { self.tcx.types.bool } - pub fn unit_ty(&mut self) -> Ty<'tcx> { + crate fn unit_ty(&mut self) -> Ty<'tcx> { self.tcx.mk_unit() } - pub fn true_literal(&mut self) -> &'tcx ty::Const<'tcx> { + crate fn true_literal(&mut self) -> &'tcx ty::Const<'tcx> { ty::Const::from_bool(self.tcx, true) } - pub fn false_literal(&mut self) -> &'tcx ty::Const<'tcx> { + crate fn false_literal(&mut self) -> &'tcx ty::Const<'tcx> { ty::Const::from_bool(self.tcx, false) } - pub fn const_eval_literal( + crate fn const_eval_literal( &mut self, lit: &'tcx ast::LitKind, ty: Ty<'tcx>, @@ -138,37 +136,41 @@ impl<'a, 'tcx> Cx<'a, 'tcx> { ) -> &'tcx ty::Const<'tcx> { trace!("const_eval_literal: {:#?}, {:?}, {:?}, {:?}", lit, ty, sp, neg); - match lit_to_const(lit, self.tcx, ty, neg) { + match self.tcx.at(sp).lit_to_const(LitToConstInput { lit, ty, neg }) { Ok(c) => c, Err(LitToConstError::UnparseableFloat) => { // FIXME(#31407) this is only necessary because float parsing is buggy self.tcx.sess.span_err(sp, "could not evaluate float literal (see issue #31407)"); // create a dummy value and continue compiling Const::from_bits(self.tcx, 0, self.param_env.and(ty)) - }, + } Err(LitToConstError::Reported) => { // create a dummy value and continue compiling Const::from_bits(self.tcx, 0, self.param_env.and(ty)) } + Err(LitToConstError::TypeError) => bug!("const_eval_literal: had type error"), } } - pub fn pattern_from_hir(&mut self, p: &hir::Pat) -> Pat<'tcx> { + crate fn pattern_from_hir(&mut self, p: &hir::Pat<'_>) -> Pat<'tcx> { let p = match self.tcx.hir().get(p.hir_id) { Node::Pat(p) | Node::Binding(p) => p, - node => bug!("pattern became {:?}", node) + node => bug!("pattern became {:?}", node), }; - Pat::from_hir(self.tcx, self.param_env.and(self.identity_substs), self.tables(), p) + Pat::from_hir(self.tcx, self.param_env, self.tables(), p) } - pub fn trait_method(&mut self, - trait_def_id: DefId, - method_name: Symbol, - self_ty: Ty<'tcx>, - params: &[GenericArg<'tcx>]) - -> &'tcx ty::Const<'tcx> { + crate fn trait_method( + &mut self, + trait_def_id: DefId, + method_name: Symbol, + self_ty: Ty<'tcx>, + params: &[GenericArg<'tcx>], + ) -> &'tcx ty::Const<'tcx> { let substs = self.tcx.mk_substs_trait(self_ty, params); for item in self.tcx.associated_items(trait_def_id) { + // The unhygienic comparison here is acceptable because this is only + // used on known traits. if item.kind == ty::AssocKind::Method && item.ident.name == method_name { let method_ty = self.tcx.type_of(item.def_id); let method_ty = method_ty.subst(self.tcx, substs); @@ -179,34 +181,32 @@ impl<'a, 'tcx> Cx<'a, 'tcx> { bug!("found no method `{}` in `{:?}`", method_name, trait_def_id); } - pub fn all_fields(&mut self, adt_def: &ty::AdtDef, variant_index: VariantIdx) -> Vec { - (0..adt_def.variants[variant_index].fields.len()) - .map(Field::new) - .collect() + crate fn all_fields(&mut self, adt_def: &ty::AdtDef, variant_index: VariantIdx) -> Vec { + (0..adt_def.variants[variant_index].fields.len()).map(Field::new).collect() } - pub fn needs_drop(&mut self, ty: Ty<'tcx>) -> bool { + crate fn needs_drop(&mut self, ty: Ty<'tcx>) -> bool { ty.needs_drop(self.tcx, self.param_env) } - pub fn tcx(&self) -> TyCtxt<'tcx> { + crate fn tcx(&self) -> TyCtxt<'tcx> { self.tcx } - pub fn tables(&self) -> &'a ty::TypeckTables<'tcx> { + crate fn tables(&self) -> &'a ty::TypeckTables<'tcx> { self.tables } - pub fn check_overflow(&self) -> bool { + crate fn check_overflow(&self) -> bool { self.check_overflow } - pub fn type_is_copy_modulo_regions(&self, ty: Ty<'tcx>, span: Span) -> bool { + crate fn type_is_copy_modulo_regions(&self, ty: Ty<'tcx>, span: Span) -> bool { self.infcx.type_is_copy_modulo_regions(self.param_env, ty, span) } } -impl UserAnnotatedTyHelpers<'tcx> for Cx<'_, 'tcx> { +impl<'tcx> UserAnnotatedTyHelpers<'tcx> for Cx<'_, 'tcx> { fn tcx(&self) -> TyCtxt<'tcx> { self.tcx() } diff --git a/src/librustc_mir/hair/cx/to_ref.rs b/src/librustc_mir_build/hair/cx/to_ref.rs similarity index 85% rename from src/librustc_mir/hair/cx/to_ref.rs rename to src/librustc_mir_build/hair/cx/to_ref.rs index c365cc2ad8..6cf8122e20 100644 --- a/src/librustc_mir/hair/cx/to_ref.rs +++ b/src/librustc_mir_build/hair/cx/to_ref.rs @@ -1,14 +1,13 @@ use crate::hair::*; -use rustc::hir; -use rustc::hir::ptr::P; +use rustc_hir as hir; -pub trait ToRef { +crate trait ToRef { type Output; fn to_ref(self) -> Self::Output; } -impl<'tcx> ToRef for &'tcx hir::Expr { +impl<'tcx> ToRef for &'tcx hir::Expr<'tcx> { type Output = ExprRef<'tcx>; fn to_ref(self) -> ExprRef<'tcx> { @@ -16,7 +15,7 @@ impl<'tcx> ToRef for &'tcx hir::Expr { } } -impl<'tcx> ToRef for &'tcx P { +impl<'tcx> ToRef for &'tcx &'tcx hir::Expr<'tcx> { type Output = ExprRef<'tcx>; fn to_ref(self) -> ExprRef<'tcx> { @@ -54,7 +53,7 @@ where } } -impl<'tcx, T, U> ToRef for &'tcx P<[T]> +impl<'tcx, T, U> ToRef for &'tcx [T] where &'tcx T: ToRef, { diff --git a/src/librustc_mir/hair/mod.rs b/src/librustc_mir_build/hair/mod.rs similarity index 80% rename from src/librustc_mir/hair/mod.rs rename to src/librustc_mir_build/hair/mod.rs index 47644d9ba8..0f2c76152e 100644 --- a/src/librustc_mir/hair/mod.rs +++ b/src/librustc_mir_build/hair/mod.rs @@ -4,65 +4,65 @@ //! unit-tested and separated from the Rust source and compiler data //! structures. -use rustc::mir::{BinOp, BorrowKind, Field, UnOp}; -use rustc::hir::def_id::DefId; +use self::cx::Cx; use rustc::infer::canonical::Canonical; use rustc::middle::region; -use rustc::ty::subst::SubstsRef; -use rustc::ty::{AdtDef, UpvarSubsts, Ty, Const, UserType}; -use rustc::ty::adjustment::{PointerCast}; +use rustc::mir::{BinOp, BorrowKind, Field, UnOp}; +use rustc::ty::adjustment::PointerCast; use rustc::ty::layout::VariantIdx; -use rustc::hir; -use syntax_pos::Span; -use self::cx::Cx; +use rustc::ty::subst::SubstsRef; +use rustc::ty::{AdtDef, Const, Ty, UpvarSubsts, UserType}; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_span::Span; -pub mod cx; -mod constant; +crate mod constant; +crate mod cx; -pub mod pattern; -pub use self::pattern::{BindingMode, Pat, PatKind, PatRange, FieldPat}; -pub(crate) use self::pattern::PatTyProj; +crate mod pattern; +crate use self::pattern::PatTyProj; +crate use self::pattern::{BindingMode, FieldPat, Pat, PatKind, PatRange}; mod util; #[derive(Copy, Clone, Debug)] -pub enum LintLevel { +crate enum LintLevel { Inherited, - Explicit(hir::HirId) + Explicit(hir::HirId), } #[derive(Clone, Debug)] -pub struct Block<'tcx> { - pub targeted_by_break: bool, - pub region_scope: region::Scope, - pub opt_destruction_scope: Option, - pub span: Span, - pub stmts: Vec>, - pub expr: Option>, - pub safety_mode: BlockSafety, +crate struct Block<'tcx> { + crate targeted_by_break: bool, + crate region_scope: region::Scope, + crate opt_destruction_scope: Option, + crate span: Span, + crate stmts: Vec>, + crate expr: Option>, + crate safety_mode: BlockSafety, } #[derive(Copy, Clone, Debug)] -pub enum BlockSafety { +crate enum BlockSafety { Safe, ExplicitUnsafe(hir::HirId), PushUnsafe, - PopUnsafe + PopUnsafe, } #[derive(Clone, Debug)] -pub enum StmtRef<'tcx> { +crate enum StmtRef<'tcx> { Mirror(Box>), } #[derive(Clone, Debug)] -pub struct Stmt<'tcx> { - pub kind: StmtKind<'tcx>, - pub opt_destruction_scope: Option, +crate struct Stmt<'tcx> { + crate kind: StmtKind<'tcx>, + crate opt_destruction_scope: Option, } #[derive(Clone, Debug)] -pub enum StmtKind<'tcx> { +crate enum StmtKind<'tcx> { Expr { /// scope for this statement; may be used as lifetime of temporaries scope: region::Scope, @@ -112,23 +112,23 @@ rustc_data_structures::static_assert_size!(Expr<'_>, 168); /// example, method calls and overloaded operators are absent: they are /// expected to be converted into `Expr::Call` instances. #[derive(Clone, Debug)] -pub struct Expr<'tcx> { +crate struct Expr<'tcx> { /// type of this expression - pub ty: Ty<'tcx>, + crate ty: Ty<'tcx>, /// lifetime of this expression if it should be spilled into a /// temporary; should be None only if in a constant context - pub temp_lifetime: Option, + crate temp_lifetime: Option, /// span of the expression in the source - pub span: Span, + crate span: Span, /// kind of expression - pub kind: ExprKind<'tcx>, + crate kind: ExprKind<'tcx>, } #[derive(Clone, Debug)] -pub enum ExprKind<'tcx> { +crate enum ExprKind<'tcx> { Scope { region_scope: region::Scope, lint_level: LintLevel, @@ -158,7 +158,7 @@ pub enum ExprKind<'tcx> { lhs: ExprRef<'tcx>, rhs: ExprRef<'tcx>, }, // NOT overloaded! - // LogicalOp is distinct from BinaryOp because of lazy evaluation of the operands. + // LogicalOp is distinct from BinaryOp because of lazy evaluation of the operands. Unary { op: UnOp, arg: ExprRef<'tcx>, @@ -184,7 +184,7 @@ pub enum ExprKind<'tcx> { arms: Vec>, }, Block { - body: &'tcx hir::Block, + body: &'tcx hir::Block<'tcx>, }, Assign { lhs: ExprRef<'tcx>, @@ -212,6 +212,11 @@ pub enum ExprKind<'tcx> { borrow_kind: BorrowKind, arg: ExprRef<'tcx>, }, + /// A `&raw [const|mut] $place_expr` raw borrow resulting in type `*[const|mut] T`. + AddressOf { + mutability: hir::Mutability, + arg: ExprRef<'tcx>, + }, Break { label: region::Scope, value: Option>, @@ -242,7 +247,7 @@ pub enum ExprKind<'tcx> { user_ty: Option>>, fields: Vec>, - base: Option> + base: Option>, }, PlaceTypeAscription { source: ExprRef<'tcx>, @@ -275,7 +280,7 @@ pub enum ExprKind<'tcx> { InlineAsm { asm: &'tcx hir::InlineAsmInner, outputs: Vec>, - inputs: Vec> + inputs: Vec>, }, Yield { value: ExprRef<'tcx>, @@ -283,37 +288,37 @@ pub enum ExprKind<'tcx> { } #[derive(Clone, Debug)] -pub enum ExprRef<'tcx> { - Hair(&'tcx hir::Expr), +crate enum ExprRef<'tcx> { + Hair(&'tcx hir::Expr<'tcx>), Mirror(Box>), } #[derive(Clone, Debug)] -pub struct FieldExprRef<'tcx> { - pub name: Field, - pub expr: ExprRef<'tcx>, +crate struct FieldExprRef<'tcx> { + crate name: Field, + crate expr: ExprRef<'tcx>, } #[derive(Clone, Debug)] -pub struct FruInfo<'tcx> { - pub base: ExprRef<'tcx>, - pub field_types: Vec> +crate struct FruInfo<'tcx> { + crate base: ExprRef<'tcx>, + crate field_types: Vec>, } #[derive(Clone, Debug)] -pub struct Arm<'tcx> { - pub pattern: Pat<'tcx>, - pub guard: Option>, - pub body: ExprRef<'tcx>, - pub lint_level: LintLevel, - pub scope: region::Scope, - pub span: Span, +crate struct Arm<'tcx> { + crate pattern: Pat<'tcx>, + crate guard: Option>, + crate body: ExprRef<'tcx>, + crate lint_level: LintLevel, + crate scope: region::Scope, + crate span: Span, } -impl Arm<'tcx> { +impl<'tcx> Arm<'tcx> { // HACK(or_patterns; Centril | dlrobertson): Remove this and // correctly handle each case in which this method is used. - pub fn top_pats_hack(&self) -> &[Pat<'tcx>] { + crate fn top_pats_hack(&self) -> &[Pat<'tcx>] { match &*self.pattern.kind { PatKind::Or { pats } => pats, _ => std::slice::from_ref(&self.pattern), @@ -322,18 +327,18 @@ impl Arm<'tcx> { } #[derive(Clone, Debug)] -pub enum Guard<'tcx> { +crate enum Guard<'tcx> { If(ExprRef<'tcx>), } #[derive(Copy, Clone, Debug)] -pub enum LogicalOp { +crate enum LogicalOp { And, Or, } impl<'tcx> ExprRef<'tcx> { - pub fn span(&self) -> Span { + crate fn span(&self) -> Span { match self { ExprRef::Hair(expr) => expr.span, ExprRef::Mirror(expr) => expr.span, @@ -356,7 +361,7 @@ impl<'tcx> ExprRef<'tcx> { /// mirrored. This allows a single AST node from the compiler to /// expand into one or more Hair nodes, which lets the Hair nodes be /// simpler. -pub trait Mirror<'tcx> { +crate trait Mirror<'tcx> { type Output; fn make_mirror(self, cx: &mut Cx<'_, 'tcx>) -> Self::Output; @@ -373,7 +378,7 @@ impl<'tcx> Mirror<'tcx> for Expr<'tcx> { impl<'tcx> Mirror<'tcx> for ExprRef<'tcx> { type Output = Expr<'tcx>; - fn make_mirror(self, hir: &mut Cx<'a, 'tcx>) -> Expr<'tcx> { + fn make_mirror(self, hir: &mut Cx<'_, 'tcx>) -> Expr<'tcx> { match self { ExprRef::Hair(h) => h.make_mirror(hir), ExprRef::Mirror(m) => *m, diff --git a/src/librustc_mir/hair/pattern/_match.rs b/src/librustc_mir_build/hair/pattern/_match.rs similarity index 96% rename from src/librustc_mir/hair/pattern/_match.rs rename to src/librustc_mir_build/hair/pattern/_match.rs index c372032850..08ed6b521b 100644 --- a/src/librustc_mir/hair/pattern/_match.rs +++ b/src/librustc_mir_build/hair/pattern/_match.rs @@ -229,29 +229,29 @@ use self::SliceKind::*; use self::Usefulness::*; use self::WitnessPreference::*; -use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::captures::Captures; use rustc_index::vec::Idx; use super::{compare_const_vals, PatternFoldable, PatternFolder}; use super::{FieldPat, Pat, PatKind, PatRange}; -use rustc::hir::def_id::DefId; -use rustc::hir::{HirId, RangeEnd}; use rustc::ty::layout::{Integer, IntegerExt, Size, VariantIdx}; use rustc::ty::{self, Const, Ty, TyCtxt, TypeFoldable, VariantDef}; +use rustc_hir::def_id::DefId; +use rustc_hir::{HirId, RangeEnd}; use rustc::lint; use rustc::mir::interpret::{truncate, AllocId, ConstValue, Pointer, Scalar}; use rustc::mir::Field; -use rustc::util::captures::Captures; use rustc::util::common::ErrorReported; +use rustc_span::{Span, DUMMY_SP}; use syntax::attr::{SignedInt, UnsignedInt}; -use syntax_pos::{Span, DUMMY_SP}; use arena::TypedArena; use smallvec::{smallvec, SmallVec}; +use std::borrow::Cow; use std::cmp::{self, max, min, Ordering}; use std::convert::TryInto; use std::fmt; @@ -259,15 +259,16 @@ use std::iter::{FromIterator, IntoIterator}; use std::ops::RangeInclusive; use std::u128; -pub fn expand_pattern<'a, 'tcx>(cx: &MatchCheckCtxt<'a, 'tcx>, pat: Pat<'tcx>) -> Pat<'tcx> { - LiteralExpander { tcx: cx.tcx }.fold_pattern(&pat) +crate fn expand_pattern<'a, 'tcx>(cx: &MatchCheckCtxt<'a, 'tcx>, pat: Pat<'tcx>) -> Pat<'tcx> { + LiteralExpander { tcx: cx.tcx, param_env: cx.param_env }.fold_pattern(&pat) } struct LiteralExpander<'tcx> { tcx: TyCtxt<'tcx>, + param_env: ty::ParamEnv<'tcx>, } -impl LiteralExpander<'tcx> { +impl<'tcx> LiteralExpander<'tcx> { /// Derefs `val` and potentially unsizes the value if `crty` is an array and `rty` a slice. /// /// `crty` and `rty` can differ because you can use array constants in the presence of slice @@ -284,9 +285,23 @@ impl LiteralExpander<'tcx> { debug!("fold_const_value_deref {:?} {:?} {:?}", val, rty, crty); match (val, &crty.kind, &rty.kind) { // the easy case, deref a reference - (ConstValue::Scalar(Scalar::Ptr(p)), x, y) if x == y => { - let alloc = self.tcx.alloc_map.lock().unwrap_memory(p.alloc_id); - ConstValue::ByRef { alloc, offset: p.offset } + (ConstValue::Scalar(p), x, y) if x == y => { + match p { + Scalar::Ptr(p) => { + let alloc = self.tcx.alloc_map.lock().unwrap_memory(p.alloc_id); + ConstValue::ByRef { alloc, offset: p.offset } + } + Scalar::Raw { .. } => { + let layout = self.tcx.layout_of(self.param_env.and(rty)).unwrap(); + if layout.is_zst() { + // Deref of a reference to a ZST is a nop. + ConstValue::Scalar(Scalar::zst()) + } else { + // FIXME(oli-obk): this is reachable for `const FOO: &&&u32 = &&&42;` + bug!("cannot deref {:#?}, {} -> {}", val, crty, rty); + } + } + } } // unsize array to slice if pattern is array but match value or other patterns are slice (ConstValue::Scalar(Scalar::Ptr(p)), ty::Array(t, n), ty::Slice(u)) => { @@ -307,7 +322,7 @@ impl LiteralExpander<'tcx> { } } -impl PatternFolder<'tcx> for LiteralExpander<'tcx> { +impl<'tcx> PatternFolder<'tcx> for LiteralExpander<'tcx> { fn fold_pattern(&mut self, pat: &Pat<'tcx>) -> Pat<'tcx> { debug!("fold_pattern {:?} {:?} {:?}", pat, pat.ty.kind, pat.kind); match (&pat.ty.kind, &*pat.kind) { @@ -365,10 +380,10 @@ impl<'tcx> Pat<'tcx> { /// A row of a matrix. Rows of len 1 are very common, which is why `SmallVec[_; 2]` /// works well. #[derive(Debug, Clone)] -pub struct PatStack<'p, 'tcx>(SmallVec<[&'p Pat<'tcx>; 2]>); +crate struct PatStack<'p, 'tcx>(SmallVec<[&'p Pat<'tcx>; 2]>); impl<'p, 'tcx> PatStack<'p, 'tcx> { - pub fn from_pattern(pat: &'p Pat<'tcx>) -> Self { + crate fn from_pattern(pat: &'p Pat<'tcx>) -> Self { PatStack(smallvec![pat]) } @@ -456,15 +471,15 @@ impl<'p, 'tcx> FromIterator<&'p Pat<'tcx>> for PatStack<'p, 'tcx> { /// A 2D matrix. #[derive(Clone)] -pub struct Matrix<'p, 'tcx>(Vec>); +crate struct Matrix<'p, 'tcx>(Vec>); impl<'p, 'tcx> Matrix<'p, 'tcx> { - pub fn empty() -> Self { + crate fn empty() -> Self { Matrix(vec![]) } /// Pushes a new row to the matrix. If the row starts with an or-pattern, this expands it. - pub fn push(&mut self, row: PatStack<'p, 'tcx>) { + crate fn push(&mut self, row: PatStack<'p, 'tcx>) { if let Some(rows) = row.expand_or_pat() { self.0.extend(rows); } else { @@ -553,39 +568,29 @@ impl<'p, 'tcx> FromIterator> for Matrix<'p, 'tcx> { } } -pub struct MatchCheckCtxt<'a, 'tcx> { - pub tcx: TyCtxt<'tcx>, +crate struct MatchCheckCtxt<'a, 'tcx> { + crate tcx: TyCtxt<'tcx>, /// The module in which the match occurs. This is necessary for /// checking inhabited-ness of types because whether a type is (visibly) /// inhabited can depend on whether it was defined in the current module or /// not. E.g., `struct Foo { _private: ! }` cannot be seen to be empty /// outside it's module and should not be matchable with an empty match /// statement. - pub module: DefId, + crate module: DefId, param_env: ty::ParamEnv<'tcx>, - pub pattern_arena: &'a TypedArena>, - pub byte_array_map: FxHashMap<*const Pat<'tcx>, Vec<&'a Pat<'tcx>>>, + crate pattern_arena: &'a TypedArena>, } impl<'a, 'tcx> MatchCheckCtxt<'a, 'tcx> { - pub fn create_and_enter( + crate fn create_and_enter( tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>, module: DefId, - f: F, - ) -> R - where - F: for<'b> FnOnce(MatchCheckCtxt<'b, 'tcx>) -> R, - { + f: impl FnOnce(MatchCheckCtxt<'_, 'tcx>) -> R, + ) -> R { let pattern_arena = TypedArena::default(); - f(MatchCheckCtxt { - tcx, - param_env, - module, - pattern_arena: &pattern_arena, - byte_array_map: FxHashMap::default(), - }) + f(MatchCheckCtxt { tcx, param_env, module, pattern_arena: &pattern_arena }) } fn is_uninhabited(&self, ty: Ty<'tcx>) -> bool { @@ -597,7 +602,7 @@ impl<'a, 'tcx> MatchCheckCtxt<'a, 'tcx> { } // Returns whether the given type is an enum from another crate declared `#[non_exhaustive]`. - pub fn is_foreign_non_exhaustive_enum(&self, ty: Ty<'tcx>) -> bool { + crate fn is_foreign_non_exhaustive_enum(&self, ty: Ty<'tcx>) -> bool { match ty.kind { ty::Adt(def, ..) => { def.is_enum() && def.is_variant_list_non_exhaustive() && !def.did.is_local() @@ -620,10 +625,11 @@ impl<'a, 'tcx> MatchCheckCtxt<'a, 'tcx> { enum SliceKind { /// Patterns of length `n` (`[x, y]`). FixedLen(u64), - /// Patterns using the `..` notation (`[x, .., y]`). Captures any array constructor of `length - /// >= i + j`. In the case where `array_len` is `Some(_)`, this indicates that we only care - /// about the first `i` and the last `j` values of the array, and everything in between is a - /// wildcard `_`. + /// Patterns using the `..` notation (`[x, .., y]`). + /// Captures any array constructor of `length >= i + j`. + /// In the case where `array_len` is `Some(_)`, + /// this indicates that we only care about the first `i` and the last `j` values of the array, + /// and everything in between is a wildcard `_`. VarLen(u64, u64), } @@ -756,13 +762,13 @@ impl<'tcx> Constructor<'tcx> { cx: &MatchCheckCtxt<'a, 'tcx>, adt: &'tcx ty::AdtDef, ) -> VariantIdx { - match self { - Variant(id) => adt.variant_index_with_id(*id), + match *self { + Variant(id) => adt.variant_index_with_id(id), Single => { assert!(!adt.is_enum()); VariantIdx::new(0) } - ConstantValue(c) => crate::const_eval::const_variant_index(cx.tcx, cx.param_env, c), + ConstantValue(c) => cx.tcx.destructure_const(cx.param_env.and(c)).variant, _ => bug!("bad constructor {:?} for adt {:?}", self, adt), } } @@ -1041,7 +1047,7 @@ impl<'tcx> Constructor<'tcx> { } #[derive(Clone, Debug)] -pub enum Usefulness<'tcx, 'p> { +crate enum Usefulness<'tcx, 'p> { /// Carries a list of unreachable subpatterns. Used only in the presence of or-patterns. Useful(Vec<&'p Pat<'tcx>>), /// Carries a list of witnesses of non-exhaustiveness. @@ -1129,7 +1135,7 @@ impl<'tcx, 'p> Usefulness<'tcx, 'p> { } #[derive(Copy, Clone, Debug)] -pub enum WitnessPreference { +crate enum WitnessPreference { ConstructWitness, LeaveOutWitness, } @@ -1173,10 +1179,10 @@ struct PatCtxt<'tcx> { /// /// The final `Pair(Some(_), true)` is then the resulting witness. #[derive(Clone, Debug)] -pub struct Witness<'tcx>(Vec>); +crate struct Witness<'tcx>(Vec>); impl<'tcx> Witness<'tcx> { - pub fn single_pattern(self) -> Pat<'tcx> { + crate fn single_pattern(self) -> Pat<'tcx> { assert_eq!(self.0.len(), 1); self.0.into_iter().next().unwrap() } @@ -1341,9 +1347,9 @@ fn all_constructors<'a, 'tcx>( /// around the (offset) space: i.e., `range.lo <= range.hi`. #[derive(Clone, Debug)] struct IntRange<'tcx> { - pub range: RangeInclusive, - pub ty: Ty<'tcx>, - pub span: Span, + range: RangeInclusive, + ty: Ty<'tcx>, + span: Span, } impl<'tcx> IntRange<'tcx> { @@ -1524,7 +1530,7 @@ impl<'tcx> IntRange<'tcx> { // 2 -------- // 2 ------- let (lo, hi) = self.boundaries(); let (other_lo, other_hi) = other.boundaries(); - (lo == other_hi || hi == other_lo) + lo == other_hi || hi == other_lo } fn to_pat(&self, tcx: TyCtxt<'tcx>) -> Pat<'tcx> { @@ -1614,7 +1620,7 @@ impl<'tcx> fmt::Debug for MissingConstructors<'tcx> { /// relation to preceding patterns, it is not reachable) and exhaustiveness /// checking (if a wildcard pattern is useful in relation to a matrix, the /// matrix isn't exhaustive). -pub fn is_useful<'p, 'tcx>( +crate fn is_useful<'p, 'tcx>( cx: &mut MatchCheckCtxt<'p, 'tcx>, matrix: &Matrix<'p, 'tcx>, v: &PatStack<'p, 'tcx>, @@ -2221,7 +2227,7 @@ fn split_grouped_constructors<'p, 'tcx>( split_ctors } -fn lint_overlapping_patterns( +fn lint_overlapping_patterns<'tcx>( tcx: TyCtxt<'tcx>, hir_id: Option, ctor_range: IntRange<'tcx>, @@ -2347,16 +2353,30 @@ fn specialize_one_pattern<'p, 'tcx>( // just integers. The only time they should be pointing to memory // is when they are subslices of nonzero slices. let (alloc, offset, n, ty) = match value.ty.kind { - ty::Array(t, n) => match value.val { - ty::ConstKind::Value(ConstValue::ByRef { offset, alloc, .. }) => { - (alloc, offset, n.eval_usize(cx.tcx, cx.param_env), t) + ty::Array(t, n) => { + let n = n.eval_usize(cx.tcx, cx.param_env); + // Shortcut for `n == 0` where no matter what `alloc` and `offset` we produce, + // the result would be exactly what we early return here. + if n == 0 { + if ctor_wild_subpatterns.len() as u64 == 0 { + return Some(PatStack::from_slice(&[])); + } else { + return None; + } } - _ => span_bug!(pat.span, "array pattern is {:?}", value,), - }, + match value.val { + ty::ConstKind::Value(ConstValue::ByRef { offset, alloc, .. }) => { + (Cow::Borrowed(alloc), offset, n, t) + } + _ => span_bug!(pat.span, "array pattern is {:?}", value,), + } + } ty::Slice(t) => { match value.val { ty::ConstKind::Value(ConstValue::Slice { data, start, end }) => { - (data, Size::from_bytes(start as u64), (end - start) as u64, t) + let offset = Size::from_bytes(start as u64); + let n = (end - start) as u64; + (Cow::Borrowed(data), offset, n, t) } ty::ConstKind::Value(ConstValue::ByRef { .. }) => { // FIXME(oli-obk): implement `deref` for `ConstValue` diff --git a/src/librustc_mir/hair/pattern/check_match.rs b/src/librustc_mir_build/hair/pattern/check_match.rs similarity index 57% rename from src/librustc_mir/hair/pattern/check_match.rs rename to src/librustc_mir_build/hair/pattern/check_match.rs index 8156cfe7ab..82822f0c47 100644 --- a/src/librustc_mir/hair/pattern/check_match.rs +++ b/src/librustc_mir_build/hair/pattern/check_match.rs @@ -4,36 +4,32 @@ use super::_match::{expand_pattern, is_useful, MatchCheckCtxt, Matrix, PatStack} use super::{PatCtxt, PatKind, PatternError}; -use rustc::lint; -use rustc::session::Session; -use rustc::ty::subst::{InternalSubsts, SubstsRef}; +use rustc::hir::map::Map; use rustc::ty::{self, Ty, TyCtxt}; -use rustc_errors::{Applicability, DiagnosticBuilder}; - -use rustc::hir::def::*; -use rustc::hir::def_id::DefId; -use rustc::hir::intravisit::{self, NestedVisitorMap, Visitor}; -use rustc::hir::HirId; -use rustc::hir::{self, Pat}; +use rustc_errors::{error_code, struct_span_err, Applicability, DiagnosticBuilder}; +use rustc_hir as hir; +use rustc_hir::def::*; +use rustc_hir::def_id::DefId; +use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; +use rustc_hir::{HirId, Pat}; +use rustc_session::lint::builtin::BINDINGS_WITH_VARIANT_NAME; +use rustc_session::lint::builtin::{IRREFUTABLE_LET_PATTERNS, UNREACHABLE_PATTERNS}; +use rustc_session::parse::feature_err; +use rustc_session::Session; +use rustc_span::symbol::sym; +use rustc_span::{MultiSpan, Span}; +use syntax::ast::Mutability; use std::slice; -use syntax_pos::{MultiSpan, Span}; - -use rustc_error_codes::*; - crate fn check_match(tcx: TyCtxt<'_>, def_id: DefId) { let body_id = match tcx.hir().as_local_hir_id(def_id) { None => return, Some(id) => tcx.hir().body_owned_by(id), }; - let mut visitor = MatchVisitor { - tcx, - tables: tcx.body_tables(body_id), - param_env: tcx.param_env(def_id), - identity_substs: InternalSubsts::identity_for_item(tcx, def_id), - }; + let mut visitor = + MatchVisitor { tcx, tables: tcx.body_tables(body_id), param_env: tcx.param_env(def_id) }; visitor.visit_body(tcx.hir().body(body_id)); } @@ -45,15 +41,16 @@ struct MatchVisitor<'a, 'tcx> { tcx: TyCtxt<'tcx>, tables: &'a ty::TypeckTables<'tcx>, param_env: ty::ParamEnv<'tcx>, - identity_substs: SubstsRef<'tcx>, } impl<'tcx> Visitor<'tcx> for MatchVisitor<'_, 'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { + type Map = Map<'tcx>; + + fn nested_visit_map(&mut self) -> NestedVisitorMap<'_, Self::Map> { NestedVisitorMap::None } - fn visit_expr(&mut self, ex: &'tcx hir::Expr) { + fn visit_expr(&mut self, ex: &'tcx hir::Expr<'tcx>) { intravisit::walk_expr(self, ex); if let hir::ExprKind::Match(ref scrut, ref arms, source) = ex.kind { @@ -61,7 +58,7 @@ impl<'tcx> Visitor<'tcx> for MatchVisitor<'_, 'tcx> { } } - fn visit_local(&mut self, loc: &'tcx hir::Local) { + fn visit_local(&mut self, loc: &'tcx hir::Local<'tcx>) { intravisit::walk_local(self, loc); let (msg, sp) = match loc.source { @@ -71,18 +68,13 @@ impl<'tcx> Visitor<'tcx> for MatchVisitor<'_, 'tcx> { hir::LocalSource::AwaitDesugar => ("`await` future binding", None), }; self.check_irrefutable(&loc.pat, msg, sp); - - // Check legality of move bindings and `@` patterns. self.check_patterns(false, &loc.pat); } - fn visit_body(&mut self, body: &'tcx hir::Body) { - intravisit::walk_body(self, body); - - for param in &body.params { - self.check_irrefutable(¶m.pat, "function argument", None); - self.check_patterns(false, ¶m.pat); - } + fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { + intravisit::walk_param(self, param); + self.check_irrefutable(¶m.pat, "function argument", None); + self.check_patterns(false, ¶m.pat); } } @@ -116,45 +108,61 @@ impl PatCtxt<'_, '_> { } fn span_e0158(&self, span: Span, text: &str) { - span_err!(self.tcx.sess, span, E0158, "{}", text) + struct_span_err!(self.tcx.sess, span, E0158, "{}", text).emit(); } } impl<'tcx> MatchVisitor<'_, 'tcx> { - fn check_patterns(&mut self, has_guard: bool, pat: &Pat) { + fn check_patterns(&mut self, has_guard: bool, pat: &Pat<'_>) { check_legality_of_move_bindings(self, has_guard, pat); - check_legality_of_bindings_in_at_patterns(self, pat); + check_borrow_conflicts_in_at_patterns(self, pat); + if !self.tcx.features().bindings_after_at { + check_legality_of_bindings_in_at_patterns(self, pat); + } + check_for_bindings_named_same_as_variants(self, pat); } - fn check_match(&mut self, scrut: &hir::Expr, arms: &'tcx [hir::Arm], source: hir::MatchSource) { + fn lower_pattern<'p>( + &self, + cx: &mut MatchCheckCtxt<'p, 'tcx>, + pat: &'tcx hir::Pat<'tcx>, + have_errors: &mut bool, + ) -> (&'p super::Pat<'tcx>, Ty<'tcx>) { + let mut patcx = PatCtxt::new(self.tcx, self.param_env, self.tables); + patcx.include_lint_checks(); + let pattern = patcx.lower_pattern(pat); + let pattern_ty = pattern.ty; + let pattern: &_ = cx.pattern_arena.alloc(expand_pattern(cx, pattern)); + if !patcx.errors.is_empty() { + *have_errors = true; + patcx.report_inlining_errors(pat.span); + } + (pattern, pattern_ty) + } + + fn check_in_cx(&self, hir_id: HirId, f: impl FnOnce(MatchCheckCtxt<'_, 'tcx>)) { + let module = self.tcx.hir().get_module_parent(hir_id); + MatchCheckCtxt::create_and_enter(self.tcx, self.param_env, module, |cx| f(cx)); + } + + fn check_match( + &mut self, + scrut: &hir::Expr<'_>, + arms: &'tcx [hir::Arm<'tcx>], + source: hir::MatchSource, + ) { for arm in arms { - // First, check legality of move bindings. + // Check the arm for some things unrelated to exhaustiveness. self.check_patterns(arm.guard.is_some(), &arm.pat); - - // Second, perform some lints. - check_for_bindings_named_same_as_variants(self, &arm.pat); } - let module = self.tcx.hir().get_module_parent(scrut.hir_id); - MatchCheckCtxt::create_and_enter(self.tcx, self.param_env, module, |ref mut cx| { + self.check_in_cx(scrut.hir_id, |ref mut cx| { let mut have_errors = false; let inlined_arms: Vec<_> = arms .iter() - .map(|arm| { - let mut patcx = PatCtxt::new( - self.tcx, - self.param_env.and(self.identity_substs), - self.tables, - ); - patcx.include_lint_checks(); - let pattern = patcx.lower_pattern(&arm.pat); - let pattern: &_ = cx.pattern_arena.alloc(expand_pattern(cx, pattern)); - if !patcx.errors.is_empty() { - patcx.report_inlining_errors(arm.pat.span); - have_errors = true; - } - (pattern, &*arm.pat, arm.guard.is_some()) + .map(|hir::Arm { pat, guard, .. }| { + (self.lower_pattern(cx, pat, &mut have_errors).0, pat.hir_id, guard.is_some()) }) .collect(); @@ -175,15 +183,9 @@ impl<'tcx> MatchVisitor<'_, 'tcx> { }) } - fn check_irrefutable(&self, pat: &'tcx Pat, origin: &str, sp: Option) { - let module = self.tcx.hir().get_module_parent(pat.hir_id); - MatchCheckCtxt::create_and_enter(self.tcx, self.param_env, module, |ref mut cx| { - let mut patcx = - PatCtxt::new(self.tcx, self.param_env.and(self.identity_substs), self.tables); - patcx.include_lint_checks(); - let pattern = patcx.lower_pattern(pat); - let pattern_ty = pattern.ty; - let pattern = cx.pattern_arena.alloc(expand_pattern(cx, pattern)); + fn check_irrefutable(&self, pat: &'tcx Pat<'tcx>, origin: &str, sp: Option) { + self.check_in_cx(pat.hir_id, |ref mut cx| { + let (pattern, pattern_ty) = self.lower_pattern(cx, pat, &mut false); let pats: Matrix<'_, '_> = vec![PatStack::from_pattern(pattern)].into_iter().collect(); let witnesses = match check_not_useful(cx, pattern_ty, &pats, pat.hir_id) { @@ -243,7 +245,12 @@ impl<'tcx> MatchVisitor<'_, 'tcx> { /// A path pattern was interpreted as a constant, not a new variable. /// This caused an irrefutable match failure in e.g. `let`. -fn const_not_var(err: &mut DiagnosticBuilder<'_>, tcx: TyCtxt<'_>, pat: &Pat, path: &hir::Path) { +fn const_not_var( + err: &mut DiagnosticBuilder<'_>, + tcx: TyCtxt<'_>, + pat: &Pat<'_>, + path: &hir::Path<'_>, +) { let descr = path.res.descr(); err.span_label( pat.span, @@ -265,15 +272,13 @@ fn const_not_var(err: &mut DiagnosticBuilder<'_>, tcx: TyCtxt<'_>, pat: &Pat, pa } } -fn check_for_bindings_named_same_as_variants(cx: &MatchVisitor<'_, '_>, pat: &Pat) { - pat.walk(|p| { +fn check_for_bindings_named_same_as_variants(cx: &MatchVisitor<'_, '_>, pat: &Pat<'_>) { + pat.walk_always(|p| { if let hir::PatKind::Binding(_, _, ident, None) = p.kind { - if let Some(&bm) = cx.tables.pat_binding_modes().get(p.hir_id) { - if bm != ty::BindByValue(hir::Mutability::Immutable) { - // Nothing to check. - return true; - } - let pat_ty = cx.tables.pat_ty(p); + if let Some(ty::BindByValue(hir::Mutability::Not)) = + cx.tables.extract_binding_mode(cx.tcx.sess, p.hir_id, p.span) + { + let pat_ty = cx.tables.pat_ty(p).peel_refs(); if let ty::Adt(edef, _) = pat_ty.kind { if edef.is_enum() && edef.variants.iter().any(|variant| { @@ -281,106 +286,90 @@ fn check_for_bindings_named_same_as_variants(cx: &MatchVisitor<'_, '_>, pat: &Pa }) { let ty_path = cx.tcx.def_path_str(edef.did); - let mut err = struct_span_warn!( - cx.tcx.sess, - p.span, - E0170, - "pattern binding `{}` is named the same as one \ - of the variants of the type `{}`", - ident, - ty_path - ); - err.span_suggestion( - p.span, - "to match on the variant, qualify the path", - format!("{}::{}", ty_path, ident), - Applicability::MachineApplicable, - ); - err.emit(); + cx.tcx + .struct_span_lint_hir( + BINDINGS_WITH_VARIANT_NAME, + p.hir_id, + p.span, + &format!( + "pattern binding `{}` is named the same as one \ + of the variants of the type `{}`", + ident, ty_path + ), + ) + .code(error_code!(E0170)) + .span_suggestion( + p.span, + "to match on the variant, qualify the path", + format!("{}::{}", ty_path, ident), + Applicability::MachineApplicable, + ) + .emit(); } } - } else { - cx.tcx.sess.delay_span_bug(p.span, "missing binding mode"); } } - true }); } /// Checks for common cases of "catchall" patterns that may not be intended as such. -fn pat_is_catchall(pat: &Pat) -> bool { - match pat.kind { - hir::PatKind::Binding(.., None) => true, - hir::PatKind::Binding(.., Some(ref s)) => pat_is_catchall(s), - hir::PatKind::Ref(ref s, _) => pat_is_catchall(s), - hir::PatKind::Tuple(ref v, _) => v.iter().all(|p| pat_is_catchall(&p)), +fn pat_is_catchall(pat: &super::Pat<'_>) -> bool { + use super::PatKind::*; + match &*pat.kind { + Binding { subpattern: None, .. } => true, + Binding { subpattern: Some(s), .. } | Deref { subpattern: s } => pat_is_catchall(s), + Leaf { subpatterns: s } => s.iter().all(|p| pat_is_catchall(&p.pattern)), _ => false, } } -// Check for unreachable patterns +fn unreachable_pattern(tcx: TyCtxt<'_>, span: Span, id: HirId, catchall: Option) { + let mut err = tcx.struct_span_lint_hir(UNREACHABLE_PATTERNS, id, span, "unreachable pattern"); + if let Some(catchall) = catchall { + // We had a catchall pattern, hint at that. + err.span_label(span, "unreachable pattern"); + err.span_label(catchall, "matches any value"); + } + err.emit(); +} + +fn irrefutable_let_pattern(tcx: TyCtxt<'_>, span: Span, id: HirId, source: hir::MatchSource) { + let msg = match source { + hir::MatchSource::IfLetDesugar { .. } => "irrefutable if-let pattern", + hir::MatchSource::WhileLetDesugar => "irrefutable while-let pattern", + _ => bug!(), + }; + tcx.lint_hir(IRREFUTABLE_LET_PATTERNS, id, span, msg); +} + +/// Check for unreachable patterns. fn check_arms<'p, 'tcx>( cx: &mut MatchCheckCtxt<'p, 'tcx>, - arms: &[(&'p super::Pat<'tcx>, &hir::Pat, bool)], + arms: &[(&'p super::Pat<'tcx>, HirId, bool)], source: hir::MatchSource, ) -> Matrix<'p, 'tcx> { let mut seen = Matrix::empty(); let mut catchall = None; - for (arm_index, (pat, hir_pat, has_guard)) in arms.iter().enumerate() { + for (arm_index, (pat, id, has_guard)) in arms.iter().copied().enumerate() { let v = PatStack::from_pattern(pat); - - match is_useful(cx, &seen, &v, LeaveOutWitness, hir_pat.hir_id, true) { + match is_useful(cx, &seen, &v, LeaveOutWitness, id, true) { NotUseful => { match source { hir::MatchSource::IfDesugar { .. } | hir::MatchSource::WhileDesugar => bug!(), hir::MatchSource::IfLetDesugar { .. } | hir::MatchSource::WhileLetDesugar => { - // check which arm we're on. + // Check which arm we're on. match arm_index { // The arm with the user-specified pattern. - 0 => { - cx.tcx.lint_hir( - lint::builtin::UNREACHABLE_PATTERNS, - hir_pat.hir_id, - pat.span, - "unreachable pattern", - ); - } + 0 => unreachable_pattern(cx.tcx, pat.span, id, None), // The arm with the wildcard pattern. - 1 => { - let msg = match source { - hir::MatchSource::IfLetDesugar { .. } => { - "irrefutable if-let pattern" - } - hir::MatchSource::WhileLetDesugar => { - "irrefutable while-let pattern" - } - _ => bug!(), - }; - cx.tcx.lint_hir( - lint::builtin::IRREFUTABLE_LET_PATTERNS, - hir_pat.hir_id, - pat.span, - msg, - ); - } + 1 => irrefutable_let_pattern(cx.tcx, pat.span, id, source), _ => bug!(), } } hir::MatchSource::ForLoopDesugar | hir::MatchSource::Normal => { - let mut err = cx.tcx.struct_span_lint_hir( - lint::builtin::UNREACHABLE_PATTERNS, - hir_pat.hir_id, - pat.span, - "unreachable pattern", - ); - // if we had a catchall pattern, hint at that - if let Some(catchall) = catchall { - err.span_label(pat.span, "unreachable pattern"); - err.span_label(catchall, "matches any value"); - } - err.emit(); + unreachable_pattern(cx.tcx, pat.span, id, catchall); } // Unreachable patterns in try and await expressions occur when one of @@ -390,19 +379,14 @@ fn check_arms<'p, 'tcx>( } Useful(unreachable_subpatterns) => { for pat in unreachable_subpatterns { - cx.tcx.lint_hir( - lint::builtin::UNREACHABLE_PATTERNS, - hir_pat.hir_id, - pat.span, - "unreachable pattern", - ); + unreachable_pattern(cx.tcx, pat.span, id, None); } } UsefulWithWitness(_) => bug!(), } if !has_guard { seen.push(v); - if catchall.is_none() && pat_is_catchall(hir_pat) { + if catchall.is_none() && pat_is_catchall(pat) { catchall = Some(pat.span); } } @@ -575,105 +559,178 @@ fn maybe_point_at_variant(ty: Ty<'_>, patterns: &[super::Pat<'_>]) -> Vec covered } -// Check the legality of legality of by-move bindings. -fn check_legality_of_move_bindings(cx: &mut MatchVisitor<'_, '_>, has_guard: bool, pat: &Pat) { - let mut by_ref_span = None; +/// Check the legality of legality of by-move bindings. +fn check_legality_of_move_bindings(cx: &mut MatchVisitor<'_, '_>, has_guard: bool, pat: &Pat<'_>) { + let sess = cx.tcx.sess; + let tables = cx.tables; + + // Find all by-ref spans. + let mut by_ref_spans = Vec::new(); pat.each_binding(|_, hir_id, span, _| { - if let Some(&bm) = cx.tables.pat_binding_modes().get(hir_id) { - if let ty::BindByReference(..) = bm { - by_ref_span = Some(span); - } - } else { - cx.tcx.sess.delay_span_bug(pat.span, "missing binding mode"); + if let Some(ty::BindByReference(_)) = tables.extract_binding_mode(sess, hir_id, span) { + by_ref_spans.push(span); } }); - let span_vec = &mut Vec::new(); - let mut check_move = |p: &Pat, sub: Option<&Pat>| { + // Find bad by-move spans: + let by_move_spans = &mut Vec::new(); + let mut check_move = |p: &Pat<'_>, sub: Option<&Pat<'_>>| { // Check legality of moving out of the enum. // // `x @ Foo(..)` is legal, but `x @ Foo(y)` isn't. if sub.map_or(false, |p| p.contains_bindings()) { - struct_span_err!(cx.tcx.sess, p.span, E0007, "cannot bind by-move with sub-bindings") + struct_span_err!(sess, p.span, E0007, "cannot bind by-move with sub-bindings") .span_label(p.span, "binds an already bound by-move value by moving it") .emit(); - } else if !has_guard && by_ref_span.is_some() { - span_vec.push(p.span); + } else if !has_guard && !by_ref_spans.is_empty() { + by_move_spans.push(p.span); } }; - - pat.walk(|p| { + pat.walk_always(|p| { if let hir::PatKind::Binding(.., sub) = &p.kind { - if let Some(&bm) = cx.tables.pat_binding_modes().get(p.hir_id) { - if let ty::BindByValue(..) = bm { - let pat_ty = cx.tables.node_type(p.hir_id); - if !pat_ty.is_copy_modulo_regions(cx.tcx, cx.param_env, pat.span) { - check_move(p, sub.as_deref()); - } + if let Some(ty::BindByValue(_)) = tables.extract_binding_mode(sess, p.hir_id, p.span) { + let pat_ty = tables.node_type(p.hir_id); + if !pat_ty.is_copy_modulo_regions(cx.tcx, cx.param_env, pat.span) { + check_move(p, sub.as_deref()); } - } else { - cx.tcx.sess.delay_span_bug(pat.span, "missing binding mode"); } } - true }); - if !span_vec.is_empty() { + // Found some bad by-move spans, error! + if !by_move_spans.is_empty() { let mut err = struct_span_err!( - cx.tcx.sess, - MultiSpan::from_spans(span_vec.clone()), + sess, + MultiSpan::from_spans(by_move_spans.clone()), E0009, "cannot bind by-move and by-ref in the same pattern", ); - if let Some(by_ref_span) = by_ref_span { - err.span_label(by_ref_span, "both by-ref and by-move used"); + for span in by_ref_spans.iter() { + err.span_label(*span, "by-ref pattern here"); } - for span in span_vec.iter() { + for span in by_move_spans.iter() { err.span_label(*span, "by-move pattern here"); } err.emit(); } } -/// Forbids bindings in `@` patterns. This is necessary for memory safety, -/// because of the way rvalues are handled in the borrow check. (See issue -/// #14587.) -fn check_legality_of_bindings_in_at_patterns(cx: &MatchVisitor<'_, '_>, pat: &Pat) { - AtBindingPatternVisitor { cx, bindings_allowed: true }.visit_pat(pat); -} +/// Check that there are no borrow conflicts in `binding @ subpat` patterns. +/// +/// For example, this would reject: +/// - `ref x @ Some(ref mut y)`, +/// - `ref mut x @ Some(ref y)` +/// - `ref mut x @ Some(ref mut y)`. +/// +/// This analysis is *not* subsumed by NLL. +fn check_borrow_conflicts_in_at_patterns(cx: &MatchVisitor<'_, '_>, pat: &Pat<'_>) { + let tab = cx.tables; + let sess = cx.tcx.sess; + // Get the mutability of `p` if it's by-ref. + let extract_binding_mut = |hir_id, span| match tab.extract_binding_mode(sess, hir_id, span)? { + ty::BindByValue(_) => None, + ty::BindByReference(m) => Some(m), + }; + pat.walk_always(|pat| { + // Extract `sub` in `binding @ sub`. + let (name, sub) = match &pat.kind { + hir::PatKind::Binding(.., name, Some(sub)) => (*name, sub), + _ => return, + }; + + // Extract the mutability. + let mut_outer = match extract_binding_mut(pat.hir_id, pat.span) { + None => return, + Some(m) => m, + }; -struct AtBindingPatternVisitor<'a, 'b, 'tcx> { - cx: &'a MatchVisitor<'b, 'tcx>, - bindings_allowed: bool, + // We now have `ref $mut_outer binding @ sub` (semantically). + // Recurse into each binding in `sub` and find mutability conflicts. + let mut conflicts_mut_mut = Vec::new(); + let mut conflicts_mut_ref = Vec::new(); + sub.each_binding(|_, hir_id, span, _| { + if let Some(mut_inner) = extract_binding_mut(hir_id, span) { + match (mut_outer, mut_inner) { + (Mutability::Not, Mutability::Not) => {} + (Mutability::Mut, Mutability::Mut) => conflicts_mut_mut.push(span), + _ => conflicts_mut_ref.push(span), + } + } + }); + + // Report errors if any. + let binding_span = pat.span.with_hi(name.span.hi()); + if !conflicts_mut_mut.is_empty() { + // Report mutability conflicts for e.g. `ref mut x @ Some(ref mut y)`. + let msg = &format!("cannot borrow `{}` as mutable more than once at a time", name); + let mut err = sess.struct_span_err(pat.span, msg); + err.span_label(binding_span, "first mutable borrow occurs here"); + for sp in conflicts_mut_mut { + err.span_label(sp, "another mutable borrow occurs here"); + } + for sp in conflicts_mut_ref { + err.span_label(sp, "also borrowed as immutable here"); + } + err.emit(); + } else if !conflicts_mut_ref.is_empty() { + // Report mutability conflicts for e.g. `ref x @ Some(ref mut y)` or the converse. + let (primary, also) = match mut_outer { + Mutability::Mut => ("mutable", "immutable"), + Mutability::Not => ("immutable", "mutable"), + }; + let msg = &format!( + "cannot borrow `{}` as {} because it is also borrowed as {}", + name, also, primary, + ); + let mut err = sess.struct_span_err(pat.span, msg); + err.span_label(binding_span, &format!("{} borrow occurs here", primary)); + for sp in conflicts_mut_ref { + err.span_label(sp, &format!("{} borrow occurs here", also)); + } + err.emit(); + } + }); } -impl<'v> Visitor<'v> for AtBindingPatternVisitor<'_, '_, '_> { - fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'v> { - NestedVisitorMap::None +/// Forbids bindings in `@` patterns. This used to be is necessary for memory safety, +/// because of the way rvalues were handled in the borrow check. (See issue #14587.) +fn check_legality_of_bindings_in_at_patterns(cx: &MatchVisitor<'_, '_>, pat: &Pat<'_>) { + AtBindingPatternVisitor { cx, bindings_allowed: true }.visit_pat(pat); + + struct AtBindingPatternVisitor<'a, 'b, 'tcx> { + cx: &'a MatchVisitor<'b, 'tcx>, + bindings_allowed: bool, } - fn visit_pat(&mut self, pat: &Pat) { - match pat.kind { - hir::PatKind::Binding(.., ref subpat) => { - if !self.bindings_allowed { - struct_span_err!( - self.cx.tcx.sess, - pat.span, - E0303, - "pattern bindings are not allowed after an `@`" - ) - .span_label(pat.span, "not allowed after `@`") - .emit(); - } + impl<'v> Visitor<'v> for AtBindingPatternVisitor<'_, '_, '_> { + type Map = Map<'v>; + + fn nested_visit_map(&mut self) -> NestedVisitorMap<'_, Self::Map> { + NestedVisitorMap::None + } - if subpat.is_some() { - let bindings_were_allowed = self.bindings_allowed; - self.bindings_allowed = false; - intravisit::walk_pat(self, pat); - self.bindings_allowed = bindings_were_allowed; + fn visit_pat(&mut self, pat: &Pat<'_>) { + match pat.kind { + hir::PatKind::Binding(.., ref subpat) => { + if !self.bindings_allowed { + feature_err( + &self.cx.tcx.sess.parse_sess, + sym::bindings_after_at, + pat.span, + "pattern bindings after an `@` are unstable", + ) + .emit(); + } + + if subpat.is_some() { + let bindings_were_allowed = self.bindings_allowed; + self.bindings_allowed = false; + intravisit::walk_pat(self, pat); + self.bindings_allowed = bindings_were_allowed; + } } + _ => intravisit::walk_pat(self, pat), } - _ => intravisit::walk_pat(self, pat), } } } diff --git a/src/librustc_mir/hair/pattern/const_to_pat.rs b/src/librustc_mir_build/hair/pattern/const_to_pat.rs similarity index 63% rename from src/librustc_mir/hair/pattern/const_to_pat.rs rename to src/librustc_mir_build/hair/pattern/const_to_pat.rs index bfc539639d..a21a0ee8a1 100644 --- a/src/librustc_mir/hair/pattern/const_to_pat.rs +++ b/src/librustc_mir_build/hair/pattern/const_to_pat.rs @@ -1,16 +1,14 @@ -use crate::const_eval::const_variant_index; - -use rustc::hir; +use rustc::infer::InferCtxt; use rustc::lint; use rustc::mir::Field; -use rustc::infer::InferCtxt; -use rustc::traits::{ObligationCause, PredicateObligation}; +use rustc::traits::predicate_for_trait_def; +use rustc::traits::{self, ObligationCause, PredicateObligation}; use rustc::ty::{self, Ty, TyCtxt}; +use rustc_hir as hir; use rustc_index::vec::Idx; -use syntax_pos::Span; - +use rustc_span::Span; use std::cell::Cell; @@ -53,29 +51,35 @@ struct ConstToPat<'a, 'tcx> { } impl<'a, 'tcx> ConstToPat<'a, 'tcx> { - fn new(pat_ctxt: &PatCtxt<'_, 'tcx>, - id: hir::HirId, - span: Span, - infcx: InferCtxt<'a, 'tcx>) -> Self { + fn new( + pat_ctxt: &PatCtxt<'_, 'tcx>, + id: hir::HirId, + span: Span, + infcx: InferCtxt<'a, 'tcx>, + ) -> Self { ConstToPat { - id, span, infcx, + id, + span, + infcx, param_env: pat_ctxt.param_env, include_lint_checks: pat_ctxt.include_lint_checks, saw_const_match_error: Cell::new(false), } } - fn tcx(&self) -> TyCtxt<'tcx> { self.infcx.tcx } + fn tcx(&self) -> TyCtxt<'tcx> { + self.infcx.tcx + } - fn search_for_structural_match_violation(&self, - ty: Ty<'tcx>) - -> Option> - { - ty::search_for_structural_match_violation(self.id, self.span, self.tcx(), ty) + fn search_for_structural_match_violation( + &self, + ty: Ty<'tcx>, + ) -> Option> { + traits::search_for_structural_match_violation(self.id, self.span, self.tcx(), ty) } fn type_marked_structural(&self, ty: Ty<'tcx>) -> bool { - ty::type_marked_structural(self.id, self.span, &self.infcx, ty) + traits::type_marked_structural(self.id, self.span, &self.infcx, ty) } fn to_pat(&mut self, cv: &'tcx ty::Const<'tcx>) -> Pat<'tcx> { @@ -93,20 +97,22 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> { // double-check that all types in the const implement `Structural`. let structural = self.search_for_structural_match_violation(cv.ty); - debug!("search_for_structural_match_violation cv.ty: {:?} returned: {:?}", - cv.ty, structural); + debug!( + "search_for_structural_match_violation cv.ty: {:?} returned: {:?}", + cv.ty, structural + ); if let Some(non_sm_ty) = structural { let adt_def = match non_sm_ty { - ty::NonStructuralMatchTy::Adt(adt_def) => adt_def, - ty::NonStructuralMatchTy::Param => - bug!("use of constant whose type is a parameter inside a pattern"), + traits::NonStructuralMatchTy::Adt(adt_def) => adt_def, + traits::NonStructuralMatchTy::Param => { + bug!("use of constant whose type is a parameter inside a pattern") + } }; let path = self.tcx().def_path_str(adt_def.did); let msg = format!( "to use a constant of type `{}` in a pattern, \ `{}` must be annotated with `#[derive(PartialEq, Eq)]`", - path, - path, + path, path, ); // double-check there even *is* a semantic `PartialEq` to dispatch to. @@ -122,14 +128,15 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> { // not *yet* implement `PartialEq`. So for now we leave this here. let ty_is_partial_eq: bool = { let partial_eq_trait_id = self.tcx().lang_items().eq_trait().unwrap(); - let obligation: PredicateObligation<'_> = - self.tcx().predicate_for_trait_def( - self.param_env, - ObligationCause::misc(self.span, self.id), - partial_eq_trait_id, - 0, - cv.ty, - &[]); + let obligation: PredicateObligation<'_> = predicate_for_trait_def( + self.tcx(), + self.param_env, + ObligationCause::misc(self.span, self.id), + partial_eq_trait_id, + 0, + cv.ty, + &[], + ); // FIXME: should this call a `predicate_must_hold` variant instead? self.infcx.predicate_may_hold(&obligation) }; @@ -138,10 +145,12 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> { // span_fatal avoids ICE from resolution of non-existent method (rare case). self.tcx().sess.span_fatal(self.span, &msg); } else { - self.tcx().lint_hir(lint::builtin::INDIRECT_STRUCTURAL_MATCH, - self.id, - self.span, - &msg); + self.tcx().lint_hir( + lint::builtin::INDIRECT_STRUCTURAL_MATCH, + self.id, + self.span, + &msg, + ); } } } @@ -156,23 +165,15 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> { let tcx = self.tcx(); let param_env = self.param_env; - let adt_subpattern = |i, variant_opt| { - let field = Field::new(i); - let val = crate::const_eval::const_field( - tcx, param_env, variant_opt, field, cv - ); - self.recur(val) + let field_pats = |vals: &[&'tcx ty::Const<'tcx>]| { + vals.iter() + .enumerate() + .map(|(idx, val)| { + let field = Field::new(idx); + FieldPat { field, pattern: self.recur(val) } + }) + .collect() }; - let adt_subpatterns = |n, variant_opt| { - (0..n).map(|i| { - let field = Field::new(i); - FieldPat { - field, - pattern: adt_subpattern(i, variant_opt), - } - }).collect::>() - }; - let kind = match cv.ty.kind { ty::Float(_) => { @@ -182,9 +183,7 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> { span, "floating-point types cannot be used in patterns", ); - PatKind::Constant { - value: cv, - } + PatKind::Constant { value: cv } } ty::Adt(adt_def, _) if adt_def.is_union() => { // Matching on union fields is unsafe, we can't hide it in constants @@ -194,14 +193,12 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> { } // keep old code until future-compat upgraded to errors. ty::Adt(adt_def, _) if !self.type_marked_structural(cv.ty) => { - debug!("adt_def {:?} has !type_marked_structural for cv.ty: {:?}", - adt_def, cv.ty); + debug!("adt_def {:?} has !type_marked_structural for cv.ty: {:?}", adt_def, cv.ty); let path = tcx.def_path_str(adt_def.did); let msg = format!( "to use a constant of type `{}` in a pattern, \ `{}` must be annotated with `#[derive(PartialEq, Eq)]`", - path, - path, + path, path, ); self.saw_const_match_error.set(true); tcx.sess.span_err(span, &msg); @@ -211,14 +208,13 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> { ty::Ref(_, adt_ty @ ty::TyS { kind: ty::Adt(_, _), .. }, _) if !self.type_marked_structural(adt_ty) => { - let adt_def = if let ty::Adt(adt_def, _) = adt_ty.kind { - adt_def - } else { - unreachable!() - }; + let adt_def = + if let ty::Adt(adt_def, _) = adt_ty.kind { adt_def } else { unreachable!() }; - debug!("adt_def {:?} has !type_marked_structural for adt_ty: {:?}", - adt_def, adt_ty); + debug!( + "adt_def {:?} has !type_marked_structural for adt_ty: {:?}", + adt_def, adt_ty + ); // HACK(estebank): Side-step ICE #53708, but anything other than erroring here // would be wrong. Returnging `PatKind::Wild` is not technically correct. @@ -226,57 +222,42 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> { let msg = format!( "to use a constant of type `{}` in a pattern, \ `{}` must be annotated with `#[derive(PartialEq, Eq)]`", - path, - path, + path, path, ); self.saw_const_match_error.set(true); tcx.sess.span_err(span, &msg); PatKind::Wild } ty::Adt(adt_def, substs) if adt_def.is_enum() => { - let variant_index = const_variant_index(tcx, self.param_env, cv); - let subpatterns = adt_subpatterns( - adt_def.variants[variant_index].fields.len(), - Some(variant_index), - ); + let destructured = tcx.destructure_const(param_env.and(cv)); PatKind::Variant { adt_def, substs, - variant_index, - subpatterns, + variant_index: destructured.variant, + subpatterns: field_pats(destructured.fields), } } - ty::Adt(adt_def, _) => { - let struct_var = adt_def.non_enum_variant(); - PatKind::Leaf { - subpatterns: adt_subpatterns(struct_var.fields.len(), None), - } + ty::Adt(_, _) => { + let destructured = tcx.destructure_const(param_env.and(cv)); + PatKind::Leaf { subpatterns: field_pats(destructured.fields) } } - ty::Tuple(fields) => { - PatKind::Leaf { - subpatterns: adt_subpatterns(fields.len(), None), - } - } - ty::Array(_, n) => { - PatKind::Array { - prefix: (0..n.eval_usize(tcx, self.param_env)) - .map(|i| adt_subpattern(i as usize, None)) - .collect(), - slice: None, - suffix: Vec::new(), - } - } - _ => { - PatKind::Constant { - value: cv, - } + ty::Tuple(_) => { + let destructured = tcx.destructure_const(param_env.and(cv)); + PatKind::Leaf { subpatterns: field_pats(destructured.fields) } } + ty::Array(..) => PatKind::Array { + prefix: tcx + .destructure_const(param_env.and(cv)) + .fields + .iter() + .map(|val| self.recur(val)) + .collect(), + slice: None, + suffix: Vec::new(), + }, + _ => PatKind::Constant { value: cv }, }; - Pat { - span, - ty: cv.ty, - kind: Box::new(kind), - } + Pat { span, ty: cv.ty, kind: Box::new(kind) } } } diff --git a/src/librustc_mir/hair/pattern/mod.rs b/src/librustc_mir_build/hair/pattern/mod.rs similarity index 54% rename from src/librustc_mir/hair/pattern/mod.rs rename to src/librustc_mir_build/hair/pattern/mod.rs index 0086c3b0e1..b44c7a8c66 100644 --- a/src/librustc_mir/hair/pattern/mod.rs +++ b/src/librustc_mir_build/hair/pattern/mod.rs @@ -7,31 +7,29 @@ mod const_to_pat; pub(crate) use self::check_match::check_match; use crate::hair::util::UserAnnotatedTyHelpers; -use crate::hair::constant::*; -use rustc::mir::{Field, BorrowKind, Mutability}; -use rustc::mir::{UserTypeProjection}; -use rustc::mir::interpret::{GlobalId, ConstValue, get_slice_bytes, sign_extend}; -use rustc::ty::{self, Region, TyCtxt, AdtDef, Ty, UserType, DefIdTree}; -use rustc::ty::{CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations}; -use rustc::ty::subst::{SubstsRef, GenericArg}; +use rustc::mir::interpret::{get_slice_bytes, sign_extend, ConstValue, ErrorHandled}; +use rustc::mir::interpret::{LitToConstError, LitToConstInput}; +use rustc::mir::UserTypeProjection; +use rustc::mir::{BorrowKind, Field, Mutability}; use rustc::ty::layout::VariantIdx; -use rustc::hir::{self, RangeEnd}; -use rustc::hir::def::{CtorOf, Res, DefKind, CtorKind}; -use rustc::hir::pat_util::EnumerateAndAdjustIterator; -use rustc::hir::ptr::P; - +use rustc::ty::subst::{GenericArg, SubstsRef}; +use rustc::ty::{self, AdtDef, DefIdTree, Region, Ty, TyCtxt, UserType}; +use rustc::ty::{CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations}; +use rustc_errors::struct_span_err; +use rustc_hir as hir; +use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res}; +use rustc_hir::pat_util::EnumerateAndAdjustIterator; +use rustc_hir::RangeEnd; use rustc_index::vec::Idx; +use rustc_span::{Span, DUMMY_SP}; +use syntax::ast; use std::cmp::Ordering; use std::fmt; -use syntax::ast; -use syntax_pos::{Span, DUMMY_SP}; - -use rustc_error_codes::*; #[derive(Clone, Debug)] -pub enum PatternError { +crate enum PatternError { AssocConstInPattern(Span), StaticInPattern(Span), FloatBug, @@ -39,22 +37,22 @@ pub enum PatternError { } #[derive(Copy, Clone, Debug)] -pub enum BindingMode { +crate enum BindingMode { ByValue, ByRef(BorrowKind), } #[derive(Clone, Debug)] -pub struct FieldPat<'tcx> { - pub field: Field, - pub pattern: Pat<'tcx>, +crate struct FieldPat<'tcx> { + crate field: Field, + crate pattern: Pat<'tcx>, } #[derive(Clone, Debug)] -pub struct Pat<'tcx> { - pub ty: Ty<'tcx>, - pub span: Span, - pub kind: Box>, +crate struct Pat<'tcx> { + crate ty: Ty<'tcx>, + crate span: Span, + crate kind: Box>, } impl<'tcx> Pat<'tcx> { @@ -64,15 +62,13 @@ impl<'tcx> Pat<'tcx> { } #[derive(Copy, Clone, Debug, PartialEq)] -pub struct PatTyProj<'tcx> { - pub user_ty: CanonicalUserType<'tcx>, +crate struct PatTyProj<'tcx> { + crate user_ty: CanonicalUserType<'tcx>, } impl<'tcx> PatTyProj<'tcx> { pub(crate) fn from_user_type(user_annotation: CanonicalUserType<'tcx>) -> Self { - Self { - user_ty: user_annotation, - } + Self { user_ty: user_annotation } } pub(crate) fn user_ty( @@ -93,8 +89,8 @@ impl<'tcx> PatTyProj<'tcx> { } #[derive(Copy, Clone, Debug, PartialEq)] -pub struct Ascription<'tcx> { - pub user_ty: PatTyProj<'tcx>, +crate struct Ascription<'tcx> { + crate user_ty: PatTyProj<'tcx>, /// Variance to use when relating the type `user_ty` to the **type of the value being /// matched**. Typically, this is `Variance::Covariant`, since the value being matched must /// have a type that is some subtype of the ascribed type. @@ -113,12 +109,12 @@ pub struct Ascription<'tcx> { /// requires that `&'static str <: T_x`, where `T_x` is the type of `x`. Really, we should /// probably be checking for a `PartialEq` impl instead, but this preserves the behavior /// of the old type-check for now. See #57280 for details. - pub variance: ty::Variance, - pub user_ty_span: Span, + crate variance: ty::Variance, + crate user_ty_span: Span, } #[derive(Clone, Debug)] -pub enum PatKind<'tcx> { +crate enum PatKind<'tcx> { Wild, AscribeUserType { @@ -186,10 +182,10 @@ pub enum PatKind<'tcx> { } #[derive(Copy, Clone, Debug, PartialEq)] -pub struct PatRange<'tcx> { - pub lo: &'tcx ty::Const<'tcx>, - pub hi: &'tcx ty::Const<'tcx>, - pub end: RangeEnd, +crate struct PatRange<'tcx> { + crate lo: &'tcx ty::Const<'tcx>, + crate hi: &'tcx ty::Const<'tcx>, + crate end: RangeEnd, } impl<'tcx> fmt::Display for Pat<'tcx> { @@ -208,14 +204,16 @@ impl<'tcx> fmt::Display for Pat<'tcx> { match *self.kind { PatKind::Wild => write!(f, "_"), - PatKind::AscribeUserType { ref subpattern, .. } => - write!(f, "{}: _", subpattern), + PatKind::AscribeUserType { ref subpattern, .. } => write!(f, "{}: _", subpattern), PatKind::Binding { mutability, name, mode, ref subpattern, .. } => { let is_mut = match mode { BindingMode::ByValue => mutability == Mutability::Mut, BindingMode::ByRef(bk) => { write!(f, "ref ")?; - match bk { BorrowKind::Mut { .. } => true, _ => false } + match bk { + BorrowKind::Mut { .. } => true, + _ => false, + } } }; if is_mut { @@ -227,20 +225,21 @@ impl<'tcx> fmt::Display for Pat<'tcx> { } Ok(()) } - PatKind::Variant { ref subpatterns, .. } | - PatKind::Leaf { ref subpatterns } => { + PatKind::Variant { ref subpatterns, .. } | PatKind::Leaf { ref subpatterns } => { let variant = match *self.kind { PatKind::Variant { adt_def, variant_index, .. } => { Some(&adt_def.variants[variant_index]) } - _ => if let ty::Adt(adt, _) = self.ty.kind { - if !adt.is_enum() { - Some(&adt.variants[VariantIdx::new(0)]) + _ => { + if let ty::Adt(adt, _) = self.ty.kind { + if !adt.is_enum() { + Some(&adt.variants[VariantIdx::new(0)]) + } else { + None + } } else { None } - } else { - None } }; @@ -302,20 +301,18 @@ impl<'tcx> fmt::Display for Pat<'tcx> { ty::Ref(_, _, mutbl) => { write!(f, "&{}", mutbl.prefix_str())?; } - _ => bug!("{} is a bad Deref pattern type", self.ty) + _ => bug!("{} is a bad Deref pattern type", self.ty), } write!(f, "{}", subpattern) } - PatKind::Constant { value } => { - write!(f, "{}", value) - } + PatKind::Constant { value } => write!(f, "{}", value), PatKind::Range(PatRange { lo, hi, end }) => { write!(f, "{}", lo)?; write!(f, "{}", end)?; write!(f, "{}", hi) } - PatKind::Slice { ref prefix, ref slice, ref suffix } | - PatKind::Array { ref prefix, ref slice, ref suffix } => { + PatKind::Slice { ref prefix, ref slice, ref suffix } + | PatKind::Array { ref prefix, ref slice, ref suffix } => { write!(f, "[")?; for p in prefix { write!(f, "{}{}", start_or_comma(), p)?; @@ -324,7 +321,7 @@ impl<'tcx> fmt::Display for Pat<'tcx> { write!(f, "{}", start_or_comma())?; match *slice.kind { PatKind::Wild => {} - _ => write!(f, "{}", slice)? + _ => write!(f, "{}", slice)?, } write!(f, "..")?; } @@ -343,23 +340,22 @@ impl<'tcx> fmt::Display for Pat<'tcx> { } } -pub struct PatCtxt<'a, 'tcx> { - pub tcx: TyCtxt<'tcx>, - pub param_env: ty::ParamEnv<'tcx>, - pub tables: &'a ty::TypeckTables<'tcx>, - pub substs: SubstsRef<'tcx>, - pub errors: Vec, +crate struct PatCtxt<'a, 'tcx> { + crate tcx: TyCtxt<'tcx>, + crate param_env: ty::ParamEnv<'tcx>, + crate tables: &'a ty::TypeckTables<'tcx>, + crate errors: Vec, include_lint_checks: bool, } impl<'a, 'tcx> Pat<'tcx> { - pub fn from_hir( + crate fn from_hir( tcx: TyCtxt<'tcx>, - param_env_and_substs: ty::ParamEnvAnd<'tcx, SubstsRef<'tcx>>, + param_env: ty::ParamEnv<'tcx>, tables: &'a ty::TypeckTables<'tcx>, - pat: &'tcx hir::Pat, + pat: &'tcx hir::Pat<'tcx>, ) -> Self { - let mut pcx = PatCtxt::new(tcx, param_env_and_substs, tables); + let mut pcx = PatCtxt::new(tcx, param_env, tables); let result = pcx.lower_pattern(pat); if !pcx.errors.is_empty() { let msg = format!("encountered errors lowering pattern: {:?}", pcx.errors); @@ -371,27 +367,20 @@ impl<'a, 'tcx> Pat<'tcx> { } impl<'a, 'tcx> PatCtxt<'a, 'tcx> { - pub fn new( + crate fn new( tcx: TyCtxt<'tcx>, - param_env_and_substs: ty::ParamEnvAnd<'tcx, SubstsRef<'tcx>>, + param_env: ty::ParamEnv<'tcx>, tables: &'a ty::TypeckTables<'tcx>, ) -> Self { - PatCtxt { - tcx, - param_env: param_env_and_substs.param_env, - tables, - substs: param_env_and_substs.value, - errors: vec![], - include_lint_checks: false, - } + PatCtxt { tcx, param_env, tables, errors: vec![], include_lint_checks: false } } - pub fn include_lint_checks(&mut self) -> &mut Self { + crate fn include_lint_checks(&mut self) -> &mut Self { self.include_lint_checks = true; self } - pub fn lower_pattern(&mut self, pat: &'tcx hir::Pat) -> Pat<'tcx> { + crate fn lower_pattern(&mut self, pat: &'tcx hir::Pat<'tcx>) -> Pat<'tcx> { // When implicit dereferences have been inserted in this pattern, the unadjusted lowered // pattern has the type that results *after* dereferencing. For example, in this code: // @@ -412,122 +401,144 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { // adjustments in *reverse order* (last-in-first-out, so that the last `Deref` inserted // gets the least-dereferenced type). let unadjusted_pat = self.lower_pattern_unadjusted(pat); - self.tables - .pat_adjustments() - .get(pat.hir_id) - .unwrap_or(&vec![]) - .iter() - .rev() - .fold(unadjusted_pat, |pat, ref_ty| { - debug!("{:?}: wrapping pattern with type {:?}", pat, ref_ty); - Pat { - span: pat.span, - ty: ref_ty, - kind: Box::new(PatKind::Deref { subpattern: pat }), - } - }, - ) + self.tables.pat_adjustments().get(pat.hir_id).unwrap_or(&vec![]).iter().rev().fold( + unadjusted_pat, + |pat, ref_ty| { + debug!("{:?}: wrapping pattern with type {:?}", pat, ref_ty); + Pat { + span: pat.span, + ty: ref_ty, + kind: Box::new(PatKind::Deref { subpattern: pat }), + } + }, + ) } fn lower_range_expr( &mut self, - expr: &'tcx hir::Expr, + expr: &'tcx hir::Expr<'tcx>, ) -> (PatKind<'tcx>, Option>) { match self.lower_lit(expr) { - PatKind::AscribeUserType { - ascription: lo_ascription, - subpattern: Pat { kind: box kind, .. }, - } => (kind, Some(lo_ascription)), + PatKind::AscribeUserType { ascription, subpattern: Pat { kind: box kind, .. } } => { + (kind, Some(ascription)) + } kind => (kind, None), } } - fn lower_pattern_unadjusted(&mut self, pat: &'tcx hir::Pat) -> Pat<'tcx> { + fn lower_pattern_range( + &mut self, + ty: Ty<'tcx>, + lo: &'tcx ty::Const<'tcx>, + hi: &'tcx ty::Const<'tcx>, + end: RangeEnd, + span: Span, + ) -> PatKind<'tcx> { + assert_eq!(lo.ty, ty); + assert_eq!(hi.ty, ty); + let cmp = compare_const_vals(self.tcx, lo, hi, self.param_env, ty); + match (end, cmp) { + // `x..y` where `x < y`. + // Non-empty because the range includes at least `x`. + (RangeEnd::Excluded, Some(Ordering::Less)) => PatKind::Range(PatRange { lo, hi, end }), + // `x..y` where `x >= y`. The range is empty => error. + (RangeEnd::Excluded, _) => { + struct_span_err!( + self.tcx.sess, + span, + E0579, + "lower range bound must be less than upper" + ) + .emit(); + PatKind::Wild + } + // `x..=y` where `x == y`. + (RangeEnd::Included, Some(Ordering::Equal)) => PatKind::Constant { value: lo }, + // `x..=y` where `x < y`. + (RangeEnd::Included, Some(Ordering::Less)) => PatKind::Range(PatRange { lo, hi, end }), + // `x..=y` where `x > y` hence the range is empty => error. + (RangeEnd::Included, _) => { + let mut err = struct_span_err!( + self.tcx.sess, + span, + E0030, + "lower range bound must be less than or equal to upper" + ); + err.span_label(span, "lower bound larger than upper bound"); + if self.tcx.sess.teach(&err.get_code().unwrap()) { + err.note( + "When matching against a range, the compiler \ + verifies that the range is non-empty. Range \ + patterns include both end-points, so this is \ + equivalent to requiring the start of the range \ + to be less than or equal to the end of the range.", + ); + } + err.emit(); + PatKind::Wild + } + } + } + + fn normalize_range_pattern_ends( + &self, + ty: Ty<'tcx>, + lo: Option<&PatKind<'tcx>>, + hi: Option<&PatKind<'tcx>>, + ) -> Option<(&'tcx ty::Const<'tcx>, &'tcx ty::Const<'tcx>)> { + match (lo, hi) { + (Some(PatKind::Constant { value: lo }), Some(PatKind::Constant { value: hi })) => { + Some((lo, hi)) + } + (Some(PatKind::Constant { value: lo }), None) => { + Some((lo, ty.numeric_max_val(self.tcx)?)) + } + (None, Some(PatKind::Constant { value: hi })) => { + Some((ty.numeric_min_val(self.tcx)?, hi)) + } + _ => None, + } + } + + fn lower_pattern_unadjusted(&mut self, pat: &'tcx hir::Pat<'tcx>) -> Pat<'tcx> { let mut ty = self.tables.node_type(pat.hir_id); + if let ty::Error = ty.kind { + // Avoid ICEs (e.g., #50577 and #50585). + return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; + } + let kind = match pat.kind { hir::PatKind::Wild => PatKind::Wild, hir::PatKind::Lit(ref value) => self.lower_lit(value), hir::PatKind::Range(ref lo_expr, ref hi_expr, end) => { - let (lo, lo_ascription) = self.lower_range_expr(lo_expr); - let (hi, hi_ascription) = self.lower_range_expr(hi_expr); - - let mut kind = match (lo, hi) { - (PatKind::Constant { value: lo }, PatKind::Constant { value: hi }) => { - assert_eq!(lo.ty, ty); - assert_eq!(hi.ty, ty); - let cmp = compare_const_vals( - self.tcx, - lo, - hi, - self.param_env, - ty, - ); - match (end, cmp) { - (RangeEnd::Excluded, Some(Ordering::Less)) => - PatKind::Range(PatRange { lo, hi, end }), - (RangeEnd::Excluded, _) => { - span_err!( - self.tcx.sess, - lo_expr.span, - E0579, - "lower range bound must be less than upper", - ); - PatKind::Wild - } - (RangeEnd::Included, Some(Ordering::Equal)) => { - PatKind::Constant { value: lo } - } - (RangeEnd::Included, Some(Ordering::Less)) => { - PatKind::Range(PatRange { lo, hi, end }) - } - (RangeEnd::Included, _) => { - let mut err = struct_span_err!( - self.tcx.sess, - lo_expr.span, - E0030, - "lower range bound must be less than or equal to upper" - ); - err.span_label( - lo_expr.span, - "lower bound larger than upper bound", - ); - if self.tcx.sess.teach(&err.get_code().unwrap()) { - err.note("When matching against a range, the compiler \ - verifies that the range is non-empty. Range \ - patterns include both end-points, so this is \ - equivalent to requiring the start of the range \ - to be less than or equal to the end of the range."); - } - err.emit(); - PatKind::Wild - } - } - }, - ref pats => { - self.tcx.sess.delay_span_bug( - pat.span, - &format!( - "found bad range pattern `{:?}` outside of error recovery", - pats, - ), + let (lo_expr, hi_expr) = (lo_expr.as_deref(), hi_expr.as_deref()); + let lo_span = lo_expr.map_or(pat.span, |e| e.span); + let lo = lo_expr.map(|e| self.lower_range_expr(e)); + let hi = hi_expr.map(|e| self.lower_range_expr(e)); + + let (lp, hp) = (lo.as_ref().map(|x| &x.0), hi.as_ref().map(|x| &x.0)); + let mut kind = match self.normalize_range_pattern_ends(ty, lp, hp) { + Some((lc, hc)) => self.lower_pattern_range(ty, lc, hc, end, lo_span), + None => { + let msg = &format!( + "found bad range pattern `{:?}` outside of error recovery", + (&lo, &hi), ); - + self.tcx.sess.delay_span_bug(pat.span, msg); PatKind::Wild - }, + } }; // If we are handling a range with associated constants (e.g. // `Foo::<'a>::A..=Foo::B`), we need to put the ascriptions for the associated // constants somewhere. Have them on the range pattern. - for ascription in &[lo_ascription, hi_ascription] { - if let Some(ascription) = ascription { - kind = PatKind::AscribeUserType { - ascription: *ascription, - subpattern: Pat { span: pat.span, ty, kind: Box::new(kind), }, - }; + for end in &[lo, hi] { + if let Some((_, Some(ascription))) = end { + let subpattern = Pat { span: pat.span, ty, kind: Box::new(kind) }; + kind = PatKind::AscribeUserType { ascription: *ascription, subpattern }; } } @@ -538,87 +549,47 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { return self.lower_path(qpath, pat.hir_id, pat.span); } - hir::PatKind::Ref(ref subpattern, _) | - hir::PatKind::Box(ref subpattern) => { + hir::PatKind::Ref(ref subpattern, _) | hir::PatKind::Box(ref subpattern) => { PatKind::Deref { subpattern: self.lower_pattern(subpattern) } } hir::PatKind::Slice(ref prefix, ref slice, ref suffix) => { - match ty.kind { - ty::Ref(_, ty, _) => - PatKind::Deref { - subpattern: Pat { - ty, - span: pat.span, - kind: Box::new(self.slice_or_array_pattern( - pat.span, ty, prefix, slice, suffix)) - }, - }, - ty::Slice(..) | - ty::Array(..) => - self.slice_or_array_pattern(pat.span, ty, prefix, slice, suffix), - ty::Error => { // Avoid ICE - return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; - } - _ => - span_bug!( - pat.span, - "unexpanded type for vector pattern: {:?}", - ty), - } + self.slice_or_array_pattern(pat.span, ty, prefix, slice, suffix) } - hir::PatKind::Tuple(ref subpatterns, ddpos) => { - match ty.kind { - ty::Tuple(ref tys) => { - let subpatterns = - subpatterns.iter() - .enumerate_and_adjust(tys.len(), ddpos) - .map(|(i, subpattern)| FieldPat { - field: Field::new(i), - pattern: self.lower_pattern(subpattern) - }) - .collect(); - - PatKind::Leaf { subpatterns } - } - ty::Error => { // Avoid ICE (#50577) - return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; - } + hir::PatKind::Tuple(ref pats, ddpos) => { + let tys = match ty.kind { + ty::Tuple(ref tys) => tys, _ => span_bug!(pat.span, "unexpected type for tuple pattern: {:?}", ty), - } + }; + let subpatterns = self.lower_tuple_subpats(pats, tys.len(), ddpos); + PatKind::Leaf { subpatterns } } hir::PatKind::Binding(_, id, ident, ref sub) => { - let var_ty = self.tables.node_type(pat.hir_id); - if let ty::Error = var_ty.kind { - // Avoid ICE - return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; - }; - let bm = *self.tables.pat_binding_modes().get(pat.hir_id) - .expect("missing binding mode"); + let bm = + *self.tables.pat_binding_modes().get(pat.hir_id).expect("missing binding mode"); let (mutability, mode) = match bm { - ty::BindByValue(hir::Mutability::Mutable) => - (Mutability::Mut, BindingMode::ByValue), - ty::BindByValue(hir::Mutability::Immutable) => - (Mutability::Not, BindingMode::ByValue), - ty::BindByReference(hir::Mutability::Mutable) => - (Mutability::Not, BindingMode::ByRef( - BorrowKind::Mut { allow_two_phase_borrow: false })), - ty::BindByReference(hir::Mutability::Immutable) => - (Mutability::Not, BindingMode::ByRef( - BorrowKind::Shared)), + ty::BindByValue(mutbl) => (mutbl, BindingMode::ByValue), + ty::BindByReference(hir::Mutability::Mut) => ( + Mutability::Not, + BindingMode::ByRef(BorrowKind::Mut { allow_two_phase_borrow: false }), + ), + ty::BindByReference(hir::Mutability::Not) => { + (Mutability::Not, BindingMode::ByRef(BorrowKind::Shared)) + } }; // A ref x pattern is the same node used for x, and as such it has // x's type, which is &T, where we want T (the type being matched). + let var_ty = ty; if let ty::BindByReference(_) = bm { if let ty::Ref(_, rty, _) = ty.kind { ty = rty; } else { bug!("`ref {}` has wrong type {}", ident, ty); } - } + }; PatKind::Binding { mutability, @@ -630,135 +601,80 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { } } - hir::PatKind::TupleStruct(ref qpath, ref subpatterns, ddpos) => { + hir::PatKind::TupleStruct(ref qpath, ref pats, ddpos) => { let res = self.tables.qpath_res(qpath, pat.hir_id); let adt_def = match ty.kind { ty::Adt(adt_def, _) => adt_def, - ty::Error => { // Avoid ICE (#50585) - return Pat { span: pat.span, ty, kind: Box::new(PatKind::Wild) }; - } - _ => span_bug!(pat.span, - "tuple struct pattern not applied to an ADT {:?}", - ty), + _ => span_bug!(pat.span, "tuple struct pattern not applied to an ADT {:?}", ty), }; let variant_def = adt_def.variant_of_res(res); - - let subpatterns = - subpatterns.iter() - .enumerate_and_adjust(variant_def.fields.len(), ddpos) - .map(|(i, field)| FieldPat { - field: Field::new(i), - pattern: self.lower_pattern(field), - }) - .collect(); - + let subpatterns = self.lower_tuple_subpats(pats, variant_def.fields.len(), ddpos); self.lower_variant_or_leaf(res, pat.hir_id, pat.span, ty, subpatterns) } hir::PatKind::Struct(ref qpath, ref fields, _) => { let res = self.tables.qpath_res(qpath, pat.hir_id); - let subpatterns = - fields.iter() - .map(|field| { - FieldPat { - field: Field::new(self.tcx.field_index(field.hir_id, - self.tables)), - pattern: self.lower_pattern(&field.pat), - } - }) - .collect(); + let subpatterns = fields + .iter() + .map(|field| FieldPat { + field: Field::new(self.tcx.field_index(field.hir_id, self.tables)), + pattern: self.lower_pattern(&field.pat), + }) + .collect(); self.lower_variant_or_leaf(res, pat.hir_id, pat.span, ty, subpatterns) } - hir::PatKind::Or(ref pats) => { - PatKind::Or { - pats: pats.iter().map(|p| self.lower_pattern(p)).collect(), - } - } + hir::PatKind::Or(ref pats) => PatKind::Or { pats: self.lower_patterns(pats) }, }; - Pat { - span: pat.span, - ty, - kind: Box::new(kind), - } + Pat { span: pat.span, ty, kind: Box::new(kind) } } - fn lower_patterns(&mut self, pats: &'tcx [P]) -> Vec> { - pats.iter().map(|p| self.lower_pattern(p)).collect() + fn lower_tuple_subpats( + &mut self, + pats: &'tcx [&'tcx hir::Pat<'tcx>], + expected_len: usize, + gap_pos: Option, + ) -> Vec> { + pats.iter() + .enumerate_and_adjust(expected_len, gap_pos) + .map(|(i, subpattern)| FieldPat { + field: Field::new(i), + pattern: self.lower_pattern(subpattern), + }) + .collect() } - fn lower_opt_pattern(&mut self, pat: &'tcx Option>) -> Option> - { - pat.as_ref().map(|p| self.lower_pattern(p)) + fn lower_patterns(&mut self, pats: &'tcx [&'tcx hir::Pat<'tcx>]) -> Vec> { + pats.iter().map(|p| self.lower_pattern(p)).collect() } - fn flatten_nested_slice_patterns( - &mut self, - prefix: Vec>, - slice: Option>, - suffix: Vec>) - -> (Vec>, Option>, Vec>) - { - let orig_slice = match slice { - Some(orig_slice) => orig_slice, - None => return (prefix, slice, suffix) - }; - let orig_prefix = prefix; - let orig_suffix = suffix; - - // dance because of intentional borrow-checker stupidity. - let kind = *orig_slice.kind; - match kind { - PatKind::Slice { prefix, slice, mut suffix } | - PatKind::Array { prefix, slice, mut suffix } => { - let mut orig_prefix = orig_prefix; - - orig_prefix.extend(prefix); - suffix.extend(orig_suffix); - - (orig_prefix, slice, suffix) - } - _ => { - (orig_prefix, Some(Pat { - kind: box kind, ..orig_slice - }), orig_suffix) - } - } + fn lower_opt_pattern(&mut self, pat: &'tcx Option<&'tcx hir::Pat<'tcx>>) -> Option> { + pat.as_ref().map(|p| self.lower_pattern(p)) } fn slice_or_array_pattern( &mut self, span: Span, ty: Ty<'tcx>, - prefix: &'tcx [P], - slice: &'tcx Option>, - suffix: &'tcx [P]) - -> PatKind<'tcx> - { + prefix: &'tcx [&'tcx hir::Pat<'tcx>], + slice: &'tcx Option<&'tcx hir::Pat<'tcx>>, + suffix: &'tcx [&'tcx hir::Pat<'tcx>], + ) -> PatKind<'tcx> { let prefix = self.lower_patterns(prefix); let slice = self.lower_opt_pattern(slice); let suffix = self.lower_patterns(suffix); - let (prefix, slice, suffix) = - self.flatten_nested_slice_patterns(prefix, slice, suffix); - match ty.kind { - ty::Slice(..) => { - // matching a slice or fixed-length array - PatKind::Slice { prefix: prefix, slice: slice, suffix: suffix } - } - + // Matching a slice, `[T]`. + ty::Slice(..) => PatKind::Slice { prefix, slice, suffix }, + // Fixed-length array, `[T; len]`. ty::Array(_, len) => { - // fixed-length array let len = len.eval_usize(self.tcx, self.param_env); assert!(len >= prefix.len() as u64 + suffix.len() as u64); - PatKind::Array { prefix: prefix, slice: slice, suffix: suffix } - } - - _ => { - span_bug!(span, "bad slice pattern type {:?}", ty); + PatKind::Array { prefix, slice, suffix } } + _ => span_bug!(span, "bad slice pattern type {:?}", ty), } } @@ -774,7 +690,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_id) => { let variant_id = self.tcx.parent(variant_ctor_id).unwrap(); Res::Def(DefKind::Variant, variant_id) - }, + } res => res, }; @@ -784,9 +700,9 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { let adt_def = self.tcx.adt_def(enum_id); if adt_def.is_enum() { let substs = match ty.kind { - ty::Adt(_, substs) | - ty::FnDef(_, substs) => substs, - ty::Error => { // Avoid ICE (#50585) + ty::Adt(_, substs) | ty::FnDef(_, substs) => substs, + ty::Error => { + // Avoid ICE (#50585) return PatKind::Wild; } _ => bug!("inappropriate type for def: {:?}", ty), @@ -808,9 +724,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { | Res::Def(DefKind::TyAlias, _) | Res::Def(DefKind::AssocTy, _) | Res::SelfTy(..) - | Res::SelfCtor(..) => { - PatKind::Leaf { subpatterns } - } + | Res::SelfCtor(..) => PatKind::Leaf { subpatterns }, _ => { self.errors.push(PatternError::NonConstPath(span)); @@ -821,11 +735,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { if let Some(user_ty) = self.user_substs_applied_to_ty_of_hir_id(hir_id) { debug!("lower_variant_or_leaf: kind={:?} user_ty={:?} span={:?}", kind, user_ty, span); kind = PatKind::AscribeUserType { - subpattern: Pat { - span, - ty, - kind: Box::new(kind), - }, + subpattern: Pat { span, ty, kind: Box::new(kind) }, ascription: Ascription { user_ty: PatTyProj::from_user_type(user_ty), user_ty_span: span, @@ -840,11 +750,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { /// Takes a HIR Path. If the path is a constant, evaluates it and feeds /// it to `const_to_pat`. Any other path (like enum variants without fields) /// is converted to the corresponding pattern via `lower_variant_or_leaf`. - fn lower_path(&mut self, - qpath: &hir::QPath, - id: hir::HirId, - span: Span) - -> Pat<'tcx> { + fn lower_path(&mut self, qpath: &hir::QPath<'_>, id: hir::HirId, span: Span) -> Pat<'tcx> { let ty = self.tables.node_type(id); let res = self.tables.qpath_res(qpath, id); let is_associated_const = match res { @@ -854,119 +760,96 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { let kind = match res { Res::Def(DefKind::Const, def_id) | Res::Def(DefKind::AssocConst, def_id) => { let substs = self.tables.node_substs(id); - match ty::Instance::resolve( - self.tcx, - self.param_env, + // Use `Reveal::All` here because patterns are always monomorphic even if their function isn't. + match self.tcx.const_eval_resolve( + self.param_env.with_reveal_all(), def_id, substs, + None, + Some(span), ) { - Some(instance) => { - let cid = GlobalId { - instance, - promoted: None, - }; - match self.tcx.at(span).const_eval(self.param_env.and(cid)) { - Ok(value) => { - let pattern = self.const_to_pat(value, id, span); - if !is_associated_const { - return pattern; - } - - let user_provided_types = self.tables().user_provided_types(); - return if let Some(u_ty) = user_provided_types.get(id) { - let user_ty = PatTyProj::from_user_type(*u_ty); - Pat { - span, - kind: Box::new( - PatKind::AscribeUserType { - subpattern: pattern, - ascription: Ascription { - /// Note that use `Contravariant` here. See the - /// `variance` field documentation for details. - variance: ty::Variance::Contravariant, - user_ty, - user_ty_span: span, - }, - } - ), - ty: value.ty, - } - } else { - pattern - } - }, - Err(_) => { - self.tcx.sess.span_err( - span, - "could not evaluate constant pattern", - ); - PatKind::Wild - } + Ok(value) => { + let pattern = self.const_to_pat(value, id, span); + if !is_associated_const { + return pattern; } - }, - None => { + + let user_provided_types = self.tables().user_provided_types(); + return if let Some(u_ty) = user_provided_types.get(id) { + let user_ty = PatTyProj::from_user_type(*u_ty); + Pat { + span, + kind: Box::new(PatKind::AscribeUserType { + subpattern: pattern, + ascription: Ascription { + /// Note that use `Contravariant` here. See the + /// `variance` field documentation for details. + variance: ty::Variance::Contravariant, + user_ty, + user_ty_span: span, + }, + }), + ty: value.ty, + } + } else { + pattern + }; + } + Err(ErrorHandled::TooGeneric) => { self.errors.push(if is_associated_const { PatternError::AssocConstInPattern(span) } else { PatternError::StaticInPattern(span) }); PatKind::Wild - }, + } + Err(_) => { + self.tcx.sess.span_err(span, "could not evaluate constant pattern"); + PatKind::Wild + } } } _ => self.lower_variant_or_leaf(res, id, span, ty, vec![]), }; - Pat { - span, - ty, - kind: Box::new(kind), - } + Pat { span, ty, kind: Box::new(kind) } } /// Converts literals, paths and negation of literals to patterns. /// The special case for negation exists to allow things like `-128_i8` /// which would overflow if we tried to evaluate `128_i8` and then negate /// afterwards. - fn lower_lit(&mut self, expr: &'tcx hir::Expr) -> PatKind<'tcx> { - match expr.kind { - hir::ExprKind::Lit(ref lit) => { - let ty = self.tables.expr_ty(expr); - match lit_to_const(&lit.node, self.tcx, ty, false) { - Ok(val) => { - *self.const_to_pat(val, expr.hir_id, lit.span).kind - }, - Err(LitToConstError::UnparseableFloat) => { - self.errors.push(PatternError::FloatBug); - PatKind::Wild - }, - Err(LitToConstError::Reported) => PatKind::Wild, + fn lower_lit(&mut self, expr: &'tcx hir::Expr<'tcx>) -> PatKind<'tcx> { + if let hir::ExprKind::Path(ref qpath) = expr.kind { + *self.lower_path(qpath, expr.hir_id, expr.span).kind + } else { + let (lit, neg) = match expr.kind { + hir::ExprKind::Lit(ref lit) => (lit, false), + hir::ExprKind::Unary(hir::UnOp::UnNeg, ref expr) => { + let lit = match expr.kind { + hir::ExprKind::Lit(ref lit) => lit, + _ => span_bug!(expr.span, "not a literal: {:?}", expr), + }; + (lit, true) } - }, - hir::ExprKind::Path(ref qpath) => *self.lower_path(qpath, expr.hir_id, expr.span).kind, - hir::ExprKind::Unary(hir::UnNeg, ref expr) => { - let ty = self.tables.expr_ty(expr); - let lit = match expr.kind { - hir::ExprKind::Lit(ref lit) => lit, - _ => span_bug!(expr.span, "not a literal: {:?}", expr), - }; - match lit_to_const(&lit.node, self.tcx, ty, true) { - Ok(val) => { - *self.const_to_pat(val, expr.hir_id, lit.span).kind - }, - Err(LitToConstError::UnparseableFloat) => { - self.errors.push(PatternError::FloatBug); - PatKind::Wild - }, - Err(LitToConstError::Reported) => PatKind::Wild, + _ => span_bug!(expr.span, "not a literal: {:?}", expr), + }; + + let lit_input = LitToConstInput { lit: &lit.node, ty: self.tables.expr_ty(expr), neg }; + match self.tcx.at(expr.span).lit_to_const(lit_input) { + Ok(val) => *self.const_to_pat(val, expr.hir_id, lit.span).kind, + Err(LitToConstError::UnparseableFloat) => { + self.errors.push(PatternError::FloatBug); + PatKind::Wild } + Err(LitToConstError::Reported) => PatKind::Wild, + Err(LitToConstError::TypeError) => bug!("lower_lit: had type error"), } - _ => span_bug!(expr.span, "not a literal: {:?}", expr), } } } -impl UserAnnotatedTyHelpers<'tcx> for PatCtxt<'_, 'tcx> { +impl<'tcx> UserAnnotatedTyHelpers<'tcx> for PatCtxt<'_, 'tcx> { fn tcx(&self) -> TyCtxt<'tcx> { self.tcx } @@ -976,8 +859,7 @@ impl UserAnnotatedTyHelpers<'tcx> for PatCtxt<'_, 'tcx> { } } - -pub trait PatternFoldable<'tcx> : Sized { +crate trait PatternFoldable<'tcx>: Sized { fn fold_with>(&self, folder: &mut F) -> Self { self.super_fold_with(folder) } @@ -985,7 +867,7 @@ pub trait PatternFoldable<'tcx> : Sized { fn super_fold_with>(&self, folder: &mut F) -> Self; } -pub trait PatternFolder<'tcx> : Sized { +crate trait PatternFolder<'tcx>: Sized { fn fold_pattern(&mut self, pattern: &Pat<'tcx>) -> Pat<'tcx> { pattern.super_fold_with(self) } @@ -995,7 +877,6 @@ pub trait PatternFolder<'tcx> : Sized { } } - impl<'tcx, T: PatternFoldable<'tcx>> PatternFoldable<'tcx> for Box { fn super_fold_with>(&self, folder: &mut F) -> Self { let content: T = (**self).fold_with(folder); @@ -1010,7 +891,7 @@ impl<'tcx, T: PatternFoldable<'tcx>> PatternFoldable<'tcx> for Vec { } impl<'tcx, T: PatternFoldable<'tcx>> PatternFoldable<'tcx> for Option { - fn super_fold_with>(&self, folder: &mut F) -> Self{ + fn super_fold_with>(&self, folder: &mut F) -> Self { self.as_ref().map(|t| t.fold_with(folder)) } } @@ -1027,7 +908,7 @@ macro_rules! CloneImpls { } } -CloneImpls!{ <'tcx> +CloneImpls! { <'tcx> Span, Field, Mutability, ast::Name, hir::HirId, usize, ty::Const<'tcx>, Region<'tcx>, Ty<'tcx>, BindingMode, &'tcx AdtDef, SubstsRef<'tcx>, &'tcx GenericArg<'tcx>, UserType<'tcx>, @@ -1036,10 +917,7 @@ CloneImpls!{ <'tcx> impl<'tcx> PatternFoldable<'tcx> for FieldPat<'tcx> { fn super_fold_with>(&self, folder: &mut F) -> Self { - FieldPat { - field: self.field.fold_with(folder), - pattern: self.pattern.fold_with(folder) - } + FieldPat { field: self.field.fold_with(folder), pattern: self.pattern.fold_with(folder) } } } @@ -1052,7 +930,7 @@ impl<'tcx> PatternFoldable<'tcx> for Pat<'tcx> { Pat { ty: self.ty.fold_with(folder), span: self.span.fold_with(folder), - kind: self.kind.fold_with(folder) + kind: self.kind.fold_with(folder), } } } @@ -1067,11 +945,7 @@ impl<'tcx> PatternFoldable<'tcx> for PatKind<'tcx> { PatKind::Wild => PatKind::Wild, PatKind::AscribeUserType { ref subpattern, - ascription: Ascription { - variance, - ref user_ty, - user_ty_span, - }, + ascription: Ascription { variance, ref user_ty, user_ty_span }, } => PatKind::AscribeUserType { subpattern: subpattern.fold_with(folder), ascription: Ascription { @@ -1080,72 +954,48 @@ impl<'tcx> PatternFoldable<'tcx> for PatKind<'tcx> { user_ty_span, }, }, - PatKind::Binding { - mutability, - name, - mode, - var, - ty, - ref subpattern, - } => PatKind::Binding { - mutability: mutability.fold_with(folder), - name: name.fold_with(folder), - mode: mode.fold_with(folder), - var: var.fold_with(folder), - ty: ty.fold_with(folder), - subpattern: subpattern.fold_with(folder), - }, - PatKind::Variant { - adt_def, - substs, - variant_index, - ref subpatterns, - } => PatKind::Variant { - adt_def: adt_def.fold_with(folder), - substs: substs.fold_with(folder), - variant_index, - subpatterns: subpatterns.fold_with(folder) - }, - PatKind::Leaf { - ref subpatterns, - } => PatKind::Leaf { - subpatterns: subpatterns.fold_with(folder), - }, - PatKind::Deref { - ref subpattern, - } => PatKind::Deref { - subpattern: subpattern.fold_with(folder), - }, - PatKind::Constant { - value - } => PatKind::Constant { - value, - }, + PatKind::Binding { mutability, name, mode, var, ty, ref subpattern } => { + PatKind::Binding { + mutability: mutability.fold_with(folder), + name: name.fold_with(folder), + mode: mode.fold_with(folder), + var: var.fold_with(folder), + ty: ty.fold_with(folder), + subpattern: subpattern.fold_with(folder), + } + } + PatKind::Variant { adt_def, substs, variant_index, ref subpatterns } => { + PatKind::Variant { + adt_def: adt_def.fold_with(folder), + substs: substs.fold_with(folder), + variant_index, + subpatterns: subpatterns.fold_with(folder), + } + } + PatKind::Leaf { ref subpatterns } => { + PatKind::Leaf { subpatterns: subpatterns.fold_with(folder) } + } + PatKind::Deref { ref subpattern } => { + PatKind::Deref { subpattern: subpattern.fold_with(folder) } + } + PatKind::Constant { value } => PatKind::Constant { value }, PatKind::Range(range) => PatKind::Range(range), - PatKind::Slice { - ref prefix, - ref slice, - ref suffix, - } => PatKind::Slice { + PatKind::Slice { ref prefix, ref slice, ref suffix } => PatKind::Slice { prefix: prefix.fold_with(folder), slice: slice.fold_with(folder), - suffix: suffix.fold_with(folder) + suffix: suffix.fold_with(folder), }, - PatKind::Array { - ref prefix, - ref slice, - ref suffix - } => PatKind::Array { + PatKind::Array { ref prefix, ref slice, ref suffix } => PatKind::Array { prefix: prefix.fold_with(folder), slice: slice.fold_with(folder), - suffix: suffix.fold_with(folder) + suffix: suffix.fold_with(folder), }, PatKind::Or { ref pats } => PatKind::Or { pats: pats.fold_with(folder) }, } } } -pub fn compare_const_vals<'tcx>( +crate fn compare_const_vals<'tcx>( tcx: TyCtxt<'tcx>, a: &'tcx ty::Const<'tcx>, b: &'tcx ty::Const<'tcx>, @@ -1163,6 +1013,12 @@ pub fn compare_const_vals<'tcx>( return fallback(); } + // Early return for equal constants (so e.g. references to ZSTs can be compared, even if they + // are just integer addresses). + if a.val == b.val { + return from_bool(true); + } + let a_bits = a.try_eval_bits(tcx, param_env, ty); let b_bits = b.try_eval_bits(tcx, param_env, ty); @@ -1188,13 +1044,15 @@ pub fn compare_const_vals<'tcx>( Some((a as i128).cmp(&(b as i128))) } _ => Some(a.cmp(&b)), - } + }; } if let ty::Str = ty.kind { match (a.val, b.val) { - (ty::ConstKind::Value(a_val @ ConstValue::Slice { .. }), - ty::ConstKind::Value(b_val @ ConstValue::Slice { .. })) => { + ( + ty::ConstKind::Value(a_val @ ConstValue::Slice { .. }), + ty::ConstKind::Value(b_val @ ConstValue::Slice { .. }), + ) => { let a_bytes = get_slice_bytes(&tcx, a_val); let b_bytes = get_slice_bytes(&tcx, b_val); return from_bool(a_bytes == b_bytes); diff --git a/src/librustc_mir/hair/util.rs b/src/librustc_mir_build/hair/util.rs similarity index 85% rename from src/librustc_mir/hair/util.rs rename to src/librustc_mir_build/hair/util.rs index d63541f7a3..c27844ed0d 100644 --- a/src/librustc_mir/hair/util.rs +++ b/src/librustc_mir_build/hair/util.rs @@ -1,5 +1,5 @@ -use rustc::hir; use rustc::ty::{self, CanonicalUserType, TyCtxt, UserType}; +use rustc_hir as hir; crate trait UserAnnotatedTyHelpers<'tcx> { fn tcx(&self) -> TyCtxt<'tcx>; @@ -25,11 +25,7 @@ crate trait UserAnnotatedTyHelpers<'tcx> { Some(user_ty) } ty::FnDef(..) => Some(user_ty), - _ => bug!( - "ty: {:?} should not have user provided type {:?} recorded ", - ty, - user_ty - ), + _ => bug!("ty: {:?} should not have user provided type {:?} recorded ", ty, user_ty), } } } diff --git a/src/librustc_mir_build/lib.rs b/src/librustc_mir_build/lib.rs new file mode 100644 index 0000000000..42292d635b --- /dev/null +++ b/src/librustc_mir_build/lib.rs @@ -0,0 +1,27 @@ +//! Construction of MIR from HIR. +//! +//! This crate also contains the match exhaustiveness and usefulness checking. + +#![feature(box_patterns)] +#![feature(box_syntax)] +#![feature(crate_visibility_modifier)] +#![cfg_attr(bootstrap, feature(slice_patterns))] +#![feature(bool_to_option)] +#![recursion_limit = "256"] + +#[macro_use] +extern crate log; +#[macro_use] +extern crate rustc; + +mod build; +mod hair; +mod lints; + +use rustc::ty::query::Providers; + +pub fn provide(providers: &mut Providers<'_>) { + providers.check_match = hair::pattern::check_match; + providers.lit_to_const = hair::constant::lit_to_const; + providers.mir_built = build::mir_built; +} diff --git a/src/librustc_mir/lints.rs b/src/librustc_mir_build/lints.rs similarity index 74% rename from src/librustc_mir/lints.rs rename to src/librustc_mir_build/lints.rs index 158b730b9b..4244e1b8d8 100644 --- a/src/librustc_mir/lints.rs +++ b/src/librustc_mir_build/lints.rs @@ -1,13 +1,13 @@ -use rustc_index::bit_set::BitSet; -use rustc::hir::def_id::DefId; -use rustc::hir::intravisit::FnKind; use rustc::hir::map::blocks::FnLikeNode; use rustc::lint::builtin::UNCONDITIONAL_RECURSION; use rustc::mir::{self, Body, TerminatorKind}; -use rustc::ty::{self, AssocItem, AssocItemContainer, Instance, TyCtxt}; use rustc::ty::subst::InternalSubsts; +use rustc::ty::{self, AssocItem, AssocItemContainer, Instance, TyCtxt}; +use rustc_hir::def_id::DefId; +use rustc_hir::intravisit::FnKind; +use rustc_index::bit_set::BitSet; -pub fn check(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, def_id: DefId) { +crate fn check<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, def_id: DefId) { let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); if let Some(fn_like_node) = FnLikeNode::from_node(tcx.hir().get(hir_id)) { @@ -15,7 +15,7 @@ pub fn check(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, def_id: DefId) { } } -fn check_fn_for_unconditional_recursion( +fn check_fn_for_unconditional_recursion<'tcx>( tcx: TyCtxt<'tcx>, fn_kind: FnKind<'_>, body: &Body<'tcx>, @@ -61,14 +61,12 @@ fn check_fn_for_unconditional_recursion( let mut visited = BitSet::new_empty(basic_blocks.len()); let param_env = tcx.param_env(def_id); - let trait_substs_count = - match tcx.opt_associated_item(def_id) { - Some(AssocItem { - container: AssocItemContainer::TraitContainer(trait_def_id), - .. - }) => tcx.generics_of(trait_def_id).count(), - _ => 0 - }; + let trait_substs_count = match tcx.opt_associated_item(def_id) { + Some(AssocItem { container: AssocItemContainer::TraitContainer(trait_def_id), .. }) => { + tcx.generics_of(trait_def_id).count() + } + _ => 0, + }; let caller_substs = &InternalSubsts::identity_for_item(tcx, def_id)[..trait_substs_count]; while let Some(bb) = reachable_without_self_call_queue.pop() { @@ -85,19 +83,16 @@ fn check_fn_for_unconditional_recursion( let func_ty = func.ty(body, tcx); if let ty::FnDef(fn_def_id, substs) = func_ty.kind { - let (call_fn_id, call_substs) = - if let Some(instance) = Instance::resolve(tcx, - param_env, - fn_def_id, - substs) { - (instance.def_id(), instance.substs) - } else { - (fn_def_id, substs) - }; - - let is_self_call = - call_fn_id == def_id && - &call_substs[..caller_substs.len()] == caller_substs; + let (call_fn_id, call_substs) = if let Some(instance) = + Instance::resolve(tcx, param_env, fn_def_id, substs) + { + (instance.def_id(), instance.substs) + } else { + (fn_def_id, substs) + }; + + let is_self_call = call_fn_id == def_id + && &call_substs[..caller_substs.len()] == caller_substs; if is_self_call { self_call_locations.push(terminator.source_info); @@ -107,7 +102,7 @@ fn check_fn_for_unconditional_recursion( continue; } } - }, + } TerminatorKind::Abort | TerminatorKind::Return => { //found a path! reached_exit_without_self_call = true; @@ -129,10 +124,12 @@ fn check_fn_for_unconditional_recursion( if !reached_exit_without_self_call && !self_call_locations.is_empty() { let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); let sp = tcx.sess.source_map().def_span(tcx.hir().span(hir_id)); - let mut db = tcx.struct_span_lint_hir(UNCONDITIONAL_RECURSION, - hir_id, - sp, - "function cannot return without recursing"); + let mut db = tcx.struct_span_lint_hir( + UNCONDITIONAL_RECURSION, + hir_id, + sp, + "function cannot return without recursing", + ); db.span_label(sp, "cannot return without recursing"); // offer some help to the programmer. for location in &self_call_locations { diff --git a/src/librustc_msan/Cargo.toml b/src/librustc_msan/Cargo.toml deleted file mode 100644 index bda4078572..0000000000 --- a/src/librustc_msan/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -authors = ["The Rust Project Developers"] -build = "build.rs" -name = "rustc_msan" -version = "0.0.0" -edition = "2018" - -[lib] -name = "rustc_msan" -path = "lib.rs" -test = false - -[build-dependencies] -build_helper = { path = "../build_helper" } -cmake = "0.1.38" - -[dependencies] -alloc = { path = "../liballoc" } -core = { path = "../libcore" } -compiler_builtins = "0.1.0" diff --git a/src/librustc_msan/build.rs b/src/librustc_msan/build.rs deleted file mode 100644 index a81786ee36..0000000000 --- a/src/librustc_msan/build.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::env; -use build_helper::sanitizer_lib_boilerplate; - -use cmake::Config; - -fn main() { - println!("cargo:rerun-if-env-changed=RUSTC_BUILD_SANITIZERS"); - if env::var("RUSTC_BUILD_SANITIZERS") != Ok("1".to_string()) { - return; - } - if let Some(llvm_config) = env::var_os("LLVM_CONFIG") { - build_helper::restore_library_path(); - - let (native, target) = match sanitizer_lib_boilerplate("msan") { - Ok(native) => native, - _ => return, - }; - - Config::new(&native.src_dir) - .define("COMPILER_RT_BUILD_SANITIZERS", "ON") - .define("COMPILER_RT_BUILD_BUILTINS", "OFF") - .define("COMPILER_RT_BUILD_XRAY", "OFF") - .define("LLVM_CONFIG_PATH", llvm_config) - .out_dir(&native.out_dir) - .build_target(&target) - .build(); - } - println!("cargo:rerun-if-env-changed=LLVM_CONFIG"); -} diff --git a/src/librustc_msan/lib.rs b/src/librustc_msan/lib.rs deleted file mode 100644 index d6c8e54c18..0000000000 --- a/src/librustc_msan/lib.rs +++ /dev/null @@ -1,8 +0,0 @@ -#![sanitizer_runtime] -#![feature(nll)] -#![feature(sanitizer_runtime)] -#![feature(staged_api)] -#![no_std] -#![unstable(feature = "sanitizer_runtime_lib", - reason = "internal implementation detail of sanitizers", - issue = "0")] diff --git a/src/librustc_parse/Cargo.toml b/src/librustc_parse/Cargo.toml index fb5cb742ab..8071bc6312 100644 --- a/src/librustc_parse/Cargo.toml +++ b/src/librustc_parse/Cargo.toml @@ -16,7 +16,8 @@ rustc_data_structures = { path = "../librustc_data_structures" } rustc_feature = { path = "../librustc_feature" } rustc_lexer = { path = "../librustc_lexer" } rustc_errors = { path = "../librustc_errors" } -rustc_error_codes = { path = "../librustc_error_codes" } smallvec = { version = "1.0", features = ["union", "may_dangle"] } -syntax_pos = { path = "../libsyntax_pos" } +rustc_session = { path = "../librustc_session" } +rustc_span = { path = "../librustc_span" } syntax = { path = "../libsyntax" } +unicode-normalization = "0.1.11" diff --git a/src/librustc_parse/config.rs b/src/librustc_parse/config.rs index 1e9203f377..bf696faf2f 100644 --- a/src/librustc_parse/config.rs +++ b/src/librustc_parse/config.rs @@ -1,7 +1,7 @@ //! Process the potential `cfg` attributes on a module. //! Also determine if the module should be included in this configuration. //! -//! This module properly belongs in syntax_expand, but for now it's tied into +//! This module properly belongs in rustc_expand, but for now it's tied into //! parsing, so we leave it here to avoid complicated out-of-line dependencies. //! //! A principled solution to this wrong location would be to implement [#64197]. @@ -9,19 +9,22 @@ //! [#64197]: https://github.com/rust-lang/rust/issues/64197 use crate::{parse_in, validate_attr}; -use rustc_feature::Features; -use rustc_errors::Applicability; -use syntax::attr::HasAttrs; -use syntax::feature_gate::{feature_err, get_features}; +use rustc_data_structures::fx::FxHashMap; +use rustc_errors::{error_code, struct_span_err, Applicability, Handler}; +use rustc_feature::{Feature, Features, State as FeatureState}; +use rustc_feature::{ + ACCEPTED_FEATURES, ACTIVE_FEATURES, REMOVED_FEATURES, STABLE_REMOVED_FEATURES, +}; +use rustc_span::edition::{Edition, ALL_EDITIONS}; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::{Span, DUMMY_SP}; +use syntax::ast::{self, AttrItem, Attribute, MetaItem}; use syntax::attr; -use syntax::ast::{self, Attribute, AttrItem, MetaItem}; -use syntax::edition::Edition; +use syntax::attr::HasAttrs; use syntax::mut_visit::*; use syntax::ptr::P; -use syntax::sess::ParseSess; +use syntax::sess::{feature_err, ParseSess}; use syntax::util::map_in_place::MapInPlace; -use syntax_pos::Span; -use syntax_pos::symbol::sym; use smallvec::SmallVec; @@ -31,21 +34,189 @@ pub struct StripUnconfigured<'a> { pub features: Option<&'a Features>, } +fn get_features( + span_handler: &Handler, + krate_attrs: &[ast::Attribute], + crate_edition: Edition, + allow_features: &Option>, +) -> Features { + fn feature_removed(span_handler: &Handler, span: Span, reason: Option<&str>) { + let mut err = struct_span_err!(span_handler, span, E0557, "feature has been removed"); + err.span_label(span, "feature has been removed"); + if let Some(reason) = reason { + err.note(reason); + } + err.emit(); + } + + fn active_features_up_to(edition: Edition) -> impl Iterator { + ACTIVE_FEATURES.iter().filter(move |feature| { + if let Some(feature_edition) = feature.edition { + feature_edition <= edition + } else { + false + } + }) + } + + let mut features = Features::default(); + let mut edition_enabled_features = FxHashMap::default(); + + for &edition in ALL_EDITIONS { + if edition <= crate_edition { + // The `crate_edition` implies its respective umbrella feature-gate + // (i.e., `#![feature(rust_20XX_preview)]` isn't needed on edition 20XX). + edition_enabled_features.insert(edition.feature_name(), edition); + } + } + + for feature in active_features_up_to(crate_edition) { + feature.set(&mut features, DUMMY_SP); + edition_enabled_features.insert(feature.name, crate_edition); + } + + // Process the edition umbrella feature-gates first, to ensure + // `edition_enabled_features` is completed before it's queried. + for attr in krate_attrs { + if !attr.check_name(sym::feature) { + continue; + } + + let list = match attr.meta_item_list() { + Some(list) => list, + None => continue, + }; + + for mi in list { + if !mi.is_word() { + continue; + } + + let name = mi.name_or_empty(); + + let edition = ALL_EDITIONS.iter().find(|e| name == e.feature_name()).copied(); + if let Some(edition) = edition { + if edition <= crate_edition { + continue; + } + + for feature in active_features_up_to(edition) { + // FIXME(Manishearth) there is currently no way to set + // lib features by edition + feature.set(&mut features, DUMMY_SP); + edition_enabled_features.insert(feature.name, edition); + } + } + } + } + + for attr in krate_attrs { + if !attr.check_name(sym::feature) { + continue; + } + + let list = match attr.meta_item_list() { + Some(list) => list, + None => continue, + }; + + let bad_input = |span| { + struct_span_err!(span_handler, span, E0556, "malformed `feature` attribute input") + }; + + for mi in list { + let name = match mi.ident() { + Some(ident) if mi.is_word() => ident.name, + Some(ident) => { + bad_input(mi.span()) + .span_suggestion( + mi.span(), + "expected just one word", + format!("{}", ident.name), + Applicability::MaybeIncorrect, + ) + .emit(); + continue; + } + None => { + bad_input(mi.span()).span_label(mi.span(), "expected just one word").emit(); + continue; + } + }; + + if let Some(edition) = edition_enabled_features.get(&name) { + let msg = + &format!("the feature `{}` is included in the Rust {} edition", name, edition); + span_handler.struct_span_warn_with_code(mi.span(), msg, error_code!(E0705)).emit(); + continue; + } + + if ALL_EDITIONS.iter().any(|e| name == e.feature_name()) { + // Handled in the separate loop above. + continue; + } + + let removed = REMOVED_FEATURES.iter().find(|f| name == f.name); + let stable_removed = STABLE_REMOVED_FEATURES.iter().find(|f| name == f.name); + if let Some(Feature { state, .. }) = removed.or(stable_removed) { + if let FeatureState::Removed { reason } | FeatureState::Stabilized { reason } = + state + { + feature_removed(span_handler, mi.span(), *reason); + continue; + } + } + + if let Some(Feature { since, .. }) = ACCEPTED_FEATURES.iter().find(|f| name == f.name) { + let since = Some(Symbol::intern(since)); + features.declared_lang_features.push((name, mi.span(), since)); + continue; + } + + if let Some(allowed) = allow_features.as_ref() { + if allowed.iter().find(|&f| name.as_str() == *f).is_none() { + struct_span_err!( + span_handler, + mi.span(), + E0725, + "the feature `{}` is not in the list of allowed features", + name + ) + .emit(); + continue; + } + } + + if let Some(f) = ACTIVE_FEATURES.iter().find(|f| name == f.name) { + f.set(&mut features, mi.span()); + features.declared_lang_features.push((name, mi.span(), None)); + continue; + } + + features.declared_lib_features.push((name, mi.span())); + } + } + + features +} + // `cfg_attr`-process the crate's attributes and compute the crate's features. -pub fn features(mut krate: ast::Crate, sess: &ParseSess, edition: Edition, - allow_features: &Option>) -> (ast::Crate, Features) { +pub fn features( + mut krate: ast::Crate, + sess: &ParseSess, + edition: Edition, + allow_features: &Option>, +) -> (ast::Crate, Features) { let features; { - let mut strip_unconfigured = StripUnconfigured { - sess, - features: None, - }; + let mut strip_unconfigured = StripUnconfigured { sess, features: None }; let unconfigured_attrs = krate.attrs.clone(); let err_count = sess.span_diagnostic.err_count(); if let Some(attrs) = strip_unconfigured.configure(krate.attrs) { krate.attrs = attrs; - } else { // the entire crate is unconfigured + } else { + // the entire crate is unconfigured krate.attrs = Vec::new(); krate.module.items = Vec::new(); return (krate, Features::default()); @@ -70,7 +241,7 @@ macro_rules! configure { Some(node) => node, None => return Default::default(), } - } + }; } const CFG_ATTR_GRAMMAR_HELP: &str = "#[cfg_attr(condition, attribute, other_attribute, ...)]"; @@ -192,26 +363,38 @@ impl<'a> StripUnconfigured<'a> { let meta_item = match validate_attr::parse_meta(self.sess, attr) { Ok(meta_item) => meta_item, - Err(mut err) => { err.emit(); return true; } + Err(mut err) => { + err.emit(); + return true; + } }; let nested_meta_items = if let Some(nested_meta_items) = meta_item.meta_item_list() { nested_meta_items } else { - return error(meta_item.span, "`cfg` is not followed by parentheses", - "cfg(/* predicate */)"); + return error( + meta_item.span, + "`cfg` is not followed by parentheses", + "cfg(/* predicate */)", + ); }; if nested_meta_items.is_empty() { return error(meta_item.span, "`cfg` predicate is not specified", ""); } else if nested_meta_items.len() > 1 { - return error(nested_meta_items.last().unwrap().span(), - "multiple `cfg` predicates are specified", ""); + return error( + nested_meta_items.last().unwrap().span(), + "multiple `cfg` predicates are specified", + "", + ); } match nested_meta_items[0].meta_item() { Some(meta_item) => attr::cfg_matches(meta_item, self.sess, self.features), - None => error(nested_meta_items[0].span(), - "`cfg` predicate key cannot be a literal", ""), + None => error( + nested_meta_items[0].span(), + "`cfg` predicate key cannot be a literal", + "", + ), } }) } @@ -227,10 +410,12 @@ impl<'a> StripUnconfigured<'a> { /// If attributes are not allowed on expressions, emit an error for `attr` pub fn maybe_emit_expr_attr_err(&self, attr: &Attribute) { if !self.features.map(|features| features.stmt_expr_attributes).unwrap_or(true) { - let mut err = feature_err(self.sess, - sym::stmt_expr_attributes, - attr.span, - "attributes on expressions are experimental"); + let mut err = feature_err( + self.sess, + sym::stmt_expr_attributes, + attr.span, + "attributes on expressions are experimental", + ); if attr.is_doc_comment() { err.help("`///` is for documentation comments. For a plain comment, use `//`."); @@ -251,16 +436,18 @@ impl<'a> StripUnconfigured<'a> { fn configure_variant_data(&mut self, vdata: &mut ast::VariantData) { match vdata { - ast::VariantData::Struct(fields, ..) | ast::VariantData::Tuple(fields, _) => - fields.flat_map_in_place(|field| self.configure(field)), + ast::VariantData::Struct(fields, ..) | ast::VariantData::Tuple(fields, _) => { + fields.flat_map_in_place(|field| self.configure(field)) + } ast::VariantData::Unit(_) => {} } } pub fn configure_item_kind(&mut self, item: &mut ast::ItemKind) { match item { - ast::ItemKind::Struct(def, _generics) | - ast::ItemKind::Union(def, _generics) => self.configure_variant_data(def), + ast::ItemKind::Struct(def, _generics) | ast::ItemKind::Union(def, _generics) => { + self.configure_variant_data(def) + } ast::ItemKind::Enum(ast::EnumDef { variants }, _generics) => { variants.flat_map_in_place(|variant| self.configure(variant)); for variant in variants { @@ -344,12 +531,12 @@ impl<'a> MutVisitor for StripUnconfigured<'a> { noop_flat_map_item(configure!(self, item), self) } - fn flat_map_impl_item(&mut self, item: ast::ImplItem) -> SmallVec<[ast::ImplItem; 1]> { - noop_flat_map_impl_item(configure!(self, item), self) + fn flat_map_impl_item(&mut self, item: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> { + noop_flat_map_assoc_item(configure!(self, item), self) } - fn flat_map_trait_item(&mut self, item: ast::TraitItem) -> SmallVec<[ast::TraitItem; 1]> { - noop_flat_map_trait_item(configure!(self, item), self) + fn flat_map_trait_item(&mut self, item: ast::AssocItem) -> SmallVec<[ast::AssocItem; 1]> { + noop_flat_map_assoc_item(configure!(self, item), self) } fn visit_mac(&mut self, _mac: &mut ast::Mac) { diff --git a/src/librustc_parse/lexer/mod.rs b/src/librustc_parse/lexer/mod.rs index ddcfea1898..02e4808679 100644 --- a/src/librustc_parse/lexer/mod.rs +++ b/src/librustc_parse/lexer/mod.rs @@ -1,20 +1,20 @@ use rustc_data_structures::sync::Lrc; -use rustc_errors::{FatalError, DiagnosticBuilder}; -use rustc_lexer::Base; +use rustc_errors::{DiagnosticBuilder, FatalError}; use rustc_lexer::unescape; -use syntax::token::{self, Token, TokenKind}; +use rustc_lexer::Base; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::{BytePos, Pos, Span}; use syntax::sess::ParseSess; +use syntax::token::{self, Token, TokenKind}; use syntax::util::comments; -use syntax_pos::symbol::{sym, Symbol}; -use syntax_pos::{BytePos, Pos, Span}; +use log::debug; use std::char; use std::convert::TryInto; -use log::debug; mod tokentrees; -mod unicode_chars; mod unescape_error_reporting; +mod unicode_chars; use unescape_error_reporting::{emit_unescape_error, push_escaped_char}; #[derive(Clone, Debug)] @@ -41,12 +41,14 @@ pub struct StringReader<'a> { } impl<'a> StringReader<'a> { - pub fn new(sess: &'a ParseSess, - source_file: Lrc, - override_span: Option) -> Self { + pub fn new( + sess: &'a ParseSess, + source_file: Lrc, + override_span: Option, + ) -> Self { if source_file.src.is_none() { - sess.span_diagnostic.bug(&format!("cannot lex `source_file` without source: {}", - source_file.name)); + sess.span_diagnostic + .bug(&format!("cannot lex `source_file` without source: {}", source_file.name)); } let src = (*source_file.src.as_ref().unwrap()).clone(); @@ -78,7 +80,6 @@ impl<'a> StringReader<'a> { sr } - fn mk_sp(&self, lo: BytePos, hi: BytePos) -> Span { self.override_span.unwrap_or_else(|| Span::with_root_ctxt(lo, hi)) } @@ -137,7 +138,6 @@ impl<'a> StringReader<'a> { self.sess.span_diagnostic.struct_span_err(sp, m).emit(); } - /// Report a fatal error spanning [`from_pos`, `to_pos`). fn fatal_span_(&self, from_pos: BytePos, to_pos: BytePos, m: &str) -> FatalError { self.fatal_span(self.mk_sp(from_pos, to_pos), m) @@ -148,15 +148,22 @@ impl<'a> StringReader<'a> { self.err_span(self.mk_sp(from_pos, to_pos), m) } - fn struct_span_fatal(&self, from_pos: BytePos, to_pos: BytePos, m: &str) - -> DiagnosticBuilder<'a> - { + fn struct_span_fatal( + &self, + from_pos: BytePos, + to_pos: BytePos, + m: &str, + ) -> DiagnosticBuilder<'a> { self.sess.span_diagnostic.struct_span_fatal(self.mk_sp(from_pos, to_pos), m) } - fn struct_fatal_span_char(&self, from_pos: BytePos, to_pos: BytePos, m: &str, c: char) - -> DiagnosticBuilder<'a> - { + fn struct_fatal_span_char( + &self, + from_pos: BytePos, + to_pos: BytePos, + m: &str, + c: char, + ) -> DiagnosticBuilder<'a> { let mut m = m.to_string(); m.push_str(": "); push_escaped_char(&mut m, c); @@ -167,11 +174,7 @@ impl<'a> StringReader<'a> { /// Turns simple `rustc_lexer::TokenKind` enum into a rich /// `libsyntax::TokenKind`. This turns strings into interned /// symbols and runs additional validation. - fn cook_lexer_token( - &self, - token: rustc_lexer::TokenKind, - start: BytePos, - ) -> TokenKind { + fn cook_lexer_token(&self, token: rustc_lexer::TokenKind, start: BytePos) -> TokenKind { match token { rustc_lexer::TokenKind::LineComment => { let string = self.str_from(start); @@ -202,9 +205,7 @@ impl<'a> StringReader<'a> { } let tok = if is_doc_comment { - self.forbid_bare_cr(start, - string, - "bare CR not allowed in block doc-comment"); + self.forbid_bare_cr(start, string, "bare CR not allowed in block doc-comment"); token::DocComment(Symbol::intern(string)) } else { token::Comment @@ -219,8 +220,7 @@ impl<'a> StringReader<'a> { if is_raw_ident { ident_start = ident_start + BytePos(2); } - // FIXME: perform NFKC normalization here. (Issue #2253) - let sym = self.symbol_from(ident_start); + let sym = nfc_normalize(self.str_from(ident_start)); if is_raw_ident { let span = self.mk_sp(start, self.pos); if !sym.can_be_raw() { @@ -236,14 +236,21 @@ impl<'a> StringReader<'a> { let suffix = if suffix_start < self.pos { let string = self.str_from(suffix_start); if string == "_" { - self.sess.span_diagnostic - .struct_span_warn(self.mk_sp(suffix_start, self.pos), - "underscore literal suffix is not allowed") - .warn("this was previously accepted by the compiler but is \ + self.sess + .span_diagnostic + .struct_span_warn( + self.mk_sp(suffix_start, self.pos), + "underscore literal suffix is not allowed", + ) + .warn( + "this was previously accepted by the compiler but is \ being phased out; it will become a hard error in \ - a future release!") - .note("for more information, see issue #42326 \ - ") + a future release!", + ) + .note( + "for more information, see issue #42326 \ + ", + ) .emit(); None } else { @@ -260,11 +267,7 @@ impl<'a> StringReader<'a> { // this is necessary. let lifetime_name = self.str_from(start); if starts_with_number { - self.err_span_( - start, - self.pos, - "lifetimes cannot start with a number", - ); + self.err_span_(start, self.pos, "lifetimes cannot start with a number"); } let ident = Symbol::intern(lifetime_name); token::Lifetime(ident) @@ -299,10 +302,8 @@ impl<'a> StringReader<'a> { rustc_lexer::TokenKind::Unknown => { let c = self.str_from(start).chars().next().unwrap(); - let mut err = self.struct_fatal_span_char(start, - self.pos, - "unknown start of token", - c); + let mut err = + self.struct_fatal_span_char(start, self.pos, "unknown start of token", c); // FIXME: the lexer could be used to turn the ASCII version of unicode homoglyphs, // instead of keeping a table in `check_for_substitution`into the token. Ideally, // this should be inside `rustc_lexer`. However, we should first remove compound @@ -320,13 +321,12 @@ impl<'a> StringReader<'a> { &self, start: BytePos, suffix_start: BytePos, - kind: rustc_lexer::LiteralKind + kind: rustc_lexer::LiteralKind, ) -> (token::LitKind, Symbol) { match kind { rustc_lexer::LiteralKind::Char { terminated } => { if !terminated { - self.fatal_span_(start, suffix_start, - "unterminated character literal".into()) + self.fatal_span_(start, suffix_start, "unterminated character literal".into()) .raise() } let content_start = start + BytePos(1); @@ -334,23 +334,25 @@ impl<'a> StringReader<'a> { self.validate_char_escape(content_start, content_end); let id = self.symbol_from_to(content_start, content_end); (token::Char, id) - }, + } rustc_lexer::LiteralKind::Byte { terminated } => { if !terminated { - self.fatal_span_(start + BytePos(1), suffix_start, - "unterminated byte constant".into()) - .raise() + self.fatal_span_( + start + BytePos(1), + suffix_start, + "unterminated byte constant".into(), + ) + .raise() } let content_start = start + BytePos(2); let content_end = suffix_start - BytePos(1); self.validate_byte_escape(content_start, content_end); let id = self.symbol_from_to(content_start, content_end); (token::Byte, id) - }, + } rustc_lexer::LiteralKind::Str { terminated } => { if !terminated { - self.fatal_span_(start, suffix_start, - "unterminated double quote string".into()) + self.fatal_span_(start, suffix_start, "unterminated double quote string".into()) .raise() } let content_start = start + BytePos(1); @@ -361,9 +363,12 @@ impl<'a> StringReader<'a> { } rustc_lexer::LiteralKind::ByteStr { terminated } => { if !terminated { - self.fatal_span_(start + BytePos(1), suffix_start, - "unterminated double quote byte string".into()) - .raise() + self.fatal_span_( + start + BytePos(1), + suffix_start, + "unterminated double quote byte string".into(), + ) + .raise() } let content_start = start + BytePos(2); let content_end = suffix_start - BytePos(1); @@ -409,35 +414,35 @@ impl<'a> StringReader<'a> { self.validate_int_literal(base, start, suffix_start); (token::Integer, self.symbol_from_to(start, suffix_start)) } - }, + } rustc_lexer::LiteralKind::Float { base, empty_exponent } => { if empty_exponent { let mut err = self.struct_span_fatal( - start, self.pos, - "expected at least one digit in exponent" + start, + self.pos, + "expected at least one digit in exponent", ); err.emit(); } match base { - Base::Hexadecimal => { - self.err_span_(start, suffix_start, - "hexadecimal float literal is not supported") - } + Base::Hexadecimal => self.err_span_( + start, + suffix_start, + "hexadecimal float literal is not supported", + ), Base::Octal => { - self.err_span_(start, suffix_start, - "octal float literal is not supported") + self.err_span_(start, suffix_start, "octal float literal is not supported") } Base::Binary => { - self.err_span_(start, suffix_start, - "binary float literal is not supported") + self.err_span_(start, suffix_start, "binary float literal is not supported") } - _ => () + _ => (), } let id = self.symbol_from_to(start, suffix_start); (token::Float, id) - }, + } } } @@ -448,8 +453,7 @@ impl<'a> StringReader<'a> { /// Slice of the source text from `start` up to but excluding `self.pos`, /// meaning the slice does not include the character `self.ch`. - fn str_from(&self, start: BytePos) -> &str - { + fn str_from(&self, start: BytePos) -> &str { self.str_from_to(start, self.pos) } @@ -466,8 +470,7 @@ impl<'a> StringReader<'a> { } /// Slice of the source text spanning from `start` up to but excluding `end`. - fn str_from_to(&self, start: BytePos, end: BytePos) -> &str - { + fn str_from_to(&self, start: BytePos, end: BytePos) -> &str { &self.src[self.src_index(start)..self.src_index(end)] } @@ -476,41 +479,34 @@ impl<'a> StringReader<'a> { loop { idx = match s[idx..].find('\r') { None => break, - Some(it) => idx + it + 1 + Some(it) => idx + it + 1, }; - self.err_span_(start + BytePos(idx as u32 - 1), - start + BytePos(idx as u32), - errmsg); + self.err_span_(start + BytePos(idx as u32 - 1), start + BytePos(idx as u32), errmsg); } } fn report_non_started_raw_string(&self, start: BytePos) -> ! { let bad_char = self.str_from(start).chars().last().unwrap(); - self - .struct_fatal_span_char( - start, - self.pos, - "found invalid character; only `#` is allowed \ + self.struct_fatal_span_char( + start, + self.pos, + "found invalid character; only `#` is allowed \ in raw string delimitation", - bad_char, - ) - .emit(); + bad_char, + ) + .emit(); FatalError.raise() } fn report_unterminated_raw_string(&self, start: BytePos, n_hashes: usize) -> ! { - let mut err = self.struct_span_fatal( - start, start, - "unterminated raw string", - ); - err.span_label( - self.mk_sp(start, start), - "unterminated raw string", - ); + let mut err = self.struct_span_fatal(start, start, "unterminated raw string"); + err.span_label(self.mk_sp(start, start), "unterminated raw string"); if n_hashes > 0 { - err.note(&format!("this raw string should be terminated with `\"{}`", - "#".repeat(n_hashes as usize))); + err.note(&format!( + "this raw string should be terminated with `\"{}`", + "#".repeat(n_hashes as usize) + )); } err.emit(); @@ -521,10 +517,13 @@ impl<'a> StringReader<'a> { match n_hashes.try_into() { Ok(n_hashes) => n_hashes, Err(_) => { - self.fatal_span_(start, - self.pos, - "too many `#` symbols: raw strings may be \ - delimited by up to 65535 `#` symbols").raise(); + self.fatal_span_( + start, + self.pos, + "too many `#` symbols: raw strings may be \ + delimited by up to 65535 `#` symbols", + ) + .raise(); } } } @@ -633,10 +632,19 @@ impl<'a> StringReader<'a> { if c != '_' && c.to_digit(base).is_none() { let lo = content_start + BytePos(2 + idx); let hi = content_start + BytePos(2 + idx + c.len_utf8() as u32); - self.err_span_(lo, hi, - &format!("invalid digit for a base {} literal", base)); - + self.err_span_(lo, hi, &format!("invalid digit for a base {} literal", base)); } } } } + +pub fn nfc_normalize(string: &str) -> Symbol { + use unicode_normalization::{is_nfc_quick, IsNormalized, UnicodeNormalization}; + match is_nfc_quick(string.chars()) { + IsNormalized::Yes => Symbol::intern(string), + _ => { + let normalized_str: String = string.chars().nfc().collect(); + Symbol::intern(&normalized_str) + } + } +} diff --git a/src/librustc_parse/lexer/tokentrees.rs b/src/librustc_parse/lexer/tokentrees.rs index 5791c6396c..a28bff3bab 100644 --- a/src/librustc_parse/lexer/tokentrees.rs +++ b/src/librustc_parse/lexer/tokentrees.rs @@ -2,10 +2,14 @@ use super::{StringReader, UnmatchedBrace}; use rustc_data_structures::fx::FxHashMap; use rustc_errors::PResult; +use rustc_span::Span; use syntax::print::pprust::token_to_string; use syntax::token::{self, Token}; -use syntax::tokenstream::{DelimSpan, IsJoint::{self, *}, TokenStream, TokenTree, TreeAndJoint}; -use syntax_pos::Span; +use syntax::tokenstream::{ + DelimSpan, + IsJoint::{self, *}, + TokenStream, TokenTree, TreeAndJoint, +}; impl<'a> StringReader<'a> { crate fn into_token_trees(self) -> (PResult<'a, TokenStream>, Vec) { @@ -17,7 +21,7 @@ impl<'a> StringReader<'a> { unmatched_braces: Vec::new(), matching_delim_spans: Vec::new(), last_unclosed_found_span: None, - last_delim_empty_block_spans: FxHashMap::default() + last_delim_empty_block_spans: FxHashMap::default(), }; let res = tt_reader.parse_all_token_trees(); (res, tt_reader.unmatched_braces) @@ -36,7 +40,7 @@ struct TokenTreesReader<'a> { /// Used only for error recovery when arriving to EOF with mismatched braces. matching_delim_spans: Vec<(token::DelimToken, Span, Span)>, last_unclosed_found_span: Option, - last_delim_empty_block_spans: FxHashMap + last_delim_empty_block_spans: FxHashMap, } impl<'a> TokenTreesReader<'a> { @@ -74,11 +78,11 @@ impl<'a> TokenTreesReader<'a> { let sm = self.string_reader.sess.source_map(); match self.token.kind { token::Eof => { - let msg = "this file contains an un-closed delimiter"; - let mut err = self.string_reader.sess.span_diagnostic - .struct_span_err(self.token.span, msg); + let msg = "this file contains an unclosed delimiter"; + let mut err = + self.string_reader.sess.span_diagnostic.struct_span_err(self.token.span, msg); for &(_, sp) in &self.open_braces { - err.span_label(sp, "un-closed delimiter"); + err.span_label(sp, "unclosed delimiter"); self.unmatched_braces.push(UnmatchedBrace { expected_delim: token::DelimToken::Brace, found_delim: None, @@ -89,7 +93,9 @@ impl<'a> TokenTreesReader<'a> { } if let Some((delim, _)) = self.open_braces.last() { - if let Some((_, open_sp, close_sp)) = self.matching_delim_spans.iter() + if let Some((_, open_sp, close_sp)) = self + .matching_delim_spans + .iter() .filter(|(d, open_sp, close_sp)| { if let Some(close_padding) = sm.span_to_margin(*close_sp) { if let Some(open_padding) = sm.span_to_margin(*open_sp) { @@ -97,12 +103,12 @@ impl<'a> TokenTreesReader<'a> { } } false - }).next() // these are in reverse order as they get inserted on close, but - { // we want the last open/first close - err.span_label( - *open_sp, - "this delimiter might not be properly closed...", - ); + }) + .next() + // these are in reverse order as they get inserted on close, but + { + // we want the last open/first close + err.span_label(*open_sp, "this delimiter might not be properly closed..."); err.span_label( *close_sp, "...as it matches this but it has different indentation", @@ -110,7 +116,7 @@ impl<'a> TokenTreesReader<'a> { } } Err(err) - }, + } token::OpenDelim(delim) => { // The span for beginning of the delimited section let pre_span = self.token.span; @@ -143,11 +149,13 @@ impl<'a> TokenTreesReader<'a> { // properly matched delimiters so far for an entire block. self.matching_delim_spans.clear(); } else { - self.matching_delim_spans.push( - (open_brace, open_brace_span, close_brace_span), - ); + self.matching_delim_spans.push(( + open_brace, + open_brace_span, + close_brace_span, + )); } - // Parse the close delimiter. + // Parse the closing delimiter. self.real_token(); } // Incorrect delimiter. @@ -200,33 +208,29 @@ impl<'a> TokenTreesReader<'a> { // Silently recover, the EOF token will be seen again // and an error emitted then. Thus we don't pop from // self.open_braces here. - }, + } _ => {} } - Ok(TokenTree::Delimited( - delim_span, - delim, - tts.into() - ).into()) - }, + Ok(TokenTree::Delimited(delim_span, delim, tts.into()).into()) + } token::CloseDelim(delim) => { // An unexpected closing delimiter (i.e., there is no // matching opening delimiter). let token_str = token_to_string(&self.token); - let msg = format!("unexpected close delimiter: `{}`", token_str); - let mut err = self.string_reader.sess.span_diagnostic - .struct_span_err(self.token.span, &msg); + let msg = format!("unexpected closing delimiter: `{}`", token_str); + let mut err = + self.string_reader.sess.span_diagnostic.struct_span_err(self.token.span, &msg); if let Some(span) = self.last_delim_empty_block_spans.remove(&delim) { err.span_label( span, - "this block is empty, you might have not meant to close it" + "this block is empty, you might have not meant to close it", ); } - err.span_label(self.token.span, "unexpected close delimiter"); + err.span_label(self.token.span, "unexpected closing delimiter"); Err(err) - }, + } _ => { let tt = TokenTree::Token(self.token.take()); self.real_token(); diff --git a/src/librustc_parse/lexer/unescape_error_reporting.rs b/src/librustc_parse/lexer/unescape_error_reporting.rs index a5749d07e6..88762dabd8 100644 --- a/src/librustc_parse/lexer/unescape_error_reporting.rs +++ b/src/librustc_parse/lexer/unescape_error_reporting.rs @@ -1,12 +1,11 @@ //! Utilities for rendering escape sequence errors as diagnostics. -use std::ops::Range; use std::iter::once; +use std::ops::Range; +use rustc_errors::{Applicability, Handler}; use rustc_lexer::unescape::{EscapeError, Mode}; -use syntax_pos::{Span, BytePos}; - -use syntax::errors::{Handler, Applicability}; +use rustc_span::{BytePos, Span}; pub(crate) fn emit_unescape_error( handler: &Handler, @@ -19,16 +18,20 @@ pub(crate) fn emit_unescape_error( range: Range, error: EscapeError, ) { - log::debug!("emit_unescape_error: {:?}, {:?}, {:?}, {:?}, {:?}", - lit, span_with_quotes, mode, range, error); + log::debug!( + "emit_unescape_error: {:?}, {:?}, {:?}, {:?}, {:?}", + lit, + span_with_quotes, + mode, + range, + error + ); let span = { let Range { start, end } = range; let (start, end) = (start as u32, end as u32); let lo = span_with_quotes.lo() + BytePos(start + 1); let hi = lo + BytePos(end - start); - span_with_quotes - .with_lo(lo) - .with_hi(hi) + span_with_quotes.with_lo(lo).with_hi(hi) }; let last_char = || { let c = lit[range.clone()].chars().rev().next().unwrap(); @@ -37,12 +40,14 @@ pub(crate) fn emit_unescape_error( }; match error { EscapeError::LoneSurrogateUnicodeEscape => { - handler.struct_span_err(span, "invalid unicode character escape") + handler + .struct_span_err(span, "invalid unicode character escape") .help("unicode escape must not be a surrogate") .emit(); } EscapeError::OutOfRangeUnicodeEscape => { - handler.struct_span_err(span, "invalid unicode character escape") + handler + .struct_span_err(span, "invalid unicode character escape") .help("unicode escape must be at most 10FFFF") .emit(); } @@ -63,7 +68,8 @@ pub(crate) fn emit_unescape_error( msg, format!("\"{}\"", lit), Applicability::MachineApplicable, - ).emit() + ) + .emit() } EscapeError::EscapeOnlyChar => { let (c, _span) = last_char(); @@ -72,7 +78,8 @@ pub(crate) fn emit_unescape_error( "byte constant must be escaped: " } else { "character constant must be escaped: " - }.to_string(); + } + .to_string(); push_escaped_char(&mut msg, c); handler.span_err(span, msg.as_str()) @@ -93,11 +100,8 @@ pub(crate) fn emit_unescape_error( EscapeError::InvalidEscape => { let (c, span) = last_char(); - let label = if mode.is_bytes() { - "unknown byte escape" - } else { - "unknown character escape" - }; + let label = + if mode.is_bytes() { "unknown byte escape" } else { "unknown character escape" }; let mut msg = label.to_string(); msg.push_str(": "); push_escaped_char(&mut msg, c); @@ -105,11 +109,15 @@ pub(crate) fn emit_unescape_error( let mut diag = handler.struct_span_err(span, msg.as_str()); diag.span_label(span, label); if c == '{' || c == '}' && !mode.is_bytes() { - diag.help("if used in a formatting string, \ - curly braces are escaped with `{{` and `}}`"); + diag.help( + "if used in a formatting string, \ + curly braces are escaped with `{{` and `}}`", + ); } else if c == '\r' { - diag.help("this is an isolated carriage return; \ - consider checking your editor and version control settings"); + diag.help( + "this is an isolated carriage return; \ + consider checking your editor and version control settings", + ); } diag.emit(); } @@ -123,7 +131,8 @@ pub(crate) fn emit_unescape_error( "invalid character in numeric character escape: " } else { "invalid character in unicode escape: " - }.to_string(); + } + .to_string(); push_escaped_char(&mut msg, c); handler.span_err(span, msg.as_str()) @@ -131,18 +140,22 @@ pub(crate) fn emit_unescape_error( EscapeError::NonAsciiCharInByte => { assert!(mode.is_bytes()); let (_c, span) = last_char(); - handler.span_err(span, "byte constant must be ASCII. \ - Use a \\xHH escape for a non-ASCII byte") + handler.span_err( + span, + "byte constant must be ASCII. \ + Use a \\xHH escape for a non-ASCII byte", + ) } EscapeError::NonAsciiCharInByteString => { assert!(mode.is_bytes()); let (_c, span) = last_char(); handler.span_err(span, "raw byte string must be ASCII") } - EscapeError::OutOfRangeHexEscape => { - handler.span_err(span, "this form of character escape may only be used \ - with characters in the range [\\x00-\\x7f]") - } + EscapeError::OutOfRangeHexEscape => handler.span_err( + span, + "this form of character escape may only be used \ + with characters in the range [\\x00-\\x7f]", + ), EscapeError::LeadingUnderscoreUnicodeEscape => { let (_c, span) = last_char(); handler.span_err(span, "invalid start of unicode escape") @@ -178,26 +191,21 @@ pub(crate) fn emit_unescape_error( ); } else { diag.span_label(span, msg); - diag.help( - "format of unicode escape sequences is `\\u{...}`", - ); + diag.help("format of unicode escape sequences is `\\u{...}`"); } diag.emit(); } - EscapeError::UnicodeEscapeInByte => { - handler.span_err(span, "unicode escape sequences cannot be used \ - as a byte or in a byte string") - } + EscapeError::UnicodeEscapeInByte => handler.span_err( + span, + "unicode escape sequences cannot be used \ + as a byte or in a byte string", + ), EscapeError::EmptyUnicodeEscape => { handler.span_err(span, "empty unicode escape (must have at least 1 hex digit)") } - EscapeError::ZeroChars => { - handler.span_err(span, "empty character literal") - } - EscapeError::LoneSlash => { - handler.span_err(span, "invalid trailing slash in literal") - } + EscapeError::ZeroChars => handler.span_err(span, "empty character literal"), + EscapeError::LoneSlash => handler.span_err(span, "invalid trailing slash in literal"), } } diff --git a/src/librustc_parse/lexer/unicode_chars.rs b/src/librustc_parse/lexer/unicode_chars.rs index edfebc7de9..ac395f6cbc 100644 --- a/src/librustc_parse/lexer/unicode_chars.rs +++ b/src/librustc_parse/lexer/unicode_chars.rs @@ -4,7 +4,7 @@ use super::StringReader; use crate::token; use rustc_errors::{Applicability, DiagnosticBuilder}; -use syntax_pos::{BytePos, Pos, Span, symbol::kw}; +use rustc_span::{symbol::kw, BytePos, Pos, Span}; #[rustfmt::skip] // for line breaks const UNICODE_ARRAY: &[(char, &str, char)] = &[ diff --git a/src/librustc_parse/lib.rs b/src/librustc_parse/lib.rs index faff386e92..08f4f21015 100644 --- a/src/librustc_parse/lib.rs +++ b/src/librustc_parse/lib.rs @@ -2,6 +2,7 @@ #![feature(bool_to_option)] #![feature(crate_visibility_modifier)] +#![cfg_attr(bootstrap, feature(slice_patterns))] use syntax::ast; use syntax::print::pprust; @@ -9,9 +10,9 @@ use syntax::sess::ParseSess; use syntax::token::{self, Nonterminal}; use syntax::tokenstream::{self, TokenStream, TokenTree}; -use rustc_errors::{PResult, FatalError, Level, Diagnostic}; use rustc_data_structures::sync::Lrc; -use syntax_pos::{Span, SourceFile, FileName}; +use rustc_errors::{Diagnostic, FatalError, Level, PResult}; +use rustc_span::{FileName, SourceFile, Span}; use std::borrow::Cow; use std::path::Path; @@ -23,7 +24,7 @@ pub const MACRO_ARGUMENTS: Option<&'static str> = Some("macro arguments"); #[macro_use] pub mod parser; -use parser::{Parser, emit_unclosed_delims, make_unclosed_delims_error}; +use parser::{emit_unclosed_delims, make_unclosed_delims_error, Parser}; pub mod lexer; pub mod validate_attr; #[macro_use] @@ -52,9 +53,9 @@ pub enum DirectoryOwnership { /// A variant of 'panictry!' that works on a Vec instead of a single DiagnosticBuilder. macro_rules! panictry_buffer { - ($handler:expr, $e:expr) => ({ - use std::result::Result::{Ok, Err}; + ($handler:expr, $e:expr) => {{ use rustc_errors::FatalError; + use std::result::Result::{Err, Ok}; match $e { Ok(e) => e, Err(errs) => { @@ -64,7 +65,7 @@ macro_rules! panictry_buffer { FatalError.raise() } } - }) + }}; } pub fn parse_crate_from_file<'a>(input: &Path, sess: &'a ParseSess) -> PResult<'a, ast::Crate> { @@ -72,19 +73,27 @@ pub fn parse_crate_from_file<'a>(input: &Path, sess: &'a ParseSess) -> PResult<' parser.parse_crate_mod() } -pub fn parse_crate_attrs_from_file<'a>(input: &Path, sess: &'a ParseSess) - -> PResult<'a, Vec> { +pub fn parse_crate_attrs_from_file<'a>( + input: &Path, + sess: &'a ParseSess, +) -> PResult<'a, Vec> { let mut parser = new_parser_from_file(sess, input); parser.parse_inner_attributes() } -pub fn parse_crate_from_source_str(name: FileName, source: String, sess: &ParseSess) - -> PResult<'_, ast::Crate> { +pub fn parse_crate_from_source_str( + name: FileName, + source: String, + sess: &ParseSess, +) -> PResult<'_, ast::Crate> { new_parser_from_source_str(sess, name, source).parse_crate_mod() } -pub fn parse_crate_attrs_from_source_str(name: FileName, source: String, sess: &ParseSess) - -> PResult<'_, Vec> { +pub fn parse_crate_attrs_from_source_str( + name: FileName, + source: String, + sess: &ParseSess, +) -> PResult<'_, Vec> { new_parser_from_source_str(sess, name, source).parse_inner_attributes() } @@ -94,11 +103,8 @@ pub fn parse_stream_from_source_str( sess: &ParseSess, override_span: Option, ) -> TokenStream { - let (stream, mut errors) = source_file_to_stream( - sess, - sess.source_map().new_source_file(name, source), - override_span, - ); + let (stream, mut errors) = + source_file_to_stream(sess, sess.source_map().new_source_file(name, source), override_span); emit_unclosed_delims(&mut errors, &sess); stream } @@ -110,11 +116,13 @@ pub fn new_parser_from_source_str(sess: &ParseSess, name: FileName, source: Stri /// Creates a new parser from a source string. Returns any buffered errors from lexing the initial /// token stream. -pub fn maybe_new_parser_from_source_str(sess: &ParseSess, name: FileName, source: String) - -> Result, Vec> -{ - let mut parser = maybe_source_file_to_parser(sess, - sess.source_map().new_source_file(name, source))?; +pub fn maybe_new_parser_from_source_str( + sess: &ParseSess, + name: FileName, + source: String, +) -> Result, Vec> { + let mut parser = + maybe_source_file_to_parser(sess, sess.source_map().new_source_file(name, source))?; parser.recurse_into_file_modules = false; Ok(parser) } @@ -126,8 +134,10 @@ pub fn new_parser_from_file<'a>(sess: &'a ParseSess, path: &Path) -> Parser<'a> /// Creates a new parser, returning buffered diagnostics if the file doesn't exist, /// or from lexing the initial token stream. -pub fn maybe_new_parser_from_file<'a>(sess: &'a ParseSess, path: &Path) - -> Result, Vec> { +pub fn maybe_new_parser_from_file<'a>( + sess: &'a ParseSess, + path: &Path, +) -> Result, Vec> { let file = try_file_to_source_file(sess, path, None).map_err(|db| vec![db])?; maybe_source_file_to_parser(sess, file) } @@ -135,11 +145,13 @@ pub fn maybe_new_parser_from_file<'a>(sess: &'a ParseSess, path: &Path) /// Given a session, a crate config, a path, and a span, add /// the file at the given path to the `source_map`, and returns a parser. /// On an error, uses the given span as the source of the problem. -pub fn new_sub_parser_from_file<'a>(sess: &'a ParseSess, - path: &Path, - directory_ownership: DirectoryOwnership, - module_name: Option, - sp: Span) -> Parser<'a> { +pub fn new_sub_parser_from_file<'a>( + sess: &'a ParseSess, + path: &Path, + directory_ownership: DirectoryOwnership, + module_name: Option, + sp: Span, +) -> Parser<'a> { let mut p = source_file_to_parser(sess, file_to_source_file(sess, path, Some(sp))); p.directory.ownership = directory_ownership; p.root_module_name = module_name; @@ -148,8 +160,7 @@ pub fn new_sub_parser_from_file<'a>(sess: &'a ParseSess, /// Given a `source_file` and config, returns a parser. fn source_file_to_parser(sess: &ParseSess, source_file: Lrc) -> Parser<'_> { - panictry_buffer!(&sess.span_diagnostic, - maybe_source_file_to_parser(sess, source_file)) + panictry_buffer!(&sess.span_diagnostic, maybe_source_file_to_parser(sess, source_file)) } /// Given a `source_file` and config, return a parser. Returns any buffered errors from lexing the @@ -175,16 +186,17 @@ pub fn new_parser_from_tts(sess: &ParseSess, tts: Vec) -> Parser<'_> stream_to_parser(sess, tts.into_iter().collect(), crate::MACRO_ARGUMENTS) } - // Base abstractions /// Given a session and a path and an optional span (for error reporting), /// add the path to the session's source_map and return the new source_file or /// error when a file can't be read. -fn try_file_to_source_file(sess: &ParseSess, path: &Path, spanopt: Option) - -> Result, Diagnostic> { - sess.source_map().load_file(path) - .map_err(|e| { +fn try_file_to_source_file( + sess: &ParseSess, + path: &Path, + spanopt: Option, +) -> Result, Diagnostic> { + sess.source_map().load_file(path).map_err(|e| { let msg = format!("couldn't read {}: {}", path.display(), e); let mut diag = Diagnostic::new(Level::Fatal, &msg); if let Some(sp) = spanopt { @@ -196,8 +208,7 @@ fn try_file_to_source_file(sess: &ParseSess, path: &Path, spanopt: Option) /// Given a session and a path and an optional span (for error reporting), /// adds the path to the session's `source_map` and returns the new `source_file`. -fn file_to_source_file(sess: &ParseSess, path: &Path, spanopt: Option) - -> Lrc { +fn file_to_source_file(sess: &ParseSess, path: &Path, spanopt: Option) -> Lrc { match try_file_to_source_file(sess, path, spanopt) { Ok(source_file) => source_file, Err(d) => { @@ -305,10 +316,7 @@ pub fn nt_to_tokenstream(nt: &Nonterminal, sess: &ParseSess, span: Span) -> Toke Nonterminal::NtItem(ref item) => { prepend_attrs(sess, &item.attrs, item.tokens.as_ref(), span) } - Nonterminal::NtTraitItem(ref item) => { - prepend_attrs(sess, &item.attrs, item.tokens.as_ref(), span) - } - Nonterminal::NtImplItem(ref item) => { + Nonterminal::NtTraitItem(ref item) | Nonterminal::NtImplItem(ref item) => { prepend_attrs(sess, &item.attrs, item.tokens.as_ref(), span) } Nonterminal::NtIdent(ident, is_raw) => { @@ -317,9 +325,7 @@ pub fn nt_to_tokenstream(nt: &Nonterminal, sess: &ParseSess, span: Span) -> Toke Nonterminal::NtLifetime(ident) => { Some(tokenstream::TokenTree::token(token::Lifetime(ident.name), ident.span).into()) } - Nonterminal::NtTT(ref tt) => { - Some(tt.clone().into()) - } + Nonterminal::NtTT(ref tt) => Some(tt.clone().into()), _ => None, }; @@ -353,28 +359,33 @@ pub fn nt_to_tokenstream(nt: &Nonterminal, sess: &ParseSess, span: Span) -> Toke // tokens such as extra braces and commas, don't happen. if let Some(tokens) = tokens { if tokens.probably_equal_for_proc_macro(&tokens_for_real) { - return tokens + return tokens; } - info!("cached tokens found, but they're not \"probably equal\", \ - going with stringified version"); + info!( + "cached tokens found, but they're not \"probably equal\", \ + going with stringified version" + ); } - return tokens_for_real + return tokens_for_real; } fn prepend_attrs( sess: &ParseSess, attrs: &[ast::Attribute], tokens: Option<&tokenstream::TokenStream>, - span: syntax_pos::Span + span: rustc_span::Span, ) -> Option { let tokens = tokens?; if attrs.len() == 0 { - return Some(tokens.clone()) + return Some(tokens.clone()); } let mut builder = tokenstream::TokenStreamBuilder::new(); for attr in attrs { - assert_eq!(attr.style, ast::AttrStyle::Outer, - "inner attributes should prevent cached tokens from existing"); + assert_eq!( + attr.style, + ast::AttrStyle::Outer, + "inner attributes should prevent cached tokens from existing" + ); let source = pprust::attribute_to_string(attr); let macro_filename = FileName::macro_expansion_source_code(&source); @@ -384,7 +395,7 @@ fn prepend_attrs( ast::AttrKind::DocComment(_) => { let stream = parse_stream_from_source_str(macro_filename, source, sess, Some(span)); builder.push(stream); - continue + continue; } }; @@ -412,7 +423,10 @@ fn prepend_attrs( builder.push(tokenstream::TokenTree::token(token::Pound, attr.span)); let delim_span = tokenstream::DelimSpan::from_single(attr.span); builder.push(tokenstream::TokenTree::Delimited( - delim_span, token::DelimToken::Bracket, brackets.build().into())); + delim_span, + token::DelimToken::Bracket, + brackets.build().into(), + )); } builder.push(tokens.clone()); Some(builder.build()) diff --git a/src/librustc_parse/parser/attr.rs b/src/librustc_parse/parser/attr.rs index 00fd6b8a25..3d40b91a7b 100644 --- a/src/librustc_parse/parser/attr.rs +++ b/src/librustc_parse/parser/attr.rs @@ -1,10 +1,11 @@ -use super::{SeqSep, Parser, TokenType, PathStyle}; +use super::{Parser, PathStyle, TokenType}; use rustc_errors::PResult; -use syntax::attr; +use rustc_span::{Span, Symbol}; use syntax::ast; -use syntax::util::comments; +use syntax::attr; +use syntax::print::pprust; use syntax::token::{self, Nonterminal}; -use syntax_pos::{Span, Symbol}; +use syntax::util::comments; use log::debug; @@ -33,12 +34,11 @@ impl<'a> Parser<'a> { } else { DEFAULT_UNEXPECTED_INNER_ATTR_ERR_MSG }; - let inner_parse_policy = - InnerAttributeParsePolicy::NotPermitted { - reason: inner_error_reason, - saw_doc_comment: just_parsed_doc_comment, - prev_attr_sp: attrs.last().and_then(|a| Some(a.span)) - }; + let inner_parse_policy = InnerAttributeParsePolicy::NotPermitted { + reason: inner_error_reason, + saw_doc_comment: just_parsed_doc_comment, + prev_attr_sp: attrs.last().and_then(|a| Some(a.span)), + }; let attr = self.parse_attribute_with_inner_parse_policy(inner_parse_policy)?; attrs.push(attr); just_parsed_doc_comment = false; @@ -46,9 +46,12 @@ impl<'a> Parser<'a> { token::DocComment(s) => { let attr = self.mk_doc_comment(s); if attr.style != ast::AttrStyle::Outer { - let mut err = self.fatal("expected outer doc comment"); - err.note("inner doc comments like this (starting with \ - `//!` or `/*!`) can only appear before items"); + let span = self.token.span; + let mut err = self.struct_span_err(span, "expected outer doc comment"); + err.note( + "inner doc comments like this (starting with \ + `//!` or `/*!`) can only appear before items", + ); return Err(err); } attrs.push(attr); @@ -71,16 +74,14 @@ impl<'a> Parser<'a> { /// If `permit_inner` is `true`, then a leading `!` indicates an inner /// attribute. pub fn parse_attribute(&mut self, permit_inner: bool) -> PResult<'a, ast::Attribute> { - debug!("parse_attribute: permit_inner={:?} self.token={:?}", - permit_inner, - self.token); + debug!("parse_attribute: permit_inner={:?} self.token={:?}", permit_inner, self.token); let inner_parse_policy = if permit_inner { InnerAttributeParsePolicy::Permitted } else { InnerAttributeParsePolicy::NotPermitted { reason: DEFAULT_UNEXPECTED_INNER_ATTR_ERR_MSG, saw_doc_comment: false, - prev_attr_sp: None + prev_attr_sp: None, } }; self.parse_attribute_with_inner_parse_policy(inner_parse_policy) @@ -90,11 +91,12 @@ impl<'a> Parser<'a> { /// that prescribes how to handle inner attributes. fn parse_attribute_with_inner_parse_policy( &mut self, - inner_parse_policy: InnerAttributeParsePolicy<'_> + inner_parse_policy: InnerAttributeParsePolicy<'_>, ) -> PResult<'a, ast::Attribute> { - debug!("parse_attribute_with_inner_parse_policy: inner_parse_policy={:?} self.token={:?}", - inner_parse_policy, - self.token); + debug!( + "parse_attribute_with_inner_parse_policy: inner_parse_policy={:?} self.token={:?}", + inner_parse_policy, self.token + ); let (span, item, style) = match self.token.kind { token::Pound => { let lo = self.token.span; @@ -120,17 +122,19 @@ impl<'a> Parser<'a> { // Emit error if inner attribute is encountered and not permitted if style == ast::AttrStyle::Inner { - if let InnerAttributeParsePolicy::NotPermitted { reason, - saw_doc_comment, prev_attr_sp } = inner_parse_policy { + if let InnerAttributeParsePolicy::NotPermitted { + reason, + saw_doc_comment, + prev_attr_sp, + } = inner_parse_policy + { let prev_attr_note = if saw_doc_comment { "previous doc comment" } else { "previous outer attribute" }; - let mut diagnostic = self - .diagnostic() - .struct_span_err(attr_sp, reason); + let mut diagnostic = self.struct_span_err(attr_sp, reason); if let Some(prev_attr_sp) = prev_attr_sp { diagnostic @@ -139,10 +143,12 @@ impl<'a> Parser<'a> { } diagnostic - .note("inner attributes, like `#![no_std]`, annotate the item \ + .note( + "inner attributes, like `#![no_std]`, annotate the item \ enclosing them, and are usually found at the beginning of \ source files. Outer attributes, like `#[test]`, annotate the \ - item following them.") + item following them.", + ) .emit() } } @@ -150,8 +156,9 @@ impl<'a> Parser<'a> { (attr_sp, item, style) } _ => { - let token_str = self.this_token_to_string(); - return Err(self.fatal(&format!("expected `#`, found `{}`", token_str))); + let token_str = pprust::token_to_string(&self.token); + let msg = &format!("expected `#`, found `{}`", token_str); + return Err(self.struct_span_err(self.token.span, msg)); } }; @@ -226,11 +233,13 @@ impl<'a> Parser<'a> { if !lit.kind.is_unsuffixed() { let msg = "suffixed literals are not allowed in attributes"; - self.diagnostic().struct_span_err(lit.span, msg) - .help("instead of using a suffixed literal \ - (1u8, 1.0f32, etc.), use an unsuffixed version \ - (1, 1.0, etc.).") - .emit() + self.struct_span_err(lit.span, msg) + .help( + "instead of using a suffixed literal \ + (`1u8`, `1.0f32`, etc.), use an unsuffixed version \ + (`1`, `1.0`, etc.)", + ) + .emit() } Ok(lit) @@ -288,7 +297,7 @@ impl<'a> Parser<'a> { Ok(meta) } None => self.unexpected(), - } + }; } let lo = self.token.span; @@ -301,8 +310,10 @@ impl<'a> Parser<'a> { crate fn parse_meta_item_kind(&mut self) -> PResult<'a, ast::MetaItemKind> { Ok(if self.eat(&token::Eq) { ast::MetaItemKind::NameValue(self.parse_unsuffixed_lit()?) - } else if self.eat(&token::OpenDelim(token::Paren)) { - ast::MetaItemKind::List(self.parse_meta_seq()?) + } else if self.check(&token::OpenDelim(token::Paren)) { + // Matches `meta_seq = ( COMMASEP(meta_item_inner) )`. + let (list, _) = self.parse_paren_comma_seq(|p| p.parse_meta_item_inner())?; + ast::MetaItemKind::List(list) } else { ast::MetaItemKind::Word }) @@ -311,28 +322,17 @@ impl<'a> Parser<'a> { /// Matches `meta_item_inner : (meta_item | UNSUFFIXED_LIT) ;`. fn parse_meta_item_inner(&mut self) -> PResult<'a, ast::NestedMetaItem> { match self.parse_unsuffixed_lit() { - Ok(lit) => { - return Ok(ast::NestedMetaItem::Literal(lit)) - } + Ok(lit) => return Ok(ast::NestedMetaItem::Literal(lit)), Err(ref mut err) => err.cancel(), } match self.parse_meta_item() { - Ok(mi) => { - return Ok(ast::NestedMetaItem::MetaItem(mi)) - } + Ok(mi) => return Ok(ast::NestedMetaItem::MetaItem(mi)), Err(ref mut err) => err.cancel(), } - let found = self.this_token_to_string(); + let found = pprust::token_to_string(&self.token); let msg = format!("expected unsuffixed literal or identifier, found `{}`", found); - Err(self.diagnostic().struct_span_err(self.token.span, &msg)) - } - - /// Matches `meta_seq = ( COMMASEP(meta_item_inner) )`. - fn parse_meta_seq(&mut self) -> PResult<'a, Vec> { - self.parse_seq_to_end(&token::CloseDelim(token::Paren), - SeqSep::trailing_allowed(token::Comma), - |p: &mut Parser<'a>| p.parse_meta_item_inner()) + Err(self.struct_span_err(self.token.span, &msg)) } } diff --git a/src/librustc_parse/parser/diagnostics.rs b/src/librustc_parse/parser/diagnostics.rs index 60a6fc5ed7..80bc5c158a 100644 --- a/src/librustc_parse/parser/diagnostics.rs +++ b/src/librustc_parse/parser/diagnostics.rs @@ -1,18 +1,19 @@ -use super::{BlockMode, PathStyle, SemiColonMode, TokenType, TokenExpectType, SeqSep, Parser}; +use super::{BlockMode, Parser, PathStyle, SemiColonMode, SeqSep, TokenExpectType, TokenType}; use rustc_data_structures::fx::FxHashSet; -use rustc_errors::{self, PResult, Applicability, DiagnosticBuilder, Handler, pluralize}; -use rustc_error_codes::*; -use syntax::ast::{self, Param, BinOpKind, BindingMode, BlockCheckMode, Expr, ExprKind, Ident, Item}; -use syntax::ast::{ItemKind, Mutability, Pat, PatKind, PathSegment, QSelf, Ty, TyKind}; -use syntax::token::{self, TokenKind, token_can_begin_expr}; +use rustc_errors::{pluralize, struct_span_err}; +use rustc_errors::{Applicability, DiagnosticBuilder, Handler, PResult}; +use rustc_span::source_map::Spanned; +use rustc_span::symbol::kw; +use rustc_span::{MultiSpan, Span, SpanSnippetError, DUMMY_SP}; +use syntax::ast::{ + self, BinOpKind, BindingMode, BlockCheckMode, Expr, ExprKind, Ident, Item, Param, +}; +use syntax::ast::{AttrVec, ItemKind, Mutability, Pat, PatKind, PathSegment, QSelf, Ty, TyKind}; use syntax::print::pprust; use syntax::ptr::P; -use syntax::ThinVec; +use syntax::token::{self, token_can_begin_expr, TokenKind}; use syntax::util::parser::AssocOp; -use syntax::struct_span_err; -use syntax_pos::symbol::{kw, sym}; -use syntax_pos::{Span, DUMMY_SP, MultiSpan, SpanSnippetError}; use log::{debug, trace}; use std::mem; @@ -23,16 +24,12 @@ const TURBOFISH: &'static str = "use `::<...>` instead of `<...>` to specify typ pub(super) fn dummy_arg(ident: Ident) -> Param { let pat = P(Pat { id: ast::DUMMY_NODE_ID, - kind: PatKind::Ident(BindingMode::ByValue(Mutability::Immutable), ident, None), + kind: PatKind::Ident(BindingMode::ByValue(Mutability::Not), ident, None), span: ident.span, }); - let ty = Ty { - kind: TyKind::Err, - span: ident.span, - id: ast::DUMMY_NODE_ID - }; + let ty = Ty { kind: TyKind::Err, span: ident.span, id: ast::DUMMY_NODE_ID }; Param { - attrs: ThinVec::default(), + attrs: AttrVec::default(), id: ast::DUMMY_NODE_ID, pat, span: ident.span, @@ -54,15 +51,10 @@ pub enum Error { secondary_path: String, }, UselessDocComment, - InclusiveRangeWithNoEnd, } impl Error { - fn span_err( - self, - sp: impl Into, - handler: &Handler, - ) -> DiagnosticBuilder<'_> { + fn span_err(self, sp: impl Into, handler: &Handler) -> DiagnosticBuilder<'_> { match self { Error::FileNotFoundForModule { ref mod_name, @@ -79,9 +71,7 @@ impl Error { ); err.help(&format!( "name the file either {} or {} inside the directory \"{}\"", - default_path, - secondary_path, - dir_path, + default_path, secondary_path, dir_path, )); err } @@ -105,18 +95,10 @@ impl Error { E0585, "found a documentation comment that doesn't document anything", ); - err.help("doc comments must come before what they document, maybe a comment was \ - intended with `//`?"); - err - } - Error::InclusiveRangeWithNoEnd => { - let mut err = struct_span_err!( - handler, - sp, - E0586, - "inclusive range with no end", + err.help( + "doc comments must come before what they document, maybe a comment was \ + intended with `//`?", ); - err.help("inclusive ranges must be bounded at the end (`..=b` or `a..=b`)"); err } } @@ -135,11 +117,7 @@ impl RecoverQPath for Ty { Some(P(self.clone())) } fn recovered(qself: Option, path: ast::Path) -> Self { - Self { - span: path.span, - kind: TyKind::Path(qself, path), - id: ast::DUMMY_NODE_ID, - } + Self { span: path.span, kind: TyKind::Path(qself, path), id: ast::DUMMY_NODE_ID } } } @@ -148,11 +126,7 @@ impl RecoverQPath for Pat { self.to_ty() } fn recovered(qself: Option, path: ast::Path) -> Self { - Self { - span: path.span, - kind: PatKind::Path(qself, path), - id: ast::DUMMY_NODE_ID, - } + Self { span: path.span, kind: PatKind::Path(qself, path), id: ast::DUMMY_NODE_ID } } } @@ -164,7 +138,7 @@ impl RecoverQPath for Expr { Self { span: path.span, kind: ExprKind::Path(qself, path), - attrs: ThinVec::new(), + attrs: AttrVec::new(), id: ast::DUMMY_NODE_ID, } } @@ -177,14 +151,6 @@ crate enum ConsumeClosingDelim { } impl<'a> Parser<'a> { - pub fn fatal(&self, m: &str) -> DiagnosticBuilder<'a> { - self.span_fatal(self.token.span, m) - } - - crate fn span_fatal>(&self, sp: S, m: &str) -> DiagnosticBuilder<'a> { - self.sess.span_diagnostic.struct_span_fatal(sp, m) - } - pub(super) fn span_fatal_err>( &self, sp: S, @@ -193,14 +159,6 @@ impl<'a> Parser<'a> { err.span_err(sp, self.diagnostic()) } - pub(super) fn bug(&self, m: &str) -> ! { - self.sess.span_diagnostic.span_bug(self.token.span, m) - } - - pub(super) fn span_err>(&self, sp: S, m: &str) { - self.sess.span_diagnostic.span_err(sp, m) - } - pub fn struct_span_err>(&self, sp: S, m: &str) -> DiagnosticBuilder<'a> { self.sess.span_diagnostic.struct_span_err(sp, m) } @@ -220,7 +178,7 @@ impl<'a> Parser<'a> { pub(super) fn expected_ident_found(&self) -> DiagnosticBuilder<'a> { let mut err = self.struct_span_err( self.token.span, - &format!("expected identifier, found {}", self.this_token_descr()), + &format!("expected identifier, found {}", super::token_descr(&self.token)), ); let valid_follow = &[ TokenKind::Eq, @@ -234,8 +192,8 @@ impl<'a> Parser<'a> { TokenKind::CloseDelim(token::DelimToken::Paren), ]; if let token::Ident(name, false) = self.token.kind { - if Ident::new(name, self.token.span).is_raw_guess() && - self.look_ahead(1, |t| valid_follow.contains(&t.kind)) + if Ident::new(name, self.token.span).is_raw_guess() + && self.look_ahead(1, |t| valid_follow.contains(&t.kind)) { err.span_suggestion( self.token.span, @@ -245,7 +203,7 @@ impl<'a> Parser<'a> { ); } } - if let Some(token_descr) = self.token_descr() { + if let Some(token_descr) = super::token_descr_opt(&self.token) { err.span_label(self.token.span, format!("expected identifier, found {}", token_descr)); } else { err.span_label(self.token.span, "expected identifier"); @@ -269,8 +227,7 @@ impl<'a> Parser<'a> { fn tokens_to_string(tokens: &[TokenType]) -> String { let mut i = tokens.iter(); // This might be a sign we need a connect method on `Iterator`. - let b = i.next() - .map_or(String::new(), |t| t.to_string()); + let b = i.next().map_or(String::new(), |t| t.to_string()); i.enumerate().fold(b, |mut b, (i, a)| { if tokens.len() > 2 && i == tokens.len() - 2 { b.push_str(", or "); @@ -284,7 +241,8 @@ impl<'a> Parser<'a> { }) } - let mut expected = edible.iter() + let mut expected = edible + .iter() .map(|x| TokenType::Token(x.clone())) .chain(inedible.iter().map(|x| TokenType::Token(x.clone()))) .chain(self.expected_tokens.iter().cloned()) @@ -292,50 +250,46 @@ impl<'a> Parser<'a> { expected.sort_by_cached_key(|x| x.to_string()); expected.dedup(); let expect = tokens_to_string(&expected[..]); - let actual = self.this_token_descr(); + let actual = super::token_descr(&self.token); let (msg_exp, (label_sp, label_exp)) = if expected.len() > 1 { let short_expect = if expected.len() > 6 { format!("{} possible tokens", expected.len()) } else { expect.clone() }; - (format!("expected one of {}, found {}", expect, actual), - (self.prev_span.shrink_to_hi(), format!("expected one of {}", short_expect))) + ( + format!("expected one of {}, found {}", expect, actual), + (self.prev_span.shrink_to_hi(), format!("expected one of {}", short_expect)), + ) } else if expected.is_empty() { - (format!("unexpected token: {}", actual), - (self.prev_span, "unexpected token after this".to_string())) + ( + format!("unexpected token: {}", actual), + (self.prev_span, "unexpected token after this".to_string()), + ) } else { - (format!("expected {}, found {}", expect, actual), - (self.prev_span.shrink_to_hi(), format!("expected {}", expect))) + ( + format!("expected {}, found {}", expect, actual), + (self.prev_span.shrink_to_hi(), format!("expected {}", expect)), + ) }; self.last_unexpected_token_span = Some(self.token.span); - let mut err = self.fatal(&msg_exp); - if self.token.is_ident_named(sym::and) { - err.span_suggestion_short( - self.token.span, - "use `&&` instead of `and` for the boolean operator", - "&&".to_string(), - Applicability::MaybeIncorrect, - ); - } - if self.token.is_ident_named(sym::or) { - err.span_suggestion_short( - self.token.span, - "use `||` instead of `or` for the boolean operator", - "||".to_string(), - Applicability::MaybeIncorrect, - ); - } + let mut err = self.struct_span_err(self.token.span, &msg_exp); let sp = if self.token == token::Eof { // This is EOF; don't want to point at the following char, but rather the last token. self.prev_span } else { label_sp }; - match self.recover_closing_delimiter(&expected.iter().filter_map(|tt| match tt { - TokenType::Token(t) => Some(t.clone()), - _ => None, - }).collect::>(), err) { + match self.recover_closing_delimiter( + &expected + .iter() + .filter_map(|tt| match tt { + TokenType::Token(t) => Some(t.clone()), + _ => None, + }) + .collect::>(), + err, + ) { Err(e) => err = e, Ok(recovered) => { return Ok(recovered); @@ -406,10 +360,14 @@ impl<'a> Parser<'a> { } if allow_unstable { // Give extra information about type ascription only if it's a nightly compiler. - err.note("`#![feature(type_ascription)]` lets you annotate an expression with a \ - type: `: `"); - err.note("for more information, see \ - https://github.com/rust-lang/rust/issues/23416"); + err.note( + "`#![feature(type_ascription)]` lets you annotate an expression with a \ + type: `: `", + ); + err.note( + "for more information, see \ + https://github.com/rust-lang/rust/issues/23416", + ); } } } @@ -417,12 +375,11 @@ impl<'a> Parser<'a> { /// Eats and discards tokens until one of `kets` is encountered. Respects token trees, /// passes through any errors encountered. Used for error recovery. pub(super) fn eat_to_tokens(&mut self, kets: &[&TokenKind]) { - if let Err(ref mut err) = self.parse_seq_to_before_tokens( - kets, - SeqSep::none(), - TokenExpectType::Expect, - |p| Ok(p.parse_token_tree()), - ) { + if let Err(ref mut err) = + self.parse_seq_to_before_tokens(kets, SeqSep::none(), TokenExpectType::Expect, |p| { + Ok(p.parse_token_tree()) + }) + { err.cancel(); } } @@ -459,10 +416,8 @@ impl<'a> Parser<'a> { // have already been parsed): // // `x.foo::>>(3)` - let parsed_angle_bracket_args = segment.args - .as_ref() - .map(|args| args.is_angle_bracketed()) - .unwrap_or(false); + let parsed_angle_bracket_args = + segment.args.as_ref().map(|args| args.is_angle_bracketed()).unwrap_or(false); debug!( "check_trailing_angle_brackets: parsed_angle_bracket_args={:?}", @@ -522,18 +477,69 @@ impl<'a> Parser<'a> { let span = lo.until(self.token.span); let total_num_of_gt = number_of_gt + number_of_shr * 2; - self.diagnostic() - .struct_span_err( - span, - &format!("unmatched angle bracket{}", pluralize!(total_num_of_gt)), - ) - .span_suggestion( - span, - &format!("remove extra angle bracket{}", pluralize!(total_num_of_gt)), - String::new(), - Applicability::MachineApplicable, - ) - .emit(); + self.struct_span_err( + span, + &format!("unmatched angle bracket{}", pluralize!(total_num_of_gt)), + ) + .span_suggestion( + span, + &format!("remove extra angle bracket{}", pluralize!(total_num_of_gt)), + String::new(), + Applicability::MachineApplicable, + ) + .emit(); + } + } + + /// Check to see if a pair of chained operators looks like an attempt at chained comparison, + /// e.g. `1 < x <= 3`. If so, suggest either splitting the comparison into two, or + /// parenthesising the leftmost comparison. + fn attempt_chained_comparison_suggestion( + &mut self, + err: &mut DiagnosticBuilder<'_>, + inner_op: &Expr, + outer_op: &Spanned, + ) { + if let ExprKind::Binary(op, ref l1, ref r1) = inner_op.kind { + match (op.node, &outer_op.node) { + // `x < y < z` and friends. + (BinOpKind::Lt, AssocOp::Less) | (BinOpKind::Lt, AssocOp::LessEqual) | + (BinOpKind::Le, AssocOp::LessEqual) | (BinOpKind::Le, AssocOp::Less) | + // `x > y > z` and friends. + (BinOpKind::Gt, AssocOp::Greater) | (BinOpKind::Gt, AssocOp::GreaterEqual) | + (BinOpKind::Ge, AssocOp::GreaterEqual) | (BinOpKind::Ge, AssocOp::Greater) => { + let expr_to_str = |e: &Expr| { + self.span_to_snippet(e.span) + .unwrap_or_else(|_| pprust::expr_to_string(&e)) + }; + err.span_suggestion( + inner_op.span.to(outer_op.span), + "split the comparison into two...", + format!( + "{} {} {} && {} {}", + expr_to_str(&l1), + op.node.to_string(), + expr_to_str(&r1), + expr_to_str(&r1), + outer_op.node.to_ast_binop().unwrap().to_string(), + ), + Applicability::MaybeIncorrect, + ); + err.span_suggestion( + inner_op.span.to(outer_op.span), + "...or parenthesize one of the comparisons", + format!( + "({} {} {}) {}", + expr_to_str(&l1), + op.node.to_string(), + expr_to_str(&r1), + outer_op.node.to_ast_binop().unwrap().to_string(), + ), + Applicability::MaybeIncorrect, + ); + } + _ => {} + } } } @@ -552,30 +558,31 @@ impl<'a> Parser<'a> { /// / \ /// inner_op r2 /// / \ - /// l1 r1 + /// l1 r1 pub(super) fn check_no_chained_comparison( &mut self, - lhs: &Expr, - outer_op: &AssocOp, + inner_op: &Expr, + outer_op: &Spanned, ) -> PResult<'a, Option>> { debug_assert!( - outer_op.is_comparison(), + outer_op.node.is_comparison(), "check_no_chained_comparison: {:?} is not comparison", - outer_op, + outer_op.node, ); - let mk_err_expr = |this: &Self, span| { - Ok(Some(this.mk_expr(span, ExprKind::Err, ThinVec::new()))) - }; + let mk_err_expr = + |this: &Self, span| Ok(Some(this.mk_expr(span, ExprKind::Err, AttrVec::new()))); - match lhs.kind { + match inner_op.kind { ExprKind::Binary(op, _, _) if op.node.is_comparison() => { // Respan to include both operators. let op_span = op.span.to(self.prev_span); - let mut err = self.struct_span_err( - op_span, - "chained comparison operators require parentheses", - ); + let mut err = + self.struct_span_err(op_span, "comparison operators cannot be chained"); + + // If it looks like a genuine attempt to chain operators (as opposed to a + // misformatted turbofish, for instance), suggest a correct form. + self.attempt_chained_comparison_suggestion(&mut err, inner_op, outer_op); let suggest = |err: &mut DiagnosticBuilder<'_>| { err.span_suggestion_verbose( @@ -587,24 +594,22 @@ impl<'a> Parser<'a> { }; if op.node == BinOpKind::Lt && - *outer_op == AssocOp::Less || // Include `<` to provide this recommendation - *outer_op == AssocOp::Greater // even in a case like the following: - { // Foo>> - if *outer_op == AssocOp::Less { + outer_op.node == AssocOp::Less || // Include `<` to provide this recommendation + outer_op.node == AssocOp::Greater + // even in a case like the following: + { + // Foo>> + if outer_op.node == AssocOp::Less { let snapshot = self.clone(); self.bump(); // So far we have parsed `foo(` or `foo< bar >::`, so we rewind the // parser and bail out. mem::replace(self, snapshot.clone()); @@ -626,7 +631,7 @@ impl<'a> Parser<'a> { // FIXME: actually check that the two expressions in the binop are // paths and resynthesize new fn call expression instead of using // `ExprKind::Err` placeholder. - mk_err_expr(self, lhs.span.to(self.prev_span)) + mk_err_expr(self, inner_op.span.to(self.prev_span)) } Err(mut expr_err) => { expr_err.cancel(); @@ -648,7 +653,7 @@ impl<'a> Parser<'a> { // FIXME: actually check that the two expressions in the binop are // paths and resynthesize new fn call expression instead of using // `ExprKind::Err` placeholder. - mk_err_expr(self, lhs.span.to(self.prev_span)) + mk_err_expr(self, inner_op.span.to(self.prev_span)) } } } else { @@ -672,10 +677,8 @@ impl<'a> Parser<'a> { self.bump(); // `(` // Consume the fn call arguments. - let modifiers = [ - (token::OpenDelim(token::Paren), 1), - (token::CloseDelim(token::Paren), -1), - ]; + let modifiers = + [(token::OpenDelim(token::Paren), 1), (token::CloseDelim(token::Paren), -1)]; self.consume_tts(1, &modifiers[..]); if self.token.kind == token::Eof { @@ -784,18 +787,12 @@ impl<'a> Parser<'a> { ) -> PResult<'a, P> { self.expect(&token::ModSep)?; - let mut path = ast::Path { - segments: Vec::new(), - span: DUMMY_SP, - }; + let mut path = ast::Path { segments: Vec::new(), span: DUMMY_SP }; self.parse_path_segments(&mut path.segments, T::PATH_STYLE)?; path.span = ty_span.to(self.prev_span); - let ty_str = self - .span_to_snippet(ty_span) - .unwrap_or_else(|_| pprust::ty_to_string(&ty)); - self.diagnostic() - .struct_span_err(path.span, "missing angle brackets in associated item path") + let ty_str = self.span_to_snippet(ty_span).unwrap_or_else(|_| pprust::ty_to_string(&ty)); + self.struct_span_err(path.span, "missing angle brackets in associated item path") .span_suggestion( // This is a best-effort recovery. path.span, @@ -806,14 +803,7 @@ impl<'a> Parser<'a> { .emit(); let path_span = ty_span.shrink_to_hi(); // Use an empty path since `position == 0`. - Ok(P(T::recovered( - Some(QSelf { - ty, - path_span, - position: 0, - }), - path, - ))) + Ok(P(T::recovered(Some(QSelf { ty, path_span, position: 0 }), path))) } pub(super) fn maybe_consume_incorrect_semicolon(&mut self, items: &[P]) -> bool { @@ -837,10 +827,7 @@ impl<'a> Parser<'a> { _ => None, }; if let Some(name) = previous_item_kind_name { - err.help(&format!( - "{} declarations are not followed by a semicolon", - name - )); + err.help(&format!("{} declarations are not followed by a semicolon", name)); } } err.emit(); @@ -857,7 +844,7 @@ impl<'a> Parser<'a> { t: &TokenKind, ) -> PResult<'a, bool /* recovered */> { let token_str = pprust::token_kind_to_string(t); - let this_token_str = self.this_token_descr(); + let this_token_str = super::token_descr(&self.token); let (prev_sp, sp) = match (&self.token.kind, self.subparser_name) { // Point at the end of the macro call when reaching end of macro arguments. (token::Eof, Some(_)) => { @@ -904,16 +891,18 @@ impl<'a> Parser<'a> { return Ok(()); } let sm = self.sess.source_map(); - let msg = format!("expected `;`, found `{}`", self.this_token_descr()); + let msg = format!("expected `;`, found `{}`", super::token_descr(&self.token)); let appl = Applicability::MachineApplicable; if self.token.span == DUMMY_SP || self.prev_span == DUMMY_SP { // Likely inside a macro, can't provide meaninful suggestions. - return self.expect(&token::Semi).map(|_| ()); + return self.expect(&token::Semi).map(drop); } else if !sm.is_multiline(self.prev_span.until(self.token.span)) { // The current token is in the same line as the prior token, not recoverable. - } else if self.look_ahead(1, |t| t == &token::CloseDelim(token::Brace) - || token_can_begin_expr(t) && t.kind != token::Colon - ) && [token::Comma, token::Colon].contains(&self.token.kind) { + } else if self.look_ahead(1, |t| { + t == &token::CloseDelim(token::Brace) + || token_can_begin_expr(t) && t.kind != token::Colon + }) && [token::Comma, token::Colon].contains(&self.token.kind) + { // Likely typo: `,` → `;` or `:` → `;`. This is triggered if the current token is // either `,` or `:`, and the next token could either start a new statement or is a // block close. For example: @@ -925,12 +914,14 @@ impl<'a> Parser<'a> { self.struct_span_err(sp, &msg) .span_suggestion(sp, "change this to `;`", ";".to_string(), appl) .emit(); - return Ok(()) - } else if self.look_ahead(0, |t| t == &token::CloseDelim(token::Brace) || ( - token_can_begin_expr(t) - && t != &token::Semi - && t != &token::Pound // Avoid triggering with too many trailing `#` in raw string. - )) { + return Ok(()); + } else if self.look_ahead(0, |t| { + t == &token::CloseDelim(token::Brace) + || ( + token_can_begin_expr(t) && t != &token::Semi && t != &token::Pound + // Avoid triggering with too many trailing `#` in raw string. + ) + }) { // Missing semicolon typo. This is triggered if the next token could either start a // new statement or is a block close. For example: // @@ -941,9 +932,9 @@ impl<'a> Parser<'a> { .span_label(self.token.span, "unexpected token") .span_suggestion_short(sp, "add `;` here", ";".to_string(), appl) .emit(); - return Ok(()) + return Ok(()); } - self.expect(&token::Semi).map(|_| ()) // Error unconditionally + self.expect(&token::Semi).map(drop) // Error unconditionally } pub(super) fn parse_semi_or_incorrect_foreign_fn_body( @@ -962,12 +953,17 @@ impl<'a> Parser<'a> { .span_label( extern_sp, "`extern` blocks define existing foreign functions and `fn`s \ - inside of them cannot have a body") - .help("you might have meant to write a function accessible through ffi, \ + inside of them cannot have a body", + ) + .help( + "you might have meant to write a function accessible through ffi, \ which can be done by writing `extern fn` outside of the \ - `extern` block") - .note("for more information, visit \ - https://doc.rust-lang.org/std/keyword.extern.html") + `extern` block", + ) + .note( + "for more information, visit \ + https://doc.rust-lang.org/std/keyword.extern.html", + ) .emit(); } Err(mut err) => { @@ -984,45 +980,51 @@ impl<'a> Parser<'a> { /// Consumes alternative await syntaxes like `await!()`, `await `, /// `await? `, `await()`, and `await { }`. - pub(super) fn parse_incorrect_await_syntax( + pub(super) fn recover_incorrect_await_syntax( &mut self, lo: Span, await_sp: Span, - ) -> PResult<'a, (Span, ExprKind)> { - if self.token == token::Not { + attrs: AttrVec, + ) -> PResult<'a, P> { + let (hi, expr, is_question) = if self.token == token::Not { // Handle `await!()`. - self.expect(&token::Not)?; - self.expect(&token::OpenDelim(token::Paren))?; - let expr = self.parse_expr()?; - self.expect(&token::CloseDelim(token::Paren))?; - let sp = self.error_on_incorrect_await(lo, self.prev_span, &expr, false); - return Ok((sp, ExprKind::Await(expr))) - } + self.recover_await_macro()? + } else { + self.recover_await_prefix(await_sp)? + }; + let sp = self.error_on_incorrect_await(lo, hi, &expr, is_question); + let expr = self.mk_expr(lo.to(sp), ExprKind::Await(expr), attrs); + self.maybe_recover_from_bad_qpath(expr, true) + } + + fn recover_await_macro(&mut self) -> PResult<'a, (Span, P, bool)> { + self.expect(&token::Not)?; + self.expect(&token::OpenDelim(token::Paren))?; + let expr = self.parse_expr()?; + self.expect(&token::CloseDelim(token::Paren))?; + Ok((self.prev_span, expr, false)) + } + fn recover_await_prefix(&mut self, await_sp: Span) -> PResult<'a, (Span, P, bool)> { let is_question = self.eat(&token::Question); // Handle `await? `. let expr = if self.token == token::OpenDelim(token::Brace) { // Handle `await { }`. // This needs to be handled separatedly from the next arm to avoid // interpreting `await { }?` as `?.await`. - self.parse_block_expr( - None, - self.token.span, - BlockCheckMode::Default, - ThinVec::new(), - ) + self.parse_block_expr(None, self.token.span, BlockCheckMode::Default, AttrVec::new()) } else { self.parse_expr() - }.map_err(|mut err| { + } + .map_err(|mut err| { err.span_label(await_sp, "while parsing this incorrect await expression"); err })?; - let sp = self.error_on_incorrect_await(lo, expr.span, &expr, is_question); - Ok((sp, ExprKind::Await(expr))) + Ok((expr.span, expr, is_question)) } fn error_on_incorrect_await(&self, lo: Span, hi: Span, expr: &Expr, is_question: bool) -> Span { - let expr_str = self.span_to_snippet(expr.span) - .unwrap_or_else(|_| pprust::expr_to_string(&expr)); + let expr_str = + self.span_to_snippet(expr.span).unwrap_or_else(|_| pprust::expr_to_string(&expr)); let suggestion = format!("{}.await{}", expr_str, if is_question { "?" } else { "" }); let sp = lo.to(hi); let app = match expr.kind { @@ -1037,8 +1039,8 @@ impl<'a> Parser<'a> { /// If encountering `future.await()`, consumes and emits an error. pub(super) fn recover_from_await_method_call(&mut self) { - if self.token == token::OpenDelim(token::Paren) && - self.look_ahead(1, |t| t == &token::CloseDelim(token::Paren)) + if self.token == token::OpenDelim(token::Paren) + && self.look_ahead(1, |t| t == &token::CloseDelim(token::Paren)) { // future.await() let lo = self.token.span; @@ -1051,7 +1053,8 @@ impl<'a> Parser<'a> { "`await` is not a method call, remove the parentheses", String::new(), Applicability::MachineApplicable, - ).emit() + ) + .emit() } } @@ -1099,23 +1102,22 @@ impl<'a> Parser<'a> { pub(super) fn could_ascription_be_path(&self, node: &ast::ExprKind) -> bool { (self.token == token::Lt && // `foo: true, _ => false, } && !self.token.is_reserved_ident() && // v `foo:bar(baz)` - self.look_ahead(1, |t| t == &token::OpenDelim(token::Paren)) || - self.look_ahead(1, |t| t == &token::Lt) && // `foo:bar` + self.look_ahead(1, |t| t == &token::OpenDelim(token::Paren)) + || self.look_ahead(1, |t| t == &token::Lt) && // `foo:bar` } pub(super) fn recover_seq_parse_error( @@ -1130,7 +1132,7 @@ impl<'a> Parser<'a> { err.emit(); // Recover from parse error, callers expect the closing delim to be consumed. self.consume_block(delim, ConsumeClosingDelim::Yes); - self.mk_expr(lo.to(self.prev_span), ExprKind::Err, ThinVec::new()) + self.mk_expr(lo.to(self.prev_span), ExprKind::Err, AttrVec::new()) } } } @@ -1155,7 +1157,7 @@ impl<'a> Parser<'a> { // this location. Emit the diagnostic and act as if the delimiter was // present for the parser's sake. - // Don't attempt to recover from this unclosed delimiter more than once. + // Don't attempt to recover from this unclosed delimiter more than once. let unmatched = self.unclosed_delims.remove(pos); let delim = TokenType::Token(token::CloseDelim(unmatched.expected_delim)); if unmatched.found_delim.is_none() { @@ -1189,7 +1191,7 @@ impl<'a> Parser<'a> { Err(err) } else { err.emit(); - self.expected_tokens.clear(); // Reduce the number of errors. + self.expected_tokens.clear(); // Reduce the number of errors. Ok(true) } } @@ -1220,17 +1222,15 @@ impl<'a> Parser<'a> { let mut brace_depth = 0; let mut bracket_depth = 0; let mut in_block = false; - debug!("recover_stmt_ enter loop (semi={:?}, block={:?})", - break_on_semi, break_on_block); + debug!("recover_stmt_ enter loop (semi={:?}, block={:?})", break_on_semi, break_on_block); loop { debug!("recover_stmt_ loop {:?}", self.token); match self.token.kind { token::OpenDelim(token::DelimToken::Brace) => { brace_depth += 1; self.bump(); - if break_on_block == BlockMode::Break && - brace_depth == 1 && - bracket_depth == 0 { + if break_on_block == BlockMode::Break && brace_depth == 1 && bracket_depth == 0 + { in_block = true; } } @@ -1263,23 +1263,23 @@ impl<'a> Parser<'a> { } token::Semi => { self.bump(); - if break_on_semi == SemiColonMode::Break && - brace_depth == 0 && - bracket_depth == 0 { + if break_on_semi == SemiColonMode::Break + && brace_depth == 0 + && bracket_depth == 0 + { debug!("recover_stmt_ return - Semi"); break; } } - token::Comma if break_on_semi == SemiColonMode::Comma && - brace_depth == 0 && - bracket_depth == 0 => + token::Comma + if break_on_semi == SemiColonMode::Comma + && brace_depth == 0 + && bracket_depth == 0 => { debug!("recover_stmt_ return - Semi"); break; } - _ => { - self.bump() - } + _ => self.bump(), } } } @@ -1299,8 +1299,9 @@ impl<'a> Parser<'a> { } pub(super) fn expected_semi_or_open_brace(&mut self) -> PResult<'a, T> { - let token_str = self.this_token_descr(); - let mut err = self.fatal(&format!("expected `;` or `{{`, found {}", token_str)); + let token_str = super::token_descr(&self.token); + let msg = &format!("expected `;` or `{{`, found {}", token_str); + let mut err = self.struct_span_err(self.token.span, msg); err.span_label(self.token.span, "expected `;` or `{`"); Err(err) } @@ -1314,9 +1315,9 @@ impl<'a> Parser<'a> { .span_label(self.token.span, "doc comments are not allowed here") .emit(); self.bump(); - } else if self.token == token::Pound && self.look_ahead(1, |t| { - *t == token::OpenDelim(token::Bracket) - }) { + } else if self.token == token::Pound + && self.look_ahead(1, |t| *t == token::OpenDelim(token::Bracket)) + { let lo = self.token.span; // Skip every token until next possible arg. while self.token != token::CloseDelim(token::Bracket) { @@ -1324,12 +1325,9 @@ impl<'a> Parser<'a> { } let sp = lo.to(self.token.span); self.bump(); - self.struct_span_err( - sp, - "attributes cannot be applied to a function parameter's type", - ) - .span_label(sp, "attributes are not allowed here") - .emit(); + self.struct_span_err(sp, "attributes cannot be applied to a function parameter's type") + .span_label(sp, "attributes are not allowed here") + .emit(); } } @@ -1343,9 +1341,10 @@ impl<'a> Parser<'a> { ) -> Option { // If we find a pattern followed by an identifier, it could be an (incorrect) // C-style parameter declaration. - if self.check_ident() && self.look_ahead(1, |t| { - *t == token::Comma || *t == token::CloseDelim(token::Paren) - }) { // `fn foo(String s) {}` + if self.check_ident() + && self.look_ahead(1, |t| *t == token::Comma || *t == token::CloseDelim(token::Paren)) + { + // `fn foo(String s) {}` let ident = self.parse_ident().unwrap(); let span = pat.span.with_hi(ident.span.hi()); @@ -1357,12 +1356,13 @@ impl<'a> Parser<'a> { ); return Some(ident); } else if let PatKind::Ident(_, ident, _) = pat.kind { - if require_name && ( - is_trait_item || - self.token == token::Comma || - self.token == token::Lt || - self.token == token::CloseDelim(token::Paren) - ) { // `fn foo(a, b) {}`, `fn foo(a, b) {}` or `fn foo(usize, usize) {}` + if require_name + && (is_trait_item + || self.token == token::Comma + || self.token == token::Lt + || self.token == token::CloseDelim(token::Paren)) + { + // `fn foo(a, b) {}`, `fn foo(a, b) {}` or `fn foo(usize, usize) {}` if is_self_allowed { err.span_suggestion( pat.span, @@ -1416,11 +1416,7 @@ impl<'a> Parser<'a> { .emit(); // Pretend the pattern is `_`, to avoid duplicate errors from AST validation. - let pat = P(Pat { - kind: PatKind::Wild, - span: pat.span, - id: ast::DUMMY_NODE_ID - }); + let pat = P(Pat { kind: PatKind::Wild, span: pat.span, id: ast::DUMMY_NODE_ID }); Ok((pat, ty)) } @@ -1479,10 +1475,10 @@ impl<'a> Parser<'a> { let sp = self.sess.source_map().next_point(self.token.span); (sp, format!("expected expression, found end of {}", origin)) } - _ => (self.token.span, format!( - "expected expression, found {}", - self.this_token_descr(), - )), + _ => ( + self.token.span, + format!("expected expression, found {}", super::token_descr(&self.token),), + ), }; let mut err = self.struct_span_err(span, &msg); let sp = self.sess.source_map().start_point(self.token.span); @@ -1521,9 +1517,9 @@ impl<'a> Parser<'a> { pub(super) fn deduplicate_recovered_params_names(&self, fn_inputs: &mut Vec) { let mut seen_inputs = FxHashSet::default(); for input in fn_inputs.iter_mut() { - let opt_ident = if let (PatKind::Ident(_, ident, _), TyKind::Err) = ( - &input.pat.kind, &input.ty.kind, - ) { + let opt_ident = if let (PatKind::Ident(_, ident, _), TyKind::Err) = + (&input.pat.kind, &input.ty.kind) + { Some(*ident) } else { None diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs index b84e9cab5f..098c8355ab 100644 --- a/src/librustc_parse/parser/expr.rs +++ b/src/librustc_parse/parser/expr.rs @@ -1,23 +1,23 @@ -use super::{Parser, Restrictions, PrevTokenKind, TokenType, PathStyle, BlockMode}; -use super::{SemiColonMode, SeqSep, TokenExpectType}; use super::pat::{GateOr, PARAM_EXPECTED}; -use super::diagnostics::Error; +use super::{BlockMode, Parser, PathStyle, PrevTokenKind, Restrictions, TokenType}; +use super::{SemiColonMode, SeqSep, TokenExpectType}; use crate::maybe_recover_from_interpolated_ty_qpath; -use rustc_data_structures::thin_vec::ThinVec; -use rustc_errors::{PResult, Applicability}; -use syntax::ast::{self, DUMMY_NODE_ID, Attribute, AttrStyle, Ident, CaptureBy, BlockCheckMode}; -use syntax::ast::{Expr, ExprKind, RangeLimits, Label, Movability, IsAsync, Arm, Ty, TyKind}; -use syntax::ast::{FunctionRetTy, Param, FnDecl, BinOpKind, BinOp, UnOp, Mac, AnonConst, Field, Lit}; -use syntax::token::{self, Token, TokenKind}; +use rustc_errors::{Applicability, PResult}; +use rustc_span::source_map::{self, Span, Spanned}; +use rustc_span::symbol::{kw, sym, Symbol}; +use std::mem; +use syntax::ast::{self, AttrStyle, AttrVec, CaptureBy, Field, Ident, Lit, DUMMY_NODE_ID}; +use syntax::ast::{ + AnonConst, BinOp, BinOpKind, FnDecl, FunctionRetTy, Mac, Param, Ty, TyKind, UnOp, +}; +use syntax::ast::{Arm, BlockCheckMode, Expr, ExprKind, IsAsync, Label, Movability, RangeLimits}; use syntax::print::pprust; use syntax::ptr::P; +use syntax::token::{self, Token, TokenKind}; use syntax::util::classify; use syntax::util::literal::LitError; -use syntax::util::parser::{AssocOp, Fixity, prec_let_scrutinee_needs_par}; -use syntax_pos::source_map::{self, Span}; -use syntax_pos::symbol::{kw, sym, Symbol}; -use std::mem; +use syntax::util::parser::{prec_let_scrutinee_needs_par, AssocOp, Fixity}; /// Possibly accepts an `token::Interpolated` expression (a pre-parsed expression /// dropped into the token stream, which happens while parsing the result of @@ -37,41 +37,41 @@ macro_rules! maybe_whole_expr { let path = path.clone(); $p.bump(); return Ok($p.mk_expr( - $p.token.span, ExprKind::Path(None, path), ThinVec::new() + $p.token.span, + ExprKind::Path(None, path), + AttrVec::new(), )); } token::NtBlock(block) => { let block = block.clone(); $p.bump(); return Ok($p.mk_expr( - $p.token.span, ExprKind::Block(block, None), ThinVec::new() + $p.token.span, + ExprKind::Block(block, None), + AttrVec::new(), )); } // N.B., `NtIdent(ident)` is normalized to `Ident` in `fn bump`. - _ => {}, + _ => {} }; } - } + }; } #[derive(Debug)] pub(super) enum LhsExpr { NotYetParsed, - AttributesParsed(ThinVec), + AttributesParsed(AttrVec), AlreadyParsed(P), } -impl From>> for LhsExpr { +impl From> for LhsExpr { /// Converts `Some(attrs)` into `LhsExpr::AttributesParsed(attrs)` /// and `None` into `LhsExpr::NotYetParsed`. /// /// This conversion does not allocate. - fn from(o: Option>) -> Self { - if let Some(attrs) = o { - LhsExpr::AttributesParsed(attrs) - } else { - LhsExpr::NotYetParsed - } + fn from(o: Option) -> Self { + if let Some(attrs) = o { LhsExpr::AttributesParsed(attrs) } else { LhsExpr::NotYetParsed } } } @@ -91,25 +91,31 @@ impl<'a> Parser<'a> { self.parse_expr_res(Restrictions::empty(), None) } + pub(super) fn parse_anon_const_expr(&mut self) -> PResult<'a, AnonConst> { + self.parse_expr().map(|value| AnonConst { id: DUMMY_NODE_ID, value }) + } + + fn parse_expr_catch_underscore(&mut self) -> PResult<'a, P> { + match self.parse_expr() { + Ok(expr) => Ok(expr), + Err(mut err) => match self.token.kind { + token::Ident(name, false) + if name == kw::Underscore && self.look_ahead(1, |t| t == &token::Comma) => + { + // Special-case handling of `foo(_, _, _)` + err.emit(); + let sp = self.token.span; + self.bump(); + Ok(self.mk_expr(sp, ExprKind::Err, AttrVec::new())) + } + _ => Err(err), + }, + } + } + + /// Parses a sequence of expressions delimited by parentheses. fn parse_paren_expr_seq(&mut self) -> PResult<'a, Vec>> { - self.parse_paren_comma_seq(|p| { - match p.parse_expr() { - Ok(expr) => Ok(expr), - Err(mut err) => match p.token.kind { - token::Ident(name, false) - if name == kw::Underscore && p.look_ahead(1, |t| { - t == &token::Comma - }) => { - // Special-case handling of `foo(_, _, _)` - err.emit(); - let sp = p.token.span; - p.bump(); - Ok(p.mk_expr(sp, ExprKind::Err, ThinVec::new())) - } - _ => Err(err), - }, - } - }).map(|(r, _)| r) + self.parse_paren_comma_seq(|p| p.parse_expr_catch_underscore()).map(|(r, _)| r) } /// Parses an expression, subject to the given restrictions. @@ -117,7 +123,7 @@ impl<'a> Parser<'a> { pub(super) fn parse_expr_res( &mut self, r: Restrictions, - already_parsed_attrs: Option> + already_parsed_attrs: Option, ) -> PResult<'a, P> { self.with_res(r, |this| this.parse_assoc_expr(already_parsed_attrs)) } @@ -127,10 +133,7 @@ impl<'a> Parser<'a> { /// This parses an expression accounting for associativity and precedence of the operators in /// the expression. #[inline] - fn parse_assoc_expr( - &mut self, - already_parsed_attrs: Option>, - ) -> PResult<'a, P> { + fn parse_assoc_expr(&mut self, already_parsed_attrs: Option) -> PResult<'a, P> { self.parse_assoc_expr_with(0, already_parsed_attrs.into()) } @@ -155,53 +158,13 @@ impl<'a> Parser<'a> { }; let last_type_ascription_set = self.last_type_ascription.is_some(); - match (self.expr_is_complete(&lhs), AssocOp::from_token(&self.token)) { - (true, None) => { - self.last_type_ascription = None; - // Semi-statement forms are odd. See https://github.com/rust-lang/rust/issues/29071 - return Ok(lhs); - } - (false, _) => {} // continue parsing the expression - // An exhaustive check is done in the following block, but these are checked first - // because they *are* ambiguous but also reasonable looking incorrect syntax, so we - // want to keep their span info to improve diagnostics in these cases in a later stage. - (true, Some(AssocOp::Multiply)) | // `{ 42 } *foo = bar;` or `{ 42 } * 3` - (true, Some(AssocOp::Subtract)) | // `{ 42 } -5` - (true, Some(AssocOp::LAnd)) | // `{ 42 } &&x` (#61475) - (true, Some(AssocOp::Add)) // `{ 42 } + 42 - // If the next token is a keyword, then the tokens above *are* unambiguously incorrect: - // `if x { a } else { b } && if y { c } else { d }` - if !self.look_ahead(1, |t| t.is_reserved_ident()) => { - self.last_type_ascription = None; - // These cases are ambiguous and can't be identified in the parser alone - let sp = self.sess.source_map().start_point(self.token.span); - self.sess.ambiguous_block_expr_parse.borrow_mut().insert(sp, lhs.span); - return Ok(lhs); - } - (true, Some(ref op)) if !op.can_continue_expr_unambiguously() => { - self.last_type_ascription = None; - return Ok(lhs); - } - (true, Some(_)) => { - // We've found an expression that would be parsed as a statement, but the next - // token implies this should be parsed as an expression. - // For example: `if let Some(x) = x { x } else { 0 } / 2` - let mut err = self.struct_span_err(self.token.span, &format!( - "expected expression, found `{}`", - pprust::token_to_string(&self.token), - )); - err.span_label(self.token.span, "expected expression"); - self.sess.expr_parentheses_needed( - &mut err, - lhs.span, - Some(pprust::expr_to_string(&lhs), - )); - err.emit(); - } + if !self.should_continue_as_assoc_expr(&lhs) { + self.last_type_ascription = None; + return Ok(lhs); } - self.expected_tokens.push(TokenType::Operator); - while let Some(op) = AssocOp::from_token(&self.token) { + self.expected_tokens.push(TokenType::Operator); + while let Some(op) = self.check_assoc_op() { // Adjust the span for interpolated LHS to point to the `$lhs` token and not to what // it refers to. Interpolated identifiers are unwrapped early and never show up here // as `PrevTokenKind::Interpolated` so if LHS is a single identifier we always process @@ -209,22 +172,25 @@ impl<'a> Parser<'a> { let lhs_span = match (self.prev_token_kind, &lhs.kind) { (PrevTokenKind::Interpolated, _) => self.prev_span, (PrevTokenKind::Ident, &ExprKind::Path(None, ref path)) - if path.segments.len() == 1 => self.prev_span, + if path.segments.len() == 1 => + { + self.prev_span + } _ => lhs.span, }; let cur_op_span = self.token.span; - let restrictions = if op.is_assign_like() { + let restrictions = if op.node.is_assign_like() { self.restrictions & Restrictions::NO_STRUCT_LITERAL } else { self.restrictions }; - let prec = op.precedence(); + let prec = op.node.precedence(); if prec < min_prec { break; } // Check for deprecated `...` syntax - if self.token == token::DotDotDot && op == AssocOp::DotDotEq { + if self.token == token::DotDotDot && op.node == AssocOp::DotDotEq { self.err_dotdotdot_syntax(self.token.span); } @@ -233,47 +199,24 @@ impl<'a> Parser<'a> { } self.bump(); - if op.is_comparison() { + if op.node.is_comparison() { if let Some(expr) = self.check_no_chained_comparison(&lhs, &op)? { return Ok(expr); } } + let op = op.node; // Special cases: if op == AssocOp::As { lhs = self.parse_assoc_op_cast(lhs, lhs_span, ExprKind::Cast)?; - continue + continue; } else if op == AssocOp::Colon { - let maybe_path = self.could_ascription_be_path(&lhs.kind); - self.last_type_ascription = Some((self.prev_span, maybe_path)); - - lhs = self.parse_assoc_op_cast(lhs, lhs_span, ExprKind::Type)?; - self.sess.gated_spans.gate(sym::type_ascription, lhs.span); - continue + lhs = self.parse_assoc_op_ascribe(lhs, lhs_span)?; + continue; } else if op == AssocOp::DotDot || op == AssocOp::DotDotEq { // If we didn’t have to handle `x..`/`x..=`, it would be pretty easy to // generalise it to the Fixity::None code. - // - // We have 2 alternatives here: `x..y`/`x..=y` and `x..`/`x..=` The other - // two variants are handled with `parse_prefix_range_expr` call above. - let rhs = if self.is_at_start_of_range_notation_rhs() { - Some(self.parse_assoc_expr_with(prec + 1, LhsExpr::NotYetParsed)?) - } else { - None - }; - let (lhs_span, rhs_span) = (lhs.span, if let Some(ref x) = rhs { - x.span - } else { - cur_op_span - }); - let limits = if op == AssocOp::DotDot { - RangeLimits::HalfOpen - } else { - RangeLimits::Closed - }; - - let r = self.mk_range(Some(lhs), rhs, limits)?; - lhs = self.mk_expr(lhs_span.to(rhs_span), r, ThinVec::new()); - break + lhs = self.parse_range_expr(prec, lhs, op, cur_op_span)?; + break; } let fixity = op.fixity(); @@ -284,10 +227,9 @@ impl<'a> Parser<'a> { // the special cases. The code is here only for future convenience. Fixity::None => 1, }; - let rhs = self.with_res( - restrictions - Restrictions::STMT_EXPR, - |this| this.parse_assoc_expr_with(prec + prec_adjustment, LhsExpr::NotYetParsed) - )?; + let rhs = self.with_res(restrictions - Restrictions::STMT_EXPR, |this| { + this.parse_assoc_expr_with(prec + prec_adjustment, LhsExpr::NotYetParsed) + })?; // Make sure that the span of the parent node is larger than the span of lhs and rhs, // including the attributes. @@ -299,38 +241,55 @@ impl<'a> Parser<'a> { .map_or(lhs_span, |a| a.span); let span = lhs_span.to(rhs.span); lhs = match op { - AssocOp::Add | AssocOp::Subtract | AssocOp::Multiply | AssocOp::Divide | - AssocOp::Modulus | AssocOp::LAnd | AssocOp::LOr | AssocOp::BitXor | - AssocOp::BitAnd | AssocOp::BitOr | AssocOp::ShiftLeft | AssocOp::ShiftRight | - AssocOp::Equal | AssocOp::Less | AssocOp::LessEqual | AssocOp::NotEqual | - AssocOp::Greater | AssocOp::GreaterEqual => { + AssocOp::Add + | AssocOp::Subtract + | AssocOp::Multiply + | AssocOp::Divide + | AssocOp::Modulus + | AssocOp::LAnd + | AssocOp::LOr + | AssocOp::BitXor + | AssocOp::BitAnd + | AssocOp::BitOr + | AssocOp::ShiftLeft + | AssocOp::ShiftRight + | AssocOp::Equal + | AssocOp::Less + | AssocOp::LessEqual + | AssocOp::NotEqual + | AssocOp::Greater + | AssocOp::GreaterEqual => { let ast_op = op.to_ast_binop().unwrap(); let binary = self.mk_binary(source_map::respan(cur_op_span, ast_op), lhs, rhs); - self.mk_expr(span, binary, ThinVec::new()) + self.mk_expr(span, binary, AttrVec::new()) + } + AssocOp::Assign => { + self.mk_expr(span, ExprKind::Assign(lhs, rhs, cur_op_span), AttrVec::new()) } - AssocOp::Assign => self.mk_expr(span, ExprKind::Assign(lhs, rhs), ThinVec::new()), AssocOp::AssignOp(k) => { let aop = match k { - token::Plus => BinOpKind::Add, - token::Minus => BinOpKind::Sub, - token::Star => BinOpKind::Mul, - token::Slash => BinOpKind::Div, + token::Plus => BinOpKind::Add, + token::Minus => BinOpKind::Sub, + token::Star => BinOpKind::Mul, + token::Slash => BinOpKind::Div, token::Percent => BinOpKind::Rem, - token::Caret => BinOpKind::BitXor, - token::And => BinOpKind::BitAnd, - token::Or => BinOpKind::BitOr, - token::Shl => BinOpKind::Shl, - token::Shr => BinOpKind::Shr, + token::Caret => BinOpKind::BitXor, + token::And => BinOpKind::BitAnd, + token::Or => BinOpKind::BitOr, + token::Shl => BinOpKind::Shl, + token::Shr => BinOpKind::Shr, }; let aopexpr = self.mk_assign_op(source_map::respan(cur_op_span, aop), lhs, rhs); - self.mk_expr(span, aopexpr, ThinVec::new()) + self.mk_expr(span, aopexpr, AttrVec::new()) } AssocOp::As | AssocOp::Colon | AssocOp::DotDot | AssocOp::DotDotEq => { - self.bug("AssocOp should have been handled by special case") + self.span_bug(span, "AssocOp should have been handled by special case") } }; - if let Fixity::None = fixity { break } + if let Fixity::None = fixity { + break; + } } if last_type_ascription_set { self.last_type_ascription = None; @@ -338,10 +297,108 @@ impl<'a> Parser<'a> { Ok(lhs) } + fn should_continue_as_assoc_expr(&mut self, lhs: &Expr) -> bool { + match (self.expr_is_complete(lhs), self.check_assoc_op().map(|op| op.node)) { + // Semi-statement forms are odd: + // See https://github.com/rust-lang/rust/issues/29071 + (true, None) => false, + (false, _) => true, // Continue parsing the expression. + // An exhaustive check is done in the following block, but these are checked first + // because they *are* ambiguous but also reasonable looking incorrect syntax, so we + // want to keep their span info to improve diagnostics in these cases in a later stage. + (true, Some(AssocOp::Multiply)) | // `{ 42 } *foo = bar;` or `{ 42 } * 3` + (true, Some(AssocOp::Subtract)) | // `{ 42 } -5` + (true, Some(AssocOp::LAnd)) | // `{ 42 } &&x` (#61475) + (true, Some(AssocOp::Add)) // `{ 42 } + 42 + // If the next token is a keyword, then the tokens above *are* unambiguously incorrect: + // `if x { a } else { b } && if y { c } else { d }` + if !self.look_ahead(1, |t| t.is_reserved_ident()) => { + // These cases are ambiguous and can't be identified in the parser alone. + let sp = self.sess.source_map().start_point(self.token.span); + self.sess.ambiguous_block_expr_parse.borrow_mut().insert(sp, lhs.span); + false + } + (true, Some(ref op)) if !op.can_continue_expr_unambiguously() => false, + (true, Some(_)) => { + self.error_found_expr_would_be_stmt(lhs); + true + } + } + } + + /// We've found an expression that would be parsed as a statement, + /// but the next token implies this should be parsed as an expression. + /// For example: `if let Some(x) = x { x } else { 0 } / 2`. + fn error_found_expr_would_be_stmt(&self, lhs: &Expr) { + let mut err = self.struct_span_err( + self.token.span, + &format!("expected expression, found `{}`", pprust::token_to_string(&self.token),), + ); + err.span_label(self.token.span, "expected expression"); + self.sess.expr_parentheses_needed(&mut err, lhs.span, Some(pprust::expr_to_string(&lhs))); + err.emit(); + } + + /// Possibly translate the current token to an associative operator. + /// The method does not advance the current token. + /// + /// Also performs recovery for `and` / `or` which are mistaken for `&&` and `||` respectively. + fn check_assoc_op(&self) -> Option> { + Some(Spanned { + node: match (AssocOp::from_token(&self.token), &self.token.kind) { + (Some(op), _) => op, + (None, token::Ident(sym::and, false)) => { + self.error_bad_logical_op("and", "&&", "conjunction"); + AssocOp::LAnd + } + (None, token::Ident(sym::or, false)) => { + self.error_bad_logical_op("or", "||", "disjunction"); + AssocOp::LOr + } + _ => return None, + }, + span: self.token.span, + }) + } + + /// Error on `and` and `or` suggesting `&&` and `||` respectively. + fn error_bad_logical_op(&self, bad: &str, good: &str, english: &str) { + self.struct_span_err(self.token.span, &format!("`{}` is not a logical operator", bad)) + .span_suggestion_short( + self.token.span, + &format!("use `{}` to perform logical {}", good, english), + good.to_string(), + Applicability::MachineApplicable, + ) + .note("unlike in e.g., python and PHP, `&&` and `||` are used for logical operators") + .emit(); + } + /// Checks if this expression is a successfully parsed statement. fn expr_is_complete(&self, e: &Expr) -> bool { - self.restrictions.contains(Restrictions::STMT_EXPR) && - !classify::expr_requires_semi_to_be_stmt(e) + self.restrictions.contains(Restrictions::STMT_EXPR) + && !classify::expr_requires_semi_to_be_stmt(e) + } + + /// Parses `x..y`, `x..=y`, and `x..`/`x..=`. + /// The other two variants are handled in `parse_prefix_range_expr` below. + fn parse_range_expr( + &mut self, + prec: usize, + lhs: P, + op: AssocOp, + cur_op_span: Span, + ) -> PResult<'a, P> { + let rhs = if self.is_at_start_of_range_notation_rhs() { + Some(self.parse_assoc_expr_with(prec + 1, LhsExpr::NotYetParsed)?) + } else { + None + }; + let rhs_span = rhs.as_ref().map_or(cur_op_span, |x| x.span); + let span = lhs.span.to(rhs_span); + let limits = + if op == AssocOp::DotDot { RangeLimits::HalfOpen } else { RangeLimits::Closed }; + Ok(self.mk_expr(span, self.mk_range(Some(lhs), rhs, limits)?, AttrVec::new())) } fn is_at_start_of_range_notation_rhs(&self) -> bool { @@ -357,139 +414,118 @@ impl<'a> Parser<'a> { } /// Parses prefix-forms of range notation: `..expr`, `..`, `..=expr`. - fn parse_prefix_range_expr( - &mut self, - already_parsed_attrs: Option> - ) -> PResult<'a, P> { + fn parse_prefix_range_expr(&mut self, attrs: Option) -> PResult<'a, P> { // Check for deprecated `...` syntax. if self.token == token::DotDotDot { self.err_dotdotdot_syntax(self.token.span); } - debug_assert!([token::DotDot, token::DotDotDot, token::DotDotEq].contains(&self.token.kind), - "parse_prefix_range_expr: token {:?} is not DotDot/DotDotEq", - self.token); - let tok = self.token.clone(); - let attrs = self.parse_or_use_outer_attributes(already_parsed_attrs)?; + debug_assert!( + [token::DotDot, token::DotDotDot, token::DotDotEq].contains(&self.token.kind), + "parse_prefix_range_expr: token {:?} is not DotDot/DotDotEq", + self.token + ); + + let limits = match self.token.kind { + token::DotDot => RangeLimits::HalfOpen, + _ => RangeLimits::Closed, + }; + let op = AssocOp::from_token(&self.token); + let attrs = self.parse_or_use_outer_attributes(attrs)?; let lo = self.token.span; - let mut hi = self.token.span; self.bump(); - let opt_end = if self.is_at_start_of_range_notation_rhs() { + let (span, opt_end) = if self.is_at_start_of_range_notation_rhs() { // RHS must be parsed with more associativity than the dots. - let next_prec = AssocOp::from_token(&tok).unwrap().precedence() + 1; - Some(self.parse_assoc_expr_with(next_prec, LhsExpr::NotYetParsed) - .map(|x| { - hi = x.span; - x - })?) - } else { - None - }; - let limits = if tok == token::DotDot { - RangeLimits::HalfOpen + self.parse_assoc_expr_with(op.unwrap().precedence() + 1, LhsExpr::NotYetParsed) + .map(|x| (lo.to(x.span), Some(x)))? } else { - RangeLimits::Closed + (lo, None) }; - - let r = self.mk_range(None, opt_end, limits)?; - Ok(self.mk_expr(lo.to(hi), r, attrs)) + Ok(self.mk_expr(span, self.mk_range(None, opt_end, limits)?, attrs)) } /// Parses a prefix-unary-operator expr. - fn parse_prefix_expr( - &mut self, - already_parsed_attrs: Option> - ) -> PResult<'a, P> { - let attrs = self.parse_or_use_outer_attributes(already_parsed_attrs)?; + fn parse_prefix_expr(&mut self, attrs: Option) -> PResult<'a, P> { + let attrs = self.parse_or_use_outer_attributes(attrs)?; let lo = self.token.span; // Note: when adding new unary operators, don't forget to adjust TokenKind::can_begin_expr() let (hi, ex) = match self.token.kind { - token::Not => { - self.bump(); - let e = self.parse_prefix_expr(None); - let (span, e) = self.interpolated_or_expr_span(e)?; - (lo.to(span), self.mk_unary(UnOp::Not, e)) - } - // Suggest `!` for bitwise negation when encountering a `~` - token::Tilde => { - self.bump(); - let e = self.parse_prefix_expr(None); - let (span, e) = self.interpolated_or_expr_span(e)?; - let span_of_tilde = lo; - self.struct_span_err(span_of_tilde, "`~` cannot be used as a unary operator") - .span_suggestion_short( - span_of_tilde, - "use `!` to perform bitwise not", - "!".to_owned(), - Applicability::MachineApplicable - ) - .emit(); - (lo.to(span), self.mk_unary(UnOp::Not, e)) - } - token::BinOp(token::Minus) => { - self.bump(); - let e = self.parse_prefix_expr(None); - let (span, e) = self.interpolated_or_expr_span(e)?; - (lo.to(span), self.mk_unary(UnOp::Neg, e)) - } - token::BinOp(token::Star) => { - self.bump(); - let e = self.parse_prefix_expr(None); - let (span, e) = self.interpolated_or_expr_span(e)?; - (lo.to(span), self.mk_unary(UnOp::Deref, e)) - } - token::BinOp(token::And) | token::AndAnd => { - self.parse_address_of(lo)? - } - token::Ident(..) if self.token.is_keyword(kw::Box) => { - self.bump(); - let e = self.parse_prefix_expr(None); - let (span, e) = self.interpolated_or_expr_span(e)?; - let span = lo.to(span); - self.sess.gated_spans.gate(sym::box_syntax, span); - (span, ExprKind::Box(e)) - } - token::Ident(..) if self.token.is_ident_named(sym::not) => { - // `not` is just an ordinary identifier in Rust-the-language, - // but as `rustc`-the-compiler, we can issue clever diagnostics - // for confused users who really want to say `!` - let token_cannot_continue_expr = |t: &Token| match t.kind { - // These tokens can start an expression after `!`, but - // can't continue an expression after an ident - token::Ident(name, is_raw) => token::ident_can_begin_expr(name, t.span, is_raw), - token::Literal(..) | token::Pound => true, - _ => t.is_whole_expr(), - }; - let cannot_continue_expr = self.look_ahead(1, token_cannot_continue_expr); - if cannot_continue_expr { - self.bump(); - // Emit the error ... - self.struct_span_err( - self.token.span, - &format!("unexpected {} after identifier",self.this_token_descr()) - ) - .span_suggestion_short( - // Span the `not` plus trailing whitespace to avoid - // trailing whitespace after the `!` in our suggestion - self.sess.source_map() - .span_until_non_whitespace(lo.to(self.token.span)), - "use `!` to perform logical negation", - "!".to_owned(), - Applicability::MachineApplicable - ) - .emit(); - // —and recover! (just as if we were in the block - // for the `token::Not` arm) - let e = self.parse_prefix_expr(None); - let (span, e) = self.interpolated_or_expr_span(e)?; - (lo.to(span), self.mk_unary(UnOp::Not, e)) - } else { - return self.parse_dot_or_call_expr(Some(attrs)); - } - } - _ => { return self.parse_dot_or_call_expr(Some(attrs)); } + token::Not => self.parse_unary_expr(lo, UnOp::Not), // `!expr` + token::Tilde => self.recover_tilde_expr(lo), // `~expr` + token::BinOp(token::Minus) => self.parse_unary_expr(lo, UnOp::Neg), // `-expr` + token::BinOp(token::Star) => self.parse_unary_expr(lo, UnOp::Deref), // `*expr` + token::BinOp(token::And) | token::AndAnd => self.parse_borrow_expr(lo), + token::Ident(..) if self.token.is_keyword(kw::Box) => self.parse_box_expr(lo), + token::Ident(..) if self.is_mistaken_not_ident_negation() => self.recover_not_expr(lo), + _ => return self.parse_dot_or_call_expr(Some(attrs)), + }?; + Ok(self.mk_expr(lo.to(hi), ex, attrs)) + } + + fn parse_prefix_expr_common(&mut self, lo: Span) -> PResult<'a, (Span, P)> { + self.bump(); + let expr = self.parse_prefix_expr(None); + let (span, expr) = self.interpolated_or_expr_span(expr)?; + Ok((lo.to(span), expr)) + } + + fn parse_unary_expr(&mut self, lo: Span, op: UnOp) -> PResult<'a, (Span, ExprKind)> { + let (span, expr) = self.parse_prefix_expr_common(lo)?; + Ok((span, self.mk_unary(op, expr))) + } + + // Recover on `!` suggesting for bitwise negation instead. + fn recover_tilde_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> { + self.struct_span_err(lo, "`~` cannot be used as a unary operator") + .span_suggestion_short( + lo, + "use `!` to perform bitwise not", + "!".to_owned(), + Applicability::MachineApplicable, + ) + .emit(); + + self.parse_unary_expr(lo, UnOp::Not) + } + + /// Parse `box expr`. + fn parse_box_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> { + let (span, expr) = self.parse_prefix_expr_common(lo)?; + self.sess.gated_spans.gate(sym::box_syntax, span); + Ok((span, ExprKind::Box(expr))) + } + + fn is_mistaken_not_ident_negation(&self) -> bool { + let token_cannot_continue_expr = |t: &Token| match t.kind { + // These tokens can start an expression after `!`, but + // can't continue an expression after an ident + token::Ident(name, is_raw) => token::ident_can_begin_expr(name, t.span, is_raw), + token::Literal(..) | token::Pound => true, + _ => t.is_whole_expr(), }; - return Ok(self.mk_expr(lo.to(hi), ex, attrs)); + self.token.is_ident_named(sym::not) && self.look_ahead(1, token_cannot_continue_expr) + } + + /// Recover on `not expr` in favor of `!expr`. + fn recover_not_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> { + // Emit the error... + let not_token = self.look_ahead(1, |t| t.clone()); + self.struct_span_err( + not_token.span, + &format!("unexpected {} after identifier", super::token_descr(¬_token)), + ) + .span_suggestion_short( + // Span the `not` plus trailing whitespace to avoid + // trailing whitespace after the `!` in our suggestion + self.sess.source_map().span_until_non_whitespace(lo.to(not_token.span)), + "use `!` to perform logical negation", + "!".to_owned(), + Applicability::MachineApplicable, + ) + .emit(); + + // ...and recover! + self.parse_unary_expr(lo, UnOp::Not) } /// Returns the span of expr, if it was not interpolated or the span of the interpolated token. @@ -506,20 +542,21 @@ impl<'a> Parser<'a> { }) } - fn parse_assoc_op_cast(&mut self, lhs: P, lhs_span: Span, - expr_kind: fn(P, P) -> ExprKind) - -> PResult<'a, P> { + fn parse_assoc_op_cast( + &mut self, + lhs: P, + lhs_span: Span, + expr_kind: fn(P, P) -> ExprKind, + ) -> PResult<'a, P> { let mk_expr = |this: &mut Self, rhs: P| { - this.mk_expr(lhs_span.to(rhs.span), expr_kind(lhs, rhs), ThinVec::new()) + this.mk_expr(lhs_span.to(rhs.span), expr_kind(lhs, rhs), AttrVec::new()) }; // Save the state of the parser before parsing type normally, in case there is a // LessThan comparison after this cast. let parser_snapshot_before_type = self.clone(); match self.parse_ty_no_plus() { - Ok(rhs) => { - Ok(mk_expr(self, rhs)) - } + Ok(rhs) => Ok(mk_expr(self, rhs)), Err(mut type_err) => { // Rewind to before attempting to parse the type with generics, to recover // from situations like `x as usize < y` in which we first tried to parse @@ -553,19 +590,16 @@ impl<'a> Parser<'a> { op_noun, ); let span_after_type = parser_snapshot_after_type.token.span; - let expr = mk_expr(self, P(Ty { - span: path.span, - kind: TyKind::Path(None, path), - id: DUMMY_NODE_ID, - })); + let expr = mk_expr(self, self.mk_ty(path.span, TyKind::Path(None, path))); - let expr_str = self.span_to_snippet(expr.span) + let expr_str = self + .span_to_snippet(expr.span) .unwrap_or_else(|_| pprust::expr_to_string(&expr)); self.struct_span_err(self.token.span, &msg) .span_label( self.look_ahead(1, |t| t.span).to(span_after_type), - "interpreted as generic arguments" + "interpreted as generic arguments", ) .span_label(self.token.span, format!("not interpreted as {}", op_noun)) .span_suggestion( @@ -589,151 +623,187 @@ impl<'a> Parser<'a> { } } + fn parse_assoc_op_ascribe(&mut self, lhs: P, lhs_span: Span) -> PResult<'a, P> { + let maybe_path = self.could_ascription_be_path(&lhs.kind); + self.last_type_ascription = Some((self.prev_span, maybe_path)); + let lhs = self.parse_assoc_op_cast(lhs, lhs_span, ExprKind::Type)?; + self.sess.gated_spans.gate(sym::type_ascription, lhs.span); + Ok(lhs) + } + /// Parse `& mut? ` or `& raw [ const | mut ] `. - fn parse_address_of(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> { + fn parse_borrow_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> { self.expect_and()?; - let (k, m) = if self.check_keyword(kw::Raw) - && self.look_ahead(1, Token::is_mutability) - { + let (borrow_kind, mutbl) = self.parse_borrow_modifiers(lo); + let expr = self.parse_prefix_expr(None); + let (span, expr) = self.interpolated_or_expr_span(expr)?; + Ok((lo.to(span), ExprKind::AddrOf(borrow_kind, mutbl, expr))) + } + + /// Parse `mut?` or `raw [ const | mut ]`. + fn parse_borrow_modifiers(&mut self, lo: Span) -> (ast::BorrowKind, ast::Mutability) { + if self.check_keyword(kw::Raw) && self.look_ahead(1, Token::is_mutability) { + // `raw [ const | mut ]`. let found_raw = self.eat_keyword(kw::Raw); assert!(found_raw); let mutability = self.parse_const_or_mut().unwrap(); self.sess.gated_spans.gate(sym::raw_ref_op, lo.to(self.prev_span)); (ast::BorrowKind::Raw, mutability) } else { + // `mut?` (ast::BorrowKind::Ref, self.parse_mutability()) - }; - let e = self.parse_prefix_expr(None); - let (span, e) = self.interpolated_or_expr_span(e)?; - Ok((lo.to(span), ExprKind::AddrOf(k, m, e))) + } } /// Parses `a.b` or `a(13)` or `a[4]` or just `a`. - fn parse_dot_or_call_expr( - &mut self, - already_parsed_attrs: Option>, - ) -> PResult<'a, P> { - let attrs = self.parse_or_use_outer_attributes(already_parsed_attrs)?; - - let b = self.parse_bottom_expr(); - let (span, b) = self.interpolated_or_expr_span(b)?; - self.parse_dot_or_call_expr_with(b, span, attrs) + fn parse_dot_or_call_expr(&mut self, attrs: Option) -> PResult<'a, P> { + let attrs = self.parse_or_use_outer_attributes(attrs)?; + let base = self.parse_bottom_expr(); + let (span, base) = self.interpolated_or_expr_span(base)?; + self.parse_dot_or_call_expr_with(base, span, attrs) } pub(super) fn parse_dot_or_call_expr_with( &mut self, e0: P, lo: Span, - mut attrs: ThinVec, + mut attrs: AttrVec, ) -> PResult<'a, P> { // Stitch the list of outer attributes onto the return value. // A little bit ugly, but the best way given the current code // structure - self.parse_dot_or_call_expr_with_(e0, lo).map(|expr| + self.parse_dot_or_call_expr_with_(e0, lo).map(|expr| { expr.map(|mut expr| { attrs.extend::>(expr.attrs.into()); expr.attrs = attrs; - match expr.kind { - ExprKind::If(..) if !expr.attrs.is_empty() => { - // Just point to the first attribute in there... - let span = expr.attrs[0].span; - self.span_err(span, "attributes are not yet allowed on `if` expressions"); - } - _ => {} - } + self.error_attr_on_if_expr(&expr); expr }) - ) + }) } - fn parse_dot_or_call_expr_with_(&mut self, e0: P, lo: Span) -> PResult<'a, P> { - let mut e = e0; - let mut hi; + fn error_attr_on_if_expr(&self, expr: &Expr) { + if let (ExprKind::If(..), [a0, ..]) = (&expr.kind, &*expr.attrs) { + // Just point to the first attribute in there... + self.struct_span_err(a0.span, "attributes are not yet allowed on `if` expressions") + .emit(); + } + } + + fn parse_dot_or_call_expr_with_(&mut self, mut e: P, lo: Span) -> PResult<'a, P> { loop { - // expr? - while self.eat(&token::Question) { - let hi = self.prev_span; - e = self.mk_expr(lo.to(hi), ExprKind::Try(e), ThinVec::new()); + if self.eat(&token::Question) { + // `expr?` + e = self.mk_expr(lo.to(self.prev_span), ExprKind::Try(e), AttrVec::new()); + continue; } - - // expr.f if self.eat(&token::Dot) { - match self.token.kind { - token::Ident(..) => { - e = self.parse_dot_suffix(e, lo)?; - } - token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) => { - let span = self.token.span; - self.bump(); - let field = ExprKind::Field(e, Ident::new(symbol, span)); - e = self.mk_expr(lo.to(span), field, ThinVec::new()); - - self.expect_no_suffix(span, "a tuple index", suffix); - } - token::Literal(token::Lit { kind: token::Float, symbol, .. }) => { - self.bump(); - let fstr = symbol.as_str(); - let msg = format!("unexpected token: `{}`", symbol); - let mut err = self.diagnostic().struct_span_err(self.prev_span, &msg); - err.span_label(self.prev_span, "unexpected token"); - if fstr.chars().all(|x| "0123456789.".contains(x)) { - let float = match fstr.parse::().ok() { - Some(f) => f, - None => continue, - }; - let sugg = pprust::to_string(|s| { - s.popen(); - s.print_expr(&e); - s.s.word( "."); - s.print_usize(float.trunc() as usize); - s.pclose(); - s.s.word("."); - s.s.word(fstr.splitn(2, ".").last().unwrap().to_string()) - }); - err.span_suggestion( - lo.to(self.prev_span), - "try parenthesizing the first index", - sugg, - Applicability::MachineApplicable - ); - } - return Err(err); - - } - _ => { - // FIXME Could factor this out into non_fatal_unexpected or something. - let actual = self.this_token_to_string(); - self.span_err(self.token.span, &format!("unexpected token: `{}`", actual)); - } - } + // expr.f + e = self.parse_dot_suffix_expr(lo, e)?; continue; } - if self.expr_is_complete(&e) { break; } - match self.token.kind { - // expr(...) - token::OpenDelim(token::Paren) => { - let seq = self.parse_paren_expr_seq().map(|es| { - let nd = self.mk_call(e, es); - let hi = self.prev_span; - self.mk_expr(lo.to(hi), nd, ThinVec::new()) - }); - e = self.recover_seq_parse_error(token::Paren, lo, seq); - } + if self.expr_is_complete(&e) { + return Ok(e); + } + e = match self.token.kind { + token::OpenDelim(token::Paren) => self.parse_fn_call_expr(lo, e), + token::OpenDelim(token::Bracket) => self.parse_index_expr(lo, e)?, + _ => return Ok(e), + } + } + } - // expr[...] - // Could be either an index expression or a slicing expression. - token::OpenDelim(token::Bracket) => { - self.bump(); - let ix = self.parse_expr()?; - hi = self.token.span; - self.expect(&token::CloseDelim(token::Bracket))?; - let index = self.mk_index(e, ix); - e = self.mk_expr(lo.to(hi), index, ThinVec::new()) - } - _ => return Ok(e) + fn parse_dot_suffix_expr(&mut self, lo: Span, base: P) -> PResult<'a, P> { + match self.token.kind { + token::Ident(..) => self.parse_dot_suffix(base, lo), + token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) => { + Ok(self.parse_tuple_field_access_expr(lo, base, symbol, suffix)) + } + token::Literal(token::Lit { kind: token::Float, symbol, .. }) => { + self.recover_field_access_by_float_lit(lo, base, symbol) } + _ => { + self.error_unexpected_after_dot(); + Ok(base) + } + } + } + + fn error_unexpected_after_dot(&self) { + // FIXME Could factor this out into non_fatal_unexpected or something. + let actual = pprust::token_to_string(&self.token); + self.struct_span_err(self.token.span, &format!("unexpected token: `{}`", actual)).emit(); + } + + fn recover_field_access_by_float_lit( + &mut self, + lo: Span, + base: P, + sym: Symbol, + ) -> PResult<'a, P> { + self.bump(); + + let fstr = sym.as_str(); + let msg = format!("unexpected token: `{}`", sym); + + let mut err = self.struct_span_err(self.prev_span, &msg); + err.span_label(self.prev_span, "unexpected token"); + + if fstr.chars().all(|x| "0123456789.".contains(x)) { + let float = match fstr.parse::() { + Ok(f) => f, + Err(_) => { + err.emit(); + return Ok(base); + } + }; + let sugg = pprust::to_string(|s| { + s.popen(); + s.print_expr(&base); + s.s.word("."); + s.print_usize(float.trunc() as usize); + s.pclose(); + s.s.word("."); + s.s.word(fstr.splitn(2, ".").last().unwrap().to_string()) + }); + err.span_suggestion( + lo.to(self.prev_span), + "try parenthesizing the first index", + sugg, + Applicability::MachineApplicable, + ); } - return Ok(e); + Err(err) + } + + fn parse_tuple_field_access_expr( + &mut self, + lo: Span, + base: P, + field: Symbol, + suffix: Option, + ) -> P { + let span = self.token.span; + self.bump(); + let field = ExprKind::Field(base, Ident::new(field, span)); + self.expect_no_suffix(span, "a tuple index", suffix); + self.mk_expr(lo.to(span), field, AttrVec::new()) + } + + /// Parse a function call expression, `expr(...)`. + fn parse_fn_call_expr(&mut self, lo: Span, fun: P) -> P { + let seq = self.parse_paren_expr_seq().map(|args| { + self.mk_expr(lo.to(self.prev_span), self.mk_call(fun, args), AttrVec::new()) + }); + self.recover_seq_parse_error(token::Paren, lo, seq) + } + + /// Parse an indexing expression `expr[...]`. + fn parse_index_expr(&mut self, lo: Span, base: P) -> PResult<'a, P> { + self.bump(); // `[` + let index = self.parse_expr()?; + self.expect(&token::CloseDelim(token::Bracket))?; + Ok(self.mk_expr(lo.to(self.prev_span), self.mk_index(base, index), AttrVec::new())) } /// Assuming we have just parsed `.`, continue parsing into an expression. @@ -745,26 +815,26 @@ impl<'a> Parser<'a> { let segment = self.parse_path_segment(PathStyle::Expr)?; self.check_trailing_angle_brackets(&segment, token::OpenDelim(token::Paren)); - Ok(match self.token.kind { - token::OpenDelim(token::Paren) => { - // Method call `expr.f()` - let mut args = self.parse_paren_expr_seq()?; - args.insert(0, self_arg); + if self.check(&token::OpenDelim(token::Paren)) { + // Method call `expr.f()` + let mut args = self.parse_paren_expr_seq()?; + args.insert(0, self_arg); - let span = lo.to(self.prev_span); - self.mk_expr(span, ExprKind::MethodCall(segment, args), ThinVec::new()) + let span = lo.to(self.prev_span); + Ok(self.mk_expr(span, ExprKind::MethodCall(segment, args), AttrVec::new())) + } else { + // Field access `expr.f` + if let Some(args) = segment.args { + self.struct_span_err( + args.span(), + "field expressions may not have generic arguments", + ) + .emit(); } - _ => { - // Field access `expr.f` - if let Some(args) = segment.args { - self.span_err(args.span(), - "field expressions may not have generic arguments"); - } - let span = lo.to(self.prev_span); - self.mk_expr(span, ExprKind::Field(self_arg, segment.ident), ThinVec::new()) - } - }) + let span = lo.to(self.prev_span); + Ok(self.mk_expr(span, ExprKind::Field(self_arg, segment.ident), AttrVec::new())) + } } /// At the bottom (top?) of the precedence hierarchy, @@ -781,305 +851,270 @@ impl<'a> Parser<'a> { // // Therefore, prevent sub-parser from parsing // attributes by giving them a empty "already-parsed" list. - let mut attrs = ThinVec::new(); + let attrs = AttrVec::new(); + // Note: when adding new syntax here, don't forget to adjust `TokenKind::can_begin_expr()`. let lo = self.token.span; - let mut hi = self.token.span; - - let ex: ExprKind; - - macro_rules! parse_lit { - () => { - match self.parse_opt_lit() { - Some(literal) => { - hi = self.prev_span; - ex = ExprKind::Lit(literal); - } - None => { - return Err(self.expected_expression_found()); - } + if let token::Literal(_) = self.token.kind { + // This match arm is a special-case of the `_` match arm below and + // could be removed without changing functionality, but it's faster + // to have it here, especially for programs with large constants. + self.parse_lit_expr(attrs) + } else if self.check(&token::OpenDelim(token::Paren)) { + self.parse_tuple_parens_expr(attrs) + } else if self.check(&token::OpenDelim(token::Brace)) { + self.parse_block_expr(None, lo, BlockCheckMode::Default, attrs) + } else if self.check(&token::BinOp(token::Or)) || self.check(&token::OrOr) { + self.parse_closure_expr(attrs) + } else if self.check(&token::OpenDelim(token::Bracket)) { + self.parse_array_or_repeat_expr(attrs) + } else if self.eat_lt() { + let (qself, path) = self.parse_qpath(PathStyle::Expr)?; + Ok(self.mk_expr(lo.to(path.span), ExprKind::Path(Some(qself), path), attrs)) + } else if self.token.is_path_start() { + self.parse_path_start_expr(attrs) + } else if self.check_keyword(kw::Move) || self.check_keyword(kw::Static) { + self.parse_closure_expr(attrs) + } else if self.eat_keyword(kw::If) { + self.parse_if_expr(attrs) + } else if self.eat_keyword(kw::For) { + self.parse_for_expr(None, self.prev_span, attrs) + } else if self.eat_keyword(kw::While) { + self.parse_while_expr(None, self.prev_span, attrs) + } else if let Some(label) = self.eat_label() { + self.parse_labeled_expr(label, attrs) + } else if self.eat_keyword(kw::Loop) { + self.parse_loop_expr(None, self.prev_span, attrs) + } else if self.eat_keyword(kw::Continue) { + let kind = ExprKind::Continue(self.eat_label()); + Ok(self.mk_expr(lo.to(self.prev_span), kind, attrs)) + } else if self.eat_keyword(kw::Match) { + let match_sp = self.prev_span; + self.parse_match_expr(attrs).map_err(|mut err| { + err.span_label(match_sp, "while parsing this match expression"); + err + }) + } else if self.eat_keyword(kw::Unsafe) { + self.parse_block_expr(None, lo, BlockCheckMode::Unsafe(ast::UserProvided), attrs) + } else if self.is_do_catch_block() { + self.recover_do_catch(attrs) + } else if self.is_try_block() { + self.expect_keyword(kw::Try)?; + self.parse_try_block(lo, attrs) + } else if self.eat_keyword(kw::Return) { + self.parse_return_expr(attrs) + } else if self.eat_keyword(kw::Break) { + self.parse_break_expr(attrs) + } else if self.eat_keyword(kw::Yield) { + self.parse_yield_expr(attrs) + } else if self.eat_keyword(kw::Let) { + self.parse_let_expr(attrs) + } else if !self.unclosed_delims.is_empty() && self.check(&token::Semi) { + // Don't complain about bare semicolons after unclosed braces + // recovery in order to keep the error count down. Fixing the + // delimiters will possibly also fix the bare semicolon found in + // expression context. For example, silence the following error: + // + // error: expected expression, found `;` + // --> file.rs:2:13 + // | + // 2 | foo(bar(; + // | ^ expected expression + self.bump(); + Ok(self.mk_expr_err(self.token.span)) + } else if self.token.span.rust_2018() { + // `Span::rust_2018()` is somewhat expensive; don't get it repeatedly. + if self.check_keyword(kw::Async) { + if self.is_async_block() { + // Check for `async {` and `async move {`. + self.parse_async_block(attrs) + } else { + self.parse_closure_expr(attrs) } + } else if self.eat_keyword(kw::Await) { + self.recover_incorrect_await_syntax(lo, self.prev_span, attrs) + } else { + self.parse_lit_expr(attrs) } + } else { + self.parse_lit_expr(attrs) } + } - // Note: when adding new syntax here, don't forget to adjust `TokenKind::can_begin_expr()`. - match self.token.kind { - // This match arm is a special-case of the `_` match arm below and - // could be removed without changing functionality, but it's faster - // to have it here, especially for programs with large constants. - token::Literal(_) => { - parse_lit!() + fn parse_lit_expr(&mut self, attrs: AttrVec) -> PResult<'a, P> { + let lo = self.token.span; + match self.parse_opt_lit() { + Some(literal) => { + let expr = self.mk_expr(lo.to(self.prev_span), ExprKind::Lit(literal), attrs); + self.maybe_recover_from_bad_qpath(expr, true) } - token::OpenDelim(token::Paren) => { - self.bump(); + None => return Err(self.expected_expression_found()), + } + } - attrs.extend(self.parse_inner_attributes()?); - - // `(e)` is parenthesized `e`. - // `(e,)` is a tuple with only one field, `e`. - let mut es = vec![]; - let mut trailing_comma = false; - let mut recovered = false; - while self.token != token::CloseDelim(token::Paren) { - es.push(match self.parse_expr() { - Ok(es) => es, - Err(mut err) => { - // Recover from parse error in tuple list. - match self.token.kind { - token::Ident(name, false) - if name == kw::Underscore && self.look_ahead(1, |t| { - t == &token::Comma - }) => { - // Special-case handling of `Foo<(_, _, _)>` - err.emit(); - let sp = self.token.span; - self.bump(); - self.mk_expr(sp, ExprKind::Err, ThinVec::new()) - } - _ => return Ok( - self.recover_seq_parse_error(token::Paren, lo, Err(err)), - ), - } - } - }); - recovered = self.expect_one_of( - &[], - &[token::Comma, token::CloseDelim(token::Paren)], - )?; - if self.eat(&token::Comma) { - trailing_comma = true; - } else { - trailing_comma = false; - break; - } - } - if !recovered { - self.bump(); - } + fn parse_tuple_parens_expr(&mut self, mut attrs: AttrVec) -> PResult<'a, P> { + let lo = self.token.span; + self.expect(&token::OpenDelim(token::Paren))?; + attrs.extend(self.parse_inner_attributes()?); // `(#![foo] a, b, ...)` is OK. + let (es, trailing_comma) = match self.parse_seq_to_end( + &token::CloseDelim(token::Paren), + SeqSep::trailing_allowed(token::Comma), + |p| p.parse_expr_catch_underscore(), + ) { + Ok(x) => x, + Err(err) => return Ok(self.recover_seq_parse_error(token::Paren, lo, Err(err))), + }; + let kind = if es.len() == 1 && !trailing_comma { + // `(e)` is parenthesized `e`. + ExprKind::Paren(es.into_iter().nth(0).unwrap()) + } else { + // `(e,)` is a tuple with only one field, `e`. + ExprKind::Tup(es) + }; + let expr = self.mk_expr(lo.to(self.prev_span), kind, attrs); + self.maybe_recover_from_bad_qpath(expr, true) + } - hi = self.prev_span; - ex = if es.len() == 1 && !trailing_comma { - ExprKind::Paren(es.into_iter().nth(0).unwrap()) - } else { - ExprKind::Tup(es) - }; - } - token::OpenDelim(token::Brace) => { - return self.parse_block_expr(None, lo, BlockCheckMode::Default, attrs); - } - token::BinOp(token::Or) | token::OrOr => { - return self.parse_closure_expr(attrs); - } - token::OpenDelim(token::Bracket) => { - self.bump(); + fn parse_array_or_repeat_expr(&mut self, mut attrs: AttrVec) -> PResult<'a, P> { + let lo = self.token.span; + self.bump(); // `[` - attrs.extend(self.parse_inner_attributes()?); + attrs.extend(self.parse_inner_attributes()?); - if self.eat(&token::CloseDelim(token::Bracket)) { - // Empty vector - ex = ExprKind::Array(Vec::new()); - } else { - // Non-empty vector - let first_expr = self.parse_expr()?; - if self.eat(&token::Semi) { - // Repeating array syntax: `[ 0; 512 ]` - let count = AnonConst { - id: DUMMY_NODE_ID, - value: self.parse_expr()?, - }; - self.expect(&token::CloseDelim(token::Bracket))?; - ex = ExprKind::Repeat(first_expr, count); - } else if self.eat(&token::Comma) { - // Vector with two or more elements - let remaining_exprs = self.parse_seq_to_end( - &token::CloseDelim(token::Bracket), - SeqSep::trailing_allowed(token::Comma), - |p| Ok(p.parse_expr()?) - )?; - let mut exprs = vec![first_expr]; - exprs.extend(remaining_exprs); - ex = ExprKind::Array(exprs); - } else { - // Vector with one element - self.expect(&token::CloseDelim(token::Bracket))?; - ex = ExprKind::Array(vec![first_expr]); - } - } - hi = self.prev_span; + let close = &token::CloseDelim(token::Bracket); + let kind = if self.eat(close) { + // Empty vector + ExprKind::Array(Vec::new()) + } else { + // Non-empty vector + let first_expr = self.parse_expr()?; + if self.eat(&token::Semi) { + // Repeating array syntax: `[ 0; 512 ]` + let count = self.parse_anon_const_expr()?; + self.expect(close)?; + ExprKind::Repeat(first_expr, count) + } else if self.eat(&token::Comma) { + // Vector with two or more elements. + let sep = SeqSep::trailing_allowed(token::Comma); + let (remaining_exprs, _) = self.parse_seq_to_end(close, sep, |p| p.parse_expr())?; + let mut exprs = vec![first_expr]; + exprs.extend(remaining_exprs); + ExprKind::Array(exprs) + } else { + // Vector with one element + self.expect(close)?; + ExprKind::Array(vec![first_expr]) } - _ => { - if self.eat_lt() { - let (qself, path) = self.parse_qpath(PathStyle::Expr)?; - hi = path.span; - return Ok(self.mk_expr(lo.to(hi), ExprKind::Path(Some(qself), path), attrs)); - } - if self.token.is_path_start() { - let path = self.parse_path(PathStyle::Expr)?; - - // `!`, as an operator, is prefix, so we know this isn't that. - if self.eat(&token::Not) { - // MACRO INVOCATION expression - let args = self.parse_mac_args()?; - hi = self.prev_span; - ex = ExprKind::Mac(Mac { - path, - args, - prior_type_ascription: self.last_type_ascription, - }); - } else if self.check(&token::OpenDelim(token::Brace)) { - if let Some(expr) = self.maybe_parse_struct_expr(lo, &path, &attrs) { - return expr; - } else { - hi = path.span; - ex = ExprKind::Path(None, path); - } - } else { - hi = path.span; - ex = ExprKind::Path(None, path); - } + }; + let expr = self.mk_expr(lo.to(self.prev_span), kind, attrs); + self.maybe_recover_from_bad_qpath(expr, true) + } - let expr = self.mk_expr(lo.to(hi), ex, attrs); - return self.maybe_recover_from_bad_qpath(expr, true); - } - if self.check_keyword(kw::Move) || self.check_keyword(kw::Static) { - return self.parse_closure_expr(attrs); - } - if self.eat_keyword(kw::If) { - return self.parse_if_expr(attrs); - } - if self.eat_keyword(kw::For) { - let lo = self.prev_span; - return self.parse_for_expr(None, lo, attrs); - } - if self.eat_keyword(kw::While) { - let lo = self.prev_span; - return self.parse_while_expr(None, lo, attrs); - } - if let Some(label) = self.eat_label() { - let lo = label.ident.span; - self.expect(&token::Colon)?; - if self.eat_keyword(kw::While) { - return self.parse_while_expr(Some(label), lo, attrs) - } - if self.eat_keyword(kw::For) { - return self.parse_for_expr(Some(label), lo, attrs) - } - if self.eat_keyword(kw::Loop) { - return self.parse_loop_expr(Some(label), lo, attrs) - } - if self.token == token::OpenDelim(token::Brace) { - return self.parse_block_expr(Some(label), - lo, - BlockCheckMode::Default, - attrs); - } - let msg = "expected `while`, `for`, `loop` or `{` after a label"; - let mut err = self.fatal(msg); - err.span_label(self.token.span, msg); - return Err(err); - } - if self.eat_keyword(kw::Loop) { - let lo = self.prev_span; - return self.parse_loop_expr(None, lo, attrs); - } - if self.eat_keyword(kw::Continue) { - let label = self.eat_label(); - let ex = ExprKind::Continue(label); - let hi = self.prev_span; - return Ok(self.mk_expr(lo.to(hi), ex, attrs)); - } - if self.eat_keyword(kw::Match) { - let match_sp = self.prev_span; - return self.parse_match_expr(attrs).map_err(|mut err| { - err.span_label(match_sp, "while parsing this match expression"); - err - }); - } - if self.eat_keyword(kw::Unsafe) { - return self.parse_block_expr( - None, - lo, - BlockCheckMode::Unsafe(ast::UserProvided), - attrs); - } - if self.is_do_catch_block() { - let mut db = self.fatal("found removed `do catch` syntax"); - db.help("following RFC #2388, the new non-placeholder syntax is `try`"); - return Err(db); - } - if self.is_try_block() { - let lo = self.token.span; - assert!(self.eat_keyword(kw::Try)); - return self.parse_try_block(lo, attrs); - } + fn parse_path_start_expr(&mut self, attrs: AttrVec) -> PResult<'a, P> { + let lo = self.token.span; + let path = self.parse_path(PathStyle::Expr)?; + + // `!`, as an operator, is prefix, so we know this isn't that. + let (hi, kind) = if self.eat(&token::Not) { + // MACRO INVOCATION expression + let mac = Mac { + path, + args: self.parse_mac_args()?, + prior_type_ascription: self.last_type_ascription, + }; + (self.prev_span, ExprKind::Mac(mac)) + } else if self.check(&token::OpenDelim(token::Brace)) { + if let Some(expr) = self.maybe_parse_struct_expr(lo, &path, &attrs) { + return expr; + } else { + (path.span, ExprKind::Path(None, path)) + } + } else { + (path.span, ExprKind::Path(None, path)) + }; - // `Span::rust_2018()` is somewhat expensive; don't get it repeatedly. - let is_span_rust_2018 = self.token.span.rust_2018(); - if is_span_rust_2018 && self.check_keyword(kw::Async) { - return if self.is_async_block() { // Check for `async {` and `async move {`. - self.parse_async_block(attrs) - } else { - self.parse_closure_expr(attrs) - }; - } - if self.eat_keyword(kw::Return) { - if self.token.can_begin_expr() { - let e = self.parse_expr()?; - hi = e.span; - ex = ExprKind::Ret(Some(e)); - } else { - ex = ExprKind::Ret(None); - } - } else if self.eat_keyword(kw::Break) { - let label = self.eat_label(); - let e = if self.token.can_begin_expr() - && !(self.token == token::OpenDelim(token::Brace) - && self.restrictions.contains( - Restrictions::NO_STRUCT_LITERAL)) { - Some(self.parse_expr()?) - } else { - None - }; - ex = ExprKind::Break(label, e); - hi = self.prev_span; - } else if self.eat_keyword(kw::Yield) { - if self.token.can_begin_expr() { - let e = self.parse_expr()?; - hi = e.span; - ex = ExprKind::Yield(Some(e)); - } else { - ex = ExprKind::Yield(None); - } + let expr = self.mk_expr(lo.to(hi), kind, attrs); + self.maybe_recover_from_bad_qpath(expr, true) + } - let span = lo.to(hi); - self.sess.gated_spans.gate(sym::generators, span); - } else if self.eat_keyword(kw::Let) { - return self.parse_let_expr(attrs); - } else if is_span_rust_2018 && self.eat_keyword(kw::Await) { - let (await_hi, e_kind) = self.parse_incorrect_await_syntax(lo, self.prev_span)?; - hi = await_hi; - ex = e_kind; - } else { - if !self.unclosed_delims.is_empty() && self.check(&token::Semi) { - // Don't complain about bare semicolons after unclosed braces - // recovery in order to keep the error count down. Fixing the - // delimiters will possibly also fix the bare semicolon found in - // expression context. For example, silence the following error: - // - // error: expected expression, found `;` - // --> file.rs:2:13 - // | - // 2 | foo(bar(; - // | ^ expected expression - self.bump(); - return Ok(self.mk_expr(self.token.span, ExprKind::Err, ThinVec::new())); - } - parse_lit!() - } - } + fn parse_labeled_expr(&mut self, label: Label, attrs: AttrVec) -> PResult<'a, P> { + let lo = label.ident.span; + self.expect(&token::Colon)?; + if self.eat_keyword(kw::While) { + return self.parse_while_expr(Some(label), lo, attrs); + } + if self.eat_keyword(kw::For) { + return self.parse_for_expr(Some(label), lo, attrs); } + if self.eat_keyword(kw::Loop) { + return self.parse_loop_expr(Some(label), lo, attrs); + } + if self.token == token::OpenDelim(token::Brace) { + return self.parse_block_expr(Some(label), lo, BlockCheckMode::Default, attrs); + } + + let msg = "expected `while`, `for`, `loop` or `{` after a label"; + self.struct_span_err(self.token.span, msg).span_label(self.token.span, msg).emit(); + // Continue as an expression in an effort to recover on `'label: non_block_expr`. + self.parse_expr() + } + + /// Recover on the syntax `do catch { ... }` suggesting `try { ... }` instead. + fn recover_do_catch(&mut self, attrs: AttrVec) -> PResult<'a, P> { + let lo = self.token.span; + + self.bump(); // `do` + self.bump(); // `catch` + + let span_dc = lo.to(self.prev_span); + self.struct_span_err(span_dc, "found removed `do catch` syntax") + .span_suggestion( + span_dc, + "replace with the new syntax", + "try".to_string(), + Applicability::MachineApplicable, + ) + .note("following RFC #2388, the new non-placeholder syntax is `try`") + .emit(); + + self.parse_try_block(lo, attrs) + } + + /// Parse an expression if the token can begin one. + fn parse_expr_opt(&mut self) -> PResult<'a, Option>> { + Ok(if self.token.can_begin_expr() { Some(self.parse_expr()?) } else { None }) + } - let expr = self.mk_expr(lo.to(hi), ex, attrs); + /// Parse `"return" expr?`. + fn parse_return_expr(&mut self, attrs: AttrVec) -> PResult<'a, P> { + let lo = self.prev_span; + let kind = ExprKind::Ret(self.parse_expr_opt()?); + let expr = self.mk_expr(lo.to(self.prev_span), kind, attrs); + self.maybe_recover_from_bad_qpath(expr, true) + } + + /// Parse `"('label ":")? break expr?`. + fn parse_break_expr(&mut self, attrs: AttrVec) -> PResult<'a, P> { + let lo = self.prev_span; + let label = self.eat_label(); + let kind = if self.token != token::OpenDelim(token::Brace) + || !self.restrictions.contains(Restrictions::NO_STRUCT_LITERAL) + { + self.parse_expr_opt()? + } else { + None + }; + let expr = self.mk_expr(lo.to(self.prev_span), ExprKind::Break(label, kind), attrs); + self.maybe_recover_from_bad_qpath(expr, true) + } + + /// Parse `"yield" expr?`. + fn parse_yield_expr(&mut self, attrs: AttrVec) -> PResult<'a, P> { + let lo = self.prev_span; + let kind = ExprKind::Yield(self.parse_expr_opt()?); + let span = lo.to(self.prev_span); + self.sess.gated_spans.gate(sym::generators, span); + let expr = self.mk_expr(span, kind, attrs); self.maybe_recover_from_bad_qpath(expr, true) } @@ -1097,15 +1132,15 @@ impl<'a> Parser<'a> { symbol_unescaped, }), _ => Err(Some(lit)), - } + }, None => Err(None), } } pub(super) fn parse_lit(&mut self) -> PResult<'a, Lit> { self.parse_opt_lit().ok_or_else(|| { - let msg = format!("unexpected token: {}", self.this_token_descr()); - self.span_fatal(self.token.span, &msg) + let msg = format!("unexpected token: {}", super::token_descr(&self.token)); + self.struct_span_err(self.token.span, &msg) }) } @@ -1117,8 +1152,9 @@ impl<'a> Parser<'a> { // Attempt to recover `.4` as `0.4`. We don't currently have any syntax where // dot would follow an optional literal, so we do this unconditionally. recovered = self.look_ahead(1, |next_token| { - if let token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) - = next_token.kind { + if let token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) = + next_token.kind + { if self.token.span.hi() == next_token.span.lo() { let s = String::from("0.") + &symbol.as_str(); let kind = TokenKind::lit(token::Float, Symbol::intern(&s), suffix); @@ -1129,14 +1165,7 @@ impl<'a> Parser<'a> { }); if let Some(token) = &recovered { self.bump(); - self.struct_span_err(token.span, "float literals must have an integer part") - .span_suggestion( - token.span, - "must have an integer part", - pprust::token_to_string(token), - Applicability::MachineApplicable, - ) - .emit(); + self.error_float_lits_must_have_int_part(&token); } } @@ -1146,9 +1175,7 @@ impl<'a> Parser<'a> { self.bump(); Some(lit) } - Err(LitError::NotLiteral) => { - None - } + Err(LitError::NotLiteral) => None, Err(err) => { let span = token.span; let lit = match token.kind { @@ -1167,12 +1194,21 @@ impl<'a> Parser<'a> { } } + fn error_float_lits_must_have_int_part(&self, token: &Token) { + self.struct_span_err(token.span, "float literals must have an integer part") + .span_suggestion( + token.span, + "must have an integer part", + pprust::token_to_string(token), + Applicability::MachineApplicable, + ) + .emit(); + } + fn report_lit_error(&self, err: LitError, lit: token::Lit, span: Span) { // Checks if `s` looks like i32 or u1234 etc. fn looks_like_width_suffix(first_chars: &[char], s: &str) -> bool { - s.len() > 1 - && s.starts_with(first_chars) - && s[1..].chars().all(|c| c.is_ascii_digit()) + s.len() > 1 && s.starts_with(first_chars) && s[1..].chars().all(|c| c.is_ascii_digit()) } let token::Lit { kind, suffix, .. } = lit; @@ -1211,9 +1247,7 @@ impl<'a> Parser<'a> { if looks_like_width_suffix(&['f'], &suf) { // If it looks like a width, try to be helpful. let msg = format!("invalid width `{}` for float literal", &suf[1..]); - self.struct_span_err(span, &msg) - .help("valid widths are 32 and 64") - .emit(); + self.struct_span_err(span, &msg).help("valid widths are 32 and 64").emit(); } else { let msg = format!("invalid suffix `{}` for float literal", suf); self.struct_span_err(span, &msg) @@ -1234,8 +1268,7 @@ impl<'a> Parser<'a> { .emit(); } LitError::IntTooLarge => { - self.struct_span_err(span, "integer literal is too large") - .emit(); + self.struct_span_err(span, "integer literal is too large").emit(); } } } @@ -1247,10 +1280,10 @@ impl<'a> Parser<'a> { { // #59553: warn instead of reject out of hand to allow the fix to percolate // through the ecosystem when people fix their macros - let mut err = self.sess.span_diagnostic.struct_span_warn( - sp, - &format!("suffixes on {} are invalid", kind), - ); + let mut err = self + .sess + .span_diagnostic + .struct_span_warn(sp, &format!("suffixes on {} are invalid", kind)); err.note(&format!( "`{}` is *temporarily* accepted on tuple index fields as it was \ incorrectly accepted on stable for a few releases", @@ -1261,9 +1294,7 @@ impl<'a> Parser<'a> { `proc_macro::Literal::*_unsuffixed` for code that will desugar \ to tuple field access", ); - err.note( - "for more context, see https://github.com/rust-lang/rust/issues/60210", - ); + err.note("for more context, see https://github.com/rust-lang/rust/issues/60210"); err } else { self.struct_span_err(sp, &format!("suffixes on {} are invalid", kind)) @@ -1277,17 +1308,13 @@ impl<'a> Parser<'a> { pub fn parse_literal_maybe_minus(&mut self) -> PResult<'a, P> { maybe_whole_expr!(self); - let minus_lo = self.token.span; - let minus_present = self.eat(&token::BinOp(token::Minus)); let lo = self.token.span; - let literal = self.parse_lit()?; - let hi = self.prev_span; - let expr = self.mk_expr(lo.to(hi), ExprKind::Lit(literal), ThinVec::new()); + let minus_present = self.eat(&token::BinOp(token::Minus)); + let lit = self.parse_lit()?; + let expr = self.mk_expr(lit.span, ExprKind::Lit(lit), AttrVec::new()); if minus_present { - let minus_hi = self.prev_span; - let unary = self.mk_unary(UnOp::Neg, expr); - Ok(self.mk_expr(minus_lo.to(minus_hi), unary, ThinVec::new())) + Ok(self.mk_expr(lo.to(self.prev_span), self.mk_unary(UnOp::Neg, expr), AttrVec::new())) } else { Ok(expr) } @@ -1299,7 +1326,7 @@ impl<'a> Parser<'a> { opt_label: Option
    {blk}
    {blk}
    ", - id = cx.derive_id(short.to_owned()), name = name); + id = cx.derive_id(short.to_owned()), + name = name + ); } match myitem.inner { @@ -2014,69 +2050,72 @@ fn item_module(w: &mut Buffer, cx: &Context, item: &clean::Item, items: &[clean: use crate::html::format::anchor; match *src { - Some(ref src) => { - write!(w, ""); } clean::ImportItem(ref import) => { - write!(w, "", - myitem.visibility.print_with_space(), import.print()); + write!( + w, + "", + myitem.visibility.print_with_space(), + import.print() + ); } _ => { - if myitem.name.is_none() { continue } + if myitem.name.is_none() { + continue; + } let unsafety_flag = match myitem.inner { clean::FunctionItem(ref func) | clean::ForeignFunctionItem(ref func) - if func.header.unsafety == hir::Unsafety::Unsafe => { + if func.header.unsafety == hir::Unsafety::Unsafe => + { "⚠" } _ => "", }; let stab = myitem.stability_class(); - let add = if stab.is_some() { - " " - } else { - "" - }; + let add = if stab.is_some() { " " } else { "" }; let doc_value = myitem.doc_value().unwrap_or(""); - write!(w, "\ + write!( + w, + "\ \ \ \ ", - name = *myitem.name.as_ref().unwrap(), - stab_tags = stability_tags(myitem), - docs = MarkdownSummaryLine(doc_value, &myitem.links()).to_string(), - class = myitem.type_(), - add = add, - stab = stab.unwrap_or_else(|| String::new()), - unsafety_flag = unsafety_flag, - href = item_path(myitem.type_(), myitem.name.as_ref().unwrap()), - title = [full_path(cx, myitem), myitem.type_().to_string()] - .iter() - .filter_map(|s| if !s.is_empty() { - Some(s.as_str()) - } else { - None - }) - .collect::>() - .join(" "), - ); + name = *myitem.name.as_ref().unwrap(), + stab_tags = stability_tags(myitem), + docs = MarkdownSummaryLine(doc_value, &myitem.links()).to_string(), + class = myitem.type_(), + add = add, + stab = stab.unwrap_or_else(|| String::new()), + unsafety_flag = unsafety_flag, + href = item_path(myitem.type_(), myitem.name.as_ref().unwrap()), + title = [full_path(cx, myitem), myitem.type_().to_string()] + .iter() + .filter_map(|s| if !s.is_empty() { Some(s.as_str()) } else { None }) + .collect::>() + .join(" "), + ); } } } @@ -2110,12 +2149,8 @@ fn stability_tags(item: &clean::Item) -> String { tags += &tag_html("deprecated", message); } - if let Some(stab) = item - .stability - .as_ref() - .filter(|s| s.level == stability::Unstable) - { - if stab.feature.as_ref().map(|s| &**s) == Some("rustc_private") { + if let Some(stab) = item.stability.as_ref().filter(|s| s.level == stability::Unstable) { + if stab.feature.as_deref() == Some("rustc_private") { tags += &tag_html("internal", "Internal"); } else { tags += &tag_html("unstable", "Experimental"); @@ -2156,18 +2191,19 @@ fn short_stability(item: &clean::Item, cx: &Context) -> Vec { if let Some(note) = note { let mut ids = cx.id_map.borrow_mut(); let html = MarkdownHtml( - ¬e, &mut ids, error_codes, cx.shared.edition, &cx.shared.playground); + ¬e, + &mut ids, + error_codes, + cx.shared.edition, + &cx.shared.playground, + ); message.push_str(&format!(": {}", html.to_string())); } stability.push(format!("
    {}
    ", message)); } - if let Some(stab) = item - .stability - .as_ref() - .filter(|stab| stab.level == stability::Unstable) - { - let is_rustc_private = stab.feature.as_ref().map(|s| &**s) == Some("rustc_private"); + if let Some(stab) = item.stability.as_ref().filter(|stab| stab.level == stability::Unstable) { + let is_rustc_private = stab.feature.as_deref() == Some("rustc_private"); let mut message = if is_rustc_private { "⚙️ This is an internal compiler API." @@ -2176,7 +2212,7 @@ fn short_stability(item: &clean::Item, cx: &Context) -> Vec { } .to_owned(); - if let Some(feature) = stab.feature.as_ref() { + if let Some(feature) = stab.feature.as_deref() { let mut feature = format!("{}", Escape(&feature)); if let (Some(url), Some(issue)) = (&cx.shared.issue_tracker_base_url, stab.issue) { feature.push_str(&format!( @@ -2211,23 +2247,17 @@ fn short_stability(item: &clean::Item, cx: &Context) -> Vec { error_codes, cx.shared.edition, &cx.shared.playground, - ).to_string() + ) + .to_string() ); } - let class = if is_rustc_private { - "internal" - } else { - "unstable" - }; + let class = if is_rustc_private { "internal" } else { "unstable" }; stability.push(format!("
    {}
    ", class, message)); } if let Some(ref cfg) = item.attrs.cfg { - stability.push(format!( - "
    {}
    ", - cfg.render_long_html() - )); + stability.push(format!("
    {}
    ", cfg.render_long_html())); } stability @@ -2236,23 +2266,51 @@ fn short_stability(item: &clean::Item, cx: &Context) -> Vec { fn item_constant(w: &mut Buffer, cx: &Context, it: &clean::Item, c: &clean::Constant) { write!(w, "
    ");
         render_attributes(w, it, false);
    -    write!(w, "{vis}const \
    -               {name}: {typ}
    ", - vis = it.visibility.print_with_space(), - name = it.name.as_ref().unwrap(), - typ = c.type_.print()); + + write!( + w, + "{vis}const \ + {name}: {typ}", + vis = it.visibility.print_with_space(), + name = it.name.as_ref().unwrap(), + typ = c.type_.print(), + ); + + if c.value.is_some() || c.is_literal { + write!(w, " = {expr};", expr = Escape(&c.expr)); + } else { + write!(w, ";"); + } + + if let Some(value) = &c.value { + if !c.is_literal { + let value_lowercase = value.to_lowercase(); + let expr_lowercase = c.expr.to_lowercase(); + + if value_lowercase != expr_lowercase + && value_lowercase.trim_end_matches("i32") != expr_lowercase + { + write!(w, " // {value}", value = Escape(value)); + } + } + } + + write!(w, ""); document(w, cx, it) } fn item_static(w: &mut Buffer, cx: &Context, it: &clean::Item, s: &clean::Static) { write!(w, "
    ");
         render_attributes(w, it, false);
    -    write!(w, "{vis}static {mutability}\
    +    write!(
    +        w,
    +        "{vis}static {mutability}\
                    {name}: {typ}
    ", - vis = it.visibility.print_with_space(), - mutability = s.mutability.print_with_space(), - name = it.name.as_ref().unwrap(), - typ = s.type_.print()); + vis = it.visibility.print_with_space(), + mutability = s.mutability.print_with_space(), + name = it.name.as_ref().unwrap(), + typ = s.type_.print() + ); document(w, cx, it) } @@ -2261,65 +2319,85 @@ fn item_function(w: &mut Buffer, cx: &Context, it: &clean::Item, f: &clean::Func "{}{}{}{}{:#}fn {}{:#}", it.visibility.print_with_space(), f.header.constness.print_with_space(), - f.header.unsafety.print_with_space(), f.header.asyncness.print_with_space(), + f.header.unsafety.print_with_space(), print_abi_with_space(f.header.abi), it.name.as_ref().unwrap(), f.generics.print() - ).len(); + ) + .len(); write!(w, "{}
    ", render_spotlight_traits(it));
         render_attributes(w, it, false);
    -    write!(w,
    -           "{vis}{constness}{unsafety}{asyncness}{abi}fn \
    +    write!(
    +        w,
    +        "{vis}{constness}{asyncness}{unsafety}{abi}fn \
                {name}{generics}{decl}{where_clause}
    ", - vis = it.visibility.print_with_space(), - constness = f.header.constness.print_with_space(), - unsafety = f.header.unsafety.print_with_space(), - asyncness = f.header.asyncness.print_with_space(), - abi = print_abi_with_space(f.header.abi), - name = it.name.as_ref().unwrap(), - generics = f.generics.print(), - where_clause = WhereClause { gens: &f.generics, indent: 0, end_newline: true }, - decl = Function { - decl: &f.decl, - header_len, - indent: 0, - asyncness: f.header.asyncness, - }.print()); + vis = it.visibility.print_with_space(), + constness = f.header.constness.print_with_space(), + asyncness = f.header.asyncness.print_with_space(), + unsafety = f.header.unsafety.print_with_space(), + abi = print_abi_with_space(f.header.abi), + name = it.name.as_ref().unwrap(), + generics = f.generics.print(), + where_clause = WhereClause { gens: &f.generics, indent: 0, end_newline: true }, + decl = Function { decl: &f.decl, header_len, indent: 0, asyncness: f.header.asyncness } + .print() + ); document(w, cx, it) } -fn render_implementor(cx: &Context, implementor: &Impl, w: &mut Buffer, - implementor_dups: &FxHashMap<&str, (DefId, bool)>) { +fn render_implementor( + cx: &Context, + implementor: &Impl, + w: &mut Buffer, + implementor_dups: &FxHashMap<&str, (DefId, bool)>, + aliases: &[String], +) { // If there's already another implementor that has the same abbridged name, use the // full path, for example in `std::iter::ExactSizeIterator` let use_absolute = match implementor.inner_impl().for_ { - clean::ResolvedPath { ref path, is_generic: false, .. } | - clean::BorrowedRef { + clean::ResolvedPath { ref path, is_generic: false, .. } + | clean::BorrowedRef { type_: box clean::ResolvedPath { ref path, is_generic: false, .. }, .. } => implementor_dups[path.last_name()].1, _ => false, }; - render_impl(w, cx, implementor, AssocItemLink::Anchor(None), RenderMode::Normal, - implementor.impl_item.stable_since(), false, Some(use_absolute), false, false); + render_impl( + w, + cx, + implementor, + AssocItemLink::Anchor(None), + RenderMode::Normal, + implementor.impl_item.stable_since(), + false, + Some(use_absolute), + false, + false, + aliases, + ); } -fn render_impls(cx: &Context, w: &mut Buffer, - traits: &[&&Impl], - containing_item: &clean::Item) { - let mut impls = traits.iter() +fn render_impls(cx: &Context, w: &mut Buffer, traits: &[&&Impl], containing_item: &clean::Item) { + let mut impls = traits + .iter() .map(|i| { let did = i.trait_did().unwrap(); let assoc_link = AssocItemLink::GotoSource(did, &i.inner_impl().provided_trait_methods); - let mut buffer = if w.is_for_html() { - Buffer::html() - } else { - Buffer::new() - }; - render_impl(&mut buffer, cx, i, assoc_link, - RenderMode::Normal, containing_item.stable_since(), - true, None, false, true); + let mut buffer = if w.is_for_html() { Buffer::html() } else { Buffer::new() }; + render_impl( + &mut buffer, + cx, + i, + assoc_link, + RenderMode::Normal, + containing_item.stable_since(), + true, + None, + false, + true, + &[], + ); buffer.into_inner() }) .collect::>(); @@ -2351,12 +2429,7 @@ fn compare_impl<'a, 'b>(lhs: &'a &&Impl, rhs: &'b &&Impl) -> Ordering { name_key(&lhs).cmp(&name_key(&rhs)) } -fn item_trait( - w: &mut Buffer, - cx: &Context, - it: &clean::Item, - t: &clean::Trait, -) { +fn item_trait(w: &mut Buffer, cx: &Context, it: &clean::Item, t: &clean::Trait) { let bounds = bounds(&t.bounds, false); let types = t.items.iter().filter(|m| m.is_associated_type()).collect::>(); let consts = t.items.iter().filter(|m| m.is_associated_const()).collect::>(); @@ -2367,13 +2440,16 @@ fn item_trait( wrap_into_docblock(w, |w| { write!(w, "
    ");
             render_attributes(w, it, true);
    -        write!(w, "{}{}{}trait {}{}{}",
    -               it.visibility.print_with_space(),
    -               t.unsafety.print_with_space(),
    -               if t.is_auto { "auto " } else { "" },
    -               it.name.as_ref().unwrap(),
    -               t.generics.print(),
    -               bounds);
    +        write!(
    +            w,
    +            "{}{}{}trait {}{}{}",
    +            it.visibility.print_with_space(),
    +            t.unsafety.print_with_space(),
    +            if t.is_auto { "auto " } else { "" },
    +            it.name.as_ref().unwrap(),
    +            t.generics.print(),
    +            bounds
    +        );
     
             if !t.generics.where_predicates.is_empty() {
                 write!(w, "{}", WhereClause { gens: &t.generics, indent: 0, end_newline: true });
    @@ -2405,7 +2481,7 @@ fn item_trait(
                     write!(w, ";\n");
     
                     if pos < required.len() - 1 {
    -                   write!(w, "
    "); + write!(w, "
    "); } } if !required.is_empty() && !provided.is_empty() { @@ -2416,13 +2492,13 @@ fn item_trait( match m.inner { clean::MethodItem(ref inner) if !inner.generics.where_predicates.is_empty() => { write!(w, ",\n {{ ... }}\n"); - }, + } _ => { write!(w, " {{ ... }}\n"); - }, + } } if pos < provided.len() - 1 { - write!(w, "
    "); + write!(w, "
    "); } } write!(w, "}}"); @@ -2433,16 +2509,15 @@ fn item_trait( // Trait documentation document(w, cx, it); - fn write_small_section_header( - w: &mut Buffer, - id: &str, - title: &str, - extra_content: &str, - ) { - write!(w, " + fn write_small_section_header(w: &mut Buffer, id: &str, title: &str, extra_content: &str) { + write!( + w, + "

    \ {1}\ -

    {2}", id, title, extra_content) + {2}", + id, title, extra_content + ) } fn write_loading_content(w: &mut Buffer, extra_content: &str) { @@ -2454,10 +2529,13 @@ fn item_trait( let item_type = m.type_(); let id = cx.derive_id(format!("{}.{}", item_type, name)); let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space())); - write!(w, "

    {extra}", - extra = render_spotlight_traits(m), - id = id, - ns_id = ns_id); + write!( + w, + "

    {extra}", + extra = render_spotlight_traits(m), + id = id, + ns_id = ns_id + ); render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)), ItemType::Impl); write!(w, ""); render_stability_since(w, m, t); @@ -2466,8 +2544,12 @@ fn item_trait( } if !types.is_empty() { - write_small_section_header(w, "associated-types", "Associated Types", - "
    "); + write_small_section_header( + w, + "associated-types", + "Associated Types", + "
    ", + ); for t in &types { trait_item(w, cx, *t, it); } @@ -2475,8 +2557,12 @@ fn item_trait( } if !consts.is_empty() { - write_small_section_header(w, "associated-const", "Associated Constants", - "
    "); + write_small_section_header( + w, + "associated-const", + "Associated Constants", + "
    ", + ); for t in &consts { trait_item(w, cx, *t, it); } @@ -2485,16 +2571,24 @@ fn item_trait( // Output the documentation for each function individually if !required.is_empty() { - write_small_section_header(w, "required-methods", "Required methods", - "
    "); + write_small_section_header( + w, + "required-methods", + "Required methods", + "
    ", + ); for m in &required { trait_item(w, cx, *m, it); } write_loading_content(w, "
    "); } if !provided.is_empty() { - write_small_section_header(w, "provided-methods", "Provided methods", - "
    "); + write_small_section_header( + w, + "provided-methods", + "Provided methods", + "
    ", + ); for m in &provided { trait_item(w, cx, *m, it); } @@ -2504,16 +2598,14 @@ fn item_trait( // If there are methods directly on this trait object, render them here. render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All); - let mut synthetic_types = Vec::new(); - if let Some(implementors) = cx.cache.implementors.get(&it.def_id) { // The DefId is for the first Type found with that name. The bool is // if any Types with the same name but different DefId have been found. let mut implementor_dups: FxHashMap<&str, (DefId, bool)> = FxHashMap::default(); for implementor in implementors { match implementor.inner_impl().for_ { - clean::ResolvedPath { ref path, did, is_generic: false, .. } | - clean::BorrowedRef { + clean::ResolvedPath { ref path, did, is_generic: false, .. } + | clean::BorrowedRef { type_: box clean::ResolvedPath { ref path, did, is_generic: false, .. }, .. } => { @@ -2527,13 +2619,12 @@ fn item_trait( } } - let (local, foreign) = implementors.iter() - .partition::, _>(|i| i.inner_impl().for_.def_id() - .map_or(true, |d| cx.cache.paths.contains_key(&d))); - + let (local, foreign) = implementors.iter().partition::, _>(|i| { + i.inner_impl().for_.def_id().map_or(true, |d| cx.cache.paths.contains_key(&d)) + }); - let (mut synthetic, mut concrete): (Vec<&&Impl>, Vec<&&Impl>) = local.iter() - .partition(|i| i.inner_impl().synthetic); + let (mut synthetic, mut concrete): (Vec<&&Impl>, Vec<&&Impl>) = + local.iter().partition(|i| i.inner_impl().synthetic); synthetic.sort_by(compare_impl); concrete.sort_by(compare_impl); @@ -2544,64 +2635,91 @@ fn item_trait( for implementor in foreign { let assoc_link = AssocItemLink::GotoSource( implementor.impl_item.def_id, - &implementor.inner_impl().provided_trait_methods + &implementor.inner_impl().provided_trait_methods, + ); + render_impl( + w, + cx, + &implementor, + assoc_link, + RenderMode::Normal, + implementor.impl_item.stable_since(), + false, + None, + true, + false, + &[], ); - render_impl(w, cx, &implementor, assoc_link, - RenderMode::Normal, implementor.impl_item.stable_since(), false, - None, true, false); } write_loading_content(w, ""); } - write_small_section_header(w, "implementors", "Implementors", - "
    "); + write_small_section_header( + w, + "implementors", + "Implementors", + "
    ", + ); for implementor in concrete { - render_implementor(cx, implementor, w, &implementor_dups); + render_implementor(cx, implementor, w, &implementor_dups, &[]); } write_loading_content(w, "
    "); if t.auto { - write_small_section_header(w, "synthetic-implementors", "Auto implementors", - "
    "); + write_small_section_header( + w, + "synthetic-implementors", + "Auto implementors", + "
    ", + ); for implementor in synthetic { - synthetic_types.extend( - collect_paths_for_type(implementor.inner_impl().for_.clone()) + render_implementor( + cx, + implementor, + w, + &implementor_dups, + &collect_paths_for_type(implementor.inner_impl().for_.clone()), ); - render_implementor(cx, implementor, w, &implementor_dups); } write_loading_content(w, "
    "); } } else { // even without any implementations to write in, we still want the heading and list, so the // implementors javascript file pulled in below has somewhere to write the impls into - write_small_section_header(w, "implementors", "Implementors", - "
    "); + write_small_section_header( + w, + "implementors", + "Implementors", + "
    ", + ); write_loading_content(w, "
    "); if t.auto { - write_small_section_header(w, "synthetic-implementors", "Auto implementors", - "
    "); + write_small_section_header( + w, + "synthetic-implementors", + "Auto implementors", + "
    ", + ); write_loading_content(w, "
    "); } } + write!( w, - r#""#, - serde_json::to_string(&synthetic_types).unwrap(), + "", + root_path = vec![".."; cx.current.len()].join("/"), + path = if it.def_id.is_local() { + cx.current.join("/") + } else { + let (ref path, _) = cx.cache.external_paths[&it.def_id]; + path[..path.len() - 1].join("/") + }, + ty = it.type_(), + name = *it.name.as_ref().unwrap() ); - - write!(w, r#""#, - root_path = vec![".."; cx.current.len()].join("/"), - path = if it.def_id.is_local() { - cx.current.join("/") - } else { - let (ref path, _) = cx.cache.external_paths[&it.def_id]; - path[..path.len() - 1].join("/") - }, - ty = it.type_(), - name = *it.name.as_ref().unwrap()); } fn naive_assoc_href(it: &clean::Item, link: AssocItemLink<'_>) -> String { @@ -2610,7 +2728,7 @@ fn naive_assoc_href(it: &clean::Item, link: AssocItemLink<'_>) -> String { let name = it.name.as_ref().unwrap(); let ty = match it.type_() { Typedef | AssocType => AssocType, - s@_ => s, + s @ _ => s, }; let anchor = format!("#{}.{}", ty, name); @@ -2623,29 +2741,40 @@ fn naive_assoc_href(it: &clean::Item, link: AssocItemLink<'_>) -> String { } } -fn assoc_const(w: &mut Buffer, - it: &clean::Item, - ty: &clean::Type, - _default: Option<&String>, - link: AssocItemLink<'_>, - extra: &str) { - write!(w, "{}{}const {}: {}", - extra, - it.visibility.print_with_space(), - naive_assoc_href(it, link), - it.name.as_ref().unwrap(), - ty.print()); +fn assoc_const( + w: &mut Buffer, + it: &clean::Item, + ty: &clean::Type, + _default: Option<&String>, + link: AssocItemLink<'_>, + extra: &str, +) { + write!( + w, + "{}{}const {}: {}", + extra, + it.visibility.print_with_space(), + naive_assoc_href(it, link), + it.name.as_ref().unwrap(), + ty.print() + ); } -fn assoc_type(w: &mut Buffer, it: &clean::Item, - bounds: &[clean::GenericBound], - default: Option<&clean::Type>, - link: AssocItemLink<'_>, - extra: &str) { - write!(w, "{}type {}", - extra, - naive_assoc_href(it, link), - it.name.as_ref().unwrap()); +fn assoc_type( + w: &mut Buffer, + it: &clean::Item, + bounds: &[clean::GenericBound], + default: Option<&clean::Type>, + link: AssocItemLink<'_>, + extra: &str, +) { + write!( + w, + "{}type {}", + extra, + naive_assoc_href(it, link), + it.name.as_ref().unwrap() + ); if !bounds.is_empty() { write!(w, ": {}", print_generic_bounds(bounds)) } @@ -2666,17 +2795,21 @@ fn render_stability_since(w: &mut Buffer, item: &clean::Item, containing_item: & render_stability_since_raw(w, item.stable_since(), containing_item.stable_since()) } -fn render_assoc_item(w: &mut Buffer, - item: &clean::Item, - link: AssocItemLink<'_>, - parent: ItemType) { - fn method(w: &mut Buffer, - meth: &clean::Item, - header: hir::FnHeader, - g: &clean::Generics, - d: &clean::FnDecl, - link: AssocItemLink<'_>, - parent: ItemType) { +fn render_assoc_item( + w: &mut Buffer, + item: &clean::Item, + link: AssocItemLink<'_>, + parent: ItemType, +) { + fn method( + w: &mut Buffer, + meth: &clean::Item, + header: hir::FnHeader, + g: &clean::Generics, + d: &clean::FnDecl, + link: AssocItemLink<'_>, + parent: ItemType, + ) { let name = meth.name.as_ref().unwrap(); let anchor = format!("#{}.{}", meth.type_(), name); let href = match link { @@ -2698,13 +2831,14 @@ fn render_assoc_item(w: &mut Buffer, "{}{}{}{}{}{:#}fn {}{:#}", meth.visibility.print_with_space(), header.constness.print_with_space(), - header.unsafety.print_with_space(), header.asyncness.print_with_space(), + header.unsafety.print_with_space(), print_default_space(meth.is_default()), print_abi_with_space(header.abi), name, g.print() - ).len(); + ) + .len(); let (indent, end_newline) = if parent == ItemType::Trait { header_len += 4; (4, false) @@ -2712,47 +2846,45 @@ fn render_assoc_item(w: &mut Buffer, (0, true) }; render_attributes(w, meth, false); - write!(w, "{}{}{}{}{}{}{}fn {name}\ + write!( + w, + "{}{}{}{}{}{}{}fn {name}\ {generics}{decl}{where_clause}", - if parent == ItemType::Trait { " " } else { "" }, - meth.visibility.print_with_space(), - header.constness.print_with_space(), - header.unsafety.print_with_space(), - header.asyncness.print_with_space(), - print_default_space(meth.is_default()), - print_abi_with_space(header.abi), - href = href, - name = name, - generics = g.print(), - decl = Function { - decl: d, - header_len, - indent, - asyncness: header.asyncness, - }.print(), - where_clause = WhereClause { - gens: g, - indent, - end_newline, - }) + if parent == ItemType::Trait { " " } else { "" }, + meth.visibility.print_with_space(), + header.constness.print_with_space(), + header.asyncness.print_with_space(), + header.unsafety.print_with_space(), + print_default_space(meth.is_default()), + print_abi_with_space(header.abi), + href = href, + name = name, + generics = g.print(), + decl = Function { decl: d, header_len, indent, asyncness: header.asyncness }.print(), + where_clause = WhereClause { gens: g, indent, end_newline } + ) } match item.inner { - clean::StrippedItem(..) => {}, - clean::TyMethodItem(ref m) => { - method(w, item, m.header, &m.generics, &m.decl, link, parent) - } - clean::MethodItem(ref m) => { - method(w, item, m.header, &m.generics, &m.decl, link, parent) - } - clean::AssocConstItem(ref ty, ref default) => { - assoc_const(w, item, ty, default.as_ref(), link, - if parent == ItemType::Trait { " " } else { "" }) - } - clean::AssocTypeItem(ref bounds, ref default) => { - assoc_type(w, item, bounds, default.as_ref(), link, - if parent == ItemType::Trait { " " } else { "" }) - } - _ => panic!("render_assoc_item called on non-associated-item") + clean::StrippedItem(..) => {} + clean::TyMethodItem(ref m) => method(w, item, m.header, &m.generics, &m.decl, link, parent), + clean::MethodItem(ref m) => method(w, item, m.header, &m.generics, &m.decl, link, parent), + clean::AssocConstItem(ref ty, ref default) => assoc_const( + w, + item, + ty, + default.as_ref(), + link, + if parent == ItemType::Trait { " " } else { "" }, + ), + clean::AssocTypeItem(ref bounds, ref default) => assoc_type( + w, + item, + bounds, + default.as_ref(), + link, + if parent == ItemType::Trait { " " } else { "" }, + ), + _ => panic!("render_assoc_item called on non-associated-item"), } } @@ -2760,45 +2892,51 @@ fn item_struct(w: &mut Buffer, cx: &Context, it: &clean::Item, s: &clean::Struct wrap_into_docblock(w, |w| { write!(w, "
    ");
             render_attributes(w, it, true);
    -        render_struct(w,
    -                      it,
    -                      Some(&s.generics),
    -                      s.struct_type,
    -                      &s.fields,
    -                      "",
    -                      true);
    +        render_struct(w, it, Some(&s.generics), s.struct_type, &s.fields, "", true);
             write!(w, "
    ") }); document(w, cx, it); - let mut fields = s.fields.iter().filter_map(|f| { - match f.inner { + let mut fields = s + .fields + .iter() + .filter_map(|f| match f.inner { clean::StructFieldItem(ref ty) => Some((f, ty)), _ => None, - } - }).peekable(); + }) + .peekable(); if let doctree::Plain = s.struct_type { if fields.peek().is_some() { - write!(w, "

    + write!( + w, + "

    Fields{}

    ", - document_non_exhaustive_header(it)); + document_non_exhaustive_header(it) + ); document_non_exhaustive(w, it); for (field, ty) in fields { - let id = cx.derive_id(format!("{}.{}", - ItemType::StructField, - field.name.as_ref().unwrap())); - let ns_id = cx.derive_id(format!("{}.{}", - field.name.as_ref().unwrap(), - ItemType::StructField.name_space())); - write!(w, "\ + let id = cx.derive_id(format!( + "{}.{}", + ItemType::StructField, + field.name.as_ref().unwrap() + )); + let ns_id = cx.derive_id(format!( + "{}.{}", + field.name.as_ref().unwrap(), + ItemType::StructField.name_space() + )); + write!( + w, + "\ \ {name}: {ty}\ ", - item_type = ItemType::StructField, - id = id, - ns_id = ns_id, - name = field.name.as_ref().unwrap(), - ty = ty.print()); + item_type = ItemType::StructField, + id = id, + ns_id = ns_id, + name = field.name.as_ref().unwrap(), + ty = ty.print() + ); document(w, cx, field); } } @@ -2810,39 +2948,41 @@ fn item_union(w: &mut Buffer, cx: &Context, it: &clean::Item, s: &clean::Union) wrap_into_docblock(w, |w| { write!(w, "
    ");
             render_attributes(w, it, true);
    -        render_union(w,
    -                     it,
    -                     Some(&s.generics),
    -                     &s.fields,
    -                     "",
    -                     true);
    +        render_union(w, it, Some(&s.generics), &s.fields, "", true);
             write!(w, "
    ") }); document(w, cx, it); - let mut fields = s.fields.iter().filter_map(|f| { - match f.inner { + let mut fields = s + .fields + .iter() + .filter_map(|f| match f.inner { clean::StructFieldItem(ref ty) => Some((f, ty)), _ => None, - } - }).peekable(); + }) + .peekable(); if fields.peek().is_some() { - write!(w, "

    - Fields

    "); + write!( + w, + "

    + Fields

    " + ); for (field, ty) in fields { let name = field.name.as_ref().expect("union field name"); let id = format!("{}.{}", ItemType::StructField, name); - write!(w, "\ + write!( + w, + "\ \ {name}: {ty}\ ", - id = id, - name = name, - shortty = ItemType::StructField, - ty = ty.print()); + id = id, + name = name, + shortty = ItemType::StructField, + ty = ty.print() + ); if let Some(stability_class) = field.stability_class() { - write!(w, "", - stab = stability_class); + write!(w, "", stab = stability_class); } document(w, cx, field); } @@ -2854,11 +2994,14 @@ fn item_enum(w: &mut Buffer, cx: &Context, it: &clean::Item, e: &clean::Enum) { wrap_into_docblock(w, |w| { write!(w, "
    ");
             render_attributes(w, it, true);
    -        write!(w, "{}enum {}{}{}",
    -               it.visibility.print_with_space(),
    -               it.name.as_ref().unwrap(),
    -               e.generics.print(),
    -               WhereClause { gens: &e.generics, indent: 0, end_newline: true });
    +        write!(
    +            w,
    +            "{}enum {}{}{}",
    +            it.visibility.print_with_space(),
    +            it.name.as_ref().unwrap(),
    +            e.generics.print(),
    +            WhereClause { gens: &e.generics, indent: 0, end_newline: true }
    +        );
             if e.variants.is_empty() && !e.variants_stripped {
                 write!(w, " {{}}");
             } else {
    @@ -2867,31 +3010,23 @@ fn item_enum(w: &mut Buffer, cx: &Context, it: &clean::Item, e: &clean::Enum) {
                     write!(w, "    ");
                     let name = v.name.as_ref().unwrap();
                     match v.inner {
    -                    clean::VariantItem(ref var) => {
    -                        match var.kind {
    -                            clean::VariantKind::CLike => write!(w, "{}", name),
    -                            clean::VariantKind::Tuple(ref tys) => {
    -                                write!(w, "{}(", name);
    -                                for (i, ty) in tys.iter().enumerate() {
    -                                    if i > 0 {
    -                                        write!(w, ", ")
    -                                    }
    -                                    write!(w, "{}", ty.print());
    +                    clean::VariantItem(ref var) => match var.kind {
    +                        clean::VariantKind::CLike => write!(w, "{}", name),
    +                        clean::VariantKind::Tuple(ref tys) => {
    +                            write!(w, "{}(", name);
    +                            for (i, ty) in tys.iter().enumerate() {
    +                                if i > 0 {
    +                                    write!(w, ", ")
                                     }
    -                                write!(w, ")");
    -                            }
    -                            clean::VariantKind::Struct(ref s) => {
    -                                render_struct(w,
    -                                              v,
    -                                              None,
    -                                              s.struct_type,
    -                                              &s.fields,
    -                                              "    ",
    -                                              false);
    +                                write!(w, "{}", ty.print());
                                 }
    +                            write!(w, ")");
                             }
    -                    }
    -                    _ => unreachable!()
    +                        clean::VariantKind::Struct(ref s) => {
    +                            render_struct(w, v, None, s.struct_type, &s.fields, "    ", false);
    +                        }
    +                    },
    +                    _ => unreachable!(),
                     }
                     write!(w, ",\n");
                 }
    @@ -2906,23 +3041,30 @@ fn item_enum(w: &mut Buffer, cx: &Context, it: &clean::Item, e: &clean::Enum) {
     
         document(w, cx, it);
         if !e.variants.is_empty() {
    -        write!(w, "

    + write!( + w, + "

    Variants{}

    \n", - document_non_exhaustive_header(it)); + document_non_exhaustive_header(it) + ); document_non_exhaustive(w, it); for variant in &e.variants { - let id = cx.derive_id(format!("{}.{}", - ItemType::Variant, - variant.name.as_ref().unwrap())); - let ns_id = cx.derive_id(format!("{}.{}", - variant.name.as_ref().unwrap(), - ItemType::Variant.name_space())); - write!(w, "
    \ + let id = + cx.derive_id(format!("{}.{}", ItemType::Variant, variant.name.as_ref().unwrap())); + let ns_id = cx.derive_id(format!( + "{}.{}", + variant.name.as_ref().unwrap(), + ItemType::Variant.name_space() + )); + write!( + w, + "
    \ \ {name}", - id = id, - ns_id = ns_id, - name = variant.name.as_ref().unwrap()); + id = id, + ns_id = ns_id, + name = variant.name.as_ref().unwrap() + ); if let clean::VariantItem(ref var) = variant.inner { if let clean::VariantKind::Tuple(ref tys) = var.kind { write!(w, "("); @@ -2940,35 +3082,45 @@ fn item_enum(w: &mut Buffer, cx: &Context, it: &clean::Item, e: &clean::Enum) { document_non_exhaustive(w, variant); use crate::clean::{Variant, VariantKind}; - if let clean::VariantItem(Variant { - kind: VariantKind::Struct(ref s) - }) = variant.inner { - let variant_id = cx.derive_id(format!("{}.{}.fields", - ItemType::Variant, - variant.name.as_ref().unwrap())); - write!(w, "
    ", - id = variant_id); - write!(w, "

    Fields of {name}

    ", - name = variant.name.as_ref().unwrap()); + if let clean::VariantItem(Variant { kind: VariantKind::Struct(ref s) }) = variant.inner + { + let variant_id = cx.derive_id(format!( + "{}.{}.fields", + ItemType::Variant, + variant.name.as_ref().unwrap() + )); + write!(w, "
    ", id = variant_id); + write!( + w, + "

    Fields of {name}

    ", + name = variant.name.as_ref().unwrap() + ); for field in &s.fields { use crate::clean::StructFieldItem; if let StructFieldItem(ref ty) = field.inner { - let id = cx.derive_id(format!("variant.{}.field.{}", - variant.name.as_ref().unwrap(), - field.name.as_ref().unwrap())); - let ns_id = cx.derive_id(format!("{}.{}.{}.{}", - variant.name.as_ref().unwrap(), - ItemType::Variant.name_space(), - field.name.as_ref().unwrap(), - ItemType::StructField.name_space())); - write!(w, "\ + let id = cx.derive_id(format!( + "variant.{}.field.{}", + variant.name.as_ref().unwrap(), + field.name.as_ref().unwrap() + )); + let ns_id = cx.derive_id(format!( + "{}.{}.{}.{}", + variant.name.as_ref().unwrap(), + ItemType::Variant.name_space(), + field.name.as_ref().unwrap(), + ItemType::StructField.name_space() + )); + write!( + w, + "\ \ {f}: {t}\ ", - id = id, - ns_id = ns_id, - f = field.name.as_ref().unwrap(), - t = ty.print()); + id = id, + ns_id = ns_id, + f = field.name.as_ref().unwrap(), + t = ty.print() + ); document(w, cx, field); } } @@ -2988,15 +3140,12 @@ fn render_attribute(attr: &ast::MetaItem) -> Option { } else if let Some(v) = attr.value_str() { Some(format!("{} = {:?}", path, v)) } else if let Some(values) = attr.meta_item_list() { - let display: Vec<_> = values.iter().filter_map(|attr| { - attr.meta_item().and_then(|mi| render_attribute(mi)) - }).collect(); + let display: Vec<_> = values + .iter() + .filter_map(|attr| attr.meta_item().and_then(|mi| render_attribute(mi))) + .collect(); - if display.len() > 0 { - Some(format!("{}({})", path, display.join(", "))) - } else { - None - } + if display.len() > 0 { Some(format!("{}({})", path, display.join(", "))) } else { None } } else { None } @@ -3009,7 +3158,7 @@ const ATTRIBUTE_WHITELIST: &'static [Symbol] = &[ sym::must_use, sym::no_mangle, sym::repr, - sym::non_exhaustive + sym::non_exhaustive, ]; // The `top` parameter is used when generating the item declaration to ensure it doesn't have a @@ -3032,21 +3181,31 @@ fn render_attributes(w: &mut Buffer, it: &clean::Item, top: bool) { } } if attrs.len() > 0 { - write!(w, "{}", - if top { " top-attr" } else { "" }, &attrs); + write!( + w, + "{}", + if top { " top-attr" } else { "" }, + &attrs + ); } } -fn render_struct(w: &mut Buffer, it: &clean::Item, - g: Option<&clean::Generics>, - ty: doctree::StructType, - fields: &[clean::Item], - tab: &str, - structhead: bool) { - write!(w, "{}{}{}", - it.visibility.print_with_space(), - if structhead {"struct "} else {""}, - it.name.as_ref().unwrap()); +fn render_struct( + w: &mut Buffer, + it: &clean::Item, + g: Option<&clean::Generics>, + ty: doctree::StructType, + fields: &[clean::Item], + tab: &str, + structhead: bool, +) { + write!( + w, + "{}{}{}", + it.visibility.print_with_space(), + if structhead { "struct " } else { "" }, + it.name.as_ref().unwrap() + ); if let Some(g) = g { write!(w, "{}", g.print()) } @@ -3059,11 +3218,14 @@ fn render_struct(w: &mut Buffer, it: &clean::Item, write!(w, " {{"); for field in fields { if let clean::StructFieldItem(ref ty) = field.inner { - write!(w, "\n{} {}{}: {},", - tab, - field.visibility.print_with_space(), - field.name.as_ref().unwrap(), - ty.print()); + write!( + w, + "\n{} {}{}: {},", + tab, + field.visibility.print_with_space(), + field.name.as_ref().unwrap(), + ty.print() + ); has_visible_fields = true; } } @@ -3087,13 +3249,11 @@ fn render_struct(w: &mut Buffer, it: &clean::Item, write!(w, ", "); } match field.inner { - clean::StrippedItem(box clean::StructFieldItem(..)) => { - write!(w, "_") - } + clean::StrippedItem(box clean::StructFieldItem(..)) => write!(w, "_"), clean::StructFieldItem(ref ty) => { write!(w, "{}{}", field.visibility.print_with_space(), ty.print()) } - _ => unreachable!() + _ => unreachable!(), } } write!(w, ")"); @@ -3112,15 +3272,21 @@ fn render_struct(w: &mut Buffer, it: &clean::Item, } } -fn render_union(w: &mut Buffer, it: &clean::Item, - g: Option<&clean::Generics>, - fields: &[clean::Item], - tab: &str, - structhead: bool) { - write!(w, "{}{}{}", - it.visibility.print_with_space(), - if structhead {"union "} else {""}, - it.name.as_ref().unwrap()); +fn render_union( + w: &mut Buffer, + it: &clean::Item, + g: Option<&clean::Generics>, + fields: &[clean::Item], + tab: &str, + structhead: bool, +) { + write!( + w, + "{}{}{}", + it.visibility.print_with_space(), + if structhead { "union " } else { "" }, + it.name.as_ref().unwrap() + ); if let Some(g) = g { write!(w, "{}", g.print()); write!(w, "{}", WhereClause { gens: g, indent: 0, end_newline: true }); @@ -3129,11 +3295,14 @@ fn render_union(w: &mut Buffer, it: &clean::Item, write!(w, " {{\n{}", tab); for field in fields { if let clean::StructFieldItem(ref ty) = field.inner { - write!(w, " {}{}: {},\n{}", - field.visibility.print_with_space(), - field.name.as_ref().unwrap(), - ty.print(), - tab); + write!( + w, + " {}{}: {},\n{}", + field.visibility.print_with_space(), + field.name.as_ref().unwrap(), + ty.print(), + tab + ); } } @@ -3152,7 +3321,7 @@ enum AssocItemLink<'a> { impl<'a> AssocItemLink<'a> { fn anchor(&self, id: &'a String) -> Self { match *self { - AssocItemLink::Anchor(_) => { AssocItemLink::Anchor(Some(&id)) }, + AssocItemLink::Anchor(_) => AssocItemLink::Anchor(Some(&id)), ref other => *other, } } @@ -3160,7 +3329,7 @@ impl<'a> AssocItemLink<'a> { enum AssocItemRender<'a> { All, - DerefFor { trait_: &'a clean::Type, type_: &'a clean::Type, deref_mut_: bool } + DerefFor { trait_: &'a clean::Type, type_: &'a clean::Type, deref_mut_: bool }, } #[derive(Copy, Clone, PartialEq)] @@ -3169,115 +3338,154 @@ enum RenderMode { ForDeref { mut_: bool }, } -fn render_assoc_items(w: &mut Buffer, - cx: &Context, - containing_item: &clean::Item, - it: DefId, - what: AssocItemRender<'_>) { +fn render_assoc_items( + w: &mut Buffer, + cx: &Context, + containing_item: &clean::Item, + it: DefId, + what: AssocItemRender<'_>, +) { let c = &cx.cache; let v = match c.impls.get(&it) { Some(v) => v, None => return, }; - let (non_trait, traits): (Vec<_>, _) = v.iter().partition(|i| { - i.inner_impl().trait_.is_none() - }); + let (non_trait, traits): (Vec<_>, _) = v.iter().partition(|i| i.inner_impl().trait_.is_none()); if !non_trait.is_empty() { let render_mode = match what { AssocItemRender::All => { - write!(w, "\ + write!( + w, + "\

    \ Methods\

    \ - "); + " + ); RenderMode::Normal } AssocItemRender::DerefFor { trait_, type_, deref_mut_ } => { - write!(w, "\ + write!( + w, + "\

    \ Methods from {}<Target = {}>\ \

    \ - ", trait_.print(), type_.print()); + ", + trait_.print(), + type_.print() + ); RenderMode::ForDeref { mut_: deref_mut_ } } }; for i in &non_trait { - render_impl(w, cx, i, AssocItemLink::Anchor(None), render_mode, - containing_item.stable_since(), true, None, false, true); + render_impl( + w, + cx, + i, + AssocItemLink::Anchor(None), + render_mode, + containing_item.stable_since(), + true, + None, + false, + true, + &[], + ); } } if let AssocItemRender::DerefFor { .. } = what { return; } if !traits.is_empty() { - let deref_impl = traits.iter().find(|t| { - t.inner_impl().trait_.def_id() == c.deref_trait_did - }); + let deref_impl = + traits.iter().find(|t| t.inner_impl().trait_.def_id() == c.deref_trait_did); if let Some(impl_) = deref_impl { - let has_deref_mut = traits.iter().find(|t| { - t.inner_impl().trait_.def_id() == c.deref_mut_trait_did - }).is_some(); + let has_deref_mut = traits + .iter() + .find(|t| t.inner_impl().trait_.def_id() == c.deref_mut_trait_did) + .is_some(); render_deref_methods(w, cx, impl_, containing_item, has_deref_mut); } - let (synthetic, concrete): (Vec<&&Impl>, Vec<&&Impl>) = traits - .iter() - .partition(|t| t.inner_impl().synthetic); - let (blanket_impl, concrete): (Vec<&&Impl>, _) = concrete - .into_iter() - .partition(|t| t.inner_impl().blanket_impl.is_some()); + let (synthetic, concrete): (Vec<&&Impl>, Vec<&&Impl>) = + traits.iter().partition(|t| t.inner_impl().synthetic); + let (blanket_impl, concrete): (Vec<&&Impl>, _) = + concrete.into_iter().partition(|t| t.inner_impl().blanket_impl.is_some()); let mut impls = Buffer::empty_from(&w); render_impls(cx, &mut impls, &concrete, containing_item); let impls = impls.into_inner(); if !impls.is_empty() { - write!(w, "\ + write!( + w, + "\

    \ Trait Implementations\

    \ -
    {}
    ", impls); +
    {}
    ", + impls + ); } if !synthetic.is_empty() { - write!(w, "\ + write!( + w, + "\

    \ Auto Trait Implementations\ \

    \
    \ - "); + " + ); render_impls(cx, w, &synthetic, containing_item); write!(w, "
    "); } if !blanket_impl.is_empty() { - write!(w, "\ + write!( + w, + "\

    \ Blanket Implementations\ \

    \
    \ - "); + " + ); render_impls(cx, w, &blanket_impl, containing_item); write!(w, "
    "); } } } -fn render_deref_methods(w: &mut Buffer, cx: &Context, impl_: &Impl, - container_item: &clean::Item, deref_mut: bool) { +fn render_deref_methods( + w: &mut Buffer, + cx: &Context, + impl_: &Impl, + container_item: &clean::Item, + deref_mut: bool, +) { let deref_type = impl_.inner_impl().trait_.as_ref().unwrap(); - let target = impl_.inner_impl().items.iter().filter_map(|item| { - match item.inner { - clean::TypedefItem(ref t, true) => Some(&t.type_), + let (target, real_target) = impl_ + .inner_impl() + .items + .iter() + .filter_map(|item| match item.inner { + clean::TypedefItem(ref t, true) => Some(match *t { + clean::Typedef { item_type: Some(ref type_), .. } => (type_, &t.type_), + _ => (&t.type_, &t.type_), + }), _ => None, - } - }).next().expect("Expected associated type binding"); - let what = AssocItemRender::DerefFor { trait_: deref_type, type_: target, - deref_mut_: deref_mut }; + }) + .next() + .expect("Expected associated type binding"); + let what = + AssocItemRender::DerefFor { trait_: deref_type, type_: real_target, deref_mut_: deref_mut }; if let Some(did) = target.def_id() { - render_assoc_items(w, cx, container_item, did, what) + render_assoc_items(w, cx, container_item, did, what); } else { if let Some(prim) = target.primitive_type() { if let Some(&did) = cx.cache.primitive_locations.get(&prim) { @@ -3291,18 +3499,18 @@ fn should_render_item(item: &clean::Item, deref_mut_: bool) -> bool { let self_type_opt = match item.inner { clean::MethodItem(ref method) => method.decl.self_type(), clean::TyMethodItem(ref method) => method.decl.self_type(), - _ => None + _ => None, }; if let Some(self_ty) = self_type_opt { let (by_mut_ref, by_box, by_value) = match self_ty { - SelfTy::SelfBorrowed(_, mutability) | - SelfTy::SelfExplicit(clean::BorrowedRef { mutability, .. }) => { - (mutability == Mutability::Mutable, false, false) - }, + SelfTy::SelfBorrowed(_, mutability) + | SelfTy::SelfExplicit(clean::BorrowedRef { mutability, .. }) => { + (mutability == Mutability::Mut, false, false) + } SelfTy::SelfExplicit(clean::ResolvedPath { did, .. }) => { (false, Some(did) == cache().owned_box_did, false) - }, + } SelfTy::SelfValue => (false, false, true), _ => (false, false, false), }; @@ -3315,13 +3523,11 @@ fn should_render_item(item: &clean::Item, deref_mut_: bool) -> bool { fn render_spotlight_traits(item: &clean::Item) -> String { match item.inner { - clean::FunctionItem(clean::Function { ref decl, .. }) | - clean::TyMethodItem(clean::TyMethod { ref decl, .. }) | - clean::MethodItem(clean::Method { ref decl, .. }) | - clean::ForeignFunctionItem(clean::Function { ref decl, .. }) => { - spotlight_decl(decl) - } - _ => String::new() + clean::FunctionItem(clean::Function { ref decl, .. }) + | clean::TyMethodItem(clean::TyMethod { ref decl, .. }) + | clean::MethodItem(clean::Method { ref decl, .. }) + | clean::ForeignFunctionItem(clean::Function { ref decl, .. }) => spotlight_decl(decl), + _ => String::new(), } } @@ -3336,24 +3542,31 @@ fn spotlight_decl(decl: &clean::FnDecl) -> String { let impl_ = i.inner_impl(); if impl_.trait_.def_id().map_or(false, |d| c.traits[&d].is_spotlight) { if out.is_empty() { - out.push_str( - &format!("

    Important traits for {}

    \ + out.push_str(&format!( + "

    Important traits for {}

    \ ", - impl_.for_.print())); + impl_.for_.print() + )); trait_.push_str(&impl_.for_.print().to_string()); } //use the "where" class here to make it small - out.push_str( - &format!("{}", impl_.print())); + out.push_str(&format!( + "{}", + impl_.print() + )); let t_did = impl_.trait_.def_id().unwrap(); for it in &impl_.items { if let clean::TypedefItem(ref tydef, _) = it.inner { out.push_str(" "); - assoc_type(&mut out, it, &[], - Some(&tydef.type_), - AssocItemLink::GotoSource(t_did, &FxHashSet::default()), - ""); + assoc_type( + &mut out, + it, + &[], + Some(&tydef.type_), + AssocItemLink::GotoSource(t_did, &FxHashSet::default()), + "", + ); out.push_str(";"); } } @@ -3363,69 +3576,117 @@ fn spotlight_decl(decl: &clean::FnDecl) -> String { } if !out.is_empty() { - out.insert_str(0, &format!("
    ⓘ\ + out.insert_str( + 0, + &format!( + "
    ⓘ\ Important traits for {}
    \
    ", - trait_)); + trait_ + ), + ); out.push_str("
    "); } out.into_inner() } -fn render_impl(w: &mut Buffer, cx: &Context, i: &Impl, link: AssocItemLink<'_>, - render_mode: RenderMode, outer_version: Option<&str>, show_def_docs: bool, - use_absolute: Option, is_on_foreign_type: bool, - show_default_items: bool) { +fn render_impl( + w: &mut Buffer, + cx: &Context, + i: &Impl, + link: AssocItemLink<'_>, + render_mode: RenderMode, + outer_version: Option<&str>, + show_def_docs: bool, + use_absolute: Option, + is_on_foreign_type: bool, + show_default_items: bool, + // This argument is used to reference same type with different pathes to avoid duplication + // in documentation pages for trait with automatic implementations like "Send" and "Sync". + aliases: &[String], +) { if render_mode == RenderMode::Normal { let id = cx.derive_id(match i.inner_impl().trait_ { - Some(ref t) => if is_on_foreign_type { - get_id_for_impl_on_foreign_type(&i.inner_impl().for_, t) - } else { - format!("impl-{}", small_url_encode(&format!("{:#}", t.print()))) - }, + Some(ref t) => { + if is_on_foreign_type { + get_id_for_impl_on_foreign_type(&i.inner_impl().for_, t) + } else { + format!("impl-{}", small_url_encode(&format!("{:#}", t.print()))) + } + } None => "impl".to_string(), }); + let aliases = if aliases.is_empty() { + String::new() + } else { + format!(" aliases=\"{}\"", aliases.join(",")) + }; if let Some(use_absolute) = use_absolute { - write!(w, "

    ", id); + write!(w, "

    ", id, aliases); fmt_impl_for_trait_page(&i.inner_impl(), w, use_absolute); if show_def_docs { for it in &i.inner_impl().items { if let clean::TypedefItem(ref tydef, _) = it.inner { write!(w, " "); - assoc_type(w, it, &vec![], Some(&tydef.type_), - AssocItemLink::Anchor(None), - ""); + assoc_type( + w, + it, + &vec![], + Some(&tydef.type_), + AssocItemLink::Anchor(None), + "", + ); write!(w, ";"); } } } write!(w, ""); } else { - write!(w, "

    {}", - id, i.inner_impl().print() + write!( + w, + "

    {}", + id, + aliases, + i.inner_impl().print() ); } write!(w, "", id); let since = i.impl_item.stability.as_ref().map(|s| &s.since[..]); render_stability_since_raw(w, since, outer_version); if let Some(l) = cx.src_href(&i.impl_item) { - write!(w, "[src]", - l, "goto source code"); + write!(w, "[src]", l, "goto source code"); } write!(w, "

    "); if let Some(ref dox) = cx.shared.maybe_collapsed_doc_value(&i.impl_item) { let mut ids = cx.id_map.borrow_mut(); - write!(w, "
    {}
    ", - Markdown(&*dox, &i.impl_item.links(), &mut ids, - cx.shared.codes, cx.shared.edition, &cx.shared.playground).to_string()); + write!( + w, + "
    {}
    ", + Markdown( + &*dox, + &i.impl_item.links(), + &mut ids, + cx.shared.codes, + cx.shared.edition, + &cx.shared.playground + ) + .to_string() + ); } } - fn doc_impl_item(w: &mut Buffer, cx: &Context, item: &clean::Item, - link: AssocItemLink<'_>, render_mode: RenderMode, - is_default_item: bool, outer_version: Option<&str>, - trait_: Option<&clean::Trait>, show_def_docs: bool) { + fn doc_impl_item( + w: &mut Buffer, + cx: &Context, + item: &clean::Item, + link: AssocItemLink<'_>, + render_mode: RenderMode, + is_default_item: bool, + outer_version: Option<&str>, + trait_: Option<&clean::Trait>, + show_def_docs: bool, + ) { let item_type = item.type_(); let name = item.name.as_ref().unwrap(); @@ -3434,32 +3695,33 @@ fn render_impl(w: &mut Buffer, cx: &Context, i: &Impl, link: AssocItemLink<'_>, RenderMode::ForDeref { mut_: deref_mut_ } => should_render_item(&item, deref_mut_), }; - let (is_hidden, extra_class) = if (trait_.is_none() || - item.doc_value().is_some() || - item.inner.is_associated()) && - !is_default_item { - (false, "") - } else { - (true, " hidden") - }; + let (is_hidden, extra_class) = + if (trait_.is_none() || item.doc_value().is_some() || item.inner.is_associated()) + && !is_default_item + { + (false, "") + } else { + (true, " hidden") + }; match item.inner { - clean::MethodItem(clean::Method { ref decl, .. }) | - clean::TyMethodItem(clean::TyMethod { ref decl, .. }) => { + clean::MethodItem(clean::Method { ref decl, .. }) + | clean::TyMethodItem(clean::TyMethod { ref decl, .. }) => { // Only render when the method is not static or we allow static methods if render_method_item { let id = cx.derive_id(format!("{}.{}", item_type, name)); - let ns_id = cx.derive_id(format!("{}.{}", - name, item_type.name_space())); - write!(w, "

    ", - id, item_type, extra_class); + let ns_id = cx.derive_id(format!("{}.{}", name, item_type.name_space())); + write!(w, "

    ", id, item_type, extra_class); write!(w, "{}", spotlight_decl(decl)); write!(w, "", ns_id); render_assoc_item(w, item, link.anchor(&id), ItemType::Impl); write!(w, ""); render_stability_since_raw(w, item.stable_since(), outer_version); if let Some(l) = cx.src_href(item) { - write!(w, "[src]", - l, "goto source code"); + write!( + w, + "[src]", + l, "goto source code" + ); } write!(w, "

    "); } @@ -3481,8 +3743,11 @@ fn render_impl(w: &mut Buffer, cx: &Context, i: &Impl, link: AssocItemLink<'_>, write!(w, "
    "); render_stability_since_raw(w, item.stable_since(), outer_version); if let Some(l) = cx.src_href(item) { - write!(w, "[src]", - l, "goto source code"); + write!( + w, + "[src]", + l, "goto source code" + ); } write!(w, "

    "); } @@ -3495,7 +3760,7 @@ fn render_impl(w: &mut Buffer, cx: &Context, i: &Impl, link: AssocItemLink<'_>, write!(w, "

    "); } clean::StrippedItem(..) => return, - _ => panic!("can't make docs for trait item with name {:?}", item.name) + _ => panic!("can't make docs for trait item with name {:?}", item.name), } if render_method_item { @@ -3535,17 +3800,28 @@ fn render_impl(w: &mut Buffer, cx: &Context, i: &Impl, link: AssocItemLink<'_>, write!(w, "
    "); for trait_item in &i.inner_impl().items { - doc_impl_item(w, cx, trait_item, link, render_mode, - false, outer_version, trait_, show_def_docs); + doc_impl_item( + w, + cx, + trait_item, + link, + render_mode, + false, + outer_version, + trait_, + show_def_docs, + ); } - fn render_default_items(w: &mut Buffer, - cx: &Context, - t: &clean::Trait, - i: &clean::Impl, - render_mode: RenderMode, - outer_version: Option<&str>, - show_def_docs: bool) { + fn render_default_items( + w: &mut Buffer, + cx: &Context, + t: &clean::Trait, + i: &clean::Impl, + render_mode: RenderMode, + outer_version: Option<&str>, + show_def_docs: bool, + ) { for trait_item in &t.items { let n = trait_item.name.clone(); if i.items.iter().find(|m| m.name == n).is_some() { @@ -3554,8 +3830,17 @@ fn render_impl(w: &mut Buffer, cx: &Context, i: &Impl, link: AssocItemLink<'_>, let did = i.trait_.as_ref().unwrap().def_id().unwrap(); let assoc_link = AssocItemLink::GotoSource(did, &i.provided_trait_methods); - doc_impl_item(w, cx, trait_item, assoc_link, render_mode, true, - outer_version, None, show_def_docs); + doc_impl_item( + w, + cx, + trait_item, + assoc_link, + render_mode, + true, + outer_version, + None, + show_def_docs, + ); } } @@ -3565,26 +3850,31 @@ fn render_impl(w: &mut Buffer, cx: &Context, i: &Impl, link: AssocItemLink<'_>, // Implementations on Foreign Types or Implementors sections. if show_default_items { if let Some(t) = trait_ { - render_default_items(w, cx, t, &i.inner_impl(), - render_mode, outer_version, show_def_docs); + render_default_items( + w, + cx, + t, + &i.inner_impl(), + render_mode, + outer_version, + show_def_docs, + ); } } write!(w, "
    "); } -fn item_opaque_ty( - w: &mut Buffer, - cx: &Context, - it: &clean::Item, - t: &clean::OpaqueTy, -) { +fn item_opaque_ty(w: &mut Buffer, cx: &Context, it: &clean::Item, t: &clean::OpaqueTy) { write!(w, "
    ");
         render_attributes(w, it, false);
    -    write!(w, "type {}{}{where_clause} = impl {bounds};
    ", - it.name.as_ref().unwrap(), - t.generics.print(), - where_clause = WhereClause { gens: &t.generics, indent: 0, end_newline: true }, - bounds = bounds(&t.bounds, false)); + write!( + w, + "type {}{}{where_clause} = impl {bounds};

    ", + it.name.as_ref().unwrap(), + t.generics.print(), + where_clause = WhereClause { gens: &t.generics, indent: 0, end_newline: true }, + bounds = bounds(&t.bounds, false) + ); document(w, cx, it); @@ -3595,15 +3885,17 @@ fn item_opaque_ty( render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) } -fn item_trait_alias(w: &mut Buffer, cx: &Context, it: &clean::Item, - t: &clean::TraitAlias) { +fn item_trait_alias(w: &mut Buffer, cx: &Context, it: &clean::Item, t: &clean::TraitAlias) { write!(w, "
    ");
         render_attributes(w, it, false);
    -    write!(w, "trait {}{}{} = {};
    ", - it.name.as_ref().unwrap(), - t.generics.print(), - WhereClause { gens: &t.generics, indent: 0, end_newline: true }, - bounds(&t.bounds, true)); + write!( + w, + "trait {}{}{} = {};", + it.name.as_ref().unwrap(), + t.generics.print(), + WhereClause { gens: &t.generics, indent: 0, end_newline: true }, + bounds(&t.bounds, true) + ); document(w, cx, it); @@ -3617,11 +3909,14 @@ fn item_trait_alias(w: &mut Buffer, cx: &Context, it: &clean::Item, fn item_typedef(w: &mut Buffer, cx: &Context, it: &clean::Item, t: &clean::Typedef) { write!(w, "
    ");
         render_attributes(w, it, false);
    -    write!(w, "type {}{}{where_clause} = {type_};
    ", - it.name.as_ref().unwrap(), - t.generics.print(), - where_clause = WhereClause { gens: &t.generics, indent: 0, end_newline: true }, - type_ = t.type_.print()); + write!( + w, + "type {}{}{where_clause} = {type_};", + it.name.as_ref().unwrap(), + t.generics.print(), + where_clause = WhereClause { gens: &t.generics, indent: 0, end_newline: true }, + type_ = t.type_.print() + ); document(w, cx, it); @@ -3648,11 +3943,19 @@ fn item_foreign_type(w: &mut Buffer, cx: &Context, it: &clean::Item) { } fn print_sidebar(cx: &Context, it: &clean::Item, buffer: &mut Buffer) { - let parentlen = cx.current.len() - if it.is_mod() {1} else {0}; - - if it.is_struct() || it.is_trait() || it.is_primitive() || it.is_union() - || it.is_enum() || it.is_mod() || it.is_typedef() { - write!(buffer, "

    {}{}

    ", + let parentlen = cx.current.len() - if it.is_mod() { 1 } else { 0 }; + + if it.is_struct() + || it.is_trait() + || it.is_primitive() + || it.is_union() + || it.is_enum() + || it.is_mod() + || it.is_typedef() + { + write!( + buffer, + "

    {}{}

    ", match it.inner { clean::StructItem(..) => "Struct ", clean::TraitItem(..) => "Trait ", @@ -3661,30 +3964,37 @@ fn print_sidebar(cx: &Context, it: &clean::Item, buffer: &mut Buffer) { clean::EnumItem(..) => "Enum ", clean::TypedefItem(..) => "Type Definition ", clean::ForeignTypeItem => "Foreign Type ", - clean::ModuleItem(..) => if it.is_crate() { - "Crate " - } else { - "Module " - }, + clean::ModuleItem(..) => + if it.is_crate() { + "Crate " + } else { + "Module " + }, _ => "", }, - it.name.as_ref().unwrap()); + it.name.as_ref().unwrap() + ); } if it.is_crate() { if let Some(ref version) = cx.cache.crate_version { - write!(buffer, - "
    \ + write!( + buffer, + "
    \

    Version {}

    \
    ", - version); + version + ); } } write!(buffer, "
    "); if it.is_crate() { - write!(buffer, "

    See all {}'s items

    ", - it.name.as_ref().expect("crates always have a name")); + write!( + buffer, + "

    See all {}'s items

    ", + it.name.as_ref().expect("crates always have a name") + ); } match it.inner { clean::StructItem(ref s) => sidebar_struct(buffer, it, s), @@ -3711,29 +4021,33 @@ fn print_sidebar(cx: &Context, it: &clean::Item, buffer: &mut Buffer) { if i > 0 { write!(buffer, "::"); } - write!(buffer, "{}", - &cx.root_path()[..(cx.current.len() - i - 1) * 3], - *name); + write!( + buffer, + "{}", + &cx.root_path()[..(cx.current.len() - i - 1) * 3], + *name + ); } write!(buffer, "

    "); // Sidebar refers to the enclosing module, not this module. let relpath = if it.is_mod() { "../" } else { "" }; - write!(buffer, - "", - name = it.name.as_ref().map(|x| &x[..]).unwrap_or(""), - ty = it.type_(), - path = relpath); + name = it.name.as_ref().map(|x| &x[..]).unwrap_or(""), + ty = it.type_(), + path = relpath + ); if parentlen == 0 { // There is no sidebar-items.js beyond the crate root path // FIXME maybe dynamic crate loading can be merged here } else { - write!(buffer, "", - path = relpath); + write!(buffer, "", path = relpath); } // Closes sidebar-elems div. write!(buffer, "
    "); @@ -3756,36 +4070,39 @@ fn get_methods( used_links: &mut FxHashSet, deref_mut: bool, ) -> Vec { - i.items.iter().filter_map(|item| { - match item.name { + i.items + .iter() + .filter_map(|item| match item.name { Some(ref name) if !name.is_empty() && item.is_method() => { if !for_deref || should_render_item(item, deref_mut) { - Some(format!("{}", - get_next_url(used_links, format!("method.{}", name)), - name)) + Some(format!( + "{}", + get_next_url(used_links, format!("method.{}", name)), + name + )) } else { None } } _ => None, - } - }).collect::>() + }) + .collect::>() } // The point is to url encode any potential character from a type with genericity. fn small_url_encode(s: &str) -> String { s.replace("<", "%3C") - .replace(">", "%3E") - .replace(" ", "%20") - .replace("?", "%3F") - .replace("'", "%27") - .replace("&", "%26") - .replace(",", "%2C") - .replace(":", "%3A") - .replace(";", "%3B") - .replace("[", "%5B") - .replace("]", "%5D") - .replace("\"", "%22") + .replace(">", "%3E") + .replace(" ", "%20") + .replace("?", "%3F") + .replace("'", "%27") + .replace("&", "%26") + .replace(",", "%2C") + .replace(":", "%3A") + .replace(";", "%3B") + .replace("[", "%5B") + .replace("]", "%5D") + .replace("\"", "%22") } fn sidebar_assoc_items(it: &clean::Item) -> String { @@ -3796,53 +4113,70 @@ fn sidebar_assoc_items(it: &clean::Item) -> String { { let used_links_bor = &mut used_links; - let mut ret = v.iter() - .filter(|i| i.inner_impl().trait_.is_none()) - .flat_map(move |i| get_methods(i.inner_impl(), - false, - used_links_bor, false)) - .collect::>(); + let mut ret = v + .iter() + .filter(|i| i.inner_impl().trait_.is_none()) + .flat_map(move |i| get_methods(i.inner_impl(), false, used_links_bor, false)) + .collect::>(); // We want links' order to be reproducible so we don't use unstable sort. ret.sort(); if !ret.is_empty() { - out.push_str(&format!("Methods\ -
    {}
    ", ret.join(""))); + out.push_str(&format!( + "Methods\ +
    {}
    ", + ret.join("") + )); } } if v.iter().any(|i| i.inner_impl().trait_.is_some()) { - if let Some(impl_) = v.iter() - .filter(|i| i.inner_impl().trait_.is_some()) - .find(|i| i.inner_impl().trait_.def_id() == c.deref_trait_did) { - if let Some(target) = impl_.inner_impl().items.iter().filter_map(|item| { - match item.inner { - clean::TypedefItem(ref t, true) => Some(&t.type_), + if let Some(impl_) = v + .iter() + .filter(|i| i.inner_impl().trait_.is_some()) + .find(|i| i.inner_impl().trait_.def_id() == c.deref_trait_did) + { + if let Some((target, real_target)) = impl_ + .inner_impl() + .items + .iter() + .filter_map(|item| match item.inner { + clean::TypedefItem(ref t, true) => Some(match *t { + clean::Typedef { item_type: Some(ref type_), .. } => (type_, &t.type_), + _ => (&t.type_, &t.type_), + }), _ => None, - } - }).next() { - let inner_impl = target.def_id().or(target.primitive_type().and_then(|prim| { - c.primitive_locations.get(&prim).cloned() - })).and_then(|did| c.impls.get(&did)); + }) + .next() + { + let inner_impl = target + .def_id() + .or(target + .primitive_type() + .and_then(|prim| c.primitive_locations.get(&prim).cloned())) + .and_then(|did| c.impls.get(&did)); if let Some(impls) = inner_impl { out.push_str(""); - out.push_str(&format!("Methods from {}<Target={}>", + out.push_str(&format!( + "Methods from {}<Target={}>", Escape(&format!( - "{:#}", impl_.inner_impl().trait_.as_ref().unwrap().print() + "{:#}", + impl_.inner_impl().trait_.as_ref().unwrap().print() )), - Escape(&format!("{:#}", target.print())))); + Escape(&format!("{:#}", real_target.print())) + )); out.push_str(""); - let mut ret = impls.iter() - .filter(|i| i.inner_impl().trait_.is_none()) - .flat_map(|i| get_methods(i.inner_impl(), - true, - &mut used_links, - true)) - .collect::>(); + let mut ret = impls + .iter() + .filter(|i| i.inner_impl().trait_.is_none()) + .flat_map(|i| get_methods(i.inner_impl(), true, &mut used_links, true)) + .collect::>(); // We want links' order to be reproducible so we don't use unstable sort. ret.sort(); if !ret.is_empty() { - out.push_str(&format!("
    {}
    ", - ret.join(""))); + out.push_str(&format!( + "
    {}
    ", + ret.join("") + )); } } } @@ -3850,22 +4184,21 @@ fn sidebar_assoc_items(it: &clean::Item) -> String { let format_impls = |impls: Vec<&Impl>| { let mut links = FxHashSet::default(); - let mut ret = impls.iter() + let mut ret = impls + .iter() .filter_map(|i| { let is_negative_impl = is_negative_impl(i.inner_impl()); if let Some(ref i) = i.inner_impl().trait_ { let i_display = format!("{:#}", i.print()); let out = Escape(&i_display); let encoded = small_url_encode(&format!("{:#}", i.print())); - let generated = format!("{}{}", - encoded, - if is_negative_impl { "!" } else { "" }, - out); - if links.insert(generated.clone()) { - Some(generated) - } else { - None - } + let generated = format!( + "{}{}", + encoded, + if is_negative_impl { "!" } else { "" }, + out + ); + if links.insert(generated.clone()) { Some(generated) } else { None } } else { None } @@ -3875,9 +4208,8 @@ fn sidebar_assoc_items(it: &clean::Item) -> String { ret.join("") }; - let (synthetic, concrete): (Vec<&Impl>, Vec<&Impl>) = v - .iter() - .partition::, _>(|i| i.inner_impl().synthetic); + let (synthetic, concrete): (Vec<&Impl>, Vec<&Impl>) = + v.iter().partition::, _>(|i| i.inner_impl().synthetic); let (blanket_impl, concrete): (Vec<&Impl>, Vec<&Impl>) = concrete .into_iter() .partition::, _>(|i| i.inner_impl().blanket_impl.is_some()); @@ -3887,20 +4219,26 @@ fn sidebar_assoc_items(it: &clean::Item) -> String { let blanket_format = format_impls(blanket_impl); if !concrete_format.is_empty() { - out.push_str("\ - Trait Implementations"); + out.push_str( + "\ + Trait Implementations", + ); out.push_str(&format!("
    {}
    ", concrete_format)); } if !synthetic_format.is_empty() { - out.push_str("\ - Auto Trait Implementations"); + out.push_str( + "\ + Auto Trait Implementations", + ); out.push_str(&format!("
    {}
    ", synthetic_format)); } if !blanket_format.is_empty() { - out.push_str("\ - Blanket Implementations"); + out.push_str( + "\ + Blanket Implementations", + ); out.push_str(&format!("
    {}
    ", blanket_format)); } } @@ -3915,8 +4253,11 @@ fn sidebar_struct(buf: &mut Buffer, it: &clean::Item, s: &clean::Struct) { if !fields.is_empty() { if let doctree::Plain = s.struct_type { - sidebar.push_str(&format!("Fields\ -
    {}
    ", fields)); + sidebar.push_str(&format!( + "Fields\ +
    {}
    ", + fields + )); } } @@ -3942,7 +4283,7 @@ fn extract_for_impl_name(item: &clean::Item) -> Option<(String, String)> { } else { None } - }, + } _ => None, } } @@ -3954,107 +4295,108 @@ fn is_negative_impl(i: &clean::Impl) -> bool { fn sidebar_trait(buf: &mut Buffer, it: &clean::Item, t: &clean::Trait) { let mut sidebar = String::new(); - let types = t.items - .iter() - .filter_map(|m| { - match m.name { - Some(ref name) if m.is_associated_type() => { - Some(format!("{name}", - name=name)) - } - _ => None, - } - }) - .collect::(); - let consts = t.items - .iter() - .filter_map(|m| { - match m.name { - Some(ref name) if m.is_associated_const() => { - Some(format!("{name}", - name=name)) - } - _ => None, - } - }) - .collect::(); - let mut required = t.items - .iter() - .filter_map(|m| { - match m.name { - Some(ref name) if m.is_ty_method() => { - Some(format!("{name}", - name=name)) - } - _ => None, - } - }) - .collect::>(); - let mut provided = t.items - .iter() - .filter_map(|m| { - match m.name { - Some(ref name) if m.is_method() => { - Some(format!("{0}", name)) - } - _ => None, - } - }) - .collect::>(); + let types = t + .items + .iter() + .filter_map(|m| match m.name { + Some(ref name) if m.is_associated_type() => { + Some(format!("{name}", name = name)) + } + _ => None, + }) + .collect::(); + let consts = t + .items + .iter() + .filter_map(|m| match m.name { + Some(ref name) if m.is_associated_const() => { + Some(format!("{name}", name = name)) + } + _ => None, + }) + .collect::(); + let mut required = t + .items + .iter() + .filter_map(|m| match m.name { + Some(ref name) if m.is_ty_method() => { + Some(format!("{name}", name = name)) + } + _ => None, + }) + .collect::>(); + let mut provided = t + .items + .iter() + .filter_map(|m| match m.name { + Some(ref name) if m.is_method() => { + Some(format!("{0}", name)) + } + _ => None, + }) + .collect::>(); if !types.is_empty() { - sidebar.push_str(&format!("\ + sidebar.push_str(&format!( + "\ Associated Types
    {}
    ", - types)); + types + )); } if !consts.is_empty() { - sidebar.push_str(&format!("\ + sidebar.push_str(&format!( + "\ Associated Constants
    {}
    ", - consts)); + consts + )); } if !required.is_empty() { required.sort(); - sidebar.push_str(&format!("\ + sidebar.push_str(&format!( + "\ Required Methods
    {}
    ", - required.join(""))); + required.join("") + )); } if !provided.is_empty() { provided.sort(); - sidebar.push_str(&format!("\ + sidebar.push_str(&format!( + "\ Provided Methods
    {}
    ", - provided.join(""))); + provided.join("") + )); } let c = cache(); if let Some(implementors) = c.implementors.get(&it.def_id) { - let mut res = implementors.iter() - .filter(|i| i.inner_impl().for_.def_id() - .map_or(false, |d| !c.paths.contains_key(&d))) - .filter_map(|i| { - match extract_for_impl_name(&i.impl_item) { - Some((ref name, ref id)) => { - Some(format!("{}", - id, - Escape(name))) - } - _ => None, - } - }) - .collect::>(); + let mut res = implementors + .iter() + .filter(|i| i.inner_impl().for_.def_id().map_or(false, |d| !c.paths.contains_key(&d))) + .filter_map(|i| match extract_for_impl_name(&i.impl_item) { + Some((ref name, ref id)) => { + Some(format!("{}", id, Escape(name))) + } + _ => None, + }) + .collect::>(); if !res.is_empty() { res.sort(); - sidebar.push_str(&format!("\ + sidebar.push_str(&format!( + "\ Implementations on Foreign Types
    {}
    ", - res.join(""))); + res.join("") + )); } } sidebar.push_str("Implementors"); if t.auto { - sidebar.push_str("Auto Implementors"); + sidebar.push_str( + "Auto Implementors", + ); } sidebar.push_str(&sidebar_assoc_items(it)); @@ -4079,18 +4421,18 @@ fn sidebar_typedef(buf: &mut Buffer, it: &clean::Item) { } fn get_struct_fields_name(fields: &[clean::Item]) -> String { - fields.iter() - .filter(|f| if let clean::StructFieldItem(..) = f.inner { - true - } else { - false - }) - .filter_map(|f| match f.name { - Some(ref name) => Some(format!("\ - {name}", name=name)), - _ => None, - }) - .collect() + fields + .iter() + .filter(|f| if let clean::StructFieldItem(..) = f.inner { true } else { false }) + .filter_map(|f| match f.name { + Some(ref name) => Some(format!( + "\ + {name}", + name = name + )), + _ => None, + }) + .collect() } fn sidebar_union(buf: &mut Buffer, it: &clean::Item, u: &clean::Union) { @@ -4098,8 +4440,11 @@ fn sidebar_union(buf: &mut Buffer, it: &clean::Item, u: &clean::Union) { let fields = get_struct_fields_name(&u.fields); if !fields.is_empty() { - sidebar.push_str(&format!("Fields\ -
    {}
    ", fields)); + sidebar.push_str(&format!( + "Fields\ +
    {}
    ", + fields + )); } sidebar.push_str(&sidebar_assoc_items(it)); @@ -4112,16 +4457,24 @@ fn sidebar_union(buf: &mut Buffer, it: &clean::Item, u: &clean::Union) { fn sidebar_enum(buf: &mut Buffer, it: &clean::Item, e: &clean::Enum) { let mut sidebar = String::new(); - let variants = e.variants.iter() - .filter_map(|v| match v.name { - Some(ref name) => Some(format!("{name}\ - ", name = name)), - _ => None, - }) - .collect::(); + let variants = e + .variants + .iter() + .filter_map(|v| match v.name { + Some(ref name) => Some(format!( + "{name}\ + ", + name = name + )), + _ => None, + }) + .collect::(); if !variants.is_empty() { - sidebar.push_str(&format!("Variants\ -
    {}
    ", variants)); + sidebar.push_str(&format!( + "Variants\ +
    {}
    ", + variants + )); } sidebar.push_str(&sidebar_assoc_items(it)); @@ -4133,58 +4486,77 @@ fn sidebar_enum(buf: &mut Buffer, it: &clean::Item, e: &clean::Enum) { fn item_ty_to_strs(ty: &ItemType) -> (&'static str, &'static str) { match *ty { - ItemType::ExternCrate | - ItemType::Import => ("reexports", "Re-exports"), - ItemType::Module => ("modules", "Modules"), - ItemType::Struct => ("structs", "Structs"), - ItemType::Union => ("unions", "Unions"), - ItemType::Enum => ("enums", "Enums"), - ItemType::Function => ("functions", "Functions"), - ItemType::Typedef => ("types", "Type Definitions"), - ItemType::Static => ("statics", "Statics"), - ItemType::Constant => ("constants", "Constants"), - ItemType::Trait => ("traits", "Traits"), - ItemType::Impl => ("impls", "Implementations"), - ItemType::TyMethod => ("tymethods", "Type Methods"), - ItemType::Method => ("methods", "Methods"), - ItemType::StructField => ("fields", "Struct Fields"), - ItemType::Variant => ("variants", "Variants"), - ItemType::Macro => ("macros", "Macros"), - ItemType::Primitive => ("primitives", "Primitive Types"), - ItemType::AssocType => ("associated-types", "Associated Types"), - ItemType::AssocConst => ("associated-consts", "Associated Constants"), - ItemType::ForeignType => ("foreign-types", "Foreign Types"), - ItemType::Keyword => ("keywords", "Keywords"), - ItemType::OpaqueTy => ("opaque-types", "Opaque Types"), - ItemType::ProcAttribute => ("attributes", "Attribute Macros"), - ItemType::ProcDerive => ("derives", "Derive Macros"), - ItemType::TraitAlias => ("trait-aliases", "Trait aliases"), + ItemType::ExternCrate | ItemType::Import => ("reexports", "Re-exports"), + ItemType::Module => ("modules", "Modules"), + ItemType::Struct => ("structs", "Structs"), + ItemType::Union => ("unions", "Unions"), + ItemType::Enum => ("enums", "Enums"), + ItemType::Function => ("functions", "Functions"), + ItemType::Typedef => ("types", "Type Definitions"), + ItemType::Static => ("statics", "Statics"), + ItemType::Constant => ("constants", "Constants"), + ItemType::Trait => ("traits", "Traits"), + ItemType::Impl => ("impls", "Implementations"), + ItemType::TyMethod => ("tymethods", "Type Methods"), + ItemType::Method => ("methods", "Methods"), + ItemType::StructField => ("fields", "Struct Fields"), + ItemType::Variant => ("variants", "Variants"), + ItemType::Macro => ("macros", "Macros"), + ItemType::Primitive => ("primitives", "Primitive Types"), + ItemType::AssocType => ("associated-types", "Associated Types"), + ItemType::AssocConst => ("associated-consts", "Associated Constants"), + ItemType::ForeignType => ("foreign-types", "Foreign Types"), + ItemType::Keyword => ("keywords", "Keywords"), + ItemType::OpaqueTy => ("opaque-types", "Opaque Types"), + ItemType::ProcAttribute => ("attributes", "Attribute Macros"), + ItemType::ProcDerive => ("derives", "Derive Macros"), + ItemType::TraitAlias => ("trait-aliases", "Trait aliases"), } } fn sidebar_module(buf: &mut Buffer, items: &[clean::Item]) { let mut sidebar = String::new(); - if items.iter().any(|it| it.type_() == ItemType::ExternCrate || - it.type_() == ItemType::Import) { - sidebar.push_str(&format!("
  • {name}
  • ", - id = "reexports", - name = "Re-exports")); + if items.iter().any(|it| it.type_() == ItemType::ExternCrate || it.type_() == ItemType::Import) + { + sidebar.push_str(&format!( + "
  • {name}
  • ", + id = "reexports", + name = "Re-exports" + )); } // ordering taken from item_module, reorder, where it prioritized elements in a certain order // to print its headings - for &myty in &[ItemType::Primitive, ItemType::Module, ItemType::Macro, ItemType::Struct, - ItemType::Enum, ItemType::Constant, ItemType::Static, ItemType::Trait, - ItemType::Function, ItemType::Typedef, ItemType::Union, ItemType::Impl, - ItemType::TyMethod, ItemType::Method, ItemType::StructField, ItemType::Variant, - ItemType::AssocType, ItemType::AssocConst, ItemType::ForeignType, - ItemType::Keyword] { + for &myty in &[ + ItemType::Primitive, + ItemType::Module, + ItemType::Macro, + ItemType::Struct, + ItemType::Enum, + ItemType::Constant, + ItemType::Static, + ItemType::Trait, + ItemType::Function, + ItemType::Typedef, + ItemType::Union, + ItemType::Impl, + ItemType::TyMethod, + ItemType::Method, + ItemType::StructField, + ItemType::Variant, + ItemType::AssocType, + ItemType::AssocConst, + ItemType::ForeignType, + ItemType::Keyword, + ] { if items.iter().any(|it| !it.is_stripped() && it.type_() == myty) { let (short, name) = item_ty_to_strs(&myty); - sidebar.push_str(&format!("
  • {name}
  • ", - id = short, - name = name)); + sidebar.push_str(&format!( + "
  • {name}
  • ", + id = short, + name = name + )); } } @@ -4202,10 +4574,7 @@ fn sidebar_foreign_type(buf: &mut Buffer, it: &clean::Item) { fn item_macro(w: &mut Buffer, cx: &Context, it: &clean::Item, t: &clean::Macro) { wrap_into_docblock(w, |w| { - w.write_str(&highlight::render_with_highlighting(&t.source, - Some("macro"), - None, - None)) + w.write_str(&highlight::render_with_highlighting(&t.source, Some("macro"), None, None)) }); document(w, cx, it) } @@ -4282,33 +4651,32 @@ fn collect_paths_for_type(first_ty: clean::Type) -> Vec { match fqp { Some(path) => { out.push(path.join("::")); - }, + } _ => {} }; - - }, + } clean::Type::Tuple(tys) => { work.extend(tys.into_iter()); - }, + } clean::Type::Slice(ty) => { work.push_back(*ty); } clean::Type::Array(ty, _) => { work.push_back(*ty); - }, + } clean::Type::RawPointer(_, ty) => { work.push_back(*ty); - }, + } clean::Type::BorrowedRef { type_, .. } => { work.push_back(*type_); - }, + } clean::Type::QPath { self_type, trait_, .. } => { work.push_back(*self_type); work.push_back(*trait_); - }, + } _ => {} } - }; + } out } diff --git a/src/librustdoc/html/render/cache.rs b/src/librustdoc/html/render/cache.rs index d80facf470..f1f83acdda 100644 --- a/src/librustdoc/html/render/cache.rs +++ b/src/librustdoc/html/render/cache.rs @@ -1,18 +1,18 @@ -use crate::clean::{self, GetDefId, AttributesExt}; +use crate::clean::{self, AttributesExt, GetDefId}; use crate::fold::DocFolder; -use rustc::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefId}; use rustc::middle::privacy::AccessLevels; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX}; +use rustc_span::source_map::FileName; +use rustc_span::symbol::sym; +use std::collections::BTreeMap; use std::mem; use std::path::{Path, PathBuf}; -use std::collections::BTreeMap; -use syntax::source_map::FileName; -use syntax::symbol::sym; use serde::Serialize; -use super::{ItemType, IndexItem, IndexItemFunctionType, Impl, shorten, plain_summary_line}; -use super::{Type, RenderInfo}; +use super::{plain_summary_line, shorten, Impl, IndexItem, IndexItemFunctionType, ItemType}; +use super::{RenderInfo, Type}; /// Indicates where an external crate can be found. pub enum ExternalLocation { @@ -92,7 +92,6 @@ crate struct Cache { pub crate_version: Option, // Private fields only used when initially crawling a crate to build a cache - stack: Vec, parent_stack: Vec, parent_is_trait_impl: bool, @@ -142,9 +141,8 @@ impl Cache { owned_box_did, } = renderinfo; - let external_paths = external_paths.into_iter() - .map(|(k, (v, t))| (k, (v, ItemType::from(t)))) - .collect(); + let external_paths = + external_paths.into_iter().map(|(k, (v, t))| (k, (v, ItemType::from(t)))).collect(); let mut cache = Cache { impls: Default::default(), @@ -181,8 +179,9 @@ impl Cache { _ => PathBuf::new(), }; let extern_url = extern_html_root_urls.get(&e.name).map(|u| &**u); - cache.extern_locations.insert(n, (e.name.clone(), src_root, - extern_location(e, extern_url, &dst))); + cache + .extern_locations + .insert(n, (e.name.clone(), src_root, extern_location(e, extern_url, &dst))); let did = DefId { krate: n, index: CRATE_DEF_INDEX }; cache.external_paths.insert(did, (vec![e.name.to_string()], ItemType::Module)); @@ -237,9 +236,10 @@ impl DocFolder for Cache { // If the impl is from a masked crate or references something from a // masked crate then remove it completely. if let clean::ImplItem(ref i) = item.inner { - if self.masked_crates.contains(&item.def_id.krate) || - i.trait_.def_id().map_or(false, |d| self.masked_crates.contains(&d.krate)) || - i.for_.def_id().map_or(false, |d| self.masked_crates.contains(&d.krate)) { + if self.masked_crates.contains(&item.def_id.krate) + || i.trait_.def_id().map_or(false, |d| self.masked_crates.contains(&d.krate)) + || i.for_.def_id().map_or(false, |d| self.masked_crates.contains(&d.krate)) + { return None; } } @@ -254,9 +254,10 @@ impl DocFolder for Cache { if let clean::ImplItem(ref i) = item.inner { if let Some(did) = i.trait_.def_id() { if i.blanket_impl.is_none() { - self.implementors.entry(did).or_default().push(Impl { - impl_item: item.clone(), - }); + self.implementors + .entry(did) + .or_default() + .push(Impl { impl_item: item.clone() }); } } } @@ -265,42 +266,44 @@ impl DocFolder for Cache { if let Some(ref s) = item.name { let (parent, is_inherent_impl_item) = match item.inner { clean::StrippedItem(..) => ((None, None), false), - clean::AssocConstItem(..) | - clean::TypedefItem(_, true) if self.parent_is_trait_impl => { + clean::AssocConstItem(..) | clean::TypedefItem(_, true) + if self.parent_is_trait_impl => + { // skip associated items in trait impls ((None, None), false) } - clean::AssocTypeItem(..) | - clean::TyMethodItem(..) | - clean::StructFieldItem(..) | - clean::VariantItem(..) => { - ((Some(*self.parent_stack.last().unwrap()), - Some(&self.stack[..self.stack.len() - 1])), - false) - } + clean::AssocTypeItem(..) + | clean::TyMethodItem(..) + | clean::StructFieldItem(..) + | clean::VariantItem(..) => ( + ( + Some(*self.parent_stack.last().expect("parent_stack is empty")), + Some(&self.stack[..self.stack.len() - 1]), + ), + false, + ), clean::MethodItem(..) | clean::AssocConstItem(..) => { if self.parent_stack.is_empty() { ((None, None), false) } else { - let last = self.parent_stack.last().unwrap(); + let last = self.parent_stack.last().expect("parent_stack is empty 2"); let did = *last; let path = match self.paths.get(&did) { // The current stack not necessarily has correlation // for where the type was defined. On the other // hand, `paths` always has the right // information if present. - Some(&(ref fqp, ItemType::Trait)) | - Some(&(ref fqp, ItemType::Struct)) | - Some(&(ref fqp, ItemType::Union)) | - Some(&(ref fqp, ItemType::Enum)) => - Some(&fqp[..fqp.len() - 1]), + Some(&(ref fqp, ItemType::Trait)) + | Some(&(ref fqp, ItemType::Struct)) + | Some(&(ref fqp, ItemType::Union)) + | Some(&(ref fqp, ItemType::Enum)) => Some(&fqp[..fqp.len() - 1]), Some(..) => Some(&*self.stack), - None => None + None => None, }; ((Some(*last), path), true) } } - _ => ((None, Some(&*self.stack)), false) + _ => ((None, Some(&*self.stack)), false), }; match parent { @@ -341,25 +344,32 @@ impl DocFolder for Cache { }; match item.inner { - clean::StructItem(..) | clean::EnumItem(..) | - clean::TypedefItem(..) | clean::TraitItem(..) | - clean::FunctionItem(..) | clean::ModuleItem(..) | - clean::ForeignFunctionItem(..) | clean::ForeignStaticItem(..) | - clean::ConstantItem(..) | clean::StaticItem(..) | - clean::UnionItem(..) | clean::ForeignTypeItem | - clean::MacroItem(..) | clean::ProcMacroItem(..) - if !self.stripped_mod => { + clean::StructItem(..) + | clean::EnumItem(..) + | clean::TypedefItem(..) + | clean::TraitItem(..) + | clean::FunctionItem(..) + | clean::ModuleItem(..) + | clean::ForeignFunctionItem(..) + | clean::ForeignStaticItem(..) + | clean::ConstantItem(..) + | clean::StaticItem(..) + | clean::UnionItem(..) + | clean::ForeignTypeItem + | clean::MacroItem(..) + | clean::ProcMacroItem(..) + if !self.stripped_mod => + { // Re-exported items mean that the same id can show up twice // in the rustdoc ast that we're looking at. We know, // however, that a re-exported item doesn't show up in the // `public_items` map, so we can skip inserting into the // paths map if there was already an entry present and we're // not a public item. - if !self.paths.contains_key(&item.def_id) || - self.access_levels.is_public(item.def_id) + if !self.paths.contains_key(&item.def_id) + || self.access_levels.is_public(item.def_id) { - self.paths.insert(item.def_id, - (self.stack.clone(), item.type_())); + self.paths.insert(item.def_id, (self.stack.clone(), item.type_())); } self.add_aliases(&item); } @@ -373,8 +383,7 @@ impl DocFolder for Cache { clean::PrimitiveItem(..) => { self.add_aliases(&item); - self.paths.insert(item.def_id, (self.stack.clone(), - item.type_())); + self.paths.insert(item.def_id, (self.stack.clone(), item.type_())); } _ => {} @@ -383,8 +392,11 @@ impl DocFolder for Cache { // Maintain the parent stack let orig_parent_is_trait_impl = self.parent_is_trait_impl; let parent_pushed = match item.inner { - clean::TraitItem(..) | clean::EnumItem(..) | clean::ForeignTypeItem | - clean::StructItem(..) | clean::UnionItem(..) => { + clean::TraitItem(..) + | clean::EnumItem(..) + | clean::ForeignTypeItem + | clean::StructItem(..) + | clean::UnionItem(..) => { self.parent_stack.push(item.def_id); self.parent_is_trait_impl = false; true @@ -392,14 +404,14 @@ impl DocFolder for Cache { clean::ImplItem(ref i) => { self.parent_is_trait_impl = i.trait_.is_some(); match i.for_ { - clean::ResolvedPath{ did, .. } => { + clean::ResolvedPath { did, .. } => { self.parent_stack.push(did); true } ref t => { - let prim_did = t.primitive_type().and_then(|t| { - self.primitive_locations.get(&t).cloned() - }); + let prim_did = t + .primitive_type() + .and_then(|t| self.primitive_locations.get(&t).cloned()); match prim_did { Some(did) => { self.parent_stack.push(did); @@ -410,7 +422,7 @@ impl DocFolder for Cache { } } } - _ => false + _ => false, }; // Once we've recursively found all the generics, hoard off all the @@ -423,16 +435,16 @@ impl DocFolder for Cache { let mut dids = FxHashSet::default(); if let clean::Item { inner: clean::ImplItem(ref i), .. } = item { match i.for_ { - clean::ResolvedPath { did, .. } | - clean::BorrowedRef { + clean::ResolvedPath { did, .. } + | clean::BorrowedRef { type_: box clean::ResolvedPath { did, .. }, .. } => { dids.insert(did); } ref t => { - let did = t.primitive_type().and_then(|t| { - self.primitive_locations.get(&t).cloned() - }); + let did = t + .primitive_type() + .and_then(|t| self.primitive_locations.get(&t).cloned()); if let Some(did) = did { dids.insert(did); @@ -450,15 +462,13 @@ impl DocFolder for Cache { } else { unreachable!() }; - let impl_item = Impl { - impl_item: item, - }; + let impl_item = Impl { impl_item: item }; if impl_item.trait_did().map_or(true, |d| self.traits.contains_key(&d)) { for did in dids { self.impls.entry(did).or_insert(vec![]).push(impl_item.clone()); } } else { - let trait_did = impl_item.trait_did().unwrap(); + let trait_did = impl_item.trait_did().expect("no trait did"); self.orphan_trait_impls.push((trait_did, dids, impl_item)); } None @@ -467,8 +477,12 @@ impl DocFolder for Cache { } }); - if pushed { self.stack.pop().unwrap(); } - if parent_pushed { self.parent_stack.pop().unwrap(); } + if pushed { + self.stack.pop().expect("stack already empty"); + } + if parent_pushed { + self.parent_stack.pop().expect("parent stack already empty"); + } self.stripped_mod = orig_stripped_mod; self.parent_is_trait_impl = orig_parent_is_trait_impl; ret @@ -478,30 +492,32 @@ impl DocFolder for Cache { impl Cache { fn add_aliases(&mut self, item: &clean::Item) { if item.def_id.index == CRATE_DEF_INDEX { - return + return; } if let Some(ref item_name) = item.name { - let path = self.paths.get(&item.def_id) - .map(|p| p.0[..p.0.len() - 1].join("::")) - .unwrap_or("std".to_owned()); - for alias in item.attrs.lists(sym::doc) - .filter(|a| a.check_name(sym::alias)) - .filter_map(|a| a.value_str() - .map(|s| s.to_string().replace("\"", ""))) - .filter(|v| !v.is_empty()) - .collect::>() - .into_iter() { - self.aliases.entry(alias) - .or_insert(Vec::with_capacity(1)) - .push(IndexItem { - ty: item.type_(), - name: item_name.to_string(), - path: path.clone(), - desc: shorten(plain_summary_line(item.doc_value())), - parent: None, - parent_idx: None, - search_type: get_index_search_type(&item), - }); + let path = self + .paths + .get(&item.def_id) + .map(|p| p.0[..p.0.len() - 1].join("::")) + .unwrap_or("std".to_owned()); + for alias in item + .attrs + .lists(sym::doc) + .filter(|a| a.check_name(sym::alias)) + .filter_map(|a| a.value_str().map(|s| s.to_string().replace("\"", ""))) + .filter(|v| !v.is_empty()) + .collect::>() + .into_iter() + { + self.aliases.entry(alias).or_insert(Vec::with_capacity(1)).push(IndexItem { + ty: item.type_(), + name: item_name.to_string(), + path: path.clone(), + desc: shorten(plain_summary_line(item.doc_value())), + parent: None, + parent_idx: None, + search_type: get_index_search_type(&item), + }); } } } @@ -509,9 +525,11 @@ impl Cache { /// Attempts to find where an external crate is located, given that we're /// rendering in to the specified source destination. -fn extern_location(e: &clean::ExternalCrate, extern_url: Option<&str>, dst: &Path) - -> ExternalLocation -{ +fn extern_location( + e: &clean::ExternalCrate, + extern_url: Option<&str>, + dst: &Path, +) -> ExternalLocation { use ExternalLocation::*; // See if there's documentation generated into the local directory let local_location = dst.join(&e.name); @@ -529,16 +547,19 @@ fn extern_location(e: &clean::ExternalCrate, extern_url: Option<&str>, dst: &Pat // Failing that, see if there's an attribute specifying where to find this // external crate - e.attrs.lists(sym::doc) - .filter(|a| a.check_name(sym::html_root_url)) - .filter_map(|a| a.value_str()) - .map(|url| { - let mut url = url.to_string(); - if !url.ends_with("/") { - url.push('/') - } - Remote(url) - }).next().unwrap_or(Unknown) // Well, at least we tried. + e.attrs + .lists(sym::doc) + .filter(|a| a.check_name(sym::html_root_url)) + .filter_map(|a| a.value_str()) + .map(|url| { + let mut url = url.to_string(); + if !url.ends_with("/") { + url.push('/') + } + Remote(url) + }) + .next() + .unwrap_or(Unknown) // Well, at least we tried. } /// Builds the search index from the collected metadata @@ -547,9 +568,7 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { let mut crate_items = Vec::with_capacity(cache.search_index.len()); let mut crate_paths = vec![]; - let Cache { ref mut search_index, - ref orphan_impl_items, - ref paths, .. } = *cache; + let Cache { ref mut search_index, ref orphan_impl_items, ref paths, .. } = *cache; // Attach all orphan items to the type's definition if the type // has since been learned. @@ -575,7 +594,7 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { for item in search_index { item.parent_idx = item.parent.map(|nodeid| { if nodeid_to_pathid.contains_key(&nodeid) { - *nodeid_to_pathid.get(&nodeid).unwrap() + *nodeid_to_pathid.get(&nodeid).expect("no pathid") } else { let pathid = lastpathid; nodeid_to_pathid.insert(nodeid, pathid); @@ -596,9 +615,11 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { crate_items.push(&*item); } - let crate_doc = krate.module.as_ref().map(|module| { - shorten(plain_summary_line(module.doc_value())) - }).unwrap_or(String::new()); + let crate_doc = krate + .module + .as_ref() + .map(|module| shorten(plain_summary_line(module.doc_value()))) + .unwrap_or(String::new()); #[derive(Serialize)] struct CrateData<'a> { @@ -618,7 +639,7 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { items: crate_items, paths: crate_paths, }) - .unwrap() + .expect("failed serde conversion") ) } @@ -630,17 +651,14 @@ fn get_index_search_type(item: &clean::Item) -> Option { _ => return None, }; - let inputs = all_types.iter().map(|arg| { - get_index_type(&arg) - }).filter(|a| a.name.is_some()).collect(); - let output = ret_types.iter().map(|arg| { - get_index_type(&arg) - }).filter(|a| a.name.is_some()).collect::>(); - let output = if output.is_empty() { - None - } else { - Some(output) - }; + let inputs = + all_types.iter().map(|arg| get_index_type(&arg)).filter(|a| a.name.is_some()).collect(); + let output = ret_types + .iter() + .map(|arg| get_index_type(&arg)) + .filter(|a| a.name.is_some()) + .collect::>(); + let output = if output.is_empty() { None } else { Some(output) }; Some(IndexItemFunctionType { inputs, output }) } @@ -667,21 +685,17 @@ fn get_index_type_name(clean_type: &clean::Type, accept_generic: bool) -> Option clean::Primitive(ref p) => Some(format!("{:?}", p)), clean::BorrowedRef { ref type_, .. } => get_index_type_name(type_, accept_generic), // FIXME: add all from clean::Type. - _ => None + _ => None, } } fn get_generics(clean_type: &clean::Type) -> Option> { - clean_type.generics() - .and_then(|types| { - let r = types.iter() - .filter_map(|t| get_index_type_name(t, false)) - .map(|s| s.to_ascii_lowercase()) - .collect::>(); - if r.is_empty() { - None - } else { - Some(r) - } - }) + clean_type.generics().and_then(|types| { + let r = types + .iter() + .filter_map(|t| get_index_type_name(t, false)) + .map(|s| s.to_ascii_lowercase()) + .collect::>(); + if r.is_empty() { None } else { Some(r) } + }) } diff --git a/src/librustdoc/html/render/tests.rs b/src/librustdoc/html/render/tests.rs index 1848b575e4..99ad26549f 100644 --- a/src/librustdoc/html/render/tests.rs +++ b/src/librustdoc/html/render/tests.rs @@ -14,15 +14,10 @@ fn test_name_key() { #[test] fn test_name_sorting() { - let names = ["Apple", - "Banana", - "Fruit", "Fruit0", "Fruit00", - "Fruit1", "Fruit01", - "Fruit2", "Fruit02", - "Fruit20", - "Fruit30x", - "Fruit100", - "Pear"]; + let names = [ + "Apple", "Banana", "Fruit", "Fruit0", "Fruit00", "Fruit1", "Fruit01", "Fruit2", "Fruit02", + "Fruit20", "Fruit30x", "Fruit100", "Pear", + ]; let mut sorted = names.to_owned(); sorted.sort_by_key(|&s| name_key(s)); assert_eq!(names, sorted); diff --git a/src/librustdoc/html/sources.rs b/src/librustdoc/html/sources.rs index d840683a7a..79e7d3d783 100644 --- a/src/librustdoc/html/sources.rs +++ b/src/librustdoc/html/sources.rs @@ -1,24 +1,24 @@ use crate::clean; use crate::docfs::PathError; use crate::fold::DocFolder; +use crate::html::format::Buffer; +use crate::html::highlight; use crate::html::layout; use crate::html::render::{Error, SharedContext, BASIC_KEYWORDS}; -use crate::html::highlight; -use crate::html::format::Buffer; +use rustc_span::source_map::FileName; use std::ffi::OsStr; use std::fs; use std::path::{Component, Path, PathBuf}; -use syntax::source_map::FileName; -crate fn render(dst: &Path, scx: &mut SharedContext, - krate: clean::Crate) -> Result { +crate fn render( + dst: &Path, + scx: &mut SharedContext, + krate: clean::Crate, +) -> Result { info!("emitting source files"); let dst = dst.join("src").join(&krate.name); scx.ensure_dir(&dst)?; - let mut folder = SourceCollector { - dst, - scx, - }; + let mut folder = SourceCollector { dst, scx }; Ok(folder.fold_crate(krate)) } @@ -38,20 +38,21 @@ impl<'a> DocFolder for SourceCollector<'a> { // skip all invalid or macro spans && item.source.filename.is_real() // skip non-local items - && item.def_id.is_local() { - + && item.def_id.is_local() + { // If it turns out that we couldn't read this file, then we probably // can't read any of the files (generating html output from json or // something like that), so just don't include sources for the // entire crate. The other option is maintaining this mapping on a // per-file basis, but that's probably not worth it... - self.scx - .include_sources = match self.emit_source(&item.source.filename) { + self.scx.include_sources = match self.emit_source(&item.source.filename) { Ok(()) => true, Err(e) => { - println!("warning: source code was requested to be rendered, \ + println!( + "warning: source code was requested to be rendered, \ but processing `{}` had an error: {}", - item.source.filename, e); + item.source.filename, e + ); println!(" skipping rendering of source code"); false } @@ -81,11 +82,8 @@ impl<'a> SourceCollector<'a> { }; // Remove the utf-8 BOM if any - let contents = if contents.starts_with("\u{feff}") { - &contents[3..] - } else { - &contents[..] - }; + let contents = + if contents.starts_with("\u{feff}") { &contents[3..] } else { &contents[..] }; // Create the intermediate directories let mut cur = self.dst.clone(); @@ -98,15 +96,15 @@ impl<'a> SourceCollector<'a> { href.push('/'); }); self.scx.ensure_dir(&cur)?; - let mut fname = p.file_name() - .expect("source has no filename") - .to_os_string(); + let mut fname = p.file_name().expect("source has no filename").to_os_string(); fname.push(".html"); cur.push(&fname); href.push_str(&fname.to_string_lossy()); - let title = format!("{} -- source", cur.file_name().expect("failed to get file name") - .to_string_lossy()); + let title = format!( + "{} -- source", + cur.file_name().expect("failed to get file name").to_string_lossy() + ); let desc = format!("Source to the Rust file `{}`.", filename); let page = layout::Page { title: &title, @@ -119,9 +117,13 @@ impl<'a> SourceCollector<'a> { extra_scripts: &[&format!("source-files{}", self.scx.resource_suffix)], static_extra_scripts: &[&format!("source-script{}", self.scx.resource_suffix)], }; - let v = layout::render(&self.scx.layout, - &page, "", |buf: &mut _| print_src(buf, &contents), - &self.scx.themes); + let v = layout::render( + &self.scx.layout, + &page, + "", + |buf: &mut _| print_src(buf, &contents), + &self.scx.themes, + ); self.scx.fs.write(&cur, v.as_bytes())?; self.scx.local_sources.insert(p.clone(), href); Ok(()) @@ -170,6 +172,5 @@ fn print_src(buf: &mut Buffer, s: &str) { write!(buf, "{0:1$}\n", i, cols); } write!(buf, ""); - write!(buf, "{}", - highlight::render_with_highlighting(s, None, None, None)); + write!(buf, "{}", highlight::render_with_highlighting(s, None, None, None)); } diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js index 1459e8f37c..44fd8b929f 100644 --- a/src/librustdoc/html/static/main.js +++ b/src/librustdoc/html/static/main.js @@ -138,6 +138,22 @@ function getSearchElement() { } } + function showSearchResults(search) { + if (search === null || typeof search === 'undefined') { + search = getSearchElement(); + } + addClass(main, "hidden"); + removeClass(search, "hidden"); + } + + function hideSearchResults(search) { + if (search === null || typeof search === 'undefined') { + search = getSearchElement(); + } + addClass(search, "hidden"); + removeClass(main, "hidden"); + } + // used for special search precedence var TY_PRIMITIVE = itemTypes.indexOf("primitive"); var TY_KEYWORD = itemTypes.indexOf("keyword"); @@ -169,8 +185,7 @@ function getSearchElement() { if (ev !== null && search && !hasClass(search, "hidden") && ev.newURL) { // This block occurs when clicking on an element in the navbar while // in a search. - addClass(search, "hidden"); - removeClass(main, "hidden"); + hideSearchResults(search); var hash = ev.newURL.slice(ev.newURL.indexOf("#") + 1); if (browserSupportsHistoryApi()) { history.replaceState(hash, "", "?search=#" + hash); @@ -331,8 +346,7 @@ function getSearchElement() { displayHelp(false, ev, help); } else if (hasClass(search, "hidden") === false) { ev.preventDefault(); - addClass(search, "hidden"); - removeClass(main, "hidden"); + hideSearchResults(search); document.title = titleBeforeSearch; } defocusSearchBar(); @@ -390,8 +404,8 @@ function getSearchElement() { return null; } - document.onkeypress = handleShortcut; - document.onkeydown = handleShortcut; + document.addEventListener("keypress", handleShortcut); + document.addEventListener("keydown", handleShortcut); var handleSourceHighlight = (function() { var prev_line_id = 0; @@ -430,7 +444,7 @@ function getSearchElement() { } })(); - document.onclick = function(ev) { + document.addEventListener("click", function(ev) { if (hasClass(ev.target, "collapse-toggle")) { collapseDocs(ev.target, "toggle"); } else if (hasClass(ev.target.parentNode, "collapse-toggle")) { @@ -452,7 +466,7 @@ function getSearchElement() { expandSection(a.hash.replace(/^#/, "")); } } - }; + }); var x = document.getElementsByClassName("version-selector"); if (x.length > 0) { @@ -1264,8 +1278,7 @@ function getSearchElement() { } dst = dst[0]; if (window.location.pathname === dst.pathname) { - addClass(getSearchElement(), "hidden"); - removeClass(main, "hidden"); + hideSearchResults(); document.location.href = dst.href; } }; @@ -1340,8 +1353,6 @@ function getSearchElement() { e.preventDefault(); } else if (e.which === 16) { // shift // Does nothing, it's just to avoid losing "focus" on the highlighted element. - } else if (e.which === 27) { // escape - handleEscape(e); } else if (actives[currentTab].length > 0) { removeClass(actives[currentTab][0], "highlighted"); } @@ -1491,10 +1502,9 @@ function getSearchElement() { "
    " + ret_others[0] + ret_in_args[0] + ret_returned[0] + "
    "; - addClass(main, "hidden"); var search = getSearchElement(); - removeClass(search, "hidden"); search.innerHTML = output; + showSearchResults(search); var tds = search.getElementsByTagName("td"); var td_width = 0; if (tds.length > 0) { @@ -1699,13 +1709,7 @@ function getSearchElement() { if (browserSupportsHistoryApi()) { history.replaceState("", window.currentCrate + " - Rust", "?search="); } - if (hasClass(main, "content")) { - removeClass(main, "hidden"); - } - var search_c = getSearchElement(); - if (hasClass(search_c, "content")) { - addClass(search_c, "hidden"); - } + hideSearchResults(); } else { searchTimeout = setTimeout(search, 500); } @@ -1718,6 +1722,10 @@ function getSearchElement() { search(); }; search_input.onchange = function(e) { + if (e.target !== document.activeElement) { + // To prevent doing anything when it's from a blur event. + return; + } // Do NOT e.preventDefault() here. It will prevent pasting. clearTimeout(searchTimeout); // zero-timeout necessary here because at the time of event handler execution the @@ -1741,19 +1749,8 @@ function getSearchElement() { // Store the previous so we can revert back to it later. var previousTitle = document.title; - window.onpopstate = function(e) { + window.addEventListener("popstate", function(e) { var params = getQueryStringParams(); - // When browsing back from search results the main page - // visibility must be reset. - if (!params.search) { - if (hasClass(main, "content")) { - removeClass(main, "hidden"); - } - var search_c = getSearchElement(); - if (hasClass(search_c, "content")) { - addClass(search_c, "hidden"); - } - } // Revert to the previous title manually since the History // API ignores the title parameter. document.title = previousTitle; @@ -1765,18 +1762,21 @@ function getSearchElement() { // perform the search. This will empty the bar if there's // nothing there, which lets you really go back to a // previous state with nothing in the bar. - if (params.search) { + if (params.search && params.search.length > 0) { search_input.value = params.search; + // Some browsers fire "onpopstate" for every page load + // (Chrome), while others fire the event only when actually + // popping a state (Firefox), which is why search() is + // called both here and at the end of the startSearch() + // function. + search(e); } else { search_input.value = ""; + // When browsing back from search results the main page + // visibility must be reset. + hideSearchResults(); } - // Some browsers fire "onpopstate" for every page load - // (Chrome), while others fire the event only when actually - // popping a state (Firefox), which is why search() is - // called both here and at the end of the startSearch() - // function. - search(); - }; + }); } search(); } @@ -1895,6 +1895,24 @@ function getSearchElement() { var implementors = document.getElementById("implementors-list"); var synthetic_implementors = document.getElementById("synthetic-implementors-list"); + if (synthetic_implementors) { + // This `inlined_types` variable is used to avoid having the same implementation + // showing up twice. For example "String" in the "Sync" doc page. + // + // By the way, this is only used by and useful for traits implemented automatically + // (like "Send" and "Sync"). + var inlined_types = new Set(); + onEachLazy(synthetic_implementors.getElementsByClassName("impl"), function(el) { + var aliases = el.getAttribute("aliases"); + if (!aliases) { + return; + } + aliases.split(",").forEach(function(alias) { + inlined_types.add(alias); + }); + }); + } + var libs = Object.getOwnPropertyNames(imp); var llength = libs.length; for (var i = 0; i < llength; ++i) { @@ -1911,10 +1929,10 @@ function getSearchElement() { if (struct.synthetic) { var stlength = struct.types.length; for (var k = 0; k < stlength; k++) { - if (window.inlined_types.has(struct.types[k])) { + if (inlined_types.has(struct.types[k])) { continue struct_loop; } - window.inlined_types.add(struct.types[k]); + inlined_types.add(struct.types[k]); } } @@ -2522,9 +2540,9 @@ function getSearchElement() { } function putBackSearch(search_input) { - if (search_input.value !== "") { - addClass(main, "hidden"); - removeClass(getSearchElement(), "hidden"); + var search = getSearchElement(); + if (search_input.value !== "" && hasClass(search, "hidden")) { + showSearchResults(search); if (browserSupportsHistoryApi()) { history.replaceState(search_input.value, "", @@ -2541,10 +2559,9 @@ function getSearchElement() { var params = getQueryStringParams(); if (params && params.search) { - addClass(main, "hidden"); var search = getSearchElement(); - removeClass(search, "hidden"); search.innerHTML = "<h3 style=\"text-align: center;\">Loading search results...</h3>"; + showSearchResults(search); } var sidebar_menu = document.getElementsByClassName("sidebar-menu")[0]; @@ -2664,8 +2681,8 @@ function getSearchElement() { "Accepted types are: <code>fn</code>, <code>mod</code>, <code>struct</code>, \ <code>enum</code>, <code>trait</code>, <code>type</code>, <code>macro</code>, \ and <code>const</code>.", - "Search functions by type signature (e.g., <code>vec -> usize</code> or \ - <code>* -> vec</code>)", + "Search functions by type signature (e.g., <code>vec -> usize</code> or \ + <code>* -> vec</code>)", "Search multiple things at once by splitting your query with comma (e.g., \ <code>str,u8</code> or <code>String,struct:Vec,test</code>)", "You can look for items with an exact name by putting double quotes around \ diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css index 62fe23029d..a91fdb7a10 100644 --- a/src/librustdoc/html/static/rustdoc.css +++ b/src/librustdoc/html/static/rustdoc.css @@ -542,11 +542,11 @@ h4 > code, h3 > code, .invisible > code { } .content .stability::before { - content: '˪'; - font-size: 30px; + content: '⬑'; + font-size: 25px; position: absolute; - top: -9px; - left: -13px; + top: -6px; + left: -19px; } .content .impl-items .method, .content .impl-items > .type, .impl-items > .associatedconstant { diff --git a/src/librustdoc/html/static/themes/dark.css b/src/librustdoc/html/static/themes/dark.css index f46bd6d6a1..9a0e7bbabc 100644 --- a/src/librustdoc/html/static/themes/dark.css +++ b/src/librustdoc/html/static/themes/dark.css @@ -105,6 +105,8 @@ pre { .content .highlighted.primitive { background-color: #00708a; } .content .highlighted.keyword { background-color: #884719; } +.content .stability::before { color: #ccc; } + .content span.enum, .content a.enum, .block a.current.enum { color: #82b089; } .content span.struct, .content a.struct, .block a.current.struct { color: #2dbfb8; } .content span.type, .content a.type, .block a.current.type { color: #ff7f00; } diff --git a/src/librustdoc/html/static/themes/light.css b/src/librustdoc/html/static/themes/light.css index ca67b1c1f8..ca8ea1c456 100644 --- a/src/librustdoc/html/static/themes/light.css +++ b/src/librustdoc/html/static/themes/light.css @@ -105,6 +105,8 @@ pre { .content .highlighted.primitive { background-color: #9aecff; } .content .highlighted.keyword { background-color: #f99650; } +.content .stability::before { color: #ccc; } + .content span.enum, .content a.enum, .block a.current.enum { color: #508157; } .content span.struct, .content a.struct, .block a.current.struct { color: #ad448e; } .content span.type, .content a.type, .block a.current.type { color: #ba5d00; } diff --git a/src/librustdoc/html/toc.rs b/src/librustdoc/html/toc.rs index 0fb2f8dd79..034fb27300 100644 --- a/src/librustdoc/html/toc.rs +++ b/src/librustdoc/html/toc.rs @@ -16,7 +16,7 @@ pub struct Toc { /// ### A /// ## B /// ``` - entries: Vec<TocEntry> + entries: Vec<TocEntry>, } impl Toc { @@ -46,7 +46,7 @@ pub struct TocBuilder { /// it is the most recent one). /// /// We also have `chain[0].level <= top_level.entries[last]`. - chain: Vec<TocEntry> + chain: Vec<TocEntry>, } impl TocBuilder { @@ -54,7 +54,6 @@ impl TocBuilder { TocBuilder { top_level: Toc { entries: Vec::new() }, chain: Vec::new() } } - /// Converts into a true `Toc` struct. pub fn into_toc(mut self) -> Toc { // we know all levels are >= 1. @@ -100,14 +99,14 @@ impl TocBuilder { // this is the parent we want, so return it to // its rightful place. self.chain.push(next); - return + return; } else { this = Some(next); } } None => { this.map(|e| self.top_level.entries.push(e)); - return + return; } } } @@ -152,7 +151,7 @@ impl TocBuilder { name, sec_number, id, - children: Toc { entries: Vec::new() } + children: Toc { entries: Vec::new() }, }); // get the thing we just pushed, so we can borrow the string @@ -167,9 +166,12 @@ impl Toc { v.push_str("<ul>"); for entry in &self.entries { // recursively format this table of contents - v.push_str(&format!("\n<li><a href=\"#{id}\">{num} {name}</a>", - id = entry.id, - num = entry.sec_number, name = entry.name)); + v.push_str(&format!( + "\n<li><a href=\"#{id}\">{num} {name}</a>", + id = entry.id, + num = entry.sec_number, + name = entry.name + )); entry.children.print_inner(&mut *v); v.push_str("</li>"); } diff --git a/src/librustdoc/html/toc/tests.rs b/src/librustdoc/html/toc/tests.rs index ef69ada466..014f346862 100644 --- a/src/librustdoc/html/toc/tests.rs +++ b/src/librustdoc/html/toc/tests.rs @@ -1,4 +1,4 @@ -use super::{TocBuilder, Toc, TocEntry}; +use super::{Toc, TocBuilder, TocEntry}; #[test] fn builder_smoke() { @@ -9,11 +9,8 @@ fn builder_smoke() { // there's been no macro mistake. macro_rules! push { ($level: expr, $name: expr) => { - assert_eq!(builder.push($level, - $name.to_string(), - "".to_string()), - $name); - } + assert_eq!(builder.push($level, $name.to_string(), "".to_string()), $name); + }; } push!(2, "0.1"); push!(1, "1"); @@ -61,20 +58,22 @@ fn builder_smoke() { } } let expected = toc!( - (2, "0.1", ), - - (1, "1", - ((2, "1.1", ((3, "1.1.1", )) ((3, "1.1.2", )))) - ((2, "1.2", ((3, "1.2.1", )) ((3, "1.2.2", )))) - ), - - (1, "2", ), - - (1, "3", - ((4, "3.0.0.1", ((6, "3.0.0.1.0.1", )))) - ((4, "3.0.0.2", )) - ((2, "3.1", ((4, "3.1.0.1", )))) - ) - ); + (2, "0.1",), + ( + 1, + "1", + ((2, "1.1", ((3, "1.1.1",))((3, "1.1.2",))))(( + 2, + "1.2", + ((3, "1.2.1",))((3, "1.2.2",)) + )) + ), + (1, "2",), + ( + 1, + "3", + ((4, "3.0.0.1", ((6, "3.0.0.1.0.1",))))((4, "3.0.0.2",))((2, "3.1", ((4, "3.1.0.1",)))) + ) + ); assert_eq!(expected, builder.into_toc()); } diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 0a71deca0d..403c8d0160 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -13,7 +13,6 @@ #![feature(vec_remove_item)] #![feature(ptr_offset_from)] #![feature(crate_visibility_modifier)] -#![feature(const_fn)] #![feature(drain_filter)] #![feature(never_type)] #![feature(unicode_internals)] @@ -24,24 +23,26 @@ extern crate getopts; extern crate rustc; extern crate rustc_data_structures; extern crate rustc_driver; -extern crate rustc_error_codes; +extern crate rustc_errors; +extern crate rustc_expand; extern crate rustc_feature; +extern crate rustc_hir; extern crate rustc_index; extern crate rustc_interface; extern crate rustc_lexer; extern crate rustc_lint; extern crate rustc_metadata; +extern crate rustc_mir; extern crate rustc_parse; extern crate rustc_resolve; +extern crate rustc_session; +extern crate rustc_span as rustc_span; extern crate rustc_target; extern crate rustc_typeck; extern crate syntax; -extern crate syntax_expand; -extern crate syntax_pos; extern crate test as testing; #[macro_use] extern crate log; -extern crate rustc_errors as errors; use std::default::Default; use std::env; @@ -448,12 +449,7 @@ fn main_args(args: &[String]) -> i32 { } fn main_options(options: config::Options) -> i32 { - let diag = core::new_handler( - options.error_format, - None, - options.debugging_options.treat_err_as_bug, - options.debugging_options.ui_testing, - ); + let diag = core::new_handler(options.error_format, None, &options.debugging_options); match (options.should_test, options.markdown_input()) { (true, true) => return markdown::test(options, &diag), @@ -466,12 +462,7 @@ fn main_options(options: config::Options) -> i32 { // need to move these items separately because we lose them by the time the closure is called, // but we can't crates the Handler ahead of time because it's not Send - let diag_opts = ( - options.error_format, - options.debugging_options.treat_err_as_bug, - options.debugging_options.ui_testing, - options.edition, - ); + let diag_opts = (options.error_format, options.edition, options.debugging_options.clone()); let show_coverage = options.show_coverage; rust_input(options, move |out| { if show_coverage { @@ -482,8 +473,8 @@ fn main_options(options: config::Options) -> i32 { let Output { krate, renderinfo, renderopts } = out; info!("going to format"); - let (error_format, treat_err_as_bug, ui_testing, edition) = diag_opts; - let diag = core::new_handler(error_format, None, treat_err_as_bug, ui_testing); + let (error_format, edition, debugging_options) = diag_opts; + let diag = core::new_handler(error_format, None, &debugging_options); match html::render::run(krate, renderopts, renderinfo, &diag, edition) { Ok(_) => rustc_driver::EXIT_SUCCESS, Err(e) => { @@ -527,6 +518,6 @@ where match result { Ok(output) => output, - Err(_) => panic::resume_unwind(Box::new(errors::FatalErrorMarker)), + Err(_) => panic::resume_unwind(Box::new(rustc_errors::FatalErrorMarker)), } } diff --git a/src/librustdoc/markdown.rs b/src/librustdoc/markdown.rs index 7dc3df23a6..912a40722b 100644 --- a/src/librustdoc/markdown.rs +++ b/src/librustdoc/markdown.rs @@ -2,18 +2,17 @@ use std::fs::File; use std::io::prelude::*; use std::path::PathBuf; -use errors; -use testing; -use syntax::edition::Edition; -use syntax::source_map::DUMMY_SP; use rustc_feature::UnstableFeatures; +use rustc_span::edition::Edition; +use rustc_span::source_map::DUMMY_SP; +use testing; -use crate::externalfiles::{LoadStringError, load_string}; use crate::config::{Options, RenderOptions}; +use crate::externalfiles::{load_string, LoadStringError}; use crate::html::escape::Escape; use crate::html::markdown; -use crate::html::markdown::{ErrorCodes, IdMap, Markdown, MarkdownWithToc, find_testable_code}; -use crate::test::{TestOptions, Collector}; +use crate::html::markdown::{find_testable_code, ErrorCodes, IdMap, Markdown, MarkdownWithToc}; +use crate::test::{Collector, TestOptions}; /// Separate any lines at the start of the file that begin with `# ` or `%`. fn extract_leading_metadata(s: &str) -> (Vec<&str>, &str) { @@ -39,8 +38,8 @@ fn extract_leading_metadata(s: &str) -> (Vec<&str>, &str) { pub fn render( input: PathBuf, options: RenderOptions, - diag: &errors::Handler, - edition: Edition + diag: &rustc_errors::Handler, + edition: Edition, ) -> i32 { let mut output = options.output; output.push(input.file_name().unwrap()); @@ -57,12 +56,8 @@ pub fn render( Err(LoadStringError::ReadFail) => return 1, Err(LoadStringError::BadUtf8) => return 2, }; - let playground_url = options.markdown_playground_url - .or(options.playground_url); - let playground = playground_url.map(|url| markdown::Playground { - crate_name: None, - url, - }); + let playground_url = options.markdown_playground_url.or(options.playground_url); + let playground = playground_url.map(|url| markdown::Playground { crate_name: None, url }); let mut out = match File::create(&output) { Err(e) => { @@ -132,7 +127,7 @@ pub fn render( } /// Runs any tests/code examples in the markdown file `input`. -pub fn test(mut options: Options, diag: &errors::Handler) -> i32 { +pub fn test(mut options: Options, diag: &rustc_errors::Handler) -> i32 { let input_str = match load_string(&options.input, diag) { Ok(s) => s, Err(LoadStringError::ReadFail) => return 1, @@ -142,16 +137,25 @@ pub fn test(mut options: Options, diag: &errors::Handler) -> i32 { let mut opts = TestOptions::default(); opts.no_crate_inject = true; opts.display_warnings = options.display_warnings; - let mut collector = Collector::new(options.input.display().to_string(), options.clone(), - true, opts, None, Some(options.input), - options.enable_per_target_ignores); + let mut collector = Collector::new( + options.input.display().to_string(), + options.clone(), + true, + opts, + None, + Some(options.input), + options.enable_per_target_ignores, + ); collector.set_position(DUMMY_SP); let codes = ErrorCodes::from(UnstableFeatures::from_environment().is_nightly_build()); find_testable_code(&input_str, &mut collector, codes, options.enable_per_target_ignores); options.test_args.insert(0, "rustdoctest".to_string()); - testing::test_main(&options.test_args, collector.tests, - Some(testing::Options::new().display_output(options.display_warnings))); + testing::test_main( + &options.test_args, + collector.tests, + Some(testing::Options::new().display_output(options.display_warnings)), + ); 0 } diff --git a/src/librustdoc/passes/calculate_doc_coverage.rs b/src/librustdoc/passes/calculate_doc_coverage.rs index 72f98026f8..7ed531c920 100644 --- a/src/librustdoc/passes/calculate_doc_coverage.rs +++ b/src/librustdoc/passes/calculate_doc_coverage.rs @@ -3,9 +3,9 @@ use crate::core::DocContext; use crate::fold::{self, DocFolder}; use crate::passes::Pass; +use rustc_span::symbol::sym; +use rustc_span::FileName; use syntax::attr; -use syntax::symbol::sym; -use syntax_pos::FileName; use std::collections::BTreeMap; use std::ops; diff --git a/src/librustdoc/passes/check_code_block_syntax.rs b/src/librustdoc/passes/check_code_block_syntax.rs index 3cb3a8003c..2903fd9dcd 100644 --- a/src/librustdoc/passes/check_code_block_syntax.rs +++ b/src/librustdoc/passes/check_code_block_syntax.rs @@ -1,9 +1,10 @@ -use errors::Applicability; +use rustc_data_structures::sync::{Lock, Lrc}; +use rustc_errors::{emitter::Emitter, Applicability, Diagnostic, Handler}; use rustc_parse::lexer::StringReader as Lexer; +use rustc_span::source_map::{FilePathMapping, SourceMap}; +use rustc_span::{FileName, InnerSpan}; use syntax::sess::ParseSess; -use syntax::source_map::FilePathMapping; use syntax::token; -use syntax_pos::{FileName, InnerSpan}; use crate::clean; use crate::core::DocContext; @@ -27,13 +28,19 @@ struct SyntaxChecker<'a, 'tcx> { impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> { fn check_rust_syntax(&self, item: &clean::Item, dox: &str, code_block: RustCodeBlock) { - let sess = ParseSess::new(FilePathMapping::empty()); + let buffered_messages = Lrc::new(Lock::new(vec![])); + + let emitter = BufferEmitter { messages: Lrc::clone(&buffered_messages) }; + + let cm = Lrc::new(SourceMap::new(FilePathMapping::empty())); + let handler = Handler::with_emitter(false, None, Box::new(emitter)); + let sess = ParseSess::with_span_handler(handler, cm); let source_file = sess.source_map().new_source_file( FileName::Custom(String::from("doctest")), dox[code_block.code].to_owned(), ); - let validation_status = { + let validation_status = rustc_driver::catch_fatal_errors(|| { let mut has_syntax_errors = false; let mut only_whitespace = true; // even if there is a syntax error, we need to run the lexer over the whole file @@ -54,7 +61,8 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> { } else { None } - }; + }) + .unwrap_or(Some(CodeBlockInvalid::SyntaxError)); if let Some(code_block_invalid) = validation_status { let mut diag = if let Some(sp) = @@ -93,6 +101,11 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> { diag }; + // FIXME(#67563): Provide more context for these errors by displaying the spans inline. + for message in buffered_messages.borrow().iter() { + diag.note(&message); + } + diag.emit(); } } @@ -110,6 +123,20 @@ impl<'a, 'tcx> DocFolder for SyntaxChecker<'a, 'tcx> { } } +struct BufferEmitter { + messages: Lrc<Lock<Vec<String>>>, +} + +impl Emitter for BufferEmitter { + fn emit_diagnostic(&mut self, diag: &Diagnostic) { + self.messages.borrow_mut().push(format!("error from rustc: {}", diag.message[0].0)); + } + + fn source_map(&self) -> Option<&Lrc<SourceMap>> { + None + } +} + enum CodeBlockInvalid { SyntaxError, Empty, diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index a92a6152c7..50d5f70f48 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -1,20 +1,20 @@ -use errors::Applicability; -use rustc::hir; -use rustc::hir::def::{ +use rustc::lint; +use rustc::ty; +use rustc_errors::Applicability; +use rustc_expand::base::SyntaxExtensionKind; +use rustc_feature::UnstableFeatures; +use rustc_hir as hir; +use rustc_hir::def::{ DefKind, Namespace::{self, *}, PerNS, Res, }; -use rustc::hir::def_id::DefId; -use rustc::lint; -use rustc::ty; -use rustc_feature::UnstableFeatures; +use rustc_hir::def_id::DefId; use rustc_resolve::ParentScope; +use rustc_span::symbol::Symbol; +use rustc_span::DUMMY_SP; use syntax; use syntax::ast::{self, Ident}; -use syntax::symbol::Symbol; -use syntax_expand::base::SyntaxExtensionKind; -use syntax_pos::DUMMY_SP; use std::ops::Range; diff --git a/src/librustdoc/passes/collect_trait_impls.rs b/src/librustdoc/passes/collect_trait_impls.rs index bec352fe15..da0e97f107 100644 --- a/src/librustdoc/passes/collect_trait_impls.rs +++ b/src/librustdoc/passes/collect_trait_impls.rs @@ -3,9 +3,9 @@ use crate::clean::*; use crate::core::DocContext; use crate::fold::DocFolder; -use rustc::hir::def_id::{DefId, LOCAL_CRATE}; -use rustc::util::nodemap::FxHashSet; -use syntax::symbol::sym; +use rustc_data_structures::fx::FxHashSet; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; +use rustc_span::symbol::sym; pub const COLLECT_TRAIT_IMPLS: Pass = Pass { name: "collect-trait-impls", diff --git a/src/librustdoc/passes/mod.rs b/src/librustdoc/passes/mod.rs index 985aaa66b3..355ea15223 100644 --- a/src/librustdoc/passes/mod.rs +++ b/src/librustdoc/passes/mod.rs @@ -1,13 +1,12 @@ //! Contains information about "passes", used to modify crate information during the documentation //! process. -use rustc::hir::def_id::DefId; use rustc::lint; use rustc::middle::privacy::AccessLevels; -use rustc::util::nodemap::DefIdSet; +use rustc_hir::def_id::{DefId, DefIdSet}; +use rustc_span::{InnerSpan, Span, DUMMY_SP}; use std::mem; use std::ops::Range; -use syntax_pos::{InnerSpan, Span, DUMMY_SP}; use self::Condition::*; use crate::clean::{self, GetDefId, Item}; diff --git a/src/librustdoc/passes/strip_hidden.rs b/src/librustdoc/passes/strip_hidden.rs index 2b4de3c063..f82e72b488 100644 --- a/src/librustdoc/passes/strip_hidden.rs +++ b/src/librustdoc/passes/strip_hidden.rs @@ -1,6 +1,6 @@ -use rustc::util::nodemap::DefIdSet; +use rustc_hir::def_id::DefIdSet; +use rustc_span::symbol::sym; use std::mem; -use syntax::symbol::sym; use crate::clean::Item; use crate::clean::{self, AttributesExt, NestedAttributesExt}; diff --git a/src/librustdoc/passes/strip_private.rs b/src/librustdoc/passes/strip_private.rs index e0379d7ffe..f244956e50 100644 --- a/src/librustdoc/passes/strip_private.rs +++ b/src/librustdoc/passes/strip_private.rs @@ -1,4 +1,4 @@ -use rustc::util::nodemap::DefIdSet; +use rustc_hir::def_id::DefIdSet; use crate::clean; use crate::core::DocContext; diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index 5fd7ab0322..d89dc2adaf 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -1,29 +1,30 @@ +use rustc::hir::map::Map; +use rustc::session::{self, config, DiagnosticOutput}; +use rustc::util::common::ErrorReported; use rustc_data_structures::sync::Lrc; use rustc_feature::UnstableFeatures; +use rustc_hir as hir; +use rustc_hir::intravisit; use rustc_interface::interface; +use rustc_span::edition::Edition; +use rustc_span::source_map::SourceMap; +use rustc_span::symbol::sym; +use rustc_span::{BytePos, FileName, Pos, Span, DUMMY_SP}; use rustc_target::spec::TargetTriple; -use rustc::hir; -use rustc::hir::intravisit; -use rustc::session::{self, config, DiagnosticOutput}; -use rustc::util::common::ErrorReported; -use syntax::ast; -use syntax::with_globals; -use syntax::source_map::SourceMap; -use syntax::edition::Edition; use std::env; use std::io::{self, Write}; use std::panic; use std::path::PathBuf; use std::process::{self, Command, Stdio}; use std::str; -use syntax::symbol::sym; -use syntax_pos::{BytePos, DUMMY_SP, Pos, Span, FileName}; +use syntax::ast; +use syntax::with_globals; use tempfile::Builder as TempFileBuilder; use testing; use crate::clean::Attributes; use crate::config::Options; -use crate::html::markdown::{self, ErrorCodes, LangString, Ignore}; +use crate::html::markdown::{self, ErrorCodes, Ignore, LangString}; #[derive(Clone, Default)] pub struct TestOptions { @@ -42,7 +43,7 @@ pub fn run(options: Options) -> i32 { let crate_types = if options.proc_macro_crate { vec![config::CrateType::ProcMacro] } else { - vec![config::CrateType::Dylib] + vec![config::CrateType::Rlib] }; let sessopts = config::Options { @@ -54,9 +55,7 @@ pub fn run(options: Options) -> i32 { unstable_features: UnstableFeatures::from_environment(), lint_cap: Some(::rustc::lint::Level::Allow), actually_rustdoc: true, - debugging_opts: config::DebuggingOptions { - ..config::basic_debugging_options() - }, + debugging_opts: config::DebuggingOptions { ..config::basic_debugging_options() }, edition: options.edition, target_triple: options.target.clone(), ..config::Options::default() @@ -85,64 +84,71 @@ pub fn run(options: Options) -> i32 { let mut test_args = options.test_args.clone(); let display_warnings = options.display_warnings; - let tests = interface::run_compiler(config, |compiler| compiler.enter(|queries| { - let lower_to_hir = queries.lower_to_hir()?; - - let mut opts = scrape_test_config(lower_to_hir.peek().0.krate()); - opts.display_warnings |= options.display_warnings; - let enable_per_target_ignores = options.enable_per_target_ignores; - let mut collector = Collector::new( - queries.crate_name()?.peek().to_string(), - options, - false, - opts, - Some(compiler.source_map().clone()), - None, - enable_per_target_ignores, - ); - - let mut global_ctxt = queries.global_ctxt()?.take(); - - global_ctxt.enter(|tcx| { - let krate = tcx.hir().krate(); - let mut hir_collector = HirCollector { - sess: compiler.session(), - collector: &mut collector, - map: tcx.hir(), - codes: ErrorCodes::from(compiler.session().opts - .unstable_features.is_nightly_build()), - }; - hir_collector.visit_testable("".to_string(), &krate.attrs, |this| { - intravisit::walk_crate(this, krate); + let tests = interface::run_compiler(config, |compiler| { + compiler.enter(|queries| { + let lower_to_hir = queries.lower_to_hir()?; + + let mut opts = scrape_test_config(lower_to_hir.peek().0.krate()); + opts.display_warnings |= options.display_warnings; + let enable_per_target_ignores = options.enable_per_target_ignores; + let mut collector = Collector::new( + queries.crate_name()?.peek().to_string(), + options, + false, + opts, + Some(compiler.source_map().clone()), + None, + enable_per_target_ignores, + ); + + let mut global_ctxt = queries.global_ctxt()?.take(); + + global_ctxt.enter(|tcx| { + let krate = tcx.hir().krate(); + let mut hir_collector = HirCollector { + sess: compiler.session(), + collector: &mut collector, + map: tcx.hir(), + codes: ErrorCodes::from( + compiler.session().opts.unstable_features.is_nightly_build(), + ), + }; + hir_collector.visit_testable("".to_string(), &krate.attrs, |this| { + intravisit::walk_crate(this, krate); + }); }); - }); + compiler.session().abort_if_errors(); - let ret : Result<_, ErrorReported> = Ok(collector.tests); - ret - })).expect("compiler aborted in rustdoc!"); + let ret: Result<_, ErrorReported> = Ok(collector.tests); + ret + }) + }); + let tests = match tests { + Ok(tests) => tests, + Err(ErrorReported) => return 1, + }; test_args.insert(0, "rustdoctest".to_string()); testing::test_main( &test_args, tests, - Some(testing::Options::new().display_output(display_warnings)) + Some(testing::Options::new().display_output(display_warnings)), ); 0 } // Look for `#![doc(test(no_crate_inject))]`, used by crates in the std facade. -fn scrape_test_config(krate: &::rustc::hir::Crate) -> TestOptions { +fn scrape_test_config(krate: &::rustc_hir::Crate) -> TestOptions { use syntax::print::pprust; - let mut opts = TestOptions { - no_crate_inject: false, - display_warnings: false, - attrs: Vec::new(), - }; + let mut opts = + TestOptions { no_crate_inject: false, display_warnings: false, attrs: Vec::new() }; - let test_attrs: Vec<_> = krate.attrs.iter() + let test_attrs: Vec<_> = krate + .attrs + .iter() .filter(|a| a.check_name(sym::doc)) .flat_map(|a| a.meta_item_list().unwrap_or_else(Vec::new)) .filter(|a| a.check_name(sym::test)) @@ -201,17 +207,7 @@ fn run_test( opts: &TestOptions, edition: Edition, ) -> Result<(), TestFailure> { - let (test, line_offset) = match panic::catch_unwind(|| { - make_test(test, Some(cratename), as_test_harness, opts, edition) - }) { - Ok((test, line_offset)) => (test, line_offset), - Err(cause) if cause.is::<errors::FatalErrorMarker>() => { - // If the parser used by `make_test` panicked due to a fatal error, pass the test code - // through unchanged. The error will be reported during compilation. - (test.to_owned(), 0) - }, - Err(cause) => panic::resume_unwind(cause), - }; + let (test, line_offset) = make_test(test, Some(cratename), as_test_harness, opts, edition); // FIXME(#44940): if doctests ever support path remapping, then this filename // needs to be the result of `SourceMap::span_to_unmapped_path`. @@ -235,30 +231,29 @@ fn run_test( } let outdir = if let Some(mut path) = options.persist_doctests { - path.push(format!("{}_{}", - filename - .to_string() - .rsplit('/') - .next() - .unwrap() - .replace(".", "_"), - line) - ); - std::fs::create_dir_all(&path) - .expect("Couldn't create directory for doctest executables"); + path.push(format!( + "{}_{}", + filename.to_string().rsplit('/').next().unwrap().replace(".", "_"), + line + )); + std::fs::create_dir_all(&path).expect("Couldn't create directory for doctest executables"); DirState::Perm(path) } else { - DirState::Temp(TempFileBuilder::new() - .prefix("rustdoctest") - .tempdir() - .expect("rustdoc needs a tempdir")) + DirState::Temp( + TempFileBuilder::new() + .prefix("rustdoctest") + .tempdir() + .expect("rustdoc needs a tempdir"), + ) }; let output_file = outdir.path().join("rust_out"); - let rustc_binary = options.test_builder.as_ref().map(|v| &**v).unwrap_or_else(|| { - rustc_interface::util::rustc_path().expect("found rustc") - }); + let rustc_binary = options + .test_builder + .as_ref() + .map(|v| &**v) + .unwrap_or_else(|| rustc_interface::util::rustc_path().expect("found rustc")); let mut compiler = Command::new(&rustc_binary); compiler.arg("--crate-type").arg("bin"); for cfg in &options.cfgs { @@ -269,8 +264,7 @@ fn run_test( } compiler.arg("--edition").arg(&edition.to_string()); compiler.env("UNSTABLE_RUSTDOC_TEST_PATH", path); - compiler.env("UNSTABLE_RUSTDOC_TEST_LINE", - format!("{}", line as isize - line_offset as isize)); + compiler.env("UNSTABLE_RUSTDOC_TEST_LINE", format!("{}", line as isize - line_offset as isize)); compiler.arg("-o").arg(&output_file); if as_test_harness { compiler.arg("--test"); @@ -307,10 +301,9 @@ fn run_test( struct Bomb<'a>(&'a str); impl Drop for Bomb<'_> { fn drop(&mut self) { - eprint!("{}",self.0); + eprint!("{}", self.0); } } - let out = str::from_utf8(&output.stderr).unwrap(); let _bomb = Bomb(&out); match (output.status.success(), compile_fail) { @@ -320,7 +313,7 @@ fn run_test( (true, false) => {} (false, true) => { if !error_codes.is_empty() { - error_codes.retain(|err| !out.contains(err)); + error_codes.retain(|err| !out.contains(&format!("error[{}]: ", err))); if !error_codes.is_empty() { return Err(TestFailure::MissingErrorCodes(error_codes)); @@ -363,17 +356,13 @@ fn run_test( /// Transforms a test into code that can be compiled into a Rust binary, and returns the number of /// lines before the test code begins. -/// -/// # Panics -/// -/// This function uses the compiler's parser internally. The parser will panic if it encounters a -/// fatal error while parsing the test. -pub fn make_test(s: &str, - cratename: Option<&str>, - dont_insert_main: bool, - opts: &TestOptions, - edition: Edition) - -> (String, usize) { +pub fn make_test( + s: &str, + cratename: Option<&str>, + dont_insert_main: bool, + opts: &TestOptions, + edition: Edition, +) -> (String, usize) { let (crate_attrs, everything_else, crates) = partition_source(s); let everything_else = everything_else.trim(); let mut line_offset = 0; @@ -401,82 +390,94 @@ pub fn make_test(s: &str, // Uses libsyntax to parse the doctest and find if there's a main fn and the extern // crate already is included. - let (already_has_main, already_has_extern_crate, found_macro) = with_globals(edition, || { - use crate::syntax::{sess::ParseSess, source_map::FilePathMapping}; - use rustc_parse::maybe_new_parser_from_source_str; - use errors::emitter::EmitterWriter; - use errors::Handler; - - let filename = FileName::anon_source_code(s); - let source = crates + &everything_else; - - // Any errors in parsing should also appear when the doctest is compiled for real, so just - // send all the errors that libsyntax emits directly into a `Sink` instead of stderr. - let cm = Lrc::new(SourceMap::new(FilePathMapping::empty())); - let emitter = EmitterWriter::new(box io::sink(), None, false, false, false, None, false); - // FIXME(misdreavus): pass `-Z treat-err-as-bug` to the doctest parser - let handler = Handler::with_emitter(false, None, box emitter); - let sess = ParseSess::with_span_handler(handler, cm); - - let mut found_main = false; - let mut found_extern_crate = cratename.is_none(); - let mut found_macro = false; - - let mut parser = match maybe_new_parser_from_source_str(&sess, filename, source) { - Ok(p) => p, - Err(errs) => { - for mut err in errs { - err.cancel(); - } + let result = rustc_driver::catch_fatal_errors(|| { + with_globals(edition, || { + use rustc_errors::emitter::EmitterWriter; + use rustc_errors::Handler; + use rustc_parse::maybe_new_parser_from_source_str; + use rustc_span::source_map::FilePathMapping; + use syntax::sess::ParseSess; + + let filename = FileName::anon_source_code(s); + let source = crates + &everything_else; + + // Any errors in parsing should also appear when the doctest is compiled for real, so just + // send all the errors that libsyntax emits directly into a `Sink` instead of stderr. + let cm = Lrc::new(SourceMap::new(FilePathMapping::empty())); + let emitter = + EmitterWriter::new(box io::sink(), None, false, false, false, None, false); + // FIXME(misdreavus): pass `-Z treat-err-as-bug` to the doctest parser + let handler = Handler::with_emitter(false, None, box emitter); + let sess = ParseSess::with_span_handler(handler, cm); + + let mut found_main = false; + let mut found_extern_crate = cratename.is_none(); + let mut found_macro = false; + + let mut parser = match maybe_new_parser_from_source_str(&sess, filename, source) { + Ok(p) => p, + Err(errs) => { + for mut err in errs { + err.cancel(); + } - return (found_main, found_extern_crate, found_macro); - } - }; + return (found_main, found_extern_crate, found_macro); + } + }; - loop { - match parser.parse_item() { - Ok(Some(item)) => { - if !found_main { - if let ast::ItemKind::Fn(..) = item.kind { - if item.ident.name == sym::main { - found_main = true; + loop { + match parser.parse_item() { + Ok(Some(item)) => { + if !found_main { + if let ast::ItemKind::Fn(..) = item.kind { + if item.ident.name == sym::main { + found_main = true; + } } } - } - if !found_extern_crate { - if let ast::ItemKind::ExternCrate(original) = item.kind { - // This code will never be reached if `cratename` is none because - // `found_extern_crate` is initialized to `true` if it is none. - let cratename = cratename.unwrap(); + if !found_extern_crate { + if let ast::ItemKind::ExternCrate(original) = item.kind { + // This code will never be reached if `cratename` is none because + // `found_extern_crate` is initialized to `true` if it is none. + let cratename = cratename.unwrap(); - match original { - Some(name) => found_extern_crate = name.as_str() == cratename, - None => found_extern_crate = item.ident.as_str() == cratename, + match original { + Some(name) => found_extern_crate = name.as_str() == cratename, + None => found_extern_crate = item.ident.as_str() == cratename, + } } } - } - if !found_macro { - if let ast::ItemKind::Mac(..) = item.kind { - found_macro = true; + if !found_macro { + if let ast::ItemKind::Mac(..) = item.kind { + found_macro = true; + } } - } - if found_main && found_extern_crate { + if found_main && found_extern_crate { + break; + } + } + Ok(None) => break, + Err(mut e) => { + e.cancel(); break; } } - Ok(None) => break, - Err(mut e) => { - e.cancel(); - break; - } } - } - (found_main, found_extern_crate, found_macro) + (found_main, found_extern_crate, found_macro) + }) }); + let (already_has_main, already_has_extern_crate, found_macro) = match result { + Ok(result) => result, + Err(ErrorReported) => { + // If the parser panicked due to a fatal error, pass the test code through unchanged. + // The error will be reported during compilation. + return (s.to_owned(), 0); + } + }; // If a doctest's `fn main` is being masked by a wrapper macro, the parsing loop above won't // see it. In that case, run the old text-based scan to see if they at least have a main @@ -486,11 +487,7 @@ pub fn make_test(s: &str, s.lines() .map(|line| { let comment = line.find("//"); - if let Some(comment_begins) = comment { - &line[0..comment_begins] - } else { - line - } + if let Some(comment_begins) = comment { &line[0..comment_begins] } else { line } }) .any(|code| code.contains("fn main")) } else { @@ -515,8 +512,10 @@ pub fn make_test(s: &str, } else { let returns_result = everything_else.trim_end().ends_with("(())"); let (main_pre, main_post) = if returns_result { - ("fn main() { fn _inner() -> Result<(), impl core::fmt::Debug> {", - "}\n_inner().unwrap() }") + ( + "fn main() { fn _inner() -> Result<(), impl core::fmt::Debug> {", + "}\n_inner().unwrap() }", + ) } else { ("fn main() {\n", "\n}") }; @@ -549,13 +548,13 @@ fn partition_source(s: &str) -> (String, String, String) { // shunted into "everything else" match state { PartitionState::Attrs => { - state = if trimline.starts_with("#![") || - trimline.chars().all(|c| c.is_whitespace()) || - (trimline.starts_with("//") && !trimline.starts_with("///")) + state = if trimline.starts_with("#![") + || trimline.chars().all(|c| c.is_whitespace()) + || (trimline.starts_with("//") && !trimline.starts_with("///")) { PartitionState::Attrs - } else if trimline.starts_with("extern crate") || - trimline.starts_with("#[macro_use] extern crate") + } else if trimline.starts_with("extern crate") + || trimline.starts_with("#[macro_use] extern crate") { PartitionState::Crates } else { @@ -563,10 +562,10 @@ fn partition_source(s: &str) -> (String, String, String) { }; } PartitionState::Crates => { - state = if trimline.starts_with("extern crate") || - trimline.starts_with("#[macro_use] extern crate") || - trimline.chars().all(|c| c.is_whitespace()) || - (trimline.starts_with("//") && !trimline.starts_with("///")) + state = if trimline.starts_with("extern crate") + || trimline.starts_with("#[macro_use] extern crate") + || trimline.chars().all(|c| c.is_whitespace()) + || (trimline.starts_with("//") && !trimline.starts_with("///")) { PartitionState::Crates } else { @@ -643,9 +642,15 @@ pub struct Collector { } impl Collector { - pub fn new(cratename: String, options: Options, use_headers: bool, opts: TestOptions, - source_map: Option<Lrc<SourceMap>>, filename: Option<PathBuf>, - enable_per_target_ignores: bool) -> Collector { + pub fn new( + cratename: String, + options: Options, + use_headers: bool, + opts: TestOptions, + source_map: Option<Lrc<SourceMap>>, + filename: Option<PathBuf>, + enable_per_target_ignores: bool, + ) -> Collector { Collector { tests: Vec::new(), names: Vec::new(), @@ -703,13 +708,11 @@ impl Tester for Collector { debug!("creating test {}: {}", name, test); self.tests.push(testing::TestDescAndFn { desc: testing::TestDesc { - name: testing::DynTestName(name.clone()), + name: testing::DynTestName(name), ignore: match config.ignore { Ignore::All => true, Ignore::None => false, - Ignore::Some(ref ignores) => { - ignores.iter().any(|s| target_str.contains(s)) - }, + Ignore::Some(ref ignores) => ignores.iter().any(|s| target_str.contains(s)), }, // compiler failures are test failures should_panic: testing::ShouldPanic::No, @@ -810,14 +813,19 @@ impl Tester for Collector { if self.use_headers { // We use these headings as test names, so it's good if // they're valid identifiers. - let name = name.chars().enumerate().map(|(i, c)| { - if (i == 0 && rustc_lexer::is_id_start(c)) || - (i != 0 && rustc_lexer::is_id_continue(c)) { + let name = name + .chars() + .enumerate() + .map(|(i, c)| { + if (i == 0 && rustc_lexer::is_id_start(c)) + || (i != 0 && rustc_lexer::is_id_continue(c)) + { c } else { '_' } - }).collect::<String>(); + }) + .collect::<String>(); // Here we try to efficiently assemble the header titles into the // test name in the form of `h1::h2::h3::h4::h5::h6`. @@ -848,15 +856,17 @@ impl Tester for Collector { struct HirCollector<'a, 'hir> { sess: &'a session::Session, collector: &'a mut Collector, - map: &'a hir::map::Map<'hir>, + map: &'a Map<'hir>, codes: ErrorCodes, } impl<'a, 'hir> HirCollector<'a, 'hir> { - fn visit_testable<F: FnOnce(&mut Self)>(&mut self, - name: String, - attrs: &[ast::Attribute], - nested: F) { + fn visit_testable<F: FnOnce(&mut Self)>( + &mut self, + name: String, + attrs: &[ast::Attribute], + nested: F, + ) { let mut attrs = Attributes::from_ast(self.sess.diagnostic(), attrs); if let Some(ref cfg) = attrs.cfg { if !cfg.matches(&self.sess.parse_sess, Some(&self.sess.features_untracked())) { @@ -875,10 +885,12 @@ impl<'a, 'hir> HirCollector<'a, 'hir> { // anything else, this will combine them for us. if let Some(doc) = attrs.collapsed_doc_value() { self.collector.set_position(attrs.span.unwrap_or(DUMMY_SP)); - markdown::find_testable_code(&doc, - self.collector, - self.codes, - self.collector.enable_per_target_ignores); + markdown::find_testable_code( + &doc, + self.collector, + self.codes, + self.collector.enable_per_target_ignores, + ); } nested(self); @@ -890,13 +902,15 @@ impl<'a, 'hir> HirCollector<'a, 'hir> { } impl<'a, 'hir> intravisit::Visitor<'hir> for HirCollector<'a, 'hir> { - fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'hir> { + type Map = Map<'hir>; + + fn nested_visit_map(&mut self) -> intravisit::NestedVisitorMap<'_, Self::Map> { intravisit::NestedVisitorMap::All(&self.map) } fn visit_item(&mut self, item: &'hir hir::Item) { - let name = if let hir::ItemKind::Impl(.., ref ty, _) = item.kind { - self.map.hir_to_pretty_string(ty.hir_id) + let name = if let hir::ItemKind::Impl { ref self_ty, .. } = item.kind { + self.map.hir_to_pretty_string(self_ty.hir_id) } else { item.ident.to_string() }; @@ -924,10 +938,12 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirCollector<'a, 'hir> { }); } - fn visit_variant(&mut self, - v: &'hir hir::Variant, - g: &'hir hir::Generics, - item_id: hir::HirId) { + fn visit_variant( + &mut self, + v: &'hir hir::Variant, + g: &'hir hir::Generics, + item_id: hir::HirId, + ) { self.visit_testable(v.ident.to_string(), &v.attrs, |this| { intravisit::walk_variant(this, v, g, item_id); }); diff --git a/src/librustdoc/test/tests.rs b/src/librustdoc/test/tests.rs index d4d558b7cd..a96186a95e 100644 --- a/src/librustdoc/test/tests.rs +++ b/src/librustdoc/test/tests.rs @@ -1,17 +1,16 @@ -use super::{TestOptions, make_test}; -use syntax::edition::DEFAULT_EDITION; +use super::{make_test, TestOptions}; +use rustc_span::edition::DEFAULT_EDITION; #[test] fn make_test_basic() { //basic use: wraps with `fn main`, adds `#![allow(unused)]` let opts = TestOptions::default(); - let input = -"assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let input = "assert_eq!(2+2, 4);"; + let expected = "#![allow(unused)] fn main() { assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } @@ -21,13 +20,12 @@ fn make_test_crate_name_no_use() { // If you give a crate name but *don't* use it within the test, it won't bother inserting // the `extern crate` statement. let opts = TestOptions::default(); - let input = -"assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let input = "assert_eq!(2+2, 4);"; + let expected = "#![allow(unused)] fn main() { assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } @@ -37,16 +35,15 @@ fn make_test_crate_name() { // If you give a crate name and use it within the test, it will insert an `extern crate` // statement before `fn main`. let opts = TestOptions::default(); - let input = -"use asdf::qwop; + let input = "use asdf::qwop; assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 3)); } @@ -55,20 +52,15 @@ assert_eq!(2+2, 4); fn make_test_no_crate_inject() { // Even if you do use the crate within the test, setting `opts.no_crate_inject` will skip // adding it anyway. - let opts = TestOptions { - no_crate_inject: true, - display_warnings: false, - attrs: vec![], - }; - let input = -"use asdf::qwop; + let opts = TestOptions { no_crate_inject: true, display_warnings: false, attrs: vec![] }; + let input = "use asdf::qwop; assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] fn main() { use asdf::qwop; assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } @@ -79,15 +71,14 @@ fn make_test_ignore_std() { // `extern crate` statement if the crate is "std" -- that's included already by the // compiler! let opts = TestOptions::default(); - let input = -"use std::*; + let input = "use std::*; assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] fn main() { use std::*; assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("std"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } @@ -97,17 +88,16 @@ fn make_test_manual_extern_crate() { // When you manually include an `extern crate` statement in your doctest, `make_test` // assumes you've included one for your own crate too. let opts = TestOptions::default(); - let input = -"extern crate asdf; + let input = "extern crate asdf; use asdf::qwop; assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } @@ -115,17 +105,16 @@ assert_eq!(2+2, 4); #[test] fn make_test_manual_extern_crate_with_macro_use() { let opts = TestOptions::default(); - let input = -"#[macro_use] extern crate asdf; + let input = "#[macro_use] extern crate asdf; use asdf::qwop; assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] #[macro_use] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } @@ -136,29 +125,28 @@ fn make_test_opts_attrs() { // those instead of the stock `#![allow(unused)]`. let mut opts = TestOptions::default(); opts.attrs.push("feature(sick_rad)".to_string()); - let input = -"use asdf::qwop; + let input = "use asdf::qwop; assert_eq!(2+2, 4);"; - let expected = -"#![feature(sick_rad)] + let expected = "#![feature(sick_rad)] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 3)); // Adding more will also bump the returned line offset. opts.attrs.push("feature(hella_dope)".to_string()); - let expected = -"#![feature(sick_rad)] + let expected = "#![feature(sick_rad)] #![feature(hella_dope)] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 4)); } @@ -168,15 +156,14 @@ fn make_test_crate_attrs() { // Including inner attributes in your doctest will apply them to the whole "crate", pasting // them outside the generated main function. let opts = TestOptions::default(); - let input = -"#![feature(sick_rad)] + let input = "#![feature(sick_rad)] assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] #![feature(sick_rad)] fn main() { assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } @@ -185,15 +172,14 @@ assert_eq!(2+2, 4); fn make_test_with_main() { // Including your own `fn main` wrapper lets the test use it verbatim. let opts = TestOptions::default(); - let input = -"fn main() { + let input = "fn main() { assert_eq!(2+2, 4); }"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] fn main() { assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 1)); } @@ -202,15 +188,14 @@ fn main() { fn make_test_fake_main() { // ... but putting it in a comment will still provide a wrapper. let opts = TestOptions::default(); - let input = -"//Ceci n'est pas une `fn main` + let input = "//Ceci n'est pas une `fn main` assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] //Ceci n'est pas une `fn main` fn main() { assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } @@ -219,13 +204,12 @@ assert_eq!(2+2, 4); fn make_test_dont_insert_main() { // Even with that, if you set `dont_insert_main`, it won't create the `fn main` wrapper. let opts = TestOptions::default(); - let input = -"//Ceci n'est pas une `fn main` + let input = "//Ceci n'est pas une `fn main` assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] //Ceci n'est pas une `fn main` -assert_eq!(2+2, 4);".to_string(); +assert_eq!(2+2, 4);" + .to_string(); let output = make_test(input, None, true, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 1)); } @@ -235,12 +219,11 @@ fn make_test_display_warnings() { // If the user is asking to display doctest warnings, suppress the default `allow(unused)`. let mut opts = TestOptions::default(); opts.display_warnings = true; - let input = -"assert_eq!(2+2, 4);"; - let expected = -"fn main() { + let input = "assert_eq!(2+2, 4);"; + let expected = "fn main() { assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 1)); } @@ -249,31 +232,29 @@ assert_eq!(2+2, 4); fn make_test_issues_21299_33731() { let opts = TestOptions::default(); - let input = -"// fn main + let input = "// fn main assert_eq!(2+2, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] // fn main fn main() { assert_eq!(2+2, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); - let input = -"extern crate hella_qwop; + let input = "extern crate hella_qwop; assert_eq!(asdf::foo, 4);"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] extern crate hella_qwop; extern crate asdf; fn main() { assert_eq!(asdf::foo, 4); -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 3)); @@ -282,17 +263,16 @@ assert_eq!(asdf::foo, 4); #[test] fn make_test_main_in_macro() { let opts = TestOptions::default(); - let input = -"#[macro_use] extern crate my_crate; + let input = "#[macro_use] extern crate my_crate; test_wrapper! { fn main() {} }"; - let expected = -"#![allow(unused)] + let expected = "#![allow(unused)] #[macro_use] extern crate my_crate; test_wrapper! { fn main() {} -}".to_string(); +}" + .to_string(); let output = make_test(input, Some("my_crate"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 1)); diff --git a/src/librustdoc/theme.rs b/src/librustdoc/theme.rs index 1be85f4a91..af1c50acb0 100644 --- a/src/librustdoc/theme.rs +++ b/src/librustdoc/theme.rs @@ -3,13 +3,13 @@ use std::fs; use std::hash::{Hash, Hasher}; use std::path::Path; -use errors::Handler; +use rustc_errors::Handler; #[cfg(test)] mod tests; macro_rules! try_something { - ($e:expr, $diag:expr, $out:expr) => ({ + ($e:expr, $diag:expr, $out:expr) => {{ match $e { Ok(c) => c, Err(e) => { @@ -17,7 +17,7 @@ macro_rules! try_something { return $out; } } - }) + }}; } #[derive(Debug, Clone, Eq)] @@ -56,10 +56,7 @@ impl Hash for CssPath { impl CssPath { fn new(name: String) -> CssPath { - CssPath { - name, - children: FxHashSet::default(), - } + CssPath { name, children: FxHashSet::default() } } } @@ -76,30 +73,24 @@ enum Events { impl Events { fn get_pos(&self) -> usize { match *self { - Events::StartLineComment(p) | - Events::StartComment(p) | - Events::EndComment(p) | - Events::InBlock(p) | - Events::OutBlock(p) => p, + Events::StartLineComment(p) + | Events::StartComment(p) + | Events::EndComment(p) + | Events::InBlock(p) + | Events::OutBlock(p) => p, } } fn is_comment(&self) -> bool { match *self { - Events::StartLineComment(_) | - Events::StartComment(_) | - Events::EndComment(_) => true, + Events::StartLineComment(_) | Events::StartComment(_) | Events::EndComment(_) => true, _ => false, } } } fn previous_is_line_comment(events: &[Events]) -> bool { - if let Some(&Events::StartLineComment(_)) = events.last() { - true - } else { - false - } + if let Some(&Events::StartLineComment(_)) = events.last() { true } else { false } } fn is_line_comment(pos: usize, v: &[u8], events: &[Events]) -> bool { @@ -133,14 +124,14 @@ fn load_css_events(v: &[u8]) -> Vec<Events> { b'{' if !previous_is_line_comment(&events) => { if let Some(&Events::StartComment(_)) = events.last() { pos += 1; - continue + continue; } events.push(Events::InBlock(pos + 1)); } b'}' if !previous_is_line_comment(&events) => { if let Some(&Events::StartComment(_)) = events.last() { pos += 1; - continue + continue; } events.push(Events::OutBlock(pos + 1)); } @@ -176,7 +167,7 @@ fn get_previous_positions(events: &[Events], mut pos: usize) -> Vec<usize> { } else { ret.push(0); } - break + break; } ret.push(events[pos].get_pos()); pos -= 1; @@ -188,19 +179,20 @@ fn get_previous_positions(events: &[Events], mut pos: usize) -> Vec<usize> { } fn build_rule(v: &[u8], positions: &[usize]) -> String { - positions.chunks(2) - .map(|x| ::std::str::from_utf8(&v[x[0]..x[1]]).unwrap_or("")) - .collect::<String>() - .trim() - .replace("\n", " ") - .replace("/", "") - .replace("\t", " ") - .replace("{", "") - .replace("}", "") - .split(' ') - .filter(|s| s.len() > 0) - .collect::<Vec<&str>>() - .join(" ") + positions + .chunks(2) + .map(|x| ::std::str::from_utf8(&v[x[0]..x[1]]).unwrap_or("")) + .collect::<String>() + .trim() + .replace("\n", " ") + .replace("/", "") + .replace("\t", " ") + .replace("{", "") + .replace("}", "") + .split(' ') + .filter(|s| s.len() > 0) + .collect::<Vec<&str>>() + .join(" ") } fn inner(v: &[u8], events: &[Events], pos: &mut usize) -> FxHashSet<CssPath> { @@ -209,7 +201,7 @@ fn inner(v: &[u8], events: &[Events], pos: &mut usize) -> FxHashSet<CssPath> { while *pos < events.len() { if let Some(Events::OutBlock(_)) = get_useful_next(events, pos) { *pos += 1; - break + break; } if let Some(Events::InBlock(_)) = get_useful_next(events, pos) { paths.push(CssPath::new(build_rule(v, &get_previous_positions(events, *pos)))); @@ -240,7 +232,7 @@ pub fn load_css_paths(v: &[u8]) -> CssPath { pub fn get_differences(against: &CssPath, other: &CssPath, v: &mut Vec<String>) { if against.name != other.name { - return + return; } else { for child in &against.children { let mut found = false; @@ -255,7 +247,7 @@ pub fn get_differences(against: &CssPath, other: &CssPath, v: &mut Vec<String>) found_working = true; } found = true; - break + break; } } if found == false { diff --git a/src/librustdoc/theme/tests.rs b/src/librustdoc/theme/tests.rs index ab0935bc49..9ead1d2800 100644 --- a/src/librustdoc/theme/tests.rs +++ b/src/librustdoc/theme/tests.rs @@ -44,9 +44,11 @@ rule j end {} "#; let mut ret = Vec::new(); - get_differences(&load_css_paths(against.as_bytes()), - &load_css_paths(text.as_bytes()), - &mut ret); + get_differences( + &load_css_paths(against.as_bytes()), + &load_css_paths(text.as_bytes()), + &mut ret, + ); assert!(ret.is_empty()); } diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index aea9b7c38e..d3d45cccca 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -1,38 +1,32 @@ //! The Rust AST Visitor. Extracts useful information and massages it into a form //! usable for `clean`. -use rustc::hir::{self, Node}; -use rustc::hir::def::{Res, DefKind}; -use rustc::hir::def_id::{DefId, LOCAL_CRATE}; use rustc::middle::privacy::AccessLevel; -use rustc::util::nodemap::{FxHashSet, FxHashMap}; use rustc::ty::TyCtxt; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_hir as hir; +use rustc_hir::def::{DefKind, Res}; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; +use rustc_hir::Node; +use rustc_span::hygiene::MacroKind; +use rustc_span::source_map::Spanned; +use rustc_span::symbol::{kw, sym}; +use rustc_span::{self, Span}; use syntax::ast; -use syntax::source_map::Spanned; -use syntax::symbol::sym; -use syntax_pos::hygiene::MacroKind; -use syntax_pos::{self, Span}; use std::mem; -use crate::core; use crate::clean::{self, AttributesExt, NestedAttributesExt}; +use crate::core; use crate::doctree::*; // FIXME: Should this be replaced with tcx.def_path_str? -fn def_id_to_path( - tcx: TyCtxt<'_>, - did: DefId, -) -> Vec<String> { +fn def_id_to_path(tcx: TyCtxt<'_>, did: DefId) -> Vec<String> { let crate_name = tcx.crate_name(did.krate).to_string(); let relative = tcx.def_path(did).data.into_iter().filter_map(|elem| { // extern blocks have an empty name let s = elem.data.to_string(); - if !s.is_empty() { - Some(s) - } else { - None - } + if !s.is_empty() { Some(s) } else { None } }); std::iter::once(crate_name).chain(relative).collect() } @@ -50,9 +44,7 @@ pub struct RustdocVisitor<'a, 'tcx> { } impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { - pub fn new( - cx: &'a mut core::DocContext<'tcx> - ) -> RustdocVisitor<'a, 'tcx> { + pub fn new(cx: &'a mut core::DocContext<'tcx>) -> RustdocVisitor<'a, 'tcx> { // If the root is re-exported, terminate all recursion. let mut stack = FxHashSet::default(); stack.insert(hir::CRATE_HIR_ID); @@ -71,17 +63,18 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } pub fn visit(mut self, krate: &'tcx hir::Crate) -> Module<'tcx> { - let mut module = self.visit_mod_contents(krate.span, - &krate.attrs, - &Spanned { span: syntax_pos::DUMMY_SP, - node: hir::VisibilityKind::Public }, - hir::CRATE_HIR_ID, - &krate.module, - None); - // Attach the crate's exported macros to the top-level module: - module.macros.extend( - krate.exported_macros.iter().map(|def| self.visit_local_macro(def, None)), + let mut module = self.visit_mod_contents( + krate.span, + krate.attrs, + &Spanned { span: rustc_span::DUMMY_SP, node: hir::VisibilityKind::Public }, + hir::CRATE_HIR_ID, + &krate.module, + None, ); + // Attach the crate's exported macros to the top-level module: + module + .macros + .extend(krate.exported_macros.iter().map(|def| self.visit_local_macro(def, None))); module.is_crate = true; self.cx.renderinfo.get_mut().exact_paths = self.exact_paths; @@ -89,9 +82,13 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { module } - fn visit_variant_data(&mut self, item: &'tcx hir::Item, - name: ast::Name, sd: &'tcx hir::VariantData, - generics: &'tcx hir::Generics) -> Struct<'tcx> { + fn visit_variant_data( + &mut self, + item: &'tcx hir::Item, + name: ast::Name, + sd: &'tcx hir::VariantData, + generics: &'tcx hir::Generics, + ) -> Struct<'tcx> { debug!("visiting struct"); let struct_type = struct_type_from_def(&*sd); Struct { @@ -102,13 +99,17 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { attrs: &item.attrs, generics, fields: sd.fields(), - whence: item.span + whence: item.span, } } - fn visit_union_data(&mut self, item: &'tcx hir::Item, - name: ast::Name, sd: &'tcx hir::VariantData, - generics: &'tcx hir::Generics) -> Union<'tcx> { + fn visit_union_data( + &mut self, + item: &'tcx hir::Item, + name: ast::Name, + sd: &'tcx hir::VariantData, + generics: &'tcx hir::Generics, + ) -> Union<'tcx> { debug!("visiting union"); let struct_type = struct_type_from_def(&*sd); Union { @@ -119,23 +120,31 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { attrs: &item.attrs, generics, fields: sd.fields(), - whence: item.span + whence: item.span, } } - fn visit_enum_def(&mut self, it: &'tcx hir::Item, - name: ast::Name, def: &'tcx hir::EnumDef, - generics: &'tcx hir::Generics) -> Enum<'tcx> { + fn visit_enum_def( + &mut self, + it: &'tcx hir::Item, + name: ast::Name, + def: &'tcx hir::EnumDef, + generics: &'tcx hir::Generics, + ) -> Enum<'tcx> { debug!("visiting enum"); Enum { name, - variants: def.variants.iter().map(|v| Variant { - name: v.ident.name, - id: v.id, - attrs: &v.attrs, - def: &v.data, - whence: v.span, - }).collect(), + variants: def + .variants + .iter() + .map(|v| Variant { + name: v.ident.name, + id: v.id, + attrs: &v.attrs, + def: &v.data, + whence: v.span, + }) + .collect(), vis: &it.vis, generics, attrs: &it.attrs, @@ -144,31 +153,41 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } } - fn visit_fn(&mut self, om: &mut Module<'tcx>, item: &'tcx hir::Item, - name: ast::Name, decl: &'tcx hir::FnDecl, - header: hir::FnHeader, - generics: &'tcx hir::Generics, - body: hir::BodyId) { + fn visit_fn( + &mut self, + om: &mut Module<'tcx>, + item: &'tcx hir::Item, + name: ast::Name, + decl: &'tcx hir::FnDecl, + header: hir::FnHeader, + generics: &'tcx hir::Generics, + body: hir::BodyId, + ) { debug!("visiting fn"); - let macro_kind = item.attrs.iter().filter_map(|a| { - if a.check_name(sym::proc_macro) { - Some(MacroKind::Bang) - } else if a.check_name(sym::proc_macro_derive) { - Some(MacroKind::Derive) - } else if a.check_name(sym::proc_macro_attribute) { - Some(MacroKind::Attr) - } else { - None - } - }).next(); + let macro_kind = item + .attrs + .iter() + .filter_map(|a| { + if a.check_name(sym::proc_macro) { + Some(MacroKind::Bang) + } else if a.check_name(sym::proc_macro_derive) { + Some(MacroKind::Derive) + } else if a.check_name(sym::proc_macro_attribute) { + Some(MacroKind::Attr) + } else { + None + } + }) + .next(); match macro_kind { Some(kind) => { let name = if kind == MacroKind::Derive { - item.attrs.lists(sym::proc_macro_derive) - .filter_map(|mi| mi.ident()) - .next() - .expect("proc-macro derives require a name") - .name + item.attrs + .lists(sym::proc_macro_derive) + .filter_map(|mi| mi.ident()) + .next() + .expect("proc-macro derives require a name") + .name } else { name }; @@ -213,10 +232,15 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } } - fn visit_mod_contents(&mut self, span: Span, attrs: &'tcx hir::HirVec<ast::Attribute>, - vis: &'tcx hir::Visibility, id: hir::HirId, - m: &'tcx hir::Mod, - name: Option<ast::Name>) -> Module<'tcx> { + fn visit_mod_contents( + &mut self, + span: Span, + attrs: &'tcx [ast::Attribute], + vis: &'tcx hir::Visibility, + id: hir::HirId, + m: &'tcx hir::Mod<'tcx>, + name: Option<ast::Name>, + ) -> Module<'tcx> { let mut om = Module::new(name, attrs, vis); om.where_outer = span; om.where_inner = m.inner; @@ -224,7 +248,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { // Keep track of if there were any private modules in the path. let orig_inside_public_path = self.inside_public_path; self.inside_public_path &= vis.node.is_pub(); - for i in &m.item_ids { + for i in m.item_ids { let item = self.cx.tcx.hir().expect_item(i.id); self.visit_item(item, None, &mut om); } @@ -241,19 +265,19 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { /// and follows different rules. /// /// Returns `true` if the target has been inlined. - fn maybe_inline_local(&mut self, - id: hir::HirId, - res: Res, - renamed: Option<ast::Ident>, - glob: bool, - om: &mut Module<'tcx>, - please_inline: bool) -> bool { - + fn maybe_inline_local( + &mut self, + id: hir::HirId, + res: Res, + renamed: Option<ast::Ident>, + glob: bool, + om: &mut Module<'tcx>, + please_inline: bool, + ) -> bool { fn inherits_doc_hidden(cx: &core::DocContext<'_>, mut node: hir::HirId) -> bool { while let Some(id) = cx.tcx.hir().get_enclosing_scope(node) { node = id; - if cx.tcx.hir().attrs(node) - .lists(sym::doc).has_word(sym::hidden) { + if cx.tcx.hir().attrs(node).lists(sym::doc).has_word(sym::hidden) { return true; } if node == hir::CRATE_HIR_ID { @@ -274,8 +298,8 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { let use_attrs = tcx.hir().attrs(id); // Don't inline `doc(hidden)` imports so they can be stripped at a later stage. - let is_no_inline = use_attrs.lists(sym::doc).has_word(sym::no_inline) || - use_attrs.lists(sym::doc).has_word(sym::hidden); + let is_no_inline = use_attrs.lists(sym::doc).has_word(sym::no_inline) + || use_attrs.lists(sym::doc).has_word(sym::hidden); // For cross-crate impl inlining we need to know whether items are // reachable in documentation -- a previously nonreachable item can be @@ -285,28 +309,30 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { let attrs = clean::inline::load_attrs(self.cx, res_did); let self_is_hidden = attrs.lists(sym::doc).has_word(sym::hidden); match res { - Res::Def(DefKind::Trait, did) | - Res::Def(DefKind::Struct, did) | - Res::Def(DefKind::Union, did) | - Res::Def(DefKind::Enum, did) | - Res::Def(DefKind::ForeignTy, did) | - Res::Def(DefKind::TyAlias, did) if !self_is_hidden => { - self.cx.renderinfo - .get_mut() - .access_levels.map - .insert(did, AccessLevel::Public); - }, - Res::Def(DefKind::Mod, did) => if !self_is_hidden { - crate::visit_lib::LibEmbargoVisitor::new(self.cx).visit_mod(did); - }, - _ => {}, + Res::Def(DefKind::Trait, did) + | Res::Def(DefKind::Struct, did) + | Res::Def(DefKind::Union, did) + | Res::Def(DefKind::Enum, did) + | Res::Def(DefKind::ForeignTy, did) + | Res::Def(DefKind::TyAlias, did) + if !self_is_hidden => + { + self.cx.renderinfo.get_mut().access_levels.map.insert(did, AccessLevel::Public); + } + Res::Def(DefKind::Mod, did) => { + if !self_is_hidden { + crate::visit_lib::LibEmbargoVisitor::new(self.cx).visit_mod(did); + } + } + _ => {} } - return false + return false; } let res_hir_id = match tcx.hir().as_local_hir_id(res_did) { - Some(n) => n, None => return false + Some(n) => n, + None => return false, }; let is_private = !self.cx.renderinfo.borrow().access_levels.is_public(res_did); @@ -314,15 +340,17 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { // Only inline if requested or if the item would otherwise be stripped. if (!please_inline && !is_private && !is_hidden) || is_no_inline { - return false + return false; } - if !self.view_item_stack.insert(res_hir_id) { return false } + if !self.view_item_stack.insert(res_hir_id) { + return false; + } let ret = match tcx.hir().get(res_hir_id) { Node::Item(&hir::Item { kind: hir::ItemKind::Mod(ref m), .. }) if glob => { let prev = mem::replace(&mut self.inlining, true); - for i in &m.item_ids { + for i in m.item_ids { let i = self.cx.tcx.hir().expect_item(i.id); self.visit_item(i, None, om); } @@ -351,8 +379,12 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { ret } - fn visit_item(&mut self, item: &'tcx hir::Item, - renamed: Option<ast::Ident>, om: &mut Module<'tcx>) { + fn visit_item( + &mut self, + item: &'tcx hir::Item, + renamed: Option<ast::Ident>, + om: &mut Module<'tcx>, + ) { debug!("visiting item {:?}", item); let ident = renamed.unwrap_or(item.ident); @@ -363,7 +395,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { match item.kind { hir::ItemKind::ForeignMod(ref fm) => { - for item in &fm.items { + for item in fm.items { self.visit_foreign_item(item, None, om); } } @@ -373,10 +405,9 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { hir::ItemKind::ExternCrate(orig_name) => { let def_id = self.cx.tcx.hir().local_def_id(item.hir_id); om.extern_crates.push(ExternCrate { - cnum: self.cx.tcx.extern_mod_stmt_cnum(def_id) - .unwrap_or(LOCAL_CRATE), + cnum: self.cx.tcx.extern_mod_stmt_cnum(def_id).unwrap_or(LOCAL_CRATE), name: ident.name, - path: orig_name.map(|x|x.to_string()), + path: orig_name.map(|x| x.to_string()), vis: &item.vis, attrs: &item.attrs, whence: item.span, @@ -395,21 +426,21 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { // If there was a private module in the current path then don't bother inlining // anything as it will probably be stripped anyway. if item.vis.node.is_pub() && self.inside_public_path { - let please_inline = item.attrs.iter().any(|item| { - match item.meta_item_list() { - Some(ref list) if item.check_name(sym::doc) => { - list.iter().any(|i| i.check_name(sym::inline)) - } - _ => false, + let please_inline = item.attrs.iter().any(|item| match item.meta_item_list() { + Some(ref list) if item.check_name(sym::doc) => { + list.iter().any(|i| i.check_name(sym::inline)) } + _ => false, }); let ident = if is_glob { None } else { Some(ident) }; - if self.maybe_inline_local(item.hir_id, - path.res, - ident, - is_glob, - om, - please_inline) { + if self.maybe_inline_local( + item.hir_id, + path.res, + ident, + is_glob, + om, + please_inline, + ) { return; } } @@ -425,22 +456,28 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { }); } hir::ItemKind::Mod(ref m) => { - om.mods.push(self.visit_mod_contents(item.span, - &item.attrs, - &item.vis, - item.hir_id, - m, - Some(ident.name))); - }, - hir::ItemKind::Enum(ref ed, ref gen) => - om.enums.push(self.visit_enum_def(item, ident.name, ed, gen)), - hir::ItemKind::Struct(ref sd, ref gen) => - om.structs.push(self.visit_variant_data(item, ident.name, sd, gen)), - hir::ItemKind::Union(ref sd, ref gen) => - om.unions.push(self.visit_union_data(item, ident.name, sd, gen)), - hir::ItemKind::Fn(ref sig, ref gen, body) => - self.visit_fn(om, item, ident.name, &sig.decl, sig.header, gen, body), - hir::ItemKind::TyAlias(ref ty, ref gen) => { + om.mods.push(self.visit_mod_contents( + item.span, + &item.attrs, + &item.vis, + item.hir_id, + m, + Some(ident.name), + )); + } + hir::ItemKind::Enum(ref ed, ref gen) => { + om.enums.push(self.visit_enum_def(item, ident.name, ed, gen)) + } + hir::ItemKind::Struct(ref sd, ref gen) => { + om.structs.push(self.visit_variant_data(item, ident.name, sd, gen)) + } + hir::ItemKind::Union(ref sd, ref gen) => { + om.unions.push(self.visit_union_data(item, ident.name, sd, gen)) + } + hir::ItemKind::Fn(ref sig, ref gen, body) => { + self.visit_fn(om, item, ident.name, &sig.decl, sig.header, gen, body) + } + hir::ItemKind::TyAlias(ty, ref gen) => { let t = Typedef { ty, gen, @@ -451,7 +488,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { vis: &item.vis, }; om.typedefs.push(t); - }, + } hir::ItemKind::OpaqueTy(ref opaque_ty) => { let t = OpaqueTy { opaque_ty, @@ -462,8 +499,8 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { vis: &item.vis, }; om.opaque_tys.push(t); - }, - hir::ItemKind::Static(ref type_, mutability, expr) => { + } + hir::ItemKind::Static(type_, mutability, expr) => { let s = Static { type_, mutability, @@ -475,23 +512,25 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { vis: &item.vis, }; om.statics.push(s); - }, - hir::ItemKind::Const(ref type_, expr) => { - let s = Constant { - type_, - expr, - id: item.hir_id, - name: ident.name, - attrs: &item.attrs, - whence: item.span, - vis: &item.vis, - }; - om.constants.push(s); - }, + } + hir::ItemKind::Const(type_, expr) => { + // Underscore constants do not correspond to a nameable item and + // so are never useful in documentation. + if ident.name != kw::Underscore { + let s = Constant { + type_, + expr, + id: item.hir_id, + name: ident.name, + attrs: &item.attrs, + whence: item.span, + vis: &item.vis, + }; + om.constants.push(s); + } + } hir::ItemKind::Trait(is_auto, unsafety, ref generics, ref bounds, ref item_ids) => { - let items = item_ids.iter() - .map(|ti| self.cx.tcx.hir().trait_item(ti.id)) - .collect(); + let items = item_ids.iter().map(|ti| self.cx.tcx.hir().trait_item(ti.id)).collect(); let t = Trait { is_auto, unsafety, @@ -505,7 +544,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { vis: &item.vis, }; om.traits.push(t); - }, + } hir::ItemKind::TraitAlias(ref generics, ref bounds) => { let t = TraitAlias { name: ident.name, @@ -517,28 +556,31 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { vis: &item.vis, }; om.trait_aliases.push(t); - }, - - hir::ItemKind::Impl(unsafety, - polarity, - defaultness, - ref generics, - ref trait_, - ref for_, - ref item_ids) => { + } + + hir::ItemKind::Impl { + unsafety, + polarity, + defaultness, + constness, + ref generics, + ref of_trait, + self_ty, + ref items, + } => { // Don't duplicate impls when inlining or if it's implementing a trait, we'll pick // them up regardless of where they're located. - if !self.inlining && trait_.is_none() { - let items = item_ids.iter() - .map(|ii| self.cx.tcx.hir().impl_item(ii.id)) - .collect(); + if !self.inlining && of_trait.is_none() { + let items = + items.iter().map(|item| self.cx.tcx.hir().impl_item(item.id)).collect(); let i = Impl { unsafety, polarity, defaultness, + constness, generics, - trait_, - for_, + trait_: of_trait, + for_: self_ty, items, attrs: &item.attrs, id: item.hir_id, @@ -547,12 +589,16 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { }; om.impls.push(i); } - }, + } } } - fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem, - renamed: Option<ast::Ident>, om: &mut Module<'tcx>) { + fn visit_foreign_item( + &mut self, + item: &'tcx hir::ForeignItem, + renamed: Option<ast::Ident>, + om: &mut Module<'tcx>, + ) { // If inlining we only want to include public functions. if self.inlining && !item.vis.node.is_pub() { return; @@ -564,7 +610,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { kind: &item.kind, vis: &item.vis, attrs: &item.attrs, - whence: item.span + whence: item.span, }); } @@ -572,7 +618,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { fn visit_local_macro( &self, def: &'tcx hir::MacroDef, - renamed: Option<ast::Name> + renamed: Option<ast::Name>, ) -> Macro<'tcx> { debug!("visit_local_macro: {}", def.name); let tts = def.body.trees().collect::<Vec<_>>(); diff --git a/src/librustdoc/visit_lib.rs b/src/librustdoc/visit_lib.rs index b229b5f688..12ffd6cac8 100644 --- a/src/librustdoc/visit_lib.rs +++ b/src/librustdoc/visit_lib.rs @@ -1,9 +1,9 @@ -use rustc::middle::privacy::{AccessLevels, AccessLevel}; -use rustc::hir::def::{Res, DefKind}; -use rustc::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefId}; +use rustc::middle::privacy::{AccessLevel, AccessLevels}; use rustc::ty::{TyCtxt, Visibility}; -use rustc::util::nodemap::FxHashSet; -use syntax::symbol::sym; +use rustc_data_structures::fx::FxHashSet; +use rustc_hir::def::{DefKind, Res}; +use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX}; +use rustc_span::symbol::sym; use crate::clean::{AttributesExt, NestedAttributesExt}; @@ -22,9 +22,7 @@ pub struct LibEmbargoVisitor<'a, 'tcx> { } impl<'a, 'tcx> LibEmbargoVisitor<'a, 'tcx> { - pub fn new( - cx: &'a mut crate::core::DocContext<'tcx> - ) -> LibEmbargoVisitor<'a, 'tcx> { + pub fn new(cx: &'a mut crate::core::DocContext<'tcx>) -> LibEmbargoVisitor<'a, 'tcx> { LibEmbargoVisitor { tcx: cx.tcx, access_levels: &mut cx.renderinfo.get_mut().access_levels, @@ -60,8 +58,9 @@ impl<'a, 'tcx> LibEmbargoVisitor<'a, 'tcx> { for item in self.tcx.item_children(def_id).iter() { if let Some(def_id) = item.res.opt_def_id() { - if self.tcx.def_key(def_id).parent.map_or(false, |d| d == def_id.index) || - item.vis == Visibility::Public { + if self.tcx.def_key(def_id).parent.map_or(false, |d| d == def_id.index) + || item.vis == Visibility::Public + { self.visit_item(item.res); } } @@ -71,11 +70,7 @@ impl<'a, 'tcx> LibEmbargoVisitor<'a, 'tcx> { fn visit_item(&mut self, res: Res) { let def_id = res.def_id(); let vis = self.tcx.visibility(def_id); - let inherited_item_level = if vis == Visibility::Public { - self.prev_level - } else { - None - }; + let inherited_item_level = if vis == Visibility::Public { self.prev_level } else { None }; let item_level = self.update(def_id, inherited_item_level); diff --git a/src/libserialize/collection_impls.rs b/src/libserialize/collection_impls.rs index f2e9be14c8..c602de37b1 100644 --- a/src/libserialize/collection_impls.rs +++ b/src/libserialize/collection_impls.rs @@ -1,9 +1,9 @@ //! Implementations of serialization for structures found in liballoc -use std::hash::{Hash, BuildHasher}; +use std::hash::{BuildHasher, Hash}; -use crate::{Decodable, Encodable, Decoder, Encoder}; -use std::collections::{LinkedList, VecDeque, BTreeMap, BTreeSet, HashMap, HashSet}; +use crate::{Decodable, Decoder, Encodable, Encoder}; +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, LinkedList, VecDeque}; use std::rc::Rc; use std::sync::Arc; @@ -44,7 +44,7 @@ impl<T: Encodable> Encodable for LinkedList<T> { } } -impl<T:Decodable> Decodable for LinkedList<T> { +impl<T: Decodable> Decodable for LinkedList<T> { fn decode<D: Decoder>(d: &mut D) -> Result<LinkedList<T>, D::Error> { d.read_seq(|d, len| { let mut list = LinkedList::new(); @@ -67,7 +67,7 @@ impl<T: Encodable> Encodable for VecDeque<T> { } } -impl<T:Decodable> Decodable for VecDeque<T> { +impl<T: Decodable> Decodable for VecDeque<T> { fn decode<D: Decoder>(d: &mut D) -> Result<VecDeque<T>, D::Error> { d.read_seq(|d, len| { let mut deque: VecDeque<T> = VecDeque::with_capacity(len); @@ -80,8 +80,9 @@ impl<T:Decodable> Decodable for VecDeque<T> { } impl<K, V> Encodable for BTreeMap<K, V> - where K: Encodable + PartialEq + Ord, - V: Encodable +where + K: Encodable + PartialEq + Ord, + V: Encodable, { fn encode<S: Encoder>(&self, e: &mut S) -> Result<(), S::Error> { e.emit_map(self.len(), |e| { @@ -97,8 +98,9 @@ impl<K, V> Encodable for BTreeMap<K, V> } impl<K, V> Decodable for BTreeMap<K, V> - where K: Decodable + PartialEq + Ord, - V: Decodable +where + K: Decodable + PartialEq + Ord, + V: Decodable, { fn decode<D: Decoder>(d: &mut D) -> Result<BTreeMap<K, V>, D::Error> { d.read_map(|d, len| { @@ -114,7 +116,8 @@ impl<K, V> Decodable for BTreeMap<K, V> } impl<T> Encodable for BTreeSet<T> - where T: Encodable + PartialEq + Ord +where + T: Encodable + PartialEq + Ord, { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { @@ -129,7 +132,8 @@ impl<T> Encodable for BTreeSet<T> } impl<T> Decodable for BTreeSet<T> - where T: Decodable + PartialEq + Ord +where + T: Decodable + PartialEq + Ord, { fn decode<D: Decoder>(d: &mut D) -> Result<BTreeSet<T>, D::Error> { d.read_seq(|d, len| { @@ -143,9 +147,10 @@ impl<T> Decodable for BTreeSet<T> } impl<K, V, S> Encodable for HashMap<K, V, S> - where K: Encodable + Eq, - V: Encodable, - S: BuildHasher, +where + K: Encodable + Eq, + V: Encodable, + S: BuildHasher, { fn encode<E: Encoder>(&self, e: &mut E) -> Result<(), E::Error> { e.emit_map(self.len(), |e| { @@ -161,9 +166,10 @@ impl<K, V, S> Encodable for HashMap<K, V, S> } impl<K, V, S> Decodable for HashMap<K, V, S> - where K: Decodable + Hash + Eq, - V: Decodable, - S: BuildHasher + Default, +where + K: Decodable + Hash + Eq, + V: Decodable, + S: BuildHasher + Default, { fn decode<D: Decoder>(d: &mut D) -> Result<HashMap<K, V, S>, D::Error> { d.read_map(|d, len| { @@ -180,8 +186,9 @@ impl<K, V, S> Decodable for HashMap<K, V, S> } impl<T, S> Encodable for HashSet<T, S> - where T: Encodable + Eq, - S: BuildHasher, +where + T: Encodable + Eq, + S: BuildHasher, { fn encode<E: Encoder>(&self, s: &mut E) -> Result<(), E::Error> { s.emit_seq(self.len(), |s| { @@ -196,8 +203,9 @@ impl<T, S> Encodable for HashSet<T, S> } impl<T, S> Decodable for HashSet<T, S> - where T: Decodable + Hash + Eq, - S: BuildHasher + Default, +where + T: Decodable + Hash + Eq, + S: BuildHasher + Default, { fn decode<D: Decoder>(d: &mut D) -> Result<HashSet<T, S>, D::Error> { d.read_seq(|d, len| { @@ -212,9 +220,10 @@ impl<T, S> Decodable for HashSet<T, S> } impl<K, V, S> Encodable for indexmap::IndexMap<K, V, S> - where K: Encodable + Hash + Eq, - V: Encodable, - S: BuildHasher, +where + K: Encodable + Hash + Eq, + V: Encodable, + S: BuildHasher, { fn encode<E: Encoder>(&self, e: &mut E) -> Result<(), E::Error> { e.emit_map(self.len(), |e| { @@ -230,9 +239,10 @@ impl<K, V, S> Encodable for indexmap::IndexMap<K, V, S> } impl<K, V, S> Decodable for indexmap::IndexMap<K, V, S> - where K: Decodable + Hash + Eq, - V: Decodable, - S: BuildHasher + Default, +where + K: Decodable + Hash + Eq, + V: Decodable, + S: BuildHasher + Default, { fn decode<D: Decoder>(d: &mut D) -> Result<indexmap::IndexMap<K, V, S>, D::Error> { d.read_map(|d, len| { @@ -249,8 +259,9 @@ impl<K, V, S> Decodable for indexmap::IndexMap<K, V, S> } impl<T, S> Encodable for indexmap::IndexSet<T, S> - where T: Encodable + Hash + Eq, - S: BuildHasher, +where + T: Encodable + Hash + Eq, + S: BuildHasher, { fn encode<E: Encoder>(&self, s: &mut E) -> Result<(), E::Error> { s.emit_seq(self.len(), |s| { @@ -265,8 +276,9 @@ impl<T, S> Encodable for indexmap::IndexSet<T, S> } impl<T, S> Decodable for indexmap::IndexSet<T, S> - where T: Decodable + Hash + Eq, - S: BuildHasher + Default, +where + T: Decodable + Hash + Eq, + S: BuildHasher + Default, { fn decode<D: Decoder>(d: &mut D) -> Result<indexmap::IndexSet<T, S>, D::Error> { d.read_seq(|d, len| { diff --git a/src/libserialize/hex.rs b/src/libserialize/hex.rs index 95d92f311e..cfb165a3d4 100644 --- a/src/libserialize/hex.rs +++ b/src/libserialize/hex.rs @@ -2,8 +2,8 @@ pub use self::FromHexError::*; -use std::fmt; use std::error; +use std::fmt; /// A trait for converting a value to hexadecimal encoding pub trait ToHex { @@ -37,9 +37,7 @@ impl ToHex for [u8] { v.push(CHARS[(byte & 0xf) as usize]); } - unsafe { - String::from_utf8_unchecked(v) - } + unsafe { String::from_utf8_unchecked(v) } } } @@ -62,22 +60,15 @@ pub enum FromHexError { impl fmt::Display for FromHexError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { - InvalidHexCharacter(ch, idx) => - write!(f, "Invalid character '{}' at position {}", ch, idx), + InvalidHexCharacter(ch, idx) => { + write!(f, "Invalid character '{}' at position {}", ch, idx) + } InvalidHexLength => write!(f, "Invalid input length"), } } } -impl error::Error for FromHexError { - fn description(&self) -> &str { - match *self { - InvalidHexCharacter(..) => "invalid character", - InvalidHexLength => "invalid length", - } - } -} - +impl error::Error for FromHexError {} impl FromHex for str { /// Converts any hexadecimal encoded string (literal, `@`, `&`, or `~`) @@ -118,13 +109,13 @@ impl FromHex for str { b'A'..=b'F' => buf |= byte - b'A' + 10, b'a'..=b'f' => buf |= byte - b'a' + 10, b'0'..=b'9' => buf |= byte - b'0', - b' '|b'\r'|b'\n'|b'\t' => { + b' ' | b'\r' | b'\n' | b'\t' => { buf >>= 4; - continue + continue; } _ => { let ch = self[idx..].chars().next().unwrap(); - return Err(InvalidHexCharacter(ch, idx)) + return Err(InvalidHexCharacter(ch, idx)); } } diff --git a/src/libserialize/hex/tests.rs b/src/libserialize/hex/tests.rs index 471912c11d..ce62c0ff23 100644 --- a/src/libserialize/hex/tests.rs +++ b/src/libserialize/hex/tests.rs @@ -1,6 +1,6 @@ extern crate test; -use test::Bencher; use crate::hex::{FromHex, ToHex}; +use test::Bencher; #[test] pub fn test_to_hex() { @@ -9,10 +9,8 @@ pub fn test_to_hex() { #[test] pub fn test_from_hex_okay() { - assert_eq!("666f6f626172".from_hex().unwrap(), - b"foobar"); - assert_eq!("666F6F626172".from_hex().unwrap(), - b"foobar"); + assert_eq!("666f6f626172".from_hex().unwrap(), b"foobar"); + assert_eq!("666F6F626172".from_hex().unwrap(), b"foobar"); } #[test] @@ -28,8 +26,7 @@ pub fn test_from_hex_invalid_char() { #[test] pub fn test_from_hex_ignores_whitespace() { - assert_eq!("666f 6f6\r\n26172 ".from_hex().unwrap(), - b"foobar"); + assert_eq!("666f 6f6\r\n26172 ".from_hex().unwrap(), b"foobar"); } #[test] @@ -43,12 +40,8 @@ pub fn test_to_hex_all_bytes() { pub fn test_from_hex_all_bytes() { for i in 0..256 { let ii: &[u8] = &[i as u8]; - assert_eq!(format!("{:02x}", i as usize).from_hex() - .unwrap(), - ii); - assert_eq!(format!("{:02X}", i as usize).from_hex() - .unwrap(), - ii); + assert_eq!(format!("{:02x}", i as usize).from_hex().unwrap(), ii); + assert_eq!(format!("{:02X}", i as usize).from_hex().unwrap(), ii); } } diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index d2e360f5e2..1f9d43cb93 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -182,17 +182,17 @@ //! } //! ``` -use self::JsonEvent::*; +use self::DecoderError::*; use self::ErrorCode::*; +use self::InternalStackElement::*; +use self::JsonEvent::*; use self::ParserError::*; -use self::DecoderError::*; use self::ParserState::*; -use self::InternalStackElement::*; use std::borrow::Cow; -use std::collections::{HashMap, BTreeMap}; -use std::io::prelude::*; +use std::collections::{BTreeMap, HashMap}; use std::io; +use std::io::prelude::*; use std::mem::swap; use std::num::FpCategory as Fp; use std::ops::Index; @@ -218,10 +218,17 @@ pub enum Json { pub type Array = Vec<Json>; pub type Object = BTreeMap<string::String, Json>; -pub struct PrettyJson<'a> { inner: &'a Json } +pub struct PrettyJson<'a> { + inner: &'a Json, +} -pub struct AsJson<'a, T> { inner: &'a T } -pub struct AsPrettyJson<'a, T> { inner: &'a T, indent: Option<usize> } +pub struct AsJson<'a, T> { + inner: &'a T, +} +pub struct AsPrettyJson<'a, T> { + inner: &'a T, + indent: Option<usize>, +} /// The errors that can arise while parsing a JSON stream. #[derive(Clone, Copy, PartialEq, Debug)] @@ -261,7 +268,7 @@ pub enum DecoderError { ExpectedError(string::String, string::String), MissingFieldError(string::String), UnknownVariantError(string::String), - ApplicationError(string::String) + ApplicationError(string::String), } #[derive(Copy, Clone, Debug)] @@ -297,7 +304,7 @@ pub fn error_str(error: ErrorCode) -> &'static str { pub fn decode<T: crate::Decodable>(s: &str) -> DecodeResult<T> { let json = match from_str(s) { Ok(x) => x, - Err(e) => return Err(ParseError(e)) + Err(e) => return Err(ParseError(e)), }; let mut decoder = Decoder::new(json); @@ -338,9 +345,7 @@ impl fmt::Display for DecoderError { } } -impl std::error::Error for DecoderError { - fn description(&self) -> &str { "decoder error" } -} +impl std::error::Error for DecoderError {} impl fmt::Display for EncoderError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -349,15 +354,15 @@ impl fmt::Display for EncoderError { } } -impl std::error::Error for EncoderError { - fn description(&self) -> &str { "encoder error" } -} +impl std::error::Error for EncoderError {} impl From<fmt::Error> for EncoderError { /// Converts a [`fmt::Error`] into `EncoderError` /// /// This conversion does not allocate memory. - fn from(err: fmt::Error) -> EncoderError { EncoderError::FmtError(err) } + fn from(err: fmt::Error) -> EncoderError { + EncoderError::FmtError(err) + } } pub type EncodeResult = Result<(), EncoderError>; @@ -405,7 +410,9 @@ fn escape_str(wr: &mut dyn fmt::Write, v: &str) -> EncodeResult { b'\x1e' => "\\u001e", b'\x1f' => "\\u001f", b'\x7f' => "\\u007f", - _ => { continue; } + _ => { + continue; + } }; if start < i { @@ -453,7 +460,7 @@ fn fmt_number_or_null(v: f64) -> string::String { /// A structure for implementing serialization to JSON. pub struct Encoder<'a> { - writer: &'a mut (dyn fmt::Write+'a), + writer: &'a mut (dyn fmt::Write + 'a), is_emitting_map_key: bool, } @@ -461,46 +468,74 @@ impl<'a> Encoder<'a> { /// Creates a new JSON encoder whose output will be written to the writer /// specified. pub fn new(writer: &'a mut dyn fmt::Write) -> Encoder<'a> { - Encoder { writer, is_emitting_map_key: false, } + Encoder { writer, is_emitting_map_key: false } } } macro_rules! emit_enquoted_if_mapkey { - ($enc:ident,$e:expr) => ({ + ($enc:ident,$e:expr) => {{ if $enc.is_emitting_map_key { write!($enc.writer, "\"{}\"", $e)?; } else { write!($enc.writer, "{}", $e)?; } Ok(()) - }) + }}; } impl<'a> crate::Encoder for Encoder<'a> { type Error = EncoderError; fn emit_unit(&mut self) -> EncodeResult { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } write!(self.writer, "null")?; Ok(()) } - fn emit_usize(&mut self, v: usize) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u128(&mut self, v: u128) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u64(&mut self, v: u64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u32(&mut self, v: u32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u16(&mut self, v: u16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u8(&mut self, v: u8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } + fn emit_usize(&mut self, v: usize) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u128(&mut self, v: u128) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u64(&mut self, v: u64) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u32(&mut self, v: u32) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u16(&mut self, v: u16) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u8(&mut self, v: u8) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } - fn emit_isize(&mut self, v: isize) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i128(&mut self, v: i128) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i64(&mut self, v: i64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i32(&mut self, v: i32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i16(&mut self, v: i16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i8(&mut self, v: i8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } + fn emit_isize(&mut self, v: isize) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i128(&mut self, v: i128) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i64(&mut self, v: i64) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i32(&mut self, v: i32) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i16(&mut self, v: i16) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i8(&mut self, v: i8) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } fn emit_bool(&mut self, v: bool) -> EncodeResult { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if v { write!(self.writer, "true")?; } else { @@ -523,17 +558,15 @@ impl<'a> crate::Encoder for Encoder<'a> { escape_str(self.writer, v) } - fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where + fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { f(self) } - fn emit_enum_variant<F>(&mut self, - name: &str, - _id: usize, - cnt: usize, - f: F) -> EncodeResult where + fn emit_enum_variant<F>(&mut self, name: &str, _id: usize, cnt: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { // enums are encoded as strings or objects @@ -542,7 +575,9 @@ impl<'a> crate::Encoder for Encoder<'a> { if cnt == 0 { escape_str(self.writer, name) } else { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } write!(self.writer, "{{\"variant\":")?; escape_str(self.writer, name)?; write!(self.writer, ",\"fields\":[")?; @@ -552,145 +587,198 @@ impl<'a> crate::Encoder for Encoder<'a> { } } - fn emit_enum_variant_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_enum_variant_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if idx != 0 { write!(self.writer, ",")?; } f(self) } - fn emit_enum_struct_variant<F>(&mut self, - name: &str, - id: usize, - cnt: usize, - f: F) -> EncodeResult where + fn emit_enum_struct_variant<F>( + &mut self, + name: &str, + id: usize, + cnt: usize, + f: F, + ) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_enum_variant(name, id, cnt, f) } - fn emit_enum_struct_variant_field<F>(&mut self, - _: &str, - idx: usize, - f: F) -> EncodeResult where + fn emit_enum_struct_variant_field<F>(&mut self, _: &str, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_enum_variant_arg(idx, f) } - fn emit_struct<F>(&mut self, _: &str, _: usize, f: F) -> EncodeResult where + fn emit_struct<F>(&mut self, _: &str, _: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } write!(self.writer, "{{")?; f(self)?; write!(self.writer, "}}")?; Ok(()) } - fn emit_struct_field<F>(&mut self, name: &str, idx: usize, f: F) -> EncodeResult where + fn emit_struct_field<F>(&mut self, name: &str, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } - if idx != 0 { write!(self.writer, ",")?; } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } + if idx != 0 { + write!(self.writer, ",")?; + } escape_str(self.writer, name)?; write!(self.writer, ":")?; f(self) } - fn emit_tuple<F>(&mut self, len: usize, f: F) -> EncodeResult where + fn emit_tuple<F>(&mut self, len: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_seq(len, f) } - fn emit_tuple_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_tuple_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_seq_elt(idx, f) } - fn emit_tuple_struct<F>(&mut self, _name: &str, len: usize, f: F) -> EncodeResult where + fn emit_tuple_struct<F>(&mut self, _name: &str, len: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_seq(len, f) } - fn emit_tuple_struct_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_tuple_struct_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_seq_elt(idx, f) } - fn emit_option<F>(&mut self, f: F) -> EncodeResult where + fn emit_option<F>(&mut self, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } f(self) } fn emit_option_none(&mut self) -> EncodeResult { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_unit() } - fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where + fn emit_option_some<F>(&mut self, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } f(self) } - fn emit_seq<F>(&mut self, _len: usize, f: F) -> EncodeResult where + fn emit_seq<F>(&mut self, _len: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } write!(self.writer, "[")?; f(self)?; write!(self.writer, "]")?; Ok(()) } - fn emit_seq_elt<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_seq_elt<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if idx != 0 { write!(self.writer, ",")?; } f(self) } - fn emit_map<F>(&mut self, _len: usize, f: F) -> EncodeResult where + fn emit_map<F>(&mut self, _len: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } write!(self.writer, "{{")?; f(self)?; write!(self.writer, "}}")?; Ok(()) } - fn emit_map_elt_key<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_map_elt_key<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } - if idx != 0 { write!(self.writer, ",")? } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } + if idx != 0 { + write!(self.writer, ",")? + } self.is_emitting_map_key = true; f(self)?; self.is_emitting_map_key = false; Ok(()) } - fn emit_map_elt_val<F>(&mut self, _idx: usize, f: F) -> EncodeResult where + fn emit_map_elt_val<F>(&mut self, _idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } write!(self.writer, ":")?; f(self) } @@ -699,7 +787,7 @@ impl<'a> crate::Encoder for Encoder<'a> { /// Another encoder for JSON, but prints out human-readable JSON instead of /// compact data pub struct PrettyEncoder<'a> { - writer: &'a mut (dyn fmt::Write+'a), + writer: &'a mut (dyn fmt::Write + 'a), curr_indent: usize, indent: usize, is_emitting_map_key: bool, @@ -708,12 +796,7 @@ pub struct PrettyEncoder<'a> { impl<'a> PrettyEncoder<'a> { /// Creates a new encoder whose output will be written to the specified writer pub fn new(writer: &'a mut dyn fmt::Write) -> PrettyEncoder<'a> { - PrettyEncoder { - writer, - curr_indent: 0, - indent: 2, - is_emitting_map_key: false, - } + PrettyEncoder { writer, curr_indent: 0, indent: 2, is_emitting_map_key: false } } /// Sets the number of spaces to indent for each level. @@ -730,27 +813,55 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { type Error = EncoderError; fn emit_unit(&mut self) -> EncodeResult { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } write!(self.writer, "null")?; Ok(()) } - fn emit_usize(&mut self, v: usize) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u128(&mut self, v: u128) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u64(&mut self, v: u64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u32(&mut self, v: u32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u16(&mut self, v: u16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_u8(&mut self, v: u8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } + fn emit_usize(&mut self, v: usize) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u128(&mut self, v: u128) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u64(&mut self, v: u64) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u32(&mut self, v: u32) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u16(&mut self, v: u16) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_u8(&mut self, v: u8) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } - fn emit_isize(&mut self, v: isize) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i128(&mut self, v: i128) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i64(&mut self, v: i64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i32(&mut self, v: i32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i16(&mut self, v: i16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } - fn emit_i8(&mut self, v: i8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) } + fn emit_isize(&mut self, v: isize) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i128(&mut self, v: i128) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i64(&mut self, v: i64) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i32(&mut self, v: i32) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i16(&mut self, v: i16) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } + fn emit_i8(&mut self, v: i8) -> EncodeResult { + emit_enquoted_if_mapkey!(self, v) + } fn emit_bool(&mut self, v: bool) -> EncodeResult { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if v { write!(self.writer, "true")?; } else { @@ -773,24 +884,23 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { escape_str(self.writer, v) } - fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where + fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { f(self) } - fn emit_enum_variant<F>(&mut self, - name: &str, - _id: usize, - cnt: usize, - f: F) - -> EncodeResult where + fn emit_enum_variant<F>(&mut self, name: &str, _id: usize, cnt: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { if cnt == 0 { escape_str(self.writer, name) } else { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } writeln!(self.writer, "{{")?; self.curr_indent += self.indent; spaces(self.writer, self.curr_indent)?; @@ -812,10 +922,13 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { } } - fn emit_enum_variant_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_enum_variant_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if idx != 0 { writeln!(self.writer, ",")?; } @@ -823,32 +936,39 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { f(self) } - fn emit_enum_struct_variant<F>(&mut self, - name: &str, - id: usize, - cnt: usize, - f: F) -> EncodeResult where + fn emit_enum_struct_variant<F>( + &mut self, + name: &str, + id: usize, + cnt: usize, + f: F, + ) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_enum_variant(name, id, cnt, f) } - fn emit_enum_struct_variant_field<F>(&mut self, - _: &str, - idx: usize, - f: F) -> EncodeResult where + fn emit_enum_struct_variant_field<F>(&mut self, _: &str, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_enum_variant_arg(idx, f) } - - fn emit_struct<F>(&mut self, _: &str, len: usize, f: F) -> EncodeResult where + fn emit_struct<F>(&mut self, _: &str, len: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if len == 0 { write!(self.writer, "{{}}")?; } else { @@ -863,10 +983,13 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { Ok(()) } - fn emit_struct_field<F>(&mut self, name: &str, idx: usize, f: F) -> EncodeResult where + fn emit_struct_field<F>(&mut self, name: &str, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if idx == 0 { writeln!(self.writer)?; } else { @@ -878,53 +1001,76 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { f(self) } - fn emit_tuple<F>(&mut self, len: usize, f: F) -> EncodeResult where + fn emit_tuple<F>(&mut self, len: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_seq(len, f) } - fn emit_tuple_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_tuple_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_seq_elt(idx, f) } - fn emit_tuple_struct<F>(&mut self, _: &str, len: usize, f: F) -> EncodeResult where + fn emit_tuple_struct<F>(&mut self, _: &str, len: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_seq(len, f) } - fn emit_tuple_struct_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_tuple_struct_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_seq_elt(idx, f) } - fn emit_option<F>(&mut self, f: F) -> EncodeResult where + fn emit_option<F>(&mut self, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } f(self) } fn emit_option_none(&mut self) -> EncodeResult { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } self.emit_unit() } - fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where + fn emit_option_some<F>(&mut self, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } f(self) } - fn emit_seq<F>(&mut self, len: usize, f: F) -> EncodeResult where + fn emit_seq<F>(&mut self, len: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if len == 0 { write!(self.writer, "[]")?; } else { @@ -939,10 +1085,13 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { Ok(()) } - fn emit_seq_elt<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_seq_elt<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if idx == 0 { writeln!(self.writer)?; } else { @@ -952,10 +1101,13 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { f(self) } - fn emit_map<F>(&mut self, len: usize, f: F) -> EncodeResult where + fn emit_map<F>(&mut self, len: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if len == 0 { write!(self.writer, "{{}}")?; } else { @@ -970,10 +1122,13 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { Ok(()) } - fn emit_map_elt_key<F>(&mut self, idx: usize, f: F) -> EncodeResult where + fn emit_map_elt_key<F>(&mut self, idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } if idx == 0 { writeln!(self.writer)?; } else { @@ -986,10 +1141,13 @@ impl<'a> crate::Encoder for PrettyEncoder<'a> { Ok(()) } - fn emit_map_elt_val<F>(&mut self, _idx: usize, f: F) -> EncodeResult where + fn emit_map_elt_val<F>(&mut self, _idx: usize, f: F) -> EncodeResult + where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } + if self.is_emitting_map_key { + return Err(EncoderError::BadHashmapKey); + } write!(self.writer, ": ")?; f(self) } @@ -1029,19 +1187,19 @@ impl Json { PrettyJson { inner: self } } - /// If the Json value is an Object, returns the value associated with the provided key. + /// If the Json value is an Object, returns the value associated with the provided key. /// Otherwise, returns None. pub fn find(&self, key: &str) -> Option<&Json> { match *self { Json::Object(ref map) => map.get(key), - _ => None + _ => None, } } /// Attempts to get a nested Json Object for each key in `keys`. /// If any key is found not to exist, `find_path` will return `None`. /// Otherwise, it will return the Json value associated with the final key. - pub fn find_path<'a>(&'a self, keys: &[&str]) -> Option<&'a Json>{ + pub fn find_path<'a>(&'a self, keys: &[&str]) -> Option<&'a Json> { let mut target = self; for key in keys { target = target.find(*key)?; @@ -1054,21 +1212,19 @@ impl Json { /// or the Json value is not an Object, returns `None`. pub fn search(&self, key: &str) -> Option<&Json> { match *self { - Json::Object(ref map) => { - match map.get(key) { - Some(json_value) => Some(json_value), - None => { - for v in map.values() { - match v.search(key) { - x if x.is_some() => return x, - _ => () - } + Json::Object(ref map) => match map.get(key) { + Some(json_value) => Some(json_value), + None => { + for v in map.values() { + match v.search(key) { + x if x.is_some() => return x, + _ => (), } - None } + None } }, - _ => None + _ => None, } } @@ -1082,7 +1238,7 @@ impl Json { pub fn as_object(&self) -> Option<&Object> { match *self { Json::Object(ref map) => Some(map), - _ => None + _ => None, } } @@ -1096,7 +1252,7 @@ impl Json { pub fn as_array(&self) -> Option<&Array> { match *self { Json::Array(ref array) => Some(&*array), - _ => None + _ => None, } } @@ -1110,7 +1266,7 @@ impl Json { pub fn as_string(&self) -> Option<&str> { match *self { Json::String(ref s) => Some(&s[..]), - _ => None + _ => None, } } @@ -1152,7 +1308,7 @@ impl Json { match *self { Json::I64(n) => Some(n), Json::U64(n) => Some(n as i64), - _ => None + _ => None, } } @@ -1162,7 +1318,7 @@ impl Json { match *self { Json::I64(n) => Some(n as u64), Json::U64(n) => Some(n), - _ => None + _ => None, } } @@ -1173,7 +1329,7 @@ impl Json { Json::I64(n) => Some(n as f64), Json::U64(n) => Some(n as f64), Json::F64(n) => Some(n), - _ => None + _ => None, } } @@ -1187,7 +1343,7 @@ impl Json { pub fn as_boolean(&self) -> Option<bool> { match *self { Json::Boolean(b) => Some(b), - _ => None + _ => None, } } @@ -1201,12 +1357,12 @@ impl Json { pub fn as_null(&self) -> Option<()> { match *self { Json::Null => Some(()), - _ => None + _ => None, } } } -impl<'a> Index<&'a str> for Json { +impl<'a> Index<&'a str> for Json { type Output = Json; fn index(&self, idx: &'a str) -> &Json { @@ -1220,7 +1376,7 @@ impl Index<usize> for Json { fn index(&self, idx: usize) -> &Json { match *self { Json::Array(ref v) => &v[idx], - _ => panic!("can only index Json with usize if it is an array") + _ => panic!("can only index Json with usize if it is an array"), } } } @@ -1291,10 +1447,14 @@ impl Stack { } /// Returns The number of elements in the Stack. - pub fn len(&self) -> usize { self.stack.len() } + pub fn len(&self) -> usize { + self.stack.len() + } /// Returns `true` if the stack is empty. - pub fn is_empty(&self) -> bool { self.stack.is_empty() } + pub fn is_empty(&self) -> bool { + self.stack.is_empty() + } /// Provides access to the StackElement at a given index. /// lower indices are at the bottom of the stack while higher indices are @@ -1302,19 +1462,22 @@ impl Stack { pub fn get(&self, idx: usize) -> StackElement<'_> { match self.stack[idx] { InternalIndex(i) => StackElement::Index(i), - InternalKey(start, size) => { - StackElement::Key(str::from_utf8( - &self.str_buffer[start as usize .. start as usize + size as usize]) - .unwrap()) - } + InternalKey(start, size) => StackElement::Key( + str::from_utf8(&self.str_buffer[start as usize..start as usize + size as usize]) + .unwrap(), + ), } } /// Compares this stack with an array of StackElement<'_>s. pub fn is_equal_to(&self, rhs: &[StackElement<'_>]) -> bool { - if self.stack.len() != rhs.len() { return false; } + if self.stack.len() != rhs.len() { + return false; + } for (i, r) in rhs.iter().enumerate() { - if self.get(i) != *r { return false; } + if self.get(i) != *r { + return false; + } } true } @@ -1322,9 +1485,13 @@ impl Stack { /// Returns `true` if the bottom-most elements of this stack are the same as /// the ones passed as parameter. pub fn starts_with(&self, rhs: &[StackElement<'_>]) -> bool { - if self.stack.len() < rhs.len() { return false; } + if self.stack.len() < rhs.len() { + return false; + } for (i, r) in rhs.iter().enumerate() { - if self.get(i) != *r { return false; } + if self.get(i) != *r { + return false; + } } true } @@ -1332,10 +1499,14 @@ impl Stack { /// Returns `true` if the top-most elements of this stack are the same as /// the ones passed as parameter. pub fn ends_with(&self, rhs: &[StackElement<'_>]) -> bool { - if self.stack.len() < rhs.len() { return false; } + if self.stack.len() < rhs.len() { + return false; + } let offset = self.stack.len() - rhs.len(); for (i, r) in rhs.iter().enumerate() { - if self.get(i + offset) != *r { return false; } + if self.get(i + offset) != *r { + return false; + } } true } @@ -1345,11 +1516,9 @@ impl Stack { match self.stack.last() { None => None, Some(&InternalIndex(i)) => Some(StackElement::Index(i)), - Some(&InternalKey(start, size)) => { - Some(StackElement::Key(str::from_utf8( - &self.str_buffer[start as usize .. (start+size) as usize] - ).unwrap())) - } + Some(&InternalKey(start, size)) => Some(StackElement::Key( + str::from_utf8(&self.str_buffer[start as usize..(start + size) as usize]).unwrap(), + )), } } @@ -1389,8 +1558,10 @@ impl Stack { fn bump_index(&mut self) { let len = self.stack.len(); let idx = match *self.stack.last().unwrap() { - InternalIndex(i) => { i + 1 } - _ => { panic!(); } + InternalIndex(i) => i + 1, + _ => { + panic!(); + } }; self.stack[len - 1] = InternalIndex(idx); } @@ -1410,7 +1581,7 @@ pub struct Parser<T> { state: ParserState, } -impl<T: Iterator<Item=char>> Iterator for Parser<T> { +impl<T: Iterator<Item = char>> Iterator for Parser<T> { type Item = JsonEvent; fn next(&mut self) -> Option<JsonEvent> { @@ -1433,7 +1604,7 @@ impl<T: Iterator<Item=char>> Iterator for Parser<T> { } } -impl<T: Iterator<Item=char>> Parser<T> { +impl<T: Iterator<Item = char>> Parser<T> { /// Creates the JSON parser. pub fn new(rdr: T) -> Parser<T> { let mut p = Parser { @@ -1454,8 +1625,12 @@ impl<T: Iterator<Item=char>> Parser<T> { &self.stack } - fn eof(&self) -> bool { self.ch.is_none() } - fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') } + fn eof(&self) -> bool { + self.ch.is_none() + } + fn ch_or_null(&self) -> char { + self.ch.unwrap_or('\x00') + } fn bump(&mut self) { self.ch = self.rdr.next(); @@ -1480,10 +1655,9 @@ impl<T: Iterator<Item=char>> Parser<T> { } fn parse_whitespace(&mut self) { - while self.ch_is(' ') || - self.ch_is('\n') || - self.ch_is('\t') || - self.ch_is('\r') { self.bump(); } + while self.ch_is(' ') || self.ch_is('\n') || self.ch_is('\t') || self.ch_is('\r') { + self.bump(); + } } fn parse_number(&mut self) -> JsonEvent { @@ -1496,7 +1670,9 @@ impl<T: Iterator<Item=char>> Parser<T> { let res = match self.parse_u64() { Ok(res) => res, - Err(e) => { return Error(e); } + Err(e) => { + return Error(e); + } }; if self.ch_is('.') || self.ch_is('e') || self.ch_is('E') { @@ -1505,14 +1681,18 @@ impl<T: Iterator<Item=char>> Parser<T> { if self.ch_is('.') { res = match self.parse_decimal(res) { Ok(res) => res, - Err(e) => { return Error(e); } + Err(e) => { + return Error(e); + } }; } if self.ch_is('e') || self.ch_is('E') { res = match self.parse_exponent(res) { Ok(res) => res, - Err(e) => { return Error(e); } + Err(e) => { + return Error(e); + } }; } @@ -1544,19 +1724,21 @@ impl<T: Iterator<Item=char>> Parser<T> { self.bump(); // A leading '0' must be the only digit before the decimal point. - if let '0' ..= '9' = self.ch_or_null() { - return self.error(InvalidNumber) + if let '0'..='9' = self.ch_or_null() { + return self.error(InvalidNumber); } - }, - '1' ..= '9' => { + } + '1'..='9' => { while !self.eof() { match self.ch_or_null() { - c @ '0' ..= '9' => { + c @ '0'..='9' => { accum = accum.wrapping_mul(10); accum = accum.wrapping_add((c as u64) - ('0' as u64)); // Detect overflow by comparing to the last value. - if accum <= last_accum { return self.error(InvalidNumber); } + if accum <= last_accum { + return self.error(InvalidNumber); + } self.bump(); } @@ -1575,14 +1757,14 @@ impl<T: Iterator<Item=char>> Parser<T> { // Make sure a digit follows the decimal place. match self.ch_or_null() { - '0' ..= '9' => (), - _ => return self.error(InvalidNumber) + '0'..='9' => (), + _ => return self.error(InvalidNumber), } let mut dec = 1.0; while !self.eof() { match self.ch_or_null() { - c @ '0' ..= '9' => { + c @ '0'..='9' => { dec /= 10.0; res += (((c as isize) - ('0' as isize)) as f64) * dec; self.bump(); @@ -1609,18 +1791,18 @@ impl<T: Iterator<Item=char>> Parser<T> { // Make sure a digit follows the exponent place. match self.ch_or_null() { - '0' ..= '9' => (), - _ => return self.error(InvalidNumber) + '0'..='9' => (), + _ => return self.error(InvalidNumber), } while !self.eof() { match self.ch_or_null() { - c @ '0' ..= '9' => { + c @ '0'..='9' => { exp *= 10; exp += (c as usize) - ('0' as usize); self.bump(); } - _ => break + _ => break, } } @@ -1640,14 +1822,14 @@ impl<T: Iterator<Item=char>> Parser<T> { while i < 4 && !self.eof() { self.bump(); n = match self.ch_or_null() { - c @ '0' ..= '9' => n * 16 + ((c as u16) - ('0' as u16)), + c @ '0'..='9' => n * 16 + ((c as u16) - ('0' as u16)), 'a' | 'A' => n * 16 + 10, 'b' | 'B' => n * 16 + 11, 'c' | 'C' => n * 16 + 12, 'd' | 'D' => n * 16 + 13, 'e' | 'E' => n * 16 + 14, 'f' | 'F' => n * 16 + 15, - _ => return self.error(InvalidEscape) + _ => return self.error(InvalidEscape), }; i += 1; @@ -1682,13 +1864,11 @@ impl<T: Iterator<Item=char>> Parser<T> { 'r' => res.push('\r'), 't' => res.push('\t'), 'u' => match self.decode_hex_escape()? { - 0xDC00 ..= 0xDFFF => { - return self.error(LoneLeadingSurrogateInHexEscape) - } + 0xDC00..=0xDFFF => return self.error(LoneLeadingSurrogateInHexEscape), // Non-BMP characters are encoded as a sequence of // two hex escapes, representing UTF-16 surrogates. - n1 @ 0xD800 ..= 0xDBFF => { + n1 @ 0xD800..=0xDBFF => { match (self.next_char(), self.next_char()) { (Some('\\'), Some('u')) => (), _ => return self.error(UnexpectedEndOfHexEscape), @@ -1696,10 +1876,10 @@ impl<T: Iterator<Item=char>> Parser<T> { let n2 = self.decode_hex_escape()?; if n2 < 0xDC00 || n2 > 0xDFFF { - return self.error(LoneLeadingSurrogateInHexEscape) + return self.error(LoneLeadingSurrogateInHexEscape); } - let c = (u32::from(n1 - 0xD800) << 10 | - u32::from(n2 - 0xDC00)) + 0x1_0000; + let c = + (u32::from(n1 - 0xD800) << 10 | u32::from(n2 - 0xDC00)) + 0x1_0000; res.push(char::from_u32(c).unwrap()); } @@ -1718,9 +1898,9 @@ impl<T: Iterator<Item=char>> Parser<T> { Some('"') => { self.bump(); return Ok(res); - }, + } Some(c) => res.push(c), - None => unreachable!() + None => unreachable!(), } } } @@ -1910,12 +2090,14 @@ impl<T: Iterator<Item=char>> Parser<T> { } fn parse_value(&mut self) -> JsonEvent { - if self.eof() { return self.error_event(EOFWhileParsingValue); } + if self.eof() { + return self.error_event(EOFWhileParsingValue); + } match self.ch_or_null() { - 'n' => { self.parse_ident("ull", NullValue) } - 't' => { self.parse_ident("rue", BooleanValue(true)) } - 'f' => { self.parse_ident("alse", BooleanValue(false)) } - '0' ..= '9' | '-' => self.parse_number(), + 'n' => self.parse_ident("ull", NullValue), + 't' => self.parse_ident("rue", BooleanValue(true)), + 'f' => self.parse_ident("alse", BooleanValue(false)), + '0'..='9' | '-' => self.parse_number(), '"' => match self.parse_str() { Ok(s) => StringValue(s), Err(e) => Error(e), @@ -1928,7 +2110,7 @@ impl<T: Iterator<Item=char>> Parser<T> { self.bump(); ObjectStart } - _ => { self.error_event(InvalidSyntax) } + _ => self.error_event(InvalidSyntax), } } @@ -1953,10 +2135,10 @@ pub struct Builder<T> { token: Option<JsonEvent>, } -impl<T: Iterator<Item=char>> Builder<T> { +impl<T: Iterator<Item = char>> Builder<T> { /// Creates a JSON Builder. pub fn new(src: T) -> Builder<T> { - Builder { parser: Parser::new(src), token: None, } + Builder { parser: Parser::new(src), token: None } } // Decode a Json value from a Parser. @@ -1966,8 +2148,12 @@ impl<T: Iterator<Item=char>> Builder<T> { self.bump(); match self.token { None => {} - Some(Error(ref e)) => { return Err(e.clone()); } - ref tok => { panic!("unexpected token {:?}", tok.clone()); } + Some(Error(ref e)) => { + return Err(e.clone()); + } + ref tok => { + panic!("unexpected token {:?}", tok.clone()); + } } result } @@ -2007,7 +2193,7 @@ impl<T: Iterator<Item=char>> Builder<T> { } match self.build_value() { Ok(v) => values.push(v), - Err(e) => { return Err(e) } + Err(e) => return Err(e), } self.bump(); } @@ -2020,18 +2206,30 @@ impl<T: Iterator<Item=char>> Builder<T> { loop { match self.token { - Some(ObjectEnd) => { return Ok(Json::Object(values)); } - Some(Error(ref e)) => { return Err(e.clone()); } - None => { break; } + Some(ObjectEnd) => { + return Ok(Json::Object(values)); + } + Some(Error(ref e)) => { + return Err(e.clone()); + } + None => { + break; + } _ => {} } let key = match self.parser.stack().top() { - Some(StackElement::Key(k)) => { k.to_owned() } - _ => { panic!("invalid state"); } + Some(StackElement::Key(k)) => k.to_owned(), + _ => { + panic!("invalid state"); + } }; match self.build_value() { - Ok(value) => { values.insert(key, value); } - Err(e) => { return Err(e); } + Ok(value) => { + values.insert(key, value); + } + Err(e) => { + return Err(e); + } } self.bump(); } @@ -2043,12 +2241,12 @@ impl<T: Iterator<Item=char>> Builder<T> { pub fn from_reader(rdr: &mut dyn Read) -> Result<Json, BuilderError> { let mut contents = Vec::new(); match rdr.read_to_end(&mut contents) { - Ok(c) => c, - Err(e) => return Err(io_error_to_error(e)) + Ok(c) => c, + Err(e) => return Err(io_error_to_error(e)), }; let s = match str::from_utf8(&contents).ok() { Some(s) => s, - _ => return Err(SyntaxError(NotUtf8, 0, 0)) + _ => return Err(SyntaxError(NotUtf8, 0, 0)), }; let mut builder = Builder::new(s.chars()); builder.build() @@ -2077,22 +2275,18 @@ impl Decoder { } macro_rules! expect { - ($e:expr, Null) => ({ + ($e:expr, Null) => {{ match $e { Json::Null => Ok(()), - other => Err(ExpectedError("Null".to_owned(), - other.to_string())) + other => Err(ExpectedError("Null".to_owned(), other.to_string())), } - }); - ($e:expr, $t:ident) => ({ + }}; + ($e:expr, $t:ident) => {{ match $e { Json::$t(v) => Ok(v), - other => { - Err(ExpectedError(stringify!($t).to_owned(), - other.to_string())) - } + other => Err(ExpectedError(stringify!($t).to_owned(), other.to_string())), } - }) + }}; } macro_rules! read_primitive { @@ -2134,7 +2328,9 @@ impl crate::Decoder for Decoder { read_primitive! { read_i64, i64 } read_primitive! { read_i128, i128 } - fn read_f32(&mut self) -> DecodeResult<f32> { self.read_f64().map(|x| x as f32) } + fn read_f32(&mut self) -> DecodeResult<f32> { + self.read_f64().map(|x| x as f32) + } fn read_f64(&mut self) -> DecodeResult<f64> { match self.pop() { @@ -2148,9 +2344,9 @@ impl crate::Decoder for Decoder { Some(f) => Ok(f), None => Err(ExpectedError("Number".to_owned(), s)), } - }, + } Json::Null => Ok(f64::NAN), - value => Err(ExpectedError("Number".to_owned(), value.to_string())) + value => Err(ExpectedError("Number".to_owned(), value.to_string())), } } @@ -2174,76 +2370,71 @@ impl crate::Decoder for Decoder { expect!(self.pop(), String).map(Cow::Owned) } - fn read_enum<T, F>(&mut self, _name: &str, f: F) -> DecodeResult<T> where + fn read_enum<T, F>(&mut self, _name: &str, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { f(self) } - fn read_enum_variant<T, F>(&mut self, names: &[&str], - mut f: F) -> DecodeResult<T> - where F: FnMut(&mut Decoder, usize) -> DecodeResult<T>, + fn read_enum_variant<T, F>(&mut self, names: &[&str], mut f: F) -> DecodeResult<T> + where + F: FnMut(&mut Decoder, usize) -> DecodeResult<T>, { let name = match self.pop() { Json::String(s) => s, Json::Object(mut o) => { let n = match o.remove(&"variant".to_owned()) { Some(Json::String(s)) => s, - Some(val) => { - return Err(ExpectedError("String".to_owned(), val.to_string())) - } - None => { - return Err(MissingFieldError("variant".to_owned())) - } + Some(val) => return Err(ExpectedError("String".to_owned(), val.to_string())), + None => return Err(MissingFieldError("variant".to_owned())), }; match o.remove(&"fields".to_string()) { Some(Json::Array(l)) => { self.stack.extend(l.into_iter().rev()); - }, - Some(val) => { - return Err(ExpectedError("Array".to_owned(), val.to_string())) - } - None => { - return Err(MissingFieldError("fields".to_owned())) } + Some(val) => return Err(ExpectedError("Array".to_owned(), val.to_string())), + None => return Err(MissingFieldError("fields".to_owned())), } n } - json => { - return Err(ExpectedError("String or Object".to_owned(), json.to_string())) - } + json => return Err(ExpectedError("String or Object".to_owned(), json.to_string())), }; let idx = match names.iter().position(|n| *n == &name[..]) { Some(idx) => idx, - None => return Err(UnknownVariantError(name)) + None => return Err(UnknownVariantError(name)), }; f(self, idx) } - fn read_enum_variant_arg<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where + fn read_enum_variant_arg<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { f(self) } - fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) -> DecodeResult<T> where + fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) -> DecodeResult<T> + where F: FnMut(&mut Decoder, usize) -> DecodeResult<T>, { self.read_enum_variant(names, f) } - - fn read_enum_struct_variant_field<T, F>(&mut self, - _name: &str, - idx: usize, - f: F) - -> DecodeResult<T> where + fn read_enum_struct_variant_field<T, F>( + &mut self, + _name: &str, + idx: usize, + f: F, + ) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { self.read_enum_variant_arg(idx, f) } - fn read_struct<T, F>(&mut self, _name: &str, _len: usize, f: F) -> DecodeResult<T> where + fn read_struct<T, F>(&mut self, _name: &str, _len: usize, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { let value = f(self)?; @@ -2251,11 +2442,8 @@ impl crate::Decoder for Decoder { Ok(value) } - fn read_struct_field<T, F>(&mut self, - name: &str, - _idx: usize, - f: F) - -> DecodeResult<T> where + fn read_struct_field<T, F>(&mut self, name: &str, _idx: usize, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { let mut obj = expect!(self.pop(), Object)?; @@ -2269,7 +2457,7 @@ impl crate::Decoder for Decoder { Ok(x) => x, Err(_) => return Err(MissingFieldError(name.to_string())), } - }, + } Some(json) => { self.stack.push(json); f(self)? @@ -2279,7 +2467,8 @@ impl crate::Decoder for Decoder { Ok(value) } - fn read_tuple<T, F>(&mut self, tuple_len: usize, f: F) -> DecodeResult<T> where + fn read_tuple<T, F>(&mut self, tuple_len: usize, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { self.read_seq(move |d, len| { @@ -2291,41 +2480,42 @@ impl crate::Decoder for Decoder { }) } - fn read_tuple_arg<T, F>(&mut self, idx: usize, f: F) -> DecodeResult<T> where + fn read_tuple_arg<T, F>(&mut self, idx: usize, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { self.read_seq_elt(idx, f) } - fn read_tuple_struct<T, F>(&mut self, - _name: &str, - len: usize, - f: F) - -> DecodeResult<T> where + fn read_tuple_struct<T, F>(&mut self, _name: &str, len: usize, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { self.read_tuple(len, f) } - fn read_tuple_struct_arg<T, F>(&mut self, - idx: usize, - f: F) - -> DecodeResult<T> where + fn read_tuple_struct_arg<T, F>(&mut self, idx: usize, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { self.read_tuple_arg(idx, f) } - fn read_option<T, F>(&mut self, mut f: F) -> DecodeResult<T> where + fn read_option<T, F>(&mut self, mut f: F) -> DecodeResult<T> + where F: FnMut(&mut Decoder, bool) -> DecodeResult<T>, { match self.pop() { Json::Null => f(self, false), - value => { self.stack.push(value); f(self, true) } + value => { + self.stack.push(value); + f(self, true) + } } } - fn read_seq<T, F>(&mut self, f: F) -> DecodeResult<T> where + fn read_seq<T, F>(&mut self, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder, usize) -> DecodeResult<T>, { let array = expect!(self.pop(), Array)?; @@ -2334,13 +2524,15 @@ impl crate::Decoder for Decoder { f(self, len) } - fn read_seq_elt<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where + fn read_seq_elt<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder) -> DecodeResult<T>, { f(self) } - fn read_map<T, F>(&mut self, f: F) -> DecodeResult<T> where + fn read_map<T, F>(&mut self, f: F) -> DecodeResult<T> + where F: FnOnce(&mut Decoder, usize) -> DecodeResult<T>, { let obj = expect!(self.pop(), Object)?; @@ -2352,14 +2544,16 @@ impl crate::Decoder for Decoder { f(self, len) } - fn read_map_elt_key<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where - F: FnOnce(&mut Decoder) -> DecodeResult<T>, + fn read_map_elt_key<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> + where + F: FnOnce(&mut Decoder) -> DecodeResult<T>, { f(self) } - fn read_map_elt_val<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where - F: FnOnce(&mut Decoder) -> DecodeResult<T>, + fn read_map_elt_val<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> + where + F: FnOnce(&mut Decoder) -> DecodeResult<T>, { f(self) } @@ -2400,36 +2594,48 @@ macro_rules! to_json_impl_u64 { to_json_impl_u64! { usize, u8, u16, u32, u64 } impl ToJson for Json { - fn to_json(&self) -> Json { self.clone() } + fn to_json(&self) -> Json { + self.clone() + } } impl ToJson for f32 { - fn to_json(&self) -> Json { f64::from(*self).to_json() } + fn to_json(&self) -> Json { + f64::from(*self).to_json() + } } impl ToJson for f64 { fn to_json(&self) -> Json { match self.classify() { Fp::Nan | Fp::Infinite => Json::Null, - _ => Json::F64(*self) + _ => Json::F64(*self), } } } impl ToJson for () { - fn to_json(&self) -> Json { Json::Null } + fn to_json(&self) -> Json { + Json::Null + } } impl ToJson for bool { - fn to_json(&self) -> Json { Json::Boolean(*self) } + fn to_json(&self) -> Json { + Json::Boolean(*self) + } } impl ToJson for str { - fn to_json(&self) -> Json { Json::String(self.to_string()) } + fn to_json(&self) -> Json { + Json::String(self.to_string()) + } } impl ToJson for string::String { - fn to_json(&self) -> Json { Json::String((*self).clone()) } + fn to_json(&self) -> Json { + Json::String((*self).clone()) + } } macro_rules! tuple_impl { @@ -2451,25 +2657,29 @@ macro_rules! tuple_impl { } } -tuple_impl!{A} -tuple_impl!{A, B} -tuple_impl!{A, B, C} -tuple_impl!{A, B, C, D} -tuple_impl!{A, B, C, D, E} -tuple_impl!{A, B, C, D, E, F} -tuple_impl!{A, B, C, D, E, F, G} -tuple_impl!{A, B, C, D, E, F, G, H} -tuple_impl!{A, B, C, D, E, F, G, H, I} -tuple_impl!{A, B, C, D, E, F, G, H, I, J} -tuple_impl!{A, B, C, D, E, F, G, H, I, J, K} -tuple_impl!{A, B, C, D, E, F, G, H, I, J, K, L} +tuple_impl! {A} +tuple_impl! {A, B} +tuple_impl! {A, B, C} +tuple_impl! {A, B, C, D} +tuple_impl! {A, B, C, D, E} +tuple_impl! {A, B, C, D, E, F} +tuple_impl! {A, B, C, D, E, F, G} +tuple_impl! {A, B, C, D, E, F, G, H} +tuple_impl! {A, B, C, D, E, F, G, H, I} +tuple_impl! {A, B, C, D, E, F, G, H, I, J} +tuple_impl! {A, B, C, D, E, F, G, H, I, J, K} +tuple_impl! {A, B, C, D, E, F, G, H, I, J, K, L} impl<A: ToJson> ToJson for [A] { - fn to_json(&self) -> Json { Json::Array(self.iter().map(|elt| elt.to_json()).collect()) } + fn to_json(&self) -> Json { + Json::Array(self.iter().map(|elt| elt.to_json()).collect()) + } } impl<A: ToJson> ToJson for Vec<A> { - fn to_json(&self) -> Json { Json::Array(self.iter().map(|elt| elt.to_json()).collect()) } + fn to_json(&self) -> Json { + Json::Array(self.iter().map(|elt| elt.to_json()).collect()) + } } impl<A: ToJson> ToJson for BTreeMap<string::String, A> { @@ -2492,11 +2702,11 @@ impl<A: ToJson> ToJson for HashMap<string::String, A> { } } -impl<A:ToJson> ToJson for Option<A> { +impl<A: ToJson> ToJson for Option<A> { fn to_json(&self) -> Json { match *self { None => Json::Null, - Some(ref value) => value.to_json() + Some(ref value) => value.to_json(), } } } @@ -2509,7 +2719,7 @@ impl<'a, 'b> fmt::Write for FormatShim<'a, 'b> { fn write_str(&mut self, s: &str) -> fmt::Result { match self.inner.write_str(s) { Ok(_) => Ok(()), - Err(_) => Err(fmt::Error) + Err(_) => Err(fmt::Error), } } } @@ -2521,7 +2731,7 @@ impl fmt::Display for Json { let mut encoder = Encoder::new(&mut shim); match self.encode(&mut encoder) { Ok(_) => Ok(()), - Err(_) => Err(fmt::Error) + Err(_) => Err(fmt::Error), } } } @@ -2533,7 +2743,7 @@ impl<'a> fmt::Display for PrettyJson<'a> { let mut encoder = PrettyEncoder::new(&mut shim); match self.inner.encode(&mut encoder) { Ok(_) => Ok(()), - Err(_) => Err(fmt::Error) + Err(_) => Err(fmt::Error), } } } @@ -2545,7 +2755,7 @@ impl<'a, T: Encodable> fmt::Display for AsJson<'a, T> { let mut encoder = Encoder::new(&mut shim); match self.inner.encode(&mut encoder) { Ok(_) => Ok(()), - Err(_) => Err(fmt::Error) + Err(_) => Err(fmt::Error), } } } @@ -2568,7 +2778,7 @@ impl<'a, T: Encodable> fmt::Display for AsPrettyJson<'a, T> { } match self.inner.encode(&mut encoder) { Ok(_) => Ok(()), - Err(_) => Err(fmt::Error) + Err(_) => Err(fmt::Error), } } } diff --git a/src/libserialize/json/tests.rs b/src/libserialize/json/tests.rs index a16b8bdd78..01678fbf0b 100644 --- a/src/libserialize/json/tests.rs +++ b/src/libserialize/json/tests.rs @@ -1,9 +1,9 @@ // Benchmarks and tests that require private items extern crate test; -use test::Bencher; -use super::{from_str, Parser, StackElement, Stack}; +use super::{from_str, Parser, Stack, StackElement}; use std::string; +use test::Bencher; #[test] fn test_stack() { @@ -38,19 +38,25 @@ fn test_stack() { stack.push_key("bar".to_string()); assert!(stack.len() == 3); - assert!(stack.is_equal_to(&[StackElement::Index(1), - StackElement::Key("foo"), - StackElement::Key("bar")])); + assert!(stack.is_equal_to(&[ + StackElement::Index(1), + StackElement::Key("foo"), + StackElement::Key("bar") + ])); assert!(stack.starts_with(&[StackElement::Index(1)])); assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")])); - assert!(stack.starts_with(&[StackElement::Index(1), - StackElement::Key("foo"), - StackElement::Key("bar")])); + assert!(stack.starts_with(&[ + StackElement::Index(1), + StackElement::Key("foo"), + StackElement::Key("bar") + ])); assert!(stack.ends_with(&[StackElement::Key("bar")])); assert!(stack.ends_with(&[StackElement::Key("foo"), StackElement::Key("bar")])); - assert!(stack.ends_with(&[StackElement::Index(1), - StackElement::Key("foo"), - StackElement::Key("bar")])); + assert!(stack.ends_with(&[ + StackElement::Index(1), + StackElement::Key("foo"), + StackElement::Key("bar") + ])); assert!(!stack.last_is_index()); assert!(stack.get(0) == StackElement::Index(1)); assert!(stack.get(1) == StackElement::Key("foo")); @@ -71,7 +77,7 @@ fn test_stack() { #[bench] fn bench_streaming_small(b: &mut Bencher) { - b.iter( || { + b.iter(|| { let mut parser = Parser::new( r#"{ "a": 1.0, @@ -80,7 +86,8 @@ fn bench_streaming_small(b: &mut Bencher) { "foo\nbar", { "c": {"d": null} } ] - }"#.chars() + }"# + .chars(), ); loop { match parser.next() { @@ -92,23 +99,27 @@ fn bench_streaming_small(b: &mut Bencher) { } #[bench] fn bench_small(b: &mut Bencher) { - b.iter( || { - let _ = from_str(r#"{ + b.iter(|| { + let _ = from_str( + r#"{ "a": 1.0, "b": [ true, "foo\nbar", { "c": {"d": null} } ] - }"#); + }"#, + ); }); } fn big_json() -> string::String { let mut src = "[\n".to_string(); for _ in 0..500 { - src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \ - [1,2,3]},"#); + src.push_str( + r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \ + [1,2,3]},"#, + ); } src.push_str("{}]"); return src; @@ -117,7 +128,7 @@ fn big_json() -> string::String { #[bench] fn bench_streaming_large(b: &mut Bencher) { let src = big_json(); - b.iter( || { + b.iter(|| { let mut parser = Parser::new(src.chars()); loop { match parser.next() { @@ -130,5 +141,7 @@ fn bench_streaming_large(b: &mut Bencher) { #[bench] fn bench_large(b: &mut Bencher) { let src = big_json(); - b.iter( || { let _ = from_str(&src); }); + b.iter(|| { + let _ = from_str(&src); + }); } diff --git a/src/libserialize/leb128.rs b/src/libserialize/leb128.rs index 88ce6d81d7..b8242f7154 100644 --- a/src/libserialize/leb128.rs +++ b/src/libserialize/leb128.rs @@ -9,18 +9,28 @@ const USIZE_LEB128_SIZE: usize = 5; const USIZE_LEB128_SIZE: usize = 10; macro_rules! leb128_size { - (u16) => (3); - (u32) => (5); - (u64) => (10); - (u128) => (19); - (usize) => (USIZE_LEB128_SIZE); + (u16) => { + 3 + }; + (u32) => { + 5 + }; + (u64) => { + 10 + }; + (u128) => { + 19 + }; + (usize) => { + USIZE_LEB128_SIZE + }; } macro_rules! impl_write_unsigned_leb128 { - ($fn_name:ident, $int_ty:ident) => ( + ($fn_name:ident, $int_ty:ident) => { #[inline] pub fn $fn_name(out: &mut Vec<u8>, mut value: $int_ty) { - for _ in 0 .. leb128_size!($int_ty) { + for _ in 0..leb128_size!($int_ty) { let mut byte = (value & 0x7F) as u8; value >>= 7; if value != 0 { @@ -34,7 +44,7 @@ macro_rules! impl_write_unsigned_leb128 { } } } - ) + }; } impl_write_unsigned_leb128!(write_u16_leb128, u16); @@ -43,19 +53,16 @@ impl_write_unsigned_leb128!(write_u64_leb128, u64); impl_write_unsigned_leb128!(write_u128_leb128, u128); impl_write_unsigned_leb128!(write_usize_leb128, usize); - macro_rules! impl_read_unsigned_leb128 { - ($fn_name:ident, $int_ty:ident) => ( + ($fn_name:ident, $int_ty:ident) => { #[inline] pub fn $fn_name(slice: &[u8]) -> ($int_ty, usize) { let mut result: $int_ty = 0; let mut shift = 0; let mut position = 0; - for _ in 0 .. leb128_size!($int_ty) { - let byte = unsafe { - *slice.get_unchecked(position) - }; + for _ in 0..leb128_size!($int_ty) { + let byte = unsafe { *slice.get_unchecked(position) }; position += 1; result |= ((byte & 0x7F) as $int_ty) << shift; if (byte & 0x80) == 0 { @@ -69,7 +76,7 @@ macro_rules! impl_read_unsigned_leb128 { (result, position) } - ) + }; } impl_read_unsigned_leb128!(read_u16_leb128, u16); @@ -78,8 +85,6 @@ impl_read_unsigned_leb128!(read_u64_leb128, u64); impl_read_unsigned_leb128!(read_u128_leb128, u128); impl_read_unsigned_leb128!(read_usize_leb128, usize); - - #[inline] /// encodes an integer using signed leb128 encoding and stores /// the result using a callback function. @@ -88,13 +93,14 @@ impl_read_unsigned_leb128!(read_usize_leb128, usize); /// that is to be written to with the byte to be encoded /// at that position. pub fn write_signed_leb128_to<W>(mut value: i128, mut write: W) - where W: FnMut(u8) +where + W: FnMut(u8), { loop { let mut byte = (value as u8) & 0x7f; value >>= 7; - let more = !(((value == 0) && ((byte & 0x40) == 0)) || - ((value == -1) && ((byte & 0x40) != 0))); + let more = + !(((value == 0) && ((byte & 0x40) == 0)) || ((value == -1) && ((byte & 0x40) != 0))); if more { byte |= 0x80; // Mark this byte to show that more bytes will follow. diff --git a/src/libserialize/lib.rs b/src/libserialize/lib.rs index e45d56c320..280fb078f7 100644 --- a/src/libserialize/lib.rs +++ b/src/libserialize/lib.rs @@ -4,10 +4,11 @@ Core encoding and decoding interfaces. */ -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - html_playground_url = "https://play.rust-lang.org/", - test(attr(allow(unused_variables), deny(warnings))))] - +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + html_playground_url = "https://play.rust-lang.org/", + test(attr(allow(unused_variables), deny(warnings))) +)] #![feature(box_syntax)] #![feature(core_intrinsics)] #![feature(specialization)] @@ -17,16 +18,16 @@ Core encoding and decoding interfaces. #![cfg_attr(test, feature(test))] #![allow(rustc::internal)] -pub use self::serialize::{Decoder, Encoder, Decodable, Encodable}; +pub use self::serialize::{Decodable, Decoder, Encodable, Encoder}; -pub use self::serialize::{SpecializationError, SpecializedEncoder, SpecializedDecoder}; -pub use self::serialize::{UseSpecializedEncodable, UseSpecializedDecodable}; +pub use self::serialize::{SpecializationError, SpecializedDecoder, SpecializedEncoder}; +pub use self::serialize::{UseSpecializedDecodable, UseSpecializedEncodable}; -mod serialize; mod collection_impls; +mod serialize; pub mod hex; pub mod json; -pub mod opaque; pub mod leb128; +pub mod opaque; diff --git a/src/libserialize/opaque.rs b/src/libserialize/opaque.rs index 75988198eb..e808d98199 100644 --- a/src/libserialize/opaque.rs +++ b/src/libserialize/opaque.rs @@ -31,14 +31,14 @@ macro_rules! write_uleb128 { ($enc:expr, $value:expr, $fun:ident) => {{ leb128::$fun(&mut $enc.data, $value); Ok(()) - }} + }}; } macro_rules! write_sleb128 { ($enc:expr, $value:expr) => {{ write_signed_leb128(&mut $enc.data, $value as i128); Ok(()) - }} + }}; } impl serialize::Encoder for Encoder { @@ -113,11 +113,7 @@ impl serialize::Encoder for Encoder { #[inline] fn emit_bool(&mut self, v: bool) -> EncodeResult { - self.emit_u8(if v { - 1 - } else { - 0 - }) + self.emit_u8(if v { 1 } else { 0 }) } #[inline] @@ -164,10 +160,7 @@ pub struct Decoder<'a> { impl<'a> Decoder<'a> { #[inline] pub fn new(data: &'a [u8], position: usize) -> Decoder<'a> { - Decoder { - data, - position, - } + Decoder { data, position } } #[inline] @@ -199,22 +192,21 @@ impl<'a> Decoder<'a> { } macro_rules! read_uleb128 { - ($dec:expr, $t:ty, $fun:ident) => ({ - let (value, bytes_read) = leb128::$fun(&$dec.data[$dec.position ..]); + ($dec:expr, $t:ty, $fun:ident) => {{ + let (value, bytes_read) = leb128::$fun(&$dec.data[$dec.position..]); $dec.position += bytes_read; Ok(value) - }) + }}; } macro_rules! read_sleb128 { - ($dec:expr, $t:ty) => ({ + ($dec:expr, $t:ty) => {{ let (value, bytes_read) = read_signed_leb128($dec.data, $dec.position); $dec.position += bytes_read; Ok(value as $t) - }) + }}; } - impl<'a> serialize::Decoder for Decoder<'a> { type Error = String; diff --git a/src/libserialize/serialize.rs b/src/libserialize/serialize.rs index a5f7b4898a..19283ffc43 100644 --- a/src/libserialize/serialize.rs +++ b/src/libserialize/serialize.rs @@ -6,10 +6,10 @@ Core encoding and decoding interfaces. use std::any; use std::borrow::Cow; +use std::cell::{Cell, RefCell}; use std::marker::PhantomData; use std::path; use std::rc::Rc; -use std::cell::{Cell, RefCell}; use std::sync::Arc; pub trait Encoder { @@ -37,75 +37,109 @@ pub trait Encoder { // Compound types: fn emit_enum<F>(&mut self, _name: &str, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } - fn emit_enum_variant<F>(&mut self, _v_name: &str, v_id: usize, _len: usize, f: F) - -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error> + fn emit_enum_variant<F>( + &mut self, + _v_name: &str, + v_id: usize, + _len: usize, + f: F, + ) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_usize(v_id)?; f(self) } fn emit_enum_variant_arg<F>(&mut self, _a_idx: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } - fn emit_enum_struct_variant<F>(&mut self, v_name: &str, v_id: usize, len: usize, f: F) - -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error> + fn emit_enum_struct_variant<F>( + &mut self, + v_name: &str, + v_id: usize, + len: usize, + f: F, + ) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_enum_variant(v_name, v_id, len, f) } - fn emit_enum_struct_variant_field<F>(&mut self, _f_name: &str, f_idx: usize, f: F) - -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error> + fn emit_enum_struct_variant_field<F>( + &mut self, + _f_name: &str, + f_idx: usize, + f: F, + ) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_enum_variant_arg(f_idx, f) } fn emit_struct<F>(&mut self, _name: &str, _len: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } - fn emit_struct_field<F>(&mut self, _f_name: &str, _f_idx: usize, f: F) - -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error> + fn emit_struct_field<F>( + &mut self, + _f_name: &str, + _f_idx: usize, + f: F, + ) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_tuple<F>(&mut self, _len: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_tuple_arg<F>(&mut self, _idx: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_tuple_struct<F>(&mut self, _name: &str, len: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_tuple(len, f) } fn emit_tuple_struct_arg<F>(&mut self, f_idx: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_tuple_arg(f_idx, f) } // Specialized types: fn emit_option<F>(&mut self, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_enum("Option", f) } @@ -116,39 +150,45 @@ pub trait Encoder { } fn emit_option_some<F>(&mut self, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_enum_variant("Some", 1, 1, f) } fn emit_seq<F>(&mut self, len: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_usize(len)?; f(self) } fn emit_seq_elt<F>(&mut self, _idx: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_map<F>(&mut self, len: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_usize(len)?; f(self) } fn emit_map_elt_key<F>(&mut self, _idx: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_map_elt_val<F>(&mut self, _idx: usize, f: F) -> Result<(), Self::Error> - where F: FnOnce(&mut Self) -> Result<(), Self::Error> + where + F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } @@ -179,115 +219,140 @@ pub trait Decoder { // Compound types: fn read_enum<T, F>(&mut self, _name: &str, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_enum_variant<T, F>(&mut self, _names: &[&str], mut f: F) -> Result<T, Self::Error> - where F: FnMut(&mut Self, usize) -> Result<T, Self::Error> + where + F: FnMut(&mut Self, usize) -> Result<T, Self::Error>, { let disr = self.read_usize()?; f(self, disr) } fn read_enum_variant_arg<T, F>(&mut self, _a_idx: usize, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) -> Result<T, Self::Error> - where F: FnMut(&mut Self, usize) -> Result<T, Self::Error> + where + F: FnMut(&mut Self, usize) -> Result<T, Self::Error>, { self.read_enum_variant(names, f) } - fn read_enum_struct_variant_field<T, F>(&mut self, _f_name: &str, f_idx: usize, f: F) - -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error> + fn read_enum_struct_variant_field<T, F>( + &mut self, + _f_name: &str, + f_idx: usize, + f: F, + ) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { self.read_enum_variant_arg(f_idx, f) } fn read_struct<T, F>(&mut self, _s_name: &str, _len: usize, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } - fn read_struct_field<T, F>(&mut self, _f_name: &str, _f_idx: usize, f: F) - -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error> + fn read_struct_field<T, F>( + &mut self, + _f_name: &str, + _f_idx: usize, + f: F, + ) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_tuple<T, F>(&mut self, _len: usize, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_tuple_arg<T, F>(&mut self, _a_idx: usize, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_tuple_struct<T, F>(&mut self, _s_name: &str, len: usize, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { self.read_tuple(len, f) } fn read_tuple_struct_arg<T, F>(&mut self, a_idx: usize, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { self.read_tuple_arg(a_idx, f) } // Specialized types: fn read_option<T, F>(&mut self, mut f: F) -> Result<T, Self::Error> - where F: FnMut(&mut Self, bool) -> Result<T, Self::Error> + where + F: FnMut(&mut Self, bool) -> Result<T, Self::Error>, { self.read_enum("Option", move |this| { - this.read_enum_variant(&["None", "Some"], move |this, idx| { - match idx { - 0 => f(this, false), - 1 => f(this, true), - _ => Err(this.error("read_option: expected 0 for None or 1 for Some")), - } + this.read_enum_variant(&["None", "Some"], move |this, idx| match idx { + 0 => f(this, false), + 1 => f(this, true), + _ => Err(this.error("read_option: expected 0 for None or 1 for Some")), }) }) } fn read_seq<T, F>(&mut self, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self, usize) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self, usize) -> Result<T, Self::Error>, { let len = self.read_usize()?; f(self, len) } fn read_seq_elt<T, F>(&mut self, _idx: usize, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_map<T, F>(&mut self, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self, usize) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self, usize) -> Result<T, Self::Error>, { let len = self.read_usize()?; f(self, len) } fn read_map_elt_key<T, F>(&mut self, _idx: usize, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_map_elt_val<T, F>(&mut self, _idx: usize, f: F) -> Result<T, Self::Error> - where F: FnOnce(&mut Self) -> Result<T, Self::Error> + where + F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } @@ -563,32 +628,32 @@ impl<T: ?Sized + Encodable> Encodable for Box<T> { } } -impl< T: Decodable> Decodable for Box<T> { +impl<T: Decodable> Decodable for Box<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Box<T>, D::Error> { Ok(box Decodable::decode(d)?) } } -impl< T: Decodable> Decodable for Box<[T]> { +impl<T: Decodable> Decodable for Box<[T]> { fn decode<D: Decoder>(d: &mut D) -> Result<Box<[T]>, D::Error> { let v: Vec<T> = Decodable::decode(d)?; Ok(v.into_boxed_slice()) } } -impl<T:Encodable> Encodable for Rc<T> { +impl<T: Encodable> Encodable for Rc<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } -impl<T:Decodable> Decodable for Rc<T> { +impl<T: Decodable> Decodable for Rc<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Rc<T>, D::Error> { Ok(Rc::new(Decodable::decode(d)?)) } } -impl<T:Encodable> Encodable for [T] { +impl<T: Encodable> Encodable for [T] { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { @@ -599,7 +664,7 @@ impl<T:Encodable> Encodable for [T] { } } -impl<T:Encodable> Encodable for Vec<T> { +impl<T: Encodable> Encodable for Vec<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { @@ -610,7 +675,7 @@ impl<T:Encodable> Encodable for Vec<T> { } } -impl<T:Decodable> Decodable for Vec<T> { +impl<T: Decodable> Decodable for Vec<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Vec<T>, D::Error> { d.read_seq(|d, len| { let mut v = Vec::with_capacity(len); @@ -622,7 +687,10 @@ impl<T:Decodable> Decodable for Vec<T> { } } -impl<'a, T:Encodable> Encodable for Cow<'a, [T]> where [T]: ToOwned<Owned = Vec<T>> { +impl<'a, T: Encodable> Encodable for Cow<'a, [T]> +where + [T]: ToOwned<Owned = Vec<T>>, +{ fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { @@ -633,8 +701,9 @@ impl<'a, T:Encodable> Encodable for Cow<'a, [T]> where [T]: ToOwned<Owned = Vec< } } -impl<T:Decodable+ToOwned> Decodable for Cow<'static, [T]> - where [T]: ToOwned<Owned = Vec<T>> +impl<T: Decodable + ToOwned> Decodable for Cow<'static, [T]> +where + [T]: ToOwned<Owned = Vec<T>>, { fn decode<D: Decoder>(d: &mut D) -> Result<Cow<'static, [T]>, D::Error> { d.read_seq(|d, len| { @@ -647,72 +716,45 @@ impl<T:Decodable+ToOwned> Decodable for Cow<'static, [T]> } } - -impl<T:Encodable> Encodable for Option<T> { +impl<T: Encodable> Encodable for Option<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { - s.emit_option(|s| { - match *self { - None => s.emit_option_none(), - Some(ref v) => s.emit_option_some(|s| v.encode(s)), - } + s.emit_option(|s| match *self { + None => s.emit_option_none(), + Some(ref v) => s.emit_option_some(|s| v.encode(s)), }) } } -impl<T:Decodable> Decodable for Option<T> { +impl<T: Decodable> Decodable for Option<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Option<T>, D::Error> { - d.read_option(|d, b| { - if b { - Ok(Some(Decodable::decode(d)?)) - } else { - Ok(None) - } - }) + d.read_option(|d, b| if b { Ok(Some(Decodable::decode(d)?)) } else { Ok(None) }) } } impl<T1: Encodable, T2: Encodable> Encodable for Result<T1, T2> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { - s.emit_enum("Result", |s| { - match *self { - Ok(ref v) => { - s.emit_enum_variant("Ok", 0, 1, |s| { - s.emit_enum_variant_arg(0, |s| { - v.encode(s) - }) - }) - } - Err(ref v) => { - s.emit_enum_variant("Err", 1, 1, |s| { - s.emit_enum_variant_arg(0, |s| { - v.encode(s) - }) - }) - } + s.emit_enum("Result", |s| match *self { + Ok(ref v) => { + s.emit_enum_variant("Ok", 0, 1, |s| s.emit_enum_variant_arg(0, |s| v.encode(s))) + } + Err(ref v) => { + s.emit_enum_variant("Err", 1, 1, |s| s.emit_enum_variant_arg(0, |s| v.encode(s))) } }) } } -impl<T1:Decodable, T2:Decodable> Decodable for Result<T1, T2> { +impl<T1: Decodable, T2: Decodable> Decodable for Result<T1, T2> { fn decode<D: Decoder>(d: &mut D) -> Result<Result<T1, T2>, D::Error> { d.read_enum("Result", |d| { - d.read_enum_variant(&["Ok", "Err"], |d, disr| { - match disr { - 0 => { - Ok(Ok(d.read_enum_variant_arg(0, |d| { - T1::decode(d) - })?)) - } - 1 => { - Ok(Err(d.read_enum_variant_arg(0, |d| { - T2::decode(d) - })?)) - } - _ => { - panic!("Encountered invalid discriminant while \ - decoding `Result`."); - } + d.read_enum_variant(&["Ok", "Err"], |d, disr| match disr { + 0 => Ok(Ok(d.read_enum_variant_arg(0, |d| T1::decode(d))?)), + 1 => Ok(Err(d.read_enum_variant_arg(0, |d| T2::decode(d))?)), + _ => { + panic!( + "Encountered invalid discriminant while \ + decoding `Result`." + ); } }) }) @@ -819,13 +861,13 @@ impl<T: Decodable> Decodable for RefCell<T> { } } -impl<T:Encodable> Encodable for Arc<T> { +impl<T: Encodable> Encodable for Arc<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } -impl<T:Decodable> Decodable for Arc<T> { +impl<T: Decodable> Decodable for Arc<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Arc<T>, D::Error> { Ok(Arc::new(Decodable::decode(d)?)) } @@ -848,11 +890,13 @@ pub trait SpecializationError { impl<E> SpecializationError for E { default fn not_found<S, T: ?Sized>(trait_name: &'static str, method_name: &'static str) -> E { - panic!("missing specialization: `<{} as {}<{}>>::{}` not overridden", - any::type_name::<S>(), - trait_name, - any::type_name::<T>(), - method_name); + panic!( + "missing specialization: `<{} as {}<{}>>::{}` not overridden", + any::type_name::<S>(), + trait_name, + any::type_name::<T>(), + method_name + ); } } diff --git a/src/libserialize/tests/json.rs b/src/libserialize/tests/json.rs index 898168252e..c16426b591 100644 --- a/src/libserialize/tests/json.rs +++ b/src/libserialize/tests/json.rs @@ -2,21 +2,23 @@ extern crate serialize as rustc_serialize; -use rustc_serialize::{Encodable, Decodable}; -use rustc_serialize::json; -use json::Json::*; -use json::ErrorCode::*; -use json::ParserError::*; use json::DecoderError::*; +use json::ErrorCode::*; +use json::Json::*; use json::JsonEvent::*; -use json::{Json, from_str, DecodeResult, DecoderError, JsonEvent, Parser, StackElement, - Decoder, Encoder, EncoderError}; +use json::ParserError::*; +use json::{ + from_str, DecodeResult, Decoder, DecoderError, Encoder, EncoderError, Json, JsonEvent, Parser, + StackElement, +}; +use rustc_serialize::json; +use rustc_serialize::{Decodable, Encodable}; -use Animal::*; -use std::{i64, u64, f32, f64}; -use std::io::prelude::*; use std::collections::BTreeMap; +use std::io::prelude::*; use std::string; +use std::{f32, f64, i64, u64}; +use Animal::*; #[derive(RustcDecodable, Eq, PartialEq, Debug)] struct OptionData { @@ -25,7 +27,7 @@ struct OptionData { #[test] fn test_decode_option_none() { - let s ="{}"; + let s = "{}"; let obj: OptionData = json::decode(s).unwrap(); assert_eq!(obj, OptionData { opt: None }); } @@ -39,16 +41,20 @@ fn test_decode_option_some() { #[test] fn test_decode_option_malformed() { - check_err::<OptionData>("{ \"opt\": [] }", - ExpectedError("Number".to_string(), "[]".to_string())); - check_err::<OptionData>("{ \"opt\": false }", - ExpectedError("Number".to_string(), "false".to_string())); + check_err::<OptionData>( + "{ \"opt\": [] }", + ExpectedError("Number".to_string(), "[]".to_string()), + ); + check_err::<OptionData>( + "{ \"opt\": false }", + ExpectedError("Number".to_string(), "false".to_string()), + ); } #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)] enum Animal { Dog, - Frog(string::String, isize) + Frog(string::String, isize), } #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)] @@ -68,9 +74,11 @@ fn mk_object(items: &[(string::String, Json)]) -> Json { for item in items { match *item { - (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); }, + (ref key, ref value) => { + d.insert((*key).clone(), (*value).clone()); + } } - }; + } Object(d) } @@ -158,13 +166,10 @@ fn test_write_array() { ]" ); - let long_test_array = Array(vec![ - Boolean(false), - Null, - Array(vec![String("foo\nbar".to_string()), F64(3.5)])]); + let long_test_array = + Array(vec![Boolean(false), Null, Array(vec![String("foo\nbar".to_string()), F64(3.5)])]); - assert_eq!(long_test_array.to_string(), - "[false,null,[\"foo\\nbar\",3.5]]"); + assert_eq!(long_test_array.to_string(), "[false,null,[\"foo\\nbar\",3.5]]"); assert_eq!( long_test_array.pretty().to_string(), "\ @@ -184,12 +189,7 @@ fn test_write_object() { assert_eq!(mk_object(&[]).to_string(), "{}"); assert_eq!(mk_object(&[]).pretty().to_string(), "{}"); - assert_eq!( - mk_object(&[ - ("a".to_string(), Boolean(true)) - ]).to_string(), - "{\"a\":true}" - ); + assert_eq!(mk_object(&[("a".to_string(), Boolean(true))]).to_string(), "{\"a\":true}"); assert_eq!( mk_object(&[("a".to_string(), Boolean(true))]).pretty().to_string(), "\ @@ -198,12 +198,13 @@ fn test_write_object() { }" ); - let complex_obj = mk_object(&[ - ("b".to_string(), Array(vec![ - mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]), - mk_object(&[("d".to_string(), String("".to_string()))]) - ])) - ]); + let complex_obj = mk_object(&[( + "b".to_string(), + Array(vec![ + mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]), + mk_object(&[("d".to_string(), String("".to_string()))]), + ]), + )]); assert_eq!( complex_obj.to_string(), @@ -231,10 +232,13 @@ fn test_write_object() { let a = mk_object(&[ ("a".to_string(), Boolean(true)), - ("b".to_string(), Array(vec![ - mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]), - mk_object(&[("d".to_string(), String("".to_string()))]) - ])) + ( + "b".to_string(), + Array(vec![ + mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]), + mk_object(&[("d".to_string(), String("".to_string()))]), + ]), + ), ]); // We can't compare the strings directly because the object fields be @@ -246,14 +250,8 @@ fn test_write_object() { #[test] fn test_write_enum() { let animal = Dog; - assert_eq!( - json::as_json(&animal).to_string(), - "\"Dog\"" - ); - assert_eq!( - json::as_pretty_json(&animal).to_string(), - "\"Dog\"" - ); + assert_eq!(json::as_json(&animal).to_string(), "\"Dog\""); + assert_eq!(json::as_pretty_json(&animal).to_string(), "\"Dog\""); let animal = Frog("Henry".to_string(), 349); assert_eq!( @@ -273,13 +271,13 @@ fn test_write_enum() { } macro_rules! check_encoder_for_simple { - ($value:expr, $expected:expr) => ({ + ($value:expr, $expected:expr) => {{ let s = json::as_json(&$value).to_string(); assert_eq!(s, $expected); let s = json::as_pretty_json(&$value).to_string(); assert_eq!(s, $expected); - }) + }}; } #[test] @@ -306,22 +304,22 @@ fn test_write_char() { #[test] fn test_trailing_characters() { - assert_eq!(from_str("nulla"), Err(SyntaxError(TrailingCharacters, 1, 5))); - assert_eq!(from_str("truea"), Err(SyntaxError(TrailingCharacters, 1, 5))); + assert_eq!(from_str("nulla"), Err(SyntaxError(TrailingCharacters, 1, 5))); + assert_eq!(from_str("truea"), Err(SyntaxError(TrailingCharacters, 1, 5))); assert_eq!(from_str("falsea"), Err(SyntaxError(TrailingCharacters, 1, 6))); - assert_eq!(from_str("1a"), Err(SyntaxError(TrailingCharacters, 1, 2))); - assert_eq!(from_str("[]a"), Err(SyntaxError(TrailingCharacters, 1, 3))); - assert_eq!(from_str("{}a"), Err(SyntaxError(TrailingCharacters, 1, 3))); + assert_eq!(from_str("1a"), Err(SyntaxError(TrailingCharacters, 1, 2))); + assert_eq!(from_str("[]a"), Err(SyntaxError(TrailingCharacters, 1, 3))); + assert_eq!(from_str("{}a"), Err(SyntaxError(TrailingCharacters, 1, 3))); } #[test] fn test_read_identifiers() { - assert_eq!(from_str("n"), Err(SyntaxError(InvalidSyntax, 1, 2))); - assert_eq!(from_str("nul"), Err(SyntaxError(InvalidSyntax, 1, 4))); - assert_eq!(from_str("t"), Err(SyntaxError(InvalidSyntax, 1, 2))); + assert_eq!(from_str("n"), Err(SyntaxError(InvalidSyntax, 1, 2))); + assert_eq!(from_str("nul"), Err(SyntaxError(InvalidSyntax, 1, 4))); + assert_eq!(from_str("t"), Err(SyntaxError(InvalidSyntax, 1, 2))); assert_eq!(from_str("truz"), Err(SyntaxError(InvalidSyntax, 1, 4))); - assert_eq!(from_str("f"), Err(SyntaxError(InvalidSyntax, 1, 2))); - assert_eq!(from_str("faz"), Err(SyntaxError(InvalidSyntax, 1, 3))); + assert_eq!(from_str("f"), Err(SyntaxError(InvalidSyntax, 1, 2))); + assert_eq!(from_str("faz"), Err(SyntaxError(InvalidSyntax, 1, 3))); assert_eq!(from_str("null"), Ok(Null)); assert_eq!(from_str("true"), Ok(Boolean(true))); @@ -345,13 +343,13 @@ fn test_decode_identifiers() { #[test] fn test_read_number() { - assert_eq!(from_str("+"), Err(SyntaxError(InvalidSyntax, 1, 1))); - assert_eq!(from_str("."), Err(SyntaxError(InvalidSyntax, 1, 1))); + assert_eq!(from_str("+"), Err(SyntaxError(InvalidSyntax, 1, 1))); + assert_eq!(from_str("."), Err(SyntaxError(InvalidSyntax, 1, 1))); assert_eq!(from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1))); - assert_eq!(from_str("-"), Err(SyntaxError(InvalidNumber, 1, 2))); - assert_eq!(from_str("00"), Err(SyntaxError(InvalidNumber, 1, 2))); - assert_eq!(from_str("1."), Err(SyntaxError(InvalidNumber, 1, 3))); - assert_eq!(from_str("1e"), Err(SyntaxError(InvalidNumber, 1, 3))); + assert_eq!(from_str("-"), Err(SyntaxError(InvalidNumber, 1, 2))); + assert_eq!(from_str("00"), Err(SyntaxError(InvalidNumber, 1, 2))); + assert_eq!(from_str("1."), Err(SyntaxError(InvalidNumber, 1, 3))); + assert_eq!(from_str("1e"), Err(SyntaxError(InvalidNumber, 1, 3))); assert_eq!(from_str("1e+"), Err(SyntaxError(InvalidNumber, 1, 4))); assert_eq!(from_str("18446744073709551616"), Err(SyntaxError(InvalidNumber, 1, 20))); @@ -407,13 +405,12 @@ fn test_decode_numbers() { assert_eq!(v, i64::MAX); let res: DecodeResult<i64> = json::decode("765.25"); - assert_eq!(res, Err(ExpectedError("Integer".to_string(), - "765.25".to_string()))); + assert_eq!(res, Err(ExpectedError("Integer".to_string(), "765.25".to_string()))); } #[test] fn test_read_str() { - assert_eq!(from_str("\""), Err(SyntaxError(EOFWhileParsingString, 1, 2))); + assert_eq!(from_str("\""), Err(SyntaxError(EOFWhileParsingString, 1, 2))); assert_eq!(from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5))); assert_eq!(from_str("\"\""), Ok(String("".to_string()))); @@ -430,15 +427,17 @@ fn test_read_str() { #[test] fn test_decode_str() { - let s = [("\"\"", ""), - ("\"foo\"", "foo"), - ("\"\\\"\"", "\""), - ("\"\\b\"", "\x08"), - ("\"\\n\"", "\n"), - ("\"\\r\"", "\r"), - ("\"\\t\"", "\t"), - ("\"\\u12ab\"", "\u{12ab}"), - ("\"\\uAB12\"", "\u{AB12}")]; + let s = [ + ("\"\"", ""), + ("\"foo\"", "foo"), + ("\"\\\"\"", "\""), + ("\"\\b\"", "\x08"), + ("\"\\n\"", "\n"), + ("\"\\r\"", "\r"), + ("\"\\t\"", "\t"), + ("\"\\u12ab\"", "\u{12ab}"), + ("\"\\uAB12\"", "\u{AB12}"), + ]; for &(i, o) in &s { let v: string::String = json::decode(i).unwrap(); @@ -448,23 +447,20 @@ fn test_decode_str() { #[test] fn test_read_array() { - assert_eq!(from_str("["), Err(SyntaxError(EOFWhileParsingValue, 1, 2))); - assert_eq!(from_str("[1"), Err(SyntaxError(EOFWhileParsingArray, 1, 3))); - assert_eq!(from_str("[1,"), Err(SyntaxError(EOFWhileParsingValue, 1, 4))); - assert_eq!(from_str("[1,]"), Err(SyntaxError(InvalidSyntax, 1, 4))); - assert_eq!(from_str("[6 7]"), Err(SyntaxError(InvalidSyntax, 1, 4))); + assert_eq!(from_str("["), Err(SyntaxError(EOFWhileParsingValue, 1, 2))); + assert_eq!(from_str("[1"), Err(SyntaxError(EOFWhileParsingArray, 1, 3))); + assert_eq!(from_str("[1,"), Err(SyntaxError(EOFWhileParsingValue, 1, 4))); + assert_eq!(from_str("[1,]"), Err(SyntaxError(InvalidSyntax, 1, 4))); + assert_eq!(from_str("[6 7]"), Err(SyntaxError(InvalidSyntax, 1, 4))); assert_eq!(from_str("[]"), Ok(Array(vec![]))); assert_eq!(from_str("[ ]"), Ok(Array(vec![]))); assert_eq!(from_str("[true]"), Ok(Array(vec![Boolean(true)]))); assert_eq!(from_str("[ false ]"), Ok(Array(vec![Boolean(false)]))); assert_eq!(from_str("[null]"), Ok(Array(vec![Null]))); - assert_eq!(from_str("[3, 1]"), - Ok(Array(vec![U64(3), U64(1)]))); - assert_eq!(from_str("\n[3, 2]\n"), - Ok(Array(vec![U64(3), U64(2)]))); - assert_eq!(from_str("[2, [4, 1]]"), - Ok(Array(vec![U64(2), Array(vec![U64(4), U64(1)])]))); + assert_eq!(from_str("[3, 1]"), Ok(Array(vec![U64(3), U64(1)]))); + assert_eq!(from_str("\n[3, 2]\n"), Ok(Array(vec![U64(3), U64(2)]))); + assert_eq!(from_str("[2, [4, 1]]"), Ok(Array(vec![U64(2), Array(vec![U64(4), U64(1)])]))); } #[test] @@ -506,57 +502,58 @@ fn test_decode_tuple_malformed_length() { #[test] fn test_read_object() { - assert_eq!(from_str("{"), Err(SyntaxError(EOFWhileParsingObject, 1, 2))); - assert_eq!(from_str("{ "), Err(SyntaxError(EOFWhileParsingObject, 1, 3))); - assert_eq!(from_str("{1"), Err(SyntaxError(KeyMustBeAString, 1, 2))); + assert_eq!(from_str("{"), Err(SyntaxError(EOFWhileParsingObject, 1, 2))); + assert_eq!(from_str("{ "), Err(SyntaxError(EOFWhileParsingObject, 1, 3))); + assert_eq!(from_str("{1"), Err(SyntaxError(KeyMustBeAString, 1, 2))); assert_eq!(from_str("{ \"a\""), Err(SyntaxError(EOFWhileParsingObject, 1, 6))); - assert_eq!(from_str("{\"a\""), Err(SyntaxError(EOFWhileParsingObject, 1, 5))); + assert_eq!(from_str("{\"a\""), Err(SyntaxError(EOFWhileParsingObject, 1, 5))); assert_eq!(from_str("{\"a\" "), Err(SyntaxError(EOFWhileParsingObject, 1, 6))); - assert_eq!(from_str("{\"a\" 1"), Err(SyntaxError(ExpectedColon, 1, 6))); - assert_eq!(from_str("{\"a\":"), Err(SyntaxError(EOFWhileParsingValue, 1, 6))); - assert_eq!(from_str("{\"a\":1"), Err(SyntaxError(EOFWhileParsingObject, 1, 7))); - assert_eq!(from_str("{\"a\":1 1"), Err(SyntaxError(InvalidSyntax, 1, 8))); - assert_eq!(from_str("{\"a\":1,"), Err(SyntaxError(EOFWhileParsingObject, 1, 8))); + assert_eq!(from_str("{\"a\" 1"), Err(SyntaxError(ExpectedColon, 1, 6))); + assert_eq!(from_str("{\"a\":"), Err(SyntaxError(EOFWhileParsingValue, 1, 6))); + assert_eq!(from_str("{\"a\":1"), Err(SyntaxError(EOFWhileParsingObject, 1, 7))); + assert_eq!(from_str("{\"a\":1 1"), Err(SyntaxError(InvalidSyntax, 1, 8))); + assert_eq!(from_str("{\"a\":1,"), Err(SyntaxError(EOFWhileParsingObject, 1, 8))); assert_eq!(from_str("{}").unwrap(), mk_object(&[])); - assert_eq!(from_str("{\"a\": 3}").unwrap(), - mk_object(&[("a".to_string(), U64(3))])); - - assert_eq!(from_str( - "{ \"a\": null, \"b\" : true }").unwrap(), - mk_object(&[ - ("a".to_string(), Null), - ("b".to_string(), Boolean(true))])); - assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(), - mk_object(&[ - ("a".to_string(), Null), - ("b".to_string(), Boolean(true))])); - assert_eq!(from_str( - "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(), - mk_object(&[ - ("a".to_string(), F64(1.0)), - ("b".to_string(), Array(vec![Boolean(true)])) - ])); - assert_eq!(from_str( - "{\ + assert_eq!(from_str("{\"a\": 3}").unwrap(), mk_object(&[("a".to_string(), U64(3))])); + + assert_eq!( + from_str("{ \"a\": null, \"b\" : true }").unwrap(), + mk_object(&[("a".to_string(), Null), ("b".to_string(), Boolean(true))]) + ); + assert_eq!( + from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(), + mk_object(&[("a".to_string(), Null), ("b".to_string(), Boolean(true))]) + ); + assert_eq!( + from_str("{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(), + mk_object(&[("a".to_string(), F64(1.0)), ("b".to_string(), Array(vec![Boolean(true)]))]) + ); + assert_eq!( + from_str( + "{\ \"a\": 1.0, \ \"b\": [\ true,\ \"foo\\nbar\", \ { \"c\": {\"d\": null} } \ ]\ - }").unwrap(), - mk_object(&[ - ("a".to_string(), F64(1.0)), - ("b".to_string(), Array(vec![ - Boolean(true), - String("foo\nbar".to_string()), - mk_object(&[ - ("c".to_string(), mk_object(&[("d".to_string(), Null)])) - ]) - ])) - ])); + }" + ) + .unwrap(), + mk_object(&[ + ("a".to_string(), F64(1.0)), + ( + "b".to_string(), + Array(vec![ + Boolean(true), + String("foo\nbar".to_string()), + mk_object(&[("c".to_string(), mk_object(&[("d".to_string(), Null)]))]) + ]) + ) + ]) + ); } #[test] @@ -570,18 +567,14 @@ fn test_decode_struct() { let v: Outer = json::decode(s).unwrap(); assert_eq!( v, - Outer { - inner: vec![ - Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] } - ] - } + Outer { inner: vec![Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }] } ); } #[derive(RustcDecodable)] struct FloatStruct { f: f64, - a: Vec<f64> + a: Vec<f64>, } #[test] fn test_decode_struct_with_nan() { @@ -623,8 +616,7 @@ fn test_decode_map() { #[test] fn test_multiline_errors() { - assert_eq!(from_str("{\n \"foo\":\n \"bar\""), - Err(SyntaxError(EOFWhileParsingObject, 3, 8))); + assert_eq!(from_str("{\n \"foo\":\n \"bar\""), Err(SyntaxError(EOFWhileParsingObject, 3, 8))); } #[derive(RustcDecodable)] @@ -633,23 +625,21 @@ struct DecodeStruct { x: f64, y: bool, z: string::String, - w: Vec<DecodeStruct> + w: Vec<DecodeStruct>, } #[derive(RustcDecodable)] enum DecodeEnum { A(f64), - B(string::String) + B(string::String), } fn check_err<T: Decodable>(to_parse: &'static str, expected: DecoderError) { let res: DecodeResult<T> = match from_str(to_parse) { Err(e) => Err(ParseError(e)), - Ok(json) => Decodable::decode(&mut Decoder::new(json)) + Ok(json) => Decodable::decode(&mut Decoder::new(json)), }; match res { - Ok(_) => panic!("`{:?}` parsed & decoded ok, expecting error `{:?}`", - to_parse, expected), - Err(ParseError(e)) => panic!("`{:?}` is not valid json: {:?}", - to_parse, e), + Ok(_) => panic!("`{:?}` parsed & decoded ok, expecting error `{:?}`", to_parse, expected), + Err(ParseError(e)) => panic!("`{:?}` is not valid json: {:?}", to_parse, e), Err(e) => { assert_eq!(e, expected); } @@ -658,54 +648,68 @@ fn check_err<T: Decodable>(to_parse: &'static str, expected: DecoderError) { #[test] fn test_decode_errors_struct() { check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string())); - check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}", - ExpectedError("Number".to_string(), "true".to_string())); - check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}", - ExpectedError("Boolean".to_string(), "[]".to_string())); - check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}", - ExpectedError("String".to_string(), "{}".to_string())); - check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}", - ExpectedError("Array".to_string(), "null".to_string())); - check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}", - MissingFieldError("w".to_string())); + check_err::<DecodeStruct>( + "{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}", + ExpectedError("Number".to_string(), "true".to_string()), + ); + check_err::<DecodeStruct>( + "{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}", + ExpectedError("Boolean".to_string(), "[]".to_string()), + ); + check_err::<DecodeStruct>( + "{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}", + ExpectedError("String".to_string(), "{}".to_string()), + ); + check_err::<DecodeStruct>( + "{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}", + ExpectedError("Array".to_string(), "null".to_string()), + ); + check_err::<DecodeStruct>( + "{\"x\": 1, \"y\": true, \"z\": \"\"}", + MissingFieldError("w".to_string()), + ); } #[test] fn test_decode_errors_enum() { - check_err::<DecodeEnum>("{}", - MissingFieldError("variant".to_string())); - check_err::<DecodeEnum>("{\"variant\": 1}", - ExpectedError("String".to_string(), "1".to_string())); - check_err::<DecodeEnum>("{\"variant\": \"A\"}", - MissingFieldError("fields".to_string())); - check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}", - ExpectedError("Array".to_string(), "null".to_string())); - check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}", - UnknownVariantError("C".to_string())); + check_err::<DecodeEnum>("{}", MissingFieldError("variant".to_string())); + check_err::<DecodeEnum>( + "{\"variant\": 1}", + ExpectedError("String".to_string(), "1".to_string()), + ); + check_err::<DecodeEnum>("{\"variant\": \"A\"}", MissingFieldError("fields".to_string())); + check_err::<DecodeEnum>( + "{\"variant\": \"A\", \"fields\": null}", + ExpectedError("Array".to_string(), "null".to_string()), + ); + check_err::<DecodeEnum>( + "{\"variant\": \"C\", \"fields\": []}", + UnknownVariantError("C".to_string()), + ); } #[test] -fn test_find(){ +fn test_find() { let json_value = from_str("{\"dog\" : \"cat\"}").unwrap(); let found_str = json_value.find("dog"); assert!(found_str.unwrap().as_string().unwrap() == "cat"); } #[test] -fn test_find_path(){ +fn test_find_path() { let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap(); let found_str = json_value.find_path(&["dog", "cat", "mouse"]); assert!(found_str.unwrap().as_string().unwrap() == "cheese"); } #[test] -fn test_search(){ +fn test_search() { let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap(); let found_str = json_value.search("mouse").and_then(|j| j.as_string()); assert!(found_str.unwrap() == "cheese"); } #[test] -fn test_index(){ +fn test_index() { let json_value = from_str("{\"animals\":[\"dog\",\"cat\",\"mouse\"]}").unwrap(); let ref array = json_value["animals"]; assert_eq!(array[0].as_string().unwrap(), "dog"); @@ -714,26 +718,26 @@ fn test_index(){ } #[test] -fn test_is_object(){ +fn test_is_object() { let json_value = from_str("{}").unwrap(); assert!(json_value.is_object()); } #[test] -fn test_as_object(){ +fn test_as_object() { let json_value = from_str("{}").unwrap(); let json_object = json_value.as_object(); assert!(json_object.is_some()); } #[test] -fn test_is_array(){ +fn test_is_array() { let json_value = from_str("[1, 2, 3]").unwrap(); assert!(json_value.is_array()); } #[test] -fn test_as_array(){ +fn test_as_array() { let json_value = from_str("[1, 2, 3]").unwrap(); let json_array = json_value.as_array(); let expected_length = 3; @@ -741,13 +745,13 @@ fn test_as_array(){ } #[test] -fn test_is_string(){ +fn test_is_string() { let json_value = from_str("\"dog\"").unwrap(); assert!(json_value.is_string()); } #[test] -fn test_as_string(){ +fn test_as_string() { let json_value = from_str("\"dog\"").unwrap(); let json_str = json_value.as_string(); let expected_str = "dog"; @@ -755,13 +759,13 @@ fn test_as_string(){ } #[test] -fn test_is_number(){ +fn test_is_number() { let json_value = from_str("12").unwrap(); assert!(json_value.is_number()); } #[test] -fn test_is_i64(){ +fn test_is_i64() { let json_value = from_str("-12").unwrap(); assert!(json_value.is_i64()); @@ -773,7 +777,7 @@ fn test_is_i64(){ } #[test] -fn test_is_u64(){ +fn test_is_u64() { let json_value = from_str("12").unwrap(); assert!(json_value.is_u64()); @@ -785,7 +789,7 @@ fn test_is_u64(){ } #[test] -fn test_is_f64(){ +fn test_is_f64() { let json_value = from_str("12").unwrap(); assert!(!json_value.is_f64()); @@ -800,34 +804,34 @@ fn test_is_f64(){ } #[test] -fn test_as_i64(){ +fn test_as_i64() { let json_value = from_str("-12").unwrap(); let json_num = json_value.as_i64(); assert_eq!(json_num, Some(-12)); } #[test] -fn test_as_u64(){ +fn test_as_u64() { let json_value = from_str("12").unwrap(); let json_num = json_value.as_u64(); assert_eq!(json_num, Some(12)); } #[test] -fn test_as_f64(){ +fn test_as_f64() { let json_value = from_str("12.0").unwrap(); let json_num = json_value.as_f64(); assert_eq!(json_num, Some(12f64)); } #[test] -fn test_is_boolean(){ +fn test_is_boolean() { let json_value = from_str("false").unwrap(); assert!(json_value.is_boolean()); } #[test] -fn test_as_boolean(){ +fn test_as_boolean() { let json_value = from_str("false").unwrap(); let json_bool = json_value.as_boolean(); let expected_bool = false; @@ -835,13 +839,13 @@ fn test_as_boolean(){ } #[test] -fn test_is_null(){ +fn test_is_null() { let json_value = from_str("null").unwrap(); assert!(json_value.is_null()); } #[test] -fn test_as_null(){ +fn test_as_null() { let json_value = from_str("null").unwrap(); let json_null = json_value.as_null(); let expected_null = (); @@ -850,8 +854,8 @@ fn test_as_null(){ #[test] fn test_encode_hashmap_with_numeric_key() { - use std::str::from_utf8; use std::collections::HashMap; + use std::str::from_utf8; let mut hm: HashMap<usize, bool> = HashMap::new(); hm.insert(1, true); let mut mem_buf = Vec::new(); @@ -865,8 +869,8 @@ fn test_encode_hashmap_with_numeric_key() { #[test] fn test_prettyencode_hashmap_with_numeric_key() { - use std::str::from_utf8; use std::collections::HashMap; + use std::str::from_utf8; let mut hm: HashMap<usize, bool> = HashMap::new(); hm.insert(1, true); let mut mem_buf = Vec::new(); @@ -880,8 +884,8 @@ fn test_prettyencode_hashmap_with_numeric_key() { #[test] fn test_prettyencoder_indent_level_param() { - use std::str::from_utf8; use std::collections::BTreeMap; + use std::str::from_utf8; let mut tree = BTreeMap::new(); @@ -891,12 +895,12 @@ fn test_prettyencoder_indent_level_param() { let json = Array( // The following layout below should look a lot like // the pretty-printed JSON (indent * x) - vec! - ( // 0x + vec![ + // 0x String("greetings".to_string()), // 1x - Object(tree), // 1x + 2x + 2x + 1x - ) // 0x - // End JSON array (7 lines) + Object(tree), // 1x + 2x + 2x + 1x + ], // 0x + // End JSON array (7 lines) ); // Helper function for counting indents @@ -908,8 +912,7 @@ fn test_prettyencoder_indent_level_param() { // Test up to 4 spaces of indents (more?) for i in 0..4 { let mut writer = Vec::new(); - write!(&mut writer, "{}", - json::as_pretty_json(&json).indent(i)).unwrap(); + write!(&mut writer, "{}", json::as_pretty_json(&json).indent(i)).unwrap(); let printed = from_utf8(&writer[..]).unwrap(); @@ -953,7 +956,7 @@ fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() { let json_str = "{\"1\":true}"; let json_obj = match from_str(json_str) { Err(_) => panic!("Unable to parse json_str: {:?}", json_str), - Ok(o) => o + Ok(o) => o, }; let mut decoder = Decoder::new(json_obj); let _hm: HashMap<usize, bool> = Decodable::decode(&mut decoder).unwrap(); @@ -965,28 +968,29 @@ fn test_hashmap_with_numeric_key_will_error_with_string_keys() { let json_str = "{\"a\":true}"; let json_obj = match from_str(json_str) { Err(_) => panic!("Unable to parse json_str: {:?}", json_str), - Ok(o) => o + Ok(o) => o, }; let mut decoder = Decoder::new(json_obj); let result: Result<HashMap<usize, bool>, DecoderError> = Decodable::decode(&mut decoder); assert_eq!(result, Err(ExpectedError("Number".to_string(), "a".to_string()))); } -fn assert_stream_equal(src: &str, - expected: Vec<(JsonEvent, Vec<StackElement<'_>>)>) { +fn assert_stream_equal(src: &str, expected: Vec<(JsonEvent, Vec<StackElement<'_>>)>) { let mut parser = Parser::new(src.chars()); let mut i = 0; loop { let evt = match parser.next() { Some(e) => e, - None => { break; } + None => { + break; + } }; let (ref expected_evt, ref expected_stack) = expected[i]; if !parser.stack().is_equal_to(expected_stack) { panic!("Parser stack is not equal to {:?}", expected_stack); } assert_eq!(&evt, expected_evt); - i+=1; + i += 1; } } #[test] @@ -994,26 +998,23 @@ fn test_streaming_parser() { assert_stream_equal( r#"{ "foo":"bar", "array" : [0, 1, 2, 3, 4, 5], "idents":[null,true,false]}"#, vec![ - (ObjectStart, vec![]), - (StringValue("bar".to_string()), vec![StackElement::Key("foo")]), - (ArrayStart, vec![StackElement::Key("array")]), - (U64Value(0), vec![StackElement::Key("array"), StackElement::Index(0)]), - (U64Value(1), vec![StackElement::Key("array"), StackElement::Index(1)]), - (U64Value(2), vec![StackElement::Key("array"), StackElement::Index(2)]), - (U64Value(3), vec![StackElement::Key("array"), StackElement::Index(3)]), - (U64Value(4), vec![StackElement::Key("array"), StackElement::Index(4)]), - (U64Value(5), vec![StackElement::Key("array"), StackElement::Index(5)]), - (ArrayEnd, vec![StackElement::Key("array")]), - (ArrayStart, vec![StackElement::Key("idents")]), - (NullValue, vec![StackElement::Key("idents"), - StackElement::Index(0)]), - (BooleanValue(true), vec![StackElement::Key("idents"), - StackElement::Index(1)]), - (BooleanValue(false), vec![StackElement::Key("idents"), - StackElement::Index(2)]), - (ArrayEnd, vec![StackElement::Key("idents")]), - (ObjectEnd, vec![]), - ] + (ObjectStart, vec![]), + (StringValue("bar".to_string()), vec![StackElement::Key("foo")]), + (ArrayStart, vec![StackElement::Key("array")]), + (U64Value(0), vec![StackElement::Key("array"), StackElement::Index(0)]), + (U64Value(1), vec![StackElement::Key("array"), StackElement::Index(1)]), + (U64Value(2), vec![StackElement::Key("array"), StackElement::Index(2)]), + (U64Value(3), vec![StackElement::Key("array"), StackElement::Index(3)]), + (U64Value(4), vec![StackElement::Key("array"), StackElement::Index(4)]), + (U64Value(5), vec![StackElement::Key("array"), StackElement::Index(5)]), + (ArrayEnd, vec![StackElement::Key("array")]), + (ArrayStart, vec![StackElement::Key("idents")]), + (NullValue, vec![StackElement::Key("idents"), StackElement::Index(0)]), + (BooleanValue(true), vec![StackElement::Key("idents"), StackElement::Index(1)]), + (BooleanValue(false), vec![StackElement::Key("idents"), StackElement::Index(2)]), + (ArrayEnd, vec![StackElement::Key("idents")]), + (ObjectEnd, vec![]), + ], ); } fn last_event(src: &str) -> JsonEvent { @@ -1029,50 +1030,47 @@ fn last_event(src: &str) -> JsonEvent { #[test] fn test_read_object_streaming() { - assert_eq!(last_event("{ "), Error(SyntaxError(EOFWhileParsingObject, 1, 3))); - assert_eq!(last_event("{1"), Error(SyntaxError(KeyMustBeAString, 1, 2))); + assert_eq!(last_event("{ "), Error(SyntaxError(EOFWhileParsingObject, 1, 3))); + assert_eq!(last_event("{1"), Error(SyntaxError(KeyMustBeAString, 1, 2))); assert_eq!(last_event("{ \"a\""), Error(SyntaxError(EOFWhileParsingObject, 1, 6))); - assert_eq!(last_event("{\"a\""), Error(SyntaxError(EOFWhileParsingObject, 1, 5))); + assert_eq!(last_event("{\"a\""), Error(SyntaxError(EOFWhileParsingObject, 1, 5))); assert_eq!(last_event("{\"a\" "), Error(SyntaxError(EOFWhileParsingObject, 1, 6))); - assert_eq!(last_event("{\"a\" 1"), Error(SyntaxError(ExpectedColon, 1, 6))); - assert_eq!(last_event("{\"a\":"), Error(SyntaxError(EOFWhileParsingValue, 1, 6))); - assert_eq!(last_event("{\"a\":1"), Error(SyntaxError(EOFWhileParsingObject, 1, 7))); - assert_eq!(last_event("{\"a\":1 1"), Error(SyntaxError(InvalidSyntax, 1, 8))); - assert_eq!(last_event("{\"a\":1,"), Error(SyntaxError(EOFWhileParsingObject, 1, 8))); + assert_eq!(last_event("{\"a\" 1"), Error(SyntaxError(ExpectedColon, 1, 6))); + assert_eq!(last_event("{\"a\":"), Error(SyntaxError(EOFWhileParsingValue, 1, 6))); + assert_eq!(last_event("{\"a\":1"), Error(SyntaxError(EOFWhileParsingObject, 1, 7))); + assert_eq!(last_event("{\"a\":1 1"), Error(SyntaxError(InvalidSyntax, 1, 8))); + assert_eq!(last_event("{\"a\":1,"), Error(SyntaxError(EOFWhileParsingObject, 1, 8))); assert_eq!(last_event("{\"a\":1,}"), Error(SyntaxError(TrailingComma, 1, 8))); - assert_stream_equal( - "{}", - vec![(ObjectStart, vec![]), (ObjectEnd, vec![])] - ); + assert_stream_equal("{}", vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]); assert_stream_equal( "{\"a\": 3}", vec![ - (ObjectStart, vec![]), - (U64Value(3), vec![StackElement::Key("a")]), - (ObjectEnd, vec![]), - ] + (ObjectStart, vec![]), + (U64Value(3), vec![StackElement::Key("a")]), + (ObjectEnd, vec![]), + ], ); assert_stream_equal( "{ \"a\": null, \"b\" : true }", vec![ - (ObjectStart, vec![]), - (NullValue, vec![StackElement::Key("a")]), - (BooleanValue(true), vec![StackElement::Key("b")]), - (ObjectEnd, vec![]), - ] + (ObjectStart, vec![]), + (NullValue, vec![StackElement::Key("a")]), + (BooleanValue(true), vec![StackElement::Key("b")]), + (ObjectEnd, vec![]), + ], ); assert_stream_equal( "{\"a\" : 1.0 ,\"b\": [ true ]}", vec![ - (ObjectStart, vec![]), - (F64Value(1.0), vec![StackElement::Key("a")]), - (ArrayStart, vec![StackElement::Key("b")]), - (BooleanValue(true),vec![StackElement::Key("b"), StackElement::Index(0)]), - (ArrayEnd, vec![StackElement::Key("b")]), - (ObjectEnd, vec![]), - ] + (ObjectStart, vec![]), + (F64Value(1.0), vec![StackElement::Key("a")]), + (ArrayStart, vec![StackElement::Key("b")]), + (BooleanValue(true), vec![StackElement::Key("b"), StackElement::Index(0)]), + (ArrayEnd, vec![StackElement::Key("b")]), + (ObjectEnd, vec![]), + ], ); assert_stream_equal( r#"{ @@ -1084,120 +1082,109 @@ fn test_read_object_streaming() { ] }"#, vec![ - (ObjectStart, vec![]), - (F64Value(1.0), vec![StackElement::Key("a")]), - (ArrayStart, vec![StackElement::Key("b")]), - (BooleanValue(true), vec![StackElement::Key("b"), - StackElement::Index(0)]), - (StringValue("foo\nbar".to_string()), vec![StackElement::Key("b"), - StackElement::Index(1)]), - (ObjectStart, vec![StackElement::Key("b"), - StackElement::Index(2)]), - (ObjectStart, vec![StackElement::Key("b"), - StackElement::Index(2), - StackElement::Key("c")]), - (NullValue, vec![StackElement::Key("b"), - StackElement::Index(2), - StackElement::Key("c"), - StackElement::Key("d")]), - (ObjectEnd, vec![StackElement::Key("b"), - StackElement::Index(2), - StackElement::Key("c")]), - (ObjectEnd, vec![StackElement::Key("b"), - StackElement::Index(2)]), - (ArrayEnd, vec![StackElement::Key("b")]), - (ObjectEnd, vec![]), - ] + (ObjectStart, vec![]), + (F64Value(1.0), vec![StackElement::Key("a")]), + (ArrayStart, vec![StackElement::Key("b")]), + (BooleanValue(true), vec![StackElement::Key("b"), StackElement::Index(0)]), + ( + StringValue("foo\nbar".to_string()), + vec![StackElement::Key("b"), StackElement::Index(1)], + ), + (ObjectStart, vec![StackElement::Key("b"), StackElement::Index(2)]), + ( + ObjectStart, + vec![StackElement::Key("b"), StackElement::Index(2), StackElement::Key("c")], + ), + ( + NullValue, + vec![ + StackElement::Key("b"), + StackElement::Index(2), + StackElement::Key("c"), + StackElement::Key("d"), + ], + ), + ( + ObjectEnd, + vec![StackElement::Key("b"), StackElement::Index(2), StackElement::Key("c")], + ), + (ObjectEnd, vec![StackElement::Key("b"), StackElement::Index(2)]), + (ArrayEnd, vec![StackElement::Key("b")]), + (ObjectEnd, vec![]), + ], ); } #[test] fn test_read_array_streaming() { - assert_stream_equal( - "[]", - vec![ - (ArrayStart, vec![]), - (ArrayEnd, vec![]), - ] - ); - assert_stream_equal( - "[ ]", - vec![ - (ArrayStart, vec![]), - (ArrayEnd, vec![]), - ] - ); + assert_stream_equal("[]", vec![(ArrayStart, vec![]), (ArrayEnd, vec![])]); + assert_stream_equal("[ ]", vec![(ArrayStart, vec![]), (ArrayEnd, vec![])]); assert_stream_equal( "[true]", vec![ - (ArrayStart, vec![]), - (BooleanValue(true), vec![StackElement::Index(0)]), - (ArrayEnd, vec![]), - ] + (ArrayStart, vec![]), + (BooleanValue(true), vec![StackElement::Index(0)]), + (ArrayEnd, vec![]), + ], ); assert_stream_equal( "[ false ]", vec![ - (ArrayStart, vec![]), - (BooleanValue(false), vec![StackElement::Index(0)]), - (ArrayEnd, vec![]), - ] + (ArrayStart, vec![]), + (BooleanValue(false), vec![StackElement::Index(0)]), + (ArrayEnd, vec![]), + ], ); assert_stream_equal( "[null]", - vec![ - (ArrayStart, vec![]), - (NullValue, vec![StackElement::Index(0)]), - (ArrayEnd, vec![]), - ] + vec![(ArrayStart, vec![]), (NullValue, vec![StackElement::Index(0)]), (ArrayEnd, vec![])], ); assert_stream_equal( "[3, 1]", vec![ - (ArrayStart, vec![]), - (U64Value(3), vec![StackElement::Index(0)]), - (U64Value(1), vec![StackElement::Index(1)]), - (ArrayEnd, vec![]), - ] + (ArrayStart, vec![]), + (U64Value(3), vec![StackElement::Index(0)]), + (U64Value(1), vec![StackElement::Index(1)]), + (ArrayEnd, vec![]), + ], ); assert_stream_equal( "\n[3, 2]\n", vec![ - (ArrayStart, vec![]), - (U64Value(3), vec![StackElement::Index(0)]), - (U64Value(2), vec![StackElement::Index(1)]), - (ArrayEnd, vec![]), - ] + (ArrayStart, vec![]), + (U64Value(3), vec![StackElement::Index(0)]), + (U64Value(2), vec![StackElement::Index(1)]), + (ArrayEnd, vec![]), + ], ); assert_stream_equal( "[2, [4, 1]]", vec![ - (ArrayStart, vec![]), - (U64Value(2), vec![StackElement::Index(0)]), - (ArrayStart, vec![StackElement::Index(1)]), - (U64Value(4), vec![StackElement::Index(1), StackElement::Index(0)]), - (U64Value(1), vec![StackElement::Index(1), StackElement::Index(1)]), - (ArrayEnd, vec![StackElement::Index(1)]), - (ArrayEnd, vec![]), - ] + (ArrayStart, vec![]), + (U64Value(2), vec![StackElement::Index(0)]), + (ArrayStart, vec![StackElement::Index(1)]), + (U64Value(4), vec![StackElement::Index(1), StackElement::Index(0)]), + (U64Value(1), vec![StackElement::Index(1), StackElement::Index(1)]), + (ArrayEnd, vec![StackElement::Index(1)]), + (ArrayEnd, vec![]), + ], ); - assert_eq!(last_event("["), Error(SyntaxError(EOFWhileParsingValue, 1, 2))); - - assert_eq!(from_str("["), Err(SyntaxError(EOFWhileParsingValue, 1, 2))); - assert_eq!(from_str("[1"), Err(SyntaxError(EOFWhileParsingArray, 1, 3))); - assert_eq!(from_str("[1,"), Err(SyntaxError(EOFWhileParsingValue, 1, 4))); - assert_eq!(from_str("[1,]"), Err(SyntaxError(InvalidSyntax, 1, 4))); - assert_eq!(from_str("[6 7]"), Err(SyntaxError(InvalidSyntax, 1, 4))); + assert_eq!(last_event("["), Error(SyntaxError(EOFWhileParsingValue, 1, 2))); + assert_eq!(from_str("["), Err(SyntaxError(EOFWhileParsingValue, 1, 2))); + assert_eq!(from_str("[1"), Err(SyntaxError(EOFWhileParsingArray, 1, 3))); + assert_eq!(from_str("[1,"), Err(SyntaxError(EOFWhileParsingValue, 1, 4))); + assert_eq!(from_str("[1,]"), Err(SyntaxError(InvalidSyntax, 1, 4))); + assert_eq!(from_str("[6 7]"), Err(SyntaxError(InvalidSyntax, 1, 4))); } #[test] fn test_trailing_characters_streaming() { - assert_eq!(last_event("nulla"), Error(SyntaxError(TrailingCharacters, 1, 5))); - assert_eq!(last_event("truea"), Error(SyntaxError(TrailingCharacters, 1, 5))); + assert_eq!(last_event("nulla"), Error(SyntaxError(TrailingCharacters, 1, 5))); + assert_eq!(last_event("truea"), Error(SyntaxError(TrailingCharacters, 1, 5))); assert_eq!(last_event("falsea"), Error(SyntaxError(TrailingCharacters, 1, 6))); - assert_eq!(last_event("1a"), Error(SyntaxError(TrailingCharacters, 1, 2))); - assert_eq!(last_event("[]a"), Error(SyntaxError(TrailingCharacters, 1, 3))); - assert_eq!(last_event("{}a"), Error(SyntaxError(TrailingCharacters, 1, 3))); + assert_eq!(last_event("1a"), Error(SyntaxError(TrailingCharacters, 1, 2))); + assert_eq!(last_event("[]a"), Error(SyntaxError(TrailingCharacters, 1, 3))); + assert_eq!(last_event("{}a"), Error(SyntaxError(TrailingCharacters, 1, 3))); } #[test] fn test_read_identifiers_streaming() { @@ -1205,18 +1192,18 @@ fn test_read_identifiers_streaming() { assert_eq!(Parser::new("true".chars()).next(), Some(BooleanValue(true))); assert_eq!(Parser::new("false".chars()).next(), Some(BooleanValue(false))); - assert_eq!(last_event("n"), Error(SyntaxError(InvalidSyntax, 1, 2))); - assert_eq!(last_event("nul"), Error(SyntaxError(InvalidSyntax, 1, 4))); - assert_eq!(last_event("t"), Error(SyntaxError(InvalidSyntax, 1, 2))); + assert_eq!(last_event("n"), Error(SyntaxError(InvalidSyntax, 1, 2))); + assert_eq!(last_event("nul"), Error(SyntaxError(InvalidSyntax, 1, 4))); + assert_eq!(last_event("t"), Error(SyntaxError(InvalidSyntax, 1, 2))); assert_eq!(last_event("truz"), Error(SyntaxError(InvalidSyntax, 1, 4))); - assert_eq!(last_event("f"), Error(SyntaxError(InvalidSyntax, 1, 2))); - assert_eq!(last_event("faz"), Error(SyntaxError(InvalidSyntax, 1, 3))); + assert_eq!(last_event("f"), Error(SyntaxError(InvalidSyntax, 1, 2))); + assert_eq!(last_event("faz"), Error(SyntaxError(InvalidSyntax, 1, 3))); } #[test] fn test_to_json() { - use std::collections::{HashMap,BTreeMap}; use json::ToJson; + use std::collections::{BTreeMap, HashMap}; let array2 = Array(vec![U64(1), U64(2)]); let array3 = Array(vec![U64(1), U64(2), U64(3)]); @@ -1279,6 +1266,6 @@ fn test_encode_hashmap_with_arbitrary_key() { let result = hm.encode(&mut encoder); match result.unwrap_err() { EncoderError::BadHashmapKey => (), - _ => panic!("expected bad hash map key") + _ => panic!("expected bad hash map key"), } } diff --git a/src/libserialize/tests/leb128.rs b/src/libserialize/tests/leb128.rs index 4eb4397fec..bf5afb409f 100644 --- a/src/libserialize/tests/leb128.rs +++ b/src/libserialize/tests/leb128.rs @@ -2,7 +2,7 @@ extern crate serialize as rustc_serialize; use rustc_serialize::leb128::*; macro_rules! impl_test_unsigned_leb128 { - ($test_name:ident, $write_fn_name:ident, $read_fn_name:ident, $int_ty:ident) => ( + ($test_name:ident, $write_fn_name:ident, $read_fn_name:ident, $int_ty:ident) => { #[test] fn $test_name() { let mut stream = Vec::new(); @@ -14,13 +14,13 @@ macro_rules! impl_test_unsigned_leb128 { let mut position = 0; for x in 0..62 { let expected = (3u64 << x) as $int_ty; - let (actual, bytes_read) = $read_fn_name(&stream[position ..]); + let (actual, bytes_read) = $read_fn_name(&stream[position..]); assert_eq!(expected, actual); position += bytes_read; } assert_eq!(stream.len(), position); } - ) + }; } impl_test_unsigned_leb128!(test_u16_leb128, write_u16_leb128, read_u16_leb128, u16); diff --git a/src/libserialize/tests/opaque.rs b/src/libserialize/tests/opaque.rs index 592bc09039..aa099bb8a3 100644 --- a/src/libserialize/tests/opaque.rs +++ b/src/libserialize/tests/opaque.rs @@ -2,8 +2,8 @@ extern crate serialize as rustc_serialize; -use rustc_serialize::{Encodable, Decodable}; -use rustc_serialize::opaque::{Encoder, Decoder}; +use rustc_serialize::opaque::{Decoder, Encoder}; +use rustc_serialize::{Decodable, Encodable}; use std::fmt::Debug; #[derive(PartialEq, Clone, Debug, RustcEncodable, RustcDecodable)] @@ -29,7 +29,6 @@ struct Struct { q: Option<u32>, } - fn check_round_trip<T: Encodable + Decodable + PartialEq + Debug>(values: Vec<T>) { let mut encoder = Encoder::new(Vec::new()); @@ -144,13 +143,15 @@ fn test_char() { #[test] fn test_string() { - let vec = vec!["abcbuÖeiovÄnameÜavmpßvmea€µsbpnvapeapmaebn".to_string(), - "abcbuÖganeiovÄnameÜavmpßvmea€µsbpnvapeapmaebn".to_string(), - "abcbuÖganeiovÄnameÜavmpßvmea€µsbpapmaebn".to_string(), - "abcbuÖganeiovÄnameÜavmpßvmeabpnvapeapmaebn".to_string(), - "abcbuÖganeiÄnameÜavmpßvmea€µsbpnvapeapmaebn".to_string(), - "abcbuÖganeiovÄnameÜavmpßvmea€µsbpmaebn".to_string(), - "abcbuÖganeiovÄnameÜavmpßvmea€µnvapeapmaebn".to_string()]; + let vec = vec![ + "abcbuÖeiovÄnameÜavmpßvmea€µsbpnvapeapmaebn".to_string(), + "abcbuÖganeiovÄnameÜavmpßvmea€µsbpnvapeapmaebn".to_string(), + "abcbuÖganeiovÄnameÜavmpßvmea€µsbpapmaebn".to_string(), + "abcbuÖganeiovÄnameÜavmpßvmeabpnvapeapmaebn".to_string(), + "abcbuÖganeiÄnameÜavmpßvmea€µsbpnvapeapmaebn".to_string(), + "abcbuÖganeiovÄnameÜavmpßvmea€µsbpmaebn".to_string(), + "abcbuÖganeiovÄnameÜavmpßvmea€µnvapeapmaebn".to_string(), + ]; check_round_trip(vec); } @@ -182,75 +183,65 @@ fn test_option() { #[test] fn test_struct() { check_round_trip(vec![Struct { - a: (), - b: 10, - c: 11, - d: 12, - e: 13, - f: 14, - - g: 15, - h: 16, - i: 17, - j: 18, - k: 19, - - l: 'x', - m: "abc".to_string(), - n: 20.5, - o: 21.5, - p: false, - q: None, - }]); + a: (), + b: 10, + c: 11, + d: 12, + e: 13, + f: 14, + + g: 15, + h: 16, + i: 17, + j: 18, + k: 19, + + l: 'x', + m: "abc".to_string(), + n: 20.5, + o: 21.5, + p: false, + q: None, + }]); check_round_trip(vec![Struct { - a: (), - b: 101, - c: 111, - d: 121, - e: 131, - f: 141, - - g: -15, - h: -16, - i: -17, - j: -18, - k: -19, - - l: 'y', - m: "def".to_string(), - n: -20.5, - o: -21.5, - p: true, - q: Some(1234567), - }]); + a: (), + b: 101, + c: 111, + d: 121, + e: 131, + f: 141, + + g: -15, + h: -16, + i: -17, + j: -18, + k: -19, + + l: 'y', + m: "def".to_string(), + n: -20.5, + o: -21.5, + p: true, + q: Some(1234567), + }]); } #[derive(PartialEq, Clone, Debug, RustcEncodable, RustcDecodable)] enum Enum { Variant1, Variant2(usize, f32), - Variant3 { - a: i32, - b: char, - c: bool, - }, + Variant3 { a: i32, b: char, c: bool }, } #[test] fn test_enum() { - check_round_trip(vec![Enum::Variant1, - Enum::Variant2(1, 2.5), - Enum::Variant3 { - a: 3, - b: 'b', - c: false, - }, - Enum::Variant3 { - a: -4, - b: 'f', - c: true, - }]); + check_round_trip(vec![ + Enum::Variant1, + Enum::Variant2(1, 2.5), + Enum::Variant3 { a: 3, b: 'b', c: false }, + Enum::Variant3 { a: -4, b: 'f', c: true }, + ]); } #[test] diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml index a22e162bbf..c9ff93eac0 100644 --- a/src/libstd/Cargo.toml +++ b/src/libstd/Cargo.toml @@ -34,16 +34,6 @@ features = [ "rustc-dep-of-std" ] # enable build support for integrating into li [dev-dependencies] rand = "0.7" -[target.x86_64-apple-darwin.dependencies] -rustc_asan = { path = "../librustc_asan" } -rustc_tsan = { path = "../librustc_tsan" } - -[target.x86_64-unknown-linux-gnu.dependencies] -rustc_asan = { path = "../librustc_asan" } -rustc_lsan = { path = "../librustc_lsan" } -rustc_msan = { path = "../librustc_msan" } -rustc_tsan = { path = "../librustc_tsan" } - [target.'cfg(any(all(target_arch = "wasm32", not(target_os = "emscripten")), all(target_vendor = "fortanix", target_env = "sgx")))'.dependencies] dlmalloc = { version = "0.1", features = ['rustc-dep-of-std'] } diff --git a/src/libstd/alloc.rs b/src/libstd/alloc.rs index ff52974775..7fd55af169 100644 --- a/src/libstd/alloc.rs +++ b/src/libstd/alloc.rs @@ -61,9 +61,9 @@ #![stable(feature = "alloc_module", since = "1.28.0")] +use core::ptr::NonNull; use core::sync::atomic::{AtomicPtr, Ordering}; use core::{mem, ptr}; -use core::ptr::NonNull; use crate::sys_common::util::dumb_print; @@ -152,10 +152,12 @@ unsafe impl Alloc for System { } #[inline] - unsafe fn realloc(&mut self, - ptr: NonNull<u8>, - layout: Layout, - new_size: usize) -> Result<NonNull<u8>, AllocErr> { + unsafe fn realloc( + &mut self, + ptr: NonNull<u8>, + layout: Layout, + new_size: usize, + ) -> Result<NonNull<u8>, AllocErr> { NonNull::new(GlobalAlloc::realloc(self, ptr.as_ptr(), layout, new_size)).ok_or(AllocErr) } } @@ -191,11 +193,7 @@ pub fn set_alloc_error_hook(hook: fn(Layout)) { #[unstable(feature = "alloc_error_hook", issue = "51245")] pub fn take_alloc_error_hook() -> fn(Layout) { let hook = HOOK.swap(ptr::null_mut(), Ordering::SeqCst); - if hook.is_null() { - default_alloc_error_hook - } else { - unsafe { mem::transmute(hook) } - } + if hook.is_null() { default_alloc_error_hook } else { unsafe { mem::transmute(hook) } } } fn default_alloc_error_hook(layout: Layout) { @@ -205,24 +203,23 @@ fn default_alloc_error_hook(layout: Layout) { #[cfg(not(test))] #[doc(hidden)] #[alloc_error_handler] -#[unstable(feature = "alloc_internals", issue = "0")] +#[unstable(feature = "alloc_internals", issue = "none")] pub fn rust_oom(layout: Layout) -> ! { let hook = HOOK.load(Ordering::SeqCst); - let hook: fn(Layout) = if hook.is_null() { - default_alloc_error_hook - } else { - unsafe { mem::transmute(hook) } - }; + let hook: fn(Layout) = + if hook.is_null() { default_alloc_error_hook } else { unsafe { mem::transmute(hook) } }; hook(layout); - unsafe { crate::sys::abort_internal(); } + unsafe { + crate::sys::abort_internal(); + } } #[cfg(not(test))] #[doc(hidden)] #[allow(unused_attributes)] -#[unstable(feature = "alloc_internals", issue = "0")] +#[unstable(feature = "alloc_internals", issue = "none")] pub mod __default_lib_allocator { - use super::{System, Layout, GlobalAlloc}; + use super::{GlobalAlloc, Layout, System}; // These magic symbol names are used as a fallback for implementing the // `__rust_alloc` etc symbols (see `src/liballoc/alloc.rs) when there is // no `#[global_allocator]` attribute. @@ -234,29 +231,29 @@ pub mod __default_lib_allocator { // ABI #[rustc_std_internal_symbol] - pub unsafe extern fn __rdl_alloc(size: usize, align: usize) -> *mut u8 { + pub unsafe extern "C" fn __rdl_alloc(size: usize, align: usize) -> *mut u8 { let layout = Layout::from_size_align_unchecked(size, align); System.alloc(layout) } #[rustc_std_internal_symbol] - pub unsafe extern fn __rdl_dealloc(ptr: *mut u8, - size: usize, - align: usize) { + pub unsafe extern "C" fn __rdl_dealloc(ptr: *mut u8, size: usize, align: usize) { System.dealloc(ptr, Layout::from_size_align_unchecked(size, align)) } #[rustc_std_internal_symbol] - pub unsafe extern fn __rdl_realloc(ptr: *mut u8, - old_size: usize, - align: usize, - new_size: usize) -> *mut u8 { + pub unsafe extern "C" fn __rdl_realloc( + ptr: *mut u8, + old_size: usize, + align: usize, + new_size: usize, + ) -> *mut u8 { let old_layout = Layout::from_size_align_unchecked(old_size, align); System.realloc(ptr, old_layout, new_size) } #[rustc_std_internal_symbol] - pub unsafe extern fn __rdl_alloc_zeroed(size: usize, align: usize) -> *mut u8 { + pub unsafe extern "C" fn __rdl_alloc_zeroed(size: usize, align: usize) -> *mut u8 { let layout = Layout::from_size_align_unchecked(size, align); System.alloc_zeroed(layout) } diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index de2f12c9f3..fdc587ba5d 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -487,9 +487,7 @@ where #[inline] #[stable(feature = "hashmap_build_hasher", since = "1.7.0")] pub fn with_hasher(hash_builder: S) -> HashMap<K, V, S> { - HashMap { - base: base::HashMap::with_hasher(hash_builder), - } + HashMap { base: base::HashMap::with_hasher(hash_builder) } } /// Creates an empty `HashMap` with the specified capacity, using `hash_builder` @@ -516,9 +514,7 @@ where #[inline] #[stable(feature = "hashmap_build_hasher", since = "1.7.0")] pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> HashMap<K, V, S> { - HashMap { - base: base::HashMap::with_capacity_and_hasher(capacity, hash_builder), - } + HashMap { base: base::HashMap::with_capacity_and_hasher(capacity, hash_builder) } } /// Returns a reference to the map's [`BuildHasher`]. @@ -584,9 +580,7 @@ where #[inline] #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { - self.base - .try_reserve(additional) - .map_err(map_collection_alloc_err) + self.base.try_reserve(additional).map_err(map_collection_alloc_err) } /// Shrinks the capacity of the map as much as possible. It will drop @@ -636,10 +630,7 @@ where #[inline] #[unstable(feature = "shrink_to", reason = "new API", issue = "56431")] pub fn shrink_to(&mut self, min_capacity: usize) { - assert!( - self.capacity() >= min_capacity, - "Tried to shrink to a larger capacity" - ); + assert!(self.capacity() >= min_capacity, "Tried to shrink to a larger capacity"); self.base.shrink_to(min_capacity); } @@ -977,8 +968,7 @@ where return false; } - self.iter() - .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v)) + self.iter().all(|(key, value)| other.get(key).map_or(false, |v| *value == *v)) } } @@ -1053,9 +1043,7 @@ pub struct Iter<'a, K: 'a, V: 'a> { impl<K, V> Clone for Iter<'_, K, V> { #[inline] fn clone(&self) -> Self { - Iter { - base: self.base.clone(), - } + Iter { base: self.base.clone() } } } @@ -1082,15 +1070,13 @@ impl<'a, K, V> IterMut<'a, K, V> { /// Returns a iterator of references over the remaining items. #[inline] pub(super) fn iter(&self) -> Iter<'_, K, V> { - Iter { - base: self.base.rustc_iter(), - } + Iter { base: self.base.rustc_iter() } } } /// An owning iterator over the entries of a `HashMap`. /// -/// This `struct` is created by the [`into_iter`] method on [`HashMap`][`HashMap`] +/// This `struct` is created by the [`into_iter`] method on [`HashMap`] /// (provided by the `IntoIterator` trait). See its documentation for more. /// /// [`into_iter`]: struct.HashMap.html#method.into_iter @@ -1104,9 +1090,7 @@ impl<K, V> IntoIter<K, V> { /// Returns a iterator of references over the remaining items. #[inline] pub(super) fn iter(&self) -> Iter<'_, K, V> { - Iter { - base: self.base.rustc_iter(), - } + Iter { base: self.base.rustc_iter() } } } @@ -1127,9 +1111,7 @@ pub struct Keys<'a, K: 'a, V: 'a> { impl<K, V> Clone for Keys<'_, K, V> { #[inline] fn clone(&self) -> Self { - Keys { - inner: self.inner.clone(), - } + Keys { inner: self.inner.clone() } } } @@ -1157,9 +1139,7 @@ pub struct Values<'a, K: 'a, V: 'a> { impl<K, V> Clone for Values<'_, K, V> { #[inline] fn clone(&self) -> Self { - Values { - inner: self.inner.clone(), - } + Values { inner: self.inner.clone() } } } @@ -1186,9 +1166,7 @@ impl<'a, K, V> Drain<'a, K, V> { /// Returns a iterator of references over the remaining items. #[inline] pub(super) fn iter(&self) -> Iter<'_, K, V> { - Iter { - base: self.base.rustc_iter(), - } + Iter { base: self.base.rustc_iter() } } } @@ -1285,12 +1263,7 @@ where K: Borrow<Q>, Q: Eq, { - map_raw_entry( - self.map - .base - .raw_entry_mut() - .from_key_hashed_nocheck(hash, k), - ) + map_raw_entry(self.map.base.raw_entry_mut().from_key_hashed_nocheck(hash, k)) } /// Creates a `RawEntryMut` from the given hash. @@ -1650,10 +1623,7 @@ pub struct OccupiedEntry<'a, K: 'a, V: 'a> { #[stable(feature = "debug_hash_map", since = "1.12.0")] impl<K: Debug, V: Debug> Debug for OccupiedEntry<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("OccupiedEntry") - .field("key", self.key()) - .field("value", self.get()) - .finish() + f.debug_struct("OccupiedEntry").field("key", self.key()).field("value", self.get()).finish() } } @@ -1719,9 +1689,7 @@ impl<K, V, S> IntoIterator for HashMap<K, V, S> { /// ``` #[inline] fn into_iter(self) -> IntoIter<K, V> { - IntoIter { - base: self.base.into_iter(), - } + IntoIter { base: self.base.into_iter() } } } @@ -2051,7 +2019,7 @@ impl<'a, K, V> Entry<'a, K, V> { Occupied(mut entry) => { entry.insert(value); entry - }, + } Vacant(entry) => entry.insert_entry(value), } } @@ -2588,10 +2556,9 @@ fn map_entry<'a, K: 'a, V: 'a>(raw: base::RustcEntry<'a, K, V>) -> Entry<'a, K, fn map_collection_alloc_err(err: hashbrown::CollectionAllocErr) -> TryReserveError { match err { hashbrown::CollectionAllocErr::CapacityOverflow => TryReserveError::CapacityOverflow, - hashbrown::CollectionAllocErr::AllocErr { layout } => TryReserveError::AllocError { - layout, - non_exhaustive: (), - }, + hashbrown::CollectionAllocErr::AllocErr { layout } => { + TryReserveError::AllocError { layout, non_exhaustive: () } + } } } @@ -3323,7 +3290,7 @@ mod test_map { #[test] fn test_entry_take_doesnt_corrupt() { #![allow(deprecated)] //rand - // Test for #19292 + // Test for #19292 fn check(m: &HashMap<i32, ()>) { for k in m.keys() { assert!(m.contains_key(k), "{} is in keys() but not in the map?", k); @@ -3483,14 +3450,8 @@ mod test_map { } let hash1 = compute_hash(&map, 1); assert_eq!(map.raw_entry().from_key(&1).unwrap(), (&1, &100)); - assert_eq!( - map.raw_entry().from_hash(hash1, |k| *k == 1).unwrap(), - (&1, &100) - ); - assert_eq!( - map.raw_entry().from_key_hashed_nocheck(hash1, &1).unwrap(), - (&1, &100) - ); + assert_eq!(map.raw_entry().from_hash(hash1, |k| *k == 1).unwrap(), (&1, &100)); + assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash1, &1).unwrap(), (&1, &100)); assert_eq!(map.len(), 6); // Existing key (update) @@ -3504,14 +3465,8 @@ mod test_map { } let hash2 = compute_hash(&map, 2); assert_eq!(map.raw_entry().from_key(&2).unwrap(), (&2, &200)); - assert_eq!( - map.raw_entry().from_hash(hash2, |k| *k == 2).unwrap(), - (&2, &200) - ); - assert_eq!( - map.raw_entry().from_key_hashed_nocheck(hash2, &2).unwrap(), - (&2, &200) - ); + assert_eq!(map.raw_entry().from_hash(hash2, |k| *k == 2).unwrap(), (&2, &200)); + assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash2, &2).unwrap(), (&2, &200)); assert_eq!(map.len(), 6); // Existing key (take) @@ -3561,5 +3516,4 @@ mod test_map { } } } - } diff --git a/src/libstd/collections/hash/set.rs b/src/libstd/collections/hash/set.rs index a038ee8021..b48700fb94 100644 --- a/src/libstd/collections/hash/set.rs +++ b/src/libstd/collections/hash/set.rs @@ -1,9 +1,9 @@ use crate::borrow::Borrow; use crate::collections::TryReserveError; use crate::fmt; -use crate::hash::{Hash, BuildHasher}; +use crate::hash::{BuildHasher, Hash}; use crate::iter::{Chain, FromIterator, FusedIterator}; -use crate::ops::{BitOr, BitAnd, BitXor, Sub}; +use crate::ops::{BitAnd, BitOr, BitXor, Sub}; use super::map::{self, HashMap, Keys, RandomState}; @@ -264,8 +264,9 @@ impl<T, S> HashSet<T, S> { } impl<T, S> HashSet<T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { /// Creates a new empty hash set which will use the given hasher to hash /// keys. @@ -380,7 +381,7 @@ impl<T, S> HashSet<T, S> /// set.try_reserve(10).expect("why is the test harness OOMing on 10 bytes?"); /// ``` #[inline] - #[unstable(feature = "try_reserve", reason = "new API", issue="48043")] + #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")] pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { self.map.try_reserve(additional) } @@ -430,7 +431,7 @@ impl<T, S> HashSet<T, S> /// assert!(set.capacity() >= 2); /// ``` #[inline] - #[unstable(feature = "shrink_to", reason = "new API", issue="56431")] + #[unstable(feature = "shrink_to", reason = "new API", issue = "56431")] pub fn shrink_to(&mut self, min_capacity: usize) { self.map.shrink_to(min_capacity) } @@ -461,10 +462,7 @@ impl<T, S> HashSet<T, S> #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn difference<'a>(&'a self, other: &'a HashSet<T, S>) -> Difference<'a, T, S> { - Difference { - iter: self.iter(), - other, - } + Difference { iter: self.iter(), other } } /// Visits the values representing the symmetric difference, @@ -490,9 +488,10 @@ impl<T, S> HashSet<T, S> /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - pub fn symmetric_difference<'a>(&'a self, - other: &'a HashSet<T, S>) - -> SymmetricDifference<'a, T, S> { + pub fn symmetric_difference<'a>( + &'a self, + other: &'a HashSet<T, S>, + ) -> SymmetricDifference<'a, T, S> { SymmetricDifference { iter: self.difference(other).chain(other.difference(self)) } } @@ -518,15 +517,9 @@ impl<T, S> HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] pub fn intersection<'a>(&'a self, other: &'a HashSet<T, S>) -> Intersection<'a, T, S> { if self.len() <= other.len() { - Intersection { - iter: self.iter(), - other, - } + Intersection { iter: self.iter(), other } } else { - Intersection { - iter: other.iter(), - other: self, - } + Intersection { iter: other.iter(), other: self } } } @@ -552,13 +545,9 @@ impl<T, S> HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] pub fn union<'a>(&'a self, other: &'a HashSet<T, S>) -> Union<'a, T, S> { if self.len() >= other.len() { - Union { - iter: self.iter().chain(other.difference(self)), - } + Union { iter: self.iter().chain(other.difference(self)) } } else { - Union { - iter: other.iter().chain(self.difference(other)), - } + Union { iter: other.iter().chain(self.difference(other)) } } } @@ -583,8 +572,9 @@ impl<T, S> HashSet<T, S> #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool - where T: Borrow<Q>, - Q: Hash + Eq + where + T: Borrow<Q>, + Q: Hash + Eq, { self.map.contains_key(value) } @@ -610,8 +600,9 @@ impl<T, S> HashSet<T, S> #[inline] #[stable(feature = "set_recovery", since = "1.9.0")] pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T> - where T: Borrow<Q>, - Q: Hash + Eq + where + T: Borrow<Q>, + Q: Hash + Eq, { self.map.get_key_value(value).map(|(k, _)| k) } @@ -640,6 +631,38 @@ impl<T, S> HashSet<T, S> self.map.raw_entry_mut().from_key(&value).or_insert(value, ()).0 } + /// Inserts an owned copy of the given `value` into the set if it is not + /// present, then returns a reference to the value in the set. + /// + /// # Examples + /// + /// ``` + /// #![feature(hash_set_entry)] + /// + /// use std::collections::HashSet; + /// + /// let mut set: HashSet<String> = ["cat", "dog", "horse"] + /// .iter().map(|&pet| pet.to_owned()).collect(); + /// + /// assert_eq!(set.len(), 3); + /// for &pet in &["cat", "dog", "fish"] { + /// let value = set.get_or_insert_owned(pet); + /// assert_eq!(value, pet); + /// } + /// assert_eq!(set.len(), 4); // a new "fish" was inserted + /// ``` + #[inline] + #[unstable(feature = "hash_set_entry", issue = "60896")] + pub fn get_or_insert_owned<Q: ?Sized>(&mut self, value: &Q) -> &T + where + T: Borrow<Q>, + Q: Hash + Eq + ToOwned<Owned = T>, + { + // Although the raw entry gives us `&mut T`, we only return `&T` to be consistent with + // `get`. Key mutation is "raw" because you're not supposed to affect `Eq` or `Hash`. + self.map.raw_entry_mut().from_key(value).or_insert_with(|| (value.to_owned(), ())).0 + } + /// Inserts a value computed from `f` into the set if the given `value` is /// not present, then returns a reference to the value in the set. /// @@ -663,9 +686,10 @@ impl<T, S> HashSet<T, S> #[inline] #[unstable(feature = "hash_set_entry", issue = "60896")] pub fn get_or_insert_with<Q: ?Sized, F>(&mut self, value: &Q, f: F) -> &T - where T: Borrow<Q>, - Q: Hash + Eq, - F: FnOnce(&Q) -> T + where + T: Borrow<Q>, + Q: Hash + Eq, + F: FnOnce(&Q) -> T, { // Although the raw entry gives us `&mut T`, we only return `&T` to be consistent with // `get`. Key mutation is "raw" because you're not supposed to affect `Eq` or `Hash`. @@ -717,11 +741,7 @@ impl<T, S> HashSet<T, S> /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn is_subset(&self, other: &HashSet<T, S>) -> bool { - if self.len() <= other.len() { - self.iter().all(|v| other.contains(v)) - } else { - false - } + if self.len() <= other.len() { self.iter().all(|v| other.contains(v)) } else { false } } /// Returns `true` if the set is a superset of another, @@ -824,8 +844,9 @@ impl<T, S> HashSet<T, S> #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool - where T: Borrow<Q>, - Q: Hash + Eq + where + T: Borrow<Q>, + Q: Hash + Eq, { self.map.remove(value).is_some() } @@ -851,8 +872,9 @@ impl<T, S> HashSet<T, S> #[inline] #[stable(feature = "set_recovery", since = "1.9.0")] pub fn take<Q: ?Sized>(&mut self, value: &Q) -> Option<T> - where T: Borrow<Q>, - Q: Hash + Eq + where + T: Borrow<Q>, + Q: Hash + Eq, { self.map.remove_entry(value).map(|(k, _)| k) } @@ -873,7 +895,8 @@ impl<T, S> HashSet<T, S> /// ``` #[stable(feature = "retain_hash_collection", since = "1.18.0")] pub fn retain<F>(&mut self, mut f: F) - where F: FnMut(&T) -> bool + where + F: FnMut(&T) -> bool, { self.map.retain(|k, _| f(k)); } @@ -881,8 +904,9 @@ impl<T, S> HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> PartialEq for HashSet<T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { fn eq(&self, other: &HashSet<T, S>) -> bool { if self.len() != other.len() { @@ -895,15 +919,17 @@ impl<T, S> PartialEq for HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> Eq for HashSet<T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { } #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> fmt::Debug for HashSet<T, S> - where T: Eq + Hash + fmt::Debug, - S: BuildHasher +where + T: Eq + Hash + fmt::Debug, + S: BuildHasher, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_set().entries(self.iter()).finish() @@ -912,8 +938,9 @@ impl<T, S> fmt::Debug for HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> FromIterator<T> for HashSet<T, S> - where T: Eq + Hash, - S: BuildHasher + Default +where + T: Eq + Hash, + S: BuildHasher + Default, { #[inline] fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> HashSet<T, S> { @@ -925,8 +952,9 @@ impl<T, S> FromIterator<T> for HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> Extend<T> for HashSet<T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { #[inline] fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) { @@ -936,8 +964,9 @@ impl<T, S> Extend<T> for HashSet<T, S> #[stable(feature = "hash_extend_copy", since = "1.4.0")] impl<'a, T, S> Extend<&'a T> for HashSet<T, S> - where T: 'a + Eq + Hash + Copy, - S: BuildHasher +where + T: 'a + Eq + Hash + Copy, + S: BuildHasher, { #[inline] fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) { @@ -947,8 +976,9 @@ impl<'a, T, S> Extend<&'a T> for HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> Default for HashSet<T, S> - where T: Eq + Hash, - S: BuildHasher + Default +where + T: Eq + Hash, + S: BuildHasher + Default, { /// Creates an empty `HashSet<T, S>` with the `Default` value for the hasher. #[inline] @@ -959,8 +989,9 @@ impl<T, S> Default for HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> BitOr<&HashSet<T, S>> for &HashSet<T, S> - where T: Eq + Hash + Clone, - S: BuildHasher + Default +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, { type Output = HashSet<T, S>; @@ -991,8 +1022,9 @@ impl<T, S> BitOr<&HashSet<T, S>> for &HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> BitAnd<&HashSet<T, S>> for &HashSet<T, S> - where T: Eq + Hash + Clone, - S: BuildHasher + Default +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, { type Output = HashSet<T, S>; @@ -1023,8 +1055,9 @@ impl<T, S> BitAnd<&HashSet<T, S>> for &HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> BitXor<&HashSet<T, S>> for &HashSet<T, S> - where T: Eq + Hash + Clone, - S: BuildHasher + Default +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, { type Output = HashSet<T, S>; @@ -1055,8 +1088,9 @@ impl<T, S> BitXor<&HashSet<T, S>> for &HashSet<T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<T, S> Sub<&HashSet<T, S>> for &HashSet<T, S> - where T: Eq + Hash + Clone, - S: BuildHasher + Default +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, { type Output = HashSet<T, S>; @@ -1099,7 +1133,7 @@ pub struct Iter<'a, K: 'a> { /// An owning iterator over the items of a `HashSet`. /// -/// This `struct` is created by the [`into_iter`] method on [`HashSet`][`HashSet`] +/// This `struct` is created by the [`into_iter`] method on [`HashSet`] /// (provided by the `IntoIterator` trait). See its documentation for more. /// /// [`HashSet`]: struct.HashSet.html @@ -1280,9 +1314,7 @@ impl<K> FusedIterator for IntoIter<K> {} #[stable(feature = "std_debug", since = "1.16.0")] impl<K: fmt::Debug> fmt::Debug for IntoIter<K> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let entries_iter = self.iter - .iter() - .map(|(k, _)| k); + let entries_iter = self.iter.iter().map(|(k, _)| k); f.debug_list().entries(entries_iter).finish() } } @@ -1313,9 +1345,7 @@ impl<K> FusedIterator for Drain<'_, K> {} #[stable(feature = "std_debug", since = "1.16.0")] impl<K: fmt::Debug> fmt::Debug for Drain<'_, K> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let entries_iter = self.iter - .iter() - .map(|(k, _)| k); + let entries_iter = self.iter.iter().map(|(k, _)| k); f.debug_list().entries(entries_iter).finish() } } @@ -1330,8 +1360,9 @@ impl<T, S> Clone for Intersection<'_, T, S> { #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T, S> Iterator for Intersection<'a, T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { type Item = &'a T; @@ -1354,8 +1385,9 @@ impl<'a, T, S> Iterator for Intersection<'a, T, S> #[stable(feature = "std_debug", since = "1.16.0")] impl<T, S> fmt::Debug for Intersection<'_, T, S> - where T: fmt::Debug + Eq + Hash, - S: BuildHasher +where + T: fmt::Debug + Eq + Hash, + S: BuildHasher, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() @@ -1364,8 +1396,9 @@ impl<T, S> fmt::Debug for Intersection<'_, T, S> #[stable(feature = "fused", since = "1.26.0")] impl<T, S> FusedIterator for Intersection<'_, T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { } @@ -1379,8 +1412,9 @@ impl<T, S> Clone for Difference<'_, T, S> { #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T, S> Iterator for Difference<'a, T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { type Item = &'a T; @@ -1403,15 +1437,17 @@ impl<'a, T, S> Iterator for Difference<'a, T, S> #[stable(feature = "fused", since = "1.26.0")] impl<T, S> FusedIterator for Difference<'_, T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { } #[stable(feature = "std_debug", since = "1.16.0")] impl<T, S> fmt::Debug for Difference<'_, T, S> - where T: fmt::Debug + Eq + Hash, - S: BuildHasher +where + T: fmt::Debug + Eq + Hash, + S: BuildHasher, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() @@ -1428,8 +1464,9 @@ impl<T, S> Clone for SymmetricDifference<'_, T, S> { #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T, S> Iterator for SymmetricDifference<'a, T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { type Item = &'a T; @@ -1445,15 +1482,17 @@ impl<'a, T, S> Iterator for SymmetricDifference<'a, T, S> #[stable(feature = "fused", since = "1.26.0")] impl<T, S> FusedIterator for SymmetricDifference<'_, T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { } #[stable(feature = "std_debug", since = "1.16.0")] impl<T, S> fmt::Debug for SymmetricDifference<'_, T, S> - where T: fmt::Debug + Eq + Hash, - S: BuildHasher +where + T: fmt::Debug + Eq + Hash, + S: BuildHasher, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() @@ -1470,15 +1509,17 @@ impl<T, S> Clone for Union<'_, T, S> { #[stable(feature = "fused", since = "1.26.0")] impl<T, S> FusedIterator for Union<'_, T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { } #[stable(feature = "std_debug", since = "1.16.0")] impl<T, S> fmt::Debug for Union<'_, T, S> - where T: fmt::Debug + Eq + Hash, - S: BuildHasher +where + T: fmt::Debug + Eq + Hash, + S: BuildHasher, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() @@ -1487,8 +1528,9 @@ impl<T, S> fmt::Debug for Union<'_, T, S> #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T, S> Iterator for Union<'a, T, S> - where T: Eq + Hash, - S: BuildHasher +where + T: Eq + Hash, + S: BuildHasher, { type Item = &'a T; @@ -1513,20 +1555,24 @@ fn assert_covariance() { fn into_iter<'new>(v: IntoIter<&'static str>) -> IntoIter<&'new str> { v } - fn difference<'a, 'new>(v: Difference<'a, &'static str, RandomState>) - -> Difference<'a, &'new str, RandomState> { + fn difference<'a, 'new>( + v: Difference<'a, &'static str, RandomState>, + ) -> Difference<'a, &'new str, RandomState> { v } - fn symmetric_difference<'a, 'new>(v: SymmetricDifference<'a, &'static str, RandomState>) - -> SymmetricDifference<'a, &'new str, RandomState> { + fn symmetric_difference<'a, 'new>( + v: SymmetricDifference<'a, &'static str, RandomState>, + ) -> SymmetricDifference<'a, &'new str, RandomState> { v } - fn intersection<'a, 'new>(v: Intersection<'a, &'static str, RandomState>) - -> Intersection<'a, &'new str, RandomState> { + fn intersection<'a, 'new>( + v: Intersection<'a, &'static str, RandomState>, + ) -> Intersection<'a, &'new str, RandomState> { v } - fn union<'a, 'new>(v: Union<'a, &'static str, RandomState>) - -> Union<'a, &'new str, RandomState> { + fn union<'a, 'new>( + v: Union<'a, &'static str, RandomState>, + ) -> Union<'a, &'new str, RandomState> { v } fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> { @@ -1536,8 +1582,8 @@ fn assert_covariance() { #[cfg(test)] mod test_set { - use super::HashSet; use super::super::map::RandomState; + use super::HashSet; #[test] fn test_zero_capacities() { diff --git a/src/libstd/env.rs b/src/libstd/env.rs index cf71b61b91..af35a5d9b7 100644 --- a/src/libstd/env.rs +++ b/src/libstd/env.rs @@ -6,7 +6,7 @@ //! //! There are several functions and structs in this module that have a //! counterpart ending in `os`. Those ending in `os` will return an [`OsString`] -//! and those without will be returning a [`String`]. +//! and those without will return a [`String`]. //! //! [`OsString`]: ../../std/ffi/struct.OsString.html //! [`String`]: ../string/struct.String.html @@ -284,6 +284,7 @@ impl fmt::Display for VarError { #[stable(feature = "env", since = "1.0.0")] impl Error for VarError { + #[allow(deprecated)] fn description(&self) -> &str { match *self { VarError::NotPresent => "environment variable not found", @@ -526,6 +527,7 @@ impl fmt::Display for JoinPathsError { #[stable(feature = "env", since = "1.0.0")] impl Error for JoinPathsError { + #[allow(deprecated, deprecated_in_future)] fn description(&self) -> &str { self.inner.description() } @@ -550,7 +552,7 @@ impl Error for JoinPathsError { /// (including to an empty string). /// - If both do not exist, [`GetUserProfileDirectory`][msdn] is used to return the path. /// -/// [msdn]: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762280(v=vs.85).aspx +/// [msdn]: https://docs.microsoft.com/en-us/windows/win32/api/userenv/nf-userenv-getuserprofiledirectorya /// /// # Examples /// @@ -589,7 +591,7 @@ pub fn home_dir() -> Option<PathBuf> { /// This behavior is identical to that of [`GetTempPath`][msdn], which this /// function uses internally. /// -/// [msdn]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa364992(v=vs.85).aspx +/// [msdn]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-gettemppatha /// /// ```no_run /// use std::env; @@ -876,6 +878,7 @@ pub mod consts { /// - mips64 /// - powerpc /// - powerpc64 + /// - riscv64 /// - s390x /// - sparc64 #[stable(feature = "env", since = "1.0.0")] @@ -1033,6 +1036,11 @@ mod arch { pub const ARCH: &'static str = "hexagon"; } +#[cfg(target_arch = "riscv64")] +mod arch { + pub const ARCH: &'static str = "riscv64"; +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/libstd/error.rs b/src/libstd/error.rs index d4c4cb9c3b..3f6501bc7b 100644 --- a/src/libstd/error.rs +++ b/src/libstd/error.rs @@ -15,7 +15,7 @@ use core::array; -use crate::alloc::{AllocErr, LayoutErr, CannotReallocInPlace}; +use crate::alloc::{AllocErr, CannotReallocInPlace, LayoutErr}; use crate::any::TypeId; use crate::backtrace::Backtrace; use crate::borrow::Cow; @@ -45,97 +45,6 @@ use crate::string; /// [`source`]: trait.Error.html#method.source #[stable(feature = "rust1", since = "1.0.0")] pub trait Error: Debug + Display { - /// **This method is soft-deprecated.** - /// - /// Although using it won’t cause compilation warning, - /// new code should use [`Display`] instead - /// and new `impl`s can omit it. - /// - /// To obtain error description as a string, use `to_string()`. - /// - /// [`Display`]: ../fmt/trait.Display.html - /// - /// # Examples - /// - /// ``` - /// match "xc".parse::<u32>() { - /// Err(e) => { - /// // Print `e` itself, not `e.description()`. - /// println!("Error: {}", e); - /// } - /// _ => println!("No error"), - /// } - /// ``` - #[stable(feature = "rust1", since = "1.0.0")] - fn description(&self) -> &str { - "description() is deprecated; use Display" - } - - /// The lower-level cause of this error, if any. - /// - /// # Examples - /// - /// ``` - /// use std::error::Error; - /// use std::fmt; - /// - /// #[derive(Debug)] - /// struct SuperError { - /// side: SuperErrorSideKick, - /// } - /// - /// impl fmt::Display for SuperError { - /// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - /// write!(f, "SuperError is here!") - /// } - /// } - /// - /// impl Error for SuperError { - /// fn description(&self) -> &str { - /// "I'm the superhero of errors" - /// } - /// - /// fn cause(&self) -> Option<&dyn Error> { - /// Some(&self.side) - /// } - /// } - /// - /// #[derive(Debug)] - /// struct SuperErrorSideKick; - /// - /// impl fmt::Display for SuperErrorSideKick { - /// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - /// write!(f, "SuperErrorSideKick is here!") - /// } - /// } - /// - /// impl Error for SuperErrorSideKick { - /// fn description(&self) -> &str { - /// "I'm SuperError side kick" - /// } - /// } - /// - /// fn get_super_error() -> Result<(), SuperError> { - /// Err(SuperError { side: SuperErrorSideKick }) - /// } - /// - /// fn main() { - /// match get_super_error() { - /// Err(e) => { - /// println!("Error: {}", e.description()); - /// println!("Caused by: {}", e.cause().unwrap()); - /// } - /// _ => println!("No error"), - /// } - /// } - /// ``` - #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_deprecated(since = "1.33.0", reason = "replaced by Error::source, which can support \ - downcasting")] - fn cause(&self) -> Option<&dyn Error> { - self.source() - } - /// The lower-level source of this error, if any. /// /// # Examples @@ -156,10 +65,6 @@ pub trait Error: Debug + Display { /// } /// /// impl Error for SuperError { - /// fn description(&self) -> &str { - /// "I'm the superhero of errors" - /// } - /// /// fn source(&self) -> Option<&(dyn Error + 'static)> { /// Some(&self.side) /// } @@ -174,11 +79,7 @@ pub trait Error: Debug + Display { /// } /// } /// - /// impl Error for SuperErrorSideKick { - /// fn description(&self) -> &str { - /// "I'm SuperError side kick" - /// } - /// } + /// impl Error for SuperErrorSideKick {} /// /// fn get_super_error() -> Result<(), SuperError> { /// Err(SuperError { side: SuperErrorSideKick }) @@ -195,14 +96,21 @@ pub trait Error: Debug + Display { /// } /// ``` #[stable(feature = "error_source", since = "1.30.0")] - fn source(&self) -> Option<&(dyn Error + 'static)> { None } + fn source(&self) -> Option<&(dyn Error + 'static)> { + None + } /// Gets the `TypeId` of `self`. #[doc(hidden)] - #[unstable(feature = "error_type_id", - reason = "this is memory-unsafe to override in user code", - issue = "60784")] - fn type_id(&self, _: private::Internal) -> TypeId where Self: 'static { + #[unstable( + feature = "error_type_id", + reason = "this is memory-unsafe to override in user code", + issue = "60784" + )] + fn type_id(&self, _: private::Internal) -> TypeId + where + Self: 'static, + { TypeId::of::<Self>() } @@ -219,6 +127,28 @@ pub trait Error: Debug + Display { fn backtrace(&self) -> Option<&Backtrace> { None } + + /// ``` + /// if let Err(e) = "xc".parse::<u32>() { + /// // Print `e` itself, no need for description(). + /// eprintln!("Error: {}", e); + /// } + /// ``` + #[stable(feature = "rust1", since = "1.0.0")] + #[rustc_deprecated(since = "1.42.0", reason = "use the Display impl or to_string()")] + fn description(&self) -> &str { + "description() is deprecated; use Display" + } + + #[stable(feature = "rust1", since = "1.0.0")] + #[rustc_deprecated( + since = "1.33.0", + reason = "replaced by Error::source, which can support downcasting" + )] + #[allow(missing_docs)] + fn cause(&self) -> Option<&dyn Error> { + self.source() + } } mod private { @@ -251,11 +181,7 @@ impl<'a, E: Error + 'a> From<E> for Box<dyn Error + 'a> { /// } /// } /// - /// impl Error for AnError { - /// fn description(&self) -> &str { - /// "Description of an error" - /// } - /// } + /// impl Error for AnError {} /// /// let an_error = AnError; /// assert!(0 == mem::size_of_val(&an_error)); @@ -290,11 +216,7 @@ impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync + /// } /// } /// - /// impl Error for AnError { - /// fn description(&self) -> &str { - /// "Description of an error" - /// } - /// } + /// impl Error for AnError {} /// /// unsafe impl Send for AnError {} /// @@ -328,11 +250,15 @@ impl From<String> for Box<dyn Error + Send + Sync> { /// assert!( /// mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error)) /// ``` + #[inline] fn from(err: String) -> Box<dyn Error + Send + Sync> { struct StringError(String); impl Error for StringError { - fn description(&self) -> &str { &self.0 } + #[allow(deprecated)] + fn description(&self) -> &str { + &self.0 + } } impl Display for StringError { @@ -392,6 +318,7 @@ impl<'a> From<&str> for Box<dyn Error + Send + Sync + 'a> { /// assert!( /// mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error)) /// ``` + #[inline] fn from(err: &str) -> Box<dyn Error + Send + Sync + 'a> { From::from(String::from(err)) } @@ -466,44 +393,40 @@ impl<'a> From<Cow<'a, str>> for Box<dyn Error> { } #[unstable(feature = "never_type", issue = "35121")] -impl Error for ! { - fn description(&self) -> &str { *self } -} - -#[unstable(feature = "allocator_api", - reason = "the precise API and guarantees it provides may be tweaked.", - issue = "32838")] -impl Error for AllocErr { - fn description(&self) -> &str { - "memory allocation failed" - } -} - -#[unstable(feature = "allocator_api", - reason = "the precise API and guarantees it provides may be tweaked.", - issue = "32838")] -impl Error for LayoutErr { - fn description(&self) -> &str { - "invalid parameters to Layout::from_size_align" - } -} - -#[unstable(feature = "allocator_api", - reason = "the precise API and guarantees it provides may be tweaked.", - issue = "32838")] -impl Error for CannotReallocInPlace { - fn description(&self) -> &str { - CannotReallocInPlace::description(self) - } -} +impl Error for ! {} + +#[unstable( + feature = "allocator_api", + reason = "the precise API and guarantees it provides may be tweaked.", + issue = "32838" +)] +impl Error for AllocErr {} + +#[unstable( + feature = "allocator_api", + reason = "the precise API and guarantees it provides may be tweaked.", + issue = "32838" +)] +impl Error for LayoutErr {} + +#[unstable( + feature = "allocator_api", + reason = "the precise API and guarantees it provides may be tweaked.", + issue = "32838" +)] +impl Error for CannotReallocInPlace {} #[stable(feature = "rust1", since = "1.0.0")] impl Error for str::ParseBoolError { - fn description(&self) -> &str { "failed to parse bool" } + #[allow(deprecated)] + fn description(&self) -> &str { + "failed to parse bool" + } } #[stable(feature = "rust1", since = "1.0.0")] impl Error for str::Utf8Error { + #[allow(deprecated)] fn description(&self) -> &str { "invalid utf-8: corrupt contents" } @@ -511,6 +434,7 @@ impl Error for str::Utf8Error { #[stable(feature = "rust1", since = "1.0.0")] impl Error for num::ParseIntError { + #[allow(deprecated)] fn description(&self) -> &str { self.__description() } @@ -518,6 +442,7 @@ impl Error for num::ParseIntError { #[stable(feature = "try_from", since = "1.34.0")] impl Error for num::TryFromIntError { + #[allow(deprecated)] fn description(&self) -> &str { self.__description() } @@ -525,6 +450,7 @@ impl Error for num::TryFromIntError { #[stable(feature = "try_from", since = "1.34.0")] impl Error for array::TryFromSliceError { + #[allow(deprecated)] fn description(&self) -> &str { self.__description() } @@ -532,6 +458,7 @@ impl Error for array::TryFromSliceError { #[stable(feature = "rust1", since = "1.0.0")] impl Error for num::ParseFloatError { + #[allow(deprecated)] fn description(&self) -> &str { self.__description() } @@ -539,6 +466,7 @@ impl Error for num::ParseFloatError { #[stable(feature = "rust1", since = "1.0.0")] impl Error for string::FromUtf8Error { + #[allow(deprecated)] fn description(&self) -> &str { "invalid utf-8" } @@ -546,6 +474,7 @@ impl Error for string::FromUtf8Error { #[stable(feature = "rust1", since = "1.0.0")] impl Error for string::FromUtf16Error { + #[allow(deprecated)] fn description(&self) -> &str { "invalid utf-16" } @@ -560,6 +489,7 @@ impl Error for string::ParseError { #[stable(feature = "decode_utf16", since = "1.9.0")] impl Error for char::DecodeUtf16Error { + #[allow(deprecated)] fn description(&self) -> &str { "unpaired surrogate found" } @@ -567,6 +497,7 @@ impl Error for char::DecodeUtf16Error { #[stable(feature = "box_error", since = "1.8.0")] impl<T: Error> Error for Box<T> { + #[allow(deprecated, deprecated_in_future)] fn description(&self) -> &str { Error::description(&**self) } @@ -583,6 +514,7 @@ impl<T: Error> Error for Box<T> { #[stable(feature = "fmt_error", since = "1.11.0")] impl Error for fmt::Error { + #[allow(deprecated)] fn description(&self) -> &str { "an error occurred when formatting an argument" } @@ -590,6 +522,7 @@ impl Error for fmt::Error { #[stable(feature = "try_borrow", since = "1.13.0")] impl Error for cell::BorrowError { + #[allow(deprecated)] fn description(&self) -> &str { "already mutably borrowed" } @@ -597,6 +530,7 @@ impl Error for cell::BorrowError { #[stable(feature = "try_borrow", since = "1.13.0")] impl Error for cell::BorrowMutError { + #[allow(deprecated)] fn description(&self) -> &str { "already borrowed" } @@ -604,6 +538,7 @@ impl Error for cell::BorrowMutError { #[stable(feature = "try_from", since = "1.34.0")] impl Error for char::CharTryFromError { + #[allow(deprecated)] fn description(&self) -> &str { "converted integer out of range for `char`" } @@ -611,6 +546,7 @@ impl Error for char::CharTryFromError { #[stable(feature = "char_from_str", since = "1.20.0")] impl Error for char::ParseCharError { + #[allow(deprecated)] fn description(&self) -> &str { self.__description() } @@ -638,9 +574,7 @@ impl dyn Error + 'static { #[inline] pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T> { if self.is::<T>() { - unsafe { - Some(&*(self as *const dyn Error as *const T)) - } + unsafe { Some(&*(self as *const dyn Error as *const T)) } } else { None } @@ -652,9 +586,7 @@ impl dyn Error + 'static { #[inline] pub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T> { if self.is::<T>() { - unsafe { - Some(&mut *(self as *mut dyn Error as *mut T)) - } + unsafe { Some(&mut *(self as *mut dyn Error as *mut T)) } } else { None } @@ -778,9 +710,7 @@ impl dyn Error { #[unstable(feature = "error_iter", issue = "58520")] #[inline] pub fn chain(&self) -> Chain<'_> { - Chain { - current: Some(self), - } + Chain { current: Some(self) } } } @@ -811,8 +741,7 @@ impl dyn Error + Send { #[inline] #[stable(feature = "error_downcast", since = "1.3.0")] /// Attempts to downcast the box to a concrete type. - pub fn downcast<T: Error + 'static>(self: Box<Self>) - -> Result<Box<T>, Box<dyn Error + Send>> { + pub fn downcast<T: Error + 'static>(self: Box<Self>) -> Result<Box<T>, Box<dyn Error + Send>> { let err: Box<dyn Error> = self; <dyn Error>::downcast(err).map_err(|s| unsafe { // Reapply the `Send` marker. @@ -825,8 +754,7 @@ impl dyn Error + Send + Sync { #[inline] #[stable(feature = "error_downcast", since = "1.3.0")] /// Attempts to downcast the box to a concrete type. - pub fn downcast<T: Error + 'static>(self: Box<Self>) - -> Result<Box<T>, Box<Self>> { + pub fn downcast<T: Error + 'static>(self: Box<Self>) -> Result<Box<T>, Box<Self>> { let err: Box<dyn Error> = self; <dyn Error>::downcast(err).map_err(|s| unsafe { // Reapply the `Send + Sync` marker. @@ -856,12 +784,8 @@ mod tests { } } - impl Error for A { - fn description(&self) -> &str { "A-desc" } - } - impl Error for B { - fn description(&self) -> &str { "A-desc" } - } + impl Error for A {} + impl Error for B {} #[test] fn downcasting() { diff --git a/src/libstd/f32.rs b/src/libstd/f32.rs index 54e0caedda..941ea6a767 100644 --- a/src/libstd/f32.rs +++ b/src/libstd/f32.rs @@ -44,23 +44,7 @@ impl f32 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn floor(self) -> f32 { - // On MSVC LLVM will lower many math intrinsics to a call to the - // corresponding function. On MSVC, however, many of these functions - // aren't actually available as symbols to call, but rather they are all - // `static inline` functions in header files. This means that from a C - // perspective it's "compatible", but not so much from an ABI - // perspective (which we're worried about). - // - // The inline header functions always just cast to a f64 and do their - // operation, so we do that here as well, but only for MSVC targets. - // - // Note that there are many MSVC-specific float operations which - // redirect to this comment, so `floorf` is just one case of a missing - // function on MSVC, but there are many others elsewhere. - #[cfg(target_env = "msvc")] - return (self as f64).floor() as f32; - #[cfg(not(target_env = "msvc"))] - return unsafe { intrinsics::floorf32(self) }; + unsafe { intrinsics::floorf32(self) } } /// Returns the smallest integer greater than or equal to a number. @@ -78,11 +62,7 @@ impl f32 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn ceil(self) -> f32 { - // see notes above in `floor` - #[cfg(target_env = "msvc")] - return (self as f64).ceil() as f32; - #[cfg(not(target_env = "msvc"))] - return unsafe { intrinsics::ceilf32(self) }; + unsafe { intrinsics::ceilf32(self) } } /// Returns the nearest integer to a number. Round half-way cases away from @@ -131,10 +111,10 @@ impl f32 { /// ``` /// use std::f32; /// - /// let x = 3.5_f32; - /// let y = -3.5_f32; - /// let abs_difference_x = (x.fract() - 0.5).abs(); - /// let abs_difference_y = (y.fract() - (-0.5)).abs(); + /// let x = 3.6_f32; + /// let y = -3.6_f32; + /// let abs_difference_x = (x.fract() - 0.6).abs(); + /// let abs_difference_y = (y.fract() - (-0.6)).abs(); /// /// assert!(abs_difference_x <= f32::EPSILON); /// assert!(abs_difference_y <= f32::EPSILON); @@ -348,14 +328,10 @@ impl f32 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn powf(self, n: f32) -> f32 { - // see notes above in `floor` - #[cfg(target_env = "msvc")] - return (self as f64).powf(n as f64) as f32; - #[cfg(not(target_env = "msvc"))] - return unsafe { intrinsics::powf32(self, n) }; + unsafe { intrinsics::powf32(self, n) } } - /// Takes the square root of a number. + /// Returns the square root of a number. /// /// Returns NaN if `self` is a negative number. /// @@ -376,7 +352,7 @@ impl f32 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn sqrt(self) -> f32 { - if self < 0.0 { NAN } else { unsafe { intrinsics::sqrtf32(self) } } + unsafe { intrinsics::sqrtf32(self) } } /// Returns `e^(self)`, (the exponential function). @@ -399,11 +375,7 @@ impl f32 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn exp(self) -> f32 { - // see notes above in `floor` - #[cfg(target_env = "msvc")] - return (self as f64).exp() as f32; - #[cfg(not(target_env = "msvc"))] - return unsafe { intrinsics::expf32(self) }; + unsafe { intrinsics::expf32(self) } } /// Returns `2^(self)`. @@ -447,11 +419,7 @@ impl f32 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn ln(self) -> f32 { - // see notes above in `floor` - #[cfg(target_env = "msvc")] - return (self as f64).ln() as f32; - #[cfg(not(target_env = "msvc"))] - return unsafe { intrinsics::logf32(self) }; + unsafe { intrinsics::logf32(self) } } /// Returns the logarithm of the number with respect to an arbitrary base. @@ -521,11 +489,7 @@ impl f32 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn log10(self) -> f32 { - // see notes above in `floor` - #[cfg(target_env = "msvc")] - return (self as f64).log10() as f32; - #[cfg(not(target_env = "msvc"))] - return unsafe { intrinsics::log10f32(self) }; + unsafe { intrinsics::log10f32(self) } } /// The positive difference of two numbers. @@ -564,7 +528,7 @@ impl f32 { unsafe { cmath::fdimf(self, other) } } - /// Takes the cubic root of a number. + /// Returns the cubic root of a number. /// /// # Examples /// @@ -625,11 +589,7 @@ impl f32 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn sin(self) -> f32 { - // see notes in `core::f32::Float::floor` - #[cfg(target_env = "msvc")] - return (self as f64).sin() as f32; - #[cfg(not(target_env = "msvc"))] - return unsafe { intrinsics::sinf32(self) }; + unsafe { intrinsics::sinf32(self) } } /// Computes the cosine of a number (in radians). @@ -649,11 +609,7 @@ impl f32 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn cos(self) -> f32 { - // see notes in `core::f32::Float::floor` - #[cfg(target_env = "msvc")] - return (self as f64).cos() as f32; - #[cfg(not(target_env = "msvc"))] - return unsafe { intrinsics::cosf32(self) }; + unsafe { intrinsics::cosf32(self) } } /// Computes the tangent of a number (in radians). diff --git a/src/libstd/f64.rs b/src/libstd/f64.rs index aa32e5fb99..d89b38e1a0 100644 --- a/src/libstd/f64.rs +++ b/src/libstd/f64.rs @@ -109,10 +109,10 @@ impl f64 { /// # Examples /// /// ``` - /// let x = 3.5_f64; - /// let y = -3.5_f64; - /// let abs_difference_x = (x.fract() - 0.5).abs(); - /// let abs_difference_y = (y.fract() - (-0.5)).abs(); + /// let x = 3.6_f64; + /// let y = -3.6_f64; + /// let abs_difference_x = (x.fract() - 0.6).abs(); + /// let abs_difference_y = (y.fract() - (-0.6)).abs(); /// /// assert!(abs_difference_x < 1e-10); /// assert!(abs_difference_y < 1e-10); @@ -323,7 +323,7 @@ impl f64 { unsafe { intrinsics::powf64(self, n) } } - /// Takes the square root of a number. + /// Returns the square root of a number. /// /// Returns NaN if `self` is a negative number. /// @@ -342,7 +342,7 @@ impl f64 { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn sqrt(self) -> f64 { - if self < 0.0 { NAN } else { unsafe { intrinsics::sqrtf64(self) } } + unsafe { intrinsics::sqrtf64(self) } } /// Returns `e^(self)`, (the exponential function). @@ -506,7 +506,7 @@ impl f64 { unsafe { cmath::fdim(self, other) } } - /// Takes the cubic root of a number. + /// Returns the cubic root of a number. /// /// # Examples /// diff --git a/src/libstd/ffi/c_str.rs b/src/libstd/ffi/c_str.rs index 14ca0423d8..700e015b08 100644 --- a/src/libstd/ffi/c_str.rs +++ b/src/libstd/ffi/c_str.rs @@ -1,5 +1,5 @@ use crate::ascii; -use crate::borrow::{Cow, Borrow}; +use crate::borrow::{Borrow, Cow}; use crate::cmp::Ordering; use crate::error::Error; use crate::fmt::{self, Write}; @@ -206,7 +206,7 @@ pub struct CStr { // just a raw `c_char` along with some form of marker to make // this an unsized type. Essentially `sizeof(&CStr)` should be the // same as `sizeof(&c_char)` but `CStr` should be an unsized type. - inner: [c_char] + inner: [c_char], } /// An error indicating that an interior nul byte was found. @@ -264,14 +264,10 @@ enum FromBytesWithNulErrorKind { impl FromBytesWithNulError { fn interior_nul(pos: usize) -> FromBytesWithNulError { - FromBytesWithNulError { - kind: FromBytesWithNulErrorKind::InteriorNul(pos), - } + FromBytesWithNulError { kind: FromBytesWithNulErrorKind::InteriorNul(pos) } } fn not_nul_terminated() -> FromBytesWithNulError { - FromBytesWithNulError { - kind: FromBytesWithNulErrorKind::NotNulTerminated, - } + FromBytesWithNulError { kind: FromBytesWithNulErrorKind::NotNulTerminated } } } @@ -493,11 +489,10 @@ impl CString { #[stable(feature = "cstring_into", since = "1.7.0")] pub fn into_string(self) -> Result<String, IntoStringError> { - String::from_utf8(self.into_bytes()) - .map_err(|e| IntoStringError { - error: e.utf8_error(), - inner: unsafe { CString::from_vec_unchecked(e.into_bytes()) }, - }) + String::from_utf8(self.into_bytes()).map_err(|e| IntoStringError { + error: e.utf8_error(), + inner: unsafe { CString::from_vec_unchecked(e.into_bytes()) }, + }) } /// Consumes the `CString` and returns the underlying byte buffer. @@ -645,7 +640,9 @@ impl CString { impl Drop for CString { #[inline] fn drop(&mut self) { - unsafe { *self.inner.get_unchecked_mut(0) = 0; } + unsafe { + *self.inner.get_unchecked_mut(0) = 0; + } } } @@ -711,7 +708,9 @@ impl Default for CString { #[stable(feature = "cstr_borrow", since = "1.3.0")] impl Borrow<CStr> for CString { #[inline] - fn borrow(&self) -> &CStr { self } + fn borrow(&self) -> &CStr { + self + } } #[stable(feature = "cstring_from_cow_cstr", since = "1.28.0")] @@ -856,7 +855,9 @@ impl NulError { /// assert_eq!(nul_error.nul_position(), 7); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn nul_position(&self) -> usize { self.0 } + pub fn nul_position(&self) -> usize { + self.0 + } /// Consumes this error, returning the underlying vector of bytes which /// generated the error in the first place. @@ -870,12 +871,17 @@ impl NulError { /// assert_eq!(nul_error.into_vec(), b"foo\0bar"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn into_vec(self) -> Vec<u8> { self.1 } + pub fn into_vec(self) -> Vec<u8> { + self.1 + } } #[stable(feature = "rust1", since = "1.0.0")] impl Error for NulError { - fn description(&self) -> &str { "nul byte found in data" } + #[allow(deprecated)] + fn description(&self) -> &str { + "nul byte found in data" + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -892,25 +898,26 @@ impl From<NulError> for io::Error { /// [`NulError`]: ../ffi/struct.NulError.html /// [`io::Error`]: ../io/struct.Error.html fn from(_: NulError) -> io::Error { - io::Error::new(io::ErrorKind::InvalidInput, - "data provided contains a nul byte") + io::Error::new(io::ErrorKind::InvalidInput, "data provided contains a nul byte") } } #[stable(feature = "frombyteswithnulerror_impls", since = "1.17.0")] impl Error for FromBytesWithNulError { + #[allow(deprecated)] fn description(&self) -> &str { match self.kind { - FromBytesWithNulErrorKind::InteriorNul(..) => - "data provided contains an interior nul byte", - FromBytesWithNulErrorKind::NotNulTerminated => - "data provided is not nul terminated", + FromBytesWithNulErrorKind::InteriorNul(..) => { + "data provided contains an interior nul byte" + } + FromBytesWithNulErrorKind::NotNulTerminated => "data provided is not nul terminated", } } } #[stable(feature = "frombyteswithnulerror_impls", since = "1.17.0")] impl fmt::Display for FromBytesWithNulError { + #[allow(deprecated, deprecated_in_future)] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(self.description())?; if let FromBytesWithNulErrorKind::InteriorNul(pos) = self.kind { @@ -939,6 +946,7 @@ impl IntoStringError { #[stable(feature = "cstring_into", since = "1.7.0")] impl Error for IntoStringError { + #[allow(deprecated)] fn description(&self) -> &str { "C string contained non-utf8 bytes" } @@ -950,6 +958,7 @@ impl Error for IntoStringError { #[stable(feature = "cstring_into", since = "1.7.0")] impl fmt::Display for IntoStringError { + #[allow(deprecated, deprecated_in_future)] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { self.description().fmt(f) } @@ -1033,8 +1042,7 @@ impl CStr { /// assert!(cstr.is_err()); /// ``` #[stable(feature = "cstr_from_bytes", since = "1.10.0")] - pub fn from_bytes_with_nul(bytes: &[u8]) - -> Result<&CStr, FromBytesWithNulError> { + pub fn from_bytes_with_nul(bytes: &[u8]) -> Result<&CStr, FromBytesWithNulError> { let nul_pos = memchr::memchr(0, bytes); if let Some(nul_pos) = nul_pos { if nul_pos + 1 != bytes.len() { @@ -1065,8 +1073,7 @@ impl CStr { /// ``` #[inline] #[stable(feature = "cstr_from_bytes", since = "1.10.0")] - #[cfg_attr(bootstrap, rustc_const_unstable(feature = "const_cstr_unchecked"))] - #[cfg_attr(not(bootstrap), rustc_const_unstable(feature = "const_cstr_unchecked", issue = "0"))] + #[rustc_const_unstable(feature = "const_cstr_unchecked", issue = "none")] pub const unsafe fn from_bytes_with_nul_unchecked(bytes: &[u8]) -> &CStr { &*(bytes as *const [u8] as *const CStr) } @@ -1120,7 +1127,7 @@ impl CStr { /// [`CString`]: struct.CString.html #[inline] #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_str_as_ptr", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_str_as_ptr", since = "1.32.0")] pub const fn as_ptr(&self) -> *const c_char { self.inner.as_ptr() } @@ -1180,11 +1187,6 @@ impl CStr { /// function will return the corresponding [`&str`] slice. Otherwise, /// it will return an error with details of where UTF-8 validation failed. /// - /// > **Note**: This method is currently implemented to check for validity - /// > after a constant-time cast, but it is planned to alter its definition - /// > in the future to perform the length calculation in addition to the - /// > UTF-8 check whenever this method is called. - /// /// [`&str`]: ../primitive.str.html /// /// # Examples @@ -1213,11 +1215,6 @@ impl CStr { /// [`U+FFFD REPLACEMENT CHARACTER`][U+FFFD] and return a /// [`Cow`]`::`[`Owned`]`(`[`String`]`)` with the result. /// - /// > **Note**: This method is currently implemented to check for validity - /// > after a constant-time cast, but it is planned to alter its definition - /// > in the future to perform the length calculation in addition to the - /// > UTF-8 check whenever this method is called. - /// /// [`Cow`]: ../borrow/enum.Cow.html /// [`Borrowed`]: ../borrow/enum.Cow.html#variant.Borrowed /// [`Owned`]: ../borrow/enum.Cow.html#variant.Owned @@ -1343,10 +1340,10 @@ impl AsRef<CStr> for CString { #[cfg(test)] mod tests { use super::*; - use crate::os::raw::c_char; use crate::borrow::Cow::{Borrowed, Owned}; - use crate::hash::{Hash, Hasher}; use crate::collections::hash_map::DefaultHasher; + use crate::hash::{Hash, Hasher}; + use crate::os::raw::c_char; use crate::rc::Rc; use crate::sync::Arc; @@ -1505,9 +1502,7 @@ mod tests { #[test] fn cstr_const_constructor() { - const CSTR: &CStr = unsafe { - CStr::from_bytes_with_nul_unchecked(b"Hello, world!\0") - }; + const CSTR: &CStr = unsafe { CStr::from_bytes_with_nul_unchecked(b"Hello, world!\0") }; assert_eq!(CSTR.to_str().unwrap(), "Hello, world!"); } diff --git a/src/libstd/ffi/os_str.rs b/src/libstd/ffi/os_str.rs index b9cede7aa5..77da97219b 100644 --- a/src/libstd/ffi/os_str.rs +++ b/src/libstd/ffi/os_str.rs @@ -1,13 +1,13 @@ use crate::borrow::{Borrow, Cow}; -use crate::fmt; -use crate::ops; use crate::cmp; +use crate::fmt; use crate::hash::{Hash, Hasher}; +use crate::ops; use crate::rc::Rc; use crate::sync::Arc; use crate::sys::os_str::{Buf, Slice}; -use crate::sys_common::{AsInner, IntoInner, FromInner}; +use crate::sys_common::{AsInner, FromInner, IntoInner}; /// A type that can represent owned, mutable platform-native strings, but is /// cheaply inter-convertible with Rust strings. @@ -78,7 +78,7 @@ use crate::sys_common::{AsInner, IntoInner, FromInner}; #[derive(Clone)] #[stable(feature = "rust1", since = "1.0.0")] pub struct OsString { - inner: Buf + inner: Buf, } /// Borrowed reference to an OS string (see [`OsString`]). @@ -104,7 +104,7 @@ pub struct OsString { // Anyway, `OsStr` representation and layout are considered implementation detail, are // not documented and must not be relied upon. pub struct OsStr { - inner: Slice + inner: Slice, } impl OsString { @@ -157,7 +157,7 @@ impl OsString { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn into_string(self) -> Result<String, OsString> { - self.inner.into_string().map_err(|buf| OsString { inner: buf} ) + self.inner.into_string().map_err(|buf| OsString { inner: buf }) } /// Extends the string with the given [`&OsStr`] slice. @@ -201,9 +201,7 @@ impl OsString { /// ``` #[stable(feature = "osstring_simple_functions", since = "1.9.0")] pub fn with_capacity(capacity: usize) -> OsString { - OsString { - inner: Buf::with_capacity(capacity) - } + OsString { inner: Buf::with_capacity(capacity) } } /// Truncates the `OsString` to zero length. @@ -327,7 +325,7 @@ impl OsString { /// assert!(s.capacity() >= 3); /// ``` #[inline] - #[unstable(feature = "shrink_to", reason = "new API", issue="56431")] + #[unstable(feature = "shrink_to", reason = "new API", issue = "56431")] pub fn shrink_to(&mut self, min_capacity: usize) { self.inner.shrink_to(min_capacity) } @@ -452,13 +450,21 @@ impl PartialOrd for OsString { (&**self).partial_cmp(&**other) } #[inline] - fn lt(&self, other: &OsString) -> bool { &**self < &**other } + fn lt(&self, other: &OsString) -> bool { + &**self < &**other + } #[inline] - fn le(&self, other: &OsString) -> bool { &**self <= &**other } + fn le(&self, other: &OsString) -> bool { + &**self <= &**other + } #[inline] - fn gt(&self, other: &OsString) -> bool { &**self > &**other } + fn gt(&self, other: &OsString) -> bool { + &**self > &**other + } #[inline] - fn ge(&self, other: &OsString) -> bool { &**self >= &**other } + fn ge(&self, other: &OsString) -> bool { + &**self >= &**other + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -609,6 +615,7 @@ impl OsStr { /// assert!(!os_str.is_empty()); /// ``` #[stable(feature = "osstring_simple_functions", since = "1.9.0")] + #[inline] pub fn is_empty(&self) -> bool { self.inner.inner.is_empty() } @@ -832,13 +839,21 @@ impl PartialOrd for OsStr { self.bytes().partial_cmp(other.bytes()) } #[inline] - fn lt(&self, other: &OsStr) -> bool { self.bytes().lt(other.bytes()) } + fn lt(&self, other: &OsStr) -> bool { + self.bytes().lt(other.bytes()) + } #[inline] - fn le(&self, other: &OsStr) -> bool { self.bytes().le(other.bytes()) } + fn le(&self, other: &OsStr) -> bool { + self.bytes().le(other.bytes()) + } #[inline] - fn gt(&self, other: &OsStr) -> bool { self.bytes().gt(other.bytes()) } + fn gt(&self, other: &OsStr) -> bool { + self.bytes().gt(other.bytes()) + } #[inline] - fn ge(&self, other: &OsStr) -> bool { self.bytes().ge(other.bytes()) } + fn ge(&self, other: &OsStr) -> bool { + self.bytes().ge(other.bytes()) + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -855,7 +870,9 @@ impl PartialOrd<str> for OsStr { #[stable(feature = "rust1", since = "1.0.0")] impl Ord for OsStr { #[inline] - fn cmp(&self, other: &OsStr) -> cmp::Ordering { self.bytes().cmp(other.bytes()) } + fn cmp(&self, other: &OsStr) -> cmp::Ordering { + self.bytes().cmp(other.bytes()) + } } macro_rules! impl_cmp { @@ -863,13 +880,17 @@ macro_rules! impl_cmp { #[stable(feature = "cmp_os_str", since = "1.8.0")] impl<'a, 'b> PartialEq<$rhs> for $lhs { #[inline] - fn eq(&self, other: &$rhs) -> bool { <OsStr as PartialEq>::eq(self, other) } + fn eq(&self, other: &$rhs) -> bool { + <OsStr as PartialEq>::eq(self, other) + } } #[stable(feature = "cmp_os_str", since = "1.8.0")] impl<'a, 'b> PartialEq<$lhs> for $rhs { #[inline] - fn eq(&self, other: &$lhs) -> bool { <OsStr as PartialEq>::eq(self, other) } + fn eq(&self, other: &$lhs) -> bool { + <OsStr as PartialEq>::eq(self, other) + } } #[stable(feature = "cmp_os_str", since = "1.8.0")] @@ -887,7 +908,7 @@ macro_rules! impl_cmp { <OsStr as PartialOrd>::partial_cmp(self, other) } } - } + }; } impl_cmp!(OsString, OsStr); @@ -919,7 +940,9 @@ impl OsStr { #[stable(feature = "rust1", since = "1.0.0")] impl Borrow<OsStr> for OsString { - fn borrow(&self) -> &OsStr { &self[..] } + fn borrow(&self) -> &OsStr { + &self[..] + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -943,6 +966,7 @@ impl AsRef<OsStr> for OsStr { #[stable(feature = "rust1", since = "1.0.0")] impl AsRef<OsStr> for OsString { + #[inline] fn as_ref(&self) -> &OsStr { self } diff --git a/src/libstd/fs.rs b/src/libstd/fs.rs index 01e57ec0ab..cff7bbe5ef 100644 --- a/src/libstd/fs.rs +++ b/src/libstd/fs.rs @@ -1841,7 +1841,7 @@ pub fn read_link<P: AsRef<Path>>(path: P) -> io::Result<PathBuf> { /// or written to a file another application may read). /// /// [changes]: ../io/index.html#platform-specific-behavior -/// [path]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath +/// [path]: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file /// /// # Errors /// diff --git a/src/libstd/future.rs b/src/libstd/future.rs index ac1ef3e1d8..9c7422c2b2 100644 --- a/src/libstd/future.rs +++ b/src/libstd/future.rs @@ -2,11 +2,11 @@ use core::cell::Cell; use core::marker::Unpin; -use core::pin::Pin; +use core::ops::{Drop, Generator, GeneratorState}; use core::option::Option; +use core::pin::Pin; use core::ptr::NonNull; use core::task::{Context, Poll}; -use core::ops::{Drop, Generator, GeneratorState}; #[doc(inline)] #[stable(feature = "futures_api", since = "1.36.0")] @@ -66,9 +66,7 @@ impl Drop for SetOnDrop { unsafe fn set_task_context(cx: &mut Context<'_>) -> SetOnDrop { // transmute the context's lifetime to 'static so we can store it. let cx = core::mem::transmute::<&mut Context<'_>, &mut Context<'static>>(cx); - let old_cx = TLS_CX.with(|tls_cx| { - tls_cx.replace(Some(NonNull::from(cx))) - }); + let old_cx = TLS_CX.with(|tls_cx| tls_cx.replace(Some(NonNull::from(cx)))); SetOnDrop(old_cx) } @@ -77,7 +75,7 @@ unsafe fn set_task_context(cx: &mut Context<'_>) -> SetOnDrop { /// Polls a future in the current thread-local task waker. pub fn poll_with_tls_context<F>(f: Pin<&mut F>) -> Poll<F::Output> where - F: Future + F: Future, { let cx_ptr = TLS_CX.with(|tls_cx| { // Clear the entry so that nested `get_task_waker` calls @@ -88,7 +86,8 @@ where let mut cx_ptr = cx_ptr.expect( "TLS Context not set. This is a rustc bug. \ - Please file an issue on https://github.com/rust-lang/rust."); + Please file an issue on https://github.com/rust-lang/rust.", + ); // Safety: we've ensured exclusive access to the context by // removing the pointer from TLS, only to be replaced once diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index 8e81b292f6..9e6849ba5b 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -232,7 +232,7 @@ impl<R: Seek> BufReader<R> { } } } - self.seek(SeekFrom::Current(offset)).map(|_| ()) + self.seek(SeekFrom::Current(offset)).map(drop) } } @@ -752,6 +752,7 @@ impl<W> From<IntoInnerError<W>> for Error { #[stable(feature = "rust1", since = "1.0.0")] impl<W: Send + fmt::Debug> error::Error for IntoInnerError<W> { + #[allow(deprecated, deprecated_in_future)] fn description(&self) -> &str { error::Error::description(self.error()) } @@ -989,6 +990,68 @@ impl<W: Write> Write for LineWriter<W> { } } + // Vectored writes are very similar to the writes above, but adjusted for + // the list of buffers that we have to write. + fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> { + if self.need_flush { + self.flush()?; + } + + // Find the last newline, and failing that write the whole buffer + let last_newline = bufs + .iter() + .enumerate() + .rev() + .filter_map(|(i, buf)| { + let pos = memchr::memrchr(b'\n', buf)?; + Some((i, pos)) + }) + .next(); + let (i, j) = match last_newline { + Some(pair) => pair, + None => return self.inner.write_vectored(bufs), + }; + let (prefix, suffix) = bufs.split_at(i); + let (buf, suffix) = suffix.split_at(1); + let buf = &buf[0]; + + // Write everything up to the last newline, flushing afterwards. Note + // that only if we finished our entire `write_vectored` do we try the + // subsequent + // `write` + let mut n = 0; + let prefix_amt = prefix.iter().map(|i| i.len()).sum(); + if prefix_amt > 0 { + n += self.inner.write_vectored(prefix)?; + self.need_flush = true; + } + if n == prefix_amt { + match self.inner.write(&buf[..=j]) { + Ok(m) => n += m, + Err(e) if n == 0 => return Err(e), + Err(_) => return Ok(n), + } + self.need_flush = true; + } + if self.flush().is_err() || n != j + 1 + prefix_amt { + return Ok(n); + } + + // ... and now write out everything remaining + match self.inner.write(&buf[j + 1..]) { + Ok(i) => n += i, + Err(_) => return Ok(n), + } + + if suffix.iter().map(|s| s.len()).sum::<usize>() == 0 { + return Ok(n); + } + match self.inner.write_vectored(suffix) { + Ok(i) => Ok(n + i), + Err(_) => Ok(n), + } + } + fn flush(&mut self) -> io::Result<()> { self.inner.flush()?; self.need_flush = false; @@ -1015,7 +1078,7 @@ where #[cfg(test)] mod tests { use crate::io::prelude::*; - use crate::io::{self, BufReader, BufWriter, LineWriter, SeekFrom}; + use crate::io::{self, BufReader, BufWriter, IoSlice, LineWriter, SeekFrom}; use crate::sync::atomic::{AtomicUsize, Ordering}; use crate::thread; @@ -1483,4 +1546,112 @@ mod tests { assert_eq!(l.write(b"a").unwrap_err().kind(), io::ErrorKind::Other) } + + #[test] + fn line_vectored() { + let mut a = LineWriter::new(Vec::new()); + assert_eq!( + a.write_vectored(&[ + IoSlice::new(&[]), + IoSlice::new(b"\n"), + IoSlice::new(&[]), + IoSlice::new(b"a"), + ]) + .unwrap(), + 2, + ); + assert_eq!(a.get_ref(), b"\n"); + + assert_eq!( + a.write_vectored(&[ + IoSlice::new(&[]), + IoSlice::new(b"b"), + IoSlice::new(&[]), + IoSlice::new(b"a"), + IoSlice::new(&[]), + IoSlice::new(b"c"), + ]) + .unwrap(), + 3, + ); + assert_eq!(a.get_ref(), b"\n"); + a.flush().unwrap(); + assert_eq!(a.get_ref(), b"\nabac"); + assert_eq!(a.write_vectored(&[]).unwrap(), 0); + assert_eq!( + a.write_vectored(&[ + IoSlice::new(&[]), + IoSlice::new(&[]), + IoSlice::new(&[]), + IoSlice::new(&[]), + ]) + .unwrap(), + 0, + ); + assert_eq!(a.write_vectored(&[IoSlice::new(b"a\nb"),]).unwrap(), 3); + assert_eq!(a.get_ref(), b"\nabaca\n"); + } + + #[test] + fn line_vectored_partial_and_errors() { + enum Call { + Write { inputs: Vec<&'static [u8]>, output: io::Result<usize> }, + Flush { output: io::Result<()> }, + } + struct Writer { + calls: Vec<Call>, + } + + impl Write for Writer { + fn write(&mut self, buf: &[u8]) -> io::Result<usize> { + self.write_vectored(&[IoSlice::new(buf)]) + } + + fn write_vectored(&mut self, buf: &[IoSlice<'_>]) -> io::Result<usize> { + match self.calls.pop().unwrap() { + Call::Write { inputs, output } => { + assert_eq!(inputs, buf.iter().map(|b| &**b).collect::<Vec<_>>()); + output + } + _ => panic!("unexpected call to write"), + } + } + + fn flush(&mut self) -> io::Result<()> { + match self.calls.pop().unwrap() { + Call::Flush { output } => output, + _ => panic!("unexpected call to flush"), + } + } + } + + impl Drop for Writer { + fn drop(&mut self) { + if !thread::panicking() { + assert_eq!(self.calls.len(), 0); + } + } + } + + // partial writes keep going + let mut a = LineWriter::new(Writer { calls: Vec::new() }); + a.write_vectored(&[IoSlice::new(&[]), IoSlice::new(b"abc")]).unwrap(); + a.get_mut().calls.push(Call::Flush { output: Ok(()) }); + a.get_mut().calls.push(Call::Write { inputs: vec![b"bcx\n"], output: Ok(4) }); + a.get_mut().calls.push(Call::Write { inputs: vec![b"abcx\n"], output: Ok(1) }); + a.write_vectored(&[IoSlice::new(b"x"), IoSlice::new(b"\n")]).unwrap(); + a.get_mut().calls.push(Call::Flush { output: Ok(()) }); + a.flush().unwrap(); + + // erroneous writes stop and don't write more + a.get_mut().calls.push(Call::Write { inputs: vec![b"x\n"], output: Err(err()) }); + assert_eq!(a.write_vectored(&[IoSlice::new(b"x"), IoSlice::new(b"\na")]).unwrap(), 2); + a.get_mut().calls.push(Call::Flush { output: Ok(()) }); + a.get_mut().calls.push(Call::Write { inputs: vec![b"x\n"], output: Ok(2) }); + a.flush().unwrap(); + + fn err() -> io::Error { + io::Error::new(io::ErrorKind::Other, "x") + } + } } diff --git a/src/libstd/io/cursor.rs b/src/libstd/io/cursor.rs index a94176e710..9787cbb556 100644 --- a/src/libstd/io/cursor.rs +++ b/src/libstd/io/cursor.rs @@ -1,7 +1,7 @@ use crate::io::prelude::*; use crate::cmp; -use crate::io::{self, Initializer, SeekFrom, Error, ErrorKind, IoSlice, IoSliceMut}; +use crate::io::{self, Error, ErrorKind, Initializer, IoSlice, IoSliceMut, SeekFrom}; use core::convert::TryInto; @@ -72,7 +72,7 @@ use core::convert::TryInto; /// } /// ``` #[stable(feature = "rust1", since = "1.0.0")] -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct Cursor<T> { inner: T, pos: u64, @@ -113,7 +113,9 @@ impl<T> Cursor<T> { /// let vec = buff.into_inner(); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn into_inner(self) -> T { self.inner } + pub fn into_inner(self) -> T { + self.inner + } /// Gets a reference to the underlying value in this cursor. /// @@ -129,7 +131,9 @@ impl<T> Cursor<T> { /// let reference = buff.get_ref(); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn get_ref(&self) -> &T { &self.inner } + pub fn get_ref(&self) -> &T { + &self.inner + } /// Gets a mutable reference to the underlying value in this cursor. /// @@ -148,7 +152,9 @@ impl<T> Cursor<T> { /// let reference = buff.get_mut(); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn get_mut(&mut self) -> &mut T { &mut self.inner } + pub fn get_mut(&mut self) -> &mut T { + &mut self.inner + } /// Returns the current position of this cursor. /// @@ -170,7 +176,9 @@ impl<T> Cursor<T> { /// assert_eq!(buff.position(), 1); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn position(&self) -> u64 { self.pos } + pub fn position(&self) -> u64 { + self.pos + } /// Sets the position of this cursor. /// @@ -190,14 +198,22 @@ impl<T> Cursor<T> { /// assert_eq!(buff.position(), 4); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn set_position(&mut self, pos: u64) { self.pos = pos; } + pub fn set_position(&mut self, pos: u64) { + self.pos = pos; + } } #[stable(feature = "rust1", since = "1.0.0")] -impl<T> io::Seek for Cursor<T> where T: AsRef<[u8]> { +impl<T> io::Seek for Cursor<T> +where + T: AsRef<[u8]>, +{ fn seek(&mut self, style: SeekFrom) -> io::Result<u64> { let (base_pos, offset) = match style { - SeekFrom::Start(n) => { self.pos = n; return Ok(n); } + SeekFrom::Start(n) => { + self.pos = n; + return Ok(n); + } SeekFrom::End(n) => (self.inner.as_ref().len() as u64, n), SeekFrom::Current(n) => (self.pos, n), }; @@ -207,9 +223,14 @@ impl<T> io::Seek for Cursor<T> where T: AsRef<[u8]> { base_pos.checked_sub((offset.wrapping_neg()) as u64) }; match new_pos { - Some(n) => {self.pos = n; Ok(self.pos)} - None => Err(Error::new(ErrorKind::InvalidInput, - "invalid seek to a negative or overflowing position")) + Some(n) => { + self.pos = n; + Ok(self.pos) + } + None => Err(Error::new( + ErrorKind::InvalidInput, + "invalid seek to a negative or overflowing position", + )), } } @@ -223,7 +244,10 @@ impl<T> io::Seek for Cursor<T> where T: AsRef<[u8]> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<T> Read for Cursor<T> where T: AsRef<[u8]> { +impl<T> Read for Cursor<T> +where + T: AsRef<[u8]>, +{ fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { let n = Read::read(&mut self.fill_buf()?, buf)?; self.pos += n as u64; @@ -256,12 +280,17 @@ impl<T> Read for Cursor<T> where T: AsRef<[u8]> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<T> BufRead for Cursor<T> where T: AsRef<[u8]> { +impl<T> BufRead for Cursor<T> +where + T: AsRef<[u8]>, +{ fn fill_buf(&mut self) -> io::Result<&[u8]> { let amt = cmp::min(self.pos, self.inner.as_ref().len() as u64); Ok(&self.inner.as_ref()[(amt as usize)..]) } - fn consume(&mut self, amt: usize) { self.pos += amt as u64; } + fn consume(&mut self, amt: usize) { + self.pos += amt as u64; + } } // Non-resizing write implementation @@ -278,8 +307,7 @@ fn slice_write_vectored( pos_mut: &mut u64, slice: &mut [u8], bufs: &[IoSlice<'_>], -) -> io::Result<usize> -{ +) -> io::Result<usize> { let mut nwritten = 0; for buf in bufs { let n = slice_write(pos_mut, slice, buf)?; @@ -294,8 +322,10 @@ fn slice_write_vectored( // Resizing write implementation fn vec_write(pos_mut: &mut u64, vec: &mut Vec<u8>, buf: &[u8]) -> io::Result<usize> { let pos: usize = (*pos_mut).try_into().map_err(|_| { - Error::new(ErrorKind::InvalidInput, - "cursor position exceeds maximum possible vector length") + Error::new( + ErrorKind::InvalidInput, + "cursor position exceeds maximum possible vector length", + ) })?; // Make sure the internal buffer is as least as big as where we // currently are @@ -322,8 +352,7 @@ fn vec_write_vectored( pos_mut: &mut u64, vec: &mut Vec<u8>, bufs: &[IoSlice<'_>], -) -> io::Result<usize> -{ +) -> io::Result<usize> { let mut nwritten = 0; for buf in bufs { nwritten += vec_write(pos_mut, vec, buf)?; @@ -344,7 +373,9 @@ impl Write for Cursor<&mut [u8]> { } #[inline] - fn flush(&mut self) -> io::Result<()> { Ok(()) } + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } } #[stable(feature = "cursor_mut_vec", since = "1.25.0")] @@ -358,7 +389,9 @@ impl Write for Cursor<&mut Vec<u8>> { } #[inline] - fn flush(&mut self) -> io::Result<()> { Ok(()) } + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -372,7 +405,9 @@ impl Write for Cursor<Vec<u8>> { } #[inline] - fn flush(&mut self) -> io::Result<()> { Ok(()) } + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } } #[stable(feature = "cursor_box_slice", since = "1.5.0")] @@ -388,13 +423,15 @@ impl Write for Cursor<Box<[u8]>> { } #[inline] - fn flush(&mut self) -> io::Result<()> { Ok(()) } + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } } #[cfg(test)] mod tests { use crate::io::prelude::*; - use crate::io::{Cursor, SeekFrom, IoSlice, IoSliceMut}; + use crate::io::{Cursor, IoSlice, IoSliceMut, SeekFrom}; #[test] fn test_vec_writer() { @@ -402,9 +439,12 @@ mod tests { assert_eq!(writer.write(&[0]).unwrap(), 1); assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3); assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4); - assert_eq!(writer.write_vectored( - &[IoSlice::new(&[]), IoSlice::new(&[8, 9]), IoSlice::new(&[10])], - ).unwrap(), 3); + assert_eq!( + writer + .write_vectored(&[IoSlice::new(&[]), IoSlice::new(&[8, 9]), IoSlice::new(&[10])],) + .unwrap(), + 3 + ); let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; assert_eq!(writer, b); } @@ -415,9 +455,12 @@ mod tests { assert_eq!(writer.write(&[0]).unwrap(), 1); assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3); assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4); - assert_eq!(writer.write_vectored( - &[IoSlice::new(&[]), IoSlice::new(&[8, 9]), IoSlice::new(&[10])], - ).unwrap(), 3); + assert_eq!( + writer + .write_vectored(&[IoSlice::new(&[]), IoSlice::new(&[8, 9]), IoSlice::new(&[10])],) + .unwrap(), + 3 + ); let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; assert_eq!(&writer.get_ref()[..], b); } @@ -429,9 +472,12 @@ mod tests { assert_eq!(writer.write(&[0]).unwrap(), 1); assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3); assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4); - assert_eq!(writer.write_vectored( - &[IoSlice::new(&[]), IoSlice::new(&[8, 9]), IoSlice::new(&[10])], - ).unwrap(), 3); + assert_eq!( + writer + .write_vectored(&[IoSlice::new(&[]), IoSlice::new(&[8, 9]), IoSlice::new(&[10])],) + .unwrap(), + 3 + ); let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; assert_eq!(&writer.get_ref()[..], b); } @@ -461,10 +507,9 @@ mod tests { assert_eq!(writer.write_vectored(&[IoSlice::new(&[0])]).unwrap(), 1); assert_eq!(writer.position(), 1); assert_eq!( - writer.write_vectored(&[ - IoSlice::new(&[1, 2, 3]), - IoSlice::new(&[4, 5, 6, 7]), - ]).unwrap(), + writer + .write_vectored(&[IoSlice::new(&[1, 2, 3]), IoSlice::new(&[4, 5, 6, 7]),]) + .unwrap(), 7, ); assert_eq!(writer.position(), 8); @@ -507,9 +552,9 @@ mod tests { assert_eq!(writer.write_vectored(&[IoSlice::new(&[0])]).unwrap(), 1); assert_eq!(writer.position(), 1); assert_eq!( - writer.write_vectored( - &[IoSlice::new(&[1, 2, 3]), IoSlice::new(&[4, 5, 6, 7])], - ).unwrap(), + writer + .write_vectored(&[IoSlice::new(&[1, 2, 3]), IoSlice::new(&[4, 5, 6, 7])],) + .unwrap(), 7, ); assert_eq!(writer.position(), 8); @@ -546,7 +591,6 @@ mod tests { assert_eq!(writer.position(), 7); assert_eq!(writer.write(&[4]).unwrap(), 1); assert_eq!(writer.position(), 8); - } let b: &[_] = &[1, 3, 2, 0, 0, 0, 0, 4]; assert_eq!(buf, b); @@ -591,10 +635,9 @@ mod tests { assert_eq!(reader.position(), 0); let mut buf = [0]; assert_eq!( - reader.read_vectored(&mut [ - IoSliceMut::new(&mut []), - IoSliceMut::new(&mut buf), - ]).unwrap(), + reader + .read_vectored(&mut [IoSliceMut::new(&mut []), IoSliceMut::new(&mut buf),]) + .unwrap(), 1, ); assert_eq!(reader.position(), 1); @@ -603,10 +646,9 @@ mod tests { let mut buf1 = [0; 4]; let mut buf2 = [0; 4]; assert_eq!( - reader.read_vectored(&mut [ - IoSliceMut::new(&mut buf1), - IoSliceMut::new(&mut buf2), - ]).unwrap(), + reader + .read_vectored(&mut [IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2),]) + .unwrap(), 7, ); let b1: &[_] = &[1, 2, 3, 4]; @@ -646,10 +688,9 @@ mod tests { assert_eq!(reader.position(), 0); let mut buf = [0]; assert_eq!( - reader.read_vectored(&mut [ - IoSliceMut::new(&mut []), - IoSliceMut::new(&mut buf), - ]).unwrap(), + reader + .read_vectored(&mut [IoSliceMut::new(&mut []), IoSliceMut::new(&mut buf),]) + .unwrap(), 1, ); assert_eq!(reader.position(), 1); @@ -658,9 +699,9 @@ mod tests { let mut buf1 = [0; 4]; let mut buf2 = [0; 4]; assert_eq!( - reader.read_vectored( - &mut [IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2)], - ).unwrap(), + reader + .read_vectored(&mut [IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2)],) + .unwrap(), 7, ); let b1: &[_] = &[1, 2, 3, 4]; @@ -708,10 +749,9 @@ mod tests { assert_eq!(reader.read_vectored(&mut [IoSliceMut::new(&mut buf)]).unwrap(), 0); let mut buf = [0]; assert_eq!( - reader.read_vectored(&mut [ - IoSliceMut::new(&mut []), - IoSliceMut::new(&mut buf), - ]).unwrap(), + reader + .read_vectored(&mut [IoSliceMut::new(&mut []), IoSliceMut::new(&mut buf),]) + .unwrap(), 1, ); assert_eq!(reader.len(), 7); @@ -720,9 +760,9 @@ mod tests { let mut buf1 = [0; 4]; let mut buf2 = [0; 4]; assert_eq!( - reader.read_vectored( - &mut [IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2)], - ).unwrap(), + reader + .read_vectored(&mut [IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2)],) + .unwrap(), 7, ); let b1: &[_] = &[1, 2, 3, 4]; @@ -902,4 +942,16 @@ mod tests { c.set_position(<usize>::max_value() as u64 + 1); assert!(c.write_all(&[1, 2, 3]).is_err()); } + + #[test] + fn test_partial_eq() { + assert_eq!(Cursor::new(Vec::<u8>::new()), Cursor::new(Vec::<u8>::new())); + } + + #[test] + fn test_eq() { + struct AssertEq<T: Eq>(pub T); + + let _: AssertEq<Cursor<Vec<u8>>> = AssertEq(Cursor::new(Vec::new())); + } } diff --git a/src/libstd/io/error.rs b/src/libstd/io/error.rs index c20bd3097b..3b55d9b900 100644 --- a/src/libstd/io/error.rs +++ b/src/libstd/io/error.rs @@ -402,9 +402,7 @@ impl Error { /// } /// } /// - /// impl error::Error for MyError { - /// fn description(&self) -> &str { &self.v } - /// } + /// impl error::Error for MyError {} /// /// impl Display for MyError { /// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -536,6 +534,7 @@ impl fmt::Display for Error { #[stable(feature = "rust1", since = "1.0.0")] impl error::Error for Error { + #[allow(deprecated, deprecated_in_future)] fn description(&self) -> &str { match self.repr { Repr::Os(..) | Repr::Simple(..) => self.kind().as_str(), @@ -605,22 +604,18 @@ mod test { struct TestError; impl fmt::Display for TestError { - fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result { - Ok(()) + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("asdf") } } - impl error::Error for TestError { - fn description(&self) -> &str { - "asdf" - } - } + impl error::Error for TestError {} // we have to call all of these UFCS style right now since method // resolution won't implicitly drop the Send+Sync bounds let mut err = Error::new(ErrorKind::Other, TestError); assert!(err.get_ref().unwrap().is::<TestError>()); - assert_eq!("asdf", err.get_ref().unwrap().description()); + assert_eq!("asdf", err.get_ref().unwrap().to_string()); assert!(err.get_mut().unwrap().is::<TestError>()); let extracted = err.into_inner().unwrap(); extracted.downcast::<TestError>().unwrap(); diff --git a/src/libstd/io/lazy.rs b/src/libstd/io/lazy.rs index e864aa2c86..1968d498bb 100644 --- a/src/libstd/io/lazy.rs +++ b/src/libstd/io/lazy.rs @@ -11,16 +11,15 @@ pub struct Lazy<T> { } #[inline] -const fn done<T>() -> *mut Arc<T> { 1_usize as *mut _ } +const fn done<T>() -> *mut Arc<T> { + 1_usize as *mut _ +} unsafe impl<T> Sync for Lazy<T> {} impl<T> Lazy<T> { pub const fn new() -> Lazy<T> { - Lazy { - lock: Mutex::new(), - ptr: Cell::new(ptr::null_mut()), - } + Lazy { lock: Mutex::new(), ptr: Cell::new(ptr::null_mut()) } } } diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index a1a33bade0..95c8934b3d 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -280,7 +280,7 @@ pub use self::error::{Error, ErrorKind, Result}; pub use self::stdio::{stderr, stdin, stdout, Stderr, Stdin, Stdout}; #[stable(feature = "rust1", since = "1.0.0")] pub use self::stdio::{StderrLock, StdinLock, StdoutLock}; -#[unstable(feature = "print_internals", issue = "0")] +#[unstable(feature = "print_internals", issue = "none")] pub use self::stdio::{_eprint, _print}; #[unstable(feature = "libstd_io_internals", issue = "42788")] #[doc(no_inline, hidden)] @@ -2765,8 +2765,7 @@ mod tests { let buf1 = [1; 8]; let buf2 = [2; 16]; let buf3 = [3; 8]; - let mut bufs = - &mut [IoSlice::new(&buf1), IoSlice::new(&buf2), IoSlice::new(&buf3)][..]; + let mut bufs = &mut [IoSlice::new(&buf1), IoSlice::new(&buf2), IoSlice::new(&buf3)][..]; // Only in a single buffer.. bufs = IoSlice::advance(bufs, 1); diff --git a/src/libstd/io/stdio.rs b/src/libstd/io/stdio.rs index 6574ef13db..6add644dcc 100644 --- a/src/libstd/io/stdio.rs +++ b/src/libstd/io/stdio.rs @@ -5,7 +5,7 @@ use crate::io::prelude::*; use crate::cell::RefCell; use crate::fmt; use crate::io::lazy::Lazy; -use crate::io::{self, Initializer, BufReader, LineWriter, IoSlice, IoSliceMut}; +use crate::io::{self, BufReader, Initializer, IoSlice, IoSliceMut, LineWriter}; use crate::sync::{Arc, Mutex, MutexGuard}; use crate::sys::stdio; use crate::sys_common::remutex::{ReentrantMutex, ReentrantMutexGuard}; @@ -50,7 +50,9 @@ struct StderrRaw(stdio::Stderr); /// handles is **not** available to raw handles returned from this function. /// /// The returned handle has no external synchronization or buffering. -fn stdin_raw() -> io::Result<StdinRaw> { stdio::Stdin::new().map(StdinRaw) } +fn stdin_raw() -> io::Result<StdinRaw> { + stdio::Stdin::new().map(StdinRaw) +} /// Constructs a new raw handle to the standard output stream of this process. /// @@ -61,7 +63,9 @@ fn stdin_raw() -> io::Result<StdinRaw> { stdio::Stdin::new().map(StdinRaw) } /// /// The returned handle has no external synchronization or buffering layered on /// top. -fn stdout_raw() -> io::Result<StdoutRaw> { stdio::Stdout::new().map(StdoutRaw) } +fn stdout_raw() -> io::Result<StdoutRaw> { + stdio::Stdout::new().map(StdoutRaw) +} /// Constructs a new raw handle to the standard error stream of this process. /// @@ -70,10 +74,14 @@ fn stdout_raw() -> io::Result<StdoutRaw> { stdio::Stdout::new().map(StdoutRaw) } /// /// The returned handle has no external synchronization or buffering layered on /// top. -fn stderr_raw() -> io::Result<StderrRaw> { stdio::Stderr::new().map(StderrRaw) } +fn stderr_raw() -> io::Result<StderrRaw> { + stdio::Stderr::new().map(StderrRaw) +} impl Read for StdinRaw { - fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) } + fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { + self.0.read(buf) + } fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> { self.0.read_vectored(bufs) @@ -85,22 +93,30 @@ impl Read for StdinRaw { } } impl Write for StdoutRaw { - fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.0.write(buf) } + fn write(&mut self, buf: &[u8]) -> io::Result<usize> { + self.0.write(buf) + } fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> { self.0.write_vectored(bufs) } - fn flush(&mut self) -> io::Result<()> { self.0.flush() } + fn flush(&mut self) -> io::Result<()> { + self.0.flush() + } } impl Write for StderrRaw { - fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.0.write(buf) } + fn write(&mut self, buf: &[u8]) -> io::Result<usize> { + self.0.write(buf) + } fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> { self.0.write_vectored(bufs) } - fn flush(&mut self) -> io::Result<()> { self.0.flush() } + fn flush(&mut self) -> io::Result<()> { + self.0.flush() + } } enum Maybe<T> { @@ -112,7 +128,7 @@ impl<W: io::Write> io::Write for Maybe<W> { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { match *self { Maybe::Real(ref mut w) => handle_ebadf(w.write(buf), buf.len()), - Maybe::Fake => Ok(buf.len()) + Maybe::Fake => Ok(buf.len()), } } @@ -127,7 +143,7 @@ impl<W: io::Write> io::Write for Maybe<W> { fn flush(&mut self) -> io::Result<()> { match *self { Maybe::Real(ref mut w) => handle_ebadf(w.flush(), ()), - Maybe::Fake => Ok(()) + Maybe::Fake => Ok(()), } } } @@ -136,14 +152,14 @@ impl<R: io::Read> io::Read for Maybe<R> { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { match *self { Maybe::Real(ref mut r) => handle_ebadf(r.read(buf), 0), - Maybe::Fake => Ok(0) + Maybe::Fake => Ok(0), } } fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> { match self { Maybe::Real(r) => handle_ebadf(r.read_vectored(bufs), 0), - Maybe::Fake => Ok(0) + Maybe::Fake => Ok(0), } } } @@ -151,7 +167,7 @@ impl<R: io::Read> io::Read for Maybe<R> { fn handle_ebadf<T>(r: io::Result<T>, default: T) -> io::Result<T> { match r { Err(ref e) if stdio::is_ebadf(e) => Ok(default), - r => r + r => r, } } @@ -242,16 +258,14 @@ pub struct StdinLock<'a> { pub fn stdin() -> Stdin { static INSTANCE: Lazy<Mutex<BufReader<Maybe<StdinRaw>>>> = Lazy::new(); return Stdin { - inner: unsafe { - INSTANCE.get(stdin_init).expect("cannot access stdin during shutdown") - }, + inner: unsafe { INSTANCE.get(stdin_init).expect("cannot access stdin during shutdown") }, }; fn stdin_init() -> Arc<Mutex<BufReader<Maybe<StdinRaw>>>> { // This must not reentrantly access `INSTANCE` let stdin = match stdin_raw() { Ok(stdin) => Maybe::Real(stdin), - _ => Maybe::Fake + _ => Maybe::Fake, }; Arc::new(Mutex::new(BufReader::with_capacity(stdio::STDIN_BUF_SIZE, stdin))) @@ -370,8 +384,12 @@ impl Read for StdinLock<'_> { #[stable(feature = "rust1", since = "1.0.0")] impl BufRead for StdinLock<'_> { - fn fill_buf(&mut self) -> io::Result<&[u8]> { self.inner.fill_buf() } - fn consume(&mut self, n: usize) { self.inner.consume(n) } + fn fill_buf(&mut self) -> io::Result<&[u8]> { + self.inner.fill_buf() + } + fn consume(&mut self, n: usize) { + self.inner.consume(n) + } } #[stable(feature = "std_debug", since = "1.16.0")] @@ -466,9 +484,7 @@ pub struct StdoutLock<'a> { pub fn stdout() -> Stdout { static INSTANCE: Lazy<ReentrantMutex<RefCell<LineWriter<Maybe<StdoutRaw>>>>> = Lazy::new(); return Stdout { - inner: unsafe { - INSTANCE.get(stdout_init).expect("cannot access stdout during shutdown") - }, + inner: unsafe { INSTANCE.get(stdout_init).expect("cannot access stdout during shutdown") }, }; fn stdout_init() -> Arc<ReentrantMutex<RefCell<LineWriter<Maybe<StdoutRaw>>>>> { @@ -625,9 +641,7 @@ pub struct StderrLock<'a> { pub fn stderr() -> Stderr { static INSTANCE: Lazy<ReentrantMutex<RefCell<Maybe<StderrRaw>>>> = Lazy::new(); return Stderr { - inner: unsafe { - INSTANCE.get(stderr_init).expect("cannot access stderr during shutdown") - }, + inner: unsafe { INSTANCE.get(stderr_init).expect("cannot access stderr during shutdown") }, }; fn stderr_init() -> Arc<ReentrantMutex<RefCell<Maybe<StderrRaw>>>> { @@ -720,16 +734,16 @@ impl fmt::Debug for StderrLock<'_> { /// /// Note that this does not need to be called for all new threads; the default /// output handle is to the process's stderr stream. -#[unstable(feature = "set_stdio", - reason = "this function may disappear completely or be replaced \ +#[unstable( + feature = "set_stdio", + reason = "this function may disappear completely or be replaced \ with a more general mechanism", - issue = "0")] + issue = "none" +)] #[doc(hidden)] pub fn set_panic(sink: Option<Box<dyn Write + Send>>) -> Option<Box<dyn Write + Send>> { use crate::mem; - LOCAL_STDERR.with(move |slot| { - mem::replace(&mut *slot.borrow_mut(), sink) - }).and_then(|mut s| { + LOCAL_STDERR.with(move |slot| mem::replace(&mut *slot.borrow_mut(), sink)).and_then(|mut s| { let _ = s.flush(); Some(s) }) @@ -743,16 +757,16 @@ pub fn set_panic(sink: Option<Box<dyn Write + Send>>) -> Option<Box<dyn Write + /// /// Note that this does not need to be called for all new threads; the default /// output handle is to the process's stdout stream. -#[unstable(feature = "set_stdio", - reason = "this function may disappear completely or be replaced \ +#[unstable( + feature = "set_stdio", + reason = "this function may disappear completely or be replaced \ with a more general mechanism", - issue = "0")] + issue = "none" +)] #[doc(hidden)] pub fn set_print(sink: Option<Box<dyn Write + Send>>) -> Option<Box<dyn Write + Send>> { use crate::mem; - LOCAL_STDOUT.with(move |slot| { - mem::replace(&mut *slot.borrow_mut(), sink) - }).and_then(|mut s| { + LOCAL_STDOUT.with(move |slot| mem::replace(&mut *slot.borrow_mut(), sink)).and_then(|mut s| { let _ = s.flush(); Some(s) }) @@ -770,41 +784,44 @@ pub fn set_print(sink: Option<Box<dyn Write + Send>>) -> Option<Box<dyn Write + /// However, if the actual I/O causes an error, this function does panic. fn print_to<T>( args: fmt::Arguments<'_>, - local_s: &'static LocalKey<RefCell<Option<Box<dyn Write+Send>>>>, + local_s: &'static LocalKey<RefCell<Option<Box<dyn Write + Send>>>>, global_s: fn() -> T, label: &str, -) -where +) where T: Write, { - let result = local_s.try_with(|s| { - if let Ok(mut borrowed) = s.try_borrow_mut() { - if let Some(w) = borrowed.as_mut() { - return w.write_fmt(args); + let result = local_s + .try_with(|s| { + if let Ok(mut borrowed) = s.try_borrow_mut() { + if let Some(w) = borrowed.as_mut() { + return w.write_fmt(args); + } } - } - global_s().write_fmt(args) - }).unwrap_or_else(|_| { - global_s().write_fmt(args) - }); + global_s().write_fmt(args) + }) + .unwrap_or_else(|_| global_s().write_fmt(args)); if let Err(e) = result { panic!("failed printing to {}: {}", label, e); } } -#[unstable(feature = "print_internals", - reason = "implementation detail which may disappear or be replaced at any time", - issue = "0")] +#[unstable( + feature = "print_internals", + reason = "implementation detail which may disappear or be replaced at any time", + issue = "none" +)] #[doc(hidden)] #[cfg(not(test))] pub fn _print(args: fmt::Arguments<'_>) { print_to(args, &LOCAL_STDOUT, stdout, "stdout"); } -#[unstable(feature = "print_internals", - reason = "implementation detail which may disappear or be replaced at any time", - issue = "0")] +#[unstable( + feature = "print_internals", + reason = "implementation detail which may disappear or be replaced at any time", + issue = "none" +)] #[doc(hidden)] #[cfg(not(test))] pub fn _eprint(args: fmt::Arguments<'_>) { @@ -816,9 +833,9 @@ pub use realstd::io::{_eprint, _print}; #[cfg(test)] mod tests { - use crate::panic::{UnwindSafe, RefUnwindSafe}; - use crate::thread; use super::*; + use crate::panic::{RefUnwindSafe, UnwindSafe}; + use crate::thread; #[test] fn stdout_unwind_safe() { @@ -852,7 +869,9 @@ mod tests { let _a = stderr(); let _a = _a.lock(); panic!(); - }).join().unwrap_err(); + }) + .join() + .unwrap_err(); let _a = stdin(); let _a = _a.lock(); diff --git a/src/libstd/keyword_docs.rs b/src/libstd/keyword_docs.rs index de7ced332f..5c7ee9bded 100644 --- a/src/libstd/keyword_docs.rs +++ b/src/libstd/keyword_docs.rs @@ -27,7 +27,7 @@ /// /// [Reference]: ../reference/expressions/operator-expr.html#type-cast-expressions /// [`crate`]: keyword.crate.html -mod as_keyword { } +mod as_keyword {} #[doc(keyword = "break")] // @@ -99,7 +99,7 @@ mod as_keyword { } /// [Reference on "break and loop values"]: /// ../reference/expressions/loop-expr.html#break-and-loop-values /// -mod break_keyword { } +mod break_keyword {} #[doc(keyword = "const")] // @@ -153,7 +153,7 @@ mod break_keyword { } /// [Rust Book]: /// ../book/ch03-01-variables-and-mutability.html#differences-between-variables-and-constants /// [Reference]: ../reference/items/constant-items.html -mod const_keyword { } +mod const_keyword {} #[doc(keyword = "continue")] // @@ -193,7 +193,7 @@ mod const_keyword { } /// See [continue expressions] from the reference for more details. /// /// [continue expressions]: ../reference/expressions/loop-expr.html#continue-expressions -mod continue_keyword { } +mod continue_keyword {} #[doc(keyword = "crate")] // @@ -230,7 +230,7 @@ mod continue_keyword { } /// module `foo`, from anywhere else in the same crate. /// /// [Reference]: ../reference/items/extern-crates.html -mod crate_keyword { } +mod crate_keyword {} #[doc(keyword = "else")] // @@ -240,7 +240,7 @@ mod crate_keyword { } /// /// [`if`]: keyword.if.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod else_keyword { } +mod else_keyword {} #[doc(keyword = "enum")] // @@ -296,7 +296,7 @@ mod else_keyword { } /// [`Option`]: option/enum.Option.html /// [Rust Book]: ../book/ch06-01-defining-an-enum.html /// [Reference]: ../reference/items/enumerations.html -mod enum_keyword { } +mod enum_keyword {} #[doc(keyword = "extern")] // @@ -338,7 +338,7 @@ mod enum_keyword { } /// [Rust book]: /// ../book/ch19-01-unsafe-rust.html#using-extern-functions-to-call-external-code /// [Reference]: ../reference/items/external-blocks.html -mod extern_keyword { } +mod extern_keyword {} #[doc(keyword = "false")] // @@ -348,7 +348,7 @@ mod extern_keyword { } /// /// [`bool`]: primitive.bool.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod false_keyword { } +mod false_keyword {} #[doc(keyword = "fn")] // @@ -415,7 +415,7 @@ mod false_keyword { } /// [`extern`]: keyword.extern.html /// [Rust book]: ../book/ch03-03-how-functions-work.html /// [Reference]: ../reference/items/functions.html -mod fn_keyword { } +mod fn_keyword {} #[doc(keyword = "for")] // @@ -494,7 +494,7 @@ mod fn_keyword { } /// [Rust book]: /// ../book/ch03-05-control-flow.html#looping-through-a-collection-with-for /// [Reference]: ../reference/expressions/loop-expr.html#iterator-loops -mod for_keyword { } +mod for_keyword {} #[doc(keyword = "if")] // @@ -568,7 +568,7 @@ mod for_keyword { } /// /// [Rust book]: ../book/ch03-05-control-flow.html#if-expressions /// [Reference]: ../reference/expressions/if-expr.html -mod if_keyword { } +mod if_keyword {} #[doc(keyword = "impl")] // @@ -631,7 +631,7 @@ mod if_keyword { } /// [book1]: ../book/ch05-03-method-syntax.html /// [Reference]: ../reference/items/implementations.html /// [book2]: ../book/ch10-02-traits.html#returning-types-that-implement-traits -mod impl_keyword { } +mod impl_keyword {} #[doc(keyword = "in")] // @@ -641,7 +641,7 @@ mod impl_keyword { } /// /// [`for`]: keyword.for.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod in_keyword { } +mod in_keyword {} #[doc(keyword = "let")] // @@ -704,7 +704,7 @@ mod in_keyword { } /// [`if`]: keyword.if.html /// [book2]: ../book/ch18-01-all-the-places-for-patterns.html#let-statements /// [Reference]: ../reference/statements.html#let-statements -mod let_keyword { } +mod let_keyword {} #[doc(keyword = "while")] // @@ -760,7 +760,7 @@ mod let_keyword { } /// [`for`]: keyword.for.html /// [`loop`]: keyword.loop.html /// [reference]: ../reference/expressions/loop-expr.html#predicate-loops -mod while_keyword { } +mod while_keyword {} #[doc(keyword = "loop")] // @@ -806,7 +806,7 @@ mod while_keyword { } /// For more information on `loop` and loops in general, see the [Reference]. /// /// [Reference]: ../reference/expressions/loop-expr.html -mod loop_keyword { } +mod loop_keyword {} #[doc(keyword = "match")] // @@ -856,7 +856,7 @@ mod loop_keyword { } /// For more information on `match` and matching in general, see the [Reference]. /// /// [Reference]: ../reference/expressions/match-expr.html -mod match_keyword { } +mod match_keyword {} #[doc(keyword = "mod")] // @@ -866,7 +866,7 @@ mod match_keyword { } /// /// [modules]: ../reference/items/modules.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod mod_keyword { } +mod mod_keyword {} #[doc(keyword = "move")] // @@ -901,7 +901,7 @@ mod mod_keyword { } /// [`Fn` trait]: ../std/ops/trait.Fn.html /// [closure]: ../book/ch13-01-closures.html /// [threads]: ../book/ch16-01-threads.html#using-move-closures-with-threads -mod move_keyword { } +mod move_keyword {} #[doc(keyword = "mut")] // @@ -910,7 +910,7 @@ mod move_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod mut_keyword { } +mod mut_keyword {} #[doc(keyword = "pub")] // @@ -919,7 +919,7 @@ mod mut_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod pub_keyword { } +mod pub_keyword {} #[doc(keyword = "ref")] // @@ -928,7 +928,7 @@ mod pub_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod ref_keyword { } +mod ref_keyword {} #[doc(keyword = "return")] // @@ -937,7 +937,7 @@ mod ref_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod return_keyword { } +mod return_keyword {} #[doc(keyword = "self")] // @@ -946,7 +946,7 @@ mod return_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod self_keyword { } +mod self_keyword {} #[doc(keyword = "Self")] // @@ -958,7 +958,7 @@ mod self_keyword { } /// [`impl`]: keyword.impl.html /// [`trait`]: keyword.trait.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod self_upper_keyword { } +mod self_upper_keyword {} #[doc(keyword = "static")] // @@ -967,7 +967,7 @@ mod self_upper_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod static_keyword { } +mod static_keyword {} #[doc(keyword = "struct")] // @@ -1075,7 +1075,7 @@ mod static_keyword { } /// [`PhantomData`]: marker/struct.PhantomData.html /// [book]: ../book/ch05-01-defining-structs.html /// [reference]: ../reference/items/structs.html -mod struct_keyword { } +mod struct_keyword {} #[doc(keyword = "super")] // @@ -1085,7 +1085,7 @@ mod struct_keyword { } /// /// [module]: ../reference/items/modules.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod super_keyword { } +mod super_keyword {} #[doc(keyword = "trait")] // @@ -1094,7 +1094,7 @@ mod super_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod trait_keyword { } +mod trait_keyword {} #[doc(keyword = "true")] // @@ -1104,7 +1104,7 @@ mod trait_keyword { } /// /// [`bool`]: primitive.bool.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod true_keyword { } +mod true_keyword {} #[doc(keyword = "type")] // @@ -1113,7 +1113,7 @@ mod true_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod type_keyword { } +mod type_keyword {} #[doc(keyword = "unsafe")] // @@ -1123,7 +1123,7 @@ mod type_keyword { } /// /// [memory safety]: ../book/ch19-01-unsafe-rust.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod unsafe_keyword { } +mod unsafe_keyword {} #[doc(keyword = "use")] // @@ -1132,7 +1132,7 @@ mod unsafe_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod use_keyword { } +mod use_keyword {} #[doc(keyword = "where")] // @@ -1141,7 +1141,7 @@ mod use_keyword { } /// The documentation for this keyword is [not yet complete]. Pull requests welcome! /// /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod where_keyword { } +mod where_keyword {} // 2018 Edition keywords @@ -1149,21 +1149,40 @@ mod where_keyword { } // /// Return a [`Future`] instead of blocking the current thread. /// -/// The documentation for this keyword is [not yet complete]. Pull requests welcome! +/// Use `async` in front of `fn`, `closure`, or a `block` to turn the marked code into a `Future`. +/// As such the code will not be run immediately, but will only be evaluated when the returned +/// future is `.await`ed. +/// +/// We have written an [async book] detailing async/await and trade-offs compared to using threads. +/// +/// ## Editions +/// +/// `async` is a keyword from the 2018 edition onwards. +/// +/// It is available for use in stable rust from version 1.39 onwards. /// /// [`Future`]: ./future/trait.Future.html -/// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod async_keyword { } +/// [async book]: https://rust-lang.github.io/async-book/ +mod async_keyword {} #[doc(keyword = "await")] // /// Suspend execution until the result of a [`Future`] is ready. /// -/// The documentation for this keyword is [not yet complete]. Pull requests welcome! +/// `.await`ing a future will suspend the current function's execution until the `executor` +/// has run the future to completion. +/// +/// Read the [async book] for details on how async/await and executors work. +/// +/// ## Editions +/// +/// `await` is a keyword from the 2018 edition onwards. +/// +/// It is available for use in stable rust from version 1.39 onwards. /// /// [`Future`]: ./future/trait.Future.html -/// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod await_keyword { } +/// [async book]: https://rust-lang.github.io/async-book/ +mod await_keyword {} #[doc(keyword = "dyn")] // @@ -1173,7 +1192,7 @@ mod await_keyword { } /// /// [trait object]: ../book/ch17-02-trait-objects.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod dyn_keyword { } +mod dyn_keyword {} #[doc(keyword = "union")] // @@ -1183,4 +1202,4 @@ mod dyn_keyword { } /// /// [union]: ../reference/items/unions.html /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601 -mod union_keyword { } +mod union_keyword {} diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index de33a2cb21..dc93ac9048 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -196,35 +196,34 @@ //! [primitive types]: ../book/ch03-02-data-types.html #![stable(feature = "rust1", since = "1.0.0")] -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - html_playground_url = "https://play.rust-lang.org/", - issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/", - test(no_crate_inject, attr(deny(warnings))), - test(attr(allow(dead_code, deprecated, unused_variables, unused_mut))))] - +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + html_playground_url = "https://play.rust-lang.org/", + issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/", + test(no_crate_inject, attr(deny(warnings))), + test(attr(allow(dead_code, deprecated, unused_variables, unused_mut))) +)] // Don't link to std. We are std. #![no_std] - #![warn(deprecated_in_future)] #![warn(missing_docs)] #![warn(missing_debug_implementations)] #![deny(intra_doc_link_resolution_failure)] // rustdoc is run without -D warnings #![allow(explicit_outlives_requirements)] #![allow(unused_lifetimes)] - // Tell the compiler to link to either panic_abort or panic_unwind #![needs_panic_runtime] - // std may use features in a platform-specific way #![allow(unused_features)] - #![cfg_attr(test, feature(print_internals, set_stdio, update_panic_count))] -#![cfg_attr(all(target_vendor = "fortanix", target_env = "sgx"), - feature(slice_index_methods, coerce_unsized, - sgx_platform, ptr_wrapping_offset_from))] -#![cfg_attr(all(test, target_vendor = "fortanix", target_env = "sgx"), - feature(fixed_size_array, maybe_uninit_extra))] - +#![cfg_attr( + all(target_vendor = "fortanix", target_env = "sgx"), + feature(slice_index_methods, coerce_unsized, sgx_platform, ptr_wrapping_offset_from) +)] +#![cfg_attr( + all(test, target_vendor = "fortanix", target_env = "sgx"), + feature(fixed_size_array, maybe_uninit_extra) +)] // std is implemented with unstable features, many of which are internal // compiler details that will never be stable // NB: the following list is sorted to minimize merge conflicts. @@ -276,14 +275,11 @@ #![feature(link_args)] #![feature(linkage)] #![feature(log_syntax)] -#![feature(manually_drop_take)] -#![feature(matches_macro)] #![feature(maybe_uninit_ref)] #![feature(maybe_uninit_slice)] #![feature(needs_panic_runtime)] #![feature(never_type)] #![feature(nll)] -#![cfg_attr(bootstrap, feature(on_unimplemented))] #![feature(optin_builtin_traits)] #![feature(panic_info_message)] #![feature(panic_internals)] @@ -293,12 +289,11 @@ #![feature(raw)] #![feature(renamed_spin_loop)] #![feature(rustc_attrs)] -#![cfg_attr(bootstrap, feature(rustc_const_unstable))] #![feature(rustc_private)] #![feature(shrink_to)] #![feature(slice_concat_ext)] #![feature(slice_internals)] -#![feature(slice_patterns)] +#![cfg_attr(bootstrap, feature(slice_patterns))] #![feature(specialization)] #![feature(staged_api)] #![feature(std_internals)] @@ -309,12 +304,12 @@ #![feature(thread_local)] #![feature(toowned_clone_into)] #![feature(trace_macros)] +#![feature(track_caller)] #![feature(try_reserve)] #![feature(unboxed_closures)] #![feature(untagged_unions)] #![feature(unwind_attributes)] // NB: the above list is sorted to minimize merge conflicts. - #![default_lib_allocator] // Explicitly import the prelude. The compiler uses this same unstable attribute @@ -324,7 +319,8 @@ use prelude::v1::*; // Access to Bencher, etc. -#[cfg(test)] extern crate test; +#[cfg(test)] +extern crate test; #[allow(unused_imports)] // macros from `alloc` are not used on all platforms #[macro_use] @@ -350,7 +346,8 @@ extern crate cfg_if; // would generate duplicate lang item errors), and any globals it defines are // _not_ the globals used by "real" std. So this import, defined only during // testing gives test-std access to real-std lang items and globals. See #2912 -#[cfg(test)] extern crate std as realstd; +#[cfg(test)] +extern crate std as realstd; // The standard macros that are not built-in to the compiler. #[macro_use] @@ -361,13 +358,35 @@ pub mod prelude; // Public module declarations and re-exports #[stable(feature = "rust1", since = "1.0.0")] +pub use alloc_crate::borrow; +#[stable(feature = "rust1", since = "1.0.0")] +pub use alloc_crate::boxed; +#[stable(feature = "rust1", since = "1.0.0")] +pub use alloc_crate::fmt; +#[stable(feature = "rust1", since = "1.0.0")] +pub use alloc_crate::format; +#[stable(feature = "rust1", since = "1.0.0")] +pub use alloc_crate::rc; +#[stable(feature = "rust1", since = "1.0.0")] +pub use alloc_crate::slice; +#[stable(feature = "rust1", since = "1.0.0")] +pub use alloc_crate::str; +#[stable(feature = "rust1", since = "1.0.0")] +pub use alloc_crate::string; +#[stable(feature = "rust1", since = "1.0.0")] +pub use alloc_crate::vec; +#[stable(feature = "rust1", since = "1.0.0")] pub use core::any; #[stable(feature = "simd_arch", since = "1.27.0")] #[doc(no_inline)] pub use core::arch; +#[stable(feature = "core_array", since = "1.36.0")] +pub use core::array; #[stable(feature = "rust1", since = "1.0.0")] pub use core::cell; #[stable(feature = "rust1", since = "1.0.0")] +pub use core::char; +#[stable(feature = "rust1", since = "1.0.0")] pub use core::clone; #[stable(feature = "rust1", since = "1.0.0")] pub use core::cmp; @@ -377,9 +396,23 @@ pub use core::convert; pub use core::default; #[stable(feature = "rust1", since = "1.0.0")] pub use core::hash; +#[stable(feature = "core_hint", since = "1.27.0")] +pub use core::hint; +#[stable(feature = "i128", since = "1.26.0")] +pub use core::i128; +#[stable(feature = "rust1", since = "1.0.0")] +pub use core::i16; +#[stable(feature = "rust1", since = "1.0.0")] +pub use core::i32; +#[stable(feature = "rust1", since = "1.0.0")] +pub use core::i64; +#[stable(feature = "rust1", since = "1.0.0")] +pub use core::i8; #[stable(feature = "rust1", since = "1.0.0")] pub use core::intrinsics; #[stable(feature = "rust1", since = "1.0.0")] +pub use core::isize; +#[stable(feature = "rust1", since = "1.0.0")] pub use core::iter; #[stable(feature = "rust1", since = "1.0.0")] pub use core::marker; @@ -388,29 +421,17 @@ pub use core::mem; #[stable(feature = "rust1", since = "1.0.0")] pub use core::ops; #[stable(feature = "rust1", since = "1.0.0")] +pub use core::option; +#[stable(feature = "pin", since = "1.33.0")] +pub use core::pin; +#[stable(feature = "rust1", since = "1.0.0")] pub use core::ptr; #[stable(feature = "rust1", since = "1.0.0")] pub use core::raw; #[stable(feature = "rust1", since = "1.0.0")] pub use core::result; -#[stable(feature = "rust1", since = "1.0.0")] -pub use core::option; -#[stable(feature = "rust1", since = "1.0.0")] -pub use core::isize; -#[stable(feature = "rust1", since = "1.0.0")] -pub use core::i8; -#[stable(feature = "rust1", since = "1.0.0")] -pub use core::i16; -#[stable(feature = "rust1", since = "1.0.0")] -pub use core::i32; -#[stable(feature = "rust1", since = "1.0.0")] -pub use core::i64; #[stable(feature = "i128", since = "1.26.0")] -pub use core::i128; -#[stable(feature = "rust1", since = "1.0.0")] -pub use core::usize; -#[stable(feature = "rust1", since = "1.0.0")] -pub use core::u8; +pub use core::u128; #[stable(feature = "rust1", since = "1.0.0")] pub use core::u16; #[stable(feature = "rust1", since = "1.0.0")] @@ -418,33 +439,9 @@ pub use core::u32; #[stable(feature = "rust1", since = "1.0.0")] pub use core::u64; #[stable(feature = "rust1", since = "1.0.0")] -pub use alloc_crate::boxed; -#[stable(feature = "rust1", since = "1.0.0")] -pub use alloc_crate::rc; -#[stable(feature = "rust1", since = "1.0.0")] -pub use alloc_crate::borrow; -#[stable(feature = "rust1", since = "1.0.0")] -pub use alloc_crate::fmt; -#[stable(feature = "rust1", since = "1.0.0")] -pub use alloc_crate::format; -#[stable(feature = "pin", since = "1.33.0")] -pub use core::pin; -#[stable(feature = "rust1", since = "1.0.0")] -pub use alloc_crate::slice; -#[stable(feature = "rust1", since = "1.0.0")] -pub use alloc_crate::str; -#[stable(feature = "rust1", since = "1.0.0")] -pub use alloc_crate::string; -#[stable(feature = "rust1", since = "1.0.0")] -pub use alloc_crate::vec; +pub use core::u8; #[stable(feature = "rust1", since = "1.0.0")] -pub use core::char; -#[stable(feature = "i128", since = "1.26.0")] -pub use core::u128; -#[stable(feature = "core_hint", since = "1.27.0")] -pub use core::hint; -#[stable(feature = "core_array", since = "1.36.0")] -pub use core::array; +pub use core::usize; pub mod f32; pub mod f64; @@ -487,8 +484,8 @@ mod sys; pub mod alloc; // Private support modules -mod panicking; mod memchr; +mod panicking; // The runtime entry point and a few unstable public functions used by the // compiler @@ -518,44 +515,44 @@ pub use core::{ // Stable assert_eq, assert_ne, + debug_assert, debug_assert_eq, debug_assert_ne, - debug_assert, + // Unstable + matches, r#try, + todo, unimplemented, unreachable, write, writeln, - // Unstable - todo, - matches, }; // Re-export built-in macros defined through libcore. #[stable(feature = "builtin_macro_prelude", since = "1.38.0")] pub use core::{ + // Unstable + asm, // Stable assert, cfg, column, compile_error, concat, + concat_idents, env, file, format_args, + format_args_nl, + global_asm, include, include_bytes, include_str, line, + log_syntax, module_path, option_env, stringify, - // Unstable - asm, - concat_idents, - format_args_nl, - global_asm, - log_syntax, trace_macros, }; diff --git a/src/libstd/macros.rs b/src/libstd/macros.rs index 11850a1b5f..18fb0f8768 100644 --- a/src/libstd/macros.rs +++ b/src/libstd/macros.rs @@ -4,6 +4,7 @@ //! library. Each macro is available for use when linking against the standard //! library. +#[cfg(bootstrap)] #[doc(include = "../libcore/macros/panic.md")] #[macro_export] #[stable(feature = "rust1", since = "1.0.0")] @@ -19,8 +20,21 @@ macro_rules! panic { $crate::panic!($msg) }); ($fmt:expr, $($arg:tt)+) => ({ - $crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+), - &($crate::file!(), $crate::line!(), $crate::column!())) + $crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+)) + }); +} + +#[cfg(not(bootstrap))] +#[doc(include = "../libcore/macros/panic.md")] +#[macro_export] +#[stable(feature = "rust1", since = "1.0.0")] +#[allow_internal_unstable(libstd_sys_internals)] +macro_rules! panic { + () => ({ $crate::panic!("explicit panic") }); + ($msg:expr) => ({ $crate::rt::begin_panic($msg) }); + ($msg:expr,) => ({ $crate::panic!($msg) }); + ($fmt:expr, $($arg:tt)+) => ({ + $crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+)) }); } diff --git a/src/libstd/net/addr.rs b/src/libstd/net/addr.rs index d5f4ece726..a59d7f0263 100644 --- a/src/libstd/net/addr.rs +++ b/src/libstd/net/addr.rs @@ -4,7 +4,7 @@ use crate::hash; use crate::io; use crate::iter; use crate::mem; -use crate::net::{hton, ntoh, IpAddr, Ipv4Addr, Ipv6Addr}; +use crate::net::{htons, ntohs, IpAddr, Ipv4Addr, Ipv6Addr}; use crate::option; use crate::slice; use crate::sys::net::netc as c; @@ -227,10 +227,7 @@ impl SocketAddr { /// ``` #[stable(feature = "sockaddr_checker", since = "1.16.0")] pub fn is_ipv4(&self) -> bool { - match *self { - SocketAddr::V4(_) => true, - SocketAddr::V6(_) => false, - } + matches!(*self, SocketAddr::V4(_)) } /// Returns [`true`] if the [IP address] in this `SocketAddr` is an @@ -252,10 +249,7 @@ impl SocketAddr { /// ``` #[stable(feature = "sockaddr_checker", since = "1.16.0")] pub fn is_ipv6(&self) -> bool { - match *self { - SocketAddr::V4(_) => false, - SocketAddr::V6(_) => true, - } + matches!(*self, SocketAddr::V6(_)) } } @@ -276,7 +270,7 @@ impl SocketAddrV4 { SocketAddrV4 { inner: c::sockaddr_in { sin_family: c::AF_INET as c::sa_family_t, - sin_port: hton(port), + sin_port: htons(port), sin_addr: *ip.as_inner(), ..unsafe { mem::zeroed() } }, @@ -326,7 +320,7 @@ impl SocketAddrV4 { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn port(&self) -> u16 { - ntoh(self.inner.sin_port) + ntohs(self.inner.sin_port) } /// Changes the port number associated with this socket address. @@ -342,7 +336,7 @@ impl SocketAddrV4 { /// ``` #[stable(feature = "sockaddr_setters", since = "1.9.0")] pub fn set_port(&mut self, new_port: u16) { - self.inner.sin_port = hton(new_port); + self.inner.sin_port = htons(new_port); } } @@ -368,7 +362,7 @@ impl SocketAddrV6 { SocketAddrV6 { inner: c::sockaddr_in6 { sin6_family: c::AF_INET6 as c::sa_family_t, - sin6_port: hton(port), + sin6_port: htons(port), sin6_addr: *ip.as_inner(), sin6_flowinfo: flowinfo, sin6_scope_id: scope_id, @@ -420,7 +414,7 @@ impl SocketAddrV6 { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn port(&self) -> u16 { - ntoh(self.inner.sin6_port) + ntohs(self.inner.sin6_port) } /// Changes the port number associated with this socket address. @@ -436,7 +430,7 @@ impl SocketAddrV6 { /// ``` #[stable(feature = "sockaddr_setters", since = "1.9.0")] pub fn set_port(&mut self, new_port: u16) { - self.inner.sin6_port = hton(new_port); + self.inner.sin6_port = htons(new_port); } /// Returns the flow information associated with this address. diff --git a/src/libstd/net/ip.rs b/src/libstd/net/ip.rs index 7d69f8f4b8..6410a4f2b6 100644 --- a/src/libstd/net/ip.rs +++ b/src/libstd/net/ip.rs @@ -1,11 +1,15 @@ -#![unstable(feature = "ip", reason = "extra functionality has not been \ +#![unstable( + feature = "ip", + reason = "extra functionality has not been \ scrutinized to the level that it should \ be to be stable", - issue = "27709")] + issue = "27709" +)] use crate::cmp::Ordering; use crate::fmt; use crate::hash; +use crate::io::Write; use crate::sys::net::netc as c; use crate::sys_common::{AsInner, FromInner}; @@ -127,7 +131,7 @@ pub enum Ipv6MulticastScope { AdminLocal, SiteLocal, OrganizationLocal, - Global + Global, } impl IpAddr { @@ -277,10 +281,7 @@ impl IpAddr { /// ``` #[stable(feature = "ipaddr_checker", since = "1.16.0")] pub fn is_ipv4(&self) -> bool { - match self { - IpAddr::V4(_) => true, - IpAddr::V6(_) => false, - } + matches!(self, IpAddr::V4(_)) } /// Returns [`true`] if this address is an [IPv6 address], and [`false`] otherwise. @@ -299,10 +300,7 @@ impl IpAddr { /// ``` #[stable(feature = "ipaddr_checker", since = "1.16.0")] pub fn is_ipv6(&self) -> bool { - match self { - IpAddr::V4(_) => false, - IpAddr::V6(_) => true, - } + matches!(self, IpAddr::V6(_)) } } @@ -319,19 +317,16 @@ impl Ipv4Addr { /// let addr = Ipv4Addr::new(127, 0, 0, 1); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_ipv4", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_ipv4", since = "1.32.0")] pub const fn new(a: u8, b: u8, c: u8, d: u8) -> Ipv4Addr { // FIXME: should just be u32::from_be_bytes([a, b, c, d]), // once that method is no longer rustc_const_unstable Ipv4Addr { inner: c::in_addr { s_addr: u32::to_be( - ((a as u32) << 24) | - ((b as u32) << 16) | - ((c as u32) << 8) | - (d as u32) + ((a as u32) << 24) | ((b as u32) << 16) | ((c as u32) << 8) | (d as u32), ), - } + }, } } @@ -407,7 +402,7 @@ impl Ipv4Addr { /// assert_eq!(Ipv4Addr::new(45, 22, 13, 197).is_unspecified(), false); /// ``` #[stable(feature = "ip_shared", since = "1.12.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_ipv4", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_ipv4", since = "1.32.0")] pub const fn is_unspecified(&self) -> bool { self.inner.s_addr == 0 } @@ -779,10 +774,7 @@ impl Ipv4Addr { pub fn to_ipv6_compatible(&self) -> Ipv6Addr { let octets = self.octets(); Ipv6Addr::from([ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - octets[0], octets[1], octets[2], octets[3], + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, octets[0], octets[1], octets[2], octets[3], ]) } @@ -804,10 +796,7 @@ impl Ipv4Addr { pub fn to_ipv6_mapped(&self) -> Ipv6Addr { let octets = self.octets(); Ipv6Addr::from([ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0xFF, 0xFF, - octets[0], octets[1], octets[2], octets[3], + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, octets[0], octets[1], octets[2], octets[3], ]) } } @@ -839,8 +828,16 @@ impl From<Ipv6Addr> for IpAddr { #[stable(feature = "rust1", since = "1.0.0")] impl fmt::Display for Ipv4Addr { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + const IPV4_BUF_LEN: usize = 15; // Long enough for the longest possible IPv4 address + let mut buf = [0u8; IPV4_BUF_LEN]; + let mut buf_slice = &mut buf[..]; let octets = self.octets(); - write!(fmt, "{}.{}.{}.{}", octets[0], octets[1], octets[2], octets[3]) + // Note: The call to write should never fail, hence the unwrap + write!(buf_slice, "{}.{}.{}.{}", octets[0], octets[1], octets[2], octets[3]).unwrap(); + let len = IPV4_BUF_LEN - buf_slice.len(); + // This unsafe is OK because we know what is being written to the buffer + let buf = unsafe { crate::str::from_utf8_unchecked(&buf[..len]) }; + fmt.pad(buf) } } @@ -853,7 +850,9 @@ impl fmt::Debug for Ipv4Addr { #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Ipv4Addr { - fn clone(&self) -> Ipv4Addr { *self } + fn clone(&self) -> Ipv4Addr { + *self + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -890,7 +889,7 @@ impl Eq for Ipv4Addr {} impl hash::Hash for Ipv4Addr { fn hash<H: hash::Hasher>(&self, s: &mut H) { // `inner` is #[repr(packed)], so we need to copy `s_addr`. - {self.inner.s_addr}.hash(s) + { self.inner.s_addr }.hash(s) } } @@ -929,7 +928,9 @@ impl Ord for Ipv4Addr { } impl AsInner<c::in_addr> for Ipv4Addr { - fn as_inner(&self) -> &c::in_addr { &self.inner } + fn as_inner(&self) -> &c::in_addr { + &self.inner + } } impl FromInner<c::in_addr> for Ipv4Addr { fn from_inner(addr: c::in_addr) -> Ipv4Addr { @@ -1017,24 +1018,30 @@ impl Ipv6Addr { /// let addr = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_ipv6", since = "1.32.0"))] - pub const fn new(a: u16, b: u16, c: u16, d: u16, e: u16, f: u16, - g: u16, h: u16) -> Ipv6Addr { + #[rustc_const_stable(feature = "const_ipv6", since = "1.32.0")] + pub const fn new(a: u16, b: u16, c: u16, d: u16, e: u16, f: u16, g: u16, h: u16) -> Ipv6Addr { Ipv6Addr { inner: c::in6_addr { s6_addr: [ - (a >> 8) as u8, a as u8, - (b >> 8) as u8, b as u8, - (c >> 8) as u8, c as u8, - (d >> 8) as u8, d as u8, - (e >> 8) as u8, e as u8, - (f >> 8) as u8, f as u8, - (g >> 8) as u8, g as u8, - (h >> 8) as u8, h as u8 + (a >> 8) as u8, + a as u8, + (b >> 8) as u8, + b as u8, + (c >> 8) as u8, + c as u8, + (d >> 8) as u8, + d as u8, + (e >> 8) as u8, + e as u8, + (f >> 8) as u8, + f as u8, + (g >> 8) as u8, + g as u8, + (h >> 8) as u8, + h as u8, ], - } + }, } - } /// An IPv6 address representing localhost: `::1`. @@ -1154,7 +1161,7 @@ impl Ipv6Addr { match self.multicast_scope() { Some(Ipv6MulticastScope::Global) => true, None => self.is_unicast_global(), - _ => false + _ => false, } } @@ -1417,7 +1424,7 @@ impl Ipv6Addr { 5 => Some(Ipv6MulticastScope::SiteLocal), 8 => Some(Ipv6MulticastScope::OrganizationLocal), 14 => Some(Ipv6MulticastScope::Global), - _ => None + _ => None, } } else { None @@ -1467,10 +1474,9 @@ impl Ipv6Addr { pub fn to_ipv4(&self) -> Option<Ipv4Addr> { match self.segments() { [0, 0, 0, 0, 0, f, g, h] if f == 0 || f == 0xffff => { - Some(Ipv4Addr::new((g >> 8) as u8, g as u8, - (h >> 8) as u8, h as u8)) - }, - _ => None + Some(Ipv4Addr::new((g >> 8) as u8, g as u8, (h >> 8) as u8, h as u8)) + } + _ => None, } } @@ -1483,7 +1489,7 @@ impl Ipv6Addr { /// [255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); /// ``` #[stable(feature = "ipv6_to_octets", since = "1.12.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_ipv6", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_ipv6", since = "1.32.0")] pub const fn octets(&self) -> [u8; 16] { self.inner.s6_addr } @@ -1492,21 +1498,41 @@ impl Ipv6Addr { #[stable(feature = "rust1", since = "1.0.0")] impl fmt::Display for Ipv6Addr { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + // Note: The calls to write should never fail, hence the unwraps in the function + // Long enough for the longest possible IPv6: 39 + const IPV6_BUF_LEN: usize = 39; + let mut buf = [0u8; IPV6_BUF_LEN]; + let mut buf_slice = &mut buf[..]; + match self.segments() { // We need special cases for :: and ::1, otherwise they're formatted // as ::0.0.0.[01] - [0, 0, 0, 0, 0, 0, 0, 0] => write!(fmt, "::"), - [0, 0, 0, 0, 0, 0, 0, 1] => write!(fmt, "::1"), + [0, 0, 0, 0, 0, 0, 0, 0] => write!(buf_slice, "::").unwrap(), + [0, 0, 0, 0, 0, 0, 0, 1] => write!(buf_slice, "::1").unwrap(), // Ipv4 Compatible address [0, 0, 0, 0, 0, 0, g, h] => { - write!(fmt, "::{}.{}.{}.{}", (g >> 8) as u8, g as u8, - (h >> 8) as u8, h as u8) + write!( + buf_slice, + "::{}.{}.{}.{}", + (g >> 8) as u8, + g as u8, + (h >> 8) as u8, + h as u8 + ) + .unwrap(); } // Ipv4-Mapped address [0, 0, 0, 0, 0, 0xffff, g, h] => { - write!(fmt, "::ffff:{}.{}.{}.{}", (g >> 8) as u8, g as u8, - (h >> 8) as u8, h as u8) - }, + write!( + buf_slice, + "::ffff:{}.{}.{}.{}", + (g >> 8) as u8, + g as u8, + (h >> 8) as u8, + h as u8 + ) + .unwrap(); + } _ => { fn find_zero_slice(segments: &[u16; 8]) -> (usize, usize) { let mut longest_span_len = 0; @@ -1538,26 +1564,33 @@ impl fmt::Display for Ipv6Addr { let (zeros_at, zeros_len) = find_zero_slice(&self.segments()); if zeros_len > 1 { - fn fmt_subslice(segments: &[u16], fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fn fmt_subslice(segments: &[u16], buf: &mut &mut [u8]) { if !segments.is_empty() { - write!(fmt, "{:x}", segments[0])?; + write!(*buf, "{:x}", segments[0]).unwrap(); for &seg in &segments[1..] { - write!(fmt, ":{:x}", seg)?; + write!(*buf, ":{:x}", seg).unwrap(); } } - Ok(()) } - fmt_subslice(&self.segments()[..zeros_at], fmt)?; - fmt.write_str("::")?; - fmt_subslice(&self.segments()[zeros_at + zeros_len..], fmt) + fmt_subslice(&self.segments()[..zeros_at], &mut buf_slice); + write!(buf_slice, "::").unwrap(); + fmt_subslice(&self.segments()[zeros_at + zeros_len..], &mut buf_slice); } else { let &[a, b, c, d, e, f, g, h] = &self.segments(); - write!(fmt, "{:x}:{:x}:{:x}:{:x}:{:x}:{:x}:{:x}:{:x}", - a, b, c, d, e, f, g, h) + write!( + buf_slice, + "{:x}:{:x}:{:x}:{:x}:{:x}:{:x}:{:x}:{:x}", + a, b, c, d, e, f, g, h + ) + .unwrap(); } } } + let len = IPV6_BUF_LEN - buf_slice.len(); + // This is safe because we know exactly what can be in this buffer + let buf = unsafe { crate::str::from_utf8_unchecked(&buf[..len]) }; + fmt.pad(buf) } } @@ -1570,7 +1603,9 @@ impl fmt::Debug for Ipv6Addr { #[stable(feature = "rust1", since = "1.0.0")] impl Clone for Ipv6Addr { - fn clone(&self) -> Ipv6Addr { *self } + fn clone(&self) -> Ipv6Addr { + *self + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -1645,7 +1680,9 @@ impl Ord for Ipv6Addr { } impl AsInner<c::in6_addr> for Ipv6Addr { - fn as_inner(&self) -> &c::in6_addr { &self.inner } + fn as_inner(&self) -> &c::in6_addr { + &self.inner + } } impl FromInner<c::in6_addr> for Ipv6Addr { fn from_inner(addr: c::in6_addr) -> Ipv6Addr { @@ -1711,7 +1748,6 @@ impl From<[u16; 8]> for Ipv6Addr { } } - #[stable(feature = "ip_from_slice", since = "1.17.0")] impl From<[u8; 16]> for IpAddr { /// Creates an `IpAddr::V6` from a sixteen element byte array. @@ -1771,8 +1807,8 @@ impl From<[u16; 8]> for IpAddr { // Tests for this module #[cfg(all(test, not(target_os = "emscripten")))] mod tests { + use crate::net::test::{sa4, sa6, tsa}; use crate::net::*; - use crate::net::test::{tsa, sa6, sa4}; use crate::str::FromStr; #[test] @@ -1803,8 +1839,10 @@ mod tests { assert_eq!(Ok(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)), "::1".parse()); assert_eq!(Ok(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0)), "::".parse()); - assert_eq!(Ok(Ipv6Addr::new(0x2a02, 0x6b8, 0, 0, 0, 0, 0x11, 0x11)), - "2a02:6b8::11:11".parse()); + assert_eq!( + Ok(Ipv6Addr::new(0x2a02, 0x6b8, 0, 0, 0, 0, 0x11, 0x11)), + "2a02:6b8::11:11".parse() + ); // too long group let none: Option<Ipv6Addr> = "::00000".parse().ok(); @@ -1828,14 +1866,19 @@ mod tests { #[test] fn test_from_str_ipv4_in_ipv6() { - assert_eq!(Ok(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 49152, 545)), - "::192.0.2.33".parse()); - assert_eq!(Ok(Ipv6Addr::new(0, 0, 0, 0, 0, 0xFFFF, 49152, 545)), - "::FFFF:192.0.2.33".parse()); - assert_eq!(Ok(Ipv6Addr::new(0x64, 0xff9b, 0, 0, 0, 0, 49152, 545)), - "64:ff9b::192.0.2.33".parse()); - assert_eq!(Ok(Ipv6Addr::new(0x2001, 0xdb8, 0x122, 0xc000, 0x2, 0x2100, 49152, 545)), - "2001:db8:122:c000:2:2100:192.0.2.33".parse()); + assert_eq!(Ok(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 49152, 545)), "::192.0.2.33".parse()); + assert_eq!( + Ok(Ipv6Addr::new(0, 0, 0, 0, 0, 0xFFFF, 49152, 545)), + "::FFFF:192.0.2.33".parse() + ); + assert_eq!( + Ok(Ipv6Addr::new(0x64, 0xff9b, 0, 0, 0, 0, 49152, 545)), + "64:ff9b::192.0.2.33".parse() + ); + assert_eq!( + Ok(Ipv6Addr::new(0x2001, 0xdb8, 0x122, 0xc000, 0x2, 0x2100, 49152, 545)), + "2001:db8:122:c000:2:2100:192.0.2.33".parse() + ); // colon after v4 let none: Option<Ipv4Addr> = "::127.0.0.1:".parse().ok(); @@ -1850,20 +1893,27 @@ mod tests { #[test] fn test_from_str_socket_addr() { - assert_eq!(Ok(sa4(Ipv4Addr::new(77, 88, 21, 11), 80)), - "77.88.21.11:80".parse()); - assert_eq!(Ok(SocketAddrV4::new(Ipv4Addr::new(77, 88, 21, 11), 80)), - "77.88.21.11:80".parse()); - assert_eq!(Ok(sa6(Ipv6Addr::new(0x2a02, 0x6b8, 0, 1, 0, 0, 0, 1), 53)), - "[2a02:6b8:0:1::1]:53".parse()); - assert_eq!(Ok(SocketAddrV6::new(Ipv6Addr::new(0x2a02, 0x6b8, 0, 1, - 0, 0, 0, 1), 53, 0, 0)), - "[2a02:6b8:0:1::1]:53".parse()); - assert_eq!(Ok(sa6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0x7F00, 1), 22)), - "[::127.0.0.1]:22".parse()); - assert_eq!(Ok(SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, - 0x7F00, 1), 22, 0, 0)), - "[::127.0.0.1]:22".parse()); + assert_eq!(Ok(sa4(Ipv4Addr::new(77, 88, 21, 11), 80)), "77.88.21.11:80".parse()); + assert_eq!( + Ok(SocketAddrV4::new(Ipv4Addr::new(77, 88, 21, 11), 80)), + "77.88.21.11:80".parse() + ); + assert_eq!( + Ok(sa6(Ipv6Addr::new(0x2a02, 0x6b8, 0, 1, 0, 0, 0, 1), 53)), + "[2a02:6b8:0:1::1]:53".parse() + ); + assert_eq!( + Ok(SocketAddrV6::new(Ipv6Addr::new(0x2a02, 0x6b8, 0, 1, 0, 0, 0, 1), 53, 0, 0)), + "[2a02:6b8:0:1::1]:53".parse() + ); + assert_eq!( + Ok(sa6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0x7F00, 1), 22)), + "[::127.0.0.1]:22".parse() + ); + assert_eq!( + Ok(SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0x7F00, 1), 22, 0, 0)), + "[::127.0.0.1]:22".parse() + ); // without port let none: Option<SocketAddr> = "127.0.0.1".parse().ok(); @@ -1879,6 +1929,18 @@ mod tests { assert_eq!(None, none); } + #[test] + fn ipv4_addr_to_string() { + // Short address + assert_eq!(Ipv4Addr::new(1, 1, 1, 1).to_string(), "1.1.1.1"); + // Long address + assert_eq!(Ipv4Addr::new(127, 127, 127, 127).to_string(), "127.127.127.127"); + + // Test padding + assert_eq!(&format!("{:16}", Ipv4Addr::new(1, 1, 1, 1)), "1.1.1.1 "); + assert_eq!(&format!("{:>16}", Ipv4Addr::new(1, 1, 1, 1)), " 1.1.1.1"); + } + #[test] fn ipv6_addr_to_string() { // ipv4-mapped address @@ -1890,16 +1952,32 @@ mod tests { assert_eq!(a1.to_string(), "::192.0.2.128"); // v6 address with no zero segments - assert_eq!(Ipv6Addr::new(8, 9, 10, 11, 12, 13, 14, 15).to_string(), - "8:9:a:b:c:d:e:f"); + assert_eq!(Ipv6Addr::new(8, 9, 10, 11, 12, 13, 14, 15).to_string(), "8:9:a:b:c:d:e:f"); + + // longest possible IPv6 length + assert_eq!( + Ipv6Addr::new(0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888) + .to_string(), + "1111:2222:3333:4444:5555:6666:7777:8888" + ); + // padding + assert_eq!( + &format!("{:20}", Ipv6Addr::new(1, 2, 3, 4, 5, 6, 7, 8)), + "1:2:3:4:5:6:7:8 " + ); + assert_eq!( + &format!("{:>20}", Ipv6Addr::new(1, 2, 3, 4, 5, 6, 7, 8)), + " 1:2:3:4:5:6:7:8" + ); // reduce a single run of zeros - assert_eq!("ae::ffff:102:304", - Ipv6Addr::new(0xae, 0, 0, 0, 0, 0xffff, 0x0102, 0x0304).to_string()); + assert_eq!( + "ae::ffff:102:304", + Ipv6Addr::new(0xae, 0, 0, 0, 0, 0xffff, 0x0102, 0x0304).to_string() + ); // don't reduce just a single zero segment - assert_eq!("1:2:3:4:5:6:0:8", - Ipv6Addr::new(1, 2, 3, 4, 5, 6, 0, 8).to_string()); + assert_eq!("1:2:3:4:5:6:0:8", Ipv6Addr::new(1, 2, 3, 4, 5, 6, 0, 8).to_string()); // 'any' address assert_eq!("::", Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0).to_string()); @@ -1919,20 +1997,27 @@ mod tests { #[test] fn ipv4_to_ipv6() { - assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x1234, 0x5678), - Ipv4Addr::new(0x12, 0x34, 0x56, 0x78).to_ipv6_mapped()); - assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0x1234, 0x5678), - Ipv4Addr::new(0x12, 0x34, 0x56, 0x78).to_ipv6_compatible()); + assert_eq!( + Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x1234, 0x5678), + Ipv4Addr::new(0x12, 0x34, 0x56, 0x78).to_ipv6_mapped() + ); + assert_eq!( + Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0x1234, 0x5678), + Ipv4Addr::new(0x12, 0x34, 0x56, 0x78).to_ipv6_compatible() + ); } #[test] fn ipv6_to_ipv4() { - assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x1234, 0x5678).to_ipv4(), - Some(Ipv4Addr::new(0x12, 0x34, 0x56, 0x78))); - assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0x1234, 0x5678).to_ipv4(), - Some(Ipv4Addr::new(0x12, 0x34, 0x56, 0x78))); - assert_eq!(Ipv6Addr::new(0, 0, 1, 0, 0, 0, 0x1234, 0x5678).to_ipv4(), - None); + assert_eq!( + Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0x1234, 0x5678).to_ipv4(), + Some(Ipv4Addr::new(0x12, 0x34, 0x56, 0x78)) + ); + assert_eq!( + Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0x1234, 0x5678).to_ipv4(), + Some(Ipv4Addr::new(0x12, 0x34, 0x56, 0x78)) + ); + assert_eq!(Ipv6Addr::new(0, 0, 1, 0, 0, 0, 0x1234, 0x5678).to_ipv4(), None); } #[test] @@ -1940,7 +2025,7 @@ mod tests { macro_rules! ip { ($s:expr) => { IpAddr::from_str($s).unwrap() - } + }; } macro_rules! check { @@ -1984,7 +2069,7 @@ mod tests { } else { assert!(!ip!($s).is_documentation()); } - }} + }}; } let unspec: u8 = 1 << 0; @@ -2006,8 +2091,8 @@ mod tests { check!("198.51.100.0", doc); check!("203.0.113.0", doc); check!("203.2.113.0", global); - check!("224.0.0.0", global|multicast); - check!("239.255.255.255", global|multicast); + check!("224.0.0.0", global | multicast); + check!("239.255.255.255", global | multicast); check!("255.255.255.255"); // make sure benchmarking addresses are not global check!("198.18.0.0"); @@ -2041,7 +2126,7 @@ mod tests { check!("ff04::", multicast); check!("ff05::", multicast); check!("ff08::", multicast); - check!("ff0e::", global|multicast); + check!("ff0e::", global | multicast); check!("2001:db8:85a3::8a2e:370:7334", doc); check!("102:304:506:708:90a:b0c:d0e:f10", global); } @@ -2051,7 +2136,7 @@ mod tests { macro_rules! ip { ($s:expr) => { Ipv4Addr::from_str($s).unwrap() - } + }; } macro_rules! check { @@ -2144,7 +2229,7 @@ mod tests { } else { assert!(!ip!($s).is_shared()); } - }} + }}; } let unspec: u16 = 1 << 0; @@ -2173,8 +2258,8 @@ mod tests { check!("198.51.100.0", documentation); check!("203.0.113.0", documentation); check!("203.2.113.0", global); - check!("224.0.0.0", global|multicast); - check!("239.255.255.255", global|multicast); + check!("224.0.0.0", global | multicast); + check!("239.255.255.255", global | multicast); check!("255.255.255.255", broadcast); check!("198.18.0.0", benchmarking); check!("198.18.54.2", benchmarking); @@ -2195,7 +2280,7 @@ mod tests { macro_rules! ip { ($s:expr) => { Ipv6Addr::from_str($s).unwrap() - } + }; } macro_rules! check { @@ -2329,99 +2414,133 @@ mod tests { let multicast_organization_local: u16 = 1 << 14; let multicast_global: u16 = 1 << 15; - check!("::", - &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - unspecified); - - check!("::1", - &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], - loopback); - - check!("::0.0.0.2", - &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2], - global | unicast_global); - - check!("1::", - &[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - global | unicast_global); - - check!("fc00::", - &[0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - unique_local); - - check!("fdff:ffff::", - &[0xfd, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - unique_local); - - check!("fe80:ffff::", - &[0xfe, 0x80, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - unicast_link_local); - - check!("fe80::", - &[0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - unicast_link_local|unicast_link_local_strict); - - check!("febf:ffff::", - &[0xfe, 0xbf, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - unicast_link_local); - - check!("febf::", - &[0xfe, 0xbf, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - unicast_link_local); - - check!("febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff", - &[0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], - unicast_link_local); - - check!("fe80::ffff:ffff:ffff:ffff", - &[0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], - unicast_link_local|unicast_link_local_strict); - - check!("fe80:0:0:1::", - &[0xfe, 0x80, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], - unicast_link_local); - - check!("fec0::", - &[0xfe, 0xc0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - unicast_site_local|unicast_global|global); - - check!("ff01::", - &[0xff, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - multicast_interface_local); - - check!("ff02::", - &[0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - multicast_link_local); - - check!("ff03::", - &[0xff, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - multicast_realm_local); - - check!("ff04::", - &[0xff, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - multicast_admin_local); - - check!("ff05::", - &[0xff, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - multicast_site_local); - - check!("ff08::", - &[0xff, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - multicast_organization_local); - - check!("ff0e::", - &[0xff, 0xe, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - multicast_global | global); - - check!("2001:db8:85a3::8a2e:370:7334", - &[0x20, 1, 0xd, 0xb8, 0x85, 0xa3, 0, 0, 0, 0, 0x8a, 0x2e, 3, 0x70, 0x73, 0x34], - documentation); - - check!("102:304:506:708:90a:b0c:d0e:f10", - &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], - global| unicast_global); + check!("::", &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], unspecified); + + check!("::1", &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], loopback); + + check!( + "::0.0.0.2", + &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2], + global | unicast_global + ); + + check!("1::", &[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], global | unicast_global); + + check!("fc00::", &[0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], unique_local); + + check!( + "fdff:ffff::", + &[0xfd, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + unique_local + ); + + check!( + "fe80:ffff::", + &[0xfe, 0x80, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + unicast_link_local + ); + + check!( + "fe80::", + &[0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + unicast_link_local | unicast_link_local_strict + ); + + check!( + "febf:ffff::", + &[0xfe, 0xbf, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + unicast_link_local + ); + + check!( + "febf::", + &[0xfe, 0xbf, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + unicast_link_local + ); + + check!( + "febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + &[ + 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff + ], + unicast_link_local + ); + + check!( + "fe80::ffff:ffff:ffff:ffff", + &[ + 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff + ], + unicast_link_local | unicast_link_local_strict + ); + + check!( + "fe80:0:0:1::", + &[0xfe, 0x80, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], + unicast_link_local + ); + + check!( + "fec0::", + &[0xfe, 0xc0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + unicast_site_local | unicast_global | global + ); + + check!( + "ff01::", + &[0xff, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + multicast_interface_local + ); + + check!( + "ff02::", + &[0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + multicast_link_local + ); + + check!( + "ff03::", + &[0xff, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + multicast_realm_local + ); + + check!( + "ff04::", + &[0xff, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + multicast_admin_local + ); + + check!( + "ff05::", + &[0xff, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + multicast_site_local + ); + + check!( + "ff08::", + &[0xff, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + multicast_organization_local + ); + + check!( + "ff0e::", + &[0xff, 0xe, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + multicast_global | global + ); + + check!( + "2001:db8:85a3::8a2e:370:7334", + &[0x20, 1, 0xd, 0xb8, 0x85, 0xa3, 0, 0, 0, 0, 0x8a, 0x2e, 3, 0x70, 0x73, 0x34], + documentation + ); + + check!( + "102:304:506:708:90a:b0c:d0e:f10", + &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], + global | unicast_global + ); } #[test] @@ -2479,19 +2598,20 @@ mod tests { #[test] fn ipv6_from_segments() { - let from_u16s = Ipv6Addr::from([0x0011, 0x2233, 0x4455, 0x6677, - 0x8899, 0xaabb, 0xccdd, 0xeeff]); - let new = Ipv6Addr::new(0x0011, 0x2233, 0x4455, 0x6677, - 0x8899, 0xaabb, 0xccdd, 0xeeff); + let from_u16s = + Ipv6Addr::from([0x0011, 0x2233, 0x4455, 0x6677, 0x8899, 0xaabb, 0xccdd, 0xeeff]); + let new = Ipv6Addr::new(0x0011, 0x2233, 0x4455, 0x6677, 0x8899, 0xaabb, 0xccdd, 0xeeff); assert_eq!(new, from_u16s); } #[test] fn ipv6_from_octets() { - let from_u16s = Ipv6Addr::from([0x0011, 0x2233, 0x4455, 0x6677, - 0x8899, 0xaabb, 0xccdd, 0xeeff]); - let from_u8s = Ipv6Addr::from([0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, - 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff]); + let from_u16s = + Ipv6Addr::from([0x0011, 0x2233, 0x4455, 0x6677, 0x8899, 0xaabb, 0xccdd, 0xeeff]); + let from_u8s = Ipv6Addr::from([ + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, + 0xee, 0xff, + ]); assert_eq!(from_u16s, from_u8s); } diff --git a/src/libstd/net/mod.rs b/src/libstd/net/mod.rs index b68146939f..c87e0661dc 100644 --- a/src/libstd/net/mod.rs +++ b/src/libstd/net/mod.rs @@ -30,24 +30,24 @@ use crate::io::{self, Error, ErrorKind}; +#[stable(feature = "rust1", since = "1.0.0")] +pub use self::addr::{SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs}; #[stable(feature = "rust1", since = "1.0.0")] pub use self::ip::{IpAddr, Ipv4Addr, Ipv6Addr, Ipv6MulticastScope}; #[stable(feature = "rust1", since = "1.0.0")] -pub use self::addr::{SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs}; +pub use self::parser::AddrParseError; #[stable(feature = "rust1", since = "1.0.0")] -pub use self::tcp::{TcpStream, TcpListener, Incoming}; +pub use self::tcp::{Incoming, TcpListener, TcpStream}; #[stable(feature = "rust1", since = "1.0.0")] pub use self::udp::UdpSocket; -#[stable(feature = "rust1", since = "1.0.0")] -pub use self::parser::AddrParseError; -mod ip; mod addr; -mod tcp; -mod udp; +mod ip; mod parser; +mod tcp; #[cfg(test)] mod test; +mod udp; /// Possible values which can be passed to the [`shutdown`] method of /// [`TcpStream`]. @@ -85,28 +85,22 @@ pub enum Shutdown { Both, } -#[doc(hidden)] -trait NetInt { - fn from_be(i: Self) -> Self; - fn to_be(&self) -> Self; +#[inline] +const fn htons(i: u16) -> u16 { + i.to_be() } -macro_rules! doit { - ($($t:ident)*) => ($(impl NetInt for $t { - fn from_be(i: Self) -> Self { <$t>::from_be(i) } - fn to_be(&self) -> Self { <$t>::to_be(*self) } - })*) +#[inline] +const fn ntohs(i: u16) -> u16 { + u16::from_be(i) } -doit! { i8 i16 i32 i64 isize u8 u16 u32 u64 usize } - -fn hton<I: NetInt>(i: I) -> I { i.to_be() } -fn ntoh<I: NetInt>(i: I) -> I { I::from_be(i) } fn each_addr<A: ToSocketAddrs, F, T>(addr: A, mut f: F) -> io::Result<T> - where F: FnMut(io::Result<&SocketAddr>) -> io::Result<T> +where + F: FnMut(io::Result<&SocketAddr>) -> io::Result<T>, { let addrs = match addr.to_socket_addrs() { Ok(addrs) => addrs, - Err(e) => return f(Err(e)) + Err(e) => return f(Err(e)), }; let mut last_err = None; for addr in addrs { @@ -116,7 +110,6 @@ fn each_addr<A: ToSocketAddrs, F, T>(addr: A, mut f: F) -> io::Result<T> } } Err(last_err.unwrap_or_else(|| { - Error::new(ErrorKind::InvalidInput, - "could not resolve to any addresses") + Error::new(ErrorKind::InvalidInput, "could not resolve to any addresses") })) } diff --git a/src/libstd/net/parser.rs b/src/libstd/net/parser.rs index 686fa8c61a..868a7e261c 100644 --- a/src/libstd/net/parser.rs +++ b/src/libstd/net/parser.rs @@ -222,8 +222,7 @@ impl<'a> Parser<'a> { } fn read_ip_addr(&mut self) -> Option<IpAddr> { - self.read_ipv4_addr().map(IpAddr::V4) - .or_else(|| self.read_ipv6_addr().map(IpAddr::V6)) + self.read_ipv4_addr().map(IpAddr::V4).or_else(|| self.read_ipv6_addr().map(IpAddr::V6)) } fn read_socket_addr_v4(&mut self) -> Option<SocketAddrV4> { @@ -254,7 +253,8 @@ impl<'a> Parser<'a> { } fn read_socket_addr(&mut self) -> Option<SocketAddr> { - self.read_socket_addr_v4().map(SocketAddr::V4) + self.read_socket_addr_v4() + .map(SocketAddr::V4) .or_else(|| self.read_socket_addr_v6().map(SocketAddr::V6)) } } @@ -363,6 +363,7 @@ pub struct AddrParseError(()); #[stable(feature = "addr_parse_error_error", since = "1.4.0")] impl fmt::Display for AddrParseError { + #[allow(deprecated, deprecated_in_future)] fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { fmt.write_str(self.description()) } @@ -370,6 +371,7 @@ impl fmt::Display for AddrParseError { #[stable(feature = "addr_parse_error_error", since = "1.4.0")] impl Error for AddrParseError { + #[allow(deprecated)] fn description(&self) -> &str { "invalid IP address syntax" } diff --git a/src/libstd/net/tcp.rs b/src/libstd/net/tcp.rs index c33f98bdd8..5023d69240 100644 --- a/src/libstd/net/tcp.rs +++ b/src/libstd/net/tcp.rs @@ -63,14 +63,13 @@ pub struct TcpStream(net_imp::TcpStream); /// # Examples /// /// ```no_run -/// # use std::io; /// use std::net::{TcpListener, TcpStream}; /// /// fn handle_client(stream: TcpStream) { /// // ... /// } /// -/// fn main() -> io::Result<()> { +/// fn main() -> std::io::Result<()> { /// let listener = TcpListener::bind("127.0.0.1:80")?; /// /// // accept connections and process them serially diff --git a/src/libstd/os/linux/raw.rs b/src/libstd/os/linux/raw.rs index d9b2236047..0caec97bb7 100644 --- a/src/libstd/os/linux/raw.rs +++ b/src/libstd/os/linux/raw.rs @@ -230,7 +230,12 @@ mod arch { } } -#[cfg(any(target_arch = "mips64", target_arch = "s390x", target_arch = "sparc64"))] +#[cfg(any( + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64", + target_arch = "riscv64" +))] mod arch { pub use libc::{blkcnt_t, blksize_t, ino_t, nlink_t, off_t, stat, time_t}; } diff --git a/src/libstd/os/raw/mod.rs b/src/libstd/os/raw/mod.rs index e09012007f..47daf0cce1 100644 --- a/src/libstd/os/raw/mod.rs +++ b/src/libstd/os/raw/mod.rs @@ -18,7 +18,8 @@ target_arch = "hexagon", target_arch = "powerpc", target_arch = "powerpc64", - target_arch = "s390x" + target_arch = "s390x", + target_arch = "riscv64" ) ), all(target_os = "android", any(target_arch = "aarch64", target_arch = "arm")), @@ -60,7 +61,8 @@ pub type c_char = u8; target_arch = "hexagon", target_arch = "powerpc", target_arch = "powerpc64", - target_arch = "s390x" + target_arch = "s390x", + target_arch = "riscv64" ) ), all(target_os = "android", any(target_arch = "aarch64", target_arch = "arm")), diff --git a/src/libstd/panic.rs b/src/libstd/panic.rs index ac8e0daf76..6ad5519d34 100644 --- a/src/libstd/panic.rs +++ b/src/libstd/panic.rs @@ -205,7 +205,7 @@ impl<T: RefUnwindSafe + ?Sized> UnwindSafe for &T {} impl<T: RefUnwindSafe + ?Sized> UnwindSafe for *const T {} #[stable(feature = "catch_unwind", since = "1.9.0")] impl<T: RefUnwindSafe + ?Sized> UnwindSafe for *mut T {} -#[unstable(feature = "ptr_internals", issue = "0")] +#[unstable(feature = "ptr_internals", issue = "none")] impl<T: UnwindSafe + ?Sized> UnwindSafe for Unique<T> {} #[stable(feature = "nonnull", since = "1.25.0")] impl<T: RefUnwindSafe + ?Sized> UnwindSafe for NonNull<T> {} diff --git a/src/libstd/panicking.rs b/src/libstd/panicking.rs index c028ddcd67..fee7ace92e 100644 --- a/src/libstd/panicking.rs +++ b/src/libstd/panicking.rs @@ -7,20 +7,20 @@ //! * Executing a panic up to doing the actual implementation //! * Shims around "try" -use core::panic::{BoxMeUp, PanicInfo, Location}; +use core::panic::{BoxMeUp, Location, PanicInfo}; use crate::any::Any; use crate::fmt; use crate::intrinsics; use crate::mem::{self, ManuallyDrop}; +use crate::process; use crate::raw; use crate::sync::atomic::{AtomicBool, Ordering}; use crate::sys::stdio::panic_output; +use crate::sys_common::backtrace::{self, RustBacktrace}; use crate::sys_common::rwlock::RWLock; use crate::sys_common::{thread_info, util}; -use crate::sys_common::backtrace::{self, RustBacktrace}; use crate::thread; -use crate::process; #[cfg(not(test))] use crate::io::set_panic; @@ -40,11 +40,13 @@ use realstd::io::set_panic; // One day this may look a little less ad-hoc with the compiler helping out to // hook up these functions, but it is not this day! #[allow(improper_ctypes)] -extern { - fn __rust_maybe_catch_panic(f: fn(*mut u8), - data: *mut u8, - data_ptr: *mut usize, - vtable_ptr: *mut usize) -> u32; +extern "C" { + fn __rust_maybe_catch_panic( + f: fn(*mut u8), + data: *mut u8, + data_ptr: *mut usize, + vtable_ptr: *mut usize, + ) -> u32; /// `payload` is actually a `*mut &mut dyn BoxMeUp` but that would cause FFI warnings. /// It cannot be `Box<dyn BoxMeUp>` because the other end of this call does not depend @@ -53,6 +55,15 @@ extern { fn __rust_start_panic(payload: usize) -> u32; } +/// This function is called by the panic runtime if FFI code catches a Rust +/// panic but doesn't rethrow it. We don't support this case since it messes +/// with our panic count. +#[cfg(not(test))] +#[rustc_std_internal_symbol] +extern "C" fn __rust_drop_panic() -> ! { + rtabort!("Rust panics must be rethrown"); +} + #[derive(Copy, Clone)] enum Hook { Default, @@ -108,7 +119,8 @@ pub fn set_hook(hook: Box<dyn Fn(&PanicInfo<'_>) + 'static + Sync + Send>) { HOOK_LOCK.write_unlock(); if let Hook::Custom(ptr) = old_hook { - #[allow(unused_must_use)] { + #[allow(unused_must_use)] + { Box::from_raw(ptr); } } @@ -178,14 +190,13 @@ fn default_hook(info: &PanicInfo<'_>) { None => match info.payload().downcast_ref::<String>() { Some(s) => &s[..], None => "Box<Any>", - } + }, }; let thread = thread_info::current_thread(); let name = thread.as_ref().and_then(|t| t.name()).unwrap_or("<unnamed>"); let write = |err: &mut dyn crate::io::Write| { - let _ = writeln!(err, "thread '{}' panicked at '{}', {}", - name, msg, location); + let _ = writeln!(err, "thread '{}' panicked at '{}', {}", name, msg, location); static FIRST_PANIC: AtomicBool = AtomicBool::new(true); @@ -194,8 +205,11 @@ fn default_hook(info: &PanicInfo<'_>) { RustBacktrace::Disabled => {} RustBacktrace::RuntimeDisabled => { if FIRST_PANIC.swap(false, Ordering::SeqCst) { - let _ = writeln!(err, "note: run with `RUST_BACKTRACE=1` \ - environment variable to display a backtrace."); + let _ = writeln!( + err, + "note: run with `RUST_BACKTRACE=1` \ + environment variable to display a backtrace" + ); } } } @@ -211,10 +225,9 @@ fn default_hook(info: &PanicInfo<'_>) { } } - #[cfg(not(test))] #[doc(hidden)] -#[unstable(feature = "update_panic_count", issue = "0")] +#[unstable(feature = "update_panic_count", issue = "none")] pub fn update_panic_count(amt: isize) -> usize { use crate::cell::Cell; thread_local! { static PANIC_COUNT: Cell<usize> = Cell::new(0) } @@ -263,14 +276,14 @@ pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>> // method of calling a catch panic whilst juggling ownership. let mut any_data = 0; let mut any_vtable = 0; - let mut data = Data { - f: ManuallyDrop::new(f) - }; + let mut data = Data { f: ManuallyDrop::new(f) }; - let r = __rust_maybe_catch_panic(do_call::<F, R>, - &mut data as *mut _ as *mut u8, - &mut any_data, - &mut any_vtable); + let r = __rust_maybe_catch_panic( + do_call::<F, R>, + &mut data as *mut _ as *mut u8, + &mut any_data, + &mut any_vtable, + ); return if r == 0 { debug_assert!(update_panic_count(0) == 0); @@ -305,24 +318,19 @@ pub fn panicking() -> bool { /// site as much as possible (so that `panic!()` has as low an impact /// on (e.g.) the inlining of other functions as possible), by moving /// the actual formatting into this shared place. -#[unstable(feature = "libstd_sys_internals", - reason = "used by the panic! macro", - issue = "0")] +#[unstable(feature = "libstd_sys_internals", reason = "used by the panic! macro", issue = "none")] #[cold] // If panic_immediate_abort, inline the abort call, // otherwise avoid inlining because of it is cold path. -#[cfg_attr(not(feature="panic_immediate_abort"),inline(never))] -#[cfg_attr( feature="panic_immediate_abort" ,inline)] -pub fn begin_panic_fmt(msg: &fmt::Arguments<'_>, - file_line_col: &(&'static str, u32, u32)) -> ! { +#[cfg_attr(not(feature = "panic_immediate_abort"), track_caller)] +#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))] +#[cfg_attr(feature = "panic_immediate_abort", inline)] +pub fn begin_panic_fmt(msg: &fmt::Arguments<'_>) -> ! { if cfg!(feature = "panic_immediate_abort") { unsafe { intrinsics::abort() } } - // Just package everything into a `PanicInfo` and continue like libcore panics. - let (file, line, col) = *file_line_col; - let location = Location::internal_constructor(file, line, col); - let info = PanicInfo::internal_constructor(Some(msg), &location); + let info = PanicInfo::internal_constructor(Some(msg), Location::caller()); begin_panic_handler(&info) } @@ -355,6 +363,9 @@ pub fn begin_panic_handler(info: &PanicInfo<'_>) -> ! { unsafe impl<'a> BoxMeUp for PanicPayload<'a> { fn take_box(&mut self) -> *mut (dyn Any + Send) { + // We do two allocations here, unfortunately. But (a) they're required with the current + // scheme, and (b) we don't handle panic + OOM properly anyway (see comment in + // begin_panic below). let contents = mem::take(self.fill()); Box::into_raw(Box::new(contents)) } @@ -364,44 +375,28 @@ pub fn begin_panic_handler(info: &PanicInfo<'_>) -> ! { } } - // We do two allocations here, unfortunately. But (a) they're - // required with the current scheme, and (b) we don't handle - // panic + OOM properly anyway (see comment in begin_panic - // below). - let loc = info.location().unwrap(); // The current implementation always returns Some let msg = info.message().unwrap(); // The current implementation always returns Some - let file_line_col = (loc.file(), loc.line(), loc.column()); - rust_panic_with_hook( - &mut PanicPayload::new(msg), - info.message(), - &file_line_col); + rust_panic_with_hook(&mut PanicPayload::new(msg), info.message(), loc); } /// This is the entry point of panicking for the non-format-string variants of /// panic!() and assert!(). In particular, this is the only entry point that supports /// arbitrary payloads, not just format strings. -#[unstable(feature = "libstd_sys_internals", - reason = "used by the panic! macro", - issue = "0")] -#[cfg_attr(not(test), lang = "begin_panic")] // lang item for CTFE panic support +#[unstable(feature = "libstd_sys_internals", reason = "used by the panic! macro", issue = "none")] +#[cfg_attr(not(test), lang = "begin_panic")] +// lang item for CTFE panic support // never inline unless panic_immediate_abort to avoid code // bloat at the call sites as much as possible -#[cfg_attr(not(feature="panic_immediate_abort"),inline(never))] +#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))] #[cold] -pub fn begin_panic<M: Any + Send>(msg: M, file_line_col: &(&'static str, u32, u32)) -> ! { +#[track_caller] +pub fn begin_panic<M: Any + Send>(msg: M, #[cfg(bootstrap)] _: &(&str, u32, u32)) -> ! { if cfg!(feature = "panic_immediate_abort") { unsafe { intrinsics::abort() } } - // Note that this should be the only allocation performed in this code path. - // Currently this means that panic!() on OOM will invoke this code path, - // but then again we're not really ready for panic on OOM anyway. If - // we do start doing this, then we should propagate this allocation to - // be performed in the parent of this thread instead of the thread that's - // panicking. - - rust_panic_with_hook(&mut PanicPayload::new(msg), None, file_line_col); + rust_panic_with_hook(&mut PanicPayload::new(msg), None, Location::caller()); struct PanicPayload<A> { inner: Option<A>, @@ -415,6 +410,11 @@ pub fn begin_panic<M: Any + Send>(msg: M, file_line_col: &(&'static str, u32, u3 unsafe impl<A: Send + 'static> BoxMeUp for PanicPayload<A> { fn take_box(&mut self) -> *mut (dyn Any + Send) { + // Note that this should be the only allocation performed in this code path. Currently + // this means that panic!() on OOM will invoke this code path, but then again we're not + // really ready for panic on OOM anyway. If we do start doing this, then we should + // propagate this allocation to be performed in the parent of this thread instead of the + // thread that's panicking. let data = match self.inner.take() { Some(a) => Box::new(a) as Box<dyn Any + Send>, None => process::abort(), @@ -436,11 +436,11 @@ pub fn begin_panic<M: Any + Send>(msg: M, file_line_col: &(&'static str, u32, u3 /// Executes the primary logic for a panic, including checking for recursive /// panics, panic hooks, and finally dispatching to the panic runtime to either /// abort or unwind. -fn rust_panic_with_hook(payload: &mut dyn BoxMeUp, - message: Option<&fmt::Arguments<'_>>, - file_line_col: &(&str, u32, u32)) -> ! { - let (file, line, col) = *file_line_col; - +fn rust_panic_with_hook( + payload: &mut dyn BoxMeUp, + message: Option<&fmt::Arguments<'_>>, + location: &Location<'_>, +) -> ! { let panics = update_panic_count(1); // If this is the third nested call (e.g., panics == 2, this is 0-indexed), @@ -449,14 +449,15 @@ fn rust_panic_with_hook(payload: &mut dyn BoxMeUp, // process real quickly as we don't want to try calling it again as it'll // probably just panic again. if panics > 2 { - util::dumb_print(format_args!("thread panicked while processing \ - panic. aborting.\n")); + util::dumb_print(format_args!( + "thread panicked while processing \ + panic. aborting.\n" + )); unsafe { intrinsics::abort() } } unsafe { - let location = Location::internal_constructor(file, line, col); - let mut info = PanicInfo::internal_constructor(message, &location); + let mut info = PanicInfo::internal_constructor(message, location); HOOK_LOCK.read(); match HOOK { // Some platforms (like wasm) know that printing to stderr won't ever actually @@ -483,8 +484,10 @@ fn rust_panic_with_hook(payload: &mut dyn BoxMeUp, // have limited options. Currently our preference is to // just abort. In the future we may consider resuming // unwinding or otherwise exiting the thread cleanly. - util::dumb_print(format_args!("thread panicked while panicking. \ - aborting.\n")); + util::dumb_print(format_args!( + "thread panicked while panicking. \ + aborting.\n" + )); unsafe { intrinsics::abort() } } diff --git a/src/libstd/path.rs b/src/libstd/path.rs index 42bca0a957..a703cb748e 100644 --- a/src/libstd/path.rs +++ b/src/libstd/path.rs @@ -2,7 +2,7 @@ //! Cross-platform path manipulation. //! -//! This module provides two types, [`PathBuf`] and [`Path`][`Path`] (akin to [`String`] +//! This module provides two types, [`PathBuf`] and [`Path`] (akin to [`String`] //! and [`str`]), for working with paths abstractly. These types are thin wrappers //! around [`OsString`] and [`OsStr`] respectively, meaning that they work directly //! on strings according to the local platform's path syntax. @@ -224,18 +224,12 @@ impl<'a> Prefix<'a> { #[stable(feature = "rust1", since = "1.0.0")] pub fn is_verbatim(&self) -> bool { use self::Prefix::*; - match *self { - Verbatim(_) | VerbatimDisk(_) | VerbatimUNC(..) => true, - _ => false, - } + matches!(*self, Verbatim(_) | VerbatimDisk(_) | VerbatimUNC(..)) } #[inline] fn is_drive(&self) -> bool { - match *self { - Prefix::Disk(_) => true, - _ => false, - } + matches!(*self, Prefix::Disk(_)) } #[inline] @@ -296,6 +290,13 @@ where } // See note at the top of this module to understand why these are used: +// +// These casts are safe as OsStr is internally a wrapper around [u8] on all +// platforms. +// +// Note that currently this relies on the special knowledge that libstd has; +// these types are single-element structs but are not marked repr(transparent) +// or repr(C) which would make these casts allowable outside std. fn os_str_as_u8_slice(s: &OsStr) -> &[u8] { unsafe { &*(s as *const OsStr as *const [u8]) } } @@ -1474,6 +1475,7 @@ impl From<OsString> for PathBuf { /// Converts a `OsString` into a `PathBuf` /// /// This conversion does not allocate or copy memory. + #[inline] fn from(s: OsString) -> PathBuf { PathBuf { inner: s } } @@ -1534,7 +1536,7 @@ impl fmt::Debug for PathBuf { #[stable(feature = "rust1", since = "1.0.0")] impl ops::Deref for PathBuf { type Target = Path; - + #[inline] fn deref(&self) -> &Path { Path::new(&self.inner) } @@ -2654,6 +2656,7 @@ impl AsRef<Path> for OsString { #[stable(feature = "rust1", since = "1.0.0")] impl AsRef<Path> for str { + #[inline] fn as_ref(&self) -> &Path { Path::new(self) } @@ -2668,6 +2671,7 @@ impl AsRef<Path> for String { #[stable(feature = "rust1", since = "1.0.0")] impl AsRef<Path> for PathBuf { + #[inline] fn as_ref(&self) -> &Path { self } @@ -2786,6 +2790,7 @@ impl_cmp_os_str!(Cow<'a, Path>, OsString); #[stable(since = "1.7.0", feature = "strip_prefix")] impl fmt::Display for StripPrefixError { + #[allow(deprecated, deprecated_in_future)] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { self.description().fmt(f) } @@ -2793,6 +2798,7 @@ impl fmt::Display for StripPrefixError { #[stable(since = "1.7.0", feature = "strip_prefix")] impl Error for StripPrefixError { + #[allow(deprecated)] fn description(&self) -> &str { "prefix not found" } diff --git a/src/libstd/primitive_docs.rs b/src/libstd/primitive_docs.rs index a72951c034..d4b41e11c0 100644 --- a/src/libstd/primitive_docs.rs +++ b/src/libstd/primitive_docs.rs @@ -56,7 +56,7 @@ /// assert_eq!(false as i32, 0); /// ``` #[stable(feature = "rust1", since = "1.0.0")] -mod prim_bool { } +mod prim_bool {} #[doc(primitive = "never")] #[doc(alias = "!")] @@ -240,7 +240,7 @@ mod prim_bool { } /// [`default()`]: default/trait.Default.html#tymethod.default /// #[unstable(feature = "never_type", issue = "35121")] -mod prim_never { } +mod prim_never {} #[doc(primitive = "char")] // @@ -316,7 +316,7 @@ mod prim_never { } /// assert_eq!(32, std::mem::size_of_val(&v[..])); /// ``` #[stable(feature = "rust1", since = "1.0.0")] -mod prim_char { } +mod prim_char {} #[doc(primitive = "unit")] // @@ -354,7 +354,7 @@ mod prim_char { } /// ``` /// #[stable(feature = "rust1", since = "1.0.0")] -mod prim_unit { } +mod prim_unit {} #[doc(primitive = "pointer")] // @@ -447,7 +447,7 @@ mod prim_unit { } /// [`drop`]: ../std/mem/fn.drop.html /// [`write`]: ../std/ptr/fn.write.html #[stable(feature = "rust1", since = "1.0.0")] -mod prim_pointer { } +mod prim_pointer {} #[doc(primitive = "array")] // @@ -558,7 +558,7 @@ mod prim_pointer { } /// [`IntoIterator`]: iter/trait.IntoIterator.html /// #[stable(feature = "rust1", since = "1.0.0")] -mod prim_array { } +mod prim_array {} #[doc(primitive = "slice")] #[doc(alias = "[")] @@ -593,7 +593,7 @@ mod prim_array { } /// assert_eq!(x, &[1, 7, 3]); /// ``` #[stable(feature = "rust1", since = "1.0.0")] -mod prim_slice { } +mod prim_slice {} #[doc(primitive = "str")] // @@ -658,7 +658,7 @@ mod prim_slice { } /// used to get a string slice under normal circumstances. Use `as_str` /// instead. #[stable(feature = "rust1", since = "1.0.0")] -mod prim_str { } +mod prim_str {} #[doc(primitive = "tuple")] #[doc(alias = "(")] @@ -766,7 +766,7 @@ mod prim_str { } /// ``` /// #[stable(feature = "rust1", since = "1.0.0")] -mod prim_tuple { } +mod prim_tuple {} #[doc(primitive = "f32")] /// The 32-bit floating point type. @@ -774,7 +774,7 @@ mod prim_tuple { } /// *[See also the `std::f32` module](f32/index.html).* /// #[stable(feature = "rust1", since = "1.0.0")] -mod prim_f32 { } +mod prim_f32 {} #[doc(primitive = "f64")] // @@ -783,7 +783,7 @@ mod prim_f32 { } /// *[See also the `std::f64` module](f64/index.html).* /// #[stable(feature = "rust1", since = "1.0.0")] -mod prim_f64 { } +mod prim_f64 {} #[doc(primitive = "i8")] // @@ -791,7 +791,7 @@ mod prim_f64 { } /// /// *[See also the `std::i8` module](i8/index.html).* #[stable(feature = "rust1", since = "1.0.0")] -mod prim_i8 { } +mod prim_i8 {} #[doc(primitive = "i16")] // @@ -799,7 +799,7 @@ mod prim_i8 { } /// /// *[See also the `std::i16` module](i16/index.html).* #[stable(feature = "rust1", since = "1.0.0")] -mod prim_i16 { } +mod prim_i16 {} #[doc(primitive = "i32")] // @@ -807,7 +807,7 @@ mod prim_i16 { } /// /// *[See also the `std::i32` module](i32/index.html).* #[stable(feature = "rust1", since = "1.0.0")] -mod prim_i32 { } +mod prim_i32 {} #[doc(primitive = "i64")] // @@ -815,15 +815,15 @@ mod prim_i32 { } /// /// *[See also the `std::i64` module](i64/index.html).* #[stable(feature = "rust1", since = "1.0.0")] -mod prim_i64 { } +mod prim_i64 {} #[doc(primitive = "i128")] // /// The 128-bit signed integer type. /// /// *[See also the `std::i128` module](i128/index.html).* -#[stable(feature = "i128", since="1.26.0")] -mod prim_i128 { } +#[stable(feature = "i128", since = "1.26.0")] +mod prim_i128 {} #[doc(primitive = "u8")] // @@ -831,7 +831,7 @@ mod prim_i128 { } /// /// *[See also the `std::u8` module](u8/index.html).* #[stable(feature = "rust1", since = "1.0.0")] -mod prim_u8 { } +mod prim_u8 {} #[doc(primitive = "u16")] // @@ -839,7 +839,7 @@ mod prim_u8 { } /// /// *[See also the `std::u16` module](u16/index.html).* #[stable(feature = "rust1", since = "1.0.0")] -mod prim_u16 { } +mod prim_u16 {} #[doc(primitive = "u32")] // @@ -847,7 +847,7 @@ mod prim_u16 { } /// /// *[See also the `std::u32` module](u32/index.html).* #[stable(feature = "rust1", since = "1.0.0")] -mod prim_u32 { } +mod prim_u32 {} #[doc(primitive = "u64")] // @@ -855,15 +855,15 @@ mod prim_u32 { } /// /// *[See also the `std::u64` module](u64/index.html).* #[stable(feature = "rust1", since = "1.0.0")] -mod prim_u64 { } +mod prim_u64 {} #[doc(primitive = "u128")] // /// The 128-bit unsigned integer type. /// /// *[See also the `std::u128` module](u128/index.html).* -#[stable(feature = "i128", since="1.26.0")] -mod prim_u128 { } +#[stable(feature = "i128", since = "1.26.0")] +mod prim_u128 {} #[doc(primitive = "isize")] // @@ -875,7 +875,7 @@ mod prim_u128 { } /// location in memory. For example, on a 32 bit target, this is 4 bytes /// and on a 64 bit target, this is 8 bytes. #[stable(feature = "rust1", since = "1.0.0")] -mod prim_isize { } +mod prim_isize {} #[doc(primitive = "usize")] // @@ -887,7 +887,7 @@ mod prim_isize { } /// location in memory. For example, on a 32 bit target, this is 4 bytes /// and on a 64 bit target, this is 8 bytes. #[stable(feature = "rust1", since = "1.0.0")] -mod prim_usize { } +mod prim_usize {} #[doc(primitive = "reference")] #[doc(alias = "&")] @@ -1034,7 +1034,7 @@ mod prim_usize { } /// meant for generic contexts, where the final type `T` is a type parameter or otherwise not /// locally known. #[stable(feature = "rust1", since = "1.0.0")] -mod prim_ref { } +mod prim_ref {} #[doc(primitive = "fn")] // @@ -1136,4 +1136,4 @@ mod prim_ref { } /// /// [`Copy`]: marker/trait.Copy.html #[stable(feature = "rust1", since = "1.0.0")] -mod prim_fn { } +mod prim_fn {} diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs index 1ed984509d..2426b2dead 100644 --- a/src/libstd/rt.rs +++ b/src/libstd/rt.rs @@ -10,7 +10,7 @@ feature = "rt", reason = "this public module should not exist and is highly likely \ to disappear", - issue = "0" + issue = "none" )] #![doc(hidden)] diff --git a/src/libstd/sync/barrier.rs b/src/libstd/sync/barrier.rs index eddbdff257..01314370ce 100644 --- a/src/libstd/sync/barrier.rs +++ b/src/libstd/sync/barrier.rs @@ -199,10 +199,7 @@ mod tests { // At this point, all spawned threads should be blocked, // so we shouldn't get anything from the port - assert!(match rx.try_recv() { - Err(TryRecvError::Empty) => true, - _ => false, - }); + assert!(matches!(rx.try_recv(), Err(TryRecvError::Empty))); let mut leader_found = barrier.wait().is_leader(); diff --git a/src/libstd/sync/condvar.rs b/src/libstd/sync/condvar.rs index 65ce19f2a1..77e521eae9 100644 --- a/src/libstd/sync/condvar.rs +++ b/src/libstd/sync/condvar.rs @@ -127,10 +127,7 @@ impl Condvar { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn new() -> Condvar { - let mut c = Condvar { - inner: box sys::Condvar::new(), - mutex: AtomicUsize::new(0), - }; + let mut c = Condvar { inner: box sys::Condvar::new(), mutex: AtomicUsize::new(0) }; unsafe { c.inner.init(); } @@ -196,25 +193,18 @@ impl Condvar { /// } /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn wait<'a, T>(&self, guard: MutexGuard<'a, T>) - -> LockResult<MutexGuard<'a, T>> { + pub fn wait<'a, T>(&self, guard: MutexGuard<'a, T>) -> LockResult<MutexGuard<'a, T>> { let poisoned = unsafe { let lock = mutex::guard_lock(&guard); self.verify(lock); self.inner.wait(lock); mutex::guard_poison(&guard).get() }; - if poisoned { - Err(PoisonError::new(guard)) - } else { - Ok(guard) - } + if poisoned { Err(PoisonError::new(guard)) } else { Ok(guard) } } /// Blocks the current thread until this condition variable receives a - /// notification and the required condition is met. Spurious wakeups are - /// ignored and this function will only return once the condition has been - /// met. + /// notification and the provided condition is false. /// /// This function will atomically unlock the mutex specified (represented by /// `guard`) and block the current thread. This means that any calls @@ -236,39 +226,40 @@ impl Condvar { /// # Examples /// /// ``` - /// #![feature(wait_until)] - /// /// use std::sync::{Arc, Mutex, Condvar}; /// use std::thread; /// - /// let pair = Arc::new((Mutex::new(false), Condvar::new())); + /// let pair = Arc::new((Mutex::new(true), Condvar::new())); /// let pair2 = pair.clone(); /// /// thread::spawn(move|| { /// let (lock, cvar) = &*pair2; - /// let mut started = lock.lock().unwrap(); - /// *started = true; + /// let mut pending = lock.lock().unwrap(); + /// *pending = false; /// // We notify the condvar that the value has changed. /// cvar.notify_one(); /// }); /// /// // Wait for the thread to start up. /// let (lock, cvar) = &*pair; - /// // As long as the value inside the `Mutex<bool>` is `false`, we wait. - /// let _guard = cvar.wait_until(lock.lock().unwrap(), |started| { *started }).unwrap(); + /// // As long as the value inside the `Mutex<bool>` is `true`, we wait. + /// let _guard = cvar.wait_while(lock.lock().unwrap(), |pending| { *pending }).unwrap(); /// ``` - #[unstable(feature = "wait_until", issue = "47960")] - pub fn wait_until<'a, T, F>(&self, mut guard: MutexGuard<'a, T>, - mut condition: F) - -> LockResult<MutexGuard<'a, T>> - where F: FnMut(&mut T) -> bool { - while !condition(&mut *guard) { + #[stable(feature = "wait_until", since = "1.42.0")] + pub fn wait_while<'a, T, F>( + &self, + mut guard: MutexGuard<'a, T>, + mut condition: F, + ) -> LockResult<MutexGuard<'a, T>> + where + F: FnMut(&mut T) -> bool, + { + while condition(&mut *guard) { guard = self.wait(guard)?; } Ok(guard) } - /// Waits on this condition variable for a notification, timing out after a /// specified duration. /// @@ -324,12 +315,13 @@ impl Condvar { /// ``` #[stable(feature = "rust1", since = "1.0.0")] #[rustc_deprecated(since = "1.6.0", reason = "replaced by `std::sync::Condvar::wait_timeout`")] - pub fn wait_timeout_ms<'a, T>(&self, guard: MutexGuard<'a, T>, ms: u32) - -> LockResult<(MutexGuard<'a, T>, bool)> { + pub fn wait_timeout_ms<'a, T>( + &self, + guard: MutexGuard<'a, T>, + ms: u32, + ) -> LockResult<(MutexGuard<'a, T>, bool)> { let res = self.wait_timeout(guard, Duration::from_millis(ms as u64)); - poison::map_result(res, |(a, b)| { - (a, !b.timed_out()) - }) + poison::map_result(res, |(a, b)| (a, !b.timed_out())) } /// Waits on this condition variable for a notification, timing out after a @@ -347,11 +339,10 @@ impl Condvar { /// Condition variables normally have a boolean predicate associated with /// them, and the predicate must always be checked each time this function /// returns to protect against spurious wakeups. Additionally, it is - /// typically desirable for the time-out to not exceed some duration in + /// typically desirable for the timeout to not exceed some duration in /// spite of spurious wakes, thus the sleep-duration is decremented by the - /// amount slept. Alternatively, use the `wait_timeout_until` method - /// to wait until a condition is met with a total time-out regardless - /// of spurious wakes. + /// amount slept. Alternatively, use the `wait_timeout_while` method + /// to wait with a timeout while a predicate is true. /// /// The returned [`WaitTimeoutResult`] value indicates if the timeout is /// known to have elapsed. @@ -360,7 +351,7 @@ impl Condvar { /// returns, regardless of whether the timeout elapsed or not. /// /// [`wait`]: #method.wait - /// [`wait_timeout_until`]: #method.wait_timeout_until + /// [`wait_timeout_while`]: #method.wait_timeout_while /// [`WaitTimeoutResult`]: struct.WaitTimeoutResult.html /// /// # Examples @@ -396,27 +387,24 @@ impl Condvar { /// } /// ``` #[stable(feature = "wait_timeout", since = "1.5.0")] - pub fn wait_timeout<'a, T>(&self, guard: MutexGuard<'a, T>, - dur: Duration) - -> LockResult<(MutexGuard<'a, T>, WaitTimeoutResult)> { + pub fn wait_timeout<'a, T>( + &self, + guard: MutexGuard<'a, T>, + dur: Duration, + ) -> LockResult<(MutexGuard<'a, T>, WaitTimeoutResult)> { let (poisoned, result) = unsafe { let lock = mutex::guard_lock(&guard); self.verify(lock); let success = self.inner.wait_timeout(lock, dur); (mutex::guard_poison(&guard).get(), WaitTimeoutResult(!success)) }; - if poisoned { - Err(PoisonError::new((guard, result))) - } else { - Ok((guard, result)) - } + if poisoned { Err(PoisonError::new((guard, result))) } else { Ok((guard, result)) } } /// Waits on this condition variable for a notification, timing out after a - /// specified duration. Spurious wakes will not cause this function to - /// return. + /// specified duration. /// - /// The semantics of this function are equivalent to [`wait_until`] except + /// The semantics of this function are equivalent to [`wait_while`] except /// that the thread will be blocked for roughly no longer than `dur`. This /// method should not be used for precise timing due to anomalies such as /// preemption or platform differences that may not cause the maximum @@ -429,53 +417,56 @@ impl Condvar { /// The returned [`WaitTimeoutResult`] value indicates if the timeout is /// known to have elapsed without the condition being met. /// - /// Like [`wait_until`], the lock specified will be re-acquired when this + /// Like [`wait_while`], the lock specified will be re-acquired when this /// function returns, regardless of whether the timeout elapsed or not. /// - /// [`wait_until`]: #method.wait_until + /// [`wait_while`]: #method.wait_while /// [`wait_timeout`]: #method.wait_timeout /// [`WaitTimeoutResult`]: struct.WaitTimeoutResult.html /// /// # Examples /// /// ``` - /// #![feature(wait_timeout_until)] - /// /// use std::sync::{Arc, Mutex, Condvar}; /// use std::thread; /// use std::time::Duration; /// - /// let pair = Arc::new((Mutex::new(false), Condvar::new())); + /// let pair = Arc::new((Mutex::new(true), Condvar::new())); /// let pair2 = pair.clone(); /// /// thread::spawn(move|| { /// let (lock, cvar) = &*pair2; - /// let mut started = lock.lock().unwrap(); - /// *started = true; + /// let mut pending = lock.lock().unwrap(); + /// *pending = false; /// // We notify the condvar that the value has changed. /// cvar.notify_one(); /// }); /// /// // wait for the thread to start up /// let (lock, cvar) = &*pair; - /// let result = cvar.wait_timeout_until( + /// let result = cvar.wait_timeout_while( /// lock.lock().unwrap(), /// Duration::from_millis(100), - /// |&mut started| started, + /// |&mut pending| pending, /// ).unwrap(); /// if result.1.timed_out() { - /// // timed-out without the condition ever evaluating to true. + /// // timed-out without the condition ever evaluating to false. /// } /// // access the locked mutex via result.0 /// ``` - #[unstable(feature = "wait_timeout_until", issue = "47960")] - pub fn wait_timeout_until<'a, T, F>(&self, mut guard: MutexGuard<'a, T>, - dur: Duration, mut condition: F) - -> LockResult<(MutexGuard<'a, T>, WaitTimeoutResult)> - where F: FnMut(&mut T) -> bool { + #[stable(feature = "wait_timeout_until", since = "1.42.0")] + pub fn wait_timeout_while<'a, T, F>( + &self, + mut guard: MutexGuard<'a, T>, + dur: Duration, + mut condition: F, + ) -> LockResult<(MutexGuard<'a, T>, WaitTimeoutResult)> + where + F: FnMut(&mut T) -> bool, + { let start = Instant::now(); loop { - if condition(&mut *guard) { + if !condition(&mut *guard) { return Ok((guard, WaitTimeoutResult(false))); } let timeout = match dur.checked_sub(start.elapsed()) { @@ -581,8 +572,10 @@ impl Condvar { // Anything else and we're using more than one mutex on this cvar, // which is currently disallowed. - _ => panic!("attempted to use a condition variable with two \ - mutexes"), + _ => panic!( + "attempted to use a condition variable with two \ + mutexes" + ), } } } @@ -611,10 +604,9 @@ impl Drop for Condvar { #[cfg(test)] mod tests { - /// #![feature(wait_until)] - use crate::sync::mpsc::channel; - use crate::sync::{Condvar, Mutex, Arc}; use crate::sync::atomic::{AtomicBool, Ordering}; + use crate::sync::mpsc::channel; + use crate::sync::{Arc, Condvar, Mutex}; use crate::thread; use crate::time::Duration; use crate::u64; @@ -635,7 +627,7 @@ mod tests { let c2 = c.clone(); let g = m.lock().unwrap(); - let _t = thread::spawn(move|| { + let _t = thread::spawn(move || { let _g = m2.lock().unwrap(); c2.notify_one(); }); @@ -653,7 +645,7 @@ mod tests { for _ in 0..N { let data = data.clone(); let tx = tx.clone(); - thread::spawn(move|| { + thread::spawn(move || { let &(ref lock, ref cond) = &*data; let mut cnt = lock.lock().unwrap(); *cnt += 1; @@ -682,12 +674,12 @@ mod tests { #[test] #[cfg_attr(target_os = "emscripten", ignore)] - fn wait_until() { + fn wait_while() { let pair = Arc::new((Mutex::new(false), Condvar::new())); let pair2 = pair.clone(); // Inside of our lock, spawn a new thread, and then wait for it to start. - thread::spawn(move|| { + thread::spawn(move || { let &(ref lock, ref cvar) = &*pair2; let mut started = lock.lock().unwrap(); *started = true; @@ -697,9 +689,7 @@ mod tests { // Wait for the thread to start up. let &(ref lock, ref cvar) = &*pair; - let guard = cvar.wait_until(lock.lock().unwrap(), |started| { - *started - }); + let guard = cvar.wait_while(lock.lock().unwrap(), |started| !*started); assert!(*guard.unwrap()); } @@ -726,24 +716,24 @@ mod tests { #[test] #[cfg_attr(target_os = "emscripten", ignore)] #[cfg_attr(target_env = "sgx", ignore)] // FIXME: https://github.com/fortanix/rust-sgx/issues/31 - fn wait_timeout_until_wait() { + fn wait_timeout_while_wait() { let m = Arc::new(Mutex::new(())); let c = Arc::new(Condvar::new()); let g = m.lock().unwrap(); - let (_g, wait) = c.wait_timeout_until(g, Duration::from_millis(1), |_| { false }).unwrap(); + let (_g, wait) = c.wait_timeout_while(g, Duration::from_millis(1), |_| true).unwrap(); // no spurious wakeups. ensure it timed-out assert!(wait.timed_out()); } #[test] #[cfg_attr(target_os = "emscripten", ignore)] - fn wait_timeout_until_instant_satisfy() { + fn wait_timeout_while_instant_satisfy() { let m = Arc::new(Mutex::new(())); let c = Arc::new(Condvar::new()); let g = m.lock().unwrap(); - let (_g, wait) = c.wait_timeout_until(g, Duration::from_millis(0), |_| { true }).unwrap(); + let (_g, wait) = c.wait_timeout_while(g, Duration::from_millis(0), |_| false).unwrap(); // ensure it didn't time-out even if we were not given any time. assert!(!wait.timed_out()); } @@ -751,7 +741,7 @@ mod tests { #[test] #[cfg_attr(target_os = "emscripten", ignore)] #[cfg_attr(target_env = "sgx", ignore)] // FIXME: https://github.com/fortanix/rust-sgx/issues/31 - fn wait_timeout_until_wake() { + fn wait_timeout_while_wake() { let pair = Arc::new((Mutex::new(false), Condvar::new())); let pair_copy = pair.clone(); @@ -764,9 +754,9 @@ mod tests { *started = true; cvar.notify_one(); }); - let (g2, wait) = c.wait_timeout_until(g, Duration::from_millis(u64::MAX), |&mut notified| { - notified - }).unwrap(); + let (g2, wait) = c + .wait_timeout_while(g, Duration::from_millis(u64::MAX), |&mut notified| !notified) + .unwrap(); // ensure it didn't time-out even if we were not given any time. assert!(!wait.timed_out()); assert!(*g2); @@ -820,7 +810,7 @@ mod tests { let c2 = c.clone(); let mut g = m.lock().unwrap(); - let _t = thread::spawn(move|| { + let _t = thread::spawn(move || { let _g = m2.lock().unwrap(); c2.notify_one(); }); diff --git a/src/libstd/sync/mod.rs b/src/libstd/sync/mod.rs index fd6e46fd61..b6699910b0 100644 --- a/src/libstd/sync/mod.rs +++ b/src/libstd/sync/mod.rs @@ -166,9 +166,9 @@ pub use self::mutex::{Mutex, MutexGuard}; #[allow(deprecated)] pub use self::once::{Once, OnceState, ONCE_INIT}; #[stable(feature = "rust1", since = "1.0.0")] -pub use crate::sys_common::poison::{PoisonError, TryLockError, TryLockResult, LockResult}; -#[stable(feature = "rust1", since = "1.0.0")] pub use self::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard}; +#[stable(feature = "rust1", since = "1.0.0")] +pub use crate::sys_common::poison::{LockResult, PoisonError, TryLockError, TryLockResult}; pub mod mpsc; diff --git a/src/libstd/sync/mpsc/mod.rs b/src/libstd/sync/mpsc/mod.rs index 2831bbcb88..e70204d683 100644 --- a/src/libstd/sync/mpsc/mod.rs +++ b/src/libstd/sync/mpsc/mod.rs @@ -286,7 +286,7 @@ mod sync; mod cache_aligned; -/// The receiving half of Rust's [`channel`][] (or [`sync_channel`]) type. +/// The receiving half of Rust's [`channel`] (or [`sync_channel`]) type. /// This half can only be owned by one thread. /// /// Messages sent to the channel can be retrieved using [`recv`]. @@ -558,7 +558,7 @@ pub struct SendError<T>(#[stable(feature = "rust1", since = "1.0.0")] pub T); /// An error returned from the [`recv`] function on a [`Receiver`]. /// /// The [`recv`] operation can only fail if the sending half of a -/// [`channel`][`channel`] (or [`sync_channel`]) is disconnected, implying that no further +/// [`channel`] (or [`sync_channel`]) is disconnected, implying that no further /// messages will ever be received. /// /// [`recv`]: struct.Receiver.html#method.recv @@ -1108,7 +1108,7 @@ impl<T> Receiver<T> { /// /// This function will always block the current thread if there is no data /// available and it's possible for more data to be sent. Once a message is - /// sent to the corresponding [`Sender`][] (or [`SyncSender`]), then this + /// sent to the corresponding [`Sender`] (or [`SyncSender`]), then this /// receiver will wake up and return that message. /// /// If the corresponding [`Sender`] has disconnected, or it disconnects while @@ -1194,7 +1194,7 @@ impl<T> Receiver<T> { /// /// This function will always block the current thread if there is no data /// available and it's possible for more data to be sent. Once a message is - /// sent to the corresponding [`Sender`][] (or [`SyncSender`]), then this + /// sent to the corresponding [`Sender`] (or [`SyncSender`]), then this /// receiver will wake up and return that message. /// /// If the corresponding [`Sender`] has disconnected, or it disconnects while @@ -1295,7 +1295,7 @@ impl<T> Receiver<T> { /// /// This function will always block the current thread if there is no data /// available and it's possible for more data to be sent. Once a message is - /// sent to the corresponding [`Sender`][] (or [`SyncSender`]), then this + /// sent to the corresponding [`Sender`] (or [`SyncSender`]), then this /// receiver will wake up and return that message. /// /// If the corresponding [`Sender`] has disconnected, or it disconnects while @@ -1550,6 +1550,7 @@ impl<T> fmt::Display for SendError<T> { #[stable(feature = "rust1", since = "1.0.0")] impl<T: Send> error::Error for SendError<T> { + #[allow(deprecated)] fn description(&self) -> &str { "sending on a closed channel" } @@ -1577,6 +1578,7 @@ impl<T> fmt::Display for TrySendError<T> { #[stable(feature = "rust1", since = "1.0.0")] impl<T: Send> error::Error for TrySendError<T> { + #[allow(deprecated)] fn description(&self) -> &str { match *self { TrySendError::Full(..) => "sending on a full channel", @@ -1603,6 +1605,7 @@ impl fmt::Display for RecvError { #[stable(feature = "rust1", since = "1.0.0")] impl error::Error for RecvError { + #[allow(deprecated)] fn description(&self) -> &str { "receiving on a closed channel" } @@ -1620,6 +1623,7 @@ impl fmt::Display for TryRecvError { #[stable(feature = "rust1", since = "1.0.0")] impl error::Error for TryRecvError { + #[allow(deprecated)] fn description(&self) -> &str { match *self { TryRecvError::Empty => "receiving on an empty channel", @@ -1649,6 +1653,7 @@ impl fmt::Display for RecvTimeoutError { #[stable(feature = "mpsc_recv_timeout_error", since = "1.15.0")] impl error::Error for RecvTimeoutError { + #[allow(deprecated)] fn description(&self) -> &str { match *self { RecvTimeoutError::Timeout => "timed out waiting on channel", diff --git a/src/libstd/sync/mpsc/oneshot.rs b/src/libstd/sync/mpsc/oneshot.rs index bbe77e7d0f..5b41525e06 100644 --- a/src/libstd/sync/mpsc/oneshot.rs +++ b/src/libstd/sync/mpsc/oneshot.rs @@ -118,12 +118,7 @@ impl<T> Packet<T> { // Just tests whether this channel has been sent on or not, this is only // safe to use from the sender. pub fn sent(&self) -> bool { - unsafe { - match *self.upgrade.get() { - NothingSent => false, - _ => true, - } - } + unsafe { !matches!(*self.upgrade.get(), NothingSent) } } pub fn recv(&self, deadline: Option<Instant>) -> Result<T, Failure<T>> { diff --git a/src/libstd/sync/mutex.rs b/src/libstd/sync/mutex.rs index e90da69906..6eeddc2851 100644 --- a/src/libstd/sync/mutex.rs +++ b/src/libstd/sync/mutex.rs @@ -4,7 +4,7 @@ use crate::mem; use crate::ops::{Deref, DerefMut}; use crate::ptr; use crate::sys_common::mutex as sys; -use crate::sys_common::poison::{self, TryLockError, TryLockResult, LockResult}; +use crate::sys_common::poison::{self, LockResult, TryLockError, TryLockResult}; /// A mutual exclusion primitive useful for protecting shared data /// @@ -122,9 +122,9 @@ pub struct Mutex<T: ?Sized> { // these are the only places where `T: Send` matters; all other // functionality works fine on a single thread. #[stable(feature = "rust1", since = "1.0.0")] -unsafe impl<T: ?Sized + Send> Send for Mutex<T> { } +unsafe impl<T: ?Sized + Send> Send for Mutex<T> {} #[stable(feature = "rust1", since = "1.0.0")] -unsafe impl<T: ?Sized + Send> Sync for Mutex<T> { } +unsafe impl<T: ?Sized + Send> Sync for Mutex<T> {} /// An RAII implementation of a "scoped lock" of a mutex. When this structure is /// dropped (falls out of scope), the lock will be unlocked. @@ -148,9 +148,9 @@ pub struct MutexGuard<'a, T: ?Sized + 'a> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<T: ?Sized> !Send for MutexGuard<'_, T> { } +impl<T: ?Sized> !Send for MutexGuard<'_, T> {} #[stable(feature = "mutexguard", since = "1.19.0")] -unsafe impl<T: ?Sized + Sync> Sync for MutexGuard<'_, T> { } +unsafe impl<T: ?Sized + Sync> Sync for MutexGuard<'_, T> {} impl<T> Mutex<T> { /// Creates a new mutex in an unlocked state ready for use. @@ -309,7 +309,10 @@ impl<T: ?Sized> Mutex<T> { /// assert_eq!(mutex.into_inner().unwrap(), 0); /// ``` #[stable(feature = "mutex_into_inner", since = "1.6.0")] - pub fn into_inner(self) -> LockResult<T> where T: Sized { + pub fn into_inner(self) -> LockResult<T> + where + T: Sized, + { // We know statically that there are no outstanding references to // `self` so there's no need to lock the inner mutex. // @@ -323,7 +326,7 @@ impl<T: ?Sized> Mutex<T> { (ptr::read(inner), ptr::read(poison), ptr::read(data)) }; mem::forget(self); - inner.destroy(); // Keep in sync with the `Drop` impl. + inner.destroy(); // Keep in sync with the `Drop` impl. drop(inner); poison::map_result(poison.borrow(), |_| data.into_inner()) @@ -354,7 +357,7 @@ impl<T: ?Sized> Mutex<T> { // We know statically that there are no other references to `self`, so // there's no need to lock the inner mutex. let data = unsafe { &mut *self.data.get() }; - poison::map_result(self.poison.borrow(), |_| data ) + poison::map_result(self.poison.borrow(), |_| data) } } @@ -396,7 +399,7 @@ impl<T: ?Sized + fmt::Debug> fmt::Debug for Mutex<T> { Ok(guard) => f.debug_struct("Mutex").field("data", &&*guard).finish(), Err(TryLockError::Poisoned(err)) => { f.debug_struct("Mutex").field("data", &&**err.get_ref()).finish() - }, + } Err(TryLockError::WouldBlock) => { struct LockedPlaceholder; impl fmt::Debug for LockedPlaceholder { @@ -413,12 +416,7 @@ impl<T: ?Sized + fmt::Debug> fmt::Debug for Mutex<T> { impl<'mutex, T: ?Sized> MutexGuard<'mutex, T> { unsafe fn new(lock: &'mutex Mutex<T>) -> LockResult<MutexGuard<'mutex, T>> { - poison::map_result(lock.poison.borrow(), |guard| { - MutexGuard { - lock: lock, - poison: guard, - } - }) + poison::map_result(lock.poison.borrow(), |guard| MutexGuard { lock: lock, poison: guard }) } } @@ -473,9 +471,9 @@ pub fn guard_poison<'a, T: ?Sized>(guard: &MutexGuard<'a, T>) -> &'a poison::Fla #[cfg(all(test, not(target_os = "emscripten")))] mod tests { - use crate::sync::mpsc::channel; - use crate::sync::{Arc, Mutex, Condvar}; use crate::sync::atomic::{AtomicUsize, Ordering}; + use crate::sync::mpsc::channel; + use crate::sync::{Arc, Condvar, Mutex}; use crate::thread; struct Packet<T>(Arc<(Mutex<T>, Condvar)>); @@ -507,10 +505,16 @@ mod tests { for _ in 0..K { let tx2 = tx.clone(); let m2 = m.clone(); - thread::spawn(move|| { inc(&m2); tx2.send(()).unwrap(); }); + thread::spawn(move || { + inc(&m2); + tx2.send(()).unwrap(); + }); let tx2 = tx.clone(); let m2 = m.clone(); - thread::spawn(move|| { inc(&m2); tx2.send(()).unwrap(); }); + thread::spawn(move || { + inc(&m2); + tx2.send(()).unwrap(); + }); } drop(tx); @@ -557,7 +561,8 @@ mod tests { let _ = thread::spawn(move || { let _lock = m2.lock().unwrap(); panic!("test panic in inner thread to poison mutex"); - }).join(); + }) + .join(); assert!(m.is_poisoned()); match Arc::try_unwrap(m).unwrap().into_inner() { @@ -580,7 +585,8 @@ mod tests { let _ = thread::spawn(move || { let _lock = m2.lock().unwrap(); panic!("test panic in inner thread to poison mutex"); - }).join(); + }) + .join(); assert!(m.is_poisoned()); match Arc::try_unwrap(m).unwrap().get_mut() { @@ -594,7 +600,7 @@ mod tests { let packet = Packet(Arc::new((Mutex::new(false), Condvar::new()))); let packet2 = Packet(packet.0.clone()); let (tx, rx) = channel(); - let _t = thread::spawn(move|| { + let _t = thread::spawn(move || { // wait until parent gets in rx.recv().unwrap(); let &(ref lock, ref cvar) = &*packet2.0; @@ -646,10 +652,11 @@ mod tests { let arc = Arc::new(Mutex::new(1)); assert!(!arc.is_poisoned()); let arc2 = arc.clone(); - let _ = thread::spawn(move|| { + let _ = thread::spawn(move || { let lock = arc2.lock().unwrap(); assert_eq!(*lock, 2); - }).join(); + }) + .join(); assert!(arc.lock().is_err()); assert!(arc.is_poisoned()); } @@ -661,7 +668,7 @@ mod tests { let arc = Arc::new(Mutex::new(1)); let arc2 = Arc::new(Mutex::new(arc)); let (tx, rx) = channel(); - let _t = thread::spawn(move|| { + let _t = thread::spawn(move || { let lock = arc2.lock().unwrap(); let lock2 = lock.lock().unwrap(); assert_eq!(*lock2, 1); @@ -674,7 +681,7 @@ mod tests { fn test_mutex_arc_access_in_unwind() { let arc = Arc::new(Mutex::new(1)); let arc2 = arc.clone(); - let _ = thread::spawn(move|| -> () { + let _ = thread::spawn(move || -> () { struct Unwinder { i: Arc<Mutex<i32>>, } @@ -685,7 +692,8 @@ mod tests { } let _u = Unwinder { i: arc2 }; panic!(); - }).join(); + }) + .join(); let lock = arc.lock().unwrap(); assert_eq!(*lock, 2); } diff --git a/src/libstd/sync/once.rs b/src/libstd/sync/once.rs index d8df09071c..61c4d0c2db 100644 --- a/src/libstd/sync/once.rs +++ b/src/libstd/sync/once.rs @@ -188,7 +188,7 @@ struct WaiterQueue<'a> { impl Once { /// Creates a new `Once` value. #[stable(feature = "once_new", since = "1.2.0")] - #[cfg_attr(not(bootstrap), rustc_const_stable(feature = "const_once_new", since = "1.32.0"))] + #[rustc_const_stable(feature = "const_once_new", since = "1.32.0")] pub const fn new() -> Once { Once { state_and_queue: AtomicUsize::new(INCOMPLETE), _marker: marker::PhantomData } } diff --git a/src/libstd/sync/rwlock.rs b/src/libstd/sync/rwlock.rs index c217291a42..fdd29af858 100644 --- a/src/libstd/sync/rwlock.rs +++ b/src/libstd/sync/rwlock.rs @@ -25,7 +25,7 @@ use crate::sys_common::rwlock as sys; /// The type parameter `T` represents the data that this lock protects. It is /// required that `T` satisfies [`Send`] to be shared across threads and /// [`Sync`] to allow concurrent access through readers. The RAII guards -/// returned from the locking methods implement [`Deref`][] (and [`DerefMut`] +/// returned from the locking methods implement [`Deref`] (and [`DerefMut`] /// for the `write` methods) to allow access to the content of the lock. /// /// # Poisoning @@ -360,7 +360,10 @@ impl<T: ?Sized> RwLock<T> { /// assert_eq!(lock.into_inner().unwrap(), "modified"); /// ``` #[stable(feature = "rwlock_into_inner", since = "1.6.0")] - pub fn into_inner(self) -> LockResult<T> where T: Sized { + pub fn into_inner(self) -> LockResult<T> + where + T: Sized, + { // We know statically that there are no outstanding references to // `self` so there's no need to lock the inner lock. // @@ -426,7 +429,7 @@ impl<T: ?Sized + fmt::Debug> fmt::Debug for RwLock<T> { Ok(guard) => f.debug_struct("RwLock").field("data", &&*guard).finish(), Err(TryLockError::Poisoned(err)) => { f.debug_struct("RwLock").field("data", &&**err.get_ref()).finish() - }, + } Err(TryLockError::WouldBlock) => { struct LockedPlaceholder; impl fmt::Debug for LockedPlaceholder { @@ -461,24 +464,16 @@ impl<T> From<T> for RwLock<T> { } impl<'rwlock, T: ?Sized> RwLockReadGuard<'rwlock, T> { - unsafe fn new(lock: &'rwlock RwLock<T>) - -> LockResult<RwLockReadGuard<'rwlock, T>> { - poison::map_result(lock.poison.borrow(), |_| { - RwLockReadGuard { - lock: lock, - } - }) + unsafe fn new(lock: &'rwlock RwLock<T>) -> LockResult<RwLockReadGuard<'rwlock, T>> { + poison::map_result(lock.poison.borrow(), |_| RwLockReadGuard { lock: lock }) } } impl<'rwlock, T: ?Sized> RwLockWriteGuard<'rwlock, T> { - unsafe fn new(lock: &'rwlock RwLock<T>) - -> LockResult<RwLockWriteGuard<'rwlock, T>> { - poison::map_result(lock.poison.borrow(), |guard| { - RwLockWriteGuard { - lock: lock, - poison: guard, - } + unsafe fn new(lock: &'rwlock RwLock<T>) -> LockResult<RwLockWriteGuard<'rwlock, T>> { + poison::map_result(lock.poison.borrow(), |guard| RwLockWriteGuard { + lock: lock, + poison: guard, }) } } @@ -486,9 +481,7 @@ impl<'rwlock, T: ?Sized> RwLockWriteGuard<'rwlock, T> { #[stable(feature = "std_debug", since = "1.16.0")] impl<T: fmt::Debug> fmt::Debug for RwLockReadGuard<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("RwLockReadGuard") - .field("lock", &self.lock) - .finish() + f.debug_struct("RwLockReadGuard").field("lock", &self.lock).finish() } } @@ -502,9 +495,7 @@ impl<T: ?Sized + fmt::Display> fmt::Display for RwLockReadGuard<'_, T> { #[stable(feature = "std_debug", since = "1.16.0")] impl<T: fmt::Debug> fmt::Debug for RwLockWriteGuard<'_, T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("RwLockWriteGuard") - .field("lock", &self.lock) - .finish() + f.debug_struct("RwLockWriteGuard").field("lock", &self.lock).finish() } } @@ -543,7 +534,9 @@ impl<T: ?Sized> DerefMut for RwLockWriteGuard<'_, T> { #[stable(feature = "rust1", since = "1.0.0")] impl<T: ?Sized> Drop for RwLockReadGuard<'_, T> { fn drop(&mut self) { - unsafe { self.lock.inner.read_unlock(); } + unsafe { + self.lock.inner.read_unlock(); + } } } @@ -551,17 +544,19 @@ impl<T: ?Sized> Drop for RwLockReadGuard<'_, T> { impl<T: ?Sized> Drop for RwLockWriteGuard<'_, T> { fn drop(&mut self) { self.lock.poison.done(&self.poison); - unsafe { self.lock.inner.write_unlock(); } + unsafe { + self.lock.inner.write_unlock(); + } } } #[cfg(all(test, not(target_os = "emscripten")))] mod tests { - use rand::{self, Rng}; + use crate::sync::atomic::{AtomicUsize, Ordering}; use crate::sync::mpsc::channel; - use crate::thread; use crate::sync::{Arc, RwLock, TryLockError}; - use crate::sync::atomic::{AtomicUsize, Ordering}; + use crate::thread; + use rand::{self, Rng}; #[derive(Eq, PartialEq, Debug)] struct NonCopy(i32); @@ -609,7 +604,8 @@ mod tests { let _: Result<(), _> = thread::spawn(move || { let _lock = arc2.write().unwrap(); panic!(); - }).join(); + }) + .join(); assert!(arc.read().is_err()); } @@ -621,7 +617,8 @@ mod tests { let _: Result<(), _> = thread::spawn(move || { let _lock = arc2.write().unwrap(); panic!(); - }).join(); + }) + .join(); assert!(arc.write().is_err()); assert!(arc.is_poisoned()); } @@ -633,7 +630,8 @@ mod tests { let _: Result<(), _> = thread::spawn(move || { let _lock = arc2.read().unwrap(); panic!(); - }).join(); + }) + .join(); let lock = arc.read().unwrap(); assert_eq!(*lock, 1); } @@ -644,7 +642,8 @@ mod tests { let _: Result<(), _> = thread::spawn(move || { let _lock = arc2.read().unwrap(); panic!() - }).join(); + }) + .join(); let lock = arc.write().unwrap(); assert_eq!(*lock, 1); } @@ -703,7 +702,8 @@ mod tests { } let _u = Unwinder { i: arc2 }; panic!(); - }).join(); + }) + .join(); let lock = arc.read().unwrap(); assert_eq!(*lock, 2); } @@ -766,7 +766,8 @@ mod tests { let _ = thread::spawn(move || { let _lock = m2.write().unwrap(); panic!("test panic in inner thread to poison RwLock"); - }).join(); + }) + .join(); assert!(m.is_poisoned()); match Arc::try_unwrap(m).unwrap().into_inner() { @@ -789,7 +790,8 @@ mod tests { let _ = thread::spawn(move || { let _lock = m2.write().unwrap(); panic!("test panic in inner thread to poison RwLock"); - }).join(); + }) + .join(); assert!(m.is_poisoned()); match Arc::try_unwrap(m).unwrap().get_mut() { diff --git a/src/libstd/sys/cloudabi/abi/bitflags.rs b/src/libstd/sys/cloudabi/abi/bitflags.rs index 306936213e..2383277ad7 100644 --- a/src/libstd/sys/cloudabi/abi/bitflags.rs +++ b/src/libstd/sys/cloudabi/abi/bitflags.rs @@ -21,9 +21,6 @@ // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF // SUCH DAMAGE. -// Appease Rust's tidy. -// ignore-license - #[cfg(feature = "bitflags")] use bitflags::bitflags; diff --git a/src/libstd/sys/cloudabi/abi/cloudabi.rs b/src/libstd/sys/cloudabi/abi/cloudabi.rs index 38db4dd516..b02faf1830 100644 --- a/src/libstd/sys/cloudabi/abi/cloudabi.rs +++ b/src/libstd/sys/cloudabi/abi/cloudabi.rs @@ -26,7 +26,6 @@ // Source: https://github.com/NuxiNL/cloudabi // Appease Rust's tidy. -// ignore-license // ignore-tidy-linelength //! **PLEASE NOTE: This entire crate including this @@ -124,24 +123,24 @@ include!("bitflags.rs"); #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub enum advice { - /// The application expects that it will not access the - /// specified data in the near future. - DONTNEED = 1, - /// The application expects to access the specified data - /// once and then not reuse it thereafter. - NOREUSE = 2, - /// The application has no advice to give on its behavior - /// with respect to the specified data. - NORMAL = 3, - /// The application expects to access the specified data - /// in a random order. - RANDOM = 4, - /// The application expects to access the specified data - /// sequentially from lower offsets to higher offsets. - SEQUENTIAL = 5, - /// The application expects to access the specified data - /// in the near future. - WILLNEED = 6, + /// The application expects that it will not access the + /// specified data in the near future. + DONTNEED = 1, + /// The application expects to access the specified data + /// once and then not reuse it thereafter. + NOREUSE = 2, + /// The application has no advice to give on its behavior + /// with respect to the specified data. + NORMAL = 3, + /// The application expects to access the specified data + /// in a random order. + RANDOM = 4, + /// The application expects to access the specified data + /// sequentially from lower offsets to higher offsets. + SEQUENTIAL = 5, + /// The application expects to access the specified data + /// in the near future. + WILLNEED = 6, } /// Enumeration describing the kind of value stored in [`auxv`](struct.auxv.html). @@ -149,69 +148,69 @@ pub enum advice { #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub enum auxtype { - /// Base address of the binary argument data provided to - /// [`proc_exec()`](fn.proc_exec.html). - ARGDATA = 256, - /// Length of the binary argument data provided to - /// [`proc_exec()`](fn.proc_exec.html). - ARGDATALEN = 257, - /// Base address at which the executable is placed in - /// memory. - BASE = 7, - /// Base address of a buffer of random data that may be - /// used for non-cryptographic purposes, for example as a - /// canary for stack smashing protection. - CANARY = 258, - /// Length of a buffer of random data that may be used - /// for non-cryptographic purposes, for example as a - /// canary for stack smashing protection. - CANARYLEN = 259, - /// Number of CPUs that the system this process is running - /// on has. - NCPUS = 260, - /// Terminator of the auxiliary vector. - NULL = 0, - /// Smallest memory object size for which individual - /// memory protection controls can be configured. - PAGESZ = 6, - /// Address of the first ELF program header of the - /// executable. - PHDR = 3, - /// Number of ELF program headers of the executable. - PHNUM = 4, - /// Identifier of the process. - /// - /// This environment does not provide any simple numerical - /// process identifiers, for the reason that these are not - /// useful in distributed contexts. Instead, processes are - /// identified by a UUID. - /// - /// This record should point to sixteen bytes of binary - /// data, containing a version 4 UUID (fully random). - PID = 263, - /// Address of the ELF header of the vDSO. - /// - /// The vDSO is a shared library that is mapped in the - /// address space of the process. It provides entry points - /// for every system call supported by the environment, - /// all having a corresponding symbol that is prefixed - /// with `cloudabi_sys_`. System calls should be invoked - /// through these entry points. - /// - /// The first advantage of letting processes call into a - /// vDSO to perform system calls instead of raising - /// hardware traps is that it allows for easy emulation of - /// executables on top of existing operating systems. The - /// second advantage is that in cases where an operating - /// system provides native support for CloudABI executables, - /// it may still implement partial userspace - /// implementations of these system calls to improve - /// performance (e.g., [`clock_time_get()`](fn.clock_time_get.html)). It also provides - /// a more dynamic way of adding, removing or replacing - /// system calls. - SYSINFO_EHDR = 262, - /// Thread ID of the initial thread of the process. - TID = 261, + /// Base address of the binary argument data provided to + /// [`proc_exec()`](fn.proc_exec.html). + ARGDATA = 256, + /// Length of the binary argument data provided to + /// [`proc_exec()`](fn.proc_exec.html). + ARGDATALEN = 257, + /// Base address at which the executable is placed in + /// memory. + BASE = 7, + /// Base address of a buffer of random data that may be + /// used for non-cryptographic purposes, for example as a + /// canary for stack smashing protection. + CANARY = 258, + /// Length of a buffer of random data that may be used + /// for non-cryptographic purposes, for example as a + /// canary for stack smashing protection. + CANARYLEN = 259, + /// Number of CPUs that the system this process is running + /// on has. + NCPUS = 260, + /// Terminator of the auxiliary vector. + NULL = 0, + /// Smallest memory object size for which individual + /// memory protection controls can be configured. + PAGESZ = 6, + /// Address of the first ELF program header of the + /// executable. + PHDR = 3, + /// Number of ELF program headers of the executable. + PHNUM = 4, + /// Identifier of the process. + /// + /// This environment does not provide any simple numerical + /// process identifiers, for the reason that these are not + /// useful in distributed contexts. Instead, processes are + /// identified by a UUID. + /// + /// This record should point to sixteen bytes of binary + /// data, containing a version 4 UUID (fully random). + PID = 263, + /// Address of the ELF header of the vDSO. + /// + /// The vDSO is a shared library that is mapped in the + /// address space of the process. It provides entry points + /// for every system call supported by the environment, + /// all having a corresponding symbol that is prefixed + /// with `cloudabi_sys_`. System calls should be invoked + /// through these entry points. + /// + /// The first advantage of letting processes call into a + /// vDSO to perform system calls instead of raising + /// hardware traps is that it allows for easy emulation of + /// executables on top of existing operating systems. The + /// second advantage is that in cases where an operating + /// system provides native support for CloudABI executables, + /// it may still implement partial userspace + /// implementations of these system calls to improve + /// performance (e.g., [`clock_time_get()`](fn.clock_time_get.html)). It also provides + /// a more dynamic way of adding, removing or replacing + /// system calls. + SYSINFO_EHDR = 262, + /// Thread ID of the initial thread of the process. + TID = 261, } /// Identifiers for clocks. @@ -219,21 +218,21 @@ pub enum auxtype { #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub enum clockid { - /// The system-wide monotonic clock, which is defined as a - /// clock measuring real time, whose value cannot be - /// adjusted and which cannot have negative clock jumps. - /// - /// The epoch of this clock is undefined. The absolute - /// time value of this clock therefore has no meaning. - MONOTONIC = 1, - /// The CPU-time clock associated with the current - /// process. - PROCESS_CPUTIME_ID = 2, - /// The system-wide clock measuring real time. Time value - /// zero corresponds with 1970-01-01T00:00:00Z. - REALTIME = 3, - /// The CPU-time clock associated with the current thread. - THREAD_CPUTIME_ID = 4, + /// The system-wide monotonic clock, which is defined as a + /// clock measuring real time, whose value cannot be + /// adjusted and which cannot have negative clock jumps. + /// + /// The epoch of this clock is undefined. The absolute + /// time value of this clock therefore has no meaning. + MONOTONIC = 1, + /// The CPU-time clock associated with the current + /// process. + PROCESS_CPUTIME_ID = 2, + /// The system-wide clock measuring real time. Time value + /// zero corresponds with 1970-01-01T00:00:00Z. + REALTIME = 3, + /// The CPU-time clock associated with the current thread. + THREAD_CPUTIME_ID = 4, } /// A userspace condition variable. @@ -270,160 +269,160 @@ pub const DIRCOOKIE_START: dircookie = dircookie(0); #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub enum errno { - /// No error occurred. System call completed successfully. - SUCCESS = 0, - /// Argument list too long. - TOOBIG = 1, - /// Permission denied. - ACCES = 2, - /// Address in use. - ADDRINUSE = 3, - /// Address not available. - ADDRNOTAVAIL = 4, - /// Address family not supported. - AFNOSUPPORT = 5, - /// Resource unavailable, or operation would block. - AGAIN = 6, - /// Connection already in progress. - ALREADY = 7, - /// Bad file descriptor. - BADF = 8, - /// Bad message. - BADMSG = 9, - /// Device or resource busy. - BUSY = 10, - /// Operation canceled. - CANCELED = 11, - /// No child processes. - CHILD = 12, - /// Connection aborted. - CONNABORTED = 13, - /// Connection refused. - CONNREFUSED = 14, - /// Connection reset. - CONNRESET = 15, - /// Resource deadlock would occur. - DEADLK = 16, - /// Destination address required. - DESTADDRREQ = 17, - /// Mathematics argument out of domain of function. - DOM = 18, - /// Reserved. - DQUOT = 19, - /// File exists. - EXIST = 20, - /// Bad address. - FAULT = 21, - /// File too large. - FBIG = 22, - /// Host is unreachable. - HOSTUNREACH = 23, - /// Identifier removed. - IDRM = 24, - /// Illegal byte sequence. - ILSEQ = 25, - /// Operation in progress. - INPROGRESS = 26, - /// Interrupted function. - INTR = 27, - /// Invalid argument. - INVAL = 28, - /// I/O error. - IO = 29, - /// Socket is connected. - ISCONN = 30, - /// Is a directory. - ISDIR = 31, - /// Too many levels of symbolic links. - LOOP = 32, - /// File descriptor value too large. - MFILE = 33, - /// Too many links. - MLINK = 34, - /// Message too large. - MSGSIZE = 35, - /// Reserved. - MULTIHOP = 36, - /// Filename too long. - NAMETOOLONG = 37, - /// Network is down. - NETDOWN = 38, - /// Connection aborted by network. - NETRESET = 39, - /// Network unreachable. - NETUNREACH = 40, - /// Too many files open in system. - NFILE = 41, - /// No buffer space available. - NOBUFS = 42, - /// No such device. - NODEV = 43, - /// No such file or directory. - NOENT = 44, - /// Executable file format error. - NOEXEC = 45, - /// No locks available. - NOLCK = 46, - /// Reserved. - NOLINK = 47, - /// Not enough space. - NOMEM = 48, - /// No message of the desired type. - NOMSG = 49, - /// Protocol not available. - NOPROTOOPT = 50, - /// No space left on device. - NOSPC = 51, - /// Function not supported. - NOSYS = 52, - /// The socket is not connected. - NOTCONN = 53, - /// Not a directory or a symbolic link to a directory. - NOTDIR = 54, - /// Directory not empty. - NOTEMPTY = 55, - /// State not recoverable. - NOTRECOVERABLE = 56, - /// Not a socket. - NOTSOCK = 57, - /// Not supported, or operation not supported on socket. - NOTSUP = 58, - /// Inappropriate I/O control operation. - NOTTY = 59, - /// No such device or address. - NXIO = 60, - /// Value too large to be stored in data type. - OVERFLOW = 61, - /// Previous owner died. - OWNERDEAD = 62, - /// Operation not permitted. - PERM = 63, - /// Broken pipe. - PIPE = 64, - /// Protocol error. - PROTO = 65, - /// Protocol not supported. - PROTONOSUPPORT = 66, - /// Protocol wrong type for socket. - PROTOTYPE = 67, - /// Result too large. - RANGE = 68, - /// Read-only file system. - ROFS = 69, - /// Invalid seek. - SPIPE = 70, - /// No such process. - SRCH = 71, - /// Reserved. - STALE = 72, - /// Connection timed out. - TIMEDOUT = 73, - /// Text file busy. - TXTBSY = 74, - /// Cross-device link. - XDEV = 75, - /// Extension: Capabilities insufficient. - NOTCAPABLE = 76, + /// No error occurred. System call completed successfully. + SUCCESS = 0, + /// Argument list too long. + TOOBIG = 1, + /// Permission denied. + ACCES = 2, + /// Address in use. + ADDRINUSE = 3, + /// Address not available. + ADDRNOTAVAIL = 4, + /// Address family not supported. + AFNOSUPPORT = 5, + /// Resource unavailable, or operation would block. + AGAIN = 6, + /// Connection already in progress. + ALREADY = 7, + /// Bad file descriptor. + BADF = 8, + /// Bad message. + BADMSG = 9, + /// Device or resource busy. + BUSY = 10, + /// Operation canceled. + CANCELED = 11, + /// No child processes. + CHILD = 12, + /// Connection aborted. + CONNABORTED = 13, + /// Connection refused. + CONNREFUSED = 14, + /// Connection reset. + CONNRESET = 15, + /// Resource deadlock would occur. + DEADLK = 16, + /// Destination address required. + DESTADDRREQ = 17, + /// Mathematics argument out of domain of function. + DOM = 18, + /// Reserved. + DQUOT = 19, + /// File exists. + EXIST = 20, + /// Bad address. + FAULT = 21, + /// File too large. + FBIG = 22, + /// Host is unreachable. + HOSTUNREACH = 23, + /// Identifier removed. + IDRM = 24, + /// Illegal byte sequence. + ILSEQ = 25, + /// Operation in progress. + INPROGRESS = 26, + /// Interrupted function. + INTR = 27, + /// Invalid argument. + INVAL = 28, + /// I/O error. + IO = 29, + /// Socket is connected. + ISCONN = 30, + /// Is a directory. + ISDIR = 31, + /// Too many levels of symbolic links. + LOOP = 32, + /// File descriptor value too large. + MFILE = 33, + /// Too many links. + MLINK = 34, + /// Message too large. + MSGSIZE = 35, + /// Reserved. + MULTIHOP = 36, + /// Filename too long. + NAMETOOLONG = 37, + /// Network is down. + NETDOWN = 38, + /// Connection aborted by network. + NETRESET = 39, + /// Network unreachable. + NETUNREACH = 40, + /// Too many files open in system. + NFILE = 41, + /// No buffer space available. + NOBUFS = 42, + /// No such device. + NODEV = 43, + /// No such file or directory. + NOENT = 44, + /// Executable file format error. + NOEXEC = 45, + /// No locks available. + NOLCK = 46, + /// Reserved. + NOLINK = 47, + /// Not enough space. + NOMEM = 48, + /// No message of the desired type. + NOMSG = 49, + /// Protocol not available. + NOPROTOOPT = 50, + /// No space left on device. + NOSPC = 51, + /// Function not supported. + NOSYS = 52, + /// The socket is not connected. + NOTCONN = 53, + /// Not a directory or a symbolic link to a directory. + NOTDIR = 54, + /// Directory not empty. + NOTEMPTY = 55, + /// State not recoverable. + NOTRECOVERABLE = 56, + /// Not a socket. + NOTSOCK = 57, + /// Not supported, or operation not supported on socket. + NOTSUP = 58, + /// Inappropriate I/O control operation. + NOTTY = 59, + /// No such device or address. + NXIO = 60, + /// Value too large to be stored in data type. + OVERFLOW = 61, + /// Previous owner died. + OWNERDEAD = 62, + /// Operation not permitted. + PERM = 63, + /// Broken pipe. + PIPE = 64, + /// Protocol error. + PROTO = 65, + /// Protocol not supported. + PROTONOSUPPORT = 66, + /// Protocol wrong type for socket. + PROTOTYPE = 67, + /// Result too large. + RANGE = 68, + /// Read-only file system. + ROFS = 69, + /// Invalid seek. + SPIPE = 70, + /// No such process. + SRCH = 71, + /// Reserved. + STALE = 72, + /// Connection timed out. + TIMEDOUT = 73, + /// Text file busy. + TXTBSY = 74, + /// Cross-device link. + XDEV = 75, + /// Extension: Capabilities insufficient. + NOTCAPABLE = 76, } bitflags! { @@ -441,30 +440,30 @@ bitflags! { #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub enum eventtype { - /// The time value of clock [`subscription.union.clock.clock_id`](struct.subscription_clock.html#structfield.clock_id) - /// has reached timestamp [`subscription.union.clock.timeout`](struct.subscription_clock.html#structfield.timeout). - CLOCK = 1, - /// Condition variable [`subscription.union.condvar.condvar`](struct.subscription_condvar.html#structfield.condvar) has - /// been woken up and [`subscription.union.condvar.lock`](struct.subscription_condvar.html#structfield.lock) has been - /// acquired for writing. - CONDVAR = 2, - /// File descriptor [`subscription.union.fd_readwrite.fd`](struct.subscription_fd_readwrite.html#structfield.fd) has - /// data available for reading. This event always triggers - /// for regular files. - FD_READ = 3, - /// File descriptor [`subscription.union.fd_readwrite.fd`](struct.subscription_fd_readwrite.html#structfield.fd) has - /// capacity available for writing. This event always - /// triggers for regular files. - FD_WRITE = 4, - /// Lock [`subscription.union.lock.lock`](struct.subscription_lock.html#structfield.lock) has been acquired for - /// reading. - LOCK_RDLOCK = 5, - /// Lock [`subscription.union.lock.lock`](struct.subscription_lock.html#structfield.lock) has been acquired for - /// writing. - LOCK_WRLOCK = 6, - /// The process associated with process descriptor - /// [`subscription.union.proc_terminate.fd`](struct.subscription_proc_terminate.html#structfield.fd) has terminated. - PROC_TERMINATE = 7, + /// The time value of clock [`subscription.union.clock.clock_id`](struct.subscription_clock.html#structfield.clock_id) + /// has reached timestamp [`subscription.union.clock.timeout`](struct.subscription_clock.html#structfield.timeout). + CLOCK = 1, + /// Condition variable [`subscription.union.condvar.condvar`](struct.subscription_condvar.html#structfield.condvar) has + /// been woken up and [`subscription.union.condvar.lock`](struct.subscription_condvar.html#structfield.lock) has been + /// acquired for writing. + CONDVAR = 2, + /// File descriptor [`subscription.union.fd_readwrite.fd`](struct.subscription_fd_readwrite.html#structfield.fd) has + /// data available for reading. This event always triggers + /// for regular files. + FD_READ = 3, + /// File descriptor [`subscription.union.fd_readwrite.fd`](struct.subscription_fd_readwrite.html#structfield.fd) has + /// capacity available for writing. This event always + /// triggers for regular files. + FD_WRITE = 4, + /// Lock [`subscription.union.lock.lock`](struct.subscription_lock.html#structfield.lock) has been acquired for + /// reading. + LOCK_RDLOCK = 5, + /// Lock [`subscription.union.lock.lock`](struct.subscription_lock.html#structfield.lock) has been acquired for + /// writing. + LOCK_WRLOCK = 6, + /// The process associated with process descriptor + /// [`subscription.union.proc_terminate.fd`](struct.subscription_proc_terminate.html#structfield.fd) has terminated. + PROC_TERMINATE = 7, } /// Exit code generated by a process when exiting. @@ -483,7 +482,7 @@ pub struct fd(pub u32); pub const PROCESS_CHILD: fd = fd(0xffffffff); /// Passed to [`mem_map()`](fn.mem_map.html) when creating a mapping to /// anonymous memory. -pub const MAP_ANON_FD : fd = fd(0xffffffff); +pub const MAP_ANON_FD: fd = fd(0xffffffff); bitflags! { /// File descriptor flags. @@ -533,33 +532,33 @@ pub type filesize = u64; #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub enum filetype { - /// The type of the file descriptor or file is unknown or - /// is different from any of the other types specified. - UNKNOWN = 0, - /// The file descriptor or file refers to a block device - /// inode. - BLOCK_DEVICE = 16, - /// The file descriptor or file refers to a character - /// device inode. - CHARACTER_DEVICE = 17, - /// The file descriptor or file refers to a directory - /// inode. - DIRECTORY = 32, - /// The file descriptor refers to a process handle. - PROCESS = 80, - /// The file descriptor or file refers to a regular file - /// inode. - REGULAR_FILE = 96, - /// The file descriptor refers to a shared memory object. - SHARED_MEMORY = 112, - /// The file descriptor or file refers to a datagram - /// socket. - SOCKET_DGRAM = 128, - /// The file descriptor or file refers to a byte-stream - /// socket. - SOCKET_STREAM = 130, - /// The file refers to a symbolic link inode. - SYMBOLIC_LINK = 144, + /// The type of the file descriptor or file is unknown or + /// is different from any of the other types specified. + UNKNOWN = 0, + /// The file descriptor or file refers to a block device + /// inode. + BLOCK_DEVICE = 16, + /// The file descriptor or file refers to a character + /// device inode. + CHARACTER_DEVICE = 17, + /// The file descriptor or file refers to a directory + /// inode. + DIRECTORY = 32, + /// The file descriptor refers to a process handle. + PROCESS = 80, + /// The file descriptor or file refers to a regular file + /// inode. + REGULAR_FILE = 96, + /// The file descriptor refers to a shared memory object. + SHARED_MEMORY = 112, + /// The file descriptor or file refers to a datagram + /// socket. + SOCKET_DGRAM = 128, + /// The file descriptor or file refers to a byte-stream + /// socket. + SOCKET_STREAM = 130, + /// The file refers to a symbolic link inode. + SYMBOLIC_LINK = 144, } bitflags! { @@ -599,13 +598,13 @@ pub type linkcount = u32; pub struct lock(pub u32); /// Value indicating that the lock is in its initial /// unlocked state. -pub const LOCK_UNLOCKED : lock = lock(0x00000000); +pub const LOCK_UNLOCKED: lock = lock(0x00000000); /// Bitmask indicating that the lock is write-locked. If /// set, the lower 30 bits of the lock contain the /// identifier of the thread that owns the write lock. /// Otherwise, the lower 30 bits of the lock contain the /// number of acquired read locks. -pub const LOCK_WRLOCKED : lock = lock(0x40000000); +pub const LOCK_WRLOCKED: lock = lock(0x40000000); /// Bitmask indicating that the lock is either read locked /// or write locked, and that one or more threads have /// their execution suspended, waiting to acquire the @@ -623,7 +622,7 @@ pub const LOCK_KERNEL_MANAGED: lock = lock(0x80000000); /// Value indicating that the lock is in an incorrect /// state. A lock cannot be in its initial unlocked state, /// while also managed by the kernel. -pub const LOCK_BOGUS : lock = lock(0x80000000); +pub const LOCK_BOGUS: lock = lock(0x80000000); bitflags! { /// Flags determining the method of how paths are resolved. @@ -850,10 +849,10 @@ bitflags! { #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub enum scope { - /// The object is stored in private memory. - PRIVATE = 4, - /// The object is stored in shared memory. - SHARED = 8, + /// The object is stored in private memory. + PRIVATE = 4, + /// The object is stored in shared memory. + SHARED = 8, } bitflags! { @@ -881,110 +880,110 @@ bitflags! { #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub enum signal { - /// Process abort signal. - /// - /// Action: Terminates the process. - ABRT = 1, - /// Alarm clock. - /// - /// Action: Terminates the process. - ALRM = 2, - /// Access to an undefined portion of a memory object. - /// - /// Action: Terminates the process. - BUS = 3, - /// Child process terminated, stopped, or continued. - /// - /// Action: Ignored. - CHLD = 4, - /// Continue executing, if stopped. - /// - /// Action: Continues executing, if stopped. - CONT = 5, - /// Erroneous arithmetic operation. - /// - /// Action: Terminates the process. - FPE = 6, - /// Hangup. - /// - /// Action: Terminates the process. - HUP = 7, - /// Illegal instruction. - /// - /// Action: Terminates the process. - ILL = 8, - /// Terminate interrupt signal. - /// - /// Action: Terminates the process. - INT = 9, - /// Kill. - /// - /// Action: Terminates the process. - KILL = 10, - /// Write on a pipe with no one to read it. - /// - /// Action: Ignored. - PIPE = 11, - /// Terminal quit signal. - /// - /// Action: Terminates the process. - QUIT = 12, - /// Invalid memory reference. - /// - /// Action: Terminates the process. - SEGV = 13, - /// Stop executing. - /// - /// Action: Stops executing. - STOP = 14, - /// Bad system call. - /// - /// Action: Terminates the process. - SYS = 15, - /// Termination signal. - /// - /// Action: Terminates the process. - TERM = 16, - /// Trace/breakpoint trap. - /// - /// Action: Terminates the process. - TRAP = 17, - /// Terminal stop signal. - /// - /// Action: Stops executing. - TSTP = 18, - /// Background process attempting read. - /// - /// Action: Stops executing. - TTIN = 19, - /// Background process attempting write. - /// - /// Action: Stops executing. - TTOU = 20, - /// High bandwidth data is available at a socket. - /// - /// Action: Ignored. - URG = 21, - /// User-defined signal 1. - /// - /// Action: Terminates the process. - USR1 = 22, - /// User-defined signal 2. - /// - /// Action: Terminates the process. - USR2 = 23, - /// Virtual timer expired. - /// - /// Action: Terminates the process. - VTALRM = 24, - /// CPU time limit exceeded. - /// - /// Action: Terminates the process. - XCPU = 25, - /// File size limit exceeded. - /// - /// Action: Terminates the process. - XFSZ = 26, + /// Process abort signal. + /// + /// Action: Terminates the process. + ABRT = 1, + /// Alarm clock. + /// + /// Action: Terminates the process. + ALRM = 2, + /// Access to an undefined portion of a memory object. + /// + /// Action: Terminates the process. + BUS = 3, + /// Child process terminated, stopped, or continued. + /// + /// Action: Ignored. + CHLD = 4, + /// Continue executing, if stopped. + /// + /// Action: Continues executing, if stopped. + CONT = 5, + /// Erroneous arithmetic operation. + /// + /// Action: Terminates the process. + FPE = 6, + /// Hangup. + /// + /// Action: Terminates the process. + HUP = 7, + /// Illegal instruction. + /// + /// Action: Terminates the process. + ILL = 8, + /// Terminate interrupt signal. + /// + /// Action: Terminates the process. + INT = 9, + /// Kill. + /// + /// Action: Terminates the process. + KILL = 10, + /// Write on a pipe with no one to read it. + /// + /// Action: Ignored. + PIPE = 11, + /// Terminal quit signal. + /// + /// Action: Terminates the process. + QUIT = 12, + /// Invalid memory reference. + /// + /// Action: Terminates the process. + SEGV = 13, + /// Stop executing. + /// + /// Action: Stops executing. + STOP = 14, + /// Bad system call. + /// + /// Action: Terminates the process. + SYS = 15, + /// Termination signal. + /// + /// Action: Terminates the process. + TERM = 16, + /// Trace/breakpoint trap. + /// + /// Action: Terminates the process. + TRAP = 17, + /// Terminal stop signal. + /// + /// Action: Stops executing. + TSTP = 18, + /// Background process attempting read. + /// + /// Action: Stops executing. + TTIN = 19, + /// Background process attempting write. + /// + /// Action: Stops executing. + TTOU = 20, + /// High bandwidth data is available at a socket. + /// + /// Action: Ignored. + URG = 21, + /// User-defined signal 1. + /// + /// Action: Terminates the process. + USR1 = 22, + /// User-defined signal 2. + /// + /// Action: Terminates the process. + USR2 = 23, + /// Virtual timer expired. + /// + /// Action: Terminates the process. + VTALRM = 24, + /// CPU time limit exceeded. + /// + /// Action: Terminates the process. + XCPU = 25, + /// File size limit exceeded. + /// + /// Action: Terminates the process. + XFSZ = 26, } bitflags! { @@ -1052,12 +1051,12 @@ pub type userdata = u64; #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] #[non_exhaustive] pub enum whence { - /// Seek relative to current position. - CUR = 1, - /// Seek relative to end-of-file. - END = 2, - /// Seek relative to start-of-file. - SET = 3, + /// Seek relative to current position. + CUR = 1, + /// Seek relative to end-of-file. + END = 2, + /// Seek relative to start-of-file. + SET = 3, } /// Auxiliary vector entry. @@ -1073,631 +1072,629 @@ pub enum whence { #[repr(C)] #[derive(Copy, Clone)] pub struct auxv { - /// The type of the auxiliary vector entry. - pub a_type: auxtype, - pub union: auxv_union + /// The type of the auxiliary vector entry. + pub a_type: auxtype, + pub union: auxv_union, } /// A union inside `auxv`. #[repr(C)] #[derive(Copy, Clone)] pub union auxv_union { - /// Used when `a_type` is [`ARGDATALEN`](enum.auxtype.html#variant.ARGDATALEN), [`CANARYLEN`](enum.auxtype.html#variant.CANARYLEN), [`NCPUS`](enum.auxtype.html#variant.NCPUS), [`PAGESZ`](enum.auxtype.html#variant.PAGESZ), [`PHNUM`](enum.auxtype.html#variant.PHNUM), or [`TID`](enum.auxtype.html#variant.TID). -/// A numerical value. - pub a_val: usize, - /// Used when `a_type` is [`ARGDATA`](enum.auxtype.html#variant.ARGDATA), [`BASE`](enum.auxtype.html#variant.BASE), [`CANARY`](enum.auxtype.html#variant.CANARY), [`PHDR`](enum.auxtype.html#variant.PHDR), [`PID`](enum.auxtype.html#variant.PID), or [`SYSINFO_EHDR`](enum.auxtype.html#variant.SYSINFO_EHDR). -/// A pointer value. - pub a_ptr: *mut (), + /// Used when `a_type` is [`ARGDATALEN`](enum.auxtype.html#variant.ARGDATALEN), [`CANARYLEN`](enum.auxtype.html#variant.CANARYLEN), [`NCPUS`](enum.auxtype.html#variant.NCPUS), [`PAGESZ`](enum.auxtype.html#variant.PAGESZ), [`PHNUM`](enum.auxtype.html#variant.PHNUM), or [`TID`](enum.auxtype.html#variant.TID). + /// A numerical value. + pub a_val: usize, + /// Used when `a_type` is [`ARGDATA`](enum.auxtype.html#variant.ARGDATA), [`BASE`](enum.auxtype.html#variant.BASE), [`CANARY`](enum.auxtype.html#variant.CANARY), [`PHDR`](enum.auxtype.html#variant.PHDR), [`PID`](enum.auxtype.html#variant.PID), or [`SYSINFO_EHDR`](enum.auxtype.html#variant.SYSINFO_EHDR). + /// A pointer value. + pub a_ptr: *mut (), } #[test] #[cfg(target_pointer_width = "32")] fn auxv_layout_test_32() { - assert_eq!(core::mem::size_of::<auxv>(), 8); - assert_eq!(core::mem::align_of::<auxv>(), 4); - unsafe { - let obj: auxv = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.a_type as *const _ as usize - base, 0); - assert_eq!(&obj.union.a_val as *const _ as usize - base, 4); - assert_eq!(&obj.union.a_ptr as *const _ as usize - base, 4); - } + assert_eq!(core::mem::size_of::<auxv>(), 8); + assert_eq!(core::mem::align_of::<auxv>(), 4); + unsafe { + let obj: auxv = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.a_type as *const _ as usize - base, 0); + assert_eq!(&obj.union.a_val as *const _ as usize - base, 4); + assert_eq!(&obj.union.a_ptr as *const _ as usize - base, 4); + } } #[test] #[cfg(target_pointer_width = "64")] fn auxv_layout_test_64() { - assert_eq!(core::mem::size_of::<auxv>(), 16); - assert_eq!(core::mem::align_of::<auxv>(), 8); - unsafe { - let obj: auxv = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.a_type as *const _ as usize - base, 0); - assert_eq!(&obj.union.a_val as *const _ as usize - base, 8); - assert_eq!(&obj.union.a_ptr as *const _ as usize - base, 8); - } + assert_eq!(core::mem::size_of::<auxv>(), 16); + assert_eq!(core::mem::align_of::<auxv>(), 8); + unsafe { + let obj: auxv = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.a_type as *const _ as usize - base, 0); + assert_eq!(&obj.union.a_val as *const _ as usize - base, 8); + assert_eq!(&obj.union.a_ptr as *const _ as usize - base, 8); + } } /// A region of memory for scatter/gather writes. #[repr(C)] #[derive(Copy, Clone)] pub struct ciovec { - /// The address and length of the buffer to be written. - pub buf: (*const (), usize), + /// The address and length of the buffer to be written. + pub buf: (*const (), usize), } #[test] #[cfg(target_pointer_width = "32")] fn ciovec_layout_test_32() { - assert_eq!(core::mem::size_of::<ciovec>(), 8); - assert_eq!(core::mem::align_of::<ciovec>(), 4); - unsafe { - let obj: ciovec = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.buf.0 as *const _ as usize - base, 0); - assert_eq!(&obj.buf.1 as *const _ as usize - base, 4); - } + assert_eq!(core::mem::size_of::<ciovec>(), 8); + assert_eq!(core::mem::align_of::<ciovec>(), 4); + unsafe { + let obj: ciovec = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.buf.0 as *const _ as usize - base, 0); + assert_eq!(&obj.buf.1 as *const _ as usize - base, 4); + } } #[test] #[cfg(target_pointer_width = "64")] fn ciovec_layout_test_64() { - assert_eq!(core::mem::size_of::<ciovec>(), 16); - assert_eq!(core::mem::align_of::<ciovec>(), 8); - unsafe { - let obj: ciovec = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.buf.0 as *const _ as usize - base, 0); - assert_eq!(&obj.buf.1 as *const _ as usize - base, 8); - } + assert_eq!(core::mem::size_of::<ciovec>(), 16); + assert_eq!(core::mem::align_of::<ciovec>(), 8); + unsafe { + let obj: ciovec = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.buf.0 as *const _ as usize - base, 0); + assert_eq!(&obj.buf.1 as *const _ as usize - base, 8); + } } /// A directory entry. #[repr(C)] #[derive(Copy, Clone)] pub struct dirent { - /// The offset of the next directory entry stored in this - /// directory. - pub d_next: dircookie, - /// The serial number of the file referred to by this - /// directory entry. - pub d_ino: inode, - /// The length of the name of the directory entry. - pub d_namlen: u32, - /// The type of the file referred to by this directory - /// entry. - pub d_type: filetype, + /// The offset of the next directory entry stored in this + /// directory. + pub d_next: dircookie, + /// The serial number of the file referred to by this + /// directory entry. + pub d_ino: inode, + /// The length of the name of the directory entry. + pub d_namlen: u32, + /// The type of the file referred to by this directory + /// entry. + pub d_type: filetype, } #[test] fn dirent_layout_test() { - assert_eq!(core::mem::size_of::<dirent>(), 24); - assert_eq!(core::mem::align_of::<dirent>(), 8); - unsafe { - let obj: dirent = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.d_next as *const _ as usize - base, 0); - assert_eq!(&obj.d_ino as *const _ as usize - base, 8); - assert_eq!(&obj.d_namlen as *const _ as usize - base, 16); - assert_eq!(&obj.d_type as *const _ as usize - base, 20); - } + assert_eq!(core::mem::size_of::<dirent>(), 24); + assert_eq!(core::mem::align_of::<dirent>(), 8); + unsafe { + let obj: dirent = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.d_next as *const _ as usize - base, 0); + assert_eq!(&obj.d_ino as *const _ as usize - base, 8); + assert_eq!(&obj.d_namlen as *const _ as usize - base, 16); + assert_eq!(&obj.d_type as *const _ as usize - base, 20); + } } /// An event that occurred. #[repr(C)] #[derive(Copy, Clone)] pub struct event { - /// User-provided value that got attached to - /// [`subscription.userdata`](struct.subscription.html#structfield.userdata). - pub userdata: userdata, - /// If non-zero, an error that occurred while processing - /// the subscription request. - pub error: errno, - /// The type of the event that occurred. - pub type_: eventtype, - pub union: event_union + /// User-provided value that got attached to + /// [`subscription.userdata`](struct.subscription.html#structfield.userdata). + pub userdata: userdata, + /// If non-zero, an error that occurred while processing + /// the subscription request. + pub error: errno, + /// The type of the event that occurred. + pub type_: eventtype, + pub union: event_union, } /// A union inside `event`. #[repr(C)] #[derive(Copy, Clone)] pub union event_union { - /// Used when `type_` is [`FD_READ`](enum.eventtype.html#variant.FD_READ) or [`FD_WRITE`](enum.eventtype.html#variant.FD_WRITE). - pub fd_readwrite: event_fd_readwrite, - /// Used when `type_` is [`PROC_TERMINATE`](enum.eventtype.html#variant.PROC_TERMINATE). - pub proc_terminate: event_proc_terminate, + /// Used when `type_` is [`FD_READ`](enum.eventtype.html#variant.FD_READ) or [`FD_WRITE`](enum.eventtype.html#variant.FD_WRITE). + pub fd_readwrite: event_fd_readwrite, + /// Used when `type_` is [`PROC_TERMINATE`](enum.eventtype.html#variant.PROC_TERMINATE). + pub proc_terminate: event_proc_terminate, } #[repr(C)] #[derive(Copy, Clone)] pub struct event_fd_readwrite { - /// The number of bytes available - /// for reading or writing. - pub nbytes: filesize, - /// Obsolete. - pub unused: [u8; 4], - /// The state of the file - /// descriptor. - pub flags: eventrwflags, + /// The number of bytes available + /// for reading or writing. + pub nbytes: filesize, + /// Obsolete. + pub unused: [u8; 4], + /// The state of the file + /// descriptor. + pub flags: eventrwflags, } #[repr(C)] #[derive(Copy, Clone)] pub struct event_proc_terminate { - /// Obsolete. - pub unused: [u8; 4], - /// If zero, the process has - /// exited. - /// Otherwise, the signal - /// condition causing it to - /// terminated. - pub signal: signal, - /// If exited, the exit code of - /// the process. - pub exitcode: exitcode, + /// Obsolete. + pub unused: [u8; 4], + /// If zero, the process has + /// exited. + /// Otherwise, the signal + /// condition causing it to + /// terminated. + pub signal: signal, + /// If exited, the exit code of + /// the process. + pub exitcode: exitcode, } #[test] fn event_layout_test() { - assert_eq!(core::mem::size_of::<event>(), 32); - assert_eq!(core::mem::align_of::<event>(), 8); - unsafe { - let obj: event = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.userdata as *const _ as usize - base, 0); - assert_eq!(&obj.error as *const _ as usize - base, 8); - assert_eq!(&obj.type_ as *const _ as usize - base, 10); - assert_eq!(&obj.union.fd_readwrite.nbytes as *const _ as usize - base, 16); - assert_eq!(&obj.union.fd_readwrite.unused as *const _ as usize - base, 24); - assert_eq!(&obj.union.fd_readwrite.flags as *const _ as usize - base, 28); - assert_eq!(&obj.union.proc_terminate.unused as *const _ as usize - base, 16); - assert_eq!(&obj.union.proc_terminate.signal as *const _ as usize - base, 20); - assert_eq!(&obj.union.proc_terminate.exitcode as *const _ as usize - base, 24); - } + assert_eq!(core::mem::size_of::<event>(), 32); + assert_eq!(core::mem::align_of::<event>(), 8); + unsafe { + let obj: event = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.userdata as *const _ as usize - base, 0); + assert_eq!(&obj.error as *const _ as usize - base, 8); + assert_eq!(&obj.type_ as *const _ as usize - base, 10); + assert_eq!(&obj.union.fd_readwrite.nbytes as *const _ as usize - base, 16); + assert_eq!(&obj.union.fd_readwrite.unused as *const _ as usize - base, 24); + assert_eq!(&obj.union.fd_readwrite.flags as *const _ as usize - base, 28); + assert_eq!(&obj.union.proc_terminate.unused as *const _ as usize - base, 16); + assert_eq!(&obj.union.proc_terminate.signal as *const _ as usize - base, 20); + assert_eq!(&obj.union.proc_terminate.exitcode as *const _ as usize - base, 24); + } } /// File descriptor attributes. #[repr(C)] #[derive(Copy, Clone)] pub struct fdstat { - /// File type. - pub fs_filetype: filetype, - /// File descriptor flags. - pub fs_flags: fdflags, - /// Rights that apply to this file descriptor. - pub fs_rights_base: rights, - /// Maximum set of rights that can be installed on new - /// file descriptors that are created through this file - /// descriptor, e.g., through [`file_open()`](fn.file_open.html). - pub fs_rights_inheriting: rights, + /// File type. + pub fs_filetype: filetype, + /// File descriptor flags. + pub fs_flags: fdflags, + /// Rights that apply to this file descriptor. + pub fs_rights_base: rights, + /// Maximum set of rights that can be installed on new + /// file descriptors that are created through this file + /// descriptor, e.g., through [`file_open()`](fn.file_open.html). + pub fs_rights_inheriting: rights, } #[test] fn fdstat_layout_test() { - assert_eq!(core::mem::size_of::<fdstat>(), 24); - assert_eq!(core::mem::align_of::<fdstat>(), 8); - unsafe { - let obj: fdstat = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.fs_filetype as *const _ as usize - base, 0); - assert_eq!(&obj.fs_flags as *const _ as usize - base, 2); - assert_eq!(&obj.fs_rights_base as *const _ as usize - base, 8); - assert_eq!(&obj.fs_rights_inheriting as *const _ as usize - base, 16); - } + assert_eq!(core::mem::size_of::<fdstat>(), 24); + assert_eq!(core::mem::align_of::<fdstat>(), 8); + unsafe { + let obj: fdstat = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.fs_filetype as *const _ as usize - base, 0); + assert_eq!(&obj.fs_flags as *const _ as usize - base, 2); + assert_eq!(&obj.fs_rights_base as *const _ as usize - base, 8); + assert_eq!(&obj.fs_rights_inheriting as *const _ as usize - base, 16); + } } /// File attributes. #[repr(C)] #[derive(Copy, Clone)] pub struct filestat { - /// Device ID of device containing the file. - pub st_dev: device, - /// File serial number. - pub st_ino: inode, - /// File type. - pub st_filetype: filetype, - /// Number of hard links to the file. - pub st_nlink: linkcount, - /// For regular files, the file size in bytes. For - /// symbolic links, the length in bytes of the pathname - /// contained in the symbolic link. - pub st_size: filesize, - /// Last data access timestamp. - pub st_atim: timestamp, - /// Last data modification timestamp. - pub st_mtim: timestamp, - /// Last file status change timestamp. - pub st_ctim: timestamp, + /// Device ID of device containing the file. + pub st_dev: device, + /// File serial number. + pub st_ino: inode, + /// File type. + pub st_filetype: filetype, + /// Number of hard links to the file. + pub st_nlink: linkcount, + /// For regular files, the file size in bytes. For + /// symbolic links, the length in bytes of the pathname + /// contained in the symbolic link. + pub st_size: filesize, + /// Last data access timestamp. + pub st_atim: timestamp, + /// Last data modification timestamp. + pub st_mtim: timestamp, + /// Last file status change timestamp. + pub st_ctim: timestamp, } #[test] fn filestat_layout_test() { - assert_eq!(core::mem::size_of::<filestat>(), 56); - assert_eq!(core::mem::align_of::<filestat>(), 8); - unsafe { - let obj: filestat = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.st_dev as *const _ as usize - base, 0); - assert_eq!(&obj.st_ino as *const _ as usize - base, 8); - assert_eq!(&obj.st_filetype as *const _ as usize - base, 16); - assert_eq!(&obj.st_nlink as *const _ as usize - base, 20); - assert_eq!(&obj.st_size as *const _ as usize - base, 24); - assert_eq!(&obj.st_atim as *const _ as usize - base, 32); - assert_eq!(&obj.st_mtim as *const _ as usize - base, 40); - assert_eq!(&obj.st_ctim as *const _ as usize - base, 48); - } + assert_eq!(core::mem::size_of::<filestat>(), 56); + assert_eq!(core::mem::align_of::<filestat>(), 8); + unsafe { + let obj: filestat = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.st_dev as *const _ as usize - base, 0); + assert_eq!(&obj.st_ino as *const _ as usize - base, 8); + assert_eq!(&obj.st_filetype as *const _ as usize - base, 16); + assert_eq!(&obj.st_nlink as *const _ as usize - base, 20); + assert_eq!(&obj.st_size as *const _ as usize - base, 24); + assert_eq!(&obj.st_atim as *const _ as usize - base, 32); + assert_eq!(&obj.st_mtim as *const _ as usize - base, 40); + assert_eq!(&obj.st_ctim as *const _ as usize - base, 48); + } } /// A region of memory for scatter/gather reads. #[repr(C)] #[derive(Copy, Clone)] pub struct iovec { - /// The address and length of the buffer to be filled. - pub buf: (*mut (), usize), + /// The address and length of the buffer to be filled. + pub buf: (*mut (), usize), } #[test] #[cfg(target_pointer_width = "32")] fn iovec_layout_test_32() { - assert_eq!(core::mem::size_of::<iovec>(), 8); - assert_eq!(core::mem::align_of::<iovec>(), 4); - unsafe { - let obj: iovec = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.buf.0 as *const _ as usize - base, 0); - assert_eq!(&obj.buf.1 as *const _ as usize - base, 4); - } + assert_eq!(core::mem::size_of::<iovec>(), 8); + assert_eq!(core::mem::align_of::<iovec>(), 4); + unsafe { + let obj: iovec = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.buf.0 as *const _ as usize - base, 0); + assert_eq!(&obj.buf.1 as *const _ as usize - base, 4); + } } #[test] #[cfg(target_pointer_width = "64")] fn iovec_layout_test_64() { - assert_eq!(core::mem::size_of::<iovec>(), 16); - assert_eq!(core::mem::align_of::<iovec>(), 8); - unsafe { - let obj: iovec = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.buf.0 as *const _ as usize - base, 0); - assert_eq!(&obj.buf.1 as *const _ as usize - base, 8); - } + assert_eq!(core::mem::size_of::<iovec>(), 16); + assert_eq!(core::mem::align_of::<iovec>(), 8); + unsafe { + let obj: iovec = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.buf.0 as *const _ as usize - base, 0); + assert_eq!(&obj.buf.1 as *const _ as usize - base, 8); + } } /// Path lookup properties. #[repr(C)] #[derive(Copy, Clone)] pub struct lookup { - /// The working directory at which the resolution of the - /// path starts. - pub fd: fd, - /// Flags determining the method of how the path is - /// resolved. - pub flags: lookupflags, + /// The working directory at which the resolution of the + /// path starts. + pub fd: fd, + /// Flags determining the method of how the path is + /// resolved. + pub flags: lookupflags, } #[test] fn lookup_layout_test() { - assert_eq!(core::mem::size_of::<lookup>(), 8); - assert_eq!(core::mem::align_of::<lookup>(), 4); - unsafe { - let obj: lookup = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.fd as *const _ as usize - base, 0); - assert_eq!(&obj.flags as *const _ as usize - base, 4); - } + assert_eq!(core::mem::size_of::<lookup>(), 8); + assert_eq!(core::mem::align_of::<lookup>(), 4); + unsafe { + let obj: lookup = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.fd as *const _ as usize - base, 0); + assert_eq!(&obj.flags as *const _ as usize - base, 4); + } } /// Entry point for a process (`_start`). /// /// **auxv**: /// The auxiliary vector. See [`auxv`](struct.auxv.html). -pub type processentry = unsafe extern "C" fn( - auxv: *const auxv, -) -> (); +pub type processentry = unsafe extern "C" fn(auxv: *const auxv) -> (); /// Arguments of [`sock_recv()`](fn.sock_recv.html). #[repr(C)] #[derive(Copy, Clone)] pub struct recv_in { - /// List of scatter/gather vectors where message data - /// should be stored. - pub ri_data: (*const iovec, usize), - /// Buffer where numbers of incoming file descriptors - /// should be stored. - pub ri_fds: (*mut fd, usize), - /// Message flags. - pub ri_flags: riflags, + /// List of scatter/gather vectors where message data + /// should be stored. + pub ri_data: (*const iovec, usize), + /// Buffer where numbers of incoming file descriptors + /// should be stored. + pub ri_fds: (*mut fd, usize), + /// Message flags. + pub ri_flags: riflags, } #[test] #[cfg(target_pointer_width = "32")] fn recv_in_layout_test_32() { - assert_eq!(core::mem::size_of::<recv_in>(), 20); - assert_eq!(core::mem::align_of::<recv_in>(), 4); - unsafe { - let obj: recv_in = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.ri_data.0 as *const _ as usize - base, 0); - assert_eq!(&obj.ri_data.1 as *const _ as usize - base, 4); - assert_eq!(&obj.ri_fds.0 as *const _ as usize - base, 8); - assert_eq!(&obj.ri_fds.1 as *const _ as usize - base, 12); - assert_eq!(&obj.ri_flags as *const _ as usize - base, 16); - } + assert_eq!(core::mem::size_of::<recv_in>(), 20); + assert_eq!(core::mem::align_of::<recv_in>(), 4); + unsafe { + let obj: recv_in = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.ri_data.0 as *const _ as usize - base, 0); + assert_eq!(&obj.ri_data.1 as *const _ as usize - base, 4); + assert_eq!(&obj.ri_fds.0 as *const _ as usize - base, 8); + assert_eq!(&obj.ri_fds.1 as *const _ as usize - base, 12); + assert_eq!(&obj.ri_flags as *const _ as usize - base, 16); + } } #[test] #[cfg(target_pointer_width = "64")] fn recv_in_layout_test_64() { - assert_eq!(core::mem::size_of::<recv_in>(), 40); - assert_eq!(core::mem::align_of::<recv_in>(), 8); - unsafe { - let obj: recv_in = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.ri_data.0 as *const _ as usize - base, 0); - assert_eq!(&obj.ri_data.1 as *const _ as usize - base, 8); - assert_eq!(&obj.ri_fds.0 as *const _ as usize - base, 16); - assert_eq!(&obj.ri_fds.1 as *const _ as usize - base, 24); - assert_eq!(&obj.ri_flags as *const _ as usize - base, 32); - } + assert_eq!(core::mem::size_of::<recv_in>(), 40); + assert_eq!(core::mem::align_of::<recv_in>(), 8); + unsafe { + let obj: recv_in = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.ri_data.0 as *const _ as usize - base, 0); + assert_eq!(&obj.ri_data.1 as *const _ as usize - base, 8); + assert_eq!(&obj.ri_fds.0 as *const _ as usize - base, 16); + assert_eq!(&obj.ri_fds.1 as *const _ as usize - base, 24); + assert_eq!(&obj.ri_flags as *const _ as usize - base, 32); + } } /// Results of [`sock_recv()`](fn.sock_recv.html). #[repr(C)] #[derive(Copy, Clone)] pub struct recv_out { - /// Number of bytes stored in [`recv_in.ri_data`](struct.recv_in.html#structfield.ri_data). - pub ro_datalen: usize, - /// Number of file descriptors stored in [`recv_in.ri_fds`](struct.recv_in.html#structfield.ri_fds). - pub ro_fdslen: usize, - /// Fields that were used by previous implementations. - pub ro_unused: [u8; 40], - /// Message flags. - pub ro_flags: roflags, + /// Number of bytes stored in [`recv_in.ri_data`](struct.recv_in.html#structfield.ri_data). + pub ro_datalen: usize, + /// Number of file descriptors stored in [`recv_in.ri_fds`](struct.recv_in.html#structfield.ri_fds). + pub ro_fdslen: usize, + /// Fields that were used by previous implementations. + pub ro_unused: [u8; 40], + /// Message flags. + pub ro_flags: roflags, } #[test] #[cfg(target_pointer_width = "32")] fn recv_out_layout_test_32() { - assert_eq!(core::mem::size_of::<recv_out>(), 52); - assert_eq!(core::mem::align_of::<recv_out>(), 4); - unsafe { - let obj: recv_out = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.ro_datalen as *const _ as usize - base, 0); - assert_eq!(&obj.ro_fdslen as *const _ as usize - base, 4); - assert_eq!(&obj.ro_unused as *const _ as usize - base, 8); - assert_eq!(&obj.ro_flags as *const _ as usize - base, 48); - } + assert_eq!(core::mem::size_of::<recv_out>(), 52); + assert_eq!(core::mem::align_of::<recv_out>(), 4); + unsafe { + let obj: recv_out = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.ro_datalen as *const _ as usize - base, 0); + assert_eq!(&obj.ro_fdslen as *const _ as usize - base, 4); + assert_eq!(&obj.ro_unused as *const _ as usize - base, 8); + assert_eq!(&obj.ro_flags as *const _ as usize - base, 48); + } } #[test] #[cfg(target_pointer_width = "64")] fn recv_out_layout_test_64() { - assert_eq!(core::mem::size_of::<recv_out>(), 64); - assert_eq!(core::mem::align_of::<recv_out>(), 8); - unsafe { - let obj: recv_out = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.ro_datalen as *const _ as usize - base, 0); - assert_eq!(&obj.ro_fdslen as *const _ as usize - base, 8); - assert_eq!(&obj.ro_unused as *const _ as usize - base, 16); - assert_eq!(&obj.ro_flags as *const _ as usize - base, 56); - } + assert_eq!(core::mem::size_of::<recv_out>(), 64); + assert_eq!(core::mem::align_of::<recv_out>(), 8); + unsafe { + let obj: recv_out = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.ro_datalen as *const _ as usize - base, 0); + assert_eq!(&obj.ro_fdslen as *const _ as usize - base, 8); + assert_eq!(&obj.ro_unused as *const _ as usize - base, 16); + assert_eq!(&obj.ro_flags as *const _ as usize - base, 56); + } } /// Arguments of [`sock_send()`](fn.sock_send.html). #[repr(C)] #[derive(Copy, Clone)] pub struct send_in { - /// List of scatter/gather vectors where message data - /// should be retrieved. - pub si_data: (*const ciovec, usize), - /// File descriptors that need to be attached to the - /// message. - pub si_fds: (*const fd, usize), - /// Message flags. - pub si_flags: siflags, + /// List of scatter/gather vectors where message data + /// should be retrieved. + pub si_data: (*const ciovec, usize), + /// File descriptors that need to be attached to the + /// message. + pub si_fds: (*const fd, usize), + /// Message flags. + pub si_flags: siflags, } #[test] #[cfg(target_pointer_width = "32")] fn send_in_layout_test_32() { - assert_eq!(core::mem::size_of::<send_in>(), 20); - assert_eq!(core::mem::align_of::<send_in>(), 4); - unsafe { - let obj: send_in = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.si_data.0 as *const _ as usize - base, 0); - assert_eq!(&obj.si_data.1 as *const _ as usize - base, 4); - assert_eq!(&obj.si_fds.0 as *const _ as usize - base, 8); - assert_eq!(&obj.si_fds.1 as *const _ as usize - base, 12); - assert_eq!(&obj.si_flags as *const _ as usize - base, 16); - } + assert_eq!(core::mem::size_of::<send_in>(), 20); + assert_eq!(core::mem::align_of::<send_in>(), 4); + unsafe { + let obj: send_in = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.si_data.0 as *const _ as usize - base, 0); + assert_eq!(&obj.si_data.1 as *const _ as usize - base, 4); + assert_eq!(&obj.si_fds.0 as *const _ as usize - base, 8); + assert_eq!(&obj.si_fds.1 as *const _ as usize - base, 12); + assert_eq!(&obj.si_flags as *const _ as usize - base, 16); + } } #[test] #[cfg(target_pointer_width = "64")] fn send_in_layout_test_64() { - assert_eq!(core::mem::size_of::<send_in>(), 40); - assert_eq!(core::mem::align_of::<send_in>(), 8); - unsafe { - let obj: send_in = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.si_data.0 as *const _ as usize - base, 0); - assert_eq!(&obj.si_data.1 as *const _ as usize - base, 8); - assert_eq!(&obj.si_fds.0 as *const _ as usize - base, 16); - assert_eq!(&obj.si_fds.1 as *const _ as usize - base, 24); - assert_eq!(&obj.si_flags as *const _ as usize - base, 32); - } + assert_eq!(core::mem::size_of::<send_in>(), 40); + assert_eq!(core::mem::align_of::<send_in>(), 8); + unsafe { + let obj: send_in = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.si_data.0 as *const _ as usize - base, 0); + assert_eq!(&obj.si_data.1 as *const _ as usize - base, 8); + assert_eq!(&obj.si_fds.0 as *const _ as usize - base, 16); + assert_eq!(&obj.si_fds.1 as *const _ as usize - base, 24); + assert_eq!(&obj.si_flags as *const _ as usize - base, 32); + } } /// Results of [`sock_send()`](fn.sock_send.html). #[repr(C)] #[derive(Copy, Clone)] pub struct send_out { - /// Number of bytes transmitted. - pub so_datalen: usize, + /// Number of bytes transmitted. + pub so_datalen: usize, } #[test] #[cfg(target_pointer_width = "32")] fn send_out_layout_test_32() { - assert_eq!(core::mem::size_of::<send_out>(), 4); - assert_eq!(core::mem::align_of::<send_out>(), 4); - unsafe { - let obj: send_out = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.so_datalen as *const _ as usize - base, 0); - } + assert_eq!(core::mem::size_of::<send_out>(), 4); + assert_eq!(core::mem::align_of::<send_out>(), 4); + unsafe { + let obj: send_out = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.so_datalen as *const _ as usize - base, 0); + } } #[test] #[cfg(target_pointer_width = "64")] fn send_out_layout_test_64() { - assert_eq!(core::mem::size_of::<send_out>(), 8); - assert_eq!(core::mem::align_of::<send_out>(), 8); - unsafe { - let obj: send_out = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.so_datalen as *const _ as usize - base, 0); - } + assert_eq!(core::mem::size_of::<send_out>(), 8); + assert_eq!(core::mem::align_of::<send_out>(), 8); + unsafe { + let obj: send_out = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.so_datalen as *const _ as usize - base, 0); + } } /// Subscription to an event. #[repr(C)] #[derive(Copy, Clone)] pub struct subscription { - /// User-provided value that is attached to the - /// subscription in the kernel and returned through - /// [`event.userdata`](struct.event.html#structfield.userdata). - pub userdata: userdata, - /// Used by previous implementations. Ignored. - pub unused: u16, - /// The type of the event to which to subscribe. - /// - /// Currently, [`CONDVAR`](enum.eventtype.html#variant.CONDVAR), - /// [`LOCK_RDLOCK`](enum.eventtype.html#variant.LOCK_RDLOCK), and [`LOCK_WRLOCK`](enum.eventtype.html#variant.LOCK_WRLOCK) - /// must be provided as the first subscription and may - /// only be followed by up to one other subscription, - /// having type [`CLOCK`](enum.eventtype.html#variant.CLOCK). - pub type_: eventtype, - pub union: subscription_union + /// User-provided value that is attached to the + /// subscription in the kernel and returned through + /// [`event.userdata`](struct.event.html#structfield.userdata). + pub userdata: userdata, + /// Used by previous implementations. Ignored. + pub unused: u16, + /// The type of the event to which to subscribe. + /// + /// Currently, [`CONDVAR`](enum.eventtype.html#variant.CONDVAR), + /// [`LOCK_RDLOCK`](enum.eventtype.html#variant.LOCK_RDLOCK), and [`LOCK_WRLOCK`](enum.eventtype.html#variant.LOCK_WRLOCK) + /// must be provided as the first subscription and may + /// only be followed by up to one other subscription, + /// having type [`CLOCK`](enum.eventtype.html#variant.CLOCK). + pub type_: eventtype, + pub union: subscription_union, } /// A union inside `subscription`. #[repr(C)] #[derive(Copy, Clone)] pub union subscription_union { - /// Used when `type_` is [`CLOCK`](enum.eventtype.html#variant.CLOCK). - pub clock: subscription_clock, - /// Used when `type_` is [`CONDVAR`](enum.eventtype.html#variant.CONDVAR). - pub condvar: subscription_condvar, - /// Used when `type_` is [`FD_READ`](enum.eventtype.html#variant.FD_READ) or [`FD_WRITE`](enum.eventtype.html#variant.FD_WRITE). - pub fd_readwrite: subscription_fd_readwrite, - /// Used when `type_` is [`LOCK_RDLOCK`](enum.eventtype.html#variant.LOCK_RDLOCK) or [`LOCK_WRLOCK`](enum.eventtype.html#variant.LOCK_WRLOCK). - pub lock: subscription_lock, - /// Used when `type_` is [`PROC_TERMINATE`](enum.eventtype.html#variant.PROC_TERMINATE). - pub proc_terminate: subscription_proc_terminate, + /// Used when `type_` is [`CLOCK`](enum.eventtype.html#variant.CLOCK). + pub clock: subscription_clock, + /// Used when `type_` is [`CONDVAR`](enum.eventtype.html#variant.CONDVAR). + pub condvar: subscription_condvar, + /// Used when `type_` is [`FD_READ`](enum.eventtype.html#variant.FD_READ) or [`FD_WRITE`](enum.eventtype.html#variant.FD_WRITE). + pub fd_readwrite: subscription_fd_readwrite, + /// Used when `type_` is [`LOCK_RDLOCK`](enum.eventtype.html#variant.LOCK_RDLOCK) or [`LOCK_WRLOCK`](enum.eventtype.html#variant.LOCK_WRLOCK). + pub lock: subscription_lock, + /// Used when `type_` is [`PROC_TERMINATE`](enum.eventtype.html#variant.PROC_TERMINATE). + pub proc_terminate: subscription_proc_terminate, } #[repr(C)] #[derive(Copy, Clone)] pub struct subscription_clock { - /// The user-defined unique - /// identifier of the clock. - pub identifier: userdata, - /// The clock against which the - /// timestamp should be compared. - pub clock_id: clockid, - /// The absolute or relative - /// timestamp. - pub timeout: timestamp, - /// The amount of time that the - /// kernel may wait additionally - /// to coalesce with other events. - pub precision: timestamp, - /// Flags specifying whether the - /// timeout is absolute or - /// relative. - pub flags: subclockflags, + /// The user-defined unique + /// identifier of the clock. + pub identifier: userdata, + /// The clock against which the + /// timestamp should be compared. + pub clock_id: clockid, + /// The absolute or relative + /// timestamp. + pub timeout: timestamp, + /// The amount of time that the + /// kernel may wait additionally + /// to coalesce with other events. + pub precision: timestamp, + /// Flags specifying whether the + /// timeout is absolute or + /// relative. + pub flags: subclockflags, } #[repr(C)] #[derive(Copy, Clone)] pub struct subscription_condvar { - /// The condition variable on - /// which to wait to be woken up. - pub condvar: *mut condvar, - /// The lock that will be - /// released while waiting. - /// - /// The lock will be reacquired - /// for writing when the condition - /// variable triggers. - pub lock: *mut lock, - /// Whether the condition variable - /// is stored in private or shared - /// memory. - pub condvar_scope: scope, - /// Whether the lock is stored in - /// private or shared memory. - pub lock_scope: scope, + /// The condition variable on + /// which to wait to be woken up. + pub condvar: *mut condvar, + /// The lock that will be + /// released while waiting. + /// + /// The lock will be reacquired + /// for writing when the condition + /// variable triggers. + pub lock: *mut lock, + /// Whether the condition variable + /// is stored in private or shared + /// memory. + pub condvar_scope: scope, + /// Whether the lock is stored in + /// private or shared memory. + pub lock_scope: scope, } #[repr(C)] #[derive(Copy, Clone)] pub struct subscription_fd_readwrite { - /// The file descriptor on which - /// to wait for it to become ready - /// for reading or writing. - pub fd: fd, - /// Under which conditions to - /// trigger. - pub flags: subrwflags, + /// The file descriptor on which + /// to wait for it to become ready + /// for reading or writing. + pub fd: fd, + /// Under which conditions to + /// trigger. + pub flags: subrwflags, } #[repr(C)] #[derive(Copy, Clone)] pub struct subscription_lock { - /// The lock that will be acquired - /// for reading or writing. - pub lock: *mut lock, - /// Whether the lock is stored in - /// private or shared memory. - pub lock_scope: scope, + /// The lock that will be acquired + /// for reading or writing. + pub lock: *mut lock, + /// Whether the lock is stored in + /// private or shared memory. + pub lock_scope: scope, } #[repr(C)] #[derive(Copy, Clone)] pub struct subscription_proc_terminate { - /// The process descriptor on - /// which to wait for process - /// termination. - pub fd: fd, + /// The process descriptor on + /// which to wait for process + /// termination. + pub fd: fd, } #[test] #[cfg(target_pointer_width = "32")] fn subscription_layout_test_32() { - assert_eq!(core::mem::size_of::<subscription>(), 56); - assert_eq!(core::mem::align_of::<subscription>(), 8); - unsafe { - let obj: subscription = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.userdata as *const _ as usize - base, 0); - assert_eq!(&obj.unused as *const _ as usize - base, 8); - assert_eq!(&obj.type_ as *const _ as usize - base, 10); - assert_eq!(&obj.union.clock.identifier as *const _ as usize - base, 16); - assert_eq!(&obj.union.clock.clock_id as *const _ as usize - base, 24); - assert_eq!(&obj.union.clock.timeout as *const _ as usize - base, 32); - assert_eq!(&obj.union.clock.precision as *const _ as usize - base, 40); - assert_eq!(&obj.union.clock.flags as *const _ as usize - base, 48); - assert_eq!(&obj.union.condvar.condvar as *const _ as usize - base, 16); - assert_eq!(&obj.union.condvar.lock as *const _ as usize - base, 20); - assert_eq!(&obj.union.condvar.condvar_scope as *const _ as usize - base, 24); - assert_eq!(&obj.union.condvar.lock_scope as *const _ as usize - base, 25); - assert_eq!(&obj.union.fd_readwrite.fd as *const _ as usize - base, 16); - assert_eq!(&obj.union.fd_readwrite.flags as *const _ as usize - base, 20); - assert_eq!(&obj.union.lock.lock as *const _ as usize - base, 16); - assert_eq!(&obj.union.lock.lock_scope as *const _ as usize - base, 20); - assert_eq!(&obj.union.proc_terminate.fd as *const _ as usize - base, 16); - } + assert_eq!(core::mem::size_of::<subscription>(), 56); + assert_eq!(core::mem::align_of::<subscription>(), 8); + unsafe { + let obj: subscription = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.userdata as *const _ as usize - base, 0); + assert_eq!(&obj.unused as *const _ as usize - base, 8); + assert_eq!(&obj.type_ as *const _ as usize - base, 10); + assert_eq!(&obj.union.clock.identifier as *const _ as usize - base, 16); + assert_eq!(&obj.union.clock.clock_id as *const _ as usize - base, 24); + assert_eq!(&obj.union.clock.timeout as *const _ as usize - base, 32); + assert_eq!(&obj.union.clock.precision as *const _ as usize - base, 40); + assert_eq!(&obj.union.clock.flags as *const _ as usize - base, 48); + assert_eq!(&obj.union.condvar.condvar as *const _ as usize - base, 16); + assert_eq!(&obj.union.condvar.lock as *const _ as usize - base, 20); + assert_eq!(&obj.union.condvar.condvar_scope as *const _ as usize - base, 24); + assert_eq!(&obj.union.condvar.lock_scope as *const _ as usize - base, 25); + assert_eq!(&obj.union.fd_readwrite.fd as *const _ as usize - base, 16); + assert_eq!(&obj.union.fd_readwrite.flags as *const _ as usize - base, 20); + assert_eq!(&obj.union.lock.lock as *const _ as usize - base, 16); + assert_eq!(&obj.union.lock.lock_scope as *const _ as usize - base, 20); + assert_eq!(&obj.union.proc_terminate.fd as *const _ as usize - base, 16); + } } #[test] #[cfg(target_pointer_width = "64")] fn subscription_layout_test_64() { - assert_eq!(core::mem::size_of::<subscription>(), 56); - assert_eq!(core::mem::align_of::<subscription>(), 8); - unsafe { - let obj: subscription = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.userdata as *const _ as usize - base, 0); - assert_eq!(&obj.unused as *const _ as usize - base, 8); - assert_eq!(&obj.type_ as *const _ as usize - base, 10); - assert_eq!(&obj.union.clock.identifier as *const _ as usize - base, 16); - assert_eq!(&obj.union.clock.clock_id as *const _ as usize - base, 24); - assert_eq!(&obj.union.clock.timeout as *const _ as usize - base, 32); - assert_eq!(&obj.union.clock.precision as *const _ as usize - base, 40); - assert_eq!(&obj.union.clock.flags as *const _ as usize - base, 48); - assert_eq!(&obj.union.condvar.condvar as *const _ as usize - base, 16); - assert_eq!(&obj.union.condvar.lock as *const _ as usize - base, 24); - assert_eq!(&obj.union.condvar.condvar_scope as *const _ as usize - base, 32); - assert_eq!(&obj.union.condvar.lock_scope as *const _ as usize - base, 33); - assert_eq!(&obj.union.fd_readwrite.fd as *const _ as usize - base, 16); - assert_eq!(&obj.union.fd_readwrite.flags as *const _ as usize - base, 20); - assert_eq!(&obj.union.lock.lock as *const _ as usize - base, 16); - assert_eq!(&obj.union.lock.lock_scope as *const _ as usize - base, 24); - assert_eq!(&obj.union.proc_terminate.fd as *const _ as usize - base, 16); - } + assert_eq!(core::mem::size_of::<subscription>(), 56); + assert_eq!(core::mem::align_of::<subscription>(), 8); + unsafe { + let obj: subscription = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.userdata as *const _ as usize - base, 0); + assert_eq!(&obj.unused as *const _ as usize - base, 8); + assert_eq!(&obj.type_ as *const _ as usize - base, 10); + assert_eq!(&obj.union.clock.identifier as *const _ as usize - base, 16); + assert_eq!(&obj.union.clock.clock_id as *const _ as usize - base, 24); + assert_eq!(&obj.union.clock.timeout as *const _ as usize - base, 32); + assert_eq!(&obj.union.clock.precision as *const _ as usize - base, 40); + assert_eq!(&obj.union.clock.flags as *const _ as usize - base, 48); + assert_eq!(&obj.union.condvar.condvar as *const _ as usize - base, 16); + assert_eq!(&obj.union.condvar.lock as *const _ as usize - base, 24); + assert_eq!(&obj.union.condvar.condvar_scope as *const _ as usize - base, 32); + assert_eq!(&obj.union.condvar.lock_scope as *const _ as usize - base, 33); + assert_eq!(&obj.union.fd_readwrite.fd as *const _ as usize - base, 16); + assert_eq!(&obj.union.fd_readwrite.flags as *const _ as usize - base, 20); + assert_eq!(&obj.union.lock.lock as *const _ as usize - base, 16); + assert_eq!(&obj.union.lock.lock_scope as *const _ as usize - base, 24); + assert_eq!(&obj.union.proc_terminate.fd as *const _ as usize - base, 16); + } } /// The Thread Control Block (TCB). @@ -1722,31 +1719,31 @@ fn subscription_layout_test_64() { #[repr(C)] #[derive(Copy, Clone)] pub struct tcb { - /// Pointer that may be freely assigned by the system. Its - /// value cannot be interpreted by the application. - pub parent: *mut (), + /// Pointer that may be freely assigned by the system. Its + /// value cannot be interpreted by the application. + pub parent: *mut (), } #[test] #[cfg(target_pointer_width = "32")] fn tcb_layout_test_32() { - assert_eq!(core::mem::size_of::<tcb>(), 4); - assert_eq!(core::mem::align_of::<tcb>(), 4); - unsafe { - let obj: tcb = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.parent as *const _ as usize - base, 0); - } + assert_eq!(core::mem::size_of::<tcb>(), 4); + assert_eq!(core::mem::align_of::<tcb>(), 4); + unsafe { + let obj: tcb = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.parent as *const _ as usize - base, 0); + } } #[test] #[cfg(target_pointer_width = "64")] fn tcb_layout_test_64() { - assert_eq!(core::mem::size_of::<tcb>(), 8); - assert_eq!(core::mem::align_of::<tcb>(), 8); - unsafe { - let obj: tcb = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.parent as *const _ as usize - base, 0); - } + assert_eq!(core::mem::size_of::<tcb>(), 8); + assert_eq!(core::mem::align_of::<tcb>(), 8); + unsafe { + let obj: tcb = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.parent as *const _ as usize - base, 0); + } } /// Entry point for additionally created threads. @@ -1755,103 +1752,150 @@ fn tcb_layout_test_64() { /// /// `aux`: copy of the value stored in /// [`threadattr.argument`](struct.threadattr.html#structfield.argument). -pub type threadentry = unsafe extern "C" fn( - tid: tid, - aux: *mut (), -) -> (); +pub type threadentry = unsafe extern "C" fn(tid: tid, aux: *mut ()) -> (); /// Attributes for thread creation. #[repr(C)] #[derive(Copy, Clone)] pub struct threadattr { - /// Initial program counter value. - pub entry_point: threadentry, - /// Region allocated to serve as stack space. - pub stack: (*mut (), usize), - /// Argument to be forwarded to the entry point function. - pub argument: *mut (), + /// Initial program counter value. + pub entry_point: threadentry, + /// Region allocated to serve as stack space. + pub stack: (*mut (), usize), + /// Argument to be forwarded to the entry point function. + pub argument: *mut (), } #[test] #[cfg(target_pointer_width = "32")] fn threadattr_layout_test_32() { - assert_eq!(core::mem::size_of::<threadattr>(), 16); - assert_eq!(core::mem::align_of::<threadattr>(), 4); - unsafe { - let obj: threadattr = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.entry_point as *const _ as usize - base, 0); - assert_eq!(&obj.stack.0 as *const _ as usize - base, 4); - assert_eq!(&obj.stack.1 as *const _ as usize - base, 8); - assert_eq!(&obj.argument as *const _ as usize - base, 12); - } + assert_eq!(core::mem::size_of::<threadattr>(), 16); + assert_eq!(core::mem::align_of::<threadattr>(), 4); + unsafe { + let obj: threadattr = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.entry_point as *const _ as usize - base, 0); + assert_eq!(&obj.stack.0 as *const _ as usize - base, 4); + assert_eq!(&obj.stack.1 as *const _ as usize - base, 8); + assert_eq!(&obj.argument as *const _ as usize - base, 12); + } } #[test] #[cfg(target_pointer_width = "64")] fn threadattr_layout_test_64() { - assert_eq!(core::mem::size_of::<threadattr>(), 32); - assert_eq!(core::mem::align_of::<threadattr>(), 8); - unsafe { - let obj: threadattr = core::mem::uninitialized(); - let base = &obj as *const _ as usize; - assert_eq!(&obj.entry_point as *const _ as usize - base, 0); - assert_eq!(&obj.stack.0 as *const _ as usize - base, 8); - assert_eq!(&obj.stack.1 as *const _ as usize - base, 16); - assert_eq!(&obj.argument as *const _ as usize - base, 24); - } + assert_eq!(core::mem::size_of::<threadattr>(), 32); + assert_eq!(core::mem::align_of::<threadattr>(), 8); + unsafe { + let obj: threadattr = core::mem::uninitialized(); + let base = &obj as *const _ as usize; + assert_eq!(&obj.entry_point as *const _ as usize - base, 0); + assert_eq!(&obj.stack.0 as *const _ as usize - base, 8); + assert_eq!(&obj.stack.1 as *const _ as usize - base, 16); + assert_eq!(&obj.argument as *const _ as usize - base, 24); + } } /// The table with pointers to all syscall implementations. #[allow(improper_ctypes)] extern "C" { - fn cloudabi_sys_clock_res_get(_: clockid, _: *mut timestamp) -> errno; - fn cloudabi_sys_clock_time_get(_: clockid, _: timestamp, _: *mut timestamp) -> errno; - fn cloudabi_sys_condvar_signal(_: *mut condvar, _: scope, _: nthreads) -> errno; - fn cloudabi_sys_fd_close(_: fd) -> errno; - fn cloudabi_sys_fd_create1(_: filetype, _: *mut fd) -> errno; - fn cloudabi_sys_fd_create2(_: filetype, _: *mut fd, _: *mut fd) -> errno; - fn cloudabi_sys_fd_datasync(_: fd) -> errno; - fn cloudabi_sys_fd_dup(_: fd, _: *mut fd) -> errno; - fn cloudabi_sys_fd_pread(_: fd, _: *const iovec, _: usize, _: filesize, _: *mut usize) -> errno; - fn cloudabi_sys_fd_pwrite(_: fd, _: *const ciovec, _: usize, _: filesize, _: *mut usize) -> errno; - fn cloudabi_sys_fd_read(_: fd, _: *const iovec, _: usize, _: *mut usize) -> errno; - fn cloudabi_sys_fd_replace(_: fd, _: fd) -> errno; - fn cloudabi_sys_fd_seek(_: fd, _: filedelta, _: whence, _: *mut filesize) -> errno; - fn cloudabi_sys_fd_stat_get(_: fd, _: *mut fdstat) -> errno; - fn cloudabi_sys_fd_stat_put(_: fd, _: *const fdstat, _: fdsflags) -> errno; - fn cloudabi_sys_fd_sync(_: fd) -> errno; - fn cloudabi_sys_fd_write(_: fd, _: *const ciovec, _: usize, _: *mut usize) -> errno; - fn cloudabi_sys_file_advise(_: fd, _: filesize, _: filesize, _: advice) -> errno; - fn cloudabi_sys_file_allocate(_: fd, _: filesize, _: filesize) -> errno; - fn cloudabi_sys_file_create(_: fd, _: *const u8, _: usize, _: filetype) -> errno; - fn cloudabi_sys_file_link(_: lookup, _: *const u8, _: usize, _: fd, _: *const u8, _: usize) -> errno; - fn cloudabi_sys_file_open(_: lookup, _: *const u8, _: usize, _: oflags, _: *const fdstat, _: *mut fd) -> errno; - fn cloudabi_sys_file_readdir(_: fd, _: *mut (), _: usize, _: dircookie, _: *mut usize) -> errno; - fn cloudabi_sys_file_readlink(_: fd, _: *const u8, _: usize, _: *mut u8, _: usize, _: *mut usize) -> errno; - fn cloudabi_sys_file_rename(_: fd, _: *const u8, _: usize, _: fd, _: *const u8, _: usize) -> errno; - fn cloudabi_sys_file_stat_fget(_: fd, _: *mut filestat) -> errno; - fn cloudabi_sys_file_stat_fput(_: fd, _: *const filestat, _: fsflags) -> errno; - fn cloudabi_sys_file_stat_get(_: lookup, _: *const u8, _: usize, _: *mut filestat) -> errno; - fn cloudabi_sys_file_stat_put(_: lookup, _: *const u8, _: usize, _: *const filestat, _: fsflags) -> errno; - fn cloudabi_sys_file_symlink(_: *const u8, _: usize, _: fd, _: *const u8, _: usize) -> errno; - fn cloudabi_sys_file_unlink(_: fd, _: *const u8, _: usize, _: ulflags) -> errno; - fn cloudabi_sys_lock_unlock(_: *mut lock, _: scope) -> errno; - fn cloudabi_sys_mem_advise(_: *mut (), _: usize, _: advice) -> errno; - fn cloudabi_sys_mem_map(_: *mut (), _: usize, _: mprot, _: mflags, _: fd, _: filesize, _: *mut *mut ()) -> errno; - fn cloudabi_sys_mem_protect(_: *mut (), _: usize, _: mprot) -> errno; - fn cloudabi_sys_mem_sync(_: *mut (), _: usize, _: msflags) -> errno; - fn cloudabi_sys_mem_unmap(_: *mut (), _: usize) -> errno; - fn cloudabi_sys_poll(_: *const subscription, _: *mut event, _: usize, _: *mut usize) -> errno; - fn cloudabi_sys_proc_exec(_: fd, _: *const (), _: usize, _: *const fd, _: usize) -> errno; - fn cloudabi_sys_proc_exit(_: exitcode) -> !; - fn cloudabi_sys_proc_fork(_: *mut fd, _: *mut tid) -> errno; - fn cloudabi_sys_proc_raise(_: signal) -> errno; - fn cloudabi_sys_random_get(_: *mut (), _: usize) -> errno; - fn cloudabi_sys_sock_recv(_: fd, _: *const recv_in, _: *mut recv_out) -> errno; - fn cloudabi_sys_sock_send(_: fd, _: *const send_in, _: *mut send_out) -> errno; - fn cloudabi_sys_sock_shutdown(_: fd, _: sdflags) -> errno; - fn cloudabi_sys_thread_create(_: *mut threadattr, _: *mut tid) -> errno; - fn cloudabi_sys_thread_exit(_: *mut lock, _: scope) -> !; - fn cloudabi_sys_thread_yield() -> errno; + fn cloudabi_sys_clock_res_get(_: clockid, _: *mut timestamp) -> errno; + fn cloudabi_sys_clock_time_get(_: clockid, _: timestamp, _: *mut timestamp) -> errno; + fn cloudabi_sys_condvar_signal(_: *mut condvar, _: scope, _: nthreads) -> errno; + fn cloudabi_sys_fd_close(_: fd) -> errno; + fn cloudabi_sys_fd_create1(_: filetype, _: *mut fd) -> errno; + fn cloudabi_sys_fd_create2(_: filetype, _: *mut fd, _: *mut fd) -> errno; + fn cloudabi_sys_fd_datasync(_: fd) -> errno; + fn cloudabi_sys_fd_dup(_: fd, _: *mut fd) -> errno; + fn cloudabi_sys_fd_pread(_: fd, _: *const iovec, _: usize, _: filesize, _: *mut usize) + -> errno; + fn cloudabi_sys_fd_pwrite( + _: fd, + _: *const ciovec, + _: usize, + _: filesize, + _: *mut usize, + ) -> errno; + fn cloudabi_sys_fd_read(_: fd, _: *const iovec, _: usize, _: *mut usize) -> errno; + fn cloudabi_sys_fd_replace(_: fd, _: fd) -> errno; + fn cloudabi_sys_fd_seek(_: fd, _: filedelta, _: whence, _: *mut filesize) -> errno; + fn cloudabi_sys_fd_stat_get(_: fd, _: *mut fdstat) -> errno; + fn cloudabi_sys_fd_stat_put(_: fd, _: *const fdstat, _: fdsflags) -> errno; + fn cloudabi_sys_fd_sync(_: fd) -> errno; + fn cloudabi_sys_fd_write(_: fd, _: *const ciovec, _: usize, _: *mut usize) -> errno; + fn cloudabi_sys_file_advise(_: fd, _: filesize, _: filesize, _: advice) -> errno; + fn cloudabi_sys_file_allocate(_: fd, _: filesize, _: filesize) -> errno; + fn cloudabi_sys_file_create(_: fd, _: *const u8, _: usize, _: filetype) -> errno; + fn cloudabi_sys_file_link( + _: lookup, + _: *const u8, + _: usize, + _: fd, + _: *const u8, + _: usize, + ) -> errno; + fn cloudabi_sys_file_open( + _: lookup, + _: *const u8, + _: usize, + _: oflags, + _: *const fdstat, + _: *mut fd, + ) -> errno; + fn cloudabi_sys_file_readdir(_: fd, _: *mut (), _: usize, _: dircookie, _: *mut usize) + -> errno; + fn cloudabi_sys_file_readlink( + _: fd, + _: *const u8, + _: usize, + _: *mut u8, + _: usize, + _: *mut usize, + ) -> errno; + fn cloudabi_sys_file_rename( + _: fd, + _: *const u8, + _: usize, + _: fd, + _: *const u8, + _: usize, + ) -> errno; + fn cloudabi_sys_file_stat_fget(_: fd, _: *mut filestat) -> errno; + fn cloudabi_sys_file_stat_fput(_: fd, _: *const filestat, _: fsflags) -> errno; + fn cloudabi_sys_file_stat_get(_: lookup, _: *const u8, _: usize, _: *mut filestat) -> errno; + fn cloudabi_sys_file_stat_put( + _: lookup, + _: *const u8, + _: usize, + _: *const filestat, + _: fsflags, + ) -> errno; + fn cloudabi_sys_file_symlink(_: *const u8, _: usize, _: fd, _: *const u8, _: usize) -> errno; + fn cloudabi_sys_file_unlink(_: fd, _: *const u8, _: usize, _: ulflags) -> errno; + fn cloudabi_sys_lock_unlock(_: *mut lock, _: scope) -> errno; + fn cloudabi_sys_mem_advise(_: *mut (), _: usize, _: advice) -> errno; + fn cloudabi_sys_mem_map( + _: *mut (), + _: usize, + _: mprot, + _: mflags, + _: fd, + _: filesize, + _: *mut *mut (), + ) -> errno; + fn cloudabi_sys_mem_protect(_: *mut (), _: usize, _: mprot) -> errno; + fn cloudabi_sys_mem_sync(_: *mut (), _: usize, _: msflags) -> errno; + fn cloudabi_sys_mem_unmap(_: *mut (), _: usize) -> errno; + fn cloudabi_sys_poll(_: *const subscription, _: *mut event, _: usize, _: *mut usize) -> errno; + fn cloudabi_sys_proc_exec(_: fd, _: *const (), _: usize, _: *const fd, _: usize) -> errno; + fn cloudabi_sys_proc_exit(_: exitcode) -> !; + fn cloudabi_sys_proc_fork(_: *mut fd, _: *mut tid) -> errno; + fn cloudabi_sys_proc_raise(_: signal) -> errno; + fn cloudabi_sys_random_get(_: *mut (), _: usize) -> errno; + fn cloudabi_sys_sock_recv(_: fd, _: *const recv_in, _: *mut recv_out) -> errno; + fn cloudabi_sys_sock_send(_: fd, _: *const send_in, _: *mut send_out) -> errno; + fn cloudabi_sys_sock_shutdown(_: fd, _: sdflags) -> errno; + fn cloudabi_sys_thread_create(_: *mut threadattr, _: *mut tid) -> errno; + fn cloudabi_sys_thread_exit(_: *mut lock, _: scope) -> !; + fn cloudabi_sys_thread_yield() -> errno; } /// Obtains the resolution of a clock. @@ -1866,7 +1910,7 @@ extern "C" { /// The resolution of the clock. #[inline] pub unsafe fn clock_res_get(clock_id_: clockid, resolution_: &mut timestamp) -> errno { - cloudabi_sys_clock_res_get(clock_id_, resolution_) + cloudabi_sys_clock_res_get(clock_id_, resolution_) } /// Obtains the time value of a clock. @@ -1885,8 +1929,12 @@ pub unsafe fn clock_res_get(clock_id_: clockid, resolution_: &mut timestamp) -> /// **time**: /// The time value of the clock. #[inline] -pub unsafe fn clock_time_get(clock_id_: clockid, precision_: timestamp, time_: *mut timestamp) -> errno { - cloudabi_sys_clock_time_get(clock_id_, precision_, time_) +pub unsafe fn clock_time_get( + clock_id_: clockid, + precision_: timestamp, + time_: *mut timestamp, +) -> errno { + cloudabi_sys_clock_time_get(clock_id_, precision_, time_) } /// Wakes up threads waiting on a userspace condition variable. @@ -1913,7 +1961,7 @@ pub unsafe fn clock_time_get(clock_id_: clockid, precision_: timestamp, time_: * /// threads, all threads are woken up. #[inline] pub unsafe fn condvar_signal(condvar_: *mut condvar, scope_: scope, nwaiters_: nthreads) -> errno { - cloudabi_sys_condvar_signal(condvar_, scope_, nwaiters_) + cloudabi_sys_condvar_signal(condvar_, scope_, nwaiters_) } /// Closes a file descriptor. @@ -1924,7 +1972,7 @@ pub unsafe fn condvar_signal(condvar_: *mut condvar, scope_: scope, nwaiters_: n /// The file descriptor that needs to be closed. #[inline] pub unsafe fn fd_close(fd_: fd) -> errno { - cloudabi_sys_fd_close(fd_) + cloudabi_sys_fd_close(fd_) } /// Creates a file descriptor. @@ -1942,7 +1990,7 @@ pub unsafe fn fd_close(fd_: fd) -> errno { /// The file descriptor that has been created. #[inline] pub unsafe fn fd_create1(type_: filetype, fd_: &mut fd) -> errno { - cloudabi_sys_fd_create1(type_, fd_) + cloudabi_sys_fd_create1(type_, fd_) } /// Creates a pair of file descriptors. @@ -1965,7 +2013,7 @@ pub unsafe fn fd_create1(type_: filetype, fd_: &mut fd) -> errno { /// The second file descriptor of the pair. #[inline] pub unsafe fn fd_create2(type_: filetype, fd1_: &mut fd, fd2_: &mut fd) -> errno { - cloudabi_sys_fd_create2(type_, fd1_, fd2_) + cloudabi_sys_fd_create2(type_, fd1_, fd2_) } /// Synchronizes the data of a file to disk. @@ -1977,7 +2025,7 @@ pub unsafe fn fd_create2(type_: filetype, fd1_: &mut fd, fd2_: &mut fd) -> errno /// needs to be synchronized to disk. #[inline] pub unsafe fn fd_datasync(fd_: fd) -> errno { - cloudabi_sys_fd_datasync(fd_) + cloudabi_sys_fd_datasync(fd_) } /// Duplicates a file descriptor. @@ -1992,7 +2040,7 @@ pub unsafe fn fd_datasync(fd_: fd) -> errno { /// The new file descriptor. #[inline] pub unsafe fn fd_dup(from_: fd, fd_: &mut fd) -> errno { - cloudabi_sys_fd_dup(from_, fd_) + cloudabi_sys_fd_dup(from_, fd_) } /// Reads from a file descriptor, without using and updating the @@ -2016,7 +2064,7 @@ pub unsafe fn fd_dup(from_: fd, fd_: &mut fd) -> errno { /// The number of bytes read. #[inline] pub unsafe fn fd_pread(fd_: fd, iovs_: &[iovec], offset_: filesize, nread_: &mut usize) -> errno { - cloudabi_sys_fd_pread(fd_, iovs_.as_ptr(), iovs_.len(), offset_, nread_) + cloudabi_sys_fd_pread(fd_, iovs_.as_ptr(), iovs_.len(), offset_, nread_) } /// Writes to a file descriptor, without using and updating the @@ -2039,8 +2087,13 @@ pub unsafe fn fd_pread(fd_: fd, iovs_: &[iovec], offset_: filesize, nread_: &mut /// **nwritten**: /// The number of bytes written. #[inline] -pub unsafe fn fd_pwrite(fd_: fd, iovs_: &[ciovec], offset_: filesize, nwritten_: &mut usize) -> errno { - cloudabi_sys_fd_pwrite(fd_, iovs_.as_ptr(), iovs_.len(), offset_, nwritten_) +pub unsafe fn fd_pwrite( + fd_: fd, + iovs_: &[ciovec], + offset_: filesize, + nwritten_: &mut usize, +) -> errno { + cloudabi_sys_fd_pwrite(fd_, iovs_.as_ptr(), iovs_.len(), offset_, nwritten_) } /// Reads from a file descriptor. @@ -2059,7 +2112,7 @@ pub unsafe fn fd_pwrite(fd_: fd, iovs_: &[ciovec], offset_: filesize, nwritten_: /// The number of bytes read. #[inline] pub unsafe fn fd_read(fd_: fd, iovs_: &[iovec], nread_: &mut usize) -> errno { - cloudabi_sys_fd_read(fd_, iovs_.as_ptr(), iovs_.len(), nread_) + cloudabi_sys_fd_read(fd_, iovs_.as_ptr(), iovs_.len(), nread_) } /// Atomically replaces a file descriptor by a copy of another @@ -2085,7 +2138,7 @@ pub unsafe fn fd_read(fd_: fd, iovs_: &[iovec], nread_: &mut usize) -> errno { /// overwritten. #[inline] pub unsafe fn fd_replace(from_: fd, to_: fd) -> errno { - cloudabi_sys_fd_replace(from_, to_) + cloudabi_sys_fd_replace(from_, to_) } /// Moves the offset of the file descriptor. @@ -2107,8 +2160,13 @@ pub unsafe fn fd_replace(from_: fd, to_: fd) -> errno { /// The new offset of the file descriptor, /// relative to the start of the file. #[inline] -pub unsafe fn fd_seek(fd_: fd, offset_: filedelta, whence_: whence, newoffset_: &mut filesize) -> errno { - cloudabi_sys_fd_seek(fd_, offset_, whence_, newoffset_) +pub unsafe fn fd_seek( + fd_: fd, + offset_: filedelta, + whence_: whence, + newoffset_: &mut filesize, +) -> errno { + cloudabi_sys_fd_seek(fd_, offset_, whence_, newoffset_) } /// Gets attributes of a file descriptor. @@ -2124,7 +2182,7 @@ pub unsafe fn fd_seek(fd_: fd, offset_: filedelta, whence_: whence, newoffset_: /// attributes are stored. #[inline] pub unsafe fn fd_stat_get(fd_: fd, buf_: *mut fdstat) -> errno { - cloudabi_sys_fd_stat_get(fd_, buf_) + cloudabi_sys_fd_stat_get(fd_, buf_) } /// Adjusts attributes of a file descriptor. @@ -2144,7 +2202,7 @@ pub unsafe fn fd_stat_get(fd_: fd, buf_: *mut fdstat) -> errno { /// be adjusted. #[inline] pub unsafe fn fd_stat_put(fd_: fd, buf_: *const fdstat, flags_: fdsflags) -> errno { - cloudabi_sys_fd_stat_put(fd_, buf_, flags_) + cloudabi_sys_fd_stat_put(fd_, buf_, flags_) } /// Synchronizes the data and metadata of a file to disk. @@ -2156,7 +2214,7 @@ pub unsafe fn fd_stat_put(fd_: fd, buf_: *const fdstat, flags_: fdsflags) -> err /// and metadata needs to be synchronized to disk. #[inline] pub unsafe fn fd_sync(fd_: fd) -> errno { - cloudabi_sys_fd_sync(fd_) + cloudabi_sys_fd_sync(fd_) } /// Writes to a file descriptor. @@ -2175,7 +2233,7 @@ pub unsafe fn fd_sync(fd_: fd) -> errno { /// The number of bytes written. #[inline] pub unsafe fn fd_write(fd_: fd, iovs_: &[ciovec], nwritten_: &mut usize) -> errno { - cloudabi_sys_fd_write(fd_, iovs_.as_ptr(), iovs_.len(), nwritten_) + cloudabi_sys_fd_write(fd_, iovs_.as_ptr(), iovs_.len(), nwritten_) } /// Provides file advisory information on a file descriptor. @@ -2198,7 +2256,7 @@ pub unsafe fn fd_write(fd_: fd, iovs_: &[ciovec], nwritten_: &mut usize) -> errn /// The advice. #[inline] pub unsafe fn file_advise(fd_: fd, offset_: filesize, len_: filesize, advice_: advice) -> errno { - cloudabi_sys_file_advise(fd_, offset_, len_, advice_) + cloudabi_sys_file_advise(fd_, offset_, len_, advice_) } /// Forces the allocation of space in a file. @@ -2217,7 +2275,7 @@ pub unsafe fn file_advise(fd_: fd, offset_: filesize, len_: filesize, advice_: a /// The length of the area that is allocated. #[inline] pub unsafe fn file_allocate(fd_: fd, offset_: filesize, len_: filesize) -> errno { - cloudabi_sys_file_allocate(fd_, offset_, len_) + cloudabi_sys_file_allocate(fd_, offset_, len_) } /// Creates a file of a specified type. @@ -2238,7 +2296,7 @@ pub unsafe fn file_allocate(fd_: fd, offset_: filesize, len_: filesize) -> errno /// Creates a directory. #[inline] pub unsafe fn file_create(fd_: fd, path_: &[u8], type_: filetype) -> errno { - cloudabi_sys_file_create(fd_, path_.as_ptr(), path_.len(), type_) + cloudabi_sys_file_create(fd_, path_.as_ptr(), path_.len(), type_) } /// Creates a hard link. @@ -2262,7 +2320,7 @@ pub unsafe fn file_create(fd_: fd, path_: &[u8], type_: filetype) -> errno { /// should be created. #[inline] pub unsafe fn file_link(fd1_: lookup, path1_: &[u8], fd2_: fd, path2_: &[u8]) -> errno { - cloudabi_sys_file_link(fd1_, path1_.as_ptr(), path1_.len(), fd2_, path2_.as_ptr(), path2_.len()) + cloudabi_sys_file_link(fd1_, path1_.as_ptr(), path1_.len(), fd2_, path2_.as_ptr(), path2_.len()) } /// Opens a file. @@ -2297,8 +2355,14 @@ pub unsafe fn file_link(fd1_: lookup, path1_: &[u8], fd2_: fd, path2_: &[u8]) -> /// The file descriptor of the file that has been /// opened. #[inline] -pub unsafe fn file_open(dirfd_: lookup, path_: &[u8], oflags_: oflags, fds_: *const fdstat, fd_: &mut fd) -> errno { - cloudabi_sys_file_open(dirfd_, path_.as_ptr(), path_.len(), oflags_, fds_, fd_) +pub unsafe fn file_open( + dirfd_: lookup, + path_: &[u8], + oflags_: oflags, + fds_: *const fdstat, + fd_: &mut fd, +) -> errno { + cloudabi_sys_file_open(dirfd_, path_.as_ptr(), path_.len(), oflags_, fds_, fd_) } /// Reads directory entries from a directory. @@ -2332,8 +2396,13 @@ pub unsafe fn file_open(dirfd_: lookup, path_: &[u8], oflags_: oflags, fds_: *co /// If less than the size of the read buffer, the /// end of the directory has been reached. #[inline] -pub unsafe fn file_readdir(fd_: fd, buf_: &mut [u8], cookie_: dircookie, bufused_: &mut usize) -> errno { - cloudabi_sys_file_readdir(fd_, buf_.as_mut_ptr() as *mut (), buf_.len(), cookie_, bufused_) +pub unsafe fn file_readdir( + fd_: fd, + buf_: &mut [u8], + cookie_: dircookie, + bufused_: &mut usize, +) -> errno { + cloudabi_sys_file_readdir(fd_, buf_.as_mut_ptr() as *mut (), buf_.len(), cookie_, bufused_) } /// Reads the contents of a symbolic link. @@ -2356,7 +2425,14 @@ pub unsafe fn file_readdir(fd_: fd, buf_: &mut [u8], cookie_: dircookie, bufused /// The number of bytes placed in the buffer. #[inline] pub unsafe fn file_readlink(fd_: fd, path_: &[u8], buf_: &mut [u8], bufused_: &mut usize) -> errno { - cloudabi_sys_file_readlink(fd_, path_.as_ptr(), path_.len(), buf_.as_mut_ptr(), buf_.len(), bufused_) + cloudabi_sys_file_readlink( + fd_, + path_.as_ptr(), + path_.len(), + buf_.as_mut_ptr(), + buf_.len(), + bufused_, + ) } /// Renames a file. @@ -2380,7 +2456,14 @@ pub unsafe fn file_readlink(fd_: fd, path_: &[u8], buf_: &mut [u8], bufused_: &m /// be renamed. #[inline] pub unsafe fn file_rename(fd1_: fd, path1_: &[u8], fd2_: fd, path2_: &[u8]) -> errno { - cloudabi_sys_file_rename(fd1_, path1_.as_ptr(), path1_.len(), fd2_, path2_.as_ptr(), path2_.len()) + cloudabi_sys_file_rename( + fd1_, + path1_.as_ptr(), + path1_.len(), + fd2_, + path2_.as_ptr(), + path2_.len(), + ) } /// Gets attributes of a file by file descriptor. @@ -2396,7 +2479,7 @@ pub unsafe fn file_rename(fd1_: fd, path1_: &[u8], fd2_: fd, path2_: &[u8]) -> e /// stored. #[inline] pub unsafe fn file_stat_fget(fd_: fd, buf_: *mut filestat) -> errno { - cloudabi_sys_file_stat_fget(fd_, buf_) + cloudabi_sys_file_stat_fget(fd_, buf_) } /// Adjusts attributes of a file by file descriptor. @@ -2416,7 +2499,7 @@ pub unsafe fn file_stat_fget(fd_: fd, buf_: *mut filestat) -> errno { /// be adjusted. #[inline] pub unsafe fn file_stat_fput(fd_: fd, buf_: *const filestat, flags_: fsflags) -> errno { - cloudabi_sys_file_stat_fput(fd_, buf_, flags_) + cloudabi_sys_file_stat_fput(fd_, buf_, flags_) } /// Gets attributes of a file by path. @@ -2437,7 +2520,7 @@ pub unsafe fn file_stat_fput(fd_: fd, buf_: *const filestat, flags_: fsflags) -> /// stored. #[inline] pub unsafe fn file_stat_get(fd_: lookup, path_: &[u8], buf_: *mut filestat) -> errno { - cloudabi_sys_file_stat_get(fd_, path_.as_ptr(), path_.len(), buf_) + cloudabi_sys_file_stat_get(fd_, path_.as_ptr(), path_.len(), buf_) } /// Adjusts attributes of a file by path. @@ -2461,8 +2544,13 @@ pub unsafe fn file_stat_get(fd_: lookup, path_: &[u8], buf_: *mut filestat) -> e /// A bitmask indicating which attributes have to /// be adjusted. #[inline] -pub unsafe fn file_stat_put(fd_: lookup, path_: &[u8], buf_: *const filestat, flags_: fsflags) -> errno { - cloudabi_sys_file_stat_put(fd_, path_.as_ptr(), path_.len(), buf_, flags_) +pub unsafe fn file_stat_put( + fd_: lookup, + path_: &[u8], + buf_: *const filestat, + flags_: fsflags, +) -> errno { + cloudabi_sys_file_stat_put(fd_, path_.as_ptr(), path_.len(), buf_, flags_) } /// Creates a symbolic link. @@ -2481,7 +2569,7 @@ pub unsafe fn file_stat_put(fd_: lookup, path_: &[u8], buf_: *const filestat, fl /// link should be created. #[inline] pub unsafe fn file_symlink(path1_: &[u8], fd_: fd, path2_: &[u8]) -> errno { - cloudabi_sys_file_symlink(path1_.as_ptr(), path1_.len(), fd_, path2_.as_ptr(), path2_.len()) + cloudabi_sys_file_symlink(path1_.as_ptr(), path1_.len(), fd_, path2_.as_ptr(), path2_.len()) } /// Unlinks a file, or removes a directory. @@ -2503,7 +2591,7 @@ pub unsafe fn file_symlink(path1_: &[u8], fd_: fd, path2_: &[u8]) -> errno { /// Otherwise, unlink a file. #[inline] pub unsafe fn file_unlink(fd_: fd, path_: &[u8], flags_: ulflags) -> errno { - cloudabi_sys_file_unlink(fd_, path_.as_ptr(), path_.len(), flags_) + cloudabi_sys_file_unlink(fd_, path_.as_ptr(), path_.len(), flags_) } /// Unlocks a write-locked userspace lock. @@ -2530,7 +2618,7 @@ pub unsafe fn file_unlink(fd_: fd, path_: &[u8], flags_: ulflags) -> errno { /// shared memory. #[inline] pub unsafe fn lock_unlock(lock_: *mut lock, scope_: scope) -> errno { - cloudabi_sys_lock_unlock(lock_, scope_) + cloudabi_sys_lock_unlock(lock_, scope_) } /// Provides memory advisory information on a region of memory. @@ -2545,7 +2633,7 @@ pub unsafe fn lock_unlock(lock_: *mut lock, scope_: scope) -> errno { /// The advice. #[inline] pub unsafe fn mem_advise(mapping_: &mut [u8], advice_: advice) -> errno { - cloudabi_sys_mem_advise(mapping_.as_mut_ptr() as *mut (), mapping_.len(), advice_) + cloudabi_sys_mem_advise(mapping_.as_mut_ptr() as *mut (), mapping_.len(), advice_) } /// Creates a memory mapping, making the contents of a file @@ -2585,8 +2673,16 @@ pub unsafe fn mem_advise(mapping_: &mut [u8], advice_: advice) -> errno { /// **mem**: /// The starting address of the memory mapping. #[inline] -pub unsafe fn mem_map(addr_: *mut (), len_: usize, prot_: mprot, flags_: mflags, fd_: fd, off_: filesize, mem_: &mut *mut ()) -> errno { - cloudabi_sys_mem_map(addr_, len_, prot_, flags_, fd_, off_, mem_) +pub unsafe fn mem_map( + addr_: *mut (), + len_: usize, + prot_: mprot, + flags_: mflags, + fd_: fd, + off_: filesize, + mem_: &mut *mut (), +) -> errno { + cloudabi_sys_mem_map(addr_, len_, prot_, flags_, fd_, off_, mem_) } /// Changes the protection of a memory mapping. @@ -2600,7 +2696,7 @@ pub unsafe fn mem_map(addr_: *mut (), len_: usize, prot_: mprot, flags_: mflags, /// New protection options. #[inline] pub unsafe fn mem_protect(mapping_: &mut [u8], prot_: mprot) -> errno { - cloudabi_sys_mem_protect(mapping_.as_mut_ptr() as *mut (), mapping_.len(), prot_) + cloudabi_sys_mem_protect(mapping_.as_mut_ptr() as *mut (), mapping_.len(), prot_) } /// Synchronizes a region of memory with its physical storage. @@ -2614,7 +2710,7 @@ pub unsafe fn mem_protect(mapping_: &mut [u8], prot_: mprot) -> errno { /// The method of synchronization. #[inline] pub unsafe fn mem_sync(mapping_: &mut [u8], flags_: msflags) -> errno { - cloudabi_sys_mem_sync(mapping_.as_mut_ptr() as *mut (), mapping_.len(), flags_) + cloudabi_sys_mem_sync(mapping_.as_mut_ptr() as *mut (), mapping_.len(), flags_) } /// Unmaps a region of memory. @@ -2625,7 +2721,7 @@ pub unsafe fn mem_sync(mapping_: &mut [u8], flags_: msflags) -> errno { /// The pages that needs to be unmapped. #[inline] pub unsafe fn mem_unmap(mapping_: &mut [u8]) -> errno { - cloudabi_sys_mem_unmap(mapping_.as_mut_ptr() as *mut (), mapping_.len()) + cloudabi_sys_mem_unmap(mapping_.as_mut_ptr() as *mut (), mapping_.len()) } /// Concurrently polls for the occurrence of a set of events. @@ -2644,8 +2740,13 @@ pub unsafe fn mem_unmap(mapping_: &mut [u8]) -> errno { /// **nevents**: /// The number of events stored. #[inline] -pub unsafe fn poll(in_: *const subscription, out_: *mut event, nsubscriptions_: usize, nevents_: *mut usize) -> errno { - cloudabi_sys_poll(in_, out_, nsubscriptions_, nevents_) +pub unsafe fn poll( + in_: *const subscription, + out_: *mut event, + nsubscriptions_: usize, + nevents_: *mut usize, +) -> errno { + cloudabi_sys_poll(in_, out_, nsubscriptions_, nevents_) } /// Replaces the process by a new executable. @@ -2683,7 +2784,7 @@ pub unsafe fn poll(in_: *const subscription, out_: *mut event, nsubscriptions_: /// execution. #[inline] pub unsafe fn proc_exec(fd_: fd, data_: &[u8], fds_: &[fd]) -> errno { - cloudabi_sys_proc_exec(fd_, data_.as_ptr() as *const (), data_.len(), fds_.as_ptr(), fds_.len()) + cloudabi_sys_proc_exec(fd_, data_.as_ptr() as *const (), data_.len(), fds_.as_ptr(), fds_.len()) } /// Terminates the process normally. @@ -2696,7 +2797,7 @@ pub unsafe fn proc_exec(fd_: fd, data_: &[u8], fds_: &[fd]) -> errno { /// through [`event.union.proc_terminate.exitcode`](struct.event_proc_terminate.html#structfield.exitcode). #[inline] pub unsafe fn proc_exit(rval_: exitcode) -> ! { - cloudabi_sys_proc_exit(rval_) + cloudabi_sys_proc_exit(rval_) } /// Forks the process of the calling thread. @@ -2721,7 +2822,7 @@ pub unsafe fn proc_exit(rval_: exitcode) -> ! { /// initial thread of the child process. #[inline] pub unsafe fn proc_fork(fd_: &mut fd, tid_: &mut tid) -> errno { - cloudabi_sys_proc_fork(fd_, tid_) + cloudabi_sys_proc_fork(fd_, tid_) } /// Sends a signal to the process of the calling thread. @@ -2736,7 +2837,7 @@ pub unsafe fn proc_fork(fd_: &mut fd, tid_: &mut tid) -> errno { /// [`event.union.proc_terminate.signal`](struct.event_proc_terminate.html#structfield.signal). #[inline] pub unsafe fn proc_raise(sig_: signal) -> errno { - cloudabi_sys_proc_raise(sig_) + cloudabi_sys_proc_raise(sig_) } /// Obtains random data from the kernel random number generator. @@ -2752,7 +2853,7 @@ pub unsafe fn proc_raise(sig_: signal) -> errno { /// data. #[inline] pub unsafe fn random_get(buf_: &mut [u8]) -> errno { - cloudabi_sys_random_get(buf_.as_mut_ptr() as *mut (), buf_.len()) + cloudabi_sys_random_get(buf_.as_mut_ptr() as *mut (), buf_.len()) } /// Receives a message on a socket. @@ -2770,7 +2871,7 @@ pub unsafe fn random_get(buf_: &mut [u8]) -> errno { /// Output parameters. #[inline] pub unsafe fn sock_recv(sock_: fd, in_: *const recv_in, out_: *mut recv_out) -> errno { - cloudabi_sys_sock_recv(sock_, in_, out_) + cloudabi_sys_sock_recv(sock_, in_, out_) } /// Sends a message on a socket. @@ -2787,7 +2888,7 @@ pub unsafe fn sock_recv(sock_: fd, in_: *const recv_in, out_: *mut recv_out) -> /// Output parameters. #[inline] pub unsafe fn sock_send(sock_: fd, in_: *const send_in, out_: *mut send_out) -> errno { - cloudabi_sys_sock_send(sock_, in_, out_) + cloudabi_sys_sock_send(sock_, in_, out_) } /// Shuts down socket send and receive channels. @@ -2802,7 +2903,7 @@ pub unsafe fn sock_send(sock_: fd, in_: *const send_in, out_: *mut send_out) -> /// down. #[inline] pub unsafe fn sock_shutdown(sock_: fd, how_: sdflags) -> errno { - cloudabi_sys_sock_shutdown(sock_, how_) + cloudabi_sys_sock_shutdown(sock_, how_) } /// Creates a new thread within the current process. @@ -2816,7 +2917,7 @@ pub unsafe fn sock_shutdown(sock_: fd, how_: sdflags) -> errno { /// The thread ID of the new thread. #[inline] pub unsafe fn thread_create(attr_: *mut threadattr, tid_: &mut tid) -> errno { - cloudabi_sys_thread_create(attr_, tid_) + cloudabi_sys_thread_create(attr_, tid_) } /// Terminates the calling thread. @@ -2836,11 +2937,11 @@ pub unsafe fn thread_create(attr_: *mut threadattr, tid_: &mut tid) -> errno { /// shared memory. #[inline] pub unsafe fn thread_exit(lock_: *mut lock, scope_: scope) -> ! { - cloudabi_sys_thread_exit(lock_, scope_) + cloudabi_sys_thread_exit(lock_, scope_) } /// Temporarily yields execution of the calling thread. #[inline] pub unsafe fn thread_yield() -> errno { - cloudabi_sys_thread_yield() + cloudabi_sys_thread_yield() } diff --git a/src/libstd/sys/cloudabi/condvar.rs b/src/libstd/sys/cloudabi/condvar.rs index ec1fca7805..3ba51d7749 100644 --- a/src/libstd/sys/cloudabi/condvar.rs +++ b/src/libstd/sys/cloudabi/condvar.rs @@ -18,9 +18,8 @@ pub struct Condvar { unsafe impl Send for Condvar {} unsafe impl Sync for Condvar {} -const NEW: Condvar = Condvar { - condvar: UnsafeCell::new(AtomicU32::new(abi::CONDVAR_HAS_NO_WAITERS.0)), -}; +const NEW: Condvar = + Condvar { condvar: UnsafeCell::new(AtomicU32::new(abi::CONDVAR_HAS_NO_WAITERS.0)) }; impl Condvar { pub const fn new() -> Condvar { @@ -33,11 +32,7 @@ impl Condvar { let condvar = self.condvar.get(); if (*condvar).load(Ordering::Relaxed) != abi::CONDVAR_HAS_NO_WAITERS.0 { let ret = abi::condvar_signal(condvar as *mut abi::condvar, abi::scope::PRIVATE, 1); - assert_eq!( - ret, - abi::errno::SUCCESS, - "Failed to signal on condition variable" - ); + assert_eq!(ret, abi::errno::SUCCESS, "Failed to signal on condition variable"); } } @@ -49,11 +44,7 @@ impl Condvar { abi::scope::PRIVATE, abi::nthreads::max_value(), ); - assert_eq!( - ret, - abi::errno::SUCCESS, - "Failed to broadcast on condition variable" - ); + assert_eq!(ret, abi::errno::SUCCESS, "Failed to broadcast on condition variable"); } } @@ -81,17 +72,8 @@ impl Condvar { }; let mut event: mem::MaybeUninit<abi::event> = mem::MaybeUninit::uninit(); let mut nevents: mem::MaybeUninit<usize> = mem::MaybeUninit::uninit(); - let ret = abi::poll( - &subscription, - event.as_mut_ptr(), - 1, - nevents.as_mut_ptr() - ); - assert_eq!( - ret, - abi::errno::SUCCESS, - "Failed to wait on condition variable" - ); + let ret = abi::poll(&subscription, event.as_mut_ptr(), 1, nevents.as_mut_ptr()); + assert_eq!(ret, abi::errno::SUCCESS, "Failed to wait on condition variable"); assert_eq!( event.assume_init().error, abi::errno::SUCCESS, @@ -109,8 +91,8 @@ impl Condvar { // Call into the kernel to wait on the condition variable. let condvar = self.condvar.get(); - let timeout = checked_dur2intervals(&dur) - .expect("overflow converting duration to nanoseconds"); + let timeout = + checked_dur2intervals(&dur).expect("overflow converting duration to nanoseconds"); let subscriptions = [ abi::subscription { type_: abi::eventtype::CONDVAR, @@ -142,13 +124,9 @@ impl Condvar { subscriptions.as_ptr(), mem::MaybeUninit::first_ptr_mut(&mut events), 2, - nevents.as_mut_ptr() - ); - assert_eq!( - ret, - abi::errno::SUCCESS, - "Failed to wait on condition variable" + nevents.as_mut_ptr(), ); + assert_eq!(ret, abi::errno::SUCCESS, "Failed to wait on condition variable"); let nevents = nevents.assume_init(); for i in 0..nevents { assert_eq!( diff --git a/src/libstd/sys/cloudabi/mod.rs b/src/libstd/sys/cloudabi/mod.rs index 2fb10cc370..e5f1dd9843 100644 --- a/src/libstd/sys/cloudabi/mod.rs +++ b/src/libstd/sys/cloudabi/mod.rs @@ -60,10 +60,7 @@ pub use libc::strlen; pub fn hashmap_random_keys() -> (u64, u64) { unsafe { let mut v: mem::MaybeUninit<(u64, u64)> = mem::MaybeUninit::uninit(); - libc::arc4random_buf( - v.as_mut_ptr() as *mut libc::c_void, - mem::size_of_val(&v) - ); + libc::arc4random_buf(v.as_mut_ptr() as *mut libc::c_void, mem::size_of_val(&v)); v.assume_init() } } diff --git a/src/libstd/sys/cloudabi/mutex.rs b/src/libstd/sys/cloudabi/mutex.rs index 0e30d3a1c6..4aa25e2505 100644 --- a/src/libstd/sys/cloudabi/mutex.rs +++ b/src/libstd/sys/cloudabi/mutex.rs @@ -56,7 +56,7 @@ impl ReentrantMutex { pub unsafe fn uninitialized() -> ReentrantMutex { ReentrantMutex { lock: UnsafeCell::new(MaybeUninit::uninit()), - recursion: UnsafeCell::new(MaybeUninit::uninit()) + recursion: UnsafeCell::new(MaybeUninit::uninit()), } } diff --git a/src/libstd/sys/cloudabi/rwlock.rs b/src/libstd/sys/cloudabi/rwlock.rs index 73499d65a0..b8af5af1d7 100644 --- a/src/libstd/sys/cloudabi/rwlock.rs +++ b/src/libstd/sys/cloudabi/rwlock.rs @@ -23,9 +23,7 @@ pub unsafe fn raw(r: &RWLock) -> *mut AtomicU32 { unsafe impl Send for RWLock {} unsafe impl Sync for RWLock {} -const NEW: RWLock = RWLock { - lock: UnsafeCell::new(AtomicU32::new(abi::LOCK_UNLOCKED.0)), -}; +const NEW: RWLock = RWLock { lock: UnsafeCell::new(AtomicU32::new(abi::LOCK_UNLOCKED.0)) }; impl RWLock { pub const fn new() -> RWLock { @@ -79,11 +77,7 @@ impl RWLock { let ret = abi::poll(&subscription, event.as_mut_ptr(), 1, nevents.as_mut_ptr()); assert_eq!(ret, abi::errno::SUCCESS, "Failed to acquire read lock"); let event = event.assume_init(); - assert_eq!( - event.error, - abi::errno::SUCCESS, - "Failed to acquire read lock" - ); + assert_eq!(event.error, abi::errno::SUCCESS, "Failed to acquire read lock"); RDLOCKS_ACQUIRED += 1; } @@ -122,11 +116,7 @@ impl RWLock { } else { // No threads waiting or not the last read lock. Just decrement // the read lock count. - assert_ne!( - old & !abi::LOCK_KERNEL_MANAGED.0, - 0, - "This rwlock is not locked" - ); + assert_ne!(old & !abi::LOCK_KERNEL_MANAGED.0, 0, "This rwlock is not locked"); assert_eq!( old & abi::LOCK_WRLOCKED.0, 0, @@ -189,11 +179,7 @@ impl RWLock { let ret = abi::poll(&subscription, event.as_mut_ptr(), 1, nevents.as_mut_ptr()); assert_eq!(ret, abi::errno::SUCCESS, "Failed to acquire write lock"); let event = event.assume_init(); - assert_eq!( - event.error, - abi::errno::SUCCESS, - "Failed to acquire write lock" - ); + assert_eq!(event.error, abi::errno::SUCCESS, "Failed to acquire write lock"); } } diff --git a/src/libstd/sys/cloudabi/shims/os.rs b/src/libstd/sys/cloudabi/shims/os.rs index 944b9525b3..779e6d54b7 100644 --- a/src/libstd/sys/cloudabi/shims/os.rs +++ b/src/libstd/sys/cloudabi/shims/os.rs @@ -63,6 +63,7 @@ impl fmt::Display for JoinPathsError { } impl StdError for JoinPathsError { + #[allow(deprecated)] fn description(&self) -> &str { "not supported on CloudABI yet" } diff --git a/src/libstd/sys/hermit/fast_thread_local.rs b/src/libstd/sys/hermit/fast_thread_local.rs index 05464787a0..1108e2545b 100644 --- a/src/libstd/sys/hermit/fast_thread_local.rs +++ b/src/libstd/sys/hermit/fast_thread_local.rs @@ -1,4 +1,4 @@ #![cfg(target_thread_local)] -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] pub use crate::sys_common::thread_local::register_dtor_fallback as register_dtor; diff --git a/src/libstd/sys/hermit/fd.rs b/src/libstd/sys/hermit/fd.rs index f2f61fdfb8..97d1a38b41 100644 --- a/src/libstd/sys/hermit/fd.rs +++ b/src/libstd/sys/hermit/fd.rs @@ -1,4 +1,4 @@ -#![unstable(reason = "not public", issue = "0", feature = "fd")] +#![unstable(reason = "not public", issue = "none", feature = "fd")] use crate::io::{self, ErrorKind, Read}; use crate::mem; diff --git a/src/libstd/sys/hermit/os.rs b/src/libstd/sys/hermit/os.rs index ad63b0e0c1..78eabf8f81 100644 --- a/src/libstd/sys/hermit/os.rs +++ b/src/libstd/sys/hermit/os.rs @@ -6,7 +6,6 @@ use crate::io; use crate::marker::PhantomData; use crate::memchr; use crate::path::{self, PathBuf}; -use crate::ptr; use crate::str; use crate::sync::Mutex; use crate::sys::hermit::abi; @@ -61,6 +60,7 @@ impl fmt::Display for JoinPathsError { } impl StdError for JoinPathsError { + #[allow(deprecated)] fn description(&self) -> &str { "not supported on hermit yet" } @@ -76,13 +76,17 @@ pub fn init_environment(env: *const *const i8) { unsafe { ENV = Some(Mutex::new(HashMap::new())); + if env.is_null() { + return; + } + let mut guard = ENV.as_ref().unwrap().lock().unwrap(); let mut environ = env; - while environ != ptr::null() && *environ != ptr::null() { + while !(*environ).is_null() { if let Some((key, value)) = parse(CStr::from_ptr(*environ).to_bytes()) { guard.insert(key, value); } - environ = environ.offset(1); + environ = environ.add(1); } } diff --git a/src/libstd/sys/hermit/thread_local.rs b/src/libstd/sys/hermit/thread_local.rs index ba967c7676..c6f8adb216 100644 --- a/src/libstd/sys/hermit/thread_local.rs +++ b/src/libstd/sys/hermit/thread_local.rs @@ -18,14 +18,14 @@ static KEYS_LOCK: Mutex = Mutex::new(); static mut LOCALS: *mut BTreeMap<Key, *mut u8> = ptr::null_mut(); unsafe fn keys() -> &'static mut BTreeMap<Key, Option<Dtor>> { - if KEYS == ptr::null_mut() { + if KEYS.is_null() { KEYS = Box::into_raw(Box::new(BTreeMap::new())); } &mut *KEYS } unsafe fn locals() -> &'static mut BTreeMap<Key, *mut u8> { - if LOCALS == ptr::null_mut() { + if LOCALS.is_null() { LOCALS = Box::into_raw(Box::new(BTreeMap::new())); } &mut *LOCALS diff --git a/src/libstd/sys/mod.rs b/src/libstd/sys/mod.rs index 9eeab34643..875ff1af92 100644 --- a/src/libstd/sys/mod.rs +++ b/src/libstd/sys/mod.rs @@ -69,7 +69,7 @@ cfg_if::cfg_if! { // On CloudABI and wasm right now the module below doesn't compile // (missing things in `libc` which is empty) so just omit everything // with an empty module - #[unstable(issue = "0", feature = "std_internals")] + #[unstable(issue = "none", feature = "std_internals")] #[allow(missing_docs)] pub mod unix_ext {} } else { @@ -92,7 +92,7 @@ cfg_if::cfg_if! { all(target_vendor = "fortanix", target_env = "sgx")))] { // On CloudABI and wasm right now the shim below doesn't compile, so // just omit it - #[unstable(issue = "0", feature = "std_internals")] + #[unstable(issue = "none", feature = "std_internals")] #[allow(missing_docs)] pub mod windows_ext {} } else { diff --git a/src/libstd/sys/sgx/abi/mem.rs b/src/libstd/sys/sgx/abi/mem.rs index d9051733da..500e62b1cb 100644 --- a/src/libstd/sys/sgx/abi/mem.rs +++ b/src/libstd/sys/sgx/abi/mem.rs @@ -10,7 +10,7 @@ pub(crate) unsafe fn rel_ptr_mut<T>(offset: u64) -> *mut T { (image_base() + offset) as *mut T } -extern { +extern "C" { static ENCLAVE_SIZE: usize; } @@ -33,8 +33,7 @@ pub fn image_base() -> u64 { pub fn is_enclave_range(p: *const u8, len: usize) -> bool { let start = p as u64; let end = start + (len as u64); - start >= image_base() && - end <= image_base() + (unsafe { ENCLAVE_SIZE } as u64) // unsafe ok: link-time constant + start >= image_base() && end <= image_base() + (unsafe { ENCLAVE_SIZE } as u64) // unsafe ok: link-time constant } /// Returns `true` if the specified memory range is in userspace. @@ -44,6 +43,5 @@ pub fn is_enclave_range(p: *const u8, len: usize) -> bool { pub fn is_user_range(p: *const u8, len: usize) -> bool { let start = p as u64; let end = start + (len as u64); - end <= image_base() || - start >= image_base() + (unsafe { ENCLAVE_SIZE } as u64) // unsafe ok: link-time constant + end <= image_base() || start >= image_base() + (unsafe { ENCLAVE_SIZE } as u64) // unsafe ok: link-time constant } diff --git a/src/libstd/sys/sgx/abi/tls.rs b/src/libstd/sys/sgx/abi/tls.rs index 81a766e367..2b0485c4f0 100644 --- a/src/libstd/sys/sgx/abi/tls.rs +++ b/src/libstd/sys/sgx/abi/tls.rs @@ -70,7 +70,7 @@ impl<'a> Drop for ActiveTls<'a> { any_non_null_dtor = false; for (value, dtor) in TLS_KEY_IN_USE.iter().filter_map(&value_with_destructor) { let value = value.replace(ptr::null_mut()); - if value != ptr::null_mut() { + if !value.is_null() { any_non_null_dtor = true; unsafe { dtor(value) } } diff --git a/src/libstd/sys/sgx/condvar.rs b/src/libstd/sys/sgx/condvar.rs index cc1c04a83e..9c5c086184 100644 --- a/src/libstd/sys/sgx/condvar.rs +++ b/src/libstd/sys/sgx/condvar.rs @@ -1,7 +1,7 @@ use crate::sys::mutex::Mutex; use crate::time::Duration; -use super::waitqueue::{WaitVariable, WaitQueue, SpinMutex}; +use super::waitqueue::{SpinMutex, WaitQueue, WaitVariable}; pub struct Condvar { inner: SpinMutex<WaitVariable<()>>, diff --git a/src/libstd/sys/sgx/mod.rs b/src/libstd/sys/sgx/mod.rs index 601957acd5..83cee0cf35 100644 --- a/src/libstd/sys/sgx/mod.rs +++ b/src/libstd/sys/sgx/mod.rs @@ -28,16 +28,15 @@ pub mod pipe; pub mod process; pub mod rwlock; pub mod stack_overflow; +pub mod stdio; pub mod thread; pub mod thread_local; pub mod time; -pub mod stdio; pub use crate::sys_common::os_str_bytes as os_str; #[cfg(not(test))] -pub fn init() { -} +pub fn init() {} /// This function is used to implement functionality that simply doesn't exist. /// Programs relying on this functionality will need to deal with the error. @@ -46,8 +45,7 @@ pub fn unsupported<T>() -> crate::io::Result<T> { } pub fn unsupported_err() -> crate::io::Error { - crate::io::Error::new(ErrorKind::Other, - "operation not supported on SGX yet") + crate::io::Error::new(ErrorKind::Other, "operation not supported on SGX yet") } /// This function is used to implement various functions that doesn't exist, @@ -58,8 +56,10 @@ pub fn unsupported_err() -> crate::io::Error { pub fn sgx_ineffective<T>(v: T) -> crate::io::Result<T> { static SGX_INEFFECTIVE_ERROR: AtomicBool = AtomicBool::new(false); if SGX_INEFFECTIVE_ERROR.load(Ordering::Relaxed) { - Err(crate::io::Error::new(ErrorKind::Other, - "operation can't be trusted to have any effect on SGX")) + Err(crate::io::Error::new( + ErrorKind::Other, + "operation can't be trusted to have any effect on SGX", + )) } else { Ok(v) } @@ -121,7 +121,7 @@ pub unsafe fn strlen(mut s: *const c_char) -> usize { n += 1; s = s.offset(1); } - return n + return n; } pub unsafe fn abort_internal() -> ! { diff --git a/src/libstd/sys/sgx/mutex.rs b/src/libstd/sys/sgx/mutex.rs index 662da8b3f6..eebbea1b28 100644 --- a/src/libstd/sys/sgx/mutex.rs +++ b/src/libstd/sys/sgx/mutex.rs @@ -2,7 +2,7 @@ use fortanix_sgx_abi::Tcs; use super::abi::thread; -use super::waitqueue::{WaitVariable, WaitQueue, SpinMutex, NotifiedTcs, try_lock_or_false}; +use super::waitqueue::{try_lock_or_false, NotifiedTcs, SpinMutex, WaitQueue, WaitVariable}; pub struct Mutex { inner: SpinMutex<WaitVariable<bool>>, @@ -22,8 +22,8 @@ impl Mutex { let mut guard = self.inner.lock(); if *guard.lock_var() { // Another thread has the lock, wait - WaitQueue::wait(guard, ||{}) - // Another thread has passed the lock to us + WaitQueue::wait(guard, || {}) + // Another thread has passed the lock to us } else { // We are just now obtaining the lock *guard.lock_var_mut() = true; @@ -60,7 +60,7 @@ impl Mutex { struct ReentrantLock { owner: Option<Tcs>, - count: usize + count: usize, } pub struct ReentrantMutex { @@ -70,7 +70,7 @@ pub struct ReentrantMutex { impl ReentrantMutex { pub const fn uninitialized() -> ReentrantMutex { ReentrantMutex { - inner: SpinMutex::new(WaitVariable::new(ReentrantLock { owner: None, count: 0 })) + inner: SpinMutex::new(WaitVariable::new(ReentrantLock { owner: None, count: 0 })), } } @@ -83,14 +83,14 @@ impl ReentrantMutex { match guard.lock_var().owner { Some(tcs) if tcs != thread::current() => { // Another thread has the lock, wait - WaitQueue::wait(guard, ||{}); + WaitQueue::wait(guard, || {}); // Another thread has passed the lock to us - }, + } _ => { // We are just now obtaining the lock guard.lock_var_mut().owner = Some(thread::current()); guard.lock_var_mut().count += 1; - }, + } } } @@ -105,7 +105,7 @@ impl ReentrantMutex { // No other waiters, unlock guard.lock_var_mut().count = 0; guard.lock_var_mut().owner = None; - }, + } Ok(mut guard) => { // There was a thread waiting, just pass the lock if let NotifiedTcs::Single(tcs) = guard.notified_tcs() { @@ -125,13 +125,13 @@ impl ReentrantMutex { Some(tcs) if tcs != thread::current() => { // Another thread has the lock false - }, + } _ => { // We are just now obtaining the lock guard.lock_var_mut().owner = Some(thread::current()); guard.lock_var_mut().count += 1; true - }, + } } } diff --git a/src/libstd/sys/sgx/net.rs b/src/libstd/sys/sgx/net.rs index f36687b4d3..bd0652ab46 100644 --- a/src/libstd/sys/sgx/net.rs +++ b/src/libstd/sys/sgx/net.rs @@ -440,6 +440,7 @@ pub struct NonIpSockAddr { } impl error::Error for NonIpSockAddr { + #[allow(deprecated)] fn description(&self) -> &str { "Failed to convert address to SocketAddr" } diff --git a/src/libstd/sys/sgx/os.rs b/src/libstd/sys/sgx/os.rs index 2c5b313421..56fc84b4a3 100644 --- a/src/libstd/sys/sgx/os.rs +++ b/src/libstd/sys/sgx/os.rs @@ -19,7 +19,7 @@ pub fn errno() -> i32 { pub fn error_string(errno: i32) -> String { if errno == RESULT_SUCCESS { - "operation succesful".into() + "operation successful".into() } else if ((Error::UserRangeStart as _)..=(Error::UserRangeEnd as _)).contains(&errno) { format!("user-specified error {:08x}", errno) } else { @@ -66,6 +66,7 @@ impl fmt::Display for JoinPathsError { } impl StdError for JoinPathsError { + #[allow(deprecated)] fn description(&self) -> &str { "not supported in SGX yet" } diff --git a/src/libstd/sys/sgx/rwlock.rs b/src/libstd/sys/sgx/rwlock.rs index e2f94b1d92..fda2bb504d 100644 --- a/src/libstd/sys/sgx/rwlock.rs +++ b/src/libstd/sys/sgx/rwlock.rs @@ -31,8 +31,8 @@ impl RWLock { if *wguard.lock_var() || !wguard.queue_empty() { // Another thread has or is waiting for the write lock, wait drop(wguard); - WaitQueue::wait(rguard, ||{}); - // Another thread has passed the lock to us + WaitQueue::wait(rguard, || {}); + // Another thread has passed the lock to us } else { // No waiting writers, acquire the read lock *rguard.lock_var_mut() = @@ -62,8 +62,8 @@ impl RWLock { if *wguard.lock_var() || rguard.lock_var().is_some() { // Another thread has the lock, wait drop(rguard); - WaitQueue::wait(wguard, ||{}); - // Another thread has passed the lock to us + WaitQueue::wait(wguard, || {}); + // Another thread has passed the lock to us } else { // We are just now obtaining the lock *wguard.lock_var_mut() = true; @@ -133,7 +133,7 @@ impl RWLock { } else { // No readers waiting, the lock is released } - }, + } Ok(wguard) => { // There was a thread waiting for write, just pass the lock wguard.drop_after(rguard); @@ -202,8 +202,8 @@ pub unsafe extern "C" fn __rust_rwlock_unlock(p: *mut RWLock) -> i32 { #[cfg(test)] mod tests { use super::*; - use core::array::FixedSizeArray; use crate::mem::{self, MaybeUninit}; + use core::array::FixedSizeArray; // Verify that the bytes of initialized RWLock are the same as in // libunwind. If they change, `src/UnwindRustSgx.h` in libunwind needs to @@ -211,22 +211,14 @@ mod tests { #[test] fn test_c_rwlock_initializer() { const RWLOCK_INIT: &[u8] = &[ - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ]; #[inline(never)] @@ -247,10 +239,7 @@ mod tests { zero_stack(); let mut init = MaybeUninit::<RWLock>::zeroed(); rwlock_new(&mut init); - assert_eq!( - mem::transmute::<_, [u8; 128]>(init.assume_init()).as_slice(), - RWLOCK_INIT - ) + assert_eq!(mem::transmute::<_, [u8; 128]>(init.assume_init()).as_slice(), RWLOCK_INIT) }; } } diff --git a/src/libstd/sys/sgx/waitqueue.rs b/src/libstd/sys/sgx/waitqueue.rs index 3cb40e509b..6e50f161b3 100644 --- a/src/libstd/sys/sgx/waitqueue.rs +++ b/src/libstd/sys/sgx/waitqueue.rs @@ -1,3 +1,4 @@ +use crate::num::NonZeroUsize; /// A simple queue implementation for synchronization primitives. /// /// This queue is used to implement condition variable and mutexes. @@ -9,23 +10,21 @@ /// Since userspace may send spurious wake-ups, the wakeup event state is /// recorded in the enclave. The wakeup event state is protected by a spinlock. /// The queue and associated wait state are stored in a `WaitVariable`. - use crate::ops::{Deref, DerefMut}; -use crate::num::NonZeroUsize; -use fortanix_sgx_abi::{Tcs, EV_UNPARK, WAIT_INDEFINITE}; -use super::abi::usercalls; use super::abi::thread; +use super::abi::usercalls; +use fortanix_sgx_abi::{Tcs, EV_UNPARK, WAIT_INDEFINITE}; +pub use self::spin_mutex::{try_lock_or_false, SpinMutex, SpinMutexGuard}; use self::unsafe_list::{UnsafeList, UnsafeListEntry}; -pub use self::spin_mutex::{SpinMutex, SpinMutexGuard, try_lock_or_false}; /// An queue entry in a `WaitQueue`. struct WaitEntry { /// TCS address of the thread that is waiting tcs: Tcs, /// Whether this thread has been notified to be awoken - wake: bool + wake: bool, } /// Data stored with a `WaitQueue` alongside it. This ensures accesses to the @@ -36,15 +35,12 @@ struct WaitEntry { #[derive(Default)] pub struct WaitVariable<T> { queue: WaitQueue, - lock: T + lock: T, } impl<T> WaitVariable<T> { pub const fn new(var: T) -> Self { - WaitVariable { - queue: WaitQueue::new(), - lock: var - } + WaitVariable { queue: WaitQueue::new(), lock: var } } pub fn queue_empty(&self) -> bool { @@ -63,14 +59,14 @@ impl<T> WaitVariable<T> { #[derive(Copy, Clone)] pub enum NotifiedTcs { Single(Tcs), - All { count: NonZeroUsize } + All { count: NonZeroUsize }, } /// An RAII guard that will notify a set of target threads as well as unlock /// a mutex on drop. pub struct WaitGuard<'a, T: 'a> { mutex_guard: Option<SpinMutexGuard<'a, WaitVariable<T>>>, - notified_tcs: NotifiedTcs + notified_tcs: NotifiedTcs, } /// A queue of threads that are waiting on some synchronization primitive. @@ -125,7 +121,7 @@ impl<'a, T> Drop for WaitGuard<'a, T> { drop(self.mutex_guard.take()); let target_tcs = match self.notified_tcs { NotifiedTcs::Single(tcs) => Some(tcs), - NotifiedTcs::All { .. } => None + NotifiedTcs::All { .. } => None, }; rtunwrap!(Ok, usercalls::send(EV_UNPARK, target_tcs)); } @@ -133,9 +129,7 @@ impl<'a, T> Drop for WaitGuard<'a, T> { impl WaitQueue { pub const fn new() -> Self { - WaitQueue { - inner: UnsafeList::new() - } + WaitQueue { inner: UnsafeList::new() } } pub fn is_empty(&self) -> bool { @@ -151,7 +145,7 @@ impl WaitQueue { unsafe { let mut entry = UnsafeListEntry::new(SpinMutex::new(WaitEntry { tcs: thread::current(), - wake: false + wake: false, })); let entry = guard.queue.inner.push(&mut entry); drop(guard); @@ -169,19 +163,16 @@ impl WaitQueue { /// /// If a waiter is found, a `WaitGuard` is returned which will notify the /// waiter when it is dropped. - pub fn notify_one<T>(mut guard: SpinMutexGuard<'_, WaitVariable<T>>) - -> Result<WaitGuard<'_, T>, SpinMutexGuard<'_, WaitVariable<T>>> - { + pub fn notify_one<T>( + mut guard: SpinMutexGuard<'_, WaitVariable<T>>, + ) -> Result<WaitGuard<'_, T>, SpinMutexGuard<'_, WaitVariable<T>>> { unsafe { if let Some(entry) = guard.queue.inner.pop() { let mut entry_guard = entry.lock(); let tcs = entry_guard.tcs; entry_guard.wake = true; drop(entry); - Ok(WaitGuard { - mutex_guard: Some(guard), - notified_tcs: NotifiedTcs::Single(tcs) - }) + Ok(WaitGuard { mutex_guard: Some(guard), notified_tcs: NotifiedTcs::Single(tcs) }) } else { Err(guard) } @@ -193,9 +184,9 @@ impl WaitQueue { /// /// If at least one waiter is found, a `WaitGuard` is returned which will /// notify all waiters when it is dropped. - pub fn notify_all<T>(mut guard: SpinMutexGuard<'_, WaitVariable<T>>) - -> Result<WaitGuard<'_, T>, SpinMutexGuard<'_, WaitVariable<T>>> - { + pub fn notify_all<T>( + mut guard: SpinMutexGuard<'_, WaitVariable<T>>, + ) -> Result<WaitGuard<'_, T>, SpinMutexGuard<'_, WaitVariable<T>>> { unsafe { let mut count = 0; while let Some(entry) = guard.queue.inner.pop() { @@ -204,10 +195,7 @@ impl WaitQueue { entry_guard.wake = true; } if let Some(count) = NonZeroUsize::new(count) { - Ok(WaitGuard { - mutex_guard: Some(guard), - notified_tcs: NotifiedTcs::All { count } - }) + Ok(WaitGuard { mutex_guard: Some(guard), notified_tcs: NotifiedTcs::All { count } }) } else { Err(guard) } @@ -218,29 +206,22 @@ impl WaitQueue { /// A doubly-linked list where callers are in charge of memory allocation /// of the nodes in the list. mod unsafe_list { - use crate::ptr::NonNull; use crate::mem; + use crate::ptr::NonNull; pub struct UnsafeListEntry<T> { next: NonNull<UnsafeListEntry<T>>, prev: NonNull<UnsafeListEntry<T>>, - value: Option<T> + value: Option<T>, } impl<T> UnsafeListEntry<T> { fn dummy() -> Self { - UnsafeListEntry { - next: NonNull::dangling(), - prev: NonNull::dangling(), - value: None - } + UnsafeListEntry { next: NonNull::dangling(), prev: NonNull::dangling(), value: None } } pub fn new(value: T) -> Self { - UnsafeListEntry { - value: Some(value), - ..Self::dummy() - } + UnsafeListEntry { value: Some(value), ..Self::dummy() } } } @@ -252,10 +233,7 @@ mod unsafe_list { impl<T> UnsafeList<T> { pub const fn new() -> Self { unsafe { - UnsafeList { - head_tail: NonNull::new_unchecked(1 as _), - head_tail_entry: None - } + UnsafeList { head_tail: NonNull::new_unchecked(1 as _), head_tail_entry: None } } } @@ -416,8 +394,8 @@ mod unsafe_list { // FIXME: Perhaps use Intel TSX to avoid locking? mod spin_mutex { use crate::cell::UnsafeCell; - use crate::sync::atomic::{AtomicBool, Ordering, spin_loop_hint}; use crate::ops::{Deref, DerefMut}; + use crate::sync::atomic::{spin_loop_hint, AtomicBool, Ordering}; #[derive(Default)] pub struct SpinMutex<T> { @@ -437,20 +415,19 @@ mod spin_mutex { impl<T> SpinMutex<T> { pub const fn new(value: T) -> Self { - SpinMutex { - value: UnsafeCell::new(value), - lock: AtomicBool::new(false) - } + SpinMutex { value: UnsafeCell::new(value), lock: AtomicBool::new(false) } } #[inline(always)] pub fn lock(&self) -> SpinMutexGuard<'_, T> { loop { match self.try_lock() { - None => while self.lock.load(Ordering::Relaxed) { - spin_loop_hint() - }, - Some(guard) => return guard + None => { + while self.lock.load(Ordering::Relaxed) { + spin_loop_hint() + } + } + Some(guard) => return guard, } } } @@ -458,9 +435,7 @@ mod spin_mutex { #[inline(always)] pub fn try_lock(&self) -> Option<SpinMutexGuard<'_, T>> { if !self.lock.compare_and_swap(false, true, Ordering::Acquire) { - Some(SpinMutexGuard { - mutex: self, - }) + Some(SpinMutexGuard { mutex: self }) } else { None } @@ -468,31 +443,21 @@ mod spin_mutex { } /// Lock the Mutex or return false. - pub macro try_lock_or_false { - ($e:expr) => { - if let Some(v) = $e.try_lock() { - v - } else { - return false - } - } + pub macro try_lock_or_false($e:expr) { + if let Some(v) = $e.try_lock() { v } else { return false } } impl<'a, T> Deref for SpinMutexGuard<'a, T> { type Target = T; fn deref(&self) -> &T { - unsafe { - &*self.mutex.value.get() - } + unsafe { &*self.mutex.value.get() } } } impl<'a, T> DerefMut for SpinMutexGuard<'a, T> { fn deref_mut(&mut self) -> &mut T { - unsafe { - &mut*self.mutex.value.get() - } + unsafe { &mut *self.mutex.value.get() } } } @@ -509,7 +474,7 @@ mod spin_mutex { use super::*; use crate::sync::Arc; use crate::thread; - use crate::time::{SystemTime, Duration}; + use crate::time::{Duration, SystemTime}; #[test] fn sleep() { @@ -552,7 +517,7 @@ mod tests { assert!(WaitQueue::notify_one(wq2.lock()).is_ok()); }); - WaitQueue::wait(locked, ||{}); + WaitQueue::wait(locked, || {}); t1.join().unwrap(); } diff --git a/src/libstd/sys/unix/android.rs b/src/libstd/sys/unix/android.rs index c5e9d66e85..8fc2599f0d 100644 --- a/src/libstd/sys/unix/android.rs +++ b/src/libstd/sys/unix/android.rs @@ -93,12 +93,12 @@ pub fn ftruncate64(fd: c_int, size: u64) -> io::Result<()> { unsafe { match ftruncate64.get() { - Some(f) => cvt_r(|| f(fd, size as i64)).map(|_| ()), + Some(f) => cvt_r(|| f(fd, size as i64)).map(drop), None => { if size > i32::max_value() as u64 { Err(io::Error::new(io::ErrorKind::InvalidInput, "cannot truncate >2GB")) } else { - cvt_r(|| ftruncate(fd, size as i32)).map(|_| ()) + cvt_r(|| ftruncate(fd, size as i32)).map(drop) } } } @@ -107,7 +107,7 @@ pub fn ftruncate64(fd: c_int, size: u64) -> io::Result<()> { #[cfg(target_pointer_width = "64")] pub fn ftruncate64(fd: c_int, size: u64) -> io::Result<()> { - unsafe { cvt_r(|| ftruncate(fd, size as i64)).map(|_| ()) } + unsafe { cvt_r(|| ftruncate(fd, size as i64)).map(drop) } } #[cfg(target_pointer_width = "32")] diff --git a/src/libstd/sys/unix/args.rs b/src/libstd/sys/unix/args.rs index 2ed1585395..09acc3f6e3 100644 --- a/src/libstd/sys/unix/args.rs +++ b/src/libstd/sys/unix/args.rs @@ -10,10 +10,14 @@ use crate::marker::PhantomData; use crate::vec; /// One-time global initialization. -pub unsafe fn init(argc: isize, argv: *const *const u8) { imp::init(argc, argv) } +pub unsafe fn init(argc: isize, argv: *const *const u8) { + imp::init(argc, argv) +} /// One-time global cleanup. -pub unsafe fn cleanup() { imp::cleanup() } +pub unsafe fn cleanup() { + imp::cleanup() +} /// Returns the command line arguments pub fn args() -> Args { @@ -33,36 +37,46 @@ impl Args { impl Iterator for Args { type Item = OsString; - fn next(&mut self) -> Option<OsString> { self.iter.next() } - fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() } + fn next(&mut self) -> Option<OsString> { + self.iter.next() + } + fn size_hint(&self) -> (usize, Option<usize>) { + self.iter.size_hint() + } } impl ExactSizeIterator for Args { - fn len(&self) -> usize { self.iter.len() } + fn len(&self) -> usize { + self.iter.len() + } } impl DoubleEndedIterator for Args { - fn next_back(&mut self) -> Option<OsString> { self.iter.next_back() } + fn next_back(&mut self) -> Option<OsString> { + self.iter.next_back() + } } -#[cfg(any(target_os = "linux", - target_os = "android", - target_os = "freebsd", - target_os = "dragonfly", - target_os = "netbsd", - target_os = "openbsd", - target_os = "solaris", - target_os = "emscripten", - target_os = "haiku", - target_os = "l4re", - target_os = "fuchsia", - target_os = "redox"))] +#[cfg(any( + target_os = "linux", + target_os = "android", + target_os = "freebsd", + target_os = "dragonfly", + target_os = "netbsd", + target_os = "openbsd", + target_os = "solaris", + target_os = "emscripten", + target_os = "haiku", + target_os = "l4re", + target_os = "fuchsia", + target_os = "redox" +))] mod imp { - use crate::os::unix::prelude::*; - use crate::ptr; + use super::Args; use crate::ffi::{CStr, OsString}; use crate::marker::PhantomData; - use super::Args; + use crate::os::unix::prelude::*; + use crate::ptr; use crate::sys_common::mutex::Mutex; @@ -83,10 +97,7 @@ mod imp { // On Linux-GNU, we rely on `ARGV_INIT_ARRAY` below to initialize // `ARGC` and `ARGV`. But in Miri that does not actually happen so we // still initialize here. - #[cfg(any( - miri, - not(all(target_os = "linux", target_env = "gnu")) - ))] + #[cfg(any(miri, not(all(target_os = "linux", target_env = "gnu"))))] really_init(_argc, _argv); } @@ -119,57 +130,52 @@ mod imp { } pub fn args() -> Args { - Args { - iter: clone().into_iter(), - _dont_send_or_sync_me: PhantomData - } + Args { iter: clone().into_iter(), _dont_send_or_sync_me: PhantomData } } fn clone() -> Vec<OsString> { unsafe { let _guard = LOCK.lock(); - (0..ARGC).map(|i| { - let cstr = CStr::from_ptr(*ARGV.offset(i) as *const libc::c_char); - OsStringExt::from_vec(cstr.to_bytes().to_vec()) - }).collect() + (0..ARGC) + .map(|i| { + let cstr = CStr::from_ptr(*ARGV.offset(i) as *const libc::c_char); + OsStringExt::from_vec(cstr.to_bytes().to_vec()) + }) + .collect() } } } -#[cfg(any(target_os = "macos", - target_os = "ios"))] +#[cfg(any(target_os = "macos", target_os = "ios"))] mod imp { + use super::Args; use crate::ffi::CStr; use crate::marker::PhantomData; - use super::Args; - pub unsafe fn init(_argc: isize, _argv: *const *const u8) { - } + pub unsafe fn init(_argc: isize, _argv: *const *const u8) {} - pub fn cleanup() { - } + pub fn cleanup() {} #[cfg(target_os = "macos")] pub fn args() -> Args { use crate::os::unix::prelude::*; - extern { + extern "C" { // These functions are in crt_externs.h. fn _NSGetArgc() -> *mut libc::c_int; fn _NSGetArgv() -> *mut *mut *mut libc::c_char; } let vec = unsafe { - let (argc, argv) = (*_NSGetArgc() as isize, - *_NSGetArgv() as *const *const libc::c_char); - (0.. argc as isize).map(|i| { - let bytes = CStr::from_ptr(*argv.offset(i)).to_bytes().to_vec(); - OsStringExt::from_vec(bytes) - }).collect::<Vec<_>>() + let (argc, argv) = + (*_NSGetArgc() as isize, *_NSGetArgv() as *const *const libc::c_char); + (0..argc as isize) + .map(|i| { + let bytes = CStr::from_ptr(*argv.offset(i)).to_bytes().to_vec(); + OsStringExt::from_vec(bytes) + }) + .collect::<Vec<_>>() }; - Args { - iter: vec.into_iter(), - _dont_send_or_sync_me: PhantomData, - } + Args { iter: vec.into_iter(), _dont_send_or_sync_me: PhantomData } } // As _NSGetArgc and _NSGetArgv aren't mentioned in iOS docs @@ -190,22 +196,22 @@ mod imp { use crate::mem; use crate::str; - extern { + extern "C" { fn sel_registerName(name: *const libc::c_uchar) -> Sel; fn objc_getClass(class_name: *const libc::c_uchar) -> NsId; } - #[cfg(target_arch="aarch64")] - extern { + #[cfg(target_arch = "aarch64")] + extern "C" { fn objc_msgSend(obj: NsId, sel: Sel) -> NsId; - #[link_name="objc_msgSend"] + #[link_name = "objc_msgSend"] fn objc_msgSend_ul(obj: NsId, sel: Sel, i: libc::c_ulong) -> NsId; } - #[cfg(not(target_arch="aarch64"))] - extern { + #[cfg(not(target_arch = "aarch64"))] + extern "C" { fn objc_msgSend(obj: NsId, sel: Sel, ...) -> NsId; - #[link_name="objc_msgSend"] + #[link_name = "objc_msgSend"] fn objc_msgSend_ul(obj: NsId, sel: Sel, ...) -> NsId; } @@ -228,8 +234,7 @@ mod imp { let cnt: usize = mem::transmute(objc_msgSend(args, count_sel)); for i in 0..cnt { let tmp = objc_msgSend_ul(args, object_at_sel, i as libc::c_ulong); - let utf_c_str: *const libc::c_char = - mem::transmute(objc_msgSend(tmp, utf8_sel)); + let utf_c_str: *const libc::c_char = mem::transmute(objc_msgSend(tmp, utf8_sel)); let bytes = CStr::from_ptr(utf_c_str).to_bytes(); res.push(OsString::from(str::from_utf8(bytes).unwrap())) } diff --git a/src/libstd/sys/unix/cmath.rs b/src/libstd/sys/unix/cmath.rs index 2916ebe444..f327b69fc7 100644 --- a/src/libstd/sys/unix/cmath.rs +++ b/src/libstd/sys/unix/cmath.rs @@ -2,7 +2,6 @@ use libc::{c_double, c_float}; -#[link_name = "m"] extern "C" { pub fn acos(n: c_double) -> c_double; pub fn acosf(n: c_float) -> c_float; diff --git a/src/libstd/sys/unix/condvar.rs b/src/libstd/sys/unix/condvar.rs index 6be844ded1..b4896b7ad7 100644 --- a/src/libstd/sys/unix/condvar.rs +++ b/src/libstd/sys/unix/condvar.rs @@ -2,15 +2,15 @@ use crate::cell::UnsafeCell; use crate::sys::mutex::{self, Mutex}; use crate::time::Duration; -pub struct Condvar { inner: UnsafeCell<libc::pthread_cond_t> } +pub struct Condvar { + inner: UnsafeCell<libc::pthread_cond_t>, +} unsafe impl Send for Condvar {} unsafe impl Sync for Condvar {} -const TIMESPEC_MAX: libc::timespec = libc::timespec { - tv_sec: <libc::time_t>::max_value(), - tv_nsec: 1_000_000_000 - 1, -}; +const TIMESPEC_MAX: libc::timespec = + libc::timespec { tv_sec: <libc::time_t>::max_value(), tv_nsec: 1_000_000_000 - 1 }; fn saturating_cast_to_time_t(value: u64) -> libc::time_t { if value > <libc::time_t>::max_value() as u64 { @@ -27,18 +27,22 @@ impl Condvar { Condvar { inner: UnsafeCell::new(libc::PTHREAD_COND_INITIALIZER) } } - #[cfg(any(target_os = "macos", - target_os = "ios", - target_os = "l4re", - target_os = "android", - target_os = "redox"))] + #[cfg(any( + target_os = "macos", + target_os = "ios", + target_os = "l4re", + target_os = "android", + target_os = "redox" + ))] pub unsafe fn init(&mut self) {} - #[cfg(not(any(target_os = "macos", - target_os = "ios", - target_os = "l4re", - target_os = "android", - target_os = "redox")))] + #[cfg(not(any( + target_os = "macos", + target_os = "ios", + target_os = "l4re", + target_os = "android", + target_os = "redox" + )))] pub unsafe fn init(&mut self) { use crate::mem::MaybeUninit; let mut attr = MaybeUninit::<libc::pthread_condattr_t>::uninit(); @@ -74,9 +78,7 @@ impl Condvar { // where we configure condition variable to use monotonic clock (instead of // default system clock). This approach avoids all problems that result // from changes made to the system time. - #[cfg(not(any(target_os = "macos", - target_os = "ios", - target_os = "android")))] + #[cfg(not(any(target_os = "macos", target_os = "ios", target_os = "android")))] pub unsafe fn wait_timeout(&self, mutex: &Mutex, dur: Duration) -> bool { use crate::mem; @@ -92,17 +94,14 @@ impl Condvar { .and_then(|s| s.checked_add(now.tv_sec)); let nsec = nsec % 1_000_000_000; - let timeout = sec.map(|s| { - libc::timespec { tv_sec: s, tv_nsec: nsec as _} - }).unwrap_or(TIMESPEC_MAX); + let timeout = + sec.map(|s| libc::timespec { tv_sec: s, tv_nsec: nsec as _ }).unwrap_or(TIMESPEC_MAX); - let r = libc::pthread_cond_timedwait(self.inner.get(), mutex::raw(mutex), - &timeout); + let r = libc::pthread_cond_timedwait(self.inner.get(), mutex::raw(mutex), &timeout); assert!(r == libc::ETIMEDOUT || r == 0); r == 0 } - // This implementation is modeled after libcxx's condition_variable // https://github.com/llvm-mirror/libcxx/blob/release_35/src/condition_variable.cpp#L46 // https://github.com/llvm-mirror/libcxx/blob/release_35/include/__mutex_base#L367 @@ -138,21 +137,20 @@ impl Condvar { let r = libc::gettimeofday(&mut sys_now, ptr::null_mut()); debug_assert_eq!(r, 0); - let nsec = dur.subsec_nanos() as libc::c_long + - (sys_now.tv_usec * 1000) as libc::c_long; + let nsec = dur.subsec_nanos() as libc::c_long + (sys_now.tv_usec * 1000) as libc::c_long; let extra = (nsec / 1_000_000_000) as libc::time_t; let nsec = nsec % 1_000_000_000; let seconds = saturating_cast_to_time_t(dur.as_secs()); - let timeout = sys_now.tv_sec.checked_add(extra).and_then(|s| { - s.checked_add(seconds) - }).map(|s| { - libc::timespec { tv_sec: s, tv_nsec: nsec } - }).unwrap_or(TIMESPEC_MAX); + let timeout = sys_now + .tv_sec + .checked_add(extra) + .and_then(|s| s.checked_add(seconds)) + .map(|s| libc::timespec { tv_sec: s, tv_nsec: nsec }) + .unwrap_or(TIMESPEC_MAX); // And wait! - let r = libc::pthread_cond_timedwait(self.inner.get(), mutex::raw(mutex), - &timeout); + let r = libc::pthread_cond_timedwait(self.inner.get(), mutex::raw(mutex), &timeout); debug_assert!(r == libc::ETIMEDOUT || r == 0); // ETIMEDOUT is not a totally reliable method of determining timeout due diff --git a/src/libstd/sys/unix/ext/mod.rs b/src/libstd/sys/unix/ext/mod.rs index 78a3fd05c7..cbdb1c1004 100644 --- a/src/libstd/sys/unix/ext/mod.rs +++ b/src/libstd/sys/unix/ext/mod.rs @@ -29,31 +29,38 @@ #![doc(cfg(unix))] #![allow(missing_docs)] -pub mod io; pub mod ffi; pub mod fs; +pub mod io; +pub mod net; pub mod process; pub mod raw; pub mod thread; -pub mod net; /// A prelude for conveniently writing platform-specific code. /// /// Includes all extension traits, and some important type definitions. #[stable(feature = "rust1", since = "1.0.0")] pub mod prelude { - #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] - pub use super::io::{RawFd, AsRawFd, FromRawFd, IntoRawFd}; - #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] + #[doc(no_inline)] + #[stable(feature = "rust1", since = "1.0.0")] pub use super::ffi::{OsStrExt, OsStringExt}; - #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] - pub use super::fs::{PermissionsExt, OpenOptionsExt, MetadataExt, FileTypeExt}; - #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] + #[doc(no_inline)] + #[stable(feature = "rust1", since = "1.0.0")] pub use super::fs::DirEntryExt; - #[doc(no_inline)] #[stable(feature = "file_offset", since = "1.15.0")] + #[doc(no_inline)] + #[stable(feature = "file_offset", since = "1.15.0")] pub use super::fs::FileExt; - #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] - pub use super::thread::JoinHandleExt; - #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] + #[doc(no_inline)] + #[stable(feature = "rust1", since = "1.0.0")] + pub use super::fs::{FileTypeExt, MetadataExt, OpenOptionsExt, PermissionsExt}; + #[doc(no_inline)] + #[stable(feature = "rust1", since = "1.0.0")] + pub use super::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; + #[doc(no_inline)] + #[stable(feature = "rust1", since = "1.0.0")] pub use super::process::{CommandExt, ExitStatusExt}; + #[doc(no_inline)] + #[stable(feature = "rust1", since = "1.0.0")] + pub use super::thread::JoinHandleExt; } diff --git a/src/libstd/sys/unix/ext/net.rs b/src/libstd/sys/unix/ext/net.rs index 5177cce628..4c3cb67c9e 100644 --- a/src/libstd/sys/unix/ext/net.rs +++ b/src/libstd/sys/unix/ext/net.rs @@ -22,22 +22,32 @@ use crate::io::{self, Initializer, IoSlice, IoSliceMut}; use crate::mem; use crate::net::{self, Shutdown}; use crate::os::unix::ffi::OsStrExt; -use crate::os::unix::io::{RawFd, AsRawFd, FromRawFd, IntoRawFd}; +use crate::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use crate::path::Path; -use crate::time::Duration; -use crate::sys::{self, cvt}; use crate::sys::net::Socket; +use crate::sys::{self, cvt}; use crate::sys_common::{self, AsInner, FromInner, IntoInner}; +use crate::time::Duration; -#[cfg(any(target_os = "linux", target_os = "android", - target_os = "dragonfly", target_os = "freebsd", - target_os = "openbsd", target_os = "netbsd", - target_os = "haiku"))] +#[cfg(any( + target_os = "linux", + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "openbsd", + target_os = "netbsd", + target_os = "haiku" +))] use libc::MSG_NOSIGNAL; -#[cfg(not(any(target_os = "linux", target_os = "android", - target_os = "dragonfly", target_os = "freebsd", - target_os = "openbsd", target_os = "netbsd", - target_os = "haiku")))] +#[cfg(not(any( + target_os = "linux", + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "openbsd", + target_os = "netbsd", + target_os = "haiku" +)))] const MSG_NOSIGNAL: libc::c_int = 0x0; fn sun_path_offset(addr: &libc::sockaddr_un) -> usize { @@ -54,13 +64,17 @@ unsafe fn sockaddr_un(path: &Path) -> io::Result<(libc::sockaddr_un, libc::sockl let bytes = path.as_os_str().as_bytes(); if bytes.contains(&0) { - return Err(io::Error::new(io::ErrorKind::InvalidInput, - "paths may not contain interior null bytes")); + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "paths may not contain interior null bytes", + )); } if bytes.len() >= addr.sun_path.len() { - return Err(io::Error::new(io::ErrorKind::InvalidInput, - "path must be shorter than SUN_LEN")); + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "path must be shorter than SUN_LEN", + )); } for (dst, src) in addr.sun_path.iter_mut().zip(bytes.iter()) { *dst = *src as libc::c_char; @@ -107,7 +121,8 @@ pub struct SocketAddr { impl SocketAddr { fn new<F>(f: F) -> io::Result<SocketAddr> - where F: FnOnce(*mut libc::sockaddr, *mut libc::socklen_t) -> libc::c_int + where + F: FnOnce(*mut libc::sockaddr, *mut libc::socklen_t) -> libc::c_int, { unsafe { let mut addr: libc::sockaddr_un = mem::zeroed(); @@ -121,16 +136,15 @@ impl SocketAddr { if len == 0 { // When there is a datagram from unnamed unix socket // linux returns zero bytes of address - len = sun_path_offset(&addr) as libc::socklen_t; // i.e., zero-length address + len = sun_path_offset(&addr) as libc::socklen_t; // i.e., zero-length address } else if addr.sun_family != libc::AF_UNIX as libc::sa_family_t { - return Err(io::Error::new(io::ErrorKind::InvalidInput, - "file descriptor did not correspond to a Unix socket")); + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "file descriptor did not correspond to a Unix socket", + )); } - Ok(SocketAddr { - addr, - len, - }) + Ok(SocketAddr { addr, len }) } /// Returns `true` if the address is unnamed. @@ -164,11 +178,7 @@ impl SocketAddr { /// ``` #[stable(feature = "unix_socket", since = "1.10.0")] pub fn is_unnamed(&self) -> bool { - if let AddressKind::Unnamed = self.address() { - true - } else { - false - } + if let AddressKind::Unnamed = self.address() { true } else { false } } /// Returns the contents of this address if it is a `pathname` address. @@ -203,11 +213,7 @@ impl SocketAddr { /// ``` #[stable(feature = "unix_socket", since = "1.10.0")] pub fn as_pathname(&self) -> Option<&Path> { - if let AddressKind::Pathname(path) = self.address() { - Some(path) - } else { - None - } + if let AddressKind::Pathname(path) = self.address() { Some(path) } else { None } } fn address(&self) -> AddressKind<'_> { @@ -682,17 +688,23 @@ impl IntoRawFd for UnixStream { #[stable(feature = "rust1", since = "1.0.0")] impl AsRawFd for net::TcpStream { - fn as_raw_fd(&self) -> RawFd { *self.as_inner().socket().as_inner() } + fn as_raw_fd(&self) -> RawFd { + *self.as_inner().socket().as_inner() + } } #[stable(feature = "rust1", since = "1.0.0")] impl AsRawFd for net::TcpListener { - fn as_raw_fd(&self) -> RawFd { *self.as_inner().socket().as_inner() } + fn as_raw_fd(&self) -> RawFd { + *self.as_inner().socket().as_inner() + } } #[stable(feature = "rust1", since = "1.0.0")] impl AsRawFd for net::UdpSocket { - fn as_raw_fd(&self) -> RawFd { *self.as_inner().socket().as_inner() } + fn as_raw_fd(&self) -> RawFd { + *self.as_inner().socket().as_inner() + } } #[stable(feature = "from_raw_os", since = "1.1.0")] @@ -890,6 +902,12 @@ impl UnixListener { /// Moves the socket into or out of nonblocking mode. /// + /// This will result in the `accept` operation becoming nonblocking, + /// i.e., immediately returning from their calls. If the IO operation is + /// successful, `Ok` is returned and no further action is required. If the + /// IO operation could not be completed and needs to be retried, an error + /// with kind [`io::ErrorKind::WouldBlock`] is returned. + /// /// # Examples /// /// ```no_run @@ -901,6 +919,8 @@ impl UnixListener { /// Ok(()) /// } /// ``` + /// + /// [`io::ErrorKind::WouldBlock`]: ../../../io/enum.ErrorKind.html#variant.WouldBlock #[stable(feature = "unix_socket", since = "1.10.0")] pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { self.0.set_nonblocking(nonblocking) @@ -1287,21 +1307,21 @@ impl UnixDatagram { #[stable(feature = "unix_socket", since = "1.10.0")] pub fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> { let mut count = 0; - let addr = SocketAddr::new(|addr, len| { - unsafe { - count = libc::recvfrom(*self.0.as_inner(), - buf.as_mut_ptr() as *mut _, - buf.len(), - 0, - addr, - len); - if count > 0 { - 1 - } else if count == 0 { - 0 - } else { - -1 - } + let addr = SocketAddr::new(|addr, len| unsafe { + count = libc::recvfrom( + *self.0.as_inner(), + buf.as_mut_ptr() as *mut _, + buf.len(), + 0, + addr, + len, + ); + if count > 0 { + 1 + } else if count == 0 { + 0 + } else { + -1 } })?; @@ -1350,12 +1370,14 @@ impl UnixDatagram { unsafe { let (addr, len) = sockaddr_un(path)?; - let count = cvt(libc::sendto(*d.0.as_inner(), - buf.as_ptr() as *const _, - buf.len(), - MSG_NOSIGNAL, - &addr as *const _ as *const _, - len))?; + let count = cvt(libc::sendto( + *d.0.as_inner(), + buf.as_ptr() as *const _, + buf.len(), + MSG_NOSIGNAL, + &addr as *const _ as *const _, + len, + ))?; Ok(count as usize) } } @@ -1606,11 +1628,11 @@ impl IntoRawFd for UnixDatagram { #[cfg(all(test, not(target_os = "emscripten")))] mod test { - use crate::thread; - use crate::io::{self, ErrorKind}; use crate::io::prelude::*; - use crate::time::Duration; + use crate::io::{self, ErrorKind}; use crate::sys_common::io::test::tmpdir; + use crate::thread; + use crate::time::Duration; use super::*; @@ -1620,7 +1642,7 @@ mod test { Ok(e) => e, Err(e) => panic!("{}", e), } - } + }; } #[test] @@ -1640,8 +1662,7 @@ mod test { }); let mut stream = or_panic!(UnixStream::connect(&socket_path)); - assert_eq!(Some(&*socket_path), - stream.peer_addr().unwrap().as_pathname()); + assert_eq!(Some(&*socket_path), stream.peer_addr().unwrap().as_pathname()); or_panic!(stream.write_all(msg1)); let mut buf = vec![]; or_panic!(stream.read_to_end(&mut buf)); @@ -1655,16 +1676,18 @@ mod test { fn vectored() { let (mut s1, mut s2) = or_panic!(UnixStream::pair()); - let len = or_panic!(s1.write_vectored( - &[IoSlice::new(b"hello"), IoSlice::new(b" "), IoSlice::new(b"world!")], - )); + let len = or_panic!(s1.write_vectored(&[ + IoSlice::new(b"hello"), + IoSlice::new(b" "), + IoSlice::new(b"world!") + ],)); assert_eq!(len, 12); let mut buf1 = [0; 6]; let mut buf2 = [0; 7]; - let len = or_panic!(s2.read_vectored( - &mut [IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2)], - )); + let len = or_panic!( + s2.read_vectored(&mut [IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2)],) + ); assert_eq!(len, 12); assert_eq!(&buf1, b"hello "); assert_eq!(&buf2, b"world!\0"); @@ -1744,9 +1767,10 @@ mod test { #[test] fn long_path() { let dir = tmpdir(); - let socket_path = dir.path() - .join("asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfa\ - sasdfasdfasdasdfasdfasdfadfasdfasdfasdfasdfasdf"); + let socket_path = dir.path().join( + "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfa\ + sasdfasdfasdasdfasdfasdfadfasdfasdfasdfasdfasdf", + ); match UnixStream::connect(&socket_path) { Err(ref e) if e.kind() == io::ErrorKind::InvalidInput => {} Err(e) => panic!("unexpected error {}", e), @@ -1805,8 +1829,11 @@ mod test { let mut buf = [0; 10]; let kind = stream.read_exact(&mut buf).err().expect("expected error").kind(); - assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, - "unexpected_error: {:?}", kind); + assert!( + kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, + "unexpected_error: {:?}", + kind + ); } #[test] @@ -1827,8 +1854,11 @@ mod test { assert_eq!(b"hello world", &buf[..]); let kind = stream.read_exact(&mut buf).err().expect("expected error").kind(); - assert!(kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, - "unexpected_error: {:?}", kind); + assert!( + kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut, + "unexpected_error: {:?}", + kind + ); } // Ensure the `set_read_timeout` and `set_write_timeout` calls return errors diff --git a/src/libstd/sys/unix/fast_thread_local.rs b/src/libstd/sys/unix/fast_thread_local.rs index 0861432f8a..8730b4de8b 100644 --- a/src/libstd/sys/unix/fast_thread_local.rs +++ b/src/libstd/sys/unix/fast_thread_local.rs @@ -1,5 +1,5 @@ #![cfg(target_thread_local)] -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] // Since what appears to be glibc 2.18 this symbol has been shipped which // GCC and clang both use to invoke destructors in thread_local globals, so diff --git a/src/libstd/sys/unix/fd.rs b/src/libstd/sys/unix/fd.rs index 53b50763fb..8a99836912 100644 --- a/src/libstd/sys/unix/fd.rs +++ b/src/libstd/sys/unix/fd.rs @@ -1,4 +1,4 @@ -#![unstable(reason = "not public", issue = "0", feature = "fd")] +#![unstable(reason = "not public", issue = "none", feature = "fd")] use crate::cmp; use crate::io::{self, Initializer, IoSlice, IoSliceMut, Read}; diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs index 8669c48e3b..ab2a871b92 100644 --- a/src/libstd/sys/unix/fs.rs +++ b/src/libstd/sys/unix/fs.rs @@ -1,8 +1,8 @@ use crate::os::unix::prelude::*; -use crate::ffi::{CString, CStr, OsString, OsStr}; +use crate::ffi::{CStr, CString, OsStr, OsString}; use crate::fmt; -use crate::io::{self, Error, ErrorKind, SeekFrom, IoSlice, IoSliceMut}; +use crate::io::{self, Error, ErrorKind, IoSlice, IoSliceMut, SeekFrom}; use crate::mem; use crate::path::{Path, PathBuf}; use crate::ptr; @@ -14,50 +14,51 @@ use crate::sys_common::{AsInner, FromInner}; use libc::{c_int, mode_t}; -#[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "l4re"))] -use libc::{stat64, fstat64, lstat64, off64_t, ftruncate64, lseek64, dirent64, readdir64_r, open64}; -#[cfg(any(target_os = "linux", target_os = "emscripten"))] -use libc::fstatat64; #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "android"))] use libc::dirfd; +#[cfg(any(target_os = "linux", target_os = "emscripten"))] +use libc::fstatat64; +#[cfg(not(any( + target_os = "linux", + target_os = "emscripten", + target_os = "solaris", + target_os = "l4re", + target_os = "fuchsia", + target_os = "redox" +)))] +use libc::readdir_r as readdir64_r; #[cfg(target_os = "android")] -use libc::{stat as stat64, fstat as fstat64, fstatat as fstatat64, lstat as lstat64, lseek64, - dirent as dirent64, open as open64}; -#[cfg(not(any(target_os = "linux", - target_os = "emscripten", - target_os = "l4re", - target_os = "android")))] -use libc::{stat as stat64, fstat as fstat64, lstat as lstat64, off_t as off64_t, - ftruncate as ftruncate64, lseek as lseek64, dirent as dirent64, open as open64}; -#[cfg(not(any(target_os = "linux", - target_os = "emscripten", - target_os = "solaris", - target_os = "l4re", - target_os = "fuchsia", - target_os = "redox")))] -use libc::{readdir_r as readdir64_r}; +use libc::{ + dirent as dirent64, fstat as fstat64, fstatat as fstatat64, lseek64, lstat as lstat64, + open as open64, stat as stat64, +}; +#[cfg(not(any( + target_os = "linux", + target_os = "emscripten", + target_os = "l4re", + target_os = "android" +)))] +use libc::{ + dirent as dirent64, fstat as fstat64, ftruncate as ftruncate64, lseek as lseek64, + lstat as lstat64, off_t as off64_t, open as open64, stat as stat64, +}; +#[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "l4re"))] +use libc::{ + dirent64, fstat64, ftruncate64, lseek64, lstat64, off64_t, open64, readdir64_r, stat64, +}; pub use crate::sys_common::fs::remove_dir_all; pub struct File(FileDesc); -// FIXME: This should be available on Linux with all `target_arch` and `target_env`. -// https://github.com/rust-lang/libc/issues/1545 +// FIXME: This should be available on Linux with all `target_env`. +// But currently only glibc exposes `statx` fn and structs. +// We don't want to import unverified raw C structs here directly. +// https://github.com/rust-lang/rust/pull/67774 macro_rules! cfg_has_statx { ({ $($then_tt:tt)* } else { $($else_tt:tt)* }) => { cfg_if::cfg_if! { - if #[cfg(all(target_os = "linux", target_env = "gnu", any( - target_arch = "x86", - target_arch = "arm", - // target_arch = "mips", - target_arch = "powerpc", - target_arch = "x86_64", - // target_arch = "aarch64", - target_arch = "powerpc64", - // target_arch = "mips64", - // target_arch = "s390x", - target_arch = "sparc64", - )))] { + if #[cfg(all(target_os = "linux", target_env = "gnu"))] { $($then_tt)* } else { $($else_tt)* @@ -65,18 +66,7 @@ macro_rules! cfg_has_statx { } }; ($($block_inner:tt)*) => { - #[cfg(all(target_os = "linux", target_env = "gnu", any( - target_arch = "x86", - target_arch = "arm", - // target_arch = "mips", - target_arch = "powerpc", - target_arch = "x86_64", - // target_arch = "aarch64", - target_arch = "powerpc64", - // target_arch = "mips64", - // target_arch = "s390x", - target_arch = "sparc64", - )))] + #[cfg(all(target_os = "linux", target_env = "gnu"))] { $($block_inner)* } @@ -211,7 +201,7 @@ pub struct DirEntry { // array to store the name, b) its lifetime between readdir // calls is not guaranteed. #[cfg(any(target_os = "solaris", target_os = "fuchsia", target_os = "redox"))] - name: Box<[u8]> + name: Box<[u8]>, } #[derive(Clone, Debug)] @@ -229,13 +219,19 @@ pub struct OpenOptions { } #[derive(Clone, PartialEq, Eq, Debug)] -pub struct FilePermissions { mode: mode_t } +pub struct FilePermissions { + mode: mode_t, +} #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] -pub struct FileType { mode: mode_t } +pub struct FileType { + mode: mode_t, +} #[derive(Debug)] -pub struct DirBuilder { mode: mode_t } +pub struct DirBuilder { + mode: mode_t, +} cfg_has_statx! {{ impl FileAttr { @@ -252,7 +248,9 @@ cfg_has_statx! {{ }} impl FileAttr { - pub fn size(&self) -> u64 { self.stat.st_size as u64 } + pub fn size(&self) -> u64 { + self.stat.st_size as u64 + } pub fn perm(&self) -> FilePermissions { FilePermissions { mode: (self.stat.st_mode as mode_t) } } @@ -302,10 +300,12 @@ impl FileAttr { })) } - #[cfg(any(target_os = "freebsd", - target_os = "openbsd", - target_os = "macos", - target_os = "ios"))] + #[cfg(any( + target_os = "freebsd", + target_os = "openbsd", + target_os = "macos", + target_os = "ios" + ))] pub fn created(&self) -> io::Result<SystemTime> { Ok(SystemTime::from(libc::timespec { tv_sec: self.stat.st_birthtime as libc::time_t, @@ -313,10 +313,12 @@ impl FileAttr { })) } - #[cfg(not(any(target_os = "freebsd", - target_os = "openbsd", - target_os = "macos", - target_os = "ios")))] + #[cfg(not(any( + target_os = "freebsd", + target_os = "openbsd", + target_os = "macos", + target_os = "ios" + )))] pub fn created(&self) -> io::Result<SystemTime> { cfg_has_statx! { if let Some(ext) = &self.statx_extra_fields { @@ -334,14 +336,18 @@ impl FileAttr { } } - Err(io::Error::new(io::ErrorKind::Other, - "creation time is not available on this platform \ - currently")) + Err(io::Error::new( + io::ErrorKind::Other, + "creation time is not available on this platform \ + currently", + )) } } impl AsInner<stat64> for FileAttr { - fn as_inner(&self) -> &stat64 { &self.stat } + fn as_inner(&self) -> &stat64 { + &self.stat + } } impl FilePermissions { @@ -359,15 +365,25 @@ impl FilePermissions { self.mode |= 0o222; } } - pub fn mode(&self) -> u32 { self.mode as u32 } + pub fn mode(&self) -> u32 { + self.mode as u32 + } } impl FileType { - pub fn is_dir(&self) -> bool { self.is(libc::S_IFDIR) } - pub fn is_file(&self) -> bool { self.is(libc::S_IFREG) } - pub fn is_symlink(&self) -> bool { self.is(libc::S_IFLNK) } + pub fn is_dir(&self) -> bool { + self.is(libc::S_IFDIR) + } + pub fn is_file(&self) -> bool { + self.is(libc::S_IFREG) + } + pub fn is_symlink(&self) -> bool { + self.is(libc::S_IFLNK) + } - pub fn is(&self, mode: mode_t) -> bool { self.mode & libc::S_IFMT == mode } + pub fn is(&self, mode: mode_t) -> bool { + self.mode & libc::S_IFMT == mode + } } impl FromInner<u32> for FilePermissions { @@ -405,7 +421,7 @@ impl Iterator for ReadDir { return match super::os::errno() { 0 => None, e => Some(Err(Error::from_raw_os_error(e))), - } + }; } let name = (*entry_ptr).d_name.as_ptr(); @@ -413,12 +429,13 @@ impl Iterator for ReadDir { let ret = DirEntry { entry: *entry_ptr, - name: slice::from_raw_parts(name as *const u8, - namelen as usize).to_owned().into_boxed_slice(), - dir: self.clone() + name: slice::from_raw_parts(name as *const u8, namelen as usize) + .to_owned() + .into_boxed_slice(), + dir: self.clone(), }; if ret.name_bytes() != b"." && ret.name_bytes() != b".." { - return Some(Ok(ret)) + return Some(Ok(ret)); } } } @@ -431,10 +448,7 @@ impl Iterator for ReadDir { } unsafe { - let mut ret = DirEntry { - entry: mem::zeroed(), - dir: self.clone(), - }; + let mut ret = DirEntry { entry: mem::zeroed(), dir: self.clone() }; let mut entry_ptr = ptr::null_mut(); loop { if readdir64_r(self.inner.dirp.0, &mut ret.entry, &mut entry_ptr) != 0 { @@ -445,13 +459,13 @@ impl Iterator for ReadDir { // (instead of looping forever) self.end_of_stream = true; } - return Some(Err(Error::last_os_error())) + return Some(Err(Error::last_os_error())); } if entry_ptr.is_null() { - return None + return None; } if ret.name_bytes() != b"." && ret.name_bytes() != b".." { - return Some(Ok(ret)) + return Some(Ok(ret)); } } } @@ -491,9 +505,7 @@ impl DirEntry { } let mut stat: stat64 = unsafe { mem::zeroed() }; - cvt(unsafe { - fstatat64(fd, name, &mut stat, libc::AT_SYMLINK_NOFOLLOW) - })?; + cvt(unsafe { fstatat64(fd, name, &mut stat, libc::AT_SYMLINK_NOFOLLOW) })?; Ok(FileAttr::from_stat64(stat)) } @@ -521,54 +533,60 @@ impl DirEntry { } } - #[cfg(any(target_os = "macos", - target_os = "ios", - target_os = "linux", - target_os = "emscripten", - target_os = "android", - target_os = "solaris", - target_os = "haiku", - target_os = "l4re", - target_os = "fuchsia", - target_os = "redox"))] + #[cfg(any( + target_os = "macos", + target_os = "ios", + target_os = "linux", + target_os = "emscripten", + target_os = "android", + target_os = "solaris", + target_os = "haiku", + target_os = "l4re", + target_os = "fuchsia", + target_os = "redox" + ))] pub fn ino(&self) -> u64 { self.entry.d_ino as u64 } - #[cfg(any(target_os = "freebsd", - target_os = "openbsd", - target_os = "netbsd", - target_os = "dragonfly"))] + #[cfg(any( + target_os = "freebsd", + target_os = "openbsd", + target_os = "netbsd", + target_os = "dragonfly" + ))] pub fn ino(&self) -> u64 { self.entry.d_fileno as u64 } - #[cfg(any(target_os = "macos", - target_os = "ios", - target_os = "netbsd", - target_os = "openbsd", - target_os = "freebsd", - target_os = "dragonfly"))] + #[cfg(any( + target_os = "macos", + target_os = "ios", + target_os = "netbsd", + target_os = "openbsd", + target_os = "freebsd", + target_os = "dragonfly" + ))] fn name_bytes(&self) -> &[u8] { use crate::slice; unsafe { - slice::from_raw_parts(self.entry.d_name.as_ptr() as *const u8, - self.entry.d_namlen as usize) + slice::from_raw_parts( + self.entry.d_name.as_ptr() as *const u8, + self.entry.d_namlen as usize, + ) } } - #[cfg(any(target_os = "android", - target_os = "linux", - target_os = "emscripten", - target_os = "l4re", - target_os = "haiku"))] + #[cfg(any( + target_os = "android", + target_os = "linux", + target_os = "emscripten", + target_os = "l4re", + target_os = "haiku" + ))] fn name_bytes(&self) -> &[u8] { - unsafe { - CStr::from_ptr(self.entry.d_name.as_ptr()).to_bytes() - } + unsafe { CStr::from_ptr(self.entry.d_name.as_ptr()).to_bytes() } } - #[cfg(any(target_os = "solaris", - target_os = "fuchsia", - target_os = "redox"))] + #[cfg(any(target_os = "solaris", target_os = "fuchsia", target_os = "redox"))] fn name_bytes(&self) -> &[u8] { &*self.name } @@ -590,23 +608,39 @@ impl OpenOptions { } } - pub fn read(&mut self, read: bool) { self.read = read; } - pub fn write(&mut self, write: bool) { self.write = write; } - pub fn append(&mut self, append: bool) { self.append = append; } - pub fn truncate(&mut self, truncate: bool) { self.truncate = truncate; } - pub fn create(&mut self, create: bool) { self.create = create; } - pub fn create_new(&mut self, create_new: bool) { self.create_new = create_new; } + pub fn read(&mut self, read: bool) { + self.read = read; + } + pub fn write(&mut self, write: bool) { + self.write = write; + } + pub fn append(&mut self, append: bool) { + self.append = append; + } + pub fn truncate(&mut self, truncate: bool) { + self.truncate = truncate; + } + pub fn create(&mut self, create: bool) { + self.create = create; + } + pub fn create_new(&mut self, create_new: bool) { + self.create_new = create_new; + } - pub fn custom_flags(&mut self, flags: i32) { self.custom_flags = flags; } - pub fn mode(&mut self, mode: u32) { self.mode = mode as mode_t; } + pub fn custom_flags(&mut self, flags: i32) { + self.custom_flags = flags; + } + pub fn mode(&mut self, mode: u32) { + self.mode = mode as mode_t; + } fn get_access_mode(&self) -> io::Result<c_int> { match (self.read, self.write, self.append) { - (true, false, false) => Ok(libc::O_RDONLY), - (false, true, false) => Ok(libc::O_WRONLY), - (true, true, false) => Ok(libc::O_RDWR), - (false, _, true) => Ok(libc::O_WRONLY | libc::O_APPEND), - (true, _, true) => Ok(libc::O_RDWR | libc::O_APPEND), + (true, false, false) => Ok(libc::O_RDONLY), + (false, true, false) => Ok(libc::O_WRONLY), + (true, true, false) => Ok(libc::O_RDWR), + (false, _, true) => Ok(libc::O_WRONLY | libc::O_APPEND), + (true, _, true) => Ok(libc::O_RDWR | libc::O_APPEND), (false, false, false) => Err(Error::from_raw_os_error(libc::EINVAL)), } } @@ -614,23 +648,25 @@ impl OpenOptions { fn get_creation_mode(&self) -> io::Result<c_int> { match (self.write, self.append) { (true, false) => {} - (false, false) => + (false, false) => { if self.truncate || self.create || self.create_new { return Err(Error::from_raw_os_error(libc::EINVAL)); - }, - (_, true) => + } + } + (_, true) => { if self.truncate && !self.create_new { return Err(Error::from_raw_os_error(libc::EINVAL)); - }, + } + } } Ok(match (self.create, self.truncate, self.create_new) { - (false, false, false) => 0, - (true, false, false) => libc::O_CREAT, - (false, true, false) => libc::O_TRUNC, - (true, true, false) => libc::O_CREAT | libc::O_TRUNC, - (_, _, true) => libc::O_CREAT | libc::O_EXCL, - }) + (false, false, false) => 0, + (true, false, false) => libc::O_CREAT, + (false, true, false) => libc::O_TRUNC, + (true, true, false) => libc::O_CREAT | libc::O_TRUNC, + (_, _, true) => libc::O_CREAT | libc::O_EXCL, + }) } } @@ -641,13 +677,11 @@ impl File { } pub fn open_c(path: &CStr, opts: &OpenOptions) -> io::Result<File> { - let flags = libc::O_CLOEXEC | - opts.get_access_mode()? | - opts.get_creation_mode()? | - (opts.custom_flags as c_int & !libc::O_ACCMODE); - let fd = cvt_r(|| unsafe { - open64(path.as_ptr(), flags, opts.mode as c_int) - })?; + let flags = libc::O_CLOEXEC + | opts.get_access_mode()? + | opts.get_creation_mode()? + | (opts.custom_flags as c_int & !libc::O_ACCMODE); + let fd = cvt_r(|| unsafe { open64(path.as_ptr(), flags, opts.mode as c_int) })?; let fd = FileDesc::new(fd); // Currently the standard library supports Linux 2.6.18 which did not @@ -672,12 +706,15 @@ impl File { match OPEN_CLOEXEC.load(Ordering::Relaxed) { OPEN_CLOEXEC_UNKNOWN => { need_to_set = !fd.get_cloexec()?; - OPEN_CLOEXEC.store(if need_to_set { - OPEN_CLOEXEC_NOTSUPPORTED - } else { - OPEN_CLOEXEC_SUPPORTED - }, Ordering::Relaxed); - }, + OPEN_CLOEXEC.store( + if need_to_set { + OPEN_CLOEXEC_NOTSUPPORTED + } else { + OPEN_CLOEXEC_SUPPORTED + }, + Ordering::Relaxed, + ); + } OPEN_CLOEXEC_SUPPORTED => need_to_set = false, OPEN_CLOEXEC_NOTSUPPORTED => need_to_set = true, _ => unreachable!(), @@ -712,9 +749,7 @@ impl File { } let mut stat: stat64 = unsafe { mem::zeroed() }; - cvt(unsafe { - fstat64(fd, &mut stat) - })?; + cvt(unsafe { fstat64(fd, &mut stat) })?; Ok(FileAttr::from_stat64(stat)) } @@ -727,7 +762,9 @@ impl File { libc::fcntl(fd, libc::F_FULLFSYNC) } #[cfg(not(any(target_os = "macos", target_os = "ios")))] - unsafe fn os_fsync(fd: c_int) -> c_int { libc::fsync(fd) } + unsafe fn os_fsync(fd: c_int) -> c_int { + libc::fsync(fd) + } } pub fn datasync(&self) -> io::Result<()> { @@ -739,11 +776,13 @@ impl File { libc::fcntl(fd, libc::F_FULLFSYNC) } #[cfg(target_os = "linux")] - unsafe fn os_datasync(fd: c_int) -> c_int { libc::fdatasync(fd) } - #[cfg(not(any(target_os = "macos", - target_os = "ios", - target_os = "linux")))] - unsafe fn os_datasync(fd: c_int) -> c_int { libc::fsync(fd) } + unsafe fn os_datasync(fd: c_int) -> c_int { + libc::fdatasync(fd) + } + #[cfg(not(any(target_os = "macos", target_os = "ios", target_os = "linux")))] + unsafe fn os_datasync(fd: c_int) -> c_int { + libc::fsync(fd) + } } pub fn truncate(&self, size: u64) -> io::Result<()> { @@ -753,12 +792,9 @@ impl File { #[cfg(not(target_os = "android"))] { use crate::convert::TryInto; - let size: off64_t = size - .try_into() - .map_err(|e| io::Error::new(io::ErrorKind::InvalidInput, e))?; - cvt_r(|| unsafe { - ftruncate64(self.0.raw(), size) - }).map(|_| ()) + let size: off64_t = + size.try_into().map_err(|e| io::Error::new(io::ErrorKind::InvalidInput, e))?; + cvt_r(|| unsafe { ftruncate64(self.0.raw(), size) }).map(drop) } } @@ -786,7 +822,9 @@ impl File { self.0.write_at(buf, offset) } - pub fn flush(&self) -> io::Result<()> { Ok(()) } + pub fn flush(&self) -> io::Result<()> { + Ok(()) + } pub fn seek(&self, pos: SeekFrom) -> io::Result<u64> { let (whence, pos) = match pos { @@ -804,9 +842,13 @@ impl File { self.0.duplicate().map(File) } - pub fn fd(&self) -> &FileDesc { &self.0 } + pub fn fd(&self) -> &FileDesc { + &self.0 + } - pub fn into_fd(self) -> FileDesc { self.0 } + pub fn into_fd(self) -> FileDesc { + self.0 + } pub fn set_permissions(&self, perm: FilePermissions) -> io::Result<()> { cvt_r(|| unsafe { libc::fchmod(self.0.raw(), perm.mode) })?; @@ -856,7 +898,7 @@ impl fmt::Debug for File { // `F_GETPATH` in terms of `MAXPATHLEN`, and there are no // alternatives. If a better method is invented, it should be used // instead. - let mut buf = vec![0;libc::PATH_MAX as usize]; + let mut buf = vec![0; libc::PATH_MAX as usize]; let n = unsafe { libc::fcntl(fd, libc::F_GETPATH, buf.as_ptr()) }; if n == -1 { return None; @@ -883,7 +925,7 @@ impl fmt::Debug for File { libc::O_RDONLY => Some((true, false)), libc::O_RDWR => Some((true, true)), libc::O_WRONLY => Some((false, true)), - _ => None + _ => None, } } @@ -915,10 +957,7 @@ pub fn readdir(p: &Path) -> io::Result<ReadDir> { Err(Error::last_os_error()) } else { let inner = InnerReadDir { dirp: Dir(ptr), root }; - Ok(ReadDir{ - inner: Arc::new(inner), - end_of_stream: false, - }) + Ok(ReadDir { inner: Arc::new(inner), end_of_stream: false }) } } } @@ -955,11 +994,12 @@ pub fn readlink(p: &Path) -> io::Result<PathBuf> { let mut buf = Vec::with_capacity(256); loop { - let buf_read = cvt(unsafe { - libc::readlink(p, buf.as_mut_ptr() as *mut _, buf.capacity()) - })? as usize; + let buf_read = + cvt(unsafe { libc::readlink(p, buf.as_mut_ptr() as *mut _, buf.capacity()) })? as usize; - unsafe { buf.set_len(buf_read); } + unsafe { + buf.set_len(buf_read); + } if buf_read != buf.capacity() { buf.shrink_to_fit(); @@ -1003,9 +1043,7 @@ pub fn stat(p: &Path) -> io::Result<FileAttr> { } let mut stat: stat64 = unsafe { mem::zeroed() }; - cvt(unsafe { - stat64(p.as_ptr(), &mut stat) - })?; + cvt(unsafe { stat64(p.as_ptr(), &mut stat) })?; Ok(FileAttr::from_stat64(stat)) } @@ -1024,9 +1062,7 @@ pub fn lstat(p: &Path) -> io::Result<FileAttr> { } let mut stat: stat64 = unsafe { mem::zeroed() }; - cvt(unsafe { - lstat64(p.as_ptr(), &mut stat) - })?; + cvt(unsafe { lstat64(p.as_ptr(), &mut stat) })?; Ok(FileAttr::from_stat64(stat)) } @@ -1036,7 +1072,7 @@ pub fn canonicalize(p: &Path) -> io::Result<PathBuf> { unsafe { let r = libc::realpath(path.as_ptr(), ptr::null_mut()); if r.is_null() { - return Err(io::Error::last_os_error()) + return Err(io::Error::last_os_error()); } buf = CStr::from_ptr(r).to_bytes().to_vec(); libc::free(r as *mut _); @@ -1083,10 +1119,12 @@ fn open_to_and_set_permissions( Ok((writer, writer_metadata)) } -#[cfg(not(any(target_os = "linux", - target_os = "android", - target_os = "macos", - target_os = "ios")))] +#[cfg(not(any( + target_os = "linux", + target_os = "android", + target_os = "macos", + target_os = "ios" +)))] pub fn copy(from: &Path, to: &Path) -> io::Result<u64> { let (mut reader, reader_metadata) = open_from(from)?; let (mut writer, _) = open_to_and_set_permissions(to, reader_metadata)?; @@ -1111,15 +1149,7 @@ pub fn copy(from: &Path, to: &Path) -> io::Result<u64> { len: libc::size_t, flags: libc::c_uint, ) -> libc::c_long { - libc::syscall( - libc::SYS_copy_file_range, - fd_in, - off_in, - fd_out, - off_out, - len, - flags, - ) + libc::syscall(libc::SYS_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags) } let (mut reader, reader_metadata) = open_from(from)?; @@ -1160,19 +1190,19 @@ pub fn copy(from: &Path, to: &Path) -> io::Result<u64> { Err(err) => { match err.raw_os_error() { Some(os_err) - if os_err == libc::ENOSYS - || os_err == libc::EXDEV - || os_err == libc::EINVAL - || os_err == libc::EPERM => - { - // Try fallback io::copy if either: - // - Kernel version is < 4.5 (ENOSYS) - // - Files are mounted on different fs (EXDEV) - // - copy_file_range is disallowed, for example by seccomp (EPERM) - // - copy_file_range cannot be used with pipes or device nodes (EINVAL) - assert_eq!(written, 0); - return io::copy(&mut reader, &mut writer); - } + if os_err == libc::ENOSYS + || os_err == libc::EXDEV + || os_err == libc::EINVAL + || os_err == libc::EPERM => + { + // Try fallback io::copy if either: + // - Kernel version is < 4.5 (ENOSYS) + // - Files are mounted on different fs (EXDEV) + // - copy_file_range is disallowed, for example by seccomp (EPERM) + // - copy_file_range cannot be used with pipes or device nodes (EINVAL) + assert_eq!(written, 0); + return io::copy(&mut reader, &mut writer); + } _ => return Err(err), } } @@ -1248,14 +1278,8 @@ pub fn copy(from: &Path, to: &Path) -> io::Result<u64> { // using `fclonefileat`. if HAS_FCLONEFILEAT.load(Ordering::Relaxed) { let to = cstr(to)?; - let clonefile_result = cvt(unsafe { - fclonefileat( - reader.as_raw_fd(), - libc::AT_FDCWD, - to.as_ptr(), - 0, - ) - }); + let clonefile_result = + cvt(unsafe { fclonefileat(reader.as_raw_fd(), libc::AT_FDCWD, to.as_ptr(), 0) }); match clonefile_result { Ok(_) => return Ok(reader_metadata.len()), Err(err) => match err.raw_os_error() { @@ -1266,7 +1290,7 @@ pub fn copy(from: &Path, to: &Path) -> io::Result<u64> { Some(libc::ENOTSUP) | Some(libc::EEXIST) | Some(libc::EXDEV) => (), Some(libc::ENOSYS) => HAS_FCLONEFILEAT.store(false, Ordering::Relaxed), _ => return Err(err), - } + }, } } @@ -1283,20 +1307,9 @@ pub fn copy(from: &Path, to: &Path) -> io::Result<u64> { FreeOnDrop(state) }; - let flags = if writer_metadata.is_file() { - COPYFILE_ALL - } else { - COPYFILE_DATA - }; + let flags = if writer_metadata.is_file() { COPYFILE_ALL } else { COPYFILE_DATA }; - cvt(unsafe { - fcopyfile( - reader.as_raw_fd(), - writer.as_raw_fd(), - state.0, - flags, - ) - })?; + cvt(unsafe { fcopyfile(reader.as_raw_fd(), writer.as_raw_fd(), state.0, flags) })?; let mut bytes_copied: libc::off_t = 0; cvt(unsafe { diff --git a/src/libstd/sys/unix/mod.rs b/src/libstd/sys/unix/mod.rs index bf0166ceb6..06876cb061 100644 --- a/src/libstd/sys/unix/mod.rs +++ b/src/libstd/sys/unix/mod.rs @@ -2,21 +2,35 @@ use crate::io::ErrorKind; -#[cfg(any(doc, target_os = "linux"))] pub use crate::os::linux as platform; - -#[cfg(all(not(doc), target_os = "android"))] pub use crate::os::android as platform; -#[cfg(all(not(doc), target_os = "dragonfly"))] pub use crate::os::dragonfly as platform; -#[cfg(all(not(doc), target_os = "freebsd"))] pub use crate::os::freebsd as platform; -#[cfg(all(not(doc), target_os = "haiku"))] pub use crate::os::haiku as platform; -#[cfg(all(not(doc), target_os = "ios"))] pub use crate::os::ios as platform; -#[cfg(all(not(doc), target_os = "macos"))] pub use crate::os::macos as platform; -#[cfg(all(not(doc), target_os = "netbsd"))] pub use crate::os::netbsd as platform; -#[cfg(all(not(doc), target_os = "openbsd"))] pub use crate::os::openbsd as platform; -#[cfg(all(not(doc), target_os = "solaris"))] pub use crate::os::solaris as platform; -#[cfg(all(not(doc), target_os = "emscripten"))] pub use crate::os::emscripten as platform; -#[cfg(all(not(doc), target_os = "fuchsia"))] pub use crate::os::fuchsia as platform; -#[cfg(all(not(doc), target_os = "l4re"))] pub use crate::os::linux as platform; -#[cfg(all(not(doc), target_os = "redox"))] pub use crate::os::redox as platform; +#[cfg(any(doc, target_os = "linux"))] +pub use crate::os::linux as platform; + +#[cfg(all(not(doc), target_os = "android"))] +pub use crate::os::android as platform; +#[cfg(all(not(doc), target_os = "dragonfly"))] +pub use crate::os::dragonfly as platform; +#[cfg(all(not(doc), target_os = "emscripten"))] +pub use crate::os::emscripten as platform; +#[cfg(all(not(doc), target_os = "freebsd"))] +pub use crate::os::freebsd as platform; +#[cfg(all(not(doc), target_os = "fuchsia"))] +pub use crate::os::fuchsia as platform; +#[cfg(all(not(doc), target_os = "haiku"))] +pub use crate::os::haiku as platform; +#[cfg(all(not(doc), target_os = "ios"))] +pub use crate::os::ios as platform; +#[cfg(all(not(doc), target_os = "l4re"))] +pub use crate::os::linux as platform; +#[cfg(all(not(doc), target_os = "macos"))] +pub use crate::os::macos as platform; +#[cfg(all(not(doc), target_os = "netbsd"))] +pub use crate::os::netbsd as platform; +#[cfg(all(not(doc), target_os = "openbsd"))] +pub use crate::os::openbsd as platform; +#[cfg(all(not(doc), target_os = "redox"))] +pub use crate::os::redox as platform; +#[cfg(all(not(doc), target_os = "solaris"))] +pub use crate::os::solaris as platform; pub use self::rand::hashmap_random_keys; pub use libc::strlen; @@ -25,8 +39,8 @@ pub use libc::strlen; pub mod weak; pub mod alloc; -pub mod args; pub mod android; +pub mod args; pub mod cmath; pub mod condvar; pub mod env; @@ -34,14 +48,14 @@ pub mod ext; pub mod fast_thread_local; pub mod fd; pub mod fs; -pub mod memchr; pub mod io; +#[cfg(target_os = "l4re")] +mod l4re; +pub mod memchr; pub mod mutex; #[cfg(not(target_os = "l4re"))] pub mod net; #[cfg(target_os = "l4re")] -mod l4re; -#[cfg(target_os = "l4re")] pub use self::l4re::net; pub mod os; pub mod path; @@ -50,10 +64,10 @@ pub mod process; pub mod rand; pub mod rwlock; pub mod stack_overflow; +pub mod stdio; pub mod thread; pub mod thread_local; pub mod time; -pub mod stdio; pub use crate::sys_common::os_str_bytes as os_str; @@ -102,8 +116,7 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind { // These two constants can have the same value on some systems, // but different values on others, so we can't use a match // clause - x if x == libc::EAGAIN || x == libc::EWOULDBLOCK => - ErrorKind::WouldBlock, + x if x == libc::EAGAIN || x == libc::EWOULDBLOCK => ErrorKind::WouldBlock, _ => ErrorKind::Other, } @@ -125,16 +138,13 @@ macro_rules! impl_is_minus_one { impl_is_minus_one! { i8 i16 i32 i64 isize } pub fn cvt<T: IsMinusOne>(t: T) -> crate::io::Result<T> { - if t.is_minus_one() { - Err(crate::io::Error::last_os_error()) - } else { - Ok(t) - } + if t.is_minus_one() { Err(crate::io::Error::last_os_error()) } else { Ok(t) } } pub fn cvt_r<T, F>(mut f: F) -> crate::io::Result<T> - where T: IsMinusOne, - F: FnMut() -> T +where + T: IsMinusOne, + F: FnMut() -> T, { loop { match cvt(f()) { diff --git a/src/libstd/sys/unix/mutex.rs b/src/libstd/sys/unix/mutex.rs index b43af8fdca..b38375a2e0 100644 --- a/src/libstd/sys/unix/mutex.rs +++ b/src/libstd/sys/unix/mutex.rs @@ -1,7 +1,9 @@ use crate::cell::UnsafeCell; use crate::mem::MaybeUninit; -pub struct Mutex { inner: UnsafeCell<libc::pthread_mutex_t> } +pub struct Mutex { + inner: UnsafeCell<libc::pthread_mutex_t>, +} #[inline] pub unsafe fn raw(m: &Mutex) -> *mut libc::pthread_mutex_t { @@ -82,7 +84,9 @@ impl Mutex { } } -pub struct ReentrantMutex { inner: UnsafeCell<libc::pthread_mutex_t> } +pub struct ReentrantMutex { + inner: UnsafeCell<libc::pthread_mutex_t>, +} unsafe impl Send for ReentrantMutex {} unsafe impl Sync for ReentrantMutex {} @@ -96,8 +100,8 @@ impl ReentrantMutex { let mut attr = MaybeUninit::<libc::pthread_mutexattr_t>::uninit(); let result = libc::pthread_mutexattr_init(attr.as_mut_ptr()); debug_assert_eq!(result, 0); - let result = libc::pthread_mutexattr_settype(attr.as_mut_ptr(), - libc::PTHREAD_MUTEX_RECURSIVE); + let result = + libc::pthread_mutexattr_settype(attr.as_mut_ptr(), libc::PTHREAD_MUTEX_RECURSIVE); debug_assert_eq!(result, 0); let result = libc::pthread_mutex_init(self.inner.get(), attr.as_ptr()); debug_assert_eq!(result, 0); diff --git a/src/libstd/sys/unix/net.rs b/src/libstd/sys/unix/net.rs index 946b2b9d8d..79b0dc0297 100644 --- a/src/libstd/sys/unix/net.rs +++ b/src/libstd/sys/unix/net.rs @@ -18,24 +18,6 @@ pub extern crate libc as netc; pub type wrlen_t = size_t; -// See below for the usage of SOCK_CLOEXEC, but this constant is only defined on -// Linux currently (e.g., support doesn't exist on other platforms). In order to -// get name resolution to work and things to compile we just define a dummy -// SOCK_CLOEXEC here for other platforms. Note that the dummy constant isn't -// actually ever used (the blocks below are wrapped in `if cfg!` as well. -#[cfg(target_os = "linux")] -use libc::SOCK_CLOEXEC; -#[cfg(not(target_os = "linux"))] -const SOCK_CLOEXEC: c_int = 0; - -// Another conditional constant for name resolution: Macos et iOS use -// SO_NOSIGPIPE as a setsockopt flag to disable SIGPIPE emission on socket. -// Other platforms do otherwise. -#[cfg(target_vendor = "apple")] -use libc::SO_NOSIGPIPE; -#[cfg(not(target_vendor = "apple"))] -const SO_NOSIGPIPE: c_int = 0; - pub struct Socket(FileDesc); pub fn init() {} @@ -77,8 +59,9 @@ impl Socket { // this option, however, was added in 2.6.27, and we still support // 2.6.18 as a kernel, so if the returned error is EINVAL we // fallthrough to the fallback. - if cfg!(target_os = "linux") { - match cvt(libc::socket(fam, ty | SOCK_CLOEXEC, 0)) { + #[cfg(target_os = "linux")] + { + match cvt(libc::socket(fam, ty | libc::SOCK_CLOEXEC, 0)) { Ok(fd) => return Ok(Socket(FileDesc::new(fd))), Err(ref e) if e.raw_os_error() == Some(libc::EINVAL) => {} Err(e) => return Err(e), @@ -89,9 +72,12 @@ impl Socket { let fd = FileDesc::new(fd); fd.set_cloexec()?; let socket = Socket(fd); - if cfg!(target_vendor = "apple") { - setsockopt(&socket, libc::SOL_SOCKET, SO_NOSIGPIPE, 1)?; - } + + // macOS and iOS use `SO_NOSIGPIPE` as a `setsockopt` + // flag to disable `SIGPIPE` emission on socket. + #[cfg(target_vendor = "apple")] + setsockopt(&socket, libc::SOL_SOCKET, libc::SO_NOSIGPIPE, 1)?; + Ok(socket) } } @@ -101,8 +87,9 @@ impl Socket { let mut fds = [0, 0]; // Like above, see if we can set cloexec atomically - if cfg!(target_os = "linux") { - match cvt(libc::socketpair(fam, ty | SOCK_CLOEXEC, 0, fds.as_mut_ptr())) { + #[cfg(target_os = "linux")] + { + match cvt(libc::socketpair(fam, ty | libc::SOCK_CLOEXEC, 0, fds.as_mut_ptr())) { Ok(_) => { return Ok((Socket(FileDesc::new(fds[0])), Socket(FileDesc::new(fds[1])))); } @@ -192,7 +179,8 @@ impl Socket { // atomically set the CLOEXEC flag is to use the `accept4` syscall on // Linux. This was added in 2.6.28, however, and because we support // 2.6.18 we must detect this support dynamically. - if cfg!(target_os = "linux") { + #[cfg(target_os = "linux")] + { syscall! { fn accept4( fd: c_int, @@ -201,7 +189,7 @@ impl Socket { flags: c_int ) -> c_int } - let res = cvt_r(|| unsafe { accept4(self.0.raw(), storage, len, SOCK_CLOEXEC) }); + let res = cvt_r(|| unsafe { accept4(self.0.raw(), storage, len, libc::SOCK_CLOEXEC) }); match res { Ok(fd) => return Ok(Socket(FileDesc::new(fd))), Err(ref e) if e.raw_os_error() == Some(libc::ENOSYS) => {} @@ -336,7 +324,7 @@ impl Socket { pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { let mut nonblocking = nonblocking as libc::c_int; - cvt(unsafe { libc::ioctl(*self.as_inner(), libc::FIONBIO, &mut nonblocking) }).map(|_| ()) + cvt(unsafe { libc::ioctl(*self.as_inner(), libc::FIONBIO, &mut nonblocking) }).map(drop) } pub fn take_error(&self) -> io::Result<Option<io::Error>> { diff --git a/src/libstd/sys/unix/os.rs b/src/libstd/sys/unix/os.rs index 10cdb25999..91f7d1524c 100644 --- a/src/libstd/sys/unix/os.rs +++ b/src/libstd/sys/unix/os.rs @@ -5,7 +5,7 @@ use crate::os::unix::prelude::*; use crate::error::Error as StdError; -use crate::ffi::{CString, CStr, OsString, OsStr}; +use crate::ffi::{CStr, CString, OsStr, OsString}; use crate::fmt; use crate::io; use crate::iter; @@ -16,12 +16,12 @@ use crate::path::{self, PathBuf}; use crate::ptr; use crate::slice; use crate::str; -use crate::sys_common::mutex::{Mutex, MutexGuard}; use crate::sys::cvt; use crate::sys::fd; +use crate::sys_common::mutex::{Mutex, MutexGuard}; use crate::vec; -use libc::{c_int, c_char, c_void}; +use libc::{c_char, c_int, c_void}; const TMPBUF_SZ: usize = 128; @@ -33,24 +33,32 @@ cfg_if::cfg_if! { } } -extern { +extern "C" { #[cfg(not(target_os = "dragonfly"))] - #[cfg_attr(any(target_os = "linux", - target_os = "emscripten", - target_os = "fuchsia", - target_os = "l4re"), - link_name = "__errno_location")] - #[cfg_attr(any(target_os = "netbsd", - target_os = "openbsd", - target_os = "android", - target_os = "redox", - target_env = "newlib"), - link_name = "__errno")] + #[cfg_attr( + any( + target_os = "linux", + target_os = "emscripten", + target_os = "fuchsia", + target_os = "l4re" + ), + link_name = "__errno_location" + )] + #[cfg_attr( + any( + target_os = "netbsd", + target_os = "openbsd", + target_os = "android", + target_os = "redox", + target_env = "newlib" + ), + link_name = "__errno" + )] #[cfg_attr(target_os = "solaris", link_name = "___errno")] - #[cfg_attr(any(target_os = "macos", - target_os = "ios", - target_os = "freebsd"), - link_name = "__error")] + #[cfg_attr( + any(target_os = "macos", target_os = "ios", target_os = "freebsd"), + link_name = "__error" + )] #[cfg_attr(target_os = "haiku", link_name = "_errnop")] fn errno_location() -> *mut c_int; } @@ -58,23 +66,18 @@ extern { /// Returns the platform-specific value of errno #[cfg(not(target_os = "dragonfly"))] pub fn errno() -> i32 { - unsafe { - (*errno_location()) as i32 - } + unsafe { (*errno_location()) as i32 } } /// Sets the platform-specific value of errno -#[cfg(all(not(target_os = "linux"), - not(target_os = "dragonfly")))] // needed for readdir and syscall! +#[cfg(all(not(target_os = "linux"), not(target_os = "dragonfly")))] // needed for readdir and syscall! pub fn set_errno(e: i32) { - unsafe { - *errno_location() = e as c_int - } + unsafe { *errno_location() = e as c_int } } #[cfg(target_os = "dragonfly")] pub fn errno() -> i32 { - extern { + extern "C" { #[thread_local] static errno: c_int; } @@ -84,7 +87,7 @@ pub fn errno() -> i32 { #[cfg(target_os = "dragonfly")] pub fn set_errno(e: i32) { - extern { + extern "C" { #[thread_local] static mut errno: c_int; } @@ -96,11 +99,9 @@ pub fn set_errno(e: i32) { /// Gets a detailed string description for the given error number. pub fn error_string(errno: i32) -> String { - extern { - #[cfg_attr(any(target_os = "linux", target_env = "newlib"), - link_name = "__xpg_strerror_r")] - fn strerror_r(errnum: c_int, buf: *mut c_char, - buflen: libc::size_t) -> c_int; + extern "C" { + #[cfg_attr(any(target_os = "linux", target_env = "newlib"), link_name = "__xpg_strerror_r")] + fn strerror_r(errnum: c_int, buf: *mut c_char, buflen: libc::size_t) -> c_int; } let mut buf = [0 as c_char; TMPBUF_SZ]; @@ -154,41 +155,51 @@ pub fn chdir(p: &path::Path) -> io::Result<()> { } pub struct SplitPaths<'a> { - iter: iter::Map<slice::Split<'a, u8, fn(&u8) -> bool>, - fn(&'a [u8]) -> PathBuf>, + iter: iter::Map<slice::Split<'a, u8, fn(&u8) -> bool>, fn(&'a [u8]) -> PathBuf>, } pub fn split_paths(unparsed: &OsStr) -> SplitPaths<'_> { fn bytes_to_path(b: &[u8]) -> PathBuf { PathBuf::from(<OsStr as OsStrExt>::from_bytes(b)) } - fn is_separator(b: &u8) -> bool { *b == PATH_SEPARATOR } + fn is_separator(b: &u8) -> bool { + *b == PATH_SEPARATOR + } let unparsed = unparsed.as_bytes(); SplitPaths { - iter: unparsed.split(is_separator as fn(&u8) -> bool) - .map(bytes_to_path as fn(&[u8]) -> PathBuf) + iter: unparsed + .split(is_separator as fn(&u8) -> bool) + .map(bytes_to_path as fn(&[u8]) -> PathBuf), } } impl<'a> Iterator for SplitPaths<'a> { type Item = PathBuf; - fn next(&mut self) -> Option<PathBuf> { self.iter.next() } - fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() } + fn next(&mut self) -> Option<PathBuf> { + self.iter.next() + } + fn size_hint(&self) -> (usize, Option<usize>) { + self.iter.size_hint() + } } #[derive(Debug)] pub struct JoinPathsError; pub fn join_paths<I, T>(paths: I) -> Result<OsString, JoinPathsError> - where I: Iterator<Item=T>, T: AsRef<OsStr> +where + I: Iterator<Item = T>, + T: AsRef<OsStr>, { let mut joined = Vec::new(); for (i, path) in paths.enumerate() { let path = path.as_ref().as_bytes(); - if i > 0 { joined.push(PATH_SEPARATOR) } + if i > 0 { + joined.push(PATH_SEPARATOR) + } if path.contains(&PATH_SEPARATOR) { - return Err(JoinPathsError) + return Err(JoinPathsError); } joined.extend_from_slice(path); } @@ -202,26 +213,42 @@ impl fmt::Display for JoinPathsError { } impl StdError for JoinPathsError { - fn description(&self) -> &str { "failed to join paths" } + #[allow(deprecated)] + fn description(&self) -> &str { + "failed to join paths" + } } #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] pub fn current_exe() -> io::Result<PathBuf> { unsafe { - let mut mib = [libc::CTL_KERN as c_int, - libc::KERN_PROC as c_int, - libc::KERN_PROC_PATHNAME as c_int, - -1 as c_int]; + let mut mib = [ + libc::CTL_KERN as c_int, + libc::KERN_PROC as c_int, + libc::KERN_PROC_PATHNAME as c_int, + -1 as c_int, + ]; let mut sz = 0; - cvt(libc::sysctl(mib.as_mut_ptr(), mib.len() as libc::c_uint, - ptr::null_mut(), &mut sz, ptr::null_mut(), 0))?; + cvt(libc::sysctl( + mib.as_mut_ptr(), + mib.len() as libc::c_uint, + ptr::null_mut(), + &mut sz, + ptr::null_mut(), + 0, + ))?; if sz == 0 { - return Err(io::Error::last_os_error()) + return Err(io::Error::last_os_error()); } let mut v: Vec<u8> = Vec::with_capacity(sz); - cvt(libc::sysctl(mib.as_mut_ptr(), mib.len() as libc::c_uint, - v.as_mut_ptr() as *mut libc::c_void, &mut sz, - ptr::null_mut(), 0))?; + cvt(libc::sysctl( + mib.as_mut_ptr(), + mib.len() as libc::c_uint, + v.as_mut_ptr() as *mut libc::c_void, + &mut sz, + ptr::null_mut(), + 0, + ))?; if sz == 0 { return Err(io::Error::last_os_error()); } @@ -236,17 +263,29 @@ pub fn current_exe() -> io::Result<PathBuf> { unsafe { let mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, -1, libc::KERN_PROC_PATHNAME]; let mut path_len: usize = 0; - cvt(libc::sysctl(mib.as_ptr(), mib.len() as libc::c_uint, - ptr::null_mut(), &mut path_len, - ptr::null(), 0))?; + cvt(libc::sysctl( + mib.as_ptr(), + mib.len() as libc::c_uint, + ptr::null_mut(), + &mut path_len, + ptr::null(), + 0, + ))?; if path_len <= 1 { - return Err(io::Error::new(io::ErrorKind::Other, - "KERN_PROC_PATHNAME sysctl returned zero-length string")) + return Err(io::Error::new( + io::ErrorKind::Other, + "KERN_PROC_PATHNAME sysctl returned zero-length string", + )); } let mut path: Vec<u8> = Vec::with_capacity(path_len); - cvt(libc::sysctl(mib.as_ptr(), mib.len() as libc::c_uint, - path.as_ptr() as *mut libc::c_void, &mut path_len, - ptr::null(), 0))?; + cvt(libc::sysctl( + mib.as_ptr(), + mib.len() as libc::c_uint, + path.as_ptr() as *mut libc::c_void, + &mut path_len, + ptr::null(), + 0, + ))?; path.set_len(path_len - 1); // chop off NUL Ok(PathBuf::from(OsString::from_vec(path))) } @@ -256,8 +295,10 @@ pub fn current_exe() -> io::Result<PathBuf> { if curproc_exe.is_file() { return crate::fs::read_link(curproc_exe); } - Err(io::Error::new(io::ErrorKind::Other, - "/proc/curproc/exe doesn't point to regular file.")) + Err(io::Error::new( + io::ErrorKind::Other, + "/proc/curproc/exe doesn't point to regular file.", + )) } sysctl().or_else(|_| procfs()) } @@ -265,21 +306,15 @@ pub fn current_exe() -> io::Result<PathBuf> { #[cfg(target_os = "openbsd")] pub fn current_exe() -> io::Result<PathBuf> { unsafe { - let mut mib = [libc::CTL_KERN, - libc::KERN_PROC_ARGS, - libc::getpid(), - libc::KERN_PROC_ARGV]; + let mut mib = [libc::CTL_KERN, libc::KERN_PROC_ARGS, libc::getpid(), libc::KERN_PROC_ARGV]; let mib = mib.as_mut_ptr(); let mut argv_len = 0; - cvt(libc::sysctl(mib, 4, ptr::null_mut(), &mut argv_len, - ptr::null_mut(), 0))?; + cvt(libc::sysctl(mib, 4, ptr::null_mut(), &mut argv_len, ptr::null_mut(), 0))?; let mut argv = Vec::<*const libc::c_char>::with_capacity(argv_len as usize); - cvt(libc::sysctl(mib, 4, argv.as_mut_ptr() as *mut _, - &mut argv_len, ptr::null_mut(), 0))?; + cvt(libc::sysctl(mib, 4, argv.as_mut_ptr() as *mut _, &mut argv_len, ptr::null_mut(), 0))?; argv.set_len(argv_len as usize); if argv[0].is_null() { - return Err(io::Error::new(io::ErrorKind::Other, - "no current exe available")) + return Err(io::Error::new(io::ErrorKind::Other, "no current exe available")); } let argv0 = CStr::from_ptr(argv[0]).to_bytes(); if argv0[0] == b'.' || argv0.iter().any(|b| *b == b'/') { @@ -293,29 +328,30 @@ pub fn current_exe() -> io::Result<PathBuf> { #[cfg(any(target_os = "linux", target_os = "android", target_os = "emscripten"))] pub fn current_exe() -> io::Result<PathBuf> { match crate::fs::read_link("/proc/self/exe") { - Err(ref e) if e.kind() == io::ErrorKind::NotFound => { - Err(io::Error::new( - io::ErrorKind::Other, - "no /proc/self/exe available. Is /proc mounted?" - )) - }, + Err(ref e) if e.kind() == io::ErrorKind::NotFound => Err(io::Error::new( + io::ErrorKind::Other, + "no /proc/self/exe available. Is /proc mounted?", + )), other => other, } } #[cfg(any(target_os = "macos", target_os = "ios"))] pub fn current_exe() -> io::Result<PathBuf> { - extern { - fn _NSGetExecutablePath(buf: *mut libc::c_char, - bufsize: *mut u32) -> libc::c_int; + extern "C" { + fn _NSGetExecutablePath(buf: *mut libc::c_char, bufsize: *mut u32) -> libc::c_int; } unsafe { let mut sz: u32 = 0; _NSGetExecutablePath(ptr::null_mut(), &mut sz); - if sz == 0 { return Err(io::Error::last_os_error()); } + if sz == 0 { + return Err(io::Error::last_os_error()); + } let mut v: Vec<u8> = Vec::with_capacity(sz as usize); let err = _NSGetExecutablePath(v.as_mut_ptr() as *mut i8, &mut sz); - if err != 0 { return Err(io::Error::last_os_error()); } + if err != 0 { + return Err(io::Error::last_os_error()); + } v.set_len(sz as usize - 1); // chop off trailing NUL Ok(PathBuf::from(OsString::from_vec(v))) } @@ -323,7 +359,7 @@ pub fn current_exe() -> io::Result<PathBuf> { #[cfg(any(target_os = "solaris"))] pub fn current_exe() -> io::Result<PathBuf> { - extern { + extern "C" { fn getexecname() -> *const c_char; } unsafe { @@ -336,11 +372,7 @@ pub fn current_exe() -> io::Result<PathBuf> { // Prepend a current working directory to the path if // it doesn't contain an absolute pathname. - if filename[0] == b'/' { - Ok(path) - } else { - getcwd().map(|cwd| cwd.join(path)) - } + if filename[0] == b'/' { Ok(path) } else { getcwd().map(|cwd| cwd.join(path)) } } } } @@ -354,11 +386,11 @@ pub fn current_exe() -> io::Result<PathBuf> { type_: i32, sequence: i32, init_order: i32, - init_routine: *mut libc::c_void, // function pointer - term_routine: *mut libc::c_void, // function pointer + init_routine: *mut libc::c_void, // function pointer + term_routine: *mut libc::c_void, // function pointer device: libc::dev_t, node: libc::ino_t, - name: [libc::c_char; 1024], // MAXPATHLEN + name: [libc::c_char; 1024], // MAXPATHLEN text: *mut libc::c_void, data: *mut libc::c_void, text_size: i32, @@ -368,16 +400,20 @@ pub fn current_exe() -> io::Result<PathBuf> { } unsafe { - extern { - fn _get_next_image_info(team_id: i32, cookie: *mut i32, - info: *mut image_info, size: i32) -> i32; + extern "C" { + fn _get_next_image_info( + team_id: i32, + cookie: *mut i32, + info: *mut image_info, + size: i32, + ) -> i32; } let mut info: image_info = mem::zeroed(); let mut cookie: i32 = 0; // the executable can be found at team id 0 - let result = _get_next_image_info(0, &mut cookie, &mut info, - mem::size_of::<image_info>() as i32); + let result = + _get_next_image_info(0, &mut cookie, &mut info, mem::size_of::<image_info>() as i32); if result != 0 { use crate::io::ErrorKind; Err(io::Error::new(ErrorKind::Other, "Error getting executable path")) @@ -406,19 +442,27 @@ pub struct Env { impl Iterator for Env { type Item = (OsString, OsString); - fn next(&mut self) -> Option<(OsString, OsString)> { self.iter.next() } - fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() } + fn next(&mut self) -> Option<(OsString, OsString)> { + self.iter.next() + } + fn size_hint(&self) -> (usize, Option<usize>) { + self.iter.size_hint() + } } #[cfg(target_os = "macos")] pub unsafe fn environ() -> *mut *const *const c_char { - extern { fn _NSGetEnviron() -> *mut *const *const c_char; } + extern "C" { + fn _NSGetEnviron() -> *mut *const *const c_char; + } _NSGetEnviron() } #[cfg(not(target_os = "macos"))] pub unsafe fn environ() -> *mut *const *const c_char { - extern { static mut environ: *const *const c_char; } + extern "C" { + static mut environ: *const *const c_char; + } &mut environ } @@ -436,16 +480,15 @@ pub fn env() -> Env { let _guard = env_lock(); let mut environ = *environ(); let mut result = Vec::new(); - while environ != ptr::null() && *environ != ptr::null() { - if let Some(key_value) = parse(CStr::from_ptr(*environ).to_bytes()) { - result.push(key_value); + if !environ.is_null() { + while !(*environ).is_null() { + if let Some(key_value) = parse(CStr::from_ptr(*environ).to_bytes()) { + result.push(key_value); + } + environ = environ.add(1); } - environ = environ.offset(1); - } - return Env { - iter: result.into_iter(), - _dont_send_or_sync_me: PhantomData, } + return Env { iter: result.into_iter(), _dont_send_or_sync_me: PhantomData }; } fn parse(input: &[u8]) -> Option<(OsString, OsString)> { @@ -457,10 +500,12 @@ pub fn env() -> Env { return None; } let pos = memchr::memchr(b'=', &input[1..]).map(|p| p + 1); - pos.map(|p| ( - OsStringExt::from_vec(input[..p].to_vec()), - OsStringExt::from_vec(input[p+1..].to_vec()), - )) + pos.map(|p| { + ( + OsStringExt::from_vec(input[..p].to_vec()), + OsStringExt::from_vec(input[p + 1..].to_vec()), + ) + }) } } @@ -486,7 +531,7 @@ pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> { unsafe { let _guard = env_lock(); - cvt(libc::setenv(k.as_ptr(), v.as_ptr(), 1)).map(|_| ()) + cvt(libc::setenv(k.as_ptr(), v.as_ptr(), 1)).map(drop) } } @@ -495,14 +540,12 @@ pub fn unsetenv(n: &OsStr) -> io::Result<()> { unsafe { let _guard = env_lock(); - cvt(libc::unsetenv(nbuf.as_ptr())).map(|_| ()) + cvt(libc::unsetenv(nbuf.as_ptr())).map(drop) } } pub fn page_size() -> usize { - unsafe { - libc::sysconf(libc::_SC_PAGESIZE) as usize - } + unsafe { libc::sysconf(libc::_SC_PAGESIZE) as usize } } pub fn temp_dir() -> PathBuf { @@ -516,19 +559,23 @@ pub fn temp_dir() -> PathBuf { } pub fn home_dir() -> Option<PathBuf> { - return crate::env::var_os("HOME").or_else(|| unsafe { - fallback() - }).map(PathBuf::from); - - #[cfg(any(target_os = "android", - target_os = "ios", - target_os = "emscripten", - target_os = "redox"))] - unsafe fn fallback() -> Option<OsString> { None } - #[cfg(not(any(target_os = "android", - target_os = "ios", - target_os = "emscripten", - target_os = "redox")))] + return crate::env::var_os("HOME").or_else(|| unsafe { fallback() }).map(PathBuf::from); + + #[cfg(any( + target_os = "android", + target_os = "ios", + target_os = "emscripten", + target_os = "redox" + ))] + unsafe fn fallback() -> Option<OsString> { + None + } + #[cfg(not(any( + target_os = "android", + target_os = "ios", + target_os = "emscripten", + target_os = "redox" + )))] unsafe fn fallback() -> Option<OsString> { let amt = match libc::sysconf(libc::_SC_GETPW_R_SIZE_MAX) { n if n < 0 => 512 as usize, @@ -537,13 +584,18 @@ pub fn home_dir() -> Option<PathBuf> { let mut buf = Vec::with_capacity(amt); let mut passwd: libc::passwd = mem::zeroed(); let mut result = ptr::null_mut(); - match libc::getpwuid_r(libc::getuid(), &mut passwd, buf.as_mut_ptr(), - buf.capacity(), &mut result) { + match libc::getpwuid_r( + libc::getuid(), + &mut passwd, + buf.as_mut_ptr(), + buf.capacity(), + &mut result, + ) { 0 if !result.is_null() => { let ptr = passwd.pw_dir as *const _; let bytes = CStr::from_ptr(ptr).to_bytes().to_vec(); Some(OsStringExt::from_vec(bytes)) - }, + } _ => None, } } @@ -589,7 +641,7 @@ fn parse_glibc_version(version: &str) -> Option<(usize, usize)> { let mut parsed_ints = version.split('.').map(str::parse::<usize>).fuse(); match (parsed_ints.next(), parsed_ints.next()) { (Some(Ok(major)), Some(Ok(minor))) => Some((major, minor)), - _ => None + _ => None, } } diff --git a/src/libstd/sys/unix/pipe.rs b/src/libstd/sys/unix/pipe.rs index 77fefef8a1..2a861c8780 100644 --- a/src/libstd/sys/unix/pipe.rs +++ b/src/libstd/sys/unix/pipe.rs @@ -99,11 +99,11 @@ pub fn read2(p1: AnonPipe, v1: &mut Vec<u8>, p2: AnonPipe, v2: &mut Vec<u8>) -> if fds[0].revents != 0 && read(&p1, v1)? { p2.set_nonblocking(false)?; - return p2.read_to_end(v2).map(|_| ()); + return p2.read_to_end(v2).map(drop); } if fds[1].revents != 0 && read(&p2, v2)? { p1.set_nonblocking(false)?; - return p1.read_to_end(v1).map(|_| ()); + return p1.read_to_end(v1).map(drop); } } diff --git a/src/libstd/sys/unix/process/process_unix.rs b/src/libstd/sys/unix/process/process_unix.rs index 45e4d195f1..07d0fbf61f 100644 --- a/src/libstd/sys/unix/process/process_unix.rs +++ b/src/libstd/sys/unix/process/process_unix.rs @@ -1,9 +1,9 @@ use crate::fmt; use crate::io::{self, Error, ErrorKind}; use crate::ptr; +use crate::sys; use crate::sys::cvt; use crate::sys::process::process_common::*; -use crate::sys; use libc::{c_int, gid_t, pid_t, uid_t}; @@ -12,21 +12,23 @@ use libc::{c_int, gid_t, pid_t, uid_t}; //////////////////////////////////////////////////////////////////////////////// impl Command { - pub fn spawn(&mut self, default: Stdio, needs_stdin: bool) - -> io::Result<(Process, StdioPipes)> { + pub fn spawn( + &mut self, + default: Stdio, + needs_stdin: bool, + ) -> io::Result<(Process, StdioPipes)> { const CLOEXEC_MSG_FOOTER: &[u8] = b"NOEX"; let envp = self.capture_env(); if self.saw_nul() { - return Err(io::Error::new(ErrorKind::InvalidInput, - "nul byte found in provided data")); + return Err(io::Error::new(ErrorKind::InvalidInput, "nul byte found in provided data")); } let (ours, theirs) = self.setup_io(default, needs_stdin)?; if let Some(ret) = self.posix_spawn(&theirs, envp.as_ref())? { - return Ok((ret, ours)) + return Ok((ret, ours)); } let (input, output) = sys::pipe::anon_pipe()?; @@ -53,10 +55,12 @@ impl Command { let bytes = [ (errno >> 24) as u8, (errno >> 16) as u8, - (errno >> 8) as u8, - (errno >> 0) as u8, - CLOEXEC_MSG_FOOTER[0], CLOEXEC_MSG_FOOTER[1], - CLOEXEC_MSG_FOOTER[2], CLOEXEC_MSG_FOOTER[3] + (errno >> 8) as u8, + (errno >> 0) as u8, + CLOEXEC_MSG_FOOTER[0], + CLOEXEC_MSG_FOOTER[1], + CLOEXEC_MSG_FOOTER[2], + CLOEXEC_MSG_FOOTER[3], ]; // pipe I/O up to PIPE_BUF bytes should be atomic, and then // we want to be sure we *don't* run at_exit destructors as @@ -77,22 +81,23 @@ impl Command { match input.read(&mut bytes) { Ok(0) => return Ok((p, ours)), Ok(8) => { - assert!(combine(CLOEXEC_MSG_FOOTER) == combine(&bytes[4.. 8]), - "Validation on the CLOEXEC pipe failed: {:?}", bytes); - let errno = combine(&bytes[0.. 4]); - assert!(p.wait().is_ok(), - "wait() should either return Ok or panic"); - return Err(Error::from_raw_os_error(errno)) + assert!( + combine(CLOEXEC_MSG_FOOTER) == combine(&bytes[4..8]), + "Validation on the CLOEXEC pipe failed: {:?}", + bytes + ); + let errno = combine(&bytes[0..4]); + assert!(p.wait().is_ok(), "wait() should either return Ok or panic"); + return Err(Error::from_raw_os_error(errno)); } Err(ref e) if e.kind() == ErrorKind::Interrupted => {} Err(e) => { - assert!(p.wait().is_ok(), - "wait() should either return Ok or panic"); + assert!(p.wait().is_ok(), "wait() should either return Ok or panic"); panic!("the CLOEXEC pipe failed: {:?}", e) - }, - Ok(..) => { // pipe I/O up to PIPE_BUF bytes should be atomic - assert!(p.wait().is_ok(), - "wait() should either return Ok or panic"); + } + Ok(..) => { + // pipe I/O up to PIPE_BUF bytes should be atomic + assert!(p.wait().is_ok(), "wait() should either return Ok or panic"); panic!("short read on the CLOEXEC pipe") } } @@ -112,8 +117,7 @@ impl Command { let envp = self.capture_env(); if self.saw_nul() { - return io::Error::new(ErrorKind::InvalidInput, - "nul byte found in provided data") + return io::Error::new(ErrorKind::InvalidInput, "nul byte found in provided data"); } match self.setup_io(default, true) { @@ -165,7 +169,7 @@ impl Command { unsafe fn do_exec( &mut self, stdio: ChildPipes, - maybe_envp: Option<&CStringArray> + maybe_envp: Option<&CStringArray>, ) -> Result<!, io::Error> { use crate::sys::{self, cvt_r}; @@ -215,11 +219,10 @@ impl Command { // we're about to run. let mut set = MaybeUninit::<libc::sigset_t>::uninit(); cvt(sigemptyset(set.as_mut_ptr()))?; - cvt(libc::pthread_sigmask(libc::SIG_SETMASK, set.as_ptr(), - ptr::null_mut()))?; + cvt(libc::pthread_sigmask(libc::SIG_SETMASK, set.as_ptr(), ptr::null_mut()))?; let ret = sys::signal(libc::SIGPIPE, libc::SIG_DFL); if ret == libc::SIG_ERR { - return Err(io::Error::last_os_error()) + return Err(io::Error::last_os_error()); } } @@ -252,29 +255,40 @@ impl Command { Err(io::Error::last_os_error()) } - #[cfg(not(any(target_os = "macos", target_os = "freebsd", - all(target_os = "linux", target_env = "gnu"))))] - fn posix_spawn(&mut self, _: &ChildPipes, _: Option<&CStringArray>) - -> io::Result<Option<Process>> - { + #[cfg(not(any( + target_os = "macos", + target_os = "freebsd", + all(target_os = "linux", target_env = "gnu") + )))] + fn posix_spawn( + &mut self, + _: &ChildPipes, + _: Option<&CStringArray>, + ) -> io::Result<Option<Process>> { Ok(None) } // Only support platforms for which posix_spawn() can return ENOENT // directly. - #[cfg(any(target_os = "macos", target_os = "freebsd", - all(target_os = "linux", target_env = "gnu")))] - fn posix_spawn(&mut self, stdio: &ChildPipes, envp: Option<&CStringArray>) - -> io::Result<Option<Process>> - { + #[cfg(any( + target_os = "macos", + target_os = "freebsd", + all(target_os = "linux", target_env = "gnu") + ))] + fn posix_spawn( + &mut self, + stdio: &ChildPipes, + envp: Option<&CStringArray>, + ) -> io::Result<Option<Process>> { use crate::mem::MaybeUninit; use crate::sys; - if self.get_gid().is_some() || - self.get_uid().is_some() || - self.env_saw_path() || - !self.get_closures().is_empty() { - return Ok(None) + if self.get_gid().is_some() + || self.get_uid().is_some() + || self.env_saw_path() + || !self.get_closures().is_empty() + { + return Ok(None); } // Only glibc 2.24+ posix_spawn() supports returning ENOENT directly. @@ -282,10 +296,10 @@ impl Command { { if let Some(version) = sys::os::glibc_version() { if version < (2, 24) { - return Ok(None) + return Ok(None); } } else { - return Ok(None) + return Ok(None); } } @@ -337,19 +351,25 @@ impl Command { libc::posix_spawn_file_actions_init(file_actions.0.as_mut_ptr()); if let Some(fd) = stdio.stdin.fd() { - cvt(libc::posix_spawn_file_actions_adddup2(file_actions.0.as_mut_ptr(), - fd, - libc::STDIN_FILENO))?; + cvt(libc::posix_spawn_file_actions_adddup2( + file_actions.0.as_mut_ptr(), + fd, + libc::STDIN_FILENO, + ))?; } if let Some(fd) = stdio.stdout.fd() { - cvt(libc::posix_spawn_file_actions_adddup2(file_actions.0.as_mut_ptr(), - fd, - libc::STDOUT_FILENO))?; + cvt(libc::posix_spawn_file_actions_adddup2( + file_actions.0.as_mut_ptr(), + fd, + libc::STDOUT_FILENO, + ))?; } if let Some(fd) = stdio.stderr.fd() { - cvt(libc::posix_spawn_file_actions_adddup2(file_actions.0.as_mut_ptr(), - fd, - libc::STDERR_FILENO))?; + cvt(libc::posix_spawn_file_actions_adddup2( + file_actions.0.as_mut_ptr(), + fd, + libc::STDERR_FILENO, + ))?; } if let Some((f, cwd)) = addchdir { cvt(f(file_actions.0.as_mut_ptr(), cwd.as_ptr()))?; @@ -357,20 +377,16 @@ impl Command { let mut set = MaybeUninit::<libc::sigset_t>::uninit(); cvt(sigemptyset(set.as_mut_ptr()))?; - cvt(libc::posix_spawnattr_setsigmask(attrs.0.as_mut_ptr(), - set.as_ptr()))?; + cvt(libc::posix_spawnattr_setsigmask(attrs.0.as_mut_ptr(), set.as_ptr()))?; cvt(sigaddset(set.as_mut_ptr(), libc::SIGPIPE))?; - cvt(libc::posix_spawnattr_setsigdefault(attrs.0.as_mut_ptr(), - set.as_ptr()))?; + cvt(libc::posix_spawnattr_setsigdefault(attrs.0.as_mut_ptr(), set.as_ptr()))?; - let flags = libc::POSIX_SPAWN_SETSIGDEF | - libc::POSIX_SPAWN_SETSIGMASK; + let flags = libc::POSIX_SPAWN_SETSIGDEF | libc::POSIX_SPAWN_SETSIGMASK; cvt(libc::posix_spawnattr_setflags(attrs.0.as_mut_ptr(), flags as _))?; // Make sure we synchronize access to the global `environ` resource let _env_lock = sys::os::env_lock(); - let envp = envp.map(|c| c.as_ptr()) - .unwrap_or_else(|| *sys::os::environ() as *const _); + let envp = envp.map(|c| c.as_ptr()).unwrap_or_else(|| *sys::os::environ() as *const _); let ret = libc::posix_spawnp( &mut p.pid, self.get_program().as_ptr(), @@ -379,11 +395,7 @@ impl Command { self.get_argv().as_ptr() as *const _, envp as *const _, ); - if ret == 0 { - Ok(Some(p)) - } else { - Err(io::Error::from_raw_os_error(ret)) - } + if ret == 0 { Ok(Some(p)) } else { Err(io::Error::from_raw_os_error(ret)) } } } } @@ -408,17 +420,19 @@ impl Process { // and used for another process, and we probably shouldn't be killing // random processes, so just return an error. if self.status.is_some() { - Err(Error::new(ErrorKind::InvalidInput, - "invalid argument: can't kill an exited process")) + Err(Error::new( + ErrorKind::InvalidInput, + "invalid argument: can't kill an exited process", + )) } else { - cvt(unsafe { libc::kill(self.pid, libc::SIGKILL) }).map(|_| ()) + cvt(unsafe { libc::kill(self.pid, libc::SIGKILL) }).map(drop) } } pub fn wait(&mut self) -> io::Result<ExitStatus> { use crate::sys::cvt_r; if let Some(status) = self.status { - return Ok(status) + return Ok(status); } let mut status = 0 as c_int; cvt_r(|| unsafe { libc::waitpid(self.pid, &mut status, 0) })?; @@ -428,12 +442,10 @@ impl Process { pub fn try_wait(&mut self) -> io::Result<Option<ExitStatus>> { if let Some(status) = self.status { - return Ok(Some(status)) + return Ok(Some(status)); } let mut status = 0 as c_int; - let pid = cvt(unsafe { - libc::waitpid(self.pid, &mut status, libc::WNOHANG) - })?; + let pid = cvt(unsafe { libc::waitpid(self.pid, &mut status, libc::WNOHANG) })?; if pid == 0 { Ok(None) } else { @@ -461,19 +473,11 @@ impl ExitStatus { } pub fn code(&self) -> Option<i32> { - if self.exited() { - Some(unsafe { libc::WEXITSTATUS(self.0) }) - } else { - None - } + if self.exited() { Some(unsafe { libc::WEXITSTATUS(self.0) }) } else { None } } pub fn signal(&self) -> Option<i32> { - if !self.exited() { - Some(unsafe { libc::WTERMSIG(self.0) }) - } else { - None - } + if !self.exited() { Some(unsafe { libc::WTERMSIG(self.0) }) } else { None } } } diff --git a/src/libstd/sys/unix/rwlock.rs b/src/libstd/sys/unix/rwlock.rs index e48bfdae61..079dea671e 100644 --- a/src/libstd/sys/unix/rwlock.rs +++ b/src/libstd/sys/unix/rwlock.rs @@ -71,8 +71,10 @@ impl RWLock { let r = libc::pthread_rwlock_wrlock(self.inner.get()); // See comments above for why we check for EDEADLK and write_locked. We // also need to check that num_readers is 0. - if r == libc::EDEADLK || *self.write_locked.get() || - self.num_readers.load(Ordering::Relaxed) != 0 { + if r == libc::EDEADLK + || *self.write_locked.get() + || self.num_readers.load(Ordering::Relaxed) != 0 + { if r == 0 { self.raw_unlock(); } diff --git a/src/libstd/sys/unix/time.rs b/src/libstd/sys/unix/time.rs index a9122defa5..2310441997 100644 --- a/src/libstd/sys/unix/time.rs +++ b/src/libstd/sys/unix/time.rs @@ -15,20 +15,21 @@ struct Timespec { impl Timespec { const fn zero() -> Timespec { - Timespec { - t: libc::timespec { tv_sec: 0, tv_nsec: 0 }, - } + Timespec { t: libc::timespec { tv_sec: 0, tv_nsec: 0 } } } fn sub_timespec(&self, other: &Timespec) -> Result<Duration, Duration> { if self >= other { Ok(if self.t.tv_nsec >= other.t.tv_nsec { - Duration::new((self.t.tv_sec - other.t.tv_sec) as u64, - (self.t.tv_nsec - other.t.tv_nsec) as u32) + Duration::new( + (self.t.tv_sec - other.t.tv_sec) as u64, + (self.t.tv_nsec - other.t.tv_nsec) as u32, + ) } else { - Duration::new((self.t.tv_sec - 1 - other.t.tv_sec) as u64, - self.t.tv_nsec as u32 + (NSEC_PER_SEC as u32) - - other.t.tv_nsec as u32) + Duration::new( + (self.t.tv_sec - 1 - other.t.tv_sec) as u64, + self.t.tv_nsec as u32 + (NSEC_PER_SEC as u32) - other.t.tv_nsec as u32, + ) }) } else { match other.sub_timespec(self) { @@ -52,12 +53,7 @@ impl Timespec { nsec -= NSEC_PER_SEC as u32; secs = secs.checked_add(1)?; } - Some(Timespec { - t: libc::timespec { - tv_sec: secs, - tv_nsec: nsec as _, - }, - }) + Some(Timespec { t: libc::timespec { tv_sec: secs, tv_nsec: nsec as _ } }) } fn checked_sub_duration(&self, other: &Duration) -> Option<Timespec> { @@ -73,12 +69,7 @@ impl Timespec { nsec += NSEC_PER_SEC as i32; secs = secs.checked_sub(1)?; } - Some(Timespec { - t: libc::timespec { - tv_sec: secs, - tv_nsec: nsec as _, - }, - }) + Some(Timespec { t: libc::timespec { tv_sec: secs, tv_nsec: nsec as _ } }) } } @@ -105,7 +96,7 @@ impl Ord for Timespec { } impl Hash for Timespec { - fn hash<H : Hasher>(&self, state: &mut H) { + fn hash<H: Hasher>(&self, state: &mut H) { self.t.tv_sec.hash(state); self.t.tv_nsec.hash(state); } @@ -120,12 +111,12 @@ mod inner { use crate::sys_common::mul_div_u64; use crate::time::Duration; - use super::NSEC_PER_SEC; use super::Timespec; + use super::NSEC_PER_SEC; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] pub struct Instant { - t: u64 + t: u64, } #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -133,9 +124,7 @@ mod inner { t: Timespec, } - pub const UNIX_EPOCH: SystemTime = SystemTime { - t: Timespec::zero(), - }; + pub const UNIX_EPOCH: SystemTime = SystemTime { t: Timespec::zero() }; #[repr(C)] #[derive(Copy, Clone)] @@ -170,15 +159,11 @@ mod inner { } pub fn checked_add_duration(&self, other: &Duration) -> Option<Instant> { - Some(Instant { - t: self.t.checked_add(checked_dur2intervals(other)?)?, - }) + Some(Instant { t: self.t.checked_add(checked_dur2intervals(other)?)? }) } pub fn checked_sub_duration(&self, other: &Duration) -> Option<Instant> { - Some(Instant { - t: self.t.checked_sub(checked_dur2intervals(other)?)?, - }) + Some(Instant { t: self.t.checked_sub(checked_dur2intervals(other)?)? }) } } @@ -186,18 +171,12 @@ mod inner { pub fn now() -> SystemTime { use crate::ptr; - let mut s = libc::timeval { - tv_sec: 0, - tv_usec: 0, - }; - cvt(unsafe { - libc::gettimeofday(&mut s, ptr::null_mut()) - }).unwrap(); - return SystemTime::from(s) + let mut s = libc::timeval { tv_sec: 0, tv_usec: 0 }; + cvt(unsafe { libc::gettimeofday(&mut s, ptr::null_mut()) }).unwrap(); + return SystemTime::from(s); } - pub fn sub_time(&self, other: &SystemTime) - -> Result<Duration, Duration> { + pub fn sub_time(&self, other: &SystemTime) -> Result<Duration, Duration> { self.t.sub_timespec(&other.t) } @@ -228,25 +207,21 @@ mod inner { impl fmt::Debug for SystemTime { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("SystemTime") - .field("tv_sec", &self.t.t.tv_sec) - .field("tv_nsec", &self.t.t.tv_nsec) - .finish() + .field("tv_sec", &self.t.t.tv_sec) + .field("tv_nsec", &self.t.t.tv_nsec) + .finish() } } fn checked_dur2intervals(dur: &Duration) -> Option<u64> { - let nanos = dur.as_secs() - .checked_mul(NSEC_PER_SEC)? - .checked_add(dur.subsec_nanos() as u64)?; + let nanos = + dur.as_secs().checked_mul(NSEC_PER_SEC)?.checked_add(dur.subsec_nanos() as u64)?; let info = info(); Some(mul_div_u64(nanos, info.denom as u64, info.numer as u64)) } fn info() -> mach_timebase_info { - static mut INFO: mach_timebase_info = mach_timebase_info { - numer: 0, - denom: 0, - }; + static mut INFO: mach_timebase_info = mach_timebase_info { numer: 0, denom: 0 }; static STATE: AtomicUsize = AtomicUsize::new(0); unsafe { @@ -258,8 +233,7 @@ mod inner { // ... otherwise learn for ourselves ... let mut info = mem::zeroed(); extern "C" { - fn mach_timebase_info(info: mach_timebase_info_t) - -> kern_return_t; + fn mach_timebase_info(info: mach_timebase_info_t) -> kern_return_t; } mach_timebase_info(&mut info); @@ -293,9 +267,7 @@ mod inner { t: Timespec, } - pub const UNIX_EPOCH: SystemTime = SystemTime { - t: Timespec::zero(), - }; + pub const UNIX_EPOCH: SystemTime = SystemTime { t: Timespec::zero() }; impl Instant { pub fn now() -> Instant { @@ -303,16 +275,14 @@ mod inner { } pub const fn zero() -> Instant { - Instant { - t: Timespec::zero(), - } + Instant { t: Timespec::zero() } } pub fn actually_monotonic() -> bool { - (cfg!(target_os = "linux") && cfg!(target_arch = "x86_64")) || - (cfg!(target_os = "linux") && cfg!(target_arch = "x86")) || - cfg!(target_os = "fuchsia") || - false // last clause, used so `||` is always trailing above + (cfg!(target_os = "linux") && cfg!(target_arch = "x86_64")) + || (cfg!(target_os = "linux") && cfg!(target_arch = "x86")) + || cfg!(target_os = "fuchsia") + || false // last clause, used so `||` is always trailing above } pub fn checked_sub_instant(&self, other: &Instant) -> Option<Duration> { @@ -331,9 +301,9 @@ mod inner { impl fmt::Debug for Instant { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("Instant") - .field("tv_sec", &self.t.t.tv_sec) - .field("tv_nsec", &self.t.t.tv_nsec) - .finish() + .field("tv_sec", &self.t.t.tv_sec) + .field("tv_nsec", &self.t.t.tv_nsec) + .finish() } } @@ -342,8 +312,7 @@ mod inner { SystemTime { t: now(libc::CLOCK_REALTIME) } } - pub fn sub_time(&self, other: &SystemTime) - -> Result<Duration, Duration> { + pub fn sub_time(&self, other: &SystemTime) -> Result<Duration, Duration> { self.t.sub_timespec(&other.t) } @@ -365,9 +334,9 @@ mod inner { impl fmt::Debug for SystemTime { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("SystemTime") - .field("tv_sec", &self.t.t.tv_sec) - .field("tv_nsec", &self.t.t.tv_nsec) - .finish() + .field("tv_sec", &self.t.t.tv_sec) + .field("tv_nsec", &self.t.t.tv_nsec) + .finish() } } @@ -377,15 +346,8 @@ mod inner { pub type clock_t = libc::c_ulong; fn now(clock: clock_t) -> Timespec { - let mut t = Timespec { - t: libc::timespec { - tv_sec: 0, - tv_nsec: 0, - } - }; - cvt(unsafe { - libc::clock_gettime(clock, &mut t.t) - }).unwrap(); + let mut t = Timespec { t: libc::timespec { tv_sec: 0, tv_nsec: 0 } }; + cvt(unsafe { libc::clock_gettime(clock, &mut t.t) }).unwrap(); t } } diff --git a/src/libstd/sys/vxworks/cmath.rs b/src/libstd/sys/vxworks/cmath.rs index 2916ebe444..f327b69fc7 100644 --- a/src/libstd/sys/vxworks/cmath.rs +++ b/src/libstd/sys/vxworks/cmath.rs @@ -2,7 +2,6 @@ use libc::{c_double, c_float}; -#[link_name = "m"] extern "C" { pub fn acos(n: c_double) -> c_double; pub fn acosf(n: c_float) -> c_float; diff --git a/src/libstd/sys/vxworks/ext/process.rs b/src/libstd/sys/vxworks/ext/process.rs index e535c4aa12..31e691dd13 100644 --- a/src/libstd/sys/vxworks/ext/process.rs +++ b/src/libstd/sys/vxworks/ext/process.rs @@ -2,6 +2,7 @@ #![stable(feature = "rust1", since = "1.0.0")] +use crate::ffi::OsStr; use crate::io; use crate::process; use crate::sys; @@ -105,6 +106,15 @@ pub trait CommandExt { /// cross-platform `spawn` instead. #[stable(feature = "process_exec2", since = "1.9.0")] fn exec(&mut self) -> io::Error; + + /// Set executable argument + /// + /// Set the first process argument, `argv[0]`, to something other than the + /// default executable path. + #[unstable(feature = "process_set_argv0", issue = "66510")] + fn arg0<S>(&mut self, arg: S) -> &mut process::Command + where + S: AsRef<OsStr>; } #[stable(feature = "rust1", since = "1.0.0")] @@ -130,6 +140,14 @@ impl CommandExt for process::Command { fn exec(&mut self) -> io::Error { self.as_inner_mut().exec(sys::process::Stdio::Inherit) } + + fn arg0<S>(&mut self, arg: S) -> &mut process::Command + where + S: AsRef<OsStr>, + { + self.as_inner_mut().set_arg_0(arg.as_ref()); + self + } } /// Unix-specific extensions to [`process::ExitStatus`]. diff --git a/src/libstd/sys/vxworks/fast_thread_local.rs b/src/libstd/sys/vxworks/fast_thread_local.rs index 387ebd0520..098668cf52 100644 --- a/src/libstd/sys/vxworks/fast_thread_local.rs +++ b/src/libstd/sys/vxworks/fast_thread_local.rs @@ -1,5 +1,5 @@ #![cfg(target_thread_local)] -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) { use crate::sys_common::thread_local::register_dtor_fallback; diff --git a/src/libstd/sys/vxworks/fd.rs b/src/libstd/sys/vxworks/fd.rs index 9b649aa7ef..65c67dabc1 100644 --- a/src/libstd/sys/vxworks/fd.rs +++ b/src/libstd/sys/vxworks/fd.rs @@ -1,4 +1,4 @@ -#![unstable(reason = "not public", issue = "0", feature = "fd")] +#![unstable(reason = "not public", issue = "none", feature = "fd")] use crate::cmp; use crate::io::{self, Initializer, IoSlice, IoSliceMut, Read}; diff --git a/src/libstd/sys/vxworks/fs.rs b/src/libstd/sys/vxworks/fs.rs index 6c2dfb79d6..68f2c13317 100644 --- a/src/libstd/sys/vxworks/fs.rs +++ b/src/libstd/sys/vxworks/fs.rs @@ -340,7 +340,7 @@ impl File { } pub fn truncate(&self, size: u64) -> io::Result<()> { - return cvt_r(|| unsafe { ftruncate(self.0.raw(), size as off_t) }).map(|_| ()); + return cvt_r(|| unsafe { ftruncate(self.0.raw(), size as off_t) }).map(drop); } pub fn read(&self, buf: &mut [u8]) -> io::Result<usize> { diff --git a/src/libstd/sys/vxworks/mod.rs b/src/libstd/sys/vxworks/mod.rs index f102e4d6ad..12bbfa1d4e 100644 --- a/src/libstd/sys/vxworks/mod.rs +++ b/src/libstd/sys/vxworks/mod.rs @@ -36,18 +36,10 @@ pub use crate::sys_common::os_str_bytes as os_str; #[cfg(not(test))] pub fn init() { - // By default, some platforms will send a *signal* when an EPIPE error - // would otherwise be delivered. This runtime doesn't install a SIGPIPE - // handler, causing it to kill the program, which isn't exactly what we - // want! - // - // Hence, we set SIGPIPE to ignore when the program starts up in order - // to prevent this problem. + // ignore SIGPIPE unsafe { - reset_sigpipe(); + assert!(signal(libc::SIGPIPE, libc::SIG_IGN) != libc::SIG_ERR); } - - unsafe fn reset_sigpipe() {} } pub use libc::signal; diff --git a/src/libstd/sys/vxworks/net.rs b/src/libstd/sys/vxworks/net.rs index 85f5fcff2c..7d4e5624f7 100644 --- a/src/libstd/sys/vxworks/net.rs +++ b/src/libstd/sys/vxworks/net.rs @@ -18,9 +18,6 @@ pub extern crate libc as netc; pub type wrlen_t = size_t; -const SOCK_CLOEXEC: c_int = 0; -const SO_NOSIGPIPE: c_int = 0; - pub struct Socket(FileDesc); pub fn init() {} @@ -264,7 +261,7 @@ impl Socket { pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { let mut nonblocking = nonblocking as libc::c_int; - cvt(unsafe { libc::ioctl(*self.as_inner(), libc::FIONBIO, &mut nonblocking) }).map(|_| ()) + cvt(unsafe { libc::ioctl(*self.as_inner(), libc::FIONBIO, &mut nonblocking) }).map(drop) } pub fn take_error(&self) -> io::Result<Option<io::Error>> { diff --git a/src/libstd/sys/vxworks/os.rs b/src/libstd/sys/vxworks/os.rs index 71e1d1626c..1fadf71613 100644 --- a/src/libstd/sys/vxworks/os.rs +++ b/src/libstd/sys/vxworks/os.rs @@ -1,18 +1,17 @@ use crate::error::Error as StdError; -use crate::ffi::{CString, CStr, OsString, OsStr}; +use crate::ffi::{CStr, CString, OsStr, OsString}; use crate::fmt; use crate::io; use crate::iter; -use libc::{self, c_int, c_char /*,c_void */}; use crate::marker::PhantomData; use crate::mem; use crate::memchr; -use crate::path::{self, PathBuf, Path}; -use crate::ptr; +use crate::path::{self, Path, PathBuf}; use crate::slice; use crate::str; -use crate::sys_common::mutex::{Mutex, MutexGuard}; use crate::sys::cvt; +use crate::sys_common::mutex::{Mutex, MutexGuard}; +use libc::{self, c_char /*,c_void */, c_int}; /*use sys::fd; this one is probably important */ use crate::vec; @@ -20,7 +19,7 @@ const TMPBUF_SZ: usize = 128; // This is a terrible fix use crate::sys::os_str::Buf; -use crate::sys_common::{FromInner, IntoInner, AsInner}; +use crate::sys_common::{AsInner, FromInner, IntoInner}; pub trait OsStringExt { fn from_vec(vec: Vec<u8>) -> Self; @@ -55,18 +54,16 @@ pub fn errno() -> i32 { } pub fn set_errno(e: i32) { - unsafe { libc::errnoSet(e as c_int); } + unsafe { + libc::errnoSet(e as c_int); + } } /// Gets a detailed string description for the given error number. pub fn error_string(errno: i32) -> String { let mut buf = [0 as c_char; TMPBUF_SZ]; - extern { - fn strerror_r( - errnum: c_int, - buf: *mut c_char, - buflen: libc::size_t - ) -> c_int; + extern "C" { + fn strerror_r(errnum: c_int, buf: *mut c_char, buflen: libc::size_t) -> c_int; } let p = buf.as_mut_ptr(); @@ -116,33 +113,41 @@ pub fn chdir(p: &path::Path) -> io::Result<()> { } pub struct SplitPaths<'a> { - iter: iter::Map<slice::Split<'a, u8, fn(&u8) -> bool>, - fn(&'a [u8]) -> PathBuf>, + iter: iter::Map<slice::Split<'a, u8, fn(&u8) -> bool>, fn(&'a [u8]) -> PathBuf>, } pub fn split_paths(unparsed: &OsStr) -> SplitPaths<'_> { fn bytes_to_path(b: &[u8]) -> PathBuf { PathBuf::from(<OsStr as OsStrExt>::from_bytes(b)) } - fn is_colon(b: &u8) -> bool { *b == b':' } + fn is_colon(b: &u8) -> bool { + *b == b':' + } let unparsed = unparsed.as_bytes(); SplitPaths { - iter: unparsed.split(is_colon as fn(&u8) -> bool) - .map(bytes_to_path as fn(&[u8]) -> PathBuf) + iter: unparsed + .split(is_colon as fn(&u8) -> bool) + .map(bytes_to_path as fn(&[u8]) -> PathBuf), } } impl<'a> Iterator for SplitPaths<'a> { type Item = PathBuf; - fn next(&mut self) -> Option<PathBuf> { self.iter.next() } - fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() } + fn next(&mut self) -> Option<PathBuf> { + self.iter.next() + } + fn size_hint(&self) -> (usize, Option<usize>) { + self.iter.size_hint() + } } #[derive(Debug)] pub struct JoinPathsError; pub fn join_paths<I, T>(paths: I) -> Result<OsString, JoinPathsError> - where I: Iterator<Item=T>, T: AsRef<OsStr> +where + I: Iterator<Item = T>, + T: AsRef<OsStr>, { let mut joined = Vec::new(); let sep = b':'; @@ -153,7 +158,7 @@ pub fn join_paths<I, T>(paths: I) -> Result<OsString, JoinPathsError> joined.push(sep) } if path.contains(&sep) { - return Err(JoinPathsError) + return Err(JoinPathsError); } joined.extend_from_slice(path); } @@ -167,7 +172,10 @@ impl fmt::Display for JoinPathsError { } impl StdError for JoinPathsError { - fn description(&self) -> &str { "failed to join paths" } + #[allow(deprecated)] + fn description(&self) -> &str { + "failed to join paths" + } } pub fn current_exe() -> io::Result<PathBuf> { @@ -189,12 +197,18 @@ pub struct Env { impl Iterator for Env { type Item = (OsString, OsString); - fn next(&mut self) -> Option<(OsString, OsString)> { self.iter.next() } - fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() } + fn next(&mut self) -> Option<(OsString, OsString)> { + self.iter.next() + } + fn size_hint(&self) -> (usize, Option<usize>) { + self.iter.size_hint() + } } pub unsafe fn environ() -> *mut *const *const c_char { - extern { static mut environ: *const *const c_char; } + extern "C" { + static mut environ: *const *const c_char; + } &mut environ } @@ -211,21 +225,17 @@ pub fn env() -> Env { unsafe { let _guard = env_lock(); let mut environ = *environ(); - if environ == ptr::null() { - panic!("os::env() failure getting env string from OS: {}", - io::Error::last_os_error()); + if environ.is_null() { + panic!("os::env() failure getting env string from OS: {}", io::Error::last_os_error()); } let mut result = Vec::new(); - while *environ != ptr::null() { + while !(*environ).is_null() { if let Some(key_value) = parse(CStr::from_ptr(*environ).to_bytes()) { result.push(key_value); } - environ = environ.offset(1); - } - return Env { - iter: result.into_iter(), - _dont_send_or_sync_me: PhantomData, + environ = environ.add(1); } + return Env { iter: result.into_iter(), _dont_send_or_sync_me: PhantomData }; } fn parse(input: &[u8]) -> Option<(OsString, OsString)> { @@ -237,10 +247,12 @@ pub fn env() -> Env { return None; } let pos = memchr::memchr(b'=', &input[1..]).map(|p| p + 1); - pos.map(|p| ( - OsStringExt::from_vec(input[..p].to_vec()), - OsStringExt::from_vec(input[p+1..].to_vec()), - )) + pos.map(|p| { + ( + OsStringExt::from_vec(input[..p].to_vec()), + OsStringExt::from_vec(input[p + 1..].to_vec()), + ) + }) } } @@ -266,7 +278,7 @@ pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> { unsafe { let _guard = env_lock(); - cvt(libc::setenv(k.as_ptr(), v.as_ptr(), 1)).map(|_| ()) + cvt(libc::setenv(k.as_ptr(), v.as_ptr(), 1)).map(drop) } } @@ -275,25 +287,20 @@ pub fn unsetenv(n: &OsStr) -> io::Result<()> { unsafe { let _guard = env_lock(); - cvt(libc::unsetenv(nbuf.as_ptr())).map(|_| ()) + cvt(libc::unsetenv(nbuf.as_ptr())).map(drop) } } pub fn page_size() -> usize { - unsafe { - libc::sysconf(libc::_SC_PAGESIZE) as usize - } + unsafe { libc::sysconf(libc::_SC_PAGESIZE) as usize } } pub fn temp_dir() -> PathBuf { - crate::env::var_os("TMPDIR").map(PathBuf::from).unwrap_or_else(|| { - PathBuf::from("/tmp") - }) + crate::env::var_os("TMPDIR").map(PathBuf::from).unwrap_or_else(|| PathBuf::from("/tmp")) } pub fn home_dir() -> Option<PathBuf> { - crate::env::var_os("HOME").or_else(|| None - ).map(PathBuf::from) + crate::env::var_os("HOME").or_else(|| None).map(PathBuf::from) } pub fn exit(code: i32) -> ! { diff --git a/src/libstd/sys/vxworks/pipe.rs b/src/libstd/sys/vxworks/pipe.rs index b72a655455..0990cb8e83 100644 --- a/src/libstd/sys/vxworks/pipe.rs +++ b/src/libstd/sys/vxworks/pipe.rs @@ -66,11 +66,11 @@ pub fn read2(p1: AnonPipe, v1: &mut Vec<u8>, p2: AnonPipe, v2: &mut Vec<u8>) -> if fds[0].revents != 0 && read(&p1, v1)? { p2.set_nonblocking_pipe(false)?; - return p2.read_to_end(v2).map(|_| ()); + return p2.read_to_end(v2).map(drop); } if fds[1].revents != 0 && read(&p2, v2)? { p1.set_nonblocking_pipe(false)?; - return p1.read_to_end(v1).map(|_| ()); + return p1.read_to_end(v1).map(drop); } } diff --git a/src/libstd/sys/vxworks/process/process_common.rs b/src/libstd/sys/vxworks/process/process_common.rs index a8139a2753..6d5506bec5 100644 --- a/src/libstd/sys/vxworks/process/process_common.rs +++ b/src/libstd/sys/vxworks/process/process_common.rs @@ -90,8 +90,8 @@ impl Command { let program = os2c(program, &mut saw_nul); Command { argv: Argv(vec![program.as_ptr(), ptr::null()]), + args: vec![program.clone()], program, - args: Vec::new(), env: Default::default(), cwd: None, uid: None, @@ -104,11 +104,19 @@ impl Command { } } + pub fn set_arg_0(&mut self, arg: &OsStr) { + // Set a new arg0 + let arg = os2c(arg, &mut self.saw_nul); + debug_assert!(self.argv.0.len() > 1); + self.argv.0[0] = arg.as_ptr(); + self.args[0] = arg; + } + pub fn arg(&mut self, arg: &OsStr) { // Overwrite the trailing NULL pointer in `argv` and then add a new null // pointer. let arg = os2c(arg, &mut self.saw_nul); - self.argv.0[self.args.len() + 1] = arg.as_ptr(); + self.argv.0[self.args.len()] = arg.as_ptr(); self.argv.0.push(ptr::null()); // Also make sure we keep track of the owned value to schedule a @@ -133,6 +141,10 @@ impl Command { &self.argv.0 } + pub fn get_program(&self) -> &CStr { + &*self.program + } + #[allow(dead_code)] pub fn get_cwd(&self) -> &Option<CString> { &self.cwd @@ -315,8 +327,12 @@ impl ChildStdio { impl fmt::Debug for Command { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self.program)?; - for arg in &self.args { + if self.program != self.args[0] { + write!(f, "[{:?}] ", self.program)?; + } + write!(f, "{:?}", self.args[0])?; + + for arg in &self.args[1..] { write!(f, " {:?}", arg)?; } Ok(()) diff --git a/src/libstd/sys/vxworks/process/process_vxworks.rs b/src/libstd/sys/vxworks/process/process_vxworks.rs index 79bfd770f8..f7e84ae3de 100644 --- a/src/libstd/sys/vxworks/process/process_vxworks.rs +++ b/src/libstd/sys/vxworks/process/process_vxworks.rs @@ -1,35 +1,39 @@ use crate::io::{self, Error, ErrorKind}; -use libc::{self, c_int, c_char}; -use libc::{RTP_ID}; use crate::sys; use crate::sys::cvt; use crate::sys::process::process_common::*; use crate::sys_common::thread; +use libc::RTP_ID; +use libc::{self, c_char, c_int}; //////////////////////////////////////////////////////////////////////////////// // Command //////////////////////////////////////////////////////////////////////////////// impl Command { - pub fn spawn(&mut self, default: Stdio, needs_stdin: bool) - -> io::Result<(Process, StdioPipes)> { - use crate::sys::{cvt_r}; + pub fn spawn( + &mut self, + default: Stdio, + needs_stdin: bool, + ) -> io::Result<(Process, StdioPipes)> { + use crate::sys::cvt_r; const CLOEXEC_MSG_FOOTER: &'static [u8] = b"NOEX"; let envp = self.capture_env(); if self.saw_nul() { - return Err(io::Error::new(ErrorKind::InvalidInput, - "nul byte found in provided data")); + return Err(io::Error::new(ErrorKind::InvalidInput, "nul byte found in provided data")); } let (ours, theirs) = self.setup_io(default, needs_stdin)?; let mut p = Process { pid: 0, status: None }; unsafe { macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => return Err(e.into()), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => return Err(e.into()), + } + }; } let mut orig_stdin = libc::STDIN_FILENO; @@ -53,7 +57,9 @@ impl Command { t!(cvt(libc::chdir(cwd.as_ptr()))); } - let c_envp = envp.as_ref().map(|c| c.as_ptr()) + let c_envp = envp + .as_ref() + .map(|c| c.as_ptr()) .unwrap_or_else(|| *sys::os::environ() as *const _); let stack_size = thread::min_stack(); @@ -61,13 +67,13 @@ impl Command { let _lock = sys::os::env_lock(); let ret = libc::rtpSpawn( - self.get_argv()[0], // executing program + self.get_program().as_ptr(), self.get_argv().as_ptr() as *mut *const c_char, // argv c_envp as *mut *const c_char, - 100 as c_int, // initial priority - stack_size, // initial stack size. - 0, // options - 0 // task options + 100 as c_int, // initial priority + stack_size, // initial stack size. + 0, // options + 0, // task options ); // Because FileDesc was not used, each duplicated file descriptor @@ -127,17 +133,19 @@ impl Process { // and used for another process, and we probably shouldn't be killing // random processes, so just return an error. if self.status.is_some() { - Err(Error::new(ErrorKind::InvalidInput, - "invalid argument: can't kill an exited process")) + Err(Error::new( + ErrorKind::InvalidInput, + "invalid argument: can't kill an exited process", + )) } else { - cvt(unsafe { libc::kill(self.pid, libc::SIGKILL) }).map(|_| ()) + cvt(unsafe { libc::kill(self.pid, libc::SIGKILL) }).map(drop) } } pub fn wait(&mut self) -> io::Result<ExitStatus> { use crate::sys::cvt_r; if let Some(status) = self.status { - return Ok(status) + return Ok(status); } let mut status = 0 as c_int; cvt_r(|| unsafe { libc::waitpid(self.pid, &mut status, 0) })?; @@ -147,12 +155,10 @@ impl Process { pub fn try_wait(&mut self) -> io::Result<Option<ExitStatus>> { if let Some(status) = self.status { - return Ok(Some(status)) + return Ok(Some(status)); } let mut status = 0 as c_int; - let pid = cvt(unsafe { - libc::waitpid(self.pid, &mut status, libc::WNOHANG) - })?; + let pid = cvt(unsafe { libc::waitpid(self.pid, &mut status, libc::WNOHANG) })?; if pid == 0 { Ok(None) } else { diff --git a/src/libstd/sys/vxworks/weak.rs b/src/libstd/sys/vxworks/weak.rs deleted file mode 100644 index 4c6fddefd3..0000000000 --- a/src/libstd/sys/vxworks/weak.rs +++ /dev/null @@ -1,56 +0,0 @@ -//! Support for "weak linkage" to symbols on Unix -//! -//! Some I/O operations we do in libstd require newer versions of OSes but we -//! need to maintain binary compatibility with older releases for now. In order -//! to use the new functionality when available we use this module for -//! detection. -//! -//! One option to use here is weak linkage, but that is unfortunately only -//! really workable on Linux. Hence, use dlsym to get the symbol value at -//! runtime. This is also done for compatibility with older versions of glibc, -//! and to avoid creating dependencies on GLIBC_PRIVATE symbols. It assumes that -//! we've been dynamically linked to the library the symbol comes from, but that -//! is currently always the case for things like libpthread/libc. -//! -//! A long time ago this used weak linkage for the __pthread_get_minstack -//! symbol, but that caused Debian to detect an unnecessarily strict versioned -//! dependency on libc6 (#23628). - -use crate::ffi::CStr; -use crate::marker; -use crate::mem; -use crate::sync::atomic::{AtomicUsize, Ordering}; - -pub struct Weak<F> { - name: &'static str, - addr: AtomicUsize, - _marker: marker::PhantomData<F>, -} - -impl<F> Weak<F> { - pub const fn new(name: &'static str) -> Weak<F> { - Weak { name, addr: AtomicUsize::new(1), _marker: marker::PhantomData } - } - - pub fn get(&self) -> Option<F> { - assert_eq!(mem::size_of::<F>(), mem::size_of::<usize>()); - unsafe { - if self.addr.load(Ordering::SeqCst) == 1 { - self.addr.store(fetch(self.name), Ordering::SeqCst); - } - match self.addr.load(Ordering::SeqCst) { - 0 => None, - addr => Some(mem::transmute_copy::<usize, F>(&addr)), - } - } - } -} - -unsafe fn fetch(name: &str) -> usize { - let name = match CStr::from_bytes_with_nul(name.as_bytes()) { - Ok(cstr) => cstr, - Err(..) => return 0, - }; - assert!(false, "FIXME: fetch"); - libc::dlsym(libc::RTLD_DEFAULT, name.as_ptr()) as usize -} diff --git a/src/libstd/sys/wasi/ext/fs.rs b/src/libstd/sys/wasi/ext/fs.rs index 92d0e60c07..6696efa887 100644 --- a/src/libstd/sys/wasi/ext/fs.rs +++ b/src/libstd/sys/wasi/ext/fs.rs @@ -1,6 +1,6 @@ //! WASI-specific extensions to primitives in the `std::fs` module. -#![unstable(feature = "wasi_ext", issue = "0")] +#![unstable(feature = "wasi_ext", issue = "none")] use crate::fs::{self, File, Metadata, OpenOptions}; use crate::io::{self, IoSlice, IoSliceMut}; diff --git a/src/libstd/sys/wasi/ext/io.rs b/src/libstd/sys/wasi/ext/io.rs index f678b71a2b..e849400d67 100644 --- a/src/libstd/sys/wasi/ext/io.rs +++ b/src/libstd/sys/wasi/ext/io.rs @@ -1,11 +1,11 @@ //! WASI-specific extensions to general I/O primitives -#![unstable(feature = "wasi_ext", issue = "0")] +#![unstable(feature = "wasi_ext", issue = "none")] use crate::fs; use crate::io; -use crate::sys; use crate::net; +use crate::sys; use crate::sys_common::{AsInner, FromInner, IntoInner}; /// Raw file descriptors. diff --git a/src/libstd/sys/wasi/io.rs b/src/libstd/sys/wasi/io.rs index 41a6e9783c..ee20ea6dab 100644 --- a/src/libstd/sys/wasi/io.rs +++ b/src/libstd/sys/wasi/io.rs @@ -10,13 +10,7 @@ pub struct IoSlice<'a> { impl<'a> IoSlice<'a> { #[inline] pub fn new(buf: &'a [u8]) -> IoSlice<'a> { - IoSlice { - vec: wasi::Ciovec { - buf: buf.as_ptr(), - buf_len: buf.len(), - }, - _p: PhantomData, - } + IoSlice { vec: wasi::Ciovec { buf: buf.as_ptr(), buf_len: buf.len() }, _p: PhantomData } } #[inline] @@ -33,9 +27,7 @@ impl<'a> IoSlice<'a> { #[inline] pub fn as_slice(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self.vec.buf as *const u8, self.vec.buf_len) - } + unsafe { slice::from_raw_parts(self.vec.buf as *const u8, self.vec.buf_len) } } } @@ -49,10 +41,7 @@ impl<'a> IoSliceMut<'a> { #[inline] pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> { IoSliceMut { - vec: wasi::Iovec { - buf: buf.as_mut_ptr(), - buf_len: buf.len() - }, + vec: wasi::Iovec { buf: buf.as_mut_ptr(), buf_len: buf.len() }, _p: PhantomData, } } @@ -71,15 +60,11 @@ impl<'a> IoSliceMut<'a> { #[inline] pub fn as_slice(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self.vec.buf as *const u8, self.vec.buf_len) - } + unsafe { slice::from_raw_parts(self.vec.buf as *const u8, self.vec.buf_len) } } #[inline] pub fn as_mut_slice(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.buf_len) - } + unsafe { slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.buf_len) } } } diff --git a/src/libstd/sys/wasi/mod.rs b/src/libstd/sys/wasi/mod.rs index 83f98a19f4..241d499ca3 100644 --- a/src/libstd/sys/wasi/mod.rs +++ b/src/libstd/sys/wasi/mod.rs @@ -27,14 +27,17 @@ pub mod condvar; pub mod env; pub mod fd; pub mod fs; +pub mod io; #[path = "../wasm/memchr.rs"] pub mod memchr; #[path = "../wasm/mutex.rs"] pub mod mutex; pub mod net; -pub mod io; pub mod os; pub use crate::sys_common::os_str_bytes as os_str; +pub mod ext; +#[path = "../wasm/fast_thread_local.rs"] +pub mod fast_thread_local; pub mod path; pub mod pipe; pub mod process; @@ -46,24 +49,17 @@ pub mod stdio; pub mod thread; #[path = "../wasm/thread_local.rs"] pub mod thread_local; -#[path = "../wasm/fast_thread_local.rs"] -pub mod fast_thread_local; pub mod time; -pub mod ext; #[cfg(not(test))] -pub fn init() { -} +pub fn init() {} pub fn unsupported<T>() -> std_io::Result<T> { Err(unsupported_err()) } pub fn unsupported_err() -> std_io::Error { - std_io::Error::new( - std_io::ErrorKind::Other, - "operation not supported on wasm yet", - ) + std_io::Error::new(std_io::ErrorKind::Other, "operation not supported on wasm yet") } pub fn decode_error_kind(errno: i32) -> std_io::ErrorKind { @@ -101,7 +97,7 @@ pub unsafe fn strlen(mut s: *const c_char) -> usize { n += 1; s = s.offset(1); } - return n + return n; } pub unsafe fn abort_internal() -> ! { @@ -115,7 +111,7 @@ pub fn hashmap_random_keys() -> (u64, u64) { let len = mem::size_of_val(&ret); wasi::random_get(base, len).expect("random_get failure"); } - return ret + return ret; } fn err2io(err: wasi::Error) -> std_io::Error { diff --git a/src/libstd/sys/wasi/os.rs b/src/libstd/sys/wasi/os.rs index 338fbe8976..8052c0aa8a 100644 --- a/src/libstd/sys/wasi/os.rs +++ b/src/libstd/sys/wasi/os.rs @@ -6,7 +6,6 @@ use crate::io; use crate::marker::PhantomData; use crate::os::wasi::prelude::*; use crate::path::{self, PathBuf}; -use crate::ptr; use crate::str; use crate::sys::memchr; use crate::sys::{unsupported, Void}; @@ -78,6 +77,7 @@ impl fmt::Display for JoinPathsError { } impl StdError for JoinPathsError { + #[allow(deprecated)] fn description(&self) -> &str { "not supported on wasm yet" } @@ -106,11 +106,13 @@ pub fn env() -> Env { let _guard = env_lock(); let mut environ = libc::environ; let mut result = Vec::new(); - while environ != ptr::null_mut() && *environ != ptr::null_mut() { - if let Some(key_value) = parse(CStr::from_ptr(*environ).to_bytes()) { - result.push(key_value); + if !environ.is_null() { + while !(*environ).is_null() { + if let Some(key_value) = parse(CStr::from_ptr(*environ).to_bytes()) { + result.push(key_value); + } + environ = environ.add(1); } - environ = environ.offset(1); } return Env { iter: result.into_iter(), _dont_send_or_sync_me: PhantomData }; } @@ -150,7 +152,7 @@ pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> { unsafe { let _guard = env_lock(); - cvt(libc::setenv(k.as_ptr(), v.as_ptr(), 1)).map(|_| ()) + cvt(libc::setenv(k.as_ptr(), v.as_ptr(), 1)).map(drop) } } @@ -159,7 +161,7 @@ pub fn unsetenv(n: &OsStr) -> io::Result<()> { unsafe { let _guard = env_lock(); - cvt(libc::unsetenv(nbuf.as_ptr())).map(|_| ()) + cvt(libc::unsetenv(nbuf.as_ptr())).map(drop) } } diff --git a/src/libstd/sys/wasm/alloc.rs b/src/libstd/sys/wasm/alloc.rs index 05e55334ac..32b8b5bdae 100644 --- a/src/libstd/sys/wasm/alloc.rs +++ b/src/libstd/sys/wasm/alloc.rs @@ -58,7 +58,7 @@ mod lock { pub fn lock() -> DropLock { loop { if LOCKED.swap(1, SeqCst) == 0 { - return DropLock + return DropLock; } // Ok so here's where things get a little depressing. At this point // in time we need to synchronously acquire a lock, but we're diff --git a/src/libstd/sys/wasm/condvar.rs b/src/libstd/sys/wasm/condvar.rs index 9c7cc3c63b..9fd781c728 100644 --- a/src/libstd/sys/wasm/condvar.rs +++ b/src/libstd/sys/wasm/condvar.rs @@ -1,23 +1,21 @@ use crate::sys::mutex::Mutex; use crate::time::Duration; -pub struct Condvar { } +pub struct Condvar {} impl Condvar { pub const fn new() -> Condvar { - Condvar { } + Condvar {} } #[inline] pub unsafe fn init(&mut self) {} #[inline] - pub unsafe fn notify_one(&self) { - } + pub unsafe fn notify_one(&self) {} #[inline] - pub unsafe fn notify_all(&self) { - } + pub unsafe fn notify_all(&self) {} pub unsafe fn wait(&self, _mutex: &Mutex) { panic!("can't block with web assembly") @@ -28,6 +26,5 @@ impl Condvar { } #[inline] - pub unsafe fn destroy(&self) { - } + pub unsafe fn destroy(&self) {} } diff --git a/src/libstd/sys/wasm/condvar_atomics.rs b/src/libstd/sys/wasm/condvar_atomics.rs index f452bbd348..a4021c0ee8 100644 --- a/src/libstd/sys/wasm/condvar_atomics.rs +++ b/src/libstd/sys/wasm/condvar_atomics.rs @@ -78,7 +78,7 @@ impl Condvar { // `false` as we weren't actually notified. let ret = wasm32::i32_atomic_wait(self.ptr(), ticket, nanos as i64) != 2; mutex.lock(); - return ret + return ret; } #[inline] diff --git a/src/libstd/sys/wasm/fast_thread_local.rs b/src/libstd/sys/wasm/fast_thread_local.rs index 3b0993fdb5..85d6609830 100644 --- a/src/libstd/sys/wasm/fast_thread_local.rs +++ b/src/libstd/sys/wasm/fast_thread_local.rs @@ -1,6 +1,6 @@ -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] -pub unsafe fn register_dtor(_t: *mut u8, _dtor: unsafe extern fn(*mut u8)) { +pub unsafe fn register_dtor(_t: *mut u8, _dtor: unsafe extern "C" fn(*mut u8)) { // FIXME: right now there is no concept of "thread exit", but this is likely // going to show up at some point in the form of an exported symbol that the // wasm runtime is going to be expected to call. For now we basically just diff --git a/src/libstd/sys/wasm/mod.rs b/src/libstd/sys/wasm/mod.rs index de0bb38dc3..c115f75645 100644 --- a/src/libstd/sys/wasm/mod.rs +++ b/src/libstd/sys/wasm/mod.rs @@ -20,6 +20,7 @@ pub mod alloc; pub mod args; pub mod cmath; pub mod env; +pub mod fast_thread_local; pub mod fs; pub mod io; pub mod memchr; @@ -29,11 +30,10 @@ pub mod path; pub mod pipe; pub mod process; pub mod stack_overflow; -pub mod thread; -pub mod time; pub mod stdio; +pub mod thread; pub mod thread_local; -pub mod fast_thread_local; +pub mod time; pub use crate::sys_common::os_str_bytes as os_str; @@ -53,16 +53,14 @@ cfg_if::cfg_if! { } #[cfg(not(test))] -pub fn init() { -} +pub fn init() {} pub fn unsupported<T>() -> crate::io::Result<T> { Err(unsupported_err()) } pub fn unsupported_err() -> crate::io::Error { - crate::io::Error::new(crate::io::ErrorKind::Other, - "operation not supported on wasm yet") + crate::io::Error::new(crate::io::ErrorKind::Other, "operation not supported on wasm yet") } pub fn decode_error_kind(_code: i32) -> crate::io::ErrorKind { @@ -80,7 +78,7 @@ pub unsafe fn strlen(mut s: *const c_char) -> usize { n += 1; s = s.offset(1); } - return n + return n; } pub unsafe fn abort_internal() -> ! { diff --git a/src/libstd/sys/wasm/mutex.rs b/src/libstd/sys/wasm/mutex.rs index 9d713e9b43..07238d0873 100644 --- a/src/libstd/sys/wasm/mutex.rs +++ b/src/libstd/sys/wasm/mutex.rs @@ -13,8 +13,7 @@ impl Mutex { } #[inline] - pub unsafe fn init(&mut self) { - } + pub unsafe fn init(&mut self) {} #[inline] pub unsafe fn lock(&self) { @@ -40,18 +39,16 @@ impl Mutex { } #[inline] - pub unsafe fn destroy(&self) { - } + pub unsafe fn destroy(&self) {} } // All empty stubs because wasm has no threads yet, so lock acquisition always // succeeds. -pub struct ReentrantMutex { -} +pub struct ReentrantMutex {} impl ReentrantMutex { pub unsafe fn uninitialized() -> ReentrantMutex { - ReentrantMutex { } + ReentrantMutex {} } pub unsafe fn init(&mut self) {} diff --git a/src/libstd/sys/wasm/mutex_atomics.rs b/src/libstd/sys/wasm/mutex_atomics.rs index cddd584dd2..90c628a19c 100644 --- a/src/libstd/sys/wasm/mutex_atomics.rs +++ b/src/libstd/sys/wasm/mutex_atomics.rs @@ -1,7 +1,7 @@ use crate::arch::wasm32; use crate::cell::UnsafeCell; use crate::mem; -use crate::sync::atomic::{AtomicUsize, AtomicU32, Ordering::SeqCst}; +use crate::sync::atomic::{AtomicU32, AtomicUsize, Ordering::SeqCst}; use crate::sys::thread; pub struct Mutex { @@ -81,10 +81,7 @@ unsafe impl Sync for ReentrantMutex {} impl ReentrantMutex { pub unsafe fn uninitialized() -> ReentrantMutex { - ReentrantMutex { - owner: AtomicU32::new(0), - recursions: UnsafeCell::new(0), - } + ReentrantMutex { owner: AtomicU32::new(0), recursions: UnsafeCell::new(0) } } pub unsafe fn init(&mut self) { diff --git a/src/libstd/sys/wasm/os.rs b/src/libstd/sys/wasm/os.rs index 193c389274..91afdc8a5a 100644 --- a/src/libstd/sys/wasm/os.rs +++ b/src/libstd/sys/wasm/os.rs @@ -53,6 +53,7 @@ impl fmt::Display for JoinPathsError { } impl StdError for JoinPathsError { + #[allow(deprecated)] fn description(&self) -> &str { "not supported on wasm yet" } diff --git a/src/libstd/sys/wasm/rwlock.rs b/src/libstd/sys/wasm/rwlock.rs index a2b07c7fa1..a59944482e 100644 --- a/src/libstd/sys/wasm/rwlock.rs +++ b/src/libstd/sys/wasm/rwlock.rs @@ -9,9 +9,7 @@ unsafe impl Sync for RWLock {} // no threads on wasm impl RWLock { pub const fn new() -> RWLock { - RWLock { - mode: UnsafeCell::new(0), - } + RWLock { mode: UnsafeCell::new(0) } } #[inline] @@ -67,6 +65,5 @@ impl RWLock { } #[inline] - pub unsafe fn destroy(&self) { - } + pub unsafe fn destroy(&self) {} } diff --git a/src/libstd/sys/wasm/rwlock_atomics.rs b/src/libstd/sys/wasm/rwlock_atomics.rs index c705568cec..06442e925f 100644 --- a/src/libstd/sys/wasm/rwlock_atomics.rs +++ b/src/libstd/sys/wasm/rwlock_atomics.rs @@ -1,6 +1,6 @@ use crate::cell::UnsafeCell; -use crate::sys::mutex::Mutex; use crate::sys::condvar::Condvar; +use crate::sys::mutex::Mutex; pub struct RWLock { lock: Mutex, @@ -27,11 +27,7 @@ unsafe impl Sync for RWLock {} impl RWLock { pub const fn new() -> RWLock { - RWLock { - lock: Mutex::new(), - cond: Condvar::new(), - state: UnsafeCell::new(State::Unlocked), - } + RWLock { lock: Mutex::new(), cond: Condvar::new(), state: UnsafeCell::new(State::Unlocked) } } #[inline] @@ -48,7 +44,7 @@ impl RWLock { self.lock.lock(); let ok = (*self.state.get()).inc_readers(); self.lock.unlock(); - return ok + return ok; } #[inline] @@ -65,7 +61,7 @@ impl RWLock { self.lock.lock(); let ok = (*self.state.get()).inc_writers(); self.lock.unlock(); - return ok + return ok; } #[inline] @@ -106,7 +102,7 @@ impl State { *cnt += 1; true } - State::Writing => false + State::Writing => false, } } @@ -116,8 +112,7 @@ impl State { *self = State::Writing; true } - State::Reading(_) | - State::Writing => false + State::Reading(_) | State::Writing => false, } } @@ -127,8 +122,7 @@ impl State { *cnt -= 1; *cnt == 0 } - State::Unlocked | - State::Writing => invalid(), + State::Unlocked | State::Writing => invalid(), }; if zero { *self = State::Unlocked; @@ -139,8 +133,7 @@ impl State { fn dec_writers(&mut self) { match *self { State::Writing => {} - State::Unlocked | - State::Reading(_) => invalid(), + State::Unlocked | State::Reading(_) => invalid(), } *self = State::Unlocked; } diff --git a/src/libstd/sys/windows/c.rs b/src/libstd/sys/windows/c.rs index b1f9d9766f..4d377341be 100644 --- a/src/libstd/sys/windows/c.rs +++ b/src/libstd/sys/windows/c.rs @@ -2,15 +2,15 @@ #![allow(nonstandard_style)] #![cfg_attr(test, allow(dead_code))] -#![unstable(issue = "0", feature = "windows_c")] +#![unstable(issue = "none", feature = "windows_c")] -use crate::os::raw::{c_int, c_uint, c_ulong, c_long, c_longlong, c_ushort, c_char}; +use crate::os::raw::{c_char, c_int, c_long, c_longlong, c_uint, c_ulong, c_ushort}; use crate::ptr; -use libc::{wchar_t, size_t, c_void}; +use libc::{c_void, size_t, wchar_t}; -pub use self::FILE_INFO_BY_HANDLE_CLASS::*; pub use self::EXCEPTION_DISPOSITION::*; +pub use self::FILE_INFO_BY_HANDLE_CLASS::*; pub type DWORD = c_ulong; pub type HANDLE = LPVOID; @@ -88,11 +88,12 @@ pub const SYNCHRONIZE: DWORD = 0x00100000; pub const GENERIC_READ: DWORD = 0x80000000; pub const GENERIC_WRITE: DWORD = 0x40000000; pub const STANDARD_RIGHTS_WRITE: DWORD = READ_CONTROL; -pub const FILE_GENERIC_WRITE: DWORD = STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | - FILE_WRITE_ATTRIBUTES | - FILE_WRITE_EA | - FILE_APPEND_DATA | - SYNCHRONIZE; +pub const FILE_GENERIC_WRITE: DWORD = STANDARD_RIGHTS_WRITE + | FILE_WRITE_DATA + | FILE_WRITE_ATTRIBUTES + | FILE_WRITE_EA + | FILE_APPEND_DATA + | SYNCHRONIZE; pub const FILE_FLAG_OPEN_REPARSE_POINT: DWORD = 0x00200000; pub const FILE_FLAG_BACKUP_SEMANTICS: DWORD = 0x02000000; @@ -115,7 +116,9 @@ pub struct WIN32_FIND_DATAW { pub cAlternateFileName: [wchar_t; 14], } impl Clone for WIN32_FIND_DATAW { - fn clone(&self) -> Self { *self } + fn clone(&self) -> Self { + *self + } } pub const WSA_FLAG_OVERLAPPED: DWORD = 0x01; @@ -195,9 +198,7 @@ pub const INFINITE: DWORD = !0; pub const DUPLICATE_SAME_ACCESS: DWORD = 0x00000002; -pub const CONDITION_VARIABLE_INIT: CONDITION_VARIABLE = CONDITION_VARIABLE { - ptr: ptr::null_mut(), -}; +pub const CONDITION_VARIABLE_INIT: CONDITION_VARIABLE = CONDITION_VARIABLE { ptr: ptr::null_mut() }; pub const SRWLOCK_INIT: SRWLOCK = SRWLOCK { ptr: ptr::null_mut() }; pub const DETACHED_PROCESS: DWORD = 0x00000008; @@ -338,28 +339,28 @@ pub struct WIN32_FILE_ATTRIBUTE_DATA { #[repr(C)] #[allow(dead_code)] // we only use some variants pub enum FILE_INFO_BY_HANDLE_CLASS { - FileBasicInfo = 0, - FileStandardInfo = 1, - FileNameInfo = 2, - FileRenameInfo = 3, - FileDispositionInfo = 4, - FileAllocationInfo = 5, - FileEndOfFileInfo = 6, - FileStreamInfo = 7, - FileCompressionInfo = 8, - FileAttributeTagInfo = 9, - FileIdBothDirectoryInfo = 10, // 0xA - FileIdBothDirectoryRestartInfo = 11, // 0xB - FileIoPriorityHintInfo = 12, // 0xC - FileRemoteProtocolInfo = 13, // 0xD - FileFullDirectoryInfo = 14, // 0xE - FileFullDirectoryRestartInfo = 15, // 0xF - FileStorageInfo = 16, // 0x10 - FileAlignmentInfo = 17, // 0x11 - FileIdInfo = 18, // 0x12 - FileIdExtdDirectoryInfo = 19, // 0x13 - FileIdExtdDirectoryRestartInfo = 20, // 0x14 - MaximumFileInfoByHandlesClass + FileBasicInfo = 0, + FileStandardInfo = 1, + FileNameInfo = 2, + FileRenameInfo = 3, + FileDispositionInfo = 4, + FileAllocationInfo = 5, + FileEndOfFileInfo = 6, + FileStreamInfo = 7, + FileCompressionInfo = 8, + FileAttributeTagInfo = 9, + FileIdBothDirectoryInfo = 10, // 0xA + FileIdBothDirectoryRestartInfo = 11, // 0xB + FileIoPriorityHintInfo = 12, // 0xC + FileRemoteProtocolInfo = 13, // 0xD + FileFullDirectoryInfo = 14, // 0xE + FileFullDirectoryRestartInfo = 15, // 0xF + FileStorageInfo = 16, // 0x10 + FileAlignmentInfo = 17, // 0x11 + FileIdInfo = 18, // 0x12 + FileIdExtdDirectoryInfo = 19, // 0x13 + FileIdExtdDirectoryRestartInfo = 20, // 0x14 + MaximumFileInfoByHandlesClass, } #[repr(C)] @@ -403,22 +404,28 @@ pub struct MOUNT_POINT_REPARSE_BUFFER { pub PathBuffer: WCHAR, } -pub type LPPROGRESS_ROUTINE = crate::option::Option<unsafe extern "system" fn( - TotalFileSize: LARGE_INTEGER, - TotalBytesTransferred: LARGE_INTEGER, - StreamSize: LARGE_INTEGER, - StreamBytesTransferred: LARGE_INTEGER, - dwStreamNumber: DWORD, - dwCallbackReason: DWORD, - hSourceFile: HANDLE, - hDestinationFile: HANDLE, - lpData: LPVOID, -) -> DWORD>; +pub type LPPROGRESS_ROUTINE = crate::option::Option< + unsafe extern "system" fn( + TotalFileSize: LARGE_INTEGER, + TotalBytesTransferred: LARGE_INTEGER, + StreamSize: LARGE_INTEGER, + StreamBytesTransferred: LARGE_INTEGER, + dwStreamNumber: DWORD, + dwCallbackReason: DWORD, + hSourceFile: HANDLE, + hDestinationFile: HANDLE, + lpData: LPVOID, + ) -> DWORD, +>; #[repr(C)] -pub struct CONDITION_VARIABLE { pub ptr: LPVOID } +pub struct CONDITION_VARIABLE { + pub ptr: LPVOID, +} #[repr(C)] -pub struct SRWLOCK { pub ptr: LPVOID } +pub struct SRWLOCK { + pub ptr: LPVOID, +} #[repr(C)] pub struct CRITICAL_SECTION { CriticalSectionDebug: LPVOID, @@ -426,7 +433,7 @@ pub struct CRITICAL_SECTION { RecursionCount: LONG, OwningThread: HANDLE, LockSemaphore: HANDLE, - SpinCount: ULONG_PTR + SpinCount: ULONG_PTR, } #[repr(C)] @@ -580,7 +587,7 @@ pub enum EXCEPTION_DISPOSITION { ExceptionContinueExecution, ExceptionContinueSearch, ExceptionNestedException, - ExceptionCollidedUnwind + ExceptionCollidedUnwind, } #[repr(C)] @@ -732,37 +739,41 @@ if #[cfg(target_vendor = "uwp")] { // Shared between Desktop & UWP extern "system" { - pub fn WSAStartup(wVersionRequested: WORD, - lpWSAData: LPWSADATA) -> c_int; + pub fn WSAStartup(wVersionRequested: WORD, lpWSAData: LPWSADATA) -> c_int; pub fn WSACleanup() -> c_int; pub fn WSAGetLastError() -> c_int; - pub fn WSADuplicateSocketW(s: SOCKET, - dwProcessId: DWORD, - lpProtocolInfo: LPWSAPROTOCOL_INFO) - -> c_int; - pub fn WSASend(s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, - lpNumberOfBytesSent: LPDWORD, - dwFlags: DWORD, - lpOverlapped: LPWSAOVERLAPPED, - lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE) - -> c_int; - pub fn WSARecv(s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, - lpNumberOfBytesRecvd: LPDWORD, - lpFlags: LPDWORD, - lpOverlapped: LPWSAOVERLAPPED, - lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE) - -> c_int; + pub fn WSADuplicateSocketW( + s: SOCKET, + dwProcessId: DWORD, + lpProtocolInfo: LPWSAPROTOCOL_INFO, + ) -> c_int; + pub fn WSASend( + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, + lpNumberOfBytesSent: LPDWORD, + dwFlags: DWORD, + lpOverlapped: LPWSAOVERLAPPED, + lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, + ) -> c_int; + pub fn WSARecv( + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, + lpNumberOfBytesRecvd: LPDWORD, + lpFlags: LPDWORD, + lpOverlapped: LPWSAOVERLAPPED, + lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, + ) -> c_int; pub fn GetCurrentProcessId() -> DWORD; - pub fn WSASocketW(af: c_int, - kind: c_int, - protocol: c_int, - lpProtocolInfo: LPWSAPROTOCOL_INFO, - g: GROUP, - dwFlags: DWORD) -> SOCKET; + pub fn WSASocketW( + af: c_int, + kind: c_int, + protocol: c_int, + lpProtocolInfo: LPWSAPROTOCOL_INFO, + g: GROUP, + dwFlags: DWORD, + ) -> SOCKET; pub fn ioctlsocket(s: SOCKET, cmd: c_long, argp: *mut c_ulong) -> c_int; pub fn InitializeCriticalSection(CriticalSection: *mut CRITICAL_SECTION); pub fn EnterCriticalSection(CriticalSection: *mut CRITICAL_SECTION); @@ -771,227 +782,231 @@ extern "system" { pub fn DeleteCriticalSection(CriticalSection: *mut CRITICAL_SECTION); pub fn RemoveDirectoryW(lpPathName: LPCWSTR) -> BOOL; - pub fn SetFileAttributesW(lpFileName: LPCWSTR, - dwFileAttributes: DWORD) -> BOOL; + pub fn SetFileAttributesW(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL; pub fn SetLastError(dwErrCode: DWORD); pub fn GetCommandLineW() -> *mut LPCWSTR; - pub fn GetTempPathW(nBufferLength: DWORD, - lpBuffer: LPCWSTR) -> DWORD; + pub fn GetTempPathW(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD; pub fn GetCurrentProcess() -> HANDLE; pub fn GetCurrentThread() -> HANDLE; pub fn GetStdHandle(which: DWORD) -> HANDLE; pub fn ExitProcess(uExitCode: c_uint) -> !; - pub fn DeviceIoControl(hDevice: HANDLE, - dwIoControlCode: DWORD, - lpInBuffer: LPVOID, - nInBufferSize: DWORD, - lpOutBuffer: LPVOID, - nOutBufferSize: DWORD, - lpBytesReturned: LPDWORD, - lpOverlapped: LPOVERLAPPED) -> BOOL; - pub fn CreateThread(lpThreadAttributes: LPSECURITY_ATTRIBUTES, - dwStackSize: SIZE_T, - lpStartAddress: extern "system" fn(*mut c_void) - -> DWORD, - lpParameter: LPVOID, - dwCreationFlags: DWORD, - lpThreadId: LPDWORD) -> HANDLE; - pub fn WaitForSingleObject(hHandle: HANDLE, - dwMilliseconds: DWORD) -> DWORD; + pub fn DeviceIoControl( + hDevice: HANDLE, + dwIoControlCode: DWORD, + lpInBuffer: LPVOID, + nInBufferSize: DWORD, + lpOutBuffer: LPVOID, + nOutBufferSize: DWORD, + lpBytesReturned: LPDWORD, + lpOverlapped: LPOVERLAPPED, + ) -> BOOL; + pub fn CreateThread( + lpThreadAttributes: LPSECURITY_ATTRIBUTES, + dwStackSize: SIZE_T, + lpStartAddress: extern "system" fn(*mut c_void) -> DWORD, + lpParameter: LPVOID, + dwCreationFlags: DWORD, + lpThreadId: LPDWORD, + ) -> HANDLE; + pub fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD; pub fn SwitchToThread() -> BOOL; pub fn Sleep(dwMilliseconds: DWORD); pub fn GetProcessId(handle: HANDLE) -> DWORD; - pub fn CopyFileExW(lpExistingFileName: LPCWSTR, - lpNewFileName: LPCWSTR, - lpProgressRoutine: LPPROGRESS_ROUTINE, - lpData: LPVOID, - pbCancel: LPBOOL, - dwCopyFlags: DWORD) -> BOOL; - pub fn FormatMessageW(flags: DWORD, - lpSrc: LPVOID, - msgId: DWORD, - langId: DWORD, - buf: LPWSTR, - nsize: DWORD, - args: *const c_void) - -> DWORD; + pub fn CopyFileExW( + lpExistingFileName: LPCWSTR, + lpNewFileName: LPCWSTR, + lpProgressRoutine: LPPROGRESS_ROUTINE, + lpData: LPVOID, + pbCancel: LPBOOL, + dwCopyFlags: DWORD, + ) -> BOOL; + pub fn FormatMessageW( + flags: DWORD, + lpSrc: LPVOID, + msgId: DWORD, + langId: DWORD, + buf: LPWSTR, + nsize: DWORD, + args: *const c_void, + ) -> DWORD; pub fn TlsAlloc() -> DWORD; pub fn TlsGetValue(dwTlsIndex: DWORD) -> LPVOID; pub fn TlsSetValue(dwTlsIndex: DWORD, lpTlsvalue: LPVOID) -> BOOL; pub fn GetLastError() -> DWORD; pub fn QueryPerformanceFrequency(lpFrequency: *mut LARGE_INTEGER) -> BOOL; - pub fn QueryPerformanceCounter(lpPerformanceCount: *mut LARGE_INTEGER) - -> BOOL; + pub fn QueryPerformanceCounter(lpPerformanceCount: *mut LARGE_INTEGER) -> BOOL; pub fn GetExitCodeProcess(hProcess: HANDLE, lpExitCode: LPDWORD) -> BOOL; pub fn TerminateProcess(hProcess: HANDLE, uExitCode: UINT) -> BOOL; - pub fn CreateProcessW(lpApplicationName: LPCWSTR, - lpCommandLine: LPWSTR, - lpProcessAttributes: LPSECURITY_ATTRIBUTES, - lpThreadAttributes: LPSECURITY_ATTRIBUTES, - bInheritHandles: BOOL, - dwCreationFlags: DWORD, - lpEnvironment: LPVOID, - lpCurrentDirectory: LPCWSTR, - lpStartupInfo: LPSTARTUPINFO, - lpProcessInformation: LPPROCESS_INFORMATION) - -> BOOL; + pub fn CreateProcessW( + lpApplicationName: LPCWSTR, + lpCommandLine: LPWSTR, + lpProcessAttributes: LPSECURITY_ATTRIBUTES, + lpThreadAttributes: LPSECURITY_ATTRIBUTES, + bInheritHandles: BOOL, + dwCreationFlags: DWORD, + lpEnvironment: LPVOID, + lpCurrentDirectory: LPCWSTR, + lpStartupInfo: LPSTARTUPINFO, + lpProcessInformation: LPPROCESS_INFORMATION, + ) -> BOOL; pub fn GetEnvironmentVariableW(n: LPCWSTR, v: LPWSTR, nsize: DWORD) -> DWORD; pub fn SetEnvironmentVariableW(n: LPCWSTR, v: LPCWSTR) -> BOOL; pub fn GetEnvironmentStringsW() -> LPWCH; pub fn FreeEnvironmentStringsW(env_ptr: LPWCH) -> BOOL; - pub fn GetModuleFileNameW(hModule: HMODULE, - lpFilename: LPWSTR, - nSize: DWORD) - -> DWORD; - pub fn CreateDirectoryW(lpPathName: LPCWSTR, - lpSecurityAttributes: LPSECURITY_ATTRIBUTES) - -> BOOL; + pub fn GetModuleFileNameW(hModule: HMODULE, lpFilename: LPWSTR, nSize: DWORD) -> DWORD; + pub fn CreateDirectoryW( + lpPathName: LPCWSTR, + lpSecurityAttributes: LPSECURITY_ATTRIBUTES, + ) -> BOOL; pub fn DeleteFileW(lpPathName: LPCWSTR) -> BOOL; pub fn GetCurrentDirectoryW(nBufferLength: DWORD, lpBuffer: LPWSTR) -> DWORD; pub fn SetCurrentDirectoryW(lpPathName: LPCWSTR) -> BOOL; - pub fn WideCharToMultiByte(CodePage: UINT, - dwFlags: DWORD, - lpWideCharStr: LPCWSTR, - cchWideChar: c_int, - lpMultiByteStr: LPSTR, - cbMultiByte: c_int, - lpDefaultChar: LPCSTR, - lpUsedDefaultChar: LPBOOL) -> c_int; + pub fn WideCharToMultiByte( + CodePage: UINT, + dwFlags: DWORD, + lpWideCharStr: LPCWSTR, + cchWideChar: c_int, + lpMultiByteStr: LPSTR, + cbMultiByte: c_int, + lpDefaultChar: LPCSTR, + lpUsedDefaultChar: LPBOOL, + ) -> c_int; pub fn closesocket(socket: SOCKET) -> c_int; - pub fn recv(socket: SOCKET, buf: *mut c_void, len: c_int, - flags: c_int) -> c_int; - pub fn send(socket: SOCKET, buf: *const c_void, len: c_int, - flags: c_int) -> c_int; - pub fn recvfrom(socket: SOCKET, - buf: *mut c_void, - len: c_int, - flags: c_int, - addr: *mut SOCKADDR, - addrlen: *mut c_int) - -> c_int; - pub fn sendto(socket: SOCKET, - buf: *const c_void, - len: c_int, - flags: c_int, - addr: *const SOCKADDR, - addrlen: c_int) - -> c_int; + pub fn recv(socket: SOCKET, buf: *mut c_void, len: c_int, flags: c_int) -> c_int; + pub fn send(socket: SOCKET, buf: *const c_void, len: c_int, flags: c_int) -> c_int; + pub fn recvfrom( + socket: SOCKET, + buf: *mut c_void, + len: c_int, + flags: c_int, + addr: *mut SOCKADDR, + addrlen: *mut c_int, + ) -> c_int; + pub fn sendto( + socket: SOCKET, + buf: *const c_void, + len: c_int, + flags: c_int, + addr: *const SOCKADDR, + addrlen: c_int, + ) -> c_int; pub fn shutdown(socket: SOCKET, how: c_int) -> c_int; - pub fn accept(socket: SOCKET, - address: *mut SOCKADDR, - address_len: *mut c_int) - -> SOCKET; - pub fn DuplicateHandle(hSourceProcessHandle: HANDLE, - hSourceHandle: HANDLE, - hTargetProcessHandle: HANDLE, - lpTargetHandle: LPHANDLE, - dwDesiredAccess: DWORD, - bInheritHandle: BOOL, - dwOptions: DWORD) - -> BOOL; - pub fn ReadFile(hFile: HANDLE, - lpBuffer: LPVOID, - nNumberOfBytesToRead: DWORD, - lpNumberOfBytesRead: LPDWORD, - lpOverlapped: LPOVERLAPPED) - -> BOOL; - pub fn WriteFile(hFile: HANDLE, - lpBuffer: LPVOID, - nNumberOfBytesToWrite: DWORD, - lpNumberOfBytesWritten: LPDWORD, - lpOverlapped: LPOVERLAPPED) - -> BOOL; + pub fn accept(socket: SOCKET, address: *mut SOCKADDR, address_len: *mut c_int) -> SOCKET; + pub fn DuplicateHandle( + hSourceProcessHandle: HANDLE, + hSourceHandle: HANDLE, + hTargetProcessHandle: HANDLE, + lpTargetHandle: LPHANDLE, + dwDesiredAccess: DWORD, + bInheritHandle: BOOL, + dwOptions: DWORD, + ) -> BOOL; + pub fn ReadFile( + hFile: HANDLE, + lpBuffer: LPVOID, + nNumberOfBytesToRead: DWORD, + lpNumberOfBytesRead: LPDWORD, + lpOverlapped: LPOVERLAPPED, + ) -> BOOL; + pub fn WriteFile( + hFile: HANDLE, + lpBuffer: LPVOID, + nNumberOfBytesToWrite: DWORD, + lpNumberOfBytesWritten: LPDWORD, + lpOverlapped: LPOVERLAPPED, + ) -> BOOL; pub fn CloseHandle(hObject: HANDLE) -> BOOL; - pub fn MoveFileExW(lpExistingFileName: LPCWSTR, - lpNewFileName: LPCWSTR, - dwFlags: DWORD) - -> BOOL; - pub fn SetFilePointerEx(hFile: HANDLE, - liDistanceToMove: LARGE_INTEGER, - lpNewFilePointer: PLARGE_INTEGER, - dwMoveMethod: DWORD) - -> BOOL; + pub fn MoveFileExW(lpExistingFileName: LPCWSTR, lpNewFileName: LPCWSTR, dwFlags: DWORD) + -> BOOL; + pub fn SetFilePointerEx( + hFile: HANDLE, + liDistanceToMove: LARGE_INTEGER, + lpNewFilePointer: PLARGE_INTEGER, + dwMoveMethod: DWORD, + ) -> BOOL; pub fn FlushFileBuffers(hFile: HANDLE) -> BOOL; - pub fn CreateFileW(lpFileName: LPCWSTR, - dwDesiredAccess: DWORD, - dwShareMode: DWORD, - lpSecurityAttributes: LPSECURITY_ATTRIBUTES, - dwCreationDisposition: DWORD, - dwFlagsAndAttributes: DWORD, - hTemplateFile: HANDLE) - -> HANDLE; - - pub fn FindFirstFileW(fileName: LPCWSTR, - findFileData: LPWIN32_FIND_DATAW) - -> HANDLE; - pub fn FindNextFileW(findFile: HANDLE, findFileData: LPWIN32_FIND_DATAW) - -> BOOL; + pub fn CreateFileW( + lpFileName: LPCWSTR, + dwDesiredAccess: DWORD, + dwShareMode: DWORD, + lpSecurityAttributes: LPSECURITY_ATTRIBUTES, + dwCreationDisposition: DWORD, + dwFlagsAndAttributes: DWORD, + hTemplateFile: HANDLE, + ) -> HANDLE; + + pub fn FindFirstFileW(fileName: LPCWSTR, findFileData: LPWIN32_FIND_DATAW) -> HANDLE; + pub fn FindNextFileW(findFile: HANDLE, findFileData: LPWIN32_FIND_DATAW) -> BOOL; pub fn FindClose(findFile: HANDLE) -> BOOL; - pub fn getsockopt(s: SOCKET, - level: c_int, - optname: c_int, - optval: *mut c_char, - optlen: *mut c_int) - -> c_int; - pub fn setsockopt(s: SOCKET, - level: c_int, - optname: c_int, - optval: *const c_void, - optlen: c_int) - -> c_int; - pub fn getsockname(socket: SOCKET, - address: *mut SOCKADDR, - address_len: *mut c_int) - -> c_int; - pub fn getpeername(socket: SOCKET, - address: *mut SOCKADDR, - address_len: *mut c_int) - -> c_int; - pub fn bind(socket: SOCKET, address: *const SOCKADDR, - address_len: socklen_t) -> c_int; + pub fn getsockopt( + s: SOCKET, + level: c_int, + optname: c_int, + optval: *mut c_char, + optlen: *mut c_int, + ) -> c_int; + pub fn setsockopt( + s: SOCKET, + level: c_int, + optname: c_int, + optval: *const c_void, + optlen: c_int, + ) -> c_int; + pub fn getsockname(socket: SOCKET, address: *mut SOCKADDR, address_len: *mut c_int) -> c_int; + pub fn getpeername(socket: SOCKET, address: *mut SOCKADDR, address_len: *mut c_int) -> c_int; + pub fn bind(socket: SOCKET, address: *const SOCKADDR, address_len: socklen_t) -> c_int; pub fn listen(socket: SOCKET, backlog: c_int) -> c_int; - pub fn connect(socket: SOCKET, address: *const SOCKADDR, len: c_int) - -> c_int; - pub fn getaddrinfo(node: *const c_char, service: *const c_char, - hints: *const ADDRINFOA, - res: *mut *mut ADDRINFOA) -> c_int; + pub fn connect(socket: SOCKET, address: *const SOCKADDR, len: c_int) -> c_int; + pub fn getaddrinfo( + node: *const c_char, + service: *const c_char, + hints: *const ADDRINFOA, + res: *mut *mut ADDRINFOA, + ) -> c_int; pub fn freeaddrinfo(res: *mut ADDRINFOA); - pub fn GetProcAddress(handle: HMODULE, - name: LPCSTR) -> *mut c_void; + pub fn GetProcAddress(handle: HMODULE, name: LPCSTR) -> *mut c_void; pub fn GetModuleHandleW(lpModuleName: LPCWSTR) -> HMODULE; pub fn GetSystemTimeAsFileTime(lpSystemTimeAsFileTime: LPFILETIME); - pub fn CreateEventW(lpEventAttributes: LPSECURITY_ATTRIBUTES, - bManualReset: BOOL, - bInitialState: BOOL, - lpName: LPCWSTR) -> HANDLE; - pub fn WaitForMultipleObjects(nCount: DWORD, - lpHandles: *const HANDLE, - bWaitAll: BOOL, - dwMilliseconds: DWORD) -> DWORD; - pub fn CreateNamedPipeW(lpName: LPCWSTR, - dwOpenMode: DWORD, - dwPipeMode: DWORD, - nMaxInstances: DWORD, - nOutBufferSize: DWORD, - nInBufferSize: DWORD, - nDefaultTimeOut: DWORD, - lpSecurityAttributes: LPSECURITY_ATTRIBUTES) - -> HANDLE; + pub fn CreateEventW( + lpEventAttributes: LPSECURITY_ATTRIBUTES, + bManualReset: BOOL, + bInitialState: BOOL, + lpName: LPCWSTR, + ) -> HANDLE; + pub fn WaitForMultipleObjects( + nCount: DWORD, + lpHandles: *const HANDLE, + bWaitAll: BOOL, + dwMilliseconds: DWORD, + ) -> DWORD; + pub fn CreateNamedPipeW( + lpName: LPCWSTR, + dwOpenMode: DWORD, + dwPipeMode: DWORD, + nMaxInstances: DWORD, + nOutBufferSize: DWORD, + nInBufferSize: DWORD, + nDefaultTimeOut: DWORD, + lpSecurityAttributes: LPSECURITY_ATTRIBUTES, + ) -> HANDLE; pub fn CancelIo(handle: HANDLE) -> BOOL; - pub fn GetOverlappedResult(hFile: HANDLE, - lpOverlapped: LPOVERLAPPED, - lpNumberOfBytesTransferred: LPDWORD, - bWait: BOOL) -> BOOL; - pub fn select(nfds: c_int, - readfds: *mut fd_set, - writefds: *mut fd_set, - exceptfds: *mut fd_set, - timeout: *const timeval) -> c_int; - + pub fn GetOverlappedResult( + hFile: HANDLE, + lpOverlapped: LPOVERLAPPED, + lpNumberOfBytesTransferred: LPDWORD, + bWait: BOOL, + ) -> BOOL; + pub fn select( + nfds: c_int, + readfds: *mut fd_set, + writefds: *mut fd_set, + exceptfds: *mut fd_set, + timeout: *const timeval, + ) -> c_int; pub fn GetProcessHeap() -> HANDLE; pub fn HeapAlloc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) -> LPVOID; diff --git a/src/libstd/sys/windows/cmath.rs b/src/libstd/sys/windows/cmath.rs index 7c5bfa1bd0..1a5421facd 100644 --- a/src/libstd/sys/windows/cmath.rs +++ b/src/libstd/sys/windows/cmath.rs @@ -2,7 +2,6 @@ use libc::{c_double, c_float}; -#[link_name = "m"] extern "C" { pub fn acos(n: c_double) -> c_double; pub fn asin(n: c_double) -> c_double; @@ -28,7 +27,7 @@ extern "C" { pub use self::shims::*; -#[cfg(not(target_env = "msvc"))] +#[cfg(not(all(target_env = "msvc", target_arch = "x86")))] mod shims { use libc::c_float; @@ -44,10 +43,10 @@ mod shims { } } -// On MSVC these functions aren't defined, so we just define shims which promote -// everything fo f64, perform the calculation, and then demote back to f32. -// While not precisely correct should be "correct enough" for now. -#[cfg(target_env = "msvc")] +// On 32-bit x86 MSVC these functions aren't defined, so we just define shims +// which promote everything fo f64, perform the calculation, and then demote +// back to f32. While not precisely correct should be "correct enough" for now. +#[cfg(all(target_env = "msvc", target_arch = "x86"))] mod shims { use libc::c_float; diff --git a/src/libstd/sys/windows/condvar.rs b/src/libstd/sys/windows/condvar.rs index 62835ea7c9..8f7f6854cc 100644 --- a/src/libstd/sys/windows/condvar.rs +++ b/src/libstd/sys/windows/condvar.rs @@ -4,7 +4,9 @@ use crate::sys::mutex::{self, Mutex}; use crate::sys::os; use crate::time::Duration; -pub struct Condvar { inner: UnsafeCell<c::CONDITION_VARIABLE> } +pub struct Condvar { + inner: UnsafeCell<c::CONDITION_VARIABLE>, +} unsafe impl Send for Condvar {} unsafe impl Sync for Condvar {} @@ -19,18 +21,17 @@ impl Condvar { #[inline] pub unsafe fn wait(&self, mutex: &Mutex) { - let r = c::SleepConditionVariableSRW(self.inner.get(), - mutex::raw(mutex), - c::INFINITE, - 0); + let r = c::SleepConditionVariableSRW(self.inner.get(), mutex::raw(mutex), c::INFINITE, 0); debug_assert!(r != 0); } pub unsafe fn wait_timeout(&self, mutex: &Mutex, dur: Duration) -> bool { - let r = c::SleepConditionVariableSRW(self.inner.get(), - mutex::raw(mutex), - super::dur2timeout(dur), - 0); + let r = c::SleepConditionVariableSRW( + self.inner.get(), + mutex::raw(mutex), + super::dur2timeout(dur), + 0, + ); if r == 0 { debug_assert_eq!(os::errno() as usize, c::ERROR_TIMEOUT as usize); false diff --git a/src/libstd/sys/windows/ext/fs.rs b/src/libstd/sys/windows/ext/fs.rs index 7eaff226a7..d508a33348 100644 --- a/src/libstd/sys/windows/ext/fs.rs +++ b/src/libstd/sys/windows/ext/fs.rs @@ -117,7 +117,7 @@ pub trait OpenOptionsExt { /// let file = OpenOptions::new().access_mode(0).open("foo.txt"); /// ``` /// - /// [`CreateFile`]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858.aspx + /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea #[stable(feature = "open_options_ext", since = "1.10.0")] fn access_mode(&mut self, access: u32) -> &mut Self; @@ -145,7 +145,7 @@ pub trait OpenOptionsExt { /// .open("foo.txt"); /// ``` /// - /// [`CreateFile`]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858.aspx + /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea #[stable(feature = "open_options_ext", since = "1.10.0")] fn share_mode(&mut self, val: u32) -> &mut Self; @@ -174,8 +174,8 @@ pub trait OpenOptionsExt { /// .open("foo.txt"); /// ``` /// - /// [`CreateFile`]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858.aspx - /// [`CreateFile2`]: https://msdn.microsoft.com/en-us/library/windows/desktop/hh449422.aspx + /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea + /// [`CreateFile2`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfile2 #[stable(feature = "open_options_ext", since = "1.10.0")] fn custom_flags(&mut self, flags: u32) -> &mut Self; @@ -211,8 +211,8 @@ pub trait OpenOptionsExt { /// .open("foo.txt"); /// ``` /// - /// [`CreateFile`]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858.aspx - /// [`CreateFile2`]: https://msdn.microsoft.com/en-us/library/windows/desktop/hh449422.aspx + /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea + /// [`CreateFile2`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfile2 #[stable(feature = "open_options_ext", since = "1.10.0")] fn attributes(&mut self, val: u32) -> &mut Self; @@ -254,10 +254,10 @@ pub trait OpenOptionsExt { /// .open(r"\\.\pipe\MyPipe"); /// ``` /// - /// [`CreateFile`]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858.aspx - /// [`CreateFile2`]: https://msdn.microsoft.com/en-us/library/windows/desktop/hh449422.aspx + /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea + /// [`CreateFile2`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfile2 /// [Impersonation Levels]: - /// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379572.aspx + /// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ne-winnt-security_impersonation_level #[stable(feature = "open_options_ext", since = "1.10.0")] fn security_qos_flags(&mut self, flags: u32) -> &mut OpenOptions; } @@ -297,7 +297,7 @@ impl OpenOptionsExt for OpenOptions { /// /// [`fs::Metadata`]: ../../../../std/fs/struct.Metadata.html /// [`BY_HANDLE_FILE_INFORMATION`]: -/// https://msdn.microsoft.com/en-us/library/windows/desktop/aa363788.aspx +/// https://docs.microsoft.com/en-us/windows/win32/api/fileapi/ns-fileapi-by_handle_file_information #[stable(feature = "metadata_ext", since = "1.1.0")] pub trait MetadataExt { /// Returns the value of the `dwFileAttributes` field of this metadata. @@ -321,7 +321,7 @@ pub trait MetadataExt { /// ``` /// /// [File Attribute Constants]: - /// https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117.aspx + /// https://docs.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants #[stable(feature = "metadata_ext", since = "1.1.0")] fn file_attributes(&self) -> u32; @@ -350,7 +350,7 @@ pub trait MetadataExt { /// } /// ``` /// - /// [`FILETIME`]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx + /// [`FILETIME`]: https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime #[stable(feature = "metadata_ext", since = "1.1.0")] fn creation_time(&self) -> u64; @@ -385,7 +385,7 @@ pub trait MetadataExt { /// } /// ``` /// - /// [`FILETIME`]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx + /// [`FILETIME`]: https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime #[stable(feature = "metadata_ext", since = "1.1.0")] fn last_access_time(&self) -> u64; @@ -418,7 +418,7 @@ pub trait MetadataExt { /// } /// ``` /// - /// [`FILETIME`]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx + /// [`FILETIME`]: https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime #[stable(feature = "metadata_ext", since = "1.1.0")] fn last_write_time(&self) -> u64; @@ -504,17 +504,17 @@ impl MetadataExt for Metadata { /// On Windows, a symbolic link knows whether it is a file or directory. /// /// [`FileType`]: ../../../../std/fs/struct.FileType.html -#[unstable(feature = "windows_file_type_ext", issue = "0")] +#[unstable(feature = "windows_file_type_ext", issue = "none")] pub trait FileTypeExt { /// Returns `true` if this file type is a symbolic link that is also a directory. - #[unstable(feature = "windows_file_type_ext", issue = "0")] + #[unstable(feature = "windows_file_type_ext", issue = "none")] fn is_symlink_dir(&self) -> bool; /// Returns `true` if this file type is a symbolic link that is also a file. - #[unstable(feature = "windows_file_type_ext", issue = "0")] + #[unstable(feature = "windows_file_type_ext", issue = "none")] fn is_symlink_file(&self) -> bool; } -#[unstable(feature = "windows_file_type_ext", issue = "0")] +#[unstable(feature = "windows_file_type_ext", issue = "none")] impl FileTypeExt for fs::FileType { fn is_symlink_dir(&self) -> bool { self.as_inner().is_symlink_dir() diff --git a/src/libstd/sys/windows/ext/process.rs b/src/libstd/sys/windows/ext/process.rs index ed35c5ff19..8c34a9faf1 100644 --- a/src/libstd/sys/windows/ext/process.rs +++ b/src/libstd/sys/windows/ext/process.rs @@ -99,7 +99,7 @@ pub trait CommandExt { /// /// These will always be ORed with `CREATE_UNICODE_ENVIRONMENT`. /// - /// [1]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863(v=vs.85).aspx + /// [1]: https://docs.microsoft.com/en-us/windows/win32/procthread/process-creation-flags #[stable(feature = "windows_process_extensions", since = "1.16.0")] fn creation_flags(&mut self, flags: u32) -> &mut process::Command; } diff --git a/src/libstd/sys/windows/fast_thread_local.rs b/src/libstd/sys/windows/fast_thread_local.rs index 31d0bd1e72..191fa07f32 100644 --- a/src/libstd/sys/windows/fast_thread_local.rs +++ b/src/libstd/sys/windows/fast_thread_local.rs @@ -1,4 +1,4 @@ -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] #![cfg(target_thread_local)] pub use crate::sys_common::thread_local::register_dtor_fallback as register_dtor; diff --git a/src/libstd/sys/windows/fs.rs b/src/libstd/sys/windows/fs.rs index e9c84c4e7c..427f4b684e 100644 --- a/src/libstd/sys/windows/fs.rs +++ b/src/libstd/sys/windows/fs.rs @@ -923,6 +923,6 @@ fn symlink_junction_inner(target: &Path, junction: &Path) -> io::Result<()> { &mut ret, ptr::null_mut(), )) - .map(|_| ()) + .map(drop) } } diff --git a/src/libstd/sys/windows/handle.rs b/src/libstd/sys/windows/handle.rs index ebaa0783d6..f2ad057b6b 100644 --- a/src/libstd/sys/windows/handle.rs +++ b/src/libstd/sys/windows/handle.rs @@ -1,4 +1,4 @@ -#![unstable(issue = "0", feature = "windows_handle")] +#![unstable(issue = "none", feature = "windows_handle")] use crate::cmp; use crate::io::{self, ErrorKind, IoSlice, IoSliceMut, Read}; @@ -156,7 +156,7 @@ impl RawHandle { } pub fn cancel_io(&self) -> io::Result<()> { - unsafe { cvt(c::CancelIo(self.raw())).map(|_| ()) } + unsafe { cvt(c::CancelIo(self.raw())).map(drop) } } pub fn write(&self, buf: &[u8]) -> io::Result<usize> { diff --git a/src/libstd/sys/windows/mod.rs b/src/libstd/sys/windows/mod.rs index d59ac5959a..b004cd1902 100644 --- a/src/libstd/sys/windows/mod.rs +++ b/src/libstd/sys/windows/mod.rs @@ -1,16 +1,17 @@ #![allow(missing_docs, nonstandard_style)] -use crate::ptr; use crate::ffi::{OsStr, OsString}; use crate::io::ErrorKind; use crate::os::windows::ffi::{OsStrExt, OsStringExt}; use crate::path::PathBuf; +use crate::ptr; use crate::time::Duration; -pub use libc::strlen; pub use self::rand::hashmap_random_keys; +pub use libc::strlen; -#[macro_use] pub mod compat; +#[macro_use] +pub mod compat; pub mod alloc; pub mod args; @@ -49,8 +50,7 @@ cfg_if::cfg_if! { } #[cfg(not(test))] -pub fn init() { -} +pub fn init() {} pub fn decode_error_kind(errno: i32) -> ErrorKind { match errno as c::DWORD { @@ -85,8 +85,10 @@ pub fn to_u16s<S: AsRef<OsStr>>(s: S) -> crate::io::Result<Vec<u16>> { fn inner(s: &OsStr) -> crate::io::Result<Vec<u16>> { let mut maybe_result: Vec<u16> = s.encode_wide().collect(); if maybe_result.iter().any(|&u| u == 0) { - return Err(crate::io::Error::new(ErrorKind::InvalidInput, - "strings passed to WinAPI cannot contain NULs")); + return Err(crate::io::Error::new( + ErrorKind::InvalidInput, + "strings passed to WinAPI cannot contain NULs", + )); } maybe_result.push(0); Ok(maybe_result) @@ -109,8 +111,9 @@ pub fn to_u16s<S: AsRef<OsStr>>(s: S) -> crate::io::Result<Vec<u16>> { // yielded the data which has been read from the syscall. The return value // from this closure is then the return value of the function. fn fill_utf16_buf<F1, F2, T>(mut f1: F1, f2: F2) -> crate::io::Result<T> - where F1: FnMut(*mut u16, c::DWORD) -> c::DWORD, - F2: FnOnce(&[u16]) -> T +where + F1: FnMut(*mut u16, c::DWORD) -> c::DWORD, + F2: FnOnce(&[u16]) -> T, { // Start off with a stack buf but then spill over to the heap if we end up // needing more space. @@ -148,7 +151,7 @@ fn fill_utf16_buf<F1, F2, T>(mut f1: F1, f2: F2) -> crate::io::Result<T> } else if k >= n { n = k; } else { - return Ok(f2(&buf[..k])) + return Ok(f2(&buf[..k])); } } } @@ -159,20 +162,23 @@ fn os2path(s: &[u16]) -> PathBuf { } #[allow(dead_code)] // Only used in backtrace::gnu::get_executable_filename() -fn wide_char_to_multi_byte(code_page: u32, - flags: u32, - s: &[u16], - no_default_char: bool) - -> crate::io::Result<Vec<i8>> { +fn wide_char_to_multi_byte( + code_page: u32, + flags: u32, + s: &[u16], + no_default_char: bool, +) -> crate::io::Result<Vec<i8>> { unsafe { - let mut size = c::WideCharToMultiByte(code_page, - flags, - s.as_ptr(), - s.len() as i32, - ptr::null_mut(), - 0, - ptr::null(), - ptr::null_mut()); + let mut size = c::WideCharToMultiByte( + code_page, + flags, + s.as_ptr(), + s.len() as i32, + ptr::null_mut(), + 0, + ptr::null(), + ptr::null_mut(), + ); if size == 0 { return Err(crate::io::Error::last_os_error()); } @@ -181,21 +187,24 @@ fn wide_char_to_multi_byte(code_page: u32, buf.set_len(size as usize); let mut used_default_char = c::FALSE; - size = c::WideCharToMultiByte(code_page, - flags, - s.as_ptr(), - s.len() as i32, - buf.as_mut_ptr(), - buf.len() as i32, - ptr::null(), - if no_default_char { &mut used_default_char } - else { ptr::null_mut() }); + size = c::WideCharToMultiByte( + code_page, + flags, + s.as_ptr(), + s.len() as i32, + buf.as_mut_ptr(), + buf.len() as i32, + ptr::null(), + if no_default_char { &mut used_default_char } else { ptr::null_mut() }, + ); if size == 0 { return Err(crate::io::Error::last_os_error()); } if no_default_char && used_default_char == c::TRUE { - return Err(crate::io::Error::new(crate::io::ErrorKind::InvalidData, - "string cannot be converted to requested code page")); + return Err(crate::io::Error::new( + crate::io::ErrorKind::InvalidData, + "string cannot be converted to requested code page", + )); } buf.set_len(size as usize); @@ -208,7 +217,7 @@ pub fn truncate_utf16_at_nul(v: &[u16]) -> &[u16] { match v.iter().position(|c| *c == 0) { // don't include the 0 Some(i) => &v[..i], - None => v + None => v, } } @@ -227,11 +236,7 @@ macro_rules! impl_is_zero { impl_is_zero! { i8 i16 i32 i64 isize u8 u16 u32 u64 usize } pub fn cvt<I: IsZero>(i: I) -> crate::io::Result<I> { - if i.is_zero() { - Err(crate::io::Error::last_os_error()) - } else { - Ok(i) - } + if i.is_zero() { Err(crate::io::Error::last_os_error()) } else { Ok(i) } } pub fn dur2timeout(dur: Duration) -> c::DWORD { @@ -242,17 +247,12 @@ pub fn dur2timeout(dur: Duration) -> c::DWORD { // * Nanosecond precision is rounded up // * Greater than u32::MAX milliseconds (50 days) is rounded up to INFINITE // (never time out). - dur.as_secs().checked_mul(1000).and_then(|ms| { - ms.checked_add((dur.subsec_nanos() as u64) / 1_000_000) - }).and_then(|ms| { - ms.checked_add(if dur.subsec_nanos() % 1_000_000 > 0 {1} else {0}) - }).map(|ms| { - if ms > <c::DWORD>::max_value() as u64 { - c::INFINITE - } else { - ms as c::DWORD - } - }).unwrap_or(c::INFINITE) + dur.as_secs() + .checked_mul(1000) + .and_then(|ms| ms.checked_add((dur.subsec_nanos() as u64) / 1_000_000)) + .and_then(|ms| ms.checked_add(if dur.subsec_nanos() % 1_000_000 > 0 { 1 } else { 0 })) + .map(|ms| if ms > <c::DWORD>::max_value() as u64 { c::INFINITE } else { ms as c::DWORD }) + .unwrap_or(c::INFINITE) } // On Windows, use the processor-specific __fastfail mechanism. In Windows 8 @@ -262,7 +262,7 @@ pub fn dur2timeout(dur: Duration) -> c::DWORD { // terminating the process but without necessarily bypassing all exception // handlers. // -// https://msdn.microsoft.com/en-us/library/dn774154.aspx +// https://docs.microsoft.com/en-us/cpp/intrinsics/fastfail #[allow(unreachable_code)] pub unsafe fn abort_internal() -> ! { #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] diff --git a/src/libstd/sys/windows/mutex.rs b/src/libstd/sys/windows/mutex.rs index 79dec1adf4..281eb294c6 100644 --- a/src/libstd/sys/windows/mutex.rs +++ b/src/libstd/sys/windows/mutex.rs @@ -95,12 +95,12 @@ impl Mutex { pub unsafe fn destroy(&self) { match kind() { Kind::SRWLock => {} - Kind::CriticalSection => { - match self.lock.load(Ordering::SeqCst) { - 0 => {} - n => { Box::from_raw(n as *mut ReentrantMutex).destroy(); } + Kind::CriticalSection => match self.lock.load(Ordering::SeqCst) { + 0 => {} + n => { + Box::from_raw(n as *mut ReentrantMutex).destroy(); } - } + }, } } @@ -114,7 +114,10 @@ impl Mutex { let re = Box::into_raw(re); match self.lock.compare_and_swap(0, re as usize, Ordering::SeqCst) { 0 => re, - n => { Box::from_raw(re).destroy(); n as *mut _ } + n => { + Box::from_raw(re).destroy(); + n as *mut _ + } } } @@ -125,7 +128,6 @@ impl Mutex { *self.held.get() = true; true } - } } @@ -134,9 +136,9 @@ fn kind() -> Kind { let val = KIND.load(Ordering::SeqCst); if val == Kind::SRWLock as usize { - return Kind::SRWLock + return Kind::SRWLock; } else if val == Kind::CriticalSection as usize { - return Kind::CriticalSection + return Kind::CriticalSection; } let ret = match compat::lookup("kernel32", "AcquireSRWLockExclusive") { @@ -147,7 +149,9 @@ fn kind() -> Kind { ret } -pub struct ReentrantMutex { inner: UnsafeCell<MaybeUninit<c::CRITICAL_SECTION>> } +pub struct ReentrantMutex { + inner: UnsafeCell<MaybeUninit<c::CRITICAL_SECTION>>, +} unsafe impl Send for ReentrantMutex {} unsafe impl Sync for ReentrantMutex {} diff --git a/src/libstd/sys/windows/net.rs b/src/libstd/sys/windows/net.rs index 2f2f285edc..d8d4fdfce2 100644 --- a/src/libstd/sys/windows/net.rs +++ b/src/libstd/sys/windows/net.rs @@ -1,27 +1,27 @@ -#![unstable(issue = "0", feature = "windows_net")] +#![unstable(issue = "none", feature = "windows_net")] use crate::cmp; -use crate::io::{self, Read, IoSlice, IoSliceMut}; +use crate::io::{self, IoSlice, IoSliceMut, Read}; use crate::mem; -use crate::net::{SocketAddr, Shutdown}; +use crate::net::{Shutdown, SocketAddr}; use crate::ptr; use crate::sync::Once; -use crate::sys::c; use crate::sys; -use crate::sys_common::{self, AsInner, FromInner, IntoInner}; +use crate::sys::c; use crate::sys_common::net; +use crate::sys_common::{self, AsInner, FromInner, IntoInner}; use crate::time::Duration; -use libc::{c_int, c_void, c_ulong, c_long}; +use libc::{c_int, c_long, c_ulong, c_void}; pub type wrlen_t = i32; pub mod netc { - pub use crate::sys::c::*; + pub use crate::sys::c::ADDRESS_FAMILY as sa_family_t; + pub use crate::sys::c::ADDRINFOA as addrinfo; pub use crate::sys::c::SOCKADDR as sockaddr; pub use crate::sys::c::SOCKADDR_STORAGE_LH as sockaddr_storage; - pub use crate::sys::c::ADDRINFOA as addrinfo; - pub use crate::sys::c::ADDRESS_FAMILY as sa_family_t; + pub use crate::sys::c::*; } pub struct Socket(c::SOCKET); @@ -33,11 +33,15 @@ pub fn init() { START.call_once(|| unsafe { let mut data: c::WSADATA = mem::zeroed(); - let ret = c::WSAStartup(0x202, // version 2.2 - &mut data); + let ret = c::WSAStartup( + 0x202, // version 2.2 + &mut data, + ); assert_eq!(ret, 0); - let _ = sys_common::at_exit(|| { c::WSACleanup(); }); + let _ = sys_common::at_exit(|| { + c::WSACleanup(); + }); }); } @@ -65,26 +69,19 @@ impl_is_minus_one! { i8 i16 i32 i64 isize } /// and if so, returns the last error from the Windows socket interface. This /// function must be called before another call to the socket API is made. pub fn cvt<T: IsMinusOne>(t: T) -> io::Result<T> { - if t.is_minus_one() { - Err(last_error()) - } else { - Ok(t) - } + if t.is_minus_one() { Err(last_error()) } else { Ok(t) } } /// A variant of `cvt` for `getaddrinfo` which return 0 for a success. pub fn cvt_gai(err: c_int) -> io::Result<()> { - if err == 0 { - Ok(()) - } else { - Err(last_error()) - } + if err == 0 { Ok(()) } else { Err(last_error()) } } /// Just to provide the same interface as sys/unix/net.rs pub fn cvt_r<T, F>(mut f: F) -> io::Result<T> - where T: IsMinusOne, - F: FnMut() -> T +where + T: IsMinusOne, + F: FnMut() -> T, { cvt(f()) } @@ -96,23 +93,27 @@ impl Socket { SocketAddr::V6(..) => c::AF_INET6, }; let socket = unsafe { - match c::WSASocketW(fam, ty, 0, ptr::null_mut(), 0, - c::WSA_FLAG_OVERLAPPED | c::WSA_FLAG_NO_HANDLE_INHERIT) { - c::INVALID_SOCKET => { - match c::WSAGetLastError() { - c::WSAEPROTOTYPE | c::WSAEINVAL => { - match c::WSASocketW(fam, ty, 0, ptr::null_mut(), 0, - c::WSA_FLAG_OVERLAPPED) { - c::INVALID_SOCKET => Err(last_error()), - n => { - let s = Socket(n); - s.set_no_inherit()?; - Ok(s) - }, + match c::WSASocketW( + fam, + ty, + 0, + ptr::null_mut(), + 0, + c::WSA_FLAG_OVERLAPPED | c::WSA_FLAG_NO_HANDLE_INHERIT, + ) { + c::INVALID_SOCKET => match c::WSAGetLastError() { + c::WSAEPROTOTYPE | c::WSAEINVAL => { + match c::WSASocketW(fam, ty, 0, ptr::null_mut(), 0, c::WSA_FLAG_OVERLAPPED) + { + c::INVALID_SOCKET => Err(last_error()), + n => { + let s = Socket(n); + s.set_no_inherit()?; + Ok(s) } - }, - n => Err(io::Error::from_raw_os_error(n)), + } } + n => Err(io::Error::from_raw_os_error(n)), }, n => Ok(Socket(n)), } @@ -135,8 +136,10 @@ impl Socket { } if timeout.as_secs() == 0 && timeout.subsec_nanos() == 0 { - return Err(io::Error::new(io::ErrorKind::InvalidInput, - "cannot set a 0 duration timeout")); + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "cannot set a 0 duration timeout", + )); } let mut timeout = c::timeval { @@ -157,9 +160,8 @@ impl Socket { let mut writefds = fds; let mut errorfds = fds; - let n = unsafe { - cvt(c::select(1, ptr::null_mut(), &mut writefds, &mut errorfds, &timeout))? - }; + let n = + unsafe { cvt(c::select(1, ptr::null_mut(), &mut writefds, &mut errorfds, &timeout))? }; match n { 0 => Err(io::Error::new(io::ErrorKind::TimedOut, "connection timed out")), @@ -174,8 +176,7 @@ impl Socket { } } - pub fn accept(&self, storage: *mut c::SOCKADDR, - len: *mut c_int) -> io::Result<Socket> { + pub fn accept(&self, storage: *mut c::SOCKADDR, len: *mut c_int) -> io::Result<Socket> { let socket = unsafe { match c::accept(self.0, storage, len) { c::INVALID_SOCKET => Err(last_error()), @@ -188,33 +189,35 @@ impl Socket { pub fn duplicate(&self) -> io::Result<Socket> { let socket = unsafe { let mut info: c::WSAPROTOCOL_INFO = mem::zeroed(); - cvt(c::WSADuplicateSocketW(self.0, - c::GetCurrentProcessId(), - &mut info))?; - - match c::WSASocketW(info.iAddressFamily, - info.iSocketType, - info.iProtocol, - &mut info, 0, - c::WSA_FLAG_OVERLAPPED | c::WSA_FLAG_NO_HANDLE_INHERIT) { - c::INVALID_SOCKET => { - match c::WSAGetLastError() { - c::WSAEPROTOTYPE | c::WSAEINVAL => { - match c::WSASocketW(info.iAddressFamily, - info.iSocketType, - info.iProtocol, - &mut info, 0, - c::WSA_FLAG_OVERLAPPED) { - c::INVALID_SOCKET => Err(last_error()), - n => { - let s = Socket(n); - s.set_no_inherit()?; - Ok(s) - }, + cvt(c::WSADuplicateSocketW(self.0, c::GetCurrentProcessId(), &mut info))?; + + match c::WSASocketW( + info.iAddressFamily, + info.iSocketType, + info.iProtocol, + &mut info, + 0, + c::WSA_FLAG_OVERLAPPED | c::WSA_FLAG_NO_HANDLE_INHERIT, + ) { + c::INVALID_SOCKET => match c::WSAGetLastError() { + c::WSAEPROTOTYPE | c::WSAEINVAL => { + match c::WSASocketW( + info.iAddressFamily, + info.iSocketType, + info.iProtocol, + &mut info, + 0, + c::WSA_FLAG_OVERLAPPED, + ) { + c::INVALID_SOCKET => Err(last_error()), + n => { + let s = Socket(n); + s.set_no_inherit()?; + Ok(s) } - }, - n => Err(io::Error::from_raw_os_error(n)), + } } + n => Err(io::Error::from_raw_os_error(n)), }, n => Ok(Socket(n)), } @@ -230,7 +233,7 @@ impl Socket { match c::recv(self.0, buf.as_mut_ptr() as *mut c_void, len, flags) { -1 if c::WSAGetLastError() == c::WSAESHUTDOWN => Ok(0), -1 => Err(last_error()), - n => Ok(n as usize) + n => Ok(n as usize), } } } @@ -267,8 +270,11 @@ impl Socket { self.recv_with_flags(buf, c::MSG_PEEK) } - fn recv_from_with_flags(&self, buf: &mut [u8], flags: c_int) - -> io::Result<(usize, SocketAddr)> { + fn recv_from_with_flags( + &self, + buf: &mut [u8], + flags: c_int, + ) -> io::Result<(usize, SocketAddr)> { let mut storage: c::SOCKADDR_STORAGE_LH = unsafe { mem::zeroed() }; let mut addrlen = mem::size_of_val(&storage) as c::socklen_t; let len = cmp::min(buf.len(), <wrlen_t>::max_value() as usize) as wrlen_t; @@ -276,15 +282,17 @@ impl Socket { // On unix when a socket is shut down all further reads return 0, so we // do the same on windows to map a shut down socket to returning EOF. unsafe { - match c::recvfrom(self.0, - buf.as_mut_ptr() as *mut c_void, - len, - flags, - &mut storage as *mut _ as *mut _, - &mut addrlen) { + match c::recvfrom( + self.0, + buf.as_mut_ptr() as *mut c_void, + len, + flags, + &mut storage as *mut _ as *mut _, + &mut addrlen, + ) { -1 if c::WSAGetLastError() == c::WSAESHUTDOWN => { Ok((0, net::sockaddr_to_addr(&storage, addrlen as usize)?)) - }, + } -1 => Err(last_error()), n => Ok((n as usize, net::sockaddr_to_addr(&storage, addrlen as usize)?)), } @@ -316,18 +324,19 @@ impl Socket { Ok(nwritten as usize) } - pub fn set_timeout(&self, dur: Option<Duration>, - kind: c_int) -> io::Result<()> { + pub fn set_timeout(&self, dur: Option<Duration>, kind: c_int) -> io::Result<()> { let timeout = match dur { Some(dur) => { let timeout = sys::dur2timeout(dur); if timeout == 0 { - return Err(io::Error::new(io::ErrorKind::InvalidInput, - "cannot set a 0 duration timeout")); + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "cannot set a 0 duration timeout", + )); } timeout } - None => 0 + None => 0, }; net::setsockopt(self, c::SOL_SOCKET, kind, timeout) } @@ -345,10 +354,8 @@ impl Socket { #[cfg(not(target_vendor = "uwp"))] fn set_no_inherit(&self) -> io::Result<()> { - sys::cvt(unsafe { - c::SetHandleInformation(self.0 as c::HANDLE, - c::HANDLE_FLAG_INHERIT, 0) - }).map(|_| ()) + sys::cvt(unsafe { c::SetHandleInformation(self.0 as c::HANDLE, c::HANDLE_FLAG_INHERIT, 0) }) + .map(drop) } #[cfg(target_vendor = "uwp")] @@ -369,11 +376,7 @@ impl Socket { pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { let mut nonblocking = nonblocking as c_ulong; let r = unsafe { c::ioctlsocket(self.0, c::FIONBIO as c_int, &mut nonblocking) }; - if r == 0 { - Ok(()) - } else { - Err(io::Error::last_os_error()) - } + if r == 0 { Ok(()) } else { Err(io::Error::last_os_error()) } } pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> { @@ -387,15 +390,11 @@ impl Socket { pub fn take_error(&self) -> io::Result<Option<io::Error>> { let raw: c_int = net::getsockopt(self, c::SOL_SOCKET, c::SO_ERROR)?; - if raw == 0 { - Ok(None) - } else { - Ok(Some(io::Error::from_raw_os_error(raw as i32))) - } + if raw == 0 { Ok(None) } else { Ok(Some(io::Error::from_raw_os_error(raw as i32))) } } } -#[unstable(reason = "not public", issue = "0", feature = "fd_read")] +#[unstable(reason = "not public", issue = "none", feature = "fd_read")] impl<'a> Read for &'a Socket { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { (**self).read(buf) @@ -409,11 +408,15 @@ impl Drop for Socket { } impl AsInner<c::SOCKET> for Socket { - fn as_inner(&self) -> &c::SOCKET { &self.0 } + fn as_inner(&self) -> &c::SOCKET { + &self.0 + } } impl FromInner<c::SOCKET> for Socket { - fn from_inner(sock: c::SOCKET) -> Socket { Socket(sock) } + fn from_inner(sock: c::SOCKET) -> Socket { + Socket(sock) + } } impl IntoInner<c::SOCKET> for Socket { diff --git a/src/libstd/sys/windows/os.rs b/src/libstd/sys/windows/os.rs index 8631e50cf3..cc4ae40590 100644 --- a/src/libstd/sys/windows/os.rs +++ b/src/libstd/sys/windows/os.rs @@ -34,7 +34,7 @@ pub fn error_string(mut errnum: i32) -> String { // NTSTATUS errors may be encoded as HRESULT, which may returned from // GetLastError. For more information about Windows error codes, see - // `[MS-ERREF]`: https://msdn.microsoft.com/en-us/library/cc231198.aspx + // `[MS-ERREF]`: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/0642cb2f-2075-4469-918c-4441e69c548a if (errnum & c::FACILITY_NT_BIT as i32) != 0 { // format according to https://support.microsoft.com/en-us/help/259693 const NTDLL_DLL: &[u16] = &[ @@ -43,7 +43,7 @@ pub fn error_string(mut errnum: i32) -> String { ]; module = c::GetModuleHandleW(NTDLL_DLL.as_ptr()); - if module != ptr::null_mut() { + if !module.is_null() { errnum ^= c::FACILITY_NT_BIT as i32; flags = c::FORMAT_MESSAGE_FROM_HMODULE; } @@ -225,6 +225,7 @@ impl fmt::Display for JoinPathsError { } impl StdError for JoinPathsError { + #[allow(deprecated)] fn description(&self) -> &str { "failed to join paths" } @@ -246,7 +247,7 @@ pub fn chdir(p: &path::Path) -> io::Result<()> { let mut p = p.encode_wide().collect::<Vec<_>>(); p.push(0); - cvt(unsafe { c::SetCurrentDirectoryW(p.as_ptr()) }).map(|_| ()) + cvt(unsafe { c::SetCurrentDirectoryW(p.as_ptr()) }).map(drop) } pub fn getenv(k: &OsStr) -> io::Result<Option<OsString>> { @@ -271,12 +272,12 @@ pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> { let k = to_u16s(k)?; let v = to_u16s(v)?; - cvt(unsafe { c::SetEnvironmentVariableW(k.as_ptr(), v.as_ptr()) }).map(|_| ()) + cvt(unsafe { c::SetEnvironmentVariableW(k.as_ptr(), v.as_ptr()) }).map(drop) } pub fn unsetenv(n: &OsStr) -> io::Result<()> { let v = to_u16s(n)?; - cvt(unsafe { c::SetEnvironmentVariableW(v.as_ptr(), ptr::null()) }).map(|_| ()) + cvt(unsafe { c::SetEnvironmentVariableW(v.as_ptr(), ptr::null()) }).map(drop) } pub fn temp_dir() -> PathBuf { diff --git a/src/libstd/sys/windows/process.rs b/src/libstd/sys/windows/process.rs index 096b7bea8a..a62a637393 100644 --- a/src/libstd/sys/windows/process.rs +++ b/src/libstd/sys/windows/process.rs @@ -1,9 +1,10 @@ -#![unstable(feature = "process_internals", issue = "0")] +#![unstable(feature = "process_internals", issue = "none")] +use crate::borrow::Borrow; use crate::collections::BTreeMap; -use crate::env::split_paths; use crate::env; -use crate::ffi::{OsString, OsStr}; +use crate::env::split_paths; +use crate::ffi::{OsStr, OsString}; use crate::fmt; use crate::fs; use crate::io::{self, Error, ErrorKind}; @@ -11,18 +12,17 @@ use crate::mem; use crate::os::windows::ffi::OsStrExt; use crate::path::Path; use crate::ptr; -use crate::sys::mutex::Mutex; use crate::sys::c; -use crate::sys::fs::{OpenOptions, File}; +use crate::sys::cvt; +use crate::sys::fs::{File, OpenOptions}; use crate::sys::handle::Handle; +use crate::sys::mutex::Mutex; use crate::sys::pipe::{self, AnonPipe}; use crate::sys::stdio; -use crate::sys::cvt; -use crate::sys_common::{AsInner, FromInner, IntoInner}; use crate::sys_common::process::CommandEnv; -use crate::borrow::Borrow; +use crate::sys_common::{AsInner, FromInner, IntoInner}; -use libc::{c_void, EXIT_SUCCESS, EXIT_FAILURE}; +use libc::{c_void, EXIT_FAILURE, EXIT_SUCCESS}; //////////////////////////////////////////////////////////////////////////////// // Command @@ -41,18 +41,23 @@ impl From<OsString> for EnvKey { } impl From<EnvKey> for OsString { - fn from(k: EnvKey) -> Self { k.0 } + fn from(k: EnvKey) -> Self { + k.0 + } } impl Borrow<OsStr> for EnvKey { - fn borrow(&self) -> &OsStr { &self.0 } + fn borrow(&self) -> &OsStr { + &self.0 + } } impl AsRef<OsStr> for EnvKey { - fn as_ref(&self) -> &OsStr { &self.0 } + fn as_ref(&self) -> &OsStr { + &self.0 + } } - fn ensure_no_nuls<T: AsRef<OsStr>>(str: T) -> io::Result<T> { if str.as_ref().encode_wide().any(|b| b == 0) { Err(io::Error::new(ErrorKind::InvalidInput, "nul byte found in provided data")) @@ -127,8 +132,11 @@ impl Command { self.flags = flags; } - pub fn spawn(&mut self, default: Stdio, needs_stdin: bool) - -> io::Result<(Process, StdioPipes)> { + pub fn spawn( + &mut self, + default: Stdio, + needs_stdin: bool, + ) -> io::Result<(Process, StdioPipes)> { let maybe_env = self.env.capture_if_changed(); // To have the spawning semantics of unix/windows stay the same, we need // to read the *child's* PATH if one is provided. See #15149 for more @@ -138,10 +146,11 @@ impl Command { // Split the value and test each path to see if the // program exists. for path in split_paths(&v) { - let path = path.join(self.program.to_str().unwrap()) - .with_extension(env::consts::EXE_EXTENSION); + let path = path + .join(self.program.to_str().unwrap()) + .with_extension(env::consts::EXE_EXTENSION); if fs::metadata(&path).is_ok() { - return Some(path.into_os_string()) + return Some(path.into_os_string()); } } } @@ -178,32 +187,32 @@ impl Command { static CREATE_PROCESS_LOCK: Mutex = Mutex::new(); let _guard = DropGuard::new(&CREATE_PROCESS_LOCK); - let mut pipes = StdioPipes { - stdin: None, - stdout: None, - stderr: None, - }; + let mut pipes = StdioPipes { stdin: None, stdout: None, stderr: None }; let null = Stdio::Null; - let default_stdin = if needs_stdin {&default} else {&null}; + let default_stdin = if needs_stdin { &default } else { &null }; let stdin = self.stdin.as_ref().unwrap_or(default_stdin); let stdout = self.stdout.as_ref().unwrap_or(&default); let stderr = self.stderr.as_ref().unwrap_or(&default); let stdin = stdin.to_handle(c::STD_INPUT_HANDLE, &mut pipes.stdin)?; - let stdout = stdout.to_handle(c::STD_OUTPUT_HANDLE, - &mut pipes.stdout)?; - let stderr = stderr.to_handle(c::STD_ERROR_HANDLE, - &mut pipes.stderr)?; + let stdout = stdout.to_handle(c::STD_OUTPUT_HANDLE, &mut pipes.stdout)?; + let stderr = stderr.to_handle(c::STD_ERROR_HANDLE, &mut pipes.stderr)?; si.hStdInput = stdin.raw(); si.hStdOutput = stdout.raw(); si.hStdError = stderr.raw(); unsafe { - cvt(c::CreateProcessW(ptr::null(), - cmd_str.as_mut_ptr(), - ptr::null_mut(), - ptr::null_mut(), - c::TRUE, flags, envp, dirp, - &mut si, &mut pi)) + cvt(c::CreateProcessW( + ptr::null(), + cmd_str.as_mut_ptr(), + ptr::null_mut(), + ptr::null_mut(), + c::TRUE, + flags, + envp, + dirp, + &mut si, + &mut pi, + )) }?; // We close the thread handle because we don't care about keeping @@ -213,7 +222,6 @@ impl Command { Ok((Process { handle: Handle::new(pi.hProcess) }, pipes)) } - } impl fmt::Debug for Command { @@ -244,24 +252,20 @@ impl<'a> Drop for DropGuard<'a> { } impl Stdio { - fn to_handle(&self, stdio_id: c::DWORD, pipe: &mut Option<AnonPipe>) - -> io::Result<Handle> { + fn to_handle(&self, stdio_id: c::DWORD, pipe: &mut Option<AnonPipe>) -> io::Result<Handle> { match *self { // If no stdio handle is available, then inherit means that it // should still be unavailable so propagate the // INVALID_HANDLE_VALUE. - Stdio::Inherit => { - match stdio::get_handle(stdio_id) { - Ok(io) => { - let io = Handle::new(io); - let ret = io.duplicate(0, true, - c::DUPLICATE_SAME_ACCESS); - io.into_raw(); - ret - } - Err(..) => Ok(Handle::new(c::INVALID_HANDLE_VALUE)), + Stdio::Inherit => match stdio::get_handle(stdio_id) { + Ok(io) => { + let io = Handle::new(io); + let ret = io.duplicate(0, true, c::DUPLICATE_SAME_ACCESS); + io.into_raw(); + ret } - } + Err(..) => Ok(Handle::new(c::INVALID_HANDLE_VALUE)), + }, Stdio::MakePipe => { let ours_readable = stdio_id != c::STD_INPUT_HANDLE; @@ -270,9 +274,7 @@ impl Stdio { Ok(pipes.theirs.into_handle()) } - Stdio::Handle(ref handle) => { - handle.duplicate(0, true, c::DUPLICATE_SAME_ACCESS) - } + Stdio::Handle(ref handle) => handle.duplicate(0, true, c::DUPLICATE_SAME_ACCESS), // Open up a reference to NUL with appropriate read/write // permissions as well as the ability to be inherited to child @@ -288,9 +290,7 @@ impl Stdio { opts.read(stdio_id == c::STD_INPUT_HANDLE); opts.write(stdio_id != c::STD_INPUT_HANDLE); opts.security_attributes(&mut sa); - File::open(Path::new("NUL"), &opts).map(|file| { - file.into_handle() - }) + File::open(Path::new("NUL"), &opts).map(|file| file.into_handle()) } } } @@ -323,23 +323,19 @@ pub struct Process { impl Process { pub fn kill(&mut self) -> io::Result<()> { - cvt(unsafe { - c::TerminateProcess(self.handle.raw(), 1) - })?; + cvt(unsafe { c::TerminateProcess(self.handle.raw(), 1) })?; Ok(()) } pub fn id(&self) -> u32 { - unsafe { - c::GetProcessId(self.handle.raw()) as u32 - } + unsafe { c::GetProcessId(self.handle.raw()) as u32 } } pub fn wait(&mut self) -> io::Result<ExitStatus> { unsafe { let res = c::WaitForSingleObject(self.handle.raw(), c::INFINITE); if res != c::WAIT_OBJECT_0 { - return Err(Error::last_os_error()) + return Err(Error::last_os_error()); } let mut status = 0; cvt(c::GetExitCodeProcess(self.handle.raw(), &mut status))?; @@ -362,9 +358,13 @@ impl Process { } } - pub fn handle(&self) -> &Handle { &self.handle } + pub fn handle(&self) -> &Handle { + &self.handle + } - pub fn into_handle(self) -> Handle { self.handle } + pub fn into_handle(self) -> Handle { + self.handle + } } #[derive(PartialEq, Eq, Clone, Copy, Debug)] @@ -441,7 +441,7 @@ fn zeroed_process_information() -> c::PROCESS_INFORMATION { hProcess: ptr::null_mut(), hThread: ptr::null_mut(), dwProcessId: 0, - dwThreadId: 0 + dwThreadId: 0, } } @@ -466,7 +466,8 @@ fn make_command_line(prog: &OsStr, args: &[OsString]) -> io::Result<Vec<u16>> { // it will be dropped entirely when parsed on the other end. ensure_no_nuls(arg)?; let arg_bytes = &arg.as_inner().inner.as_inner(); - let quote = force_quotes || arg_bytes.iter().any(|c| *c == b' ' || *c == b'\t') + let quote = force_quotes + || arg_bytes.iter().any(|c| *c == b' ' || *c == b'\t') || arg_bytes.is_empty(); if quote { cmd.push('"' as u16); @@ -495,8 +496,7 @@ fn make_command_line(prog: &OsStr, args: &[OsString]) -> io::Result<Vec<u16>> { } } -fn make_envp(maybe_env: Option<BTreeMap<EnvKey, OsString>>) - -> io::Result<(*mut c_void, Vec<u16>)> { +fn make_envp(maybe_env: Option<BTreeMap<EnvKey, OsString>>) -> io::Result<(*mut c_void, Vec<u16>)> { // On Windows we pass an "environment block" which is not a char**, but // rather a concatenation of null-terminated k=v\0 sequences, with a final // \0 to terminate. @@ -517,37 +517,33 @@ fn make_envp(maybe_env: Option<BTreeMap<EnvKey, OsString>>) } fn make_dirp(d: Option<&OsString>) -> io::Result<(*const u16, Vec<u16>)> { - match d { Some(dir) => { let mut dir_str: Vec<u16> = ensure_no_nuls(dir)?.encode_wide().collect(); dir_str.push(0); Ok((dir_str.as_ptr(), dir_str)) - }, - None => Ok((ptr::null(), Vec::new())) + } + None => Ok((ptr::null(), Vec::new())), } } #[cfg(test)] mod tests { - use crate::ffi::{OsStr, OsString}; use super::make_command_line; + use crate::ffi::{OsStr, OsString}; #[test] fn test_make_command_line() { fn test_wrapper(prog: &str, args: &[&str]) -> String { - let command_line = &make_command_line(OsStr::new(prog), - &args.iter() - .map(|a| OsString::from(a)) - .collect::<Vec<OsString>>()) - .unwrap(); + let command_line = &make_command_line( + OsStr::new(prog), + &args.iter().map(|a| OsString::from(a)).collect::<Vec<OsString>>(), + ) + .unwrap(); String::from_utf16(command_line).unwrap() } - assert_eq!( - test_wrapper("prog", &["aaa", "bbb", "ccc"]), - "\"prog\" aaa bbb ccc" - ); + assert_eq!(test_wrapper("prog", &["aaa", "bbb", "ccc"]), "\"prog\" aaa bbb ccc"); assert_eq!( test_wrapper("C:\\Program Files\\blah\\blah.exe", &["aaa"]), @@ -557,10 +553,7 @@ mod tests { test_wrapper("C:\\Program Files\\test", &["aa\"bb"]), "\"C:\\Program Files\\test\" aa\\\"bb" ); - assert_eq!( - test_wrapper("echo", &["a b c"]), - "\"echo\" \"a b c\"" - ); + assert_eq!(test_wrapper("echo", &["a b c"]), "\"echo\" \"a b c\""); assert_eq!( test_wrapper("echo", &["\" \\\" \\", "\\"]), "\"echo\" \"\\\" \\\\\\\" \\\\\" \\" diff --git a/src/libstd/sys/windows/rwlock.rs b/src/libstd/sys/windows/rwlock.rs index ef57562fc3..a769326352 100644 --- a/src/libstd/sys/windows/rwlock.rs +++ b/src/libstd/sys/windows/rwlock.rs @@ -1,7 +1,9 @@ use crate::cell::UnsafeCell; use crate::sys::c; -pub struct RWLock { inner: UnsafeCell<c::SRWLOCK> } +pub struct RWLock { + inner: UnsafeCell<c::SRWLOCK>, +} unsafe impl Send for RWLock {} unsafe impl Sync for RWLock {} diff --git a/src/libstd/sys/windows/stdio.rs b/src/libstd/sys/windows/stdio.rs index f322c2b1d9..c84896296e 100644 --- a/src/libstd/sys/windows/stdio.rs +++ b/src/libstd/sys/windows/stdio.rs @@ -1,4 +1,4 @@ -#![unstable(issue = "0", feature = "windows_stdio")] +#![unstable(issue = "none", feature = "windows_stdio")] use crate::char::decode_utf16; use crate::cmp; diff --git a/src/libstd/sys/windows/stdio_uwp.rs b/src/libstd/sys/windows/stdio_uwp.rs index 0f2178f735..5bdabf6d4b 100644 --- a/src/libstd/sys/windows/stdio_uwp.rs +++ b/src/libstd/sys/windows/stdio_uwp.rs @@ -1,4 +1,4 @@ -#![unstable(issue = "0", feature = "windows_stdio")] +#![unstable(issue = "none", feature = "windows_stdio")] use crate::io; use crate::mem::ManuallyDrop; diff --git a/src/libstd/sys/windows/time.rs b/src/libstd/sys/windows/time.rs index bd533c93d4..86667ca7ab 100644 --- a/src/libstd/sys/windows/time.rs +++ b/src/libstd/sys/windows/time.rs @@ -1,9 +1,9 @@ use crate::cmp::Ordering; +use crate::convert::TryInto; use crate::fmt; use crate::mem; use crate::sys::c; use crate::time::Duration; -use crate::convert::TryInto; use core::hash::{Hash, Hasher}; @@ -53,8 +53,7 @@ impl Instant { // On windows there's a threshold below which we consider two timestamps // equivalent due to measurement error. For more details + doc link, // check the docs on epsilon. - let epsilon = - perf_counter::PerformanceCounterInstant::epsilon(); + let epsilon = perf_counter::PerformanceCounterInstant::epsilon(); if other.t > self.t && other.t - self.t <= epsilon { Some(Duration::new(0, 0)) } else { @@ -63,15 +62,11 @@ impl Instant { } pub fn checked_add_duration(&self, other: &Duration) -> Option<Instant> { - Some(Instant { - t: self.t.checked_add(*other)? - }) + Some(Instant { t: self.t.checked_add(*other)? }) } pub fn checked_sub_duration(&self, other: &Duration) -> Option<Instant> { - Some(Instant { - t: self.t.checked_sub(*other)? - }) + Some(Instant { t: self.t.checked_sub(*other)? }) } } @@ -89,7 +84,7 @@ impl SystemTime { t: c::FILETIME { dwLowDateTime: intervals as c::DWORD, dwHighDateTime: (intervals >> 32) as c::DWORD, - } + }, } } @@ -140,9 +135,7 @@ impl Ord for SystemTime { impl fmt::Debug for SystemTime { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("SystemTime") - .field("intervals", &self.intervals()) - .finish() + f.debug_struct("SystemTime").field("intervals", &self.intervals()).finish() } } @@ -153,7 +146,7 @@ impl From<c::FILETIME> for SystemTime { } impl Hash for SystemTime { - fn hash<H : Hasher>(&self, state: &mut H) { + fn hash<H: Hasher>(&self, state: &mut H) { self.intervals().hash(state) } } @@ -167,26 +160,23 @@ fn checked_dur2intervals(dur: &Duration) -> Option<i64> { } fn intervals2dur(intervals: u64) -> Duration { - Duration::new(intervals / INTERVALS_PER_SEC, - ((intervals % INTERVALS_PER_SEC) * 100) as u32) + Duration::new(intervals / INTERVALS_PER_SEC, ((intervals % INTERVALS_PER_SEC) * 100) as u32) } mod perf_counter { - use super::{NANOS_PER_SEC}; + use super::NANOS_PER_SEC; use crate::sync::atomic::{AtomicUsize, Ordering::SeqCst}; - use crate::sys_common::mul_div_u64; use crate::sys::c; use crate::sys::cvt; + use crate::sys_common::mul_div_u64; use crate::time::Duration; pub struct PerformanceCounterInstant { - ts: c::LARGE_INTEGER + ts: c::LARGE_INTEGER, } impl PerformanceCounterInstant { pub fn now() -> Self { - Self { - ts: query() - } + Self { ts: query() } } // Per microsoft docs, the margin of error for cross-thread time comparisons @@ -202,9 +192,7 @@ mod perf_counter { fn from(other: PerformanceCounterInstant) -> Self { let freq = frequency() as u64; let instant_nsec = mul_div_u64(other.ts as u64, NANOS_PER_SEC, freq); - Self { - t: Duration::from_nanos(instant_nsec) - } + Self { t: Duration::from_nanos(instant_nsec) } } } @@ -234,9 +222,7 @@ mod perf_counter { fn query() -> c::LARGE_INTEGER { let mut qpc_value: c::LARGE_INTEGER = 0; - cvt(unsafe { - c::QueryPerformanceCounter(&mut qpc_value) - }).unwrap(); + cvt(unsafe { c::QueryPerformanceCounter(&mut qpc_value) }).unwrap(); qpc_value } } diff --git a/src/libstd/sys_common/alloc.rs b/src/libstd/sys_common/alloc.rs index 713b9949f6..c669410078 100644 --- a/src/libstd/sys_common/alloc.rs +++ b/src/libstd/sys_common/alloc.rs @@ -22,7 +22,8 @@ pub const MIN_ALIGN: usize = 8; target_arch = "aarch64", target_arch = "mips64", target_arch = "s390x", - target_arch = "sparc64" + target_arch = "sparc64", + target_arch = "riscv64" )))] pub const MIN_ALIGN: usize = 16; diff --git a/src/libstd/sys_common/at_exit_imp.rs b/src/libstd/sys_common/at_exit_imp.rs index cdb72ee872..6b799db856 100644 --- a/src/libstd/sys_common/at_exit_imp.rs +++ b/src/libstd/sys_common/at_exit_imp.rs @@ -2,8 +2,8 @@ //! //! Documentation can be found on the `rt::at_exit` function. -use crate::ptr; use crate::mem; +use crate::ptr; use crate::sys_common::mutex::Mutex; type Queue = Vec<Box<dyn FnOnce()>>; @@ -31,7 +31,7 @@ unsafe fn init() -> bool { QUEUE = Box::into_raw(state); } else if QUEUE == DONE { // can't re-init after a cleanup - return false + return false; } true diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index d7296b43fb..191add2c31 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -1,10 +1,9 @@ +use crate::borrow::Cow; /// Common code for printing the backtrace in the same way across the different /// supported platforms. - use crate::env; use crate::fmt; use crate::io; -use crate::borrow::Cow; use crate::io::prelude::*; use crate::path::{self, Path, PathBuf}; use crate::sync::atomic::{self, Ordering}; @@ -57,9 +56,7 @@ unsafe fn _print(w: &mut dyn Write, format: PrintFmt) -> io::Result<()> { } impl fmt::Display for DisplayBacktrace { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - unsafe { - _print_fmt(fmt, self.format) - } + unsafe { _print_fmt(fmt, self.format) } } } write!(w, "{}", DisplayBacktrace { format }) @@ -68,11 +65,7 @@ unsafe fn _print(w: &mut dyn Write, format: PrintFmt) -> io::Result<()> { unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::Result { // Always 'fail' to get the cwd when running under Miri - // this allows Miri to display backtraces in isolation mode - let cwd = if !cfg!(miri) { - env::current_dir().ok() - } else { - None - }; + let cwd = if !cfg!(miri) { env::current_dir().ok() } else { None }; let mut print_path = move |fmt: &mut fmt::Formatter<'_>, bows: BytesOrWideString<'_>| { output_filename(fmt, bows, print_fmt, cwd.as_ref()) @@ -206,9 +199,7 @@ pub fn output_filename( Cow::Owned(crate::ffi::OsString::from_wide(wide).into()) } #[cfg(not(windows))] - BytesOrWideString::Wide(_wide) => { - Path::new("<unknown>").into() - } + BytesOrWideString::Wide(_wide) => Path::new("<unknown>").into(), }; if print_fmt == PrintFmt::Short && file.is_absolute() { if let Some(cwd) = cwd { diff --git a/src/libstd/sys_common/condvar.rs b/src/libstd/sys_common/condvar.rs index fc59c8356f..f9611bc6f7 100644 --- a/src/libstd/sys_common/condvar.rs +++ b/src/libstd/sys_common/condvar.rs @@ -1,6 +1,6 @@ -use crate::time::Duration; -use crate::sys_common::mutex::{self, Mutex}; use crate::sys::condvar as imp; +use crate::sys_common::mutex::{self, Mutex}; +use crate::time::Duration; /// An OS-based condition variable. /// @@ -15,22 +15,30 @@ impl Condvar { /// /// Behavior is undefined if the condition variable is moved after it is /// first used with any of the functions below. - pub const fn new() -> Condvar { Condvar(imp::Condvar::new()) } + pub const fn new() -> Condvar { + Condvar(imp::Condvar::new()) + } /// Prepares the condition variable for use. /// /// This should be called once the condition variable is at a stable memory /// address. #[inline] - pub unsafe fn init(&mut self) { self.0.init() } + pub unsafe fn init(&mut self) { + self.0.init() + } /// Signals one waiter on this condition variable to wake up. #[inline] - pub unsafe fn notify_one(&self) { self.0.notify_one() } + pub unsafe fn notify_one(&self) { + self.0.notify_one() + } /// Awakens all current waiters on this condition variable. #[inline] - pub unsafe fn notify_all(&self) { self.0.notify_all() } + pub unsafe fn notify_all(&self) { + self.0.notify_all() + } /// Waits for a signal on the specified mutex. /// @@ -38,7 +46,9 @@ impl Condvar { /// Behavior is also undefined if more than one mutex is used concurrently /// on this condition variable. #[inline] - pub unsafe fn wait(&self, mutex: &Mutex) { self.0.wait(mutex::raw(mutex)) } + pub unsafe fn wait(&self, mutex: &Mutex) { + self.0.wait(mutex::raw(mutex)) + } /// Waits for a signal on the specified mutex with a timeout duration /// specified by `dur` (a relative time into the future). @@ -56,5 +66,7 @@ impl Condvar { /// Behavior is undefined if there are current or will be future users of /// this condition variable. #[inline] - pub unsafe fn destroy(&self) { self.0.destroy() } + pub unsafe fn destroy(&self) { + self.0.destroy() + } } diff --git a/src/libstd/sys_common/mod.rs b/src/libstd/sys_common/mod.rs index 8912aed925..e03e0fc834 100644 --- a/src/libstd/sys_common/mod.rs +++ b/src/libstd/sys_common/mod.rs @@ -23,26 +23,32 @@ macro_rules! rtabort { } macro_rules! rtassert { - ($e:expr) => (if !$e { - rtabort!(concat!("assertion failed: ", stringify!($e))); - }) + ($e:expr) => { + if !$e { + rtabort!(concat!("assertion failed: ", stringify!($e))); + } + }; } #[allow(unused_macros)] // not used on all platforms macro_rules! rtunwrap { - ($ok:ident, $e:expr) => (match $e { - $ok(v) => v, - ref err => { - let err = err.as_ref().map(|_|()); // map Ok/Some which might not be Debug - rtabort!(concat!("unwrap failed: ", stringify!($e), " = {:?}"), err) - }, - }) + ($ok:ident, $e:expr) => { + match $e { + $ok(v) => v, + ref err => { + let err = err.as_ref().map(drop); // map Ok/Some which might not be Debug + rtabort!(concat!("unwrap failed: ", stringify!($e), " = {:?}"), err) + } + } + }; } pub mod alloc; pub mod at_exit_imp; pub mod backtrace; +pub mod bytestring; pub mod condvar; +pub mod fs; pub mod io; pub mod mutex; #[cfg(any(doc, // see `mod os`, docs are generated for multiple platforms @@ -54,6 +60,7 @@ pub mod mutex; all(target_vendor = "fortanix", target_env = "sgx")))] pub mod os_str_bytes; pub mod poison; +pub mod process; pub mod remutex; pub mod rwlock; pub mod thread; @@ -61,9 +68,6 @@ pub mod thread_info; pub mod thread_local; pub mod util; pub mod wtf8; -pub mod bytestring; -pub mod process; -pub mod fs; cfg_if::cfg_if! { if #[cfg(any(target_os = "cloudabi", @@ -114,7 +118,7 @@ pub trait FromInner<Inner> { /// that the closure could not be registered, meaning that it is not scheduled /// to be run. pub fn at_exit<F: FnOnce() + Send + 'static>(f: F) -> Result<(), ()> { - if at_exit_imp::push(Box::new(f)) {Ok(())} else {Err(())} + if at_exit_imp::push(Box::new(f)) { Ok(()) } else { Err(()) } } /// One-time runtime cleanup. @@ -142,6 +146,5 @@ pub fn mul_div_u64(value: u64, numer: u64, denom: u64) -> u64 { #[test] fn test_muldiv() { - assert_eq!(mul_div_u64( 1_000_000_000_001, 1_000_000_000, 1_000_000), - 1_000_000_000_001_000); + assert_eq!(mul_div_u64(1_000_000_000_001, 1_000_000_000, 1_000_000), 1_000_000_000_001_000); } diff --git a/src/libstd/sys_common/mutex.rs b/src/libstd/sys_common/mutex.rs index 28d85949ff..899fc6a723 100644 --- a/src/libstd/sys_common/mutex.rs +++ b/src/libstd/sys_common/mutex.rs @@ -17,7 +17,9 @@ impl Mutex { /// Also, until `init` is called, behavior is undefined if this /// mutex is ever used reentrantly, i.e., `raw_lock` or `try_lock` /// are called by the thread currently holding the lock. - pub const fn new() -> Mutex { Mutex(imp::Mutex::new()) } + pub const fn new() -> Mutex { + Mutex(imp::Mutex::new()) + } /// Prepare the mutex for use. /// @@ -26,14 +28,18 @@ impl Mutex { /// Calling it in parallel with or after any operation (including another /// `init()`) is undefined behavior. #[inline] - pub unsafe fn init(&mut self) { self.0.init() } + pub unsafe fn init(&mut self) { + self.0.init() + } /// Locks the mutex blocking the current thread until it is available. /// /// Behavior is undefined if the mutex has been moved between this and any /// previous function call. #[inline] - pub unsafe fn raw_lock(&self) { self.0.lock() } + pub unsafe fn raw_lock(&self) { + self.0.lock() + } /// Calls raw_lock() and then returns an RAII guard to guarantee the mutex /// will be unlocked. @@ -49,7 +55,9 @@ impl Mutex { /// Behavior is undefined if the mutex has been moved between this and any /// previous function call. #[inline] - pub unsafe fn try_lock(&self) -> bool { self.0.try_lock() } + pub unsafe fn try_lock(&self) -> bool { + self.0.try_lock() + } /// Unlocks the mutex. /// @@ -59,18 +67,24 @@ impl Mutex { /// Consider switching from the pair of raw_lock() and raw_unlock() to /// lock() whenever possible. #[inline] - pub unsafe fn raw_unlock(&self) { self.0.unlock() } + pub unsafe fn raw_unlock(&self) { + self.0.unlock() + } /// Deallocates all resources associated with this mutex. /// /// Behavior is undefined if there are current or will be future users of /// this mutex. #[inline] - pub unsafe fn destroy(&self) { self.0.destroy() } + pub unsafe fn destroy(&self) { + self.0.destroy() + } } // not meant to be exported to the outside world, just the containing module -pub fn raw(mutex: &Mutex) -> &imp::Mutex { &mutex.0 } +pub fn raw(mutex: &Mutex) -> &imp::Mutex { + &mutex.0 +} #[must_use] /// A simple RAII utility for the above Mutex without the poisoning semantics. @@ -79,6 +93,8 @@ pub struct MutexGuard<'a>(&'a imp::Mutex); impl Drop for MutexGuard<'_> { #[inline] fn drop(&mut self) { - unsafe { self.0.unlock(); } + unsafe { + self.0.unlock(); + } } } diff --git a/src/libstd/sys_common/net.rs b/src/libstd/sys_common/net.rs index 9d40d9f0af..135e8308af 100644 --- a/src/libstd/sys_common/net.rs +++ b/src/libstd/sys_common/net.rs @@ -13,75 +13,43 @@ use crate::time::Duration; use libc::{c_int, c_void}; -#[cfg(not(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "openbsd", - target_os = "netbsd", - target_os = "solaris", - target_os = "haiku", - target_os = "l4re" -)))] -use crate::sys::net::netc::IPV6_ADD_MEMBERSHIP; -#[cfg(not(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "openbsd", - target_os = "netbsd", - target_os = "solaris", - target_os = "haiku", - target_os = "l4re" -)))] -use crate::sys::net::netc::IPV6_DROP_MEMBERSHIP; -#[cfg(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "openbsd", - target_os = "netbsd", - target_os = "solaris", - target_os = "haiku", - target_os = "l4re" -))] -use crate::sys::net::netc::IPV6_JOIN_GROUP as IPV6_ADD_MEMBERSHIP; -#[cfg(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "openbsd", - target_os = "netbsd", - target_os = "solaris", - target_os = "haiku", - target_os = "l4re" -))] -use crate::sys::net::netc::IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP; - -#[cfg(any( - target_os = "linux", - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "openbsd", - target_os = "netbsd", - target_os = "haiku" -))] -use libc::MSG_NOSIGNAL; -#[cfg(not(any( - target_os = "linux", - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "openbsd", - target_os = "netbsd", - target_os = "haiku" -)))] -const MSG_NOSIGNAL: c_int = 0x0; +cfg_if::cfg_if! { + if #[cfg(any( + target_os = "dragonfly", target_os = "freebsd", + target_os = "ios", target_os = "macos", + target_os = "openbsd", target_os = "netbsd", + target_os = "solaris", target_os = "haiku", target_os = "l4re"))] { + use crate::sys::net::netc::IPV6_JOIN_GROUP as IPV6_ADD_MEMBERSHIP; + use crate::sys::net::netc::IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP; + } else { + use crate::sys::net::netc::IPV6_ADD_MEMBERSHIP; + use crate::sys::net::netc::IPV6_DROP_MEMBERSHIP; + } +} + +cfg_if::cfg_if! { + if #[cfg(any( + target_os = "linux", target_os = "android", + target_os = "dragonfly", target_os = "freebsd", + target_os = "openbsd", target_os = "netbsd", + target_os = "haiku"))] { + use libc::MSG_NOSIGNAL; + } else { + const MSG_NOSIGNAL: c_int = 0x0; + } +} + +cfg_if::cfg_if! { + if #[cfg(any( + target_os = "dragonfly", target_os = "freebsd", + target_os = "openbsd", target_os = "netbsd", + target_os = "solaris"))] { + use libc::c_uchar; + type IpV4MultiCastType = c_uchar; + } else { + type IpV4MultiCastType = c_int; + } +} //////////////////////////////////////////////////////////////////////////////// // sockaddr and misc bindings @@ -566,20 +534,30 @@ impl UdpSocket { } pub fn set_multicast_loop_v4(&self, multicast_loop_v4: bool) -> io::Result<()> { - setsockopt(&self.inner, c::IPPROTO_IP, c::IP_MULTICAST_LOOP, multicast_loop_v4 as c_int) + setsockopt( + &self.inner, + c::IPPROTO_IP, + c::IP_MULTICAST_LOOP, + multicast_loop_v4 as IpV4MultiCastType, + ) } pub fn multicast_loop_v4(&self) -> io::Result<bool> { - let raw: c_int = getsockopt(&self.inner, c::IPPROTO_IP, c::IP_MULTICAST_LOOP)?; + let raw: IpV4MultiCastType = getsockopt(&self.inner, c::IPPROTO_IP, c::IP_MULTICAST_LOOP)?; Ok(raw != 0) } pub fn set_multicast_ttl_v4(&self, multicast_ttl_v4: u32) -> io::Result<()> { - setsockopt(&self.inner, c::IPPROTO_IP, c::IP_MULTICAST_TTL, multicast_ttl_v4 as c_int) + setsockopt( + &self.inner, + c::IPPROTO_IP, + c::IP_MULTICAST_TTL, + multicast_ttl_v4 as IpV4MultiCastType, + ) } pub fn multicast_ttl_v4(&self) -> io::Result<u32> { - let raw: c_int = getsockopt(&self.inner, c::IPPROTO_IP, c::IP_MULTICAST_TTL)?; + let raw: IpV4MultiCastType = getsockopt(&self.inner, c::IPPROTO_IP, c::IP_MULTICAST_TTL)?; Ok(raw as u32) } @@ -659,7 +637,7 @@ impl UdpSocket { pub fn connect(&self, addr: io::Result<&SocketAddr>) -> io::Result<()> { let (addrp, len) = addr?.into_inner(); - cvt_r(|| unsafe { c::connect(*self.inner.as_inner(), addrp, len) }).map(|_| ()) + cvt_r(|| unsafe { c::connect(*self.inner.as_inner(), addrp, len) }).map(drop) } } diff --git a/src/libstd/sys_common/os_str_bytes.rs b/src/libstd/sys_common/os_str_bytes.rs index eb8a881ec8..e965ea79aa 100644 --- a/src/libstd/sys_common/os_str_bytes.rs +++ b/src/libstd/sys_common/os_str_bytes.rs @@ -104,6 +104,7 @@ impl Buf { self.inner.shrink_to(min_capacity) } + #[inline] pub fn as_slice(&self) -> &Slice { unsafe { mem::transmute(&*self.inner) } } diff --git a/src/libstd/sys_common/poison.rs b/src/libstd/sys_common/poison.rs index 0157b95299..285851d631 100644 --- a/src/libstd/sys_common/poison.rs +++ b/src/libstd/sys_common/poison.rs @@ -148,6 +148,7 @@ impl<T> fmt::Display for PoisonError<T> { #[stable(feature = "rust1", since = "1.0.0")] impl<T> Error for PoisonError<T> { + #[allow(deprecated)] fn description(&self) -> &str { "poisoned lock: another task failed inside" } @@ -239,6 +240,7 @@ impl<T> fmt::Display for TryLockError<T> { #[stable(feature = "rust1", since = "1.0.0")] impl<T> Error for TryLockError<T> { + #[allow(deprecated, deprecated_in_future)] fn description(&self) -> &str { match *self { TryLockError::Poisoned(ref p) => p.description(), @@ -246,6 +248,7 @@ impl<T> Error for TryLockError<T> { } } + #[allow(deprecated)] fn cause(&self) -> Option<&dyn Error> { match *self { TryLockError::Poisoned(ref p) => Some(p), diff --git a/src/libstd/sys_common/process.rs b/src/libstd/sys_common/process.rs index 55b421794c..042641852b 100644 --- a/src/libstd/sys_common/process.rs +++ b/src/libstd/sys_common/process.rs @@ -1,5 +1,5 @@ #![allow(dead_code)] -#![unstable(feature = "process_internals", issue = "0")] +#![unstable(feature = "process_internals", issue = "none")] use crate::collections::BTreeMap; use crate::env; diff --git a/src/libstd/sys_common/remutex.rs b/src/libstd/sys_common/remutex.rs index f08b13c4aa..a1ad44a366 100644 --- a/src/libstd/sys_common/remutex.rs +++ b/src/libstd/sys_common/remutex.rs @@ -1,9 +1,9 @@ use crate::fmt; use crate::marker; use crate::ops::Deref; -use crate::sys_common::poison::{self, TryLockError, TryLockResult, LockResult}; +use crate::panic::{RefUnwindSafe, UnwindSafe}; use crate::sys::mutex as sys; -use crate::panic::{UnwindSafe, RefUnwindSafe}; +use crate::sys_common::poison::{self, LockResult, TryLockError, TryLockResult}; /// A re-entrant mutual exclusion /// @@ -22,7 +22,6 @@ unsafe impl<T: Send> Sync for ReentrantMutex<T> {} impl<T> UnwindSafe for ReentrantMutex<T> {} impl<T> RefUnwindSafe for ReentrantMutex<T> {} - /// An RAII implementation of a "scoped lock" of a mutex. When this structure is /// dropped (falls out of scope), the lock will be unlocked. /// @@ -45,7 +44,6 @@ pub struct ReentrantMutexGuard<'a, T: 'a> { impl<T> !marker::Send for ReentrantMutexGuard<'_, T> {} - impl<T> ReentrantMutex<T> { /// Creates a new reentrant mutex in an unlocked state. pub fn new(t: T) -> ReentrantMutex<T> { @@ -113,7 +111,7 @@ impl<T: fmt::Debug + 'static> fmt::Debug for ReentrantMutex<T> { Ok(guard) => f.debug_struct("ReentrantMutex").field("data", &*guard).finish(), Err(TryLockError::Poisoned(err)) => { f.debug_struct("ReentrantMutex").field("data", &**err.get_ref()).finish() - }, + } Err(TryLockError::WouldBlock) => { struct LockedPlaceholder; impl fmt::Debug for LockedPlaceholder { @@ -129,13 +127,10 @@ impl<T: fmt::Debug + 'static> fmt::Debug for ReentrantMutex<T> { } impl<'mutex, T> ReentrantMutexGuard<'mutex, T> { - fn new(lock: &'mutex ReentrantMutex<T>) - -> LockResult<ReentrantMutexGuard<'mutex, T>> { - poison::map_result(lock.poison.borrow(), |guard| { - ReentrantMutexGuard { - __lock: lock, - __poison: guard, - } + fn new(lock: &'mutex ReentrantMutex<T>) -> LockResult<ReentrantMutexGuard<'mutex, T>> { + poison::map_result(lock.poison.borrow(), |guard| ReentrantMutexGuard { + __lock: lock, + __poison: guard, }) } } @@ -158,12 +153,11 @@ impl<T> Drop for ReentrantMutexGuard<'_, T> { } } - #[cfg(all(test, not(target_os = "emscripten")))] mod tests { - use crate::sys_common::remutex::{ReentrantMutex, ReentrantMutexGuard}; use crate::cell::RefCell; use crate::sync::Arc; + use crate::sys_common::remutex::{ReentrantMutex, ReentrantMutexGuard}; use crate::thread; #[test] @@ -209,7 +203,9 @@ mod tests { thread::spawn(move || { let lock = m2.try_lock(); assert!(lock.is_err()); - }).join().unwrap(); + }) + .join() + .unwrap(); let _lock3 = m.try_lock().unwrap(); } @@ -224,14 +220,15 @@ mod tests { fn poison_works() { let m = Arc::new(ReentrantMutex::new(RefCell::new(0))); let mc = m.clone(); - let result = thread::spawn(move ||{ + let result = thread::spawn(move || { let lock = mc.lock().unwrap(); *lock.borrow_mut() = 1; let lock2 = mc.lock().unwrap(); *lock.borrow_mut() = 2; let _answer = Answer(lock2); panic!("What the answer to my lifetimes dilemma is?"); - }).join(); + }) + .join(); assert!(result.is_err()); let r = m.lock().err().unwrap().into_inner(); assert_eq!(*r.borrow(), 42); diff --git a/src/libstd/sys_common/rwlock.rs b/src/libstd/sys_common/rwlock.rs index 0b1a092de5..3705d641a1 100644 --- a/src/libstd/sys_common/rwlock.rs +++ b/src/libstd/sys_common/rwlock.rs @@ -12,7 +12,9 @@ impl RWLock { /// /// Behavior is undefined if the reader-writer lock is moved after it is /// first used with any of the functions below. - pub const fn new() -> RWLock { RWLock(imp::RWLock::new()) } + pub const fn new() -> RWLock { + RWLock(imp::RWLock::new()) + } /// Acquires shared access to the underlying lock, blocking the current /// thread to do so. @@ -20,7 +22,9 @@ impl RWLock { /// Behavior is undefined if the rwlock has been moved between this and any /// previous method call. #[inline] - pub unsafe fn read(&self) { self.0.read() } + pub unsafe fn read(&self) { + self.0.read() + } /// Attempts to acquire shared access to this lock, returning whether it /// succeeded or not. @@ -30,7 +34,9 @@ impl RWLock { /// Behavior is undefined if the rwlock has been moved between this and any /// previous method call. #[inline] - pub unsafe fn try_read(&self) -> bool { self.0.try_read() } + pub unsafe fn try_read(&self) -> bool { + self.0.try_read() + } /// Acquires write access to the underlying lock, blocking the current thread /// to do so. @@ -38,7 +44,9 @@ impl RWLock { /// Behavior is undefined if the rwlock has been moved between this and any /// previous method call. #[inline] - pub unsafe fn write(&self) { self.0.write() } + pub unsafe fn write(&self) { + self.0.write() + } /// Attempts to acquire exclusive access to this lock, returning whether it /// succeeded or not. @@ -48,25 +56,33 @@ impl RWLock { /// Behavior is undefined if the rwlock has been moved between this and any /// previous method call. #[inline] - pub unsafe fn try_write(&self) -> bool { self.0.try_write() } + pub unsafe fn try_write(&self) -> bool { + self.0.try_write() + } /// Unlocks previously acquired shared access to this lock. /// /// Behavior is undefined if the current thread does not have shared access. #[inline] - pub unsafe fn read_unlock(&self) { self.0.read_unlock() } + pub unsafe fn read_unlock(&self) { + self.0.read_unlock() + } /// Unlocks previously acquired exclusive access to this lock. /// /// Behavior is undefined if the current thread does not currently have /// exclusive access. #[inline] - pub unsafe fn write_unlock(&self) { self.0.write_unlock() } + pub unsafe fn write_unlock(&self) { + self.0.write_unlock() + } /// Destroys OS-related resources with this RWLock. /// /// Behavior is undefined if there are any currently active users of this /// lock. #[inline] - pub unsafe fn destroy(&self) { self.0.destroy() } + pub unsafe fn destroy(&self) { + self.0.destroy() + } } diff --git a/src/libstd/sys_common/thread_local.rs b/src/libstd/sys_common/thread_local.rs index bdf79002e9..756b8d044a 100644 --- a/src/libstd/sys_common/thread_local.rs +++ b/src/libstd/sys_common/thread_local.rs @@ -45,7 +45,7 @@ //! ``` #![allow(non_camel_case_types)] -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] #![allow(dead_code)] // sys isn't exported yet use crate::ptr; @@ -81,7 +81,7 @@ pub struct StaticKey { /// /// See `Key::new` for information about when the destructor runs and how /// it runs. - dtor: Option<unsafe extern fn(*mut u8)>, + dtor: Option<unsafe extern "C" fn(*mut u8)>, } /// A type for a safely managed OS-based TLS slot. @@ -115,11 +115,8 @@ pub struct Key { pub const INIT: StaticKey = StaticKey::new(None); impl StaticKey { - pub const fn new(dtor: Option<unsafe extern fn(*mut u8)>) -> StaticKey { - StaticKey { - key: atomic::AtomicUsize::new(0), - dtor, - } + pub const fn new(dtor: Option<unsafe extern "C" fn(*mut u8)>) -> StaticKey { + StaticKey { key: atomic::AtomicUsize::new(0), dtor } } /// Gets the value associated with this TLS key @@ -127,20 +124,24 @@ impl StaticKey { /// This will lazily allocate a TLS key from the OS if one has not already /// been allocated. #[inline] - pub unsafe fn get(&self) -> *mut u8 { imp::get(self.key()) } + pub unsafe fn get(&self) -> *mut u8 { + imp::get(self.key()) + } /// Sets this TLS key to a new value. /// /// This will lazily allocate a TLS key from the OS if one has not already /// been allocated. #[inline] - pub unsafe fn set(&self, val: *mut u8) { imp::set(self.key(), val) } + pub unsafe fn set(&self, val: *mut u8) { + imp::set(self.key(), val) + } #[inline] unsafe fn key(&self) -> imp::Key { match self.key.load(Ordering::Relaxed) { 0 => self.lazy_init() as imp::Key, - n => n as imp::Key + n => n as imp::Key, } } @@ -161,7 +162,7 @@ impl StaticKey { self.key.store(key, Ordering::SeqCst); } rtassert!(key != 0); - return key + return key; } // POSIX allows the key created here to be 0, but the compare_and_swap @@ -186,7 +187,10 @@ impl StaticKey { // The CAS succeeded, so we've created the actual key 0 => key as usize, // If someone beat us to the punch, use their key instead - n => { imp::destroy(key); n } + n => { + imp::destroy(key); + n + } } } } @@ -204,7 +208,7 @@ impl Key { /// Note that the destructor will not be run when the `Key` goes out of /// scope. #[inline] - pub fn new(dtor: Option<unsafe extern fn(*mut u8)>) -> Key { + pub fn new(dtor: Option<unsafe extern "C" fn(*mut u8)>) -> Key { Key { key: unsafe { imp::create(dtor) } } } @@ -229,8 +233,7 @@ impl Drop for Key { } } -pub unsafe fn register_dtor_fallback(t: *mut u8, - dtor: unsafe extern fn(*mut u8)) { +pub unsafe fn register_dtor_fallback(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) { // The fallback implementation uses a vanilla OS-based TLS key to track // the list of destructors that need to be run for this thread. The key // then has its own destructor which runs all the other destructors. @@ -242,7 +245,7 @@ pub unsafe fn register_dtor_fallback(t: *mut u8, // flagged for destruction. static DTORS: StaticKey = StaticKey::new(Some(run_dtors)); - type List = Vec<(*mut u8, unsafe extern fn(*mut u8))>; + type List = Vec<(*mut u8, unsafe extern "C" fn(*mut u8))>; if DTORS.get().is_null() { let v: Box<List> = box Vec::new(); DTORS.set(Box::into_raw(v) as *mut u8); @@ -250,7 +253,7 @@ pub unsafe fn register_dtor_fallback(t: *mut u8, let list: &mut List = &mut *(DTORS.get() as *mut List); list.push((t, dtor)); - unsafe extern fn run_dtors(mut ptr: *mut u8) { + unsafe extern "C" fn run_dtors(mut ptr: *mut u8) { while !ptr.is_null() { let list: Box<List> = Box::from_raw(ptr as *mut List); for (ptr, dtor) in list.into_iter() { diff --git a/src/libstd/tests/run-time-detect.rs b/src/libstd/tests/run-time-detect.rs index eacce1e568..e39cc1eed5 100644 --- a/src/libstd/tests/run-time-detect.rs +++ b/src/libstd/tests/run-time-detect.rs @@ -11,18 +11,14 @@ )] #[test] -#[cfg(all(target_arch = "arm", - any(target_os = "linux", target_os = "android")))] +#[cfg(all(target_arch = "arm", any(target_os = "linux", target_os = "android")))] fn arm_linux() { println!("neon: {}", is_arm_feature_detected!("neon")); println!("pmull: {}", is_arm_feature_detected!("pmull")); } #[test] -#[cfg(all( - target_arch = "aarch64", - any(target_os = "linux", target_os = "android") -))] +#[cfg(all(target_arch = "aarch64", any(target_os = "linux", target_os = "android")))] fn aarch64_linux() { println!("fp: {}", is_aarch64_feature_detected!("fp")); println!("fp16: {}", is_aarch64_feature_detected!("fp16")); @@ -81,10 +77,7 @@ fn x86_all() { println!("avx512vl {:?}", is_x86_feature_detected!("avx512vl")); println!("avx512_ifma {:?}", is_x86_feature_detected!("avx512ifma")); println!("avx512_vbmi {:?}", is_x86_feature_detected!("avx512vbmi")); - println!( - "avx512_vpopcntdq {:?}", - is_x86_feature_detected!("avx512vpopcntdq") - ); + println!("avx512_vpopcntdq {:?}", is_x86_feature_detected!("avx512vpopcntdq")); println!("fma: {:?}", is_x86_feature_detected!("fma")); println!("bmi1: {:?}", is_x86_feature_detected!("bmi1")); println!("bmi2: {:?}", is_x86_feature_detected!("bmi2")); diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs index 9c530e7b32..1dd942e252 100644 --- a/src/libstd/thread/local.rs +++ b/src/libstd/thread/local.rs @@ -1,6 +1,6 @@ //! Thread local storage -#![unstable(feature = "thread_local_internals", issue = "0")] +#![unstable(feature = "thread_local_internals", issue = "none")] use crate::error::Error; use crate::fmt; @@ -142,7 +142,7 @@ macro_rules! thread_local { } #[doc(hidden)] -#[unstable(feature = "thread_local_internals", reason = "should not be necessary", issue = "0")] +#[unstable(feature = "thread_local_internals", reason = "should not be necessary", issue = "none")] #[macro_export] #[allow_internal_unstable(thread_local_internals, cfg_target_thread_local, thread_local)] #[allow_internal_unsafe] @@ -215,7 +215,7 @@ impl<T: 'static> LocalKey<T> { #[unstable( feature = "thread_local_internals", reason = "recently added to create a key", - issue = "0" + issue = "none" )] pub const unsafe fn new(inner: unsafe fn() -> Option<&'static T>) -> LocalKey<T> { LocalKey { inner } diff --git a/src/libstd/thread/mod.rs b/src/libstd/thread/mod.rs index 0c632d2afb..0dc43c7e65 100644 --- a/src/libstd/thread/mod.rs +++ b/src/libstd/thread/mod.rs @@ -166,13 +166,13 @@ use crate::num::NonZeroU64; use crate::panic; use crate::panicking; use crate::str; -use crate::sync::{Mutex, Condvar, Arc}; use crate::sync::atomic::AtomicUsize; use crate::sync::atomic::Ordering::SeqCst; +use crate::sync::{Arc, Condvar, Mutex}; use crate::sys::thread as imp; use crate::sys_common::mutex; -use crate::sys_common::thread_info; use crate::sys_common::thread; +use crate::sys_common::thread_info; use crate::sys_common::{AsInner, IntoInner}; use crate::time::Duration; @@ -180,10 +180,11 @@ use crate::time::Duration; // Thread-local storage //////////////////////////////////////////////////////////////////////////////// -#[macro_use] mod local; +#[macro_use] +mod local; #[stable(feature = "rust1", since = "1.0.0")] -pub use self::local::{LocalKey, AccessError}; +pub use self::local::{AccessError, LocalKey}; // The types used by the thread_local! macro to access TLS keys. Note that there // are two types, the "OS" type and the "fast" type. The OS thread local key @@ -194,14 +195,17 @@ pub use self::local::{LocalKey, AccessError}; // where fast TLS was not available; end-user code is compiled with fast TLS // where available, but both are needed. -#[unstable(feature = "libstd_thread_internals", issue = "0")] -#[cfg(all(target_arch = "wasm32", not(target_feature = "atomics")))] -#[doc(hidden)] pub use self::local::statik::Key as __StaticLocalKeyInner; -#[unstable(feature = "libstd_thread_internals", issue = "0")] +#[unstable(feature = "libstd_thread_internals", issue = "none")] #[cfg(target_thread_local)] -#[doc(hidden)] pub use self::local::fast::Key as __FastLocalKeyInner; -#[unstable(feature = "libstd_thread_internals", issue = "0")] -#[doc(hidden)] pub use self::local::os::Key as __OsLocalKeyInner; +#[doc(hidden)] +pub use self::local::fast::Key as __FastLocalKeyInner; +#[unstable(feature = "libstd_thread_internals", issue = "none")] +#[doc(hidden)] +pub use self::local::os::Key as __OsLocalKeyInner; +#[unstable(feature = "libstd_thread_internals", issue = "none")] +#[cfg(all(target_arch = "wasm32", not(target_feature = "atomics")))] +#[doc(hidden)] +pub use self::local::statik::Key as __StaticLocalKeyInner; //////////////////////////////////////////////////////////////////////////////// // Builder @@ -279,10 +283,7 @@ impl Builder { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn new() -> Builder { - Builder { - name: None, - stack_size: None, - } + Builder { name: None, stack_size: None } } /// Names the thread-to-be. Currently the name is used for identification @@ -376,8 +377,11 @@ impl Builder { /// handler.join().unwrap(); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn spawn<F, T>(self, f: F) -> io::Result<JoinHandle<T>> where - F: FnOnce() -> T, F: Send + 'static, T: Send + 'static + pub fn spawn<F, T>(self, f: F) -> io::Result<JoinHandle<T>> + where + F: FnOnce() -> T, + F: Send + 'static, + T: Send + 'static, { unsafe { self.spawn_unchecked(f) } } @@ -445,8 +449,11 @@ impl Builder { /// [`JoinHandle`]: ../../std/thread/struct.JoinHandle.html /// [`JoinHandle::join`]: ../../std/thread/struct.JoinHandle.html#method.join #[unstable(feature = "thread_spawn_unchecked", issue = "55132")] - pub unsafe fn spawn_unchecked<'a, F, T>(self, f: F) -> io::Result<JoinHandle<T>> where - F: FnOnce() -> T, F: Send + 'a, T: Send + 'a + pub unsafe fn spawn_unchecked<'a, F, T>(self, f: F) -> io::Result<JoinHandle<T>> + where + F: FnOnce() -> T, + F: Send + 'a, + T: Send + 'a, { let Builder { name, stack_size } = self; @@ -455,8 +462,7 @@ impl Builder { let my_thread = Thread::new(name); let their_thread = my_thread.clone(); - let my_packet : Arc<UnsafeCell<Option<Result<T>>>> - = Arc::new(UnsafeCell::new(None)); + let my_packet: Arc<UnsafeCell<Option<Result<T>>>> = Arc::new(UnsafeCell::new(None)); let their_packet = my_packet.clone(); let main = move || { @@ -604,8 +610,11 @@ impl Builder { /// [`Send`]: ../../std/marker/trait.Send.html /// [`Sync`]: ../../std/marker/trait.Sync.html #[stable(feature = "rust1", since = "1.0.0")] -pub fn spawn<F, T>(f: F) -> JoinHandle<T> where - F: FnOnce() -> T, F: Send + 'static, T: Send + 'static +pub fn spawn<F, T>(f: F) -> JoinHandle<T> +where + F: FnOnce() -> T, + F: Send + 'static, + T: Send + 'static, { Builder::new().spawn(f).expect("failed to spawn thread") } @@ -631,9 +640,11 @@ pub fn spawn<F, T>(f: F) -> JoinHandle<T> where /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn current() -> Thread { - thread_info::current_thread().expect("use of std::thread::current() is not \ + thread_info::current_thread().expect( + "use of std::thread::current() is not \ possible after the thread's local \ - data has been destroyed") + data has been destroyed", + ) } /// Cooperatively gives up a timeslice to the OS scheduler. @@ -884,7 +895,7 @@ pub fn park() { // If we were previously notified then we consume this notification and // return quickly. if thread.inner.state.compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst).is_ok() { - return + return; } // Otherwise we need to coordinate going to sleep @@ -908,7 +919,7 @@ pub fn park() { m = thread.inner.cvar.wait(m).unwrap(); match thread.inner.state.compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst) { Ok(_) => return, // got a notification - Err(_) => {} // spurious wakeup, go back to sleep + Err(_) => {} // spurious wakeup, go back to sleep } } } @@ -982,7 +993,7 @@ pub fn park_timeout(dur: Duration) { // afterwards we start coordinating for a sleep. // return quickly. if thread.inner.state.compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst).is_ok() { - return + return; } let m = thread.inner.lock.lock().unwrap(); match thread.inner.state.compare_exchange(EMPTY, PARKED, SeqCst, SeqCst) { @@ -1003,7 +1014,7 @@ pub fn park_timeout(dur: Duration) { let (_m, _result) = thread.inner.cvar.wait_timeout(m, dur).unwrap(); match thread.inner.state.swap(EMPTY, SeqCst) { NOTIFIED => {} // got a notification, hurray! - PARKED => {} // no notification, alas + PARKED => {} // no notification, alas n => panic!("inconsistent park_timeout state: {}", n), } } @@ -1061,6 +1072,19 @@ impl ThreadId { ThreadId(NonZeroU64::new(id).unwrap()) } } + + /// This returns a numeric identifier for the thread identified by this + /// `ThreadId`. + /// + /// As noted in the documentation for the type itself, it is essentially an + /// opaque ID, but is guaranteed to be unique for each thread. The returned + /// value is entirely opaque -- only equality testing is stable. Note that + /// it is not guaranteed which values new threads will return, and this may + /// change across Rust versions. + #[unstable(feature = "thread_id_value", issue = "67939")] + pub fn as_u64(&self) -> u64 { + self.0.get() + } } //////////////////////////////////////////////////////////////////////////////// @@ -1069,7 +1093,7 @@ impl ThreadId { /// The internal representation of a `Thread` handle struct Inner { - name: Option<CString>, // Guaranteed to be UTF-8 + name: Option<CString>, // Guaranteed to be UTF-8 id: ThreadId, // state for thread park/unpark @@ -1111,9 +1135,8 @@ impl Thread { // Used only internally to construct a thread object without spawning // Panics if the name contains nuls. pub(crate) fn new(name: Option<String>) -> Thread { - let cname = name.map(|n| { - CString::new(n).expect("thread name may not contain interior null bytes") - }); + let cname = + name.map(|n| CString::new(n).expect("thread name may not contain interior null bytes")); Thread { inner: Arc::new(Inner { name: cname, @@ -1121,7 +1144,7 @@ impl Thread { state: AtomicUsize::new(EMPTY), lock: Mutex::new(()), cvar: Condvar::new(), - }) + }), } } @@ -1166,9 +1189,9 @@ impl Thread { // rather than a compare-and-swap that returns if it reads `NOTIFIED` // on failure. match self.inner.state.swap(NOTIFIED, SeqCst) { - EMPTY => return, // no one was waiting + EMPTY => return, // no one was waiting NOTIFIED => return, // already unparked - PARKED => {} // gotta go wake someone up + PARKED => {} // gotta go wake someone up _ => panic!("inconsistent state in unpark"), } @@ -1245,7 +1268,7 @@ impl Thread { /// [naming-threads]: ./index.html#naming-threads #[stable(feature = "rust1", since = "1.0.0")] pub fn name(&self) -> Option<&str> { - self.cname().map(|s| unsafe { str::from_utf8_unchecked(s.to_bytes()) } ) + self.cname().map(|s| unsafe { str::from_utf8_unchecked(s.to_bytes()) }) } fn cname(&self) -> Option<&CStr> { @@ -1256,10 +1279,7 @@ impl Thread { #[stable(feature = "rust1", since = "1.0.0")] impl fmt::Debug for Thread { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Thread") - .field("id", &self.id()) - .field("name", &self.name()) - .finish() + f.debug_struct("Thread").field("id", &self.id()).field("name", &self.name()).finish() } } @@ -1334,9 +1354,7 @@ struct JoinInner<T> { impl<T> JoinInner<T> { fn join(&mut self) -> Result<T> { self.native.take().unwrap().join(); - unsafe { - (*self.packet.0.get()).take().unwrap() - } + unsafe { (*self.packet.0.get()).take().unwrap() } } } @@ -1471,11 +1489,15 @@ impl<T> JoinHandle<T> { } impl<T> AsInner<imp::Thread> for JoinHandle<T> { - fn as_inner(&self) -> &imp::Thread { self.0.native.as_ref().unwrap() } + fn as_inner(&self) -> &imp::Thread { + self.0.native.as_ref().unwrap() + } } impl<T> IntoInner<imp::Thread> for JoinHandle<T> { - fn into_inner(self) -> imp::Thread { self.0.native.unwrap() } + fn into_inner(self) -> imp::Thread { + self.0.native.unwrap() + } } #[stable(feature = "std_debug", since = "1.16.0")] @@ -1500,8 +1522,8 @@ mod tests { use super::Builder; use crate::any::Any; use crate::mem; - use crate::sync::mpsc::{channel, Sender}; use crate::result; + use crate::sync::mpsc::{channel, Sender}; use crate::thread::{self, ThreadId}; use crate::time::Duration; use crate::u32; @@ -1511,16 +1533,24 @@ mod tests { #[test] fn test_unnamed_thread() { - thread::spawn(move|| { + thread::spawn(move || { assert!(thread::current().name().is_none()); - }).join().ok().expect("thread panicked"); + }) + .join() + .ok() + .expect("thread panicked"); } #[test] fn test_named_thread() { - Builder::new().name("ada lovelace".to_string()).spawn(move|| { - assert!(thread::current().name().unwrap() == "ada lovelace".to_string()); - }).unwrap().join().unwrap(); + Builder::new() + .name("ada lovelace".to_string()) + .spawn(move || { + assert!(thread::current().name().unwrap() == "ada lovelace".to_string()); + }) + .unwrap() + .join() + .unwrap(); } #[test] @@ -1532,7 +1562,7 @@ mod tests { #[test] fn test_run_basic() { let (tx, rx) = channel(); - thread::spawn(move|| { + thread::spawn(move || { tx.send(()).unwrap(); }); rx.recv().unwrap(); @@ -1540,11 +1570,9 @@ mod tests { #[test] fn test_join_panic() { - match thread::spawn(move|| { - panic!() - }).join() { + match thread::spawn(move || panic!()).join() { result::Result::Err(_) => (), - result::Result::Ok(()) => panic!() + result::Result::Ok(()) => panic!(), } } @@ -1554,14 +1582,13 @@ mod tests { fn f(i: i32, tx: Sender<()>) { let tx = tx.clone(); - thread::spawn(move|| { + thread::spawn(move || { if i == 0 { tx.send(()).unwrap(); } else { f(i - 1, tx); } }); - } f(10, tx); rx.recv().unwrap(); @@ -1571,8 +1598,8 @@ mod tests { fn test_spawn_sched_childs_on_default_sched() { let (tx, rx) = channel(); - thread::spawn(move|| { - thread::spawn(move|| { + thread::spawn(move || { + thread::spawn(move || { tx.send(()).unwrap(); }); }); @@ -1580,13 +1607,16 @@ mod tests { rx.recv().unwrap(); } - fn avoid_copying_the_body<F>(spawnfn: F) where F: FnOnce(Box<dyn Fn() + Send>) { + fn avoid_copying_the_body<F>(spawnfn: F) + where + F: FnOnce(Box<dyn Fn() + Send>), + { let (tx, rx) = channel(); let x: Box<_> = box 1; let x_in_parent = (&*x) as *const i32 as usize; - spawnfn(Box::new(move|| { + spawnfn(Box::new(move || { let x_in_child = (&*x) as *const i32 as usize; tx.send(x_in_child).unwrap(); })); @@ -1605,7 +1635,7 @@ mod tests { #[test] fn test_avoid_copying_the_body_thread_spawn() { avoid_copying_the_body(|f| { - thread::spawn(move|| { + thread::spawn(move || { f(); }); }) @@ -1614,9 +1644,7 @@ mod tests { #[test] fn test_avoid_copying_the_body_join() { avoid_copying_the_body(|f| { - let _ = thread::spawn(move|| { - f() - }).join(); + let _ = thread::spawn(move || f()).join(); }) } @@ -1628,9 +1656,9 @@ mod tests { // valgrind-friendly. try this at home, instead..!) const GENERATIONS: u32 = 16; fn child_no(x: u32) -> Box<dyn Fn() + Send> { - return Box::new(move|| { + return Box::new(move || { if x < GENERATIONS { - thread::spawn(move|| child_no(x+1)()); + thread::spawn(move || child_no(x + 1)()); } }); } @@ -1644,37 +1672,43 @@ mod tests { #[test] fn test_try_panic_message_static_str() { - match thread::spawn(move|| { + match thread::spawn(move || { panic!("static string"); - }).join() { + }) + .join() + { Err(e) => { type T = &'static str; assert!(e.is::<T>()); assert_eq!(*e.downcast::<T>().unwrap(), "static string"); } - Ok(()) => panic!() + Ok(()) => panic!(), } } #[test] fn test_try_panic_message_owned_str() { - match thread::spawn(move|| { + match thread::spawn(move || { panic!("owned string".to_string()); - }).join() { + }) + .join() + { Err(e) => { type T = String; assert!(e.is::<T>()); assert_eq!(*e.downcast::<T>().unwrap(), "owned string".to_string()); } - Ok(()) => panic!() + Ok(()) => panic!(), } } #[test] fn test_try_panic_message_any() { - match thread::spawn(move|| { + match thread::spawn(move || { panic!(box 413u16 as Box<dyn Any + Send>); - }).join() { + }) + .join() + { Err(e) => { type T = Box<dyn Any + Send>; assert!(e.is::<T>()); @@ -1682,7 +1716,7 @@ mod tests { assert!(any.is::<u16>()); assert_eq!(*any.downcast::<u16>().unwrap(), 413); } - Ok(()) => panic!() + Ok(()) => panic!(), } } @@ -1690,11 +1724,9 @@ mod tests { fn test_try_panic_message_unit_struct() { struct Juju; - match thread::spawn(move|| { - panic!(Juju) - }).join() { + match thread::spawn(move || panic!(Juju)).join() { Err(ref e) if e.is::<Juju>() => {} - Err(_) | Ok(()) => panic!() + Err(_) | Ok(()) => panic!(), } } diff --git a/src/libstd/time.rs b/src/libstd/time.rs index e1ae01b602..5bc8fe5ae6 100644 --- a/src/libstd/time.rs +++ b/src/libstd/time.rs @@ -65,9 +65,9 @@ pub use core::time::Duration; /// /// | Platform | System call | /// |:---------:|:--------------------------------------------------------------------:| -/// | Cloud ABI | [clock_time_get (Monotonic Clock)] | +/// | CloudABI | [clock_time_get (Monotonic Clock)] | /// | SGX | [`insecure_time` usercall]. More information on [timekeeping in SGX] | -/// | UNIX | [clock_time_get (Monotonic Clock)] | +/// | UNIX | [clock_gettime (Monotonic Clock)] | /// | Darwin | [mach_absolute_time] | /// | VXWorks | [clock_gettime (Monotonic Clock)] | /// | WASI | [__wasi_clock_time_get (Monotonic Clock)] | @@ -79,7 +79,7 @@ pub use core::time::Duration; /// [__wasi_clock_time_get (Monotonic Clock)]: https://github.com/CraneStation/wasmtime/blob/master/docs/WASI-api.md#clock_time_get /// [clock_gettime (Monotonic Clock)]: https://linux.die.net/man/3/clock_gettime /// [mach_absolute_time]: https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/services/services.html -/// [clock_time_get (Monotonic Clock)]: https://github.com/NuxiNL/cloudabi/blob/master/cloudabi.txt +/// [clock_time_get (Monotonic Clock)]: https://nuxi.nl/cloudabi/#clock_time_get /// /// **Disclaimer:** These system calls might change over time. /// @@ -144,7 +144,7 @@ pub struct Instant(time::Instant); /// /// | Platform | System call | /// |:---------:|:--------------------------------------------------------------------:| -/// | Cloud ABI | [clock_time_get (Realtime Clock)] | +/// | CloudABI | [clock_time_get (Realtime Clock)] | /// | SGX | [`insecure_time` usercall]. More information on [timekeeping in SGX] | /// | UNIX | [clock_gettime (Realtime Clock)] | /// | DARWIN | [gettimeofday] | @@ -152,7 +152,9 @@ pub struct Instant(time::Instant); /// | WASI | [__wasi_clock_time_get (Realtime Clock)] | /// | Windows | [GetSystemTimeAsFileTime] | /// -/// [clock_time_get (Realtime Clock)]: https://github.com/NuxiNL/cloudabi/blob/master/cloudabi.txt +/// [clock_time_get (Realtime Clock)]: https://nuxi.nl/cloudabi/#clock_time_get +/// [`insecure_time` usercall]: https://edp.fortanix.com/docs/api/fortanix_sgx_abi/struct.Usercalls.html#method.insecure_time +/// [timekeeping in SGX]: https://edp.fortanix.com/docs/concepts/rust-std/#codestdtimecode /// [gettimeofday]: http://man7.org/linux/man-pages/man2/gettimeofday.2.html /// [clock_gettime (Realtime Clock)]: https://linux.die.net/man/3/clock_gettime /// [__wasi_clock_time_get (Realtime Clock)]: https://github.com/CraneStation/wasmtime/blob/master/docs/WASI-api.md#clock_time_get @@ -621,6 +623,7 @@ impl SystemTimeError { #[stable(feature = "time2", since = "1.8.0")] impl Error for SystemTimeError { + #[allow(deprecated)] fn description(&self) -> &str { "other time was not earlier than self" } diff --git a/src/libsyntax/Cargo.toml b/src/libsyntax/Cargo.toml index 8a00bcbfe1..2e647d2a1e 100644 --- a/src/libsyntax/Cargo.toml +++ b/src/libsyntax/Cargo.toml @@ -10,18 +10,15 @@ path = "lib.rs" doctest = false [dependencies] -bitflags = "1.2.1" rustc_serialize = { path = "../libserialize", package = "serialize" } log = "0.4" scoped-tls = "1.0" -lazy_static = "1.0.0" -syntax_pos = { path = "../libsyntax_pos" } -errors = { path = "../librustc_errors", package = "rustc_errors" } +rustc_errors = { path = "../librustc_errors" } +rustc_span = { path = "../librustc_span" } rustc_data_structures = { path = "../librustc_data_structures" } rustc_feature = { path = "../librustc_feature" } rustc_index = { path = "../librustc_index" } rustc_lexer = { path = "../librustc_lexer" } rustc_macros = { path = "../librustc_macros" } smallvec = { version = "1.0", features = ["union", "may_dangle"] } -rustc_error_codes = { path = "../librustc_error_codes" } rustc_session = { path = "../librustc_session" } diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 92ba071a03..5c64cc440c 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -18,29 +18,28 @@ //! - [`Attribute`]: Metadata associated with item. //! - [`UnOp`], [`UnOpKind`], [`BinOp`], [`BinOpKind`]: Unary and binary operators. +pub use crate::util::parser::ExprPrecedence; pub use GenericArgs::*; pub use UnsafeSource::*; -pub use crate::util::parser::ExprPrecedence; -pub use syntax_pos::symbol::{Ident, Symbol as Name}; +pub use rustc_span::symbol::{Ident, Symbol as Name}; use crate::ptr::P; -use crate::source_map::{dummy_spanned, respan, Spanned}; use crate::token::{self, DelimToken}; -use crate::tokenstream::{TokenStream, TokenTree, DelimSpan}; - -use syntax_pos::symbol::{kw, sym, Symbol}; -use syntax_pos::{Span, DUMMY_SP}; +use crate::tokenstream::{DelimSpan, TokenStream, TokenTree}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_data_structures::sync::Lrc; use rustc_data_structures::thin_vec::ThinVec; use rustc_index::vec::Idx; -use rustc_serialize::{self, Decoder, Encoder}; use rustc_macros::HashStable_Generic; +use rustc_serialize::{self, Decoder, Encoder}; +use rustc_span::source_map::{dummy_spanned, respan, Spanned}; +use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_span::{Span, DUMMY_SP}; -use std::iter; use std::fmt; +use std::iter; #[cfg(test)] mod tests; @@ -76,12 +75,7 @@ pub struct Lifetime { impl fmt::Debug for Lifetime { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "lifetime({}: {})", - self.id, - self - ) + write!(f, "lifetime({}: {})", self.id, self) } } @@ -107,9 +101,7 @@ pub struct Path { impl PartialEq<Symbol> for Path { fn eq(&self, symbol: &Symbol) -> bool { - self.segments.len() == 1 && { - self.segments[0].ident.name == *symbol - } + self.segments.len() == 1 && { self.segments[0].ident.name == *symbol } } } @@ -126,10 +118,7 @@ impl Path { // Convert a span and an identifier to the corresponding // one-segment path. pub fn from_ident(ident: Ident) -> Path { - Path { - segments: vec![PathSegment::from_ident(ident)], - span: ident.span, - } + Path { segments: vec![PathSegment::from_ident(ident)], span: ident.span } } pub fn is_global(&self) -> bool { @@ -254,7 +243,7 @@ pub struct ParenthesizedArgs { pub inputs: Vec<P<Ty>>, /// `C` - pub output: Option<P<Ty>>, + pub output: FunctionRetTy, } impl ParenthesizedArgs { @@ -277,12 +266,24 @@ pub const CRATE_NODE_ID: NodeId = NodeId::from_u32_const(0); /// small, positive ids. pub const DUMMY_NODE_ID: NodeId = NodeId::MAX; -/// A modifier on a bound, currently this is only used for `?Sized`, where the -/// modifier is `Maybe`. Negative bounds should also be handled here. +/// A modifier on a bound, e.g., `?Sized` or `?const Trait`. +/// +/// Negative bounds should also be handled here. #[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Debug)] pub enum TraitBoundModifier { + /// No modifiers None, + + /// `?Trait` Maybe, + + /// `?const Trait` + MaybeConst, + + /// `?const ?Trait` + // + // This parses but will be rejected during AST validation. + MaybeConstMaybe, } /// The AST represents all type param bounds as types. @@ -330,15 +331,19 @@ impl fmt::Display for ParamKindOrd { pub enum GenericParamKind { /// A lifetime definition (e.g., `'a: 'b + 'c + 'd`). Lifetime, - Type { default: Option<P<Ty>> }, - Const { ty: P<Ty> }, + Type { + default: Option<P<Ty>>, + }, + Const { + ty: P<Ty>, + }, } #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] pub struct GenericParam { pub id: NodeId, pub ident: Ident, - pub attrs: ThinVec<Attribute>, + pub attrs: AttrVec, pub bounds: GenericBounds, pub is_placeholder: bool, pub kind: GenericParamKind, @@ -358,10 +363,7 @@ impl Default for Generics { fn default() -> Generics { Generics { params: Vec::new(), - where_clause: WhereClause { - predicates: Vec::new(), - span: DUMMY_SP, - }, + where_clause: WhereClause { predicates: Vec::new(), span: DUMMY_SP }, span: DUMMY_SP, } } @@ -509,15 +511,15 @@ impl Pat { // In a type expression `_` is an inference variable. PatKind::Wild => TyKind::Infer, // An IDENT pattern with no binding mode would be valid as path to a type. E.g. `u32`. - PatKind::Ident(BindingMode::ByValue(Mutability::Immutable), ident, None) => { + PatKind::Ident(BindingMode::ByValue(Mutability::Not), ident, None) => { TyKind::Path(None, Path::from_ident(*ident)) } PatKind::Path(qself, path) => TyKind::Path(qself.clone(), path.clone()), PatKind::Mac(mac) => TyKind::Mac(mac.clone()), // `&mut? P` can be reinterpreted as `&mut? T` where `T` is `P` reparsed as a type. - PatKind::Ref(pat, mutbl) => pat - .to_ty() - .map(|ty| TyKind::Rptr(None, MutTy { ty, mutbl: *mutbl }))?, + PatKind::Ref(pat, mutbl) => { + pat.to_ty().map(|ty| TyKind::Rptr(None, MutTy { ty, mutbl: *mutbl }))? + } // A slice/array pattern `[P]` can be reparsed as `[T]`, an unsized array, // when `P` can be reparsed as a type `T`. PatKind::Slice(pats) if pats.len() == 1 => pats[0].to_ty().map(TyKind::Slice)?, @@ -534,11 +536,7 @@ impl Pat { _ => return None, }; - Some(P(Ty { - kind, - id: self.id, - span: self.span, - })) + Some(P(Ty { kind, id: self.id, span: self.span })) } /// Walk top-down and call `it` in each place where a pattern occurs @@ -557,15 +555,12 @@ impl Pat { PatKind::Struct(_, fields, _) => fields.iter().for_each(|field| field.pat.walk(it)), // Sequence of patterns. - PatKind::TupleStruct(_, s) - | PatKind::Tuple(s) - | PatKind::Slice(s) - | PatKind::Or(s) => s.iter().for_each(|p| p.walk(it)), + PatKind::TupleStruct(_, s) | PatKind::Tuple(s) | PatKind::Slice(s) | PatKind::Or(s) => { + s.iter().for_each(|p| p.walk(it)) + } // Trivial wrappers over inner patterns. - PatKind::Box(s) - | PatKind::Ref(s, _) - | PatKind::Paren(s) => s.walk(it), + PatKind::Box(s) | PatKind::Ref(s, _) | PatKind::Paren(s) => s.walk(it), // These patterns do not contain subpatterns, skip. PatKind::Wild @@ -574,7 +569,7 @@ impl Pat { | PatKind::Range(..) | PatKind::Ident(..) | PatKind::Path(..) - | PatKind::Mac(_) => {}, + | PatKind::Mac(_) => {} } } @@ -599,7 +594,7 @@ pub struct FieldPat { /// The pattern the field is destructured to pub pat: P<Pat>, pub is_shorthand: bool, - pub attrs: ThinVec<Attribute>, + pub attrs: AttrVec, pub id: NodeId, pub span: Span, pub is_placeholder: bool, @@ -666,7 +661,7 @@ pub enum PatKind { Lit(P<Expr>), /// A range pattern (e.g., `1...2`, `1..=2` or `1..2`). - Range(P<Expr>, P<Expr>, Spanned<RangeEnd>), + Range(Option<P<Expr>>, Option<P<Expr>>, Spanned<RangeEnd>), /// A slice pattern `[a, b, c]`. Slice(Vec<P<Pat>>), @@ -692,33 +687,44 @@ pub enum PatKind { Mac(Mac), } -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, - RustcEncodable, RustcDecodable, Debug, Copy, HashStable_Generic)] +#[derive( + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + Debug, + Copy, + HashStable_Generic +)] pub enum Mutability { - Mutable, - Immutable, + Mut, + Not, } impl Mutability { /// Returns `MutMutable` only if both `self` and `other` are mutable. pub fn and(self, other: Self) -> Self { match self { - Mutability::Mutable => other, - Mutability::Immutable => Mutability::Immutable, + Mutability::Mut => other, + Mutability::Not => Mutability::Not, } } pub fn invert(self) -> Self { match self { - Mutability::Mutable => Mutability::Immutable, - Mutability::Immutable => Mutability::Mutable, + Mutability::Mut => Mutability::Not, + Mutability::Not => Mutability::Mut, } } pub fn prefix_str(&self) -> &'static str { match self { - Mutability::Mutable => "mut ", - Mutability::Immutable => "", + Mutability::Mut => "mut ", + Mutability::Not => "", } } } @@ -728,13 +734,13 @@ impl Mutability { #[derive(Clone, Copy, PartialEq, Eq, Debug)] #[derive(RustcEncodable, RustcDecodable, HashStable_Generic)] pub enum BorrowKind { - /// A raw borrow, `&raw const $expr` or `&raw mut $expr`. - /// The resulting type is either `*const T` or `*mut T` - /// where `T = typeof($expr)`. - Ref, /// A normal borrow, `&$expr` or `&mut $expr`. /// The resulting type is either `&'a T` or `&'a mut T` /// where `T = typeof($expr)` and `'a` is some lifetime. + Ref, + /// A raw borrow, `&raw const $expr` or `&raw mut $expr`. + /// The resulting type is either `*const T` or `*mut T` + /// where `T = typeof($expr)`. Raw, } @@ -911,7 +917,7 @@ pub enum StmtKind { /// Expr with a trailing semi-colon. Semi(P<Expr>), /// Macro. - Mac(P<(Mac, MacStmtStyle, ThinVec<Attribute>)>), + Mac(P<(Mac, MacStmtStyle, AttrVec)>), } #[derive(Clone, Copy, PartialEq, RustcEncodable, RustcDecodable, Debug)] @@ -936,7 +942,7 @@ pub struct Local { /// Initializer expression to set the value, if any. pub init: Option<P<Expr>>, pub span: Span, - pub attrs: ThinVec<Attribute>, + pub attrs: AttrVec, } /// An arm of a 'match'. @@ -966,7 +972,7 @@ pub struct Arm { /// Access of a named (e.g., `obj.foo`) or unnamed (e.g., `obj.0`) struct field. #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] pub struct Field { - pub attrs: ThinVec<Attribute>, + pub attrs: AttrVec, pub id: NodeId, pub span: Span, pub ident: Ident, @@ -1004,7 +1010,7 @@ pub struct Expr { pub id: NodeId, pub kind: ExprKind, pub span: Span, - pub attrs: ThinVec<Attribute>, + pub attrs: AttrVec, } // `Expr` is used a lot. Make sure it doesn't unintentionally get bigger. @@ -1055,9 +1061,9 @@ impl Expr { ExprKind::Paren(expr) => expr.to_ty().map(TyKind::Paren)?, - ExprKind::AddrOf(BorrowKind::Ref, mutbl, expr) => expr - .to_ty() - .map(|ty| TyKind::Rptr(None, MutTy { ty, mutbl: *mutbl }))?, + ExprKind::AddrOf(BorrowKind::Ref, mutbl, expr) => { + expr.to_ty().map(|ty| TyKind::Rptr(None, MutTy { ty, mutbl: *mutbl }))? + } ExprKind::Repeat(expr, expr_len) => { expr.to_ty().map(|ty| TyKind::Array(ty, expr_len.clone()))? @@ -1066,10 +1072,7 @@ impl Expr { ExprKind::Array(exprs) if exprs.len() == 1 => exprs[0].to_ty().map(TyKind::Slice)?, ExprKind::Tup(exprs) => { - let tys = exprs - .iter() - .map(|expr| expr.to_ty()) - .collect::<Option<Vec<_>>>()?; + let tys = exprs.iter().map(|expr| expr.to_ty()).collect::<Option<Vec<_>>>()?; TyKind::Tup(tys) } @@ -1088,11 +1091,7 @@ impl Expr { _ => return None, }; - Some(P(Ty { - kind, - id: self.id, - span: self.span, - })) + Some(P(Ty { kind, id: self.id, span: self.span })) } pub fn precedence(&self) -> ExprPrecedence { @@ -1228,7 +1227,8 @@ pub enum ExprKind { TryBlock(P<Block>), /// An assignment (`a = foo()`). - Assign(P<Expr>, P<Expr>), + /// The `Span` argument is the span of the `=` token. + Assign(P<Expr>, P<Expr>, Span), /// An assignment with an operator. /// /// E.g., `a += 1`. @@ -1322,8 +1322,19 @@ pub enum CaptureBy { /// The movability of a generator / closure literal: /// whether a generator contains self-references, causing it to be `!Unpin`. -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, - RustcEncodable, RustcDecodable, Debug, Copy, HashStable_Generic)] +#[derive( + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + Debug, + Copy, + HashStable_Generic +)] pub enum Movability { /// May contain self-references, `!Unpin`. Static, @@ -1383,8 +1394,7 @@ impl MacArgs { pub fn inner_tokens(&self) -> TokenStream { match self { MacArgs::Empty => TokenStream::default(), - MacArgs::Delimited(.., tokens) | - MacArgs::Eq(.., tokens) => tokens.clone(), + MacArgs::Delimited(.., tokens) | MacArgs::Eq(.., tokens) => tokens.clone(), } } @@ -1393,17 +1403,19 @@ impl MacArgs { pub fn outer_tokens(&self) -> TokenStream { match *self { MacArgs::Empty => TokenStream::default(), - MacArgs::Delimited(dspan, delim, ref tokens) => - TokenTree::Delimited(dspan, delim.to_token(), tokens.clone()).into(), - MacArgs::Eq(eq_span, ref tokens) => iter::once(TokenTree::token(token::Eq, eq_span)) - .chain(tokens.trees()).collect(), + MacArgs::Delimited(dspan, delim, ref tokens) => { + TokenTree::Delimited(dspan, delim.to_token(), tokens.clone()).into() + } + MacArgs::Eq(eq_span, ref tokens) => { + iter::once(TokenTree::token(token::Eq, eq_span)).chain(tokens.trees()).collect() + } } } /// Whether a macro with these arguments needs a semicolon /// when used as a standalone item or statement. pub fn need_semicolon(&self) -> bool { - !matches!(self, MacArgs::Delimited(_, MacDelimiter::Brace ,_)) + !matches!(self, MacArgs::Delimited(_, MacDelimiter::Brace, _)) } } @@ -1441,8 +1453,8 @@ pub struct MacroDef { pub legacy: bool, } -// Clippy uses Hash and PartialEq -#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Copy, Hash, PartialEq, HashStable_Generic)] +#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Copy, Hash, Eq, PartialEq)] +#[derive(HashStable_Generic)] pub enum StrStyle { /// A regular string, like `"foo"`. Cooked, @@ -1491,9 +1503,9 @@ impl StrLit { } } -// Clippy uses Hash and PartialEq /// Type of the integer literal based on provided suffix. -#[derive(Clone, Copy, RustcEncodable, RustcDecodable, Debug, Hash, PartialEq, HashStable_Generic)] +#[derive(Clone, Copy, RustcEncodable, RustcDecodable, Debug, Hash, Eq, PartialEq)] +#[derive(HashStable_Generic)] pub enum LitIntType { /// e.g. `42_i32`. Signed(IntTy), @@ -1504,7 +1516,8 @@ pub enum LitIntType { } /// Type of the float literal based on provided suffix. -#[derive(Clone, Copy, RustcEncodable, RustcDecodable, Debug, Hash, PartialEq, HashStable_Generic)] +#[derive(Clone, Copy, RustcEncodable, RustcDecodable, Debug, Hash, Eq, PartialEq)] +#[derive(HashStable_Generic)] pub enum LitFloatType { /// A float literal with a suffix (`1f32` or `1E10f32`). Suffixed(FloatTy), @@ -1515,8 +1528,7 @@ pub enum LitFloatType { /// Literal kind. /// /// E.g., `"foo"`, `42`, `12.34`, or `bool`. -// Clippy uses Hash and PartialEq -#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Hash, PartialEq, HashStable_Generic)] +#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Hash, Eq, PartialEq, HashStable_Generic)] pub enum LitKind { /// A string literal (`"foo"`). Str(Symbol, StrStyle), @@ -1603,59 +1615,59 @@ pub struct FnSig { pub decl: P<FnDecl>, } -/// Represents an item declaration within a trait declaration, -/// possibly including a default implementation. A trait item is -/// either required (meaning it doesn't have an implementation, just a -/// signature) or provided (meaning it has a default implementation). +/// Represents associated items. +/// These include items in `impl` and `trait` definitions. #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] -pub struct TraitItem { +pub struct AssocItem { pub attrs: Vec<Attribute>, pub id: NodeId, pub span: Span, pub vis: Visibility, pub ident: Ident, + pub defaultness: Defaultness, pub generics: Generics, - pub kind: TraitItemKind, + pub kind: AssocItemKind, /// See `Item::tokens` for what this is. pub tokens: Option<TokenStream>, } -#[derive(Clone, RustcEncodable, RustcDecodable, Debug)] -pub enum TraitItemKind { +/// Represents various kinds of content within an `impl`. +/// +/// The term "provided" in the variants below refers to the item having a default +/// definition / body. Meanwhile, a "required" item lacks a definition / body. +/// In an implementation, all items must be provided. +/// The `Option`s below denote the bodies, where `Some(_)` +/// means "provided" and conversely `None` means "required". +#[derive(Clone, RustcEncodable, RustcDecodable, Debug)] +pub enum AssocItemKind { + /// An associated constant, `const $ident: $ty $def?;` where `def ::= "=" $expr? ;`. + /// If `def` is parsed, then the associated constant is provided, and otherwise required. Const(P<Ty>, Option<P<Expr>>), - Method(FnSig, Option<P<Block>>), - Type(GenericBounds, Option<P<Ty>>), - Macro(Mac), -} -/// Represents anything within an `impl` block. -#[derive(Clone, RustcEncodable, RustcDecodable, Debug)] -pub struct ImplItem { - pub attrs: Vec<Attribute>, - pub id: NodeId, - pub span: Span, - pub vis: Visibility, - pub ident: Ident, + /// An associated function. + Fn(FnSig, Option<P<Block>>), - pub defaultness: Defaultness, - pub generics: Generics, - pub kind: ImplItemKind, - /// See `Item::tokens` for what this is. - pub tokens: Option<TokenStream>, -} + /// An associated type. + TyAlias(GenericBounds, Option<P<Ty>>), -/// Represents various kinds of content within an `impl`. -#[derive(Clone, RustcEncodable, RustcDecodable, Debug)] -pub enum ImplItemKind { - Const(P<Ty>, P<Expr>), - Method(FnSig, P<Block>), - TyAlias(P<Ty>), + /// A macro expanding to an associated item. Macro(Mac), } -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, HashStable_Generic, - RustcEncodable, RustcDecodable, Debug)] +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + HashStable_Generic, + RustcEncodable, + RustcDecodable, + Debug +)] pub enum FloatTy { F32, F64, @@ -1684,8 +1696,19 @@ impl FloatTy { } } -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, HashStable_Generic, - RustcEncodable, RustcDecodable, Debug)] +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + HashStable_Generic, + RustcEncodable, + RustcDecodable, + Debug +)] pub enum IntTy { Isize, I8, @@ -1749,8 +1772,19 @@ impl IntTy { } } -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, HashStable_Generic, - RustcEncodable, RustcDecodable, Copy, Debug)] +#[derive( + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + HashStable_Generic, + RustcEncodable, + RustcDecodable, + Copy, + Debug +)] pub enum UintTy { Usize, U8, @@ -1825,13 +1859,9 @@ pub struct AssocTyConstraint { #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] pub enum AssocTyConstraintKind { /// E.g., `A = Bar` in `Foo<A = Bar>`. - Equality { - ty: P<Ty>, - }, + Equality { ty: P<Ty> }, /// E.g. `A: TraitA + TraitB` in `Foo<A: TraitA + TraitB>`. - Bound { - bounds: GenericBounds, - }, + Bound { bounds: GenericBounds }, } #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] @@ -1900,19 +1930,11 @@ pub enum TyKind { impl TyKind { pub fn is_implicit_self(&self) -> bool { - if let TyKind::ImplicitSelf = *self { - true - } else { - false - } + if let TyKind::ImplicitSelf = *self { true } else { false } } pub fn is_unit(&self) -> bool { - if let TyKind::Tup(ref tys) = *self { - tys.is_empty() - } else { - false - } + if let TyKind::Tup(ref tys) = *self { tys.is_empty() } else { false } } /// HACK(type_alias_impl_trait, Centril): A temporary crutch used @@ -1972,7 +1994,7 @@ pub struct InlineAsm { /// E.g., `bar: usize` as in `fn foo(bar: usize)`. #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] pub struct Param { - pub attrs: ThinVec<Attribute>, + pub attrs: AttrVec, pub ty: P<Ty>, pub pat: P<Pat>, pub id: NodeId, @@ -2025,13 +2047,9 @@ impl Param { } /// Builds a `Param` object from `ExplicitSelf`. - pub fn from_self(attrs: ThinVec<Attribute>, eself: ExplicitSelf, eself_ident: Ident) -> Param { + pub fn from_self(attrs: AttrVec, eself: ExplicitSelf, eself_ident: Ident) -> Param { let span = eself.span.to(eself_ident.span); - let infer_ty = P(Ty { - id: DUMMY_NODE_ID, - kind: TyKind::ImplicitSelf, - span, - }); + let infer_ty = P(Ty { id: DUMMY_NODE_ID, kind: TyKind::ImplicitSelf, span }); let param = |mutbl, ty| Param { attrs, pat: P(Pat { @@ -2042,22 +2060,16 @@ impl Param { span, ty, id: DUMMY_NODE_ID, - is_placeholder: false + is_placeholder: false, }; match eself.node { SelfKind::Explicit(ty, mutbl) => param(mutbl, ty), SelfKind::Value(mutbl) => param(mutbl, infer_ty), SelfKind::Region(lt, mutbl) => param( - Mutability::Immutable, + Mutability::Not, P(Ty { id: DUMMY_NODE_ID, - kind: TyKind::Rptr( - lt, - MutTy { - ty: infer_ty, - mutbl, - }, - ), + kind: TyKind::Rptr(lt, MutTy { ty: infer_ty, mutbl }), span, }), ), @@ -2099,8 +2111,19 @@ pub enum IsAuto { No, } -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, - RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +#[derive( + Copy, + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + RustcEncodable, + RustcDecodable, + Debug, + HashStable_Generic +)] pub enum Unsafety { Unsafe, Normal, @@ -2129,35 +2152,26 @@ impl fmt::Display for Unsafety { #[derive(Copy, Clone, RustcEncodable, RustcDecodable, Debug)] pub enum IsAsync { - Async { - closure_id: NodeId, - return_impl_trait_id: NodeId, - }, + Async { closure_id: NodeId, return_impl_trait_id: NodeId }, NotAsync, } impl IsAsync { pub fn is_async(self) -> bool { - if let IsAsync::Async { .. } = self { - true - } else { - false - } + if let IsAsync::Async { .. } = self { true } else { false } } /// In ths case this is an `async` return, the `NodeId` for the generated `impl Trait` item. pub fn opt_return_id(self) -> Option<NodeId> { match self { - IsAsync::Async { - return_impl_trait_id, - .. - } => Some(return_impl_trait_id), + IsAsync::Async { return_impl_trait_id, .. } => Some(return_impl_trait_id), IsAsync::NotAsync => None, } } } -#[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] +#[derive(Copy, Clone, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Debug)] +#[derive(HashStable_Generic)] pub enum Constness { Const, NotConst, @@ -2190,6 +2204,7 @@ impl fmt::Debug for ImplPolarity { #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] pub enum FunctionRetTy { + // FIXME(Centril): Rename to `FnRetTy` and in HIR also. /// Returns type is not specified. /// /// Functions default to `()` and closures default to inference. @@ -2293,11 +2308,7 @@ impl UseTree { match self.kind { UseTreeKind::Simple(Some(rename), ..) => rename, UseTreeKind::Simple(None, ..) => { - self.prefix - .segments - .last() - .expect("empty prefix in a simple import") - .ident + self.prefix.segments.last().expect("empty prefix in a simple import").ident } _ => panic!("`UseTree::ident` can only be used on a simple import"), } @@ -2343,6 +2354,9 @@ pub struct AttrItem { pub args: MacArgs, } +/// A list of attributes. +pub type AttrVec = ThinVec<Attribute>; + /// Metadata associated with an item. #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] pub struct Attribute { @@ -2362,10 +2376,6 @@ pub enum AttrKind { /// A doc comment (e.g. `/// ...`, `//! ...`, `/** ... */`, `/*! ... */`). /// Doc attributes (e.g. `#[doc="..."]`) are represented with the `Normal` /// variant (which is much less compact and thus more expensive). - /// - /// Note: `self.has_name(sym::doc)` and `self.check_name(sym::doc)` succeed - /// for this variant, but this may change in the future. - /// ``` DocComment(Symbol), } @@ -2396,10 +2406,7 @@ impl PolyTraitRef { pub fn new(generic_params: Vec<GenericParam>, path: Path, span: Span) -> Self { PolyTraitRef { bound_generic_params: generic_params, - trait_ref: TraitRef { - path, - ref_id: DUMMY_NODE_ID, - }, + trait_ref: TraitRef { path, ref_id: DUMMY_NODE_ID }, span, } } @@ -2426,11 +2433,7 @@ pub enum VisibilityKind { impl VisibilityKind { pub fn is_pub(&self) -> bool { - if let VisibilityKind::Public = *self { - true - } else { - false - } + if let VisibilityKind::Public = *self { true } else { false } } } @@ -2602,7 +2605,7 @@ pub enum ItemKind { /// A trait declaration (`trait`). /// /// E.g., `trait Foo { .. }`, `trait Foo<T> { .. }` or `auto trait Foo {}`. - Trait(IsAuto, Unsafety, Generics, GenericBounds, Vec<TraitItem>), + Trait(IsAuto, Unsafety, Generics, GenericBounds, Vec<AssocItem>), /// Trait alias /// /// E.g., `trait Foo = Bar + Quux;`. @@ -2610,15 +2613,19 @@ pub enum ItemKind { /// An implementation. /// /// E.g., `impl<A> Foo<A> { .. }` or `impl<A> Trait for Foo<A> { .. }`. - Impl( - Unsafety, - ImplPolarity, - Defaultness, - Generics, - Option<TraitRef>, // (optional) trait this impl implements - P<Ty>, // self - Vec<ImplItem>, - ), + Impl { + unsafety: Unsafety, + polarity: ImplPolarity, + defaultness: Defaultness, + constness: Constness, + generics: Generics, + + /// The trait being implemented, if any. + of_trait: Option<TraitRef>, + + self_ty: P<Ty>, + items: Vec<AssocItem>, + }, /// A macro invocation. /// /// E.g., `foo!(..)`. @@ -2645,7 +2652,21 @@ impl ItemKind { ItemKind::Union(..) => "union", ItemKind::Trait(..) => "trait", ItemKind::TraitAlias(..) => "trait alias", - ItemKind::Mac(..) | ItemKind::MacroDef(..) | ItemKind::Impl(..) => "item", + ItemKind::Mac(..) | ItemKind::MacroDef(..) | ItemKind::Impl { .. } => "item", + } + } + + pub fn generics(&self) -> Option<&Generics> { + match self { + Self::Fn(_, generics, _) + | Self::TyAlias(_, generics) + | Self::Enum(_, generics) + | Self::Struct(_, generics) + | Self::Union(_, generics) + | Self::Trait(_, _, generics, ..) + | Self::TraitAlias(generics, _) + | Self::Impl { generics, .. } => Some(generics), + _ => None, } } } diff --git a/src/libsyntax/attr/builtin.rs b/src/libsyntax/attr/builtin.rs index a37b27f67b..6cfe4f2de1 100644 --- a/src/libsyntax/attr/builtin.rs +++ b/src/libsyntax/attr/builtin.rs @@ -2,21 +2,18 @@ use super::{mark_used, MetaItemKind}; use crate::ast::{self, Attribute, MetaItem, NestedMetaItem}; -use crate::feature_gate::feature_err; use crate::print::pprust; -use crate::sess::ParseSess; +use crate::sess::{feature_err, ParseSess}; -use errors::{Applicability, Handler}; -use std::num::NonZeroU32; -use syntax_pos::hygiene::Transparency; -use syntax_pos::{symbol::Symbol, symbol::sym, Span}; -use rustc_feature::{Features, find_gated_cfg, GatedCfg, is_builtin_attr_name}; +use rustc_errors::{struct_span_err, Applicability, Handler}; +use rustc_feature::{find_gated_cfg, is_builtin_attr_name, Features, GatedCfg}; use rustc_macros::HashStable_Generic; - -use rustc_error_codes::*; +use rustc_span::hygiene::Transparency; +use rustc_span::{symbol::sym, symbol::Symbol, Span}; +use std::num::NonZeroU32; pub fn is_builtin_attr(attr: &Attribute) -> bool { - attr.ident().filter(|ident| is_builtin_attr_name(ident.name)).is_some() + attr.is_doc_comment() || attr.ident().filter(|ident| is_builtin_attr_name(ident.name)).is_some() } enum AttrError { @@ -31,25 +28,23 @@ enum AttrError { fn handle_errors(sess: &ParseSess, span: Span, error: AttrError) { let diag = &sess.span_diagnostic; match error { - AttrError::MultipleItem(item) => span_err!(diag, span, E0538, - "multiple '{}' items", item), + AttrError::MultipleItem(item) => { + struct_span_err!(diag, span, E0538, "multiple '{}' items", item).emit(); + } AttrError::UnknownMetaItem(item, expected) => { - let expected = expected - .iter() - .map(|name| format!("`{}`", name)) - .collect::<Vec<_>>(); + let expected = expected.iter().map(|name| format!("`{}`", name)).collect::<Vec<_>>(); struct_span_err!(diag, span, E0541, "unknown meta item '{}'", item) .span_label(span, format!("expected one of {}", expected.join(", "))) .emit(); } - AttrError::MissingSince => span_err!(diag, span, E0542, "missing 'since'"), - AttrError::MissingFeature => span_err!(diag, span, E0546, "missing 'feature'"), - AttrError::MultipleStabilityLevels => span_err!(diag, span, E0544, - "multiple stability levels"), - AttrError::UnsupportedLiteral( - msg, - is_bytestr, - ) => { + AttrError::MissingSince => struct_span_err!(diag, span, E0542, "missing 'since'").emit(), + AttrError::MissingFeature => { + struct_span_err!(diag, span, E0546, "missing 'feature'").emit(); + } + AttrError::MultipleStabilityLevels => { + struct_span_err!(diag, span, E0544, "multiple stability levels").emit(); + } + AttrError::UnsupportedLiteral(msg, is_bytestr) => { let mut err = struct_span_err!(diag, span, E0565, "{}", msg); if is_bytestr { if let Ok(lint_str) = sess.source_map().span_to_snippet(span) { @@ -107,10 +102,12 @@ pub fn find_unwind_attr(diagnostic: Option<&Handler>, attrs: &[Attribute]) -> Op .span_suggestions( attr.span, "the allowed arguments are `allowed` and `aborts`", - (vec!["allowed", "aborts"]).into_iter() + (vec!["allowed", "aborts"]) + .into_iter() .map(|s| format!("#[unwind({})]", s)), Applicability::MachineApplicable, - ).emit(); + ) + .emit(); }); } } @@ -121,8 +118,17 @@ pub fn find_unwind_attr(diagnostic: Option<&Handler>, attrs: &[Attribute]) -> Op } /// Represents the #[stable], #[unstable], #[rustc_deprecated] attributes. -#[derive(RustcEncodable, RustcDecodable, Copy, Clone, Debug, - PartialEq, Eq, Hash, HashStable_Generic)] +#[derive( + RustcEncodable, + RustcDecodable, + Copy, + Clone, + Debug, + PartialEq, + Eq, + Hash, + HashStable_Generic +)] pub struct Stability { pub level: StabilityLevel, pub feature: Symbol, @@ -130,8 +136,17 @@ pub struct Stability { } /// Represents the #[rustc_const_unstable] and #[rustc_const_stable] attributes. -#[derive(RustcEncodable, RustcDecodable, Copy, Clone, Debug, - PartialEq, Eq, Hash, HashStable_Generic)] +#[derive( + RustcEncodable, + RustcDecodable, + Copy, + Clone, + Debug, + PartialEq, + Eq, + Hash, + HashStable_Generic +)] pub struct ConstStability { pub level: StabilityLevel, pub feature: Symbol, @@ -142,8 +157,18 @@ pub struct ConstStability { } /// The available stability levels. -#[derive(RustcEncodable, RustcDecodable, PartialEq, PartialOrd, - Copy, Clone, Debug, Eq, Hash, HashStable_Generic)] +#[derive( + RustcEncodable, + RustcDecodable, + PartialEq, + PartialOrd, + Copy, + Clone, + Debug, + Eq, + Hash, + HashStable_Generic +)] pub enum StabilityLevel { // Reason for the current stability level and the relevant rust-lang issue Unstable { reason: Option<Symbol>, issue: Option<NonZeroU32>, is_soft: bool }, @@ -152,23 +177,25 @@ pub enum StabilityLevel { impl StabilityLevel { pub fn is_unstable(&self) -> bool { - if let StabilityLevel::Unstable {..} = *self { - true - } else { - false - } + if let StabilityLevel::Unstable { .. } = *self { true } else { false } } pub fn is_stable(&self) -> bool { - if let StabilityLevel::Stable {..} = *self { - true - } else { - false - } + if let StabilityLevel::Stable { .. } = *self { true } else { false } } } -#[derive(RustcEncodable, RustcDecodable, PartialEq, PartialOrd, - Copy, Clone, Debug, Eq, Hash, HashStable_Generic)] +#[derive( + RustcEncodable, + RustcDecodable, + PartialEq, + PartialOrd, + Copy, + Clone, + Debug, + Eq, + Hash, + HashStable_Generic +)] pub struct RustcDeprecation { pub since: Symbol, pub reason: Symbol, @@ -180,25 +207,31 @@ pub struct RustcDeprecation { /// This will not perform any "sanity checks" on the form of the attributes. pub fn contains_feature_attr(attrs: &[Attribute], feature_name: Symbol) -> bool { attrs.iter().any(|item| { - item.check_name(sym::feature) && - item.meta_item_list().map(|list| { - list.iter().any(|mi| mi.is_word() && mi.check_name(feature_name)) - }).unwrap_or(false) + item.check_name(sym::feature) + && item + .meta_item_list() + .map(|list| list.iter().any(|mi| mi.is_word() && mi.check_name(feature_name))) + .unwrap_or(false) }) } /// Collects stability info from all stability attributes in `attrs`. /// Returns `None` if no stability attributes are found. -pub fn find_stability(sess: &ParseSess, attrs: &[Attribute], - item_sp: Span) -> (Option<Stability>, Option<ConstStability>) { +pub fn find_stability( + sess: &ParseSess, + attrs: &[Attribute], + item_sp: Span, +) -> (Option<Stability>, Option<ConstStability>) { find_stability_generic(sess, attrs.iter(), item_sp) } -fn find_stability_generic<'a, I>(sess: &ParseSess, - attrs_iter: I, - item_sp: Span) - -> (Option<Stability>, Option<ConstStability>) - where I: Iterator<Item = &'a Attribute> +fn find_stability_generic<'a, I>( + sess: &ParseSess, + attrs_iter: I, + item_sp: Span, +) -> (Option<Stability>, Option<ConstStability>) +where + I: Iterator<Item = &'a Attribute>, { use StabilityLevel::*; @@ -218,8 +251,11 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, sym::stable, sym::rustc_promotable, sym::rustc_allow_const_fn_ptr, - ].iter().any(|&s| attr.has_name(s)) { - continue // not a stability level + ] + .iter() + .any(|&s| attr.has_name(s)) + { + continue; // not a stability level } mark_used(attr); @@ -242,13 +278,13 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, meta.span, AttrError::MultipleItem(pprust::path_to_string(&meta.path)), ); - return false + return false; } if let Some(v) = meta.value_str() { *item = Some(v); true } else { - span_err!(diagnostic, meta.span, E0539, "incorrect meta item"); + struct_span_err!(diagnostic, meta.span, E0539, "incorrect meta item").emit(); false } }; @@ -296,39 +332,40 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, match meta_name { sym::rustc_deprecated => { if rustc_depr.is_some() { - span_err!(diagnostic, item_sp, E0540, - "multiple rustc_deprecated attributes"); - continue 'outer + struct_span_err!( + diagnostic, + item_sp, + E0540, + "multiple rustc_deprecated attributes" + ) + .emit(); + continue 'outer; } get_meta!(since, reason, suggestion); match (since, reason) { (Some(since), Some(reason)) => { - rustc_depr = Some(RustcDeprecation { - since, - reason, - suggestion, - }) + rustc_depr = Some(RustcDeprecation { since, reason, suggestion }) } (None, _) => { handle_errors(sess, attr.span, AttrError::MissingSince); - continue + continue; } _ => { - span_err!(diagnostic, attr.span, E0543, "missing 'reason'"); - continue + struct_span_err!(diagnostic, attr.span, E0543, "missing 'reason'") + .emit(); + continue; } } } - sym::rustc_const_unstable | - sym::unstable => { + sym::rustc_const_unstable | sym::unstable => { if meta_name == sym::unstable && stab.is_some() { handle_errors(sess, attr.span, AttrError::MultipleStabilityLevels); - break + break; } else if meta_name == sym::rustc_const_unstable && const_stab.is_some() { handle_errors(sess, attr.span, AttrError::MultipleStabilityLevels); - break + break; } let mut feature = None; @@ -338,9 +375,21 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, for meta in metas { if let Some(mi) = meta.meta_item() { match mi.name_or_empty() { - sym::feature => if !get(mi, &mut feature) { continue 'outer }, - sym::reason => if !get(mi, &mut reason) { continue 'outer }, - sym::issue => if !get(mi, &mut issue) { continue 'outer }, + sym::feature => { + if !get(mi, &mut feature) { + continue 'outer; + } + } + sym::reason => { + if !get(mi, &mut reason) { + continue 'outer; + } + } + sym::issue => { + if !get(mi, &mut issue) { + continue 'outer; + } + } sym::soft => { if !mi.is_word() { let msg = "`soft` should not have any arguments"; @@ -354,56 +403,46 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, meta.span(), AttrError::UnknownMetaItem( pprust::path_to_string(&mi.path), - &["feature", "reason", "issue", "soft"] + &["feature", "reason", "issue", "soft"], ), ); - continue 'outer + continue 'outer; } } } else { handle_errors( sess, meta.span(), - AttrError::UnsupportedLiteral( - "unsupported literal", - false, - ), + AttrError::UnsupportedLiteral("unsupported literal", false), ); - continue 'outer + continue 'outer; } } match (feature, reason, issue) { (Some(feature), reason, Some(issue)) => { let issue = match &*issue.as_str() { - // FIXME(rossmacarthur): remove "0" because "none" should be used - // See #41260 - "none" | "0" => None, + "none" => None, issue => { if let Ok(num) = issue.parse() { + // FIXME(rossmacarthur): disallow 0 + // Disallowing this requires updates to some submodules NonZeroU32::new(num) } else { - span_err!( + struct_span_err!( diagnostic, attr.span, E0545, "incorrect 'issue'" - ); - continue + ) + .emit(); + continue; } } }; - let level = Unstable { - reason, - issue, - is_soft, - }; + let level = Unstable { reason, issue, is_soft }; if sym::unstable == meta_name { - stab = Some(Stability { - level, - feature, - rustc_depr: None, - }); + stab = Some(Stability { level, feature, rustc_depr: None }); } else { const_stab = Some(ConstStability { level, @@ -415,68 +454,67 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, } (None, _, _) => { handle_errors(sess, attr.span, AttrError::MissingFeature); - continue + continue; } _ => { - span_err!(diagnostic, attr.span, E0547, "missing 'issue'"); - continue + struct_span_err!(diagnostic, attr.span, E0547, "missing 'issue'") + .emit(); + continue; } } } - sym::rustc_const_stable | - sym::stable => { + sym::rustc_const_stable | sym::stable => { if meta_name == sym::stable && stab.is_some() { handle_errors(sess, attr.span, AttrError::MultipleStabilityLevels); - break - } else if meta_name == sym::rustc_const_stable &&const_stab.is_some() { + break; + } else if meta_name == sym::rustc_const_stable && const_stab.is_some() { handle_errors(sess, attr.span, AttrError::MultipleStabilityLevels); - break + break; } let mut feature = None; let mut since = None; for meta in metas { match meta { - NestedMetaItem::MetaItem(mi) => { - match mi.name_or_empty() { - sym::feature => if !get(mi, &mut feature) { continue 'outer }, - sym::since => if !get(mi, &mut since) { continue 'outer }, - _ => { - handle_errors( - sess, - meta.span(), - AttrError::UnknownMetaItem( - pprust::path_to_string(&mi.path), - &["since", "note"], - ), - ); - continue 'outer + NestedMetaItem::MetaItem(mi) => match mi.name_or_empty() { + sym::feature => { + if !get(mi, &mut feature) { + continue 'outer; } } + sym::since => { + if !get(mi, &mut since) { + continue 'outer; + } + } + _ => { + handle_errors( + sess, + meta.span(), + AttrError::UnknownMetaItem( + pprust::path_to_string(&mi.path), + &["since", "note"], + ), + ); + continue 'outer; + } }, NestedMetaItem::Literal(lit) => { handle_errors( sess, lit.span, - AttrError::UnsupportedLiteral( - "unsupported literal", - false, - ), + AttrError::UnsupportedLiteral("unsupported literal", false), ); - continue 'outer + continue 'outer; } } } match (feature, since) { (Some(feature), Some(since)) => { - let level = Stable { since }; + let level = Stable { since }; if sym::stable == meta_name { - stab = Some(Stability { - level, - feature, - rustc_depr: None, - }); + stab = Some(Stability { level, feature, rustc_depr: None }); } else { const_stab = Some(ConstStability { level, @@ -488,15 +526,15 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, } (None, _) => { handle_errors(sess, attr.span, AttrError::MissingFeature); - continue + continue; } _ => { handle_errors(sess, attr.span, AttrError::MissingSince); - continue + continue; } } } - _ => unreachable!() + _ => unreachable!(), } } } @@ -506,9 +544,14 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, if let Some(ref mut stab) = stab { stab.rustc_depr = Some(rustc_depr); } else { - span_err!(diagnostic, item_sp, E0549, - "rustc_deprecated attribute must be paired with \ - either stable or unstable attribute"); + struct_span_err!( + diagnostic, + item_sp, + E0549, + "rustc_deprecated attribute must be paired with \ + either stable or unstable attribute" + ) + .emit(); } } @@ -518,10 +561,15 @@ fn find_stability_generic<'a, I>(sess: &ParseSess, stab.promotable = promotable; stab.allow_const_fn_ptr = allow_const_fn_ptr; } else { - span_err!(diagnostic, item_sp, E0717, - "rustc_promotable and rustc_allow_const_fn_ptr attributes \ + struct_span_err!( + diagnostic, + item_sp, + E0717, + "rustc_promotable and rustc_allow_const_fn_ptr attributes \ must be paired with either a rustc_const_unstable or a rustc_const_stable \ - attribute"); + attribute" + ) + .emit(); } } @@ -539,7 +587,10 @@ pub fn cfg_matches(cfg: &ast::MetaItem, sess: &ParseSess, features: Option<&Feat if let (Some(feats), Some(gated_cfg)) = (features, gate) { gate_cfg(&gated_cfg, cfg.span, sess, feats); } - let error = |span, msg| { sess.span_diagnostic.span_err(span, msg); true }; + let error = |span, msg| { + sess.span_diagnostic.span_err(span, msg); + true + }; if cfg.path.segments.len() != 1 { return error(cfg.path.span, "`cfg` predicate key must be an identifier"); } @@ -553,7 +604,7 @@ pub fn cfg_matches(cfg: &ast::MetaItem, sess: &ParseSess, features: Option<&Feat lit.span, AttrError::UnsupportedLiteral( "literal in `cfg` predicate value must be a string", - lit.kind.is_bytestr() + lit.kind.is_bytestr(), ), ); true @@ -588,10 +639,7 @@ pub fn eval_condition( handle_errors( sess, mi.span(), - AttrError::UnsupportedLiteral( - "unsupported literal", - false - ), + AttrError::UnsupportedLiteral("unsupported literal", false), ); return false; } @@ -600,33 +648,40 @@ pub fn eval_condition( // The unwraps below may look dangerous, but we've already asserted // that they won't fail with the loop above. match cfg.name_or_empty() { - sym::any => mis.iter().any(|mi| { - eval_condition(mi.meta_item().unwrap(), sess, eval) - }), - sym::all => mis.iter().all(|mi| { - eval_condition(mi.meta_item().unwrap(), sess, eval) - }), + sym::any => { + mis.iter().any(|mi| eval_condition(mi.meta_item().unwrap(), sess, eval)) + } + sym::all => { + mis.iter().all(|mi| eval_condition(mi.meta_item().unwrap(), sess, eval)) + } sym::not => { if mis.len() != 1 { - span_err!(sess.span_diagnostic, cfg.span, E0536, "expected 1 cfg-pattern"); + struct_span_err!( + sess.span_diagnostic, + cfg.span, + E0536, + "expected 1 cfg-pattern" + ) + .emit(); return false; } !eval_condition(mis[0].meta_item().unwrap(), sess, eval) - }, + } _ => { - span_err!( - sess.span_diagnostic, cfg.span, E0537, + struct_span_err!( + sess.span_diagnostic, + cfg.span, + E0537, "invalid predicate `{}`", pprust::path_to_string(&cfg.path) - ); + ) + .emit(); false } } - }, - ast::MetaItemKind::Word | ast::MetaItemKind::NameValue(..) => { - eval(cfg) } + ast::MetaItemKind::Word | ast::MetaItemKind::NameValue(..) => eval(cfg), } } @@ -637,16 +692,21 @@ pub struct Deprecation { } /// Finds the deprecation attribute. `None` if none exists. -pub fn find_deprecation(sess: &ParseSess, attrs: &[Attribute], - item_sp: Span) -> Option<Deprecation> { +pub fn find_deprecation( + sess: &ParseSess, + attrs: &[Attribute], + item_sp: Span, +) -> Option<Deprecation> { find_deprecation_generic(sess, attrs.iter(), item_sp) } -fn find_deprecation_generic<'a, I>(sess: &ParseSess, - attrs_iter: I, - item_sp: Span) - -> Option<Deprecation> - where I: Iterator<Item = &'a Attribute> +fn find_deprecation_generic<'a, I>( + sess: &ParseSess, + attrs_iter: I, + item_sp: Span, +) -> Option<Deprecation> +where + I: Iterator<Item = &'a Attribute>, { let mut depr: Option<Deprecation> = None; let diagnostic = &sess.span_diagnostic; @@ -657,8 +717,8 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess, } if depr.is_some() { - span_err!(diagnostic, item_sp, E0550, "multiple deprecated attributes"); - break + struct_span_err!(diagnostic, item_sp, E0550, "multiple deprecated attributes").emit(); + break; } let meta = match attr.meta() { @@ -668,9 +728,7 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess, depr = match &meta.kind { MetaItemKind::Word => Some(Deprecation { since: None, note: None }), MetaItemKind::NameValue(..) => { - meta.value_str().map(|note| { - Deprecation { since: None, note: Some(note) } - }) + meta.value_str().map(|note| Deprecation { since: None, note: Some(note) }) } MetaItemKind::List(list) => { let get = |meta: &MetaItem, item: &mut Option<Symbol>| { @@ -680,7 +738,7 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess, meta.span, AttrError::MultipleItem(pprust::path_to_string(&meta.path)), ); - return false + return false; } if let Some(v) = meta.value_str() { *item = Some(v); @@ -693,11 +751,12 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess, AttrError::UnsupportedLiteral( "literal in `deprecated` \ value must be a string", - lit.kind.is_bytestr() + lit.kind.is_bytestr(), ), ); } else { - span_err!(diagnostic, meta.span, E0551, "incorrect meta item"); + struct_span_err!(diagnostic, meta.span, E0551, "incorrect meta item") + .emit(); } false @@ -708,23 +767,29 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess, let mut note = None; for meta in list { match meta { - NestedMetaItem::MetaItem(mi) => { - match mi.name_or_empty() { - sym::since => if !get(mi, &mut since) { continue 'outer }, - sym::note => if !get(mi, &mut note) { continue 'outer }, - _ => { - handle_errors( - sess, - meta.span(), - AttrError::UnknownMetaItem( - pprust::path_to_string(&mi.path), - &["since", "note"], - ), - ); - continue 'outer + NestedMetaItem::MetaItem(mi) => match mi.name_or_empty() { + sym::since => { + if !get(mi, &mut since) { + continue 'outer; } } - } + sym::note => { + if !get(mi, &mut note) { + continue 'outer; + } + } + _ => { + handle_errors( + sess, + meta.span(), + AttrError::UnknownMetaItem( + pprust::path_to_string(&mi.path), + &["since", "note"], + ), + ); + continue 'outer; + } + }, NestedMetaItem::Literal(lit) => { handle_errors( sess, @@ -734,7 +799,7 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess, false, ), ); - continue 'outer + continue 'outer; } } } @@ -760,7 +825,7 @@ pub enum ReprAttr { #[derive(Eq, PartialEq, Debug, RustcEncodable, RustcDecodable, Copy, Clone, HashStable_Generic)] pub enum IntType { SignedInt(ast::IntTy), - UnsignedInt(ast::UintTy) + UnsignedInt(ast::UintTy), } impl IntType { @@ -770,7 +835,7 @@ impl IntType { match self { SignedInt(..) => true, - UnsignedInt(..) => false + UnsignedInt(..) => false, } } } @@ -800,7 +865,7 @@ pub fn find_repr_attrs(sess: &ParseSess, attr: &Attribute) -> Vec<ReprAttr> { false, ), ); - continue + continue; } let mut recognised = false; @@ -840,34 +905,43 @@ pub fn find_repr_attrs(sess: &ParseSess, attr: &Attribute) -> Vec<ReprAttr> { recognised = true; match parse_alignment(&value.kind) { Ok(literal) => acc.push(ReprAlign(literal)), - Err(message) => literal_error = Some(message) + Err(message) => literal_error = Some(message), }; - } - else if name == sym::packed { + } else if name == sym::packed { recognised = true; match parse_alignment(&value.kind) { Ok(literal) => acc.push(ReprPacked(literal)), - Err(message) => literal_error = Some(message) + Err(message) => literal_error = Some(message), }; } if let Some(literal_error) = literal_error { - span_err!(diagnostic, item.span(), E0589, - "invalid `repr(align)` attribute: {}", literal_error); + struct_span_err!( + diagnostic, + item.span(), + E0589, + "invalid `repr(align)` attribute: {}", + literal_error + ) + .emit(); } } else { if let Some(meta_item) = item.meta_item() { if meta_item.check_name(sym::align) { if let MetaItemKind::NameValue(ref value) = meta_item.kind { recognised = true; - let mut err = struct_span_err!(diagnostic, item.span(), E0693, - "incorrect `repr(align)` attribute format"); + let mut err = struct_span_err!( + diagnostic, + item.span(), + E0693, + "incorrect `repr(align)` attribute format" + ); match value.kind { ast::LitKind::Int(int, ast::LitIntType::Unsuffixed) => { err.span_suggestion( item.span(), "use parentheses instead", format!("align({})", int), - Applicability::MachineApplicable + Applicability::MachineApplicable, ); } ast::LitKind::Str(s, _) => { @@ -875,7 +949,7 @@ pub fn find_repr_attrs(sess: &ParseSess, attr: &Attribute) -> Vec<ReprAttr> { item.span(), "use parentheses instead", format!("align({})", s), - Applicability::MachineApplicable + Applicability::MachineApplicable, ); } _ => {} @@ -887,8 +961,13 @@ pub fn find_repr_attrs(sess: &ParseSess, attr: &Attribute) -> Vec<ReprAttr> { } if !recognised { // Not a word we recognize - span_err!(diagnostic, item.span(), E0552, - "unrecognized representation hint"); + struct_span_err!( + diagnostic, + item.span(), + E0552, + "unrecognized representation hint" + ) + .emit(); } } } @@ -912,7 +991,7 @@ fn int_type_of_word(s: Symbol) -> Option<IntType> { sym::u128 => Some(UnsignedInt(ast::UintTy::U128)), sym::isize => Some(SignedInt(ast::IntTy::Isize)), sym::usize => Some(UnsignedInt(ast::UintTy::Usize)), - _ => None + _ => None, } } @@ -922,7 +1001,8 @@ pub enum TransparencyError { } pub fn find_transparency( - attrs: &[Attribute], is_legacy: bool + attrs: &[Attribute], + is_legacy: bool, ) -> (Transparency, Option<TransparencyError>) { let mut transparency = None; let mut error = None; @@ -932,15 +1012,18 @@ pub fn find_transparency( error = Some(TransparencyError::MultipleTransparencyAttrs(old_span, attr.span)); break; } else if let Some(value) = attr.value_str() { - transparency = Some((match &*value.as_str() { - "transparent" => Transparency::Transparent, - "semitransparent" => Transparency::SemiTransparent, - "opaque" => Transparency::Opaque, - _ => { - error = Some(TransparencyError::UnknownTransparency(value, attr.span)); - continue; - } - }, attr.span)); + transparency = Some(( + match &*value.as_str() { + "transparent" => Transparency::Transparent, + "semitransparent" => Transparency::SemiTransparent, + "opaque" => Transparency::Opaque, + _ => { + error = Some(TransparencyError::UnknownTransparency(value, attr.span)); + continue; + } + }, + attr.span, + )); } } } diff --git a/src/libsyntax/attr/mod.rs b/src/libsyntax/attr/mod.rs index 079a0f6faf..ec05dab451 100644 --- a/src/libsyntax/attr/mod.rs +++ b/src/libsyntax/attr/mod.rs @@ -2,28 +2,27 @@ mod builtin; +pub use crate::ast::Attribute; pub use builtin::*; pub use IntType::*; pub use ReprAttr::*; pub use StabilityLevel::*; -pub use crate::ast::Attribute; use crate::ast; -use crate::ast::{AttrItem, AttrId, AttrKind, AttrStyle, Name, Ident, Path, PathSegment}; +use crate::ast::{AttrId, AttrItem, AttrKind, AttrStyle, AttrVec, Ident, Name, Path, PathSegment}; +use crate::ast::{Expr, GenericParam, Item, Lit, LitKind, Local, Stmt, StmtKind}; use crate::ast::{MacArgs, MacDelimiter, MetaItem, MetaItemKind, NestedMetaItem}; -use crate::ast::{Lit, LitKind, Expr, Item, Local, Stmt, StmtKind, GenericParam}; use crate::mut_visit::visit_clobber; -use crate::source_map::{BytePos, Spanned}; -use crate::token::{self, Token}; use crate::ptr::P; -use crate::symbol::{sym, Symbol}; -use crate::ThinVec; +use crate::token::{self, Token}; use crate::tokenstream::{DelimSpan, TokenStream, TokenTree, TreeAndJoint}; use crate::GLOBALS; -use log::debug; -use syntax_pos::Span; +use rustc_span::source_map::{BytePos, Spanned}; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; +use log::debug; use std::iter; use std::ops::DerefMut; @@ -35,9 +34,7 @@ pub fn mark_used(attr: &Attribute) { } pub fn is_used(attr: &Attribute) -> bool { - GLOBALS.with(|globals| { - globals.used_attrs.lock().contains(attr.id) - }) + GLOBALS.with(|globals| globals.used_attrs.lock().contains(attr.id)) } pub fn mark_known(attr: &Attribute) { @@ -48,9 +45,7 @@ pub fn mark_known(attr: &Attribute) { } pub fn is_known(attr: &Attribute) -> bool { - GLOBALS.with(|globals| { - globals.known_attrs.lock().contains(attr.id) - }) + GLOBALS.with(|globals| globals.known_attrs.lock().contains(attr.id)) } pub fn is_known_lint_tool(m_item: Ident) -> bool { @@ -62,7 +57,7 @@ impl NestedMetaItem { pub fn meta_item(&self) -> Option<&MetaItem> { match *self { NestedMetaItem::MetaItem(ref item) => Some(item), - _ => None + _ => None, } } @@ -70,7 +65,7 @@ impl NestedMetaItem { pub fn literal(&self) -> Option<&Lit> { match *self { NestedMetaItem::Literal(ref lit) => Some(lit), - _ => None + _ => None, } } @@ -95,18 +90,18 @@ impl NestedMetaItem { /// Returns a name and single literal value tuple of the `MetaItem`. pub fn name_value_literal(&self) -> Option<(Name, &Lit)> { - self.meta_item().and_then( - |meta_item| meta_item.meta_item_list().and_then( - |meta_item_list| { - if meta_item_list.len() == 1 { - if let Some(ident) = meta_item.ident() { - if let Some(lit) = meta_item_list[0].literal() { - return Some((ident.name, lit)); - } + self.meta_item().and_then(|meta_item| { + meta_item.meta_item_list().and_then(|meta_item_list| { + if meta_item_list.len() == 1 { + if let Some(ident) = meta_item.ident() { + if let Some(lit) = meta_item_list[0].literal() { + return Some((ident.name, lit)); } } - None - })) + } + None + }) + }) } /// Gets a list of inner meta items from a list `MetaItem` type. @@ -144,7 +139,7 @@ impl Attribute { pub fn has_name(&self, name: Symbol) -> bool { match self.kind { AttrKind::Normal(ref item) => item.path == name, - AttrKind::DocComment(_) => name == sym::doc, + AttrKind::DocComment(_) => false, } } @@ -168,7 +163,7 @@ impl Attribute { None } } - AttrKind::DocComment(_) => Some(Ident::new(sym::doc, self.span)), + AttrKind::DocComment(_) => None, } } pub fn name_or_empty(&self) -> Symbol { @@ -177,21 +172,17 @@ impl Attribute { pub fn value_str(&self) -> Option<Symbol> { match self.kind { - AttrKind::Normal(ref item) => { - item.meta(self.span).and_then(|meta| meta.value_str()) - } - AttrKind::DocComment(comment) => Some(comment), + AttrKind::Normal(ref item) => item.meta(self.span).and_then(|meta| meta.value_str()), + AttrKind::DocComment(..) => None, } } pub fn meta_item_list(&self) -> Option<Vec<NestedMetaItem>> { match self.kind { - AttrKind::Normal(ref item) => { - match item.meta(self.span) { - Some(MetaItem { kind: MetaItemKind::List(list), .. }) => Some(list), - _ => None - } - } + AttrKind::Normal(ref item) => match item.meta(self.span) { + Some(MetaItem { kind: MetaItemKind::List(list), .. }) => Some(list), + _ => None, + }, AttrKind::DocComment(_) => None, } } @@ -217,11 +208,7 @@ impl Attribute { impl MetaItem { /// For a single-segment meta item, returns its name; otherwise, returns `None`. pub fn ident(&self) -> Option<Ident> { - if self.path.segments.len() == 1 { - Some(self.path.segments[0].ident) - } else { - None - } + if self.path.segments.len() == 1 { Some(self.path.segments[0].ident) } else { None } } pub fn name_or_empty(&self) -> Symbol { self.ident().unwrap_or(Ident::invalid()).name @@ -239,20 +226,18 @@ impl MetaItem { pub fn value_str(&self) -> Option<Symbol> { match self.kind { - MetaItemKind::NameValue(ref v) => { - match v.kind { - LitKind::Str(ref s, _) => Some(*s), - _ => None, - } + MetaItemKind::NameValue(ref v) => match v.kind { + LitKind::Str(ref s, _) => Some(*s), + _ => None, }, - _ => None + _ => None, } } pub fn meta_item_list(&self) -> Option<&[NestedMetaItem]> { match self.kind { MetaItemKind::List(ref l) => Some(&l[..]), - _ => None + _ => None, } } @@ -294,17 +279,27 @@ impl Attribute { } } + pub fn doc_str(&self) -> Option<Symbol> { + match self.kind { + AttrKind::DocComment(symbol) => Some(symbol), + AttrKind::Normal(ref item) if item.path == sym::doc => { + item.meta(self.span).and_then(|meta| meta.value_str()) + } + _ => None, + } + } + pub fn get_normal_item(&self) -> &AttrItem { match self.kind { AttrKind::Normal(ref item) => item, - AttrKind::DocComment(_) => panic!("unexpected sugared doc"), + AttrKind::DocComment(_) => panic!("unexpected doc comment"), } } pub fn unwrap_normal_item(self) -> AttrItem { match self.kind { AttrKind::Normal(item) => item, - AttrKind::DocComment(_) => panic!("unexpected sugared doc"), + AttrKind::DocComment(_) => panic!("unexpected doc comment"), } } @@ -312,8 +307,7 @@ impl Attribute { pub fn meta(&self) -> Option<MetaItem> { match self.kind { AttrKind::Normal(ref item) => item.meta(self.span), - AttrKind::DocComment(comment) => - Some(mk_name_value_item_str(Ident::new(sym::doc, self.span), comment, self.span)), + AttrKind::DocComment(..) => None, } } } @@ -359,12 +353,7 @@ pub fn mk_attr(style: AttrStyle, path: Path, args: MacArgs, span: Span) -> Attri } pub fn mk_attr_from_item(style: AttrStyle, item: AttrItem, span: Span) -> Attribute { - Attribute { - kind: AttrKind::Normal(item), - id: mk_attr_id(), - style, - span, - } + Attribute { kind: AttrKind::Normal(item), id: mk_attr_id(), style, span } } /// Returns an inner attribute with the given value and span. @@ -378,24 +367,15 @@ pub fn mk_attr_outer(item: MetaItem) -> Attribute { } pub fn mk_doc_comment(style: AttrStyle, comment: Symbol, span: Span) -> Attribute { - Attribute { - kind: AttrKind::DocComment(comment), - id: mk_attr_id(), - style, - span, - } + Attribute { kind: AttrKind::DocComment(comment), id: mk_attr_id(), style, span } } pub fn list_contains_name(items: &[NestedMetaItem], name: Symbol) -> bool { - items.iter().any(|item| { - item.check_name(name) - }) + items.iter().any(|item| item.check_name(name)) } pub fn contains_name(attrs: &[Attribute], name: Symbol) -> bool { - attrs.iter().any(|item| { - item.check_name(name) - }) + attrs.iter().any(|item| item.check_name(name)) } pub fn find_by_name(attrs: &[Attribute], name: Symbol) -> Option<&Attribute> { @@ -404,37 +384,34 @@ pub fn find_by_name(attrs: &[Attribute], name: Symbol) -> Option<&Attribute> { pub fn allow_internal_unstable<'a>( attrs: &[Attribute], - span_diagnostic: &'a errors::Handler, + span_diagnostic: &'a rustc_errors::Handler, ) -> Option<impl Iterator<Item = Symbol> + 'a> { find_by_name(attrs, sym::allow_internal_unstable).and_then(|attr| { - attr.meta_item_list().or_else(|| { - span_diagnostic.span_err( - attr.span, - "allow_internal_unstable expects list of feature names" - ); - None - }).map(|features| features.into_iter().filter_map(move |it| { - let name = it.ident().map(|ident| ident.name); - if name.is_none() { - span_diagnostic.span_err( - it.span(), - "`allow_internal_unstable` expects feature names", - ) - } - name - })) + attr.meta_item_list() + .or_else(|| { + span_diagnostic + .span_err(attr.span, "allow_internal_unstable expects list of feature names"); + None + }) + .map(|features| { + features.into_iter().filter_map(move |it| { + let name = it.ident().map(|ident| ident.name); + if name.is_none() { + span_diagnostic + .span_err(it.span(), "`allow_internal_unstable` expects feature names") + } + name + }) + }) }) } -pub fn filter_by_name(attrs: &[Attribute], name: Symbol) - -> impl Iterator<Item=&Attribute> { +pub fn filter_by_name(attrs: &[Attribute], name: Symbol) -> impl Iterator<Item = &Attribute> { attrs.iter().filter(move |attr| attr.check_name(name)) } pub fn first_attr_value_str_by_name(attrs: &[Attribute], name: Symbol) -> Option<Symbol> { - attrs.iter() - .find(|at| at.check_name(name)) - .and_then(|at| at.value_str()) + attrs.iter().find(|at| at.check_name(name)).and_then(|at| at.value_str()) } impl MetaItem { @@ -444,9 +421,8 @@ impl MetaItem { for (i, segment) in self.path.segments.iter().enumerate() { let is_first = i == 0; if !is_first { - let mod_sep_span = Span::new(last_pos, - segment.ident.span.lo(), - segment.ident.span.ctxt()); + let mod_sep_span = + Span::new(last_pos, segment.ident.span.lo(), segment.ident.span.ctxt()); idents.push(TokenTree::token(token::ModSep, mod_sep_span).into()); } idents.push(TokenTree::Token(Token::from_ast_ident(segment.ident)).into()); @@ -457,15 +433,16 @@ impl MetaItem { } fn from_tokens<I>(tokens: &mut iter::Peekable<I>) -> Option<MetaItem> - where I: Iterator<Item = TokenTree>, + where + I: Iterator<Item = TokenTree>, { // FIXME: Share code with `parse_path`. let path = match tokens.next() { - Some(TokenTree::Token(Token { kind: kind @ token::Ident(..), span })) | - Some(TokenTree::Token(Token { kind: kind @ token::ModSep, span })) => 'arm: { + Some(TokenTree::Token(Token { kind: kind @ token::Ident(..), span })) + | Some(TokenTree::Token(Token { kind: kind @ token::ModSep, span })) => 'arm: { let mut segments = if let token::Ident(name, _) = kind { - if let Some(TokenTree::Token(Token { kind: token::ModSep, .. })) - = tokens.peek() { + if let Some(TokenTree::Token(Token { kind: token::ModSep, .. })) = tokens.peek() + { tokens.next(); vec![PathSegment::from_ident(Ident::new(name, span))] } else { @@ -475,14 +452,15 @@ impl MetaItem { vec![PathSegment::path_root(span)] }; loop { - if let Some(TokenTree::Token(Token { kind: token::Ident(name, _), span })) - = tokens.next() { + if let Some(TokenTree::Token(Token { kind: token::Ident(name, _), span })) = + tokens.next() + { segments.push(PathSegment::from_ident(Ident::new(name, span))); } else { return None; } - if let Some(TokenTree::Token(Token { kind: token::ModSep, .. })) - = tokens.peek() { + if let Some(TokenTree::Token(Token { kind: token::ModSep, .. })) = tokens.peek() + { tokens.next(); } else { break; @@ -525,7 +503,9 @@ impl MetaItemKind { tts.extend(item.token_trees_and_joints()) } MacArgs::Delimited( - DelimSpan::from_single(span), MacDelimiter::Parenthesis, TokenStream::new(tts) + DelimSpan::from_single(span), + MacDelimiter::Parenthesis, + TokenStream::new(tts), ) } } @@ -535,10 +515,7 @@ impl MetaItemKind { match *self { MetaItemKind::Word => vec![], MetaItemKind::NameValue(ref lit) => { - vec![ - TokenTree::token(token::Eq, span).into(), - lit.token_tree().into(), - ] + vec![TokenTree::token(token::Eq, span).into(), lit.token_tree().into()] } MetaItemKind::List(ref list) => { let mut tokens = Vec::new(); @@ -553,7 +530,8 @@ impl MetaItemKind { DelimSpan::from_single(span), token::Paren, TokenStream::new(tokens).into(), - ).into() + ) + .into(), ] } } @@ -577,16 +555,18 @@ impl MetaItemKind { tokens: &mut impl Iterator<Item = TokenTree>, ) -> Option<MetaItemKind> { match tokens.next() { - Some(TokenTree::Token(token)) => - Lit::from_token(&token).ok().map(MetaItemKind::NameValue), + Some(TokenTree::Token(token)) => { + Lit::from_token(&token).ok().map(MetaItemKind::NameValue) + } _ => None, } } fn from_mac_args(args: &MacArgs) -> Option<MetaItemKind> { match args { - MacArgs::Delimited(_, MacDelimiter::Parenthesis, tokens) => - MetaItemKind::list_from_tokens(tokens.clone()), + MacArgs::Delimited(_, MacDelimiter::Parenthesis, tokens) => { + MetaItemKind::list_from_tokens(tokens.clone()) + } MacArgs::Delimited(..) => None, MacArgs::Eq(_, tokens) => { assert!(tokens.len() == 1); @@ -631,7 +611,8 @@ impl NestedMetaItem { } fn from_tokens<I>(tokens: &mut iter::Peekable<I>) -> Option<NestedMetaItem> - where I: Iterator<Item = TokenTree>, + where + I: Iterator<Item = TokenTree>, { if let Some(TokenTree::Token(token)) = tokens.peek() { if let Ok(lit) = Lit::from_token(token) { @@ -650,7 +631,9 @@ pub trait HasAttrs: Sized { } impl<T: HasAttrs> HasAttrs for Spanned<T> { - fn attrs(&self) -> &[ast::Attribute] { self.node.attrs() } + fn attrs(&self) -> &[ast::Attribute] { + self.node.attrs() + } fn visit_attrs<F: FnOnce(&mut Vec<ast::Attribute>)>(&mut self, f: F) { self.node.visit_attrs(f); } @@ -665,7 +648,7 @@ impl HasAttrs for Vec<Attribute> { } } -impl HasAttrs for ThinVec<Attribute> { +impl HasAttrs for AttrVec { fn attrs(&self) -> &[Attribute] { self } @@ -749,6 +732,6 @@ macro_rules! derive_has_attrs { } derive_has_attrs! { - Item, Expr, Local, ast::ForeignItem, ast::StructField, ast::ImplItem, ast::TraitItem, ast::Arm, + Item, Expr, Local, ast::ForeignItem, ast::StructField, ast::AssocItem, ast::Arm, ast::Field, ast::FieldPat, ast::Variant, ast::Param } diff --git a/src/libsyntax/diagnostics/macros.rs b/src/libsyntax/diagnostics/macros.rs deleted file mode 100644 index 6679b4459a..0000000000 --- a/src/libsyntax/diagnostics/macros.rs +++ /dev/null @@ -1,169 +0,0 @@ -#[macro_export] -macro_rules! diagnostic_used { - ($code:ident) => ( - let _ = $code; - ) -} - -#[macro_export] -macro_rules! span_fatal { - ($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({ - $crate::diagnostic_used!($code); - $session.span_fatal_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - }) -} - -#[macro_export] -macro_rules! span_err { - ($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({ - $crate::diagnostic_used!($code); - $session.span_err_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - }) -} - -#[macro_export] -macro_rules! span_warn { - ($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({ - $crate::diagnostic_used!($code); - $session.span_warn_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - }) -} - -#[macro_export] -macro_rules! struct_err { - ($session:expr, $code:ident, $($message:tt)*) => ({ - $crate::diagnostic_used!($code); - $session.struct_err_with_code( - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - }) -} - -#[macro_export] -macro_rules! span_err_or_warn { - ($is_warning:expr, $session:expr, $span:expr, $code:ident, $($message:tt)*) => ({ - $crate::diagnostic_used!($code); - if $is_warning { - $session.span_warn_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - } else { - $session.span_err_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - } - }) -} - -#[macro_export] -macro_rules! struct_span_fatal { - ($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({ - $crate::diagnostic_used!($code); - $session.struct_span_fatal_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - }) -} - -#[macro_export] -macro_rules! struct_span_err { - ($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({ - $crate::diagnostic_used!($code); - $session.struct_span_err_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - }) -} - -#[macro_export] -macro_rules! stringify_error_code { - ($code:ident) => ({ - $crate::diagnostic_used!($code); - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()) - }) -} - -#[macro_export] -macro_rules! type_error_struct { - ($session:expr, $span:expr, $typ:expr, $code:ident, $($message:tt)*) => ({ - if $typ.references_error() { - $session.diagnostic().struct_dummy() - } else { - struct_span_err!($session, $span, $code, $($message)*) - } - }) -} - -#[macro_export] -macro_rules! struct_span_warn { - ($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({ - $crate::diagnostic_used!($code); - $session.struct_span_warn_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - }) -} - -#[macro_export] -macro_rules! struct_span_err_or_warn { - ($is_warning:expr, $session:expr, $span:expr, $code:ident, $($message:tt)*) => ({ - $crate::diagnostic_used!($code); - if $is_warning { - $session.struct_span_warn_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - } else { - $session.struct_span_err_with_code( - $span, - &format!($($message)*), - $crate::errors::DiagnosticId::Error(stringify!($code).to_owned()), - ) - } - }) -} - -#[macro_export] -macro_rules! span_note { - ($err:expr, $span:expr, $($message:tt)*) => ({ - ($err).span_note($span, &format!($($message)*)); - }) -} - -#[macro_export] -macro_rules! span_help { - ($err:expr, $span:expr, $($message:tt)*) => ({ - ($err).span_help($span, &format!($($message)*)); - }) -} - -#[macro_export] -macro_rules! help { - ($err:expr, $($message:tt)*) => ({ - ($err).help(&format!($($message)*)); - }) -} diff --git a/src/libsyntax/early_buffered_lints.rs b/src/libsyntax/early_buffered_lints.rs deleted file mode 100644 index 2c32894a23..0000000000 --- a/src/libsyntax/early_buffered_lints.rs +++ /dev/null @@ -1,30 +0,0 @@ -//! Allows the buffering of lints for later. -//! -//! Since we cannot have a dependency on `librustc`, we implement some types here that are somewhat -//! redundant. Later, these types can be converted to types for use by the rest of the compiler. - -use rustc_session::lint::FutureIncompatibleInfo; -use rustc_session::declare_lint; -pub use rustc_session::lint::BufferedEarlyLint; - -declare_lint! { - pub ILL_FORMED_ATTRIBUTE_INPUT, - Deny, - "ill-formed attribute inputs that were previously accepted and used in practice", - @future_incompatible = FutureIncompatibleInfo { - reference: "issue #57571 <https://github.com/rust-lang/rust/issues/57571>", - edition: None, - }; -} - -declare_lint! { - pub META_VARIABLE_MISUSE, - Allow, - "possible meta-variable misuse at macro definition" -} - -declare_lint! { - pub INCOMPLETE_INCLUDE, - Deny, - "trailing content in included file" -} diff --git a/src/libsyntax/entry.rs b/src/libsyntax/entry.rs index 34b5b1e5b5..0a72019bfe 100644 --- a/src/libsyntax/entry.rs +++ b/src/libsyntax/entry.rs @@ -1,6 +1,6 @@ -use crate::attr; use crate::ast::{Item, ItemKind}; -use crate::symbol::sym; +use crate::attr; +use rustc_span::symbol::sym; pub enum EntryPointType { None, diff --git a/src/libsyntax/expand/allocator.rs b/src/libsyntax/expand/allocator.rs index cc3eeed04a..fbeeb47c23 100644 --- a/src/libsyntax/expand/allocator.rs +++ b/src/libsyntax/expand/allocator.rs @@ -1,6 +1,6 @@ use crate::{ast, attr, visit}; -use syntax_pos::symbol::{sym, Symbol}; -use syntax_pos::Span; +use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; #[derive(Clone, Copy)] pub enum AllocatorKind { @@ -55,11 +55,15 @@ pub static ALLOCATOR_METHODS: &[AllocatorMethod] = &[ ]; pub fn global_allocator_spans(krate: &ast::Crate) -> Vec<Span> { - struct Finder { name: Symbol, spans: Vec<Span> } + struct Finder { + name: Symbol, + spans: Vec<Span>, + } impl<'ast> visit::Visitor<'ast> for Finder { fn visit_item(&mut self, item: &'ast ast::Item) { - if item.ident.name == self.name && - attr::contains_name(&item.attrs, sym::rustc_std_internal_symbol) { + if item.ident.name == self.name + && attr::contains_name(&item.attrs, sym::rustc_std_internal_symbol) + { self.spans.push(item.span); } visit::walk_item(self, item) diff --git a/src/libsyntax/expand/mod.rs b/src/libsyntax/expand/mod.rs index 03b30fda74..50df8fa39e 100644 --- a/src/libsyntax/expand/mod.rs +++ b/src/libsyntax/expand/mod.rs @@ -1,11 +1,12 @@ //! Definitions shared by macros / syntax extensions and e.g. librustc. use crate::ast::Attribute; -use syntax_pos::symbol::sym; +use rustc_span::symbol::sym; pub mod allocator; pub fn is_proc_macro_attr(attr: &Attribute) -> bool { [sym::proc_macro, sym::proc_macro_attribute, sym::proc_macro_derive] - .iter().any(|kind| attr.check_name(*kind)) + .iter() + .any(|kind| attr.check_name(*kind)) } diff --git a/src/libsyntax/feature_gate/check.rs b/src/libsyntax/feature_gate/check.rs deleted file mode 100644 index 99d89183e5..0000000000 --- a/src/libsyntax/feature_gate/check.rs +++ /dev/null @@ -1,877 +0,0 @@ -use rustc_feature::{ACCEPTED_FEATURES, ACTIVE_FEATURES, REMOVED_FEATURES, STABLE_REMOVED_FEATURES}; -use rustc_feature::{AttributeGate, BUILTIN_ATTRIBUTE_MAP}; -use rustc_feature::{Features, Feature, State as FeatureState, UnstableFeatures}; -use rustc_feature::{find_feature_issue, GateIssue}; - -use crate::ast::{self, AssocTyConstraint, AssocTyConstraintKind, NodeId}; -use crate::ast::{GenericParam, GenericParamKind, PatKind, RangeEnd, VariantData}; -use crate::attr; -use crate::source_map::Spanned; -use crate::edition::{ALL_EDITIONS, Edition}; -use crate::visit::{self, FnKind, Visitor}; -use crate::sess::ParseSess; -use crate::symbol::{Symbol, sym}; - -use errors::{Applicability, DiagnosticBuilder, Handler}; -use rustc_data_structures::fx::FxHashMap; -use syntax_pos::{Span, DUMMY_SP, MultiSpan}; -use log::debug; - -use rustc_error_codes::*; - -macro_rules! gate_feature_fn { - ($cx: expr, $has_feature: expr, $span: expr, $name: expr, $explain: expr, $level: expr) => {{ - let (cx, has_feature, span, - name, explain, level) = (&*$cx, $has_feature, $span, $name, $explain, $level); - let has_feature: bool = has_feature(&$cx.features); - debug!("gate_feature(feature = {:?}, span = {:?}); has? {}", name, span, has_feature); - if !has_feature && !span.allows_unstable($name) { - leveled_feature_err(cx.parse_sess, name, span, GateIssue::Language, explain, level) - .emit(); - } - }} -} - -macro_rules! gate_feature { - ($cx: expr, $feature: ident, $span: expr, $explain: expr) => { - gate_feature_fn!($cx, |x:&Features| x.$feature, $span, - sym::$feature, $explain, GateStrength::Hard) - }; - ($cx: expr, $feature: ident, $span: expr, $explain: expr, $level: expr) => { - gate_feature_fn!($cx, |x:&Features| x.$feature, $span, - sym::$feature, $explain, $level) - }; -} - -pub fn check_attribute(attr: &ast::Attribute, parse_sess: &ParseSess, features: &Features) { - PostExpansionVisitor { parse_sess, features }.visit_attribute(attr) -} - -#[derive(Debug, Copy, Clone, PartialEq)] -pub enum GateStrength { - /// A hard error. (Most feature gates should use this.) - Hard, - /// Only a warning. (Use this only as backwards-compatibility demands.) - Soft, -} - -pub fn feature_err<'a>( - sess: &'a ParseSess, - feature: Symbol, - span: impl Into<MultiSpan>, - explain: &str, -) -> DiagnosticBuilder<'a> { - feature_err_issue(sess, feature, span, GateIssue::Language, explain) -} - -pub fn feature_err_issue<'a>( - sess: &'a ParseSess, - feature: Symbol, - span: impl Into<MultiSpan>, - issue: GateIssue, - explain: &str, -) -> DiagnosticBuilder<'a> { - leveled_feature_err(sess, feature, span, issue, explain, GateStrength::Hard) -} - -fn leveled_feature_err<'a>( - sess: &'a ParseSess, - feature: Symbol, - span: impl Into<MultiSpan>, - issue: GateIssue, - explain: &str, - level: GateStrength, -) -> DiagnosticBuilder<'a> { - let diag = &sess.span_diagnostic; - - let mut err = match level { - GateStrength::Hard => { - diag.struct_span_err_with_code(span, explain, stringify_error_code!(E0658)) - } - GateStrength::Soft => diag.struct_span_warn(span, explain), - }; - - if let Some(n) = find_feature_issue(feature, issue) { - err.note(&format!( - "for more information, see https://github.com/rust-lang/rust/issues/{}", - n, - )); - } - - // #23973: do not suggest `#![feature(...)]` if we are in beta/stable - if sess.unstable_features.is_nightly_build() { - err.help(&format!("add `#![feature({})]` to the crate attributes to enable", feature)); - } - - // If we're on stable and only emitting a "soft" warning, add a note to - // clarify that the feature isn't "on" (rather than being on but - // warning-worthy). - if !sess.unstable_features.is_nightly_build() && level == GateStrength::Soft { - err.help("a nightly build of the compiler is required to enable this feature"); - } - - err - -} - -struct PostExpansionVisitor<'a> { - parse_sess: &'a ParseSess, - features: &'a Features, -} - -macro_rules! gate_feature_post { - ($cx: expr, $feature: ident, $span: expr, $explain: expr) => {{ - let (cx, span) = ($cx, $span); - if !span.allows_unstable(sym::$feature) { - gate_feature!(cx, $feature, span, $explain) - } - }}; - ($cx: expr, $feature: ident, $span: expr, $explain: expr, $level: expr) => {{ - let (cx, span) = ($cx, $span); - if !span.allows_unstable(sym::$feature) { - gate_feature!(cx, $feature, span, $explain, $level) - } - }} -} - -impl<'a> PostExpansionVisitor<'a> { - fn check_abi(&self, abi: ast::StrLit) { - let ast::StrLit { symbol_unescaped, span, .. } = abi; - - match &*symbol_unescaped.as_str() { - // Stable - "Rust" | - "C" | - "cdecl" | - "stdcall" | - "fastcall" | - "aapcs" | - "win64" | - "sysv64" | - "system" => {} - "rust-intrinsic" => { - gate_feature_post!(&self, intrinsics, span, - "intrinsics are subject to change"); - }, - "platform-intrinsic" => { - gate_feature_post!(&self, platform_intrinsics, span, - "platform intrinsics are experimental and possibly buggy"); - }, - "vectorcall" => { - gate_feature_post!(&self, abi_vectorcall, span, - "vectorcall is experimental and subject to change"); - }, - "thiscall" => { - gate_feature_post!(&self, abi_thiscall, span, - "thiscall is experimental and subject to change"); - }, - "rust-call" => { - gate_feature_post!(&self, unboxed_closures, span, - "rust-call ABI is subject to change"); - }, - "ptx-kernel" => { - gate_feature_post!(&self, abi_ptx, span, - "PTX ABIs are experimental and subject to change"); - }, - "unadjusted" => { - gate_feature_post!(&self, abi_unadjusted, span, - "unadjusted ABI is an implementation detail and perma-unstable"); - }, - "msp430-interrupt" => { - gate_feature_post!(&self, abi_msp430_interrupt, span, - "msp430-interrupt ABI is experimental and subject to change"); - }, - "x86-interrupt" => { - gate_feature_post!(&self, abi_x86_interrupt, span, - "x86-interrupt ABI is experimental and subject to change"); - }, - "amdgpu-kernel" => { - gate_feature_post!(&self, abi_amdgpu_kernel, span, - "amdgpu-kernel ABI is experimental and subject to change"); - }, - "efiapi" => { - gate_feature_post!(&self, abi_efiapi, span, - "efiapi ABI is experimental and subject to change"); - }, - abi => { - self.parse_sess.span_diagnostic.delay_span_bug( - span, - &format!("unrecognized ABI not caught in lowering: {}", abi), - ) - } - } - } - - fn check_extern(&self, ext: ast::Extern) { - if let ast::Extern::Explicit(abi) = ext { - self.check_abi(abi); - } - } - - fn maybe_report_invalid_custom_discriminants(&self, variants: &[ast::Variant]) { - let has_fields = variants.iter().any(|variant| match variant.data { - VariantData::Tuple(..) | VariantData::Struct(..) => true, - VariantData::Unit(..) => false, - }); - - let discriminant_spans = variants.iter().filter(|variant| match variant.data { - VariantData::Tuple(..) | VariantData::Struct(..) => false, - VariantData::Unit(..) => true, - }) - .filter_map(|variant| variant.disr_expr.as_ref().map(|c| c.value.span)) - .collect::<Vec<_>>(); - - if !discriminant_spans.is_empty() && has_fields { - let mut err = feature_err( - self.parse_sess, - sym::arbitrary_enum_discriminant, - discriminant_spans.clone(), - "custom discriminant values are not allowed in enums with tuple or struct variants", - ); - for sp in discriminant_spans { - err.span_label(sp, "disallowed custom discriminant"); - } - for variant in variants.iter() { - match &variant.data { - VariantData::Struct(..) => { - err.span_label( - variant.span, - "struct variant defined here", - ); - } - VariantData::Tuple(..) => { - err.span_label( - variant.span, - "tuple variant defined here", - ); - } - VariantData::Unit(..) => {} - } - } - err.emit(); - } - } - - fn check_gat(&self, generics: &ast::Generics, span: Span) { - if !generics.params.is_empty() { - gate_feature_post!( - &self, - generic_associated_types, - span, - "generic associated types are unstable" - ); - } - if !generics.where_clause.predicates.is_empty() { - gate_feature_post!( - &self, - generic_associated_types, - span, - "where clauses on associated types are unstable" - ); - } - } - - /// Feature gate `impl Trait` inside `type Alias = $type_expr;`. - fn check_impl_trait(&self, ty: &ast::Ty) { - struct ImplTraitVisitor<'a> { - vis: &'a PostExpansionVisitor<'a>, - } - impl Visitor<'_> for ImplTraitVisitor<'_> { - fn visit_ty(&mut self, ty: &ast::Ty) { - if let ast::TyKind::ImplTrait(..) = ty.kind { - gate_feature_post!( - &self.vis, - type_alias_impl_trait, - ty.span, - "`impl Trait` in type aliases is unstable" - ); - } - visit::walk_ty(self, ty); - } - } - ImplTraitVisitor { vis: self }.visit_ty(ty); - } -} - -impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { - fn visit_attribute(&mut self, attr: &ast::Attribute) { - let attr_info = - attr.ident().and_then(|ident| BUILTIN_ATTRIBUTE_MAP.get(&ident.name)).map(|a| **a); - // Check feature gates for built-in attributes. - if let Some((.., AttributeGate::Gated(_, name, descr, has_feature))) = attr_info { - gate_feature_fn!(self, has_feature, attr.span, name, descr, GateStrength::Hard); - } - // Check unstable flavors of the `#[doc]` attribute. - if attr.check_name(sym::doc) { - for nested_meta in attr.meta_item_list().unwrap_or_default() { - macro_rules! gate_doc { ($($name:ident => $feature:ident)*) => { - $(if nested_meta.check_name(sym::$name) { - let msg = concat!("`#[doc(", stringify!($name), ")]` is experimental"); - gate_feature!(self, $feature, attr.span, msg); - })* - }} - - gate_doc!( - include => external_doc - cfg => doc_cfg - masked => doc_masked - spotlight => doc_spotlight - alias => doc_alias - keyword => doc_keyword - ); - } - } - } - - fn visit_name(&mut self, sp: Span, name: ast::Name) { - if !name.as_str().is_ascii() { - gate_feature_post!( - &self, - non_ascii_idents, - self.parse_sess.source_map().def_span(sp), - "non-ascii idents are not fully supported" - ); - } - } - - fn visit_item(&mut self, i: &'a ast::Item) { - match i.kind { - ast::ItemKind::ForeignMod(ref foreign_module) => { - if let Some(abi) = foreign_module.abi { - self.check_abi(abi); - } - } - - ast::ItemKind::Fn(..) => { - if attr::contains_name(&i.attrs[..], sym::plugin_registrar) { - gate_feature_post!(&self, plugin_registrar, i.span, - "compiler plugins are experimental and possibly buggy"); - } - if attr::contains_name(&i.attrs[..], sym::start) { - gate_feature_post!(&self, start, i.span, - "a `#[start]` function is an experimental \ - feature whose signature may change \ - over time"); - } - if attr::contains_name(&i.attrs[..], sym::main) { - gate_feature_post!(&self, main, i.span, - "declaration of a non-standard `#[main]` \ - function may change over time, for now \ - a top-level `fn main()` is required"); - } - } - - ast::ItemKind::Struct(..) => { - for attr in attr::filter_by_name(&i.attrs[..], sym::repr) { - for item in attr.meta_item_list().unwrap_or_else(Vec::new) { - if item.check_name(sym::simd) { - gate_feature_post!(&self, repr_simd, attr.span, - "SIMD types are experimental and possibly buggy"); - } - } - } - } - - ast::ItemKind::Enum(ast::EnumDef{ref variants, ..}, ..) => { - for variant in variants { - match (&variant.data, &variant.disr_expr) { - (ast::VariantData::Unit(..), _) => {}, - (_, Some(disr_expr)) => - gate_feature_post!( - &self, - arbitrary_enum_discriminant, - disr_expr.value.span, - "discriminants on non-unit variants are experimental"), - _ => {}, - } - } - - let has_feature = self.features.arbitrary_enum_discriminant; - if !has_feature && !i.span.allows_unstable(sym::arbitrary_enum_discriminant) { - self.maybe_report_invalid_custom_discriminants(&variants); - } - } - - ast::ItemKind::Impl(_, polarity, defaultness, ..) => { - if polarity == ast::ImplPolarity::Negative { - gate_feature_post!(&self, optin_builtin_traits, - i.span, - "negative trait bounds are not yet fully implemented; \ - use marker types for now"); - } - - if let ast::Defaultness::Default = defaultness { - gate_feature_post!(&self, specialization, - i.span, - "specialization is unstable"); - } - } - - ast::ItemKind::Trait(ast::IsAuto::Yes, ..) => { - gate_feature_post!(&self, optin_builtin_traits, - i.span, - "auto traits are experimental and possibly buggy"); - } - - ast::ItemKind::TraitAlias(..) => { - gate_feature_post!( - &self, - trait_alias, - i.span, - "trait aliases are experimental" - ); - } - - ast::ItemKind::MacroDef(ast::MacroDef { legacy: false, .. }) => { - let msg = "`macro` is experimental"; - gate_feature_post!(&self, decl_macro, i.span, msg); - } - - ast::ItemKind::TyAlias(ref ty, ..) => self.check_impl_trait(&ty), - - _ => {} - } - - visit::walk_item(self, i); - } - - fn visit_foreign_item(&mut self, i: &'a ast::ForeignItem) { - match i.kind { - ast::ForeignItemKind::Fn(..) | - ast::ForeignItemKind::Static(..) => { - let link_name = attr::first_attr_value_str_by_name(&i.attrs, sym::link_name); - let links_to_llvm = match link_name { - Some(val) => val.as_str().starts_with("llvm."), - _ => false - }; - if links_to_llvm { - gate_feature_post!(&self, link_llvm_intrinsics, i.span, - "linking to LLVM intrinsics is experimental"); - } - } - ast::ForeignItemKind::Ty => { - gate_feature_post!(&self, extern_types, i.span, - "extern types are experimental"); - } - ast::ForeignItemKind::Macro(..) => {} - } - - visit::walk_foreign_item(self, i) - } - - fn visit_ty(&mut self, ty: &'a ast::Ty) { - match ty.kind { - ast::TyKind::BareFn(ref bare_fn_ty) => { - self.check_extern(bare_fn_ty.ext); - } - ast::TyKind::Never => { - gate_feature_post!(&self, never_type, ty.span, - "The `!` type is experimental"); - } - _ => {} - } - visit::walk_ty(self, ty) - } - - fn visit_fn_ret_ty(&mut self, ret_ty: &'a ast::FunctionRetTy) { - if let ast::FunctionRetTy::Ty(ref output_ty) = *ret_ty { - if let ast::TyKind::Never = output_ty.kind { - // Do nothing. - } else { - self.visit_ty(output_ty) - } - } - } - - fn visit_expr(&mut self, e: &'a ast::Expr) { - match e.kind { - ast::ExprKind::Box(_) => { - gate_feature_post!( - &self, box_syntax, e.span, - "box expression syntax is experimental; you can call `Box::new` instead" - ); - } - ast::ExprKind::Type(..) => { - // To avoid noise about type ascription in common syntax errors, only emit if it - // is the *only* error. - if self.parse_sess.span_diagnostic.err_count() == 0 { - gate_feature_post!(&self, type_ascription, e.span, - "type ascription is experimental"); - } - } - ast::ExprKind::TryBlock(_) => { - gate_feature_post!(&self, try_blocks, e.span, "`try` expression is experimental"); - } - ast::ExprKind::Block(_, opt_label) => { - if let Some(label) = opt_label { - gate_feature_post!(&self, label_break_value, label.ident.span, - "labels on blocks are unstable"); - } - } - _ => {} - } - visit::walk_expr(self, e) - } - - fn visit_arm(&mut self, arm: &'a ast::Arm) { - visit::walk_arm(self, arm) - } - - fn visit_pat(&mut self, pattern: &'a ast::Pat) { - match &pattern.kind { - PatKind::Slice(pats) => { - for pat in &*pats { - let span = pat.span; - let inner_pat = match &pat.kind { - PatKind::Ident(.., Some(pat)) => pat, - _ => pat, - }; - if inner_pat.is_rest() { - gate_feature_post!( - &self, - slice_patterns, - span, - "subslice patterns are unstable" - ); - } - } - } - PatKind::Box(..) => { - gate_feature_post!(&self, box_patterns, - pattern.span, - "box pattern syntax is experimental"); - } - PatKind::Range(_, _, Spanned { node: RangeEnd::Excluded, .. }) => { - gate_feature_post!(&self, exclusive_range_pattern, pattern.span, - "exclusive range pattern syntax is experimental"); - } - _ => {} - } - visit::walk_pat(self, pattern) - } - - fn visit_fn(&mut self, - fn_kind: FnKind<'a>, - fn_decl: &'a ast::FnDecl, - span: Span, - _node_id: NodeId) { - if let Some(header) = fn_kind.header() { - // Stability of const fn methods are covered in - // `visit_trait_item` and `visit_impl_item` below; this is - // because default methods don't pass through this point. - self.check_extern(header.ext); - } - - if fn_decl.c_variadic() { - gate_feature_post!(&self, c_variadic, span, "C-variadic functions are unstable"); - } - - visit::walk_fn(self, fn_kind, fn_decl, span) - } - - fn visit_generic_param(&mut self, param: &'a GenericParam) { - match param.kind { - GenericParamKind::Const { .. } => - gate_feature_post!(&self, const_generics, param.ident.span, - "const generics are unstable"), - _ => {} - } - visit::walk_generic_param(self, param) - } - - fn visit_assoc_ty_constraint(&mut self, constraint: &'a AssocTyConstraint) { - match constraint.kind { - AssocTyConstraintKind::Bound { .. } => - gate_feature_post!(&self, associated_type_bounds, constraint.span, - "associated type bounds are unstable"), - _ => {} - } - visit::walk_assoc_ty_constraint(self, constraint) - } - - fn visit_trait_item(&mut self, ti: &'a ast::TraitItem) { - match ti.kind { - ast::TraitItemKind::Method(ref sig, ref block) => { - if block.is_none() { - self.check_extern(sig.header.ext); - } - if sig.decl.c_variadic() { - gate_feature_post!(&self, c_variadic, ti.span, - "C-variadic functions are unstable"); - } - if sig.header.constness.node == ast::Constness::Const { - gate_feature_post!(&self, const_fn, ti.span, "const fn is unstable"); - } - } - ast::TraitItemKind::Type(_, ref default) => { - if let Some(ty) = default { - self.check_impl_trait(ty); - gate_feature_post!(&self, associated_type_defaults, ti.span, - "associated type defaults are unstable"); - } - self.check_gat(&ti.generics, ti.span); - } - _ => {} - } - visit::walk_trait_item(self, ti) - } - - fn visit_impl_item(&mut self, ii: &'a ast::ImplItem) { - if ii.defaultness == ast::Defaultness::Default { - gate_feature_post!(&self, specialization, - ii.span, - "specialization is unstable"); - } - - match ii.kind { - ast::ImplItemKind::Method(ref sig, _) => { - if sig.decl.c_variadic() { - gate_feature_post!(&self, c_variadic, ii.span, - "C-variadic functions are unstable"); - } - } - ast::ImplItemKind::TyAlias(ref ty) => { - self.check_impl_trait(ty); - self.check_gat(&ii.generics, ii.span); - } - _ => {} - } - visit::walk_impl_item(self, ii) - } - - fn visit_vis(&mut self, vis: &'a ast::Visibility) { - if let ast::VisibilityKind::Crate(ast::CrateSugar::JustCrate) = vis.node { - gate_feature_post!(&self, crate_visibility_modifier, vis.span, - "`crate` visibility modifier is experimental"); - } - visit::walk_vis(self, vis) - } -} - -pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute], - crate_edition: Edition, allow_features: &Option<Vec<String>>) -> Features { - fn feature_removed(span_handler: &Handler, span: Span, reason: Option<&str>) { - let mut err = struct_span_err!(span_handler, span, E0557, "feature has been removed"); - err.span_label(span, "feature has been removed"); - if let Some(reason) = reason { - err.note(reason); - } - err.emit(); - } - - let mut features = Features::default(); - let mut edition_enabled_features = FxHashMap::default(); - - for &edition in ALL_EDITIONS { - if edition <= crate_edition { - // The `crate_edition` implies its respective umbrella feature-gate - // (i.e., `#![feature(rust_20XX_preview)]` isn't needed on edition 20XX). - edition_enabled_features.insert(edition.feature_name(), edition); - } - } - - for feature in active_features_up_to(crate_edition) { - feature.set(&mut features, DUMMY_SP); - edition_enabled_features.insert(feature.name, crate_edition); - } - - // Process the edition umbrella feature-gates first, to ensure - // `edition_enabled_features` is completed before it's queried. - for attr in krate_attrs { - if !attr.check_name(sym::feature) { - continue - } - - let list = match attr.meta_item_list() { - Some(list) => list, - None => continue, - }; - - for mi in list { - if !mi.is_word() { - continue; - } - - let name = mi.name_or_empty(); - - let edition = ALL_EDITIONS.iter().find(|e| name == e.feature_name()).copied(); - if let Some(edition) = edition { - if edition <= crate_edition { - continue; - } - - for feature in active_features_up_to(edition) { - // FIXME(Manishearth) there is currently no way to set - // lib features by edition - feature.set(&mut features, DUMMY_SP); - edition_enabled_features.insert(feature.name, edition); - } - } - } - } - - for attr in krate_attrs { - if !attr.check_name(sym::feature) { - continue - } - - let list = match attr.meta_item_list() { - Some(list) => list, - None => continue, - }; - - let bad_input = |span| { - struct_span_err!(span_handler, span, E0556, "malformed `feature` attribute input") - }; - - for mi in list { - let name = match mi.ident() { - Some(ident) if mi.is_word() => ident.name, - Some(ident) => { - bad_input(mi.span()).span_suggestion( - mi.span(), - "expected just one word", - format!("{}", ident.name), - Applicability::MaybeIncorrect, - ).emit(); - continue - } - None => { - bad_input(mi.span()).span_label(mi.span(), "expected just one word").emit(); - continue - } - }; - - if let Some(edition) = edition_enabled_features.get(&name) { - struct_span_warn!( - span_handler, - mi.span(), - E0705, - "the feature `{}` is included in the Rust {} edition", - name, - edition, - ).emit(); - continue; - } - - if ALL_EDITIONS.iter().any(|e| name == e.feature_name()) { - // Handled in the separate loop above. - continue; - } - - let removed = REMOVED_FEATURES.iter().find(|f| name == f.name); - let stable_removed = STABLE_REMOVED_FEATURES.iter().find(|f| name == f.name); - if let Some(Feature { state, .. }) = removed.or(stable_removed) { - if let FeatureState::Removed { reason } - | FeatureState::Stabilized { reason } = state - { - feature_removed(span_handler, mi.span(), *reason); - continue; - } - } - - if let Some(Feature { since, .. }) = ACCEPTED_FEATURES.iter().find(|f| name == f.name) { - let since = Some(Symbol::intern(since)); - features.declared_lang_features.push((name, mi.span(), since)); - continue; - } - - if let Some(allowed) = allow_features.as_ref() { - if allowed.iter().find(|&f| name.as_str() == *f).is_none() { - span_err!(span_handler, mi.span(), E0725, - "the feature `{}` is not in the list of allowed features", - name); - continue; - } - } - - if let Some(f) = ACTIVE_FEATURES.iter().find(|f| name == f.name) { - f.set(&mut features, mi.span()); - features.declared_lang_features.push((name, mi.span(), None)); - continue; - } - - features.declared_lib_features.push((name, mi.span())); - } - } - - features -} - -fn active_features_up_to(edition: Edition) -> impl Iterator<Item=&'static Feature> { - ACTIVE_FEATURES.iter() - .filter(move |feature| { - if let Some(feature_edition) = feature.edition { - feature_edition <= edition - } else { - false - } - }) -} - -pub fn check_crate(krate: &ast::Crate, - parse_sess: &ParseSess, - features: &Features, - unstable: UnstableFeatures) { - maybe_stage_features(&parse_sess.span_diagnostic, krate, unstable); - let mut visitor = PostExpansionVisitor { parse_sess, features }; - - let spans = parse_sess.gated_spans.spans.borrow(); - macro_rules! gate_all { - ($gate:ident, $msg:literal) => { - for span in spans.get(&sym::$gate).unwrap_or(&vec![]) { - gate_feature!(&visitor, $gate, *span, $msg); - } - } - } - gate_all!(let_chains, "`let` expressions in this position are experimental"); - gate_all!(async_closure, "async closures are unstable"); - gate_all!(generators, "yield syntax is experimental"); - gate_all!(or_patterns, "or-patterns syntax is experimental"); - gate_all!(const_extern_fn, "`const extern fn` definitions are unstable"); - gate_all!(raw_ref_op, "raw address of syntax is experimental"); - - // All uses of `gate_all!` below this point were added in #65742, - // and subsequently disabled (with the non-early gating readded). - macro_rules! gate_all { - ($gate:ident, $msg:literal) => { - // FIXME(eddyb) do something more useful than always - // disabling these uses of early feature-gatings. - if false { - for span in spans.get(&sym::$gate).unwrap_or(&vec![]) { - gate_feature!(&visitor, $gate, *span, $msg); - } - } - } - } - - gate_all!(trait_alias, "trait aliases are experimental"); - gate_all!(associated_type_bounds, "associated type bounds are unstable"); - gate_all!(crate_visibility_modifier, "`crate` visibility modifier is experimental"); - gate_all!(const_generics, "const generics are unstable"); - gate_all!(decl_macro, "`macro` is experimental"); - gate_all!(box_patterns, "box pattern syntax is experimental"); - gate_all!(exclusive_range_pattern, "exclusive range pattern syntax is experimental"); - gate_all!(try_blocks, "`try` blocks are unstable"); - gate_all!(label_break_value, "labels on blocks are unstable"); - gate_all!(box_syntax, "box expression syntax is experimental; you can call `Box::new` instead"); - // To avoid noise about type ascription in common syntax errors, - // only emit if it is the *only* error. (Also check it last.) - if parse_sess.span_diagnostic.err_count() == 0 { - gate_all!(type_ascription, "type ascription is experimental"); - } - - visit::walk_crate(&mut visitor, krate); -} - -fn maybe_stage_features(span_handler: &Handler, krate: &ast::Crate, unstable: UnstableFeatures) { - if !unstable.is_nightly_build() { - for attr in krate.attrs.iter().filter(|attr| attr.check_name(sym::feature)) { - span_err!( - span_handler, attr.span, E0554, - "`#![feature]` may not be used on the {} release channel", - option_env!("CFG_RELEASE_CHANNEL").unwrap_or("(unknown)") - ); - } - } -} diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index 36173801ea..b0c2aa3dbb 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -4,29 +4,23 @@ //! //! This API is completely unstable and subject to change. -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - test(attr(deny(warnings))))] - +#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", test(attr(deny(warnings))))] #![feature(bool_to_option)] #![feature(box_syntax)] -#![feature(const_fn)] +#![feature(const_fn)] // For the `transmute` in `P::new` #![feature(const_transmute)] #![feature(crate_visibility_modifier)] #![feature(label_break_value)] -#![feature(matches_macro)] #![feature(nll)] #![feature(try_trait)] -#![feature(slice_patterns)] +#![cfg_attr(bootstrap, feature(slice_patterns))] #![feature(unicode_internals)] +#![recursion_limit = "256"] -#![recursion_limit="256"] - -pub use errors; +use ast::AttrId; use rustc_data_structures::sync::Lock; use rustc_index::bit_set::GrowableBitSet; -pub use rustc_data_structures::thin_vec::ThinVec; -use ast::AttrId; -use syntax_pos::edition::Edition; +use rustc_span::edition::{Edition, DEFAULT_EDITION}; #[macro_export] macro_rules! unwrap_or { @@ -35,13 +29,13 @@ macro_rules! unwrap_or { Some(x) => x, None => $default, } - } + }; } pub struct Globals { used_attrs: Lock<GrowableBitSet<AttrId>>, known_attrs: Lock<GrowableBitSet<AttrId>>, - syntax_pos_globals: syntax_pos::Globals, + rustc_span_globals: rustc_span::Globals, } impl Globals { @@ -51,72 +45,60 @@ impl Globals { // initiate the vectors with 0 bits. We'll grow them as necessary. used_attrs: Lock::new(GrowableBitSet::new_empty()), known_attrs: Lock::new(GrowableBitSet::new_empty()), - syntax_pos_globals: syntax_pos::Globals::new(edition), + rustc_span_globals: rustc_span::Globals::new(edition), } } } -pub fn with_globals<F, R>(edition: Edition, f: F) -> R - where F: FnOnce() -> R -{ +pub fn with_globals<R>(edition: Edition, f: impl FnOnce() -> R) -> R { let globals = Globals::new(edition); - GLOBALS.set(&globals, || { - syntax_pos::GLOBALS.set(&globals.syntax_pos_globals, f) - }) + GLOBALS.set(&globals, || rustc_span::GLOBALS.set(&globals.rustc_span_globals, f)) } -pub fn with_default_globals<F, R>(f: F) -> R - where F: FnOnce() -> R -{ - with_globals(edition::DEFAULT_EDITION, f) +pub fn with_default_globals<R>(f: impl FnOnce() -> R) -> R { + with_globals(DEFAULT_EDITION, f) } scoped_tls::scoped_thread_local!(pub static GLOBALS: Globals); -#[macro_use] -pub mod diagnostics { - #[macro_use] - pub mod macros; -} - pub mod util { pub mod classify; pub mod comments; pub mod lev_distance; pub mod literal; + pub mod map_in_place; pub mod node_count; pub mod parser; - pub mod map_in_place; } pub mod ast; pub mod attr; -pub mod expand; -pub use syntax_pos::source_map; pub mod entry; -pub mod feature_gate { - mod check; - pub use check::{check_crate, check_attribute, get_features, feature_err, feature_err_issue}; -} +pub mod expand; pub mod mut_visit; pub mod ptr; -pub mod show_span; -pub use syntax_pos::edition; -pub use syntax_pos::symbol; pub use rustc_session::parse as sess; pub mod token; pub mod tokenstream; pub mod visit; pub mod print { + mod helpers; pub mod pp; pub mod pprust; - mod helpers; } -pub mod early_buffered_lints; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; /// Requirements for a `StableHashingContext` to be used in this crate. /// This is a hack to allow using the `HashStable_Generic` derive macro /// instead of implementing everything in librustc. -pub trait HashStableContext: syntax_pos::HashStableContext {} +pub trait HashStableContext: rustc_span::HashStableContext { + fn hash_attr(&mut self, _: &ast::Attribute, hasher: &mut StableHasher); +} + +impl<AstCtx: crate::HashStableContext> HashStable<AstCtx> for ast::Attribute { + fn hash_stable(&self, hcx: &mut AstCtx, hasher: &mut StableHasher) { + hcx.hash_attr(self, hasher) + } +} diff --git a/src/libsyntax/mut_visit.rs b/src/libsyntax/mut_visit.rs index f8795d885d..4a460c5d7b 100644 --- a/src/libsyntax/mut_visit.rs +++ b/src/libsyntax/mut_visit.rs @@ -8,17 +8,16 @@ //! that are created by the expansion of a macro. use crate::ast::*; -use crate::source_map::{Spanned, respan}; -use crate::token::{self, Token}; use crate::ptr::P; -use crate::ThinVec; +use crate::token::{self, Token}; use crate::tokenstream::*; use crate::util::map_in_place::MapInPlace; -use smallvec::{smallvec, Array, SmallVec}; -use syntax_pos::Span; - use rustc_data_structures::sync::Lrc; +use rustc_span::source_map::{respan, Spanned}; +use rustc_span::Span; + +use smallvec::{smallvec, Array, SmallVec}; use std::ops::DerefMut; use std::{panic, process, ptr}; @@ -103,12 +102,12 @@ pub trait MutVisitor: Sized { noop_visit_item_kind(i, self); } - fn flat_map_trait_item(&mut self, i: TraitItem) -> SmallVec<[TraitItem; 1]> { - noop_flat_map_trait_item(i, self) + fn flat_map_trait_item(&mut self, i: AssocItem) -> SmallVec<[AssocItem; 1]> { + noop_flat_map_assoc_item(i, self) } - fn flat_map_impl_item(&mut self, i: ImplItem) -> SmallVec<[ImplItem; 1]> { - noop_flat_map_impl_item(i, self) + fn flat_map_impl_item(&mut self, i: AssocItem) -> SmallVec<[AssocItem; 1]> { + noop_flat_map_assoc_item(i, self) } fn visit_fn_decl(&mut self, d: &mut P<FnDecl>) { @@ -171,7 +170,7 @@ pub trait MutVisitor: Sized { noop_visit_foreign_mod(nm, self); } - fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> { + fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> { noop_flat_map_variant(v, self) } @@ -304,7 +303,10 @@ pub trait MutVisitor: Sized { /// method. Abort the program if the closure panics. // // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`. -pub fn visit_clobber<T, F>(t: &mut T, f: F) where F: FnOnce(T) -> T { +pub fn visit_clobber<T, F>(t: &mut T, f: F) +where + F: FnOnce(T) -> T, +{ unsafe { // Safe because `t` is used in a read-only fashion by `read()` before // being overwritten by `write()`. @@ -317,7 +319,10 @@ pub fn visit_clobber<T, F>(t: &mut T, f: F) where F: FnOnce(T) -> T { // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`. #[inline] -pub fn visit_vec<T, F>(elems: &mut Vec<T>, mut visit_elem: F) where F: FnMut(&mut T) { +pub fn visit_vec<T, F>(elems: &mut Vec<T>, mut visit_elem: F) +where + F: FnMut(&mut T), +{ for elem in elems { visit_elem(elem); } @@ -325,7 +330,10 @@ pub fn visit_vec<T, F>(elems: &mut Vec<T>, mut visit_elem: F) where F: FnMut(&mu // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`. #[inline] -pub fn visit_opt<T, F>(opt: &mut Option<T>, mut visit_elem: F) where F: FnMut(&mut T) { +pub fn visit_opt<T, F>(opt: &mut Option<T>, mut visit_elem: F) +where + F: FnMut(&mut T), +{ if let Some(elem) = opt { visit_elem(elem); } @@ -337,7 +345,7 @@ pub fn visit_attrs<T: MutVisitor>(attrs: &mut Vec<Attribute>, vis: &mut T) { } // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`. -pub fn visit_thin_attrs<T: MutVisitor>(attrs: &mut ThinVec<Attribute>, vis: &mut T) { +pub fn visit_thin_attrs<T: MutVisitor>(attrs: &mut AttrVec, vis: &mut T) { for attr in attrs.iter_mut() { vis.visit_attribute(attr); } @@ -383,15 +391,7 @@ pub fn noop_flat_map_field_pattern<T: MutVisitor>( mut fp: FieldPat, vis: &mut T, ) -> SmallVec<[FieldPat; 1]> { - let FieldPat { - attrs, - id, - ident, - is_placeholder: _, - is_shorthand: _, - pat, - span, - } = &mut fp; + let FieldPat { attrs, id, ident, is_placeholder: _, is_shorthand: _, pat, span } = &mut fp; vis.visit_id(id); vis.visit_ident(ident); vis.visit_pat(pat); @@ -433,7 +433,7 @@ pub fn noop_flat_map_arm<T: MutVisitor>(mut arm: Arm, vis: &mut T) -> SmallVec<[ pub fn noop_visit_ty_constraint<T: MutVisitor>( AssocTyConstraint { id, ident, kind, span }: &mut AssocTyConstraint, - vis: &mut T + vis: &mut T, ) { vis.visit_id(id); vis.visit_ident(ident); @@ -452,8 +452,7 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) { let Ty { id, kind, span } = ty.deref_mut(); vis.visit_id(id); match kind { - TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err | - TyKind::Never | TyKind::CVarArgs => {} + TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err | TyKind::Never | TyKind::CVarArgs => {} TyKind::Slice(ty) => vis.visit_ty(ty), TyKind::Ptr(mt) => vis.visit_mt(mt), TyKind::Rptr(lt, mt) => { @@ -476,8 +475,9 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) { vis.visit_anon_const(length); } TyKind::Typeof(expr) => vis.visit_anon_const(expr), - TyKind::TraitObject(bounds, _syntax) => - visit_vec(bounds, |bound| vis.visit_param_bound(bound)), + TyKind::TraitObject(bounds, _syntax) => { + visit_vec(bounds, |bound| vis.visit_param_bound(bound)) + } TyKind::ImplTrait(id, bounds) => { vis.visit_id(id); visit_vec(bounds, |bound| vis.visit_param_bound(bound)); @@ -488,13 +488,14 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) { } pub fn noop_visit_foreign_mod<T: MutVisitor>(foreign_mod: &mut ForeignMod, vis: &mut T) { - let ForeignMod { abi: _, items} = foreign_mod; + let ForeignMod { abi: _, items } = foreign_mod; items.flat_map_in_place(|item| vis.flat_map_foreign_item(item)); } -pub fn noop_flat_map_variant<T: MutVisitor>(mut variant: Variant, visitor: &mut T) - -> SmallVec<[Variant; 1]> -{ +pub fn noop_flat_map_variant<T: MutVisitor>( + mut variant: Variant, + visitor: &mut T, +) -> SmallVec<[Variant; 1]> { let Variant { ident, vis, attrs, id, data, disr_expr, span, is_placeholder: _ } = &mut variant; visitor.visit_ident(ident); visitor.visit_vis(vis); @@ -541,19 +542,23 @@ pub fn noop_visit_generic_arg<T: MutVisitor>(arg: &mut GenericArg, vis: &mut T) } } -pub fn noop_visit_angle_bracketed_parameter_data<T: MutVisitor>(data: &mut AngleBracketedArgs, - vis: &mut T) { +pub fn noop_visit_angle_bracketed_parameter_data<T: MutVisitor>( + data: &mut AngleBracketedArgs, + vis: &mut T, +) { let AngleBracketedArgs { args, constraints, span } = data; visit_vec(args, |arg| vis.visit_generic_arg(arg)); visit_vec(constraints, |constraint| vis.visit_ty_constraint(constraint)); vis.visit_span(span); } -pub fn noop_visit_parenthesized_parameter_data<T: MutVisitor>(args: &mut ParenthesizedArgs, - vis: &mut T) { +pub fn noop_visit_parenthesized_parameter_data<T: MutVisitor>( + args: &mut ParenthesizedArgs, + vis: &mut T, +) { let ParenthesizedArgs { inputs, output, span } = args; visit_vec(inputs, |input| vis.visit_ty(input)); - visit_opt(output, |output| vis.visit_ty(output)); + noop_visit_fn_ret_ty(output, vis); vis.visit_span(span); } @@ -682,19 +687,17 @@ pub fn noop_visit_token<T: MutVisitor>(t: &mut Token, vis: &mut T) { // multiple items there.... pub fn noop_visit_interpolated<T: MutVisitor>(nt: &mut token::Nonterminal, vis: &mut T) { match nt { - token::NtItem(item) => - visit_clobber(item, |item| { - // This is probably okay, because the only visitors likely to - // peek inside interpolated nodes will be renamings/markings, - // which map single items to single items. - vis.flat_map_item(item).expect_one("expected visitor to produce exactly one item") - }), + token::NtItem(item) => visit_clobber(item, |item| { + // This is probably okay, because the only visitors likely to + // peek inside interpolated nodes will be renamings/markings, + // which map single items to single items. + vis.flat_map_item(item).expect_one("expected visitor to produce exactly one item") + }), token::NtBlock(block) => vis.visit_block(block), - token::NtStmt(stmt) => - visit_clobber(stmt, |stmt| { - // See reasoning above. - vis.flat_map_stmt(stmt).expect_one("expected visitor to produce exactly one item") - }), + token::NtStmt(stmt) => visit_clobber(stmt, |stmt| { + // See reasoning above. + vis.flat_map_stmt(stmt).expect_one("expected visitor to produce exactly one item") + }), token::NtPat(pat) => vis.visit_pat(pat), token::NtExpr(expr) => vis.visit_expr(expr), token::NtTy(ty) => vis.visit_ty(ty), @@ -707,25 +710,20 @@ pub fn noop_visit_interpolated<T: MutVisitor>(nt: &mut token::Nonterminal, vis: } token::NtPath(path) => vis.visit_path(path), token::NtTT(tt) => vis.visit_tt(tt), - token::NtImplItem(item) => - visit_clobber(item, |item| { - // See reasoning above. - vis.flat_map_impl_item(item) - .expect_one("expected visitor to produce exactly one item") - }), - token::NtTraitItem(item) => - visit_clobber(item, |item| { - // See reasoning above. - vis.flat_map_trait_item(item) - .expect_one("expected visitor to produce exactly one item") - }), + token::NtImplItem(item) => visit_clobber(item, |item| { + // See reasoning above. + vis.flat_map_impl_item(item).expect_one("expected visitor to produce exactly one item") + }), + token::NtTraitItem(item) => visit_clobber(item, |item| { + // See reasoning above. + vis.flat_map_trait_item(item).expect_one("expected visitor to produce exactly one item") + }), token::NtVis(visib) => vis.visit_vis(visib), - token::NtForeignItem(item) => - visit_clobber(item, |item| { - // See reasoning above. - vis.flat_map_foreign_item(item) - .expect_one("expected visitor to produce exactly one item") - }), + token::NtForeignItem(item) => visit_clobber(item, |item| { + // See reasoning above. + vis.flat_map_foreign_item(item) + .expect_one("expected visitor to produce exactly one item") + }), } } @@ -742,7 +740,11 @@ pub fn noop_visit_asyncness<T: MutVisitor>(asyncness: &mut IsAsync, vis: &mut T) pub fn noop_visit_fn_decl<T: MutVisitor>(decl: &mut P<FnDecl>, vis: &mut T) { let FnDecl { inputs, output } = decl.deref_mut(); inputs.flat_map_in_place(|param| vis.flat_map_param(param)); - match output { + noop_visit_fn_ret_ty(output, vis); +} + +pub fn noop_visit_fn_ret_ty<T: MutVisitor>(fn_ret_ty: &mut FunctionRetTy, vis: &mut T) { + match fn_ret_ty { FunctionRetTy::Default(span) => vis.visit_span(span), FunctionRetTy::Ty(ty) => vis.visit_ty(ty), } @@ -757,9 +759,8 @@ pub fn noop_visit_param_bound<T: MutVisitor>(pb: &mut GenericBound, vis: &mut T) pub fn noop_flat_map_generic_param<T: MutVisitor>( mut param: GenericParam, - vis: &mut T -) -> SmallVec<[GenericParam; 1]> -{ + vis: &mut T, +) -> SmallVec<[GenericParam; 1]> { let GenericParam { id, ident, attrs, bounds, kind, is_placeholder: _ } = &mut param; vis.visit_id(id); vis.visit_ident(ident); @@ -828,11 +829,11 @@ pub fn noop_visit_variant_data<T: MutVisitor>(vdata: &mut VariantData, vis: &mut match vdata { VariantData::Struct(fields, ..) => { fields.flat_map_in_place(|field| vis.flat_map_struct_field(field)); - }, + } VariantData::Tuple(fields, id) => { fields.flat_map_in_place(|field| vis.flat_map_struct_field(field)); vis.visit_id(id); - }, + } VariantData::Unit(id) => vis.visit_id(id), } } @@ -849,9 +850,10 @@ pub fn noop_visit_poly_trait_ref<T: MutVisitor>(p: &mut PolyTraitRef, vis: &mut vis.visit_span(span); } -pub fn noop_flat_map_struct_field<T: MutVisitor>(mut sf: StructField, visitor: &mut T) - -> SmallVec<[StructField; 1]> -{ +pub fn noop_flat_map_struct_field<T: MutVisitor>( + mut sf: StructField, + visitor: &mut T, +) -> SmallVec<[StructField; 1]> { let StructField { span, ident, vis, id, ty, attrs, is_placeholder: _ } = &mut sf; visitor.visit_span(span); visit_opt(ident, |ident| visitor.visit_ident(ident)); @@ -911,15 +913,23 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) { variants.flat_map_in_place(|variant| vis.flat_map_variant(variant)); vis.visit_generics(generics); } - ItemKind::Struct(variant_data, generics) | - ItemKind::Union(variant_data, generics) => { + ItemKind::Struct(variant_data, generics) | ItemKind::Union(variant_data, generics) => { vis.visit_variant_data(variant_data); vis.visit_generics(generics); } - ItemKind::Impl(_unsafety, _polarity, _defaultness, generics, trait_ref, ty, items) => { + ItemKind::Impl { + unsafety: _, + polarity: _, + defaultness: _, + constness: _, + generics, + of_trait, + self_ty, + items, + } => { vis.visit_generics(generics); - visit_opt(trait_ref, |trait_ref| vis.visit_trait_ref(trait_ref)); - vis.visit_ty(ty); + visit_opt(of_trait, |trait_ref| vis.visit_trait_ref(trait_ref)); + vis.visit_ty(self_ty); items.flat_map_in_place(|item| vis.flat_map_impl_item(item)); } ItemKind::Trait(_is_auto, _unsafety, generics, bounds, items) => { @@ -936,58 +946,31 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) { } } -pub fn noop_flat_map_trait_item<T: MutVisitor>(mut item: TraitItem, visitor: &mut T) - -> SmallVec<[TraitItem; 1]> -{ - let TraitItem { id, ident, vis, attrs, generics, kind, span, tokens: _ } = &mut item; +pub fn noop_flat_map_assoc_item<T: MutVisitor>( + mut item: AssocItem, + visitor: &mut T, +) -> SmallVec<[AssocItem; 1]> { + let AssocItem { id, ident, vis, defaultness: _, attrs, generics, kind, span, tokens: _ } = + &mut item; visitor.visit_id(id); visitor.visit_ident(ident); visitor.visit_vis(vis); visit_attrs(attrs, visitor); visitor.visit_generics(generics); match kind { - TraitItemKind::Const(ty, default) => { + AssocItemKind::Const(ty, expr) => { visitor.visit_ty(ty); - visit_opt(default, |default| visitor.visit_expr(default)); + visit_opt(expr, |expr| visitor.visit_expr(expr)); } - TraitItemKind::Method(sig, body) => { + AssocItemKind::Fn(sig, body) => { visit_fn_sig(sig, visitor); visit_opt(body, |body| visitor.visit_block(body)); } - TraitItemKind::Type(bounds, default) => { + AssocItemKind::TyAlias(bounds, ty) => { visit_bounds(bounds, visitor); - visit_opt(default, |default| visitor.visit_ty(default)); - } - TraitItemKind::Macro(mac) => { - visitor.visit_mac(mac); + visit_opt(ty, |ty| visitor.visit_ty(ty)); } - } - visitor.visit_span(span); - - smallvec![item] -} - -pub fn noop_flat_map_impl_item<T: MutVisitor>(mut item: ImplItem, visitor: &mut T) - -> SmallVec<[ImplItem; 1]> -{ - let ImplItem { id, ident, vis, defaultness: _, attrs, generics, kind, span, tokens: _ } = - &mut item; - visitor.visit_id(id); - visitor.visit_ident(ident); - visitor.visit_vis(vis); - visit_attrs(attrs, visitor); - visitor.visit_generics(generics); - match kind { - ImplItemKind::Const(ty, expr) => { - visitor.visit_ty(ty); - visitor.visit_expr(expr); - } - ImplItemKind::Method(sig, body) => { - visit_fn_sig(sig, visitor); - visitor.visit_block(body); - } - ImplItemKind::TyAlias(ty) => visitor.visit_ty(ty), - ImplItemKind::Macro(mac) => visitor.visit_mac(mac), + AssocItemKind::Macro(mac) => visitor.visit_mac(mac), } visitor.visit_span(span); @@ -1034,8 +1017,10 @@ pub fn noop_visit_crate<T: MutVisitor>(krate: &mut Crate, vis: &mut T) { } // Mutates one item into possibly many items. -pub fn noop_flat_map_item<T: MutVisitor>(mut item: P<Item>, visitor: &mut T) - -> SmallVec<[P<Item>; 1]> { +pub fn noop_flat_map_item<T: MutVisitor>( + mut item: P<Item>, + visitor: &mut T, +) -> SmallVec<[P<Item>; 1]> { let Item { ident, attrs, id, kind, vis, span, tokens: _ } = item.deref_mut(); visitor.visit_ident(ident); visit_attrs(attrs, visitor); @@ -1050,9 +1035,10 @@ pub fn noop_flat_map_item<T: MutVisitor>(mut item: P<Item>, visitor: &mut T) smallvec![item] } -pub fn noop_flat_map_foreign_item<T: MutVisitor>(mut item: ForeignItem, visitor: &mut T) - -> SmallVec<[ForeignItem; 1]> -{ +pub fn noop_flat_map_foreign_item<T: MutVisitor>( + mut item: ForeignItem, + visitor: &mut T, +) -> SmallVec<[ForeignItem; 1]> { let ForeignItem { ident, attrs, id, kind, vis, span, tokens: _ } = &mut item; visitor.visit_ident(ident); visit_attrs(attrs, visitor); @@ -1097,13 +1083,13 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) { PatKind::Box(inner) => vis.visit_pat(inner), PatKind::Ref(inner, _mutbl) => vis.visit_pat(inner), PatKind::Range(e1, e2, Spanned { span: _, node: _ }) => { - vis.visit_expr(e1); - vis.visit_expr(e2); + visit_opt(e1, |e| vis.visit_expr(e)); + visit_opt(e2, |e| vis.visit_expr(e)); vis.visit_span(span); } - PatKind::Tuple(elems) - | PatKind::Slice(elems) - | PatKind::Or(elems) => visit_vec(elems, |elem| vis.visit_pat(elem)), + PatKind::Tuple(elems) | PatKind::Slice(elems) | PatKind::Or(elems) => { + visit_vec(elems, |elem| vis.visit_pat(elem)) + } PatKind::Paren(inner) => vis.visit_pat(inner), PatKind::Mac(mac) => vis.visit_mac(mac), } @@ -1191,7 +1177,7 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { kind, id, span, attrs }: &mut Expr, vis.visit_block(body); } ExprKind::Await(expr) => vis.visit_expr(expr), - ExprKind::Assign(el, er) => { + ExprKind::Assign(el, er, _) => { vis.visit_expr(el); vis.visit_expr(er); } @@ -1226,8 +1212,16 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { kind, id, span, attrs }: &mut Expr, visit_opt(expr, |expr| vis.visit_expr(expr)); } ExprKind::InlineAsm(asm) => { - let InlineAsm { asm: _, asm_str_style: _, outputs, inputs, clobbers: _, volatile: _, - alignstack: _, dialect: _ } = asm.deref_mut(); + let InlineAsm { + asm: _, + asm_str_style: _, + outputs, + inputs, + clobbers: _, + volatile: _, + alignstack: _, + dialect: _, + } = asm.deref_mut(); for out in outputs { let InlineAsmOutput { constraint: _, expr, is_rw: _, is_indirect: _ } = out; vis.visit_expr(expr); @@ -1239,7 +1233,7 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { kind, id, span, attrs }: &mut Expr, vis.visit_path(path); fields.flat_map_in_place(|field| vis.flat_map_field(field)); visit_opt(expr, |expr| vis.visit_expr(expr)); - }, + } ExprKind::Paren(expr) => { vis.visit_expr(expr); @@ -1262,31 +1256,33 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { kind, id, span, attrs }: &mut Expr, } pub fn noop_filter_map_expr<T: MutVisitor>(mut e: P<Expr>, vis: &mut T) -> Option<P<Expr>> { - Some({ vis.visit_expr(&mut e); e }) + Some({ + vis.visit_expr(&mut e); + e + }) } -pub fn noop_flat_map_stmt<T: MutVisitor>(Stmt { kind, mut span, mut id }: Stmt, vis: &mut T) - -> SmallVec<[Stmt; 1]> -{ +pub fn noop_flat_map_stmt<T: MutVisitor>( + Stmt { kind, mut span, mut id }: Stmt, + vis: &mut T, +) -> SmallVec<[Stmt; 1]> { vis.visit_id(&mut id); vis.visit_span(&mut span); - noop_flat_map_stmt_kind(kind, vis).into_iter().map(|kind| { - Stmt { id, kind, span } - }).collect() + noop_flat_map_stmt_kind(kind, vis).into_iter().map(|kind| Stmt { id, kind, span }).collect() } -pub fn noop_flat_map_stmt_kind<T: MutVisitor>(kind: StmtKind, vis: &mut T) - -> SmallVec<[StmtKind; 1]> { +pub fn noop_flat_map_stmt_kind<T: MutVisitor>( + kind: StmtKind, + vis: &mut T, +) -> SmallVec<[StmtKind; 1]> { match kind { - StmtKind::Local(mut local) => - smallvec![StmtKind::Local({ vis.visit_local(&mut local); local })], + StmtKind::Local(mut local) => smallvec![StmtKind::Local({ + vis.visit_local(&mut local); + local + })], StmtKind::Item(item) => vis.flat_map_item(item).into_iter().map(StmtKind::Item).collect(), - StmtKind::Expr(expr) => { - vis.filter_map_expr(expr).into_iter().map(StmtKind::Expr).collect() - } - StmtKind::Semi(expr) => { - vis.filter_map_expr(expr).into_iter().map(StmtKind::Semi).collect() - } + StmtKind::Expr(expr) => vis.filter_map_expr(expr).into_iter().map(StmtKind::Expr).collect(), + StmtKind::Semi(expr) => vis.filter_map_expr(expr).into_iter().map(StmtKind::Semi).collect(), StmtKind::Mac(mut mac) => { let (mac_, _semi, attrs) = mac.deref_mut(); vis.visit_mac(mac_); diff --git a/src/libsyntax/print/helpers.rs b/src/libsyntax/print/helpers.rs index 3449e07f45..88942cb7fd 100644 --- a/src/libsyntax/print/helpers.rs +++ b/src/libsyntax/print/helpers.rs @@ -1,5 +1,5 @@ -use std::borrow::Cow; use crate::print::pp::Printer; +use std::borrow::Cow; impl Printer { pub fn word_space<W: Into<Cow<'static, str>>>(&mut self, w: W) { @@ -22,10 +22,14 @@ impl Printer { } pub fn space_if_not_bol(&mut self) { - if !self.is_beginning_of_line() { self.space(); } + if !self.is_beginning_of_line() { + self.space(); + } } - pub fn nbsp(&mut self) { self.word(" ") } + pub fn nbsp(&mut self) { + self.word(" ") + } pub fn word_nbsp<S: Into<Cow<'static, str>>>(&mut self, w: S) { self.word(w); diff --git a/src/libsyntax/print/pp.rs b/src/libsyntax/print/pp.rs index 660e77f77d..e6090db328 100644 --- a/src/libsyntax/print/pp.rs +++ b/src/libsyntax/print/pp.rs @@ -134,10 +134,10 @@ //! methods called `Printer::scan_*`, and the 'PRINT' process is the //! method called `Printer::print`. +use log::debug; +use std::borrow::Cow; use std::collections::VecDeque; use std::fmt; -use std::borrow::Cow; -use log::debug; /// How to break. Described in more detail in the module docs. #[derive(Clone, Copy, PartialEq)] @@ -149,13 +149,13 @@ pub enum Breaks { #[derive(Clone, Copy)] pub struct BreakToken { offset: isize, - blank_space: isize + blank_space: isize, } #[derive(Clone, Copy)] pub struct BeginToken { offset: isize, - breaks: Breaks + breaks: Breaks, } #[derive(Clone)] @@ -180,13 +180,8 @@ impl Token { pub fn is_hardbreak_tok(&self) -> bool { match *self { - Token::Break(BreakToken { - offset: 0, - blank_space: bs - }) if bs == SIZE_INFINITY => - true, - _ => - false + Token::Break(BreakToken { offset: 0, blank_space: bs }) if bs == SIZE_INFINITY => true, + _ => false, } } } @@ -230,7 +225,7 @@ enum PrintStackBreak { #[derive(Copy, Clone)] struct PrintStackElem { offset: isize, - pbreak: PrintStackBreak + pbreak: PrintStackBreak, } const SIZE_INFINITY: isize = 0xffff; @@ -254,7 +249,7 @@ pub fn mk_printer() -> Printer { right_total: 0, scan_stack: VecDeque::new(), print_stack: Vec::new(), - pending_indentation: 0 + pending_indentation: 0, } } @@ -283,7 +278,7 @@ pub struct Printer { /// advancing. scan_stack: VecDeque<usize>, /// Stack of blocks-in-progress being flushed by print - print_stack: Vec<PrintStackElem> , + print_stack: Vec<PrintStackElem>, /// Buffered indentation to avoid writing trailing whitespace pending_indentation: isize, } @@ -326,8 +321,7 @@ impl Printer { } else { self.advance_right(); } - debug!("pp Begin({})/buffer Vec<{},{}>", - b.offset, self.left, self.right); + debug!("pp Begin({})/buffer Vec<{},{}>", b.offset, self.left, self.right); self.scan_push(BufEntry { token: Token::Begin(b), size: -self.right_total }); } @@ -351,8 +345,7 @@ impl Printer { } else { self.advance_right(); } - debug!("pp Break({})/buffer Vec<{},{}>", - b.offset, self.left, self.right); + debug!("pp Break({})/buffer Vec<{},{}>", b.offset, self.left, self.right); self.check_stack(0); self.scan_push(BufEntry { token: Token::Break(b), size: -self.right_total }); self.right_total += b.blank_space; @@ -360,12 +353,10 @@ impl Printer { fn scan_string(&mut self, s: Cow<'static, str>) { if self.scan_stack.is_empty() { - debug!("pp String('{}')/print Vec<{},{}>", - s, self.left, self.right); + debug!("pp String('{}')/print Vec<{},{}>", s, self.left, self.right); self.print_string(s); } else { - debug!("pp String('{}')/buffer Vec<{},{}>", - s, self.left, self.right); + debug!("pp String('{}')/buffer Vec<{},{}>", s, self.left, self.right); self.advance_right(); let len = s.len() as isize; self.buf[self.right] = BufEntry { token: Token::String(s), size: len }; @@ -375,11 +366,16 @@ impl Printer { } fn check_stream(&mut self) { - debug!("check_stream Vec<{}, {}> with left_total={}, right_total={}", - self.left, self.right, self.left_total, self.right_total); + debug!( + "check_stream Vec<{}, {}> with left_total={}, right_total={}", + self.left, self.right, self.left_total, self.right_total + ); if self.right_total - self.left_total > self.space { - debug!("scan window is {}, longer than space on line ({})", - self.right_total - self.left_total, self.space); + debug!( + "scan window is {}, longer than space on line ({})", + self.right_total - self.left_total, + self.space + ); if Some(&self.left) == self.scan_stack.back() { debug!("setting {} to infinity and popping", self.left); let scanned = self.scan_pop_bottom(); @@ -421,8 +417,10 @@ impl Printer { } fn advance_left(&mut self) { - debug!("advance_left Vec<{},{}>, sizeof({})={}", self.left, self.right, - self.left, self.buf[self.left].size); + debug!( + "advance_left Vec<{},{}>, sizeof({})={}", + self.left, self.right, self.left, self.buf[self.left].size + ); let mut left_size = self.buf[self.left].size; @@ -436,7 +434,7 @@ impl Printer { assert_eq!(len, left_size); len } - _ => 0 + _ => 0, }; self.print(left, left_size); @@ -497,9 +495,8 @@ impl Printer { fn get_top(&mut self) -> PrintStackElem { match self.print_stack.last() { Some(el) => *el, - None => PrintStackElem { - offset: 0, - pbreak: PrintStackBreak::Broken(Breaks::Inconsistent) + None => { + PrintStackElem { offset: 0, pbreak: PrintStackBreak::Broken(Breaks::Inconsistent) } } } } @@ -508,16 +505,11 @@ impl Printer { if l > self.space { let col = self.margin - self.space + b.offset; debug!("print Begin -> push broken block at col {}", col); - self.print_stack.push(PrintStackElem { - offset: col, - pbreak: PrintStackBreak::Broken(b.breaks) - }); + self.print_stack + .push(PrintStackElem { offset: col, pbreak: PrintStackBreak::Broken(b.breaks) }); } else { debug!("print Begin -> push fitting block"); - self.print_stack.push(PrintStackElem { - offset: 0, - pbreak: PrintStackBreak::Fits - }); + self.print_stack.push(PrintStackElem { offset: 0, pbreak: PrintStackBreak::Fits }); } } @@ -535,20 +527,17 @@ impl Printer { self.indent(b.blank_space); } PrintStackBreak::Broken(Breaks::Consistent) => { - debug!("print Break({}+{}) in consistent block", - top.offset, b.offset); + debug!("print Break({}+{}) in consistent block", top.offset, b.offset); self.print_newline(top.offset + b.offset); self.space = self.margin - (top.offset + b.offset); } PrintStackBreak::Broken(Breaks::Inconsistent) => { if l > self.space { - debug!("print Break({}+{}) w/ newline in inconsistent", - top.offset, b.offset); + debug!("print Break({}+{}) w/ newline in inconsistent", top.offset, b.offset); self.print_newline(top.offset + b.offset); self.space = self.margin - (top.offset + b.offset); } else { - debug!("print Break({}) w/o newline in inconsistent", - b.blank_space); + debug!("print Break({}) w/o newline in inconsistent", b.blank_space); self.indent(b.blank_space); self.space -= b.blank_space; } @@ -575,12 +564,8 @@ impl Printer { } fn print(&mut self, token: Token, l: isize) { - debug!("print {} {} (remaining line space={})", token, l, - self.space); - debug!("{}", buf_str(&self.buf, - self.left, - self.right, - 6)); + debug!("print {} {} (remaining line space={})", token, l, self.space); + debug!("{}", buf_str(&self.buf, self.left, self.right, 6)); match token { Token::Begin(b) => self.print_begin(b, l), Token::End => self.print_end(), @@ -598,10 +583,7 @@ impl Printer { /// "raw box" pub fn rbox(&mut self, indent: usize, b: Breaks) { - self.scan_begin(BeginToken { - offset: indent as isize, - breaks: b - }) + self.scan_begin(BeginToken { offset: indent as isize, breaks: b }) } /// Inconsistent breaking box @@ -615,10 +597,7 @@ impl Printer { } pub fn break_offset(&mut self, n: usize, off: isize) { - self.scan_break(BreakToken { - offset: off, - blank_space: n as isize - }) + self.scan_break(BreakToken { offset: off, blank_space: n as isize }) } pub fn end(&mut self) { @@ -656,6 +635,6 @@ impl Printer { } pub fn hardbreak_tok_offset(off: isize) -> Token { - Token::Break(BreakToken {offset: off, blank_space: SIZE_INFINITY}) + Token::Break(BreakToken { offset: off, blank_space: SIZE_INFINITY }) } } diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index f0c5fb32fb..d6f18fda8b 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1,21 +1,20 @@ use crate::ast::{self, BlockCheckMode, PatKind, RangeEnd, RangeSyntax}; -use crate::ast::{SelfKind, GenericBound, TraitBoundModifier}; use crate::ast::{Attribute, GenericArg, MacArgs}; -use crate::util::parser::{self, AssocOp, Fixity}; -use crate::util::comments; +use crate::ast::{GenericBound, SelfKind, TraitBoundModifier}; use crate::attr; -use crate::source_map::{self, SourceMap, Spanned}; -use crate::token::{self, BinOpToken, DelimToken, Nonterminal, Token, TokenKind}; -use crate::print::pp::{self, Breaks}; use crate::print::pp::Breaks::{Consistent, Inconsistent}; +use crate::print::pp::{self, Breaks}; use crate::ptr::P; -use crate::util::classify; use crate::sess::ParseSess; -use crate::symbol::{kw, sym}; +use crate::token::{self, BinOpToken, DelimToken, Nonterminal, Token, TokenKind}; use crate::tokenstream::{self, TokenStream, TokenTree}; +use crate::util::classify; +use crate::util::comments; +use crate::util::parser::{self, AssocOp, Fixity}; -use syntax_pos::{self, BytePos}; -use syntax_pos::{FileName, Span}; +use rustc_span::source_map::{dummy_spanned, SourceMap, Spanned}; +use rustc_span::symbol::{kw, sym}; +use rustc_span::{BytePos, FileName, Span}; use std::borrow::Cow; @@ -39,8 +38,8 @@ pub enum AnnNode<'a> { } pub trait PpAnn { - fn pre(&self, _state: &mut State<'_>, _node: AnnNode<'_>) { } - fn post(&self, _state: &mut State<'_>, _node: AnnNode<'_>) { } + fn pre(&self, _state: &mut State<'_>, _node: AnnNode<'_>) {} + fn post(&self, _state: &mut State<'_>, _node: AnnNode<'_>) {} } #[derive(Copy, Clone)] @@ -62,11 +61,7 @@ impl<'a> Comments<'a> { input: String, ) -> Comments<'a> { let comments = comments::gather_comments(sess, filename, input); - Comments { - cm, - comments, - current: 0, - } + Comments { cm, comments, current: 0 } } pub fn next(&self) -> Option<comments::Comment> { @@ -75,11 +70,13 @@ impl<'a> Comments<'a> { pub fn trailing_comment( &mut self, - span: syntax_pos::Span, + span: rustc_span::Span, next_pos: Option<BytePos>, ) -> Option<comments::Comment> { if let Some(cmnt) = self.next() { - if cmnt.style != comments::Trailing { return None; } + if cmnt.style != comments::Trailing { + return None; + } let span_line = self.cm.lookup_char_pos(span.hi()); let comment_line = self.cm.lookup_char_pos(cmnt.pos); let next = next_pos.unwrap_or_else(|| cmnt.pos + BytePos(1)); @@ -95,21 +92,23 @@ impl<'a> Comments<'a> { pub struct State<'a> { pub s: pp::Printer, comments: Option<Comments<'a>>, - ann: &'a (dyn PpAnn+'a), - is_expanded: bool + ann: &'a (dyn PpAnn + 'a), + is_expanded: bool, } crate const INDENT_UNIT: usize = 4; /// Requires you to pass an input filename and reader so that /// it can scan the input text for comments to copy forward. -pub fn print_crate<'a>(cm: &'a SourceMap, - sess: &ParseSess, - krate: &ast::Crate, - filename: FileName, - input: String, - ann: &'a dyn PpAnn, - is_expanded: bool) -> String { +pub fn print_crate<'a>( + cm: &'a SourceMap, + sess: &ParseSess, + krate: &ast::Crate, + filename: FileName, + input: String, + ann: &'a dyn PpAnn, + is_expanded: bool, +) -> String { let mut s = State { s: pp::mk_printer(), comments: Some(Comments::new(cm, sess, filename, input)), @@ -131,7 +130,7 @@ pub fn print_crate<'a>(cm: &'a SourceMap, // Currently, in Rust 2018 we don't have `extern crate std;` at the crate // root, so this is not needed, and actually breaks things. - if sess.edition == syntax_pos::edition::Edition::Edition2015 { + if sess.edition == rustc_span::edition::Edition::Edition2015 { // `#![no_std]` let no_std_meta = attr::mk_word_item(ast::Ident::with_dummy_span(sym::no_std)); let fake_attr = attr::mk_attr_inner(no_std_meta); @@ -145,15 +144,12 @@ pub fn print_crate<'a>(cm: &'a SourceMap, s.s.eof() } -pub fn to_string<F>(f: F) -> String where +pub fn to_string<F>(f: F) -> String +where F: FnOnce(&mut State<'_>), { - let mut printer = State { - s: pp::mk_printer(), - comments: None, - ann: &NoAnn, - is_expanded: false - }; + let mut printer = + State { s: pp::mk_printer(), comments: None, ann: &NoAnn, is_expanded: false }; f(&mut printer); printer.s.eof() } @@ -165,43 +161,40 @@ fn tt_prepend_space(tt: &TokenTree) -> bool { TokenTree::Token(token) => match token.kind { token::Comma => false, _ => true, - } + }, _ => true, } } fn binop_to_string(op: BinOpToken) -> &'static str { match op { - token::Plus => "+", - token::Minus => "-", - token::Star => "*", - token::Slash => "/", - token::Percent => "%", - token::Caret => "^", - token::And => "&", - token::Or => "|", - token::Shl => "<<", - token::Shr => ">>", + token::Plus => "+", + token::Minus => "-", + token::Star => "*", + token::Slash => "/", + token::Percent => "%", + token::Caret => "^", + token::And => "&", + token::Or => "|", + token::Shl => "<<", + token::Shr => ">>", } } pub fn literal_to_string(lit: token::Lit) -> String { let token::Lit { kind, symbol, suffix } = lit; let mut out = match kind { - token::Byte => format!("b'{}'", symbol), - token::Char => format!("'{}'", symbol), - token::Str => format!("\"{}\"", symbol), - token::StrRaw(n) => format!("r{delim}\"{string}\"{delim}", - delim="#".repeat(n as usize), - string=symbol), - token::ByteStr => format!("b\"{}\"", symbol), - token::ByteStrRaw(n) => format!("br{delim}\"{string}\"{delim}", - delim="#".repeat(n as usize), - string=symbol), - token::Integer | - token::Float | - token::Bool | - token::Err => symbol.to_string(), + token::Byte => format!("b'{}'", symbol), + token::Char => format!("'{}'", symbol), + token::Str => format!("\"{}\"", symbol), + token::StrRaw(n) => { + format!("r{delim}\"{string}\"{delim}", delim = "#".repeat(n as usize), string = symbol) + } + token::ByteStr => format!("b\"{}\"", symbol), + token::ByteStrRaw(n) => { + format!("br{delim}\"{string}\"{delim}", delim = "#".repeat(n as usize), string = symbol) + } + token::Integer | token::Float | token::Bool | token::Err => symbol.to_string(), }; if let Some(suffix) = suffix { @@ -238,7 +231,7 @@ fn ident_to_string(name: ast::Name, is_raw: bool, convert_dollar_crate: Option<S converted.to_string() } else { format!("::{}", converted) - } + }; } } name.to_string() @@ -252,60 +245,59 @@ pub fn token_kind_to_string(tok: &TokenKind) -> String { fn token_kind_to_string_ext(tok: &TokenKind, convert_dollar_crate: Option<Span>) -> String { match *tok { - token::Eq => "=".to_string(), - token::Lt => "<".to_string(), - token::Le => "<=".to_string(), - token::EqEq => "==".to_string(), - token::Ne => "!=".to_string(), - token::Ge => ">=".to_string(), - token::Gt => ">".to_string(), - token::Not => "!".to_string(), - token::Tilde => "~".to_string(), - token::OrOr => "||".to_string(), - token::AndAnd => "&&".to_string(), - token::BinOp(op) => binop_to_string(op).to_string(), - token::BinOpEq(op) => format!("{}=", binop_to_string(op)), + token::Eq => "=".to_string(), + token::Lt => "<".to_string(), + token::Le => "<=".to_string(), + token::EqEq => "==".to_string(), + token::Ne => "!=".to_string(), + token::Ge => ">=".to_string(), + token::Gt => ">".to_string(), + token::Not => "!".to_string(), + token::Tilde => "~".to_string(), + token::OrOr => "||".to_string(), + token::AndAnd => "&&".to_string(), + token::BinOp(op) => binop_to_string(op).to_string(), + token::BinOpEq(op) => format!("{}=", binop_to_string(op)), /* Structural symbols */ - token::At => "@".to_string(), - token::Dot => ".".to_string(), - token::DotDot => "..".to_string(), - token::DotDotDot => "...".to_string(), - token::DotDotEq => "..=".to_string(), - token::Comma => ",".to_string(), - token::Semi => ";".to_string(), - token::Colon => ":".to_string(), - token::ModSep => "::".to_string(), - token::RArrow => "->".to_string(), - token::LArrow => "<-".to_string(), - token::FatArrow => "=>".to_string(), + token::At => "@".to_string(), + token::Dot => ".".to_string(), + token::DotDot => "..".to_string(), + token::DotDotDot => "...".to_string(), + token::DotDotEq => "..=".to_string(), + token::Comma => ",".to_string(), + token::Semi => ";".to_string(), + token::Colon => ":".to_string(), + token::ModSep => "::".to_string(), + token::RArrow => "->".to_string(), + token::LArrow => "<-".to_string(), + token::FatArrow => "=>".to_string(), token::OpenDelim(token::Paren) => "(".to_string(), token::CloseDelim(token::Paren) => ")".to_string(), token::OpenDelim(token::Bracket) => "[".to_string(), token::CloseDelim(token::Bracket) => "]".to_string(), token::OpenDelim(token::Brace) => "{".to_string(), token::CloseDelim(token::Brace) => "}".to_string(), - token::OpenDelim(token::NoDelim) | - token::CloseDelim(token::NoDelim) => " ".to_string(), - token::Pound => "#".to_string(), - token::Dollar => "$".to_string(), - token::Question => "?".to_string(), - token::SingleQuote => "'".to_string(), + token::OpenDelim(token::NoDelim) | token::CloseDelim(token::NoDelim) => " ".to_string(), + token::Pound => "#".to_string(), + token::Dollar => "$".to_string(), + token::Question => "?".to_string(), + token::SingleQuote => "'".to_string(), /* Literals */ token::Literal(lit) => literal_to_string(lit), /* Name components */ - token::Ident(s, is_raw) => ident_to_string(s, is_raw, convert_dollar_crate), - token::Lifetime(s) => s.to_string(), + token::Ident(s, is_raw) => ident_to_string(s, is_raw, convert_dollar_crate), + token::Lifetime(s) => s.to_string(), /* Other */ - token::DocComment(s) => s.to_string(), - token::Eof => "<eof>".to_string(), - token::Whitespace => " ".to_string(), - token::Comment => "/* */".to_string(), - token::Shebang(s) => format!("/* shebang: {}*/", s), - token::Unknown(s) => s.to_string(), + token::DocComment(s) => s.to_string(), + token::Eof => "<eof>".to_string(), + token::Whitespace => " ".to_string(), + token::Comment => "/* */".to_string(), + token::Shebang(s) => format!("/* shebang: {}*/", s), + token::Unknown(s) => s.to_string(), token::Interpolated(ref nt) => nonterminal_to_string(nt), } @@ -323,21 +315,21 @@ fn token_to_string_ext(token: &Token, convert_dollar_crate: bool) -> String { pub fn nonterminal_to_string(nt: &Nonterminal) -> String { match *nt { - token::NtExpr(ref e) => expr_to_string(e), - token::NtMeta(ref e) => attr_item_to_string(e), - token::NtTy(ref e) => ty_to_string(e), - token::NtPath(ref e) => path_to_string(e), - token::NtItem(ref e) => item_to_string(e), - token::NtBlock(ref e) => block_to_string(e), - token::NtStmt(ref e) => stmt_to_string(e), - token::NtPat(ref e) => pat_to_string(e), - token::NtIdent(e, is_raw) => ast_ident_to_string(e, is_raw), - token::NtLifetime(e) => e.to_string(), - token::NtLiteral(ref e) => expr_to_string(e), - token::NtTT(ref tree) => tt_to_string(tree.clone()), - token::NtImplItem(ref e) => impl_item_to_string(e), - token::NtTraitItem(ref e) => trait_item_to_string(e), - token::NtVis(ref e) => vis_to_string(e), + token::NtExpr(ref e) => expr_to_string(e), + token::NtMeta(ref e) => attr_item_to_string(e), + token::NtTy(ref e) => ty_to_string(e), + token::NtPath(ref e) => path_to_string(e), + token::NtItem(ref e) => item_to_string(e), + token::NtBlock(ref e) => block_to_string(e), + token::NtStmt(ref e) => stmt_to_string(e), + token::NtPat(ref e) => pat_to_string(e), + token::NtIdent(e, is_raw) => ast_ident_to_string(e, is_raw), + token::NtLifetime(e) => e.to_string(), + token::NtLiteral(ref e) => expr_to_string(e), + token::NtTT(ref tree) => tt_to_string(tree.clone()), + // FIXME(Centril): merge these variants. + token::NtImplItem(ref e) | token::NtTraitItem(ref e) => assoc_item_to_string(e), + token::NtVis(ref e) => vis_to_string(e), token::NtForeignItem(ref e) => foreign_item_to_string(e), } } @@ -374,12 +366,8 @@ pub fn item_to_string(i: &ast::Item) -> String { to_string(|s| s.print_item(i)) } -fn impl_item_to_string(i: &ast::ImplItem) -> String { - to_string(|s| s.print_impl_item(i)) -} - -fn trait_item_to_string(i: &ast::TraitItem) -> String { - to_string(|s| s.print_trait_item(i)) +fn assoc_item_to_string(i: &ast::AssocItem) -> String { + to_string(|s| s.print_assoc_item(i)) } pub fn generic_params_to_string(generic_params: &[ast::GenericParam]) -> String { @@ -450,9 +438,15 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere fn print_ident(&mut self, ident: ast::Ident); fn print_generic_args(&mut self, args: &ast::GenericArgs, colons_before_params: bool); - fn strsep<T, F>(&mut self, sep: &'static str, space_before: bool, - b: Breaks, elts: &[T], mut op: F) - where F: FnMut(&mut Self, &T), + fn strsep<T, F>( + &mut self, + sep: &'static str, + space_before: bool, + b: Breaks, + elts: &[T], + mut op: F, + ) where + F: FnMut(&mut Self, &T), { self.rbox(0, b); if let Some((first, rest)) = elts.split_first() { @@ -469,7 +463,8 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere } fn commasep<T, F>(&mut self, b: Breaks, elts: &[T], op: F) - where F: FnMut(&mut Self, &T), + where + F: FnMut(&mut Self, &T), { self.strsep(",", false, b, elts, op) } @@ -479,13 +474,12 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere if cmnt.pos < pos { self.print_comment(cmnt); } else { - break + break; } } } - fn print_comment(&mut self, - cmnt: &comments::Comment) { + fn print_comment(&mut self, cmnt: &comments::Comment) { match cmnt.style { comments::Mixed => { assert_eq!(cmnt.lines.len(), 1); @@ -528,7 +522,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere pp::Token::String(s) => ";" == s, pp::Token::Begin(_) => true, pp::Token::End => true, - _ => false + _ => false, }; if twice { self.hardbreak(); @@ -550,52 +544,43 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere self.word(lit.token.to_string()) } - fn print_string(&mut self, st: &str, - style: ast::StrStyle) { + fn print_string(&mut self, st: &str, style: ast::StrStyle) { let st = match style { - ast::StrStyle::Cooked => { - (format!("\"{}\"", st.escape_debug())) - } + ast::StrStyle::Cooked => (format!("\"{}\"", st.escape_debug())), ast::StrStyle::Raw(n) => { - (format!("r{delim}\"{string}\"{delim}", - delim="#".repeat(n as usize), - string=st)) + format!("r{delim}\"{string}\"{delim}", delim = "#".repeat(n as usize), string = st) } }; self.word(st) } - fn print_inner_attributes(&mut self, - attrs: &[ast::Attribute]) { + fn print_inner_attributes(&mut self, attrs: &[ast::Attribute]) { self.print_either_attributes(attrs, ast::AttrStyle::Inner, false, true) } - fn print_inner_attributes_no_trailing_hardbreak(&mut self, - attrs: &[ast::Attribute]) - { + fn print_inner_attributes_no_trailing_hardbreak(&mut self, attrs: &[ast::Attribute]) { self.print_either_attributes(attrs, ast::AttrStyle::Inner, false, false) } - fn print_outer_attributes(&mut self, - attrs: &[ast::Attribute]) { + fn print_outer_attributes(&mut self, attrs: &[ast::Attribute]) { self.print_either_attributes(attrs, ast::AttrStyle::Outer, false, true) } - fn print_inner_attributes_inline(&mut self, - attrs: &[ast::Attribute]) { + fn print_inner_attributes_inline(&mut self, attrs: &[ast::Attribute]) { self.print_either_attributes(attrs, ast::AttrStyle::Inner, true, true) } - fn print_outer_attributes_inline(&mut self, - attrs: &[ast::Attribute]) { + fn print_outer_attributes_inline(&mut self, attrs: &[ast::Attribute]) { self.print_either_attributes(attrs, ast::AttrStyle::Outer, true, true) } - fn print_either_attributes(&mut self, - attrs: &[ast::Attribute], - kind: ast::AttrStyle, - is_inline: bool, - trailing_hardbreak: bool) { + fn print_either_attributes( + &mut self, + attrs: &[ast::Attribute], + kind: ast::AttrStyle, + is_inline: bool, + trailing_hardbreak: bool, + ) { let mut count = 0; for attr in attrs { if attr.style == kind { @@ -615,8 +600,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere self.print_attribute_inline(attr, false) } - fn print_attribute_inline(&mut self, attr: &ast::Attribute, - is_inline: bool) { + fn print_attribute_inline(&mut self, attr: &ast::Attribute, is_inline: bool) { if !is_inline { self.hardbreak_if_not_bol(); } @@ -663,12 +647,8 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere fn print_meta_list_item(&mut self, item: &ast::NestedMetaItem) { match item { - ast::NestedMetaItem::MetaItem(ref mi) => { - self.print_meta_item(mi) - }, - ast::NestedMetaItem::Literal(ref lit) => { - self.print_literal(lit) - } + ast::NestedMetaItem::MetaItem(ref mi) => self.print_meta_item(mi), + ast::NestedMetaItem::Literal(ref lit) => self.print_literal(lit), } } @@ -685,9 +665,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere ast::MetaItemKind::List(ref items) => { self.print_path(&item.path, false, 0); self.popen(); - self.commasep(Consistent, - &items[..], - |s, i| s.print_meta_list_item(i)); + self.commasep(Consistent, &items[..], |s, i| s.print_meta_list_item(i)); self.pclose(); } } @@ -706,15 +684,19 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere TokenTree::Token(ref token) => { self.word(token_to_string_ext(&token, convert_dollar_crate)); match token.kind { - token::DocComment(..) => { - self.hardbreak() - } + token::DocComment(..) => self.hardbreak(), _ => {} } } TokenTree::Delimited(dspan, delim, tts) => { self.print_mac_common( - None, false, None, delim, tts, convert_dollar_crate, dspan.entire() + None, + false, + None, + delim, + tts, + convert_dollar_crate, + dspan.entire(), ); } } @@ -812,7 +794,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere self.end(); // Close the head-box. } - fn bclose_maybe_open(&mut self, span: syntax_pos::Span, close_box: bool) { + fn bclose_maybe_open(&mut self, span: rustc_span::Span, close_box: bool) { self.maybe_print_comment(span.hi()); self.break_offset_if_not_bol(1, -(INDENT_UNIT as isize)); self.word("}"); @@ -821,7 +803,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere } } - fn bclose(&mut self, span: syntax_pos::Span) { + fn bclose(&mut self, span: rustc_span::Span) { self.bclose_maybe_open(span, true) } @@ -887,17 +869,9 @@ impl<'a> PrintState<'a> for State<'a> { ast::GenericArgs::Parenthesized(ref data) => { self.s.word("("); - self.commasep( - Inconsistent, - &data.inputs, - |s, ty| s.print_type(ty)); + self.commasep(Inconsistent, &data.inputs, |s, ty| s.print_type(ty)); self.s.word(")"); - - if let Some(ref ty) = data.output { - self.space_if_not_bol(); - self.word_space("->"); - self.print_type(ty); - } + self.print_fn_ret_ty(&data.output); } } } @@ -914,13 +888,10 @@ impl<'a> State<'a> { self.s.word("*/") } - crate fn commasep_cmnt<T, F, G>(&mut self, - b: Breaks, - elts: &[T], - mut op: F, - mut get_span: G) where + crate fn commasep_cmnt<T, F, G>(&mut self, b: Breaks, elts: &[T], mut op: F, mut get_span: G) + where F: FnMut(&mut State<'_>, &T), - G: FnMut(&T) -> syntax_pos::Span, + G: FnMut(&T) -> rustc_span::Span, { self.rbox(0, b); let len = elts.len(); @@ -931,32 +902,25 @@ impl<'a> State<'a> { i += 1; if i < len { self.s.word(","); - self.maybe_print_trailing_comment(get_span(elt), - Some(get_span(&elts[i]).hi())); + self.maybe_print_trailing_comment(get_span(elt), Some(get_span(&elts[i]).hi())); self.space_if_not_bol(); } } self.end(); } - crate fn commasep_exprs(&mut self, b: Breaks, - exprs: &[P<ast::Expr>]) { + crate fn commasep_exprs(&mut self, b: Breaks, exprs: &[P<ast::Expr>]) { self.commasep_cmnt(b, exprs, |s, e| s.print_expr(e), |e| e.span) } - pub fn print_mod( - &mut self, - _mod: &ast::Mod, - attrs: &[ast::Attribute], - ) { + pub fn print_mod(&mut self, _mod: &ast::Mod, attrs: &[ast::Attribute]) { self.print_inner_attributes(attrs); for item in &_mod.items { self.print_item(item); } } - crate fn print_foreign_mod(&mut self, nmod: &ast::ForeignMod, - attrs: &[ast::Attribute]) { + crate fn print_foreign_mod(&mut self, nmod: &ast::ForeignMod, attrs: &[ast::Attribute]) { self.print_inner_attributes(attrs); for item in &nmod.items { self.print_foreign_item(item); @@ -998,11 +962,10 @@ impl<'a> State<'a> { } ast::TyKind::Never => { self.s.word("!"); - }, + } ast::TyKind::Tup(ref elts) => { self.popen(); - self.commasep(Inconsistent, &elts[..], - |s, ty| s.print_type(ty)); + self.commasep(Inconsistent, &elts[..], |s, ty| s.print_type(ty)); if elts.len() == 1 { self.s.word(","); } @@ -1014,18 +977,12 @@ impl<'a> State<'a> { self.pclose(); } ast::TyKind::BareFn(ref f) => { - self.print_ty_fn(f.ext, - f.unsafety, - &f.decl, - None, - &f.generic_params); + self.print_ty_fn(f.ext, f.unsafety, &f.decl, None, &f.generic_params); } ast::TyKind::Path(None, ref path) => { self.print_path(path, false, 0); } - ast::TyKind::Path(Some(ref qself), ref path) => { - self.print_qpath(path, qself, false) - } + ast::TyKind::Path(Some(ref qself), ref path) => self.print_qpath(path, qself, false), ast::TyKind::TraitObject(ref bounds, syntax) => { let prefix = if syntax == ast::TraitObjectSyntax::Dyn { "dyn" } else { "" }; self.print_type_bounds(prefix, &bounds[..]); @@ -1066,24 +1023,27 @@ impl<'a> State<'a> { self.end(); } - crate fn print_foreign_item(&mut self, - item: &ast::ForeignItem) { + crate fn print_foreign_item(&mut self, item: &ast::ForeignItem) { self.hardbreak_if_not_bol(); self.maybe_print_comment(item.span.lo()); self.print_outer_attributes(&item.attrs); match item.kind { ast::ForeignItemKind::Fn(ref decl, ref generics) => { self.head(""); - self.print_fn(decl, ast::FnHeader::default(), - Some(item.ident), - generics, &item.vis); + self.print_fn( + decl, + ast::FnHeader::default(), + Some(item.ident), + generics, + &item.vis, + ); self.end(); // end head-ibox self.s.word(";"); self.end(); // end the outer fn box } ast::ForeignItemKind::Static(ref t, m) => { self.head(visibility_qualified(&item.vis, "static")); - if m == ast::Mutability::Mutable { + if m == ast::Mutability::Mut { self.word_space("mut"); } self.print_ident(item.ident); @@ -1109,12 +1069,13 @@ impl<'a> State<'a> { } } - fn print_associated_const(&mut self, - ident: ast::Ident, - ty: &ast::Ty, - default: Option<&ast::Expr>, - vis: &ast::Visibility) - { + fn print_associated_const( + &mut self, + ident: ast::Ident, + ty: &ast::Ty, + default: Option<&ast::Expr>, + vis: &ast::Visibility, + ) { self.s.word(visibility_qualified(vis, "")); self.word_space("const"); self.print_ident(ident); @@ -1128,16 +1089,15 @@ impl<'a> State<'a> { self.s.word(";") } - fn print_associated_type(&mut self, - ident: ast::Ident, - bounds: Option<&ast::GenericBounds>, - ty: Option<&ast::Ty>) - { + fn print_associated_type( + &mut self, + ident: ast::Ident, + bounds: &ast::GenericBounds, + ty: Option<&ast::Ty>, + ) { self.word_space("type"); self.print_ident(ident); - if let Some(bounds) = bounds { - self.print_type_bounds(":", bounds); - } + self.print_type_bounds(":", bounds); if let Some(ty) = ty { self.s.space(); self.word_space("="); @@ -1175,7 +1135,7 @@ impl<'a> State<'a> { } ast::ItemKind::Static(ref ty, m, ref expr) => { self.head(visibility_qualified(&item.vis, "static")); - if m == ast::Mutability::Mutable { + if m == ast::Mutability::Mut { self.word_space("mut"); } self.print_ident(item.ident); @@ -1204,13 +1164,7 @@ impl<'a> State<'a> { } ast::ItemKind::Fn(ref sig, ref param_names, ref body) => { self.head(""); - self.print_fn( - &sig.decl, - sig.header, - Some(item.ident), - param_names, - &item.vis - ); + self.print_fn(&sig.decl, sig.header, Some(item.ident), param_names, &item.vis); self.s.word(" "); self.print_block_with_attrs(body, &item.attrs); } @@ -1228,7 +1182,6 @@ impl<'a> State<'a> { self.end(); // end inner head-block self.end(); // end outer head-block } - } ast::ItemKind::ForeignMod(ref nmod) => { self.head("extern"); @@ -1259,13 +1212,7 @@ impl<'a> State<'a> { self.end(); // end the outer ibox } ast::ItemKind::Enum(ref enum_definition, ref params) => { - self.print_enum_def( - enum_definition, - params, - item.ident, - item.span, - &item.vis - ); + self.print_enum_def(enum_definition, params, item.ident, item.span, &item.vis); } ast::ItemKind::Struct(ref struct_def, ref generics) => { self.head(visibility_qualified(&item.vis, "struct")); @@ -1275,18 +1222,22 @@ impl<'a> State<'a> { self.head(visibility_qualified(&item.vis, "union")); self.print_struct(struct_def, generics, item.ident, item.span, true); } - ast::ItemKind::Impl(unsafety, - polarity, - defaultness, - ref generics, - ref opt_trait, - ref ty, - ref impl_items) => { + ast::ItemKind::Impl { + unsafety, + polarity, + defaultness, + constness, + ref generics, + ref of_trait, + ref self_ty, + ref items, + } => { self.head(""); self.print_visibility(&item.vis); self.print_defaultness(defaultness); self.print_unsafety(unsafety); self.word_nbsp("impl"); + self.print_constness(constness); if !generics.params.is_empty() { self.print_generic_params(&generics.params); @@ -1297,20 +1248,20 @@ impl<'a> State<'a> { self.s.word("!"); } - if let Some(ref t) = *opt_trait { + if let Some(ref t) = *of_trait { self.print_trait_ref(t); self.s.space(); self.word_space("for"); } - self.print_type(ty); + self.print_type(self_ty); self.print_where_clause(&generics.where_clause); self.s.space(); self.bopen(); self.print_inner_attributes(&item.attrs); - for impl_item in impl_items { - self.print_impl_item(impl_item); + for impl_item in items { + self.print_assoc_item(impl_item); } self.bclose(item.span); } @@ -1337,7 +1288,7 @@ impl<'a> State<'a> { self.s.word(" "); self.bopen(); for trait_item in trait_items { - self.print_trait_item(trait_item); + self.print_assoc_item(trait_item); } self.bclose(item.span); } @@ -1394,10 +1345,7 @@ impl<'a> State<'a> { self.print_path(&t.path, false, 0) } - fn print_formal_generic_params( - &mut self, - generic_params: &[ast::GenericParam] - ) { + fn print_formal_generic_params(&mut self, generic_params: &[ast::GenericParam]) { if !generic_params.is_empty() { self.s.word("for"); self.print_generic_params(generic_params); @@ -1410,10 +1358,14 @@ impl<'a> State<'a> { self.print_trait_ref(&t.trait_ref) } - crate fn print_enum_def(&mut self, enum_definition: &ast::EnumDef, - generics: &ast::Generics, ident: ast::Ident, - span: syntax_pos::Span, - visibility: &ast::Visibility) { + crate fn print_enum_def( + &mut self, + enum_definition: &ast::EnumDef, + generics: &ast::Generics, + ident: ast::Ident, + span: rustc_span::Span, + visibility: &ast::Visibility, + ) { self.head(visibility_qualified(visibility, "enum")); self.print_ident(ident); self.print_generic_params(&generics.params); @@ -1422,9 +1374,7 @@ impl<'a> State<'a> { self.print_variants(&enum_definition.variants, span) } - crate fn print_variants(&mut self, - variants: &[ast::Variant], - span: syntax_pos::Span) { + crate fn print_variants(&mut self, variants: &[ast::Variant], span: rustc_span::Span) { self.bopen(); for v in variants { self.space_if_not_bol(); @@ -1444,8 +1394,8 @@ impl<'a> State<'a> { ast::VisibilityKind::Public => self.word_nbsp("pub"), ast::VisibilityKind::Crate(sugar) => match sugar { ast::CrateSugar::PubCrate => self.word_nbsp("pub(crate)"), - ast::CrateSugar::JustCrate => self.word_nbsp("crate") - } + ast::CrateSugar::JustCrate => self.word_nbsp("crate"), + }, ast::VisibilityKind::Restricted { ref path, .. } => { let path = to_string(|s| s.print_path(path, false, 0)); if path == "self" || path == "super" { @@ -1464,27 +1414,26 @@ impl<'a> State<'a> { } } - crate fn print_struct(&mut self, - struct_def: &ast::VariantData, - generics: &ast::Generics, - ident: ast::Ident, - span: syntax_pos::Span, - print_finalizer: bool) { + crate fn print_struct( + &mut self, + struct_def: &ast::VariantData, + generics: &ast::Generics, + ident: ast::Ident, + span: rustc_span::Span, + print_finalizer: bool, + ) { self.print_ident(ident); self.print_generic_params(&generics.params); match struct_def { ast::VariantData::Tuple(..) | ast::VariantData::Unit(..) => { if let ast::VariantData::Tuple(..) = struct_def { self.popen(); - self.commasep( - Inconsistent, struct_def.fields(), - |s, field| { - s.maybe_print_comment(field.span.lo()); - s.print_outer_attributes(&field.attrs); - s.print_visibility(&field.vis); - s.print_type(&field.ty) - } - ); + self.commasep(Inconsistent, struct_def.fields(), |s, field| { + s.maybe_print_comment(field.span.lo()); + s.print_outer_attributes(&field.attrs); + s.print_visibility(&field.vis); + s.print_type(&field.ty) + }); self.pclose(); } self.print_where_clause(&generics.where_clause); @@ -1531,92 +1480,39 @@ impl<'a> State<'a> { } } - crate fn print_method_sig(&mut self, - ident: ast::Ident, - generics: &ast::Generics, - m: &ast::FnSig, - vis: &ast::Visibility) - { - self.print_fn(&m.decl, - m.header, - Some(ident), - &generics, - vis) - } - - crate fn print_trait_item(&mut self, ti: &ast::TraitItem) - { - self.ann.pre(self, AnnNode::SubItem(ti.id)); + crate fn print_assoc_item(&mut self, item: &ast::AssocItem) { + self.ann.pre(self, AnnNode::SubItem(item.id)); self.hardbreak_if_not_bol(); - self.maybe_print_comment(ti.span.lo()); - self.print_outer_attributes(&ti.attrs); - match ti.kind { - ast::TraitItemKind::Const(ref ty, ref default) => { - self.print_associated_const( - ti.ident, - ty, - default.as_ref().map(|expr| &**expr), - &source_map::respan(ti.span.shrink_to_lo(), ast::VisibilityKind::Inherited), - ); + self.maybe_print_comment(item.span.lo()); + self.print_outer_attributes(&item.attrs); + self.print_defaultness(item.defaultness); + match &item.kind { + ast::AssocItemKind::Const(ty, expr) => { + self.print_associated_const(item.ident, ty, expr.as_deref(), &item.vis); } - ast::TraitItemKind::Method(ref sig, ref body) => { + ast::AssocItemKind::Fn(sig, body) => { if body.is_some() { self.head(""); } - self.print_method_sig( - ti.ident, - &ti.generics, - sig, - &source_map::respan(ti.span.shrink_to_lo(), ast::VisibilityKind::Inherited), - ); - if let Some(ref body) = *body { + self.print_fn(&sig.decl, sig.header, Some(item.ident), &item.generics, &item.vis); + if let Some(body) = body { self.nbsp(); - self.print_block_with_attrs(body, &ti.attrs); + self.print_block_with_attrs(body, &item.attrs); } else { self.s.word(";"); } } - ast::TraitItemKind::Type(ref bounds, ref default) => { - self.print_associated_type(ti.ident, Some(bounds), - default.as_ref().map(|ty| &**ty)); + ast::AssocItemKind::TyAlias(bounds, ty) => { + self.print_associated_type(item.ident, bounds, ty.as_deref()); } - ast::TraitItemKind::Macro(ref mac) => { + ast::AssocItemKind::Macro(mac) => { self.print_mac(mac); if mac.args.need_semicolon() { self.s.word(";"); } } } - self.ann.post(self, AnnNode::SubItem(ti.id)) - } - - crate fn print_impl_item(&mut self, ii: &ast::ImplItem) { - self.ann.pre(self, AnnNode::SubItem(ii.id)); - self.hardbreak_if_not_bol(); - self.maybe_print_comment(ii.span.lo()); - self.print_outer_attributes(&ii.attrs); - self.print_defaultness(ii.defaultness); - match ii.kind { - ast::ImplItemKind::Const(ref ty, ref expr) => { - self.print_associated_const(ii.ident, ty, Some(expr), &ii.vis); - } - ast::ImplItemKind::Method(ref sig, ref body) => { - self.head(""); - self.print_method_sig(ii.ident, &ii.generics, sig, &ii.vis); - self.nbsp(); - self.print_block_with_attrs(body, &ii.attrs); - } - ast::ImplItemKind::TyAlias(ref ty) => { - self.print_associated_type(ii.ident, None, Some(ty)); - } - ast::ImplItemKind::Macro(ref mac) => { - self.print_mac(mac); - if mac.args.need_semicolon() { - self.s.word(";"); - } - } - } - self.ann.post(self, AnnNode::SubItem(ii.id)) + self.ann.post(self, AnnNode::SubItem(item.id)) } crate fn print_stmt(&mut self, st: &ast::Stmt) { @@ -1652,8 +1548,9 @@ impl<'a> State<'a> { // Filter out empty `Tup` exprs created for the `redundant_semicolon` // lint, as they shouldn't be visible and interact poorly // with proc macros. - ast::ExprKind::Tup(ref exprs) if exprs.is_empty() - && expr.attrs.is_empty() => (), + ast::ExprKind::Tup(ref exprs) if exprs.is_empty() && expr.attrs.is_empty() => { + () + } _ => { self.space_if_not_bol(); self.print_expr_outer_attr_style(expr, false); @@ -1682,19 +1579,19 @@ impl<'a> State<'a> { self.print_block_maybe_unclosed(blk, &[], false) } - crate fn print_block_with_attrs(&mut self, - blk: &ast::Block, - attrs: &[ast::Attribute]) { + crate fn print_block_with_attrs(&mut self, blk: &ast::Block, attrs: &[ast::Attribute]) { self.print_block_maybe_unclosed(blk, attrs, true) } - crate fn print_block_maybe_unclosed(&mut self, - blk: &ast::Block, - attrs: &[ast::Attribute], - close_box: bool) { + crate fn print_block_maybe_unclosed( + &mut self, + blk: &ast::Block, + attrs: &[ast::Attribute], + close_box: bool, + ) { match blk.rules { BlockCheckMode::Unsafe(..) => self.word_space("unsafe"), - BlockCheckMode::Default => () + BlockCheckMode::Default => (), } self.maybe_print_comment(blk.span.lo()); self.ann.pre(self, AnnNode::Block(blk)); @@ -1729,7 +1626,7 @@ impl<'a> State<'a> { self.print_expr_cond_paren( scrutinee, Self::cond_needs_par(scrutinee) - || parser::needs_par_as_let_scrutinee(scrutinee.precedence().order()) + || parser::needs_par_as_let_scrutinee(scrutinee.precedence().order()), ) } @@ -1744,7 +1641,7 @@ impl<'a> State<'a> { self.print_expr_as_cond(i); self.s.space(); self.print_block(then); - self.print_else(e.as_ref().map(|e| &**e)) + self.print_else(e.as_deref()) } // Final `else` block. ast::ExprKind::Block(ref b, _) => { @@ -1761,8 +1658,7 @@ impl<'a> State<'a> { } } - crate fn print_if(&mut self, test: &ast::Expr, blk: &ast::Block, - elseopt: Option<&ast::Expr>) { + crate fn print_if(&mut self, test: &ast::Expr, blk: &ast::Block, elseopt: Option<&ast::Expr>) { self.head("if"); self.print_expr_as_cond(test); @@ -1805,9 +1701,7 @@ impl<'a> State<'a> { match expr.kind { // These cases need parens due to the parse error observed in #26461: `if return {}` // parses as the erroneous construct `if (return {})`, not `if (return) {}`. - ast::ExprKind::Closure(..) | - ast::ExprKind::Ret(..) | - ast::ExprKind::Break(..) => true, + ast::ExprKind::Closure(..) | ast::ExprKind::Ret(..) | ast::ExprKind::Break(..) => true, _ => parser::contains_exterior_struct_lit(expr), } @@ -1824,8 +1718,7 @@ impl<'a> State<'a> { } } - fn print_expr_vec(&mut self, exprs: &[P<ast::Expr>], - attrs: &[Attribute]) { + fn print_expr_vec(&mut self, exprs: &[P<ast::Expr>], attrs: &[Attribute]) { self.ibox(INDENT_UNIT); self.s.word("["); self.print_inner_attributes_inline(attrs); @@ -1834,10 +1727,12 @@ impl<'a> State<'a> { self.end(); } - fn print_expr_repeat(&mut self, - element: &ast::Expr, - count: &ast::AnonConst, - attrs: &[Attribute]) { + fn print_expr_repeat( + &mut self, + element: &ast::Expr, + count: &ast::AnonConst, + attrs: &[Attribute], + ) { self.ibox(INDENT_UNIT); self.s.word("["); self.print_inner_attributes_inline(attrs); @@ -1848,11 +1743,13 @@ impl<'a> State<'a> { self.end(); } - fn print_expr_struct(&mut self, - path: &ast::Path, - fields: &[ast::Field], - wth: &Option<P<ast::Expr>>, - attrs: &[Attribute]) { + fn print_expr_struct( + &mut self, + path: &ast::Path, + fields: &[ast::Field], + wth: &Option<P<ast::Expr>>, + attrs: &[Attribute], + ) { self.print_path(path, true, 0); self.s.word("{"); self.print_inner_attributes_inline(attrs); @@ -1868,7 +1765,8 @@ impl<'a> State<'a> { s.print_expr(&field.expr); s.end(); }, - |f| f.span); + |f| f.span, + ); match *wth { Some(ref expr) => { self.ibox(INDENT_UNIT); @@ -1880,15 +1778,16 @@ impl<'a> State<'a> { self.print_expr(expr); self.end(); } - _ => if !fields.is_empty() { - self.s.word(",") + _ => { + if !fields.is_empty() { + self.s.word(",") + } } } self.s.word("}"); } - fn print_expr_tup(&mut self, exprs: &[P<ast::Expr>], - attrs: &[Attribute]) { + fn print_expr_tup(&mut self, exprs: &[P<ast::Expr>], attrs: &[Attribute]) { self.popen(); self.print_inner_attributes_inline(attrs); self.commasep_exprs(Inconsistent, &exprs[..]); @@ -1898,22 +1797,17 @@ impl<'a> State<'a> { self.pclose() } - fn print_expr_call(&mut self, - func: &ast::Expr, - args: &[P<ast::Expr>]) { - let prec = - match func.kind { - ast::ExprKind::Field(..) => parser::PREC_FORCE_PAREN, - _ => parser::PREC_POSTFIX, - }; + fn print_expr_call(&mut self, func: &ast::Expr, args: &[P<ast::Expr>]) { + let prec = match func.kind { + ast::ExprKind::Field(..) => parser::PREC_FORCE_PAREN, + _ => parser::PREC_POSTFIX, + }; self.print_expr_maybe_paren(func, prec); self.print_call_post(args) } - fn print_expr_method_call(&mut self, - segment: &ast::PathSegment, - args: &[P<ast::Expr>]) { + fn print_expr_method_call(&mut self, segment: &ast::PathSegment, args: &[P<ast::Expr>]) { let base_args = &args[1..]; self.print_expr_maybe_paren(&args[0], parser::PREC_POSTFIX); self.s.word("."); @@ -1924,10 +1818,7 @@ impl<'a> State<'a> { self.print_call_post(base_args) } - fn print_expr_binary(&mut self, - op: ast::BinOp, - lhs: &ast::Expr, - rhs: &ast::Expr) { + fn print_expr_binary(&mut self, op: ast::BinOp, lhs: &ast::Expr, rhs: &ast::Expr) { let assoc_op = AssocOp::from_ast_binop(op.node); let prec = assoc_op.precedence() as i8; let fixity = assoc_op.fixity(); @@ -1942,8 +1833,8 @@ impl<'a> State<'a> { // These cases need parens: `x as i32 < y` has the parser thinking that `i32 < y` is // the beginning of a path type. It starts trying to parse `x as (i32 < y ...` instead // of `(x as i32) < ...`. We need to convince it _not_ to do that. - (&ast::ExprKind::Cast { .. }, ast::BinOpKind::Lt) | - (&ast::ExprKind::Cast { .. }, ast::BinOpKind::Shl) => parser::PREC_FORCE_PAREN, + (&ast::ExprKind::Cast { .. }, ast::BinOpKind::Lt) + | (&ast::ExprKind::Cast { .. }, ast::BinOpKind::Shl) => parser::PREC_FORCE_PAREN, // We are given `(let _ = a) OP b`. // // - When `OP <= LAnd` we should print `let _ = a OP b` to avoid redundant parens @@ -1964,17 +1855,17 @@ impl<'a> State<'a> { self.print_expr_maybe_paren(rhs, right_prec) } - fn print_expr_unary(&mut self, - op: ast::UnOp, - expr: &ast::Expr) { + fn print_expr_unary(&mut self, op: ast::UnOp, expr: &ast::Expr) { self.s.word(ast::UnOp::to_string(op)); self.print_expr_maybe_paren(expr, parser::PREC_PREFIX) } - fn print_expr_addr_of(&mut self, - kind: ast::BorrowKind, - mutability: ast::Mutability, - expr: &ast::Expr) { + fn print_expr_addr_of( + &mut self, + kind: ast::BorrowKind, + mutability: ast::Mutability, + expr: &ast::Expr, + ) { self.s.word("&"); match kind { ast::BorrowKind::Ref => self.print_mutability(mutability, false), @@ -1990,9 +1881,7 @@ impl<'a> State<'a> { self.print_expr_outer_attr_style(expr, true) } - fn print_expr_outer_attr_style(&mut self, - expr: &ast::Expr, - is_inline: bool) { + fn print_expr_outer_attr_style(&mut self, expr: &ast::Expr, is_inline: bool) { self.maybe_print_comment(expr.span.lo()); let attrs = &expr.attrs; @@ -2056,7 +1945,7 @@ impl<'a> State<'a> { self.print_let(pat, scrutinee); } ast::ExprKind::If(ref test, ref blk, ref elseopt) => { - self.print_if(test, blk, elseopt.as_ref().map(|e| &**e)); + self.print_if(test, blk, elseopt.as_deref()) } ast::ExprKind::While(ref test, ref blk, opt_label) => { if let Some(label) = opt_label { @@ -2104,12 +1993,18 @@ impl<'a> State<'a> { self.bclose(expr.span); } ast::ExprKind::Closure( - capture_clause, asyncness, movability, ref decl, ref body, _) => { + capture_clause, + asyncness, + movability, + ref decl, + ref body, + _, + ) => { self.print_movability(movability); self.print_asyncness(asyncness); self.print_capture_clause(capture_clause); - self.print_fn_block_params(decl); + self.print_fn_params_and_ret(decl, true); self.s.space(); self.print_expr(body); self.end(); // need to close a box @@ -2143,7 +2038,7 @@ impl<'a> State<'a> { self.print_expr_maybe_paren(expr, parser::PREC_POSTFIX); self.s.word(".await"); } - ast::ExprKind::Assign(ref lhs, ref rhs) => { + ast::ExprKind::Assign(ref lhs, ref rhs, _) => { let prec = AssocOp::Assign.precedence() as i8; self.print_expr_maybe_paren(lhs, prec + 1); self.s.space(); @@ -2187,12 +2082,8 @@ impl<'a> State<'a> { self.print_expr_maybe_paren(e, fake_prec); } } - ast::ExprKind::Path(None, ref path) => { - self.print_path(path, true, 0) - } - ast::ExprKind::Path(Some(ref qself), ref path) => { - self.print_qpath(path, qself, true) - } + ast::ExprKind::Path(None, ref path) => self.print_path(path, true, 0), + ast::ExprKind::Path(Some(ref qself), ref path) => self.print_qpath(path, qself, true), ast::ExprKind::Break(opt_label, ref opt_expr) => { self.s.word("break"); self.s.space(); @@ -2231,10 +2122,9 @@ impl<'a> State<'a> { let mut ch = constraint.chars(); match ch.next() { Some('=') if out.is_rw => { - s.print_string(&format!("+{}", ch.as_str()), - ast::StrStyle::Cooked) + s.print_string(&format!("+{}", ch.as_str()), ast::StrStyle::Cooked) } - _ => s.print_string(&constraint, ast::StrStyle::Cooked) + _ => s.print_string(&constraint, ast::StrStyle::Cooked), } s.popen(); s.print_expr(&out.expr); @@ -2252,8 +2142,7 @@ impl<'a> State<'a> { self.s.space(); self.word_space(":"); - self.commasep(Inconsistent, &a.clobbers, - |s, co| { + self.commasep(Inconsistent, &a.clobbers, |s, co| { s.print_string(&co.as_str(), ast::StrStyle::Cooked); }); @@ -2271,10 +2160,9 @@ impl<'a> State<'a> { if !options.is_empty() { self.s.space(); self.word_space(":"); - self.commasep(Inconsistent, &options, - |s, &co| { - s.print_string(co, ast::StrStyle::Cooked); - }); + self.commasep(Inconsistent, &options, |s, &co| { + s.print_string(co, ast::StrStyle::Cooked); + }); } self.pclose(); @@ -2285,7 +2173,7 @@ impl<'a> State<'a> { self.print_inner_attributes_inline(attrs); self.print_expr(e); self.pclose(); - }, + } ast::ExprKind::Yield(ref e) => { self.s.word("yield"); match *e { @@ -2293,7 +2181,7 @@ impl<'a> State<'a> { self.s.space(); self.print_expr_maybe_paren(expr, parser::PREC_JUMP); } - _ => () + _ => (), } } ast::ExprKind::Try(ref e) => { @@ -2332,11 +2220,7 @@ impl<'a> State<'a> { self.ann.post(self, AnnNode::Name(&name)) } - fn print_qpath(&mut self, - path: &ast::Path, - qself: &ast::QSelf, - colons_before_params: bool) - { + fn print_qpath(&mut self, path: &ast::Path, qself: &ast::QSelf, colons_before_params: bool) { self.s.word("<"); self.print_type(&qself.ty); if qself.position > 0 { @@ -2351,7 +2235,7 @@ impl<'a> State<'a> { self.print_ident(item_segment.ident); match item_segment.args { Some(ref args) => self.print_generic_args(args, colons_before_params), - None => {}, + None => {} } } @@ -2359,7 +2243,7 @@ impl<'a> State<'a> { self.maybe_print_comment(pat.span.lo()); self.ann.pre(self, AnnNode::Pat(pat)); /* Pat isn't normalized, but the beauty of it - is that it doesn't matter */ + is that it doesn't matter */ match pat.kind { PatKind::Wild => self.s.word("_"), PatKind::Ident(binding_mode, ident, ref sub) => { @@ -2368,8 +2252,8 @@ impl<'a> State<'a> { self.word_nbsp("ref"); self.print_mutability(mutbl, false); } - ast::BindingMode::ByValue(ast::Mutability::Immutable) => {} - ast::BindingMode::ByValue(ast::Mutability::Mutable) => { + ast::BindingMode::ByValue(ast::Mutability::Not) => {} + ast::BindingMode::ByValue(ast::Mutability::Mut) => { self.word_nbsp("mut"); } } @@ -2400,7 +2284,8 @@ impl<'a> State<'a> { self.nbsp(); self.word_space("{"); self.commasep_cmnt( - Consistent, &fields[..], + Consistent, + &fields[..], |s, f| { s.cbox(INDENT_UNIT); if !f.is_shorthand { @@ -2410,9 +2295,12 @@ impl<'a> State<'a> { s.print_pat(&f.pat); s.end(); }, - |f| f.pat.span); + |f| f.pat.span, + ); if etc { - if !fields.is_empty() { self.word_space(","); } + if !fields.is_empty() { + self.word_space(","); + } self.s.word(".."); } self.s.space(); @@ -2432,21 +2320,25 @@ impl<'a> State<'a> { } PatKind::Ref(ref inner, mutbl) => { self.s.word("&"); - if mutbl == ast::Mutability::Mutable { + if mutbl == ast::Mutability::Mut { self.s.word("mut "); } self.print_pat(inner); } PatKind::Lit(ref e) => self.print_expr(&**e), PatKind::Range(ref begin, ref end, Spanned { node: ref end_kind, .. }) => { - self.print_expr(begin); - self.s.space(); + if let Some(e) = begin { + self.print_expr(e); + self.s.space(); + } match *end_kind { RangeEnd::Included(RangeSyntax::DotDotDot) => self.s.word("..."), RangeEnd::Included(RangeSyntax::DotDotEq) => self.s.word("..="), RangeEnd::Excluded => self.s.word(".."), } - self.print_expr(end); + if let Some(e) = end { + self.print_expr(e); + } } PatKind::Slice(ref elts) => { self.s.word("["); @@ -2527,12 +2419,14 @@ impl<'a> State<'a> { } } - crate fn print_fn(&mut self, - decl: &ast::FnDecl, - header: ast::FnHeader, - name: Option<ast::Ident>, - generics: &ast::Generics, - vis: &ast::Visibility) { + crate fn print_fn( + &mut self, + decl: &ast::FnDecl, + header: ast::FnHeader, + name: Option<ast::Ident>, + generics: &ast::Generics, + vis: &ast::Visibility, + ) { self.print_fn_header_info(header, vis); if let Some(name) = name { @@ -2540,42 +2434,22 @@ impl<'a> State<'a> { self.print_ident(name); } self.print_generic_params(&generics.params); - self.print_fn_params_and_ret(decl); + self.print_fn_params_and_ret(decl, false); self.print_where_clause(&generics.where_clause) } - crate fn print_fn_params_and_ret(&mut self, decl: &ast::FnDecl) { - self.popen(); - self.commasep(Inconsistent, &decl.inputs, |s, param| s.print_param(param, false)); - self.pclose(); - - self.print_fn_output(decl) - } - - crate fn print_fn_block_params(&mut self, decl: &ast::FnDecl) { - self.s.word("|"); - self.commasep(Inconsistent, &decl.inputs, |s, param| s.print_param(param, true)); - self.s.word("|"); - - if let ast::FunctionRetTy::Default(..) = decl.output { - return; - } - - self.space_if_not_bol(); - self.word_space("->"); - match decl.output { - ast::FunctionRetTy::Ty(ref ty) => { - self.print_type(ty); - self.maybe_print_comment(ty.span.lo()) - } - ast::FunctionRetTy::Default(..) => unreachable!(), - } + crate fn print_fn_params_and_ret(&mut self, decl: &ast::FnDecl, is_closure: bool) { + let (open, close) = if is_closure { ("|", "|") } else { ("(", ")") }; + self.word(open); + self.commasep(Inconsistent, &decl.inputs, |s, param| s.print_param(param, is_closure)); + self.word(close); + self.print_fn_ret_ty(&decl.output) } crate fn print_movability(&mut self, movability: ast::Movability) { match movability { ast::Movability::Static => self.word_space("static"), - ast::Movability::Movable => {}, + ast::Movability::Movable => {} } } @@ -2588,7 +2462,7 @@ impl<'a> State<'a> { crate fn print_capture_clause(&mut self, capture_clause: ast::CaptureBy) { match capture_clause { ast::CaptureBy::Value => self.word_space("move"), - ast::CaptureBy::Ref => {}, + ast::CaptureBy::Ref => {} } } @@ -2624,7 +2498,10 @@ impl<'a> State<'a> { } crate fn print_lifetime_bounds( - &mut self, lifetime: ast::Lifetime, bounds: &ast::GenericBounds) { + &mut self, + lifetime: ast::Lifetime, + bounds: &ast::GenericBounds, + ) { self.print_lifetime(lifetime); if !bounds.is_empty() { self.s.word(": "); @@ -2702,14 +2579,18 @@ impl<'a> State<'a> { self.print_type(bounded_ty); self.print_type_bounds(":", bounds); } - ast::WherePredicate::RegionPredicate(ast::WhereRegionPredicate{ref lifetime, - ref bounds, - ..}) => { + ast::WherePredicate::RegionPredicate(ast::WhereRegionPredicate { + ref lifetime, + ref bounds, + .. + }) => { self.print_lifetime_bounds(*lifetime, bounds); } - ast::WherePredicate::EqPredicate(ast::WhereEqPredicate{ref lhs_ty, - ref rhs_ty, - ..}) => { + ast::WherePredicate::EqPredicate(ast::WhereEqPredicate { + ref lhs_ty, + ref rhs_ty, + .. + }) => { self.print_type(lhs_ty); self.s.space(); self.word_space("="); @@ -2753,8 +2634,12 @@ impl<'a> State<'a> { pub fn print_mutability(&mut self, mutbl: ast::Mutability, print_const: bool) { match mutbl { - ast::Mutability::Mutable => self.word_nbsp("mut"), - ast::Mutability::Immutable => if print_const { self.word_nbsp("const"); }, + ast::Mutability::Mut => self.word_nbsp("mut"), + ast::Mutability::Not => { + if print_const { + self.word_nbsp("const"); + } + } } } @@ -2791,34 +2676,25 @@ impl<'a> State<'a> { self.end(); } - crate fn print_fn_output(&mut self, decl: &ast::FnDecl) { - if let ast::FunctionRetTy::Default(..) = decl.output { - return; - } - - self.space_if_not_bol(); - self.ibox(INDENT_UNIT); - self.word_space("->"); - match decl.output { - ast::FunctionRetTy::Default(..) => unreachable!(), - ast::FunctionRetTy::Ty(ref ty) => - self.print_type(ty), - } - self.end(); - - match decl.output { - ast::FunctionRetTy::Ty(ref output) => self.maybe_print_comment(output.span.lo()), - _ => {} + crate fn print_fn_ret_ty(&mut self, fn_ret_ty: &ast::FunctionRetTy) { + if let ast::FunctionRetTy::Ty(ty) = fn_ret_ty { + self.space_if_not_bol(); + self.ibox(INDENT_UNIT); + self.word_space("->"); + self.print_type(ty); + self.end(); + self.maybe_print_comment(ty.span.lo()); } } - crate fn print_ty_fn(&mut self, - ext: ast::Extern, - unsafety: ast::Unsafety, - decl: &ast::FnDecl, - name: Option<ast::Ident>, - generic_params: &[ast::GenericParam]) - { + crate fn print_ty_fn( + &mut self, + ext: ast::Extern, + unsafety: ast::Unsafety, + decl: &ast::FnDecl, + name: Option<ast::Ident>, + generic_params: &[ast::GenericParam], + ) { self.ibox(INDENT_UNIT); if !generic_params.is_empty() { self.s.word("for"); @@ -2826,23 +2702,24 @@ impl<'a> State<'a> { } let generics = ast::Generics { params: Vec::new(), - where_clause: ast::WhereClause { - predicates: Vec::new(), - span: syntax_pos::DUMMY_SP, - }, - span: syntax_pos::DUMMY_SP, + where_clause: ast::WhereClause { predicates: Vec::new(), span: rustc_span::DUMMY_SP }, + span: rustc_span::DUMMY_SP, }; - self.print_fn(decl, - ast::FnHeader { unsafety, ext, ..ast::FnHeader::default() }, - name, - &generics, - &source_map::dummy_spanned(ast::VisibilityKind::Inherited)); + self.print_fn( + decl, + ast::FnHeader { unsafety, ext, ..ast::FnHeader::default() }, + name, + &generics, + &dummy_spanned(ast::VisibilityKind::Inherited), + ); self.end(); } - crate fn maybe_print_trailing_comment(&mut self, span: syntax_pos::Span, - next_pos: Option<BytePos>) - { + crate fn maybe_print_trailing_comment( + &mut self, + span: rustc_span::Span, + next_pos: Option<BytePos>, + ) { if let Some(cmnts) = self.comments() { if let Some(cmnt) = cmnts.trailing_comment(span, next_pos) { self.print_comment(&cmnt); @@ -2861,14 +2738,12 @@ impl<'a> State<'a> { } } - crate fn print_fn_header_info(&mut self, - header: ast::FnHeader, - vis: &ast::Visibility) { + crate fn print_fn_header_info(&mut self, header: ast::FnHeader, vis: &ast::Visibility) { self.s.word(visibility_qualified(vis, "")); match header.constness.node { ast::Constness::NotConst => {} - ast::Constness::Const => self.word_nbsp("const") + ast::Constness::Const => self.word_nbsp("const"), } self.print_asyncness(header.asyncness.node); @@ -2891,11 +2766,18 @@ impl<'a> State<'a> { crate fn print_unsafety(&mut self, s: ast::Unsafety) { match s { - ast::Unsafety::Normal => {}, + ast::Unsafety::Normal => {} ast::Unsafety::Unsafe => self.word_nbsp("unsafe"), } } + crate fn print_constness(&mut self, s: ast::Constness) { + match s { + ast::Constness::Const => self.word_nbsp("const"), + ast::Constness::NotConst => {} + } + } + crate fn print_is_auto(&mut self, s: ast::IsAuto) { match s { ast::IsAuto::Yes => self.word_nbsp("auto"), diff --git a/src/libsyntax/print/pprust/tests.rs b/src/libsyntax/print/pprust/tests.rs index d7725acb5d..3091e31558 100644 --- a/src/libsyntax/print/pprust/tests.rs +++ b/src/libsyntax/print/pprust/tests.rs @@ -1,17 +1,25 @@ use super::*; use crate::ast; -use crate::source_map; use crate::with_default_globals; -use syntax_pos; +use rustc_span; +use rustc_span::source_map::{dummy_spanned, respan}; fn fun_to_string( - decl: &ast::FnDecl, header: ast::FnHeader, name: ast::Ident, generics: &ast::Generics + decl: &ast::FnDecl, + header: ast::FnHeader, + name: ast::Ident, + generics: &ast::Generics, ) -> String { to_string(|s| { s.head(""); - s.print_fn(decl, header, Some(name), - generics, &source_map::dummy_spanned(ast::VisibilityKind::Inherited)); + s.print_fn( + decl, + header, + Some(name), + generics, + &dummy_spanned(ast::VisibilityKind::Inherited), + ); s.end(); // Close the head box. s.end(); // Close the outer box. }) @@ -28,16 +36,11 @@ fn test_fun_to_string() { let decl = ast::FnDecl { inputs: Vec::new(), - output: ast::FunctionRetTy::Default(syntax_pos::DUMMY_SP), + output: ast::FunctionRetTy::Default(rustc_span::DUMMY_SP), }; let generics = ast::Generics::default(); assert_eq!( - fun_to_string( - &decl, - ast::FnHeader::default(), - abba_ident, - &generics - ), + fun_to_string(&decl, ast::FnHeader::default(), abba_ident, &generics), "fn abba()" ); }) @@ -50,12 +53,12 @@ fn test_variant_to_string() { let var = ast::Variant { ident, - vis: source_map::respan(syntax_pos::DUMMY_SP, ast::VisibilityKind::Inherited), + vis: respan(rustc_span::DUMMY_SP, ast::VisibilityKind::Inherited), attrs: Vec::new(), id: ast::DUMMY_NODE_ID, data: ast::VariantData::Unit(ast::DUMMY_NODE_ID), disr_expr: None, - span: syntax_pos::DUMMY_SP, + span: rustc_span::DUMMY_SP, is_placeholder: false, }; diff --git a/src/libsyntax/ptr.rs b/src/libsyntax/ptr.rs index d987dc855b..4597624ef8 100644 --- a/src/libsyntax/ptr.rs +++ b/src/libsyntax/ptr.rs @@ -1,17 +1,12 @@ //! The AST pointer. //! -//! Provides `P<T>`, a frozen owned smart pointer, as a replacement for `@T` in -//! the AST. +//! Provides `P<T>`, a frozen owned smart pointer. //! //! # Motivations and benefits //! //! * **Identity**: sharing AST nodes is problematic for the various analysis //! passes (e.g., one may be able to bypass the borrow checker with a shared -//! `ExprKind::AddrOf` node taking a mutable borrow). The only reason `@T` in the -//! AST hasn't caused issues is because of inefficient folding passes which -//! would always deduplicate any such shared nodes. Even if the AST were to -//! switch to an arena, this would still hold, i.e., it couldn't use `&'a T`, -//! but rather a wrapper like `P<'a, T>`. +//! `ExprKind::AddrOf` node taking a mutable borrow). //! //! * **Immutability**: `P<T>` disallows mutating its inner `T`, unlike `Box<T>` //! (unless it contains an `Unsafe` interior, but that may be denied later). @@ -26,31 +21,30 @@ //! implementation changes (using a special thread-local heap, for example). //! Moreover, a switch to, e.g., `P<'a, T>` would be easy and mostly automated. -use std::fmt::{self, Display, Debug}; +use std::fmt::{self, Debug, Display}; use std::iter::FromIterator; use std::ops::{Deref, DerefMut}; use std::{slice, vec}; -use rustc_serialize::{Encodable, Decodable, Encoder, Decoder}; +use rustc_serialize::{Decodable, Decoder, Encodable, Encoder}; -use rustc_data_structures::stable_hasher::{StableHasher, HashStable}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; /// An owned smart pointer. pub struct P<T: ?Sized> { - ptr: Box<T> + ptr: Box<T>, } /// Construct a `P<T>` from a `T` value. #[allow(non_snake_case)] pub fn P<T: 'static>(value: T) -> P<T> { - P { - ptr: box value - } + P { ptr: box value } } impl<T: 'static> P<T> { /// Move out of the pointer. /// Intended for chaining transformations not covered by `map`. - pub fn and_then<U, F>(self, f: F) -> U where + pub fn and_then<U, F>(self, f: F) -> U + where F: FnOnce(T) -> U, { f(*self.ptr) @@ -62,7 +56,8 @@ impl<T: 'static> P<T> { } /// Produce a new `P<T>` from `self` without reallocating. - pub fn map<F>(mut self, f: F) -> P<T> where + pub fn map<F>(mut self, f: F) -> P<T> + where F: FnOnce(T) -> T, { let x = f(*self.ptr); @@ -72,7 +67,8 @@ impl<T: 'static> P<T> { } /// Optionally produce a new `P<T>` from `self` without reallocating. - pub fn filter_map<F>(mut self, f: F) -> Option<P<T>> where + pub fn filter_map<F>(mut self, f: F) -> Option<P<T>> + where F: FnOnce(T) -> Option<T>, { *self.ptr = f(*self.ptr)?; @@ -179,7 +175,7 @@ impl<T> Into<Vec<T>> for P<[T]> { } impl<T> FromIterator<T> for P<[T]> { - fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> P<[T]> { + fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> P<[T]> { P::from_vec(iter.into_iter().collect()) } } @@ -214,7 +210,8 @@ impl<T: Decodable> Decodable for P<[T]> { } impl<CTX, T> HashStable<CTX> for P<T> - where T: ?Sized + HashStable<CTX> +where + T: ?Sized + HashStable<CTX>, { fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) { (**self).hash_stable(hcx, hasher); diff --git a/src/libsyntax/token.rs b/src/libsyntax/token.rs index 6f45211ac5..14279561cb 100644 --- a/src/libsyntax/token.rs +++ b/src/libsyntax/token.rs @@ -1,22 +1,21 @@ pub use BinOpToken::*; -pub use Nonterminal::*; pub use DelimToken::*; pub use LitKind::*; +pub use Nonterminal::*; pub use TokenKind::*; use crate::ast; use crate::ptr::P; -use crate::symbol::kw; use crate::tokenstream::TokenTree; -use syntax_pos::symbol::Symbol; -use syntax_pos::{self, Span, DUMMY_SP}; - -use std::fmt; -use std::mem; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_data_structures::sync::Lrc; use rustc_macros::HashStable_Generic; +use rustc_span::symbol::kw; +use rustc_span::symbol::Symbol; +use rustc_span::{self, Span, DUMMY_SP}; +use std::fmt; +use std::mem; #[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)] #[derive(HashStable_Generic)] @@ -83,20 +82,23 @@ impl fmt::Display for Lit { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let Lit { kind, symbol, suffix } = *self; match kind { - Byte => write!(f, "b'{}'", symbol)?, - Char => write!(f, "'{}'", symbol)?, - Str => write!(f, "\"{}\"", symbol)?, - StrRaw(n) => write!(f, "r{delim}\"{string}\"{delim}", - delim="#".repeat(n as usize), - string=symbol)?, - ByteStr => write!(f, "b\"{}\"", symbol)?, - ByteStrRaw(n) => write!(f, "br{delim}\"{string}\"{delim}", - delim="#".repeat(n as usize), - string=symbol)?, - Integer | - Float | - Bool | - Err => write!(f, "{}", symbol)?, + Byte => write!(f, "b'{}'", symbol)?, + Char => write!(f, "'{}'", symbol)?, + Str => write!(f, "\"{}\"", symbol)?, + StrRaw(n) => write!( + f, + "r{delim}\"{string}\"{delim}", + delim = "#".repeat(n as usize), + string = symbol + )?, + ByteStr => write!(f, "b\"{}\"", symbol)?, + ByteStrRaw(n) => write!( + f, + "br{delim}\"{string}\"{delim}", + delim = "#".repeat(n as usize), + string = symbol + )?, + Integer | Float | Bool | Err => write!(f, "{}", symbol)?, } if let Some(suffix) = suffix { @@ -149,48 +151,41 @@ pub fn ident_can_begin_expr(name: ast::Name, span: Span, is_raw: bool) -> bool { } pub fn token_can_begin_expr(ident_token: &Token) -> bool { - !ident_token.is_reserved_ident() || - ident_token.is_path_segment_keyword() || - match ident_token.kind { - TokenKind::Ident(ident, _) => [ - kw::Async, - kw::Do, - kw::Box, - kw::Break, - kw::Continue, - kw::False, - kw::For, - kw::If, - kw::Let, - kw::Loop, - kw::Match, - kw::Move, - kw::Return, - kw::True, - kw::Unsafe, - kw::While, - kw::Yield, - kw::Static, - ].contains(&ident), - _=> false, - } + !ident_token.is_reserved_ident() + || ident_token.is_path_segment_keyword() + || match ident_token.kind { + TokenKind::Ident(ident, _) => [ + kw::Async, + kw::Do, + kw::Box, + kw::Break, + kw::Continue, + kw::False, + kw::For, + kw::If, + kw::Let, + kw::Loop, + kw::Match, + kw::Move, + kw::Return, + kw::True, + kw::Unsafe, + kw::While, + kw::Yield, + kw::Static, + ] + .contains(&ident), + _ => false, + } } fn ident_can_begin_type(name: ast::Name, span: Span, is_raw: bool) -> bool { let ident_token = Token::new(Ident(name, is_raw), span); - !ident_token.is_reserved_ident() || - ident_token.is_path_segment_keyword() || - [ - kw::Underscore, - kw::For, - kw::Impl, - kw::Fn, - kw::Unsafe, - kw::Extern, - kw::Typeof, - kw::Dyn, - ].contains(&name) + !ident_token.is_reserved_ident() + || ident_token.is_path_segment_keyword() + || [kw::Underscore, kw::For, kw::Impl, kw::Fn, kw::Unsafe, kw::Extern, kw::Typeof, kw::Dyn] + .contains(&name) } #[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, HashStable_Generic)] @@ -249,7 +244,6 @@ pub enum TokenKind { // Junk. These carry no data because we don't really care about the data // they *would* carry, and don't really want to allocate a new ident for // them. Instead, users could extract that from the associated span. - /// Whitespace. Whitespace, /// A comment. @@ -282,7 +276,7 @@ impl TokenKind { match *self { Comma => Some(vec![Dot, Lt, Semi]), Semi => Some(vec![Colon, Comma]), - _ => None + _ => None, } } } @@ -309,9 +303,8 @@ impl Token { pub fn is_op(&self) -> bool { match self.kind { - OpenDelim(..) | CloseDelim(..) | Literal(..) | DocComment(..) | - Ident(..) | Lifetime(..) | Interpolated(..) | - Whitespace | Comment | Shebang(..) | Eof => false, + OpenDelim(..) | CloseDelim(..) | Literal(..) | DocComment(..) | Ident(..) + | Lifetime(..) | Interpolated(..) | Whitespace | Comment | Shebang(..) | Eof => false, _ => true, } } @@ -385,22 +378,25 @@ impl Token { Interpolated(ref nt) => match **nt { NtExpr(..) | NtBlock(..) | NtLiteral(..) => true, _ => false, - } + }, _ => self.can_begin_literal_or_bool(), } } /// Returns `true` if the token can appear at the start of a generic bound. pub fn can_begin_bound(&self) -> bool { - self.is_path_start() || self.is_lifetime() || self.is_keyword(kw::For) || - self == &Question || self == &OpenDelim(Paren) + self.is_path_start() + || self.is_lifetime() + || self.is_keyword(kw::For) + || self == &Question + || self == &OpenDelim(Paren) } /// Returns `true` if the token is any literal pub fn is_lit(&self) -> bool { match self.kind { Literal(..) => true, - _ => false, + _ => false, } } @@ -412,9 +408,9 @@ impl Token { Ident(name, false) if name.is_bool_lit() => true, Interpolated(ref nt) => match **nt { NtLiteral(..) => true, - _ => false, + _ => false, }, - _ => false, + _ => false, } } @@ -483,8 +479,7 @@ impl Token { /// Returns `true` if the token is either the `mut` or `const` keyword. pub fn is_mutability(&self) -> bool { - self.is_keyword(kw::Mut) || - self.is_keyword(kw::Const) + self.is_keyword(kw::Mut) || self.is_keyword(kw::Const) } pub fn is_qpath_start(&self) -> bool { @@ -492,8 +487,11 @@ impl Token { } pub fn is_path_start(&self) -> bool { - self == &ModSep || self.is_qpath_start() || self.is_path() || - self.is_path_segment_keyword() || self.is_ident() && !self.is_reserved_ident() + self == &ModSep + || self.is_qpath_start() + || self.is_path() + || self.is_path_segment_keyword() + || self.is_ident() && !self.is_reserved_ident() } /// Returns `true` if the token is a given keyword, `kw`. @@ -589,11 +587,11 @@ impl Token { _ => return None, }, - Le | EqEq | Ne | Ge | AndAnd | OrOr | Tilde | BinOpEq(..) | At | DotDotDot | - DotDotEq | Comma | Semi | ModSep | RArrow | LArrow | FatArrow | Pound | Dollar | - Question | OpenDelim(..) | CloseDelim(..) | - Literal(..) | Ident(..) | Lifetime(..) | Interpolated(..) | DocComment(..) | - Whitespace | Comment | Shebang(..) | Unknown(..) | Eof => return None, + Le | EqEq | Ne | Ge | AndAnd | OrOr | Tilde | BinOpEq(..) | At | DotDotDot + | DotDotEq | Comma | Semi | ModSep | RArrow | LArrow | FatArrow | Pound | Dollar + | Question | OpenDelim(..) | CloseDelim(..) | Literal(..) | Ident(..) + | Lifetime(..) | Interpolated(..) | DocComment(..) | Whitespace | Comment + | Shebang(..) | Unknown(..) | Eof => return None, }; Some(Token::new(kind, self.span.to(joint.span))) @@ -603,54 +601,51 @@ impl Token { // *probably* equal here rather than actual equality crate fn probably_equal_for_proc_macro(&self, other: &Token) -> bool { if mem::discriminant(&self.kind) != mem::discriminant(&other.kind) { - return false + return false; } match (&self.kind, &other.kind) { - (&Eq, &Eq) | - (&Lt, &Lt) | - (&Le, &Le) | - (&EqEq, &EqEq) | - (&Ne, &Ne) | - (&Ge, &Ge) | - (&Gt, &Gt) | - (&AndAnd, &AndAnd) | - (&OrOr, &OrOr) | - (&Not, &Not) | - (&Tilde, &Tilde) | - (&At, &At) | - (&Dot, &Dot) | - (&DotDot, &DotDot) | - (&DotDotDot, &DotDotDot) | - (&DotDotEq, &DotDotEq) | - (&Comma, &Comma) | - (&Semi, &Semi) | - (&Colon, &Colon) | - (&ModSep, &ModSep) | - (&RArrow, &RArrow) | - (&LArrow, &LArrow) | - (&FatArrow, &FatArrow) | - (&Pound, &Pound) | - (&Dollar, &Dollar) | - (&Question, &Question) | - (&Whitespace, &Whitespace) | - (&Comment, &Comment) | - (&Eof, &Eof) => true, - - (&BinOp(a), &BinOp(b)) | - (&BinOpEq(a), &BinOpEq(b)) => a == b, - - (&OpenDelim(a), &OpenDelim(b)) | - (&CloseDelim(a), &CloseDelim(b)) => a == b, - - (&DocComment(a), &DocComment(b)) | - (&Shebang(a), &Shebang(b)) => a == b, + (&Eq, &Eq) + | (&Lt, &Lt) + | (&Le, &Le) + | (&EqEq, &EqEq) + | (&Ne, &Ne) + | (&Ge, &Ge) + | (&Gt, &Gt) + | (&AndAnd, &AndAnd) + | (&OrOr, &OrOr) + | (&Not, &Not) + | (&Tilde, &Tilde) + | (&At, &At) + | (&Dot, &Dot) + | (&DotDot, &DotDot) + | (&DotDotDot, &DotDotDot) + | (&DotDotEq, &DotDotEq) + | (&Comma, &Comma) + | (&Semi, &Semi) + | (&Colon, &Colon) + | (&ModSep, &ModSep) + | (&RArrow, &RArrow) + | (&LArrow, &LArrow) + | (&FatArrow, &FatArrow) + | (&Pound, &Pound) + | (&Dollar, &Dollar) + | (&Question, &Question) + | (&Whitespace, &Whitespace) + | (&Comment, &Comment) + | (&Eof, &Eof) => true, + + (&BinOp(a), &BinOp(b)) | (&BinOpEq(a), &BinOpEq(b)) => a == b, + + (&OpenDelim(a), &OpenDelim(b)) | (&CloseDelim(a), &CloseDelim(b)) => a == b, + + (&DocComment(a), &DocComment(b)) | (&Shebang(a), &Shebang(b)) => a == b, (&Literal(a), &Literal(b)) => a == b, (&Lifetime(a), &Lifetime(b)) => a == b, - (&Ident(a, b), &Ident(c, d)) => b == d && (a == c || - a == kw::DollarCrate || - c == kw::DollarCrate), + (&Ident(a, b), &Ident(c, d)) => { + b == d && (a == c || a == kw::DollarCrate || c == kw::DollarCrate) + } (&Interpolated(_), &Interpolated(_)) => false, @@ -685,16 +680,17 @@ pub enum Nonterminal { // Used only for passing items to proc macro attributes (they are not // strictly necessary for that, `Annotatable` can be converted into // tokens directly, but doing that naively regresses pretty-printing). - NtTraitItem(ast::TraitItem), - NtImplItem(ast::ImplItem), + NtTraitItem(ast::AssocItem), + NtImplItem(ast::AssocItem), NtForeignItem(ast::ForeignItem), } impl PartialEq for Nonterminal { fn eq(&self, rhs: &Self) -> bool { match (self, rhs) { - (NtIdent(ident_lhs, is_raw_lhs), NtIdent(ident_rhs, is_raw_rhs)) => - ident_lhs == ident_rhs && is_raw_lhs == is_raw_rhs, + (NtIdent(ident_lhs, is_raw_lhs), NtIdent(ident_rhs, is_raw_rhs)) => { + ident_lhs == ident_rhs && is_raw_lhs == is_raw_rhs + } (NtLifetime(ident_lhs), NtLifetime(ident_rhs)) => ident_lhs == ident_rhs, (NtTT(tt_lhs), NtTT(tt_rhs)) => tt_lhs == tt_rhs, // FIXME: Assume that all "complex" nonterminal are not equal, we can't compare them @@ -730,7 +726,8 @@ impl fmt::Debug for Nonterminal { } impl<CTX> HashStable<CTX> for Nonterminal - where CTX: crate::HashStableContext +where + CTX: crate::HashStableContext, { fn hash_stable(&self, _hcx: &mut CTX, _hasher: &mut StableHasher) { panic!("interpolated tokens should not be present in the HIR") diff --git a/src/libsyntax/tokenstream.rs b/src/libsyntax/tokenstream.rs index 491b9a9ade..03e8fff247 100644 --- a/src/libsyntax/tokenstream.rs +++ b/src/libsyntax/tokenstream.rs @@ -15,11 +15,11 @@ use crate::token::{self, DelimToken, Token, TokenKind}; -use syntax_pos::{Span, DUMMY_SP}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; -use rustc_macros::HashStable_Generic; use rustc_data_structures::sync::Lrc; -use smallvec::{SmallVec, smallvec}; +use rustc_macros::HashStable_Generic; +use rustc_span::{Span, DUMMY_SP}; +use smallvec::{smallvec, SmallVec}; use std::{iter, mem}; @@ -51,7 +51,8 @@ where DelimSpan: Send + Sync, DelimToken: Send + Sync, TokenStream: Send + Sync, -{} +{ +} impl TokenTree { /// Checks if this TokenTree is equal to the other, regardless of span information. @@ -118,7 +119,8 @@ impl TokenTree { } impl<CTX> HashStable<CTX> for TokenStream - where CTX: crate::HashStableContext +where + CTX: crate::HashStableContext, { fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) { for sub_tt in self.trees() { @@ -144,7 +146,7 @@ rustc_data_structures::static_assert_size!(TokenStream, 8); #[derive(Clone, Copy, Debug, PartialEq, RustcEncodable, RustcDecodable)] pub enum IsJoint { Joint, - NonJoint + NonJoint, } use IsJoint::*; @@ -160,12 +162,16 @@ impl TokenStream { if let Some((_, next)) = iter.peek() { let sp = match (&ts, &next) { (_, (TokenTree::Token(Token { kind: token::Comma, .. }), _)) => continue, - ((TokenTree::Token(token_left), NonJoint), - (TokenTree::Token(token_right), _)) - if ((token_left.is_ident() && !token_left.is_reserved_ident()) - || token_left.is_lit()) && - ((token_right.is_ident() && !token_right.is_reserved_ident()) - || token_right.is_lit()) => token_left.span, + ( + (TokenTree::Token(token_left), NonJoint), + (TokenTree::Token(token_right), _), + ) if ((token_left.is_ident() && !token_left.is_reserved_ident()) + || token_left.is_lit()) + && ((token_right.is_ident() && !token_right.is_reserved_ident()) + || token_right.is_lit()) => + { + token_left.span + } ((TokenTree::Delimited(sp, ..), NonJoint), _) => sp.entire(), _ => continue, }; @@ -251,10 +257,7 @@ impl TokenStream { // Determine how much the first stream will be extended. // Needed to avoid quadratic blow up from on-the-fly // reallocations (#57735). - let num_appends = streams.iter() - .skip(1) - .map(|ts| ts.len()) - .sum(); + let num_appends = streams.iter().skip(1).map(|ts| ts.len()).sum(); // Get the first stream. If it's `None`, create an empty // stream. @@ -344,16 +347,13 @@ impl TokenStream { .iter() .enumerate() .map(|(i, (tree, is_joint))| (f(i, tree.clone()), *is_joint)) - .collect() + .collect(), )) } pub fn map<F: FnMut(TokenTree) -> TokenTree>(self, mut f: F) -> TokenStream { TokenStream(Lrc::new( - self.0 - .iter() - .map(|(tree, is_joint)| (f(tree.clone()), *is_joint)) - .collect() + self.0.iter().map(|(tree, is_joint)| (f(tree.clone()), *is_joint)).collect(), )) } } @@ -374,15 +374,12 @@ impl TokenStreamBuilder { // token tree marked with `Joint`... if let Some(TokenStream(ref mut last_stream_lrc)) = self.0.last_mut() { if let Some((TokenTree::Token(last_token), Joint)) = last_stream_lrc.last() { - // ...and `stream` is not empty and the first tree within it is // a token tree... let TokenStream(ref mut stream_lrc) = stream; if let Some((TokenTree::Token(token), is_joint)) = stream_lrc.first() { - // ...and the two tokens can be glued together... if let Some(glued_tok) = last_token.glue(&token) { - // ...then do so, by overwriting the last token // tree in `self` and removing the first token tree // from `stream`. This requires using `make_mut()` @@ -460,7 +457,7 @@ impl Cursor { } pub fn look_ahead(&self, n: usize) -> Option<TokenTree> { - self.stream.0[self.index ..].get(n).map(|(tree, _)| tree.clone()) + self.stream.0[self.index..].get(n).map(|(tree, _)| tree.clone()) } } @@ -472,10 +469,7 @@ pub struct DelimSpan { impl DelimSpan { pub fn from_single(sp: Span) -> Self { - DelimSpan { - open: sp, - close: sp, - } + DelimSpan { open: sp, close: sp } } pub fn from_pair(open: Span, close: Span) -> Self { diff --git a/src/libsyntax/util/classify.rs b/src/libsyntax/util/classify.rs index 4456068875..60422a2e57 100644 --- a/src/libsyntax/util/classify.rs +++ b/src/libsyntax/util/classify.rs @@ -13,13 +13,13 @@ use crate::ast; /// isn't parsed as (if true {...} else {...} | x) | 5 pub fn expr_requires_semi_to_be_stmt(e: &ast::Expr) -> bool { match e.kind { - ast::ExprKind::If(..) | - ast::ExprKind::Match(..) | - ast::ExprKind::Block(..) | - ast::ExprKind::While(..) | - ast::ExprKind::Loop(..) | - ast::ExprKind::ForLoop(..) | - ast::ExprKind::TryBlock(..) => false, + ast::ExprKind::If(..) + | ast::ExprKind::Match(..) + | ast::ExprKind::Block(..) + | ast::ExprKind::While(..) + | ast::ExprKind::Loop(..) + | ast::ExprKind::ForLoop(..) + | ast::ExprKind::TryBlock(..) => false, _ => true, } } diff --git a/src/libsyntax/util/comments.rs b/src/libsyntax/util/comments.rs index 5e9b7bf832..c385b498ce 100644 --- a/src/libsyntax/util/comments.rs +++ b/src/libsyntax/util/comments.rs @@ -1,10 +1,10 @@ pub use CommentStyle::*; use crate::ast; -use crate::source_map::SourceMap; use crate::sess::ParseSess; -use syntax_pos::{BytePos, CharPos, Pos, FileName}; +use rustc_span::source_map::SourceMap; +use rustc_span::{BytePos, CharPos, FileName, Pos}; use std::usize; @@ -33,24 +33,27 @@ pub struct Comment { } pub fn is_line_doc_comment(s: &str) -> bool { - let res = (s.starts_with("///") && *s.as_bytes().get(3).unwrap_or(&b' ') != b'/') || - s.starts_with("//!"); + let res = (s.starts_with("///") && *s.as_bytes().get(3).unwrap_or(&b' ') != b'/') + || s.starts_with("//!"); debug!("is {:?} a doc comment? {}", s, res); res } pub fn is_block_doc_comment(s: &str) -> bool { // Prevent `/**/` from being parsed as a doc comment - let res = ((s.starts_with("/**") && *s.as_bytes().get(3).unwrap_or(&b' ') != b'*') || - s.starts_with("/*!")) && s.len() >= 5; + let res = ((s.starts_with("/**") && *s.as_bytes().get(3).unwrap_or(&b' ') != b'*') + || s.starts_with("/*!")) + && s.len() >= 5; debug!("is {:?} a doc comment? {}", s, res); res } // FIXME(#64197): Try to privatize this again. pub fn is_doc_comment(s: &str) -> bool { - (s.starts_with("///") && is_line_doc_comment(s)) || s.starts_with("//!") || - (s.starts_with("/**") && is_block_doc_comment(s)) || s.starts_with("/*!") + (s.starts_with("///") && is_line_doc_comment(s)) + || s.starts_with("//!") + || (s.starts_with("/**") && is_block_doc_comment(s)) + || s.starts_with("/*!") } pub fn doc_comment_style(comment: &str) -> ast::AttrStyle { @@ -76,11 +79,7 @@ pub fn strip_doc_comment_decoration(comment: &str) -> String { i += 1; } // like the first, a last line of all stars should be omitted - if j > i && - lines[j - 1] - .chars() - .skip(1) - .all(|c| c == '*') { + if j > i && lines[j - 1].chars().skip(1).all(|c| c == '*') { j -= 1; } @@ -122,9 +121,7 @@ pub fn strip_doc_comment_decoration(comment: &str) -> String { } if can_trim { - lines.iter() - .map(|line| (&line[i + 1..line.len()]).to_string()) - .collect() + lines.iter().map(|line| (&line[i + 1..line.len()]).to_string()).collect() } else { lines } @@ -140,10 +137,8 @@ pub fn strip_doc_comment_decoration(comment: &str) -> String { } if comment.starts_with("/*") { - let lines = comment[3..comment.len() - 2] - .lines() - .map(|s| s.to_string()) - .collect::<Vec<String>>(); + let lines = + comment[3..comment.len() - 2].lines().map(|s| s.to_string()).collect::<Vec<String>>(); let lines = vertical_trim(lines); let lines = horizontal_trim(lines); @@ -171,15 +166,18 @@ fn all_whitespace(s: &str, col: CharPos) -> Option<usize> { fn trim_whitespace_prefix(s: &str, col: CharPos) -> &str { let len = s.len(); match all_whitespace(&s, col) { - Some(col) => if col < len { &s[col..] } else { "" }, + Some(col) => { + if col < len { + &s[col..] + } else { + "" + } + } None => s, } } -fn split_block_comment_into_lines( - text: &str, - col: CharPos, -) -> Vec<String> { +fn split_block_comment_into_lines(text: &str, col: CharPos) -> Vec<String> { let mut res: Vec<String> = vec![]; let mut lines = text.lines(); // just push the first line diff --git a/src/libsyntax/util/lev_distance.rs b/src/libsyntax/util/lev_distance.rs index efb3c2396c..cce86fed98 100644 --- a/src/libsyntax/util/lev_distance.rs +++ b/src/libsyntax/util/lev_distance.rs @@ -1,5 +1,7 @@ +// FIXME(Centril): Move to rustc_span? + +use rustc_span::symbol::Symbol; use std::cmp; -use crate::symbol::Symbol; #[cfg(test)] mod tests; @@ -43,40 +45,63 @@ pub fn lev_distance(a: &str, b: &str) -> usize { /// /// Besides Levenshtein, we use case insensitive comparison to improve accuracy on an edge case with /// a lower(upper)case letters mismatch. -pub fn find_best_match_for_name<'a, T>(iter_names: T, - lookup: &str, - dist: Option<usize>) -> Option<Symbol> - where T: Iterator<Item = &'a Symbol> { +pub fn find_best_match_for_name<'a, T>( + iter_names: T, + lookup: &str, + dist: Option<usize>, +) -> Option<Symbol> +where + T: Iterator<Item = &'a Symbol>, +{ let max_dist = dist.map_or_else(|| cmp::max(lookup.len(), 3) / 3, |d| d); + let name_vec: Vec<&Symbol> = iter_names.collect(); + + let (case_insensitive_match, levenshtein_match) = name_vec + .iter() + .filter_map(|&name| { + let dist = lev_distance(lookup, &name.as_str()); + if dist <= max_dist { Some((name, dist)) } else { None } + }) + // Here we are collecting the next structure: + // (case_insensitive_match, (levenshtein_match, levenshtein_distance)) + .fold((None, None), |result, (candidate, dist)| { + ( + if candidate.as_str().to_uppercase() == lookup.to_uppercase() { + Some(candidate) + } else { + result.0 + }, + match result.1 { + None => Some((candidate, dist)), + Some((c, d)) => Some(if dist < d { (candidate, dist) } else { (c, d) }), + }, + ) + }); + // Priority of matches: + // 1. Exact case insensitive match + // 2. Levenshtein distance match + // 3. Sorted word match + if let Some(candidate) = case_insensitive_match { + Some(*candidate) + } else if levenshtein_match.is_some() { + levenshtein_match.map(|(candidate, _)| *candidate) + } else { + find_match_by_sorted_words(name_vec, lookup) + } +} - let (case_insensitive_match, levenstein_match) = iter_names - .filter_map(|&name| { - let dist = lev_distance(lookup, &name.as_str()); - if dist <= max_dist { - Some((name, dist)) +fn find_match_by_sorted_words<'a>(iter_names: Vec<&'a Symbol>, lookup: &str) -> Option<Symbol> { + iter_names.iter().fold(None, |result, candidate| { + if sort_by_words(&candidate.as_str()) == sort_by_words(lookup) { + Some(**candidate) } else { - None + result } }) - // Here we are collecting the next structure: - // (case_insensitive_match, (levenstein_match, levenstein_distance)) - .fold((None, None), |result, (candidate, dist)| { - ( - if candidate.as_str().to_uppercase() == lookup.to_uppercase() { - Some(candidate) - } else { - result.0 - }, - match result.1 { - None => Some((candidate, dist)), - Some((c, d)) => Some(if dist < d { (candidate, dist) } else { (c, d) }) - } - ) - }); +} - if let Some(candidate) = case_insensitive_match { - Some(candidate) // exact case insensitive match has a higher priority - } else { - levenstein_match.map(|(candidate, _)| candidate) - } +fn sort_by_words(name: &str) -> String { + let mut split_words: Vec<&str> = name.split('_').collect(); + split_words.sort(); + split_words.join("_") } diff --git a/src/libsyntax/util/lev_distance/tests.rs b/src/libsyntax/util/lev_distance/tests.rs index 1a746a67ec..222661687c 100644 --- a/src/libsyntax/util/lev_distance/tests.rs +++ b/src/libsyntax/util/lev_distance/tests.rs @@ -4,9 +4,7 @@ use super::*; fn test_lev_distance() { use std::char::{from_u32, MAX}; // Test bytelength agnosticity - for c in (0..MAX as u32) - .filter_map(|i| from_u32(i)) - .map(|i| i.to_string()) { + for c in (0..MAX as u32).filter_map(|i| from_u32(i)).map(|i| i.to_string()) { assert_eq!(lev_distance(&c[..], &c[..]), 0); } @@ -31,10 +29,7 @@ fn test_find_best_match_for_name() { Some(Symbol::intern("aaab")) ); - assert_eq!( - find_best_match_for_name(input.iter(), "1111111111", None), - None - ); + assert_eq!(find_best_match_for_name(input.iter(), "1111111111", None), None); let input = vec![Symbol::intern("aAAA")]; assert_eq!( @@ -44,15 +39,18 @@ fn test_find_best_match_for_name() { let input = vec![Symbol::intern("AAAA")]; // Returns None because `lev_distance > max_dist / 3` - assert_eq!( - find_best_match_for_name(input.iter(), "aaaa", None), - None - ); + assert_eq!(find_best_match_for_name(input.iter(), "aaaa", None), None); let input = vec![Symbol::intern("AAAA")]; assert_eq!( find_best_match_for_name(input.iter(), "aaaa", Some(4)), Some(Symbol::intern("AAAA")) ); + + let input = vec![Symbol::intern("a_longer_variable_name")]; + assert_eq!( + find_best_match_for_name(input.iter(), "a_variable_longer_name", None), + Some(Symbol::intern("a_longer_variable_name")) + ); }) } diff --git a/src/libsyntax/util/literal.rs b/src/libsyntax/util/literal.rs index af7afab6b9..dd06c25b4d 100644 --- a/src/libsyntax/util/literal.rs +++ b/src/libsyntax/util/literal.rs @@ -1,17 +1,17 @@ //! Code related to parsing literals. use crate::ast::{self, Lit, LitKind}; -use crate::symbol::{kw, sym, Symbol}; use crate::token::{self, Token}; use crate::tokenstream::TokenTree; -use log::debug; use rustc_data_structures::sync::Lrc; -use syntax_pos::Span; -use rustc_lexer::unescape::{unescape_char, unescape_byte}; -use rustc_lexer::unescape::{unescape_str, unescape_byte_str}; -use rustc_lexer::unescape::{unescape_raw_str, unescape_raw_byte_str}; +use rustc_lexer::unescape::{unescape_byte, unescape_char}; +use rustc_lexer::unescape::{unescape_byte_str, unescape_str}; +use rustc_lexer::unescape::{unescape_raw_byte_str, unescape_raw_str}; +use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_span::Span; +use log::debug; use std::ascii; pub enum LitError { @@ -37,10 +37,16 @@ impl LitKind { assert!(symbol.is_bool_lit()); LitKind::Bool(symbol == kw::True) } - token::Byte => return unescape_byte(&symbol.as_str()) - .map(LitKind::Byte).map_err(|_| LitError::LexerError), - token::Char => return unescape_char(&symbol.as_str()) - .map(LitKind::Char).map_err(|_| LitError::LexerError), + token::Byte => { + return unescape_byte(&symbol.as_str()) + .map(LitKind::Byte) + .map_err(|_| LitError::LexerError); + } + token::Char => { + return unescape_char(&symbol.as_str()) + .map(LitKind::Char) + .map_err(|_| LitError::LexerError); + } // There are some valid suffixes for integer and float literals, // so all the handling is done internally. @@ -56,11 +62,9 @@ impl LitKind { let symbol = if s.contains(&['\\', '\r'][..]) { let mut buf = String::with_capacity(s.len()); let mut error = Ok(()); - unescape_str(&s, &mut |_, unescaped_char| { - match unescaped_char { - Ok(c) => buf.push(c), - Err(_) => error = Err(LitError::LexerError), - } + unescape_str(&s, &mut |_, unescaped_char| match unescaped_char { + Ok(c) => buf.push(c), + Err(_) => error = Err(LitError::LexerError), }); error?; Symbol::intern(&buf) @@ -75,11 +79,9 @@ impl LitKind { let symbol = if s.contains('\r') { let mut buf = String::with_capacity(s.len()); let mut error = Ok(()); - unescape_raw_str(&s, &mut |_, unescaped_char| { - match unescaped_char { - Ok(c) => buf.push(c), - Err(_) => error = Err(LitError::LexerError), - } + unescape_raw_str(&s, &mut |_, unescaped_char| match unescaped_char { + Ok(c) => buf.push(c), + Err(_) => error = Err(LitError::LexerError), }); error?; buf.shrink_to_fit(); @@ -93,11 +95,9 @@ impl LitKind { let s = symbol.as_str(); let mut buf = Vec::with_capacity(s.len()); let mut error = Ok(()); - unescape_byte_str(&s, &mut |_, unescaped_byte| { - match unescaped_byte { - Ok(c) => buf.push(c), - Err(_) => error = Err(LitError::LexerError), - } + unescape_byte_str(&s, &mut |_, unescaped_byte| match unescaped_byte { + Ok(c) => buf.push(c), + Err(_) => error = Err(LitError::LexerError), }); error?; buf.shrink_to_fit(); @@ -108,11 +108,9 @@ impl LitKind { let bytes = if s.contains('\r') { let mut buf = Vec::with_capacity(s.len()); let mut error = Ok(()); - unescape_raw_byte_str(&s, &mut |_, unescaped_byte| { - match unescaped_byte { - Ok(c) => buf.push(c), - Err(_) => error = Err(LitError::LexerError), - } + unescape_raw_byte_str(&s, &mut |_, unescaped_byte| match unescaped_byte { + Ok(c) => buf.push(c), + Err(_) => error = Err(LitError::LexerError), }); error?; buf.shrink_to_fit(); @@ -122,7 +120,7 @@ impl LitKind { }; LitKind::ByteStr(Lrc::new(bytes)) - }, + } token::Err => LitKind::Err(symbol), }) } @@ -139,12 +137,14 @@ impl LitKind { let symbol = if s == escaped { symbol } else { Symbol::intern(&escaped) }; (token::Str, symbol, None) } - LitKind::Str(symbol, ast::StrStyle::Raw(n)) => { - (token::StrRaw(n), symbol, None) - } + LitKind::Str(symbol, ast::StrStyle::Raw(n)) => (token::StrRaw(n), symbol, None), LitKind::ByteStr(ref bytes) => { - let string = bytes.iter().cloned().flat_map(ascii::escape_default) - .map(Into::<char>::into).collect::<String>(); + let string = bytes + .iter() + .cloned() + .flat_map(ascii::escape_default) + .map(Into::<char>::into) + .collect::<String>(); (token::ByteStr, Symbol::intern(&string), None) } LitKind::Byte(byte) => { @@ -174,9 +174,7 @@ impl LitKind { let symbol = if value { kw::True } else { kw::False }; (token::Bool, symbol, None) } - LitKind::Err(symbol) => { - (token::Err, symbol, None) - } + LitKind::Err(symbol) => (token::Err, symbol, None), }; token::Lit::new(kind, symbol, suffix) @@ -192,10 +190,10 @@ impl Lit { /// Converts arbitrary token into an AST literal. pub fn from_token(token: &Token) -> Result<Lit, LitError> { let lit = match token.kind { - token::Ident(name, false) if name.is_bool_lit() => - token::Lit::new(token::Bool, name, None), - token::Literal(lit) => - lit, + token::Ident(name, false) if name.is_bool_lit() => { + token::Lit::new(token::Bool, name, None) + } + token::Literal(lit) => lit, token::Interpolated(ref nt) => { if let token::NtExpr(expr) | token::NtLiteral(expr) = &**nt { if let ast::ExprKind::Lit(lit) = &expr.kind { @@ -204,7 +202,7 @@ impl Lit { } return Err(LitError::NotLiteral); } - _ => return Err(LitError::NotLiteral) + _ => return Err(LitError::NotLiteral), }; Lit::from_lit_token(lit, token.span) @@ -238,19 +236,25 @@ fn strip_underscores(symbol: Symbol) -> Symbol { symbol } -fn filtered_float_lit(symbol: Symbol, suffix: Option<Symbol>, base: u32) - -> Result<LitKind, LitError> { +fn filtered_float_lit( + symbol: Symbol, + suffix: Option<Symbol>, + base: u32, +) -> Result<LitKind, LitError> { debug!("filtered_float_lit: {:?}, {:?}, {:?}", symbol, suffix, base); if base != 10 { return Err(LitError::NonDecimalFloat(base)); } Ok(match suffix { - Some(suf) => LitKind::Float(symbol, ast::LitFloatType::Suffixed(match suf { - sym::f32 => ast::FloatTy::F32, - sym::f64 => ast::FloatTy::F64, - _ => return Err(LitError::InvalidFloatSuffix), - })), - None => LitKind::Float(symbol, ast::LitFloatType::Unsuffixed) + Some(suf) => LitKind::Float( + symbol, + ast::LitFloatType::Suffixed(match suf { + sym::f32 => ast::FloatTy::F32, + sym::f64 => ast::FloatTy::F64, + _ => return Err(LitError::InvalidFloatSuffix), + }), + ), + None => LitKind::Float(symbol, ast::LitFloatType::Unsuffixed), }) } @@ -274,13 +278,13 @@ fn integer_lit(symbol: Symbol, suffix: Option<Symbol>) -> Result<LitKind, LitErr let ty = match suffix { Some(suf) => match suf { sym::isize => ast::LitIntType::Signed(ast::IntTy::Isize), - sym::i8 => ast::LitIntType::Signed(ast::IntTy::I8), + sym::i8 => ast::LitIntType::Signed(ast::IntTy::I8), sym::i16 => ast::LitIntType::Signed(ast::IntTy::I16), sym::i32 => ast::LitIntType::Signed(ast::IntTy::I32), sym::i64 => ast::LitIntType::Signed(ast::IntTy::I64), sym::i128 => ast::LitIntType::Signed(ast::IntTy::I128), sym::usize => ast::LitIntType::Unsigned(ast::UintTy::Usize), - sym::u8 => ast::LitIntType::Unsigned(ast::UintTy::U8), + sym::u8 => ast::LitIntType::Unsigned(ast::UintTy::U8), sym::u16 => ast::LitIntType::Unsigned(ast::UintTy::U16), sym::u32 => ast::LitIntType::Unsigned(ast::UintTy::U32), sym::u64 => ast::LitIntType::Unsigned(ast::UintTy::U64), @@ -289,11 +293,11 @@ fn integer_lit(symbol: Symbol, suffix: Option<Symbol>) -> Result<LitKind, LitErr // `fxxx` looks more like an invalid float literal than invalid integer literal. _ if suf.as_str().starts_with('f') => return filtered_float_lit(symbol, suffix, base), _ => return Err(LitError::InvalidIntSuffix), - } - _ => ast::LitIntType::Unsuffixed + }, + _ => ast::LitIntType::Unsuffixed, }; - let s = &s[if base != 10 { 2 } else { 0 } ..]; + let s = &s[if base != 10 { 2 } else { 0 }..]; u128::from_str_radix(s, base).map(|i| LitKind::Int(i, ty)).map_err(|_| { // Small bases are lexed as if they were base 10, e.g, the string // might be `0b10201`. This will cause the conversion above to fail, diff --git a/src/libsyntax/util/map_in_place.rs b/src/libsyntax/util/map_in_place.rs index 5724b540a0..a237a6e616 100644 --- a/src/libsyntax/util/map_in_place.rs +++ b/src/libsyntax/util/map_in_place.rs @@ -1,20 +1,27 @@ -use std::ptr; +// FIXME(Centril): Move to rustc_data_structures. + use smallvec::{Array, SmallVec}; +use std::ptr; pub trait MapInPlace<T>: Sized { - fn map_in_place<F>(&mut self, mut f: F) where F: FnMut(T) -> T { + fn map_in_place<F>(&mut self, mut f: F) + where + F: FnMut(T) -> T, + { self.flat_map_in_place(|e| Some(f(e))) } fn flat_map_in_place<F, I>(&mut self, f: F) - where F: FnMut(T) -> I, - I: IntoIterator<Item=T>; + where + F: FnMut(T) -> I, + I: IntoIterator<Item = T>; } impl<T> MapInPlace<T> for Vec<T> { fn flat_map_in_place<F, I>(&mut self, mut f: F) - where F: FnMut(T) -> I, - I: IntoIterator<Item=T> + where + F: FnMut(T) -> I, + I: IntoIterator<Item = T>, { let mut read_i = 0; let mut write_i = 0; @@ -58,8 +65,9 @@ impl<T> MapInPlace<T> for Vec<T> { impl<T, A: Array<Item = T>> MapInPlace<T> for SmallVec<A> { fn flat_map_in_place<F, I>(&mut self, mut f: F) - where F: FnMut(T) -> I, - I: IntoIterator<Item=T> + where + F: FnMut(T) -> I, + I: IntoIterator<Item = T>, { let mut read_i = 0; let mut write_i = 0; diff --git a/src/libsyntax/util/node_count.rs b/src/libsyntax/util/node_count.rs index a64fec7096..39f978ce98 100644 --- a/src/libsyntax/util/node_count.rs +++ b/src/libsyntax/util/node_count.rs @@ -1,8 +1,8 @@ // Simply gives a rought count of the number of nodes in an AST. -use crate::visit::*; use crate::ast::*; -use syntax_pos::Span; +use crate::visit::*; +use rustc_span::Span; pub struct NodeCounter { pub count: usize, @@ -10,9 +10,7 @@ pub struct NodeCounter { impl NodeCounter { pub fn new() -> NodeCounter { - NodeCounter { - count: 0, - } + NodeCounter { count: 0 } } } @@ -73,13 +71,9 @@ impl<'ast> Visitor<'ast> for NodeCounter { self.count += 1; walk_fn(self, fk, fd, s) } - fn visit_trait_item(&mut self, ti: &TraitItem) { - self.count += 1; - walk_trait_item(self, ti) - } - fn visit_impl_item(&mut self, ii: &ImplItem) { + fn visit_assoc_item(&mut self, ti: &AssocItem) { self.count += 1; - walk_impl_item(self, ii) + walk_assoc_item(self, ti) } fn visit_trait_ref(&mut self, t: &TraitRef) { self.count += 1; @@ -101,8 +95,13 @@ impl<'ast> Visitor<'ast> for NodeCounter { self.count += 1; walk_struct_field(self, s) } - fn visit_enum_def(&mut self, enum_definition: &EnumDef, - generics: &Generics, item_id: NodeId, _: Span) { + fn visit_enum_def( + &mut self, + enum_definition: &EnumDef, + generics: &Generics, + item_id: NodeId, + _: Span, + ) { self.count += 1; walk_enum_def(self, enum_definition, generics, item_id) } diff --git a/src/libsyntax/util/parser.rs b/src/libsyntax/util/parser.rs index df72fdc801..a0ed89a9ca 100644 --- a/src/libsyntax/util/parser.rs +++ b/src/libsyntax/util/parser.rs @@ -1,6 +1,6 @@ -use crate::token::{self, Token, BinOpToken}; -use crate::symbol::kw; use crate::ast::{self, BinOpKind}; +use crate::token::{self, BinOpToken, Token}; +use rustc_span::symbol::kw; /// Associative operator with precedence. /// @@ -64,7 +64,7 @@ pub enum Fixity { /// The operator is right-associative Right, /// The operator is not associative - None + None, } impl AssocOp { @@ -100,7 +100,7 @@ impl AssocOp { // `<-` should probably be `< -` token::LArrow => Some(Less), _ if t.is_keyword(kw::As) => Some(As), - _ => None + _ => None, } } @@ -125,7 +125,7 @@ impl AssocOp { BinOpKind::BitXor => BitXor, BinOpKind::BitOr => BitOr, BinOpKind::And => LAnd, - BinOpKind::Or => LOr + BinOpKind::Or => LOr, } } @@ -154,10 +154,10 @@ impl AssocOp { // NOTE: it is a bug to have an operators that has same precedence but different fixities! match *self { Assign | AssignOp(_) => Fixity::Right, - As | Multiply | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd | - BitXor | BitOr | Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | - LAnd | LOr | Colon => Fixity::Left, - DotDot | DotDotEq => Fixity::None + As | Multiply | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd + | BitXor | BitOr | Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual + | LAnd | LOr | Colon => Fixity::Left, + DotDot | DotDotEq => Fixity::None, } } @@ -165,9 +165,9 @@ impl AssocOp { use AssocOp::*; match *self { Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual => true, - Assign | AssignOp(_) | As | Multiply | Divide | Modulus | Add | - Subtract | ShiftLeft | ShiftRight | BitAnd | BitXor | BitOr | LAnd | LOr | - DotDot | DotDotEq | Colon => false + Assign | AssignOp(_) | As | Multiply | Divide | Modulus | Add | Subtract + | ShiftLeft | ShiftRight | BitAnd | BitXor | BitOr | LAnd | LOr | DotDot | DotDotEq + | Colon => false, } } @@ -175,9 +175,9 @@ impl AssocOp { use AssocOp::*; match *self { Assign | AssignOp(_) => true, - Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | As | Multiply | Divide | - Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd | BitXor | BitOr | LAnd | - LOr | DotDot | DotDotEq | Colon => false + Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | As | Multiply + | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd | BitXor + | BitOr | LAnd | LOr | DotDot | DotDotEq | Colon => false, } } @@ -202,7 +202,7 @@ impl AssocOp { BitOr => Some(BinOpKind::BitOr), LAnd => Some(BinOpKind::And), LOr => Some(BinOpKind::Or), - Assign | AssignOp(_) | As | DotDot | DotDotEq | Colon => None + Assign | AssignOp(_) | As | DotDot | DotDotEq | Colon => None, } } @@ -378,18 +378,18 @@ pub fn contains_exterior_struct_lit(value: &ast::Expr) -> bool { match value.kind { ast::ExprKind::Struct(..) => true, - ast::ExprKind::Assign(ref lhs, ref rhs) | - ast::ExprKind::AssignOp(_, ref lhs, ref rhs) | - ast::ExprKind::Binary(_, ref lhs, ref rhs) => { + ast::ExprKind::Assign(ref lhs, ref rhs, _) + | ast::ExprKind::AssignOp(_, ref lhs, ref rhs) + | ast::ExprKind::Binary(_, ref lhs, ref rhs) => { // X { y: 1 } + X { y: 2 } contains_exterior_struct_lit(&lhs) || contains_exterior_struct_lit(&rhs) } - ast::ExprKind::Await(ref x) | - ast::ExprKind::Unary(_, ref x) | - ast::ExprKind::Cast(ref x, _) | - ast::ExprKind::Type(ref x, _) | - ast::ExprKind::Field(ref x, _) | - ast::ExprKind::Index(ref x, _) => { + ast::ExprKind::Await(ref x) + | ast::ExprKind::Unary(_, ref x) + | ast::ExprKind::Cast(ref x, _) + | ast::ExprKind::Type(ref x, _) + | ast::ExprKind::Field(ref x, _) + | ast::ExprKind::Index(ref x, _) => { // &X { y: 1 }, X { y: 1 }.y contains_exterior_struct_lit(&x) } diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 4ee09b4b87..946a0d29cd 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -15,9 +15,9 @@ use crate::ast::*; use crate::token::Token; -use crate::tokenstream::{TokenTree, TokenStream}; +use crate::tokenstream::{TokenStream, TokenTree}; -use syntax_pos::Span; +use rustc_span::Span; #[derive(Copy, Clone)] pub enum FnKind<'a> { @@ -25,7 +25,7 @@ pub enum FnKind<'a> { ItemFn(Ident, &'a FnHeader, &'a Visibility, &'a Block), /// E.g., `fn foo(&self)`. - Method(Ident, &'a FnSig, Option<&'a Visibility>, &'a Block), + Method(Ident, &'a FnSig, &'a Visibility, &'a Block), /// E.g., `|x, y| body`. Closure(&'a Expr), @@ -60,32 +60,67 @@ pub trait Visitor<'ast>: Sized { fn visit_mod(&mut self, m: &'ast Mod, _s: Span, _attrs: &[Attribute], _n: NodeId) { walk_mod(self, m); } - fn visit_foreign_item(&mut self, i: &'ast ForeignItem) { walk_foreign_item(self, i) } - fn visit_global_asm(&mut self, ga: &'ast GlobalAsm) { walk_global_asm(self, ga) } - fn visit_item(&mut self, i: &'ast Item) { walk_item(self, i) } - fn visit_local(&mut self, l: &'ast Local) { walk_local(self, l) } - fn visit_block(&mut self, b: &'ast Block) { walk_block(self, b) } - fn visit_stmt(&mut self, s: &'ast Stmt) { walk_stmt(self, s) } - fn visit_param(&mut self, param: &'ast Param) { walk_param(self, param) } - fn visit_arm(&mut self, a: &'ast Arm) { walk_arm(self, a) } - fn visit_pat(&mut self, p: &'ast Pat) { walk_pat(self, p) } - fn visit_anon_const(&mut self, c: &'ast AnonConst) { walk_anon_const(self, c) } - fn visit_expr(&mut self, ex: &'ast Expr) { walk_expr(self, ex) } - fn visit_expr_post(&mut self, _ex: &'ast Expr) { } - fn visit_ty(&mut self, t: &'ast Ty) { walk_ty(self, t) } + fn visit_foreign_item(&mut self, i: &'ast ForeignItem) { + walk_foreign_item(self, i) + } + fn visit_global_asm(&mut self, ga: &'ast GlobalAsm) { + walk_global_asm(self, ga) + } + fn visit_item(&mut self, i: &'ast Item) { + walk_item(self, i) + } + fn visit_local(&mut self, l: &'ast Local) { + walk_local(self, l) + } + fn visit_block(&mut self, b: &'ast Block) { + walk_block(self, b) + } + fn visit_stmt(&mut self, s: &'ast Stmt) { + walk_stmt(self, s) + } + fn visit_param(&mut self, param: &'ast Param) { + walk_param(self, param) + } + fn visit_arm(&mut self, a: &'ast Arm) { + walk_arm(self, a) + } + fn visit_pat(&mut self, p: &'ast Pat) { + walk_pat(self, p) + } + fn visit_anon_const(&mut self, c: &'ast AnonConst) { + walk_anon_const(self, c) + } + fn visit_expr(&mut self, ex: &'ast Expr) { + walk_expr(self, ex) + } + fn visit_expr_post(&mut self, _ex: &'ast Expr) {} + fn visit_ty(&mut self, t: &'ast Ty) { + walk_ty(self, t) + } fn visit_generic_param(&mut self, param: &'ast GenericParam) { walk_generic_param(self, param) } - fn visit_generics(&mut self, g: &'ast Generics) { walk_generics(self, g) } + fn visit_generics(&mut self, g: &'ast Generics) { + walk_generics(self, g) + } fn visit_where_predicate(&mut self, p: &'ast WherePredicate) { walk_where_predicate(self, p) } fn visit_fn(&mut self, fk: FnKind<'ast>, fd: &'ast FnDecl, s: Span, _: NodeId) { walk_fn(self, fk, fd, s) } - fn visit_trait_item(&mut self, ti: &'ast TraitItem) { walk_trait_item(self, ti) } - fn visit_impl_item(&mut self, ii: &'ast ImplItem) { walk_impl_item(self, ii) } - fn visit_trait_ref(&mut self, t: &'ast TraitRef) { walk_trait_ref(self, t) } + fn visit_trait_item(&mut self, i: &'ast AssocItem) { + walk_trait_item(self, i) + } + fn visit_impl_item(&mut self, i: &'ast AssocItem) { + walk_impl_item(self, i) + } + fn visit_assoc_item(&mut self, i: &'ast AssocItem) { + walk_assoc_item(self, i) + } + fn visit_trait_ref(&mut self, t: &'ast TraitRef) { + walk_trait_ref(self, t) + } fn visit_param_bound(&mut self, bounds: &'ast GenericBound) { walk_param_bound(self, bounds) } @@ -95,9 +130,16 @@ pub trait Visitor<'ast>: Sized { fn visit_variant_data(&mut self, s: &'ast VariantData) { walk_struct_def(self, s) } - fn visit_struct_field(&mut self, s: &'ast StructField) { walk_struct_field(self, s) } - fn visit_enum_def(&mut self, enum_definition: &'ast EnumDef, - generics: &'ast Generics, item_id: NodeId, _: Span) { + fn visit_struct_field(&mut self, s: &'ast StructField) { + walk_struct_field(self, s) + } + fn visit_enum_def( + &mut self, + enum_definition: &'ast EnumDef, + generics: &'ast Generics, + item_id: NodeId, + _: Span, + ) { walk_enum_def(self, enum_definition, generics, item_id) } fn visit_variant(&mut self, v: &'ast Variant) { @@ -214,10 +256,12 @@ pub fn walk_lifetime<'a, V: Visitor<'a>>(visitor: &mut V, lifetime: &'a Lifetime visitor.visit_ident(lifetime.ident); } -pub fn walk_poly_trait_ref<'a, V>(visitor: &mut V, - trait_ref: &'a PolyTraitRef, - _: &TraitBoundModifier) - where V: Visitor<'a>, +pub fn walk_poly_trait_ref<'a, V>( + visitor: &mut V, + trait_ref: &'a PolyTraitRef, + _: &TraitBoundModifier, +) where + V: Visitor<'a>, { walk_list!(visitor, visit_generic_param, &trait_ref.bound_generic_params); visitor.visit_trait_ref(&trait_ref.trait_ref); @@ -236,25 +280,22 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) { visitor.visit_name(item.span, orig_name); } } - ItemKind::Use(ref use_tree) => { - visitor.visit_use_tree(use_tree, item.id, false) - } - ItemKind::Static(ref typ, _, ref expr) | - ItemKind::Const(ref typ, ref expr) => { + ItemKind::Use(ref use_tree) => visitor.visit_use_tree(use_tree, item.id, false), + ItemKind::Static(ref typ, _, ref expr) | ItemKind::Const(ref typ, ref expr) => { visitor.visit_ty(typ); visitor.visit_expr(expr); } ItemKind::Fn(ref sig, ref generics, ref body) => { visitor.visit_generics(generics); visitor.visit_fn_header(&sig.header); - visitor.visit_fn(FnKind::ItemFn(item.ident, &sig.header, &item.vis, body), - &sig.decl, - item.span, - item.id) - } - ItemKind::Mod(ref module) => { - visitor.visit_mod(module, item.span, &item.attrs, item.id) - } + visitor.visit_fn( + FnKind::ItemFn(item.ident, &sig.header, &item.vis, body), + &sig.decl, + item.span, + item.id, + ) + } + ItemKind::Mod(ref module) => visitor.visit_mod(module, item.span, &item.attrs, item.id), ItemKind::ForeignMod(ref foreign_module) => { walk_list!(visitor, visit_foreign_item, &foreign_module.items); } @@ -267,18 +308,23 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) { visitor.visit_generics(generics); visitor.visit_enum_def(enum_definition, generics, item.id, item.span) } - ItemKind::Impl(_, _, _, - ref generics, - ref opt_trait_reference, - ref typ, - ref impl_items) => { + ItemKind::Impl { + unsafety: _, + polarity: _, + defaultness: _, + constness: _, + ref generics, + ref of_trait, + ref self_ty, + ref items, + } => { visitor.visit_generics(generics); - walk_list!(visitor, visit_trait_ref, opt_trait_reference); - visitor.visit_ty(typ); - walk_list!(visitor, visit_impl_item, impl_items); + walk_list!(visitor, visit_trait_ref, of_trait); + visitor.visit_ty(self_ty); + walk_list!(visitor, visit_impl_item, items); } - ItemKind::Struct(ref struct_definition, ref generics) | - ItemKind::Union(ref struct_definition, ref generics) => { + ItemKind::Struct(ref struct_definition, ref generics) + | ItemKind::Union(ref struct_definition, ref generics) => { visitor.visit_generics(generics); visitor.visit_variant_data(struct_definition); } @@ -307,7 +353,8 @@ pub fn walk_enum_def<'a, V: Visitor<'a>>( } pub fn walk_variant<'a, V: Visitor<'a>>(visitor: &mut V, variant: &'a Variant) - where V: Visitor<'a>, +where + V: Visitor<'a>, { visitor.visit_ident(variant.ident); visitor.visit_vis(&variant.vis); @@ -330,12 +377,8 @@ pub fn walk_field_pattern<'a, V: Visitor<'a>>(visitor: &mut V, fp: &'a FieldPat) pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) { match typ.kind { - TyKind::Slice(ref ty) | TyKind::Paren(ref ty) => { - visitor.visit_ty(ty) - } - TyKind::Ptr(ref mutable_type) => { - visitor.visit_ty(&mutable_type.ty) - } + TyKind::Slice(ref ty) | TyKind::Paren(ref ty) => visitor.visit_ty(ty), + TyKind::Ptr(ref mutable_type) => visitor.visit_ty(&mutable_type.ty), TyKind::Rptr(ref opt_lifetime, ref mutable_type) => { walk_list!(visitor, visit_lifetime, opt_lifetime); visitor.visit_ty(&mutable_type.ty) @@ -357,19 +400,13 @@ pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) { visitor.visit_ty(ty); visitor.visit_anon_const(length) } - TyKind::TraitObject(ref bounds, ..) | - TyKind::ImplTrait(_, ref bounds) => { + TyKind::TraitObject(ref bounds, ..) | TyKind::ImplTrait(_, ref bounds) => { walk_list!(visitor, visit_param_bound, bounds); } - TyKind::Typeof(ref expression) => { - visitor.visit_anon_const(expression) - } + TyKind::Typeof(ref expression) => visitor.visit_anon_const(expression), TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err => {} - TyKind::Mac(ref mac) => { - visitor.visit_mac(mac) - } - TyKind::Never | - TyKind::CVarArgs => {} + TyKind::Mac(ref mac) => visitor.visit_mac(mac), + TyKind::Never | TyKind::CVarArgs => {} } } @@ -379,9 +416,7 @@ pub fn walk_path<'a, V: Visitor<'a>>(visitor: &mut V, path: &'a Path) { } } -pub fn walk_use_tree<'a, V: Visitor<'a>>( - visitor: &mut V, use_tree: &'a UseTree, id: NodeId, -) { +pub fn walk_use_tree<'a, V: Visitor<'a>>(visitor: &mut V, use_tree: &'a UseTree, id: NodeId) { visitor.visit_path(&use_tree.prefix, id); match use_tree.kind { UseTreeKind::Simple(rename, ..) => { @@ -390,7 +425,7 @@ pub fn walk_use_tree<'a, V: Visitor<'a>>( visitor.visit_ident(rename); } } - UseTreeKind::Glob => {}, + UseTreeKind::Glob => {} UseTreeKind::Nested(ref use_trees) => { for &(ref nested_tree, nested_id) in use_trees { visitor.visit_use_tree(nested_tree, nested_id, true); @@ -399,19 +434,20 @@ pub fn walk_use_tree<'a, V: Visitor<'a>>( } } -pub fn walk_path_segment<'a, V: Visitor<'a>>(visitor: &mut V, - path_span: Span, - segment: &'a PathSegment) { +pub fn walk_path_segment<'a, V: Visitor<'a>>( + visitor: &mut V, + path_span: Span, + segment: &'a PathSegment, +) { visitor.visit_ident(segment.ident); if let Some(ref args) = segment.args { visitor.visit_generic_args(path_span, args); } } -pub fn walk_generic_args<'a, V>(visitor: &mut V, - _path_span: Span, - generic_args: &'a GenericArgs) - where V: Visitor<'a>, +pub fn walk_generic_args<'a, V>(visitor: &mut V, _path_span: Span, generic_args: &'a GenericArgs) +where + V: Visitor<'a>, { match *generic_args { GenericArgs::AngleBracketed(ref data) => { @@ -420,13 +456,15 @@ pub fn walk_generic_args<'a, V>(visitor: &mut V, } GenericArgs::Parenthesized(ref data) => { walk_list!(visitor, visit_ty, &data.inputs); - walk_list!(visitor, visit_ty, &data.output); + walk_fn_ret_ty(visitor, &data.output); } } } -pub fn walk_assoc_ty_constraint<'a, V: Visitor<'a>>(visitor: &mut V, - constraint: &'a AssocTyConstraint) { +pub fn walk_assoc_ty_constraint<'a, V: Visitor<'a>>( + visitor: &mut V, + constraint: &'a AssocTyConstraint, +) { visitor.visit_ident(constraint.ident); match constraint.kind { AssocTyConstraintKind::Equality { ref ty } => { @@ -454,24 +492,20 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) { visitor.visit_path(path, pattern.id); walk_list!(visitor, visit_field_pattern, fields); } - PatKind::Box(ref subpattern) | - PatKind::Ref(ref subpattern, _) | - PatKind::Paren(ref subpattern) => { - visitor.visit_pat(subpattern) - } + PatKind::Box(ref subpattern) + | PatKind::Ref(ref subpattern, _) + | PatKind::Paren(ref subpattern) => visitor.visit_pat(subpattern), PatKind::Ident(_, ident, ref optional_subpattern) => { visitor.visit_ident(ident); walk_list!(visitor, visit_pat, optional_subpattern); } PatKind::Lit(ref expression) => visitor.visit_expr(expression), PatKind::Range(ref lower_bound, ref upper_bound, _) => { - visitor.visit_expr(lower_bound); - visitor.visit_expr(upper_bound); + walk_list!(visitor, visit_expr, lower_bound); + walk_list!(visitor, visit_expr, upper_bound); } - PatKind::Wild | PatKind::Rest => {}, - PatKind::Tuple(ref elems) - | PatKind::Slice(ref elems) - | PatKind::Or(ref elems) => { + PatKind::Wild | PatKind::Rest => {} + PatKind::Tuple(ref elems) | PatKind::Slice(ref elems) | PatKind::Or(ref elems) => { walk_list!(visitor, visit_pat, elems); } PatKind::Mac(ref mac) => visitor.visit_mac(mac), @@ -524,23 +558,23 @@ pub fn walk_generics<'a, V: Visitor<'a>>(visitor: &mut V, generics: &'a Generics pub fn walk_where_predicate<'a, V: Visitor<'a>>(visitor: &mut V, predicate: &'a WherePredicate) { match *predicate { - WherePredicate::BoundPredicate(WhereBoundPredicate{ref bounded_ty, - ref bounds, - ref bound_generic_params, - ..}) => { + WherePredicate::BoundPredicate(WhereBoundPredicate { + ref bounded_ty, + ref bounds, + ref bound_generic_params, + .. + }) => { visitor.visit_ty(bounded_ty); walk_list!(visitor, visit_param_bound, bounds); walk_list!(visitor, visit_generic_param, bound_generic_params); } - WherePredicate::RegionPredicate(WhereRegionPredicate{ref lifetime, - ref bounds, - ..}) => { + WherePredicate::RegionPredicate(WhereRegionPredicate { + ref lifetime, ref bounds, .. + }) => { visitor.visit_lifetime(lifetime); walk_list!(visitor, visit_param_bound, bounds); } - WherePredicate::EqPredicate(WhereEqPredicate{ref lhs_ty, - ref rhs_ty, - ..}) => { + WherePredicate::EqPredicate(WhereEqPredicate { ref lhs_ty, ref rhs_ty, .. }) => { visitor.visit_ty(lhs_ty); visitor.visit_ty(rhs_ty); } @@ -561,7 +595,8 @@ pub fn walk_fn_decl<'a, V: Visitor<'a>>(visitor: &mut V, function_declaration: & } pub fn walk_fn<'a, V>(visitor: &mut V, kind: FnKind<'a>, declaration: &'a FnDecl, _span: Span) - where V: Visitor<'a>, +where + V: Visitor<'a>, { match kind { FnKind::ItemFn(_, header, _, body) => { @@ -581,52 +616,41 @@ pub fn walk_fn<'a, V>(visitor: &mut V, kind: FnKind<'a>, declaration: &'a FnDecl } } -pub fn walk_trait_item<'a, V: Visitor<'a>>(visitor: &mut V, trait_item: &'a TraitItem) { - visitor.visit_vis(&trait_item.vis); - visitor.visit_ident(trait_item.ident); - walk_list!(visitor, visit_attribute, &trait_item.attrs); - visitor.visit_generics(&trait_item.generics); - match trait_item.kind { - TraitItemKind::Const(ref ty, ref default) => { +pub fn walk_impl_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a AssocItem) { + visitor.visit_assoc_item(item); +} + +pub fn walk_trait_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a AssocItem) { + visitor.visit_assoc_item(item); +} + +pub fn walk_assoc_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a AssocItem) { + visitor.visit_vis(&item.vis); + visitor.visit_ident(item.ident); + walk_list!(visitor, visit_attribute, &item.attrs); + visitor.visit_generics(&item.generics); + match item.kind { + AssocItemKind::Const(ref ty, ref expr) => { visitor.visit_ty(ty); - walk_list!(visitor, visit_expr, default); + walk_list!(visitor, visit_expr, expr); } - TraitItemKind::Method(ref sig, None) => { + AssocItemKind::Fn(ref sig, None) => { visitor.visit_fn_header(&sig.header); walk_fn_decl(visitor, &sig.decl); } - TraitItemKind::Method(ref sig, Some(ref body)) => { - visitor.visit_fn(FnKind::Method(trait_item.ident, sig, None, body), - &sig.decl, trait_item.span, trait_item.id); + AssocItemKind::Fn(ref sig, Some(ref body)) => { + visitor.visit_fn( + FnKind::Method(item.ident, sig, &item.vis, body), + &sig.decl, + item.span, + item.id, + ); } - TraitItemKind::Type(ref bounds, ref default) => { + AssocItemKind::TyAlias(ref bounds, ref ty) => { walk_list!(visitor, visit_param_bound, bounds); - walk_list!(visitor, visit_ty, default); - } - TraitItemKind::Macro(ref mac) => { - visitor.visit_mac(mac); - } - } -} - -pub fn walk_impl_item<'a, V: Visitor<'a>>(visitor: &mut V, impl_item: &'a ImplItem) { - visitor.visit_vis(&impl_item.vis); - visitor.visit_ident(impl_item.ident); - walk_list!(visitor, visit_attribute, &impl_item.attrs); - visitor.visit_generics(&impl_item.generics); - match impl_item.kind { - ImplItemKind::Const(ref ty, ref expr) => { - visitor.visit_ty(ty); - visitor.visit_expr(expr); + walk_list!(visitor, visit_ty, ty); } - ImplItemKind::Method(ref sig, ref body) => { - visitor.visit_fn(FnKind::Method(impl_item.ident, sig, Some(&impl_item.vis), body), - &sig.decl, impl_item.span, impl_item.id); - } - ImplItemKind::TyAlias(ref ty) => { - visitor.visit_ty(ty); - } - ImplItemKind::Macro(ref mac) => { + AssocItemKind::Macro(ref mac) => { visitor.visit_mac(mac); } } @@ -678,9 +702,7 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) { walk_list!(visitor, visit_attribute, expression.attrs.iter()); match expression.kind { - ExprKind::Box(ref subexpression) => { - visitor.visit_expr(subexpression) - } + ExprKind::Box(ref subexpression) => visitor.visit_expr(subexpression), ExprKind::Array(ref subexpressions) => { walk_list!(visitor, visit_expr, subexpressions); } @@ -743,12 +765,8 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) { visitor.visit_expr(subexpression); walk_list!(visitor, visit_arm, arms); } - ExprKind::Closure(_, _, _, ref function_declaration, ref body, _decl_span) => { - visitor.visit_fn(FnKind::Closure(body), - function_declaration, - expression.span, - expression.id) - } + ExprKind::Closure(_, _, _, ref function_declaration, ref body, _decl_span) => visitor + .visit_fn(FnKind::Closure(body), function_declaration, expression.span, expression.id), ExprKind::Block(ref block, ref opt_label) => { walk_list!(visitor, visit_label, opt_label); visitor.visit_block(block); @@ -757,9 +775,9 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) { visitor.visit_block(body); } ExprKind::Await(ref expr) => visitor.visit_expr(expr), - ExprKind::Assign(ref left_hand_expression, ref right_hand_expression) => { - visitor.visit_expr(left_hand_expression); - visitor.visit_expr(right_hand_expression); + ExprKind::Assign(ref lhs, ref rhs, _) => { + visitor.visit_expr(lhs); + visitor.visit_expr(rhs); } ExprKind::AssignOp(_, ref left_expression, ref right_expression) => { visitor.visit_expr(left_expression); @@ -794,9 +812,7 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) { walk_list!(visitor, visit_expr, optional_expression); } ExprKind::Mac(ref mac) => visitor.visit_mac(mac), - ExprKind::Paren(ref subexpression) => { - visitor.visit_expr(subexpression) - } + ExprKind::Paren(ref subexpression) => visitor.visit_expr(subexpression), ExprKind::InlineAsm(ref ia) => { for &(_, ref input) in &ia.inputs { visitor.visit_expr(input) @@ -808,12 +824,8 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) { ExprKind::Yield(ref optional_expression) => { walk_list!(visitor, visit_expr, optional_expression); } - ExprKind::Try(ref subexpression) => { - visitor.visit_expr(subexpression) - } - ExprKind::TryBlock(ref body) => { - visitor.visit_block(body) - } + ExprKind::Try(ref subexpression) => visitor.visit_expr(subexpression), + ExprKind::TryBlock(ref body) => visitor.visit_block(body), ExprKind::Lit(_) | ExprKind::Err => {} } diff --git a/src/libsyntax_expand/tests.rs b/src/libsyntax_expand/tests.rs deleted file mode 100644 index 425eb30584..0000000000 --- a/src/libsyntax_expand/tests.rs +++ /dev/null @@ -1,1253 +0,0 @@ -use rustc_parse::{source_file_to_stream, new_parser_from_source_str, parser::Parser}; -use syntax::ast; -use syntax::tokenstream::TokenStream; -use syntax::sess::ParseSess; -use syntax::source_map::{SourceMap, FilePathMapping}; -use syntax::with_default_globals; -use syntax_pos::{BytePos, Span, MultiSpan}; - -use errors::emitter::EmitterWriter; -use errors::{PResult, Handler}; -use rustc_data_structures::sync::Lrc; - -use std::io; -use std::io::prelude::*; -use std::iter::Peekable; -use std::path::{Path, PathBuf}; -use std::str; -use std::sync::{Arc, Mutex}; - -/// Map string to parser (via tts). -fn string_to_parser(ps: &ParseSess, source_str: String) -> Parser<'_> { - new_parser_from_source_str(ps, PathBuf::from("bogofile").into(), source_str) -} - -crate fn with_error_checking_parse<'a, T, F>(s: String, ps: &'a ParseSess, f: F) -> T where - F: FnOnce(&mut Parser<'a>) -> PResult<'a, T>, -{ - let mut p = string_to_parser(&ps, s); - let x = f(&mut p).unwrap(); - p.sess.span_diagnostic.abort_if_errors(); - x -} - -/// Maps a string to tts, using a made-up filename. -crate fn string_to_stream(source_str: String) -> TokenStream { - let ps = ParseSess::new(FilePathMapping::empty()); - source_file_to_stream( - &ps, - ps.source_map().new_source_file(PathBuf::from("bogofile").into(), - source_str, - ), None).0 -} - -/// Parses a string, returns a crate. -crate fn string_to_crate(source_str : String) -> ast::Crate { - let ps = ParseSess::new(FilePathMapping::empty()); - with_error_checking_parse(source_str, &ps, |p| { - p.parse_crate_mod() - }) -} - -/// Does the given string match the pattern? whitespace in the first string -/// may be deleted or replaced with other whitespace to match the pattern. -/// This function is relatively Unicode-ignorant; fortunately, the careful design -/// of UTF-8 mitigates this ignorance. It doesn't do NKF-normalization(?). -crate fn matches_codepattern(a : &str, b : &str) -> bool { - let mut a_iter = a.chars().peekable(); - let mut b_iter = b.chars().peekable(); - - loop { - let (a, b) = match (a_iter.peek(), b_iter.peek()) { - (None, None) => return true, - (None, _) => return false, - (Some(&a), None) => { - if rustc_lexer::is_whitespace(a) { - break // Trailing whitespace check is out of loop for borrowck. - } else { - return false - } - } - (Some(&a), Some(&b)) => (a, b) - }; - - if rustc_lexer::is_whitespace(a) && rustc_lexer::is_whitespace(b) { - // Skip whitespace for `a` and `b`. - scan_for_non_ws_or_end(&mut a_iter); - scan_for_non_ws_or_end(&mut b_iter); - } else if rustc_lexer::is_whitespace(a) { - // Skip whitespace for `a`. - scan_for_non_ws_or_end(&mut a_iter); - } else if a == b { - a_iter.next(); - b_iter.next(); - } else { - return false - } - } - - // Check if a has *only* trailing whitespace. - a_iter.all(rustc_lexer::is_whitespace) -} - -/// Advances the given peekable `Iterator` until it reaches a non-whitespace character. -fn scan_for_non_ws_or_end<I: Iterator<Item = char>>(iter: &mut Peekable<I>) { - while iter.peek().copied().map(|c| rustc_lexer::is_whitespace(c)) == Some(true) { - iter.next(); - } -} - -/// Identifies a position in the text by the n'th occurrence of a string. -struct Position { - string: &'static str, - count: usize, -} - -struct SpanLabel { - start: Position, - end: Position, - label: &'static str, -} - -crate struct Shared<T: Write> { - pub data: Arc<Mutex<T>>, -} - -impl<T: Write> Write for Shared<T> { - fn write(&mut self, buf: &[u8]) -> io::Result<usize> { - self.data.lock().unwrap().write(buf) - } - - fn flush(&mut self) -> io::Result<()> { - self.data.lock().unwrap().flush() - } -} - -fn test_harness(file_text: &str, span_labels: Vec<SpanLabel>, expected_output: &str) { - with_default_globals(|| { - let output = Arc::new(Mutex::new(Vec::new())); - - let source_map = Lrc::new(SourceMap::new(FilePathMapping::empty())); - source_map.new_source_file(Path::new("test.rs").to_owned().into(), file_text.to_owned()); - - let primary_span = make_span(&file_text, &span_labels[0].start, &span_labels[0].end); - let mut msp = MultiSpan::from_span(primary_span); - for span_label in span_labels { - let span = make_span(&file_text, &span_label.start, &span_label.end); - msp.push_span_label(span, span_label.label.to_string()); - println!("span: {:?} label: {:?}", span, span_label.label); - println!("text: {:?}", source_map.span_to_snippet(span)); - } - - let emitter = EmitterWriter::new( - Box::new(Shared { data: output.clone() }), - Some(source_map.clone()), - false, - false, - false, - None, - false, - ); - let handler = Handler::with_emitter(true, None, Box::new(emitter)); - handler.span_err(msp, "foo"); - - assert!(expected_output.chars().next() == Some('\n'), - "expected output should begin with newline"); - let expected_output = &expected_output[1..]; - - let bytes = output.lock().unwrap(); - let actual_output = str::from_utf8(&bytes).unwrap(); - println!("expected output:\n------\n{}------", expected_output); - println!("actual output:\n------\n{}------", actual_output); - - assert!(expected_output == actual_output) - }) -} - -fn make_span(file_text: &str, start: &Position, end: &Position) -> Span { - let start = make_pos(file_text, start); - let end = make_pos(file_text, end) + end.string.len(); // just after matching thing ends - assert!(start <= end); - Span::with_root_ctxt(BytePos(start as u32), BytePos(end as u32)) -} - -fn make_pos(file_text: &str, pos: &Position) -> usize { - let mut remainder = file_text; - let mut offset = 0; - for _ in 0..pos.count { - if let Some(n) = remainder.find(&pos.string) { - offset += n; - remainder = &remainder[n + 1..]; - } else { - panic!("failed to find {} instances of {:?} in {:?}", - pos.count, - pos.string, - file_text); - } - } - offset -} - -#[test] -fn ends_on_col0() { - test_harness(r#" -fn foo() { -} -"#, - vec![ - SpanLabel { - start: Position { - string: "{", - count: 1, - }, - end: Position { - string: "}", - count: 1, - }, - label: "test", - }, - ], - r#" -error: foo - --> test.rs:2:10 - | -2 | fn foo() { - | __________^ -3 | | } - | |_^ test - -"#); -} - -#[test] -fn ends_on_col2() { - test_harness(r#" -fn foo() { - - - } -"#, - vec![ - SpanLabel { - start: Position { - string: "{", - count: 1, - }, - end: Position { - string: "}", - count: 1, - }, - label: "test", - }, - ], - r#" -error: foo - --> test.rs:2:10 - | -2 | fn foo() { - | __________^ -3 | | -4 | | -5 | | } - | |___^ test - -"#); -} -#[test] -fn non_nested() { - test_harness(r#" -fn foo() { - X0 Y0 - X1 Y1 - X2 Y2 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "X0", - count: 1, - }, - end: Position { - string: "X2", - count: 1, - }, - label: "`X` is a good letter", - }, - SpanLabel { - start: Position { - string: "Y0", - count: 1, - }, - end: Position { - string: "Y2", - count: 1, - }, - label: "`Y` is a good letter too", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | X0 Y0 - | ____^__- - | | ___| - | || -4 | || X1 Y1 -5 | || X2 Y2 - | ||____^__- `Y` is a good letter too - | |____| - | `X` is a good letter - -"#); -} - -#[test] -fn nested() { - test_harness(r#" -fn foo() { - X0 Y0 - Y1 X1 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "X0", - count: 1, - }, - end: Position { - string: "X1", - count: 1, - }, - label: "`X` is a good letter", - }, - SpanLabel { - start: Position { - string: "Y0", - count: 1, - }, - end: Position { - string: "Y1", - count: 1, - }, - label: "`Y` is a good letter too", - }, - ], -r#" -error: foo - --> test.rs:3:3 - | -3 | X0 Y0 - | ____^__- - | | ___| - | || -4 | || Y1 X1 - | ||____-__^ `X` is a good letter - | |_____| - | `Y` is a good letter too - -"#); -} - -#[test] -fn different_overlap() { - test_harness(r#" -fn foo() { - X0 Y0 Z0 - X1 Y1 Z1 - X2 Y2 Z2 - X3 Y3 Z3 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "Y0", - count: 1, - }, - end: Position { - string: "X2", - count: 1, - }, - label: "`X` is a good letter", - }, - SpanLabel { - start: Position { - string: "Z1", - count: 1, - }, - end: Position { - string: "X3", - count: 1, - }, - label: "`Y` is a good letter too", - }, - ], - r#" -error: foo - --> test.rs:3:6 - | -3 | X0 Y0 Z0 - | ______^ -4 | | X1 Y1 Z1 - | |_________- -5 | || X2 Y2 Z2 - | ||____^ `X` is a good letter -6 | | X3 Y3 Z3 - | |_____- `Y` is a good letter too - -"#); -} - -#[test] -fn triple_overlap() { - test_harness(r#" -fn foo() { - X0 Y0 Z0 - X1 Y1 Z1 - X2 Y2 Z2 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "X0", - count: 1, - }, - end: Position { - string: "X2", - count: 1, - }, - label: "`X` is a good letter", - }, - SpanLabel { - start: Position { - string: "Y0", - count: 1, - }, - end: Position { - string: "Y2", - count: 1, - }, - label: "`Y` is a good letter too", - }, - SpanLabel { - start: Position { - string: "Z0", - count: 1, - }, - end: Position { - string: "Z2", - count: 1, - }, - label: "`Z` label", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | X0 Y0 Z0 - | _____^__-__- - | | ____|__| - | || ___| - | ||| -4 | ||| X1 Y1 Z1 -5 | ||| X2 Y2 Z2 - | |||____^__-__- `Z` label - | ||____|__| - | |____| `Y` is a good letter too - | `X` is a good letter - -"#); -} - -#[test] -fn triple_exact_overlap() { - test_harness(r#" -fn foo() { - X0 Y0 Z0 - X1 Y1 Z1 - X2 Y2 Z2 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "X0", - count: 1, - }, - end: Position { - string: "X2", - count: 1, - }, - label: "`X` is a good letter", - }, - SpanLabel { - start: Position { - string: "X0", - count: 1, - }, - end: Position { - string: "X2", - count: 1, - }, - label: "`Y` is a good letter too", - }, - SpanLabel { - start: Position { - string: "X0", - count: 1, - }, - end: Position { - string: "X2", - count: 1, - }, - label: "`Z` label", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | / X0 Y0 Z0 -4 | | X1 Y1 Z1 -5 | | X2 Y2 Z2 - | | ^ - | | | - | | `X` is a good letter - | |____`Y` is a good letter too - | `Z` label - -"#); -} - -#[test] -fn minimum_depth() { - test_harness(r#" -fn foo() { - X0 Y0 Z0 - X1 Y1 Z1 - X2 Y2 Z2 - X3 Y3 Z3 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "Y0", - count: 1, - }, - end: Position { - string: "X1", - count: 1, - }, - label: "`X` is a good letter", - }, - SpanLabel { - start: Position { - string: "Y1", - count: 1, - }, - end: Position { - string: "Z2", - count: 1, - }, - label: "`Y` is a good letter too", - }, - SpanLabel { - start: Position { - string: "X2", - count: 1, - }, - end: Position { - string: "Y3", - count: 1, - }, - label: "`Z`", - }, - ], - r#" -error: foo - --> test.rs:3:6 - | -3 | X0 Y0 Z0 - | ______^ -4 | | X1 Y1 Z1 - | |____^_- - | ||____| - | | `X` is a good letter -5 | | X2 Y2 Z2 - | |____-______- `Y` is a good letter too - | ____| - | | -6 | | X3 Y3 Z3 - | |________- `Z` - -"#); -} - -#[test] -fn non_overlaping() { - test_harness(r#" -fn foo() { - X0 Y0 Z0 - X1 Y1 Z1 - X2 Y2 Z2 - X3 Y3 Z3 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "X0", - count: 1, - }, - end: Position { - string: "X1", - count: 1, - }, - label: "`X` is a good letter", - }, - SpanLabel { - start: Position { - string: "Y2", - count: 1, - }, - end: Position { - string: "Z3", - count: 1, - }, - label: "`Y` is a good letter too", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | / X0 Y0 Z0 -4 | | X1 Y1 Z1 - | |____^ `X` is a good letter -5 | X2 Y2 Z2 - | ______- -6 | | X3 Y3 Z3 - | |__________- `Y` is a good letter too - -"#); -} - -#[test] -fn overlaping_start_and_end() { - test_harness(r#" -fn foo() { - X0 Y0 Z0 - X1 Y1 Z1 - X2 Y2 Z2 - X3 Y3 Z3 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "Y0", - count: 1, - }, - end: Position { - string: "X1", - count: 1, - }, - label: "`X` is a good letter", - }, - SpanLabel { - start: Position { - string: "Z1", - count: 1, - }, - end: Position { - string: "Z3", - count: 1, - }, - label: "`Y` is a good letter too", - }, - ], - r#" -error: foo - --> test.rs:3:6 - | -3 | X0 Y0 Z0 - | ______^ -4 | | X1 Y1 Z1 - | |____^____- - | ||____| - | | `X` is a good letter -5 | | X2 Y2 Z2 -6 | | X3 Y3 Z3 - | |___________- `Y` is a good letter too - -"#); -} - -#[test] -fn multiple_labels_primary_without_message() { - test_harness(r#" -fn foo() { - a { b { c } d } -} -"#, - vec![ - SpanLabel { - start: Position { - string: "b", - count: 1, - }, - end: Position { - string: "}", - count: 1, - }, - label: "", - }, - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "`a` is a good letter", - }, - SpanLabel { - start: Position { - string: "c", - count: 1, - }, - end: Position { - string: "c", - count: 1, - }, - label: "", - }, - ], - r#" -error: foo - --> test.rs:3:7 - | -3 | a { b { c } d } - | ----^^^^-^^-- `a` is a good letter - -"#); -} - -#[test] -fn multiple_labels_secondary_without_message() { - test_harness(r#" -fn foo() { - a { b { c } d } -} -"#, - vec![ - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "`a` is a good letter", - }, - SpanLabel { - start: Position { - string: "b", - count: 1, - }, - end: Position { - string: "}", - count: 1, - }, - label: "", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | a { b { c } d } - | ^^^^-------^^ `a` is a good letter - -"#); -} - -#[test] -fn multiple_labels_primary_without_message_2() { - test_harness(r#" -fn foo() { - a { b { c } d } -} -"#, - vec![ - SpanLabel { - start: Position { - string: "b", - count: 1, - }, - end: Position { - string: "}", - count: 1, - }, - label: "`b` is a good letter", - }, - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "", - }, - SpanLabel { - start: Position { - string: "c", - count: 1, - }, - end: Position { - string: "c", - count: 1, - }, - label: "", - }, - ], - r#" -error: foo - --> test.rs:3:7 - | -3 | a { b { c } d } - | ----^^^^-^^-- - | | - | `b` is a good letter - -"#); -} - -#[test] -fn multiple_labels_secondary_without_message_2() { - test_harness(r#" -fn foo() { - a { b { c } d } -} -"#, - vec![ - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "", - }, - SpanLabel { - start: Position { - string: "b", - count: 1, - }, - end: Position { - string: "}", - count: 1, - }, - label: "`b` is a good letter", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | a { b { c } d } - | ^^^^-------^^ - | | - | `b` is a good letter - -"#); -} - -#[test] -fn multiple_labels_secondary_without_message_3() { - test_harness(r#" -fn foo() { - a bc d -} -"#, - vec![ - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "b", - count: 1, - }, - label: "`a` is a good letter", - }, - SpanLabel { - start: Position { - string: "c", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | a bc d - | ^^^^---- - | | - | `a` is a good letter - -"#); -} - -#[test] -fn multiple_labels_without_message() { - test_harness(r#" -fn foo() { - a { b { c } d } -} -"#, - vec![ - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "", - }, - SpanLabel { - start: Position { - string: "b", - count: 1, - }, - end: Position { - string: "}", - count: 1, - }, - label: "", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | a { b { c } d } - | ^^^^-------^^ - -"#); -} - -#[test] -fn multiple_labels_without_message_2() { - test_harness(r#" -fn foo() { - a { b { c } d } -} -"#, - vec![ - SpanLabel { - start: Position { - string: "b", - count: 1, - }, - end: Position { - string: "}", - count: 1, - }, - label: "", - }, - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "", - }, - SpanLabel { - start: Position { - string: "c", - count: 1, - }, - end: Position { - string: "c", - count: 1, - }, - label: "", - }, - ], - r#" -error: foo - --> test.rs:3:7 - | -3 | a { b { c } d } - | ----^^^^-^^-- - -"#); -} - -#[test] -fn multiple_labels_with_message() { - test_harness(r#" -fn foo() { - a { b { c } d } -} -"#, - vec![ - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "`a` is a good letter", - }, - SpanLabel { - start: Position { - string: "b", - count: 1, - }, - end: Position { - string: "}", - count: 1, - }, - label: "`b` is a good letter", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | a { b { c } d } - | ^^^^-------^^ - | | | - | | `b` is a good letter - | `a` is a good letter - -"#); -} - -#[test] -fn single_label_with_message() { - test_harness(r#" -fn foo() { - a { b { c } d } -} -"#, - vec![ - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "`a` is a good letter", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | a { b { c } d } - | ^^^^^^^^^^^^^ `a` is a good letter - -"#); -} - -#[test] -fn single_label_without_message() { - test_harness(r#" -fn foo() { - a { b { c } d } -} -"#, - vec![ - SpanLabel { - start: Position { - string: "a", - count: 1, - }, - end: Position { - string: "d", - count: 1, - }, - label: "", - }, - ], - r#" -error: foo - --> test.rs:3:3 - | -3 | a { b { c } d } - | ^^^^^^^^^^^^^ - -"#); -} - -#[test] -fn long_snippet() { - test_harness(r#" -fn foo() { - X0 Y0 Z0 - X1 Y1 Z1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 - X2 Y2 Z2 - X3 Y3 Z3 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "Y0", - count: 1, - }, - end: Position { - string: "X1", - count: 1, - }, - label: "`X` is a good letter", - }, - SpanLabel { - start: Position { - string: "Z1", - count: 1, - }, - end: Position { - string: "Z3", - count: 1, - }, - label: "`Y` is a good letter too", - }, - ], - r#" -error: foo - --> test.rs:3:6 - | -3 | X0 Y0 Z0 - | ______^ -4 | | X1 Y1 Z1 - | |____^____- - | ||____| - | | `X` is a good letter -5 | | 1 -6 | | 2 -7 | | 3 -... | -15 | | X2 Y2 Z2 -16 | | X3 Y3 Z3 - | |___________- `Y` is a good letter too - -"#); -} - -#[test] -fn long_snippet_multiple_spans() { - test_harness(r#" -fn foo() { - X0 Y0 Z0 -1 -2 -3 - X1 Y1 Z1 -4 -5 -6 - X2 Y2 Z2 -7 -8 -9 -10 - X3 Y3 Z3 -} -"#, - vec![ - SpanLabel { - start: Position { - string: "Y0", - count: 1, - }, - end: Position { - string: "Y3", - count: 1, - }, - label: "`Y` is a good letter", - }, - SpanLabel { - start: Position { - string: "Z1", - count: 1, - }, - end: Position { - string: "Z2", - count: 1, - }, - label: "`Z` is a good letter too", - }, - ], - r#" -error: foo - --> test.rs:3:6 - | -3 | X0 Y0 Z0 - | ______^ -4 | | 1 -5 | | 2 -6 | | 3 -7 | | X1 Y1 Z1 - | |_________- -8 | || 4 -9 | || 5 -10 | || 6 -11 | || X2 Y2 Z2 - | ||__________- `Z` is a good letter too -... | -15 | | 10 -16 | | X3 Y3 Z3 - | |_______^ `Y` is a good letter - -"#); -} diff --git a/src/libsyntax_ext/deriving/cmp/ord.rs b/src/libsyntax_ext/deriving/cmp/ord.rs deleted file mode 100644 index 3eeed95aff..0000000000 --- a/src/libsyntax_ext/deriving/cmp/ord.rs +++ /dev/null @@ -1,116 +0,0 @@ -use crate::deriving::path_std; -use crate::deriving::generic::*; -use crate::deriving::generic::ty::*; - -use syntax::ast::{self, Expr, MetaItem}; -use syntax_expand::base::{Annotatable, ExtCtxt}; -use syntax::ptr::P; -use syntax::symbol::sym; -use syntax_pos::Span; - -pub fn expand_deriving_ord(cx: &mut ExtCtxt<'_>, - span: Span, - mitem: &MetaItem, - item: &Annotatable, - push: &mut dyn FnMut(Annotatable)) { - let inline = cx.meta_word(span, sym::inline); - let attrs = vec![cx.attribute(inline)]; - let trait_def = TraitDef { - span, - attributes: Vec::new(), - path: path_std!(cx, cmp::Ord), - additional_bounds: Vec::new(), - generics: LifetimeBounds::empty(), - is_unsafe: false, - supports_unions: false, - methods: vec![MethodDef { - name: "cmp", - generics: LifetimeBounds::empty(), - explicit_self: borrowed_explicit_self(), - args: vec![(borrowed_self(), "other")], - ret_ty: Literal(path_std!(cx, cmp::Ordering)), - attributes: attrs, - is_unsafe: false, - unify_fieldless_variants: true, - combine_substructure: combine_substructure(Box::new(|a, b, c| { - cs_cmp(a, b, c) - })), - }], - associated_types: Vec::new(), - }; - - trait_def.expand(cx, mitem, item, push) -} - - -pub fn ordering_collapsed( - cx: &mut ExtCtxt<'_>, - span: Span, - self_arg_tags: &[ast::Ident], -) -> P<ast::Expr> { - let lft = cx.expr_ident(span, self_arg_tags[0]); - let rgt = cx.expr_addr_of(span, cx.expr_ident(span, self_arg_tags[1])); - cx.expr_method_call(span, lft, ast::Ident::new(sym::cmp, span), vec![rgt]) -} - -pub fn cs_cmp(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> P<Expr> { - let test_id = ast::Ident::new(sym::cmp, span); - let equals_path = cx.path_global(span, cx.std_path(&[sym::cmp, sym::Ordering, sym::Equal])); - - let cmp_path = cx.std_path(&[sym::cmp, sym::Ord, sym::cmp]); - - // Builds: - // - // match ::std::cmp::Ord::cmp(&self_field1, &other_field1) { - // ::std::cmp::Ordering::Equal => - // match ::std::cmp::Ord::cmp(&self_field2, &other_field2) { - // ::std::cmp::Ordering::Equal => { - // ... - // } - // cmp => cmp - // }, - // cmp => cmp - // } - // - cs_fold(// foldr nests the if-elses correctly, leaving the first field - // as the outermost one, and the last as the innermost. - false, - |cx, span, old, self_f, other_fs| { - // match new { - // ::std::cmp::Ordering::Equal => old, - // cmp => cmp - // } - - let new = { - let other_f = match other_fs { - [o_f] => o_f, - _ => cx.span_bug(span, "not exactly 2 arguments in `derive(Ord)`"), - }; - - let args = vec![ - cx.expr_addr_of(span, self_f), - cx.expr_addr_of(span, other_f.clone()), - ]; - - cx.expr_call_global(span, cmp_path.clone(), args) - }; - - let eq_arm = cx.arm(span, cx.pat_path(span, equals_path.clone()), old); - let neq_arm = cx.arm(span, - cx.pat_ident(span, test_id), - cx.expr_ident(span, test_id)); - - cx.expr_match(span, new, vec![eq_arm, neq_arm]) - }, - cx.expr_path(equals_path.clone()), - Box::new(|cx, span, (self_args, tag_tuple), _non_self_args| { - if self_args.len() != 2 { - cx.span_bug(span, "not exactly 2 arguments in `derive(Ord)`") - } else { - ordering_collapsed(cx, span, tag_tuple) - } - }), - cx, - span, - substr) -} diff --git a/src/libsyntax_ext/deriving/decodable.rs b/src/libsyntax_ext/deriving/decodable.rs deleted file mode 100644 index 3a0379a0eb..0000000000 --- a/src/libsyntax_ext/deriving/decodable.rs +++ /dev/null @@ -1,190 +0,0 @@ -//! The compiler code necessary for `#[derive(RustcDecodable)]`. See encodable.rs for more. - -use crate::deriving::pathvec_std; -use crate::deriving::generic::*; -use crate::deriving::generic::ty::*; - -use syntax::ast; -use syntax::ast::{Expr, MetaItem, Mutability}; -use syntax_expand::base::{Annotatable, ExtCtxt}; -use syntax::ptr::P; -use syntax::symbol::Symbol; -use syntax_pos::Span; - -pub fn expand_deriving_rustc_decodable(cx: &mut ExtCtxt<'_>, - span: Span, - mitem: &MetaItem, - item: &Annotatable, - push: &mut dyn FnMut(Annotatable)) { - let krate = "rustc_serialize"; - let typaram = "__D"; - - let trait_def = TraitDef { - span, - attributes: Vec::new(), - path: Path::new_(vec![krate, "Decodable"], None, vec![], PathKind::Global), - additional_bounds: Vec::new(), - generics: LifetimeBounds::empty(), - is_unsafe: false, - supports_unions: false, - methods: vec![MethodDef { - name: "decode", - generics: LifetimeBounds { - lifetimes: Vec::new(), - bounds: vec![(typaram, - vec![Path::new_(vec![krate, "Decoder"], - None, - vec![], - PathKind::Global)])], - }, - explicit_self: None, - args: vec![(Ptr(Box::new(Literal(Path::new_local(typaram))), - Borrowed(None, Mutability::Mutable)), "d")], - ret_ty: - Literal(Path::new_(pathvec_std!(cx, result::Result), - None, - vec![Box::new(Self_), Box::new(Literal(Path::new_( - vec![typaram, "Error"], None, vec![], PathKind::Local - )))], - PathKind::Std)), - attributes: Vec::new(), - is_unsafe: false, - unify_fieldless_variants: false, - combine_substructure: combine_substructure(Box::new(|a, b, c| { - decodable_substructure(a, b, c, krate) - })), - }], - associated_types: Vec::new(), - }; - - trait_def.expand(cx, mitem, item, push) -} - -fn decodable_substructure(cx: &mut ExtCtxt<'_>, - trait_span: Span, - substr: &Substructure<'_>, - krate: &str) - -> P<Expr> { - let decoder = substr.nonself_args[0].clone(); - let recurse = vec![ - cx.ident_of(krate, trait_span), - cx.ident_of("Decodable", trait_span), - cx.ident_of("decode", trait_span), - ]; - let exprdecode = cx.expr_path(cx.path_global(trait_span, recurse)); - // throw an underscore in front to suppress unused variable warnings - let blkarg = cx.ident_of("_d", trait_span); - let blkdecoder = cx.expr_ident(trait_span, blkarg); - - return match *substr.fields { - StaticStruct(_, ref summary) => { - let nfields = match *summary { - Unnamed(ref fields, _) => fields.len(), - Named(ref fields) => fields.len(), - }; - let read_struct_field = cx.ident_of("read_struct_field", trait_span); - - let path = cx.path_ident(trait_span, substr.type_ident); - let result = - decode_static_fields(cx, trait_span, path, summary, |cx, span, name, field| { - cx.expr_try(span, - cx.expr_method_call(span, - blkdecoder.clone(), - read_struct_field, - vec![cx.expr_str(span, name), - cx.expr_usize(span, field), - exprdecode.clone()])) - }); - let result = cx.expr_ok(trait_span, result); - cx.expr_method_call(trait_span, - decoder, - cx.ident_of("read_struct", trait_span), - vec![cx.expr_str(trait_span, substr.type_ident.name), - cx.expr_usize(trait_span, nfields), - cx.lambda1(trait_span, result, blkarg)]) - } - StaticEnum(_, ref fields) => { - let variant = cx.ident_of("i", trait_span); - - let mut arms = Vec::with_capacity(fields.len() + 1); - let mut variants = Vec::with_capacity(fields.len()); - let rvariant_arg = cx.ident_of("read_enum_variant_arg", trait_span); - - for (i, &(ident, v_span, ref parts)) in fields.iter().enumerate() { - variants.push(cx.expr_str(v_span, ident.name)); - - let path = cx.path(trait_span, vec![substr.type_ident, ident]); - let decoded = decode_static_fields(cx, v_span, path, parts, |cx, span, _, field| { - let idx = cx.expr_usize(span, field); - cx.expr_try(span, - cx.expr_method_call(span, - blkdecoder.clone(), - rvariant_arg, - vec![idx, exprdecode.clone()])) - }); - - arms.push(cx.arm(v_span, cx.pat_lit(v_span, cx.expr_usize(v_span, i)), decoded)); - } - - arms.push(cx.arm_unreachable(trait_span)); - - let result = - cx.expr_ok(trait_span, - cx.expr_match(trait_span, cx.expr_ident(trait_span, variant), arms)); - let lambda = cx.lambda(trait_span, vec![blkarg, variant], result); - let variant_vec = cx.expr_vec(trait_span, variants); - let variant_vec = cx.expr_addr_of(trait_span, variant_vec); - let result = cx.expr_method_call(trait_span, - blkdecoder, - cx.ident_of("read_enum_variant", trait_span), - vec![variant_vec, lambda]); - cx.expr_method_call(trait_span, - decoder, - cx.ident_of("read_enum", trait_span), - vec![cx.expr_str(trait_span, substr.type_ident.name), - cx.lambda1(trait_span, result, blkarg)]) - } - _ => cx.bug("expected StaticEnum or StaticStruct in derive(Decodable)"), - }; -} - -/// Creates a decoder for a single enum variant/struct: -/// - `outer_pat_path` is the path to this enum variant/struct -/// - `getarg` should retrieve the `usize`-th field with name `@str`. -fn decode_static_fields<F>(cx: &mut ExtCtxt<'_>, - trait_span: Span, - outer_pat_path: ast::Path, - fields: &StaticFields, - mut getarg: F) - -> P<Expr> - where F: FnMut(&mut ExtCtxt<'_>, Span, Symbol, usize) -> P<Expr> -{ - match *fields { - Unnamed(ref fields, is_tuple) => { - let path_expr = cx.expr_path(outer_pat_path); - if !is_tuple { - path_expr - } else { - let fields = fields.iter() - .enumerate() - .map(|(i, &span)| { - getarg(cx, span, Symbol::intern(&format!("_field{}", i)), i) - }) - .collect(); - - cx.expr_call(trait_span, path_expr, fields) - } - } - Named(ref fields) => { - // use the field's span to get nicer error messages. - let fields = fields.iter() - .enumerate() - .map(|(i, &(ident, span))| { - let arg = getarg(cx, span, ident.name, i); - cx.field_imm(span, ident, arg) - }) - .collect(); - cx.expr_struct(trait_span, outer_pat_path, fields) - } - } -} diff --git a/src/libsyntax_ext/deriving/default.rs b/src/libsyntax_ext/deriving/default.rs deleted file mode 100644 index ab57f395f6..0000000000 --- a/src/libsyntax_ext/deriving/default.rs +++ /dev/null @@ -1,82 +0,0 @@ -use crate::deriving::path_std; -use crate::deriving::generic::*; -use crate::deriving::generic::ty::*; - -use syntax::ast::{Expr, MetaItem}; -use syntax_expand::base::{Annotatable, DummyResult, ExtCtxt}; -use syntax::ptr::P; -use syntax::symbol::{kw, sym}; -use syntax::span_err; -use syntax_pos::Span; - -use rustc_error_codes::*; - -pub fn expand_deriving_default(cx: &mut ExtCtxt<'_>, - span: Span, - mitem: &MetaItem, - item: &Annotatable, - push: &mut dyn FnMut(Annotatable)) { - let inline = cx.meta_word(span, sym::inline); - let attrs = vec![cx.attribute(inline)]; - let trait_def = TraitDef { - span, - attributes: Vec::new(), - path: path_std!(cx, default::Default), - additional_bounds: Vec::new(), - generics: LifetimeBounds::empty(), - is_unsafe: false, - supports_unions: false, - methods: vec![MethodDef { - name: "default", - generics: LifetimeBounds::empty(), - explicit_self: None, - args: Vec::new(), - ret_ty: Self_, - attributes: attrs, - is_unsafe: false, - unify_fieldless_variants: false, - combine_substructure: combine_substructure(Box::new(|a, b, c| { - default_substructure(a, b, c) - })), - }], - associated_types: Vec::new(), - }; - trait_def.expand(cx, mitem, item, push) -} - -fn default_substructure(cx: &mut ExtCtxt<'_>, - trait_span: Span, - substr: &Substructure<'_>) - -> P<Expr> { - // Note that `kw::Default` is "default" and `sym::Default` is "Default"! - let default_ident = cx.std_path(&[kw::Default, sym::Default, kw::Default]); - let default_call = |span| cx.expr_call_global(span, default_ident.clone(), Vec::new()); - - return match *substr.fields { - StaticStruct(_, ref summary) => { - match *summary { - Unnamed(ref fields, is_tuple) => { - if !is_tuple { - cx.expr_ident(trait_span, substr.type_ident) - } else { - let exprs = fields.iter().map(|sp| default_call(*sp)).collect(); - cx.expr_call_ident(trait_span, substr.type_ident, exprs) - } - } - Named(ref fields) => { - let default_fields = fields.iter() - .map(|&(ident, span)| cx.field_imm(span, ident, default_call(span))) - .collect(); - cx.expr_struct_ident(trait_span, substr.type_ident, default_fields) - } - } - } - StaticEnum(..) => { - span_err!(cx, trait_span, E0665, - "`Default` cannot be derived for enums, only structs"); - // let compilation continue - DummyResult::raw_expr(trait_span, true) - } - _ => cx.span_bug(trait_span, "method in `derive(Default)`"), - }; -} diff --git a/src/libsyntax_ext/deriving/hash.rs b/src/libsyntax_ext/deriving/hash.rs deleted file mode 100644 index fe9ef78bb1..0000000000 --- a/src/libsyntax_ext/deriving/hash.rs +++ /dev/null @@ -1,92 +0,0 @@ -use crate::deriving::{self, pathvec_std, path_std}; -use crate::deriving::generic::*; -use crate::deriving::generic::ty::*; - -use syntax::ast::{Expr, MetaItem, Mutability}; -use syntax_expand::base::{Annotatable, ExtCtxt}; -use syntax::ptr::P; -use syntax::symbol::sym; -use syntax_pos::Span; - -pub fn expand_deriving_hash(cx: &mut ExtCtxt<'_>, - span: Span, - mitem: &MetaItem, - item: &Annotatable, - push: &mut dyn FnMut(Annotatable)) { - - let path = Path::new_(pathvec_std!(cx, hash::Hash), None, vec![], PathKind::Std); - - let typaram = "__H"; - - let arg = Path::new_local(typaram); - let hash_trait_def = TraitDef { - span, - attributes: Vec::new(), - path, - additional_bounds: Vec::new(), - generics: LifetimeBounds::empty(), - is_unsafe: false, - supports_unions: false, - methods: vec![MethodDef { - name: "hash", - generics: LifetimeBounds { - lifetimes: Vec::new(), - bounds: vec![(typaram, vec![path_std!(cx, hash::Hasher)])], - }, - explicit_self: borrowed_explicit_self(), - args: vec![(Ptr(Box::new(Literal(arg)), - Borrowed(None, Mutability::Mutable)), "state")], - ret_ty: nil_ty(), - attributes: vec![], - is_unsafe: false, - unify_fieldless_variants: true, - combine_substructure: combine_substructure(Box::new(|a, b, c| { - hash_substructure(a, b, c) - })), - }], - associated_types: Vec::new(), - }; - - hash_trait_def.expand(cx, mitem, item, push); -} - -fn hash_substructure(cx: &mut ExtCtxt<'_>, trait_span: Span, substr: &Substructure<'_>) -> P<Expr> { - let state_expr = match &substr.nonself_args { - &[o_f] => o_f, - _ => { - cx.span_bug(trait_span, - "incorrect number of arguments in `derive(Hash)`") - } - }; - let call_hash = |span, thing_expr| { - let hash_path = { - let strs = cx.std_path(&[sym::hash, sym::Hash, sym::hash]); - - cx.expr_path(cx.path_global(span, strs)) - }; - let ref_thing = cx.expr_addr_of(span, thing_expr); - let expr = cx.expr_call(span, hash_path, vec![ref_thing, state_expr.clone()]); - cx.stmt_expr(expr) - }; - let mut stmts = Vec::new(); - - let fields = match *substr.fields { - Struct(_, ref fs) | EnumMatching(_, 1, .., ref fs) => fs, - EnumMatching(.., ref fs) => { - let variant_value = deriving::call_intrinsic(cx, - trait_span, - "discriminant_value", - vec![cx.expr_self(trait_span)]); - - stmts.push(call_hash(trait_span, variant_value)); - - fs - } - _ => cx.span_bug(trait_span, "impossible substructure in `derive(Hash)`"), - }; - - stmts.extend(fields.iter().map(|FieldInfo { ref self_, span, .. }| - call_hash(*span, self_.clone()))); - - cx.expr_block(cx.block(trait_span, stmts)) -} diff --git a/src/libsyntax_ext/global_asm.rs b/src/libsyntax_ext/global_asm.rs deleted file mode 100644 index 8a8ce9a7f1..0000000000 --- a/src/libsyntax_ext/global_asm.rs +++ /dev/null @@ -1,65 +0,0 @@ -/// Module-level assembly support. -/// -/// The macro defined here allows you to specify "top-level", -/// "file-scoped", or "module-level" assembly. These synonyms -/// all correspond to LLVM's module-level inline assembly instruction. -/// -/// For example, `global_asm!("some assembly here")` codegens to -/// LLVM's `module asm "some assembly here"`. All of LLVM's caveats -/// therefore apply. - -use errors::DiagnosticBuilder; - -use syntax::ast; -use syntax::source_map::respan; -use syntax_expand::base::{self, *}; -use syntax::token; -use syntax::ptr::P; -use syntax_pos::Span; -use syntax::tokenstream::TokenStream; -use smallvec::smallvec; - -pub fn expand_global_asm<'cx>(cx: &'cx mut ExtCtxt<'_>, - sp: Span, - tts: TokenStream) -> Box<dyn base::MacResult + 'cx> { - match parse_global_asm(cx, sp, tts) { - Ok(Some(global_asm)) => { - MacEager::items(smallvec![P(ast::Item { - ident: ast::Ident::invalid(), - attrs: Vec::new(), - id: ast::DUMMY_NODE_ID, - kind: ast::ItemKind::GlobalAsm(P(global_asm)), - vis: respan(sp.shrink_to_lo(), ast::VisibilityKind::Inherited), - span: cx.with_def_site_ctxt(sp), - tokens: None, - })]) - } - Ok(None) => DummyResult::any(sp), - Err(mut err) => { - err.emit(); - DummyResult::any(sp) - } - } -} - -fn parse_global_asm<'a>( - cx: &mut ExtCtxt<'a>, - sp: Span, - tts: TokenStream -) -> Result<Option<ast::GlobalAsm>, DiagnosticBuilder<'a>> { - let mut p = cx.new_parser_from_tts(tts); - - if p.token == token::Eof { - let mut err = cx.struct_span_err(sp, "macro requires a string literal as an argument"); - err.span_label(sp, "string literal required"); - return Err(err); - } - - let expr = p.parse_expr()?; - let (asm, _) = match expr_to_string(cx, expr, "inline assembly must be a string literal") { - Some((s, st)) => (s, st), - None => return Ok(None), - }; - - Ok(Some(ast::GlobalAsm { asm })) -} diff --git a/src/libsyntax_ext/log_syntax.rs b/src/libsyntax_ext/log_syntax.rs deleted file mode 100644 index 2202375e5e..0000000000 --- a/src/libsyntax_ext/log_syntax.rs +++ /dev/null @@ -1,14 +0,0 @@ -use syntax_expand::base; -use syntax::print; -use syntax::tokenstream::TokenStream; -use syntax_pos; - -pub fn expand_log_syntax<'cx>(_cx: &'cx mut base::ExtCtxt<'_>, - sp: syntax_pos::Span, - tts: TokenStream) - -> Box<dyn base::MacResult + 'cx> { - println!("{}", print::pprust::tts_to_string(tts)); - - // any so that `log_syntax` can be invoked as an expression and item. - base::DummyResult::any_valid(sp) -} diff --git a/src/libsyntax_ext/test.rs b/src/libsyntax_ext/test.rs deleted file mode 100644 index 8656100c92..0000000000 --- a/src/libsyntax_ext/test.rs +++ /dev/null @@ -1,378 +0,0 @@ -/// The expansion from a test function to the appropriate test struct for libtest -/// Ideally, this code would be in libtest but for efficiency and error messages it lives here. - -use crate::util::check_builtin_macro_attribute; - -use syntax::ast; -use syntax::attr; -use syntax_expand::base::*; -use syntax::print::pprust; -use syntax::source_map::respan; -use syntax::symbol::{Symbol, sym}; -use syntax_pos::Span; - -use std::iter; - -// #[test_case] is used by custom test authors to mark tests -// When building for test, it needs to make the item public and gensym the name -// Otherwise, we'll omit the item. This behavior means that any item annotated -// with #[test_case] is never addressable. -// -// We mark item with an inert attribute "rustc_test_marker" which the test generation -// logic will pick up on. -pub fn expand_test_case( - ecx: &mut ExtCtxt<'_>, - attr_sp: Span, - meta_item: &ast::MetaItem, - anno_item: Annotatable -) -> Vec<Annotatable> { - check_builtin_macro_attribute(ecx, meta_item, sym::test_case); - - if !ecx.ecfg.should_test { return vec![]; } - - let sp = ecx.with_def_site_ctxt(attr_sp); - let mut item = anno_item.expect_item(); - item = item.map(|mut item| { - item.vis = respan(item.vis.span, ast::VisibilityKind::Public); - item.ident.span = item.ident.span.with_ctxt(sp.ctxt()); - item.attrs.push( - ecx.attribute(ecx.meta_word(sp, sym::rustc_test_marker)) - ); - item - }); - - return vec![Annotatable::Item(item)] -} - -pub fn expand_test( - cx: &mut ExtCtxt<'_>, - attr_sp: Span, - meta_item: &ast::MetaItem, - item: Annotatable, -) -> Vec<Annotatable> { - check_builtin_macro_attribute(cx, meta_item, sym::test); - expand_test_or_bench(cx, attr_sp, item, false) -} - -pub fn expand_bench( - cx: &mut ExtCtxt<'_>, - attr_sp: Span, - meta_item: &ast::MetaItem, - item: Annotatable, -) -> Vec<Annotatable> { - check_builtin_macro_attribute(cx, meta_item, sym::bench); - expand_test_or_bench(cx, attr_sp, item, true) -} - -pub fn expand_test_or_bench( - cx: &mut ExtCtxt<'_>, - attr_sp: Span, - item: Annotatable, - is_bench: bool -) -> Vec<Annotatable> { - // If we're not in test configuration, remove the annotated item - if !cx.ecfg.should_test { return vec![]; } - - let item = - if let Annotatable::Item(i) = item { i } - else { - cx.parse_sess.span_diagnostic.span_fatal(item.span(), - "`#[test]` attribute is only allowed on non associated functions").raise(); - }; - - if let ast::ItemKind::Mac(_) = item.kind { - cx.parse_sess.span_diagnostic.span_warn(item.span, - "`#[test]` attribute should not be used on macros. Use `#[cfg(test)]` instead."); - return vec![Annotatable::Item(item)]; - } - - // has_*_signature will report any errors in the type so compilation - // will fail. We shouldn't try to expand in this case because the errors - // would be spurious. - if (!is_bench && !has_test_signature(cx, &item)) || - (is_bench && !has_bench_signature(cx, &item)) { - return vec![Annotatable::Item(item)]; - } - - let (sp, attr_sp) = (cx.with_def_site_ctxt(item.span), cx.with_def_site_ctxt(attr_sp)); - - let test_id = ast::Ident::new(sym::test, attr_sp); - - // creates test::$name - let test_path = |name| { - cx.path(sp, vec![test_id, cx.ident_of(name, sp)]) - }; - - // creates test::ShouldPanic::$name - let should_panic_path = |name| { - cx.path(sp, vec![test_id, cx.ident_of("ShouldPanic", sp), cx.ident_of(name, sp)]) - }; - - // creates test::TestType::$name - let test_type_path = |name| { - cx.path(sp, vec![test_id, cx.ident_of("TestType", sp), cx.ident_of(name, sp)]) - }; - - // creates $name: $expr - let field = |name, expr| cx.field_imm(sp, cx.ident_of(name, sp), expr); - - let test_fn = if is_bench { - // A simple ident for a lambda - let b = cx.ident_of("b", attr_sp); - - cx.expr_call(sp, cx.expr_path(test_path("StaticBenchFn")), vec![ - // |b| self::test::assert_test_result( - cx.lambda1(sp, - cx.expr_call(sp, cx.expr_path(test_path("assert_test_result")), vec![ - // super::$test_fn(b) - cx.expr_call(sp, - cx.expr_path(cx.path(sp, vec![item.ident])), - vec![cx.expr_ident(sp, b)]) - ]), - b - ) - // ) - ]) - } else { - cx.expr_call(sp, cx.expr_path(test_path("StaticTestFn")), vec![ - // || { - cx.lambda0(sp, - // test::assert_test_result( - cx.expr_call(sp, cx.expr_path(test_path("assert_test_result")), vec![ - // $test_fn() - cx.expr_call(sp, cx.expr_path(cx.path(sp, vec![item.ident])), vec![]) - // ) - ]) - // } - ) - // ) - ]) - }; - - let mut test_const = cx.item(sp, ast::Ident::new(item.ident.name, sp), - vec![ - // #[cfg(test)] - cx.attribute(attr::mk_list_item(ast::Ident::new(sym::cfg, attr_sp), vec![ - attr::mk_nested_word_item(ast::Ident::new(sym::test, attr_sp)) - ])), - // #[rustc_test_marker] - cx.attribute(cx.meta_word(attr_sp, sym::rustc_test_marker)), - ], - // const $ident: test::TestDescAndFn = - ast::ItemKind::Const(cx.ty(sp, ast::TyKind::Path(None, test_path("TestDescAndFn"))), - // test::TestDescAndFn { - cx.expr_struct(sp, test_path("TestDescAndFn"), vec![ - // desc: test::TestDesc { - field("desc", cx.expr_struct(sp, test_path("TestDesc"), vec![ - // name: "path::to::test" - field("name", cx.expr_call(sp, cx.expr_path(test_path("StaticTestName")), - vec![ - cx.expr_str(sp, Symbol::intern(&item_path( - // skip the name of the root module - &cx.current_expansion.module.mod_path[1..], - &item.ident - ))) - ])), - // ignore: true | false - field("ignore", cx.expr_bool(sp, should_ignore(&item))), - // allow_fail: true | false - field("allow_fail", cx.expr_bool(sp, should_fail(&item))), - // should_panic: ... - field("should_panic", match should_panic(cx, &item) { - // test::ShouldPanic::No - ShouldPanic::No => cx.expr_path(should_panic_path("No")), - // test::ShouldPanic::Yes - ShouldPanic::Yes(None) => cx.expr_path(should_panic_path("Yes")), - // test::ShouldPanic::YesWithMessage("...") - ShouldPanic::Yes(Some(sym)) => cx.expr_call(sp, - cx.expr_path(should_panic_path("YesWithMessage")), - vec![cx.expr_str(sp, sym)]), - }), - // test_type: ... - field("test_type", match test_type(cx) { - // test::TestType::UnitTest - TestType::UnitTest => cx.expr_path(test_type_path("UnitTest")), - // test::TestType::IntegrationTest - TestType::IntegrationTest => cx.expr_path( - test_type_path("IntegrationTest") - ), - // test::TestPath::Unknown - TestType::Unknown => cx.expr_path(test_type_path("Unknown")), - }), - // }, - ])), - // testfn: test::StaticTestFn(...) | test::StaticBenchFn(...) - field("testfn", test_fn) - // } - ]) - // } - )); - test_const = test_const.map(|mut tc| { tc.vis.node = ast::VisibilityKind::Public; tc}); - - // extern crate test - let test_extern = cx.item(sp, - test_id, - vec![], - ast::ItemKind::ExternCrate(None) - ); - - log::debug!("synthetic test item:\n{}\n", pprust::item_to_string(&test_const)); - - vec![ - // Access to libtest under a hygienic name - Annotatable::Item(test_extern), - // The generated test case - Annotatable::Item(test_const), - // The original item - Annotatable::Item(item) - ] -} - -fn item_path(mod_path: &[ast::Ident], item_ident: &ast::Ident) -> String { - mod_path.iter().chain(iter::once(item_ident)) - .map(|x| x.to_string()).collect::<Vec<String>>().join("::") -} - -enum ShouldPanic { - No, - Yes(Option<Symbol>), -} - -fn should_ignore(i: &ast::Item) -> bool { - attr::contains_name(&i.attrs, sym::ignore) -} - -fn should_fail(i: &ast::Item) -> bool { - attr::contains_name(&i.attrs, sym::allow_fail) -} - -fn should_panic(cx: &ExtCtxt<'_>, i: &ast::Item) -> ShouldPanic { - match attr::find_by_name(&i.attrs, sym::should_panic) { - Some(attr) => { - let ref sd = cx.parse_sess.span_diagnostic; - - match attr.meta_item_list() { - // Handle #[should_panic(expected = "foo")] - Some(list) => { - let msg = list.iter() - .find(|mi| mi.check_name(sym::expected)) - .and_then(|mi| mi.meta_item()) - .and_then(|mi| mi.value_str()); - if list.len() != 1 || msg.is_none() { - sd.struct_span_warn( - attr.span, - "argument must be of the form: \ - `expected = \"error message\"`" - ).note("Errors in this attribute were erroneously \ - allowed and will become a hard error in a \ - future release.").emit(); - ShouldPanic::Yes(None) - } else { - ShouldPanic::Yes(msg) - } - }, - // Handle #[should_panic] and #[should_panic = "expected"] - None => ShouldPanic::Yes(attr.value_str()) - } - } - None => ShouldPanic::No, - } -} - -enum TestType { - UnitTest, - IntegrationTest, - Unknown, -} - -/// Attempts to determine the type of test. -/// Since doctests are created without macro expanding, only possible variants here -/// are `UnitTest`, `IntegrationTest` or `Unknown`. -fn test_type(cx: &ExtCtxt<'_>) -> TestType { - // Root path from context contains the topmost sources directory of the crate. - // I.e., for `project` with sources in `src` and tests in `tests` folders - // (no matter how many nested folders lie inside), - // there will be two different root paths: `/project/src` and `/project/tests`. - let crate_path = cx.root_path.as_path(); - - if crate_path.ends_with("src") { - // `/src` folder contains unit-tests. - TestType::UnitTest - } else if crate_path.ends_with("tests") { - // `/tests` folder contains integration tests. - TestType::IntegrationTest - } else { - // Crate layout doesn't match expected one, test type is unknown. - TestType::Unknown - } -} - -fn has_test_signature(cx: &ExtCtxt<'_>, i: &ast::Item) -> bool { - let has_should_panic_attr = attr::contains_name(&i.attrs, sym::should_panic); - let ref sd = cx.parse_sess.span_diagnostic; - if let ast::ItemKind::Fn(ref sig, ref generics, _) = i.kind { - if sig.header.unsafety == ast::Unsafety::Unsafe { - sd.span_err( - i.span, - "unsafe functions cannot be used for tests" - ); - return false - } - if sig.header.asyncness.node.is_async() { - sd.span_err( - i.span, - "async functions cannot be used for tests" - ); - return false - } - - - // If the termination trait is active, the compiler will check that the output - // type implements the `Termination` trait as `libtest` enforces that. - let has_output = match sig.decl.output { - ast::FunctionRetTy::Default(..) => false, - ast::FunctionRetTy::Ty(ref t) if t.kind.is_unit() => false, - _ => true - }; - - if !sig.decl.inputs.is_empty() { - sd.span_err(i.span, "functions used as tests can not have any arguments"); - return false; - } - - match (has_output, has_should_panic_attr) { - (true, true) => { - sd.span_err(i.span, "functions using `#[should_panic]` must return `()`"); - false - }, - (true, false) => if !generics.params.is_empty() { - sd.span_err(i.span, - "functions used as tests must have signature fn() -> ()"); - false - } else { - true - }, - (false, _) => true - } - } else { - sd.span_err(i.span, "only functions may be used as tests"); - false - } -} - -fn has_bench_signature(cx: &ExtCtxt<'_>, i: &ast::Item) -> bool { - let has_sig = if let ast::ItemKind::Fn(ref sig, _, _) = i.kind { - // N.B., inadequate check, but we're running - // well before resolve, can't get too deep. - sig.decl.inputs.len() == 1 - } else { - false - }; - - if !has_sig { - cx.parse_sess.span_diagnostic.span_err(i.span, "functions used as benches must have \ - signature `fn(&mut Bencher) -> impl Termination`"); - } - - has_sig -} diff --git a/src/libterm/lib.rs b/src/libterm/lib.rs index ad1a83316b..2116b433fc 100644 --- a/src/libterm/lib.rs +++ b/src/libterm/lib.rs @@ -27,18 +27,19 @@ //! ``` //! //! [ansi]: https://en.wikipedia.org/wiki/ANSI_escape_code -//! [win]: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682010%28v=vs.85%29.aspx +//! [win]: https://docs.microsoft.com/en-us/windows/console/character-mode-applications //! [ti]: https://en.wikipedia.org/wiki/Terminfo -#![doc(html_root_url = "https://doc.rust-lang.org/nightly/", - html_playground_url = "https://play.rust-lang.org/", - test(attr(deny(warnings))))] +#![doc( + html_root_url = "https://doc.rust-lang.org/nightly/", + html_playground_url = "https://play.rust-lang.org/", + test(attr(deny(warnings))) +)] #![deny(missing_docs)] - #![cfg_attr(windows, feature(libc))] use std::io::prelude::*; -use std::io::{self, Stdout, Stderr}; +use std::io::{self, Stderr, Stdout}; pub use terminfo::TerminfoTerminal; #[cfg(windows)] @@ -86,12 +87,11 @@ pub fn stderr() -> Option<Box<StderrTerminal>> { .or_else(|| WinConsole::new(io::stderr()).ok().map(|t| Box::new(t) as Box<StderrTerminal>)) } - /// Terminal color definitions #[allow(missing_docs)] pub mod color { /// Number for a terminal color - pub type Color = u16; + pub type Color = u32; pub const BLACK: Color = 0; pub const RED: Color = 1; @@ -192,5 +192,7 @@ pub trait Terminal: Write { fn get_mut(&mut self) -> &mut Self::Output; /// Returns the contained stream, destroying the `Terminal` - fn into_inner(self) -> Self::Output where Self: Sized; + fn into_inner(self) -> Self::Output + where + Self: Sized; } diff --git a/src/libterm/terminfo/mod.rs b/src/libterm/terminfo/mod.rs index 09bea80c95..918875e792 100644 --- a/src/libterm/terminfo/mod.rs +++ b/src/libterm/terminfo/mod.rs @@ -8,13 +8,13 @@ use std::fs::File; use std::io::{self, prelude::*, BufReader}; use std::path::Path; -use crate::Attr; use crate::color; +use crate::Attr; use crate::Terminal; +use parm::{expand, Param, Variables}; +use parser::compiled::{msys_terminfo, parse}; use searcher::get_dbpath_for_term; -use parser::compiled::{parse, msys_terminfo}; -use parm::{expand, Variables, Param}; /// A parsed terminfo database entry. #[derive(Debug)] @@ -24,7 +24,7 @@ pub struct TermInfo { /// Map of capability name to boolean value pub bools: HashMap<String, bool>, /// Map of capability name to numeric value - pub numbers: HashMap<String, u16>, + pub numbers: HashMap<String, u32>, /// Map of capability name to raw (unexpanded) string pub strings: HashMap<String, Vec<u8>>, } @@ -42,14 +42,10 @@ pub enum Error { } impl error::Error for Error { - fn description(&self) -> &str { - "failed to create TermInfo" - } - - fn cause(&self) -> Option<&dyn error::Error> { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { use Error::*; - match *self { - IoError(ref e) => Some(e), + match self { + IoError(e) => Some(e), _ => None, } } @@ -112,7 +108,6 @@ pub mod parser { } pub mod parm; - fn cap_for_attr(attr: Attr) -> &'static str { match attr { Attr::Bold => "bold", @@ -134,7 +129,7 @@ fn cap_for_attr(attr: Attr) -> &'static str { /// A Terminal that knows how many colors it supports, with a reference to its /// parsed Terminfo database record. pub struct TerminfoTerminal<T> { - num_colors: u16, + num_colors: u32, out: T, ti: TermInfo, } @@ -178,18 +173,14 @@ impl<T: Write + Send> Terminal for TerminfoTerminal<T> { fn reset(&mut self) -> io::Result<bool> { // are there any terminals that have color/attrs and not sgr0? // Try falling back to sgr, then op - let cmd = match ["sgr0", "sgr", "op"] - .iter() - .filter_map(|cap| self.ti.strings.get(*cap)) - .next() { - Some(op) => { - match expand(&op, &[], &mut Variables::new()) { + let cmd = + match ["sgr0", "sgr", "op"].iter().filter_map(|cap| self.ti.strings.get(*cap)).next() { + Some(op) => match expand(&op, &[], &mut Variables::new()) { Ok(cmd) => cmd, Err(e) => return Err(io::Error::new(io::ErrorKind::InvalidData, e)), - } - } - None => return Ok(false), - }; + }, + None => return Ok(false), + }; self.out.write_all(&cmd).and(Ok(true)) } @@ -202,7 +193,8 @@ impl<T: Write + Send> Terminal for TerminfoTerminal<T> { } fn into_inner(self) -> T - where Self: Sized + where + Self: Sized, { self.out } @@ -211,18 +203,14 @@ impl<T: Write + Send> Terminal for TerminfoTerminal<T> { impl<T: Write + Send> TerminfoTerminal<T> { /// Creates a new TerminfoTerminal with the given TermInfo and Write. pub fn new_with_terminfo(out: T, terminfo: TermInfo) -> TerminfoTerminal<T> { - let nc = if terminfo.strings.contains_key("setaf") && - terminfo.strings.contains_key("setab") { + let nc = if terminfo.strings.contains_key("setaf") && terminfo.strings.contains_key("setab") + { terminfo.numbers.get("colors").map_or(0, |&n| n) } else { 0 }; - TerminfoTerminal { - out, - ti: terminfo, - num_colors: nc, - } + TerminfoTerminal { out, ti: terminfo, num_colors: nc } } /// Creates a new TerminfoTerminal for the current environment with the given Write. @@ -233,27 +221,20 @@ impl<T: Write + Send> TerminfoTerminal<T> { } fn dim_if_necessary(&self, color: color::Color) -> color::Color { - if color >= self.num_colors && color >= 8 && color < 16 { - color - 8 - } else { - color - } + if color >= self.num_colors && color >= 8 && color < 16 { color - 8 } else { color } } fn apply_cap(&mut self, cmd: &str, params: &[Param]) -> io::Result<bool> { match self.ti.strings.get(cmd) { - Some(cmd) => { - match expand(&cmd, params, &mut Variables::new()) { - Ok(s) => self.out.write_all(&s).and(Ok(true)), - Err(e) => Err(io::Error::new(io::ErrorKind::InvalidData, e)), - } - } + Some(cmd) => match expand(&cmd, params, &mut Variables::new()) { + Ok(s) => self.out.write_all(&s).and(Ok(true)), + Err(e) => Err(io::Error::new(io::ErrorKind::InvalidData, e)), + }, None => Ok(false), } } } - impl<T: Write> Write for TerminfoTerminal<T> { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.out.write(buf) diff --git a/src/libterm/terminfo/parm.rs b/src/libterm/terminfo/parm.rs index c7466daa2b..2e4e917891 100644 --- a/src/libterm/terminfo/parm.rs +++ b/src/libterm/terminfo/parm.rs @@ -53,16 +53,60 @@ impl Variables { pub fn new() -> Variables { Variables { sta_va: [ - Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), - Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), - Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), - Number(0), Number(0), Number(0), Number(0), Number(0) + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), ], dyn_va: [ - Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), - Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), - Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), - Number(0), Number(0), Number(0), Number(0), Number(0) + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), ], } } @@ -86,8 +130,17 @@ pub fn expand(cap: &[u8], params: &[Param], vars: &mut Variables) -> Result<Vec< let mut stack: Vec<Param> = Vec::new(); // Copy parameters into a local vector for mutability - let mut mparams = [Number(0), Number(0), Number(0), Number(0), Number(0), Number(0), - Number(0), Number(0), Number(0)]; + let mut mparams = [ + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + Number(0), + ]; for (dst, src) in mparams.iter_mut().zip(params.iter()) { *dst = (*src).clone(); } @@ -124,81 +177,67 @@ pub fn expand(cap: &[u8], params: &[Param], vars: &mut Variables) -> Result<Vec< 'g' => state = GetVar, '\'' => state = CharConstant, '{' => state = IntConstant(0), - 'l' => { - match stack.pop() { - Some(Words(s)) => stack.push(Number(s.len() as i32)), - Some(_) => return Err("a non-str was used with %l".to_string()), - None => return Err("stack is empty".to_string()), - } - } + 'l' => match stack.pop() { + Some(Words(s)) => stack.push(Number(s.len() as i32)), + Some(_) => return Err("a non-str was used with %l".to_string()), + None => return Err("stack is empty".to_string()), + }, '+' | '-' | '/' | '*' | '^' | '&' | '|' | 'm' => { match (stack.pop(), stack.pop()) { - (Some(Number(y)), Some(Number(x))) => { - stack.push(Number(match cur { - '+' => x + y, - '-' => x - y, - '*' => x * y, - '/' => x / y, - '|' => x | y, - '&' => x & y, - '^' => x ^ y, - 'm' => x % y, - _ => unreachable!("All cases handled"), - })) - } + (Some(Number(y)), Some(Number(x))) => stack.push(Number(match cur { + '+' => x + y, + '-' => x - y, + '*' => x * y, + '/' => x / y, + '|' => x | y, + '&' => x & y, + '^' => x ^ y, + 'm' => x % y, + _ => unreachable!("All cases handled"), + })), (Some(_), Some(_)) => { - return Err(format!("non-numbers on stack with {}", cur)) + return Err(format!("non-numbers on stack with {}", cur)); } _ => return Err("stack is empty".to_string()), } } - '=' | '>' | '<' | 'A' | 'O' => { - match (stack.pop(), stack.pop()) { - (Some(Number(y)), Some(Number(x))) => { - stack.push(Number(if match cur { - '=' => x == y, - '<' => x < y, - '>' => x > y, - 'A' => x > 0 && y > 0, - 'O' => x > 0 || y > 0, - _ => unreachable!(), - } { - 1 - } else { - 0 - })) - } - (Some(_), Some(_)) => { - return Err(format!("non-numbers on stack with {}", cur)) - } - _ => return Err("stack is empty".to_string()), - } - } - '!' | '~' => { - match stack.pop() { - Some(Number(x)) => { - stack.push(Number(match cur { - '!' if x > 0 => 0, - '!' => 1, - '~' => !x, - _ => unreachable!(), - })) - } - Some(_) => return Err(format!("non-numbers on stack with {}", cur)), - None => return Err("stack is empty".to_string()), + '=' | '>' | '<' | 'A' | 'O' => match (stack.pop(), stack.pop()) { + (Some(Number(y)), Some(Number(x))) => stack.push(Number( + if match cur { + '=' => x == y, + '<' => x < y, + '>' => x > y, + 'A' => x > 0 && y > 0, + 'O' => x > 0 || y > 0, + _ => unreachable!(), + } { + 1 + } else { + 0 + }, + )), + (Some(_), Some(_)) => { + return Err(format!("non-numbers on stack with {}", cur)); } - } - 'i' => { - match (&mparams[0], &mparams[1]) { - (&Number(x), &Number(y)) => { - mparams[0] = Number(x + 1); - mparams[1] = Number(y + 1); - } - _ => { - return Err("first two params not numbers with %i".to_string()) - } + _ => return Err("stack is empty".to_string()), + }, + '!' | '~' => match stack.pop() { + Some(Number(x)) => stack.push(Number(match cur { + '!' if x > 0 => 0, + '!' => 1, + '~' => !x, + _ => unreachable!(), + })), + Some(_) => return Err(format!("non-numbers on stack with {}", cur)), + None => return Err("stack is empty".to_string()), + }, + 'i' => match (&mparams[0], &mparams[1]) { + (&Number(x), &Number(y)) => { + mparams[0] = Number(x + 1); + mparams[1] = Number(y + 1); } - } + _ => return Err("first two params not numbers with %i".to_string()), + }, // printf-style support for %doxXs 'd' | 'o' | 'x' | 'X' | 's' => { @@ -229,16 +268,12 @@ pub fn expand(cap: &[u8], params: &[Param], vars: &mut Variables) -> Result<Vec< // conditionals '?' => (), - 't' => { - match stack.pop() { - Some(Number(0)) => state = SeekIfElse(0), - Some(Number(_)) => (), - Some(_) => { - return Err("non-number on stack with conditional".to_string()) - } - None => return Err("stack is empty".to_string()), - } - } + 't' => match stack.pop() { + Some(Number(0)) => state = SeekIfElse(0), + Some(Number(_)) => (), + Some(_) => return Err("non-number on stack with conditional".to_string()), + None => return Err("stack is empty".to_string()), + }, 'e' => state = SeekIfEnd(0), ';' => (), _ => return Err(format!("unrecognized format option {}", cur)), @@ -246,11 +281,13 @@ pub fn expand(cap: &[u8], params: &[Param], vars: &mut Variables) -> Result<Vec< } PushParam => { // params are 1-indexed - stack.push(mparams[match cur.to_digit(10) { - Some(d) => d as usize - 1, - None => return Err("bad param number".to_string()), - }] - .clone()); + stack.push( + mparams[match cur.to_digit(10) { + Some(d) => d as usize - 1, + None => return Err("bad param number".to_string()), + }] + .clone(), + ); } SetVar => { if cur >= 'A' && cur <= 'Z' { @@ -419,14 +456,7 @@ struct Flags { impl Flags { fn new() -> Flags { - Flags { - width: 0, - precision: 0, - alternate: false, - left: false, - sign: false, - space: false, - } + Flags { width: 0, precision: 0, alternate: false, left: false, sign: false, space: false } } } @@ -503,18 +533,16 @@ fn format(val: Param, op: FormatOp, flags: Flags) -> Result<Vec<u8>, String> { } .into_bytes() } - Words(s) => { - match op { - FormatOp::String => { - let mut s = s.into_bytes(); - if flags.precision > 0 && flags.precision < s.len() { - s.truncate(flags.precision); - } - s + Words(s) => match op { + FormatOp::String => { + let mut s = s.into_bytes(); + if flags.precision > 0 && flags.precision < s.len() { + s.truncate(flags.precision); } - _ => return Err(format!("non-string on stack with %{}", op.to_char())), + s } - } + _ => return Err(format!("non-string on stack with %{}", op.to_char())), + }, }; if flags.width > s.len() { let n = flags.width - s.len(); diff --git a/src/libterm/terminfo/parm/tests.rs b/src/libterm/terminfo/parm/tests.rs index 4d38715424..b975bd2d19 100644 --- a/src/libterm/terminfo/parm/tests.rs +++ b/src/libterm/terminfo/parm/tests.rs @@ -5,36 +5,43 @@ use std::result::Result::Ok; #[test] fn test_basic_setabf() { let s = b"\\E[48;5;%p1%dm"; - assert_eq!(expand(s, &[Number(1)], &mut Variables::new()).unwrap(), - "\\E[48;5;1m".bytes().collect::<Vec<_>>()); + assert_eq!( + expand(s, &[Number(1)], &mut Variables::new()).unwrap(), + "\\E[48;5;1m".bytes().collect::<Vec<_>>() + ); } #[test] fn test_multiple_int_constants() { - assert_eq!(expand(b"%{1}%{2}%d%d", &[], &mut Variables::new()).unwrap(), - "21".bytes().collect::<Vec<_>>()); + assert_eq!( + expand(b"%{1}%{2}%d%d", &[], &mut Variables::new()).unwrap(), + "21".bytes().collect::<Vec<_>>() + ); } #[test] fn test_op_i() { let mut vars = Variables::new(); - assert_eq!(expand(b"%p1%d%p2%d%p3%d%i%p1%d%p2%d%p3%d", - &[Number(1), Number(2), Number(3)], - &mut vars), - Ok("123233".bytes().collect::<Vec<_>>())); - assert_eq!(expand(b"%p1%d%p2%d%i%p1%d%p2%d", &[], &mut vars), - Ok("0011".bytes().collect::<Vec<_>>())); + assert_eq!( + expand(b"%p1%d%p2%d%p3%d%i%p1%d%p2%d%p3%d", &[Number(1), Number(2), Number(3)], &mut vars), + Ok("123233".bytes().collect::<Vec<_>>()) + ); + assert_eq!( + expand(b"%p1%d%p2%d%i%p1%d%p2%d", &[], &mut vars), + Ok("0011".bytes().collect::<Vec<_>>()) + ); } #[test] fn test_param_stack_failure_conditions() { let mut varstruct = Variables::new(); let vars = &mut varstruct; - fn get_res(fmt: &str, - cap: &str, - params: &[Param], - vars: &mut Variables) - -> Result<Vec<u8>, String> { + fn get_res( + fmt: &str, + cap: &str, + params: &[Param], + vars: &mut Variables, + ) -> Result<Vec<u8>, String> { let mut u8v: Vec<_> = fmt.bytes().collect(); u8v.extend(cap.as_bytes().iter().map(|&b| b)); expand(&u8v, params, vars) @@ -43,35 +50,19 @@ fn test_param_stack_failure_conditions() { let caps = ["%d", "%c", "%s", "%Pa", "%l", "%!", "%~"]; for &cap in caps.iter() { let res = get_res("", cap, &[], vars); - assert!(res.is_err(), - "Op {} succeeded incorrectly with 0 stack entries", - cap); - let p = if cap == "%s" || cap == "%l" { - Words("foo".to_string()) - } else { - Number(97) - }; + assert!(res.is_err(), "Op {} succeeded incorrectly with 0 stack entries", cap); + let p = if cap == "%s" || cap == "%l" { Words("foo".to_string()) } else { Number(97) }; let res = get_res("%p1", cap, &[p], vars); - assert!(res.is_ok(), - "Op {} failed with 1 stack entry: {}", - cap, - res.unwrap_err()); + assert!(res.is_ok(), "Op {} failed with 1 stack entry: {}", cap, res.unwrap_err()); } let caps = ["%+", "%-", "%*", "%/", "%m", "%&", "%|", "%A", "%O"]; for &cap in caps.iter() { let res = expand(cap.as_bytes(), &[], vars); - assert!(res.is_err(), - "Binop {} succeeded incorrectly with 0 stack entries", - cap); + assert!(res.is_err(), "Binop {} succeeded incorrectly with 0 stack entries", cap); let res = get_res("%{1}", cap, &[], vars); - assert!(res.is_err(), - "Binop {} succeeded incorrectly with 1 stack entry", - cap); + assert!(res.is_err(), "Binop {} succeeded incorrectly with 1 stack entry", cap); let res = get_res("%{1}%{2}", cap, &[], vars); - assert!(res.is_ok(), - "Binop {} failed with 2 stack entries: {}", - cap, - res.unwrap_err()); + assert!(res.is_ok(), "Binop {} failed with 2 stack entries: {}", cap, res.unwrap_err()); } } @@ -118,20 +109,30 @@ fn test_conditionals() { fn test_format() { let mut varstruct = Variables::new(); let vars = &mut varstruct; - assert_eq!(expand(b"%p1%s%p2%2s%p3%2s%p4%.2s", - &[Words("foo".to_string()), - Words("foo".to_string()), - Words("f".to_string()), - Words("foo".to_string())], - vars), - Ok("foofoo ffo".bytes().collect::<Vec<_>>())); - assert_eq!(expand(b"%p1%:-4.2s", &[Words("foo".to_string())], vars), - Ok("fo ".bytes().collect::<Vec<_>>())); + assert_eq!( + expand( + b"%p1%s%p2%2s%p3%2s%p4%.2s", + &[ + Words("foo".to_string()), + Words("foo".to_string()), + Words("f".to_string()), + Words("foo".to_string()) + ], + vars + ), + Ok("foofoo ffo".bytes().collect::<Vec<_>>()) + ); + assert_eq!( + expand(b"%p1%:-4.2s", &[Words("foo".to_string())], vars), + Ok("fo ".bytes().collect::<Vec<_>>()) + ); - assert_eq!(expand(b"%p1%d%p1%.3d%p1%5d%p1%:+d", &[Number(1)], vars), - Ok("1001 1+1".bytes().collect::<Vec<_>>())); - assert_eq!(expand(b"%p1%o%p1%#o%p2%6.4x%p2%#6.4X", - &[Number(15), Number(27)], - vars), - Ok("17017 001b0X001B".bytes().collect::<Vec<_>>())); + assert_eq!( + expand(b"%p1%d%p1%.3d%p1%5d%p1%:+d", &[Number(1)], vars), + Ok("1001 1+1".bytes().collect::<Vec<_>>()) + ); + assert_eq!( + expand(b"%p1%o%p1%#o%p2%6.4x%p2%#6.4X", &[Number(15), Number(27)], vars), + Ok("17017 001b0X001B".bytes().collect::<Vec<_>>()) + ); } diff --git a/src/libterm/terminfo/parser/compiled.rs b/src/libterm/terminfo/parser/compiled.rs index a8653a22f2..fbc5aebdb2 100644 --- a/src/libterm/terminfo/parser/compiled.rs +++ b/src/libterm/terminfo/parser/compiled.rs @@ -2,10 +2,10 @@ //! ncurses-compatible compiled terminfo format parsing (term(5)) +use super::super::TermInfo; use std::collections::HashMap; use std::io; use std::io::prelude::*; -use super::super::TermInfo; #[cfg(test)] mod tests; @@ -159,16 +159,16 @@ pub static stringnames: &[&str] = &[ "cbt", "_", "cr", "csr", "tbc", "clear", fn read_le_u16(r: &mut dyn io::Read) -> io::Result<u16> { let mut b = [0; 2]; - let mut amt = 0; - while amt < b.len() { - match r.read(&mut b[amt..])? { - 0 => return Err(io::Error::new(io::ErrorKind::Other, "end of file")), - n => amt += n, - } - } + r.read_exact(&mut b)?; Ok((b[0] as u16) | ((b[1] as u16) << 8)) } +fn read_le_u32(r: &mut dyn io::Read) -> io::Result<u32> { + let mut b = [0; 4]; + r.read_exact(&mut b)?; + Ok((b[0] as u32) | ((b[1] as u32) << 8) | ((b[2] as u32) << 16) | ((b[3] as u32) << 24)) +} + fn read_byte(r: &mut dyn io::Read) -> io::Result<u8> { match r.bytes().next() { Some(s) => s, @@ -194,11 +194,12 @@ pub fn parse(file: &mut dyn io::Read, longnames: bool) -> Result<TermInfo, Strin // Check magic number let magic = t!(read_le_u16(file)); - if magic != 0x011A { - return Err(format!("invalid magic number: expected {:x}, found {:x}", - 0x011A, - magic)); - } + + let extended = match magic { + 0o0432 => false, + 0o01036 => true, + _ => return Err(format!("invalid magic number, found {:o}", magic)), + }; // According to the spec, these fields must be >= -1 where -1 means that the feature is not // supported. Using 0 instead of -1 works because we skip sections with length 0. @@ -209,7 +210,7 @@ pub fn parse(file: &mut dyn io::Read, longnames: bool) -> Result<TermInfo, Strin -1 => 0, _ => return Err("incompatible file: length fields must be >= -1".to_string()), } - }} + }}; } let names_bytes = read_nonneg!(); @@ -242,9 +243,7 @@ pub fn parse(file: &mut dyn io::Read, longnames: bool) -> Result<TermInfo, Strin Err(_) => return Err("input not utf-8".to_string()), }; - let term_names: Vec<String> = names_str.split('|') - .map(|s| s.to_string()) - .collect(); + let term_names: Vec<String> = names_str.split('|').map(|s| s.to_string()).collect(); // consume NUL if t!(read_byte(file)) != b'\0' { return Err("incompatible file: missing null terminator for names section".to_string()); @@ -262,58 +261,59 @@ pub fn parse(file: &mut dyn io::Read, longnames: bool) -> Result<TermInfo, Strin t!(read_byte(file)); // compensate for padding } - let numbers_map: HashMap<String, u16> = t! { - (0..numbers_count).filter_map(|i| match read_le_u16(file) { - Ok(0xFFFF) => None, - Ok(n) => Some(Ok((nnames[i].to_string(), n))), - Err(e) => Some(Err(e)) + let numbers_map: HashMap<String, u32> = t! { + (0..numbers_count).filter_map(|i| { + let number = if extended { read_le_u32(file) } else { read_le_u16(file).map(Into::into) }; + + match number { + Ok(0xFFFF) => None, + Ok(n) => Some(Ok((nnames[i].to_string(), n))), + Err(e) => Some(Err(e)) + } }).collect() }; let string_map: HashMap<String, Vec<u8>> = if string_offsets_count > 0 { - let string_offsets: Vec<u16> = t!((0..string_offsets_count) - .map(|_| read_le_u16(file)) - .collect()); + let string_offsets: Vec<u16> = + t!((0..string_offsets_count).map(|_| read_le_u16(file)).collect()); let mut string_table = Vec::new(); t!(file.take(string_table_bytes as u64).read_to_end(&mut string_table)); - t!(string_offsets.into_iter().enumerate().filter(|&(_, offset)| { - // non-entry - offset != 0xFFFF - }).map(|(i, offset)| { - let offset = offset as usize; - - let name = if snames[i] == "_" { - stringfnames[i] - } else { - snames[i] - }; - - if offset == 0xFFFE { - // undocumented: FFFE indicates cap@, which means the capability is not present - // unsure if the handling for this is correct - return Ok((name.to_string(), Vec::new())); - } - - // Find the offset of the NUL we want to go to - let nulpos = string_table[offset..string_table_bytes].iter().position(|&b| b == 0); - match nulpos { - Some(len) => Ok((name.to_string(), string_table[offset..offset + len].to_vec())), - None => Err("invalid file: missing NUL in string_table".to_string()), - } - }).collect()) + t!(string_offsets + .into_iter() + .enumerate() + .filter(|&(_, offset)| { + // non-entry + offset != 0xFFFF + }) + .map(|(i, offset)| { + let offset = offset as usize; + + let name = if snames[i] == "_" { stringfnames[i] } else { snames[i] }; + + if offset == 0xFFFE { + // undocumented: FFFE indicates cap@, which means the capability is not present + // unsure if the handling for this is correct + return Ok((name.to_string(), Vec::new())); + } + + // Find the offset of the NUL we want to go to + let nulpos = string_table[offset..string_table_bytes].iter().position(|&b| b == 0); + match nulpos { + Some(len) => { + Ok((name.to_string(), string_table[offset..offset + len].to_vec())) + } + None => Err("invalid file: missing NUL in string_table".to_string()), + } + }) + .collect()) } else { HashMap::new() }; // And that's all there is to it - Ok(TermInfo { - names: term_names, - bools: bools_map, - numbers: numbers_map, - strings: string_map, - }) + Ok(TermInfo { names: term_names, bools: bools_map, numbers: numbers_map, strings: string_map }) } /// Creates a dummy TermInfo struct for msys terminals @@ -325,7 +325,7 @@ pub fn msys_terminfo() -> TermInfo { strings.insert("setab".to_string(), b"\x1B[4%p1%dm".to_vec()); let mut numbers = HashMap::new(); - numbers.insert("colors".to_string(), 8u16); + numbers.insert("colors".to_string(), 8); TermInfo { names: vec!["cygwin".to_string()], // msys is a fork of an older cygwin version diff --git a/src/libterm/win.rs b/src/libterm/win.rs index e5911de839..c24cf9518a 100644 --- a/src/libterm/win.rs +++ b/src/libterm/win.rs @@ -5,8 +5,8 @@ use std::io; use std::io::prelude::*; -use crate::Attr; use crate::color; +use crate::Attr; use crate::Terminal; /// A Terminal implementation that uses the Win32 Console API. @@ -73,11 +73,7 @@ fn color_to_bits(color: color::Color) -> u16 { _ => unreachable!(), }; - if color >= 8 { - bits | 0x8 - } else { - bits - } + if color >= 8 { bits | 0x8 } else { bits } } fn bits_to_color(bits: u16) -> color::Color { @@ -93,7 +89,7 @@ fn bits_to_color(bits: u16) -> color::Color { _ => unreachable!(), }; - color | (bits & 0x8) // copy the hi-intensity bit + color | (u32::from(bits) & 0x8) // copy the hi-intensity bit } impl<T: Write + Send + 'static> WinConsole<T> { @@ -105,7 +101,7 @@ impl<T: Write + Send + 'static> WinConsole<T> { unsafe { // Magic -11 means stdout, from - // http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231%28v=vs.85%29.aspx + // https://docs.microsoft.com/en-us/windows/console/getstdhandle // // You may be wondering, "but what about stderr?", and the answer // to that is that setting terminal attributes on the stdout @@ -126,11 +122,10 @@ impl<T: Write + Send + 'static> WinConsole<T> { let bg; unsafe { let mut buffer_info = MaybeUninit::<CONSOLE_SCREEN_BUFFER_INFO>::uninit(); - if GetConsoleScreenBufferInfo( - GetStdHandle(-11i32 as DWORD), - buffer_info.as_mut_ptr() - ) != 0 { - let buffer_info = buffer_info.assume_init() ; + if GetConsoleScreenBufferInfo(GetStdHandle(-11i32 as DWORD), buffer_info.as_mut_ptr()) + != 0 + { + let buffer_info = buffer_info.assume_init(); fg = bits_to_color(buffer_info.wAttributes); bg = bits_to_color(buffer_info.wAttributes >> 4); } else { @@ -217,7 +212,8 @@ impl<T: Write + Send + 'static> Terminal for WinConsole<T> { } fn into_inner(self) -> T - where Self: Sized + where + Self: Sized, { self.buf } diff --git a/src/libtest/bench.rs b/src/libtest/bench.rs index c86bfd16c2..e92e5b9829 100644 --- a/src/libtest/bench.rs +++ b/src/libtest/bench.rs @@ -2,20 +2,16 @@ pub use std::hint::black_box; use super::{ - event::CompletedTest, - helpers::sink::Sink, - options::BenchMode, - types::TestDesc, - test_result::TestResult, - Sender, + event::CompletedTest, helpers::sink::Sink, options::BenchMode, test_result::TestResult, + types::TestDesc, Sender, }; use crate::stats; -use std::time::{Duration, Instant}; use std::cmp; use std::io; use std::panic::{catch_unwind, AssertUnwindSafe}; use std::sync::{Arc, Mutex}; +use std::time::{Duration, Instant}; /// Manager of the benchmarking runs. /// @@ -73,9 +69,7 @@ pub fn fmt_bench_samples(bs: &BenchSamples) -> String { )) .unwrap(); if bs.mb_s != 0 { - output - .write_fmt(format_args!(" = {} MB/s", bs.mb_s)) - .unwrap(); + output.write_fmt(format_args!(" = {} MB/s", bs.mb_s)).unwrap(); } output } @@ -192,11 +186,7 @@ pub fn benchmark<F>(desc: TestDesc, monitor_ch: Sender<CompletedTest>, nocapture where F: FnMut(&mut Bencher), { - let mut bs = Bencher { - mode: BenchMode::Auto, - summary: None, - bytes: 0, - }; + let mut bs = Bencher { mode: BenchMode::Auto, summary: None, bytes: 0 }; let data = Arc::new(Mutex::new(Vec::new())); let oldio = if !nocapture { @@ -221,20 +211,14 @@ where let ns_iter = cmp::max(ns_iter_summ.median as u64, 1); let mb_s = bs.bytes * 1000 / ns_iter; - let bs = BenchSamples { - ns_iter_summ, - mb_s: mb_s as usize, - }; + let bs = BenchSamples { ns_iter_summ, mb_s: mb_s as usize }; TestResult::TrBench(bs) } Ok(None) => { // iter not called, so no data. // FIXME: error in this case? let samples: &mut [f64] = &mut [0.0_f64; 1]; - let bs = BenchSamples { - ns_iter_summ: stats::Summary::new(samples), - mb_s: 0, - }; + let bs = BenchSamples { ns_iter_summ: stats::Summary::new(samples), mb_s: 0 }; TestResult::TrBench(bs) } Err(_) => TestResult::TrFailed, @@ -249,10 +233,6 @@ pub fn run_once<F>(f: F) where F: FnMut(&mut Bencher), { - let mut bs = Bencher { - mode: BenchMode::Single, - summary: None, - bytes: 0, - }; + let mut bs = Bencher { mode: BenchMode::Single, summary: None, bytes: 0 }; bs.bench(f); } diff --git a/src/libtest/cli.rs b/src/libtest/cli.rs index c97cb0e060..edff8bea0f 100644 --- a/src/libtest/cli.rs +++ b/src/libtest/cli.rs @@ -1,12 +1,12 @@ //! Module converting command-line arguments into test configuration. +use getopts; use std::env; use std::path::PathBuf; -use getopts; -use super::options::{RunIgnored, ColorConfig, OutputFormat, Options}; -use super::time::TestTimeOptions; use super::helpers::isatty; +use super::options::{ColorConfig, Options, OutputFormat, RunIgnored}; +use super::time::TestTimeOptions; #[derive(Debug)] pub struct TestOpts { @@ -86,11 +86,7 @@ fn optgroups() -> getopts::Options { "Display one character per test instead of one line. \ Alias to --format=terse", ) - .optflag( - "", - "exact", - "Exactly match filters rather than by substring", - ) + .optflag("", "exact", "Exactly match filters rather than by substring") .optopt( "", "color", @@ -109,11 +105,7 @@ fn optgroups() -> getopts::Options { json = Output a json document", "pretty|terse|json", ) - .optflag( - "", - "show-output", - "Show captured stdout of successful tests" - ) + .optflag("", "show-output", "Show captured stdout of successful tests") .optopt( "Z", "", @@ -133,9 +125,11 @@ fn optgroups() -> getopts::Options { `RUST_TEST_TIME_DOCTEST` environment variables. Expected format of environment variable is `VARIABLE=WARN_TIME,CRITICAL_TIME`. + Durations must be specified in milliseconds, e.g. `500,2000` means that the warn time + is 0.5 seconds, and the critical time is 2 seconds. Not available for --format=terse", - "plain|colored" + "plain|colored", ) .optflag( "", @@ -149,7 +143,7 @@ fn optgroups() -> getopts::Options { Expected format of environment variable is `VARIABLE=WARN_TIME,CRITICAL_TIME`. `CRITICAL_TIME` here means the limit that should not be exceeded by test. - " + ", ); opts } @@ -293,8 +287,8 @@ fn is_nightly() -> bool { // Gets the CLI options assotiated with `report-time` feature. fn get_time_options( matches: &getopts::Matches, - allow_unstable: bool) --> OptPartRes<Option<TestTimeOptions>> { + allow_unstable: bool, +) -> OptPartRes<Option<TestTimeOptions>> { let report_time = unstable_optflag!(matches, allow_unstable, "report-time"); let colored_opt_str = matches.opt_str("report-time"); let mut report_time_colored = report_time && colored_opt_str == Some("colored".into()); @@ -336,7 +330,7 @@ fn get_test_threads(matches: &getopts::Matches) -> OptPartRes<Option<usize>> { fn get_format( matches: &getopts::Matches, quiet: bool, - allow_unstable: bool + allow_unstable: bool, ) -> OptPartRes<OutputFormat> { let format = match matches.opt_str("format").as_ref().map(|s| &**s) { None if quiet => OutputFormat::Terse, @@ -344,9 +338,7 @@ fn get_format( Some("terse") => OutputFormat::Terse, Some("json") => { if !allow_unstable { - return Err( - "The \"json\" format is only accepted on the nightly compiler".into(), - ); + return Err("The \"json\" format is only accepted on the nightly compiler".into()); } OutputFormat::Json } @@ -396,9 +388,7 @@ fn get_nocapture(matches: &getopts::Matches) -> OptPartRes<bool> { fn get_run_ignored(matches: &getopts::Matches, include_ignored: bool) -> OptPartRes<RunIgnored> { let run_ignored = match (include_ignored, matches.opt_present("ignored")) { (true, true) => { - return Err( - "the options --include-ignored and --ignored are mutually exclusive".into(), - ); + return Err("the options --include-ignored and --ignored are mutually exclusive".into()); } (true, false) => RunIgnored::Yes, (false, true) => RunIgnored::Only, @@ -409,11 +399,7 @@ fn get_run_ignored(matches: &getopts::Matches, include_ignored: bool) -> OptPart } fn get_filter(matches: &getopts::Matches) -> OptPartRes<Option<String>> { - let filter = if !matches.free.is_empty() { - Some(matches.free[0].clone()) - } else { - None - }; + let filter = if !matches.free.is_empty() { Some(matches.free[0].clone()) } else { None }; Ok(filter) } @@ -423,9 +409,7 @@ fn get_allow_unstable(matches: &getopts::Matches) -> OptPartRes<bool> { if let Some(opt) = matches.opt_str("Z") { if !is_nightly() { - return Err( - "the option `Z` is only accepted on the nightly compiler".into(), - ); + return Err("the option `Z` is only accepted on the nightly compiler".into()); } match &*opt { diff --git a/src/libtest/console.rs b/src/libtest/console.rs index 244cbd2cf5..ebdfb16294 100644 --- a/src/libtest/console.rs +++ b/src/libtest/console.rs @@ -1,26 +1,23 @@ //! Module providing interface for running tests in the console. use std::fs::File; -use std::io::prelude::Write; use std::io; +use std::io::prelude::Write; use term; use super::{ bench::fmt_bench_samples, cli::TestOpts, - event::{TestEvent, CompletedTest}, + event::{CompletedTest, TestEvent}, + filter_tests, formatters::{JsonFormatter, OutputFormatter, PrettyFormatter, TerseFormatter}, - helpers::{ - concurrency::get_concurrency, - metrics::MetricMap, - }, - types::{TestDesc, TestDescAndFn, NamePadding}, + helpers::{concurrency::get_concurrency, metrics::MetricMap}, options::{Options, OutputFormat}, + run_tests, test_result::TestResult, time::TestExecTime, - run_tests, - filter_tests, + types::{NamePadding, TestDesc, TestDescAndFn}, }; /// Generic wrapper over stdout. @@ -85,10 +82,7 @@ impl ConsoleTestState { }) } - pub fn write_log<F, S>( - &mut self, - msg: F, - ) -> io::Result<()> + pub fn write_log<F, S>(&mut self, msg: F) -> io::Result<()> where S: AsRef<str>, F: FnOnce() -> S, @@ -99,27 +93,31 @@ impl ConsoleTestState { let msg = msg(); let msg = msg.as_ref(); o.write_all(msg.as_bytes()) - }, + } } } - pub fn write_log_result(&mut self,test: &TestDesc, + pub fn write_log_result( + &mut self, + test: &TestDesc, result: &TestResult, exec_time: Option<&TestExecTime>, ) -> io::Result<()> { - self.write_log(|| format!( - "{} {}", - match *result { - TestResult::TrOk => "ok".to_owned(), - TestResult::TrFailed => "failed".to_owned(), - TestResult::TrFailedMsg(ref msg) => format!("failed: {}", msg), - TestResult::TrIgnored => "ignored".to_owned(), - TestResult::TrAllowedFail => "failed (allowed)".to_owned(), - TestResult::TrBench(ref bs) => fmt_bench_samples(bs), - TestResult::TrTimedFail => "failed (time limit exceeded)".to_owned(), - }, - test.name, - ))?; + self.write_log(|| { + format!( + "{} {}", + match *result { + TestResult::TrOk => "ok".to_owned(), + TestResult::TrFailed => "failed".to_owned(), + TestResult::TrFailedMsg(ref msg) => format!("failed: {}", msg), + TestResult::TrIgnored => "ignored".to_owned(), + TestResult::TrAllowedFail => "failed (allowed)".to_owned(), + TestResult::TrBench(ref bs) => fmt_bench_samples(bs), + TestResult::TrTimedFail => "failed (time limit exceeded)".to_owned(), + }, + test.name, + ) + })?; if let Some(exec_time) = exec_time { self.write_log(|| format!(" <{}>", exec_time))?; } @@ -147,10 +145,7 @@ pub fn list_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> io::Res for test in filter_tests(&opts, tests) { use crate::TestFn::*; - let TestDescAndFn { - desc: TestDesc { name, .. }, - testfn, - } = test; + let TestDescAndFn { desc: TestDesc { name, .. }, testfn } = test; let fntype = match testfn { StaticTestFn(..) | DynTestFn(..) => { @@ -179,12 +174,7 @@ pub fn list_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> io::Res writeln!(output, "")?; } - writeln!( - output, - "{}, {}", - plural(ntest, "test"), - plural(nbench, "benchmark") - )?; + writeln!(output, "{}, {}", plural(ntest, "test"), plural(nbench, "benchmark"))?; } Ok(()) @@ -282,12 +272,9 @@ pub fn run_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> io::Resu is_multithreaded, opts.time_options, )), - OutputFormat::Terse => Box::new(TerseFormatter::new( - output, - opts.use_color(), - max_name_len, - is_multithreaded, - )), + OutputFormat::Terse => { + Box::new(TerseFormatter::new(output, opts.use_color(), max_name_len, is_multithreaded)) + } OutputFormat::Json => Box::new(JsonFormatter::new(output)), }; let mut st = ConsoleTestState::new(opts)?; diff --git a/src/libtest/event.rs b/src/libtest/event.rs index eefbd2d6a8..297bb72aec 100644 --- a/src/libtest/event.rs +++ b/src/libtest/event.rs @@ -1,9 +1,9 @@ //! Module containing different events that can occur //! during tests execution process. -use super::types::TestDesc; use super::test_result::TestResult; use super::time::TestExecTime; +use super::types::TestDesc; #[derive(Debug, Clone)] pub struct CompletedTest { @@ -18,14 +18,9 @@ impl CompletedTest { desc: TestDesc, result: TestResult, exec_time: Option<TestExecTime>, - stdout: Vec<u8> + stdout: Vec<u8>, ) -> Self { - Self { - desc, - result, - exec_time, - stdout, - } + Self { desc, result, exec_time, stdout } } } diff --git a/src/libtest/formatters/json.rs b/src/libtest/formatters/json.rs index b73d734967..863cad9f9d 100644 --- a/src/libtest/formatters/json.rs +++ b/src/libtest/formatters/json.rs @@ -1,16 +1,12 @@ -use std::{ - io, - io::prelude::Write, - borrow::Cow, -}; +use std::{borrow::Cow, io, io::prelude::Write}; +use super::OutputFormatter; use crate::{ - types::TestDesc, - time, - test_result::TestResult, console::{ConsoleTestState, OutputLocation}, + test_result::TestResult, + time, + types::TestDesc, }; -use super::OutputFormatter; pub(crate) struct JsonFormatter<T> { out: OutputLocation<T>, @@ -48,22 +44,13 @@ impl<T: Write> JsonFormatter<T> { ty, name, evt ))?; if let Some(exec_time) = exec_time { - self.write_message(&*format!( - r#", "exec_time": "{}""#, - exec_time - ))?; + self.write_message(&*format!(r#", "exec_time": "{}""#, exec_time))?; } if let Some(stdout) = stdout { - self.write_message(&*format!( - r#", "stdout": "{}""#, - EscapedString(stdout) - ))?; + self.write_message(&*format!(r#", "stdout": "{}""#, EscapedString(stdout)))?; } if let Some(extra) = extra { - self.write_message(&*format!( - r#", {}"#, - extra - ))?; + self.write_message(&*format!(r#", {}"#, extra))?; } self.writeln_message(" }") } diff --git a/src/libtest/formatters/mod.rs b/src/libtest/formatters/mod.rs index b6649a3eff..a64c0fc263 100644 --- a/src/libtest/formatters/mod.rs +++ b/src/libtest/formatters/mod.rs @@ -1,21 +1,18 @@ -use std::{ - io, - io::prelude::Write, -}; +use std::{io, io::prelude::Write}; use crate::{ - types::{TestDesc, TestName}, - time, + console::ConsoleTestState, test_result::TestResult, - console::{ConsoleTestState}, + time, + types::{TestDesc, TestName}, }; -mod pretty; mod json; +mod pretty; mod terse; -pub(crate) use self::pretty::PrettyFormatter; pub(crate) use self::json::JsonFormatter; +pub(crate) use self::pretty::PrettyFormatter; pub(crate) use self::terse::TerseFormatter; pub(crate) trait OutputFormatter { diff --git a/src/libtest/formatters/pretty.rs b/src/libtest/formatters/pretty.rs index 2fdbc63d51..4a93e084df 100644 --- a/src/libtest/formatters/pretty.rs +++ b/src/libtest/formatters/pretty.rs @@ -1,16 +1,13 @@ -use std::{ - io, - io::prelude::Write, -}; +use std::{io, io::prelude::Write}; +use super::OutputFormatter; use crate::{ - types::TestDesc, - time, - test_result::TestResult, - console::{ConsoleTestState, OutputLocation}, bench::fmt_bench_samples, + console::{ConsoleTestState, OutputLocation}, + test_result::TestResult, + time, + types::TestDesc, }; -use super::OutputFormatter; pub(crate) struct PrettyFormatter<T> { out: OutputLocation<T>, @@ -31,13 +28,7 @@ impl<T: Write> PrettyFormatter<T> { is_multithreaded: bool, time_options: Option<time::TestTimeOptions>, ) -> Self { - PrettyFormatter { - out, - use_color, - max_name_len, - is_multithreaded, - time_options - } + PrettyFormatter { out, use_color, max_name_len, is_multithreaded, time_options } } #[cfg(test)] @@ -105,7 +96,7 @@ impl<T: Write> PrettyFormatter<T> { fn write_time( &mut self, desc: &TestDesc, - exec_time: Option<&time::TestExecTime> + exec_time: Option<&time::TestExecTime>, ) -> io::Result<()> { if let (Some(opts), Some(time)) = (self.time_options, exec_time) { let time_str = format!(" <{}>", time); @@ -124,7 +115,7 @@ impl<T: Write> PrettyFormatter<T> { match color { Some(color) => self.write_pretty(&time_str, color)?, - None => self.write_plain(&time_str)? + None => self.write_plain(&time_str)?, } } @@ -134,7 +125,7 @@ impl<T: Write> PrettyFormatter<T> { fn write_results( &mut self, inputs: &Vec<(TestDesc, Vec<u8>)>, - results_type: &str + results_type: &str, ) -> io::Result<()> { let results_out_str = format!("\n{}:\n", results_type); @@ -237,7 +228,8 @@ impl<T: Write> OutputFormatter for PrettyFormatter<T> { self.write_plain(&format!( "test {} has been running for over {} seconds\n", - desc.name, time::TEST_WARN_TIMEOUT_S + desc.name, + time::TEST_WARN_TIMEOUT_S )) } diff --git a/src/libtest/formatters/terse.rs b/src/libtest/formatters/terse.rs index fe56157d9c..5a264d2005 100644 --- a/src/libtest/formatters/terse.rs +++ b/src/libtest/formatters/terse.rs @@ -1,17 +1,14 @@ -use std::{ - io, - io::prelude::Write, -}; +use std::{io, io::prelude::Write}; +use super::OutputFormatter; use crate::{ - types::TestDesc, - time, + bench::fmt_bench_samples, + console::{ConsoleTestState, OutputLocation}, test_result::TestResult, + time, types::NamePadding, - console::{ConsoleTestState, OutputLocation}, - bench::fmt_bench_samples, + types::TestDesc, }; -use super::OutputFormatter; // insert a '\n' after 100 tests in quiet mode const QUIET_MODE_MAX_COLUMN: usize = 100; @@ -74,7 +71,7 @@ impl<T: Write> TerseFormatter<T> { // we insert a new line every 100 dots in order to flush the // screen when dealing with line-buffered output (e.g., piping to // `stamp` in the rust CI). - let out = format!(" {}/{}\n", self.test_count+1, self.total_test_count); + let out = format!(" {}/{}\n", self.test_count + 1, self.total_test_count); self.write_plain(&out)?; } @@ -196,9 +193,9 @@ impl<T: Write> OutputFormatter for TerseFormatter<T> { ) -> io::Result<()> { match *result { TestResult::TrOk => self.write_ok(), - TestResult::TrFailed - | TestResult::TrFailedMsg(_) - | TestResult::TrTimedFail => self.write_failed(), + TestResult::TrFailed | TestResult::TrFailedMsg(_) | TestResult::TrTimedFail => { + self.write_failed() + } TestResult::TrIgnored => self.write_ignored(), TestResult::TrAllowedFail => self.write_allowed_fail(), TestResult::TrBench(ref bs) => { @@ -214,7 +211,8 @@ impl<T: Write> OutputFormatter for TerseFormatter<T> { fn write_timeout(&mut self, desc: &TestDesc) -> io::Result<()> { self.write_plain(&format!( "test {} has been running for over {} seconds\n", - desc.name, time::TEST_WARN_TIMEOUT_S + desc.name, + time::TEST_WARN_TIMEOUT_S )) } diff --git a/src/libtest/helpers/exit_code.rs b/src/libtest/helpers/exit_code.rs index 831bef3b11..31e234d981 100644 --- a/src/libtest/helpers/exit_code.rs +++ b/src/libtest/helpers/exit_code.rs @@ -15,6 +15,6 @@ pub fn get_exit_code(status: ExitStatus) -> Result<i32, String> { None => match status.signal() { Some(signal) => Err(format!("child process exited with signal {}", signal)), None => Err("child process exited with unknown signal".into()), - } + }, } } diff --git a/src/libtest/helpers/isatty.rs b/src/libtest/helpers/isatty.rs index 4955e1fc88..831094f754 100644 --- a/src/libtest/helpers/isatty.rs +++ b/src/libtest/helpers/isatty.rs @@ -2,7 +2,8 @@ //! if stdout is a tty. #[cfg(any( - target_os = "cloudabi", target_os = "hermit", + target_os = "cloudabi", + target_os = "hermit", all(target_arch = "wasm32", not(target_os = "emscripten")), all(target_vendor = "fortanix", target_env = "sgx") ))] diff --git a/src/libtest/helpers/mod.rs b/src/libtest/helpers/mod.rs index 6a2ef6086c..eb416b1015 100644 --- a/src/libtest/helpers/mod.rs +++ b/src/libtest/helpers/mod.rs @@ -2,7 +2,7 @@ //! but used in `libtest`. pub mod concurrency; +pub mod exit_code; pub mod isatty; pub mod metrics; pub mod sink; -pub mod exit_code; diff --git a/src/libtest/lib.rs b/src/libtest/lib.rs index 0097558eae..e99473177e 100644 --- a/src/libtest/lib.rs +++ b/src/libtest/lib.rs @@ -32,34 +32,35 @@ #![feature(test)] // Public reexports -pub use self::ColorConfig::*; -pub use self::types::*; -pub use self::types::TestName::*; -pub use self::options::{ColorConfig, Options, OutputFormat, RunIgnored, ShouldPanic}; -pub use self::bench::{Bencher, black_box}; +pub use self::bench::{black_box, Bencher}; pub use self::console::run_tests_console; +pub use self::options::{ColorConfig, Options, OutputFormat, RunIgnored, ShouldPanic}; +pub use self::types::TestName::*; +pub use self::types::*; +pub use self::ColorConfig::*; pub use cli::TestOpts; // Module to be used by rustc to compile tests in libtest pub mod test { pub use crate::{ + assert_test_result, bench::Bencher, cli::{parse_opts, TestOpts}, + filter_tests, helpers::metrics::{Metric, MetricMap}, - options::{ShouldPanic, Options, RunIgnored, RunStrategy}, + options::{Options, RunIgnored, RunStrategy, ShouldPanic}, + run_test, test_main, test_main_static, test_result::{TestResult, TrFailed, TrFailedMsg, TrIgnored, TrOk}, - time::{TestTimeOptions, TestExecTime}, + time::{TestExecTime, TestTimeOptions}, types::{ - DynTestFn, DynTestName, StaticBenchFn, StaticTestFn, StaticTestName, - TestDesc, TestDescAndFn, TestName, TestType, + DynTestFn, DynTestName, StaticBenchFn, StaticTestFn, StaticTestName, TestDesc, + TestDescAndFn, TestName, TestType, }, - assert_test_result, filter_tests, run_test, test_main, test_main_static, }; } use std::{ - env, - io, + env, io, io::prelude::Write, panic::{self, catch_unwind, AssertUnwindSafe, PanicInfo}, process, @@ -70,28 +71,28 @@ use std::{ time::{Duration, Instant}, }; -pub mod stats; pub mod bench; -mod formatters; mod cli; mod console; mod event; +mod formatters; mod helpers; -mod time; -mod types; mod options; +pub mod stats; mod test_result; +mod time; +mod types; #[cfg(test)] mod tests; -use test_result::*; -use time::TestExecTime; -use options::{RunStrategy, Concurrent}; use event::{CompletedTest, TestEvent}; -use helpers::sink::Sink; use helpers::concurrency::get_concurrency; use helpers::exit_code::get_exit_code; +use helpers::sink::Sink; +use options::{Concurrent, RunStrategy}; +use test_result::*; +use time::TestExecTime; // Process exit code to be used to indicate test failures. const ERROR_EXIT_CODE: i32 = 101; @@ -152,12 +153,13 @@ pub fn test_main_static_abort(tests: &[&TestDescAndFn]) { // If we're being run in SpawnedSecondary mode, run the test here. run_test // will then exit the process. if let Ok(name) = env::var(SECONDARY_TEST_INVOKER_VAR) { + env::remove_var(SECONDARY_TEST_INVOKER_VAR); let test = tests .iter() .filter(|test| test.desc.name.as_slice() == name) .map(make_owned_test) .next() - .expect("couldn't find a test with the provided name"); + .expect(&format!("couldn't find a test with the provided name '{}'", name)); let TestDescAndFn { desc, testfn } = test; let testfn = match testfn { StaticTestFn(f) => f, @@ -177,14 +179,8 @@ pub fn test_main_static_abort(tests: &[&TestDescAndFn]) { /// This will panic when fed any dynamic tests, because they cannot be cloned. fn make_owned_test(test: &&TestDescAndFn) -> TestDescAndFn { match test.testfn { - StaticTestFn(f) => TestDescAndFn { - testfn: StaticTestFn(f), - desc: test.desc.clone(), - }, - StaticBenchFn(f) => TestDescAndFn { - testfn: StaticBenchFn(f), - desc: test.desc.clone(), - }, + StaticTestFn(f) => TestDescAndFn { testfn: StaticTestFn(f), desc: test.desc.clone() }, + StaticBenchFn(f) => TestDescAndFn { testfn: StaticBenchFn(f), desc: test.desc.clone() }, _ => panic!("non-static tests passed to test::test_main_static"), } } @@ -205,7 +201,7 @@ pub fn assert_test_result<T: Termination>(result: T) { pub fn run_tests<F>( opts: &TestOpts, tests: Vec<TestDescAndFn>, - mut notify_about_test_event: F + mut notify_about_test_event: F, ) -> io::Result<()> where F: FnMut(TestEvent) -> io::Result<()>, @@ -267,13 +263,7 @@ where let now = Instant::now(); let timed_out = running_tests .iter() - .filter_map(|(desc, timeout)| { - if &now >= timeout { - Some(desc.clone()) - } else { - None - } - }) + .filter_map(|(desc, timeout)| if &now >= timeout { Some(desc.clone()) } else { None }) .collect(); for test in &timed_out { running_tests.remove(test); @@ -284,11 +274,7 @@ where fn calc_timeout(running_tests: &TestMap) -> Option<Duration> { running_tests.values().min().map(|next_timeout| { let now = Instant::now(); - if *next_timeout >= now { - *next_timeout - now - } else { - Duration::new(0, 0) - } + if *next_timeout >= now { *next_timeout - now } else { Duration::new(0, 0) } }) }; @@ -391,15 +377,11 @@ pub fn filter_tests(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> Vec<TestDescA // maybe unignore tests match opts.run_ignored { RunIgnored::Yes => { - filtered - .iter_mut() - .for_each(|test| test.desc.ignore = false); + filtered.iter_mut().for_each(|test| test.desc.ignore = false); } RunIgnored::Only => { filtered.retain(|test| test.desc.ignore); - filtered - .iter_mut() - .for_each(|test| test.desc.ignore = false); + filtered.iter_mut().for_each(|test| test.desc.ignore = false); } RunIgnored::No => {} } @@ -424,10 +406,7 @@ pub fn convert_benchmarks_to_tests(tests: Vec<TestDescAndFn>) -> Vec<TestDescAnd })), f => f, }; - TestDescAndFn { - desc: x.desc, - testfn, - } + TestDescAndFn { desc: x.desc, testfn } }) .collect() } @@ -444,7 +423,8 @@ pub fn run_test( // Emscripten can catch panics but other wasm targets cannot let ignore_because_no_process_support = desc.should_panic != ShouldPanic::No - && cfg!(target_arch = "wasm32") && !cfg!(target_os = "emscripten"); + && cfg!(target_arch = "wasm32") + && !cfg!(target_os = "emscripten"); if force_ignore || desc.ignore || ignore_because_no_process_support { let message = CompletedTest::new(desc, TrIgnored, None, Vec::new()); @@ -468,19 +448,17 @@ pub fn run_test( let concurrency = opts.concurrency; let name = desc.name.clone(); - let runtest = move || { - match opts.strategy { - RunStrategy::InProcess => - run_test_in_process( - desc, - opts.nocapture, - opts.time.is_some(), - testfn, - monitor_ch, - opts.time - ), - RunStrategy::SpawnPrimary => - spawn_test_subprocess(desc, opts.time.is_some(), monitor_ch, opts.time), + let runtest = move || match opts.strategy { + RunStrategy::InProcess => run_test_in_process( + desc, + opts.nocapture, + opts.time.is_some(), + testfn, + monitor_ch, + opts.time, + ), + RunStrategy::SpawnPrimary => { + spawn_test_subprocess(desc, opts.time.is_some(), monitor_ch, opts.time) } }; @@ -496,12 +474,8 @@ pub fn run_test( } } - let test_run_opts = TestRunOpts { - strategy, - nocapture: opts.nocapture, - concurrency, - time: opts.time_options - }; + let test_run_opts = + TestRunOpts { strategy, nocapture: opts.nocapture, concurrency, time: opts.time_options }; match testfn { DynBenchFn(bencher) => { @@ -512,9 +486,7 @@ pub fn run_test( } StaticBenchFn(benchfn) => { // Benchmarks aren't expected to panic, so we run them all in-process. - crate::bench::benchmark(desc, monitor_ch, opts.nocapture, |harness| { - (benchfn.clone())(harness) - }); + crate::bench::benchmark(desc, monitor_ch, opts.nocapture, benchfn); } DynTestFn(f) => { match strategy { @@ -580,7 +552,7 @@ fn run_test_in_process( Err(e) => calc_result(&desc, Err(e.as_ref()), &time_opts, &exec_time), }; let stdout = data.lock().unwrap().to_vec(); - let message = CompletedTest::new(desc.clone(), test_result, exec_time, stdout); + let message = CompletedTest::new(desc, test_result, exec_time, stdout); monitor_ch.send(message).unwrap(); } @@ -597,13 +569,14 @@ fn spawn_test_subprocess( let start = report_time.then(Instant::now); let output = match Command::new(current_exe) .env(SECONDARY_TEST_INVOKER_VAR, desc.name.as_slice()) - .output() { - Ok(out) => out, - Err(e) => { - let err = format!("Failed to spawn {} as child for test: {:?}", args[0], e); - return (TrFailed, err.into_bytes(), None); - } - }; + .output() + { + Ok(out) => out, + Err(e) => { + let err = format!("Failed to spawn {} as child for test: {:?}", args[0], e); + return (TrFailed, err.into_bytes(), None); + } + }; let exec_time = start.map(|start| { let duration = start.elapsed(); TestExecTime(duration) @@ -628,14 +601,11 @@ fn spawn_test_subprocess( (result, test_output, exec_time) })(); - let message = CompletedTest::new(desc.clone(), result, exec_time, test_output); + let message = CompletedTest::new(desc, result, exec_time, test_output); monitor_ch.send(message).unwrap(); } -fn run_test_in_spawned_subprocess( - desc: TestDesc, - testfn: Box<dyn FnOnce() + Send>, -) -> ! { +fn run_test_in_spawned_subprocess(desc: TestDesc, testfn: Box<dyn FnOnce() + Send>) -> ! { let builtin_panic_hook = panic::take_hook(); let record_result = Arc::new(move |panic_info: Option<&'_ PanicInfo<'_>>| { let test_result = match panic_info { diff --git a/src/libtest/options.rs b/src/libtest/options.rs index ec87b0fcd4..7db164c269 100644 --- a/src/libtest/options.rs +++ b/src/libtest/options.rs @@ -72,10 +72,7 @@ pub struct Options { impl Options { pub fn new() -> Options { - Options { - display_output: false, - panic_abort: false, - } + Options { display_output: false, panic_abort: false } } pub fn display_output(mut self, display_output: bool) -> Options { diff --git a/src/libtest/stats/tests.rs b/src/libtest/stats/tests.rs index eaf41bc9e2..5bfd1d3885 100644 --- a/src/libtest/stats/tests.rs +++ b/src/libtest/stats/tests.rs @@ -1,22 +1,17 @@ use super::*; extern crate test; +use self::test::test::Bencher; use std::f64; -use std::io::prelude::*; use std::io; -use self::test::test::Bencher; +use std::io::prelude::*; // Test vectors generated from R, using the script src/etc/stat-test-vectors.r. macro_rules! assert_approx_eq { ($a: expr, $b: expr) => {{ let (a, b) = (&$a, &$b); - assert!( - (*a - *b).abs() < 1.0e-6, - "{} is not approximately equal to {}", - *a, - *b - ); + assert!((*a - *b).abs() < 1.0e-6, "{} is not approximately equal to {}", *a, *b); }}; } diff --git a/src/libtest/test_result.rs b/src/libtest/test_result.rs index bfabe1722d..bfa572c887 100644 --- a/src/libtest/test_result.rs +++ b/src/libtest/test_result.rs @@ -1,9 +1,9 @@ use std::any::Any; use super::bench::BenchSamples; +use super::options::ShouldPanic; use super::time; use super::types::TestDesc; -use super::options::ShouldPanic; pub use self::TestResult::*; @@ -32,7 +32,7 @@ pub fn calc_result<'a>( desc: &TestDesc, task_result: Result<(), &'a (dyn Any + 'static + Send)>, time_opts: &Option<time::TestTimeOptions>, - exec_time: &Option<time::TestExecTime> + exec_time: &Option<time::TestExecTime>, ) -> TestResult { let result = match (&desc.should_panic, task_result) { (&ShouldPanic::No, Ok(())) | (&ShouldPanic::Yes, Err(_)) => TestResult::TrOk, diff --git a/src/libtest/tests.rs b/src/libtest/tests.rs index 0bea2b80ec..85a0705f69 100644 --- a/src/libtest/tests.rs +++ b/src/libtest/tests.rs @@ -3,17 +3,29 @@ use super::*; use crate::{ bench::Bencher, console::OutputLocation, - options::OutputFormat, - time::{TimeThreshold, TestTimeOptions}, formatters::PrettyFormatter, + options::OutputFormat, test::{ - filter_tests, parse_opts, run_test, DynTestFn, DynTestName, MetricMap, - RunIgnored, RunStrategy, ShouldPanic, StaticTestName, TestDesc, - TestDescAndFn, TestOpts, TrIgnored, TrOk, + filter_tests, + parse_opts, + run_test, + DynTestFn, + DynTestName, + MetricMap, + RunIgnored, + RunStrategy, + ShouldPanic, + StaticTestName, + TestDesc, + TestDescAndFn, + TestOpts, + TrIgnored, + TrOk, // FIXME (introduced by #65251) // ShouldPanic, StaticTestName, TestDesc, TestDescAndFn, TestOpts, TestTimeOptions, // TestType, TrFailedMsg, TrIgnored, TrOk, }, + time::{TestTimeOptions, TimeThreshold}, }; use std::any::TypeId; use std::sync::mpsc::channel; @@ -190,9 +202,12 @@ fn test_should_panic_non_string_message_type() { panic!(1i32); } let expected = "foobar"; - let failed_msg = format!(r#"expected panic with string value, + let failed_msg = format!( + r#"expected panic with string value, found non-string value: `{:?}` - expected substring: `"foobar"`"#, TypeId::of::<i32>()); + expected substring: `"foobar"`"#, + TypeId::of::<i32>() + ); let desc = TestDescAndFn { desc: TestDesc { name: StaticTestName("whatever"), @@ -242,16 +257,9 @@ fn report_time_test_template(report_time: bool) -> Option<TestExecTime> { }, testfn: DynTestFn(Box::new(f)), }; - let time_options = if report_time { - Some(TestTimeOptions::default()) - } else { - None - }; + let time_options = if report_time { Some(TestTimeOptions::default()) } else { None }; - let test_opts = TestOpts { - time_options, - ..TestOpts::new() - }; + let test_opts = TestOpts { time_options, ..TestOpts::new() }; let (tx, rx) = channel(); run_test(&test_opts, false, desc, RunStrategy::InProcess, tx, Concurrent::No); let exec_time = rx.recv().unwrap().exec_time; @@ -278,7 +286,7 @@ fn time_test_failure_template(test_type: TestType) -> TestResult { ignore: false, should_panic: ShouldPanic::No, allow_fail: false, - test_type + test_type, }, testfn: DynTestFn(Box::new(f)), }; @@ -286,10 +294,7 @@ fn time_test_failure_template(test_type: TestType) -> TestResult { let mut time_options = TestTimeOptions::default(); time_options.error_on_excess = true; - let test_opts = TestOpts { - time_options: Some(time_options), - ..TestOpts::new() - }; + let test_opts = TestOpts { time_options: Some(time_options), ..TestOpts::new() }; let (tx, rx) = channel(); run_test(&test_opts, false, desc, RunStrategy::InProcess, tx, Concurrent::No); let result = rx.recv().unwrap().result; @@ -318,7 +323,7 @@ fn typed_test_desc(test_type: TestType) -> TestDesc { ignore: false, should_panic: ShouldPanic::No, allow_fail: false, - test_type + test_type, } } @@ -363,22 +368,14 @@ fn test_time_options_threshold() { #[test] fn parse_ignored_flag() { - let args = vec![ - "progname".to_string(), - "filter".to_string(), - "--ignored".to_string(), - ]; + let args = vec!["progname".to_string(), "filter".to_string(), "--ignored".to_string()]; let opts = parse_opts(&args).unwrap().unwrap(); assert_eq!(opts.run_ignored, RunIgnored::Only); } #[test] fn parse_show_output_flag() { - let args = vec![ - "progname".to_string(), - "filter".to_string(), - "--show-output".to_string(), - ]; + let args = vec!["progname".to_string(), "filter".to_string(), "--show-output".to_string()]; let opts = parse_opts(&args).unwrap().unwrap(); assert!(opts.options.display_output); } @@ -471,78 +468,41 @@ pub fn exact_filter_match() { .collect() } - let substr = filter_tests( - &TestOpts { - filter: Some("base".into()), - ..TestOpts::new() - }, - tests(), - ); + let substr = + filter_tests(&TestOpts { filter: Some("base".into()), ..TestOpts::new() }, tests()); assert_eq!(substr.len(), 4); - let substr = filter_tests( - &TestOpts { - filter: Some("bas".into()), - ..TestOpts::new() - }, - tests(), - ); + let substr = filter_tests(&TestOpts { filter: Some("bas".into()), ..TestOpts::new() }, tests()); assert_eq!(substr.len(), 4); - let substr = filter_tests( - &TestOpts { - filter: Some("::test".into()), - ..TestOpts::new() - }, - tests(), - ); + let substr = + filter_tests(&TestOpts { filter: Some("::test".into()), ..TestOpts::new() }, tests()); assert_eq!(substr.len(), 3); - let substr = filter_tests( - &TestOpts { - filter: Some("base::test".into()), - ..TestOpts::new() - }, - tests(), - ); + let substr = + filter_tests(&TestOpts { filter: Some("base::test".into()), ..TestOpts::new() }, tests()); assert_eq!(substr.len(), 3); let exact = filter_tests( - &TestOpts { - filter: Some("base".into()), - filter_exact: true, - ..TestOpts::new() - }, + &TestOpts { filter: Some("base".into()), filter_exact: true, ..TestOpts::new() }, tests(), ); assert_eq!(exact.len(), 1); let exact = filter_tests( - &TestOpts { - filter: Some("bas".into()), - filter_exact: true, - ..TestOpts::new() - }, + &TestOpts { filter: Some("bas".into()), filter_exact: true, ..TestOpts::new() }, tests(), ); assert_eq!(exact.len(), 0); let exact = filter_tests( - &TestOpts { - filter: Some("::test".into()), - filter_exact: true, - ..TestOpts::new() - }, + &TestOpts { filter: Some("::test".into()), filter_exact: true, ..TestOpts::new() }, tests(), ); assert_eq!(exact.len(), 0); let exact = filter_tests( - &TestOpts { - filter: Some("base::test".into()), - filter_exact: true, - ..TestOpts::new() - }, + &TestOpts { filter: Some("base::test".into()), filter_exact: true, ..TestOpts::new() }, tests(), ); assert_eq!(exact.len(), 1); diff --git a/src/libtest/time.rs b/src/libtest/time.rs index f4d4b17b62..96c090f9b0 100644 --- a/src/libtest/time.rs +++ b/src/libtest/time.rs @@ -4,10 +4,10 @@ //! - Check whether test is timed out. //! - Provide helpers for `report-time` and `measure-time` options. -use std::time::{Duration, Instant}; -use std::str::FromStr; -use std::fmt; use std::env; +use std::fmt; +use std::str::FromStr; +use std::time::{Duration, Instant}; use super::types::{TestDesc, TestType}; @@ -23,8 +23,8 @@ pub const TEST_WARN_TIMEOUT_S: u64 = 60; /// Example of the expected format is `RUST_TEST_TIME_xxx=100,200`, where 100 means /// warn time, and 200 means critical time. pub mod time_constants { - use std::time::Duration; use super::TEST_WARN_TIMEOUT_S; + use std::time::Duration; /// Environment variable for overriding default threshold for unit-tests. pub const UNIT_ENV_NAME: &str = "RUST_TEST_TIME_UNIT"; @@ -80,10 +80,7 @@ pub struct TimeThreshold { impl TimeThreshold { /// Creates a new `TimeThreshold` instance with provided durations. pub fn new(warn: Duration, critical: Duration) -> Self { - Self { - warn, - critical, - } + Self { warn, critical } } /// Attempts to create a `TimeThreshold` instance with values obtained @@ -99,16 +96,14 @@ impl TimeThreshold { let durations_str = env::var(env_var_name).ok()?; // Split string into 2 substrings by comma and try to parse numbers. - let mut durations = durations_str - .splitn(2, ',') - .map(|v| { - u64::from_str(v).unwrap_or_else(|_| { - panic!( - "Duration value in variable {} is expected to be a number, but got {}", - env_var_name, v - ) - }) - }); + let mut durations = durations_str.splitn(2, ',').map(|v| { + u64::from_str(v).unwrap_or_else(|_| { + panic!( + "Duration value in variable {} is expected to be a number, but got {}", + env_var_name, v + ) + }) + }); // Callback to be called if the environment variable has unexpected structure. let panic_on_incorrect_value = || { @@ -120,7 +115,7 @@ impl TimeThreshold { let (warn, critical) = ( durations.next().unwrap_or_else(panic_on_incorrect_value), - durations.next().unwrap_or_else(panic_on_incorrect_value) + durations.next().unwrap_or_else(panic_on_incorrect_value), ); if warn > critical { @@ -145,25 +140,17 @@ pub struct TestTimeOptions { impl TestTimeOptions { pub fn new_from_env(error_on_excess: bool, colored: bool) -> Self { - let unit_threshold = - TimeThreshold::from_env_var(time_constants::UNIT_ENV_NAME) - .unwrap_or_else(Self::default_unit); + let unit_threshold = TimeThreshold::from_env_var(time_constants::UNIT_ENV_NAME) + .unwrap_or_else(Self::default_unit); let integration_threshold = TimeThreshold::from_env_var(time_constants::INTEGRATION_ENV_NAME) .unwrap_or_else(Self::default_integration); - let doctest_threshold = - TimeThreshold::from_env_var(time_constants::DOCTEST_ENV_NAME) - .unwrap_or_else(Self::default_doctest); + let doctest_threshold = TimeThreshold::from_env_var(time_constants::DOCTEST_ENV_NAME) + .unwrap_or_else(Self::default_doctest); - Self { - error_on_excess, - colored, - unit_threshold, - integration_threshold, - doctest_threshold, - } + Self { error_on_excess, colored, unit_threshold, integration_threshold, doctest_threshold } } pub fn is_warn(&self, test: &TestDesc, exec_time: &TestExecTime) -> bool { diff --git a/src/libtest/types.rs b/src/libtest/types.rs index 89bcf2cf28..2619f99592 100644 --- a/src/libtest/types.rs +++ b/src/libtest/types.rs @@ -1,14 +1,14 @@ //! Common types used by `libtest`. -use std::fmt; use std::borrow::Cow; +use std::fmt; -use super::options; use super::bench::Bencher; +use super::options; pub use NamePadding::*; -pub use TestName::*; pub use TestFn::*; +pub use TestName::*; /// Type of the test according to the [rust book](https://doc.rust-lang.org/cargo/guide/tests.html) /// conventions. diff --git a/src/libunwind/build.rs b/src/libunwind/build.rs index b8db16f8f2..a24808b325 100644 --- a/src/libunwind/build.rs +++ b/src/libunwind/build.rs @@ -4,9 +4,9 @@ fn main() { println!("cargo:rerun-if-changed=build.rs"); let target = env::var("TARGET").expect("TARGET was not set"); - if cfg!(feature = "llvm-libunwind") && - ((target.contains("linux") && !target.contains("musl")) || - target.contains("fuchsia")) { + if cfg!(feature = "llvm-libunwind") + && ((target.contains("linux") && !target.contains("musl")) || target.contains("fuchsia")) + { // Build the unwinding from libunwind C/C++ source code. llvm_libunwind::compile(); } else if target.contains("linux") { diff --git a/src/libunwind/lib.rs b/src/libunwind/lib.rs index 8d91644712..18d41be773 100644 --- a/src/libunwind/lib.rs +++ b/src/libunwind/lib.rs @@ -1,12 +1,10 @@ #![no_std] #![unstable(feature = "panic_unwind", issue = "32837")] - #![feature(link_cfg)] #![feature(nll)] #![feature(staged_api)] #![feature(unwind_attributes)] #![feature(static_nobundle)] - #![cfg_attr(not(target_env = "msvc"), feature(libc))] cfg_if::cfg_if! { @@ -23,9 +21,9 @@ cfg_if::cfg_if! { #[cfg(target_env = "musl")] #[link(name = "unwind", kind = "static", cfg(target_feature = "crt-static"))] #[link(name = "gcc_s", cfg(not(target_feature = "crt-static")))] -extern {} +extern "C" {} #[cfg(target_os = "redox")] #[link(name = "gcc_eh", kind = "static-nobundle", cfg(target_feature = "crt-static"))] #[link(name = "gcc_s", cfg(not(target_feature = "crt-static")))] -extern {} +extern "C" {} diff --git a/src/libunwind/libunwind.rs b/src/libunwind/libunwind.rs index 0b39503c0d..0c57861f70 100644 --- a/src/libunwind/libunwind.rs +++ b/src/libunwind/libunwind.rs @@ -21,8 +21,9 @@ pub use _Unwind_Reason_Code::*; pub type _Unwind_Exception_Class = u64; pub type _Unwind_Word = uintptr_t; pub type _Unwind_Ptr = uintptr_t; -pub type _Unwind_Trace_Fn = extern "C" fn(ctx: *mut _Unwind_Context, arg: *mut c_void) - -> _Unwind_Reason_Code; +pub type _Unwind_Trace_Fn = + extern "C" fn(ctx: *mut _Unwind_Context, arg: *mut c_void) -> _Unwind_Reason_Code; + #[cfg(target_arch = "x86")] pub const unwinder_private_data_size: usize = 5; @@ -53,6 +54,9 @@ pub const unwinder_private_data_size: usize = 2; #[cfg(target_arch = "sparc64")] pub const unwinder_private_data_size: usize = 2; +#[cfg(target_arch = "riscv64")] +pub const unwinder_private_data_size: usize = 2; + #[cfg(target_os = "emscripten")] pub const unwinder_private_data_size: usize = 20; @@ -68,11 +72,12 @@ pub struct _Unwind_Exception { pub enum _Unwind_Context {} -pub type _Unwind_Exception_Cleanup_Fn = extern "C" fn(unwind_code: _Unwind_Reason_Code, - exception: *mut _Unwind_Exception); -#[cfg_attr(all(feature = "llvm-libunwind", - any(target_os = "fuchsia", target_os = "linux")), - link(name = "unwind", kind = "static"))] +pub type _Unwind_Exception_Cleanup_Fn = + extern "C" fn(unwind_code: _Unwind_Reason_Code, exception: *mut _Unwind_Exception); +#[cfg_attr( + all(feature = "llvm-libunwind", any(target_os = "fuchsia", target_os = "linux")), + link(name = "unwind", kind = "static") +)] extern "C" { #[unwind(allowed)] pub fn _Unwind_Resume(exception: *mut _Unwind_Exception) -> !; @@ -151,6 +156,7 @@ if #[cfg(all(any(target_os = "ios", target_os = "netbsd", not(target_arch = "arm use _Unwind_VRS_DataRepresentation::*; pub const UNWIND_POINTER_REG: c_int = 12; + pub const UNWIND_SP_REG: c_int = 13; pub const UNWIND_IP_REG: c_int = 15; #[cfg_attr(all(feature = "llvm-libunwind", diff --git a/src/rtstartup/rsbegin.rs b/src/rtstartup/rsbegin.rs index 52ec601fed..f92ff9f071 100644 --- a/src/rtstartup/rsbegin.rs +++ b/src/rtstartup/rsbegin.rs @@ -68,18 +68,12 @@ pub mod eh_frames { unsafe fn init() { // register unwind info on module startup - rust_eh_register_frames( - &__EH_FRAME_BEGIN__ as *const u8, - &mut OBJ as *mut _ as *mut u8, - ); + rust_eh_register_frames(&__EH_FRAME_BEGIN__ as *const u8, &mut OBJ as *mut _ as *mut u8); } unsafe fn uninit() { // unregister on shutdown - rust_eh_unregister_frames( - &__EH_FRAME_BEGIN__ as *const u8, - &mut OBJ as *mut _ as *mut u8, - ); + rust_eh_unregister_frames(&__EH_FRAME_BEGIN__ as *const u8, &mut OBJ as *mut _ as *mut u8); } // MSVC-specific init/uninit routine registration diff --git a/src/rtstartup/rsend.rs b/src/rtstartup/rsend.rs index 4023c2fe23..333761cd97 100644 --- a/src/rtstartup/rsend.rs +++ b/src/rtstartup/rsend.rs @@ -1,7 +1,7 @@ // See rsbegin.rs for details. #![feature(no_core, lang_items, optin_builtin_traits)] -#![crate_type="rlib"] +#![crate_type = "rlib"] #![no_core] #[lang = "sized"] @@ -21,7 +21,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) { drop_in_place(to_drop); } -#[cfg(all(target_os="windows", target_arch = "x86", target_env="gnu"))] +#[cfg(all(target_os = "windows", target_arch = "x86", target_env = "gnu"))] pub mod eh_frames { // Terminate the frame unwind info section with a 0 as a sentinel; // this would be the 'length' field in a real FDE. diff --git a/src/rustc/Cargo.toml b/src/rustc/Cargo.toml index 86a93d7d0c..5e0f167bb3 100644 --- a/src/rustc/Cargo.toml +++ b/src/rustc/Cargo.toml @@ -9,7 +9,6 @@ name = "rustc_binary" path = "rustc.rs" [dependencies] -rustc_target = { path = "../librustc_target" } rustc_driver = { path = "../librustc_driver" } # Make sure rustc_codegen_ssa ends up in the sysroot, because this diff --git a/src/rustc/rustc.rs b/src/rustc/rustc.rs index 4a1786f89e..6bc5aa6382 100644 --- a/src/rustc/rustc.rs +++ b/src/rustc/rustc.rs @@ -9,26 +9,21 @@ fn main() { // object code in the rustc executable). #[cfg(feature = "jemalloc-sys")] { - use std::os::raw::{c_void, c_int}; + use std::os::raw::{c_int, c_void}; #[used] - static _F1: unsafe extern fn(usize, usize) -> *mut c_void = - jemalloc_sys::calloc; + static _F1: unsafe extern "C" fn(usize, usize) -> *mut c_void = jemalloc_sys::calloc; #[used] - static _F2: unsafe extern fn(*mut *mut c_void, usize, usize) -> c_int = + static _F2: unsafe extern "C" fn(*mut *mut c_void, usize, usize) -> c_int = jemalloc_sys::posix_memalign; #[used] - static _F3: unsafe extern fn(usize, usize) -> *mut c_void = - jemalloc_sys::aligned_alloc; + static _F3: unsafe extern "C" fn(usize, usize) -> *mut c_void = jemalloc_sys::aligned_alloc; #[used] - static _F4: unsafe extern fn(usize) -> *mut c_void = - jemalloc_sys::malloc; + static _F4: unsafe extern "C" fn(usize) -> *mut c_void = jemalloc_sys::malloc; #[used] - static _F5: unsafe extern fn(*mut c_void, usize) -> *mut c_void = - jemalloc_sys::realloc; + static _F5: unsafe extern "C" fn(*mut c_void, usize) -> *mut c_void = jemalloc_sys::realloc; #[used] - static _F6: unsafe extern fn(*mut c_void) = - jemalloc_sys::free; + static _F6: unsafe extern "C" fn(*mut c_void) = jemalloc_sys::free; } rustc_driver::set_sigpipe_handler(); diff --git a/src/rustllvm/ArchiveWrapper.cpp b/src/rustllvm/ArchiveWrapper.cpp index dd0111d3f2..678d787571 100644 --- a/src/rustllvm/ArchiveWrapper.cpp +++ b/src/rustllvm/ArchiveWrapper.cpp @@ -89,7 +89,11 @@ extern "C" void LLVMRustDestroyArchive(LLVMRustArchiveRef RustArchive) { extern "C" LLVMRustArchiveIteratorRef LLVMRustArchiveIteratorNew(LLVMRustArchiveRef RustArchive) { Archive *Archive = RustArchive->getBinary(); +#if LLVM_VERSION_GE(10, 0) + std::unique_ptr<Error> Err = std::make_unique<Error>(Error::success()); +#else std::unique_ptr<Error> Err = llvm::make_unique<Error>(Error::success()); +#endif auto Cur = Archive->child_begin(*Err); if (*Err) { LLVMRustSetLastError(toString(std::move(*Err)).c_str()); diff --git a/src/rustllvm/Linker.cpp b/src/rustllvm/Linker.cpp index 7916721943..69176f9cb1 100644 --- a/src/rustllvm/Linker.cpp +++ b/src/rustllvm/Linker.cpp @@ -18,8 +18,7 @@ extern "C" RustLinker* LLVMRustLinkerNew(LLVMModuleRef DstRef) { Module *Dst = unwrap(DstRef); - auto Ret = llvm::make_unique<RustLinker>(*Dst); - return Ret.release(); + return new RustLinker(*Dst); } extern "C" void diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 6698e5d58b..eaa845a279 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -8,6 +8,7 @@ #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" +#include "llvm/InitializePasses.h" #include "llvm/IR/AutoUpgrade.h" #include "llvm/IR/AssemblyAnnotationWriter.h" #include "llvm/IR/IntrinsicInst.h" @@ -532,6 +533,18 @@ enum class LLVMRustFileType { ObjectFile, }; +#if LLVM_VERSION_GE(10, 0) +static CodeGenFileType fromRust(LLVMRustFileType Type) { + switch (Type) { + case LLVMRustFileType::AssemblyFile: + return CGFT_AssemblyFile; + case LLVMRustFileType::ObjectFile: + return CGFT_ObjectFile; + default: + report_fatal_error("Bad FileType."); + } +} +#else static TargetMachine::CodeGenFileType fromRust(LLVMRustFileType Type) { switch (Type) { case LLVMRustFileType::AssemblyFile: @@ -542,6 +555,7 @@ static TargetMachine::CodeGenFileType fromRust(LLVMRustFileType Type) { report_fatal_error("Bad FileType."); } } +#endif extern "C" LLVMRustResult LLVMRustWriteOutputFile(LLVMTargetMachineRef Target, LLVMPassManagerRef PMR, @@ -849,7 +863,11 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules, int num_modules, const char **preserved_symbols, int num_symbols) { +#if LLVM_VERSION_GE(10, 0) + auto Ret = std::make_unique<LLVMRustThinLTOData>(); +#else auto Ret = llvm::make_unique<LLVMRustThinLTOData>(); +#endif // Load each module's summary and merge it into one combined index for (int i = 0; i < num_modules; i++) { @@ -944,6 +962,15 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules, ExportedGUIDs.insert(GUID); } } +#if LLVM_VERSION_GE(10, 0) + auto isExported = [&](StringRef ModuleIdentifier, ValueInfo VI) { + const auto &ExportList = Ret->ExportLists.find(ModuleIdentifier); + return (ExportList != Ret->ExportLists.end() && + ExportList->second.count(VI)) || + ExportedGUIDs.count(VI.getGUID()); + }; + thinLTOInternalizeAndPromoteInIndex(Ret->Index, isExported, isPrevailing); +#else auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) { const auto &ExportList = Ret->ExportLists.find(ModuleIdentifier); return (ExportList != Ret->ExportLists.end() && @@ -951,6 +978,7 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules, ExportedGUIDs.count(GUID); }; thinLTOInternalizeAndPromoteInIndex(Ret->Index, isExported); +#endif return Ret.release(); } @@ -1081,7 +1109,11 @@ struct LLVMRustThinLTOBuffer { extern "C" LLVMRustThinLTOBuffer* LLVMRustThinLTOBufferCreate(LLVMModuleRef M) { +#if LLVM_VERSION_GE(10, 0) + auto Ret = std::make_unique<LLVMRustThinLTOBuffer>(); +#else auto Ret = llvm::make_unique<LLVMRustThinLTOBuffer>(); +#endif { raw_string_ostream OS(Ret->data); { diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 720928e48e..46e467011b 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -496,9 +496,11 @@ static DINode::DIFlags fromRust(LLVMRustDIFlags Flags) { if (isSet(Flags & LLVMRustDIFlags::FlagAppleBlock)) { Result |= DINode::DIFlags::FlagAppleBlock; } +#if LLVM_VERSION_LT(10, 0) if (isSet(Flags & LLVMRustDIFlags::FlagBlockByrefStruct)) { Result |= DINode::DIFlags::FlagBlockByrefStruct; } +#endif if (isSet(Flags & LLVMRustDIFlags::FlagVirtual)) { Result |= DINode::DIFlags::FlagVirtual; } @@ -825,6 +827,9 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateStaticVariable( llvm::DIGlobalVariableExpression *VarExpr = Builder->createGlobalVariableExpression( unwrapDI<DIDescriptor>(Context), Name, LinkageName, unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), IsLocalToUnit, +#if LLVM_VERSION_GE(10, 0) + /* isDefined */ true, +#endif InitExpr, unwrapDIPtr<MDNode>(Decl), #if LLVM_VERSION_GE(8, 0) /* templateParams */ nullptr, @@ -998,11 +1003,19 @@ inline section_iterator *unwrap(LLVMSectionIteratorRef SI) { extern "C" size_t LLVMRustGetSectionName(LLVMSectionIteratorRef SI, const char **Ptr) { +#if LLVM_VERSION_GE(10, 0) + auto NameOrErr = (*unwrap(SI))->getName(); + if (!NameOrErr) + report_fatal_error(NameOrErr.takeError()); + *Ptr = NameOrErr->data(); + return NameOrErr->size(); +#else StringRef Ret; if (std::error_code EC = (*unwrap(SI))->getName(Ret)) report_fatal_error(EC.message()); *Ptr = Ret.data(); return Ret.size(); +#endif } // LLVMArrayType function does not support 64-bit ElementCount @@ -1253,20 +1266,34 @@ extern "C" LLVMValueRef LLVMRustBuildMemCpy(LLVMBuilderRef B, LLVMValueRef Dst, unsigned DstAlign, LLVMValueRef Src, unsigned SrcAlign, LLVMValueRef Size, bool IsVolatile) { +#if LLVM_VERSION_GE(10, 0) + return wrap(unwrap(B)->CreateMemCpy( + unwrap(Dst), MaybeAlign(DstAlign), + unwrap(Src), MaybeAlign(SrcAlign), + unwrap(Size), IsVolatile)); +#else return wrap(unwrap(B)->CreateMemCpy( unwrap(Dst), DstAlign, unwrap(Src), SrcAlign, unwrap(Size), IsVolatile)); +#endif } extern "C" LLVMValueRef LLVMRustBuildMemMove(LLVMBuilderRef B, LLVMValueRef Dst, unsigned DstAlign, LLVMValueRef Src, unsigned SrcAlign, LLVMValueRef Size, bool IsVolatile) { +#if LLVM_VERSION_GE(10, 0) + return wrap(unwrap(B)->CreateMemMove( + unwrap(Dst), MaybeAlign(DstAlign), + unwrap(Src), MaybeAlign(SrcAlign), + unwrap(Size), IsVolatile)); +#else return wrap(unwrap(B)->CreateMemMove( unwrap(Dst), DstAlign, unwrap(Src), SrcAlign, unwrap(Size), IsVolatile)); +#endif } extern "C" LLVMValueRef @@ -1450,7 +1477,11 @@ struct LLVMRustModuleBuffer { extern "C" LLVMRustModuleBuffer* LLVMRustModuleBufferCreate(LLVMModuleRef M) { +#if LLVM_VERSION_GE(10, 0) + auto Ret = std::make_unique<LLVMRustModuleBuffer>(); +#else auto Ret = llvm::make_unique<LLVMRustModuleBuffer>(); +#endif { raw_string_ostream OS(Ret->data); { diff --git a/src/stage0.txt b/src/stage0.txt index eb812a0c08..f25838ea82 100644 --- a/src/stage0.txt +++ b/src/stage0.txt @@ -12,9 +12,14 @@ # source tarball for a stable release you'll likely see `1.x.0` for rustc and # `0.x.0` for Cargo where they were released on `date`. -date: 2019-12-19 -rustc: 1.40.0 -cargo: 0.41.0 +date: 2020-02-27 +rustc: 1.41.1 +cargo: 0.42.0 + +# We use a nightly rustfmt to format the source because it solves some bootstrapping +# issues with use of new syntax in this repo. If you're looking at the beta/stable branch, this key should be omitted, +# as we don't want to depend on rustfmt from nightly there. +#rustfmt: nightly-2019-12-18 # When making a stable release the process currently looks like: # diff --git a/src/test/codegen-units/item-collection/drop_in_place_intrinsic.rs b/src/test/codegen-units/item-collection/drop_in_place_intrinsic.rs index d5ddfb5e1c..27fb3cb138 100644 --- a/src/test/codegen-units/item-collection/drop_in_place_intrinsic.rs +++ b/src/test/codegen-units/item-collection/drop_in_place_intrinsic.rs @@ -4,7 +4,7 @@ #![feature(start)] -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<drop_in_place_intrinsic::StructWithDtor[0]> @@ drop_in_place_intrinsic-cgu.0[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<drop_in_place_intrinsic::StructWithDtor[0]> @@ drop_in_place_intrinsic-cgu.0[Internal] struct StructWithDtor(u32); impl Drop for StructWithDtor { @@ -16,7 +16,7 @@ impl Drop for StructWithDtor { #[start] fn start(_: isize, _: *const *const u8) -> isize { - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<[drop_in_place_intrinsic::StructWithDtor[0]; 2]> @@ drop_in_place_intrinsic-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<[drop_in_place_intrinsic::StructWithDtor[0]; 2]> @@ drop_in_place_intrinsic-cgu.0[Internal] let x = [StructWithDtor(0), StructWithDtor(1)]; drop_slice_in_place(&x); @@ -31,7 +31,6 @@ fn drop_slice_in_place(x: &[StructWithDtor]) { // not have drop-glue for the unsized [StructWithDtor]. This has to be // generated though when the drop_in_place() intrinsic is used. //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<[drop_in_place_intrinsic::StructWithDtor[0]]> @@ drop_in_place_intrinsic-cgu.0[Internal] - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<[drop_in_place_intrinsic::StructWithDtor[0]]> @@ drop_in_place_intrinsic-cgu.0[Internal] ::std::ptr::drop_in_place(x as *const _ as *mut [StructWithDtor]); } } diff --git a/src/test/codegen-units/item-collection/generic-drop-glue.rs b/src/test/codegen-units/item-collection/generic-drop-glue.rs index 94e79f0b32..675bdfdb4d 100644 --- a/src/test/codegen-units/item-collection/generic-drop-glue.rs +++ b/src/test/codegen-units/item-collection/generic-drop-glue.rs @@ -37,7 +37,7 @@ enum EnumNoDrop<T1, T2> { struct NonGenericNoDrop(i32); struct NonGenericWithDrop(i32); -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<generic_drop_glue::NonGenericWithDrop[0]> @@ generic_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<generic_drop_glue::NonGenericWithDrop[0]> @@ generic_drop_glue-cgu.0[Internal] impl Drop for NonGenericWithDrop { //~ MONO_ITEM fn generic_drop_glue::{{impl}}[2]::drop[0] @@ -47,11 +47,11 @@ impl Drop for NonGenericWithDrop { //~ MONO_ITEM fn generic_drop_glue::start[0] #[start] fn start(_: isize, _: *const *const u8) -> isize { - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<generic_drop_glue::StructWithDrop[0]<i8, char>> @@ generic_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<generic_drop_glue::StructWithDrop[0]<i8, char>> @@ generic_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn generic_drop_glue::{{impl}}[0]::drop[0]<i8, char> let _ = StructWithDrop { x: 0i8, y: 'a' }.x; - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<generic_drop_glue::StructWithDrop[0]<&str, generic_drop_glue::NonGenericNoDrop[0]>> @@ generic_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<generic_drop_glue::StructWithDrop[0]<&str, generic_drop_glue::NonGenericNoDrop[0]>> @@ generic_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn generic_drop_glue::{{impl}}[0]::drop[0]<&str, generic_drop_glue::NonGenericNoDrop[0]> let _ = StructWithDrop { x: "&str", y: NonGenericNoDrop(0) }.y; @@ -60,17 +60,17 @@ fn start(_: isize, _: *const *const u8) -> isize { // This is supposed to generate drop-glue because it contains a field that // needs to be dropped. - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<generic_drop_glue::StructNoDrop[0]<generic_drop_glue::NonGenericWithDrop[0], f64>> @@ generic_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<generic_drop_glue::StructNoDrop[0]<generic_drop_glue::NonGenericWithDrop[0], f64>> @@ generic_drop_glue-cgu.0[Internal] let _ = StructNoDrop { x: NonGenericWithDrop(0), y: 0f64 }.y; - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<generic_drop_glue::EnumWithDrop[0]<i32, i64>> @@ generic_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<generic_drop_glue::EnumWithDrop[0]<i32, i64>> @@ generic_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn generic_drop_glue::{{impl}}[1]::drop[0]<i32, i64> let _ = match EnumWithDrop::A::<i32, i64>(0) { EnumWithDrop::A(x) => x, EnumWithDrop::B(x) => x as i32 }; - //~MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<generic_drop_glue::EnumWithDrop[0]<f64, f32>> @@ generic_drop_glue-cgu.0[Internal] + //~MONO_ITEM fn core::ptr[0]::drop_in_place[0]<generic_drop_glue::EnumWithDrop[0]<f64, f32>> @@ generic_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn generic_drop_glue::{{impl}}[1]::drop[0]<f64, f32> let _ = match EnumWithDrop::B::<f64, f32>(1.0) { EnumWithDrop::A(x) => x, diff --git a/src/test/codegen-units/item-collection/instantiation-through-vtable.rs b/src/test/codegen-units/item-collection/instantiation-through-vtable.rs index e79b069b25..db0390b58c 100644 --- a/src/test/codegen-units/item-collection/instantiation-through-vtable.rs +++ b/src/test/codegen-units/item-collection/instantiation-through-vtable.rs @@ -24,13 +24,13 @@ impl<T> Trait for Struct<T> { fn start(_: isize, _: *const *const u8) -> isize { let s1 = Struct { _a: 0u32 }; - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<instantiation_through_vtable::Struct[0]<u32>> @@ instantiation_through_vtable-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<instantiation_through_vtable::Struct[0]<u32>> @@ instantiation_through_vtable-cgu.0[Internal] //~ MONO_ITEM fn instantiation_through_vtable::{{impl}}[0]::foo[0]<u32> //~ MONO_ITEM fn instantiation_through_vtable::{{impl}}[0]::bar[0]<u32> let _ = &s1 as &Trait; let s1 = Struct { _a: 0u64 }; - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<instantiation_through_vtable::Struct[0]<u64>> @@ instantiation_through_vtable-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<instantiation_through_vtable::Struct[0]<u64>> @@ instantiation_through_vtable-cgu.0[Internal] //~ MONO_ITEM fn instantiation_through_vtable::{{impl}}[0]::foo[0]<u64> //~ MONO_ITEM fn instantiation_through_vtable::{{impl}}[0]::bar[0]<u64> let _ = &s1 as &Trait; diff --git a/src/test/codegen-units/item-collection/non-generic-drop-glue.rs b/src/test/codegen-units/item-collection/non-generic-drop-glue.rs index f13952bb78..a899b8b2c8 100644 --- a/src/test/codegen-units/item-collection/non-generic-drop-glue.rs +++ b/src/test/codegen-units/item-collection/non-generic-drop-glue.rs @@ -5,7 +5,7 @@ #![deny(dead_code)] #![feature(start)] -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<non_generic_drop_glue::StructWithDrop[0]> @@ non_generic_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<non_generic_drop_glue::StructWithDrop[0]> @@ non_generic_drop_glue-cgu.0[Internal] struct StructWithDrop { x: i32 } @@ -19,7 +19,7 @@ struct StructNoDrop { x: i32 } -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<non_generic_drop_glue::EnumWithDrop[0]> @@ non_generic_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<non_generic_drop_glue::EnumWithDrop[0]> @@ non_generic_drop_glue-cgu.0[Internal] enum EnumWithDrop { A(i32) } diff --git a/src/test/codegen-units/item-collection/transitive-drop-glue.rs b/src/test/codegen-units/item-collection/transitive-drop-glue.rs index 14545a33b5..7e29af4353 100644 --- a/src/test/codegen-units/item-collection/transitive-drop-glue.rs +++ b/src/test/codegen-units/item-collection/transitive-drop-glue.rs @@ -5,11 +5,11 @@ #![deny(dead_code)] #![feature(start)] -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<transitive_drop_glue::Root[0]> @@ transitive_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<transitive_drop_glue::Root[0]> @@ transitive_drop_glue-cgu.0[Internal] struct Root(Intermediate); -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<transitive_drop_glue::Intermediate[0]> @@ transitive_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<transitive_drop_glue::Intermediate[0]> @@ transitive_drop_glue-cgu.0[Internal] struct Intermediate(Leaf); -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<transitive_drop_glue::Leaf[0]> @@ transitive_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<transitive_drop_glue::Leaf[0]> @@ transitive_drop_glue-cgu.0[Internal] struct Leaf; impl Drop for Leaf { @@ -30,15 +30,15 @@ impl<T> Drop for LeafGen<T> { fn start(_: isize, _: *const *const u8) -> isize { let _ = Root(Intermediate(Leaf)); - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<transitive_drop_glue::RootGen[0]<u32>> @@ transitive_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<transitive_drop_glue::IntermediateGen[0]<u32>> @@ transitive_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<transitive_drop_glue::LeafGen[0]<u32>> @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<transitive_drop_glue::RootGen[0]<u32>> @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<transitive_drop_glue::IntermediateGen[0]<u32>> @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<transitive_drop_glue::LeafGen[0]<u32>> @@ transitive_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn transitive_drop_glue::{{impl}}[1]::drop[0]<u32> let _ = RootGen(IntermediateGen(LeafGen(0u32))); - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<transitive_drop_glue::RootGen[0]<i16>> @@ transitive_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<transitive_drop_glue::IntermediateGen[0]<i16>> @@ transitive_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<transitive_drop_glue::LeafGen[0]<i16>> @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<transitive_drop_glue::RootGen[0]<i16>> @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<transitive_drop_glue::IntermediateGen[0]<i16>> @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<transitive_drop_glue::LeafGen[0]<i16>> @@ transitive_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn transitive_drop_glue::{{impl}}[1]::drop[0]<i16> let _ = RootGen(IntermediateGen(LeafGen(0i16))); diff --git a/src/test/codegen-units/item-collection/tuple-drop-glue.rs b/src/test/codegen-units/item-collection/tuple-drop-glue.rs index 54aff575f9..d77de53ce0 100644 --- a/src/test/codegen-units/item-collection/tuple-drop-glue.rs +++ b/src/test/codegen-units/item-collection/tuple-drop-glue.rs @@ -5,7 +5,7 @@ #![deny(dead_code)] #![feature(start)] -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<tuple_drop_glue::Dropped[0]> @@ tuple_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<tuple_drop_glue::Dropped[0]> @@ tuple_drop_glue-cgu.0[Internal] struct Dropped; impl Drop for Dropped { @@ -16,11 +16,11 @@ impl Drop for Dropped { //~ MONO_ITEM fn tuple_drop_glue::start[0] #[start] fn start(_: isize, _: *const *const u8) -> isize { - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<(u32, tuple_drop_glue::Dropped[0])> @@ tuple_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<(u32, tuple_drop_glue::Dropped[0])> @@ tuple_drop_glue-cgu.0[Internal] let x = (0u32, Dropped); - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<(i16, (tuple_drop_glue::Dropped[0], bool))> @@ tuple_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<(tuple_drop_glue::Dropped[0], bool)> @@ tuple_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<(i16, (tuple_drop_glue::Dropped[0], bool))> @@ tuple_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<(tuple_drop_glue::Dropped[0], bool)> @@ tuple_drop_glue-cgu.0[Internal] let x = (0i16, (Dropped, true)); 0 diff --git a/src/test/codegen-units/item-collection/unsizing.rs b/src/test/codegen-units/item-collection/unsizing.rs index fd794df376..1ed60dcf26 100644 --- a/src/test/codegen-units/item-collection/unsizing.rs +++ b/src/test/codegen-units/item-collection/unsizing.rs @@ -48,13 +48,13 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Wrapper<U>> for Wrapper<T> fn start(_: isize, _: *const *const u8) -> isize { // simple case let bool_sized = &true; - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<bool> @@ unsizing-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<bool> @@ unsizing-cgu.0[Internal] //~ MONO_ITEM fn unsizing::{{impl}}[0]::foo[0] let _bool_unsized = bool_sized as &Trait; let char_sized = &'a'; - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<char> @@ unsizing-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<char> @@ unsizing-cgu.0[Internal] //~ MONO_ITEM fn unsizing::{{impl}}[1]::foo[0] let _char_unsized = char_sized as &Trait; @@ -64,13 +64,13 @@ fn start(_: isize, _: *const *const u8) -> isize { _b: 2, _c: 3.0f64 }; - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<f64> @@ unsizing-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<f64> @@ unsizing-cgu.0[Internal] //~ MONO_ITEM fn unsizing::{{impl}}[2]::foo[0] let _struct_unsized = struct_sized as &Struct<Trait>; // custom coercion let wrapper_sized = Wrapper(&0u32); - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<u32> @@ unsizing-cgu.0[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<u32> @@ unsizing-cgu.0[Internal] //~ MONO_ITEM fn unsizing::{{impl}}[3]::foo[0] let _wrapper_sized = wrapper_sized as Wrapper<Trait>; diff --git a/src/test/codegen-units/partitioning/auxiliary/shared_generics_aux.rs b/src/test/codegen-units/partitioning/auxiliary/shared_generics_aux.rs index 9050e8f167..ffbd0dc548 100644 --- a/src/test/codegen-units/partitioning/auxiliary/shared_generics_aux.rs +++ b/src/test/codegen-units/partitioning/auxiliary/shared_generics_aux.rs @@ -1,4 +1,6 @@ -// compile-flags:-Zshare-generics=yes +// NOTE: We always compile this test with -Copt-level=0 because higher opt-levels +// prevent drop-glue from participating in share-generics. +// compile-flags:-Zshare-generics=yes -Copt-level=0 // no-prefer-dynamic #![crate_type="rlib"] @@ -8,5 +10,17 @@ pub fn generic_fn<T>(x: T, y: T) -> (T, T) { } pub fn use_generic_fn_f32() -> (f32, f32) { + // This line causes drop glue for Foo to be instantiated. We want to make + // sure that this crate exports an instance to be re-used by share-generics. + let _ = Foo(0); + generic_fn(0.0f32, 1.0f32) } + +pub struct Foo(pub u32); + +impl Drop for Foo { + fn drop(&mut self) { + println!("foo"); + } +} diff --git a/src/test/codegen-units/partitioning/extern-drop-glue.rs b/src/test/codegen-units/partitioning/extern-drop-glue.rs index 0f3d72d16a..f85ae0c077 100644 --- a/src/test/codegen-units/partitioning/extern-drop-glue.rs +++ b/src/test/codegen-units/partitioning/extern-drop-glue.rs @@ -11,14 +11,14 @@ // aux-build:cgu_extern_drop_glue.rs extern crate cgu_extern_drop_glue; -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<cgu_extern_drop_glue::Struct[0]> @@ extern_drop_glue[Internal] extern_drop_glue-mod1[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<cgu_extern_drop_glue::Struct[0]> @@ extern_drop_glue[Internal] extern_drop_glue-mod1[Internal] struct LocalStruct(cgu_extern_drop_glue::Struct); //~ MONO_ITEM fn extern_drop_glue::user[0] @@ extern_drop_glue[External] pub fn user() { - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<extern_drop_glue::LocalStruct[0]> @@ extern_drop_glue[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<extern_drop_glue::LocalStruct[0]> @@ extern_drop_glue[Internal] let _ = LocalStruct(cgu_extern_drop_glue::Struct(0)); } @@ -30,7 +30,7 @@ pub mod mod1 { //~ MONO_ITEM fn extern_drop_glue::mod1[0]::user[0] @@ extern_drop_glue-mod1[External] pub fn user() { - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<extern_drop_glue::mod1[0]::LocalStruct[0]> @@ extern_drop_glue-mod1[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<extern_drop_glue::mod1[0]::LocalStruct[0]> @@ extern_drop_glue-mod1[Internal] let _ = LocalStruct(cgu_extern_drop_glue::Struct(0)); } } diff --git a/src/test/codegen-units/partitioning/local-drop-glue.rs b/src/test/codegen-units/partitioning/local-drop-glue.rs index 938d4ffb69..366af4d4c3 100644 --- a/src/test/codegen-units/partitioning/local-drop-glue.rs +++ b/src/test/codegen-units/partitioning/local-drop-glue.rs @@ -7,7 +7,7 @@ #![allow(dead_code)] #![crate_type="rlib"] -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<local_drop_glue::Struct[0]> @@ local_drop_glue[Internal] local_drop_glue-mod1[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<local_drop_glue::Struct[0]> @@ local_drop_glue[Internal] local_drop_glue-mod1[Internal] struct Struct { _a: u32 } @@ -17,7 +17,7 @@ impl Drop for Struct { fn drop(&mut self) {} } -//~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<local_drop_glue::Outer[0]> @@ local_drop_glue[Internal] +//~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<local_drop_glue::Outer[0]> @@ local_drop_glue[Internal] struct Outer { _a: Struct } @@ -36,10 +36,10 @@ pub mod mod1 { use super::Struct; - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<local_drop_glue::mod1[0]::Struct2[0]> @@ local_drop_glue-mod1[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<local_drop_glue::mod1[0]::Struct2[0]> @@ local_drop_glue-mod1[Internal] struct Struct2 { _a: Struct, - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<(u32, local_drop_glue::Struct[0])> @@ local_drop_glue-mod1[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<(u32, local_drop_glue::Struct[0])> @@ local_drop_glue-mod1[Internal] _b: (u32, Struct), } diff --git a/src/test/codegen-units/partitioning/shared-generics.rs b/src/test/codegen-units/partitioning/shared-generics.rs index 58e485be00..47ff94437f 100644 --- a/src/test/codegen-units/partitioning/shared-generics.rs +++ b/src/test/codegen-units/partitioning/shared-generics.rs @@ -1,6 +1,8 @@ // ignore-tidy-linelength // no-prefer-dynamic -// compile-flags:-Zprint-mono-items=eager -Zshare-generics=yes -Zincremental=tmp/partitioning-tests/shared-generics-exe +// NOTE: We always compile this test with -Copt-level=0 because higher opt-levels +// prevent drop-glue from participating in share-generics. +// compile-flags:-Zprint-mono-items=eager -Zshare-generics=yes -Zincremental=tmp/partitioning-tests/shared-generics-exe -Copt-level=0 #![crate_type="rlib"] @@ -16,6 +18,10 @@ pub fn foo() { // This should not generate a monomorphization because it's already // available in `shared_generics_aux`. let _ = shared_generics_aux::generic_fn(0.0f32, 3.0f32); -} -// MONO_ITEM drop-glue i8 + // The following line will drop an instance of `Foo`, generating a call to + // Foo's drop-glue function. However, share-generics should take care of + // reusing the drop-glue from the upstream crate, so we do not expect a + // mono item for the drop-glue + let _ = shared_generics_aux::Foo(1); +} diff --git a/src/test/codegen-units/partitioning/vtable-through-const.rs b/src/test/codegen-units/partitioning/vtable-through-const.rs index 5d23a4e13c..06e2ef6bb2 100644 --- a/src/test/codegen-units/partitioning/vtable-through-const.rs +++ b/src/test/codegen-units/partitioning/vtable-through-const.rs @@ -66,7 +66,7 @@ mod mod1 { //~ MONO_ITEM fn vtable_through_const::start[0] #[start] fn start(_: isize, _: *const *const u8) -> isize { - //~ MONO_ITEM fn core::ptr[0]::real_drop_in_place[0]<u32> @@ vtable_through_const[Internal] + //~ MONO_ITEM fn core::ptr[0]::drop_in_place[0]<u32> @@ vtable_through_const[Internal] // Since Trait1::do_something() is instantiated via its default implementation, // it is considered a generic and is instantiated here only because it is diff --git a/src/test/codegen/abi-main-signature-32bit-c-int.rs b/src/test/codegen/abi-main-signature-32bit-c-int.rs index c7aab09ede..a7a4520ff9 100644 --- a/src/test/codegen/abi-main-signature-32bit-c-int.rs +++ b/src/test/codegen/abi-main-signature-32bit-c-int.rs @@ -7,4 +7,4 @@ fn main() { } -// CHECK: define i32 @main(i32, i8**) +// CHECK: define i32 @main(i32{{( %0)?}}, i8**{{( %1)?}}) diff --git a/src/test/codegen/bool-cmp.rs b/src/test/codegen/bool-cmp.rs index 8769a4cb5e..5090f7c378 100644 --- a/src/test/codegen/bool-cmp.rs +++ b/src/test/codegen/bool-cmp.rs @@ -10,8 +10,9 @@ use std::cmp::Ordering; // CHECK-LABEL: @cmp_bool #[no_mangle] pub fn cmp_bool(a: bool, b: bool) -> Ordering { +// LLVM 10 produces (zext a) + (sext b), but the final lowering is (zext a) - (zext b). // CHECK: zext i1 -// CHECK: zext i1 -// CHECK: sub nsw +// CHECK: {{z|s}}ext i1 +// CHECK: {{sub|add}} nsw a.cmp(&b) } diff --git a/src/test/codegen/consts.rs b/src/test/codegen/consts.rs index 7d65ad1435..a89ecdfd3a 100644 --- a/src/test/codegen/consts.rs +++ b/src/test/codegen/consts.rs @@ -14,10 +14,9 @@ // This checks the constants from {low,high}_align_const, they share the same // constant, but the alignment differs, so the higher one should be used -// CHECK: [[LOW_HIGH:@[0-9]+]] = {{.*}}, align 4 +// CHECK: [[LOW_HIGH:@[0-9]+]] = {{.*}} getelementptr inbounds (<{ [8 x i8] }>, <{ [8 x i8] }>* @2, i32 0, i32 0, i32 0), {{.*}}, #[derive(Copy, Clone)] - // repr(i16) is required for the {low,high}_align_const test #[repr(i16)] pub enum E<A, B> { @@ -31,7 +30,7 @@ pub static STATIC: E<i16, i32> = E::A(0); // CHECK-LABEL: @static_enum_const #[no_mangle] pub fn static_enum_const() -> E<i16, i32> { - STATIC + STATIC } // CHECK-LABEL: @inline_enum_const @@ -43,15 +42,15 @@ pub fn inline_enum_const() -> E<i8, i16> { // CHECK-LABEL: @low_align_const #[no_mangle] pub fn low_align_const() -> E<i16, [i16; 3]> { -// Check that low_align_const and high_align_const use the same constant -// CHECK: i8* align 2 getelementptr inbounds (<{ [8 x i8] }>, <{ [8 x i8] }>* [[LOW_HIGH]], i32 0, i32 0, i32 0), + // Check that low_align_const and high_align_const use the same constant + // CHECK: load %"E<i16, [i16; 3]>"*, %"E<i16, [i16; 3]>"** bitcast (<{ i8*, [0 x i8] }>* [[LOW_HIGH]] to %"E<i16, [i16; 3]>"**), *&E::A(0) } // CHECK-LABEL: @high_align_const #[no_mangle] pub fn high_align_const() -> E<i16, i32> { -// Check that low_align_const and high_align_const use the same constant -// CHECK: i8* align 4 getelementptr inbounds (<{ [8 x i8] }>, <{ [8 x i8] }>* [[LOW_HIGH]], i32 0, i32 0, i32 0), + // Check that low_align_const and high_align_const use the same constant + // CHECK: load %"E<i16, i32>"*, %"E<i16, i32>"** bitcast (<{ i8*, [0 x i8] }>* [[LOW_HIGH]] to %"E<i16, i32>"**), *&E::A(0) } diff --git a/src/test/codegen/drop.rs b/src/test/codegen/drop.rs index 959929fbaf..0c7f3bb202 100644 --- a/src/test/codegen/drop.rs +++ b/src/test/codegen/drop.rs @@ -21,7 +21,7 @@ pub fn droppy() { // regular function exit. We used to have problems with quadratic growths of drop calls in such // functions. // FIXME(eddyb) the `void @` forces a match on the instruction, instead of the -// comment, that's `; call core::ptr::real_drop_in_place::<drop::SomeUniqueName>` +// comment, that's `; call core::intrinsics::drop_in_place::<drop::SomeUniqueName>` // for the `v0` mangling, should switch to matching on that once `legacy` is gone. // CHECK-NOT: invoke void @{{.*}}drop_in_place{{.*}}SomeUniqueName // CHECK: call void @{{.*}}drop_in_place{{.*}}SomeUniqueName diff --git a/src/test/codegen/force-frame-pointers.rs b/src/test/codegen/force-frame-pointers.rs index c6c1da2c1b..4c94a601f3 100644 --- a/src/test/codegen/force-frame-pointers.rs +++ b/src/test/codegen/force-frame-pointers.rs @@ -1,7 +1,7 @@ -// +// min-llvm-version 8.0 // compile-flags: -C no-prepopulate-passes -C force-frame-pointers=y #![crate_type="lib"] -// CHECK: attributes #{{.*}} "no-frame-pointer-elim"="true" +// CHECK: attributes #{{.*}} "frame-pointer"="all" pub fn foo() {} diff --git a/src/test/codegen/function-arguments.rs b/src/test/codegen/function-arguments.rs index 5c9aa48c0a..3511c7c518 100644 --- a/src/test/codegen/function-arguments.rs +++ b/src/test/codegen/function-arguments.rs @@ -73,7 +73,7 @@ pub fn _box(x: Box<i32>) -> Box<i32> { x } -// CHECK: @struct_return(%S* noalias nocapture sret dereferenceable(32)) +// CHECK: @struct_return(%S* noalias nocapture sret dereferenceable(32){{( %0)?}}) #[no_mangle] pub fn struct_return() -> S { S { @@ -117,7 +117,7 @@ pub fn str(_: &[u8]) { pub fn trait_borrow(_: &Drop) { } -// CHECK: @trait_box({}* noalias nonnull align 1, [3 x [[USIZE]]]* noalias readonly align {{.*}} dereferenceable({{.*}})) +// CHECK: @trait_box({}* noalias nonnull align 1{{( %0)?}}, [3 x [[USIZE]]]* noalias readonly align {{.*}} dereferenceable({{.*}}){{( %1)?}}) #[no_mangle] pub fn trait_box(_: Box<Drop>) { } diff --git a/src/test/codegen/instrument-mcount.rs b/src/test/codegen/instrument-mcount.rs index c72d09f7a0..e4e6d5ca2b 100644 --- a/src/test/codegen/instrument-mcount.rs +++ b/src/test/codegen/instrument-mcount.rs @@ -1,7 +1,8 @@ +// min-llvm-version 8.0 // ignore-tidy-linelength // compile-flags: -Z instrument-mcount #![crate_type = "lib"] -// CHECK: attributes #{{.*}} "instrument-function-entry-inlined"="{{.*}}mcount{{.*}}" "no-frame-pointer-elim"="true" +// CHECK: attributes #{{.*}} "frame-pointer"="all" "instrument-function-entry-inlined"="{{.*}}mcount{{.*}}" pub fn foo() {} diff --git a/src/test/codegen/intrinsics/prefetch.rs b/src/test/codegen/intrinsics/prefetch.rs index 4cd38e1428..2386fc4300 100644 --- a/src/test/codegen/intrinsics/prefetch.rs +++ b/src/test/codegen/intrinsics/prefetch.rs @@ -9,13 +9,13 @@ use std::intrinsics::{prefetch_read_data, prefetch_write_data, #[no_mangle] pub fn check_prefetch_read_data(data: &[i8]) { unsafe { - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 0, i32 1) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 0, i32 0, i32 1) prefetch_read_data(data.as_ptr(), 0); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 1, i32 1) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 0, i32 1, i32 1) prefetch_read_data(data.as_ptr(), 1); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 2, i32 1) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 0, i32 2, i32 1) prefetch_read_data(data.as_ptr(), 2); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 3, i32 1) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 0, i32 3, i32 1) prefetch_read_data(data.as_ptr(), 3); } } @@ -23,13 +23,13 @@ pub fn check_prefetch_read_data(data: &[i8]) { #[no_mangle] pub fn check_prefetch_write_data(data: &[i8]) { unsafe { - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 1, i32 0, i32 1) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 1, i32 0, i32 1) prefetch_write_data(data.as_ptr(), 0); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 1, i32 1, i32 1) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 1, i32 1, i32 1) prefetch_write_data(data.as_ptr(), 1); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 1, i32 2, i32 1) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 1, i32 2, i32 1) prefetch_write_data(data.as_ptr(), 2); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 1, i32 3, i32 1) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 1, i32 3, i32 1) prefetch_write_data(data.as_ptr(), 3); } } @@ -37,13 +37,13 @@ pub fn check_prefetch_write_data(data: &[i8]) { #[no_mangle] pub fn check_prefetch_read_instruction(data: &[i8]) { unsafe { - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 0, i32 0) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 0, i32 0, i32 0) prefetch_read_instruction(data.as_ptr(), 0); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 1, i32 0) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 0, i32 1, i32 0) prefetch_read_instruction(data.as_ptr(), 1); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 2, i32 0) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 0, i32 2, i32 0) prefetch_read_instruction(data.as_ptr(), 2); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 3, i32 0) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 0, i32 3, i32 0) prefetch_read_instruction(data.as_ptr(), 3); } } @@ -51,13 +51,13 @@ pub fn check_prefetch_read_instruction(data: &[i8]) { #[no_mangle] pub fn check_prefetch_write_instruction(data: &[i8]) { unsafe { - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 1, i32 0, i32 0) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 1, i32 0, i32 0) prefetch_write_instruction(data.as_ptr(), 0); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 1, i32 1, i32 0) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 1, i32 1, i32 0) prefetch_write_instruction(data.as_ptr(), 1); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 1, i32 2, i32 0) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 1, i32 2, i32 0) prefetch_write_instruction(data.as_ptr(), 2); - // CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 1, i32 3, i32 0) + // CHECK: call void @llvm.prefetch{{.*}}(i8* %{{.*}}, i32 1, i32 3, i32 0) prefetch_write_instruction(data.as_ptr(), 3); } } diff --git a/src/test/codegen/naked-functions.rs b/src/test/codegen/naked-functions.rs index 2050193b61..5050ed1499 100644 --- a/src/test/codegen/naked-functions.rs +++ b/src/test/codegen/naked-functions.rs @@ -17,7 +17,7 @@ pub fn naked_empty() { // CHECK: Function Attrs: naked #[no_mangle] #[naked] -// CHECK-NEXT: define void @naked_with_args(i{{[0-9]+}}) +// CHECK-NEXT: define void @naked_with_args(i{{[0-9]+( %0)?}}) pub fn naked_with_args(a: isize) { // CHECK-NEXT: {{.+}}: // CHECK-NEXT: %a = alloca i{{[0-9]+}} @@ -36,7 +36,7 @@ pub fn naked_with_return() -> isize { } // CHECK: Function Attrs: naked -// CHECK-NEXT: define i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+}}) +// CHECK-NEXT: define i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+( %0)?}}) #[no_mangle] #[naked] pub fn naked_with_args_and_return(a: isize) -> isize { diff --git a/src/test/codegen/repeat-trusted-len.rs b/src/test/codegen/repeat-trusted-len.rs index 99f3464c07..8fbe712065 100644 --- a/src/test/codegen/repeat-trusted-len.rs +++ b/src/test/codegen/repeat-trusted-len.rs @@ -13,6 +13,6 @@ pub fn helper(_: usize) { // CHECK-LABEL: @repeat_take_collect #[no_mangle] pub fn repeat_take_collect() -> Vec<u8> { -// CHECK: call void @llvm.memset.p0i8.[[USIZE]](i8* {{(nonnull )?}}align 1 %{{[0-9]+}}, i8 42, [[USIZE]] 100000, i1 false) +// CHECK: call void @llvm.memset.p0i8.[[USIZE]](i8* {{(nonnull )?}}align 1{{.*}} %{{[0-9]+}}, i8 42, [[USIZE]] 100000, i1 false) iter::repeat(42).take(100000).collect() } diff --git a/src/test/codegen/repr-transparent-aggregates-1.rs b/src/test/codegen/repr-transparent-aggregates-1.rs index 1c8959619d..018a7ba475 100644 --- a/src/test/codegen/repr-transparent-aggregates-1.rs +++ b/src/test/codegen/repr-transparent-aggregates-1.rs @@ -10,7 +10,7 @@ // ignore-windows // See repr-transparent.rs -#![feature(transparent_enums, transparent_unions)] +#![feature(transparent_unions)] #![crate_type="lib"] diff --git a/src/test/codegen/repr-transparent-aggregates-2.rs b/src/test/codegen/repr-transparent-aggregates-2.rs index afefb9c9f7..5669858672 100644 --- a/src/test/codegen/repr-transparent-aggregates-2.rs +++ b/src/test/codegen/repr-transparent-aggregates-2.rs @@ -13,7 +13,7 @@ // ignore-x86_64 // See repr-transparent.rs -#![feature(transparent_enums, transparent_unions)] +#![feature(transparent_unions)] #![crate_type="lib"] diff --git a/src/test/codegen/repr-transparent-aggregates-3.rs b/src/test/codegen/repr-transparent-aggregates-3.rs index 1a59c9b48b..e538be6878 100644 --- a/src/test/codegen/repr-transparent-aggregates-3.rs +++ b/src/test/codegen/repr-transparent-aggregates-3.rs @@ -3,7 +3,7 @@ // only-mips64 // See repr-transparent.rs -#![feature(transparent_enums, transparent_unions)] +#![feature(transparent_unions)] #![crate_type="lib"] diff --git a/src/test/codegen/repr-transparent-sysv64.rs b/src/test/codegen/repr-transparent-sysv64.rs index b71cb14a4f..886b0dd9e7 100644 --- a/src/test/codegen/repr-transparent-sysv64.rs +++ b/src/test/codegen/repr-transparent-sysv64.rs @@ -10,7 +10,7 @@ pub struct Rgb8 { r: u8, g: u8, b: u8 } #[repr(transparent)] pub struct Rgb8Wrap(Rgb8); -// CHECK: i24 @test_Rgb8Wrap(i24) +// CHECK: i24 @test_Rgb8Wrap(i24{{( %0)?}}) #[no_mangle] pub extern "sysv64" fn test_Rgb8Wrap(_: Rgb8Wrap) -> Rgb8Wrap { loop {} } @@ -23,6 +23,6 @@ pub union FloatBits { #[repr(transparent)] pub struct SmallUnion(FloatBits); -// CHECK: i32 @test_SmallUnion(i32) +// CHECK: i32 @test_SmallUnion(i32{{( %0)?}}) #[no_mangle] pub extern "sysv64" fn test_SmallUnion(_: SmallUnion) -> SmallUnion { loop {} } diff --git a/src/test/codegen/repr-transparent.rs b/src/test/codegen/repr-transparent.rs index e705d5ce3c..49fd015624 100644 --- a/src/test/codegen/repr-transparent.rs +++ b/src/test/codegen/repr-transparent.rs @@ -1,7 +1,7 @@ // compile-flags: -C no-prepopulate-passes #![crate_type="lib"] -#![feature(repr_simd, transparent_enums, transparent_unions)] +#![feature(repr_simd, transparent_unions)] use std::marker::PhantomData; diff --git a/src/test/codegen/sanitizer-memory-track-orgins.rs b/src/test/codegen/sanitizer-memory-track-orgins.rs index fd8be0bced..1fd496b35d 100644 --- a/src/test/codegen/sanitizer-memory-track-orgins.rs +++ b/src/test/codegen/sanitizer-memory-track-orgins.rs @@ -4,17 +4,21 @@ // needs-sanitizer-support // only-linux // only-x86_64 -// revisions:MSAN-0 MSAN-1 MSAN-2 +// revisions:MSAN-0 MSAN-1 MSAN-2 MSAN-1-LTO MSAN-2-LTO // //[MSAN-0] compile-flags: -Zsanitizer=memory //[MSAN-1] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins=1 //[MSAN-2] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins +//[MSAN-1-LTO] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins=1 -C lto=fat +//[MSAN-2-LTO] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins -C lto=fat #![crate_type="lib"] // MSAN-0-NOT: @__msan_track_origins // MSAN-1: @__msan_track_origins = weak_odr local_unnamed_addr constant i32 1 // MSAN-2: @__msan_track_origins = weak_odr local_unnamed_addr constant i32 2 +// MSAN-1-LTO: @__msan_track_origins = weak_odr local_unnamed_addr constant i32 1 +// MSAN-2-LTO: @__msan_track_origins = weak_odr local_unnamed_addr constant i32 2 // // MSAN-0-LABEL: define void @copy( // MSAN-1-LABEL: define void @copy( diff --git a/src/test/codegen/sanitizer-recover.rs b/src/test/codegen/sanitizer-recover.rs index a292332667..9a583725b0 100644 --- a/src/test/codegen/sanitizer-recover.rs +++ b/src/test/codegen/sanitizer-recover.rs @@ -4,31 +4,47 @@ // needs-sanitizer-support // only-linux // only-x86_64 -// revisions:ASAN ASAN-RECOVER MSAN MSAN-RECOVER +// revisions:ASAN ASAN-RECOVER MSAN MSAN-RECOVER MSAN-RECOVER-LTO +// no-prefer-dynamic // -//[ASAN] compile-flags: -Zsanitizer=address -//[ASAN-RECOVER] compile-flags: -Zsanitizer=address -Zsanitizer-recover=address -//[MSAN] compile-flags: -Zsanitizer=memory -//[MSAN-RECOVER] compile-flags: -Zsanitizer=memory -Zsanitizer-recover=memory - -#![crate_type="lib"] +//[ASAN] compile-flags: -Zsanitizer=address +//[ASAN-RECOVER] compile-flags: -Zsanitizer=address -Zsanitizer-recover=address +//[MSAN] compile-flags: -Zsanitizer=memory +//[MSAN-RECOVER] compile-flags: -Zsanitizer=memory -Zsanitizer-recover=memory +//[MSAN-RECOVER-LTO] compile-flags: -Zsanitizer=memory -Zsanitizer-recover=memory -C lto=fat +// +// MSAN-NOT: @__msan_keep_going +// MSAN-RECOVER: @__msan_keep_going = weak_odr {{.*}} constant i32 1 +// MSAN-RECOVER-LTO: @__msan_keep_going = weak_odr {{.*}} constant i32 1 -// ASAN-LABEL: define i32 @penguin( +// ASAN-LABEL: define i32 @penguin( +// ASAN: call void @__asan_report_load4(i64 %0) +// ASAN: unreachable +// ASAN: } +// // ASAN-RECOVER-LABEL: define i32 @penguin( -// MSAN-LABEL: define i32 @penguin( +// ASAN-RECOVER: call void @__asan_report_load4_noabort( +// ASAN-RECOVER-NOT: unreachable +// ASAN: } +// +// MSAN-LABEL: define i32 @penguin( +// MSAN: call void @__msan_warning_noreturn() +// MSAN: unreachable +// MSAN: } +// // MSAN-RECOVER-LABEL: define i32 @penguin( +// MSAN-RECOVER: call void @__msan_warning() +// MSAN-RECOVER-NOT: unreachable +// MSAN-RECOVER: } +// +// MSAN-RECOVER-LTO-LABEL: define i32 @penguin( +// MSAN-RECOVER-LTO: call void @__msan_warning() +// MSAN-RECOVER-LTO-NOT: unreachable +// MSAN-RECOVER-LTO: } +// #[no_mangle] pub fn penguin(p: &mut i32) -> i32 { - // ASAN: call void @__asan_report_load4(i64 %0) - // ASAN: unreachable - // - // ASAN-RECOVER: call void @__asan_report_load4_noabort( - // ASAN-RECOVER-NOT: unreachable - // - // MSAN: call void @__msan_warning_noreturn() - // MSAN: unreachable - // - // MSAN-RECOVER: call void @__msan_warning() - // MSAN-RECOVER-NOT: unreachable *p } + +fn main() {} diff --git a/src/test/codegen/union-abi.rs b/src/test/codegen/union-abi.rs index 98a9ff9cbe..afea01e9a2 100644 --- a/src/test/codegen/union-abi.rs +++ b/src/test/codegen/union-abi.rs @@ -54,7 +54,7 @@ pub fn test_UnionF32F32(_: UnionF32F32) -> UnionF32F32 { loop {} } pub union UnionF32U32{a:f32, b:u32} -// CHECK: define i32 @test_UnionF32U32(i32) +// CHECK: define i32 @test_UnionF32U32(i32{{( %0)?}}) #[no_mangle] pub fn test_UnionF32U32(_: UnionF32U32) -> UnionF32U32 { loop {} } diff --git a/src/test/compile-fail/consts/const-fn-error.rs b/src/test/compile-fail/consts/const-fn-error.rs index 5d26059644..9db595af63 100644 --- a/src/test/compile-fail/consts/const-fn-error.rs +++ b/src/test/compile-fail/consts/const-fn-error.rs @@ -6,6 +6,7 @@ const fn f(x: usize) -> usize { let mut sum = 0; for i in 0..x { //~^ ERROR E0015 + //~| ERROR E0015 //~| ERROR E0658 //~| ERROR E0080 //~| ERROR E0744 diff --git a/src/test/compile-fail/issue-23595-1.rs b/src/test/compile-fail/issue-23595-1.rs index 2912c4ead7..483c205f42 100644 --- a/src/test/compile-fail/issue-23595-1.rs +++ b/src/test/compile-fail/issue-23595-1.rs @@ -1,12 +1,12 @@ #![feature(associated_type_defaults)] -use std::ops::{Index}; +use std::ops::Index; trait Hierarchy { type Value; type ChildKey; type Children = dyn Index<Self::ChildKey, Output=dyn Hierarchy>; - //~^ ERROR: the value of the associated types `Value` (from the trait `Hierarchy`), `ChildKey` + //~^ ERROR: the value of the associated types fn data(&self) -> Option<(Self::Value, Self::Children)>; } diff --git a/src/test/compile-fail/issue-52443.rs b/src/test/compile-fail/issue-52443.rs index ee37aaa5e1..597fbbf00d 100644 --- a/src/test/compile-fail/issue-52443.rs +++ b/src/test/compile-fail/issue-52443.rs @@ -8,6 +8,7 @@ fn main() { //~| WARN denote infinite loops with [(); { for _ in 0usize.. {}; 0}]; //~^ ERROR calls in constants are limited to constant functions + //~| ERROR calls in constants are limited to constant functions //~| ERROR `for` is not allowed in a `const` //~| ERROR references in constants may only refer to immutable values //~| ERROR evaluation of constant value failed diff --git a/src/test/compile-fail/panic-handler-twice.rs b/src/test/compile-fail/panic-handler-twice.rs index c0f2c51397..0c5359b9bd 100644 --- a/src/test/compile-fail/panic-handler-twice.rs +++ b/src/test/compile-fail/panic-handler-twice.rs @@ -10,7 +10,7 @@ use core::panic::PanicInfo; #[panic_handler] fn panic(info: &PanicInfo) -> ! { - //~^ error duplicate lang item found: `panic_impl` + //~^ ERROR found duplicate lang item `panic_impl` loop {} } diff --git a/src/test/debuginfo/borrowed-enum-legacy.rs b/src/test/debuginfo/borrowed-enum-legacy.rs deleted file mode 100644 index 9a973ed74e..0000000000 --- a/src/test/debuginfo/borrowed-enum-legacy.rs +++ /dev/null @@ -1,84 +0,0 @@ -// ignore-tidy-linelength -// min-lldb-version: 310 - -// As long as LLVM 5 and LLVM 6 are supported, we want to test the -// enum debuginfo fallback mode. Once those are desupported, this -// test can be removed, as there is another (non-"legacy") test that -// tests the new mode. -// ignore-llvm-version: 7.0 - 9.9.9 -// ignore-gdb-version: 7.11.90 - 7.12.9 -// ignore-gdb-version: 8.2 - 9.9 - -// compile-flags:-g - -// === GDB TESTS =================================================================================== - -// gdb-command:run - -// gdb-command:print *the_a_ref -// gdbg-check:$1 = {{RUST$ENUM$DISR = TheA, x = 0, y = 8970181431921507452}, {RUST$ENUM$DISR = TheA, [...]}} -// gdbr-check:$1 = borrowed_enum_legacy::ABC::TheA{x: 0, y: 8970181431921507452} - -// gdb-command:print *the_b_ref -// gdbg-check:$2 = {{RUST$ENUM$DISR = TheB, [...]}, {RUST$ENUM$DISR = TheB, __0 = 0, __1 = 286331153, __2 = 286331153}} -// gdbr-check:$2 = borrowed_enum_legacy::ABC::TheB(0, 286331153, 286331153) - -// gdb-command:print *univariant_ref -// gdbg-check:$3 = {{__0 = 4820353753753434}} -// gdbr-check:$3 = borrowed_enum_legacy::Univariant::TheOnlyCase(4820353753753434) - - -// === LLDB TESTS ================================================================================== - -// lldb-command:run - -// lldb-command:print *the_a_ref -// lldbg-check:[...]$0 = TheA { x: 0, y: 8970181431921507452 } -// lldbr-check:(borrowed_enum_legacy::ABC::TheA) *the_a_ref = TheA { borrowed_enum_legacy::ABC::TheA: 0, borrowed_enum_legacy::ABC::TheB: 8970181431921507452 } -// lldb-command:print *the_b_ref -// lldbg-check:[...]$1 = TheB(0, 286331153, 286331153) -// lldbr-check:(borrowed_enum_legacy::ABC::TheB) *the_b_ref = { = 0 = 286331153 = 286331153 } -// lldb-command:print *univariant_ref -// lldbg-check:[...]$2 = TheOnlyCase(4820353753753434) -// lldbr-check:(borrowed_enum_legacy::Univariant) *univariant_ref = { borrowed_enum_legacy::TheOnlyCase = { = 4820353753753434 } } - -#![allow(unused_variables)] -#![feature(omit_gdb_pretty_printer_section)] -#![omit_gdb_pretty_printer_section] - -// The first element is to ensure proper alignment, irrespective of the machines word size. Since -// the size of the discriminant value is machine dependent, this has be taken into account when -// datatype layout should be predictable as in this case. -enum ABC { - TheA { x: i64, y: i64 }, - TheB (i64, i32, i32), -} - -// This is a special case since it does not have the implicit discriminant field. -enum Univariant { - TheOnlyCase(i64) -} - -fn main() { - - // 0b0111110001111100011111000111110001111100011111000111110001111100 = 8970181431921507452 - // 0b01111100011111000111110001111100 = 2088533116 - // 0b0111110001111100 = 31868 - // 0b01111100 = 124 - let the_a = ABC::TheA { x: 0, y: 8970181431921507452 }; - let the_a_ref: &ABC = &the_a; - - // 0b0001000100010001000100010001000100010001000100010001000100010001 = 1229782938247303441 - // 0b00010001000100010001000100010001 = 286331153 - // 0b0001000100010001 = 4369 - // 0b00010001 = 17 - let the_b = ABC::TheB (0, 286331153, 286331153); - let the_b_ref: &ABC = &the_b; - - let univariant = Univariant::TheOnlyCase(4820353753753434); - let univariant_ref: &Univariant = &univariant; - - zzz(); // #break -} - -fn zzz() {()} diff --git a/src/test/debuginfo/generic-enum-with-different-disr-sizes-legacy.rs b/src/test/debuginfo/generic-enum-with-different-disr-sizes-legacy.rs deleted file mode 100644 index 4f17e48c6a..0000000000 --- a/src/test/debuginfo/generic-enum-with-different-disr-sizes-legacy.rs +++ /dev/null @@ -1,105 +0,0 @@ -// ignore-tidy-linelength -// ignore-lldb: FIXME(#27089) -// min-lldb-version: 310 - -// As long as LLVM 5 and LLVM 6 are supported, we want to test the -// enum debuginfo fallback mode. Once those are desupported, this -// test can be removed, as there is another (non-"legacy") test that -// tests the new mode. -// ignore-llvm-version: 7.0 - 9.9.9 -// ignore-gdb-version: 8.2 - 9.9 - -// compile-flags:-g - -// === GDB TESTS =================================================================================== -// gdb-command:run - -// gdb-command:print eight_bytes1 -// gdbg-check:$1 = {{RUST$ENUM$DISR = Variant1, __0 = 100}, {RUST$ENUM$DISR = Variant1, __0 = 100}} -// gdbr-check:$1 = generic_enum_with_different_disr_sizes_legacy::Enum::Variant1(100) - -// gdb-command:print four_bytes1 -// gdbg-check:$2 = {{RUST$ENUM$DISR = Variant1, __0 = 101}, {RUST$ENUM$DISR = Variant1, __0 = 101}} -// gdbr-check:$2 = generic_enum_with_different_disr_sizes_legacy::Enum::Variant1(101) - -// gdb-command:print two_bytes1 -// gdbg-check:$3 = {{RUST$ENUM$DISR = Variant1, __0 = 102}, {RUST$ENUM$DISR = Variant1, __0 = 102}} -// gdbr-check:$3 = generic_enum_with_different_disr_sizes_legacy::Enum::Variant1(102) - -// gdb-command:print one_byte1 -// gdbg-check:$4 = {{RUST$ENUM$DISR = Variant1, __0 = 65 'A'}, {RUST$ENUM$DISR = Variant1, __0 = 65 'A'}} -// gdbr-check:$4 = generic_enum_with_different_disr_sizes_legacy::Enum::Variant1(65) - - -// gdb-command:print eight_bytes2 -// gdbg-check:$5 = {{RUST$ENUM$DISR = Variant2, __0 = 100}, {RUST$ENUM$DISR = Variant2, __0 = 100}} -// gdbr-check:$5 = generic_enum_with_different_disr_sizes_legacy::Enum::Variant2(100) - -// gdb-command:print four_bytes2 -// gdbg-check:$6 = {{RUST$ENUM$DISR = Variant2, __0 = 101}, {RUST$ENUM$DISR = Variant2, __0 = 101}} -// gdbr-check:$6 = generic_enum_with_different_disr_sizes_legacy::Enum::Variant2(101) - -// gdb-command:print two_bytes2 -// gdbg-check:$7 = {{RUST$ENUM$DISR = Variant2, __0 = 102}, {RUST$ENUM$DISR = Variant2, __0 = 102}} -// gdbr-check:$7 = generic_enum_with_different_disr_sizes_legacy::Enum::Variant2(102) - -// gdb-command:print one_byte2 -// gdbg-check:$8 = {{RUST$ENUM$DISR = Variant2, __0 = 65 'A'}, {RUST$ENUM$DISR = Variant2, __0 = 65 'A'}} -// gdbr-check:$8 = generic_enum_with_different_disr_sizes_legacy::Enum::Variant2(65) - -// gdb-command:continue - -// === LLDB TESTS ================================================================================== -// lldb-command:run - -// lldb-command:print eight_bytes1 -// lldb-check:[...]$0 = Variant1(100) -// lldb-command:print four_bytes1 -// lldb-check:[...]$1 = Variant1(101) -// lldb-command:print two_bytes1 -// lldb-check:[...]$2 = Variant1(102) -// lldb-command:print one_byte1 -// lldb-check:[...]$3 = Variant1('A') - -// lldb-command:print eight_bytes2 -// lldb-check:[...]$4 = Variant2(100) -// lldb-command:print four_bytes2 -// lldb-check:[...]$5 = Variant2(101) -// lldb-command:print two_bytes2 -// lldb-check:[...]$6 = Variant2(102) -// lldb-command:print one_byte2 -// lldb-check:[...]$7 = Variant2('A') - -// lldb-command:continue - -#![allow(unused_variables)] -#![allow(dead_code)] -#![feature(omit_gdb_pretty_printer_section)] -#![omit_gdb_pretty_printer_section] - -// This test case makes sure that we get correct type descriptions for the enum -// discriminant of different instantiations of the same generic enum type where, -// dependending on the generic type parameter(s), the discriminant has a -// different size in memory. - -enum Enum<T> { - Variant1(T), - Variant2(T) -} - -fn main() { - // These are ordered for descending size on purpose - let eight_bytes1 = Enum::Variant1(100.0f64); - let four_bytes1 = Enum::Variant1(101i32); - let two_bytes1 = Enum::Variant1(102i16); - let one_byte1 = Enum::Variant1(65u8); - - let eight_bytes2 = Enum::Variant2(100.0f64); - let four_bytes2 = Enum::Variant2(101i32); - let two_bytes2 = Enum::Variant2(102i16); - let one_byte2 = Enum::Variant2(65u8); - - zzz(); // #break -} - -fn zzz() { () } diff --git a/src/test/debuginfo/generic-struct-style-enum-legacy.rs b/src/test/debuginfo/generic-struct-style-enum-legacy.rs deleted file mode 100644 index 37a875a418..0000000000 --- a/src/test/debuginfo/generic-struct-style-enum-legacy.rs +++ /dev/null @@ -1,86 +0,0 @@ -// ignore-tidy-linelength -// min-lldb-version: 310 -// ignore-gdb-version: 7.11.90 - 7.12.9 - -// As long as LLVM 5 and LLVM 6 are supported, we want to test the -// enum debuginfo fallback mode. Once those are desupported, this -// test can be removed, as there is another (non-"legacy") test that -// tests the new mode. -// ignore-llvm-version: 7.0 - 9.9.9 -// ignore-gdb-version: 8.2 - 9.9 - -// compile-flags:-g - -// gdb-command:set print union on -// gdb-command:run - -// gdb-command:print case1 -// gdbg-check:$1 = {{RUST$ENUM$DISR = Case1, a = 0, b = 31868, c = 31868, d = 31868, e = 31868}, {RUST$ENUM$DISR = Case1, [...]}, {RUST$ENUM$DISR = Case1, [...]}} -// gdbr-check:$1 = generic_struct_style_enum_legacy::Regular::Case1{a: 0, b: 31868, c: 31868, d: 31868, e: 31868} - -// gdb-command:print case2 -// gdbg-check:$2 = {{RUST$ENUM$DISR = Case2, [...]}, {RUST$ENUM$DISR = Case2, a = 0, b = 286331153, c = 286331153}, {RUST$ENUM$DISR = Case2, [...]}} -// gdbr-check:$2 = generic_struct_style_enum_legacy::Regular::Case2{a: 0, b: 286331153, c: 286331153} - -// gdb-command:print case3 -// gdbg-check:$3 = {{RUST$ENUM$DISR = Case3, [...]}, {RUST$ENUM$DISR = Case3, [...]}, {RUST$ENUM$DISR = Case3, a = 0, b = 6438275382588823897}} -// gdbr-check:$3 = generic_struct_style_enum_legacy::Regular::Case3{a: 0, b: 6438275382588823897} - -// gdb-command:print univariant -// gdbg-check:$4 = {{a = -1}} -// gdbr-check:$4 = generic_struct_style_enum_legacy::Univariant<i32>::TheOnlyCase{a: -1} - - -#![feature(omit_gdb_pretty_printer_section)] -#![omit_gdb_pretty_printer_section] - -use self::Regular::{Case1, Case2, Case3}; -use self::Univariant::TheOnlyCase; - -// NOTE: This is a copy of the non-generic test case. The `Txx` type parameters have to be -// substituted with something of size `xx` bits and the same alignment as an integer type of the -// same size. - -// The first element is to ensure proper alignment, irrespective of the machines word size. Since -// the size of the discriminant value is machine dependent, this has be taken into account when -// datatype layout should be predictable as in this case. -enum Regular<T16, T32, T64> { - Case1 { a: T64, b: T16, c: T16, d: T16, e: T16}, - Case2 { a: T64, b: T32, c: T32}, - Case3 { a: T64, b: T64 } -} - -enum Univariant<T> { - TheOnlyCase { a: T } -} - -fn main() { - - // In order to avoid endianness trouble all of the following test values consist of a single - // repeated byte. This way each interpretation of the union should look the same, no matter if - // this is a big or little endian machine. - - // 0b0111110001111100011111000111110001111100011111000111110001111100 = 8970181431921507452 - // 0b01111100011111000111110001111100 = 2088533116 - // 0b0111110001111100 = 31868 - // 0b01111100 = 124 - let case1: Regular<u16, u32, i64> = Case1 { a: 0, b: 31868, c: 31868, d: 31868, e: 31868 }; - - // 0b0001000100010001000100010001000100010001000100010001000100010001 = 1229782938247303441 - // 0b00010001000100010001000100010001 = 286331153 - // 0b0001000100010001 = 4369 - // 0b00010001 = 17 - let case2: Regular<i16, u32, i64> = Case2 { a: 0, b: 286331153, c: 286331153 }; - - // 0b0101100101011001010110010101100101011001010110010101100101011001 = 6438275382588823897 - // 0b01011001010110010101100101011001 = 1499027801 - // 0b0101100101011001 = 22873 - // 0b01011001 = 89 - let case3: Regular<u16, i32, u64> = Case3 { a: 0, b: 6438275382588823897 }; - - let univariant = TheOnlyCase { a: -1 }; - - zzz(); // #break -} - -fn zzz() {()} diff --git a/src/test/debuginfo/generic-tuple-style-enum-legacy.rs b/src/test/debuginfo/generic-tuple-style-enum-legacy.rs deleted file mode 100644 index 452e90008e..0000000000 --- a/src/test/debuginfo/generic-tuple-style-enum-legacy.rs +++ /dev/null @@ -1,108 +0,0 @@ -// ignore-tidy-linelength -// min-lldb-version: 310 -// ignore-gdb-version: 7.11.90 - 7.12.9 - -// As long as LLVM 5 and LLVM 6 are supported, we want to test the -// enum debuginfo fallback mode. Once those are desupported, this -// test can be removed, as there is another (non-"legacy") test that -// tests the new mode. -// ignore-llvm-version: 7.0 - 9.9.9 -// ignore-gdb-version: 8.2 - 9.9 - -// compile-flags:-g - -// === GDB TESTS =================================================================================== - -// gdb-command:set print union on -// gdb-command:run - -// gdb-command:print case1 -// gdbg-check:$1 = {{RUST$ENUM$DISR = Case1, __0 = 0, __1 = 31868, __2 = 31868, __3 = 31868, __4 = 31868}, {RUST$ENUM$DISR = Case1, [...]}, {RUST$ENUM$DISR = Case1, [...]}} -// gdbr-check:$1 = generic_tuple_style_enum_legacy::Regular::Case1(0, 31868, 31868, 31868, 31868) - -// gdb-command:print case2 -// gdbg-check:$2 = {{RUST$ENUM$DISR = Case2, [...]}, {RUST$ENUM$DISR = Case2, __0 = 0, __1 = 286331153, __2 = 286331153}, {RUST$ENUM$DISR = Case2, [...]}} -// gdbr-check:$2 = generic_tuple_style_enum_legacy::Regular::Case2(0, 286331153, 286331153) - -// gdb-command:print case3 -// gdbg-check:$3 = {{RUST$ENUM$DISR = Case3, [...]}, {RUST$ENUM$DISR = Case3, [...]}, {RUST$ENUM$DISR = Case3, __0 = 0, __1 = 6438275382588823897}} -// gdbr-check:$3 = generic_tuple_style_enum_legacy::Regular::Case3(0, 6438275382588823897) - -// gdb-command:print univariant -// gdbg-check:$4 = {{__0 = -1}} -// gdbr-check:$4 = generic_tuple_style_enum_legacy::Univariant<i64>::TheOnlyCase(-1) - - -// === LLDB TESTS ================================================================================== - -// lldb-command:run - -// lldb-command:print case1 -// lldbg-check:[...]$0 = Case1(0, 31868, 31868, 31868, 31868) -// lldbr-check:(generic_tuple_style_enum_legacy::Regular<u16, u32, u64>::Case1) case1 = { = 0 = 31868 = 31868 = 31868 = 31868 } - -// lldb-command:print case2 -// lldbg-check:[...]$1 = Case2(0, 286331153, 286331153) -// lldbr-check:(generic_tuple_style_enum_legacy::Regular<i16, i32, i64>::Case2) case2 = Regular<i16, i32, i64>::Case2 { generic_tuple_style_enum_legacy::Regular<i16, i32, i64>::Case1: 0, generic_tuple_style_enum_legacy::Regular<i16, i32, i64>::Case2: 286331153, generic_tuple_style_enum_legacy::Regular<i16, i32, i64>::Case3: 286331153 } - -// lldb-command:print case3 -// lldbg-check:[...]$2 = Case3(0, 6438275382588823897) -// lldbr-check:(generic_tuple_style_enum_legacy::Regular<i16, i32, i64>::Case3) case3 = Regular<i16, i32, i64>::Case3 { generic_tuple_style_enum_legacy::Regular<i16, i32, i64>::Case1: 0, generic_tuple_style_enum_legacy::Regular<i16, i32, i64>::Case2: 6438275382588823897 } - -// lldb-command:print univariant -// lldbg-check:[...]$3 = TheOnlyCase(-1) -// lldbr-check:(generic_tuple_style_enum_legacy::Univariant<i64>) univariant = { generic_tuple_style_enum_legacy::TheOnlyCase = { = -1 } } - -#![feature(omit_gdb_pretty_printer_section)] -#![omit_gdb_pretty_printer_section] - -use self::Regular::{Case1, Case2, Case3}; -use self::Univariant::TheOnlyCase; - -// NOTE: This is a copy of the non-generic test case. The `Txx` type parameters have to be -// substituted with something of size `xx` bits and the same alignment as an integer type of the -// same size. - -// The first element is to ensure proper alignment, irrespective of the machines word size. Since -// the size of the discriminant value is machine dependent, this has be taken into account when -// datatype layout should be predictable as in this case. -enum Regular<T16, T32, T64> { - Case1(T64, T16, T16, T16, T16), - Case2(T64, T32, T32), - Case3(T64, T64) -} - -enum Univariant<T64> { - TheOnlyCase(T64) -} - -fn main() { - - // In order to avoid endianness trouble all of the following test values consist of a single - // repeated byte. This way each interpretation of the union should look the same, no matter if - // this is a big or little endian machine. - - // 0b0111110001111100011111000111110001111100011111000111110001111100 = 8970181431921507452 - // 0b01111100011111000111110001111100 = 2088533116 - // 0b0111110001111100 = 31868 - // 0b01111100 = 124 - let case1: Regular<u16, u32, u64> = Case1(0_u64, 31868_u16, 31868_u16, 31868_u16, 31868_u16); - - // 0b0001000100010001000100010001000100010001000100010001000100010001 = 1229782938247303441 - // 0b00010001000100010001000100010001 = 286331153 - // 0b0001000100010001 = 4369 - // 0b00010001 = 17 - let case2: Regular<i16, i32, i64> = Case2(0_i64, 286331153_i32, 286331153_i32); - - // 0b0101100101011001010110010101100101011001010110010101100101011001 = 6438275382588823897 - // 0b01011001010110010101100101011001 = 1499027801 - // 0b0101100101011001 = 22873 - // 0b01011001 = 89 - let case3: Regular<i16, i32, i64> = Case3(0_i64, 6438275382588823897_i64); - - let univariant = TheOnlyCase(-1_i64); - - zzz(); // #break -} - -fn zzz() { () } diff --git a/src/test/debuginfo/recursive-struct-legacy.rs b/src/test/debuginfo/recursive-struct-legacy.rs deleted file mode 100644 index 99286708ae..0000000000 --- a/src/test/debuginfo/recursive-struct-legacy.rs +++ /dev/null @@ -1,235 +0,0 @@ -// ignore-tidy-linelength -// ignore-lldb - -// As long as LLVM 5 and LLVM 6 are supported, we want to test the -// enum debuginfo fallback mode. Once those are desupported, this -// test can be removed, as there is another (non-"legacy") test that -// tests the new mode. -// ignore-llvm-version: 7.0 - 9.9.9 -// ignore-gdb-version: 7.11.90 - 7.12.9 -// ignore-gdb-version: 8.2 - 9.9 - -// compile-flags:-g - -// gdb-command:run - -// gdb-command:print stack_unique.value -// gdb-check:$1 = 0 -// gdbg-command:print stack_unique.next.RUST$ENCODED$ENUM$0$Empty.val->value -// gdbr-command:print stack_unique.next.val.value -// gdb-check:$2 = 1 - -// gdbg-command:print unique_unique->value -// gdbr-command:print unique_unique.value -// gdb-check:$3 = 2 -// gdbg-command:print unique_unique->next.RUST$ENCODED$ENUM$0$Empty.val->value -// gdbr-command:print unique_unique.next.val.value -// gdb-check:$4 = 3 - -// gdb-command:print vec_unique[0].value -// gdb-check:$5 = 6.5 -// gdbg-command:print vec_unique[0].next.RUST$ENCODED$ENUM$0$Empty.val->value -// gdbr-command:print vec_unique[0].next.val.value -// gdb-check:$6 = 7.5 - -// gdbg-command:print borrowed_unique->value -// gdbr-command:print borrowed_unique.value -// gdb-check:$7 = 8.5 -// gdbg-command:print borrowed_unique->next.RUST$ENCODED$ENUM$0$Empty.val->value -// gdbr-command:print borrowed_unique.next.val.value -// gdb-check:$8 = 9.5 - -// LONG CYCLE -// gdb-command:print long_cycle1.value -// gdb-check:$9 = 20 -// gdbg-command:print long_cycle1.next->value -// gdbr-command:print long_cycle1.next.value -// gdb-check:$10 = 21 -// gdbg-command:print long_cycle1.next->next->value -// gdbr-command:print long_cycle1.next.next.value -// gdb-check:$11 = 22 -// gdbg-command:print long_cycle1.next->next->next->value -// gdbr-command:print long_cycle1.next.next.next.value -// gdb-check:$12 = 23 - -// gdb-command:print long_cycle2.value -// gdb-check:$13 = 24 -// gdbg-command:print long_cycle2.next->value -// gdbr-command:print long_cycle2.next.value -// gdb-check:$14 = 25 -// gdbg-command:print long_cycle2.next->next->value -// gdbr-command:print long_cycle2.next.next.value -// gdb-check:$15 = 26 - -// gdb-command:print long_cycle3.value -// gdb-check:$16 = 27 -// gdbg-command:print long_cycle3.next->value -// gdbr-command:print long_cycle3.next.value -// gdb-check:$17 = 28 - -// gdb-command:print long_cycle4.value -// gdb-check:$18 = 29.5 - -// gdbg-command:print (*****long_cycle_w_anonymous_types).value -// gdbr-command:print long_cycle_w_anonymous_types.value -// gdb-check:$19 = 30 - -// gdbg-command:print (*****((*****long_cycle_w_anonymous_types).next.RUST$ENCODED$ENUM$0$Empty.val)).value -// gdbr-command:print long_cycle_w_anonymous_types.next.val.value -// gdb-check:$20 = 31 - -// gdb-command:continue - -#![allow(unused_variables)] -#![feature(box_syntax)] -#![feature(omit_gdb_pretty_printer_section)] -#![omit_gdb_pretty_printer_section] - -use self::Opt::{Empty, Val}; - -enum Opt<T> { - Empty, - Val { val: T } -} - -struct UniqueNode<T> { - next: Opt<Box<UniqueNode<T>>>, - value: T -} - -struct LongCycle1<T> { - next: Box<LongCycle2<T>>, - value: T, -} - -struct LongCycle2<T> { - next: Box<LongCycle3<T>>, - value: T, -} - -struct LongCycle3<T> { - next: Box<LongCycle4<T>>, - value: T, -} - -struct LongCycle4<T> { - next: Option<Box<LongCycle1<T>>>, - value: T, -} - -struct LongCycleWithAnonymousTypes { - next: Opt<Box<Box<Box<Box<Box<LongCycleWithAnonymousTypes>>>>>>, - value: usize, -} - -// This test case makes sure that recursive structs are properly described. The Node structs are -// generic so that we can have a new type (that newly needs to be described) for the different -// cases. The potential problem with recursive types is that the DI generation algorithm gets -// trapped in an endless loop. To make sure, we actually test this in the different cases, we have -// to operate on a new type each time, otherwise we would just hit the DI cache for all but the -// first case. - -// The different cases below (stack_*, unique_*, box_*, etc) are set up so that the type description -// algorithm will enter the type reference cycle that is created by a recursive definition from a -// different context each time. - -// The "long cycle" cases are constructed to span a longer, indirect recursion cycle between types. -// The different locals will cause the DI algorithm to enter the type reference cycle at different -// points. - -fn main() { - let stack_unique: UniqueNode<u16> = UniqueNode { - next: Val { - val: box UniqueNode { - next: Empty, - value: 1, - } - }, - value: 0, - }; - - let unique_unique: Box<UniqueNode<u32>> = box UniqueNode { - next: Val { - val: box UniqueNode { - next: Empty, - value: 3, - } - }, - value: 2, - }; - - let vec_unique: [UniqueNode<f32>; 1] = [UniqueNode { - next: Val { - val: box UniqueNode { - next: Empty, - value: 7.5, - } - }, - value: 6.5, - }]; - - let borrowed_unique: &UniqueNode<f64> = &UniqueNode { - next: Val { - val: box UniqueNode { - next: Empty, - value: 9.5, - } - }, - value: 8.5, - }; - - // LONG CYCLE - let long_cycle1: LongCycle1<u16> = LongCycle1 { - next: box LongCycle2 { - next: box LongCycle3 { - next: box LongCycle4 { - next: None, - value: 23, - }, - value: 22, - }, - value: 21 - }, - value: 20 - }; - - let long_cycle2: LongCycle2<u32> = LongCycle2 { - next: box LongCycle3 { - next: box LongCycle4 { - next: None, - value: 26, - }, - value: 25, - }, - value: 24 - }; - - let long_cycle3: LongCycle3<u64> = LongCycle3 { - next: box LongCycle4 { - next: None, - value: 28, - }, - value: 27, - }; - - let long_cycle4: LongCycle4<f32> = LongCycle4 { - next: None, - value: 29.5, - }; - - // It's important that LongCycleWithAnonymousTypes is encountered only at the end of the - // `box` chain. - let long_cycle_w_anonymous_types = box box box box box LongCycleWithAnonymousTypes { - next: Val { - val: box box box box box LongCycleWithAnonymousTypes { - next: Empty, - value: 31, - } - }, - value: 30 - }; - - zzz(); // #break -} - -fn zzz() {()} diff --git a/src/test/debuginfo/struct-style-enum-legacy.rs b/src/test/debuginfo/struct-style-enum-legacy.rs deleted file mode 100644 index 1433493fd5..0000000000 --- a/src/test/debuginfo/struct-style-enum-legacy.rs +++ /dev/null @@ -1,105 +0,0 @@ -// ignore-tidy-linelength -// min-lldb-version: 310 - -// As long as LLVM 5 and LLVM 6 are supported, we want to test the -// enum debuginfo fallback mode. Once those are desupported, this -// test can be removed, as there is another (non-"legacy") test that -// tests the new mode. -// ignore-llvm-version: 7.0 - 9.9.9 -// ignore-gdb-version: 7.11.90 - 7.12.9 -// ignore-gdb-version: 8.2 - 9.9 - -// compile-flags:-g - -// === GDB TESTS =================================================================================== - -// gdb-command:set print union on -// gdb-command:run - -// gdb-command:print case1 -// gdbg-check:$1 = {{RUST$ENUM$DISR = Case1, a = 0, b = 31868, c = 31868, d = 31868, e = 31868}, {RUST$ENUM$DISR = Case1, [...]}, {RUST$ENUM$DISR = Case1, [...]}} -// gdbr-check:$1 = struct_style_enum_legacy::Regular::Case1{a: 0, b: 31868, c: 31868, d: 31868, e: 31868} - -// gdb-command:print case2 -// gdbg-check:$2 = {{RUST$ENUM$DISR = Case2, [...]}, {RUST$ENUM$DISR = Case2, a = 0, b = 286331153, c = 286331153}, {RUST$ENUM$DISR = Case2, [...]}} -// gdbr-check:$2 = struct_style_enum_legacy::Regular::Case2{a: 0, b: 286331153, c: 286331153} - -// gdb-command:print case3 -// gdbg-check:$3 = {{RUST$ENUM$DISR = Case3, [...]}, {RUST$ENUM$DISR = Case3, [...]}, {RUST$ENUM$DISR = Case3, a = 0, b = 6438275382588823897}} -// gdbr-check:$3 = struct_style_enum_legacy::Regular::Case3{a: 0, b: 6438275382588823897} - -// gdb-command:print univariant -// gdbg-check:$4 = {{a = -1}} -// gdbr-check:$4 = struct_style_enum_legacy::Univariant::TheOnlyCase{a: -1} - - -// === LLDB TESTS ================================================================================== - -// lldb-command:run - -// lldb-command:print case1 -// lldbg-check:[...]$0 = Case1 { a: 0, b: 31868, c: 31868, d: 31868, e: 31868 } -// lldbr-check:(struct_style_enum_legacy::Regular::Case1) case1 = { a = 0 b = 31868 c = 31868 d = 31868 e = 31868 } - -// lldb-command:print case2 -// lldbg-check:[...]$1 = Case2 { a: 0, b: 286331153, c: 286331153 } -// lldbr-check:(struct_style_enum_legacy::Regular::Case2) case2 = Case2 { struct_style_enum_legacy::Regular::Case1: 0, struct_style_enum_legacy::Regular::Case2: 286331153, struct_style_enum_legacy::Regular::Case3: 286331153 } - -// lldb-command:print case3 -// lldbg-check:[...]$2 = Case3 { a: 0, b: 6438275382588823897 } -// lldbr-check:(struct_style_enum_legacy::Regular::Case3) case3 = Case3 { struct_style_enum_legacy::Regular::Case1: 0, struct_style_enum_legacy::Regular::Case2: 6438275382588823897 } - -// lldb-command:print univariant -// lldbg-check:[...]$3 = TheOnlyCase { a: -1 } -// lldbr-check:(struct_style_enum_legacy::Univariant) univariant = Univariant { struct_style_enum_legacy::TheOnlyCase: TheOnlyCase { a: -1 } } - -#![allow(unused_variables)] -#![feature(omit_gdb_pretty_printer_section)] -#![omit_gdb_pretty_printer_section] - -use self::Regular::{Case1, Case2, Case3}; -use self::Univariant::TheOnlyCase; - -// The first element is to ensure proper alignment, irrespective of the machines word size. Since -// the size of the discriminant value is machine dependent, this has be taken into account when -// datatype layout should be predictable as in this case. -enum Regular { - Case1 { a: u64, b: u16, c: u16, d: u16, e: u16}, - Case2 { a: u64, b: u32, c: u32}, - Case3 { a: u64, b: u64 } -} - -enum Univariant { - TheOnlyCase { a: i64 } -} - -fn main() { - - // In order to avoid endianness trouble all of the following test values consist of a single - // repeated byte. This way each interpretation of the union should look the same, no matter if - // this is a big or little endian machine. - - // 0b0111110001111100011111000111110001111100011111000111110001111100 = 8970181431921507452 - // 0b01111100011111000111110001111100 = 2088533116 - // 0b0111110001111100 = 31868 - // 0b01111100 = 124 - let case1 = Case1 { a: 0, b: 31868, c: 31868, d: 31868, e: 31868 }; - - // 0b0001000100010001000100010001000100010001000100010001000100010001 = 1229782938247303441 - // 0b00010001000100010001000100010001 = 286331153 - // 0b0001000100010001 = 4369 - // 0b00010001 = 17 - let case2 = Case2 { a: 0, b: 286331153, c: 286331153 }; - - // 0b0101100101011001010110010101100101011001010110010101100101011001 = 6438275382588823897 - // 0b01011001010110010101100101011001 = 1499027801 - // 0b0101100101011001 = 22873 - // 0b01011001 = 89 - let case3 = Case3 { a: 0, b: 6438275382588823897 }; - - let univariant = TheOnlyCase { a: -1 }; - - zzz(); // #break -} - -fn zzz() {()} diff --git a/src/test/debuginfo/tuple-style-enum-legacy.rs b/src/test/debuginfo/tuple-style-enum-legacy.rs deleted file mode 100644 index ebc8e03443..0000000000 --- a/src/test/debuginfo/tuple-style-enum-legacy.rs +++ /dev/null @@ -1,105 +0,0 @@ -// ignore-tidy-linelength -// min-lldb-version: 310 - -// As long as LLVM 5 and LLVM 6 are supported, we want to test the -// enum debuginfo fallback mode. Once those are desupported, this -// test can be removed, as there is another (non-"legacy") test that -// tests the new mode. -// ignore-llvm-version: 7.0 - 9.9.9 -// ignore-gdb-version: 7.11.90 - 7.12.9 -// ignore-gdb-version: 8.2 - 9.9 - -// compile-flags:-g - -// === GDB TESTS =================================================================================== - -// gdb-command:set print union on -// gdb-command:run - -// gdb-command:print case1 -// gdbg-check:$1 = {{RUST$ENUM$DISR = Case1, __0 = 0, __1 = 31868, __2 = 31868, __3 = 31868, __4 = 31868}, {RUST$ENUM$DISR = Case1, [...]}, {RUST$ENUM$DISR = Case1, [...]}} -// gdbr-check:$1 = tuple_style_enum_legacy::Regular::Case1(0, 31868, 31868, 31868, 31868) - -// gdb-command:print case2 -// gdbg-check:$2 = {{RUST$ENUM$DISR = Case2, [...]}, {RUST$ENUM$DISR = Case2, __0 = 0, __1 = 286331153, __2 = 286331153}, {RUST$ENUM$DISR = Case2, [...]}} -// gdbr-check:$2 = tuple_style_enum_legacy::Regular::Case2(0, 286331153, 286331153) - -// gdb-command:print case3 -// gdbg-check:$3 = {{RUST$ENUM$DISR = Case3, [...]}, {RUST$ENUM$DISR = Case3, [...]}, {RUST$ENUM$DISR = Case3, __0 = 0, __1 = 6438275382588823897}} -// gdbr-check:$3 = tuple_style_enum_legacy::Regular::Case3(0, 6438275382588823897) - -// gdb-command:print univariant -// gdbg-check:$4 = {{__0 = -1}} -// gdbr-check:$4 = tuple_style_enum_legacy::Univariant::TheOnlyCase(-1) - - -// === LLDB TESTS ================================================================================== - -// lldb-command:run - -// lldb-command:print case1 -// lldbg-check:[...]$0 = Case1(0, 31868, 31868, 31868, 31868) -// lldbr-check:(tuple_style_enum_legacy::Regular::Case1) case1 = { = 0 = 31868 = 31868 = 31868 = 31868 } - -// lldb-command:print case2 -// lldbg-check:[...]$1 = Case2(0, 286331153, 286331153) -// lldbr-check:(tuple_style_enum_legacy::Regular::Case2) case2 = Case2 { tuple_style_enum_legacy::Regular::Case1: 0, tuple_style_enum_legacy::Regular::Case2: 286331153, tuple_style_enum_legacy::Regular::Case3: 286331153 } - -// lldb-command:print case3 -// lldbg-check:[...]$2 = Case3(0, 6438275382588823897) -// lldbr-check:(tuple_style_enum_legacy::Regular::Case3) case3 = Case3 { tuple_style_enum_legacy::Regular::Case1: 0, tuple_style_enum_legacy::Regular::Case2: 6438275382588823897 } - -// lldb-command:print univariant -// lldbg-check:[...]$3 = TheOnlyCase(-1) -// lldbr-check:(tuple_style_enum_legacy::Univariant) univariant = { tuple_style_enum_legacy::TheOnlyCase = { = -1 } } - -#![allow(unused_variables)] -#![feature(omit_gdb_pretty_printer_section)] -#![omit_gdb_pretty_printer_section] - -use self::Regular::{Case1, Case2, Case3}; -use self::Univariant::TheOnlyCase; - -// The first element is to ensure proper alignment, irrespective of the machines word size. Since -// the size of the discriminant value is machine dependent, this has be taken into account when -// datatype layout should be predictable as in this case. -enum Regular { - Case1(u64, u16, u16, u16, u16), - Case2(u64, u32, u32), - Case3(u64, u64) -} - -enum Univariant { - TheOnlyCase(i64) -} - -fn main() { - - // In order to avoid endianness trouble all of the following test values consist of a single - // repeated byte. This way each interpretation of the union should look the same, no matter if - // this is a big or little endian machine. - - // 0b0111110001111100011111000111110001111100011111000111110001111100 = 8970181431921507452 - // 0b01111100011111000111110001111100 = 2088533116 - // 0b0111110001111100 = 31868 - // 0b01111100 = 124 - let case1 = Case1(0, 31868, 31868, 31868, 31868); - - // 0b0001000100010001000100010001000100010001000100010001000100010001 = 1229782938247303441 - // 0b00010001000100010001000100010001 = 286331153 - // 0b0001000100010001 = 4369 - // 0b00010001 = 17 - let case2 = Case2(0, 286331153, 286331153); - - // 0b0101100101011001010110010101100101011001010110010101100101011001 = 6438275382588823897 - // 0b01011001010110010101100101011001 = 1499027801 - // 0b0101100101011001 = 22873 - // 0b01011001 = 89 - let case3 = Case3(0, 6438275382588823897); - - let univariant = TheOnlyCase(-1); - - zzz(); // #break -} - -fn zzz() {()} diff --git a/src/test/debuginfo/unique-enum-legacy.rs b/src/test/debuginfo/unique-enum-legacy.rs deleted file mode 100644 index e7c9357752..0000000000 --- a/src/test/debuginfo/unique-enum-legacy.rs +++ /dev/null @@ -1,88 +0,0 @@ -// ignore-tidy-linelength -// min-lldb-version: 310 - -// As long as LLVM 5 and LLVM 6 are supported, we want to test the -// enum debuginfo fallback mode. Once those are desupported, this -// test can be removed, as there is another (non-"legacy") test that -// tests the new mode. -// ignore-llvm-version: 7.0 - 9.9.9 -// ignore-gdb-version: 7.11.90 - 7.12.9 -// ignore-gdb-version: 8.2 - 9.9 - -// compile-flags:-g - -// === GDB TESTS =================================================================================== - -// gdb-command:run - -// gdb-command:print *the_a -// gdbg-check:$1 = {{RUST$ENUM$DISR = TheA, x = 0, y = 8970181431921507452}, {RUST$ENUM$DISR = TheA, [...]}} -// gdbr-check:$1 = unique_enum_legacy::ABC::TheA{x: 0, y: 8970181431921507452} - -// gdb-command:print *the_b -// gdbg-check:$2 = {{RUST$ENUM$DISR = TheB, [...]}, {RUST$ENUM$DISR = TheB, __0 = 0, __1 = 286331153, __2 = 286331153}} -// gdbr-check:$2 = unique_enum_legacy::ABC::TheB(0, 286331153, 286331153) - -// gdb-command:print *univariant -// gdbg-check:$3 = {{__0 = 123234}} -// gdbr-check:$3 = unique_enum_legacy::Univariant::TheOnlyCase(123234) - - -// === LLDB TESTS ================================================================================== - -// lldb-command:run - -// lldb-command:print *the_a -// lldbg-check:[...]$0 = TheA { x: 0, y: 8970181431921507452 } -// lldbr-check:(unique_enum_legacy::ABC::TheA) *the_a = TheA { unique_enum_legacy::ABC::TheA: 0, unique_enum_legacy::ABC::TheB: 8970181431921507452 } - -// lldb-command:print *the_b -// lldbg-check:[...]$1 = TheB(0, 286331153, 286331153) -// lldbr-check:(unique_enum_legacy::ABC::TheB) *the_b = { = 0 = 286331153 = 286331153 } - -// lldb-command:print *univariant -// lldbg-check:[...]$2 = TheOnlyCase(123234) -// lldbr-check:(unique_enum_legacy::Univariant) *univariant = { unique_enum_legacy::TheOnlyCase = { = 123234 } } - -#![allow(unused_variables)] -#![feature(box_syntax)] -#![feature(omit_gdb_pretty_printer_section)] -#![omit_gdb_pretty_printer_section] - -// The first element is to ensure proper alignment, irrespective of the machines word size. Since -// the size of the discriminant value is machine dependent, this has be taken into account when -// datatype layout should be predictable as in this case. -enum ABC { - TheA { x: i64, y: i64 }, - TheB (i64, i32, i32), -} - -// This is a special case since it does not have the implicit discriminant field. -enum Univariant { - TheOnlyCase(i64) -} - -fn main() { - - // In order to avoid endianness trouble all of the following test values consist of a single - // repeated byte. This way each interpretation of the union should look the same, no matter if - // this is a big or little endian machine. - - // 0b0111110001111100011111000111110001111100011111000111110001111100 = 8970181431921507452 - // 0b01111100011111000111110001111100 = 2088533116 - // 0b0111110001111100 = 31868 - // 0b01111100 = 124 - let the_a: Box<_> = box ABC::TheA { x: 0, y: 8970181431921507452 }; - - // 0b0001000100010001000100010001000100010001000100010001000100010001 = 1229782938247303441 - // 0b00010001000100010001000100010001 = 286331153 - // 0b0001000100010001 = 4369 - // 0b00010001 = 17 - let the_b: Box<_> = box ABC::TheB (0, 286331153, 286331153); - - let univariant: Box<_> = box Univariant::TheOnlyCase(123234); - - zzz(); // #break -} - -fn zzz() {()} diff --git a/src/test/incremental/change_implementation_cross_crate/auxiliary/a.rs b/src/test/incremental/change_implementation_cross_crate/auxiliary/a.rs new file mode 100644 index 0000000000..7320a97b99 --- /dev/null +++ b/src/test/incremental/change_implementation_cross_crate/auxiliary/a.rs @@ -0,0 +1,31 @@ +#![allow(warnings)] +#![crate_name = "a"] +#![crate_type = "rlib"] + +#[cfg(rpass1)] +#[inline(never)] +pub fn foo(b: u8) -> u32 { + b as u32 +} + +#[cfg(rpass2)] +#[inline(never)] +pub fn foo(b: u8) -> u32 { + (b + 42) as u32 +} + +pub fn bar(b: u8) -> u32 { + bar_impl(b) as u32 +} + +#[cfg(rpass1)] +#[inline(never)] +fn bar_impl(b: u8) -> u16 { + b as u16 +} + +#[cfg(rpass2)] +#[inline(never)] +fn bar_impl(b: u8) -> u32 { + (b + 42) as u32 +} diff --git a/src/test/incremental/change_implementation_cross_crate/main.rs b/src/test/incremental/change_implementation_cross_crate/main.rs new file mode 100644 index 0000000000..dee9ebd74a --- /dev/null +++ b/src/test/incremental/change_implementation_cross_crate/main.rs @@ -0,0 +1,20 @@ +// Test that we are able to reuse `main` despite the changes in the implementation of `foo` and +// `bar`. + +// revisions: rpass1 rpass2 +// aux-build: a.rs +// compile-flags: -Zquery-dep-graph + +#![feature(rustc_attrs)] +#![crate_type = "bin"] +#![rustc_partition_reused(module = "main", cfg = "rpass2")] + +extern crate a; + +pub fn main() { + let vec: Vec<u8> = vec![0, 1, 2, 3]; + for b in vec { + println!("{}", a::foo(b)); + println!("{}", a::bar(b)); + } +} diff --git a/src/test/incremental/thinlto/cgu_invalidated_when_import_added.rs b/src/test/incremental/thinlto/cgu_invalidated_when_import_added.rs new file mode 100644 index 0000000000..42168dd273 --- /dev/null +++ b/src/test/incremental/thinlto/cgu_invalidated_when_import_added.rs @@ -0,0 +1,62 @@ +// revisions: cfail1 cfail2 +// compile-flags: -O -Zhuman-readable-cgu-names -Cllvm-args=-import-instr-limit=10 +// build-pass + +// rust-lang/rust#59535: +// +// This is analgous to cgu_invalidated_when_import_removed.rs, but it covers +// the other direction: +// +// We start with a call-graph like `[A] -> [B -> D] [C]` (where the letters are +// functions and the modules are enclosed in `[]`), and add a new call `D <- C`, +// yielding the new call-graph: `[A] -> [B -> D] <- [C]` +// +// The effect of this is that the compiler previously classfied `D` as internal +// and the import-set of `[A]` to be just `B`. But after adding the `D <- C` call, +// `D` is no longer classified as internal, and the import-set of `[A]` becomes +// both `B` and `D`. +// +// We check this case because an early proposed pull request included an +// assertion that the import-sets monotonically decreased over time, a claim +// which this test case proves to be false. + +fn main() { + foo::foo(); + bar::baz(); +} + +mod foo { + + // In cfail1, ThinLTO decides that foo() does not get inlined into main, and + // instead bar() gets inlined into foo(). + // In cfail2, foo() gets inlined into main. + pub fn foo(){ + bar() + } + + // This function needs to be big so that it does not get inlined by ThinLTO + // but *does* get inlined into foo() when it is declared `internal` in + // cfail1 (alone). + pub fn bar(){ + println!("quux1"); + println!("quux2"); + println!("quux3"); + println!("quux4"); + println!("quux5"); + println!("quux6"); + println!("quux7"); + println!("quux8"); + println!("quux9"); + } +} + +mod bar { + + #[inline(never)] + pub fn baz() { + #[cfg(cfail2)] + { + crate::foo::bar(); + } + } +} diff --git a/src/test/incremental/thinlto/cgu_invalidated_when_import_removed.rs b/src/test/incremental/thinlto/cgu_invalidated_when_import_removed.rs new file mode 100644 index 0000000000..19ce7b3e14 --- /dev/null +++ b/src/test/incremental/thinlto/cgu_invalidated_when_import_removed.rs @@ -0,0 +1,74 @@ +// revisions: cfail1 cfail2 +// compile-flags: -O -Zhuman-readable-cgu-names -Cllvm-args=-import-instr-limit=10 +// build-pass + +// rust-lang/rust#59535: +// +// Consider a call-graph like `[A] -> [B -> D] <- [C]` (where the letters are +// functions and the modules are enclosed in `[]`) +// +// In our specific instance, the earlier compilations were inlining the call +// to`B` into `A`; thus `A` ended up with a external reference to the symbol `D` +// in its object code, to be resolved at subsequent link time. The LTO import +// information provided by LLVM for those runs reflected that information: it +// explicitly says during those runs, `B` definition and `D` declaration were +// imported into `[A]`. +// +// The change between incremental builds was that the call `D <- C` was removed. +// +// That change, coupled with other decisions within `rustc`, made the compiler +// decide to make `D` an internal symbol (since it was no longer accessed from +// other codegen units, this makes sense locally). And then the definition of +// `D` was inlined into `B` and `D` itself was eliminated entirely. +// +// The current LTO import information reported that `B` alone is imported into +// `[A]` for the *current compilation*. So when the Rust compiler surveyed the +// dependence graph, it determined that nothing `[A]` imports changed since the +// last build (and `[A]` itself has not changed either), so it chooses to reuse +// the object code generated during the previous compilation. +// +// But that previous object code has an unresolved reference to `D`, and that +// causes a link time failure! + +fn main() { + foo::foo(); + bar::baz(); +} + +mod foo { + + // In cfail1, foo() gets inlined into main. + // In cfail2, ThinLTO decides that foo() does not get inlined into main, and + // instead bar() gets inlined into foo(). But faulty logic in our incr. + // ThinLTO implementation thought that `main()` is unchanged and thus reused + // the object file still containing a call to the now non-existant bar(). + pub fn foo(){ + bar() + } + + // This function needs to be big so that it does not get inlined by ThinLTO + // but *does* get inlined into foo() once it is declared `internal` in + // cfail2. + pub fn bar(){ + println!("quux1"); + println!("quux2"); + println!("quux3"); + println!("quux4"); + println!("quux5"); + println!("quux6"); + println!("quux7"); + println!("quux8"); + println!("quux9"); + } +} + +mod bar { + + #[inline(never)] + pub fn baz() { + #[cfg(cfail1)] + { + crate::foo::bar(); + } + } +} diff --git a/src/test/mir-opt/address-of.rs b/src/test/mir-opt/address-of.rs new file mode 100644 index 0000000000..bbd1ca68a8 --- /dev/null +++ b/src/test/mir-opt/address-of.rs @@ -0,0 +1,112 @@ +fn address_of_reborrow() { + let y = &[0; 10]; + let mut z = &mut [0; 10]; + + y as *const _; + y as *const [i32; 10]; + y as *const dyn Send; + y as *const [i32]; + y as *const i32; // This is a cast, not a coercion + + let p: *const _ = y; + let p: *const [i32; 10] = y; + let p: *const dyn Send = y; + let p: *const [i32] = y; + + z as *const _; + z as *const [i32; 10]; + z as *const dyn Send; + z as *const [i32]; + + let p: *const _ = z; + let p: *const [i32; 10] = z; + let p: *const dyn Send = z; + let p: *const [i32] = z; + + z as *mut _; + z as *mut [i32; 10]; + z as *mut dyn Send; + z as *mut [i32]; + + let p: *mut _ = z; + let p: *mut [i32; 10] = z; + let p: *mut dyn Send = z; + let p: *mut [i32] = z; +} + +// The normal borrows here should be preserved +fn borrow_and_cast(mut x: i32) { + let p = &x as *const i32; + let q = &mut x as *const i32; + let r = &mut x as *mut i32; +} + +fn main() {} + +// START rustc.address_of_reborrow.SimplifyCfg-initial.after.mir +// bb0: { +// ... +// _5 = &raw const (*_1); // & to *const casts +// ... +// _7 = &raw const (*_1); +// ... +// _11 = &raw const (*_1); +// ... +// _14 = &raw const (*_1); +// ... +// _16 = &raw const (*_1); +// ... +// _17 = &raw const (*_1); // & to *const coercions +// ... +// _18 = &raw const (*_1); +// ... +// _20 = &raw const (*_1); +// ... +// _22 = &raw const (*_1); +// ... +// _24 = &raw const (*_2); // &mut to *const casts +// ... +// _26 = &raw const (*_2); +// ... +// _30 = &raw const (*_2); +// ... +// _33 = &raw const (*_2); +// ... +// _34 = &raw const (*_2); // &mut to *const coercions +// ... +// _35 = &raw const (*_2); +// ... +// _37 = &raw const (*_2); +// ... +// _39 = &raw const (*_2); +// ... +// _41 = &raw mut (*_2); // &mut to *mut casts +// ... +// _43 = &raw mut (*_2); +// ... +// _47 = &raw mut (*_2); +// ... +// _50 = &raw mut (*_2); +// ... +// _51 = &raw mut (*_2); // &mut to *mut coercions +// ... +// _52 = &raw mut (*_2); +// ... +// _54 = &raw mut (*_2); +// ... +// _56 = &raw mut (*_2); +// ... +// } +// END rustc.address_of_reborrow.SimplifyCfg-initial.after.mir + +// START rustc.borrow_and_cast.EraseRegions.after.mir +// bb0: { +// ... +// _4 = &_1; +// ... +// _7 = &mut _1; +// ... +// _10 = &mut _1; +// ... +// } +// END rustc.borrow_and_cast.EraseRegions.after.mir diff --git a/src/test/mir-opt/array-index-is-temporary.rs b/src/test/mir-opt/array-index-is-temporary.rs index 00a6b26d0c..096f98bade 100644 --- a/src/test/mir-opt/array-index-is-temporary.rs +++ b/src/test/mir-opt/array-index-is-temporary.rs @@ -18,24 +18,23 @@ fn main() { // START rustc.main.EraseRegions.after.mir // bb0: { // ... -// _5 = &mut _2; -// _4 = &mut (*_5); -// _3 = move _4 as *mut usize (Misc); +// _4 = &mut _2; +// _3 = &raw mut (*_4); // ... -// _7 = _3; -// _6 = const foo(move _7) -> bb1; +// _6 = _3; +// _5 = const foo(move _6) -> bb1; // } // // bb1: { // ... -// _8 = _2; -// _9 = Len(_1); -// _10 = Lt(_8, _9); -// assert(move _10, "index out of bounds: the len is move _9 but the index is _8") -> bb2; +// _7 = _2; +// _8 = Len(_1); +// _9 = Lt(_7, _8); +// assert(move _9, "index out of bounds: the len is move _8 but the index is _7") -> bb2; // } // // bb2: { -// _1[_8] = move _6; +// _1[_7] = move _5; // ... // return; // } diff --git a/src/test/mir-opt/const-promotion-extern-static.rs b/src/test/mir-opt/const-promotion-extern-static.rs index d611ec22c3..f6f7d09109 100644 --- a/src/test/mir-opt/const-promotion-extern-static.rs +++ b/src/test/mir-opt/const-promotion-extern-static.rs @@ -14,7 +14,7 @@ fn main() {} // START rustc.FOO.PromoteTemps.before.mir // bb0: { // ... -// _5 = const Scalar(AllocId(1).0x0) : &i32; +// _5 = const Scalar(alloc1+0) : &i32; // _4 = &(*_5); // _3 = [move _4]; // _2 = &_3; @@ -31,7 +31,7 @@ fn main() {} // START rustc.BAR.PromoteTemps.before.mir // bb0: { // ... -// _5 = const Scalar(AllocId(0).0x0) : &i32; +// _5 = const Scalar(alloc0+0) : &i32; // _4 = &(*_5); // _3 = [move _4]; // _2 = &_3; @@ -48,7 +48,8 @@ fn main() {} // START rustc.BAR.PromoteTemps.after.mir // bb0: { // ... -// _2 = &(promoted[0]: [&'static i32; 1]); +// _6 = const BAR::promoted[0]; +// _2 = &(*_6); // _1 = move _2 as &[&'static i32] (Pointer(Unsize)); // _0 = const core::slice::<impl [&'static i32]>::as_ptr(move _1) -> [return: bb2, unwind: bb1]; // } @@ -60,7 +61,8 @@ fn main() {} // START rustc.FOO.PromoteTemps.after.mir // bb0: { // ... -// _2 = &(promoted[0]: [&'static i32; 1]); +// _6 = const FOO::promoted[0]; +// _2 = &(*_6); // _1 = move _2 as &[&'static i32] (Pointer(Unsize)); // _0 = const core::slice::<impl [&'static i32]>::as_ptr(move _1) -> [return: bb2, unwind: bb1]; // } diff --git a/src/test/mir-opt/const_prop/aggregate.rs b/src/test/mir-opt/const_prop/aggregate.rs index 0937d37be6..d04dcc6a05 100644 --- a/src/test/mir-opt/const_prop/aggregate.rs +++ b/src/test/mir-opt/const_prop/aggregate.rs @@ -19,7 +19,7 @@ fn main() { // ... // _3 = (const 0i32, const 1i32, const 2i32); // _2 = const 1i32; -// _1 = Add(move _2, const 0i32); +// _1 = const 1i32; // ... // } // END rustc.main.ConstProp.after.mir diff --git a/src/test/mir-opt/const_prop/array_index.rs b/src/test/mir-opt/const_prop/array_index.rs index dd22eb5d60..406585b5ca 100644 --- a/src/test/mir-opt/const_prop/array_index.rs +++ b/src/test/mir-opt/const_prop/array_index.rs @@ -26,7 +26,7 @@ fn main() { // assert(const true, "index out of bounds: the len is move _4 but the index is _3") -> bb1; // } // bb1: { -// _1 = _2[_3]; +// _1 = const 2u32; // ... // return; // } diff --git a/src/test/mir-opt/const_prop/cast.rs b/src/test/mir-opt/const_prop/cast.rs new file mode 100644 index 0000000000..9cfbfebdcc --- /dev/null +++ b/src/test/mir-opt/const_prop/cast.rs @@ -0,0 +1,49 @@ +fn main() { + let x = 42u8 as u32; + + let y = 42u32 as u8; +} + +// END RUST SOURCE +// START rustc.main.ConstProp.before.mir +// let mut _0: (); +// let _1: u32; +// scope 1 { +// debug x => _1; +// let _2: u8; +// scope 2 { +// debug y => _2; +// } +// } +// bb0: { +// StorageLive(_1); +// _1 = const 42u8 as u32 (Misc); +// StorageLive(_2); +// _2 = const 42u32 as u8 (Misc); +// _0 = (); +// StorageDead(_2); +// StorageDead(_1); +// return; +// } +// END rustc.main.ConstProp.before.mir +// START rustc.main.ConstProp.after.mir +// let mut _0: (); +// let _1: u32; +// scope 1 { +// debug x => _1; +// let _2: u8; +// scope 2 { +// debug y => _2; +// } +// } +// bb0: { +// StorageLive(_1); +// _1 = const 42u32; +// StorageLive(_2); +// _2 = const 42u8; +// _0 = (); +// StorageDead(_2); +// StorageDead(_1); +// return; +// } +// END rustc.main.ConstProp.after.mir diff --git a/src/test/mir-opt/const_prop/const_prop_fails_gracefully.rs b/src/test/mir-opt/const_prop/const_prop_fails_gracefully.rs index 3f82b81a47..3c8c0ff449 100644 --- a/src/test/mir-opt/const_prop/const_prop_fails_gracefully.rs +++ b/src/test/mir-opt/const_prop/const_prop_fails_gracefully.rs @@ -11,25 +11,21 @@ fn main() { // START rustc.main.ConstProp.before.mir // bb0: { // ... -// _3 = _4; -// _2 = move _3 as *const i32 (Misc); -// ... +// _2 = &raw const (*_3); // _1 = move _2 as usize (Misc); // ... -// _6 = _1; -// _5 = const read(move _6) -> bb1; +// _5 = _1; +// _4 = const read(move _5) -> bb1; // } // END rustc.main.ConstProp.before.mir // START rustc.main.ConstProp.after.mir // bb0: { // ... -// _4 = const main::FOO; -// _3 = _4; -// _2 = move _3 as *const i32 (Misc); -// ... +// _3 = const main::FOO; +// _2 = &raw const (*_3); // _1 = move _2 as usize (Misc); // ... -// _6 = _1; -// _5 = const read(move _6) -> bb1; +// _5 = _1; +// _4 = const read(move _5) -> bb1; // } // END rustc.main.ConstProp.after.mir diff --git a/src/test/mir-opt/const_prop/optimizes_into_variable.rs b/src/test/mir-opt/const_prop/optimizes_into_variable.rs new file mode 100644 index 0000000000..93a53db909 --- /dev/null +++ b/src/test/mir-opt/const_prop/optimizes_into_variable.rs @@ -0,0 +1,149 @@ +// compile-flags: -C overflow-checks=on + +struct Point { + x: u32, + y: u32, +} + +fn main() { + let x = 2 + 2; + let y = [0, 1, 2, 3, 4, 5][3]; + let z = (Point { x: 12, y: 42}).y; +} + +// END RUST SOURCE +// START rustc.main.ConstProp.before.mir +// let mut _0: (); +// let _1: i32; +// let mut _2: (i32, bool); +// let mut _4: [i32; 6]; +// let _5: usize; +// let mut _6: usize; +// let mut _7: bool; +// let mut _9: Point; +// scope 1 { +// debug x => _1; +// let _3: i32; +// scope 2 { +// debug y => _3; +// let _8: u32; +// scope 3 { +// debug z => _8; +// } +// } +// } +// bb0: { +// StorageLive(_1); +// _2 = CheckedAdd(const 2i32, const 2i32); +// assert(!move (_2.1: bool), "attempt to add with overflow") -> bb1; +// } +// bb1: { +// _1 = move (_2.0: i32); +// StorageLive(_3); +// StorageLive(_4); +// _4 = [const 0i32, const 1i32, const 2i32, const 3i32, const 4i32, const 5i32]; +// StorageLive(_5); +// _5 = const 3usize; +// _6 = const 6usize; +// _7 = Lt(_5, _6); +// assert(move _7, "index out of bounds: the len is move _6 but the index is _5") -> bb2; +// } +// bb2: { +// _3 = _4[_5]; +// StorageDead(_5); +// StorageDead(_4); +// StorageLive(_8); +// StorageLive(_9); +// _9 = Point { x: const 12u32, y: const 42u32 }; +// _8 = (_9.1: u32); +// StorageDead(_9); +// _0 = (); +// StorageDead(_8); +// StorageDead(_3); +// StorageDead(_1); +// return; +// } +// END rustc.main.ConstProp.before.mir +// START rustc.main.ConstProp.after.mir +// let mut _0: (); +// let _1: i32; +// let mut _2: (i32, bool); +// let mut _4: [i32; 6]; +// let _5: usize; +// let mut _6: usize; +// let mut _7: bool; +// let mut _9: Point; +// scope 1 { +// debug x => _1; +// let _3: i32; +// scope 2 { +// debug y => _3; +// let _8: u32; +// scope 3 { +// debug z => _8; +// } +// } +// } +// bb0: { +// StorageLive(_1); +// _2 = (const 4i32, const false); +// assert(!const false, "attempt to add with overflow") -> bb1; +// } +// bb1: { +// _1 = const 4i32; +// StorageLive(_3); +// StorageLive(_4); +// _4 = [const 0i32, const 1i32, const 2i32, const 3i32, const 4i32, const 5i32]; +// StorageLive(_5); +// _5 = const 3usize; +// _6 = const 6usize; +// _7 = const true; +// assert(const true, "index out of bounds: the len is move _6 but the index is _5") -> bb2; +// } +// bb2: { +// _3 = const 3i32; +// StorageDead(_5); +// StorageDead(_4); +// StorageLive(_8); +// StorageLive(_9); +// _9 = Point { x: const 12u32, y: const 42u32 }; +// _8 = const 42u32; +// StorageDead(_9); +// _0 = (); +// StorageDead(_8); +// StorageDead(_3); +// StorageDead(_1); +// return; +// } +// END rustc.main.ConstProp.after.mir +// START rustc.main.SimplifyLocals.after.mir +// let mut _0: (); +// let _1: i32; +// let mut _3: [i32; 6]; +// scope 1 { +// debug x => _1; +// let _2: i32; +// scope 2 { +// debug y => _2; +// let _4: u32; +// scope 3 { +// debug z => _4; +// } +// } +// } +// bb0: { +// StorageLive(_1); +// _1 = const 4i32; +// StorageLive(_2); +// StorageLive(_3); +// _3 = [const 0i32, const 1i32, const 2i32, const 3i32, const 4i32, const 5i32]; +// _2 = const 3i32; +// StorageDead(_3); +// StorageLive(_4); +// _4 = const 42u32; +// StorageDead(_4); +// StorageDead(_2); +// StorageDead(_1); +// return; +// } +// END rustc.main.SimplifyLocals.after.mir diff --git a/src/test/mir-opt/const_prop/read_immutable_static.rs b/src/test/mir-opt/const_prop/read_immutable_static.rs index d14ec03971..693ef78398 100644 --- a/src/test/mir-opt/const_prop/read_immutable_static.rs +++ b/src/test/mir-opt/const_prop/read_immutable_static.rs @@ -10,10 +10,10 @@ fn main() { // START rustc.main.ConstProp.before.mir // bb0: { // ... -// _3 = const Scalar(AllocId(0).0x0) : &u8; +// _3 = const Scalar(alloc0+0) : &u8; // _2 = (*_3); // ... -// _5 = const Scalar(AllocId(0).0x0) : &u8; +// _5 = const Scalar(alloc0+0) : &u8; // _4 = (*_5); // _1 = Add(move _2, move _4); // ... @@ -25,7 +25,7 @@ fn main() { // _2 = const 2u8; // ... // _4 = const 2u8; -// _1 = Add(move _2, move _4); +// _1 = const 4u8; // ... // } // END rustc.main.ConstProp.after.mir diff --git a/src/test/mir-opt/const_prop/ref_deref.rs b/src/test/mir-opt/const_prop/ref_deref.rs index d45ffdc877..8b48296a5d 100644 --- a/src/test/mir-opt/const_prop/ref_deref.rs +++ b/src/test/mir-opt/const_prop/ref_deref.rs @@ -3,10 +3,29 @@ fn main() { } // END RUST SOURCE +// START rustc.main.PromoteTemps.before.mir +// bb0: { +// ... +// _3 = const 4i32; +// _2 = &_3; +// _1 = (*_2); +// ... +//} +// END rustc.main.PromoteTemps.before.mir +// START rustc.main.PromoteTemps.after.mir +// bb0: { +// ... +// _4 = const main::promoted[0]; +// _2 = &(*_4); +// _1 = (*_2); +// ... +//} +// END rustc.main.PromoteTemps.after.mir // START rustc.main.ConstProp.before.mir // bb0: { // ... -// _2 = &(promoted[0]: i32); +// _4 = const main::promoted[0]; +// _2 = _4; // _1 = (*_2); // ... //} @@ -14,7 +33,8 @@ fn main() { // START rustc.main.ConstProp.after.mir // bb0: { // ... -// _2 = &(promoted[0]: i32); +// _4 = const main::promoted[0]; +// _2 = _4; // _1 = const 4i32; // ... // } diff --git a/src/test/mir-opt/const_prop/ref_deref_project.rs b/src/test/mir-opt/const_prop/ref_deref_project.rs new file mode 100644 index 0000000000..ca539fb746 --- /dev/null +++ b/src/test/mir-opt/const_prop/ref_deref_project.rs @@ -0,0 +1,41 @@ +fn main() { + *(&(4, 5).1); // This does not currently propagate (#67862) +} + +// END RUST SOURCE +// START rustc.main.PromoteTemps.before.mir +// bb0: { +// ... +// _3 = (const 4i32, const 5i32); +// _2 = &(_3.1: i32); +// _1 = (*_2); +// ... +//} +// END rustc.main.PromoteTemps.before.mir +// START rustc.main.PromoteTemps.after.mir +// bb0: { +// ... +// _4 = const main::promoted[0]; +// _2 = &((*_4).1: i32); +// _1 = (*_2); +// ... +//} +// END rustc.main.PromoteTemps.after.mir +// START rustc.main.ConstProp.before.mir +// bb0: { +// ... +// _4 = const main::promoted[0]; +// _2 = &((*_4).1: i32); +// _1 = (*_2); +// ... +//} +// END rustc.main.ConstProp.before.mir +// START rustc.main.ConstProp.after.mir +// bb0: { +// ... +// _4 = const main::promoted[0]; +// _2 = &((*_4).1: i32); +// _1 = (*_2); +// ... +// } +// END rustc.main.ConstProp.after.mir diff --git a/src/test/mir-opt/const_prop/repeat.rs b/src/test/mir-opt/const_prop/repeat.rs index fb091ad2a3..48c06290ce 100644 --- a/src/test/mir-opt/const_prop/repeat.rs +++ b/src/test/mir-opt/const_prop/repeat.rs @@ -30,7 +30,7 @@ fn main() { // } // bb1: { // _2 = const 42u32; -// _1 = Add(move _2, const 0u32); +// _1 = const 42u32; // ... // return; // } diff --git a/src/test/mir-opt/const_prop/slice_len.rs b/src/test/mir-opt/const_prop/slice_len.rs index d6ff76b34b..43813e43d3 100644 --- a/src/test/mir-opt/const_prop/slice_len.rs +++ b/src/test/mir-opt/const_prop/slice_len.rs @@ -6,7 +6,8 @@ fn main() { // START rustc.main.ConstProp.before.mir // bb0: { // ... -// _4 = &(promoted[0]: [u32; 3]); +// _9 = const main::promoted[0]; +// _4 = _9; // _3 = _4; // _2 = move _3 as &[u32] (Pointer(Unsize)); // ... @@ -24,7 +25,8 @@ fn main() { // START rustc.main.ConstProp.after.mir // bb0: { // ... -// _4 = &(promoted[0]: [u32; 3]); +// _9 = const main::promoted[0]; +// _4 = _9; // _3 = _4; // _2 = move _3 as &[u32] (Pointer(Unsize)); // ... diff --git a/src/test/mir-opt/inline-any-operand.rs b/src/test/mir-opt/inline/inline-any-operand.rs similarity index 100% rename from src/test/mir-opt/inline-any-operand.rs rename to src/test/mir-opt/inline/inline-any-operand.rs diff --git a/src/test/mir-opt/inline-closure-borrows-arg.rs b/src/test/mir-opt/inline/inline-closure-borrows-arg.rs similarity index 100% rename from src/test/mir-opt/inline-closure-borrows-arg.rs rename to src/test/mir-opt/inline/inline-closure-borrows-arg.rs diff --git a/src/test/mir-opt/inline-closure-captures.rs b/src/test/mir-opt/inline/inline-closure-captures.rs similarity index 100% rename from src/test/mir-opt/inline-closure-captures.rs rename to src/test/mir-opt/inline/inline-closure-captures.rs diff --git a/src/test/mir-opt/inline-closure.rs b/src/test/mir-opt/inline/inline-closure.rs similarity index 100% rename from src/test/mir-opt/inline-closure.rs rename to src/test/mir-opt/inline/inline-closure.rs diff --git a/src/test/mir-opt/inline/inline-into-box-place.rs b/src/test/mir-opt/inline/inline-into-box-place.rs new file mode 100644 index 0000000000..f368bdef6f --- /dev/null +++ b/src/test/mir-opt/inline/inline-into-box-place.rs @@ -0,0 +1,72 @@ +// ignore-tidy-linelength +// ignore-wasm32-bare compiled with panic=abort by default +// compile-flags: -Z mir-opt-level=3 +#![feature(box_syntax)] + +fn main() { + let _x: Box<Vec<u32>> = box Vec::new(); +} + +// END RUST SOURCE +// START rustc.main.Inline.before.mir +// let mut _0: (); +// let _1: std::boxed::Box<std::vec::Vec<u32>> as UserTypeProjection { base: UserType(0), projs: [] }; +// let mut _2: std::boxed::Box<std::vec::Vec<u32>>; +// let mut _3: (); +// scope 1 { +// debug _x => _1; +// } +// bb0: { +// StorageLive(_1); +// StorageLive(_2); +// _2 = Box(std::vec::Vec<u32>); +// (*_2) = const std::vec::Vec::<u32>::new() -> [return: bb2, unwind: bb4]; +// } +// bb1 (cleanup): { +// resume; +// } +// bb2: { +// _1 = move _2; +// StorageDead(_2); +// _0 = (); +// drop(_1) -> [return: bb3, unwind: bb1]; +// } +// bb3: { +// StorageDead(_1); +// return; +// } +// bb4 (cleanup): { +// _3 = const alloc::alloc::box_free::<std::vec::Vec<u32>>(move (_2.0: std::ptr::Unique<std::vec::Vec<u32>>)) -> bb1; +// } +// END rustc.main.Inline.before.mir +// START rustc.main.Inline.after.mir +// let mut _0: (); +// let _1: std::boxed::Box<std::vec::Vec<u32>> as UserTypeProjection { base: UserType(0), projs: [] }; +// let mut _2: std::boxed::Box<std::vec::Vec<u32>>; +// let mut _3: (); +// let mut _4: &mut std::vec::Vec<u32>; +// scope 1 { +// debug _x => _1; +// } +// scope 2 { +// } +// bb0: { +// StorageLive(_1); +// StorageLive(_2); +// _2 = Box(std::vec::Vec<u32>); +// _4 = &mut (*_2); +// ((*_4).0: alloc::raw_vec::RawVec<u32>) = const alloc::raw_vec::RawVec::<u32>::NEW; +// ((*_4).1: usize) = const 0usize; +// _1 = move _2; +// StorageDead(_2); +// _0 = (); +// drop(_1) -> [return: bb2, unwind: bb1]; +// } +// bb1 (cleanup): { +// resume; +// } +// bb2: { +// StorageDead(_1); +// return; +// } +// END rustc.main.Inline.after.mir diff --git a/src/test/mir-opt/inline-retag.rs b/src/test/mir-opt/inline/inline-retag.rs similarity index 78% rename from src/test/mir-opt/inline-retag.rs rename to src/test/mir-opt/inline/inline-retag.rs index 6cdbcfdb0a..7b78fc339f 100644 --- a/src/test/mir-opt/inline-retag.rs +++ b/src/test/mir-opt/inline/inline-retag.rs @@ -25,11 +25,11 @@ fn foo(x: &i32, y: &i32) -> bool { // ... // Retag(_3); // Retag(_6); -// StorageLive(_9); -// _9 = (*_3); -// StorageLive(_10); -// _10 = (*_6); -// _0 = Eq(move _9, move _10); +// StorageLive(_11); +// _11 = (*_3); +// StorageLive(_12); +// _12 = (*_6); +// _0 = Eq(move _11, move _12); // ... // return; // } diff --git a/src/test/mir-opt/inline/inline-specialization.rs b/src/test/mir-opt/inline/inline-specialization.rs new file mode 100644 index 0000000000..9591019bb4 --- /dev/null +++ b/src/test/mir-opt/inline/inline-specialization.rs @@ -0,0 +1,48 @@ +#![feature(specialization)] + +fn main() { + let x = <Vec::<()> as Foo>::bar(); +} + +trait Foo { + fn bar() -> u32; +} + +impl<T> Foo for Vec<T> { + #[inline(always)] + default fn bar() -> u32 { 123 } +} + +// END RUST SOURCE +// START rustc.main.Inline.before.mir +// let mut _0: (); +// let _1: u32; +// scope 1 { +// debug x => _1; +// } +// bb0: { +// StorageLive(_1); +// _1 = const <std::vec::Vec<()> as Foo>::bar() -> bb1; +// } +// bb1: { +// _0 = (); +// StorageDead(_1); +// return; +// } +// END rustc.main.Inline.before.mir +// START rustc.main.Inline.after.mir +// let mut _0: (); +// let _1: u32; +// scope 1 { +// debug x => _1; +// } +// scope 2 { +// } +// bb0: { +// StorageLive(_1); +// _1 = const 123u32; +// _0 = (); +// StorageDead(_1); +// return; +// } +// END rustc.main.Inline.after.mir diff --git a/src/test/mir-opt/inline-trait-method.rs b/src/test/mir-opt/inline/inline-trait-method.rs similarity index 100% rename from src/test/mir-opt/inline-trait-method.rs rename to src/test/mir-opt/inline/inline-trait-method.rs diff --git a/src/test/mir-opt/inline-trait-method_2.rs b/src/test/mir-opt/inline/inline-trait-method_2.rs similarity index 100% rename from src/test/mir-opt/inline-trait-method_2.rs rename to src/test/mir-opt/inline/inline-trait-method_2.rs diff --git a/src/test/mir-opt/match_false_edges.rs b/src/test/mir-opt/match_false_edges.rs index 648856b552..2c20c35e4a 100644 --- a/src/test/mir-opt/match_false_edges.rs +++ b/src/test/mir-opt/match_false_edges.rs @@ -65,7 +65,8 @@ fn main() { // } // bb6: { // binding1 and guard // StorageLive(_6); -// _6 = &(((promoted[0]: std::option::Option<i32>) as Some).0: i32); +// _11 = const full_tested_match::promoted[0]; +// _6 = &(((*_11) as Some).0: i32); // _4 = &shallow _2; // StorageLive(_7); // _7 = const guard() -> [return: bb7, unwind: bb1]; diff --git a/src/test/mir-opt/retag.rs b/src/test/mir-opt/retag.rs index 32995448a2..1c88a9e4d5 100644 --- a/src/test/mir-opt/retag.rs +++ b/src/test/mir-opt/retag.rs @@ -82,18 +82,16 @@ fn main() { // _10 = move _8; // Retag(_10); // ... -// _13 = &mut (*_10); -// Retag(_13); -// _12 = move _13 as *mut i32 (Misc); +// _12 = &raw mut (*_10); // Retag([raw] _12); // ... -// _16 = move _17(move _18) -> bb5; +// _15 = move _16(move _17) -> bb5; // } // // bb5: { -// Retag(_16); +// Retag(_15); // ... -// _20 = const Test::foo_shr(move _21, move _23) -> [return: bb6, unwind: bb7]; +// _19 = const Test::foo_shr(move _20, move _22) -> [return: bb6, unwind: bb7]; // } // // ... @@ -115,8 +113,8 @@ fn main() { // } // } // END rustc.main-{{closure}}.EraseRegions.after.mir -// START rustc.ptr-real_drop_in_place.Test.SimplifyCfg-make_shim.after.mir -// fn std::ptr::real_drop_in_place(_1: &mut Test) -> () { +// START rustc.ptr-drop_in_place.Test.SimplifyCfg-make_shim.after.mir +// fn std::intrinsics::drop_in_place(_1: *mut Test) -> () { // ... // bb0: { // Retag([raw] _1); @@ -128,4 +126,4 @@ fn main() { // return; // } // } -// END rustc.ptr-real_drop_in_place.Test.SimplifyCfg-make_shim.after.mir +// END rustc.ptr-drop_in_place.Test.SimplifyCfg-make_shim.after.mir diff --git a/src/test/mir-opt/retain-never-const.rs b/src/test/mir-opt/retain-never-const.rs index 04394dcdf1..8e9bae8569 100644 --- a/src/test/mir-opt/retain-never-const.rs +++ b/src/test/mir-opt/retain-never-const.rs @@ -6,6 +6,7 @@ #![feature(const_panic)] #![feature(never_type)] +#![warn(const_err)] struct PrintName<T>(T); diff --git a/src/test/mir-opt/simplify_try.rs b/src/test/mir-opt/simplify_try.rs index 656b405ef3..d85eff45b4 100644 --- a/src/test/mir-opt/simplify_try.rs +++ b/src/test/mir-opt/simplify_try.rs @@ -47,25 +47,22 @@ fn main() { // } // bb0: { // _5 = discriminant(_1); -// switchInt(move _5) -> [0isize: bb4, 1isize: bb2, otherwise: bb1]; +// switchInt(move _5) -> [0isize: bb3, otherwise: bb1]; // } // bb1: { -// unreachable; -// } -// bb2: { // _6 = ((_1 as Err).0: i32); // ((_0 as Err).0: i32) = move _6; // discriminant(_0) = 1; -// goto -> bb3; +// goto -> bb2; // } -// bb3: { +// bb2: { // return; // } -// bb4: { +// bb3: { // _10 = ((_1 as Ok).0: u32); // ((_0 as Ok).0: u32) = move _10; // discriminant(_0) = 0; -// goto -> bb3; +// goto -> bb2; // } // } // END rustc.try_identity.SimplifyArmIdentity.before.mir @@ -109,25 +106,22 @@ fn main() { // } // bb0: { // _5 = discriminant(_1); -// switchInt(move _5) -> [0isize: bb4, 1isize: bb2, otherwise: bb1]; +// switchInt(move _5) -> [0isize: bb3, otherwise: bb1]; // } // bb1: { -// unreachable; -// } -// bb2: { // _0 = move _1; // nop; // nop; -// goto -> bb3; +// goto -> bb2; // } -// bb3: { +// bb2: { // return; // } -// bb4: { +// bb3: { // _0 = move _1; // nop; // nop; -// goto -> bb3; +// goto -> bb2; // } // } // END rustc.try_identity.SimplifyArmIdentity.after.mir diff --git a/src/test/mir-opt/slice-drop-shim.rs b/src/test/mir-opt/slice-drop-shim.rs index f270dec5fe..a25375594d 100644 --- a/src/test/mir-opt/slice-drop-shim.rs +++ b/src/test/mir-opt/slice-drop-shim.rs @@ -6,19 +6,19 @@ fn main() { // END RUST SOURCE -// START rustc.ptr-real_drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir +// START rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir // let mut _2: usize; // let mut _3: usize; // let mut _4: usize; -// let mut _5: &mut std::string::String; +// let mut _5: *mut std::string::String; // let mut _6: bool; -// let mut _7: &mut std::string::String; +// let mut _7: *mut std::string::String; // let mut _8: bool; // let mut _9: *mut std::string::String; // let mut _10: *mut std::string::String; -// let mut _11: &mut std::string::String; +// let mut _11: *mut std::string::String; // let mut _12: bool; -// let mut _13: &mut std::string::String; +// let mut _13: *mut std::string::String; // let mut _14: bool; // let mut _15: *mut [std::string::String]; // bb0: { @@ -31,7 +31,7 @@ fn main() { // resume; // } // bb3 (cleanup): { -// _5 = &mut (*_1)[_4]; +// _5 = &raw mut (*_1)[_4]; // _4 = Add(move _4, const 1usize); // drop((*_5)) -> bb4; // } @@ -40,7 +40,7 @@ fn main() { // switchInt(move _6) -> [false: bb3, otherwise: bb2]; // } // bb5: { -// _7 = &mut (*_1)[_4]; +// _7 = &raw mut (*_1)[_4]; // _4 = Add(move _4, const 1usize); // drop((*_7)) -> [return: bb6, unwind: bb4]; // } @@ -56,7 +56,7 @@ fn main() { // goto -> bb7; // } // bb9 (cleanup): { -// _11 = &mut (*_9); +// _11 = _9; // _9 = Offset(move _9, const 1usize); // drop((*_11)) -> bb10; // } @@ -65,7 +65,7 @@ fn main() { // switchInt(move _12) -> [false: bb9, otherwise: bb2]; // } // bb11: { -// _13 = &mut (*_9); +// _13 = _9; // _9 = Offset(move _9, const 1usize); // drop((*_13)) -> [return: bb12, unwind: bb10]; // } @@ -74,7 +74,7 @@ fn main() { // switchInt(move _14) -> [false: bb11, otherwise: bb1]; // } // bb13: { -// _15 = &mut (*_1); +// _15 = &raw mut (*_1); // _9 = move _15 as *mut std::string::String (Misc); // _10 = Offset(_9, move _3); // goto -> bb12; @@ -87,4 +87,4 @@ fn main() { // _3 = Len((*_1)); // switchInt(move _2) -> [0usize: bb8, otherwise: bb14]; // } -// END rustc.ptr-real_drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir +// END rustc.ptr-drop_in_place.[std__string__String].AddMovesForPackedDrops.before.mir diff --git a/src/test/mir-opt/uniform_array_move_out.rs b/src/test/mir-opt/uniform_array_move_out.rs index f2e1864096..d587d23722 100644 --- a/src/test/mir-opt/uniform_array_move_out.rs +++ b/src/test/mir-opt/uniform_array_move_out.rs @@ -1,5 +1,4 @@ #![feature(box_syntax)] -#![feature(slice_patterns)] fn move_out_from_end() { let a = [box 1, box 2]; diff --git a/src/test/mir-opt/uninhabited_enum_branching.rs b/src/test/mir-opt/uninhabited_enum_branching.rs index aa56918a9b..dda5fd4fb7 100644 --- a/src/test/mir-opt/uninhabited_enum_branching.rs +++ b/src/test/mir-opt/uninhabited_enum_branching.rs @@ -45,53 +45,47 @@ fn main() { // StorageLive(_2); // _2 = Test1::C; // _3 = discriminant(_2); -// switchInt(move _3) -> [0isize: bb3, 1isize: bb4, 2isize: bb1, otherwise: bb2]; +// switchInt(move _3) -> [0isize: bb2, 1isize: bb3, otherwise: bb1]; // } // bb1: { // StorageLive(_5); // _5 = const "C"; // _1 = &(*_5); // StorageDead(_5); -// goto -> bb5; +// goto -> bb4; // } // bb2: { -// unreachable; -// } -// bb3: { // _1 = const "A(Empty)"; -// goto -> bb5; +// goto -> bb4; // } -// bb4: { +// bb3: { // StorageLive(_4); // _4 = const "B(Empty)"; // _1 = &(*_4); // StorageDead(_4); -// goto -> bb5; +// goto -> bb4; // } -// bb5: { +// bb4: { // StorageDead(_2); // StorageDead(_1); // StorageLive(_6); // StorageLive(_7); // _7 = Test2::D; // _8 = discriminant(_7); -// switchInt(move _8) -> [4isize: bb8, 5isize: bb6, otherwise: bb7]; +// switchInt(move _8) -> [4isize: bb6, otherwise: bb5]; // } -// bb6: { +// bb5: { // StorageLive(_9); // _9 = const "E"; // _6 = &(*_9); // StorageDead(_9); -// goto -> bb9; -// } -// bb7: { -// unreachable; +// goto -> bb7; // } -// bb8: { +// bb6: { // _6 = const "D"; -// goto -> bb9; +// goto -> bb7; // } -// bb9: { +// bb7: { // StorageDead(_7); // StorageDead(_6); // _0 = (); @@ -114,53 +108,47 @@ fn main() { // StorageLive(_2); // _2 = Test1::C; // _3 = discriminant(_2); -// switchInt(move _3) -> [2isize: bb1, otherwise: bb2]; +// switchInt(move _3) -> bb1; // } // bb1: { // StorageLive(_5); // _5 = const "C"; // _1 = &(*_5); // StorageDead(_5); -// goto -> bb5; +// goto -> bb4; // } // bb2: { -// unreachable; -// } -// bb3: { // _1 = const "A(Empty)"; -// goto -> bb5; +// goto -> bb4; // } -// bb4: { +// bb3: { // StorageLive(_4); // _4 = const "B(Empty)"; // _1 = &(*_4); // StorageDead(_4); -// goto -> bb5; +// goto -> bb4; // } -// bb5: { +// bb4: { // StorageDead(_2); // StorageDead(_1); // StorageLive(_6); // StorageLive(_7); // _7 = Test2::D; // _8 = discriminant(_7); -// switchInt(move _8) -> [4isize: bb8, 5isize: bb6, otherwise: bb7]; +// switchInt(move _8) -> [4isize: bb6, otherwise: bb5]; // } -// bb6: { +// bb5: { // StorageLive(_9); // _9 = const "E"; // _6 = &(*_9); // StorageDead(_9); -// goto -> bb9; +// goto -> bb7; // } -// bb7: { -// unreachable; -// } -// bb8: { +// bb6: { // _6 = const "D"; -// goto -> bb9; +// goto -> bb7; // } -// bb9: { +// bb7: { // StorageDead(_7); // StorageDead(_6); // _0 = (); @@ -183,9 +171,6 @@ fn main() { // StorageLive(_2); // _2 = Test1::C; // _3 = discriminant(_2); -// switchInt(move _3) -> [2isize: bb1, otherwise: bb2]; -// } -// bb1: { // StorageLive(_5); // _5 = const "C"; // _1 = &(*_5); @@ -196,26 +181,20 @@ fn main() { // StorageLive(_7); // _7 = Test2::D; // _8 = discriminant(_7); -// switchInt(move _8) -> [4isize: bb5, 5isize: bb3, otherwise: bb4]; -// } -// bb2: { -// unreachable; +// switchInt(move _8) -> [4isize: bb2, otherwise: bb1]; // } -// bb3: { +// bb1: { // StorageLive(_9); // _9 = const "E"; // _6 = &(*_9); // StorageDead(_9); -// goto -> bb6; -// } -// bb4: { -// unreachable; +// goto -> bb3; // } -// bb5: { +// bb2: { // _6 = const "D"; -// goto -> bb6; +// goto -> bb3; // } -// bb6: { +// bb3: { // StorageDead(_7); // StorageDead(_6); // _0 = (); diff --git a/src/test/mir-opt/unreachable.rs b/src/test/mir-opt/unreachable.rs new file mode 100644 index 0000000000..fa5c1a074e --- /dev/null +++ b/src/test/mir-opt/unreachable.rs @@ -0,0 +1,78 @@ +enum Empty {} + +fn empty() -> Option<Empty> { + None +} + +fn main() { + if let Some(_x) = empty() { + let mut _y; + + if true { + _y = 21; + } else { + _y = 42; + } + + match _x { } + } +} + +// END RUST SOURCE +// START rustc.main.UnreachablePropagation.before.mir +// bb0: { +// StorageLive(_1); +// _1 = const empty() -> bb1; +// } +// bb1: { +// _2 = discriminant(_1); +// switchInt(move _2) -> [1isize: bb3, otherwise: bb2]; +// } +// bb2: { +// _0 = (); +// StorageDead(_1); +// return; +// } +// bb3: { +// StorageLive(_3); +// _3 = move ((_1 as Some).0: Empty); +// StorageLive(_4); +// StorageLive(_5); +// StorageLive(_6); +// _6 = const true; +// switchInt(_6) -> [false: bb4, otherwise: bb5]; +// } +// bb4: { +// _4 = const 42i32; +// _5 = (); +// goto -> bb6; +// } +// bb5: { +// _4 = const 21i32; +// _5 = (); +// goto -> bb6; +// } +// bb6: { +// StorageDead(_6); +// StorageDead(_5); +// StorageLive(_7); +// unreachable; +// } +// } +// END rustc.main.UnreachablePropagation.before.mir +// START rustc.main.UnreachablePropagation.after.mir +// bb0: { +// StorageLive(_1); +// _1 = const empty() -> bb1; +// } +// bb1: { +// _2 = discriminant(_1); +// goto -> bb2; +// } +// bb2: { +// _0 = (); +// StorageDead(_1); +// return; +// } +// } +// END rustc.main.UnreachablePropagation.after.mir diff --git a/src/test/mir-opt/unreachable_asm.rs b/src/test/mir-opt/unreachable_asm.rs new file mode 100644 index 0000000000..ca614ac32b --- /dev/null +++ b/src/test/mir-opt/unreachable_asm.rs @@ -0,0 +1,72 @@ +// ignore-tidy-linelength +#![feature(asm)] + +enum Empty {} + +fn empty() -> Option<Empty> { + None +} + +fn main() { + if let Some(_x) = empty() { + let mut _y; + + if true { + _y = 21; + } else { + _y = 42; + } + + // asm instruction stops unreachable propagation to if else blocks bb4 and bb5. + unsafe { asm!("NOP"); } + match _x { } + } +} + +// END RUST SOURCE +// START rustc.main.UnreachablePropagation.before.mir +// bb4: { +// _4 = const 42i32; +// _5 = (); +// goto -> bb6; +// } +// bb5: { +// _4 = const 21i32; +// _5 = (); +// goto -> bb6; +// } +// bb6: { +// StorageDead(_6); +// StorageDead(_5); +// StorageLive(_7); +// asm!(InlineAsmInner { asm: "NOP", asm_str_style: Cooked, outputs: [], inputs: [], clobbers: [], volatile: true, alignstack: false, dialect: Att } : [] : []); +// _7 = (); +// StorageDead(_7); +// StorageLive(_8); +// unreachable; +// } +// } +// END rustc.main.UnreachablePropagation.before.mir +// START rustc.main.UnreachablePropagation.after.mir +// bb4: { +// _4 = const 42i32; +// _5 = (); +// goto -> bb6; +// } +// bb5: { +// _4 = const 21i32; +// _5 = (); +// goto -> bb6; +// } +// bb6: { +// StorageDead(_6); +// StorageDead(_5); +// StorageLive(_7); +// asm!(InlineAsmInner { asm: "NOP", asm_str_style: Cooked, outputs: [], inputs: [], clobbers: [], volatile: true, alignstack: false, dialect: Att } : [] : []); +// _7 = (); +// StorageDead(_7); +// StorageLive(_8); +// unreachable; +// } +// } +// END rustc.main.UnreachablePropagation.after.mir diff --git a/src/test/mir-opt/unreachable_asm_2.rs b/src/test/mir-opt/unreachable_asm_2.rs new file mode 100644 index 0000000000..8fdbcfb5ca --- /dev/null +++ b/src/test/mir-opt/unreachable_asm_2.rs @@ -0,0 +1,84 @@ +// ignore-tidy-linelength +#![feature(asm)] + +enum Empty {} + +fn empty() -> Option<Empty> { + None +} + +fn main() { + if let Some(_x) = empty() { + let mut _y; + + if true { + // asm instruction stops unreachable propagation to block bb3. + unsafe { asm!("NOP"); } + _y = 21; + } else { + // asm instruction stops unreachable propagation to block bb3. + unsafe { asm!("NOP"); } + _y = 42; + } + + match _x { } + } +} + +// END RUST SOURCE +// START rustc.main.UnreachablePropagation.before.mir +// bb3: { +// ... +// switchInt(_6) -> [false: bb4, otherwise: bb5]; +// } +// bb4: { +// StorageLive(_8); +// asm!(InlineAsmInner { asm: "NOP", asm_str_style: Cooked, outputs: [], inputs: [], clobbers: [], volatile: true, alignstack: false, dialect: Att } : [] : []); +// _8 = (); +// StorageDead(_8); +// _4 = const 42i32; +// _5 = (); +// goto -> bb6; +// } +// bb5: { +// StorageLive(_7); +// asm!(InlineAsmInner { asm: "NOP", asm_str_style: Cooked, outputs: [], inputs: [], clobbers: [], volatile: true, alignstack: false, dialect: Att } : [] : []); +// _7 = (); +// StorageDead(_7); +// _4 = const 21i32; +// _5 = (); +// goto -> bb6; +// } +// bb6: { +// StorageDead(_6); +// StorageDead(_5); +// StorageLive(_9); +// unreachable; +// } +// } +// END rustc.main.UnreachablePropagation.before.mir +// START rustc.main.UnreachablePropagation.after.mir +// bb3: { +// ... +// switchInt(_6) -> [false: bb4, otherwise: bb5]; +// } +// bb4: { +// StorageLive(_8); +// asm!(InlineAsmInner { asm: "NOP", asm_str_style: Cooked, outputs: [], inputs: [], clobbers: [], volatile: true, alignstack: false, dialect: Att } : [] : []); +// _8 = (); +// StorageDead(_8); +// _4 = const 42i32; +// _5 = (); +// unreachable; +// } +// bb5: { +// StorageLive(_7); +// asm!(InlineAsmInner { asm: "NOP", asm_str_style: Cooked, outputs: [], inputs: [], clobbers: [], volatile: true, alignstack: false, dialect: Att } : [] : []); +// _7 = (); +// StorageDead(_7); +// _4 = const 21i32; +// _5 = (); +// unreachable; +// } +// } +// END rustc.main.UnreachablePropagation.after.mir diff --git a/src/test/mir-opt/unreachable_diverging.rs b/src/test/mir-opt/unreachable_diverging.rs new file mode 100644 index 0000000000..bf05019d5c --- /dev/null +++ b/src/test/mir-opt/unreachable_diverging.rs @@ -0,0 +1,65 @@ +pub enum Empty {} + +fn empty() -> Option<Empty> { + None +} + +fn loop_forever() { + loop {} +} + +fn main() { + let x = true; + if let Some(bomb) = empty() { + if x { + loop_forever() + } + match bomb {} + } +} + +// END RUST SOURCE +// START rustc.main.UnreachablePropagation.before.mir +// bb3: { +// StorageLive(_4); +// _4 = move ((_2 as Some).0: Empty); +// StorageLive(_5); +// StorageLive(_6); +// _6 = _1; +// switchInt(_6) -> [false: bb4, otherwise: bb5]; +// } +// bb4: { +// _5 = (); +// goto -> bb6; +// } +// bb5: { +// _5 = const loop_forever() -> bb6; +// } +// bb6: { +// StorageDead(_6); +// StorageDead(_5); +// StorageLive(_7); +// unreachable; +// } +// } +// END rustc.main.UnreachablePropagation.before.mir +// START rustc.main.UnreachablePropagation.after.mir +// bb3: { +// StorageLive(_4); +// _4 = move ((_2 as Some).0: Empty); +// StorageLive(_5); +// StorageLive(_6); +// _6 = _1; +// goto -> bb4; +// } +// bb4: { +// _5 = const loop_forever() -> bb5; +// } +// bb5: { +// StorageDead(_6); +// StorageDead(_5); +// StorageLive(_7); +// unreachable; +// } +// } +// END rustc.main.UnreachablePropagation.after.mir diff --git a/src/test/mir-opt/unusual-item-types.rs b/src/test/mir-opt/unusual-item-types.rs index f4d848dfc7..88cfb62a0d 100644 --- a/src/test/mir-opt/unusual-item-types.rs +++ b/src/test/mir-opt/unusual-item-types.rs @@ -45,7 +45,7 @@ fn main() { // } // END rustc.E-V-{{constant}}.mir_map.0.mir -// START rustc.ptr-real_drop_in_place.std__vec__Vec_i32_.AddMovesForPackedDrops.before.mir +// START rustc.ptr-drop_in_place.std__vec__Vec_i32_.AddMovesForPackedDrops.before.mir // bb0: { // goto -> bb7; // } @@ -71,7 +71,7 @@ fn main() { // _2 = &mut (*_1); // _3 = const <std::vec::Vec<i32> as std::ops::Drop>::drop(move _2) -> [return: bb6, unwind: bb5]; // } -// END rustc.ptr-real_drop_in_place.std__vec__Vec_i32_.AddMovesForPackedDrops.before.mir +// END rustc.ptr-drop_in_place.std__vec__Vec_i32_.AddMovesForPackedDrops.before.mir // START rustc.Test-X-{{constructor}}.mir_map.0.mir // fn Test::X(_1: usize) -> Test { diff --git a/src/test/pretty/ast-stmt-expr-attr.rs b/src/test/pretty/ast-stmt-expr-attr.rs new file mode 100644 index 0000000000..5b97542451 --- /dev/null +++ b/src/test/pretty/ast-stmt-expr-attr.rs @@ -0,0 +1,175 @@ +// pp-exact + +fn main() { } + +#[cfg(FALSE)] +fn syntax() { + let _ = #[attr] box 0; + let _ = #[attr] [#![attr] ]; + let _ = #[attr] [#![attr] 0]; + let _ = #[attr] [#![attr] 0; 0]; + let _ = #[attr] [#![attr] 0, 0, 0]; + let _ = #[attr] foo(); + let _ = #[attr] x.foo(); + let _ = #[attr] (#![attr] ); + let _ = #[attr] (#![attr] #[attr] 0,); + let _ = #[attr] (#![attr] #[attr] 0, 0); + let _ = #[attr] 0 + #[attr] 0; + let _ = #[attr] 0 / #[attr] 0; + let _ = #[attr] 0 & #[attr] 0; + let _ = #[attr] 0 % #[attr] 0; + let _ = #[attr] (0 + 0); + let _ = #[attr] !0; + let _ = #[attr] -0; + let _ = #[attr] false; + let _ = #[attr] 0; + let _ = #[attr] 'c'; + let _ = #[attr] x as Y; + let _ = #[attr] (x as Y); + let _ = + #[attr] while true { + #![attr] + }; + let _ = + #[attr] while let Some(false) = true { + #![attr] + }; + let _ = + #[attr] for x in y { + #![attr] + }; + let _ = + #[attr] loop { + #![attr] + }; + let _ = + #[attr] match true { + #![attr] + #[attr] + _ => false, + }; + let _ = #[attr] || #[attr] foo; + let _ = #[attr] move || #[attr] foo; + let _ = + #[attr] || + #[attr] { + #![attr] + foo + }; + let _ = + #[attr] move || + #[attr] { + #![attr] + foo + }; + let _ = + #[attr] || + { + #![attr] + foo + }; + let _ = + #[attr] move || + { + #![attr] + foo + }; + let _ = + #[attr] { + #![attr] + }; + let _ = + #[attr] { + #![attr] + let _ = (); + }; + let _ = + #[attr] { + #![attr] + let _ = (); + foo + }; + let _ = #[attr] x = y; + let _ = #[attr] (x = y); + let _ = #[attr] x += y; + let _ = #[attr] (x += y); + let _ = #[attr] foo.bar; + let _ = (#[attr] foo).bar; + let _ = #[attr] foo.0; + let _ = (#[attr] foo).0; + let _ = #[attr] foo[bar]; + let _ = (#[attr] foo)[bar]; + let _ = #[attr] 0..#[attr] 0; + let _ = #[attr] 0..; + let _ = #[attr] (0..0); + let _ = #[attr] (0..); + let _ = #[attr] (..0); + let _ = #[attr] (..); + let _ = #[attr] foo::bar::baz; + let _ = #[attr] &0; + let _ = #[attr] &mut 0; + let _ = #[attr] &#[attr] 0; + let _ = #[attr] &mut #[attr] 0; + let _ = #[attr] break ; + let _ = #[attr] continue ; + let _ = #[attr] return; + let _ = #[attr] foo!(); + let _ = #[attr] foo!(# ! [attr]); + let _ = #[attr] foo![]; + let _ = #[attr] foo![# ! [attr]]; + let _ = #[attr] foo! { }; + let _ = #[attr] foo! { # ! [attr] }; + let _ = #[attr] Foo{#![attr] bar: baz,}; + let _ = #[attr] Foo{#![attr] ..foo}; + let _ = #[attr] Foo{#![attr] bar: baz, ..foo}; + let _ = #[attr] (#![attr] 0); + + { + #[attr] + let _ = 0; + + #[attr] + 0; + + #[attr] + foo!(); + + #[attr] + foo! { } + + #[attr] + foo![]; + } + + { + #[attr] + let _ = 0; + } + { + + #[attr] + 0 + } + { + + #[attr] + { + #![attr] + } + } + { + + #[attr] + foo!() + } + { + + #[attr] + foo![] + } + { + + #[attr] + foo! { } + } +} diff --git a/src/test/pretty/raw-address-of.rs b/src/test/pretty/raw-address-of.rs new file mode 100644 index 0000000000..6ccc434a1e --- /dev/null +++ b/src/test/pretty/raw-address-of.rs @@ -0,0 +1,12 @@ +// pp-exact +#![feature(raw_ref_op)] + +const C_PTR: () = { let a = 1; &raw const a; }; +static S_PTR: () = { let b = false; &raw const b; }; + +fn main() { + let x = 123; + let mut y = 345; + let c_p = &raw const x; + let parens = unsafe { *(&raw mut (y)) }; +} diff --git a/src/test/pretty/top-level-doc-comments.rs b/src/test/pretty/top-level-doc-comments.rs index 16f95d334c..b97927124c 100644 --- a/src/test/pretty/top-level-doc-comments.rs +++ b/src/test/pretty/top-level-doc-comments.rs @@ -1,11 +1,6 @@ /// Some doc comment. struct X; -// ignore-license - -// http://rust-lang.org/COPYRIGHT. -// - // pp-exact // Test that rust can properly pretty print a doc comment if it's the first line in a file. some diff --git a/src/test/run-fail/unimplemented-macro-panic.rs b/src/test/run-fail/unimplemented-macro-panic.rs index 2a848281e4..4d9cb740fc 100644 --- a/src/test/run-fail/unimplemented-macro-panic.rs +++ b/src/test/run-fail/unimplemented-macro-panic.rs @@ -1,4 +1,4 @@ -// error-pattern:not yet implemented +// error-pattern:not implemented fn main() { unimplemented!() } diff --git a/src/test/run-make-fulldeps/allow-warnings-cmdline-stability/bar.rs b/src/test/run-make-fulldeps/allow-warnings-cmdline-stability/bar.rs index 2a977ed63b..3dcfb9dadd 100644 --- a/src/test/run-make-fulldeps/allow-warnings-cmdline-stability/bar.rs +++ b/src/test/run-make-fulldeps/allow-warnings-cmdline-stability/bar.rs @@ -1,5 +1,5 @@ #![crate_type = "lib"] #![feature(staged_api)] -#![unstable(feature = "unstable_test_feature", issue = "0")] +#![unstable(feature = "unstable_test_feature", issue = "none")] pub fn baz() {} diff --git a/src/test/run-make-fulldeps/c-dynamic-dylib/cfoo.c b/src/test/run-make-fulldeps/c-dynamic-dylib/cfoo.c index a975549354..fea490cf9b 100644 --- a/src/test/run-make-fulldeps/c-dynamic-dylib/cfoo.c +++ b/src/test/run-make-fulldeps/c-dynamic-dylib/cfoo.c @@ -1,4 +1,3 @@ -// ignore-license #ifdef _WIN32 __declspec(dllexport) #endif diff --git a/src/test/run-make-fulldeps/c-dynamic-rlib/cfoo.c b/src/test/run-make-fulldeps/c-dynamic-rlib/cfoo.c index b2849326a7..fea490cf9b 100644 --- a/src/test/run-make-fulldeps/c-dynamic-rlib/cfoo.c +++ b/src/test/run-make-fulldeps/c-dynamic-rlib/cfoo.c @@ -1,5 +1,3 @@ -// ignore-license - #ifdef _WIN32 __declspec(dllexport) #endif diff --git a/src/test/run-make-fulldeps/c-link-to-rust-dylib/bar.c b/src/test/run-make-fulldeps/c-link-to-rust-dylib/bar.c index 5729d411c5..bb4036b06e 100644 --- a/src/test/run-make-fulldeps/c-link-to-rust-dylib/bar.c +++ b/src/test/run-make-fulldeps/c-link-to-rust-dylib/bar.c @@ -1,4 +1,3 @@ -// ignore-license void foo(); int main() { diff --git a/src/test/run-make-fulldeps/c-link-to-rust-staticlib/bar.c b/src/test/run-make-fulldeps/c-link-to-rust-staticlib/bar.c index 5729d411c5..bb4036b06e 100644 --- a/src/test/run-make-fulldeps/c-link-to-rust-staticlib/bar.c +++ b/src/test/run-make-fulldeps/c-link-to-rust-staticlib/bar.c @@ -1,4 +1,3 @@ -// ignore-license void foo(); int main() { diff --git a/src/test/run-make-fulldeps/c-static-dylib/cfoo.c b/src/test/run-make-fulldeps/c-static-dylib/cfoo.c index 113717a776..9fe07f82f9 100644 --- a/src/test/run-make-fulldeps/c-static-dylib/cfoo.c +++ b/src/test/run-make-fulldeps/c-static-dylib/cfoo.c @@ -1,2 +1 @@ -// ignore-license int foo() { return 0; } diff --git a/src/test/run-make-fulldeps/c-static-rlib/cfoo.c b/src/test/run-make-fulldeps/c-static-rlib/cfoo.c index 113717a776..9fe07f82f9 100644 --- a/src/test/run-make-fulldeps/c-static-rlib/cfoo.c +++ b/src/test/run-make-fulldeps/c-static-rlib/cfoo.c @@ -1,2 +1 @@ -// ignore-license int foo() { return 0; } diff --git a/src/test/run-make-fulldeps/cdylib-dylib-linkage/Makefile b/src/test/run-make-fulldeps/cdylib-dylib-linkage/Makefile new file mode 100644 index 0000000000..5c9b2d1bb2 --- /dev/null +++ b/src/test/run-make-fulldeps/cdylib-dylib-linkage/Makefile @@ -0,0 +1,27 @@ +include ../tools.mk + +TARGET_SYSROOT := $(shell $(RUSTC) --print sysroot)/lib/rustlib/$(TARGET)/lib + +ifdef IS_MSVC +LIBSTD := $(wildcard $(TARGET_SYSROOT)/libstd-*.dll.lib) +else +LIBSTD := $(wildcard $(TARGET_SYSROOT)/$(call DYLIB_GLOB,std)) +STD := $(basename $(patsubst lib%,%, $(notdir $(LIBSTD)))) +endif + +all: $(call RUN_BINFILE,foo) + $(call RUN,foo) + +ifdef IS_MSVC +CLIBS := $(TMPDIR)/foo.dll.lib $(TMPDIR)/bar.dll.lib $(LIBSTD) +$(call RUN_BINFILE,foo): $(call DYLIB,foo) + $(CC) $(CFLAGS) foo.c $(CLIBS) $(call OUT_EXE,foo) +else +CLIBS := -lfoo -lbar -l$(STD) -L $(TMPDIR) -L $(TARGET_SYSROOT) +$(call RUN_BINFILE,foo): $(call DYLIB,foo) + $(CC) $(CFLAGS) foo.c $(CLIBS) -o $(call RUN_BINFILE,foo) +endif + +$(call DYLIB,foo): + $(RUSTC) -C prefer-dynamic bar.rs + $(RUSTC) foo.rs diff --git a/src/test/run-make-fulldeps/cdylib-dylib-linkage/bar.rs b/src/test/run-make-fulldeps/cdylib-dylib-linkage/bar.rs new file mode 100644 index 0000000000..b3a7539aba --- /dev/null +++ b/src/test/run-make-fulldeps/cdylib-dylib-linkage/bar.rs @@ -0,0 +1,5 @@ +#![crate_type = "dylib"] + +pub fn bar() { + println!("hello!"); +} diff --git a/src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.c b/src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.c new file mode 100644 index 0000000000..154f9682ef --- /dev/null +++ b/src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.c @@ -0,0 +1,10 @@ +#include <assert.h> + +extern void foo(); +extern unsigned bar(unsigned a, unsigned b); + +int main() { + foo(); + assert(bar(1, 2) == 3); + return 0; +} diff --git a/src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.rs b/src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.rs new file mode 100644 index 0000000000..c2cc3afcc1 --- /dev/null +++ b/src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.rs @@ -0,0 +1,13 @@ +#![crate_type = "cdylib"] + +extern crate bar; + +#[no_mangle] +pub extern fn foo() { + bar::bar(); +} + +#[no_mangle] +pub extern fn bar(a: u32, b: u32) -> u32 { + a + b +} diff --git a/src/test/run-make-fulldeps/compiler-rt-works-on-mingw/foo.cpp b/src/test/run-make-fulldeps/compiler-rt-works-on-mingw/foo.cpp index aac3ba4220..4c2fb9cdb8 100644 --- a/src/test/run-make-fulldeps/compiler-rt-works-on-mingw/foo.cpp +++ b/src/test/run-make-fulldeps/compiler-rt-works-on-mingw/foo.cpp @@ -1,4 +1,3 @@ -// ignore-license extern "C" void foo() { int *a = new int(3); delete a; diff --git a/src/test/run-make-fulldeps/extern-fn-generic/test.c b/src/test/run-make-fulldeps/extern-fn-generic/test.c index f9faef64af..a8504ff2af 100644 --- a/src/test/run-make-fulldeps/extern-fn-generic/test.c +++ b/src/test/run-make-fulldeps/extern-fn-generic/test.c @@ -1,4 +1,3 @@ -// ignore-license #include <stdint.h> typedef struct TestStruct { diff --git a/src/test/run-make-fulldeps/extern-fn-mangle/test.c b/src/test/run-make-fulldeps/extern-fn-mangle/test.c index 1a9855dede..e94d75083b 100644 --- a/src/test/run-make-fulldeps/extern-fn-mangle/test.c +++ b/src/test/run-make-fulldeps/extern-fn-mangle/test.c @@ -1,4 +1,3 @@ -// ignore-license #include <stdint.h> uint32_t foo(); diff --git a/src/test/run-make-fulldeps/extern-fn-with-extern-types/ctest.c b/src/test/run-make-fulldeps/extern-fn-with-extern-types/ctest.c index c3d6166fb1..3b6fb4cfce 100644 --- a/src/test/run-make-fulldeps/extern-fn-with-extern-types/ctest.c +++ b/src/test/run-make-fulldeps/extern-fn-with-extern-types/ctest.c @@ -1,4 +1,3 @@ -// ignore-license #include <stdio.h> #include <stdint.h> diff --git a/src/test/run-make-fulldeps/extern-fn-with-packed-struct/test.c b/src/test/run-make-fulldeps/extern-fn-with-packed-struct/test.c index 4124e202c1..52af3dceb1 100644 --- a/src/test/run-make-fulldeps/extern-fn-with-packed-struct/test.c +++ b/src/test/run-make-fulldeps/extern-fn-with-packed-struct/test.c @@ -1,4 +1,3 @@ -// ignore-license // Pragma needed cause of gcc bug on windows: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991 #include <assert.h> diff --git a/src/test/run-make-fulldeps/extern-fn-with-union/ctest.c b/src/test/run-make-fulldeps/extern-fn-with-union/ctest.c index 8c87c23069..86cb645372 100644 --- a/src/test/run-make-fulldeps/extern-fn-with-union/ctest.c +++ b/src/test/run-make-fulldeps/extern-fn-with-union/ctest.c @@ -1,4 +1,3 @@ -// ignore-license #include <stdio.h> #include <stdint.h> diff --git a/src/test/run-make-fulldeps/foreign-exceptions/foo.rs b/src/test/run-make-fulldeps/foreign-exceptions/foo.rs index 399c78f8d2..9c2045c8c8 100644 --- a/src/test/run-make-fulldeps/foreign-exceptions/foo.rs +++ b/src/test/run-make-fulldeps/foreign-exceptions/foo.rs @@ -4,7 +4,6 @@ // For linking libstdc++ on MinGW #![cfg_attr(all(windows, target_env = "gnu"), feature(static_nobundle))] - #![feature(unwind_attributes)] use std::panic::{catch_unwind, AssertUnwindSafe}; diff --git a/src/test/run-make-fulldeps/glibc-staticlib-args/program.c b/src/test/run-make-fulldeps/glibc-staticlib-args/program.c index d704c39d5c..30f6974b75 100644 --- a/src/test/run-make-fulldeps/glibc-staticlib-args/program.c +++ b/src/test/run-make-fulldeps/glibc-staticlib-args/program.c @@ -1,4 +1,3 @@ -// ignore-license void args_check(); int main() { diff --git a/src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs b/src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs index eb96c61060..84bcd220ae 100644 --- a/src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs +++ b/src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs @@ -1,17 +1,18 @@ #![feature(rustc_private)] -extern crate syntax; extern crate rustc; extern crate rustc_codegen_utils; #[macro_use] extern crate rustc_data_structures; +extern crate rustc_hir; extern crate rustc_target; extern crate rustc_driver; +extern crate rustc_span; use std::any::Any; use std::sync::Arc; use std::path::Path; -use syntax::symbol::Symbol; +use rustc_span::symbol::Symbol; use rustc::session::Session; use rustc::session::config::OutputFilenames; use rustc::ty::TyCtxt; @@ -65,7 +66,7 @@ impl CodegenBackend for TheBackend { _metadata: EncodedMetadata, _need_metadata_module: bool, ) -> Box<dyn Any> { - use rustc::hir::def_id::LOCAL_CRATE; + use rustc_hir::def_id::LOCAL_CRATE; Box::new(tcx.crate_name(LOCAL_CRATE) as Symbol) } diff --git a/src/test/run-make-fulldeps/interdependent-c-libraries/bar.c b/src/test/run-make-fulldeps/interdependent-c-libraries/bar.c index c761f029ef..812c975352 100644 --- a/src/test/run-make-fulldeps/interdependent-c-libraries/bar.c +++ b/src/test/run-make-fulldeps/interdependent-c-libraries/bar.c @@ -1,4 +1,3 @@ -// ignore-license void foo(); void bar() { foo(); } diff --git a/src/test/run-make-fulldeps/interdependent-c-libraries/foo.c b/src/test/run-make-fulldeps/interdependent-c-libraries/foo.c index 2895ad473b..85e6cd8c39 100644 --- a/src/test/run-make-fulldeps/interdependent-c-libraries/foo.c +++ b/src/test/run-make-fulldeps/interdependent-c-libraries/foo.c @@ -1,2 +1 @@ -// ignore-license void foo() {} diff --git a/src/test/run-make-fulldeps/issue-19371/foo.rs b/src/test/run-make-fulldeps/issue-19371/foo.rs index 62a66aefd2..12da64fc88 100644 --- a/src/test/run-make-fulldeps/issue-19371/foo.rs +++ b/src/test/run-make-fulldeps/issue-19371/foo.rs @@ -3,13 +3,13 @@ extern crate rustc; extern crate rustc_interface; extern crate rustc_driver; -extern crate syntax; +extern crate rustc_span; use rustc::session::DiagnosticOutput; use rustc::session::config::{Input, Options, OutputType, OutputTypes}; use rustc_interface::interface; -use syntax::source_map::FileName; +use rustc_span::source_map::FileName; use std::path::PathBuf; diff --git a/src/test/run-make-fulldeps/issue-25581/test.c b/src/test/run-make-fulldeps/issue-25581/test.c index 5736b17302..52fbf78510 100644 --- a/src/test/run-make-fulldeps/issue-25581/test.c +++ b/src/test/run-make-fulldeps/issue-25581/test.c @@ -1,4 +1,3 @@ -// ignore-license #include <stddef.h> #include <stdint.h> diff --git a/src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/Makefile b/src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/Makefile new file mode 100644 index 0000000000..2f16ad3285 --- /dev/null +++ b/src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/Makefile @@ -0,0 +1,17 @@ +# Regression test for issue #68794 +# +# Verify that no text relocations are accidentally introduced by linking a +# minimal rust staticlib. +# +# The test links a rust static library into a shared library, and checks that +# the linker doesn't have to flag the resulting file as containing TEXTRELs. + +-include ../tools.mk + +# only-linux + +all: + $(RUSTC) foo.rs + $(CC) bar.c $(call STATICLIB,foo) -fPIC -shared -o $(call DYLIB,bar) \ + $(EXTRACFLAGS) $(EXTRACXXFLAGS) + readelf -d $(call DYLIB,bar) | grep TEXTREL; test $$? -eq 1 diff --git a/src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/bar.c b/src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/bar.c new file mode 100644 index 0000000000..bb4036b06e --- /dev/null +++ b/src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/bar.c @@ -0,0 +1,6 @@ +void foo(); + +int main() { + foo(); + return 0; +} diff --git a/src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/foo.rs b/src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/foo.rs new file mode 100644 index 0000000000..a3e865b638 --- /dev/null +++ b/src/test/run-make-fulldeps/issue-68794-textrel-on-minimal-lib/foo.rs @@ -0,0 +1,8 @@ +#![crate_type = "staticlib"] + +#[no_mangle] +pub extern "C" fn foo(x: u32) { + // using the println! makes it so that enough code from the standard + // library is included (see issue #68794) + println!("foo: {}", x); +} diff --git a/src/test/run-make-fulldeps/issue64319/Makefile b/src/test/run-make-fulldeps/issue64319/Makefile new file mode 100644 index 0000000000..5592f5a71f --- /dev/null +++ b/src/test/run-make-fulldeps/issue64319/Makefile @@ -0,0 +1,39 @@ +-include ../../run-make-fulldeps/tools.mk + +# Different optimization levels imply different values for `-Zshare-generics`, +# so try out a whole bunch of combinations to make sure everything is compatible +all: + # First up, try some defaults + $(RUSTC) --crate-type rlib foo.rs + $(RUSTC) --crate-type dylib bar.rs -C opt-level=3 + + # Next try mixing up some things explicitly + $(RUSTC) --crate-type rlib foo.rs -Z share-generics=no + $(RUSTC) --crate-type dylib bar.rs -Z share-generics=no + $(RUSTC) --crate-type rlib foo.rs -Z share-generics=no + $(RUSTC) --crate-type dylib bar.rs -Z share-generics=yes + $(RUSTC) --crate-type rlib foo.rs -Z share-generics=yes + $(RUSTC) --crate-type dylib bar.rs -Z share-generics=no + $(RUSTC) --crate-type rlib foo.rs -Z share-generics=yes + $(RUSTC) --crate-type dylib bar.rs -Z share-generics=yes + + # Now combine a whole bunch of options together + $(RUSTC) --crate-type rlib foo.rs + $(RUSTC) --crate-type dylib bar.rs + $(RUSTC) --crate-type dylib bar.rs -Z share-generics=no + $(RUSTC) --crate-type dylib bar.rs -Z share-generics=yes + $(RUSTC) --crate-type dylib bar.rs -C opt-level=1 + $(RUSTC) --crate-type dylib bar.rs -C opt-level=1 -Z share-generics=no + $(RUSTC) --crate-type dylib bar.rs -C opt-level=1 -Z share-generics=yes + $(RUSTC) --crate-type dylib bar.rs -C opt-level=2 + $(RUSTC) --crate-type dylib bar.rs -C opt-level=2 -Z share-generics=no + $(RUSTC) --crate-type dylib bar.rs -C opt-level=2 -Z share-generics=yes + $(RUSTC) --crate-type dylib bar.rs -C opt-level=3 + $(RUSTC) --crate-type dylib bar.rs -C opt-level=3 -Z share-generics=no + $(RUSTC) --crate-type dylib bar.rs -C opt-level=3 -Z share-generics=yes + $(RUSTC) --crate-type dylib bar.rs -C opt-level=s + $(RUSTC) --crate-type dylib bar.rs -C opt-level=s -Z share-generics=no + $(RUSTC) --crate-type dylib bar.rs -C opt-level=s -Z share-generics=yes + $(RUSTC) --crate-type dylib bar.rs -C opt-level=z + $(RUSTC) --crate-type dylib bar.rs -C opt-level=z -Z share-generics=no + $(RUSTC) --crate-type dylib bar.rs -C opt-level=z -Z share-generics=yes diff --git a/src/test/run-make-fulldeps/issue64319/bar.rs b/src/test/run-make-fulldeps/issue64319/bar.rs new file mode 100644 index 0000000000..3895c0b6cd --- /dev/null +++ b/src/test/run-make-fulldeps/issue64319/bar.rs @@ -0,0 +1,5 @@ +extern crate foo; + +pub fn bar() { + foo::foo(); +} diff --git a/src/test/run-make-fulldeps/issue64319/foo.rs b/src/test/run-make-fulldeps/issue64319/foo.rs new file mode 100644 index 0000000000..c54a238e9a --- /dev/null +++ b/src/test/run-make-fulldeps/issue64319/foo.rs @@ -0,0 +1,9 @@ +pub fn foo() { + bar::<usize>(); +} + +pub fn bar<T>() { + baz(); +} + +fn baz() {} diff --git a/src/test/run-make-fulldeps/libtest-json/output-default.json b/src/test/run-make-fulldeps/libtest-json/output-default.json index 8046d72221..0cd9ab79e3 100644 --- a/src/test/run-make-fulldeps/libtest-json/output-default.json +++ b/src/test/run-make-fulldeps/libtest-json/output-default.json @@ -2,7 +2,7 @@ { "type": "test", "event": "started", "name": "a" } { "type": "test", "name": "a", "event": "ok" } { "type": "test", "event": "started", "name": "b" } -{ "type": "test", "name": "b", "event": "failed", "stdout": "thread 'main' panicked at 'assertion failed: false', f.rs:9:5\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.\n" } +{ "type": "test", "name": "b", "event": "failed", "stdout": "thread 'main' panicked at 'assertion failed: false', f.rs:9:5\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n" } { "type": "test", "event": "started", "name": "c" } { "type": "test", "name": "c", "event": "ok" } { "type": "test", "event": "started", "name": "d" } diff --git a/src/test/run-make-fulldeps/libtest-json/output-stdout-success.json b/src/test/run-make-fulldeps/libtest-json/output-stdout-success.json index 303316278d..dfaf005052 100644 --- a/src/test/run-make-fulldeps/libtest-json/output-stdout-success.json +++ b/src/test/run-make-fulldeps/libtest-json/output-stdout-success.json @@ -2,7 +2,7 @@ { "type": "test", "event": "started", "name": "a" } { "type": "test", "name": "a", "event": "ok", "stdout": "print from successful test\n" } { "type": "test", "event": "started", "name": "b" } -{ "type": "test", "name": "b", "event": "failed", "stdout": "thread 'main' panicked at 'assertion failed: false', f.rs:9:5\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.\n" } +{ "type": "test", "name": "b", "event": "failed", "stdout": "thread 'main' panicked at 'assertion failed: false', f.rs:9:5\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n" } { "type": "test", "event": "started", "name": "c" } { "type": "test", "name": "c", "event": "ok", "stdout": "thread 'main' panicked at 'assertion failed: false', f.rs:15:5\n" } { "type": "test", "event": "started", "name": "d" } diff --git a/src/test/run-make-fulldeps/link-path-order/correct.c b/src/test/run-make-fulldeps/link-path-order/correct.c index a595939f92..3064af952f 100644 --- a/src/test/run-make-fulldeps/link-path-order/correct.c +++ b/src/test/run-make-fulldeps/link-path-order/correct.c @@ -1,2 +1 @@ -// ignore-license int should_return_one() { return 1; } diff --git a/src/test/run-make-fulldeps/link-path-order/wrong.c b/src/test/run-make-fulldeps/link-path-order/wrong.c index c53e7e3c48..64275b3ad6 100644 --- a/src/test/run-make-fulldeps/link-path-order/wrong.c +++ b/src/test/run-make-fulldeps/link-path-order/wrong.c @@ -1,2 +1 @@ -// ignore-license int should_return_one() { return 0; } diff --git a/src/test/run-make-fulldeps/linkage-attr-on-static/foo.c b/src/test/run-make-fulldeps/linkage-attr-on-static/foo.c index d7d33ea12e..78a6934f57 100644 --- a/src/test/run-make-fulldeps/linkage-attr-on-static/foo.c +++ b/src/test/run-make-fulldeps/linkage-attr-on-static/foo.c @@ -1,4 +1,3 @@ -// ignore-license #include <stdint.h> extern int32_t BAZ; diff --git a/src/test/run-make-fulldeps/lto-smoke-c/bar.c b/src/test/run-make-fulldeps/lto-smoke-c/bar.c index 5729d411c5..bb4036b06e 100644 --- a/src/test/run-make-fulldeps/lto-smoke-c/bar.c +++ b/src/test/run-make-fulldeps/lto-smoke-c/bar.c @@ -1,4 +1,3 @@ -// ignore-license void foo(); int main() { diff --git a/src/test/run-make-fulldeps/manual-link/bar.c b/src/test/run-make-fulldeps/manual-link/bar.c index 3c167b45af..e425999867 100644 --- a/src/test/run-make-fulldeps/manual-link/bar.c +++ b/src/test/run-make-fulldeps/manual-link/bar.c @@ -1,2 +1 @@ -// ignore-license void bar() {} diff --git a/src/test/run-make-fulldeps/manual-link/foo.c b/src/test/run-make-fulldeps/manual-link/foo.c index 3c167b45af..e425999867 100644 --- a/src/test/run-make-fulldeps/manual-link/foo.c +++ b/src/test/run-make-fulldeps/manual-link/foo.c @@ -1,2 +1 @@ -// ignore-license void bar() {} diff --git a/src/test/run-make-fulldeps/pgo-branch-weights/Makefile b/src/test/run-make-fulldeps/pgo-branch-weights/Makefile index edb4006313..c13297b3a6 100644 --- a/src/test/run-make-fulldeps/pgo-branch-weights/Makefile +++ b/src/test/run-make-fulldeps/pgo-branch-weights/Makefile @@ -15,21 +15,29 @@ ifdef IS_MSVC COMMON_FLAGS=-Cpanic=abort endif +# For some very small programs GNU ld seems to not properly handle +# instrumentation sections correctly. Neither Gold nor LLD have that problem. +ifeq ($(UNAME),Linux) +ifneq (,$(findstring x86,$(TARGET))) +COMMON_FLAGS=-Clink-args=-fuse-ld=gold +endif +endif + + all: # We don't compile `opaque` with either optimizations or instrumentation. - # We don't compile `opaque` with either optimizations or instrumentation. - $(RUSTC) $(COMMON_FLAGS) opaque.rs + $(RUSTC) $(COMMON_FLAGS) opaque.rs || exit 1 # Compile the test program with instrumentation - mkdir -p "$(TMPDIR)"/prof_data_dir + mkdir -p "$(TMPDIR)/prof_data_dir" || exit 1 $(RUSTC) $(COMMON_FLAGS) interesting.rs \ - -Cprofile-generate="$(TMPDIR)"/prof_data_dir -O -Ccodegen-units=1 - $(RUSTC) $(COMMON_FLAGS) main.rs -Cprofile-generate="$(TMPDIR)"/prof_data_dir -O + -Cprofile-generate="$(TMPDIR)/prof_data_dir" -O -Ccodegen-units=1 || exit 1 + $(RUSTC) $(COMMON_FLAGS) main.rs -Cprofile-generate="$(TMPDIR)/prof_data_dir" -O || exit 1 # The argument below generates to the expected branch weights $(call RUN,main aaaaaaaaaaaa2bbbbbbbbbbbb2bbbbbbbbbbbbbbbbcc) || exit 1 - "$(LLVM_BIN_DIR)"/llvm-profdata merge \ - -o "$(TMPDIR)"/prof_data_dir/merged.profdata \ - "$(TMPDIR)"/prof_data_dir + "$(LLVM_BIN_DIR)/llvm-profdata" merge \ + -o "$(TMPDIR)/prof_data_dir/merged.profdata" \ + "$(TMPDIR)/prof_data_dir" || exit 1 $(RUSTC) $(COMMON_FLAGS) interesting.rs \ - -Cprofile-use="$(TMPDIR)"/prof_data_dir/merged.profdata -O \ - -Ccodegen-units=1 --emit=llvm-ir - cat "$(TMPDIR)"/interesting.ll | "$(LLVM_FILECHECK)" filecheck-patterns.txt + -Cprofile-use="$(TMPDIR)/prof_data_dir/merged.profdata" -O \ + -Ccodegen-units=1 --emit=llvm-ir || exit 1 + cat "$(TMPDIR)/interesting.ll" | "$(LLVM_FILECHECK)" filecheck-patterns.txt diff --git a/src/test/run-make-fulldeps/sanitizer-address/Makefile b/src/test/run-make-fulldeps/sanitizer-address/Makefile deleted file mode 100644 index 3a377c3299..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-address/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -# needs-sanitizer-support - --include ../tools.mk - -LOG := $(TMPDIR)/log.txt - -# NOTE the address sanitizer only supports x86_64 linux and macOS - -ifeq ($(TARGET),x86_64-apple-darwin) -EXTRA_RUSTFLAG=-C rpath -else -ifeq ($(TARGET),x86_64-unknown-linux-gnu) - -# Apparently there are very specific Linux kernels, notably the one that's -# currently on Travis CI, which contain a buggy commit that triggers failures in -# the ASan implementation, detailed at google/sanitizers#837. As noted in -# google/sanitizers#856 the "fix" is to avoid using PIE binaries, so we pass a -# different relocation model to avoid generating a PIE binary. Once Travis is no -# longer running kernel 4.4.0-93 we can remove this and pass an empty set of -# flags again. -EXTRA_RUSTFLAG=-C relocation-model=dynamic-no-pic -endif -endif - -all: - $(RUSTC) -g -Z sanitizer=address -Z print-link-args $(EXTRA_RUSTFLAG) overflow.rs | $(CGREP) librustc_asan - # Verify that stack buffer overflow is detected: - $(TMPDIR)/overflow 2>&1 | $(CGREP) stack-buffer-overflow - # Verify that variable name is included in address sanitizer report: - $(TMPDIR)/overflow 2>&1 | $(CGREP) "'xs'" diff --git a/src/test/run-make-fulldeps/sanitizer-address/overflow.rs b/src/test/run-make-fulldeps/sanitizer-address/overflow.rs deleted file mode 100644 index b997a74cc3..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-address/overflow.rs +++ /dev/null @@ -1,4 +0,0 @@ -fn main() { - let xs = [0, 1, 2, 3]; - let _y = unsafe { *xs.as_ptr().offset(4) }; -} diff --git a/src/test/run-make-fulldeps/sanitizer-invalid-cratetype/Makefile b/src/test/run-make-fulldeps/sanitizer-invalid-cratetype/Makefile deleted file mode 100644 index 9581ac565e..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-invalid-cratetype/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# needs-sanitizer-support - --include ../tools.mk - -# NOTE the address sanitizer only supports x86_64 linux and macOS - -ifeq ($(TARGET),x86_64-apple-darwin) -EXTRA_RUSTFLAG=-C rpath -else -ifeq ($(TARGET),x86_64-unknown-linux-gnu) -EXTRA_RUSTFLAG= -endif -endif - -all: - $(RUSTC) -Z sanitizer=address --crate-type proc-macro --target $(TARGET) hello.rs 2>&1 | $(CGREP) '-Z sanitizer' diff --git a/src/test/run-make-fulldeps/sanitizer-invalid-cratetype/hello.rs b/src/test/run-make-fulldeps/sanitizer-invalid-cratetype/hello.rs deleted file mode 100644 index e7a11a969c..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-invalid-cratetype/hello.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -} diff --git a/src/test/run-make-fulldeps/sanitizer-invalid-target/Makefile b/src/test/run-make-fulldeps/sanitizer-invalid-target/Makefile deleted file mode 100644 index df8afee15c..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-invalid-target/Makefile +++ /dev/null @@ -1,5 +0,0 @@ --include ../tools.mk - -all: - $(RUSTC) -Z sanitizer=leak --target i686-unknown-linux-gnu hello.rs 2>&1 | \ - $(CGREP) 'LeakSanitizer only works with the `x86_64-unknown-linux-gnu` target' diff --git a/src/test/run-make-fulldeps/sanitizer-invalid-target/hello.rs b/src/test/run-make-fulldeps/sanitizer-invalid-target/hello.rs deleted file mode 100644 index d3dd5ed03d..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-invalid-target/hello.rs +++ /dev/null @@ -1,3 +0,0 @@ -#![feature(no_core)] -#![no_core] -#![no_main] diff --git a/src/test/run-make-fulldeps/sanitizer-leak/Makefile b/src/test/run-make-fulldeps/sanitizer-leak/Makefile deleted file mode 100644 index 101e8272ab..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-leak/Makefile +++ /dev/null @@ -1,11 +0,0 @@ --include ../tools.mk - -# needs-sanitizer-support -# only-linux -# only-x86_64 -# ignore-test -# FIXME(#46126) ThinLTO for libstd broke this test - -all: - $(RUSTC) -C opt-level=1 -g -Z sanitizer=leak -Z print-link-args leak.rs | $(CGREP) librustc_lsan - $(TMPDIR)/leak 2>&1 | $(CGREP) 'detected memory leaks' diff --git a/src/test/run-make-fulldeps/sanitizer-leak/leak.rs b/src/test/run-make-fulldeps/sanitizer-leak/leak.rs deleted file mode 100644 index ab8df5c7bf..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-leak/leak.rs +++ /dev/null @@ -1,6 +0,0 @@ -use std::mem; - -fn main() { - let xs = vec![1, 2, 3, 4]; - mem::forget(xs); -} diff --git a/src/test/run-make-fulldeps/sanitizer-memory/Makefile b/src/test/run-make-fulldeps/sanitizer-memory/Makefile deleted file mode 100644 index b3376f8a72..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-memory/Makefile +++ /dev/null @@ -1,9 +0,0 @@ --include ../tools.mk - -# needs-sanitizer-support -# only-linux -# only-x86_64 - -all: - $(RUSTC) -g -Z sanitizer=memory -Z print-link-args uninit.rs | $(CGREP) librustc_msan - $(TMPDIR)/uninit 2>&1 | $(CGREP) use-of-uninitialized-value diff --git a/src/test/run-make-fulldeps/sanitizer-memory/uninit.rs b/src/test/run-make-fulldeps/sanitizer-memory/uninit.rs deleted file mode 100644 index cb857e3bc3..0000000000 --- a/src/test/run-make-fulldeps/sanitizer-memory/uninit.rs +++ /dev/null @@ -1,7 +0,0 @@ -use std::mem; - -fn main() { - #[allow(deprecated)] - let xs: [u8; 4] = unsafe { mem::uninitialized() }; - let y = xs[0] + xs[1]; -} diff --git a/src/test/run-make-fulldeps/sanitizer-staticlib-link/program.c b/src/test/run-make-fulldeps/sanitizer-staticlib-link/program.c index a6d3bcdc5a..735e2b147f 100644 --- a/src/test/run-make-fulldeps/sanitizer-staticlib-link/program.c +++ b/src/test/run-make-fulldeps/sanitizer-staticlib-link/program.c @@ -1,4 +1,3 @@ -// ignore-license void overflow(); int main() { diff --git a/src/test/run-make-fulldeps/share-generics-dylib/Makefile b/src/test/run-make-fulldeps/share-generics-dylib/Makefile new file mode 100644 index 0000000000..c6b5efcb4c --- /dev/null +++ b/src/test/run-make-fulldeps/share-generics-dylib/Makefile @@ -0,0 +1,22 @@ +# This test makes sure all generic instances get re-exported from Rust dylibs for use by +# `-Zshare-generics`. There are two rlibs (`instance_provider_a` and `instance_provider_b`) +# which both provide an instance of `Cell<i32>::set`. There is `instance_user_dylib` which is +# supposed to re-export both these instances, and then there are `instance_user_a_rlib` and +# `instance_user_b_rlib` which each rely on a specific instance to be available. +# +# In the end everything is linked together into `linked_leaf`. If `instance_user_dylib` does +# not export both then we'll get an `undefined reference` error for one of the instances. +# +# This is regression test for https://github.com/rust-lang/rust/issues/67276. + +-include ../../run-make-fulldeps/tools.mk + +COMMON_ARGS=-Cprefer-dynamic -Zshare-generics=yes -Ccodegen-units=1 -Zsymbol-mangling-version=v0 + +all: + $(RUSTC) instance_provider_a.rs $(COMMON_ARGS) --crate-type=rlib + $(RUSTC) instance_provider_b.rs $(COMMON_ARGS) --crate-type=rlib + $(RUSTC) instance_user_dylib.rs $(COMMON_ARGS) --crate-type=dylib + $(RUSTC) instance_user_a_rlib.rs $(COMMON_ARGS) --crate-type=rlib + $(RUSTC) instance_user_b_rlib.rs $(COMMON_ARGS) --crate-type=rlib + $(RUSTC) linked_leaf.rs $(COMMON_ARGS) --crate-type=bin diff --git a/src/test/run-make-fulldeps/share-generics-dylib/instance_provider_a.rs b/src/test/run-make-fulldeps/share-generics-dylib/instance_provider_a.rs new file mode 100644 index 0000000000..b4e125ac05 --- /dev/null +++ b/src/test/run-make-fulldeps/share-generics-dylib/instance_provider_a.rs @@ -0,0 +1,6 @@ +use std::cell::Cell; + +pub fn foo() { + let a: Cell<i32> = Cell::new(1); + a.set(123); +} diff --git a/src/test/run-make-fulldeps/share-generics-dylib/instance_provider_b.rs b/src/test/run-make-fulldeps/share-generics-dylib/instance_provider_b.rs new file mode 100644 index 0000000000..f613db873e --- /dev/null +++ b/src/test/run-make-fulldeps/share-generics-dylib/instance_provider_b.rs @@ -0,0 +1,6 @@ +use std::cell::Cell; + +pub fn foo() { + let b: Cell<i32> = Cell::new(1); + b.set(123); +} diff --git a/src/test/run-make-fulldeps/share-generics-dylib/instance_user_a_rlib.rs b/src/test/run-make-fulldeps/share-generics-dylib/instance_user_a_rlib.rs new file mode 100644 index 0000000000..c8e6ab95cf --- /dev/null +++ b/src/test/run-make-fulldeps/share-generics-dylib/instance_user_a_rlib.rs @@ -0,0 +1,9 @@ +extern crate instance_provider_a as upstream; +use std::cell::Cell; + +pub fn foo() { + upstream::foo(); + + let b: Cell<i32> = Cell::new(1); + b.set(123); +} diff --git a/src/test/run-make-fulldeps/share-generics-dylib/instance_user_b_rlib.rs b/src/test/run-make-fulldeps/share-generics-dylib/instance_user_b_rlib.rs new file mode 100644 index 0000000000..7c34af6d0d --- /dev/null +++ b/src/test/run-make-fulldeps/share-generics-dylib/instance_user_b_rlib.rs @@ -0,0 +1,9 @@ +extern crate instance_provider_b as upstream; +use std::cell::Cell; + +pub fn foo() { + upstream::foo(); + + let b: Cell<i32> = Cell::new(1); + b.set(123); +} diff --git a/src/test/run-make-fulldeps/share-generics-dylib/instance_user_dylib.rs b/src/test/run-make-fulldeps/share-generics-dylib/instance_user_dylib.rs new file mode 100644 index 0000000000..7c8368eec6 --- /dev/null +++ b/src/test/run-make-fulldeps/share-generics-dylib/instance_user_dylib.rs @@ -0,0 +1,7 @@ +extern crate instance_provider_a; +extern crate instance_provider_b; + +pub fn foo() { + instance_provider_a::foo(); + instance_provider_b::foo(); +} diff --git a/src/test/run-make-fulldeps/share-generics-dylib/linked_leaf.rs b/src/test/run-make-fulldeps/share-generics-dylib/linked_leaf.rs new file mode 100644 index 0000000000..e510dad691 --- /dev/null +++ b/src/test/run-make-fulldeps/share-generics-dylib/linked_leaf.rs @@ -0,0 +1,15 @@ +extern crate instance_user_dylib; +extern crate instance_user_a_rlib; +extern crate instance_user_b_rlib; + +use std::cell::Cell; + +fn main() { + + instance_user_a_rlib::foo(); + instance_user_b_rlib::foo(); + instance_user_dylib::foo(); + + let a: Cell<i32> = Cell::new(1); + a.set(123); +} diff --git a/src/test/run-make-fulldeps/simd-ffi/simd.rs b/src/test/run-make-fulldeps/simd-ffi/simd.rs index 75d95a4eaf..c63fe4ddce 100644 --- a/src/test/run-make-fulldeps/simd-ffi/simd.rs +++ b/src/test/run-make-fulldeps/simd-ffi/simd.rs @@ -4,35 +4,28 @@ // cross-compiled standard libraries. #![feature(no_core, optin_builtin_traits)] #![no_core] - #![feature(repr_simd, simd_ffi, link_llvm_intrinsics, lang_items, rustc_attrs)] - -#[repr(C)] #[derive(Copy)] #[repr(simd)] pub struct f32x4(f32, f32, f32, f32); - -extern { +extern "C" { #[link_name = "llvm.sqrt.v4f32"] fn vsqrt(x: f32x4) -> f32x4; } pub fn foo(x: f32x4) -> f32x4 { - unsafe {vsqrt(x)} + unsafe { vsqrt(x) } } -#[repr(C)] #[derive(Copy)] #[repr(simd)] pub struct i32x4(i32, i32, i32, i32); - -extern { +extern "C" { // _mm_sll_epi32 - #[cfg(any(target_arch = "x86", - target_arch = "x86-64"))] + #[cfg(any(target_arch = "x86", target_arch = "x86-64"))] #[link_name = "llvm.x86.sse2.psll.d"] fn integer(a: i32x4, b: i32x4) -> i32x4; @@ -48,22 +41,24 @@ extern { // just some substitute foreign symbol, not an LLVM intrinsic; so // we still get type checking, but not as detailed as (ab)using // LLVM. - #[cfg(not(any(target_arch = "x86", - target_arch = "x86-64", - target_arch = "arm", - target_arch = "aarch64")))] + #[cfg(not(any( + target_arch = "x86", + target_arch = "x86-64", + target_arch = "arm", + target_arch = "aarch64" + )))] fn integer(a: i32x4, b: i32x4) -> i32x4; } pub fn bar(a: i32x4, b: i32x4) -> i32x4 { - unsafe {integer(a, b)} + unsafe { integer(a, b) } } #[lang = "sized"] -pub trait Sized { } +pub trait Sized {} #[lang = "copy"] -pub trait Copy { } +pub trait Copy {} impl Copy for f32 {} impl Copy for i32 {} @@ -77,4 +72,6 @@ auto trait Freeze {} #[macro_export] #[rustc_builtin_macro] -macro_rules! Copy { () => () } +macro_rules! Copy { + () => {}; +} diff --git a/src/test/run-make/thumb-none-cortex-m/Makefile b/src/test/run-make/thumb-none-cortex-m/Makefile index 6791c8ccdf..36e51bcab6 100644 --- a/src/test/run-make/thumb-none-cortex-m/Makefile +++ b/src/test/run-make/thumb-none-cortex-m/Makefile @@ -10,10 +10,7 @@ # - thumbv7em-none-eabihf (Bare Cortex-M4F, M7F, FPU, hardfloat) # - thumbv7m-none-eabi (Bare Cortex-M3) -# only-thumbv6m-none-eabi -# only-thumbv7em-none-eabi -# only-thumbv7em-none-eabihf -# only-thumbv7m-none-eabi +# only-thumb # For cargo setting RUSTC := $(RUSTC_ORIGINAL) @@ -27,7 +24,8 @@ CRATE := cortex-m CRATE_URL := https://github.com/rust-embedded/cortex-m CRATE_SHA1 := a448e9156e2cb1e556e5441fd65426952ef4b927 # 0.5.0 -export RUSTFLAGS := --cap-lints=allow +# Don't make lints fatal, but they need to at least warn or they break Cargo's target info parsing. +export RUSTFLAGS := --cap-lints=warn all: env diff --git a/src/test/run-make/thumb-none-qemu/Makefile b/src/test/run-make/thumb-none-qemu/Makefile index cb1ff85912..ab8b90e154 100644 --- a/src/test/run-make/thumb-none-qemu/Makefile +++ b/src/test/run-make/thumb-none-qemu/Makefile @@ -1,7 +1,6 @@ -include ../../run-make-fulldeps/tools.mk -# only-thumbv7m-none-eabi -# only-thumbv6m-none-eabi +# only-thumb # How to run this # $ ./x.py clean diff --git a/src/test/run-make/thumb-none-qemu/example/.cargo/config b/src/test/run-make/thumb-none-qemu/example/.cargo/config index 0d6b19c124..8b30310e7d 100644 --- a/src/test/run-make/thumb-none-qemu/example/.cargo/config +++ b/src/test/run-make/thumb-none-qemu/example/.cargo/config @@ -1,12 +1,26 @@ -[target.thumbv7m-none-eabi] -# uncomment this to make `cargo run` execute programs on QEMU +[target.thumbv6m-none-eabi] +# FIXME: Should be Cortex-M0, but Qemu used by CI is too old runner = "qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel" -[target.thumbv6m-none-eabi] -# uncomment this to make `cargo run` execute programs on QEMU -# For now, we use cortex-m3 instead of cortex-m0 which are not supported by QEMU +[target.thumbv7m-none-eabi] runner = "qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel" +[target.thumbv7em-none-eabi] +runner = "qemu-system-arm -cpu cortex-m4 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel" + +[target.thumbv7em-none-eabihf] +runner = "qemu-system-arm -cpu cortex-m4 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel" + +[target.thumbv8m.base-none-eabi] +# FIXME: Should be the Cortex-M23, bt Qemu does not currently support it +runner = "qemu-system-arm -cpu cortex-m33 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel" + +[target.thumbv8m.main-none-eabi] +runner = "qemu-system-arm -cpu cortex-m33 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel" + +[target.thumbv8m.main-none-eabihf] +runner = "qemu-system-arm -cpu cortex-m33 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel" + [target.'cfg(all(target_arch = "arm", target_os = "none"))'] # uncomment ONE of these three option to make `cargo run` start a GDB session # which option to pick depends on your system @@ -28,4 +42,4 @@ rustflags = [ # "-C", "linker=arm-none-eabi-gcc", # "-C", "link-arg=-Wl,-Tlink.x", # "-C", "link-arg=-nostartfiles", -] \ No newline at end of file +] diff --git a/src/test/run-make/thumb-none-qemu/example/Cargo.lock b/src/test/run-make/thumb-none-qemu/example/Cargo.lock new file mode 100644 index 0000000000..687b962a8b --- /dev/null +++ b/src/test/run-make/thumb-none-qemu/example/Cargo.lock @@ -0,0 +1,199 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "aligned" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "as-slice 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "as-slice" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bare-metal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cortex-m" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aligned 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bare-metal 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "volatile-register 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cortex-m-rt" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cortex-m-rt-macros 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "r0 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cortex-m-rt-macros" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cortex-m-semihosting" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cortex-m 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "example" +version = "0.1.0" +dependencies = [ + "cortex-m 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cortex-m-rt 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "cortex-m-semihosting 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "panic-halt 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "generic-array" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "generic-array" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "panic-halt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro2" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "r0" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "stable_deref_trait" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "syn" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "typenum" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "vcell" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "volatile-register" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "vcell 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[metadata] +"checksum aligned 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eb1ce8b3382016136ab1d31a1b5ce807144f8b7eb2d5f16b2108f0f07edceb94" +"checksum as-slice 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "be6b7e95ac49d753f19cab5a825dea99a1149a04e4e3230b33ae16e120954c04" +"checksum bare-metal 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" +"checksum cortex-m 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2954942fbbdd49996704e6f048ce57567c3e1a4e2dc59b41ae9fde06a01fc763" +"checksum cortex-m-rt 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "33a716cd7d8627fae3892c2eede9249e50d2d79aedfb43ca28dad9a2b23876d9" +"checksum cortex-m-rt-macros 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "72b1073338d1e691b3b7aaf6bd61993e589ececce9242a02dfa5453e1b98918d" +"checksum cortex-m-semihosting 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "113ef0ecffee2b62b58f9380f4469099b30e9f9cbee2804771b4203ba1762cfa" +"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +"checksum generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0ed1e761351b56f54eb9dcd0cfaca9fd0daecf93918e1cfc01c8a3d26ee7adcd" +"checksum panic-halt 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de96540e0ebde571dc55c73d60ef407c653844e6f9a1e2fdbd40c07b9252d812" +"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" +"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +"checksum r0 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2a38df5b15c8d5c7e8654189744d8e396bddc18ad48041a500ce52d6948941f" +"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" +"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" +"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" +"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +"checksum vcell 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "876e32dcadfe563a4289e994f7cb391197f362b6315dc45e8ba4aa6f564a4b3c" +"checksum volatile-register 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0d67cb4616d99b940db1d6bd28844ff97108b498a6ca850e5b6191a532063286" diff --git a/src/test/run-make/thumb-none-qemu/example/Cargo.toml b/src/test/run-make/thumb-none-qemu/example/Cargo.toml index 73fdee71f0..051d41bbae 100644 --- a/src/test/run-make/thumb-none-qemu/example/Cargo.toml +++ b/src/test/run-make/thumb-none-qemu/example/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Hideki Sekine <sekineh@me.com>"] edition = "2018" [dependencies] -cortex-m = "0.5.4" -cortex-m-rt = "=0.5.4" +cortex-m = "0.6.2" +cortex-m-rt = "0.6.11" panic-halt = "0.2.0" cortex-m-semihosting = "0.3.1" diff --git a/src/test/run-make/thumb-none-qemu/example/src/main.rs b/src/test/run-make/thumb-none-qemu/example/src/main.rs index 4a08419a07..2abfde8e75 100644 --- a/src/test/run-make/thumb-none-qemu/example/src/main.rs +++ b/src/test/run-make/thumb-none-qemu/example/src/main.rs @@ -1,4 +1,3 @@ -// #![feature(stdsimd)] #![no_main] #![no_std] use core::fmt::Write; @@ -6,12 +5,9 @@ use cortex_m::asm; use cortex_m_rt::entry; use cortex_m_semihosting as semihosting; -//FIXME: This imports the provided #[panic_handler]. -#[allow(rust_2018_idioms)] -extern crate panic_halt; - -entry!(main); +use panic_halt as _; +#[entry] fn main() -> ! { let x = 42; diff --git a/src/test/run-make/wasm-export-all-symbols/bar.rs b/src/test/run-make/wasm-export-all-symbols/bar.rs index c5de87e8e7..ac9c20a57e 100644 --- a/src/test/run-make/wasm-export-all-symbols/bar.rs +++ b/src/test/run-make/wasm-export-all-symbols/bar.rs @@ -2,3 +2,6 @@ #[no_mangle] pub extern fn foo() {} + +#[no_mangle] +pub static FOO: u64 = 42; diff --git a/src/test/run-make/wasm-export-all-symbols/verify.js b/src/test/run-make/wasm-export-all-symbols/verify.js index 7b6fc7a456..72db3356f5 100644 --- a/src/test/run-make/wasm-export-all-symbols/verify.js +++ b/src/test/run-make/wasm-export-all-symbols/verify.js @@ -9,16 +9,20 @@ console.log('exports', list); const my_exports = {}; let nexports = 0; + for (const entry of list) { - if (entry.kind !== 'function') - continue; - my_exports[entry.name] = true; - nexports += 1; + if (entry.kind == 'function'){ + nexports += 1; + } + my_exports[entry.name] = entry.kind; } -if (my_exports.foo === undefined) +if (my_exports.foo != "function") throw new Error("`foo` wasn't defined"); +if (my_exports.FOO != "global") + throw new Error("`FOO` wasn't defined"); + if (my_exports.main === undefined) { if (nexports != 1) throw new Error("should only have one function export"); diff --git a/src/test/run-make/wasm-symbols-different-module/Makefile b/src/test/run-make/wasm-symbols-different-module/Makefile new file mode 100644 index 0000000000..bb6a5d3c9d --- /dev/null +++ b/src/test/run-make/wasm-symbols-different-module/Makefile @@ -0,0 +1,28 @@ +-include ../../run-make-fulldeps/tools.mk + +# only-wasm32-bare + +all: + $(RUSTC) foo.rs --target wasm32-unknown-unknown + $(NODE) verify-imports.js $(TMPDIR)/foo.wasm a/foo b/foo + $(RUSTC) foo.rs --target wasm32-unknown-unknown -C lto + $(NODE) verify-imports.js $(TMPDIR)/foo.wasm a/foo b/foo + $(RUSTC) foo.rs --target wasm32-unknown-unknown -O + $(NODE) verify-imports.js $(TMPDIR)/foo.wasm a/foo b/foo + $(RUSTC) foo.rs --target wasm32-unknown-unknown -O -C lto + $(NODE) verify-imports.js $(TMPDIR)/foo.wasm a/foo b/foo + + $(RUSTC) bar.rs --target wasm32-unknown-unknown + $(NODE) verify-imports.js $(TMPDIR)/bar.wasm m1/f m1/g m2/f + $(RUSTC) bar.rs --target wasm32-unknown-unknown -C lto + $(NODE) verify-imports.js $(TMPDIR)/bar.wasm m1/f m1/g m2/f + $(RUSTC) bar.rs --target wasm32-unknown-unknown -O + $(NODE) verify-imports.js $(TMPDIR)/bar.wasm m1/f m1/g m2/f + $(RUSTC) bar.rs --target wasm32-unknown-unknown -O -C lto + $(NODE) verify-imports.js $(TMPDIR)/bar.wasm m1/f m1/g m2/f + + $(RUSTC) baz.rs --target wasm32-unknown-unknown + $(NODE) verify-imports.js $(TMPDIR)/baz.wasm sqlite/allocate sqlite/deallocate + + $(RUSTC) log.rs --target wasm32-unknown-unknown + $(NODE) verify-imports.js $(TMPDIR)/log.wasm test/log diff --git a/src/test/run-make/wasm-symbols-different-module/bar.rs b/src/test/run-make/wasm-symbols-different-module/bar.rs new file mode 100644 index 0000000000..7567060d78 --- /dev/null +++ b/src/test/run-make/wasm-symbols-different-module/bar.rs @@ -0,0 +1,33 @@ +//! Issue #50021 + +#![crate_type = "cdylib"] + +mod m1 { + #[link(wasm_import_module = "m1")] + extern "C" { + pub fn f(); + } + #[link(wasm_import_module = "m1")] + extern "C" { + pub fn g(); + } +} + +mod m2 { + #[link(wasm_import_module = "m2")] + extern "C" { + pub fn f(_: i32); + } +} + +#[no_mangle] +pub unsafe fn run() { + m1::f(); + m1::g(); + + // In generated code, expected: + // (import "m2" "f" (func $f (param i32))) + // but got: + // (import "m1" "f" (func $f (param i32))) + m2::f(0); +} diff --git a/src/test/run-make/wasm-symbols-different-module/baz.rs b/src/test/run-make/wasm-symbols-different-module/baz.rs new file mode 100644 index 0000000000..fbb78619bb --- /dev/null +++ b/src/test/run-make/wasm-symbols-different-module/baz.rs @@ -0,0 +1,22 @@ +//! Issue #63562 + +#![crate_type = "cdylib"] + +mod foo { + #[link(wasm_import_module = "sqlite")] + extern "C" { + pub fn allocate(size: usize) -> i32; + pub fn deallocate(ptr: i32, size: usize); + } +} + +#[no_mangle] +pub extern "C" fn allocate() { + unsafe { + foo::allocate(1); + foo::deallocate(1, 2); + } +} + +#[no_mangle] +pub extern "C" fn deallocate() {} diff --git a/src/test/run-make/wasm-symbols-different-module/foo.rs b/src/test/run-make/wasm-symbols-different-module/foo.rs new file mode 100644 index 0000000000..a4ba7e714c --- /dev/null +++ b/src/test/run-make/wasm-symbols-different-module/foo.rs @@ -0,0 +1,23 @@ +#![crate_type = "cdylib"] + +mod a { + #[link(wasm_import_module = "a")] + extern "C" { + pub fn foo(); + } +} + +mod b { + #[link(wasm_import_module = "b")] + extern "C" { + pub fn foo(); + } +} + +#[no_mangle] +pub fn start() { + unsafe { + a::foo(); + b::foo(); + } +} diff --git a/src/test/run-make/wasm-symbols-different-module/log.rs b/src/test/run-make/wasm-symbols-different-module/log.rs new file mode 100644 index 0000000000..ea3e0b4b2b --- /dev/null +++ b/src/test/run-make/wasm-symbols-different-module/log.rs @@ -0,0 +1,16 @@ +//! Issue #56309 + +#![crate_type = "cdylib"] + +#[link(wasm_import_module = "test")] +extern "C" { + fn log(message_data: u32, message_size: u32); +} + +#[no_mangle] +pub fn main() { + let message = "Hello, world!"; + unsafe { + log(message.as_ptr() as u32, message.len() as u32); + } +} diff --git a/src/test/run-make/wasm-symbols-different-module/verify-imports.js b/src/test/run-make/wasm-symbols-different-module/verify-imports.js new file mode 100644 index 0000000000..7e9f90cf8b --- /dev/null +++ b/src/test/run-make/wasm-symbols-different-module/verify-imports.js @@ -0,0 +1,32 @@ +const fs = require('fs'); +const process = require('process'); +const assert = require('assert'); +const buffer = fs.readFileSync(process.argv[2]); + +let m = new WebAssembly.Module(buffer); +let list = WebAssembly.Module.imports(m); +console.log('imports', list); +if (list.length !== process.argv.length - 3) + throw new Error("wrong number of imports") + +const imports = new Map(); +for (let i = 3; i < process.argv.length; i++) { + const [module, name] = process.argv[i].split('/'); + if (!imports.has(module)) + imports.set(module, new Map()); + imports.get(module).set(name, true); +} + +for (let i of list) { + if (imports.get(i.module) === undefined || imports.get(i.module).get(i.name) === undefined) + throw new Error(`didn't find import of ${i.module}::${i.name}`); + imports.get(i.module).delete(i.name); + + if (imports.get(i.module).size === 0) + imports.delete(i.module); +} + +console.log(imports); +if (imports.size !== 0) { + throw new Error('extra imports'); +} diff --git a/src/test/rustdoc-ui/failed-doctest-output.stdout b/src/test/rustdoc-ui/failed-doctest-output.stdout index 9887d07a3e..ee79ae1a69 100644 --- a/src/test/rustdoc-ui/failed-doctest-output.stdout +++ b/src/test/rustdoc-ui/failed-doctest-output.stdout @@ -27,7 +27,7 @@ stderr: stderr 1 stderr 2 thread 'main' panicked at 'oh no', $DIR/failed-doctest-output.rs:7:1 -note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/src/test/rustdoc-ui/invalid-syntax.rs b/src/test/rustdoc-ui/invalid-syntax.rs index 34e92c4210..72037dd74b 100644 --- a/src/test/rustdoc-ui/invalid-syntax.rs +++ b/src/test/rustdoc-ui/invalid-syntax.rs @@ -93,3 +93,9 @@ pub fn empty_rust_with_whitespace() {} /// pub fn indent_after_fenced() {} //~^^^ WARNING could not parse code block as Rust code + +/// ``` +/// "invalid +/// ``` +pub fn invalid() {} +//~^^^^ WARNING could not parse code block as Rust code diff --git a/src/test/rustdoc-ui/invalid-syntax.stderr b/src/test/rustdoc-ui/invalid-syntax.stderr index fe5442163e..a90d3bbb97 100644 --- a/src/test/rustdoc-ui/invalid-syntax.stderr +++ b/src/test/rustdoc-ui/invalid-syntax.stderr @@ -1,21 +1,3 @@ -error: unknown start of token: \ - --> <doctest>:1:1 - | -1 | \__________pkt->size___________/ \_result->size_/ \__pkt->size__/ - | ^ - -error: unknown start of token: \ - --> <doctest>:1:43 - | -1 | \__________pkt->size___________/ \_result->size_/ \__pkt->size__/ - | ^ - -error: unknown start of token: \ - --> <doctest>:1:60 - | -1 | \__________pkt->size___________/ \_result->size_/ \__pkt->size__/ - | ^ - warning: could not parse code block as Rust code --> $DIR/invalid-syntax.rs:3:5 | @@ -25,33 +7,14 @@ LL | | /// \__________pkt->size___________/ \_result->size_/ \__pkt->si LL | | /// ``` | |_______^ | + = note: error from rustc: unknown start of token: \ + = note: error from rustc: unknown start of token: \ + = note: error from rustc: unknown start of token: \ help: mark blocks that do not contain Rust code as text | LL | /// ```text | ^^^^^^^ -error: unknown start of token: ` - --> <doctest>:3:30 - | -3 | | ^^^^^^ did you mean `baz::foobar`? - | ^ - | -help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not - | -3 | | ^^^^^^ did you mean 'baz::foobar`? - | ^ - -error: unknown start of token: ` - --> <doctest>:3:42 - | -3 | | ^^^^^^ did you mean `baz::foobar`? - | ^ - | -help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not - | -3 | | ^^^^^^ did you mean `baz::foobar'? - | ^ - warning: could not parse code block as Rust code --> $DIR/invalid-syntax.rs:9:5 | @@ -63,17 +26,13 @@ LL | | /// | ^^^^^^ did you mean `baz::foobar`? LL | | /// ``` | |_______^ | + = note: error from rustc: unknown start of token: ` + = note: error from rustc: unknown start of token: ` help: mark blocks that do not contain Rust code as text | LL | /// ```text | ^^^^^^^ -error: unknown start of token: \ - --> <doctest>:1:1 - | -1 | \_ - | ^ - warning: could not parse code block as Rust code --> $DIR/invalid-syntax.rs:21:5 | @@ -83,17 +42,12 @@ LL | | /// \_ LL | | /// ``` | |_______^ | + = note: error from rustc: unknown start of token: \ help: mark blocks that do not contain Rust code as text | LL | /// ```text | ^^^^^^^ -error: unknown start of token: \ - --> <doctest>:1:1 - | -1 | \_ - | ^ - warning: could not parse code block as Rust code --> $DIR/invalid-syntax.rs:35:5 | @@ -102,12 +56,8 @@ LL | /// ```rust LL | | /// \_ LL | | /// ``` | |_______^ - -error: unknown start of token: \ - --> <doctest>:2:5 - | -2 | \_ - | ^ + | + = note: error from rustc: unknown start of token: \ warning: could not parse code block as Rust code --> $DIR/invalid-syntax.rs:45:9 @@ -116,51 +66,18 @@ LL | /// code with bad syntax | _________^ LL | | /// \_ | |__________^ - -error: unknown start of token: ` - --> <doctest>:1:1 - | -1 | ``` - | ^ - | -help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not - | -1 | '`` - | ^ - -error: unknown start of token: ` - --> <doctest>:1:2 - | -1 | ``` - | ^ - | -help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not - | -1 | `'` - | ^ - -error: unknown start of token: ` - --> <doctest>:1:3 - | -1 | ``` - | ^ - | -help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not - | -1 | ``' - | ^ + | + = note: error from rustc: unknown start of token: \ warning: could not parse code block as Rust code --> $DIR/invalid-syntax.rs:60:9 | LL | /// ``` | ^^^ - -error: unknown start of token: \ - --> <doctest>:1:1 - | -1 | \_ - | ^ + | + = note: error from rustc: unknown start of token: ` + = note: error from rustc: unknown start of token: ` + = note: error from rustc: unknown start of token: ` warning: could not parse code block as Rust code --> $DIR/invalid-syntax.rs:64:5 @@ -170,12 +87,8 @@ LL | /// ```edition2018 LL | | /// \_ LL | | /// ``` | |_______^ - -error: unknown start of token: \ - --> <doctest>:1:1 - | -1 | \_ - | ^ + | + = note: error from rustc: unknown start of token: \ warning: doc comment contains an invalid Rust code block --> $DIR/invalid-syntax.rs:70:1 @@ -186,6 +99,7 @@ LL | | #[doc = "```"] | |______________^ | = help: mark blocks that do not contain Rust code as text: ```text + = note: error from rustc: unknown start of token: \ warning: Rust code block is empty --> $DIR/invalid-syntax.rs:76:5 @@ -210,15 +124,26 @@ help: mark blocks that do not contain Rust code as text LL | /// ```text | ^^^^^^^ -error: unknown start of token: \ - --> <doctest>:1:1 - | -1 | \____/ - | ^ - warning: could not parse code block as Rust code --> $DIR/invalid-syntax.rs:92:9 | LL | /// \____/ | ^^^^^^ + | + = note: error from rustc: unknown start of token: \ + +warning: could not parse code block as Rust code + --> $DIR/invalid-syntax.rs:97:5 + | +LL | /// ``` + | _____^ +LL | | /// "invalid +LL | | /// ``` + | |_______^ + | + = note: error from rustc: unterminated double quote string +help: mark blocks that do not contain Rust code as text + | +LL | /// ```text + | ^^^^^^^ diff --git a/src/test/rustdoc-ui/test-compile-fail1.rs b/src/test/rustdoc-ui/test-compile-fail1.rs new file mode 100644 index 0000000000..a053902387 --- /dev/null +++ b/src/test/rustdoc-ui/test-compile-fail1.rs @@ -0,0 +1,8 @@ +// compile-flags:--test + +/// ``` +/// assert!(true) +/// ``` +pub fn f() {} + +pub fn f() {} diff --git a/src/test/rustdoc-ui/test-compile-fail1.stderr b/src/test/rustdoc-ui/test-compile-fail1.stderr new file mode 100644 index 0000000000..2b38ba9e97 --- /dev/null +++ b/src/test/rustdoc-ui/test-compile-fail1.stderr @@ -0,0 +1,14 @@ +error[E0428]: the name `f` is defined multiple times + --> $DIR/test-compile-fail1.rs:8:1 + | +6 | pub fn f() {} + | ---------- previous definition of the value `f` here +7 | +8 | pub fn f() {} + | ^^^^^^^^^^ `f` redefined here + | + = note: `f` must be defined only once in the value namespace of this module + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0428`. diff --git a/src/test/rustdoc-ui/test-compile-fail2.rs b/src/test/rustdoc-ui/test-compile-fail2.rs new file mode 100644 index 0000000000..651ded0a04 --- /dev/null +++ b/src/test/rustdoc-ui/test-compile-fail2.rs @@ -0,0 +1,3 @@ +// compile-flags:--test + +fail diff --git a/src/test/rustdoc-ui/test-compile-fail2.stderr b/src/test/rustdoc-ui/test-compile-fail2.stderr new file mode 100644 index 0000000000..cee5b63cf5 --- /dev/null +++ b/src/test/rustdoc-ui/test-compile-fail2.stderr @@ -0,0 +1,8 @@ +error: expected one of `!` or `::`, found `<eof>` + --> $DIR/test-compile-fail2.rs:3:1 + | +3 | fail + | ^^^^ expected one of `!` or `::` + +error: aborting due to previous error + diff --git a/src/test/rustdoc-ui/test-compile-fail3.rs b/src/test/rustdoc-ui/test-compile-fail3.rs new file mode 100644 index 0000000000..faa30ad836 --- /dev/null +++ b/src/test/rustdoc-ui/test-compile-fail3.rs @@ -0,0 +1,3 @@ +// compile-flags:--test + +"fail diff --git a/src/test/rustdoc-ui/test-compile-fail3.stderr b/src/test/rustdoc-ui/test-compile-fail3.stderr new file mode 100644 index 0000000000..7a2f1815ed --- /dev/null +++ b/src/test/rustdoc-ui/test-compile-fail3.stderr @@ -0,0 +1,8 @@ +error: unterminated double quote string + --> $DIR/test-compile-fail3.rs:3:1 + | +3 | "fail + | ^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/rustdoc-ui/test-no_std.rs b/src/test/rustdoc-ui/test-no_std.rs new file mode 100644 index 0000000000..166a87382c --- /dev/null +++ b/src/test/rustdoc-ui/test-no_std.rs @@ -0,0 +1,12 @@ +// compile-flags:--test +// normalize-stdout-test: "src/test/rustdoc-ui" -> "$$DIR" +// build-pass + +#![no_std] + +extern crate alloc; + +/// ``` +/// assert!(true) +/// ``` +pub fn f() {} diff --git a/src/test/rustdoc-ui/test-no_std.stdout b/src/test/rustdoc-ui/test-no_std.stdout new file mode 100644 index 0000000000..9cdcac2a48 --- /dev/null +++ b/src/test/rustdoc-ui/test-no_std.stdout @@ -0,0 +1,6 @@ + +running 1 test +test $DIR/test-no_std.rs - f (line 9) ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out + diff --git a/src/test/rustdoc/async-fn.rs b/src/test/rustdoc/async-fn.rs index 5f9708a397..5a03e821e8 100644 --- a/src/test/rustdoc/async-fn.rs +++ b/src/test/rustdoc/async-fn.rs @@ -15,6 +15,11 @@ pub async fn baz<T>(a: T) -> T { a } +// @has async_fn/fn.qux.html '//pre[@class="rust fn"]' 'pub async unsafe fn qux() -> char' +pub async unsafe fn qux() -> char { + '⚠' +} + trait Bar {} impl Bar for () {} @@ -26,8 +31,10 @@ pub async fn quux() -> impl Bar { // @has async_fn/struct.Foo.html // @matches - '//code' 'pub async fn f\(\)$' +// @matches - '//code' 'pub async unsafe fn g\(\)$' pub struct Foo; impl Foo { pub async fn f() {} + pub async unsafe fn g() {} } diff --git a/src/test/rustdoc/auto_aliases.rs b/src/test/rustdoc/auto_aliases.rs new file mode 100644 index 0000000000..7b52a69f56 --- /dev/null +++ b/src/test/rustdoc/auto_aliases.rs @@ -0,0 +1,6 @@ +#![feature(optin_builtin_traits)] + +// @has auto_aliases/trait.Bar.html '//h3[@aliases="auto_aliases::Foo"]' 'impl Bar for Foo' +pub struct Foo; + +pub auto trait Bar {} diff --git a/src/test/rustdoc/bad-codeblock-syntax.rs b/src/test/rustdoc/bad-codeblock-syntax.rs index 0ab2f68fcd..afef86ec9c 100644 --- a/src/test/rustdoc/bad-codeblock-syntax.rs +++ b/src/test/rustdoc/bad-codeblock-syntax.rs @@ -25,3 +25,18 @@ pub fn quux() {} /// \_ /// ``` pub fn ok() {} + +// @has bad_codeblock_syntax/fn.escape.html +// @has - '//*[@class="docblock"]/pre/code' '\_ <script>alert("not valid Rust");</script>' +/// ``` +/// \_ +/// <script>alert("not valid Rust");</script> +/// ``` +pub fn escape() {} + +// @has bad_codeblock_syntax/fn.unterminated.html +// @has - '//*[@class="docblock"]/pre/code' '"unterminated' +/// ``` +/// "unterminated +/// ``` +pub fn unterminated() {} diff --git a/src/test/rustdoc/const-display.rs b/src/test/rustdoc/const-display.rs index bc7ad04b6a..8e0d230f7d 100644 --- a/src/test/rustdoc/const-display.rs +++ b/src/test/rustdoc/const-display.rs @@ -2,18 +2,18 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(foo, foo2)] #![feature(staged_api)] // @has 'foo/fn.foo.html' '//pre' 'pub unsafe fn foo() -> u32' #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] pub const unsafe fn foo() -> u32 { 42 } // @has 'foo/fn.foo2.html' '//pre' 'pub fn foo2() -> u32' -#[unstable(feature = "humans", issue="0")] +#[unstable(feature = "humans", issue = "none")] pub const fn foo2() -> u32 { 42 } // @has 'foo/fn.bar2.html' '//pre' 'pub const fn bar2() -> u32' @@ -22,7 +22,7 @@ pub const fn foo2() -> u32 { 42 } pub const fn bar2() -> u32 { 42 } // @has 'foo/fn.foo2_gated.html' '//pre' 'pub unsafe fn foo2_gated() -> u32' -#[unstable(feature = "foo2", issue="0")] +#[unstable(feature = "foo2", issue = "none")] pub const unsafe fn foo2_gated() -> u32 { 42 } // @has 'foo/fn.bar2_gated.html' '//pre' 'pub const unsafe fn bar2_gated() -> u32' diff --git a/src/test/rustdoc/const-generics/add-impl.rs b/src/test/rustdoc/const-generics/add-impl.rs index ed45d33972..54bdd768f8 100644 --- a/src/test/rustdoc/const-generics/add-impl.rs +++ b/src/test/rustdoc/const-generics/add-impl.rs @@ -11,7 +11,7 @@ pub struct Simd<T, const WIDTH: usize> { inner: T, } -// @has foo/struct.Simd.html '//div[@id="implementations-list"]/h3/code' 'impl Add<Simd<u8, 16>> for Simd<u8, 16>' +// @has foo/struct.Simd.html '//div[@id="implementations-list"]/h3/code' 'impl Add<Simd<u8, 16usize>> for Simd<u8, 16>' impl Add for Simd<u8, 16> { type Output = Self; diff --git a/src/test/rustdoc/const-generics/const-impl.rs b/src/test/rustdoc/const-generics/const-impl.rs index 2d506787b3..7361b22b74 100644 --- a/src/test/rustdoc/const-generics/const-impl.rs +++ b/src/test/rustdoc/const-generics/const-impl.rs @@ -17,16 +17,23 @@ pub struct VSet<T, const ORDER: Order> { inner: Vec<T>, } -// @has foo/struct.VSet.html '//h3[@id="impl"]/code' 'impl<T> VSet<T, { Order::Sorted }>' +// @has foo/struct.VSet.html '//h3[@id="impl"]/code' 'impl<T> VSet<T, {Order::Sorted}>' impl <T> VSet<T, {Order::Sorted}> { pub fn new() -> Self { Self { inner: Vec::new() } } } -// @has foo/struct.VSet.html '//h3[@id="impl-1"]/code' 'impl<T> VSet<T, { Order::Unsorted }>' +// @has foo/struct.VSet.html '//h3[@id="impl-1"]/code' 'impl<T> VSet<T, {Order::Unsorted}>' impl <T> VSet<T, {Order::Unsorted}> { pub fn new() -> Self { Self { inner: Vec::new() } } } + +pub struct Escape<const S: &'static str>; + +// @has foo/struct.Escape.html '//h3[@id="impl"]/code' 'impl Escape<{ r#"<script>alert("Escape");</script>"# }>' +impl Escape<{ r#"<script>alert("Escape");</script>"# }> { + pub fn f() {} +} diff --git a/src/test/rustdoc/const-underscore.rs b/src/test/rustdoc/const-underscore.rs new file mode 100644 index 0000000000..0d4809409f --- /dev/null +++ b/src/test/rustdoc/const-underscore.rs @@ -0,0 +1,7 @@ +// compile-flags: --document-private-items + +// @!has const_underscore/constant._.html +const _: () = { + #[no_mangle] + extern "C" fn implementation_detail() {} +}; diff --git a/src/test/rustdoc/deref-typedef.rs b/src/test/rustdoc/deref-typedef.rs new file mode 100644 index 0000000000..770f8d7289 --- /dev/null +++ b/src/test/rustdoc/deref-typedef.rs @@ -0,0 +1,33 @@ +#![crate_name = "foo"] + +// @has 'foo/struct.Bar.html' +// @has '-' '//*[@id="deref-methods"]' 'Methods from Deref<Target = FooC>' +// @has '-' '//*[@class="impl-items"]//*[@id="method.foo_a"]' 'pub fn foo_a(&self)' +// @has '-' '//*[@class="impl-items"]//*[@id="method.foo_b"]' 'pub fn foo_b(&self)' +// @has '-' '//*[@class="impl-items"]//*[@id="method.foo_c"]' 'pub fn foo_c(&self)' +// @has '-' '//*[@class="sidebar-title"]' 'Methods from Deref<Target=FooC>' +// @has '-' '//*[@class="sidebar-links"]/a[@href="#method.foo_a"]' 'foo_a' +// @has '-' '//*[@class="sidebar-links"]/a[@href="#method.foo_b"]' 'foo_b' +// @has '-' '//*[@class="sidebar-links"]/a[@href="#method.foo_c"]' 'foo_c' + +pub struct FooA; +pub type FooB = FooA; +pub type FooC = FooB; + +impl FooA { + pub fn foo_a(&self) {} +} + +impl FooB { + pub fn foo_b(&self) {} +} + +impl FooC { + pub fn foo_c(&self) {} +} + +pub struct Bar; +impl std::ops::Deref for Bar { + type Target = FooC; + fn deref(&self) -> &Self::Target { unimplemented!() } +} diff --git a/src/test/rustdoc/dont-show-const-contents.rs b/src/test/rustdoc/dont-show-const-contents.rs deleted file mode 100644 index 656d579e4f..0000000000 --- a/src/test/rustdoc/dont-show-const-contents.rs +++ /dev/null @@ -1,5 +0,0 @@ -// Test that the contents of constants are not displayed as part of the -// documentation. - -// @!has dont_show_const_contents/constant.CONST_S.html 'dont show this' -pub const CONST_S: &'static str = "dont show this"; diff --git a/src/test/rustdoc/duplicate-cfg.rs b/src/test/rustdoc/duplicate-cfg.rs index 505d6ee769..9ccc5d7882 100644 --- a/src/test/rustdoc/duplicate-cfg.rs +++ b/src/test/rustdoc/duplicate-cfg.rs @@ -1,15 +1,42 @@ +// ignore-tidy-linelength + #![crate_name = "foo"] #![feature(doc_cfg)] -// @has 'foo/index.html' -// @!has '-' '//*[@class="stab portability"]' 'feature="sync" and' -// @has '-' '//*[@class="stab portability"]' 'feature="sync"' +// @has 'foo/struct.Foo.html' +// @has '-' '//*[@class="stab portability"]' 'This is supported on feature="sync" only.' #[doc(cfg(feature = "sync"))] #[doc(cfg(feature = "sync"))] pub struct Foo; +// @has 'foo/bar/struct.Bar.html' +// @has '-' '//*[@class="stab portability"]' 'This is supported on feature="sync" only.' #[doc(cfg(feature = "sync"))] pub mod bar { #[doc(cfg(feature = "sync"))] pub struct Bar; } + +// @has 'foo/baz/struct.Baz.html' +// @has '-' '//*[@class="stab portability"]' 'This is supported on feature="sync" and feature="send" only.' +#[doc(cfg(all(feature = "sync", feature = "send")))] +pub mod baz { + #[doc(cfg(feature = "sync"))] + pub struct Baz; +} + +// @has 'foo/qux/struct.Qux.html' +// @has '-' '//*[@class="stab portability"]' 'This is supported on feature="sync" and feature="send" only.' +#[doc(cfg(feature = "sync"))] +pub mod qux { + #[doc(cfg(all(feature = "sync", feature = "send")))] + pub struct Qux; +} + +// @has 'foo/quux/struct.Quux.html' +// @has '-' '//*[@class="stab portability"]' 'This is supported on feature="sync" and feature="send" and foo and bar only.' +#[doc(cfg(all(feature = "sync", feature = "send", foo)))] +pub mod quux { + #[doc(cfg(all(feature = "send", feature = "sync", bar)))] + pub struct Quux; +} diff --git a/src/test/rustdoc/inline_cross/auxiliary/macros.rs b/src/test/rustdoc/inline_cross/auxiliary/macros.rs index 6189b01803..2165be9745 100644 --- a/src/test/rustdoc/inline_cross/auxiliary/macros.rs +++ b/src/test/rustdoc/inline_cross/auxiliary/macros.rs @@ -3,7 +3,7 @@ #![stable(feature = "rust1", since = "1.0.0")] /// docs for my_macro -#[unstable(feature = "macro_test", issue = "0")] +#[unstable(feature = "macro_test", issue = "none")] #[rustc_deprecated(since = "1.2.3", reason = "text")] #[macro_export] macro_rules! my_macro { diff --git a/src/test/rustdoc/issue-52873.rs b/src/test/rustdoc/issue-52873.rs index 653c004c04..8000ce73bd 100644 --- a/src/test/rustdoc/issue-52873.rs +++ b/src/test/rustdoc/issue-52873.rs @@ -105,8 +105,7 @@ impl<U: Unsigned, B: Bit> Add<B0> for UInt<U, B> { impl<U: Unsigned> Add<U> for UTerm { type Output = U; fn add(self, _: U) -> Self::Output { - #[allow(deprecated)] - unsafe { ::std::mem::uninitialized() } + unimplemented!() } } @@ -137,7 +136,7 @@ where { type Output = UInt<Prod<Ul, UInt<Ur, B>>, B0>; fn mul(self, _: UInt<Ur, B>) -> Self::Output { - unsafe { ::std::mem::uninitialized() } + unimplemented!() } } diff --git a/src/test/rustdoc/playground-syntax-error.rs b/src/test/rustdoc/playground-syntax-error.rs new file mode 100644 index 0000000000..8918ae874f --- /dev/null +++ b/src/test/rustdoc/playground-syntax-error.rs @@ -0,0 +1,21 @@ +#![crate_name = "foo"] +#![doc(html_playground_url = "https://play.rust-lang.org/")] + +/// bar docs +/// +/// ```edition2015 +/// use std::future::Future; +/// use std::pin::Pin; +/// fn foo_recursive(n: usize) -> Pin<Box<dyn Future<Output = ()>>> { +/// Box::pin(async move { +/// if n > 0 { +/// foo_recursive(n - 1).await; +/// } +/// }) +/// } +/// ``` +pub fn bar() {} + +// @has foo/fn.bar.html +// @has - '//a[@class="test-arrow"]' "Run" +// @has - '//*[@class="docblock"]' 'foo_recursive' diff --git a/src/test/rustdoc/remove-url-from-headings.rs b/src/test/rustdoc/remove-url-from-headings.rs new file mode 100644 index 0000000000..9761c1ddbe --- /dev/null +++ b/src/test/rustdoc/remove-url-from-headings.rs @@ -0,0 +1,17 @@ +#![crate_name = "foo"] + +// @has foo/fn.foo.html +// !@has - '//a[@href="http://a.a"]' +// @has - '//a[@href="#implementing-stuff-somewhere"]' 'Implementing stuff somewhere' +// @has - '//a[@href="#another-one-urg"]' 'Another one urg' + +/// fooo +/// +/// # Implementing [stuff](http://a.a "title") somewhere +/// +/// hello +/// +/// # Another [one][two] urg +/// +/// [two]: http://a.a +pub fn foo() {} diff --git a/src/test/rustdoc/show-const-contents.rs b/src/test/rustdoc/show-const-contents.rs new file mode 100644 index 0000000000..e84f6e52c7 --- /dev/null +++ b/src/test/rustdoc/show-const-contents.rs @@ -0,0 +1,67 @@ +// Test that the contents of constants are displayed as part of the +// documentation. + +// @has show_const_contents/constant.CONST_S.html 'show this' +// @!has show_const_contents/constant.CONST_S.html '; //' +pub const CONST_S: &'static str = "show this"; + +// @has show_const_contents/constant.CONST_I32.html '= 42;' +// @!has show_const_contents/constant.CONST_I32.html '; //' +pub const CONST_I32: i32 = 42; + +// @has show_const_contents/constant.CONST_I32_HEX.html '= 0x42;' +// @!has show_const_contents/constant.CONST_I32_HEX.html '; //' +pub const CONST_I32_HEX: i32 = 0x42; + +// @has show_const_contents/constant.CONST_NEG_I32.html '= -42;' +// @!has show_const_contents/constant.CONST_NEG_I32.html '; //' +pub const CONST_NEG_I32: i32 = -42; + +// @has show_const_contents/constant.CONST_EQ_TO_VALUE_I32.html '= 42i32;' +// @!has show_const_contents/constant.CONST_EQ_TO_VALUE_I32.html '// 42i32' +pub const CONST_EQ_TO_VALUE_I32: i32 = 42i32; + +// @has show_const_contents/constant.CONST_CALC_I32.html '= 42 + 1; // 43i32' +pub const CONST_CALC_I32: i32 = 42 + 1; + +// @!has show_const_contents/constant.CONST_REF_I32.html '= &42;' +// @!has show_const_contents/constant.CONST_REF_I32.html '; //' +pub const CONST_REF_I32: &'static i32 = &42; + +// @has show_const_contents/constant.CONST_I32_MAX.html '= i32::max_value(); // 2_147_483_647i32' +pub const CONST_I32_MAX: i32 = i32::max_value(); + +// @!has show_const_contents/constant.UNIT.html '= ();' +// @!has show_const_contents/constant.UNIT.html '; //' +pub const UNIT: () = (); + +pub struct MyType(i32); + +// @!has show_const_contents/constant.MY_TYPE.html '= MyType(42);' +// @!has show_const_contents/constant.MY_TYPE.html '; //' +pub const MY_TYPE: MyType = MyType(42); + +pub struct MyTypeWithStr(&'static str); + +// @!has show_const_contents/constant.MY_TYPE_WITH_STR.html '= MyTypeWithStr("show this");' +// @!has show_const_contents/constant.MY_TYPE_WITH_STR.html '; //' +pub const MY_TYPE_WITH_STR: MyTypeWithStr = MyTypeWithStr("show this"); + +// @has show_const_contents/constant.EPSILON.html '1.1920929e-7f32;' +// @!has show_const_contents/constant.EPSILON.html '; //' +pub use std::f32::EPSILON; + +// @has show_const_contents/constant.MAX.html '= i32::max_value(); // 2_147_483_647i32' +pub use std::i32::MAX; + +macro_rules! int_module { + ($T:ident) => ( + pub const MIN: $T = $T::min_value(); + ) +} + +// @has show_const_contents/constant.MIN.html '= i16::min_value(); // -32_768i16' +int_module!(i16); + +// @has show_const_contents/constant.ESCAPE.html //pre '= r#"<script>alert("ESCAPE");</script>"#;' +pub const ESCAPE: &str = r#"<script>alert("ESCAPE");</script>"#; diff --git a/src/test/rustdoc/stability.rs b/src/test/rustdoc/stability.rs index 18a2160349..b1b97fe134 100644 --- a/src/test/rustdoc/stability.rs +++ b/src/test/rustdoc/stability.rs @@ -1,6 +1,6 @@ #![feature(staged_api)] -#![unstable(feature = "test", issue = "0")] +#![unstable(feature = "test", issue = "none")] pub struct Unstable { // @has stability/struct.Unstable.html \ diff --git a/src/test/rustdoc/unit-return.rs b/src/test/rustdoc/unit-return.rs index ae3a603151..b1f251dae6 100644 --- a/src/test/rustdoc/unit-return.rs +++ b/src/test/rustdoc/unit-return.rs @@ -10,8 +10,8 @@ pub fn f0<F: FnMut(u8) + Clone>(f: F) {} // @has 'foo/fn.f1.html' '//*[@class="rust fn"]' 'F: FnMut(u16) + Clone' pub fn f1<F: FnMut(u16) -> () + Clone>(f: F) {} -// @has 'foo/fn.f2.html' '//*[@class="rust fn"]' 'F: FnMut(u32) + Clone' +// @has 'foo/fn.f2.html' '//*[@class="rust fn"]' 'F: Clone + FnMut(u32)' pub use unit_return::f2; -// @has 'foo/fn.f3.html' '//*[@class="rust fn"]' 'F: FnMut(u64) + Clone' +// @has 'foo/fn.f3.html' '//*[@class="rust fn"]' 'F: Clone + FnMut(u64)' pub use unit_return::f3; diff --git a/src/test/ui-fulldeps/ast_stmt_expr_attr.rs b/src/test/ui-fulldeps/ast_stmt_expr_attr.rs deleted file mode 100644 index d6d49df63e..0000000000 --- a/src/test/ui-fulldeps/ast_stmt_expr_attr.rs +++ /dev/null @@ -1,311 +0,0 @@ -// run-pass - -#![allow(unused_imports)] -// ignore-cross-compile - -#![feature(rustc_private)] - -extern crate syntax; -extern crate syntax_expand; -extern crate rustc_parse; -extern crate rustc_errors; - -use rustc_errors::PResult; -use rustc_parse::parser::attr::*; -use rustc_parse::new_parser_from_source_str; -use rustc_parse::parser::Parser; -use syntax::ast::*; -use syntax::attr::*; -use syntax::ast; -use syntax::sess::ParseSess; -use syntax::source_map::{FilePathMapping, FileName}; -use syntax::ptr::P; -use syntax::print::pprust; -use syntax::token; -use std::fmt; - -// Copied out of syntax::util::parser_testing - -pub fn string_to_parser<'a>(ps: &'a ParseSess, source_str: String) -> Parser<'a> { - new_parser_from_source_str(ps, FileName::Custom(source_str.clone()), source_str) -} - -fn with_error_checking_parse<'a, T, F>(s: String, ps: &'a ParseSess, f: F) -> PResult<'a, T> where - F: FnOnce(&mut Parser<'a>) -> PResult<'a, T>, -{ - let mut p = string_to_parser(&ps, s); - let x = f(&mut p); - - if ps.span_diagnostic.has_errors() || p.token != token::Eof { - if let Err(mut e) = x { - e.cancel(); - } - return Err(p.fatal("parse error")); - } - - x -} - -fn expr<'a>(s: &str, ps: &'a ParseSess) -> PResult<'a, P<ast::Expr>> { - with_error_checking_parse(s.to_string(), ps, |p| { - p.parse_expr() - }) -} - -fn stmt<'a>(s: &str, ps: &'a ParseSess) -> PResult<'a, ast::Stmt> { - with_error_checking_parse(s.to_string(), ps, |p| { - p.parse_stmt().map(|s| s.unwrap()) - }) -} - -fn attr<'a>(s: &str, ps: &'a ParseSess) -> PResult<'a, ast::Attribute> { - with_error_checking_parse(s.to_string(), ps, |p| { - p.parse_attribute(true) - }) -} - -fn str_compare<T, F: Fn(&T) -> String>(e: &str, expected: &[T], actual: &[T], f: F) { - let expected: Vec<_> = expected.iter().map(|e| f(e)).collect(); - let actual: Vec<_> = actual.iter().map(|e| f(e)).collect(); - - if expected != actual { - panic!("parsed `{}` as {:?}, expected {:?}", e, actual, expected); - } -} - -fn sess() -> ParseSess { - ParseSess::new(FilePathMapping::empty()) -} - -fn check_expr_attrs(es: &str, expected: &[&str]) { - let ps = sess(); - let e = expr(es, &ps).expect("parse error"); - let actual = &e.attrs; - str_compare(es, - &expected.iter().map(|r| attr(r, &ps).unwrap()).collect::<Vec<_>>(), - &actual, - pprust::attribute_to_string); -} - -fn check_stmt_attrs(es: &str, expected: &[&str]) { - let ps = sess(); - let e = stmt(es, &ps).expect("parse error"); - let actual = e.kind.attrs(); - str_compare(es, - &expected.iter().map(|r| attr(r, &ps).unwrap()).collect::<Vec<_>>(), - actual, - pprust::attribute_to_string); -} - -fn reject_expr_parse(es: &str) { - let ps = sess(); - match expr(es, &ps) { - Ok(_) => panic!("parser did not reject `{}`", es), - Err(mut e) => e.cancel(), - }; -} - -fn reject_stmt_parse(es: &str) { - let ps = sess(); - match stmt(es, &ps) { - Ok(_) => panic!("parser did not reject `{}`", es), - Err(mut e) => e.cancel(), - }; -} - -fn main() { - syntax::with_default_globals(|| run()); -} - -fn run() { - let both = &["#[attr]", "#![attr]"]; - let outer = &["#[attr]"]; - let none = &[]; - - check_expr_attrs("#[attr] box 0", outer); - reject_expr_parse("box #![attr] 0"); - - check_expr_attrs("#[attr] [#![attr]]", both); - check_expr_attrs("#[attr] [#![attr] 0]", both); - check_expr_attrs("#[attr] [#![attr] 0; 0]", both); - check_expr_attrs("#[attr] [#![attr] 0, 0, 0]", both); - reject_expr_parse("[#[attr]]"); - - check_expr_attrs("#[attr] foo()", outer); - check_expr_attrs("#[attr] x.foo()", outer); - reject_expr_parse("foo#[attr]()"); - reject_expr_parse("foo(#![attr])"); - reject_expr_parse("x.foo(#![attr])"); - reject_expr_parse("x.#[attr]foo()"); - reject_expr_parse("x.#![attr]foo()"); - - check_expr_attrs("#[attr] (#![attr])", both); - check_expr_attrs("#[attr] (#![attr] #[attr] 0,)", both); - check_expr_attrs("#[attr] (#![attr] #[attr] 0, 0)", both); - - check_expr_attrs("#[attr] 0 + #[attr] 0", none); - check_expr_attrs("#[attr] 0 / #[attr] 0", none); - check_expr_attrs("#[attr] 0 & #[attr] 0", none); - check_expr_attrs("#[attr] 0 % #[attr] 0", none); - check_expr_attrs("#[attr] (0 + 0)", outer); - reject_expr_parse("0 + #![attr] 0"); - - check_expr_attrs("#[attr] !0", outer); - check_expr_attrs("#[attr] -0", outer); - reject_expr_parse("!#![attr] 0"); - reject_expr_parse("-#![attr] 0"); - - check_expr_attrs("#[attr] false", outer); - check_expr_attrs("#[attr] 0", outer); - check_expr_attrs("#[attr] 'c'", outer); - - check_expr_attrs("#[attr] x as Y", none); - check_expr_attrs("#[attr] (x as Y)", outer); - reject_expr_parse("x #![attr] as Y"); - - reject_expr_parse("#[attr] if false {}"); - reject_expr_parse("if false #[attr] {}"); - reject_expr_parse("if false {#![attr]}"); - reject_expr_parse("if false {} #[attr] else {}"); - reject_expr_parse("if false {} else #[attr] {}"); - reject_expr_parse("if false {} else {#![attr]}"); - reject_expr_parse("if false {} else #[attr] if true {}"); - reject_expr_parse("if false {} else if true #[attr] {}"); - reject_expr_parse("if false {} else if true {#![attr]}"); - - reject_expr_parse("#[attr] if let Some(false) = false {}"); - reject_expr_parse("if let Some(false) = false #[attr] {}"); - reject_expr_parse("if let Some(false) = false {#![attr]}"); - reject_expr_parse("if let Some(false) = false {} #[attr] else {}"); - reject_expr_parse("if let Some(false) = false {} else #[attr] {}"); - reject_expr_parse("if let Some(false) = false {} else {#![attr]}"); - reject_expr_parse("if let Some(false) = false {} else #[attr] if let Some(false) = true {}"); - reject_expr_parse("if let Some(false) = false {} else if let Some(false) = true #[attr] {}"); - reject_expr_parse("if let Some(false) = false {} else if let Some(false) = true {#![attr]}"); - - check_expr_attrs("#[attr] while true {#![attr]}", both); - - check_expr_attrs("#[attr] while let Some(false) = true {#![attr]}", both); - - check_expr_attrs("#[attr] for x in y {#![attr]}", both); - - check_expr_attrs("#[attr] loop {#![attr]}", both); - - check_expr_attrs("#[attr] match true {#![attr] #[attr] _ => false}", both); - - check_expr_attrs("#[attr] || #[attr] foo", outer); - check_expr_attrs("#[attr] move || #[attr] foo", outer); - check_expr_attrs("#[attr] || #[attr] { #![attr] foo }", outer); - check_expr_attrs("#[attr] move || #[attr] { #![attr] foo }", outer); - check_expr_attrs("#[attr] || { #![attr] foo }", outer); - check_expr_attrs("#[attr] move || { #![attr] foo }", outer); - reject_expr_parse("|| #![attr] foo"); - reject_expr_parse("move || #![attr] foo"); - reject_expr_parse("|| #![attr] {foo}"); - reject_expr_parse("move || #![attr] {foo}"); - - check_expr_attrs("#[attr] { #![attr] }", both); - check_expr_attrs("#[attr] { #![attr] let _ = (); }", both); - check_expr_attrs("#[attr] { #![attr] let _ = (); foo }", both); - - check_expr_attrs("#[attr] x = y", none); - check_expr_attrs("#[attr] (x = y)", outer); - - check_expr_attrs("#[attr] x += y", none); - check_expr_attrs("#[attr] (x += y)", outer); - - check_expr_attrs("#[attr] foo.bar", outer); - check_expr_attrs("(#[attr] foo).bar", none); - - check_expr_attrs("#[attr] foo.0", outer); - check_expr_attrs("(#[attr] foo).0", none); - - check_expr_attrs("#[attr] foo[bar]", outer); - check_expr_attrs("(#[attr] foo)[bar]", none); - - check_expr_attrs("#[attr] 0..#[attr] 0", none); - check_expr_attrs("#[attr] 0..", none); - reject_expr_parse("#[attr] ..#[attr] 0"); - reject_expr_parse("#[attr] .."); - - check_expr_attrs("#[attr] (0..0)", outer); - check_expr_attrs("#[attr] (0..)", outer); - check_expr_attrs("#[attr] (..0)", outer); - check_expr_attrs("#[attr] (..)", outer); - - check_expr_attrs("#[attr] foo::bar::baz", outer); - - check_expr_attrs("#[attr] &0", outer); - check_expr_attrs("#[attr] &mut 0", outer); - check_expr_attrs("#[attr] & #[attr] 0", outer); - check_expr_attrs("#[attr] &mut #[attr] 0", outer); - reject_expr_parse("#[attr] &#![attr] 0"); - reject_expr_parse("#[attr] &mut #![attr] 0"); - - check_expr_attrs("#[attr] break", outer); - check_expr_attrs("#[attr] continue", outer); - check_expr_attrs("#[attr] return", outer); - - check_expr_attrs("#[attr] foo!()", outer); - check_expr_attrs("#[attr] foo!(#![attr])", outer); - check_expr_attrs("#[attr] foo![]", outer); - check_expr_attrs("#[attr] foo![#![attr]]", outer); - check_expr_attrs("#[attr] foo!{}", outer); - check_expr_attrs("#[attr] foo!{#![attr]}", outer); - - check_expr_attrs("#[attr] Foo { #![attr] bar: baz }", both); - check_expr_attrs("#[attr] Foo { #![attr] ..foo }", both); - check_expr_attrs("#[attr] Foo { #![attr] bar: baz, ..foo }", both); - - check_expr_attrs("#[attr] (#![attr] 0)", both); - - // Look at statements in their natural habitat... - check_expr_attrs("{ - #[attr] let _ = 0; - #[attr] 0; - #[attr] foo!(); - #[attr] foo!{} - #[attr] foo![]; - }", none); - - check_stmt_attrs("#[attr] let _ = 0", outer); - check_stmt_attrs("#[attr] 0", outer); - check_stmt_attrs("#[attr] {#![attr]}", both); - check_stmt_attrs("#[attr] foo!()", outer); - check_stmt_attrs("#[attr] foo![]", outer); - check_stmt_attrs("#[attr] foo!{}", outer); - - reject_stmt_parse("#[attr] #![attr] let _ = 0"); - reject_stmt_parse("#[attr] #![attr] 0"); - reject_stmt_parse("#[attr] #![attr] foo!()"); - reject_stmt_parse("#[attr] #![attr] foo![]"); - reject_stmt_parse("#[attr] #![attr] foo!{}"); - - // FIXME: Allow attributes in pattern constexprs? - // note: requires parens in patterns to allow disambiguation - - reject_expr_parse("match 0 { - 0..=#[attr] 10 => () - }"); - reject_expr_parse("match 0 { - 0..=#[attr] -10 => () - }"); - reject_expr_parse("match 0 { - 0..=-#[attr] 10 => () - }"); - reject_expr_parse("match 0 { - 0..=#[attr] FOO => () - }"); - - // make sure we don't catch this bug again... - reject_expr_parse("{ - fn foo() { - #[attr]; - } - }"); - reject_expr_parse("{ - fn foo() { - #[attr] - } - }"); -} diff --git a/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs b/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs index e9ef58f29a..725c350fe4 100644 --- a/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs +++ b/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs @@ -1,16 +1,20 @@ #![feature(box_syntax, plugin, plugin_registrar, rustc_private)] #![crate_type = "dylib"] -#[macro_use] extern crate rustc; -#[macro_use] extern crate rustc_session; extern crate rustc_driver; +extern crate rustc_hir; +#[macro_use] extern crate rustc_lint; +#[macro_use] extern crate rustc_session; +extern crate rustc_span; extern crate syntax; +use rustc_hir::intravisit; +use rustc_hir as hir; +use rustc_hir::Node; +use rustc_lint::{LateContext, LintPass, LintArray, LateLintPass, LintContext}; use rustc_driver::plugin::Registry; -use rustc::hir::{self, intravisit, Node}; -use rustc::lint::{LateContext, LintPass, LintArray, LateLintPass, LintContext}; +use rustc_span::source_map; use syntax::print::pprust; -use syntax::source_map; #[plugin_registrar] pub fn plugin_registrar(reg: &mut Registry) { diff --git a/src/test/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs b/src/test/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs index 118ba17111..98963a180c 100644 --- a/src/test/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs +++ b/src/test/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs @@ -2,16 +2,17 @@ #![feature(plugin_registrar, rustc_private)] #![feature(box_syntax)] -#[macro_use] extern crate rustc; -#[macro_use] extern crate rustc_session; extern crate rustc_driver; +extern crate rustc_hir; +extern crate rustc_span; +#[macro_use] extern crate rustc_lint; +#[macro_use] extern crate rustc_session; extern crate syntax; -use rustc::lint::{LateContext, LintContext, LintPass, LateLintPass}; +use rustc_lint::{LateContext, LintContext, LintPass, LateLintPass}; use rustc_driver::plugin::Registry; -use rustc::hir; +use rustc_span::symbol::Symbol; use syntax::attr; -use syntax::symbol::Symbol; macro_rules! fake_lint_pass { ($struct:ident, $($attr:expr),*) => { @@ -24,7 +25,7 @@ macro_rules! fake_lint_pass { } impl<'a, 'tcx> LateLintPass<'a, 'tcx> for $struct { - fn check_crate(&mut self, cx: &LateContext, krate: &hir::Crate) { + fn check_crate(&mut self, cx: &LateContext, krate: &rustc_hir::Crate) { $( if !attr::contains_name(&krate.attrs, $attr) { cx.span_lint(CRATE_NOT_OKAY, krate.span, diff --git a/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs b/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs index 49ca43d471..589477da62 100644 --- a/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs +++ b/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs @@ -3,16 +3,17 @@ #![feature(plugin_registrar, rustc_private)] #![feature(box_syntax)] -#[macro_use] extern crate rustc; -#[macro_use] extern crate rustc_session; extern crate rustc_driver; +extern crate rustc_hir; +#[macro_use] extern crate rustc_lint; +#[macro_use] extern crate rustc_session; +extern crate rustc_span; extern crate syntax; -use rustc::lint::{LateContext, LintContext, LintPass, LateLintPass, LintArray}; +use rustc_lint::{LateContext, LintContext, LintPass, LateLintPass, LintArray}; use rustc_driver::plugin::Registry; -use rustc::hir; +use rustc_span::symbol::Symbol; use syntax::attr; -use syntax::symbol::Symbol; declare_lint! { CRATE_NOT_OKAY, @@ -23,7 +24,7 @@ declare_lint! { declare_lint_pass!(Pass => [CRATE_NOT_OKAY]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass { - fn check_crate(&mut self, cx: &LateContext, krate: &hir::Crate) { + fn check_crate(&mut self, cx: &LateContext, krate: &rustc_hir::Crate) { if !attr::contains_name(&krate.attrs, Symbol::intern("crate_okay")) { cx.span_lint(CRATE_NOT_OKAY, krate.span, "crate is not marked with #![crate_okay]"); diff --git a/src/test/ui-fulldeps/auxiliary/lint-group-plugin-test.rs b/src/test/ui-fulldeps/auxiliary/lint-group-plugin-test.rs index 839c65a610..2cc288c21e 100644 --- a/src/test/ui-fulldeps/auxiliary/lint-group-plugin-test.rs +++ b/src/test/ui-fulldeps/auxiliary/lint-group-plugin-test.rs @@ -4,12 +4,12 @@ #![feature(box_syntax, rustc_private)] // Load rustc as a plugin to get macros. -#[macro_use] extern crate rustc; -#[macro_use] extern crate rustc_session; extern crate rustc_driver; +extern crate rustc_hir; +#[macro_use] extern crate rustc_lint; +#[macro_use] extern crate rustc_session; -use rustc::hir; -use rustc::lint::{LateContext, LintContext, LintPass, LateLintPass, LintArray, LintId}; +use rustc_lint::{LateContext, LintContext, LintPass, LateLintPass, LintArray, LintId}; use rustc_driver::plugin::Registry; declare_lint!(TEST_LINT, Warn, "Warn about items named 'lintme'"); @@ -19,7 +19,7 @@ declare_lint!(PLEASE_LINT, Warn, "Warn about items named 'pleaselintme'"); declare_lint_pass!(Pass => [TEST_LINT, PLEASE_LINT]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass { - fn check_item(&mut self, cx: &LateContext, it: &hir::Item) { + fn check_item(&mut self, cx: &LateContext, it: &rustc_hir::Item) { match &*it.ident.as_str() { "lintme" => cx.span_lint(TEST_LINT, it.span, "item is named 'lintme'"), "pleaselintme" => cx.span_lint(PLEASE_LINT, it.span, "item is named 'pleaselintme'"), diff --git a/src/test/ui-fulldeps/auxiliary/lint-plugin-test.rs b/src/test/ui-fulldeps/auxiliary/lint-plugin-test.rs index bb96dba21f..c704701cc4 100644 --- a/src/test/ui-fulldeps/auxiliary/lint-plugin-test.rs +++ b/src/test/ui-fulldeps/auxiliary/lint-plugin-test.rs @@ -6,11 +6,11 @@ extern crate syntax; // Load rustc as a plugin to get macros -#[macro_use] extern crate rustc; -#[macro_use] extern crate rustc_session; extern crate rustc_driver; +#[macro_use] extern crate rustc_lint; +#[macro_use] extern crate rustc_session; -use rustc::lint::{EarlyContext, LintContext, LintPass, EarlyLintPass, LintArray}; +use rustc_lint::{EarlyContext, LintContext, LintPass, EarlyLintPass, LintArray}; use rustc_driver::plugin::Registry; use syntax::ast; declare_lint!(TEST_LINT, Warn, "Warn about items named 'lintme'"); diff --git a/src/test/ui-fulldeps/auxiliary/lint-tool-test.rs b/src/test/ui-fulldeps/auxiliary/lint-tool-test.rs index 1704909813..fa545ddc2b 100644 --- a/src/test/ui-fulldeps/auxiliary/lint-tool-test.rs +++ b/src/test/ui-fulldeps/auxiliary/lint-tool-test.rs @@ -4,11 +4,11 @@ extern crate syntax; // Load rustc as a plugin to get macros -#[macro_use] extern crate rustc; -#[macro_use] extern crate rustc_session; extern crate rustc_driver; +#[macro_use] extern crate rustc_lint; +#[macro_use] extern crate rustc_session; -use rustc::lint::{EarlyContext, EarlyLintPass, LintArray, LintContext, LintPass, LintId}; +use rustc_lint::{EarlyContext, EarlyLintPass, LintArray, LintContext, LintPass, LintId}; use rustc_driver::plugin::Registry; use syntax::ast; declare_tool_lint!(pub clippy::TEST_LINT, Warn, "Warn about stuff"); diff --git a/src/test/ui-fulldeps/auxiliary/macro-crate-test.rs b/src/test/ui-fulldeps/auxiliary/macro-crate-test.rs index ee82c0adc8..fa136fd54c 100644 --- a/src/test/ui-fulldeps/auxiliary/macro-crate-test.rs +++ b/src/test/ui-fulldeps/auxiliary/macro-crate-test.rs @@ -7,7 +7,6 @@ extern crate syntax; extern crate rustc; extern crate rustc_driver; -extern crate syntax_pos; extern crate proc_macro; use proc_macro::{TokenTree, TokenStream}; diff --git a/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs b/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs index 7ce2a1dd9a..8d9cbe45fc 100644 --- a/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs +++ b/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs @@ -6,9 +6,8 @@ extern crate rustc; extern crate rustc_session; -use rustc::lint::{LintArray, LintPass}; -use rustc::{declare_lint_pass, impl_lint_pass}; -use rustc_session::declare_lint; +use rustc_session::lint::{LintArray, LintPass}; +use rustc_session::{declare_lint, declare_lint_pass, impl_lint_pass}; declare_lint! { pub TEST_LINT, diff --git a/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.stderr b/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.stderr index ad8670c6c8..39ac0019aa 100644 --- a/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.stderr +++ b/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.stderr @@ -1,5 +1,5 @@ error: implementing `LintPass` by hand - --> $DIR/lint_pass_impl_without_macro.rs:21:6 + --> $DIR/lint_pass_impl_without_macro.rs:20:6 | LL | impl LintPass for Foo { | ^^^^^^^^ @@ -12,7 +12,7 @@ LL | #![deny(rustc::lint_pass_impl_without_macro)] = help: try using `declare_lint_pass!` or `impl_lint_pass!` instead error: implementing `LintPass` by hand - --> $DIR/lint_pass_impl_without_macro.rs:31:14 + --> $DIR/lint_pass_impl_without_macro.rs:30:14 | LL | impl LintPass for Custom { | ^^^^^^^^ diff --git a/src/test/ui-fulldeps/lint-plugin-forbid-attrs.rs b/src/test/ui-fulldeps/lint-plugin-forbid-attrs.rs index 569f04d18f..35ddab9583 100644 --- a/src/test/ui-fulldeps/lint-plugin-forbid-attrs.rs +++ b/src/test/ui-fulldeps/lint-plugin-forbid-attrs.rs @@ -10,6 +10,8 @@ fn lintme() { } //~ ERROR item is named 'lintme' #[allow(test_lint)] //~^ ERROR allow(test_lint) overruled by outer forbid(test_lint) +//~| ERROR allow(test_lint) overruled by outer forbid(test_lint) +//~| ERROR allow(test_lint) overruled by outer forbid(test_lint) pub fn main() { lintme(); } diff --git a/src/test/ui-fulldeps/lint-plugin-forbid-attrs.stderr b/src/test/ui-fulldeps/lint-plugin-forbid-attrs.stderr index c0de1feee7..f93a0a0de5 100644 --- a/src/test/ui-fulldeps/lint-plugin-forbid-attrs.stderr +++ b/src/test/ui-fulldeps/lint-plugin-forbid-attrs.stderr @@ -7,6 +7,15 @@ LL | #![forbid(test_lint)] LL | #[allow(test_lint)] | ^^^^^^^^^ overruled by previous forbid +error[E0453]: allow(test_lint) overruled by outer forbid(test_lint) + --> $DIR/lint-plugin-forbid-attrs.rs:11:9 + | +LL | #![forbid(test_lint)] + | --------- `forbid` level set here +... +LL | #[allow(test_lint)] + | ^^^^^^^^^ overruled by previous forbid + warning: use of deprecated attribute `plugin`: compiler plugins are deprecated. See https://github.com/rust-lang/rust/pull/64675 --> $DIR/lint-plugin-forbid-attrs.rs:5:1 | @@ -27,6 +36,15 @@ note: lint level defined here LL | #![forbid(test_lint)] | ^^^^^^^^^ -error: aborting due to 2 previous errors +error[E0453]: allow(test_lint) overruled by outer forbid(test_lint) + --> $DIR/lint-plugin-forbid-attrs.rs:11:9 + | +LL | #![forbid(test_lint)] + | --------- `forbid` level set here +... +LL | #[allow(test_lint)] + | ^^^^^^^^^ overruled by previous forbid + +error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0453`. diff --git a/src/test/ui-fulldeps/lint-plugin-forbid-cmdline.rs b/src/test/ui-fulldeps/lint-plugin-forbid-cmdline.rs index 82313f6912..695d3aef16 100644 --- a/src/test/ui-fulldeps/lint-plugin-forbid-cmdline.rs +++ b/src/test/ui-fulldeps/lint-plugin-forbid-cmdline.rs @@ -8,6 +8,8 @@ fn lintme() { } //~ ERROR item is named 'lintme' #[allow(test_lint)] //~ ERROR allow(test_lint) overruled by outer forbid(test_lint) + //~| ERROR allow(test_lint) overruled by outer forbid(test_lint) + //~| ERROR allow(test_lint) overruled by outer forbid(test_lint) pub fn main() { lintme(); } diff --git a/src/test/ui-fulldeps/lint-plugin-forbid-cmdline.stderr b/src/test/ui-fulldeps/lint-plugin-forbid-cmdline.stderr index f189efbf61..0302ec84d5 100644 --- a/src/test/ui-fulldeps/lint-plugin-forbid-cmdline.stderr +++ b/src/test/ui-fulldeps/lint-plugin-forbid-cmdline.stderr @@ -6,6 +6,14 @@ LL | #[allow(test_lint)] | = note: `forbid` lint level was set on command line +error[E0453]: allow(test_lint) overruled by outer forbid(test_lint) + --> $DIR/lint-plugin-forbid-cmdline.rs:10:9 + | +LL | #[allow(test_lint)] + | ^^^^^^^^^ overruled by previous forbid + | + = note: `forbid` lint level was set on command line + warning: use of deprecated attribute `plugin`: compiler plugins are deprecated. See https://github.com/rust-lang/rust/pull/64675 --> $DIR/lint-plugin-forbid-cmdline.rs:6:1 | @@ -22,6 +30,14 @@ LL | fn lintme() { } | = note: requested on the command line with `-F test-lint` -error: aborting due to 2 previous errors +error[E0453]: allow(test_lint) overruled by outer forbid(test_lint) + --> $DIR/lint-plugin-forbid-cmdline.rs:10:9 + | +LL | #[allow(test_lint)] + | ^^^^^^^^^ overruled by previous forbid + | + = note: `forbid` lint level was set on command line + +error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0453`. diff --git a/src/test/ui-fulldeps/lint-tool-cmdline-allow.stderr b/src/test/ui-fulldeps/lint-tool-cmdline-allow.stderr index 825a341c5d..2f1c29ea7b 100644 --- a/src/test/ui-fulldeps/lint-tool-cmdline-allow.stderr +++ b/src/test/ui-fulldeps/lint-tool-cmdline-allow.stderr @@ -2,6 +2,10 @@ warning: lint name `test_lint` is deprecated and does not have an effect anymore | = note: requested on the command line with `-A test_lint` +warning: lint name `test_lint` is deprecated and does not have an effect anymore. Use: clippy::test_lint + | + = note: requested on the command line with `-A test_lint` + warning: use of deprecated attribute `plugin`: compiler plugins are deprecated. See https://github.com/rust-lang/rust/pull/64675 --> $DIR/lint-tool-cmdline-allow.rs:7:1 | @@ -10,6 +14,10 @@ LL | #![plugin(lint_tool_test)] | = note: `#[warn(deprecated)]` on by default +warning: lint name `test_lint` is deprecated and does not have an effect anymore. Use: clippy::test_lint + | + = note: requested on the command line with `-A test_lint` + warning: item is named 'lintme' --> $DIR/lint-tool-cmdline-allow.rs:9:1 | @@ -18,3 +26,7 @@ LL | fn lintme() {} | = note: `#[warn(clippy::test_lint)]` on by default +warning: lint name `test_lint` is deprecated and does not have an effect anymore. Use: clippy::test_lint + | + = note: requested on the command line with `-A test_lint` + diff --git a/src/test/ui-fulldeps/lint-tool-test.rs b/src/test/ui-fulldeps/lint-tool-test.rs index 216a8cb95e..f92bcd213b 100644 --- a/src/test/ui-fulldeps/lint-tool-test.rs +++ b/src/test/ui-fulldeps/lint-tool-test.rs @@ -8,9 +8,12 @@ #![allow(dead_code)] #![cfg_attr(foo, warn(test_lint))] //~^ WARNING lint name `test_lint` is deprecated and may not have an effect in the future -//~^^ WARNING lint name `test_lint` is deprecated and may not have an effect in the future +//~| WARNING lint name `test_lint` is deprecated and may not have an effect in the future +//~| WARNING lint name `test_lint` is deprecated and may not have an effect in the future #![deny(clippy_group)] //~^ WARNING lint name `clippy_group` is deprecated and may not have an effect in the future +//~| WARNING lint name `clippy_group` is deprecated and may not have an effect in the future +//~| WARNING lint name `clippy_group` is deprecated and may not have an effect in the future fn lintme() { } //~ ERROR item is named 'lintme' @@ -25,6 +28,8 @@ pub fn main() { #[allow(test_group)] //~^ WARNING lint name `test_group` is deprecated and may not have an effect in the future +//~| WARNING lint name `test_group` is deprecated and may not have an effect in the future +//~| WARNING lint name `test_group` is deprecated and may not have an effect in the future #[deny(this_lint_does_not_exist)] //~ WARNING unknown lint: `this_lint_does_not_exist` fn hello() { fn lintmetoo() { } diff --git a/src/test/ui-fulldeps/lint-tool-test.stderr b/src/test/ui-fulldeps/lint-tool-test.stderr index d4031a780c..809b9ac162 100644 --- a/src/test/ui-fulldeps/lint-tool-test.stderr +++ b/src/test/ui-fulldeps/lint-tool-test.stderr @@ -7,19 +7,19 @@ LL | #![cfg_attr(foo, warn(test_lint))] = note: `#[warn(renamed_and_removed_lints)]` on by default warning: lint name `clippy_group` is deprecated and may not have an effect in the future. Also `cfg_attr(cargo-clippy)` won't be necessary anymore - --> $DIR/lint-tool-test.rs:12:9 + --> $DIR/lint-tool-test.rs:13:9 | LL | #![deny(clippy_group)] | ^^^^^^^^^^^^ help: change it to: `clippy::group` warning: lint name `test_group` is deprecated and may not have an effect in the future. Also `cfg_attr(cargo-clippy)` won't be necessary anymore - --> $DIR/lint-tool-test.rs:26:9 + --> $DIR/lint-tool-test.rs:29:9 | LL | #[allow(test_group)] | ^^^^^^^^^^ help: change it to: `clippy::test_group` warning: unknown lint: `this_lint_does_not_exist` - --> $DIR/lint-tool-test.rs:28:8 + --> $DIR/lint-tool-test.rs:33:8 | LL | #[deny(this_lint_does_not_exist)] | ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -32,6 +32,18 @@ warning: lint name `test_lint` is deprecated and may not have an effect in the f LL | #![cfg_attr(foo, warn(test_lint))] | ^^^^^^^^^ help: change it to: `clippy::test_lint` +warning: lint name `clippy_group` is deprecated and may not have an effect in the future. Also `cfg_attr(cargo-clippy)` won't be necessary anymore + --> $DIR/lint-tool-test.rs:13:9 + | +LL | #![deny(clippy_group)] + | ^^^^^^^^^^^^ help: change it to: `clippy::group` + +warning: lint name `test_group` is deprecated and may not have an effect in the future. Also `cfg_attr(cargo-clippy)` won't be necessary anymore + --> $DIR/lint-tool-test.rs:29:9 + | +LL | #[allow(test_group)] + | ^^^^^^^^^^ help: change it to: `clippy::test_group` + warning: use of deprecated attribute `plugin`: compiler plugins are deprecated. See https://github.com/rust-lang/rust/pull/64675 --> $DIR/lint-tool-test.rs:6:1 | @@ -40,31 +52,49 @@ LL | #![plugin(lint_tool_test)] | = note: `#[warn(deprecated)]` on by default +warning: lint name `test_lint` is deprecated and may not have an effect in the future. Also `cfg_attr(cargo-clippy)` won't be necessary anymore + --> $DIR/lint-tool-test.rs:9:23 + | +LL | #![cfg_attr(foo, warn(test_lint))] + | ^^^^^^^^^ help: change it to: `clippy::test_lint` + +warning: lint name `clippy_group` is deprecated and may not have an effect in the future. Also `cfg_attr(cargo-clippy)` won't be necessary anymore + --> $DIR/lint-tool-test.rs:13:9 + | +LL | #![deny(clippy_group)] + | ^^^^^^^^^^^^ help: change it to: `clippy::group` + error: item is named 'lintme' - --> $DIR/lint-tool-test.rs:15:1 + --> $DIR/lint-tool-test.rs:18:1 | LL | fn lintme() { } | ^^^^^^^^^^^^^^^ | note: lint level defined here - --> $DIR/lint-tool-test.rs:12:9 + --> $DIR/lint-tool-test.rs:13:9 | LL | #![deny(clippy_group)] | ^^^^^^^^^^^^ = note: `#[deny(clippy::test_lint)]` implied by `#[deny(clippy::group)]` error: item is named 'lintmetoo' - --> $DIR/lint-tool-test.rs:23:5 + --> $DIR/lint-tool-test.rs:26:5 | LL | fn lintmetoo() { } | ^^^^^^^^^^^^^^^^^^ | note: lint level defined here - --> $DIR/lint-tool-test.rs:12:9 + --> $DIR/lint-tool-test.rs:13:9 | LL | #![deny(clippy_group)] | ^^^^^^^^^^^^ = note: `#[deny(clippy::test_group)]` implied by `#[deny(clippy::group)]` +warning: lint name `test_group` is deprecated and may not have an effect in the future. Also `cfg_attr(cargo-clippy)` won't be necessary anymore + --> $DIR/lint-tool-test.rs:29:9 + | +LL | #[allow(test_group)] + | ^^^^^^^^^^ help: change it to: `clippy::test_group` + error: aborting due to 2 previous errors diff --git a/src/test/ui-fulldeps/mod_dir_path_canonicalized.rs b/src/test/ui-fulldeps/mod_dir_path_canonicalized.rs index cf675831cf..2b4a9fb21e 100644 --- a/src/test/ui-fulldeps/mod_dir_path_canonicalized.rs +++ b/src/test/ui-fulldeps/mod_dir_path_canonicalized.rs @@ -5,13 +5,13 @@ #![feature(rustc_private)] extern crate syntax; -extern crate syntax_expand; extern crate rustc_parse; +extern crate rustc_span; use rustc_parse::new_parser_from_file; +use rustc_span::source_map::FilePathMapping; use std::path::Path; use syntax::sess::ParseSess; -use syntax::source_map::FilePathMapping; #[path = "mod_dir_simple/test.rs"] mod gravy; diff --git a/src/test/ui-fulldeps/newtype_index.rs b/src/test/ui-fulldeps/newtype_index.rs deleted file mode 100644 index fe68b394e5..0000000000 --- a/src/test/ui-fulldeps/newtype_index.rs +++ /dev/null @@ -1,22 +0,0 @@ -// run-pass - -#![feature(rustc_private)] - -extern crate rustc_index; -extern crate serialize as rustc_serialize; - -use rustc_index::{newtype_index, vec::Idx}; - -newtype_index!(struct MyIdx { MAX = 0xFFFF_FFFA }); - -use std::mem::size_of; - -fn main() { - assert_eq!(size_of::<MyIdx>(), 4); - assert_eq!(size_of::<Option<MyIdx>>(), 4); - assert_eq!(size_of::<Option<Option<MyIdx>>>(), 4); - assert_eq!(size_of::<Option<Option<Option<MyIdx>>>>(), 4); - assert_eq!(size_of::<Option<Option<Option<Option<MyIdx>>>>>(), 4); - assert_eq!(size_of::<Option<Option<Option<Option<Option<MyIdx>>>>>>(), 4); - assert_eq!(size_of::<Option<Option<Option<Option<Option<Option<MyIdx>>>>>>>(), 8); -} diff --git a/src/test/ui-fulldeps/pprust-expr-roundtrip.rs b/src/test/ui-fulldeps/pprust-expr-roundtrip.rs index f19d13ff5c..04d1054e28 100644 --- a/src/test/ui-fulldeps/pprust-expr-roundtrip.rs +++ b/src/test/ui-fulldeps/pprust-expr-roundtrip.rs @@ -21,15 +21,15 @@ extern crate rustc_data_structures; extern crate syntax; -extern crate syntax_expand; extern crate rustc_parse; +extern crate rustc_span; use rustc_data_structures::thin_vec::ThinVec; use rustc_parse::new_parser_from_source_str; +use rustc_span::source_map::{Spanned, DUMMY_SP, FileName}; +use rustc_span::source_map::FilePathMapping; use syntax::ast::*; use syntax::sess::ParseSess; -use syntax::source_map::{Spanned, DUMMY_SP, FileName}; -use syntax::source_map::FilePathMapping; use syntax::mut_visit::{self, MutVisitor, visit_clobber}; use syntax::print::pprust; use syntax::ptr::P; @@ -126,8 +126,8 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P<Expr>)) { DUMMY_SP))); }, 12 => { - iter_exprs(depth - 1, &mut |e| g(ExprKind::Assign(e, make_x()))); - iter_exprs(depth - 1, &mut |e| g(ExprKind::Assign(make_x(), e))); + iter_exprs(depth - 1, &mut |e| g(ExprKind::Assign(e, make_x(), DUMMY_SP))); + iter_exprs(depth - 1, &mut |e| g(ExprKind::Assign(make_x(), e, DUMMY_SP))); }, 13 => { iter_exprs(depth - 1, &mut |e| g(ExprKind::Field(e, Ident::from_str("f")))); @@ -141,7 +141,7 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P<Expr>)) { 15 => { iter_exprs( depth - 1, - &mut |e| g(ExprKind::AddrOf(BorrowKind::Ref, Mutability::Immutable, e)), + &mut |e| g(ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, e)), ); }, 16 => { diff --git a/src/test/ui/abi/stack-probes.rs b/src/test/ui/abi/stack-probes.rs index 1ab1d6df66..1d5b362e29 100644 --- a/src/test/ui/abi/stack-probes.rs +++ b/src/test/ui/abi/stack-probes.rs @@ -13,7 +13,7 @@ // ignore-sgx no processes // ignore-musl FIXME #31506 -use std::mem; +use std::mem::MaybeUninit; use std::process::Command; use std::thread; use std::env; @@ -28,8 +28,8 @@ fn main() { let args = env::args().skip(1).collect::<Vec<_>>(); if args.len() > 0 { match &args[0][..] { - "main-thread" => recurse(&[]), - "child-thread" => thread::spawn(|| recurse(&[])).join().unwrap(), + "main-thread" => recurse(&MaybeUninit::uninit()), + "child-thread" => thread::spawn(|| recurse(&MaybeUninit::uninit())).join().unwrap(), _ => panic!(), } return @@ -48,10 +48,11 @@ fn main() { } #[allow(unconditional_recursion)] -fn recurse(array: &[u64]) { - unsafe { black_box(array.as_ptr() as u64); } - #[allow(deprecated)] - let local: [_; 1024] = unsafe { mem::uninitialized() }; +fn recurse(array: &MaybeUninit<[u64; 1024]>) { + unsafe { + black_box(array.as_ptr() as u64); + } + let local: MaybeUninit<[u64; 1024]> = MaybeUninit::uninit(); recurse(&local); } diff --git a/src/test/ui/anon-params-deprecated.stderr b/src/test/ui/anon-params-deprecated.stderr index e97dbc15f9..8e4fa70d34 100644 --- a/src/test/ui/anon-params-deprecated.stderr +++ b/src/test/ui/anon-params-deprecated.stderr @@ -2,7 +2,7 @@ warning: anonymous parameters are deprecated and will be removed in the next edi --> $DIR/anon-params-deprecated.rs:9:12 | LL | fn foo(i32); - | ^^^ help: Try naming the parameter or explicitly ignoring it: `_: i32` + | ^^^ help: try naming the parameter or explicitly ignoring it: `_: i32` | note: lint level defined here --> $DIR/anon-params-deprecated.rs:1:9 @@ -16,7 +16,7 @@ warning: anonymous parameters are deprecated and will be removed in the next edi --> $DIR/anon-params-deprecated.rs:12:30 | LL | fn bar_with_default_impl(String, String) {} - | ^^^^^^ help: Try naming the parameter or explicitly ignoring it: `_: String` + | ^^^^^^ help: try naming the parameter or explicitly ignoring it: `_: String` | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in the 2018 edition! = note: for more information, see issue #41686 <https://github.com/rust-lang/rust/issues/41686> @@ -25,7 +25,7 @@ warning: anonymous parameters are deprecated and will be removed in the next edi --> $DIR/anon-params-deprecated.rs:12:38 | LL | fn bar_with_default_impl(String, String) {} - | ^^^^^^ help: Try naming the parameter or explicitly ignoring it: `_: String` + | ^^^^^^ help: try naming the parameter or explicitly ignoring it: `_: String` | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in the 2018 edition! = note: for more information, see issue #41686 <https://github.com/rust-lang/rust/issues/41686> diff --git a/src/test/ui/array-slice-vec/issue-69103-extra-binding-subslice.rs b/src/test/ui/array-slice-vec/issue-69103-extra-binding-subslice.rs new file mode 100644 index 0000000000..061b0d675b --- /dev/null +++ b/src/test/ui/array-slice-vec/issue-69103-extra-binding-subslice.rs @@ -0,0 +1,18 @@ +// We used to not lower the extra `b @ ..` into `b @ _` which meant that no type +// was registered for the binding `b` although it passed through resolve. +// This resulted in an ICE (#69103). + +fn main() { + let [a @ .., b @ ..] = &mut [1, 2]; + //~^ ERROR `..` can only be used once per slice pattern + b; + + let [.., c @ ..] = [1, 2]; + //~^ ERROR `..` can only be used once per slice pattern + c; + + // This never ICEd, but let's make sure it won't regress either. + let (.., d @ ..) = (1, 2); + //~^ ERROR `..` patterns are not allowed here + d; +} diff --git a/src/test/ui/array-slice-vec/issue-69103-extra-binding-subslice.stderr b/src/test/ui/array-slice-vec/issue-69103-extra-binding-subslice.stderr new file mode 100644 index 0000000000..9432e2f0c9 --- /dev/null +++ b/src/test/ui/array-slice-vec/issue-69103-extra-binding-subslice.stderr @@ -0,0 +1,26 @@ +error: `..` can only be used once per slice pattern + --> $DIR/issue-69103-extra-binding-subslice.rs:6:22 + | +LL | let [a @ .., b @ ..] = &mut [1, 2]; + | -- ^^ can only be used once per slice pattern + | | + | previously used here + +error: `..` can only be used once per slice pattern + --> $DIR/issue-69103-extra-binding-subslice.rs:10:18 + | +LL | let [.., c @ ..] = [1, 2]; + | -- ^^ can only be used once per slice pattern + | | + | previously used here + +error: `..` patterns are not allowed here + --> $DIR/issue-69103-extra-binding-subslice.rs:15:18 + | +LL | let (.., d @ ..) = (1, 2); + | ^^ + | + = note: only allowed in tuple, tuple struct, and slice patterns + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/match/match-vec-mismatch.rs b/src/test/ui/array-slice-vec/slice-pat-type-mismatches.rs similarity index 96% rename from src/test/ui/match/match-vec-mismatch.rs rename to src/test/ui/array-slice-vec/slice-pat-type-mismatches.rs index a0ef92743a..34adb42a32 100644 --- a/src/test/ui/match/match-vec-mismatch.rs +++ b/src/test/ui/array-slice-vec/slice-pat-type-mismatches.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn main() { match "foo".to_string() { ['f', 'o', ..] => {} diff --git a/src/test/ui/match/match-vec-mismatch.stderr b/src/test/ui/array-slice-vec/slice-pat-type-mismatches.stderr similarity index 81% rename from src/test/ui/match/match-vec-mismatch.stderr rename to src/test/ui/array-slice-vec/slice-pat-type-mismatches.stderr index a3523bb689..c4548142c1 100644 --- a/src/test/ui/match/match-vec-mismatch.stderr +++ b/src/test/ui/array-slice-vec/slice-pat-type-mismatches.stderr @@ -1,29 +1,29 @@ error[E0425]: cannot find value `does_not_exist` in this scope - --> $DIR/match-vec-mismatch.rs:28:11 + --> $DIR/slice-pat-type-mismatches.rs:26:11 | LL | match does_not_exist { | ^^^^^^^^^^^^^^ not found in this scope error[E0529]: expected an array or slice, found `std::string::String` - --> $DIR/match-vec-mismatch.rs:5:9 + --> $DIR/slice-pat-type-mismatches.rs:3:9 | LL | ['f', 'o', ..] => {} | ^^^^^^^^^^^^^^ pattern cannot match with input type `std::string::String` error[E0527]: pattern requires 1 element but array has 3 - --> $DIR/match-vec-mismatch.rs:20:9 + --> $DIR/slice-pat-type-mismatches.rs:18:9 | LL | [0] => {}, | ^^^ expected 3 elements error[E0528]: pattern requires at least 4 elements but array has 3 - --> $DIR/match-vec-mismatch.rs:25:9 + --> $DIR/slice-pat-type-mismatches.rs:23:9 | LL | [0, 1, 2, 3, x @ ..] => {} | ^^^^^^^^^^^^^^^^^^^^ pattern cannot match array of 3 elements error[E0282]: type annotations needed - --> $DIR/match-vec-mismatch.rs:36:9 + --> $DIR/slice-pat-type-mismatches.rs:34:9 | LL | [] => {} | ^^ cannot infer type diff --git a/src/test/ui/parser/match-vec-invalid.rs b/src/test/ui/array-slice-vec/subslice-only-once-semantic-restriction.rs similarity index 76% rename from src/test/ui/parser/match-vec-invalid.rs rename to src/test/ui/array-slice-vec/subslice-only-once-semantic-restriction.rs index 00f4374b25..97e33624bf 100644 --- a/src/test/ui/parser/match-vec-invalid.rs +++ b/src/test/ui/array-slice-vec/subslice-only-once-semantic-restriction.rs @@ -3,8 +3,6 @@ fn main() { match a { [1, tail @ .., tail @ ..] => {}, //~^ ERROR identifier `tail` is bound more than once in the same pattern - //~| ERROR subslice patterns are unstable - //~| ERROR subslice patterns are unstable //~| ERROR `..` can only be used once per slice pattern _ => () } diff --git a/src/test/ui/array-slice-vec/subslice-only-once-semantic-restriction.stderr b/src/test/ui/array-slice-vec/subslice-only-once-semantic-restriction.stderr new file mode 100644 index 0000000000..4d6078788b --- /dev/null +++ b/src/test/ui/array-slice-vec/subslice-only-once-semantic-restriction.stderr @@ -0,0 +1,24 @@ +error[E0416]: identifier `tail` is bound more than once in the same pattern + --> $DIR/subslice-only-once-semantic-restriction.rs:4:24 + | +LL | [1, tail @ .., tail @ ..] => {}, + | ^^^^ used in a pattern more than once + +error: `..` can only be used once per slice pattern + --> $DIR/subslice-only-once-semantic-restriction.rs:4:31 + | +LL | [1, tail @ .., tail @ ..] => {}, + | -- ^^ can only be used once per slice pattern + | | + | previously used here + +error[E0308]: mismatched types + --> $DIR/subslice-only-once-semantic-restriction.rs:11:30 + | +LL | const RECOVERY_WITNESS: () = 0; + | ^ expected `()`, found integer + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0308, E0416. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/array-slice-vec/subslice-patterns-const-eval-match.rs b/src/test/ui/array-slice-vec/subslice-patterns-const-eval-match.rs new file mode 100644 index 0000000000..69c3392186 --- /dev/null +++ b/src/test/ui/array-slice-vec/subslice-patterns-const-eval-match.rs @@ -0,0 +1,97 @@ +// Test that slice subslice patterns are correctly handled in const evaluation. + +// run-pass + +#![feature(const_fn, const_if_match)] +#[derive(PartialEq, Debug, Clone)] +struct N(u8); + +#[derive(PartialEq, Debug, Clone)] +struct Z; + +macro_rules! n { + ($($e:expr),* $(,)?) => { + [$(N($e)),*] + } +} + +// This macro has an unused variable so that it can be repeated base on the +// number of times a repeated variable (`$e` in `z`) occurs. +macro_rules! zed { + ($e:expr) => { Z } +} + +macro_rules! z { + ($($e:expr),* $(,)?) => { + [$(zed!($e)),*] + } +} + +// Compare constant evaluation and runtime evaluation of a given expression. +macro_rules! compare_evaluation_inner { + ($e:expr, $t:ty $(,)?) => {{ + const CONST_EVAL: $t = $e; + const fn const_eval() -> $t { $e } + static CONST_EVAL2: $t = const_eval(); + let runtime_eval = $e; + assert_eq!(CONST_EVAL, runtime_eval); + assert_eq!(CONST_EVAL2, runtime_eval); + }} +} + +// Compare the result of matching `$e` against `$p` using both `if let` and +// `match`. +macro_rules! compare_evaluation { + ($p:pat, $e:expr, $matches:expr, $t:ty $(,)?) => {{ + compare_evaluation_inner!(if let $p = $e as &[_] { $matches } else { None }, $t); + compare_evaluation_inner!(match $e as &[_] { $p => $matches, _ => None }, $t); + }} +} + +// Repeat `$test`, substituting the given macro variables with the given +// identifiers. +// +// For example: +// +// repeat! { +// ($name); X; Y: +// struct $name; +// } +// +// Expands to: +// +// struct X; struct Y; +// +// This is used to repeat the tests using both the `N` and `Z` +// types. +macro_rules! repeat { + (($($dollar:tt $placeholder:ident)*); $($($values:ident),+);*: $($test:tt)*) => { + macro_rules! single { + ($($dollar $placeholder:ident),*) => { $($test)* } + } + $(single!($($values),+);)* + } +} + +fn main() { + repeat! { + ($arr $Ty); n, N; z, Z: + compare_evaluation!([_, x @ .., _], &$arr!(1, 2, 3, 4), Some(x), Option<&'static [$Ty]>); + compare_evaluation!([x, .., _], &$arr!(1, 2, 3, 4), Some(x), Option<&'static $Ty>); + compare_evaluation!([_, .., x], &$arr!(1, 2, 3, 4), Some(x), Option<&'static $Ty>); + + compare_evaluation!([_, x @ .., _], &$arr!(1, 2), Some(x), Option<&'static [$Ty]>); + compare_evaluation!([x, .., _], &$arr!(1, 2), Some(x), Option<&'static $Ty>); + compare_evaluation!([_, .., x], &$arr!(1, 2), Some(x), Option<&'static $Ty>); + + compare_evaluation!([_, x @ .., _], &$arr!(1), Some(x), Option<&'static [$Ty]>); + compare_evaluation!([x, .., _], &$arr!(1), Some(x), Option<&'static $Ty>); + compare_evaluation!([_, .., x], &$arr!(1), Some(x), Option<&'static $Ty>); + } + + compare_evaluation!([N(x), .., _], &n!(1, 2, 3, 4), Some(x), Option<&'static u8>); + compare_evaluation!([_, .., N(x)], &n!(1, 2, 3, 4), Some(x), Option<&'static u8>); + + compare_evaluation!([N(x), .., _], &n!(1, 2), Some(x), Option<&'static u8>); + compare_evaluation!([_, .., N(x)], &n!(1, 2), Some(x), Option<&'static u8>); +} diff --git a/src/test/ui/array-slice-vec/subslice-patterns-const-eval.rs b/src/test/ui/array-slice-vec/subslice-patterns-const-eval.rs new file mode 100644 index 0000000000..0b793fa012 --- /dev/null +++ b/src/test/ui/array-slice-vec/subslice-patterns-const-eval.rs @@ -0,0 +1,95 @@ +// Test that array subslice patterns are correctly handled in const evaluation. + +// run-pass + +#[derive(PartialEq, Debug, Clone)] +struct N(u8); + +#[derive(PartialEq, Debug, Clone)] +struct Z; + +macro_rules! n { + ($($e:expr),* $(,)?) => { + [$(N($e)),*] + } +} + +// This macro has an unused variable so that it can be repeated base on the +// number of times a repeated variable (`$e` in `z`) occurs. +macro_rules! zed { + ($e:expr) => { Z } +} + +macro_rules! z { + ($($e:expr),* $(,)?) => { + [$(zed!($e)),*] + } +} + +// Compare constant evaluation and runtime evaluation of a given expression. +macro_rules! compare_evaluation { + ($e:expr, $t:ty $(,)?) => {{ + const CONST_EVAL: $t = $e; + const fn const_eval() -> $t { $e } + static CONST_EVAL2: $t = const_eval(); + let runtime_eval = $e; + assert_eq!(CONST_EVAL, runtime_eval); + assert_eq!(CONST_EVAL2, runtime_eval); + }} +} + +// Repeat `$test`, substituting the given macro variables with the given +// identifiers. +// +// For example: +// +// repeat! { +// ($name); X; Y: +// struct $name; +// } +// +// Expands to: +// +// struct X; struct Y; +// +// This is used to repeat the tests using both the `N` and `Z` +// types. +macro_rules! repeat { + (($($dollar:tt $placeholder:ident)*); $($($values:ident),+);*: $($test:tt)*) => { + macro_rules! single { + ($($dollar $placeholder:ident),*) => { $($test)* } + } + $(single!($($values),+);)* + } +} + +fn main() { + repeat! { + ($arr $Ty); n, N; z, Z: + compare_evaluation!({ let [_, x @ .., _] = $arr!(1, 2, 3, 4); x }, [$Ty; 2]); + compare_evaluation!({ let [_, ref x @ .., _] = $arr!(1, 2, 3, 4); x }, &'static [$Ty; 2]); + compare_evaluation!({ let [_, x @ .., _] = &$arr!(1, 2, 3, 4); x }, &'static [$Ty; 2]); + + compare_evaluation!({ let [_, _, x @ .., _, _] = $arr!(1, 2, 3, 4); x }, [$Ty; 0]); + compare_evaluation!( + { let [_, _, ref x @ .., _, _] = $arr!(1, 2, 3, 4); x }, + &'static [$Ty; 0], + ); + compare_evaluation!( + { let [_, _, x @ .., _, _] = &$arr!(1, 2, 3, 4); x }, + &'static [$Ty; 0], + ); + + compare_evaluation!({ let [_, .., x] = $arr!(1, 2, 3, 4); x }, $Ty); + compare_evaluation!({ let [_, .., ref x] = $arr!(1, 2, 3, 4); x }, &'static $Ty); + compare_evaluation!({ let [_, _y @ .., x] = &$arr!(1, 2, 3, 4); x }, &'static $Ty); + } + + compare_evaluation!({ let [_, .., N(x)] = n!(1, 2, 3, 4); x }, u8); + compare_evaluation!({ let [_, .., N(ref x)] = n!(1, 2, 3, 4); x }, &'static u8); + compare_evaluation!({ let [_, .., N(x)] = &n!(1, 2, 3, 4); x }, &'static u8); + + compare_evaluation!({ let [N(x), .., _] = n!(1, 2, 3, 4); x }, u8); + compare_evaluation!({ let [N(ref x), .., _] = n!(1, 2, 3, 4); x }, &'static u8); + compare_evaluation!({ let [N(x), .., _] = &n!(1, 2, 3, 4); x }, &'static u8); +} diff --git a/src/test/ui/array-slice-vec/subslice-patterns-pass.rs b/src/test/ui/array-slice-vec/subslice-patterns-pass.rs index 1ebf3def78..e05790911f 100644 --- a/src/test/ui/array-slice-vec/subslice-patterns-pass.rs +++ b/src/test/ui/array-slice-vec/subslice-patterns-pass.rs @@ -4,8 +4,6 @@ // run-pass -#![feature(slice_patterns)] - #![allow(unreachable_patterns)] use std::convert::identity; diff --git a/src/test/ui/array-slice-vec/vec-matching-fixed.rs b/src/test/ui/array-slice-vec/vec-matching-fixed.rs index 5253bc1b21..fdeb7e4fda 100644 --- a/src/test/ui/array-slice-vec/vec-matching-fixed.rs +++ b/src/test/ui/array-slice-vec/vec-matching-fixed.rs @@ -1,7 +1,5 @@ // run-pass -#![feature(slice_patterns)] - fn a() { let x = [1, 2, 3]; match x { diff --git a/src/test/ui/array-slice-vec/vec-matching-fold.rs b/src/test/ui/array-slice-vec/vec-matching-fold.rs index f416160db2..998899271e 100644 --- a/src/test/ui/array-slice-vec/vec-matching-fold.rs +++ b/src/test/ui/array-slice-vec/vec-matching-fold.rs @@ -1,7 +1,5 @@ // run-pass -#![feature(slice_patterns)] - use std::fmt::Debug; fn foldl<T, U, F>(values: &[T], diff --git a/src/test/ui/array-slice-vec/vec-matching-legal-tail-element-borrow.rs b/src/test/ui/array-slice-vec/vec-matching-legal-tail-element-borrow.rs index f0602c328b..ed34f074a9 100644 --- a/src/test/ui/array-slice-vec/vec-matching-legal-tail-element-borrow.rs +++ b/src/test/ui/array-slice-vec/vec-matching-legal-tail-element-borrow.rs @@ -1,7 +1,6 @@ // run-pass -#![allow(unused_variables)] -#![feature(slice_patterns)] +#![allow(unused_variables)] pub fn main() { let x = &[1, 2, 3, 4, 5]; diff --git a/src/test/ui/array-slice-vec/vec-matching.rs b/src/test/ui/array-slice-vec/vec-matching.rs index 49c736bd72..7009244aa1 100644 --- a/src/test/ui/array-slice-vec/vec-matching.rs +++ b/src/test/ui/array-slice-vec/vec-matching.rs @@ -1,7 +1,5 @@ // run-pass -#![feature(slice_patterns)] - fn a() { let x = [1]; match x { diff --git a/src/test/ui/array-slice-vec/vec-tail-matching.rs b/src/test/ui/array-slice-vec/vec-tail-matching.rs index 3c7b160dcc..5f1699227d 100644 --- a/src/test/ui/array-slice-vec/vec-tail-matching.rs +++ b/src/test/ui/array-slice-vec/vec-tail-matching.rs @@ -1,7 +1,5 @@ // run-pass -#![feature(slice_patterns)] - struct Foo { string: &'static str } diff --git a/src/test/ui/asm/issue-51431.rs b/src/test/ui/asm/issue-51431.rs index d29c31fafc..4cef42d17d 100644 --- a/src/test/ui/asm/issue-51431.rs +++ b/src/test/ui/asm/issue-51431.rs @@ -1,3 +1,4 @@ +// build-fail // ignore-emscripten no asm! support #![feature(asm)] diff --git a/src/test/ui/asm/issue-51431.stderr b/src/test/ui/asm/issue-51431.stderr index f78d183197..a024f3311f 100644 --- a/src/test/ui/asm/issue-51431.stderr +++ b/src/test/ui/asm/issue-51431.stderr @@ -1,5 +1,5 @@ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/issue-51431.rs:7:32 + --> $DIR/issue-51431.rs:8:32 | LL | asm! {"mov $0,$1"::"0"("bx"),"1"(0x00)} | ^^^^ diff --git a/src/test/ui/associated-const/associated-const-ambiguity-report.stderr b/src/test/ui/associated-const/associated-const-ambiguity-report.stderr index bb217bd182..92a8d19021 100644 --- a/src/test/ui/associated-const/associated-const-ambiguity-report.stderr +++ b/src/test/ui/associated-const/associated-const-ambiguity-report.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in an impl of the trait `Foo` for the type `i32` | LL | const ID: i32 = 1; | ^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `Foo::ID(...)` instead note: candidate #2 is defined in an impl of the trait `Bar` for the type `i32` --> $DIR/associated-const-ambiguity-report.rs:14:5 | LL | const ID: i32 = 3; | ^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `Bar::ID(...)` instead +help: disambiguate the associated constant for candidate #1 + | +LL | const X: i32 = Foo::ID; + | ^^^^^^^ +help: disambiguate the associated constant for candidate #2 + | +LL | const X: i32 = Bar::ID; + | ^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/associated-const/associated-const-no-item.rs b/src/test/ui/associated-const/associated-const-no-item.rs index 35fb662f63..024d14e21b 100644 --- a/src/test/ui/associated-const/associated-const-no-item.rs +++ b/src/test/ui/associated-const/associated-const-no-item.rs @@ -3,7 +3,7 @@ trait Foo { } const X: i32 = <i32>::ID; -//~^ ERROR no associated item named `ID` found for type `i32` +//~^ ERROR no associated item named `ID` found fn main() { assert_eq!(1, X); diff --git a/src/test/ui/associated-const/issue-63496.stderr b/src/test/ui/associated-const/issue-63496.stderr index 23916a3ba4..3a70e7d43c 100644 --- a/src/test/ui/associated-const/issue-63496.stderr +++ b/src/test/ui/associated-const/issue-63496.stderr @@ -5,9 +5,13 @@ LL | const C: usize; | --------------- required by `A::C` LL | LL | fn f() -> ([u8; A::C], [u8; A::C]); - | ^^^^ cannot infer type + | ^^^^ + | | + | cannot infer type + | help: use the fully qualified path to an implementation: `<Type as A>::C` | = note: cannot resolve `_: A` + = note: associated constants cannot be accessed directly on a `trait`, they can only be accessed through a specific `impl` error[E0283]: type annotations needed --> $DIR/issue-63496.rs:4:33 @@ -16,9 +20,13 @@ LL | const C: usize; | --------------- required by `A::C` LL | LL | fn f() -> ([u8; A::C], [u8; A::C]); - | ^^^^ cannot infer type + | ^^^^ + | | + | cannot infer type + | help: use the fully qualified path to an implementation: `<Type as A>::C` | = note: cannot resolve `_: A` + = note: associated constants cannot be accessed directly on a `trait`, they can only be accessed through a specific `impl` error: aborting due to 2 previous errors diff --git a/src/test/ui/associated-item/associated-item-enum.stderr b/src/test/ui/associated-item/associated-item-enum.stderr index 5a62b9736d..6f89530eac 100644 --- a/src/test/ui/associated-item/associated-item-enum.stderr +++ b/src/test/ui/associated-item/associated-item-enum.stderr @@ -1,4 +1,4 @@ -error[E0599]: no variant or associated item named `mispellable` found for type `Enum` in the current scope +error[E0599]: no variant or associated item named `mispellable` found for enum `Enum` in the current scope --> $DIR/associated-item-enum.rs:17:11 | LL | enum Enum { Variant } @@ -10,7 +10,7 @@ LL | Enum::mispellable(); | variant or associated item not found in `Enum` | help: there is a method with a similar name: `misspellable` -error[E0599]: no variant or associated item named `mispellable_trait` found for type `Enum` in the current scope +error[E0599]: no variant or associated item named `mispellable_trait` found for enum `Enum` in the current scope --> $DIR/associated-item-enum.rs:18:11 | LL | enum Enum { Variant } @@ -19,7 +19,7 @@ LL | enum Enum { Variant } LL | Enum::mispellable_trait(); | ^^^^^^^^^^^^^^^^^ variant or associated item not found in `Enum` -error[E0599]: no variant or associated item named `MISPELLABLE` found for type `Enum` in the current scope +error[E0599]: no variant or associated item named `MISPELLABLE` found for enum `Enum` in the current scope --> $DIR/associated-item-enum.rs:19:11 | LL | enum Enum { Variant } diff --git a/src/test/ui/associated-item/issue-48027.stderr b/src/test/ui/associated-item/issue-48027.stderr index 9c825d593d..ddabd55289 100644 --- a/src/test/ui/associated-item/issue-48027.stderr +++ b/src/test/ui/associated-item/issue-48027.stderr @@ -13,9 +13,13 @@ error[E0283]: type annotations needed LL | const X: usize; | --------------- required by `Bar::X` LL | fn return_n(&self) -> [u8; Bar::X]; - | ^^^^^^ cannot infer type + | ^^^^^^ + | | + | cannot infer type + | help: use the fully qualified path to an implementation: `<Type as Bar>::X` | = note: cannot resolve `_: Bar` + = note: associated constants cannot be accessed directly on a `trait`, they can only be accessed through a specific `impl` error: aborting due to 2 previous errors diff --git a/src/test/ui/associated-type-bounds/duplicate.rs b/src/test/ui/associated-type-bounds/duplicate.rs index a89fd9807d..65ca017e2f 100644 --- a/src/test/ui/associated-type-bounds/duplicate.rs +++ b/src/test/ui/associated-type-bounds/duplicate.rs @@ -9,175 +9,178 @@ use std::iter; struct SI1<T: Iterator<Item: Copy, Item: Send>> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] struct SI2<T: Iterator<Item: Copy, Item: Copy>> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] struct SI3<T: Iterator<Item: 'static, Item: 'static>> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] struct SW1<T> where T: Iterator<Item: Copy, Item: Send> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] struct SW2<T> where T: Iterator<Item: Copy, Item: Copy> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] struct SW3<T> where T: Iterator<Item: 'static, Item: 'static> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] enum EI1<T: Iterator<Item: Copy, Item: Send>> { V(T) } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] enum EI2<T: Iterator<Item: Copy, Item: Copy>> { V(T) } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] enum EI3<T: Iterator<Item: 'static, Item: 'static>> { V(T) } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] enum EW1<T> where T: Iterator<Item: Copy, Item: Send> { V(T) } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] enum EW2<T> where T: Iterator<Item: Copy, Item: Copy> { V(T) } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] enum EW3<T> where T: Iterator<Item: 'static, Item: 'static> { V(T) } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] union UI1<T: Iterator<Item: Copy, Item: Send>> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] union UI2<T: Iterator<Item: Copy, Item: Copy>> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] union UI3<T: Iterator<Item: 'static, Item: 'static>> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] union UW1<T> where T: Iterator<Item: Copy, Item: Send> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] union UW2<T> where T: Iterator<Item: Copy, Item: Copy> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] union UW3<T> where T: Iterator<Item: 'static, Item: 'static> { f: T } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FI1<T: Iterator<Item: Copy, Item: Send>>() {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FI2<T: Iterator<Item: Copy, Item: Copy>>() {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FI3<T: Iterator<Item: 'static, Item: 'static>>() {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FW1<T>() where T: Iterator<Item: Copy, Item: Send> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FW2<T>() where T: Iterator<Item: Copy, Item: Copy> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FW3<T>() where T: Iterator<Item: 'static, Item: 'static> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FRPIT1() -> impl Iterator<Item: Copy, Item: Send> { iter::empty() } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FRPIT2() -> impl Iterator<Item: Copy, Item: Copy> { iter::empty() } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FRPIT3() -> impl Iterator<Item: 'static, Item: 'static> { iter::empty() } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FAPIT1(_: impl Iterator<Item: Copy, Item: Send>) {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FAPIT2(_: impl Iterator<Item: Copy, Item: Copy>) {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn FAPIT3(_: impl Iterator<Item: 'static, Item: 'static>) {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] const CIT1: impl Iterator<Item: Copy, Item: Send> = iter::empty(); -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] const CIT2: impl Iterator<Item: Copy, Item: Copy> = iter::empty(); -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] const CIT3: impl Iterator<Item: 'static, Item: 'static> = iter::empty(); -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] static SIT1: impl Iterator<Item: Copy, Item: Send> = iter::empty(); -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] static SIT2: impl Iterator<Item: Copy, Item: Copy> = iter::empty(); -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] static SIT3: impl Iterator<Item: 'static, Item: 'static> = iter::empty(); -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn lit1() { let _: impl Iterator<Item: Copy, Item: Send> = iter::empty(); } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn lit2() { let _: impl Iterator<Item: Copy, Item: Copy> = iter::empty(); } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] fn lit3() { let _: impl Iterator<Item: 'static, Item: 'static> = iter::empty(); } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] type TAI1<T: Iterator<Item: Copy, Item: Send>> = T; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] type TAI2<T: Iterator<Item: Copy, Item: Copy>> = T; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] type TAI3<T: Iterator<Item: 'static, Item: 'static>> = T; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] type TAW1<T> where T: Iterator<Item: Copy, Item: Send> = T; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] type TAW2<T> where T: Iterator<Item: Copy, Item: Copy> = T; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] type TAW3<T> where T: Iterator<Item: 'static, Item: 'static> = T; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] type ETAI1<T: Iterator<Item: Copy, Item: Send>> = impl Copy; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] //~| ERROR could not find defining uses //~| ERROR could not find defining uses //~| ERROR could not find defining uses type ETAI2<T: Iterator<Item: Copy, Item: Copy>> = impl Copy; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] //~| ERROR could not find defining uses //~| ERROR could not find defining uses //~| ERROR could not find defining uses type ETAI3<T: Iterator<Item: 'static, Item: 'static>> = impl Copy; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] //~| ERROR could not find defining uses //~| ERROR could not find defining uses //~| ERROR could not find defining uses type ETAI4 = impl Iterator<Item: Copy, Item: Send>; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] //~| ERROR could not find defining uses //~| ERROR could not find defining uses //~| ERROR could not find defining uses type ETAI5 = impl Iterator<Item: Copy, Item: Copy>; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] //~| ERROR could not find defining uses //~| ERROR could not find defining uses //~| ERROR could not find defining uses type ETAI6 = impl Iterator<Item: 'static, Item: 'static>; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] //~| ERROR could not find defining uses //~| ERROR could not find defining uses //~| ERROR could not find defining uses trait TRI1<T: Iterator<Item: Copy, Item: Send>> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRI2<T: Iterator<Item: Copy, Item: Copy>> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRI3<T: Iterator<Item: 'static, Item: 'static>> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRS1: Iterator<Item: Copy, Item: Send> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRS2: Iterator<Item: Copy, Item: Copy> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRS3: Iterator<Item: 'static, Item: 'static> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRW1<T> where T: Iterator<Item: Copy, Item: Send> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRW2<T> where T: Iterator<Item: Copy, Item: Copy> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRW3<T> where T: Iterator<Item: 'static, Item: 'static> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRSW1 where Self: Iterator<Item: Copy, Item: Send> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] +//~| ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRSW2 where Self: Iterator<Item: Copy, Item: Copy> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] +//~| ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRSW3 where Self: Iterator<Item: 'static, Item: 'static> {} -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] +//~| ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRA1 { type A: Iterator<Item: Copy, Item: Send>; } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRA2 { type A: Iterator<Item: Copy, Item: Copy>; } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] trait TRA3 { type A: Iterator<Item: 'static, Item: 'static>; } -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] type TADyn1 = dyn Iterator<Item: Copy, Item: Send>; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] //~| ERROR could not find defining uses //~| ERROR could not find defining uses type TADyn2 = Box<dyn Iterator<Item: Copy, Item: Copy>>; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] //~| ERROR could not find defining uses //~| ERROR could not find defining uses type TADyn3 = dyn Iterator<Item: 'static, Item: 'static>; -//~^ ERROR the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified [E0719] +//~^ ERROR the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified [E0719] //~| ERROR could not find defining uses //~| ERROR could not find defining uses diff --git a/src/test/ui/associated-type-bounds/duplicate.stderr b/src/test/ui/associated-type-bounds/duplicate.stderr index e5e85d6856..defa62994e 100644 --- a/src/test/ui/associated-type-bounds/duplicate.stderr +++ b/src/test/ui/associated-type-bounds/duplicate.stderr @@ -6,7 +6,7 @@ LL | #![feature(impl_trait_in_bindings)] | = note: `#[warn(incomplete_features)]` on by default -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:11:36 | LL | struct SI1<T: Iterator<Item: Copy, Item: Send>> { f: T } @@ -14,7 +14,7 @@ LL | struct SI1<T: Iterator<Item: Copy, Item: Send>> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:13:36 | LL | struct SI2<T: Iterator<Item: Copy, Item: Copy>> { f: T } @@ -22,7 +22,7 @@ LL | struct SI2<T: Iterator<Item: Copy, Item: Copy>> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:15:39 | LL | struct SI3<T: Iterator<Item: 'static, Item: 'static>> { f: T } @@ -30,7 +30,7 @@ LL | struct SI3<T: Iterator<Item: 'static, Item: 'static>> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:17:45 | LL | struct SW1<T> where T: Iterator<Item: Copy, Item: Send> { f: T } @@ -38,7 +38,7 @@ LL | struct SW1<T> where T: Iterator<Item: Copy, Item: Send> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:19:45 | LL | struct SW2<T> where T: Iterator<Item: Copy, Item: Copy> { f: T } @@ -46,7 +46,7 @@ LL | struct SW2<T> where T: Iterator<Item: Copy, Item: Copy> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:21:48 | LL | struct SW3<T> where T: Iterator<Item: 'static, Item: 'static> { f: T } @@ -54,7 +54,7 @@ LL | struct SW3<T> where T: Iterator<Item: 'static, Item: 'static> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:24:34 | LL | enum EI1<T: Iterator<Item: Copy, Item: Send>> { V(T) } @@ -62,7 +62,7 @@ LL | enum EI1<T: Iterator<Item: Copy, Item: Send>> { V(T) } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:26:34 | LL | enum EI2<T: Iterator<Item: Copy, Item: Copy>> { V(T) } @@ -70,7 +70,7 @@ LL | enum EI2<T: Iterator<Item: Copy, Item: Copy>> { V(T) } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:28:37 | LL | enum EI3<T: Iterator<Item: 'static, Item: 'static>> { V(T) } @@ -78,7 +78,7 @@ LL | enum EI3<T: Iterator<Item: 'static, Item: 'static>> { V(T) } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:30:43 | LL | enum EW1<T> where T: Iterator<Item: Copy, Item: Send> { V(T) } @@ -86,7 +86,7 @@ LL | enum EW1<T> where T: Iterator<Item: Copy, Item: Send> { V(T) } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:32:43 | LL | enum EW2<T> where T: Iterator<Item: Copy, Item: Copy> { V(T) } @@ -94,7 +94,7 @@ LL | enum EW2<T> where T: Iterator<Item: Copy, Item: Copy> { V(T) } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:34:46 | LL | enum EW3<T> where T: Iterator<Item: 'static, Item: 'static> { V(T) } @@ -102,7 +102,7 @@ LL | enum EW3<T> where T: Iterator<Item: 'static, Item: 'static> { V(T) } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:37:35 | LL | union UI1<T: Iterator<Item: Copy, Item: Send>> { f: T } @@ -110,7 +110,7 @@ LL | union UI1<T: Iterator<Item: Copy, Item: Send>> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:39:35 | LL | union UI2<T: Iterator<Item: Copy, Item: Copy>> { f: T } @@ -118,7 +118,7 @@ LL | union UI2<T: Iterator<Item: Copy, Item: Copy>> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:41:38 | LL | union UI3<T: Iterator<Item: 'static, Item: 'static>> { f: T } @@ -126,7 +126,7 @@ LL | union UI3<T: Iterator<Item: 'static, Item: 'static>> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:43:44 | LL | union UW1<T> where T: Iterator<Item: Copy, Item: Send> { f: T } @@ -134,7 +134,7 @@ LL | union UW1<T> where T: Iterator<Item: Copy, Item: Send> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:45:44 | LL | union UW2<T> where T: Iterator<Item: Copy, Item: Copy> { f: T } @@ -142,7 +142,7 @@ LL | union UW2<T> where T: Iterator<Item: Copy, Item: Copy> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:47:47 | LL | union UW3<T> where T: Iterator<Item: 'static, Item: 'static> { f: T } @@ -150,7 +150,7 @@ LL | union UW3<T> where T: Iterator<Item: 'static, Item: 'static> { f: T } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:50:32 | LL | fn FI1<T: Iterator<Item: Copy, Item: Send>>() {} @@ -158,7 +158,7 @@ LL | fn FI1<T: Iterator<Item: Copy, Item: Send>>() {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:52:32 | LL | fn FI2<T: Iterator<Item: Copy, Item: Copy>>() {} @@ -166,7 +166,7 @@ LL | fn FI2<T: Iterator<Item: Copy, Item: Copy>>() {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:54:35 | LL | fn FI3<T: Iterator<Item: 'static, Item: 'static>>() {} @@ -174,7 +174,7 @@ LL | fn FI3<T: Iterator<Item: 'static, Item: 'static>>() {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:56:43 | LL | fn FW1<T>() where T: Iterator<Item: Copy, Item: Send> {} @@ -182,7 +182,7 @@ LL | fn FW1<T>() where T: Iterator<Item: Copy, Item: Send> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:58:43 | LL | fn FW2<T>() where T: Iterator<Item: Copy, Item: Copy> {} @@ -190,7 +190,7 @@ LL | fn FW2<T>() where T: Iterator<Item: Copy, Item: Copy> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:60:46 | LL | fn FW3<T>() where T: Iterator<Item: 'static, Item: 'static> {} @@ -198,7 +198,7 @@ LL | fn FW3<T>() where T: Iterator<Item: 'static, Item: 'static> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:69:40 | LL | fn FAPIT1(_: impl Iterator<Item: Copy, Item: Send>) {} @@ -206,7 +206,7 @@ LL | fn FAPIT1(_: impl Iterator<Item: Copy, Item: Send>) {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:71:40 | LL | fn FAPIT2(_: impl Iterator<Item: Copy, Item: Copy>) {} @@ -214,7 +214,7 @@ LL | fn FAPIT2(_: impl Iterator<Item: Copy, Item: Copy>) {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:73:43 | LL | fn FAPIT3(_: impl Iterator<Item: 'static, Item: 'static>) {} @@ -222,7 +222,7 @@ LL | fn FAPIT3(_: impl Iterator<Item: 'static, Item: 'static>) {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:63:42 | LL | fn FRPIT1() -> impl Iterator<Item: Copy, Item: Send> { iter::empty() } @@ -230,7 +230,7 @@ LL | fn FRPIT1() -> impl Iterator<Item: Copy, Item: Send> { iter::empty() } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:65:42 | LL | fn FRPIT2() -> impl Iterator<Item: Copy, Item: Copy> { iter::empty() } @@ -238,7 +238,7 @@ LL | fn FRPIT2() -> impl Iterator<Item: Copy, Item: Copy> { iter::empty() } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:67:45 | LL | fn FRPIT3() -> impl Iterator<Item: 'static, Item: 'static> { iter::empty() } @@ -246,7 +246,7 @@ LL | fn FRPIT3() -> impl Iterator<Item: 'static, Item: 'static> { iter::empty() | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:76:39 | LL | const CIT1: impl Iterator<Item: Copy, Item: Send> = iter::empty(); @@ -254,7 +254,7 @@ LL | const CIT1: impl Iterator<Item: Copy, Item: Send> = iter::empty(); | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:78:39 | LL | const CIT2: impl Iterator<Item: Copy, Item: Copy> = iter::empty(); @@ -262,7 +262,7 @@ LL | const CIT2: impl Iterator<Item: Copy, Item: Copy> = iter::empty(); | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:80:42 | LL | const CIT3: impl Iterator<Item: 'static, Item: 'static> = iter::empty(); @@ -270,7 +270,7 @@ LL | const CIT3: impl Iterator<Item: 'static, Item: 'static> = iter::empty(); | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:82:40 | LL | static SIT1: impl Iterator<Item: Copy, Item: Send> = iter::empty(); @@ -278,7 +278,7 @@ LL | static SIT1: impl Iterator<Item: Copy, Item: Send> = iter::empty(); | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:84:40 | LL | static SIT2: impl Iterator<Item: Copy, Item: Copy> = iter::empty(); @@ -286,7 +286,7 @@ LL | static SIT2: impl Iterator<Item: Copy, Item: Copy> = iter::empty(); | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:86:43 | LL | static SIT3: impl Iterator<Item: 'static, Item: 'static> = iter::empty(); @@ -294,7 +294,7 @@ LL | static SIT3: impl Iterator<Item: 'static, Item: 'static> = iter::empty(); | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:89:46 | LL | fn lit1() { let _: impl Iterator<Item: Copy, Item: Send> = iter::empty(); } @@ -302,7 +302,7 @@ LL | fn lit1() { let _: impl Iterator<Item: Copy, Item: Send> = iter::empty(); } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:91:46 | LL | fn lit2() { let _: impl Iterator<Item: Copy, Item: Copy> = iter::empty(); } @@ -310,7 +310,7 @@ LL | fn lit2() { let _: impl Iterator<Item: Copy, Item: Copy> = iter::empty(); } | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:93:49 | LL | fn lit3() { let _: impl Iterator<Item: 'static, Item: 'static> = iter::empty(); } @@ -318,7 +318,7 @@ LL | fn lit3() { let _: impl Iterator<Item: 'static, Item: 'static> = iter::empt | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:96:35 | LL | type TAI1<T: Iterator<Item: Copy, Item: Send>> = T; @@ -326,7 +326,7 @@ LL | type TAI1<T: Iterator<Item: Copy, Item: Send>> = T; | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:98:35 | LL | type TAI2<T: Iterator<Item: Copy, Item: Copy>> = T; @@ -334,7 +334,7 @@ LL | type TAI2<T: Iterator<Item: Copy, Item: Copy>> = T; | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:100:38 | LL | type TAI3<T: Iterator<Item: 'static, Item: 'static>> = T; @@ -342,7 +342,7 @@ LL | type TAI3<T: Iterator<Item: 'static, Item: 'static>> = T; | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:102:44 | LL | type TAW1<T> where T: Iterator<Item: Copy, Item: Send> = T; @@ -350,7 +350,7 @@ LL | type TAW1<T> where T: Iterator<Item: Copy, Item: Send> = T; | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:104:44 | LL | type TAW2<T> where T: Iterator<Item: Copy, Item: Copy> = T; @@ -358,7 +358,7 @@ LL | type TAW2<T> where T: Iterator<Item: Copy, Item: Copy> = T; | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:106:47 | LL | type TAW3<T> where T: Iterator<Item: 'static, Item: 'static> = T; @@ -372,7 +372,7 @@ error: could not find defining uses LL | type ETAI1<T: Iterator<Item: Copy, Item: Send>> = impl Copy; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:109:36 | LL | type ETAI1<T: Iterator<Item: Copy, Item: Send>> = impl Copy; @@ -386,7 +386,7 @@ error: could not find defining uses LL | type ETAI2<T: Iterator<Item: Copy, Item: Copy>> = impl Copy; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:114:36 | LL | type ETAI2<T: Iterator<Item: Copy, Item: Copy>> = impl Copy; @@ -400,7 +400,7 @@ error: could not find defining uses LL | type ETAI3<T: Iterator<Item: 'static, Item: 'static>> = impl Copy; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:119:39 | LL | type ETAI3<T: Iterator<Item: 'static, Item: 'static>> = impl Copy; @@ -414,7 +414,7 @@ error: could not find defining uses LL | type ETAI4 = impl Iterator<Item: Copy, Item: Send>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:124:40 | LL | type ETAI4 = impl Iterator<Item: Copy, Item: Send>; @@ -428,7 +428,7 @@ error: could not find defining uses LL | type ETAI5 = impl Iterator<Item: Copy, Item: Copy>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:129:40 | LL | type ETAI5 = impl Iterator<Item: Copy, Item: Copy>; @@ -442,7 +442,7 @@ error: could not find defining uses LL | type ETAI6 = impl Iterator<Item: 'static, Item: 'static>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:134:43 | LL | type ETAI6 = impl Iterator<Item: 'static, Item: 'static>; @@ -450,7 +450,7 @@ LL | type ETAI6 = impl Iterator<Item: 'static, Item: 'static>; | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:140:36 | LL | trait TRI1<T: Iterator<Item: Copy, Item: Send>> {} @@ -458,7 +458,7 @@ LL | trait TRI1<T: Iterator<Item: Copy, Item: Send>> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:142:36 | LL | trait TRI2<T: Iterator<Item: Copy, Item: Copy>> {} @@ -466,7 +466,7 @@ LL | trait TRI2<T: Iterator<Item: Copy, Item: Copy>> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:144:39 | LL | trait TRI3<T: Iterator<Item: 'static, Item: 'static>> {} @@ -474,7 +474,7 @@ LL | trait TRI3<T: Iterator<Item: 'static, Item: 'static>> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:146:34 | LL | trait TRS1: Iterator<Item: Copy, Item: Send> {} @@ -482,7 +482,7 @@ LL | trait TRS1: Iterator<Item: Copy, Item: Send> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:148:34 | LL | trait TRS2: Iterator<Item: Copy, Item: Copy> {} @@ -490,7 +490,7 @@ LL | trait TRS2: Iterator<Item: Copy, Item: Copy> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:150:37 | LL | trait TRS3: Iterator<Item: 'static, Item: 'static> {} @@ -498,7 +498,7 @@ LL | trait TRS3: Iterator<Item: 'static, Item: 'static> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:152:45 | LL | trait TRW1<T> where T: Iterator<Item: Copy, Item: Send> {} @@ -506,7 +506,7 @@ LL | trait TRW1<T> where T: Iterator<Item: Copy, Item: Send> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:154:45 | LL | trait TRW2<T> where T: Iterator<Item: Copy, Item: Copy> {} @@ -514,7 +514,7 @@ LL | trait TRW2<T> where T: Iterator<Item: Copy, Item: Copy> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:156:48 | LL | trait TRW3<T> where T: Iterator<Item: 'static, Item: 'static> {} @@ -522,7 +522,7 @@ LL | trait TRW3<T> where T: Iterator<Item: 'static, Item: 'static> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/duplicate.rs:158:46 | LL | trait TRSW1 where Self: Iterator<Item: Copy, Item: Send> {} @@ -530,64 +530,88 @@ LL | trait TRSW1 where Self: Iterator<Item: Copy, Item: Send> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified - --> $DIR/duplicate.rs:160:46 +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:158:46 + | +LL | trait TRSW1 where Self: Iterator<Item: Copy, Item: Send> {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:161:46 | LL | trait TRSW2 where Self: Iterator<Item: Copy, Item: Copy> {} | ---------- ^^^^^^^^^^ re-bound here | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified - --> $DIR/duplicate.rs:162:49 +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:161:46 + | +LL | trait TRSW2 where Self: Iterator<Item: Copy, Item: Copy> {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:164:49 + | +LL | trait TRSW3 where Self: Iterator<Item: 'static, Item: 'static> {} + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:164:49 | LL | trait TRSW3 where Self: Iterator<Item: 'static, Item: 'static> {} | ------------- ^^^^^^^^^^^^^ re-bound here | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified - --> $DIR/duplicate.rs:164:43 +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:167:43 | LL | trait TRA1 { type A: Iterator<Item: Copy, Item: Send>; } | ---------- ^^^^^^^^^^ re-bound here | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified - --> $DIR/duplicate.rs:166:43 +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:169:43 | LL | trait TRA2 { type A: Iterator<Item: Copy, Item: Copy>; } | ---------- ^^^^^^^^^^ re-bound here | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified - --> $DIR/duplicate.rs:168:46 +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:171:46 | LL | trait TRA3 { type A: Iterator<Item: 'static, Item: 'static>; } | ------------- ^^^^^^^^^^^^^ re-bound here | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified - --> $DIR/duplicate.rs:171:40 +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:174:40 | LL | type TADyn1 = dyn Iterator<Item: Copy, Item: Send>; | ---------- ^^^^^^^^^^ re-bound here | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified - --> $DIR/duplicate.rs:175:44 +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:178:44 | LL | type TADyn2 = Box<dyn Iterator<Item: Copy, Item: Copy>>; | ---------- ^^^^^^^^^^ re-bound here | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified - --> $DIR/duplicate.rs:179:43 +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified + --> $DIR/duplicate.rs:182:43 | LL | type TADyn3 = dyn Iterator<Item: 'static, Item: 'static>; | ------------- ^^^^^^^^^^^^^ re-bound here @@ -667,40 +691,40 @@ LL | type ETAI6 = impl Iterator<Item: 'static, Item: 'static>; | ^^^^^^^^^^^^^ error: could not find defining uses - --> $DIR/duplicate.rs:171:28 + --> $DIR/duplicate.rs:174:28 | LL | type TADyn1 = dyn Iterator<Item: Copy, Item: Send>; | ^^^^^^^^^^ error: could not find defining uses - --> $DIR/duplicate.rs:171:40 + --> $DIR/duplicate.rs:174:40 | LL | type TADyn1 = dyn Iterator<Item: Copy, Item: Send>; | ^^^^^^^^^^ error: could not find defining uses - --> $DIR/duplicate.rs:175:32 + --> $DIR/duplicate.rs:178:32 | LL | type TADyn2 = Box<dyn Iterator<Item: Copy, Item: Copy>>; | ^^^^^^^^^^ error: could not find defining uses - --> $DIR/duplicate.rs:175:44 + --> $DIR/duplicate.rs:178:44 | LL | type TADyn2 = Box<dyn Iterator<Item: Copy, Item: Copy>>; | ^^^^^^^^^^ error: could not find defining uses - --> $DIR/duplicate.rs:179:28 + --> $DIR/duplicate.rs:182:28 | LL | type TADyn3 = dyn Iterator<Item: 'static, Item: 'static>; | ^^^^^^^^^^^^^ error: could not find defining uses - --> $DIR/duplicate.rs:179:43 + --> $DIR/duplicate.rs:182:43 | LL | type TADyn3 = dyn Iterator<Item: 'static, Item: 'static>; | ^^^^^^^^^^^^^ -error: aborting due to 93 previous errors +error: aborting due to 96 previous errors diff --git a/src/test/ui/associated-type/associated-type-projection-ambig-between-bound-and-where-clause.stderr b/src/test/ui/associated-type/associated-type-projection-ambig-between-bound-and-where-clause.stderr index 9ec6ffb056..6de8459954 100644 --- a/src/test/ui/associated-type/associated-type-projection-ambig-between-bound-and-where-clause.stderr +++ b/src/test/ui/associated-type/associated-type-projection-ambig-between-bound-and-where-clause.stderr @@ -9,6 +9,15 @@ LL | type Color; ... LL | fn a<C:Vehicle+Box>(_: C::Color) { | ^^^^^^^^ ambiguous associated type `Color` + | +help: use fully qualified syntax to disambiguate + | +LL | fn a<C:Vehicle+Box>(_: <C as Box>::Color) { + | ^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn a<C:Vehicle+Box>(_: <C as Vehicle>::Color) { + | ^^^^^^^^^^^^^^^^^^^^^ error[E0221]: ambiguous associated type `Color` in bounds of `C` --> $DIR/associated-type-projection-ambig-between-bound-and-where-clause.rs:20:12 @@ -21,6 +30,15 @@ LL | type Color; ... LL | fn b<C>(_: C::Color) where C : Vehicle+Box { | ^^^^^^^^ ambiguous associated type `Color` + | +help: use fully qualified syntax to disambiguate + | +LL | fn b<C>(_: <C as Box>::Color) where C : Vehicle+Box { + | ^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn b<C>(_: <C as Vehicle>::Color) where C : Vehicle+Box { + | ^^^^^^^^^^^^^^^^^^^^^ error[E0221]: ambiguous associated type `Color` in bounds of `C` --> $DIR/associated-type-projection-ambig-between-bound-and-where-clause.rs:24:12 @@ -33,6 +51,15 @@ LL | type Color; ... LL | fn c<C>(_: C::Color) where C : Vehicle, C : Box { | ^^^^^^^^ ambiguous associated type `Color` + | +help: use fully qualified syntax to disambiguate + | +LL | fn c<C>(_: <C as Box>::Color) where C : Vehicle, C : Box { + | ^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn c<C>(_: <C as Vehicle>::Color) where C : Vehicle, C : Box { + | ^^^^^^^^^^^^^^^^^^^^^ error[E0221]: ambiguous associated type `Color` in bounds of `X` --> $DIR/associated-type-projection-ambig-between-bound-and-where-clause.rs:35:20 @@ -45,6 +72,15 @@ LL | type Color; ... LL | fn e(&self, _: X::Color) where X : Box; | ^^^^^^^^ ambiguous associated type `Color` + | +help: use fully qualified syntax to disambiguate + | +LL | fn e(&self, _: <X as Box>::Color) where X : Box; + | ^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn e(&self, _: <X as Vehicle>::Color) where X : Box; + | ^^^^^^^^^^^^^^^^^^^^^ error[E0221]: ambiguous associated type `Color` in bounds of `X` --> $DIR/associated-type-projection-ambig-between-bound-and-where-clause.rs:38:20 @@ -57,6 +93,15 @@ LL | type Color; ... LL | fn f(&self, _: X::Color) where X : Box { } | ^^^^^^^^ ambiguous associated type `Color` + | +help: use fully qualified syntax to disambiguate + | +LL | fn f(&self, _: <X as Box>::Color) where X : Box { } + | ^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn f(&self, _: <X as Vehicle>::Color) where X : Box { } + | ^^^^^^^^^^^^^^^^^^^^^ error[E0221]: ambiguous associated type `Color` in bounds of `X` --> $DIR/associated-type-projection-ambig-between-bound-and-where-clause.rs:30:20 @@ -69,6 +114,15 @@ LL | type Color; ... LL | fn d(&self, _: X::Color) where X : Box { } | ^^^^^^^^ ambiguous associated type `Color` + | +help: use fully qualified syntax to disambiguate + | +LL | fn d(&self, _: <X as Box>::Color) where X : Box { } + | ^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn d(&self, _: <X as Vehicle>::Color) where X : Box { } + | ^^^^^^^^^^^^^^^^^^^^^ error: aborting due to 6 previous errors diff --git a/src/test/ui/associated-type/associated-type-projection-from-multiple-supertraits.rs b/src/test/ui/associated-type/associated-type-projection-from-multiple-supertraits.rs index 7a67844579..df19332b64 100644 --- a/src/test/ui/associated-type/associated-type-projection-from-multiple-supertraits.rs +++ b/src/test/ui/associated-type/associated-type-projection-from-multiple-supertraits.rs @@ -22,11 +22,22 @@ fn dent<C:BoxCar>(c: C, color: C::Color) { fn dent_object<COLOR>(c: dyn BoxCar<Color=COLOR>) { //~^ ERROR ambiguous associated type - //~| ERROR the value of the associated type `Color` (from the trait `Vehicle`) must be specified + //~| ERROR the value of the associated types } fn paint<C:BoxCar>(c: C, d: C::Color) { //~^ ERROR ambiguous associated type `Color` in bounds of `C` } +fn dent_object_2<COLOR>(c: dyn BoxCar) where <dyn BoxCar as Vehicle>::Color = COLOR { + //~^ ERROR the value of the associated types + //~| ERROR equality constraints are not yet supported in `where` clauses +} + +fn dent_object_3<X, COLOR>(c: X) +where X: BoxCar, + X: Vehicle<Color = COLOR>, + X: Box<Color = COLOR> +{} // OK! + pub fn main() { } diff --git a/src/test/ui/associated-type/associated-type-projection-from-multiple-supertraits.stderr b/src/test/ui/associated-type/associated-type-projection-from-multiple-supertraits.stderr index 6118ebef12..c60d5f8f2c 100644 --- a/src/test/ui/associated-type/associated-type-projection-from-multiple-supertraits.stderr +++ b/src/test/ui/associated-type/associated-type-projection-from-multiple-supertraits.stderr @@ -1,3 +1,11 @@ +error: equality constraints are not yet supported in `where` clauses + --> $DIR/associated-type-projection-from-multiple-supertraits.rs:32:46 + | +LL | fn dent_object_2<COLOR>(c: dyn BoxCar) where <dyn BoxCar as Vehicle>::Color = COLOR { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not supported + | + = note: for more information, see https://github.com/rust-lang/rust/issues/20041 + error[E0221]: ambiguous associated type `Color` in bounds of `C` --> $DIR/associated-type-projection-from-multiple-supertraits.rs:19:32 | @@ -9,9 +17,18 @@ LL | type Color; ... LL | fn dent<C:BoxCar>(c: C, color: C::Color) { | ^^^^^^^^ ambiguous associated type `Color` + | +help: use fully qualified syntax to disambiguate + | +LL | fn dent<C:BoxCar>(c: C, color: <C as Box>::Color) { + | ^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn dent<C:BoxCar>(c: C, color: <C as Vehicle>::Color) { + | ^^^^^^^^^^^^^^^^^^^^^ -error[E0221]: ambiguous associated type `Color` in bounds of `BoxCar` - --> $DIR/associated-type-projection-from-multiple-supertraits.rs:23:37 +error[E0222]: ambiguous associated type `Color` in bounds of `BoxCar` + --> $DIR/associated-type-projection-from-multiple-supertraits.rs:23:30 | LL | type Color; | ----------- ambiguous `Color` from `Vehicle` @@ -20,16 +37,27 @@ LL | type Color; | ----------- ambiguous `Color` from `Box` ... LL | fn dent_object<COLOR>(c: dyn BoxCar<Color=COLOR>) { - | ^^^^^^^^^^^ ambiguous associated type `Color` + | ^^^^^^^^^^^^^^^^^^^ ambiguous associated type `Color` + | + = help: consider introducing a new type parameter `T` and adding `where` constraints: + where + T: BoxCar, + T: Box::Color = COLOR, + T: Vehicle::Color = COLOR -error[E0191]: the value of the associated type `Color` (from the trait `Vehicle`) must be specified - --> $DIR/associated-type-projection-from-multiple-supertraits.rs:23:26 +error[E0191]: the value of the associated types `Color` (from trait `Box`), `Color` (from trait `Vehicle`) must be specified + --> $DIR/associated-type-projection-from-multiple-supertraits.rs:23:30 | LL | type Color; - | ----------- `Color` defined here + | ----------- `Vehicle::Color` defined here +... +LL | type Color; + | ----------- `Box::Color` defined here ... LL | fn dent_object<COLOR>(c: dyn BoxCar<Color=COLOR>) { - | ^^^^^^^^^^^^^^^^^^^^^^^ associated type `Color` must be specified + | ^^^^^^^^^^^^^^^^^^^ associated types `Color` (from trait `Vehicle`), `Color` (from trait `Box`) must be specified + | + = help: consider introducing a new type parameter, adding `where` constraints using the fully-qualified path to the associated types error[E0221]: ambiguous associated type `Color` in bounds of `C` --> $DIR/associated-type-projection-from-multiple-supertraits.rs:28:29 @@ -42,8 +70,31 @@ LL | type Color; ... LL | fn paint<C:BoxCar>(c: C, d: C::Color) { | ^^^^^^^^ ambiguous associated type `Color` + | +help: use fully qualified syntax to disambiguate + | +LL | fn paint<C:BoxCar>(c: C, d: <C as Box>::Color) { + | ^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn paint<C:BoxCar>(c: C, d: <C as Vehicle>::Color) { + | ^^^^^^^^^^^^^^^^^^^^^ + +error[E0191]: the value of the associated types `Color` (from trait `Box`), `Color` (from trait `Vehicle`) must be specified + --> $DIR/associated-type-projection-from-multiple-supertraits.rs:32:32 + | +LL | type Color; + | ----------- `Vehicle::Color` defined here +... +LL | type Color; + | ----------- `Box::Color` defined here +... +LL | fn dent_object_2<COLOR>(c: dyn BoxCar) where <dyn BoxCar as Vehicle>::Color = COLOR { + | ^^^^^^ associated types `Color` (from trait `Vehicle`), `Color` (from trait `Box`) must be specified + | + = help: consider introducing a new type parameter, adding `where` constraints using the fully-qualified path to the associated types -error: aborting due to 4 previous errors +error: aborting due to 6 previous errors -Some errors have detailed explanations: E0191, E0221. +Some errors have detailed explanations: E0191, E0221, E0222. For more information about an error, try `rustc --explain E0191`. diff --git a/src/test/ui/associated-types/associated-types-incomplete-object.rs b/src/test/ui/associated-types/associated-types-incomplete-object.rs index 4993b13121..4627dfd2b7 100644 --- a/src/test/ui/associated-types/associated-types-incomplete-object.rs +++ b/src/test/ui/associated-types/associated-types-incomplete-object.rs @@ -21,11 +21,11 @@ pub fn main() { let a = &42isize as &dyn Foo<A=usize, B=char>; let b = &42isize as &dyn Foo<A=usize>; - //~^ ERROR the value of the associated type `B` (from the trait `Foo`) must be specified + //~^ ERROR the value of the associated type `B` (from trait `Foo`) must be specified let c = &42isize as &dyn Foo<B=char>; - //~^ ERROR the value of the associated type `A` (from the trait `Foo`) must be specified + //~^ ERROR the value of the associated type `A` (from trait `Foo`) must be specified let d = &42isize as &dyn Foo; - //~^ ERROR the value of the associated types `A` (from the trait `Foo`), `B` (from the trait + //~^ ERROR the value of the associated types `A` (from trait `Foo`), `B` (from trait } diff --git a/src/test/ui/associated-types/associated-types-incomplete-object.stderr b/src/test/ui/associated-types/associated-types-incomplete-object.stderr index b4c08f4a4c..24732271c4 100644 --- a/src/test/ui/associated-types/associated-types-incomplete-object.stderr +++ b/src/test/ui/associated-types/associated-types-incomplete-object.stderr @@ -1,23 +1,23 @@ -error[E0191]: the value of the associated type `B` (from the trait `Foo`) must be specified - --> $DIR/associated-types-incomplete-object.rs:23:26 +error[E0191]: the value of the associated type `B` (from trait `Foo`) must be specified + --> $DIR/associated-types-incomplete-object.rs:23:30 | LL | type B; | ------- `B` defined here ... LL | let b = &42isize as &dyn Foo<A=usize>; - | ^^^^^^^^^^^^^^^^ associated type `B` must be specified + | ^^^^^^^^^^^^ help: specify the associated type: `Foo<A=usize, B = Type>` -error[E0191]: the value of the associated type `A` (from the trait `Foo`) must be specified - --> $DIR/associated-types-incomplete-object.rs:26:26 +error[E0191]: the value of the associated type `A` (from trait `Foo`) must be specified + --> $DIR/associated-types-incomplete-object.rs:26:30 | LL | type A; | ------- `A` defined here ... LL | let c = &42isize as &dyn Foo<B=char>; - | ^^^^^^^^^^^^^^^ associated type `A` must be specified + | ^^^^^^^^^^^ help: specify the associated type: `Foo<B=char, A = Type>` -error[E0191]: the value of the associated types `A` (from the trait `Foo`), `B` (from the trait `Foo`) must be specified - --> $DIR/associated-types-incomplete-object.rs:29:26 +error[E0191]: the value of the associated types `A` (from trait `Foo`), `B` (from trait `Foo`) must be specified + --> $DIR/associated-types-incomplete-object.rs:29:30 | LL | type A; | ------- `A` defined here @@ -25,10 +25,7 @@ LL | type B; | ------- `B` defined here ... LL | let d = &42isize as &dyn Foo; - | ^^^^^^^ - | | - | associated type `A` must be specified - | associated type `B` must be specified + | ^^^ help: specify the associated types: `Foo<A = Type, B = Type>` error: aborting due to 3 previous errors diff --git a/src/test/ui/associated-types/associated-types-path-1.stderr b/src/test/ui/associated-types/associated-types-path-1.stderr index a10cf7f890..60db774908 100644 --- a/src/test/ui/associated-types/associated-types-path-1.stderr +++ b/src/test/ui/associated-types/associated-types-path-1.stderr @@ -1,8 +1,8 @@ error[E0220]: associated type `A` not found for `T` - --> $DIR/associated-types-path-1.rs:10:23 + --> $DIR/associated-types-path-1.rs:10:26 | LL | pub fn f1<T>(a: T, x: T::A) {} - | ^^^^ associated type `A` not found + | ^ associated type `A` not found error[E0221]: ambiguous associated type `A` in bounds of `T` --> $DIR/associated-types-path-1.rs:11:34 @@ -15,6 +15,15 @@ LL | type A; ... LL | pub fn f2<T: Foo + Bar>(a: T, x: T::A) {} | ^^^^ ambiguous associated type `A` + | +help: use fully qualified syntax to disambiguate + | +LL | pub fn f2<T: Foo + Bar>(a: T, x: <T as Bar>::A) {} + | ^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | pub fn f2<T: Foo + Bar>(a: T, x: <T as Foo>::A) {} + | ^^^^^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/associated-types/issue-64848.rs b/src/test/ui/associated-types/issue-64848.rs new file mode 100644 index 0000000000..77712168a0 --- /dev/null +++ b/src/test/ui/associated-types/issue-64848.rs @@ -0,0 +1,29 @@ +// build-pass + +trait AssociatedConstant { + const DATA: (); +} + +impl<F, T> AssociatedConstant for F +where + F: FnOnce() -> T, + T: AssociatedConstant, +{ + const DATA: () = T::DATA; +} + +impl AssociatedConstant for () { + const DATA: () = (); +} + +fn foo() -> impl AssociatedConstant { + () +} + +fn get_data<T: AssociatedConstant>(_: T) -> &'static () { + &T::DATA +} + +fn main() { + get_data(foo); +} diff --git a/src/test/ui/associated-types/missing-associated-types.rs b/src/test/ui/associated-types/missing-associated-types.rs new file mode 100644 index 0000000000..3c8410e39b --- /dev/null +++ b/src/test/ui/associated-types/missing-associated-types.rs @@ -0,0 +1,27 @@ +use std::ops::{Add, Sub, Mul, Div}; +trait X<Rhs>: Mul<Rhs> + Div<Rhs> {} +trait Y<Rhs>: Div<Rhs, Output = Rhs> { + type A; +} +trait Z<Rhs>: Div<Rhs> { + type A; + type B; +} +trait Fine<Rhs>: Div<Rhs, Output = Rhs> {} + +type Foo<Rhs> = dyn Add<Rhs> + Sub<Rhs> + X<Rhs> + Y<Rhs>; +//~^ ERROR only auto traits can be used as additional traits in a trait object +//~| ERROR the value of the associated types +type Bar<Rhs> = dyn Add<Rhs> + Sub<Rhs> + X<Rhs> + Z<Rhs>; +//~^ ERROR only auto traits can be used as additional traits in a trait object +//~| ERROR the value of the associated types +type Baz<Rhs> = dyn Add<Rhs> + Sub<Rhs> + Y<Rhs>; +//~^ ERROR only auto traits can be used as additional traits in a trait object +//~| ERROR the value of the associated types +type Bat<Rhs> = dyn Add<Rhs> + Sub<Rhs> + Fine<Rhs>; +//~^ ERROR only auto traits can be used as additional traits in a trait object +//~| ERROR the value of the associated types +type Bal<Rhs> = dyn X<Rhs>; +//~^ ERROR the value of the associated types + +fn main() {} diff --git a/src/test/ui/associated-types/missing-associated-types.stderr b/src/test/ui/associated-types/missing-associated-types.stderr new file mode 100644 index 0000000000..f9951170ac --- /dev/null +++ b/src/test/ui/associated-types/missing-associated-types.stderr @@ -0,0 +1,129 @@ +error[E0225]: only auto traits can be used as additional traits in a trait object + --> $DIR/missing-associated-types.rs:12:32 + | +LL | type Foo<Rhs> = dyn Add<Rhs> + Sub<Rhs> + X<Rhs> + Y<Rhs>; + | -------- ^^^^^^^^ + | | | + | | additional non-auto trait + | | trait alias used in trait object type (additional use) + | first non-auto trait + | trait alias used in trait object type (first use) + +error[E0191]: the value of the associated types `A` (from trait `Y`), `Output` (from trait `std::ops::Add`), `Output` (from trait `std::ops::Mul`), `Output` (from trait `std::ops::Sub`) must be specified + --> $DIR/missing-associated-types.rs:12:21 + | +LL | type A; + | ------- `A` defined here +... +LL | type Foo<Rhs> = dyn Add<Rhs> + Sub<Rhs> + X<Rhs> + Y<Rhs>; + | ^^^^^^^^ ^^^^^^^^ ^^^^^^ ^^^^^^ associated type `A` must be specified + | | | | + | | | associated type `Output` must be specified + | | associated type `Output` must be specified + | associated type `Output` must be specified + | +help: specify the associated types + | +LL | type Foo<Rhs> = dyn Add<Rhs, Output = Type> + Sub<Rhs, Output = Type> + X<Rhs, Output = Type> + Y<Rhs, A = Type>; + | ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ + +error[E0225]: only auto traits can be used as additional traits in a trait object + --> $DIR/missing-associated-types.rs:15:32 + | +LL | type Bar<Rhs> = dyn Add<Rhs> + Sub<Rhs> + X<Rhs> + Z<Rhs>; + | -------- ^^^^^^^^ + | | | + | | additional non-auto trait + | | trait alias used in trait object type (additional use) + | first non-auto trait + | trait alias used in trait object type (first use) + +error[E0191]: the value of the associated types `A` (from trait `Z`), `B` (from trait `Z`), `Output` (from trait `std::ops::Add`), `Output` (from trait `std::ops::Div`), `Output` (from trait `std::ops::Div`), `Output` (from trait `std::ops::Mul`), `Output` (from trait `std::ops::Sub`) must be specified + --> $DIR/missing-associated-types.rs:15:21 + | +LL | type A; + | ------- `A` defined here +LL | type B; + | ------- `B` defined here +... +LL | type Bar<Rhs> = dyn Add<Rhs> + Sub<Rhs> + X<Rhs> + Z<Rhs>; + | ^^^^^^^^ ^^^^^^^^ ^^^^^^ ^^^^^^ associated types `A`, `B`, `Output` must be specified + | | | | + | | | associated types `Output` (from trait `std::ops::Mul`), `Output` (from trait `std::ops::Div`) must be specified + | | associated type `Output` must be specified + | associated type `Output` must be specified + | +help: consider introducing a new type parameter, adding `where` constraints using the fully-qualified path to the associated types + --> $DIR/missing-associated-types.rs:15:43 + | +LL | type Bar<Rhs> = dyn Add<Rhs> + Sub<Rhs> + X<Rhs> + Z<Rhs>; + | ^^^^^^ +help: specify the associated types + | +LL | type Bar<Rhs> = dyn Add<Rhs, Output = Type> + Sub<Rhs, Output = Type> + X<Rhs> + Z<Rhs, A = Type, B = Type, Output = Type>; + | ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0225]: only auto traits can be used as additional traits in a trait object + --> $DIR/missing-associated-types.rs:18:32 + | +LL | type Baz<Rhs> = dyn Add<Rhs> + Sub<Rhs> + Y<Rhs>; + | -------- ^^^^^^^^ + | | | + | | additional non-auto trait + | | trait alias used in trait object type (additional use) + | first non-auto trait + | trait alias used in trait object type (first use) + +error[E0191]: the value of the associated types `A` (from trait `Y`), `Output` (from trait `std::ops::Add`), `Output` (from trait `std::ops::Sub`) must be specified + --> $DIR/missing-associated-types.rs:18:21 + | +LL | type A; + | ------- `A` defined here +... +LL | type Baz<Rhs> = dyn Add<Rhs> + Sub<Rhs> + Y<Rhs>; + | ^^^^^^^^ ^^^^^^^^ ^^^^^^ associated type `A` must be specified + | | | + | | associated type `Output` must be specified + | associated type `Output` must be specified + | +help: specify the associated types + | +LL | type Baz<Rhs> = dyn Add<Rhs, Output = Type> + Sub<Rhs, Output = Type> + Y<Rhs, A = Type>; + | ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ + +error[E0225]: only auto traits can be used as additional traits in a trait object + --> $DIR/missing-associated-types.rs:21:32 + | +LL | type Bat<Rhs> = dyn Add<Rhs> + Sub<Rhs> + Fine<Rhs>; + | -------- ^^^^^^^^ + | | | + | | additional non-auto trait + | | trait alias used in trait object type (additional use) + | first non-auto trait + | trait alias used in trait object type (first use) + +error[E0191]: the value of the associated types `Output` (from trait `std::ops::Add`), `Output` (from trait `std::ops::Sub`) must be specified + --> $DIR/missing-associated-types.rs:21:21 + | +LL | type Bat<Rhs> = dyn Add<Rhs> + Sub<Rhs> + Fine<Rhs>; + | ^^^^^^^^ ^^^^^^^^ associated type `Output` must be specified + | | + | associated type `Output` must be specified + | +help: specify the associated types + | +LL | type Bat<Rhs> = dyn Add<Rhs, Output = Type> + Sub<Rhs, Output = Type> + Fine<Rhs>; + | ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0191]: the value of the associated types `Output` (from trait `std::ops::Div`), `Output` (from trait `std::ops::Mul`) must be specified + --> $DIR/missing-associated-types.rs:24:21 + | +LL | type Bal<Rhs> = dyn X<Rhs>; + | ^^^^^^ associated types `Output` (from trait `std::ops::Mul`), `Output` (from trait `std::ops::Div`) must be specified + | + = help: consider introducing a new type parameter, adding `where` constraints using the fully-qualified path to the associated types + +error: aborting due to 9 previous errors + +Some errors have detailed explanations: E0191, E0225. +For more information about an error, try `rustc --explain E0191`. diff --git a/src/test/ui/async-await/async-fn-nonsend.rs b/src/test/ui/async-await/async-fn-nonsend.rs index 645c903c6b..ceeebbca51 100644 --- a/src/test/ui/async-await/async-fn-nonsend.rs +++ b/src/test/ui/async-await/async-fn-nonsend.rs @@ -2,15 +2,15 @@ // edition:2018 // compile-flags: --crate-type lib -use std::{ - cell::RefCell, - fmt::Debug, - rc::Rc, -}; +use std::{cell::RefCell, fmt::Debug, rc::Rc}; -fn non_sync() -> impl Debug { RefCell::new(()) } +fn non_sync() -> impl Debug { + RefCell::new(()) +} -fn non_send() -> impl Debug { Rc::new(()) } +fn non_send() -> impl Debug { + Rc::new(()) +} fn take_ref<T>(_: &T) {} @@ -53,5 +53,4 @@ pub fn pass_assert() { //~^ ERROR future cannot be sent between threads safely assert_send(non_sync_with_method_call()); //~^ ERROR future cannot be sent between threads safely - //~^^ ERROR future cannot be sent between threads safely } diff --git a/src/test/ui/async-await/async-fn-nonsend.stderr b/src/test/ui/async-await/async-fn-nonsend.stderr index 5c870ca2d0..105fd23ecf 100644 --- a/src/test/ui/async-await/async-fn-nonsend.stderr +++ b/src/test/ui/async-await/async-fn-nonsend.stderr @@ -62,27 +62,5 @@ LL | } LL | } | - `f` is later dropped here -error: future cannot be sent between threads safely - --> $DIR/async-fn-nonsend.rs:54:5 - | -LL | fn assert_send(_: impl Send) {} - | ----------- ---- required by this bound in `assert_send` -... -LL | assert_send(non_sync_with_method_call()); - | ^^^^^^^^^^^ future returned by `non_sync_with_method_call` is not `Send` - | - = help: within `std::fmt::ArgumentV1<'_>`, the trait `std::marker::Sync` is not implemented for `*mut (dyn std::ops::Fn() + 'static)` -note: future is not `Send` as this value is used across an await - --> $DIR/async-fn-nonsend.rs:43:9 - | -LL | let f: &mut std::fmt::Formatter = panic!(); - | - has type `&mut std::fmt::Formatter<'_>` -LL | if non_sync().fmt(f).unwrap() == () { -LL | fut().await; - | ^^^^^^^^^^^ await occurs here, with `f` maybe used later -LL | } -LL | } - | - `f` is later dropped here - -error: aborting due to 4 previous errors +error: aborting due to 3 previous errors diff --git a/src/test/ui/async-await/dont-suggest-missing-await.stderr b/src/test/ui/async-await/dont-suggest-missing-await.stderr index 239f801c39..dc3a4752fb 100644 --- a/src/test/ui/async-await/dont-suggest-missing-await.stderr +++ b/src/test/ui/async-await/dont-suggest-missing-await.stderr @@ -1,6 +1,9 @@ error[E0308]: mismatched types --> $DIR/dont-suggest-missing-await.rs:14:18 | +LL | async fn make_u32() -> u32 { + | --- the `Output` of this `async fn`'s found opaque type +... LL | take_u32(x) | ^ expected `u32`, found opaque type | diff --git a/src/test/ui/async-await/issue-64130-3-other.stderr b/src/test/ui/async-await/issue-64130-3-other.stderr index 155c5cc8ea..d682817292 100644 --- a/src/test/ui/async-await/issue-64130-3-other.stderr +++ b/src/test/ui/async-await/issue-64130-3-other.stderr @@ -3,6 +3,9 @@ error[E0277]: the trait bound `Foo: Qux` is not satisfied in `impl std::future:: | LL | fn is_qux<T: Qux>(t: T) { } | ------ --- required by this bound in `is_qux` +LL | +LL | async fn bar() { + | - within this `impl std::future::Future` ... LL | is_qux(bar()); | ^^^^^^ within `impl std::future::Future`, the trait `Qux` is not implemented for `Foo` diff --git a/src/test/ui/async-await/issue-64130-4-async-move.stderr b/src/test/ui/async-await/issue-64130-4-async-move.stderr index ddbb469b99..1e52d74f15 100644 --- a/src/test/ui/async-await/issue-64130-4-async-move.stderr +++ b/src/test/ui/async-await/issue-64130-4-async-move.stderr @@ -1,8 +1,17 @@ error: future cannot be sent between threads safely --> $DIR/issue-64130-4-async-move.rs:15:17 | -LL | pub fn foo() -> impl Future + Send { - | ^^^^^^^^^^^^^^^^^^ future returned by `foo` is not `Send` +LL | pub fn foo() -> impl Future + Send { + | ^^^^^^^^^^^^^^^^^^ future returned by `foo` is not `Send` +... +LL | / async move { +LL | | match client.status() { +LL | | 200 => { +LL | | let _x = get().await; +... | +LL | | } +LL | | } + | |_____- this returned value is of type `impl std::future::Future` | = help: the trait `std::marker::Sync` is not implemented for `(dyn std::any::Any + std::marker::Send + 'static)` note: future is not `Send` as this value is used across an await @@ -16,6 +25,11 @@ LL | let _x = get().await; ... LL | } | - `client` is later dropped here +help: consider moving this into a `let` binding to create a shorter lived borrow + --> $DIR/issue-64130-4-async-move.rs:19:15 + | +LL | match client.status() { + | ^^^^^^^^^^^^^^^ = note: the return type of a function must have a statically known size error: aborting due to previous error diff --git a/src/test/ui/async-await/issue-66387-if-without-else.rs b/src/test/ui/async-await/issue-66387-if-without-else.rs index aa5a8db612..3ab8220b4a 100644 --- a/src/test/ui/async-await/issue-66387-if-without-else.rs +++ b/src/test/ui/async-await/issue-66387-if-without-else.rs @@ -1,6 +1,6 @@ // edition:2018 async fn f() -> i32 { - if true { //~ ERROR if may be missing an else clause + if true { //~ ERROR `if` may be missing an `else` clause return 0; } // An `if` block without `else` causes the type table not to have a type for this expr. diff --git a/src/test/ui/async-await/issue-66387-if-without-else.stderr b/src/test/ui/async-await/issue-66387-if-without-else.stderr index 42e44472ac..e8e2a48983 100644 --- a/src/test/ui/async-await/issue-66387-if-without-else.stderr +++ b/src/test/ui/async-await/issue-66387-if-without-else.stderr @@ -1,4 +1,4 @@ -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/issue-66387-if-without-else.rs:3:5 | LL | / if true { diff --git a/src/test/ui/async-await/issues/issue-62009-1.rs b/src/test/ui/async-await/issues/issue-62009-1.rs index e95f7df388..aa142ebd78 100644 --- a/src/test/ui/async-await/issues/issue-62009-1.rs +++ b/src/test/ui/async-await/issues/issue-62009-1.rs @@ -1,5 +1,8 @@ // edition:2018 -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl async fn print_dur() {} diff --git a/src/test/ui/async-await/issues/issue-62009-1.stderr b/src/test/ui/async-await/issues/issue-62009-1.stderr index 6c8e0d0a5c..cd6670923c 100644 --- a/src/test/ui/async-await/issues/issue-62009-1.stderr +++ b/src/test/ui/async-await/issues/issue-62009-1.stderr @@ -1,5 +1,5 @@ error[E0728]: `await` is only allowed inside `async` functions and blocks - --> $DIR/issue-62009-1.rs:7:5 + --> $DIR/issue-62009-1.rs:10:5 | LL | fn main() { | ---- this is not `async` @@ -7,7 +7,7 @@ LL | async { let (); }.await; | ^^^^^^^^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks - --> $DIR/issue-62009-1.rs:9:5 + --> $DIR/issue-62009-1.rs:12:5 | LL | fn main() { | ---- this is not `async` @@ -19,7 +19,7 @@ LL | | }.await; | |___________^ only allowed inside `async` functions and blocks error[E0728]: `await` is only allowed inside `async` functions and blocks - --> $DIR/issue-62009-1.rs:13:5 + --> $DIR/issue-62009-1.rs:16:5 | LL | fn main() { | ---- this is not `async` @@ -27,15 +27,15 @@ LL | fn main() { LL | (|_| 2333).await; | ^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks -error[E0277]: the trait bound `[closure@$DIR/issue-62009-1.rs:13:5: 13:15]: std::future::Future` is not satisfied - --> $DIR/issue-62009-1.rs:13:5 +error[E0277]: the trait bound `[closure@$DIR/issue-62009-1.rs:16:5: 16:15]: std::future::Future` is not satisfied + --> $DIR/issue-62009-1.rs:16:5 | LL | (|_| 2333).await; - | ^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `[closure@$DIR/issue-62009-1.rs:13:5: 13:15]` + | ^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `[closure@$DIR/issue-62009-1.rs:16:5: 16:15]` | ::: $SRC_DIR/libstd/future.rs:LL:COL | -LL | F: Future +LL | F: Future, | ------ required by this bound in `std::future::poll_with_tls_context` error: aborting due to 4 previous errors diff --git a/src/test/ui/async-await/issues/issue-64433.rs b/src/test/ui/async-await/issues/issue-64433.rs index 802e09c8a1..d900f8ed9b 100644 --- a/src/test/ui/async-await/issues/issue-64433.rs +++ b/src/test/ui/async-await/issues/issue-64433.rs @@ -23,7 +23,7 @@ impl B { async fn can_error(some_string: &str) -> Result<(), String> { let a = A { inner: vec![some_string, "foo"] }; let mut b = B {}; - Ok(b.something_with_a(a).await.map(|_| ())?) + Ok(b.something_with_a(a).await.map(drop)?) } fn main() { diff --git a/src/test/ui/async-await/issues/issue-65436-raw-ptr-not-send.rs b/src/test/ui/async-await/issues/issue-65436-raw-ptr-not-send.rs new file mode 100644 index 0000000000..3a814b4751 --- /dev/null +++ b/src/test/ui/async-await/issues/issue-65436-raw-ptr-not-send.rs @@ -0,0 +1,16 @@ +// edition:2018 + +struct Foo(*const u8); + +unsafe impl Send for Foo {} + +async fn bar(_: Foo) {} + +fn assert_send<T: Send>(_: T) {} + +fn main() { + assert_send(async { + //~^ ERROR future cannot be sent between threads safely + bar(Foo(std::ptr::null())).await; + }) +} diff --git a/src/test/ui/async-await/issues/issue-65436-raw-ptr-not-send.stderr b/src/test/ui/async-await/issues/issue-65436-raw-ptr-not-send.stderr new file mode 100644 index 0000000000..7638ba1fe7 --- /dev/null +++ b/src/test/ui/async-await/issues/issue-65436-raw-ptr-not-send.stderr @@ -0,0 +1,26 @@ +error: future cannot be sent between threads safely + --> $DIR/issue-65436-raw-ptr-not-send.rs:12:5 + | +LL | fn assert_send<T: Send>(_: T) {} + | ----------- ---- required by this bound in `assert_send` +... +LL | assert_send(async { + | ^^^^^^^^^^^ future returned by `main` is not `Send` + | + = help: within `impl std::future::Future`, the trait `std::marker::Send` is not implemented for `*const u8` +note: future is not `Send` as this value is used across an await + --> $DIR/issue-65436-raw-ptr-not-send.rs:14:9 + | +LL | bar(Foo(std::ptr::null())).await; + | ^^^^^^^^----------------^^^^^^^^- `std::ptr::null()` is later dropped here + | | | + | | has type `*const u8` + | await occurs here, with `std::ptr::null()` maybe used later +help: consider moving this into a `let` binding to create a shorter lived borrow + --> $DIR/issue-65436-raw-ptr-not-send.rs:14:13 + | +LL | bar(Foo(std::ptr::null())).await; + | ^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/async-await/multiple-lifetimes/ret-impl-trait-no-fg.rs b/src/test/ui/async-await/multiple-lifetimes/ret-impl-trait-no-fg.rs index 2c7a5cd378..b12d7bccec 100644 --- a/src/test/ui/async-await/multiple-lifetimes/ret-impl-trait-no-fg.rs +++ b/src/test/ui/async-await/multiple-lifetimes/ret-impl-trait-no-fg.rs @@ -8,6 +8,7 @@ impl<T> Trait<'_, '_> for T { } async fn async_ret_impl_trait<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a, 'b> { //~^ ERROR ambiguous lifetime bound + //~| ERROR ambiguous lifetime bound (a, b) } diff --git a/src/test/ui/async-await/multiple-lifetimes/ret-impl-trait-no-fg.stderr b/src/test/ui/async-await/multiple-lifetimes/ret-impl-trait-no-fg.stderr index 59d7728d41..f9a1b4b339 100644 --- a/src/test/ui/async-await/multiple-lifetimes/ret-impl-trait-no-fg.stderr +++ b/src/test/ui/async-await/multiple-lifetimes/ret-impl-trait-no-fg.stderr @@ -6,5 +6,13 @@ LL | async fn async_ret_impl_trait<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<' | = help: add #![feature(member_constraints)] to the crate attributes to enable -error: aborting due to previous error +error: ambiguous lifetime bound in `impl Trait` + --> $DIR/ret-impl-trait-no-fg.rs:9:64 + | +LL | async fn async_ret_impl_trait<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a, 'b> { + | ^^^^^^^^^^^^^^^^^^ neither `'a` nor `'b` outlives the other + | + = help: add #![feature(member_constraints)] to the crate attributes to enable + +error: aborting due to 2 previous errors diff --git a/src/test/ui/async-await/mutually-recursive-async-impl-trait-type.stderr b/src/test/ui/async-await/mutually-recursive-async-impl-trait-type.stderr index 9249308936..f6e4c8be29 100644 --- a/src/test/ui/async-await/mutually-recursive-async-impl-trait-type.stderr +++ b/src/test/ui/async-await/mutually-recursive-async-impl-trait-type.stderr @@ -4,7 +4,7 @@ error[E0733]: recursion in an `async fn` requires boxing LL | async fn rec_1() { | ^ recursive `async fn` | - = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future`. + = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future` error[E0733]: recursion in an `async fn` requires boxing --> $DIR/mutually-recursive-async-impl-trait-type.rs:9:18 @@ -12,7 +12,7 @@ error[E0733]: recursion in an `async fn` requires boxing LL | async fn rec_2() { | ^ recursive `async fn` | - = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future`. + = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future` error: aborting due to 2 previous errors diff --git a/src/test/ui/async-await/recursive-async-impl-trait-type.stderr b/src/test/ui/async-await/recursive-async-impl-trait-type.stderr index 9ee0140218..892d91e3a4 100644 --- a/src/test/ui/async-await/recursive-async-impl-trait-type.stderr +++ b/src/test/ui/async-await/recursive-async-impl-trait-type.stderr @@ -4,7 +4,7 @@ error[E0733]: recursion in an `async fn` requires boxing LL | async fn recursive_async_function() -> () { | ^^ recursive `async fn` | - = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future`. + = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future` error: aborting due to previous error diff --git a/src/test/ui/async-await/suggest-missing-await-closure.stderr b/src/test/ui/async-await/suggest-missing-await-closure.stderr index 1efc20082a..2703cec581 100644 --- a/src/test/ui/async-await/suggest-missing-await-closure.stderr +++ b/src/test/ui/async-await/suggest-missing-await-closure.stderr @@ -1,6 +1,9 @@ error[E0308]: mismatched types --> $DIR/suggest-missing-await-closure.rs:16:18 | +LL | async fn make_u32() -> u32 { + | --- the `Output` of this `async fn`'s found opaque type +... LL | take_u32(x) | ^ | | diff --git a/src/test/ui/async-await/suggest-missing-await.stderr b/src/test/ui/async-await/suggest-missing-await.stderr index 7ab024434b..6ac05a87aa 100644 --- a/src/test/ui/async-await/suggest-missing-await.stderr +++ b/src/test/ui/async-await/suggest-missing-await.stderr @@ -1,6 +1,9 @@ error[E0308]: mismatched types --> $DIR/suggest-missing-await.rs:13:14 | +LL | async fn make_u32() -> u32 { + | --- the `Output` of this `async fn`'s found opaque type +... LL | take_u32(x) | ^ | | @@ -13,6 +16,9 @@ LL | take_u32(x) error[E0308]: mismatched types --> $DIR/suggest-missing-await.rs:23:5 | +LL | async fn dummy() {} + | - the `Output` of this `async fn`'s found opaque type +... LL | dummy() | ^^^^^^^ expected `()`, found opaque type | diff --git a/src/test/ui/async-await/unresolved_type_param.rs b/src/test/ui/async-await/unresolved_type_param.rs index 79c043b701..d313691b38 100644 --- a/src/test/ui/async-await/unresolved_type_param.rs +++ b/src/test/ui/async-await/unresolved_type_param.rs @@ -8,8 +8,16 @@ async fn bar<T>() -> () {} async fn foo() { bar().await; //~^ ERROR type inside `async fn` body must be known in this context + //~| ERROR type inside `async fn` body must be known in this context + //~| ERROR type inside `async fn` body must be known in this context //~| NOTE cannot infer type for type parameter `T` + //~| NOTE cannot infer type for type parameter `T` + //~| NOTE cannot infer type for type parameter `T` + //~| NOTE the type is part of the `async fn` body because of this `await` //~| NOTE the type is part of the `async fn` body because of this `await` + //~| NOTE the type is part of the `async fn` body because of this `await` + //~| NOTE in this expansion of desugaring of `await` + //~| NOTE in this expansion of desugaring of `await` //~| NOTE in this expansion of desugaring of `await` } fn main() {} diff --git a/src/test/ui/async-await/unresolved_type_param.stderr b/src/test/ui/async-await/unresolved_type_param.stderr index b9b4f5133b..6b9e960ca1 100644 --- a/src/test/ui/async-await/unresolved_type_param.stderr +++ b/src/test/ui/async-await/unresolved_type_param.stderr @@ -2,7 +2,7 @@ error[E0698]: type inside `async fn` body must be known in this context --> $DIR/unresolved_type_param.rs:9:5 | LL | bar().await; - | ^^^ cannot infer type for type parameter `T` + | ^^^ cannot infer type for type parameter `T` declared on the function `bar` | note: the type is part of the `async fn` body because of this `await` --> $DIR/unresolved_type_param.rs:9:5 @@ -10,6 +10,30 @@ note: the type is part of the `async fn` body because of this `await` LL | bar().await; | ^^^^^^^^^^^ -error: aborting due to previous error +error[E0698]: type inside `async fn` body must be known in this context + --> $DIR/unresolved_type_param.rs:9:5 + | +LL | bar().await; + | ^^^ cannot infer type for type parameter `T` declared on the function `bar` + | +note: the type is part of the `async fn` body because of this `await` + --> $DIR/unresolved_type_param.rs:9:5 + | +LL | bar().await; + | ^^^^^^^^^^^ + +error[E0698]: type inside `async fn` body must be known in this context + --> $DIR/unresolved_type_param.rs:9:5 + | +LL | bar().await; + | ^^^ cannot infer type for type parameter `T` declared on the function `bar` + | +note: the type is part of the `async fn` body because of this `await` + --> $DIR/unresolved_type_param.rs:9:5 + | +LL | bar().await; + | ^^^^^^^^^^^ + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0698`. diff --git a/src/test/ui/attr-shebang.rs b/src/test/ui/attr-shebang.rs index cce31c9bb7..3b0dc096f5 100644 --- a/src/test/ui/attr-shebang.rs +++ b/src/test/ui/attr-shebang.rs @@ -3,4 +3,3 @@ #![allow(stable_features)] #![feature(rust1)] pub fn main() { } -// ignore-license diff --git a/src/test/ui/attributes/register-attr-tool-import.rs b/src/test/ui/attributes/register-attr-tool-import.rs index 3d0cf9154f..e01dc4dfa4 100644 --- a/src/test/ui/attributes/register-attr-tool-import.rs +++ b/src/test/ui/attributes/register-attr-tool-import.rs @@ -11,4 +11,5 @@ use tool as renamed_tool; // OK #[renamed_attr] //~ ERROR cannot use an explicitly registered attribute through an import #[renamed_tool::attr] //~ ERROR cannot use a tool module through an import + //~| ERROR cannot use a tool module through an import fn main() {} diff --git a/src/test/ui/attributes/register-attr-tool-import.stderr b/src/test/ui/attributes/register-attr-tool-import.stderr index 6f280c8e0d..59f5a8620a 100644 --- a/src/test/ui/attributes/register-attr-tool-import.stderr +++ b/src/test/ui/attributes/register-attr-tool-import.stderr @@ -22,5 +22,17 @@ note: the tool module imported here LL | use tool as renamed_tool; // OK | ^^^^^^^^^^^^^^^^^^^^ -error: aborting due to 2 previous errors +error: cannot use a tool module through an import + --> $DIR/register-attr-tool-import.rs:13:3 + | +LL | #[renamed_tool::attr] + | ^^^^^^^^^^^^ + | +note: the tool module imported here + --> $DIR/register-attr-tool-import.rs:10:5 + | +LL | use tool as renamed_tool; // OK + | ^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 3 previous errors diff --git a/src/test/ui/auto-ref-slice-plus-ref.stderr b/src/test/ui/auto-ref-slice-plus-ref.stderr index 3e36f2402a..a0739a7a90 100644 --- a/src/test/ui/auto-ref-slice-plus-ref.stderr +++ b/src/test/ui/auto-ref-slice-plus-ref.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `test_mut` found for type `std::vec::Vec<{integer}>` in the current scope +error[E0599]: no method named `test_mut` found for struct `std::vec::Vec<{integer}>` in the current scope --> $DIR/auto-ref-slice-plus-ref.rs:7:7 | LL | a.test_mut(); @@ -8,7 +8,7 @@ LL | a.test_mut(); = note: the following trait defines an item `test_mut`, perhaps you need to implement it: candidate #1: `MyIter` -error[E0599]: no method named `test` found for type `std::vec::Vec<{integer}>` in the current scope +error[E0599]: no method named `test` found for struct `std::vec::Vec<{integer}>` in the current scope --> $DIR/auto-ref-slice-plus-ref.rs:8:7 | LL | a.test(); @@ -18,7 +18,7 @@ LL | a.test(); = note: the following trait defines an item `test`, perhaps you need to implement it: candidate #1: `MyIter` -error[E0599]: no method named `test` found for type `[{integer}; 1]` in the current scope +error[E0599]: no method named `test` found for array `[{integer}; 1]` in the current scope --> $DIR/auto-ref-slice-plus-ref.rs:10:11 | LL | ([1]).test(); @@ -28,7 +28,7 @@ LL | ([1]).test(); = note: the following trait defines an item `test`, perhaps you need to implement it: candidate #1: `MyIter` -error[E0599]: no method named `test` found for type `&[{integer}; 1]` in the current scope +error[E0599]: no method named `test` found for reference `&[{integer}; 1]` in the current scope --> $DIR/auto-ref-slice-plus-ref.rs:11:12 | LL | (&[1]).test(); diff --git a/src/test/ui/autoderef-full-lval.rs b/src/test/ui/autoderef-full-lval.rs index db09d036ad..4bef1012e3 100644 --- a/src/test/ui/autoderef-full-lval.rs +++ b/src/test/ui/autoderef-full-lval.rs @@ -13,13 +13,13 @@ fn main() { let a: Clam = Clam{x: box 1, y: box 2}; let b: Clam = Clam{x: box 10, y: box 20}; let z: isize = a.x + b.y; - //~^ ERROR binary operation `+` cannot be applied to type `std::boxed::Box<isize>` + //~^ ERROR cannot add `std::boxed::Box<isize>` to `std::boxed::Box<isize>` println!("{}", z); assert_eq!(z, 21); let forty: Fish = Fish{a: box 40}; let two: Fish = Fish{a: box 2}; let answer: isize = forty.a + two.a; - //~^ ERROR binary operation `+` cannot be applied to type `std::boxed::Box<isize>` + //~^ ERROR cannot add `std::boxed::Box<isize>` to `std::boxed::Box<isize>` println!("{}", answer); assert_eq!(answer, 42); } diff --git a/src/test/ui/autoderef-full-lval.stderr b/src/test/ui/autoderef-full-lval.stderr index c9f3e8b2e2..e2870ef806 100644 --- a/src/test/ui/autoderef-full-lval.stderr +++ b/src/test/ui/autoderef-full-lval.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `std::boxed::Box<isize>` +error[E0369]: cannot add `std::boxed::Box<isize>` to `std::boxed::Box<isize>` --> $DIR/autoderef-full-lval.rs:15:24 | LL | let z: isize = a.x + b.y; @@ -8,7 +8,7 @@ LL | let z: isize = a.x + b.y; | = note: an implementation of `std::ops::Add` might be missing for `std::boxed::Box<isize>` -error[E0369]: binary operation `+` cannot be applied to type `std::boxed::Box<isize>` +error[E0369]: cannot add `std::boxed::Box<isize>` to `std::boxed::Box<isize>` --> $DIR/autoderef-full-lval.rs:21:33 | LL | let answer: isize = forty.a + two.a; diff --git a/src/test/ui/auxiliary/cdylib-dep.rs b/src/test/ui/auxiliary/cdylib-dep.rs deleted file mode 100644 index 8bd2b3353b..0000000000 --- a/src/test/ui/auxiliary/cdylib-dep.rs +++ /dev/null @@ -1 +0,0 @@ -#![crate_type = "dylib"] diff --git a/src/test/ui/auxiliary/stability-cfg2.rs b/src/test/ui/auxiliary/stability-cfg2.rs index 8a2899584b..c995038e5a 100644 --- a/src/test/ui/auxiliary/stability-cfg2.rs +++ b/src/test/ui/auxiliary/stability-cfg2.rs @@ -1,5 +1,5 @@ // compile-flags:--cfg foo -#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "0"))] +#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "none"))] #![cfg_attr(not(foo), stable(feature = "test_feature", since = "1.0.0"))] #![feature(staged_api)] diff --git a/src/test/ui/bad/bad-expr-lhs.rs b/src/test/ui/bad/bad-expr-lhs.rs index 2cd8bc9d47..d7cf1b7700 100644 --- a/src/test/ui/bad/bad-expr-lhs.rs +++ b/src/test/ui/bad/bad-expr-lhs.rs @@ -1,10 +1,10 @@ fn main() { - 1 = 2; //~ ERROR invalid left-hand side expression - 1 += 2; //~ ERROR invalid left-hand side expression - (1, 2) = (3, 4); //~ ERROR invalid left-hand side expression + 1 = 2; //~ ERROR invalid left-hand side of assignment + 1 += 2; //~ ERROR invalid left-hand side of assignment + (1, 2) = (3, 4); //~ ERROR invalid left-hand side of assignment let (a, b) = (1, 2); - (a, b) = (3, 4); //~ ERROR invalid left-hand side expression + (a, b) = (3, 4); //~ ERROR invalid left-hand side of assignment - None = Some(3); //~ ERROR invalid left-hand side expression + None = Some(3); //~ ERROR invalid left-hand side of assignment } diff --git a/src/test/ui/bad/bad-expr-lhs.stderr b/src/test/ui/bad/bad-expr-lhs.stderr index a0de6a7379..a195e1054d 100644 --- a/src/test/ui/bad/bad-expr-lhs.stderr +++ b/src/test/ui/bad/bad-expr-lhs.stderr @@ -1,32 +1,45 @@ -error[E0070]: invalid left-hand side expression - --> $DIR/bad-expr-lhs.rs:2:5 +error[E0070]: invalid left-hand side of assignment + --> $DIR/bad-expr-lhs.rs:2:7 | LL | 1 = 2; - | ^^^^^ left-hand of expression not valid + | - ^ + | | + | cannot assign to this expression -error[E0067]: invalid left-hand side expression - --> $DIR/bad-expr-lhs.rs:3:5 +error[E0067]: invalid left-hand side of assignment + --> $DIR/bad-expr-lhs.rs:3:7 | LL | 1 += 2; - | ^ invalid expression for left-hand side + | - ^^ + | | + | cannot assign to this expression -error[E0070]: invalid left-hand side expression - --> $DIR/bad-expr-lhs.rs:4:5 +error[E0070]: invalid left-hand side of assignment + --> $DIR/bad-expr-lhs.rs:4:12 | LL | (1, 2) = (3, 4); - | ^^^^^^^^^^^^^^^ left-hand of expression not valid + | ------ ^ + | | + | cannot assign to this expression -error[E0070]: invalid left-hand side expression - --> $DIR/bad-expr-lhs.rs:7:5 +error[E0070]: invalid left-hand side of assignment + --> $DIR/bad-expr-lhs.rs:7:12 | LL | (a, b) = (3, 4); - | ^^^^^^^^^^^^^^^ left-hand of expression not valid + | ------ ^ + | | + | cannot assign to this expression + | + = note: destructuring assignments are not currently supported + = note: for more information, see https://github.com/rust-lang/rfcs/issues/372 -error[E0070]: invalid left-hand side expression - --> $DIR/bad-expr-lhs.rs:9:5 +error[E0070]: invalid left-hand side of assignment + --> $DIR/bad-expr-lhs.rs:9:10 | LL | None = Some(3); - | ^^^^^^^^^^^^^^ left-hand of expression not valid + | ---- ^ + | | + | cannot assign to this expression error: aborting due to 5 previous errors diff --git a/src/test/ui/bad/bad-expr-path.rs b/src/test/ui/bad/bad-expr-path.rs index 99ba93253d..31fc9cf2cb 100644 --- a/src/test/ui/bad/bad-expr-path.rs +++ b/src/test/ui/bad/bad-expr-path.rs @@ -1,6 +1,6 @@ mod m1 {} -fn main(arguments: Vec<String>) { //~ ERROR main function has wrong type +fn main(arguments: Vec<String>) { //~ ERROR `main` function has wrong type log(debug, m1::arguments); //~^ ERROR cannot find function `log` in this scope //~| ERROR cannot find value `debug` in this scope diff --git a/src/test/ui/bad/bad-expr-path.stderr b/src/test/ui/bad/bad-expr-path.stderr index faba9911f8..56bb6e2be8 100644 --- a/src/test/ui/bad/bad-expr-path.stderr +++ b/src/test/ui/bad/bad-expr-path.stderr @@ -16,7 +16,7 @@ error[E0425]: cannot find value `arguments` in module `m1` LL | log(debug, m1::arguments); | ^^^^^^^^^ not found in `m1` -error[E0580]: main function has wrong type +error[E0580]: `main` function has wrong type --> $DIR/bad-expr-path.rs:3:1 | LL | fn main(arguments: Vec<String>) { diff --git a/src/test/ui/bad/bad-expr-path2.rs b/src/test/ui/bad/bad-expr-path2.rs index 43bd290804..eb88edb907 100644 --- a/src/test/ui/bad/bad-expr-path2.rs +++ b/src/test/ui/bad/bad-expr-path2.rs @@ -2,7 +2,7 @@ mod m1 { pub mod arguments {} } -fn main(arguments: Vec<String>) { //~ ERROR main function has wrong type +fn main(arguments: Vec<String>) { //~ ERROR `main` function has wrong type log(debug, m1::arguments); //~^ ERROR cannot find function `log` in this scope //~| ERROR cannot find value `debug` in this scope diff --git a/src/test/ui/bad/bad-expr-path2.stderr b/src/test/ui/bad/bad-expr-path2.stderr index 53b6d35e8f..e217c45b26 100644 --- a/src/test/ui/bad/bad-expr-path2.stderr +++ b/src/test/ui/bad/bad-expr-path2.stderr @@ -16,7 +16,7 @@ error[E0423]: expected value, found module `m1::arguments` LL | log(debug, m1::arguments); | ^^^^^^^^^^^^^ not a value -error[E0580]: main function has wrong type +error[E0580]: `main` function has wrong type --> $DIR/bad-expr-path2.rs:5:1 | LL | fn main(arguments: Vec<String>) { diff --git a/src/test/ui/bad/bad-intrinsic-monomorphization.rs b/src/test/ui/bad/bad-intrinsic-monomorphization.rs index a29723f34b..f36a5f1acc 100644 --- a/src/test/ui/bad/bad-intrinsic-monomorphization.rs +++ b/src/test/ui/bad/bad-intrinsic-monomorphization.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(repr_simd, platform_intrinsics, core_intrinsics)] #![allow(warnings)] #![crate_type = "rlib"] diff --git a/src/test/ui/bad/bad-intrinsic-monomorphization.stderr b/src/test/ui/bad/bad-intrinsic-monomorphization.stderr index dee33f574d..c070f01818 100644 --- a/src/test/ui/bad/bad-intrinsic-monomorphization.stderr +++ b/src/test/ui/bad/bad-intrinsic-monomorphization.stderr @@ -1,17 +1,17 @@ error[E0511]: invalid monomorphization of `cttz` intrinsic: expected basic integer type, found `Foo` - --> $DIR/bad-intrinsic-monomorphization.rs:18:5 + --> $DIR/bad-intrinsic-monomorphization.rs:20:5 | LL | intrinsics::cttz(v) | ^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `fadd_fast` intrinsic: expected basic float type, found `Foo` - --> $DIR/bad-intrinsic-monomorphization.rs:23:5 + --> $DIR/bad-intrinsic-monomorphization.rs:25:5 | LL | intrinsics::fadd_fast(a, b) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_add` intrinsic: expected SIMD input type, found non-SIMD `Foo` - --> $DIR/bad-intrinsic-monomorphization.rs:28:5 + --> $DIR/bad-intrinsic-monomorphization.rs:30:5 | LL | simd_add(a, b) | ^^^^^^^^^^^^^^ diff --git a/src/test/ui/bad/bad-main.rs b/src/test/ui/bad/bad-main.rs index c9e2f02f07..7511599614 100644 --- a/src/test/ui/bad/bad-main.rs +++ b/src/test/ui/bad/bad-main.rs @@ -1 +1 @@ -fn main(x: isize) { } //~ ERROR: main function has wrong type [E0580] +fn main(x: isize) { } //~ ERROR: `main` function has wrong type [E0580] diff --git a/src/test/ui/bad/bad-main.stderr b/src/test/ui/bad/bad-main.stderr index 1e57c2488e..675b66d057 100644 --- a/src/test/ui/bad/bad-main.stderr +++ b/src/test/ui/bad/bad-main.stderr @@ -1,4 +1,4 @@ -error[E0580]: main function has wrong type +error[E0580]: `main` function has wrong type --> $DIR/bad-main.rs:1:1 | LL | fn main(x: isize) { } diff --git a/src/test/ui/binary-op-on-double-ref.rs b/src/test/ui/binary-op-on-double-ref.rs index 6490cc7fe5..67e01b9327 100644 --- a/src/test/ui/binary-op-on-double-ref.rs +++ b/src/test/ui/binary-op-on-double-ref.rs @@ -2,7 +2,7 @@ fn main() { let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; let vr = v.iter().filter(|x| { x % 2 == 0 - //~^ ERROR binary operation `%` cannot be applied to type `&&{integer}` + //~^ ERROR cannot mod `&&{integer}` by `{integer}` }); println!("{:?}", vr); } diff --git a/src/test/ui/binary-op-on-double-ref.stderr b/src/test/ui/binary-op-on-double-ref.stderr index d036f06a8c..6c405333ec 100644 --- a/src/test/ui/binary-op-on-double-ref.stderr +++ b/src/test/ui/binary-op-on-double-ref.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `%` cannot be applied to type `&&{integer}` +error[E0369]: cannot mod `&&{integer}` by `{integer}` --> $DIR/binary-op-on-double-ref.rs:4:11 | LL | x % 2 == 0 diff --git a/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-2.stderr b/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-2.stderr index 9157fe0b07..ff00aa8caa 100644 --- a/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-2.stderr +++ b/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-2.stderr @@ -4,7 +4,7 @@ error[E0009]: cannot bind by-move and by-ref in the same pattern LL | Some((ref _y, _z)) => { }, | ------ ^^ by-move pattern here | | - | both by-ref and by-move used + | by-ref pattern here error: aborting due to previous error diff --git a/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-3.stderr b/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-3.stderr index d53547178d..3e8358da35 100644 --- a/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-3.stderr +++ b/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-3.stderr @@ -4,7 +4,7 @@ error[E0009]: cannot bind by-move and by-ref in the same pattern LL | DoubleOption::Some2(ref _y, _z) => { }, | ------ ^^ by-move pattern here | | - | both by-ref and by-move used + | by-ref pattern here error: aborting due to previous error diff --git a/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-4.stderr b/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-4.stderr index 267a9dff92..00e0c70d64 100644 --- a/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-4.stderr +++ b/src/test/ui/bind-by-move/bind-by-move-neither-can-live-while-the-other-survives-4.stderr @@ -2,7 +2,7 @@ error[E0009]: cannot bind by-move and by-ref in the same pattern --> $DIR/bind-by-move-neither-can-live-while-the-other-survives-4.rs:12:15 | LL | Some((_y, ref _z)) => { }, - | ^^ ------ both by-ref and by-move used + | ^^ ------ by-ref pattern here | | | by-move pattern here diff --git a/src/test/ui/binding/empty-types-in-patterns.rs b/src/test/ui/binding/empty-types-in-patterns.rs index 4271ffb7b1..0d0dbcaf40 100644 --- a/src/test/ui/binding/empty-types-in-patterns.rs +++ b/src/test/ui/binding/empty-types-in-patterns.rs @@ -1,7 +1,8 @@ // run-pass + #![feature(never_type, never_type_fallback)] #![feature(exhaustive_patterns)] -#![feature(slice_patterns)] + #![allow(unreachable_patterns)] #![allow(unreachable_code)] #![allow(unused_variables)] diff --git a/src/test/ui/binding/irrefutable-slice-patterns.rs b/src/test/ui/binding/irrefutable-slice-patterns.rs index ac733ef6e9..048e1e5e9b 100644 --- a/src/test/ui/binding/irrefutable-slice-patterns.rs +++ b/src/test/ui/binding/irrefutable-slice-patterns.rs @@ -1,7 +1,6 @@ // run-pass -// #47096 -#![feature(slice_patterns)] +// Regression test for #47096. fn foo(s: &[i32]) -> &[i32] { let &[ref xs @ ..] = s; diff --git a/src/test/ui/binding/match-byte-array-patterns.rs b/src/test/ui/binding/match-byte-array-patterns.rs index e87745705d..f0c988c01c 100644 --- a/src/test/ui/binding/match-byte-array-patterns.rs +++ b/src/test/ui/binding/match-byte-array-patterns.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(slice_patterns)] fn main() { let buf = &[0u8; 4]; diff --git a/src/test/ui/binding/match-vec-alternatives.rs b/src/test/ui/binding/match-vec-alternatives.rs index 9b06a86a7b..af95eb95df 100644 --- a/src/test/ui/binding/match-vec-alternatives.rs +++ b/src/test/ui/binding/match-vec-alternatives.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(slice_patterns)] fn match_vecs<'a, T>(l1: &'a [T], l2: &'a [T]) -> &'static str { match (l1, l2) { diff --git a/src/test/ui/binding/zero_sized_subslice_match.rs b/src/test/ui/binding/zero_sized_subslice_match.rs index 5326fa612a..187c298363 100644 --- a/src/test/ui/binding/zero_sized_subslice_match.rs +++ b/src/test/ui/binding/zero_sized_subslice_match.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(slice_patterns)] fn main() { let x = [(), ()]; diff --git a/src/test/ui/binop/binop-bitxor-str.rs b/src/test/ui/binop/binop-bitxor-str.rs index 6021c344df..e98ea4df97 100644 --- a/src/test/ui/binop/binop-bitxor-str.rs +++ b/src/test/ui/binop/binop-bitxor-str.rs @@ -1,3 +1,3 @@ -// error-pattern:`^` cannot be applied to type `std::string::String` +// error-pattern:no implementation for `std::string::String ^ std::string::String` fn main() { let x = "a".to_string() ^ "b".to_string(); } diff --git a/src/test/ui/binop/binop-bitxor-str.stderr b/src/test/ui/binop/binop-bitxor-str.stderr index 9e8992235e..9a0d301d86 100644 --- a/src/test/ui/binop/binop-bitxor-str.stderr +++ b/src/test/ui/binop/binop-bitxor-str.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `^` cannot be applied to type `std::string::String` +error[E0369]: no implementation for `std::string::String ^ std::string::String` --> $DIR/binop-bitxor-str.rs:3:37 | LL | fn main() { let x = "a".to_string() ^ "b".to_string(); } diff --git a/src/test/ui/binop/binop-mul-bool.rs b/src/test/ui/binop/binop-mul-bool.rs index 3d5349ba88..27b2f8bb3f 100644 --- a/src/test/ui/binop/binop-mul-bool.rs +++ b/src/test/ui/binop/binop-mul-bool.rs @@ -1,3 +1,3 @@ -// error-pattern:`*` cannot be applied to type `bool` +// error-pattern:cannot multiply `bool` to `bool` fn main() { let x = true * false; } diff --git a/src/test/ui/binop/binop-mul-bool.stderr b/src/test/ui/binop/binop-mul-bool.stderr index 92e14bcccc..ade2202558 100644 --- a/src/test/ui/binop/binop-mul-bool.stderr +++ b/src/test/ui/binop/binop-mul-bool.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `*` cannot be applied to type `bool` +error[E0369]: cannot multiply `bool` to `bool` --> $DIR/binop-mul-bool.rs:3:26 | LL | fn main() { let x = true * false; } diff --git a/src/test/ui/binop/binop-typeck.rs b/src/test/ui/binop/binop-typeck.rs index e1185cfba2..812fe95db4 100644 --- a/src/test/ui/binop/binop-typeck.rs +++ b/src/test/ui/binop/binop-typeck.rs @@ -4,5 +4,5 @@ fn main() { let x = true; let y = 1; let z = x + y; - //~^ ERROR binary operation `+` cannot be applied to type `bool` + //~^ ERROR cannot add `{integer}` to `bool` } diff --git a/src/test/ui/binop/binop-typeck.stderr b/src/test/ui/binop/binop-typeck.stderr index d33cff313e..ebf82079ef 100644 --- a/src/test/ui/binop/binop-typeck.stderr +++ b/src/test/ui/binop/binop-typeck.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `bool` +error[E0369]: cannot add `{integer}` to `bool` --> $DIR/binop-typeck.rs:6:15 | LL | let z = x + y; diff --git a/src/test/ui/block-result/issue-13624.stderr b/src/test/ui/block-result/issue-13624.stderr index 90ffb4b2e5..416f055251 100644 --- a/src/test/ui/block-result/issue-13624.stderr +++ b/src/test/ui/block-result/issue-13624.stderr @@ -10,7 +10,7 @@ error[E0308]: mismatched types --> $DIR/issue-13624.rs:20:9 | LL | match enum_struct_variant { - | ------------------- this match expression has type `()` + | ------------------- this expression has type `()` LL | a::Enum::EnumStructVariant { x, y, z } => { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found enum `a::Enum` diff --git a/src/test/ui/block-result/issue-3563.rs b/src/test/ui/block-result/issue-3563.rs index 9b313d3e9b..0b652a1f54 100644 --- a/src/test/ui/block-result/issue-3563.rs +++ b/src/test/ui/block-result/issue-3563.rs @@ -1,7 +1,7 @@ trait A { fn a(&self) { || self.b() - //~^ ERROR no method named `b` found for type `&Self` in the current scope + //~^ ERROR no method named `b` found } } fn main() {} diff --git a/src/test/ui/block-result/issue-3563.stderr b/src/test/ui/block-result/issue-3563.stderr index 237b8c54ce..be551f6e88 100644 --- a/src/test/ui/block-result/issue-3563.stderr +++ b/src/test/ui/block-result/issue-3563.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `b` found for type `&Self` in the current scope +error[E0599]: no method named `b` found for reference `&Self` in the current scope --> $DIR/issue-3563.rs:3:17 | LL | || self.b() diff --git a/src/test/ui/bogus-tag.stderr b/src/test/ui/bogus-tag.stderr index 890f6800c2..cb3199e7c8 100644 --- a/src/test/ui/bogus-tag.stderr +++ b/src/test/ui/bogus-tag.stderr @@ -1,4 +1,4 @@ -error[E0599]: no variant or associated item named `Hsl` found for type `Color` in the current scope +error[E0599]: no variant or associated item named `Hsl` found for enum `Color` in the current scope --> $DIR/bogus-tag.rs:7:16 | LL | enum Color { Rgb(isize, isize, isize), Rgba(isize, isize, isize, isize), } diff --git a/src/test/ui/borrowck/borrow-raw-address-of-borrowed.rs b/src/test/ui/borrowck/borrow-raw-address-of-borrowed.rs new file mode 100644 index 0000000000..f25fd7f66b --- /dev/null +++ b/src/test/ui/borrowck/borrow-raw-address-of-borrowed.rs @@ -0,0 +1,22 @@ +#![feature(raw_ref_op)] + +fn address_of_shared() { + let mut x = 0; + let y = &x; + + let q = &raw mut x; //~ ERROR cannot borrow + + drop(y); +} + +fn address_of_mutably_borrowed() { + let mut x = 0; + let y = &mut x; + + let p = &raw const x; //~ ERROR cannot borrow + let q = &raw mut x; //~ ERROR cannot borrow + + drop(y); +} + +fn main() {} diff --git a/src/test/ui/borrowck/borrow-raw-address-of-borrowed.stderr b/src/test/ui/borrowck/borrow-raw-address-of-borrowed.stderr new file mode 100644 index 0000000000..ff461b748b --- /dev/null +++ b/src/test/ui/borrowck/borrow-raw-address-of-borrowed.stderr @@ -0,0 +1,40 @@ +error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable + --> $DIR/borrow-raw-address-of-borrowed.rs:7:13 + | +LL | let y = &x; + | -- immutable borrow occurs here +LL | +LL | let q = &raw mut x; + | ^^^^^^^^^^ mutable borrow occurs here +LL | +LL | drop(y); + | - immutable borrow later used here + +error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable + --> $DIR/borrow-raw-address-of-borrowed.rs:16:13 + | +LL | let y = &mut x; + | ------ mutable borrow occurs here +LL | +LL | let p = &raw const x; + | ^^^^^^^^^^^^ immutable borrow occurs here +... +LL | drop(y); + | - mutable borrow later used here + +error[E0499]: cannot borrow `x` as mutable more than once at a time + --> $DIR/borrow-raw-address-of-borrowed.rs:17:13 + | +LL | let y = &mut x; + | ------ first mutable borrow occurs here +... +LL | let q = &raw mut x; + | ^^^^^^^^^^ second mutable borrow occurs here +LL | +LL | drop(y); + | - first borrow later used here + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0499, E0502. +For more information about an error, try `rustc --explain E0499`. diff --git a/src/test/ui/borrowck/borrow-raw-address-of-deref-mutability-ok.rs b/src/test/ui/borrowck/borrow-raw-address-of-deref-mutability-ok.rs new file mode 100644 index 0000000000..e381384fe6 --- /dev/null +++ b/src/test/ui/borrowck/borrow-raw-address-of-deref-mutability-ok.rs @@ -0,0 +1,23 @@ +// check-pass + +#![feature(raw_ref_op)] + +fn raw_reborrow() { + let x = &0; + let y = &mut 0; + + let p = &raw const *x; + let r = &raw const *y; + let s = &raw mut *y; +} + +unsafe fn raw_reborrow_of_raw() { + let x = &0 as *const i32; + let y = &mut 0 as *mut i32; + + let p = &raw const *x; + let r = &raw const *y; + let s = &raw mut *y; +} + +fn main() {} diff --git a/src/test/ui/borrowck/borrow-raw-address-of-deref-mutability.rs b/src/test/ui/borrowck/borrow-raw-address-of-deref-mutability.rs new file mode 100644 index 0000000000..712873528b --- /dev/null +++ b/src/test/ui/borrowck/borrow-raw-address-of-deref-mutability.rs @@ -0,0 +1,17 @@ +// Check that `&raw mut` cannot be used to turn a `&T` into a `*mut T`. + +#![feature(raw_ref_op)] + +fn raw_reborrow() { + let x = &0; + + let q = &raw mut *x; //~ ERROR cannot borrow +} + +unsafe fn raw_reborrow_of_raw() { + let x = &0 as *const i32; + + let q = &raw mut *x; //~ ERROR cannot borrow +} + +fn main() {} diff --git a/src/test/ui/borrowck/borrow-raw-address-of-deref-mutability.stderr b/src/test/ui/borrowck/borrow-raw-address-of-deref-mutability.stderr new file mode 100644 index 0000000000..31af38507c --- /dev/null +++ b/src/test/ui/borrowck/borrow-raw-address-of-deref-mutability.stderr @@ -0,0 +1,21 @@ +error[E0596]: cannot borrow `*x` as mutable, as it is behind a `&` reference + --> $DIR/borrow-raw-address-of-deref-mutability.rs:8:13 + | +LL | let x = &0; + | -- help: consider changing this to be a mutable reference: `&mut 0` +LL | +LL | let q = &raw mut *x; + | ^^^^^^^^^^^ `x` is a `&` reference, so the data it refers to cannot be borrowed as mutable + +error[E0596]: cannot borrow `*x` as mutable, as it is behind a `*const` pointer + --> $DIR/borrow-raw-address-of-deref-mutability.rs:14:13 + | +LL | let x = &0 as *const i32; + | -- help: consider changing this to be a mutable pointer: `&mut 0` +LL | +LL | let q = &raw mut *x; + | ^^^^^^^^^^^ `x` is a `*const` pointer, so the data it refers to cannot be borrowed as mutable + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0596`. diff --git a/src/test/ui/borrowck/borrow-raw-address-of-mutability-ok.rs b/src/test/ui/borrowck/borrow-raw-address-of-mutability-ok.rs new file mode 100644 index 0000000000..e1cf2dc538 --- /dev/null +++ b/src/test/ui/borrowck/borrow-raw-address-of-mutability-ok.rs @@ -0,0 +1,44 @@ +// check-pass + +#![feature(raw_ref_op)] + +fn mutable_address_of() { + let mut x = 0; + let y = &raw mut x; +} + +fn mutable_address_of_closure() { + let mut x = 0; + let mut f = || { + let y = &raw mut x; + }; + f(); +} + +fn const_address_of_closure() { + let x = 0; + let f = || { + let y = &raw const x; + }; + f(); +} + +fn make_fn<F: Fn()>(f: F) -> F { f } + +fn const_address_of_fn_closure() { + let x = 0; + let f = make_fn(|| { + let y = &raw const x; + }); + f(); +} + +fn const_address_of_fn_closure_move() { + let x = 0; + let f = make_fn(move || { + let y = &raw const x; + }); + f(); +} + +fn main() {} diff --git a/src/test/ui/borrowck/borrow-raw-address-of-mutability.rs b/src/test/ui/borrowck/borrow-raw-address-of-mutability.rs new file mode 100644 index 0000000000..320c54b806 --- /dev/null +++ b/src/test/ui/borrowck/borrow-raw-address-of-mutability.rs @@ -0,0 +1,42 @@ +#![feature(raw_ref_op)] + +fn mutable_address_of() { + let x = 0; + let y = &raw mut x; //~ ERROR cannot borrow +} + +fn mutable_address_of_closure() { + let x = 0; + let mut f = || { + let y = &raw mut x; //~ ERROR cannot borrow + }; + f(); +} + +fn mutable_address_of_imm_closure() { + let mut x = 0; + let f = || { + let y = &raw mut x; + }; + f(); //~ ERROR cannot borrow +} + +fn make_fn<F: Fn()>(f: F) -> F { f } + +fn mutable_address_of_fn_closure() { + let mut x = 0; + let f = make_fn(|| { + let y = &raw mut x; //~ ERROR cannot borrow + }); + f(); +} + +fn mutable_address_of_fn_closure_move() { + let mut x = 0; + let f = make_fn(move || { + let y = &raw mut x; //~ ERROR cannot borrow + }); + f(); +} + +fn main() {} diff --git a/src/test/ui/borrowck/borrow-raw-address-of-mutability.stderr b/src/test/ui/borrowck/borrow-raw-address-of-mutability.stderr new file mode 100644 index 0000000000..cf01c362d5 --- /dev/null +++ b/src/test/ui/borrowck/borrow-raw-address-of-mutability.stderr @@ -0,0 +1,59 @@ +error[E0596]: cannot borrow `x` as mutable, as it is not declared as mutable + --> $DIR/borrow-raw-address-of-mutability.rs:5:13 + | +LL | let x = 0; + | - help: consider changing this to be mutable: `mut x` +LL | let y = &raw mut x; + | ^^^^^^^^^^ cannot borrow as mutable + +error[E0596]: cannot borrow `x` as mutable, as it is not declared as mutable + --> $DIR/borrow-raw-address-of-mutability.rs:11:17 + | +LL | let x = 0; + | - help: consider changing this to be mutable: `mut x` +LL | let mut f = || { +LL | let y = &raw mut x; + | ^^^^^^^^^^ cannot borrow as mutable + +error[E0596]: cannot borrow `f` as mutable, as it is not declared as mutable + --> $DIR/borrow-raw-address-of-mutability.rs:21:5 + | +LL | let f = || { + | - help: consider changing this to be mutable: `mut f` +... +LL | f(); + | ^ cannot borrow as mutable + +error[E0596]: cannot borrow `x` as mutable, as it is a captured variable in a `Fn` closure + --> $DIR/borrow-raw-address-of-mutability.rs:29:17 + | +LL | let y = &raw mut x; + | ^^^^^^^^^^ cannot borrow as mutable + | +help: consider changing this to accept closures that implement `FnMut` + --> $DIR/borrow-raw-address-of-mutability.rs:28:21 + | +LL | let f = make_fn(|| { + | _____________________^ +LL | | let y = &raw mut x; +LL | | }); + | |_____^ + +error[E0596]: cannot borrow `x` as mutable, as it is a captured variable in a `Fn` closure + --> $DIR/borrow-raw-address-of-mutability.rs:37:17 + | +LL | let y = &raw mut x; + | ^^^^^^^^^^ cannot borrow as mutable + | +help: consider changing this to accept closures that implement `FnMut` + --> $DIR/borrow-raw-address-of-mutability.rs:36:21 + | +LL | let f = make_fn(move || { + | _____________________^ +LL | | let y = &raw mut x; +LL | | }); + | |_____^ + +error: aborting due to 5 previous errors + +For more information about this error, try `rustc --explain E0596`. diff --git a/src/test/ui/borrowck/borrowck-closures-slice-patterns-ok.rs b/src/test/ui/borrowck/borrowck-closures-slice-patterns-ok.rs new file mode 100644 index 0000000000..0229ca37a6 --- /dev/null +++ b/src/test/ui/borrowck/borrowck-closures-slice-patterns-ok.rs @@ -0,0 +1,117 @@ +// Check that closure captures for slice patterns are inferred correctly + +#![allow(unused_variables)] + +// run-pass + +fn arr_by_ref(x: [String; 3]) { + let r = &x; + let f = || { + let [ref y, ref z @ ..] = x; + }; + f(); + f(); + // Ensure `x` was borrowed + drop(r); + // Ensure that `x` wasn't moved from. + drop(x); +} + +fn arr_by_mut(mut x: [String; 3]) { + let mut f = || { + let [ref mut y, ref mut z @ ..] = x; + }; + f(); + f(); + drop(x); +} + +fn arr_by_move(x: [String; 3]) { + let f = || { + let [y, z @ ..] = x; + }; + f(); +} + +fn arr_ref_by_ref(x: &[String; 3]) { + let r = &x; + let f = || { + let [ref y, ref z @ ..] = *x; + }; + let g = || { + let [y, z @ ..] = x; + }; + f(); + g(); + f(); + g(); + drop(r); + drop(x); +} + +fn arr_ref_by_mut(x: &mut [String; 3]) { + let mut f = || { + let [ref mut y, ref mut z @ ..] = *x; + }; + f(); + f(); + let mut g = || { + let [y, z @ ..] = x; + // Ensure binding mode was chosen correctly: + std::mem::swap(y, &mut z[0]); + }; + g(); + g(); + drop(x); +} + +fn arr_box_by_move(x: Box<[String; 3]>) { + let f = || { + let [y, z @ ..] = *x; + }; + f(); +} + +fn slice_by_ref(x: &[String]) { + let r = &x; + let f = || { + if let [ref y, ref z @ ..] = *x {} + }; + let g = || { + if let [y, z @ ..] = x {} + }; + f(); + g(); + f(); + g(); + drop(r); + drop(x); +} + +fn slice_by_mut(x: &mut [String]) { + let mut f = || { + if let [ref mut y, ref mut z @ ..] = *x {} + }; + f(); + f(); + let mut g = || { + if let [y, z @ ..] = x { + // Ensure binding mode was chosen correctly: + std::mem::swap(y, &mut z[0]); + } + }; + g(); + g(); + drop(x); +} + +fn main() { + arr_by_ref(Default::default()); + arr_by_mut(Default::default()); + arr_by_move(Default::default()); + arr_ref_by_ref(&Default::default()); + arr_ref_by_mut(&mut Default::default()); + arr_box_by_move(Default::default()); + slice_by_ref(&<[_; 3]>::default()); + slice_by_mut(&mut <[_; 3]>::default()); +} diff --git a/src/test/ui/borrowck/borrowck-closures-slice-patterns.rs b/src/test/ui/borrowck/borrowck-closures-slice-patterns.rs new file mode 100644 index 0000000000..32057d5c12 --- /dev/null +++ b/src/test/ui/borrowck/borrowck-closures-slice-patterns.rs @@ -0,0 +1,82 @@ +// Check that closure captures for slice patterns are inferred correctly + +fn arr_by_ref(mut x: [String; 3]) { + let f = || { + let [ref y, ref z @ ..] = x; + }; + let r = &mut x; + //~^ ERROR cannot borrow + f(); +} + +fn arr_by_mut(mut x: [String; 3]) { + let mut f = || { + let [ref mut y, ref mut z @ ..] = x; + }; + let r = &x; + //~^ ERROR cannot borrow + f(); +} + +fn arr_by_move(x: [String; 3]) { + let f = || { + let [y, z @ ..] = x; + }; + &x; + //~^ ERROR borrow of moved value +} + +fn arr_ref_by_ref(x: &mut [String; 3]) { + let f = || { + let [ref y, ref z @ ..] = *x; + }; + let r = &mut *x; + //~^ ERROR cannot borrow + f(); +} + +fn arr_ref_by_uniq(x: &mut [String; 3]) { + let mut f = || { + let [ref mut y, ref mut z @ ..] = *x; + }; + let r = &x; + //~^ ERROR cannot borrow + f(); +} + +fn arr_box_by_move(x: Box<[String; 3]>) { + let f = || { + let [y, z @ ..] = *x; + }; + &x; + //~^ ERROR borrow of moved value +} + +fn slice_by_ref(x: &mut [String]) { + let f = || { + if let [ref y, ref z @ ..] = *x {} + }; + let r = &mut *x; + //~^ ERROR cannot borrow + f(); +} + +fn slice_by_uniq(x: &mut [String]) { + let mut f = || { + if let [ref mut y, ref mut z @ ..] = *x {} + }; + let r = &x; + //~^ ERROR cannot borrow + f(); +} + +fn main() { + arr_by_ref(Default::default()); + arr_by_mut(Default::default()); + arr_by_move(Default::default()); + arr_ref_by_ref(&mut Default::default()); + arr_ref_by_uniq(&mut Default::default()); + arr_box_by_move(Default::default()); + slice_by_ref(&mut <[_; 3]>::default()); + slice_by_uniq(&mut <[_; 3]>::default()); +} diff --git a/src/test/ui/borrowck/borrowck-closures-slice-patterns.stderr b/src/test/ui/borrowck/borrowck-closures-slice-patterns.stderr new file mode 100644 index 0000000000..483975e577 --- /dev/null +++ b/src/test/ui/borrowck/borrowck-closures-slice-patterns.stderr @@ -0,0 +1,114 @@ +error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-closures-slice-patterns.rs:7:13 + | +LL | let f = || { + | -- immutable borrow occurs here +LL | let [ref y, ref z @ ..] = x; + | - first borrow occurs due to use of `x` in closure +LL | }; +LL | let r = &mut x; + | ^^^^^^ mutable borrow occurs here +LL | +LL | f(); + | - immutable borrow later used here + +error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-closures-slice-patterns.rs:16:13 + | +LL | let mut f = || { + | -- mutable borrow occurs here +LL | let [ref mut y, ref mut z @ ..] = x; + | - first borrow occurs due to use of `x` in closure +LL | }; +LL | let r = &x; + | ^^ immutable borrow occurs here +LL | +LL | f(); + | - mutable borrow later used here + +error[E0382]: borrow of moved value: `x` + --> $DIR/borrowck-closures-slice-patterns.rs:25:5 + | +LL | fn arr_by_move(x: [String; 3]) { + | - move occurs because `x` has type `[std::string::String; 3]`, which does not implement the `Copy` trait +LL | let f = || { + | -- value moved into closure here +LL | let [y, z @ ..] = x; + | - variable moved due to use in closure +LL | }; +LL | &x; + | ^^ value borrowed here after move + +error[E0502]: cannot borrow `*x` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-closures-slice-patterns.rs:33:13 + | +LL | let f = || { + | -- immutable borrow occurs here +LL | let [ref y, ref z @ ..] = *x; + | - first borrow occurs due to use of `x` in closure +LL | }; +LL | let r = &mut *x; + | ^^^^^^^ mutable borrow occurs here +LL | +LL | f(); + | - immutable borrow later used here + +error[E0501]: cannot borrow `x` as immutable because previous closure requires unique access + --> $DIR/borrowck-closures-slice-patterns.rs:42:13 + | +LL | let mut f = || { + | -- closure construction occurs here +LL | let [ref mut y, ref mut z @ ..] = *x; + | - first borrow occurs due to use of `x` in closure +LL | }; +LL | let r = &x; + | ^^ second borrow occurs here +LL | +LL | f(); + | - first borrow later used here + +error[E0382]: borrow of moved value: `x` + --> $DIR/borrowck-closures-slice-patterns.rs:51:5 + | +LL | fn arr_box_by_move(x: Box<[String; 3]>) { + | - move occurs because `x` has type `std::boxed::Box<[std::string::String; 3]>`, which does not implement the `Copy` trait +LL | let f = || { + | -- value moved into closure here +LL | let [y, z @ ..] = *x; + | - variable moved due to use in closure +LL | }; +LL | &x; + | ^^ value borrowed here after move + +error[E0502]: cannot borrow `*x` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-closures-slice-patterns.rs:59:13 + | +LL | let f = || { + | -- immutable borrow occurs here +LL | if let [ref y, ref z @ ..] = *x {} + | - first borrow occurs due to use of `x` in closure +LL | }; +LL | let r = &mut *x; + | ^^^^^^^ mutable borrow occurs here +LL | +LL | f(); + | - immutable borrow later used here + +error[E0501]: cannot borrow `x` as immutable because previous closure requires unique access + --> $DIR/borrowck-closures-slice-patterns.rs:68:13 + | +LL | let mut f = || { + | -- closure construction occurs here +LL | if let [ref mut y, ref mut z @ ..] = *x {} + | - first borrow occurs due to use of `x` in closure +LL | }; +LL | let r = &x; + | ^^ second borrow occurs here +LL | +LL | f(); + | - first borrow later used here + +error: aborting due to 8 previous errors + +Some errors have detailed explanations: E0382, E0501, E0502. +For more information about an error, try `rustc --explain E0382`. diff --git a/src/test/ui/borrowck/borrowck-describe-lvalue.rs b/src/test/ui/borrowck/borrowck-describe-lvalue.rs index 8425960aa8..c8bfbe0729 100644 --- a/src/test/ui/borrowck/borrowck-describe-lvalue.rs +++ b/src/test/ui/borrowck/borrowck-describe-lvalue.rs @@ -1,7 +1,5 @@ // ignore-tidy-linelength -#![feature(slice_patterns)] - pub struct Foo { x: u32 } diff --git a/src/test/ui/borrowck/borrowck-describe-lvalue.stderr b/src/test/ui/borrowck/borrowck-describe-lvalue.stderr index 4213523d2f..075e0e2e45 100644 --- a/src/test/ui/borrowck/borrowck-describe-lvalue.stderr +++ b/src/test/ui/borrowck/borrowck-describe-lvalue.stderr @@ -1,5 +1,5 @@ error[E0499]: cannot borrow `x` as mutable more than once at a time - --> $DIR/borrowck-describe-lvalue.rs:258:13 + --> $DIR/borrowck-describe-lvalue.rs:256:13 | LL | let y = &mut x; | ------ first mutable borrow occurs here @@ -9,7 +9,7 @@ LL | *y = 1; | ------ first borrow later used here error[E0499]: cannot borrow `x` as mutable more than once at a time - --> $DIR/borrowck-describe-lvalue.rs:268:20 + --> $DIR/borrowck-describe-lvalue.rs:266:20 | LL | let y = &mut x; | ------ first mutable borrow occurs here @@ -19,7 +19,7 @@ LL | *y = 1; | ------ first borrow later used here error: captured variable cannot escape `FnMut` closure body - --> $DIR/borrowck-describe-lvalue.rs:266:16 + --> $DIR/borrowck-describe-lvalue.rs:264:16 | LL | || { | - inferred to be a `FnMut` closure @@ -35,7 +35,7 @@ LL | | } = note: ...therefore, they cannot allow references to captured variables to escape error[E0503]: cannot use `f.x` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:41:9 + --> $DIR/borrowck-describe-lvalue.rs:39:9 | LL | let x = f.x(); | - borrow of `f` occurs here @@ -45,7 +45,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `g.0` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:48:9 + --> $DIR/borrowck-describe-lvalue.rs:46:9 | LL | let x = g.x(); | - borrow of `g` occurs here @@ -55,7 +55,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `h.0` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:55:9 + --> $DIR/borrowck-describe-lvalue.rs:53:9 | LL | let x = &mut h.0; | -------- borrow of `h.0` occurs here @@ -65,7 +65,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `e.0` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:63:20 + --> $DIR/borrowck-describe-lvalue.rs:61:20 | LL | let x = e.x(); | - borrow of `e` occurs here @@ -77,7 +77,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `u.a` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:71:9 + --> $DIR/borrowck-describe-lvalue.rs:69:9 | LL | let x = &mut u.a; | -------- borrow of `u.a` occurs here @@ -87,7 +87,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `f.x` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:78:9 + --> $DIR/borrowck-describe-lvalue.rs:76:9 | LL | let x = f.x(); | - borrow of `*f` occurs here @@ -97,7 +97,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `g.0` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:85:9 + --> $DIR/borrowck-describe-lvalue.rs:83:9 | LL | let x = g.x(); | - borrow of `*g` occurs here @@ -107,7 +107,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `h.0` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:92:9 + --> $DIR/borrowck-describe-lvalue.rs:90:9 | LL | let x = &mut h.0; | -------- borrow of `h.0` occurs here @@ -117,7 +117,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `e.0` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:100:20 + --> $DIR/borrowck-describe-lvalue.rs:98:20 | LL | let x = e.x(); | - borrow of `*e` occurs here @@ -129,7 +129,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `u.a` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:109:9 + --> $DIR/borrowck-describe-lvalue.rs:107:9 | LL | let x = &mut u.a; | -------- borrow of `u.a` occurs here @@ -139,7 +139,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `v[..]` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:117:15 + --> $DIR/borrowck-describe-lvalue.rs:115:15 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -151,7 +151,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `v[..]` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:122:18 + --> $DIR/borrowck-describe-lvalue.rs:120:18 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -163,7 +163,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `v[..]` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:127:25 + --> $DIR/borrowck-describe-lvalue.rs:125:25 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -175,7 +175,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `v[..]` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:132:28 + --> $DIR/borrowck-describe-lvalue.rs:130:28 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -187,7 +187,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `v[..]` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:143:15 + --> $DIR/borrowck-describe-lvalue.rs:141:15 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -199,7 +199,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `v[..]` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:148:18 + --> $DIR/borrowck-describe-lvalue.rs:146:18 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -211,7 +211,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `v[..]` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:153:15 + --> $DIR/borrowck-describe-lvalue.rs:151:15 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -223,7 +223,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `v[..]` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:158:18 + --> $DIR/borrowck-describe-lvalue.rs:156:18 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -235,7 +235,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `e` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:171:13 + --> $DIR/borrowck-describe-lvalue.rs:169:13 | LL | let x = &mut e; | ------ borrow of `e` occurs here @@ -247,7 +247,7 @@ LL | drop(x); | - borrow later used here error[E0502]: cannot borrow `e.0` as immutable because it is also borrowed as mutable - --> $DIR/borrowck-describe-lvalue.rs:171:18 + --> $DIR/borrowck-describe-lvalue.rs:169:18 | LL | let x = &mut e; | ------ mutable borrow occurs here @@ -259,7 +259,7 @@ LL | drop(x); | - mutable borrow later used here error[E0502]: cannot borrow `e.x` as immutable because it is also borrowed as mutable - --> $DIR/borrowck-describe-lvalue.rs:175:23 + --> $DIR/borrowck-describe-lvalue.rs:173:23 | LL | let x = &mut e; | ------ mutable borrow occurs here @@ -271,7 +271,7 @@ LL | drop(x); | - mutable borrow later used here error[E0502]: cannot borrow `s.y.0` as immutable because it is also borrowed as mutable - --> $DIR/borrowck-describe-lvalue.rs:188:22 + --> $DIR/borrowck-describe-lvalue.rs:186:22 | LL | let x = &mut s; | ------ mutable borrow occurs here @@ -283,7 +283,7 @@ LL | drop(x); | - mutable borrow later used here error[E0502]: cannot borrow `s.x.y` as immutable because it is also borrowed as mutable - --> $DIR/borrowck-describe-lvalue.rs:194:28 + --> $DIR/borrowck-describe-lvalue.rs:192:28 | LL | let x = &mut s; | ------ mutable borrow occurs here @@ -295,7 +295,7 @@ LL | drop(x); | - mutable borrow later used here error[E0503]: cannot use `*v` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:236:9 + --> $DIR/borrowck-describe-lvalue.rs:234:9 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -306,7 +306,7 @@ LL | drop(x); | - borrow later used here error[E0503]: cannot use `v[_].y` because it was mutably borrowed - --> $DIR/borrowck-describe-lvalue.rs:236:9 + --> $DIR/borrowck-describe-lvalue.rs:234:9 | LL | let x = &mut v; | ------ borrow of `v` occurs here @@ -317,7 +317,7 @@ LL | drop(x); | - borrow later used here error[E0502]: cannot borrow `v[..].x` as immutable because it is also borrowed as mutable - --> $DIR/borrowck-describe-lvalue.rs:247:24 + --> $DIR/borrowck-describe-lvalue.rs:245:24 | LL | let x = &mut v; | ------ mutable borrow occurs here @@ -329,7 +329,7 @@ LL | drop(x); | - mutable borrow later used here error[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable - --> $DIR/borrowck-describe-lvalue.rs:210:29 + --> $DIR/borrowck-describe-lvalue.rs:208:29 | LL | let x = &mut block; | ---------- mutable borrow occurs here @@ -340,7 +340,7 @@ LL | drop(x); | - mutable borrow later used here error[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable - --> $DIR/borrowck-describe-lvalue.rs:225:33 + --> $DIR/borrowck-describe-lvalue.rs:223:33 | LL | let x = &mut block; | ---------- mutable borrow occurs here @@ -351,7 +351,7 @@ LL | drop(x); | - mutable borrow later used here error[E0382]: use of moved value: `x` - --> $DIR/borrowck-describe-lvalue.rs:278:22 + --> $DIR/borrowck-describe-lvalue.rs:276:22 | LL | drop(x); | - value moved here diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-match.rs b/src/test/ui/borrowck/borrowck-move-out-from-array-match.rs new file mode 100644 index 0000000000..c1513fcba8 --- /dev/null +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-match.rs @@ -0,0 +1,116 @@ +fn array() -> [(String, String); 3] { + Default::default() +} + +// Const Index + Const Index + +fn move_out_from_begin_and_end() { + let a = array(); + match a { + [_, _, _x] => {} + } + match a { + [.., _y] => {} //~ ERROR use of moved value + } +} + +fn move_out_from_begin_field_and_end() { + let a = array(); + match a { + [_, _, (_x, _)] => {} + } + match a { + [.., _y] => {} //~ ERROR use of moved value + } +} + +fn move_out_from_begin_field_and_end_field() { + let a = array(); + match a { + [_, _, (_x, _)] => {} + } + match a { + [.., (_y, _)] => {} //~ ERROR use of moved value + } +} + +// Const Index + Slice + +fn move_out_by_const_index_and_subslice() { + let a = array(); + match a { + [_x, _, _] => {} + } + match a { + //~^ ERROR use of moved value + [_y @ .., _, _] => {} + } +} + +fn move_out_by_const_index_end_and_subslice() { + let a = array(); + match a { + [.., _x] => {} + } + match a { + //~^ ERROR use of moved value + [_, _, _y @ ..] => {} + } +} + +fn move_out_by_const_index_field_and_subslice() { + let a = array(); + match a { + [(_x, _), _, _] => {} + } + match a { + //~^ ERROR use of moved value + [_y @ .., _, _] => {} + } +} + +fn move_out_by_const_index_end_field_and_subslice() { + let a = array(); + match a { + [.., (_x, _)] => {} + } + match a { + //~^ ERROR use of moved value + [_, _, _y @ ..] => {} + } +} + +fn move_out_by_subslice_and_const_index_field() { + let a = array(); + match a { + [_y @ .., _, _] => {} + } + match a { + [(_x, _), _, _] => {} //~ ERROR use of moved value + } +} + +fn move_out_by_subslice_and_const_index_end_field() { + let a = array(); + match a { + [_, _, _y @ ..] => {} + } + match a { + [.., (_x, _)] => {} //~ ERROR use of moved value + } +} + +// Slice + Slice + +fn move_out_by_subslice_and_subslice() { + let a = array(); + match a { + [x @ .., _] => {} + } + match a { + //~^ ERROR use of moved value + [_, _y @ ..] => {} + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-match.stderr b/src/test/ui/borrowck/borrowck-move-out-from-array-match.stderr new file mode 100644 index 0000000000..84930b000c --- /dev/null +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-match.stderr @@ -0,0 +1,113 @@ +error[E0382]: use of moved value: `a[..]` + --> $DIR/borrowck-move-out-from-array-match.rs:13:14 + | +LL | [_, _, _x] => {} + | -- value moved here +... +LL | [.., _y] => {} + | ^^ value used here after move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a[..]` + --> $DIR/borrowck-move-out-from-array-match.rs:23:14 + | +LL | [_, _, (_x, _)] => {} + | -- value moved here +... +LL | [.., _y] => {} + | ^^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a[..].0` + --> $DIR/borrowck-move-out-from-array-match.rs:33:15 + | +LL | [_, _, (_x, _)] => {} + | -- value moved here +... +LL | [.., (_y, _)] => {} + | ^^ value used here after move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-match.rs:44:11 + | +LL | [_x, _, _] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-match.rs:55:11 + | +LL | [.., _x] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-match.rs:66:11 + | +LL | [(_x, _), _, _] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-match.rs:77:11 + | +LL | [.., (_x, _)] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a[..].0` + --> $DIR/borrowck-move-out-from-array-match.rs:89:11 + | +LL | [_y @ .., _, _] => {} + | ------- value moved here +... +LL | [(_x, _), _, _] => {} + | ^^ value used here after move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a[..].0` + --> $DIR/borrowck-move-out-from-array-match.rs:99:15 + | +LL | [_, _, _y @ ..] => {} + | ------- value moved here +... +LL | [.., (_x, _)] => {} + | ^^ value used here after move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-match.rs:110:11 + | +LL | [x @ .., _] => {} + | ------ value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error: aborting due to 10 previous errors + +For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap-match.rs b/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap-match.rs new file mode 100644 index 0000000000..056b8e672b --- /dev/null +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap-match.rs @@ -0,0 +1,115 @@ +// Due to #53114, which causes a "read" of the `_` patterns, +// the borrow-checker refuses this code, while it should probably be allowed. +// Once the bug is fixed, the test, which is derived from a +// passing test for `let` statements, should become check-pass. + +fn array() -> [(String, String); 3] { + Default::default() +} + +// Const Index + Const Index + +fn move_out_from_begin_and_one_from_end() { + let a = array(); + match a { + [_, _, _x] => {} + } + match a { + //~^ ERROR use of moved value + [.., _y, _] => {} + } +} + +fn move_out_from_begin_field_and_end_field() { + let a = array(); + match a { + [_, _, (_x, _)] => {} + } + match a { + //~^ ERROR use of moved value + [.., (_, _y)] => {} + } +} + +// Const Index + Slice + +fn move_out_by_const_index_and_subslice() { + let a = array(); + match a { + [_x, _, _] => {} + } + match a { + //~^ ERROR use of moved value + [_, _y @ ..] => {} + } +} + +fn move_out_by_const_index_end_and_subslice() { + let a = array(); + match a { + [.., _x] => {} + } + match a { + //~^ ERROR use of moved value + [_y @ .., _] => {} + } +} + +fn move_out_by_const_index_field_and_subslice() { + let a = array(); + match a { + [(_x, _), _, _] => {} + } + match a { + //~^ ERROR use of moved value + [_, _y @ ..] => {} + } +} + +fn move_out_by_const_index_end_field_and_subslice() { + let a = array(); + match a { + [.., (_x, _)] => {} + } + match a { + //~^ ERROR use of moved value + [_y @ .., _] => {} + } +} + +fn move_out_by_const_subslice_and_index_field() { + let a = array(); + match a { + [_, _y @ ..] => {} + } + match a { + //~^ ERROR use of moved value + [(_x, _), _, _] => {} + } +} + +fn move_out_by_const_subslice_and_end_index_field() { + let a = array(); + match a { + [_y @ .., _] => {} + } + match a { + //~^ ERROR use of moved value + [.., (_x, _)] => {} + } +} + +// Slice + Slice + +fn move_out_by_subslice_and_subslice() { + let a = array(); + match a { + [x @ .., _, _] => {} + } + match a { + //~^ ERROR use of moved value + [_, _y @ ..] => {} + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap-match.stderr b/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap-match.stderr new file mode 100644 index 0000000000..ff5eab2442 --- /dev/null +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap-match.stderr @@ -0,0 +1,102 @@ +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-no-overlap-match.rs:17:11 + | +LL | [_, _, _x] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-no-overlap-match.rs:28:11 + | +LL | [_, _, (_x, _)] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-no-overlap-match.rs:41:11 + | +LL | [_x, _, _] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-no-overlap-match.rs:52:11 + | +LL | [.., _x] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-no-overlap-match.rs:63:11 + | +LL | [(_x, _), _, _] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-no-overlap-match.rs:74:11 + | +LL | [.., (_x, _)] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-no-overlap-match.rs:85:11 + | +LL | [_, _y @ ..] => {} + | ------- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-no-overlap-match.rs:96:11 + | +LL | [_y @ .., _] => {} + | ------- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-no-overlap-match.rs:109:11 + | +LL | [x @ .., _, _] => {} + | ------ value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error: aborting due to 9 previous errors + +For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap.rs b/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap.rs index 8f274cf73c..c91b4286b6 100644 --- a/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap.rs +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-no-overlap.rs @@ -1,7 +1,5 @@ // check-pass -#![feature(slice_patterns)] - fn array() -> [(String, String); 3] { Default::default() } diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-use-match.rs b/src/test/ui/borrowck/borrowck-move-out-from-array-use-match.rs new file mode 100644 index 0000000000..604a25cdcc --- /dev/null +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-use-match.rs @@ -0,0 +1,150 @@ +fn array() -> [(String, String); 3] { + Default::default() +} + +// Const Index + Const Index + +fn move_out_from_begin_and_end() { + let a = array(); + match a { + [_, _, _x] => {} + } + match a { + [.., ref _y] => {} //~ ERROR [E0382] + } +} + +fn move_out_from_begin_field_and_end() { + let a = array(); + match a { + [_, _, (_x, _)] => {} + } + match a { + [.., ref _y] => {} //~ ERROR [E0382] + } +} + +fn move_out_from_begin_field_and_end_field() { + let a = array(); + match a { + [_, _, (_x, _)] => {} + } + match a { + [.., (ref _y, _)] => {} //~ ERROR [E0382] + } +} + +// Const Index + Slice + +fn move_out_by_const_index_and_subslice() { + let a = array(); + match a { + [_x, _, _] => {} + } + match a { + //~^ ERROR [E0382] + [ref _y @ .., _, _] => {} + } +} + +fn move_out_by_const_index_end_and_subslice() { + let a = array(); + match a { + [.., _x] => {} + } + match a { + //~^ ERROR [E0382] + [_, _, ref _y @ ..] => {} + } +} + +fn move_out_by_const_index_field_and_subslice() { + let a = array(); + match a { + [(_x, _), _, _] => {} + } + match a { + //~^ ERROR [E0382] + [ref _y @ .., _, _] => {} + } +} + +fn move_out_by_const_index_end_field_and_subslice() { + let a = array(); + match a { + [.., (_x, _)] => {} + } + match a { + //~^ ERROR [E0382] + [_, _, ref _y @ ..] => {} + } +} + +fn move_out_by_subslice_and_const_index_field() { + let a = array(); + match a { + [_y @ .., _, _] => {} + } + match a { + [(ref _x, _), _, _] => {} //~ ERROR [E0382] + } +} + +fn move_out_by_subslice_and_const_index_end_field() { + let a = array(); + match a { + [_, _, _y @ ..] => {} + } + match a { + [.., (ref _x, _)] => {} //~ ERROR [E0382] + } +} + +// Slice + Slice + +fn move_out_by_subslice_and_subslice() { + let a = array(); + match a { + [x @ .., _] => {} + } + match a { + //~^ ERROR [E0382] + [_, ref _y @ ..] => {} + } +} + +// Move + Assign + +fn move_out_and_assign_end() { + let mut a = array(); + match a { + [_, _, _x] => {} + } + a[2] = Default::default(); //~ ERROR [E0382] +} + +fn move_out_and_assign_end_field() { + let mut a = array(); + match a { + [_, _, (_x, _)] => {} + } + a[2].1 = Default::default(); //~ ERROR [E0382] +} + +fn move_out_slice_and_assign_end() { + let mut a = array(); + match a { + [_, _, _x @ ..] => {} + } + a[0] = Default::default(); //~ ERROR [E0382] +} + +fn move_out_slice_and_assign_end_field() { + let mut a = array(); + match a { + [_, _, _x @ ..] => {} + } + a[0].1 = Default::default(); //~ ERROR [E0382] +} + +fn main() {} diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-use-match.stderr b/src/test/ui/borrowck/borrowck-move-out-from-array-use-match.stderr new file mode 100644 index 0000000000..0ef63105cf --- /dev/null +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-use-match.stderr @@ -0,0 +1,157 @@ +error[E0382]: borrow of moved value: `a[..]` + --> $DIR/borrowck-move-out-from-array-use-match.rs:13:14 + | +LL | [_, _, _x] => {} + | -- value moved here +... +LL | [.., ref _y] => {} + | ^^^^^^ value borrowed here after move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: borrow of moved value: `a[..]` + --> $DIR/borrowck-move-out-from-array-use-match.rs:23:14 + | +LL | [_, _, (_x, _)] => {} + | -- value moved here +... +LL | [.., ref _y] => {} + | ^^^^^^ value borrowed here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: borrow of moved value: `a[..].0` + --> $DIR/borrowck-move-out-from-array-use-match.rs:33:15 + | +LL | [_, _, (_x, _)] => {} + | -- value moved here +... +LL | [.., (ref _y, _)] => {} + | ^^^^^^ value borrowed here after move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-match.rs:44:11 + | +LL | [_x, _, _] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-match.rs:55:11 + | +LL | [.., _x] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-match.rs:66:11 + | +LL | [(_x, _), _, _] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-match.rs:77:11 + | +LL | [.., (_x, _)] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: borrow of moved value: `a[..]` + --> $DIR/borrowck-move-out-from-array-use-match.rs:89:11 + | +LL | [_y @ .., _, _] => {} + | ------- value moved here +... +LL | [(ref _x, _), _, _] => {} + | ^^^^^^ value borrowed here after move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: borrow of moved value: `a[..]` + --> $DIR/borrowck-move-out-from-array-use-match.rs:99:15 + | +LL | [_, _, _y @ ..] => {} + | ------- value moved here +... +LL | [.., (ref _x, _)] => {} + | ^^^^^^ value borrowed here after move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-match.rs:110:11 + | +LL | [x @ .., _] => {} + | ------ value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-match.rs:123:5 + | +LL | [_, _, _x] => {} + | -- value moved here +LL | } +LL | a[2] = Default::default(); + | ^^^^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-match.rs:131:5 + | +LL | [_, _, (_x, _)] => {} + | -- value moved here +LL | } +LL | a[2].1 = Default::default(); + | ^^^^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-match.rs:139:5 + | +LL | [_, _, _x @ ..] => {} + | ------- value moved here +LL | } +LL | a[0] = Default::default(); + | ^^^^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-match.rs:147:5 + | +LL | [_, _, _x @ ..] => {} + | ------- value moved here +LL | } +LL | a[0].1 = Default::default(); + | ^^^^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error: aborting due to 14 previous errors + +For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap-match.rs b/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap-match.rs new file mode 100644 index 0000000000..5afd6835dc --- /dev/null +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap-match.rs @@ -0,0 +1,115 @@ +// Due to #53114, which causes a "read" of the `_` patterns, +// the borrow-checker refuses this code, while it should probably be allowed. +// Once the bug is fixed, the test, which is derived from a +// passing test for `let` statements, should become check-pass. + +fn array() -> [(String, String); 3] { + Default::default() +} + +// Const Index + Const Index + +fn move_out_from_begin_and_one_from_end() { + let a = array(); + match a { + [_, _, _x] => {} + } + match a { + //~^ ERROR use of moved value + [.., ref _y, _] => {} + } +} + +fn move_out_from_begin_field_and_end_field() { + let a = array(); + match a { + [_, _, (_x, _)] => {} + } + match a { + //~^ ERROR use of moved value + [.., (_, ref _y)] => {} + } +} + +// Const Index + Slice + +fn move_out_by_const_index_and_subslice() { + let a = array(); + match a { + [_x, _, _] => {} + } + match a { + //~^ ERROR use of moved value + [_, ref _y @ ..] => {} + } +} + +fn move_out_by_const_index_end_and_subslice() { + let a = array(); + match a { + [.., _x] => {} + } + match a { + //~^ ERROR use of moved value + [ref _y @ .., _] => {} + } +} + +fn move_out_by_const_index_field_and_subslice() { + let a = array(); + match a { + [(_x, _), _, _] => {} + } + match a { + //~^ ERROR use of moved value + [_, ref _y @ ..] => {} + } +} + +fn move_out_by_const_index_end_field_and_subslice() { + let a = array(); + match a { + [.., (_x, _)] => {} + } + match a { + //~^ ERROR use of moved value + [ref _y @ .., _] => {} + } +} + +fn move_out_by_const_subslice_and_index_field() { + let a = array(); + match a { + [_, _y @ ..] => {} + } + match a { + //~^ ERROR use of moved value + [(ref _x, _), _, _] => {} + } +} + +fn move_out_by_const_subslice_and_end_index_field() { + let a = array(); + match a { + [_y @ .., _] => {} + } + match a { + //~^ ERROR use of moved value + [.., (ref _x, _)] => {} + } +} + +// Slice + Slice + +fn move_out_by_subslice_and_subslice() { + let a = array(); + match a { + [x @ .., _, _] => {} + } + match a { + //~^ ERROR use of moved value + [_, ref _y @ ..] => {} + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap-match.stderr b/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap-match.stderr new file mode 100644 index 0000000000..a4042ce7db --- /dev/null +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap-match.stderr @@ -0,0 +1,102 @@ +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-no-overlap-match.rs:17:11 + | +LL | [_, _, _x] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-no-overlap-match.rs:28:11 + | +LL | [_, _, (_x, _)] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-no-overlap-match.rs:41:11 + | +LL | [_x, _, _] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-no-overlap-match.rs:52:11 + | +LL | [.., _x] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-no-overlap-match.rs:63:11 + | +LL | [(_x, _), _, _] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-no-overlap-match.rs:74:11 + | +LL | [.., (_x, _)] => {} + | -- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-no-overlap-match.rs:85:11 + | +LL | [_, _y @ ..] => {} + | ------- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-no-overlap-match.rs:96:11 + | +LL | [_y @ .., _] => {} + | ------- value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `a` + --> $DIR/borrowck-move-out-from-array-use-no-overlap-match.rs:109:11 + | +LL | [x @ .., _, _] => {} + | ------ value moved here +LL | } +LL | match a { + | ^ value used here after partial move + | + = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait + +error: aborting due to 9 previous errors + +For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap.rs b/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap.rs index 57ce241757..e3498cef37 100644 --- a/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap.rs +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-use-no-overlap.rs @@ -1,7 +1,5 @@ // check-pass -#![feature(slice_patterns)] - fn array() -> [(String, String); 3] { Default::default() } diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-use.rs b/src/test/ui/borrowck/borrowck-move-out-from-array-use.rs index 778beefbf2..ad08367a3b 100644 --- a/src/test/ui/borrowck/borrowck-move-out-from-array-use.rs +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-use.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn array() -> [(String, String); 3] { Default::default() } diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array-use.stderr b/src/test/ui/borrowck/borrowck-move-out-from-array-use.stderr index 2a7b89132c..7ad4116645 100644 --- a/src/test/ui/borrowck/borrowck-move-out-from-array-use.stderr +++ b/src/test/ui/borrowck/borrowck-move-out-from-array-use.stderr @@ -1,5 +1,5 @@ error[E0382]: borrow of moved value: `a[..]` - --> $DIR/borrowck-move-out-from-array-use.rs:12:14 + --> $DIR/borrowck-move-out-from-array-use.rs:10:14 | LL | let [_, _, _x] = a; | -- value moved here @@ -9,7 +9,7 @@ LL | let [.., ref _y] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `a[..]` - --> $DIR/borrowck-move-out-from-array-use.rs:18:14 + --> $DIR/borrowck-move-out-from-array-use.rs:16:14 | LL | let [_, _, (_x, _)] = a; | -- value moved here @@ -19,7 +19,7 @@ LL | let [.., ref _y] = a; = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `a[..].0` - --> $DIR/borrowck-move-out-from-array-use.rs:24:15 + --> $DIR/borrowck-move-out-from-array-use.rs:22:15 | LL | let [_, _, (_x, _)] = a; | -- value moved here @@ -29,7 +29,7 @@ LL | let [.., (ref _y, _)] = a; = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `a` - --> $DIR/borrowck-move-out-from-array-use.rs:32:10 + --> $DIR/borrowck-move-out-from-array-use.rs:30:10 | LL | let [_x, _, _] = a; | -- value moved here @@ -39,7 +39,7 @@ LL | let [ref _y @ .., _, _] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `a` - --> $DIR/borrowck-move-out-from-array-use.rs:38:16 + --> $DIR/borrowck-move-out-from-array-use.rs:36:16 | LL | let [.., _x] = a; | -- value moved here @@ -49,7 +49,7 @@ LL | let [_, _, ref _y @ ..] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `a` - --> $DIR/borrowck-move-out-from-array-use.rs:44:10 + --> $DIR/borrowck-move-out-from-array-use.rs:42:10 | LL | let [(_x, _), _, _] = a; | -- value moved here @@ -59,7 +59,7 @@ LL | let [ref _y @ .., _, _] = a; = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `a` - --> $DIR/borrowck-move-out-from-array-use.rs:50:16 + --> $DIR/borrowck-move-out-from-array-use.rs:48:16 | LL | let [.., (_x, _)] = a; | -- value moved here @@ -69,7 +69,7 @@ LL | let [_, _, ref _y @ ..] = a; = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `a[..]` - --> $DIR/borrowck-move-out-from-array-use.rs:56:11 + --> $DIR/borrowck-move-out-from-array-use.rs:54:11 | LL | let [_y @ .., _, _] = a; | ------- value moved here @@ -79,7 +79,7 @@ LL | let [(ref _x, _), _, _] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `a[..]` - --> $DIR/borrowck-move-out-from-array-use.rs:62:15 + --> $DIR/borrowck-move-out-from-array-use.rs:60:15 | LL | let [_, _, _y @ ..] = a; | ------- value moved here @@ -89,7 +89,7 @@ LL | let [.., (ref _x, _)] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `a` - --> $DIR/borrowck-move-out-from-array-use.rs:70:13 + --> $DIR/borrowck-move-out-from-array-use.rs:68:13 | LL | let [x @ .., _] = a; | ------ value moved here @@ -99,7 +99,7 @@ LL | let [_, ref _y @ ..] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a` - --> $DIR/borrowck-move-out-from-array-use.rs:78:5 + --> $DIR/borrowck-move-out-from-array-use.rs:76:5 | LL | let [_, _, _x] = a; | -- value moved here @@ -109,7 +109,7 @@ LL | a[2] = Default::default(); = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a` - --> $DIR/borrowck-move-out-from-array-use.rs:84:5 + --> $DIR/borrowck-move-out-from-array-use.rs:82:5 | LL | let [_, _, (_x, _)] = a; | -- value moved here @@ -119,7 +119,7 @@ LL | a[2].1 = Default::default(); = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a` - --> $DIR/borrowck-move-out-from-array-use.rs:90:5 + --> $DIR/borrowck-move-out-from-array-use.rs:88:5 | LL | let [_, _, _x @ ..] = a; | ------- value moved here @@ -129,7 +129,7 @@ LL | a[0] = Default::default(); = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a` - --> $DIR/borrowck-move-out-from-array-use.rs:96:5 + --> $DIR/borrowck-move-out-from-array-use.rs:94:5 | LL | let [_, _, _x @ ..] = a; | ------- value moved here diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array.rs b/src/test/ui/borrowck/borrowck-move-out-from-array.rs index f9d3f6f2c0..83755812f4 100644 --- a/src/test/ui/borrowck/borrowck-move-out-from-array.rs +++ b/src/test/ui/borrowck/borrowck-move-out-from-array.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn array() -> [(String, String); 3] { Default::default() } diff --git a/src/test/ui/borrowck/borrowck-move-out-from-array.stderr b/src/test/ui/borrowck/borrowck-move-out-from-array.stderr index 08134a2a32..b7babd93ed 100644 --- a/src/test/ui/borrowck/borrowck-move-out-from-array.stderr +++ b/src/test/ui/borrowck/borrowck-move-out-from-array.stderr @@ -1,5 +1,5 @@ error[E0382]: use of moved value: `a[..]` - --> $DIR/borrowck-move-out-from-array.rs:12:14 + --> $DIR/borrowck-move-out-from-array.rs:10:14 | LL | let [_, _, _x] = a; | -- value moved here @@ -9,7 +9,7 @@ LL | let [.., _y] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a[..]` - --> $DIR/borrowck-move-out-from-array.rs:18:14 + --> $DIR/borrowck-move-out-from-array.rs:16:14 | LL | let [_, _, (_x, _)] = a; | -- value moved here @@ -19,7 +19,7 @@ LL | let [.., _y] = a; = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a[..].0` - --> $DIR/borrowck-move-out-from-array.rs:24:15 + --> $DIR/borrowck-move-out-from-array.rs:22:15 | LL | let [_, _, (_x, _)] = a; | -- value moved here @@ -29,7 +29,7 @@ LL | let [.., (_y, _)] = a; = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a` - --> $DIR/borrowck-move-out-from-array.rs:32:10 + --> $DIR/borrowck-move-out-from-array.rs:30:10 | LL | let [_x, _, _] = a; | -- value moved here @@ -39,7 +39,7 @@ LL | let [_y @ .., _, _] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a` - --> $DIR/borrowck-move-out-from-array.rs:38:16 + --> $DIR/borrowck-move-out-from-array.rs:36:16 | LL | let [.., _x] = a; | -- value moved here @@ -49,7 +49,7 @@ LL | let [_, _, _y @ ..] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a` - --> $DIR/borrowck-move-out-from-array.rs:44:10 + --> $DIR/borrowck-move-out-from-array.rs:42:10 | LL | let [(_x, _), _, _] = a; | -- value moved here @@ -59,7 +59,7 @@ LL | let [_y @ .., _, _] = a; = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a` - --> $DIR/borrowck-move-out-from-array.rs:50:16 + --> $DIR/borrowck-move-out-from-array.rs:48:16 | LL | let [.., (_x, _)] = a; | -- value moved here @@ -69,7 +69,7 @@ LL | let [_, _, _y @ ..] = a; = note: move occurs because `a[..].0` has type `std::string::String`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a[..].0` - --> $DIR/borrowck-move-out-from-array.rs:56:11 + --> $DIR/borrowck-move-out-from-array.rs:54:11 | LL | let [_y @ .., _, _] = a; | ------- value moved here @@ -79,7 +79,7 @@ LL | let [(_x, _), _, _] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a[..].0` - --> $DIR/borrowck-move-out-from-array.rs:62:15 + --> $DIR/borrowck-move-out-from-array.rs:60:15 | LL | let [_, _, _y @ ..] = a; | ------- value moved here @@ -89,7 +89,7 @@ LL | let [.., (_x, _)] = a; = note: move occurs because `a[..]` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait error[E0382]: use of moved value: `a` - --> $DIR/borrowck-move-out-from-array.rs:70:13 + --> $DIR/borrowck-move-out-from-array.rs:68:13 | LL | let [x @ .., _] = a; | ------ value moved here diff --git a/src/test/ui/borrowck/borrowck-move-out-of-vec-tail.rs b/src/test/ui/borrowck/borrowck-move-out-of-vec-tail.rs index fa9a3c217d..8ece81a3c8 100644 --- a/src/test/ui/borrowck/borrowck-move-out-of-vec-tail.rs +++ b/src/test/ui/borrowck/borrowck-move-out-of-vec-tail.rs @@ -1,7 +1,5 @@ // Test that we do not permit moves from &[] matched by a vec pattern. -#![feature(slice_patterns)] - #[derive(Clone, Debug)] struct Foo { string: String diff --git a/src/test/ui/borrowck/borrowck-move-out-of-vec-tail.stderr b/src/test/ui/borrowck/borrowck-move-out-of-vec-tail.stderr index 8fb4c062c0..a345c1238f 100644 --- a/src/test/ui/borrowck/borrowck-move-out-of-vec-tail.stderr +++ b/src/test/ui/borrowck/borrowck-move-out-of-vec-tail.stderr @@ -1,5 +1,5 @@ error[E0508]: cannot move out of type `[Foo]`, a non-copy slice - --> $DIR/borrowck-move-out-of-vec-tail.rs:19:19 + --> $DIR/borrowck-move-out-of-vec-tail.rs:17:19 | LL | match tail { | ^^^^ cannot move out of here diff --git a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array-no-overlap.rs b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array-no-overlap.rs index 7d91a21264..a8e56f648e 100644 --- a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array-no-overlap.rs +++ b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array-no-overlap.rs @@ -1,7 +1,5 @@ // check-pass -#![feature(slice_patterns)] - fn nop(_s: &[& i32]) {} fn nop_subslice(_s: &[i32]) {} diff --git a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array.rs b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array.rs index f03a2ab8fa..6b210d7322 100644 --- a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array.rs +++ b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn nop(_s: &[& i32]) {} fn nop_subslice(_s: &[i32]) {} diff --git a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array.stderr b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array.stderr index e50e7eb3e2..0432aaf51d 100644 --- a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array.stderr +++ b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-array.stderr @@ -1,5 +1,5 @@ error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-array.rs:8:13 + --> $DIR/borrowck-slice-pattern-element-loan-array.rs:6:13 | LL | let [ref first, ref second, ..] = *s; | ---------- immutable borrow occurs here @@ -9,7 +9,7 @@ LL | nop(&[first, second, second2, third]); | ------ immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-array.rs:14:14 + --> $DIR/borrowck-slice-pattern-element-loan-array.rs:12:14 | LL | let [.., ref fourth, ref third, _, ref first] = *s; | --------- immutable borrow occurs here @@ -19,7 +19,7 @@ LL | nop(&[first, third, third2, fourth]); | ----- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-array.rs:21:16 + --> $DIR/borrowck-slice-pattern-element-loan-array.rs:19:16 | LL | let [.., _, ref from_end4, ref from_end3, _, ref from_end1] = *s; | ------------- immutable borrow occurs here @@ -30,7 +30,7 @@ LL | nop(&[from_begin2, from_end1, from_end3, from_end4]); | --------- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-array.rs:23:19 + --> $DIR/borrowck-slice-pattern-element-loan-array.rs:21:19 | LL | let [.., _, ref from_end4, ref from_end3, _, ref from_end1] = *s; | ------------- immutable borrow occurs here @@ -41,7 +41,7 @@ LL | nop(&[from_begin3, from_end1, from_end3, from_end4]); | --------- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-array.rs:28:14 + --> $DIR/borrowck-slice-pattern-element-loan-array.rs:26:14 | LL | let [ref from_begin0, ref from_begin1, _, ref from_begin3, _, ..] = *s; | --------------- immutable borrow occurs here @@ -52,7 +52,7 @@ LL | nop(&[from_begin0, from_begin1, from_begin3, from_end3]); | ----------- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-array.rs:34:13 + --> $DIR/borrowck-slice-pattern-element-loan-array.rs:32:13 | LL | let [ref first, ref second, ..] = *s; | ---------- immutable borrow occurs here @@ -62,7 +62,7 @@ LL | nop(&[first, second]); | ------ immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-array.rs:41:10 + --> $DIR/borrowck-slice-pattern-element-loan-array.rs:39:10 | LL | let [.., ref second, ref first] = *s; | ---------- immutable borrow occurs here @@ -72,7 +72,7 @@ LL | nop(&[first, second]); | ------ immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-array.rs:48:10 + --> $DIR/borrowck-slice-pattern-element-loan-array.rs:46:10 | LL | let [_, ref s1 @ ..] = *s; | ----------- immutable borrow occurs here diff --git a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-rpass.rs b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-rpass.rs index 048813b2b9..4367596c6e 100644 --- a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-rpass.rs +++ b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-rpass.rs @@ -1,7 +1,4 @@ // run-pass -//compile-flags: -Z borrowck=mir - -#![feature(slice_patterns)] fn mut_head_tail<'a, A>(v: &'a mut [A]) -> Option<(&'a mut A, &'a mut [A])> { match *v { diff --git a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice-no-overlap.rs b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice-no-overlap.rs index e69071f877..6390dc3a91 100644 --- a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice-no-overlap.rs +++ b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice-no-overlap.rs @@ -1,7 +1,5 @@ // check-pass -#![feature(slice_patterns)] - fn nop(_s: &[& i32]) {} fn nop_subslice(_s: &[i32]) {} diff --git a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice.rs b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice.rs index 2ef98741dc..0e1c90a1cd 100644 --- a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice.rs +++ b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn nop(_s: &[& i32]) {} fn nop_subslice(_s: &[i32]) {} diff --git a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice.stderr b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice.stderr index b6f5ac64b2..d3388e071a 100644 --- a/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice.stderr +++ b/src/test/ui/borrowck/borrowck-slice-pattern-element-loan-slice.stderr @@ -1,5 +1,5 @@ error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:8:20 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:6:20 | LL | if let [ref first, ref second, ..] = *s { | ---------- immutable borrow occurs here @@ -9,7 +9,7 @@ LL | nop(&[first, second, second2, third]); | ------ immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:16:21 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:14:21 | LL | if let [.., ref fourth, ref third, _, ref first] = *s { | --------- immutable borrow occurs here @@ -19,7 +19,7 @@ LL | nop(&[first, third, third2, fourth]); | ----- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:24:20 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:22:20 | LL | if let [.., _, ref from_end4, ref from_end3, _, ref from_end1] = *s { | ------------- immutable borrow occurs here @@ -29,7 +29,7 @@ LL | nop(&[from_begin1, from_end1, from_end3, from_end4]); | --------- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:27:23 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:25:23 | LL | if let [.., _, ref from_end4, ref from_end3, _, ref from_end1] = *s { | ------------- immutable borrow occurs here @@ -40,7 +40,7 @@ LL | nop(&[from_begin2, from_end1, from_end3, from_end4]); | --------- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:30:26 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:28:26 | LL | if let [.., _, ref from_end4, ref from_end3, _, ref from_end1] = *s { | ------------- immutable borrow occurs here @@ -51,7 +51,7 @@ LL | nop(&[from_begin3, from_end1, from_end3, from_end4]); | --------- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:35:21 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:33:21 | LL | if let [ref from_begin0, ref from_begin1, _, ref from_begin3, _, ..] = *s { | --------------- immutable borrow occurs here @@ -61,7 +61,7 @@ LL | nop(&[from_begin0, from_begin1, from_begin3, from_end2]); | ----------- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:38:21 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:36:21 | LL | if let [ref from_begin0, ref from_begin1, _, ref from_begin3, _, ..] = *s { | --------------- immutable borrow occurs here @@ -72,7 +72,7 @@ LL | nop(&[from_begin0, from_begin1, from_begin3, from_end3]); | ----------- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:41:21 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:39:21 | LL | if let [ref from_begin0, ref from_begin1, _, ref from_begin3, _, ..] = *s { | --------------- immutable borrow occurs here @@ -83,7 +83,7 @@ LL | nop(&[from_begin0, from_begin1, from_begin3, from_end4]); | ----------- immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:49:20 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:47:20 | LL | if let [ref first, ref second, ..] = *s { | ---------- immutable borrow occurs here @@ -93,7 +93,7 @@ LL | nop(&[first, second]); | ------ immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:58:17 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:56:17 | LL | if let [.., ref second, ref first] = *s { | ---------- immutable borrow occurs here @@ -103,7 +103,7 @@ LL | nop(&[first, second]); | ------ immutable borrow later used here error[E0502]: cannot borrow `s[..]` as mutable because it is also borrowed as immutable - --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:67:17 + --> $DIR/borrowck-slice-pattern-element-loan-slice.rs:65:17 | LL | if let [_, _, _, ref s1 @ ..] = *s { | ----------- immutable borrow occurs here diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-element-loan.rs b/src/test/ui/borrowck/borrowck-vec-pattern-element-loan.rs index 53a9bcef74..cd853b8336 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-element-loan.rs +++ b/src/test/ui/borrowck/borrowck-vec-pattern-element-loan.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn a<'a>() -> &'a [isize] { let vec = vec![1, 2, 3, 4]; let vec: &[isize] = &vec; diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-element-loan.stderr b/src/test/ui/borrowck/borrowck-vec-pattern-element-loan.stderr index da6d9293b4..170982b169 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-element-loan.stderr +++ b/src/test/ui/borrowck/borrowck-vec-pattern-element-loan.stderr @@ -1,5 +1,5 @@ error[E0515]: cannot return value referencing local variable `vec` - --> $DIR/borrowck-vec-pattern-element-loan.rs:10:5 + --> $DIR/borrowck-vec-pattern-element-loan.rs:8:5 | LL | let vec: &[isize] = &vec; | ---- `vec` is borrowed here @@ -8,7 +8,7 @@ LL | tail | ^^^^ returns a value referencing data owned by the current function error[E0515]: cannot return value referencing local variable `vec` - --> $DIR/borrowck-vec-pattern-element-loan.rs:20:5 + --> $DIR/borrowck-vec-pattern-element-loan.rs:18:5 | LL | let vec: &[isize] = &vec; | ---- `vec` is borrowed here @@ -17,7 +17,7 @@ LL | init | ^^^^ returns a value referencing data owned by the current function error[E0515]: cannot return value referencing local variable `vec` - --> $DIR/borrowck-vec-pattern-element-loan.rs:30:5 + --> $DIR/borrowck-vec-pattern-element-loan.rs:28:5 | LL | let vec: &[isize] = &vec; | ---- `vec` is borrowed here diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-loan-from-mut.rs b/src/test/ui/borrowck/borrowck-vec-pattern-loan-from-mut.rs index dd9023f6d9..05859c95d1 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-loan-from-mut.rs +++ b/src/test/ui/borrowck/borrowck-vec-pattern-loan-from-mut.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn a() { let mut v = vec![1, 2, 3]; let vb: &mut [isize] = &mut v; diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-loan-from-mut.stderr b/src/test/ui/borrowck/borrowck-vec-pattern-loan-from-mut.stderr index 251f445929..5141fcc1bb 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-loan-from-mut.stderr +++ b/src/test/ui/borrowck/borrowck-vec-pattern-loan-from-mut.stderr @@ -1,5 +1,5 @@ error[E0499]: cannot borrow `v` as mutable more than once at a time - --> $DIR/borrowck-vec-pattern-loan-from-mut.rs:8:13 + --> $DIR/borrowck-vec-pattern-loan-from-mut.rs:6:13 | LL | let vb: &mut [isize] = &mut v; | ------ first mutable borrow occurs here diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-move-tail.rs b/src/test/ui/borrowck/borrowck-vec-pattern-move-tail.rs index 420223009a..9b8ba2ea8a 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-move-tail.rs +++ b/src/test/ui/borrowck/borrowck-vec-pattern-move-tail.rs @@ -1,7 +1,3 @@ -// http://rust-lang.org/COPYRIGHT. - -#![feature(slice_patterns)] - fn main() { let mut a = [1, 2, 3, 4]; let t = match a { diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-move-tail.stderr b/src/test/ui/borrowck/borrowck-vec-pattern-move-tail.stderr index 9f8e6fe3b6..ff70ba9fcc 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-move-tail.stderr +++ b/src/test/ui/borrowck/borrowck-vec-pattern-move-tail.stderr @@ -1,5 +1,5 @@ error[E0506]: cannot assign to `a[_]` because it is borrowed - --> $DIR/borrowck-vec-pattern-move-tail.rs:12:5 + --> $DIR/borrowck-vec-pattern-move-tail.rs:8:5 | LL | [1, 2, ref tail @ ..] => tail, | ------------- borrow of `a[_]` occurs here diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-nesting.rs b/src/test/ui/borrowck/borrowck-vec-pattern-nesting.rs index e274d105e0..67b6c12ba8 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-nesting.rs +++ b/src/test/ui/borrowck/borrowck-vec-pattern-nesting.rs @@ -1,6 +1,5 @@ #![feature(box_patterns)] #![feature(box_syntax)] -#![feature(slice_patterns)] fn a() { let mut vec = [box 1, box 2, box 3]; diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-nesting.stderr b/src/test/ui/borrowck/borrowck-vec-pattern-nesting.stderr index a3324f25d0..e2c0852dd8 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-nesting.stderr +++ b/src/test/ui/borrowck/borrowck-vec-pattern-nesting.stderr @@ -1,5 +1,5 @@ error[E0506]: cannot assign to `vec[_]` because it is borrowed - --> $DIR/borrowck-vec-pattern-nesting.rs:10:13 + --> $DIR/borrowck-vec-pattern-nesting.rs:9:13 | LL | [box ref _a, _, _] => { | ------ borrow of `vec[_]` occurs here @@ -11,7 +11,7 @@ LL | _a.use_ref(); | -- borrow later used here error[E0506]: cannot assign to `vec[_]` because it is borrowed - --> $DIR/borrowck-vec-pattern-nesting.rs:24:13 + --> $DIR/borrowck-vec-pattern-nesting.rs:23:13 | LL | &mut [ref _b @ ..] => { | ----------- borrow of `vec[_]` occurs here @@ -23,7 +23,7 @@ LL | _b.use_ref(); | -- borrow later used here error[E0508]: cannot move out of type `[std::boxed::Box<isize>]`, a non-copy slice - --> $DIR/borrowck-vec-pattern-nesting.rs:35:11 + --> $DIR/borrowck-vec-pattern-nesting.rs:34:11 | LL | match vec { | ^^^ cannot move out of here @@ -45,7 +45,7 @@ LL | ] => { | error[E0508]: cannot move out of type `[std::boxed::Box<isize>]`, a non-copy slice - --> $DIR/borrowck-vec-pattern-nesting.rs:47:13 + --> $DIR/borrowck-vec-pattern-nesting.rs:46:13 | LL | let a = vec[0]; | ^^^^^^ @@ -55,7 +55,7 @@ LL | let a = vec[0]; | help: consider borrowing here: `&vec[0]` error[E0508]: cannot move out of type `[std::boxed::Box<isize>]`, a non-copy slice - --> $DIR/borrowck-vec-pattern-nesting.rs:56:11 + --> $DIR/borrowck-vec-pattern-nesting.rs:55:11 | LL | match vec { | ^^^ cannot move out of here @@ -74,7 +74,7 @@ LL | _b] => {} | error[E0508]: cannot move out of type `[std::boxed::Box<isize>]`, a non-copy slice - --> $DIR/borrowck-vec-pattern-nesting.rs:66:13 + --> $DIR/borrowck-vec-pattern-nesting.rs:65:13 | LL | let a = vec[0]; | ^^^^^^ @@ -84,7 +84,7 @@ LL | let a = vec[0]; | help: consider borrowing here: `&vec[0]` error[E0508]: cannot move out of type `[std::boxed::Box<isize>]`, a non-copy slice - --> $DIR/borrowck-vec-pattern-nesting.rs:75:11 + --> $DIR/borrowck-vec-pattern-nesting.rs:74:11 | LL | match vec { | ^^^ cannot move out of here @@ -100,7 +100,7 @@ LL | &mut [_a, _b, _c] => {} = note: move occurs because these variables have types that don't implement the `Copy` trait error[E0508]: cannot move out of type `[std::boxed::Box<isize>]`, a non-copy slice - --> $DIR/borrowck-vec-pattern-nesting.rs:86:13 + --> $DIR/borrowck-vec-pattern-nesting.rs:85:13 | LL | let a = vec[0]; | ^^^^^^ diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-tail-element-loan.rs b/src/test/ui/borrowck/borrowck-vec-pattern-tail-element-loan.rs index c35be2f6be..39872825cd 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-tail-element-loan.rs +++ b/src/test/ui/borrowck/borrowck-vec-pattern-tail-element-loan.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn a<'a>() -> &'a isize { let vec = vec![1, 2, 3, 4]; let vec: &[isize] = &vec; diff --git a/src/test/ui/borrowck/borrowck-vec-pattern-tail-element-loan.stderr b/src/test/ui/borrowck/borrowck-vec-pattern-tail-element-loan.stderr index c1290a6f63..7e21c55f21 100644 --- a/src/test/ui/borrowck/borrowck-vec-pattern-tail-element-loan.stderr +++ b/src/test/ui/borrowck/borrowck-vec-pattern-tail-element-loan.stderr @@ -1,5 +1,5 @@ error[E0515]: cannot return value referencing local variable `vec` - --> $DIR/borrowck-vec-pattern-tail-element-loan.rs:10:5 + --> $DIR/borrowck-vec-pattern-tail-element-loan.rs:8:5 | LL | let vec: &[isize] = &vec; | ---- `vec` is borrowed here diff --git a/src/test/ui/borrowck/regions-bound-missing-bound-in-impl.rs b/src/test/ui/borrowck/regions-bound-missing-bound-in-impl.rs index da918ba92b..141ad5bd2c 100644 --- a/src/test/ui/borrowck/regions-bound-missing-bound-in-impl.rs +++ b/src/test/ui/borrowck/regions-bound-missing-bound-in-impl.rs @@ -26,6 +26,7 @@ impl<'a, 't> Foo<'a, 't> for &'a isize { fn wrong_bound1<'b,'c,'d:'a+'c>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d>) { //~^ ERROR method not compatible with trait + //~| ERROR method not compatible with trait // // Note: This is a terrible error message. It is caused // because, in the trait, 'b is early bound, and in the impl, diff --git a/src/test/ui/borrowck/regions-bound-missing-bound-in-impl.stderr b/src/test/ui/borrowck/regions-bound-missing-bound-in-impl.stderr index 4f86ffb2b7..ad39b3601b 100644 --- a/src/test/ui/borrowck/regions-bound-missing-bound-in-impl.stderr +++ b/src/test/ui/borrowck/regions-bound-missing-bound-in-impl.stderr @@ -35,8 +35,27 @@ note: ...does not necessarily outlive the lifetime `'c` as defined on the method LL | fn wrong_bound1<'b,'c,'d:'a+'c>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d>) { | ^^ +error[E0308]: method not compatible with trait + --> $DIR/regions-bound-missing-bound-in-impl.rs:27:5 + | +LL | fn wrong_bound1<'b,'c,'d:'a+'c>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d>) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch + | + = note: expected fn pointer `fn(&'a isize, Inv<'c>, Inv<'c>, Inv<'_>)` + found fn pointer `fn(&'a isize, Inv<'_>, Inv<'c>, Inv<'_>)` +note: the lifetime `'c` as defined on the method body at 27:24... + --> $DIR/regions-bound-missing-bound-in-impl.rs:27:24 + | +LL | fn wrong_bound1<'b,'c,'d:'a+'c>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d>) { + | ^^ +note: ...does not necessarily outlive the lifetime `'c` as defined on the method body at 27:24 + --> $DIR/regions-bound-missing-bound-in-impl.rs:27:24 + | +LL | fn wrong_bound1<'b,'c,'d:'a+'c>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d>) { + | ^^ + error[E0195]: lifetime parameters or bounds on method `wrong_bound2` do not match the trait declaration - --> $DIR/regions-bound-missing-bound-in-impl.rs:41:20 + --> $DIR/regions-bound-missing-bound-in-impl.rs:42:20 | LL | fn wrong_bound2<'b,'c,'d:'a+'b>(self, b: Inv<'b>, c: Inv<'c>, d: Inv<'d>); | ---------------- lifetimes in impl do not match this method in trait @@ -45,7 +64,7 @@ LL | fn wrong_bound2(self, b: Inv, c: Inv, d: Inv) { | ^ lifetimes do not match method in trait error[E0276]: impl has stricter requirements than trait - --> $DIR/regions-bound-missing-bound-in-impl.rs:48:5 + --> $DIR/regions-bound-missing-bound-in-impl.rs:49:5 | LL | fn another_bound<'x: 'a>(self, x: Inv<'x>, y: Inv<'t>); | ------------------------------------------------------- definition of `another_bound` from trait @@ -53,7 +72,7 @@ LL | fn another_bound<'x: 'a>(self, x: Inv<'x>, y: Inv<'t>); LL | fn another_bound<'x: 't>(self, x: Inv<'x>, y: Inv<'t>) { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `'x: 't` -error: aborting due to 5 previous errors +error: aborting due to 6 previous errors Some errors have detailed explanations: E0195, E0276, E0308. For more information about an error, try `rustc --explain E0195`. diff --git a/src/test/ui/c-variadic/variadic-ffi-4.nll.stderr b/src/test/ui/c-variadic/variadic-ffi-4.nll.stderr index 8b70b15fa6..89107e799b 100644 --- a/src/test/ui/c-variadic/variadic-ffi-4.nll.stderr +++ b/src/test/ui/c-variadic/variadic-ffi-4.nll.stderr @@ -87,12 +87,12 @@ error[E0597]: `ap1` does not live long enough --> $DIR/variadic-ffi-4.rs:24:11 | LL | pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) { - | - let's call the lifetime of this reference `'1` + | - let's call the lifetime of this reference `'3` LL | ap0 = &mut ap1; | ------^^^^^^^^ | | | | | borrowed value does not live long enough - | assignment requires that `ap1` is borrowed for `'1` + | assignment requires that `ap1` is borrowed for `'3` ... LL | } | - `ap1` dropped here while still borrowed diff --git a/src/test/ui/c-variadic/variadic-ffi-no-fixed-args.stderr b/src/test/ui/c-variadic/variadic-ffi-no-fixed-args.stderr index cb6060525f..7af38c88f4 100644 --- a/src/test/ui/c-variadic/variadic-ffi-no-fixed-args.stderr +++ b/src/test/ui/c-variadic/variadic-ffi-no-fixed-args.stderr @@ -1,8 +1,8 @@ error: C-variadic function must be declared with at least one named argument - --> $DIR/variadic-ffi-no-fixed-args.rs:2:11 + --> $DIR/variadic-ffi-no-fixed-args.rs:2:12 | LL | fn foo(...); - | ^ + | ^^^^ error: aborting due to previous error diff --git a/src/test/ui/cast/cast-as-bool.rs b/src/test/ui/cast/cast-as-bool.rs index 8130f4dedc..1aed218aeb 100644 --- a/src/test/ui/cast/cast-as-bool.rs +++ b/src/test/ui/cast/cast-as-bool.rs @@ -5,5 +5,5 @@ fn main() { let t = (1 + 2) as bool; //~ ERROR cannot cast as `bool` //~| HELP compare with zero instead //~| SUGGESTION (1 + 2) != 0 - let v = "hello" as bool; //~ ERROR cannot cast as `bool` + let v = "hello" as bool; //~ ERROR casting `&'static str` as `bool` is invalid } diff --git a/src/test/ui/cast/cast-as-bool.stderr b/src/test/ui/cast/cast-as-bool.stderr index 30f8459c2e..15d94ab69d 100644 --- a/src/test/ui/cast/cast-as-bool.stderr +++ b/src/test/ui/cast/cast-as-bool.stderr @@ -10,12 +10,13 @@ error[E0054]: cannot cast as `bool` LL | let t = (1 + 2) as bool; | ^^^^^^^^^^^^^^^ help: compare with zero instead: `(1 + 2) != 0` -error[E0054]: cannot cast as `bool` +error[E0606]: casting `&'static str` as `bool` is invalid --> $DIR/cast-as-bool.rs:8:13 | LL | let v = "hello" as bool; - | ^^^^^^^^^^^^^^^ unsupported cast + | ^^^^^^^^^^^^^^^ error: aborting due to 3 previous errors -For more information about this error, try `rustc --explain E0054`. +Some errors have detailed explanations: E0054, E0606. +For more information about an error, try `rustc --explain E0054`. diff --git a/src/test/ui/cdylib-deps-must-be-static.rs b/src/test/ui/cdylib-deps-must-be-static.rs deleted file mode 100644 index 8530c9e24b..0000000000 --- a/src/test/ui/cdylib-deps-must-be-static.rs +++ /dev/null @@ -1,9 +0,0 @@ -// error-pattern: crate `cdylib_dep` required to be available in rlib format, but was not found -// aux-build:cdylib-dep.rs -// ignore-musl -// ignore-cloudabi -// ignore-emscripten -// ignore-sgx no dynamic libraries -#![crate_type = "cdylib"] - -extern crate cdylib_dep; diff --git a/src/test/ui/cdylib-deps-must-be-static.stderr b/src/test/ui/cdylib-deps-must-be-static.stderr deleted file mode 100644 index a1dc8e985d..0000000000 --- a/src/test/ui/cdylib-deps-must-be-static.stderr +++ /dev/null @@ -1,4 +0,0 @@ -error: crate `cdylib_dep` required to be available in rlib format, but was not found in this form - -error: aborting due to previous error - diff --git a/src/test/ui/class-cast-to-trait.stderr b/src/test/ui/class-cast-to-trait.stderr index 4cab52e3e9..0f932cda07 100644 --- a/src/test/ui/class-cast-to-trait.stderr +++ b/src/test/ui/class-cast-to-trait.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `eat` found for type `std::boxed::Box<dyn Noisy>` in the current scope +error[E0599]: no method named `eat` found for struct `std::boxed::Box<dyn Noisy>` in the current scope --> $DIR/class-cast-to-trait.rs:53:8 | LL | nyan.eat(); diff --git a/src/test/ui/closures/closure-move-sync.rs b/src/test/ui/closures/closure-move-sync.rs index 2f1e6c81ae..87388247fb 100644 --- a/src/test/ui/closures/closure-move-sync.rs +++ b/src/test/ui/closures/closure-move-sync.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl use std::thread; use std::sync::mpsc::channel; diff --git a/src/test/ui/closures/closure-move-sync.stderr b/src/test/ui/closures/closure-move-sync.stderr index ac5e3ccb42..2187823d75 100644 --- a/src/test/ui/closures/closure-move-sync.stderr +++ b/src/test/ui/closures/closure-move-sync.stderr @@ -1,32 +1,32 @@ error[E0277]: `std::sync::mpsc::Receiver<()>` cannot be shared between threads safely - --> $DIR/closure-move-sync.rs:7:13 + --> $DIR/closure-move-sync.rs:10:13 | LL | let t = thread::spawn(|| { | ^^^^^^^^^^^^^ `std::sync::mpsc::Receiver<()>` cannot be shared between threads safely | ::: $SRC_DIR/libstd/thread/mod.rs:LL:COL | -LL | F: FnOnce() -> T, F: Send + 'static, T: Send + 'static - | ---- required by this bound in `std::thread::spawn` +LL | F: Send + 'static, + | ---- required by this bound in `std::thread::spawn` | = help: the trait `std::marker::Sync` is not implemented for `std::sync::mpsc::Receiver<()>` = note: required because of the requirements on the impl of `std::marker::Send` for `&std::sync::mpsc::Receiver<()>` - = note: required because it appears within the type `[closure@$DIR/closure-move-sync.rs:7:27: 10:6 recv:&std::sync::mpsc::Receiver<()>]` + = note: required because it appears within the type `[closure@$DIR/closure-move-sync.rs:10:27: 13:6 recv:&std::sync::mpsc::Receiver<()>]` error[E0277]: `std::sync::mpsc::Sender<()>` cannot be shared between threads safely - --> $DIR/closure-move-sync.rs:19:5 + --> $DIR/closure-move-sync.rs:22:5 | LL | thread::spawn(|| tx.send(()).unwrap()); | ^^^^^^^^^^^^^ `std::sync::mpsc::Sender<()>` cannot be shared between threads safely | ::: $SRC_DIR/libstd/thread/mod.rs:LL:COL | -LL | F: FnOnce() -> T, F: Send + 'static, T: Send + 'static - | ---- required by this bound in `std::thread::spawn` +LL | F: Send + 'static, + | ---- required by this bound in `std::thread::spawn` | = help: the trait `std::marker::Sync` is not implemented for `std::sync::mpsc::Sender<()>` = note: required because of the requirements on the impl of `std::marker::Send` for `&std::sync::mpsc::Sender<()>` - = note: required because it appears within the type `[closure@$DIR/closure-move-sync.rs:19:19: 19:42 tx:&std::sync::mpsc::Sender<()>]` + = note: required because it appears within the type `[closure@$DIR/closure-move-sync.rs:22:19: 22:42 tx:&std::sync::mpsc::Sender<()>]` error: aborting due to 2 previous errors diff --git a/src/test/ui/closures/closure-reform-bad.stderr b/src/test/ui/closures/closure-reform-bad.stderr index 63236cf542..3c4ae45076 100644 --- a/src/test/ui/closures/closure-reform-bad.stderr +++ b/src/test/ui/closures/closure-reform-bad.stderr @@ -1,6 +1,8 @@ error[E0308]: mismatched types --> $DIR/closure-reform-bad.rs:11:15 | +LL | let f = |s: &str| println!("{}{}", s, string); + | ------------------------------------- the found closure LL | call_bare(f) | ^ expected fn pointer, found closure | diff --git a/src/test/ui/closures/issue-68025.rs b/src/test/ui/closures/issue-68025.rs new file mode 100644 index 0000000000..261bfd60aa --- /dev/null +++ b/src/test/ui/closures/issue-68025.rs @@ -0,0 +1,12 @@ +// check-pass + +fn foo<F, G>(_: G, _: Box<F>) +where + F: Fn(), + G: Fn(Box<F>), +{ +} + +fn main() { + foo(|f| (*f)(), Box::new(|| {})); +} diff --git a/src/test/ui/codemap_tests/unicode_2.stderr b/src/test/ui/codemap_tests/unicode_2.stderr index 92634d8e5f..c01942712d 100644 --- a/src/test/ui/codemap_tests/unicode_2.stderr +++ b/src/test/ui/codemap_tests/unicode_2.stderr @@ -14,7 +14,7 @@ LL | let _ = ("아あ", 1i42); | = help: valid widths are 8, 16, 32, 64 and 128 -error[E0425]: cannot find value `a̐é` in this scope +error[E0425]: cannot find value `a̐é` in this scope --> $DIR/unicode_2.rs:6:13 | LL | let _ = a̐é; diff --git a/src/test/ui/coercion/coerce-expect-unsized-ascribed.stderr b/src/test/ui/coercion/coerce-expect-unsized-ascribed.stderr index 303d83d342..44e5c6a99f 100644 --- a/src/test/ui/coercion/coerce-expect-unsized-ascribed.stderr +++ b/src/test/ui/coercion/coerce-expect-unsized-ascribed.stderr @@ -29,7 +29,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:13:13 | LL | let _ = box { |x| (x as u8) }: Box<dyn Fn(i32) -> _>; - | ^^^^^^^^^^^^^^^^^^^^^ expected trait `std::ops::Fn`, found closure + | ^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn std::ops::Fn`, found closure | = note: expected struct `std::boxed::Box<dyn std::ops::Fn(i32) -> u8>` found struct `std::boxed::Box<[closure@$DIR/coerce-expect-unsized-ascribed.rs:13:19: 13:32]>` @@ -38,7 +38,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:14:13 | LL | let _ = box if true { false } else { true }: Box<dyn Debug>; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait `std::fmt::Debug`, found `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn std::fmt::Debug`, found `bool` | = note: expected struct `std::boxed::Box<dyn std::fmt::Debug>` found struct `std::boxed::Box<bool>` @@ -47,7 +47,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:15:13 | LL | let _ = box match true { true => 'a', false => 'b' }: Box<dyn Debug>; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait `std::fmt::Debug`, found `char` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn std::fmt::Debug`, found `char` | = note: expected struct `std::boxed::Box<dyn std::fmt::Debug>` found struct `std::boxed::Box<char>` @@ -83,7 +83,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:21:13 | LL | let _ = &{ |x| (x as u8) }: &dyn Fn(i32) -> _; - | ^^^^^^^^^^^^^^^^^^ expected trait `std::ops::Fn`, found closure + | ^^^^^^^^^^^^^^^^^^ expected trait object `dyn std::ops::Fn`, found closure | = note: expected reference `&dyn std::ops::Fn(i32) -> u8` found reference `&[closure@$DIR/coerce-expect-unsized-ascribed.rs:21:16: 21:29]` @@ -92,7 +92,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:22:13 | LL | let _ = &if true { false } else { true }: &dyn Debug; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait `std::fmt::Debug`, found `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn std::fmt::Debug`, found `bool` | = note: expected reference `&dyn std::fmt::Debug` found reference `&bool` @@ -101,7 +101,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:23:13 | LL | let _ = &match true { true => 'a', false => 'b' }: &dyn Debug; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait `std::fmt::Debug`, found `char` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn std::fmt::Debug`, found `char` | = note: expected reference `&dyn std::fmt::Debug` found reference `&char` @@ -119,7 +119,7 @@ error[E0308]: mismatched types --> $DIR/coerce-expect-unsized-ascribed.rs:26:13 | LL | let _ = Box::new(|x| (x as u8)): Box<dyn Fn(i32) -> _>; - | ^^^^^^^^^^^^^^^^^^^^^^^ expected trait `std::ops::Fn`, found closure + | ^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn std::ops::Fn`, found closure | = note: expected struct `std::boxed::Box<dyn std::ops::Fn(i32) -> _>` found struct `std::boxed::Box<[closure@$DIR/coerce-expect-unsized-ascribed.rs:26:22: 26:35]>` diff --git a/src/test/ui/coherence/coherence_inherent.stderr b/src/test/ui/coherence/coherence_inherent.stderr index e719d5254f..3d37d8af31 100644 --- a/src/test/ui/coherence/coherence_inherent.stderr +++ b/src/test/ui/coherence/coherence_inherent.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `the_fn` found for type `&Lib::TheStruct` in the current scope +error[E0599]: no method named `the_fn` found for reference `&Lib::TheStruct` in the current scope --> $DIR/coherence_inherent.rs:31:11 | LL | s.the_fn(); diff --git a/src/test/ui/coherence/coherence_inherent_cc.stderr b/src/test/ui/coherence/coherence_inherent_cc.stderr index c666c1a3d1..d968c8b468 100644 --- a/src/test/ui/coherence/coherence_inherent_cc.stderr +++ b/src/test/ui/coherence/coherence_inherent_cc.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `the_fn` found for type `&coherence_inherent_cc_lib::TheStruct` in the current scope +error[E0599]: no method named `the_fn` found for reference `&coherence_inherent_cc_lib::TheStruct` in the current scope --> $DIR/coherence_inherent_cc.rs:23:11 | LL | s.the_fn(); diff --git a/src/test/ui/commandline-argfile-badutf8.rs b/src/test/ui/commandline-argfile-badutf8.rs index 161715685b..e2984e3ca9 100644 --- a/src/test/ui/commandline-argfile-badutf8.rs +++ b/src/test/ui/commandline-argfile-badutf8.rs @@ -1,6 +1,5 @@ // Check to see if we can get parameters from an @argsfile file // -// build-fail // compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile-badutf8.args #[cfg(not(cmdline_set))] diff --git a/src/test/ui/commandline-argfile-missing.rs b/src/test/ui/commandline-argfile-missing.rs index a29b4ab062..020c3ff3c7 100644 --- a/src/test/ui/commandline-argfile-missing.rs +++ b/src/test/ui/commandline-argfile-missing.rs @@ -1,7 +1,6 @@ // Check to see if we can get parameters from an @argsfile file // // ignore-tidy-linelength -// build-fail // normalize-stderr-test: "os error \d+" -> "os error $$ERR" // normalize-stderr-test: "commandline-argfile-missing.args:[^(]*" -> "commandline-argfile-missing.args: $$FILE_MISSING " // compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile-missing.args diff --git a/src/test/ui/conflicting-repr-hints.rs b/src/test/ui/conflicting-repr-hints.rs index cc986b2521..09dade2099 100644 --- a/src/test/ui/conflicting-repr-hints.rs +++ b/src/test/ui/conflicting-repr-hints.rs @@ -1,16 +1,26 @@ #![allow(dead_code)] #[repr(C)] -enum A { A } +enum A { + A, +} #[repr(u64)] -enum B { B } +enum B { + B, +} -#[repr(C, u64)] //~ WARNING conflicting representation hints -enum C { C } +#[repr(C, u64)] //~ ERROR conflicting representation hints +//~^ WARN this was previously accepted +enum C { + C, +} -#[repr(u32, u64)] //~ WARNING conflicting representation hints -enum D { D } +#[repr(u32, u64)] //~ ERROR conflicting representation hints +//~^ WARN this was previously accepted +enum D { + D, +} #[repr(C, packed)] struct E(i32); @@ -37,20 +47,23 @@ struct J(i32); //~ ERROR type has conflicting packed representation hints struct K(i32); #[repr(packed, align(8))] -union X { //~ ERROR type has conflicting packed and align representation hints - i: i32 +union X { + //~^ ERROR type has conflicting packed and align representation hints + i: i32, } #[repr(packed)] #[repr(align(8))] -union Y { //~ ERROR type has conflicting packed and align representation hints - i: i32 +union Y { + //~^ ERROR type has conflicting packed and align representation hints + i: i32, } #[repr(align(8))] #[repr(packed)] -union Z { //~ ERROR type has conflicting packed and align representation hints - i: i32 +union Z { + //~^ ERROR type has conflicting packed and align representation hints + i: i32, } fn main() {} diff --git a/src/test/ui/conflicting-repr-hints.stderr b/src/test/ui/conflicting-repr-hints.stderr index 414c15f93b..43b76bf649 100644 --- a/src/test/ui/conflicting-repr-hints.stderr +++ b/src/test/ui/conflicting-repr-hints.stderr @@ -1,70 +1,80 @@ -warning[E0566]: conflicting representation hints - --> $DIR/conflicting-repr-hints.rs:9:8 +error[E0566]: conflicting representation hints + --> $DIR/conflicting-repr-hints.rs:13:8 | LL | #[repr(C, u64)] | ^ ^^^ + | + = note: `#[deny(conflicting_repr_hints)]` on by default + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #68585 <https://github.com/rust-lang/rust/issues/68585> -warning[E0566]: conflicting representation hints - --> $DIR/conflicting-repr-hints.rs:12:8 +error[E0566]: conflicting representation hints + --> $DIR/conflicting-repr-hints.rs:19:8 | LL | #[repr(u32, u64)] | ^^^ ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #68585 <https://github.com/rust-lang/rust/issues/68585> error[E0587]: type has conflicting packed and align representation hints - --> $DIR/conflicting-repr-hints.rs:19:1 + --> $DIR/conflicting-repr-hints.rs:29:1 | LL | struct F(i32); | ^^^^^^^^^^^^^^ error[E0587]: type has conflicting packed and align representation hints - --> $DIR/conflicting-repr-hints.rs:23:1 + --> $DIR/conflicting-repr-hints.rs:33:1 | LL | struct G(i32); | ^^^^^^^^^^^^^^ error[E0587]: type has conflicting packed and align representation hints - --> $DIR/conflicting-repr-hints.rs:27:1 + --> $DIR/conflicting-repr-hints.rs:37:1 | LL | struct H(i32); | ^^^^^^^^^^^^^^ error[E0634]: type has conflicting packed representation hints - --> $DIR/conflicting-repr-hints.rs:30:1 + --> $DIR/conflicting-repr-hints.rs:40:1 | LL | struct I(i32); | ^^^^^^^^^^^^^^ error[E0634]: type has conflicting packed representation hints - --> $DIR/conflicting-repr-hints.rs:34:1 + --> $DIR/conflicting-repr-hints.rs:44:1 | LL | struct J(i32); | ^^^^^^^^^^^^^^ error[E0587]: type has conflicting packed and align representation hints - --> $DIR/conflicting-repr-hints.rs:40:1 + --> $DIR/conflicting-repr-hints.rs:50:1 | LL | / union X { -LL | | i: i32 +LL | | +LL | | i: i32, LL | | } | |_^ error[E0587]: type has conflicting packed and align representation hints - --> $DIR/conflicting-repr-hints.rs:46:1 + --> $DIR/conflicting-repr-hints.rs:57:1 | LL | / union Y { -LL | | i: i32 +LL | | +LL | | i: i32, LL | | } | |_^ error[E0587]: type has conflicting packed and align representation hints - --> $DIR/conflicting-repr-hints.rs:52:1 + --> $DIR/conflicting-repr-hints.rs:64:1 | LL | / union Z { -LL | | i: i32 +LL | | +LL | | i: i32, LL | | } | |_^ -error: aborting due to 8 previous errors +error: aborting due to 10 previous errors Some errors have detailed explanations: E0566, E0587. For more information about an error, try `rustc --explain E0566`. diff --git a/src/test/ui/confuse-field-and-method/issue-18343.stderr b/src/test/ui/confuse-field-and-method/issue-18343.stderr index 79ba93130a..d6b399acb7 100644 --- a/src/test/ui/confuse-field-and-method/issue-18343.stderr +++ b/src/test/ui/confuse-field-and-method/issue-18343.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `closure` found for type `Obj<[closure@$DIR/issue-18343.rs:6:28: 6:33]>` in the current scope +error[E0599]: no method named `closure` found for struct `Obj<[closure@$DIR/issue-18343.rs:6:28: 6:33]>` in the current scope --> $DIR/issue-18343.rs:7:7 | LL | struct Obj<F> where F: FnMut() -> u32 { diff --git a/src/test/ui/confuse-field-and-method/issue-2392.stderr b/src/test/ui/confuse-field-and-method/issue-2392.stderr index a44b971841..f9dfdddad9 100644 --- a/src/test/ui/confuse-field-and-method/issue-2392.stderr +++ b/src/test/ui/confuse-field-and-method/issue-2392.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `closure` found for type `Obj<[closure@$DIR/issue-2392.rs:35:36: 35:41]>` in the current scope +error[E0599]: no method named `closure` found for struct `Obj<[closure@$DIR/issue-2392.rs:35:36: 35:41]>` in the current scope --> $DIR/issue-2392.rs:36:15 | LL | struct Obj<F> where F: FnOnce() -> u32 { @@ -12,7 +12,7 @@ help: to call the function stored in `closure`, surround the field access with p LL | (o_closure.closure)(); | ^ ^ -error[E0599]: no method named `not_closure` found for type `Obj<[closure@$DIR/issue-2392.rs:35:36: 35:41]>` in the current scope +error[E0599]: no method named `not_closure` found for struct `Obj<[closure@$DIR/issue-2392.rs:35:36: 35:41]>` in the current scope --> $DIR/issue-2392.rs:38:15 | LL | struct Obj<F> where F: FnOnce() -> u32 { @@ -23,7 +23,7 @@ LL | o_closure.not_closure(); | | | field, not a method -error[E0599]: no method named `closure` found for type `Obj<fn() -> u32 {func}>` in the current scope +error[E0599]: no method named `closure` found for struct `Obj<fn() -> u32 {func}>` in the current scope --> $DIR/issue-2392.rs:42:12 | LL | struct Obj<F> where F: FnOnce() -> u32 { @@ -37,7 +37,7 @@ help: to call the function stored in `closure`, surround the field access with p LL | (o_func.closure)(); | ^ ^ -error[E0599]: no method named `boxed_closure` found for type `BoxedObj` in the current scope +error[E0599]: no method named `boxed_closure` found for struct `BoxedObj` in the current scope --> $DIR/issue-2392.rs:45:14 | LL | struct BoxedObj { @@ -51,7 +51,7 @@ help: to call the function stored in `boxed_closure`, surround the field access LL | (boxed_fn.boxed_closure)(); | ^ ^ -error[E0599]: no method named `boxed_closure` found for type `BoxedObj` in the current scope +error[E0599]: no method named `boxed_closure` found for struct `BoxedObj` in the current scope --> $DIR/issue-2392.rs:48:19 | LL | struct BoxedObj { @@ -65,7 +65,7 @@ help: to call the function stored in `boxed_closure`, surround the field access LL | (boxed_closure.boxed_closure)(); | ^ ^ -error[E0599]: no method named `closure` found for type `Obj<fn() -> u32 {func}>` in the current scope +error[E0599]: no method named `closure` found for struct `Obj<fn() -> u32 {func}>` in the current scope --> $DIR/issue-2392.rs:53:12 | LL | struct Obj<F> where F: FnOnce() -> u32 { @@ -79,7 +79,7 @@ help: to call the function stored in `closure`, surround the field access with p LL | (w.wrap.closure)(); | ^ ^ -error[E0599]: no method named `not_closure` found for type `Obj<fn() -> u32 {func}>` in the current scope +error[E0599]: no method named `not_closure` found for struct `Obj<fn() -> u32 {func}>` in the current scope --> $DIR/issue-2392.rs:55:12 | LL | struct Obj<F> where F: FnOnce() -> u32 { @@ -90,7 +90,7 @@ LL | w.wrap.not_closure(); | | | field, not a method -error[E0599]: no method named `closure` found for type `Obj<std::boxed::Box<(dyn std::ops::FnOnce() -> u32 + 'static)>>` in the current scope +error[E0599]: no method named `closure` found for struct `Obj<std::boxed::Box<(dyn std::ops::FnOnce() -> u32 + 'static)>>` in the current scope --> $DIR/issue-2392.rs:58:24 | LL | struct Obj<F> where F: FnOnce() -> u32 { @@ -104,7 +104,7 @@ help: to call the function stored in `closure`, surround the field access with p LL | (check_expression().closure)(); | ^ ^ -error[E0599]: no method named `f1` found for type `FuncContainer` in the current scope +error[E0599]: no method named `f1` found for struct `FuncContainer` in the current scope --> $DIR/issue-2392.rs:64:31 | LL | struct FuncContainer { @@ -118,7 +118,7 @@ help: to call the function stored in `f1`, surround the field access with parent LL | ((*self.container).f1)(1); | ^ ^ -error[E0599]: no method named `f2` found for type `FuncContainer` in the current scope +error[E0599]: no method named `f2` found for struct `FuncContainer` in the current scope --> $DIR/issue-2392.rs:65:31 | LL | struct FuncContainer { @@ -132,7 +132,7 @@ help: to call the function stored in `f2`, surround the field access with parent LL | ((*self.container).f2)(1); | ^ ^ -error[E0599]: no method named `f3` found for type `FuncContainer` in the current scope +error[E0599]: no method named `f3` found for struct `FuncContainer` in the current scope --> $DIR/issue-2392.rs:66:31 | LL | struct FuncContainer { diff --git a/src/test/ui/confuse-field-and-method/issue-32128.stderr b/src/test/ui/confuse-field-and-method/issue-32128.stderr index b2f7894ba0..a8d97bdfe2 100644 --- a/src/test/ui/confuse-field-and-method/issue-32128.stderr +++ b/src/test/ui/confuse-field-and-method/issue-32128.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `example` found for type `Example` in the current scope +error[E0599]: no method named `example` found for struct `Example` in the current scope --> $DIR/issue-32128.rs:12:10 | LL | struct Example { diff --git a/src/test/ui/confuse-field-and-method/issue-33784.stderr b/src/test/ui/confuse-field-and-method/issue-33784.stderr index af29a9963e..c109896e82 100644 --- a/src/test/ui/confuse-field-and-method/issue-33784.stderr +++ b/src/test/ui/confuse-field-and-method/issue-33784.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `closure` found for type `&Obj<[closure@$DIR/issue-33784.rs:25:43: 25:48]>` in the current scope +error[E0599]: no method named `closure` found for reference `&Obj<[closure@$DIR/issue-33784.rs:25:43: 25:48]>` in the current scope --> $DIR/issue-33784.rs:27:7 | LL | p.closure(); @@ -9,7 +9,7 @@ help: to call the function stored in `closure`, surround the field access with p LL | (p.closure)(); | ^ ^ -error[E0599]: no method named `fn_ptr` found for type `&&Obj<[closure@$DIR/issue-33784.rs:25:43: 25:48]>` in the current scope +error[E0599]: no method named `fn_ptr` found for reference `&&Obj<[closure@$DIR/issue-33784.rs:25:43: 25:48]>` in the current scope --> $DIR/issue-33784.rs:29:7 | LL | q.fn_ptr(); @@ -20,7 +20,7 @@ help: to call the function stored in `fn_ptr`, surround the field access with pa LL | (q.fn_ptr)(); | ^ ^ -error[E0599]: no method named `c_fn_ptr` found for type `&D` in the current scope +error[E0599]: no method named `c_fn_ptr` found for reference `&D` in the current scope --> $DIR/issue-33784.rs:32:7 | LL | s.c_fn_ptr(); diff --git a/src/test/ui/confuse-field-and-method/private-field.stderr b/src/test/ui/confuse-field-and-method/private-field.stderr index 97c949e32e..82cb235d47 100644 --- a/src/test/ui/confuse-field-and-method/private-field.stderr +++ b/src/test/ui/confuse-field-and-method/private-field.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `dog_age` found for type `animal::Dog` in the current scope +error[E0599]: no method named `dog_age` found for struct `animal::Dog` in the current scope --> $DIR/private-field.rs:16:23 | LL | pub struct Dog { diff --git a/src/test/ui/const-generics/array-impls/alloc-traits-no-impls-length-33.stderr b/src/test/ui/const-generics/array-impls/alloc-traits-no-impls-length-33.stderr index 5c37468130..6e5afcdb8b 100644 --- a/src/test/ui/const-generics/array-impls/alloc-traits-no-impls-length-33.stderr +++ b/src/test/ui/const-generics/array-impls/alloc-traits-no-impls-length-33.stderr @@ -3,6 +3,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_vec_partial_eq_array<A, B>() -> impl PartialEq<[B; 33]> | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[B; 33]` +... +LL | Vec::<A>::new() + | --------------- this returned value is of type `std::vec::Vec<A>` | = note: required because of the requirements on the impl of `std::cmp::PartialEq<[B; 33]>` for `std::vec::Vec<A>` = note: the return type of a function must have a statically known size @@ -12,6 +15,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_vec_partial_eq_ref_array<'a, A, B>() -> impl PartialEq<&'a [B; 33]> | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[B; 33]` +... +LL | Vec::<A>::new() + | --------------- this returned value is of type `std::vec::Vec<A>` | = note: required because of the requirements on the impl of `std::cmp::PartialEq<&'a [B; 33]>` for `std::vec::Vec<A>` = note: the return type of a function must have a statically known size @@ -21,6 +27,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_vecdeque_partial_eq_array<A, B>() -> impl PartialEq<[B; 33]> | ^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[B; 33]` +... +LL | VecDeque::<A>::new() + | -------------------- this returned value is of type `std::collections::VecDeque<A>` | = note: required because of the requirements on the impl of `std::cmp::PartialEq<[B; 33]>` for `std::collections::VecDeque<A>` = note: the return type of a function must have a statically known size @@ -30,6 +39,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_vecdeque_partial_eq_ref_array<'a, A, B>() -> impl PartialEq<&'a [B; 33]> | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[B; 33]` +... +LL | VecDeque::<A>::new() + | -------------------- this returned value is of type `std::collections::VecDeque<A>` | = note: required because of the requirements on the impl of `std::cmp::PartialEq<&'a [B; 33]>` for `std::collections::VecDeque<A>` = note: the return type of a function must have a statically known size @@ -39,6 +51,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_vecdeque_partial_eq_ref_mut_array<'a, A, B>() -> impl PartialEq<&'a mut [B; 33]> | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[B; 33]` +... +LL | VecDeque::<A>::new() + | -------------------- this returned value is of type `std::collections::VecDeque<A>` | = note: required because of the requirements on the impl of `std::cmp::PartialEq<&'a mut [B; 33]>` for `std::collections::VecDeque<A>` = note: the return type of a function must have a statically known size diff --git a/src/test/ui/const-generics/array-impls/core-traits-no-impls-length-33.rs b/src/test/ui/const-generics/array-impls/core-traits-no-impls-length-33.rs index 8397d204f3..7fa059583f 100644 --- a/src/test/ui/const-generics/array-impls/core-traits-no-impls-length-33.rs +++ b/src/test/ui/const-generics/array-impls/core-traits-no-impls-length-33.rs @@ -6,6 +6,7 @@ pub fn no_debug() { pub fn no_hash() { use std::collections::HashSet; let mut set = HashSet::new(); + //~^ ERROR arrays only have std trait implementations for lengths 0..=32 set.insert([0_usize; 33]); //~^ ERROR arrays only have std trait implementations for lengths 0..=32 } diff --git a/src/test/ui/const-generics/array-impls/core-traits-no-impls-length-33.stderr b/src/test/ui/const-generics/array-impls/core-traits-no-impls-length-33.stderr index 594a0d4b5d..d885c98dcb 100644 --- a/src/test/ui/const-generics/array-impls/core-traits-no-impls-length-33.stderr +++ b/src/test/ui/const-generics/array-impls/core-traits-no-impls-length-33.stderr @@ -8,15 +8,24 @@ LL | println!("{:?}", [0_usize; 33]); = note: required by `std::fmt::Debug::fmt` error[E0277]: arrays only have std trait implementations for lengths 0..=32 - --> $DIR/core-traits-no-impls-length-33.rs:9:16 + --> $DIR/core-traits-no-impls-length-33.rs:10:16 | LL | set.insert([0_usize; 33]); | ^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[usize; 33]` | = note: required because of the requirements on the impl of `std::cmp::Eq` for `[usize; 33]` +error[E0277]: arrays only have std trait implementations for lengths 0..=32 + --> $DIR/core-traits-no-impls-length-33.rs:8:19 + | +LL | let mut set = HashSet::new(); + | ^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[usize; 33]` + | + = note: required because of the requirements on the impl of `std::cmp::Eq` for `[usize; 33]` + = note: required by `std::collections::HashSet::<T>::new` + error[E0369]: binary operation `==` cannot be applied to type `[usize; 33]` - --> $DIR/core-traits-no-impls-length-33.rs:14:19 + --> $DIR/core-traits-no-impls-length-33.rs:15:19 | LL | [0_usize; 33] == [1_usize; 33] | ------------- ^^ ------------- [usize; 33] @@ -26,7 +35,7 @@ LL | [0_usize; 33] == [1_usize; 33] = note: an implementation of `std::cmp::PartialEq` might be missing for `[usize; 33]` error[E0369]: binary operation `<` cannot be applied to type `[usize; 33]` - --> $DIR/core-traits-no-impls-length-33.rs:19:19 + --> $DIR/core-traits-no-impls-length-33.rs:20:19 | LL | [0_usize; 33] < [1_usize; 33] | ------------- ^ ------------- [usize; 33] @@ -36,7 +45,7 @@ LL | [0_usize; 33] < [1_usize; 33] = note: an implementation of `std::cmp::PartialOrd` might be missing for `[usize; 33]` error[E0277]: the trait bound `&[usize; 33]: std::iter::IntoIterator` is not satisfied - --> $DIR/core-traits-no-impls-length-33.rs:24:14 + --> $DIR/core-traits-no-impls-length-33.rs:25:14 | LL | for _ in &[0_usize; 33] { | ^^^^^^^^^^^^^^ the trait `std::iter::IntoIterator` is not implemented for `&[usize; 33]` @@ -48,7 +57,7 @@ LL | for _ in &[0_usize; 33] { <&'a mut [T] as std::iter::IntoIterator> = note: required by `std::iter::IntoIterator::into_iter` -error: aborting due to 5 previous errors +error: aborting due to 6 previous errors Some errors have detailed explanations: E0277, E0369. For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/const-generics/array-impls/into-iter-no-impls-length-33.stderr b/src/test/ui/const-generics/array-impls/into-iter-no-impls-length-33.stderr index bfdff8e3bb..4869f48363 100644 --- a/src/test/ui/const-generics/array-impls/into-iter-no-impls-length-33.stderr +++ b/src/test/ui/const-generics/array-impls/into-iter-no-impls-length-33.stderr @@ -11,6 +11,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_iterator() -> impl Iterator<Item = i32> { | ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` +LL | +LL | IntoIter::new([0i32; 33]) + | ------------------------- this returned value is of type `std::array::IntoIter<i32, 33usize>` | = note: required because of the requirements on the impl of `std::iter::Iterator` for `std::array::IntoIter<i32, 33usize>` = note: the return type of a function must have a statically known size @@ -28,6 +31,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_double_ended_iterator() -> impl DoubleEndedIterator { | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` +LL | +LL | IntoIter::new([0i32; 33]) + | ------------------------- this returned value is of type `std::array::IntoIter<i32, 33usize>` | = note: required because of the requirements on the impl of `std::iter::DoubleEndedIterator` for `std::array::IntoIter<i32, 33usize>` = note: the return type of a function must have a statically known size @@ -45,6 +51,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_exact_size_iterator() -> impl ExactSizeIterator { | ^^^^^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` +LL | +LL | IntoIter::new([0i32; 33]) + | ------------------------- this returned value is of type `std::array::IntoIter<i32, 33usize>` | = note: required because of the requirements on the impl of `std::iter::ExactSizeIterator` for `std::array::IntoIter<i32, 33usize>` = note: the return type of a function must have a statically known size @@ -62,6 +71,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_fused_iterator() -> impl FusedIterator { | ^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` +LL | +LL | IntoIter::new([0i32; 33]) + | ------------------------- this returned value is of type `std::array::IntoIter<i32, 33usize>` | = note: required because of the requirements on the impl of `std::iter::FusedIterator` for `std::array::IntoIter<i32, 33usize>` = note: the return type of a function must have a statically known size @@ -79,6 +91,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_trusted_len() -> impl TrustedLen { | ^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` +LL | +LL | IntoIter::new([0i32; 33]) + | ------------------------- this returned value is of type `std::array::IntoIter<i32, 33usize>` | = note: required because of the requirements on the impl of `std::iter::TrustedLen` for `std::array::IntoIter<i32, 33usize>` = note: the return type of a function must have a statically known size @@ -96,6 +111,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_clone() -> impl Clone { | ^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` +LL | +LL | IntoIter::new([0i32; 33]) + | ------------------------- this returned value is of type `std::array::IntoIter<i32, 33usize>` | = note: required because of the requirements on the impl of `std::clone::Clone` for `std::array::IntoIter<i32, 33usize>` = note: the return type of a function must have a statically known size @@ -113,6 +131,9 @@ error[E0277]: arrays only have std trait implementations for lengths 0..=32 | LL | pub fn no_debug() -> impl Debug { | ^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[i32; 33]` +LL | +LL | IntoIter::new([0i32; 33]) + | ------------------------- this returned value is of type `std::array::IntoIter<i32, 33usize>` | = note: required because of the requirements on the impl of `std::fmt::Debug` for `std::array::IntoIter<i32, 33usize>` = note: the return type of a function must have a statically known size diff --git a/src/test/ui/const-generics/array-size-in-generic-struct-param.rs b/src/test/ui/const-generics/array-size-in-generic-struct-param.rs new file mode 100644 index 0000000000..d996bf56fc --- /dev/null +++ b/src/test/ui/const-generics/array-size-in-generic-struct-param.rs @@ -0,0 +1,22 @@ +#![feature(const_generics)] +//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash + +#[allow(dead_code)] +struct ArithArrayLen<const N: usize>([u32; 0 + N]); +//~^ ERROR constant expression depends on a generic parameter + +#[derive(PartialEq, Eq)] +struct Config { + arr_size: usize, +} + +struct B<const CFG: Config> { + arr: [u8; CFG.arr_size], //~ ERROR constant expression depends on a generic parameter +} + +const C: Config = Config { arr_size: 5 }; + +fn main() { + let b = B::<C> { arr: [1, 2, 3, 4, 5] }; + assert_eq!(b.arr.len(), 5); +} diff --git a/src/test/ui/const-generics/array-size-in-generic-struct-param.stderr b/src/test/ui/const-generics/array-size-in-generic-struct-param.stderr new file mode 100644 index 0000000000..6ae70c493b --- /dev/null +++ b/src/test/ui/const-generics/array-size-in-generic-struct-param.stderr @@ -0,0 +1,26 @@ +warning: the feature `const_generics` is incomplete and may cause the compiler to crash + --> $DIR/array-size-in-generic-struct-param.rs:1:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + +error: constant expression depends on a generic parameter + --> $DIR/array-size-in-generic-struct-param.rs:5:38 + | +LL | struct ArithArrayLen<const N: usize>([u32; 0 + N]); + | ^^^^^^^^^^^^ + | + = note: this may fail depending on what value the parameter takes + +error: constant expression depends on a generic parameter + --> $DIR/array-size-in-generic-struct-param.rs:14:5 + | +LL | arr: [u8; CFG.arr_size], + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this may fail depending on what value the parameter takes + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/const-generics/const-generic-type_name.rs b/src/test/ui/const-generics/const-generic-type_name.rs new file mode 100644 index 0000000000..28586426b4 --- /dev/null +++ b/src/test/ui/const-generics/const-generic-type_name.rs @@ -0,0 +1,11 @@ +// run-pass + +#![feature(const_generics)] +//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash + +#[derive(Debug)] +struct S<const N: usize>; + +fn main() { + assert_eq!(std::any::type_name::<S<3>>(), "const_generic_type_name::S<3usize>"); +} diff --git a/src/test/ui/const-generics/const-generic-type_name.stderr b/src/test/ui/const-generics/const-generic-type_name.stderr new file mode 100644 index 0000000000..6b60a77eff --- /dev/null +++ b/src/test/ui/const-generics/const-generic-type_name.stderr @@ -0,0 +1,8 @@ +warning: the feature `const_generics` is incomplete and may cause the compiler to crash + --> $DIR/const-generic-type_name.rs:3:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + diff --git a/src/test/ui/const-generics/const-param-elided-lifetime.rs b/src/test/ui/const-generics/const-param-elided-lifetime.rs new file mode 100644 index 0000000000..5679dd35c3 --- /dev/null +++ b/src/test/ui/const-generics/const-param-elided-lifetime.rs @@ -0,0 +1,24 @@ +// Elided lifetimes within the type of a const generic parameters is disallowed. This matches the +// behaviour of trait bounds where `fn foo<T: Ord<&u8>>() {}` is illegal. Though we could change +// elided lifetimes within the type of a const generic parameters to be 'static, like elided +// lifetimes within const/static items. + +#![feature(const_generics)] +//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash + +struct A<const N: &u8>; +//~^ ERROR `&` without an explicit lifetime name cannot be used here +trait B {} + +impl<const N: &u8> A<N> { //~ ERROR `&` without an explicit lifetime name cannot be used here + fn foo<const M: &u8>(&self) {} + //~^ ERROR `&` without an explicit lifetime name cannot be used here +} + +impl<const N: &u8> B for A<N> {} +//~^ ERROR `&` without an explicit lifetime name cannot be used here + +fn bar<const N: &u8>() {} +//~^ ERROR `&` without an explicit lifetime name cannot be used here + +fn main() {} diff --git a/src/test/ui/const-generics/const-param-elided-lifetime.stderr b/src/test/ui/const-generics/const-param-elided-lifetime.stderr new file mode 100644 index 0000000000..93133c507f --- /dev/null +++ b/src/test/ui/const-generics/const-param-elided-lifetime.stderr @@ -0,0 +1,40 @@ +error[E0637]: `&` without an explicit lifetime name cannot be used here + --> $DIR/const-param-elided-lifetime.rs:9:19 + | +LL | struct A<const N: &u8>; + | ^ explicit lifetime name needed here + +error[E0637]: `&` without an explicit lifetime name cannot be used here + --> $DIR/const-param-elided-lifetime.rs:13:15 + | +LL | impl<const N: &u8> A<N> { + | ^ explicit lifetime name needed here + +error[E0637]: `&` without an explicit lifetime name cannot be used here + --> $DIR/const-param-elided-lifetime.rs:14:21 + | +LL | fn foo<const M: &u8>(&self) {} + | ^ explicit lifetime name needed here + +error[E0637]: `&` without an explicit lifetime name cannot be used here + --> $DIR/const-param-elided-lifetime.rs:18:15 + | +LL | impl<const N: &u8> B for A<N> {} + | ^ explicit lifetime name needed here + +error[E0637]: `&` without an explicit lifetime name cannot be used here + --> $DIR/const-param-elided-lifetime.rs:21:17 + | +LL | fn bar<const N: &u8>() {} + | ^ explicit lifetime name needed here + +warning: the feature `const_generics` is incomplete and may cause the compiler to crash + --> $DIR/const-param-elided-lifetime.rs:6:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + +error: aborting due to 5 previous errors + diff --git a/src/test/ui/const-generics/fn-const-param-infer.stderr b/src/test/ui/const-generics/fn-const-param-infer.stderr index 9ccad7bcdd..44eab8baa4 100644 --- a/src/test/ui/const-generics/fn-const-param-infer.stderr +++ b/src/test/ui/const-generics/fn-const-param-infer.stderr @@ -30,7 +30,7 @@ error[E0282]: type annotations needed --> $DIR/fn-const-param-infer.rs:22:23 | LL | let _ = Checked::<generic>; - | ^^^^^^^ cannot infer type for type parameter `T` + | ^^^^^^^ cannot infer type for type parameter `T` declared on the function `generic` error[E0308]: mismatched types --> $DIR/fn-const-param-infer.rs:25:40 diff --git a/src/test/ui/const-generics/integer-literal-generic-arg-in-where-clause.rs b/src/test/ui/const-generics/integer-literal-generic-arg-in-where-clause.rs new file mode 100644 index 0000000000..30fbfda112 --- /dev/null +++ b/src/test/ui/const-generics/integer-literal-generic-arg-in-where-clause.rs @@ -0,0 +1,18 @@ +// check-pass + +#![feature(const_generics)] +//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash + +fn takes_closure_of_array_3<F>(f: F) where F: Fn([i32; 3]) { + f([1, 2, 3]); +} + +fn takes_closure_of_array_3_apit(f: impl Fn([i32; 3])) { + f([1, 2, 3]); +} + +fn returns_closure_of_array_3() -> impl Fn([i32; 3]) { + |_| {} +} + +fn main() {} diff --git a/src/test/ui/const-generics/integer-literal-generic-arg-in-where-clause.stderr b/src/test/ui/const-generics/integer-literal-generic-arg-in-where-clause.stderr new file mode 100644 index 0000000000..7f37f3e279 --- /dev/null +++ b/src/test/ui/const-generics/integer-literal-generic-arg-in-where-clause.stderr @@ -0,0 +1,8 @@ +warning: the feature `const_generics` is incomplete and may cause the compiler to crash + --> $DIR/integer-literal-generic-arg-in-where-clause.rs:3:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + diff --git a/src/test/ui/const-generics/invalid-const-arg-for-type-param.stderr b/src/test/ui/const-generics/invalid-const-arg-for-type-param.stderr index 47b090cb88..19e7d2036b 100644 --- a/src/test/ui/const-generics/invalid-const-arg-for-type-param.stderr +++ b/src/test/ui/const-generics/invalid-const-arg-for-type-param.stderr @@ -4,7 +4,7 @@ error[E0107]: wrong number of const arguments: expected 0, found 1 LL | let _: u32 = 5i32.try_into::<32>().unwrap(); | ^^ unexpected const argument -error[E0599]: no method named `f` found for type `S` in the current scope +error[E0599]: no method named `f` found for struct `S` in the current scope --> $DIR/invalid-const-arg-for-type-param.rs:7:7 | LL | struct S; diff --git a/src/test/ui/const-generics/issues/issue-61422.rs b/src/test/ui/const-generics/issues/issue-61422.rs index 45d37b6a2f..4fa150ffef 100644 --- a/src/test/ui/const-generics/issues/issue-61422.rs +++ b/src/test/ui/const-generics/issues/issue-61422.rs @@ -5,6 +5,10 @@ use std::mem; +// Neither of the uninits below are currently accepted as not UB, however, +// this code does not run and is merely checking that we do not ICE on this pattern, +// so this is fine. + fn foo<const SIZE: usize>() { let arr: [u8; SIZE] = unsafe { #[allow(deprecated)] @@ -13,4 +17,12 @@ fn foo<const SIZE: usize>() { }; } +fn bar<const SIZE: usize>() { + let arr: [u8; SIZE] = unsafe { + let array: [u8; SIZE] = mem::MaybeUninit::uninit().assume_init(); + array + }; +} + + fn main() {} diff --git a/src/test/ui/const-generics/issues/issue-61747.rs b/src/test/ui/const-generics/issues/issue-61747.rs new file mode 100644 index 0000000000..64674bb894 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-61747.rs @@ -0,0 +1,16 @@ +// check-pass + +#![feature(const_generics)] +//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash + +struct Const<const N: usize>; + +impl<const C: usize> Const<{C}> { + fn successor() -> Const<{C + 1}> { + Const + } +} + +fn main() { + let _x: Const::<2> = Const::<1>::successor(); +} diff --git a/src/test/ui/const-generics/issues/issue-61747.stderr b/src/test/ui/const-generics/issues/issue-61747.stderr new file mode 100644 index 0000000000..ccf36a7f80 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-61747.stderr @@ -0,0 +1,8 @@ +warning: the feature `const_generics` is incomplete and may cause the compiler to crash + --> $DIR/issue-61747.rs:3:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + diff --git a/src/test/ui/const-generics/issues/issue-66205.rs b/src/test/ui/const-generics/issues/issue-66205.rs new file mode 100644 index 0000000000..2e47b4d188 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-66205.rs @@ -0,0 +1,10 @@ +// check-pass + +#![allow(incomplete_features, dead_code, unconditional_recursion)] +#![feature(const_generics)] + +fn fact<const N: usize>() { + fact::<{ N - 1 }>(); +} + +fn main() {} diff --git a/src/test/ui/consts/array-literal-index-oob.rs b/src/test/ui/consts/array-literal-index-oob.rs index 492182921b..af63d1f75a 100644 --- a/src/test/ui/consts/array-literal-index-oob.rs +++ b/src/test/ui/consts/array-literal-index-oob.rs @@ -1,5 +1,11 @@ +// build-pass +// ignore-pass (emit codegen-time warnings and verify that they are indeed warnings and not errors) + +#![warn(const_err)] + fn main() { - &{[1, 2, 3][4]}; - //~^ ERROR index out of bounds - //~| ERROR reaching this expression at runtime will panic or abort + &{ [1, 2, 3][4] }; + //~^ WARN index out of bounds + //~| WARN reaching this expression at runtime will panic or abort + //~| WARN erroneous constant used [const_err] } diff --git a/src/test/ui/consts/array-literal-index-oob.stderr b/src/test/ui/consts/array-literal-index-oob.stderr index f4d4e6f969..e93aa32478 100644 --- a/src/test/ui/consts/array-literal-index-oob.stderr +++ b/src/test/ui/consts/array-literal-index-oob.stderr @@ -1,18 +1,26 @@ -error: index out of bounds: the len is 3 but the index is 4 - --> $DIR/array-literal-index-oob.rs:2:7 +warning: index out of bounds: the len is 3 but the index is 4 + --> $DIR/array-literal-index-oob.rs:7:8 | -LL | &{[1, 2, 3][4]}; - | ^^^^^^^^^^^^ +LL | &{ [1, 2, 3][4] }; + | ^^^^^^^^^^^^ | - = note: `#[deny(const_err)]` on by default +note: lint level defined here + --> $DIR/array-literal-index-oob.rs:4:9 + | +LL | #![warn(const_err)] + | ^^^^^^^^^ -error: reaching this expression at runtime will panic or abort - --> $DIR/array-literal-index-oob.rs:2:7 +warning: reaching this expression at runtime will panic or abort + --> $DIR/array-literal-index-oob.rs:7:8 | -LL | &{[1, 2, 3][4]}; - | --^^^^^^^^^^^^- - | | - | indexing out of bounds: the len is 3 but the index is 4 +LL | &{ [1, 2, 3][4] }; + | ---^^^^^^^^^^^^-- + | | + | indexing out of bounds: the len is 3 but the index is 4 -error: aborting due to 2 previous errors +warning: erroneous constant used + --> $DIR/array-literal-index-oob.rs:7:5 + | +LL | &{ [1, 2, 3][4] }; + | ^^^^^^^^^^^^^^^^^ referenced constant has errors diff --git a/src/test/ui/consts/assoc_const_generic_impl.rs b/src/test/ui/consts/assoc_const_generic_impl.rs index 62702a8ec5..83f334dca9 100644 --- a/src/test/ui/consts/assoc_const_generic_impl.rs +++ b/src/test/ui/consts/assoc_const_generic_impl.rs @@ -1,3 +1,5 @@ +// build-fail + #![warn(const_err)] trait ZeroSized: Sized { diff --git a/src/test/ui/consts/assoc_const_generic_impl.stderr b/src/test/ui/consts/assoc_const_generic_impl.stderr index a114d5c6cc..4b13f52e76 100644 --- a/src/test/ui/consts/assoc_const_generic_impl.stderr +++ b/src/test/ui/consts/assoc_const_generic_impl.stderr @@ -1,5 +1,5 @@ warning: any use of this value will cause an error - --> $DIR/assoc_const_generic_impl.rs:9:34 + --> $DIR/assoc_const_generic_impl.rs:11:34 | LL | const I_AM_ZERO_SIZED: () = [()][std::mem::size_of::<Self>()]; | -----------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- @@ -7,13 +7,13 @@ LL | const I_AM_ZERO_SIZED: () = [()][std::mem::size_of::<Self>()]; | index out of bounds: the len is 1 but the index is 4 | note: lint level defined here - --> $DIR/assoc_const_generic_impl.rs:1:9 + --> $DIR/assoc_const_generic_impl.rs:3:9 | LL | #![warn(const_err)] | ^^^^^^^^^ error: erroneous constant encountered - --> $DIR/assoc_const_generic_impl.rs:11:18 + --> $DIR/assoc_const_generic_impl.rs:13:18 | LL | let () = Self::I_AM_ZERO_SIZED; | ^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/consts/associated_const_generic.rs b/src/test/ui/consts/associated_const_generic.rs new file mode 100644 index 0000000000..dee376cc17 --- /dev/null +++ b/src/test/ui/consts/associated_const_generic.rs @@ -0,0 +1,25 @@ +// check-pass + +trait TraitA { + const VALUE: usize; +} + +struct A; +impl TraitA for A { + const VALUE: usize = 1; +} + +trait TraitB { + type MyA: TraitA; + const VALUE: usize = Self::MyA::VALUE; +} + +struct B; +impl TraitB for B { + type MyA = A; +} + +fn main() { + let _ = [0; A::VALUE]; + let _ = [0; B::VALUE]; // Indirectly refers to `A::VALUE` +} diff --git a/src/test/ui/consts/const-address-of-interior-mut.rs b/src/test/ui/consts/const-address-of-interior-mut.rs new file mode 100644 index 0000000000..60c7c31dac --- /dev/null +++ b/src/test/ui/consts/const-address-of-interior-mut.rs @@ -0,0 +1,16 @@ +#![feature(raw_ref_op)] + +use std::cell::Cell; + +const A: () = { let x = Cell::new(2); &raw const x; }; //~ ERROR interior mutability + +static B: () = { let x = Cell::new(2); &raw const x; }; //~ ERROR interior mutability + +static mut C: () = { let x = Cell::new(2); &raw const x; }; //~ ERROR interior mutability + +const fn foo() { + let x = Cell::new(0); + let y = &raw const x; //~ ERROR interior mutability +} + +fn main() {} diff --git a/src/test/ui/consts/const-address-of-interior-mut.stderr b/src/test/ui/consts/const-address-of-interior-mut.stderr new file mode 100644 index 0000000000..f15174c33b --- /dev/null +++ b/src/test/ui/consts/const-address-of-interior-mut.stderr @@ -0,0 +1,27 @@ +error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead + --> $DIR/const-address-of-interior-mut.rs:5:39 + | +LL | const A: () = { let x = Cell::new(2); &raw const x; }; + | ^^^^^^^^^^^^ + +error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead + --> $DIR/const-address-of-interior-mut.rs:7:40 + | +LL | static B: () = { let x = Cell::new(2); &raw const x; }; + | ^^^^^^^^^^^^ + +error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead + --> $DIR/const-address-of-interior-mut.rs:9:44 + | +LL | static mut C: () = { let x = Cell::new(2); &raw const x; }; + | ^^^^^^^^^^^^ + +error[E0492]: cannot borrow a constant which may contain interior mutability, create a static instead + --> $DIR/const-address-of-interior-mut.rs:13:13 + | +LL | let y = &raw const x; + | ^^^^^^^^^^^^ + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0492`. diff --git a/src/test/ui/consts/const-address-of-mut.rs b/src/test/ui/consts/const-address-of-mut.rs new file mode 100644 index 0000000000..fe9188cb49 --- /dev/null +++ b/src/test/ui/consts/const-address-of-mut.rs @@ -0,0 +1,14 @@ +#![feature(raw_ref_op)] + +const A: () = { let mut x = 2; &raw mut x; }; //~ ERROR `&raw mut` is not allowed + +static B: () = { let mut x = 2; &raw mut x; }; //~ ERROR `&raw mut` is not allowed + +static mut C: () = { let mut x = 2; &raw mut x; }; //~ ERROR `&raw mut` is not allowed + +const fn foo() { + let mut x = 0; + let y = &raw mut x; //~ ERROR `&raw mut` is not allowed +} + +fn main() {} diff --git a/src/test/ui/consts/const-address-of-mut.stderr b/src/test/ui/consts/const-address-of-mut.stderr new file mode 100644 index 0000000000..15f2296c42 --- /dev/null +++ b/src/test/ui/consts/const-address-of-mut.stderr @@ -0,0 +1,39 @@ +error[E0658]: `&raw mut` is not allowed in constants + --> $DIR/const-address-of-mut.rs:3:32 + | +LL | const A: () = { let mut x = 2; &raw mut x; }; + | ^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable + +error[E0658]: `&raw mut` is not allowed in statics + --> $DIR/const-address-of-mut.rs:5:33 + | +LL | static B: () = { let mut x = 2; &raw mut x; }; + | ^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable + +error[E0658]: `&raw mut` is not allowed in statics + --> $DIR/const-address-of-mut.rs:7:37 + | +LL | static mut C: () = { let mut x = 2; &raw mut x; }; + | ^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable + +error[E0658]: `&raw mut` is not allowed in constant functions + --> $DIR/const-address-of-mut.rs:11:13 + | +LL | let y = &raw mut x; + | ^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/const-address-of.rs b/src/test/ui/consts/const-address-of.rs new file mode 100644 index 0000000000..ba162f2a2b --- /dev/null +++ b/src/test/ui/consts/const-address-of.rs @@ -0,0 +1,19 @@ +// check-pass + +#![feature(raw_ref_op)] + +const A: *const i32 = &raw const *&2; +static B: () = { &raw const *&2; }; +static mut C: *const i32 = &raw const *&2; +const D: () = { let x = 2; &raw const x; }; +static E: () = { let x = 2; &raw const x; }; +static mut F: () = { let x = 2; &raw const x; }; + +const fn const_ptr() { + let x = 0; + let ptr = &raw const x; + let r = &x; + let ptr2 = &raw const *r; +} + +fn main() {} diff --git a/src/test/ui/consts/const-err.rs b/src/test/ui/consts/const-err.rs index 7dfcda6905..b204f705a9 100644 --- a/src/test/ui/consts/const-err.rs +++ b/src/test/ui/consts/const-err.rs @@ -1,3 +1,4 @@ +// build-fail // compile-flags: -Zforce-overflow-checks=on #![allow(exceeding_bitshifts)] diff --git a/src/test/ui/consts/const-err.stderr b/src/test/ui/consts/const-err.stderr index 429e2ae760..495b221d7d 100644 --- a/src/test/ui/consts/const-err.stderr +++ b/src/test/ui/consts/const-err.stderr @@ -1,5 +1,5 @@ warning: any use of this value will cause an error - --> $DIR/const-err.rs:10:17 + --> $DIR/const-err.rs:11:17 | LL | const FOO: u8 = [5u8][1]; | ----------------^^^^^^^^- @@ -7,19 +7,19 @@ LL | const FOO: u8 = [5u8][1]; | index out of bounds: the len is 1 but the index is 1 | note: lint level defined here - --> $DIR/const-err.rs:4:9 + --> $DIR/const-err.rs:5:9 | LL | #![warn(const_err)] | ^^^^^^^^^ error[E0080]: erroneous constant used - --> $DIR/const-err.rs:14:16 + --> $DIR/const-err.rs:15:16 | LL | black_box((FOO, FOO)); | ^^^ referenced constant has errors error[E0080]: erroneous constant used - --> $DIR/const-err.rs:14:21 + --> $DIR/const-err.rs:15:21 | LL | black_box((FOO, FOO)); | ^^^ referenced constant has errors diff --git a/src/test/ui/consts/const-err2.rs b/src/test/ui/consts/const-err2.rs index ecbcc2a4b4..351dfd2e0f 100644 --- a/src/test/ui/consts/const-err2.rs +++ b/src/test/ui/consts/const-err2.rs @@ -1,6 +1,8 @@ // needed because negating int::MIN will behave differently between // optimized compilation and unoptimized compilation and thus would // lead to different lints being emitted + +// build-fail // compile-flags: -O #![feature(rustc_attrs)] diff --git a/src/test/ui/consts/const-err2.stderr b/src/test/ui/consts/const-err2.stderr index 1d84d44dc2..2ca1019d49 100644 --- a/src/test/ui/consts/const-err2.stderr +++ b/src/test/ui/consts/const-err2.stderr @@ -1,35 +1,35 @@ error: this expression will panic at runtime - --> $DIR/const-err2.rs:16:13 + --> $DIR/const-err2.rs:18:13 | LL | let a = -std::i8::MIN; | ^^^^^^^^^^^^^ attempt to negate with overflow | note: lint level defined here - --> $DIR/const-err2.rs:9:9 + --> $DIR/const-err2.rs:11:9 | LL | #![deny(const_err)] | ^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/const-err2.rs:18:13 + --> $DIR/const-err2.rs:20:13 | LL | let b = 200u8 + 200u8 + 200u8; | ^^^^^^^^^^^^^ attempt to add with overflow error: this expression will panic at runtime - --> $DIR/const-err2.rs:20:13 + --> $DIR/const-err2.rs:22:13 | LL | let c = 200u8 * 4; | ^^^^^^^^^ attempt to multiply with overflow error: this expression will panic at runtime - --> $DIR/const-err2.rs:22:13 + --> $DIR/const-err2.rs:24:13 | LL | let d = 42u8 - (42u8 + 1); | ^^^^^^^^^^^^^^^^^ attempt to subtract with overflow error: index out of bounds: the len is 1 but the index is 1 - --> $DIR/const-err2.rs:24:14 + --> $DIR/const-err2.rs:26:14 | LL | let _e = [5u8][1]; | ^^^^^^^^ diff --git a/src/test/ui/consts/const-err3.rs b/src/test/ui/consts/const-err3.rs index a9cf04cda7..ab3823efd3 100644 --- a/src/test/ui/consts/const-err3.rs +++ b/src/test/ui/consts/const-err3.rs @@ -1,6 +1,8 @@ // needed because negating int::MIN will behave differently between // optimized compilation and unoptimized compilation and thus would // lead to different lints being emitted + +// build-fail // compile-flags: -C overflow-checks=on -O #![feature(rustc_attrs)] diff --git a/src/test/ui/consts/const-err3.stderr b/src/test/ui/consts/const-err3.stderr index 0602707be7..c374637bec 100644 --- a/src/test/ui/consts/const-err3.stderr +++ b/src/test/ui/consts/const-err3.stderr @@ -1,35 +1,35 @@ error: attempt to negate with overflow - --> $DIR/const-err3.rs:16:13 + --> $DIR/const-err3.rs:18:13 | LL | let a = -std::i8::MIN; | ^^^^^^^^^^^^^ | note: lint level defined here - --> $DIR/const-err3.rs:9:9 + --> $DIR/const-err3.rs:11:9 | LL | #![deny(const_err)] | ^^^^^^^^^ error: attempt to add with overflow - --> $DIR/const-err3.rs:18:13 + --> $DIR/const-err3.rs:20:13 | LL | let b = 200u8 + 200u8 + 200u8; | ^^^^^^^^^^^^^ error: attempt to multiply with overflow - --> $DIR/const-err3.rs:20:13 + --> $DIR/const-err3.rs:22:13 | LL | let c = 200u8 * 4; | ^^^^^^^^^ error: attempt to subtract with overflow - --> $DIR/const-err3.rs:22:13 + --> $DIR/const-err3.rs:24:13 | LL | let d = 42u8 - (42u8 + 1); | ^^^^^^^^^^^^^^^^^ error: index out of bounds: the len is 1 but the index is 1 - --> $DIR/const-err3.rs:24:14 + --> $DIR/const-err3.rs:26:14 | LL | let _e = [5u8][1]; | ^^^^^^^^ diff --git a/src/test/ui/consts/const-eval/auxiliary/stability.rs b/src/test/ui/consts/const-eval/auxiliary/stability.rs index 830db55207..70531114f2 100644 --- a/src/test/ui/consts/const-eval/auxiliary/stability.rs +++ b/src/test/ui/consts/const-eval/auxiliary/stability.rs @@ -7,5 +7,5 @@ #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] pub const fn foo() -> u32 { 42 } diff --git a/src/test/ui/consts/const-eval/conditional_array_execution.rs b/src/test/ui/consts/const-eval/conditional_array_execution.rs index 12e51c2460..2058d2e218 100644 --- a/src/test/ui/consts/const-eval/conditional_array_execution.rs +++ b/src/test/ui/consts/const-eval/conditional_array_execution.rs @@ -1,3 +1,5 @@ +// build-fail + #![warn(const_err)] const X: u32 = 5; @@ -8,4 +10,5 @@ const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; fn main() { println!("{}", FOO); //~^ ERROR + //~| WARN erroneous constant used [const_err] } diff --git a/src/test/ui/consts/const-eval/conditional_array_execution.stderr b/src/test/ui/consts/const-eval/conditional_array_execution.stderr index 7f94d849c0..b5f5f84cf3 100644 --- a/src/test/ui/consts/const-eval/conditional_array_execution.stderr +++ b/src/test/ui/consts/const-eval/conditional_array_execution.stderr @@ -1,5 +1,5 @@ warning: any use of this value will cause an error - --> $DIR/conditional_array_execution.rs:5:19 + --> $DIR/conditional_array_execution.rs:7:19 | LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; | ------------------^^^^^--------------------------- @@ -7,13 +7,19 @@ LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; | attempt to subtract with overflow | note: lint level defined here - --> $DIR/conditional_array_execution.rs:1:9 + --> $DIR/conditional_array_execution.rs:3:9 | LL | #![warn(const_err)] | ^^^^^^^^^ error[E0080]: evaluation of constant expression failed - --> $DIR/conditional_array_execution.rs:9:20 + --> $DIR/conditional_array_execution.rs:11:20 + | +LL | println!("{}", FOO); + | ^^^ referenced constant has errors + +warning: erroneous constant used + --> $DIR/conditional_array_execution.rs:11:20 | LL | println!("{}", FOO); | ^^^ referenced constant has errors diff --git a/src/test/ui/consts/const-eval/const-eval-overflow-2.rs b/src/test/ui/consts/const-eval/const-eval-overflow-2.rs index 9369702f17..9300d9576d 100644 --- a/src/test/ui/consts/const-eval/const-eval-overflow-2.rs +++ b/src/test/ui/consts/const-eval/const-eval-overflow-2.rs @@ -14,6 +14,7 @@ fn main() { match -128i8 { NEG_NEG_128 => println!("A"), //~^ ERROR could not evaluate constant pattern + //~| ERROR could not evaluate constant pattern _ => println!("B"), } } diff --git a/src/test/ui/consts/const-eval/const-eval-overflow-2.stderr b/src/test/ui/consts/const-eval/const-eval-overflow-2.stderr index 13f00c47f6..26728cf541 100644 --- a/src/test/ui/consts/const-eval/const-eval-overflow-2.stderr +++ b/src/test/ui/consts/const-eval/const-eval-overflow-2.stderr @@ -4,5 +4,11 @@ error: could not evaluate constant pattern LL | NEG_NEG_128 => println!("A"), | ^^^^^^^^^^^ -error: aborting due to previous error +error: could not evaluate constant pattern + --> $DIR/const-eval-overflow-2.rs:15:9 + | +LL | NEG_NEG_128 => println!("A"), + | ^^^^^^^^^^^ + +error: aborting due to 2 previous errors diff --git a/src/test/ui/consts/const-eval/const_fn_ptr_fail2.rs b/src/test/ui/consts/const-eval/const_fn_ptr_fail2.rs index b300119509..81f53826d8 100644 --- a/src/test/ui/consts/const-eval/const_fn_ptr_fail2.rs +++ b/src/test/ui/consts/const-eval/const_fn_ptr_fail2.rs @@ -1,8 +1,12 @@ +// build-fail // compile-flags: -Zunleash-the-miri-inside-of-you + #![feature(const_fn)] #![allow(const_err)] -fn double(x: usize) -> usize { x * 2 } +fn double(x: usize) -> usize { + x * 2 +} const X: fn(usize) -> usize = double; const fn bar(x: fn(usize) -> usize, y: usize) -> usize { diff --git a/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr b/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr index 9d74d3b0bf..f99505c309 100644 --- a/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr +++ b/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr @@ -1,11 +1,11 @@ warning: skipping const checks - --> $DIR/const_fn_ptr_fail2.rs:9:5 + --> $DIR/const_fn_ptr_fail2.rs:13:5 | LL | x(y) | ^^^^ error[E0080]: evaluation of constant expression failed - --> $DIR/const_fn_ptr_fail2.rs:16:5 + --> $DIR/const_fn_ptr_fail2.rs:20:5 | LL | assert_eq!(Y, 4); | ^^^^^^^^^^^-^^^^^ @@ -15,7 +15,7 @@ LL | assert_eq!(Y, 4); = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error[E0080]: evaluation of constant expression failed - --> $DIR/const_fn_ptr_fail2.rs:18:5 + --> $DIR/const_fn_ptr_fail2.rs:22:5 | LL | assert_eq!(Z, 4); | ^^^^^^^^^^^-^^^^^ diff --git a/src/test/ui/consts/const-eval/const_panic.stderr b/src/test/ui/consts/const-eval/const_panic.stderr index 8a51d8aa88..1b006c69cf 100644 --- a/src/test/ui/consts/const-eval/const_panic.stderr +++ b/src/test/ui/consts/const-eval/const_panic.stderr @@ -25,7 +25,7 @@ error: any use of this value will cause an error LL | pub const X: () = unimplemented!(); | ------------------^^^^^^^^^^^^^^^^- | | - | the evaluated program panicked at 'not yet implemented', $DIR/const_panic.rs:10:19 + | the evaluated program panicked at 'not implemented', $DIR/const_panic.rs:10:19 | = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) diff --git a/src/test/ui/consts/const-eval/const_panic_libcore.stderr b/src/test/ui/consts/const-eval/const_panic_libcore.stderr index e76446f101..abc844e984 100644 --- a/src/test/ui/consts/const-eval/const_panic_libcore.stderr +++ b/src/test/ui/consts/const-eval/const_panic_libcore.stderr @@ -25,7 +25,7 @@ error: any use of this value will cause an error LL | const X: () = unimplemented!(); | --------------^^^^^^^^^^^^^^^^- | | - | the evaluated program panicked at 'not yet implemented', $DIR/const_panic_libcore.rs:11:15 + | the evaluated program panicked at 'not implemented', $DIR/const_panic_libcore.rs:11:15 | = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) diff --git a/src/test/ui/consts/const-eval/const_panic_libcore_main.stderr b/src/test/ui/consts/const-eval/const_panic_libcore_main.stderr index 22d173ad0c..24ddefe01b 100644 --- a/src/test/ui/consts/const-eval/const_panic_libcore_main.stderr +++ b/src/test/ui/consts/const-eval/const_panic_libcore_main.stderr @@ -25,7 +25,7 @@ error: any use of this value will cause an error LL | const X: () = unimplemented!(); | --------------^^^^^^^^^^^^^^^^- | | - | the evaluated program panicked at 'not yet implemented', $DIR/const_panic_libcore_main.rs:15:15 + | the evaluated program panicked at 'not implemented', $DIR/const_panic_libcore_main.rs:15:15 | = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) diff --git a/src/test/ui/consts/const-eval/dont_promote_unstable_const_fn.rs b/src/test/ui/consts/const-eval/dont_promote_unstable_const_fn.rs index c4b89b50bc..3729285956 100644 --- a/src/test/ui/consts/const-eval/dont_promote_unstable_const_fn.rs +++ b/src/test/ui/consts/const-eval/dont_promote_unstable_const_fn.rs @@ -1,13 +1,13 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(const_fn)] #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] const fn foo() -> u32 { 42 } fn meh() -> u32 { 42 } diff --git a/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.rs b/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.rs index f6ab0bd7db..2a983e4268 100644 --- a/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.rs +++ b/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.rs @@ -1,3 +1,5 @@ +// build-fail + // Regression test for #66975 #![warn(const_err)] #![feature(never_type)] diff --git a/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.stderr b/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.stderr index 24830f7344..e664a4aab3 100644 --- a/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.stderr +++ b/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.stderr @@ -1,5 +1,5 @@ warning: any use of this value will cause an error - --> $DIR/index-out-of-bounds-never-type.rs:8:61 + --> $DIR/index-out-of-bounds-never-type.rs:10:61 | LL | const VOID: ! = { let x = 0 * std::mem::size_of::<T>(); [][x] }; | --------------------------------------------------------^^^^^--- @@ -7,13 +7,13 @@ LL | const VOID: ! = { let x = 0 * std::mem::size_of::<T>(); [][x] }; | index out of bounds: the len is 0 but the index is 0 | note: lint level defined here - --> $DIR/index-out-of-bounds-never-type.rs:2:9 + --> $DIR/index-out-of-bounds-never-type.rs:4:9 | LL | #![warn(const_err)] | ^^^^^^^^^ error: erroneous constant encountered - --> $DIR/index-out-of-bounds-never-type.rs:13:13 + --> $DIR/index-out-of-bounds-never-type.rs:15:13 | LL | let _ = PrintName::<T>::VOID; | ^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/consts/const-eval/index_out_of_bounds_propagated.rs b/src/test/ui/consts/const-eval/index_out_of_bounds_propagated.rs index 4b487c09a1..6d6bb94d4d 100644 --- a/src/test/ui/consts/const-eval/index_out_of_bounds_propagated.rs +++ b/src/test/ui/consts/const-eval/index_out_of_bounds_propagated.rs @@ -1,3 +1,5 @@ +// build-fail + fn main() { let array = [std::env::args().len()]; array[1]; //~ ERROR index out of bounds diff --git a/src/test/ui/consts/const-eval/index_out_of_bounds_propagated.stderr b/src/test/ui/consts/const-eval/index_out_of_bounds_propagated.stderr index f330f9caaa..9519ccd3c2 100644 --- a/src/test/ui/consts/const-eval/index_out_of_bounds_propagated.stderr +++ b/src/test/ui/consts/const-eval/index_out_of_bounds_propagated.stderr @@ -1,5 +1,5 @@ error: index out of bounds: the len is 1 but the index is 1 - --> $DIR/index_out_of_bounds_propagated.rs:3:5 + --> $DIR/index_out_of_bounds_propagated.rs:5:5 | LL | array[1]; | ^^^^^^^^ diff --git a/src/test/ui/consts/const-eval/issue-43197.rs b/src/test/ui/consts/const-eval/issue-43197.rs index 440862090b..9109307632 100644 --- a/src/test/ui/consts/const-eval/issue-43197.rs +++ b/src/test/ui/consts/const-eval/issue-43197.rs @@ -1,3 +1,5 @@ +// build-fail + #![warn(const_err)] const fn foo(x: u32) -> u32 { @@ -5,11 +7,13 @@ const fn foo(x: u32) -> u32 { } fn main() { - const X: u32 = 0-1; + const X: u32 = 0 - 1; //~^ WARN any use of this value will cause - const Y: u32 = foo(0-1); + const Y: u32 = foo(0 - 1); //~^ WARN any use of this value will cause println!("{} {}", X, Y); //~^ ERROR evaluation of constant expression failed //~| ERROR evaluation of constant expression failed + //~| WARN erroneous constant used [const_err] + //~| WARN erroneous constant used [const_err] } diff --git a/src/test/ui/consts/const-eval/issue-43197.stderr b/src/test/ui/consts/const-eval/issue-43197.stderr index d971d825f2..23b54d954c 100644 --- a/src/test/ui/consts/const-eval/issue-43197.stderr +++ b/src/test/ui/consts/const-eval/issue-43197.stderr @@ -1,33 +1,45 @@ warning: any use of this value will cause an error - --> $DIR/issue-43197.rs:8:20 + --> $DIR/issue-43197.rs:10:20 | -LL | const X: u32 = 0-1; - | ---------------^^^- +LL | const X: u32 = 0 - 1; + | ---------------^^^^^- | | | attempt to subtract with overflow | note: lint level defined here - --> $DIR/issue-43197.rs:1:9 + --> $DIR/issue-43197.rs:3:9 | LL | #![warn(const_err)] | ^^^^^^^^^ warning: any use of this value will cause an error - --> $DIR/issue-43197.rs:10:24 + --> $DIR/issue-43197.rs:12:24 | -LL | const Y: u32 = foo(0-1); - | -------------------^^^-- +LL | const Y: u32 = foo(0 - 1); + | -------------------^^^^^-- | | | attempt to subtract with overflow error[E0080]: evaluation of constant expression failed - --> $DIR/issue-43197.rs:12:23 + --> $DIR/issue-43197.rs:14:23 + | +LL | println!("{} {}", X, Y); + | ^ referenced constant has errors + +warning: erroneous constant used + --> $DIR/issue-43197.rs:14:23 | LL | println!("{} {}", X, Y); | ^ referenced constant has errors error[E0080]: evaluation of constant expression failed - --> $DIR/issue-43197.rs:12:26 + --> $DIR/issue-43197.rs:14:26 + | +LL | println!("{} {}", X, Y); + | ^ referenced constant has errors + +warning: erroneous constant used + --> $DIR/issue-43197.rs:14:26 | LL | println!("{} {}", X, Y); | ^ referenced constant has errors diff --git a/src/test/ui/consts/const-eval/issue-44578.rs b/src/test/ui/consts/const-eval/issue-44578.rs index 4d93130f2a..f9194709dc 100644 --- a/src/test/ui/consts/const-eval/issue-44578.rs +++ b/src/test/ui/consts/const-eval/issue-44578.rs @@ -1,3 +1,5 @@ +// build-fail + #![allow(const_err)] trait Foo { @@ -23,5 +25,5 @@ impl Foo for u16 { fn main() { println!("{}", <Bar<u16, u8> as Foo>::AMT); - //~^ ERROR E0080 + //~^ ERROR evaluation of constant expression failed [E0080] } diff --git a/src/test/ui/consts/const-eval/issue-44578.stderr b/src/test/ui/consts/const-eval/issue-44578.stderr index 3fadeac1d5..f4323713e6 100644 --- a/src/test/ui/consts/const-eval/issue-44578.stderr +++ b/src/test/ui/consts/const-eval/issue-44578.stderr @@ -1,5 +1,5 @@ error[E0080]: evaluation of constant expression failed - --> $DIR/issue-44578.rs:25:20 + --> $DIR/issue-44578.rs:27:20 | LL | println!("{}", <Bar<u16, u8> as Foo>::AMT); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors diff --git a/src/test/ui/consts/const-eval/issue-50814-2.rs b/src/test/ui/consts/const-eval/issue-50814-2.rs index b13c19c660..8f5c8f097a 100644 --- a/src/test/ui/consts/const-eval/issue-50814-2.rs +++ b/src/test/ui/consts/const-eval/issue-50814-2.rs @@ -1,3 +1,5 @@ +// build-fail + trait C { const BOO: usize; } diff --git a/src/test/ui/consts/const-eval/issue-50814-2.stderr b/src/test/ui/consts/const-eval/issue-50814-2.stderr index d68f72d36e..e04bf03a20 100644 --- a/src/test/ui/consts/const-eval/issue-50814-2.stderr +++ b/src/test/ui/consts/const-eval/issue-50814-2.stderr @@ -1,5 +1,5 @@ error: any use of this value will cause an error - --> $DIR/issue-50814-2.rs:12:24 + --> $DIR/issue-50814-2.rs:14:24 | LL | const BAR: usize = [5, 6, 7][T::BOO]; | -------------------^^^^^^^^^^^^^^^^^- @@ -9,7 +9,7 @@ LL | const BAR: usize = [5, 6, 7][T::BOO]; = note: `#[deny(const_err)]` on by default error[E0080]: evaluation of constant expression failed - --> $DIR/issue-50814-2.rs:16:5 + --> $DIR/issue-50814-2.rs:18:5 | LL | &<A<T> as Foo<T>>::BAR | ^--------------------- diff --git a/src/test/ui/consts/const-eval/issue-50814.rs b/src/test/ui/consts/const-eval/issue-50814.rs index b85cecda16..5c3635e465 100644 --- a/src/test/ui/consts/const-eval/issue-50814.rs +++ b/src/test/ui/consts/const-eval/issue-50814.rs @@ -1,3 +1,5 @@ +// build-fail + trait Unsigned { const MAX: u8; } @@ -10,11 +12,13 @@ impl Unsigned for U8 { struct Sum<A,B>(A,B); impl<A: Unsigned, B: Unsigned> Unsigned for Sum<A,B> { - const MAX: u8 = A::MAX + B::MAX; //~ ERROR any use of this value will cause an error + const MAX: u8 = A::MAX + B::MAX; + //~^ ERROR any use of this value will cause an error [const_err] } fn foo<T>(_: T) -> &'static u8 { - &Sum::<U8,U8>::MAX //~ ERROR E0080 + &Sum::<U8,U8>::MAX + //~^ ERROR E0080 } fn main() { diff --git a/src/test/ui/consts/const-eval/issue-50814.stderr b/src/test/ui/consts/const-eval/issue-50814.stderr index 707dfee7cd..2e5167a99a 100644 --- a/src/test/ui/consts/const-eval/issue-50814.stderr +++ b/src/test/ui/consts/const-eval/issue-50814.stderr @@ -1,5 +1,5 @@ error: any use of this value will cause an error - --> $DIR/issue-50814.rs:13:21 + --> $DIR/issue-50814.rs:15:21 | LL | const MAX: u8 = A::MAX + B::MAX; | ----------------^^^^^^^^^^^^^^^- @@ -9,7 +9,7 @@ LL | const MAX: u8 = A::MAX + B::MAX; = note: `#[deny(const_err)]` on by default error[E0080]: evaluation of constant expression failed - --> $DIR/issue-50814.rs:17:5 + --> $DIR/issue-50814.rs:20:5 | LL | &Sum::<U8,U8>::MAX | ^----------------- diff --git a/src/test/ui/consts/const-eval/panic-assoc-never-type.rs b/src/test/ui/consts/const-eval/panic-assoc-never-type.rs index a7cbdb40ef..21ee64fa6d 100644 --- a/src/test/ui/consts/const-eval/panic-assoc-never-type.rs +++ b/src/test/ui/consts/const-eval/panic-assoc-never-type.rs @@ -1,3 +1,5 @@ +// build-fail + // Regression test for #66975 #![warn(const_err)] #![feature(const_panic)] diff --git a/src/test/ui/consts/const-eval/panic-assoc-never-type.stderr b/src/test/ui/consts/const-eval/panic-assoc-never-type.stderr index e15952c20e..575c3648b7 100644 --- a/src/test/ui/consts/const-eval/panic-assoc-never-type.stderr +++ b/src/test/ui/consts/const-eval/panic-assoc-never-type.stderr @@ -1,20 +1,20 @@ warning: any use of this value will cause an error - --> $DIR/panic-assoc-never-type.rs:9:21 + --> $DIR/panic-assoc-never-type.rs:11:21 | LL | const VOID: ! = panic!(); | ----------------^^^^^^^^- | | - | the evaluated program panicked at 'explicit panic', $DIR/panic-assoc-never-type.rs:9:21 + | the evaluated program panicked at 'explicit panic', $DIR/panic-assoc-never-type.rs:11:21 | note: lint level defined here - --> $DIR/panic-assoc-never-type.rs:2:9 + --> $DIR/panic-assoc-never-type.rs:4:9 | LL | #![warn(const_err)] | ^^^^^^^^^ = note: this warning originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error[E0080]: erroneous constant used - --> $DIR/panic-assoc-never-type.rs:14:13 + --> $DIR/panic-assoc-never-type.rs:16:13 | LL | let _ = PrintName::VOID; | ^^^^^^^^^^^^^^^ referenced constant has errors diff --git a/src/test/ui/consts/const-eval/panic-never-type.rs b/src/test/ui/consts/const-eval/panic-never-type.rs index b1a7d8ae67..3b28b2fdd2 100644 --- a/src/test/ui/consts/const-eval/panic-never-type.rs +++ b/src/test/ui/consts/const-eval/panic-never-type.rs @@ -1,3 +1,5 @@ +// build-fail + // Regression test for #66975 #![warn(const_err)] #![feature(const_panic)] diff --git a/src/test/ui/consts/const-eval/panic-never-type.stderr b/src/test/ui/consts/const-eval/panic-never-type.stderr index 9e91fdf451..4d1686a8d8 100644 --- a/src/test/ui/consts/const-eval/panic-never-type.stderr +++ b/src/test/ui/consts/const-eval/panic-never-type.stderr @@ -1,20 +1,20 @@ warning: any use of this value will cause an error - --> $DIR/panic-never-type.rs:6:17 + --> $DIR/panic-never-type.rs:8:17 | LL | const VOID: ! = panic!(); | ----------------^^^^^^^^- | | - | the evaluated program panicked at 'explicit panic', $DIR/panic-never-type.rs:6:17 + | the evaluated program panicked at 'explicit panic', $DIR/panic-never-type.rs:8:17 | note: lint level defined here - --> $DIR/panic-never-type.rs:2:9 + --> $DIR/panic-never-type.rs:4:9 | LL | #![warn(const_err)] | ^^^^^^^^^ = note: this warning originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error[E0080]: erroneous constant used - --> $DIR/panic-never-type.rs:10:13 + --> $DIR/panic-never-type.rs:12:13 | LL | let _ = VOID; | ^^^^ referenced constant has errors diff --git a/src/test/ui/consts/const-eval/promoted_errors.rs b/src/test/ui/consts/const-eval/promoted_errors.rs index dfa6863082..22f863fb15 100644 --- a/src/test/ui/consts/const-eval/promoted_errors.rs +++ b/src/test/ui/consts/const-eval/promoted_errors.rs @@ -1,19 +1,23 @@ +// build-pass +// ignore-pass (emit codegen-time warnings and verify that they are indeed warnings and not errors) // compile-flags: -O -#![deny(const_err)] +#![warn(const_err)] fn main() { println!("{}", 0u32 - 1); let _x = 0u32 - 1; - //~^ ERROR const_err - println!("{}", 1/(1-1)); - //~^ ERROR attempt to divide by zero [const_err] - //~| ERROR const_err - let _x = 1/(1-1); - //~^ ERROR const_err - println!("{}", 1/(false as u32)); - //~^ ERROR attempt to divide by zero [const_err] - //~| ERROR const_err - let _x = 1/(false as u32); - //~^ ERROR const_err + //~^ WARN const_err + println!("{}", 1 / (1 - 1)); + //~^ WARN attempt to divide by zero [const_err] + //~| WARN const_err + //~| WARN erroneous constant used [const_err] + let _x = 1 / (1 - 1); + //~^ WARN const_err + println!("{}", 1 / (false as u32)); + //~^ WARN attempt to divide by zero [const_err] + //~| WARN const_err + //~| WARN erroneous constant used [const_err] + let _x = 1 / (false as u32); + //~^ WARN const_err } diff --git a/src/test/ui/consts/const-eval/promoted_errors.stderr b/src/test/ui/consts/const-eval/promoted_errors.stderr index 848a880ba4..b4330deb3e 100644 --- a/src/test/ui/consts/const-eval/promoted_errors.stderr +++ b/src/test/ui/consts/const-eval/promoted_errors.stderr @@ -1,50 +1,60 @@ -error: this expression will panic at runtime - --> $DIR/promoted_errors.rs:7:14 +warning: this expression will panic at runtime + --> $DIR/promoted_errors.rs:9:14 | LL | let _x = 0u32 - 1; | ^^^^^^^^ attempt to subtract with overflow | note: lint level defined here - --> $DIR/promoted_errors.rs:3:9 + --> $DIR/promoted_errors.rs:5:9 | -LL | #![deny(const_err)] +LL | #![warn(const_err)] | ^^^^^^^^^ -error: attempt to divide by zero - --> $DIR/promoted_errors.rs:9:20 +warning: attempt to divide by zero + --> $DIR/promoted_errors.rs:11:20 | -LL | println!("{}", 1/(1-1)); - | ^^^^^^^ +LL | println!("{}", 1 / (1 - 1)); + | ^^^^^^^^^^^ -error: reaching this expression at runtime will panic or abort - --> $DIR/promoted_errors.rs:9:20 +warning: reaching this expression at runtime will panic or abort + --> $DIR/promoted_errors.rs:11:20 | -LL | println!("{}", 1/(1-1)); - | ^^^^^^^ dividing by zero +LL | println!("{}", 1 / (1 - 1)); + | ^^^^^^^^^^^ dividing by zero -error: attempt to divide by zero - --> $DIR/promoted_errors.rs:12:14 +warning: erroneous constant used + --> $DIR/promoted_errors.rs:11:20 | -LL | let _x = 1/(1-1); - | ^^^^^^^ +LL | println!("{}", 1 / (1 - 1)); + | ^^^^^^^^^^^ referenced constant has errors -error: attempt to divide by zero - --> $DIR/promoted_errors.rs:14:20 +warning: attempt to divide by zero + --> $DIR/promoted_errors.rs:15:14 | -LL | println!("{}", 1/(false as u32)); - | ^^^^^^^^^^^^^^^^ +LL | let _x = 1 / (1 - 1); + | ^^^^^^^^^^^ -error: reaching this expression at runtime will panic or abort - --> $DIR/promoted_errors.rs:14:20 +warning: attempt to divide by zero + --> $DIR/promoted_errors.rs:17:20 | -LL | println!("{}", 1/(false as u32)); - | ^^^^^^^^^^^^^^^^ dividing by zero +LL | println!("{}", 1 / (false as u32)); + | ^^^^^^^^^^^^^^^^^^ -error: attempt to divide by zero - --> $DIR/promoted_errors.rs:17:14 +warning: reaching this expression at runtime will panic or abort + --> $DIR/promoted_errors.rs:17:20 | -LL | let _x = 1/(false as u32); - | ^^^^^^^^^^^^^^^^ +LL | println!("{}", 1 / (false as u32)); + | ^^^^^^^^^^^^^^^^^^ dividing by zero -error: aborting due to 7 previous errors +warning: erroneous constant used + --> $DIR/promoted_errors.rs:17:20 + | +LL | println!("{}", 1 / (false as u32)); + | ^^^^^^^^^^^^^^^^^^ referenced constant has errors + +warning: attempt to divide by zero + --> $DIR/promoted_errors.rs:21:14 + | +LL | let _x = 1 / (false as u32); + | ^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/consts/const-eval/promoted_errors2.rs b/src/test/ui/consts/const-eval/promoted_errors2.rs index 58b1794091..62c77f76d9 100644 --- a/src/test/ui/consts/const-eval/promoted_errors2.rs +++ b/src/test/ui/consts/const-eval/promoted_errors2.rs @@ -1,20 +1,24 @@ +// build-pass +// ignore-pass (emit codegen-time warnings and verify that they are indeed warnings and not errors) // compile-flags: -C overflow-checks=on -O -#![deny(const_err)] +#![warn(const_err)] fn main() { println!("{}", 0u32 - 1); - //~^ ERROR attempt to subtract with overflow + //~^ WARN attempt to subtract with overflow let _x = 0u32 - 1; - //~^ ERROR attempt to subtract with overflow - println!("{}", 1/(1-1)); - //~^ ERROR attempt to divide by zero [const_err] - //~| ERROR const_err - let _x = 1/(1-1); - //~^ ERROR const_err - println!("{}", 1/(false as u32)); - //~^ ERROR attempt to divide by zero [const_err] - //~| ERROR const_err - let _x = 1/(false as u32); - //~^ ERROR const_err + //~^ WARN attempt to subtract with overflow + println!("{}", 1 / (1 - 1)); + //~^ WARN attempt to divide by zero [const_err] + //~| WARN const_err + //~| WARN erroneous constant used [const_err] + let _x = 1 / (1 - 1); + //~^ WARN const_err + println!("{}", 1 / (false as u32)); + //~^ WARN attempt to divide by zero [const_err] + //~| WARN const_err + //~| WARN erroneous constant used [const_err] + let _x = 1 / (false as u32); + //~^ WARN const_err } diff --git a/src/test/ui/consts/const-eval/promoted_errors2.stderr b/src/test/ui/consts/const-eval/promoted_errors2.stderr index 6f4b1c045f..a4dad295ed 100644 --- a/src/test/ui/consts/const-eval/promoted_errors2.stderr +++ b/src/test/ui/consts/const-eval/promoted_errors2.stderr @@ -1,56 +1,66 @@ -error: attempt to subtract with overflow - --> $DIR/promoted_errors2.rs:6:20 +warning: attempt to subtract with overflow + --> $DIR/promoted_errors2.rs:8:20 | LL | println!("{}", 0u32 - 1); | ^^^^^^^^ | note: lint level defined here - --> $DIR/promoted_errors2.rs:3:9 + --> $DIR/promoted_errors2.rs:5:9 | -LL | #![deny(const_err)] +LL | #![warn(const_err)] | ^^^^^^^^^ -error: attempt to subtract with overflow - --> $DIR/promoted_errors2.rs:8:14 +warning: attempt to subtract with overflow + --> $DIR/promoted_errors2.rs:10:14 | LL | let _x = 0u32 - 1; | ^^^^^^^^ -error: attempt to divide by zero - --> $DIR/promoted_errors2.rs:10:20 +warning: attempt to divide by zero + --> $DIR/promoted_errors2.rs:12:20 | -LL | println!("{}", 1/(1-1)); - | ^^^^^^^ +LL | println!("{}", 1 / (1 - 1)); + | ^^^^^^^^^^^ -error: reaching this expression at runtime will panic or abort - --> $DIR/promoted_errors2.rs:10:20 +warning: reaching this expression at runtime will panic or abort + --> $DIR/promoted_errors2.rs:12:20 | -LL | println!("{}", 1/(1-1)); - | ^^^^^^^ dividing by zero +LL | println!("{}", 1 / (1 - 1)); + | ^^^^^^^^^^^ dividing by zero -error: attempt to divide by zero - --> $DIR/promoted_errors2.rs:13:14 +warning: erroneous constant used + --> $DIR/promoted_errors2.rs:12:20 | -LL | let _x = 1/(1-1); - | ^^^^^^^ +LL | println!("{}", 1 / (1 - 1)); + | ^^^^^^^^^^^ referenced constant has errors -error: attempt to divide by zero - --> $DIR/promoted_errors2.rs:15:20 +warning: attempt to divide by zero + --> $DIR/promoted_errors2.rs:16:14 | -LL | println!("{}", 1/(false as u32)); - | ^^^^^^^^^^^^^^^^ +LL | let _x = 1 / (1 - 1); + | ^^^^^^^^^^^ -error: reaching this expression at runtime will panic or abort - --> $DIR/promoted_errors2.rs:15:20 +warning: attempt to divide by zero + --> $DIR/promoted_errors2.rs:18:20 | -LL | println!("{}", 1/(false as u32)); - | ^^^^^^^^^^^^^^^^ dividing by zero +LL | println!("{}", 1 / (false as u32)); + | ^^^^^^^^^^^^^^^^^^ -error: attempt to divide by zero - --> $DIR/promoted_errors2.rs:18:14 +warning: reaching this expression at runtime will panic or abort + --> $DIR/promoted_errors2.rs:18:20 | -LL | let _x = 1/(false as u32); - | ^^^^^^^^^^^^^^^^ +LL | println!("{}", 1 / (false as u32)); + | ^^^^^^^^^^^^^^^^^^ dividing by zero -error: aborting due to 8 previous errors +warning: erroneous constant used + --> $DIR/promoted_errors2.rs:18:20 + | +LL | println!("{}", 1 / (false as u32)); + | ^^^^^^^^^^^^^^^^^^ referenced constant has errors + +warning: attempt to divide by zero + --> $DIR/promoted_errors2.rs:22:14 + | +LL | let _x = 1 / (false as u32); + | ^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/consts/const-eval/ref_to_int_match.rs b/src/test/ui/consts/const-eval/ref_to_int_match.rs index 45ce040fb9..87136a109d 100644 --- a/src/test/ui/consts/const-eval/ref_to_int_match.rs +++ b/src/test/ui/consts/const-eval/ref_to_int_match.rs @@ -5,6 +5,7 @@ fn main() { match n { 0..=10 => {}, 10..=BAR => {}, //~ ERROR could not evaluate constant pattern + //~| ERROR could not evaluate constant pattern _ => {}, } } diff --git a/src/test/ui/consts/const-eval/ref_to_int_match.stderr b/src/test/ui/consts/const-eval/ref_to_int_match.stderr index b72a5b80af..17f8744ed9 100644 --- a/src/test/ui/consts/const-eval/ref_to_int_match.stderr +++ b/src/test/ui/consts/const-eval/ref_to_int_match.stderr @@ -1,5 +1,5 @@ error[E0080]: it is undefined behavior to use this value - --> $DIR/ref_to_int_match.rs:24:1 + --> $DIR/ref_to_int_match.rs:25:1 | LL | const BAR: Int = unsafe { Foo { r: &42 }.f }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a pointer, but expected initialized plain (non-pointer) bytes @@ -12,6 +12,12 @@ error: could not evaluate constant pattern LL | 10..=BAR => {}, | ^^^ -error: aborting due to 2 previous errors +error: could not evaluate constant pattern + --> $DIR/ref_to_int_match.rs:7:14 + | +LL | 10..=BAR => {}, + | ^^^ + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/const-eval/simd/insert_extract.rs b/src/test/ui/consts/const-eval/simd/insert_extract.rs index d3462d802e..92231d4ced 100644 --- a/src/test/ui/consts/const-eval/simd/insert_extract.rs +++ b/src/test/ui/consts/const-eval/simd/insert_extract.rs @@ -2,6 +2,8 @@ #![feature(const_fn)] #![feature(repr_simd)] #![feature(platform_intrinsics)] +#![feature(staged_api)] +#![stable(feature = "foo", since = "1.33.7")] #![allow(non_camel_case_types)] #[repr(simd)] struct i8x1(i8); @@ -9,7 +11,9 @@ #[repr(simd)] struct f32x3(f32, f32, f32); extern "platform-intrinsic" { + #[rustc_const_stable(feature = "foo", since = "1.3.37")] fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T; + #[rustc_const_stable(feature = "foo", since = "1.3.37")] fn simd_extract<T, U>(x: T, idx: u32) -> U; } diff --git a/src/test/ui/consts/const-eval/ub-nonnull.stderr b/src/test/ui/consts/const-eval/ub-nonnull.stderr index 80d80a9867..c2446d1404 100644 --- a/src/test/ui/consts/const-eval/ub-nonnull.stderr +++ b/src/test/ui/consts/const-eval/ub-nonnull.stderr @@ -13,7 +13,7 @@ LL | / const OUT_OF_BOUNDS_PTR: NonNull<u8> = { unsafe { LL | | let ptr: &[u8; 256] = mem::transmute(&0u8); // &0 gets promoted so it does not dangle LL | | // Use address-of-element for pointer arithmetic. This could wrap around to NULL! LL | | let out_of_bounds_ptr = &ptr[255]; - | | ^^^^^^^^^ Memory access failed: pointer must be in-bounds at offset 256, but is outside bounds of allocation 6 which has size 1 + | | ^^^^^^^^^ Memory access failed: pointer must be in-bounds at offset 256, but is outside bounds of allocation 8 which has size 1 LL | | mem::transmute(out_of_bounds_ptr) LL | | } }; | |____- diff --git a/src/test/ui/consts/const-eval/ub-wide-ptr.rs b/src/test/ui/consts/const-eval/ub-wide-ptr.rs index 1f810c4057..a5c2a57c6c 100644 --- a/src/test/ui/consts/const-eval/ub-wide-ptr.rs +++ b/src/test/ui/consts/const-eval/ub-wide-ptr.rs @@ -2,7 +2,6 @@ #![allow(unused)] #![allow(const_err)] // make sure we cannot allow away the errors tested here -// normalize-stderr-test "alignment \d+" -> "alignment N" // normalize-stderr-test "offset \d+" -> "offset N" // normalize-stderr-test "allocation \d+" -> "allocation N" // normalize-stderr-test "size \d+" -> "size N" @@ -149,11 +148,23 @@ const TRAIT_OBJ_CONTENT_INVALID: &dyn Trait = &unsafe { BoolTransmute { val: 3 } //~^ ERROR it is undefined behavior to use this value // # raw trait object -const RAW_TRAIT_OBJ_VTABLE_NULL: *const dyn Trait = unsafe { DynTransmute { bad: BadDynRepr { ptr: &92, vtable: 0 } }.rust}; +const RAW_TRAIT_OBJ_VTABLE_NULL: *const dyn Trait = unsafe { DynTransmute { bad: BadDynRepr { ptr: &92, vtable: 0 } }.raw_rust}; //~^ ERROR it is undefined behavior to use this value const RAW_TRAIT_OBJ_VTABLE_INVALID: *const dyn Trait = unsafe { DynTransmute { repr2: DynRepr2 { ptr: &92, vtable: &3 } }.raw_rust}; //~^ ERROR it is undefined behavior to use this value const RAW_TRAIT_OBJ_CONTENT_INVALID: *const dyn Trait = &unsafe { BoolTransmute { val: 3 }.bl } as *const _; // ok because raw +// Const eval fails for these, so they need to be statics to error. +static mut RAW_TRAIT_OBJ_VTABLE_NULL_THROUGH_REF: *const dyn Trait = unsafe { + DynTransmute { bad: BadDynRepr { ptr: &92, vtable: 0 } }.rust + //~^ ERROR could not evaluate static initializer +}; +static mut RAW_TRAIT_OBJ_VTABLE_INVALID_THROUGH_REF: *const dyn Trait = unsafe { + DynTransmute { repr2: DynRepr2 { ptr: &92, vtable: &3 } }.rust + //~^ ERROR could not evaluate static initializer +}; + fn main() { + let _ = RAW_TRAIT_OBJ_VTABLE_NULL; + let _ = RAW_TRAIT_OBJ_VTABLE_INVALID; } diff --git a/src/test/ui/consts/const-eval/ub-wide-ptr.stderr b/src/test/ui/consts/const-eval/ub-wide-ptr.stderr index 85fb8ac2a4..ce57d680dc 100644 --- a/src/test/ui/consts/const-eval/ub-wide-ptr.stderr +++ b/src/test/ui/consts/const-eval/ub-wide-ptr.stderr @@ -1,5 +1,5 @@ error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:87:1 + --> $DIR/ub-wide-ptr.rs:86:1 | LL | const STR_TOO_LONG: &str = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len: 999 } }.str}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling reference (not entirely in bounds) @@ -7,7 +7,7 @@ LL | const STR_TOO_LONG: &str = unsafe { SliceTransmute { repr: SliceRepr { ptr: = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:90:1 + --> $DIR/ub-wide-ptr.rs:89:1 | LL | const STR_LENGTH_PTR: &str = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len: &3 } }.str}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered non-integer slice length in wide pointer @@ -15,7 +15,7 @@ LL | const STR_LENGTH_PTR: &str = unsafe { SliceTransmute { bad: BadSliceRepr { = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:93:1 + --> $DIR/ub-wide-ptr.rs:92:1 | LL | const MY_STR_LENGTH_PTR: &MyStr = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len: &3 } }.my_str}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered non-integer slice length in wide pointer @@ -23,7 +23,7 @@ LL | const MY_STR_LENGTH_PTR: &MyStr = unsafe { SliceTransmute { bad: BadSliceRe = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:97:1 + --> $DIR/ub-wide-ptr.rs:96:1 | LL | const STR_NO_UTF8: &str = unsafe { SliceTransmute { slice: &[0xFF] }.str }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered uninitialized or non-UTF-8 data in str at .<deref> @@ -31,7 +31,7 @@ LL | const STR_NO_UTF8: &str = unsafe { SliceTransmute { slice: &[0xFF] }.str }; = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:100:1 + --> $DIR/ub-wide-ptr.rs:99:1 | LL | const MYSTR_NO_UTF8: &MyStr = unsafe { SliceTransmute { slice: &[0xFF] }.my_str }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered uninitialized or non-UTF-8 data in str at .<deref>.0 @@ -39,7 +39,7 @@ LL | const MYSTR_NO_UTF8: &MyStr = unsafe { SliceTransmute { slice: &[0xFF] }.my = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:107:1 + --> $DIR/ub-wide-ptr.rs:106:1 | LL | const SLICE_LENGTH_UNINIT: &[u8] = unsafe { SliceTransmute { addr: 42 }.slice}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered undefined pointer @@ -47,7 +47,7 @@ LL | const SLICE_LENGTH_UNINIT: &[u8] = unsafe { SliceTransmute { addr: 42 }.sli = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:110:1 + --> $DIR/ub-wide-ptr.rs:109:1 | LL | const SLICE_TOO_LONG: &[u8] = unsafe { SliceTransmute { repr: SliceRepr { ptr: &42, len: 999 } }.slice}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling reference (not entirely in bounds) @@ -55,7 +55,7 @@ LL | const SLICE_TOO_LONG: &[u8] = unsafe { SliceTransmute { repr: SliceRepr { p = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:113:1 + --> $DIR/ub-wide-ptr.rs:112:1 | LL | const SLICE_LENGTH_PTR: &[u8] = unsafe { SliceTransmute { bad: BadSliceRepr { ptr: &42, len: &3 } }.slice}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered non-integer slice length in wide pointer @@ -63,7 +63,7 @@ LL | const SLICE_LENGTH_PTR: &[u8] = unsafe { SliceTransmute { bad: BadSliceRepr = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:117:1 + --> $DIR/ub-wide-ptr.rs:116:1 | LL | const SLICE_CONTENT_INVALID: &[bool] = &[unsafe { BoolTransmute { val: 3 }.bl }]; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .<deref>[0], but expected something less or equal to 1 @@ -71,7 +71,7 @@ LL | const SLICE_CONTENT_INVALID: &[bool] = &[unsafe { BoolTransmute { val: 3 }. = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:123:1 + --> $DIR/ub-wide-ptr.rs:122:1 | LL | const MYSLICE_PREFIX_BAD: &MySliceBool = &MySlice(unsafe { BoolTransmute { val: 3 }.bl }, [false]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .<deref>.0, but expected something less or equal to 1 @@ -79,7 +79,7 @@ LL | const MYSLICE_PREFIX_BAD: &MySliceBool = &MySlice(unsafe { BoolTransmute { = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:126:1 + --> $DIR/ub-wide-ptr.rs:125:1 | LL | const MYSLICE_SUFFIX_BAD: &MySliceBool = &MySlice(true, [unsafe { BoolTransmute { val: 3 }.bl }]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .<deref>.1[0], but expected something less or equal to 1 @@ -87,7 +87,7 @@ LL | const MYSLICE_SUFFIX_BAD: &MySliceBool = &MySlice(true, [unsafe { BoolTrans = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:133:1 + --> $DIR/ub-wide-ptr.rs:132:1 | LL | const RAW_SLICE_LENGTH_UNINIT: *const [u8] = unsafe { SliceTransmute { addr: 42 }.raw_slice}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered undefined pointer @@ -95,7 +95,7 @@ LL | const RAW_SLICE_LENGTH_UNINIT: *const [u8] = unsafe { SliceTransmute { addr = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:138:1 + --> $DIR/ub-wide-ptr.rs:137:1 | LL | const TRAIT_OBJ_SHORT_VTABLE_1: &dyn Trait = unsafe { DynTransmute { repr: DynRepr { ptr: &92, vtable: &3 } }.rust}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable @@ -103,7 +103,7 @@ LL | const TRAIT_OBJ_SHORT_VTABLE_1: &dyn Trait = unsafe { DynTransmute { repr: = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:141:1 + --> $DIR/ub-wide-ptr.rs:140:1 | LL | const TRAIT_OBJ_SHORT_VTABLE_2: &dyn Trait = unsafe { DynTransmute { repr2: DynRepr2 { ptr: &92, vtable: &3 } }.rust}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable @@ -111,7 +111,7 @@ LL | const TRAIT_OBJ_SHORT_VTABLE_2: &dyn Trait = unsafe { DynTransmute { repr2: = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:144:1 + --> $DIR/ub-wide-ptr.rs:143:1 | LL | const TRAIT_OBJ_INT_VTABLE: &dyn Trait = unsafe { DynTransmute { bad: BadDynRepr { ptr: &92, vtable: 3 } }.rust}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable @@ -119,7 +119,7 @@ LL | const TRAIT_OBJ_INT_VTABLE: &dyn Trait = unsafe { DynTransmute { bad: BadDy = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:148:1 + --> $DIR/ub-wide-ptr.rs:147:1 | LL | const TRAIT_OBJ_CONTENT_INVALID: &dyn Trait = &unsafe { BoolTransmute { val: 3 }.bl }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .<deref>.<dyn-downcast>, but expected something less or equal to 1 @@ -127,21 +127,33 @@ LL | const TRAIT_OBJ_CONTENT_INVALID: &dyn Trait = &unsafe { BoolTransmute { val = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:152:1 + --> $DIR/ub-wide-ptr.rs:151:1 | -LL | const RAW_TRAIT_OBJ_VTABLE_NULL: *const dyn Trait = unsafe { DynTransmute { bad: BadDynRepr { ptr: &92, vtable: 0 } }.rust}; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable +LL | const RAW_TRAIT_OBJ_VTABLE_NULL: *const dyn Trait = unsafe { DynTransmute { bad: BadDynRepr { ptr: &92, vtable: 0 } }.raw_rust}; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-wide-ptr.rs:154:1 + --> $DIR/ub-wide-ptr.rs:153:1 | LL | const RAW_TRAIT_OBJ_VTABLE_INVALID: *const dyn Trait = unsafe { DynTransmute { repr2: DynRepr2 { ptr: &92, vtable: &3 } }.raw_rust}; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered dangling or unaligned vtable pointer in wide pointer or too small vtable | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. -error: aborting due to 18 previous errors +error[E0080]: could not evaluate static initializer + --> $DIR/ub-wide-ptr.rs:159:5 + | +LL | DynTransmute { bad: BadDynRepr { ptr: &92, vtable: 0 } }.rust + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid use of NULL pointer + +error[E0080]: could not evaluate static initializer + --> $DIR/ub-wide-ptr.rs:163:5 + | +LL | DynTransmute { repr2: DynRepr2 { ptr: &92, vtable: &3 } }.rust + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Memory access failed: pointer must be in-bounds at offset N, but is outside bounds of allocation N which has size N + +error: aborting due to 20 previous errors For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs b/src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs index 59757908ac..f18e00fd63 100644 --- a/src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs +++ b/src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs @@ -3,7 +3,7 @@ const fn foo() -> ! { unsafe { std::mem::transmute(()) } - //~^ ERROR evaluation of constant value failed + //~^ WARN any use of this value will cause an error [const_err] //~| WARN the type `!` does not permit zero-initialization [invalid_value] } @@ -12,7 +12,7 @@ enum Empty { } #[warn(const_err)] const FOO: [Empty; 3] = [foo(); 3]; -//~^ WARN any use of this value will cause an error + #[warn(const_err)] const BAR: [Empty; 3] = [unsafe { std::mem::transmute(()) }; 3]; //~^ ERROR it is undefined behavior to use this value diff --git a/src/test/ui/consts/const-eval/validate_uninhabited_zsts.stderr b/src/test/ui/consts/const-eval/validate_uninhabited_zsts.stderr index 2ea173cdd9..51e80bb8b1 100644 --- a/src/test/ui/consts/const-eval/validate_uninhabited_zsts.stderr +++ b/src/test/ui/consts/const-eval/validate_uninhabited_zsts.stderr @@ -1,16 +1,14 @@ -error[E0080]: evaluation of constant value failed +warning: any use of this value will cause an error --> $DIR/validate_uninhabited_zsts.rs:5:14 | LL | unsafe { std::mem::transmute(()) } - | ^^^^^^^^^^^^^^^^^^^^^^^ entering unreachable code - -warning: any use of this value will cause an error - --> $DIR/validate_uninhabited_zsts.rs:14:26 - | + | ^^^^^^^^^^^^^^^^^^^^^^^ + | | + | entering unreachable code + | inside call to `foo` at $DIR/validate_uninhabited_zsts.rs:14:26 +... LL | const FOO: [Empty; 3] = [foo(); 3]; - | -------------------------^^^^^----- - | | - | referenced constant has errors + | ----------------------------------- | note: lint level defined here --> $DIR/validate_uninhabited_zsts.rs:13:8 @@ -36,7 +34,7 @@ LL | unsafe { std::mem::transmute(()) } | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | = note: `#[warn(invalid_value)]` on by default - = note: The never type (`!`) has no valid value + = note: the `!` type has no valid value warning: the type `Empty` does not permit zero-initialization --> $DIR/validate_uninhabited_zsts.rs:17:35 @@ -47,8 +45,8 @@ LL | const BAR: [Empty; 3] = [unsafe { std::mem::transmute(()) }; 3]; | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: 0-variant enums have no valid value + = note: enums with no variants have no valid value -error: aborting due to 2 previous errors +error: aborting due to previous error For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/const-fn-not-safe-for-const.stderr b/src/test/ui/consts/const-fn-not-safe-for-const.stderr index 2d4175ea8e..df793d7dd7 100644 --- a/src/test/ui/consts/const-fn-not-safe-for-const.stderr +++ b/src/test/ui/consts/const-fn-not-safe-for-const.stderr @@ -4,17 +4,21 @@ error[E0015]: calls in constant functions are limited to constant functions, tup LL | random() | ^^^^^^^^ -error[E0013]: constant functions cannot refer to statics, use a constant instead +error[E0013]: constant functions cannot refer to statics --> $DIR/const-fn-not-safe-for-const.rs:20:5 | LL | Y | ^ + | + = help: consider extracting the value of the `static` to a `const`, and referring to that -error[E0013]: constant functions cannot refer to statics, use a constant instead +error[E0013]: constant functions cannot refer to statics --> $DIR/const-fn-not-safe-for-const.rs:25:6 | LL | &Y | ^ + | + = help: consider extracting the value of the `static` to a `const`, and referring to that error: aborting due to 3 previous errors diff --git a/src/test/ui/consts/const-fn-type-name.rs b/src/test/ui/consts/const-fn-type-name.rs index 2bb1aeecf3..72fac19c19 100644 --- a/src/test/ui/consts/const-fn-type-name.rs +++ b/src/test/ui/consts/const-fn-type-name.rs @@ -2,6 +2,7 @@ #![feature(core_intrinsics)] #![feature(const_fn)] +#![feature(const_type_name)] #![allow(dead_code)] const fn type_name_wrapper<T>(_: &T) -> &'static str { diff --git a/src/test/ui/consts/const-mut-refs/const_mut_address_of.rs b/src/test/ui/consts/const-mut-refs/const_mut_address_of.rs new file mode 100644 index 0000000000..130ba9283b --- /dev/null +++ b/src/test/ui/consts/const-mut-refs/const_mut_address_of.rs @@ -0,0 +1,30 @@ +// check-pass + +#![feature(const_mut_refs)] +#![feature(const_fn)] +#![feature(raw_ref_op)] + +struct Foo { + x: usize +} + +const fn foo() -> Foo { + Foo { x: 0 } +} + +impl Foo { + const fn bar(&mut self) -> *mut usize { + &raw mut self.x + } +} + +const fn baz(foo: &mut Foo)-> *mut usize { + &raw mut foo.x +} + +const _: () = { + foo().bar(); + baz(&mut foo()); +}; + +fn main() {} diff --git a/src/test/ui/consts/const-mut-refs/const_mut_refs.rs b/src/test/ui/consts/const-mut-refs/const_mut_refs.rs index 33abfec02a..99006a20b1 100644 --- a/src/test/ui/consts/const-mut-refs/const_mut_refs.rs +++ b/src/test/ui/consts/const-mut-refs/const_mut_refs.rs @@ -1,7 +1,6 @@ // run-pass #![feature(const_mut_refs)] -#![feature(const_fn)] struct Foo { x: usize diff --git a/src/test/ui/consts/const-points-to-static.rs b/src/test/ui/consts/const-points-to-static.rs new file mode 100644 index 0000000000..b998b7a97b --- /dev/null +++ b/src/test/ui/consts/const-points-to-static.rs @@ -0,0 +1,12 @@ +// compile-flags: -Zunleash-the-miri-inside-of-you + +#![allow(dead_code)] + +const TEST: &u8 = &MY_STATIC; +//~^ skipping const checks +//~| it is undefined behavior to use this value + +static MY_STATIC: u8 = 4; + +fn main() { +} diff --git a/src/test/ui/consts/const-points-to-static.stderr b/src/test/ui/consts/const-points-to-static.stderr new file mode 100644 index 0000000000..8949358e29 --- /dev/null +++ b/src/test/ui/consts/const-points-to-static.stderr @@ -0,0 +1,17 @@ +warning: skipping const checks + --> $DIR/const-points-to-static.rs:5:20 + | +LL | const TEST: &u8 = &MY_STATIC; + | ^^^^^^^^^ + +error[E0080]: it is undefined behavior to use this value + --> $DIR/const-points-to-static.rs:5:1 + | +LL | const TEST: &u8 = &MY_STATIC; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constant accesses static + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/const-prop-ice.rs b/src/test/ui/consts/const-prop-ice.rs index 13309f978b..8682d2ee90 100644 --- a/src/test/ui/consts/const-prop-ice.rs +++ b/src/test/ui/consts/const-prop-ice.rs @@ -1,3 +1,5 @@ +// build-fail + fn main() { [0; 3][3u64 as usize]; //~ ERROR the len is 3 but the index is 3 } diff --git a/src/test/ui/consts/const-prop-ice.stderr b/src/test/ui/consts/const-prop-ice.stderr index 4b3880198b..65502a4ff7 100644 --- a/src/test/ui/consts/const-prop-ice.stderr +++ b/src/test/ui/consts/const-prop-ice.stderr @@ -1,5 +1,5 @@ error: index out of bounds: the len is 3 but the index is 3 - --> $DIR/const-prop-ice.rs:2:5 + --> $DIR/const-prop-ice.rs:4:5 | LL | [0; 3][3u64 as usize]; | ^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/consts/const-prop-ice2.rs b/src/test/ui/consts/const-prop-ice2.rs index e5fd79f116..6a73483026 100644 --- a/src/test/ui/consts/const-prop-ice2.rs +++ b/src/test/ui/consts/const-prop-ice2.rs @@ -1,3 +1,5 @@ +// build-fail + fn main() { enum Enum { One=1 } let xs=[0;1 as usize]; diff --git a/src/test/ui/consts/const-prop-ice2.stderr b/src/test/ui/consts/const-prop-ice2.stderr index dc17876eae..cbb8fde80f 100644 --- a/src/test/ui/consts/const-prop-ice2.stderr +++ b/src/test/ui/consts/const-prop-ice2.stderr @@ -1,5 +1,5 @@ error: index out of bounds: the len is 1 but the index is 1 - --> $DIR/const-prop-ice2.rs:4:20 + --> $DIR/const-prop-ice2.rs:6:20 | LL | println!("{}", xs[Enum::One as usize]); | ^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/consts/const-prop-ice3.rs b/src/test/ui/consts/const-prop-ice3.rs new file mode 100644 index 0000000000..8ab011661e --- /dev/null +++ b/src/test/ui/consts/const-prop-ice3.rs @@ -0,0 +1,7 @@ +// run-pass (ensure that const-prop is run) + +struct A<T: ?Sized>(T); + +fn main() { + let _x = &(&A([2, 3]) as &A<[i32]>).0 as *const [i32] as *const i32; +} diff --git a/src/test/ui/consts/const-prop-overflowing-casts.rs b/src/test/ui/consts/const-prop-overflowing-casts.rs new file mode 100644 index 0000000000..8cc5b98250 --- /dev/null +++ b/src/test/ui/consts/const-prop-overflowing-casts.rs @@ -0,0 +1,15 @@ +// check-pass + +enum Foo { + Bar = -42, + Baz = 42, +} + +fn main() { + let _ = 0u8 as u32; + let _ = (1u32 << 31) as u16; + let _ = (1u16 << 15) as u8; + let _ = (!0u16) as u8; + let _ = (-1i16) as i8; + let _ = (Foo::Bar) as i8; +} diff --git a/src/test/ui/consts/const-prop-read-static-in-const.rs b/src/test/ui/consts/const-prop-read-static-in-const.rs index 7504fd5259..14ec064e4c 100644 --- a/src/test/ui/consts/const-prop-read-static-in-const.rs +++ b/src/test/ui/consts/const-prop-read-static-in-const.rs @@ -1,9 +1,8 @@ // compile-flags: -Zunleash-the-miri-inside-of-you -// run-pass #![allow(dead_code)] -const TEST: u8 = MY_STATIC; +const TEST: u8 = MY_STATIC; //~ ERROR any use of this value will cause an error //~^ skipping const checks static MY_STATIC: u8 = 4; diff --git a/src/test/ui/consts/const-prop-read-static-in-const.stderr b/src/test/ui/consts/const-prop-read-static-in-const.stderr index bbd5b12ed7..bfaa0f934a 100644 --- a/src/test/ui/consts/const-prop-read-static-in-const.stderr +++ b/src/test/ui/consts/const-prop-read-static-in-const.stderr @@ -1,6 +1,18 @@ warning: skipping const checks - --> $DIR/const-prop-read-static-in-const.rs:6:18 + --> $DIR/const-prop-read-static-in-const.rs:5:18 | LL | const TEST: u8 = MY_STATIC; | ^^^^^^^^^ +error: any use of this value will cause an error + --> $DIR/const-prop-read-static-in-const.rs:5:18 + | +LL | const TEST: u8 = MY_STATIC; + | -----------------^^^^^^^^^- + | | + | constant accesses static + | + = note: `#[deny(const_err)]` on by default + +error: aborting due to previous error + diff --git a/src/test/ui/consts/const-size_of-cycle.rs b/src/test/ui/consts/const-size_of-cycle.rs index 6c35b9212c..c94bb4fbb2 100644 --- a/src/test/ui/consts/const-size_of-cycle.rs +++ b/src/test/ui/consts/const-size_of-cycle.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // error-pattern: cycle detected struct Foo { diff --git a/src/test/ui/consts/const-size_of-cycle.stderr b/src/test/ui/consts/const-size_of-cycle.stderr index db1932a920..c03b7a19ff 100644 --- a/src/test/ui/consts/const-size_of-cycle.stderr +++ b/src/test/ui/consts/const-size_of-cycle.stderr @@ -1,16 +1,16 @@ error[E0391]: cycle detected when const-evaluating + checking `Foo::bytes::{{constant}}#0` - --> $DIR/const-size_of-cycle.rs:5:17 + --> $DIR/const-size_of-cycle.rs:8:17 | LL | bytes: [u8; std::mem::size_of::<Foo>()] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: ...which requires const-evaluating + checking `Foo::bytes::{{constant}}#0`... - --> $DIR/const-size_of-cycle.rs:5:17 + --> $DIR/const-size_of-cycle.rs:8:17 | LL | bytes: [u8; std::mem::size_of::<Foo>()] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ note: ...which requires const-evaluating `Foo::bytes::{{constant}}#0`... - --> $DIR/const-size_of-cycle.rs:5:17 + --> $DIR/const-size_of-cycle.rs:8:17 | LL | bytes: [u8; std::mem::size_of::<Foo>()] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -28,7 +28,7 @@ LL | pub fn size_of<T>() -> usize; = note: ...which requires normalizing `ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: All, def_id: None }, value: [u8; _] }`... = note: ...which again requires const-evaluating + checking `Foo::bytes::{{constant}}#0`, completing the cycle note: cycle used when processing `Foo` - --> $DIR/const-size_of-cycle.rs:4:1 + --> $DIR/const-size_of-cycle.rs:7:1 | LL | struct Foo { | ^^^^^^^^^^ diff --git a/src/test/ui/consts/const_prop_slice_pat_ice.rs b/src/test/ui/consts/const_prop_slice_pat_ice.rs new file mode 100644 index 0000000000..60b06a497d --- /dev/null +++ b/src/test/ui/consts/const_prop_slice_pat_ice.rs @@ -0,0 +1,8 @@ +// check-pass + +fn main() { + match &[0, 1] as &[i32] { + [a @ .., x] => {} + &[] => {} + } +} diff --git a/src/test/ui/consts/consts-in-patterns.rs b/src/test/ui/consts/consts-in-patterns.rs index ac6c5a5150..ee1e3cc22f 100644 --- a/src/test/ui/consts/consts-in-patterns.rs +++ b/src/test/ui/consts/consts-in-patterns.rs @@ -1,7 +1,10 @@ // run-pass +#![feature(const_transmute)] const FOO: isize = 10; const BAR: isize = 3; +const ZST: &() = unsafe { std::mem::transmute(1usize) }; +const ZST_ARR: &[u8; 0] = unsafe { std::mem::transmute(1usize) }; const fn foo() -> isize { 4 } const BOO: isize = foo(); @@ -15,4 +18,14 @@ pub fn main() { _ => 3 }; assert_eq!(y, 2); + let z = match &() { + ZST => 9, + // FIXME: this should not be required + _ => 42, + }; + assert_eq!(z, 9); + let z = match b"" { + ZST_ARR => 10, + }; + assert_eq!(z, 10); } diff --git a/src/test/ui/consts/control-flow/exhaustive-c-like-enum-match.rs b/src/test/ui/consts/control-flow/exhaustive-c-like-enum-match.rs index 7887fd12e5..6bbbdd972a 100644 --- a/src/test/ui/consts/control-flow/exhaustive-c-like-enum-match.rs +++ b/src/test/ui/consts/control-flow/exhaustive-c-like-enum-match.rs @@ -3,7 +3,6 @@ // check-pass #![feature(const_if_match)] -#![feature(const_fn)] enum E { A, diff --git a/src/test/ui/consts/control-flow/feature-gate-const-if-match.if_match.stderr b/src/test/ui/consts/control-flow/feature-gate-const-if-match.if_match.stderr index 95096723b3..21e3f2af15 100644 --- a/src/test/ui/consts/control-flow/feature-gate-const-if-match.if_match.stderr +++ b/src/test/ui/consts/control-flow/feature-gate-const-if-match.if_match.stderr @@ -1,5 +1,5 @@ error: fatal error triggered by #[rustc_error] - --> $DIR/feature-gate-const-if-match.rs:109:1 + --> $DIR/feature-gate-const-if-match.rs:108:1 | LL | / fn main() { LL | | let _ = [0; { diff --git a/src/test/ui/consts/control-flow/feature-gate-const-if-match.rs b/src/test/ui/consts/control-flow/feature-gate-const-if-match.rs index e4b6525753..00576d50ac 100644 --- a/src/test/ui/consts/control-flow/feature-gate-const-if-match.rs +++ b/src/test/ui/consts/control-flow/feature-gate-const-if-match.rs @@ -6,7 +6,6 @@ #![feature(rustc_attrs)] #![cfg_attr(if_match, feature(const_if_match))] -#![feature(const_fn)] const _: i32 = if true { //[stock]~ ERROR `if` is not allowed in a `const` 5 diff --git a/src/test/ui/consts/control-flow/feature-gate-const-if-match.stock.stderr b/src/test/ui/consts/control-flow/feature-gate-const-if-match.stock.stderr index e846ee4ab6..d3c6a51923 100644 --- a/src/test/ui/consts/control-flow/feature-gate-const-if-match.stock.stderr +++ b/src/test/ui/consts/control-flow/feature-gate-const-if-match.stock.stderr @@ -1,5 +1,5 @@ error[E0658]: `if` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:11:16 + --> $DIR/feature-gate-const-if-match.rs:10:16 | LL | const _: i32 = if true { | ________________^ @@ -13,7 +13,7 @@ LL | | }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:17:16 + --> $DIR/feature-gate-const-if-match.rs:16:16 | LL | const _: i32 = if let Some(true) = Some(false) { | ________________^ @@ -27,7 +27,7 @@ LL | | }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `match` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:23:16 + --> $DIR/feature-gate-const-if-match.rs:22:16 | LL | const _: i32 = match 1 { | ________________^ @@ -41,7 +41,7 @@ LL | | }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `static` - --> $DIR/feature-gate-const-if-match.rs:30:13 + --> $DIR/feature-gate-const-if-match.rs:29:13 | LL | let x = if true { 0 } else { 1 }; | ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -50,7 +50,7 @@ LL | let x = if true { 0 } else { 1 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `match` is not allowed in a `static` - --> $DIR/feature-gate-const-if-match.rs:32:13 + --> $DIR/feature-gate-const-if-match.rs:31:13 | LL | let x = match x { 0 => 1, _ => 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -59,7 +59,7 @@ LL | let x = match x { 0 => 1, _ => 0 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `static` - --> $DIR/feature-gate-const-if-match.rs:34:5 + --> $DIR/feature-gate-const-if-match.rs:33:5 | LL | if let Some(x) = Some(x) { x } else { 1 } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -68,7 +68,7 @@ LL | if let Some(x) = Some(x) { x } else { 1 } = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `static mut` - --> $DIR/feature-gate-const-if-match.rs:39:13 + --> $DIR/feature-gate-const-if-match.rs:38:13 | LL | let x = if true { 0 } else { 1 }; | ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -77,7 +77,7 @@ LL | let x = if true { 0 } else { 1 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `match` is not allowed in a `static mut` - --> $DIR/feature-gate-const-if-match.rs:41:13 + --> $DIR/feature-gate-const-if-match.rs:40:13 | LL | let x = match x { 0 => 1, _ => 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -86,7 +86,7 @@ LL | let x = match x { 0 => 1, _ => 0 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `static mut` - --> $DIR/feature-gate-const-if-match.rs:43:5 + --> $DIR/feature-gate-const-if-match.rs:42:5 | LL | if let Some(x) = Some(x) { x } else { 1 } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -95,7 +95,7 @@ LL | if let Some(x) = Some(x) { x } else { 1 } = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const fn` - --> $DIR/feature-gate-const-if-match.rs:48:5 + --> $DIR/feature-gate-const-if-match.rs:47:5 | LL | if true { 5 } else { 6 } | ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -104,7 +104,7 @@ LL | if true { 5 } else { 6 } = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const fn` - --> $DIR/feature-gate-const-if-match.rs:52:5 + --> $DIR/feature-gate-const-if-match.rs:51:5 | LL | / if let Some(true) = a { LL | | 0 @@ -117,7 +117,7 @@ LL | | } = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `match` is not allowed in a `const fn` - --> $DIR/feature-gate-const-if-match.rs:60:5 + --> $DIR/feature-gate-const-if-match.rs:59:5 | LL | / match i { LL | | i if i > 10 => i, @@ -130,7 +130,7 @@ LL | | } = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const fn` - --> $DIR/feature-gate-const-if-match.rs:91:17 + --> $DIR/feature-gate-const-if-match.rs:90:17 | LL | let x = if y { 0 } else { 1 }; | ^^^^^^^^^^^^^^^^^^^^^ @@ -139,7 +139,7 @@ LL | let x = if y { 0 } else { 1 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `match` is not allowed in a `const fn` - --> $DIR/feature-gate-const-if-match.rs:93:17 + --> $DIR/feature-gate-const-if-match.rs:92:17 | LL | let x = match x { 0 => 1, _ => 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -148,7 +148,7 @@ LL | let x = match x { 0 => 1, _ => 0 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const fn` - --> $DIR/feature-gate-const-if-match.rs:95:9 + --> $DIR/feature-gate-const-if-match.rs:94:9 | LL | if let Some(x) = Some(x) { x } else { 1 } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -157,7 +157,7 @@ LL | if let Some(x) = Some(x) { x } else { 1 } = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:111:17 + --> $DIR/feature-gate-const-if-match.rs:110:17 | LL | let x = if false { 0 } else { 1 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -166,7 +166,7 @@ LL | let x = if false { 0 } else { 1 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `match` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:113:17 + --> $DIR/feature-gate-const-if-match.rs:112:17 | LL | let x = match x { 0 => 1, _ => 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -175,7 +175,7 @@ LL | let x = match x { 0 => 1, _ => 0 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:115:9 + --> $DIR/feature-gate-const-if-match.rs:114:9 | LL | if let Some(x) = Some(x) { x } else { 1 } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -184,7 +184,7 @@ LL | if let Some(x) = Some(x) { x } else { 1 } = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:68:21 + --> $DIR/feature-gate-const-if-match.rs:67:21 | LL | const IF: i32 = if true { 5 } else { 6 }; | ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -193,7 +193,7 @@ LL | const IF: i32 = if true { 5 } else { 6 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:71:25 + --> $DIR/feature-gate-const-if-match.rs:70:25 | LL | const IF_LET: i32 = if let Some(true) = None { 5 } else { 6 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -202,7 +202,7 @@ LL | const IF_LET: i32 = if let Some(true) = None { 5 } else { 6 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `match` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:74:24 + --> $DIR/feature-gate-const-if-match.rs:73:24 | LL | const MATCH: i32 = match 0 { 1 => 2, _ => 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -211,7 +211,7 @@ LL | const MATCH: i32 = match 0 { 1 => 2, _ => 0 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:79:21 + --> $DIR/feature-gate-const-if-match.rs:78:21 | LL | const IF: i32 = if true { 5 } else { 6 }; | ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -220,7 +220,7 @@ LL | const IF: i32 = if true { 5 } else { 6 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `if` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:82:25 + --> $DIR/feature-gate-const-if-match.rs:81:25 | LL | const IF_LET: i32 = if let Some(true) = None { 5 } else { 6 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -229,7 +229,7 @@ LL | const IF_LET: i32 = if let Some(true) = None { 5 } else { 6 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0658]: `match` is not allowed in a `const` - --> $DIR/feature-gate-const-if-match.rs:85:24 + --> $DIR/feature-gate-const-if-match.rs:84:24 | LL | const MATCH: i32 = match 0 { 1 => 2, _ => 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -238,7 +238,7 @@ LL | const MATCH: i32 = match 0 { 1 => 2, _ => 0 }; = help: add `#![feature(const_if_match)]` to the crate attributes to enable error[E0019]: constant contains unimplemented expression type - --> $DIR/feature-gate-const-if-match.rs:115:21 + --> $DIR/feature-gate-const-if-match.rs:114:21 | LL | if let Some(x) = Some(x) { x } else { 1 } | ^ diff --git a/src/test/ui/consts/control-flow/issue-50577.if_match.stderr b/src/test/ui/consts/control-flow/issue-50577.if_match.stderr index 79572c4170..6771224e6c 100644 --- a/src/test/ui/consts/control-flow/issue-50577.if_match.stderr +++ b/src/test/ui/consts/control-flow/issue-50577.if_match.stderr @@ -1,4 +1,4 @@ -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/issue-50577.rs:7:16 | LL | Drop = assert_eq!(1, 1) diff --git a/src/test/ui/consts/control-flow/issue-50577.rs b/src/test/ui/consts/control-flow/issue-50577.rs index 7906ec4dc6..9600f8b6ae 100644 --- a/src/test/ui/consts/control-flow/issue-50577.rs +++ b/src/test/ui/consts/control-flow/issue-50577.rs @@ -5,7 +5,7 @@ fn main() { enum Foo { Drop = assert_eq!(1, 1) - //[stock,if_match]~^ ERROR if may be missing an else clause + //[stock,if_match]~^ ERROR `if` may be missing an `else` clause //[stock]~^^ ERROR `match` is not allowed in a `const` //[stock]~| ERROR `match` is not allowed in a `const` //[stock]~| ERROR `if` is not allowed in a `const` diff --git a/src/test/ui/consts/control-flow/issue-50577.stock.stderr b/src/test/ui/consts/control-flow/issue-50577.stock.stderr index 13b5095429..7d637f5aa9 100644 --- a/src/test/ui/consts/control-flow/issue-50577.stock.stderr +++ b/src/test/ui/consts/control-flow/issue-50577.stock.stderr @@ -28,7 +28,7 @@ LL | Drop = assert_eq!(1, 1) = help: add `#![feature(const_if_match)]` to the crate attributes to enable = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/issue-50577.rs:7:16 | LL | Drop = assert_eq!(1, 1) diff --git a/src/test/ui/consts/control-flow/short-circuit-let.rs b/src/test/ui/consts/control-flow/short-circuit-let.rs index 4b20a2124c..8cee2a54f5 100644 --- a/src/test/ui/consts/control-flow/short-circuit-let.rs +++ b/src/test/ui/consts/control-flow/short-circuit-let.rs @@ -4,7 +4,6 @@ #![feature(const_if_match)] #![feature(const_panic)] -#![feature(const_fn)] const X: i32 = { let mut x = 0; diff --git a/src/test/ui/consts/control-flow/single_variant_match_ice.rs b/src/test/ui/consts/control-flow/single_variant_match_ice.rs index bb0fce66c4..823605ff03 100644 --- a/src/test/ui/consts/control-flow/single_variant_match_ice.rs +++ b/src/test/ui/consts/control-flow/single_variant_match_ice.rs @@ -1,6 +1,6 @@ // check-pass -#![feature(const_if_match, const_fn)] +#![feature(const_if_match)] enum Foo { Prob, diff --git a/src/test/ui/consts/enum-discr-type-err.rs b/src/test/ui/consts/enum-discr-type-err.rs index d66c4f47d0..5adb2fa54e 100644 --- a/src/test/ui/consts/enum-discr-type-err.rs +++ b/src/test/ui/consts/enum-discr-type-err.rs @@ -17,6 +17,7 @@ macro_rules! mac { enum E { $( $v = $s::V, )* //~^ ERROR mismatched types + //~| ERROR mismatched types } } } diff --git a/src/test/ui/consts/enum-discr-type-err.stderr b/src/test/ui/consts/enum-discr-type-err.stderr index 848ccf94da..9935f88e5b 100644 --- a/src/test/ui/consts/enum-discr-type-err.stderr +++ b/src/test/ui/consts/enum-discr-type-err.stderr @@ -15,6 +15,23 @@ help: you can convert an `i32` to `isize` and panic if the converted value would LL | $( $v = $s::V.try_into().unwrap(), )* | ^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to previous error +error[E0308]: mismatched types + --> $DIR/enum-discr-type-err.rs:18:21 + | +LL | $( $v = $s::V, )* + | ^^^^^ expected `isize`, found `i32` +... +LL | / mac! { +LL | | A = F, +LL | | B = T, +LL | | } + | |_- in this macro invocation + | +help: you can convert an `i32` to `isize` and panic if the converted value wouldn't fit + | +LL | $( $v = $s::V.try_into().unwrap(), )* + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/consts/huge-values.rs b/src/test/ui/consts/huge-values.rs index ab09922d76..70a5b10e9b 100644 --- a/src/test/ui/consts/huge-values.rs +++ b/src/test/ui/consts/huge-values.rs @@ -1,6 +1,10 @@ // build-pass // ignore-32bit +// This test is a canary test that will essentially not compile in a reasonable time frame +// (so it'll take hours) if any of the optimizations regress. With the optimizations, these compile +// in milliseconds just as if the length were set to `1`. + #[derive(Clone, Copy)] struct Foo; @@ -8,4 +12,6 @@ fn main() { let _ = [(); 4_000_000_000]; let _ = [0u8; 4_000_000_000]; let _ = [Foo; 4_000_000_000]; + let _ = [(Foo, (), Foo, ((), Foo, [0; 0])); 4_000_000_000]; + let _ = [[0; 0]; 4_000_000_000]; } diff --git a/src/test/ui/consts/issue-64662.stderr b/src/test/ui/consts/issue-64662.stderr index b3c673ec02..dd281e911d 100644 --- a/src/test/ui/consts/issue-64662.stderr +++ b/src/test/ui/consts/issue-64662.stderr @@ -2,13 +2,13 @@ error[E0282]: type annotations needed --> $DIR/issue-64662.rs:2:9 | LL | A = foo(), - | ^^^ cannot infer type for type parameter `T` + | ^^^ cannot infer type for type parameter `T` declared on the function `foo` error[E0282]: type annotations needed --> $DIR/issue-64662.rs:3:9 | LL | B = foo(), - | ^^^ cannot infer type for type parameter `T` + | ^^^ cannot infer type for type parameter `T` declared on the function `foo` error: aborting due to 2 previous errors diff --git a/src/test/ui/consts/issue-67529.rs b/src/test/ui/consts/issue-67529.rs new file mode 100644 index 0000000000..df4bc668be --- /dev/null +++ b/src/test/ui/consts/issue-67529.rs @@ -0,0 +1,11 @@ +// compile-flags: -Z mir-opt-level=2 +// run-pass + +struct Baz<T: ?Sized> { + a: T +} + +fn main() { + let d : Baz<[i32; 4]> = Baz { a: [1,2,3,4] }; + assert_eq!([1, 2, 3, 4], d.a); +} diff --git a/src/test/ui/consts/issue-67640.rs b/src/test/ui/consts/issue-67640.rs new file mode 100644 index 0000000000..bc0ee8d386 --- /dev/null +++ b/src/test/ui/consts/issue-67640.rs @@ -0,0 +1,24 @@ +// compile-flags: -Z mir-opt-level=3 +// run-pass + +struct X { + x: isize +} + +fn f1(a: &mut X, b: &mut isize, c: isize) -> isize { + let r = a.x + *b + c; + a.x = 0; + *b = 10; + return r; +} + +fn f2<F>(a: isize, f: F) -> isize where F: FnOnce(isize) { f(1); return a; } + +pub fn main() { + let mut a = X {x: 1}; + let mut b = 2; + let c = 3; + assert_eq!(f1(&mut a, &mut b, c), 6); + assert_eq!(a.x, 0); + assert_eq!(f2(a.x, |_| a.x = 50), 0); +} diff --git a/src/test/ui/consts/issue-67641.rs b/src/test/ui/consts/issue-67641.rs new file mode 100644 index 0000000000..f50fba287a --- /dev/null +++ b/src/test/ui/consts/issue-67641.rs @@ -0,0 +1,24 @@ +// compile-flags: -Z mir-opt-level=2 +// run-pass + +use std::cell::Cell; + +#[derive(Debug)] +struct B<'a> { + a: [Cell<Option<&'a B<'a>>>; 2] +} + +impl<'a> B<'a> { + fn new() -> B<'a> { + B { a: [Cell::new(None), Cell::new(None)] } + } +} + +fn f() { + let b2 = B::new(); + b2.a[0].set(Some(&b2)); +} + +fn main() { + f(); +} diff --git a/src/test/ui/consts/issue-67696-const-prop-ice.rs b/src/test/ui/consts/issue-67696-const-prop-ice.rs new file mode 100644 index 0000000000..ad52608b3f --- /dev/null +++ b/src/test/ui/consts/issue-67696-const-prop-ice.rs @@ -0,0 +1,20 @@ +// check-pass +// compile-flags: --emit=mir,link +// Checks that we don't ICE due to attempting to run const prop +// on a function with unsatisifable 'where' clauses + +#![allow(unused)] + +trait A { + fn foo(&self) -> Self where Self: Copy; +} + +impl A for [fn(&())] { + fn foo(&self) -> Self where Self: Copy { *(&[] as &[_]) } +} + +impl A for i32 { + fn foo(&self) -> Self { 3 } +} + +fn main() {} diff --git a/src/test/ui/consts/issue-67862.rs b/src/test/ui/consts/issue-67862.rs new file mode 100644 index 0000000000..84f72154d2 --- /dev/null +++ b/src/test/ui/consts/issue-67862.rs @@ -0,0 +1,18 @@ +// compile-flags: -Z mir-opt-level=2 +// run-pass + +fn e220() -> (i64, i64) { + #[inline(never)] + fn get_displacement() -> [i64; 2] { + [139776, 963904] + } + + let res = get_displacement(); + match (&res[0], &res[1]) { + (arg0, arg1) => (*arg0, *arg1), + } +} + +fn main() { + assert_eq!(e220(), (139776, 963904)); +} diff --git a/src/test/ui/consts/issue-68264-overflow.rs b/src/test/ui/consts/issue-68264-overflow.rs new file mode 100644 index 0000000000..8f21e0648d --- /dev/null +++ b/src/test/ui/consts/issue-68264-overflow.rs @@ -0,0 +1,43 @@ +// check-pass +// compile-flags: --emit=mir,link +// Regression test for issue #68264 +// Checks that we don't encounter overflow +// when running const-prop on functions with +// complicated bounds +pub trait Query {} + +pub trait AsQuery { + type Query: Query; +} +pub trait Table: AsQuery + Sized {} + +pub trait LimitDsl { + type Output; +} + +pub(crate) trait LoadQuery<Conn, U>: RunQueryDsl<Conn> {} + +impl<T: Query> AsQuery for T { + type Query = Self; +} + +impl<T> LimitDsl for T +where + T: Table, + T::Query: LimitDsl, +{ + type Output = <T::Query as LimitDsl>::Output; +} + +pub(crate) trait RunQueryDsl<Conn>: Sized { + fn first<U>(self, _conn: &Conn) -> U + where + Self: LimitDsl, + Self::Output: LoadQuery<Conn, U>, + { + // Overflow is caused by this function body + unimplemented!() + } +} + +fn main() {} diff --git a/src/test/ui/consts/issue-68542-closure-in-array-len.rs b/src/test/ui/consts/issue-68542-closure-in-array-len.rs new file mode 100644 index 0000000000..2e721b8533 --- /dev/null +++ b/src/test/ui/consts/issue-68542-closure-in-array-len.rs @@ -0,0 +1,10 @@ +// Regression test for issue #68542 +// Tests that we don't ICE when a closure appears +// in the length part of an array. + +struct Bug { + a: [(); (|| { 0 })()] //~ ERROR calls in constants are limited to + //~^ ERROR evaluation of constant value failed +} + +fn main() {} diff --git a/src/test/ui/consts/issue-68542-closure-in-array-len.stderr b/src/test/ui/consts/issue-68542-closure-in-array-len.stderr new file mode 100644 index 0000000000..815cc9d836 --- /dev/null +++ b/src/test/ui/consts/issue-68542-closure-in-array-len.stderr @@ -0,0 +1,16 @@ +error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants + --> $DIR/issue-68542-closure-in-array-len.rs:6:13 + | +LL | a: [(); (|| { 0 })()] + | ^^^^^^^^^^^^ + +error[E0080]: evaluation of constant value failed + --> $DIR/issue-68542-closure-in-array-len.rs:6:13 + | +LL | a: [(); (|| { 0 })()] + | ^^^^^^^^^^^^ calling non-const function `Bug::a::{{constant}}#0::{{closure}}#0` + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0015, E0080. +For more information about an error, try `rustc --explain E0015`. diff --git a/src/test/ui/consts/issue-69191-ice-on-uninhabited-enum-field.rs b/src/test/ui/consts/issue-69191-ice-on-uninhabited-enum-field.rs new file mode 100644 index 0000000000..5b7c7be42c --- /dev/null +++ b/src/test/ui/consts/issue-69191-ice-on-uninhabited-enum-field.rs @@ -0,0 +1,91 @@ +// build-pass +// +// (this is deliberately *not* check-pass; I have confirmed that the bug in +// question does not replicate when one uses `cargo check` alone.) + +pub enum Void {} + +enum UninhabitedUnivariant { + _Variant(Void), +} + +enum UninhabitedMultivariant2 { + _Variant(Void), + _Warriont(Void), +} + +enum UninhabitedMultivariant3 { + _Variant(Void), + _Warriont(Void), + _Worrynot(Void), +} + +#[repr(C)] +enum UninhabitedUnivariantC { + _Variant(Void), +} + +#[repr(i32)] +enum UninhabitedUnivariant32 { + _Variant(Void), +} + +fn main() { + let _seed: UninhabitedUnivariant = None.unwrap(); + match _seed { + UninhabitedUnivariant::_Variant(_x) => {} + } + + let _seed: UninhabitedMultivariant2 = None.unwrap(); + match _seed { + UninhabitedMultivariant2::_Variant(_x) => {} + UninhabitedMultivariant2::_Warriont(_x) => {} + } + + let _seed: UninhabitedMultivariant2 = None.unwrap(); + match _seed { + UninhabitedMultivariant2::_Variant(_x) => {} + _ => {} + } + + let _seed: UninhabitedMultivariant2 = None.unwrap(); + match _seed { + UninhabitedMultivariant2::_Warriont(_x) => {} + _ => {} + } + + let _seed: UninhabitedMultivariant3 = None.unwrap(); + match _seed { + UninhabitedMultivariant3::_Variant(_x) => {} + UninhabitedMultivariant3::_Warriont(_x) => {} + UninhabitedMultivariant3::_Worrynot(_x) => {} + } + + let _seed: UninhabitedMultivariant3 = None.unwrap(); + match _seed { + UninhabitedMultivariant3::_Variant(_x) => {} + _ => {} + } + + let _seed: UninhabitedMultivariant3 = None.unwrap(); + match _seed { + UninhabitedMultivariant3::_Warriont(_x) => {} + _ => {} + } + + let _seed: UninhabitedMultivariant3 = None.unwrap(); + match _seed { + UninhabitedMultivariant3::_Worrynot(_x) => {} + _ => {} + } + + let _seed: UninhabitedUnivariantC = None.unwrap(); + match _seed { + UninhabitedUnivariantC::_Variant(_x) => {} + } + + let _seed: UninhabitedUnivariant32 = None.unwrap(); + match _seed { + UninhabitedUnivariant32::_Variant(_x) => {} + } +} diff --git a/src/test/ui/consts/issue-69310-array-size-lit-wrong-ty.rs b/src/test/ui/consts/issue-69310-array-size-lit-wrong-ty.rs new file mode 100644 index 0000000000..98be8c345a --- /dev/null +++ b/src/test/ui/consts/issue-69310-array-size-lit-wrong-ty.rs @@ -0,0 +1,11 @@ +// This is a regression test for #69310, which was injected by #68118. +// The issue here was that as a performance optimization, +// we call the query `lit_to_const(input);`. +// However, the literal `input.lit` would not be of the type expected by `input.ty`. +// As a result, we immediately called `bug!(...)` instead of bubbling up the problem +// so that it could be handled by the caller of `lit_to_const` (`ast_const_to_const`). + +fn main() {} + +const A: [(); 0.1] = [()]; //~ ERROR mismatched types +const B: [(); b"a"] = [()]; //~ ERROR mismatched types diff --git a/src/test/ui/consts/issue-69310-array-size-lit-wrong-ty.stderr b/src/test/ui/consts/issue-69310-array-size-lit-wrong-ty.stderr new file mode 100644 index 0000000000..7078b4bd7b --- /dev/null +++ b/src/test/ui/consts/issue-69310-array-size-lit-wrong-ty.stderr @@ -0,0 +1,15 @@ +error[E0308]: mismatched types + --> $DIR/issue-69310-array-size-lit-wrong-ty.rs:10:15 + | +LL | const A: [(); 0.1] = [()]; + | ^^^ expected `usize`, found floating-point number + +error[E0308]: mismatched types + --> $DIR/issue-69310-array-size-lit-wrong-ty.rs:11:15 + | +LL | const B: [(); b"a"] = [()]; + | ^^^^ expected `usize`, found `&[u8; 1]` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/consts/match_ice.rs b/src/test/ui/consts/match_ice.rs index 1c13bfceb6..1e495438e8 100644 --- a/src/test/ui/consts/match_ice.rs +++ b/src/test/ui/consts/match_ice.rs @@ -10,6 +10,7 @@ fn main() { match C { C => {} //~^ ERROR to use a constant of type `S` in a pattern, `S` must be annotated with + //~| ERROR to use a constant of type `S` in a pattern, `S` must be annotated with } const K: &T = &T; match K { //~ ERROR non-exhaustive patterns: `&T` not covered diff --git a/src/test/ui/consts/match_ice.stderr b/src/test/ui/consts/match_ice.stderr index bf0bd3aca9..b25ac09ab1 100644 --- a/src/test/ui/consts/match_ice.stderr +++ b/src/test/ui/consts/match_ice.stderr @@ -5,7 +5,7 @@ LL | C => {} | ^ error[E0004]: non-exhaustive patterns: `&T` not covered - --> $DIR/match_ice.rs:15:11 + --> $DIR/match_ice.rs:16:11 | LL | struct T; | --------- `T` defined here @@ -15,6 +15,12 @@ LL | match K { | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms -error: aborting due to 2 previous errors +error: to use a constant of type `S` in a pattern, `S` must be annotated with `#[derive(PartialEq, Eq)]` + --> $DIR/match_ice.rs:11:9 + | +LL | C => {} + | ^ + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0004`. diff --git a/src/test/ui/consts/min_const_fn/address_of.rs b/src/test/ui/consts/min_const_fn/address_of.rs new file mode 100644 index 0000000000..f8506d70b2 --- /dev/null +++ b/src/test/ui/consts/min_const_fn/address_of.rs @@ -0,0 +1,17 @@ +#![feature(raw_ref_op)] + +const fn mutable_address_of_in_const() { + let mut a = 0; + let b = &raw mut a; //~ ERROR `&raw mut` is not allowed +} + +struct X; + +impl X { + const fn inherent_mutable_address_of_in_const() { + let mut a = 0; + let b = &raw mut a; //~ ERROR `&raw mut` is not allowed + } +} + +fn main() {} diff --git a/src/test/ui/consts/min_const_fn/address_of.stderr b/src/test/ui/consts/min_const_fn/address_of.stderr new file mode 100644 index 0000000000..3554b8112b --- /dev/null +++ b/src/test/ui/consts/min_const_fn/address_of.stderr @@ -0,0 +1,21 @@ +error[E0658]: `&raw mut` is not allowed in constant functions + --> $DIR/address_of.rs:5:13 + | +LL | let b = &raw mut a; + | ^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable + +error[E0658]: `&raw mut` is not allowed in constant functions + --> $DIR/address_of.rs:13:17 + | +LL | let b = &raw mut a; + | ^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/57349 + = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/min_const_fn/address_of_const.rs b/src/test/ui/consts/min_const_fn/address_of_const.rs new file mode 100644 index 0000000000..3db19e9cde --- /dev/null +++ b/src/test/ui/consts/min_const_fn/address_of_const.rs @@ -0,0 +1,19 @@ +// check-pass + +#![feature(raw_ref_op)] + +const fn const_address_of_in_const() { + let mut a = 0; + let b = &raw const a; +} + +struct X; + +impl X { + const fn inherent_const_address_of_in_const() { + let mut a = 0; + let b = &raw const a; + } +} + +fn main() {} diff --git a/src/test/ui/consts/min_const_fn/min_const_fn_libstd_stability.rs b/src/test/ui/consts/min_const_fn/min_const_fn_libstd_stability.rs index 97e467aece..df10f3496c 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn_libstd_stability.rs +++ b/src/test/ui/consts/min_const_fn/min_const_fn_libstd_stability.rs @@ -1,13 +1,13 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(const_fn, foo, foo2)] #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] const fn foo() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -15,7 +15,7 @@ const fn foo() -> u32 { 42 } // can't call non-min_const_fn const fn bar() -> u32 { foo() } //~ ERROR can only call other `const fn` -#[unstable(feature = "rust1", issue="0")] +#[unstable(feature = "rust1", issue = "none")] const fn foo2() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -29,7 +29,7 @@ const fn bar2() -> u32 { foo2() } //~ ERROR can only call other `const fn` const fn bar3() -> u32 { (5f32 + 6f32) as u32 } //~ ERROR only int, `bool` and `char` operations // check whether this function cannot be called even with the feature gate active -#[unstable(feature = "foo2", issue="0")] +#[unstable(feature = "foo2", issue = "none")] const fn foo2_gated() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability.rs b/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability.rs index 102b380144..12b41ee2b0 100644 --- a/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability.rs +++ b/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability.rs @@ -1,13 +1,13 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(const_fn, foo, foo2)] #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] const unsafe fn foo() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -15,7 +15,7 @@ const unsafe fn foo() -> u32 { 42 } // can't call non-min_const_fn const unsafe fn bar() -> u32 { unsafe { foo() } } //~ ERROR can only call other `const fn` -#[unstable(feature = "rust1", issue="0")] +#[unstable(feature = "rust1", issue = "none")] const unsafe fn foo2() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -29,7 +29,7 @@ const unsafe fn bar2() -> u32 { unsafe { foo2() } } //~ ERROR can only call othe const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 } //~ ERROR only int, `bool` and `char` op // check whether this function cannot be called even with the feature gate active -#[unstable(feature = "foo2", issue="0")] +#[unstable(feature = "foo2", issue = "none")] const unsafe fn foo2_gated() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability2.rs b/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability2.rs index 121177f836..44a6209498 100644 --- a/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability2.rs +++ b/src/test/ui/consts/min_const_fn/min_const_unsafe_fn_libstd_stability2.rs @@ -1,13 +1,13 @@ #![unstable(feature = "humans", reason = "who ever let humans program computers, we're apparently really bad at it", - issue = "0")] + issue = "none")] #![feature(const_fn, foo, foo2)] #![feature(staged_api)] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature="foo", issue = "0")] +#[rustc_const_unstable(feature="foo", issue = "none")] const fn foo() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -15,7 +15,7 @@ const fn foo() -> u32 { 42 } // can't call non-min_const_fn const unsafe fn bar() -> u32 { foo() } //~ ERROR can only call other `const fn` -#[unstable(feature = "rust1", issue="0")] +#[unstable(feature = "rust1", issue = "none")] const fn foo2() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] @@ -24,7 +24,7 @@ const fn foo2() -> u32 { 42 } const unsafe fn bar2() -> u32 { foo2() } //~ ERROR can only call other `const fn` // check whether this function cannot be called even with the feature gate active -#[unstable(feature = "foo2", issue="0")] +#[unstable(feature = "foo2", issue = "none")] const fn foo2_gated() -> u32 { 42 } #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/test/ui/consts/miri_unleashed/abi-mismatch.rs b/src/test/ui/consts/miri_unleashed/abi-mismatch.rs new file mode 100644 index 0000000000..d8e63b0bfb --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/abi-mismatch.rs @@ -0,0 +1,16 @@ +// Checks that we report ABI mismatches for "const extern fn" +// compile-flags: -Z unleash-the-miri-inside-of-you + +#![feature(const_extern_fn)] + +const extern "C" fn c_fn() {} + +const fn call_rust_fn(my_fn: extern "Rust" fn()) { + my_fn(); //~ ERROR any use of this value will cause an error + //~^ WARN skipping const checks +} + +const VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) }); +//~^ WARN skipping const checks + +fn main() {} diff --git a/src/test/ui/consts/miri_unleashed/abi-mismatch.stderr b/src/test/ui/consts/miri_unleashed/abi-mismatch.stderr new file mode 100644 index 0000000000..da00c49963 --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/abi-mismatch.stderr @@ -0,0 +1,28 @@ +warning: skipping const checks + --> $DIR/abi-mismatch.rs:9:5 + | +LL | my_fn(); + | ^^^^^^^ + +warning: skipping const checks + --> $DIR/abi-mismatch.rs:13:39 + | +LL | const VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) }); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: any use of this value will cause an error + --> $DIR/abi-mismatch.rs:9:5 + | +LL | my_fn(); + | ^^^^^^^ + | | + | tried to call a function with ABI C using caller ABI Rust + | inside call to `call_rust_fn` at $DIR/abi-mismatch.rs:13:17 +... +LL | const VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) }); + | -------------------------------------------------------------------------------------- + | + = note: `#[deny(const_err)]` on by default + +error: aborting due to previous error + diff --git a/src/test/ui/consts/miri_unleashed/assoc_const.rs b/src/test/ui/consts/miri_unleashed/assoc_const.rs index b8959667cc..cfbcc959d3 100644 --- a/src/test/ui/consts/miri_unleashed/assoc_const.rs +++ b/src/test/ui/consts/miri_unleashed/assoc_const.rs @@ -1,4 +1,6 @@ +// build-fail // compile-flags: -Zunleash-the-miri-inside-of-you + #![allow(const_err)] // a test demonstrating why we do need to run static const qualification on associated constants diff --git a/src/test/ui/consts/miri_unleashed/assoc_const.stderr b/src/test/ui/consts/miri_unleashed/assoc_const.stderr index 6a6cb343f1..1ccf2b196f 100644 --- a/src/test/ui/consts/miri_unleashed/assoc_const.stderr +++ b/src/test/ui/consts/miri_unleashed/assoc_const.stderr @@ -1,11 +1,11 @@ warning: skipping const checks - --> $DIR/assoc_const.rs:12:20 + --> $DIR/assoc_const.rs:14:20 | LL | const F: u32 = (U::X, 42).1; | ^^^^^^^^^^ error[E0080]: erroneous constant used - --> $DIR/assoc_const.rs:29:13 + --> $DIR/assoc_const.rs:31:13 | LL | let y = <String as Bar<Vec<u32>, String>>::F; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors diff --git a/src/test/ui/consts/miri_unleashed/assoc_const_2.rs b/src/test/ui/consts/miri_unleashed/assoc_const_2.rs index c87b638984..30dd2a5158 100644 --- a/src/test/ui/consts/miri_unleashed/assoc_const_2.rs +++ b/src/test/ui/consts/miri_unleashed/assoc_const_2.rs @@ -1,3 +1,5 @@ +// build-fail + #![allow(const_err)] // a test demonstrating that const qualification cannot prevent monomorphization time errors diff --git a/src/test/ui/consts/miri_unleashed/assoc_const_2.stderr b/src/test/ui/consts/miri_unleashed/assoc_const_2.stderr index dbfe1d93aa..e15717979c 100644 --- a/src/test/ui/consts/miri_unleashed/assoc_const_2.stderr +++ b/src/test/ui/consts/miri_unleashed/assoc_const_2.stderr @@ -1,5 +1,5 @@ error[E0080]: erroneous constant used - --> $DIR/assoc_const_2.rs:27:13 + --> $DIR/assoc_const_2.rs:29:13 | LL | let y = <String as Bar<String>>::F; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors diff --git a/src/test/ui/consts/miri_unleashed/const_refers_to_static.rs b/src/test/ui/consts/miri_unleashed/const_refers_to_static.rs new file mode 100644 index 0000000000..edbf0e02d8 --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/const_refers_to_static.rs @@ -0,0 +1,39 @@ +// compile-flags: -Zunleash-the-miri-inside-of-you +#![warn(const_err)] + +#![feature(const_raw_ptr_deref)] + +use std::sync::atomic::AtomicUsize; +use std::sync::atomic::Ordering; + +const REF_INTERIOR_MUT: &usize = { //~ ERROR undefined behavior to use this value + static FOO: AtomicUsize = AtomicUsize::new(0); + unsafe { &*(&FOO as *const _ as *const usize) } + //~^ WARN skipping const checks +}; + +const MUTATE_INTERIOR_MUT: usize = { + static FOO: AtomicUsize = AtomicUsize::new(0); + FOO.fetch_add(1, Ordering::Relaxed) //~ WARN any use of this value will cause an error + //~^ WARN skipping const checks + //~| WARN skipping const checks +}; + +const READ_INTERIOR_MUT: usize = { + static FOO: AtomicUsize = AtomicUsize::new(0); + unsafe { *(&FOO as *const _ as *const usize) } //~ WARN any use of this value will cause an err + //~^ WARN skipping const checks +}; + +static mut MUTABLE: u32 = 0; +const READ_MUT: u32 = unsafe { MUTABLE }; //~ WARN any use of this value will cause an error +//~^ WARN skipping const checks +//~| WARN skipping const checks + +// ok some day perhaps +const READ_IMMUT: &usize = { //~ ERROR it is undefined behavior to use this value + static FOO: usize = 0; + &FOO + //~^ WARN skipping const checks +}; +fn main() {} diff --git a/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr b/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr new file mode 100644 index 0000000000..243efbbaa7 --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr @@ -0,0 +1,106 @@ +warning: skipping const checks + --> $DIR/const_refers_to_static.rs:11:18 + | +LL | unsafe { &*(&FOO as *const _ as *const usize) } + | ^^^ + +warning: skipping const checks + --> $DIR/const_refers_to_static.rs:17:5 + | +LL | FOO.fetch_add(1, Ordering::Relaxed) + | ^^^ + +warning: skipping const checks + --> $DIR/const_refers_to_static.rs:17:5 + | +LL | FOO.fetch_add(1, Ordering::Relaxed) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +warning: skipping const checks + --> $DIR/const_refers_to_static.rs:24:17 + | +LL | unsafe { *(&FOO as *const _ as *const usize) } + | ^^^ + +warning: skipping const checks + --> $DIR/const_refers_to_static.rs:29:32 + | +LL | const READ_MUT: u32 = unsafe { MUTABLE }; + | ^^^^^^^ + +warning: skipping const checks + --> $DIR/const_refers_to_static.rs:29:32 + | +LL | const READ_MUT: u32 = unsafe { MUTABLE }; + | ^^^^^^^ + +warning: skipping const checks + --> $DIR/const_refers_to_static.rs:36:6 + | +LL | &FOO + | ^^^ + +error[E0080]: it is undefined behavior to use this value + --> $DIR/const_refers_to_static.rs:9:1 + | +LL | / const REF_INTERIOR_MUT: &usize = { +LL | | static FOO: AtomicUsize = AtomicUsize::new(0); +LL | | unsafe { &*(&FOO as *const _ as *const usize) } +LL | | +LL | | }; + | |__^ constant accesses static + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. + +warning: any use of this value will cause an error + --> $DIR/const_refers_to_static.rs:17:5 + | +LL | / const MUTATE_INTERIOR_MUT: usize = { +LL | | static FOO: AtomicUsize = AtomicUsize::new(0); +LL | | FOO.fetch_add(1, Ordering::Relaxed) + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ calling non-const function `std::sync::atomic::AtomicUsize::fetch_add` +LL | | +LL | | +LL | | }; + | |__- + | +note: lint level defined here + --> $DIR/const_refers_to_static.rs:2:9 + | +LL | #![warn(const_err)] + | ^^^^^^^^^ + +warning: any use of this value will cause an error + --> $DIR/const_refers_to_static.rs:24:14 + | +LL | / const READ_INTERIOR_MUT: usize = { +LL | | static FOO: AtomicUsize = AtomicUsize::new(0); +LL | | unsafe { *(&FOO as *const _ as *const usize) } + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constant accesses static +LL | | +LL | | }; + | |__- + +warning: any use of this value will cause an error + --> $DIR/const_refers_to_static.rs:29:32 + | +LL | const READ_MUT: u32 = unsafe { MUTABLE }; + | -------------------------------^^^^^^^--- + | | + | constant accesses static + +error[E0080]: it is undefined behavior to use this value + --> $DIR/const_refers_to_static.rs:34:1 + | +LL | / const READ_IMMUT: &usize = { +LL | | static FOO: usize = 0; +LL | | &FOO +LL | | +LL | | }; + | |__^ constant accesses static + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/miri_unleashed/drop.rs b/src/test/ui/consts/miri_unleashed/drop.rs new file mode 100644 index 0000000000..d2c34bcd4a --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/drop.rs @@ -0,0 +1,23 @@ +// compile-flags: -Zunleash-the-miri-inside-of-you +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl +// error-pattern: calling non-const function `<std::vec::Vec<i32> as std::ops::Drop>::drop` +#![deny(const_err)] + +use std::mem::ManuallyDrop; + +fn main() {} + +static TEST_OK: () = { + let v: Vec<i32> = Vec::new(); + let _v = ManuallyDrop::new(v); +}; + +// Make sure we catch executing bad drop functions. +// The actual error is tested by the error-pattern above. +static TEST_BAD: () = { + let _v: Vec<i32> = Vec::new(); + //~^ WARN skipping const check +}; diff --git a/src/test/ui/consts/miri_unleashed/drop.stderr b/src/test/ui/consts/miri_unleashed/drop.stderr new file mode 100644 index 0000000000..2439d527bd --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/drop.stderr @@ -0,0 +1,24 @@ +warning: skipping const checks + --> $DIR/drop.rs:21:9 + | +LL | let _v: Vec<i32> = Vec::new(); + | ^^ + +error[E0080]: could not evaluate static initializer + --> $SRC_DIR/libcore/ptr/mod.rs:LL:COL + | +LL | / pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) { +LL | | // Code here does not matter - this is replaced by the +LL | | // real drop glue by the compiler. +LL | | drop_in_place(to_drop) +LL | | } + | |_^ calling non-const function `<std::vec::Vec<i32> as std::ops::Drop>::drop` + | + ::: $DIR/drop.rs:23:1 + | +LL | }; + | - inside call to `std::intrinsics::drop_in_place::<std::vec::Vec<i32>> - shim(Some(std::vec::Vec<i32>))` at $DIR/drop.rs:23:1 + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/miri_unleashed/mutable_const2.rs b/src/test/ui/consts/miri_unleashed/mutable_const2.rs new file mode 100644 index 0000000000..97af1f2f99 --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/mutable_const2.rs @@ -0,0 +1,19 @@ +// compile-flags: -Zunleash-the-miri-inside-of-you +// failure-status: 101 +// rustc-env:RUST_BACKTRACE=0 +// normalize-stderr-test "note: rustc 1.* running on .*" -> "note: rustc VERSION running on TARGET" +// normalize-stderr-test "note: compiler flags: .*" -> "note: compiler flags: FLAGS" +// normalize-stderr-test "interpret/intern.rs:[0-9]*:[0-9]*" -> "interpret/intern.rs:LL:CC" + +#![feature(const_raw_ptr_deref)] +#![feature(const_mut_refs)] +#![deny(const_err)] + +use std::cell::UnsafeCell; + +// make sure we do not just intern this as mutable +const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _; +//~^ WARN: skipping const checks +//~| ERROR: mutable allocation in constant + +fn main() {} diff --git a/src/test/ui/consts/miri_unleashed/mutable_const2.stderr b/src/test/ui/consts/miri_unleashed/mutable_const2.stderr new file mode 100644 index 0000000000..a316d8f169 --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/mutable_const2.stderr @@ -0,0 +1,25 @@ +warning: skipping const checks + --> $DIR/mutable_const2.rs:15:38 + | +LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _; + | ^^^^^^^^^^^^^^^^^^^^ + +error: internal compiler error: mutable allocation in constant + --> $DIR/mutable_const2.rs:15:1 + | +LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:357:17 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + +error: internal compiler error: unexpected panic + +note: the compiler unexpectedly panicked. this is a bug. + +note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports + +note: rustc VERSION running on TARGET + +note: compiler flags: FLAGS + diff --git a/src/test/ui/consts/miri_unleashed/mutable_references_ice.stderr b/src/test/ui/consts/miri_unleashed/mutable_references_ice.stderr index c148842bcb..c292fcef7f 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_references_ice.stderr +++ b/src/test/ui/consts/miri_unleashed/mutable_references_ice.stderr @@ -7,7 +7,7 @@ LL | x: &UnsafeCell::new(42), thread 'rustc' panicked at 'assertion failed: `(left != right)` left: `Const`, right: `Const`: UnsafeCells are not allowed behind references in constants. This should have been prevented statically by const qualification. If this were allowed one would be able to change a constant at one use site and other use sites could observe that mutation.', src/librustc_mir/interpret/intern.rs:LL:CC -note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace error: internal compiler error: unexpected panic diff --git a/src/test/ui/consts/miri_unleashed/non_const_fn.rs b/src/test/ui/consts/miri_unleashed/non_const_fn.rs index e1ac430657..cfb57d21ce 100644 --- a/src/test/ui/consts/miri_unleashed/non_const_fn.rs +++ b/src/test/ui/consts/miri_unleashed/non_const_fn.rs @@ -1,4 +1,6 @@ +// build-fail // compile-flags: -Zunleash-the-miri-inside-of-you + #![warn(const_err)] // A test demonstrating that we prevent calling non-const fn during CTFE. @@ -9,5 +11,7 @@ const C: () = foo(); //~ WARN: skipping const checks //~^ WARN any use of this value will cause an error fn main() { - println!("{:?}", C); //~ ERROR: evaluation of constant expression failed + println!("{:?}", C); + //~^ ERROR: evaluation of constant expression failed + //~| WARN: erroneous constant used [const_err] } diff --git a/src/test/ui/consts/miri_unleashed/non_const_fn.stderr b/src/test/ui/consts/miri_unleashed/non_const_fn.stderr index 7a574b3430..6a7df858fe 100644 --- a/src/test/ui/consts/miri_unleashed/non_const_fn.stderr +++ b/src/test/ui/consts/miri_unleashed/non_const_fn.stderr @@ -1,11 +1,11 @@ warning: skipping const checks - --> $DIR/non_const_fn.rs:8:15 + --> $DIR/non_const_fn.rs:10:15 | LL | const C: () = foo(); | ^^^^^ warning: any use of this value will cause an error - --> $DIR/non_const_fn.rs:8:15 + --> $DIR/non_const_fn.rs:10:15 | LL | const C: () = foo(); | --------------^^^^^- @@ -13,13 +13,19 @@ LL | const C: () = foo(); | calling non-const function `foo` | note: lint level defined here - --> $DIR/non_const_fn.rs:2:9 + --> $DIR/non_const_fn.rs:4:9 | LL | #![warn(const_err)] | ^^^^^^^^^ error[E0080]: evaluation of constant expression failed - --> $DIR/non_const_fn.rs:12:22 + --> $DIR/non_const_fn.rs:14:22 + | +LL | println!("{:?}", C); + | ^ referenced constant has errors + +warning: erroneous constant used + --> $DIR/non_const_fn.rs:14:22 | LL | println!("{:?}", C); | ^ referenced constant has errors diff --git a/src/test/ui/consts/offset_from_ub.rs b/src/test/ui/consts/offset_from_ub.rs index c903091562..6c4beaf2ea 100644 --- a/src/test/ui/consts/offset_from_ub.rs +++ b/src/test/ui/consts/offset_from_ub.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl #![feature(const_raw_ptr_deref)] #![feature(const_ptr_offset_from)] diff --git a/src/test/ui/consts/offset_from_ub.stderr b/src/test/ui/consts/offset_from_ub.stderr index 1bd09034bf..24da983cf0 100644 --- a/src/test/ui/consts/offset_from_ub.stderr +++ b/src/test/ui/consts/offset_from_ub.stderr @@ -1,13 +1,13 @@ error: any use of this value will cause an error - --> $SRC_DIR/libcore/ptr/mod.rs:LL:COL + --> $SRC_DIR/libcore/ptr/const_ptr.rs:LL:COL | LL | intrinsics::ptr_offset_from(self, origin) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | ptr_offset_from cannot compute offset of pointers into different allocations. - | inside call to `std::ptr::<impl *const Struct>::offset_from` at $DIR/offset_from_ub.rs:19:27 + | inside call to `std::ptr::const_ptr::<impl *const Struct>::offset_from` at $DIR/offset_from_ub.rs:22:27 | - ::: $DIR/offset_from_ub.rs:13:1 + ::: $DIR/offset_from_ub.rs:16:1 | LL | / pub const DIFFERENT_ALLOC: usize = { LL | | @@ -21,15 +21,15 @@ LL | | }; = note: `#[deny(const_err)]` on by default error: any use of this value will cause an error - --> $SRC_DIR/libcore/ptr/mod.rs:LL:COL + --> $SRC_DIR/libcore/ptr/const_ptr.rs:LL:COL | LL | intrinsics::ptr_offset_from(self, origin) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | a memory access tried to interpret some bytes as a pointer - | inside call to `std::ptr::<impl *const u8>::offset_from` at $DIR/offset_from_ub.rs:25:14 + | inside call to `std::ptr::const_ptr::<impl *const u8>::offset_from` at $DIR/offset_from_ub.rs:28:14 | - ::: $DIR/offset_from_ub.rs:23:1 + ::: $DIR/offset_from_ub.rs:26:1 | LL | / pub const NOT_PTR: usize = { LL | | @@ -38,15 +38,15 @@ LL | | }; | |__- error: any use of this value will cause an error - --> $SRC_DIR/libcore/ptr/mod.rs:LL:COL + --> $SRC_DIR/libcore/ptr/const_ptr.rs:LL:COL | LL | intrinsics::ptr_offset_from(self, origin) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | exact_div: 1 cannot be divided by 2 without remainder - | inside call to `std::ptr::<impl *const u16>::offset_from` at $DIR/offset_from_ub.rs:33:14 + | inside call to `std::ptr::const_ptr::<impl *const u16>::offset_from` at $DIR/offset_from_ub.rs:36:14 | - ::: $DIR/offset_from_ub.rs:28:1 + ::: $DIR/offset_from_ub.rs:31:1 | LL | / pub const NOT_MULTIPLE_OF_SIZE: isize = { LL | | @@ -58,15 +58,15 @@ LL | | }; | |__- error: any use of this value will cause an error - --> $SRC_DIR/libcore/ptr/mod.rs:LL:COL + --> $SRC_DIR/libcore/ptr/const_ptr.rs:LL:COL | LL | intrinsics::ptr_offset_from(self, origin) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | invalid use of NULL pointer - | inside call to `std::ptr::<impl *const u8>::offset_from` at $DIR/offset_from_ub.rs:39:14 + | inside call to `std::ptr::const_ptr::<impl *const u8>::offset_from` at $DIR/offset_from_ub.rs:42:14 | - ::: $DIR/offset_from_ub.rs:36:1 + ::: $DIR/offset_from_ub.rs:39:1 | LL | / pub const OFFSET_FROM_NULL: isize = { LL | | @@ -76,15 +76,15 @@ LL | | }; | |__- error: any use of this value will cause an error - --> $SRC_DIR/libcore/ptr/mod.rs:LL:COL + --> $SRC_DIR/libcore/ptr/const_ptr.rs:LL:COL | LL | intrinsics::ptr_offset_from(self, origin) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | a memory access tried to interpret some bytes as a pointer - | inside call to `std::ptr::<impl *const u8>::offset_from` at $DIR/offset_from_ub.rs:46:14 + | inside call to `std::ptr::const_ptr::<impl *const u8>::offset_from` at $DIR/offset_from_ub.rs:49:14 | - ::: $DIR/offset_from_ub.rs:42:1 + ::: $DIR/offset_from_ub.rs:45:1 | LL | / pub const DIFFERENT_INT: isize = { // offset_from with two different integers: like DIFFERENT_ALLOC LL | | diff --git a/src/test/ui/consts/raw_pointer_promoted.rs b/src/test/ui/consts/raw_pointer_promoted.rs new file mode 100644 index 0000000000..4c62ad444a --- /dev/null +++ b/src/test/ui/consts/raw_pointer_promoted.rs @@ -0,0 +1,5 @@ +// check-pass + +pub const FOO: &'static *const i32 = &(&0 as _); + +fn main() {} diff --git a/src/test/ui/consts/recursive-zst-static.rs b/src/test/ui/consts/recursive-zst-static.rs new file mode 100644 index 0000000000..df7562bd9f --- /dev/null +++ b/src/test/ui/consts/recursive-zst-static.rs @@ -0,0 +1,7 @@ +// build-pass + +static FOO: () = FOO; + +fn main() { + FOO +} diff --git a/src/test/ui/consts/too_generic_eval_ice.stderr b/src/test/ui/consts/too_generic_eval_ice.stderr index 2fb9977f4d..599d1d79e7 100644 --- a/src/test/ui/consts/too_generic_eval_ice.stderr +++ b/src/test/ui/consts/too_generic_eval_ice.stderr @@ -1,4 +1,4 @@ -error[E0599]: no associated item named `HOST_SIZE` found for type `Foo<A, B>` in the current scope +error[E0599]: no associated item named `HOST_SIZE` found for struct `Foo<A, B>` in the current scope --> $DIR/too_generic_eval_ice.rs:7:19 | LL | pub struct Foo<A, B>(A, B); diff --git a/src/test/ui/consts/trait_specialization.rs b/src/test/ui/consts/trait_specialization.rs new file mode 100644 index 0000000000..8010d2fe1a --- /dev/null +++ b/src/test/ui/consts/trait_specialization.rs @@ -0,0 +1,65 @@ +// ignore-wasm32-bare which doesn't support `std::process:exit()` +// compile-flags: -Zmir-opt-level=2 +// run-pass + +// Tests that specialization does not cause optimizations running on polymorphic MIR to resolve +// to a `default` implementation. + +#![feature(specialization)] + +trait Marker {} + +trait SpecializedTrait { + const CONST_BOOL: bool; + const CONST_STR: &'static str; + fn method() -> &'static str; +} +impl <T> SpecializedTrait for T { + default const CONST_BOOL: bool = false; + default const CONST_STR: &'static str = "in default impl"; + #[inline(always)] + default fn method() -> &'static str { + "in default impl" + } +} +impl <T: Marker> SpecializedTrait for T { + const CONST_BOOL: bool = true; + const CONST_STR: &'static str = "in specialized impl"; + fn method() -> &'static str { + "in specialized impl" + } +} + +fn const_bool<T>() -> &'static str { + if <T as SpecializedTrait>::CONST_BOOL { + "in specialized impl" + } else { + "in default impl" + } +} +fn const_str<T>() -> &'static str { + <T as SpecializedTrait>::CONST_STR +} +fn run_method<T>() -> &'static str { + <T as SpecializedTrait>::method() +} + +struct TypeA; +impl Marker for TypeA {} +struct TypeB; + +#[inline(never)] +fn exit_if_not_eq(left: &str, right: &str) { + if left != right { + std::process::exit(1); + } +} + +pub fn main() { + exit_if_not_eq("in specialized impl", const_bool::<TypeA>()); + exit_if_not_eq("in default impl", const_bool::<TypeB>()); + exit_if_not_eq("in specialized impl", const_str::<TypeA>()); + exit_if_not_eq("in default impl", const_str::<TypeB>()); + exit_if_not_eq("in specialized impl", run_method::<TypeA>()); + exit_if_not_eq("in default impl", run_method::<TypeB>()); +} diff --git a/src/test/ui/consts/transmute-size-mismatch-before-typeck.rs b/src/test/ui/consts/transmute-size-mismatch-before-typeck.rs new file mode 100644 index 0000000000..2817abfcaa --- /dev/null +++ b/src/test/ui/consts/transmute-size-mismatch-before-typeck.rs @@ -0,0 +1,20 @@ +#![feature(const_transmute)] + +// normalize-stderr-64bit "64 bits" -> "word size" +// normalize-stderr-32bit "32 bits" -> "word size" +// normalize-stderr-64bit "128 bits" -> "2 * word size" +// normalize-stderr-32bit "64 bits" -> "2 * word size" + +fn main() { + match &b""[..] { + ZST => {} //~ ERROR could not evaluate constant pattern + //~| ERROR could not evaluate constant pattern + } +} + +const ZST: &[u8] = unsafe { std::mem::transmute(1usize) }; +//~^ ERROR any use of this value will cause an error +//~| ERROR cannot transmute between types of different sizes + +// Once the `any use of this value will cause an error` disappears in this test, make sure to +// remove the `TransmuteSizeDiff` error variant and make its emitter site an assertion again. diff --git a/src/test/ui/consts/transmute-size-mismatch-before-typeck.stderr b/src/test/ui/consts/transmute-size-mismatch-before-typeck.stderr new file mode 100644 index 0000000000..296a55ef16 --- /dev/null +++ b/src/test/ui/consts/transmute-size-mismatch-before-typeck.stderr @@ -0,0 +1,34 @@ +error: any use of this value will cause an error + --> $DIR/transmute-size-mismatch-before-typeck.rs:15:29 + | +LL | const ZST: &[u8] = unsafe { std::mem::transmute(1usize) }; + | ----------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^--- + | | + | tried to transmute from usize to &[u8], but their sizes differed + | + = note: `#[deny(const_err)]` on by default + +error: could not evaluate constant pattern + --> $DIR/transmute-size-mismatch-before-typeck.rs:10:9 + | +LL | ZST => {} + | ^^^ + +error[E0512]: cannot transmute between types of different sizes, or dependently-sized types + --> $DIR/transmute-size-mismatch-before-typeck.rs:15:29 + | +LL | const ZST: &[u8] = unsafe { std::mem::transmute(1usize) }; + | ^^^^^^^^^^^^^^^^^^^ + | + = note: source type: `usize` (word size) + = note: target type: `&'static [u8]` (2 * word size) + +error: could not evaluate constant pattern + --> $DIR/transmute-size-mismatch-before-typeck.rs:10:9 + | +LL | ZST => {} + | ^^^ + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0512`. diff --git a/src/test/ui/consts/uninhabited-const-issue-61744.rs b/src/test/ui/consts/uninhabited-const-issue-61744.rs index e10b38a614..15436f9c1b 100644 --- a/src/test/ui/consts/uninhabited-const-issue-61744.rs +++ b/src/test/ui/consts/uninhabited-const-issue-61744.rs @@ -1,19 +1,19 @@ -// compile-fail +// build-fail pub const unsafe fn fake_type<T>() -> T { hint_unreachable() } pub const unsafe fn hint_unreachable() -> ! { - fake_type() //~ ERROR cycle detected when const-evaluating `hint_unreachable` [E0391] + fake_type() //~ ERROR evaluation of constant value failed } trait Const { - const CONSTANT: i32 = unsafe { fake_type() }; + const CONSTANT: i32 = unsafe { fake_type() }; //~ ERROR any use of this value will cause an err } -impl <T> Const for T {} +impl<T> Const for T {} pub fn main() -> () { - dbg!(i32::CONSTANT); + dbg!(i32::CONSTANT); //~ ERROR erroneous constant used } diff --git a/src/test/ui/consts/uninhabited-const-issue-61744.stderr b/src/test/ui/consts/uninhabited-const-issue-61744.stderr index 2a25ecc55e..1f3e2cf5b2 100644 --- a/src/test/ui/consts/uninhabited-const-issue-61744.stderr +++ b/src/test/ui/consts/uninhabited-const-issue-61744.stderr @@ -1,21 +1,96 @@ -error[E0391]: cycle detected when const-evaluating `hint_unreachable` +error[E0080]: evaluation of constant value failed --> $DIR/uninhabited-const-issue-61744.rs:8:5 | +LL | hint_unreachable() + | ------------------ + | | + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 + | inside call to `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:4:5 +... LL | fake_type() | ^^^^^^^^^^^ + | | + | reached the configured maximum number of stack frames + | inside call to `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:8:5 + +error: any use of this value will cause an error + --> $DIR/uninhabited-const-issue-61744.rs:12:36 | -note: ...which requires const-evaluating `fake_type`... - --> $DIR/uninhabited-const-issue-61744.rs:4:5 +LL | const CONSTANT: i32 = unsafe { fake_type() }; + | -------------------------------^^^^^^^^^^^--- + | | + | referenced constant has errors | -LL | hint_unreachable() - | ^^^^^^^^^^^^^^^^^^ - = note: ...which again requires const-evaluating `hint_unreachable`, completing the cycle -note: cycle used when const-evaluating `fake_type` - --> $DIR/uninhabited-const-issue-61744.rs:4:5 + = note: `#[deny(const_err)]` on by default + +error[E0080]: erroneous constant used + --> $DIR/uninhabited-const-issue-61744.rs:18:10 | -LL | hint_unreachable() - | ^^^^^^^^^^^^^^^^^^ +LL | dbg!(i32::CONSTANT); + | ^^^^^^^^^^^^^ referenced constant has errors -error: aborting due to previous error +error: aborting due to 3 previous errors -For more information about this error, try `rustc --explain E0391`. +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/unstable-const-fn-in-libcore.rs b/src/test/ui/consts/unstable-const-fn-in-libcore.rs index 655ad7b548..0b64786ccc 100644 --- a/src/test/ui/consts/unstable-const-fn-in-libcore.rs +++ b/src/test/ui/consts/unstable-const-fn-in-libcore.rs @@ -14,7 +14,7 @@ enum Opt<T> { } impl<T> Opt<T> { - #[rustc_const_unstable(feature = "foo", issue = "0")] + #[rustc_const_unstable(feature = "foo", issue = "none")] #[stable(feature = "rust1", since = "1.0.0")] const fn unwrap_or_else<F: FnOnce() -> T>(self, f: F) -> T { //~^ ERROR destructors cannot be evaluated at compile-time diff --git a/src/test/ui/consts/validate_never_arrays.rs b/src/test/ui/consts/validate_never_arrays.rs index 9610b7b22f..c7144f05ec 100644 --- a/src/test/ui/consts/validate_never_arrays.rs +++ b/src/test/ui/consts/validate_never_arrays.rs @@ -1,5 +1,9 @@ #![feature(const_raw_ptr_deref, never_type)] -const FOO: &[!; 1] = unsafe { &*(1_usize as *const [!; 1]) }; //~ ERROR undefined behavior +const _: &[!; 1] = unsafe { &*(1_usize as *const [!; 1]) }; //~ ERROR undefined behavior +const _: &[!; 0] = unsafe { &*(1_usize as *const [!; 0]) }; // ok +const _: &[!] = unsafe { &*(1_usize as *const [!; 0]) }; // ok +const _: &[!] = unsafe { &*(1_usize as *const [!; 1]) }; //~ ERROR undefined behavior +const _: &[!] = unsafe { &*(1_usize as *const [!; 42]) }; //~ ERROR undefined behavior fn main() {} diff --git a/src/test/ui/consts/validate_never_arrays.stderr b/src/test/ui/consts/validate_never_arrays.stderr index c4c7a33718..cb995b8216 100644 --- a/src/test/ui/consts/validate_never_arrays.stderr +++ b/src/test/ui/consts/validate_never_arrays.stderr @@ -1,11 +1,27 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/validate_never_arrays.rs:3:1 | -LL | const FOO: &[!; 1] = unsafe { &*(1_usize as *const [!; 1]) }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a value of an uninhabited type at .<deref> +LL | const _: &[!; 1] = unsafe { &*(1_usize as *const [!; 1]) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a value of an uninhabited type at .<deref> | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. -error: aborting due to previous error +error[E0080]: it is undefined behavior to use this value + --> $DIR/validate_never_arrays.rs:6:1 + | +LL | const _: &[!] = unsafe { &*(1_usize as *const [!; 1]) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a value of an uninhabited type at .<deref>[0] + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. + +error[E0080]: it is undefined behavior to use this value + --> $DIR/validate_never_arrays.rs:7:1 + | +LL | const _: &[!] = unsafe { &*(1_usize as *const [!; 42]) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a value of an uninhabited type at .<deref>[0] + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior. + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/zst_no_llvm_alloc.rs b/src/test/ui/consts/zst_no_llvm_alloc.rs index 5d77935540..2a41f708c2 100644 --- a/src/test/ui/consts/zst_no_llvm_alloc.rs +++ b/src/test/ui/consts/zst_no_llvm_alloc.rs @@ -7,13 +7,15 @@ static FOO: Foo = Foo; fn main() { let x: &'static () = &(); - assert_eq!(x as *const () as usize, 1); + assert_ne!(x as *const () as usize, 1); let x: &'static Foo = &Foo; - assert_eq!(x as *const Foo as usize, 4); + assert_ne!(x as *const Foo as usize, 4); // statics must have a unique address assert_ne!(&FOO as *const Foo as usize, 4); - assert_eq!(<Vec<i32>>::new().as_ptr(), <&[i32]>::default().as_ptr()); - assert_eq!(<Box<[i32]>>::default().as_ptr(), (&[]).as_ptr()); + // FIXME this two tests should be assert_eq! + // this stopped working since we are promoting to constants instead of statics + assert_ne!(<Vec<i32>>::new().as_ptr(), <&[i32]>::default().as_ptr()); + assert_ne!(<Box<[i32]>>::default().as_ptr(), (&[]).as_ptr()); } diff --git a/src/test/ui/copy-a-resource.stderr b/src/test/ui/copy-a-resource.stderr index 054bd0914d..c95e8d239d 100644 --- a/src/test/ui/copy-a-resource.stderr +++ b/src/test/ui/copy-a-resource.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `clone` found for type `Foo` in the current scope +error[E0599]: no method named `clone` found for struct `Foo` in the current scope --> $DIR/copy-a-resource.rs:18:16 | LL | struct Foo { diff --git a/src/test/ui/cycle-trait/cycle-trait-default-type-trait.rs b/src/test/ui/cycle-trait/cycle-trait-default-type-trait.rs index 6175b7df11..b2edc1a1f6 100644 --- a/src/test/ui/cycle-trait/cycle-trait-default-type-trait.rs +++ b/src/test/ui/cycle-trait/cycle-trait-default-type-trait.rs @@ -3,6 +3,7 @@ trait Foo<X = Box<dyn Foo>> { //~^ ERROR cycle detected + //~| ERROR cycle detected } fn main() { } diff --git a/src/test/ui/cycle-trait/cycle-trait-default-type-trait.stderr b/src/test/ui/cycle-trait/cycle-trait-default-type-trait.stderr index e89d25742a..6b38d85302 100644 --- a/src/test/ui/cycle-trait/cycle-trait-default-type-trait.stderr +++ b/src/test/ui/cycle-trait/cycle-trait-default-type-trait.stderr @@ -11,6 +11,19 @@ note: cycle used when collecting item types in top-level module LL | trait Foo<X = Box<dyn Foo>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to previous error +error[E0391]: cycle detected when processing `Foo::X` + --> $DIR/cycle-trait-default-type-trait.rs:4:23 + | +LL | trait Foo<X = Box<dyn Foo>> { + | ^^^ + | + = note: ...which again requires processing `Foo::X`, completing the cycle +note: cycle used when collecting item types in top-level module + --> $DIR/cycle-trait-default-type-trait.rs:4:1 + | +LL | trait Foo<X = Box<dyn Foo>> { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0391`. diff --git a/src/test/ui/deduplicate-diagnostics-2.deduplicate.stderr b/src/test/ui/deduplicate-diagnostics-2.deduplicate.stderr new file mode 100644 index 0000000000..7a28c6428a --- /dev/null +++ b/src/test/ui/deduplicate-diagnostics-2.deduplicate.stderr @@ -0,0 +1,28 @@ +warning: floating-point types cannot be used in patterns + --> $DIR/deduplicate-diagnostics-2.rs:7:9 + | +LL | 1.0 => {} + | ^^^ + | + = note: `#[warn(illegal_floating_point_literal_pattern)]` on by default + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +warning: floating-point types cannot be used in patterns + --> $DIR/deduplicate-diagnostics-2.rs:11:9 + | +LL | 2.0 => {} + | ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +warning: floating-point types cannot be used in patterns + --> $DIR/deduplicate-diagnostics-2.rs:7:9 + | +LL | 1.0 => {} + | ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + diff --git a/src/test/ui/deduplicate-diagnostics-2.duplicate.stderr b/src/test/ui/deduplicate-diagnostics-2.duplicate.stderr new file mode 100644 index 0000000000..4fff3a8c0f --- /dev/null +++ b/src/test/ui/deduplicate-diagnostics-2.duplicate.stderr @@ -0,0 +1,37 @@ +warning: floating-point types cannot be used in patterns + --> $DIR/deduplicate-diagnostics-2.rs:7:9 + | +LL | 1.0 => {} + | ^^^ + | + = note: `#[warn(illegal_floating_point_literal_pattern)]` on by default + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +warning: floating-point types cannot be used in patterns + --> $DIR/deduplicate-diagnostics-2.rs:11:9 + | +LL | 2.0 => {} + | ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +warning: floating-point types cannot be used in patterns + --> $DIR/deduplicate-diagnostics-2.rs:7:9 + | +LL | 1.0 => {} + | ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +warning: floating-point types cannot be used in patterns + --> $DIR/deduplicate-diagnostics-2.rs:11:9 + | +LL | 2.0 => {} + | ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + diff --git a/src/test/ui/deduplicate-diagnostics-2.rs b/src/test/ui/deduplicate-diagnostics-2.rs new file mode 100644 index 0000000000..f46a7c0c1c --- /dev/null +++ b/src/test/ui/deduplicate-diagnostics-2.rs @@ -0,0 +1,17 @@ +// build-pass +// revisions: duplicate deduplicate +//[deduplicate] compile-flags: -Z deduplicate-diagnostics=yes + +fn main() { + match 0.0 { + 1.0 => {} //~ WARNING floating-point types cannot be used in patterns + //~| WARNING this was previously accepted + //~| WARNING floating-point types cannot be used in patterns + //~| WARNING this was previously accepted + 2.0 => {} //~ WARNING floating-point types cannot be used in patterns + //~| WARNING this was previously accepted + //[duplicate]~| WARNING floating-point types cannot be used in patterns + //[duplicate]~| WARNING this was previously accepted + _ => {} + } +} diff --git a/src/test/ui/deduplicate-diagnostics.deduplicate.stderr b/src/test/ui/deduplicate-diagnostics.deduplicate.stderr new file mode 100644 index 0000000000..5df2c687bd --- /dev/null +++ b/src/test/ui/deduplicate-diagnostics.deduplicate.stderr @@ -0,0 +1,15 @@ +error[E0452]: malformed lint attribute input + --> $DIR/deduplicate-diagnostics.rs:8:8 + | +LL | #[deny("literal")] + | ^^^^^^^^^ bad attribute argument + +error: cannot find derive macro `Unresolved` in this scope + --> $DIR/deduplicate-diagnostics.rs:4:10 + | +LL | #[derive(Unresolved)] + | ^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0452`. diff --git a/src/test/ui/deduplicate-diagnostics.duplicate.stderr b/src/test/ui/deduplicate-diagnostics.duplicate.stderr new file mode 100644 index 0000000000..3b100b5999 --- /dev/null +++ b/src/test/ui/deduplicate-diagnostics.duplicate.stderr @@ -0,0 +1,33 @@ +error[E0452]: malformed lint attribute input + --> $DIR/deduplicate-diagnostics.rs:8:8 + | +LL | #[deny("literal")] + | ^^^^^^^^^ bad attribute argument + +error: cannot find derive macro `Unresolved` in this scope + --> $DIR/deduplicate-diagnostics.rs:4:10 + | +LL | #[derive(Unresolved)] + | ^^^^^^^^^^ + +error: cannot find derive macro `Unresolved` in this scope + --> $DIR/deduplicate-diagnostics.rs:4:10 + | +LL | #[derive(Unresolved)] + | ^^^^^^^^^^ + +error[E0452]: malformed lint attribute input + --> $DIR/deduplicate-diagnostics.rs:8:8 + | +LL | #[deny("literal")] + | ^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/deduplicate-diagnostics.rs:8:8 + | +LL | #[deny("literal")] + | ^^^^^^^^^ bad attribute argument + +error: aborting due to 5 previous errors + +For more information about this error, try `rustc --explain E0452`. diff --git a/src/test/ui/deduplicate-diagnostics.rs b/src/test/ui/deduplicate-diagnostics.rs new file mode 100644 index 0000000000..c5d41ff2fd --- /dev/null +++ b/src/test/ui/deduplicate-diagnostics.rs @@ -0,0 +1,11 @@ +// revisions: duplicate deduplicate +//[deduplicate] compile-flags: -Z deduplicate-diagnostics=yes + +#[derive(Unresolved)] //~ ERROR cannot find derive macro `Unresolved` in this scope + //[duplicate]~| ERROR cannot find derive macro `Unresolved` in this scope +struct S; + +#[deny("literal")] //~ ERROR malformed lint attribute input + //[duplicate]~| ERROR malformed lint attribute input + //[duplicate]~| ERROR malformed lint attribute input +fn main() {} diff --git a/src/test/ui/deprecation/deprecated-macro_escape-inner.rs b/src/test/ui/deprecation/deprecated-macro_escape-inner.rs index 957e839013..e2957c422f 100644 --- a/src/test/ui/deprecation/deprecated-macro_escape-inner.rs +++ b/src/test/ui/deprecation/deprecated-macro_escape-inner.rs @@ -1,7 +1,7 @@ // run-pass mod foo { - #![macro_escape] //~ WARNING macro_escape is a deprecated synonym for macro_use + #![macro_escape] //~ WARN `#[macro_escape]` is a deprecated synonym for `#[macro_use]` } fn main() { diff --git a/src/test/ui/deprecation/deprecated-macro_escape-inner.stderr b/src/test/ui/deprecation/deprecated-macro_escape-inner.stderr index 1b69270d62..4b0fc07463 100644 --- a/src/test/ui/deprecation/deprecated-macro_escape-inner.stderr +++ b/src/test/ui/deprecation/deprecated-macro_escape-inner.stderr @@ -1,8 +1,8 @@ -warning: macro_escape is a deprecated synonym for macro_use +warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]` --> $DIR/deprecated-macro_escape-inner.rs:4:5 | LL | #![macro_escape] | ^^^^^^^^^^^^^^^^ | - = help: consider an outer attribute, `#[macro_use]` mod ... + = help: try an outer attribute: `#[macro_use]` diff --git a/src/test/ui/deprecation/deprecated-macro_escape.rs b/src/test/ui/deprecation/deprecated-macro_escape.rs index 1b82a99f42..4a89b40625 100644 --- a/src/test/ui/deprecation/deprecated-macro_escape.rs +++ b/src/test/ui/deprecation/deprecated-macro_escape.rs @@ -1,8 +1,6 @@ // run-pass -#[macro_escape] //~ WARNING macro_escape is a deprecated synonym for macro_use -mod foo { -} +#[macro_escape] //~ WARNING `#[macro_escape]` is a deprecated synonym for `#[macro_use]` +mod foo {} -fn main() { -} +fn main() {} diff --git a/src/test/ui/deprecation/deprecated-macro_escape.stderr b/src/test/ui/deprecation/deprecated-macro_escape.stderr index b76d6d73d9..70094083d4 100644 --- a/src/test/ui/deprecation/deprecated-macro_escape.stderr +++ b/src/test/ui/deprecation/deprecated-macro_escape.stderr @@ -1,4 +1,4 @@ -warning: macro_escape is a deprecated synonym for macro_use +warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]` --> $DIR/deprecated-macro_escape.rs:3:1 | LL | #[macro_escape] diff --git a/src/test/ui/derives/derive-assoc-type-not-impl.stderr b/src/test/ui/derives/derive-assoc-type-not-impl.stderr index 038de80508..2083a1d652 100644 --- a/src/test/ui/derives/derive-assoc-type-not-impl.stderr +++ b/src/test/ui/derives/derive-assoc-type-not-impl.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `clone` found for type `Bar<NotClone>` in the current scope +error[E0599]: no method named `clone` found for struct `Bar<NotClone>` in the current scope --> $DIR/derive-assoc-type-not-impl.rs:18:30 | LL | struct Bar<T: Foo> { diff --git a/src/test/ui/derives/derives-span-Clone-enum-struct-variant.rs b/src/test/ui/derives/derives-span-Clone-enum-struct-variant.rs index da00f81b96..7c416fdcfb 100644 --- a/src/test/ui/derives/derives-span-Clone-enum-struct-variant.rs +++ b/src/test/ui/derives/derives-span-Clone-enum-struct-variant.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Clone-enum-struct-variant.stderr b/src/test/ui/derives/derives-span-Clone-enum-struct-variant.stderr index 796e6a2b74..5ddc5b5708 100644 --- a/src/test/ui/derives/derives-span-Clone-enum-struct-variant.stderr +++ b/src/test/ui/derives/derives-span-Clone-enum-struct-variant.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::clone::Clone` is not satisfied - --> $DIR/derives-span-Clone-enum-struct-variant.rs:10:6 + --> $DIR/derives-span-Clone-enum-struct-variant.rs:13:6 | LL | x: Error | ^^^^^^^^ the trait `std::clone::Clone` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Clone-enum.rs b/src/test/ui/derives/derives-span-Clone-enum.rs index 98ae1b2c5b..c013ccd934 100644 --- a/src/test/ui/derives/derives-span-Clone-enum.rs +++ b/src/test/ui/derives/derives-span-Clone-enum.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Clone-enum.stderr b/src/test/ui/derives/derives-span-Clone-enum.stderr index 3e94bb551e..80ef9238f4 100644 --- a/src/test/ui/derives/derives-span-Clone-enum.stderr +++ b/src/test/ui/derives/derives-span-Clone-enum.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::clone::Clone` is not satisfied - --> $DIR/derives-span-Clone-enum.rs:10:6 + --> $DIR/derives-span-Clone-enum.rs:13:6 | LL | Error | ^^^^^ the trait `std::clone::Clone` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Clone-struct.rs b/src/test/ui/derives/derives-span-Clone-struct.rs index db677e26f5..5a78a92b82 100644 --- a/src/test/ui/derives/derives-span-Clone-struct.rs +++ b/src/test/ui/derives/derives-span-Clone-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Clone-struct.stderr b/src/test/ui/derives/derives-span-Clone-struct.stderr index 0674d64fe9..17f3925107 100644 --- a/src/test/ui/derives/derives-span-Clone-struct.stderr +++ b/src/test/ui/derives/derives-span-Clone-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::clone::Clone` is not satisfied - --> $DIR/derives-span-Clone-struct.rs:9:5 + --> $DIR/derives-span-Clone-struct.rs:12:5 | LL | x: Error | ^^^^^^^^ the trait `std::clone::Clone` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Clone-tuple-struct.rs b/src/test/ui/derives/derives-span-Clone-tuple-struct.rs index d716b6fe90..39461d67d1 100644 --- a/src/test/ui/derives/derives-span-Clone-tuple-struct.rs +++ b/src/test/ui/derives/derives-span-Clone-tuple-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Clone-tuple-struct.stderr b/src/test/ui/derives/derives-span-Clone-tuple-struct.stderr index f6b4006014..e98212f361 100644 --- a/src/test/ui/derives/derives-span-Clone-tuple-struct.stderr +++ b/src/test/ui/derives/derives-span-Clone-tuple-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::clone::Clone` is not satisfied - --> $DIR/derives-span-Clone-tuple-struct.rs:9:5 + --> $DIR/derives-span-Clone-tuple-struct.rs:12:5 | LL | Error | ^^^^^ the trait `std::clone::Clone` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Debug-enum-struct-variant.rs b/src/test/ui/derives/derives-span-Debug-enum-struct-variant.rs index 10deccb8ad..060983d367 100644 --- a/src/test/ui/derives/derives-span-Debug-enum-struct-variant.rs +++ b/src/test/ui/derives/derives-span-Debug-enum-struct-variant.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Debug-enum-struct-variant.stderr b/src/test/ui/derives/derives-span-Debug-enum-struct-variant.stderr index 6a0e382b9e..233c4c5498 100644 --- a/src/test/ui/derives/derives-span-Debug-enum-struct-variant.stderr +++ b/src/test/ui/derives/derives-span-Debug-enum-struct-variant.stderr @@ -1,5 +1,5 @@ error[E0277]: `Error` doesn't implement `std::fmt::Debug` - --> $DIR/derives-span-Debug-enum-struct-variant.rs:10:6 + --> $DIR/derives-span-Debug-enum-struct-variant.rs:13:6 | LL | x: Error | ^^^^^^^^ `Error` cannot be formatted using `{:?}` diff --git a/src/test/ui/derives/derives-span-Debug-enum.rs b/src/test/ui/derives/derives-span-Debug-enum.rs index b8bed0eab5..109c8f23cd 100644 --- a/src/test/ui/derives/derives-span-Debug-enum.rs +++ b/src/test/ui/derives/derives-span-Debug-enum.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Debug-enum.stderr b/src/test/ui/derives/derives-span-Debug-enum.stderr index f27499ba44..fbda3980cf 100644 --- a/src/test/ui/derives/derives-span-Debug-enum.stderr +++ b/src/test/ui/derives/derives-span-Debug-enum.stderr @@ -1,5 +1,5 @@ error[E0277]: `Error` doesn't implement `std::fmt::Debug` - --> $DIR/derives-span-Debug-enum.rs:10:6 + --> $DIR/derives-span-Debug-enum.rs:13:6 | LL | Error | ^^^^^ `Error` cannot be formatted using `{:?}` diff --git a/src/test/ui/derives/derives-span-Debug-struct.rs b/src/test/ui/derives/derives-span-Debug-struct.rs index 22f037ee36..b52e2879a4 100644 --- a/src/test/ui/derives/derives-span-Debug-struct.rs +++ b/src/test/ui/derives/derives-span-Debug-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Debug-struct.stderr b/src/test/ui/derives/derives-span-Debug-struct.stderr index 09d62f12b0..b56d223b34 100644 --- a/src/test/ui/derives/derives-span-Debug-struct.stderr +++ b/src/test/ui/derives/derives-span-Debug-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: `Error` doesn't implement `std::fmt::Debug` - --> $DIR/derives-span-Debug-struct.rs:9:5 + --> $DIR/derives-span-Debug-struct.rs:12:5 | LL | x: Error | ^^^^^^^^ `Error` cannot be formatted using `{:?}` diff --git a/src/test/ui/derives/derives-span-Debug-tuple-struct.rs b/src/test/ui/derives/derives-span-Debug-tuple-struct.rs index c693facfea..1855c7fba8 100644 --- a/src/test/ui/derives/derives-span-Debug-tuple-struct.rs +++ b/src/test/ui/derives/derives-span-Debug-tuple-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Debug-tuple-struct.stderr b/src/test/ui/derives/derives-span-Debug-tuple-struct.stderr index f100cf32fd..76dd6e31e6 100644 --- a/src/test/ui/derives/derives-span-Debug-tuple-struct.stderr +++ b/src/test/ui/derives/derives-span-Debug-tuple-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: `Error` doesn't implement `std::fmt::Debug` - --> $DIR/derives-span-Debug-tuple-struct.rs:9:5 + --> $DIR/derives-span-Debug-tuple-struct.rs:12:5 | LL | Error | ^^^^^ `Error` cannot be formatted using `{:?}` diff --git a/src/test/ui/derives/derives-span-Default-struct.rs b/src/test/ui/derives/derives-span-Default-struct.rs index 1654883998..bf60b12ac4 100644 --- a/src/test/ui/derives/derives-span-Default-struct.rs +++ b/src/test/ui/derives/derives-span-Default-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Default-struct.stderr b/src/test/ui/derives/derives-span-Default-struct.stderr index 11664d400e..784be7fede 100644 --- a/src/test/ui/derives/derives-span-Default-struct.stderr +++ b/src/test/ui/derives/derives-span-Default-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::default::Default` is not satisfied - --> $DIR/derives-span-Default-struct.rs:9:5 + --> $DIR/derives-span-Default-struct.rs:12:5 | LL | x: Error | ^^^^^^^^ the trait `std::default::Default` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Default-tuple-struct.rs b/src/test/ui/derives/derives-span-Default-tuple-struct.rs index f1390c8b6f..8b89b75672 100644 --- a/src/test/ui/derives/derives-span-Default-tuple-struct.rs +++ b/src/test/ui/derives/derives-span-Default-tuple-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Default-tuple-struct.stderr b/src/test/ui/derives/derives-span-Default-tuple-struct.stderr index c79f093942..a93fa058f8 100644 --- a/src/test/ui/derives/derives-span-Default-tuple-struct.stderr +++ b/src/test/ui/derives/derives-span-Default-tuple-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::default::Default` is not satisfied - --> $DIR/derives-span-Default-tuple-struct.rs:9:5 + --> $DIR/derives-span-Default-tuple-struct.rs:12:5 | LL | Error | ^^^^^ the trait `std::default::Default` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Eq-enum-struct-variant.rs b/src/test/ui/derives/derives-span-Eq-enum-struct-variant.rs index 77c386d7f9..36e6ae81e2 100644 --- a/src/test/ui/derives/derives-span-Eq-enum-struct-variant.rs +++ b/src/test/ui/derives/derives-span-Eq-enum-struct-variant.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(PartialEq)] diff --git a/src/test/ui/derives/derives-span-Eq-enum-struct-variant.stderr b/src/test/ui/derives/derives-span-Eq-enum-struct-variant.stderr index 87c0313ca1..bad0ce31f7 100644 --- a/src/test/ui/derives/derives-span-Eq-enum-struct-variant.stderr +++ b/src/test/ui/derives/derives-span-Eq-enum-struct-variant.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::cmp::Eq` is not satisfied - --> $DIR/derives-span-Eq-enum-struct-variant.rs:10:6 + --> $DIR/derives-span-Eq-enum-struct-variant.rs:13:6 | LL | x: Error | ^^^^^^^^ the trait `std::cmp::Eq` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Eq-enum.rs b/src/test/ui/derives/derives-span-Eq-enum.rs index c7fe378133..4282515862 100644 --- a/src/test/ui/derives/derives-span-Eq-enum.rs +++ b/src/test/ui/derives/derives-span-Eq-enum.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(PartialEq)] diff --git a/src/test/ui/derives/derives-span-Eq-enum.stderr b/src/test/ui/derives/derives-span-Eq-enum.stderr index c8db6d3ff2..a7cc19d4c0 100644 --- a/src/test/ui/derives/derives-span-Eq-enum.stderr +++ b/src/test/ui/derives/derives-span-Eq-enum.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::cmp::Eq` is not satisfied - --> $DIR/derives-span-Eq-enum.rs:10:6 + --> $DIR/derives-span-Eq-enum.rs:13:6 | LL | Error | ^^^^^ the trait `std::cmp::Eq` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Eq-struct.rs b/src/test/ui/derives/derives-span-Eq-struct.rs index 8674cadb30..d290ee5ae0 100644 --- a/src/test/ui/derives/derives-span-Eq-struct.rs +++ b/src/test/ui/derives/derives-span-Eq-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(PartialEq)] diff --git a/src/test/ui/derives/derives-span-Eq-struct.stderr b/src/test/ui/derives/derives-span-Eq-struct.stderr index df4ea5b1d4..10631cb12b 100644 --- a/src/test/ui/derives/derives-span-Eq-struct.stderr +++ b/src/test/ui/derives/derives-span-Eq-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::cmp::Eq` is not satisfied - --> $DIR/derives-span-Eq-struct.rs:9:5 + --> $DIR/derives-span-Eq-struct.rs:12:5 | LL | x: Error | ^^^^^^^^ the trait `std::cmp::Eq` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Eq-tuple-struct.rs b/src/test/ui/derives/derives-span-Eq-tuple-struct.rs index 99cc9582b5..6458b63139 100644 --- a/src/test/ui/derives/derives-span-Eq-tuple-struct.rs +++ b/src/test/ui/derives/derives-span-Eq-tuple-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(PartialEq)] diff --git a/src/test/ui/derives/derives-span-Eq-tuple-struct.stderr b/src/test/ui/derives/derives-span-Eq-tuple-struct.stderr index def06d7108..117ed62cf7 100644 --- a/src/test/ui/derives/derives-span-Eq-tuple-struct.stderr +++ b/src/test/ui/derives/derives-span-Eq-tuple-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::cmp::Eq` is not satisfied - --> $DIR/derives-span-Eq-tuple-struct.rs:9:5 + --> $DIR/derives-span-Eq-tuple-struct.rs:12:5 | LL | Error | ^^^^^ the trait `std::cmp::Eq` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Hash-enum-struct-variant.rs b/src/test/ui/derives/derives-span-Hash-enum-struct-variant.rs index 604b0842fa..fc04b1a2c0 100644 --- a/src/test/ui/derives/derives-span-Hash-enum-struct-variant.rs +++ b/src/test/ui/derives/derives-span-Hash-enum-struct-variant.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Hash-enum-struct-variant.stderr b/src/test/ui/derives/derives-span-Hash-enum-struct-variant.stderr index cc1caf7804..00b033004e 100644 --- a/src/test/ui/derives/derives-span-Hash-enum-struct-variant.stderr +++ b/src/test/ui/derives/derives-span-Hash-enum-struct-variant.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::hash::Hash` is not satisfied - --> $DIR/derives-span-Hash-enum-struct-variant.rs:10:6 + --> $DIR/derives-span-Hash-enum-struct-variant.rs:13:6 | LL | x: Error | ^^^^^^^^ the trait `std::hash::Hash` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Hash-enum.rs b/src/test/ui/derives/derives-span-Hash-enum.rs index bf3033a232..daff0b2755 100644 --- a/src/test/ui/derives/derives-span-Hash-enum.rs +++ b/src/test/ui/derives/derives-span-Hash-enum.rs @@ -1,7 +1,9 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' - struct Error; #[derive(Hash)] diff --git a/src/test/ui/derives/derives-span-Hash-enum.stderr b/src/test/ui/derives/derives-span-Hash-enum.stderr index 246d821ed2..004cabf207 100644 --- a/src/test/ui/derives/derives-span-Hash-enum.stderr +++ b/src/test/ui/derives/derives-span-Hash-enum.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::hash::Hash` is not satisfied - --> $DIR/derives-span-Hash-enum.rs:10:6 + --> $DIR/derives-span-Hash-enum.rs:12:6 | LL | Error | ^^^^^ the trait `std::hash::Hash` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Hash-struct.rs b/src/test/ui/derives/derives-span-Hash-struct.rs index b6abb9d229..12a9edae63 100644 --- a/src/test/ui/derives/derives-span-Hash-struct.rs +++ b/src/test/ui/derives/derives-span-Hash-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Hash-struct.stderr b/src/test/ui/derives/derives-span-Hash-struct.stderr index 720c127635..27b8ff3d11 100644 --- a/src/test/ui/derives/derives-span-Hash-struct.stderr +++ b/src/test/ui/derives/derives-span-Hash-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::hash::Hash` is not satisfied - --> $DIR/derives-span-Hash-struct.rs:9:5 + --> $DIR/derives-span-Hash-struct.rs:12:5 | LL | x: Error | ^^^^^^^^ the trait `std::hash::Hash` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Hash-tuple-struct.rs b/src/test/ui/derives/derives-span-Hash-tuple-struct.rs index e01351fe8a..344b85d7b9 100644 --- a/src/test/ui/derives/derives-span-Hash-tuple-struct.rs +++ b/src/test/ui/derives/derives-span-Hash-tuple-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-Hash-tuple-struct.stderr b/src/test/ui/derives/derives-span-Hash-tuple-struct.stderr index 1fd1e601ec..f1142bc503 100644 --- a/src/test/ui/derives/derives-span-Hash-tuple-struct.stderr +++ b/src/test/ui/derives/derives-span-Hash-tuple-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::hash::Hash` is not satisfied - --> $DIR/derives-span-Hash-tuple-struct.rs:9:5 + --> $DIR/derives-span-Hash-tuple-struct.rs:12:5 | LL | Error | ^^^^^ the trait `std::hash::Hash` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Ord-enum-struct-variant.rs b/src/test/ui/derives/derives-span-Ord-enum-struct-variant.rs index 6d516d4b0a..196996c64c 100644 --- a/src/test/ui/derives/derives-span-Ord-enum-struct-variant.rs +++ b/src/test/ui/derives/derives-span-Ord-enum-struct-variant.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(Eq,PartialOrd,PartialEq)] diff --git a/src/test/ui/derives/derives-span-Ord-enum-struct-variant.stderr b/src/test/ui/derives/derives-span-Ord-enum-struct-variant.stderr index f0d7e4465a..1d9d1332b5 100644 --- a/src/test/ui/derives/derives-span-Ord-enum-struct-variant.stderr +++ b/src/test/ui/derives/derives-span-Ord-enum-struct-variant.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::cmp::Ord` is not satisfied - --> $DIR/derives-span-Ord-enum-struct-variant.rs:10:6 + --> $DIR/derives-span-Ord-enum-struct-variant.rs:13:6 | LL | x: Error | ^^^^^^^^ the trait `std::cmp::Ord` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Ord-enum.rs b/src/test/ui/derives/derives-span-Ord-enum.rs index 51b5d7f0ed..6282a69076 100644 --- a/src/test/ui/derives/derives-span-Ord-enum.rs +++ b/src/test/ui/derives/derives-span-Ord-enum.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(Eq,PartialOrd,PartialEq)] diff --git a/src/test/ui/derives/derives-span-Ord-enum.stderr b/src/test/ui/derives/derives-span-Ord-enum.stderr index 37eca92e77..acc8b0c694 100644 --- a/src/test/ui/derives/derives-span-Ord-enum.stderr +++ b/src/test/ui/derives/derives-span-Ord-enum.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::cmp::Ord` is not satisfied - --> $DIR/derives-span-Ord-enum.rs:10:6 + --> $DIR/derives-span-Ord-enum.rs:13:6 | LL | Error | ^^^^^ the trait `std::cmp::Ord` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Ord-struct.rs b/src/test/ui/derives/derives-span-Ord-struct.rs index c924ecaa31..e7bc7cf1c4 100644 --- a/src/test/ui/derives/derives-span-Ord-struct.rs +++ b/src/test/ui/derives/derives-span-Ord-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(Eq,PartialOrd,PartialEq)] diff --git a/src/test/ui/derives/derives-span-Ord-struct.stderr b/src/test/ui/derives/derives-span-Ord-struct.stderr index 72c1fe4803..e4dcf29545 100644 --- a/src/test/ui/derives/derives-span-Ord-struct.stderr +++ b/src/test/ui/derives/derives-span-Ord-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::cmp::Ord` is not satisfied - --> $DIR/derives-span-Ord-struct.rs:9:5 + --> $DIR/derives-span-Ord-struct.rs:12:5 | LL | x: Error | ^^^^^^^^ the trait `std::cmp::Ord` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-Ord-tuple-struct.rs b/src/test/ui/derives/derives-span-Ord-tuple-struct.rs index 8054663469..3b623558d2 100644 --- a/src/test/ui/derives/derives-span-Ord-tuple-struct.rs +++ b/src/test/ui/derives/derives-span-Ord-tuple-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(Eq,PartialOrd,PartialEq)] diff --git a/src/test/ui/derives/derives-span-Ord-tuple-struct.stderr b/src/test/ui/derives/derives-span-Ord-tuple-struct.stderr index 642c8579b5..c21dfc26cb 100644 --- a/src/test/ui/derives/derives-span-Ord-tuple-struct.stderr +++ b/src/test/ui/derives/derives-span-Ord-tuple-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Error: std::cmp::Ord` is not satisfied - --> $DIR/derives-span-Ord-tuple-struct.rs:9:5 + --> $DIR/derives-span-Ord-tuple-struct.rs:12:5 | LL | Error | ^^^^^ the trait `std::cmp::Ord` is not implemented for `Error` diff --git a/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.rs b/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.rs index b13798686c..f935d58025 100644 --- a/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.rs +++ b/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr b/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr index d6a5652560..eb4b1c84a6 100644 --- a/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr +++ b/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr @@ -1,5 +1,5 @@ error[E0369]: binary operation `==` cannot be applied to type `Error` - --> $DIR/derives-span-PartialEq-enum-struct-variant.rs:10:6 + --> $DIR/derives-span-PartialEq-enum-struct-variant.rs:13:6 | LL | x: Error | ^^^^^^^^ @@ -7,7 +7,7 @@ LL | x: Error = note: an implementation of `std::cmp::PartialEq` might be missing for `Error` error[E0369]: binary operation `!=` cannot be applied to type `Error` - --> $DIR/derives-span-PartialEq-enum-struct-variant.rs:10:6 + --> $DIR/derives-span-PartialEq-enum-struct-variant.rs:13:6 | LL | x: Error | ^^^^^^^^ diff --git a/src/test/ui/derives/derives-span-PartialEq-enum.rs b/src/test/ui/derives/derives-span-PartialEq-enum.rs index 5f8f05ad94..a0c5681835 100644 --- a/src/test/ui/derives/derives-span-PartialEq-enum.rs +++ b/src/test/ui/derives/derives-span-PartialEq-enum.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-PartialEq-enum.stderr b/src/test/ui/derives/derives-span-PartialEq-enum.stderr index 1f5ad42a3a..b63e374d89 100644 --- a/src/test/ui/derives/derives-span-PartialEq-enum.stderr +++ b/src/test/ui/derives/derives-span-PartialEq-enum.stderr @@ -1,5 +1,5 @@ error[E0369]: binary operation `==` cannot be applied to type `Error` - --> $DIR/derives-span-PartialEq-enum.rs:10:6 + --> $DIR/derives-span-PartialEq-enum.rs:13:6 | LL | Error | ^^^^^ @@ -7,7 +7,7 @@ LL | Error = note: an implementation of `std::cmp::PartialEq` might be missing for `Error` error[E0369]: binary operation `!=` cannot be applied to type `Error` - --> $DIR/derives-span-PartialEq-enum.rs:10:6 + --> $DIR/derives-span-PartialEq-enum.rs:13:6 | LL | Error | ^^^^^ diff --git a/src/test/ui/derives/derives-span-PartialEq-struct.rs b/src/test/ui/derives/derives-span-PartialEq-struct.rs index 560bf582e8..c190dd0039 100644 --- a/src/test/ui/derives/derives-span-PartialEq-struct.rs +++ b/src/test/ui/derives/derives-span-PartialEq-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-PartialEq-struct.stderr b/src/test/ui/derives/derives-span-PartialEq-struct.stderr index 4e0b2fa4e6..a147f40963 100644 --- a/src/test/ui/derives/derives-span-PartialEq-struct.stderr +++ b/src/test/ui/derives/derives-span-PartialEq-struct.stderr @@ -1,5 +1,5 @@ error[E0369]: binary operation `==` cannot be applied to type `Error` - --> $DIR/derives-span-PartialEq-struct.rs:9:5 + --> $DIR/derives-span-PartialEq-struct.rs:12:5 | LL | x: Error | ^^^^^^^^ @@ -7,7 +7,7 @@ LL | x: Error = note: an implementation of `std::cmp::PartialEq` might be missing for `Error` error[E0369]: binary operation `!=` cannot be applied to type `Error` - --> $DIR/derives-span-PartialEq-struct.rs:9:5 + --> $DIR/derives-span-PartialEq-struct.rs:12:5 | LL | x: Error | ^^^^^^^^ diff --git a/src/test/ui/derives/derives-span-PartialEq-tuple-struct.rs b/src/test/ui/derives/derives-span-PartialEq-tuple-struct.rs index 09a3249f05..dfc9c03ddc 100644 --- a/src/test/ui/derives/derives-span-PartialEq-tuple-struct.rs +++ b/src/test/ui/derives/derives-span-PartialEq-tuple-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' diff --git a/src/test/ui/derives/derives-span-PartialEq-tuple-struct.stderr b/src/test/ui/derives/derives-span-PartialEq-tuple-struct.stderr index 78e215534e..fefbf5f9ec 100644 --- a/src/test/ui/derives/derives-span-PartialEq-tuple-struct.stderr +++ b/src/test/ui/derives/derives-span-PartialEq-tuple-struct.stderr @@ -1,5 +1,5 @@ error[E0369]: binary operation `==` cannot be applied to type `Error` - --> $DIR/derives-span-PartialEq-tuple-struct.rs:9:5 + --> $DIR/derives-span-PartialEq-tuple-struct.rs:12:5 | LL | Error | ^^^^^ @@ -7,7 +7,7 @@ LL | Error = note: an implementation of `std::cmp::PartialEq` might be missing for `Error` error[E0369]: binary operation `!=` cannot be applied to type `Error` - --> $DIR/derives-span-PartialEq-tuple-struct.rs:9:5 + --> $DIR/derives-span-PartialEq-tuple-struct.rs:12:5 | LL | Error | ^^^^^ diff --git a/src/test/ui/derives/derives-span-PartialOrd-enum-struct-variant.rs b/src/test/ui/derives/derives-span-PartialOrd-enum-struct-variant.rs index 0d18bdc113..beef639462 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-enum-struct-variant.rs +++ b/src/test/ui/derives/derives-span-PartialOrd-enum-struct-variant.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(PartialEq)] @@ -7,7 +10,11 @@ struct Error; #[derive(PartialOrd,PartialEq)] enum Enum { A { - x: Error //~ ERROR + x: Error //~ ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` } } diff --git a/src/test/ui/derives/derives-span-PartialOrd-enum-struct-variant.stderr b/src/test/ui/derives/derives-span-PartialOrd-enum-struct-variant.stderr index a6f0c873e2..80b896f4f0 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-enum-struct-variant.stderr +++ b/src/test/ui/derives/derives-span-PartialOrd-enum-struct-variant.stderr @@ -1,5 +1,5 @@ error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:10:6 + --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:13:6 | LL | x: Error | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` @@ -7,6 +7,42 @@ LL | x: Error = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` = note: required by `std::cmp::PartialOrd::partial_cmp` -error: aborting due to previous error +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:13:6 + | +LL | x: Error + | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:13:6 + | +LL | x: Error + | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:13:6 + | +LL | x: Error + | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:13:6 + | +LL | x: Error + | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/derives/derives-span-PartialOrd-enum.rs b/src/test/ui/derives/derives-span-PartialOrd-enum.rs index 78e4babb97..b02828da0d 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-enum.rs +++ b/src/test/ui/derives/derives-span-PartialOrd-enum.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(PartialEq)] @@ -7,7 +10,11 @@ struct Error; #[derive(PartialOrd,PartialEq)] enum Enum { A( - Error //~ ERROR + Error //~ ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` ) } diff --git a/src/test/ui/derives/derives-span-PartialOrd-enum.stderr b/src/test/ui/derives/derives-span-PartialOrd-enum.stderr index 838126111c..f12038fb86 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-enum.stderr +++ b/src/test/ui/derives/derives-span-PartialOrd-enum.stderr @@ -1,5 +1,5 @@ error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum.rs:10:6 + --> $DIR/derives-span-PartialOrd-enum.rs:13:6 | LL | Error | ^^^^^ no implementation for `Error < Error` and `Error > Error` @@ -7,6 +7,42 @@ LL | Error = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` = note: required by `std::cmp::PartialOrd::partial_cmp` -error: aborting due to previous error +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-enum.rs:13:6 + | +LL | Error + | ^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-enum.rs:13:6 + | +LL | Error + | ^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-enum.rs:13:6 + | +LL | Error + | ^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-enum.rs:13:6 + | +LL | Error + | ^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/derives/derives-span-PartialOrd-struct.rs b/src/test/ui/derives/derives-span-PartialOrd-struct.rs index 728ec75b6c..bfcfc3d5df 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-struct.rs +++ b/src/test/ui/derives/derives-span-PartialOrd-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(PartialEq)] @@ -6,7 +9,11 @@ struct Error; #[derive(PartialOrd,PartialEq)] struct Struct { - x: Error //~ ERROR + x: Error //~ ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` } fn main() {} diff --git a/src/test/ui/derives/derives-span-PartialOrd-struct.stderr b/src/test/ui/derives/derives-span-PartialOrd-struct.stderr index 2df64d915a..dbb014752e 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-struct.stderr +++ b/src/test/ui/derives/derives-span-PartialOrd-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-struct.rs:9:5 + --> $DIR/derives-span-PartialOrd-struct.rs:12:5 | LL | x: Error | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` @@ -7,6 +7,42 @@ LL | x: Error = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` = note: required by `std::cmp::PartialOrd::partial_cmp` -error: aborting due to previous error +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-struct.rs:12:5 + | +LL | x: Error + | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-struct.rs:12:5 + | +LL | x: Error + | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-struct.rs:12:5 + | +LL | x: Error + | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-struct.rs:12:5 + | +LL | x: Error + | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.rs b/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.rs index c92b47e929..c8bdd6423a 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.rs +++ b/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // This file was auto-generated using 'src/etc/generate-deriving-span-tests.py' #[derive(PartialEq)] @@ -6,7 +9,11 @@ struct Error; #[derive(PartialOrd,PartialEq)] struct Struct( - Error //~ ERROR + Error //~ ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` + //~| ERROR can't compare `Error` with `Error` ); fn main() {} diff --git a/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.stderr b/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.stderr index 63aebe32ed..f6f1694bbf 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.stderr +++ b/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.stderr @@ -1,5 +1,5 @@ error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-tuple-struct.rs:9:5 + --> $DIR/derives-span-PartialOrd-tuple-struct.rs:12:5 | LL | Error | ^^^^^ no implementation for `Error < Error` and `Error > Error` @@ -7,6 +7,42 @@ LL | Error = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` = note: required by `std::cmp::PartialOrd::partial_cmp` -error: aborting due to previous error +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-tuple-struct.rs:12:5 + | +LL | Error + | ^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-tuple-struct.rs:12:5 + | +LL | Error + | ^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-tuple-struct.rs:12:5 + | +LL | Error + | ^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Error` with `Error` + --> $DIR/derives-span-PartialOrd-tuple-struct.rs:12:5 + | +LL | Error + | ^^^^^ no implementation for `Error < Error` and `Error > Error` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Error` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/derives/deriving-bounds.rs b/src/test/ui/derives/deriving-bounds.rs index 52659bd11e..95d440420b 100644 --- a/src/test/ui/derives/deriving-bounds.rs +++ b/src/test/ui/derives/deriving-bounds.rs @@ -1,9 +1,11 @@ #[derive(Send)] //~^ ERROR cannot find derive macro `Send` in this scope +//~| ERROR cannot find derive macro `Send` in this scope struct Test; #[derive(Sync)] //~^ ERROR cannot find derive macro `Sync` in this scope +//~| ERROR cannot find derive macro `Sync` in this scope struct Test1; pub fn main() {} diff --git a/src/test/ui/derives/deriving-bounds.stderr b/src/test/ui/derives/deriving-bounds.stderr index b18df35118..74ca37287d 100644 --- a/src/test/ui/derives/deriving-bounds.stderr +++ b/src/test/ui/derives/deriving-bounds.stderr @@ -1,15 +1,39 @@ error: cannot find derive macro `Sync` in this scope - --> $DIR/deriving-bounds.rs:5:10 + --> $DIR/deriving-bounds.rs:6:10 | LL | #[derive(Sync)] | ^^^^ | note: unsafe traits like `Sync` should be implemented explicitly - --> $DIR/deriving-bounds.rs:5:10 + --> $DIR/deriving-bounds.rs:6:10 | LL | #[derive(Sync)] | ^^^^ +error: cannot find derive macro `Sync` in this scope + --> $DIR/deriving-bounds.rs:6:10 + | +LL | #[derive(Sync)] + | ^^^^ + | +note: unsafe traits like `Sync` should be implemented explicitly + --> $DIR/deriving-bounds.rs:6:10 + | +LL | #[derive(Sync)] + | ^^^^ + +error: cannot find derive macro `Send` in this scope + --> $DIR/deriving-bounds.rs:1:10 + | +LL | #[derive(Send)] + | ^^^^ + | +note: unsafe traits like `Send` should be implemented explicitly + --> $DIR/deriving-bounds.rs:1:10 + | +LL | #[derive(Send)] + | ^^^^ + error: cannot find derive macro `Send` in this scope --> $DIR/deriving-bounds.rs:1:10 | @@ -22,5 +46,5 @@ note: unsafe traits like `Send` should be implemented explicitly LL | #[derive(Send)] | ^^^^ -error: aborting due to 2 previous errors +error: aborting due to 4 previous errors diff --git a/src/test/ui/derives/deriving-meta-unknown-trait.rs b/src/test/ui/derives/deriving-meta-unknown-trait.rs index f4a6f3fd62..d1af5b458c 100644 --- a/src/test/ui/derives/deriving-meta-unknown-trait.rs +++ b/src/test/ui/derives/deriving-meta-unknown-trait.rs @@ -1,5 +1,10 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl #[derive(Eqr)] //~^ ERROR cannot find derive macro `Eqr` in this scope +//~| ERROR cannot find derive macro `Eqr` in this scope struct Foo; pub fn main() {} diff --git a/src/test/ui/derives/deriving-meta-unknown-trait.stderr b/src/test/ui/derives/deriving-meta-unknown-trait.stderr index 1b8e689c75..ead1313232 100644 --- a/src/test/ui/derives/deriving-meta-unknown-trait.stderr +++ b/src/test/ui/derives/deriving-meta-unknown-trait.stderr @@ -1,8 +1,24 @@ error: cannot find derive macro `Eqr` in this scope - --> $DIR/deriving-meta-unknown-trait.rs:1:10 + --> $DIR/deriving-meta-unknown-trait.rs:5:10 | LL | #[derive(Eqr)] | ^^^ help: a derive macro with a similar name exists: `Eq` + | + ::: $SRC_DIR/libcore/cmp.rs:LL:COL + | +LL | pub macro Eq($item:item) { + | ------------------------ similarly named derive macro `Eq` defined here + +error: cannot find derive macro `Eqr` in this scope + --> $DIR/deriving-meta-unknown-trait.rs:5:10 + | +LL | #[derive(Eqr)] + | ^^^ help: a derive macro with a similar name exists: `Eq` + | + ::: $SRC_DIR/libcore/cmp.rs:LL:COL + | +LL | pub macro Eq($item:item) { + | ------------------------ similarly named derive macro `Eq` defined here -error: aborting due to previous error +error: aborting due to 2 previous errors diff --git a/src/test/ui/derives/deriving-primitive.rs b/src/test/ui/derives/deriving-primitive.rs index c7098d4b56..1173eca640 100644 --- a/src/test/ui/derives/deriving-primitive.rs +++ b/src/test/ui/derives/deriving-primitive.rs @@ -1,4 +1,5 @@ #[derive(FromPrimitive)] //~ ERROR cannot find derive macro `FromPrimitive` in this scope + //~| ERROR cannot find derive macro `FromPrimitive` in this scope enum Foo {} fn main() {} diff --git a/src/test/ui/derives/deriving-primitive.stderr b/src/test/ui/derives/deriving-primitive.stderr index d1b444976d..ca64c9ee73 100644 --- a/src/test/ui/derives/deriving-primitive.stderr +++ b/src/test/ui/derives/deriving-primitive.stderr @@ -4,5 +4,11 @@ error: cannot find derive macro `FromPrimitive` in this scope LL | #[derive(FromPrimitive)] | ^^^^^^^^^^^^^ -error: aborting due to previous error +error: cannot find derive macro `FromPrimitive` in this scope + --> $DIR/deriving-primitive.rs:1:10 + | +LL | #[derive(FromPrimitive)] + | ^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors diff --git a/src/test/ui/destructure-trait-ref.rs b/src/test/ui/destructure-trait-ref.rs index fb92196b2b..34e7cad935 100644 --- a/src/test/ui/destructure-trait-ref.rs +++ b/src/test/ui/destructure-trait-ref.rs @@ -33,12 +33,10 @@ fn main() { //~^ ERROR mismatched types //~| expected trait object `dyn T` //~| found reference `&_` - //~| expected trait `T`, found reference let &&&x = &(&1isize as &dyn T); //~^ ERROR mismatched types //~| expected trait object `dyn T` //~| found reference `&_` - //~| expected trait `T`, found reference let box box x = box 1isize as Box<dyn T>; //~^ ERROR mismatched types //~| expected trait object `dyn T` diff --git a/src/test/ui/destructure-trait-ref.stderr b/src/test/ui/destructure-trait-ref.stderr index f77291969d..f99bf2ffdc 100644 --- a/src/test/ui/destructure-trait-ref.stderr +++ b/src/test/ui/destructure-trait-ref.stderr @@ -22,29 +22,31 @@ error[E0308]: mismatched types LL | let &&x = &1isize as &dyn T; | ^^ | | - | expected trait `T`, found reference + | expected trait object `dyn T`, found reference | help: you can probably remove the explicit borrow: `x` | = note: expected trait object `dyn T` found reference `&_` error[E0308]: mismatched types - --> $DIR/destructure-trait-ref.rs:37:11 + --> $DIR/destructure-trait-ref.rs:36:11 | LL | let &&&x = &(&1isize as &dyn T); | ^^ | | - | expected trait `T`, found reference + | expected trait object `dyn T`, found reference | help: you can probably remove the explicit borrow: `x` | = note: expected trait object `dyn T` found reference `&_` error[E0308]: mismatched types - --> $DIR/destructure-trait-ref.rs:42:13 + --> $DIR/destructure-trait-ref.rs:40:13 | LL | let box box x = box 1isize as Box<dyn T>; - | ^^^^^ expected trait `T`, found struct `std::boxed::Box` + | ^^^^^ ------------------------ this expression has type `std::boxed::Box<dyn T>` + | | + | expected trait object `dyn T`, found struct `std::boxed::Box` | = note: expected trait object `dyn T` found struct `std::boxed::Box<_>` diff --git a/src/test/ui/destructuring-assignment/note-unsupported.rs b/src/test/ui/destructuring-assignment/note-unsupported.rs new file mode 100644 index 0000000000..876c9efea2 --- /dev/null +++ b/src/test/ui/destructuring-assignment/note-unsupported.rs @@ -0,0 +1,25 @@ +struct S { x: u8, y: u8 } + +fn main() { + let (a, b) = (1, 2); + + (a, b) = (3, 4); //~ ERROR invalid left-hand side of assignment + (a, b) += (3, 4); //~ ERROR invalid left-hand side of assignment + //~^ ERROR binary assignment operation `+=` cannot be applied + + [a, b] = [3, 4]; //~ ERROR invalid left-hand side of assignment + [a, b] += [3, 4]; //~ ERROR invalid left-hand side of assignment + //~^ ERROR binary assignment operation `+=` cannot be applied + + let s = S { x: 3, y: 4 }; + + S { x: a, y: b } = s; //~ ERROR invalid left-hand side of assignment + S { x: a, y: b } += s; //~ ERROR invalid left-hand side of assignment + //~^ ERROR binary assignment operation `+=` cannot be applied + + S { x: a, ..s } = S { x: 3, y: 4 }; //~ ERROR invalid left-hand side of assignment + + let c = 3; + + ((a, b), c) = ((3, 4), 5); //~ ERROR invalid left-hand side of assignment +} diff --git a/src/test/ui/destructuring-assignment/note-unsupported.stderr b/src/test/ui/destructuring-assignment/note-unsupported.stderr new file mode 100644 index 0000000000..a6805c32a6 --- /dev/null +++ b/src/test/ui/destructuring-assignment/note-unsupported.stderr @@ -0,0 +1,122 @@ +error[E0070]: invalid left-hand side of assignment + --> $DIR/note-unsupported.rs:6:12 + | +LL | (a, b) = (3, 4); + | ------ ^ + | | + | cannot assign to this expression + | + = note: destructuring assignments are not currently supported + = note: for more information, see https://github.com/rust-lang/rfcs/issues/372 + +error[E0368]: binary assignment operation `+=` cannot be applied to type `({integer}, {integer})` + --> $DIR/note-unsupported.rs:7:5 + | +LL | (a, b) += (3, 4); + | ------^^^^^^^^^^ + | | + | cannot use `+=` on type `({integer}, {integer})` + | + = note: an implementation of `std::ops::AddAssign` might be missing for `({integer}, {integer})` + +error[E0067]: invalid left-hand side of assignment + --> $DIR/note-unsupported.rs:7:12 + | +LL | (a, b) += (3, 4); + | ------ ^^ + | | + | cannot assign to this expression + | + = note: destructuring assignments are not currently supported + = note: for more information, see https://github.com/rust-lang/rfcs/issues/372 + +error[E0070]: invalid left-hand side of assignment + --> $DIR/note-unsupported.rs:10:12 + | +LL | [a, b] = [3, 4]; + | ------ ^ + | | + | cannot assign to this expression + | + = note: destructuring assignments are not currently supported + = note: for more information, see https://github.com/rust-lang/rfcs/issues/372 + +error[E0368]: binary assignment operation `+=` cannot be applied to type `[{integer}; 2]` + --> $DIR/note-unsupported.rs:11:5 + | +LL | [a, b] += [3, 4]; + | ------^^^^^^^^^^ + | | + | cannot use `+=` on type `[{integer}; 2]` + | + = note: an implementation of `std::ops::AddAssign` might be missing for `[{integer}; 2]` + +error[E0067]: invalid left-hand side of assignment + --> $DIR/note-unsupported.rs:11:12 + | +LL | [a, b] += [3, 4]; + | ------ ^^ + | | + | cannot assign to this expression + | + = note: destructuring assignments are not currently supported + = note: for more information, see https://github.com/rust-lang/rfcs/issues/372 + +error[E0070]: invalid left-hand side of assignment + --> $DIR/note-unsupported.rs:16:22 + | +LL | S { x: a, y: b } = s; + | ---------------- ^ + | | + | cannot assign to this expression + | + = note: destructuring assignments are not currently supported + = note: for more information, see https://github.com/rust-lang/rfcs/issues/372 + +error[E0368]: binary assignment operation `+=` cannot be applied to type `S` + --> $DIR/note-unsupported.rs:17:5 + | +LL | S { x: a, y: b } += s; + | ----------------^^^^^ + | | + | cannot use `+=` on type `S` + | + = note: an implementation of `std::ops::AddAssign` might be missing for `S` + +error[E0067]: invalid left-hand side of assignment + --> $DIR/note-unsupported.rs:17:22 + | +LL | S { x: a, y: b } += s; + | ---------------- ^^ + | | + | cannot assign to this expression + | + = note: destructuring assignments are not currently supported + = note: for more information, see https://github.com/rust-lang/rfcs/issues/372 + +error[E0070]: invalid left-hand side of assignment + --> $DIR/note-unsupported.rs:20:21 + | +LL | S { x: a, ..s } = S { x: 3, y: 4 }; + | --------------- ^ + | | + | cannot assign to this expression + | + = note: destructuring assignments are not currently supported + = note: for more information, see https://github.com/rust-lang/rfcs/issues/372 + +error[E0070]: invalid left-hand side of assignment + --> $DIR/note-unsupported.rs:24:17 + | +LL | ((a, b), c) = ((3, 4), 5); + | ----------- ^ + | | + | cannot assign to this expression + | + = note: destructuring assignments are not currently supported + = note: for more information, see https://github.com/rust-lang/rfcs/issues/372 + +error: aborting due to 11 previous errors + +Some errors have detailed explanations: E0067, E0070, E0368. +For more information about an error, try `rustc --explain E0067`. diff --git a/src/test/ui/did_you_mean/bad-assoc-pat.rs b/src/test/ui/did_you_mean/bad-assoc-pat.rs index 7e7ba59dca..3f912f7ffc 100644 --- a/src/test/ui/did_you_mean/bad-assoc-pat.rs +++ b/src/test/ui/did_you_mean/bad-assoc-pat.rs @@ -2,25 +2,25 @@ fn main() { match 0u8 { [u8]::AssocItem => {} //~^ ERROR missing angle brackets in associated item path - //~| ERROR no associated item named `AssocItem` found for type `[u8]` in the current scope + //~| ERROR no associated item named `AssocItem` found (u8, u8)::AssocItem => {} //~^ ERROR missing angle brackets in associated item path - //~| ERROR no associated item named `AssocItem` found for type `(u8, u8)` in the current sco + //~| ERROR no associated item named `AssocItem` found _::AssocItem => {} //~^ ERROR missing angle brackets in associated item path - //~| ERROR no associated item named `AssocItem` found for type `_` in the current scope + //~| ERROR no associated item named `AssocItem` found } match &0u8 { &(u8,)::AssocItem => {} //~^ ERROR missing angle brackets in associated item path - //~| ERROR no associated item named `AssocItem` found for type `(u8,)` in the current scope + //~| ERROR no associated item named `AssocItem` found } } macro_rules! pat { ($ty: ty) => ($ty::AssocItem) //~^ ERROR missing angle brackets in associated item path - //~| ERROR no associated item named `AssocItem` found for type `u8` in the current scope + //~| ERROR no associated item named `AssocItem` found } macro_rules! ty { () => (u8) @@ -31,6 +31,6 @@ fn check_macros() { pat!(u8) => {} ty!()::AssocItem => {} //~^ ERROR missing angle brackets in associated item path - //~| ERROR no associated item named `AssocItem` found for type `u8` in the current scope + //~| ERROR no associated item named `AssocItem` found } } diff --git a/src/test/ui/did_you_mean/bad-assoc-pat.stderr b/src/test/ui/did_you_mean/bad-assoc-pat.stderr index 59b865437a..3f1946b94f 100644 --- a/src/test/ui/did_you_mean/bad-assoc-pat.stderr +++ b/src/test/ui/did_you_mean/bad-assoc-pat.stderr @@ -37,13 +37,13 @@ LL | ($ty: ty) => ($ty::AssocItem) LL | pat!(u8) => {} | -------- in this macro invocation -error[E0599]: no associated item named `AssocItem` found for type `[u8]` in the current scope +error[E0599]: no associated item named `AssocItem` found for slice `[u8]` in the current scope --> $DIR/bad-assoc-pat.rs:3:15 | LL | [u8]::AssocItem => {} | ^^^^^^^^^ associated item not found in `[u8]` -error[E0599]: no associated item named `AssocItem` found for type `(u8, u8)` in the current scope +error[E0599]: no associated item named `AssocItem` found for tuple `(u8, u8)` in the current scope --> $DIR/bad-assoc-pat.rs:6:19 | LL | (u8, u8)::AssocItem => {} @@ -55,7 +55,7 @@ error[E0599]: no associated item named `AssocItem` found for type `_` in the cur LL | _::AssocItem => {} | ^^^^^^^^^ associated item not found in `_` -error[E0599]: no associated item named `AssocItem` found for type `(u8,)` in the current scope +error[E0599]: no associated item named `AssocItem` found for tuple `(u8,)` in the current scope --> $DIR/bad-assoc-pat.rs:14:17 | LL | &(u8,)::AssocItem => {} diff --git a/src/test/ui/did_you_mean/bad-assoc-ty.rs b/src/test/ui/did_you_mean/bad-assoc-ty.rs index fccfb7911c..f02931eeb6 100644 --- a/src/test/ui/did_you_mean/bad-assoc-ty.rs +++ b/src/test/ui/did_you_mean/bad-assoc-ty.rs @@ -17,6 +17,7 @@ type D = (u8, u8)::AssocTy; type E = _::AssocTy; //~^ ERROR missing angle brackets in associated item path //~| ERROR the type placeholder `_` is not allowed within types on item signatures +//~| ERROR the type placeholder `_` is not allowed within types on item signatures type F = &'static (u8)::AssocTy; //~^ ERROR missing angle brackets in associated item path diff --git a/src/test/ui/did_you_mean/bad-assoc-ty.stderr b/src/test/ui/did_you_mean/bad-assoc-ty.stderr index 0ae64edcc0..4fdd407bff 100644 --- a/src/test/ui/did_you_mean/bad-assoc-ty.stderr +++ b/src/test/ui/did_you_mean/bad-assoc-ty.stderr @@ -29,25 +29,25 @@ LL | type E = _::AssocTy; | ^^^^^^^^^^ help: try: `<_>::AssocTy` error: missing angle brackets in associated item path - --> $DIR/bad-assoc-ty.rs:21:19 + --> $DIR/bad-assoc-ty.rs:22:19 | LL | type F = &'static (u8)::AssocTy; | ^^^^^^^^^^^^^ help: try: `<(u8)>::AssocTy` error: missing angle brackets in associated item path - --> $DIR/bad-assoc-ty.rs:27:10 + --> $DIR/bad-assoc-ty.rs:28:10 | LL | type G = dyn 'static + (Send)::AssocTy; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `<dyn 'static + (Send)>::AssocTy` error: missing angle brackets in associated item path - --> $DIR/bad-assoc-ty.rs:44:10 + --> $DIR/bad-assoc-ty.rs:45:10 | LL | type I = ty!()::AssocTy; | ^^^^^^^^^^^^^^ help: try: `<ty!()>::AssocTy` error: missing angle brackets in associated item path - --> $DIR/bad-assoc-ty.rs:37:19 + --> $DIR/bad-assoc-ty.rs:38:19 | LL | ($ty: ty) => ($ty::AssocTy); | ^^^^^^^^^^^^ help: try: `<$ty>::AssocTy` @@ -59,7 +59,7 @@ error[E0223]: ambiguous associated type --> $DIR/bad-assoc-ty.rs:1:10 | LL | type A = [u8; 4]::AssocTy; - | ^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<[u8; _] as Trait>::AssocTy` + | ^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<[u8; 4] as Trait>::AssocTy` error[E0223]: ambiguous associated type --> $DIR/bad-assoc-ty.rs:5:10 @@ -85,26 +85,32 @@ error[E0121]: the type placeholder `_` is not allowed within types on item signa LL | type E = _::AssocTy; | ^ not allowed in type signatures +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/bad-assoc-ty.rs:17:10 + | +LL | type E = _::AssocTy; + | ^ not allowed in type signatures + error[E0223]: ambiguous associated type - --> $DIR/bad-assoc-ty.rs:21:19 + --> $DIR/bad-assoc-ty.rs:22:19 | LL | type F = &'static (u8)::AssocTy; | ^^^^^^^^^^^^^ help: use fully-qualified syntax: `<u8 as Trait>::AssocTy` error[E0223]: ambiguous associated type - --> $DIR/bad-assoc-ty.rs:27:10 + --> $DIR/bad-assoc-ty.rs:28:10 | LL | type G = dyn 'static + (Send)::AssocTy; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<(dyn std::marker::Send + 'static) as Trait>::AssocTy` error[E0223]: ambiguous associated type - --> $DIR/bad-assoc-ty.rs:33:10 + --> $DIR/bad-assoc-ty.rs:34:10 | LL | type H = Fn(u8) -> (u8)::Output; | ^^^^^^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<(dyn std::ops::Fn(u8) -> u8 + 'static) as Trait>::Output` error[E0223]: ambiguous associated type - --> $DIR/bad-assoc-ty.rs:37:19 + --> $DIR/bad-assoc-ty.rs:38:19 | LL | ($ty: ty) => ($ty::AssocTy); | ^^^^^^^^^^^^ help: use fully-qualified syntax: `<u8 as Trait>::AssocTy` @@ -113,12 +119,12 @@ LL | type J = ty!(u8); | ------- in this macro invocation error[E0223]: ambiguous associated type - --> $DIR/bad-assoc-ty.rs:44:10 + --> $DIR/bad-assoc-ty.rs:45:10 | LL | type I = ty!()::AssocTy; | ^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<u8 as Trait>::AssocTy` -error: aborting due to 19 previous errors +error: aborting due to 20 previous errors Some errors have detailed explanations: E0121, E0223. For more information about an error, try `rustc --explain E0121`. diff --git a/src/test/ui/did_you_mean/issue-40006.rs b/src/test/ui/did_you_mean/issue-40006.rs index b3c1f60b7e..60633c6930 100644 --- a/src/test/ui/did_you_mean/issue-40006.rs +++ b/src/test/ui/did_you_mean/issue-40006.rs @@ -18,10 +18,10 @@ trait A { //~ ERROR missing trait B { fn xxx() { ### } //~ ERROR expected } -trait C { //~ ERROR missing `fn`, `type`, or `const` for trait-item declaration +trait C { //~ ERROR missing `fn`, `type`, or `const` for associated-item declaration L = M; } -trait D { //~ ERROR missing `fn`, `type`, or `const` for trait-item declaration +trait D { //~ ERROR missing `fn`, `type`, or `const` for associated-item declaration Z = { 2 + 3 }; } trait E { @@ -35,5 +35,5 @@ impl S { } fn main() { - S.hello_method(); //~ no method named `hello_method` found for type `S` in the current scope + S.hello_method(); //~ no method named `hello_method` found } diff --git a/src/test/ui/did_you_mean/issue-40006.stderr b/src/test/ui/did_you_mean/issue-40006.stderr index 30ae6ed4c6..072e61f6a3 100644 --- a/src/test/ui/did_you_mean/issue-40006.stderr +++ b/src/test/ui/did_you_mean/issue-40006.stderr @@ -1,4 +1,4 @@ -error: missing `fn`, `type`, or `const` for impl-item declaration +error: missing `fn`, `type`, or `const` for associated-item declaration --> $DIR/issue-40006.rs:1:13 | LL | impl dyn A { @@ -6,7 +6,7 @@ LL | impl dyn A { LL | | Y | |____^ missing `fn`, `type`, or `const` -error: missing `fn`, `type`, or `const` for trait-item declaration +error: missing `fn`, `type`, or `const` for associated-item declaration --> $DIR/issue-40006.rs:7:10 | LL | trait X { @@ -14,7 +14,7 @@ LL | trait X { LL | | X() {} | |____^ missing `fn`, `type`, or `const` -error: missing `fn`, `type`, or `const` for trait-item declaration +error: missing `fn`, `type`, or `const` for associated-item declaration --> $DIR/issue-40006.rs:15:10 | LL | trait A { @@ -28,7 +28,7 @@ error: expected `[`, found `#` LL | fn xxx() { ### } | ^ expected `[` -error: missing `fn`, `type`, or `const` for trait-item declaration +error: missing `fn`, `type`, or `const` for associated-item declaration --> $DIR/issue-40006.rs:21:10 | LL | trait C { @@ -36,7 +36,7 @@ LL | trait C { LL | | L = M; | |____^ missing `fn`, `type`, or `const` -error: missing `fn`, `type`, or `const` for trait-item declaration +error: missing `fn`, `type`, or `const` for associated-item declaration --> $DIR/issue-40006.rs:24:10 | LL | trait D { @@ -50,13 +50,13 @@ error: expected one of `!` or `::`, found `(` LL | ::Y (); | ^ expected one of `!` or `::` -error: missing `fn`, `type`, or `const` for impl-item declaration +error: missing `fn`, `type`, or `const` for associated-item declaration --> $DIR/issue-40006.rs:32:8 | LL | pub hello_method(&self) { | ^ missing `fn`, `type`, or `const` -error[E0599]: no method named `hello_method` found for type `S` in the current scope +error[E0599]: no method named `hello_method` found for struct `S` in the current scope --> $DIR/issue-40006.rs:38:7 | LL | struct S; diff --git a/src/test/ui/did_you_mean/issue-40396.rs b/src/test/ui/did_you_mean/issue-40396.rs index 1893355205..e4e94bb949 100644 --- a/src/test/ui/did_you_mean/issue-40396.rs +++ b/src/test/ui/did_you_mean/issue-40396.rs @@ -1,8 +1,8 @@ fn main() { (0..13).collect<Vec<i32>>(); - //~^ ERROR chained comparison + //~^ ERROR comparison operators cannot be chained Vec<i32>::new(); - //~^ ERROR chained comparison + //~^ ERROR comparison operators cannot be chained (0..13).collect<Vec<i32>(); - //~^ ERROR chained comparison + //~^ ERROR comparison operators cannot be chained } diff --git a/src/test/ui/did_you_mean/issue-40396.stderr b/src/test/ui/did_you_mean/issue-40396.stderr index 749d1093cc..f952136a7b 100644 --- a/src/test/ui/did_you_mean/issue-40396.stderr +++ b/src/test/ui/did_you_mean/issue-40396.stderr @@ -1,15 +1,23 @@ -error: chained comparison operators require parentheses +error: comparison operators cannot be chained --> $DIR/issue-40396.rs:2:20 | LL | (0..13).collect<Vec<i32>>(); | ^^^^^ | +help: split the comparison into two... + | +LL | (0..13).collect < Vec && Vec <i32>>(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | ((0..13).collect < Vec) <i32>>(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `::<...>` instead of `<...>` to specify type arguments | LL | (0..13).collect::<Vec<i32>>(); | ^^ -error: chained comparison operators require parentheses +error: comparison operators cannot be chained --> $DIR/issue-40396.rs:4:8 | LL | Vec<i32>::new(); @@ -20,12 +28,20 @@ help: use `::<...>` instead of `<...>` to specify type arguments LL | Vec::<i32>::new(); | ^^ -error: chained comparison operators require parentheses +error: comparison operators cannot be chained --> $DIR/issue-40396.rs:6:20 | LL | (0..13).collect<Vec<i32>(); | ^^^^^ | +help: split the comparison into two... + | +LL | (0..13).collect < Vec && Vec <i32>(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | ((0..13).collect < Vec) <i32>(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `::<...>` instead of `<...>` to specify type arguments | LL | (0..13).collect::<Vec<i32>(); diff --git a/src/test/ui/did_you_mean/issue-46836-identifier-not-instead-of-negation.stderr b/src/test/ui/did_you_mean/issue-46836-identifier-not-instead-of-negation.stderr index f5edbe2a3a..8025886a9e 100644 --- a/src/test/ui/did_you_mean/issue-46836-identifier-not-instead-of-negation.stderr +++ b/src/test/ui/did_you_mean/issue-46836-identifier-not-instead-of-negation.stderr @@ -26,7 +26,7 @@ error: expected `{`, found `;` --> $DIR/issue-46836-identifier-not-instead-of-negation.rs:20:31 | LL | if not // lack of braces is [sic] - | -- this `if` statement has a condition, but no block + | -- this `if` expression has a condition, but no block LL | println!("Then when?"); | ^ | | diff --git a/src/test/ui/did_you_mean/issue-48492-tuple-destructure-missing-parens.stderr b/src/test/ui/did_you_mean/issue-48492-tuple-destructure-missing-parens.stderr index 705c90985d..d05d6d120b 100644 --- a/src/test/ui/did_you_mean/issue-48492-tuple-destructure-missing-parens.stderr +++ b/src/test/ui/did_you_mean/issue-48492-tuple-destructure-missing-parens.stderr @@ -4,11 +4,11 @@ error: unexpected `,` in pattern LL | while let b1, b2, b3 = reading_frame.next().expect("there should be a start codon") { | ^ | -help: try adding parentheses to match on a tuple.. +help: try adding parentheses to match on a tuple... | LL | while let (b1, b2, b3) = reading_frame.next().expect("there should be a start codon") { | ^^^^^^^^^^^^ -help: ..or a vertical bar to match on multiple alternatives +help: ...or a vertical bar to match on multiple alternatives | LL | while let b1 | b2 | b3 = reading_frame.next().expect("there should be a start codon") { | ^^^^^^^^^^^^ @@ -19,11 +19,11 @@ error: unexpected `,` in pattern LL | if let b1, b2, b3 = reading_frame.next().unwrap() { | ^ | -help: try adding parentheses to match on a tuple.. +help: try adding parentheses to match on a tuple... | LL | if let (b1, b2, b3) = reading_frame.next().unwrap() { | ^^^^^^^^^^^^ -help: ..or a vertical bar to match on multiple alternatives +help: ...or a vertical bar to match on multiple alternatives | LL | if let b1 | b2 | b3 = reading_frame.next().unwrap() { | ^^^^^^^^^^^^ @@ -34,11 +34,11 @@ error: unexpected `,` in pattern LL | Nucleotide::Adenine, Nucleotide::Cytosine, _ => true | ^ | -help: try adding parentheses to match on a tuple.. +help: try adding parentheses to match on a tuple... | LL | (Nucleotide::Adenine, Nucleotide::Cytosine, _) => true | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -help: ..or a vertical bar to match on multiple alternatives +help: ...or a vertical bar to match on multiple alternatives | LL | Nucleotide::Adenine | Nucleotide::Cytosine | _ => true | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -49,11 +49,11 @@ error: unexpected `,` in pattern LL | for x, _barr_body in women.iter().map(|woman| woman.allosomes.clone()) { | ^ | -help: try adding parentheses to match on a tuple.. +help: try adding parentheses to match on a tuple... | LL | for (x, _barr_body) in women.iter().map(|woman| woman.allosomes.clone()) { | ^^^^^^^^^^^^^^^ -help: ..or a vertical bar to match on multiple alternatives +help: ...or a vertical bar to match on multiple alternatives | LL | for x | _barr_body in women.iter().map(|woman| woman.allosomes.clone()) { | ^^^^^^^^^^^^^^ @@ -64,11 +64,11 @@ error: unexpected `,` in pattern LL | for x, y @ Allosome::Y(_) in men.iter().map(|man| man.allosomes.clone()) { | ^ | -help: try adding parentheses to match on a tuple.. +help: try adding parentheses to match on a tuple... | LL | for (x, y @ Allosome::Y(_)) in men.iter().map(|man| man.allosomes.clone()) { | ^^^^^^^^^^^^^^^^^^^^^^^ -help: ..or a vertical bar to match on multiple alternatives +help: ...or a vertical bar to match on multiple alternatives | LL | for x | y @ Allosome::Y(_) in men.iter().map(|man| man.allosomes.clone()) { | ^^^^^^^^^^^^^^^^^^^^^^ @@ -79,11 +79,11 @@ error: unexpected `,` in pattern LL | let women, men: (Vec<Genome>, Vec<Genome>) = genomes.iter().cloned() | ^ | -help: try adding parentheses to match on a tuple.. +help: try adding parentheses to match on a tuple... | LL | let (women, men): (Vec<Genome>, Vec<Genome>) = genomes.iter().cloned() | ^^^^^^^^^^^^ -help: ..or a vertical bar to match on multiple alternatives +help: ...or a vertical bar to match on multiple alternatives | LL | let women | men: (Vec<Genome>, Vec<Genome>) = genomes.iter().cloned() | ^^^^^^^^^^^ diff --git a/src/test/ui/did_you_mean/issue-54109-and_instead_of_ampersands.rs b/src/test/ui/did_you_mean/issue-54109-and_instead_of_ampersands.rs index 687479bad3..467daef63f 100644 --- a/src/test/ui/did_you_mean/issue-54109-and_instead_of_ampersands.rs +++ b/src/test/ui/did_you_mean/issue-54109-and_instead_of_ampersands.rs @@ -1,17 +1,29 @@ +fn main() {} + fn test_and() { let a = true; let b = false; - if a and b { - //~^ ERROR expected `{`, found `and` + + let _ = a and b; //~ ERROR `and` is not a logical operator + //~| ERROR `and` is not a logical operator + + if a and b { //~ ERROR `and` is not a logical operator + //~| ERROR `and` is not a logical operator println!("both"); } + + let _recovery_witness: () = 0; //~ ERROR mismatched types } fn test_or() { let a = true; let b = false; - if a or b { - //~^ ERROR expected `{`, found `or` + + let _ = a or b; //~ ERROR `or` is not a logical operator + //~| ERROR `or` is not a logical operator + + if a or b { //~ ERROR `or` is not a logical operator + //~| ERROR `or` is not a logical operator println!("both"); } } @@ -19,8 +31,8 @@ fn test_or() { fn test_and_par() { let a = true; let b = false; - if (a and b) { - //~^ ERROR expected one of `!`, `)`, `,`, `.`, `::`, `?`, `{`, or an operator, found `and` + if (a and b) { //~ ERROR `and` is not a logical operator + //~| ERROR `and` is not a logical operator println!("both"); } } @@ -28,8 +40,8 @@ fn test_and_par() { fn test_or_par() { let a = true; let b = false; - if (a or b) { - //~^ ERROR expected one of `!`, `)`, `,`, `.`, `::`, `?`, `{`, or an operator, found `or` + if (a or b) { //~ ERROR `or` is not a logical operator + //~| ERROR `or` is not a logical operator println!("both"); } } @@ -37,8 +49,8 @@ fn test_or_par() { fn test_while_and() { let a = true; let b = false; - while a and b { - //~^ ERROR expected one of `!`, `.`, `::`, `?`, `{`, or an operator, found `and` + while a and b { //~ ERROR `and` is not a logical operator + //~| ERROR `and` is not a logical operator println!("both"); } } @@ -46,11 +58,8 @@ fn test_while_and() { fn test_while_or() { let a = true; let b = false; - while a or b { - //~^ ERROR expected one of `!`, `.`, `::`, `?`, `{`, or an operator, found `or` + while a or b { //~ ERROR `or` is not a logical operator + //~| ERROR `or` is not a logical operator println!("both"); } } - -fn main() { -} diff --git a/src/test/ui/did_you_mean/issue-54109-and_instead_of_ampersands.stderr b/src/test/ui/did_you_mean/issue-54109-and_instead_of_ampersands.stderr index f230395f7a..e8731cf238 100644 --- a/src/test/ui/did_you_mean/issue-54109-and_instead_of_ampersands.stderr +++ b/src/test/ui/did_you_mean/issue-54109-and_instead_of_ampersands.stderr @@ -1,58 +1,139 @@ -error: expected `{`, found `and` - --> $DIR/issue-54109-and_instead_of_ampersands.rs:4:10 +error: `and` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:7:15 + | +LL | let _ = a and b; + | ^^^ help: use `&&` to perform logical conjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `and` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:7:15 + | +LL | let _ = a and b; + | ^^^ help: use `&&` to perform logical conjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `and` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:10:10 | LL | if a and b { - | -- ^^^ - | | | - | | expected `{` - | | help: use `&&` instead of `and` for the boolean operator - | this `if` statement has a condition, but no block + | ^^^ help: use `&&` to perform logical conjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `and` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:10:10 + | +LL | if a and b { + | ^^^ help: use `&&` to perform logical conjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators -error: expected `{`, found `or` - --> $DIR/issue-54109-and_instead_of_ampersands.rs:13:10 +error: `or` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:22:15 + | +LL | let _ = a or b; + | ^^ help: use `||` to perform logical disjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `or` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:22:15 + | +LL | let _ = a or b; + | ^^ help: use `||` to perform logical disjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `or` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:25:10 | LL | if a or b { - | -- ^^ - | | | - | | expected `{` - | | help: use `||` instead of `or` for the boolean operator - | this `if` statement has a condition, but no block + | ^^ help: use `||` to perform logical disjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `or` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:25:10 + | +LL | if a or b { + | ^^ help: use `||` to perform logical disjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators -error: expected one of `!`, `)`, `,`, `.`, `::`, `?`, `{`, or an operator, found `and` - --> $DIR/issue-54109-and_instead_of_ampersands.rs:22:11 +error: `and` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:34:11 | LL | if (a and b) { - | ^^^ - | | - | expected one of 8 possible tokens - | help: use `&&` instead of `and` for the boolean operator + | ^^^ help: use `&&` to perform logical conjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `and` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:34:11 + | +LL | if (a and b) { + | ^^^ help: use `&&` to perform logical conjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators -error: expected one of `!`, `)`, `,`, `.`, `::`, `?`, `{`, or an operator, found `or` - --> $DIR/issue-54109-and_instead_of_ampersands.rs:31:11 +error: `or` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:43:11 | LL | if (a or b) { - | ^^ - | | - | expected one of 8 possible tokens - | help: use `||` instead of `or` for the boolean operator + | ^^ help: use `||` to perform logical disjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `or` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:43:11 + | +LL | if (a or b) { + | ^^ help: use `||` to perform logical disjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `and` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:52:13 + | +LL | while a and b { + | ^^^ help: use `&&` to perform logical conjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators -error: expected one of `!`, `.`, `::`, `?`, `{`, or an operator, found `and` - --> $DIR/issue-54109-and_instead_of_ampersands.rs:40:13 +error: `and` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:52:13 | LL | while a and b { - | ^^^ - | | - | expected one of `!`, `.`, `::`, `?`, `{`, or an operator - | help: use `&&` instead of `and` for the boolean operator + | ^^^ help: use `&&` to perform logical conjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators -error: expected one of `!`, `.`, `::`, `?`, `{`, or an operator, found `or` - --> $DIR/issue-54109-and_instead_of_ampersands.rs:49:13 +error: `or` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:61:13 | LL | while a or b { - | ^^ - | | - | expected one of `!`, `.`, `::`, `?`, `{`, or an operator - | help: use `||` instead of `or` for the boolean operator + | ^^ help: use `||` to perform logical disjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error: `or` is not a logical operator + --> $DIR/issue-54109-and_instead_of_ampersands.rs:61:13 + | +LL | while a or b { + | ^^ help: use `||` to perform logical disjunction + | + = note: unlike in e.g., python and PHP, `&&` and `||` are used for logical operators + +error[E0308]: mismatched types + --> $DIR/issue-54109-and_instead_of_ampersands.rs:15:33 + | +LL | let _recovery_witness: () = 0; + | -- ^ expected `()`, found integer + | | + | expected due to this -error: aborting due to 6 previous errors +error: aborting due to 17 previous errors +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/did_you_mean/recursion_limit_macro.stderr b/src/test/ui/did_you_mean/recursion_limit_macro.stderr index 6640ced5c9..1cc5905160 100644 --- a/src/test/ui/did_you_mean/recursion_limit_macro.stderr +++ b/src/test/ui/did_you_mean/recursion_limit_macro.stderr @@ -1,4 +1,4 @@ -error: recursion limit reached while expanding the macro `recurse` +error: recursion limit reached while expanding `recurse!` --> $DIR/recursion_limit_macro.rs:10:31 | LL | ($t:tt $($tail:tt)*) => { recurse!($($tail)*) }; diff --git a/src/test/ui/dollar-crate/dollar-crate-is-keyword.rs b/src/test/ui/dollar-crate/dollar-crate-is-keyword.rs index 6deaeb8117..d625163dc7 100644 --- a/src/test/ui/dollar-crate/dollar-crate-is-keyword.rs +++ b/src/test/ui/dollar-crate/dollar-crate-is-keyword.rs @@ -6,10 +6,9 @@ macro_rules! m { struct $crate {} //~ ERROR expected identifier, found reserved identifier `$crate` } - use $crate; // OK - //~^ WARN `$crate` may not be imported + use $crate; //~ ERROR `$crate` may not be imported use $crate as $crate; //~ ERROR expected identifier, found reserved identifier `$crate` - //~^ WARN `$crate` may not be imported + //~^ ERROR `$crate` may not be imported } } diff --git a/src/test/ui/dollar-crate/dollar-crate-is-keyword.stderr b/src/test/ui/dollar-crate/dollar-crate-is-keyword.stderr index 5d4f39086c..f5a5f13f91 100644 --- a/src/test/ui/dollar-crate/dollar-crate-is-keyword.stderr +++ b/src/test/ui/dollar-crate/dollar-crate-is-keyword.stderr @@ -8,7 +8,7 @@ LL | m!(); | ----- in this macro invocation error: expected identifier, found reserved identifier `$crate` - --> $DIR/dollar-crate-is-keyword.rs:11:23 + --> $DIR/dollar-crate-is-keyword.rs:10:23 | LL | use $crate as $crate; | ^^^^^^ expected identifier, found reserved identifier @@ -16,27 +16,23 @@ LL | use $crate as $crate; LL | m!(); | ----- in this macro invocation -warning: `$crate` may not be imported +error: `$crate` may not be imported --> $DIR/dollar-crate-is-keyword.rs:9:9 | -LL | use $crate; // OK +LL | use $crate; | ^^^^^^^^^^^ ... LL | m!(); | ----- in this macro invocation - | - = note: `use $crate;` was erroneously allowed and will become a hard error in a future release -warning: `$crate` may not be imported - --> $DIR/dollar-crate-is-keyword.rs:11:9 +error: `$crate` may not be imported + --> $DIR/dollar-crate-is-keyword.rs:10:9 | LL | use $crate as $crate; | ^^^^^^^^^^^^^^^^^^^^^ ... LL | m!(); | ----- in this macro invocation - | - = note: `use $crate;` was erroneously allowed and will become a hard error in a future release -error: aborting due to 2 previous errors +error: aborting due to 4 previous errors diff --git a/src/test/ui/dont-suggest-private-trait-method.rs b/src/test/ui/dont-suggest-private-trait-method.rs index ef0904c1a2..6e2b1abd13 100644 --- a/src/test/ui/dont-suggest-private-trait-method.rs +++ b/src/test/ui/dont-suggest-private-trait-method.rs @@ -2,5 +2,5 @@ struct T; fn main() { T::new(); - //~^ ERROR no function or associated item named `new` found for type `T` in the current scope + //~^ ERROR no function or associated item named `new` found } diff --git a/src/test/ui/dont-suggest-private-trait-method.stderr b/src/test/ui/dont-suggest-private-trait-method.stderr index 5189ffa62d..fd7fdb4f72 100644 --- a/src/test/ui/dont-suggest-private-trait-method.stderr +++ b/src/test/ui/dont-suggest-private-trait-method.stderr @@ -1,4 +1,4 @@ -error[E0599]: no function or associated item named `new` found for type `T` in the current scope +error[E0599]: no function or associated item named `new` found for struct `T` in the current scope --> $DIR/dont-suggest-private-trait-method.rs:4:8 | LL | struct T; diff --git a/src/test/ui/drop/dynamic-drop-async.rs b/src/test/ui/drop/dynamic-drop-async.rs index 91063edf0f..30a8960594 100644 --- a/src/test/ui/drop/dynamic-drop-async.rs +++ b/src/test/ui/drop/dynamic-drop-async.rs @@ -7,7 +7,6 @@ // edition:2018 // ignore-wasm32-bare compiled with panic=abort by default -#![feature(slice_patterns)] #![allow(unused)] use std::{ diff --git a/src/test/ui/drop/dynamic-drop.rs b/src/test/ui/drop/dynamic-drop.rs index 0f0ec0ba46..b4406204a5 100644 --- a/src/test/ui/drop/dynamic-drop.rs +++ b/src/test/ui/drop/dynamic-drop.rs @@ -1,11 +1,10 @@ // run-pass -#![allow(unused_assignments)] -#![allow(unused_variables)] - // ignore-wasm32-bare compiled with panic=abort by default #![feature(generators, generator_trait, untagged_unions)] -#![feature(slice_patterns)] + +#![allow(unused_assignments)] +#![allow(unused_variables)] use std::cell::{Cell, RefCell}; use std::mem::ManuallyDrop; diff --git a/src/test/ui/dropck/drop-on-non-struct.rs b/src/test/ui/dropck/drop-on-non-struct.rs index 259cdf40ae..ef5e18126d 100644 --- a/src/test/ui/dropck/drop-on-non-struct.rs +++ b/src/test/ui/dropck/drop-on-non-struct.rs @@ -1,10 +1,15 @@ impl<'a> Drop for &'a mut isize { - //~^ ERROR the Drop trait may only be implemented on structures + //~^ ERROR the `Drop` trait may only be implemented for structs, enums, and unions //~^^ ERROR E0117 fn drop(&mut self) { println!("kaboom"); } } +impl Drop for Nonexistent { + //~^ ERROR cannot find type `Nonexistent` + fn drop(&mut self) { } +} + fn main() { } diff --git a/src/test/ui/dropck/drop-on-non-struct.stderr b/src/test/ui/dropck/drop-on-non-struct.stderr index a374b0d263..3991c44f2e 100644 --- a/src/test/ui/dropck/drop-on-non-struct.stderr +++ b/src/test/ui/dropck/drop-on-non-struct.stderr @@ -1,8 +1,14 @@ -error[E0120]: the Drop trait may only be implemented on structures +error[E0412]: cannot find type `Nonexistent` in this scope + --> $DIR/drop-on-non-struct.rs:9:15 + | +LL | impl Drop for Nonexistent { + | ^^^^^^^^^^^ not found in this scope + +error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions --> $DIR/drop-on-non-struct.rs:1:19 | LL | impl<'a> Drop for &'a mut isize { - | ^^^^^^^^^^^^^ implementing Drop requires a struct + | ^^^^^^^^^^^^^ must be a struct, enum, or union error[E0117]: only traits defined in the current crate can be implemented for arbitrary types --> $DIR/drop-on-non-struct.rs:1:1 @@ -15,7 +21,7 @@ LL | impl<'a> Drop for &'a mut isize { | = note: define and implement a trait or new type instead -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors -Some errors have detailed explanations: E0117, E0120. +Some errors have detailed explanations: E0117, E0120, E0412. For more information about an error, try `rustc --explain E0117`. diff --git a/src/test/ui/dropck/dropck_fn_type.rs b/src/test/ui/dropck/dropck_fn_type.rs new file mode 100644 index 0000000000..2934217df3 --- /dev/null +++ b/src/test/ui/dropck/dropck_fn_type.rs @@ -0,0 +1,20 @@ +// run-pass +//! Regression test for #58311, regarding the usage of Fn types in drop impls + +// All of this Drop impls should compile. + +#[allow(dead_code)] +struct S<F: Fn() -> [u8; 1]>(F); + +impl<F: Fn() -> [u8; 1]> Drop for S<F> { + fn drop(&mut self) {} +} + +#[allow(dead_code)] +struct P<A, F: FnOnce() -> [A; 10]>(F); + +impl<A, F: FnOnce() -> [A; 10]> Drop for P<A, F> { + fn drop(&mut self) {} +} + +fn main() {} diff --git a/src/test/ui/dropck/dropck_traits.rs b/src/test/ui/dropck/dropck_traits.rs new file mode 100644 index 0000000000..98e8e88a25 --- /dev/null +++ b/src/test/ui/dropck/dropck_traits.rs @@ -0,0 +1,68 @@ +// run-pass +//! Regression test for #34426, regarding HRTB in drop impls + +// All of this Drop impls should compile. + +pub trait Lifetime<'a> {} +impl<'a> Lifetime<'a> for i32 {} + +#[allow(dead_code)] +struct Foo<L> +where + for<'a> L: Lifetime<'a>, +{ + l: L, +} + +impl<L> Drop for Foo<L> +where + for<'a> L: Lifetime<'a>, +{ + fn drop(&mut self) {} +} + +#[allow(dead_code)] +struct Foo2<L> +where + for<'a> L: Lifetime<'a>, +{ + l: L, +} + +impl<T: for<'a> Lifetime<'a>> Drop for Foo2<T> +where + for<'x> T: Lifetime<'x>, +{ + fn drop(&mut self) {} +} + +pub trait Lifetime2<'a, 'b> {} +impl<'a, 'b> Lifetime2<'a, 'b> for i32 {} + +#[allow(dead_code)] +struct Bar<L> +where + for<'a, 'b> L: Lifetime2<'a, 'b>, +{ + l: L, +} + +impl<L> Drop for Bar<L> +where + for<'a, 'b> L: Lifetime2<'a, 'b>, +{ + fn drop(&mut self) {} +} + +#[allow(dead_code)] +struct FnHolder<T: for<'a> Fn(&'a T, dyn for<'b> Lifetime2<'a, 'b>) -> u8>(T); + +impl<T: for<'a> Fn(&'a T, dyn for<'b> Lifetime2<'a, 'b>) -> u8> Drop for FnHolder<T> { + fn drop(&mut self) {} +} + +fn main() { + let _foo = Foo { l: 0 }; + + let _bar = Bar { l: 0 }; +} diff --git a/src/test/ui/dst/dst-bad-assign-3.rs b/src/test/ui/dst/dst-bad-assign-3.rs index e3b621b909..d05b3937c9 100644 --- a/src/test/ui/dst/dst-bad-assign-3.rs +++ b/src/test/ui/dst/dst-bad-assign-3.rs @@ -32,7 +32,7 @@ pub fn main() { let z: Box<dyn ToBar> = Box::new(Bar1 {f: 36}); f5.2 = Bar1 {f: 36}; //~^ ERROR mismatched types - //~| expected trait `ToBar`, found struct `Bar1` + //~| expected trait object `dyn ToBar`, found struct `Bar1` //~| expected trait object `dyn ToBar` //~| found struct `Bar1` //~| ERROR the size for values of type diff --git a/src/test/ui/dst/dst-bad-assign-3.stderr b/src/test/ui/dst/dst-bad-assign-3.stderr index dc03f38e10..0b6f9df2d8 100644 --- a/src/test/ui/dst/dst-bad-assign-3.stderr +++ b/src/test/ui/dst/dst-bad-assign-3.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/dst-bad-assign-3.rs:33:12 | LL | f5.2 = Bar1 {f: 36}; - | ^^^^^^^^^^^^ expected trait `ToBar`, found struct `Bar1` + | ^^^^^^^^^^^^ expected trait object `dyn ToBar`, found struct `Bar1` | = note: expected trait object `dyn ToBar` found struct `Bar1` diff --git a/src/test/ui/dst/dst-bad-assign.rs b/src/test/ui/dst/dst-bad-assign.rs index ed94242f5b..496e01ae00 100644 --- a/src/test/ui/dst/dst-bad-assign.rs +++ b/src/test/ui/dst/dst-bad-assign.rs @@ -34,7 +34,7 @@ pub fn main() { let z: Box<dyn ToBar> = Box::new(Bar1 {f: 36}); f5.ptr = Bar1 {f: 36}; //~^ ERROR mismatched types - //~| expected trait `ToBar`, found struct `Bar1` + //~| expected trait object `dyn ToBar`, found struct `Bar1` //~| expected trait object `dyn ToBar` //~| found struct `Bar1` //~| ERROR the size for values of type diff --git a/src/test/ui/dst/dst-bad-assign.stderr b/src/test/ui/dst/dst-bad-assign.stderr index 8031f16248..434c460759 100644 --- a/src/test/ui/dst/dst-bad-assign.stderr +++ b/src/test/ui/dst/dst-bad-assign.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/dst-bad-assign.rs:35:14 | LL | f5.ptr = Bar1 {f: 36}; - | ^^^^^^^^^^^^ expected trait `ToBar`, found struct `Bar1` + | ^^^^^^^^^^^^ expected trait object `dyn ToBar`, found struct `Bar1` | = note: expected trait object `dyn ToBar` found struct `Bar1` diff --git a/src/test/ui/duplicate/dupe-symbols-1.rs b/src/test/ui/duplicate/dupe-symbols-1.rs index f943c7b111..28e329b56c 100644 --- a/src/test/ui/duplicate/dupe-symbols-1.rs +++ b/src/test/ui/duplicate/dupe-symbols-1.rs @@ -1,3 +1,5 @@ +// build-fail + // #![crate_type="rlib"] #![allow(warnings)] diff --git a/src/test/ui/duplicate/dupe-symbols-1.stderr b/src/test/ui/duplicate/dupe-symbols-1.stderr index c46ac0c6ed..cca8b4d25d 100644 --- a/src/test/ui/duplicate/dupe-symbols-1.stderr +++ b/src/test/ui/duplicate/dupe-symbols-1.stderr @@ -1,5 +1,5 @@ error: symbol `fail` is already defined - --> $DIR/dupe-symbols-1.rs:10:1 + --> $DIR/dupe-symbols-1.rs:12:1 | LL | / pub fn b() { LL | | diff --git a/src/test/ui/duplicate/dupe-symbols-2.rs b/src/test/ui/duplicate/dupe-symbols-2.rs index 9257f97fb9..d9edd77a19 100644 --- a/src/test/ui/duplicate/dupe-symbols-2.rs +++ b/src/test/ui/duplicate/dupe-symbols-2.rs @@ -1,3 +1,5 @@ +// build-fail + // #![crate_type="rlib"] #![allow(warnings)] diff --git a/src/test/ui/duplicate/dupe-symbols-2.stderr b/src/test/ui/duplicate/dupe-symbols-2.stderr index 821bdd0339..017aade312 100644 --- a/src/test/ui/duplicate/dupe-symbols-2.stderr +++ b/src/test/ui/duplicate/dupe-symbols-2.stderr @@ -1,5 +1,5 @@ error: symbol `fail` is already defined - --> $DIR/dupe-symbols-2.rs:13:5 + --> $DIR/dupe-symbols-2.rs:15:5 | LL | / pub extern fn fail() { LL | | diff --git a/src/test/ui/duplicate/dupe-symbols-3.rs b/src/test/ui/duplicate/dupe-symbols-3.rs index 03b3a0ab20..1af2fe98e5 100644 --- a/src/test/ui/duplicate/dupe-symbols-3.rs +++ b/src/test/ui/duplicate/dupe-symbols-3.rs @@ -1,3 +1,5 @@ +// build-fail + // #![crate_type="rlib"] #![allow(warnings)] diff --git a/src/test/ui/duplicate/dupe-symbols-3.stderr b/src/test/ui/duplicate/dupe-symbols-3.stderr index f30c88e476..2e2ac3a98b 100644 --- a/src/test/ui/duplicate/dupe-symbols-3.stderr +++ b/src/test/ui/duplicate/dupe-symbols-3.stderr @@ -1,5 +1,5 @@ error: symbol `fail` is already defined - --> $DIR/dupe-symbols-3.rs:10:1 + --> $DIR/dupe-symbols-3.rs:12:1 | LL | / pub fn fail() { LL | | diff --git a/src/test/ui/duplicate/dupe-symbols-4.rs b/src/test/ui/duplicate/dupe-symbols-4.rs index 8fbf1151f7..de6610c3e7 100644 --- a/src/test/ui/duplicate/dupe-symbols-4.rs +++ b/src/test/ui/duplicate/dupe-symbols-4.rs @@ -1,3 +1,5 @@ +// build-fail + // // error-pattern: symbol `fail` is already defined #![crate_type="rlib"] diff --git a/src/test/ui/duplicate/dupe-symbols-4.stderr b/src/test/ui/duplicate/dupe-symbols-4.stderr index 84d57766c3..10b93891b6 100644 --- a/src/test/ui/duplicate/dupe-symbols-4.stderr +++ b/src/test/ui/duplicate/dupe-symbols-4.stderr @@ -1,5 +1,5 @@ error: symbol `fail` is already defined - --> $DIR/dupe-symbols-4.rs:21:5 + --> $DIR/dupe-symbols-4.rs:23:5 | LL | fn fail(self) {} | ^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/duplicate/dupe-symbols-5.rs b/src/test/ui/duplicate/dupe-symbols-5.rs index 4a96a68582..ea801cef64 100644 --- a/src/test/ui/duplicate/dupe-symbols-5.rs +++ b/src/test/ui/duplicate/dupe-symbols-5.rs @@ -1,3 +1,5 @@ +// build-fail + // #![crate_type="rlib"] #![allow(warnings)] diff --git a/src/test/ui/duplicate/dupe-symbols-5.stderr b/src/test/ui/duplicate/dupe-symbols-5.stderr index cee72660e4..ebeb19f94f 100644 --- a/src/test/ui/duplicate/dupe-symbols-5.stderr +++ b/src/test/ui/duplicate/dupe-symbols-5.stderr @@ -1,5 +1,5 @@ error: symbol `fail` is already defined - --> $DIR/dupe-symbols-5.rs:9:1 + --> $DIR/dupe-symbols-5.rs:11:1 | LL | / pub fn b() { LL | | diff --git a/src/test/ui/duplicate/dupe-symbols-6.rs b/src/test/ui/duplicate/dupe-symbols-6.rs index 5a1b917f17..018f4bb7f0 100644 --- a/src/test/ui/duplicate/dupe-symbols-6.rs +++ b/src/test/ui/duplicate/dupe-symbols-6.rs @@ -1,3 +1,5 @@ +// build-fail + #![crate_type="rlib"] #![allow(warnings)] diff --git a/src/test/ui/duplicate/dupe-symbols-6.stderr b/src/test/ui/duplicate/dupe-symbols-6.stderr index 69781ee3e0..8d5b7fb35b 100644 --- a/src/test/ui/duplicate/dupe-symbols-6.stderr +++ b/src/test/ui/duplicate/dupe-symbols-6.stderr @@ -1,5 +1,5 @@ error: symbol `fail` is already defined - --> $DIR/dupe-symbols-6.rs:8:1 + --> $DIR/dupe-symbols-6.rs:10:1 | LL | static HELLO_TWICE: u16 = 0; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/duplicate/dupe-symbols-7.rs b/src/test/ui/duplicate/dupe-symbols-7.rs index b838aaa102..89a32c6162 100644 --- a/src/test/ui/duplicate/dupe-symbols-7.rs +++ b/src/test/ui/duplicate/dupe-symbols-7.rs @@ -1,3 +1,5 @@ +// build-fail + // // error-pattern: entry symbol `main` defined multiple times diff --git a/src/test/ui/duplicate/dupe-symbols-7.stderr b/src/test/ui/duplicate/dupe-symbols-7.stderr index d2cb4e0970..608ae27110 100644 --- a/src/test/ui/duplicate/dupe-symbols-7.stderr +++ b/src/test/ui/duplicate/dupe-symbols-7.stderr @@ -1,5 +1,5 @@ error: entry symbol `main` defined multiple times - --> $DIR/dupe-symbols-7.rs:10:1 + --> $DIR/dupe-symbols-7.rs:12:1 | LL | fn main(){} | ^^^^^^^^^^^ diff --git a/src/test/ui/duplicate_entry_error.rs b/src/test/ui/duplicate_entry_error.rs index 62df42b1a6..b8d98a8999 100644 --- a/src/test/ui/duplicate_entry_error.rs +++ b/src/test/ui/duplicate_entry_error.rs @@ -8,7 +8,7 @@ use std::panic::PanicInfo; #[lang = "panic_impl"] fn panic_impl(info: &PanicInfo) -> ! { -//~^ ERROR: duplicate lang item found: `panic_impl`. +//~^ ERROR: found duplicate lang item `panic_impl` loop {} } diff --git a/src/test/ui/duplicate_entry_error.stderr b/src/test/ui/duplicate_entry_error.stderr index 02be11d1fd..46b137b2cf 100644 --- a/src/test/ui/duplicate_entry_error.stderr +++ b/src/test/ui/duplicate_entry_error.stderr @@ -1,4 +1,4 @@ -error[E0152]: duplicate lang item found: `panic_impl`. +error[E0152]: found duplicate lang item `panic_impl` --> $DIR/duplicate_entry_error.rs:10:1 | LL | / fn panic_impl(info: &PanicInfo) -> ! { @@ -7,7 +7,7 @@ LL | | loop {} LL | | } | |_^ | - = note: first defined in crate `std` (which `duplicate_entry_error` depends on). + = note: first defined in crate `std` (which `duplicate_entry_error` depends on) error: aborting due to previous error diff --git a/src/test/ui/dyn-trait-compatibility.stderr b/src/test/ui/dyn-trait-compatibility.stderr index 7210a11f35..8fe8ceb4d0 100644 --- a/src/test/ui/dyn-trait-compatibility.stderr +++ b/src/test/ui/dyn-trait-compatibility.stderr @@ -26,13 +26,17 @@ error[E0412]: cannot find type `dyn` in this scope --> $DIR/dyn-trait-compatibility.rs:5:15 | LL | type A2 = dyn<dyn, dyn>; - | ^^^ not found in this scope + | - ^^^ not found in this scope + | | + | help: you might be missing a type parameter: `<dyn>` error[E0412]: cannot find type `dyn` in this scope --> $DIR/dyn-trait-compatibility.rs:5:20 | LL | type A2 = dyn<dyn, dyn>; - | ^^^ not found in this scope + | - ^^^ not found in this scope + | | + | help: you might be missing a type parameter: `<dyn>` error[E0412]: cannot find type `dyn` in this scope --> $DIR/dyn-trait-compatibility.rs:9:11 @@ -44,7 +48,9 @@ error[E0412]: cannot find type `dyn` in this scope --> $DIR/dyn-trait-compatibility.rs:9:16 | LL | type A3 = dyn<<dyn as dyn>::dyn>; - | ^^^ not found in this scope + | - ^^^ not found in this scope + | | + | help: you might be missing a type parameter: `<dyn>` error: aborting due to 8 previous errors diff --git a/src/test/ui/empty/empty-struct-braces-expr.rs b/src/test/ui/empty/empty-struct-braces-expr.rs index 1a38d3d760..f4144277f1 100644 --- a/src/test/ui/empty/empty-struct-braces-expr.rs +++ b/src/test/ui/empty/empty-struct-braces-expr.rs @@ -22,8 +22,8 @@ fn main() { let xe1 = XEmpty1; //~ ERROR expected value, found struct `XEmpty1` let xe1 = XEmpty1(); //~^ ERROR expected function, tuple struct or tuple variant, found struct `XEmpty1` - let xe3 = XE::Empty3; //~ ERROR no variant or associated item named `Empty3` found for type - let xe3 = XE::Empty3(); //~ ERROR no variant or associated item named `Empty3` found for type + let xe3 = XE::Empty3; //~ ERROR no variant or associated item named `Empty3` found for enum + let xe3 = XE::Empty3(); //~ ERROR no variant or associated item named `Empty3` found for enum - XE::Empty1 {}; //~ ERROR no variant `Empty1` in enum `empty_struct::XE` + XE::Empty1 {}; //~ ERROR no variant named `Empty1` found for enum `empty_struct::XE` } diff --git a/src/test/ui/empty/empty-struct-braces-expr.stderr b/src/test/ui/empty/empty-struct-braces-expr.stderr index f427c1ba0a..9da3a5f5bd 100644 --- a/src/test/ui/empty/empty-struct-braces-expr.stderr +++ b/src/test/ui/empty/empty-struct-braces-expr.stderr @@ -9,6 +9,11 @@ LL | let e1 = Empty1; | | | did you mean `Empty1 { /* fields */ }`? | help: a unit struct with a similar name exists: `XEmpty2` + | + ::: $DIR/auxiliary/empty-struct.rs:2:1 + | +LL | pub struct XEmpty2; + | ------------------- similarly named unit struct `XEmpty2` defined here error[E0423]: expected function, tuple struct or tuple variant, found struct `Empty1` --> $DIR/empty-struct-braces-expr.rs:16:14 @@ -21,6 +26,11 @@ LL | let e1 = Empty1(); | | | did you mean `Empty1 { /* fields */ }`? | help: a unit struct with a similar name exists: `XEmpty2` + | + ::: $DIR/auxiliary/empty-struct.rs:2:1 + | +LL | pub struct XEmpty2; + | ------------------- similarly named unit struct `XEmpty2` defined here error[E0423]: expected value, found struct variant `E::Empty3` --> $DIR/empty-struct-braces-expr.rs:18:14 @@ -48,6 +58,11 @@ LL | let xe1 = XEmpty1; | | | did you mean `XEmpty1 { /* fields */ }`? | help: a unit struct with a similar name exists: `XEmpty2` + | + ::: $DIR/auxiliary/empty-struct.rs:2:1 + | +LL | pub struct XEmpty2; + | ------------------- similarly named unit struct `XEmpty2` defined here error[E0423]: expected function, tuple struct or tuple variant, found struct `XEmpty1` --> $DIR/empty-struct-braces-expr.rs:23:15 @@ -57,8 +72,13 @@ LL | let xe1 = XEmpty1(); | | | did you mean `XEmpty1 { /* fields */ }`? | help: a unit struct with a similar name exists: `XEmpty2` + | + ::: $DIR/auxiliary/empty-struct.rs:2:1 + | +LL | pub struct XEmpty2; + | ------------------- similarly named unit struct `XEmpty2` defined here -error[E0599]: no variant or associated item named `Empty3` found for type `empty_struct::XE` in the current scope +error[E0599]: no variant or associated item named `Empty3` found for enum `empty_struct::XE` in the current scope --> $DIR/empty-struct-braces-expr.rs:25:19 | LL | let xe3 = XE::Empty3; @@ -67,7 +87,7 @@ LL | let xe3 = XE::Empty3; | variant or associated item not found in `empty_struct::XE` | help: there is a variant with a similar name: `XEmpty3` -error[E0599]: no variant or associated item named `Empty3` found for type `empty_struct::XE` in the current scope +error[E0599]: no variant or associated item named `Empty3` found for enum `empty_struct::XE` in the current scope --> $DIR/empty-struct-braces-expr.rs:26:19 | LL | let xe3 = XE::Empty3(); @@ -76,7 +96,7 @@ LL | let xe3 = XE::Empty3(); | variant or associated item not found in `empty_struct::XE` | help: there is a variant with a similar name: `XEmpty3` -error: no variant `Empty1` in enum `empty_struct::XE` +error[E0599]: no variant named `Empty1` found for enum `empty_struct::XE` --> $DIR/empty-struct-braces-expr.rs:28:9 | LL | XE::Empty1 {}; diff --git a/src/test/ui/empty/empty-struct-braces-pat-1.stderr b/src/test/ui/empty/empty-struct-braces-pat-1.stderr index 9b5f31157d..0ff21c91b7 100644 --- a/src/test/ui/empty/empty-struct-braces-pat-1.stderr +++ b/src/test/ui/empty/empty-struct-braces-pat-1.stderr @@ -15,6 +15,11 @@ LL | XE::XEmpty3 => () | | | | | help: a unit variant with a similar name exists: `XEmpty4` | did you mean `XE::XEmpty3 { /* fields */ }`? + | + ::: $DIR/auxiliary/empty-struct.rs:7:5 + | +LL | XEmpty4, + | ------- similarly named unit variant `XEmpty4` defined here error: aborting due to 2 previous errors diff --git a/src/test/ui/empty/empty-struct-braces-pat-2.stderr b/src/test/ui/empty/empty-struct-braces-pat-2.stderr index 0b3c9ae515..80c29db8d9 100644 --- a/src/test/ui/empty/empty-struct-braces-pat-2.stderr +++ b/src/test/ui/empty/empty-struct-braces-pat-2.stderr @@ -9,6 +9,11 @@ LL | Empty1() => () | | | did you mean `Empty1 { /* fields */ }`? | help: a tuple struct with a similar name exists: `XEmpty6` + | + ::: $DIR/auxiliary/empty-struct.rs:3:1 + | +LL | pub struct XEmpty6(); + | --------------------- similarly named tuple struct `XEmpty6` defined here error[E0532]: expected tuple struct or tuple variant, found struct `XEmpty1` --> $DIR/empty-struct-braces-pat-2.rs:18:9 @@ -18,6 +23,11 @@ LL | XEmpty1() => () | | | did you mean `XEmpty1 { /* fields */ }`? | help: a tuple struct with a similar name exists: `XEmpty6` + | + ::: $DIR/auxiliary/empty-struct.rs:3:1 + | +LL | pub struct XEmpty6(); + | --------------------- similarly named tuple struct `XEmpty6` defined here error[E0532]: expected tuple struct or tuple variant, found struct `Empty1` --> $DIR/empty-struct-braces-pat-2.rs:21:9 @@ -30,6 +40,11 @@ LL | Empty1(..) => () | | | did you mean `Empty1 { /* fields */ }`? | help: a tuple struct with a similar name exists: `XEmpty6` + | + ::: $DIR/auxiliary/empty-struct.rs:3:1 + | +LL | pub struct XEmpty6(); + | --------------------- similarly named tuple struct `XEmpty6` defined here error[E0532]: expected tuple struct or tuple variant, found struct `XEmpty1` --> $DIR/empty-struct-braces-pat-2.rs:24:9 @@ -39,6 +54,11 @@ LL | XEmpty1(..) => () | | | did you mean `XEmpty1 { /* fields */ }`? | help: a tuple struct with a similar name exists: `XEmpty6` + | + ::: $DIR/auxiliary/empty-struct.rs:3:1 + | +LL | pub struct XEmpty6(); + | --------------------- similarly named tuple struct `XEmpty6` defined here error: aborting due to 4 previous errors diff --git a/src/test/ui/empty/empty-struct-braces-pat-3.stderr b/src/test/ui/empty/empty-struct-braces-pat-3.stderr index 785396c448..05439b39ea 100644 --- a/src/test/ui/empty/empty-struct-braces-pat-3.stderr +++ b/src/test/ui/empty/empty-struct-braces-pat-3.stderr @@ -15,6 +15,11 @@ LL | XE::XEmpty3() => () | | | | | help: a tuple variant with a similar name exists: `XEmpty5` | did you mean `XE::XEmpty3 { /* fields */ }`? + | + ::: $DIR/auxiliary/empty-struct.rs:8:5 + | +LL | XEmpty5(), + | --------- similarly named tuple variant `XEmpty5` defined here error[E0532]: expected tuple struct or tuple variant, found struct variant `E::Empty3` --> $DIR/empty-struct-braces-pat-3.rs:25:9 @@ -33,6 +38,11 @@ LL | XE::XEmpty3(..) => () | | | | | help: a tuple variant with a similar name exists: `XEmpty5` | did you mean `XE::XEmpty3 { /* fields */ }`? + | + ::: $DIR/auxiliary/empty-struct.rs:8:5 + | +LL | XEmpty5(), + | --------- similarly named tuple variant `XEmpty5` defined here error: aborting due to 4 previous errors diff --git a/src/test/ui/empty/empty-struct-tuple-pat.stderr b/src/test/ui/empty/empty-struct-tuple-pat.stderr index cfbb468e5e..9388ed2665 100644 --- a/src/test/ui/empty/empty-struct-tuple-pat.stderr +++ b/src/test/ui/empty/empty-struct-tuple-pat.stderr @@ -33,6 +33,11 @@ LL | XE::XEmpty5 => (), | | | | | help: a unit variant with a similar name exists: `XEmpty4` | did you mean `XE::XEmpty5( /* fields */ )`? + | + ::: $DIR/auxiliary/empty-struct.rs:7:5 + | +LL | XEmpty4, + | ------- similarly named unit variant `XEmpty4` defined here error: aborting due to 4 previous errors diff --git a/src/test/ui/empty/empty-struct-unit-pat.stderr b/src/test/ui/empty/empty-struct-unit-pat.stderr index fd41a6ed38..8ee14a3d01 100644 --- a/src/test/ui/empty/empty-struct-unit-pat.stderr +++ b/src/test/ui/empty/empty-struct-unit-pat.stderr @@ -3,24 +3,44 @@ error[E0532]: expected tuple struct or tuple variant, found unit struct `Empty2` | LL | Empty2() => () | ^^^^^^ help: a tuple struct with a similar name exists: `XEmpty6` + | + ::: $DIR/auxiliary/empty-struct.rs:3:1 + | +LL | pub struct XEmpty6(); + | --------------------- similarly named tuple struct `XEmpty6` defined here error[E0532]: expected tuple struct or tuple variant, found unit struct `XEmpty2` --> $DIR/empty-struct-unit-pat.rs:24:9 | LL | XEmpty2() => () | ^^^^^^^ help: a tuple struct with a similar name exists: `XEmpty6` + | + ::: $DIR/auxiliary/empty-struct.rs:3:1 + | +LL | pub struct XEmpty6(); + | --------------------- similarly named tuple struct `XEmpty6` defined here error[E0532]: expected tuple struct or tuple variant, found unit struct `Empty2` --> $DIR/empty-struct-unit-pat.rs:28:9 | LL | Empty2(..) => () | ^^^^^^ help: a tuple struct with a similar name exists: `XEmpty6` + | + ::: $DIR/auxiliary/empty-struct.rs:3:1 + | +LL | pub struct XEmpty6(); + | --------------------- similarly named tuple struct `XEmpty6` defined here error[E0532]: expected tuple struct or tuple variant, found unit struct `XEmpty2` --> $DIR/empty-struct-unit-pat.rs:32:9 | LL | XEmpty2(..) => () | ^^^^^^^ help: a tuple struct with a similar name exists: `XEmpty6` + | + ::: $DIR/auxiliary/empty-struct.rs:3:1 + | +LL | pub struct XEmpty6(); + | --------------------- similarly named tuple struct `XEmpty6` defined here error[E0532]: expected tuple struct or tuple variant, found unit variant `E::Empty4` --> $DIR/empty-struct-unit-pat.rs:37:9 @@ -35,6 +55,11 @@ LL | XE::XEmpty4() => (), | ^^^^------- | | | help: a tuple variant with a similar name exists: `XEmpty5` + | + ::: $DIR/auxiliary/empty-struct.rs:8:5 + | +LL | XEmpty5(), + | --------- similarly named tuple variant `XEmpty5` defined here error[E0532]: expected tuple struct or tuple variant, found unit variant `E::Empty4` --> $DIR/empty-struct-unit-pat.rs:46:9 @@ -49,6 +74,11 @@ LL | XE::XEmpty4(..) => (), | ^^^^------- | | | help: a tuple variant with a similar name exists: `XEmpty5` + | + ::: $DIR/auxiliary/empty-struct.rs:8:5 + | +LL | XEmpty5(), + | --------- similarly named tuple variant `XEmpty5` defined here error: aborting due to 8 previous errors diff --git a/src/test/ui/env-funky-keys.rs b/src/test/ui/env-funky-keys.rs index 4faceb5326..c5c824ac58 100644 --- a/src/test/ui/env-funky-keys.rs +++ b/src/test/ui/env-funky-keys.rs @@ -6,6 +6,7 @@ // ignore-cloudabi no execve // ignore-emscripten no execve // ignore-sgx no execve +// ignore-vxworks no execve // no-prefer-dynamic #![feature(rustc_private)] diff --git a/src/test/ui/error-codes/E0007.rs b/src/test/ui/error-codes/E0007.rs index cdda735ba4..022ac5fc11 100644 --- a/src/test/ui/error-codes/E0007.rs +++ b/src/test/ui/error-codes/E0007.rs @@ -1,9 +1,10 @@ +#![feature(bindings_after_at)] + fn main() { let x = Some("s".to_string()); match x { op_string @ Some(s) => {}, //~^ ERROR E0007 - //~| ERROR E0303 //~| ERROR E0382 None => {}, } diff --git a/src/test/ui/error-codes/E0007.stderr b/src/test/ui/error-codes/E0007.stderr index 89a6298c87..31af917172 100644 --- a/src/test/ui/error-codes/E0007.stderr +++ b/src/test/ui/error-codes/E0007.stderr @@ -1,17 +1,11 @@ error[E0007]: cannot bind by-move with sub-bindings - --> $DIR/E0007.rs:4:9 + --> $DIR/E0007.rs:6:9 | LL | op_string @ Some(s) => {}, | ^^^^^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it -error[E0303]: pattern bindings are not allowed after an `@` - --> $DIR/E0007.rs:4:26 - | -LL | op_string @ Some(s) => {}, - | ^ not allowed after `@` - error[E0382]: use of moved value - --> $DIR/E0007.rs:4:26 + --> $DIR/E0007.rs:6:26 | LL | let x = Some("s".to_string()); | - move occurs because `x` has type `std::option::Option<std::string::String>`, which does not implement the `Copy` trait @@ -22,7 +16,7 @@ LL | op_string @ Some(s) => {}, | | value used here after move | value moved here -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors -Some errors have detailed explanations: E0007, E0303, E0382. +Some errors have detailed explanations: E0007, E0382. For more information about an error, try `rustc --explain E0007`. diff --git a/src/test/ui/error-codes/E0009.stderr b/src/test/ui/error-codes/E0009.stderr index f8acb9a09d..446a436d64 100644 --- a/src/test/ui/error-codes/E0009.stderr +++ b/src/test/ui/error-codes/E0009.stderr @@ -2,7 +2,7 @@ error[E0009]: cannot bind by-move and by-ref in the same pattern --> $DIR/E0009.rs:5:15 | LL | Some((y, ref z)) => {}, - | ^ ----- both by-ref and by-move used + | ^ ----- by-ref pattern here | | | by-move pattern here diff --git a/src/test/ui/error-codes/E0030.rs b/src/test/ui/error-codes/E0030.rs index 58d856b7c9..a5d8f87261 100644 --- a/src/test/ui/error-codes/E0030.rs +++ b/src/test/ui/error-codes/E0030.rs @@ -2,5 +2,6 @@ fn main() { match 5u32 { 1000 ..= 5 => {} //~^ ERROR lower range bound must be less than or equal to upper + //~| ERROR lower range bound must be less than or equal to upper } } diff --git a/src/test/ui/error-codes/E0030.stderr b/src/test/ui/error-codes/E0030.stderr index db8161d8fd..8a6114024b 100644 --- a/src/test/ui/error-codes/E0030.stderr +++ b/src/test/ui/error-codes/E0030.stderr @@ -4,6 +4,12 @@ error[E0030]: lower range bound must be less than or equal to upper LL | 1000 ..= 5 => {} | ^^^^ lower bound larger than upper bound -error: aborting due to previous error +error[E0030]: lower range bound must be less than or equal to upper + --> $DIR/E0030.rs:3:9 + | +LL | 1000 ..= 5 => {} + | ^^^^ lower bound larger than upper bound + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0030`. diff --git a/src/test/ui/error-codes/E0034.stderr b/src/test/ui/error-codes/E0034.stderr index a58d16bfaf..6db2ef5051 100644 --- a/src/test/ui/error-codes/E0034.stderr +++ b/src/test/ui/error-codes/E0034.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in an impl of the trait `Trait1` for the type `Tes | LL | fn foo() {} | ^^^^^^^^ - = help: to disambiguate the method call, write `Trait1::foo(...)` instead note: candidate #2 is defined in an impl of the trait `Trait2` for the type `Test` --> $DIR/E0034.rs:16:5 | LL | fn foo() {} | ^^^^^^^^ - = help: to disambiguate the method call, write `Trait2::foo(...)` instead +help: disambiguate the method call for candidate #1 + | +LL | Trait1::foo() + | ^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | Trait2::foo() + | ^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/error-codes/E0067.stderr b/src/test/ui/error-codes/E0067.stderr index 0334565840..526503798b 100644 --- a/src/test/ui/error-codes/E0067.stderr +++ b/src/test/ui/error-codes/E0067.stderr @@ -8,11 +8,13 @@ LL | LinkedList::new() += 1; | = note: an implementation of `std::ops::AddAssign` might be missing for `std::collections::LinkedList<_>` -error[E0067]: invalid left-hand side expression - --> $DIR/E0067.rs:4:5 +error[E0067]: invalid left-hand side of assignment + --> $DIR/E0067.rs:4:23 | LL | LinkedList::new() += 1; - | ^^^^^^^^^^^^^^^^^ invalid expression for left-hand side + | ----------------- ^^ + | | + | cannot assign to this expression error: aborting due to 2 previous errors diff --git a/src/test/ui/error-codes/E0070.stderr b/src/test/ui/error-codes/E0070.stderr index 845833bc82..d809bb18de 100644 --- a/src/test/ui/error-codes/E0070.stderr +++ b/src/test/ui/error-codes/E0070.stderr @@ -1,14 +1,18 @@ -error[E0070]: invalid left-hand side expression - --> $DIR/E0070.rs:6:5 +error[E0070]: invalid left-hand side of assignment + --> $DIR/E0070.rs:6:16 | LL | SOME_CONST = 14; - | ^^^^^^^^^^^^^^^ left-hand of expression not valid + | ---------- ^ + | | + | cannot assign to this expression -error[E0070]: invalid left-hand side expression - --> $DIR/E0070.rs:7:5 +error[E0070]: invalid left-hand side of assignment + --> $DIR/E0070.rs:7:7 | LL | 1 = 3; - | ^^^^^ left-hand of expression not valid + | - ^ + | | + | cannot assign to this expression error[E0308]: mismatched types --> $DIR/E0070.rs:8:25 @@ -16,11 +20,13 @@ error[E0308]: mismatched types LL | some_other_func() = 4; | ^ expected `()`, found integer -error[E0070]: invalid left-hand side expression - --> $DIR/E0070.rs:8:5 +error[E0070]: invalid left-hand side of assignment + --> $DIR/E0070.rs:8:23 | LL | some_other_func() = 4; - | ^^^^^^^^^^^^^^^^^^^^^ left-hand of expression not valid + | ----------------- ^ + | | + | cannot assign to this expression error: aborting due to 4 previous errors diff --git a/src/test/ui/error-codes/E0106.rs b/src/test/ui/error-codes/E0106.rs index d6537d1236..cc3438727a 100644 --- a/src/test/ui/error-codes/E0106.rs +++ b/src/test/ui/error-codes/E0106.rs @@ -16,7 +16,7 @@ struct Buzz<'a, 'b>(&'a str, &'b str); struct Quux { baz: Baz, //~^ ERROR E0106 - //~| expected lifetime parameter + //~| expected named lifetime parameter buzz: Buzz, //~^ ERROR E0106 //~| expected 2 lifetime parameters diff --git a/src/test/ui/error-codes/E0106.stderr b/src/test/ui/error-codes/E0106.stderr index cea9581e70..e01e0a6f54 100644 --- a/src/test/ui/error-codes/E0106.stderr +++ b/src/test/ui/error-codes/E0106.stderr @@ -2,25 +2,49 @@ error[E0106]: missing lifetime specifier --> $DIR/E0106.rs:2:8 | LL | x: &bool, - | ^ expected lifetime parameter + | ^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | struct Foo<'lifetime> { +LL | x: &'lifetime bool, + | error[E0106]: missing lifetime specifier --> $DIR/E0106.rs:7:7 | LL | B(&bool), - | ^ expected lifetime parameter + | ^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | enum Bar<'lifetime> { +LL | A(u8), +LL | B(&'lifetime bool), + | error[E0106]: missing lifetime specifier --> $DIR/E0106.rs:10:14 | LL | type MyStr = &str; - | ^ expected lifetime parameter + | ^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | type MyStr<'lifetime> = &'lifetime str; + | ^^^^^^^^^^^ ^^^^^^^^^^ error[E0106]: missing lifetime specifier --> $DIR/E0106.rs:17:10 | LL | baz: Baz, - | ^^^ expected lifetime parameter + | ^^^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | struct Quux<'lifetime> { +LL | baz: Baz<'lifetime>, + | error[E0106]: missing lifetime specifiers --> $DIR/E0106.rs:20:11 diff --git a/src/test/ui/error-codes/E0117.rs b/src/test/ui/error-codes/E0117.rs index 18dd809f3f..dbbac51480 100644 --- a/src/test/ui/error-codes/E0117.rs +++ b/src/test/ui/error-codes/E0117.rs @@ -1,6 +1,5 @@ impl Drop for u32 {} //~ ERROR E0117 -//~| ERROR the Drop trait may only be implemented on structures -//~| implementing Drop requires a struct +//~| ERROR the `Drop` trait may only be implemented for structs, enums, and unions fn main() { } diff --git a/src/test/ui/error-codes/E0117.stderr b/src/test/ui/error-codes/E0117.stderr index f0cfc8a253..b48a1d8e50 100644 --- a/src/test/ui/error-codes/E0117.stderr +++ b/src/test/ui/error-codes/E0117.stderr @@ -1,8 +1,8 @@ -error[E0120]: the Drop trait may only be implemented on structures +error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions --> $DIR/E0117.rs:1:15 | LL | impl Drop for u32 {} - | ^^^ implementing Drop requires a struct + | ^^^ must be a struct, enum, or union error[E0117]: only traits defined in the current crate can be implemented for arbitrary types --> $DIR/E0117.rs:1:1 diff --git a/src/test/ui/error-codes/E0120.stderr b/src/test/ui/error-codes/E0120.stderr index 68ca7d800d..6c306455e4 100644 --- a/src/test/ui/error-codes/E0120.stderr +++ b/src/test/ui/error-codes/E0120.stderr @@ -1,8 +1,8 @@ -error[E0120]: the Drop trait may only be implemented on structures +error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions --> $DIR/E0120.rs:3:15 | LL | impl Drop for dyn MyTrait { - | ^^^^^^^^^^^ implementing Drop requires a struct + | ^^^^^^^^^^^ must be a struct, enum, or union error: aborting due to previous error diff --git a/src/test/ui/error-codes/E0121.stderr b/src/test/ui/error-codes/E0121.stderr index beb8941320..5a5c6b40c5 100644 --- a/src/test/ui/error-codes/E0121.stderr +++ b/src/test/ui/error-codes/E0121.stderr @@ -5,7 +5,7 @@ LL | fn foo() -> _ { 5 } | ^ | | | not allowed in type signatures - | help: replace `_` with the correct return type: `i32` + | help: replace with the correct return type: `i32` error[E0121]: the type placeholder `_` is not allowed within types on item signatures --> $DIR/E0121.rs:3:13 diff --git a/src/test/ui/error-codes/E0138.stderr b/src/test/ui/error-codes/E0138.stderr index 445053a4a8..2dc6976fe0 100644 --- a/src/test/ui/error-codes/E0138.stderr +++ b/src/test/ui/error-codes/E0138.stderr @@ -2,7 +2,7 @@ error[E0138]: multiple `start` functions --> $DIR/E0138.rs:7:1 | LL | fn foo(argc: isize, argv: *const *const u8) -> isize { 0 } - | ---------------------------------------------------------- previous `start` function here + | ---------------------------------------------------------- previous `#[start]` function here ... LL | fn f(argc: isize, argv: *const *const u8) -> isize { 0 } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ multiple `start` functions diff --git a/src/test/ui/error-codes/E0152.stderr b/src/test/ui/error-codes/E0152.stderr index d4b59a1148..c41a043015 100644 --- a/src/test/ui/error-codes/E0152.stderr +++ b/src/test/ui/error-codes/E0152.stderr @@ -1,10 +1,10 @@ -error[E0152]: duplicate lang item found: `arc`. +error[E0152]: found duplicate lang item `arc` --> $DIR/E0152.rs:4:1 | LL | struct Foo; | ^^^^^^^^^^^ | - = note: first defined in crate `alloc` (which `std` depends on). + = note: first defined in crate `alloc` (which `std` depends on) error: aborting due to previous error diff --git a/src/test/ui/error-codes/E0191.stderr b/src/test/ui/error-codes/E0191.stderr index 92fa85bca0..d69a14916e 100644 --- a/src/test/ui/error-codes/E0191.stderr +++ b/src/test/ui/error-codes/E0191.stderr @@ -1,11 +1,11 @@ -error[E0191]: the value of the associated type `Bar` (from the trait `Trait`) must be specified - --> $DIR/E0191.rs:5:12 +error[E0191]: the value of the associated type `Bar` (from trait `Trait`) must be specified + --> $DIR/E0191.rs:5:16 | LL | type Bar; | --------- `Bar` defined here ... LL | type Foo = dyn Trait; - | ^^^^^^^^^ associated type `Bar` must be specified + | ^^^^^ help: specify the associated type: `Trait<Bar = Type>` error: aborting due to previous error diff --git a/src/test/ui/error-codes/E0220.stderr b/src/test/ui/error-codes/E0220.stderr index 5da302748c..4fa83d8bf6 100644 --- a/src/test/ui/error-codes/E0220.stderr +++ b/src/test/ui/error-codes/E0220.stderr @@ -2,16 +2,16 @@ error[E0220]: associated type `F` not found for `Trait` --> $DIR/E0220.rs:5:22 | LL | type Foo = dyn Trait<F=i32>; - | ^^^^^ associated type `F` not found + | ^ associated type `F` not found -error[E0191]: the value of the associated type `Bar` (from the trait `Trait`) must be specified - --> $DIR/E0220.rs:5:12 +error[E0191]: the value of the associated type `Bar` (from trait `Trait`) must be specified + --> $DIR/E0220.rs:5:16 | LL | type Bar; | --------- `Bar` defined here ... LL | type Foo = dyn Trait<F=i32>; - | ^^^^^^^^^^^^^^^^ associated type `Bar` must be specified + | ^^^^^^^^^^^^ help: specify the associated type: `Trait<F=i32, Bar = Type>` error: aborting due to 2 previous errors diff --git a/src/test/ui/error-codes/E0221.stderr b/src/test/ui/error-codes/E0221.stderr index 043f0c68bb..0b4819143c 100644 --- a/src/test/ui/error-codes/E0221.stderr +++ b/src/test/ui/error-codes/E0221.stderr @@ -9,6 +9,15 @@ LL | type A: T2; LL | fn do_something() { LL | let _: Self::A; | ^^^^^^^ ambiguous associated type `A` + | +help: use fully qualified syntax to disambiguate + | +LL | let _: <Self as Foo>::A; + | ^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | let _: <Self as Bar>::A; + | ^^^^^^^^^^^^^^^^ error[E0221]: ambiguous associated type `Err` in bounds of `Self` --> $DIR/E0221.rs:21:16 @@ -16,14 +25,13 @@ error[E0221]: ambiguous associated type `Err` in bounds of `Self` LL | type Err: T3; | ------------- ambiguous `Err` from `My` LL | fn test() { -LL | let _: Self::Err; - | ^^^^^^^^^ ambiguous associated type `Err` - | -note: associated type `Self` could derive from `std::str::FromStr` - --> $DIR/E0221.rs:21:16 - | LL | let _: Self::Err; | ^^^^^^^^^ + | | + | ambiguous associated type `Err` + | help: use fully qualified syntax to disambiguate: `<Self as My>::Err` + | + = note: associated type `Self` could derive from `std::str::FromStr` error: aborting due to 2 previous errors diff --git a/src/test/ui/error-codes/E0261.stderr b/src/test/ui/error-codes/E0261.stderr index 3bf5e9d815..0eab2dc0ee 100644 --- a/src/test/ui/error-codes/E0261.stderr +++ b/src/test/ui/error-codes/E0261.stderr @@ -2,11 +2,15 @@ error[E0261]: use of undeclared lifetime name `'a` --> $DIR/E0261.rs:1:12 | LL | fn foo(x: &'a str) { } - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'a` here: `<'a>` error[E0261]: use of undeclared lifetime name `'a` --> $DIR/E0261.rs:5:9 | +LL | struct Foo { + | - help: consider introducing lifetime `'a` here: `<'a>` LL | x: &'a str, | ^^ undeclared lifetime diff --git a/src/test/ui/error-codes/E0303.stderr b/src/test/ui/error-codes/E0303.stderr deleted file mode 100644 index af537ce562..0000000000 --- a/src/test/ui/error-codes/E0303.stderr +++ /dev/null @@ -1,19 +0,0 @@ -error[E0009]: cannot bind by-move and by-ref in the same pattern - --> $DIR/E0303.rs:3:34 - | -LL | ref op_string_ref @ Some(s) => {}, - | -------------------------^- - | | | - | | by-move pattern here - | both by-ref and by-move used - -error[E0303]: pattern bindings are not allowed after an `@` - --> $DIR/E0303.rs:3:34 - | -LL | ref op_string_ref @ Some(s) => {}, - | ^ not allowed after `@` - -error: aborting due to 2 previous errors - -Some errors have detailed explanations: E0009, E0303. -For more information about an error, try `rustc --explain E0009`. diff --git a/src/test/ui/error-codes/E0308-4.stderr b/src/test/ui/error-codes/E0308-4.stderr index 127fdaadbc..39c0676373 100644 --- a/src/test/ui/error-codes/E0308-4.stderr +++ b/src/test/ui/error-codes/E0308-4.stderr @@ -1,10 +1,12 @@ error[E0308]: mismatched types - --> $DIR/E0308-4.rs:4:9 + --> $DIR/E0308-4.rs:4:15 | LL | match x { - | - this match expression has type `u8` + | - this expression has type `u8` LL | 0u8..=3i8 => (), - | ^^^^^^^^^ expected `u8`, found `i8` + | --- ^^^ expected `u8`, found `i8` + | | + | this is of type `u8` error: aborting due to previous error diff --git a/src/test/ui/error-codes/E0393.stderr b/src/test/ui/error-codes/E0393.stderr index 543e321363..7771bacc9e 100644 --- a/src/test/ui/error-codes/E0393.stderr +++ b/src/test/ui/error-codes/E0393.stderr @@ -1,8 +1,11 @@ error[E0393]: the type parameter `T` must be explicitly specified --> $DIR/E0393.rs:3:47 | +LL | trait A<T=Self> {} + | ------------------ type parameter `T` must be specified for this +LL | LL | fn together_we_will_rule_the_galaxy(son: &dyn A) {} - | ^ missing reference to `T` + | ^ help: set the type parameter to the desired type: `A<T>` | = note: because of the default `Self` reference, type parameters must be specified on object types diff --git a/src/test/ui/error-codes/E0401.stderr b/src/test/ui/error-codes/E0401.stderr index 0adf982d71..8b1d4e6c07 100644 --- a/src/test/ui/error-codes/E0401.stderr +++ b/src/test/ui/error-codes/E0401.stderr @@ -36,7 +36,7 @@ error[E0282]: type annotations needed --> $DIR/E0401.rs:11:5 | LL | bfnr(x); - | ^^^^ cannot infer type for type parameter `U` + | ^^^^ cannot infer type for type parameter `U` declared on the function `bfnr` error: aborting due to 4 previous errors diff --git a/src/test/ui/error-codes/E0452.rs b/src/test/ui/error-codes/E0452.rs index 940b9f693c..4e5a6c9301 100644 --- a/src/test/ui/error-codes/E0452.rs +++ b/src/test/ui/error-codes/E0452.rs @@ -1,4 +1,8 @@ #![allow(foo = "")] //~ ERROR E0452 - + //~| ERROR E0452 + //~| ERROR E0452 + //~| ERROR E0452 + //~| ERROR E0452 + //~| ERROR E0452 fn main() { } diff --git a/src/test/ui/error-codes/E0452.stderr b/src/test/ui/error-codes/E0452.stderr index 7f074168f8..30c11e3274 100644 --- a/src/test/ui/error-codes/E0452.stderr +++ b/src/test/ui/error-codes/E0452.stderr @@ -4,6 +4,36 @@ error[E0452]: malformed lint attribute input LL | #![allow(foo = "")] | ^^^^^^^^ bad attribute argument -error: aborting due to previous error +error[E0452]: malformed lint attribute input + --> $DIR/E0452.rs:1:10 + | +LL | #![allow(foo = "")] + | ^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/E0452.rs:1:10 + | +LL | #![allow(foo = "")] + | ^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/E0452.rs:1:10 + | +LL | #![allow(foo = "")] + | ^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/E0452.rs:1:10 + | +LL | #![allow(foo = "")] + | ^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/E0452.rs:1:10 + | +LL | #![allow(foo = "")] + | ^^^^^^^^ bad attribute argument + +error: aborting due to 6 previous errors For more information about this error, try `rustc --explain E0452`. diff --git a/src/test/ui/error-codes/E0453.rs b/src/test/ui/error-codes/E0453.rs index 46fa04843e..69155b0688 100644 --- a/src/test/ui/error-codes/E0453.rs +++ b/src/test/ui/error-codes/E0453.rs @@ -2,5 +2,7 @@ #[allow(non_snake_case)] //~^ ERROR allow(non_snake_case) overruled by outer forbid(non_snake_case) +//~| ERROR allow(non_snake_case) overruled by outer forbid(non_snake_case) +//~| ERROR allow(non_snake_case) overruled by outer forbid(non_snake_case) fn main() { } diff --git a/src/test/ui/error-codes/E0453.stderr b/src/test/ui/error-codes/E0453.stderr index 03cc756d6a..138e848346 100644 --- a/src/test/ui/error-codes/E0453.stderr +++ b/src/test/ui/error-codes/E0453.stderr @@ -7,6 +7,24 @@ LL | LL | #[allow(non_snake_case)] | ^^^^^^^^^^^^^^ overruled by previous forbid -error: aborting due to previous error +error[E0453]: allow(non_snake_case) overruled by outer forbid(non_snake_case) + --> $DIR/E0453.rs:3:9 + | +LL | #![forbid(non_snake_case)] + | -------------- `forbid` level set here +LL | +LL | #[allow(non_snake_case)] + | ^^^^^^^^^^^^^^ overruled by previous forbid + +error[E0453]: allow(non_snake_case) overruled by outer forbid(non_snake_case) + --> $DIR/E0453.rs:3:9 + | +LL | #![forbid(non_snake_case)] + | -------------- `forbid` level set here +LL | +LL | #[allow(non_snake_case)] + | ^^^^^^^^^^^^^^ overruled by previous forbid + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0453`. diff --git a/src/test/ui/error-codes/E0511.rs b/src/test/ui/error-codes/E0511.rs index 3590f12e5f..a52f81a6c5 100644 --- a/src/test/ui/error-codes/E0511.rs +++ b/src/test/ui/error-codes/E0511.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(platform_intrinsics)] extern "platform-intrinsic" { diff --git a/src/test/ui/error-codes/E0511.stderr b/src/test/ui/error-codes/E0511.stderr index 1362a3d1f2..d797b10d5a 100644 --- a/src/test/ui/error-codes/E0511.stderr +++ b/src/test/ui/error-codes/E0511.stderr @@ -1,5 +1,5 @@ error[E0511]: invalid monomorphization of `simd_add` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/E0511.rs:8:14 + --> $DIR/E0511.rs:10:14 | LL | unsafe { simd_add(0, 1); } | ^^^^^^^^^^^^^^ diff --git a/src/test/ui/error-codes/E0528.rs b/src/test/ui/error-codes/E0528.rs index 17d03b14fc..0a337c9611 100644 --- a/src/test/ui/error-codes/E0528.rs +++ b/src/test/ui/error-codes/E0528.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn main() { let r = &[1, 2]; match r { diff --git a/src/test/ui/error-codes/E0528.stderr b/src/test/ui/error-codes/E0528.stderr index 0f56609114..21615f954c 100644 --- a/src/test/ui/error-codes/E0528.stderr +++ b/src/test/ui/error-codes/E0528.stderr @@ -1,5 +1,5 @@ error[E0528]: pattern requires at least 3 elements but array has 2 - --> $DIR/E0528.rs:6:10 + --> $DIR/E0528.rs:4:10 | LL | &[a, b, c, rest @ ..] => { | ^^^^^^^^^^^^^^^^^^^^ pattern cannot match array of 2 elements diff --git a/src/test/ui/error-codes/E0565.rs b/src/test/ui/error-codes/E0565.rs index b09f5df520..3bf4286761 100644 --- a/src/test/ui/error-codes/E0565.rs +++ b/src/test/ui/error-codes/E0565.rs @@ -1,5 +1,6 @@ // repr currently doesn't support literals #[repr("C")] //~ ERROR E0565 + //~| ERROR E0565 struct A { } fn main() { } diff --git a/src/test/ui/error-codes/E0565.stderr b/src/test/ui/error-codes/E0565.stderr index 6ed90c0ae4..aa0951528e 100644 --- a/src/test/ui/error-codes/E0565.stderr +++ b/src/test/ui/error-codes/E0565.stderr @@ -4,6 +4,12 @@ error[E0565]: meta item in `repr` must be an identifier LL | #[repr("C")] | ^^^ -error: aborting due to previous error +error[E0565]: meta item in `repr` must be an identifier + --> $DIR/E0565.rs:2:8 + | +LL | #[repr("C")] + | ^^^ + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0565`. diff --git a/src/test/ui/error-codes/E0586.stderr b/src/test/ui/error-codes/E0586.stderr index d1e7e3f474..0bbf9a6080 100644 --- a/src/test/ui/error-codes/E0586.stderr +++ b/src/test/ui/error-codes/E0586.stderr @@ -1,10 +1,10 @@ error[E0586]: inclusive range with no end - --> $DIR/E0586.rs:3:22 + --> $DIR/E0586.rs:3:19 | LL | let x = &tmp[1..=]; - | ^ + | ^^^ help: use `..` instead | - = help: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) error: aborting due to previous error diff --git a/src/test/ui/error-codes/E0599.stderr b/src/test/ui/error-codes/E0599.stderr index 89bfccf2fb..a78a003661 100644 --- a/src/test/ui/error-codes/E0599.stderr +++ b/src/test/ui/error-codes/E0599.stderr @@ -1,4 +1,4 @@ -error[E0599]: no associated item named `NotEvenReal` found for type `Foo` in the current scope +error[E0599]: no associated item named `NotEvenReal` found for struct `Foo` in the current scope --> $DIR/E0599.rs:4:20 | LL | struct Foo; diff --git a/src/test/ui/error-codes/E0602.stderr b/src/test/ui/error-codes/E0602.stderr index 8636004102..70137cb166 100644 --- a/src/test/ui/error-codes/E0602.stderr +++ b/src/test/ui/error-codes/E0602.stderr @@ -2,6 +2,14 @@ error[E0602]: unknown lint: `bogus` | = note: requested on the command line with `-D bogus` -error: aborting due to previous error +error[E0602]: unknown lint: `bogus` + | + = note: requested on the command line with `-D bogus` + +error[E0602]: unknown lint: `bogus` + | + = note: requested on the command line with `-D bogus` + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0602`. diff --git a/src/test/ui/error-codes/E0603.stderr b/src/test/ui/error-codes/E0603.stderr index 444005e086..724d04954a 100644 --- a/src/test/ui/error-codes/E0603.stderr +++ b/src/test/ui/error-codes/E0603.stderr @@ -2,7 +2,13 @@ error[E0603]: constant `PRIVATE` is private --> $DIR/E0603.rs:6:17 | LL | SomeModule::PRIVATE; - | ^^^^^^^ + | ^^^^^^^ this constant is private + | +note: the constant `PRIVATE` is defined here + --> $DIR/E0603.rs:2:5 + | +LL | const PRIVATE: u32 = 0x_a_bad_1dea_u32; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/error-codes/E0658.stderr b/src/test/ui/error-codes/E0658.stderr index 071dbccd80..1cb81c8d77 100644 --- a/src/test/ui/error-codes/E0658.stderr +++ b/src/test/ui/error-codes/E0658.stderr @@ -6,7 +6,7 @@ LL | | Bar(u64), LL | | } | |_^ | - = note: for more information, see https://github.com/rust-lang/rust/issues/35118 + = note: for more information, see https://github.com/rust-lang/rust/issues/56071 = help: add `#![feature(repr128)]` to the crate attributes to enable error: aborting due to previous error diff --git a/src/test/ui/error-codes/E0719.stderr b/src/test/ui/error-codes/E0719.stderr index c5b9a71c65..a046fbfc3d 100644 --- a/src/test/ui/error-codes/E0719.stderr +++ b/src/test/ui/error-codes/E0719.stderr @@ -1,4 +1,4 @@ -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/E0719.rs:1:33 | LL | trait Foo: Iterator<Item = i32, Item = i32> {} @@ -6,7 +6,7 @@ LL | trait Foo: Iterator<Item = i32, Item = i32> {} | | | `Item` bound here first -error[E0719]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) is already specified +error[E0719]: the value of the associated type `Item` (from trait `std::iter::Iterator`) is already specified --> $DIR/E0719.rs:6:42 | LL | fn test() -> Box<dyn Iterator<Item = (), Item = Unit>> { diff --git a/src/test/ui/error-codes/E0746.fixed b/src/test/ui/error-codes/E0746.fixed new file mode 100644 index 0000000000..ca8319aa02 --- /dev/null +++ b/src/test/ui/error-codes/E0746.fixed @@ -0,0 +1,18 @@ +// run-rustfix +#![allow(dead_code)] +struct Struct; +trait Trait {} +impl Trait for Struct {} +impl Trait for u32 {} + +fn foo() -> impl Trait { Struct } +//~^ ERROR E0746 + +fn bar() -> impl Trait { //~ ERROR E0746 + if true { + return 0; + } + 42 +} + +fn main() {} diff --git a/src/test/ui/error-codes/E0746.rs b/src/test/ui/error-codes/E0746.rs new file mode 100644 index 0000000000..bf5ba8fff5 --- /dev/null +++ b/src/test/ui/error-codes/E0746.rs @@ -0,0 +1,18 @@ +// run-rustfix +#![allow(dead_code)] +struct Struct; +trait Trait {} +impl Trait for Struct {} +impl Trait for u32 {} + +fn foo() -> dyn Trait { Struct } +//~^ ERROR E0746 + +fn bar() -> dyn Trait { //~ ERROR E0746 + if true { + return 0; + } + 42 +} + +fn main() {} diff --git a/src/test/ui/error-codes/E0746.stderr b/src/test/ui/error-codes/E0746.stderr new file mode 100644 index 0000000000..e7a8fd304c --- /dev/null +++ b/src/test/ui/error-codes/E0746.stderr @@ -0,0 +1,27 @@ +error[E0746]: return type cannot have an unboxed trait object + --> $DIR/E0746.rs:8:13 + | +LL | fn foo() -> dyn Trait { Struct } + | ^^^^^^^^^ doesn't have a size known at compile-time + | + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> +help: return `impl Trait` instead, as all return paths are of type `Struct`, which implements `Trait` + | +LL | fn foo() -> impl Trait { Struct } + | ^^^^^^^^^^ + +error[E0746]: return type cannot have an unboxed trait object + --> $DIR/E0746.rs:11:13 + | +LL | fn bar() -> dyn Trait { + | ^^^^^^^^^ doesn't have a size known at compile-time + | + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> +help: return `impl Trait` instead, as all return paths are of type `{integer}`, which implements `Trait` + | +LL | fn bar() -> impl Trait { + | ^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0746`. diff --git a/src/test/ui/error-codes/e0119/complex-impl.stderr b/src/test/ui/error-codes/e0119/complex-impl.stderr index 0c18a1fbd1..2cc09e8b14 100644 --- a/src/test/ui/error-codes/e0119/complex-impl.stderr +++ b/src/test/ui/error-codes/e0119/complex-impl.stderr @@ -6,7 +6,7 @@ LL | impl<R> External for (Q, R) {} | = note: conflicting implementation in crate `complex_impl_support`: - impl<'a, 'b, 'c, T, U, V, W> complex_impl_support::External for (T, complex_impl_support::M<'a, 'b, 'c, std::boxed::Box<U>, V, W>) - where <U as std::ops::FnOnce<(T,)>>::Output == V, <V as std::iter::Iterator>::Item == T, 'b : 'a, T : 'a, U: std::ops::FnOnce<(T,)>, U : 'static, V: std::iter::Iterator, V: std::clone::Clone, W: std::ops::Add, <W as std::ops::Add>::Output: std::marker::Copy; + where <U as std::ops::FnOnce<(T,)>>::Output == V, <V as std::iter::Iterator>::Item == T, 'b: 'a, T: 'a, U: std::ops::FnOnce<(T,)>, U: 'static, V: std::iter::Iterator, V: std::clone::Clone, W: std::ops::Add, <W as std::ops::Add>::Output: std::marker::Copy; error[E0117]: only traits defined in the current crate can be implemented for arbitrary types --> $DIR/complex-impl.rs:9:1 diff --git a/src/test/ui/error-festival.stderr b/src/test/ui/error-festival.stderr index 73571a375b..9b69b37336 100644 --- a/src/test/ui/error-festival.stderr +++ b/src/test/ui/error-festival.stderr @@ -8,7 +8,13 @@ error[E0603]: constant `FOO` is private --> $DIR/error-festival.rs:22:10 | LL | foo::FOO; - | ^^^ + | ^^^ this constant is private + | +note: the constant `FOO` is defined here + --> $DIR/error-festival.rs:7:5 + | +LL | const FOO: u32 = 0; + | ^^^^^^^^^^^^^^^^^^^ error[E0368]: binary assignment operation `+=` cannot be applied to type `&str` --> $DIR/error-festival.rs:12:5 @@ -20,7 +26,7 @@ LL | x += 2; | = note: an implementation of `std::ops::AddAssign` might be missing for `&str` -error[E0599]: no method named `z` found for type `&str` in the current scope +error[E0599]: no method named `z` found for reference `&str` in the current scope --> $DIR/error-festival.rs:16:7 | LL | x.z(); diff --git a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision.stderr b/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision.stderr deleted file mode 100644 index 2029cfaf75..0000000000 --- a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision.stderr +++ /dev/null @@ -1,20 +0,0 @@ -error: `X..` range patterns are not supported - --> $DIR/exclusive_range_pattern_syntax_collision.rs:5:13 - | -LL | [_, 99.., _] => {}, - | ^^^^ help: try using the maximum value for the type: `99..MAX` - -error[E0308]: mismatched types - --> $DIR/exclusive_range_pattern_syntax_collision.rs:5:13 - | -LL | match [5..4, 99..105, 43..44] { - | ----------------------- this match expression has type `std::ops::Range<{integer}>` -LL | [_, 99.., _] => {}, - | ^^^^ expected struct `std::ops::Range`, found integer - | - = note: expected struct `std::ops::Range<{integer}>` - found type `{integer}` - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision2.stderr b/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision2.stderr deleted file mode 100644 index 6a88d05837..0000000000 --- a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision2.stderr +++ /dev/null @@ -1,27 +0,0 @@ -error: `X..` range patterns are not supported - --> $DIR/exclusive_range_pattern_syntax_collision2.rs:5:13 - | -LL | [_, 99..] => {}, - | ^^^^ help: try using the maximum value for the type: `99..MAX` - -error[E0527]: pattern requires 2 elements but array has 3 - --> $DIR/exclusive_range_pattern_syntax_collision2.rs:5:9 - | -LL | [_, 99..] => {}, - | ^^^^^^^^^ expected 3 elements - -error[E0308]: mismatched types - --> $DIR/exclusive_range_pattern_syntax_collision2.rs:5:13 - | -LL | match [5..4, 99..105, 43..44] { - | ----------------------- this match expression has type `std::ops::Range<{integer}>` -LL | [_, 99..] => {}, - | ^^^^ expected struct `std::ops::Range`, found integer - | - = note: expected struct `std::ops::Range<{integer}>` - found type `{integer}` - -error: aborting due to 3 previous errors - -Some errors have detailed explanations: E0308, E0527. -For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision3.stderr b/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision3.stderr deleted file mode 100644 index 5c49fbe4c5..0000000000 --- a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision3.stderr +++ /dev/null @@ -1,31 +0,0 @@ -error: `..X` range patterns are not supported - --> $DIR/exclusive_range_pattern_syntax_collision3.rs:5:10 - | -LL | [..9, 99..100, _] => {}, - | ^^^ help: try using the minimum value for the type: `MIN..9` - -error[E0308]: mismatched types - --> $DIR/exclusive_range_pattern_syntax_collision3.rs:5:10 - | -LL | match [5..4, 99..105, 43..44] { - | ----------------------- this match expression has type `std::ops::Range<{integer}>` -LL | [..9, 99..100, _] => {}, - | ^^^ expected struct `std::ops::Range`, found integer - | - = note: expected struct `std::ops::Range<{integer}>` - found type `{integer}` - -error[E0308]: mismatched types - --> $DIR/exclusive_range_pattern_syntax_collision3.rs:5:15 - | -LL | match [5..4, 99..105, 43..44] { - | ----------------------- this match expression has type `std::ops::Range<{integer}>` -LL | [..9, 99..100, _] => {}, - | ^^^^^^^ expected struct `std::ops::Range`, found integer - | - = note: expected struct `std::ops::Range<{integer}>` - found type `{integer}` - -error: aborting due to 3 previous errors - -For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/export-import.stderr b/src/test/ui/export-import.stderr index e02952e0fe..8160775ab5 100644 --- a/src/test/ui/export-import.stderr +++ b/src/test/ui/export-import.stderr @@ -2,7 +2,13 @@ error[E0603]: function `unexported` is private --> $DIR/export-import.rs:1:8 | LL | use m::unexported; - | ^^^^^^^^^^ + | ^^^^^^^^^^ this function is private + | +note: the function `unexported` is defined here + --> $DIR/export-import.rs:7:5 + | +LL | fn unexported() { } + | ^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/export-tag-variant.stderr b/src/test/ui/export-tag-variant.stderr index b5a2c12c43..f4537a2fb6 100644 --- a/src/test/ui/export-tag-variant.stderr +++ b/src/test/ui/export-tag-variant.stderr @@ -2,7 +2,13 @@ error[E0603]: enum `Y` is private --> $DIR/export-tag-variant.rs:7:26 | LL | fn main() { let z = foo::Y::Y1; } - | ^ + | ^ this enum is private + | +note: the enum `Y` is defined here + --> $DIR/export-tag-variant.rs:4:5 + | +LL | enum Y { Y1 } + | ^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/export.stderr b/src/test/ui/export.stderr index a3668a502c..107f531c09 100644 --- a/src/test/ui/export.stderr +++ b/src/test/ui/export.stderr @@ -26,7 +26,13 @@ error[E0603]: function `z` is private --> $DIR/export.rs:10:18 | LL | fn main() { foo::z(10); } - | ^ + | ^ this function is private + | +note: the function `z` is defined here + --> $DIR/export.rs:5:5 + | +LL | fn z(y: isize) { log(debug, y); } + | ^^^^^^^^^^^^^^ error: aborting due to 5 previous errors diff --git a/src/test/ui/extern/extern-crate-visibility.rs b/src/test/ui/extern/extern-crate-visibility.rs index e0a5cd5e98..cda1227cc8 100644 --- a/src/test/ui/extern/extern-crate-visibility.rs +++ b/src/test/ui/extern/extern-crate-visibility.rs @@ -3,10 +3,10 @@ mod foo { } // Check that private crates can be used from outside their modules, albeit with warnings -use foo::core::cell; //~ ERROR crate `core` is private +use foo::core::cell; //~ ERROR crate import `core` is private fn f() { - foo::core::cell::Cell::new(0); //~ ERROR crate `core` is private + foo::core::cell::Cell::new(0); //~ ERROR crate import `core` is private use foo::*; mod core {} // Check that private crates are not glob imported diff --git a/src/test/ui/extern/extern-crate-visibility.stderr b/src/test/ui/extern/extern-crate-visibility.stderr index 38c791ab83..d0c073d67a 100644 --- a/src/test/ui/extern/extern-crate-visibility.stderr +++ b/src/test/ui/extern/extern-crate-visibility.stderr @@ -1,14 +1,26 @@ -error[E0603]: crate `core` is private +error[E0603]: crate import `core` is private --> $DIR/extern-crate-visibility.rs:6:10 | LL | use foo::core::cell; - | ^^^^ + | ^^^^ this crate import is private + | +note: the crate import `core` is defined here + --> $DIR/extern-crate-visibility.rs:2:5 + | +LL | extern crate core; + | ^^^^^^^^^^^^^^^^^^ -error[E0603]: crate `core` is private +error[E0603]: crate import `core` is private --> $DIR/extern-crate-visibility.rs:9:10 | LL | foo::core::cell::Cell::new(0); - | ^^^^ + | ^^^^ this crate import is private + | +note: the crate import `core` is defined here + --> $DIR/extern-crate-visibility.rs:2:5 + | +LL | extern crate core; + | ^^^^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/extern/extern-main-fn.rs b/src/test/ui/extern/extern-main-fn.rs index dacebfbecf..ddf2e136f0 100644 --- a/src/test/ui/extern/extern-main-fn.rs +++ b/src/test/ui/extern/extern-main-fn.rs @@ -1 +1 @@ -extern fn main() {} //~ ERROR: main function has wrong type [E0580] +extern fn main() {} //~ ERROR: `main` function has wrong type [E0580] diff --git a/src/test/ui/extern/extern-main-fn.stderr b/src/test/ui/extern/extern-main-fn.stderr index 6f6983d428..9c994985a3 100644 --- a/src/test/ui/extern/extern-main-fn.stderr +++ b/src/test/ui/extern/extern-main-fn.stderr @@ -1,4 +1,4 @@ -error[E0580]: main function has wrong type +error[E0580]: `main` function has wrong type --> $DIR/extern-main-fn.rs:1:1 | LL | extern fn main() {} diff --git a/src/test/ui/extern/extern-types-distinct-types.stderr b/src/test/ui/extern/extern-types-distinct-types.stderr index 2e258d687d..32b45ee10a 100644 --- a/src/test/ui/extern/extern-types-distinct-types.stderr +++ b/src/test/ui/extern/extern-types-distinct-types.stderr @@ -1,6 +1,11 @@ error[E0308]: mismatched types --> $DIR/extern-types-distinct-types.rs:9:5 | +LL | type A; + | ------- the found foreign type +LL | type B; + | ------- the expected foreign type +... LL | r | ^ expected extern type `B`, found extern type `A` | diff --git a/src/test/ui/extern/issue-64655-allow-unwind-when-calling-panic-directly.rs b/src/test/ui/extern/issue-64655-allow-unwind-when-calling-panic-directly.rs index 8727c9d1ca..74c6e501c9 100644 --- a/src/test/ui/extern/issue-64655-allow-unwind-when-calling-panic-directly.rs +++ b/src/test/ui/extern/issue-64655-allow-unwind-when-calling-panic-directly.rs @@ -22,7 +22,7 @@ //[thin]compile-flags: -C lto=thin //[fat]compile-flags: -C lto=fat -#![feature(core_panic, panic_internals)] +#![feature(core_panic)] // (For some reason, reproducing the LTO issue requires pulling in std // explicitly this way.) @@ -50,9 +50,7 @@ fn main() { } let _guard = Droppable; - let s = "issue-64655-allow-unwind-when-calling-panic-directly.rs"; - let location = core::panic::Location::internal_constructor(s, 17, 4); - core::panicking::panic("???", &location); + core::panicking::panic("???"); }); let wait = handle.join(); diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs index 0d804f012b..f702b10ccd 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs +++ b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs @@ -12,7 +12,7 @@ // the change when it happens. // // At the time of authoring, the attributes here are listed in the -// order that they occur in libsyntax/feature_gate.rs. +// order that they occur in `librustc_feature`. // // Any builtin attributes that: // @@ -464,10 +464,10 @@ mod reexport_test_harness_main { // Cannot feed "2700" to `#[macro_escape]` without signaling an error. #[macro_escape] -//~^ WARN macro_escape is a deprecated synonym for macro_use +//~^ WARN `#[macro_escape]` is a deprecated synonym for `#[macro_use]` mod macro_escape { mod inner { #![macro_escape] } - //~^ WARN macro_escape is a deprecated synonym for macro_use + //~^ WARN `#[macro_escape]` is a deprecated synonym for `#[macro_use]` #[macro_escape] fn f() { } //~^ WARN unused attribute diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.stderr index 9ce90d89d2..da7d8f9bee 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.stderr +++ b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.stderr @@ -172,19 +172,19 @@ warning: unknown lint: `x5100` LL | #[deny(x5100)] impl S { } | ^^^^^ -warning: macro_escape is a deprecated synonym for macro_use +warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]` --> $DIR/issue-43106-gating-of-builtin-attrs.rs:466:1 | LL | #[macro_escape] | ^^^^^^^^^^^^^^^ -warning: macro_escape is a deprecated synonym for macro_use +warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]` --> $DIR/issue-43106-gating-of-builtin-attrs.rs:469:17 | LL | mod inner { #![macro_escape] } | ^^^^^^^^^^^^^^^^ | - = help: consider an outer attribute, `#[macro_use]` mod ... + = help: try an outer attribute: `#[macro_use]` warning: use of deprecated attribute `plugin_registrar`: compiler plugins are deprecated. See https://github.com/rust-lang/rust/pull/64675 --> $DIR/issue-43106-gating-of-builtin-attrs.rs:221:17 diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-derive-2.rs b/src/test/ui/feature-gate/issue-43106-gating-of-derive-2.rs index 5f276f6b65..3276309f74 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-derive-2.rs +++ b/src/test/ui/feature-gate/issue-43106-gating-of-derive-2.rs @@ -3,14 +3,17 @@ mod derive { #[derive(x3300)] //~^ ERROR cannot find derive macro `x3300` in this scope + //~| ERROR cannot find derive macro `x3300` in this scope union U { f: i32 } #[derive(x3300)] //~^ ERROR cannot find derive macro `x3300` in this scope + //~| ERROR cannot find derive macro `x3300` in this scope enum E { } #[derive(x3300)] //~^ ERROR cannot find derive macro `x3300` in this scope + //~| ERROR cannot find derive macro `x3300` in this scope struct S; } diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-derive-2.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-derive-2.stderr index f14591c85e..ab16591734 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-derive-2.stderr +++ b/src/test/ui/feature-gate/issue-43106-gating-of-derive-2.stderr @@ -1,11 +1,29 @@ error: cannot find derive macro `x3300` in this scope - --> $DIR/issue-43106-gating-of-derive-2.rs:12:14 + --> $DIR/issue-43106-gating-of-derive-2.rs:14:14 | LL | #[derive(x3300)] | ^^^^^ error: cannot find derive macro `x3300` in this scope - --> $DIR/issue-43106-gating-of-derive-2.rs:8:14 + --> $DIR/issue-43106-gating-of-derive-2.rs:14:14 + | +LL | #[derive(x3300)] + | ^^^^^ + +error: cannot find derive macro `x3300` in this scope + --> $DIR/issue-43106-gating-of-derive-2.rs:9:14 + | +LL | #[derive(x3300)] + | ^^^^^ + +error: cannot find derive macro `x3300` in this scope + --> $DIR/issue-43106-gating-of-derive-2.rs:9:14 + | +LL | #[derive(x3300)] + | ^^^^^ + +error: cannot find derive macro `x3300` in this scope + --> $DIR/issue-43106-gating-of-derive-2.rs:4:14 | LL | #[derive(x3300)] | ^^^^^ @@ -16,5 +34,5 @@ error: cannot find derive macro `x3300` in this scope LL | #[derive(x3300)] | ^^^^^ -error: aborting due to 3 previous errors +error: aborting due to 6 previous errors diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-macro_escape.rs b/src/test/ui/feature-gate/issue-43106-gating-of-macro_escape.rs index 75a3d9124e..de00bc4cba 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-macro_escape.rs +++ b/src/test/ui/feature-gate/issue-43106-gating-of-macro_escape.rs @@ -6,6 +6,6 @@ // check-pass #![macro_escape] -//~^ WARN macro_escape is a deprecated synonym for macro_use +//~^ WARN `#[macro_escape]` is a deprecated synonym for `#[macro_use]` fn main() {} diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-macro_escape.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-macro_escape.stderr index 8575c1660c..402dc4e540 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-macro_escape.stderr +++ b/src/test/ui/feature-gate/issue-43106-gating-of-macro_escape.stderr @@ -1,8 +1,8 @@ -warning: macro_escape is a deprecated synonym for macro_use +warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]` --> $DIR/issue-43106-gating-of-macro_escape.rs:8:1 | LL | #![macro_escape] | ^^^^^^^^^^^^^^^^ | - = help: consider an outer attribute, `#[macro_use]` mod ... + = help: try an outer attribute: `#[macro_use]` diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.rs b/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.rs index 4ced941aad..6a7ef79392 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.rs +++ b/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.rs @@ -4,13 +4,13 @@ // get that warning; see issue-43106-gating-of-builtin-attrs.rs #![macro_use(my_macro)] -//~^ ERROR arguments to macro_use are not allowed here +//~^ ERROR arguments to `macro_use` are not allowed here #[macro_use(my_macro)] -//~^ ERROR arguments to macro_use are not allowed here +//~^ ERROR arguments to `macro_use` are not allowed here mod macro_escape { mod inner { #![macro_use(my_macro)] } - //~^ ERROR arguments to macro_use are not allowed here + //~^ ERROR arguments to `macro_use` are not allowed here #[macro_use = "2700"] struct S; //~^ ERROR malformed `macro_use` attribute diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.stderr index 3181d62298..52a682e4bf 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.stderr +++ b/src/test/ui/feature-gate/issue-43106-gating-of-macro_use.stderr @@ -1,16 +1,16 @@ -error: arguments to macro_use are not allowed here +error: arguments to `macro_use` are not allowed here --> $DIR/issue-43106-gating-of-macro_use.rs:6:1 | LL | #![macro_use(my_macro)] | ^^^^^^^^^^^^^^^^^^^^^^^ -error: arguments to macro_use are not allowed here +error: arguments to `macro_use` are not allowed here --> $DIR/issue-43106-gating-of-macro_use.rs:9:1 | LL | #[macro_use(my_macro)] | ^^^^^^^^^^^^^^^^^^^^^^ -error: arguments to macro_use are not allowed here +error: arguments to `macro_use` are not allowed here --> $DIR/issue-43106-gating-of-macro_use.rs:12:17 | LL | mod inner { #![macro_use(my_macro)] } diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.rs b/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.rs index 60873f9cc7..a01d85515a 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.rs +++ b/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.rs @@ -18,6 +18,7 @@ mod rustc_deprecated { #[rustc_deprecated()] struct S; //~^ ERROR stability attributes may not be used outside of the standard library + //~| ERROR stability attributes may not be used outside of the standard library #[rustc_deprecated()] type T = S; //~^ ERROR stability attributes may not be used outside of the standard library diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.stderr index 8c6c26f7b2..3c4dcfec02 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.stderr +++ b/src/test/ui/feature-gate/issue-43106-gating-of-rustc_deprecated.stderr @@ -29,17 +29,23 @@ LL | #[rustc_deprecated()] struct S; | ^^^^^^^^^^^^^^^^^^^^^ error[E0734]: stability attributes may not be used outside of the standard library - --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:22:5 + --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:19:5 + | +LL | #[rustc_deprecated()] struct S; + | ^^^^^^^^^^^^^^^^^^^^^ + +error[E0734]: stability attributes may not be used outside of the standard library + --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:23:5 | LL | #[rustc_deprecated()] type T = S; | ^^^^^^^^^^^^^^^^^^^^^ error[E0734]: stability attributes may not be used outside of the standard library - --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:25:5 + --> $DIR/issue-43106-gating-of-rustc_deprecated.rs:26:5 | LL | #[rustc_deprecated()] impl S { } | ^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to 7 previous errors +error: aborting due to 8 previous errors For more information about this error, try `rustc --explain E0734`. diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-stable.rs b/src/test/ui/feature-gate/issue-43106-gating-of-stable.rs index e3ac274930..73ff965307 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-stable.rs +++ b/src/test/ui/feature-gate/issue-43106-gating-of-stable.rs @@ -18,6 +18,7 @@ mod stable { #[stable()] struct S; //~^ ERROR stability attributes may not be used outside of the standard library + //~| ERROR stability attributes may not be used outside of the standard library #[stable()] type T = S; //~^ ERROR stability attributes may not be used outside of the standard library diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-stable.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-stable.stderr index 09dabd293f..2573db1d68 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-stable.stderr +++ b/src/test/ui/feature-gate/issue-43106-gating-of-stable.stderr @@ -29,17 +29,23 @@ LL | #[stable()] struct S; | ^^^^^^^^^^^ error[E0734]: stability attributes may not be used outside of the standard library - --> $DIR/issue-43106-gating-of-stable.rs:22:5 + --> $DIR/issue-43106-gating-of-stable.rs:19:5 + | +LL | #[stable()] struct S; + | ^^^^^^^^^^^ + +error[E0734]: stability attributes may not be used outside of the standard library + --> $DIR/issue-43106-gating-of-stable.rs:23:5 | LL | #[stable()] type T = S; | ^^^^^^^^^^^ error[E0734]: stability attributes may not be used outside of the standard library - --> $DIR/issue-43106-gating-of-stable.rs:25:5 + --> $DIR/issue-43106-gating-of-stable.rs:26:5 | LL | #[stable()] impl S { } | ^^^^^^^^^^^ -error: aborting due to 7 previous errors +error: aborting due to 8 previous errors For more information about this error, try `rustc --explain E0734`. diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-unstable.rs b/src/test/ui/feature-gate/issue-43106-gating-of-unstable.rs index 8d519c3106..d8339b00c1 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-unstable.rs +++ b/src/test/ui/feature-gate/issue-43106-gating-of-unstable.rs @@ -18,6 +18,7 @@ mod unstable { #[unstable()] struct S; //~^ ERROR stability attributes may not be used outside of the standard library + //~| ERROR stability attributes may not be used outside of the standard library #[unstable()] type T = S; //~^ ERROR stability attributes may not be used outside of the standard library diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-unstable.stderr b/src/test/ui/feature-gate/issue-43106-gating-of-unstable.stderr index 49da2c5958..500675e054 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-unstable.stderr +++ b/src/test/ui/feature-gate/issue-43106-gating-of-unstable.stderr @@ -29,17 +29,23 @@ LL | #[unstable()] struct S; | ^^^^^^^^^^^^^ error[E0734]: stability attributes may not be used outside of the standard library - --> $DIR/issue-43106-gating-of-unstable.rs:22:5 + --> $DIR/issue-43106-gating-of-unstable.rs:19:5 + | +LL | #[unstable()] struct S; + | ^^^^^^^^^^^^^ + +error[E0734]: stability attributes may not be used outside of the standard library + --> $DIR/issue-43106-gating-of-unstable.rs:23:5 | LL | #[unstable()] type T = S; | ^^^^^^^^^^^^^ error[E0734]: stability attributes may not be used outside of the standard library - --> $DIR/issue-43106-gating-of-unstable.rs:25:5 + --> $DIR/issue-43106-gating-of-unstable.rs:26:5 | LL | #[unstable()] impl S { } | ^^^^^^^^^^^^^ -error: aborting due to 7 previous errors +error: aborting due to 8 previous errors For more information about this error, try `rustc --explain E0734`. diff --git a/src/test/ui/feature-gate/stability-attribute-consistency.rs b/src/test/ui/feature-gate/stability-attribute-consistency.rs index caafd8b885..6ee7003c31 100644 --- a/src/test/ui/feature-gate/stability-attribute-consistency.rs +++ b/src/test/ui/feature-gate/stability-attribute-consistency.rs @@ -9,7 +9,7 @@ fn foo_stable_1_0_0() {} //~^ ERROR feature `foo` is declared stable since 1.29.0 fn foo_stable_1_29_0() {} -#[unstable(feature = "foo", issue = "0")] +#[unstable(feature = "foo", issue = "none")] //~^ ERROR feature `foo` is declared unstable fn foo_unstable() {} diff --git a/src/test/ui/feature-gate/stability-attribute-consistency.stderr b/src/test/ui/feature-gate/stability-attribute-consistency.stderr index 9b4b28a392..d49b44c8a3 100644 --- a/src/test/ui/feature-gate/stability-attribute-consistency.stderr +++ b/src/test/ui/feature-gate/stability-attribute-consistency.stderr @@ -7,8 +7,8 @@ LL | #[stable(feature = "foo", since = "1.29.0")] error[E0711]: feature `foo` is declared unstable, but was previously declared stable --> $DIR/stability-attribute-consistency.rs:12:1 | -LL | #[unstable(feature = "foo", issue = "0")] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[unstable(feature = "foo", issue = "none")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/feature-gate/unstable-attribute-allow-issue-none.rs b/src/test/ui/feature-gate/unstable-attribute-allow-issue-0.rs similarity index 84% rename from src/test/ui/feature-gate/unstable-attribute-allow-issue-none.rs rename to src/test/ui/feature-gate/unstable-attribute-allow-issue-0.rs index 3ce9de3fb1..c8ad0d13a1 100644 --- a/src/test/ui/feature-gate/unstable-attribute-allow-issue-none.rs +++ b/src/test/ui/feature-gate/unstable-attribute-allow-issue-0.rs @@ -1,4 +1,4 @@ -// Check that an issue value can be explicitly set to "none" instead of "0" +// Check that an issue value can be explicitly set to "0" instead of "none" #![crate_type = "lib"] #![feature(staged_api)] #![stable(feature = "stable_test_feature", since = "1.0.0")] diff --git a/src/test/ui/feature-gate/unstable-attribute-allow-issue-none.stderr b/src/test/ui/feature-gate/unstable-attribute-allow-issue-0.stderr similarity index 80% rename from src/test/ui/feature-gate/unstable-attribute-allow-issue-none.stderr rename to src/test/ui/feature-gate/unstable-attribute-allow-issue-0.stderr index fc031f5f8c..10bd6f373d 100644 --- a/src/test/ui/feature-gate/unstable-attribute-allow-issue-none.stderr +++ b/src/test/ui/feature-gate/unstable-attribute-allow-issue-0.stderr @@ -1,5 +1,5 @@ error[E0545]: incorrect 'issue' - --> $DIR/unstable-attribute-allow-issue-none.rs:12:1 + --> $DIR/unstable-attribute-allow-issue-0.rs:12:1 | LL | #[unstable(feature = "unstable_test_feature", issue = "something")] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/feature-gates/feature-gate-external_doc.rs b/src/test/ui/feature-gates/feature-gate-external_doc.rs index 9d68d3ec4f..4e6e293846 100644 --- a/src/test/ui/feature-gates/feature-gate-external_doc.rs +++ b/src/test/ui/feature-gates/feature-gate-external_doc.rs @@ -1,2 +1,3 @@ #[doc(include="asdf.md")] //~ ERROR: `#[doc(include)]` is experimental + //~| ERROR: `#[doc(include)]` is experimental fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-external_doc.stderr b/src/test/ui/feature-gates/feature-gate-external_doc.stderr index 683c0ad217..0534018403 100644 --- a/src/test/ui/feature-gates/feature-gate-external_doc.stderr +++ b/src/test/ui/feature-gates/feature-gate-external_doc.stderr @@ -7,6 +7,15 @@ LL | #[doc(include="asdf.md")] = note: for more information, see https://github.com/rust-lang/rust/issues/44732 = help: add `#![feature(external_doc)]` to the crate attributes to enable -error: aborting due to previous error +error[E0658]: `#[doc(include)]` is experimental + --> $DIR/feature-gate-external_doc.rs:1:1 + | +LL | #[doc(include="asdf.md")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44732 + = help: add `#![feature(external_doc)]` to the crate attributes to enable + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/feature-gate-generators.rs b/src/test/ui/feature-gates/feature-gate-generators.rs index 382d891fee..931fee1347 100644 --- a/src/test/ui/feature-gates/feature-gate-generators.rs +++ b/src/test/ui/feature-gates/feature-gate-generators.rs @@ -1,6 +1,6 @@ fn main() { yield true; //~ ERROR yield syntax is experimental - //~^ ERROR yield statement outside of generator literal + //~^ ERROR yield expression outside of generator literal } #[cfg(FALSE)] diff --git a/src/test/ui/feature-gates/feature-gate-generators.stderr b/src/test/ui/feature-gates/feature-gate-generators.stderr index 24b814b410..4adc21efc6 100644 --- a/src/test/ui/feature-gates/feature-gate-generators.stderr +++ b/src/test/ui/feature-gates/feature-gate-generators.stderr @@ -25,7 +25,7 @@ LL | yield 0; = note: for more information, see https://github.com/rust-lang/rust/issues/43122 = help: add `#![feature(generators)]` to the crate attributes to enable -error[E0627]: yield statement outside of generator literal +error[E0627]: yield expression outside of generator literal --> $DIR/feature-gate-generators.rs:2:5 | LL | yield true; @@ -33,4 +33,5 @@ LL | yield true; error: aborting due to 4 previous errors -For more information about this error, try `rustc --explain E0658`. +Some errors have detailed explanations: E0627, E0658. +For more information about an error, try `rustc --explain E0627`. diff --git a/src/test/ui/feature-gates/feature-gate-generic_associated_types.rs b/src/test/ui/feature-gates/feature-gate-generic_associated_types.rs index 17548d7b9e..7ff348aca7 100644 --- a/src/test/ui/feature-gates/feature-gate-generic_associated_types.rs +++ b/src/test/ui/feature-gates/feature-gate-generic_associated_types.rs @@ -3,9 +3,11 @@ use std::ops::Deref; trait PointerFamily<U> { type Pointer<T>: Deref<Target = T>; //~^ ERROR generic associated types are unstable + //~| ERROR type-generic associated types are not yet implemented type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone; //~^ ERROR generic associated types are unstable //~| ERROR where clauses on associated types are unstable + //~| ERROR type-generic associated types are not yet implemented } struct Foo; diff --git a/src/test/ui/feature-gates/feature-gate-generic_associated_types.stderr b/src/test/ui/feature-gates/feature-gate-generic_associated_types.stderr index 04473f4106..ab17c9a28a 100644 --- a/src/test/ui/feature-gates/feature-gate-generic_associated_types.stderr +++ b/src/test/ui/feature-gates/feature-gate-generic_associated_types.stderr @@ -8,7 +8,7 @@ LL | type Pointer<T>: Deref<Target = T>; = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable error[E0658]: generic associated types are unstable - --> $DIR/feature-gate-generic_associated_types.rs:6:5 + --> $DIR/feature-gate-generic_associated_types.rs:7:5 | LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -17,7 +17,7 @@ LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone; = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable error[E0658]: where clauses on associated types are unstable - --> $DIR/feature-gate-generic_associated_types.rs:6:5 + --> $DIR/feature-gate-generic_associated_types.rs:7:5 | LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -26,7 +26,7 @@ LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone; = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable error[E0658]: generic associated types are unstable - --> $DIR/feature-gate-generic_associated_types.rs:14:5 + --> $DIR/feature-gate-generic_associated_types.rs:16:5 | LL | type Pointer<Usize> = Box<Usize>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -35,7 +35,7 @@ LL | type Pointer<Usize> = Box<Usize>; = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable error[E0658]: generic associated types are unstable - --> $DIR/feature-gate-generic_associated_types.rs:16:5 + --> $DIR/feature-gate-generic_associated_types.rs:18:5 | LL | type Pointer2<U32> = Box<U32>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -44,7 +44,7 @@ LL | type Pointer2<U32> = Box<U32>; = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable error[E0658]: where clauses on associated types are unstable - --> $DIR/feature-gate-generic_associated_types.rs:21:5 + --> $DIR/feature-gate-generic_associated_types.rs:23:5 | LL | type Assoc where Self: Sized; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -53,7 +53,7 @@ LL | type Assoc where Self: Sized; = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable error[E0658]: where clauses on associated types are unstable - --> $DIR/feature-gate-generic_associated_types.rs:26:5 + --> $DIR/feature-gate-generic_associated_types.rs:28:5 | LL | type Assoc where Self: Sized = Foo; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -61,6 +61,22 @@ LL | type Assoc where Self: Sized = Foo; = note: for more information, see https://github.com/rust-lang/rust/issues/44265 = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable -error: aborting due to 7 previous errors +error: type-generic associated types are not yet implemented + --> $DIR/feature-gate-generic_associated_types.rs:4:5 + | +LL | type Pointer<T>: Deref<Target = T>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: type-generic associated types are not yet implemented + --> $DIR/feature-gate-generic_associated_types.rs:7:5 + | +LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: aborting due to 9 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.stderr b/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.stderr index 5c64bf6539..bbf3ea8a89 100644 --- a/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.stderr +++ b/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.stderr @@ -2,103 +2,207 @@ error[E0261]: use of undeclared lifetime name `'x` --> $DIR/feature-gate-in_band_lifetimes.rs:3:12 | LL | fn foo(x: &'x u8) -> &'x u8 { x } - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'x` here: `<'x>` error[E0261]: use of undeclared lifetime name `'x` --> $DIR/feature-gate-in_band_lifetimes.rs:3:23 | LL | fn foo(x: &'x u8) -> &'x u8 { x } - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'x` here: `<'x>` error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:15:12 | LL | impl<'a> X<'b> { - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'b` here: `'b,` error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:17:27 | LL | fn inner_2(&self) -> &'b u8 { | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | impl<'b, 'a> X<'b> { + | ^^^ +help: consider introducing lifetime `'b` here + | +LL | fn inner_2<'b>(&self) -> &'b u8 { + | ^^^^ error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:23:8 | LL | impl X<'b> { - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'b` here: `<'b>` error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:25:27 | LL | fn inner_3(&self) -> &'b u8 { | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | impl<'b> X<'b> { + | ^^^^ +help: consider introducing lifetime `'b` here + | +LL | fn inner_3<'b>(&self) -> &'b u8 { + | ^^^^ error[E0261]: use of undeclared lifetime name `'a` --> $DIR/feature-gate-in_band_lifetimes.rs:33:9 | LL | impl Y<&'a u8> { - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'a` here: `<'a>` error[E0261]: use of undeclared lifetime name `'a` --> $DIR/feature-gate-in_band_lifetimes.rs:35:25 | LL | fn inner(&self) -> &'a u8 { | ^^ undeclared lifetime + | +help: consider introducing lifetime `'a` here + | +LL | impl<'a> Y<&'a u8> { + | ^^^^ +help: consider introducing lifetime `'a` here + | +LL | fn inner<'a>(&self) -> &'a u8 { + | ^^^^ error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:43:27 | LL | fn any_lifetime() -> &'b u8; | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | trait MyTrait<'b, 'a> { + | ^^^ +help: consider introducing lifetime `'b` here + | +LL | fn any_lifetime<'b>() -> &'b u8; + | ^^^^ error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:45:27 | LL | fn borrowed_lifetime(&'b self) -> &'b u8; | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | trait MyTrait<'b, 'a> { + | ^^^ +help: consider introducing lifetime `'b` here + | +LL | fn borrowed_lifetime<'b>(&'b self) -> &'b u8; + | ^^^^ error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:45:40 | LL | fn borrowed_lifetime(&'b self) -> &'b u8; | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | trait MyTrait<'b, 'a> { + | ^^^ +help: consider introducing lifetime `'b` here + | +LL | fn borrowed_lifetime<'b>(&'b self) -> &'b u8; + | ^^^^ error[E0261]: use of undeclared lifetime name `'a` --> $DIR/feature-gate-in_band_lifetimes.rs:50:14 | LL | impl MyTrait<'a> for Y<&'a u8> { - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'a` here: `<'a>` error[E0261]: use of undeclared lifetime name `'a` --> $DIR/feature-gate-in_band_lifetimes.rs:50:25 | LL | impl MyTrait<'a> for Y<&'a u8> { - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'a` here: `<'a>` error[E0261]: use of undeclared lifetime name `'a` --> $DIR/feature-gate-in_band_lifetimes.rs:53:31 | LL | fn my_lifetime(&self) -> &'a u8 { self.0 } | ^^ undeclared lifetime + | +help: consider introducing lifetime `'a` here + | +LL | impl<'a> MyTrait<'a> for Y<&'a u8> { + | ^^^^ +help: consider introducing lifetime `'a` here + | +LL | fn my_lifetime<'a>(&self) -> &'a u8 { self.0 } + | ^^^^ error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:55:27 | LL | fn any_lifetime() -> &'b u8 { &0 } | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | impl<'b> MyTrait<'a> for Y<&'a u8> { + | ^^^^ +help: consider introducing lifetime `'b` here + | +LL | fn any_lifetime<'b>() -> &'b u8 { &0 } + | ^^^^ error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:57:27 | LL | fn borrowed_lifetime(&'b self) -> &'b u8 { &*self.0 } | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | impl<'b> MyTrait<'a> for Y<&'a u8> { + | ^^^^ +help: consider introducing lifetime `'b` here + | +LL | fn borrowed_lifetime<'b>(&'b self) -> &'b u8 { &*self.0 } + | ^^^^ error[E0261]: use of undeclared lifetime name `'b` --> $DIR/feature-gate-in_band_lifetimes.rs:57:40 | LL | fn borrowed_lifetime(&'b self) -> &'b u8 { &*self.0 } | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | impl<'b> MyTrait<'a> for Y<&'a u8> { + | ^^^^ +help: consider introducing lifetime `'b` here + | +LL | fn borrowed_lifetime<'b>(&'b self) -> &'b u8 { &*self.0 } + | ^^^^ error: aborting due to 17 previous errors diff --git a/src/test/ui/feature-gates/feature-gate-lint-reasons.rs b/src/test/ui/feature-gates/feature-gate-lint-reasons.rs index 1a7b9c990f..b124e9b2f4 100644 --- a/src/test/ui/feature-gates/feature-gate-lint-reasons.rs +++ b/src/test/ui/feature-gates/feature-gate-lint-reasons.rs @@ -1,4 +1,6 @@ #![warn(nonstandard_style, reason = "the standard should be respected")] //~^ ERROR lint reasons are experimental +//~| ERROR lint reasons are experimental +//~| ERROR lint reasons are experimental fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-lint-reasons.stderr b/src/test/ui/feature-gates/feature-gate-lint-reasons.stderr index 390a1bf580..08ba9d0d3a 100644 --- a/src/test/ui/feature-gates/feature-gate-lint-reasons.stderr +++ b/src/test/ui/feature-gates/feature-gate-lint-reasons.stderr @@ -7,6 +7,24 @@ LL | #![warn(nonstandard_style, reason = "the standard should be respected")] = note: for more information, see https://github.com/rust-lang/rust/issues/54503 = help: add `#![feature(lint_reasons)]` to the crate attributes to enable -error: aborting due to previous error +error[E0658]: lint reasons are experimental + --> $DIR/feature-gate-lint-reasons.rs:1:28 + | +LL | #![warn(nonstandard_style, reason = "the standard should be respected")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/54503 + = help: add `#![feature(lint_reasons)]` to the crate attributes to enable + +error[E0658]: lint reasons are experimental + --> $DIR/feature-gate-lint-reasons.rs:1:28 + | +LL | #![warn(nonstandard_style, reason = "the standard should be respected")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/54503 + = help: add `#![feature(lint_reasons)]` to the crate attributes to enable + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/feature-gate-never_type.stderr b/src/test/ui/feature-gates/feature-gate-never_type.stderr index d86ab99b82..216615731e 100644 --- a/src/test/ui/feature-gates/feature-gate-never_type.stderr +++ b/src/test/ui/feature-gates/feature-gate-never_type.stderr @@ -1,4 +1,4 @@ -error[E0658]: The `!` type is experimental +error[E0658]: the `!` type is experimental --> $DIR/feature-gate-never_type.rs:7:17 | LL | type Ma = (u32, !, i32); @@ -7,7 +7,7 @@ LL | type Ma = (u32, !, i32); = note: for more information, see https://github.com/rust-lang/rust/issues/35121 = help: add `#![feature(never_type)]` to the crate attributes to enable -error[E0658]: The `!` type is experimental +error[E0658]: the `!` type is experimental --> $DIR/feature-gate-never_type.rs:8:20 | LL | type Meeshka = Vec<!>; @@ -16,7 +16,7 @@ LL | type Meeshka = Vec<!>; = note: for more information, see https://github.com/rust-lang/rust/issues/35121 = help: add `#![feature(never_type)]` to the crate attributes to enable -error[E0658]: The `!` type is experimental +error[E0658]: the `!` type is experimental --> $DIR/feature-gate-never_type.rs:9:24 | LL | type Mow = &'static fn(!) -> !; @@ -25,7 +25,7 @@ LL | type Mow = &'static fn(!) -> !; = note: for more information, see https://github.com/rust-lang/rust/issues/35121 = help: add `#![feature(never_type)]` to the crate attributes to enable -error[E0658]: The `!` type is experimental +error[E0658]: the `!` type is experimental --> $DIR/feature-gate-never_type.rs:10:27 | LL | type Skwoz = &'static mut !; @@ -34,7 +34,7 @@ LL | type Skwoz = &'static mut !; = note: for more information, see https://github.com/rust-lang/rust/issues/35121 = help: add `#![feature(never_type)]` to the crate attributes to enable -error[E0658]: The `!` type is experimental +error[E0658]: the `!` type is experimental --> $DIR/feature-gate-never_type.rs:13:16 | LL | type Wub = !; diff --git a/src/test/ui/feature-gates/feature-gate-repr-simd.rs b/src/test/ui/feature-gates/feature-gate-repr-simd.rs index 9d28f43741..c527404f57 100644 --- a/src/test/ui/feature-gates/feature-gate-repr-simd.rs +++ b/src/test/ui/feature-gates/feature-gate-repr-simd.rs @@ -1,7 +1,8 @@ #[repr(simd)] //~ error: SIMD types are experimental struct Foo(u64, u64); -#[repr(C)] //~ warn: conflicting representation hints +#[repr(C)] //~ ERROR conflicting representation hints +//~^ WARN this was previously accepted #[repr(simd)] //~ error: SIMD types are experimental struct Bar(u64, u64); diff --git a/src/test/ui/feature-gates/feature-gate-repr-simd.stderr b/src/test/ui/feature-gates/feature-gate-repr-simd.stderr index 02c8400e03..013bad069d 100644 --- a/src/test/ui/feature-gates/feature-gate-repr-simd.stderr +++ b/src/test/ui/feature-gates/feature-gate-repr-simd.stderr @@ -8,7 +8,7 @@ LL | #[repr(simd)] = help: add `#![feature(repr_simd)]` to the crate attributes to enable error[E0658]: SIMD types are experimental and possibly buggy - --> $DIR/feature-gate-repr-simd.rs:5:1 + --> $DIR/feature-gate-repr-simd.rs:6:1 | LL | #[repr(simd)] | ^^^^^^^^^^^^^ @@ -16,15 +16,20 @@ LL | #[repr(simd)] = note: for more information, see https://github.com/rust-lang/rust/issues/27731 = help: add `#![feature(repr_simd)]` to the crate attributes to enable -warning[E0566]: conflicting representation hints +error[E0566]: conflicting representation hints --> $DIR/feature-gate-repr-simd.rs:4:8 | LL | #[repr(C)] | ^ +LL | LL | #[repr(simd)] | ^^^^ + | + = note: `#[deny(conflicting_repr_hints)]` on by default + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #68585 <https://github.com/rust-lang/rust/issues/68585> -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors Some errors have detailed explanations: E0566, E0658. For more information about an error, try `rustc --explain E0566`. diff --git a/src/test/ui/feature-gates/feature-gate-repr128.stderr b/src/test/ui/feature-gates/feature-gate-repr128.stderr index 2139a5da60..e108d74e9c 100644 --- a/src/test/ui/feature-gates/feature-gate-repr128.stderr +++ b/src/test/ui/feature-gates/feature-gate-repr128.stderr @@ -6,7 +6,7 @@ LL | | A(u64) LL | | } | |_^ | - = note: for more information, see https://github.com/rust-lang/rust/issues/35118 + = note: for more information, see https://github.com/rust-lang/rust/issues/56071 = help: add `#![feature(repr128)]` to the crate attributes to enable error: aborting due to previous error diff --git a/src/test/ui/feature-gates/feature-gate-sanitizer-runtime.rs b/src/test/ui/feature-gates/feature-gate-sanitizer-runtime.rs deleted file mode 100644 index 3b972c117a..0000000000 --- a/src/test/ui/feature-gates/feature-gate-sanitizer-runtime.rs +++ /dev/null @@ -1,3 +0,0 @@ -#![sanitizer_runtime] //~ ERROR the `#[sanitizer_runtime]` attribute is - -fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-sanitizer-runtime.stderr b/src/test/ui/feature-gates/feature-gate-sanitizer-runtime.stderr deleted file mode 100644 index b13ec215f8..0000000000 --- a/src/test/ui/feature-gates/feature-gate-sanitizer-runtime.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error[E0658]: the `#[sanitizer_runtime]` attribute is used to identify crates that contain the runtime of a sanitizer and will never be stable - --> $DIR/feature-gate-sanitizer-runtime.rs:1:1 - | -LL | #![sanitizer_runtime] - | ^^^^^^^^^^^^^^^^^^^^^ - | - = help: add `#![feature(sanitizer_runtime)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/feature-gate-slice-patterns.rs b/src/test/ui/feature-gates/feature-gate-slice-patterns.rs deleted file mode 100644 index f2a1b135b6..0000000000 --- a/src/test/ui/feature-gates/feature-gate-slice-patterns.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Test that slice pattern syntax with `..` is gated by `slice_patterns` feature gate - -fn main() { - let x = [1, 2, 3, 4, 5]; - match x { - [1, 2, ..] => {} //~ ERROR subslice patterns are unstable - [1, .., 5] => {} //~ ERROR subslice patterns are unstable - [.., 4, 5] => {} //~ ERROR subslice patterns are unstable - } - - let x = [ 1, 2, 3, 4, 5 ]; - match x { - [ xs @ .., 4, 5 ] => {} //~ ERROR subslice patterns are unstable - [ 1, xs @ .., 5 ] => {} //~ ERROR subslice patterns are unstable - [ 1, 2, xs @ .. ] => {} //~ ERROR subslice patterns are unstable - } -} diff --git a/src/test/ui/feature-gates/feature-gate-slice-patterns.stderr b/src/test/ui/feature-gates/feature-gate-slice-patterns.stderr deleted file mode 100644 index d4946a42b8..0000000000 --- a/src/test/ui/feature-gates/feature-gate-slice-patterns.stderr +++ /dev/null @@ -1,57 +0,0 @@ -error[E0658]: subslice patterns are unstable - --> $DIR/feature-gate-slice-patterns.rs:6:16 - | -LL | [1, 2, ..] => {} - | ^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/62254 - = help: add `#![feature(slice_patterns)]` to the crate attributes to enable - -error[E0658]: subslice patterns are unstable - --> $DIR/feature-gate-slice-patterns.rs:7:13 - | -LL | [1, .., 5] => {} - | ^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/62254 - = help: add `#![feature(slice_patterns)]` to the crate attributes to enable - -error[E0658]: subslice patterns are unstable - --> $DIR/feature-gate-slice-patterns.rs:8:10 - | -LL | [.., 4, 5] => {} - | ^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/62254 - = help: add `#![feature(slice_patterns)]` to the crate attributes to enable - -error[E0658]: subslice patterns are unstable - --> $DIR/feature-gate-slice-patterns.rs:13:11 - | -LL | [ xs @ .., 4, 5 ] => {} - | ^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/62254 - = help: add `#![feature(slice_patterns)]` to the crate attributes to enable - -error[E0658]: subslice patterns are unstable - --> $DIR/feature-gate-slice-patterns.rs:14:14 - | -LL | [ 1, xs @ .., 5 ] => {} - | ^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/62254 - = help: add `#![feature(slice_patterns)]` to the crate attributes to enable - -error[E0658]: subslice patterns are unstable - --> $DIR/feature-gate-slice-patterns.rs:15:17 - | -LL | [ 1, 2, xs @ .. ] => {} - | ^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/62254 - = help: add `#![feature(slice_patterns)]` to the crate attributes to enable - -error: aborting due to 6 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/feature-gate-start.rs b/src/test/ui/feature-gates/feature-gate-start.rs index 0bd4c7c85b..e617f1c475 100644 --- a/src/test/ui/feature-gates/feature-gate-start.rs +++ b/src/test/ui/feature-gates/feature-gate-start.rs @@ -1,3 +1,3 @@ #[start] fn foo(_: isize, _: *const *const u8) -> isize { 0 } -//~^ ERROR a `#[start]` function is an experimental feature +//~^ ERROR `#[start]` functions are experimental diff --git a/src/test/ui/feature-gates/feature-gate-start.stderr b/src/test/ui/feature-gates/feature-gate-start.stderr index c769ef8ee9..f42e42ea03 100644 --- a/src/test/ui/feature-gates/feature-gate-start.stderr +++ b/src/test/ui/feature-gates/feature-gate-start.stderr @@ -1,4 +1,4 @@ -error[E0658]: a `#[start]` function is an experimental feature whose signature may change over time +error[E0658]: `#[start]` functions are experimental and their signature may change over time --> $DIR/feature-gate-start.rs:2:1 | LL | fn foo(_: isize, _: *const *const u8) -> isize { 0 } diff --git a/src/test/ui/feature-gates/feature-gate-transparent_enums.rs b/src/test/ui/feature-gates/feature-gate-transparent_enums.rs deleted file mode 100644 index 0a7a73a168..0000000000 --- a/src/test/ui/feature-gates/feature-gate-transparent_enums.rs +++ /dev/null @@ -1,6 +0,0 @@ -#[repr(transparent)] -enum OkButUnstableEnum { //~ ERROR transparent enums are unstable - Foo((), String, ()), -} - -fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-transparent_enums.stderr b/src/test/ui/feature-gates/feature-gate-transparent_enums.stderr deleted file mode 100644 index 8e727c33f2..0000000000 --- a/src/test/ui/feature-gates/feature-gate-transparent_enums.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0658]: transparent enums are unstable - --> $DIR/feature-gate-transparent_enums.rs:2:1 - | -LL | enum OkButUnstableEnum { - | ^^^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/60405 - = help: add `#![feature(transparent_enums)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.stderr b/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.stderr index d9ebcdecb9..1f61473c9d 100644 --- a/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.stderr +++ b/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.stderr @@ -16,15 +16,6 @@ LL | type Baa = impl Debug; = note: for more information, see https://github.com/rust-lang/rust/issues/63063 = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable -error[E0658]: `impl Trait` in type aliases is unstable - --> $DIR/feature-gate-type_alias_impl_trait.rs:18:18 - | -LL | type Assoc = impl Debug; - | ^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/63063 - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable - error[E0658]: associated type defaults are unstable --> $DIR/feature-gate-type_alias_impl_trait.rs:18:5 | @@ -34,6 +25,15 @@ LL | type Assoc = impl Debug; = note: for more information, see https://github.com/rust-lang/rust/issues/29661 = help: add `#![feature(associated_type_defaults)]` to the crate attributes to enable +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-type_alias_impl_trait.rs:18:18 + | +LL | type Assoc = impl Debug; + | ^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/63063 + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + error[E0658]: `impl Trait` in type aliases is unstable --> $DIR/feature-gate-type_alias_impl_trait.rs:24:24 | diff --git a/src/test/ui/feature-gates/feature-gate-unboxed-closures-manual-impls.stderr b/src/test/ui/feature-gates/feature-gate-unboxed-closures-manual-impls.stderr index 657bf13c87..4addd16649 100644 --- a/src/test/ui/feature-gates/feature-gate-unboxed-closures-manual-impls.stderr +++ b/src/test/ui/feature-gates/feature-gate-unboxed-closures-manual-impls.stderr @@ -34,11 +34,11 @@ LL | extern "rust-call" fn call_once(&self, args: ()) -> () {} = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable -error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead +error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change --> $DIR/feature-gate-unboxed-closures-manual-impls.rs:9:6 | LL | impl Fn<()> for Foo { - | ^^^^^^ + | ^^^^^^ help: use parenthetical notation instead: `Fn() -> ()` | = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable @@ -49,20 +49,20 @@ error[E0229]: associated type bindings are not allowed here LL | impl FnOnce() for Foo1 { | ^^^^^^^^ associated type not allowed here -error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead +error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change --> $DIR/feature-gate-unboxed-closures-manual-impls.rs:21:6 | LL | impl FnMut<()> for Bar { - | ^^^^^^^^^ + | ^^^^^^^^^ help: use parenthetical notation instead: `FnMut() -> ()` | = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable -error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead +error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change --> $DIR/feature-gate-unboxed-closures-manual-impls.rs:27:6 | LL | impl FnOnce<()> for Baz { - | ^^^^^^^^^^ + | ^^^^^^^^^^ help: use parenthetical notation instead: `FnOnce() -> ()` | = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable diff --git a/src/test/ui/feature-gates/feature-gate-unboxed-closures.stderr b/src/test/ui/feature-gates/feature-gate-unboxed-closures.stderr index f343a42eb8..005ff06e68 100644 --- a/src/test/ui/feature-gates/feature-gate-unboxed-closures.stderr +++ b/src/test/ui/feature-gates/feature-gate-unboxed-closures.stderr @@ -7,11 +7,11 @@ LL | extern "rust-call" fn call_once(self, (a, b): (u32, u32)) -> u32 { = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable -error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead +error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change --> $DIR/feature-gate-unboxed-closures.rs:5:6 | LL | impl FnOnce<(u32, u32)> for Test { - | ^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^ help: use parenthetical notation instead: `FnOnce(u32, u32) -> ()` | = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable diff --git a/src/test/ui/for-loop-while/for-loop-has-unit-body.rs b/src/test/ui/for-loop-while/for-loop-has-unit-body.rs index 38c34d2dc2..eba385461b 100644 --- a/src/test/ui/for-loop-while/for-loop-has-unit-body.rs +++ b/src/test/ui/for-loop-while/for-loop-has-unit-body.rs @@ -2,8 +2,8 @@ fn main() { // Check that the tail statement in the body unifies with something for _ in 0..3 { - #[allow(deprecated)] - unsafe { std::mem::uninitialized() } + // `()` is fine to zero-initialize as it is zero sized and inhabited. + unsafe { std::mem::zeroed() } } // Check that the tail statement in the body can be unit diff --git a/src/test/ui/for/for-loop-type-error.rs b/src/test/ui/for/for-loop-type-error.rs index 879fa47549..8d9fc20f0d 100644 --- a/src/test/ui/for/for-loop-type-error.rs +++ b/src/test/ui/for/for-loop-type-error.rs @@ -1,5 +1,5 @@ pub fn main() { - let x = () + (); //~ ERROR binary operation + let x = () + (); //~ ERROR cannot add `()` to `()` // this shouldn't have a flow-on error: for _ in x {} diff --git a/src/test/ui/for/for-loop-type-error.stderr b/src/test/ui/for/for-loop-type-error.stderr index 588e7a0ed3..0ed26384f4 100644 --- a/src/test/ui/for/for-loop-type-error.stderr +++ b/src/test/ui/for/for-loop-type-error.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `()` +error[E0369]: cannot add `()` to `()` --> $DIR/for-loop-type-error.rs:2:16 | LL | let x = () + (); diff --git a/src/test/ui/future-incompatible-lint-group.stderr b/src/test/ui/future-incompatible-lint-group.stderr index 24e3a077ae..1d958e5bfe 100644 --- a/src/test/ui/future-incompatible-lint-group.stderr +++ b/src/test/ui/future-incompatible-lint-group.stderr @@ -2,7 +2,7 @@ error: anonymous parameters are deprecated and will be removed in the next editi --> $DIR/future-incompatible-lint-group.rs:4:10 | LL | fn f(u8) {} - | ^^ help: Try naming the parameter or explicitly ignoring it: `_: u8` + | ^^ help: try naming the parameter or explicitly ignoring it: `_: u8` | note: lint level defined here --> $DIR/future-incompatible-lint-group.rs:1:9 diff --git a/src/test/ui/generator/auto-trait-regions.nll.stderr b/src/test/ui/generator/auto-trait-regions.nll.stderr index 4c157a05a5..bf87aea0d4 100644 --- a/src/test/ui/generator/auto-trait-regions.nll.stderr +++ b/src/test/ui/generator/auto-trait-regions.nll.stderr @@ -1,5 +1,5 @@ error[E0716]: temporary value dropped while borrowed - --> $DIR/auto-trait-regions.rs:44:24 + --> $DIR/auto-trait-regions.rs:45:24 | LL | let a = A(&mut true, &mut true, No); | ^^^^ - temporary value is freed at the end of this statement @@ -12,7 +12,7 @@ LL | assert_foo(a); = note: consider using a `let` binding to create a longer lived value error[E0716]: temporary value dropped while borrowed - --> $DIR/auto-trait-regions.rs:44:35 + --> $DIR/auto-trait-regions.rs:45:35 | LL | let a = A(&mut true, &mut true, No); | ^^^^ - temporary value is freed at the end of this statement @@ -31,7 +31,7 @@ LL | assert_foo(gen); | ^^^^^^^^^^^^^^^ error: higher-ranked subtype error - --> $DIR/auto-trait-regions.rs:48:5 + --> $DIR/auto-trait-regions.rs:49:5 | LL | assert_foo(gen); | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/generator/auto-trait-regions.rs b/src/test/ui/generator/auto-trait-regions.rs index 46d7289943..dbd8965dcf 100644 --- a/src/test/ui/generator/auto-trait-regions.rs +++ b/src/test/ui/generator/auto-trait-regions.rs @@ -29,6 +29,7 @@ fn main() { }; assert_foo(gen); //~^ ERROR implementation of `Foo` is not general enough + //~| ERROR implementation of `Foo` is not general enough // Allow impls which matches any lifetime let x = &OnlyFooIfRef(No); @@ -47,4 +48,5 @@ fn main() { }; assert_foo(gen); //~^ ERROR not general enough + //~| ERROR not general enough } diff --git a/src/test/ui/generator/auto-trait-regions.stderr b/src/test/ui/generator/auto-trait-regions.stderr index dab4d348ce..29a3907d93 100644 --- a/src/test/ui/generator/auto-trait-regions.stderr +++ b/src/test/ui/generator/auto-trait-regions.stderr @@ -11,7 +11,31 @@ LL | assert_foo(gen); = note: ...but `Foo` is actually implemented for the type `&'1 OnlyFooIfStaticRef`, for some specific lifetime `'1` error: implementation of `Foo` is not general enough - --> $DIR/auto-trait-regions.rs:48:5 + --> $DIR/auto-trait-regions.rs:30:5 + | +LL | auto trait Foo {} + | ----------------- trait `Foo` defined here +... +LL | assert_foo(gen); + | ^^^^^^^^^^ implementation of `Foo` is not general enough + | + = note: `Foo` would have to be implemented for the type `&'0 OnlyFooIfStaticRef`, for any lifetime `'0`... + = note: ...but `Foo` is actually implemented for the type `&'1 OnlyFooIfStaticRef`, for some specific lifetime `'1` + +error: implementation of `Foo` is not general enough + --> $DIR/auto-trait-regions.rs:49:5 + | +LL | auto trait Foo {} + | ----------------- trait `Foo` defined here +... +LL | assert_foo(gen); + | ^^^^^^^^^^ implementation of `Foo` is not general enough + | + = note: `Foo` would have to be implemented for the type `A<'0, '1>`, for any two lifetimes `'0` and `'1`... + = note: ...but `Foo` is actually implemented for the type `A<'_, '2>`, for some specific lifetime `'2` + +error: implementation of `Foo` is not general enough + --> $DIR/auto-trait-regions.rs:49:5 | LL | auto trait Foo {} | ----------------- trait `Foo` defined here @@ -22,5 +46,5 @@ LL | assert_foo(gen); = note: `Foo` would have to be implemented for the type `A<'0, '1>`, for any two lifetimes `'0` and `'1`... = note: ...but `Foo` is actually implemented for the type `A<'_, '2>`, for some specific lifetime `'2` -error: aborting due to 2 previous errors +error: aborting due to 4 previous errors diff --git a/src/test/ui/generator/not-send-sync.stderr b/src/test/ui/generator/not-send-sync.stderr index 0ac1d189b7..18d9012b3a 100644 --- a/src/test/ui/generator/not-send-sync.stderr +++ b/src/test/ui/generator/not-send-sync.stderr @@ -20,7 +20,7 @@ LL | fn assert_sync<T: Sync>(_: T) {} LL | assert_sync(|| { | ^^^^^^^^^^^ future returned by `main` is not `Sync` | - = help: within `[generator@$DIR/not-send-sync.rs:9:17: 13:6 {std::cell::Cell<i32>, ()}]`, the trait `std::marker::Sync` is not implemented for `std::cell::Cell<i32>` + = help: within `[generator@$DIR/not-send-sync.rs:9:17: 13:6 {std::cell::Cell<i32>, (), ()}]`, the trait `std::marker::Sync` is not implemented for `std::cell::Cell<i32>` note: future is not `Sync` as this value is used across an yield --> $DIR/not-send-sync.rs:12:9 | diff --git a/src/test/ui/generator/yield-in-const.rs b/src/test/ui/generator/yield-in-const.rs index f6f11b9cb1..fe5ca822ce 100644 --- a/src/test/ui/generator/yield-in-const.rs +++ b/src/test/ui/generator/yield-in-const.rs @@ -1,6 +1,6 @@ #![feature(generators)] const A: u8 = { yield 3u8; 3u8}; -//~^ ERROR yield statement outside +//~^ ERROR yield expression outside fn main() {} diff --git a/src/test/ui/generator/yield-in-const.stderr b/src/test/ui/generator/yield-in-const.stderr index 663bb70d7a..dcf4fe63e6 100644 --- a/src/test/ui/generator/yield-in-const.stderr +++ b/src/test/ui/generator/yield-in-const.stderr @@ -1,4 +1,4 @@ -error[E0627]: yield statement outside of generator literal +error[E0627]: yield expression outside of generator literal --> $DIR/yield-in-const.rs:3:17 | LL | const A: u8 = { yield 3u8; 3u8}; @@ -6,3 +6,4 @@ LL | const A: u8 = { yield 3u8; 3u8}; error: aborting due to previous error +For more information about this error, try `rustc --explain E0627`. diff --git a/src/test/ui/generator/yield-in-function.rs b/src/test/ui/generator/yield-in-function.rs index b737d3b224..29b811621d 100644 --- a/src/test/ui/generator/yield-in-function.rs +++ b/src/test/ui/generator/yield-in-function.rs @@ -1,4 +1,4 @@ #![feature(generators)] fn main() { yield; } -//~^ ERROR yield statement outside +//~^ ERROR yield expression outside diff --git a/src/test/ui/generator/yield-in-function.stderr b/src/test/ui/generator/yield-in-function.stderr index e12b0e6843..51cce198ca 100644 --- a/src/test/ui/generator/yield-in-function.stderr +++ b/src/test/ui/generator/yield-in-function.stderr @@ -1,4 +1,4 @@ -error[E0627]: yield statement outside of generator literal +error[E0627]: yield expression outside of generator literal --> $DIR/yield-in-function.rs:3:13 | LL | fn main() { yield; } @@ -6,3 +6,4 @@ LL | fn main() { yield; } error: aborting due to previous error +For more information about this error, try `rustc --explain E0627`. diff --git a/src/test/ui/generator/yield-in-static.rs b/src/test/ui/generator/yield-in-static.rs index 12c9ccea4c..d27fbb33ba 100644 --- a/src/test/ui/generator/yield-in-static.rs +++ b/src/test/ui/generator/yield-in-static.rs @@ -1,6 +1,6 @@ #![feature(generators)] static B: u8 = { yield 3u8; 3u8}; -//~^ ERROR yield statement outside +//~^ ERROR yield expression outside fn main() {} diff --git a/src/test/ui/generator/yield-in-static.stderr b/src/test/ui/generator/yield-in-static.stderr index 220520c386..d867f3ad34 100644 --- a/src/test/ui/generator/yield-in-static.stderr +++ b/src/test/ui/generator/yield-in-static.stderr @@ -1,4 +1,4 @@ -error[E0627]: yield statement outside of generator literal +error[E0627]: yield expression outside of generator literal --> $DIR/yield-in-static.rs:3:18 | LL | static B: u8 = { yield 3u8; 3u8}; @@ -6,3 +6,4 @@ LL | static B: u8 = { yield 3u8; 3u8}; error: aborting due to previous error +For more information about this error, try `rustc --explain E0627`. diff --git a/src/test/ui/rfc1598-generic-associated-types/collections.rs b/src/test/ui/generic-associated-types/collections.rs similarity index 77% rename from src/test/ui/rfc1598-generic-associated-types/collections.rs rename to src/test/ui/generic-associated-types/collections.rs index ede6a3b2b3..6f018f0401 100644 --- a/src/test/ui/rfc1598-generic-associated-types/collections.rs +++ b/src/test/ui/generic-associated-types/collections.rs @@ -1,10 +1,7 @@ +#![allow(incomplete_features)] #![feature(generic_associated_types)] -//~^ WARNING the feature `generic_associated_types` is incomplete #![feature(associated_type_defaults)] -// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a -// follow-up PR. - // A Collection trait and collection families. Based on // http://smallcultfollowing.com/babysteps/blog/2016/11/03/ // associated-type-constructors-part-2-family-traits/ @@ -15,18 +12,18 @@ trait Collection<T> { // Test associated type defaults with parameters type Sibling<U>: Collection<U> = <<Self as Collection<T>>::Family as CollectionFamily>::Member<U>; - //~^ ERROR type arguments are not allowed for this type [E0109] + //~^^ ERROR type-generic associated types are not yet implemented fn empty() -> Self; fn add(&mut self, value: T); fn iterate<'iter>(&'iter self) -> Self::Iter<'iter>; - //~^ ERROR lifetime arguments are not allowed for this type [E0109] } trait CollectionFamily { type Member<T>: Collection<T, Family = Self>; + //~^ ERROR type-generic associated types are not yet implemented } struct VecFamily; @@ -48,13 +45,11 @@ impl<T> Collection<T> for Vec<T> { } fn iterate<'iter>(&'iter self) -> Self::Iter<'iter> { - //~^ ERROR lifetime arguments are not allowed for this type [E0109] self.iter() } } fn floatify<C>(ints: &C) -> <<C as Collection<i32>>::Family as CollectionFamily>::Member<f32> -//~^ ERROR type arguments are not allowed for this type [E0109] where C: Collection<i32>, { @@ -66,7 +61,6 @@ where } fn floatify_sibling<C>(ints: &C) -> <C as Collection<i32>>::Sibling<f32> -//~^ ERROR type arguments are not allowed for this type [E0109] where C: Collection<i32>, { diff --git a/src/test/ui/generic-associated-types/collections.stderr b/src/test/ui/generic-associated-types/collections.stderr new file mode 100644 index 0000000000..e99ae78f71 --- /dev/null +++ b/src/test/ui/generic-associated-types/collections.stderr @@ -0,0 +1,19 @@ +error: type-generic associated types are not yet implemented + --> $DIR/collections.rs:13:5 + | +LL | / type Sibling<U>: Collection<U> = +LL | | <<Self as Collection<T>>::Family as CollectionFamily>::Member<U>; + | |_________________________________________________________________________^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: type-generic associated types are not yet implemented + --> $DIR/collections.rs:25:5 + | +LL | type Member<T>: Collection<T, Family = Self>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/generic-associated-types/construct_with_other_type.rs b/src/test/ui/generic-associated-types/construct_with_other_type.rs new file mode 100644 index 0000000000..2198b99db2 --- /dev/null +++ b/src/test/ui/generic-associated-types/construct_with_other_type.rs @@ -0,0 +1,26 @@ +#![allow(incomplete_features)] +#![feature(generic_associated_types)] + +// FIXME(#30472) normalize enough to handle this. + +use std::ops::Deref; + +trait Foo { + type Bar<'a, 'b>; +} + +trait Baz { + type Quux<'a>: Foo where Self: 'a; + + // This weird type tests that we can use universal function call syntax to access the Item on + type Baa<'a>: Deref<Target = <Self::Quux<'a> as Foo>::Bar<'a, 'static>> where Self: 'a; +} + +impl<T> Baz for T where T: Foo { +//~^ ERROR type mismatch resolving + type Quux<'a> where T: 'a = T; + + type Baa<'a> where T: 'a = &'a <T as Foo>::Bar<'a, 'static>; +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/construct_with_other_type.stderr b/src/test/ui/generic-associated-types/construct_with_other_type.stderr new file mode 100644 index 0000000000..bad746f7ef --- /dev/null +++ b/src/test/ui/generic-associated-types/construct_with_other_type.stderr @@ -0,0 +1,13 @@ +error[E0271]: type mismatch resolving `for<'a> <<T as Baz>::Baa<'a> as std::ops::Deref>::Target == <<T as Baz>::Quux<'a> as Foo>::Bar<'a, 'static>` + --> $DIR/construct_with_other_type.rs:19:9 + | +LL | impl<T> Baz for T where T: Foo { + | ^^^ expected type parameter `T`, found associated type + | + = note: expected associated type `<T as Foo>::Bar<'_, 'static>` + found associated type `<<T as Baz>::Quux<'_> as Foo>::Bar<'_, 'static>` + = note: you might be missing a type parameter or trait bound + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0271`. diff --git a/src/test/ui/rfc1598-generic-associated-types/empty_generics.rs b/src/test/ui/generic-associated-types/empty_generics.rs similarity index 71% rename from src/test/ui/rfc1598-generic-associated-types/empty_generics.rs rename to src/test/ui/generic-associated-types/empty_generics.rs index afc2770192..522e23ca43 100644 --- a/src/test/ui/rfc1598-generic-associated-types/empty_generics.rs +++ b/src/test/ui/generic-associated-types/empty_generics.rs @@ -1,5 +1,5 @@ +#![allow(incomplete_features)] #![feature(generic_associated_types)] -//~^ WARNING the feature `generic_associated_types` is incomplete trait Foo { type Bar<,>; diff --git a/src/test/ui/generic-associated-types/empty_generics.stderr b/src/test/ui/generic-associated-types/empty_generics.stderr new file mode 100644 index 0000000000..d3acad4783 --- /dev/null +++ b/src/test/ui/generic-associated-types/empty_generics.stderr @@ -0,0 +1,8 @@ +error: expected one of `>`, `const`, identifier, or lifetime, found `,` + --> $DIR/empty_generics.rs:5:14 + | +LL | type Bar<,>; + | ^ expected one of `>`, `const`, identifier, or lifetime + +error: aborting due to previous error + diff --git a/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature-2.rs b/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature-2.rs new file mode 100644 index 0000000000..f88df6a608 --- /dev/null +++ b/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature-2.rs @@ -0,0 +1,17 @@ +// rust-lang/rust#60654: Do not ICE on an attempt to use GATs that is +// missing the feature gate. + +struct Foo; + +trait MyTrait { + type Item<T>; + //~^ ERROR generic associated types are unstable [E0658] + //~| ERROR type-generic associated types are not yet implemented +} + +impl MyTrait for Foo { + type Item<T> = T; + //~^ ERROR generic associated types are unstable [E0658] +} + +fn main() { } diff --git a/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature-2.stderr b/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature-2.stderr new file mode 100644 index 0000000000..a7d280d635 --- /dev/null +++ b/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature-2.stderr @@ -0,0 +1,29 @@ +error[E0658]: generic associated types are unstable + --> $DIR/gat-dont-ice-on-absent-feature-2.rs:7:5 + | +LL | type Item<T>; + | ^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable + +error[E0658]: generic associated types are unstable + --> $DIR/gat-dont-ice-on-absent-feature-2.rs:13:5 + | +LL | type Item<T> = T; + | ^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable + +error: type-generic associated types are not yet implemented + --> $DIR/gat-dont-ice-on-absent-feature-2.rs:7:5 + | +LL | type Item<T>; + | ^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/rfc1598-generic-associated-types/gat-dont-ice-on-absent-feature.rs b/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature.rs similarity index 54% rename from src/test/ui/rfc1598-generic-associated-types/gat-dont-ice-on-absent-feature.rs rename to src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature.rs index 84fbb47301..e8fc47d2a5 100644 --- a/src/test/ui/rfc1598-generic-associated-types/gat-dont-ice-on-absent-feature.rs +++ b/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature.rs @@ -4,7 +4,9 @@ struct Foo; impl Iterator for Foo { - type Item<'b> = &'b Foo; //~ ERROR generic associated types are unstable [E0658] + type Item<'b> = &'b Foo; + //~^ ERROR generic associated types are unstable [E0658] + //~| ERROR lifetime parameters or bounds on type `Item` do not match the trait declaration fn next(&mut self) -> Option<Self::Item> { None diff --git a/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature.stderr b/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature.stderr new file mode 100644 index 0000000000..9031071ff6 --- /dev/null +++ b/src/test/ui/generic-associated-types/gat-dont-ice-on-absent-feature.stderr @@ -0,0 +1,19 @@ +error[E0658]: generic associated types are unstable + --> $DIR/gat-dont-ice-on-absent-feature.rs:7:5 + | +LL | type Item<'b> = &'b Foo; + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable + +error[E0195]: lifetime parameters or bounds on type `Item` do not match the trait declaration + --> $DIR/gat-dont-ice-on-absent-feature.rs:7:14 + | +LL | type Item<'b> = &'b Foo; + | ^^^^ lifetimes do not match type in trait + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0195, E0658. +For more information about an error, try `rustc --explain E0195`. diff --git a/src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.rs b/src/test/ui/generic-associated-types/gat-incomplete-warning.rs similarity index 100% rename from src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.rs rename to src/test/ui/generic-associated-types/gat-incomplete-warning.rs diff --git a/src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.stderr b/src/test/ui/generic-associated-types/gat-incomplete-warning.stderr similarity index 100% rename from src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.stderr rename to src/test/ui/generic-associated-types/gat-incomplete-warning.stderr diff --git a/src/test/ui/rfc1598-generic-associated-types/generic-associated-types-where.rs b/src/test/ui/generic-associated-types/generic-associated-types-where.rs similarity index 52% rename from src/test/ui/rfc1598-generic-associated-types/generic-associated-types-where.rs rename to src/test/ui/generic-associated-types/generic-associated-types-where.rs index 01daf307c0..589024e162 100644 --- a/src/test/ui/rfc1598-generic-associated-types/generic-associated-types-where.rs +++ b/src/test/ui/generic-associated-types/generic-associated-types-where.rs @@ -1,4 +1,5 @@ -#![feature(generic_associated_types)] //~ WARN `generic_associated_types` is incomplete +#![allow(incomplete_features)] +#![feature(generic_associated_types)] // Checking the interaction with this other feature #![feature(associated_type_defaults)] @@ -8,8 +9,11 @@ use std::fmt::{Display, Debug}; trait Foo { type Assoc where Self: Sized; type Assoc2<T> where T: Display; + //~^ ERROR type-generic associated types are not yet implemented type Assoc3<T>; - type WithDefault<T> where T: Debug = dyn Iterator<Item=T>; + //~^ ERROR type-generic associated types are not yet implemented + type WithDefault<'a, T: Debug + 'a> = dyn Iterator<Item=T>; + //~^ ERROR type-generic associated types are not yet implemented type NoGenerics; } @@ -19,7 +23,7 @@ impl Foo for Bar { type Assoc = usize; type Assoc2<T> = Vec<T>; type Assoc3<T> where T: Iterator = Vec<T>; - type WithDefault<'a, T> = &'a dyn Iterator<T>; + type WithDefault<'a, T: Debug + 'a> = &'a dyn Iterator<Item=T>; type NoGenerics = ::std::cell::Cell<i32>; } diff --git a/src/test/ui/generic-associated-types/generic-associated-types-where.stderr b/src/test/ui/generic-associated-types/generic-associated-types-where.stderr new file mode 100644 index 0000000000..2144a5e7d9 --- /dev/null +++ b/src/test/ui/generic-associated-types/generic-associated-types-where.stderr @@ -0,0 +1,26 @@ +error: type-generic associated types are not yet implemented + --> $DIR/generic-associated-types-where.rs:11:5 + | +LL | type Assoc2<T> where T: Display; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: type-generic associated types are not yet implemented + --> $DIR/generic-associated-types-where.rs:13:5 + | +LL | type Assoc3<T>; + | ^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: type-generic associated types are not yet implemented + --> $DIR/generic-associated-types-where.rs:15:5 + | +LL | type WithDefault<'a, T: Debug + 'a> = dyn Iterator<Item=T>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/generic-associated-types/generic_associated_type_undeclared_lifetimes.rs b/src/test/ui/generic-associated-types/generic_associated_type_undeclared_lifetimes.rs new file mode 100644 index 0000000000..4b4e59a512 --- /dev/null +++ b/src/test/ui/generic-associated-types/generic_associated_type_undeclared_lifetimes.rs @@ -0,0 +1,16 @@ +#![allow(incomplete_features)] +#![feature(generic_associated_types)] + +use std::ops::Deref; + +trait Iterable { + type Item<'a>; + type Iter<'a>: Iterator<Item = Self::Item<'a>> + + Deref<Target = Self::Item<'b>>; + //~^ ERROR undeclared lifetime + + fn iter<'a>(&'a self) -> Self::Iter<'undeclared>; + //~^ ERROR undeclared lifetime +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/generic_associated_type_undeclared_lifetimes.stderr b/src/test/ui/generic-associated-types/generic_associated_type_undeclared_lifetimes.stderr new file mode 100644 index 0000000000..fc2ce1cb86 --- /dev/null +++ b/src/test/ui/generic-associated-types/generic_associated_type_undeclared_lifetimes.stderr @@ -0,0 +1,33 @@ +error[E0261]: use of undeclared lifetime name `'b` + --> $DIR/generic_associated_type_undeclared_lifetimes.rs:9:37 + | +LL | + Deref<Target = Self::Item<'b>>; + | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | trait Iterable<'b> { + | ^^^^ +help: consider introducing lifetime `'b` here + | +LL | type Iter<'b, 'a>: Iterator<Item = Self::Item<'a>> + | ^^^ + +error[E0261]: use of undeclared lifetime name `'undeclared` + --> $DIR/generic_associated_type_undeclared_lifetimes.rs:12:41 + | +LL | fn iter<'a>(&'a self) -> Self::Iter<'undeclared>; + | ^^^^^^^^^^^ undeclared lifetime + | +help: consider introducing lifetime `'undeclared` here + | +LL | trait Iterable<'undeclared> { + | ^^^^^^^^^^^^^ +help: consider introducing lifetime `'undeclared` here + | +LL | fn iter<'undeclared, 'a>(&'a self) -> Self::Iter<'undeclared>; + | ^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0261`. diff --git a/src/test/ui/generic-associated-types/impl_bounds.rs b/src/test/ui/generic-associated-types/impl_bounds.rs new file mode 100644 index 0000000000..3ffa6c6eec --- /dev/null +++ b/src/test/ui/generic-associated-types/impl_bounds.rs @@ -0,0 +1,23 @@ +#![allow(incomplete_features)] +#![feature(generic_associated_types)] +#![feature(associated_type_defaults)] + +trait Foo { + type A<'a> where Self: 'a; + type B<'a, 'b> where 'a: 'b; + type C where Self: Clone; +} + +#[derive(Copy, Clone)] +struct Fooy<T>(T); + +impl<T> Foo for Fooy<T> { + type A<'a> where Self: 'static = (&'a ()); + //~^ ERROR the parameter type `T` may not live long enough + type B<'a, 'b> where 'b: 'a = (&'a(), &'b ()); + //~^ ERROR lifetime bound not satisfied + type C where Self: Copy = String; + //~^ ERROR the trait bound `T: std::marker::Copy` is not satisfied +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/impl_bounds.stderr b/src/test/ui/generic-associated-types/impl_bounds.stderr new file mode 100644 index 0000000000..ca2350ff75 --- /dev/null +++ b/src/test/ui/generic-associated-types/impl_bounds.stderr @@ -0,0 +1,46 @@ +error[E0310]: the parameter type `T` may not live long enough + --> $DIR/impl_bounds.rs:15:5 + | +LL | type A<'a> where Self: 'static = (&'a ()); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = help: consider adding an explicit lifetime bound `T: 'static`... +note: ...so that the type `Fooy<T>` will meet its required lifetime bounds + --> $DIR/impl_bounds.rs:15:5 + | +LL | type A<'a> where Self: 'static = (&'a ()); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0478]: lifetime bound not satisfied + --> $DIR/impl_bounds.rs:17:5 + | +LL | type B<'a, 'b> where 'b: 'a = (&'a(), &'b ()); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: lifetime parameter instantiated with the lifetime `'b` as defined on the associated item at 17:16 + --> $DIR/impl_bounds.rs:17:16 + | +LL | type B<'a, 'b> where 'b: 'a = (&'a(), &'b ()); + | ^^ +note: but lifetime parameter must outlive the lifetime `'a` as defined on the associated item at 17:12 + --> $DIR/impl_bounds.rs:17:12 + | +LL | type B<'a, 'b> where 'b: 'a = (&'a(), &'b ()); + | ^^ + +error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied + --> $DIR/impl_bounds.rs:19:5 + | +LL | impl<T> Foo for Fooy<T> { + | - help: consider restricting this bound: `T: std::marker::Copy` +... +LL | type C where Self: Copy = String; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T` + | + = note: required because of the requirements on the impl of `std::marker::Copy` for `Fooy<T>` + = note: the requirement `Fooy<T>: std::marker::Copy` appears on the associated impl type but not on the corresponding associated trait type + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0277, E0310, E0478. +For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/generic-associated-types/impl_bounds_ok.rs b/src/test/ui/generic-associated-types/impl_bounds_ok.rs new file mode 100644 index 0000000000..2387b89175 --- /dev/null +++ b/src/test/ui/generic-associated-types/impl_bounds_ok.rs @@ -0,0 +1,30 @@ +// check-pass + +#![allow(incomplete_features)] +#![feature(generic_associated_types)] +#![feature(associated_type_defaults)] + +trait Foo { + type A<'a> where Self: 'a; + type B<'a, 'b> where 'a: 'b; + type C where Self: Clone; +} + +struct Fooy; + +impl Foo for Fooy { + type A<'a> = (&'a ()); + type B<'a, 'b> = (&'a(), &'b ()); + type C = String; +} + +#[derive(Clone)] +struct Fooer<T>(T); + +impl<T> Foo for Fooer<T> { + type A<'x> where T: 'x = (&'x ()); + type B<'u, 'v> where 'u: 'v = (&'v &'u ()); + type C where Self: ToOwned = String; +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/issue-47206-where-clause.rs b/src/test/ui/generic-associated-types/issue-47206-where-clause.rs new file mode 100644 index 0000000000..53e350aacf --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-47206-where-clause.rs @@ -0,0 +1,17 @@ +// Check that this program doesn't cause the compiler to error without output. + +#![allow(incomplete_features)] +#![feature(generic_associated_types)] + +trait Foo { + type Assoc3<T>; + //~^ type-generic associated types are not yet implemented +} + +struct Bar; + +impl Foo for Bar { + type Assoc3<T> where T: Iterator = Vec<T>; +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/issue-47206-where-clause.stderr b/src/test/ui/generic-associated-types/issue-47206-where-clause.stderr new file mode 100644 index 0000000000..52207d759b --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-47206-where-clause.stderr @@ -0,0 +1,10 @@ +error: type-generic associated types are not yet implemented + --> $DIR/issue-47206-where-clause.rs:7:5 + | +LL | type Assoc3<T>; + | ^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: aborting due to previous error + diff --git a/src/test/ui/generic-associated-types/issue-58694-parameter-out-of-range.rs b/src/test/ui/generic-associated-types/issue-58694-parameter-out-of-range.rs new file mode 100644 index 0000000000..2298aa5b0b --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-58694-parameter-out-of-range.rs @@ -0,0 +1,10 @@ +// check-pass + +#![allow(incomplete_features)] +#![feature(generic_associated_types)] + +trait Cert { + type PublicKey<'a>: From<&'a [u8]>; +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/issue-62326-parameter-out-of-range.rs b/src/test/ui/generic-associated-types/issue-62326-parameter-out-of-range.rs new file mode 100644 index 0000000000..60466d0bcd --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-62326-parameter-out-of-range.rs @@ -0,0 +1,11 @@ +#![allow(incomplete_features)] +#![feature(generic_associated_types)] + +// FIXME(generic-associated-types) Investigate why this doesn't compile. + +trait Iterator { + //~^ ERROR the requirement `for<'a> <Self as Iterator>::Item<'a>: 'a` is not satisfied + type Item<'a>: 'a; +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/issue-62326-parameter-out-of-range.stderr b/src/test/ui/generic-associated-types/issue-62326-parameter-out-of-range.stderr new file mode 100644 index 0000000000..4dc69cdd1d --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-62326-parameter-out-of-range.stderr @@ -0,0 +1,15 @@ +error[E0280]: the requirement `for<'a> <Self as Iterator>::Item<'a>: 'a` is not satisfied + --> $DIR/issue-62326-parameter-out-of-range.rs:6:1 + | +LL | trait Iterator { + | ^------------- + | | + | _required by `Iterator` + | | +LL | | +LL | | type Item<'a>: 'a; +LL | | } + | |_^ + +error: aborting due to previous error + diff --git a/src/test/ui/generic-associated-types/issue-67424.rs b/src/test/ui/generic-associated-types/issue-67424.rs new file mode 100644 index 0000000000..9b616b8abc --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-67424.rs @@ -0,0 +1,13 @@ +// Fixed by #67160 + +trait Trait1 { + type A; +} + +trait Trait2 { + type Type1<B>: Trait1<A=B>; + //~^ ERROR: generic associated types are unstable + //~| ERROR: type-generic associated types are not yet implemented +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/issue-67424.stderr b/src/test/ui/generic-associated-types/issue-67424.stderr new file mode 100644 index 0000000000..59ff8ac0a3 --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-67424.stderr @@ -0,0 +1,20 @@ +error[E0658]: generic associated types are unstable + --> $DIR/issue-67424.rs:8:5 + | +LL | type Type1<B>: Trait1<A=B>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable + +error: type-generic associated types are not yet implemented + --> $DIR/issue-67424.rs:8:5 + | +LL | type Type1<B>: Trait1<A=B>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/generic-associated-types/iterable.rs b/src/test/ui/generic-associated-types/iterable.rs new file mode 100644 index 0000000000..105ab4a8ad --- /dev/null +++ b/src/test/ui/generic-associated-types/iterable.rs @@ -0,0 +1,51 @@ +#![allow(incomplete_features)] +#![feature(generic_associated_types)] + +// FIXME(#30472) normalize enough to handle this. + +trait Iterable { + type Item<'a> where Self: 'a; + type Iter<'a>: Iterator<Item = Self::Item<'a>> where Self: 'a; + + fn iter<'a>(&'a self) -> Self::Iter<'a>; +} + +// Impl for struct type +impl<T> Iterable for Vec<T> { + type Item<'a> where T: 'a = <std::slice::Iter<'a, T> as Iterator>::Item; + //~^ ERROR type mismatch resolving + type Iter<'a> where T: 'a = std::slice::Iter<'a, T>; + + fn iter<'a>(&'a self) -> Self::Iter<'a> { + //~^ ERROR type mismatch resolving + self.iter() + } +} + +// Impl for a primitive type +impl<T> Iterable for [T] { + type Item<'a> where T: 'a = <std::slice::Iter<'a, T> as Iterator>::Item; + //~^ ERROR type mismatch resolving + type Iter<'a> where T: 'a = std::slice::Iter<'a, T>; + + fn iter<'a>(&'a self) -> Self::Iter<'a> { + //~^ ERROR type mismatch resolving + self.iter() + } +} + +fn make_iter<'a, I: Iterable>(it: &'a I) -> I::Iter<'a> { + it.iter() +} + +fn get_first<'a, I: Iterable>(it: &'a I) -> Option<I::Item<'a>> { + it.iter().next() +} + +fn main() { + let v = vec![1, 2, 3]; + assert_eq!(v, make_iter(&v).copied().collect()); + assert_eq!(v, make_iter(&*v).copied().collect()); + assert_eq!(1, get_first(&v)); + assert_eq!(1, get_first(&*v)); +} diff --git a/src/test/ui/generic-associated-types/iterable.stderr b/src/test/ui/generic-associated-types/iterable.stderr new file mode 100644 index 0000000000..d0d75f3cc6 --- /dev/null +++ b/src/test/ui/generic-associated-types/iterable.stderr @@ -0,0 +1,63 @@ +error[E0271]: type mismatch resolving `for<'a> <<std::vec::Vec<T> as Iterable>::Iter<'a> as std::iter::Iterator>::Item == <std::vec::Vec<T> as Iterable>::Item<'a>` + --> $DIR/iterable.rs:15:5 + | +LL | impl<T> Iterable for Vec<T> { + | --------------------------- in this `impl` item +LL | type Item<'a> where T: 'a = <std::slice::Iter<'a, T> as Iterator>::Item; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found associated type + | + = note: expected reference `&T` + found associated type `<std::vec::Vec<T> as Iterable>::Item<'_>` + = note: consider constraining the associated type `<std::vec::Vec<T> as Iterable>::Item<'_>` to `&_` + = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html + +error[E0271]: type mismatch resolving `for<'a> <<[T] as Iterable>::Iter<'a> as std::iter::Iterator>::Item == <[T] as Iterable>::Item<'a>` + --> $DIR/iterable.rs:27:5 + | +LL | impl<T> Iterable for [T] { + | ------------------------ in this `impl` item +LL | type Item<'a> where T: 'a = <std::slice::Iter<'a, T> as Iterator>::Item; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found associated type + | + = note: expected reference `&T` + found associated type `<[T] as Iterable>::Item<'_>` + = note: consider constraining the associated type `<[T] as Iterable>::Item<'_>` to `&_` + = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html + +error[E0271]: type mismatch resolving `for<'a> <<std::vec::Vec<T> as Iterable>::Iter<'a> as std::iter::Iterator>::Item == <std::vec::Vec<T> as Iterable>::Item<'a>` + --> $DIR/iterable.rs:19:5 + | +LL | trait Iterable { + | -------------- required by `Iterable` +... +LL | / fn iter<'a>(&'a self) -> Self::Iter<'a> { +LL | | +LL | | self.iter() +LL | | } + | |_____^ expected associated type, found reference + | + = note: expected associated type `<std::vec::Vec<T> as Iterable>::Item<'_>` + found reference `&T` + = note: consider constraining the associated type `<std::vec::Vec<T> as Iterable>::Item<'_>` to `&_` or calling a method that returns `<std::vec::Vec<T> as Iterable>::Item<'_>` + = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html + +error[E0271]: type mismatch resolving `for<'a> <<[T] as Iterable>::Iter<'a> as std::iter::Iterator>::Item == <[T] as Iterable>::Item<'a>` + --> $DIR/iterable.rs:31:5 + | +LL | trait Iterable { + | -------------- required by `Iterable` +... +LL | / fn iter<'a>(&'a self) -> Self::Iter<'a> { +LL | | +LL | | self.iter() +LL | | } + | |_____^ expected associated type, found reference + | + = note: expected associated type `<[T] as Iterable>::Item<'_>` + found reference `&T` + = note: consider constraining the associated type `<[T] as Iterable>::Item<'_>` to `&_` or calling a method that returns `<[T] as Iterable>::Item<'_>` + = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0271`. diff --git a/src/test/ui/generic-associated-types/parameter_number_and_kind.rs b/src/test/ui/generic-associated-types/parameter_number_and_kind.rs new file mode 100644 index 0000000000..0edc5c48c0 --- /dev/null +++ b/src/test/ui/generic-associated-types/parameter_number_and_kind.rs @@ -0,0 +1,24 @@ +#![allow(incomplete_features)] +#![feature(generic_associated_types)] +#![feature(associated_type_defaults)] + +trait Foo { + type A<'a>; + type B<'a, 'b>; + type C; + type D<T>; + //~^ ERROR type-generic associated types are not yet implemented + type E<'a, T>; + //~^ ERROR type-generic associated types are not yet implemented + // Test parameters in default values + type FOk<T> = Self::E<'static, T>; + //~^ ERROR type-generic associated types are not yet implemented + type FErr1 = Self::E<'static, 'static>; + //~^ ERROR wrong number of lifetime arguments: expected 1, found 2 + //~| ERROR wrong number of type arguments: expected 1, found 0 + type FErr2<T> = Self::E<'static, T, u32>; + //~^ ERROR type-generic associated types are not yet implemented + //~| ERROR wrong number of type arguments: expected 1, found 2 +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/parameter_number_and_kind.stderr b/src/test/ui/generic-associated-types/parameter_number_and_kind.stderr new file mode 100644 index 0000000000..6b5683611a --- /dev/null +++ b/src/test/ui/generic-associated-types/parameter_number_and_kind.stderr @@ -0,0 +1,53 @@ +error: type-generic associated types are not yet implemented + --> $DIR/parameter_number_and_kind.rs:9:5 + | +LL | type D<T>; + | ^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: type-generic associated types are not yet implemented + --> $DIR/parameter_number_and_kind.rs:11:5 + | +LL | type E<'a, T>; + | ^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: type-generic associated types are not yet implemented + --> $DIR/parameter_number_and_kind.rs:14:5 + | +LL | type FOk<T> = Self::E<'static, T>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: type-generic associated types are not yet implemented + --> $DIR/parameter_number_and_kind.rs:19:5 + | +LL | type FErr2<T> = Self::E<'static, T, u32>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error[E0107]: wrong number of lifetime arguments: expected 1, found 2 + --> $DIR/parameter_number_and_kind.rs:16:35 + | +LL | type FErr1 = Self::E<'static, 'static>; + | ^^^^^^^ unexpected lifetime argument + +error[E0107]: wrong number of type arguments: expected 1, found 0 + --> $DIR/parameter_number_and_kind.rs:16:18 + | +LL | type FErr1 = Self::E<'static, 'static>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ expected 1 type argument + +error[E0107]: wrong number of type arguments: expected 1, found 2 + --> $DIR/parameter_number_and_kind.rs:19:41 + | +LL | type FErr2<T> = Self::E<'static, T, u32>; + | ^^^ unexpected type argument + +error: aborting due to 7 previous errors + +For more information about this error, try `rustc --explain E0107`. diff --git a/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.rs b/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.rs new file mode 100644 index 0000000000..74b9cec1da --- /dev/null +++ b/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.rs @@ -0,0 +1,35 @@ +#![allow(incomplete_features)] +#![feature(generic_associated_types)] +#![feature(associated_type_defaults)] + +// FIXME(#44265) add tests for type-generic and const-genertic associated types. + +trait Foo { + type A<'a>; + type B<'a, 'b>; + type C; +} + +struct Fooy; + +impl Foo for Fooy { + type A = u32; + //~^ ERROR lifetime parameters or bounds on type `A` do not match the trait declaration + type B<'a, T> = Vec<T>; + //~^ ERROR type `B` has 1 type parameter but its trait declaration has 0 type parameters + type C<'a> = u32; + //~^ ERROR lifetime parameters or bounds on type `C` do not match the trait declaration +} + +struct Fooer; + +impl Foo for Fooer { + type A<T> = u32; + //~^ ERROR type `A` has 1 type parameter but its trait declaration has 0 type parameters + type B<'a> = u32; + //~^ ERROR lifetime parameters or bounds on type `B` do not match the trait declaration + type C<T> = T; + //~^ ERROR type `C` has 1 type parameter but its trait declaration has 0 type parameters +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.stderr b/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.stderr new file mode 100644 index 0000000000..bdd1c895fd --- /dev/null +++ b/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.stderr @@ -0,0 +1,62 @@ +error[E0195]: lifetime parameters or bounds on type `A` do not match the trait declaration + --> $DIR/parameter_number_and_kind_impl.rs:16:11 + | +LL | type A<'a>; + | ---- lifetimes in impl do not match this type in trait +... +LL | type A = u32; + | ^ lifetimes do not match type in trait + +error[E0049]: type `B` has 1 type parameter but its trait declaration has 0 type parameters + --> $DIR/parameter_number_and_kind_impl.rs:18:12 + | +LL | type B<'a, 'b>; + | -- -- + | | + | expected 0 type parameters +... +LL | type B<'a, T> = Vec<T>; + | ^^ ^ + | | + | found 1 type parameter + +error[E0195]: lifetime parameters or bounds on type `C` do not match the trait declaration + --> $DIR/parameter_number_and_kind_impl.rs:20:11 + | +LL | type C; + | - lifetimes in impl do not match this type in trait +... +LL | type C<'a> = u32; + | ^^^^ lifetimes do not match type in trait + +error[E0049]: type `A` has 1 type parameter but its trait declaration has 0 type parameters + --> $DIR/parameter_number_and_kind_impl.rs:27:12 + | +LL | type A<'a>; + | -- expected 0 type parameters +... +LL | type A<T> = u32; + | ^ found 1 type parameter + +error[E0195]: lifetime parameters or bounds on type `B` do not match the trait declaration + --> $DIR/parameter_number_and_kind_impl.rs:29:11 + | +LL | type B<'a, 'b>; + | -------- lifetimes in impl do not match this type in trait +... +LL | type B<'a> = u32; + | ^^^^ lifetimes do not match type in trait + +error[E0049]: type `C` has 1 type parameter but its trait declaration has 0 type parameters + --> $DIR/parameter_number_and_kind_impl.rs:31:12 + | +LL | type C; + | - expected 0 type parameters +... +LL | type C<T> = T; + | ^ found 1 type parameter + +error: aborting due to 6 previous errors + +Some errors have detailed explanations: E0049, E0195. +For more information about an error, try `rustc --explain E0049`. diff --git a/src/test/ui/rfc1598-generic-associated-types/parse/in-trait-impl.rs b/src/test/ui/generic-associated-types/parse/in-trait-impl.rs similarity index 77% rename from src/test/ui/rfc1598-generic-associated-types/parse/in-trait-impl.rs rename to src/test/ui/generic-associated-types/parse/in-trait-impl.rs index 9fc32d7cc5..7f4775ddbb 100644 --- a/src/test/ui/rfc1598-generic-associated-types/parse/in-trait-impl.rs +++ b/src/test/ui/generic-associated-types/parse/in-trait-impl.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // compile-flags: -Z parse-only #![feature(generic_associated_types)] diff --git a/src/test/ui/rfc1598-generic-associated-types/parse/in-trait.rs b/src/test/ui/generic-associated-types/parse/in-trait.rs similarity index 92% rename from src/test/ui/rfc1598-generic-associated-types/parse/in-trait.rs rename to src/test/ui/generic-associated-types/parse/in-trait.rs index 7974ee9d39..d438795eb1 100644 --- a/src/test/ui/rfc1598-generic-associated-types/parse/in-trait.rs +++ b/src/test/ui/generic-associated-types/parse/in-trait.rs @@ -1,9 +1,10 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // compile-flags: -Z parse-only #![feature(generic_associated_types)] use std::ops::Deref; +use std::fmt::Debug; trait Foo { type Bar<'a>; diff --git a/src/test/ui/rfc1598-generic-associated-types/pointer_family.rs b/src/test/ui/generic-associated-types/pointer_family.rs similarity index 58% rename from src/test/ui/rfc1598-generic-associated-types/pointer_family.rs rename to src/test/ui/generic-associated-types/pointer_family.rs index edeeaba756..1668759b4e 100644 --- a/src/test/ui/rfc1598-generic-associated-types/pointer_family.rs +++ b/src/test/ui/generic-associated-types/pointer_family.rs @@ -1,7 +1,7 @@ +#![allow(incomplete_features)] #![feature(generic_associated_types)] -//~^ WARNING the feature `generic_associated_types` is incomplete -// FIXME(#44265): "type argument not allowed" errors will be addressed in a follow-up PR. +// FIXME(#44265): allow type-generic associated types. use std::rc::Rc; use std::sync::Arc; @@ -9,8 +9,8 @@ use std::ops::Deref; trait PointerFamily { type Pointer<T>: Deref<Target = T>; + //~^ ERROR type-generic associated types are not yet implemented fn new<T>(value: T) -> Self::Pointer<T>; - //~^ ERROR type arguments are not allowed for this type [E0109] } struct ArcFamily; @@ -18,7 +18,6 @@ struct ArcFamily; impl PointerFamily for ArcFamily { type Pointer<T> = Arc<T>; fn new<T>(value: T) -> Self::Pointer<T> { - //~^ ERROR type arguments are not allowed for this type [E0109] Arc::new(value) } } @@ -28,14 +27,12 @@ struct RcFamily; impl PointerFamily for RcFamily { type Pointer<T> = Rc<T>; fn new<T>(value: T) -> Self::Pointer<T> { - //~^ ERROR type arguments are not allowed for this type [E0109] Rc::new(value) } } struct Foo<P: PointerFamily> { bar: P::Pointer<String>, - //~^ ERROR type arguments are not allowed for this type [E0109] } fn main() {} diff --git a/src/test/ui/generic-associated-types/pointer_family.stderr b/src/test/ui/generic-associated-types/pointer_family.stderr new file mode 100644 index 0000000000..2a784f8b9d --- /dev/null +++ b/src/test/ui/generic-associated-types/pointer_family.stderr @@ -0,0 +1,10 @@ +error: type-generic associated types are not yet implemented + --> $DIR/pointer_family.rs:11:5 + | +LL | type Pointer<T>: Deref<Target = T>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: aborting due to previous error + diff --git a/src/test/ui/rfc1598-generic-associated-types/shadowing.rs b/src/test/ui/generic-associated-types/shadowing.rs similarity index 65% rename from src/test/ui/rfc1598-generic-associated-types/shadowing.rs rename to src/test/ui/generic-associated-types/shadowing.rs index f5197fd01b..7277c0d87c 100644 --- a/src/test/ui/rfc1598-generic-associated-types/shadowing.rs +++ b/src/test/ui/generic-associated-types/shadowing.rs @@ -16,15 +16,19 @@ impl<'a> NoShadow<'a> for &'a u32 { } trait ShadowT<T> { - type Bar<T>; //~ ERROR the name `T` is already used + type Bar<T>; + //~^ ERROR the name `T` is already used + //~| ERROR type-generic associated types are not yet implemented } trait NoShadowT<T> { type Bar<U>; // OK + //~^ ERROR type-generic associated types are not yet implemented } impl<T> NoShadowT<T> for Option<T> { - type Bar<T> = i32; //~ ERROR the name `T` is already used + type Bar<T> = i32; + //~^ ERROR the name `T` is already used } fn main() {} diff --git a/src/test/ui/rfc1598-generic-associated-types/shadowing.stderr b/src/test/ui/generic-associated-types/shadowing.stderr similarity index 51% rename from src/test/ui/rfc1598-generic-associated-types/shadowing.stderr rename to src/test/ui/generic-associated-types/shadowing.stderr index a06c635084..50c12e822e 100644 --- a/src/test/ui/rfc1598-generic-associated-types/shadowing.stderr +++ b/src/test/ui/generic-associated-types/shadowing.stderr @@ -7,13 +7,29 @@ LL | type Bar<T>; | ^ already used error[E0403]: the name `T` is already used for a generic parameter in this item's generic parameters - --> $DIR/shadowing.rs:27:14 + --> $DIR/shadowing.rs:30:14 | LL | impl<T> NoShadowT<T> for Option<T> { | - first use of `T` LL | type Bar<T> = i32; | ^ already used -error: aborting due to 2 previous errors +error: type-generic associated types are not yet implemented + --> $DIR/shadowing.rs:19:5 + | +LL | type Bar<T>; + | ^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: type-generic associated types are not yet implemented + --> $DIR/shadowing.rs:25:5 + | +LL | type Bar<U>; // OK + | ^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/44265 + +error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0403`. diff --git a/src/test/ui/rfc1598-generic-associated-types/streaming_iterator.rs b/src/test/ui/generic-associated-types/streaming_iterator.rs similarity index 53% rename from src/test/ui/rfc1598-generic-associated-types/streaming_iterator.rs rename to src/test/ui/generic-associated-types/streaming_iterator.rs index 4e177fb41d..d814f7140d 100644 --- a/src/test/ui/rfc1598-generic-associated-types/streaming_iterator.rs +++ b/src/test/ui/generic-associated-types/streaming_iterator.rs @@ -1,30 +1,26 @@ -#![feature(generic_associated_types)] -//~^ WARNING the feature `generic_associated_types` is incomplete +// run-pass -// FIXME(#44265): "lifetime argument not allowed on this type" errors will be addressed in a -// follow-up PR +#![allow(incomplete_features)] +#![feature(generic_associated_types)] use std::fmt::Display; trait StreamingIterator { type Item<'a>; // Applying the lifetime parameter `'a` to `Self::Item` inside the trait. - fn next<'a>(&'a self) -> Option<Self::Item<'a>>; - //~^ ERROR lifetime arguments are not allowed for this type [E0109] + fn next<'a>(&'a mut self) -> Option<Self::Item<'a>>; } struct Foo<T: StreamingIterator> { // Applying a concrete lifetime to the constructor outside the trait. bar: <T as StreamingIterator>::Item<'static>, - //~^ ERROR lifetime arguments are not allowed for this type [E0109] } // Users can bound parameters by the type constructed by that trait's associated type constructor // of a trait using HRTB. Both type equality bounds and trait bounds of this kind are valid: -//FIXME(sunjay): This next line should parse and be valid -//fn foo<T: for<'a> StreamingIterator<Item<'a>=&'a [i32]>>(iter: T) { /* ... */ } -fn foo<T>(iter: T) where T: StreamingIterator, for<'a> T::Item<'a>: Display { /* ... */ } -//~^ ERROR lifetime arguments are not allowed for this type [E0109] +//FIXME(#44265): This next line should parse and be valid +//fn foo<T: for<'a> StreamingIterator<Item<'a>=&'a [i32]>>(_iter: T) { /* ... */ } +fn _foo<T>(_iter: T) where T: StreamingIterator, for<'a> T::Item<'a>: Display { /* ... */ } // Full example of enumerate iterator @@ -36,9 +32,7 @@ struct StreamEnumerate<I> { impl<I: StreamingIterator> StreamingIterator for StreamEnumerate<I> { type Item<'a> = (usize, I::Item<'a>); - //~^ ERROR lifetime arguments are not allowed for this type [E0109] - fn next<'a>(&'a self) -> Option<Self::Item<'a>> { - //~^ ERROR lifetime arguments are not allowed for this type [E0109] + fn next<'a>(&'a mut self) -> Option<Self::Item<'a>> { match self.iter.next() { None => None, Some(val) => { @@ -50,24 +44,34 @@ impl<I: StreamingIterator> StreamingIterator for StreamEnumerate<I> { } } +impl<I: Iterator> StreamingIterator for I { + type Item<'a> = <I as Iterator>::Item; + fn next(&mut self) -> Option<<I as StreamingIterator>::Item<'_>> { + Iterator::next(self) + } +} + impl<I> StreamEnumerate<I> { pub fn new(iter: I) -> Self { StreamEnumerate { count: 0, - iter: iter, + iter, } } } fn test_stream_enumerate() { let v = vec!["a", "b", "c"]; - let se = StreamEnumerate::new(v.iter()); - let a: &str = se.next().unwrap().1; - for (i, s) in se { - println!("{} {}", i, s); + let mut se = StreamEnumerate::new(v.iter()); + while let Some(item) = se.next() { + assert_eq!(v[item.0], *item.1); } - println!("{}", a); + let x = Foo::<std::slice::Iter<'static, u32>> { + bar: &0u32, + }; + assert_eq!(*x.bar, 0u32); } - -fn main() {} +fn main() { + test_stream_enumerate(); +} diff --git a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision.rs b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.rs similarity index 59% rename from src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision.rs rename to src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.rs index d97b693f52..3f4c17836c 100644 --- a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision.rs +++ b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.rs @@ -1,10 +1,10 @@ +#![feature(half_open_range_patterns)] #![feature(exclusive_range_pattern)] fn main() { match [5..4, 99..105, 43..44] { [_, 99.., _] => {}, - //~^ ERROR `X..` range patterns are not supported - //~| ERROR mismatched types + //~^ ERROR mismatched types _ => {}, } } diff --git a/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.stderr b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.stderr new file mode 100644 index 0000000000..a6f8563a04 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision.stderr @@ -0,0 +1,14 @@ +error[E0308]: mismatched types + --> $DIR/exclusive_range_pattern_syntax_collision.rs:6:13 + | +LL | match [5..4, 99..105, 43..44] { + | ----------------------- this expression has type `[std::ops::Range<{integer}>; 3]` +LL | [_, 99.., _] => {}, + | ^^ expected struct `std::ops::Range`, found integer + | + = note: expected struct `std::ops::Range<{integer}>` + found type `{integer}` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision2.rs b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.rs similarity index 58% rename from src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision2.rs rename to src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.rs index 09f459c986..dedc85491b 100644 --- a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision2.rs +++ b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.rs @@ -1,10 +1,10 @@ +#![feature(half_open_range_patterns)] #![feature(exclusive_range_pattern)] fn main() { match [5..4, 99..105, 43..44] { [_, 99..] => {}, - //~^ ERROR `X..` range patterns are not supported - //~| ERROR pattern requires 2 elements but array has 3 + //~^ ERROR pattern requires 2 elements but array has 3 //~| ERROR mismatched types _ => {}, } diff --git a/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.stderr b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.stderr new file mode 100644 index 0000000000..4e0102c930 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision2.stderr @@ -0,0 +1,21 @@ +error[E0527]: pattern requires 2 elements but array has 3 + --> $DIR/exclusive_range_pattern_syntax_collision2.rs:6:9 + | +LL | [_, 99..] => {}, + | ^^^^^^^^^ expected 3 elements + +error[E0308]: mismatched types + --> $DIR/exclusive_range_pattern_syntax_collision2.rs:6:13 + | +LL | match [5..4, 99..105, 43..44] { + | ----------------------- this expression has type `[std::ops::Range<{integer}>; 3]` +LL | [_, 99..] => {}, + | ^^ expected struct `std::ops::Range`, found integer + | + = note: expected struct `std::ops::Range<{integer}>` + found type `{integer}` + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0308, E0527. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision3.rs b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.rs similarity index 74% rename from src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision3.rs rename to src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.rs index 95e58b1d48..6a9b562cc3 100644 --- a/src/test/ui/exclusive-range/exclusive_range_pattern_syntax_collision3.rs +++ b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.rs @@ -1,9 +1,10 @@ +#![feature(half_open_range_patterns)] #![feature(exclusive_range_pattern)] fn main() { match [5..4, 99..105, 43..44] { [..9, 99..100, _] => {}, - //~^ ERROR `..X` range patterns are not supported + //~^ ERROR mismatched types //~| ERROR mismatched types //~| ERROR mismatched types _ => {}, diff --git a/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.stderr b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.stderr new file mode 100644 index 0000000000..665eef2fcb --- /dev/null +++ b/src/test/ui/half-open-range-patterns/exclusive_range_pattern_syntax_collision3.stderr @@ -0,0 +1,40 @@ +error[E0308]: mismatched types + --> $DIR/exclusive_range_pattern_syntax_collision3.rs:6:12 + | +LL | match [5..4, 99..105, 43..44] { + | ----------------------- this expression has type `[std::ops::Range<{integer}>; 3]` +LL | [..9, 99..100, _] => {}, + | ^ expected struct `std::ops::Range`, found integer + | + = note: expected struct `std::ops::Range<{integer}>` + found type `{integer}` + +error[E0308]: mismatched types + --> $DIR/exclusive_range_pattern_syntax_collision3.rs:6:15 + | +LL | match [5..4, 99..105, 43..44] { + | ----------------------- this expression has type `[std::ops::Range<{integer}>; 3]` +LL | [..9, 99..100, _] => {}, + | ^^ --- this is of type `{integer}` + | | + | expected struct `std::ops::Range`, found integer + | + = note: expected struct `std::ops::Range<{integer}>` + found type `{integer}` + +error[E0308]: mismatched types + --> $DIR/exclusive_range_pattern_syntax_collision3.rs:6:19 + | +LL | match [5..4, 99..105, 43..44] { + | ----------------------- this expression has type `[std::ops::Range<{integer}>; 3]` +LL | [..9, 99..100, _] => {}, + | -- ^^^ expected struct `std::ops::Range`, found integer + | | + | this is of type `{integer}` + | + = note: expected struct `std::ops::Range<{integer}>` + found type `{integer}` + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/half-open-range-patterns/feature-gate-half-open-range-patterns.rs b/src/test/ui/half-open-range-patterns/feature-gate-half-open-range-patterns.rs new file mode 100644 index 0000000000..1733012b9c --- /dev/null +++ b/src/test/ui/half-open-range-patterns/feature-gate-half-open-range-patterns.rs @@ -0,0 +1,22 @@ +#![feature(exclusive_range_pattern)] + +fn main() {} + +#[cfg(FALSE)] +fn foo() { + if let ..=5 = 0 {} + //~^ ERROR half-open range patterns are unstable + if let ...5 = 0 {} + //~^ ERROR half-open range patterns are unstable + //~| ERROR range-to patterns with `...` are not allowed + if let ..5 = 0 {} + //~^ ERROR half-open range patterns are unstable + if let 5.. = 0 {} + //~^ ERROR half-open range patterns are unstable + if let 5..= = 0 {} + //~^ ERROR half-open range patterns are unstable + //~| ERROR inclusive range with no end + if let 5... = 0 {} + //~^ ERROR half-open range patterns are unstable + //~| ERROR inclusive range with no end +} diff --git a/src/test/ui/half-open-range-patterns/feature-gate-half-open-range-patterns.stderr b/src/test/ui/half-open-range-patterns/feature-gate-half-open-range-patterns.stderr new file mode 100644 index 0000000000..99db339cf7 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/feature-gate-half-open-range-patterns.stderr @@ -0,0 +1,80 @@ +error: range-to patterns with `...` are not allowed + --> $DIR/feature-gate-half-open-range-patterns.rs:9:12 + | +LL | if let ...5 = 0 {} + | ^^^ help: use `..=` instead + +error[E0586]: inclusive range with no end + --> $DIR/feature-gate-half-open-range-patterns.rs:16:13 + | +LL | if let 5..= = 0 {} + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error[E0586]: inclusive range with no end + --> $DIR/feature-gate-half-open-range-patterns.rs:19:13 + | +LL | if let 5... = 0 {} + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error[E0658]: half-open range patterns are unstable + --> $DIR/feature-gate-half-open-range-patterns.rs:7:12 + | +LL | if let ..=5 = 0 {} + | ^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/67264 + = help: add `#![feature(half_open_range_patterns)]` to the crate attributes to enable + +error[E0658]: half-open range patterns are unstable + --> $DIR/feature-gate-half-open-range-patterns.rs:9:12 + | +LL | if let ...5 = 0 {} + | ^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/67264 + = help: add `#![feature(half_open_range_patterns)]` to the crate attributes to enable + +error[E0658]: half-open range patterns are unstable + --> $DIR/feature-gate-half-open-range-patterns.rs:12:12 + | +LL | if let ..5 = 0 {} + | ^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/67264 + = help: add `#![feature(half_open_range_patterns)]` to the crate attributes to enable + +error[E0658]: half-open range patterns are unstable + --> $DIR/feature-gate-half-open-range-patterns.rs:14:12 + | +LL | if let 5.. = 0 {} + | ^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/67264 + = help: add `#![feature(half_open_range_patterns)]` to the crate attributes to enable + +error[E0658]: half-open range patterns are unstable + --> $DIR/feature-gate-half-open-range-patterns.rs:16:12 + | +LL | if let 5..= = 0 {} + | ^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/67264 + = help: add `#![feature(half_open_range_patterns)]` to the crate attributes to enable + +error[E0658]: half-open range patterns are unstable + --> $DIR/feature-gate-half-open-range-patterns.rs:19:12 + | +LL | if let 5... = 0 {} + | ^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/67264 + = help: add `#![feature(half_open_range_patterns)]` to the crate attributes to enable + +error: aborting due to 9 previous errors + +Some errors have detailed explanations: E0586, E0658. +For more information about an error, try `rustc --explain E0586`. diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-bad-types.rs b/src/test/ui/half-open-range-patterns/half-open-range-pats-bad-types.rs new file mode 100644 index 0000000000..7cddf5f652 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-bad-types.rs @@ -0,0 +1,8 @@ +#![feature(half_open_range_patterns)] +#![feature(exclusive_range_pattern)] + +fn main() { + let "a".. = "a"; //~ ERROR only char and numeric types are allowed in range patterns + let .."a" = "a"; //~ ERROR only char and numeric types are allowed in range patterns + let ..="a" = "a"; //~ ERROR only char and numeric types are allowed in range patterns +} diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-bad-types.stderr b/src/test/ui/half-open-range-patterns/half-open-range-pats-bad-types.stderr new file mode 100644 index 0000000000..68ca363715 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-bad-types.stderr @@ -0,0 +1,21 @@ +error[E0029]: only char and numeric types are allowed in range patterns + --> $DIR/half-open-range-pats-bad-types.rs:5:9 + | +LL | let "a".. = "a"; + | ^^^ this is of type `&'static str` but it should be `char` or numeric + +error[E0029]: only char and numeric types are allowed in range patterns + --> $DIR/half-open-range-pats-bad-types.rs:6:11 + | +LL | let .."a" = "a"; + | ^^^ this is of type `&'static str` but it should be `char` or numeric + +error[E0029]: only char and numeric types are allowed in range patterns + --> $DIR/half-open-range-pats-bad-types.rs:7:12 + | +LL | let ..="a" = "a"; + | ^^^ this is of type `&'static str` but it should be `char` or numeric + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0029`. diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.rs b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.rs new file mode 100644 index 0000000000..b135891d0b --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.rs @@ -0,0 +1,168 @@ +// Test various non-exhaustive matches for `X..`, `..=X` and `..X` ranges. + +#![feature(half_open_range_patterns)] +#![feature(exclusive_range_pattern)] +#![allow(illegal_floating_point_literal_pattern)] + +fn main() {} + +macro_rules! m { + ($s:expr, $($t:tt)+) => { + match $s { $($t)+ => {} } + } +} + +fn floats() { + m!(0f32, core::f32::NEG_INFINITY..); //~ ERROR non-exhaustive patterns: `_` not covered + m!(0f32, ..core::f32::INFINITY); //~ ERROR non-exhaustive patterns: `_` not covered +} + +fn khar() { + const ALMOST_MAX: char = '\u{10fffe}'; + const ALMOST_MIN: char = '\u{1}'; + const VAL: char = 'a'; + const VAL_1: char = 'b'; + const VAL_2: char = 'c'; + m!('a', ..core::char::MAX); //~ ERROR non-exhaustive patterns + m!('a', ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!('a', ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!('a', ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!('a', ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!('a', ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns +} + +mod unsigned { + fn u8() { + const ALMOST_MAX: u8 = core::u8::MAX - 1; + const ALMOST_MIN: u8 = core::u8::MIN + 1; + const VAL: u8 = 42; + const VAL_1: u8 = VAL + 1; + const VAL_2: u8 = VAL + 2; + m!(0, ..core::u8::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } + fn u16() { + const ALMOST_MAX: u16 = core::u16::MAX - 1; + const ALMOST_MIN: u16 = core::u16::MIN + 1; + const VAL: u16 = 42; + const VAL_1: u16 = VAL + 1; + const VAL_2: u16 = VAL + 2; + m!(0, ..core::u16::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } + fn u32() { + const ALMOST_MAX: u32 = core::u32::MAX - 1; + const ALMOST_MIN: u32 = core::u32::MIN + 1; + const VAL: u32 = 42; + const VAL_1: u32 = VAL + 1; + const VAL_2: u32 = VAL + 2; + m!(0, ..core::u32::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } + fn u64() { + const ALMOST_MAX: u64 = core::u64::MAX - 1; + const ALMOST_MIN: u64 = core::u64::MIN + 1; + const VAL: u64 = 42; + const VAL_1: u64 = VAL + 1; + const VAL_2: u64 = VAL + 2; + m!(0, ..core::u64::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } + fn u128() { + const ALMOST_MAX: u128 = core::u128::MAX - 1; + const ALMOST_MIN: u128 = core::u128::MIN + 1; + const VAL: u128 = 42; + const VAL_1: u128 = VAL + 1; + const VAL_2: u128 = VAL + 2; + m!(0, ..core::u128::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } +} + +mod signed { + fn i8() { + const ALMOST_MAX: i8 = core::i8::MAX - 1; + const ALMOST_MIN: i8 = core::i8::MIN + 1; + const VAL: i8 = 42; + const VAL_1: i8 = VAL + 1; + const VAL_2: i8 = VAL + 2; + m!(0, ..core::i8::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } + fn i16() { + const ALMOST_MAX: i16 = core::i16::MAX - 1; + const ALMOST_MIN: i16 = core::i16::MIN + 1; + const VAL: i16 = 42; + const VAL_1: i16 = VAL + 1; + const VAL_2: i16 = VAL + 2; + m!(0, ..core::i16::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } + fn i32() { + const ALMOST_MAX: i32 = core::i32::MAX - 1; + const ALMOST_MIN: i32 = core::i32::MIN + 1; + const VAL: i32 = 42; + const VAL_1: i32 = VAL + 1; + const VAL_2: i32 = VAL + 2; + m!(0, ..core::i32::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } + fn i64() { + const ALMOST_MAX: i64 = core::i64::MAX - 1; + const ALMOST_MIN: i64 = core::i64::MIN + 1; + const VAL: i64 = 42; + const VAL_1: i64 = VAL + 1; + const VAL_2: i64 = VAL + 2; + m!(0, ..core::i64::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } + fn i128() { + const ALMOST_MAX: i128 = core::i128::MAX - 1; + const ALMOST_MIN: i128 = core::i128::MIN + 1; + const VAL: i128 = 42; + const VAL_1: i128 = VAL + 1; + const VAL_2: i128 = VAL + 2; + m!(0, ..core::i128::MAX); //~ ERROR non-exhaustive patterns + m!(0, ..ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ALMOST_MIN..); //~ ERROR non-exhaustive patterns + m!(0, ..=ALMOST_MAX); //~ ERROR non-exhaustive patterns + m!(0, ..=VAL | VAL_2..); //~ ERROR non-exhaustive patterns + m!(0, ..VAL_1 | VAL_2..); //~ ERROR non-exhaustive patterns + } +} diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr new file mode 100644 index 0000000000..26d0cf9e9e --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr @@ -0,0 +1,547 @@ +error[E0004]: non-exhaustive patterns: `_` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:16:8 + | +LL | m!(0f32, core::f32::NEG_INFINITY..); + | ^^^^ pattern `_` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `_` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:17:8 + | +LL | m!(0f32, ..core::f32::INFINITY); + | ^^^^ pattern `_` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `'\u{10ffff}'` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:26:8 + | +LL | m!('a', ..core::char::MAX); + | ^^^ pattern `'\u{10ffff}'` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `'\u{10fffe}'..='\u{10ffff}'` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:27:8 + | +LL | m!('a', ..ALMOST_MAX); + | ^^^ pattern `'\u{10fffe}'..='\u{10ffff}'` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `'\u{0}'` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:28:8 + | +LL | m!('a', ALMOST_MIN..); + | ^^^ pattern `'\u{0}'` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `'\u{10ffff}'` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:29:8 + | +LL | m!('a', ..=ALMOST_MAX); + | ^^^ pattern `'\u{10ffff}'` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `'b'` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:30:8 + | +LL | m!('a', ..=VAL | VAL_2..); + | ^^^ pattern `'b'` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `'b'` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:31:8 + | +LL | m!('a', ..VAL_1 | VAL_2..); + | ^^^ pattern `'b'` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u8::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:41:12 + | +LL | m!(0, ..core::u8::MAX); + | ^ pattern `std::u8::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `254u8..=std::u8::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:42:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `254u8..=std::u8::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `0u8` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:43:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `0u8` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u8::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:44:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::u8::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u8` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:45:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43u8` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u8` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:46:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43u8` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u16::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:54:12 + | +LL | m!(0, ..core::u16::MAX); + | ^ pattern `std::u16::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `65534u16..=std::u16::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:55:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `65534u16..=std::u16::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `0u16` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:56:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `0u16` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u16::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:57:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::u16::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u16` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:58:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43u16` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u16` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:59:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43u16` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u32::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:67:12 + | +LL | m!(0, ..core::u32::MAX); + | ^ pattern `std::u32::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `4294967294u32..=std::u32::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:68:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `4294967294u32..=std::u32::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `0u32` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:69:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `0u32` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u32::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:70:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::u32::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u32` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:71:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43u32` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u32` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:72:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43u32` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u64::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:80:12 + | +LL | m!(0, ..core::u64::MAX); + | ^ pattern `std::u64::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `18446744073709551614u64..=std::u64::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:81:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `18446744073709551614u64..=std::u64::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `0u64` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:82:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `0u64` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u64::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:83:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::u64::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u64` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:84:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43u64` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u64` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:85:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43u64` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u128::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:93:12 + | +LL | m!(0, ..core::u128::MAX); + | ^ pattern `std::u128::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `340282366920938463463374607431768211454u128..=std::u128::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:94:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `340282366920938463463374607431768211454u128..=std::u128::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `0u128` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:95:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `0u128` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::u128::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:96:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::u128::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u128` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:97:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43u128` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43u128` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:98:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43u128` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i8::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:109:12 + | +LL | m!(0, ..core::i8::MAX); + | ^ pattern `std::i8::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `126i8..=std::i8::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:110:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `126i8..=std::i8::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i8::MIN` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:111:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `std::i8::MIN` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i8::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:112:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::i8::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i8` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:113:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43i8` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i8` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:114:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43i8` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i16::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:122:12 + | +LL | m!(0, ..core::i16::MAX); + | ^ pattern `std::i16::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `32766i16..=std::i16::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:123:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `32766i16..=std::i16::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i16::MIN` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:124:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `std::i16::MIN` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i16::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:125:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::i16::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i16` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:126:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43i16` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i16` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:127:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43i16` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i32::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:135:12 + | +LL | m!(0, ..core::i32::MAX); + | ^ pattern `std::i32::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `2147483646i32..=std::i32::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:136:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `2147483646i32..=std::i32::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i32::MIN` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:137:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `std::i32::MIN` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i32::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:138:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::i32::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i32` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:139:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43i32` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i32` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:140:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43i32` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i64::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:148:12 + | +LL | m!(0, ..core::i64::MAX); + | ^ pattern `std::i64::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `9223372036854775806i64..=std::i64::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:149:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `9223372036854775806i64..=std::i64::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i64::MIN` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:150:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `std::i64::MIN` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i64::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:151:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::i64::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i64` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:152:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43i64` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i64` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:153:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43i64` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i128::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:161:12 + | +LL | m!(0, ..core::i128::MAX); + | ^ pattern `std::i128::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `170141183460469231731687303715884105726i128..=std::i128::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:162:12 + | +LL | m!(0, ..ALMOST_MAX); + | ^ pattern `170141183460469231731687303715884105726i128..=std::i128::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i128::MIN` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:163:12 + | +LL | m!(0, ALMOST_MIN..); + | ^ pattern `std::i128::MIN` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `std::i128::MAX` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:164:12 + | +LL | m!(0, ..=ALMOST_MAX); + | ^ pattern `std::i128::MAX` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i128` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:165:12 + | +LL | m!(0, ..=VAL | VAL_2..); + | ^ pattern `43i128` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error[E0004]: non-exhaustive patterns: `43i128` not covered + --> $DIR/half-open-range-pats-exhaustive-fail.rs:166:12 + | +LL | m!(0, ..VAL_1 | VAL_2..); + | ^ pattern `43i128` not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + +error: aborting due to 68 previous errors + +For more information about this error, try `rustc --explain E0004`. diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-pass.rs b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-pass.rs new file mode 100644 index 0000000000..efac0df2a4 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-pass.rs @@ -0,0 +1,49 @@ +// check-pass + +// Test various exhaustive matches for `X..`, `..=X` and `..X` ranges. + +#![feature(half_open_range_patterns)] +#![feature(exclusive_range_pattern)] + +fn main() {} + +macro_rules! m { + ($s:expr, $($t:tt)+) => { + match $s { $($t)+ => {} } + } +} + +macro_rules! test_int { + ($s:expr, $min:path, $max:path) => { + m!($s, $min..); + m!($s, $min..5 | 5..); + m!($s, ..5 | 5..); + m!($s, ..=4 | 5..); + m!($s, ..=$max); + m!($s, ..$max | $max); + m!(($s, true), (..5, true) | (5.., true) | ($min.., false)); + } +} + +fn unsigned_int() { + test_int!(0u8, core::u8::MIN, core::u8::MAX); + test_int!(0u16, core::u16::MIN, core::u16::MAX); + test_int!(0u32, core::u32::MIN, core::u32::MAX); + test_int!(0u64, core::u64::MIN, core::u64::MAX); + test_int!(0u128, core::u128::MIN, core::u128::MAX); +} + +fn signed_int() { + test_int!(0i8, core::i8::MIN, core::i8::MAX); + test_int!(0i16, core::i16::MIN, core::i16::MAX); + test_int!(0i32, core::i32::MIN, core::i32::MAX); + test_int!(0i64, core::i64::MIN, core::i64::MAX); + test_int!(0i128, core::i128::MIN, core::i128::MAX); +} + +fn khar() { + m!('a', ..=core::char::MAX); + m!('a', '\u{0}'..); + m!('a', ..='\u{D7FF}' | '\u{E000}'..); + m!('a', ..'\u{D7FF}' | '\u{D7FF}' | '\u{E000}'..); +} diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-hair-lower-empty.rs b/src/test/ui/half-open-range-patterns/half-open-range-pats-hair-lower-empty.rs new file mode 100644 index 0000000000..904efda903 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-hair-lower-empty.rs @@ -0,0 +1,54 @@ +#![feature(half_open_range_patterns)] +#![feature(exclusive_range_pattern)] +#![allow(illegal_floating_point_literal_pattern)] + +macro_rules! m { + ($s:expr, $($t:tt)+) => { + match $s { $($t)+ => {} } + } +} + +fn main() { + m!(0, ..core::u8::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + m!(0, ..core::u16::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + m!(0, ..core::u32::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + m!(0, ..core::u64::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + m!(0, ..core::u128::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + + m!(0, ..core::i8::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + m!(0, ..core::i16::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + m!(0, ..core::i32::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + m!(0, ..core::i64::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + m!(0, ..core::i128::MIN); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + + m!(0f32, ..core::f32::NEG_INFINITY); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + m!(0f64, ..core::f64::NEG_INFINITY); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper + + m!('a', ..'\u{0}'); + //~^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper +} diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-hair-lower-empty.stderr b/src/test/ui/half-open-range-patterns/half-open-range-pats-hair-lower-empty.stderr new file mode 100644 index 0000000000..b536e1b554 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-hair-lower-empty.stderr @@ -0,0 +1,159 @@ +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:12:11 + | +LL | m!(0, ..core::u8::MIN); + | ^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:15:11 + | +LL | m!(0, ..core::u16::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:18:11 + | +LL | m!(0, ..core::u32::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:21:11 + | +LL | m!(0, ..core::u64::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:24:11 + | +LL | m!(0, ..core::u128::MIN); + | ^^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:28:11 + | +LL | m!(0, ..core::i8::MIN); + | ^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:31:11 + | +LL | m!(0, ..core::i16::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:34:11 + | +LL | m!(0, ..core::i32::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:37:11 + | +LL | m!(0, ..core::i64::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:40:11 + | +LL | m!(0, ..core::i128::MIN); + | ^^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:44:14 + | +LL | m!(0f32, ..core::f32::NEG_INFINITY); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:47:14 + | +LL | m!(0f64, ..core::f64::NEG_INFINITY); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:51:13 + | +LL | m!('a', ..'\u{0}'); + | ^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:12:11 + | +LL | m!(0, ..core::u8::MIN); + | ^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:15:11 + | +LL | m!(0, ..core::u16::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:18:11 + | +LL | m!(0, ..core::u32::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:21:11 + | +LL | m!(0, ..core::u64::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:24:11 + | +LL | m!(0, ..core::u128::MIN); + | ^^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:28:11 + | +LL | m!(0, ..core::i8::MIN); + | ^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:31:11 + | +LL | m!(0, ..core::i16::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:34:11 + | +LL | m!(0, ..core::i32::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:37:11 + | +LL | m!(0, ..core::i64::MIN); + | ^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:40:11 + | +LL | m!(0, ..core::i128::MIN); + | ^^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:44:14 + | +LL | m!(0f32, ..core::f32::NEG_INFINITY); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:47:14 + | +LL | m!(0f64, ..core::f64::NEG_INFINITY); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0579]: lower range bound must be less than upper + --> $DIR/half-open-range-pats-hair-lower-empty.rs:51:13 + | +LL | m!('a', ..'\u{0}'); + | ^^^^^^^^^ + +error: aborting due to 26 previous errors + +For more information about this error, try `rustc --explain E0579`. diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-dotdotdot-bad-syntax.rs b/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-dotdotdot-bad-syntax.rs new file mode 100644 index 0000000000..daed775cf7 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-dotdotdot-bad-syntax.rs @@ -0,0 +1,32 @@ +// Test that `...X` range-to patterns are syntactically invalid. +// +// See https://github.com/rust-lang/rust/pull/67258#issuecomment-565656155 +// for the reason why. To summarize, we might want to introduce `...expr` as +// an expression form for splatting (or "untupling") in an expression context. +// While there is no syntactic ambiguity with `...X` in a pattern context, +// there's a potential confusion factor here, and we would prefer to keep patterns +// and expressions in-sync. As such, we do not allow `...X` in patterns either. + +#![feature(half_open_range_patterns)] + +fn main() {} + +#[cfg(FALSE)] +fn syntax() { + match scrutinee { + ...X => {} //~ ERROR range-to patterns with `...` are not allowed + ...0 => {} //~ ERROR range-to patterns with `...` are not allowed + ...'a' => {} //~ ERROR range-to patterns with `...` are not allowed + ...0.0f32 => {} //~ ERROR range-to patterns with `...` are not allowed + } +} + +fn syntax2() { + macro_rules! mac { + ($e:expr) => { + let ...$e; //~ ERROR range-to patterns with `...` are not allowed + } + } + + mac!(0); +} diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-dotdotdot-bad-syntax.stderr b/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-dotdotdot-bad-syntax.stderr new file mode 100644 index 0000000000..ba2e7ea8b5 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-dotdotdot-bad-syntax.stderr @@ -0,0 +1,35 @@ +error: range-to patterns with `...` are not allowed + --> $DIR/half-open-range-pats-inclusive-dotdotdot-bad-syntax.rs:17:9 + | +LL | ...X => {} + | ^^^ help: use `..=` instead + +error: range-to patterns with `...` are not allowed + --> $DIR/half-open-range-pats-inclusive-dotdotdot-bad-syntax.rs:18:9 + | +LL | ...0 => {} + | ^^^ help: use `..=` instead + +error: range-to patterns with `...` are not allowed + --> $DIR/half-open-range-pats-inclusive-dotdotdot-bad-syntax.rs:19:9 + | +LL | ...'a' => {} + | ^^^ help: use `..=` instead + +error: range-to patterns with `...` are not allowed + --> $DIR/half-open-range-pats-inclusive-dotdotdot-bad-syntax.rs:20:9 + | +LL | ...0.0f32 => {} + | ^^^ help: use `..=` instead + +error: range-to patterns with `...` are not allowed + --> $DIR/half-open-range-pats-inclusive-dotdotdot-bad-syntax.rs:27:17 + | +LL | let ...$e; + | ^^^ help: use `..=` instead +... +LL | mac!(0); + | -------- in this macro invocation + +error: aborting due to 5 previous errors + diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-no-end.rs b/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-no-end.rs new file mode 100644 index 0000000000..9ace0c357b --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-no-end.rs @@ -0,0 +1,26 @@ +// Test `X...` and `X..=` range patterns not being allowed syntactically. +// FIXME(Centril): perhaps these should be semantic restrictions. + +#![feature(half_open_range_patterns)] + +fn main() {} + +#[cfg(FALSE)] +fn foo() { + if let 0... = 1 {} //~ ERROR inclusive range with no end + if let 0..= = 1 {} //~ ERROR inclusive range with no end + const X: u8 = 0; + if let X... = 1 {} //~ ERROR inclusive range with no end + if let X..= = 1 {} //~ ERROR inclusive range with no end +} + +fn bar() { + macro_rules! mac { + ($e:expr) => { + let $e...; //~ ERROR inclusive range with no end + let $e..=; //~ ERROR inclusive range with no end + } + } + + mac!(0); +} diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-no-end.stderr b/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-no-end.stderr new file mode 100644 index 0000000000..2bdb8ea576 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-inclusive-no-end.stderr @@ -0,0 +1,57 @@ +error[E0586]: inclusive range with no end + --> $DIR/half-open-range-pats-inclusive-no-end.rs:10:13 + | +LL | if let 0... = 1 {} + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error[E0586]: inclusive range with no end + --> $DIR/half-open-range-pats-inclusive-no-end.rs:11:13 + | +LL | if let 0..= = 1 {} + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error[E0586]: inclusive range with no end + --> $DIR/half-open-range-pats-inclusive-no-end.rs:13:13 + | +LL | if let X... = 1 {} + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error[E0586]: inclusive range with no end + --> $DIR/half-open-range-pats-inclusive-no-end.rs:14:13 + | +LL | if let X..= = 1 {} + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error[E0586]: inclusive range with no end + --> $DIR/half-open-range-pats-inclusive-no-end.rs:20:19 + | +LL | let $e...; + | ^^^ help: use `..` instead +... +LL | mac!(0); + | -------- in this macro invocation + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error[E0586]: inclusive range with no end + --> $DIR/half-open-range-pats-inclusive-no-end.rs:21:19 + | +LL | let $e..=; + | ^^^ help: use `..` instead +... +LL | mac!(0); + | -------- in this macro invocation + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error: aborting due to 6 previous errors + +For more information about this error, try `rustc --explain E0586`. diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-ref-ambiguous-interp.rs b/src/test/ui/half-open-range-patterns/half-open-range-pats-ref-ambiguous-interp.rs new file mode 100644 index 0000000000..f054bbea4e --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-ref-ambiguous-interp.rs @@ -0,0 +1,26 @@ +#![feature(half_open_range_patterns)] + +fn main() {} + +#[cfg(FALSE)] +fn syntax() { + match &0 { + &0.. | _ => {} + //~^ ERROR the range pattern here has ambiguous interpretation + &0..= | _ => {} + //~^ ERROR the range pattern here has ambiguous interpretation + //~| ERROR inclusive range with no end + &0... | _ => {} + //~^ ERROR inclusive range with no end + } + + match &0 { + &..0 | _ => {} + //~^ ERROR the range pattern here has ambiguous interpretation + &..=0 | _ => {} + //~^ ERROR the range pattern here has ambiguous interpretation + &...0 | _ => {} + //~^ ERROR the range pattern here has ambiguous interpretation + //~| ERROR range-to patterns with `...` are not allowed + } +} diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-ref-ambiguous-interp.stderr b/src/test/ui/half-open-range-patterns/half-open-range-pats-ref-ambiguous-interp.stderr new file mode 100644 index 0000000000..a5f7c39062 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-ref-ambiguous-interp.stderr @@ -0,0 +1,55 @@ +error: the range pattern here has ambiguous interpretation + --> $DIR/half-open-range-pats-ref-ambiguous-interp.rs:8:10 + | +LL | &0.. | _ => {} + | ^^^ help: add parentheses to clarify the precedence: `(0 ..)` + +error[E0586]: inclusive range with no end + --> $DIR/half-open-range-pats-ref-ambiguous-interp.rs:10:11 + | +LL | &0..= | _ => {} + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error: the range pattern here has ambiguous interpretation + --> $DIR/half-open-range-pats-ref-ambiguous-interp.rs:10:10 + | +LL | &0..= | _ => {} + | ^^^^ help: add parentheses to clarify the precedence: `(0 ..=)` + +error[E0586]: inclusive range with no end + --> $DIR/half-open-range-pats-ref-ambiguous-interp.rs:13:11 + | +LL | &0... | _ => {} + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error: the range pattern here has ambiguous interpretation + --> $DIR/half-open-range-pats-ref-ambiguous-interp.rs:18:10 + | +LL | &..0 | _ => {} + | ^^^ help: add parentheses to clarify the precedence: `(..0)` + +error: the range pattern here has ambiguous interpretation + --> $DIR/half-open-range-pats-ref-ambiguous-interp.rs:20:10 + | +LL | &..=0 | _ => {} + | ^^^^ help: add parentheses to clarify the precedence: `(..=0)` + +error: range-to patterns with `...` are not allowed + --> $DIR/half-open-range-pats-ref-ambiguous-interp.rs:22:10 + | +LL | &...0 | _ => {} + | ^^^ help: use `..=` instead + +error: the range pattern here has ambiguous interpretation + --> $DIR/half-open-range-pats-ref-ambiguous-interp.rs:22:10 + | +LL | &...0 | _ => {} + | ^^^^ help: add parentheses to clarify the precedence: `(..=0)` + +error: aborting due to 8 previous errors + +For more information about this error, try `rustc --explain E0586`. diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-semantics.rs b/src/test/ui/half-open-range-patterns/half-open-range-pats-semantics.rs new file mode 100644 index 0000000000..416c59af3f --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-semantics.rs @@ -0,0 +1,160 @@ +// run-pass + +// Test half-open range patterns against their expression equivalents +// via `.contains(...)` and make sure the dynamic semantics match. + +#![feature(half_open_range_patterns)] +#![feature(exclusive_range_pattern)] +#![allow(illegal_floating_point_literal_pattern)] +#![allow(unreachable_patterns)] + +macro_rules! yes { + ($scrutinee:expr, $($t:tt)+) => { + { + let m = match $scrutinee { $($t)+ => true, _ => false, }; + let c = ($($t)+).contains(&$scrutinee); + assert_eq!(m, c); + m + } + } +} + +fn range_to_inclusive() { + // `..=X` (`RangeToInclusive`-equivalent): + //--------------------------------------- + + // u8; `..=X` + assert!(yes!(core::u8::MIN, ..=core::u8::MIN)); + assert!(yes!(core::u8::MIN, ..=5)); + assert!(yes!(5u8, ..=5)); + assert!(!yes!(6u8, ..=5)); + + // i16; `..=X` + assert!(yes!(core::i16::MIN, ..=core::i16::MIN)); + assert!(yes!(core::i16::MIN, ..=0)); + assert!(yes!(core::i16::MIN, ..=-5)); + assert!(yes!(-5, ..=-5)); + assert!(!yes!(-4, ..=-5)); + + // char; `..=X` + assert!(yes!('\u{0}', ..='\u{0}')); + assert!(yes!('\u{0}', ..='a')); + assert!(yes!('a', ..='a')); + assert!(!yes!('b', ..='a')); + + // f32; `..=X` + assert!(yes!(core::f32::NEG_INFINITY, ..=core::f32::NEG_INFINITY)); + assert!(yes!(core::f32::NEG_INFINITY, ..=1.0f32)); + assert!(yes!(1.5f32, ..=1.5f32)); + assert!(!yes!(1.6f32, ..=-1.5f32)); + + // f64; `..=X` + assert!(yes!(core::f64::NEG_INFINITY, ..=core::f64::NEG_INFINITY)); + assert!(yes!(core::f64::NEG_INFINITY, ..=1.0f64)); + assert!(yes!(1.5f64, ..=1.5f64)); + assert!(!yes!(1.6f64, ..=-1.5f64)); +} + +fn range_to() { + // `..X` (`RangeTo`-equivalent): + //----------------------------- + + // u8; `..X` + assert!(yes!(0u8, ..1)); + assert!(yes!(0u8, ..5)); + assert!(!yes!(5u8, ..5)); + assert!(!yes!(6u8, ..5)); + + // u8; `..X` + const NU8: u8 = core::u8::MIN + 1; + assert!(yes!(core::u8::MIN, ..NU8)); + assert!(yes!(0u8, ..5)); + assert!(!yes!(5u8, ..5)); + assert!(!yes!(6u8, ..5)); + + // i16; `..X` + const NI16: i16 = core::i16::MIN + 1; + assert!(yes!(core::i16::MIN, ..NI16)); + assert!(yes!(core::i16::MIN, ..5)); + assert!(yes!(-6, ..-5)); + assert!(!yes!(-5, ..-5)); + + // char; `..X` + assert!(yes!('\u{0}', ..'\u{1}')); + assert!(yes!('\u{0}', ..'a')); + assert!(yes!('a', ..'b')); + assert!(!yes!('a', ..'a')); + assert!(!yes!('b', ..'a')); + + // f32; `..X` + assert!(yes!(core::f32::NEG_INFINITY, ..1.0f32)); + assert!(!yes!(1.5f32, ..1.5f32)); + const E32: f32 = 1.5f32 + core::f32::EPSILON; + assert!(yes!(1.5f32, ..E32)); + assert!(!yes!(1.6f32, ..1.5f32)); + + // f64; `..X` + assert!(yes!(core::f64::NEG_INFINITY, ..1.0f64)); + assert!(!yes!(1.5f64, ..1.5f64)); + const E64: f64 = 1.5f64 + core::f64::EPSILON; + assert!(yes!(1.5f64, ..E64)); + assert!(!yes!(1.6f64, ..1.5f64)); +} + +fn range_from() { + // `X..` (`RangeFrom`-equivalent): + //-------------------------------- + + // u8; `X..` + assert!(yes!(core::u8::MIN, core::u8::MIN..)); + assert!(yes!(core::u8::MAX, core::u8::MIN..)); + assert!(!yes!(core::u8::MIN, 1..)); + assert!(!yes!(4, 5..)); + assert!(yes!(5, 5..)); + assert!(yes!(6, 5..)); + assert!(yes!(core::u8::MAX, core::u8::MAX..)); + + // i16; `X..` + assert!(yes!(core::i16::MIN, core::i16::MIN..)); + assert!(yes!(core::i16::MAX, core::i16::MIN..)); + const NI16: i16 = core::i16::MIN + 1; + assert!(!yes!(core::i16::MIN, NI16..)); + assert!(!yes!(-4, 5..)); + assert!(yes!(-4, -4..)); + assert!(yes!(-3, -4..)); + assert!(yes!(core::i16::MAX, core::i16::MAX..)); + + // char; `X..` + assert!(yes!('\u{0}', '\u{0}'..)); + assert!(yes!(core::char::MAX, '\u{0}'..)); + assert!(yes!('a', 'a'..)); + assert!(yes!('b', 'a'..)); + assert!(!yes!('a', 'b'..)); + assert!(yes!(core::char::MAX, core::char::MAX..)); + + // f32; `X..` + assert!(yes!(core::f32::NEG_INFINITY, core::f32::NEG_INFINITY..)); + assert!(yes!(core::f32::INFINITY, core::f32::NEG_INFINITY..)); + assert!(!yes!(core::f32::NEG_INFINITY, 1.0f32..)); + assert!(yes!(core::f32::INFINITY, 1.0f32..)); + assert!(!yes!(1.0f32 - core::f32::EPSILON, 1.0f32..)); + assert!(yes!(1.0f32, 1.0f32..)); + assert!(yes!(core::f32::INFINITY, 1.0f32..)); + assert!(yes!(core::f32::INFINITY, core::f32::INFINITY..)); + + // f64; `X..` + assert!(yes!(core::f64::NEG_INFINITY, core::f64::NEG_INFINITY..)); + assert!(yes!(core::f64::INFINITY, core::f64::NEG_INFINITY..)); + assert!(!yes!(core::f64::NEG_INFINITY, 1.0f64..)); + assert!(yes!(core::f64::INFINITY, 1.0f64..)); + assert!(!yes!(1.0f64 - core::f64::EPSILON, 1.0f64..)); + assert!(yes!(1.0f64, 1.0f64..)); + assert!(yes!(core::f64::INFINITY, 1.0f64..)); + assert!(yes!(core::f64::INFINITY, core::f64::INFINITY..)); +} + +fn main() { + range_to_inclusive(); + range_to(); + range_from(); +} diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-syntactic-pass.rs b/src/test/ui/half-open-range-patterns/half-open-range-pats-syntactic-pass.rs new file mode 100644 index 0000000000..8bb98d3b5c --- /dev/null +++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-syntactic-pass.rs @@ -0,0 +1,30 @@ +// check-pass + +// Test the parsing of half-open ranges. + +#![feature(exclusive_range_pattern)] +#![feature(half_open_range_patterns)] + +fn main() {} + +#[cfg(FALSE)] +fn syntax() { + match scrutinee { + X.. | 0.. | 'a'.. | 0.0f32.. => {} + ..=X | ..X => {} + ..=0 | ..0 => {} + ..='a' | ..'a' => {} + ..=0.0f32 | ..0.0f32 => {} + } +} + +fn syntax2() { + macro_rules! mac { + ($e:expr) => { + match 0u8 { ..$e => {}, _ => {} } + match 0u8 { ..=$e => {}, _ => {} } + match 0u8 { $e.. => {}, _ => {} } + } + } + mac!(42u8); +} diff --git a/src/test/ui/half-open-range-patterns/pat-tuple-4.rs b/src/test/ui/half-open-range-patterns/pat-tuple-4.rs new file mode 100644 index 0000000000..bd79536820 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/pat-tuple-4.rs @@ -0,0 +1,13 @@ +// check-pass + +#![feature(half_open_range_patterns)] +#![feature(exclusive_range_pattern)] + +fn main() { + const PAT: u8 = 1; + + match 0 { + (.. PAT) => {} + _ => {} + } +} diff --git a/src/test/ui/half-open-range-patterns/pat-tuple-5.rs b/src/test/ui/half-open-range-patterns/pat-tuple-5.rs new file mode 100644 index 0000000000..613d907cfe --- /dev/null +++ b/src/test/ui/half-open-range-patterns/pat-tuple-5.rs @@ -0,0 +1,10 @@ +#![feature(half_open_range_patterns)] +#![feature(exclusive_range_pattern)] + +fn main() { + const PAT: u8 = 1; + + match (0, 1) { + (PAT ..) => {} //~ ERROR mismatched types + } +} diff --git a/src/test/ui/half-open-range-patterns/pat-tuple-5.stderr b/src/test/ui/half-open-range-patterns/pat-tuple-5.stderr new file mode 100644 index 0000000000..307ad711b7 --- /dev/null +++ b/src/test/ui/half-open-range-patterns/pat-tuple-5.stderr @@ -0,0 +1,14 @@ +error[E0308]: mismatched types + --> $DIR/pat-tuple-5.rs:8:10 + | +LL | match (0, 1) { + | ------ this expression has type `({integer}, {integer})` +LL | (PAT ..) => {} + | ^^^ expected tuple, found `u8` + | + = note: expected tuple `({integer}, {integer})` + found type `u8` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/hrtb/hrtb-perfect-forwarding.nll.stderr b/src/test/ui/hrtb/hrtb-perfect-forwarding.nll.stderr index f1647d3d2e..303c0cc645 100644 --- a/src/test/ui/hrtb/hrtb-perfect-forwarding.nll.stderr +++ b/src/test/ui/hrtb/hrtb-perfect-forwarding.nll.stderr @@ -39,17 +39,12 @@ LL | | // Not OK -- The forwarding impl for `Foo` requires that `Bar` also ... | LL | | foo_hrtb_bar_not(&mut t); | | ------------------------ recursive call site +LL | | LL | | } | |_^ cannot return without recursing | = help: a `loop` may express intention better if this is on purpose -error: higher-ranked subtype error - --> $DIR/hrtb-perfect-forwarding.rs:46:5 - | -LL | foo_hrtb_bar_not(&mut t); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - error: lifetime may not live long enough --> $DIR/hrtb-perfect-forwarding.rs:46:5 | @@ -61,8 +56,14 @@ LL | foo_hrtb_bar_not(&mut t); | = help: consider replacing `'b` with `'static` +error: higher-ranked subtype error + --> $DIR/hrtb-perfect-forwarding.rs:46:5 + | +LL | foo_hrtb_bar_not(&mut t); + | ^^^^^^^^^^^^^^^^^^^^^^^^ + warning: function cannot return without recursing - --> $DIR/hrtb-perfect-forwarding.rs:49:1 + --> $DIR/hrtb-perfect-forwarding.rs:50:1 | LL | / fn foo_hrtb_bar_hrtb<T>(mut t: T) LL | | where T : for<'a> Foo<&'a isize> + for<'b> Bar<&'b isize> diff --git a/src/test/ui/hrtb/hrtb-perfect-forwarding.rs b/src/test/ui/hrtb/hrtb-perfect-forwarding.rs index 63db695f7e..0303a764c1 100644 --- a/src/test/ui/hrtb/hrtb-perfect-forwarding.rs +++ b/src/test/ui/hrtb/hrtb-perfect-forwarding.rs @@ -44,6 +44,7 @@ fn foo_hrtb_bar_not<'b,T>(mut t: T) // isize>`, we require `T : for<'a> Bar<&'a isize>`, but the where // clause only specifies `T : Bar<&'b isize>`. foo_hrtb_bar_not(&mut t); //~ ERROR mismatched types + //~| ERROR mismatched types } fn foo_hrtb_bar_hrtb<T>(mut t: T) diff --git a/src/test/ui/hrtb/hrtb-perfect-forwarding.stderr b/src/test/ui/hrtb/hrtb-perfect-forwarding.stderr index 9bc8cd67a8..1ceb0c99e9 100644 --- a/src/test/ui/hrtb/hrtb-perfect-forwarding.stderr +++ b/src/test/ui/hrtb/hrtb-perfect-forwarding.stderr @@ -7,6 +7,15 @@ LL | foo_hrtb_bar_not(&mut t); = note: expected type `Bar<&'a isize>` found type `Bar<&'b isize>` -error: aborting due to previous error +error[E0308]: mismatched types + --> $DIR/hrtb-perfect-forwarding.rs:46:5 + | +LL | foo_hrtb_bar_not(&mut t); + | ^^^^^^^^^^^^^^^^ one type is more general than the other + | + = note: expected type `Bar<&'a isize>` + found type `Bar<&'b isize>` + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/hrtb/issue-30786.nll.stderr b/src/test/ui/hrtb/issue-30786.nll.stderr index cd1272da2a..c736c5479f 100644 --- a/src/test/ui/hrtb/issue-30786.nll.stderr +++ b/src/test/ui/hrtb/issue-30786.nll.stderr @@ -11,10 +11,46 @@ LL | let filter = map.filter(|x: &_| true); | ^^^^^^^^^^^^^^^^^^^^^^^^ error: higher-ranked subtype error - --> $DIR/issue-30786.rs:116:17 + --> $DIR/issue-30786.rs:114:18 + | +LL | let filter = map.filter(|x: &_| true); + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: higher-ranked subtype error + --> $DIR/issue-30786.rs:114:18 + | +LL | let filter = map.filter(|x: &_| true); + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: higher-ranked subtype error + --> $DIR/issue-30786.rs:114:18 + | +LL | let filter = map.filter(|x: &_| true); + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: higher-ranked subtype error + --> $DIR/issue-30786.rs:119:17 + | +LL | let count = filter.count(); // Assert that we still have a valid stream. + | ^^^^^^^^^^^^^^ + +error: higher-ranked subtype error + --> $DIR/issue-30786.rs:119:17 + | +LL | let count = filter.count(); // Assert that we still have a valid stream. + | ^^^^^^^^^^^^^^ + +error: higher-ranked subtype error + --> $DIR/issue-30786.rs:119:17 + | +LL | let count = filter.count(); // Assert that we still have a valid stream. + | ^^^^^^^^^^^^^^ + +error: higher-ranked subtype error + --> $DIR/issue-30786.rs:119:17 | LL | let count = filter.count(); // Assert that we still have a valid stream. | ^^^^^^^^^^^^^^ -error: aborting due to 3 previous errors +error: aborting due to 9 previous errors diff --git a/src/test/ui/hrtb/issue-30786.rs b/src/test/ui/hrtb/issue-30786.rs index 34d6b19f60..c656f84306 100644 --- a/src/test/ui/hrtb/issue-30786.rs +++ b/src/test/ui/hrtb/issue-30786.rs @@ -113,7 +113,12 @@ fn main() { //[migrate]~| NOTE implementation of `Stream` is not general enough let filter = map.filter(|x: &_| true); //[nll]~^ ERROR higher-ranked subtype error + //[nll]~| ERROR higher-ranked subtype error + //[nll]~| ERROR higher-ranked subtype error + //[nll]~| ERROR higher-ranked subtype error let count = filter.count(); // Assert that we still have a valid stream. //[nll]~^ ERROR higher-ranked subtype error - + //[nll]~| ERROR higher-ranked subtype error + //[nll]~| ERROR higher-ranked subtype error + //[nll]~| ERROR higher-ranked subtype error } diff --git a/src/test/ui/huge-array-simple-32.rs b/src/test/ui/huge-array-simple-32.rs index 9f98f4d753..3e574dfa07 100644 --- a/src/test/ui/huge-array-simple-32.rs +++ b/src/test/ui/huge-array-simple-32.rs @@ -1,4 +1,5 @@ // ignore-64bit +// build-fail // FIXME https://github.com/rust-lang/rust/issues/59774 // normalize-stderr-test "thread.*panicked.*Metadata module not compiled.*\n" -> "" diff --git a/src/test/ui/huge-array-simple-32.stderr b/src/test/ui/huge-array-simple-32.stderr index 16372b0275..d734a9689e 100644 --- a/src/test/ui/huge-array-simple-32.stderr +++ b/src/test/ui/huge-array-simple-32.stderr @@ -1,5 +1,5 @@ error: the type `[u8; 2147516416]` is too big for the current architecture - --> $DIR/huge-array-simple-32.rs:9:9 + --> $DIR/huge-array-simple-32.rs:10:9 | LL | let _fat: [u8; (1<<31)+(1<<15)] = | ^^^^ diff --git a/src/test/ui/huge-array-simple-64.rs b/src/test/ui/huge-array-simple-64.rs index f72d69ee74..d4c9330128 100644 --- a/src/test/ui/huge-array-simple-64.rs +++ b/src/test/ui/huge-array-simple-64.rs @@ -1,3 +1,4 @@ +// build-fail // ignore-32bit // FIXME https://github.com/rust-lang/rust/issues/59774 diff --git a/src/test/ui/huge-array-simple-64.stderr b/src/test/ui/huge-array-simple-64.stderr index 6ed89269f0..791baa8468 100644 --- a/src/test/ui/huge-array-simple-64.stderr +++ b/src/test/ui/huge-array-simple-64.stderr @@ -1,5 +1,5 @@ error: the type `[u8; 2305843011361177600]` is too big for the current architecture - --> $DIR/huge-array-simple-64.rs:9:9 + --> $DIR/huge-array-simple-64.rs:10:9 | LL | let _fat: [u8; (1<<61)+(1<<31)] = | ^^^^ diff --git a/src/test/ui/huge-array.rs b/src/test/ui/huge-array.rs index 1ecf012e04..846380586a 100644 --- a/src/test/ui/huge-array.rs +++ b/src/test/ui/huge-array.rs @@ -1,4 +1,6 @@ // FIXME https://github.com/rust-lang/rust/issues/59774 + +// build-fail // normalize-stderr-test "thread.*panicked.*Metadata module not compiled.*\n" -> "" // normalize-stderr-test "note:.*RUST_BACKTRACE=1.*\n" -> "" diff --git a/src/test/ui/huge-array.stderr b/src/test/ui/huge-array.stderr index 823d974f42..23d9e87ae0 100644 --- a/src/test/ui/huge-array.stderr +++ b/src/test/ui/huge-array.stderr @@ -1,5 +1,5 @@ error: the type `[[u8; 1518599999]; 1518600000]` is too big for the current architecture - --> $DIR/huge-array.rs:6:9 + --> $DIR/huge-array.rs:8:9 | LL | let s: [T; 1518600000] = [t; 1518600000]; | ^ diff --git a/src/test/ui/huge-enum.rs b/src/test/ui/huge-enum.rs index 98d0ba6e15..8a713c3a26 100644 --- a/src/test/ui/huge-enum.rs +++ b/src/test/ui/huge-enum.rs @@ -1,3 +1,4 @@ +// build-fail // normalize-stderr-test "std::option::Option<\[u32; \d+\]>" -> "TYPE" // normalize-stderr-test "\[u32; \d+\]" -> "TYPE" diff --git a/src/test/ui/huge-enum.stderr b/src/test/ui/huge-enum.stderr index 1f16c81a8f..8398c511b9 100644 --- a/src/test/ui/huge-enum.stderr +++ b/src/test/ui/huge-enum.stderr @@ -1,5 +1,5 @@ error: the type `TYPE` is too big for the current architecture - --> $DIR/huge-enum.rs:15:9 + --> $DIR/huge-enum.rs:16:9 | LL | let big: BIG = None; | ^^^ diff --git a/src/test/ui/huge-struct.rs b/src/test/ui/huge-struct.rs index e50ca5f54d..71169a1104 100644 --- a/src/test/ui/huge-struct.rs +++ b/src/test/ui/huge-struct.rs @@ -1,3 +1,4 @@ +// build-fail // normalize-stderr-test "S32" -> "SXX" // normalize-stderr-test "S1M" -> "SXX" // error-pattern: too big for the current diff --git a/src/test/ui/huge-struct.stderr b/src/test/ui/huge-struct.stderr index 5c2140df48..72e32a8593 100644 --- a/src/test/ui/huge-struct.stderr +++ b/src/test/ui/huge-struct.stderr @@ -1,5 +1,5 @@ error: the type `SXX<SXX<SXX<u32>>>` is too big for the current architecture - --> $DIR/huge-struct.rs:49:9 + --> $DIR/huge-struct.rs:50:9 | LL | let fat: Option<SXX<SXX<SXX<u32>>>> = None; | ^^^ diff --git a/src/test/ui/hygiene/globs.stderr b/src/test/ui/hygiene/globs.stderr index 4b382a2b20..f9fbf295ae 100644 --- a/src/test/ui/hygiene/globs.stderr +++ b/src/test/ui/hygiene/globs.stderr @@ -4,11 +4,7 @@ error[E0425]: cannot find function `f` in this scope LL | f(); | ^ not found in this scope | -help: possible candidates are found in other modules, you can import them into scope - | -LL | use foo::f; - | -LL | use foo::f; +help: possible candidate is found in another module, you can import it into scope | LL | use foo::f; | @@ -32,11 +28,8 @@ LL | use bar::g; | LL | use foo::test2::test::g; | -LL | use foo::test2::test::g; - | LL | use foo::test::g; | - and 2 other candidates error[E0425]: cannot find function `f` in this scope --> $DIR/globs.rs:61:12 @@ -46,6 +39,9 @@ LL | n!(f); ... LL | n!(f); | ^ not found in this scope + | + = note: possible candidate is found in another module, you can import it into scope: + foo::f error[E0425]: cannot find function `f` in this scope --> $DIR/globs.rs:65:17 @@ -55,6 +51,9 @@ LL | n!(f); ... LL | f | ^ not found in this scope + | + = note: possible candidate is found in another module, you can import it into scope: + foo::f error: aborting due to 4 previous errors diff --git a/src/test/ui/hygiene/no_implicit_prelude.stderr b/src/test/ui/hygiene/no_implicit_prelude.stderr index 736369dab8..5d75f5034b 100644 --- a/src/test/ui/hygiene/no_implicit_prelude.stderr +++ b/src/test/ui/hygiene/no_implicit_prelude.stderr @@ -15,7 +15,7 @@ LL | fn f() { ::bar::m!(); } LL | Vec::new(); | ^^^ use of undeclared type or module `Vec` -error[E0599]: no method named `clone` found for type `()` in the current scope +error[E0599]: no method named `clone` found for unit type `()` in the current scope --> $DIR/no_implicit_prelude.rs:12:12 | LL | fn f() { ::bar::m!(); } diff --git a/src/test/ui/hygiene/privacy.stderr b/src/test/ui/hygiene/privacy.stderr index 80fb4dd0f3..0649dc0ec5 100644 --- a/src/test/ui/hygiene/privacy.stderr +++ b/src/test/ui/hygiene/privacy.stderr @@ -2,7 +2,13 @@ error[E0603]: function `f` is private --> $DIR/privacy.rs:16:14 | LL | foo::f() - | ^ + | ^ this function is private + | +note: the function `f` is defined here + --> $DIR/privacy.rs:4:5 + | +LL | fn f() {} + | ^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/hygiene/trait_items.rs b/src/test/ui/hygiene/trait_items.rs index a116c5b38c..15c4acbc93 100644 --- a/src/test/ui/hygiene/trait_items.rs +++ b/src/test/ui/hygiene/trait_items.rs @@ -14,7 +14,7 @@ mod bar { } mod baz { - pub macro m() { ().f() } //~ ERROR no method named `f` found for type `()` in the current scope + pub macro m() { ().f() } //~ ERROR no method named `f` found fn f() { ::bar::m!(); } } diff --git a/src/test/ui/hygiene/trait_items.stderr b/src/test/ui/hygiene/trait_items.stderr index c3ce484edf..8e3609292a 100644 --- a/src/test/ui/hygiene/trait_items.stderr +++ b/src/test/ui/hygiene/trait_items.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `f` found for type `()` in the current scope +error[E0599]: no method named `f` found for unit type `()` in the current scope --> $DIR/trait_items.rs:17:24 | LL | fn f() { ::baz::m!(); } diff --git a/src/test/ui/if-else-type-mismatch.rs b/src/test/ui/if-else-type-mismatch.rs index 583c3d0b76..1a0a36df2a 100644 --- a/src/test/ui/if-else-type-mismatch.rs +++ b/src/test/ui/if-else-type-mismatch.rs @@ -4,43 +4,43 @@ fn main() { } else { 2u32 }; - //~^^ ERROR if and else have incompatible types + //~^^ ERROR `if` and `else` have incompatible types let _ = if true { 42i32 } else { 42u32 }; - //~^ ERROR if and else have incompatible types + //~^ ERROR `if` and `else` have incompatible types let _ = if true { 3u32; } else { 4u32 }; - //~^^ ERROR if and else have incompatible types + //~^^ ERROR `if` and `else` have incompatible types let _ = if true { 5u32 } else { 6u32; }; - //~^^ ERROR if and else have incompatible types + //~^^ ERROR `if` and `else` have incompatible types let _ = if true { 7i32; } else { 8u32 }; - //~^^ ERROR if and else have incompatible types + //~^^ ERROR `if` and `else` have incompatible types let _ = if true { 9i32 } else { 10u32; }; - //~^^ ERROR if and else have incompatible types + //~^^ ERROR `if` and `else` have incompatible types let _ = if true { } else { 11u32 }; - //~^^ ERROR if and else have incompatible types + //~^^ ERROR `if` and `else` have incompatible types let _ = if true { 12i32 } else { }; - //~^^^ ERROR if and else have incompatible types + //~^^^ ERROR `if` and `else` have incompatible types } diff --git a/src/test/ui/if-else-type-mismatch.stderr b/src/test/ui/if-else-type-mismatch.stderr index 14e8f87393..9fa190d6c9 100644 --- a/src/test/ui/if-else-type-mismatch.stderr +++ b/src/test/ui/if-else-type-mismatch.stderr @@ -1,4 +1,4 @@ -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-else-type-mismatch.rs:5:9 | LL | let _ = if true { @@ -9,9 +9,9 @@ LL | | } else { LL | | 2u32 | | ^^^^ expected `i32`, found `u32` LL | | }; - | |_____- if and else have incompatible types + | |_____- `if` and `else` have incompatible types -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-else-type-mismatch.rs:8:38 | LL | let _ = if true { 42i32 } else { 42u32 }; @@ -19,7 +19,7 @@ LL | let _ = if true { 42i32 } else { 42u32 }; | | | expected because of this -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-else-type-mismatch.rs:13:9 | LL | let _ = if true { @@ -33,9 +33,9 @@ LL | | } else { LL | | 4u32 | | ^^^^ expected `()`, found `u32` LL | | }; - | |_____- if and else have incompatible types + | |_____- `if` and `else` have incompatible types -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-else-type-mismatch.rs:19:9 | LL | let _ = if true { @@ -49,9 +49,9 @@ LL | | 6u32; | | | help: consider removing this semicolon | | expected `u32`, found `()` LL | | }; - | |_____- if and else have incompatible types + | |_____- `if` and `else` have incompatible types -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-else-type-mismatch.rs:25:9 | LL | let _ = if true { @@ -62,9 +62,9 @@ LL | | } else { LL | | 8u32 | | ^^^^ expected `()`, found `u32` LL | | }; - | |_____- if and else have incompatible types + | |_____- `if` and `else` have incompatible types -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-else-type-mismatch.rs:31:9 | LL | let _ = if true { @@ -75,9 +75,9 @@ LL | | } else { LL | | 10u32; | | ^^^^^^ expected `i32`, found `()` LL | | }; - | |_____- if and else have incompatible types + | |_____- `if` and `else` have incompatible types -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-else-type-mismatch.rs:37:9 | LL | let _ = if true { @@ -88,11 +88,11 @@ LL | | } else { LL | 11u32 | ^^^^^ expected `()`, found `u32` -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-else-type-mismatch.rs:42:12 | LL | let _ = if true { - | ------- if and else have incompatible types + | ------- `if` and `else` have incompatible types LL | 12i32 | ----- expected because of this LL | } else { diff --git a/src/test/ui/if/if-branch-types.rs b/src/test/ui/if/if-branch-types.rs index 5c693194a7..c125ba3060 100644 --- a/src/test/ui/if/if-branch-types.rs +++ b/src/test/ui/if/if-branch-types.rs @@ -1,5 +1,5 @@ fn main() { let x = if true { 10i32 } else { 10u32 }; - //~^ ERROR if and else have incompatible types + //~^ ERROR `if` and `else` have incompatible types //~| expected `i32`, found `u32` } diff --git a/src/test/ui/if/if-branch-types.stderr b/src/test/ui/if/if-branch-types.stderr index b5eacf5860..14f02163a8 100644 --- a/src/test/ui/if/if-branch-types.stderr +++ b/src/test/ui/if/if-branch-types.stderr @@ -1,4 +1,4 @@ -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-branch-types.rs:2:38 | LL | let x = if true { 10i32 } else { 10u32 }; diff --git a/src/test/ui/if/if-let-arm-types.rs b/src/test/ui/if/if-let-arm-types.rs index cae4f0974c..1e8260a017 100644 --- a/src/test/ui/if/if-let-arm-types.rs +++ b/src/test/ui/if/if-let-arm-types.rs @@ -1,11 +1,11 @@ fn main() { if let Some(b) = None { - //~^ NOTE if and else have incompatible types + //~^ NOTE `if` and `else` have incompatible types () //~^ NOTE expected because of this } else { 1 }; - //~^^ ERROR: if and else have incompatible types + //~^^ ERROR: `if` and `else` have incompatible types //~| NOTE expected `()`, found integer } diff --git a/src/test/ui/if/if-let-arm-types.stderr b/src/test/ui/if/if-let-arm-types.stderr index da93dfc999..b40a0f479d 100644 --- a/src/test/ui/if/if-let-arm-types.stderr +++ b/src/test/ui/if/if-let-arm-types.stderr @@ -1,4 +1,4 @@ -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/if-let-arm-types.rs:7:9 | LL | / if let Some(b) = None { @@ -10,7 +10,7 @@ LL | | } else { LL | | 1 | | ^ expected `()`, found integer LL | | }; - | |_____- if and else have incompatible types + | |_____- `if` and `else` have incompatible types error: aborting due to previous error diff --git a/src/test/ui/if/if-let.stderr b/src/test/ui/if/if-let.stderr index 83ab234cf0..570a64e999 100644 --- a/src/test/ui/if/if-let.stderr +++ b/src/test/ui/if/if-let.stderr @@ -2,7 +2,7 @@ warning: irrefutable if-let pattern --> $DIR/if-let.rs:6:13 | LL | if let $p = $e $b - | ^^ + | ^^^^^^^^^^^^^^^^^ ... LL | / foo!(a, 1, { LL | | println!("irrefutable pattern"); @@ -15,7 +15,7 @@ warning: irrefutable if-let pattern --> $DIR/if-let.rs:6:13 | LL | if let $p = $e $b - | ^^ + | ^^^^^^^^^^^^^^^^^ ... LL | / bar!(a, 1, { LL | | println!("irrefutable pattern"); diff --git a/src/test/ui/if/if-without-block.rs b/src/test/ui/if/if-without-block.rs index 3dde0ed7c7..8a4c59f326 100644 --- a/src/test/ui/if/if-without-block.rs +++ b/src/test/ui/if/if-without-block.rs @@ -1,7 +1,7 @@ fn main() { let n = 1; if 5 == { - //~^ NOTE this `if` statement has a condition, but no block + //~^ NOTE this `if` expression has a condition, but no block println!("five"); } } diff --git a/src/test/ui/if/if-without-block.stderr b/src/test/ui/if/if-without-block.stderr index 1e45045ade..34df8e3d77 100644 --- a/src/test/ui/if/if-without-block.stderr +++ b/src/test/ui/if/if-without-block.stderr @@ -2,7 +2,7 @@ error: expected `{`, found `}` --> $DIR/if-without-block.rs:7:1 | LL | if 5 == { - | -- this `if` statement has a condition, but no block + | -- this `if` expression has a condition, but no block ... LL | } | ^ expected `{` diff --git a/src/test/ui/if/if-without-else-as-fn-expr.rs b/src/test/ui/if/if-without-else-as-fn-expr.rs index 826371be35..19fbfb27ba 100644 --- a/src/test/ui/if/if-without-else-as-fn-expr.rs +++ b/src/test/ui/if/if-without-else-as-fn-expr.rs @@ -2,14 +2,14 @@ fn foo(bar: usize) -> usize { if bar % 5 == 0 { return 3; } - //~^^^ ERROR if may be missing an else clause + //~^^^ ERROR `if` may be missing an `else` clause } fn foo2(bar: usize) -> usize { let x: usize = if bar % 5 == 0 { return 3; }; - //~^^^ ERROR if may be missing an else clause + //~^^^ ERROR `if` may be missing an `else` clause x } @@ -17,21 +17,21 @@ fn foo3(bar: usize) -> usize { if bar % 5 == 0 { 3 } - //~^^^ ERROR if may be missing an else clause + //~^^^ ERROR `if` may be missing an `else` clause } fn foo_let(bar: usize) -> usize { if let 0 = 1 { return 3; } - //~^^^ ERROR if may be missing an else clause + //~^^^ ERROR `if` may be missing an `else` clause } fn foo2_let(bar: usize) -> usize { let x: usize = if let 0 = 1 { return 3; }; - //~^^^ ERROR if may be missing an else clause + //~^^^ ERROR `if` may be missing an `else` clause x } @@ -39,7 +39,7 @@ fn foo3_let(bar: usize) -> usize { if let 0 = 1 { 3 } - //~^^^ ERROR if may be missing an else clause + //~^^^ ERROR `if` may be missing an `else` clause } // FIXME(60254): deduplicate first error in favor of second. diff --git a/src/test/ui/if/if-without-else-as-fn-expr.stderr b/src/test/ui/if/if-without-else-as-fn-expr.stderr index 9c7e700236..4daf27493c 100644 --- a/src/test/ui/if/if-without-else-as-fn-expr.stderr +++ b/src/test/ui/if/if-without-else-as-fn-expr.stderr @@ -1,4 +1,4 @@ -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/if-without-else-as-fn-expr.rs:2:5 | LL | fn foo(bar: usize) -> usize { @@ -11,7 +11,7 @@ LL | | } = note: `if` expressions without `else` evaluate to `()` = help: consider adding an `else` block that evaluates to the expected type -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/if-without-else-as-fn-expr.rs:9:20 | LL | let x: usize = if bar % 5 == 0 { @@ -25,7 +25,7 @@ LL | | }; = note: `if` expressions without `else` evaluate to `()` = help: consider adding an `else` block that evaluates to the expected type -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/if-without-else-as-fn-expr.rs:17:5 | LL | fn foo3(bar: usize) -> usize { @@ -38,7 +38,7 @@ LL | | } = note: `if` expressions without `else` evaluate to `()` = help: consider adding an `else` block that evaluates to the expected type -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/if-without-else-as-fn-expr.rs:24:5 | LL | fn foo_let(bar: usize) -> usize { @@ -51,7 +51,7 @@ LL | | } = note: `if` expressions without `else` evaluate to `()` = help: consider adding an `else` block that evaluates to the expected type -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/if-without-else-as-fn-expr.rs:31:20 | LL | let x: usize = if let 0 = 1 { @@ -65,7 +65,7 @@ LL | | }; = note: `if` expressions without `else` evaluate to `()` = help: consider adding an `else` block that evaluates to the expected type -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/if-without-else-as-fn-expr.rs:39:5 | LL | fn foo3_let(bar: usize) -> usize { diff --git a/src/test/ui/if/if-without-else-result.rs b/src/test/ui/if/if-without-else-result.rs index e5fb7b2632..cf84a99e53 100644 --- a/src/test/ui/if/if-without-else-result.rs +++ b/src/test/ui/if/if-without-else-result.rs @@ -1,6 +1,6 @@ fn main() { let a = if true { true }; - //~^ ERROR if may be missing an else clause [E0317] + //~^ ERROR `if` may be missing an `else` clause [E0317] //~| expected `()`, found `bool` println!("{}", a); } diff --git a/src/test/ui/if/if-without-else-result.stderr b/src/test/ui/if/if-without-else-result.stderr index 66a8185774..821635d376 100644 --- a/src/test/ui/if/if-without-else-result.stderr +++ b/src/test/ui/if/if-without-else-result.stderr @@ -1,4 +1,4 @@ -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/if-without-else-result.rs:2:13 | LL | let a = if true { true }; diff --git a/src/test/ui/ignore-all-the-things.rs b/src/test/ui/ignore-all-the-things.rs index 8c046a289f..5980e1a857 100644 --- a/src/test/ui/ignore-all-the-things.rs +++ b/src/test/ui/ignore-all-the-things.rs @@ -3,9 +3,6 @@ #![allow(non_shorthand_field_patterns)] #![allow(dead_code)] #![allow(unused_variables)] -// pretty-expanded FIXME #23616 - -#![feature(slice_patterns)] struct Foo(isize, isize, isize, isize); struct Bar{a: isize, b: isize, c: isize, d: isize} diff --git a/src/test/ui/impl-header-lifetime-elision/assoc-type.stderr b/src/test/ui/impl-header-lifetime-elision/assoc-type.stderr index 492ca87218..14c53f9066 100644 --- a/src/test/ui/impl-header-lifetime-elision/assoc-type.stderr +++ b/src/test/ui/impl-header-lifetime-elision/assoc-type.stderr @@ -2,13 +2,23 @@ error[E0106]: missing lifetime specifier --> $DIR/assoc-type.rs:11:19 | LL | type Output = &i32; - | ^ expected lifetime parameter + | ^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | type Output<'lifetime> = &'lifetime i32; + | ^^^^^^^^^^^ ^^^^^^^^^^ error[E0106]: missing lifetime specifier --> $DIR/assoc-type.rs:16:20 | LL | type Output = &'_ i32; - | ^^ expected lifetime parameter + | ^^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | type Output<'lifetime> = &'lifetime i32; + | ^^^^^^^^^^^ ^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/impl-trait/auto-trait-leak.rs b/src/test/ui/impl-trait/auto-trait-leak.rs index 1c601bc3c3..a6012835f4 100644 --- a/src/test/ui/impl-trait/auto-trait-leak.rs +++ b/src/test/ui/impl-trait/auto-trait-leak.rs @@ -12,6 +12,7 @@ fn main() { fn cycle1() -> impl Clone { //~^ ERROR cycle detected //~| ERROR cycle detected + //~| ERROR cycle detected send(cycle2().clone()); //~^ ERROR cannot be sent between threads safely diff --git a/src/test/ui/impl-trait/auto-trait-leak.stderr b/src/test/ui/impl-trait/auto-trait-leak.stderr index d11941fee1..0ebaac8945 100644 --- a/src/test/ui/impl-trait/auto-trait-leak.stderr +++ b/src/test/ui/impl-trait/auto-trait-leak.stderr @@ -11,12 +11,12 @@ LL | fn cycle1() -> impl Clone { | ^^^^^^^^^^^^^^^^^^^^^^^^^ = note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`... note: ...which requires processing `cycle2::{{opaque}}#0`... - --> $DIR/auto-trait-leak.rs:21:16 + --> $DIR/auto-trait-leak.rs:22:16 | LL | fn cycle2() -> impl Clone { | ^^^^^^^^^^ note: ...which requires processing `cycle2`... - --> $DIR/auto-trait-leak.rs:21:1 + --> $DIR/auto-trait-leak.rs:22:1 | LL | fn cycle2() -> impl Clone { | ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -47,12 +47,47 @@ LL | fn cycle1() -> impl Clone { | ^^^^^^^^^^^^^^^^^^^^^^^^^ = note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`... note: ...which requires processing `cycle2::{{opaque}}#0`... - --> $DIR/auto-trait-leak.rs:21:16 + --> $DIR/auto-trait-leak.rs:22:16 | LL | fn cycle2() -> impl Clone { | ^^^^^^^^^^ note: ...which requires processing `cycle2`... - --> $DIR/auto-trait-leak.rs:21:1 + --> $DIR/auto-trait-leak.rs:22:1 + | +LL | fn cycle2() -> impl Clone { + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: ...which again requires processing `cycle1::{{opaque}}#0`, completing the cycle +note: cycle used when checking item types in top-level module + --> $DIR/auto-trait-leak.rs:1:1 + | +LL | / use std::cell::Cell; +LL | | use std::rc::Rc; +LL | | +LL | | fn send<T: Send>(_: T) {} +... | +LL | | Rc::new(String::from("foo")) +LL | | } + | |_^ + +error[E0391]: cycle detected when processing `cycle1::{{opaque}}#0` + --> $DIR/auto-trait-leak.rs:12:16 + | +LL | fn cycle1() -> impl Clone { + | ^^^^^^^^^^ + | +note: ...which requires processing `cycle1`... + --> $DIR/auto-trait-leak.rs:12:1 + | +LL | fn cycle1() -> impl Clone { + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`... +note: ...which requires processing `cycle2::{{opaque}}#0`... + --> $DIR/auto-trait-leak.rs:22:16 + | +LL | fn cycle2() -> impl Clone { + | ^^^^^^^^^^ +note: ...which requires processing `cycle2`... + --> $DIR/auto-trait-leak.rs:22:1 | LL | fn cycle2() -> impl Clone { | ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -70,18 +105,21 @@ LL | | } | |_^ error[E0277]: `std::rc::Rc<std::string::String>` cannot be sent between threads safely - --> $DIR/auto-trait-leak.rs:15:5 + --> $DIR/auto-trait-leak.rs:16:5 | LL | fn send<T: Send>(_: T) {} | ---- ---- required by this bound in `send` ... LL | send(cycle2().clone()); | ^^^^ `std::rc::Rc<std::string::String>` cannot be sent between threads safely +... +LL | fn cycle2() -> impl Clone { + | ---------- within this `impl std::clone::Clone` | = help: within `impl std::clone::Clone`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<std::string::String>` = note: required because it appears within the type `impl std::clone::Clone` -error: aborting due to 3 previous errors +error: aborting due to 4 previous errors Some errors have detailed explanations: E0277, E0391. For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/impl-trait/auto-trait-leak2.stderr b/src/test/ui/impl-trait/auto-trait-leak2.stderr index d163e1dff7..a93b3dbc71 100644 --- a/src/test/ui/impl-trait/auto-trait-leak2.stderr +++ b/src/test/ui/impl-trait/auto-trait-leak2.stderr @@ -1,6 +1,9 @@ error[E0277]: `std::rc::Rc<std::cell::Cell<i32>>` cannot be sent between threads safely --> $DIR/auto-trait-leak2.rs:13:5 | +LL | fn before() -> impl Fn(i32) { + | ------------ within this `impl std::ops::Fn<(i32,)>` +... LL | fn send<T: Send>(_: T) {} | ---- ---- required by this bound in `send` ... @@ -19,6 +22,9 @@ LL | fn send<T: Send>(_: T) {} ... LL | send(after()); | ^^^^ `std::rc::Rc<std::cell::Cell<i32>>` cannot be sent between threads safely +... +LL | fn after() -> impl Fn(i32) { + | ------------ within this `impl std::ops::Fn<(i32,)>` | = help: within `impl std::ops::Fn<(i32,)>`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<std::cell::Cell<i32>>` = note: required because it appears within the type `[closure@$DIR/auto-trait-leak2.rs:24:5: 24:22 p:std::rc::Rc<std::cell::Cell<i32>>]` diff --git a/src/test/ui/impl-trait/bindings-opaque.stderr b/src/test/ui/impl-trait/bindings-opaque.stderr index 644d26b340..1605f3434c 100644 --- a/src/test/ui/impl-trait/bindings-opaque.stderr +++ b/src/test/ui/impl-trait/bindings-opaque.stderr @@ -6,19 +6,19 @@ LL | #![feature(impl_trait_in_bindings)] | = note: `#[warn(incomplete_features)]` on by default -error[E0599]: no method named `count_ones` found for type `impl std::marker::Copy` in the current scope +error[E0599]: no method named `count_ones` found for opaque type `impl std::marker::Copy` in the current scope --> $DIR/bindings-opaque.rs:11:17 | LL | let _ = FOO.count_ones(); | ^^^^^^^^^^ method not found in `impl std::marker::Copy` -error[E0599]: no method named `count_ones` found for type `impl std::marker::Copy` in the current scope +error[E0599]: no method named `count_ones` found for opaque type `impl std::marker::Copy` in the current scope --> $DIR/bindings-opaque.rs:13:17 | LL | let _ = BAR.count_ones(); | ^^^^^^^^^^ method not found in `impl std::marker::Copy` -error[E0599]: no method named `count_ones` found for type `impl std::marker::Copy` in the current scope +error[E0599]: no method named `count_ones` found for opaque type `impl std::marker::Copy` in the current scope --> $DIR/bindings-opaque.rs:15:17 | LL | let _ = foo.count_ones(); diff --git a/src/test/ui/impl-trait/does-not-live-long-enough.rs b/src/test/ui/impl-trait/does-not-live-long-enough.rs new file mode 100644 index 0000000000..6179132b3f --- /dev/null +++ b/src/test/ui/impl-trait/does-not-live-long-enough.rs @@ -0,0 +1,11 @@ +struct List { + data: Vec<String>, +} +impl List { + fn started_with<'a>(&'a self, prefix: &'a str) -> impl Iterator<Item=&'a str> { + self.data.iter().filter(|s| s.starts_with(prefix)).map(|s| s.as_ref()) + //~^ ERROR does not live long enough + } +} + +fn main() {} diff --git a/src/test/ui/impl-trait/does-not-live-long-enough.stderr b/src/test/ui/impl-trait/does-not-live-long-enough.stderr new file mode 100644 index 0000000000..83d0f87015 --- /dev/null +++ b/src/test/ui/impl-trait/does-not-live-long-enough.stderr @@ -0,0 +1,21 @@ +error[E0597]: `prefix` does not live long enough + --> $DIR/does-not-live-long-enough.rs:6:51 + | +LL | fn started_with<'a>(&'a self, prefix: &'a str) -> impl Iterator<Item=&'a str> { + | -- lifetime `'a` defined here --------------------------- opaque type requires that `prefix` is borrowed for `'a` +LL | self.data.iter().filter(|s| s.starts_with(prefix)).map(|s| s.as_ref()) + | --- ^^^^^^ borrowed value does not live long enough + | | + | value captured here +LL | +LL | } + | - `prefix` dropped here while still borrowed + | +help: you can add a bound to the opaque type to make it last less than `'static` and match `'a` + | +LL | fn started_with<'a>(&'a self, prefix: &'a str) -> impl Iterator<Item=&'a str> + 'a { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0597`. diff --git a/src/test/ui/impl-trait/dyn-trait-return-should-be-impl-trait.rs b/src/test/ui/impl-trait/dyn-trait-return-should-be-impl-trait.rs new file mode 100644 index 0000000000..08bab5734f --- /dev/null +++ b/src/test/ui/impl-trait/dyn-trait-return-should-be-impl-trait.rs @@ -0,0 +1,74 @@ +#![allow(bare_trait_objects)] +struct Struct; +trait Trait {} +impl Trait for Struct {} +impl Trait for u32 {} + +fn fuz() -> (usize, Trait) { (42, Struct) } +//~^ ERROR E0277 +//~| ERROR E0308 +fn bar() -> (usize, dyn Trait) { (42, Struct) } +//~^ ERROR E0277 +//~| ERROR E0308 +fn bap() -> Trait { Struct } +//~^ ERROR E0746 +fn ban() -> dyn Trait { Struct } +//~^ ERROR E0746 +fn bak() -> dyn Trait { unimplemented!() } //~ ERROR E0277 +// Suggest using `Box<dyn Trait>` +fn bal() -> dyn Trait { //~ ERROR E0746 + if true { + return Struct; + } + 42 +} +fn bax() -> dyn Trait { //~ ERROR E0746 + if true { + Struct + } else { + 42 + } +} +fn bam() -> Box<dyn Trait> { + if true { + return Struct; //~ ERROR mismatched types + } + 42 //~ ERROR mismatched types +} +fn baq() -> Box<dyn Trait> { + if true { + return 0; //~ ERROR mismatched types + } + 42 //~ ERROR mismatched types +} +fn baz() -> Box<dyn Trait> { + if true { + Struct //~ ERROR mismatched types + } else { + 42 //~ ERROR mismatched types + } +} +fn baw() -> Box<dyn Trait> { + if true { + 0 //~ ERROR mismatched types + } else { + 42 //~ ERROR mismatched types + } +} + +// Suggest using `impl Trait` +fn bat() -> dyn Trait { //~ ERROR E0746 + if true { + return 0; + } + 42 +} +fn bay() -> dyn Trait { //~ ERROR E0746 + if true { + 0 + } else { + 42 + } +} + +fn main() {} diff --git a/src/test/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr b/src/test/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr new file mode 100644 index 0000000000..664a897c59 --- /dev/null +++ b/src/test/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr @@ -0,0 +1,272 @@ +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:7:35 + | +LL | fn fuz() -> (usize, Trait) { (42, Struct) } + | ^^^^^^ expected trait object `dyn Trait`, found struct `Struct` + | + = note: expected trait object `(dyn Trait + 'static)` + found struct `Struct` + +error[E0277]: the size for values of type `(dyn Trait + 'static)` cannot be known at compilation time + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:7:13 + | +LL | fn fuz() -> (usize, Trait) { (42, Struct) } + | ^^^^^^^^^^^^^^ ------------ this returned value is of type `(usize, (dyn Trait + 'static))` + | | + | doesn't have a size known at compile-time + | + = help: within `(usize, (dyn Trait + 'static))`, the trait `std::marker::Sized` is not implemented for `(dyn Trait + 'static)` + = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait> + = note: required because it appears within the type `(usize, (dyn Trait + 'static))` + = note: the return type of a function must have a statically known size + +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:10:39 + | +LL | fn bar() -> (usize, dyn Trait) { (42, Struct) } + | ^^^^^^ expected trait object `dyn Trait`, found struct `Struct` + | + = note: expected trait object `(dyn Trait + 'static)` + found struct `Struct` + +error[E0277]: the size for values of type `(dyn Trait + 'static)` cannot be known at compilation time + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:10:13 + | +LL | fn bar() -> (usize, dyn Trait) { (42, Struct) } + | ^^^^^^^^^^^^^^^^^^ ------------ this returned value is of type `(usize, (dyn Trait + 'static))` + | | + | doesn't have a size known at compile-time + | + = help: within `(usize, (dyn Trait + 'static))`, the trait `std::marker::Sized` is not implemented for `(dyn Trait + 'static)` + = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait> + = note: required because it appears within the type `(usize, (dyn Trait + 'static))` + = note: the return type of a function must have a statically known size + +error[E0746]: return type cannot have an unboxed trait object + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:13:13 + | +LL | fn bap() -> Trait { Struct } + | ^^^^^ doesn't have a size known at compile-time + | + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> +help: return `impl Trait` instead, as all return paths are of type `Struct`, which implements `Trait` + | +LL | fn bap() -> impl Trait { Struct } + | ^^^^^^^^^^ + +error[E0746]: return type cannot have an unboxed trait object + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:15:13 + | +LL | fn ban() -> dyn Trait { Struct } + | ^^^^^^^^^ doesn't have a size known at compile-time + | + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> +help: return `impl Trait` instead, as all return paths are of type `Struct`, which implements `Trait` + | +LL | fn ban() -> impl Trait { Struct } + | ^^^^^^^^^^ + +error[E0277]: the size for values of type `(dyn Trait + 'static)` cannot be known at compilation time + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:17:13 + | +LL | fn bak() -> dyn Trait { unimplemented!() } + | ^^^^^^^^^ doesn't have a size known at compile-time + | + = help: the trait `std::marker::Sized` is not implemented for `(dyn Trait + 'static)` + = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait> + = note: the return type of a function must have a statically known size + +error[E0746]: return type cannot have an unboxed trait object + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:19:13 + | +LL | fn bal() -> dyn Trait { + | ^^^^^^^^^ doesn't have a size known at compile-time + | + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = note: if all the returned values were of the same type you could use `impl Trait` as the return type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = note: you can create a new `enum` with a variant for each returned type +help: return a boxed trait object instead + | +LL | fn bal() -> Box<dyn Trait> { +LL | if true { +LL | return Box::new(Struct); +LL | } +LL | Box::new(42) + | + +error[E0746]: return type cannot have an unboxed trait object + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:25:13 + | +LL | fn bax() -> dyn Trait { + | ^^^^^^^^^ doesn't have a size known at compile-time + | + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = note: if all the returned values were of the same type you could use `impl Trait` as the return type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = note: you can create a new `enum` with a variant for each returned type +help: return a boxed trait object instead + | +LL | fn bax() -> Box<dyn Trait> { +LL | if true { +LL | Box::new(Struct) +LL | } else { +LL | Box::new(42) + | + +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:34:16 + | +LL | fn bam() -> Box<dyn Trait> { + | -------------- expected `std::boxed::Box<(dyn Trait + 'static)>` because of return type +LL | if true { +LL | return Struct; + | ^^^^^^ + | | + | expected struct `std::boxed::Box`, found struct `Struct` + | help: store this in the heap by calling `Box::new`: `Box::new(Struct)` + | + = note: expected struct `std::boxed::Box<(dyn Trait + 'static)>` + found struct `Struct` + = note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html + +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:36:5 + | +LL | fn bam() -> Box<dyn Trait> { + | -------------- expected `std::boxed::Box<(dyn Trait + 'static)>` because of return type +... +LL | 42 + | ^^ + | | + | expected struct `std::boxed::Box`, found integer + | help: store this in the heap by calling `Box::new`: `Box::new(42)` + | + = note: expected struct `std::boxed::Box<(dyn Trait + 'static)>` + found type `{integer}` + = note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html + +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:40:16 + | +LL | fn baq() -> Box<dyn Trait> { + | -------------- expected `std::boxed::Box<(dyn Trait + 'static)>` because of return type +LL | if true { +LL | return 0; + | ^ + | | + | expected struct `std::boxed::Box`, found integer + | help: store this in the heap by calling `Box::new`: `Box::new(0)` + | + = note: expected struct `std::boxed::Box<(dyn Trait + 'static)>` + found type `{integer}` + = note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html + +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:42:5 + | +LL | fn baq() -> Box<dyn Trait> { + | -------------- expected `std::boxed::Box<(dyn Trait + 'static)>` because of return type +... +LL | 42 + | ^^ + | | + | expected struct `std::boxed::Box`, found integer + | help: store this in the heap by calling `Box::new`: `Box::new(42)` + | + = note: expected struct `std::boxed::Box<(dyn Trait + 'static)>` + found type `{integer}` + = note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html + +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:46:9 + | +LL | fn baz() -> Box<dyn Trait> { + | -------------- expected `std::boxed::Box<(dyn Trait + 'static)>` because of return type +LL | if true { +LL | Struct + | ^^^^^^ + | | + | expected struct `std::boxed::Box`, found struct `Struct` + | help: store this in the heap by calling `Box::new`: `Box::new(Struct)` + | + = note: expected struct `std::boxed::Box<(dyn Trait + 'static)>` + found struct `Struct` + = note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html + +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:48:9 + | +LL | fn baz() -> Box<dyn Trait> { + | -------------- expected `std::boxed::Box<(dyn Trait + 'static)>` because of return type +... +LL | 42 + | ^^ + | | + | expected struct `std::boxed::Box`, found integer + | help: store this in the heap by calling `Box::new`: `Box::new(42)` + | + = note: expected struct `std::boxed::Box<(dyn Trait + 'static)>` + found type `{integer}` + = note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html + +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:53:9 + | +LL | fn baw() -> Box<dyn Trait> { + | -------------- expected `std::boxed::Box<(dyn Trait + 'static)>` because of return type +LL | if true { +LL | 0 + | ^ + | | + | expected struct `std::boxed::Box`, found integer + | help: store this in the heap by calling `Box::new`: `Box::new(0)` + | + = note: expected struct `std::boxed::Box<(dyn Trait + 'static)>` + found type `{integer}` + = note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html + +error[E0308]: mismatched types + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:55:9 + | +LL | fn baw() -> Box<dyn Trait> { + | -------------- expected `std::boxed::Box<(dyn Trait + 'static)>` because of return type +... +LL | 42 + | ^^ + | | + | expected struct `std::boxed::Box`, found integer + | help: store this in the heap by calling `Box::new`: `Box::new(42)` + | + = note: expected struct `std::boxed::Box<(dyn Trait + 'static)>` + found type `{integer}` + = note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html + +error[E0746]: return type cannot have an unboxed trait object + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:60:13 + | +LL | fn bat() -> dyn Trait { + | ^^^^^^^^^ doesn't have a size known at compile-time + | + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> +help: return `impl Trait` instead, as all return paths are of type `{integer}`, which implements `Trait` + | +LL | fn bat() -> impl Trait { + | ^^^^^^^^^^ + +error[E0746]: return type cannot have an unboxed trait object + --> $DIR/dyn-trait-return-should-be-impl-trait.rs:66:13 + | +LL | fn bay() -> dyn Trait { + | ^^^^^^^^^ doesn't have a size known at compile-time + | + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> +help: return `impl Trait` instead, as all return paths are of type `{integer}`, which implements `Trait` + | +LL | fn bay() -> impl Trait { + | ^^^^^^^^^^ + +error: aborting due to 19 previous errors + +Some errors have detailed explanations: E0277, E0308, E0746. +For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/impl-trait/equality.stderr b/src/test/ui/impl-trait/equality.stderr index e53524e58d..9178358b60 100644 --- a/src/test/ui/impl-trait/equality.stderr +++ b/src/test/ui/impl-trait/equality.stderr @@ -9,6 +9,12 @@ LL | return 1_i32; LL | } LL | 0_u32 | ^^^^^ expected `i32`, found `u32` + | + = note: to return `impl Trait`, all returned values must be of the same type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = help: if the trait `Foo` were object safe, you could return a boxed trait object + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = help: alternatively, create a new `enum` with a variant for each returned type error[E0277]: cannot add `impl Foo` to `u32` --> $DIR/equality.rs:24:11 diff --git a/src/test/ui/impl-trait/equality2.stderr b/src/test/ui/impl-trait/equality2.stderr index 312976b72d..b882514f61 100644 --- a/src/test/ui/impl-trait/equality2.stderr +++ b/src/test/ui/impl-trait/equality2.stderr @@ -1,6 +1,9 @@ error[E0308]: mismatched types --> $DIR/equality2.rs:25:18 | +LL | fn hide<T: Foo>(x: T) -> impl Foo { + | -------- the found opaque type +... LL | let _: u32 = hide(0_u32); | --- ^^^^^^^^^^^ expected `u32`, found opaque type | | @@ -12,6 +15,9 @@ LL | let _: u32 = hide(0_u32); error[E0308]: mismatched types --> $DIR/equality2.rs:31:18 | +LL | fn hide<T: Foo>(x: T) -> impl Foo { + | -------- the found opaque type +... LL | let _: i32 = Leak::leak(hide(0_i32)); | --- ^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found associated type | | @@ -25,6 +31,12 @@ LL | let _: i32 = Leak::leak(hide(0_i32)); error[E0308]: mismatched types --> $DIR/equality2.rs:38:10 | +LL | fn hide<T: Foo>(x: T) -> impl Foo { + | -------- + | | + | the expected opaque type + | the found opaque type +... LL | x = (x.1, | ^^^ expected `u32`, found `i32` | @@ -34,6 +46,12 @@ LL | x = (x.1, error[E0308]: mismatched types --> $DIR/equality2.rs:41:10 | +LL | fn hide<T: Foo>(x: T) -> impl Foo { + | -------- + | | + | the expected opaque type + | the found opaque type +... LL | x.0); | ^^^ expected `i32`, found `u32` | diff --git a/src/test/ui/impl-trait/impl-generic-mismatch.rs b/src/test/ui/impl-trait/impl-generic-mismatch.rs index 5597df4ba4..615dd6d2f6 100644 --- a/src/test/ui/impl-trait/impl-generic-mismatch.rs +++ b/src/test/ui/impl-trait/impl-generic-mismatch.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl use std::fmt::Debug; diff --git a/src/test/ui/impl-trait/impl-generic-mismatch.stderr b/src/test/ui/impl-trait/impl-generic-mismatch.stderr index 2278519e95..0c294d1e48 100644 --- a/src/test/ui/impl-trait/impl-generic-mismatch.stderr +++ b/src/test/ui/impl-trait/impl-generic-mismatch.stderr @@ -1,5 +1,5 @@ error[E0643]: method `foo` has incompatible signature for trait - --> $DIR/impl-generic-mismatch.rs:10:12 + --> $DIR/impl-generic-mismatch.rs:13:12 | LL | fn foo(&self, _: &impl Debug); | ---------- declaration in trait here @@ -13,7 +13,7 @@ LL | fn foo(&self, _: &impl Debug) { } | -- ^^^^^^^^^^ error[E0643]: method `bar` has incompatible signature for trait - --> $DIR/impl-generic-mismatch.rs:19:23 + --> $DIR/impl-generic-mismatch.rs:22:23 | LL | fn bar<U: Debug>(&self, _: &U); | - declaration in trait here @@ -27,7 +27,7 @@ LL | fn bar<U: Debug>(&self, _: &U) { } | ^^^^^^^^^^ ^ error[E0643]: method `hash` has incompatible signature for trait - --> $DIR/impl-generic-mismatch.rs:30:33 + --> $DIR/impl-generic-mismatch.rs:33:33 | LL | fn hash(&self, hasher: &mut impl Hasher) {} | ^^^^^^^^^^^ expected generic parameter, found `impl Trait` diff --git a/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.rs b/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.rs index 2bff01be9b..41f48cb569 100644 --- a/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.rs +++ b/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.rs @@ -18,5 +18,5 @@ fn main() { let f1 = Bar; f1.foo(1usize); - //~^ error: method named `foo` found for type `Bar` in the current scope + //~^ error: method named `foo` found for struct `Bar` in the current scope } diff --git a/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.stderr b/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.stderr index 441191beaf..5741797547 100644 --- a/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.stderr +++ b/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `foo` found for type `Bar` in the current scope +error[E0599]: no method named `foo` found for struct `Bar` in the current scope --> $DIR/issue-21659-show-relevant-trait-impls-3.rs:20:8 | LL | struct Bar; diff --git a/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr b/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr index fb870d6c6f..7f2eb0c21e 100644 --- a/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr +++ b/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `is_empty` found for type `Foo` in the current scope +error[E0599]: no method named `is_empty` found for struct `Foo` in the current scope --> $DIR/method-suggestion-no-duplication.rs:7:15 | LL | struct Foo; diff --git a/src/test/ui/impl-trait/multiple-lifetimes/error-handling.stderr b/src/test/ui/impl-trait/multiple-lifetimes/error-handling.stderr index 45c5142d93..5957ecbdc5 100644 --- a/src/test/ui/impl-trait/multiple-lifetimes/error-handling.stderr +++ b/src/test/ui/impl-trait/multiple-lifetimes/error-handling.stderr @@ -5,9 +5,9 @@ LL | fn foo<'a, 'b, 'c>(x: &'static i32, mut y: &'a i32) -> E<'b, 'c> { | -- lifetime `'a` defined here ^^^^^^^^^ opaque type requires that `'a` must outlive `'static` | = help: consider replacing `'a` with `'static` -help: to allow this `impl Trait` to capture borrowed data with lifetime `'a`, add `'a` as a constraint +help: to allow this `impl Trait` to capture borrowed data with lifetime `'a`, add `'a` as a bound | -LL | type E<'a, 'b> = impl Sized; + 'a +LL | type E<'a, 'b> = impl Sized + 'a; | error: aborting due to previous error diff --git a/src/test/ui/impl-trait/must_outlive_least_region_or_bound.nll.stderr b/src/test/ui/impl-trait/must_outlive_least_region_or_bound.nll.stderr index bb5a85aba9..1806d2607a 100644 --- a/src/test/ui/impl-trait/must_outlive_least_region_or_bound.nll.stderr +++ b/src/test/ui/impl-trait/must_outlive_least_region_or_bound.nll.stderr @@ -6,7 +6,7 @@ LL | fn elided(x: &i32) -> impl Copy { x } | | | let's call the lifetime of this reference `'1` | -help: to allow this `impl Trait` to capture borrowed data with lifetime `'1`, add `'_` as a constraint +help: to allow this `impl Trait` to capture borrowed data with lifetime `'1`, add `'_` as a bound | LL | fn elided(x: &i32) -> impl Copy + '_ { x } | ^^^^^^^^^^^^^^ @@ -20,7 +20,7 @@ LL | fn explicit<'a>(x: &'a i32) -> impl Copy { x } | lifetime `'a` defined here | = help: consider replacing `'a` with `'static` -help: to allow this `impl Trait` to capture borrowed data with lifetime `'a`, add `'a` as a constraint +help: to allow this `impl Trait` to capture borrowed data with lifetime `'a`, add `'a` as a bound | LL | fn explicit<'a>(x: &'a i32) -> impl Copy + 'a { x } | ^^^^^^^^^^^^^^ diff --git a/src/test/ui/impl-trait/must_outlive_least_region_or_bound.stderr b/src/test/ui/impl-trait/must_outlive_least_region_or_bound.stderr index a8341f62e1..7f92e709af 100644 --- a/src/test/ui/impl-trait/must_outlive_least_region_or_bound.stderr +++ b/src/test/ui/impl-trait/must_outlive_least_region_or_bound.stderr @@ -11,7 +11,7 @@ note: ...can't outlive the anonymous lifetime #1 defined on the function body at | LL | fn elided(x: &i32) -> impl Copy { x } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -help: you can add a constraint to the return type to make it last less than `'static` and match the anonymous lifetime #1 defined on the function body at 3:1 +help: you can add a bound to the return type to make it last less than `'static` and match the anonymous lifetime #1 defined on the function body at 3:1 | LL | fn elided(x: &i32) -> impl Copy + '_ { x } | ^^^^^^^^^^^^^^ @@ -29,7 +29,7 @@ note: ...can't outlive the lifetime `'a` as defined on the function body at 6:13 | LL | fn explicit<'a>(x: &'a i32) -> impl Copy { x } | ^^ -help: you can add a constraint to the return type to make it last less than `'static` and match the lifetime `'a` as defined on the function body at 6:13 +help: you can add a bound to the return type to make it last less than `'static` and match the lifetime `'a` as defined on the function body at 6:13 | LL | fn explicit<'a>(x: &'a i32) -> impl Copy + 'a { x } | ^^^^^^^^^^^^^^ @@ -47,7 +47,7 @@ note: ...can't outlive the lifetime `'a` as defined on the function body at 12:1 | LL | fn with_bound<'a>(x: &'a i32) -> impl LifetimeTrait<'a> + 'static { x } | ^^ -help: you can add a constraint to the return type to make it last less than `'static` and match the lifetime `'a` as defined on the function body at 12:15 +help: you can add a bound to the return type to make it last less than `'static` and match the lifetime `'a` as defined on the function body at 12:15 | LL | fn with_bound<'a>(x: &'a i32) -> impl LifetimeTrait<'a> + 'static + 'a { x } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/impl-trait/no-method-suggested-traits.rs b/src/test/ui/impl-trait/no-method-suggested-traits.rs index c912873a6c..c8abc2d8f8 100644 --- a/src/test/ui/impl-trait/no-method-suggested-traits.rs +++ b/src/test/ui/impl-trait/no-method-suggested-traits.rs @@ -25,7 +25,7 @@ fn main() { //~|items from traits can only be used if the trait is in scope std::rc::Rc::new(&mut Box::new(&1u32)).method(); //~^items from traits can only be used if the trait is in scope - //~| ERROR no method named `method` found for type + //~| ERROR no method named `method` found for struct 'a'.method(); //~^ ERROR no method named diff --git a/src/test/ui/impl-trait/no-method-suggested-traits.stderr b/src/test/ui/impl-trait/no-method-suggested-traits.stderr index f0a03e1be8..da25617e18 100644 --- a/src/test/ui/impl-trait/no-method-suggested-traits.stderr +++ b/src/test/ui/impl-trait/no-method-suggested-traits.stderr @@ -16,7 +16,7 @@ LL | use no_method_suggested_traits::qux::PrivPub; LL | use no_method_suggested_traits::Reexported; | -error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&u32>>` in the current scope +error[E0599]: no method named `method` found for struct `std::rc::Rc<&mut std::boxed::Box<&u32>>` in the current scope --> $DIR/no-method-suggested-traits.rs:26:44 | LL | std::rc::Rc::new(&mut Box::new(&1u32)).method(); @@ -46,7 +46,7 @@ help: the following trait is implemented but not in scope; perhaps add a `use` f LL | use foo::Bar; | -error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&char>>` in the current scope +error[E0599]: no method named `method` found for struct `std::rc::Rc<&mut std::boxed::Box<&char>>` in the current scope --> $DIR/no-method-suggested-traits.rs:32:43 | LL | fn method(&self) {} @@ -78,7 +78,7 @@ help: the following trait is implemented but not in scope; perhaps add a `use` f LL | use no_method_suggested_traits::foo::PubPub; | -error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&i32>>` in the current scope +error[E0599]: no method named `method` found for struct `std::rc::Rc<&mut std::boxed::Box<&i32>>` in the current scope --> $DIR/no-method-suggested-traits.rs:37:44 | LL | std::rc::Rc::new(&mut Box::new(&1i32)).method(); @@ -90,7 +90,7 @@ help: the following trait is implemented but not in scope; perhaps add a `use` f LL | use no_method_suggested_traits::foo::PubPub; | -error[E0599]: no method named `method` found for type `Foo` in the current scope +error[E0599]: no method named `method` found for struct `Foo` in the current scope --> $DIR/no-method-suggested-traits.rs:40:9 | LL | struct Foo; @@ -106,7 +106,7 @@ LL | Foo.method(); candidate #3: `no_method_suggested_traits::qux::PrivPub` candidate #4: `no_method_suggested_traits::Reexported` -error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&Foo>>` in the current scope +error[E0599]: no method named `method` found for struct `std::rc::Rc<&mut std::boxed::Box<&Foo>>` in the current scope --> $DIR/no-method-suggested-traits.rs:42:43 | LL | std::rc::Rc::new(&mut Box::new(&Foo)).method(); @@ -129,7 +129,7 @@ LL | 1u64.method2(); = note: the following trait defines an item `method2`, perhaps you need to implement it: candidate #1: `foo::Bar` -error[E0599]: no method named `method2` found for type `std::rc::Rc<&mut std::boxed::Box<&u64>>` in the current scope +error[E0599]: no method named `method2` found for struct `std::rc::Rc<&mut std::boxed::Box<&u64>>` in the current scope --> $DIR/no-method-suggested-traits.rs:47:44 | LL | std::rc::Rc::new(&mut Box::new(&1u64)).method2(); @@ -139,7 +139,7 @@ LL | std::rc::Rc::new(&mut Box::new(&1u64)).method2(); = note: the following trait defines an item `method2`, perhaps you need to implement it: candidate #1: `foo::Bar` -error[E0599]: no method named `method2` found for type `no_method_suggested_traits::Foo` in the current scope +error[E0599]: no method named `method2` found for struct `no_method_suggested_traits::Foo` in the current scope --> $DIR/no-method-suggested-traits.rs:50:37 | LL | no_method_suggested_traits::Foo.method2(); @@ -149,7 +149,7 @@ LL | no_method_suggested_traits::Foo.method2(); = note: the following trait defines an item `method2`, perhaps you need to implement it: candidate #1: `foo::Bar` -error[E0599]: no method named `method2` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Foo>>` in the current scope +error[E0599]: no method named `method2` found for struct `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Foo>>` in the current scope --> $DIR/no-method-suggested-traits.rs:52:71 | LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method2(); @@ -159,7 +159,7 @@ LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).metho = note: the following trait defines an item `method2`, perhaps you need to implement it: candidate #1: `foo::Bar` -error[E0599]: no method named `method2` found for type `no_method_suggested_traits::Bar` in the current scope +error[E0599]: no method named `method2` found for enum `no_method_suggested_traits::Bar` in the current scope --> $DIR/no-method-suggested-traits.rs:54:40 | LL | no_method_suggested_traits::Bar::X.method2(); @@ -169,7 +169,7 @@ LL | no_method_suggested_traits::Bar::X.method2(); = note: the following trait defines an item `method2`, perhaps you need to implement it: candidate #1: `foo::Bar` -error[E0599]: no method named `method2` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Bar>>` in the current scope +error[E0599]: no method named `method2` found for struct `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Bar>>` in the current scope --> $DIR/no-method-suggested-traits.rs:56:74 | LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method2(); @@ -179,7 +179,7 @@ LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).me = note: the following trait defines an item `method2`, perhaps you need to implement it: candidate #1: `foo::Bar` -error[E0599]: no method named `method3` found for type `Foo` in the current scope +error[E0599]: no method named `method3` found for struct `Foo` in the current scope --> $DIR/no-method-suggested-traits.rs:59:9 | LL | struct Foo; @@ -192,7 +192,7 @@ LL | Foo.method3(); = note: the following trait defines an item `method3`, perhaps you need to implement it: candidate #1: `no_method_suggested_traits::foo::PubPub` -error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&Foo>>` in the current scope +error[E0599]: no method named `method3` found for struct `std::rc::Rc<&mut std::boxed::Box<&Foo>>` in the current scope --> $DIR/no-method-suggested-traits.rs:61:43 | LL | std::rc::Rc::new(&mut Box::new(&Foo)).method3(); @@ -202,7 +202,7 @@ LL | std::rc::Rc::new(&mut Box::new(&Foo)).method3(); = note: the following trait defines an item `method3`, perhaps you need to implement it: candidate #1: `no_method_suggested_traits::foo::PubPub` -error[E0599]: no method named `method3` found for type `Bar` in the current scope +error[E0599]: no method named `method3` found for enum `Bar` in the current scope --> $DIR/no-method-suggested-traits.rs:63:12 | LL | enum Bar { X } @@ -215,7 +215,7 @@ LL | Bar::X.method3(); = note: the following trait defines an item `method3`, perhaps you need to implement it: candidate #1: `no_method_suggested_traits::foo::PubPub` -error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&Bar>>` in the current scope +error[E0599]: no method named `method3` found for struct `std::rc::Rc<&mut std::boxed::Box<&Bar>>` in the current scope --> $DIR/no-method-suggested-traits.rs:65:46 | LL | std::rc::Rc::new(&mut Box::new(&Bar::X)).method3(); @@ -231,31 +231,31 @@ error[E0599]: no method named `method3` found for type `usize` in the current sc LL | 1_usize.method3(); | ^^^^^^^ method not found in `usize` -error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&usize>>` in the current scope +error[E0599]: no method named `method3` found for struct `std::rc::Rc<&mut std::boxed::Box<&usize>>` in the current scope --> $DIR/no-method-suggested-traits.rs:70:47 | LL | std::rc::Rc::new(&mut Box::new(&1_usize)).method3(); | ^^^^^^^ method not found in `std::rc::Rc<&mut std::boxed::Box<&usize>>` -error[E0599]: no method named `method3` found for type `no_method_suggested_traits::Foo` in the current scope +error[E0599]: no method named `method3` found for struct `no_method_suggested_traits::Foo` in the current scope --> $DIR/no-method-suggested-traits.rs:71:37 | LL | no_method_suggested_traits::Foo.method3(); | ^^^^^^^ method not found in `no_method_suggested_traits::Foo` -error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Foo>>` in the current scope +error[E0599]: no method named `method3` found for struct `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Foo>>` in the current scope --> $DIR/no-method-suggested-traits.rs:72:71 | LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method3(); | ^^^^^^^ method not found in `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Foo>>` -error[E0599]: no method named `method3` found for type `no_method_suggested_traits::Bar` in the current scope +error[E0599]: no method named `method3` found for enum `no_method_suggested_traits::Bar` in the current scope --> $DIR/no-method-suggested-traits.rs:74:40 | LL | no_method_suggested_traits::Bar::X.method3(); | ^^^^^^^ method not found in `no_method_suggested_traits::Bar` -error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Bar>>` in the current scope +error[E0599]: no method named `method3` found for struct `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Bar>>` in the current scope --> $DIR/no-method-suggested-traits.rs:75:74 | LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method3(); diff --git a/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.rs b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.rs new file mode 100644 index 0000000000..ab3086c78b --- /dev/null +++ b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.rs @@ -0,0 +1,35 @@ +#![allow(bare_trait_objects)] +trait NotObjectSafe { + fn foo() -> Self; +} + +struct A; +struct B; + +impl NotObjectSafe for A { + fn foo() -> Self { + A + } +} + +impl NotObjectSafe for B { + fn foo() -> Self { + B + } +} + +fn car() -> dyn NotObjectSafe { //~ ERROR the trait `NotObjectSafe` cannot be made into an object + if true { + return A; + } + B +} + +fn cat() -> Box<dyn NotObjectSafe> { //~ ERROR the trait `NotObjectSafe` cannot be made into an + if true { + return Box::new(A); + } + Box::new(B) +} + +fn main() {} diff --git a/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.stderr b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.stderr new file mode 100644 index 0000000000..0c8d267c13 --- /dev/null +++ b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-dyn-trait.stderr @@ -0,0 +1,21 @@ +error[E0038]: the trait `NotObjectSafe` cannot be made into an object + --> $DIR/object-unsafe-trait-in-return-position-dyn-trait.rs:21:1 + | +LL | fn foo() -> Self; + | --- associated function `foo` has no `self` parameter +... +LL | fn car() -> dyn NotObjectSafe { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `NotObjectSafe` cannot be made into an object + +error[E0038]: the trait `NotObjectSafe` cannot be made into an object + --> $DIR/object-unsafe-trait-in-return-position-dyn-trait.rs:28:1 + | +LL | fn foo() -> Self; + | --- associated function `foo` has no `self` parameter +... +LL | fn cat() -> Box<dyn NotObjectSafe> { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `NotObjectSafe` cannot be made into an object + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0038`. diff --git a/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.rs b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.rs new file mode 100644 index 0000000000..503515013b --- /dev/null +++ b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.rs @@ -0,0 +1,46 @@ +trait NotObjectSafe { + fn foo() -> Self; +} + +trait ObjectSafe { + fn bar(&self); +} + +struct A; +struct B; + +impl NotObjectSafe for A { + fn foo() -> Self { + A + } +} + +impl NotObjectSafe for B { + fn foo() -> Self { + B + } +} + +impl ObjectSafe for A { + fn bar(&self) {} +} + +impl ObjectSafe for B { + fn bar(&self) {} +} + +fn can() -> impl NotObjectSafe { + if true { + return A; + } + B //~ ERROR mismatched types +} + +fn cat() -> impl ObjectSafe { + if true { + return A; + } + B //~ ERROR mismatched types +} + +fn main() {} diff --git a/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.stderr b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.stderr new file mode 100644 index 0000000000..dd4260fbe4 --- /dev/null +++ b/src/test/ui/impl-trait/object-unsafe-trait-in-return-position-impl-trait.stderr @@ -0,0 +1,39 @@ +error[E0308]: mismatched types + --> $DIR/object-unsafe-trait-in-return-position-impl-trait.rs:36:5 + | +LL | fn can() -> impl NotObjectSafe { + | ------------------ expected because this return type... +LL | if true { +LL | return A; + | - ...is found to be `A` here +LL | } +LL | B + | ^ expected struct `A`, found struct `B` + | + = note: to return `impl Trait`, all returned values must be of the same type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = help: if the trait `NotObjectSafe` were object safe, you could return a boxed trait object + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = help: alternatively, create a new `enum` with a variant for each returned type + +error[E0308]: mismatched types + --> $DIR/object-unsafe-trait-in-return-position-impl-trait.rs:43:5 + | +LL | fn cat() -> impl ObjectSafe { + | --------------- expected because this return type... +LL | if true { +LL | return A; + | - ...is found to be `A` here +LL | } +LL | B + | ^ expected struct `A`, found struct `B` + | + = note: to return `impl Trait`, all returned values must be of the same type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = help: you can instead return a boxed trait object using `Box<dyn ObjectSafe>` + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = help: alternatively, create a new `enum` with a variant for each returned type + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/impl-trait/recursive-impl-trait-type-indirect.stderr b/src/test/ui/impl-trait/recursive-impl-trait-type-indirect.stderr index b7ba0d6ab1..15a028f60a 100644 --- a/src/test/ui/impl-trait/recursive-impl-trait-type-indirect.stderr +++ b/src/test/ui/impl-trait/recursive-impl-trait-type-indirect.stderr @@ -76,7 +76,7 @@ error[E0720]: opaque type expands to a recursive type LL | fn generator_capture() -> impl Sized { | ^^^^^^^^^^ expands to a recursive type | - = note: expanded type is `[generator@$DIR/recursive-impl-trait-type-indirect.rs:50:5: 50:26 x:impl Sized {()}]` + = note: expanded type is `[generator@$DIR/recursive-impl-trait-type-indirect.rs:50:5: 50:26 x:impl Sized {(), ()}]` error[E0720]: opaque type expands to a recursive type --> $DIR/recursive-impl-trait-type-indirect.rs:53:26 @@ -92,7 +92,7 @@ error[E0720]: opaque type expands to a recursive type LL | fn generator_hold() -> impl Sized { | ^^^^^^^^^^ expands to a recursive type | - = note: expanded type is `[generator@$DIR/recursive-impl-trait-type-indirect.rs:58:5: 62:6 {impl Sized, ()}]` + = note: expanded type is `[generator@$DIR/recursive-impl-trait-type-indirect.rs:58:5: 62:6 {impl Sized, (), ()}]` error[E0720]: opaque type expands to a recursive type --> $DIR/recursive-impl-trait-type-indirect.rs:69:26 diff --git a/src/test/ui/impl-trait/static-return-lifetime-infered.nll.stderr b/src/test/ui/impl-trait/static-return-lifetime-infered.nll.stderr index 22f081b79f..123ea6af6b 100644 --- a/src/test/ui/impl-trait/static-return-lifetime-infered.nll.stderr +++ b/src/test/ui/impl-trait/static-return-lifetime-infered.nll.stderr @@ -6,7 +6,7 @@ LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> { | | | let's call the lifetime of this reference `'1` | -help: to allow this `impl Trait` to capture borrowed data with lifetime `'1`, add `'_` as a constraint +help: to allow this `impl Trait` to capture borrowed data with lifetime `'1`, add `'_` as a bound | LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> + '_ { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -20,7 +20,7 @@ LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> { | lifetime `'a` defined here | = help: consider replacing `'a` with `'static` -help: to allow this `impl Trait` to capture borrowed data with lifetime `'a`, add `'a` as a constraint +help: to allow this `impl Trait` to capture borrowed data with lifetime `'a`, add `'a` as a bound | LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> + 'a { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/impl-trait/static-return-lifetime-infered.stderr b/src/test/ui/impl-trait/static-return-lifetime-infered.stderr index 1d6b5f56aa..e550be1917 100644 --- a/src/test/ui/impl-trait/static-return-lifetime-infered.stderr +++ b/src/test/ui/impl-trait/static-return-lifetime-infered.stderr @@ -15,7 +15,7 @@ LL | / fn iter_values_anon(&self) -> impl Iterator<Item=u32> { LL | | self.x.iter().map(|a| a.0) LL | | } | |_____^ -help: you can add a constraint to the return type to make it last less than `'static` and match the anonymous lifetime #1 defined on the method body at 6:5 +help: you can add a bound to the return type to make it last less than `'static` and match the anonymous lifetime #1 defined on the method body at 6:5 | LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> + '_ { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -35,7 +35,7 @@ note: ...can't outlive the lifetime `'a` as defined on the method body at 10:20 | LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> { | ^^ -help: you can add a constraint to the return type to make it last less than `'static` and match the lifetime `'a` as defined on the method body at 10:20 +help: you can add a bound to the return type to make it last less than `'static` and match the lifetime `'a` as defined on the method body at 10:20 | LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> + 'a { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/import.stderr b/src/test/ui/import.stderr index 6b320b198a..5219ffacd1 100644 --- a/src/test/ui/import.stderr +++ b/src/test/ui/import.stderr @@ -13,11 +13,17 @@ error[E0432]: unresolved import `foo` LL | use foo; | ^^^ no `foo` in the root -error[E0603]: unresolved item `foo` is private +error[E0603]: unresolved item import `foo` is private --> $DIR/import.rs:15:10 | LL | zed::foo(); - | ^^^ + | ^^^ this unresolved item import is private + | +note: the unresolved item import `foo` is defined here + --> $DIR/import.rs:10:9 + | +LL | use foo; + | ^^^ error: aborting due to 3 previous errors diff --git a/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.rs b/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.rs index defa0e294b..1c0d3b4b96 100644 --- a/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.rs +++ b/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.rs @@ -1,6 +1,6 @@ extern crate self; //~ ERROR `extern crate self;` requires renaming -#[macro_use] //~ ERROR `macro_use` is not supported on `extern crate self` +#[macro_use] //~ ERROR `#[macro_use]` is not supported on `extern crate self` extern crate self as foo; fn main() {} diff --git a/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.stderr b/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.stderr index f26bb2f5a0..8f369f1b03 100644 --- a/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.stderr +++ b/src/test/ui/imports/extern-crate-self/extern-crate-self-fail.stderr @@ -4,7 +4,7 @@ error: `extern crate self;` requires renaming LL | extern crate self; | ^^^^^^^^^^^^^^^^^^ help: try: `extern crate self as name;` -error: `macro_use` is not supported on `extern crate self` +error: `#[macro_use]` is not supported on `extern crate self` --> $DIR/extern-crate-self-fail.rs:3:1 | LL | #[macro_use] diff --git a/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.rs b/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.rs index abcc92ce34..8c23def95b 100644 --- a/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.rs +++ b/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // aux-build:two_macros.rs macro_rules! define_vec { diff --git a/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.stderr b/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.stderr index 7a55abe425..245013a4ea 100644 --- a/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.stderr +++ b/src/test/ui/imports/extern-prelude-extern-crate-restricted-shadowing.stderr @@ -1,5 +1,5 @@ error: macro-expanded `extern crate` items cannot shadow names passed with `--extern` - --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:20:9 + --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:23:9 | LL | extern crate std as core; | ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -8,13 +8,13 @@ LL | define_other_core!(); | --------------------- in this macro invocation error[E0659]: `Vec` is ambiguous (macro-expanded name vs less macro-expanded name from outer scope during import/macro resolution) - --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:14:9 + --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:17:9 | LL | Vec::panic!(); | ^^^ ambiguous name | note: `Vec` could refer to the crate imported here - --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:6:9 + --> $DIR/extern-prelude-extern-crate-restricted-shadowing.rs:9:9 | LL | extern crate std as Vec; | ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/imports/import-crate-var.rs b/src/test/ui/imports/import-crate-var.rs index b9d146d373..aac5a15d3e 100644 --- a/src/test/ui/imports/import-crate-var.rs +++ b/src/test/ui/imports/import-crate-var.rs @@ -1,10 +1,8 @@ -// check-pass // aux-build:import_crate_var.rs #[macro_use] extern crate import_crate_var; fn main() { m!(); - //~^ WARN `$crate` may not be imported - //~| NOTE `use $crate;` was erroneously allowed and will become a hard error + //~^ ERROR `$crate` may not be imported } diff --git a/src/test/ui/imports/import-crate-var.stderr b/src/test/ui/imports/import-crate-var.stderr index 2f8c845156..85f15ad464 100644 --- a/src/test/ui/imports/import-crate-var.stderr +++ b/src/test/ui/imports/import-crate-var.stderr @@ -1,9 +1,10 @@ -warning: `$crate` may not be imported - --> $DIR/import-crate-var.rs:7:5 +error: `$crate` may not be imported + --> $DIR/import-crate-var.rs:6:5 | LL | m!(); | ^^^^^ | - = note: `use $crate;` was erroneously allowed and will become a hard error in a future release - = note: this warning originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: aborting due to previous error diff --git a/src/test/ui/imports/issue-55457.rs b/src/test/ui/imports/issue-55457.rs index 9c6750fd48..c1f048897d 100644 --- a/src/test/ui/imports/issue-55457.rs +++ b/src/test/ui/imports/issue-55457.rs @@ -3,6 +3,8 @@ use non_existent::non_existent; //~ ERROR unresolved import `non_existent` #[non_existent] //~ ERROR cannot determine resolution for the attribute macro `non_existent` #[derive(NonExistent)] //~ ERROR cannot determine resolution for the derive macro `NonExistent` + //~| ERROR cannot determine resolution for the derive macro `NonExistent` + //~| ERROR cannot determine resolution for the derive macro `NonExistent` struct S; fn main() {} diff --git a/src/test/ui/imports/issue-55457.stderr b/src/test/ui/imports/issue-55457.stderr index aa103ba01e..07de3d9590 100644 --- a/src/test/ui/imports/issue-55457.stderr +++ b/src/test/ui/imports/issue-55457.stderr @@ -29,6 +29,22 @@ LL | #[non_existent] | = note: import resolution is stuck, try simplifying macro imports -error: aborting due to 4 previous errors +error: cannot determine resolution for the derive macro `NonExistent` + --> $DIR/issue-55457.rs:5:10 + | +LL | #[derive(NonExistent)] + | ^^^^^^^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: cannot determine resolution for the derive macro `NonExistent` + --> $DIR/issue-55457.rs:5:10 + | +LL | #[derive(NonExistent)] + | ^^^^^^^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: aborting due to 6 previous errors For more information about this error, try `rustc --explain E0432`. diff --git a/src/test/ui/imports/issue-55884-2.rs b/src/test/ui/imports/issue-55884-2.rs index 1b4f652c9f..75bb4206f9 100644 --- a/src/test/ui/imports/issue-55884-2.rs +++ b/src/test/ui/imports/issue-55884-2.rs @@ -9,6 +9,6 @@ mod parser { use ParseOptions; } -pub use parser::ParseOptions; //~ ERROR struct `ParseOptions` is private +pub use parser::ParseOptions; //~ ERROR struct import `ParseOptions` is private fn main() {} diff --git a/src/test/ui/imports/issue-55884-2.stderr b/src/test/ui/imports/issue-55884-2.stderr index d3b43783ee..f16d2adb36 100644 --- a/src/test/ui/imports/issue-55884-2.stderr +++ b/src/test/ui/imports/issue-55884-2.stderr @@ -1,8 +1,14 @@ -error[E0603]: struct `ParseOptions` is private +error[E0603]: struct import `ParseOptions` is private --> $DIR/issue-55884-2.rs:12:17 | LL | pub use parser::ParseOptions; - | ^^^^^^^^^^^^ + | ^^^^^^^^^^^^ this struct import is private + | +note: the struct import `ParseOptions` is defined here + --> $DIR/issue-55884-2.rs:9:9 + | +LL | use ParseOptions; + | ^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/imports/local-modularized-tricky-fail-1.rs b/src/test/ui/imports/local-modularized-tricky-fail-1.rs index 29e9b8ec84..37fe0eceed 100644 --- a/src/test/ui/imports/local-modularized-tricky-fail-1.rs +++ b/src/test/ui/imports/local-modularized-tricky-fail-1.rs @@ -26,6 +26,7 @@ mod inner1 { } exported!(); //~ ERROR `exported` is ambiguous + //~| ERROR `exported` is ambiguous mod inner2 { define_exported!(); diff --git a/src/test/ui/imports/local-modularized-tricky-fail-1.stderr b/src/test/ui/imports/local-modularized-tricky-fail-1.stderr index 7d013828bd..c9498fed6a 100644 --- a/src/test/ui/imports/local-modularized-tricky-fail-1.stderr +++ b/src/test/ui/imports/local-modularized-tricky-fail-1.stderr @@ -21,8 +21,31 @@ LL | use inner1::*; | ^^^^^^^^^ = help: consider adding an explicit import of `exported` to disambiguate +error[E0659]: `exported` is ambiguous (glob import vs macro-expanded name in the same module during import/macro resolution) + --> $DIR/local-modularized-tricky-fail-1.rs:28:1 + | +LL | exported!(); + | ^^^^^^^^ ambiguous name + | +note: `exported` could refer to the macro defined here + --> $DIR/local-modularized-tricky-fail-1.rs:5:5 + | +LL | / macro_rules! exported { +LL | | () => () +LL | | } + | |_____^ +... +LL | define_exported!(); + | ------------------- in this macro invocation +note: `exported` could also refer to the macro imported here + --> $DIR/local-modularized-tricky-fail-1.rs:22:5 + | +LL | use inner1::*; + | ^^^^^^^^^ + = help: consider adding an explicit import of `exported` to disambiguate + error[E0659]: `panic` is ambiguous (macro-expanded name vs less macro-expanded name from outer scope during import/macro resolution) - --> $DIR/local-modularized-tricky-fail-1.rs:35:5 + --> $DIR/local-modularized-tricky-fail-1.rs:36:5 | LL | panic!(); | ^^^^^ ambiguous name @@ -41,7 +64,7 @@ LL | define_panic!(); = help: use `crate::panic` to refer to this macro unambiguously error[E0659]: `include` is ambiguous (macro-expanded name vs less macro-expanded name from outer scope during import/macro resolution) - --> $DIR/local-modularized-tricky-fail-1.rs:46:1 + --> $DIR/local-modularized-tricky-fail-1.rs:47:1 | LL | include!(); | ^^^^^^^ ambiguous name @@ -59,6 +82,6 @@ LL | define_include!(); | ------------------ in this macro invocation = help: use `crate::include` to refer to this macro unambiguously -error: aborting due to 3 previous errors +error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/macros.rs b/src/test/ui/imports/macros.rs index f2a22ad620..f39711898c 100644 --- a/src/test/ui/imports/macros.rs +++ b/src/test/ui/imports/macros.rs @@ -14,6 +14,7 @@ mod m1 { mod m2 { use two_macros::*; m! { //~ ERROR ambiguous + //~| ERROR ambiguous use foo::m; } } diff --git a/src/test/ui/imports/macros.stderr b/src/test/ui/imports/macros.stderr index 3b9e6feebd..27b34fe0c0 100644 --- a/src/test/ui/imports/macros.stderr +++ b/src/test/ui/imports/macros.stderr @@ -5,7 +5,25 @@ LL | m! { | ^ ambiguous name | note: `m` could refer to the macro imported here - --> $DIR/macros.rs:17:13 + --> $DIR/macros.rs:18:13 + | +LL | use foo::m; + | ^^^^^^ +note: `m` could also refer to the macro imported here + --> $DIR/macros.rs:15:9 + | +LL | use two_macros::*; + | ^^^^^^^^^^^^^ + = help: consider adding an explicit import of `m` to disambiguate + +error[E0659]: `m` is ambiguous (glob import vs macro-expanded name in the same module during import/macro resolution) + --> $DIR/macros.rs:16:5 + | +LL | m! { + | ^ ambiguous name + | +note: `m` could refer to the macro imported here + --> $DIR/macros.rs:18:13 | LL | use foo::m; | ^^^^^^ @@ -17,23 +35,23 @@ LL | use two_macros::*; = help: consider adding an explicit import of `m` to disambiguate error[E0659]: `m` is ambiguous (macro-expanded name vs less macro-expanded name from outer scope during import/macro resolution) - --> $DIR/macros.rs:29:9 + --> $DIR/macros.rs:30:9 | LL | m! { | ^ ambiguous name | note: `m` could refer to the macro imported here - --> $DIR/macros.rs:30:17 + --> $DIR/macros.rs:31:17 | LL | use two_macros::n as m; | ^^^^^^^^^^^^^^^^^^ note: `m` could also refer to the macro imported here - --> $DIR/macros.rs:22:9 + --> $DIR/macros.rs:23:9 | LL | use two_macros::m; | ^^^^^^^^^^^^^ = help: use `self::m` to refer to this macro unambiguously -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/imports/reexports.stderr b/src/test/ui/imports/reexports.stderr index 4388e2c276..b173884080 100644 --- a/src/test/ui/imports/reexports.stderr +++ b/src/test/ui/imports/reexports.stderr @@ -10,17 +10,29 @@ note: consider marking `foo` as `pub` in the imported module LL | pub use super::foo; | ^^^^^^^^^^ -error[E0603]: module `foo` is private +error[E0603]: module import `foo` is private --> $DIR/reexports.rs:33:15 | LL | use b::a::foo::S; - | ^^^ + | ^^^ this module import is private + | +note: the module import `foo` is defined here + --> $DIR/reexports.rs:21:17 + | +LL | pub use super::foo; // This is OK since the value `foo` is visible enough. + | ^^^^^^^^^^ -error[E0603]: module `foo` is private +error[E0603]: module import `foo` is private --> $DIR/reexports.rs:34:15 | LL | use b::b::foo::S as T; - | ^^^ + | ^^^ this module import is private + | +note: the module import `foo` is defined here + --> $DIR/reexports.rs:26:17 + | +LL | pub use super::*; // This is also OK since the value `foo` is visible enough. + | ^^^^^^^^ warning: glob import doesn't reexport anything because no candidate is public enough --> $DIR/reexports.rs:9:17 diff --git a/src/test/ui/imports/unresolved-imports-used.stderr b/src/test/ui/imports/unresolved-imports-used.stderr index b341e8e059..d7280d2583 100644 --- a/src/test/ui/imports/unresolved-imports-used.stderr +++ b/src/test/ui/imports/unresolved-imports-used.stderr @@ -38,7 +38,13 @@ error[E0603]: function `quz` is private --> $DIR/unresolved-imports-used.rs:9:10 | LL | use qux::quz; - | ^^^ + | ^^^ this function is private + | +note: the function `quz` is defined here + --> $DIR/unresolved-imports-used.rs:5:4 + | +LL | fn quz() {} + | ^^^^^^^^ error: unused import: `qux::quy` --> $DIR/unresolved-imports-used.rs:16:5 diff --git a/src/test/ui/impossible_range.rs b/src/test/ui/impossible_range.rs index 6345af0011..21e5c03eb1 100644 --- a/src/test/ui/impossible_range.rs +++ b/src/test/ui/impossible_range.rs @@ -1,4 +1,4 @@ -// Make sure that invalid ranges generate an error during HIR lowering, not an ICE +// Make sure that invalid ranges generate an error during parsing, not an ICE pub fn main() { ..; @@ -6,12 +6,12 @@ pub fn main() { ..1; 0..1; ..=; //~ERROR inclusive range with no end - //~^HELP bounded at the end + //~^HELP use `..` instead } fn _foo1() { ..=1; 0..=1; 0..=; //~ERROR inclusive range with no end - //~^HELP bounded at the end + //~^HELP use `..` instead } diff --git a/src/test/ui/impossible_range.stderr b/src/test/ui/impossible_range.stderr index 091fe37c7a..ea2ab0f299 100644 --- a/src/test/ui/impossible_range.stderr +++ b/src/test/ui/impossible_range.stderr @@ -1,18 +1,18 @@ error[E0586]: inclusive range with no end - --> $DIR/impossible_range.rs:8:8 + --> $DIR/impossible_range.rs:8:5 | LL | ..=; - | ^ + | ^^^ help: use `..` instead | - = help: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) error[E0586]: inclusive range with no end - --> $DIR/impossible_range.rs:15:9 + --> $DIR/impossible_range.rs:15:6 | LL | 0..=; - | ^ + | ^^^ help: use `..` instead | - = help: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) error: aborting due to 2 previous errors diff --git a/src/test/ui/in-band-lifetimes/issue-61124-anon-lifetime-in-struct-declaration.stderr b/src/test/ui/in-band-lifetimes/issue-61124-anon-lifetime-in-struct-declaration.stderr index 9579abb76b..5f101a24c1 100644 --- a/src/test/ui/in-band-lifetimes/issue-61124-anon-lifetime-in-struct-declaration.stderr +++ b/src/test/ui/in-band-lifetimes/issue-61124-anon-lifetime-in-struct-declaration.stderr @@ -2,7 +2,12 @@ error[E0106]: missing lifetime specifier --> $DIR/issue-61124-anon-lifetime-in-struct-declaration.rs:8:19 | LL | struct Heartbreak(Betrayal); - | ^^^^^^^^ expected lifetime parameter + | ^^^^^^^^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | struct Heartbreak<'lifetime>(Betrayal<'lifetime>); + | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.rs b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.rs index 369de04007..b07a7f107d 100644 --- a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.rs +++ b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl use std::ops::Deref; trait Trait {} diff --git a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr index 8086d3f1fb..374e308a63 100644 --- a/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr +++ b/src/test/ui/in-band-lifetimes/mismatched_trait_impl-2.stderr @@ -1,5 +1,5 @@ error: `impl` item signature doesn't match `trait` item signature - --> $DIR/mismatched_trait_impl-2.rs:9:5 + --> $DIR/mismatched_trait_impl-2.rs:12:5 | LL | fn deref(&self) -> &dyn Trait { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found fn(&Struct) -> &dyn Trait diff --git a/src/test/ui/in-band-lifetimes/no_in_band_in_struct.stderr b/src/test/ui/in-band-lifetimes/no_in_band_in_struct.stderr index a270dd0392..fe656f7af7 100644 --- a/src/test/ui/in-band-lifetimes/no_in_band_in_struct.stderr +++ b/src/test/ui/in-band-lifetimes/no_in_band_in_struct.stderr @@ -1,12 +1,16 @@ error[E0261]: use of undeclared lifetime name `'test` --> $DIR/no_in_band_in_struct.rs:5:9 | +LL | struct Foo { + | - help: consider introducing lifetime `'test` here: `<'test>` LL | x: &'test u32, | ^^^^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'test` --> $DIR/no_in_band_in_struct.rs:9:10 | +LL | enum Bar { + | - help: consider introducing lifetime `'test` here: `<'test>` LL | Baz(&'test u32), | ^^^^^ undeclared lifetime diff --git a/src/test/ui/in-band-lifetimes/no_introducing_in_band_in_locals.stderr b/src/test/ui/in-band-lifetimes/no_introducing_in_band_in_locals.stderr index c307066be6..bfb20ade03 100644 --- a/src/test/ui/in-band-lifetimes/no_introducing_in_band_in_locals.stderr +++ b/src/test/ui/in-band-lifetimes/no_introducing_in_band_in_locals.stderr @@ -1,6 +1,8 @@ error[E0261]: use of undeclared lifetime name `'test` --> $DIR/no_introducing_in_band_in_locals.rs:5:13 | +LL | fn foo(x: &u32) { + | - help: consider introducing lifetime `'test` here: `<'test>` LL | let y: &'test u32 = x; | ^^^^^ undeclared lifetime diff --git a/src/test/ui/inference/inference_unstable_featured.stderr b/src/test/ui/inference/inference_unstable_featured.stderr index b06a6298a5..fa908440e4 100644 --- a/src/test/ui/inference/inference_unstable_featured.stderr +++ b/src/test/ui/inference/inference_unstable_featured.stderr @@ -5,9 +5,15 @@ LL | assert_eq!('x'.ipu_flatten(), 0); | ^^^^^^^^^^^ multiple `ipu_flatten` found | = note: candidate #1 is defined in an impl of the trait `inference_unstable_iterator::IpuIterator` for the type `char` - = help: to disambiguate the method call, write `inference_unstable_iterator::IpuIterator::ipu_flatten('x')` instead = note: candidate #2 is defined in an impl of the trait `inference_unstable_itertools::IpuItertools` for the type `char` - = help: to disambiguate the method call, write `inference_unstable_itertools::IpuItertools::ipu_flatten('x')` instead +help: disambiguate the method call for candidate #1 + | +LL | assert_eq!(inference_unstable_iterator::IpuIterator::ipu_flatten(&'x'), 0); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | assert_eq!(inference_unstable_itertools::IpuItertools::ipu_flatten(&'x'), 0); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/infinite/infinite-autoderef.stderr b/src/test/ui/infinite/infinite-autoderef.stderr index f4567554d0..8c59fbd530 100644 --- a/src/test/ui/infinite/infinite-autoderef.stderr +++ b/src/test/ui/infinite/infinite-autoderef.stderr @@ -37,7 +37,7 @@ LL | Foo.bar(); | = help: consider adding a `#![recursion_limit="256"]` attribute to your crate -error[E0599]: no method named `bar` found for type `Foo` in the current scope +error[E0599]: no method named `bar` found for struct `Foo` in the current scope --> $DIR/infinite-autoderef.rs:26:9 | LL | struct Foo; diff --git a/src/test/ui/infinite/infinite-instantiation.rs b/src/test/ui/infinite/infinite-instantiation.rs index 4220c8837d..6f53680f7c 100644 --- a/src/test/ui/infinite/infinite-instantiation.rs +++ b/src/test/ui/infinite/infinite-instantiation.rs @@ -4,6 +4,8 @@ // so for now just live with it. // This test case was originally for issue #2258. +// build-fail + trait ToOpt: Sized { fn to_option(&self) -> Option<Self>; } diff --git a/src/test/ui/infinite/infinite-instantiation.stderr b/src/test/ui/infinite/infinite-instantiation.stderr index d75dc0403a..ae81c680a7 100644 --- a/src/test/ui/infinite/infinite-instantiation.stderr +++ b/src/test/ui/infinite/infinite-instantiation.stderr @@ -1,5 +1,5 @@ error: reached the recursion limit while instantiating `function::<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<usize>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>` - --> $DIR/infinite-instantiation.rs:23:1 + --> $DIR/infinite-instantiation.rs:25:1 | LL | / fn function<T:ToOpt + Clone>(counter: usize, t: T) { LL | | diff --git a/src/test/ui/infinite/infinite-macro-expansion.rs b/src/test/ui/infinite/infinite-macro-expansion.rs index 968d8360bb..6ea0bc73dc 100644 --- a/src/test/ui/infinite/infinite-macro-expansion.rs +++ b/src/test/ui/infinite/infinite-macro-expansion.rs @@ -1,5 +1,5 @@ macro_rules! recursive { - () => (recursive!()) //~ ERROR recursion limit reached while expanding the macro `recursive` + () => (recursive!()) //~ ERROR recursion limit reached while expanding `recursive!` } fn main() { diff --git a/src/test/ui/infinite/infinite-macro-expansion.stderr b/src/test/ui/infinite/infinite-macro-expansion.stderr index 0c0c659676..159312e5c1 100644 --- a/src/test/ui/infinite/infinite-macro-expansion.stderr +++ b/src/test/ui/infinite/infinite-macro-expansion.stderr @@ -1,4 +1,4 @@ -error: recursion limit reached while expanding the macro `recursive` +error: recursion limit reached while expanding `recursive!` --> $DIR/infinite-macro-expansion.rs:2:12 | LL | () => (recursive!()) diff --git a/src/test/ui/inline-asm-bad-constraint.rs b/src/test/ui/inline-asm-bad-constraint.rs index cf72afff50..04fd5760cf 100644 --- a/src/test/ui/inline-asm-bad-constraint.rs +++ b/src/test/ui/inline-asm-bad-constraint.rs @@ -1,5 +1,6 @@ // Test that the compiler will catch invalid inline assembly constraints. +// build-fail // ignore-emscripten #![feature(asm)] diff --git a/src/test/ui/inline-asm-bad-constraint.stderr b/src/test/ui/inline-asm-bad-constraint.stderr index 59066e5e7f..f38bfb2af1 100644 --- a/src/test/ui/inline-asm-bad-constraint.stderr +++ b/src/test/ui/inline-asm-bad-constraint.stderr @@ -1,17 +1,17 @@ error[E0668]: malformed inline assembly - --> $DIR/inline-asm-bad-constraint.rs:21:9 + --> $DIR/inline-asm-bad-constraint.rs:22:9 | LL | asm!("" :"={rax"(rax)) | ^^^^^^^^^^^^^^^^^^^^^^ error[E0668]: malformed inline assembly - --> $DIR/inline-asm-bad-constraint.rs:29:9 + --> $DIR/inline-asm-bad-constraint.rs:30:9 | LL | asm!("callq $0" : : "0"(foo)) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0668]: malformed inline assembly - --> $DIR/inline-asm-bad-constraint.rs:36:9 + --> $DIR/inline-asm-bad-constraint.rs:37:9 | LL | asm!("addb $1, $0" : "={rax}"((0i32, rax))); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/inline-asm-bad-operand.rs b/src/test/ui/inline-asm-bad-operand.rs index 4cfe100d85..f4e9922164 100644 --- a/src/test/ui/inline-asm-bad-operand.rs +++ b/src/test/ui/inline-asm-bad-operand.rs @@ -1,6 +1,7 @@ // Test that the compiler will catch passing invalid values to inline assembly // operands. +// build-fail // ignore-emscripten #![feature(asm)] diff --git a/src/test/ui/inline-asm-bad-operand.stderr b/src/test/ui/inline-asm-bad-operand.stderr index b8e7e9acfe..fe6c6c9914 100644 --- a/src/test/ui/inline-asm-bad-operand.stderr +++ b/src/test/ui/inline-asm-bad-operand.stderr @@ -1,41 +1,41 @@ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:21:24 + --> $DIR/inline-asm-bad-operand.rs:22:24 | LL | asm!("" :: "r"("")); | ^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:26:32 + --> $DIR/inline-asm-bad-operand.rs:27:32 | LL | asm!("ret" : : "{rdi}"(target)); | ^^^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:33:29 + --> $DIR/inline-asm-bad-operand.rs:34:29 | LL | unsafe { asm!("" :: "i"(hello)) }; | ^^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:41:38 + --> $DIR/inline-asm-bad-operand.rs:42:38 | LL | asm!("movups $1, %xmm0"::"m"(arr)); | ^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:48:32 + --> $DIR/inline-asm-bad-operand.rs:49:32 | LL | asm!("mov sp, $0"::"r"(addr)); | ^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:55:32 + --> $DIR/inline-asm-bad-operand.rs:56:32 | LL | asm!("mov sp, $0"::"r"(addr), | ^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:56:32 + --> $DIR/inline-asm-bad-operand.rs:57:32 | LL | ... "r"("hello e0669")); | ^^^^^^^^^^^^^ diff --git a/src/test/ui/interior-mutability/interior-mutability.rs b/src/test/ui/interior-mutability/interior-mutability.rs index 60633fdd39..e6586de4ab 100644 --- a/src/test/ui/interior-mutability/interior-mutability.rs +++ b/src/test/ui/interior-mutability/interior-mutability.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl use std::cell::Cell; use std::panic::catch_unwind; fn main() { diff --git a/src/test/ui/interior-mutability/interior-mutability.stderr b/src/test/ui/interior-mutability/interior-mutability.stderr index 5c129524f5..2378e41217 100644 --- a/src/test/ui/interior-mutability/interior-mutability.stderr +++ b/src/test/ui/interior-mutability/interior-mutability.stderr @@ -1,5 +1,5 @@ error[E0277]: the type `std::cell::UnsafeCell<i32>` may contain interior mutability and a reference may not be safely transferrable across a catch_unwind boundary - --> $DIR/interior-mutability.rs:6:5 + --> $DIR/interior-mutability.rs:9:5 | LL | catch_unwind(|| { x.set(23); }); | ^^^^^^^^^^^^ `std::cell::UnsafeCell<i32>` may contain interior mutability and a reference may not be safely transferrable across a catch_unwind boundary @@ -12,7 +12,7 @@ LL | pub fn catch_unwind<F: FnOnce() -> R + UnwindSafe, R>(f: F) -> Result<R> { = help: within `std::cell::Cell<i32>`, the trait `std::panic::RefUnwindSafe` is not implemented for `std::cell::UnsafeCell<i32>` = note: required because it appears within the type `std::cell::Cell<i32>` = note: required because of the requirements on the impl of `std::panic::UnwindSafe` for `&std::cell::Cell<i32>` - = note: required because it appears within the type `[closure@$DIR/interior-mutability.rs:6:18: 6:35 x:&std::cell::Cell<i32>]` + = note: required because it appears within the type `[closure@$DIR/interior-mutability.rs:9:18: 9:35 x:&std::cell::Cell<i32>]` error: aborting due to previous error diff --git a/src/test/ui/internal/auxiliary/internal_unstable.rs b/src/test/ui/internal/auxiliary/internal_unstable.rs index 7c79dcb752..148cbd1899 100644 --- a/src/test/ui/internal/auxiliary/internal_unstable.rs +++ b/src/test/ui/internal/auxiliary/internal_unstable.rs @@ -1,24 +1,24 @@ #![feature(staged_api, allow_internal_unstable)] #![stable(feature = "stable", since = "1.0.0")] -#[unstable(feature = "function", issue = "0")] +#[unstable(feature = "function", issue = "none")] pub fn unstable() {} #[stable(feature = "stable", since = "1.0.0")] pub struct Foo { - #[unstable(feature = "struct_field", issue = "0")] + #[unstable(feature = "struct_field", issue = "none")] pub x: u8 } impl Foo { - #[unstable(feature = "method", issue = "0")] + #[unstable(feature = "method", issue = "none")] pub fn method(&self) {} } #[stable(feature = "stable", since = "1.0.0")] pub struct Bar { - #[unstable(feature = "struct2_field", issue = "0")] + #[unstable(feature = "struct2_field", issue = "none")] pub x: u8 } diff --git a/src/test/ui/internal/internal-unstable-const.rs b/src/test/ui/internal/internal-unstable-const.rs new file mode 100644 index 0000000000..ce306c8451 --- /dev/null +++ b/src/test/ui/internal/internal-unstable-const.rs @@ -0,0 +1,10 @@ +#![feature(staged_api)] +#![feature(const_if_match)] + +#[stable(feature = "rust1", since = "1.0.0")] +#[rustc_const_stable(feature = "rust1", since = "1.0.0")] +const fn foo() -> i32 { + if true { 4 } else { 5 } //~ loops and conditional expressions are not stable in const fn +} + +fn main() {} diff --git a/src/test/ui/internal/internal-unstable-const.stderr b/src/test/ui/internal/internal-unstable-const.stderr new file mode 100644 index 0000000000..58bbe798b0 --- /dev/null +++ b/src/test/ui/internal/internal-unstable-const.stderr @@ -0,0 +1,12 @@ +error[E0723]: loops and conditional expressions are not stable in const fn + --> $DIR/internal-unstable-const.rs:7:5 + | +LL | if true { 4 } else { 5 } + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see issue https://github.com/rust-lang/rust/issues/57563 + = help: add `#![feature(const_fn)]` to the crate attributes to enable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0723`. diff --git a/src/test/ui/invalid/invalid-variadic-function.rs b/src/test/ui/invalid/invalid-variadic-function.rs deleted file mode 100644 index 8d23f0e477..0000000000 --- a/src/test/ui/invalid/invalid-variadic-function.rs +++ /dev/null @@ -1,3 +0,0 @@ -extern "C" fn foo(x: u8, ...); -//~^ ERROR only foreign functions are allowed to be C-variadic -//~| ERROR expected one of `->`, `where`, or `{`, found `;` diff --git a/src/test/ui/invalid/invalid-variadic-function.stderr b/src/test/ui/invalid/invalid-variadic-function.stderr deleted file mode 100644 index 7e58b17e7d..0000000000 --- a/src/test/ui/invalid/invalid-variadic-function.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error[E0743]: only foreign functions are allowed to be C-variadic - --> $DIR/invalid-variadic-function.rs:1:26 - | -LL | extern "C" fn foo(x: u8, ...); - | ^^^ - -error: expected one of `->`, `where`, or `{`, found `;` - --> $DIR/invalid-variadic-function.rs:1:30 - | -LL | extern "C" fn foo(x: u8, ...); - | ^ expected one of `->`, `where`, or `{` - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0743`. diff --git a/src/test/ui/invalid_const_promotion.rs b/src/test/ui/invalid_const_promotion.rs deleted file mode 100644 index 5d7664cefb..0000000000 --- a/src/test/ui/invalid_const_promotion.rs +++ /dev/null @@ -1,61 +0,0 @@ -// run-pass - -#![allow(unused_mut)] -// ignore-wasm32 -// ignore-emscripten -// ignore-sgx no processes - -// compile-flags: -C debug_assertions=yes - -#![stable(feature = "rustc", since = "1.0.0")] -#![feature(const_fn, rustc_private, staged_api, rustc_attrs)] -#![allow(const_err)] - -extern crate libc; - -use std::env; -use std::process::{Command, Stdio}; - -// this will panic in debug mode and overflow in release mode -// -// NB we give bar an unused argument because otherwise memoization -// of the const fn kicks in, causing a different code path in the -// compiler to be executed (see PR #66294). -#[stable(feature = "rustc", since = "1.0.0")] -#[rustc_const_stable(feature = "rustc", since = "1.0.0")] -#[rustc_promotable] -const fn bar(_: bool) -> usize { 0 - 1 } - -fn foo() { - let _: &'static _ = &bar(true); -} - -#[cfg(unix)] -fn check_status(status: std::process::ExitStatus) -{ - use std::os::unix::process::ExitStatusExt; - - assert!(status.signal() == Some(libc::SIGILL) - || status.signal() == Some(libc::SIGTRAP) - || status.signal() == Some(libc::SIGABRT)); -} - -#[cfg(not(unix))] -fn check_status(status: std::process::ExitStatus) -{ - assert!(!status.success()); -} - -fn main() { - let args: Vec<String> = env::args().collect(); - if args.len() > 1 && args[1] == "test" { - foo(); - return; - } - - let mut p = Command::new(&args[0]) - .stdout(Stdio::piped()) - .stdin(Stdio::piped()) - .arg("test").output().unwrap(); - check_status(p.status); -} diff --git a/src/test/ui/issues/auxiliary/issue-52489.rs b/src/test/ui/issues/auxiliary/issue-52489.rs index c649930c2b..f53bf7db52 100644 --- a/src/test/ui/issues/auxiliary/issue-52489.rs +++ b/src/test/ui/issues/auxiliary/issue-52489.rs @@ -1,3 +1,3 @@ #![crate_type = "lib"] -#![unstable(feature = "issue_52489_unstable", issue = "0")] +#![unstable(feature = "issue_52489_unstable", issue = "none")] #![feature(staged_api)] diff --git a/src/test/ui/issues/auxiliary/lint-stability.rs b/src/test/ui/issues/auxiliary/lint-stability.rs index 3188d706ab..de4058887c 100644 --- a/src/test/ui/issues/auxiliary/lint-stability.rs +++ b/src/test/ui/issues/auxiliary/lint-stability.rs @@ -15,16 +15,16 @@ pub fn deprecated_text() {} #[rustc_deprecated(since = "99.99.99", reason = "text")] pub fn deprecated_future() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_unstable() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_unstable_text() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} -#[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] +#[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -43,16 +43,16 @@ impl MethodTester { #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_unstable_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -70,16 +70,16 @@ pub trait Trait { #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_unstable_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -90,7 +90,7 @@ pub trait Trait { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub trait TraitWithAssociatedTypes { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] type TypeUnstable = u8; #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] @@ -100,7 +100,7 @@ pub trait TraitWithAssociatedTypes { #[stable(feature = "stable_test_feature", since = "1.0.0")] impl Trait for MethodTester {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub trait UnstableTrait { fn dummy(&self) { } } #[stable(feature = "stable_test_feature", since = "1.0.0")] @@ -114,12 +114,12 @@ pub trait DeprecatedTrait { pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } @@ -127,7 +127,7 @@ pub struct UnstableStruct { pub struct StableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub enum UnstableEnum {} #[stable(feature = "rust1", since = "1.0.0")] pub enum StableEnum {} @@ -135,10 +135,10 @@ pub enum StableEnum {} #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableUnitStruct; -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; @@ -148,10 +148,10 @@ pub enum Enum { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedUnstableVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] @@ -161,10 +161,10 @@ pub enum Enum { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); diff --git a/src/test/ui/issues/issue-10465.stderr b/src/test/ui/issues/issue-10465.stderr index 80ca051cef..666fb6ab2b 100644 --- a/src/test/ui/issues/issue-10465.stderr +++ b/src/test/ui/issues/issue-10465.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `foo` found for type `&b::B` in the current scope +error[E0599]: no method named `foo` found for reference `&b::B` in the current scope --> $DIR/issue-10465.rs:17:15 | LL | b.foo(); diff --git a/src/test/ui/issues/issue-10545.stderr b/src/test/ui/issues/issue-10545.stderr index 59d4fedcd2..4ed7028c0a 100644 --- a/src/test/ui/issues/issue-10545.stderr +++ b/src/test/ui/issues/issue-10545.stderr @@ -2,7 +2,13 @@ error[E0603]: struct `S` is private --> $DIR/issue-10545.rs:6:14 | LL | fn foo(_: a::S) { - | ^ + | ^ this struct is private + | +note: the struct `S` is defined here + --> $DIR/issue-10545.rs:2:5 + | +LL | struct S; + | ^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-11154.rs b/src/test/ui/issues/issue-11154.rs index 7513abd8a5..e11cdc82f3 100644 --- a/src/test/ui/issues/issue-11154.rs +++ b/src/test/ui/issues/issue-11154.rs @@ -1,3 +1,4 @@ +// build-fail // compile-flags: -C lto -C prefer-dynamic // error-pattern: cannot prefer dynamic linking diff --git a/src/test/ui/issues/issue-11319.rs b/src/test/ui/issues/issue-11319.rs index 8c2bafe63b..ab69ab250f 100644 --- a/src/test/ui/issues/issue-11319.rs +++ b/src/test/ui/issues/issue-11319.rs @@ -6,7 +6,7 @@ fn main() { Some(2) => true, //~^ NOTE this is found to be of type `bool` None => (), - //~^ ERROR match arms have incompatible types + //~^ ERROR `match` arms have incompatible types //~| NOTE expected `bool`, found `()` _ => true } diff --git a/src/test/ui/issues/issue-11319.stderr b/src/test/ui/issues/issue-11319.stderr index 7663a32883..fc44205e81 100644 --- a/src/test/ui/issues/issue-11319.stderr +++ b/src/test/ui/issues/issue-11319.stderr @@ -1,4 +1,4 @@ -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/issue-11319.rs:8:20 | LL | / match Some(10) { diff --git a/src/test/ui/issues/issue-11593.stderr b/src/test/ui/issues/issue-11593.stderr index c3e4412b04..bfb4d31323 100644 --- a/src/test/ui/issues/issue-11593.stderr +++ b/src/test/ui/issues/issue-11593.stderr @@ -2,7 +2,13 @@ error[E0603]: trait `Foo` is private --> $DIR/issue-11593.rs:7:24 | LL | impl private_trait_xc::Foo for Bar {} - | ^^^ + | ^^^ this trait is private + | +note: the trait `Foo` is defined here + --> $DIR/auxiliary/private-trait-xc.rs:1:1 + | +LL | trait Foo {} + | ^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-11680.stderr b/src/test/ui/issues/issue-11680.stderr index 35cb247699..898ac10f7d 100644 --- a/src/test/ui/issues/issue-11680.stderr +++ b/src/test/ui/issues/issue-11680.stderr @@ -2,13 +2,25 @@ error[E0603]: enum `Foo` is private --> $DIR/issue-11680.rs:6:21 | LL | let _b = other::Foo::Bar(1); - | ^^^ + | ^^^ this enum is private + | +note: the enum `Foo` is defined here + --> $DIR/auxiliary/issue-11680.rs:1:1 + | +LL | enum Foo { + | ^^^^^^^^ error[E0603]: enum `Foo` is private --> $DIR/issue-11680.rs:9:27 | LL | let _b = other::test::Foo::Bar(1); - | ^^^ + | ^^^ this enum is private + | +note: the enum `Foo` is defined here + --> $DIR/auxiliary/issue-11680.rs:6:5 + | +LL | enum Foo { + | ^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-11844.stderr b/src/test/ui/issues/issue-11844.stderr index 1b22d6f45c..57533ba5e3 100644 --- a/src/test/ui/issues/issue-11844.stderr +++ b/src/test/ui/issues/issue-11844.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-11844.rs:6:9 | LL | match a { - | - this match expression has type `std::option::Option<std::boxed::Box<{integer}>>` + | - this expression has type `std::option::Option<std::boxed::Box<{integer}>>` LL | Ok(a) => | ^^^^^ expected enum `std::option::Option`, found enum `std::result::Result` | diff --git a/src/test/ui/issues/issue-12028.stderr b/src/test/ui/issues/issue-12028.stderr index 5f2dd729c7..fe7e8f89f7 100644 --- a/src/test/ui/issues/issue-12028.stderr +++ b/src/test/ui/issues/issue-12028.stderr @@ -2,7 +2,7 @@ error[E0284]: type annotations needed --> $DIR/issue-12028.rs:27:14 | LL | self.input_stream(&mut stream); - | ^^^^^^^^^^^^ cannot infer type for type parameter `H` + | ^^^^^^^^^^^^ cannot infer type for type parameter `H` declared on the trait `StreamHash` | = note: cannot resolve `<_ as StreamHasher>::S == <H as StreamHasher>::S` diff --git a/src/test/ui/issues/issue-12369.rs b/src/test/ui/issues/issue-12369.rs index 0866131807..0481c1fd9e 100644 --- a/src/test/ui/issues/issue-12369.rs +++ b/src/test/ui/issues/issue-12369.rs @@ -1,4 +1,3 @@ -#![feature(slice_patterns)] #![deny(unreachable_patterns)] fn main() { diff --git a/src/test/ui/issues/issue-12369.stderr b/src/test/ui/issues/issue-12369.stderr index f27425e28c..754b94bab7 100644 --- a/src/test/ui/issues/issue-12369.stderr +++ b/src/test/ui/issues/issue-12369.stderr @@ -1,11 +1,11 @@ error: unreachable pattern - --> $DIR/issue-12369.rs:10:9 + --> $DIR/issue-12369.rs:9:9 | LL | &[10,a, ref rest @ ..] => 10 | ^^^^^^^^^^^^^^^^^^^^^^ | note: lint level defined here - --> $DIR/issue-12369.rs:2:9 + --> $DIR/issue-12369.rs:1:9 | LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/issues/issue-12552.stderr b/src/test/ui/issues/issue-12552.stderr index ecafef259d..60c4cceac5 100644 --- a/src/test/ui/issues/issue-12552.stderr +++ b/src/test/ui/issues/issue-12552.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-12552.rs:6:5 | LL | match t { - | - this match expression has type `std::result::Result<_, {integer}>` + | - this expression has type `std::result::Result<_, {integer}>` LL | Some(k) => match k { | ^^^^^^^ expected enum `std::result::Result`, found enum `std::option::Option` | diff --git a/src/test/ui/issues/issue-12567.rs b/src/test/ui/issues/issue-12567.rs index 643d9a2fc6..1b2a37de47 100644 --- a/src/test/ui/issues/issue-12567.rs +++ b/src/test/ui/issues/issue-12567.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn match_vecs<'a, T>(l1: &'a [T], l2: &'a [T]) { match (l1, l2) { //~^ ERROR: cannot move out of type `[T]`, a non-copy slice diff --git a/src/test/ui/issues/issue-12567.stderr b/src/test/ui/issues/issue-12567.stderr index 9d9a88f4f9..2a88d8f052 100644 --- a/src/test/ui/issues/issue-12567.stderr +++ b/src/test/ui/issues/issue-12567.stderr @@ -1,5 +1,5 @@ error[E0508]: cannot move out of type `[T]`, a non-copy slice - --> $DIR/issue-12567.rs:4:11 + --> $DIR/issue-12567.rs:2:11 | LL | match (l1, l2) { | ^^^^^^^^ cannot move out of here @@ -13,7 +13,7 @@ LL | (&[hd1, ..], &[hd2, ..]) = note: move occurs because these variables have types that don't implement the `Copy` trait error[E0508]: cannot move out of type `[T]`, a non-copy slice - --> $DIR/issue-12567.rs:4:11 + --> $DIR/issue-12567.rs:2:11 | LL | match (l1, l2) { | ^^^^^^^^ cannot move out of here diff --git a/src/test/ui/issues/issue-13407.rs b/src/test/ui/issues/issue-13407.rs index 322e67cc13..fa53d55f5b 100644 --- a/src/test/ui/issues/issue-13407.rs +++ b/src/test/ui/issues/issue-13407.rs @@ -4,7 +4,7 @@ mod A { fn main() { A::C = 1; - //~^ ERROR: invalid left-hand side expression + //~^ ERROR: invalid left-hand side of assignment //~| ERROR: mismatched types //~| ERROR: struct `C` is private } diff --git a/src/test/ui/issues/issue-13407.stderr b/src/test/ui/issues/issue-13407.stderr index 5a465cc533..f211d623ab 100644 --- a/src/test/ui/issues/issue-13407.stderr +++ b/src/test/ui/issues/issue-13407.stderr @@ -2,7 +2,13 @@ error[E0603]: unit struct `C` is private --> $DIR/issue-13407.rs:6:8 | LL | A::C = 1; - | ^ + | ^ this unit struct is private + | +note: the unit struct `C` is defined here + --> $DIR/issue-13407.rs:2:5 + | +LL | struct C; + | ^^^^^^^^^ error[E0308]: mismatched types --> $DIR/issue-13407.rs:6:12 @@ -10,11 +16,13 @@ error[E0308]: mismatched types LL | A::C = 1; | ^ expected struct `A::C`, found integer -error[E0070]: invalid left-hand side expression - --> $DIR/issue-13407.rs:6:5 +error[E0070]: invalid left-hand side of assignment + --> $DIR/issue-13407.rs:6:10 | LL | A::C = 1; - | ^^^^^^^^ left-hand of expression not valid + | ---- ^ + | | + | cannot assign to this expression error: aborting due to 3 previous errors diff --git a/src/test/ui/issues/issue-13466.stderr b/src/test/ui/issues/issue-13466.stderr index fc20615757..52d9e2a91b 100644 --- a/src/test/ui/issues/issue-13466.stderr +++ b/src/test/ui/issues/issue-13466.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-13466.rs:8:9 | LL | let _x: usize = match Some(1) { - | ------- this match expression has type `std::option::Option<{integer}>` + | ------- this expression has type `std::option::Option<{integer}>` LL | Ok(u) => u, | ^^^^^ expected enum `std::option::Option`, found enum `std::result::Result` | @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/issue-13466.rs:14:9 | LL | let _x: usize = match Some(1) { - | ------- this match expression has type `std::option::Option<{integer}>` + | ------- this expression has type `std::option::Option<{integer}>` ... LL | Err(e) => panic!(e) | ^^^^^^ expected enum `std::option::Option`, found enum `std::result::Result` diff --git a/src/test/ui/issues/issue-13483.rs b/src/test/ui/issues/issue-13483.rs index cb53523b3b..a2fd9264b1 100644 --- a/src/test/ui/issues/issue-13483.rs +++ b/src/test/ui/issues/issue-13483.rs @@ -1,6 +1,7 @@ fn main() { if true { } else if { //~ ERROR missing condition + //~^ ERROR mismatched types } else { } } @@ -8,6 +9,7 @@ fn main() { fn foo() { if true { } else if { //~ ERROR missing condition + //~^ ERROR mismatched types } bar(); } diff --git a/src/test/ui/issues/issue-13483.stderr b/src/test/ui/issues/issue-13483.stderr index df9f1dd011..5fd05b18ce 100644 --- a/src/test/ui/issues/issue-13483.stderr +++ b/src/test/ui/issues/issue-13483.stderr @@ -5,10 +5,29 @@ LL | } else if { | ^ expected if condition here error: missing condition for `if` expression - --> $DIR/issue-13483.rs:10:14 + --> $DIR/issue-13483.rs:11:14 | LL | } else if { | ^ expected if condition here -error: aborting due to 2 previous errors +error[E0308]: mismatched types + --> $DIR/issue-13483.rs:3:15 + | +LL | } else if { + | _______________^ +LL | | +LL | | } else { + | |_____^ expected `bool`, found `()` + +error[E0308]: mismatched types + --> $DIR/issue-13483.rs:11:15 + | +LL | } else if { + | _______________^ +LL | | +LL | | } + | |_____^ expected `bool`, found `()` + +error: aborting due to 4 previous errors +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/issues/issue-13641.stderr b/src/test/ui/issues/issue-13641.stderr index 8e5001e3b6..f90cb18b6f 100644 --- a/src/test/ui/issues/issue-13641.stderr +++ b/src/test/ui/issues/issue-13641.stderr @@ -2,13 +2,25 @@ error[E0603]: struct `Foo` is private --> $DIR/issue-13641.rs:9:8 | LL | a::Foo::new(); - | ^^^ + | ^^^ this struct is private + | +note: the struct `Foo` is defined here + --> $DIR/issue-13641.rs:2:5 + | +LL | struct Foo; + | ^^^^^^^^^^^ error[E0603]: enum `Bar` is private --> $DIR/issue-13641.rs:11:8 | LL | a::Bar::new(); - | ^^^ + | ^^^ this enum is private + | +note: the enum `Bar` is defined here + --> $DIR/issue-13641.rs:4:5 + | +LL | enum Bar {} + | ^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-13853.stderr b/src/test/ui/issues/issue-13853.stderr index cdb261a238..2f31636f8a 100644 --- a/src/test/ui/issues/issue-13853.stderr +++ b/src/test/ui/issues/issue-13853.stderr @@ -12,7 +12,7 @@ LL | self.iter() = help: type parameters must be constrained to match other types = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters -error[E0599]: no method named `iter` found for type `&G` in the current scope +error[E0599]: no method named `iter` found for reference `&G` in the current scope --> $DIR/issue-13853.rs:27:23 | LL | for node in graph.iter() { diff --git a/src/test/ui/issues/issue-14221.stderr b/src/test/ui/issues/issue-14221.stderr index 3e5e25a9f6..9864c0840d 100644 --- a/src/test/ui/issues/issue-14221.stderr +++ b/src/test/ui/issues/issue-14221.stderr @@ -3,6 +3,8 @@ warning[E0170]: pattern binding `A` is named the same as one of the variants of | LL | A => "A", | ^ help: to match on the variant, qualify the path: `E::A` + | + = note: `#[warn(bindings_with_variant_name)]` on by default warning[E0170]: pattern binding `B` is named the same as one of the variants of the type `E` --> $DIR/issue-14221.rs:15:13 diff --git a/src/test/ui/issues/issue-14541.stderr b/src/test/ui/issues/issue-14541.stderr index c5512e0300..cf155f428c 100644 --- a/src/test/ui/issues/issue-14541.stderr +++ b/src/test/ui/issues/issue-14541.stderr @@ -2,7 +2,9 @@ error[E0308]: mismatched types --> $DIR/issue-14541.rs:5:9 | LL | let Vec3 { y: _, z: _ } = v; - | ^^^^^^^^^^^^^^^^^^^ expected struct `Vec2`, found struct `Vec3` + | ^^^^^^^^^^^^^^^^^^^ - this expression has type `Vec2` + | | + | expected struct `Vec2`, found struct `Vec3` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-14915.rs b/src/test/ui/issues/issue-14915.rs index 294533f0cb..4acb51a4e5 100644 --- a/src/test/ui/issues/issue-14915.rs +++ b/src/test/ui/issues/issue-14915.rs @@ -4,5 +4,5 @@ fn main() { let x: Box<isize> = box 0; println!("{}", x + 1); - //~^ ERROR binary operation `+` cannot be applied to type `std::boxed::Box<isize>` + //~^ ERROR cannot add `{integer}` to `std::boxed::Box<isize>` } diff --git a/src/test/ui/issues/issue-14915.stderr b/src/test/ui/issues/issue-14915.stderr index e8de44320d..00b9909af5 100644 --- a/src/test/ui/issues/issue-14915.stderr +++ b/src/test/ui/issues/issue-14915.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `std::boxed::Box<isize>` +error[E0369]: cannot add `{integer}` to `std::boxed::Box<isize>` --> $DIR/issue-14915.rs:6:22 | LL | println!("{}", x + 1); diff --git a/src/test/ui/issues/issue-15080.rs b/src/test/ui/issues/issue-15080.rs index b11b1cda38..4dd6981d44 100644 --- a/src/test/ui/issues/issue-15080.rs +++ b/src/test/ui/issues/issue-15080.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(slice_patterns)] fn main() { let mut x: &[_] = &[1, 2, 3, 4]; diff --git a/src/test/ui/issues/issue-15104.rs b/src/test/ui/issues/issue-15104.rs index ee97754113..47b207ea9c 100644 --- a/src/test/ui/issues/issue-15104.rs +++ b/src/test/ui/issues/issue-15104.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(slice_patterns)] fn main() { assert_eq!(count_members(&[1, 2, 3, 4]), 4); diff --git a/src/test/ui/issues/issue-15896.stderr b/src/test/ui/issues/issue-15896.stderr index f553be9df5..b3f0907b81 100644 --- a/src/test/ui/issues/issue-15896.stderr +++ b/src/test/ui/issues/issue-15896.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-15896.rs:11:11 | LL | let u = match e { - | - this match expression has type `main::R` + | - this expression has type `main::E` LL | E::B( LL | Tau{t: x}, | ^^^^^^^^^ expected enum `main::R`, found struct `main::Tau` diff --git a/src/test/ui/issues/issue-15919-32.rs b/src/test/ui/issues/issue-15919-32.rs index 65d33a6134..3c93f14ccc 100644 --- a/src/test/ui/issues/issue-15919-32.rs +++ b/src/test/ui/issues/issue-15919-32.rs @@ -1,4 +1,5 @@ // ignore-64bit +// build-fail // FIXME https://github.com/rust-lang/rust/issues/59774 // normalize-stderr-test "thread.*panicked.*Metadata module not compiled.*\n" -> "" diff --git a/src/test/ui/issues/issue-15919-32.stderr b/src/test/ui/issues/issue-15919-32.stderr index 7f5d9262d3..8411313fc8 100644 --- a/src/test/ui/issues/issue-15919-32.stderr +++ b/src/test/ui/issues/issue-15919-32.stderr @@ -1,5 +1,5 @@ error: the type `[usize; 4294967295]` is too big for the current architecture - --> $DIR/issue-15919-32.rs:8:9 + --> $DIR/issue-15919-32.rs:9:9 | LL | let x = [0usize; 0xffff_ffff]; | ^ diff --git a/src/test/ui/issues/issue-15919-64.rs b/src/test/ui/issues/issue-15919-64.rs index abd20cc1ce..3ecbd34eaa 100644 --- a/src/test/ui/issues/issue-15919-64.rs +++ b/src/test/ui/issues/issue-15919-64.rs @@ -1,3 +1,4 @@ +// build-fail // ignore-32bit // FIXME https://github.com/rust-lang/rust/issues/59774 diff --git a/src/test/ui/issues/issue-15919-64.stderr b/src/test/ui/issues/issue-15919-64.stderr index 571b87d996..f624c96ce8 100644 --- a/src/test/ui/issues/issue-15919-64.stderr +++ b/src/test/ui/issues/issue-15919-64.stderr @@ -1,5 +1,5 @@ error: the type `[usize; 18446744073709551615]` is too big for the current architecture - --> $DIR/issue-15919-64.rs:8:9 + --> $DIR/issue-15919-64.rs:9:9 | LL | let x = [0usize; 0xffff_ffff_ffff_ffff]; | ^ diff --git a/src/test/ui/issues/issue-16098.rs b/src/test/ui/issues/issue-16098.rs index a1131f80e9..00acc20fc9 100644 --- a/src/test/ui/issues/issue-16098.rs +++ b/src/test/ui/issues/issue-16098.rs @@ -4,7 +4,7 @@ macro_rules! prob1 { }; ($n:expr) => { if ($n % 3 == 0) || ($n % 5 == 0) { - $n + prob1!($n - 1); //~ ERROR recursion limit reached while expanding the macro `prob1` + $n + prob1!($n - 1); //~ ERROR recursion limit reached while expanding `prob1!` } else { prob1!($n - 1); } diff --git a/src/test/ui/issues/issue-16098.stderr b/src/test/ui/issues/issue-16098.stderr index f890baf8eb..2b9657d462 100644 --- a/src/test/ui/issues/issue-16098.stderr +++ b/src/test/ui/issues/issue-16098.stderr @@ -1,4 +1,4 @@ -error: recursion limit reached while expanding the macro `prob1` +error: recursion limit reached while expanding `prob1!` --> $DIR/issue-16098.rs:7:18 | LL | $n + prob1!($n - 1); diff --git a/src/test/ui/issues/issue-16338.stderr b/src/test/ui/issues/issue-16338.stderr index c35edb0c8c..6878600b02 100644 --- a/src/test/ui/issues/issue-16338.stderr +++ b/src/test/ui/issues/issue-16338.stderr @@ -2,7 +2,9 @@ error[E0308]: mismatched types --> $DIR/issue-16338.rs:7:9 | LL | let Slice { data: data, len: len } = "foo"; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `str`, found struct `Slice` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ----- this expression has type `&str` + | | + | expected `str`, found struct `Slice` | = note: expected type `str` found struct `Slice<_>` diff --git a/src/test/ui/issues/issue-16401.stderr b/src/test/ui/issues/issue-16401.stderr index d3d6108be9..f8ea090709 100644 --- a/src/test/ui/issues/issue-16401.stderr +++ b/src/test/ui/issues/issue-16401.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-16401.rs:8:9 | LL | match () { - | -- this match expression has type `()` + | -- this expression has type `()` LL | Slice { data: data, len: len } => (), | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found struct `Slice` | diff --git a/src/test/ui/issues/issue-16725.stderr b/src/test/ui/issues/issue-16725.stderr index 562ad94042..e0a1ca8a5a 100644 --- a/src/test/ui/issues/issue-16725.stderr +++ b/src/test/ui/issues/issue-16725.stderr @@ -2,7 +2,13 @@ error[E0603]: function `bar` is private --> $DIR/issue-16725.rs:6:19 | LL | unsafe { foo::bar(); } - | ^^^ + | ^^^ this function is private + | +note: the function `bar` is defined here + --> $DIR/auxiliary/issue-16725.rs:2:5 + | +LL | fn bar(); + | ^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-16966.stderr b/src/test/ui/issues/issue-16966.stderr index 0d565af79b..49a12cc200 100644 --- a/src/test/ui/issues/issue-16966.stderr +++ b/src/test/ui/issues/issue-16966.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/issue-16966.rs:2:5 | LL | panic!(std::default::Default::default()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `M` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `M` declared on the function `begin_panic` | = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) diff --git a/src/test/ui/issues/issue-17337.rs b/src/test/ui/issues/issue-17337.rs index 1126ab7a20..65f2f8fc5a 100644 --- a/src/test/ui/issues/issue-17337.rs +++ b/src/test/ui/issues/issue-17337.rs @@ -1,12 +1,12 @@ #![feature(staged_api)] #![deny(deprecated)] -#![unstable(feature = "unstable_test_feature", issue = "0")] +#![unstable(feature = "unstable_test_feature", issue = "none")] struct Foo; impl Foo { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn foo(self) {} } diff --git a/src/test/ui/issues/issue-17546.rs b/src/test/ui/issues/issue-17546.rs index dbfdad25e5..c93a03cdec 100644 --- a/src/test/ui/issues/issue-17546.rs +++ b/src/test/ui/issues/issue-17546.rs @@ -1,3 +1,7 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl use foo::MyEnum::Result; use foo::NoResult; // Through a re-export diff --git a/src/test/ui/issues/issue-17546.stderr b/src/test/ui/issues/issue-17546.stderr index f3242919e0..2d532cdb9d 100644 --- a/src/test/ui/issues/issue-17546.stderr +++ b/src/test/ui/issues/issue-17546.stderr @@ -1,8 +1,13 @@ error[E0573]: expected type, found variant `NoResult` - --> $DIR/issue-17546.rs:12:17 + --> $DIR/issue-17546.rs:16:17 | LL | fn new() -> NoResult<MyEnum, String> { | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + ::: $SRC_DIR/libcore/result.rs:LL:COL + | +LL | pub enum Result<T, E> { + | --------------------- similarly named enum `Result` defined here | help: try using the variant's enum | @@ -14,7 +19,7 @@ LL | fn new() -> Result<MyEnum, String> { | ^^^^^^ error[E0573]: expected type, found variant `Result` - --> $DIR/issue-17546.rs:22:17 + --> $DIR/issue-17546.rs:26:17 | LL | fn new() -> Result<foo::MyEnum, String> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ not a type @@ -32,7 +37,7 @@ LL | use std::result::Result; and 1 other candidate error[E0573]: expected type, found variant `Result` - --> $DIR/issue-17546.rs:28:13 + --> $DIR/issue-17546.rs:32:13 | LL | fn new() -> Result<foo::MyEnum, String> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ not a type @@ -50,10 +55,15 @@ LL | use std::result::Result; and 1 other candidate error[E0573]: expected type, found variant `NoResult` - --> $DIR/issue-17546.rs:33:15 + --> $DIR/issue-17546.rs:37:15 | LL | fn newer() -> NoResult<foo::MyEnum, String> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + ::: $SRC_DIR/libcore/result.rs:LL:COL + | +LL | pub enum Result<T, E> { + | --------------------- similarly named enum `Result` defined here | help: try using the variant's enum | diff --git a/src/test/ui/issues/issue-17551.stderr b/src/test/ui/issues/issue-17551.stderr index 5468268e7d..48405a292f 100644 --- a/src/test/ui/issues/issue-17551.stderr +++ b/src/test/ui/issues/issue-17551.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed for `B<T>` --> $DIR/issue-17551.rs:6:15 | LL | let foo = B(marker::PhantomData); - | --- ^ cannot infer type for type parameter `T` + | --- ^ cannot infer type for type parameter `T` declared on the struct `B` | | | consider giving `foo` the explicit type `B<T>`, where the type parameter `T` is specified diff --git a/src/test/ui/issues/issue-17718-const-bad-values.rs b/src/test/ui/issues/issue-17718-const-bad-values.rs index 97657f8848..9355c8ab15 100644 --- a/src/test/ui/issues/issue-17718-const-bad-values.rs +++ b/src/test/ui/issues/issue-17718-const-bad-values.rs @@ -4,6 +4,7 @@ const C1: &'static mut [usize] = &mut []; static mut S: usize = 3; const C2: &'static mut usize = unsafe { &mut S }; //~^ ERROR: constants cannot refer to statics +//~| ERROR: constants cannot refer to statics //~| ERROR: references in constants may only refer to immutable values fn main() {} diff --git a/src/test/ui/issues/issue-17718-const-bad-values.stderr b/src/test/ui/issues/issue-17718-const-bad-values.stderr index 7e4a62ac96..e45d8b6c74 100644 --- a/src/test/ui/issues/issue-17718-const-bad-values.stderr +++ b/src/test/ui/issues/issue-17718-const-bad-values.stderr @@ -7,11 +7,21 @@ LL | const C1: &'static mut [usize] = &mut []; = note: for more information, see https://github.com/rust-lang/rust/issues/57349 = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable -error[E0013]: constants cannot refer to statics, use a constant instead +error[E0013]: constants cannot refer to statics --> $DIR/issue-17718-const-bad-values.rs:5:46 | LL | const C2: &'static mut usize = unsafe { &mut S }; | ^ + | + = help: consider extracting the value of the `static` to a `const`, and referring to that + +error[E0013]: constants cannot refer to statics + --> $DIR/issue-17718-const-bad-values.rs:5:46 + | +LL | const C2: &'static mut usize = unsafe { &mut S }; + | ^ + | + = help: consider extracting the value of the `static` to a `const`, and referring to that error[E0658]: references in constants may only refer to immutable values --> $DIR/issue-17718-const-bad-values.rs:5:41 @@ -22,7 +32,7 @@ LL | const C2: &'static mut usize = unsafe { &mut S }; = note: for more information, see https://github.com/rust-lang/rust/issues/57349 = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable -error: aborting due to 3 previous errors +error: aborting due to 4 previous errors Some errors have detailed explanations: E0013, E0658. For more information about an error, try `rustc --explain E0013`. diff --git a/src/test/ui/issues/issue-17718-const-privacy.stderr b/src/test/ui/issues/issue-17718-const-privacy.stderr index 0b0de8a525..07d825ba9c 100644 --- a/src/test/ui/issues/issue-17718-const-privacy.stderr +++ b/src/test/ui/issues/issue-17718-const-privacy.stderr @@ -2,13 +2,25 @@ error[E0603]: constant `B` is private --> $DIR/issue-17718-const-privacy.rs:5:8 | LL | use a::B; - | ^ + | ^ this constant is private + | +note: the constant `B` is defined here + --> $DIR/issue-17718-const-privacy.rs:13:5 + | +LL | const B: usize = 3; + | ^^^^^^^^^^^^^^^^^^^ error[E0603]: constant `BAR` is private --> $DIR/issue-17718-const-privacy.rs:8:5 | LL | BAR, - | ^^^ + | ^^^ this constant is private + | +note: the constant `BAR` is defined here + --> $DIR/auxiliary/issue-17718-const-privacy.rs:4:1 + | +LL | const BAR: usize = 3; + | ^^^^^^^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-17718-references.stderr b/src/test/ui/issues/issue-17718-references.stderr index 27aad9c03c..e3c3b369ff 100644 --- a/src/test/ui/issues/issue-17718-references.stderr +++ b/src/test/ui/issues/issue-17718-references.stderr @@ -1,20 +1,26 @@ -error[E0013]: constants cannot refer to statics, use a constant instead +error[E0013]: constants cannot refer to statics --> $DIR/issue-17718-references.rs:9:29 | LL | const T2: &'static usize = &S; | ^ + | + = help: consider extracting the value of the `static` to a `const`, and referring to that -error[E0013]: constants cannot refer to statics, use a constant instead +error[E0013]: constants cannot refer to statics --> $DIR/issue-17718-references.rs:14:19 | LL | const T6: usize = S; | ^ + | + = help: consider extracting the value of the `static` to a `const`, and referring to that -error[E0013]: constants cannot refer to statics, use a constant instead +error[E0013]: constants cannot refer to statics --> $DIR/issue-17718-references.rs:19:33 | LL | const T10: Struct = Struct { a: S }; | ^ + | + = help: consider extracting the value of the `static` to a `const`, and referring to that error: aborting due to 3 previous errors diff --git a/src/test/ui/issues/issue-17728.nll.stderr b/src/test/ui/issues/issue-17728.nll.stderr index ef193ad85b..d515cf451c 100644 --- a/src/test/ui/issues/issue-17728.nll.stderr +++ b/src/test/ui/issues/issue-17728.nll.stderr @@ -1,4 +1,4 @@ -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/issue-17728.rs:109:14 | LL | / match to_parse { diff --git a/src/test/ui/issues/issue-17728.rs b/src/test/ui/issues/issue-17728.rs index 15cea1d609..bec52d87d2 100644 --- a/src/test/ui/issues/issue-17728.rs +++ b/src/test/ui/issues/issue-17728.rs @@ -108,7 +108,7 @@ fn str_to_direction(to_parse: &str) -> RoomDirection { "down" => RoomDirection::Down, _ => None } - //~^^ ERROR match arms have incompatible types + //~^^ ERROR `match` arms have incompatible types } fn main() { diff --git a/src/test/ui/issues/issue-17728.stderr b/src/test/ui/issues/issue-17728.stderr index 527168dbe6..2f9ae63aa4 100644 --- a/src/test/ui/issues/issue-17728.stderr +++ b/src/test/ui/issues/issue-17728.stderr @@ -9,7 +9,7 @@ LL | fn attemptTraverse(&self, room: &Room, directionStr: &str) -> Result<&R LL | Some(entry) => Ok(entry), | ^^^^^^^^^ ...but data from `room` is returned here -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/issue-17728.rs:109:14 | LL | / match to_parse { diff --git a/src/test/ui/issues/issue-17732.rs b/src/test/ui/issues/issue-17732.rs index 5e11fc4fcf..8f63d5baef 100644 --- a/src/test/ui/issues/issue-17732.rs +++ b/src/test/ui/issues/issue-17732.rs @@ -1,5 +1,6 @@ // check-pass #![allow(dead_code)] +#![allow(non_camel_case_types)] // pretty-expanded FIXME #23616 trait Person { diff --git a/src/test/ui/issues/issue-17877.rs b/src/test/ui/issues/issue-17877.rs index fefa3f2f87..126e01de5e 100644 --- a/src/test/ui/issues/issue-17877.rs +++ b/src/test/ui/issues/issue-17877.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(slice_patterns)] fn main() { assert_eq!(match [0u8; 1024] { diff --git a/src/test/ui/issues/issue-17913.rs b/src/test/ui/issues/issue-17913.rs index 48d8f407aa..ca13b9bd6a 100644 --- a/src/test/ui/issues/issue-17913.rs +++ b/src/test/ui/issues/issue-17913.rs @@ -1,3 +1,4 @@ +// build-fail // normalize-stderr-test "\[&usize; \d+\]" -> "[&usize; N]" // error-pattern: too big for the current architecture diff --git a/src/test/ui/issues/issue-17959.rs b/src/test/ui/issues/issue-17959.rs index 73865ae2d2..01416a0d79 100644 --- a/src/test/ui/issues/issue-17959.rs +++ b/src/test/ui/issues/issue-17959.rs @@ -9,7 +9,7 @@ struct G<T: ?Sized> { } impl<T> Drop for G<T> { -//~^ ERROR: The requirement `T: std::marker::Sized` is added only by the Drop impl. [E0367] +//~^ ERROR `Drop` impl requires `T: std::marker::Sized` fn drop(&mut self) { if !self._ptr.is_null() { } diff --git a/src/test/ui/issues/issue-17959.stderr b/src/test/ui/issues/issue-17959.stderr index de742e48ae..29d32c1f3c 100644 --- a/src/test/ui/issues/issue-17959.stderr +++ b/src/test/ui/issues/issue-17959.stderr @@ -1,16 +1,10 @@ -error[E0367]: The requirement `T: std::marker::Sized` is added only by the Drop impl. - --> $DIR/issue-17959.rs:11:1 +error[E0367]: `Drop` impl requires `T: std::marker::Sized` but the struct it is implemented for does not + --> $DIR/issue-17959.rs:11:6 | -LL | / impl<T> Drop for G<T> { -LL | | -LL | | fn drop(&mut self) { -LL | | if !self._ptr.is_null() { -LL | | } -LL | | } -LL | | } - | |_^ +LL | impl<T> Drop for G<T> { + | ^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/issue-17959.rs:7:1 | LL | / struct G<T: ?Sized> { diff --git a/src/test/ui/issues/issue-18118-2.rs b/src/test/ui/issues/issue-18118-2.rs index 6d52156b3d..f712a2eedb 100644 --- a/src/test/ui/issues/issue-18118-2.rs +++ b/src/test/ui/issues/issue-18118-2.rs @@ -1,7 +1,6 @@ pub fn main() { const z: &'static isize = { static p: isize = 3; - &p - //~^ ERROR constants cannot refer to statics, use a constant instead + &p //~ ERROR constants cannot refer to statics }; } diff --git a/src/test/ui/issues/issue-18118-2.stderr b/src/test/ui/issues/issue-18118-2.stderr index d58822f16e..4fc3ca78f9 100644 --- a/src/test/ui/issues/issue-18118-2.stderr +++ b/src/test/ui/issues/issue-18118-2.stderr @@ -1,8 +1,10 @@ -error[E0013]: constants cannot refer to statics, use a constant instead +error[E0013]: constants cannot refer to statics --> $DIR/issue-18118-2.rs:4:10 | LL | &p | ^ + | + = help: consider extracting the value of the `static` to a `const`, and referring to that error: aborting due to previous error diff --git a/src/test/ui/issues/issue-18446.stderr b/src/test/ui/issues/issue-18446.stderr index e6afc4c13a..3422add9dd 100644 --- a/src/test/ui/issues/issue-18446.stderr +++ b/src/test/ui/issues/issue-18446.stderr @@ -2,7 +2,10 @@ error[E0034]: multiple applicable items in scope --> $DIR/issue-18446.rs:18:7 | LL | x.foo(); - | ^^^ multiple `foo` found + | --^^^-- + | | | + | | multiple `foo` found + | help: disambiguate the method call for candidate #2: `T::foo(&x)` | note: candidate #1 is defined in an impl for the type `dyn T` --> $DIR/issue-18446.rs:9:5 @@ -14,7 +17,6 @@ note: candidate #2 is defined in the trait `T` | LL | fn foo(&self); | ^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `T::foo(&x)` instead error: aborting due to previous error diff --git a/src/test/ui/issues/issue-19100.stderr b/src/test/ui/issues/issue-19100.stderr index 1ab13477e3..01e5313fcc 100644 --- a/src/test/ui/issues/issue-19100.stderr +++ b/src/test/ui/issues/issue-19100.stderr @@ -3,6 +3,8 @@ warning[E0170]: pattern binding `Bar` is named the same as one of the variants o | LL | Bar if true | ^^^ help: to match on the variant, qualify the path: `Foo::Bar` + | + = note: `#[warn(bindings_with_variant_name)]` on by default warning[E0170]: pattern binding `Baz` is named the same as one of the variants of the type `Foo` --> $DIR/issue-19100.rs:22:1 diff --git a/src/test/ui/issues/issue-19482.rs b/src/test/ui/issues/issue-19482.rs index 9e4b77d87f..3f3c5de9b1 100644 --- a/src/test/ui/issues/issue-19482.rs +++ b/src/test/ui/issues/issue-19482.rs @@ -8,6 +8,6 @@ trait Foo { } fn bar(x: &dyn Foo) {} -//~^ ERROR the associated type `A` (from the trait `Foo`) must be specified +//~^ ERROR the associated type `A` (from trait `Foo`) must be specified pub fn main() {} diff --git a/src/test/ui/issues/issue-19482.stderr b/src/test/ui/issues/issue-19482.stderr index f1e5419c71..42a5a01596 100644 --- a/src/test/ui/issues/issue-19482.stderr +++ b/src/test/ui/issues/issue-19482.stderr @@ -1,11 +1,11 @@ -error[E0191]: the value of the associated type `A` (from the trait `Foo`) must be specified - --> $DIR/issue-19482.rs:10:12 +error[E0191]: the value of the associated type `A` (from trait `Foo`) must be specified + --> $DIR/issue-19482.rs:10:16 | LL | type A; | ------- `A` defined here ... LL | fn bar(x: &dyn Foo) {} - | ^^^^^^^ associated type `A` must be specified + | ^^^ help: specify the associated type: `Foo<A = Type>` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-19521.stderr b/src/test/ui/issues/issue-19521.stderr index c15c5392fa..b6847cd755 100644 --- a/src/test/ui/issues/issue-19521.stderr +++ b/src/test/ui/issues/issue-19521.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `homura` found for type `&'static str` in the current scope +error[E0599]: no method named `homura` found for reference `&'static str` in the current scope --> $DIR/issue-19521.rs:2:8 | LL | "".homura()(); diff --git a/src/test/ui/issues/issue-19692.stderr b/src/test/ui/issues/issue-19692.stderr index fe920c1693..b412d7bc70 100644 --- a/src/test/ui/issues/issue-19692.stderr +++ b/src/test/ui/issues/issue-19692.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `kaname` found for type `Homura` in the current scope +error[E0599]: no method named `kaname` found for struct `Homura` in the current scope --> $DIR/issue-19692.rs:4:40 | LL | struct Homura; diff --git a/src/test/ui/issues/issue-19707.stderr b/src/test/ui/issues/issue-19707.stderr index c85ce0eb3a..8a627bc0bd 100644 --- a/src/test/ui/issues/issue-19707.stderr +++ b/src/test/ui/issues/issue-19707.stderr @@ -2,17 +2,25 @@ error[E0106]: missing lifetime specifier --> $DIR/issue-19707.rs:3:28 | LL | type Foo = fn(&u8, &u8) -> &u8; - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from argument 1 or argument 2 +help: consider introducing a named lifetime parameter + | +LL | type Foo<'lifetime> = fn(&u8, &u8) -> &'lifetime u8; + | ^^^^^^^^^^^ ^^^^^^^^^^ error[E0106]: missing lifetime specifier --> $DIR/issue-19707.rs:5:27 | LL | fn bar<F: Fn(&u8, &u8) -> &u8>(f: &F) {} - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from argument 1 or argument 2 +help: consider introducing a named lifetime parameter + | +LL | fn bar<'lifetime, F: Fn(&u8, &u8) -> &'lifetime u8>(f: &F) {} + | ^^^^^^^^^^ ^^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-19991.rs b/src/test/ui/issues/issue-19991.rs index 62d5a6de76..0f3f83001d 100644 --- a/src/test/ui/issues/issue-19991.rs +++ b/src/test/ui/issues/issue-19991.rs @@ -1,8 +1,8 @@ // Test if the sugared if-let construct correctly prints "missing an else clause" when an else -// clause does not exist, instead of the unsympathetic "match arms have incompatible types" +// clause does not exist, instead of the unsympathetic "`match` arms have incompatible types" fn main() { - if let Some(homura) = Some("madoka") { //~ ERROR missing an else clause + if let Some(homura) = Some("madoka") { //~ ERROR missing an `else` clause //~| expected `()`, found integer 765 }; diff --git a/src/test/ui/issues/issue-19991.stderr b/src/test/ui/issues/issue-19991.stderr index b78f4a6d29..6e92be87a0 100644 --- a/src/test/ui/issues/issue-19991.stderr +++ b/src/test/ui/issues/issue-19991.stderr @@ -1,4 +1,4 @@ -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/issue-19991.rs:5:5 | LL | / if let Some(homura) = Some("madoka") { diff --git a/src/test/ui/issues/issue-20831-debruijn.rs b/src/test/ui/issues/issue-20831-debruijn.rs index ef4b1581fd..d0e15cb393 100644 --- a/src/test/ui/issues/issue-20831-debruijn.rs +++ b/src/test/ui/issues/issue-20831-debruijn.rs @@ -28,6 +28,7 @@ impl<'a> Publisher<'a> for MyStruct<'a> { fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) { // Not obvious, but there is an implicit lifetime here -------^ //~^^ ERROR cannot infer + //~| ERROR cannot infer //~| ERROR mismatched types //~| ERROR mismatched types // diff --git a/src/test/ui/issues/issue-20831-debruijn.stderr b/src/test/ui/issues/issue-20831-debruijn.stderr index c7fd134a12..a4ea1cd983 100644 --- a/src/test/ui/issues/issue-20831-debruijn.stderr +++ b/src/test/ui/issues/issue-20831-debruijn.stderr @@ -102,7 +102,49 @@ LL | | } = note: expected `Publisher<'_>` found `Publisher<'_>` -error: aborting due to 3 previous errors +error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements + --> $DIR/issue-20831-debruijn.rs:28:5 + | +LL | / fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) { +LL | | // Not obvious, but there is an implicit lifetime here -------^ +LL | | +LL | | +... | +LL | | self.sub = t; +LL | | } + | |_____^ + | +note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the method body at 28:5... + --> $DIR/issue-20831-debruijn.rs:28:5 + | +LL | / fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) { +LL | | // Not obvious, but there is an implicit lifetime here -------^ +LL | | +LL | | +... | +LL | | self.sub = t; +LL | | } + | |_____^ +note: ...but the lifetime must also be valid for the lifetime `'a` as defined on the impl at 26:6... + --> $DIR/issue-20831-debruijn.rs:26:6 + | +LL | impl<'a> Publisher<'a> for MyStruct<'a> { + | ^^ +note: ...so that the types are compatible + --> $DIR/issue-20831-debruijn.rs:28:5 + | +LL | / fn subscribe(&mut self, t : Box<dyn Subscriber<Input=<Self as Publisher>::Output> + 'a>) { +LL | | // Not obvious, but there is an implicit lifetime here -------^ +LL | | +LL | | +... | +LL | | self.sub = t; +LL | | } + | |_____^ + = note: expected `Publisher<'_>` + found `Publisher<'_>` + +error: aborting due to 4 previous errors Some errors have detailed explanations: E0308, E0495. For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/issues/issue-21160.rs b/src/test/ui/issues/issue-21160.rs index 0199abbd8f..a13b778337 100644 --- a/src/test/ui/issues/issue-21160.rs +++ b/src/test/ui/issues/issue-21160.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl struct Bar; impl Bar { diff --git a/src/test/ui/issues/issue-21160.stderr b/src/test/ui/issues/issue-21160.stderr index 65ba64b49d..a7bb4fc512 100644 --- a/src/test/ui/issues/issue-21160.stderr +++ b/src/test/ui/issues/issue-21160.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Bar: std::hash::Hash` is not satisfied - --> $DIR/issue-21160.rs:9:12 + --> $DIR/issue-21160.rs:12:12 | LL | struct Foo(Bar); | ^^^ the trait `std::hash::Hash` is not implemented for `Bar` diff --git a/src/test/ui/issues/issue-21596.stderr b/src/test/ui/issues/issue-21596.stderr index 4e5cace525..efde16167b 100644 --- a/src/test/ui/issues/issue-21596.stderr +++ b/src/test/ui/issues/issue-21596.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `to_string` found for type `*const u8` in the current scope +error[E0599]: no method named `to_string` found for raw pointer `*const u8` in the current scope --> $DIR/issue-21596.rs:4:22 | LL | println!("{}", z.to_string()); diff --git a/src/test/ui/issues/issue-21950.rs b/src/test/ui/issues/issue-21950.rs index 0bc87824cc..72a98bd8dd 100644 --- a/src/test/ui/issues/issue-21950.rs +++ b/src/test/ui/issues/issue-21950.rs @@ -1,8 +1,13 @@ -use std::ops::Add; +trait Add<Rhs=Self> { + type Output; +} + +impl Add for i32 { + type Output = i32; +} fn main() { - let x = &10 as - &dyn Add; - //~^ ERROR E0393 - //~| ERROR E0191 + let x = &10 as &dyn Add; + //~^ ERROR E0393 + //~| ERROR E0191 } diff --git a/src/test/ui/issues/issue-21950.stderr b/src/test/ui/issues/issue-21950.stderr index 9be7b052da..93c2444f88 100644 --- a/src/test/ui/issues/issue-21950.stderr +++ b/src/test/ui/issues/issue-21950.stderr @@ -1,16 +1,24 @@ error[E0393]: the type parameter `Rhs` must be explicitly specified - --> $DIR/issue-21950.rs:5:18 + --> $DIR/issue-21950.rs:10:25 | -LL | &dyn Add; - | ^^^ missing reference to `Rhs` +LL | / trait Add<Rhs=Self> { +LL | | type Output; +LL | | } + | |_- type parameter `Rhs` must be specified for this +... +LL | let x = &10 as &dyn Add; + | ^^^ help: set the type parameter to the desired type: `Add<Rhs>` | = note: because of the default `Self` reference, type parameters must be specified on object types -error[E0191]: the value of the associated type `Output` (from the trait `std::ops::Add`) must be specified - --> $DIR/issue-21950.rs:5:14 +error[E0191]: the value of the associated type `Output` (from trait `Add`) must be specified + --> $DIR/issue-21950.rs:10:25 | -LL | &dyn Add; - | ^^^^^^^ associated type `Output` must be specified +LL | type Output; + | ------------ `Output` defined here +... +LL | let x = &10 as &dyn Add; + | ^^^ help: specify the associated type: `Add<Output = Type>` error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-22370.stderr b/src/test/ui/issues/issue-22370.stderr index 3ce164e954..950c12ef7a 100644 --- a/src/test/ui/issues/issue-22370.stderr +++ b/src/test/ui/issues/issue-22370.stderr @@ -1,8 +1,11 @@ error[E0393]: the type parameter `T` must be explicitly specified --> $DIR/issue-22370.rs:3:14 | +LL | trait A<T=Self> {} + | ------------------ type parameter `T` must be specified for this +LL | LL | fn f(a: &dyn A) {} - | ^ missing reference to `T` + | ^ help: set the type parameter to the desired type: `A<T>` | = note: because of the default `Self` reference, type parameters must be specified on object types diff --git a/src/test/ui/issues/issue-22434.rs b/src/test/ui/issues/issue-22434.rs index 3e800a2b61..34057b46ec 100644 --- a/src/test/ui/issues/issue-22434.rs +++ b/src/test/ui/issues/issue-22434.rs @@ -3,6 +3,6 @@ pub trait Foo { } type I<'a> = &'a (dyn Foo + 'a); -//~^ ERROR the value of the associated type `A` (from the trait `Foo`) must be specified +//~^ ERROR the value of the associated type `A` (from trait `Foo`) must be specified fn main() {} diff --git a/src/test/ui/issues/issue-22434.stderr b/src/test/ui/issues/issue-22434.stderr index eb78c4fc31..79b9d85610 100644 --- a/src/test/ui/issues/issue-22434.stderr +++ b/src/test/ui/issues/issue-22434.stderr @@ -1,11 +1,11 @@ -error[E0191]: the value of the associated type `A` (from the trait `Foo`) must be specified - --> $DIR/issue-22434.rs:5:19 +error[E0191]: the value of the associated type `A` (from trait `Foo`) must be specified + --> $DIR/issue-22434.rs:5:23 | LL | type A; | ------- `A` defined here ... LL | type I<'a> = &'a (dyn Foo + 'a); - | ^^^^^^^^^^^^ associated type `A` must be specified + | ^^^ help: specify the associated type: `Foo<A = Type>` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-22560.rs b/src/test/ui/issues/issue-22560.rs index acee99dbed..44be8817b0 100644 --- a/src/test/ui/issues/issue-22560.rs +++ b/src/test/ui/issues/issue-22560.rs @@ -1,10 +1,15 @@ -use std::ops::{Add, Sub}; +trait Add<Rhs=Self> { + type Output; +} -type Test = dyn Add + - //~^ ERROR E0393 - //~| ERROR E0191 - Sub; - //~^ ERROR E0393 - //~| ERROR E0225 +trait Sub<Rhs=Self> { + type Output; +} + +type Test = dyn Add + Sub; +//~^ ERROR E0393 +//~| ERROR E0191 +//~| ERROR E0393 +//~| ERROR E0225 fn main() { } diff --git a/src/test/ui/issues/issue-22560.stderr b/src/test/ui/issues/issue-22560.stderr index 5b58adb197..e5e50ddd15 100644 --- a/src/test/ui/issues/issue-22560.stderr +++ b/src/test/ui/issues/issue-22560.stderr @@ -1,48 +1,58 @@ error[E0393]: the type parameter `Rhs` must be explicitly specified - --> $DIR/issue-22560.rs:6:13 + --> $DIR/issue-22560.rs:9:23 | -LL | Sub; - | ^^^ missing reference to `Rhs` +LL | / trait Sub<Rhs=Self> { +LL | | type Output; +LL | | } + | |_- type parameter `Rhs` must be specified for this +LL | +LL | type Test = dyn Add + Sub; + | ^^^ help: set the type parameter to the desired type: `Sub<Rhs>` | = note: because of the default `Self` reference, type parameters must be specified on object types error[E0393]: the type parameter `Rhs` must be explicitly specified - --> $DIR/issue-22560.rs:3:17 + --> $DIR/issue-22560.rs:9:17 | -LL | type Test = dyn Add + - | ^^^ missing reference to `Rhs` +LL | / trait Add<Rhs=Self> { +LL | | type Output; +LL | | } + | |_- type parameter `Rhs` must be specified for this +... +LL | type Test = dyn Add + Sub; + | ^^^ help: set the type parameter to the desired type: `Add<Rhs>` | = note: because of the default `Self` reference, type parameters must be specified on object types error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/issue-22560.rs:6:13 + --> $DIR/issue-22560.rs:9:23 | -LL | type Test = dyn Add + - | --- - | | +LL | type Test = dyn Add + Sub; + | --- ^^^ + | | | + | | additional non-auto trait + | | trait alias used in trait object type (additional use) | first non-auto trait | trait alias used in trait object type (first use) -... -LL | Sub; - | ^^^ - | | - | additional non-auto trait - | trait alias used in trait object type (additional use) -error[E0191]: the value of the associated types `Output` (from the trait `std::ops::Add`), `Output` (from the trait `std::ops::Sub`) must be specified - --> $DIR/issue-22560.rs:3:13 - | -LL | type Test = dyn Add + - | _____________^ - | |_____________| - | | -LL | | -LL | | -LL | | Sub; - | | ^ - | |_______________| - | |_______________associated type `Output` must be specified +error[E0191]: the value of the associated types `Output` (from trait `Add`), `Output` (from trait `Sub`) must be specified + --> $DIR/issue-22560.rs:9:17 + | +LL | type Output; + | ------------ `Output` defined here +... +LL | type Output; + | ------------ `Output` defined here +... +LL | type Test = dyn Add + Sub; + | ^^^ ^^^ associated type `Output` must be specified + | | | associated type `Output` must be specified + | +help: specify the associated types + | +LL | type Test = dyn Add<Output = Type> + Sub<Output = Type>; + | ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^ error: aborting due to 4 previous errors diff --git a/src/test/ui/issues/issue-22638.rs b/src/test/ui/issues/issue-22638.rs index fab24404eb..72c16fddb4 100644 --- a/src/test/ui/issues/issue-22638.rs +++ b/src/test/ui/issues/issue-22638.rs @@ -1,3 +1,4 @@ +// build-fail // normalize-stderr-test: "<\[closure@.+`" -> "$$CLOSURE`" #![allow(unused)] diff --git a/src/test/ui/issues/issue-22638.stderr b/src/test/ui/issues/issue-22638.stderr index b60e1c29ec..83dd93b853 100644 --- a/src/test/ui/issues/issue-22638.stderr +++ b/src/test/ui/issues/issue-22638.stderr @@ -1,5 +1,5 @@ error: reached the type-length limit while instantiating `D::matches::$CLOSURE` - --> $DIR/issue-22638.rs:52:5 + --> $DIR/issue-22638.rs:53:5 | LL | / pub fn matches<F: Fn()>(&self, f: &F) { LL | | diff --git a/src/test/ui/issues/issue-22933-2.rs b/src/test/ui/issues/issue-22933-2.rs index 98a354b1bd..dfd84b9a79 100644 --- a/src/test/ui/issues/issue-22933-2.rs +++ b/src/test/ui/issues/issue-22933-2.rs @@ -2,7 +2,7 @@ enum Delicious { Pie = 0x1, Apple = 0x2, ApplePie = Delicious::Apple as isize | Delicious::PIE as isize, - //~^ ERROR no variant or associated item named `PIE` found for type `Delicious` + //~^ ERROR no variant or associated item named `PIE` found } fn main() {} diff --git a/src/test/ui/issues/issue-22933-2.stderr b/src/test/ui/issues/issue-22933-2.stderr index 72038ea20a..584b05ec44 100644 --- a/src/test/ui/issues/issue-22933-2.stderr +++ b/src/test/ui/issues/issue-22933-2.stderr @@ -1,4 +1,4 @@ -error[E0599]: no variant or associated item named `PIE` found for type `Delicious` in the current scope +error[E0599]: no variant or associated item named `PIE` found for enum `Delicious` in the current scope --> $DIR/issue-22933-2.rs:4:55 | LL | enum Delicious { diff --git a/src/test/ui/issues/issue-22933-3.rs b/src/test/ui/issues/issue-22933-3.rs index 8518ed34ae..fbcce4b834 100644 --- a/src/test/ui/issues/issue-22933-3.rs +++ b/src/test/ui/issues/issue-22933-3.rs @@ -1,4 +1,4 @@ const FOO: [u32; u8::MIN as usize] = []; -//~^ ERROR no associated item named `MIN` found for type `u8` +//~^ ERROR no associated item named `MIN` found fn main() {} diff --git a/src/test/ui/issues/issue-23024.rs b/src/test/ui/issues/issue-23024.rs index 2638e15f0e..6367536816 100644 --- a/src/test/ui/issues/issue-23024.rs +++ b/src/test/ui/issues/issue-23024.rs @@ -9,5 +9,5 @@ fn main() println!("{:?}",(vfnfer[0] as dyn Fn)(3)); //~^ ERROR the precise format of `Fn`-family traits' //~| ERROR wrong number of type arguments: expected 1, found 0 [E0107] - //~| ERROR the value of the associated type `Output` (from the trait `std::ops::FnOnce`) + //~| ERROR the value of the associated type `Output` (from trait `std::ops::FnOnce`) } diff --git a/src/test/ui/issues/issue-23024.stderr b/src/test/ui/issues/issue-23024.stderr index 43561938ef..1c6dd28ce5 100644 --- a/src/test/ui/issues/issue-23024.stderr +++ b/src/test/ui/issues/issue-23024.stderr @@ -1,8 +1,8 @@ -error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead +error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change --> $DIR/issue-23024.rs:9:39 | LL | println!("{:?}",(vfnfer[0] as dyn Fn)(3)); - | ^^ + | ^^ help: use parenthetical notation instead: `Fn() -> ()` | = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable @@ -13,11 +13,11 @@ error[E0107]: wrong number of type arguments: expected 1, found 0 LL | println!("{:?}",(vfnfer[0] as dyn Fn)(3)); | ^^ expected 1 type argument -error[E0191]: the value of the associated type `Output` (from the trait `std::ops::FnOnce`) must be specified - --> $DIR/issue-23024.rs:9:35 +error[E0191]: the value of the associated type `Output` (from trait `std::ops::FnOnce`) must be specified + --> $DIR/issue-23024.rs:9:39 | LL | println!("{:?}",(vfnfer[0] as dyn Fn)(3)); - | ^^^^^^ associated type `Output` must be specified + | ^^ help: specify the associated type: `Fn<Output = Type>` error: aborting due to 3 previous errors diff --git a/src/test/ui/issues/issue-23173.rs b/src/test/ui/issues/issue-23173.rs index 7c15598448..92f4c54644 100644 --- a/src/test/ui/issues/issue-23173.rs +++ b/src/test/ui/issues/issue-23173.rs @@ -7,7 +7,7 @@ fn use_token(token: &Token) { unimplemented!() } fn main() { use_token(&Token::Homura); //~ ERROR no variant or associated item named `Homura` - Struct::method(); //~ ERROR no function or associated item named `method` found for type - Struct::method; //~ ERROR no function or associated item named `method` found for type - Struct::Assoc; //~ ERROR no associated item named `Assoc` found for type `Struct` in + Struct::method(); //~ ERROR no function or associated item named `method` found + Struct::method; //~ ERROR no function or associated item named `method` found + Struct::Assoc; //~ ERROR no associated item named `Assoc` found } diff --git a/src/test/ui/issues/issue-23173.stderr b/src/test/ui/issues/issue-23173.stderr index 699e41156f..89f70fda78 100644 --- a/src/test/ui/issues/issue-23173.stderr +++ b/src/test/ui/issues/issue-23173.stderr @@ -1,4 +1,4 @@ -error[E0599]: no variant or associated item named `Homura` found for type `Token` in the current scope +error[E0599]: no variant or associated item named `Homura` found for enum `Token` in the current scope --> $DIR/issue-23173.rs:9:23 | LL | enum Token { LeftParen, RightParen, Plus, Minus, /* etc */ } @@ -7,7 +7,7 @@ LL | enum Token { LeftParen, RightParen, Plus, Minus, /* etc */ } LL | use_token(&Token::Homura); | ^^^^^^ variant or associated item not found in `Token` -error[E0599]: no function or associated item named `method` found for type `Struct` in the current scope +error[E0599]: no function or associated item named `method` found for struct `Struct` in the current scope --> $DIR/issue-23173.rs:10:13 | LL | struct Struct { @@ -16,7 +16,7 @@ LL | struct Struct { LL | Struct::method(); | ^^^^^^ function or associated item not found in `Struct` -error[E0599]: no function or associated item named `method` found for type `Struct` in the current scope +error[E0599]: no function or associated item named `method` found for struct `Struct` in the current scope --> $DIR/issue-23173.rs:11:13 | LL | struct Struct { @@ -25,7 +25,7 @@ LL | struct Struct { LL | Struct::method; | ^^^^^^ function or associated item not found in `Struct` -error[E0599]: no associated item named `Assoc` found for type `Struct` in the current scope +error[E0599]: no associated item named `Assoc` found for struct `Struct` in the current scope --> $DIR/issue-23173.rs:12:13 | LL | struct Struct { diff --git a/src/test/ui/issues/issue-23217.rs b/src/test/ui/issues/issue-23217.rs index 157f20d22d..09f9ebccf2 100644 --- a/src/test/ui/issues/issue-23217.rs +++ b/src/test/ui/issues/issue-23217.rs @@ -1,5 +1,5 @@ pub enum SomeEnum { - B = SomeEnum::A, //~ ERROR no variant or associated item named `A` found for type `SomeEnum` + B = SomeEnum::A, //~ ERROR no variant or associated item named `A` found } fn main() {} diff --git a/src/test/ui/issues/issue-23217.stderr b/src/test/ui/issues/issue-23217.stderr index 97100ed375..a81b459a34 100644 --- a/src/test/ui/issues/issue-23217.stderr +++ b/src/test/ui/issues/issue-23217.stderr @@ -1,4 +1,4 @@ -error[E0599]: no variant or associated item named `A` found for type `SomeEnum` in the current scope +error[E0599]: no variant or associated item named `A` found for enum `SomeEnum` in the current scope --> $DIR/issue-23217.rs:2:19 | LL | pub enum SomeEnum { diff --git a/src/test/ui/issues/issue-23311.rs b/src/test/ui/issues/issue-23311.rs index f275c6338b..62c96840b3 100644 --- a/src/test/ui/issues/issue-23311.rs +++ b/src/test/ui/issues/issue-23311.rs @@ -1,7 +1,6 @@ // run-pass -// Test that we do not ICE when pattern matching an array against a slice. -#![feature(slice_patterns)] +// Test that we do not ICE when pattern matching an array against a slice. fn main() { match "foo".as_bytes() { diff --git a/src/test/ui/issues/issue-23458.rs b/src/test/ui/issues/issue-23458.rs index 90b3f1f971..521db37170 100644 --- a/src/test/ui/issues/issue-23458.rs +++ b/src/test/ui/issues/issue-23458.rs @@ -1,5 +1,6 @@ #![feature(asm)] +// build-fail // only-x86_64 fn main() { diff --git a/src/test/ui/issues/issue-23458.stderr b/src/test/ui/issues/issue-23458.stderr index aff0f82af6..76c3e6da82 100644 --- a/src/test/ui/issues/issue-23458.stderr +++ b/src/test/ui/issues/issue-23458.stderr @@ -1,5 +1,5 @@ error: invalid operand in inline asm: 'int $3' - --> $DIR/issue-23458.rs:7:9 + --> $DIR/issue-23458.rs:8:9 | LL | asm!("int $3"); | ^^^^^^^^^^^^^^^ @@ -8,7 +8,7 @@ error: <inline asm>:1:2: error: too few operands for instruction int ^ - --> $DIR/issue-23458.rs:7:9 + --> $DIR/issue-23458.rs:8:9 | LL | asm!("int $3"); | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/issues/issue-23595-2.stderr b/src/test/ui/issues/issue-23595-2.stderr index f1004db0b0..dded673f6e 100644 --- a/src/test/ui/issues/issue-23595-2.stderr +++ b/src/test/ui/issues/issue-23595-2.stderr @@ -1,8 +1,8 @@ error[E0220]: associated type `anything_here_kills_it` not found for `Self` - --> $DIR/issue-23595-2.rs:6:16 + --> $DIR/issue-23595-2.rs:6:22 | LL | type B = C<Self::anything_here_kills_it>; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ associated type `anything_here_kills_it` not found + | ^^^^^^^^^^^^^^^^^^^^^^ associated type `anything_here_kills_it` not found error: aborting due to previous error diff --git a/src/test/ui/issues/issue-24036.rs b/src/test/ui/issues/issue-24036.rs index 2f501b941b..bd82f95c9e 100644 --- a/src/test/ui/issues/issue-24036.rs +++ b/src/test/ui/issues/issue-24036.rs @@ -10,7 +10,7 @@ fn closure_from_match() { 2 => |c| c - 1, _ => |c| c - 1 }; - //~^^^ ERROR match arms have incompatible types + //~^^^ ERROR `match` arms have incompatible types } fn main() { } diff --git a/src/test/ui/issues/issue-24036.stderr b/src/test/ui/issues/issue-24036.stderr index 04817f2596..036c05fc84 100644 --- a/src/test/ui/issues/issue-24036.stderr +++ b/src/test/ui/issues/issue-24036.stderr @@ -1,6 +1,8 @@ error[E0308]: mismatched types --> $DIR/issue-24036.rs:3:9 | +LL | let mut x = |c| c + 1; + | --------- the expected closure LL | x = |c| c + 1; | ^^^^^^^^^ expected closure, found a different closure | @@ -9,7 +11,7 @@ LL | x = |c| c + 1; = note: no two closures, even if identical, have the same type = help: consider boxing your closure and/or using it as a trait object -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/issue-24036.rs:10:14 | LL | let x = match 1usize { diff --git a/src/test/ui/issues/issue-24363.rs b/src/test/ui/issues/issue-24363.rs index a5b45f13e7..34726fba9c 100644 --- a/src/test/ui/issues/issue-24363.rs +++ b/src/test/ui/issues/issue-24363.rs @@ -1,6 +1,6 @@ fn main() { 1.create_a_type_error[ //~ `{integer}` is a primitive type and therefore doesn't have fields - ()+() //~ ERROR binary operation `+` cannot be applied + ()+() //~ ERROR cannot add // ^ ensure that we typeck the inner expression ^ ]; } diff --git a/src/test/ui/issues/issue-24363.stderr b/src/test/ui/issues/issue-24363.stderr index 50d65e09bb..a60fb24ec1 100644 --- a/src/test/ui/issues/issue-24363.stderr +++ b/src/test/ui/issues/issue-24363.stderr @@ -4,7 +4,7 @@ error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields LL | 1.create_a_type_error[ | ^^^^^^^^^^^^^^^^^^^ -error[E0369]: binary operation `+` cannot be applied to type `()` +error[E0369]: cannot add `()` to `()` --> $DIR/issue-24363.rs:3:11 | LL | ()+() diff --git a/src/test/ui/issues/issue-25368.stderr b/src/test/ui/issues/issue-25368.stderr index de020d4b56..a09de86a70 100644 --- a/src/test/ui/issues/issue-25368.stderr +++ b/src/test/ui/issues/issue-25368.stderr @@ -5,7 +5,7 @@ LL | let (tx, rx) = channel(); | -------- consider giving this pattern the explicit type `(std::sync::mpsc::Sender<Foo<T>>, std::sync::mpsc::Receiver<Foo<T>>)`, where the type parameter `T` is specified ... LL | tx.send(Foo{ foo: PhantomData }); - | ^^^ cannot infer type for type parameter `T` + | ^^^ cannot infer type for type parameter `T` declared on the struct `Foo` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-25385.rs b/src/test/ui/issues/issue-25385.rs index adad6c35a3..ea042a6c76 100644 --- a/src/test/ui/issues/issue-25385.rs +++ b/src/test/ui/issues/issue-25385.rs @@ -1,6 +1,6 @@ macro_rules! foo { ($e:expr) => { $e.foo() } - //~^ ERROR no method named `foo` found for type `i32` in the current scope + //~^ ERROR no method named `foo` found } fn main() { @@ -8,5 +8,5 @@ fn main() { foo!(a); foo!(1i32.foo()); - //~^ ERROR no method named `foo` found for type `i32` in the current scope + //~^ ERROR no method named `foo` found } diff --git a/src/test/ui/issues/issue-26093.rs b/src/test/ui/issues/issue-26093.rs index 7895c90068..c838515caf 100644 --- a/src/test/ui/issues/issue-26093.rs +++ b/src/test/ui/issues/issue-26093.rs @@ -1,7 +1,9 @@ macro_rules! not_a_place { ($thing:expr) => { $thing = 42; - //~^ ERROR invalid left-hand side expression + //~^ ERROR invalid left-hand side of assignment + $thing += 42; + //~^ ERROR invalid left-hand side of assignment } } diff --git a/src/test/ui/issues/issue-26093.stderr b/src/test/ui/issues/issue-26093.stderr index 947c52f08d..c96228b518 100644 --- a/src/test/ui/issues/issue-26093.stderr +++ b/src/test/ui/issues/issue-26093.stderr @@ -1,12 +1,28 @@ -error[E0070]: invalid left-hand side expression - --> $DIR/issue-26093.rs:3:9 +error[E0070]: invalid left-hand side of assignment + --> $DIR/issue-26093.rs:3:16 | LL | $thing = 42; - | ^^^^^^^^^^^ left-hand of expression not valid + | ^ ... LL | not_a_place!(99); - | ----------------- in this macro invocation + | ----------------- + | | | + | | cannot assign to this expression + | in this macro invocation -error: aborting due to previous error +error[E0067]: invalid left-hand side of assignment + --> $DIR/issue-26093.rs:5:16 + | +LL | $thing += 42; + | ^^ +... +LL | not_a_place!(99); + | ----------------- + | | | + | | cannot assign to this expression + | in this macro invocation + +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0070`. +Some errors have detailed explanations: E0067, E0070. +For more information about an error, try `rustc --explain E0067`. diff --git a/src/test/ui/issues/issue-26217.stderr b/src/test/ui/issues/issue-26217.stderr index 8bcc62ab2e..be9da569f8 100644 --- a/src/test/ui/issues/issue-26217.stderr +++ b/src/test/ui/issues/issue-26217.stderr @@ -8,3 +8,4 @@ LL | foo::<&'a i32>(); error: aborting due to previous error +For more information about this error, try `rustc --explain E0477`. diff --git a/src/test/ui/issues/issue-26619.rs b/src/test/ui/issues/issue-26619.rs index 00e09f3f07..b9d34b0555 100644 --- a/src/test/ui/issues/issue-26619.rs +++ b/src/test/ui/issues/issue-26619.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - pub struct History<'a> { pub _s: &'a str } impl<'a> History<'a> { diff --git a/src/test/ui/issues/issue-26619.stderr b/src/test/ui/issues/issue-26619.stderr index d1157cda92..1282fd7d3c 100644 --- a/src/test/ui/issues/issue-26619.stderr +++ b/src/test/ui/issues/issue-26619.stderr @@ -1,5 +1,5 @@ error[E0515]: cannot return value referencing function parameter - --> $DIR/issue-26619.rs:7:76 + --> $DIR/issue-26619.rs:5:76 | LL | for s in vec!["1|2".to_string()].into_iter().filter_map(|ref line| self.make_entry(line)) { | -------- ^^^^^^^^^^^^^^^^^^^^^ returns a value referencing data owned by the current function diff --git a/src/test/ui/issues/issue-26638.stderr b/src/test/ui/issues/issue-26638.stderr index 6d7c1b0c43..85d5d9cc42 100644 --- a/src/test/ui/issues/issue-26638.stderr +++ b/src/test/ui/issues/issue-26638.stderr @@ -2,9 +2,13 @@ error[E0106]: missing lifetime specifier --> $DIR/issue-26638.rs:1:62 | LL | fn parse_type(iter: Box<dyn Iterator<Item=&str>+'static>) -> &str { iter.next() } - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say which one of `iter`'s 2 lifetimes it is borrowed from +help: consider introducing a named lifetime parameter + | +LL | fn parse_type<'lifetime>(iter: Box<dyn Iterator<Item=&str>+'static>) -> &'lifetime str { iter.next() } + | ^^^^^^^^^^^ ^^^^^^^^^^ error[E0106]: missing lifetime specifier --> $DIR/issue-26638.rs:4:40 diff --git a/src/test/ui/issues/issue-27033.rs b/src/test/ui/issues/issue-27033.rs index 7120dee633..2798e51090 100644 --- a/src/test/ui/issues/issue-27033.rs +++ b/src/test/ui/issues/issue-27033.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl fn main() { match Some(1) { None @ _ => {} //~ ERROR match bindings cannot shadow unit variants diff --git a/src/test/ui/issues/issue-27033.stderr b/src/test/ui/issues/issue-27033.stderr index d3f8407f8e..c0de0f1426 100644 --- a/src/test/ui/issues/issue-27033.stderr +++ b/src/test/ui/issues/issue-27033.stderr @@ -1,5 +1,5 @@ error[E0530]: match bindings cannot shadow unit variants - --> $DIR/issue-27033.rs:4:9 + --> $DIR/issue-27033.rs:7:9 | LL | None @ _ => {} | ^^^^ cannot be named the same as a unit variant @@ -10,7 +10,7 @@ LL | pub use crate::option::Option::{self, None, Some}; | ---- the unit variant `None` is defined here error[E0530]: match bindings cannot shadow constants - --> $DIR/issue-27033.rs:8:9 + --> $DIR/issue-27033.rs:11:9 | LL | const C: u8 = 1; | ---------------- the constant `C` is defined here diff --git a/src/test/ui/issues/issue-2823.stderr b/src/test/ui/issues/issue-2823.stderr index c9ede03003..aa720fd458 100644 --- a/src/test/ui/issues/issue-2823.stderr +++ b/src/test/ui/issues/issue-2823.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `clone` found for type `C` in the current scope +error[E0599]: no method named `clone` found for struct `C` in the current scope --> $DIR/issue-2823.rs:13:16 | LL | struct C { diff --git a/src/test/ui/issues/issue-28344.stderr b/src/test/ui/issues/issue-28344.stderr index 34ce2358a0..77bc829209 100644 --- a/src/test/ui/issues/issue-28344.stderr +++ b/src/test/ui/issues/issue-28344.stderr @@ -1,10 +1,10 @@ -error[E0191]: the value of the associated type `Output` (from the trait `std::ops::BitXor`) must be specified +error[E0191]: the value of the associated type `Output` (from trait `std::ops::BitXor`) must be specified --> $DIR/issue-28344.rs:4:17 | LL | let x: u8 = BitXor::bitor(0 as u8, 0 as u8); - | ^^^^^^^^^^^^^ associated type `Output` must be specified + | ^^^^^^ help: specify the associated type: `BitXor<Output = Type>` -error[E0599]: no function or associated item named `bitor` found for type `dyn std::ops::BitXor<_>` in the current scope +error[E0599]: no function or associated item named `bitor` found for trait object `dyn std::ops::BitXor<_>` in the current scope --> $DIR/issue-28344.rs:4:25 | LL | let x: u8 = BitXor::bitor(0 as u8, 0 as u8); @@ -13,13 +13,13 @@ LL | let x: u8 = BitXor::bitor(0 as u8, 0 as u8); | function or associated item not found in `dyn std::ops::BitXor<_>` | help: there is a method with a similar name: `bitxor` -error[E0191]: the value of the associated type `Output` (from the trait `std::ops::BitXor`) must be specified +error[E0191]: the value of the associated type `Output` (from trait `std::ops::BitXor`) must be specified --> $DIR/issue-28344.rs:8:13 | LL | let g = BitXor::bitor; - | ^^^^^^^^^^^^^ associated type `Output` must be specified + | ^^^^^^ help: specify the associated type: `BitXor<Output = Type>` -error[E0599]: no function or associated item named `bitor` found for type `dyn std::ops::BitXor<_>` in the current scope +error[E0599]: no function or associated item named `bitor` found for trait object `dyn std::ops::BitXor<_>` in the current scope --> $DIR/issue-28344.rs:8:21 | LL | let g = BitXor::bitor; diff --git a/src/test/ui/issues/issue-28388-2.stderr b/src/test/ui/issues/issue-28388-2.stderr index 7bbe0bc5ff..58bd775f29 100644 --- a/src/test/ui/issues/issue-28388-2.stderr +++ b/src/test/ui/issues/issue-28388-2.stderr @@ -2,7 +2,13 @@ error[E0603]: module `n` is private --> $DIR/issue-28388-2.rs:7:8 | LL | use m::n::{}; - | ^ + | ^ this module is private + | +note: the module `n` is defined here + --> $DIR/issue-28388-2.rs:4:5 + | +LL | mod n {} + | ^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-28586.rs b/src/test/ui/issues/issue-28586.rs index 4d286be1e3..c543ef9b0e 100644 --- a/src/test/ui/issues/issue-28586.rs +++ b/src/test/ui/issues/issue-28586.rs @@ -2,6 +2,6 @@ pub trait Foo {} impl Foo for [u8; usize::BYTES] {} -//~^ ERROR no associated item named `BYTES` found for type `usize` +//~^ ERROR no associated item named `BYTES` found fn main() { } diff --git a/src/test/ui/issues/issue-28837.rs b/src/test/ui/issues/issue-28837.rs index 114473f3ac..f874b00db0 100644 --- a/src/test/ui/issues/issue-28837.rs +++ b/src/test/ui/issues/issue-28837.rs @@ -3,23 +3,23 @@ struct A; fn main() { let a = A; - a + a; //~ ERROR binary operation `+` cannot be applied to type `A` + a + a; //~ ERROR cannot add `A` to `A` - a - a; //~ ERROR binary operation `-` cannot be applied to type `A` + a - a; //~ ERROR cannot subtract `A` from `A` - a * a; //~ ERROR binary operation `*` cannot be applied to type `A` + a * a; //~ ERROR cannot multiply `A` to `A` - a / a; //~ ERROR binary operation `/` cannot be applied to type `A` + a / a; //~ ERROR cannot divide `A` by `A` - a % a; //~ ERROR binary operation `%` cannot be applied to type `A` + a % a; //~ ERROR cannot mod `A` by `A` - a & a; //~ ERROR binary operation `&` cannot be applied to type `A` + a & a; //~ ERROR no implementation for `A & A` - a | a; //~ ERROR binary operation `|` cannot be applied to type `A` + a | a; //~ ERROR no implementation for `A | A` - a << a; //~ ERROR binary operation `<<` cannot be applied to type `A` + a << a; //~ ERROR no implementation for `A << A` - a >> a; //~ ERROR binary operation `>>` cannot be applied to type `A` + a >> a; //~ ERROR no implementation for `A >> A` a == a; //~ ERROR binary operation `==` cannot be applied to type `A` diff --git a/src/test/ui/issues/issue-28837.stderr b/src/test/ui/issues/issue-28837.stderr index ac2a9f2203..b63e168caf 100644 --- a/src/test/ui/issues/issue-28837.stderr +++ b/src/test/ui/issues/issue-28837.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `A` +error[E0369]: cannot add `A` to `A` --> $DIR/issue-28837.rs:6:7 | LL | a + a; @@ -8,7 +8,7 @@ LL | a + a; | = note: an implementation of `std::ops::Add` might be missing for `A` -error[E0369]: binary operation `-` cannot be applied to type `A` +error[E0369]: cannot subtract `A` from `A` --> $DIR/issue-28837.rs:8:7 | LL | a - a; @@ -18,7 +18,7 @@ LL | a - a; | = note: an implementation of `std::ops::Sub` might be missing for `A` -error[E0369]: binary operation `*` cannot be applied to type `A` +error[E0369]: cannot multiply `A` to `A` --> $DIR/issue-28837.rs:10:7 | LL | a * a; @@ -28,7 +28,7 @@ LL | a * a; | = note: an implementation of `std::ops::Mul` might be missing for `A` -error[E0369]: binary operation `/` cannot be applied to type `A` +error[E0369]: cannot divide `A` by `A` --> $DIR/issue-28837.rs:12:7 | LL | a / a; @@ -38,7 +38,7 @@ LL | a / a; | = note: an implementation of `std::ops::Div` might be missing for `A` -error[E0369]: binary operation `%` cannot be applied to type `A` +error[E0369]: cannot mod `A` by `A` --> $DIR/issue-28837.rs:14:7 | LL | a % a; @@ -48,7 +48,7 @@ LL | a % a; | = note: an implementation of `std::ops::Rem` might be missing for `A` -error[E0369]: binary operation `&` cannot be applied to type `A` +error[E0369]: no implementation for `A & A` --> $DIR/issue-28837.rs:16:7 | LL | a & a; @@ -58,7 +58,7 @@ LL | a & a; | = note: an implementation of `std::ops::BitAnd` might be missing for `A` -error[E0369]: binary operation `|` cannot be applied to type `A` +error[E0369]: no implementation for `A | A` --> $DIR/issue-28837.rs:18:7 | LL | a | a; @@ -68,7 +68,7 @@ LL | a | a; | = note: an implementation of `std::ops::BitOr` might be missing for `A` -error[E0369]: binary operation `<<` cannot be applied to type `A` +error[E0369]: no implementation for `A << A` --> $DIR/issue-28837.rs:20:7 | LL | a << a; @@ -78,7 +78,7 @@ LL | a << a; | = note: an implementation of `std::ops::Shl` might be missing for `A` -error[E0369]: binary operation `>>` cannot be applied to type `A` +error[E0369]: no implementation for `A >> A` --> $DIR/issue-28837.rs:22:7 | LL | a >> a; diff --git a/src/test/ui/issues/issue-28971.rs b/src/test/ui/issues/issue-28971.rs index 6493565d21..f0a1e2d006 100644 --- a/src/test/ui/issues/issue-28971.rs +++ b/src/test/ui/issues/issue-28971.rs @@ -5,7 +5,7 @@ fn main(){ foo(|| { match Foo::Bar(1) { Foo::Baz(..) => (), - //~^ ERROR no variant or associated item named `Baz` found for type `Foo` + //~^ ERROR no variant or associated item named `Baz` found _ => (), } }); diff --git a/src/test/ui/issues/issue-28971.stderr b/src/test/ui/issues/issue-28971.stderr index 7411896443..2736ee881d 100644 --- a/src/test/ui/issues/issue-28971.stderr +++ b/src/test/ui/issues/issue-28971.stderr @@ -1,4 +1,4 @@ -error[E0599]: no variant or associated item named `Baz` found for type `Foo` in the current scope +error[E0599]: no variant or associated item named `Baz` found for enum `Foo` in the current scope --> $DIR/issue-28971.rs:7:18 | LL | enum Foo { diff --git a/src/test/ui/issues/issue-29124.rs b/src/test/ui/issues/issue-29124.rs index 1cd3f84f7a..dd27848417 100644 --- a/src/test/ui/issues/issue-29124.rs +++ b/src/test/ui/issues/issue-29124.rs @@ -13,7 +13,7 @@ fn func() -> Ret { fn main() { Obj::func.x(); - //~^ ERROR no method named `x` found for type `fn() -> Ret {Obj::func}` in the current scope + //~^ ERROR no method named `x` found func.x(); - //~^ ERROR no method named `x` found for type `fn() -> Ret {func}` in the current scope + //~^ ERROR no method named `x` found } diff --git a/src/test/ui/issues/issue-29124.stderr b/src/test/ui/issues/issue-29124.stderr index c537c6118f..42d89cd01a 100644 --- a/src/test/ui/issues/issue-29124.stderr +++ b/src/test/ui/issues/issue-29124.stderr @@ -1,18 +1,18 @@ -error[E0599]: no method named `x` found for type `fn() -> Ret {Obj::func}` in the current scope +error[E0599]: no method named `x` found for fn item `fn() -> Ret {Obj::func}` in the current scope --> $DIR/issue-29124.rs:15:15 | LL | Obj::func.x(); | ^ method not found in `fn() -> Ret {Obj::func}` | - = note: Obj::func is a function, perhaps you wish to call it + = note: `Obj::func` is a function, perhaps you wish to call it -error[E0599]: no method named `x` found for type `fn() -> Ret {func}` in the current scope +error[E0599]: no method named `x` found for fn item `fn() -> Ret {func}` in the current scope --> $DIR/issue-29124.rs:17:10 | LL | func.x(); | ^ method not found in `fn() -> Ret {func}` | - = note: func is a function, perhaps you wish to call it + = note: `func` is a function, perhaps you wish to call it error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-29161.stderr b/src/test/ui/issues/issue-29161.stderr index d30fd28a4a..1bfa211ef7 100644 --- a/src/test/ui/issues/issue-29161.stderr +++ b/src/test/ui/issues/issue-29161.stderr @@ -8,7 +8,13 @@ error[E0603]: struct `A` is private --> $DIR/issue-29161.rs:13:8 | LL | a::A::default(); - | ^ + | ^ this struct is private + | +note: the struct `A` is defined here + --> $DIR/issue-29161.rs:2:5 + | +LL | struct A; + | ^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-30123.rs b/src/test/ui/issues/issue-30123.rs index 4fc32e0de8..705355d91b 100644 --- a/src/test/ui/issues/issue-30123.rs +++ b/src/test/ui/issues/issue-30123.rs @@ -5,5 +5,5 @@ use issue_30123_aux::*; fn main() { let ug = Graph::<i32, i32>::new_undirected(); - //~^ ERROR no function or associated item named `new_undirected` found for type + //~^ ERROR no function or associated item named `new_undirected` found } diff --git a/src/test/ui/issues/issue-30123.stderr b/src/test/ui/issues/issue-30123.stderr index 32bbd4d03d..bc6731601f 100644 --- a/src/test/ui/issues/issue-30123.stderr +++ b/src/test/ui/issues/issue-30123.stderr @@ -1,4 +1,4 @@ -error[E0599]: no function or associated item named `new_undirected` found for type `issue_30123_aux::Graph<i32, i32>` in the current scope +error[E0599]: no function or associated item named `new_undirected` found for struct `issue_30123_aux::Graph<i32, i32>` in the current scope --> $DIR/issue-30123.rs:7:33 | LL | let ug = Graph::<i32, i32>::new_undirected(); diff --git a/src/test/ui/issues/issue-30255.stderr b/src/test/ui/issues/issue-30255.stderr index c53129b7f2..c940227764 100644 --- a/src/test/ui/issues/issue-30255.stderr +++ b/src/test/ui/issues/issue-30255.stderr @@ -2,25 +2,37 @@ error[E0106]: missing lifetime specifier --> $DIR/issue-30255.rs:9:24 | LL | fn f(a: &S, b: i32) -> &i32 { - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say which one of `a`'s 2 lifetimes it is borrowed from +help: consider introducing a named lifetime parameter + | +LL | fn f<'lifetime>(a: &S, b: i32) -> &'lifetime i32 { + | ^^^^^^^^^^^ ^^^^^^^^^^ error[E0106]: missing lifetime specifier --> $DIR/issue-30255.rs:14:34 | LL | fn g(a: &S, b: bool, c: &i32) -> &i32 { - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `a`'s 2 lifetimes or `c` +help: consider introducing a named lifetime parameter + | +LL | fn g<'lifetime>(a: &S, b: bool, c: &i32) -> &'lifetime i32 { + | ^^^^^^^^^^^ ^^^^^^^^^^ error[E0106]: missing lifetime specifier --> $DIR/issue-30255.rs:19:44 | LL | fn h(a: &bool, b: bool, c: &S, d: &i32) -> &i32 { - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `a`, one of `c`'s 2 lifetimes, or `d` +help: consider introducing a named lifetime parameter + | +LL | fn h<'lifetime>(a: &bool, b: bool, c: &S, d: &i32) -> &'lifetime i32 { + | ^^^^^^^^^^^ ^^^^^^^^^^ error: aborting due to 3 previous errors diff --git a/src/test/ui/issues/issue-30302.stderr b/src/test/ui/issues/issue-30302.stderr index d762d6f2b3..ac1b5235f4 100644 --- a/src/test/ui/issues/issue-30302.stderr +++ b/src/test/ui/issues/issue-30302.stderr @@ -3,6 +3,8 @@ warning[E0170]: pattern binding `Nil` is named the same as one of the variants o | LL | Nil => true, | ^^^ help: to match on the variant, qualify the path: `Stack::Nil` + | + = note: `#[warn(bindings_with_variant_name)]` on by default error: unreachable pattern --> $DIR/issue-30302.rs:15:9 diff --git a/src/test/ui/issues/issue-31076.rs b/src/test/ui/issues/issue-31076.rs index e4531072e9..f9c35526ec 100644 --- a/src/test/ui/issues/issue-31076.rs +++ b/src/test/ui/issues/issue-31076.rs @@ -11,7 +11,7 @@ impl Add<i32> for i32 {} fn main() { let x = 5 + 6; - //~^ ERROR binary operation `+` cannot be applied to type `{integer}` + //~^ ERROR cannot add `{integer}` to `{integer}` let y = 5i32 + 6i32; - //~^ ERROR binary operation `+` cannot be applied to type `i32` + //~^ ERROR cannot add `i32` to `i32` } diff --git a/src/test/ui/issues/issue-31076.stderr b/src/test/ui/issues/issue-31076.stderr index 60a3be1c36..5d65734cd2 100644 --- a/src/test/ui/issues/issue-31076.stderr +++ b/src/test/ui/issues/issue-31076.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `{integer}` +error[E0369]: cannot add `{integer}` to `{integer}` --> $DIR/issue-31076.rs:13:15 | LL | let x = 5 + 6; @@ -8,7 +8,7 @@ LL | let x = 5 + 6; | = note: an implementation of `std::ops::Add` might be missing for `{integer}` -error[E0369]: binary operation `+` cannot be applied to type `i32` +error[E0369]: cannot add `i32` to `i32` --> $DIR/issue-31076.rs:15:18 | LL | let y = 5i32 + 6i32; diff --git a/src/test/ui/issues/issue-31173.stderr b/src/test/ui/issues/issue-31173.stderr index 38cf3c4f93..a614b96ac1 100644 --- a/src/test/ui/issues/issue-31173.stderr +++ b/src/test/ui/issues/issue-31173.stderr @@ -7,7 +7,7 @@ LL | .cloned() = note: expected type `u8` found reference `&_` -error[E0599]: no method named `collect` found for type `std::iter::Cloned<std::iter::TakeWhile<&mut std::vec::IntoIter<u8>, [closure@$DIR/issue-31173.rs:6:39: 9:6 found_e:_]>>` in the current scope +error[E0599]: no method named `collect` found for struct `std::iter::Cloned<std::iter::TakeWhile<&mut std::vec::IntoIter<u8>, [closure@$DIR/issue-31173.rs:6:39: 9:6 found_e:_]>>` in the current scope --> $DIR/issue-31173.rs:14:10 | LL | .collect(); diff --git a/src/test/ui/issues/issue-32963.rs b/src/test/ui/issues/issue-32963.rs index ee099069f0..3e6cf446da 100644 --- a/src/test/ui/issues/issue-32963.rs +++ b/src/test/ui/issues/issue-32963.rs @@ -7,5 +7,6 @@ fn size_of_copy<T: Copy+?Sized>() -> usize { mem::size_of::<T>() } fn main() { size_of_copy::<dyn Misc + Copy>(); //~^ ERROR only auto traits can be used as additional traits in a trait object + //~| ERROR only auto traits can be used as additional traits in a trait object //~| ERROR the trait bound `dyn Misc: std::marker::Copy` is not satisfied } diff --git a/src/test/ui/issues/issue-32963.stderr b/src/test/ui/issues/issue-32963.stderr index e3564e8670..450c37f456 100644 --- a/src/test/ui/issues/issue-32963.stderr +++ b/src/test/ui/issues/issue-32963.stderr @@ -9,6 +9,17 @@ LL | size_of_copy::<dyn Misc + Copy>(); | first non-auto trait | trait alias used in trait object type (first use) +error[E0225]: only auto traits can be used as additional traits in a trait object + --> $DIR/issue-32963.rs:8:31 + | +LL | size_of_copy::<dyn Misc + Copy>(); + | ---- ^^^^ + | | | + | | additional non-auto trait + | | trait alias used in trait object type (additional use) + | first non-auto trait + | trait alias used in trait object type (first use) + error[E0277]: the trait bound `dyn Misc: std::marker::Copy` is not satisfied --> $DIR/issue-32963.rs:8:5 | @@ -18,7 +29,7 @@ LL | fn size_of_copy<T: Copy+?Sized>() -> usize { mem::size_of::<T>() } LL | size_of_copy::<dyn Misc + Copy>(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `dyn Misc` -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors Some errors have detailed explanations: E0225, E0277. For more information about an error, try `rustc --explain E0225`. diff --git a/src/test/ui/issues/issue-33571.rs b/src/test/ui/issues/issue-33571.rs index 147fb3fa8c..2713f47ad2 100644 --- a/src/test/ui/issues/issue-33571.rs +++ b/src/test/ui/issues/issue-33571.rs @@ -1,5 +1,6 @@ #[derive(Clone, Sync, //~ ERROR cannot find derive macro `Sync` in this scope + //~| ERROR cannot find derive macro `Sync` in this scope Copy)] enum Foo {} diff --git a/src/test/ui/issues/issue-33571.stderr b/src/test/ui/issues/issue-33571.stderr index 78e7202077..2a9ba5ba71 100644 --- a/src/test/ui/issues/issue-33571.stderr +++ b/src/test/ui/issues/issue-33571.stderr @@ -10,5 +10,17 @@ note: unsafe traits like `Sync` should be implemented explicitly LL | Sync, | ^^^^ -error: aborting due to previous error +error: cannot find derive macro `Sync` in this scope + --> $DIR/issue-33571.rs:2:10 + | +LL | Sync, + | ^^^^ + | +note: unsafe traits like `Sync` should be implemented explicitly + --> $DIR/issue-33571.rs:2:10 + | +LL | Sync, + | ^^^^ + +error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-33575.rs b/src/test/ui/issues/issue-33575.rs index 09c499452a..de544afae7 100644 --- a/src/test/ui/issues/issue-33575.rs +++ b/src/test/ui/issues/issue-33575.rs @@ -1,4 +1,4 @@ fn main() { - let baz = ().foo(); //~ ERROR no method named `foo` found for type `()` in the current scope + let baz = ().foo(); //~ ERROR no method named `foo` found <i32 as std::str::FromStr>::from_str(&baz); // No complaints about `str` being unsized } diff --git a/src/test/ui/issues/issue-33575.stderr b/src/test/ui/issues/issue-33575.stderr index e6b74d262c..bbd8042d1c 100644 --- a/src/test/ui/issues/issue-33575.stderr +++ b/src/test/ui/issues/issue-33575.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `foo` found for type `()` in the current scope +error[E0599]: no method named `foo` found for unit type `()` in the current scope --> $DIR/issue-33575.rs:2:18 | LL | let baz = ().foo(); diff --git a/src/test/ui/issues/issue-34209.rs b/src/test/ui/issues/issue-34209.rs index fc2c3679e1..632ddb91b3 100644 --- a/src/test/ui/issues/issue-34209.rs +++ b/src/test/ui/issues/issue-34209.rs @@ -4,7 +4,7 @@ enum S { fn bug(l: S) { match l { - S::B {} => {}, //~ ERROR no variant `B` in enum `S` + S::B {} => {}, //~ ERROR no variant named `B` found for enum `S` } } diff --git a/src/test/ui/issues/issue-34209.stderr b/src/test/ui/issues/issue-34209.stderr index 194bb2bfab..f9a25b69ff 100644 --- a/src/test/ui/issues/issue-34209.stderr +++ b/src/test/ui/issues/issue-34209.stderr @@ -1,4 +1,4 @@ -error: no variant `B` in enum `S` +error[E0599]: no variant named `B` found for enum `S` --> $DIR/issue-34209.rs:7:12 | LL | enum S { @@ -9,3 +9,4 @@ LL | S::B {} => {}, error: aborting due to previous error +For more information about this error, try `rustc --explain E0599`. diff --git a/src/test/ui/issues/issue-34229.rs b/src/test/ui/issues/issue-34229.rs index 13e627a492..625fcb0a6f 100644 --- a/src/test/ui/issues/issue-34229.rs +++ b/src/test/ui/issues/issue-34229.rs @@ -1,5 +1,9 @@ #[derive(PartialEq)] struct Comparable; #[derive(PartialEq, PartialOrd)] struct Nope(Comparable); //~^ ERROR can't compare `Comparable` +//~| ERROR can't compare `Comparable` +//~| ERROR can't compare `Comparable` +//~| ERROR can't compare `Comparable` +//~| ERROR can't compare `Comparable` fn main() {} diff --git a/src/test/ui/issues/issue-34229.stderr b/src/test/ui/issues/issue-34229.stderr index c57f80cd40..9e1734899b 100644 --- a/src/test/ui/issues/issue-34229.stderr +++ b/src/test/ui/issues/issue-34229.stderr @@ -7,6 +7,42 @@ LL | #[derive(PartialEq, PartialOrd)] struct Nope(Comparable); = help: the trait `std::cmp::PartialOrd` is not implemented for `Comparable` = note: required by `std::cmp::PartialOrd::partial_cmp` -error: aborting due to previous error +error[E0277]: can't compare `Comparable` with `Comparable` + --> $DIR/issue-34229.rs:2:46 + | +LL | #[derive(PartialEq, PartialOrd)] struct Nope(Comparable); + | ^^^^^^^^^^ no implementation for `Comparable < Comparable` and `Comparable > Comparable` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Comparable` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Comparable` with `Comparable` + --> $DIR/issue-34229.rs:2:46 + | +LL | #[derive(PartialEq, PartialOrd)] struct Nope(Comparable); + | ^^^^^^^^^^ no implementation for `Comparable < Comparable` and `Comparable > Comparable` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Comparable` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Comparable` with `Comparable` + --> $DIR/issue-34229.rs:2:46 + | +LL | #[derive(PartialEq, PartialOrd)] struct Nope(Comparable); + | ^^^^^^^^^^ no implementation for `Comparable < Comparable` and `Comparable > Comparable` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Comparable` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `Comparable` with `Comparable` + --> $DIR/issue-34229.rs:2:46 + | +LL | #[derive(PartialEq, PartialOrd)] struct Nope(Comparable); + | ^^^^^^^^^^ no implementation for `Comparable < Comparable` and `Comparable > Comparable` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `Comparable` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/issues/issue-34334.rs b/src/test/ui/issues/issue-34334.rs index 4457d71cbb..afe4d42edd 100644 --- a/src/test/ui/issues/issue-34334.rs +++ b/src/test/ui/issues/issue-34334.rs @@ -3,9 +3,9 @@ fn main () { //~^ ERROR expected one of `,` or `>`, found `=` //~| ERROR expected value, found struct `Vec` //~| ERROR mismatched types - //~| ERROR invalid left-hand side expression + //~| ERROR invalid left-hand side of assignment //~| ERROR expected expression, found reserved identifier `_` //~| ERROR expected expression, found reserved identifier `_` let sr2: Vec<(u32, _, _)> = sr.iter().map(|(faction, th_sender, th_receiver)| {}).collect(); - //~^ ERROR no method named `iter` found for type `()` in the current scope + //~^ ERROR no method named `iter` found } diff --git a/src/test/ui/issues/issue-34334.stderr b/src/test/ui/issues/issue-34334.stderr index fc90e0674c..c52ea4ef9d 100644 --- a/src/test/ui/issues/issue-34334.stderr +++ b/src/test/ui/issues/issue-34334.stderr @@ -35,13 +35,15 @@ LL | let sr: Vec<(u32, _, _) = vec![]; found struct `std::vec::Vec<_>` = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) -error[E0070]: invalid left-hand side expression - --> $DIR/issue-34334.rs:2:13 +error[E0070]: invalid left-hand side of assignment + --> $DIR/issue-34334.rs:2:29 | LL | let sr: Vec<(u32, _, _) = vec![]; - | ^^^^^^^^^^^^^^^^^^^^^^^^ left-hand of expression not valid + | --------------- ^ + | | + | cannot assign to this expression -error[E0599]: no method named `iter` found for type `()` in the current scope +error[E0599]: no method named `iter` found for unit type `()` in the current scope --> $DIR/issue-34334.rs:9:36 | LL | let sr2: Vec<(u32, _, _)> = sr.iter().map(|(faction, th_sender, th_receiver)| {}).collect(); diff --git a/src/test/ui/issues/issue-35600.rs b/src/test/ui/issues/issue-35600.rs index 9d74726d27..f0bab6010d 100644 --- a/src/test/ui/issues/issue-35600.rs +++ b/src/test/ui/issues/issue-35600.rs @@ -1,5 +1,7 @@ // run-pass +#![allow(non_camel_case_types)] #![allow(unused_variables)] + trait Foo { type bar; fn bar(); diff --git a/src/test/ui/issues/issue-35668.rs b/src/test/ui/issues/issue-35668.rs index 1b8ada57ed..6f6dfb00f8 100644 --- a/src/test/ui/issues/issue-35668.rs +++ b/src/test/ui/issues/issue-35668.rs @@ -1,6 +1,6 @@ fn func<'a, T>(a: &'a [T]) -> impl Iterator<Item=&'a T> { a.iter().map(|a| a*a) - //~^ ERROR binary operation `*` cannot be applied to type `&T` + //~^ ERROR cannot multiply `&T` to `&T` } fn main() { diff --git a/src/test/ui/issues/issue-35668.stderr b/src/test/ui/issues/issue-35668.stderr index 59ca874bd2..9d5796a5ee 100644 --- a/src/test/ui/issues/issue-35668.stderr +++ b/src/test/ui/issues/issue-35668.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `*` cannot be applied to type `&T` +error[E0369]: cannot multiply `&T` to `&T` --> $DIR/issue-35668.rs:2:23 | LL | a.iter().map(|a| a*a) diff --git a/src/test/ui/issues/issue-35677.stderr b/src/test/ui/issues/issue-35677.stderr index b381203856..a998f95d30 100644 --- a/src/test/ui/issues/issue-35677.stderr +++ b/src/test/ui/issues/issue-35677.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `is_subset` found for type `&std::collections::HashSet<T>` in the current scope +error[E0599]: no method named `is_subset` found for reference `&std::collections::HashSet<T>` in the current scope --> $DIR/issue-35677.rs:4:10 | LL | this.is_subset(other) diff --git a/src/test/ui/issues/issue-36617.rs b/src/test/ui/issues/issue-36617.rs index 1102f3c464..58f44f4252 100644 --- a/src/test/ui/issues/issue-36617.rs +++ b/src/test/ui/issues/issue-36617.rs @@ -1,4 +1,5 @@ #![derive(Copy)] //~ ERROR `derive` may only be applied to structs, enums and unions //~| ERROR cannot determine resolution for the derive macro `Copy` + //~| ERROR cannot determine resolution for the derive macro `Copy` fn main() {} diff --git a/src/test/ui/issues/issue-36617.stderr b/src/test/ui/issues/issue-36617.stderr index b5db98f306..98b41b07ea 100644 --- a/src/test/ui/issues/issue-36617.stderr +++ b/src/test/ui/issues/issue-36617.stderr @@ -12,5 +12,13 @@ LL | #![derive(Copy)] | = note: import resolution is stuck, try simplifying macro imports -error: aborting due to 2 previous errors +error: cannot determine resolution for the derive macro `Copy` + --> $DIR/issue-36617.rs:1:11 + | +LL | #![derive(Copy)] + | ^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: aborting due to 3 previous errors diff --git a/src/test/ui/issues/issue-3680.stderr b/src/test/ui/issues/issue-3680.stderr index 8856f0e3a4..713e4b5ccd 100644 --- a/src/test/ui/issues/issue-3680.stderr +++ b/src/test/ui/issues/issue-3680.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-3680.rs:3:9 | LL | match None { - | ---- this match expression has type `std::option::Option<_>` + | ---- this expression has type `std::option::Option<_>` LL | Err(_) => () | ^^^^^^ expected enum `std::option::Option`, found enum `std::result::Result` | diff --git a/src/test/ui/issues/issue-3702-2.stderr b/src/test/ui/issues/issue-3702-2.stderr index 4d0ff750c2..b18e407c3d 100644 --- a/src/test/ui/issues/issue-3702-2.stderr +++ b/src/test/ui/issues/issue-3702-2.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in an impl of the trait `ToPrimitive` for the type | LL | fn to_int(&self) -> isize { 0 } | ^^^^^^^^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `ToPrimitive::to_int(&self)` instead note: candidate #2 is defined in an impl of the trait `Add` for the type `isize` --> $DIR/issue-3702-2.rs:14:5 | LL | fn to_int(&self) -> isize { *self } | ^^^^^^^^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `Add::to_int(&self)` instead +help: disambiguate the method call for candidate #1 + | +LL | ToPrimitive::to_int(&self) + other.to_int() + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | Add::to_int(&self) + other.to_int() + | ^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-37026.stderr b/src/test/ui/issues/issue-37026.stderr index 00952356b1..361369e68b 100644 --- a/src/test/ui/issues/issue-37026.stderr +++ b/src/test/ui/issues/issue-37026.stderr @@ -8,7 +8,9 @@ error[E0308]: mismatched types --> $DIR/issue-37026.rs:7:9 | LL | let empty_struct::XEmpty6(..) = (); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found struct `empty_struct::XEmpty6` + | ^^^^^^^^^^^^^^^^^^^^^^^^^ -- this expression has type `()` + | | + | expected `()`, found struct `empty_struct::XEmpty6` error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-3707.rs b/src/test/ui/issues/issue-3707.rs index 844a2dc006..0817c51ee4 100644 --- a/src/test/ui/issues/issue-3707.rs +++ b/src/test/ui/issues/issue-3707.rs @@ -7,7 +7,7 @@ impl Obj { return 1+1 == 2 } pub fn chirp(&self) { - self.boom(); //~ ERROR no method named `boom` found for type `&Obj` in the current scope + self.boom(); //~ ERROR no method named `boom` found } } diff --git a/src/test/ui/issues/issue-3707.stderr b/src/test/ui/issues/issue-3707.stderr index b98bc572a3..6ca2deee37 100644 --- a/src/test/ui/issues/issue-3707.stderr +++ b/src/test/ui/issues/issue-3707.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `boom` found for type `&Obj` in the current scope +error[E0599]: no method named `boom` found for reference `&Obj` in the current scope --> $DIR/issue-3707.rs:10:14 | LL | self.boom(); diff --git a/src/test/ui/issues/issue-37311-type-length-limit/issue-37311.rs b/src/test/ui/issues/issue-37311-type-length-limit/issue-37311.rs index 9a8dafe139..fec4b17153 100644 --- a/src/test/ui/issues/issue-37311-type-length-limit/issue-37311.rs +++ b/src/test/ui/issues/issue-37311-type-length-limit/issue-37311.rs @@ -1,3 +1,5 @@ +// build-fail + trait Mirror { type Image; } diff --git a/src/test/ui/issues/issue-37311-type-length-limit/issue-37311.stderr b/src/test/ui/issues/issue-37311-type-length-limit/issue-37311.stderr index aead415d23..7a4b59b563 100644 --- a/src/test/ui/issues/issue-37311-type-length-limit/issue-37311.stderr +++ b/src/test/ui/issues/issue-37311-type-length-limit/issue-37311.stderr @@ -1,5 +1,5 @@ error: reached the type-length limit while instantiating `<(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(...))))))))))))))) as Foo>::recurse` - --> $DIR/issue-37311.rs:13:5 + --> $DIR/issue-37311.rs:15:5 | LL | / fn recurse(&self) { LL | | (self, self).recurse(); diff --git a/src/test/ui/issues/issue-37433.rs b/src/test/ui/issues/issue-37433.rs index d3663e24e6..c4d427f3ad 100644 --- a/src/test/ui/issues/issue-37433.rs +++ b/src/test/ui/issues/issue-37433.rs @@ -1,3 +1,4 @@ +// build-fail // ignore-emscripten no asm! support #![feature(asm)] diff --git a/src/test/ui/issues/issue-37433.stderr b/src/test/ui/issues/issue-37433.stderr index 956694fc2c..d9e1c98e9e 100644 --- a/src/test/ui/issues/issue-37433.stderr +++ b/src/test/ui/issues/issue-37433.stderr @@ -1,5 +1,5 @@ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/issue-37433.rs:7:24 + --> $DIR/issue-37433.rs:8:24 | LL | asm!("" :: "r"("")); | ^^ diff --git a/src/test/ui/issues/issue-37598.rs b/src/test/ui/issues/issue-37598.rs index 31b3aba6bc..458e999c3f 100644 --- a/src/test/ui/issues/issue-37598.rs +++ b/src/test/ui/issues/issue-37598.rs @@ -1,5 +1,4 @@ // check-pass -#![feature(slice_patterns)] fn check(list: &[u8]) { match list { diff --git a/src/test/ui/issues/issue-3820.rs b/src/test/ui/issues/issue-3820.rs index fbf60ce278..c090654623 100644 --- a/src/test/ui/issues/issue-3820.rs +++ b/src/test/ui/issues/issue-3820.rs @@ -11,5 +11,5 @@ impl Thing { fn main() { let u = Thing {x: 2}; let _v = u.mul(&3); // This is ok - let w = u * 3; //~ ERROR binary operation `*` cannot be applied to type `Thing` + let w = u * 3; //~ ERROR cannot multiply `{integer}` to `Thing` } diff --git a/src/test/ui/issues/issue-3820.stderr b/src/test/ui/issues/issue-3820.stderr index 35eceb3b3c..8cc768237a 100644 --- a/src/test/ui/issues/issue-3820.stderr +++ b/src/test/ui/issues/issue-3820.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `*` cannot be applied to type `Thing` +error[E0369]: cannot multiply `{integer}` to `Thing` --> $DIR/issue-3820.rs:14:15 | LL | let w = u * 3; diff --git a/src/test/ui/issues/issue-38591.rs b/src/test/ui/issues/issue-38591.rs deleted file mode 100644 index 2f594b48e6..0000000000 --- a/src/test/ui/issues/issue-38591.rs +++ /dev/null @@ -1,10 +0,0 @@ -// check-pass - -struct S<T> { - t : T, - s : Box<S<fn(u : T)>> -} - -fn f(x : S<u32>) {} - -fn main () {} diff --git a/src/test/ui/issues/issue-38715.rs b/src/test/ui/issues/issue-38715.rs index 7e9defab58..9a9a501cae 100644 --- a/src/test/ui/issues/issue-38715.rs +++ b/src/test/ui/issues/issue-38715.rs @@ -2,6 +2,6 @@ macro_rules! foo { ($i:ident) => {} } #[macro_export] -macro_rules! foo { () => {} } //~ ERROR a macro named `foo` has already been exported +macro_rules! foo { () => {} } //~ ERROR the name `foo` is defined multiple times fn main() {} diff --git a/src/test/ui/issues/issue-38715.stderr b/src/test/ui/issues/issue-38715.stderr index d7c4f88ff5..c87d9f7360 100644 --- a/src/test/ui/issues/issue-38715.stderr +++ b/src/test/ui/issues/issue-38715.stderr @@ -1,14 +1,14 @@ -error: a macro named `foo` has already been exported +error[E0428]: the name `foo` is defined multiple times --> $DIR/issue-38715.rs:5:1 | +LL | macro_rules! foo { ($i:ident) => {} } + | ---------------- previous definition of the macro `foo` here +... LL | macro_rules! foo { () => {} } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `foo` already exported - | -note: previous macro export is now shadowed - --> $DIR/issue-38715.rs:2:1 + | ^^^^^^^^^^^^^^^^ `foo` redefined here | -LL | macro_rules! foo { ($i:ident) => {} } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: `foo` must be defined only once in the macro namespace of this module error: aborting due to previous error +For more information about this error, try `rustc --explain E0428`. diff --git a/src/test/ui/issues/issue-38857.rs b/src/test/ui/issues/issue-38857.rs index 81d881c100..c0695f8216 100644 --- a/src/test/ui/issues/issue-38857.rs +++ b/src/test/ui/issues/issue-38857.rs @@ -1,3 +1,8 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl + fn main() { let a = std::sys::imp::process::process_common::StdioPipes { ..panic!() }; //~^ ERROR failed to resolve: could not find `imp` in `sys` [E0433] diff --git a/src/test/ui/issues/issue-38857.stderr b/src/test/ui/issues/issue-38857.stderr index 5762e3d6ac..ba0f1336ff 100644 --- a/src/test/ui/issues/issue-38857.stderr +++ b/src/test/ui/issues/issue-38857.stderr @@ -1,14 +1,20 @@ error[E0433]: failed to resolve: could not find `imp` in `sys` - --> $DIR/issue-38857.rs:2:23 + --> $DIR/issue-38857.rs:7:23 | LL | let a = std::sys::imp::process::process_common::StdioPipes { ..panic!() }; | ^^^ could not find `imp` in `sys` error[E0603]: module `sys` is private - --> $DIR/issue-38857.rs:2:18 + --> $DIR/issue-38857.rs:7:18 | LL | let a = std::sys::imp::process::process_common::StdioPipes { ..panic!() }; - | ^^^ + | ^^^ this module is private + | +note: the module `sys` is defined here + --> $SRC_DIR/libstd/lib.rs:LL:COL + | +LL | mod sys; + | ^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-38868.stderr b/src/test/ui/issues/issue-38868.stderr index fe932c744b..10d1e7c4e6 100644 --- a/src/test/ui/issues/issue-38868.stderr +++ b/src/test/ui/issues/issue-38868.stderr @@ -1,4 +1,4 @@ -error[E0366]: Implementations of Drop cannot be specialized +error[E0366]: `Drop` impls cannot be specialized --> $DIR/issue-38868.rs:5:1 | LL | / impl Drop for List<i32> { @@ -8,7 +8,7 @@ LL | | } LL | | } | |_^ | -note: Use same sequence of generic type and region parameters that is on the struct/enum definition +note: use the same sequence of generic type, lifetime and const parameters as the struct definition --> $DIR/issue-38868.rs:1:1 | LL | / pub struct List<T> { diff --git a/src/test/ui/issues/issue-38919.rs b/src/test/ui/issues/issue-38919.rs index 60a8793b4e..3d28f1936b 100644 --- a/src/test/ui/issues/issue-38919.rs +++ b/src/test/ui/issues/issue-38919.rs @@ -1,5 +1,5 @@ fn foo<T: Iterator>() { - T::Item; //~ ERROR no associated item named `Item` found for type `T` in the current scope + T::Item; //~ ERROR no associated item named `Item` found } fn main() { } diff --git a/src/test/ui/issues/issue-38919.stderr b/src/test/ui/issues/issue-38919.stderr index 603d42ca35..0022065a32 100644 --- a/src/test/ui/issues/issue-38919.stderr +++ b/src/test/ui/issues/issue-38919.stderr @@ -1,4 +1,4 @@ -error[E0599]: no associated item named `Item` found for type `T` in the current scope +error[E0599]: no associated item named `Item` found for type parameter `T` in the current scope --> $DIR/issue-38919.rs:2:8 | LL | T::Item; diff --git a/src/test/ui/issues/issue-39175.stderr b/src/test/ui/issues/issue-39175.stderr index 8b173e1b50..2f6e676538 100644 --- a/src/test/ui/issues/issue-39175.stderr +++ b/src/test/ui/issues/issue-39175.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `exec` found for type `&mut std::process::Command` in the current scope +error[E0599]: no method named `exec` found for mutable reference `&mut std::process::Command` in the current scope --> $DIR/issue-39175.rs:15:39 | LL | Command::new("echo").arg("hello").exec(); diff --git a/src/test/ui/issues/issue-39211.stderr b/src/test/ui/issues/issue-39211.stderr index ea850ea57d..c14c663e5a 100644 --- a/src/test/ui/issues/issue-39211.stderr +++ b/src/test/ui/issues/issue-39211.stderr @@ -1,8 +1,8 @@ error[E0220]: associated type `Row` not found for `M` - --> $DIR/issue-39211.rs:11:17 + --> $DIR/issue-39211.rs:11:20 | LL | let a = [3; M::Row::DIM]; - | ^^^^^^^^^^^ associated type `Row` not found + | ^^^ associated type `Row` not found error: aborting due to previous error diff --git a/src/test/ui/issues/issue-39559.rs b/src/test/ui/issues/issue-39559.rs index 5af48ca4c0..3a75956af5 100644 --- a/src/test/ui/issues/issue-39559.rs +++ b/src/test/ui/issues/issue-39559.rs @@ -12,7 +12,7 @@ impl Dim for Dim3 { pub struct Vector<T, D: Dim> { entries: [T; D::dim()], - //~^ ERROR no function or associated item named `dim` found for type `D` in the current scope + //~^ ERROR no function or associated item named `dim` found _dummy: D, } diff --git a/src/test/ui/issues/issue-39559.stderr b/src/test/ui/issues/issue-39559.stderr index b945b5e665..0554b232c2 100644 --- a/src/test/ui/issues/issue-39559.stderr +++ b/src/test/ui/issues/issue-39559.stderr @@ -1,4 +1,4 @@ -error[E0599]: no function or associated item named `dim` found for type `D` in the current scope +error[E0599]: no function or associated item named `dim` found for type parameter `D` in the current scope --> $DIR/issue-39559.rs:14:21 | LL | entries: [T; D::dim()], diff --git a/src/test/ui/issues/issue-39720.rs b/src/test/ui/issues/issue-39720.rs index 1a4775fc96..8cf841f937 100644 --- a/src/test/ui/issues/issue-39720.rs +++ b/src/test/ui/issues/issue-39720.rs @@ -1,26 +1,22 @@ // run-pass -#![allow(non_snake_case)] - // ignore-emscripten FIXME(#45351) #![feature(repr_simd, platform_intrinsics)] -#[repr(C)] //~ WARNING conflicting representation hints #[repr(simd)] #[derive(Copy, Clone, Debug)] -pub struct char3(pub i8, pub i8, pub i8); +pub struct Char3(pub i8, pub i8, pub i8); -#[repr(C)] //~ WARNING conflicting representation hints #[repr(simd)] #[derive(Copy, Clone, Debug)] -pub struct short3(pub i16, pub i16, pub i16); +pub struct Short3(pub i16, pub i16, pub i16); extern "platform-intrinsic" { fn simd_cast<T, U>(x: T) -> U; } fn main() { - let cast: short3 = unsafe { simd_cast(char3(10, -3, -9)) }; + let cast: Short3 = unsafe { simd_cast(Char3(10, -3, -9)) }; println!("{:?}", cast); } diff --git a/src/test/ui/issues/issue-39720.stderr b/src/test/ui/issues/issue-39720.stderr deleted file mode 100644 index 8121ed2894..0000000000 --- a/src/test/ui/issues/issue-39720.stderr +++ /dev/null @@ -1,16 +0,0 @@ -warning[E0566]: conflicting representation hints - --> $DIR/issue-39720.rs:8:8 - | -LL | #[repr(C)] - | ^ -LL | #[repr(simd)] - | ^^^^ - -warning[E0566]: conflicting representation hints - --> $DIR/issue-39720.rs:13:8 - | -LL | #[repr(C)] - | ^ -LL | #[repr(simd)] - | ^^^^ - diff --git a/src/test/ui/issues/issue-3973.rs b/src/test/ui/issues/issue-3973.rs index 4e00915683..a5ed5b8705 100644 --- a/src/test/ui/issues/issue-3973.rs +++ b/src/test/ui/issues/issue-3973.rs @@ -20,6 +20,6 @@ impl ToString_ for Point { fn main() { let p = Point::new(0.0, 0.0); - //~^ ERROR no function or associated item named `new` found for type `Point` + //~^ ERROR no function or associated item named `new` found for struct `Point` println!("{}", p.to_string()); } diff --git a/src/test/ui/issues/issue-3973.stderr b/src/test/ui/issues/issue-3973.stderr index ee07a410a9..63282e8d86 100644 --- a/src/test/ui/issues/issue-3973.stderr +++ b/src/test/ui/issues/issue-3973.stderr @@ -7,7 +7,7 @@ LL | | Point { x: x, y: y } LL | | } | |_____^ not a member of trait `ToString_` -error[E0599]: no function or associated item named `new` found for type `Point` in the current scope +error[E0599]: no function or associated item named `new` found for struct `Point` in the current scope --> $DIR/issue-3973.rs:22:20 | LL | struct Point { diff --git a/src/test/ui/issues/issue-39848.stderr b/src/test/ui/issues/issue-39848.stderr index 47aa8e17a3..11b145d6e0 100644 --- a/src/test/ui/issues/issue-39848.stderr +++ b/src/test/ui/issues/issue-39848.stderr @@ -4,7 +4,7 @@ error: expected `{`, found `foo` LL | if $tgt.has_$field() {} | -- -- help: try placing this code inside a block: `{ () }` | | - | this `if` statement has a condition, but no block + | this `if` expression has a condition, but no block ... LL | get_opt!(bar, foo); | ^^^ expected `{` diff --git a/src/test/ui/issues/issue-3993.stderr b/src/test/ui/issues/issue-3993.stderr index ce594a3f9b..3fa8ed4af2 100644 --- a/src/test/ui/issues/issue-3993.stderr +++ b/src/test/ui/issues/issue-3993.stderr @@ -2,7 +2,13 @@ error[E0603]: function `fly` is private --> $DIR/issue-3993.rs:1:10 | LL | use zoo::fly; - | ^^^ + | ^^^ this function is private + | +note: the function `fly` is defined here + --> $DIR/issue-3993.rs:4:5 + | +LL | fn fly() {} + | ^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-40610.rs b/src/test/ui/issues/issue-40610.rs index 104cf7f54e..c01233605b 100644 --- a/src/test/ui/issues/issue-40610.rs +++ b/src/test/ui/issues/issue-40610.rs @@ -2,5 +2,5 @@ fn f(_: &[f32]) {} fn main() { () + f(&[1.0]); - //~^ ERROR binary operation `+` cannot be applied to type `()` + //~^ ERROR cannot add `()` to `()` } diff --git a/src/test/ui/issues/issue-40610.stderr b/src/test/ui/issues/issue-40610.stderr index 9d57759192..95f45c168e 100644 --- a/src/test/ui/issues/issue-40610.stderr +++ b/src/test/ui/issues/issue-40610.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `()` +error[E0369]: cannot add `()` to `()` --> $DIR/issue-40610.rs:4:8 | LL | () + f(&[1.0]); diff --git a/src/test/ui/issues/issue-41255.rs b/src/test/ui/issues/issue-41255.rs index 60fdf7c3e8..5b95a73791 100644 --- a/src/test/ui/issues/issue-41255.rs +++ b/src/test/ui/issues/issue-41255.rs @@ -1,6 +1,7 @@ // Matching against float literals should result in a linter error #![feature(exclusive_range_pattern)] +#![feature(half_open_range_patterns)] #![allow(unused)] #![forbid(illegal_floating_point_literal_pattern)] @@ -12,23 +13,53 @@ fn main() { //~| ERROR floating-point types cannot be used in patterns //~| WARNING this was previously accepted by the compiler but is being 5.0f32 => {}, //~ ERROR floating-point types cannot be used in patterns + //~| ERROR floating-point types cannot be used in patterns + //~| WARNING hard error //~| WARNING hard error -5.0 => {}, //~ ERROR floating-point types cannot be used in patterns + //~| ERROR floating-point types cannot be used in patterns + //~| WARNING hard error //~| WARNING hard error 1.0 .. 33.0 => {}, //~ ERROR floating-point types cannot be used in patterns //~| WARNING hard error //~| ERROR floating-point types cannot be used in patterns //~| WARNING hard error + //~| ERROR floating-point types cannot be used in patterns + //~| WARNING hard error + //~| ERROR floating-point types cannot be used in patterns + //~| WARNING hard error 39.0 ..= 70.0 => {}, //~ ERROR floating-point types cannot be used in patterns + //~| ERROR floating-point types cannot be used in patterns //~| WARNING hard error //~| ERROR floating-point types cannot be used in patterns + //~| ERROR floating-point types cannot be used in patterns + //~| WARNING hard error + //~| WARNING hard error //~| WARNING hard error + + ..71.0 => {} + //~^ ERROR floating-point types cannot be used in patterns + //~| ERROR floating-point types cannot be used in patterns + //~| WARNING hard error + //~| WARNING this was previously accepted by the compiler + ..=72.0 => {} + //~^ ERROR floating-point types cannot be used in patterns + //~| ERROR floating-point types cannot be used in patterns + //~| WARNING hard error + //~| WARNING this was previously accepted by the compiler + 71.0.. => {} + //~^ ERROR floating-point types cannot be used in patterns + //~| ERROR floating-point types cannot be used in patterns + //~| WARNING hard error + //~| WARNING this was previously accepted by the compiler _ => {}, }; let y = 5.0; // Same for tuples match (x, 5) { (3.14, 1) => {}, //~ ERROR floating-point types cannot be used + //~| ERROR floating-point types cannot be used + //~| WARNING hard error //~| WARNING hard error _ => {}, } @@ -36,6 +67,8 @@ fn main() { struct Foo { x: f32 }; match (Foo { x }) { Foo { x: 2.0 } => {}, //~ ERROR floating-point types cannot be used + //~| ERROR floating-point types cannot be used + //~| WARNING hard error //~| WARNING hard error _ => {}, } diff --git a/src/test/ui/issues/issue-41255.stderr b/src/test/ui/issues/issue-41255.stderr index c334742cfc..1ff58153c8 100644 --- a/src/test/ui/issues/issue-41255.stderr +++ b/src/test/ui/issues/issue-41255.stderr @@ -1,11 +1,11 @@ error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:10:9 + --> $DIR/issue-41255.rs:11:9 | LL | 5.0 => {}, | ^^^ | note: lint level defined here - --> $DIR/issue-41255.rs:5:11 + --> $DIR/issue-41255.rs:6:11 | LL | #![forbid(illegal_floating_point_literal_pattern)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -13,7 +13,7 @@ LL | #![forbid(illegal_floating_point_literal_pattern)] = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:14:9 + --> $DIR/issue-41255.rs:15:9 | LL | 5.0f32 => {}, | ^^^^^^ @@ -22,7 +22,7 @@ LL | 5.0f32 => {}, = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:16:10 + --> $DIR/issue-41255.rs:19:10 | LL | -5.0 => {}, | ^^^ @@ -31,7 +31,7 @@ LL | -5.0 => {}, = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:18:9 + --> $DIR/issue-41255.rs:23:9 | LL | 1.0 .. 33.0 => {}, | ^^^ @@ -40,7 +40,7 @@ LL | 1.0 .. 33.0 => {}, = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:18:16 + --> $DIR/issue-41255.rs:23:16 | LL | 1.0 .. 33.0 => {}, | ^^^^ @@ -49,7 +49,7 @@ LL | 1.0 .. 33.0 => {}, = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:22:9 + --> $DIR/issue-41255.rs:31:9 | LL | 39.0 ..= 70.0 => {}, | ^^^^ @@ -58,7 +58,7 @@ LL | 39.0 ..= 70.0 => {}, = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:22:18 + --> $DIR/issue-41255.rs:31:18 | LL | 39.0 ..= 70.0 => {}, | ^^^^ @@ -67,7 +67,34 @@ LL | 39.0 ..= 70.0 => {}, = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:31:10 + --> $DIR/issue-41255.rs:40:11 + | +LL | ..71.0 => {} + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:45:12 + | +LL | ..=72.0 => {} + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:50:9 + | +LL | 71.0.. => {} + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:60:10 | LL | (3.14, 1) => {}, | ^^^^ @@ -76,7 +103,7 @@ LL | (3.14, 1) => {}, = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:38:18 + --> $DIR/issue-41255.rs:69:18 | LL | Foo { x: 2.0 } => {}, | ^^^ @@ -85,7 +112,7 @@ LL | Foo { x: 2.0 } => {}, = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: floating-point types cannot be used in patterns - --> $DIR/issue-41255.rs:10:9 + --> $DIR/issue-41255.rs:11:9 | LL | 5.0 => {}, | ^^^ @@ -93,5 +120,104 @@ LL | 5.0 => {}, = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> -error: aborting due to 10 previous errors +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:15:9 + | +LL | 5.0f32 => {}, + | ^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:19:10 + | +LL | -5.0 => {}, + | ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:23:9 + | +LL | 1.0 .. 33.0 => {}, + | ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:23:16 + | +LL | 1.0 .. 33.0 => {}, + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:31:9 + | +LL | 39.0 ..= 70.0 => {}, + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:31:18 + | +LL | 39.0 ..= 70.0 => {}, + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:40:11 + | +LL | ..71.0 => {} + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:45:12 + | +LL | ..=72.0 => {} + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:50:9 + | +LL | 71.0.. => {} + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:60:10 + | +LL | (3.14, 1) => {}, + | ^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: floating-point types cannot be used in patterns + --> $DIR/issue-41255.rs:69:18 + | +LL | Foo { x: 2.0 } => {}, + | ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: aborting due to 24 previous errors diff --git a/src/test/ui/issues/issue-41394.rs b/src/test/ui/issues/issue-41394.rs index 45318f6efb..64873ac35a 100644 --- a/src/test/ui/issues/issue-41394.rs +++ b/src/test/ui/issues/issue-41394.rs @@ -1,6 +1,6 @@ enum Foo { A = "" + 1 - //~^ ERROR binary operation `+` cannot be applied to type `&str` + //~^ ERROR cannot add `{integer}` to `&str` } enum Bar { diff --git a/src/test/ui/issues/issue-41394.stderr b/src/test/ui/issues/issue-41394.stderr index c8437ab189..3f60ea4bbf 100644 --- a/src/test/ui/issues/issue-41394.stderr +++ b/src/test/ui/issues/issue-41394.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `&str` +error[E0369]: cannot add `{integer}` to `&str` --> $DIR/issue-41394.rs:2:12 | LL | A = "" + 1 diff --git a/src/test/ui/issues/issue-41880.rs b/src/test/ui/issues/issue-41880.rs index 16facc5a78..10cde21abd 100644 --- a/src/test/ui/issues/issue-41880.rs +++ b/src/test/ui/issues/issue-41880.rs @@ -25,5 +25,5 @@ impl<T: Clone, F> Iterator for Iterate<T, F> where F: Fn(&T) -> T { fn main() { let a = iterate(0, |x| x+1); println!("{:?}", a.iter().take(10).collect::<Vec<usize>>()); - //~^ ERROR no method named `iter` found for type `Iterate<{integer} + //~^ ERROR no method named `iter` found } diff --git a/src/test/ui/issues/issue-41880.stderr b/src/test/ui/issues/issue-41880.stderr index 0e1d55c339..09d5594f73 100644 --- a/src/test/ui/issues/issue-41880.stderr +++ b/src/test/ui/issues/issue-41880.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `iter` found for type `Iterate<{integer}, [closure@$DIR/issue-41880.rs:26:24: 26:31]>` in the current scope +error[E0599]: no method named `iter` found for struct `Iterate<{integer}, [closure@$DIR/issue-41880.rs:26:24: 26:31]>` in the current scope --> $DIR/issue-41880.rs:27:24 | LL | pub struct Iterate<T, F> { diff --git a/src/test/ui/issues/issue-41974.stderr b/src/test/ui/issues/issue-41974.stderr index 9f164822de..d082e0a6b5 100644 --- a/src/test/ui/issues/issue-41974.stderr +++ b/src/test/ui/issues/issue-41974.stderr @@ -9,11 +9,11 @@ LL | impl<T> Drop for T where T: A { where T: ?Sized; = note: downstream crates may implement trait `A` for type `std::boxed::Box<_>` -error[E0120]: the Drop trait may only be implemented on structures +error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions --> $DIR/issue-41974.rs:7:18 | LL | impl<T> Drop for T where T: A { - | ^ implementing Drop requires a struct + | ^ must be a struct, enum, or union error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`) --> $DIR/issue-41974.rs:7:6 diff --git a/src/test/ui/issues/issue-4201.rs b/src/test/ui/issues/issue-4201.rs index 2d655e4b7e..1f292229fd 100644 --- a/src/test/ui/issues/issue-4201.rs +++ b/src/test/ui/issues/issue-4201.rs @@ -2,7 +2,7 @@ fn main() { let a = if true { 0 } else if false { -//~^ ERROR if may be missing an else clause +//~^ ERROR `if` may be missing an `else` clause //~| expected `()`, found integer 1 }; diff --git a/src/test/ui/issues/issue-4201.stderr b/src/test/ui/issues/issue-4201.stderr index aacc426783..bc638ddf55 100644 --- a/src/test/ui/issues/issue-4201.stderr +++ b/src/test/ui/issues/issue-4201.stderr @@ -1,4 +1,4 @@ -error[E0317]: if may be missing an else clause +error[E0317]: `if` may be missing an `else` clause --> $DIR/issue-4201.rs:4:12 | LL | } else if false { diff --git a/src/test/ui/issues/issue-42880.stderr b/src/test/ui/issues/issue-42880.stderr index 763bb9ae0e..82cdc20df2 100644 --- a/src/test/ui/issues/issue-42880.stderr +++ b/src/test/ui/issues/issue-42880.stderr @@ -1,4 +1,4 @@ -error[E0599]: no associated item named `String` found for type `std::string::String` in the current scope +error[E0599]: no associated item named `String` found for struct `std::string::String` in the current scope --> $DIR/issue-42880.rs:4:22 | LL | let f = |&Value::String(_)| (); diff --git a/src/test/ui/issues/issue-43105.rs b/src/test/ui/issues/issue-43105.rs index f61b65baac..231af76fc9 100644 --- a/src/test/ui/issues/issue-43105.rs +++ b/src/test/ui/issues/issue-43105.rs @@ -8,6 +8,7 @@ fn main() { match 1 { NUM => unimplemented!(), //~^ ERROR could not evaluate constant pattern + //~| ERROR could not evaluate constant pattern _ => unimplemented!(), } } diff --git a/src/test/ui/issues/issue-43105.stderr b/src/test/ui/issues/issue-43105.stderr index e3609c57dc..1a7b67b563 100644 --- a/src/test/ui/issues/issue-43105.stderr +++ b/src/test/ui/issues/issue-43105.stderr @@ -20,6 +20,12 @@ error: could not evaluate constant pattern LL | NUM => unimplemented!(), | ^^^ -error: aborting due to 3 previous errors +error: could not evaluate constant pattern + --> $DIR/issue-43105.rs:9:9 + | +LL | NUM => unimplemented!(), + | ^^^ + +error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0015`. diff --git a/src/test/ui/issues/issue-43189.rs b/src/test/ui/issues/issue-43189.rs index f4f4dce768..ce667a5006 100644 --- a/src/test/ui/issues/issue-43189.rs +++ b/src/test/ui/issues/issue-43189.rs @@ -8,5 +8,5 @@ extern crate xcrate_issue_43189_b; fn main() { ().a(); - //~^ ERROR no method named `a` found for type `()` in the current scope [E0599] + //~^ ERROR no method named `a` found } diff --git a/src/test/ui/issues/issue-43189.stderr b/src/test/ui/issues/issue-43189.stderr index 4dae6c1cd1..3f63cb8e78 100644 --- a/src/test/ui/issues/issue-43189.stderr +++ b/src/test/ui/issues/issue-43189.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `a` found for type `()` in the current scope +error[E0599]: no method named `a` found for unit type `()` in the current scope --> $DIR/issue-43189.rs:10:8 | LL | ().a(); diff --git a/src/test/ui/issues/issue-45730.stderr b/src/test/ui/issues/issue-45730.stderr index 3c400d6eef..d4ddba52df 100644 --- a/src/test/ui/issues/issue-45730.stderr +++ b/src/test/ui/issues/issue-45730.stderr @@ -6,7 +6,7 @@ LL | let x: *const _ = 0 as _; | | | help: consider giving more type information | - = note: The type information given here is insufficient to check whether the pointer cast is valid + = note: the type information given here is insufficient to check whether the pointer cast is valid error[E0641]: cannot cast to a pointer of an unknown kind --> $DIR/issue-45730.rs:5:23 @@ -16,7 +16,7 @@ LL | let x: *const _ = 0 as *const _; | | | help: consider giving more type information | - = note: The type information given here is insufficient to check whether the pointer cast is valid + = note: the type information given here is insufficient to check whether the pointer cast is valid error[E0641]: cannot cast to a pointer of an unknown kind --> $DIR/issue-45730.rs:8:13 @@ -26,7 +26,7 @@ LL | let x = 0 as *const i32 as *const _ as *mut _; | | | help: consider giving more type information | - = note: The type information given here is insufficient to check whether the pointer cast is valid + = note: the type information given here is insufficient to check whether the pointer cast is valid error: aborting due to 3 previous errors diff --git a/src/test/ui/issues/issue-46101.rs b/src/test/ui/issues/issue-46101.rs index 8b1343b132..7c8bf299db 100644 --- a/src/test/ui/issues/issue-46101.rs +++ b/src/test/ui/issues/issue-46101.rs @@ -1,6 +1,7 @@ #![feature(use_extern_macros)] trait Foo {} #[derive(Foo::Anything)] //~ ERROR failed to resolve: partially resolved path in a derive macro + //~| ERROR failed to resolve: partially resolved path in a derive macro struct S; fn main() {} diff --git a/src/test/ui/issues/issue-46101.stderr b/src/test/ui/issues/issue-46101.stderr index 9c88d3b87c..2ffa15264b 100644 --- a/src/test/ui/issues/issue-46101.stderr +++ b/src/test/ui/issues/issue-46101.stderr @@ -4,6 +4,12 @@ error[E0433]: failed to resolve: partially resolved path in a derive macro LL | #[derive(Foo::Anything)] | ^^^^^^^^^^^^^ partially resolved path in a derive macro -error: aborting due to previous error +error[E0433]: failed to resolve: partially resolved path in a derive macro + --> $DIR/issue-46101.rs:3:10 + | +LL | #[derive(Foo::Anything)] + | ^^^^^^^^^^^^^ partially resolved path in a derive macro + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0433`. diff --git a/src/test/ui/issues/issue-47094.rs b/src/test/ui/issues/issue-47094.rs index 97da984d4a..c5d37feb14 100644 --- a/src/test/ui/issues/issue-47094.rs +++ b/src/test/ui/issues/issue-47094.rs @@ -1,12 +1,12 @@ -// check-pass - -#[repr(C,u8)] //~ WARNING conflicting representation hints +#[repr(C, u8)] //~ ERROR conflicting representation hints +//~^ WARN this was previously accepted enum Foo { A, B, } -#[repr(C)] //~ WARNING conflicting representation hints +#[repr(C)] //~ ERROR conflicting representation hints +//~^ WARN this was previously accepted #[repr(u8)] enum Bar { A, diff --git a/src/test/ui/issues/issue-47094.stderr b/src/test/ui/issues/issue-47094.stderr index 16bcec0c7b..e323ce6602 100644 --- a/src/test/ui/issues/issue-47094.stderr +++ b/src/test/ui/issues/issue-47094.stderr @@ -1,14 +1,25 @@ -warning[E0566]: conflicting representation hints - --> $DIR/issue-47094.rs:3:8 +error[E0566]: conflicting representation hints + --> $DIR/issue-47094.rs:1:8 | -LL | #[repr(C,u8)] - | ^ ^^ +LL | #[repr(C, u8)] + | ^ ^^ + | + = note: `#[deny(conflicting_repr_hints)]` on by default + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #68585 <https://github.com/rust-lang/rust/issues/68585> -warning[E0566]: conflicting representation hints - --> $DIR/issue-47094.rs:9:8 +error[E0566]: conflicting representation hints + --> $DIR/issue-47094.rs:8:8 | LL | #[repr(C)] | ^ +LL | LL | #[repr(u8)] | ^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #68585 <https://github.com/rust-lang/rust/issues/68585> + +error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0566`. diff --git a/src/test/ui/issues/issue-47377.stderr b/src/test/ui/issues/issue-47377.stderr index 3460c1dae2..5f785679c5 100644 --- a/src/test/ui/issues/issue-47377.stderr +++ b/src/test/ui/issues/issue-47377.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `&str` +error[E0369]: cannot add `&str` to `&str` --> $DIR/issue-47377.rs:4:14 | LL | let _a = b + ", World!"; diff --git a/src/test/ui/issues/issue-47380.stderr b/src/test/ui/issues/issue-47380.stderr index f334dcbd91..216e32ddae 100644 --- a/src/test/ui/issues/issue-47380.stderr +++ b/src/test/ui/issues/issue-47380.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `&str` +error[E0369]: cannot add `&str` to `&str` --> $DIR/issue-47380.rs:3:35 | LL | println!("🦀🦀🦀🦀🦀"); let _a = b + ", World!"; diff --git a/src/test/ui/issues/issue-48131.rs b/src/test/ui/issues/issue-48131.rs index c854072935..85664e62ea 100644 --- a/src/test/ui/issues/issue-48131.rs +++ b/src/test/ui/issues/issue-48131.rs @@ -1,7 +1,7 @@ // This note is annotated because the purpose of the test // is to ensure that certain other notes are not generated. #![deny(unused_unsafe)] //~ NOTE -#![allow(deprecated)] + // (test that no note is generated on this unsafe fn) pub unsafe fn a() { @@ -20,8 +20,8 @@ pub fn b() { unsafe { /* unnecessary */ } //~ ERROR unnecessary `unsafe` //~^ NOTE } - - let () = ::std::mem::uninitialized(); + // `()` is fine to zero-initialize as it is zero sized and inhabited. + let () = ::std::mem::zeroed(); inner() } diff --git a/src/test/ui/issues/issue-48508.rs b/src/test/ui/issues/issue-48508.rs index b7aa642287..87965c204a 100644 --- a/src/test/ui/issues/issue-48508.rs +++ b/src/test/ui/issues/issue-48508.rs @@ -11,6 +11,7 @@ // ignore-asmjs wasm2js does not support source maps yet #![feature(non_ascii_idents)] +#[allow(uncommon_codepoints)] #[path = "issue-48508-aux.rs"] mod other_file; diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref.rs index 24c61425b8..5b6b8f8de1 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref.rs +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref.rs @@ -1,4 +1,4 @@ fn main() { let _result = &Some(42).as_deref(); -//~^ ERROR no method named `as_deref` found for type `std::option::Option<{integer}>` +//~^ ERROR no method named `as_deref` found for enum `std::option::Option<{integer}>` } diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref.stderr index 0eb7bf0247..f91f6e891e 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `as_deref` found for type `std::option::Option<{integer}>` in the current scope +error[E0599]: no method named `as_deref` found for enum `std::option::Option<{integer}>` in the current scope --> $DIR/option-as_deref.rs:2:29 | LL | let _result = &Some(42).as_deref(); diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref_mut.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref_mut.rs index 67ad73f584..c5fe6ea82c 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref_mut.rs +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref_mut.rs @@ -1,4 +1,4 @@ fn main() { let _result = &mut Some(42).as_deref_mut(); -//~^ ERROR no method named `as_deref_mut` found for type `std::option::Option<{integer}>` +//~^ ERROR no method named `as_deref_mut` found for enum `std::option::Option<{integer}>` } diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref_mut.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref_mut.stderr index 845ddb5231..583236345c 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref_mut.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/option-as_deref_mut.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `as_deref_mut` found for type `std::option::Option<{integer}>` in the current scope +error[E0599]: no method named `as_deref_mut` found for enum `std::option::Option<{integer}>` in the current scope --> $DIR/option-as_deref_mut.rs:2:33 | LL | let _result = &mut Some(42).as_deref_mut(); diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.stderr index 5e01674877..fae11fe62b 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `as_deref` found for type `std::result::Result<{integer}, _>` in the current scope +error[E0599]: no method named `as_deref` found for enum `std::result::Result<{integer}, _>` in the current scope --> $DIR/result-as_deref.rs:4:27 | LL | let _result = &Ok(42).as_deref(); diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_err.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_err.stderr index 6dc13da548..1d98361c46 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_err.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_err.stderr @@ -1,8 +1,8 @@ -error[E0599]: no method named `as_deref_err` found for type `std::result::Result<_, {integer}>` in the current scope +error[E0599]: no method named `as_deref_err` found for enum `std::result::Result<_, {integer}>` in the current scope --> $DIR/result-as_deref_err.rs:4:28 | LL | let _result = &Err(41).as_deref_err(); - | ^^^^^^^^^^^^ help: there is a method with a similar name: `as_deref_ok` + | ^^^^^^^^^^^^ help: there is a method with a similar name: `as_deref_mut` | = note: the method `as_deref_err` exists but the following trait bounds were not satisfied: `{integer} : std::ops::Deref` diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.stderr index f21e97388b..2c6231fb3b 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `as_deref_mut` found for type `std::result::Result<{integer}, _>` in the current scope +error[E0599]: no method named `as_deref_mut` found for enum `std::result::Result<{integer}, _>` in the current scope --> $DIR/result-as_deref_mut.rs:4:31 | LL | let _result = &mut Ok(42).as_deref_mut(); diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_err.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_err.stderr index 44c0c954ee..950a050ea9 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_err.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_err.stderr @@ -1,8 +1,8 @@ -error[E0599]: no method named `as_deref_mut_err` found for type `std::result::Result<_, {integer}>` in the current scope +error[E0599]: no method named `as_deref_mut_err` found for enum `std::result::Result<_, {integer}>` in the current scope --> $DIR/result-as_deref_mut_err.rs:4:32 | LL | let _result = &mut Err(41).as_deref_mut_err(); - | ^^^^^^^^^^^^^^^^ help: there is a method with a similar name: `as_deref_mut_ok` + | ^^^^^^^^^^^^^^^^ help: there is a method with a similar name: `as_deref_mut` | = note: the method `as_deref_mut_err` exists but the following trait bounds were not satisfied: `{integer} : std::ops::DerefMut` diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_ok.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_ok.rs deleted file mode 100644 index 54b695a086..0000000000 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_ok.rs +++ /dev/null @@ -1,6 +0,0 @@ -#![feature(inner_deref)] - -fn main() { - let _result = &mut Ok(42).as_deref_mut_ok(); -//~^ ERROR no method named `as_deref_mut_ok` found -} diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_ok.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_ok.stderr deleted file mode 100644 index b8369c9b82..0000000000 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_mut_ok.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0599]: no method named `as_deref_mut_ok` found for type `std::result::Result<{integer}, _>` in the current scope - --> $DIR/result-as_deref_mut_ok.rs:4:31 - | -LL | let _result = &mut Ok(42).as_deref_mut_ok(); - | ^^^^^^^^^^^^^^^ help: there is a method with a similar name: `as_deref_mut_err` - | - = note: the method `as_deref_mut_ok` exists but the following trait bounds were not satisfied: - `{integer} : std::ops::DerefMut` - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0599`. diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_ok.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_ok.rs deleted file mode 100644 index ebb0500e81..0000000000 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_ok.rs +++ /dev/null @@ -1,6 +0,0 @@ -#![feature(inner_deref)] - -fn main() { - let _result = &Ok(42).as_deref_ok(); -//~^ ERROR no method named `as_deref_ok` found -} diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_ok.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_ok.stderr deleted file mode 100644 index b26705a99e..0000000000 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result-as_deref_ok.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0599]: no method named `as_deref_ok` found for type `std::result::Result<{integer}, _>` in the current scope - --> $DIR/result-as_deref_ok.rs:4:27 - | -LL | let _result = &Ok(42).as_deref_ok(); - | ^^^^^^^^^^^ help: there is a method with a similar name: `as_deref_err` - | - = note: the method `as_deref_ok` exists but the following trait bounds were not satisfied: - `{integer} : std::ops::Deref` - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0599`. diff --git a/src/test/ui/issues/issue-50480.rs b/src/test/ui/issues/issue-50480.rs index 31dbb75ec1..deb63872f6 100644 --- a/src/test/ui/issues/issue-50480.rs +++ b/src/test/ui/issues/issue-50480.rs @@ -2,6 +2,7 @@ //~^ ERROR the trait `Copy` may not be implemented for this type struct Foo(NotDefined, <i32 as Iterator>::Item, Vec<i32>, String); //~^ ERROR cannot find type `NotDefined` in this scope +//~| ERROR cannot find type `NotDefined` in this scope //~| ERROR `i32` is not an iterator fn main() {} diff --git a/src/test/ui/issues/issue-50480.stderr b/src/test/ui/issues/issue-50480.stderr index 9022bfae50..2b92664d57 100644 --- a/src/test/ui/issues/issue-50480.stderr +++ b/src/test/ui/issues/issue-50480.stderr @@ -4,6 +4,12 @@ error[E0412]: cannot find type `NotDefined` in this scope LL | struct Foo(NotDefined, <i32 as Iterator>::Item, Vec<i32>, String); | ^^^^^^^^^^ not found in this scope +error[E0412]: cannot find type `NotDefined` in this scope + --> $DIR/issue-50480.rs:3:12 + | +LL | struct Foo(NotDefined, <i32 as Iterator>::Item, Vec<i32>, String); + | ^^^^^^^^^^ not found in this scope + error[E0277]: `i32` is not an iterator --> $DIR/issue-50480.rs:3:24 | @@ -24,7 +30,7 @@ LL | struct Foo(NotDefined, <i32 as Iterator>::Item, Vec<i32>, String); | | | this field does not implement `Copy` -error: aborting due to 3 previous errors +error: aborting due to 4 previous errors Some errors have detailed explanations: E0204, E0277, E0412. For more information about an error, try `rustc --explain E0204`. diff --git a/src/test/ui/issues/issue-5062.stderr b/src/test/ui/issues/issue-5062.stderr index a20118d691..9fa15dc967 100644 --- a/src/test/ui/issues/issue-5062.stderr +++ b/src/test/ui/issues/issue-5062.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/issue-5062.rs:1:29 | LL | fn main() { format!("{:?}", None); } - | ^^^^ cannot infer type for type parameter `T` + | ^^^^ cannot infer type for type parameter `T` declared on the enum `Option` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-5100.stderr b/src/test/ui/issues/issue-5100.stderr index 9e1011496c..c47e868943 100644 --- a/src/test/ui/issues/issue-5100.stderr +++ b/src/test/ui/issues/issue-5100.stderr @@ -29,7 +29,7 @@ error[E0308]: mismatched types --> $DIR/issue-5100.rs:33:9 | LL | match (true, false) { - | ------------- this match expression has type `(bool, bool)` + | ------------- this expression has type `(bool, bool)` LL | box (true, false) => () | ^^^^^^^^^^^^^^^^^ expected tuple, found struct `std::boxed::Box` | diff --git a/src/test/ui/issues/issue-5153.rs b/src/test/ui/issues/issue-5153.rs index e673766208..5bf0579030 100644 --- a/src/test/ui/issues/issue-5153.rs +++ b/src/test/ui/issues/issue-5153.rs @@ -8,5 +8,5 @@ impl Foo for isize { fn main() { (&5isize as &dyn Foo).foo(); - //~^ ERROR: no method named `foo` found for type `&dyn Foo` in the current scope + //~^ ERROR: no method named `foo` found for reference `&dyn Foo` in the current scope } diff --git a/src/test/ui/issues/issue-5153.stderr b/src/test/ui/issues/issue-5153.stderr index 5034e6d538..4680c8b131 100644 --- a/src/test/ui/issues/issue-5153.stderr +++ b/src/test/ui/issues/issue-5153.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `foo` found for type `&dyn Foo` in the current scope +error[E0599]: no method named `foo` found for reference `&dyn Foo` in the current scope --> $DIR/issue-5153.rs:10:27 | LL | (&5isize as &dyn Foo).foo(); diff --git a/src/test/ui/issues/issue-51602.stderr b/src/test/ui/issues/issue-51602.stderr index 1ad69c0191..d800890bca 100644 --- a/src/test/ui/issues/issue-51602.stderr +++ b/src/test/ui/issues/issue-51602.stderr @@ -4,7 +4,7 @@ error: expected `{`, found keyword `in` LL | if i in 1..10 { | -- ^^ expected `{` | | - | this `if` statement has a condition, but no block + | this `if` expression has a condition, but no block error: aborting due to previous error diff --git a/src/test/ui/issues/issue-51770.rs b/src/test/ui/issues/issue-51770.rs new file mode 100644 index 0000000000..bcb37a5f4f --- /dev/null +++ b/src/test/ui/issues/issue-51770.rs @@ -0,0 +1,20 @@ +// check-pass + +#![crate_type = "lib"] + +// In an older version, when NLL was still a feature, the following previously did not compile +// #![feature(nll)] + +use std::ops::Index; + +pub struct Test<T> { + a: T, +} + +impl<T> Index<usize> for Test<T> { + type Output = T; + + fn index(&self, _index: usize) -> &Self::Output { + &self.a + } +} diff --git a/src/test/ui/issues/issue-52060.rs b/src/test/ui/issues/issue-52060.rs index 13b914c033..fed08902c8 100644 --- a/src/test/ui/issues/issue-52060.rs +++ b/src/test/ui/issues/issue-52060.rs @@ -3,5 +3,6 @@ static A: &'static [u32] = &[1]; static B: [u32; 1] = [0; A.len()]; //~^ ERROR [E0013] +//~| ERROR evaluation of constant value failed fn main() {} diff --git a/src/test/ui/issues/issue-52060.stderr b/src/test/ui/issues/issue-52060.stderr index 2f90f7f9e0..502825e976 100644 --- a/src/test/ui/issues/issue-52060.stderr +++ b/src/test/ui/issues/issue-52060.stderr @@ -1,9 +1,18 @@ -error[E0013]: constants cannot refer to statics, use a constant instead +error[E0013]: constants cannot refer to statics --> $DIR/issue-52060.rs:4:26 | LL | static B: [u32; 1] = [0; A.len()]; | ^ + | + = help: consider extracting the value of the `static` to a `const`, and referring to that + +error[E0080]: evaluation of constant value failed + --> $DIR/issue-52060.rs:4:26 + | +LL | static B: [u32; 1] = [0; A.len()]; + | ^ constant accesses static -error: aborting due to previous error +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0013`. +Some errors have detailed explanations: E0013, E0080. +For more information about an error, try `rustc --explain E0013`. diff --git a/src/test/ui/issues/issue-53251.rs b/src/test/ui/issues/issue-53251.rs index 0751b0a635..b5d55141b7 100644 --- a/src/test/ui/issues/issue-53251.rs +++ b/src/test/ui/issues/issue-53251.rs @@ -10,6 +10,7 @@ macro_rules! impl_add { fn $n() { S::f::<i64>(); //~^ ERROR wrong number of type arguments + //~| ERROR wrong number of type arguments } )* } diff --git a/src/test/ui/issues/issue-53251.stderr b/src/test/ui/issues/issue-53251.stderr index 9fbffaf39e..21e41574a4 100644 --- a/src/test/ui/issues/issue-53251.stderr +++ b/src/test/ui/issues/issue-53251.stderr @@ -7,6 +7,15 @@ LL | S::f::<i64>(); LL | impl_add!(a b); | --------------- in this macro invocation -error: aborting due to previous error +error[E0107]: wrong number of type arguments: expected 0, found 1 + --> $DIR/issue-53251.rs:11:24 + | +LL | S::f::<i64>(); + | ^^^ unexpected type argument +... +LL | impl_add!(a b); + | --------------- in this macro invocation + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0107`. diff --git a/src/test/ui/issues/issue-5358-1.stderr b/src/test/ui/issues/issue-5358-1.stderr index ec79d874d0..314d1fddbd 100644 --- a/src/test/ui/issues/issue-5358-1.stderr +++ b/src/test/ui/issues/issue-5358-1.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-5358-1.rs:6:9 | LL | match S(Either::Left(5)) { - | ------------------ this match expression has type `S` + | ------------------ this expression has type `S` LL | Either::Right(_) => {} | ^^^^^^^^^^^^^^^^ expected struct `S`, found enum `Either` | diff --git a/src/test/ui/issues/issue-53787-inline-assembler-macro.rs b/src/test/ui/issues/issue-53787-inline-assembler-macro.rs index 09e8d55c06..d911ac5efb 100644 --- a/src/test/ui/issues/issue-53787-inline-assembler-macro.rs +++ b/src/test/ui/issues/issue-53787-inline-assembler-macro.rs @@ -1,5 +1,6 @@ // Regression test for Issue #53787: Fix ICE when creating a label in inline assembler with macros. +// build-fail // ignore-emscripten #![feature(asm)] diff --git a/src/test/ui/issues/issue-53787-inline-assembler-macro.stderr b/src/test/ui/issues/issue-53787-inline-assembler-macro.stderr index f96bcaa492..b066474f92 100644 --- a/src/test/ui/issues/issue-53787-inline-assembler-macro.stderr +++ b/src/test/ui/issues/issue-53787-inline-assembler-macro.stderr @@ -1,5 +1,5 @@ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/issue-53787-inline-assembler-macro.rs:23:16 + --> $DIR/issue-53787-inline-assembler-macro.rs:24:16 | LL | fake_jump!("FirstFunc"); | ^^^^^^^^^^^ diff --git a/src/test/ui/issues/issue-53840.stderr b/src/test/ui/issues/issue-53840.stderr index 0032f60a22..9cb034e759 100644 --- a/src/test/ui/issues/issue-53840.stderr +++ b/src/test/ui/issues/issue-53840.stderr @@ -2,7 +2,7 @@ error[E0009]: cannot bind by-move and by-ref in the same pattern --> $DIR/issue-53840.rs:13:16 | LL | E::Foo(a, b, ref c) => {} - | ^ ^ ----- both by-ref and by-move used + | ^ ^ ----- by-ref pattern here | | | | | by-move pattern here | by-move pattern here @@ -11,7 +11,7 @@ error[E0009]: cannot bind by-move and by-ref in the same pattern --> $DIR/issue-53840.rs:17:14 | LL | Bar {a, ref b} => {} - | ^ ----- both by-ref and by-move used + | ^ ----- by-ref pattern here | | | by-move pattern here diff --git a/src/test/ui/issues/issue-54062.stderr b/src/test/ui/issues/issue-54062.stderr index 3830ad4b1e..5222e3ee95 100644 --- a/src/test/ui/issues/issue-54062.stderr +++ b/src/test/ui/issues/issue-54062.stderr @@ -4,7 +4,7 @@ error[E0616]: field `inner` of struct `std::sync::Mutex` is private LL | let _ = test.comps.inner.lock().unwrap(); | ^^^^^^^^^^^^^^^^ -error[E0599]: no method named `unwrap` found for type `std::sys_common::mutex::MutexGuard<'_>` in the current scope +error[E0599]: no method named `unwrap` found for struct `std::sys_common::mutex::MutexGuard<'_>` in the current scope --> $DIR/issue-54062.rs:10:37 | LL | let _ = test.comps.inner.lock().unwrap(); diff --git a/src/test/ui/issues/issue-54348.rs b/src/test/ui/issues/issue-54348.rs index 68d8380547..fd9a9e024a 100644 --- a/src/test/ui/issues/issue-54348.rs +++ b/src/test/ui/issues/issue-54348.rs @@ -1,3 +1,5 @@ +// build-fail + fn main() { [1][0u64 as usize]; [1][1.5 as usize]; //~ ERROR index out of bounds diff --git a/src/test/ui/issues/issue-54348.stderr b/src/test/ui/issues/issue-54348.stderr index fa77bd6fd7..7619cd7437 100644 --- a/src/test/ui/issues/issue-54348.stderr +++ b/src/test/ui/issues/issue-54348.stderr @@ -1,5 +1,5 @@ error: index out of bounds: the len is 1 but the index is 1 - --> $DIR/issue-54348.rs:3:5 + --> $DIR/issue-54348.rs:5:5 | LL | [1][1.5 as usize]; | ^^^^^^^^^^^^^^^^^ @@ -7,7 +7,7 @@ LL | [1][1.5 as usize]; = note: `#[deny(const_err)]` on by default error: index out of bounds: the len is 1 but the index is 1 - --> $DIR/issue-54348.rs:4:5 + --> $DIR/issue-54348.rs:6:5 | LL | [1][1u64 as usize]; | ^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/issues/issue-54943.stderr b/src/test/ui/issues/issue-54943.stderr index d0f03f90c8..62aacee811 100644 --- a/src/test/ui/issues/issue-54943.stderr +++ b/src/test/ui/issues/issue-54943.stderr @@ -8,3 +8,4 @@ LL | let x = foo::<&'a u32>(); error: aborting due to previous error +For more information about this error, try `rustc --explain E0477`. diff --git a/src/test/ui/issues/issue-57362-1.stderr b/src/test/ui/issues/issue-57362-1.stderr index c4000c8a9d..ad596db13c 100644 --- a/src/test/ui/issues/issue-57362-1.stderr +++ b/src/test/ui/issues/issue-57362-1.stderr @@ -1,10 +1,10 @@ -error[E0599]: no method named `f` found for type `fn(&u8)` in the current scope +error[E0599]: no method named `f` found for fn pointer `fn(&u8)` in the current scope --> $DIR/issue-57362-1.rs:20:7 | LL | a.f(); | ^ method not found in `fn(&u8)` | - = note: a is a function, perhaps you wish to call it + = note: `a` is a function, perhaps you wish to call it = help: items from traits can only be used if the trait is implemented and in scope = note: the following trait defines an item `f`, perhaps you need to implement it: candidate #1: `Trait` diff --git a/src/test/ui/issues/issue-57362-2.stderr b/src/test/ui/issues/issue-57362-2.stderr index 2e713cc0ab..3528084f6c 100644 --- a/src/test/ui/issues/issue-57362-2.stderr +++ b/src/test/ui/issues/issue-57362-2.stderr @@ -1,4 +1,4 @@ -error[E0599]: no function or associated item named `make_g` found for type `for<'r> fn(&'r ())` in the current scope +error[E0599]: no function or associated item named `make_g` found for fn pointer `for<'r> fn(&'r ())` in the current scope --> $DIR/issue-57362-2.rs:22:25 | LL | let x = <fn (&())>::make_g(); diff --git a/src/test/ui/issues/issue-57741-1.stderr b/src/test/ui/issues/issue-57741-1.stderr index db6fa9db8f..a4f1ac9482 100644 --- a/src/test/ui/issues/issue-57741-1.stderr +++ b/src/test/ui/issues/issue-57741-1.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-57741-1.rs:14:9 | LL | let y = match x { - | - this match expression has type `std::boxed::Box<u32>` + | - this expression has type `std::boxed::Box<u32>` LL | S::A { a } | S::B { b: a } => a, | ^^^^^^^^^^ expected struct `std::boxed::Box`, found enum `S` | @@ -13,7 +13,7 @@ error[E0308]: mismatched types --> $DIR/issue-57741-1.rs:14:22 | LL | let y = match x { - | - this match expression has type `std::boxed::Box<u32>` + | - this expression has type `std::boxed::Box<u32>` LL | S::A { a } | S::B { b: a } => a, | ^^^^^^^^^^^^^ expected struct `std::boxed::Box`, found enum `S` | diff --git a/src/test/ui/issues/issue-57741.stderr b/src/test/ui/issues/issue-57741.stderr index c36dea7bf5..6f9e5b08a8 100644 --- a/src/test/ui/issues/issue-57741.stderr +++ b/src/test/ui/issues/issue-57741.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | let y = match x { | - | | - | this match expression has type `std::boxed::Box<T>` + | this expression has type `std::boxed::Box<T>` | help: consider dereferencing the boxed value: `*x` LL | T::A(a) | T::B(a) => a, | ^^^^^^^ expected struct `std::boxed::Box`, found enum `T` @@ -18,7 +18,7 @@ error[E0308]: mismatched types LL | let y = match x { | - | | - | this match expression has type `std::boxed::Box<T>` + | this expression has type `std::boxed::Box<T>` | help: consider dereferencing the boxed value: `*x` LL | T::A(a) | T::B(a) => a, | ^^^^^^^ expected struct `std::boxed::Box`, found enum `T` @@ -32,7 +32,7 @@ error[E0308]: mismatched types LL | let y = match x { | - | | - | this match expression has type `std::boxed::Box<S>` + | this expression has type `std::boxed::Box<S>` | help: consider dereferencing the boxed value: `*x` LL | S::A { a } | S::B { b: a } => a, | ^^^^^^^^^^ expected struct `std::boxed::Box`, found enum `S` @@ -46,7 +46,7 @@ error[E0308]: mismatched types LL | let y = match x { | - | | - | this match expression has type `std::boxed::Box<S>` + | this expression has type `std::boxed::Box<S>` | help: consider dereferencing the boxed value: `*x` LL | S::A { a } | S::B { b: a } => a, | ^^^^^^^^^^^^^ expected struct `std::boxed::Box`, found enum `S` diff --git a/src/test/ui/issues/issue-58022.stderr b/src/test/ui/issues/issue-58022.stderr index ef0d66d7ad..70a7c38b83 100644 --- a/src/test/ui/issues/issue-58022.stderr +++ b/src/test/ui/issues/issue-58022.stderr @@ -11,9 +11,13 @@ LL | const SIZE: usize; | ------------------ required by `Foo::SIZE` LL | LL | fn new(slice: &[u8; Foo::SIZE]) -> Self; - | ^^^^^^^^^ cannot infer type + | ^^^^^^^^^ + | | + | cannot infer type + | help: use the fully qualified path to an implementation: `<Type as Foo>::SIZE` | = note: cannot resolve `_: Foo` + = note: associated constants cannot be accessed directly on a `trait`, they can only be accessed through a specific `impl` error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-58212.rs b/src/test/ui/issues/issue-58212.rs index 21dcdd56bf..4695497c3a 100644 --- a/src/test/ui/issues/issue-58212.rs +++ b/src/test/ui/issues/issue-58212.rs @@ -1,13 +1,12 @@ -// run-pass +// check-pass trait FromUnchecked { - unsafe fn from_unchecked(); + fn from_unchecked(); } impl FromUnchecked for [u8; 1] { - unsafe fn from_unchecked() { - #[allow(deprecated)] - let mut array: Self = std::mem::uninitialized(); + fn from_unchecked() { + let mut array: Self = [0; 1]; let _ptr = &mut array as *mut [u8] as *mut u8; } } diff --git a/src/test/ui/issues/issue-58344.stderr b/src/test/ui/issues/issue-58344.stderr index 427d03b679..e0c196e518 100644 --- a/src/test/ui/issues/issue-58344.stderr +++ b/src/test/ui/issues/issue-58344.stderr @@ -3,6 +3,9 @@ error[E0277]: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait | LL | ) -> Either<impl Trait<<u32 as Add<u32>>::Output>, impl Trait<<u32 as Add<u32>>::Output>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait<u32>` is not implemented for `impl Trait<<u32 as std::ops::Add>::Output>` +... +LL | add_generic(value, 1u32) + | ------------------------ this returned value is of type `Either<impl Trait<<u32 as std::ops::Add>::Output>, impl Trait<<u32 as std::ops::Add>::Output>>` | = note: the return type of a function must have a statically known size @@ -11,6 +14,9 @@ error[E0277]: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait | LL | ) -> Either<impl Trait<<u32 as Add<u32>>::Output>, impl Trait<<u32 as Add<u32>>::Output>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait<u32>` is not implemented for `impl Trait<<u32 as std::ops::Add>::Output>` +... +LL | add_generic(value, 1u32) + | ------------------------ this returned value is of type `Either<impl Trait<<u32 as std::ops::Add>::Output>, impl Trait<<u32 as std::ops::Add>::Output>>` | = note: the return type of a function must have a statically known size diff --git a/src/test/ui/issues/issue-58712.stderr b/src/test/ui/issues/issue-58712.stderr index 6164ad7ee1..87c16aa993 100644 --- a/src/test/ui/issues/issue-58712.stderr +++ b/src/test/ui/issues/issue-58712.stderr @@ -2,7 +2,9 @@ error[E0412]: cannot find type `DeviceId` in this scope --> $DIR/issue-58712.rs:6:20 | LL | impl<H> AddrVec<H, DeviceId> { - | ^^^^^^^^ not found in this scope + | - ^^^^^^^^ not found in this scope + | | + | help: you might be missing a type parameter: `, DeviceId` error[E0412]: cannot find type `DeviceId` in this scope --> $DIR/issue-58712.rs:8:29 diff --git a/src/test/ui/issues/issue-58734.rs b/src/test/ui/issues/issue-58734.rs index bbdfebe157..b253c135b8 100644 --- a/src/test/ui/issues/issue-58734.rs +++ b/src/test/ui/issues/issue-58734.rs @@ -18,5 +18,5 @@ fn main() { Trait::exists(()); // no object safety error Trait::nonexistent(()); - //~^ ERROR no function or associated item named `nonexistent` found for type `dyn Trait` + //~^ ERROR no function or associated item named `nonexistent` found } diff --git a/src/test/ui/issues/issue-58734.stderr b/src/test/ui/issues/issue-58734.stderr index 07f2a046b2..5e98cfadf8 100644 --- a/src/test/ui/issues/issue-58734.stderr +++ b/src/test/ui/issues/issue-58734.stderr @@ -1,4 +1,4 @@ -error[E0599]: no function or associated item named `nonexistent` found for type `dyn Trait` in the current scope +error[E0599]: no function or associated item named `nonexistent` found for trait object `dyn Trait` in the current scope --> $DIR/issue-58734.rs:20:12 | LL | Trait::nonexistent(()); diff --git a/src/test/ui/issues/issue-5883.stderr b/src/test/ui/issues/issue-5883.stderr index c2de1d0955..d886ecc11d 100644 --- a/src/test/ui/issues/issue-5883.stderr +++ b/src/test/ui/issues/issue-5883.stderr @@ -14,6 +14,9 @@ error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at | LL | -> Struct { | ^^^^^^ doesn't have a size known at compile-time +LL | +LL | Struct { r: r } + | --------------- this returned value is of type `Struct` | = help: within `Struct`, the trait `std::marker::Sized` is not implemented for `(dyn A + 'static)` = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait> diff --git a/src/test/ui/issues/issue-58856-1.rs b/src/test/ui/issues/issue-58856-1.rs index db3984cd18..8b1a39a94e 100644 --- a/src/test/ui/issues/issue-58856-1.rs +++ b/src/test/ui/issues/issue-58856-1.rs @@ -1,6 +1,8 @@ impl A { + //~^ ERROR cannot find type `A` in this scope fn b(self> //~^ ERROR expected one of `)`, `,`, or `:`, found `>` + //~| ERROR expected `;` or `{`, found `>` } fn main() {} diff --git a/src/test/ui/issues/issue-58856-1.stderr b/src/test/ui/issues/issue-58856-1.stderr index 58ab0a142d..0ea6b01754 100644 --- a/src/test/ui/issues/issue-58856-1.stderr +++ b/src/test/ui/issues/issue-58856-1.stderr @@ -1,10 +1,23 @@ error: expected one of `)`, `,`, or `:`, found `>` - --> $DIR/issue-58856-1.rs:2:14 + --> $DIR/issue-58856-1.rs:3:14 | LL | fn b(self> | - ^ help: `)` may belong here | | | unclosed delimiter -error: aborting due to previous error +error: expected `;` or `{`, found `>` + --> $DIR/issue-58856-1.rs:3:14 + | +LL | fn b(self> + | ^ expected `;` or `{` + +error[E0412]: cannot find type `A` in this scope + --> $DIR/issue-58856-1.rs:1:6 + | +LL | impl A { + | ^ not found in this scope + +error: aborting due to 3 previous errors +For more information about this error, try `rustc --explain E0412`. diff --git a/src/test/ui/issues/issue-58857.rs b/src/test/ui/issues/issue-58857.rs index 392e4ea0c2..4350d7e5b4 100644 --- a/src/test/ui/issues/issue-58857.rs +++ b/src/test/ui/issues/issue-58857.rs @@ -2,6 +2,6 @@ struct Conj<A> {a : A} trait Valid {} impl<A: !Valid> Conj<A>{} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported fn main() {} diff --git a/src/test/ui/issues/issue-58857.stderr b/src/test/ui/issues/issue-58857.stderr index ab9a0130c0..e2acec47e5 100644 --- a/src/test/ui/issues/issue-58857.stderr +++ b/src/test/ui/issues/issue-58857.stderr @@ -1,10 +1,8 @@ -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-58857.rs:4:7 | LL | impl<A: !Valid> Conj<A>{} - | ^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bound + | ^^^^^^^^ negative bounds are not supported error: aborting due to previous error diff --git a/src/test/ui/issues/issue-59029-1.rs b/src/test/ui/issues/issue-59029-1.rs index e98a4d0e49..8ab47a4af1 100644 --- a/src/test/ui/issues/issue-59029-1.rs +++ b/src/test/ui/issues/issue-59029-1.rs @@ -4,5 +4,6 @@ trait Svc<Req> { type Res; } trait MkSvc<Target, Req> = Svc<Target> where Self::Res: Svc<Req>; //~^ ERROR associated type `Res` not found for `Self` +//~| ERROR associated type `Res` not found for `Self` fn main() {} diff --git a/src/test/ui/issues/issue-59029-1.stderr b/src/test/ui/issues/issue-59029-1.stderr index ed1d98c40d..53cdb8b1ba 100644 --- a/src/test/ui/issues/issue-59029-1.stderr +++ b/src/test/ui/issues/issue-59029-1.stderr @@ -1,9 +1,15 @@ error[E0220]: associated type `Res` not found for `Self` - --> $DIR/issue-59029-1.rs:5:46 + --> $DIR/issue-59029-1.rs:5:52 | LL | trait MkSvc<Target, Req> = Svc<Target> where Self::Res: Svc<Req>; - | ^^^^^^^^^ associated type `Res` not found + | ^^^ associated type `Res` not found -error: aborting due to previous error +error[E0220]: associated type `Res` not found for `Self` + --> $DIR/issue-59029-1.rs:5:52 + | +LL | trait MkSvc<Target, Req> = Svc<Target> where Self::Res: Svc<Req>; + | ^^^ associated type `Res` not found + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0220`. diff --git a/src/test/ui/issues/issue-60075.stderr b/src/test/ui/issues/issue-60075.stderr index e0b15130c3..e8ef981f51 100644 --- a/src/test/ui/issues/issue-60075.stderr +++ b/src/test/ui/issues/issue-60075.stderr @@ -4,7 +4,7 @@ error: expected one of `.`, `;`, `?`, `else`, or an operator, found `}` LL | }); | ^ expected one of `.`, `;`, `?`, `else`, or an operator -error: expected one of `async`, `const`, `crate`, `extern`, `fn`, `pub`, `type`, `unsafe`, or `}`, found `;` +error: expected one of `async`, `const`, `crate`, `default`, `extern`, `fn`, `pub`, `type`, `unsafe`, or `}`, found `;` --> $DIR/issue-60075.rs:6:11 | LL | fn qux() -> Option<usize> { diff --git a/src/test/ui/issues/issue-61858.stderr b/src/test/ui/issues/issue-61858.stderr index ea2ec3d013..8b95d9c6ae 100644 --- a/src/test/ui/issues/issue-61858.stderr +++ b/src/test/ui/issues/issue-61858.stderr @@ -4,7 +4,7 @@ error: expected `{`, found `)` LL | (if foobar) | -- ^ expected `{` | | - | this `if` statement has a condition, but no block + | this `if` expression has a condition, but no block error: aborting due to previous error diff --git a/src/test/ui/issues/issue-62554.rs b/src/test/ui/issues/issue-62554.rs index 3d50674e62..cfd02183cb 100644 --- a/src/test/ui/issues/issue-62554.rs +++ b/src/test/ui/issues/issue-62554.rs @@ -1,5 +1,6 @@ +// error-pattern:this file contains an unclosed delimiter +// error-pattern:xpected `{`, found `macro_rules` + fn main() {} fn foo(u: u8) { if u8 macro_rules! u8 { (u6) => { fn uuuuuuuuuuu() { use s loo mod u8 { -//~^ ERROR expected `{`, found `macro_rules` -//~ ERROR this file contains an un-closed delimiter diff --git a/src/test/ui/issues/issue-62554.stderr b/src/test/ui/issues/issue-62554.stderr index 87aaa03661..935d3842cd 100644 --- a/src/test/ui/issues/issue-62554.stderr +++ b/src/test/ui/issues/issue-62554.stderr @@ -1,31 +1,71 @@ -error: this file contains an un-closed delimiter - --> $DIR/issue-62554.rs:5:53 +error: this file contains an unclosed delimiter + --> $DIR/issue-62554.rs:6:89 | LL | fn foo(u: u8) { if u8 macro_rules! u8 { (u6) => { fn uuuuuuuuuuu() { use s loo mod u8 { - | - - - - - un-closed delimiter - | | | | | - | | | | un-closed delimiter - | | | un-closed delimiter - | un-closed delimiter un-closed delimiter -LL | -LL | - | ^ + | - - - - - ^ + | | | | | | + | | | | | unclosed delimiter + | | | | unclosed delimiter + | | | unclosed delimiter + | unclosed delimiter unclosed delimiter + +error: this file contains an unclosed delimiter + --> $DIR/issue-62554.rs:6:89 + | +LL | fn foo(u: u8) { if u8 macro_rules! u8 { (u6) => { fn uuuuuuuuuuu() { use s loo mod u8 { + | - - - - - ^ + | | | | | | + | | | | | unclosed delimiter + | | | | unclosed delimiter + | | | unclosed delimiter + | unclosed delimiter unclosed delimiter + +error: this file contains an unclosed delimiter + --> $DIR/issue-62554.rs:6:89 + | +LL | fn foo(u: u8) { if u8 macro_rules! u8 { (u6) => { fn uuuuuuuuuuu() { use s loo mod u8 { + | - - - - - ^ + | | | | | | + | | | | | unclosed delimiter + | | | | unclosed delimiter + | | | unclosed delimiter + | unclosed delimiter unclosed delimiter + +error: this file contains an unclosed delimiter + --> $DIR/issue-62554.rs:6:89 + | +LL | fn foo(u: u8) { if u8 macro_rules! u8 { (u6) => { fn uuuuuuuuuuu() { use s loo mod u8 { + | - - - - - ^ + | | | | | | + | | | | | unclosed delimiter + | | | | unclosed delimiter + | | | unclosed delimiter + | unclosed delimiter unclosed delimiter + +error: this file contains an unclosed delimiter + --> $DIR/issue-62554.rs:6:89 + | +LL | fn foo(u: u8) { if u8 macro_rules! u8 { (u6) => { fn uuuuuuuuuuu() { use s loo mod u8 { + | - - - - - ^ + | | | | | | + | | | | | unclosed delimiter + | | | | unclosed delimiter + | | | unclosed delimiter + | unclosed delimiter unclosed delimiter error: expected `{`, found `macro_rules` - --> $DIR/issue-62554.rs:3:23 + --> $DIR/issue-62554.rs:6:23 | LL | fn foo(u: u8) { if u8 macro_rules! u8 { (u6) => { fn uuuuuuuuuuu() { use s loo mod u8 { | -- ^^^^^^^^^^^ expected `{` | | - | this `if` statement has a condition, but no block + | this `if` expression has a condition, but no block | help: try placing this code inside a block | LL | fn foo(u: u8) { if u8 { macro_rules! u8 { (u6) => { fn uuuuuuuuuuu() { use s loo mod u8 { -LL | -LL | LL | } | -error: aborting due to 2 previous errors +error: aborting due to 6 previous errors diff --git a/src/test/ui/issues/issue-64430.stderr b/src/test/ui/issues/issue-64430.stderr index f1b2de8d8b..e7a244e9df 100644 --- a/src/test/ui/issues/issue-64430.stderr +++ b/src/test/ui/issues/issue-64430.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `bar` found for type `Foo` in the current scope +error[E0599]: no method named `bar` found for struct `Foo` in the current scope --> $DIR/issue-64430.rs:7:9 | LL | pub struct Foo; diff --git a/src/test/ui/issues/issue-6458-2.stderr b/src/test/ui/issues/issue-6458-2.stderr index d538a69045..da16f95dc3 100644 --- a/src/test/ui/issues/issue-6458-2.stderr +++ b/src/test/ui/issues/issue-6458-2.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/issue-6458-2.rs:3:21 | LL | format!("{:?}", None); - | ^^^^ cannot infer type for type parameter `T` + | ^^^^ cannot infer type for type parameter `T` declared on the enum `Option` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-6458-3.stderr b/src/test/ui/issues/issue-6458-3.stderr index 6b3f469ee3..a71c159db0 100644 --- a/src/test/ui/issues/issue-6458-3.stderr +++ b/src/test/ui/issues/issue-6458-3.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/issue-6458-3.rs:4:5 | LL | mem::transmute(0); - | ^^^^^^^^^^^^^^ cannot infer type for type parameter `U` + | ^^^^^^^^^^^^^^ cannot infer type for type parameter `U` declared on the function `transmute` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-6458.stderr b/src/test/ui/issues/issue-6458.stderr index de315659b6..f1a982616a 100644 --- a/src/test/ui/issues/issue-6458.stderr +++ b/src/test/ui/issues/issue-6458.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/issue-6458.rs:9:4 | LL | foo(TypeWithState(marker::PhantomData)); - | ^^^ cannot infer type for type parameter `State` + | ^^^ cannot infer type for type parameter `State` declared on the function `foo` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.rs b/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.rs index e0eaafdfc2..018ce0459f 100644 --- a/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.rs +++ b/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.rs @@ -5,7 +5,7 @@ trait Foo { trait Bar {} fn do_stuff<T : Bar>(t : T) { - t.foo() //~ ERROR no method named `foo` found for type `T` in the current scope + t.foo() //~ ERROR no method named `foo` found } fn main() {} diff --git a/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.stderr b/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.stderr index 24bf60abf6..4807a0930e 100644 --- a/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.stderr +++ b/src/test/ui/issues/issue-65284-suggest-generic-trait-bound.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `foo` found for type `T` in the current scope +error[E0599]: no method named `foo` found for type parameter `T` in the current scope --> $DIR/issue-65284-suggest-generic-trait-bound.rs:8:7 | LL | t.foo() diff --git a/src/test/ui/issues/issue-65634-raw-ident-suggestion.stderr b/src/test/ui/issues/issue-65634-raw-ident-suggestion.stderr index c7bb653dc1..feaf3dc753 100644 --- a/src/test/ui/issues/issue-65634-raw-ident-suggestion.stderr +++ b/src/test/ui/issues/issue-65634-raw-ident-suggestion.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in an impl of the trait `async` for the type `r#fn | LL | fn r#struct(&self) { | ^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `async::r#struct(r#fn {})` instead note: candidate #2 is defined in an impl of the trait `await` for the type `r#fn` --> $DIR/issue-65634-raw-ident-suggestion.rs:10:5 | LL | fn r#struct(&self) { | ^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `await::r#struct(r#fn {})` instead +help: disambiguate the method call for candidate #1 + | +LL | async::r#struct(&r#fn {}); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | await::r#struct(&r#fn {}); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-66308.rs b/src/test/ui/issues/issue-66308.rs new file mode 100644 index 0000000000..8460b359ae --- /dev/null +++ b/src/test/ui/issues/issue-66308.rs @@ -0,0 +1,8 @@ +// build-pass +// compile-flags: --crate-type lib -C opt-level=0 + +// Regression test for LLVM crash affecting Emscripten targets + +pub fn foo() { + (0..0).rev().next(); +} diff --git a/src/test/ui/issues/issue-66473.rs b/src/test/ui/issues/issue-66473.rs new file mode 100644 index 0000000000000000000000000000000000000000..cc298a28b97e5bc6e683fe5faee36d95d64720bf GIT binary patch literal 113 zcmdPbS4b@?$}iF_NGvHyEy}Y}D9y{x%P-GUC@x7XDpAN!Qz*&LPR--e$55DBQIMKk klA5BB5S^f-kd|MX2V|NhaB(T0?O?zFT->r|vJ4Dd0C6%O9{>OV literal 0 HcmV?d00001 diff --git a/src/test/ui/issues/issue-66473.stderr b/src/test/ui/issues/issue-66473.stderr new file mode 100644 index 0000000000000000000000000000000000000000..dbeef44bad0ec68b68ce3c3c06768df43587855c GIT binary patch literal 2632 zcmchZPfNov7>9d~pJDKV9_`%QrrFG4CojTIUX{_!W>N;p$R8D)cfXw9$xvZLWL*#A z&8d*`dqUuS@>A9tD<SBuHg6i7Us(@k1Kw<vmhcolN<RB!0C_%#tGoM$o7TCYav}J% z99t*3EaEQg*<t~ExcvUg{;h5wV9A&|Nt^VuN<tPVWL1PLLCBgCvSx&=TS692C}Btm zqf`e{x&tZYft2<@N_`-uKaf%&NNJGbtOmiR?~Shh^nr_!7-d<flwt4xsql2J((qyF zz3rls=^ULsJe`{(;p%;-p1o?Ieyp!yV}g#KqK?;htbJ8-sMT^v(|_AqdW>c4fQLW2 g_IIdjtF^Jd)i2Nl6^kJh9ClW{wk9~}8l7Y82jcILL;wH) literal 0 HcmV?d00001 diff --git a/src/test/ui/issues/issue-66923-show-error-for-correct-call.rs b/src/test/ui/issues/issue-66923-show-error-for-correct-call.rs new file mode 100644 index 0000000000..8332807397 --- /dev/null +++ b/src/test/ui/issues/issue-66923-show-error-for-correct-call.rs @@ -0,0 +1,15 @@ +// This test checks that errors are showed for lines with `collect` rather than `push` method. + +fn main() { + let v = vec![1_f64, 2.2_f64]; + let mut fft: Vec<Vec<f64>> = vec![]; + + let x1: &[f64] = &v; + let x2: Vec<f64> = x1.into_iter().collect(); + //~^ ERROR a value of type + fft.push(x2); + + let x3 = x1.into_iter().collect::<Vec<f64>>(); + //~^ ERROR a value of type + fft.push(x3); +} diff --git a/src/test/ui/issues/issue-66923-show-error-for-correct-call.stderr b/src/test/ui/issues/issue-66923-show-error-for-correct-call.stderr new file mode 100644 index 0000000000..8e7ee97e0b --- /dev/null +++ b/src/test/ui/issues/issue-66923-show-error-for-correct-call.stderr @@ -0,0 +1,19 @@ +error[E0277]: a value of type `std::vec::Vec<f64>` cannot be built from an iterator over elements of type `&f64` + --> $DIR/issue-66923-show-error-for-correct-call.rs:8:39 + | +LL | let x2: Vec<f64> = x1.into_iter().collect(); + | ^^^^^^^ value of type `std::vec::Vec<f64>` cannot be built from `std::iter::Iterator<Item=&f64>` + | + = help: the trait `std::iter::FromIterator<&f64>` is not implemented for `std::vec::Vec<f64>` + +error[E0277]: a value of type `std::vec::Vec<f64>` cannot be built from an iterator over elements of type `&f64` + --> $DIR/issue-66923-show-error-for-correct-call.rs:12:29 + | +LL | let x3 = x1.into_iter().collect::<Vec<f64>>(); + | ^^^^^^^ value of type `std::vec::Vec<f64>` cannot be built from `std::iter::Iterator<Item=&f64>` + | + = help: the trait `std::iter::FromIterator<&f64>` is not implemented for `std::vec::Vec<f64>` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/issues/issue-67037-pat-tup-scrut-ty-diff-less-fields.rs b/src/test/ui/issues/issue-67037-pat-tup-scrut-ty-diff-less-fields.rs index 44bd645598..a3023ee906 100644 --- a/src/test/ui/issues/issue-67037-pat-tup-scrut-ty-diff-less-fields.rs +++ b/src/test/ui/issues/issue-67037-pat-tup-scrut-ty-diff-less-fields.rs @@ -10,7 +10,7 @@ // However, we did not account for the expected type being different than the tuple pattern type. // This caused an issue when the tuple pattern type (`P<T>`) was generic. // Specifically, we tried deriving the 0th field's type using the `substs` of the expected type. -// When attempting to substitute `T`, there was no such substitution, so "out of range" occured. +// When attempting to substitute `T`, there was no such substitution, so "out of range" occurred. struct U {} // 0 type parameters offered struct P<T>(T); // 1 type parameter wanted diff --git a/src/test/ui/issues/issue-67037-pat-tup-scrut-ty-diff-less-fields.stderr b/src/test/ui/issues/issue-67037-pat-tup-scrut-ty-diff-less-fields.stderr index 521dd0256f..6e8ea6bf61 100644 --- a/src/test/ui/issues/issue-67037-pat-tup-scrut-ty-diff-less-fields.stderr +++ b/src/test/ui/issues/issue-67037-pat-tup-scrut-ty-diff-less-fields.stderr @@ -2,7 +2,9 @@ error[E0308]: mismatched types --> $DIR/issue-67037-pat-tup-scrut-ty-diff-less-fields.rs:19:9 | LL | let P() = U {}; - | ^^^ expected struct `U`, found struct `P` + | ^^^ ---- this expression has type `U` + | | + | expected struct `U`, found struct `P` | = note: expected struct `U` found struct `P<_>` diff --git a/src/test/ui/issues/issue-6804.rs b/src/test/ui/issues/issue-6804.rs index b4af3581a0..325137327b 100644 --- a/src/test/ui/issues/issue-6804.rs +++ b/src/test/ui/issues/issue-6804.rs @@ -17,7 +17,9 @@ fn main() { match [x, 1.0] { [NAN, _] => {}, //~ ERROR floating-point types cannot be used - //~^ WARN this was previously accepted by the compiler but is being phased out + //~| ERROR floating-point types cannot be used + //~| WARN this was previously accepted by the compiler but is being phased out + //~| WARN this was previously accepted by the compiler but is being phased out _ => {}, }; } diff --git a/src/test/ui/issues/issue-6804.stderr b/src/test/ui/issues/issue-6804.stderr index ab4467e513..f4188dc356 100644 --- a/src/test/ui/issues/issue-6804.stderr +++ b/src/test/ui/issues/issue-6804.stderr @@ -30,5 +30,14 @@ LL | NAN => {}, = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> -error: aborting due to 3 previous errors +error: floating-point types cannot be used in patterns + --> $DIR/issue-6804.rs:19:10 + | +LL | [NAN, _] => {}, + | ^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +error: aborting due to 4 previous errors diff --git a/src/test/ui/issues/issue-68091-unicode-ident-after-if.rs b/src/test/ui/issues/issue-68091-unicode-ident-after-if.rs index 99d69d2199..00f90cc73b 100644 --- a/src/test/ui/issues/issue-68091-unicode-ident-after-if.rs +++ b/src/test/ui/issues/issue-68091-unicode-ident-after-if.rs @@ -1,7 +1,7 @@ macro_rules! x { ($($c:tt)*) => { $($c)ö* {} //~ ERROR missing condition for `if` expression - }; + }; //~| ERROR mismatched types } fn main() { diff --git a/src/test/ui/issues/issue-68091-unicode-ident-after-if.stderr b/src/test/ui/issues/issue-68091-unicode-ident-after-if.stderr index aac04f4b74..8d1a03ac20 100644 --- a/src/test/ui/issues/issue-68091-unicode-ident-after-if.stderr +++ b/src/test/ui/issues/issue-68091-unicode-ident-after-if.stderr @@ -4,5 +4,15 @@ error: missing condition for `if` expression LL | $($c)ö* {} | ^ expected if condition here -error: aborting due to previous error +error[E0308]: mismatched types + --> $DIR/issue-68091-unicode-ident-after-if.rs:3:17 + | +LL | $($c)ö* {} + | ^^ expected `bool`, found `()` +... +LL | x!(if); + | ------- in this macro invocation + +error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/issues/issue-68103.rs b/src/test/ui/issues/issue-68103.rs new file mode 100644 index 0000000000..e775678fc6 --- /dev/null +++ b/src/test/ui/issues/issue-68103.rs @@ -0,0 +1,6 @@ +// check-pass + +pub extern crate self as name; +pub use name::name as bug; + +fn main() {} diff --git a/src/test/ui/issues/issue-69396-const-no-type-in-macro.rs b/src/test/ui/issues/issue-69396-const-no-type-in-macro.rs new file mode 100644 index 0000000000..69fc0c1cbb --- /dev/null +++ b/src/test/ui/issues/issue-69396-const-no-type-in-macro.rs @@ -0,0 +1,17 @@ +macro_rules! suite { + ( $( $fn:ident; )* ) => { + $( + const A = "A".$fn(); + //~^ ERROR the name `A` is defined multiple times + //~| ERROR missing type for `const` item + //~| ERROR the type placeholder `_` is not allowed within types + )* + } +} + +suite! { + len; + is_empty; +} + +fn main() {} diff --git a/src/test/ui/issues/issue-69396-const-no-type-in-macro.stderr b/src/test/ui/issues/issue-69396-const-no-type-in-macro.stderr new file mode 100644 index 0000000000..c12ce166ef --- /dev/null +++ b/src/test/ui/issues/issue-69396-const-no-type-in-macro.stderr @@ -0,0 +1,48 @@ +error[E0428]: the name `A` is defined multiple times + --> $DIR/issue-69396-const-no-type-in-macro.rs:4:13 + | +LL | const A = "A".$fn(); + | ^^^^^^^^^^^^^^^^^^^^ + | | + | `A` redefined here + | previous definition of the value `A` here +... +LL | / suite! { +LL | | len; +LL | | is_empty; +LL | | } + | |_- in this macro invocation + | + = note: `A` must be defined only once in the value namespace of this module + +error: missing type for `const` item + --> $DIR/issue-69396-const-no-type-in-macro.rs:4:19 + | +LL | const A = "A".$fn(); + | ^ help: provide a type for the item: `A: usize` +... +LL | / suite! { +LL | | len; +LL | | is_empty; +LL | | } + | |_- in this macro invocation + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/issue-69396-const-no-type-in-macro.rs:4:19 + | +LL | const A = "A".$fn(); + | ^ + | | + | not allowed in type signatures + | help: replace `_` with the correct type: `bool` +... +LL | / suite! { +LL | | len; +LL | | is_empty; +LL | | } + | |_- in this macro invocation + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0121, E0428. +For more information about an error, try `rustc --explain E0121`. diff --git a/src/test/ui/issues/issue-7092.stderr b/src/test/ui/issues/issue-7092.stderr index 05c00da16b..590dd40c65 100644 --- a/src/test/ui/issues/issue-7092.stderr +++ b/src/test/ui/issues/issue-7092.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/issue-7092.rs:6:9 | LL | match x { - | - this match expression has type `Whatever` + | - this expression has type `Whatever` LL | Some(field) => | ^^^^^^^^^^^ expected enum `Whatever`, found enum `std::option::Option` | diff --git a/src/test/ui/issues/issue-7607-1.rs b/src/test/ui/issues/issue-7607-1.rs index 5221f2c529..1571cd2bbf 100644 --- a/src/test/ui/issues/issue-7607-1.rs +++ b/src/test/ui/issues/issue-7607-1.rs @@ -1,3 +1,7 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl struct Foo { x: isize } diff --git a/src/test/ui/issues/issue-7607-1.stderr b/src/test/ui/issues/issue-7607-1.stderr index 9320943a82..94f489e209 100644 --- a/src/test/ui/issues/issue-7607-1.stderr +++ b/src/test/ui/issues/issue-7607-1.stderr @@ -1,8 +1,13 @@ error[E0412]: cannot find type `Fo` in this scope - --> $DIR/issue-7607-1.rs:5:6 + --> $DIR/issue-7607-1.rs:9:6 | LL | impl Fo { | ^^ help: a trait with a similar name exists: `Fn` + | + ::: $SRC_DIR/libcore/ops/function.rs:LL:COL + | +LL | pub trait Fn<Args>: FnMut<Args> { + | ------------------------------- similarly named trait `Fn` defined here error: aborting due to previous error diff --git a/src/test/ui/issues/issue-7784.rs b/src/test/ui/issues/issue-7784.rs index 5b70bd6e5f..b7323f09da 100644 --- a/src/test/ui/issues/issue-7784.rs +++ b/src/test/ui/issues/issue-7784.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(slice_patterns)] use std::ops::Add; diff --git a/src/test/ui/issues/issue-7950.rs b/src/test/ui/issues/issue-7950.rs index 7add8afee4..d3dcb3380b 100644 --- a/src/test/ui/issues/issue-7950.rs +++ b/src/test/ui/issues/issue-7950.rs @@ -4,5 +4,5 @@ struct Foo; fn main() { Foo::bar(); - //~^ ERROR no function or associated item named `bar` found for type `Foo` + //~^ ERROR no function or associated item named `bar` found for struct `Foo` } diff --git a/src/test/ui/issues/issue-7950.stderr b/src/test/ui/issues/issue-7950.stderr index bbeab405e2..73e13c65cf 100644 --- a/src/test/ui/issues/issue-7950.stderr +++ b/src/test/ui/issues/issue-7950.stderr @@ -1,4 +1,4 @@ -error[E0599]: no function or associated item named `bar` found for type `Foo` in the current scope +error[E0599]: no function or associated item named `bar` found for struct `Foo` in the current scope --> $DIR/issue-7950.rs:6:10 | LL | struct Foo; diff --git a/src/test/ui/issues/issue-8460-const.rs b/src/test/ui/issues/issue-8460-const.rs index 71e2b58031..c18a0d4d6c 100644 --- a/src/test/ui/issues/issue-8460-const.rs +++ b/src/test/ui/issues/issue-8460-const.rs @@ -1,3 +1,4 @@ +// build-fail // compile-flags: -O #![deny(const_err)] diff --git a/src/test/ui/issues/issue-8460-const.stderr b/src/test/ui/issues/issue-8460-const.stderr index c6750e653d..170747f840 100644 --- a/src/test/ui/issues/issue-8460-const.stderr +++ b/src/test/ui/issues/issue-8460-const.stderr @@ -1,185 +1,185 @@ error: attempt to divide with overflow - --> $DIR/issue-8460-const.rs:9:36 + --> $DIR/issue-8460-const.rs:10:36 | LL | assert!(thread::spawn(move|| { isize::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^^^ | note: lint level defined here - --> $DIR/issue-8460-const.rs:3:9 + --> $DIR/issue-8460-const.rs:4:9 | LL | #![deny(const_err)] | ^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:9:36 + --> $DIR/issue-8460-const.rs:10:36 | LL | assert!(thread::spawn(move|| { isize::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^^^ attempt to divide with overflow error: attempt to divide with overflow - --> $DIR/issue-8460-const.rs:12:36 + --> $DIR/issue-8460-const.rs:13:36 | LL | assert!(thread::spawn(move|| { i8::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:12:36 + --> $DIR/issue-8460-const.rs:13:36 | LL | assert!(thread::spawn(move|| { i8::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^ attempt to divide with overflow error: attempt to divide with overflow - --> $DIR/issue-8460-const.rs:15:36 + --> $DIR/issue-8460-const.rs:16:36 | LL | assert!(thread::spawn(move|| { i16::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:15:36 + --> $DIR/issue-8460-const.rs:16:36 | LL | assert!(thread::spawn(move|| { i16::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^ attempt to divide with overflow error: attempt to divide with overflow - --> $DIR/issue-8460-const.rs:18:36 + --> $DIR/issue-8460-const.rs:19:36 | LL | assert!(thread::spawn(move|| { i32::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:18:36 + --> $DIR/issue-8460-const.rs:19:36 | LL | assert!(thread::spawn(move|| { i32::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^ attempt to divide with overflow error: attempt to divide with overflow - --> $DIR/issue-8460-const.rs:21:36 + --> $DIR/issue-8460-const.rs:22:36 | LL | assert!(thread::spawn(move|| { i64::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:21:36 + --> $DIR/issue-8460-const.rs:22:36 | LL | assert!(thread::spawn(move|| { i64::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^ attempt to divide with overflow error: attempt to divide by zero - --> $DIR/issue-8460-const.rs:24:36 + --> $DIR/issue-8460-const.rs:25:36 | LL | assert!(thread::spawn(move|| { 1isize / 0; }).join().is_err()); | ^^^^^^^^^^ error: attempt to divide by zero - --> $DIR/issue-8460-const.rs:26:36 + --> $DIR/issue-8460-const.rs:27:36 | LL | assert!(thread::spawn(move|| { 1i8 / 0; }).join().is_err()); | ^^^^^^^ error: attempt to divide by zero - --> $DIR/issue-8460-const.rs:28:36 + --> $DIR/issue-8460-const.rs:29:36 | LL | assert!(thread::spawn(move|| { 1i16 / 0; }).join().is_err()); | ^^^^^^^^ error: attempt to divide by zero - --> $DIR/issue-8460-const.rs:30:36 + --> $DIR/issue-8460-const.rs:31:36 | LL | assert!(thread::spawn(move|| { 1i32 / 0; }).join().is_err()); | ^^^^^^^^ error: attempt to divide by zero - --> $DIR/issue-8460-const.rs:32:36 + --> $DIR/issue-8460-const.rs:33:36 | LL | assert!(thread::spawn(move|| { 1i64 / 0; }).join().is_err()); | ^^^^^^^^ error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const.rs:34:36 + --> $DIR/issue-8460-const.rs:35:36 | LL | assert!(thread::spawn(move|| { isize::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:34:36 + --> $DIR/issue-8460-const.rs:35:36 | LL | assert!(thread::spawn(move|| { isize::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^^^ attempt to calculate the remainder with overflow error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const.rs:37:36 + --> $DIR/issue-8460-const.rs:38:36 | LL | assert!(thread::spawn(move|| { i8::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:37:36 + --> $DIR/issue-8460-const.rs:38:36 | LL | assert!(thread::spawn(move|| { i8::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^ attempt to calculate the remainder with overflow error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const.rs:40:36 + --> $DIR/issue-8460-const.rs:41:36 | LL | assert!(thread::spawn(move|| { i16::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:40:36 + --> $DIR/issue-8460-const.rs:41:36 | LL | assert!(thread::spawn(move|| { i16::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const.rs:43:36 + --> $DIR/issue-8460-const.rs:44:36 | LL | assert!(thread::spawn(move|| { i32::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:43:36 + --> $DIR/issue-8460-const.rs:44:36 | LL | assert!(thread::spawn(move|| { i32::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const.rs:46:36 + --> $DIR/issue-8460-const.rs:47:36 | LL | assert!(thread::spawn(move|| { i64::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: this expression will panic at runtime - --> $DIR/issue-8460-const.rs:46:36 + --> $DIR/issue-8460-const.rs:47:36 | LL | assert!(thread::spawn(move|| { i64::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^ attempt to calculate the remainder with overflow error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const.rs:49:36 + --> $DIR/issue-8460-const.rs:50:36 | LL | assert!(thread::spawn(move|| { 1isize % 0; }).join().is_err()); | ^^^^^^^^^^ error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const.rs:51:36 + --> $DIR/issue-8460-const.rs:52:36 | LL | assert!(thread::spawn(move|| { 1i8 % 0; }).join().is_err()); | ^^^^^^^ error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const.rs:53:36 + --> $DIR/issue-8460-const.rs:54:36 | LL | assert!(thread::spawn(move|| { 1i16 % 0; }).join().is_err()); | ^^^^^^^^ error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const.rs:55:36 + --> $DIR/issue-8460-const.rs:56:36 | LL | assert!(thread::spawn(move|| { 1i32 % 0; }).join().is_err()); | ^^^^^^^^ error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const.rs:57:36 + --> $DIR/issue-8460-const.rs:58:36 | LL | assert!(thread::spawn(move|| { 1i64 % 0; }).join().is_err()); | ^^^^^^^^ diff --git a/src/test/ui/issues/issue-8460-const2.rs b/src/test/ui/issues/issue-8460-const2.rs index 723a17940a..0ca850abc1 100644 --- a/src/test/ui/issues/issue-8460-const2.rs +++ b/src/test/ui/issues/issue-8460-const2.rs @@ -1,3 +1,4 @@ +// build-fail // compile-flags: -C overflow-checks=on -O #![deny(const_err)] diff --git a/src/test/ui/issues/issue-8460-const2.stderr b/src/test/ui/issues/issue-8460-const2.stderr index 87b9b2daa6..6ad186fb21 100644 --- a/src/test/ui/issues/issue-8460-const2.stderr +++ b/src/test/ui/issues/issue-8460-const2.stderr @@ -1,125 +1,125 @@ error: attempt to divide with overflow - --> $DIR/issue-8460-const2.rs:9:36 + --> $DIR/issue-8460-const2.rs:10:36 | LL | assert!(thread::spawn(move|| { isize::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^^^ | note: lint level defined here - --> $DIR/issue-8460-const2.rs:3:9 + --> $DIR/issue-8460-const2.rs:4:9 | LL | #![deny(const_err)] | ^^^^^^^^^ error: attempt to divide with overflow - --> $DIR/issue-8460-const2.rs:11:36 + --> $DIR/issue-8460-const2.rs:12:36 | LL | assert!(thread::spawn(move|| { i8::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^ error: attempt to divide with overflow - --> $DIR/issue-8460-const2.rs:13:36 + --> $DIR/issue-8460-const2.rs:14:36 | LL | assert!(thread::spawn(move|| { i16::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: attempt to divide with overflow - --> $DIR/issue-8460-const2.rs:15:36 + --> $DIR/issue-8460-const2.rs:16:36 | LL | assert!(thread::spawn(move|| { i32::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: attempt to divide with overflow - --> $DIR/issue-8460-const2.rs:17:36 + --> $DIR/issue-8460-const2.rs:18:36 | LL | assert!(thread::spawn(move|| { i64::MIN / -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: attempt to divide by zero - --> $DIR/issue-8460-const2.rs:19:36 + --> $DIR/issue-8460-const2.rs:20:36 | LL | assert!(thread::spawn(move|| { 1isize / 0; }).join().is_err()); | ^^^^^^^^^^ error: attempt to divide by zero - --> $DIR/issue-8460-const2.rs:21:36 + --> $DIR/issue-8460-const2.rs:22:36 | LL | assert!(thread::spawn(move|| { 1i8 / 0; }).join().is_err()); | ^^^^^^^ error: attempt to divide by zero - --> $DIR/issue-8460-const2.rs:23:36 + --> $DIR/issue-8460-const2.rs:24:36 | LL | assert!(thread::spawn(move|| { 1i16 / 0; }).join().is_err()); | ^^^^^^^^ error: attempt to divide by zero - --> $DIR/issue-8460-const2.rs:25:36 + --> $DIR/issue-8460-const2.rs:26:36 | LL | assert!(thread::spawn(move|| { 1i32 / 0; }).join().is_err()); | ^^^^^^^^ error: attempt to divide by zero - --> $DIR/issue-8460-const2.rs:27:36 + --> $DIR/issue-8460-const2.rs:28:36 | LL | assert!(thread::spawn(move|| { 1i64 / 0; }).join().is_err()); | ^^^^^^^^ error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const2.rs:29:36 + --> $DIR/issue-8460-const2.rs:30:36 | LL | assert!(thread::spawn(move|| { isize::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^^^ error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const2.rs:31:36 + --> $DIR/issue-8460-const2.rs:32:36 | LL | assert!(thread::spawn(move|| { i8::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^ error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const2.rs:33:36 + --> $DIR/issue-8460-const2.rs:34:36 | LL | assert!(thread::spawn(move|| { i16::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const2.rs:35:36 + --> $DIR/issue-8460-const2.rs:36:36 | LL | assert!(thread::spawn(move|| { i32::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: attempt to calculate the remainder with overflow - --> $DIR/issue-8460-const2.rs:37:36 + --> $DIR/issue-8460-const2.rs:38:36 | LL | assert!(thread::spawn(move|| { i64::MIN % -1; }).join().is_err()); | ^^^^^^^^^^^^^ error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const2.rs:39:36 + --> $DIR/issue-8460-const2.rs:40:36 | LL | assert!(thread::spawn(move|| { 1isize % 0; }).join().is_err()); | ^^^^^^^^^^ error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const2.rs:41:36 + --> $DIR/issue-8460-const2.rs:42:36 | LL | assert!(thread::spawn(move|| { 1i8 % 0; }).join().is_err()); | ^^^^^^^ error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const2.rs:43:36 + --> $DIR/issue-8460-const2.rs:44:36 | LL | assert!(thread::spawn(move|| { 1i16 % 0; }).join().is_err()); | ^^^^^^^^ error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const2.rs:45:36 + --> $DIR/issue-8460-const2.rs:46:36 | LL | assert!(thread::spawn(move|| { 1i32 % 0; }).join().is_err()); | ^^^^^^^^ error: attempt to calculate the remainder with a divisor of zero - --> $DIR/issue-8460-const2.rs:47:36 + --> $DIR/issue-8460-const2.rs:48:36 | LL | assert!(thread::spawn(move|| { 1i64 % 0; }).join().is_err()); | ^^^^^^^^ diff --git a/src/test/ui/issues/issue-8460.rs b/src/test/ui/issues/issue-8460.rs index b7fc564a9b..3fd576a8d3 100644 --- a/src/test/ui/issues/issue-8460.rs +++ b/src/test/ui/issues/issue-8460.rs @@ -11,8 +11,8 @@ trait Int { } macro_rules! doit { ($($t:ident)*) => ($(impl Int for $t { - fn zero() -> $t { 0 } - fn one() -> $t { 1 } + fn zero() -> Self { 0 } + fn one() -> Self { 1 } })*) } doit! { i8 i16 i32 i64 isize } diff --git a/src/test/ui/issues/issue-8727.rs b/src/test/ui/issues/issue-8727.rs index 473d237cd8..80f360155c 100644 --- a/src/test/ui/issues/issue-8727.rs +++ b/src/test/ui/issues/issue-8727.rs @@ -1,6 +1,8 @@ // Verify the compiler fails with an error on infinite function // recursions. +// build-fail + fn generic<T>() { generic::<Option<T>>(); } diff --git a/src/test/ui/issues/issue-8727.stderr b/src/test/ui/issues/issue-8727.stderr index df01f42ce2..2fd6ea5dc8 100644 --- a/src/test/ui/issues/issue-8727.stderr +++ b/src/test/ui/issues/issue-8727.stderr @@ -1,5 +1,5 @@ warning: function cannot return without recursing - --> $DIR/issue-8727.rs:4:1 + --> $DIR/issue-8727.rs:6:1 | LL | fn generic<T>() { | ^^^^^^^^^^^^^^^ cannot return without recursing @@ -10,7 +10,7 @@ LL | generic::<Option<T>>(); = help: a `loop` may express intention better if this is on purpose error: reached the recursion limit while instantiating `generic::<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<i32>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>` - --> $DIR/issue-8727.rs:4:1 + --> $DIR/issue-8727.rs:6:1 | LL | / fn generic<T>() { LL | | generic::<Option<T>>(); diff --git a/src/test/ui/issues/issue-9575.rs b/src/test/ui/issues/issue-9575.rs index bac4ac1d20..06b252990b 100644 --- a/src/test/ui/issues/issue-9575.rs +++ b/src/test/ui/issues/issue-9575.rs @@ -2,6 +2,6 @@ #[start] fn start(argc: isize, argv: *const *const u8, crate_map: *const u8) -> isize { - //~^ start function has wrong type + //~^ `#[start]` function has wrong type 0 } diff --git a/src/test/ui/issues/issue-9575.stderr b/src/test/ui/issues/issue-9575.stderr index 3e3678a23f..5b8ce84a07 100644 --- a/src/test/ui/issues/issue-9575.stderr +++ b/src/test/ui/issues/issue-9575.stderr @@ -1,4 +1,4 @@ -error[E0308]: start function has wrong type +error[E0308]: `#[start]` function has wrong type --> $DIR/issue-9575.rs:4:1 | LL | fn start(argc: isize, argv: *const *const u8, crate_map: *const u8) -> isize { diff --git a/src/test/ui/iterators/into-iter-on-arrays-lint.fixed b/src/test/ui/iterators/into-iter-on-arrays-lint.fixed index f88a52d315..c1aa3d70f7 100644 --- a/src/test/ui/iterators/into-iter-on-arrays-lint.fixed +++ b/src/test/ui/iterators/into-iter-on-arrays-lint.fixed @@ -19,6 +19,31 @@ fn main() { //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(small).iter(); + //~^ WARNING this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new([1, 2]).iter(); + //~^ WARNING this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(big).iter(); + //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new([0u8; 33]).iter(); + //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + + Box::new(Box::new(small)).iter(); + //~^ WARNING this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(Box::new([1, 2])).iter(); + //~^ WARNING this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(Box::new(big)).iter(); + //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(Box::new([0u8; 33])).iter(); + //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out // Expressions that should not (&[1, 2]).into_iter(); diff --git a/src/test/ui/iterators/into-iter-on-arrays-lint.rs b/src/test/ui/iterators/into-iter-on-arrays-lint.rs index e1a4b535f3..afdf6cb7f4 100644 --- a/src/test/ui/iterators/into-iter-on-arrays-lint.rs +++ b/src/test/ui/iterators/into-iter-on-arrays-lint.rs @@ -19,6 +19,31 @@ fn main() { //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(small).into_iter(); + //~^ WARNING this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new([1, 2]).into_iter(); + //~^ WARNING this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(big).into_iter(); + //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new([0u8; 33]).into_iter(); + //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + + Box::new(Box::new(small)).into_iter(); + //~^ WARNING this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(Box::new([1, 2])).into_iter(); + //~^ WARNING this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(Box::new(big)).into_iter(); + //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out + Box::new(Box::new([0u8; 33])).into_iter(); + //~^ WARNING this method call currently resolves to `<&[T] as IntoIterator>::into_iter` + //~| WARNING this was previously accepted by the compiler but is being phased out // Expressions that should not (&[1, 2]).into_iter(); diff --git a/src/test/ui/iterators/into-iter-on-arrays-lint.stderr b/src/test/ui/iterators/into-iter-on-arrays-lint.stderr index b5964bd44b..e9cc427f6d 100644 --- a/src/test/ui/iterators/into-iter-on-arrays-lint.stderr +++ b/src/test/ui/iterators/into-iter-on-arrays-lint.stderr @@ -35,3 +35,75 @@ LL | [0u8; 33].into_iter(); = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #66145 <https://github.com/rust-lang/rust/issues/66145> +warning: this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` (due to autoref coercions), but that might change in the future when `IntoIterator` impls for arrays are added. + --> $DIR/into-iter-on-arrays-lint.rs:22:21 + | +LL | Box::new(small).into_iter(); + | ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter` + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #66145 <https://github.com/rust-lang/rust/issues/66145> + +warning: this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` (due to autoref coercions), but that might change in the future when `IntoIterator` impls for arrays are added. + --> $DIR/into-iter-on-arrays-lint.rs:25:22 + | +LL | Box::new([1, 2]).into_iter(); + | ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter` + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #66145 <https://github.com/rust-lang/rust/issues/66145> + +warning: this method call currently resolves to `<&[T] as IntoIterator>::into_iter` (due to autoref coercions), but that might change in the future when `IntoIterator` impls for arrays are added. + --> $DIR/into-iter-on-arrays-lint.rs:28:19 + | +LL | Box::new(big).into_iter(); + | ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter` + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #66145 <https://github.com/rust-lang/rust/issues/66145> + +warning: this method call currently resolves to `<&[T] as IntoIterator>::into_iter` (due to autoref coercions), but that might change in the future when `IntoIterator` impls for arrays are added. + --> $DIR/into-iter-on-arrays-lint.rs:31:25 + | +LL | Box::new([0u8; 33]).into_iter(); + | ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter` + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #66145 <https://github.com/rust-lang/rust/issues/66145> + +warning: this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` (due to autoref coercions), but that might change in the future when `IntoIterator` impls for arrays are added. + --> $DIR/into-iter-on-arrays-lint.rs:35:31 + | +LL | Box::new(Box::new(small)).into_iter(); + | ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter` + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #66145 <https://github.com/rust-lang/rust/issues/66145> + +warning: this method call currently resolves to `<&[T; N] as IntoIterator>::into_iter` (due to autoref coercions), but that might change in the future when `IntoIterator` impls for arrays are added. + --> $DIR/into-iter-on-arrays-lint.rs:38:32 + | +LL | Box::new(Box::new([1, 2])).into_iter(); + | ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter` + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #66145 <https://github.com/rust-lang/rust/issues/66145> + +warning: this method call currently resolves to `<&[T] as IntoIterator>::into_iter` (due to autoref coercions), but that might change in the future when `IntoIterator` impls for arrays are added. + --> $DIR/into-iter-on-arrays-lint.rs:41:29 + | +LL | Box::new(Box::new(big)).into_iter(); + | ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter` + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #66145 <https://github.com/rust-lang/rust/issues/66145> + +warning: this method call currently resolves to `<&[T] as IntoIterator>::into_iter` (due to autoref coercions), but that might change in the future when `IntoIterator` impls for arrays are added. + --> $DIR/into-iter-on-arrays-lint.rs:44:35 + | +LL | Box::new(Box::new([0u8; 33])).into_iter(); + | ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter` + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #66145 <https://github.com/rust-lang/rust/issues/66145> + diff --git a/src/test/ui/iterators/skip-count-overflow.rs b/src/test/ui/iterators/skip-count-overflow.rs new file mode 100644 index 0000000000..d8efc94866 --- /dev/null +++ b/src/test/ui/iterators/skip-count-overflow.rs @@ -0,0 +1,8 @@ +// run-pass +// only-32bit too impatient for 2⁶⁴ items +// compile-flags: -C overflow-checks -C opt-level=3 + +fn main() { + let i = (0..usize::max_value()).chain(0..10).skip(usize::max_value()); + assert_eq!(i.count(), 10); +} diff --git a/src/test/ui/json-and-color.rs b/src/test/ui/json-and-color.rs index efc07a541b..6f8326fe24 100644 --- a/src/test/ui/json-and-color.rs +++ b/src/test/ui/json-and-color.rs @@ -1,4 +1,3 @@ -// build-fail // compile-flags: --json=artifacts --error-format=json --color never fn main() {} diff --git a/src/test/ui/json-and-error-format.rs b/src/test/ui/json-and-error-format.rs index 6b369307fa..6e2d73c76b 100644 --- a/src/test/ui/json-and-error-format.rs +++ b/src/test/ui/json-and-error-format.rs @@ -1,4 +1,3 @@ -// build-fail // compile-flags: --json=artifacts --error-format=short fn main() {} diff --git a/src/test/ui/json-bom-plus-crlf-multifile.rs b/src/test/ui/json-bom-plus-crlf-multifile.rs index c71dd325f4..9290e01040 100644 --- a/src/test/ui/json-bom-plus-crlf-multifile.rs +++ b/src/test/ui/json-bom-plus-crlf-multifile.rs @@ -1,6 +1,5 @@ // (This line has BOM so it's ignored by compiletest for directives) // -// build-fail // compile-flags: --json=diagnostic-short --error-format=json // ignore-tidy-cr diff --git a/src/test/ui/json-bom-plus-crlf.rs b/src/test/ui/json-bom-plus-crlf.rs index ae54a35d48..be5b7dd2a8 100644 --- a/src/test/ui/json-bom-plus-crlf.rs +++ b/src/test/ui/json-bom-plus-crlf.rs @@ -1,6 +1,5 @@ // (This line has BOM so it's ignored by compiletest for directives) // -// build-fail // compile-flags: --json=diagnostic-short --error-format=json // ignore-tidy-cr diff --git a/src/test/ui/json-bom-plus-crlf.stderr b/src/test/ui/json-bom-plus-crlf.stderr index a6217f8687..1dd898db3a 100644 --- a/src/test/ui/json-bom-plus-crlf.stderr +++ b/src/test/ui/json-bom-plus-crlf.stderr @@ -15,7 +15,7 @@ let x: i32 = \"I am not a number!\"; // | // type `i32` assigned to variable `x` ``` -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":621,"byte_end":622,"line_start":17,"line_end":17,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":22,"highlight_end":23}],"label":"expected struct `std::string::String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":612,"byte_end":618,"line_start":17,"line_end":17,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":621,"byte_end":622,"line_start":17,"line_end":17,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":22,"highlight_end":23}],"label":null,"suggested_replacement":"1.to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:17:22: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":606,"byte_end":607,"line_start":16,"line_end":16,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":22,"highlight_end":23}],"label":"expected struct `std::string::String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":597,"byte_end":603,"line_start":16,"line_end":16,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":606,"byte_end":607,"line_start":16,"line_end":16,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1; // Error in the middle of line.","highlight_start":22,"highlight_end":23}],"label":null,"suggested_replacement":"1.to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:16:22: error[E0308]: mismatched types "} {"message":"mismatched types","code":{"code":"E0308","explanation":"This error occurs when the compiler was unable to infer the concrete type of a variable. It can occur for several cases, the most common of which is a @@ -34,7 +34,7 @@ let x: i32 = \"I am not a number!\"; // | // type `i32` assigned to variable `x` ``` -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":681,"byte_end":682,"line_start":19,"line_end":19,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":22,"highlight_end":23}],"label":"expected struct `std::string::String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":672,"byte_end":678,"line_start":19,"line_end":19,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":681,"byte_end":682,"line_start":19,"line_end":19,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":22,"highlight_end":23}],"label":null,"suggested_replacement":"1.to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:19:22: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":666,"byte_end":667,"line_start":18,"line_end":18,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":22,"highlight_end":23}],"label":"expected struct `std::string::String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":657,"byte_end":663,"line_start":18,"line_end":18,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = 1","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":666,"byte_end":667,"line_start":18,"line_end":18,"column_start":22,"column_end":23,"is_primary":true,"text":[{"text":" let s : String = 1","highlight_start":22,"highlight_end":23}],"label":null,"suggested_replacement":"1.to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:18:22: error[E0308]: mismatched types "} {"message":"mismatched types","code":{"code":"E0308","explanation":"This error occurs when the compiler was unable to infer the concrete type of a variable. It can occur for several cases, the most common of which is a @@ -53,7 +53,7 @@ let x: i32 = \"I am not a number!\"; // | // type `i32` assigned to variable `x` ``` -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":745,"byte_end":746,"line_start":23,"line_end":23,"column_start":1,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":1,"highlight_end":2}],"label":"expected struct `std::string::String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":735,"byte_end":741,"line_start":22,"line_end":22,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String =","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":745,"byte_end":746,"line_start":23,"line_end":23,"column_start":1,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":1,"highlight_end":2}],"label":null,"suggested_replacement":"1.to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:23:1: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":730,"byte_end":731,"line_start":22,"line_end":22,"column_start":1,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":1,"highlight_end":2}],"label":"expected struct `std::string::String`, found integer","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":720,"byte_end":726,"line_start":21,"line_end":21,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String =","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"try using a conversion method","code":null,"level":"help","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":730,"byte_end":731,"line_start":22,"line_end":22,"column_start":1,"column_end":2,"is_primary":true,"text":[{"text":"1; // Error after the newline.","highlight_start":1,"highlight_end":2}],"label":null,"suggested_replacement":"1.to_string()","suggestion_applicability":"MaybeIncorrect","expansion":null}],"children":[],"rendered":null}],"rendered":"$DIR/json-bom-plus-crlf.rs:22:1: error[E0308]: mismatched types "} {"message":"mismatched types","code":{"code":"E0308","explanation":"This error occurs when the compiler was unable to infer the concrete type of a variable. It can occur for several cases, the most common of which is a @@ -72,7 +72,7 @@ let x: i32 = \"I am not a number!\"; // | // type `i32` assigned to variable `x` ``` -"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":801,"byte_end":809,"line_start":25,"line_end":26,"column_start":22,"column_end":6,"is_primary":true,"text":[{"text":" let s : String = (","highlight_start":22,"highlight_end":23},{"text":" ); // Error spanning the newline.","highlight_start":1,"highlight_end":6}],"label":"expected struct `std::string::String`, found `()`","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":792,"byte_end":798,"line_start":25,"line_end":25,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = (","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"$DIR/json-bom-plus-crlf.rs:25:22: error[E0308]: mismatched types +"},"level":"error","spans":[{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":786,"byte_end":794,"line_start":24,"line_end":25,"column_start":22,"column_end":6,"is_primary":true,"text":[{"text":" let s : String = (","highlight_start":22,"highlight_end":23},{"text":" ); // Error spanning the newline.","highlight_start":1,"highlight_end":6}],"label":"expected struct `std::string::String`, found `()`","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"$DIR/json-bom-plus-crlf.rs","byte_start":777,"byte_end":783,"line_start":24,"line_end":24,"column_start":13,"column_end":19,"is_primary":false,"text":[{"text":" let s : String = (","highlight_start":13,"highlight_end":19}],"label":"expected due to this","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"$DIR/json-bom-plus-crlf.rs:24:22: error[E0308]: mismatched types "} {"message":"aborting due to 4 previous errors","code":null,"level":"error","spans":[],"children":[],"rendered":"error: aborting due to 4 previous errors "} diff --git a/src/test/ui/json-invalid.rs b/src/test/ui/json-invalid.rs index a8c0c819a0..54d0dd1849 100644 --- a/src/test/ui/json-invalid.rs +++ b/src/test/ui/json-invalid.rs @@ -1,4 +1,3 @@ -// build-fail // compile-flags: --json=foo --error-format=json fn main() {} diff --git a/src/test/ui/json-short.rs b/src/test/ui/json-short.rs index 01a311b939..7414a55869 100644 --- a/src/test/ui/json-short.rs +++ b/src/test/ui/json-short.rs @@ -1,2 +1 @@ -// build-fail // compile-flags: --json=diagnostic-short --error-format=json diff --git a/src/test/ui/json-short.stderr b/src/test/ui/json-short.stderr index 83fc83778a..226343b1b8 100644 --- a/src/test/ui/json-short.stderr +++ b/src/test/ui/json-short.stderr @@ -10,7 +10,7 @@ fn main() { If you don't know the basics of Rust, you can go look to the Rust Book to get started: https://doc.rust-lang.org/book/ -"},"level":"error","spans":[{"file_name":"$DIR/json-short.rs","byte_start":76,"byte_end":76,"line_start":2,"line_end":2,"column_start":63,"column_end":63,"is_primary":true,"text":[{"text":"// compile-flags: --json=diagnostic-short --error-format=json","highlight_start":63,"highlight_end":63}],"label":"consider adding a `main` function to `$DIR/json-short.rs`","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"$DIR/json-short.rs:2:63: error[E0601]: `main` function not found in crate `json_short` +"},"level":"error","spans":[{"file_name":"$DIR/json-short.rs","byte_start":62,"byte_end":62,"line_start":1,"line_end":1,"column_start":63,"column_end":63,"is_primary":true,"text":[{"text":"// compile-flags: --json=diagnostic-short --error-format=json","highlight_start":63,"highlight_end":63}],"label":"consider adding a `main` function to `$DIR/json-short.rs`","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"$DIR/json-short.rs:1:63: error[E0601]: `main` function not found in crate `json_short` "} {"message":"aborting due to previous error","code":null,"level":"error","spans":[],"children":[],"rendered":"error: aborting due to previous error "} diff --git a/src/test/ui/keyword/keyword-super-as-identifier.rs b/src/test/ui/keyword/keyword-super-as-identifier.rs index d728b4fe3e..02c1b27b08 100644 --- a/src/test/ui/keyword/keyword-super-as-identifier.rs +++ b/src/test/ui/keyword/keyword-super-as-identifier.rs @@ -1,3 +1,3 @@ fn main() { - let super = 22; //~ ERROR failed to resolve: there are too many initial `super`s + let super = 22; //~ ERROR failed to resolve: there are too many leading `super` keywords } diff --git a/src/test/ui/keyword/keyword-super-as-identifier.stderr b/src/test/ui/keyword/keyword-super-as-identifier.stderr index bbeaed9428..1f64f3b73d 100644 --- a/src/test/ui/keyword/keyword-super-as-identifier.stderr +++ b/src/test/ui/keyword/keyword-super-as-identifier.stderr @@ -1,8 +1,8 @@ -error[E0433]: failed to resolve: there are too many initial `super`s. +error[E0433]: failed to resolve: there are too many leading `super` keywords --> $DIR/keyword-super-as-identifier.rs:2:9 | LL | let super = 22; - | ^^^^^ there are too many initial `super`s. + | ^^^^^ there are too many leading `super` keywords error: aborting due to previous error diff --git a/src/test/ui/keyword/keyword-super.rs b/src/test/ui/keyword/keyword-super.rs index a43e1e39b6..c121a6c105 100644 --- a/src/test/ui/keyword/keyword-super.rs +++ b/src/test/ui/keyword/keyword-super.rs @@ -1,3 +1,3 @@ fn main() { - let super: isize; //~ ERROR failed to resolve: there are too many initial `super`s + let super: isize; //~ ERROR failed to resolve: there are too many leading `super` keywords } diff --git a/src/test/ui/keyword/keyword-super.stderr b/src/test/ui/keyword/keyword-super.stderr index 63394c7852..0e0d67cb97 100644 --- a/src/test/ui/keyword/keyword-super.stderr +++ b/src/test/ui/keyword/keyword-super.stderr @@ -1,8 +1,8 @@ -error[E0433]: failed to resolve: there are too many initial `super`s. +error[E0433]: failed to resolve: there are too many leading `super` keywords --> $DIR/keyword-super.rs:2:9 | LL | let super: isize; - | ^^^^^ there are too many initial `super`s. + | ^^^^^ there are too many leading `super` keywords error: aborting due to previous error diff --git a/src/test/ui/kindck/kindck-impl-type-params.stderr b/src/test/ui/kindck/kindck-impl-type-params.stderr index 777a553c2a..2075fdd311 100644 --- a/src/test/ui/kindck/kindck-impl-type-params.stderr +++ b/src/test/ui/kindck/kindck-impl-type-params.stderr @@ -76,4 +76,5 @@ LL | let a: Box<dyn Gettable<Foo>> = t; error: aborting due to 7 previous errors -For more information about this error, try `rustc --explain E0277`. +Some errors have detailed explanations: E0277, E0477. +For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/kindck/kindck-nonsendable-1.stderr b/src/test/ui/kindck/kindck-nonsendable-1.stderr index 40b67f8fe8..39640e3739 100644 --- a/src/test/ui/kindck/kindck-nonsendable-1.stderr +++ b/src/test/ui/kindck/kindck-nonsendable-1.stderr @@ -5,7 +5,9 @@ LL | fn bar<F:FnOnce() + Send>(_: F) { } | --- ---- required by this bound in `bar` ... LL | bar(move|| foo(x)); - | ^^^ `std::rc::Rc<usize>` cannot be sent between threads safely + | ^^^ ------------- within this `[closure@$DIR/kindck-nonsendable-1.rs:9:9: 9:22 x:std::rc::Rc<usize>]` + | | + | `std::rc::Rc<usize>` cannot be sent between threads safely | = help: within `[closure@$DIR/kindck-nonsendable-1.rs:9:9: 9:22 x:std::rc::Rc<usize>]`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<usize>` = note: required because it appears within the type `[closure@$DIR/kindck-nonsendable-1.rs:9:9: 9:22 x:std::rc::Rc<usize>]` diff --git a/src/test/ui/kindck/kindck-send-object1.stderr b/src/test/ui/kindck/kindck-send-object1.stderr index 436b92637a..b2e89087e3 100644 --- a/src/test/ui/kindck/kindck-send-object1.stderr +++ b/src/test/ui/kindck/kindck-send-object1.stderr @@ -33,4 +33,5 @@ LL | assert_send::<Box<dyn Dummy + 'a>>(); error: aborting due to 3 previous errors -For more information about this error, try `rustc --explain E0277`. +Some errors have detailed explanations: E0277, E0477. +For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/label/label_break_value_illegal_uses.stderr b/src/test/ui/label/label_break_value_illegal_uses.stderr index 0036f0f1db..46b53c65b4 100644 --- a/src/test/ui/label/label_break_value_illegal_uses.stderr +++ b/src/test/ui/label/label_break_value_illegal_uses.stderr @@ -12,7 +12,7 @@ LL | if true 'b: {} | | | | | expected `{` | | help: try placing this code inside a block: `{ 'b: {} }` - | this `if` statement has a condition, but no block + | this `if` expression has a condition, but no block error: expected `{`, found `'b` --> $DIR/label_break_value_illegal_uses.rs:14:21 diff --git a/src/test/ui/lexer-crlf-line-endings-string-literal-doc-comment.rs b/src/test/ui/lexer-crlf-line-endings-string-literal-doc-comment.rs index ada253aacf..802be7f5af 100644 --- a/src/test/ui/lexer-crlf-line-endings-string-literal-doc-comment.rs +++ b/src/test/ui/lexer-crlf-line-endings-string-literal-doc-comment.rs @@ -1,11 +1,8 @@ // run-pass -// ignore-tidy-cr ignore-license +// ignore-tidy-cr // ignore-tidy-cr (repeated again because of tidy bug) // license is ignored because tidy can't handle the CRLF here properly. -// http://rust-lang.org/COPYRIGHT. -// - // N.B., this file needs CRLF line endings. The .gitattributes file in // this directory should enforce it. diff --git a/src/test/ui/lexical-scopes.stderr b/src/test/ui/lexical-scopes.stderr index a7843a9301..6bb0877e9b 100644 --- a/src/test/ui/lexical-scopes.stderr +++ b/src/test/ui/lexical-scopes.stderr @@ -9,7 +9,7 @@ help: possible better candidate is found in another module, you can import it in LL | use T; | -error[E0599]: no function or associated item named `f` found for type `Foo` in the current scope +error[E0599]: no function or associated item named `f` found for type parameter `Foo` in the current scope --> $DIR/lexical-scopes.rs:10:10 | LL | Foo::f(); diff --git a/src/test/ui/lifetimes/lifetime-elision-return-type-requires-explicit-lifetime.stderr b/src/test/ui/lifetimes/lifetime-elision-return-type-requires-explicit-lifetime.stderr index 3f7c3934a0..1d5eeac23f 100644 --- a/src/test/ui/lifetimes/lifetime-elision-return-type-requires-explicit-lifetime.stderr +++ b/src/test/ui/lifetimes/lifetime-elision-return-type-requires-explicit-lifetime.stderr @@ -10,17 +10,25 @@ error[E0106]: missing lifetime specifier --> $DIR/lifetime-elision-return-type-requires-explicit-lifetime.rs:7:33 | LL | fn g(_x: &isize, _y: &isize) -> &isize { - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `_x` or `_y` +help: consider introducing a named lifetime parameter + | +LL | fn g<'lifetime>(_x: &isize, _y: &isize) -> &'lifetime isize { + | ^^^^^^^^^^^ ^^^^^^^^^^ error[E0106]: missing lifetime specifier --> $DIR/lifetime-elision-return-type-requires-explicit-lifetime.rs:17:19 | LL | fn h(_x: &Foo) -> &isize { - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say which one of `_x`'s 2 lifetimes it is borrowed from +help: consider introducing a named lifetime parameter + | +LL | fn h<'lifetime>(_x: &Foo) -> &'lifetime isize { + | ^^^^^^^^^^^ ^^^^^^^^^^ error[E0106]: missing lifetime specifier --> $DIR/lifetime-elision-return-type-requires-explicit-lifetime.rs:21:20 diff --git a/src/test/ui/lifetimes/lifetime-elision-return-type-trait.stderr b/src/test/ui/lifetimes/lifetime-elision-return-type-trait.stderr index 228582d000..e43fb6d0ed 100644 --- a/src/test/ui/lifetimes/lifetime-elision-return-type-trait.stderr +++ b/src/test/ui/lifetimes/lifetime-elision-return-type-trait.stderr @@ -3,6 +3,9 @@ error[E0277]: the trait bound `std::result::Result<(), _>: Future` is not satisf | LL | fn foo() -> impl Future<Item=(), Error=Box<dyn Error>> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Future` is not implemented for `std::result::Result<(), _>` +LL | +LL | Ok(()) + | ------ this returned value is of type `std::result::Result<(), _>` | = note: the return type of a function must have a statically known size diff --git a/src/test/ui/lifetimes/lifetime-errors/ex1b-return-no-names-if-else.stderr b/src/test/ui/lifetimes/lifetime-errors/ex1b-return-no-names-if-else.stderr index a4e0d71a3f..2990ab8682 100644 --- a/src/test/ui/lifetimes/lifetime-errors/ex1b-return-no-names-if-else.stderr +++ b/src/test/ui/lifetimes/lifetime-errors/ex1b-return-no-names-if-else.stderr @@ -2,9 +2,13 @@ error[E0106]: missing lifetime specifier --> $DIR/ex1b-return-no-names-if-else.rs:1:29 | LL | fn foo(x: &i32, y: &i32) -> &i32 { - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or `y` +help: consider introducing a named lifetime parameter + | +LL | fn foo<'lifetime>(x: &i32, y: &i32) -> &'lifetime i32 { + | ^^^^^^^^^^^ ^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.rs b/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.rs index 85a9a336b0..7b2f5365ac 100644 --- a/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.rs +++ b/src/test/ui/linkage-attr/linkage-detect-extern-generated-name-collision.rs @@ -2,6 +2,7 @@ // collision on the symbol generated for the external linkage item in // an extern crate. +// build-fail // aux-build:def_colliding_external.rs extern crate def_colliding_external as dep1; diff --git a/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.rs b/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.rs index dc15798e16..1e5069612f 100644 --- a/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.rs +++ b/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(linkage)] mod dep1 { diff --git a/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.stderr b/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.stderr index 117c76f7f2..d008acc6e7 100644 --- a/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.stderr +++ b/src/test/ui/linkage-attr/linkage-detect-local-generated-name-collision.stderr @@ -1,5 +1,5 @@ error: symbol `collision` is already defined - --> $DIR/linkage-detect-local-generated-name-collision.rs:7:9 + --> $DIR/linkage-detect-local-generated-name-collision.rs:9:9 | LL | pub static collision: *const i32; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/linkage-attr/linkage-requires-raw-ptr.rs b/src/test/ui/linkage-attr/linkage-requires-raw-ptr.rs index 014c715be0..93afc537f7 100644 --- a/src/test/ui/linkage-attr/linkage-requires-raw-ptr.rs +++ b/src/test/ui/linkage-attr/linkage-requires-raw-ptr.rs @@ -1,6 +1,7 @@ // rust-lang/rust#59548: We used to ICE when trying to use a static // with a type that violated its own `#[linkage]`. +// build-fail // aux-build:def_illtyped_external.rs extern crate def_illtyped_external as dep; diff --git a/src/test/ui/linkage-attr/linkage2.rs b/src/test/ui/linkage-attr/linkage2.rs index c8af1a6997..41e7819e8c 100644 --- a/src/test/ui/linkage-attr/linkage2.rs +++ b/src/test/ui/linkage-attr/linkage2.rs @@ -1,4 +1,6 @@ // FIXME https://github.com/rust-lang/rust/issues/59774 + +// build-fail // normalize-stderr-test "thread.*panicked.*Metadata module not compiled.*\n" -> "" // normalize-stderr-test "note:.*RUST_BACKTRACE=1.*\n" -> "" // ignore-sgx no weak linkages permitted diff --git a/src/test/ui/linkage-attr/linkage2.stderr b/src/test/ui/linkage-attr/linkage2.stderr index 2654ffd67b..72ee3fb62e 100644 --- a/src/test/ui/linkage-attr/linkage2.stderr +++ b/src/test/ui/linkage-attr/linkage2.stderr @@ -1,5 +1,5 @@ error: must have type `*const T` or `*mut T` due to `#[linkage]` attribute - --> $DIR/linkage2.rs:9:32 + --> $DIR/linkage2.rs:11:32 | LL | #[linkage = "extern_weak"] static foo: i32; | ^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/linkage-attr/linkage3.rs b/src/test/ui/linkage-attr/linkage3.rs index 1462079acf..bd4e5ba2d4 100644 --- a/src/test/ui/linkage-attr/linkage3.rs +++ b/src/test/ui/linkage-attr/linkage3.rs @@ -1,4 +1,6 @@ // FIXME https://github.com/rust-lang/rust/issues/59774 + +// build-fail // normalize-stderr-test "thread.*panicked.*Metadata module not compiled.*\n" -> "" // normalize-stderr-test "note:.*RUST_BACKTRACE=1.*\n" -> "" diff --git a/src/test/ui/linkage-attr/linkage3.stderr b/src/test/ui/linkage-attr/linkage3.stderr index b74fdc9142..5a0833f2f7 100644 --- a/src/test/ui/linkage-attr/linkage3.stderr +++ b/src/test/ui/linkage-attr/linkage3.stderr @@ -1,5 +1,5 @@ error: invalid linkage specified - --> $DIR/linkage3.rs:8:24 + --> $DIR/linkage3.rs:10:24 | LL | #[linkage = "foo"] static foo: *const i32; | ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/lint/auxiliary/inherited_stability.rs b/src/test/ui/lint/auxiliary/inherited_stability.rs index 57af0d3ec9..1e7eb26fde 100644 --- a/src/test/ui/lint/auxiliary/inherited_stability.rs +++ b/src/test/ui/lint/auxiliary/inherited_stability.rs @@ -1,6 +1,6 @@ #![crate_name="inherited_stability"] #![crate_type = "lib"] -#![unstable(feature = "unstable_test_feature", issue = "0")] +#![unstable(feature = "unstable_test_feature", issue = "none")] #![feature(staged_api)] pub fn unstable() {} @@ -10,14 +10,14 @@ pub fn stable() {} #[stable(feature = "rust1", since = "1.0.0")] pub mod stable_mod { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} #[stable(feature = "rust1", since = "1.0.0")] pub fn stable() {} } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub mod unstable_mod { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] @@ -28,7 +28,7 @@ pub mod unstable_mod { #[stable(feature = "rust1", since = "1.0.0")] pub trait Stable { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn unstable(&self); #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/test/ui/lint/auxiliary/lint_output_format.rs b/src/test/ui/lint/auxiliary/lint_output_format.rs index 5facb55612..58cae18019 100644 --- a/src/test/ui/lint/auxiliary/lint_output_format.rs +++ b/src/test/ui/lint/auxiliary/lint_output_format.rs @@ -1,7 +1,7 @@ #![crate_name="lint_output_format"] #![crate_type = "lib"] #![feature(staged_api)] -#![unstable(feature = "unstable_test_feature", issue = "0")] +#![unstable(feature = "unstable_test_feature", issue = "none")] #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] @@ -9,12 +9,12 @@ pub fn foo() -> usize { 20 } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub fn bar() -> usize { 40 } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub fn baz() -> usize { 30 } diff --git a/src/test/ui/lint/auxiliary/lint_stability.rs b/src/test/ui/lint/auxiliary/lint_stability.rs index 3188d706ab..de4058887c 100644 --- a/src/test/ui/lint/auxiliary/lint_stability.rs +++ b/src/test/ui/lint/auxiliary/lint_stability.rs @@ -15,16 +15,16 @@ pub fn deprecated_text() {} #[rustc_deprecated(since = "99.99.99", reason = "text")] pub fn deprecated_future() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_unstable() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_unstable_text() {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} -#[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] +#[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -43,16 +43,16 @@ impl MethodTester { #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_unstable_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -70,16 +70,16 @@ pub trait Trait { #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_unstable_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -90,7 +90,7 @@ pub trait Trait { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub trait TraitWithAssociatedTypes { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] type TypeUnstable = u8; #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] @@ -100,7 +100,7 @@ pub trait TraitWithAssociatedTypes { #[stable(feature = "stable_test_feature", since = "1.0.0")] impl Trait for MethodTester {} -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub trait UnstableTrait { fn dummy(&self) { } } #[stable(feature = "stable_test_feature", since = "1.0.0")] @@ -114,12 +114,12 @@ pub trait DeprecatedTrait { pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } @@ -127,7 +127,7 @@ pub struct UnstableStruct { pub struct StableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] pub i: isize } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub enum UnstableEnum {} #[stable(feature = "rust1", since = "1.0.0")] pub enum StableEnum {} @@ -135,10 +135,10 @@ pub enum StableEnum {} #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableUnitStruct; -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; @@ -148,10 +148,10 @@ pub enum Enum { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedUnstableVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] @@ -161,10 +161,10 @@ pub enum Enum { #[stable(feature = "stable_test_feature", since = "1.0.0")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub isize); diff --git a/src/test/ui/lint/auxiliary/lint_stability_fields.rs b/src/test/ui/lint/auxiliary/lint_stability_fields.rs index 2787da7cb7..0efe7686ef 100644 --- a/src/test/ui/lint/auxiliary/lint_stability_fields.rs +++ b/src/test/ui/lint/auxiliary/lint_stability_fields.rs @@ -5,47 +5,47 @@ pub struct Stable { #[stable(feature = "rust1", since = "1.0.0")] pub inherit: u8, // it's a lie (stable doesn't inherit) - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub override2: u8, } #[stable(feature = "rust1", since = "1.0.0")] pub struct Stable2(#[stable(feature = "rust1", since = "1.0.0")] pub u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] pub u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub u8, + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub u8); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct Unstable { pub inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] pub override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub override2: u8, } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub struct Unstable2(pub u8, #[stable(feature = "rust1", since = "1.0.0")] pub u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub u8); -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct Deprecated { pub inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] pub override1: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub override2: u8, } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct Deprecated2(pub u8, #[stable(feature = "rust1", since = "1.0.0")] pub u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] pub u8); + #[unstable(feature = "unstable_test_feature", issue = "none")] pub u8); diff --git a/src/test/ui/lint/auxiliary/stability-cfg2.rs b/src/test/ui/lint/auxiliary/stability-cfg2.rs index 8a2899584b..c995038e5a 100644 --- a/src/test/ui/lint/auxiliary/stability-cfg2.rs +++ b/src/test/ui/lint/auxiliary/stability-cfg2.rs @@ -1,5 +1,5 @@ // compile-flags:--cfg foo -#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "0"))] +#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "none"))] #![cfg_attr(not(foo), stable(feature = "test_feature", since = "1.0.0"))] #![feature(staged_api)] diff --git a/src/test/ui/lint/auxiliary/stability_cfg2.rs b/src/test/ui/lint/auxiliary/stability_cfg2.rs index 8a2899584b..c995038e5a 100644 --- a/src/test/ui/lint/auxiliary/stability_cfg2.rs +++ b/src/test/ui/lint/auxiliary/stability_cfg2.rs @@ -1,5 +1,5 @@ // compile-flags:--cfg foo -#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "0"))] +#![cfg_attr(foo, unstable(feature = "unstable_test_feature", issue = "none"))] #![cfg_attr(not(foo), stable(feature = "test_feature", since = "1.0.0"))] #![feature(staged_api)] diff --git a/src/test/ui/lint/command-line-lint-group-allow.rs b/src/test/ui/lint/command-line-lint-group-allow.rs index f26e157bc7..21c0df0288 100644 --- a/src/test/ui/lint/command-line-lint-group-allow.rs +++ b/src/test/ui/lint/command-line-lint-group-allow.rs @@ -1,5 +1,5 @@ // compile-flags: -A bad-style -// build-pass (FIXME(62277): could be check-pass?) +// check-pass fn main() { let _InappropriateCamelCasing = true; diff --git a/src/test/ui/lint/dead-code/tuple-struct-field.rs b/src/test/ui/lint/dead-code/tuple-struct-field.rs index 92a6795098..c8fd32c64d 100644 --- a/src/test/ui/lint/dead-code/tuple-struct-field.rs +++ b/src/test/ui/lint/dead-code/tuple-struct-field.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![deny(dead_code)] diff --git a/src/test/ui/lint/inclusive-range-pattern-syntax.fixed b/src/test/ui/lint/inclusive-range-pattern-syntax.fixed index 9fce66a0a8..d6e5033a0c 100644 --- a/src/test/ui/lint/inclusive-range-pattern-syntax.fixed +++ b/src/test/ui/lint/inclusive-range-pattern-syntax.fixed @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // run-rustfix #![warn(ellipsis_inclusive_range_patterns)] diff --git a/src/test/ui/lint/inclusive-range-pattern-syntax.rs b/src/test/ui/lint/inclusive-range-pattern-syntax.rs index f886e778b5..773eea14fd 100644 --- a/src/test/ui/lint/inclusive-range-pattern-syntax.rs +++ b/src/test/ui/lint/inclusive-range-pattern-syntax.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // run-rustfix #![warn(ellipsis_inclusive_range_patterns)] diff --git a/src/test/ui/lint/issue-66362-no-snake-case-warning-for-field-puns.rs b/src/test/ui/lint/issue-66362-no-snake-case-warning-for-field-puns.rs new file mode 100644 index 0000000000..c2b81959f2 --- /dev/null +++ b/src/test/ui/lint/issue-66362-no-snake-case-warning-for-field-puns.rs @@ -0,0 +1,29 @@ +#![deny(non_snake_case)] +#![allow(unused_variables)] +#![allow(dead_code)] + +enum Foo { + Bad { + lowerCamelCaseName: bool, + //~^ ERROR structure field `lowerCamelCaseName` should have a snake case name + }, + Good { + snake_case_name: bool, + }, +} + +fn main() { + let b = Foo::Bad { lowerCamelCaseName: true }; + + match b { + Foo::Bad { lowerCamelCaseName } => {} + Foo::Good { snake_case_name: lowerCamelCaseBinding } => { } + //~^ ERROR variable `lowerCamelCaseBinding` should have a snake case name + } + + if let Foo::Good { snake_case_name: anotherLowerCamelCaseBinding } = b { } + //~^ ERROR variable `anotherLowerCamelCaseBinding` should have a snake case name + + if let Foo::Bad { lowerCamelCaseName: yetAnotherLowerCamelCaseBinding } = b { } + //~^ ERROR variable `yetAnotherLowerCamelCaseBinding` should have a snake case name +} diff --git a/src/test/ui/lint/issue-66362-no-snake-case-warning-for-field-puns.stderr b/src/test/ui/lint/issue-66362-no-snake-case-warning-for-field-puns.stderr new file mode 100644 index 0000000000..68956f21e8 --- /dev/null +++ b/src/test/ui/lint/issue-66362-no-snake-case-warning-for-field-puns.stderr @@ -0,0 +1,32 @@ +error: structure field `lowerCamelCaseName` should have a snake case name + --> $DIR/issue-66362-no-snake-case-warning-for-field-puns.rs:7:9 + | +LL | lowerCamelCaseName: bool, + | ^^^^^^^^^^^^^^^^^^ help: convert the identifier to snake case: `lower_camel_case_name` + | +note: lint level defined here + --> $DIR/issue-66362-no-snake-case-warning-for-field-puns.rs:1:9 + | +LL | #![deny(non_snake_case)] + | ^^^^^^^^^^^^^^ + +error: variable `lowerCamelCaseBinding` should have a snake case name + --> $DIR/issue-66362-no-snake-case-warning-for-field-puns.rs:20:38 + | +LL | Foo::Good { snake_case_name: lowerCamelCaseBinding } => { } + | ^^^^^^^^^^^^^^^^^^^^^ help: convert the identifier to snake case: `lower_camel_case_binding` + +error: variable `anotherLowerCamelCaseBinding` should have a snake case name + --> $DIR/issue-66362-no-snake-case-warning-for-field-puns.rs:24:41 + | +LL | if let Foo::Good { snake_case_name: anotherLowerCamelCaseBinding } = b { } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert the identifier to snake case: `another_lower_camel_case_binding` + +error: variable `yetAnotherLowerCamelCaseBinding` should have a snake case name + --> $DIR/issue-66362-no-snake-case-warning-for-field-puns.rs:27:43 + | +LL | if let Foo::Bad { lowerCamelCaseName: yetAnotherLowerCamelCaseBinding } = b { } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert the identifier to snake case: `yet_another_lower_camel_case_binding` + +error: aborting due to 4 previous errors + diff --git a/src/test/ui/lint/lint-ctypes-enum.rs b/src/test/ui/lint/lint-ctypes-enum.rs index 3898e67a07..ccda005575 100644 --- a/src/test/ui/lint/lint-ctypes-enum.rs +++ b/src/test/ui/lint/lint-ctypes-enum.rs @@ -1,4 +1,4 @@ -#![feature(transparent_enums, transparent_unions)] +#![feature(transparent_unions)] #![feature(ptr_internals)] #![deny(improper_ctypes)] #![allow(dead_code)] diff --git a/src/test/ui/lint/lint-exceeding-bitshifts.rs b/src/test/ui/lint/lint-exceeding-bitshifts.rs index dd3b839342..121e5b796b 100644 --- a/src/test/ui/lint/lint-exceeding-bitshifts.rs +++ b/src/test/ui/lint/lint-exceeding-bitshifts.rs @@ -1,3 +1,4 @@ +// build-fail // compile-flags: -O #![deny(exceeding_bitshifts, const_err)] diff --git a/src/test/ui/lint/lint-exceeding-bitshifts.stderr b/src/test/ui/lint/lint-exceeding-bitshifts.stderr index 25e079b6d8..203cb74153 100644 --- a/src/test/ui/lint/lint-exceeding-bitshifts.stderr +++ b/src/test/ui/lint/lint-exceeding-bitshifts.stderr @@ -1,113 +1,113 @@ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:9:15 + --> $DIR/lint-exceeding-bitshifts.rs:10:15 | LL | let n = 1u8 << 8; | ^^^^^^^^ | note: lint level defined here - --> $DIR/lint-exceeding-bitshifts.rs:3:9 + --> $DIR/lint-exceeding-bitshifts.rs:4:9 | LL | #![deny(exceeding_bitshifts, const_err)] | ^^^^^^^^^^^^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:11:15 + --> $DIR/lint-exceeding-bitshifts.rs:12:15 | LL | let n = 1u16 << 16; | ^^^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:13:15 + --> $DIR/lint-exceeding-bitshifts.rs:14:15 | LL | let n = 1u32 << 32; | ^^^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:15:15 + --> $DIR/lint-exceeding-bitshifts.rs:16:15 | LL | let n = 1u64 << 64; | ^^^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:17:15 + --> $DIR/lint-exceeding-bitshifts.rs:18:15 | LL | let n = 1i8 << 8; | ^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:19:15 + --> $DIR/lint-exceeding-bitshifts.rs:20:15 | LL | let n = 1i16 << 16; | ^^^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:21:15 + --> $DIR/lint-exceeding-bitshifts.rs:22:15 | LL | let n = 1i32 << 32; | ^^^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:23:15 + --> $DIR/lint-exceeding-bitshifts.rs:24:15 | LL | let n = 1i64 << 64; | ^^^^^^^^^^ error: attempt to shift right with overflow - --> $DIR/lint-exceeding-bitshifts.rs:26:15 + --> $DIR/lint-exceeding-bitshifts.rs:27:15 | LL | let n = 1u8 >> 8; | ^^^^^^^^ error: attempt to shift right with overflow - --> $DIR/lint-exceeding-bitshifts.rs:28:15 + --> $DIR/lint-exceeding-bitshifts.rs:29:15 | LL | let n = 1u16 >> 16; | ^^^^^^^^^^ error: attempt to shift right with overflow - --> $DIR/lint-exceeding-bitshifts.rs:30:15 + --> $DIR/lint-exceeding-bitshifts.rs:31:15 | LL | let n = 1u32 >> 32; | ^^^^^^^^^^ error: attempt to shift right with overflow - --> $DIR/lint-exceeding-bitshifts.rs:32:15 + --> $DIR/lint-exceeding-bitshifts.rs:33:15 | LL | let n = 1u64 >> 64; | ^^^^^^^^^^ error: attempt to shift right with overflow - --> $DIR/lint-exceeding-bitshifts.rs:34:15 + --> $DIR/lint-exceeding-bitshifts.rs:35:15 | LL | let n = 1i8 >> 8; | ^^^^^^^^ error: attempt to shift right with overflow - --> $DIR/lint-exceeding-bitshifts.rs:36:15 + --> $DIR/lint-exceeding-bitshifts.rs:37:15 | LL | let n = 1i16 >> 16; | ^^^^^^^^^^ error: attempt to shift right with overflow - --> $DIR/lint-exceeding-bitshifts.rs:38:15 + --> $DIR/lint-exceeding-bitshifts.rs:39:15 | LL | let n = 1i32 >> 32; | ^^^^^^^^^^ error: attempt to shift right with overflow - --> $DIR/lint-exceeding-bitshifts.rs:40:15 + --> $DIR/lint-exceeding-bitshifts.rs:41:15 | LL | let n = 1i64 >> 64; | ^^^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:44:15 + --> $DIR/lint-exceeding-bitshifts.rs:45:15 | LL | let n = n << 8; | ^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts.rs:46:15 + --> $DIR/lint-exceeding-bitshifts.rs:47:15 | LL | let n = 1u8 << -8; | ^^^^^^^^^ diff --git a/src/test/ui/lint/lint-exceeding-bitshifts2.rs b/src/test/ui/lint/lint-exceeding-bitshifts2.rs index 2c213daddd..2a7cbc10f7 100644 --- a/src/test/ui/lint/lint-exceeding-bitshifts2.rs +++ b/src/test/ui/lint/lint-exceeding-bitshifts2.rs @@ -1,3 +1,4 @@ +// build-fail // compile-flags: -O #![deny(exceeding_bitshifts, const_err)] diff --git a/src/test/ui/lint/lint-exceeding-bitshifts2.stderr b/src/test/ui/lint/lint-exceeding-bitshifts2.stderr index d9c76d233d..49ac54ab83 100644 --- a/src/test/ui/lint/lint-exceeding-bitshifts2.stderr +++ b/src/test/ui/lint/lint-exceeding-bitshifts2.stderr @@ -1,29 +1,29 @@ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts2.rs:9:15 + --> $DIR/lint-exceeding-bitshifts2.rs:10:15 | LL | let n = 1u8 << (4+4); | ^^^^^^^^^^^^ | note: lint level defined here - --> $DIR/lint-exceeding-bitshifts2.rs:3:9 + --> $DIR/lint-exceeding-bitshifts2.rs:4:9 | LL | #![deny(exceeding_bitshifts, const_err)] | ^^^^^^^^^^^^^^^^^^^ error: attempt to shift right with overflow - --> $DIR/lint-exceeding-bitshifts2.rs:11:15 + --> $DIR/lint-exceeding-bitshifts2.rs:12:15 | LL | let n = 1i64 >> [64][0]; | ^^^^^^^^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts2.rs:17:15 + --> $DIR/lint-exceeding-bitshifts2.rs:18:15 | LL | let n = 1_isize << BITS; | ^^^^^^^^^^^^^^^ error: attempt to shift left with overflow - --> $DIR/lint-exceeding-bitshifts2.rs:18:15 + --> $DIR/lint-exceeding-bitshifts2.rs:19:15 | LL | let n = 1_usize << BITS; | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/lint/lint-forbid-attr.rs b/src/test/ui/lint/lint-forbid-attr.rs index 082b5430bf..13b28e8830 100644 --- a/src/test/ui/lint/lint-forbid-attr.rs +++ b/src/test/ui/lint/lint-forbid-attr.rs @@ -2,5 +2,7 @@ #[allow(deprecated)] //~^ ERROR allow(deprecated) overruled by outer forbid(deprecated) +//~| ERROR allow(deprecated) overruled by outer forbid(deprecated) +//~| ERROR allow(deprecated) overruled by outer forbid(deprecated) fn main() { } diff --git a/src/test/ui/lint/lint-forbid-attr.stderr b/src/test/ui/lint/lint-forbid-attr.stderr index 6e1e2b3e14..bf138c317e 100644 --- a/src/test/ui/lint/lint-forbid-attr.stderr +++ b/src/test/ui/lint/lint-forbid-attr.stderr @@ -7,6 +7,24 @@ LL | LL | #[allow(deprecated)] | ^^^^^^^^^^ overruled by previous forbid -error: aborting due to previous error +error[E0453]: allow(deprecated) overruled by outer forbid(deprecated) + --> $DIR/lint-forbid-attr.rs:3:9 + | +LL | #![forbid(deprecated)] + | ---------- `forbid` level set here +LL | +LL | #[allow(deprecated)] + | ^^^^^^^^^^ overruled by previous forbid + +error[E0453]: allow(deprecated) overruled by outer forbid(deprecated) + --> $DIR/lint-forbid-attr.rs:3:9 + | +LL | #![forbid(deprecated)] + | ---------- `forbid` level set here +LL | +LL | #[allow(deprecated)] + | ^^^^^^^^^^ overruled by previous forbid + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0453`. diff --git a/src/test/ui/lint/lint-forbid-cmdline.rs b/src/test/ui/lint/lint-forbid-cmdline.rs index 150685c318..821470c868 100644 --- a/src/test/ui/lint/lint-forbid-cmdline.rs +++ b/src/test/ui/lint/lint-forbid-cmdline.rs @@ -1,5 +1,7 @@ // compile-flags: -F deprecated #[allow(deprecated)] //~ ERROR allow(deprecated) overruled by outer forbid(deprecated) + //~| ERROR allow(deprecated) overruled by outer forbid(deprecated) + //~| ERROR allow(deprecated) overruled by outer forbid(deprecated) fn main() { } diff --git a/src/test/ui/lint/lint-forbid-cmdline.stderr b/src/test/ui/lint/lint-forbid-cmdline.stderr index bece4775ab..89a4445d80 100644 --- a/src/test/ui/lint/lint-forbid-cmdline.stderr +++ b/src/test/ui/lint/lint-forbid-cmdline.stderr @@ -6,6 +6,22 @@ LL | #[allow(deprecated)] | = note: `forbid` lint level was set on command line -error: aborting due to previous error +error[E0453]: allow(deprecated) overruled by outer forbid(deprecated) + --> $DIR/lint-forbid-cmdline.rs:3:9 + | +LL | #[allow(deprecated)] + | ^^^^^^^^^^ overruled by previous forbid + | + = note: `forbid` lint level was set on command line + +error[E0453]: allow(deprecated) overruled by outer forbid(deprecated) + --> $DIR/lint-forbid-cmdline.rs:3:9 + | +LL | #[allow(deprecated)] + | ^^^^^^^^^^ overruled by previous forbid + | + = note: `forbid` lint level was set on command line + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0453`. diff --git a/src/test/ui/lint/lint-lowercase-static-const-pattern-rename.rs b/src/test/ui/lint/lint-lowercase-static-const-pattern-rename.rs index 95da4efa59..d085db43aa 100644 --- a/src/test/ui/lint/lint-lowercase-static-const-pattern-rename.rs +++ b/src/test/ui/lint/lint-lowercase-static-const-pattern-rename.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // Issue #7526: lowercase static constants in patterns look like bindings // This is similar to lint-lowercase-static-const-pattern.rs, except it diff --git a/src/test/ui/lint/lint-malformed.rs b/src/test/ui/lint/lint-malformed.rs index 0d327677d5..cf5570753d 100644 --- a/src/test/ui/lint/lint-malformed.rs +++ b/src/test/ui/lint/lint-malformed.rs @@ -1,4 +1,8 @@ #![deny = "foo"] //~ ERROR malformed `deny` attribute input #![allow(bar = "baz")] //~ ERROR malformed lint attribute - + //~| ERROR malformed lint attribute + //~| ERROR malformed lint attribute + //~| ERROR malformed lint attribute + //~| ERROR malformed lint attribute + //~| ERROR malformed lint attribute fn main() { } diff --git a/src/test/ui/lint/lint-malformed.stderr b/src/test/ui/lint/lint-malformed.stderr index f4876290dd..6dc8d49844 100644 --- a/src/test/ui/lint/lint-malformed.stderr +++ b/src/test/ui/lint/lint-malformed.stderr @@ -4,12 +4,42 @@ error[E0452]: malformed lint attribute input LL | #![allow(bar = "baz")] | ^^^^^^^^^^^ bad attribute argument +error[E0452]: malformed lint attribute input + --> $DIR/lint-malformed.rs:2:10 + | +LL | #![allow(bar = "baz")] + | ^^^^^^^^^^^ bad attribute argument + error: malformed `deny` attribute input --> $DIR/lint-malformed.rs:1:1 | LL | #![deny = "foo"] | ^^^^^^^^^^^^^^^^ help: must be of the form: `#[deny(lint1, lint2, ..., /*opt*/ reason = "...")]` -error: aborting due to 2 previous errors +error[E0452]: malformed lint attribute input + --> $DIR/lint-malformed.rs:2:10 + | +LL | #![allow(bar = "baz")] + | ^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/lint-malformed.rs:2:10 + | +LL | #![allow(bar = "baz")] + | ^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/lint-malformed.rs:2:10 + | +LL | #![allow(bar = "baz")] + | ^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/lint-malformed.rs:2:10 + | +LL | #![allow(bar = "baz")] + | ^^^^^^^^^^^ bad attribute argument + +error: aborting due to 7 previous errors For more information about this error, try `rustc --explain E0452`. diff --git a/src/test/ui/lint/lint-non-camel-case-types.rs b/src/test/ui/lint/lint-non-camel-case-types.rs index d3b119a944..acd5c5df9e 100644 --- a/src/test/ui/lint/lint-non-camel-case-types.rs +++ b/src/test/ui/lint/lint-non-camel-case-types.rs @@ -23,6 +23,7 @@ enum Foo5 { } trait foo6 { //~ ERROR trait `foo6` should have an upper camel case name + type foo7; //~ ERROR associated type `foo7` should have an upper camel case name fn dummy(&self) { } } diff --git a/src/test/ui/lint/lint-non-camel-case-types.stderr b/src/test/ui/lint/lint-non-camel-case-types.stderr index 177f8c8fe9..f82eefed43 100644 --- a/src/test/ui/lint/lint-non-camel-case-types.stderr +++ b/src/test/ui/lint/lint-non-camel-case-types.stderr @@ -46,11 +46,17 @@ error: trait `foo6` should have an upper camel case name LL | trait foo6 { | ^^^^ help: convert the identifier to upper camel case (notice the capitalization): `Foo6` +error: associated type `foo7` should have an upper camel case name + --> $DIR/lint-non-camel-case-types.rs:26:10 + | +LL | type foo7; + | ^^^^ help: convert the identifier to upper camel case (notice the capitalization): `Foo7` + error: type parameter `ty` should have an upper camel case name - --> $DIR/lint-non-camel-case-types.rs:29:6 + --> $DIR/lint-non-camel-case-types.rs:30:6 | LL | fn f<ty>(_: ty) {} | ^^ help: convert the identifier to upper camel case: `Ty` -error: aborting due to 8 previous errors +error: aborting due to 9 previous errors diff --git a/src/test/ui/lint/lint-non-camel-case-variant.rs b/src/test/ui/lint/lint-non-camel-case-variant.rs index 434e24c1d2..2b1a52f25b 100644 --- a/src/test/ui/lint/lint-non-camel-case-variant.rs +++ b/src/test/ui/lint/lint-non-camel-case-variant.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![deny(non_camel_case_types)] diff --git a/src/test/ui/lint/lint-non-camel-case-with-trailing-underscores.rs b/src/test/ui/lint/lint-non-camel-case-with-trailing-underscores.rs index d025ee9485..b832e4bcd6 100644 --- a/src/test/ui/lint/lint-non-camel-case-with-trailing-underscores.rs +++ b/src/test/ui/lint/lint-non-camel-case-with-trailing-underscores.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![allow(dead_code)] // This is ok because we often use the trailing underscore to mean 'prime' diff --git a/src/test/ui/lint/lint-non-snake-case-no-lowercase-equivalent.rs b/src/test/ui/lint/lint-non-snake-case-no-lowercase-equivalent.rs index 5bec82ce1a..710eebe4b6 100644 --- a/src/test/ui/lint/lint-non-snake-case-no-lowercase-equivalent.rs +++ b/src/test/ui/lint/lint-non-snake-case-no-lowercase-equivalent.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![allow(dead_code)] // pretty-expanded FIXME #23616 diff --git a/src/test/ui/lint/lint-nonstandard-style-unicode.rs b/src/test/ui/lint/lint-nonstandard-style-unicode.rs index 40f0a67638..9f16cb20fb 100644 --- a/src/test/ui/lint/lint-nonstandard-style-unicode.rs +++ b/src/test/ui/lint/lint-nonstandard-style-unicode.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![allow(dead_code)] diff --git a/src/test/ui/lint/lint-output-format-2.rs b/src/test/ui/lint/lint-output-format-2.rs index 32a4117996..521472d99b 100644 --- a/src/test/ui/lint/lint-output-format-2.rs +++ b/src/test/ui/lint/lint-output-format-2.rs @@ -1,7 +1,7 @@ // aux-build:lint_output_format.rs #![feature(unstable_test_feature)] -// build-pass (FIXME(62277): could be check-pass?) +// check-pass extern crate lint_output_format; use lint_output_format::{foo, bar}; diff --git a/src/test/ui/lint/lint-removed-cmdline.stderr b/src/test/ui/lint/lint-removed-cmdline.stderr index 69b0d2675c..b4ab5f5ee6 100644 --- a/src/test/ui/lint/lint-removed-cmdline.stderr +++ b/src/test/ui/lint/lint-removed-cmdline.stderr @@ -2,6 +2,18 @@ warning: lint `raw_pointer_derive` has been removed: `using derive with raw poin | = note: requested on the command line with `-D raw_pointer_derive` +warning: lint `raw_pointer_derive` has been removed: `using derive with raw pointers is ok` + | + = note: requested on the command line with `-D raw_pointer_derive` + +warning: lint `raw_pointer_derive` has been removed: `using derive with raw pointers is ok` + | + = note: requested on the command line with `-D raw_pointer_derive` + +warning: lint `raw_pointer_derive` has been removed: `using derive with raw pointers is ok` + | + = note: requested on the command line with `-D raw_pointer_derive` + error: unused variable: `unused` --> $DIR/lint-removed-cmdline.rs:12:17 | diff --git a/src/test/ui/lint/lint-renamed-cmdline.stderr b/src/test/ui/lint/lint-renamed-cmdline.stderr index c978981a5c..6401d9b77e 100644 --- a/src/test/ui/lint/lint-renamed-cmdline.stderr +++ b/src/test/ui/lint/lint-renamed-cmdline.stderr @@ -2,6 +2,18 @@ warning: lint `bare_trait_object` has been renamed to `bare_trait_objects` | = note: requested on the command line with `-D bare_trait_object` +warning: lint `bare_trait_object` has been renamed to `bare_trait_objects` + | + = note: requested on the command line with `-D bare_trait_object` + +warning: lint `bare_trait_object` has been renamed to `bare_trait_objects` + | + = note: requested on the command line with `-D bare_trait_object` + +warning: lint `bare_trait_object` has been renamed to `bare_trait_objects` + | + = note: requested on the command line with `-D bare_trait_object` + error: unused variable: `unused` --> $DIR/lint-renamed-cmdline.rs:8:17 | diff --git a/src/test/ui/lint/lint-shorthand-field.fixed b/src/test/ui/lint/lint-shorthand-field.fixed new file mode 100644 index 0000000000..7cd5717bc5 --- /dev/null +++ b/src/test/ui/lint/lint-shorthand-field.fixed @@ -0,0 +1,70 @@ +// run-rustfix + +#![allow(nonstandard_style, unused_variables, unused_mut)] +#![deny(non_shorthand_field_patterns)] + +struct Foo { + x: isize, + y: isize, +} + +fn main() { + { + let Foo { + x, //~ ERROR the `x:` in this pattern is redundant + ref y, //~ ERROR the `y:` in this pattern is redundant + } = Foo { x: 0, y: 0 }; + + let Foo { + x, + ref y, + } = Foo { x: 0, y: 0 }; + } + + { + const x: isize = 1; + + match (Foo { x: 1, y: 1 }) { + Foo { x: x, ..} => {}, + _ => {}, + } + } + + { + struct Bar { + x: x, + } + + struct x; + + match (Bar { x: x }) { + Bar { x: x } => {}, + } + } + + { + struct Bar { + x: Foo, + } + + enum Foo { x } + + match (Bar { x: Foo::x }) { + Bar { x: Foo::x } => {}, + } + } + + { + struct Baz { + x: isize, + y: isize, + z: isize, + } + + let Baz { + mut x, //~ ERROR the `x:` in this pattern is redundant + ref y, //~ ERROR the `y:` in this pattern is redundant + ref mut z, //~ ERROR the `z:` in this pattern is redundant + } = Baz { x: 0, y: 0, z: 0 }; + } +} diff --git a/src/test/ui/lint/lint-shorthand-field.rs b/src/test/ui/lint/lint-shorthand-field.rs index 5e756d14dc..22de9c3254 100644 --- a/src/test/ui/lint/lint-shorthand-field.rs +++ b/src/test/ui/lint/lint-shorthand-field.rs @@ -1,4 +1,6 @@ -#![allow(nonstandard_style, unused_variables)] +// run-rustfix + +#![allow(nonstandard_style, unused_variables, unused_mut)] #![deny(non_shorthand_field_patterns)] struct Foo { @@ -51,4 +53,18 @@ fn main() { Bar { x: Foo::x } => {}, } } + + { + struct Baz { + x: isize, + y: isize, + z: isize, + } + + let Baz { + x: mut x, //~ ERROR the `x:` in this pattern is redundant + y: ref y, //~ ERROR the `y:` in this pattern is redundant + z: ref mut z, //~ ERROR the `z:` in this pattern is redundant + } = Baz { x: 0, y: 0, z: 0 }; + } } diff --git a/src/test/ui/lint/lint-shorthand-field.stderr b/src/test/ui/lint/lint-shorthand-field.stderr index 366ab55d7d..5c9b21ffdc 100644 --- a/src/test/ui/lint/lint-shorthand-field.stderr +++ b/src/test/ui/lint/lint-shorthand-field.stderr @@ -1,24 +1,38 @@ error: the `x:` in this pattern is redundant - --> $DIR/lint-shorthand-field.rs:12:13 + --> $DIR/lint-shorthand-field.rs:14:13 | LL | x: x, - | --^^ - | | - | help: remove this + | ^^^^ help: use shorthand field pattern: `x` | note: lint level defined here - --> $DIR/lint-shorthand-field.rs:2:9 + --> $DIR/lint-shorthand-field.rs:4:9 | LL | #![deny(non_shorthand_field_patterns)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: the `y:` in this pattern is redundant - --> $DIR/lint-shorthand-field.rs:13:13 + --> $DIR/lint-shorthand-field.rs:15:13 | LL | y: ref y, - | --^^^^^^ - | | - | help: remove this + | ^^^^^^^^ help: use shorthand field pattern: `ref y` -error: aborting due to 2 previous errors +error: the `x:` in this pattern is redundant + --> $DIR/lint-shorthand-field.rs:65:13 + | +LL | x: mut x, + | ^^^^^^^^ help: use shorthand field pattern: `mut x` + +error: the `y:` in this pattern is redundant + --> $DIR/lint-shorthand-field.rs:66:13 + | +LL | y: ref y, + | ^^^^^^^^ help: use shorthand field pattern: `ref y` + +error: the `z:` in this pattern is redundant + --> $DIR/lint-shorthand-field.rs:67:13 + | +LL | z: ref mut z, + | ^^^^^^^^^^^^ help: use shorthand field pattern: `ref mut z` + +error: aborting due to 5 previous errors diff --git a/src/test/ui/lint/lint-stability-2.rs b/src/test/ui/lint/lint-stability-2.rs index 53eee35a9c..2a4f95f555 100644 --- a/src/test/ui/lint/lint-stability-2.rs +++ b/src/test/ui/lint/lint-stability-2.rs @@ -168,16 +168,16 @@ mod cross_crate { } mod this_crate { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_text() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -189,16 +189,16 @@ mod this_crate { pub struct MethodTester; impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -208,16 +208,16 @@ mod this_crate { } pub trait Trait { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -228,12 +228,12 @@ mod this_crate { impl Trait for MethodTester {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } @@ -242,29 +242,29 @@ mod this_crate { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; pub enum Enum { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] StableVariant, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(isize); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(isize); @@ -381,7 +381,7 @@ mod this_crate { foo.trait_stable(); } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_fn_body() { fn fn_in_body() {} @@ -389,7 +389,7 @@ mod this_crate { } impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_method_body(&self) { fn fn_in_body() {} @@ -397,7 +397,7 @@ mod this_crate { } } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub trait DeprecatedTrait { fn dummy(&self) { } diff --git a/src/test/ui/lint/lint-stability-deprecated.rs b/src/test/ui/lint/lint-stability-deprecated.rs index 5e747467a1..4b407a29f6 100644 --- a/src/test/ui/lint/lint-stability-deprecated.rs +++ b/src/test/ui/lint/lint-stability-deprecated.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // aux-build:lint_stability.rs // aux-build:inherited_stability.rs // aux-build:stability_cfg1.rs @@ -97,10 +97,13 @@ mod cross_crate { struct S1<T: TraitWithAssociatedTypes>(T::TypeUnstable); struct S2<T: TraitWithAssociatedTypes>(T::TypeDeprecated); //~^ WARN use of deprecated item 'lint_stability::TraitWithAssociatedTypes::TypeDeprecated': text + //~| WARN use of deprecated item 'lint_stability::TraitWithAssociatedTypes::TypeDeprecated': text type A = dyn TraitWithAssociatedTypes< TypeUnstable = u8, TypeDeprecated = u16, //~^ WARN use of deprecated item 'lint_stability::TraitWithAssociatedTypes::TypeDeprecated' + //~| WARN use of deprecated item 'lint_stability::TraitWithAssociatedTypes::TypeDeprecated' + //~| WARN use of deprecated item 'lint_stability::TraitWithAssociatedTypes::TypeDeprecated' >; let _ = DeprecatedStruct { //~ WARN use of deprecated item 'lint_stability::DeprecatedStruct' @@ -216,16 +219,16 @@ mod inheritance { } mod this_crate { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_text() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -237,16 +240,16 @@ mod this_crate { pub struct MethodTester; impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -256,16 +259,16 @@ mod this_crate { } pub trait Trait { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -276,12 +279,12 @@ mod this_crate { impl Trait for MethodTester {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } @@ -290,29 +293,29 @@ mod this_crate { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; pub enum Enum { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] StableVariant, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(isize); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(isize); @@ -430,7 +433,7 @@ mod this_crate { foo.trait_stable(); } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_fn_body() { fn fn_in_body() {} @@ -438,7 +441,7 @@ mod this_crate { } impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_method_body(&self) { fn fn_in_body() {} @@ -446,7 +449,7 @@ mod this_crate { } } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub trait DeprecatedTrait { fn dummy(&self) { } diff --git a/src/test/ui/lint/lint-stability-deprecated.stderr b/src/test/ui/lint/lint-stability-deprecated.stderr index 62380135b3..650373c90b 100644 --- a/src/test/ui/lint/lint-stability-deprecated.stderr +++ b/src/test/ui/lint/lint-stability-deprecated.stderr @@ -77,241 +77,241 @@ LL | ... <Foo as Trait>::trait_deprecated_unstable_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::DeprecatedStruct': text - --> $DIR/lint-stability-deprecated.rs:106:17 + --> $DIR/lint-stability-deprecated.rs:109:17 | LL | let _ = DeprecatedStruct { | ^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::DeprecatedUnstableStruct': text - --> $DIR/lint-stability-deprecated.rs:109:17 + --> $DIR/lint-stability-deprecated.rs:112:17 | LL | let _ = DeprecatedUnstableStruct { | ^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::DeprecatedUnitStruct': text - --> $DIR/lint-stability-deprecated.rs:116:17 + --> $DIR/lint-stability-deprecated.rs:119:17 | LL | let _ = DeprecatedUnitStruct; | ^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::DeprecatedUnstableUnitStruct': text - --> $DIR/lint-stability-deprecated.rs:117:17 + --> $DIR/lint-stability-deprecated.rs:120:17 | LL | let _ = DeprecatedUnstableUnitStruct; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Enum::DeprecatedVariant': text - --> $DIR/lint-stability-deprecated.rs:121:17 + --> $DIR/lint-stability-deprecated.rs:124:17 | LL | let _ = Enum::DeprecatedVariant; | ^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Enum::DeprecatedUnstableVariant': text - --> $DIR/lint-stability-deprecated.rs:122:17 + --> $DIR/lint-stability-deprecated.rs:125:17 | LL | let _ = Enum::DeprecatedUnstableVariant; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::DeprecatedTupleStruct': text - --> $DIR/lint-stability-deprecated.rs:126:17 + --> $DIR/lint-stability-deprecated.rs:129:17 | LL | let _ = DeprecatedTupleStruct (1); | ^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::DeprecatedUnstableTupleStruct': text - --> $DIR/lint-stability-deprecated.rs:127:17 + --> $DIR/lint-stability-deprecated.rs:130:17 | LL | let _ = DeprecatedUnstableTupleStruct (1); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:136:25 + --> $DIR/lint-stability-deprecated.rs:139:25 | LL | macro_test_arg!(deprecated_text()); | ^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::deprecated_unstable_text': text - --> $DIR/lint-stability-deprecated.rs:137:25 + --> $DIR/lint-stability-deprecated.rs:140:25 | LL | macro_test_arg!(deprecated_unstable_text()); | ^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:138:41 + --> $DIR/lint-stability-deprecated.rs:141:41 | LL | macro_test_arg!(macro_test_arg!(deprecated_text())); | ^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:143:9 + --> $DIR/lint-stability-deprecated.rs:146:9 | LL | Trait::trait_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:145:9 + --> $DIR/lint-stability-deprecated.rs:148:9 | LL | <Foo as Trait>::trait_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:147:9 + --> $DIR/lint-stability-deprecated.rs:150:9 | LL | Trait::trait_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:149:9 + --> $DIR/lint-stability-deprecated.rs:152:9 | LL | <Foo as Trait>::trait_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable': text - --> $DIR/lint-stability-deprecated.rs:151:9 + --> $DIR/lint-stability-deprecated.rs:154:9 | LL | Trait::trait_deprecated_unstable(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable': text - --> $DIR/lint-stability-deprecated.rs:153:9 + --> $DIR/lint-stability-deprecated.rs:156:9 | LL | <Foo as Trait>::trait_deprecated_unstable(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable_text': text - --> $DIR/lint-stability-deprecated.rs:155:9 + --> $DIR/lint-stability-deprecated.rs:158:9 | LL | ... Trait::trait_deprecated_unstable_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable_text': text - --> $DIR/lint-stability-deprecated.rs:157:9 + --> $DIR/lint-stability-deprecated.rs:160:9 | LL | ... <Foo as Trait>::trait_deprecated_unstable_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::DeprecatedTrait': text - --> $DIR/lint-stability-deprecated.rs:185:10 + --> $DIR/lint-stability-deprecated.rs:188:10 | LL | impl DeprecatedTrait for S {} | ^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::DeprecatedTrait': text - --> $DIR/lint-stability-deprecated.rs:187:25 + --> $DIR/lint-stability-deprecated.rs:190:25 | LL | trait LocalTrait2 : DeprecatedTrait { } | ^^^^^^^^^^^^^^^ warning: use of deprecated item 'inheritance::inherited_stability::unstable_mod::deprecated': text - --> $DIR/lint-stability-deprecated.rs:206:9 + --> $DIR/lint-stability-deprecated.rs:209:9 | LL | unstable_mod::deprecated(); | ^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::deprecated': text - --> $DIR/lint-stability-deprecated.rs:328:9 + --> $DIR/lint-stability-deprecated.rs:331:9 | LL | deprecated(); | ^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:333:9 + --> $DIR/lint-stability-deprecated.rs:336:9 | LL | Trait::trait_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:335:9 + --> $DIR/lint-stability-deprecated.rs:338:9 | LL | <Foo as Trait>::trait_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:337:9 + --> $DIR/lint-stability-deprecated.rs:340:9 | LL | deprecated_text(); | ^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:342:9 + --> $DIR/lint-stability-deprecated.rs:345:9 | LL | Trait::trait_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:344:9 + --> $DIR/lint-stability-deprecated.rs:347:9 | LL | <Foo as Trait>::trait_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::DeprecatedStruct': text - --> $DIR/lint-stability-deprecated.rs:382:17 + --> $DIR/lint-stability-deprecated.rs:385:17 | LL | let _ = DeprecatedStruct { | ^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::DeprecatedUnitStruct': text - --> $DIR/lint-stability-deprecated.rs:389:17 + --> $DIR/lint-stability-deprecated.rs:392:17 | LL | let _ = DeprecatedUnitStruct; | ^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Enum::DeprecatedVariant': text - --> $DIR/lint-stability-deprecated.rs:393:17 + --> $DIR/lint-stability-deprecated.rs:396:17 | LL | let _ = Enum::DeprecatedVariant; | ^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::DeprecatedTupleStruct': text - --> $DIR/lint-stability-deprecated.rs:397:17 + --> $DIR/lint-stability-deprecated.rs:400:17 | LL | let _ = DeprecatedTupleStruct (1); | ^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:404:9 + --> $DIR/lint-stability-deprecated.rs:407:9 | LL | Trait::trait_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:406:9 + --> $DIR/lint-stability-deprecated.rs:409:9 | LL | <Foo as Trait>::trait_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:408:9 + --> $DIR/lint-stability-deprecated.rs:411:9 | LL | Trait::trait_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:410:9 + --> $DIR/lint-stability-deprecated.rs:413:9 | LL | <Foo as Trait>::trait_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::test_fn_body::fn_in_body': text - --> $DIR/lint-stability-deprecated.rs:437:9 + --> $DIR/lint-stability-deprecated.rs:440:9 | LL | fn_in_body(); | ^^^^^^^^^^ warning: use of deprecated item 'this_crate::DeprecatedTrait': text - --> $DIR/lint-stability-deprecated.rs:457:10 + --> $DIR/lint-stability-deprecated.rs:460:10 | LL | impl DeprecatedTrait for S { } | ^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::DeprecatedTrait': text - --> $DIR/lint-stability-deprecated.rs:459:24 + --> $DIR/lint-stability-deprecated.rs:462:24 | LL | trait LocalTrait : DeprecatedTrait { } | ^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::MethodTester::test_method_body::fn_in_body': text - --> $DIR/lint-stability-deprecated.rs:445:13 + --> $DIR/lint-stability-deprecated.rs:448:13 | LL | fn_in_body(); | ^^^^^^^^^^ @@ -323,7 +323,7 @@ LL | struct S2<T: TraitWithAssociatedTypes>(T::TypeDeprecated); | ^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::TraitWithAssociatedTypes::TypeDeprecated': text - --> $DIR/lint-stability-deprecated.rs:102:13 + --> $DIR/lint-stability-deprecated.rs:103:13 | LL | TypeDeprecated = u16, | ^^^^^^^^^^^^^^^^^^^^ @@ -449,188 +449,206 @@ LL | ... <Foo>::trait_deprecated_unstable_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::DeprecatedStruct::i': text - --> $DIR/lint-stability-deprecated.rs:107:13 + --> $DIR/lint-stability-deprecated.rs:110:13 | LL | i: 0 | ^^^^ warning: use of deprecated item 'lint_stability::DeprecatedUnstableStruct::i': text - --> $DIR/lint-stability-deprecated.rs:111:13 + --> $DIR/lint-stability-deprecated.rs:114:13 | LL | i: 0 | ^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:142:13 + --> $DIR/lint-stability-deprecated.rs:145:13 | LL | foo.trait_deprecated(); | ^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:144:9 + --> $DIR/lint-stability-deprecated.rs:147:9 | LL | <Foo>::trait_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:146:13 + --> $DIR/lint-stability-deprecated.rs:149:13 | LL | foo.trait_deprecated_text(); | ^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:148:9 + --> $DIR/lint-stability-deprecated.rs:151:9 | LL | <Foo>::trait_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable': text - --> $DIR/lint-stability-deprecated.rs:150:13 + --> $DIR/lint-stability-deprecated.rs:153:13 | LL | foo.trait_deprecated_unstable(); | ^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable': text - --> $DIR/lint-stability-deprecated.rs:152:9 + --> $DIR/lint-stability-deprecated.rs:155:9 | LL | <Foo>::trait_deprecated_unstable(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable_text': text - --> $DIR/lint-stability-deprecated.rs:154:13 + --> $DIR/lint-stability-deprecated.rs:157:13 | LL | foo.trait_deprecated_unstable_text(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable_text': text - --> $DIR/lint-stability-deprecated.rs:156:9 + --> $DIR/lint-stability-deprecated.rs:159:9 | LL | ... <Foo>::trait_deprecated_unstable_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:173:13 + --> $DIR/lint-stability-deprecated.rs:176:13 | LL | foo.trait_deprecated(); | ^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:174:13 + --> $DIR/lint-stability-deprecated.rs:177:13 | LL | foo.trait_deprecated_text(); | ^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable': text - --> $DIR/lint-stability-deprecated.rs:175:13 + --> $DIR/lint-stability-deprecated.rs:178:13 | LL | foo.trait_deprecated_unstable(); | ^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'lint_stability::Trait::trait_deprecated_unstable_text': text - --> $DIR/lint-stability-deprecated.rs:176:13 + --> $DIR/lint-stability-deprecated.rs:179:13 | LL | foo.trait_deprecated_unstable_text(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::MethodTester::method_deprecated': text - --> $DIR/lint-stability-deprecated.rs:329:13 + --> $DIR/lint-stability-deprecated.rs:332:13 | LL | foo.method_deprecated(); | ^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::MethodTester::method_deprecated': text - --> $DIR/lint-stability-deprecated.rs:330:9 + --> $DIR/lint-stability-deprecated.rs:333:9 | LL | Foo::method_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::MethodTester::method_deprecated': text - --> $DIR/lint-stability-deprecated.rs:331:9 + --> $DIR/lint-stability-deprecated.rs:334:9 | LL | <Foo>::method_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:332:13 + --> $DIR/lint-stability-deprecated.rs:335:13 | LL | foo.trait_deprecated(); | ^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:334:9 + --> $DIR/lint-stability-deprecated.rs:337:9 | LL | <Foo>::trait_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::MethodTester::method_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:338:13 + --> $DIR/lint-stability-deprecated.rs:341:13 | LL | foo.method_deprecated_text(); | ^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::MethodTester::method_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:339:9 + --> $DIR/lint-stability-deprecated.rs:342:9 | LL | Foo::method_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::MethodTester::method_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:340:9 + --> $DIR/lint-stability-deprecated.rs:343:9 | LL | <Foo>::method_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:341:13 + --> $DIR/lint-stability-deprecated.rs:344:13 | LL | foo.trait_deprecated_text(); | ^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:343:9 + --> $DIR/lint-stability-deprecated.rs:346:9 | LL | <Foo>::trait_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::DeprecatedStruct::i': text - --> $DIR/lint-stability-deprecated.rs:384:13 + --> $DIR/lint-stability-deprecated.rs:387:13 | LL | i: 0 | ^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:403:13 + --> $DIR/lint-stability-deprecated.rs:406:13 | LL | foo.trait_deprecated(); | ^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:405:9 + --> $DIR/lint-stability-deprecated.rs:408:9 | LL | <Foo>::trait_deprecated(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:407:13 + --> $DIR/lint-stability-deprecated.rs:410:13 | LL | foo.trait_deprecated_text(); | ^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:409:9 + --> $DIR/lint-stability-deprecated.rs:412:9 | LL | <Foo>::trait_deprecated_text(&foo); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated': text - --> $DIR/lint-stability-deprecated.rs:426:13 + --> $DIR/lint-stability-deprecated.rs:429:13 | LL | foo.trait_deprecated(); | ^^^^^^^^^^^^^^^^ warning: use of deprecated item 'this_crate::Trait::trait_deprecated_text': text - --> $DIR/lint-stability-deprecated.rs:427:13 + --> $DIR/lint-stability-deprecated.rs:430:13 | LL | foo.trait_deprecated_text(); | ^^^^^^^^^^^^^^^^^^^^^ +warning: use of deprecated item 'lint_stability::TraitWithAssociatedTypes::TypeDeprecated': text + --> $DIR/lint-stability-deprecated.rs:98:48 + | +LL | struct S2<T: TraitWithAssociatedTypes>(T::TypeDeprecated); + | ^^^^^^^^^^^^^^^^^ + +warning: use of deprecated item 'lint_stability::TraitWithAssociatedTypes::TypeDeprecated': text + --> $DIR/lint-stability-deprecated.rs:103:13 + | +LL | TypeDeprecated = u16, + | ^^^^^^^^^^^^^^^^^^^^ + +warning: use of deprecated item 'lint_stability::TraitWithAssociatedTypes::TypeDeprecated': text + --> $DIR/lint-stability-deprecated.rs:103:13 + | +LL | TypeDeprecated = u16, + | ^^^^^^^^^^^^^^^^^^^^ + diff --git a/src/test/ui/lint/lint-stability-fields-deprecated.rs b/src/test/ui/lint/lint-stability-fields-deprecated.rs index 9d5b7c51cc..50e3970c7f 100644 --- a/src/test/ui/lint/lint-stability-fields-deprecated.rs +++ b/src/test/ui/lint/lint-stability-fields-deprecated.rs @@ -153,50 +153,50 @@ mod this_crate { #[stable(feature = "rust1", since = "1.0.0")] struct Stable { inherit: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } #[stable(feature = "rust1", since = "1.0.0")] struct Stable2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] u8); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] struct Unstable { inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] struct Unstable2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] u8); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] struct Deprecated { inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] override1: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] struct Deprecated2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] u8); + #[unstable(feature = "unstable_test_feature", issue = "none")] u8); pub fn foo() { let x = Stable { diff --git a/src/test/ui/lint/lint-stability-fields.rs b/src/test/ui/lint/lint-stability-fields.rs index 9be8710bd4..c5de5748aa 100644 --- a/src/test/ui/lint/lint-stability-fields.rs +++ b/src/test/ui/lint/lint-stability-fields.rs @@ -128,50 +128,50 @@ mod this_crate { #[stable(feature = "rust1", since = "1.0.0")] struct Stable { inherit: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } #[stable(feature = "rust1", since = "1.0.0")] struct Stable2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] u8); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] struct Unstable { inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] struct Unstable2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] u8); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] struct Deprecated { inherit: u8, #[stable(feature = "rust1", since = "1.0.0")] override1: u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] struct Deprecated2(u8, #[stable(feature = "rust1", since = "1.0.0")] u8, - #[unstable(feature = "unstable_test_feature", issue = "0")] u8); + #[unstable(feature = "unstable_test_feature", issue = "none")] u8); pub fn foo() { let x = Stable { diff --git a/src/test/ui/lint/lint-stability.rs b/src/test/ui/lint/lint-stability.rs index fde27eec7d..e5620a9f8e 100644 --- a/src/test/ui/lint/lint-stability.rs +++ b/src/test/ui/lint/lint-stability.rs @@ -203,10 +203,10 @@ mod inheritance { } mod this_crate { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn deprecated_text() {} @@ -214,9 +214,9 @@ mod this_crate { #[rustc_deprecated(since = "99.99.99", reason = "text")] pub fn deprecated_future() {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn unstable() {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn unstable_text() {} #[stable(feature = "rust1", since = "1.0.0")] @@ -228,16 +228,16 @@ mod this_crate { pub struct MethodTester; impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub fn method_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub fn method_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] pub fn method_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -247,16 +247,16 @@ mod this_crate { } pub trait Trait { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn trait_deprecated_text(&self) {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] fn trait_unstable(&self) {} - #[unstable(feature = "unstable_test_feature", reason = "text", issue = "0")] + #[unstable(feature = "unstable_test_feature", reason = "text", issue = "none")] fn trait_unstable_text(&self) {} #[stable(feature = "rust1", since = "1.0.0")] @@ -267,12 +267,12 @@ mod this_crate { impl Trait for MethodTester {} - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableStruct { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } @@ -281,29 +281,29 @@ mod this_crate { #[stable(feature = "stable_test_feature", since = "1.0.0")] i: isize } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedUnitStruct; - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableUnitStruct; #[stable(feature = "rust1", since = "1.0.0")] pub struct StableUnitStruct; pub enum Enum { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] DeprecatedVariant, - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] UnstableVariant, #[stable(feature = "rust1", since = "1.0.0")] StableVariant, } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub struct DeprecatedTupleStruct(isize); - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct UnstableTupleStruct(isize); #[stable(feature = "rust1", since = "1.0.0")] pub struct StableTupleStruct(isize); @@ -422,7 +422,7 @@ mod this_crate { foo.trait_stable(); } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_fn_body() { fn fn_in_body() {} @@ -430,7 +430,7 @@ mod this_crate { } impl MethodTester { - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] fn test_method_body(&self) { fn fn_in_body() {} @@ -438,7 +438,7 @@ mod this_crate { } } - #[unstable(feature = "unstable_test_feature", issue = "0")] + #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] pub trait DeprecatedTrait { fn dummy(&self) { } diff --git a/src/test/ui/lint/lint-unexported-no-mangle.stderr b/src/test/ui/lint/lint-unexported-no-mangle.stderr index c2cbf5feaa..3a78ed2cee 100644 --- a/src/test/ui/lint/lint-unexported-no-mangle.stderr +++ b/src/test/ui/lint/lint-unexported-no-mangle.stderr @@ -6,6 +6,30 @@ warning: lint `private_no_mangle_statics` has been removed: `no longer a warning | = note: requested on the command line with `-F private_no_mangle_statics` +warning: lint `private_no_mangle_fns` has been removed: `no longer a warning, `#[no_mangle]` functions always exported` + | + = note: requested on the command line with `-F private_no_mangle_fns` + +warning: lint `private_no_mangle_statics` has been removed: `no longer a warning, `#[no_mangle]` statics always exported` + | + = note: requested on the command line with `-F private_no_mangle_statics` + +warning: lint `private_no_mangle_fns` has been removed: `no longer a warning, `#[no_mangle]` functions always exported` + | + = note: requested on the command line with `-F private_no_mangle_fns` + +warning: lint `private_no_mangle_statics` has been removed: `no longer a warning, `#[no_mangle]` statics always exported` + | + = note: requested on the command line with `-F private_no_mangle_statics` + +warning: lint `private_no_mangle_fns` has been removed: `no longer a warning, `#[no_mangle]` functions always exported` + | + = note: requested on the command line with `-F private_no_mangle_fns` + +warning: lint `private_no_mangle_statics` has been removed: `no longer a warning, `#[no_mangle]` statics always exported` + | + = note: requested on the command line with `-F private_no_mangle_statics` + error: const items should never be `#[no_mangle]` --> $DIR/lint-unexported-no-mangle.rs:9:1 | diff --git a/src/test/ui/lint/lint-unknown-lint-cmdline.stderr b/src/test/ui/lint/lint-unknown-lint-cmdline.stderr index 58fdae3333..27e7ee7fc0 100644 --- a/src/test/ui/lint/lint-unknown-lint-cmdline.stderr +++ b/src/test/ui/lint/lint-unknown-lint-cmdline.stderr @@ -7,6 +7,24 @@ error[E0602]: unknown lint: `dead_cod` = help: did you mean: `dead_code` = note: requested on the command line with `-D dead_cod` -error: aborting due to 2 previous errors +error[E0602]: unknown lint: `bogus` + | + = note: requested on the command line with `-D bogus` + +error[E0602]: unknown lint: `dead_cod` + | + = help: did you mean: `dead_code` + = note: requested on the command line with `-D dead_cod` + +error[E0602]: unknown lint: `bogus` + | + = note: requested on the command line with `-D bogus` + +error[E0602]: unknown lint: `dead_cod` + | + = help: did you mean: `dead_code` + = note: requested on the command line with `-D dead_cod` + +error: aborting due to 6 previous errors For more information about this error, try `rustc --explain E0602`. diff --git a/src/test/ui/lint/lint-unnecessary-parens.rs b/src/test/ui/lint/lint-unnecessary-parens.rs index 12ffb6d3c6..4e8339a8e6 100644 --- a/src/test/ui/lint/lint-unnecessary-parens.rs +++ b/src/test/ui/lint/lint-unnecessary-parens.rs @@ -17,6 +17,13 @@ fn unused_parens_around_return_type() -> (u32) { //~ ERROR unnecessary parenthes panic!() } +fn unused_parens_around_block_return() -> u32 { + let foo = { + (5) //~ ERROR unnecessary parentheses around block return value + }; + (5) //~ ERROR unnecessary parentheses around block return value +} + trait Trait { fn test(&self); } diff --git a/src/test/ui/lint/lint-unnecessary-parens.stderr b/src/test/ui/lint/lint-unnecessary-parens.stderr index 541ae7aa4b..ea58220d20 100644 --- a/src/test/ui/lint/lint-unnecessary-parens.stderr +++ b/src/test/ui/lint/lint-unnecessary-parens.stderr @@ -22,26 +22,38 @@ error: unnecessary parentheses around type LL | fn unused_parens_around_return_type() -> (u32) { | ^^^^^ help: remove these parentheses +error: unnecessary parentheses around block return value + --> $DIR/lint-unnecessary-parens.rs:22:9 + | +LL | (5) + | ^^^ help: remove these parentheses + +error: unnecessary parentheses around block return value + --> $DIR/lint-unnecessary-parens.rs:24:5 + | +LL | (5) + | ^^^ help: remove these parentheses + error: unnecessary parentheses around function argument - --> $DIR/lint-unnecessary-parens.rs:36:9 + --> $DIR/lint-unnecessary-parens.rs:43:9 | LL | bar((true)); | ^^^^^^ help: remove these parentheses error: unnecessary parentheses around `if` condition - --> $DIR/lint-unnecessary-parens.rs:38:8 + --> $DIR/lint-unnecessary-parens.rs:45:8 | LL | if (true) {} | ^^^^^^ help: remove these parentheses error: unnecessary parentheses around `while` condition - --> $DIR/lint-unnecessary-parens.rs:39:11 + --> $DIR/lint-unnecessary-parens.rs:46:11 | LL | while (true) {} | ^^^^^^ help: remove these parentheses warning: denote infinite loops with `loop { ... }` - --> $DIR/lint-unnecessary-parens.rs:39:5 + --> $DIR/lint-unnecessary-parens.rs:46:5 | LL | while (true) {} | ^^^^^^^^^^^^ help: use `loop` @@ -49,46 +61,46 @@ LL | while (true) {} = note: `#[warn(while_true)]` on by default error: unnecessary parentheses around `match` head expression - --> $DIR/lint-unnecessary-parens.rs:41:11 + --> $DIR/lint-unnecessary-parens.rs:48:11 | LL | match (true) { | ^^^^^^ help: remove these parentheses error: unnecessary parentheses around `let` head expression - --> $DIR/lint-unnecessary-parens.rs:44:16 + --> $DIR/lint-unnecessary-parens.rs:51:16 | LL | if let 1 = (1) {} | ^^^ help: remove these parentheses error: unnecessary parentheses around `let` head expression - --> $DIR/lint-unnecessary-parens.rs:45:19 + --> $DIR/lint-unnecessary-parens.rs:52:19 | LL | while let 1 = (2) {} | ^^^ help: remove these parentheses error: unnecessary parentheses around method argument - --> $DIR/lint-unnecessary-parens.rs:59:24 + --> $DIR/lint-unnecessary-parens.rs:66:24 | LL | X { y: false }.foo((true)); | ^^^^^^ help: remove these parentheses error: unnecessary parentheses around assigned value - --> $DIR/lint-unnecessary-parens.rs:61:18 + --> $DIR/lint-unnecessary-parens.rs:68:18 | LL | let mut _a = (0); | ^^^ help: remove these parentheses error: unnecessary parentheses around assigned value - --> $DIR/lint-unnecessary-parens.rs:62:10 + --> $DIR/lint-unnecessary-parens.rs:69:10 | LL | _a = (0); | ^^^ help: remove these parentheses error: unnecessary parentheses around assigned value - --> $DIR/lint-unnecessary-parens.rs:63:11 + --> $DIR/lint-unnecessary-parens.rs:70:11 | LL | _a += (1); | ^^^ help: remove these parentheses -error: aborting due to 13 previous errors +error: aborting due to 15 previous errors diff --git a/src/test/ui/lint/lint-unused-mut-variables.rs b/src/test/ui/lint/lint-unused-mut-variables.rs index 1af44ecf36..dd8dbda6d4 100644 --- a/src/test/ui/lint/lint-unused-mut-variables.rs +++ b/src/test/ui/lint/lint-unused-mut-variables.rs @@ -3,7 +3,7 @@ // Exercise the unused_mut attribute in some positive and negative cases #![deny(unused_mut)] -#![feature(async_closure)] +#![feature(async_closure, raw_ref_op)] async fn baz_async( mut a: i32, @@ -177,6 +177,12 @@ fn main() { // leading underscore should avoid the warning, just like the // unused variable lint. let mut _allowed = 1; + + let mut raw_address_of_mut = 1; // OK + let mut_ptr = &raw mut raw_address_of_mut; + + let mut raw_address_of_const = 1; //~ ERROR: variable does not need to be mutable + let const_ptr = &raw const raw_address_of_const; } fn callback<F>(f: F) where F: FnOnce() {} diff --git a/src/test/ui/lint/lint-unused-mut-variables.stderr b/src/test/ui/lint/lint-unused-mut-variables.stderr index 92c2b68652..c1ab0ab33d 100644 --- a/src/test/ui/lint/lint-unused-mut-variables.stderr +++ b/src/test/ui/lint/lint-unused-mut-variables.stderr @@ -180,6 +180,14 @@ LL | let mut v : &mut Vec<()> = &mut vec![]; | | | help: remove this `mut` +error: variable does not need to be mutable + --> $DIR/lint-unused-mut-variables.rs:184:9 + | +LL | let mut raw_address_of_const = 1; + | ----^^^^^^^^^^^^^^^^^^^^ + | | + | help: remove this `mut` + error: variable does not need to be mutable --> $DIR/lint-unused-mut-variables.rs:106:13 | @@ -197,7 +205,7 @@ LL | fn mut_ref_arg(mut arg : &mut [u8]) -> &mut [u8] { | help: remove this `mut` error: variable does not need to be mutable - --> $DIR/lint-unused-mut-variables.rs:196:9 + --> $DIR/lint-unused-mut-variables.rs:202:9 | LL | let mut b = vec![2]; | ----^ @@ -205,10 +213,10 @@ LL | let mut b = vec![2]; | help: remove this `mut` | note: lint level defined here - --> $DIR/lint-unused-mut-variables.rs:192:8 + --> $DIR/lint-unused-mut-variables.rs:198:8 | LL | #[deny(unused_mut)] | ^^^^^^^^^^ -error: aborting due to 25 previous errors +error: aborting due to 26 previous errors diff --git a/src/test/ui/lint/lint-uppercase-variables.rs b/src/test/ui/lint/lint-uppercase-variables.rs index 86a39502a8..a98b4f2fd4 100644 --- a/src/test/ui/lint/lint-uppercase-variables.rs +++ b/src/test/ui/lint/lint-uppercase-variables.rs @@ -25,6 +25,16 @@ fn main() { //~^^^ WARN unused variable: `Foo` } + let Foo = foo::Foo::Foo; + //~^ ERROR variable `Foo` should have a snake case name + //~^^ WARN `Foo` is named the same as one of the variants of the type `foo::Foo` + //~^^^ WARN unused variable: `Foo` + + fn in_param(Foo: foo::Foo) {} + //~^ ERROR variable `Foo` should have a snake case name + //~^^ WARN `Foo` is named the same as one of the variants of the type `foo::Foo` + //~^^^ WARN unused variable: `Foo` + test(1); let _ = Something { X: 0 }; diff --git a/src/test/ui/lint/lint-uppercase-variables.stderr b/src/test/ui/lint/lint-uppercase-variables.stderr index f614d5d71f..a38f3e7626 100644 --- a/src/test/ui/lint/lint-uppercase-variables.stderr +++ b/src/test/ui/lint/lint-uppercase-variables.stderr @@ -3,6 +3,20 @@ warning[E0170]: pattern binding `Foo` is named the same as one of the variants o | LL | Foo => {} | ^^^ help: to match on the variant, qualify the path: `foo::Foo::Foo` + | + = note: `#[warn(bindings_with_variant_name)]` on by default + +warning[E0170]: pattern binding `Foo` is named the same as one of the variants of the type `foo::Foo` + --> $DIR/lint-uppercase-variables.rs:28:9 + | +LL | let Foo = foo::Foo::Foo; + | ^^^ help: to match on the variant, qualify the path: `foo::Foo::Foo` + +warning[E0170]: pattern binding `Foo` is named the same as one of the variants of the type `foo::Foo` + --> $DIR/lint-uppercase-variables.rs:33:17 + | +LL | fn in_param(Foo: foo::Foo) {} + | ^^^ help: to match on the variant, qualify the path: `foo::Foo::Foo` warning: unused variable: `Foo` --> $DIR/lint-uppercase-variables.rs:22:9 @@ -17,6 +31,18 @@ LL | #![warn(unused)] | ^^^^^^ = note: `#[warn(unused_variables)]` implied by `#[warn(unused)]` +warning: unused variable: `Foo` + --> $DIR/lint-uppercase-variables.rs:28:9 + | +LL | let Foo = foo::Foo::Foo; + | ^^^ help: consider prefixing with an underscore: `_Foo` + +warning: unused variable: `Foo` + --> $DIR/lint-uppercase-variables.rs:33:17 + | +LL | fn in_param(Foo: foo::Foo) {} + | ^^^ help: consider prefixing with an underscore: `_Foo` + error: structure field `X` should have a snake case name --> $DIR/lint-uppercase-variables.rs:10:5 | @@ -47,6 +73,18 @@ error: variable `Foo` should have a snake case name LL | Foo => {} | ^^^ help: convert the identifier to snake case (notice the capitalization): `foo` -error: aborting due to 4 previous errors +error: variable `Foo` should have a snake case name + --> $DIR/lint-uppercase-variables.rs:28:9 + | +LL | let Foo = foo::Foo::Foo; + | ^^^ help: convert the identifier to snake case (notice the capitalization): `foo` + +error: variable `Foo` should have a snake case name + --> $DIR/lint-uppercase-variables.rs:33:17 + | +LL | fn in_param(Foo: foo::Foo) {} + | ^^^ help: convert the identifier to snake case (notice the capitalization): `foo` + +error: aborting due to 6 previous errors For more information about this error, try `rustc --explain E0170`. diff --git a/src/test/ui/lint/lints-in-foreign-macros.rs b/src/test/ui/lint/lints-in-foreign-macros.rs index e381c81453..c96b8f1a5c 100644 --- a/src/test/ui/lint/lints-in-foreign-macros.rs +++ b/src/test/ui/lint/lints-in-foreign-macros.rs @@ -1,5 +1,5 @@ // aux-build:lints-in-foreign-macros.rs -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![warn(unused_imports)] //~ missing documentation for crate [missing_docs] #![warn(missing_docs)] diff --git a/src/test/ui/lint/outer-forbid.rs b/src/test/ui/lint/outer-forbid.rs index 950533cca1..2a38565f60 100644 --- a/src/test/ui/lint/outer-forbid.rs +++ b/src/test/ui/lint/outer-forbid.rs @@ -7,12 +7,18 @@ #![forbid(unused, non_snake_case)] #[allow(unused_variables)] //~ ERROR overruled + //~| ERROR overruled + //~| ERROR overruled fn foo() {} #[allow(unused)] //~ ERROR overruled + //~| ERROR overruled + //~| ERROR overruled fn bar() {} #[allow(nonstandard_style)] //~ ERROR overruled + //~| ERROR overruled + //~| ERROR overruled fn main() { println!("hello forbidden world") } diff --git a/src/test/ui/lint/outer-forbid.stderr b/src/test/ui/lint/outer-forbid.stderr index 310a5d88f8..b2e638e7af 100644 --- a/src/test/ui/lint/outer-forbid.stderr +++ b/src/test/ui/lint/outer-forbid.stderr @@ -8,7 +8,7 @@ LL | #[allow(unused_variables)] | ^^^^^^^^^^^^^^^^ overruled by previous forbid error[E0453]: allow(unused) overruled by outer forbid(unused) - --> $DIR/outer-forbid.rs:12:9 + --> $DIR/outer-forbid.rs:14:9 | LL | #![forbid(unused, non_snake_case)] | ------ `forbid` level set here @@ -17,7 +17,7 @@ LL | #[allow(unused)] | ^^^^^^ overruled by previous forbid error[E0453]: allow(nonstandard_style) overruled by outer forbid(non_snake_case) - --> $DIR/outer-forbid.rs:15:9 + --> $DIR/outer-forbid.rs:19:9 | LL | #![forbid(unused, non_snake_case)] | -------------- `forbid` level set here @@ -25,6 +25,60 @@ LL | #![forbid(unused, non_snake_case)] LL | #[allow(nonstandard_style)] | ^^^^^^^^^^^^^^^^^ overruled by previous forbid -error: aborting due to 3 previous errors +error[E0453]: allow(unused_variables) overruled by outer forbid(unused) + --> $DIR/outer-forbid.rs:9:9 + | +LL | #![forbid(unused, non_snake_case)] + | ------ `forbid` level set here +LL | +LL | #[allow(unused_variables)] + | ^^^^^^^^^^^^^^^^ overruled by previous forbid + +error[E0453]: allow(unused) overruled by outer forbid(unused) + --> $DIR/outer-forbid.rs:14:9 + | +LL | #![forbid(unused, non_snake_case)] + | ------ `forbid` level set here +... +LL | #[allow(unused)] + | ^^^^^^ overruled by previous forbid + +error[E0453]: allow(nonstandard_style) overruled by outer forbid(non_snake_case) + --> $DIR/outer-forbid.rs:19:9 + | +LL | #![forbid(unused, non_snake_case)] + | -------------- `forbid` level set here +... +LL | #[allow(nonstandard_style)] + | ^^^^^^^^^^^^^^^^^ overruled by previous forbid + +error[E0453]: allow(unused_variables) overruled by outer forbid(unused) + --> $DIR/outer-forbid.rs:9:9 + | +LL | #![forbid(unused, non_snake_case)] + | ------ `forbid` level set here +LL | +LL | #[allow(unused_variables)] + | ^^^^^^^^^^^^^^^^ overruled by previous forbid + +error[E0453]: allow(unused) overruled by outer forbid(unused) + --> $DIR/outer-forbid.rs:14:9 + | +LL | #![forbid(unused, non_snake_case)] + | ------ `forbid` level set here +... +LL | #[allow(unused)] + | ^^^^^^ overruled by previous forbid + +error[E0453]: allow(nonstandard_style) overruled by outer forbid(non_snake_case) + --> $DIR/outer-forbid.rs:19:9 + | +LL | #![forbid(unused, non_snake_case)] + | -------------- `forbid` level set here +... +LL | #[allow(nonstandard_style)] + | ^^^^^^^^^^^^^^^^^ overruled by previous forbid + +error: aborting due to 9 previous errors For more information about this error, try `rustc --explain E0453`. diff --git a/src/test/ui/lint/reasons-erroneous.rs b/src/test/ui/lint/reasons-erroneous.rs index 21c2ddd5ef..03cf0679fc 100644 --- a/src/test/ui/lint/reasons-erroneous.rs +++ b/src/test/ui/lint/reasons-erroneous.rs @@ -2,24 +2,70 @@ #![warn(absolute_paths_not_starting_with_crate, reason = 0)] //~^ ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| NOTE reason must be a string literal +//~| NOTE reason must be a string literal //~| NOTE reason must be a string literal #![warn(anonymous_parameters, reason = b"consider these, for we have condemned them")] //~^ ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| NOTE reason must be a string literal +//~| NOTE reason must be a string literal //~| NOTE reason must be a string literal #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")] //~^ ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument //~| NOTE bad attribute argument #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")] //~^ ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument //~| NOTE bad attribute argument #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))] //~^ ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument +//~| NOTE bad attribute argument //~| NOTE bad attribute argument #![warn(ellipsis_inclusive_range_patterns, reason = "born barren", reason = "a freak growth")] //~^ ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| NOTE reason in lint attribute must come last +//~| NOTE reason in lint attribute must come last //~| NOTE reason in lint attribute must come last #![warn(keyword_idents, reason = "root in rubble", macro_use_extern_crate)] //~^ ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| ERROR malformed lint attribute +//~| NOTE reason in lint attribute must come last +//~| NOTE reason in lint attribute must come last //~| NOTE reason in lint attribute must come last #![warn(missing_copy_implementations, reason)] //~^ WARN unknown lint diff --git a/src/test/ui/lint/reasons-erroneous.stderr b/src/test/ui/lint/reasons-erroneous.stderr index 3f925f19ef..a84167fed1 100644 --- a/src/test/ui/lint/reasons-erroneous.stderr +++ b/src/test/ui/lint/reasons-erroneous.stderr @@ -5,49 +5,187 @@ LL | #![warn(absolute_paths_not_starting_with_crate, reason = 0)] | ^ reason must be a string literal error[E0452]: malformed lint attribute input - --> $DIR/reasons-erroneous.rs:6:40 + --> $DIR/reasons-erroneous.rs:10:40 | LL | #![warn(anonymous_parameters, reason = b"consider these, for we have condemned them")] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reason must be a string literal error[E0452]: malformed lint attribute input - --> $DIR/reasons-erroneous.rs:9:29 + --> $DIR/reasons-erroneous.rs:17:29 | LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument error[E0452]: malformed lint attribute input - --> $DIR/reasons-erroneous.rs:12:23 + --> $DIR/reasons-erroneous.rs:17:29 + | +LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:30:23 | LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument error[E0452]: malformed lint attribute input - --> $DIR/reasons-erroneous.rs:15:36 + --> $DIR/reasons-erroneous.rs:30:23 + | +LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:43:36 + | +LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:43:36 | LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument error[E0452]: malformed lint attribute input - --> $DIR/reasons-erroneous.rs:18:44 + --> $DIR/reasons-erroneous.rs:56:44 | LL | #![warn(ellipsis_inclusive_range_patterns, reason = "born barren", reason = "a freak growth")] | ^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last error[E0452]: malformed lint attribute input - --> $DIR/reasons-erroneous.rs:21:25 + --> $DIR/reasons-erroneous.rs:63:25 | LL | #![warn(keyword_idents, reason = "root in rubble", macro_use_extern_crate)] | ^^^^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last warning: unknown lint: `reason` - --> $DIR/reasons-erroneous.rs:24:39 + --> $DIR/reasons-erroneous.rs:70:39 | LL | #![warn(missing_copy_implementations, reason)] | ^^^^^^ | = note: `#[warn(unknown_lints)]` on by default -error: aborting due to 7 previous errors +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:3:58 + | +LL | #![warn(absolute_paths_not_starting_with_crate, reason = 0)] + | ^ reason must be a string literal + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:10:40 + | +LL | #![warn(anonymous_parameters, reason = b"consider these, for we have condemned them")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reason must be a string literal + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:17:29 + | +LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:17:29 + | +LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:30:23 + | +LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:30:23 + | +LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:43:36 + | +LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:43:36 + | +LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:56:44 + | +LL | #![warn(ellipsis_inclusive_range_patterns, reason = "born barren", reason = "a freak growth")] + | ^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:63:25 + | +LL | #![warn(keyword_idents, reason = "root in rubble", macro_use_extern_crate)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:3:58 + | +LL | #![warn(absolute_paths_not_starting_with_crate, reason = 0)] + | ^ reason must be a string literal + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:10:40 + | +LL | #![warn(anonymous_parameters, reason = b"consider these, for we have condemned them")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reason must be a string literal + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:17:29 + | +LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:17:29 + | +LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:30:23 + | +LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:30:23 + | +LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:43:36 + | +LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:43:36 + | +LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:56:44 + | +LL | #![warn(ellipsis_inclusive_range_patterns, reason = "born barren", reason = "a freak growth")] + | ^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last + +error[E0452]: malformed lint attribute input + --> $DIR/reasons-erroneous.rs:63:25 + | +LL | #![warn(keyword_idents, reason = "root in rubble", macro_use_extern_crate)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last + +error: aborting due to 30 previous errors For more information about this error, try `rustc --explain E0452`. diff --git a/src/test/ui/lint/reasons-forbidden.rs b/src/test/ui/lint/reasons-forbidden.rs index 19ab76707d..6a71176aab 100644 --- a/src/test/ui/lint/reasons-forbidden.rs +++ b/src/test/ui/lint/reasons-forbidden.rs @@ -3,6 +3,8 @@ #![forbid( unsafe_code, //~^ NOTE `forbid` level set here + //~| NOTE `forbid` level set here + //~| NOTE `forbid` level set here reason = "our errors & omissions insurance policy doesn't cover unsafe Rust" )] @@ -13,7 +15,13 @@ fn main() { #[allow(unsafe_code)] //~^ ERROR allow(unsafe_code) overruled by outer forbid(unsafe_code) + //~| ERROR allow(unsafe_code) overruled by outer forbid(unsafe_code) + //~| ERROR allow(unsafe_code) overruled by outer forbid(unsafe_code) //~| NOTE overruled by previous forbid + //~| NOTE overruled by previous forbid + //~| NOTE overruled by previous forbid + //~| NOTE our errors & omissions insurance policy doesn't cover unsafe Rust + //~| NOTE our errors & omissions insurance policy doesn't cover unsafe Rust //~| NOTE our errors & omissions insurance policy doesn't cover unsafe Rust unsafe { *a_billion_dollar_mistake diff --git a/src/test/ui/lint/reasons-forbidden.stderr b/src/test/ui/lint/reasons-forbidden.stderr index ea09e591cb..0954edea73 100644 --- a/src/test/ui/lint/reasons-forbidden.stderr +++ b/src/test/ui/lint/reasons-forbidden.stderr @@ -1,5 +1,5 @@ error[E0453]: allow(unsafe_code) overruled by outer forbid(unsafe_code) - --> $DIR/reasons-forbidden.rs:14:13 + --> $DIR/reasons-forbidden.rs:16:13 | LL | unsafe_code, | ----------- `forbid` level set here @@ -9,6 +9,28 @@ LL | #[allow(unsafe_code)] | = note: our errors & omissions insurance policy doesn't cover unsafe Rust -error: aborting due to previous error +error[E0453]: allow(unsafe_code) overruled by outer forbid(unsafe_code) + --> $DIR/reasons-forbidden.rs:16:13 + | +LL | unsafe_code, + | ----------- `forbid` level set here +... +LL | #[allow(unsafe_code)] + | ^^^^^^^^^^^ overruled by previous forbid + | + = note: our errors & omissions insurance policy doesn't cover unsafe Rust + +error[E0453]: allow(unsafe_code) overruled by outer forbid(unsafe_code) + --> $DIR/reasons-forbidden.rs:16:13 + | +LL | unsafe_code, + | ----------- `forbid` level set here +... +LL | #[allow(unsafe_code)] + | ^^^^^^^^^^^ overruled by previous forbid + | + = note: our errors & omissions insurance policy doesn't cover unsafe Rust + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0453`. diff --git a/src/test/ui/lint/reasons.rs b/src/test/ui/lint/reasons.rs index fa9f012c92..4722e85673 100644 --- a/src/test/ui/lint/reasons.rs +++ b/src/test/ui/lint/reasons.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![feature(lint_reasons)] diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.rs b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.rs new file mode 100644 index 0000000000..7ac0d035d5 --- /dev/null +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.rs @@ -0,0 +1,11 @@ +#![feature(non_ascii_idents)] +#![deny(uncommon_codepoints)] + +const µ: f64 = 0.000001; //~ ERROR identifier contains uncommon Unicode codepoints + +fn dijkstra() {} //~ ERROR identifier contains uncommon Unicode codepoints + +fn main() { + let ㇻㇲㇳ = "rust"; //~ ERROR identifier contains uncommon Unicode codepoints + println!("{}", ㇻㇲㇳ); //~ ERROR identifier contains uncommon Unicode codepoints +} diff --git a/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.stderr b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.stderr new file mode 100644 index 0000000000..4580d25665 --- /dev/null +++ b/src/test/ui/lint/rfc-2457-non-ascii-idents/lint-uncommon-codepoints.stderr @@ -0,0 +1,32 @@ +error: identifier contains uncommon Unicode codepoints + --> $DIR/lint-uncommon-codepoints.rs:4:7 + | +LL | const µ: f64 = 0.000001; + | ^ + | +note: lint level defined here + --> $DIR/lint-uncommon-codepoints.rs:2:9 + | +LL | #![deny(uncommon_codepoints)] + | ^^^^^^^^^^^^^^^^^^^ + +error: identifier contains uncommon Unicode codepoints + --> $DIR/lint-uncommon-codepoints.rs:6:4 + | +LL | fn dijkstra() {} + | ^^^^^^^ + +error: identifier contains uncommon Unicode codepoints + --> $DIR/lint-uncommon-codepoints.rs:9:9 + | +LL | let ㇻㇲㇳ = "rust"; + | ^^^^^^ + +error: identifier contains uncommon Unicode codepoints + --> $DIR/lint-uncommon-codepoints.rs:10:20 + | +LL | println!("{}", ㇻㇲㇳ); + | ^^^^^^ + +error: aborting due to 4 previous errors + diff --git a/src/test/ui/lint/suggestions.rs b/src/test/ui/lint/suggestions.rs index aa5518d1a7..29297d08dc 100644 --- a/src/test/ui/lint/suggestions.rs +++ b/src/test/ui/lint/suggestions.rs @@ -60,7 +60,7 @@ fn main() { match d { Equinox { warp_factor: warp_factor } => {} //~^ WARN this pattern is redundant - //~| HELP remove this + //~| HELP use shorthand field pattern } println!("{} {}", registry_no, b); } diff --git a/src/test/ui/lint/suggestions.stderr b/src/test/ui/lint/suggestions.stderr index 2042ed7553..e42ee0fa64 100644 --- a/src/test/ui/lint/suggestions.stderr +++ b/src/test/ui/lint/suggestions.stderr @@ -77,9 +77,7 @@ warning: the `warp_factor:` in this pattern is redundant --> $DIR/suggestions.rs:61:23 | LL | Equinox { warp_factor: warp_factor } => {} - | ------------^^^^^^^^^^^^ - | | - | help: remove this + | ^^^^^^^^^^^^^^^^^^^^^^^^ help: use shorthand field pattern: `warp_factor` | = note: `#[warn(non_shorthand_field_patterns)]` on by default diff --git a/src/test/ui/lint/type-overflow.rs b/src/test/ui/lint/type-overflow.rs index 79ffc82d32..e40321e56b 100644 --- a/src/test/ui/lint/type-overflow.rs +++ b/src/test/ui/lint/type-overflow.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![warn(overflowing_literals)] fn main() { diff --git a/src/test/ui/lint/uninitialized-zeroed.stderr b/src/test/ui/lint/uninitialized-zeroed.stderr index bdb5959953..169e77c8fa 100644 --- a/src/test/ui/lint/uninitialized-zeroed.stderr +++ b/src/test/ui/lint/uninitialized-zeroed.stderr @@ -12,7 +12,7 @@ note: lint level defined here | LL | #![deny(invalid_value)] | ^^^^^^^^^^^^^ - = note: References must be non-null + = note: references must be non-null error: the type `&'static T` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:30:32 @@ -23,7 +23,7 @@ LL | let _val: &'static T = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: References must be non-null + = note: references must be non-null error: the type `Wrap<&'static T>` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:32:38 @@ -34,7 +34,7 @@ LL | let _val: Wrap<&'static T> = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: References must be non-null (in this struct field) +note: references must be non-null (in this struct field) --> $DIR/uninitialized-zeroed.rs:18:18 | LL | struct Wrap<T> { wrapped: T } @@ -49,7 +49,7 @@ LL | let _val: Wrap<&'static T> = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: References must be non-null (in this struct field) +note: references must be non-null (in this struct field) --> $DIR/uninitialized-zeroed.rs:18:18 | LL | struct Wrap<T> { wrapped: T } @@ -64,7 +64,7 @@ LL | let _val: ! = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: The never type (`!`) has no valid value + = note: the `!` type has no valid value error: the type `!` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:41:23 @@ -75,7 +75,7 @@ LL | let _val: ! = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: The never type (`!`) has no valid value + = note: the `!` type has no valid value error: the type `(i32, !)` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:43:30 @@ -86,7 +86,7 @@ LL | let _val: (i32, !) = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: The never type (`!`) has no valid value + = note: the `!` type has no valid value error: the type `(i32, !)` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:44:30 @@ -97,7 +97,7 @@ LL | let _val: (i32, !) = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: The never type (`!`) has no valid value + = note: the `!` type has no valid value error: the type `Void` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:46:26 @@ -108,7 +108,7 @@ LL | let _val: Void = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: 0-variant enums have no valid value + = note: enums with no variants have no valid value error: the type `Void` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:47:26 @@ -119,7 +119,7 @@ LL | let _val: Void = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: 0-variant enums have no valid value + = note: enums with no variants have no valid value error: the type `&'static i32` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:49:34 @@ -130,7 +130,7 @@ LL | let _val: &'static i32 = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: References must be non-null + = note: references must be non-null error: the type `&'static i32` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:50:34 @@ -141,7 +141,7 @@ LL | let _val: &'static i32 = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: References must be non-null + = note: references must be non-null error: the type `Ref` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:52:25 @@ -152,7 +152,7 @@ LL | let _val: Ref = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: References must be non-null (in this struct field) +note: references must be non-null (in this struct field) --> $DIR/uninitialized-zeroed.rs:15:12 | LL | struct Ref(&'static i32); @@ -167,7 +167,7 @@ LL | let _val: Ref = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: References must be non-null (in this struct field) +note: references must be non-null (in this struct field) --> $DIR/uninitialized-zeroed.rs:15:12 | LL | struct Ref(&'static i32); @@ -182,7 +182,7 @@ LL | let _val: fn() = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: Function pointers must be non-null + = note: function pointers must be non-null error: the type `fn()` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:56:26 @@ -193,7 +193,7 @@ LL | let _val: fn() = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: Function pointers must be non-null + = note: function pointers must be non-null error: the type `Wrap<fn()>` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:58:32 @@ -204,7 +204,7 @@ LL | let _val: Wrap<fn()> = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: Function pointers must be non-null (in this struct field) +note: function pointers must be non-null (in this struct field) --> $DIR/uninitialized-zeroed.rs:18:18 | LL | struct Wrap<T> { wrapped: T } @@ -219,7 +219,7 @@ LL | let _val: Wrap<fn()> = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: Function pointers must be non-null (in this struct field) +note: function pointers must be non-null (in this struct field) --> $DIR/uninitialized-zeroed.rs:18:18 | LL | struct Wrap<T> { wrapped: T } @@ -234,7 +234,7 @@ LL | let _val: WrapEnum<fn()> = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: Function pointers must be non-null (in this enum field) +note: function pointers must be non-null (in this enum field) --> $DIR/uninitialized-zeroed.rs:19:28 | LL | enum WrapEnum<T> { Wrapped(T) } @@ -249,7 +249,7 @@ LL | let _val: WrapEnum<fn()> = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: Function pointers must be non-null (in this enum field) +note: function pointers must be non-null (in this enum field) --> $DIR/uninitialized-zeroed.rs:19:28 | LL | enum WrapEnum<T> { Wrapped(T) } @@ -264,7 +264,7 @@ LL | let _val: Wrap<(RefPair, i32)> = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: References must be non-null (in this struct field) +note: references must be non-null (in this struct field) --> $DIR/uninitialized-zeroed.rs:16:16 | LL | struct RefPair((&'static i32, i32)); @@ -279,7 +279,7 @@ LL | let _val: Wrap<(RefPair, i32)> = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: References must be non-null (in this struct field) +note: references must be non-null (in this struct field) --> $DIR/uninitialized-zeroed.rs:16:16 | LL | struct RefPair((&'static i32, i32)); @@ -294,7 +294,7 @@ LL | let _val: NonNull<i32> = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: std::ptr::NonNull<i32> must be non-null + = note: `std::ptr::NonNull<i32>` must be non-null error: the type `std::ptr::NonNull<i32>` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:68:34 @@ -305,7 +305,7 @@ LL | let _val: NonNull<i32> = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: std::ptr::NonNull<i32> must be non-null + = note: `std::ptr::NonNull<i32>` must be non-null error: the type `*const dyn std::marker::Send` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:70:37 @@ -316,7 +316,7 @@ LL | let _val: *const dyn Send = mem::zeroed(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: The vtable of a wide raw pointer must be non-null + = note: the vtable of a wide raw pointer must be non-null error: the type `*const dyn std::marker::Send` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:71:37 @@ -327,7 +327,7 @@ LL | let _val: *const dyn Send = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: The vtable of a wide raw pointer must be non-null + = note: the vtable of a wide raw pointer must be non-null error: the type `bool` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:75:26 @@ -338,7 +338,7 @@ LL | let _val: bool = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: Booleans must be `true` or `false` + = note: booleans must be either `true` or `false` error: the type `Wrap<char>` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:78:32 @@ -349,7 +349,7 @@ LL | let _val: Wrap<char> = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | -note: Characters must be a valid unicode codepoint (in this struct field) +note: characters must be a valid Unicode codepoint (in this struct field) --> $DIR/uninitialized-zeroed.rs:18:18 | LL | struct Wrap<T> { wrapped: T } @@ -364,7 +364,7 @@ LL | let _val: NonBig = mem::uninitialized(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: NonBig must be initialized inside its custom valid range + = note: `NonBig` must be initialized inside its custom valid range error: the type `&'static i32` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:84:34 @@ -375,7 +375,7 @@ LL | let _val: &'static i32 = mem::transmute(0usize); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: References must be non-null + = note: references must be non-null error: the type `&'static [i32]` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:85:36 @@ -386,7 +386,7 @@ LL | let _val: &'static [i32] = mem::transmute((0usize, 0usize)); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: References must be non-null + = note: references must be non-null error: the type `std::num::NonZeroU32` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:86:32 @@ -397,7 +397,7 @@ LL | let _val: NonZeroU32 = mem::transmute(0); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: std::num::NonZeroU32 must be non-null + = note: `std::num::NonZeroU32` must be non-null error: the type `std::ptr::NonNull<i32>` does not permit zero-initialization --> $DIR/uninitialized-zeroed.rs:89:34 @@ -408,7 +408,7 @@ LL | let _val: NonNull<i32> = MaybeUninit::zeroed().assume_init(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: std::ptr::NonNull<i32> must be non-null + = note: `std::ptr::NonNull<i32>` must be non-null error: the type `std::ptr::NonNull<i32>` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:90:34 @@ -419,7 +419,7 @@ LL | let _val: NonNull<i32> = MaybeUninit::uninit().assume_init(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: std::ptr::NonNull<i32> must be non-null + = note: `std::ptr::NonNull<i32>` must be non-null error: the type `bool` does not permit being left uninitialized --> $DIR/uninitialized-zeroed.rs:91:26 @@ -430,7 +430,7 @@ LL | let _val: bool = MaybeUninit::uninit().assume_init(); | this code causes undefined behavior when executed | help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done | - = note: Booleans must be `true` or `false` + = note: booleans must be either `true` or `false` error: aborting due to 35 previous errors diff --git a/src/test/ui/lint/unused_labels.rs b/src/test/ui/lint/unused_labels.rs index d234a2fb1a..8a3568f65f 100644 --- a/src/test/ui/lint/unused_labels.rs +++ b/src/test/ui/lint/unused_labels.rs @@ -2,7 +2,7 @@ // should also deal with the edge cases where a label is shadowed, // within nested loops -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![feature(label_break_value)] #![warn(unused_labels)] diff --git a/src/test/ui/lint/use-redundant.rs b/src/test/ui/lint/use-redundant.rs index 3b00424d2f..53315dcf63 100644 --- a/src/test/ui/lint/use-redundant.rs +++ b/src/test/ui/lint/use-redundant.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![warn(unused_imports)] use crate::foo::Bar; diff --git a/src/test/ui/lto-duplicate-symbols.rs b/src/test/ui/lto-duplicate-symbols.rs index c95e9fbf40..268cf26121 100644 --- a/src/test/ui/lto-duplicate-symbols.rs +++ b/src/test/ui/lto-duplicate-symbols.rs @@ -1,3 +1,4 @@ +// build-fail // aux-build:lto-duplicate-symbols1.rs // aux-build:lto-duplicate-symbols2.rs // error-pattern:Linking globals named 'foo': symbol multiply defined! diff --git a/src/test/ui/lub-glb/old-lub-glb-hr.rs b/src/test/ui/lub-glb/old-lub-glb-hr.rs index 6bf1fd41d7..bc7b787cd6 100644 --- a/src/test/ui/lub-glb/old-lub-glb-hr.rs +++ b/src/test/ui/lub-glb/old-lub-glb-hr.rs @@ -13,7 +13,7 @@ fn foo( ) { let z = match 22 { 0 => x, - _ => y, //~ ERROR match arms have incompatible types + _ => y, //~ ERROR `match` arms have incompatible types }; } diff --git a/src/test/ui/lub-glb/old-lub-glb-hr.stderr b/src/test/ui/lub-glb/old-lub-glb-hr.stderr index 1dce9df96d..6d5d511746 100644 --- a/src/test/ui/lub-glb/old-lub-glb-hr.stderr +++ b/src/test/ui/lub-glb/old-lub-glb-hr.stderr @@ -1,4 +1,4 @@ -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/old-lub-glb-hr.rs:16:14 | LL | let z = match 22 { diff --git a/src/test/ui/lub-glb/old-lub-glb-object.rs b/src/test/ui/lub-glb/old-lub-glb-object.rs index f303c07e6d..63bbae5999 100644 --- a/src/test/ui/lub-glb/old-lub-glb-object.rs +++ b/src/test/ui/lub-glb/old-lub-glb-object.rs @@ -9,7 +9,7 @@ fn foo( ) { let z = match 22 { 0 => x, - _ => y, //~ ERROR match arms have incompatible types + _ => y, //~ ERROR `match` arms have incompatible types }; } diff --git a/src/test/ui/lub-glb/old-lub-glb-object.stderr b/src/test/ui/lub-glb/old-lub-glb-object.stderr index 18de7a40ee..65c797f6b1 100644 --- a/src/test/ui/lub-glb/old-lub-glb-object.stderr +++ b/src/test/ui/lub-glb/old-lub-glb-object.stderr @@ -1,4 +1,4 @@ -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/old-lub-glb-object.rs:12:14 | LL | let z = match 22 { diff --git a/src/test/ui/macros/auxiliary/unstable-macros.rs b/src/test/ui/macros/auxiliary/unstable-macros.rs index e928dc705d..123e244a53 100644 --- a/src/test/ui/macros/auxiliary/unstable-macros.rs +++ b/src/test/ui/macros/auxiliary/unstable-macros.rs @@ -2,7 +2,7 @@ #![feature(staged_api)] #![stable(feature = "unit_test", since = "1.0.0")] -#[unstable(feature = "unstable_macros", issue = "0")] +#[unstable(feature = "unstable_macros", issue = "none")] #[macro_export] macro_rules! unstable_macro{ () => () } @@ -12,5 +12,5 @@ macro_rules! unstable_macro{ () => () } macro_rules! deprecated_macro{ () => () } // FIXME: Cannot use a `pub` macro 2.0 in a staged API crate due to reachability issues. -// #[unstable(feature = "unstable_macros", issue = "0")] +// #[unstable(feature = "unstable_macros", issue = "none")] // pub macro unstable_macro_modern() {} diff --git a/src/test/ui/macros/builtin-std-paths-fail.rs b/src/test/ui/macros/builtin-std-paths-fail.rs index 33de3d5184..c1a4e32a6d 100644 --- a/src/test/ui/macros/builtin-std-paths-fail.rs +++ b/src/test/ui/macros/builtin-std-paths-fail.rs @@ -1,6 +1,8 @@ #[derive( core::RustcDecodable, //~ ERROR could not find `RustcDecodable` in `core` + //~| ERROR could not find `RustcDecodable` in `core` core::RustcDecodable, //~ ERROR could not find `RustcDecodable` in `core` + //~| ERROR could not find `RustcDecodable` in `core` )] #[core::bench] //~ ERROR could not find `bench` in `core` #[core::global_allocator] //~ ERROR could not find `global_allocator` in `core` @@ -10,7 +12,9 @@ struct Core; #[derive( std::RustcDecodable, //~ ERROR could not find `RustcDecodable` in `std` + //~| ERROR could not find `RustcDecodable` in `std` std::RustcDecodable, //~ ERROR could not find `RustcDecodable` in `std` + //~| ERROR could not find `RustcDecodable` in `std` )] #[std::bench] //~ ERROR could not find `bench` in `std` #[std::global_allocator] //~ ERROR could not find `global_allocator` in `std` diff --git a/src/test/ui/macros/builtin-std-paths-fail.stderr b/src/test/ui/macros/builtin-std-paths-fail.stderr index 6de689076b..9831e46ec3 100644 --- a/src/test/ui/macros/builtin-std-paths-fail.stderr +++ b/src/test/ui/macros/builtin-std-paths-fail.stderr @@ -1,23 +1,23 @@ error[E0433]: failed to resolve: could not find `bench` in `core` - --> $DIR/builtin-std-paths-fail.rs:5:9 + --> $DIR/builtin-std-paths-fail.rs:7:9 | LL | #[core::bench] | ^^^^^ could not find `bench` in `core` error[E0433]: failed to resolve: could not find `global_allocator` in `core` - --> $DIR/builtin-std-paths-fail.rs:6:9 + --> $DIR/builtin-std-paths-fail.rs:8:9 | LL | #[core::global_allocator] | ^^^^^^^^^^^^^^^^ could not find `global_allocator` in `core` error[E0433]: failed to resolve: could not find `test_case` in `core` - --> $DIR/builtin-std-paths-fail.rs:7:9 + --> $DIR/builtin-std-paths-fail.rs:9:9 | LL | #[core::test_case] | ^^^^^^^^^ could not find `test_case` in `core` error[E0433]: failed to resolve: could not find `test` in `core` - --> $DIR/builtin-std-paths-fail.rs:8:9 + --> $DIR/builtin-std-paths-fail.rs:10:9 | LL | #[core::test] | ^^^^ could not find `test` in `core` @@ -29,47 +29,71 @@ LL | core::RustcDecodable, | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `core` error[E0433]: failed to resolve: could not find `RustcDecodable` in `core` - --> $DIR/builtin-std-paths-fail.rs:3:11 + --> $DIR/builtin-std-paths-fail.rs:4:11 + | +LL | core::RustcDecodable, + | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `core` + +error[E0433]: failed to resolve: could not find `RustcDecodable` in `core` + --> $DIR/builtin-std-paths-fail.rs:4:11 + | +LL | core::RustcDecodable, + | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `core` + +error[E0433]: failed to resolve: could not find `RustcDecodable` in `core` + --> $DIR/builtin-std-paths-fail.rs:2:11 | LL | core::RustcDecodable, | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `core` error[E0433]: failed to resolve: could not find `bench` in `std` - --> $DIR/builtin-std-paths-fail.rs:15:8 + --> $DIR/builtin-std-paths-fail.rs:19:8 | LL | #[std::bench] | ^^^^^ could not find `bench` in `std` error[E0433]: failed to resolve: could not find `global_allocator` in `std` - --> $DIR/builtin-std-paths-fail.rs:16:8 + --> $DIR/builtin-std-paths-fail.rs:20:8 | LL | #[std::global_allocator] | ^^^^^^^^^^^^^^^^ could not find `global_allocator` in `std` error[E0433]: failed to resolve: could not find `test_case` in `std` - --> $DIR/builtin-std-paths-fail.rs:17:8 + --> $DIR/builtin-std-paths-fail.rs:21:8 | LL | #[std::test_case] | ^^^^^^^^^ could not find `test_case` in `std` error[E0433]: failed to resolve: could not find `test` in `std` - --> $DIR/builtin-std-paths-fail.rs:18:8 + --> $DIR/builtin-std-paths-fail.rs:22:8 | LL | #[std::test] | ^^^^ could not find `test` in `std` error[E0433]: failed to resolve: could not find `RustcDecodable` in `std` - --> $DIR/builtin-std-paths-fail.rs:12:10 + --> $DIR/builtin-std-paths-fail.rs:14:10 + | +LL | std::RustcDecodable, + | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `std` + +error[E0433]: failed to resolve: could not find `RustcDecodable` in `std` + --> $DIR/builtin-std-paths-fail.rs:16:10 + | +LL | std::RustcDecodable, + | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `std` + +error[E0433]: failed to resolve: could not find `RustcDecodable` in `std` + --> $DIR/builtin-std-paths-fail.rs:16:10 | LL | std::RustcDecodable, | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `std` error[E0433]: failed to resolve: could not find `RustcDecodable` in `std` - --> $DIR/builtin-std-paths-fail.rs:13:10 + --> $DIR/builtin-std-paths-fail.rs:14:10 | LL | std::RustcDecodable, | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `std` -error: aborting due to 12 previous errors +error: aborting due to 16 previous errors For more information about this error, try `rustc --explain E0433`. diff --git a/src/test/ui/macros/issue-68058.rs b/src/test/ui/macros/issue-68058.rs new file mode 100644 index 0000000000..24da2620c2 --- /dev/null +++ b/src/test/ui/macros/issue-68058.rs @@ -0,0 +1,14 @@ +// check-pass + +macro_rules! foo { + ($doc: expr) => { + fn f() { + #[doc = $doc] + () + } + }; +} + +foo!("doc"); + +fn main() {} diff --git a/src/test/ui/macros/macro-local-data-key-priv.stderr b/src/test/ui/macros/macro-local-data-key-priv.stderr index 9b44421808..72994d1652 100644 --- a/src/test/ui/macros/macro-local-data-key-priv.stderr +++ b/src/test/ui/macros/macro-local-data-key-priv.stderr @@ -2,7 +2,14 @@ error[E0603]: constant `baz` is private --> $DIR/macro-local-data-key-priv.rs:8:10 | LL | bar::baz.with(|_| ()); - | ^^^ + | ^^^ this constant is private + | +note: the constant `baz` is defined here + --> $DIR/macro-local-data-key-priv.rs:4:5 + | +LL | thread_local!(static baz: f64 = 0.0); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error: aborting due to previous error diff --git a/src/test/ui/macros/macro-name-typo.rs b/src/test/ui/macros/macro-name-typo.rs index 1ddc419d30..b2892f3b6c 100644 --- a/src/test/ui/macros/macro-name-typo.rs +++ b/src/test/ui/macros/macro-name-typo.rs @@ -1,3 +1,7 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl fn main() { printlx!("oh noes!"); //~ ERROR cannot find } diff --git a/src/test/ui/macros/macro-name-typo.stderr b/src/test/ui/macros/macro-name-typo.stderr index ce2e1985b3..00afbde893 100644 --- a/src/test/ui/macros/macro-name-typo.stderr +++ b/src/test/ui/macros/macro-name-typo.stderr @@ -1,8 +1,13 @@ error: cannot find macro `printlx` in this scope - --> $DIR/macro-name-typo.rs:2:5 + --> $DIR/macro-name-typo.rs:6:5 | LL | printlx!("oh noes!"); | ^^^^^^^ help: a macro with a similar name exists: `println` + | + ::: $SRC_DIR/libstd/macros.rs:LL:COL + | +LL | macro_rules! println { + | -------------------- similarly named macro `println` defined here error: aborting due to previous error diff --git a/src/test/ui/macros/macro-path-prelude-fail-3.rs b/src/test/ui/macros/macro-path-prelude-fail-3.rs index 68eb350a95..3c3948ca3c 100644 --- a/src/test/ui/macros/macro-path-prelude-fail-3.rs +++ b/src/test/ui/macros/macro-path-prelude-fail-3.rs @@ -1,3 +1,7 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl fn main() { inline!(); //~ ERROR cannot find macro `inline` in this scope } diff --git a/src/test/ui/macros/macro-path-prelude-fail-3.stderr b/src/test/ui/macros/macro-path-prelude-fail-3.stderr index ec00760de6..5364590674 100644 --- a/src/test/ui/macros/macro-path-prelude-fail-3.stderr +++ b/src/test/ui/macros/macro-path-prelude-fail-3.stderr @@ -1,8 +1,13 @@ error: cannot find macro `inline` in this scope - --> $DIR/macro-path-prelude-fail-3.rs:2:5 + --> $DIR/macro-path-prelude-fail-3.rs:6:5 | LL | inline!(); | ^^^^^^ help: a macro with a similar name exists: `line` + | + ::: $SRC_DIR/libcore/macros/mod.rs:LL:COL + | +LL | macro_rules! line { + | ----------------- similarly named macro `line` defined here error: aborting due to previous error diff --git a/src/test/ui/macros/macro-stability-rpass.rs b/src/test/ui/macros/macro-stability-rpass.rs index 817bddf695..a5f538ba6b 100644 --- a/src/test/ui/macros/macro-stability-rpass.rs +++ b/src/test/ui/macros/macro-stability-rpass.rs @@ -5,7 +5,7 @@ #[macro_use] extern crate unstable_macros; -#[unstable(feature = "local_unstable", issue = "0")] +#[unstable(feature = "local_unstable", issue = "none")] macro_rules! local_unstable { () => () } fn main() { diff --git a/src/test/ui/macros/macro-stability.rs b/src/test/ui/macros/macro-stability.rs index ab927e419b..755f55c28d 100644 --- a/src/test/ui/macros/macro-stability.rs +++ b/src/test/ui/macros/macro-stability.rs @@ -4,10 +4,10 @@ #![feature(staged_api)] #[macro_use] extern crate unstable_macros; -#[unstable(feature = "local_unstable", issue = "0")] +#[unstable(feature = "local_unstable", issue = "none")] macro_rules! local_unstable { () => () } -#[unstable(feature = "local_unstable", issue = "0")] +#[unstable(feature = "local_unstable", issue = "none")] macro local_unstable_modern() {} #[stable(feature = "deprecated_macros", since = "1.0.0")] diff --git a/src/test/ui/macros/macro-use-wrong-name.stderr b/src/test/ui/macros/macro-use-wrong-name.stderr index 8b4e90a579..74fb519cc8 100644 --- a/src/test/ui/macros/macro-use-wrong-name.stderr +++ b/src/test/ui/macros/macro-use-wrong-name.stderr @@ -3,6 +3,11 @@ error: cannot find macro `macro_two` in this scope | LL | macro_two!(); | ^^^^^^^^^ help: a macro with a similar name exists: `macro_one` + | + ::: $DIR/auxiliary/two_macros.rs:2:1 + | +LL | macro_rules! macro_one { () => ("one") } + | ---------------------- similarly named macro `macro_one` defined here error: aborting due to previous error diff --git a/src/test/ui/macros/meta-item-absolute-path.rs b/src/test/ui/macros/meta-item-absolute-path.rs index 14d23be059..8ed911cbca 100644 --- a/src/test/ui/macros/meta-item-absolute-path.rs +++ b/src/test/ui/macros/meta-item-absolute-path.rs @@ -1,4 +1,5 @@ #[derive(::Absolute)] //~ ERROR failed to resolve + //~| ERROR failed to resolve struct S; fn main() {} diff --git a/src/test/ui/macros/meta-item-absolute-path.stderr b/src/test/ui/macros/meta-item-absolute-path.stderr index 711fa4dd40..c53971e245 100644 --- a/src/test/ui/macros/meta-item-absolute-path.stderr +++ b/src/test/ui/macros/meta-item-absolute-path.stderr @@ -4,6 +4,12 @@ error[E0433]: failed to resolve: maybe a missing crate `Absolute`? LL | #[derive(::Absolute)] | ^^^^^^^^ maybe a missing crate `Absolute`? -error: aborting due to previous error +error[E0433]: failed to resolve: maybe a missing crate `Absolute`? + --> $DIR/meta-item-absolute-path.rs:1:12 + | +LL | #[derive(::Absolute)] + | ^^^^^^^^ maybe a missing crate `Absolute`? + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0433`. diff --git a/src/test/ui/macros/trace_faulty_macros.stderr b/src/test/ui/macros/trace_faulty_macros.stderr index f06e6581ff..4e86daffb6 100644 --- a/src/test/ui/macros/trace_faulty_macros.stderr +++ b/src/test/ui/macros/trace_faulty_macros.stderr @@ -20,7 +20,7 @@ LL | my_faulty_macro!(); = note: to `my_faulty_macro ! (bcd) ;` = note: expanding `my_faulty_macro! { bcd }` -error: recursion limit reached while expanding the macro `my_recursive_macro` +error: recursion limit reached while expanding `my_recursive_macro!` --> $DIR/trace_faulty_macros.rs:22:9 | LL | my_recursive_macro!(); diff --git a/src/test/ui/main-wrong-type.rs b/src/test/ui/main-wrong-type.rs index dac4d4ac9a..31deba72af 100644 --- a/src/test/ui/main-wrong-type.rs +++ b/src/test/ui/main-wrong-type.rs @@ -4,5 +4,5 @@ struct S { } fn main(foo: S) { -//~^ ERROR: main function has wrong type [E0580] +//~^ ERROR: `main` function has wrong type [E0580] } diff --git a/src/test/ui/main-wrong-type.stderr b/src/test/ui/main-wrong-type.stderr index e75d4d7acf..43efaf884e 100644 --- a/src/test/ui/main-wrong-type.stderr +++ b/src/test/ui/main-wrong-type.stderr @@ -1,4 +1,4 @@ -error[E0580]: main function has wrong type +error[E0580]: `main` function has wrong type --> $DIR/main-wrong-type.rs:6:1 | LL | fn main(foo: S) { diff --git a/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs b/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs new file mode 100644 index 0000000000..24692f7cf5 --- /dev/null +++ b/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs @@ -0,0 +1,10 @@ +fn main() {} + +struct CLI { + #[derive(parse())] + //~^ ERROR traits in `#[derive(...)]` don't accept arguments + //~| ERROR cannot find derive macro `parse` in this scope + //~| ERROR cannot find derive macro `parse` in this scope + path: (), + //~^ ERROR `derive` may only be applied to structs, enums and unions +} diff --git a/src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr b/src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr new file mode 100644 index 0000000000..e8f96178d1 --- /dev/null +++ b/src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr @@ -0,0 +1,26 @@ +error: traits in `#[derive(...)]` don't accept arguments + --> $DIR/issue-69341-malformed-derive-inert.rs:4:19 + | +LL | #[derive(parse())] + | ^^ help: remove the arguments + +error: `derive` may only be applied to structs, enums and unions + --> $DIR/issue-69341-malformed-derive-inert.rs:8:5 + | +LL | path: (), + | ^^^^^^^^ + +error: cannot find derive macro `parse` in this scope + --> $DIR/issue-69341-malformed-derive-inert.rs:4:14 + | +LL | #[derive(parse())] + | ^^^^^ + +error: cannot find derive macro `parse` in this scope + --> $DIR/issue-69341-malformed-derive-inert.rs:4:14 + | +LL | #[derive(parse())] + | ^^^^^ + +error: aborting due to 4 previous errors + diff --git a/src/test/ui/malformed/malformed-interpolated.stderr b/src/test/ui/malformed/malformed-interpolated.stderr index bcd2ef545d..6f6ad4508b 100644 --- a/src/test/ui/malformed/malformed-interpolated.stderr +++ b/src/test/ui/malformed/malformed-interpolated.stderr @@ -4,7 +4,7 @@ error: suffixed literals are not allowed in attributes LL | check!(0u8); | ^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: unexpected token: `-0` --> $DIR/malformed-interpolated.rs:5:25 diff --git a/src/test/ui/marker_trait_attr/issue-61651-type-mismatch.rs b/src/test/ui/marker_trait_attr/issue-61651-type-mismatch.rs new file mode 100644 index 0000000000..0af706615e --- /dev/null +++ b/src/test/ui/marker_trait_attr/issue-61651-type-mismatch.rs @@ -0,0 +1,17 @@ +// check-pass +// Regression test for issue #61651 +// Verifies that we don't try to constrain inference +// variables due to the presence of multiple applicable +// marker trait impls + +#![feature(marker_trait_attr)] + +#[marker] // Remove this line and it works?!? +trait Foo<T> {} +impl Foo<u16> for u8 {} +impl Foo<[u8; 1]> for u8 {} +fn foo<T: Foo<U>, U>(_: T) -> U { unimplemented!() } + +fn main() { + let _: u16 = foo(0_u8); +} diff --git a/src/test/ui/match/match-arm-resolving-to-never.rs b/src/test/ui/match/match-arm-resolving-to-never.rs index 8f54023305..6ef249c052 100644 --- a/src/test/ui/match/match-arm-resolving-to-never.rs +++ b/src/test/ui/match/match-arm-resolving-to-never.rs @@ -14,6 +14,6 @@ fn main() { E::C => 3, E::D => 4, E::E => unimplemented!(""), - E::F => "", //~ ERROR match arms have incompatible types + E::F => "", //~ ERROR `match` arms have incompatible types }; } diff --git a/src/test/ui/match/match-arm-resolving-to-never.stderr b/src/test/ui/match/match-arm-resolving-to-never.stderr index 4482d5c6a7..3a723de9f6 100644 --- a/src/test/ui/match/match-arm-resolving-to-never.stderr +++ b/src/test/ui/match/match-arm-resolving-to-never.stderr @@ -1,4 +1,4 @@ -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/match-arm-resolving-to-never.rs:17:17 | LL | / match E::F { diff --git a/src/test/ui/match/match-range-fail-2.rs b/src/test/ui/match/match-range-fail-2.rs index 19e6e12958..792664e1db 100644 --- a/src/test/ui/match/match-range-fail-2.rs +++ b/src/test/ui/match/match-range-fail-2.rs @@ -6,16 +6,19 @@ fn main() { _ => { } }; //~^^^ ERROR lower range bound must be less than or equal to upper + //~| ERROR lower range bound must be less than or equal to upper match 5 { 0 .. 0 => { } _ => { } }; //~^^^ ERROR lower range bound must be less than upper + //~| ERROR lower range bound must be less than upper match 5u64 { 0xFFFF_FFFF_FFFF_FFFF ..= 1 => { } _ => { } }; //~^^^ ERROR lower range bound must be less than or equal to upper + //~| ERROR lower range bound must be less than or equal to upper } diff --git a/src/test/ui/match/match-range-fail-2.stderr b/src/test/ui/match/match-range-fail-2.stderr index 52a2bf2b34..7a0852d7e6 100644 --- a/src/test/ui/match/match-range-fail-2.stderr +++ b/src/test/ui/match/match-range-fail-2.stderr @@ -5,18 +5,36 @@ LL | 6 ..= 1 => { } | ^ lower bound larger than upper bound error[E0579]: lower range bound must be less than upper - --> $DIR/match-range-fail-2.rs:11:9 + --> $DIR/match-range-fail-2.rs:12:9 | LL | 0 .. 0 => { } | ^ error[E0030]: lower range bound must be less than or equal to upper - --> $DIR/match-range-fail-2.rs:17:9 + --> $DIR/match-range-fail-2.rs:19:9 | LL | 0xFFFF_FFFF_FFFF_FFFF ..= 1 => { } | ^^^^^^^^^^^^^^^^^^^^^ lower bound larger than upper bound -error: aborting due to 3 previous errors +error[E0030]: lower range bound must be less than or equal to upper + --> $DIR/match-range-fail-2.rs:5:9 + | +LL | 6 ..= 1 => { } + | ^ lower bound larger than upper bound + +error[E0579]: lower range bound must be less than upper + --> $DIR/match-range-fail-2.rs:12:9 + | +LL | 0 .. 0 => { } + | ^ + +error[E0030]: lower range bound must be less than or equal to upper + --> $DIR/match-range-fail-2.rs:19:9 + | +LL | 0xFFFF_FFFF_FFFF_FFFF ..= 1 => { } + | ^^^^^^^^^^^^^^^^^^^^^ lower bound larger than upper bound + +error: aborting due to 6 previous errors Some errors have detailed explanations: E0030, E0579. For more information about an error, try `rustc --explain E0030`. diff --git a/src/test/ui/match/match-range-fail.stderr b/src/test/ui/match/match-range-fail.stderr index adaaf29aae..64105dc73d 100644 --- a/src/test/ui/match/match-range-fail.stderr +++ b/src/test/ui/match/match-range-fail.stderr @@ -28,7 +28,9 @@ error[E0308]: mismatched types --> $DIR/match-range-fail.rs:18:9 | LL | 'c' ..= 100 => { } - | ^^^^^^^^^^^ expected integer, found `char` + | ^^^ --- this is of type `{integer}` + | | + | expected integer, found `char` error: aborting due to 4 previous errors diff --git a/src/test/ui/match/match-struct.stderr b/src/test/ui/match/match-struct.stderr index c23451d51e..a475bd5e58 100644 --- a/src/test/ui/match/match-struct.stderr +++ b/src/test/ui/match/match-struct.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/match-struct.rs:6:9 | LL | match (S { a: 1 }) { - | ------------ this match expression has type `S` + | ------------ this expression has type `S` LL | E::C(_) => (), | ^^^^^^^ expected struct `S`, found enum `E` diff --git a/src/test/ui/match/match-tag-unary.stderr b/src/test/ui/match/match-tag-unary.stderr index db5dcd2be3..31f77bdff8 100644 --- a/src/test/ui/match/match-tag-unary.stderr +++ b/src/test/ui/match/match-tag-unary.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn main() { let x: A = A::A(0); match x { B::B(y) => { } } } | - ^^^^^^^ expected enum `A`, found enum `B` | | - | this match expression has type `A` + | this expression has type `A` error: aborting due to previous error diff --git a/src/test/ui/match/match-type-err-first-arm.rs b/src/test/ui/match/match-type-err-first-arm.rs index d73c7e8402..e9027eb248 100644 --- a/src/test/ui/match/match-type-err-first-arm.rs +++ b/src/test/ui/match/match-type-err-first-arm.rs @@ -16,7 +16,7 @@ fn test_func2(n: i32) -> i32 { let x = match n { //~ NOTE `match` arms have incompatible types 12 => 'b', //~ NOTE this is found to be of type `char` _ => 42, - //~^ ERROR match arms have incompatible types + //~^ ERROR `match` arms have incompatible types //~| NOTE expected `char`, found integer }; x @@ -32,7 +32,7 @@ fn test_func3(n: i32) -> i32 { 6 => 'b', //~^ NOTE this and all prior arms are found to be of type `char` _ => 42, - //~^ ERROR match arms have incompatible types + //~^ ERROR `match` arms have incompatible types //~| NOTE expected `char`, found integer }; x @@ -44,7 +44,7 @@ fn test_func4() { x //~ NOTE this is found to be of type `u32` }, None => {} - //~^ ERROR match arms have incompatible types + //~^ ERROR `match` arms have incompatible types //~| NOTE expected `u32`, found `()` }; } diff --git a/src/test/ui/match/match-type-err-first-arm.stderr b/src/test/ui/match/match-type-err-first-arm.stderr index 1b3d8c61c8..fd489afa84 100644 --- a/src/test/ui/match/match-type-err-first-arm.stderr +++ b/src/test/ui/match/match-type-err-first-arm.stderr @@ -7,7 +7,7 @@ LL | match n { LL | 12 => 'b', | ^^^ expected `i32`, found `char` -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/match-type-err-first-arm.rs:18:14 | LL | let x = match n { @@ -21,7 +21,7 @@ LL | | LL | | }; | |_____- `match` arms have incompatible types -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/match-type-err-first-arm.rs:34:14 | LL | let x = match n { @@ -40,7 +40,7 @@ LL | | LL | | }; | |_____- `match` arms have incompatible types -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/match-type-err-first-arm.rs:46:17 | LL | / match Some(0u32) { diff --git a/src/test/ui/methods/method-ambig-two-traits-cross-crate.stderr b/src/test/ui/methods/method-ambig-two-traits-cross-crate.stderr index 9f46a722a5..fa3add81a2 100644 --- a/src/test/ui/methods/method-ambig-two-traits-cross-crate.stderr +++ b/src/test/ui/methods/method-ambig-two-traits-cross-crate.stderr @@ -9,9 +9,15 @@ note: candidate #1 is defined in an impl of the trait `Me2` for the type `usize` | LL | impl Me2 for usize { fn me(&self) -> usize { *self } } | ^^^^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `Me2::me(1_usize)` instead = note: candidate #2 is defined in an impl of the trait `ambig_impl_2_lib::Me` for the type `usize` - = help: to disambiguate the method call, write `ambig_impl_2_lib::Me::me(1_usize)` instead +help: disambiguate the method call for candidate #1 + | +LL | fn main() { Me2::me(&1_usize); } + | ^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | fn main() { ambig_impl_2_lib::Me::me(&1_usize); } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/methods/method-ambig-two-traits-from-bounds.stderr b/src/test/ui/methods/method-ambig-two-traits-from-bounds.stderr index 6c493c67e2..b6c81c2377 100644 --- a/src/test/ui/methods/method-ambig-two-traits-from-bounds.stderr +++ b/src/test/ui/methods/method-ambig-two-traits-from-bounds.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in the trait `A` | LL | trait A { fn foo(&self); } | ^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `A::foo(t)` instead note: candidate #2 is defined in the trait `B` --> $DIR/method-ambig-two-traits-from-bounds.rs:2:11 | LL | trait B { fn foo(&self); } | ^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `B::foo(t)` instead +help: disambiguate the method call for candidate #1 + | +LL | A::foo(t); + | ^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | B::foo(t); + | ^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/methods/method-ambig-two-traits-from-impls.stderr b/src/test/ui/methods/method-ambig-two-traits-from-impls.stderr index 0b3724e030..71c65f7ccc 100644 --- a/src/test/ui/methods/method-ambig-two-traits-from-impls.stderr +++ b/src/test/ui/methods/method-ambig-two-traits-from-impls.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in an impl of the trait `A` for the type `AB` | LL | fn foo(self) {} | ^^^^^^^^^^^^ - = help: to disambiguate the method call, write `A::foo(AB {})` instead note: candidate #2 is defined in an impl of the trait `B` for the type `AB` --> $DIR/method-ambig-two-traits-from-impls.rs:11:5 | LL | fn foo(self) {} | ^^^^^^^^^^^^ - = help: to disambiguate the method call, write `B::foo(AB {})` instead +help: disambiguate the method call for candidate #1 + | +LL | A::foo(AB {}); + | ^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | B::foo(AB {}); + | ^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/methods/method-ambig-two-traits-from-impls2.stderr b/src/test/ui/methods/method-ambig-two-traits-from-impls2.stderr index 81c99b33c8..44f8507150 100644 --- a/src/test/ui/methods/method-ambig-two-traits-from-impls2.stderr +++ b/src/test/ui/methods/method-ambig-two-traits-from-impls2.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in an impl of the trait `A` for the type `AB` | LL | fn foo() {} | ^^^^^^^^ - = help: to disambiguate the method call, write `A::foo(...)` instead note: candidate #2 is defined in an impl of the trait `B` for the type `AB` --> $DIR/method-ambig-two-traits-from-impls2.rs:11:5 | LL | fn foo() {} | ^^^^^^^^ - = help: to disambiguate the method call, write `B::foo(...)` instead +help: disambiguate the method call for candidate #1 + | +LL | A::foo(); + | ^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | B::foo(); + | ^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/methods/method-ambig-two-traits-with-default-method.stderr b/src/test/ui/methods/method-ambig-two-traits-with-default-method.stderr index dc8aef2503..3dbb173710 100644 --- a/src/test/ui/methods/method-ambig-two-traits-with-default-method.stderr +++ b/src/test/ui/methods/method-ambig-two-traits-with-default-method.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in an impl of the trait `Foo` for the type `usize` | LL | trait Foo { fn method(&self) {} } | ^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `Foo::method(1_usize)` instead note: candidate #2 is defined in an impl of the trait `Bar` for the type `usize` --> $DIR/method-ambig-two-traits-with-default-method.rs:6:13 | LL | trait Bar { fn method(&self) {} } | ^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `Bar::method(1_usize)` instead +help: disambiguate the method call for candidate #1 + | +LL | Foo::method(&1_usize); + | ^^^^^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | Bar::method(&1_usize); + | ^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/methods/method-call-err-msg.rs b/src/test/ui/methods/method-call-err-msg.rs index e0dec0a4a7..5ff4b41266 100644 --- a/src/test/ui/methods/method-call-err-msg.rs +++ b/src/test/ui/methods/method-call-err-msg.rs @@ -15,6 +15,6 @@ fn main() { let y = Foo; y.zero() - .take() //~ ERROR no method named `take` found for type `Foo` in the current scope + .take() //~ ERROR no method named `take` found .one(0); } diff --git a/src/test/ui/methods/method-call-err-msg.stderr b/src/test/ui/methods/method-call-err-msg.stderr index 94c27b7d17..7efdd91708 100644 --- a/src/test/ui/methods/method-call-err-msg.stderr +++ b/src/test/ui/methods/method-call-err-msg.stderr @@ -25,7 +25,7 @@ LL | fn two(self, _: isize, _: isize) -> Foo { self } LL | .two(0); | ^^^ expected 2 parameters -error[E0599]: no method named `take` found for type `Foo` in the current scope +error[E0599]: no method named `take` found for struct `Foo` in the current scope --> $DIR/method-call-err-msg.rs:18:7 | LL | pub struct Foo; diff --git a/src/test/ui/methods/method-call-lifetime-args-unresolved.stderr b/src/test/ui/methods/method-call-lifetime-args-unresolved.stderr index 67fd8d7a13..c9f235c4f7 100644 --- a/src/test/ui/methods/method-call-lifetime-args-unresolved.stderr +++ b/src/test/ui/methods/method-call-lifetime-args-unresolved.stderr @@ -1,6 +1,8 @@ error[E0261]: use of undeclared lifetime name `'a` --> $DIR/method-call-lifetime-args-unresolved.rs:2:15 | +LL | fn main() { + | - help: consider introducing lifetime `'a` here: `<'a>` LL | 0.clone::<'a>(); | ^^ undeclared lifetime diff --git a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr index c9d7da84e0..e7f295df8c 100644 --- a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr +++ b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr @@ -25,19 +25,28 @@ note: candidate #1 is defined in an impl of the trait `internal::X` for the type | LL | fn foo(self: Smaht<Self, u64>) -> u64 { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `internal::X::foo(x)` instead note: candidate #2 is defined in an impl of the trait `nuisance_foo::NuisanceFoo` for the type `_` --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:70:9 | LL | fn foo(self) {} | ^^^^^^^^^^^^ - = help: to disambiguate the method call, write `nuisance_foo::NuisanceFoo::foo(x)` instead note: candidate #3 is defined in the trait `FinalFoo` --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:57:5 | LL | fn foo(&self) -> u8; | ^^^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `FinalFoo::foo(x)` instead +help: disambiguate the method call for candidate #1 + | +LL | let z = internal::X::foo(x); + | ^^^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | let z = nuisance_foo::NuisanceFoo::foo(x); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #3 + | +LL | let z = FinalFoo::foo(x); + | ^^^^^^^^^^^^^^^^ error[E0308]: mismatched types --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:137:24 diff --git a/src/test/ui/mir/issue-67639-normalization-ice.rs b/src/test/ui/mir/issue-67639-normalization-ice.rs new file mode 100644 index 0000000000..21851a7252 --- /dev/null +++ b/src/test/ui/mir/issue-67639-normalization-ice.rs @@ -0,0 +1,34 @@ +// compile-flags: -Z mir-opt-level=3 +// build-pass + +// This used to ICE in const-prop due +// to an empty ParamEnv being used during normalization +// of a generic type + + +fn main() { + join_all::<u32>(); +} + +trait Foo { + type Item; +} + +impl Foo for u32 { + type Item = u8; +} + +trait Bar { + type Item2; +} + +impl Bar for u8 { + type Item2 = u64; +} + +fn join_all<I>() +where I: Foo, + I::Item: Bar +{ + Vec::<<I::Item as Bar>::Item2>::new(); // ICE occurs processing this line +} diff --git a/src/test/ui/mir/issue-67710-inline-projection.rs b/src/test/ui/mir/issue-67710-inline-projection.rs new file mode 100644 index 0000000000..37d8f2eac9 --- /dev/null +++ b/src/test/ui/mir/issue-67710-inline-projection.rs @@ -0,0 +1,17 @@ +// compile-flags: -Z mir-opt-level=2 +// build-pass + +// This used to ICE due to the inling pass not examining projections +// for references to locals + +pub fn parse(version: ()) { + p(&b'.', b"0"); +} +#[inline(always)] +fn p(byte: &u8, s: &[u8]) { + !(s[0] == *byte); +} + +fn main() { + parse(()); +} diff --git a/src/test/ui/mir/issue-67947.rs b/src/test/ui/mir/issue-67947.rs new file mode 100644 index 0000000000..79e75e655f --- /dev/null +++ b/src/test/ui/mir/issue-67947.rs @@ -0,0 +1,7 @@ +struct Bug { + A: [(); { *"" }.len()], + //~^ ERROR: cannot move a value of type str + //~| ERROR: cannot move out of a shared reference +} + +fn main() {} diff --git a/src/test/ui/mir/issue-67947.stderr b/src/test/ui/mir/issue-67947.stderr new file mode 100644 index 0000000000..d526218162 --- /dev/null +++ b/src/test/ui/mir/issue-67947.stderr @@ -0,0 +1,16 @@ +error[E0161]: cannot move a value of type str: the size of str cannot be statically determined + --> $DIR/issue-67947.rs:2:13 + | +LL | A: [(); { *"" }.len()], + | ^^^^^^^ + +error[E0507]: cannot move out of a shared reference + --> $DIR/issue-67947.rs:2:15 + | +LL | A: [(); { *"" }.len()], + | ^^^ move occurs because value has type `str`, which does not implement the `Copy` trait + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0161, E0507. +For more information about an error, try `rustc --explain E0161`. diff --git a/src/test/ui/mismatched_types/E0409.stderr b/src/test/ui/mismatched_types/E0409.stderr index 098fd74a39..2306fb3527 100644 --- a/src/test/ui/mismatched_types/E0409.stderr +++ b/src/test/ui/mismatched_types/E0409.stderr @@ -9,6 +9,8 @@ LL | (0, ref y) | (y, 0) => {} error[E0308]: mismatched types --> $DIR/E0409.rs:5:23 | +LL | match x { + | - this expression has type `({integer}, {integer})` LL | (0, ref y) | (y, 0) => {} | ^ expected `&{integer}`, found integer diff --git a/src/test/ui/mismatched_types/issue-36053-2.stderr b/src/test/ui/mismatched_types/issue-36053-2.stderr index da018aa894..f8d677b99d 100644 --- a/src/test/ui/mismatched_types/issue-36053-2.stderr +++ b/src/test/ui/mismatched_types/issue-36053-2.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `count` found for type `std::iter::Filter<std::iter::Fuse<std::iter::Once<&str>>, [closure@$DIR/issue-36053-2.rs:7:39: 7:53]>` in the current scope +error[E0599]: no method named `count` found for struct `std::iter::Filter<std::iter::Fuse<std::iter::Once<&str>>, [closure@$DIR/issue-36053-2.rs:7:39: 7:53]>` in the current scope --> $DIR/issue-36053-2.rs:7:55 | LL | once::<&str>("str").fuse().filter(|a: &str| true).count(); diff --git a/src/test/ui/mismatched_types/method-help-unsatisfied-bound.rs b/src/test/ui/mismatched_types/method-help-unsatisfied-bound.rs index 83cea16846..58ceaffc96 100644 --- a/src/test/ui/mismatched_types/method-help-unsatisfied-bound.rs +++ b/src/test/ui/mismatched_types/method-help-unsatisfied-bound.rs @@ -3,5 +3,5 @@ struct Foo; fn main() { let a: Result<(), Foo> = Ok(()); a.unwrap(); - //~^ ERROR no method named `unwrap` found for type `std::result::Result<(), Foo>` + //~^ ERROR no method named `unwrap` found } diff --git a/src/test/ui/mismatched_types/method-help-unsatisfied-bound.stderr b/src/test/ui/mismatched_types/method-help-unsatisfied-bound.stderr index 865092e4e9..bbfb000505 100644 --- a/src/test/ui/mismatched_types/method-help-unsatisfied-bound.stderr +++ b/src/test/ui/mismatched_types/method-help-unsatisfied-bound.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `unwrap` found for type `std::result::Result<(), Foo>` in the current scope +error[E0599]: no method named `unwrap` found for enum `std::result::Result<(), Foo>` in the current scope --> $DIR/method-help-unsatisfied-bound.rs:5:7 | LL | a.unwrap(); diff --git a/src/test/ui/missing/missing-block-hint.stderr b/src/test/ui/missing/missing-block-hint.stderr index ee86a3241e..0f635817bf 100644 --- a/src/test/ui/missing/missing-block-hint.stderr +++ b/src/test/ui/missing/missing-block-hint.stderr @@ -4,13 +4,13 @@ error: expected `{`, found `=>` LL | if (foo) => {} | -- ^^ expected `{` | | - | this `if` statement has a condition, but no block + | this `if` expression has a condition, but no block error: expected `{`, found `bar` --> $DIR/missing-block-hint.rs:7:13 | LL | if (foo) - | -- this `if` statement has a condition, but no block + | -- this `if` expression has a condition, but no block LL | bar; | ^^^- | | diff --git a/src/test/ui/missing/missing-items/missing-type-parameter.stderr b/src/test/ui/missing/missing-items/missing-type-parameter.stderr index be97f2373c..1219badc5b 100644 --- a/src/test/ui/missing/missing-items/missing-type-parameter.stderr +++ b/src/test/ui/missing/missing-items/missing-type-parameter.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/missing-type-parameter.rs:4:5 | LL | foo(); - | ^^^ cannot infer type for type parameter `X` + | ^^^ cannot infer type for type parameter `X` declared on the function `foo` error: aborting due to previous error diff --git a/src/test/ui/missing/missing-stability.rs b/src/test/ui/missing/missing-stability.rs index 469c22fdb1..0da5808b47 100644 --- a/src/test/ui/missing/missing-stability.rs +++ b/src/test/ui/missing/missing-stability.rs @@ -10,7 +10,7 @@ pub fn unmarked() { () } -#[unstable(feature = "unstable_test_feature", issue = "0")] +#[unstable(feature = "unstable_test_feature", issue = "none")] pub mod foo { // #[unstable] is inherited pub fn unmarked() {} diff --git a/src/test/ui/module-macro_use-arguments.rs b/src/test/ui/module-macro_use-arguments.rs index 6627b48eb6..121b492e25 100644 --- a/src/test/ui/module-macro_use-arguments.rs +++ b/src/test/ui/module-macro_use-arguments.rs @@ -1,4 +1,4 @@ -#[macro_use(foo, bar)] //~ ERROR arguments to macro_use are not allowed here +#[macro_use(foo, bar)] //~ ERROR arguments to `macro_use` are not allowed here mod foo { } diff --git a/src/test/ui/module-macro_use-arguments.stderr b/src/test/ui/module-macro_use-arguments.stderr index 2a75736a2c..af799cb6dd 100644 --- a/src/test/ui/module-macro_use-arguments.stderr +++ b/src/test/ui/module-macro_use-arguments.stderr @@ -1,4 +1,4 @@ -error: arguments to macro_use are not allowed here +error: arguments to `macro_use` are not allowed here --> $DIR/module-macro_use-arguments.rs:1:1 | LL | #[macro_use(foo, bar)] diff --git a/src/test/ui/moves/move-out-of-array-ref.rs b/src/test/ui/moves/move-out-of-array-ref.rs new file mode 100644 index 0000000000..343f00ff29 --- /dev/null +++ b/src/test/ui/moves/move-out-of-array-ref.rs @@ -0,0 +1,34 @@ +// Ensure that we cannot move out of a reference to a fixed-size array + +struct D { _x: u8 } + +impl Drop for D { fn drop(&mut self) { } } + +fn move_elem(a: &[D; 4]) -> D { + let [_, e, _, _] = *a; //~ ERROR cannot move + e +} + +fn move_subarr(a: &[D; 4]) -> [D; 2] { + let [_, s @ .. , _] = *a; //~ ERROR cannot move + s +} + +fn move_elem_mut(a: &mut [D; 4]) -> D { + let [_, e, _, _] = *a; //~ ERROR cannot move + e +} + +fn move_subarr_mut(a: &mut [D; 4]) -> [D; 2] { + let [_, s @ .. , _] = *a; //~ ERROR cannot move + s +} + +fn main() { + fn d() -> D { D { _x: 0 } } + + move_elem(&[d(), d(), d(), d()]); + move_subarr(&[d(), d(), d(), d()]); + move_elem_mut(&mut [d(), d(), d(), d()]); + move_subarr_mut(&mut [d(), d(), d(), d()]); +} diff --git a/src/test/ui/moves/move-out-of-array-ref.stderr b/src/test/ui/moves/move-out-of-array-ref.stderr new file mode 100644 index 0000000000..fd682e56ae --- /dev/null +++ b/src/test/ui/moves/move-out-of-array-ref.stderr @@ -0,0 +1,47 @@ +error[E0508]: cannot move out of type `[D; 4]`, a non-copy array + --> $DIR/move-out-of-array-ref.rs:8:24 + | +LL | let [_, e, _, _] = *a; + | - ^^ + | | | + | | cannot move out of here + | | help: consider borrowing here: `&*a` + | data moved here + | move occurs because `e` has type `D`, which does not implement the `Copy` trait + +error[E0508]: cannot move out of type `[D; 4]`, a non-copy array + --> $DIR/move-out-of-array-ref.rs:13:27 + | +LL | let [_, s @ .. , _] = *a; + | ------ ^^ + | | | + | | cannot move out of here + | | help: consider borrowing here: `&*a` + | data moved here + | move occurs because `s` has type `[D; 2]`, which does not implement the `Copy` trait + +error[E0508]: cannot move out of type `[D; 4]`, a non-copy array + --> $DIR/move-out-of-array-ref.rs:18:24 + | +LL | let [_, e, _, _] = *a; + | - ^^ + | | | + | | cannot move out of here + | | help: consider borrowing here: `&*a` + | data moved here + | move occurs because `e` has type `D`, which does not implement the `Copy` trait + +error[E0508]: cannot move out of type `[D; 4]`, a non-copy array + --> $DIR/move-out-of-array-ref.rs:23:27 + | +LL | let [_, s @ .. , _] = *a; + | ------ ^^ + | | | + | | cannot move out of here + | | help: consider borrowing here: `&*a` + | data moved here + | move occurs because `s` has type `[D; 2]`, which does not implement the `Copy` trait + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0508`. diff --git a/src/test/ui/moves/move-out-of-slice-2.rs b/src/test/ui/moves/move-out-of-slice-2.rs new file mode 100644 index 0000000000..e460246193 --- /dev/null +++ b/src/test/ui/moves/move-out-of-slice-2.rs @@ -0,0 +1,34 @@ +#![feature(slice_patterns, unsized_locals)] + +struct A; +#[derive(Clone, Copy)] +struct C; + +fn main() { + let a: Box<[A]> = Box::new([A]); + match *a { + //~^ ERROR cannot move out of type `[A]`, a non-copy slice + [a @ ..] => {}, + _ => {} + } + let b: Box<[A]> = Box::new([A, A, A]); + match *b { + //~^ ERROR cannot move out of type `[A]`, a non-copy slice + [_, _, b @ .., _] => {}, + _ => {} + } + + // `[C]` isn't `Copy`, even if `C` is. + let c: Box<[C]> = Box::new([C]); + match *c { + //~^ ERROR cannot move out of type `[C]`, a non-copy slice + [c @ ..] => {}, + _ => {} + } + let d: Box<[C]> = Box::new([C, C, C]); + match *d { + //~^ ERROR cannot move out of type `[C]`, a non-copy slice + [_, _, d @ .., _] => {}, + _ => {} + } +} diff --git a/src/test/ui/moves/move-out-of-slice-2.stderr b/src/test/ui/moves/move-out-of-slice-2.stderr new file mode 100644 index 0000000000..058f34b24a --- /dev/null +++ b/src/test/ui/moves/move-out-of-slice-2.stderr @@ -0,0 +1,51 @@ +error[E0508]: cannot move out of type `[A]`, a non-copy slice + --> $DIR/move-out-of-slice-2.rs:9:11 + | +LL | match *a { + | ^^ cannot move out of here +LL | +LL | [a @ ..] => {}, + | ------ + | | + | data moved here + | move occurs because `a` has type `[A]`, which does not implement the `Copy` trait + +error[E0508]: cannot move out of type `[A]`, a non-copy slice + --> $DIR/move-out-of-slice-2.rs:15:11 + | +LL | match *b { + | ^^ cannot move out of here +LL | +LL | [_, _, b @ .., _] => {}, + | ------ + | | + | data moved here + | move occurs because `b` has type `[A]`, which does not implement the `Copy` trait + +error[E0508]: cannot move out of type `[C]`, a non-copy slice + --> $DIR/move-out-of-slice-2.rs:23:11 + | +LL | match *c { + | ^^ cannot move out of here +LL | +LL | [c @ ..] => {}, + | ------ + | | + | data moved here + | move occurs because `c` has type `[C]`, which does not implement the `Copy` trait + +error[E0508]: cannot move out of type `[C]`, a non-copy slice + --> $DIR/move-out-of-slice-2.rs:29:11 + | +LL | match *d { + | ^^ cannot move out of here +LL | +LL | [_, _, d @ .., _] => {}, + | ------ + | | + | data moved here + | move occurs because `d` has type `[C]`, which does not implement the `Copy` trait + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0508`. diff --git a/src/test/ui/multi-panic.rs b/src/test/ui/multi-panic.rs index e4b41e4180..0f8bddf27f 100644 --- a/src/test/ui/multi-panic.rs +++ b/src/test/ui/multi-panic.rs @@ -10,7 +10,7 @@ fn check_for_no_backtrace(test: std::process::Output) { assert_eq!(it.next().map(|l| l.starts_with("thread '<unnamed>' panicked at")), Some(true)); assert_eq!(it.next(), Some("note: run with `RUST_BACKTRACE=1` \ - environment variable to display a backtrace.")); + environment variable to display a backtrace")); assert_eq!(it.next().map(|l| l.starts_with("thread 'main' panicked at")), Some(true)); assert_eq!(it.next(), None); } diff --git a/src/test/ui/namespace/namespace-mix.stderr b/src/test/ui/namespace/namespace-mix.stderr index 0484661a2e..13d727de44 100644 --- a/src/test/ui/namespace/namespace-mix.stderr +++ b/src/test/ui/namespace/namespace-mix.stderr @@ -24,6 +24,11 @@ error[E0423]: expected value, found type alias `xm1::S` | LL | check(xm1::S); | ^^^^^^ + | + ::: $DIR/auxiliary/namespace-mix.rs:3:5 + | +LL | pub struct TS(); + | ---------------- similarly named tuple struct `TS` defined here | = note: can't use a type alias as a constructor help: a tuple struct with a similar name exists @@ -64,6 +69,11 @@ error[E0423]: expected value, found struct variant `xm7::V` | LL | check(xm7::V); | ^^^^^^ did you mean `xm7::V { /* fields */ }`? + | + ::: $DIR/auxiliary/namespace-mix.rs:7:9 + | +LL | TV(), + | ---- similarly named tuple variant `TV` defined here | help: a tuple variant with a similar name exists | diff --git a/src/test/ui/never_type/feature-gate-never_type_fallback.stderr b/src/test/ui/never_type/feature-gate-never_type_fallback.stderr index 837e90d6ce..08e16f4693 100644 --- a/src/test/ui/never_type/feature-gate-never_type_fallback.stderr +++ b/src/test/ui/never_type/feature-gate-never_type_fallback.stderr @@ -3,8 +3,12 @@ error[E0277]: the trait bound `(): T` is not satisfied | LL | fn should_ret_unit() -> impl T { | ^^^^^^ the trait `T` is not implemented for `()` +LL | +LL | panic!() + | -------- this returned value is of type `!` | = note: the return type of a function must have a statically known size + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error: aborting due to previous error diff --git a/src/test/ui/never_type/issue-2149.rs b/src/test/ui/never_type/issue-2149.rs index d46f0e6179..d6426d2cfa 100644 --- a/src/test/ui/never_type/issue-2149.rs +++ b/src/test/ui/never_type/issue-2149.rs @@ -11,5 +11,5 @@ impl<A> VecMonad<A> for Vec<A> { } fn main() { ["hi"].bind(|x| [x] ); - //~^ ERROR no method named `bind` found for type `[&str; 1]` in the current scope + //~^ ERROR no method named `bind` found } diff --git a/src/test/ui/never_type/issue-2149.stderr b/src/test/ui/never_type/issue-2149.stderr index 8ce2ba0333..9645244751 100644 --- a/src/test/ui/never_type/issue-2149.stderr +++ b/src/test/ui/never_type/issue-2149.stderr @@ -6,7 +6,7 @@ LL | for elt in self { r = r + f(*elt); } | = help: the trait `std::ops::Add<std::vec::Vec<B>>` is not implemented for `()` -error[E0599]: no method named `bind` found for type `[&str; 1]` in the current scope +error[E0599]: no method named `bind` found for array `[&str; 1]` in the current scope --> $DIR/issue-2149.rs:13:12 | LL | ["hi"].bind(|x| [x] ); diff --git a/src/test/ui/nll/closure-requirements/escape-argument-callee.stderr b/src/test/ui/nll/closure-requirements/escape-argument-callee.stderr index 3d79ff0b70..b4e18c229f 100644 --- a/src/test/ui/nll/closure-requirements/escape-argument-callee.stderr +++ b/src/test/ui/nll/closure-requirements/escape-argument-callee.stderr @@ -1,4 +1,4 @@ -note: No external requirements +note: no external requirements --> $DIR/escape-argument-callee.rs:26:38 | LL | let mut closure = expect_sig(|p, y| *p = y); @@ -18,7 +18,7 @@ LL | let mut closure = expect_sig(|p, y| *p = y); | | has type `&'1 i32` | has type `&'_#2r mut &'2 i32` -note: No external requirements +note: no external requirements --> $DIR/escape-argument-callee.rs:20:1 | LL | / fn test() { diff --git a/src/test/ui/nll/closure-requirements/escape-argument.stderr b/src/test/ui/nll/closure-requirements/escape-argument.stderr index 37f04af637..533a17bdd1 100644 --- a/src/test/ui/nll/closure-requirements/escape-argument.stderr +++ b/src/test/ui/nll/closure-requirements/escape-argument.stderr @@ -1,4 +1,4 @@ -note: No external requirements +note: no external requirements --> $DIR/escape-argument.rs:26:38 | LL | let mut closure = expect_sig(|p, y| *p = y); @@ -9,7 +9,7 @@ LL | let mut closure = expect_sig(|p, y| *p = y); for<'r, 's> extern "rust-call" fn((&ReLateBound(DebruijnIndex(0), BrNamed('r)) mut &ReLateBound(DebruijnIndex(0), BrNamed('s)) i32, &ReLateBound(DebruijnIndex(0), BrNamed('s)) i32)), ] -note: No external requirements +note: no external requirements --> $DIR/escape-argument.rs:20:1 | LL | / fn test() { diff --git a/src/test/ui/nll/closure-requirements/escape-upvar-nested.stderr b/src/test/ui/nll/closure-requirements/escape-upvar-nested.stderr index 810c0286cf..60d02066e2 100644 --- a/src/test/ui/nll/closure-requirements/escape-upvar-nested.stderr +++ b/src/test/ui/nll/closure-requirements/escape-upvar-nested.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/escape-upvar-nested.rs:21:32 | LL | let mut closure1 = || p = &y; @@ -13,7 +13,7 @@ LL | let mut closure1 = || p = &y; = note: number of external vids: 4 = note: where '_#1r: '_#3r -note: External requirements +note: external requirements --> $DIR/escape-upvar-nested.rs:20:27 | LL | let mut closure = || { @@ -32,7 +32,7 @@ LL | | }; = note: number of external vids: 4 = note: where '_#1r: '_#3r -note: No external requirements +note: no external requirements --> $DIR/escape-upvar-nested.rs:13:1 | LL | / fn test() { diff --git a/src/test/ui/nll/closure-requirements/escape-upvar-ref.stderr b/src/test/ui/nll/closure-requirements/escape-upvar-ref.stderr index bf042769a0..f64ccf14ac 100644 --- a/src/test/ui/nll/closure-requirements/escape-upvar-ref.stderr +++ b/src/test/ui/nll/closure-requirements/escape-upvar-ref.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/escape-upvar-ref.rs:23:27 | LL | let mut closure = || p = &y; @@ -13,7 +13,7 @@ LL | let mut closure = || p = &y; = note: number of external vids: 4 = note: where '_#1r: '_#3r -note: No external requirements +note: no external requirements --> $DIR/escape-upvar-ref.rs:17:1 | LL | / fn test() { diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-fail-no-postdom.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-fail-no-postdom.stderr index 4e3aa352ff..e1e0cdc153 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-fail-no-postdom.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-fail-no-postdom.stderr @@ -1,4 +1,4 @@ -note: No external requirements +note: no external requirements --> $DIR/propagate-approximated-fail-no-postdom.rs:43:9 | LL | / |_outlives1, _outlives2, _outlives3, x, y| { @@ -27,7 +27,7 @@ LL | |_outlives1, _outlives2, _outlives3, x, y| { LL | demand_y(x, y, p) | ^^^^^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2` -note: No external requirements +note: no external requirements --> $DIR/propagate-approximated-fail-no-postdom.rs:38:1 | LL | / fn supply<'a, 'b, 'c>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>, cell_c: Cell<&'c u32>) { diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr index cd61b8b5e5..b6535024a4 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/propagate-approximated-ref.rs:43:47 | LL | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| { @@ -18,7 +18,7 @@ LL | | }); = note: number of external vids: 5 = note: where '_#1r: '_#2r -note: No external requirements +note: no external requirements --> $DIR/propagate-approximated-ref.rs:42:1 | LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) { diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.stderr index 259140c2e5..708e50de57 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.stderr @@ -1,4 +1,4 @@ -note: No external requirements +note: no external requirements --> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:21:15 | LL | foo(cell, |cell_a, cell_x| { @@ -23,7 +23,7 @@ LL | foo(cell, |cell_a, cell_x| { LL | cell_a.set(cell_x.get()); // forces 'x: 'a, error in closure | ^^^^^^^^^^^^^^^^^^^^^^^^ `cell_x` escapes the closure body here -note: No external requirements +note: no external requirements --> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:18:1 | LL | / fn case1() { @@ -37,7 +37,7 @@ LL | | } | = note: defining type: case1 -note: External requirements +note: external requirements --> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:35:15 | LL | foo(cell, |cell_a, cell_x| { @@ -53,7 +53,7 @@ LL | | }) = note: number of external vids: 2 = note: where '_#1r: '_#0r -note: No external requirements +note: no external requirements --> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:28:1 | LL | / fn case2() { diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-no-bound.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-no-bound.stderr index b3dd682e4f..17d33e82ba 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-no-bound.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-no-bound.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/propagate-approximated-shorter-to-static-no-bound.rs:32:47 | LL | establish_relationships(&cell_a, &cell_b, |_outlives, x, y| { @@ -19,7 +19,7 @@ LL | | }); = note: number of external vids: 4 = note: where '_#1r: '_#0r -note: No external requirements +note: no external requirements --> $DIR/propagate-approximated-shorter-to-static-no-bound.rs:31:1 | LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) { diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-wrong-bound.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-wrong-bound.stderr index ab12d08f7b..5dce8d087d 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-wrong-bound.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-wrong-bound.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/propagate-approximated-shorter-to-static-wrong-bound.rs:35:47 | LL | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| { @@ -19,7 +19,7 @@ LL | | }); = note: number of external vids: 5 = note: where '_#1r: '_#0r -note: No external requirements +note: no external requirements --> $DIR/propagate-approximated-shorter-to-static-wrong-bound.rs:34:1 | LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) { diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr index b2209e9cab..5c5d510805 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/propagate-approximated-val.rs:36:45 | LL | establish_relationships(cell_a, cell_b, |outlives1, outlives2, x, y| { @@ -18,7 +18,7 @@ LL | | }); = note: number of external vids: 5 = note: where '_#1r: '_#2r -note: No external requirements +note: no external requirements --> $DIR/propagate-approximated-val.rs:35:1 | LL | / fn test<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) { diff --git a/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.rs b/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.rs index 1df7c6114e..ac182be155 100644 --- a/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.rs +++ b/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.rs @@ -4,7 +4,7 @@ // regions is erased. // compile-flags:-Zborrowck=mir -Zverbose -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![feature(rustc_attrs)] diff --git a/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.stderr b/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.stderr index 55ee515a3a..c111e65183 100644 --- a/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/propagate-despite-same-free-region.rs:42:9 | LL | / |_outlives1, _outlives2, x, y| { @@ -16,7 +16,7 @@ LL | | }, = note: number of external vids: 4 = note: where '_#1r: '_#2r -note: No external requirements +note: no external requirements --> $DIR/propagate-despite-same-free-region.rs:39:1 | LL | / fn supply<'a>(cell_a: Cell<&'a u32>) { diff --git a/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-no-bounds.stderr b/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-no-bounds.stderr index 1c29af8c42..52df46ed34 100644 --- a/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-no-bounds.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-no-bounds.stderr @@ -1,4 +1,4 @@ -note: No external requirements +note: no external requirements --> $DIR/propagate-fail-to-approximate-longer-no-bounds.rs:35:47 | LL | establish_relationships(&cell_a, &cell_b, |_outlives, x, y| { @@ -27,7 +27,7 @@ LL | // Only works if 'x: 'y: LL | demand_y(x, y, x.get()) | ^^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2` -note: No external requirements +note: no external requirements --> $DIR/propagate-fail-to-approximate-longer-no-bounds.rs:34:1 | LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) { diff --git a/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-wrong-bounds.stderr b/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-wrong-bounds.stderr index afa0e9f619..0270cc40de 100644 --- a/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-wrong-bounds.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-fail-to-approximate-longer-wrong-bounds.stderr @@ -1,4 +1,4 @@ -note: No external requirements +note: no external requirements --> $DIR/propagate-fail-to-approximate-longer-wrong-bounds.rs:39:47 | LL | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| { @@ -27,7 +27,7 @@ LL | // Only works if 'x: 'y: LL | demand_y(x, y, x.get()) | ^^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2` -note: No external requirements +note: no external requirements --> $DIR/propagate-fail-to-approximate-longer-wrong-bounds.rs:38:1 | LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) { diff --git a/src/test/ui/nll/closure-requirements/propagate-from-trait-match.stderr b/src/test/ui/nll/closure-requirements/propagate-from-trait-match.stderr index 0dbb530e69..b705ad9009 100644 --- a/src/test/ui/nll/closure-requirements/propagate-from-trait-match.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-from-trait-match.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/propagate-from-trait-match.rs:32:36 | LL | establish_relationships(value, |value| { @@ -18,7 +18,7 @@ LL | | }); = note: number of external vids: 2 = note: where T: '_#1r -note: No external requirements +note: no external requirements --> $DIR/propagate-from-trait-match.rs:28:1 | LL | / fn supply<'a, T>(value: T) @@ -45,7 +45,7 @@ LL | | require(value); LL | | }); | |_____^ | - = help: consider adding an explicit lifetime bound `T: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `T: 'a`... error: aborting due to previous error diff --git a/src/test/ui/nll/closure-requirements/return-wrong-bound-region.stderr b/src/test/ui/nll/closure-requirements/return-wrong-bound-region.stderr index ca794d9266..79ed150152 100644 --- a/src/test/ui/nll/closure-requirements/return-wrong-bound-region.stderr +++ b/src/test/ui/nll/closure-requirements/return-wrong-bound-region.stderr @@ -1,4 +1,4 @@ -note: No external requirements +note: no external requirements --> $DIR/return-wrong-bound-region.rs:11:16 | LL | expect_sig(|a, b| b); // ought to return `a` @@ -18,7 +18,7 @@ LL | expect_sig(|a, b| b); // ought to return `a` | | has type `&'1 i32` | has type `&'2 i32` -note: No external requirements +note: no external requirements --> $DIR/return-wrong-bound-region.rs:10:1 | LL | / fn test() { diff --git a/src/test/ui/nll/constant.rs b/src/test/ui/nll/constant.rs index b1ea2c906d..039b6aaaf0 100644 --- a/src/test/ui/nll/constant.rs +++ b/src/test/ui/nll/constant.rs @@ -2,7 +2,7 @@ // arbitrary types without ICEs. // compile-flags:-Zborrowck=mir -// build-pass (FIXME(62277): could be check-pass?) +// check-pass const HI: &str = "hi"; diff --git a/src/test/ui/nll/drop-may-dangle.rs b/src/test/ui/nll/drop-may-dangle.rs index 0f3d27d066..1897589bd5 100644 --- a/src/test/ui/nll/drop-may-dangle.rs +++ b/src/test/ui/nll/drop-may-dangle.rs @@ -3,7 +3,7 @@ // including) the call to `use_x`. The `else` branch is not included. // compile-flags:-Zborrowck=mir -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![allow(warnings)] #![feature(dropck_eyepatch)] diff --git a/src/test/ui/nll/extra-unused-mut.rs b/src/test/ui/nll/extra-unused-mut.rs index e9c8df4621..db056a2285 100644 --- a/src/test/ui/nll/extra-unused-mut.rs +++ b/src/test/ui/nll/extra-unused-mut.rs @@ -1,6 +1,6 @@ // extra unused mut lint tests for #51918 -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![feature(generators, nll)] #![deny(unused_mut)] diff --git a/src/test/ui/nll/generator-distinct-lifetime.rs b/src/test/ui/nll/generator-distinct-lifetime.rs index 1bd39db35d..3102562cd0 100644 --- a/src/test/ui/nll/generator-distinct-lifetime.rs +++ b/src/test/ui/nll/generator-distinct-lifetime.rs @@ -6,7 +6,7 @@ // over a yield -- because the data that is borrowed (`*x`) is not // stored on the stack. -// build-pass (FIXME(62277): could be check-pass?) +// check-pass fn foo(x: &mut u32) { move || { diff --git a/src/test/ui/nll/issue-50343.rs b/src/test/ui/nll/issue-50343.rs index 55a2d231e1..dd0afbbdfc 100644 --- a/src/test/ui/nll/issue-50343.rs +++ b/src/test/ui/nll/issue-50343.rs @@ -3,6 +3,6 @@ #![deny(unused_mut)] fn main() { - vec![42].iter().map(|_| ()).count(); + vec![42].iter().map(drop).count(); vec![(42, 22)].iter().map(|(_x, _y)| ()).count(); } diff --git a/src/test/ui/nll/maybe-initialized-drop-uninitialized.rs b/src/test/ui/nll/maybe-initialized-drop-uninitialized.rs index 72212e9e70..e81479495c 100644 --- a/src/test/ui/nll/maybe-initialized-drop-uninitialized.rs +++ b/src/test/ui/nll/maybe-initialized-drop-uninitialized.rs @@ -1,5 +1,5 @@ // compile-flags: -Zborrowck=mir -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![allow(warnings)] diff --git a/src/test/ui/nll/projection-return.rs b/src/test/ui/nll/projection-return.rs index 5c34043469..017f53d145 100644 --- a/src/test/ui/nll/projection-return.rs +++ b/src/test/ui/nll/projection-return.rs @@ -1,5 +1,5 @@ // compile-flags:-Zborrowck=mir -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![feature(rustc_attrs)] diff --git a/src/test/ui/nll/relate_tys/hr-fn-aau-eq-abu.rs b/src/test/ui/nll/relate_tys/hr-fn-aau-eq-abu.rs index 1bbc896c27..527cca1339 100644 --- a/src/test/ui/nll/relate_tys/hr-fn-aau-eq-abu.rs +++ b/src/test/ui/nll/relate_tys/hr-fn-aau-eq-abu.rs @@ -6,7 +6,7 @@ // another -- effectively, the single lifetime `'a` is just inferred // to be the intersection of the two distinct lifetimes. // -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // compile-flags:-Zno-leak-check #![feature(nll)] diff --git a/src/test/ui/nll/relate_tys/hr-fn-aba-as-aaa.rs b/src/test/ui/nll/relate_tys/hr-fn-aba-as-aaa.rs index 4e8599b2e3..3a46188d11 100644 --- a/src/test/ui/nll/relate_tys/hr-fn-aba-as-aaa.rs +++ b/src/test/ui/nll/relate_tys/hr-fn-aba-as-aaa.rs @@ -2,7 +2,7 @@ // function returning always its first argument can be upcast to one // that returns either first or second argument. // -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // compile-flags:-Zno-leak-check #![feature(nll)] diff --git a/src/test/ui/nll/ty-outlives/impl-trait-outlives.stderr b/src/test/ui/nll/ty-outlives/impl-trait-outlives.stderr index 32a494c5d1..053aef951f 100644 --- a/src/test/ui/nll/ty-outlives/impl-trait-outlives.stderr +++ b/src/test/ui/nll/ty-outlives/impl-trait-outlives.stderr @@ -4,7 +4,7 @@ error[E0309]: the parameter type `T` may not live long enough LL | fn no_region<'a, T>(x: Box<T>) -> impl Debug + 'a | ^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `T: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `T: 'a`... error[E0309]: the parameter type `T` may not live long enough --> $DIR/impl-trait-outlives.rs:22:42 @@ -12,7 +12,7 @@ error[E0309]: the parameter type `T` may not live long enough LL | fn wrong_region<'a, 'b, T>(x: Box<T>) -> impl Debug + 'a | ^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `T: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `T: 'a`... error: aborting due to 2 previous errors diff --git a/src/test/ui/nll/ty-outlives/projection-body.rs b/src/test/ui/nll/ty-outlives/projection-body.rs index 148120d848..b03a539ebd 100644 --- a/src/test/ui/nll/ty-outlives/projection-body.rs +++ b/src/test/ui/nll/ty-outlives/projection-body.rs @@ -1,7 +1,7 @@ // Test that when we infer the lifetime to a subset of the fn body, it // works out. // -// build-pass (FIXME(62277): could be check-pass?) +// check-pass trait MyTrait<'a> { type Output; diff --git a/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr b/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr index c825227cda..84365465ed 100644 --- a/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/projection-no-regions-closure.rs:25:23 | LL | with_signature(x, |mut y| Box::new(y.next())) @@ -11,7 +11,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) = note: number of external vids: 3 = note: where <T as std::iter::Iterator>::Item: '_#2r -note: No external requirements +note: no external requirements --> $DIR/projection-no-regions-closure.rs:21:1 | LL | / fn no_region<'a, T>(x: Box<T>) -> Box<dyn Anything + 'a> @@ -31,9 +31,9 @@ error[E0309]: the associated type `<T as std::iter::Iterator>::Item` may not liv LL | with_signature(x, |mut y| Box::new(y.next())) | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `<T as std::iter::Iterator>::Item: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `<T as std::iter::Iterator>::Item: 'a`... -note: External requirements +note: external requirements --> $DIR/projection-no-regions-closure.rs:34:23 | LL | with_signature(x, |mut y| Box::new(y.next())) @@ -46,7 +46,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) = note: number of external vids: 3 = note: where <T as std::iter::Iterator>::Item: '_#2r -note: No external requirements +note: no external requirements --> $DIR/projection-no-regions-closure.rs:30:1 | LL | / fn correct_region<'a, T>(x: Box<T>) -> Box<dyn Anything + 'a> @@ -59,7 +59,7 @@ LL | | } | = note: defining type: correct_region::<'_#1r, T> -note: External requirements +note: external requirements --> $DIR/projection-no-regions-closure.rs:42:23 | LL | with_signature(x, |mut y| Box::new(y.next())) @@ -72,7 +72,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) = note: number of external vids: 4 = note: where <T as std::iter::Iterator>::Item: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-no-regions-closure.rs:38:1 | LL | / fn wrong_region<'a, 'b, T>(x: Box<T>) -> Box<dyn Anything + 'a> @@ -92,9 +92,9 @@ error[E0309]: the associated type `<T as std::iter::Iterator>::Item` may not liv LL | with_signature(x, |mut y| Box::new(y.next())) | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `<T as std::iter::Iterator>::Item: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `<T as std::iter::Iterator>::Item: 'a`... -note: External requirements +note: external requirements --> $DIR/projection-no-regions-closure.rs:52:23 | LL | with_signature(x, |mut y| Box::new(y.next())) @@ -107,7 +107,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) = note: number of external vids: 4 = note: where <T as std::iter::Iterator>::Item: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-no-regions-closure.rs:47:1 | LL | / fn outlives_region<'a, 'b, T>(x: Box<T>) -> Box<dyn Anything + 'a> diff --git a/src/test/ui/nll/ty-outlives/projection-no-regions-fn.stderr b/src/test/ui/nll/ty-outlives/projection-no-regions-fn.stderr index 190a2cdfc0..b0338de933 100644 --- a/src/test/ui/nll/ty-outlives/projection-no-regions-fn.stderr +++ b/src/test/ui/nll/ty-outlives/projection-no-regions-fn.stderr @@ -4,7 +4,7 @@ error[E0309]: the associated type `<T as std::iter::Iterator>::Item` may not liv LL | Box::new(x.next()) | ^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `<T as std::iter::Iterator>::Item: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `<T as std::iter::Iterator>::Item: 'a`... error[E0309]: the associated type `<T as std::iter::Iterator>::Item` may not live long enough --> $DIR/projection-no-regions-fn.rs:28:5 @@ -12,7 +12,7 @@ error[E0309]: the associated type `<T as std::iter::Iterator>::Item` may not liv LL | Box::new(x.next()) | ^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `<T as std::iter::Iterator>::Item: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `<T as std::iter::Iterator>::Item: 'a`... error: aborting due to 2 previous errors diff --git a/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr b/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr index 7226c520bf..118a849f98 100644 --- a/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/projection-one-region-closure.rs:45:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -13,7 +13,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: where T: '_#2r = note: where '_#1r: '_#2r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-closure.rs:41:1 | LL | / fn no_relationships_late<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -33,7 +33,7 @@ error[E0309]: the parameter type `T` may not live long enough LL | with_signature(cell, t, |cell, t| require(cell, t)); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `T: ReFree(DefId(0:15 ~ projection_one_region_closure[317d]::no_relationships_late[0]), BrNamed(DefId(0:16 ~ projection_one_region_closure[317d]::no_relationships_late[0]::'a[0]), 'a))`... + = help: consider adding an explicit lifetime bound `T: 'a`... error: lifetime may not live long enough --> $DIR/projection-one-region-closure.rs:45:39 @@ -48,7 +48,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); | = help: consider adding the following bound: `'b: 'a` -note: External requirements +note: external requirements --> $DIR/projection-one-region-closure.rs:56:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -62,7 +62,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: where T: '_#3r = note: where '_#2r: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-closure.rs:51:1 | LL | / fn no_relationships_early<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -82,7 +82,7 @@ error[E0309]: the parameter type `T` may not live long enough LL | with_signature(cell, t, |cell, t| require(cell, t)); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `T: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `T: 'a`... error: lifetime may not live long enough --> $DIR/projection-one-region-closure.rs:56:39 @@ -97,7 +97,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); | = help: consider adding the following bound: `'b: 'a` -note: External requirements +note: external requirements --> $DIR/projection-one-region-closure.rs:70:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -110,7 +110,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 4 = note: where <T as Anything<ReClosureBound('_#2r)>>::AssocType: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-closure.rs:62:1 | LL | / fn projection_outlives<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -124,7 +124,7 @@ LL | | } | = note: defining type: projection_outlives::<'_#1r, '_#2r, T> -note: External requirements +note: external requirements --> $DIR/projection-one-region-closure.rs:80:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -138,7 +138,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: where T: '_#3r = note: where '_#2r: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-closure.rs:74:1 | LL | / fn elements_outlive<'a, 'b, T>(cell: Cell<&'a ()>, t: T) diff --git a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr index 655995c1b8..59d8aa484b 100644 --- a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:37:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -12,7 +12,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 4 = note: where '_#1r: '_#2r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:33:1 | LL | / fn no_relationships_late<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -39,7 +39,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); | = help: consider adding the following bound: `'b: 'a` -note: External requirements +note: external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:47:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -52,7 +52,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 4 = note: where '_#2r: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:42:1 | LL | / fn no_relationships_early<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -79,7 +79,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); | = help: consider adding the following bound: `'b: 'a` -note: External requirements +note: external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:60:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -92,7 +92,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 4 = note: where <T as Anything<ReClosureBound('_#2r)>>::AssocType: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:52:1 | LL | / fn projection_outlives<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -106,7 +106,7 @@ LL | | } | = note: defining type: projection_outlives::<'_#1r, '_#2r, T> -note: External requirements +note: external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:69:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -119,7 +119,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 4 = note: where '_#2r: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:64:1 | LL | / fn elements_outlive<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -133,7 +133,7 @@ LL | | } | = note: defining type: elements_outlive::<'_#1r, '_#2r, T> -note: External requirements +note: external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:81:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -146,7 +146,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 3 = note: where '_#1r: '_#2r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-closure.rs:73:1 | LL | / fn one_region<'a, T>(cell: Cell<&'a ()>, t: T) diff --git a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-static-closure.rs b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-static-closure.rs index b9c9611e38..be1b653c38 100644 --- a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-static-closure.rs +++ b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-static-closure.rs @@ -3,7 +3,7 @@ // we don't even propagate constraints from the closures to the callers. // compile-flags:-Zborrowck=mir -Zverbose -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![allow(warnings)] #![feature(rustc_attrs)] diff --git a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-static-closure.stderr b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-static-closure.stderr index 2fb07b9279..c3b924577a 100644 --- a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-static-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-static-closure.stderr @@ -1,4 +1,4 @@ -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:36:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -10,7 +10,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); ] = note: late-bound region is '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:32:1 | LL | / fn no_relationships_late<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -23,7 +23,7 @@ LL | | } | = note: defining type: no_relationships_late::<'_#1r, T> -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:45:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -34,7 +34,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)), ] -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:40:1 | LL | / fn no_relationships_early<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -48,7 +48,7 @@ LL | | } | = note: defining type: no_relationships_early::<'_#1r, '_#2r, T> -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:64:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -59,7 +59,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)), ] -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:49:1 | LL | / fn projection_outlives<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -73,7 +73,7 @@ LL | | } | = note: defining type: projection_outlives::<'_#1r, '_#2r, T> -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:73:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -84,7 +84,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)), ] -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:68:1 | LL | / fn elements_outlive<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -98,7 +98,7 @@ LL | | } | = note: defining type: elements_outlive::<'_#1r, '_#2r, T> -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:85:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -109,7 +109,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T)), ] -note: No external requirements +note: no external requirements --> $DIR/projection-one-region-trait-bound-static-closure.rs:77:1 | LL | / fn one_region<'a, T>(cell: Cell<&'a ()>, t: T) diff --git a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr index 501a55e310..ff402f89ae 100644 --- a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:38:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -12,7 +12,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 5 = note: where <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#2r)>>::AssocType: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:34:1 | LL | / fn no_relationships_late<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T) @@ -32,9 +32,9 @@ error[E0309]: the associated type `<T as Anything<'_#5r, '_#6r>>::AssocType` may LL | with_signature(cell, t, |cell, t| require(cell, t)); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `<T as Anything<'_#5r, '_#6r>>::AssocType: ReFree(DefId(0:17 ~ projection_two_region_trait_bound_closure[317d]::no_relationships_late[0]), BrNamed(DefId(0:18 ~ projection_two_region_trait_bound_closure[317d]::no_relationships_late[0]::'a[0]), 'a))`... + = help: consider adding an explicit lifetime bound `<T as Anything<'_#5r, '_#6r>>::AssocType: 'a`... -note: External requirements +note: external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:48:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -47,7 +47,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 5 = note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r -note: No external requirements +note: no external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:43:1 | LL | / fn no_relationships_early<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T) @@ -67,9 +67,9 @@ error[E0309]: the associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may LL | with_signature(cell, t, |cell, t| require(cell, t)); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `<T as Anything<'_#6r, '_#7r>>::AssocType: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `<T as Anything<'_#6r, '_#7r>>::AssocType: 'a`... -note: External requirements +note: external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:61:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -82,7 +82,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 5 = note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r -note: No external requirements +note: no external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:53:1 | LL | / fn projection_outlives<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T) @@ -96,7 +96,7 @@ LL | | } | = note: defining type: projection_outlives::<'_#1r, '_#2r, '_#3r, T> -note: External requirements +note: external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:70:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -109,7 +109,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 5 = note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r -note: No external requirements +note: no external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:65:1 | LL | / fn elements_outlive1<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T) @@ -123,7 +123,7 @@ LL | | } | = note: defining type: elements_outlive1::<'_#1r, '_#2r, '_#3r, T> -note: External requirements +note: external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:79:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -136,7 +136,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 5 = note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r -note: No external requirements +note: no external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:74:1 | LL | / fn elements_outlive2<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T) @@ -150,7 +150,7 @@ LL | | } | = note: defining type: elements_outlive2::<'_#1r, '_#2r, '_#3r, T> -note: External requirements +note: external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:87:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -164,7 +164,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 4 = note: where <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#1r)>>::AssocType: '_#2r -note: No external requirements +note: no external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:83:1 | LL | / fn two_regions<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -191,7 +191,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); | = help: consider adding the following bound: `'b: 'a` -note: External requirements +note: external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:97:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -204,7 +204,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 4 = note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#2r)>>::AssocType: '_#3r -note: No external requirements +note: no external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:92:1 | LL | / fn two_regions_outlive<'a, 'b, T>(cell: Cell<&'a ()>, t: T) @@ -218,7 +218,7 @@ LL | | } | = note: defining type: two_regions_outlive::<'_#1r, '_#2r, T> -note: External requirements +note: external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:109:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); @@ -231,7 +231,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); = note: number of external vids: 3 = note: where <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#1r)>>::AssocType: '_#2r -note: No external requirements +note: no external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:101:1 | LL | / fn one_region<'a, T>(cell: Cell<&'a ()>, t: T) diff --git a/src/test/ui/nll/ty-outlives/projection-where-clause-env.rs b/src/test/ui/nll/ty-outlives/projection-where-clause-env.rs index 4613dd29ef..a411162325 100644 --- a/src/test/ui/nll/ty-outlives/projection-where-clause-env.rs +++ b/src/test/ui/nll/ty-outlives/projection-where-clause-env.rs @@ -4,7 +4,7 @@ // // Regression test for #53121. // -// build-pass (FIXME(62277): could be check-pass?) +// check-pass trait MyTrait<'a> { type Output; diff --git a/src/test/ui/nll/ty-outlives/projection-where-clause-trait.rs b/src/test/ui/nll/ty-outlives/projection-where-clause-trait.rs index 89328c2ef1..8d0c10a639 100644 --- a/src/test/ui/nll/ty-outlives/projection-where-clause-trait.rs +++ b/src/test/ui/nll/ty-outlives/projection-where-clause-trait.rs @@ -4,7 +4,7 @@ // MyTrait<'a>>::Output: 'a` outlives `'a` (because the trait says // so). // -// build-pass (FIXME(62277): could be check-pass?) +// check-pass trait MyTrait<'a> { type Output: 'a; diff --git a/src/test/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.stderr b/src/test/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.stderr index db0bca1dec..9b08a10749 100644 --- a/src/test/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.stderr +++ b/src/test/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/ty-param-closure-approximate-lower-bound.rs:24:24 | LL | twice(cell, value, |a, b| invoke(a, b)); @@ -11,7 +11,7 @@ LL | twice(cell, value, |a, b| invoke(a, b)); = note: number of external vids: 2 = note: where T: '_#1r -note: No external requirements +note: no external requirements --> $DIR/ty-param-closure-approximate-lower-bound.rs:22:1 | LL | / fn generic<T>(value: T) { @@ -22,7 +22,7 @@ LL | | } | = note: defining type: generic::<T> -note: External requirements +note: external requirements --> $DIR/ty-param-closure-approximate-lower-bound.rs:29:24 | LL | twice(cell, value, |a, b| invoke(a, b)); @@ -36,7 +36,7 @@ LL | twice(cell, value, |a, b| invoke(a, b)); = note: number of external vids: 3 = note: where T: '_#1r -note: No external requirements +note: no external requirements --> $DIR/ty-param-closure-approximate-lower-bound.rs:28:1 | LL | / fn generic_fail<'a, T>(cell: Cell<&'a ()>, value: T) { @@ -53,7 +53,7 @@ error[E0309]: the parameter type `T` may not live long enough LL | twice(cell, value, |a, b| invoke(a, b)); | ^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `T: ReFree(DefId(0:12 ~ ty_param_closure_approximate_lower_bound[317d]::generic_fail[0]), BrNamed(DefId(0:13 ~ ty_param_closure_approximate_lower_bound[317d]::generic_fail[0]::'a[0]), 'a))`... + = help: consider adding an explicit lifetime bound `T: 'a`... error: aborting due to previous error diff --git a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr index 0021d730f8..3cd1f43587 100644 --- a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr +++ b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/ty-param-closure-outlives-from-return-type.rs:26:23 | LL | with_signature(x, |y| y) @@ -11,7 +11,7 @@ LL | with_signature(x, |y| y) = note: number of external vids: 3 = note: where T: '_#2r -note: No external requirements +note: no external requirements --> $DIR/ty-param-closure-outlives-from-return-type.rs:15:1 | LL | / fn no_region<'a, T>(x: Box<T>) -> Box<dyn Debug + 'a> @@ -31,7 +31,7 @@ error[E0309]: the parameter type `T` may not live long enough LL | with_signature(x, |y| y) | ^^^^^ | - = help: consider adding an explicit lifetime bound `T: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `T: 'a`... error[E0309]: the parameter type `T` may not live long enough --> $DIR/ty-param-closure-outlives-from-return-type.rs:41:5 @@ -39,7 +39,7 @@ error[E0309]: the parameter type `T` may not live long enough LL | x | ^ | - = help: consider adding an explicit lifetime bound `T: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `T: 'a`... error: aborting due to 2 previous errors diff --git a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-where-clause.stderr b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-where-clause.stderr index 46fef8ee50..4740ed645f 100644 --- a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-where-clause.stderr +++ b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-where-clause.stderr @@ -1,4 +1,4 @@ -note: External requirements +note: external requirements --> $DIR/ty-param-closure-outlives-from-where-clause.rs:27:26 | LL | with_signature(a, b, |x, y| { @@ -19,7 +19,7 @@ LL | | }) = note: number of external vids: 3 = note: where T: '_#1r -note: No external requirements +note: no external requirements --> $DIR/ty-param-closure-outlives-from-where-clause.rs:26:1 | LL | / fn no_region<'a, T>(a: Cell<&'a ()>, b: T) { @@ -46,9 +46,9 @@ LL | | require(&x, &y) LL | | }) | |_____^ | - = help: consider adding an explicit lifetime bound `T: ReFree(DefId(0:11 ~ ty_param_closure_outlives_from_where_clause[317d]::no_region[0]), BrNamed(DefId(0:12 ~ ty_param_closure_outlives_from_where_clause[317d]::no_region[0]::'a[0]), 'a))`... + = help: consider adding an explicit lifetime bound `T: 'a`... -note: External requirements +note: external requirements --> $DIR/ty-param-closure-outlives-from-where-clause.rs:43:26 | LL | with_signature(a, b, |x, y| { @@ -68,7 +68,7 @@ LL | | }) = note: number of external vids: 3 = note: where T: '_#2r -note: No external requirements +note: no external requirements --> $DIR/ty-param-closure-outlives-from-where-clause.rs:39:1 | LL | / fn correct_region<'a, T>(a: Cell<&'a ()>, b: T) @@ -82,7 +82,7 @@ LL | | } | = note: defining type: correct_region::<'_#1r, T> -note: External requirements +note: external requirements --> $DIR/ty-param-closure-outlives-from-where-clause.rs:64:26 | LL | with_signature(a, b, |x, y| { @@ -101,7 +101,7 @@ LL | | }) = note: number of external vids: 4 = note: where T: '_#2r -note: No external requirements +note: no external requirements --> $DIR/ty-param-closure-outlives-from-where-clause.rs:60:1 | LL | / fn wrong_region<'a, 'b, T>(a: Cell<&'a ()>, b: T) @@ -126,9 +126,9 @@ LL | | require(&x, &y) LL | | }) | |_____^ | - = help: consider adding an explicit lifetime bound `T: ReFree(DefId(0:19 ~ ty_param_closure_outlives_from_where_clause[317d]::wrong_region[0]), BrNamed(DefId(0:20 ~ ty_param_closure_outlives_from_where_clause[317d]::wrong_region[0]::'a[0]), 'a))`... + = help: consider adding an explicit lifetime bound `T: 'a`... -note: External requirements +note: external requirements --> $DIR/ty-param-closure-outlives-from-where-clause.rs:77:26 | LL | with_signature(a, b, |x, y| { @@ -145,7 +145,7 @@ LL | | }) = note: number of external vids: 4 = note: where T: '_#3r -note: No external requirements +note: no external requirements --> $DIR/ty-param-closure-outlives-from-where-clause.rs:72:1 | LL | / fn outlives_region<'a, 'b, T>(a: Cell<&'a ()>, b: T) diff --git a/src/test/ui/nll/ty-outlives/ty-param-implied-bounds.rs b/src/test/ui/nll/ty-outlives/ty-param-implied-bounds.rs index a68c3cf12f..6547ae3981 100644 --- a/src/test/ui/nll/ty-outlives/ty-param-implied-bounds.rs +++ b/src/test/ui/nll/ty-outlives/ty-param-implied-bounds.rs @@ -1,5 +1,5 @@ // compile-flags:-Zborrowck=mir -Zverbose -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // Test that we assume that universal types like `T` outlive the // function body. diff --git a/src/test/ui/nll/user-annotations/downcast-infer.rs b/src/test/ui/nll/user-annotations/downcast-infer.rs index 3efea71363..b27429f4d1 100644 --- a/src/test/ui/nll/user-annotations/downcast-infer.rs +++ b/src/test/ui/nll/user-annotations/downcast-infer.rs @@ -1,4 +1,4 @@ -// build-pass (FIXME(62277): could be check-pass?) +// check-pass // Check that we don't try to downcast `_` when type-checking the annotation. fn main() { diff --git a/src/test/ui/no-send-res-ports.rs b/src/test/ui/no-send-res-ports.rs index 85d812dd61..6a1965f7cd 100644 --- a/src/test/ui/no-send-res-ports.rs +++ b/src/test/ui/no-send-res-ports.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl use std::thread; use std::rc::Rc; diff --git a/src/test/ui/no-send-res-ports.stderr b/src/test/ui/no-send-res-ports.stderr index f23a3bf832..65946ee8a2 100644 --- a/src/test/ui/no-send-res-ports.stderr +++ b/src/test/ui/no-send-res-ports.stderr @@ -1,18 +1,25 @@ error[E0277]: `std::rc::Rc<()>` cannot be sent between threads safely - --> $DIR/no-send-res-ports.rs:26:5 + --> $DIR/no-send-res-ports.rs:29:5 | -LL | thread::spawn(move|| { - | ^^^^^^^^^^^^^ `std::rc::Rc<()>` cannot be sent between threads safely +LL | thread::spawn(move|| { + | _____^^^^^^^^^^^^^_- + | | | + | | `std::rc::Rc<()>` cannot be sent between threads safely +LL | | +LL | | let y = x; +LL | | println!("{:?}", y); +LL | | }); + | |_____- within this `[closure@$DIR/no-send-res-ports.rs:29:19: 33:6 x:main::Foo]` | ::: $SRC_DIR/libstd/thread/mod.rs:LL:COL | -LL | F: FnOnce() -> T, F: Send + 'static, T: Send + 'static - | ---- required by this bound in `std::thread::spawn` +LL | F: Send + 'static, + | ---- required by this bound in `std::thread::spawn` | - = help: within `[closure@$DIR/no-send-res-ports.rs:26:19: 30:6 x:main::Foo]`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<()>` + = help: within `[closure@$DIR/no-send-res-ports.rs:29:19: 33:6 x:main::Foo]`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<()>` = note: required because it appears within the type `Port<()>` = note: required because it appears within the type `main::Foo` - = note: required because it appears within the type `[closure@$DIR/no-send-res-ports.rs:26:19: 30:6 x:main::Foo]` + = note: required because it appears within the type `[closure@$DIR/no-send-res-ports.rs:29:19: 33:6 x:main::Foo]` error: aborting due to previous error diff --git a/src/test/ui/non-copyable-void.stderr b/src/test/ui/non-copyable-void.stderr index b05c29c0d4..074ed66a26 100644 --- a/src/test/ui/non-copyable-void.stderr +++ b/src/test/ui/non-copyable-void.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `clone` found for type `libc::c_void` in the current scope +error[E0599]: no method named `clone` found for enum `libc::c_void` in the current scope --> $DIR/non-copyable-void.rs:11:23 | LL | let _z = (*y).clone(); diff --git a/src/test/ui/non-ice-error-on-worker-io-fail.rs b/src/test/ui/non-ice-error-on-worker-io-fail.rs new file mode 100644 index 0000000000..8af1774285 --- /dev/null +++ b/src/test/ui/non-ice-error-on-worker-io-fail.rs @@ -0,0 +1,37 @@ +// Issue #66530: We would ICE if someone compiled with `-o /dev/null`, +// because we would try to generate auxiliary files in `/dev/` (which +// at least the OS X file system rejects). +// +// An attempt to `-o` into a directory we cannot write into should indeed +// be an error; but not an ICE. + +// compile-flags: -o /dev/null + +// The error-pattern check occurs *before* normalization, and the error patterns +// are wildly different between build environments. So this is a cop-out (and we +// rely on the checking of the normalized stderr output as our actual +// "verification" of the diagnostic). + +// error-pattern: error + +// On Mac OS X, we get an error like the below +// normalize-stderr-test "failed to write bytecode to /dev/null.non_ice_error_on_worker_io_fail.*" -> "io error modifying /dev/" + +// On Linux, we get an error like the below +// normalize-stderr-test "couldn't create a temp dir.*" -> "io error modifying /dev/" + +// ignore-tidy-linelength +// ignore-windows - this is a unix-specific test +// ignore-emscripten - the file-system issues do not replicate here +// ignore-wasm - the file-system issues do not replicate here +// ignore-arm - the file-system issues do not replicate here, at least on armhf-gnu + +#![crate_type="lib"] + +#![cfg_attr(not(feature = "std"), no_std)] +pub mod task { + pub mod __internal { + use crate::task::Waker; + } + pub use core::task::Waker; +} diff --git a/src/test/ui/non-ice-error-on-worker-io-fail.stderr b/src/test/ui/non-ice-error-on-worker-io-fail.stderr new file mode 100644 index 0000000000..f5601ad03d --- /dev/null +++ b/src/test/ui/non-ice-error-on-worker-io-fail.stderr @@ -0,0 +1,6 @@ +warning: ignoring --out-dir flag due to -o flag + +error: io error modifying /dev/ + +error: aborting due to previous error + diff --git a/src/test/ui/non-integer-atomic.rs b/src/test/ui/non-integer-atomic.rs index 00d07b7fe4..26d7e66ae3 100644 --- a/src/test/ui/non-integer-atomic.rs +++ b/src/test/ui/non-integer-atomic.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(core_intrinsics)] #![allow(warnings)] #![crate_type = "rlib"] diff --git a/src/test/ui/non-integer-atomic.stderr b/src/test/ui/non-integer-atomic.stderr index 2a06b617ae..468e76da66 100644 --- a/src/test/ui/non-integer-atomic.stderr +++ b/src/test/ui/non-integer-atomic.stderr @@ -1,95 +1,95 @@ error[E0511]: invalid monomorphization of `atomic_load` intrinsic: expected basic integer type, found `bool` - --> $DIR/non-integer-atomic.rs:13:5 + --> $DIR/non-integer-atomic.rs:15:5 | LL | intrinsics::atomic_load(p); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_store` intrinsic: expected basic integer type, found `bool` - --> $DIR/non-integer-atomic.rs:18:5 + --> $DIR/non-integer-atomic.rs:20:5 | LL | intrinsics::atomic_store(p, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_xchg` intrinsic: expected basic integer type, found `bool` - --> $DIR/non-integer-atomic.rs:23:5 + --> $DIR/non-integer-atomic.rs:25:5 | LL | intrinsics::atomic_xchg(p, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_cxchg` intrinsic: expected basic integer type, found `bool` - --> $DIR/non-integer-atomic.rs:28:5 + --> $DIR/non-integer-atomic.rs:30:5 | LL | intrinsics::atomic_cxchg(p, v, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_load` intrinsic: expected basic integer type, found `Foo` - --> $DIR/non-integer-atomic.rs:33:5 + --> $DIR/non-integer-atomic.rs:35:5 | LL | intrinsics::atomic_load(p); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_store` intrinsic: expected basic integer type, found `Foo` - --> $DIR/non-integer-atomic.rs:38:5 + --> $DIR/non-integer-atomic.rs:40:5 | LL | intrinsics::atomic_store(p, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_xchg` intrinsic: expected basic integer type, found `Foo` - --> $DIR/non-integer-atomic.rs:43:5 + --> $DIR/non-integer-atomic.rs:45:5 | LL | intrinsics::atomic_xchg(p, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_cxchg` intrinsic: expected basic integer type, found `Foo` - --> $DIR/non-integer-atomic.rs:48:5 + --> $DIR/non-integer-atomic.rs:50:5 | LL | intrinsics::atomic_cxchg(p, v, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_load` intrinsic: expected basic integer type, found `&dyn std::ops::Fn()` - --> $DIR/non-integer-atomic.rs:53:5 + --> $DIR/non-integer-atomic.rs:55:5 | LL | intrinsics::atomic_load(p); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_store` intrinsic: expected basic integer type, found `&dyn std::ops::Fn()` - --> $DIR/non-integer-atomic.rs:58:5 + --> $DIR/non-integer-atomic.rs:60:5 | LL | intrinsics::atomic_store(p, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_xchg` intrinsic: expected basic integer type, found `&dyn std::ops::Fn()` - --> $DIR/non-integer-atomic.rs:63:5 + --> $DIR/non-integer-atomic.rs:65:5 | LL | intrinsics::atomic_xchg(p, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_cxchg` intrinsic: expected basic integer type, found `&dyn std::ops::Fn()` - --> $DIR/non-integer-atomic.rs:68:5 + --> $DIR/non-integer-atomic.rs:70:5 | LL | intrinsics::atomic_cxchg(p, v, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_load` intrinsic: expected basic integer type, found `[u8; 100]` - --> $DIR/non-integer-atomic.rs:73:5 + --> $DIR/non-integer-atomic.rs:75:5 | LL | intrinsics::atomic_load(p); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_store` intrinsic: expected basic integer type, found `[u8; 100]` - --> $DIR/non-integer-atomic.rs:78:5 + --> $DIR/non-integer-atomic.rs:80:5 | LL | intrinsics::atomic_store(p, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_xchg` intrinsic: expected basic integer type, found `[u8; 100]` - --> $DIR/non-integer-atomic.rs:83:5 + --> $DIR/non-integer-atomic.rs:85:5 | LL | intrinsics::atomic_xchg(p, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `atomic_cxchg` intrinsic: expected basic integer type, found `[u8; 100]` - --> $DIR/non-integer-atomic.rs:88:5 + --> $DIR/non-integer-atomic.rs:90:5 | LL | intrinsics::atomic_cxchg(p, v, v); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/noncopyable-class.stderr b/src/test/ui/noncopyable-class.stderr index c1c5021138..6c3c4a6ac9 100644 --- a/src/test/ui/noncopyable-class.stderr +++ b/src/test/ui/noncopyable-class.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `clone` found for type `Foo` in the current scope +error[E0599]: no method named `clone` found for struct `Foo` in the current scope --> $DIR/noncopyable-class.rs:34:16 | LL | struct Foo { diff --git a/src/test/ui/not-clone-closure.stderr b/src/test/ui/not-clone-closure.stderr index b66391b83b..20c7f81cf5 100644 --- a/src/test/ui/not-clone-closure.stderr +++ b/src/test/ui/not-clone-closure.stderr @@ -1,8 +1,14 @@ error[E0277]: the trait bound `S: std::clone::Clone` is not satisfied in `[closure@$DIR/not-clone-closure.rs:7:17: 9:6 a:S]` --> $DIR/not-clone-closure.rs:11:23 | -LL | let hello = hello.clone(); - | ^^^^^ within `[closure@$DIR/not-clone-closure.rs:7:17: 9:6 a:S]`, the trait `std::clone::Clone` is not implemented for `S` +LL | let hello = move || { + | _________________- +LL | | println!("Hello {}", a.0); +LL | | }; + | |_____- within this `[closure@$DIR/not-clone-closure.rs:7:17: 9:6 a:S]` +LL | +LL | let hello = hello.clone(); + | ^^^^^ within `[closure@$DIR/not-clone-closure.rs:7:17: 9:6 a:S]`, the trait `std::clone::Clone` is not implemented for `S` | = note: required because it appears within the type `[closure@$DIR/not-clone-closure.rs:7:17: 9:6 a:S]` diff --git a/src/test/ui/object-pointer-types.stderr b/src/test/ui/object-pointer-types.stderr index 2df628ecf8..855894b449 100644 --- a/src/test/ui/object-pointer-types.stderr +++ b/src/test/ui/object-pointer-types.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `owned` found for type `&dyn Foo` in the current scope +error[E0599]: no method named `owned` found for reference `&dyn Foo` in the current scope --> $DIR/object-pointer-types.rs:11:7 | LL | x.owned(); @@ -8,7 +8,7 @@ LL | x.owned(); = note: the following trait defines an item `owned`, perhaps you need to implement it: candidate #1: `Foo` -error[E0599]: no method named `owned` found for type `&mut dyn Foo` in the current scope +error[E0599]: no method named `owned` found for mutable reference `&mut dyn Foo` in the current scope --> $DIR/object-pointer-types.rs:17:7 | LL | x.owned(); @@ -18,7 +18,7 @@ LL | x.owned(); = note: the following trait defines an item `owned`, perhaps you need to implement it: candidate #1: `Foo` -error[E0599]: no method named `managed` found for type `std::boxed::Box<(dyn Foo + 'static)>` in the current scope +error[E0599]: no method named `managed` found for struct `std::boxed::Box<(dyn Foo + 'static)>` in the current scope --> $DIR/object-pointer-types.rs:23:7 | LL | x.managed(); diff --git a/src/test/ui/or-patterns/already-bound-name.stderr b/src/test/ui/or-patterns/already-bound-name.stderr index 360699a873..948c91370d 100644 --- a/src/test/ui/or-patterns/already-bound-name.stderr +++ b/src/test/ui/or-patterns/already-bound-name.stderr @@ -94,7 +94,9 @@ error[E0308]: mismatched types --> $DIR/already-bound-name.rs:33:31 | LL | let B(A(a, _) | B(a)) | A(a, A(a, _) | B(a)) = B(B(1)); - | ^ expected integer, found enum `E` + | ^ ------- this expression has type `E<E<{integer}>>` + | | + | expected integer, found enum `E` | = note: expected type `{integer}` found type `E<{integer}>` diff --git a/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.rs b/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.rs index d7c191bb5a..8b0be2e7a6 100644 --- a/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.rs +++ b/src/test/ui/or-patterns/exhaustiveness-non-exhaustive.rs @@ -1,5 +1,5 @@ #![feature(or_patterns)] -#![feature(slice_patterns)] + #![allow(incomplete_features)] #![deny(unreachable_patterns)] diff --git a/src/test/ui/or-patterns/exhaustiveness-pass.rs b/src/test/ui/or-patterns/exhaustiveness-pass.rs index ce0fe6fc2a..f0dc3447f3 100644 --- a/src/test/ui/or-patterns/exhaustiveness-pass.rs +++ b/src/test/ui/or-patterns/exhaustiveness-pass.rs @@ -1,5 +1,5 @@ #![feature(or_patterns)] -#![feature(slice_patterns)] + #![allow(incomplete_features)] #![deny(unreachable_patterns)] diff --git a/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.rs b/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.rs index 860c7a1bde..81bc1176f5 100644 --- a/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.rs +++ b/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.rs @@ -1,5 +1,5 @@ #![feature(or_patterns)] -#![feature(slice_patterns)] + #![allow(incomplete_features)] #![deny(unreachable_patterns)] diff --git a/src/test/ui/or-patterns/feature-gate-const-fn.rs b/src/test/ui/or-patterns/feature-gate-const-fn.rs new file mode 100644 index 0000000000..d73dcf2666 --- /dev/null +++ b/src/test/ui/or-patterns/feature-gate-const-fn.rs @@ -0,0 +1,36 @@ +#![feature(or_patterns)] +#![allow(incomplete_features)] + +const fn foo((Ok(a) | Err(a)): Result<i32, i32>) { + //~^ ERROR or-pattern is not allowed in a `const fn` + let x = Ok(3); + let Ok(y) | Err(y) = x; + //~^ ERROR or-pattern is not allowed in a `const fn` +} + +const X: () = { + let x = Ok(3); + let Ok(y) | Err(y) = x; + //~^ ERROR or-pattern is not allowed in a `const` +}; + +static Y: () = { + let x = Ok(3); + let Ok(y) | Err(y) = x; + //~^ ERROR or-pattern is not allowed in a `static` +}; + +static mut Z: () = { + let x = Ok(3); + let Ok(y) | Err(y) = x; + //~^ ERROR or-pattern is not allowed in a `static mut` +}; + +fn main() { + let _: [(); { + let x = Ok(3); + let Ok(y) | Err(y) = x; + //~^ ERROR or-pattern is not allowed in a `const` + 2 + }]; +} diff --git a/src/test/ui/or-patterns/feature-gate-const-fn.stderr b/src/test/ui/or-patterns/feature-gate-const-fn.stderr new file mode 100644 index 0000000000..26143d2f19 --- /dev/null +++ b/src/test/ui/or-patterns/feature-gate-const-fn.stderr @@ -0,0 +1,57 @@ +error[E0658]: or-pattern is not allowed in a `const fn` + --> $DIR/feature-gate-const-fn.rs:4:15 + | +LL | const fn foo((Ok(a) | Err(a)): Result<i32, i32>) { + | ^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/49146 + = help: add `#![feature(const_if_match)]` to the crate attributes to enable + +error[E0658]: or-pattern is not allowed in a `const fn` + --> $DIR/feature-gate-const-fn.rs:7:9 + | +LL | let Ok(y) | Err(y) = x; + | ^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/49146 + = help: add `#![feature(const_if_match)]` to the crate attributes to enable + +error[E0658]: or-pattern is not allowed in a `const` + --> $DIR/feature-gate-const-fn.rs:13:9 + | +LL | let Ok(y) | Err(y) = x; + | ^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/49146 + = help: add `#![feature(const_if_match)]` to the crate attributes to enable + +error[E0658]: or-pattern is not allowed in a `static` + --> $DIR/feature-gate-const-fn.rs:19:9 + | +LL | let Ok(y) | Err(y) = x; + | ^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/49146 + = help: add `#![feature(const_if_match)]` to the crate attributes to enable + +error[E0658]: or-pattern is not allowed in a `static mut` + --> $DIR/feature-gate-const-fn.rs:25:9 + | +LL | let Ok(y) | Err(y) = x; + | ^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/49146 + = help: add `#![feature(const_if_match)]` to the crate attributes to enable + +error[E0658]: or-pattern is not allowed in a `const` + --> $DIR/feature-gate-const-fn.rs:32:13 + | +LL | let Ok(y) | Err(y) = x; + | ^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/49146 + = help: add `#![feature(const_if_match)]` to the crate attributes to enable + +error: aborting due to 6 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/or-patterns/inconsistent-modes.stderr b/src/test/ui/or-patterns/inconsistent-modes.stderr index 0a36ed5548..7c1638ff94 100644 --- a/src/test/ui/or-patterns/inconsistent-modes.stderr +++ b/src/test/ui/or-patterns/inconsistent-modes.stderr @@ -60,7 +60,9 @@ error[E0308]: mismatched types --> $DIR/inconsistent-modes.rs:13:25 | LL | let Ok(ref a) | Err(ref mut a): Result<&u8, &mut u8> = Ok(&0); - | ^^^^^^^^^ types differ in mutability + | ^^^^^^^^^ -------------------- expected due to this + | | + | types differ in mutability | = note: expected type `&&u8` found type `&mut &mut u8` @@ -69,7 +71,9 @@ error[E0308]: mismatched types --> $DIR/inconsistent-modes.rs:16:31 | LL | let Ok((ref a, b)) | Err((ref mut a, ref b)) = Ok((0, &0)); - | ^^^^^^^^^ types differ in mutability + | ^^^^^^^^^ ----------- this expression has type `std::result::Result<({integer}, &{integer}), (_, _)>` + | | + | types differ in mutability | = note: expected type `&{integer}` found type `&mut _` diff --git a/src/test/ui/or-patterns/or-pattern-mismatch.stderr b/src/test/ui/or-patterns/or-pattern-mismatch.stderr index 253f3ef772..bc288e0625 100644 --- a/src/test/ui/or-patterns/or-pattern-mismatch.stderr +++ b/src/test/ui/or-patterns/or-pattern-mismatch.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/or-pattern-mismatch.rs:3:68 | LL | fn main() { match Blah::A(1, 1, 2) { Blah::A(_, x, y) | Blah::B(x, y) => { } } } - | ^ expected `usize`, found `isize` + | ---------------- this expression has type `Blah` ^ expected `usize`, found `isize` error: aborting due to previous error diff --git a/src/test/ui/or-patterns/or-patterns-syntactic-fail.rs b/src/test/ui/or-patterns/or-patterns-syntactic-fail.rs index b676ea851a..ce6836f30f 100644 --- a/src/test/ui/or-patterns/or-patterns-syntactic-fail.rs +++ b/src/test/ui/or-patterns/or-patterns-syntactic-fail.rs @@ -21,7 +21,7 @@ use E::*; fn no_top_level_or_patterns() { // We do *not* allow or-patterns at the top level of lambdas... - let _ = |A | B: E| (); //~ ERROR binary operation `|` cannot be applied to type `E` + let _ = |A | B: E| (); //~ ERROR no implementation for `E | ()` // -------- This looks like an or-pattern but is in fact `|A| (B: E | ())`. // ...and for now neither do we allow or-patterns at the top level of functions. diff --git a/src/test/ui/or-patterns/or-patterns-syntactic-fail.stderr b/src/test/ui/or-patterns/or-patterns-syntactic-fail.stderr index b6ff39d64d..e77d92e8b0 100644 --- a/src/test/ui/or-patterns/or-patterns-syntactic-fail.stderr +++ b/src/test/ui/or-patterns/or-patterns-syntactic-fail.stderr @@ -104,7 +104,7 @@ LL | #![feature(or_patterns)] | = note: `#[warn(incomplete_features)]` on by default -error[E0369]: binary operation `|` cannot be applied to type `E` +error[E0369]: no implementation for `E | ()` --> $DIR/or-patterns-syntactic-fail.rs:24:22 | LL | let _ = |A | B: E| (); diff --git a/src/test/ui/order-dependent-cast-inference.stderr b/src/test/ui/order-dependent-cast-inference.stderr index 081038c573..ad50b41586 100644 --- a/src/test/ui/order-dependent-cast-inference.stderr +++ b/src/test/ui/order-dependent-cast-inference.stderr @@ -6,7 +6,7 @@ LL | let mut y = 0 as *const _; | | | help: consider giving more type information | - = note: The type information given here is insufficient to check whether the pointer cast is valid + = note: the type information given here is insufficient to check whether the pointer cast is valid error: aborting due to previous error diff --git a/src/test/ui/packed/packed-struct-address-of-element.rs b/src/test/ui/packed/packed-struct-address-of-element.rs new file mode 100644 index 0000000000..812d23fb58 --- /dev/null +++ b/src/test/ui/packed/packed-struct-address-of-element.rs @@ -0,0 +1,37 @@ +// run-pass +#![allow(dead_code)] +#![deny(safe_packed_borrows)] +#![feature(raw_ref_op)] +// ignore-emscripten weird assertion? + +#[repr(packed)] +struct Foo1 { + bar: u8, + baz: usize +} + +#[repr(packed(2))] +struct Foo2 { + bar: u8, + baz: usize +} + +#[repr(C, packed(4))] +struct Foo4C { + bar: u8, + baz: usize +} + +pub fn main() { + let foo = Foo1 { bar: 1, baz: 2 }; + let brw = &raw const foo.baz; + unsafe { assert_eq!(brw.read_unaligned(), 2); } + + let foo = Foo2 { bar: 1, baz: 2 }; + let brw = &raw const foo.baz; + unsafe { assert_eq!(brw.read_unaligned(), 2); } + + let mut foo = Foo4C { bar: 1, baz: 2 }; + let brw = &raw mut foo.baz; + unsafe { assert_eq!(brw.read_unaligned(), 2); } +} diff --git a/src/test/ui/packed/packed-struct-borrow-element.rs b/src/test/ui/packed/packed-struct-borrow-element.rs index 6ac42ed0d4..0072b6191e 100644 --- a/src/test/ui/packed/packed-struct-borrow-element.rs +++ b/src/test/ui/packed/packed-struct-borrow-element.rs @@ -1,4 +1,4 @@ -// run-pass +// run-pass (note: this is spec-UB, but it works for now) #![allow(dead_code)] // ignore-emscripten weird assertion? diff --git a/src/test/ui/panic-handler/panic-handler-duplicate.rs b/src/test/ui/panic-handler/panic-handler-duplicate.rs index caa130ef46..bd99af999c 100644 --- a/src/test/ui/panic-handler/panic-handler-duplicate.rs +++ b/src/test/ui/panic-handler/panic-handler-duplicate.rs @@ -12,6 +12,6 @@ fn panic(info: &PanicInfo) -> ! { } #[lang = "panic_impl"] -fn panic2(info: &PanicInfo) -> ! { //~ ERROR duplicate lang item found: `panic_impl`. +fn panic2(info: &PanicInfo) -> ! { //~ ERROR found duplicate lang item `panic_impl` loop {} } diff --git a/src/test/ui/panic-handler/panic-handler-duplicate.stderr b/src/test/ui/panic-handler/panic-handler-duplicate.stderr index e9b1945364..9999e32764 100644 --- a/src/test/ui/panic-handler/panic-handler-duplicate.stderr +++ b/src/test/ui/panic-handler/panic-handler-duplicate.stderr @@ -1,4 +1,4 @@ -error[E0152]: duplicate lang item found: `panic_impl`. +error[E0152]: found duplicate lang item `panic_impl` --> $DIR/panic-handler-duplicate.rs:15:1 | LL | / fn panic2(info: &PanicInfo) -> ! { @@ -6,7 +6,7 @@ LL | | loop {} LL | | } | |_^ | -note: first defined here. +note: first defined here --> $DIR/panic-handler-duplicate.rs:10:1 | LL | / fn panic(info: &PanicInfo) -> ! { diff --git a/src/test/ui/panic-handler/panic-handler-std.rs b/src/test/ui/panic-handler/panic-handler-std.rs index fffb597787..0acc2722cb 100644 --- a/src/test/ui/panic-handler/panic-handler-std.rs +++ b/src/test/ui/panic-handler/panic-handler-std.rs @@ -1,4 +1,4 @@ -// error-pattern: duplicate lang item found: `panic_impl`. +// error-pattern: found duplicate lang item `panic_impl` use std::panic::PanicInfo; diff --git a/src/test/ui/panic-handler/panic-handler-std.stderr b/src/test/ui/panic-handler/panic-handler-std.stderr index e6d24348ca..ac56513fd4 100644 --- a/src/test/ui/panic-handler/panic-handler-std.stderr +++ b/src/test/ui/panic-handler/panic-handler-std.stderr @@ -1,4 +1,4 @@ -error[E0152]: duplicate lang item found: `panic_impl`. +error[E0152]: found duplicate lang item `panic_impl` --> $DIR/panic-handler-std.rs:7:1 | LL | / fn panic(info: PanicInfo) -> ! { @@ -6,7 +6,7 @@ LL | | loop {} LL | | } | |_^ | - = note: first defined in crate `std` (which `panic_handler_std` depends on). + = note: first defined in crate `std` (which `panic_handler_std` depends on) error: argument should be `&PanicInfo` --> $DIR/panic-handler-std.rs:7:16 diff --git a/src/test/ui/panic-runtime/abort-link-to-unwind-dylib.rs b/src/test/ui/panic-runtime/abort-link-to-unwind-dylib.rs index c2deeb7dfd..4b0f92456e 100644 --- a/src/test/ui/panic-runtime/abort-link-to-unwind-dylib.rs +++ b/src/test/ui/panic-runtime/abort-link-to-unwind-dylib.rs @@ -1,3 +1,4 @@ +// build-fail // compile-flags:-C panic=abort -C prefer-dynamic // ignore-musl - no dylibs here // ignore-cloudabi diff --git a/src/test/ui/panic-runtime/transitive-link-a-bunch.rs b/src/test/ui/panic-runtime/transitive-link-a-bunch.rs index 5d72771c2d..1848c986e3 100644 --- a/src/test/ui/panic-runtime/transitive-link-a-bunch.rs +++ b/src/test/ui/panic-runtime/transitive-link-a-bunch.rs @@ -1,3 +1,4 @@ +// build-fail // aux-build:panic-runtime-unwind.rs // aux-build:panic-runtime-abort.rs // aux-build:wants-panic-runtime-unwind.rs diff --git a/src/test/ui/panic-runtime/want-unwind-got-abort.rs b/src/test/ui/panic-runtime/want-unwind-got-abort.rs index 4c25c09d64..894a5eb38b 100644 --- a/src/test/ui/panic-runtime/want-unwind-got-abort.rs +++ b/src/test/ui/panic-runtime/want-unwind-got-abort.rs @@ -1,3 +1,4 @@ +// build-fail // error-pattern:is incompatible with this crate's strategy of `unwind` // aux-build:panic-runtime-abort.rs // aux-build:panic-runtime-lang-items.rs diff --git a/src/test/ui/panic-runtime/want-unwind-got-abort2.rs b/src/test/ui/panic-runtime/want-unwind-got-abort2.rs index 478af451e7..5955075bae 100644 --- a/src/test/ui/panic-runtime/want-unwind-got-abort2.rs +++ b/src/test/ui/panic-runtime/want-unwind-got-abort2.rs @@ -1,3 +1,4 @@ +// build-fail // error-pattern:is incompatible with this crate's strategy of `unwind` // aux-build:panic-runtime-abort.rs // aux-build:wants-panic-runtime-abort.rs diff --git a/src/test/ui/parse-error-correct.rs b/src/test/ui/parse-error-correct.rs index f167b3595d..13759a2351 100644 --- a/src/test/ui/parse-error-correct.rs +++ b/src/test/ui/parse-error-correct.rs @@ -1,5 +1,3 @@ -// compile-flags: -Z continue-parse-after-error - // Test that the parser is error correcting missing idents. Despite a parsing // error (or two), we still run type checking (and don't get extra errors there). diff --git a/src/test/ui/parse-error-correct.stderr b/src/test/ui/parse-error-correct.stderr index d593431d97..c54baf00b2 100644 --- a/src/test/ui/parse-error-correct.stderr +++ b/src/test/ui/parse-error-correct.stderr @@ -1,17 +1,17 @@ error: unexpected token: `;` - --> $DIR/parse-error-correct.rs:8:15 + --> $DIR/parse-error-correct.rs:6:15 | LL | let x = y.; | ^ error: unexpected token: `(` - --> $DIR/parse-error-correct.rs:9:15 + --> $DIR/parse-error-correct.rs:7:15 | LL | let x = y.(); | ^ error[E0618]: expected function, found `{integer}` - --> $DIR/parse-error-correct.rs:9:13 + --> $DIR/parse-error-correct.rs:7:13 | LL | let y = 42; | - `{integer}` defined here @@ -22,7 +22,7 @@ LL | let x = y.(); | call expression requires function error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields - --> $DIR/parse-error-correct.rs:11:15 + --> $DIR/parse-error-correct.rs:9:15 | LL | let x = y.foo; | ^^^ diff --git a/src/test/ui/parser-recovery-1.rs b/src/test/ui/parser-recovery-1.rs index 21d36048e6..7e26b4f2b6 100644 --- a/src/test/ui/parser-recovery-1.rs +++ b/src/test/ui/parser-recovery-1.rs @@ -1,5 +1,3 @@ -// compile-flags: -Z continue-parse-after-error - // Test that we can recover from missing braces in the parser. trait Foo { @@ -12,4 +10,4 @@ fn main() { let x = y.; //~^ ERROR unexpected token //~| ERROR cannot find value `y` in this scope -} //~ ERROR this file contains an un-closed delimiter +} //~ ERROR this file contains an unclosed delimiter diff --git a/src/test/ui/parser-recovery-1.stderr b/src/test/ui/parser-recovery-1.stderr index 83f8ef63c9..f56060c3e3 100644 --- a/src/test/ui/parser-recovery-1.stderr +++ b/src/test/ui/parser-recovery-1.stderr @@ -1,8 +1,8 @@ -error: this file contains an un-closed delimiter - --> $DIR/parser-recovery-1.rs:15:55 +error: this file contains an unclosed delimiter + --> $DIR/parser-recovery-1.rs:13:54 | LL | trait Foo { - | - un-closed delimiter + | - unclosed delimiter LL | fn bar() { | - this delimiter might not be properly closed... ... @@ -10,22 +10,22 @@ LL | } | - ...as it matches this but it has different indentation ... LL | } - | ^ + | ^ error: unexpected token: `;` - --> $DIR/parser-recovery-1.rs:12:15 + --> $DIR/parser-recovery-1.rs:10:15 | LL | let x = y.; | ^ error[E0425]: cannot find function `foo` in this scope - --> $DIR/parser-recovery-1.rs:7:17 + --> $DIR/parser-recovery-1.rs:5:17 | LL | let x = foo(); | ^^^ not found in this scope error[E0425]: cannot find value `y` in this scope - --> $DIR/parser-recovery-1.rs:12:13 + --> $DIR/parser-recovery-1.rs:10:13 | LL | let x = y.; | ^ not found in this scope diff --git a/src/test/ui/parser-recovery-2.rs b/src/test/ui/parser-recovery-2.rs index be686ccbc2..48b22afffe 100644 --- a/src/test/ui/parser-recovery-2.rs +++ b/src/test/ui/parser-recovery-2.rs @@ -1,11 +1,9 @@ -// compile-flags: -Z continue-parse-after-error - // Test that we can recover from mismatched braces in the parser. trait Foo { fn bar() { let x = foo(); //~ ERROR cannot find function `foo` in this scope - ) //~ ERROR incorrect close delimiter: `)` + ) //~ ERROR mismatched closing delimiter: `)` } fn main() { diff --git a/src/test/ui/parser-recovery-2.stderr b/src/test/ui/parser-recovery-2.stderr index c246fa80b0..cd3da4c71f 100644 --- a/src/test/ui/parser-recovery-2.stderr +++ b/src/test/ui/parser-recovery-2.stderr @@ -1,26 +1,26 @@ error: unexpected token: `;` - --> $DIR/parser-recovery-2.rs:12:15 + --> $DIR/parser-recovery-2.rs:10:15 | LL | let x = y.; | ^ -error: incorrect close delimiter: `)` - --> $DIR/parser-recovery-2.rs:8:5 +error: mismatched closing delimiter: `)` + --> $DIR/parser-recovery-2.rs:6:5 | LL | fn bar() { - | - un-closed delimiter + | - unclosed delimiter LL | let x = foo(); LL | ) - | ^ incorrect close delimiter + | ^ mismatched closing delimiter error[E0425]: cannot find function `foo` in this scope - --> $DIR/parser-recovery-2.rs:7:17 + --> $DIR/parser-recovery-2.rs:5:17 | LL | let x = foo(); | ^^^ not found in this scope error[E0425]: cannot find value `y` in this scope - --> $DIR/parser-recovery-2.rs:12:13 + --> $DIR/parser-recovery-2.rs:10:13 | LL | let x = y.; | ^ not found in this scope diff --git a/src/test/ui/parser/ascii-only-character-escape.rs b/src/test/ui/parser/ascii-only-character-escape.rs index f1b028ea8d..20d3edf125 100644 --- a/src/test/ui/parser/ascii-only-character-escape.rs +++ b/src/test/ui/parser/ascii-only-character-escape.rs @@ -1,5 +1,3 @@ -// compile-flags: -Z continue-parse-after-error - fn main() { let x = "\x80"; //~ ERROR may only be used let y = "\xff"; //~ ERROR may only be used diff --git a/src/test/ui/parser/ascii-only-character-escape.stderr b/src/test/ui/parser/ascii-only-character-escape.stderr index 3916779175..cf51b00cdc 100644 --- a/src/test/ui/parser/ascii-only-character-escape.stderr +++ b/src/test/ui/parser/ascii-only-character-escape.stderr @@ -1,17 +1,17 @@ error: this form of character escape may only be used with characters in the range [\x00-\x7f] - --> $DIR/ascii-only-character-escape.rs:4:14 + --> $DIR/ascii-only-character-escape.rs:2:14 | LL | let x = "\x80"; | ^^^^ error: this form of character escape may only be used with characters in the range [\x00-\x7f] - --> $DIR/ascii-only-character-escape.rs:5:14 + --> $DIR/ascii-only-character-escape.rs:3:14 | LL | let y = "\xff"; | ^^^^ error: this form of character escape may only be used with characters in the range [\x00-\x7f] - --> $DIR/ascii-only-character-escape.rs:6:14 + --> $DIR/ascii-only-character-escape.rs:4:14 | LL | let z = "\xe2"; | ^^^^ diff --git a/src/test/ui/parser/attr-stmt-expr-attr-bad.rs b/src/test/ui/parser/attr-stmt-expr-attr-bad.rs new file mode 100644 index 0000000000..118bff8144 --- /dev/null +++ b/src/test/ui/parser/attr-stmt-expr-attr-bad.rs @@ -0,0 +1,117 @@ +#![feature(half_open_range_patterns)] + +fn main() {} + +#[cfg(FALSE)] fn e() { let _ = box #![attr] 0; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = [#[attr]]; } +//~^ ERROR expected expression, found `]` +#[cfg(FALSE)] fn e() { let _ = foo#[attr](); } +//~^ ERROR expected one of +#[cfg(FALSE)] fn e() { let _ = foo(#![attr]); } +//~^ ERROR an inner attribute is not permitted in this context +//~| ERROR expected expression, found `)` +#[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); } +//~^ ERROR an inner attribute is not permitted in this context +//~| ERROR expected expression, found `)` +#[cfg(FALSE)] fn e() { let _ = 0 + #![attr] 0; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = !#![attr] 0; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = -#![attr] 0; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = x #![attr] as Y; } +//~^ ERROR expected one of +#[cfg(FALSE)] fn e() { let _ = || #![attr] foo; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = move || #![attr] foo; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = || #![attr] {foo}; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = move || #![attr] {foo}; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = #[attr] ..#[attr] 0; } +//~^ ERROR expected expression, found `..` +#[cfg(FALSE)] fn e() { let _ = #[attr] ..; } +//~^ ERROR expected expression, found `..` +#[cfg(FALSE)] fn e() { let _ = #[attr] &#![attr] 0; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = #[attr] &mut #![attr] 0; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = #[attr] if 0 {}; } +//~^ ERROR attributes are not yet allowed on `if` expressions +#[cfg(FALSE)] fn e() { let _ = if 0 #[attr] {}; } +//~^ ERROR expected `{`, found `#` +#[cfg(FALSE)] fn e() { let _ = if 0 {#![attr]}; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = if 0 {} #[attr] else {}; } +//~^ ERROR expected one of +#[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] {}; } +//~^ ERROR expected `{`, found `#` +#[cfg(FALSE)] fn e() { let _ = if 0 {} else {#![attr]}; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] if 0 {}; } +//~^ ERROR attributes are not yet allowed on `if` expressions +//~| ERROR expected `{`, found `#` +#[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 #[attr] {}; } +//~^ ERROR expected `{`, found `#` +#[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 {#![attr]}; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = #[attr] if let _ = 0 {}; } +//~^ ERROR attributes are not yet allowed on `if` expressions +#[cfg(FALSE)] fn e() { let _ = if let _ = 0 #[attr] {}; } +//~^ ERROR expected `{`, found `#` +#[cfg(FALSE)] fn e() { let _ = if let _ = 0 {#![attr]}; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} #[attr] else {}; } +//~^ ERROR expected one of +#[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] {}; } +//~^ ERROR expected `{`, found `#` +#[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else {#![attr]}; } +//~^ ERROR an inner attribute is not permitted in this context +#[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] if let _ = 0 {}; } +//~^ ERROR attributes are not yet allowed on `if` expressions +//~| ERROR expected `{`, found `#` +#[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 #[attr] {}; } +//~^ ERROR expected `{`, found `#` +#[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 {#![attr]}; } +//~^ ERROR an inner attribute is not permitted in this context + +#[cfg(FALSE)] fn s() { #[attr] #![attr] let _ = 0; } +//~^ ERROR an inner attribute is not permitted following an outer attribute +#[cfg(FALSE)] fn s() { #[attr] #![attr] 0; } +//~^ ERROR an inner attribute is not permitted following an outer attribute +#[cfg(FALSE)] fn s() { #[attr] #![attr] foo!(); } +//~^ ERROR an inner attribute is not permitted following an outer attribute +#[cfg(FALSE)] fn s() { #[attr] #![attr] foo![]; } +//~^ ERROR an inner attribute is not permitted following an outer attribute +#[cfg(FALSE)] fn s() { #[attr] #![attr] foo!{}; } +//~^ ERROR an inner attribute is not permitted following an outer attribute + +// FIXME: Allow attributes in pattern constexprs? +// note: requires parens in patterns to allow disambiguation + +#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } } +//~^ ERROR inclusive range with no end +//~| ERROR expected one of `=>`, `if`, or `|`, found `#` +#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } } +//~^ ERROR inclusive range with no end +//~| ERROR expected one of `=>`, `if`, or `|`, found `#` +#[cfg(FALSE)] fn e() { match 0 { 0..=-#[attr] 10 => () } } +//~^ ERROR unexpected token: `#` +#[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } } +//~^ ERROR inclusive range with no end +//~| ERROR expected one of `=>`, `if`, or `|`, found `#` + +#[cfg(FALSE)] fn e() { let _ = x.#![attr]foo(); } +//~^ ERROR unexpected token: `#` +//~| ERROR expected one of `.` +#[cfg(FALSE)] fn e() { let _ = x.#[attr]foo(); } +//~^ ERROR unexpected token: `#` +//~| ERROR expected one of `.` + +// make sure we don't catch this bug again... +#[cfg(FALSE)] fn e() { { fn foo() { #[attr]; } } } +//~^ ERROR expected statement after outer attribute +#[cfg(FALSE)] fn e() { { fn foo() { #[attr] } } } +//~^ ERROR expected statement after outer attribute diff --git a/src/test/ui/parser/attr-stmt-expr-attr-bad.stderr b/src/test/ui/parser/attr-stmt-expr-attr-bad.stderr new file mode 100644 index 0000000000..4775b9b7bc --- /dev/null +++ b/src/test/ui/parser/attr-stmt-expr-attr-bad.stderr @@ -0,0 +1,427 @@ +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:5:36 + | +LL | #[cfg(FALSE)] fn e() { let _ = box #![attr] 0; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: expected expression, found `]` + --> $DIR/attr-stmt-expr-attr-bad.rs:7:40 + | +LL | #[cfg(FALSE)] fn e() { let _ = [#[attr]]; } + | ^ expected expression + +error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, or an operator, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:9:35 + | +LL | #[cfg(FALSE)] fn e() { let _ = foo#[attr](); } + | ^ expected one of 7 possible tokens + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:11:36 + | +LL | #[cfg(FALSE)] fn e() { let _ = foo(#![attr]); } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: expected expression, found `)` + --> $DIR/attr-stmt-expr-attr-bad.rs:11:44 + | +LL | #[cfg(FALSE)] fn e() { let _ = foo(#![attr]); } + | ^ expected expression + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:14:38 + | +LL | #[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: expected expression, found `)` + --> $DIR/attr-stmt-expr-attr-bad.rs:14:46 + | +LL | #[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); } + | ^ expected expression + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:17:36 + | +LL | #[cfg(FALSE)] fn e() { let _ = 0 + #![attr] 0; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:19:33 + | +LL | #[cfg(FALSE)] fn e() { let _ = !#![attr] 0; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:21:33 + | +LL | #[cfg(FALSE)] fn e() { let _ = -#![attr] 0; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, or an operator, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:23:34 + | +LL | #[cfg(FALSE)] fn e() { let _ = x #![attr] as Y; } + | ^ expected one of 7 possible tokens + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:25:35 + | +LL | #[cfg(FALSE)] fn e() { let _ = || #![attr] foo; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:27:40 + | +LL | #[cfg(FALSE)] fn e() { let _ = move || #![attr] foo; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:29:35 + | +LL | #[cfg(FALSE)] fn e() { let _ = || #![attr] {foo}; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:31:40 + | +LL | #[cfg(FALSE)] fn e() { let _ = move || #![attr] {foo}; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: expected expression, found `..` + --> $DIR/attr-stmt-expr-attr-bad.rs:33:40 + | +LL | #[cfg(FALSE)] fn e() { let _ = #[attr] ..#[attr] 0; } + | ^^ expected expression + +error: expected expression, found `..` + --> $DIR/attr-stmt-expr-attr-bad.rs:35:40 + | +LL | #[cfg(FALSE)] fn e() { let _ = #[attr] ..; } + | ^^ expected expression + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:37:41 + | +LL | #[cfg(FALSE)] fn e() { let _ = #[attr] &#![attr] 0; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:39:45 + | +LL | #[cfg(FALSE)] fn e() { let _ = #[attr] &mut #![attr] 0; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: attributes are not yet allowed on `if` expressions + --> $DIR/attr-stmt-expr-attr-bad.rs:41:32 + | +LL | #[cfg(FALSE)] fn e() { let _ = #[attr] if 0 {}; } + | ^^^^^^^ + +error: expected `{`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:43:37 + | +LL | #[cfg(FALSE)] fn e() { let _ = if 0 #[attr] {}; } + | -- ^ --- help: try placing this code inside a block: `{ {}; }` + | | | + | | expected `{` + | this `if` expression has a condition, but no block + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:45:38 + | +LL | #[cfg(FALSE)] fn e() { let _ = if 0 {#![attr]}; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:47:40 + | +LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} #[attr] else {}; } + | ^ expected one of `.`, `;`, `?`, `else`, or an operator + +error: expected `{`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:49:45 + | +LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] {}; } + | ^ --- help: try placing this code inside a block: `{ {}; }` + | | + | expected `{` + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:51:46 + | +LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else {#![attr]}; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: attributes are not yet allowed on `if` expressions + --> $DIR/attr-stmt-expr-attr-bad.rs:53:45 + | +LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] if 0 {}; } + | ^^^^^^^ + +error: expected `{`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:53:45 + | +LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] if 0 {}; } + | ^ -------- help: try placing this code inside a block: `{ if 0 {}; }` + | | + | expected `{` + +error: expected `{`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:56:50 + | +LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 #[attr] {}; } + | -- ^ --- help: try placing this code inside a block: `{ {}; }` + | | | + | | expected `{` + | this `if` expression has a condition, but no block + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:58:51 + | +LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 {#![attr]}; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: attributes are not yet allowed on `if` expressions + --> $DIR/attr-stmt-expr-attr-bad.rs:60:32 + | +LL | #[cfg(FALSE)] fn e() { let _ = #[attr] if let _ = 0 {}; } + | ^^^^^^^ + +error: expected `{`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:62:45 + | +LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 #[attr] {}; } + | -- ^ --- help: try placing this code inside a block: `{ {}; }` + | | | + | | expected `{` + | this `if` expression has a condition, but no block + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:64:46 + | +LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {#![attr]}; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:66:48 + | +LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} #[attr] else {}; } + | ^ expected one of `.`, `;`, `?`, `else`, or an operator + +error: expected `{`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:68:53 + | +LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] {}; } + | ^ --- help: try placing this code inside a block: `{ {}; }` + | | + | expected `{` + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:70:54 + | +LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else {#![attr]}; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: attributes are not yet allowed on `if` expressions + --> $DIR/attr-stmt-expr-attr-bad.rs:72:53 + | +LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] if let _ = 0 {}; } + | ^^^^^^^ + +error: expected `{`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:72:53 + | +LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] if let _ = 0 {}; } + | ^ ---------------- help: try placing this code inside a block: `{ if let _ = 0 {}; }` + | | + | expected `{` + +error: expected `{`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:75:66 + | +LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 #[attr] {}; } + | -- ^ --- help: try placing this code inside a block: `{ {}; }` + | | | + | | expected `{` + | this `if` expression has a condition, but no block + +error: an inner attribute is not permitted in this context + --> $DIR/attr-stmt-expr-attr-bad.rs:77:67 + | +LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 {#![attr]}; } + | ^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted following an outer attribute + --> $DIR/attr-stmt-expr-attr-bad.rs:80:32 + | +LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] let _ = 0; } + | ------- ^^^^^^^^ not permitted following an outer attibute + | | + | previous outer attribute + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted following an outer attribute + --> $DIR/attr-stmt-expr-attr-bad.rs:82:32 + | +LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] 0; } + | ------- ^^^^^^^^ not permitted following an outer attibute + | | + | previous outer attribute + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted following an outer attribute + --> $DIR/attr-stmt-expr-attr-bad.rs:84:32 + | +LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!(); } + | ------- ^^^^^^^^ not permitted following an outer attibute + | | + | previous outer attribute + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted following an outer attribute + --> $DIR/attr-stmt-expr-attr-bad.rs:86:32 + | +LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo![]; } + | ------- ^^^^^^^^ not permitted following an outer attibute + | | + | previous outer attribute + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: an inner attribute is not permitted following an outer attribute + --> $DIR/attr-stmt-expr-attr-bad.rs:88:32 + | +LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!{}; } + | ------- ^^^^^^^^ not permitted following an outer attibute + | | + | previous outer attribute + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error[E0586]: inclusive range with no end + --> $DIR/attr-stmt-expr-attr-bad.rs:94:35 + | +LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } } + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error: expected one of `=>`, `if`, or `|`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:94:38 + | +LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } } + | ^ expected one of `=>`, `if`, or `|` + +error[E0586]: inclusive range with no end + --> $DIR/attr-stmt-expr-attr-bad.rs:97:35 + | +LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } } + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error: expected one of `=>`, `if`, or `|`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:97:38 + | +LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } } + | ^ expected one of `=>`, `if`, or `|` + +error: unexpected token: `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:100:39 + | +LL | #[cfg(FALSE)] fn e() { match 0 { 0..=-#[attr] 10 => () } } + | ^ + +error[E0586]: inclusive range with no end + --> $DIR/attr-stmt-expr-attr-bad.rs:102:35 + | +LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } } + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + +error: expected one of `=>`, `if`, or `|`, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:102:38 + | +LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } } + | ^ expected one of `=>`, `if`, or `|` + +error: unexpected token: `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:106:34 + | +LL | #[cfg(FALSE)] fn e() { let _ = x.#![attr]foo(); } + | ^ + +error: expected one of `.`, `;`, `?`, or an operator, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:106:34 + | +LL | #[cfg(FALSE)] fn e() { let _ = x.#![attr]foo(); } + | ^ expected one of `.`, `;`, `?`, or an operator + +error: unexpected token: `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:109:34 + | +LL | #[cfg(FALSE)] fn e() { let _ = x.#[attr]foo(); } + | ^ + +error: expected one of `.`, `;`, `?`, or an operator, found `#` + --> $DIR/attr-stmt-expr-attr-bad.rs:109:34 + | +LL | #[cfg(FALSE)] fn e() { let _ = x.#[attr]foo(); } + | ^ expected one of `.`, `;`, `?`, or an operator + +error: expected statement after outer attribute + --> $DIR/attr-stmt-expr-attr-bad.rs:114:44 + | +LL | #[cfg(FALSE)] fn e() { { fn foo() { #[attr]; } } } + | ^ + +error: expected statement after outer attribute + --> $DIR/attr-stmt-expr-attr-bad.rs:116:45 + | +LL | #[cfg(FALSE)] fn e() { { fn foo() { #[attr] } } } + | ^ + +error: aborting due to 57 previous errors + +For more information about this error, try `rustc --explain E0586`. diff --git a/src/test/ui/parser/bad-char-literals.rs b/src/test/ui/parser/bad-char-literals.rs index 1c9b5973be..11696b82bc 100644 --- a/src/test/ui/parser/bad-char-literals.rs +++ b/src/test/ui/parser/bad-char-literals.rs @@ -1,7 +1,6 @@ -// compile-flags: -Z continue-parse-after-error - // ignore-tidy-cr // ignore-tidy-tab + fn main() { // these literals are just silly. '''; diff --git a/src/test/ui/parser/bad-char-literals.stderr b/src/test/ui/parser/bad-char-literals.stderr index 8e96ea2277..093978fd84 100644 --- a/src/test/ui/parser/bad-char-literals.stderr +++ b/src/test/ui/parser/bad-char-literals.stderr @@ -1,11 +1,11 @@ error: character constant must be escaped: ' - --> $DIR/bad-char-literals.rs:7:6 + --> $DIR/bad-char-literals.rs:6:6 | LL | '''; | ^ error: character constant must be escaped: \n - --> $DIR/bad-char-literals.rs:11:6 + --> $DIR/bad-char-literals.rs:10:6 | LL | ' | ______^ @@ -13,13 +13,13 @@ LL | | '; | |_ error: character constant must be escaped: \r - --> $DIR/bad-char-literals.rs:16:6 + --> $DIR/bad-char-literals.rs:15:6 | LL | ' '; | ^ error: character constant must be escaped: \t - --> $DIR/bad-char-literals.rs:19:6 + --> $DIR/bad-char-literals.rs:18:6 | LL | ' '; | ^^^^ diff --git a/src/test/ui/parser/bounds-type.rs b/src/test/ui/parser/bounds-type.rs index 9122cb49eb..7a187a0518 100644 --- a/src/test/ui/parser/bounds-type.rs +++ b/src/test/ui/parser/bounds-type.rs @@ -8,6 +8,11 @@ struct S< T: ?for<'a> Trait, // OK T: Tr +, // OK T: ?'a, //~ ERROR `?` may only modify trait bounds, not lifetime bounds + + T: ?const Tr, // OK + T: ?const ?Tr, // OK + T: ?const Tr + 'a, // OK + T: ?const 'a, //~ ERROR `?const` may only modify trait bounds, not lifetime bounds >; fn main() {} diff --git a/src/test/ui/parser/bounds-type.stderr b/src/test/ui/parser/bounds-type.stderr index 0b714e40a1..9a1f2ed398 100644 --- a/src/test/ui/parser/bounds-type.stderr +++ b/src/test/ui/parser/bounds-type.stderr @@ -4,5 +4,11 @@ error: `?` may only modify trait bounds, not lifetime bounds LL | T: ?'a, | ^ -error: aborting due to previous error +error: `?const` may only modify trait bounds, not lifetime bounds + --> $DIR/bounds-type.rs:15:8 + | +LL | T: ?const 'a, + | ^^^^^^ + +error: aborting due to 2 previous errors diff --git a/src/test/ui/parser/brace-after-qualified-path-in-match.stderr b/src/test/ui/parser/brace-after-qualified-path-in-match.stderr index 4c49e3122c..d6fdf353f0 100644 --- a/src/test/ui/parser/brace-after-qualified-path-in-match.stderr +++ b/src/test/ui/parser/brace-after-qualified-path-in-match.stderr @@ -2,7 +2,9 @@ error: unexpected `{` after qualified path --> $DIR/brace-after-qualified-path-in-match.rs:3:27 | LL | <T as Trait>::Type{key: value} => (), - | ^ unexpected `{` after qualified path + | ------------------^ unexpected `{` after qualified path + | | + | the qualified path error: aborting due to previous error diff --git a/src/test/ui/parser/byte-literals.rs b/src/test/ui/parser/byte-literals.rs index bd358af298..dadf397122 100644 --- a/src/test/ui/parser/byte-literals.rs +++ b/src/test/ui/parser/byte-literals.rs @@ -1,6 +1,3 @@ -// compile-flags: -Z continue-parse-after-error - - // ignore-tidy-tab static FOO: u8 = b'\f'; //~ ERROR unknown byte escape diff --git a/src/test/ui/parser/byte-literals.stderr b/src/test/ui/parser/byte-literals.stderr index 58a5797b90..53d50af88d 100644 --- a/src/test/ui/parser/byte-literals.stderr +++ b/src/test/ui/parser/byte-literals.stderr @@ -1,41 +1,41 @@ error: unknown byte escape: f - --> $DIR/byte-literals.rs:6:21 + --> $DIR/byte-literals.rs:3:21 | LL | static FOO: u8 = b'\f'; | ^ unknown byte escape error: unknown byte escape: f - --> $DIR/byte-literals.rs:9:8 + --> $DIR/byte-literals.rs:6:8 | LL | b'\f'; | ^ unknown byte escape error: invalid character in numeric character escape: Z - --> $DIR/byte-literals.rs:10:10 + --> $DIR/byte-literals.rs:7:10 | LL | b'\x0Z'; | ^ error: byte constant must be escaped: \t - --> $DIR/byte-literals.rs:11:7 + --> $DIR/byte-literals.rs:8:7 | LL | b' '; | ^^^^ error: byte constant must be escaped: ' - --> $DIR/byte-literals.rs:12:7 + --> $DIR/byte-literals.rs:9:7 | LL | b'''; | ^ error: byte constant must be ASCII. Use a \xHH escape for a non-ASCII byte - --> $DIR/byte-literals.rs:13:7 + --> $DIR/byte-literals.rs:10:7 | LL | b'é'; | ^ error: unterminated byte constant - --> $DIR/byte-literals.rs:14:6 + --> $DIR/byte-literals.rs:11:6 | LL | b'a | ^^^^ diff --git a/src/test/ui/parser/byte-string-literals.rs b/src/test/ui/parser/byte-string-literals.rs index 8d8ee4da98..caffd9efbe 100644 --- a/src/test/ui/parser/byte-string-literals.rs +++ b/src/test/ui/parser/byte-string-literals.rs @@ -1,5 +1,3 @@ -// compile-flags: -Z continue-parse-after-error - static FOO: &'static [u8] = b"\f"; //~ ERROR unknown byte escape pub fn main() { diff --git a/src/test/ui/parser/byte-string-literals.stderr b/src/test/ui/parser/byte-string-literals.stderr index eeb2fcd123..ca964cd4b8 100644 --- a/src/test/ui/parser/byte-string-literals.stderr +++ b/src/test/ui/parser/byte-string-literals.stderr @@ -1,29 +1,29 @@ error: unknown byte escape: f - --> $DIR/byte-string-literals.rs:3:32 + --> $DIR/byte-string-literals.rs:1:32 | LL | static FOO: &'static [u8] = b"\f"; | ^ unknown byte escape error: unknown byte escape: f - --> $DIR/byte-string-literals.rs:6:8 + --> $DIR/byte-string-literals.rs:4:8 | LL | b"\f"; | ^ unknown byte escape error: invalid character in numeric character escape: Z - --> $DIR/byte-string-literals.rs:7:10 + --> $DIR/byte-string-literals.rs:5:10 | LL | b"\x0Z"; | ^ error: byte constant must be ASCII. Use a \xHH escape for a non-ASCII byte - --> $DIR/byte-string-literals.rs:8:7 + --> $DIR/byte-string-literals.rs:6:7 | LL | b"é"; | ^ error: unterminated double quote byte string - --> $DIR/byte-string-literals.rs:9:6 + --> $DIR/byte-string-literals.rs:7:6 | LL | b"a | ______^ diff --git a/src/test/ui/parser/chained-comparison-suggestion.rs b/src/test/ui/parser/chained-comparison-suggestion.rs new file mode 100644 index 0000000000..0431196f17 --- /dev/null +++ b/src/test/ui/parser/chained-comparison-suggestion.rs @@ -0,0 +1,40 @@ +// Check that we get nice suggestions when attempting a chained comparison. + +fn comp1() { + 1 < 2 <= 3; //~ ERROR comparison operators cannot be chained + //~^ ERROR mismatched types +} + +fn comp2() { + 1 < 2 < 3; //~ ERROR comparison operators cannot be chained +} + +fn comp3() { + 1 <= 2 < 3; //~ ERROR comparison operators cannot be chained + //~^ ERROR mismatched types +} + +fn comp4() { + 1 <= 2 <= 3; //~ ERROR comparison operators cannot be chained + //~^ ERROR mismatched types +} + +fn comp5() { + 1 > 2 >= 3; //~ ERROR comparison operators cannot be chained + //~^ ERROR mismatched types +} + +fn comp6() { + 1 > 2 > 3; //~ ERROR comparison operators cannot be chained +} + +fn comp7() { + 1 >= 2 > 3; //~ ERROR comparison operators cannot be chained +} + +fn comp8() { + 1 >= 2 >= 3; //~ ERROR comparison operators cannot be chained + //~^ ERROR mismatched types +} + +fn main() {} diff --git a/src/test/ui/parser/chained-comparison-suggestion.stderr b/src/test/ui/parser/chained-comparison-suggestion.stderr new file mode 100644 index 0000000000..5c10a4599d --- /dev/null +++ b/src/test/ui/parser/chained-comparison-suggestion.stderr @@ -0,0 +1,159 @@ +error: comparison operators cannot be chained + --> $DIR/chained-comparison-suggestion.rs:4:7 + | +LL | 1 < 2 <= 3; + | ^^^^^^ + | +help: split the comparison into two... + | +LL | 1 < 2 && 2 <= 3; + | ^^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | (1 < 2) <= 3; + | ^^^^^^^^^^ + +error: comparison operators cannot be chained + --> $DIR/chained-comparison-suggestion.rs:9:7 + | +LL | 1 < 2 < 3; + | ^^^^^ + | + = help: use `::<...>` instead of `<...>` to specify type arguments + = help: or use `(...)` if you meant to specify fn arguments +help: split the comparison into two... + | +LL | 1 < 2 && 2 < 3; + | ^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | (1 < 2) < 3; + | ^^^^^^^^^ + +error: comparison operators cannot be chained + --> $DIR/chained-comparison-suggestion.rs:13:7 + | +LL | 1 <= 2 < 3; + | ^^^^^^ + | +help: split the comparison into two... + | +LL | 1 <= 2 && 2 < 3; + | ^^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | (1 <= 2) < 3; + | ^^^^^^^^^^ + +error: comparison operators cannot be chained + --> $DIR/chained-comparison-suggestion.rs:18:7 + | +LL | 1 <= 2 <= 3; + | ^^^^^^^ + | +help: split the comparison into two... + | +LL | 1 <= 2 && 2 <= 3; + | ^^^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | (1 <= 2) <= 3; + | ^^^^^^^^^^^ + +error: comparison operators cannot be chained + --> $DIR/chained-comparison-suggestion.rs:23:7 + | +LL | 1 > 2 >= 3; + | ^^^^^^ + | +help: split the comparison into two... + | +LL | 1 > 2 && 2 >= 3; + | ^^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | (1 > 2) >= 3; + | ^^^^^^^^^^ + +error: comparison operators cannot be chained + --> $DIR/chained-comparison-suggestion.rs:28:7 + | +LL | 1 > 2 > 3; + | ^^^^^ + | + = help: use `::<...>` instead of `<...>` to specify type arguments + = help: or use `(...)` if you meant to specify fn arguments +help: split the comparison into two... + | +LL | 1 > 2 && 2 > 3; + | ^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | (1 > 2) > 3; + | ^^^^^^^^^ + +error: comparison operators cannot be chained + --> $DIR/chained-comparison-suggestion.rs:32:7 + | +LL | 1 >= 2 > 3; + | ^^^^^^ + | + = help: use `::<...>` instead of `<...>` to specify type arguments + = help: or use `(...)` if you meant to specify fn arguments +help: split the comparison into two... + | +LL | 1 >= 2 && 2 > 3; + | ^^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | (1 >= 2) > 3; + | ^^^^^^^^^^ + +error: comparison operators cannot be chained + --> $DIR/chained-comparison-suggestion.rs:36:7 + | +LL | 1 >= 2 >= 3; + | ^^^^^^^ + | +help: split the comparison into two... + | +LL | 1 >= 2 && 2 >= 3; + | ^^^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | (1 >= 2) >= 3; + | ^^^^^^^^^^^ + +error[E0308]: mismatched types + --> $DIR/chained-comparison-suggestion.rs:4:14 + | +LL | 1 < 2 <= 3; + | ^ expected `bool`, found integer + +error[E0308]: mismatched types + --> $DIR/chained-comparison-suggestion.rs:13:14 + | +LL | 1 <= 2 < 3; + | ^ expected `bool`, found integer + +error[E0308]: mismatched types + --> $DIR/chained-comparison-suggestion.rs:18:15 + | +LL | 1 <= 2 <= 3; + | ^ expected `bool`, found integer + +error[E0308]: mismatched types + --> $DIR/chained-comparison-suggestion.rs:23:14 + | +LL | 1 > 2 >= 3; + | ^ expected `bool`, found integer + +error[E0308]: mismatched types + --> $DIR/chained-comparison-suggestion.rs:36:15 + | +LL | 1 >= 2 >= 3; + | ^ expected `bool`, found integer + +error: aborting due to 13 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/do-catch-suggests-try.rs b/src/test/ui/parser/do-catch-suggests-try.rs index d805ab7588..f64568d06e 100644 --- a/src/test/ui/parser/do-catch-suggests-try.rs +++ b/src/test/ui/parser/do-catch-suggests-try.rs @@ -1,5 +1,10 @@ +#![feature(try_blocks)] + fn main() { let _: Option<()> = do catch {}; //~^ ERROR found removed `do catch` syntax - //~^^ HELP following RFC #2388, the new non-placeholder syntax is `try` + //~| replace with the new syntax + //~| following RFC #2388, the new non-placeholder syntax is `try` + + let _recovery_witness: () = 1; //~ ERROR mismatched types } diff --git a/src/test/ui/parser/do-catch-suggests-try.stderr b/src/test/ui/parser/do-catch-suggests-try.stderr index e151d4cf8a..cd8907b7ea 100644 --- a/src/test/ui/parser/do-catch-suggests-try.stderr +++ b/src/test/ui/parser/do-catch-suggests-try.stderr @@ -1,10 +1,19 @@ error: found removed `do catch` syntax - --> $DIR/do-catch-suggests-try.rs:2:25 + --> $DIR/do-catch-suggests-try.rs:4:25 | LL | let _: Option<()> = do catch {}; - | ^^ + | ^^^^^^^^ help: replace with the new syntax: `try` | - = help: following RFC #2388, the new non-placeholder syntax is `try` + = note: following RFC #2388, the new non-placeholder syntax is `try` -error: aborting due to previous error +error[E0308]: mismatched types + --> $DIR/do-catch-suggests-try.rs:9:33 + | +LL | let _recovery_witness: () = 1; + | -- ^ expected `()`, found integer + | | + | expected due to this + +error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/doc-comment-in-if-statement.stderr b/src/test/ui/parser/doc-comment-in-if-statement.stderr index 6bcb77385d..a720dd68bd 100644 --- a/src/test/ui/parser/doc-comment-in-if-statement.stderr +++ b/src/test/ui/parser/doc-comment-in-if-statement.stderr @@ -4,7 +4,7 @@ error: expected `{`, found doc comment `/*!*/` LL | if true /*!*/ {} | -- ^^^^^ expected `{` | | - | this `if` statement has a condition, but no block + | this `if` expression has a condition, but no block error: aborting due to previous error diff --git a/src/test/ui/parser/impl-item-const-pass.rs b/src/test/ui/parser/impl-item-const-pass.rs new file mode 100644 index 0000000000..d112456137 --- /dev/null +++ b/src/test/ui/parser/impl-item-const-pass.rs @@ -0,0 +1,8 @@ +// check-pass + +fn main() {} + +#[cfg(FALSE)] +impl X { + const Y: u8; +} diff --git a/src/test/ui/parser/impl-item-const-semantic-fail.rs b/src/test/ui/parser/impl-item-const-semantic-fail.rs new file mode 100644 index 0000000000..5d4692f9f1 --- /dev/null +++ b/src/test/ui/parser/impl-item-const-semantic-fail.rs @@ -0,0 +1,7 @@ +fn main() {} + +struct X; + +impl X { + const Y: u8; //~ ERROR associated constant in `impl` without body +} diff --git a/src/test/ui/parser/impl-item-const-semantic-fail.stderr b/src/test/ui/parser/impl-item-const-semantic-fail.stderr new file mode 100644 index 0000000000..ec3bee0ce6 --- /dev/null +++ b/src/test/ui/parser/impl-item-const-semantic-fail.stderr @@ -0,0 +1,10 @@ +error: associated constant in `impl` without body + --> $DIR/impl-item-const-semantic-fail.rs:6:5 + | +LL | const Y: u8; + | ^^^^^^^^^^^- + | | + | help: provide a definition for the constant: `= <expr>;` + +error: aborting due to previous error + diff --git a/src/test/ui/parser/impl-item-fn-no-body-pass.rs b/src/test/ui/parser/impl-item-fn-no-body-pass.rs new file mode 100644 index 0000000000..16b09d64e8 --- /dev/null +++ b/src/test/ui/parser/impl-item-fn-no-body-pass.rs @@ -0,0 +1,8 @@ +// check-pass + +fn main() {} + +#[cfg(FALSE)] +impl X { + fn f(); +} diff --git a/src/test/ui/parser/impl-item-fn-no-body-semantic-fail.rs b/src/test/ui/parser/impl-item-fn-no-body-semantic-fail.rs new file mode 100644 index 0000000000..cb183db596 --- /dev/null +++ b/src/test/ui/parser/impl-item-fn-no-body-semantic-fail.rs @@ -0,0 +1,7 @@ +fn main() {} + +struct X; + +impl X { + fn f(); //~ ERROR associated function in `impl` without body +} diff --git a/src/test/ui/parser/impl-item-fn-no-body-semantic-fail.stderr b/src/test/ui/parser/impl-item-fn-no-body-semantic-fail.stderr new file mode 100644 index 0000000000..1acb727368 --- /dev/null +++ b/src/test/ui/parser/impl-item-fn-no-body-semantic-fail.stderr @@ -0,0 +1,10 @@ +error: associated function in `impl` without body + --> $DIR/impl-item-fn-no-body-semantic-fail.rs:6:5 + | +LL | fn f(); + | ^^^^^^- + | | + | help: provide a definition for the function: `{ <body> }` + +error: aborting due to previous error + diff --git a/src/test/ui/parser/impl-item-type-no-body-pass.rs b/src/test/ui/parser/impl-item-type-no-body-pass.rs new file mode 100644 index 0000000000..74a9c6ab7e --- /dev/null +++ b/src/test/ui/parser/impl-item-type-no-body-pass.rs @@ -0,0 +1,11 @@ +// check-pass + +fn main() {} + +#[cfg(FALSE)] +impl X { + type Y; + type Z: Ord; + type W: Ord where Self: Eq; + type W where Self: Eq; +} diff --git a/src/test/ui/parser/impl-item-type-no-body-semantic-fail.rs b/src/test/ui/parser/impl-item-type-no-body-semantic-fail.rs new file mode 100644 index 0000000000..9c321c4bd0 --- /dev/null +++ b/src/test/ui/parser/impl-item-type-no-body-semantic-fail.rs @@ -0,0 +1,23 @@ +#![feature(generic_associated_types)] +//~^ WARN the feature `generic_associated_types` is incomplete + +fn main() {} + +struct X; + +impl X { + type Y; + //~^ ERROR associated type in `impl` without body + //~| ERROR associated types are not yet supported in inherent impls + type Z: Ord; + //~^ ERROR associated type in `impl` without body + //~| ERROR bounds on associated `type`s in `impl`s have no effect + //~| ERROR associated types are not yet supported in inherent impls + type W: Ord where Self: Eq; + //~^ ERROR associated type in `impl` without body + //~| ERROR bounds on associated `type`s in `impl`s have no effect + //~| ERROR associated types are not yet supported in inherent impls + type W where Self: Eq; + //~^ ERROR associated type in `impl` without body + //~| ERROR associated types are not yet supported in inherent impls +} diff --git a/src/test/ui/parser/impl-item-type-no-body-semantic-fail.stderr b/src/test/ui/parser/impl-item-type-no-body-semantic-fail.stderr new file mode 100644 index 0000000000..65e1981e3a --- /dev/null +++ b/src/test/ui/parser/impl-item-type-no-body-semantic-fail.stderr @@ -0,0 +1,79 @@ +error: associated type in `impl` without body + --> $DIR/impl-item-type-no-body-semantic-fail.rs:9:5 + | +LL | type Y; + | ^^^^^^- + | | + | help: provide a definition for the type: `= <type>;` + +error: associated type in `impl` without body + --> $DIR/impl-item-type-no-body-semantic-fail.rs:12:5 + | +LL | type Z: Ord; + | ^^^^^^^^^^^- + | | + | help: provide a definition for the type: `= <type>;` + +error: bounds on associated `type`s in `impl`s have no effect + --> $DIR/impl-item-type-no-body-semantic-fail.rs:12:13 + | +LL | type Z: Ord; + | ^^^ + +error: associated type in `impl` without body + --> $DIR/impl-item-type-no-body-semantic-fail.rs:16:5 + | +LL | type W: Ord where Self: Eq; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^- + | | + | help: provide a definition for the type: `= <type>;` + +error: bounds on associated `type`s in `impl`s have no effect + --> $DIR/impl-item-type-no-body-semantic-fail.rs:16:13 + | +LL | type W: Ord where Self: Eq; + | ^^^ + +error: associated type in `impl` without body + --> $DIR/impl-item-type-no-body-semantic-fail.rs:20:5 + | +LL | type W where Self: Eq; + | ^^^^^^^^^^^^^^^^^^^^^- + | | + | help: provide a definition for the type: `= <type>;` + +warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash + --> $DIR/impl-item-type-no-body-semantic-fail.rs:1:12 + | +LL | #![feature(generic_associated_types)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + +error[E0202]: associated types are not yet supported in inherent impls (see #8995) + --> $DIR/impl-item-type-no-body-semantic-fail.rs:9:5 + | +LL | type Y; + | ^^^^^^^ + +error[E0202]: associated types are not yet supported in inherent impls (see #8995) + --> $DIR/impl-item-type-no-body-semantic-fail.rs:12:5 + | +LL | type Z: Ord; + | ^^^^^^^^^^^^ + +error[E0202]: associated types are not yet supported in inherent impls (see #8995) + --> $DIR/impl-item-type-no-body-semantic-fail.rs:16:5 + | +LL | type W: Ord where Self: Eq; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0202]: associated types are not yet supported in inherent impls (see #8995) + --> $DIR/impl-item-type-no-body-semantic-fail.rs:20:5 + | +LL | type W where Self: Eq; + | ^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 10 previous errors + +For more information about this error, try `rustc --explain E0202`. diff --git a/src/test/ui/parser/impl-parsing.rs b/src/test/ui/parser/impl-parsing.rs index c2a80e8fa1..270c8b43df 100644 --- a/src/test/ui/parser/impl-parsing.rs +++ b/src/test/ui/parser/impl-parsing.rs @@ -1,5 +1,3 @@ -// compile-flags: -Z continue-parse-after-error - impl ! {} // OK impl ! where u8: Copy {} // OK diff --git a/src/test/ui/parser/impl-parsing.stderr b/src/test/ui/parser/impl-parsing.stderr index e929fa5362..7c2a7937c5 100644 --- a/src/test/ui/parser/impl-parsing.stderr +++ b/src/test/ui/parser/impl-parsing.stderr @@ -1,29 +1,29 @@ error: missing `for` in a trait impl - --> $DIR/impl-parsing.rs:6:11 + --> $DIR/impl-parsing.rs:4:11 | LL | impl Trait Type {} | ^ help: add `for` here error: missing `for` in a trait impl - --> $DIR/impl-parsing.rs:7:11 + --> $DIR/impl-parsing.rs:5:11 | LL | impl Trait .. {} | ^ help: add `for` here error: expected a trait, found type - --> $DIR/impl-parsing.rs:8:6 + --> $DIR/impl-parsing.rs:6:6 | LL | impl ?Sized for Type {} | ^^^^^^ error: expected a trait, found type - --> $DIR/impl-parsing.rs:9:6 + --> $DIR/impl-parsing.rs:7:6 | LL | impl ?Sized for .. {} | ^^^^^^ error: expected `impl`, found `FAIL` - --> $DIR/impl-parsing.rs:11:16 + --> $DIR/impl-parsing.rs:9:16 | LL | default unsafe FAIL | ^^^^ expected `impl` diff --git a/src/test/ui/parser/issue-10636-1.rs b/src/test/ui/parser/issue-10636-1.rs index e495c0411d..77c6072d6f 100644 --- a/src/test/ui/parser/issue-10636-1.rs +++ b/src/test/ui/parser/issue-10636-1.rs @@ -1,8 +1,8 @@ struct Obj { - //~^ NOTE: un-closed delimiter + //~^ NOTE: unclosed delimiter member: usize ) -//~^ ERROR incorrect close delimiter -//~| NOTE incorrect close delimiter +//~^ ERROR mismatched closing delimiter +//~| NOTE mismatched closing delimiter fn main() {} diff --git a/src/test/ui/parser/issue-10636-1.stderr b/src/test/ui/parser/issue-10636-1.stderr index 894139f24d..ff90cb9709 100644 --- a/src/test/ui/parser/issue-10636-1.stderr +++ b/src/test/ui/parser/issue-10636-1.stderr @@ -1,11 +1,11 @@ -error: incorrect close delimiter: `)` +error: mismatched closing delimiter: `)` --> $DIR/issue-10636-1.rs:4:1 | LL | struct Obj { - | - un-closed delimiter + | - unclosed delimiter ... LL | ) - | ^ incorrect close delimiter + | ^ mismatched closing delimiter error: aborting due to previous error diff --git a/src/test/ui/parser/issue-21153.stderr b/src/test/ui/parser/issue-21153.stderr index 70f55f0aeb..6e20a9ce3c 100644 --- a/src/test/ui/parser/issue-21153.stderr +++ b/src/test/ui/parser/issue-21153.stderr @@ -1,4 +1,4 @@ -error: missing `fn`, `type`, or `const` for trait-item declaration +error: missing `fn`, `type`, or `const` for associated-item declaration --> $DIR/issue-21153.rs:1:29 | LL | trait MyTrait<T>: Iterator { diff --git a/src/test/ui/parser/issue-2354-1.rs b/src/test/ui/parser/issue-2354-1.rs index 7e4e24fae1..996cf1bcbf 100644 --- a/src/test/ui/parser/issue-2354-1.rs +++ b/src/test/ui/parser/issue-2354-1.rs @@ -1 +1 @@ -static foo: isize = 2; } //~ ERROR unexpected close delimiter: +static foo: isize = 2; } //~ ERROR unexpected closing delimiter: diff --git a/src/test/ui/parser/issue-2354-1.stderr b/src/test/ui/parser/issue-2354-1.stderr index 7c08375122..7ea0f2a982 100644 --- a/src/test/ui/parser/issue-2354-1.stderr +++ b/src/test/ui/parser/issue-2354-1.stderr @@ -1,8 +1,8 @@ -error: unexpected close delimiter: `}` +error: unexpected closing delimiter: `}` --> $DIR/issue-2354-1.rs:1:24 | LL | static foo: isize = 2; } - | ^ unexpected close delimiter + | ^ unexpected closing delimiter error: aborting due to previous error diff --git a/src/test/ui/parser/issue-2354.rs b/src/test/ui/parser/issue-2354.rs index c4fc471618..c422040cbe 100644 --- a/src/test/ui/parser/issue-2354.rs +++ b/src/test/ui/parser/issue-2354.rs @@ -1,4 +1,4 @@ -fn foo() { //~ NOTE un-closed delimiter +fn foo() { //~ NOTE unclosed delimiter match Some(10) { //~^ NOTE this delimiter might not be properly closed... Some(y) => { panic!(); } @@ -12,4 +12,4 @@ fn bar() { } fn main() {} -//~ ERROR this file contains an un-closed delimiter +//~ ERROR this file contains an unclosed delimiter diff --git a/src/test/ui/parser/issue-2354.stderr b/src/test/ui/parser/issue-2354.stderr index 45199b02cb..b89ed39583 100644 --- a/src/test/ui/parser/issue-2354.stderr +++ b/src/test/ui/parser/issue-2354.stderr @@ -1,8 +1,8 @@ -error: this file contains an un-closed delimiter - --> $DIR/issue-2354.rs:15:53 +error: this file contains an unclosed delimiter + --> $DIR/issue-2354.rs:15:52 | LL | fn foo() { - | - un-closed delimiter + | - unclosed delimiter LL | match Some(10) { | - this delimiter might not be properly closed... ... @@ -10,7 +10,7 @@ LL | } | - ...as it matches this but it has different indentation ... LL | - | ^ + | ^ error: aborting due to previous error diff --git a/src/test/ui/parser/issue-23620-invalid-escapes.rs b/src/test/ui/parser/issue-23620-invalid-escapes.rs index 53629973a1..ab445a9329 100644 --- a/src/test/ui/parser/issue-23620-invalid-escapes.rs +++ b/src/test/ui/parser/issue-23620-invalid-escapes.rs @@ -1,5 +1,3 @@ -// compile-flags: -Z continue-parse-after-error - fn main() { let _ = b"\u{a66e}"; //~^ ERROR unicode escape sequences cannot be used as a byte or in a byte string diff --git a/src/test/ui/parser/issue-23620-invalid-escapes.stderr b/src/test/ui/parser/issue-23620-invalid-escapes.stderr index 5fabc1d7e4..b391ac75bf 100644 --- a/src/test/ui/parser/issue-23620-invalid-escapes.stderr +++ b/src/test/ui/parser/issue-23620-invalid-escapes.stderr @@ -1,17 +1,17 @@ error: unicode escape sequences cannot be used as a byte or in a byte string - --> $DIR/issue-23620-invalid-escapes.rs:4:15 + --> $DIR/issue-23620-invalid-escapes.rs:2:15 | LL | let _ = b"\u{a66e}"; | ^^^^^^^^ error: unicode escape sequences cannot be used as a byte or in a byte string - --> $DIR/issue-23620-invalid-escapes.rs:7:15 + --> $DIR/issue-23620-invalid-escapes.rs:5:15 | LL | let _ = b'\u{a66e}'; | ^^^^^^^^ error: incorrect unicode escape sequence - --> $DIR/issue-23620-invalid-escapes.rs:10:15 + --> $DIR/issue-23620-invalid-escapes.rs:8:15 | LL | let _ = b'\u'; | ^^ incorrect unicode escape sequence @@ -19,43 +19,43 @@ LL | let _ = b'\u'; = help: format of unicode escape sequences is `\u{...}` error: numeric character escape is too short - --> $DIR/issue-23620-invalid-escapes.rs:13:15 + --> $DIR/issue-23620-invalid-escapes.rs:11:15 | LL | let _ = b'\x5'; | ^^^ error: invalid character in numeric character escape: x - --> $DIR/issue-23620-invalid-escapes.rs:16:17 + --> $DIR/issue-23620-invalid-escapes.rs:14:17 | LL | let _ = b'\xxy'; | ^ error: numeric character escape is too short - --> $DIR/issue-23620-invalid-escapes.rs:19:14 + --> $DIR/issue-23620-invalid-escapes.rs:17:14 | LL | let _ = '\x5'; | ^^^ error: invalid character in numeric character escape: x - --> $DIR/issue-23620-invalid-escapes.rs:22:16 + --> $DIR/issue-23620-invalid-escapes.rs:20:16 | LL | let _ = '\xxy'; | ^ error: unicode escape sequences cannot be used as a byte or in a byte string - --> $DIR/issue-23620-invalid-escapes.rs:25:15 + --> $DIR/issue-23620-invalid-escapes.rs:23:15 | LL | let _ = b"\u{a4a4} \xf \u"; | ^^^^^^^^ error: invalid character in numeric character escape: - --> $DIR/issue-23620-invalid-escapes.rs:25:27 + --> $DIR/issue-23620-invalid-escapes.rs:23:27 | LL | let _ = b"\u{a4a4} \xf \u"; | ^ error: incorrect unicode escape sequence - --> $DIR/issue-23620-invalid-escapes.rs:25:28 + --> $DIR/issue-23620-invalid-escapes.rs:23:28 | LL | let _ = b"\u{a4a4} \xf \u"; | ^^ incorrect unicode escape sequence @@ -63,13 +63,13 @@ LL | let _ = b"\u{a4a4} \xf \u"; = help: format of unicode escape sequences is `\u{...}` error: invalid character in numeric character escape: - --> $DIR/issue-23620-invalid-escapes.rs:30:17 + --> $DIR/issue-23620-invalid-escapes.rs:28:17 | LL | let _ = "\xf \u"; | ^ error: incorrect unicode escape sequence - --> $DIR/issue-23620-invalid-escapes.rs:30:18 + --> $DIR/issue-23620-invalid-escapes.rs:28:18 | LL | let _ = "\xf \u"; | ^^ incorrect unicode escape sequence @@ -77,7 +77,7 @@ LL | let _ = "\xf \u"; = help: format of unicode escape sequences is `\u{...}` error: incorrect unicode escape sequence - --> $DIR/issue-23620-invalid-escapes.rs:34:14 + --> $DIR/issue-23620-invalid-escapes.rs:32:14 | LL | let _ = "\u8f"; | ^^-- diff --git a/src/test/ui/parser/issue-32446.stderr b/src/test/ui/parser/issue-32446.stderr index 70256a5923..1a97f54160 100644 --- a/src/test/ui/parser/issue-32446.stderr +++ b/src/test/ui/parser/issue-32446.stderr @@ -1,8 +1,8 @@ -error: expected one of `async`, `const`, `crate`, `extern`, `fn`, `pub`, `type`, `unsafe`, or `}`, found `...` +error: expected one of `async`, `const`, `crate`, `default`, `extern`, `fn`, `pub`, `type`, `unsafe`, or `}`, found `...` --> $DIR/issue-32446.rs:4:11 | LL | trait T { ... } - | ^^^ expected one of 9 possible tokens + | ^^^ expected one of 10 possible tokens error: aborting due to previous error diff --git a/src/test/ui/parser/issue-33418.fixed b/src/test/ui/parser/issue-33418.fixed index 2aaa3b5b1e..ed885ae143 100644 --- a/src/test/ui/parser/issue-33418.fixed +++ b/src/test/ui/parser/issue-33418.fixed @@ -1,15 +1,15 @@ // run-rustfix trait Tr {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr2: SuperA {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr3: SuperB {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr4: SuperB + SuperD {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr5 {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait SuperA {} trait SuperB {} diff --git a/src/test/ui/parser/issue-33418.rs b/src/test/ui/parser/issue-33418.rs index 5533152092..9934284abf 100644 --- a/src/test/ui/parser/issue-33418.rs +++ b/src/test/ui/parser/issue-33418.rs @@ -1,17 +1,17 @@ // run-rustfix trait Tr: !SuperA {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr2: SuperA + !SuperB {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr3: !SuperA + SuperB {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr4: !SuperA + SuperB + !SuperC + SuperD {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait Tr5: !SuperA + !SuperB {} -//~^ ERROR negative trait bounds are not supported +//~^ ERROR negative bounds are not supported trait SuperA {} trait SuperB {} diff --git a/src/test/ui/parser/issue-33418.stderr b/src/test/ui/parser/issue-33418.stderr index 479e7bed10..9a8733e892 100644 --- a/src/test/ui/parser/issue-33418.stderr +++ b/src/test/ui/parser/issue-33418.stderr @@ -1,46 +1,36 @@ -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:3:9 | LL | trait Tr: !SuperA {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bound + | ^^^^^^^^^ negative bounds are not supported -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:5:19 | LL | trait Tr2: SuperA + !SuperB {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bound + | ^^^^^^^^^ negative bounds are not supported -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:7:10 | LL | trait Tr3: !SuperA + SuperB {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bound + | ^^^^^^^^^ negative bounds are not supported -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:9:10 | LL | trait Tr4: !SuperA + SuperB | ^^^^^^^^^ LL | + !SuperC + SuperD {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bounds + | ^^^^^^^^^ negative bounds are not supported -error: negative trait bounds are not supported +error: negative bounds are not supported --> $DIR/issue-33418.rs:12:10 | LL | trait Tr5: !SuperA | ^^^^^^^^^ LL | + !SuperB {} - | ^^^^^^^^^ negative trait bounds are not supported - | - = help: remove the trait bounds + | ^^^^^^^^^ negative bounds are not supported error: aborting due to 5 previous errors diff --git a/src/test/ui/parser/issue-58094-missing-right-square-bracket.stderr b/src/test/ui/parser/issue-58094-missing-right-square-bracket.stderr index 2c987da81d..00f6652b31 100644 --- a/src/test/ui/parser/issue-58094-missing-right-square-bracket.stderr +++ b/src/test/ui/parser/issue-58094-missing-right-square-bracket.stderr @@ -1,10 +1,10 @@ -error: this file contains an un-closed delimiter +error: this file contains an unclosed delimiter --> $DIR/issue-58094-missing-right-square-bracket.rs:4:4 | LL | #[Ѕ | - ^ | | - | un-closed delimiter + | unclosed delimiter error: expected item after attributes --> $DIR/issue-58094-missing-right-square-bracket.rs:4:4 diff --git a/src/test/ui/parser/issue-62524.stderr b/src/test/ui/parser/issue-62524.stderr index 229768f495..3482435cd1 100644 --- a/src/test/ui/parser/issue-62524.stderr +++ b/src/test/ui/parser/issue-62524.stderr @@ -1,8 +1,8 @@ -error: this file contains an un-closed delimiter +error: this file contains an unclosed delimiter --> $DIR/issue-62524.rs:4:3 | LL | y![ - | - un-closed delimiter + | - unclosed delimiter LL | Ϥ, | ^ diff --git a/src/test/ui/parser/issue-62546.rs b/src/test/ui/parser/issue-62546.rs index 75b95e7407..f06b650585 100644 --- a/src/test/ui/parser/issue-62546.rs +++ b/src/test/ui/parser/issue-62546.rs @@ -1,3 +1,3 @@ pub t(# //~^ ERROR missing `fn` or `struct` for function or struct definition -//~ ERROR this file contains an un-closed delimiter +//~ ERROR this file contains an unclosed delimiter diff --git a/src/test/ui/parser/issue-62546.stderr b/src/test/ui/parser/issue-62546.stderr index 631aac9550..32c61391e1 100644 --- a/src/test/ui/parser/issue-62546.stderr +++ b/src/test/ui/parser/issue-62546.stderr @@ -1,11 +1,11 @@ -error: this file contains an un-closed delimiter - --> $DIR/issue-62546.rs:3:53 +error: this file contains an unclosed delimiter + --> $DIR/issue-62546.rs:3:52 | LL | pub t(# - | - un-closed delimiter + | - unclosed delimiter LL | LL | - | ^ + | ^ error: missing `fn` or `struct` for function or struct definition --> $DIR/issue-62546.rs:1:4 diff --git a/src/test/ui/parser/issue-62881.rs b/src/test/ui/parser/issue-62881.rs index 1782c2e375..b9204595fb 100644 --- a/src/test/ui/parser/issue-62881.rs +++ b/src/test/ui/parser/issue-62881.rs @@ -3,4 +3,4 @@ fn main() {} fn f() -> isize { fn f() -> isize {} pub f< //~^ ERROR missing `fn` or `struct` for function or struct definition //~| ERROR mismatched types -//~ ERROR this file contains an un-closed delimiter +//~ ERROR this file contains an unclosed delimiter diff --git a/src/test/ui/parser/issue-62881.stderr b/src/test/ui/parser/issue-62881.stderr index fdf772fcbd..87be69baad 100644 --- a/src/test/ui/parser/issue-62881.stderr +++ b/src/test/ui/parser/issue-62881.stderr @@ -1,11 +1,11 @@ -error: this file contains an un-closed delimiter - --> $DIR/issue-62881.rs:6:53 +error: this file contains an unclosed delimiter + --> $DIR/issue-62881.rs:6:52 | LL | fn f() -> isize { fn f() -> isize {} pub f< - | - un-closed delimiter + | - unclosed delimiter ... LL | - | ^ + | ^ error: missing `fn` or `struct` for function or struct definition --> $DIR/issue-62881.rs:3:41 diff --git a/src/test/ui/parser/issue-62913.rs b/src/test/ui/parser/issue-62913.rs index cfa19a2a31..0db06f636c 100644 --- a/src/test/ui/parser/issue-62913.rs +++ b/src/test/ui/parser/issue-62913.rs @@ -1,3 +1,4 @@ "\u\\" //~^ ERROR incorrect unicode escape sequence //~| ERROR invalid trailing slash in literal +//~| ERROR expected item, found `"\u\\"` diff --git a/src/test/ui/parser/issue-62913.stderr b/src/test/ui/parser/issue-62913.stderr index 05c5c4d000..f72174f892 100644 --- a/src/test/ui/parser/issue-62913.stderr +++ b/src/test/ui/parser/issue-62913.stderr @@ -12,5 +12,11 @@ error: invalid trailing slash in literal LL | "\u\" | ^ -error: aborting due to 2 previous errors +error: expected item, found `"\u\"` + --> $DIR/issue-62913.rs:1:1 + | +LL | "\u\" + | ^^^^^^ expected item + +error: aborting due to 3 previous errors diff --git a/src/test/ui/parser/issue-62973.rs b/src/test/ui/parser/issue-62973.rs index 18bc51e7ba..1c5d0c6f8a 100644 --- a/src/test/ui/parser/issue-62973.rs +++ b/src/test/ui/parser/issue-62973.rs @@ -1,5 +1,5 @@ // ignore-tidy-trailing-newlines -// error-pattern: aborting due to 6 previous errors +// error-pattern: aborting due to 7 previous errors fn main() {} diff --git a/src/test/ui/parser/issue-62973.stderr b/src/test/ui/parser/issue-62973.stderr index e2a5b4cba0..95ee52d810 100644 --- a/src/test/ui/parser/issue-62973.stderr +++ b/src/test/ui/parser/issue-62973.stderr @@ -1,10 +1,21 @@ -error: this file contains an un-closed delimiter +error: this file contains an unclosed delimiter --> $DIR/issue-62973.rs:8:2 | LL | fn p() { match s { v, E { [) {) } - | - - un-closed delimiter + | - - unclosed delimiter | | - | un-closed delimiter + | unclosed delimiter +LL | +LL | + | ^ + +error: this file contains an unclosed delimiter + --> $DIR/issue-62973.rs:8:2 + | +LL | fn p() { match s { v, E { [) {) } + | - - unclosed delimiter + | | + | unclosed delimiter LL | LL | | ^ @@ -44,21 +55,21 @@ LL | LL | | ^ expected one of `.`, `?`, `{`, or an operator -error: incorrect close delimiter: `)` +error: mismatched closing delimiter: `)` --> $DIR/issue-62973.rs:6:28 | LL | fn p() { match s { v, E { [) {) } - | -^ incorrect close delimiter + | -^ mismatched closing delimiter | | - | un-closed delimiter + | unclosed delimiter -error: incorrect close delimiter: `)` +error: mismatched closing delimiter: `)` --> $DIR/issue-62973.rs:6:31 | LL | fn p() { match s { v, E { [) {) } - | -^ incorrect close delimiter + | -^ mismatched closing delimiter | | - | un-closed delimiter + | unclosed delimiter -error: aborting due to 6 previous errors +error: aborting due to 7 previous errors diff --git a/src/test/ui/parser/issue-63115-range-pat-interpolated.rs b/src/test/ui/parser/issue-63115-range-pat-interpolated.rs index a7d10ca932..8efb3c73f0 100644 --- a/src/test/ui/parser/issue-63115-range-pat-interpolated.rs +++ b/src/test/ui/parser/issue-63115-range-pat-interpolated.rs @@ -1,6 +1,7 @@ // check-pass #![feature(exclusive_range_pattern)] +#![feature(half_open_range_patterns)] #![allow(ellipsis_inclusive_range_patterns)] @@ -10,6 +11,11 @@ fn main() { if let 2...$e = 3 {} if let 2..=$e = 3 {} if let 2..$e = 3 {} + if let ..$e = 3 {} + if let ..=$e = 3 {} + if let $e.. = 5 {} + if let $e..5 = 4 {} + if let $e..=5 = 4 {} } } mac_expr!(4); diff --git a/src/test/ui/parser/issue-63116.stderr b/src/test/ui/parser/issue-63116.stderr index 0aed0386a9..2beb73d83d 100644 --- a/src/test/ui/parser/issue-63116.stderr +++ b/src/test/ui/parser/issue-63116.stderr @@ -1,10 +1,10 @@ -error: this file contains an un-closed delimiter +error: this file contains an unclosed delimiter --> $DIR/issue-63116.rs:3:18 | LL | impl W <s(f;Y(;] | - ^ | | - | un-closed delimiter + | unclosed delimiter error: expected one of `!`, `(`, `)`, `+`, `,`, `::`, or `<`, found `;` --> $DIR/issue-63116.rs:3:12 diff --git a/src/test/ui/parser/issue-63135.rs b/src/test/ui/parser/issue-63135.rs index a5a8de8546..d5f5f1469f 100644 --- a/src/test/ui/parser/issue-63135.rs +++ b/src/test/ui/parser/issue-63135.rs @@ -1,3 +1,3 @@ -// error-pattern: aborting due to 5 previous errors +// error-pattern: aborting due to 6 previous errors fn i(n{...,f # diff --git a/src/test/ui/parser/issue-63135.stderr b/src/test/ui/parser/issue-63135.stderr index 152601b353..462fdf11f4 100644 --- a/src/test/ui/parser/issue-63135.stderr +++ b/src/test/ui/parser/issue-63135.stderr @@ -1,11 +1,20 @@ -error: this file contains an un-closed delimiter +error: this file contains an unclosed delimiter --> $DIR/issue-63135.rs:3:16 | LL | fn i(n{...,f # | - - ^ | | | - | | un-closed delimiter - | un-closed delimiter + | | unclosed delimiter + | unclosed delimiter + +error: this file contains an unclosed delimiter + --> $DIR/issue-63135.rs:3:16 + | +LL | fn i(n{...,f # + | - - ^ + | | | + | | unclosed delimiter + | unclosed delimiter error: expected field pattern, found `...` --> $DIR/issue-63135.rs:3:8 @@ -34,5 +43,5 @@ error: expected one of `:` or `|`, found `)` LL | fn i(n{...,f # | ^ expected one of `:` or `|` -error: aborting due to 5 previous errors +error: aborting due to 6 previous errors diff --git a/src/test/ui/parser/issue-65257-invalid-var-decl-recovery.rs b/src/test/ui/parser/issue-65257-invalid-var-decl-recovery.rs new file mode 100644 index 0000000000..c1826f8caa --- /dev/null +++ b/src/test/ui/parser/issue-65257-invalid-var-decl-recovery.rs @@ -0,0 +1,21 @@ +fn main() { + auto n = 0;//~ ERROR invalid variable declaration + //~^ HELP write `let` instead of `auto` to introduce a new variable + auto m;//~ ERROR invalid variable declaration + //~^ HELP write `let` instead of `auto` to introduce a new variable + m = 0; + + var n = 0;//~ ERROR invalid variable declaration + //~^ HELP write `let` instead of `var` to introduce a new variable + var m;//~ ERROR invalid variable declaration + //~^ HELP write `let` instead of `var` to introduce a new variable + m = 0; + + mut n = 0;//~ ERROR invalid variable declaration + //~^ HELP missing keyword + mut var;//~ ERROR invalid variable declaration + //~^ HELP missing keyword + var = 0; + + let _recovery_witness: () = 0; //~ ERROR mismatched types +} diff --git a/src/test/ui/parser/issue-65257-invalid-var-decl-recovery.stderr b/src/test/ui/parser/issue-65257-invalid-var-decl-recovery.stderr new file mode 100644 index 0000000000..ad72dd3054 --- /dev/null +++ b/src/test/ui/parser/issue-65257-invalid-var-decl-recovery.stderr @@ -0,0 +1,67 @@ +error: invalid variable declaration + --> $DIR/issue-65257-invalid-var-decl-recovery.rs:2:5 + | +LL | auto n = 0; + | ^^^^ + | +help: write `let` instead of `auto` to introduce a new variable + | +LL | let n = 0; + | ^^^ + +error: invalid variable declaration + --> $DIR/issue-65257-invalid-var-decl-recovery.rs:4:5 + | +LL | auto m; + | ^^^^ + | +help: write `let` instead of `auto` to introduce a new variable + | +LL | let m; + | ^^^ + +error: invalid variable declaration + --> $DIR/issue-65257-invalid-var-decl-recovery.rs:8:5 + | +LL | var n = 0; + | ^^^ + | +help: write `let` instead of `var` to introduce a new variable + | +LL | let n = 0; + | ^^^ + +error: invalid variable declaration + --> $DIR/issue-65257-invalid-var-decl-recovery.rs:10:5 + | +LL | var m; + | ^^^ + | +help: write `let` instead of `var` to introduce a new variable + | +LL | let m; + | ^^^ + +error: invalid variable declaration + --> $DIR/issue-65257-invalid-var-decl-recovery.rs:14:5 + | +LL | mut n = 0; + | ^^^ help: missing keyword: `let mut` + +error: invalid variable declaration + --> $DIR/issue-65257-invalid-var-decl-recovery.rs:16:5 + | +LL | mut var; + | ^^^ help: missing keyword: `let mut` + +error[E0308]: mismatched types + --> $DIR/issue-65257-invalid-var-decl-recovery.rs:20:33 + | +LL | let _recovery_witness: () = 0; + | -- ^ expected `()`, found integer + | | + | expected due to this + +error: aborting due to 7 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/issue-66357-unexpected-unreachable.rs b/src/test/ui/parser/issue-66357-unexpected-unreachable.rs index 1730adfa91..5ec143fae2 100644 --- a/src/test/ui/parser/issue-66357-unexpected-unreachable.rs +++ b/src/test/ui/parser/issue-66357-unexpected-unreachable.rs @@ -1,3 +1,5 @@ +// ignore-tidy-linelength + // The problem in #66357 was that the call trace: // // - parse_fn_block_decl @@ -11,4 +13,4 @@ fn f() { |[](* } //~^ ERROR expected one of `,` or `:`, found `(` -//~| ERROR expected one of `)`, `-`, `_`, `box`, `mut`, `ref`, `|`, identifier, or path, found `*` +//~| ERROR expected one of `&`, `(`, `)`, `-`, `...`, `..=`, `..`, `[`, `_`, `box`, `mut`, `ref`, `|`, identifier, or path, found `*` diff --git a/src/test/ui/parser/issue-66357-unexpected-unreachable.stderr b/src/test/ui/parser/issue-66357-unexpected-unreachable.stderr index 00d84e2afe..c3810999d2 100644 --- a/src/test/ui/parser/issue-66357-unexpected-unreachable.stderr +++ b/src/test/ui/parser/issue-66357-unexpected-unreachable.stderr @@ -1,11 +1,11 @@ error: expected one of `,` or `:`, found `(` - --> $DIR/issue-66357-unexpected-unreachable.rs:12:13 + --> $DIR/issue-66357-unexpected-unreachable.rs:14:13 | LL | fn f() { |[](* } | ^ expected one of `,` or `:` -error: expected one of `)`, `-`, `_`, `box`, `mut`, `ref`, `|`, identifier, or path, found `*` - --> $DIR/issue-66357-unexpected-unreachable.rs:12:14 +error: expected one of `&`, `(`, `)`, `-`, `...`, `..=`, `..`, `[`, `_`, `box`, `mut`, `ref`, `|`, identifier, or path, found `*` + --> $DIR/issue-66357-unexpected-unreachable.rs:14:14 | LL | fn f() { |[](* } | -^ help: `)` may belong here diff --git a/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.rs b/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.rs new file mode 100644 index 0000000000..5a109ba7c6 --- /dev/null +++ b/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.rs @@ -0,0 +1,12 @@ +// In this regression test for #67146, we check that the +// negative outlives bound `!'a` is rejected by the parser. +// This regression was first introduced in PR #57364. + +fn main() {} + +fn f1<T: !'static>() {} +//~^ ERROR negative bounds are not supported +fn f2<'a, T: Ord + !'a>() {} +//~^ ERROR negative bounds are not supported +fn f3<'a, T: !'a + Ord>() {} +//~^ ERROR negative bounds are not supported diff --git a/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.stderr b/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.stderr new file mode 100644 index 0000000000..4dc0634730 --- /dev/null +++ b/src/test/ui/parser/issue-67146-negative-outlives-bound-syntactic-fail.stderr @@ -0,0 +1,20 @@ +error: negative bounds are not supported + --> $DIR/issue-67146-negative-outlives-bound-syntactic-fail.rs:7:8 + | +LL | fn f1<T: !'static>() {} + | ^^^^^^^^^^ negative bounds are not supported + +error: negative bounds are not supported + --> $DIR/issue-67146-negative-outlives-bound-syntactic-fail.rs:9:18 + | +LL | fn f2<'a, T: Ord + !'a>() {} + | ^^^^^ negative bounds are not supported + +error: negative bounds are not supported + --> $DIR/issue-67146-negative-outlives-bound-syntactic-fail.rs:11:12 + | +LL | fn f3<'a, T: !'a + Ord>() {} + | ^^^^^ negative bounds are not supported + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/parser/lex-bad-char-literals-1.rs b/src/test/ui/parser/lex-bad-char-literals-1.rs index 54d75ed682..e7951cfd2d 100644 --- a/src/test/ui/parser/lex-bad-char-literals-1.rs +++ b/src/test/ui/parser/lex-bad-char-literals-1.rs @@ -1,4 +1,3 @@ -// compile-flags: -Z continue-parse-after-error static c3: char = '\x1' //~ ERROR: numeric character escape is too short ; diff --git a/src/test/ui/parser/lex-bad-char-literals-1.stderr b/src/test/ui/parser/lex-bad-char-literals-1.stderr index 000d155c26..fcf4802f79 100644 --- a/src/test/ui/parser/lex-bad-char-literals-1.stderr +++ b/src/test/ui/parser/lex-bad-char-literals-1.stderr @@ -1,23 +1,23 @@ error: numeric character escape is too short - --> $DIR/lex-bad-char-literals-1.rs:3:6 + --> $DIR/lex-bad-char-literals-1.rs:2:6 | LL | '\x1' | ^^^ error: numeric character escape is too short - --> $DIR/lex-bad-char-literals-1.rs:7:6 + --> $DIR/lex-bad-char-literals-1.rs:6:6 | LL | "\x1" | ^^^ error: unknown character escape: \u{25cf} - --> $DIR/lex-bad-char-literals-1.rs:11:7 + --> $DIR/lex-bad-char-literals-1.rs:10:7 | LL | '\●' | ^ unknown character escape error: unknown character escape: \u{25cf} - --> $DIR/lex-bad-char-literals-1.rs:15:7 + --> $DIR/lex-bad-char-literals-1.rs:14:7 | LL | "\●" | ^ unknown character escape diff --git a/src/test/ui/parser/lex-bad-char-literals-7.rs b/src/test/ui/parser/lex-bad-char-literals-7.rs index 70eafcb91d..1580157210 100644 --- a/src/test/ui/parser/lex-bad-char-literals-7.rs +++ b/src/test/ui/parser/lex-bad-char-literals-7.rs @@ -1,4 +1,3 @@ -// compile-flags: -Z continue-parse-after-error fn main() { let _: char = ''; //~^ ERROR: empty character literal diff --git a/src/test/ui/parser/lex-bad-char-literals-7.stderr b/src/test/ui/parser/lex-bad-char-literals-7.stderr index e1ba3c3ee0..ee9aa86935 100644 --- a/src/test/ui/parser/lex-bad-char-literals-7.stderr +++ b/src/test/ui/parser/lex-bad-char-literals-7.stderr @@ -1,17 +1,17 @@ error: empty character literal - --> $DIR/lex-bad-char-literals-7.rs:3:20 + --> $DIR/lex-bad-char-literals-7.rs:2:20 | LL | let _: char = ''; | ^ error: empty unicode escape (must have at least 1 hex digit) - --> $DIR/lex-bad-char-literals-7.rs:5:20 + --> $DIR/lex-bad-char-literals-7.rs:4:20 | LL | let _: char = '\u{}'; | ^^^^ error: unterminated character literal - --> $DIR/lex-bad-char-literals-7.rs:12:13 + --> $DIR/lex-bad-char-literals-7.rs:11:13 | LL | let _ = ' hello // here's a comment | ^^^^^^^^ diff --git a/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.rs b/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.rs index b588b007ae..9a9f9c433e 100644 --- a/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.rs +++ b/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.rs @@ -1,5 +1,3 @@ -// compile-flags: -Z continue-parse-after-error - // ignore-tidy-cr /// doc comment with bare CR: ' ' diff --git a/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.stderr b/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.stderr index b0fe4b6acd..598da6b930 100644 --- a/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.stderr +++ b/src/test/ui/parser/lex-bare-cr-string-literal-doc-comment.stderr @@ -1,41 +1,41 @@ error: bare CR not allowed in doc-comment - --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:5:32 + --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:3:32 | LL | /// doc comment with bare CR: ' ' | ^ error: bare CR not allowed in block doc-comment - --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:9:38 + --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:7:38 | LL | /** block doc comment with bare CR: ' ' */ | ^ error: bare CR not allowed in doc-comment - --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:14:36 + --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:12:36 | LL | //! doc comment with bare CR: ' ' | ^ error: bare CR not allowed in block doc-comment - --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:17:42 + --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:15:42 | LL | /*! block doc comment with bare CR: ' ' */ | ^ error: bare CR not allowed in string, use \r instead - --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:21:18 + --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:19:18 | LL | let _s = "foo bar"; | ^ error: bare CR not allowed in raw string - --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:24:19 + --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:22:19 | LL | let _s = r"bar foo"; | ^ error: unknown character escape: \r - --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:27:19 + --> $DIR/lex-bare-cr-string-literal-doc-comment.rs:25:19 | LL | let _s = "foo\ bar"; | ^ unknown character escape diff --git a/src/test/ui/parser/macro-mismatched-delim-brace-paren.rs b/src/test/ui/parser/macro-mismatched-delim-brace-paren.rs index 3f3e997dec..404aa7b806 100644 --- a/src/test/ui/parser/macro-mismatched-delim-brace-paren.rs +++ b/src/test/ui/parser/macro-mismatched-delim-brace-paren.rs @@ -3,5 +3,5 @@ macro_rules! foo { ($($tt:tt)*) => () } fn main() { foo! { bar, "baz", 1, 2.0 - ) //~ ERROR incorrect close delimiter + ) //~ ERROR mismatched closing delimiter } diff --git a/src/test/ui/parser/macro-mismatched-delim-brace-paren.stderr b/src/test/ui/parser/macro-mismatched-delim-brace-paren.stderr index f411ee8ce2..93c5ab383d 100644 --- a/src/test/ui/parser/macro-mismatched-delim-brace-paren.stderr +++ b/src/test/ui/parser/macro-mismatched-delim-brace-paren.stderr @@ -1,11 +1,11 @@ -error: incorrect close delimiter: `)` +error: mismatched closing delimiter: `)` --> $DIR/macro-mismatched-delim-brace-paren.rs:6:5 | LL | foo! { - | - un-closed delimiter + | - unclosed delimiter LL | bar, "baz", 1, 2.0 LL | ) - | ^ incorrect close delimiter + | ^ mismatched closing delimiter error: aborting due to previous error diff --git a/src/test/ui/parser/macro-mismatched-delim-paren-brace.rs b/src/test/ui/parser/macro-mismatched-delim-paren-brace.rs index 1185f882a1..1a1b9edfbc 100644 --- a/src/test/ui/parser/macro-mismatched-delim-paren-brace.rs +++ b/src/test/ui/parser/macro-mismatched-delim-paren-brace.rs @@ -1,5 +1,5 @@ fn main() { foo! ( bar, "baz", 1, 2.0 - } //~ ERROR incorrect close delimiter -} //~ ERROR unexpected close delimiter: `}` + } //~ ERROR mismatched closing delimiter +} //~ ERROR unexpected closing delimiter: `}` diff --git a/src/test/ui/parser/macro-mismatched-delim-paren-brace.stderr b/src/test/ui/parser/macro-mismatched-delim-paren-brace.stderr index b684339361..042142ac35 100644 --- a/src/test/ui/parser/macro-mismatched-delim-paren-brace.stderr +++ b/src/test/ui/parser/macro-mismatched-delim-paren-brace.stderr @@ -1,17 +1,17 @@ -error: unexpected close delimiter: `}` +error: unexpected closing delimiter: `}` --> $DIR/macro-mismatched-delim-paren-brace.rs:5:1 | LL | } - | ^ unexpected close delimiter + | ^ unexpected closing delimiter -error: incorrect close delimiter: `}` +error: mismatched closing delimiter: `}` --> $DIR/macro-mismatched-delim-paren-brace.rs:4:5 | LL | foo! ( - | - un-closed delimiter + | - unclosed delimiter LL | bar, "baz", 1, 2.0 LL | } - | ^ incorrect close delimiter + | ^ mismatched closing delimiter error: aborting due to 2 previous errors diff --git a/src/test/ui/parser/macro/pub-item-macro.stderr b/src/test/ui/parser/macro/pub-item-macro.stderr index fa25161ab5..ae981ac4cb 100644 --- a/src/test/ui/parser/macro/pub-item-macro.stderr +++ b/src/test/ui/parser/macro/pub-item-macro.stderr @@ -13,7 +13,16 @@ error[E0603]: static `x` is private --> $DIR/pub-item-macro.rs:17:23 | LL | let y: u32 = foo::x; - | ^ + | ^ this static is private + | +note: the static `x` is defined here + --> $DIR/pub-item-macro.rs:4:5 + | +LL | static x: u32 = 0; + | ^^^^^^^^^^^^^^^^^^ +... +LL | pub_x!(); + | --------- in this macro invocation error: aborting due to 2 previous errors diff --git a/src/test/ui/parser/macro/trait-non-item-macros.stderr b/src/test/ui/parser/macro/trait-non-item-macros.stderr index 0a433ab278..7647ba500e 100644 --- a/src/test/ui/parser/macro/trait-non-item-macros.stderr +++ b/src/test/ui/parser/macro/trait-non-item-macros.stderr @@ -1,8 +1,8 @@ -error: expected one of `async`, `const`, `crate`, `extern`, `fn`, `pub`, `type`, or `unsafe`, found `2` +error: expected one of `async`, `const`, `crate`, `default`, `extern`, `fn`, `pub`, `type`, or `unsafe`, found `2` --> $DIR/trait-non-item-macros.rs:2:19 | LL | ($a:expr) => ($a) - | ^^ expected one of 8 possible tokens + | ^^ expected one of 9 possible tokens ... LL | bah!(2); | -------- in this macro invocation diff --git a/src/test/ui/parser/match-vec-invalid.stderr b/src/test/ui/parser/match-vec-invalid.stderr deleted file mode 100644 index 58343e86d7..0000000000 --- a/src/test/ui/parser/match-vec-invalid.stderr +++ /dev/null @@ -1,42 +0,0 @@ -error[E0416]: identifier `tail` is bound more than once in the same pattern - --> $DIR/match-vec-invalid.rs:4:24 - | -LL | [1, tail @ .., tail @ ..] => {}, - | ^^^^ used in a pattern more than once - -error[E0658]: subslice patterns are unstable - --> $DIR/match-vec-invalid.rs:4:13 - | -LL | [1, tail @ .., tail @ ..] => {}, - | ^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/62254 - = help: add `#![feature(slice_patterns)]` to the crate attributes to enable - -error[E0658]: subslice patterns are unstable - --> $DIR/match-vec-invalid.rs:4:24 - | -LL | [1, tail @ .., tail @ ..] => {}, - | ^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/62254 - = help: add `#![feature(slice_patterns)]` to the crate attributes to enable - -error: `..` can only be used once per slice pattern - --> $DIR/match-vec-invalid.rs:4:31 - | -LL | [1, tail @ .., tail @ ..] => {}, - | -- ^^ can only be used once per slice pattern - | | - | previously used here - -error[E0308]: mismatched types - --> $DIR/match-vec-invalid.rs:13:30 - | -LL | const RECOVERY_WITNESS: () = 0; - | ^ expected `()`, found integer - -error: aborting due to 5 previous errors - -Some errors have detailed explanations: E0308, E0416, E0658. -For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/mbe_missing_right_paren.stderr b/src/test/ui/parser/mbe_missing_right_paren.stderr index 4504fc0eb0..c5b3cc275c 100644 --- a/src/test/ui/parser/mbe_missing_right_paren.stderr +++ b/src/test/ui/parser/mbe_missing_right_paren.stderr @@ -1,10 +1,10 @@ -error: this file contains an un-closed delimiter +error: this file contains an unclosed delimiter --> $DIR/mbe_missing_right_paren.rs:3:19 | LL | macro_rules! abc(ؼ | - ^ | | - | un-closed delimiter + | unclosed delimiter error: macros that expand to items must be delimited with braces or followed by a semicolon --> $DIR/mbe_missing_right_paren.rs:3:17 diff --git a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-impl-trait.rs b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-impl-trait.rs index 8d89905909..9f02a7a997 100644 --- a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-impl-trait.rs +++ b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-impl-trait.rs @@ -9,4 +9,4 @@ trait T { //~ ERROR expected one of pub(crate) struct Bar<T>(); fn main() {} -//~ ERROR this file contains an un-closed delimiter +//~ ERROR this file contains an unclosed delimiter diff --git a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-impl-trait.stderr b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-impl-trait.stderr index e1aed8a6b4..a23cfeac58 100644 --- a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-impl-trait.stderr +++ b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-impl-trait.stderr @@ -1,11 +1,11 @@ -error: this file contains an un-closed delimiter - --> $DIR/missing-close-brace-in-impl-trait.rs:12:53 +error: this file contains an unclosed delimiter + --> $DIR/missing-close-brace-in-impl-trait.rs:12:52 | LL | impl T for () { - | - un-closed delimiter + | - unclosed delimiter ... LL | - | ^ + | ^ error: expected one of `async`, `const`, `crate`, `default`, `extern`, `fn`, `pub`, `type`, `unsafe`, or `}`, found keyword `trait` --> $DIR/missing-close-brace-in-impl-trait.rs:5:1 diff --git a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-struct.rs b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-struct.rs index 5b716b1467..0d53315839 100644 --- a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-struct.rs +++ b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-struct.rs @@ -11,4 +11,4 @@ impl T for Bar<usize> { fn foo(&self) {} } -fn main() {} //~ ERROR this file contains an un-closed delimiter +fn main() {} //~ ERROR this file contains an unclosed delimiter diff --git a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-struct.stderr b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-struct.stderr index 15ce94a6d0..ac8dd48a58 100644 --- a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-struct.stderr +++ b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-struct.stderr @@ -1,11 +1,11 @@ -error: this file contains an un-closed delimiter - --> $DIR/missing-close-brace-in-struct.rs:14:66 +error: this file contains an unclosed delimiter + --> $DIR/missing-close-brace-in-struct.rs:14:65 | LL | pub(crate) struct Bar<T> { - | - un-closed delimiter + | - unclosed delimiter ... LL | fn main() {} - | ^ + | ^ error: expected identifier, found keyword `trait` --> $DIR/missing-close-brace-in-struct.rs:4:1 diff --git a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-trait.rs b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-trait.rs index 9f3d78d584..5ec5d45bbe 100644 --- a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-trait.rs +++ b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-trait.rs @@ -9,4 +9,4 @@ impl T for Bar<usize> { fn foo(&self) {} } -fn main() {} //~ ERROR this file contains an un-closed delimiter +fn main() {} //~ ERROR this file contains an unclosed delimiter diff --git a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-trait.stderr b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-trait.stderr index cbaf9315e8..2136401278 100644 --- a/src/test/ui/parser/mismatched-braces/missing-close-brace-in-trait.stderr +++ b/src/test/ui/parser/mismatched-braces/missing-close-brace-in-trait.stderr @@ -1,17 +1,17 @@ -error: this file contains an un-closed delimiter - --> $DIR/missing-close-brace-in-trait.rs:12:66 +error: this file contains an unclosed delimiter + --> $DIR/missing-close-brace-in-trait.rs:12:65 | LL | trait T { - | - un-closed delimiter + | - unclosed delimiter ... LL | fn main() {} - | ^ + | ^ -error: expected one of `async`, `const`, `extern`, `fn`, `type`, or `unsafe`, found keyword `struct` +error: expected one of `async`, `const`, `default`, `extern`, `fn`, `type`, or `unsafe`, found keyword `struct` --> $DIR/missing-close-brace-in-trait.rs:5:12 | LL | pub(crate) struct Bar<T>(); - | ^^^^^^ expected one of `async`, `const`, `extern`, `fn`, `type`, or `unsafe` + | ^^^^^^ expected one of 7 possible tokens error[E0601]: `main` function not found in crate `missing_close_brace_in_trait` --> $DIR/missing-close-brace-in-trait.rs:1:1 @@ -23,7 +23,7 @@ LL | | ... | LL | | LL | | fn main() {} - | |_________________________________________________________________^ consider adding a `main` function to `$DIR/missing-close-brace-in-trait.rs` + | |________________________________________________________________^ consider adding a `main` function to `$DIR/missing-close-brace-in-trait.rs` error: aborting due to 3 previous errors diff --git a/src/test/ui/parser/mismatched-delim-brace-empty-block.rs b/src/test/ui/parser/mismatched-delim-brace-empty-block.rs index 0f5a2cb09e..61d7a9af22 100644 --- a/src/test/ui/parser/mismatched-delim-brace-empty-block.rs +++ b/src/test/ui/parser/mismatched-delim-brace-empty-block.rs @@ -2,4 +2,4 @@ fn main() { } let _ = (); -} //~ ERROR unexpected close delimiter +} //~ ERROR unexpected closing delimiter diff --git a/src/test/ui/parser/mismatched-delim-brace-empty-block.stderr b/src/test/ui/parser/mismatched-delim-brace-empty-block.stderr index 5ae5fc91a4..311f1768d8 100644 --- a/src/test/ui/parser/mismatched-delim-brace-empty-block.stderr +++ b/src/test/ui/parser/mismatched-delim-brace-empty-block.stderr @@ -1,4 +1,4 @@ -error: unexpected close delimiter: `}` +error: unexpected closing delimiter: `}` --> $DIR/mismatched-delim-brace-empty-block.rs:5:1 | LL | fn main() { @@ -8,7 +8,7 @@ LL | | } | |_- this block is empty, you might have not meant to close it LL | let _ = (); LL | } - | ^ unexpected close delimiter + | ^ unexpected closing delimiter error: aborting due to previous error diff --git a/src/test/ui/parser/missing_right_paren.rs b/src/test/ui/parser/missing_right_paren.rs index 4f7c5eea1d..c35236ce79 100644 --- a/src/test/ui/parser/missing_right_paren.rs +++ b/src/test/ui/parser/missing_right_paren.rs @@ -1,3 +1,3 @@ // ignore-tidy-trailing-newlines -// error-pattern: aborting due to 2 previous errors +// error-pattern: aborting due to 3 previous errors fn main((ؼ \ No newline at end of file diff --git a/src/test/ui/parser/missing_right_paren.stderr b/src/test/ui/parser/missing_right_paren.stderr index ac16ebe641..d67e7c8891 100644 --- a/src/test/ui/parser/missing_right_paren.stderr +++ b/src/test/ui/parser/missing_right_paren.stderr @@ -1,11 +1,20 @@ -error: this file contains an un-closed delimiter +error: this file contains an unclosed delimiter --> $DIR/missing_right_paren.rs:3:11 | LL | fn main((ؼ | -- ^ | || - | |un-closed delimiter - | un-closed delimiter + | |unclosed delimiter + | unclosed delimiter + +error: this file contains an unclosed delimiter + --> $DIR/missing_right_paren.rs:3:11 + | +LL | fn main((ؼ + | -- ^ + | || + | |unclosed delimiter + | unclosed delimiter error: expected one of `:` or `|`, found `)` --> $DIR/missing_right_paren.rs:3:11 @@ -13,5 +22,5 @@ error: expected one of `:` or `|`, found `)` LL | fn main((ؼ | ^ expected one of `:` or `|` -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors diff --git a/src/test/ui/parser/paren-after-qualified-path-in-match.stderr b/src/test/ui/parser/paren-after-qualified-path-in-match.stderr index 79460e01f2..af21f91954 100644 --- a/src/test/ui/parser/paren-after-qualified-path-in-match.stderr +++ b/src/test/ui/parser/paren-after-qualified-path-in-match.stderr @@ -2,7 +2,9 @@ error: unexpected `(` after qualified path --> $DIR/paren-after-qualified-path-in-match.rs:3:27 | LL | <T as Trait>::Type(2) => (), - | ^ unexpected `(` after qualified path + | ------------------^ unexpected `(` after qualified path + | | + | the qualified path error: aborting due to previous error diff --git a/src/test/ui/parser/pat-lt-bracket-6.rs b/src/test/ui/parser/pat-lt-bracket-6.rs index f27caa5d78..7becffa9fe 100644 --- a/src/test/ui/parser/pat-lt-bracket-6.rs +++ b/src/test/ui/parser/pat-lt-bracket-6.rs @@ -4,7 +4,6 @@ fn main() { let Test(&desc[..]) = x; //~^ ERROR: expected one of `)`, `,`, `@`, or `|`, found `[` - //~^^ ERROR subslice patterns are unstable } const RECOVERY_WITNESS: () = 0; //~ ERROR mismatched types diff --git a/src/test/ui/parser/pat-lt-bracket-6.stderr b/src/test/ui/parser/pat-lt-bracket-6.stderr index fe9603cb57..035d0dbfe0 100644 --- a/src/test/ui/parser/pat-lt-bracket-6.stderr +++ b/src/test/ui/parser/pat-lt-bracket-6.stderr @@ -7,22 +7,12 @@ LL | let Test(&desc[..]) = x; | expected one of `)`, `,`, `@`, or `|` | help: missing `,` -error[E0658]: subslice patterns are unstable - --> $DIR/pat-lt-bracket-6.rs:5:20 - | -LL | let Test(&desc[..]) = x; - | ^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/62254 - = help: add `#![feature(slice_patterns)]` to the crate attributes to enable - error[E0308]: mismatched types - --> $DIR/pat-lt-bracket-6.rs:10:30 + --> $DIR/pat-lt-bracket-6.rs:9:30 | LL | const RECOVERY_WITNESS: () = 0; | ^ expected `()`, found integer -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors -Some errors have detailed explanations: E0308, E0658. -For more information about an error, try `rustc --explain E0308`. +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/pat-tuple-4.rs b/src/test/ui/parser/pat-tuple-4.rs deleted file mode 100644 index 2f03160430..0000000000 --- a/src/test/ui/parser/pat-tuple-4.rs +++ /dev/null @@ -1,11 +0,0 @@ -fn main() { - const PAT: u8 = 0; - - match 0 { - (.. PAT) => {} - //~^ ERROR `..X` range patterns are not supported - //~| ERROR exclusive range pattern syntax is experimental - } -} - -const RECOVERY_WITNESS: () = 0; //~ ERROR mismatched types diff --git a/src/test/ui/parser/pat-tuple-4.stderr b/src/test/ui/parser/pat-tuple-4.stderr deleted file mode 100644 index 6c64290e14..0000000000 --- a/src/test/ui/parser/pat-tuple-4.stderr +++ /dev/null @@ -1,25 +0,0 @@ -error: `..X` range patterns are not supported - --> $DIR/pat-tuple-4.rs:5:10 - | -LL | (.. PAT) => {} - | ^^^^^^ help: try using the minimum value for the type: `MIN..PAT` - -error[E0658]: exclusive range pattern syntax is experimental - --> $DIR/pat-tuple-4.rs:5:10 - | -LL | (.. PAT) => {} - | ^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/37854 - = help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable - -error[E0308]: mismatched types - --> $DIR/pat-tuple-4.rs:11:30 - | -LL | const RECOVERY_WITNESS: () = 0; - | ^ expected `()`, found integer - -error: aborting due to 3 previous errors - -Some errors have detailed explanations: E0308, E0658. -For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/pat-tuple-5.rs b/src/test/ui/parser/pat-tuple-5.rs deleted file mode 100644 index 5334ef93bb..0000000000 --- a/src/test/ui/parser/pat-tuple-5.rs +++ /dev/null @@ -1,10 +0,0 @@ -fn main() { - const PAT: u8 = 0; - - match (0, 1) { - (PAT ..) => {} - //~^ ERROR `X..` range patterns are not supported - //~| ERROR exclusive range pattern syntax is experimental - //~| ERROR mismatched types - } -} diff --git a/src/test/ui/parser/pat-tuple-5.stderr b/src/test/ui/parser/pat-tuple-5.stderr deleted file mode 100644 index 3579a2c4e0..0000000000 --- a/src/test/ui/parser/pat-tuple-5.stderr +++ /dev/null @@ -1,30 +0,0 @@ -error: `X..` range patterns are not supported - --> $DIR/pat-tuple-5.rs:5:10 - | -LL | (PAT ..) => {} - | ^^^^^^ help: try using the maximum value for the type: `PAT..MAX` - -error[E0658]: exclusive range pattern syntax is experimental - --> $DIR/pat-tuple-5.rs:5:10 - | -LL | (PAT ..) => {} - | ^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/37854 - = help: add `#![feature(exclusive_range_pattern)]` to the crate attributes to enable - -error[E0308]: mismatched types - --> $DIR/pat-tuple-5.rs:5:10 - | -LL | match (0, 1) { - | ------ this match expression has type `({integer}, {integer})` -LL | (PAT ..) => {} - | ^^^^^^ expected tuple, found `u8` - | - = note: expected tuple `({integer}, {integer})` - found type `u8` - -error: aborting due to 3 previous errors - -Some errors have detailed explanations: E0308, E0658. -For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/range_inclusive.rs b/src/test/ui/parser/range_inclusive.rs index bc61c5b49e..7c3b906b47 100644 --- a/src/test/ui/parser/range_inclusive.rs +++ b/src/test/ui/parser/range_inclusive.rs @@ -2,5 +2,5 @@ pub fn main() { for _ in 1..= {} //~ERROR inclusive range with no end - //~^HELP bounded at the end + //~^HELP use `..` instead } diff --git a/src/test/ui/parser/range_inclusive.stderr b/src/test/ui/parser/range_inclusive.stderr index 12b7edae79..1dd4799459 100644 --- a/src/test/ui/parser/range_inclusive.stderr +++ b/src/test/ui/parser/range_inclusive.stderr @@ -1,10 +1,10 @@ error[E0586]: inclusive range with no end - --> $DIR/range_inclusive.rs:4:19 + --> $DIR/range_inclusive.rs:4:15 | LL | for _ in 1..= {} - | ^ + | ^^^ help: use `..` instead | - = help: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) error: aborting due to previous error diff --git a/src/test/ui/parser/raw-byte-string-literals.rs b/src/test/ui/parser/raw-byte-string-literals.rs index 534afabdf7..163c8ac66b 100644 --- a/src/test/ui/parser/raw-byte-string-literals.rs +++ b/src/test/ui/parser/raw-byte-string-literals.rs @@ -1,5 +1,5 @@ // ignore-tidy-cr -// compile-flags: -Z continue-parse-after-error + pub fn main() { br"a "; //~ ERROR bare CR not allowed in raw string br"é"; //~ ERROR raw byte string must be ASCII diff --git a/src/test/ui/parser/recover-labeled-non-block-expr.rs b/src/test/ui/parser/recover-labeled-non-block-expr.rs new file mode 100644 index 0000000000..be92170acf --- /dev/null +++ b/src/test/ui/parser/recover-labeled-non-block-expr.rs @@ -0,0 +1,5 @@ +fn main() { + 'label: 1 + 1; //~ ERROR expected `while`, `for`, `loop` or `{` after a label + + let _recovery_witness: () = 0; //~ ERROR mismatched types +} diff --git a/src/test/ui/parser/recover-labeled-non-block-expr.stderr b/src/test/ui/parser/recover-labeled-non-block-expr.stderr new file mode 100644 index 0000000000..771a915288 --- /dev/null +++ b/src/test/ui/parser/recover-labeled-non-block-expr.stderr @@ -0,0 +1,17 @@ +error: expected `while`, `for`, `loop` or `{` after a label + --> $DIR/recover-labeled-non-block-expr.rs:2:13 + | +LL | 'label: 1 + 1; + | ^ expected `while`, `for`, `loop` or `{` after a label + +error[E0308]: mismatched types + --> $DIR/recover-labeled-non-block-expr.rs:4:33 + | +LL | let _recovery_witness: () = 0; + | -- ^ expected `()`, found integer + | | + | expected due to this + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/recover-range-pats.rs b/src/test/ui/parser/recover-range-pats.rs index 260e108315..e07ea6221d 100644 --- a/src/test/ui/parser/recover-range-pats.rs +++ b/src/test/ui/parser/recover-range-pats.rs @@ -4,6 +4,7 @@ // 2. Or at least we have parser recovery if they don't. #![feature(exclusive_range_pattern)] +#![feature(half_open_range_patterns)] #![deny(ellipsis_inclusive_range_patterns)] fn main() {} @@ -55,70 +56,66 @@ fn inclusive2_from_to() { } fn exclusive_from() { - if let 0.. = 0 {} //~ ERROR `X..` range patterns are not supported - if let X.. = 0 {} //~ ERROR `X..` range patterns are not supported - if let true.. = 0 {} //~ ERROR `X..` range patterns are not supported + if let 0.. = 0 {} + if let X.. = 0 {} + if let true.. = 0 {} //~^ ERROR only char and numeric types - if let .0.. = 0 {} //~ ERROR `X..` range patterns are not supported + if let .0.. = 0 {} //~^ ERROR float literals must have an integer part //~| ERROR mismatched types } fn inclusive_from() { - if let 0..= = 0 {} //~ ERROR `X..=` range patterns are not supported - if let X..= = 0 {} //~ ERROR `X..=` range patterns are not supported - if let true..= = 0 {} //~ ERROR `X..=` range patterns are not supported + if let 0..= = 0 {} //~ ERROR inclusive range with no end + if let X..= = 0 {} //~ ERROR inclusive range with no end + if let true..= = 0 {} //~ ERROR inclusive range with no end //~| ERROR only char and numeric types - if let .0..= = 0 {} //~ ERROR `X..=` range patterns are not supported + if let .0..= = 0 {} //~ ERROR inclusive range with no end //~^ ERROR float literals must have an integer part //~| ERROR mismatched types } fn inclusive2_from() { - if let 0... = 0 {} //~ ERROR `X...` range patterns are not supported - //~^ ERROR `...` range patterns are deprecated - if let X... = 0 {} //~ ERROR `X...` range patterns are not supported - //~^ ERROR `...` range patterns are deprecated - if let true... = 0 {} //~ ERROR `X...` range patterns are not supported - //~^ ERROR `...` range patterns are deprecated + if let 0... = 0 {} //~ ERROR inclusive range with no end + if let X... = 0 {} //~ ERROR inclusive range with no end + if let true... = 0 {} //~ ERROR inclusive range with no end //~| ERROR only char and numeric types - if let .0... = 0 {} //~ ERROR `X...` range patterns are not supported + if let .0... = 0 {} //~ ERROR inclusive range with no end //~^ ERROR float literals must have an integer part - //~| ERROR `...` range patterns are deprecated //~| ERROR mismatched types } fn exclusive_to() { - if let ..0 = 0 {} //~ ERROR `..X` range patterns are not supported - if let ..Y = 0 {} //~ ERROR `..X` range patterns are not supported - if let ..true = 0 {} //~ ERROR `..X` range patterns are not supported - //~| ERROR only char and numeric types - if let .. .0 = 0 {} //~ ERROR `..X` range patterns are not supported + if let ..0 = 0 {} + if let ..Y = 0 {} + if let ..true = 0 {} + //~^ ERROR only char and numeric types + if let .. .0 = 0 {} //~^ ERROR float literals must have an integer part //~| ERROR mismatched types } fn inclusive_to() { - if let ..=3 = 0 {} //~ ERROR `..=X` range patterns are not supported - if let ..=Y = 0 {} //~ ERROR `..=X` range patterns are not supported - if let ..=true = 0 {} //~ ERROR `..=X` range patterns are not supported - //~| ERROR only char and numeric types - if let ..=.0 = 0 {} //~ ERROR `..=X` range patterns are not supported + if let ..=3 = 0 {} + if let ..=Y = 0 {} + if let ..=true = 0 {} + //~^ ERROR only char and numeric types + if let ..=.0 = 0 {} //~^ ERROR float literals must have an integer part //~| ERROR mismatched types } fn inclusive2_to() { - if let ...3 = 0 {} //~ ERROR `...X` range patterns are not supported - //~^ ERROR `...` range patterns are deprecated - if let ...Y = 0 {} //~ ERROR `...X` range patterns are not supported - //~^ ERROR `...` range patterns are deprecated - if let ...true = 0 {} //~ ERROR `...X` range patterns are not supported - //~^ ERROR `...` range patterns are deprecated + if let ...3 = 0 {} + //~^ ERROR range-to patterns with `...` are not allowed + if let ...Y = 0 {} + //~^ ERROR range-to patterns with `...` are not allowed + if let ...true = 0 {} + //~^ ERROR range-to patterns with `...` are not allowed //~| ERROR only char and numeric types - if let ....3 = 0 {} //~ ERROR `...X` range patterns are not supported + if let ....3 = 0 {} //~^ ERROR float literals must have an integer part - //~| ERROR `...` range patterns are deprecated + //~| ERROR range-to patterns with `...` are not allowed //~| ERROR mismatched types } @@ -136,14 +133,13 @@ fn with_macro_expr_var() { macro_rules! mac { ($e:expr) => { - let ..$e; //~ ERROR `..X` range patterns are not supported - let ...$e; //~ ERROR `...X` range patterns are not supported - //~^ ERROR `...` range patterns are deprecated - let ..=$e; //~ ERROR `..=X` range patterns are not supported - let $e..; //~ ERROR `X..` range patterns are not supported - let $e...; //~ ERROR `X...` range patterns are not supported - //~^ ERROR `...` range patterns are deprecated - let $e..=; //~ ERROR `X..=` range patterns are not supported + let ..$e; + let ...$e; + //~^ ERROR range-to patterns with `...` are not allowed + let ..=$e; + let $e..; + let $e...; //~ ERROR inclusive range with no end + let $e..=; //~ ERROR inclusive range with no end } } diff --git a/src/test/ui/parser/recover-range-pats.stderr b/src/test/ui/parser/recover-range-pats.stderr index af03b57754..f43f9bf301 100644 --- a/src/test/ui/parser/recover-range-pats.stderr +++ b/src/test/ui/parser/recover-range-pats.stderr @@ -1,377 +1,250 @@ error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:21:12 + --> $DIR/recover-range-pats.rs:22:12 | LL | if let .0..Y = 0 {} | ^^ help: must have an integer part: `0.0` error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:23:16 + --> $DIR/recover-range-pats.rs:24:16 | LL | if let X.. .0 = 0 {} | ^^ help: must have an integer part: `0.0` error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:34:12 + --> $DIR/recover-range-pats.rs:35:12 | LL | if let .0..=Y = 0 {} | ^^ help: must have an integer part: `0.0` error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:36:16 + --> $DIR/recover-range-pats.rs:37:16 | LL | if let X..=.0 = 0 {} | ^^ help: must have an integer part: `0.0` error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:49:12 + --> $DIR/recover-range-pats.rs:50:12 | LL | if let .0...Y = 0 {} | ^^ help: must have an integer part: `0.0` error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:52:17 + --> $DIR/recover-range-pats.rs:53:17 | LL | if let X... .0 = 0 {} | ^^ help: must have an integer part: `0.0` -error: `X..` range patterns are not supported - --> $DIR/recover-range-pats.rs:58:12 - | -LL | if let 0.. = 0 {} - | ^^^ help: try using the maximum value for the type: `0..MAX` - -error: `X..` range patterns are not supported - --> $DIR/recover-range-pats.rs:59:12 - | -LL | if let X.. = 0 {} - | ^^^ help: try using the maximum value for the type: `X..MAX` - -error: `X..` range patterns are not supported - --> $DIR/recover-range-pats.rs:60:12 - | -LL | if let true.. = 0 {} - | ^^^^^^ help: try using the maximum value for the type: `true..MAX` - error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:62:12 + --> $DIR/recover-range-pats.rs:63:12 | LL | if let .0.. = 0 {} | ^^ help: must have an integer part: `0.0` -error: `X..` range patterns are not supported - --> $DIR/recover-range-pats.rs:62:12 - | -LL | if let .0.. = 0 {} - | ^^^^ help: try using the maximum value for the type: `0.0..MAX` - -error: `X..=` range patterns are not supported - --> $DIR/recover-range-pats.rs:68:12 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:69:13 | LL | if let 0..= = 0 {} - | ^^^^ help: try using the maximum value for the type: `0..=MAX` + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) -error: `X..=` range patterns are not supported - --> $DIR/recover-range-pats.rs:69:12 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:70:13 | LL | if let X..= = 0 {} - | ^^^^ help: try using the maximum value for the type: `X..=MAX` + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) -error: `X..=` range patterns are not supported - --> $DIR/recover-range-pats.rs:70:12 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:71:16 | LL | if let true..= = 0 {} - | ^^^^^^^ help: try using the maximum value for the type: `true..=MAX` + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:72:12 + --> $DIR/recover-range-pats.rs:73:12 | LL | if let .0..= = 0 {} | ^^ help: must have an integer part: `0.0` -error: `X..=` range patterns are not supported - --> $DIR/recover-range-pats.rs:72:12 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:73:14 | LL | if let .0..= = 0 {} - | ^^^^^ help: try using the maximum value for the type: `0.0..=MAX` + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) -error: `X...` range patterns are not supported - --> $DIR/recover-range-pats.rs:78:12 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:79:13 | LL | if let 0... = 0 {} - | ^^^^ help: try using the maximum value for the type: `0...MAX` + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) -error: `X...` range patterns are not supported - --> $DIR/recover-range-pats.rs:80:12 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:80:13 | LL | if let X... = 0 {} - | ^^^^ help: try using the maximum value for the type: `X...MAX` + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) -error: `X...` range patterns are not supported - --> $DIR/recover-range-pats.rs:82:12 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:81:16 | LL | if let true... = 0 {} - | ^^^^^^^ help: try using the maximum value for the type: `true...MAX` + | ^^^ help: use `..` instead + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:85:12 + --> $DIR/recover-range-pats.rs:83:12 | LL | if let .0... = 0 {} | ^^ help: must have an integer part: `0.0` -error: `X...` range patterns are not supported - --> $DIR/recover-range-pats.rs:85:12 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:83:14 | LL | if let .0... = 0 {} - | ^^^^^ help: try using the maximum value for the type: `0.0...MAX` - -error: `..X` range patterns are not supported - --> $DIR/recover-range-pats.rs:92:12 - | -LL | if let ..0 = 0 {} - | ^^^ help: try using the minimum value for the type: `MIN..0` - -error: `..X` range patterns are not supported - --> $DIR/recover-range-pats.rs:93:12 - | -LL | if let ..Y = 0 {} - | ^^^ help: try using the minimum value for the type: `MIN..Y` - -error: `..X` range patterns are not supported - --> $DIR/recover-range-pats.rs:94:12 + | ^^^ help: use `..` instead | -LL | if let ..true = 0 {} - | ^^^^^^ help: try using the minimum value for the type: `MIN..true` + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:96:15 + --> $DIR/recover-range-pats.rs:93:15 | LL | if let .. .0 = 0 {} | ^^ help: must have an integer part: `0.0` -error: `..X` range patterns are not supported - --> $DIR/recover-range-pats.rs:96:12 - | -LL | if let .. .0 = 0 {} - | ^^^^^ help: try using the minimum value for the type: `MIN..0.0` - -error: `..=X` range patterns are not supported - --> $DIR/recover-range-pats.rs:102:12 - | -LL | if let ..=3 = 0 {} - | ^^^^ help: try using the minimum value for the type: `MIN..=3` - -error: `..=X` range patterns are not supported - --> $DIR/recover-range-pats.rs:103:12 - | -LL | if let ..=Y = 0 {} - | ^^^^ help: try using the minimum value for the type: `MIN..=Y` - -error: `..=X` range patterns are not supported - --> $DIR/recover-range-pats.rs:104:12 - | -LL | if let ..=true = 0 {} - | ^^^^^^^ help: try using the minimum value for the type: `MIN..=true` - error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:106:15 + --> $DIR/recover-range-pats.rs:103:15 | LL | if let ..=.0 = 0 {} | ^^ help: must have an integer part: `0.0` -error: `..=X` range patterns are not supported - --> $DIR/recover-range-pats.rs:106:12 - | -LL | if let ..=.0 = 0 {} - | ^^^^^ help: try using the minimum value for the type: `MIN..=0.0` - -error: `...X` range patterns are not supported - --> $DIR/recover-range-pats.rs:112:12 +error: range-to patterns with `...` are not allowed + --> $DIR/recover-range-pats.rs:109:12 | LL | if let ...3 = 0 {} - | ^^^^ help: try using the minimum value for the type: `MIN...3` + | ^^^ help: use `..=` instead -error: `...X` range patterns are not supported - --> $DIR/recover-range-pats.rs:114:12 +error: range-to patterns with `...` are not allowed + --> $DIR/recover-range-pats.rs:111:12 | LL | if let ...Y = 0 {} - | ^^^^ help: try using the minimum value for the type: `MIN...Y` + | ^^^ help: use `..=` instead -error: `...X` range patterns are not supported - --> $DIR/recover-range-pats.rs:116:12 +error: range-to patterns with `...` are not allowed + --> $DIR/recover-range-pats.rs:113:12 | LL | if let ...true = 0 {} - | ^^^^^^^ help: try using the minimum value for the type: `MIN...true` + | ^^^ help: use `..=` instead error: float literals must have an integer part - --> $DIR/recover-range-pats.rs:119:15 + --> $DIR/recover-range-pats.rs:116:15 | LL | if let ....3 = 0 {} | ^^ help: must have an integer part: `0.3` -error: `...X` range patterns are not supported - --> $DIR/recover-range-pats.rs:119:12 +error: range-to patterns with `...` are not allowed + --> $DIR/recover-range-pats.rs:116:12 | LL | if let ....3 = 0 {} - | ^^^^^ help: try using the minimum value for the type: `MIN...0.3` - -error: `..X` range patterns are not supported - --> $DIR/recover-range-pats.rs:139:17 - | -LL | let ..$e; - | ^^ help: try using the minimum value for the type: `MIN..0` -... -LL | mac!(0); - | -------- in this macro invocation + | ^^^ help: use `..=` instead -error: `...X` range patterns are not supported - --> $DIR/recover-range-pats.rs:140:17 +error: range-to patterns with `...` are not allowed + --> $DIR/recover-range-pats.rs:137:17 | LL | let ...$e; - | ^^^ help: try using the minimum value for the type: `MIN...0` + | ^^^ help: use `..=` instead ... LL | mac!(0); | -------- in this macro invocation -error: `..=X` range patterns are not supported - --> $DIR/recover-range-pats.rs:142:17 - | -LL | let ..=$e; - | ^^^ help: try using the minimum value for the type: `MIN..=0` -... -LL | mac!(0); - | -------- in this macro invocation - -error: `X..` range patterns are not supported - --> $DIR/recover-range-pats.rs:143:19 - | -LL | let $e..; - | ^^ help: try using the maximum value for the type: `0..MAX` -... -LL | mac!(0); - | -------- in this macro invocation - -error: `X...` range patterns are not supported - --> $DIR/recover-range-pats.rs:144:19 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:141:19 | LL | let $e...; - | ^^^ help: try using the maximum value for the type: `0...MAX` + | ^^^ help: use `..` instead ... LL | mac!(0); | -------- in this macro invocation + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) -error: `X..=` range patterns are not supported - --> $DIR/recover-range-pats.rs:146:19 +error[E0586]: inclusive range with no end + --> $DIR/recover-range-pats.rs:142:19 | LL | let $e..=; - | ^^^ help: try using the maximum value for the type: `0..=MAX` + | ^^^ help: use `..` instead ... LL | mac!(0); | -------- in this macro invocation + | + = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:41:13 + --> $DIR/recover-range-pats.rs:42:13 | LL | if let 0...3 = 0 {} | ^^^ help: use `..=` for an inclusive range | note: lint level defined here - --> $DIR/recover-range-pats.rs:7:9 + --> $DIR/recover-range-pats.rs:8:9 | LL | #![deny(ellipsis_inclusive_range_patterns)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:42:13 + --> $DIR/recover-range-pats.rs:43:13 | LL | if let 0...Y = 0 {} | ^^^ help: use `..=` for an inclusive range error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:43:13 + --> $DIR/recover-range-pats.rs:44:13 | LL | if let X...3 = 0 {} | ^^^ help: use `..=` for an inclusive range error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:44:13 + --> $DIR/recover-range-pats.rs:45:13 | LL | if let X...Y = 0 {} | ^^^ help: use `..=` for an inclusive range error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:45:16 + --> $DIR/recover-range-pats.rs:46:16 | LL | if let true...Y = 0 {} | ^^^ help: use `..=` for an inclusive range error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:47:13 + --> $DIR/recover-range-pats.rs:48:13 | LL | if let X...true = 0 {} | ^^^ help: use `..=` for an inclusive range error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:49:14 + --> $DIR/recover-range-pats.rs:50:14 | LL | if let .0...Y = 0 {} | ^^^ help: use `..=` for an inclusive range error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:52:13 + --> $DIR/recover-range-pats.rs:53:13 | LL | if let X... .0 = 0 {} | ^^^ help: use `..=` for an inclusive range error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:78:13 - | -LL | if let 0... = 0 {} - | ^^^ help: use `..=` for an inclusive range - -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:80:13 - | -LL | if let X... = 0 {} - | ^^^ help: use `..=` for an inclusive range - -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:82:16 - | -LL | if let true... = 0 {} - | ^^^ help: use `..=` for an inclusive range - -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:85:14 - | -LL | if let .0... = 0 {} - | ^^^ help: use `..=` for an inclusive range - -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:112:12 - | -LL | if let ...3 = 0 {} - | ^^^ help: use `..=` for an inclusive range - -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:114:12 - | -LL | if let ...Y = 0 {} - | ^^^ help: use `..=` for an inclusive range - -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:116:12 - | -LL | if let ...true = 0 {} - | ^^^ help: use `..=` for an inclusive range - -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:119:12 - | -LL | if let ....3 = 0 {} - | ^^^ help: use `..=` for an inclusive range - -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:129:20 + --> $DIR/recover-range-pats.rs:126:20 | LL | let $e1...$e2; | ^^^ help: use `..=` for an inclusive range @@ -379,26 +252,8 @@ LL | let $e1...$e2; LL | mac2!(0, 1); | ------------ in this macro invocation -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:140:17 - | -LL | let ...$e; - | ^^^ help: use `..=` for an inclusive range -... -LL | mac!(0); - | -------- in this macro invocation - -error: `...` range patterns are deprecated - --> $DIR/recover-range-pats.rs:144:19 - | -LL | let $e...; - | ^^^ help: use `..=` for an inclusive range -... -LL | mac!(0); - | -------- in this macro invocation - error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:19:12 + --> $DIR/recover-range-pats.rs:20:12 | LL | if let true..Y = 0 {} | ^^^^ - this is of type `u8` @@ -406,7 +261,7 @@ LL | if let true..Y = 0 {} | this is of type `bool` but it should be `char` or numeric error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:20:15 + --> $DIR/recover-range-pats.rs:21:15 | LL | if let X..true = 0 {} | - ^^^^ this is of type `bool` but it should be `char` or numeric @@ -414,19 +269,24 @@ LL | if let X..true = 0 {} | this is of type `u8` error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:21:12 + --> $DIR/recover-range-pats.rs:22:12 | LL | if let .0..Y = 0 {} - | ^^^^^ expected integer, found floating-point number + | ^^ - this is of type `u8` + | | + | expected integer, found floating-point number error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:23:12 + --> $DIR/recover-range-pats.rs:24:16 | LL | if let X.. .0 = 0 {} - | ^^^^^^ expected integer, found floating-point number + | - ^^ - this expression has type `u8` + | | | + | | expected integer, found floating-point number + | this is of type `u8` error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:32:12 + --> $DIR/recover-range-pats.rs:33:12 | LL | if let true..=Y = 0 {} | ^^^^ - this is of type `u8` @@ -434,7 +294,7 @@ LL | if let true..=Y = 0 {} | this is of type `bool` but it should be `char` or numeric error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:33:16 + --> $DIR/recover-range-pats.rs:34:16 | LL | if let X..=true = 0 {} | - ^^^^ this is of type `bool` but it should be `char` or numeric @@ -442,19 +302,24 @@ LL | if let X..=true = 0 {} | this is of type `u8` error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:34:12 + --> $DIR/recover-range-pats.rs:35:12 | LL | if let .0..=Y = 0 {} - | ^^^^^^ expected integer, found floating-point number + | ^^ - this is of type `u8` + | | + | expected integer, found floating-point number error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:36:12 + --> $DIR/recover-range-pats.rs:37:16 | LL | if let X..=.0 = 0 {} - | ^^^^^^ expected integer, found floating-point number + | - ^^ - this expression has type `u8` + | | | + | | expected integer, found floating-point number + | this is of type `u8` error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:45:12 + --> $DIR/recover-range-pats.rs:46:12 | LL | if let true...Y = 0 {} | ^^^^ - this is of type `u8` @@ -462,7 +327,7 @@ LL | if let true...Y = 0 {} | this is of type `bool` but it should be `char` or numeric error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:47:16 + --> $DIR/recover-range-pats.rs:48:16 | LL | if let X...true = 0 {} | - ^^^^ this is of type `bool` but it should be `char` or numeric @@ -470,90 +335,95 @@ LL | if let X...true = 0 {} | this is of type `u8` error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:49:12 + --> $DIR/recover-range-pats.rs:50:12 | LL | if let .0...Y = 0 {} - | ^^^^^^ expected integer, found floating-point number + | ^^ - this is of type `u8` + | | + | expected integer, found floating-point number error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:52:12 + --> $DIR/recover-range-pats.rs:53:17 | LL | if let X... .0 = 0 {} - | ^^^^^^^ expected integer, found floating-point number + | - ^^ - this expression has type `u8` + | | | + | | expected integer, found floating-point number + | this is of type `u8` error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:60:12 + --> $DIR/recover-range-pats.rs:61:12 | LL | if let true.. = 0 {} | ^^^^ this is of type `bool` but it should be `char` or numeric error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:62:12 + --> $DIR/recover-range-pats.rs:63:12 | LL | if let .0.. = 0 {} - | ^^^^ expected integer, found floating-point number + | ^^ expected integer, found floating-point number error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:70:12 + --> $DIR/recover-range-pats.rs:71:12 | LL | if let true..= = 0 {} | ^^^^ this is of type `bool` but it should be `char` or numeric error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:72:12 + --> $DIR/recover-range-pats.rs:73:12 | LL | if let .0..= = 0 {} - | ^^^^^ expected integer, found floating-point number + | ^^ expected integer, found floating-point number error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:82:12 + --> $DIR/recover-range-pats.rs:81:12 | LL | if let true... = 0 {} | ^^^^ this is of type `bool` but it should be `char` or numeric error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:85:12 + --> $DIR/recover-range-pats.rs:83:12 | LL | if let .0... = 0 {} - | ^^^^^ expected integer, found floating-point number + | ^^ expected integer, found floating-point number error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:94:14 + --> $DIR/recover-range-pats.rs:91:14 | LL | if let ..true = 0 {} | ^^^^ this is of type `bool` but it should be `char` or numeric error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:96:12 + --> $DIR/recover-range-pats.rs:93:15 | LL | if let .. .0 = 0 {} - | ^^^^^ expected integer, found floating-point number + | ^^ expected integer, found floating-point number error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:104:15 + --> $DIR/recover-range-pats.rs:101:15 | LL | if let ..=true = 0 {} | ^^^^ this is of type `bool` but it should be `char` or numeric error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:106:12 + --> $DIR/recover-range-pats.rs:103:15 | LL | if let ..=.0 = 0 {} - | ^^^^^ expected integer, found floating-point number + | ^^ expected integer, found floating-point number error[E0029]: only char and numeric types are allowed in range patterns - --> $DIR/recover-range-pats.rs:116:15 + --> $DIR/recover-range-pats.rs:113:15 | LL | if let ...true = 0 {} | ^^^^ this is of type `bool` but it should be `char` or numeric error[E0308]: mismatched types - --> $DIR/recover-range-pats.rs:119:12 + --> $DIR/recover-range-pats.rs:116:15 | LL | if let ....3 = 0 {} - | ^^^^^ expected integer, found floating-point number + | ^^ expected integer, found floating-point number -error: aborting due to 85 previous errors +error: aborting due to 60 previous errors -Some errors have detailed explanations: E0029, E0308. +Some errors have detailed explanations: E0029, E0308, E0586. For more information about an error, try `rustc --explain E0029`. diff --git a/src/test/ui/parser/recovery-attr-on-if.rs b/src/test/ui/parser/recovery-attr-on-if.rs new file mode 100644 index 0000000000..0d1f5be7b4 --- /dev/null +++ b/src/test/ui/parser/recovery-attr-on-if.rs @@ -0,0 +1,9 @@ +fn main() { + #[attr] if true {}; + //~^ ERROR cannot find attribute + //~| ERROR attributes are not yet allowed on `if` expressions + #[attr] if true {}; + //~^ ERROR cannot find attribute + //~| ERROR attributes are not yet allowed on `if` expressions + let _recovery_witness: () = 0; //~ ERROR mismatched types +} diff --git a/src/test/ui/parser/recovery-attr-on-if.stderr b/src/test/ui/parser/recovery-attr-on-if.stderr new file mode 100644 index 0000000000..a02846827c --- /dev/null +++ b/src/test/ui/parser/recovery-attr-on-if.stderr @@ -0,0 +1,35 @@ +error: attributes are not yet allowed on `if` expressions + --> $DIR/recovery-attr-on-if.rs:2:5 + | +LL | #[attr] if true {}; + | ^^^^^^^ + +error: attributes are not yet allowed on `if` expressions + --> $DIR/recovery-attr-on-if.rs:5:5 + | +LL | #[attr] if true {}; + | ^^^^^^^ + +error: cannot find attribute `attr` in this scope + --> $DIR/recovery-attr-on-if.rs:5:7 + | +LL | #[attr] if true {}; + | ^^^^ + +error: cannot find attribute `attr` in this scope + --> $DIR/recovery-attr-on-if.rs:2:7 + | +LL | #[attr] if true {}; + | ^^^^ + +error[E0308]: mismatched types + --> $DIR/recovery-attr-on-if.rs:8:33 + | +LL | let _recovery_witness: () = 0; + | -- ^ expected `()`, found integer + | | + | expected due to this + +error: aborting due to 5 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/require-parens-for-chained-comparison.rs b/src/test/ui/parser/require-parens-for-chained-comparison.rs index 9c7a25d589..e27b03dddc 100644 --- a/src/test/ui/parser/require-parens-for-chained-comparison.rs +++ b/src/test/ui/parser/require-parens-for-chained-comparison.rs @@ -3,24 +3,26 @@ struct X; fn main() { false == false == false; - //~^ ERROR chained comparison operators require parentheses + //~^ ERROR comparison operators cannot be chained false == 0 < 2; - //~^ ERROR chained comparison operators require parentheses + //~^ ERROR comparison operators cannot be chained //~| ERROR mismatched types //~| ERROR mismatched types f<X>(); - //~^ ERROR chained comparison operators require parentheses + //~^ ERROR comparison operators cannot be chained //~| HELP use `::<...>` instead of `<...>` to specify type arguments f<Result<Option<X>, Option<Option<X>>>(1, 2); - //~^ ERROR chained comparison operators require parentheses + //~^ ERROR comparison operators cannot be chained + //~| HELP split the comparison into two... + //~| ...or parenthesize one of the comparisons //~| HELP use `::<...>` instead of `<...>` to specify type arguments use std::convert::identity; let _ = identity<u8>; - //~^ ERROR chained comparison operators require parentheses + //~^ ERROR comparison operators cannot be chained //~| HELP use `::<...>` instead of `<...>` to specify type arguments //~| HELP or use `(...)` if you meant to specify fn arguments } diff --git a/src/test/ui/parser/require-parens-for-chained-comparison.stderr b/src/test/ui/parser/require-parens-for-chained-comparison.stderr index bece9a3880..44edf2de7f 100644 --- a/src/test/ui/parser/require-parens-for-chained-comparison.stderr +++ b/src/test/ui/parser/require-parens-for-chained-comparison.stderr @@ -1,16 +1,16 @@ -error: chained comparison operators require parentheses +error: comparison operators cannot be chained --> $DIR/require-parens-for-chained-comparison.rs:5:11 | LL | false == false == false; | ^^^^^^^^^^^ -error: chained comparison operators require parentheses +error: comparison operators cannot be chained --> $DIR/require-parens-for-chained-comparison.rs:8:11 | LL | false == 0 < 2; | ^^^^^^ -error: chained comparison operators require parentheses +error: comparison operators cannot be chained --> $DIR/require-parens-for-chained-comparison.rs:13:6 | LL | f<X>(); @@ -21,19 +21,27 @@ help: use `::<...>` instead of `<...>` to specify type arguments LL | f::<X>(); | ^^ -error: chained comparison operators require parentheses +error: comparison operators cannot be chained --> $DIR/require-parens-for-chained-comparison.rs:17:6 | LL | f<Result<Option<X>, Option<Option<X>>>(1, 2); | ^^^^^^^^ | +help: split the comparison into two... + | +LL | f < Result && Result <Option<X>, Option<Option<X>>>(1, 2); + | ^^^^^^^^^^^^^^^^^^^^^^ +help: ...or parenthesize one of the comparisons + | +LL | (f < Result) <Option<X>, Option<Option<X>>>(1, 2); + | ^^^^^^^^^^^^^^ help: use `::<...>` instead of `<...>` to specify type arguments | LL | f::<Result<Option<X>, Option<Option<X>>>(1, 2); | ^^ -error: chained comparison operators require parentheses - --> $DIR/require-parens-for-chained-comparison.rs:22:21 +error: comparison operators cannot be chained + --> $DIR/require-parens-for-chained-comparison.rs:24:21 | LL | let _ = identity<u8>; | ^^^^ diff --git a/src/test/ui/parser/stmt_expr_attrs_placement.rs b/src/test/ui/parser/stmt_expr_attrs_placement.rs new file mode 100644 index 0000000000..b8a794f4b9 --- /dev/null +++ b/src/test/ui/parser/stmt_expr_attrs_placement.rs @@ -0,0 +1,22 @@ +#![feature(stmt_expr_attributes)] + +// Test that various placements of the inner attribute are parsed correctly, +// or not. + +fn main() { + let a = #![allow(warnings)] (1, 2); + //~^ ERROR an inner attribute is not permitted in this context + + let b = (#![allow(warnings)] 1, 2); + + let c = { + #![allow(warnings)] + (#![allow(warnings)] 1, 2) + }; + + let d = { + #![allow(warnings)] + let e = (#![allow(warnings)] 1, 2); + e + }; +} diff --git a/src/test/ui/parser/stmt_expr_attrs_placement.stderr b/src/test/ui/parser/stmt_expr_attrs_placement.stderr new file mode 100644 index 0000000000..1886a0f9ba --- /dev/null +++ b/src/test/ui/parser/stmt_expr_attrs_placement.stderr @@ -0,0 +1,10 @@ +error: an inner attribute is not permitted in this context + --> $DIR/stmt_expr_attrs_placement.rs:7:13 + | +LL | let a = #![allow(warnings)] (1, 2); + | ^^^^^^^^^^^^^^^^^^^ + | + = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them. + +error: aborting due to previous error + diff --git a/src/test/ui/parser/trait-item-with-defaultness-fail-semantic.rs b/src/test/ui/parser/trait-item-with-defaultness-fail-semantic.rs new file mode 100644 index 0000000000..09f967f161 --- /dev/null +++ b/src/test/ui/parser/trait-item-with-defaultness-fail-semantic.rs @@ -0,0 +1,12 @@ +#![feature(specialization)] + +fn main() {} + +trait X { + default const A: u8; //~ ERROR `default` is only allowed on items in `impl` definitions + default const B: u8 = 0; //~ ERROR `default` is only allowed on items in `impl` definitions + default type D; //~ ERROR `default` is only allowed on items in `impl` definitions + default type C: Ord; //~ ERROR `default` is only allowed on items in `impl` definitions + default fn f1(); //~ ERROR `default` is only allowed on items in `impl` definitions + default fn f2() {} //~ ERROR `default` is only allowed on items in `impl` definitions +} diff --git a/src/test/ui/parser/trait-item-with-defaultness-fail-semantic.stderr b/src/test/ui/parser/trait-item-with-defaultness-fail-semantic.stderr new file mode 100644 index 0000000000..54111df342 --- /dev/null +++ b/src/test/ui/parser/trait-item-with-defaultness-fail-semantic.stderr @@ -0,0 +1,38 @@ +error: `default` is only allowed on items in `impl` definitions + --> $DIR/trait-item-with-defaultness-fail-semantic.rs:6:5 + | +LL | default const A: u8; + | ^^^^^^^^^^^^^^^^^^^^ + +error: `default` is only allowed on items in `impl` definitions + --> $DIR/trait-item-with-defaultness-fail-semantic.rs:7:5 + | +LL | default const B: u8 = 0; + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: `default` is only allowed on items in `impl` definitions + --> $DIR/trait-item-with-defaultness-fail-semantic.rs:8:5 + | +LL | default type D; + | ^^^^^^^^^^^^^^^ + +error: `default` is only allowed on items in `impl` definitions + --> $DIR/trait-item-with-defaultness-fail-semantic.rs:9:5 + | +LL | default type C: Ord; + | ^^^^^^^^^^^^^^^^^^^^ + +error: `default` is only allowed on items in `impl` definitions + --> $DIR/trait-item-with-defaultness-fail-semantic.rs:10:5 + | +LL | default fn f1(); + | ^^^^^^^^^^^^^^^^ + +error: `default` is only allowed on items in `impl` definitions + --> $DIR/trait-item-with-defaultness-fail-semantic.rs:11:5 + | +LL | default fn f2() {} + | ^^^^^^^^^^^^^^^^^^ + +error: aborting due to 6 previous errors + diff --git a/src/test/ui/parser/trait-item-with-defaultness-pass.rs b/src/test/ui/parser/trait-item-with-defaultness-pass.rs new file mode 100644 index 0000000000..a6318bd99e --- /dev/null +++ b/src/test/ui/parser/trait-item-with-defaultness-pass.rs @@ -0,0 +1,13 @@ +// check-pass + +fn main() {} + +#[cfg(FALSE)] +trait X { + default const A: u8; + default const B: u8 = 0; + default type D; + default type C: Ord; + default fn f1(); + default fn f2() {} +} diff --git a/src/test/ui/parser/trait-object-trait-parens.stderr b/src/test/ui/parser/trait-object-trait-parens.stderr index 03fb764ee0..4b9f49423c 100644 --- a/src/test/ui/parser/trait-object-trait-parens.stderr +++ b/src/test/ui/parser/trait-object-trait-parens.stderr @@ -33,6 +33,9 @@ LL | let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>; error[E0261]: use of undeclared lifetime name `'a` --> $DIR/trait-object-trait-parens.rs:11:31 | +LL | fn main() { + | - help: consider introducing lifetime `'a` here: `<'a>` +... LL | let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>; | ^^ undeclared lifetime diff --git a/src/test/ui/parser/type-parameters-in-field-exprs.rs b/src/test/ui/parser/type-parameters-in-field-exprs.rs index 1b8ed9f12b..6a3b2c1c60 100644 --- a/src/test/ui/parser/type-parameters-in-field-exprs.rs +++ b/src/test/ui/parser/type-parameters-in-field-exprs.rs @@ -1,5 +1,3 @@ -// compile-flags: -Z continue-parse-after-error - struct Foo { x: isize, y: isize, diff --git a/src/test/ui/parser/type-parameters-in-field-exprs.stderr b/src/test/ui/parser/type-parameters-in-field-exprs.stderr index 8f32fb0eca..306b4754d0 100644 --- a/src/test/ui/parser/type-parameters-in-field-exprs.stderr +++ b/src/test/ui/parser/type-parameters-in-field-exprs.stderr @@ -1,17 +1,17 @@ error: field expressions may not have generic arguments - --> $DIR/type-parameters-in-field-exprs.rs:13:10 + --> $DIR/type-parameters-in-field-exprs.rs:11:10 | LL | f.x::<isize>; | ^^^^^^^ error: field expressions may not have generic arguments - --> $DIR/type-parameters-in-field-exprs.rs:15:10 + --> $DIR/type-parameters-in-field-exprs.rs:13:10 | LL | f.x::<>; | ^^ error: field expressions may not have generic arguments - --> $DIR/type-parameters-in-field-exprs.rs:17:7 + --> $DIR/type-parameters-in-field-exprs.rs:15:7 | LL | f.x::(); | ^^^^^ diff --git a/src/test/ui/parser/unclosed-braces.rs b/src/test/ui/parser/unclosed-braces.rs index 9c9ab76613..ed94fff386 100644 --- a/src/test/ui/parser/unclosed-braces.rs +++ b/src/test/ui/parser/unclosed-braces.rs @@ -11,7 +11,7 @@ fn foo() { } fn main() { -//~^ NOTE un-closed delimiter +//~^ NOTE unclosed delimiter { { //~^ NOTE this delimiter might not be properly closed... @@ -19,4 +19,4 @@ fn main() { } //~^ NOTE ...as it matches this but it has different indentation } -//~ ERROR this file contains an un-closed delimiter +//~ ERROR this file contains an unclosed delimiter diff --git a/src/test/ui/parser/unclosed-braces.stderr b/src/test/ui/parser/unclosed-braces.stderr index 44c7e930a3..cbc5f8de4c 100644 --- a/src/test/ui/parser/unclosed-braces.stderr +++ b/src/test/ui/parser/unclosed-braces.stderr @@ -1,8 +1,8 @@ -error: this file contains an un-closed delimiter - --> $DIR/unclosed-braces.rs:22:53 +error: this file contains an unclosed delimiter + --> $DIR/unclosed-braces.rs:22:52 | LL | fn main() { - | - un-closed delimiter + | - unclosed delimiter ... LL | { | - this delimiter might not be properly closed... @@ -11,7 +11,7 @@ LL | } | - ...as it matches this but it has different indentation ... LL | - | ^ + | ^ error: aborting due to previous error diff --git a/src/test/ui/parser/unclosed-delimiter-in-dep.stderr b/src/test/ui/parser/unclosed-delimiter-in-dep.stderr index bda59d4dea..a32a27bf98 100644 --- a/src/test/ui/parser/unclosed-delimiter-in-dep.stderr +++ b/src/test/ui/parser/unclosed-delimiter-in-dep.stderr @@ -1,13 +1,13 @@ -error: incorrect close delimiter: `}` +error: mismatched closing delimiter: `}` --> $DIR/unclosed_delim_mod.rs:7:1 | LL | pub fn new() -> Result<Value, ()> { - | - close delimiter possibly meant for this + | - closing delimiter possibly meant for this LL | Ok(Value { - | - un-closed delimiter + | - unclosed delimiter LL | } LL | } - | ^ incorrect close delimiter + | ^ mismatched closing delimiter error[E0308]: mismatched types --> $DIR/unclosed-delimiter-in-dep.rs:4:20 diff --git a/src/test/ui/parser/unclosed_delim_mod.rs b/src/test/ui/parser/unclosed_delim_mod.rs index 486e233128..d977d2c03d 100644 --- a/src/test/ui/parser/unclosed_delim_mod.rs +++ b/src/test/ui/parser/unclosed_delim_mod.rs @@ -5,4 +5,4 @@ pub fn new() -> Result<Value, ()> { Ok(Value { } } -//~^ ERROR incorrect close delimiter +//~^ ERROR mismatched closing delimiter diff --git a/src/test/ui/parser/unclosed_delim_mod.stderr b/src/test/ui/parser/unclosed_delim_mod.stderr index fe2d968af0..9c16707212 100644 --- a/src/test/ui/parser/unclosed_delim_mod.stderr +++ b/src/test/ui/parser/unclosed_delim_mod.stderr @@ -1,13 +1,13 @@ -error: incorrect close delimiter: `}` +error: mismatched closing delimiter: `}` --> $DIR/unclosed_delim_mod.rs:7:1 | LL | pub fn new() -> Result<Value, ()> { - | - close delimiter possibly meant for this + | - closing delimiter possibly meant for this LL | Ok(Value { - | - un-closed delimiter + | - unclosed delimiter LL | } LL | } - | ^ incorrect close delimiter + | ^ mismatched closing delimiter error: aborting due to previous error diff --git a/src/test/ui/parser/unmatched-delimiter-at-end-of-file.rs b/src/test/ui/parser/unmatched-delimiter-at-end-of-file.rs index 3eef75bafd..f56013266c 100644 --- a/src/test/ui/parser/unmatched-delimiter-at-end-of-file.rs +++ b/src/test/ui/parser/unmatched-delimiter-at-end-of-file.rs @@ -8,4 +8,4 @@ fn main() { y: 5 }; } -fn foo() { //~ ERROR this file contains an un-closed delimiter +fn foo() { //~ ERROR this file contains an unclosed delimiter diff --git a/src/test/ui/parser/unmatched-delimiter-at-end-of-file.stderr b/src/test/ui/parser/unmatched-delimiter-at-end-of-file.stderr index bfbdb0363e..430a13e6e0 100644 --- a/src/test/ui/parser/unmatched-delimiter-at-end-of-file.stderr +++ b/src/test/ui/parser/unmatched-delimiter-at-end-of-file.stderr @@ -1,8 +1,8 @@ -error: this file contains an un-closed delimiter - --> $DIR/unmatched-delimiter-at-end-of-file.rs:11:64 +error: this file contains an unclosed delimiter + --> $DIR/unmatched-delimiter-at-end-of-file.rs:11:63 | LL | fn foo() { - | - un-closed delimiter ^ + | - unclosed delimiter ^ error: aborting due to previous error diff --git a/src/test/ui/parser/variadic-ffi-3.rs b/src/test/ui/parser/variadic-ffi-3.rs deleted file mode 100644 index ce83cc87ab..0000000000 --- a/src/test/ui/parser/variadic-ffi-3.rs +++ /dev/null @@ -1,5 +0,0 @@ -fn foo(x: isize, ...) { - //~^ ERROR: only foreign functions are allowed to be C-variadic -} - -fn main() {} diff --git a/src/test/ui/parser/variadic-ffi-3.stderr b/src/test/ui/parser/variadic-ffi-3.stderr deleted file mode 100644 index aeeebdb991..0000000000 --- a/src/test/ui/parser/variadic-ffi-3.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0743]: only foreign functions are allowed to be C-variadic - --> $DIR/variadic-ffi-3.rs:1:18 - | -LL | fn foo(x: isize, ...) { - | ^^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0743`. diff --git a/src/test/ui/parser/variadic-ffi-4.rs b/src/test/ui/parser/variadic-ffi-4.rs deleted file mode 100644 index 5f8b3f8f53..0000000000 --- a/src/test/ui/parser/variadic-ffi-4.rs +++ /dev/null @@ -1,5 +0,0 @@ -extern "C" fn foo(x: isize, ...) { - //~^ ERROR: only foreign functions are allowed to be C-variadic -} - -fn main() {} diff --git a/src/test/ui/parser/variadic-ffi-4.stderr b/src/test/ui/parser/variadic-ffi-4.stderr deleted file mode 100644 index da83276c72..0000000000 --- a/src/test/ui/parser/variadic-ffi-4.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0743]: only foreign functions are allowed to be C-variadic - --> $DIR/variadic-ffi-4.rs:1:29 - | -LL | extern "C" fn foo(x: isize, ...) { - | ^^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0743`. diff --git a/src/test/ui/parser/variadic-ffi-nested-syntactic-fail.rs b/src/test/ui/parser/variadic-ffi-nested-syntactic-fail.rs new file mode 100644 index 0000000000..9eeee195e5 --- /dev/null +++ b/src/test/ui/parser/variadic-ffi-nested-syntactic-fail.rs @@ -0,0 +1,9 @@ +fn f1<'a>(x: u8, y: &'a ...) {} +//~^ ERROR C-variadic type `...` may not be nested inside another type + +fn f2<'a>(x: u8, y: Vec<&'a ...>) {} +//~^ ERROR C-variadic type `...` may not be nested inside another type + +fn main() { + let _recovery_witness: () = 0; //~ ERROR mismatched types +} diff --git a/src/test/ui/parser/variadic-ffi-nested-syntactic-fail.stderr b/src/test/ui/parser/variadic-ffi-nested-syntactic-fail.stderr new file mode 100644 index 0000000000..8b9d676a45 --- /dev/null +++ b/src/test/ui/parser/variadic-ffi-nested-syntactic-fail.stderr @@ -0,0 +1,24 @@ +error[E0743]: C-variadic type `...` may not be nested inside another type + --> $DIR/variadic-ffi-nested-syntactic-fail.rs:1:25 + | +LL | fn f1<'a>(x: u8, y: &'a ...) {} + | ^^^ + +error[E0743]: C-variadic type `...` may not be nested inside another type + --> $DIR/variadic-ffi-nested-syntactic-fail.rs:4:29 + | +LL | fn f2<'a>(x: u8, y: Vec<&'a ...>) {} + | ^^^ + +error[E0308]: mismatched types + --> $DIR/variadic-ffi-nested-syntactic-fail.rs:8:33 + | +LL | let _recovery_witness: () = 0; + | -- ^ expected `()`, found integer + | | + | expected due to this + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0308, E0743. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/parser/variadic-ffi-semantic-restrictions.rs b/src/test/ui/parser/variadic-ffi-semantic-restrictions.rs new file mode 100644 index 0000000000..aa85f6d6b5 --- /dev/null +++ b/src/test/ui/parser/variadic-ffi-semantic-restrictions.rs @@ -0,0 +1,76 @@ +#![feature(c_variadic)] + +fn main() {} + +fn f1_1(x: isize, ...) {} +//~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + +fn f1_2(...) {} +//~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic +//~| ERROR C-variadic function must be declared with at least one named argument + +extern "C" fn f2_1(x: isize, ...) {} +//~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + +extern "C" fn f2_2(...) {} +//~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic +//~| ERROR C-variadic function must be declared with at least one named argument + +extern "C" fn f2_3(..., x: isize) {} +//~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic +//~| ERROR `...` must be the last argument of a C-variadic function + +extern fn f3_1(x: isize, ...) {} +//~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + +extern fn f3_2(...) {} +//~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic +//~| ERROR C-variadic function must be declared with at least one named argument + +extern fn f3_3(..., x: isize) {} +//~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic +//~| ERROR `...` must be the last argument of a C-variadic function + +extern { + fn e_f1(...); + //~^ ERROR C-variadic function must be declared with at least one named argument + fn e_f2(..., x: isize); + //~^ ERROR `...` must be the last argument of a C-variadic function +} + +struct X; + +impl X { + fn i_f1(x: isize, ...) {} + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + fn i_f2(...) {} + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + //~| ERROR C-variadic function must be declared with at least one named argument + fn i_f3(..., x: isize, ...) {} + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + //~| ERROR only foreign or `unsafe extern "C" functions may be C-variadic + //~| ERROR `...` must be the last argument of a C-variadic function + fn i_f4(..., x: isize, ...) {} + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + //~| ERROR only foreign or `unsafe extern "C" functions may be C-variadic + //~| ERROR `...` must be the last argument of a C-variadic function +} + +trait T { + fn t_f1(x: isize, ...) {} + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + fn t_f2(x: isize, ...); + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + fn t_f3(...) {} + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + //~| ERROR C-variadic function must be declared with at least one named argument + fn t_f4(...); + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + //~| ERROR C-variadic function must be declared with at least one named argument + fn t_f5(..., x: isize) {} + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + //~| ERROR `...` must be the last argument of a C-variadic function + fn t_f6(..., x: isize); + //~^ ERROR only foreign or `unsafe extern "C" functions may be C-variadic + //~| ERROR `...` must be the last argument of a C-variadic function +} diff --git a/src/test/ui/parser/variadic-ffi-semantic-restrictions.stderr b/src/test/ui/parser/variadic-ffi-semantic-restrictions.stderr new file mode 100644 index 0000000000..21992a2967 --- /dev/null +++ b/src/test/ui/parser/variadic-ffi-semantic-restrictions.stderr @@ -0,0 +1,206 @@ +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:5:19 + | +LL | fn f1_1(x: isize, ...) {} + | ^^^^ + +error: C-variadic function must be declared with at least one named argument + --> $DIR/variadic-ffi-semantic-restrictions.rs:8:9 + | +LL | fn f1_2(...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:8:9 + | +LL | fn f1_2(...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:12:30 + | +LL | extern "C" fn f2_1(x: isize, ...) {} + | ^^^^ + +error: C-variadic function must be declared with at least one named argument + --> $DIR/variadic-ffi-semantic-restrictions.rs:15:20 + | +LL | extern "C" fn f2_2(...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:15:20 + | +LL | extern "C" fn f2_2(...) {} + | ^^^^ + +error: `...` must be the last argument of a C-variadic function + --> $DIR/variadic-ffi-semantic-restrictions.rs:19:20 + | +LL | extern "C" fn f2_3(..., x: isize) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:19:20 + | +LL | extern "C" fn f2_3(..., x: isize) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:23:26 + | +LL | extern fn f3_1(x: isize, ...) {} + | ^^^^ + +error: C-variadic function must be declared with at least one named argument + --> $DIR/variadic-ffi-semantic-restrictions.rs:26:16 + | +LL | extern fn f3_2(...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:26:16 + | +LL | extern fn f3_2(...) {} + | ^^^^ + +error: `...` must be the last argument of a C-variadic function + --> $DIR/variadic-ffi-semantic-restrictions.rs:30:16 + | +LL | extern fn f3_3(..., x: isize) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:30:16 + | +LL | extern fn f3_3(..., x: isize) {} + | ^^^^ + +error: C-variadic function must be declared with at least one named argument + --> $DIR/variadic-ffi-semantic-restrictions.rs:35:13 + | +LL | fn e_f1(...); + | ^^^^ + +error: `...` must be the last argument of a C-variadic function + --> $DIR/variadic-ffi-semantic-restrictions.rs:37:13 + | +LL | fn e_f2(..., x: isize); + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:44:23 + | +LL | fn i_f1(x: isize, ...) {} + | ^^^^ + +error: C-variadic function must be declared with at least one named argument + --> $DIR/variadic-ffi-semantic-restrictions.rs:46:13 + | +LL | fn i_f2(...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:46:13 + | +LL | fn i_f2(...) {} + | ^^^^ + +error: `...` must be the last argument of a C-variadic function + --> $DIR/variadic-ffi-semantic-restrictions.rs:49:13 + | +LL | fn i_f3(..., x: isize, ...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:49:13 + | +LL | fn i_f3(..., x: isize, ...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:49:28 + | +LL | fn i_f3(..., x: isize, ...) {} + | ^^^^ + +error: `...` must be the last argument of a C-variadic function + --> $DIR/variadic-ffi-semantic-restrictions.rs:53:13 + | +LL | fn i_f4(..., x: isize, ...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:53:13 + | +LL | fn i_f4(..., x: isize, ...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:53:28 + | +LL | fn i_f4(..., x: isize, ...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:60:23 + | +LL | fn t_f1(x: isize, ...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:62:23 + | +LL | fn t_f2(x: isize, ...); + | ^^^^ + +error: C-variadic function must be declared with at least one named argument + --> $DIR/variadic-ffi-semantic-restrictions.rs:64:13 + | +LL | fn t_f3(...) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:64:13 + | +LL | fn t_f3(...) {} + | ^^^^ + +error: C-variadic function must be declared with at least one named argument + --> $DIR/variadic-ffi-semantic-restrictions.rs:67:13 + | +LL | fn t_f4(...); + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:67:13 + | +LL | fn t_f4(...); + | ^^^^ + +error: `...` must be the last argument of a C-variadic function + --> $DIR/variadic-ffi-semantic-restrictions.rs:70:13 + | +LL | fn t_f5(..., x: isize) {} + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:70:13 + | +LL | fn t_f5(..., x: isize) {} + | ^^^^ + +error: `...` must be the last argument of a C-variadic function + --> $DIR/variadic-ffi-semantic-restrictions.rs:73:13 + | +LL | fn t_f6(..., x: isize); + | ^^^^ + +error: only foreign or `unsafe extern "C" functions may be C-variadic + --> $DIR/variadic-ffi-semantic-restrictions.rs:73:13 + | +LL | fn t_f6(..., x: isize); + | ^^^^ + +error: aborting due to 34 previous errors + diff --git a/src/test/ui/parser/variadic-ffi-syntactic-pass.rs b/src/test/ui/parser/variadic-ffi-syntactic-pass.rs new file mode 100644 index 0000000000..3875d6af13 --- /dev/null +++ b/src/test/ui/parser/variadic-ffi-syntactic-pass.rs @@ -0,0 +1,53 @@ +// check-pass + +fn main() {} + +#[cfg(FALSE)] +fn f1_1(x: isize, ...) {} + +#[cfg(FALSE)] +fn f1_2(...) {} + +#[cfg(FALSE)] +extern "C" fn f2_1(x: isize, ...) {} + +#[cfg(FALSE)] +extern "C" fn f2_2(...) {} + +#[cfg(FALSE)] +extern "C" fn f2_3(..., x: isize) {} + +#[cfg(FALSE)] +extern fn f3_1(x: isize, ...) {} + +#[cfg(FALSE)] +extern fn f3_2(...) {} + +#[cfg(FALSE)] +extern fn f3_3(..., x: isize) {} + +#[cfg(FALSE)] +extern { + fn e_f1(...); + fn e_f2(..., x: isize); +} + +struct X; + +#[cfg(FALSE)] +impl X { + fn i_f1(x: isize, ...) {} + fn i_f2(...) {} + fn i_f3(..., x: isize, ...) {} + fn i_f4(..., x: isize, ...) {} +} + +#[cfg(FALSE)] +trait T { + fn t_f1(x: isize, ...) {} + fn t_f2(x: isize, ...); + fn t_f3(...) {} + fn t_f4(...); + fn t_f5(..., x: isize) {} + fn t_f6(..., x: isize); +} diff --git a/src/test/ui/paths-containing-nul.rs b/src/test/ui/paths-containing-nul.rs index c9bf710b8e..e9510b53fe 100644 --- a/src/test/ui/paths-containing-nul.rs +++ b/src/test/ui/paths-containing-nul.rs @@ -17,7 +17,7 @@ fn assert_invalid_input<T>(on: &str, result: io::Result<T>) { "{} returned a strange {:?} on a path with NUL", on, e.kind()), } } - inner(on, result.map(|_| ())) + inner(on, result.map(drop)) } fn main() { diff --git a/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.rs b/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.rs new file mode 100644 index 0000000000..75d7af58e7 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.rs @@ -0,0 +1,35 @@ +// This test is taken directly from #16053. +// It checks that you cannot use an AND-pattern (`binding @ pat`) +// where one side is by-ref and the other is by-move. + +#![feature(bindings_after_at)] + +struct X { x: () } + +fn main() { + let x = Some(X { x: () }); + match x { + Some(ref _y @ _z) => { }, //~ ERROR cannot bind by-move and by-ref in the same pattern + None => panic!() + } + + let x = Some(X { x: () }); + match x { + Some(_z @ ref _y) => { }, //~ ERROR cannot bind by-move with sub-bindings + //~^ ERROR borrow of moved value + None => panic!() + } + + let mut x = Some(X { x: () }); + match x { + Some(ref mut _y @ _z) => { }, //~ ERROR cannot bind by-move and by-ref in the same pattern + None => panic!() + } + + let mut x = Some(X { x: () }); + match x { + Some(_z @ ref mut _y) => { }, //~ ERROR cannot bind by-move with sub-bindings + //~^ ERROR borrow of moved value + None => panic!() + } +} diff --git a/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.stderr b/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.stderr new file mode 100644 index 0000000000..22d62ff4f0 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/bind-by-move-neither-can-live-while-the-other-survives-1.stderr @@ -0,0 +1,56 @@ +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:12:23 + | +LL | Some(ref _y @ _z) => { }, + | ---------^^ + | | | + | | by-move pattern here + | by-ref pattern here + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:18:14 + | +LL | Some(_z @ ref _y) => { }, + | ^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:25:27 + | +LL | Some(ref mut _y @ _z) => { }, + | -------------^^ + | | | + | | by-move pattern here + | by-ref pattern here + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:31:14 + | +LL | Some(_z @ ref mut _y) => { }, + | ^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0382]: borrow of moved value + --> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:18:19 + | +LL | Some(_z @ ref _y) => { }, + | -----^^^^^^ + | | | + | | value borrowed here after move + | value moved here + | + = note: move occurs because value has type `X`, which does not implement the `Copy` trait + +error[E0382]: borrow of moved value + --> $DIR/bind-by-move-neither-can-live-while-the-other-survives-1.rs:31:19 + | +LL | Some(_z @ ref mut _y) => { }, + | -----^^^^^^^^^^ + | | | + | | value borrowed here after move + | value moved here + | + = note: move occurs because value has type `X`, which does not implement the `Copy` trait + +error: aborting due to 6 previous errors + +Some errors have detailed explanations: E0007, E0009, E0382. +For more information about an error, try `rustc --explain E0007`. diff --git a/src/test/ui/pattern/bindings-after-at/bind-by-move-no-subbindings-fun-param.rs b/src/test/ui/pattern/bindings-after-at/bind-by-move-no-subbindings-fun-param.rs new file mode 100644 index 0000000000..86fb04e2ed --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/bind-by-move-no-subbindings-fun-param.rs @@ -0,0 +1,14 @@ +// See issue #12534. + +#![feature(bindings_after_at)] + +fn main() {} + +struct A(Box<u8>); + +fn f(a @ A(u): A) -> Box<u8> { + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + drop(a); + u +} diff --git a/src/test/ui/pattern/bindings-after-at/bind-by-move-no-subbindings-fun-param.stderr b/src/test/ui/pattern/bindings-after-at/bind-by-move-no-subbindings-fun-param.stderr new file mode 100644 index 0000000000..b039708fd3 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/bind-by-move-no-subbindings-fun-param.stderr @@ -0,0 +1,20 @@ +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/bind-by-move-no-subbindings-fun-param.rs:9:6 + | +LL | fn f(a @ A(u): A) -> Box<u8> { + | ^^^^^^^^ binds an already bound by-move value by moving it + +error[E0382]: use of moved value + --> $DIR/bind-by-move-no-subbindings-fun-param.rs:9:12 + | +LL | fn f(a @ A(u): A) -> Box<u8> { + | ------^- + | | | + | | value used here after move + | value moved here + | move occurs because value has type `A`, which does not implement the `Copy` trait + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0007, E0382. +For more information about an error, try `rustc --explain E0007`. diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-move-and-move.rs b/src/test/ui/pattern/bindings-after-at/borrowck-move-and-move.rs new file mode 100644 index 0000000000..2cd375da9a --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-move-and-move.rs @@ -0,0 +1,46 @@ +// Test that moving on both sides of an `@` pattern is not allowed. + +#![feature(bindings_after_at)] + +fn main() { + struct U; // Not copy! + + // Prevent promotion: + fn u() -> U { U } + + let a @ b = U; + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + let a @ (b, c) = (U, U); + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + let a @ (b, c) = (u(), u()); + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + match Ok(U) { + a @ Ok(b) | a @ Err(b) => {} + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + //~| ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + } + + fn fun(a @ b: U) {} + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + match [u(), u(), u(), u()] { + xs @ [a, .., b] => {} + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + } + + match [u(), u(), u(), u()] { + xs @ [_, ys @ .., _] => {} + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + } +} diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-move-and-move.stderr b/src/test/ui/pattern/bindings-after-at/borrowck-move-and-move.stderr new file mode 100644 index 0000000000..12ebcb72af --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-move-and-move.stderr @@ -0,0 +1,133 @@ +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-move-and-move.rs:11:9 + | +LL | let a @ b = U; + | ^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-move-and-move.rs:15:9 + | +LL | let a @ (b, c) = (U, U); + | ^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-move-and-move.rs:19:9 + | +LL | let a @ (b, c) = (u(), u()); + | ^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-move-and-move.rs:24:9 + | +LL | a @ Ok(b) | a @ Err(b) => {} + | ^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-move-and-move.rs:24:21 + | +LL | a @ Ok(b) | a @ Err(b) => {} + | ^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-move-and-move.rs:36:9 + | +LL | xs @ [a, .., b] => {} + | ^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-move-and-move.rs:42:9 + | +LL | xs @ [_, ys @ .., _] => {} + | ^^^^^^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-move-and-move.rs:31:12 + | +LL | fn fun(a @ b: U) {} + | ^^^^^ binds an already bound by-move value by moving it + +error[E0382]: use of moved value + --> $DIR/borrowck-move-and-move.rs:11:13 + | +LL | let a @ b = U; + | ----^ - move occurs because value has type `main::U`, which does not implement the `Copy` trait + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/borrowck-move-and-move.rs:15:17 + | +LL | let a @ (b, c) = (U, U); + | --------^- ------ move occurs because value has type `(main::U, main::U)`, which does not implement the `Copy` trait + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/borrowck-move-and-move.rs:19:17 + | +LL | let a @ (b, c) = (u(), u()); + | --------^- ---------- move occurs because value has type `(main::U, main::U)`, which does not implement the `Copy` trait + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/borrowck-move-and-move.rs:24:16 + | +LL | match Ok(U) { + | ----- move occurs because value has type `std::result::Result<main::U, main::U>`, which does not implement the `Copy` trait +LL | a @ Ok(b) | a @ Err(b) => {} + | -------^- + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/borrowck-move-and-move.rs:24:29 + | +LL | match Ok(U) { + | ----- move occurs because value has type `std::result::Result<main::U, main::U>`, which does not implement the `Copy` trait +LL | a @ Ok(b) | a @ Err(b) => {} + | --------^- + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/borrowck-move-and-move.rs:36:22 + | +LL | match [u(), u(), u(), u()] { + | -------------------- move occurs because value has type `[main::U; 4]`, which does not implement the `Copy` trait +LL | xs @ [a, .., b] => {} + | -------------^- + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/borrowck-move-and-move.rs:42:18 + | +LL | match [u(), u(), u(), u()] { + | -------------------- move occurs because value has type `[main::U; 4]`, which does not implement the `Copy` trait +LL | xs @ [_, ys @ .., _] => {} + | ---------^^^^^^^---- + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/borrowck-move-and-move.rs:31:16 + | +LL | fn fun(a @ b: U) {} + | ----^ + | | | + | | value used here after move + | value moved here + | move occurs because value has type `main::U`, which does not implement the `Copy` trait + +error: aborting due to 16 previous errors + +Some errors have detailed explanations: E0007, E0382. +For more information about an error, try `rustc --explain E0007`. diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box-pass.rs b/src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box-pass.rs new file mode 100644 index 0000000000..092bd1133d --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box-pass.rs @@ -0,0 +1,75 @@ +// check-pass + +// Test `@` patterns combined with `box` patterns. + +#![feature(bindings_after_at)] +#![feature(box_patterns)] + +#[derive(Copy, Clone)] +struct C; + +fn c() -> C { C } + +struct NC; + +fn nc() -> NC { NC } + +fn main() { + let ref a @ box b = Box::new(C); // OK; the type is `Copy`. + drop(b); + drop(b); + drop(a); + + let ref a @ box b = Box::new(c()); // OK; the type is `Copy`. + drop(b); + drop(b); + drop(a); + + fn f3(ref a @ box b: Box<C>) { // OK; the type is `Copy`. + drop(b); + drop(b); + drop(a); + } + match Box::new(c()) { + ref a @ box b => { // OK; the type is `Copy`. + drop(b); + drop(b); + drop(a); + } + } + + let ref a @ box ref b = Box::new(NC); // OK. + drop(a); + drop(b); + + fn f4(ref a @ box ref b: Box<NC>) { // OK. + drop(a); + drop(b) + } + + match Box::new(nc()) { + ref a @ box ref b => { // OK. + drop(a); + drop(b); + } + } + + match Box::new([Ok(c()), Err(nc()), Ok(c())]) { + box [Ok(a), ref xs @ .., Err(ref b)] => { + let _: C = a; + let _: &[Result<C, NC>; 1] = xs; + let _: &NC = b; + } + _ => {} + } + + match [Ok(Box::new(c())), Err(Box::new(nc())), Ok(Box::new(c())), Ok(Box::new(c()))] { + [Ok(box a), ref xs @ .., Err(box ref b), Err(box ref c)] => { + let _: C = a; + let _: &[Result<Box<C>, Box<NC>>; 1] = xs; + let _: &NC = b; + let _: &NC = c; + } + _ => {} + } +} diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box.rs b/src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box.rs new file mode 100644 index 0000000000..3b2f598dc0 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box.rs @@ -0,0 +1,84 @@ +// Test `@` patterns combined with `box` patterns. + +#![feature(bindings_after_at)] +#![feature(box_patterns)] + +#[derive(Copy, Clone)] +struct C; + +fn c() -> C { C } + +struct NC; + +fn nc() -> NC { NC } + +fn main() { + let a @ box &b = Box::new(&C); + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + let a @ box b = Box::new(C); + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + fn f1(a @ box &b: Box<&C>) {} + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + fn f2(a @ box b: Box<C>) {} + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + match Box::new(C) { a @ box b => {} } + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + let ref a @ box b = Box::new(NC); //~ ERROR cannot bind by-move and by-ref in the same pattern + + let ref a @ box ref mut b = Box::new(nc()); + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + let ref a @ box ref mut b = Box::new(NC); + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + let ref a @ box ref mut b = Box::new(NC); + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + *b = NC; + let ref a @ box ref mut b = Box::new(NC); + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + //~| ERROR cannot borrow `_` as mutable because it is also borrowed as immutable + *b = NC; + drop(a); + + let ref mut a @ box ref b = Box::new(NC); + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + //~| ERROR cannot borrow `_` as immutable because it is also borrowed as mutable + *a = Box::new(NC); + drop(b); + + fn f5(ref mut a @ box ref b: Box<NC>) { + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + //~| ERROR cannot borrow `_` as immutable because it is also borrowed as mutable + *a = Box::new(NC); + drop(b); + } + + match Box::new(nc()) { + ref mut a @ box ref b => { + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + //~| ERROR cannot borrow `_` as immutable because it is also borrowed as mutable + *a = Box::new(NC); + drop(b); + } + } + + match Box::new([Ok(c()), Err(nc()), Ok(c())]) { + box [Ok(a), ref xs @ .., Err(b)] => {} + //~^ ERROR cannot bind by-move and by-ref in the same pattern + _ => {} + } + + match [Ok(Box::new(c())), Err(Box::new(nc())), Ok(Box::new(c())), Ok(Box::new(c()))] { + [Ok(box ref a), ref xs @ .., Err(box b), Err(box ref mut c)] => {} + //~^ ERROR cannot bind by-move and by-ref in the same pattern + _ => {} + } +} diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box.stderr b/src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box.stderr new file mode 100644 index 0000000000..e96c15b0fa --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-at-and-box.stderr @@ -0,0 +1,220 @@ +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-pat-at-and-box.rs:16:9 + | +LL | let a @ box &b = Box::new(&C); + | ^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-pat-at-and-box.rs:20:9 + | +LL | let a @ box b = Box::new(C); + | ^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-pat-at-and-box.rs:32:25 + | +LL | match Box::new(C) { a @ box b => {} } + | ^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/borrowck-pat-at-and-box.rs:36:21 + | +LL | let ref a @ box b = Box::new(NC); + | ------------^ + | | | + | | by-move pattern here + | by-ref pattern here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-at-and-box.rs:38:9 + | +LL | let ref a @ box ref mut b = Box::new(nc()); + | -----^^^^^^^--------- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-at-and-box.rs:40:9 + | +LL | let ref a @ box ref mut b = Box::new(NC); + | -----^^^^^^^--------- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-at-and-box.rs:42:9 + | +LL | let ref a @ box ref mut b = Box::new(NC); + | -----^^^^^^^--------- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-at-and-box.rs:45:9 + | +LL | let ref a @ box ref mut b = Box::new(NC); + | -----^^^^^^^--------- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-at-and-box.rs:51:9 + | +LL | let ref mut a @ box ref b = Box::new(NC); + | ---------^^^^^^^----- + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-at-and-box.rs:65:9 + | +LL | ref mut a @ box ref b => { + | ---------^^^^^^^----- + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/borrowck-pat-at-and-box.rs:74:38 + | +LL | box [Ok(a), ref xs @ .., Err(b)] => {} + | ----------- ^ by-move pattern here + | | + | by-ref pattern here + +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/borrowck-pat-at-and-box.rs:80:46 + | +LL | [Ok(box ref a), ref xs @ .., Err(box b), Err(box ref mut c)] => {} + | ----- ----------- ^ --------- by-ref pattern here + | | | | + | | | by-move pattern here + | | by-ref pattern here + | by-ref pattern here + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-pat-at-and-box.rs:24:11 + | +LL | fn f1(a @ box &b: Box<&C>) {} + | ^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-pat-at-and-box.rs:28:11 + | +LL | fn f2(a @ box b: Box<C>) {} + | ^^^^^^^^^ binds an already bound by-move value by moving it + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-at-and-box.rs:57:11 + | +LL | fn f5(ref mut a @ box ref b: Box<NC>) { + | ---------^^^^^^^----- + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error[E0382]: use of moved value + --> $DIR/borrowck-pat-at-and-box.rs:16:18 + | +LL | let a @ box &b = Box::new(&C); + | ---------^ ------------ move occurs because value has type `std::boxed::Box<&C>`, which does not implement the `Copy` trait + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/borrowck-pat-at-and-box.rs:20:17 + | +LL | let a @ box b = Box::new(C); + | --------^ ----------- move occurs because value has type `std::boxed::Box<C>`, which does not implement the `Copy` trait + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/borrowck-pat-at-and-box.rs:32:33 + | +LL | match Box::new(C) { a @ box b => {} } + | ----------- --------^ + | | | | + | | | value used here after move + | | value moved here + | move occurs because value has type `std::boxed::Box<C>`, which does not implement the `Copy` trait + +error[E0502]: cannot borrow `_` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-at-and-box.rs:45:21 + | +LL | let ref a @ box ref mut b = Box::new(NC); + | ------------^^^^^^^^^ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here +... +LL | drop(a); + | - immutable borrow later used here + +error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-at-and-box.rs:51:25 + | +LL | let ref mut a @ box ref b = Box::new(NC); + | ----------------^^^^^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here +... +LL | *a = Box::new(NC); + | -- mutable borrow later used here + +error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-at-and-box.rs:65:25 + | +LL | ref mut a @ box ref b => { + | ----------------^^^^^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here +... +LL | *a = Box::new(NC); + | -- mutable borrow later used here + +error[E0382]: use of moved value + --> $DIR/borrowck-pat-at-and-box.rs:24:20 + | +LL | fn f1(a @ box &b: Box<&C>) {} + | ---------^ + | | | + | | value used here after move + | value moved here + | move occurs because value has type `std::boxed::Box<&C>`, which does not implement the `Copy` trait + +error[E0382]: use of moved value + --> $DIR/borrowck-pat-at-and-box.rs:28:19 + | +LL | fn f2(a @ box b: Box<C>) {} + | --------^ + | | | + | | value used here after move + | value moved here + | move occurs because value has type `std::boxed::Box<C>`, which does not implement the `Copy` trait + +error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-at-and-box.rs:57:27 + | +LL | fn f5(ref mut a @ box ref b: Box<NC>) { + | ----------------^^^^^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here +... +LL | *a = Box::new(NC); + | -- mutable borrow later used here + +error: aborting due to 24 previous errors + +Some errors have detailed explanations: E0007, E0009, E0382, E0502. +For more information about an error, try `rustc --explain E0007`. diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-copy-bindings-in-at.rs b/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-copy-bindings-in-at.rs new file mode 100644 index 0000000000..c4ce50c8b9 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-copy-bindings-in-at.rs @@ -0,0 +1,51 @@ +// check-pass + +// Test `Copy` bindings in the rhs of `@` patterns. + +#![feature(bindings_after_at)] + +#[derive(Copy, Clone)] +struct C; + +fn mk_c() -> C { C } + +#[derive(Copy, Clone)] +struct P<A, B>(A, B); + +enum E<A, B> { L(A), R(B) } + +fn main() { + let a @ b @ c @ d = C; + let a @ (b, c) = (C, mk_c()); + let a @ P(b, P(c, d)) = P(mk_c(), P(C, C)); + let a @ [b, c] = [C, C]; + let a @ [b, .., c] = [C, mk_c(), C]; + let a @ [b, mid @ .., c] = [C, mk_c(), C]; + let a @ &(b, c) = &(C, C); + let a @ &(b, &P(c, d)) = &(mk_c(), &P(C, C)); + + fn foo(a @ [b, mid @ .., c]: [C; 3]) {} + + use self::E::*; + match L(C) { + L(a) | R(a) => { + let a: C = a; + drop(a); + drop(a); + } + } + match R(&L(&mk_c())) { + L(L(&a)) | L(R(&a)) | R(L(&a)) | R(R(&a)) => { + let a: C = a; + drop(a); + drop(a); + } + } + + match Ok(mk_c()) { + Ok(ref a @ b) | Err(b @ ref a) => { + let _: &C = a; + let _: C = b; + } + } +} diff --git a/src/test/ui/error-codes/E0303.rs b/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref.rs similarity index 51% rename from src/test/ui/error-codes/E0303.rs rename to src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref.rs index 0530d43b65..abe5ed81b7 100644 --- a/src/test/ui/error-codes/E0303.rs +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref.rs @@ -1,8 +1,9 @@ +#![feature(bindings_after_at)] + fn main() { match Some("hi".to_string()) { ref op_string_ref @ Some(s) => {}, - //~^ ERROR pattern bindings are not allowed after an `@` [E0303] - //~| ERROR E0009 + //~^ ERROR cannot bind by-move and by-ref in the same pattern [E0009] None => {}, } } diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref.stderr b/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref.stderr new file mode 100644 index 0000000000..1f70a6c437 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-by-move-and-ref.stderr @@ -0,0 +1,12 @@ +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/borrowck-pat-by-move-and-ref.rs:5:34 + | +LL | ref op_string_ref @ Some(s) => {}, + | -------------------------^- + | | | + | | by-move pattern here + | by-ref pattern here + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0009`. diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-both-sides.rs b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-both-sides.rs new file mode 100644 index 0000000000..fb243016a1 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-both-sides.rs @@ -0,0 +1,47 @@ +// check-pass + +// Test that `ref` patterns may be used on both sides +// of an `@` pattern according to NLL borrowck. + +#![feature(bindings_after_at)] + +fn main() { + struct U; // Not copy! + + // Promotion: + let ref a @ ref b = U; + let _: &U = a; + let _: &U = b; + + // Prevent promotion: + fn u() -> U { U } + + let ref a @ ref b = u(); + let _: &U = a; + let _: &U = b; + + let ref a @ (ref b, [ref c, ref d]) = (u(), [u(), u()]); + let _: &(U, [U; 2]) = a; + let _: &U = b; + let _: &U = c; + let _: &U = d; + + fn f1(ref a @ (ref b, [ref c, ref mid @ .., ref d]): (U, [U; 4])) {} + + let a @ (b, [c, d]) = &(u(), [u(), u()]); + let _: &(U, [U; 2]) = a; + let _: &U = b; + let _: &U = c; + let _: &U = d; + + let ref a @ &ref b = &u(); + let _: &&U = a; + let _: &U = b; + + match Ok(u()) { + ref a @ Ok(ref b) | ref a @ Err(ref b) => { + let _: &Result<U, U> = a; + let _: &U = b; + } + } +} diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-and-ref.rs b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-and-ref.rs new file mode 100644 index 0000000000..e8510dfa64 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-and-ref.rs @@ -0,0 +1,134 @@ +#![feature(bindings_after_at)] + +enum Option<T> { + None, + Some(T), +} + +fn main() { + match &mut Some(1) { + ref mut z @ &mut Some(ref a) => { + //~^ ERROR cannot borrow `z` as immutable because it is also borrowed as mutable + //~| ERROR cannot borrow `_` as immutable because it is also borrowed as mutable + **z = None; + println!("{}", *a); + } + _ => () + } + + struct U; + + // Prevent promotion: + fn u() -> U { U } + + fn f1(ref a @ ref mut b: U) {} + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + fn f2(ref mut a @ ref b: U) {} + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + fn f3(ref a @ [ref b, ref mut mid @ .., ref c]: [U; 4]) {} + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + + let ref mut a @ (ref b @ ref mut c) = u(); // sub-in-sub + //~^ ERROR cannot borrow `a` as mutable more than once at a time + //~| ERROR cannot borrow `b` as mutable because it is also borrowed as immutable + + let ref a @ ref mut b = U; + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + let ref mut a @ ref b = U; + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + let ref a @ (ref mut b, ref mut c) = (U, U); + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + let ref mut a @ (ref b, ref c) = (U, U); + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + + let ref mut a @ ref b = u(); + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + //~| ERROR cannot borrow `_` as immutable because it is also borrowed as mutable + *a = u(); + drop(b); + let ref a @ ref mut b = u(); + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + //~| ERROR cannot borrow `_` as mutable because it is also borrowed as immutable + *b = u(); + drop(a); + + let ref mut a @ ref b = U; + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + *a = U; + drop(b); + let ref a @ ref mut b = U; + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + *b = U; + drop(a); + + match Ok(U) { + ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) => { + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + //~| ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + *a = Err(U); + drop(b); + } + } + + match Ok(U) { + ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) => { + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + //~| ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + //~| ERROR cannot borrow `_` as mutable because it is also borrowed as immutable + //~| ERROR cannot borrow `_` as mutable because it is also borrowed as immutable + *b = U; + drop(a); + } + } + + match Ok(U) { + ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) if { *b = U; false } => {} + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + //~| ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + //~| ERROR cannot assign to `*b`, as it is immutable for the pattern guard + _ => {} + } + match Ok(U) { + ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) if { *a = Err(U); false } => {} + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + //~| ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + //~| ERROR cannot assign to `*a`, as it is immutable for the pattern guard + _ => {} + } + match Ok(U) { + ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) if { drop(b); false } => {} + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + //~| ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + //~| ERROR cannot move out of `b` in pattern guard + //~| ERROR cannot move out of `b` in pattern guard + _ => {} + } + match Ok(U) { + ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) if { drop(a); false } => {} + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + //~| ERROR cannot borrow `a` as immutable because it is also borrowed as mutable + //~| ERROR cannot move out of `a` in pattern guard + //~| ERROR cannot move out of `a` in pattern guard + _ => {} + } + + let ref a @ (ref mut b, ref mut c) = (U, U); + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + *b = U; + *c = U; + + let ref a @ (ref mut b, ref mut c) = (U, U); + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + //~| ERROR cannot borrow `_` as mutable because it is also borrowed as immutable + //~| ERROR cannot borrow `_` as mutable because it is also borrowed as immutable + *b = U; + drop(a); + + let ref a @ (ref mut b, ref mut c) = (U, U); + //~^ ERROR cannot borrow `a` as mutable because it is also borrowed as immutable + *b = U; //~| ERROR cannot borrow `_` as mutable because it is also borrowed as immutable + *c = U; //~| ERROR cannot borrow `_` as mutable because it is also borrowed as immutable + drop(a); + let ref mut a @ (ref b, ref c) = (U, U); + //~^ ERROR cannot borrow `a` as immutable because it is also borrowed as mutable +} diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-and-ref.stderr b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-and-ref.stderr new file mode 100644 index 0000000000..0d7b703f18 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-and-ref.stderr @@ -0,0 +1,437 @@ +error: cannot borrow `z` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:10:9 + | +LL | ref mut z @ &mut Some(ref a) => { + | ---------^^^^^^^^^^^^^-----^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:31:9 + | +LL | let ref mut a @ (ref b @ ref mut c) = u(); // sub-in-sub + | ---------^^^^-----------------^ + | | | | + | | | another mutable borrow occurs here + | | also borrowed as immutable here + | first mutable borrow occurs here + +error: cannot borrow `b` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:31:22 + | +LL | let ref mut a @ (ref b @ ref mut c) = u(); // sub-in-sub + | -----^^^--------- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:35:9 + | +LL | let ref a @ ref mut b = U; + | -----^^^--------- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:37:9 + | +LL | let ref mut a @ ref b = U; + | ---------^^^----- + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:39:9 + | +LL | let ref a @ (ref mut b, ref mut c) = (U, U); + | -----^^^^---------^^---------^ + | | | | + | | | mutable borrow occurs here + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:41:9 + | +LL | let ref mut a @ (ref b, ref c) = (U, U); + | ---------^^^^-----^^-----^ + | | | | + | | | immutable borrow occurs here + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:44:9 + | +LL | let ref mut a @ ref b = u(); + | ---------^^^----- + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:49:9 + | +LL | let ref a @ ref mut b = u(); + | -----^^^--------- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:55:9 + | +LL | let ref mut a @ ref b = U; + | ---------^^^----- + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:59:9 + | +LL | let ref a @ ref mut b = U; + | -----^^^--------- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:65:9 + | +LL | ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) => { + | ---------^^^^^^-----^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:65:33 + | +LL | ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) => { + | ---------^^^^^^^-----^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:74:9 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) => { + | -----^^^^^^---------^ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:74:33 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) => { + | -----^^^^^^^---------^ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:85:9 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) if { *b = U; false } => {} + | -----^^^^^^---------^ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:85:33 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) if { *b = U; false } => {} + | -----^^^^^^^---------^ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:92:9 + | +LL | ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) if { *a = Err(U); false } => {} + | ---------^^^^^^-----^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:92:33 + | +LL | ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) if { *a = Err(U); false } => {} + | ---------^^^^^^^-----^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:99:9 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) if { drop(b); false } => {} + | -----^^^^^^---------^ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:99:33 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) if { drop(b); false } => {} + | -----^^^^^^^---------^ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:107:9 + | +LL | ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) if { drop(a); false } => {} + | ---------^^^^^^-----^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:107:33 + | +LL | ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) if { drop(a); false } => {} + | ---------^^^^^^^-----^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:115:9 + | +LL | let ref a @ (ref mut b, ref mut c) = (U, U); + | -----^^^^---------^^---------^ + | | | | + | | | mutable borrow occurs here + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:120:9 + | +LL | let ref a @ (ref mut b, ref mut c) = (U, U); + | -----^^^^---------^^---------^ + | | | | + | | | mutable borrow occurs here + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:127:9 + | +LL | let ref a @ (ref mut b, ref mut c) = (U, U); + | -----^^^^---------^^---------^ + | | | | + | | | mutable borrow occurs here + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:132:9 + | +LL | let ref mut a @ (ref b, ref c) = (U, U); + | ---------^^^^-----^^-----^ + | | | | + | | | immutable borrow occurs here + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:24:11 + | +LL | fn f1(ref a @ ref mut b: U) {} + | -----^^^--------- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error: cannot borrow `a` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:26:11 + | +LL | fn f2(ref mut a @ ref b: U) {} + | ---------^^^----- + | | | + | | immutable borrow occurs here + | mutable borrow occurs here + +error: cannot borrow `a` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:28:11 + | +LL | fn f3(ref a @ [ref b, ref mut mid @ .., ref c]: [U; 4]) {} + | -----^^^^^^^^^^^----------------^^^^^^^^ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here + +error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:10:31 + | +LL | ref mut z @ &mut Some(ref a) => { + | ----------------------^^^^^- + | | | + | | immutable borrow occurs here + | mutable borrow occurs here +... +LL | **z = None; + | ---------- mutable borrow later used here + +error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:44:21 + | +LL | let ref mut a @ ref b = u(); + | ------------^^^^^ + | | | + | | immutable borrow occurs here + | mutable borrow occurs here +... +LL | *a = u(); + | -------- mutable borrow later used here + +error[E0502]: cannot borrow `_` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:49:17 + | +LL | let ref a @ ref mut b = u(); + | --------^^^^^^^^^ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here +... +LL | drop(a); + | - immutable borrow later used here + +error[E0502]: cannot borrow `_` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:74:20 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) => { + | -----------^^^^^^^^^- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here +... +LL | drop(a); + | - immutable borrow later used here + +error[E0502]: cannot borrow `_` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:74:45 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) => { + | ------------^^^^^^^^^- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here +... +LL | drop(a); + | - immutable borrow later used here + +error[E0594]: cannot assign to `*b`, as it is immutable for the pattern guard + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:85:61 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) if { *b = U; false } => {} + | ^^^^^^ cannot assign + | + = note: variables bound in patterns are immutable until the end of the pattern guard + +error[E0594]: cannot assign to `*a`, as it is immutable for the pattern guard + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:92:61 + | +LL | ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) if { *a = Err(U); false } => {} + | ^^^^^^^^^^^ cannot assign + | + = note: variables bound in patterns are immutable until the end of the pattern guard + +error[E0507]: cannot move out of `b` in pattern guard + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:99:66 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) if { drop(b); false } => {} + | ^ move occurs because `b` has type `&mut main::U`, which does not implement the `Copy` trait + | + = note: variables bound in patterns cannot be moved from until after the end of the pattern guard + +error[E0507]: cannot move out of `b` in pattern guard + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:99:66 + | +LL | ref a @ Ok(ref mut b) | ref a @ Err(ref mut b) if { drop(b); false } => {} + | ^ move occurs because `b` has type `&mut main::U`, which does not implement the `Copy` trait + | + = note: variables bound in patterns cannot be moved from until after the end of the pattern guard + +error[E0507]: cannot move out of `a` in pattern guard + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:107:66 + | +LL | ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) if { drop(a); false } => {} + | ^ move occurs because `a` has type `&mut std::result::Result<main::U, main::U>`, which does not implement the `Copy` trait + | + = note: variables bound in patterns cannot be moved from until after the end of the pattern guard + +error[E0507]: cannot move out of `a` in pattern guard + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:107:66 + | +LL | ref mut a @ Ok(ref b) | ref mut a @ Err(ref b) if { drop(a); false } => {} + | ^ move occurs because `a` has type `&mut std::result::Result<main::U, main::U>`, which does not implement the `Copy` trait + | + = note: variables bound in patterns cannot be moved from until after the end of the pattern guard + +error[E0502]: cannot borrow `_` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:120:18 + | +LL | let ref a @ (ref mut b, ref mut c) = (U, U); + | ---------^^^^^^^^^------------ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here +... +LL | drop(a); + | - immutable borrow later used here + +error[E0502]: cannot borrow `_` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:120:29 + | +LL | let ref a @ (ref mut b, ref mut c) = (U, U); + | --------------------^^^^^^^^^- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here +... +LL | drop(a); + | - immutable borrow later used here + +error[E0502]: cannot borrow `_` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:127:18 + | +LL | let ref a @ (ref mut b, ref mut c) = (U, U); + | ---------^^^^^^^^^------------ + | | | + | | mutable borrow occurs here + | immutable borrow occurs here +... +LL | drop(a); + | - immutable borrow later used here + +error[E0502]: cannot borrow `_` as mutable because it is also borrowed as immutable + --> $DIR/borrowck-pat-ref-mut-and-ref.rs:127:29 + | +LL | let ref a @ (ref mut b, ref mut c) = (U, U); + | --------------------^^^^^^^^^- + | | | + | | mutable borrow occurs here + | immutable borrow occurs here +... +LL | drop(a); + | - immutable borrow later used here + +error: aborting due to 45 previous errors + +Some errors have detailed explanations: E0502, E0507, E0594. +For more information about an error, try `rustc --explain E0502`. diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-twice.rs b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-twice.rs new file mode 100644 index 0000000000..f425b35630 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-twice.rs @@ -0,0 +1,111 @@ +// Test that `ref mut x @ ref mut y` and varieties of that are not allowed. + +#![feature(bindings_after_at)] + +fn main() { + struct U; + + fn u() -> U { U } + + fn f1(ref mut a @ ref mut b: U) {} + //~^ ERROR cannot borrow `a` as mutable more than once at a time + fn f2(ref mut a @ ref mut b: U) {} + //~^ ERROR cannot borrow `a` as mutable more than once at a time + fn f3( + ref mut a @ [ + //~^ ERROR cannot borrow `a` as mutable more than once at a time + [ref b @ .., _], + [_, ref mut mid @ ..], + .., + [..], + ] : [[U; 4]; 5] + ) {} + + let ref mut a @ ref mut b = U; + //~^ ERROR cannot borrow `a` as mutable more than once at a time + //~| ERROR cannot borrow `_` as mutable more than once at a time + drop(a); + let ref mut a @ ref mut b = U; + //~^ ERROR cannot borrow `a` as mutable more than once at a time + drop(b); + let ref mut a @ ref mut b = U; + //~^ ERROR cannot borrow `a` as mutable more than once at a time + + let ref mut a @ ref mut b = U; + //~^ ERROR cannot borrow `a` as mutable more than once at a time + //~| ERROR cannot borrow `_` as mutable more than once at a time + *a = U; + let ref mut a @ ref mut b = U; + //~^ ERROR cannot borrow `a` as mutable more than once at a time + *b = U; + + let ref mut a @ ( + //~^ ERROR cannot borrow `a` as mutable more than once at a time + ref mut b, + [ + ref mut c, + ref mut d, + ref e, + ] + ) = (U, [U, U, U]); + + let ref mut a @ ( + //~^ ERROR cannot borrow `a` as mutable more than once at a time + ref mut b, + [ + ref mut c, + ref mut d, + ref e, + ] + ) = (u(), [u(), u(), u()]); + + let a @ (ref mut b, ref mut c) = (U, U); + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR borrow of moved value + let mut val = (U, [U, U]); + let a @ (b, [c, d]) = &mut val; // Same as ^-- + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR borrow of moved value + + let a @ &mut ref mut b = &mut U; + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR borrow of moved value + let a @ &mut (ref mut b, ref mut c) = &mut (U, U); + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR borrow of moved value + + match Ok(U) { + ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + //~^ ERROR cannot borrow `a` as mutable more than once at a time + //~| ERROR cannot borrow `a` as mutable more than once at a time + } + } + match Ok(U) { + ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + //~^ ERROR cannot borrow `a` as mutable more than once at a time + //~| ERROR cannot borrow `a` as mutable more than once at a time + *b = U; + } + } + match Ok(U) { + ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + //~^ ERROR cannot borrow `a` as mutable more than once at a time + //~| ERROR cannot borrow `a` as mutable more than once at a time + //~| ERROR cannot borrow `_` as mutable more than once at a time + //~| ERROR cannot borrow `_` as mutable more than once at a time + *a = Err(U); + + // FIXME: The binding name `_` used above makes for problematic diagnostics. + // Resolve that somehow... + } + } + match Ok(U) { + ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + //~^ ERROR cannot borrow `a` as mutable more than once at a time + //~| ERROR cannot borrow `a` as mutable more than once at a time + //~| ERROR cannot borrow `_` as mutable more than once at a time + //~| ERROR cannot borrow `_` as mutable more than once at a time + drop(a); + } + } +} diff --git a/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-twice.stderr b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-twice.stderr new file mode 100644 index 0000000000..d07ad140cc --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/borrowck-pat-ref-mut-twice.stderr @@ -0,0 +1,333 @@ +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:24:9 + | +LL | let ref mut a @ ref mut b = U; + | ---------^^^--------- + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:28:9 + | +LL | let ref mut a @ ref mut b = U; + | ---------^^^--------- + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:31:9 + | +LL | let ref mut a @ ref mut b = U; + | ---------^^^--------- + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:34:9 + | +LL | let ref mut a @ ref mut b = U; + | ---------^^^--------- + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:38:9 + | +LL | let ref mut a @ ref mut b = U; + | ---------^^^--------- + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:42:9 + | +LL | let ref mut a @ ( + | ^-------- + | | + | _________first mutable borrow occurs here + | | +LL | | +LL | | ref mut b, + | | --------- another mutable borrow occurs here +LL | | [ +LL | | ref mut c, + | | --------- another mutable borrow occurs here +LL | | ref mut d, + | | --------- another mutable borrow occurs here +LL | | ref e, + | | ----- also borrowed as immutable here +LL | | ] +LL | | ) = (U, [U, U, U]); + | |_____^ + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:52:9 + | +LL | let ref mut a @ ( + | ^-------- + | | + | _________first mutable borrow occurs here + | | +LL | | +LL | | ref mut b, + | | --------- another mutable borrow occurs here +LL | | [ +LL | | ref mut c, + | | --------- another mutable borrow occurs here +LL | | ref mut d, + | | --------- another mutable borrow occurs here +LL | | ref e, + | | ----- also borrowed as immutable here +LL | | ] +LL | | ) = (u(), [u(), u(), u()]); + | |_________^ + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-pat-ref-mut-twice.rs:62:9 + | +LL | let a @ (ref mut b, ref mut c) = (U, U); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-pat-ref-mut-twice.rs:66:9 + | +LL | let a @ (b, [c, d]) = &mut val; // Same as ^-- + | ^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-pat-ref-mut-twice.rs:70:9 + | +LL | let a @ &mut ref mut b = &mut U; + | ^^^^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/borrowck-pat-ref-mut-twice.rs:73:9 + | +LL | let a @ &mut (ref mut b, ref mut c) = &mut (U, U); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:78:9 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------^^^^^^---------^ + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:78:37 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------^^^^^^^---------^ + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:84:9 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------^^^^^^---------^ + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:84:37 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------^^^^^^^---------^ + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:91:9 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------^^^^^^---------^ + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:91:37 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------^^^^^^^---------^ + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:103:9 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------^^^^^^---------^ + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:103:37 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------^^^^^^^---------^ + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:10:11 + | +LL | fn f1(ref mut a @ ref mut b: U) {} + | ---------^^^--------- + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:12:11 + | +LL | fn f2(ref mut a @ ref mut b: U) {} + | ---------^^^--------- + | | | + | | another mutable borrow occurs here + | first mutable borrow occurs here + +error: cannot borrow `a` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:15:9 + | +LL | ref mut a @ [ + | ^-------- + | | + | _________first mutable borrow occurs here + | | +LL | | +LL | | [ref b @ .., _], + | | ---------- also borrowed as immutable here +LL | | [_, ref mut mid @ ..], + | | ---------------- another mutable borrow occurs here +LL | | .., +LL | | [..], +LL | | ] : [[U; 4]; 5] + | |_________^ + +error[E0499]: cannot borrow `_` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:24:21 + | +LL | let ref mut a @ ref mut b = U; + | ------------^^^^^^^^^ + | | | + | | second mutable borrow occurs here + | first mutable borrow occurs here +... +LL | drop(a); + | - first borrow later used here + +error[E0499]: cannot borrow `_` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:34:21 + | +LL | let ref mut a @ ref mut b = U; + | ------------^^^^^^^^^ + | | | + | | second mutable borrow occurs here + | first mutable borrow occurs here +... +LL | *a = U; + | ------ first borrow later used here + +error[E0382]: borrow of moved value + --> $DIR/borrowck-pat-ref-mut-twice.rs:62:25 + | +LL | let a @ (ref mut b, ref mut c) = (U, U); + | ----------------^^^^^^^^^- ------ move occurs because value has type `(main::U, main::U)`, which does not implement the `Copy` trait + | | | + | | value borrowed here after move + | value moved here + +error[E0382]: borrow of moved value + --> $DIR/borrowck-pat-ref-mut-twice.rs:66:21 + | +LL | let a @ (b, [c, d]) = &mut val; // Same as ^-- + | ------------^-- -------- move occurs because value has type `&mut (main::U, [main::U; 2])`, which does not implement the `Copy` trait + | | | + | | value borrowed here after move + | value moved here + +error[E0382]: borrow of moved value + --> $DIR/borrowck-pat-ref-mut-twice.rs:70:18 + | +LL | let a @ &mut ref mut b = &mut U; + | ---------^^^^^^^^^ ------ move occurs because value has type `&mut main::U`, which does not implement the `Copy` trait + | | | + | | value borrowed here after move + | value moved here + +error[E0382]: borrow of moved value + --> $DIR/borrowck-pat-ref-mut-twice.rs:73:30 + | +LL | let a @ &mut (ref mut b, ref mut c) = &mut (U, U); + | ---------------------^^^^^^^^^- ----------- move occurs because value has type `&mut (main::U, main::U)`, which does not implement the `Copy` trait + | | | + | | value borrowed here after move + | value moved here + +error[E0499]: cannot borrow `_` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:91:24 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------------^^^^^^^^^- + | | | + | | second mutable borrow occurs here + | first mutable borrow occurs here +... +LL | *a = Err(U); + | ----------- first borrow later used here + +error[E0499]: cannot borrow `_` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:91:53 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ----------------^^^^^^^^^- + | | | + | | second mutable borrow occurs here + | first mutable borrow occurs here +... +LL | *a = Err(U); + | ----------- first borrow later used here + +error[E0499]: cannot borrow `_` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:103:24 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ---------------^^^^^^^^^- + | | | + | | second mutable borrow occurs here + | first mutable borrow occurs here +... +LL | drop(a); + | - first borrow later used here + +error[E0499]: cannot borrow `_` as mutable more than once at a time + --> $DIR/borrowck-pat-ref-mut-twice.rs:103:53 + | +LL | ref mut a @ Ok(ref mut b) | ref mut a @ Err(ref mut b) => { + | ----------------^^^^^^^^^- + | | | + | | second mutable borrow occurs here + | first mutable borrow occurs here +... +LL | drop(a); + | - first borrow later used here + +error: aborting due to 32 previous errors + +Some errors have detailed explanations: E0007, E0382, E0499. +For more information about an error, try `rustc --explain E0007`. diff --git a/src/test/ui/pattern/bindings-after-at/copy-and-move-mixed.rs b/src/test/ui/pattern/bindings-after-at/copy-and-move-mixed.rs new file mode 100644 index 0000000000..db5aabc7a1 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/copy-and-move-mixed.rs @@ -0,0 +1,20 @@ +// Test that mixing `Copy` and non-`Copy` types in `@` patterns is forbidden. + +#![feature(bindings_after_at)] + +#[derive(Copy, Clone)] +struct C; + +struct NC<A, B>(A, B); + +fn main() { + let a @ NC(b, c) = NC(C, C); + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + + let a @ NC(b, c @ NC(d, e)) = NC(C, NC(C, C)); + //~^ ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value + //~| ERROR cannot bind by-move with sub-bindings + //~| ERROR use of moved value +} diff --git a/src/test/ui/pattern/bindings-after-at/copy-and-move-mixed.stderr b/src/test/ui/pattern/bindings-after-at/copy-and-move-mixed.stderr new file mode 100644 index 0000000000..cfc35d6c32 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/copy-and-move-mixed.stderr @@ -0,0 +1,51 @@ +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/copy-and-move-mixed.rs:11:9 + | +LL | let a @ NC(b, c) = NC(C, C); + | ^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/copy-and-move-mixed.rs:15:9 + | +LL | let a @ NC(b, c @ NC(d, e)) = NC(C, NC(C, C)); + | ^^^^^^^^^^^^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0007]: cannot bind by-move with sub-bindings + --> $DIR/copy-and-move-mixed.rs:15:19 + | +LL | let a @ NC(b, c @ NC(d, e)) = NC(C, NC(C, C)); + | ^^^^^^^^^^^^ binds an already bound by-move value by moving it + +error[E0382]: use of moved value + --> $DIR/copy-and-move-mixed.rs:11:19 + | +LL | let a @ NC(b, c) = NC(C, C); + | ----------^- -------- move occurs because value has type `NC<C, C>`, which does not implement the `Copy` trait + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/copy-and-move-mixed.rs:15:19 + | +LL | let a @ NC(b, c @ NC(d, e)) = NC(C, NC(C, C)); + | ----------^^^^^^^^^^^^- --------------- move occurs because value has type `NC<C, NC<C, C>>`, which does not implement the `Copy` trait + | | | + | | value used here after move + | value moved here + +error[E0382]: use of moved value + --> $DIR/copy-and-move-mixed.rs:15:29 + | +LL | let a @ NC(b, c @ NC(d, e)) = NC(C, NC(C, C)); + | ----------^- + | | | + | | value used here after move + | value moved here + | + = note: move occurs because value has type `NC<C, C>`, which does not implement the `Copy` trait + +error: aborting due to 6 previous errors + +Some errors have detailed explanations: E0007, E0382. +For more information about an error, try `rustc --explain E0007`. diff --git a/src/test/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs b/src/test/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs new file mode 100644 index 0000000000..1127d11414 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.rs @@ -0,0 +1,37 @@ +// Ensures the independence of each side in `binding @ subpat` +// determine their binding modes independently of each other. +// +// That is, `binding` does not influence `subpat`. +// This is important because we might want to allow `p1 @ p2`, +// where both `p1` and `p2` are syntactically unrestricted patterns. +// If `binding` is allowed to influence `subpat`, +// this would create problems for the generalization aforementioned. + +#![feature(bindings_after_at)] + +fn main() { + struct NotCopy; + + fn f1(a @ b: &NotCopy) { // OK + let _: &NotCopy = a; + } + fn f2(ref a @ b: &NotCopy) { + let _: &&NotCopy = a; // Ok + } + + let a @ b = &NotCopy; // OK + let _: &NotCopy = a; + let ref a @ b = &NotCopy; // OK + let _: &&NotCopy = a; + + let ref a @ b = NotCopy; //~ ERROR cannot bind by-move and by-ref in the same pattern + let ref mut a @ b = NotCopy; //~ ERROR cannot bind by-move and by-ref in the same pattern + match Ok(NotCopy) { + Ok(ref a @ b) | Err(ref a @ b) => {} + //~^ ERROR cannot bind by-move and by-ref in the same pattern + } + match NotCopy { + ref a @ b => {} + //~^ ERROR cannot bind by-move and by-ref in the same pattern + } +} diff --git a/src/test/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.stderr b/src/test/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.stderr new file mode 100644 index 0000000000..b6709a8a40 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/default-binding-modes-both-sides-independent.stderr @@ -0,0 +1,41 @@ +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/default-binding-modes-both-sides-independent.rs:27:17 + | +LL | let ref a @ b = NotCopy; + | --------^ + | | | + | | by-move pattern here + | by-ref pattern here + +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/default-binding-modes-both-sides-independent.rs:28:21 + | +LL | let ref mut a @ b = NotCopy; + | ------------^ + | | | + | | by-move pattern here + | by-ref pattern here + +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/default-binding-modes-both-sides-independent.rs:30:20 + | +LL | Ok(ref a @ b) | Err(ref a @ b) => {} + | --------^ --------^ + | | | | | + | | | | by-move pattern here + | | | by-ref pattern here + | | by-move pattern here + | by-ref pattern here + +error[E0009]: cannot bind by-move and by-ref in the same pattern + --> $DIR/default-binding-modes-both-sides-independent.rs:34:17 + | +LL | ref a @ b => {} + | --------^ + | | | + | | by-move pattern here + | by-ref pattern here + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0009`. diff --git a/src/test/ui/pattern/bindings-after-at/feature-gate-bindings_after_at.rs b/src/test/ui/pattern/bindings-after-at/feature-gate-bindings_after_at.rs new file mode 100644 index 0000000000..d655f15af1 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/feature-gate-bindings_after_at.rs @@ -0,0 +1,3 @@ +fn main() { + let x @ y = 0; //~ ERROR pattern bindings after an `@` are unstable +} diff --git a/src/test/ui/pattern/bindings-after-at/feature-gate-bindings_after_at.stderr b/src/test/ui/pattern/bindings-after-at/feature-gate-bindings_after_at.stderr new file mode 100644 index 0000000000..5408f6b5fb --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/feature-gate-bindings_after_at.stderr @@ -0,0 +1,12 @@ +error[E0658]: pattern bindings after an `@` are unstable + --> $DIR/feature-gate-bindings_after_at.rs:2:13 + | +LL | let x @ y = 0; + | ^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/65490 + = help: add `#![feature(bindings_after_at)]` to the crate attributes to enable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/pattern/bindings-after-at/nested-patterns.rs b/src/test/ui/pattern/bindings-after-at/nested-patterns.rs new file mode 100644 index 0000000000..6296652c11 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/nested-patterns.rs @@ -0,0 +1,15 @@ +// run-pass + +#![feature(bindings_after_at)] + +struct A { a: u8, b: u8 } + +pub fn main() { + match (A { a: 10, b: 20 }) { + ref x @ A { ref a, b: 20 } => { + assert_eq!(x.a, 10); + assert_eq!(*a, 10); + } + A { b: ref _b, .. } => panic!(), + } +} diff --git a/src/test/ui/pattern/bindings-after-at/nested-type-ascription-syntactically-invalid.rs b/src/test/ui/pattern/bindings-after-at/nested-type-ascription-syntactically-invalid.rs new file mode 100644 index 0000000000..dbec2f135f --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/nested-type-ascription-syntactically-invalid.rs @@ -0,0 +1,34 @@ +// Here we check that type ascription is syntactically invalid when +// not in the top position of a ascribing a let binding or function parameter. + +#![feature(bindings_after_at)] + +// This has no effect. +// We include it to demonstrate that this is the case: +#![feature(type_ascription)] + +fn main() {} + +fn _ok() { + let _a @ _b: u8 = 0; // OK. + fn _f(_a @ _b: u8) {} // OK. +} + +#[cfg(FALSE)] +fn case_1() { + let a: u8 @ b = 0; + //~^ ERROR expected one of `!` +} + +#[cfg(FALSE)] +fn case_2() { + let a @ (b: u8); + //~^ ERROR expected one of `!` + //~| ERROR expected one of `)` +} + +#[cfg(FALSE)] +fn case_3() { + let a: T1 @ Outer(b: T2); + //~^ ERROR expected one of `!` +} diff --git a/src/test/ui/pattern/bindings-after-at/nested-type-ascription-syntactically-invalid.stderr b/src/test/ui/pattern/bindings-after-at/nested-type-ascription-syntactically-invalid.stderr new file mode 100644 index 0000000000..1e957ed068 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/nested-type-ascription-syntactically-invalid.stderr @@ -0,0 +1,26 @@ +error: expected one of `!`, `(`, `+`, `::`, `;`, `<`, or `=`, found `@` + --> $DIR/nested-type-ascription-syntactically-invalid.rs:19:15 + | +LL | let a: u8 @ b = 0; + | ^ expected one of 7 possible tokens + +error: expected one of `)`, `,`, `@`, or `|`, found `:` + --> $DIR/nested-type-ascription-syntactically-invalid.rs:25:15 + | +LL | let a @ (b: u8); + | ^ expected one of `)`, `,`, `@`, or `|` + +error: expected one of `!`, `(`, `+`, `::`, `;`, `<`, or `=`, found `)` + --> $DIR/nested-type-ascription-syntactically-invalid.rs:25:19 + | +LL | let a @ (b: u8); + | ^ expected one of 7 possible tokens + +error: expected one of `!`, `(`, `+`, `::`, `;`, `<`, or `=`, found `@` + --> $DIR/nested-type-ascription-syntactically-invalid.rs:32:15 + | +LL | let a: T1 @ Outer(b: T2); + | ^ expected one of 7 possible tokens + +error: aborting due to 4 previous errors + diff --git a/src/test/ui/pattern/bindings-after-at/pat-at-same-name-both.rs b/src/test/ui/pattern/bindings-after-at/pat-at-same-name-both.rs new file mode 100644 index 0000000000..89ea2d5181 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/pat-at-same-name-both.rs @@ -0,0 +1,32 @@ +// Test that `binding @ subpat` acts as a product context with respect to duplicate binding names. +// The code that is tested here lives in resolve (see `resolve_pattern_inner`). + +#![feature(bindings_after_at)] +#![feature(or_patterns)] +//~^ WARN the feature `or_patterns` is incomplete and may cause the compiler to crash + +fn main() { + fn f(a @ a @ a: ()) {} + //~^ ERROR identifier `a` is bound more than once in this parameter list + //~| ERROR identifier `a` is bound more than once in this parameter list + + match Ok(0) { + Ok(a @ b @ a) + //~^ ERROR identifier `a` is bound more than once in the same pattern + | Err(a @ b @ a) + //~^ ERROR identifier `a` is bound more than once in the same pattern + => {} + } + + let a @ a @ a = (); + //~^ ERROR identifier `a` is bound more than once in the same pattern + //~| ERROR identifier `a` is bound more than once in the same pattern + let ref a @ ref a = (); + //~^ ERROR identifier `a` is bound more than once in the same pattern + let ref mut a @ ref mut a = (); + //~^ ERROR identifier `a` is bound more than once in the same pattern + + let a @ (Ok(a) | Err(a)) = Ok(()); + //~^ ERROR identifier `a` is bound more than once in the same pattern + //~| ERROR identifier `a` is bound more than once in the same pattern +} diff --git a/src/test/ui/pattern/bindings-after-at/pat-at-same-name-both.stderr b/src/test/ui/pattern/bindings-after-at/pat-at-same-name-both.stderr new file mode 100644 index 0000000000..c568d2a3aa --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/pat-at-same-name-both.stderr @@ -0,0 +1,72 @@ +error[E0415]: identifier `a` is bound more than once in this parameter list + --> $DIR/pat-at-same-name-both.rs:9:14 + | +LL | fn f(a @ a @ a: ()) {} + | ^ used as parameter more than once + +error[E0415]: identifier `a` is bound more than once in this parameter list + --> $DIR/pat-at-same-name-both.rs:9:18 + | +LL | fn f(a @ a @ a: ()) {} + | ^ used as parameter more than once + +error[E0416]: identifier `a` is bound more than once in the same pattern + --> $DIR/pat-at-same-name-both.rs:14:20 + | +LL | Ok(a @ b @ a) + | ^ used in a pattern more than once + +error[E0416]: identifier `a` is bound more than once in the same pattern + --> $DIR/pat-at-same-name-both.rs:16:23 + | +LL | | Err(a @ b @ a) + | ^ used in a pattern more than once + +error[E0416]: identifier `a` is bound more than once in the same pattern + --> $DIR/pat-at-same-name-both.rs:21:13 + | +LL | let a @ a @ a = (); + | ^ used in a pattern more than once + +error[E0416]: identifier `a` is bound more than once in the same pattern + --> $DIR/pat-at-same-name-both.rs:21:17 + | +LL | let a @ a @ a = (); + | ^ used in a pattern more than once + +error[E0416]: identifier `a` is bound more than once in the same pattern + --> $DIR/pat-at-same-name-both.rs:24:21 + | +LL | let ref a @ ref a = (); + | ^ used in a pattern more than once + +error[E0416]: identifier `a` is bound more than once in the same pattern + --> $DIR/pat-at-same-name-both.rs:26:29 + | +LL | let ref mut a @ ref mut a = (); + | ^ used in a pattern more than once + +error[E0416]: identifier `a` is bound more than once in the same pattern + --> $DIR/pat-at-same-name-both.rs:29:17 + | +LL | let a @ (Ok(a) | Err(a)) = Ok(()); + | ^ used in a pattern more than once + +error[E0416]: identifier `a` is bound more than once in the same pattern + --> $DIR/pat-at-same-name-both.rs:29:26 + | +LL | let a @ (Ok(a) | Err(a)) = Ok(()); + | ^ used in a pattern more than once + +warning: the feature `or_patterns` is incomplete and may cause the compiler to crash + --> $DIR/pat-at-same-name-both.rs:5:12 + | +LL | #![feature(or_patterns)] + | ^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + +error: aborting due to 10 previous errors + +Some errors have detailed explanations: E0415, E0416. +For more information about an error, try `rustc --explain E0415`. diff --git a/src/test/ui/pattern/bindings-after-at/wild-before-at-syntactically-rejected.rs b/src/test/ui/pattern/bindings-after-at/wild-before-at-syntactically-rejected.rs new file mode 100644 index 0000000000..50ac0ef278 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/wild-before-at-syntactically-rejected.rs @@ -0,0 +1,16 @@ +// Here we check that `_ @ sub` is syntactically invalid +// and comes with a nice actionable suggestion. + +fn main() {} + +#[cfg(FALSE)] +fn wild_before_at_is_bad_syntax() { + let _ @ a = 0; + //~^ ERROR pattern on wrong side of `@` + let _ @ ref a = 0; + //~^ ERROR pattern on wrong side of `@` + let _ @ ref mut a = 0; + //~^ ERROR pattern on wrong side of `@` + let _ @ (a, .., b) = (0, 1, 2, 3); + //~^ ERROR left-hand side of `@` must be a binding +} diff --git a/src/test/ui/pattern/bindings-after-at/wild-before-at-syntactically-rejected.stderr b/src/test/ui/pattern/bindings-after-at/wild-before-at-syntactically-rejected.stderr new file mode 100644 index 0000000000..2f45415844 --- /dev/null +++ b/src/test/ui/pattern/bindings-after-at/wild-before-at-syntactically-rejected.stderr @@ -0,0 +1,43 @@ +error: pattern on wrong side of `@` + --> $DIR/wild-before-at-syntactically-rejected.rs:8:9 + | +LL | let _ @ a = 0; + | -^^^- + | | | + | | binding on the right, should be on the left + | pattern on the left, should be on the right + | help: switch the order: `a @ _` + +error: pattern on wrong side of `@` + --> $DIR/wild-before-at-syntactically-rejected.rs:10:9 + | +LL | let _ @ ref a = 0; + | -^^^----- + | | | + | | binding on the right, should be on the left + | pattern on the left, should be on the right + | help: switch the order: `ref a @ _` + +error: pattern on wrong side of `@` + --> $DIR/wild-before-at-syntactically-rejected.rs:12:9 + | +LL | let _ @ ref mut a = 0; + | -^^^--------- + | | | + | | binding on the right, should be on the left + | pattern on the left, should be on the right + | help: switch the order: `ref mut a @ _` + +error: left-hand side of `@` must be a binding + --> $DIR/wild-before-at-syntactically-rejected.rs:14:9 + | +LL | let _ @ (a, .., b) = (0, 1, 2, 3); + | -^^^---------- + | | | + | | also a pattern + | interpreted as a pattern, not a binding + | + = note: bindings are `x`, `mut x`, `ref x`, and `ref mut x` + +error: aborting due to 4 previous errors + diff --git a/src/test/ui/pattern/const-pat-ice.stderr b/src/test/ui/pattern/const-pat-ice.stderr index 7a0f14425b..d0018cef5f 100644 --- a/src/test/ui/pattern/const-pat-ice.stderr +++ b/src/test/ui/pattern/const-pat-ice.stderr @@ -1,5 +1,5 @@ -thread 'rustc' panicked at 'assertion failed: rows.iter().all(|r| r.len() == v.len())', src/librustc_mir/hair/pattern/_match.rs:LL:CC -note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. +thread 'rustc' panicked at 'assertion failed: rows.iter().all(|r| r.len() == v.len())', src/librustc_mir_build/hair/pattern/_match.rs:LL:CC +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace error: internal compiler error: unexpected panic diff --git a/src/test/ui/pattern/issue-66270-pat-struct-parser-recovery.rs b/src/test/ui/pattern/issue-66270-pat-struct-parser-recovery.rs new file mode 100644 index 0000000000..48a8e04829 --- /dev/null +++ b/src/test/ui/pattern/issue-66270-pat-struct-parser-recovery.rs @@ -0,0 +1,14 @@ +// Regression test for #66270, fixed by #66246 + +struct Bug { + incorrect_field: 0, + //~^ ERROR expected type +} + +struct Empty {} + +fn main() { + let Bug { + any_field: Empty {}, + } = Bug {}; +} diff --git a/src/test/ui/pattern/issue-66270-pat-struct-parser-recovery.stderr b/src/test/ui/pattern/issue-66270-pat-struct-parser-recovery.stderr new file mode 100644 index 0000000000..fef0f3c0e0 --- /dev/null +++ b/src/test/ui/pattern/issue-66270-pat-struct-parser-recovery.stderr @@ -0,0 +1,8 @@ +error: expected type, found `0` + --> $DIR/issue-66270-pat-struct-parser-recovery.rs:4:22 + | +LL | incorrect_field: 0, + | ^ expected type + +error: aborting due to previous error + diff --git a/src/test/ui/pattern/issue-67776-match-same-name-enum-variant-refs.rs b/src/test/ui/pattern/issue-67776-match-same-name-enum-variant-refs.rs new file mode 100644 index 0000000000..6fd5768a5a --- /dev/null +++ b/src/test/ui/pattern/issue-67776-match-same-name-enum-variant-refs.rs @@ -0,0 +1,42 @@ +// Test for issue #67776: binding named the same as enum variant +// should report a warning even when matching against a reference type + +// check-pass + +#![allow(unused_variables)] +#![allow(non_snake_case)] + +enum Foo { + Bar, + Baz, +} + + +fn fn1(e: Foo) { + match e { + Bar => {}, + //~^ WARNING named the same as one of the variants of the type `Foo` + Baz => {}, + //~^ WARNING named the same as one of the variants of the type `Foo` + } +} + +fn fn2(e: &Foo) { + match e { + Bar => {}, + //~^ WARNING named the same as one of the variants of the type `Foo` + Baz => {}, + //~^ WARNING named the same as one of the variants of the type `Foo` + } +} + +fn fn3(e: &mut &&mut Foo) { + match e { + Bar => {}, + //~^ WARNING named the same as one of the variants of the type `Foo` + Baz => {}, + //~^ WARNING named the same as one of the variants of the type `Foo` + } +} + +fn main() {} diff --git a/src/test/ui/pattern/issue-67776-match-same-name-enum-variant-refs.stderr b/src/test/ui/pattern/issue-67776-match-same-name-enum-variant-refs.stderr new file mode 100644 index 0000000000..21218d9a17 --- /dev/null +++ b/src/test/ui/pattern/issue-67776-match-same-name-enum-variant-refs.stderr @@ -0,0 +1,38 @@ +warning[E0170]: pattern binding `Bar` is named the same as one of the variants of the type `Foo` + --> $DIR/issue-67776-match-same-name-enum-variant-refs.rs:17:9 + | +LL | Bar => {}, + | ^^^ help: to match on the variant, qualify the path: `Foo::Bar` + | + = note: `#[warn(bindings_with_variant_name)]` on by default + +warning[E0170]: pattern binding `Baz` is named the same as one of the variants of the type `Foo` + --> $DIR/issue-67776-match-same-name-enum-variant-refs.rs:19:9 + | +LL | Baz => {}, + | ^^^ help: to match on the variant, qualify the path: `Foo::Baz` + +warning[E0170]: pattern binding `Bar` is named the same as one of the variants of the type `Foo` + --> $DIR/issue-67776-match-same-name-enum-variant-refs.rs:26:9 + | +LL | Bar => {}, + | ^^^ help: to match on the variant, qualify the path: `Foo::Bar` + +warning[E0170]: pattern binding `Baz` is named the same as one of the variants of the type `Foo` + --> $DIR/issue-67776-match-same-name-enum-variant-refs.rs:28:9 + | +LL | Baz => {}, + | ^^^ help: to match on the variant, qualify the path: `Foo::Baz` + +warning[E0170]: pattern binding `Bar` is named the same as one of the variants of the type `Foo` + --> $DIR/issue-67776-match-same-name-enum-variant-refs.rs:35:9 + | +LL | Bar => {}, + | ^^^ help: to match on the variant, qualify the path: `Foo::Bar` + +warning[E0170]: pattern binding `Baz` is named the same as one of the variants of the type `Foo` + --> $DIR/issue-67776-match-same-name-enum-variant-refs.rs:37:9 + | +LL | Baz => {}, + | ^^^ help: to match on the variant, qualify the path: `Foo::Baz` + diff --git a/src/test/ui/pattern/issue-68393-let-pat-assoc-constant.rs b/src/test/ui/pattern/issue-68393-let-pat-assoc-constant.rs new file mode 100644 index 0000000000..95ead6b5d4 --- /dev/null +++ b/src/test/ui/pattern/issue-68393-let-pat-assoc-constant.rs @@ -0,0 +1,26 @@ +pub enum EFoo { + A, +} + +pub trait Foo { + const X: EFoo; +} + +struct Abc; + +impl Foo for Abc { + const X: EFoo = EFoo::A; +} + +struct Def; +impl Foo for Def { + const X: EFoo = EFoo::A; +} + +pub fn test<A: Foo, B: Foo>(arg: EFoo, A::X: EFoo) { + //~^ ERROR associated consts cannot be referenced in patterns + let A::X = arg; + //~^ ERROR associated consts cannot be referenced in patterns +} + +fn main() {} diff --git a/src/test/ui/pattern/issue-68393-let-pat-assoc-constant.stderr b/src/test/ui/pattern/issue-68393-let-pat-assoc-constant.stderr new file mode 100644 index 0000000000..54ecc24981 --- /dev/null +++ b/src/test/ui/pattern/issue-68393-let-pat-assoc-constant.stderr @@ -0,0 +1,15 @@ +error[E0158]: associated consts cannot be referenced in patterns + --> $DIR/issue-68393-let-pat-assoc-constant.rs:20:40 + | +LL | pub fn test<A: Foo, B: Foo>(arg: EFoo, A::X: EFoo) { + | ^^^^ + +error[E0158]: associated consts cannot be referenced in patterns + --> $DIR/issue-68393-let-pat-assoc-constant.rs:22:9 + | +LL | let A::X = arg; + | ^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0158`. diff --git a/src/test/ui/pattern/issue-68394-let-pat-runtime-value.rs b/src/test/ui/pattern/issue-68394-let-pat-runtime-value.rs new file mode 100644 index 0000000000..f10a7f2d8a --- /dev/null +++ b/src/test/ui/pattern/issue-68394-let-pat-runtime-value.rs @@ -0,0 +1,5 @@ +fn main() { + let x = 255u8; + let 0u8..=x = 0; + //~^ ERROR runtime values cannot be referenced in patterns +} diff --git a/src/test/ui/pattern/issue-68394-let-pat-runtime-value.stderr b/src/test/ui/pattern/issue-68394-let-pat-runtime-value.stderr new file mode 100644 index 0000000000..c1508bd71f --- /dev/null +++ b/src/test/ui/pattern/issue-68394-let-pat-runtime-value.stderr @@ -0,0 +1,9 @@ +error[E0080]: runtime values cannot be referenced in patterns + --> $DIR/issue-68394-let-pat-runtime-value.rs:3:15 + | +LL | let 0u8..=x = 0; + | ^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/pattern/issue-68396-let-float-bug.rs b/src/test/ui/pattern/issue-68396-let-float-bug.rs new file mode 100644 index 0000000000..afc599a4b2 --- /dev/null +++ b/src/test/ui/pattern/issue-68396-let-float-bug.rs @@ -0,0 +1,7 @@ +fn main() { + let 1234567890123456789012345678901234567890e-340: f64 = 0.0; + //~^ ERROR could not evaluate float literal (see issue #31407) + + fn param(1234567890123456789012345678901234567890e-340: f64) {} + //~^ ERROR could not evaluate float literal (see issue #31407) +} diff --git a/src/test/ui/pattern/issue-68396-let-float-bug.stderr b/src/test/ui/pattern/issue-68396-let-float-bug.stderr new file mode 100644 index 0000000000..618aa4b502 --- /dev/null +++ b/src/test/ui/pattern/issue-68396-let-float-bug.stderr @@ -0,0 +1,15 @@ +error[E0080]: could not evaluate float literal (see issue #31407) + --> $DIR/issue-68396-let-float-bug.rs:2:9 + | +LL | let 1234567890123456789012345678901234567890e-340: f64 = 0.0; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0080]: could not evaluate float literal (see issue #31407) + --> $DIR/issue-68396-let-float-bug.rs:5:14 + | +LL | fn param(1234567890123456789012345678901234567890e-340: f64) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/pattern/pat-struct-field-expr-has-type.rs b/src/test/ui/pattern/pat-struct-field-expr-has-type.rs new file mode 100644 index 0000000000..1d18214de7 --- /dev/null +++ b/src/test/ui/pattern/pat-struct-field-expr-has-type.rs @@ -0,0 +1,9 @@ +struct S { + f: u8, +} + +fn main() { + match (S { f: 42 }) { + S { f: Ok(_) } => {} //~ ERROR mismatched types + } +} diff --git a/src/test/ui/pattern/pat-struct-field-expr-has-type.stderr b/src/test/ui/pattern/pat-struct-field-expr-has-type.stderr new file mode 100644 index 0000000000..d57a8a0dbc --- /dev/null +++ b/src/test/ui/pattern/pat-struct-field-expr-has-type.stderr @@ -0,0 +1,14 @@ +error[E0308]: mismatched types + --> $DIR/pat-struct-field-expr-has-type.rs:7:16 + | +LL | match (S { f: 42 }) { + | ------------- this expression has type `S` +LL | S { f: Ok(_) } => {} + | ^^^^^ expected `u8`, found enum `std::result::Result` + | + = note: expected type `u8` + found enum `std::result::Result<_, _>` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/pattern/pat-type-err-formal-param.rs b/src/test/ui/pattern/pat-type-err-formal-param.rs new file mode 100644 index 0000000000..54336b3492 --- /dev/null +++ b/src/test/ui/pattern/pat-type-err-formal-param.rs @@ -0,0 +1,8 @@ +// Test the `.span_label(..)` to the type when there's a +// type error in a pattern due to a the formal parameter. + +fn main() {} + +struct Tuple(u8); + +fn foo(Tuple(_): String) {} //~ ERROR mismatched types diff --git a/src/test/ui/pattern/pat-type-err-formal-param.stderr b/src/test/ui/pattern/pat-type-err-formal-param.stderr new file mode 100644 index 0000000000..2d7eb62fae --- /dev/null +++ b/src/test/ui/pattern/pat-type-err-formal-param.stderr @@ -0,0 +1,11 @@ +error[E0308]: mismatched types + --> $DIR/pat-type-err-formal-param.rs:8:8 + | +LL | fn foo(Tuple(_): String) {} + | ^^^^^^^^ ------ expected due to this + | | + | expected struct `std::string::String`, found struct `Tuple` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/pattern/pat-type-err-let-stmt.rs b/src/test/ui/pattern/pat-type-err-let-stmt.rs new file mode 100644 index 0000000000..6e9850b655 --- /dev/null +++ b/src/test/ui/pattern/pat-type-err-let-stmt.rs @@ -0,0 +1,16 @@ +// Test the `.span_label` to the type / scrutinee +// when there's a type error in checking a pattern. + +fn main() { + // We want to point at the `Option<u8>`. + let Ok(0): Option<u8> = 42u8; + //~^ ERROR mismatched types + //~| ERROR mismatched types + + // We want to point at the `Option<u8>`. + let Ok(0): Option<u8>; + //~^ ERROR mismatched types + + // We want to point at the scrutinee. + let Ok(0) = 42u8; //~ ERROR mismatched types +} diff --git a/src/test/ui/pattern/pat-type-err-let-stmt.stderr b/src/test/ui/pattern/pat-type-err-let-stmt.stderr new file mode 100644 index 0000000000..d75fa3f247 --- /dev/null +++ b/src/test/ui/pattern/pat-type-err-let-stmt.stderr @@ -0,0 +1,49 @@ +error[E0308]: mismatched types + --> $DIR/pat-type-err-let-stmt.rs:6:29 + | +LL | let Ok(0): Option<u8> = 42u8; + | ---------- ^^^^ + | | | + | | expected enum `std::option::Option`, found `u8` + | | help: try using a variant of the expected enum: `Some(42u8)` + | expected due to this + | + = note: expected enum `std::option::Option<u8>` + found type `u8` + +error[E0308]: mismatched types + --> $DIR/pat-type-err-let-stmt.rs:6:9 + | +LL | let Ok(0): Option<u8> = 42u8; + | ^^^^^ ---------- expected due to this + | | + | expected enum `std::option::Option`, found enum `std::result::Result` + | + = note: expected enum `std::option::Option<u8>` + found enum `std::result::Result<_, _>` + +error[E0308]: mismatched types + --> $DIR/pat-type-err-let-stmt.rs:11:9 + | +LL | let Ok(0): Option<u8>; + | ^^^^^ ---------- expected due to this + | | + | expected enum `std::option::Option`, found enum `std::result::Result` + | + = note: expected enum `std::option::Option<u8>` + found enum `std::result::Result<_, _>` + +error[E0308]: mismatched types + --> $DIR/pat-type-err-let-stmt.rs:15:9 + | +LL | let Ok(0) = 42u8; + | ^^^^^ ---- this expression has type `u8` + | | + | expected `u8`, found enum `std::result::Result` + | + = note: expected type `u8` + found enum `std::result::Result<_, _>` + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/pattern/patkind-litrange-no-expr.rs b/src/test/ui/pattern/patkind-litrange-no-expr.rs index def6c62459..5b3db2e57c 100644 --- a/src/test/ui/pattern/patkind-litrange-no-expr.rs +++ b/src/test/ui/pattern/patkind-litrange-no-expr.rs @@ -18,7 +18,8 @@ enum_number!(Change { Pos = 1, Neg = -1, Arith = 1 + 1, //~ ERROR arbitrary expressions aren't allowed in patterns - //~^ ERROR only char and numeric types are allowed in range patterns + //~| ERROR arbitrary expressions aren't allowed in patterns + //~| ERROR only char and numeric types are allowed in range patterns }); fn main() {} diff --git a/src/test/ui/pattern/patkind-litrange-no-expr.stderr b/src/test/ui/pattern/patkind-litrange-no-expr.stderr index 78768d282e..70dd1a9263 100644 --- a/src/test/ui/pattern/patkind-litrange-no-expr.stderr +++ b/src/test/ui/pattern/patkind-litrange-no-expr.stderr @@ -4,6 +4,12 @@ error: arbitrary expressions aren't allowed in patterns LL | Arith = 1 + 1, | ^^^^^ +error: arbitrary expressions aren't allowed in patterns + --> $DIR/patkind-litrange-no-expr.rs:20:13 + | +LL | Arith = 1 + 1, + | ^^^^^ + error[E0029]: only char and numeric types are allowed in range patterns --> $DIR/patkind-litrange-no-expr.rs:20:13 | @@ -13,6 +19,6 @@ LL | $( $value ..= 42 => Some($name::$variant), )* // PatKind::R LL | Arith = 1 + 1, | ^^^^^ this is of type `_` but it should be `char` or numeric -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0029`. diff --git a/src/test/ui/pattern/pattern-bindings-after-at.rs b/src/test/ui/pattern/pattern-bindings-after-at.rs deleted file mode 100644 index aff7264752..0000000000 --- a/src/test/ui/pattern/pattern-bindings-after-at.rs +++ /dev/null @@ -1,16 +0,0 @@ -enum Option<T> { - None, - Some(T), -} - -fn main() { - match &mut Some(1) { - ref mut z @ &mut Some(ref a) => { - //~^ ERROR pattern bindings are not allowed after an `@` - //~| ERROR cannot borrow `_` as immutable because it is also borrowed as mutable - **z = None; - println!("{}", *a); - } - _ => () - } -} diff --git a/src/test/ui/pattern/pattern-bindings-after-at.stderr b/src/test/ui/pattern/pattern-bindings-after-at.stderr deleted file mode 100644 index 35ee7877f2..0000000000 --- a/src/test/ui/pattern/pattern-bindings-after-at.stderr +++ /dev/null @@ -1,22 +0,0 @@ -error[E0303]: pattern bindings are not allowed after an `@` - --> $DIR/pattern-bindings-after-at.rs:8:31 - | -LL | ref mut z @ &mut Some(ref a) => { - | ^^^^^ not allowed after `@` - -error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable - --> $DIR/pattern-bindings-after-at.rs:8:31 - | -LL | ref mut z @ &mut Some(ref a) => { - | ----------------------^^^^^- - | | | - | | immutable borrow occurs here - | mutable borrow occurs here -... -LL | **z = None; - | ---------- mutable borrow later used here - -error: aborting due to 2 previous errors - -Some errors have detailed explanations: E0303, E0502. -For more information about an error, try `rustc --explain E0303`. diff --git a/src/test/ui/pattern/pattern-error-continue.stderr b/src/test/ui/pattern/pattern-error-continue.stderr index 2f9fe1981b..60f76796c0 100644 --- a/src/test/ui/pattern/pattern-error-continue.stderr +++ b/src/test/ui/pattern/pattern-error-continue.stderr @@ -28,7 +28,7 @@ error[E0308]: mismatched types --> $DIR/pattern-error-continue.rs:22:9 | LL | match 'c' { - | --- this match expression has type `char` + | --- this expression has type `char` LL | S { .. } => (), | ^^^^^^^^ expected `char`, found struct `S` diff --git a/src/test/ui/pattern/pattern-tyvar-2.rs b/src/test/ui/pattern/pattern-tyvar-2.rs index 9fba9cb876..4c6d515b86 100644 --- a/src/test/ui/pattern/pattern-tyvar-2.rs +++ b/src/test/ui/pattern/pattern-tyvar-2.rs @@ -1,6 +1,6 @@ enum Bar { T1((), Option<Vec<isize>>), T2, } fn foo(t: Bar) -> isize { match t { Bar::T1(_, Some(x)) => { return x * 3; } _ => { panic!(); } } } -//~^ ERROR binary operation `*` cannot be applied to +//~^ ERROR cannot multiply `{integer}` to `std::vec::Vec<isize>` fn main() { } diff --git a/src/test/ui/pattern/pattern-tyvar-2.stderr b/src/test/ui/pattern/pattern-tyvar-2.stderr index 7c6ae499cb..bb3e61017d 100644 --- a/src/test/ui/pattern/pattern-tyvar-2.stderr +++ b/src/test/ui/pattern/pattern-tyvar-2.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `*` cannot be applied to type `std::vec::Vec<isize>` +error[E0369]: cannot multiply `{integer}` to `std::vec::Vec<isize>` --> $DIR/pattern-tyvar-2.rs:3:71 | LL | fn foo(t: Bar) -> isize { match t { Bar::T1(_, Some(x)) => { return x * 3; } _ => { panic!(); } } } diff --git a/src/test/ui/pattern/pattern-tyvar.stderr b/src/test/ui/pattern/pattern-tyvar.stderr index b2afeacdf6..15425da69b 100644 --- a/src/test/ui/pattern/pattern-tyvar.stderr +++ b/src/test/ui/pattern/pattern-tyvar.stderr @@ -2,7 +2,7 @@ error[E0308]: mismatched types --> $DIR/pattern-tyvar.rs:5:18 | LL | match t { - | - this match expression has type `std::option::Option<std::vec::Vec<isize>>` + | - this expression has type `Bar` LL | Bar::T1(_, Some::<isize>(x)) => { | ^^^^^^^^^^^^^^^^ expected struct `std::vec::Vec`, found `isize` | diff --git a/src/test/ui/pattern/issue-53820-slice-pattern-large-array.rs b/src/test/ui/pattern/usefulness/issue-53820-slice-pattern-large-array.rs similarity index 65% rename from src/test/ui/pattern/issue-53820-slice-pattern-large-array.rs rename to src/test/ui/pattern/usefulness/issue-53820-slice-pattern-large-array.rs index c910cded96..5b0482de22 100644 --- a/src/test/ui/pattern/issue-53820-slice-pattern-large-array.rs +++ b/src/test/ui/pattern/usefulness/issue-53820-slice-pattern-large-array.rs @@ -1,8 +1,6 @@ // check-pass -// This used to cause a stack overflow in the compiler. - -#![feature(slice_patterns)] +// This used to cause a stack overflow during exhaustiveness checking in the compiler. fn main() { const LARGE_SIZE: usize = 1024 * 1024; diff --git a/src/test/ui/pattern/usefulness/65413-constants-and-slices-exhaustiveness.rs b/src/test/ui/pattern/usefulness/issue-65413-constants-and-slices-exhaustiveness.rs similarity index 89% rename from src/test/ui/pattern/usefulness/65413-constants-and-slices-exhaustiveness.rs rename to src/test/ui/pattern/usefulness/issue-65413-constants-and-slices-exhaustiveness.rs index 6c54c938bf..54dfa889ee 100644 --- a/src/test/ui/pattern/usefulness/65413-constants-and-slices-exhaustiveness.rs +++ b/src/test/ui/pattern/usefulness/issue-65413-constants-and-slices-exhaustiveness.rs @@ -1,5 +1,5 @@ // check-pass -#![feature(slice_patterns)] + #![deny(unreachable_patterns)] const C0: &'static [u8] = b"\x00"; diff --git a/src/test/ui/pattern/usefulness/match-byte-array-patterns.rs b/src/test/ui/pattern/usefulness/match-byte-array-patterns.rs index 7541ea3e2e..9b6c8bd555 100644 --- a/src/test/ui/pattern/usefulness/match-byte-array-patterns.rs +++ b/src/test/ui/pattern/usefulness/match-byte-array-patterns.rs @@ -1,4 +1,3 @@ -#![feature(slice_patterns)] #![deny(unreachable_patterns)] fn main() { diff --git a/src/test/ui/pattern/usefulness/match-byte-array-patterns.stderr b/src/test/ui/pattern/usefulness/match-byte-array-patterns.stderr index b28646b50c..09484692fa 100644 --- a/src/test/ui/pattern/usefulness/match-byte-array-patterns.stderr +++ b/src/test/ui/pattern/usefulness/match-byte-array-patterns.stderr @@ -1,53 +1,53 @@ error: unreachable pattern - --> $DIR/match-byte-array-patterns.rs:9:9 + --> $DIR/match-byte-array-patterns.rs:8:9 | LL | &[0x41, 0x41, 0x41, 0x41] => {} | ^^^^^^^^^^^^^^^^^^^^^^^^^ | note: lint level defined here - --> $DIR/match-byte-array-patterns.rs:2:9 + --> $DIR/match-byte-array-patterns.rs:1:9 | LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ error: unreachable pattern - --> $DIR/match-byte-array-patterns.rs:15:9 + --> $DIR/match-byte-array-patterns.rs:14:9 | LL | b"AAAA" => {}, | ^^^^^^^ error: unreachable pattern - --> $DIR/match-byte-array-patterns.rs:21:9 + --> $DIR/match-byte-array-patterns.rs:20:9 | LL | b"AAAA" => {}, | ^^^^^^^ error: unreachable pattern - --> $DIR/match-byte-array-patterns.rs:27:9 + --> $DIR/match-byte-array-patterns.rs:26:9 | LL | b"AAAA" => {}, | ^^^^^^^ error: unreachable pattern - --> $DIR/match-byte-array-patterns.rs:35:9 + --> $DIR/match-byte-array-patterns.rs:34:9 | LL | &[0x41, 0x41, 0x41, 0x41] => {} | ^^^^^^^^^^^^^^^^^^^^^^^^^ error: unreachable pattern - --> $DIR/match-byte-array-patterns.rs:41:9 + --> $DIR/match-byte-array-patterns.rs:40:9 | LL | b"AAAA" => {}, | ^^^^^^^ error: unreachable pattern - --> $DIR/match-byte-array-patterns.rs:47:9 + --> $DIR/match-byte-array-patterns.rs:46:9 | LL | b"AAAA" => {}, | ^^^^^^^ error: unreachable pattern - --> $DIR/match-byte-array-patterns.rs:53:9 + --> $DIR/match-byte-array-patterns.rs:52:9 | LL | b"AAAA" => {}, | ^^^^^^^ diff --git a/src/test/ui/pattern/usefulness/match-range-fail-dominate.rs b/src/test/ui/pattern/usefulness/match-range-fail-dominate.rs index 7de7b7e79b..37c4ccda0f 100644 --- a/src/test/ui/pattern/usefulness/match-range-fail-dominate.rs +++ b/src/test/ui/pattern/usefulness/match-range-fail-dominate.rs @@ -34,11 +34,15 @@ fn main() { //~^ WARNING floating-point types cannot be used in patterns //~| WARNING floating-point types cannot be used in patterns //~| WARNING floating-point types cannot be used in patterns + //~| WARNING floating-point types cannot be used in patterns + //~| WARNING this was previously accepted by the compiler //~| WARNING this was previously accepted by the compiler //~| WARNING this was previously accepted by the compiler //~| WARNING this was previously accepted by the compiler 0.02f64 => {} //~ ERROR unreachable pattern //~^ WARNING floating-point types cannot be used in patterns + //~| WARNING floating-point types cannot be used in patterns + //~| WARNING this was previously accepted by the compiler //~| WARNING this was previously accepted by the compiler _ => {} }; diff --git a/src/test/ui/pattern/usefulness/match-range-fail-dominate.stderr b/src/test/ui/pattern/usefulness/match-range-fail-dominate.stderr index c15186d255..8412a11366 100644 --- a/src/test/ui/pattern/usefulness/match-range-fail-dominate.stderr +++ b/src/test/ui/pattern/usefulness/match-range-fail-dominate.stderr @@ -48,7 +48,7 @@ LL | 0.01f64 ..= 6.5f64 => {} = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> warning: floating-point types cannot be used in patterns - --> $DIR/match-range-fail-dominate.rs:40:7 + --> $DIR/match-range-fail-dominate.rs:42:7 | LL | 0.02f64 => {} | ^^^^^^^ @@ -57,7 +57,7 @@ LL | 0.02f64 => {} = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> error: unreachable pattern - --> $DIR/match-range-fail-dominate.rs:40:7 + --> $DIR/match-range-fail-dominate.rs:42:7 | LL | 0.02f64 => {} | ^^^^^^^ @@ -71,5 +71,23 @@ LL | 0.01f64 ..= 6.5f64 => {} = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> +warning: floating-point types cannot be used in patterns + --> $DIR/match-range-fail-dominate.rs:33:19 + | +LL | 0.01f64 ..= 6.5f64 => {} + | ^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + +warning: floating-point types cannot be used in patterns + --> $DIR/match-range-fail-dominate.rs:42:7 + | +LL | 0.02f64 => {} + | ^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> + error: aborting due to 5 previous errors diff --git a/src/test/ui/pattern/usefulness/match-slice-patterns.rs b/src/test/ui/pattern/usefulness/match-slice-patterns.rs index af7fd53a1f..92d74b8c22 100644 --- a/src/test/ui/pattern/usefulness/match-slice-patterns.rs +++ b/src/test/ui/pattern/usefulness/match-slice-patterns.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn check(list: &[Option<()>]) { match list { //~^ ERROR `&[_, Some(_), .., None, _]` not covered diff --git a/src/test/ui/pattern/usefulness/match-slice-patterns.stderr b/src/test/ui/pattern/usefulness/match-slice-patterns.stderr index 72ae5d5fe3..977a112808 100644 --- a/src/test/ui/pattern/usefulness/match-slice-patterns.stderr +++ b/src/test/ui/pattern/usefulness/match-slice-patterns.stderr @@ -1,5 +1,5 @@ error[E0004]: non-exhaustive patterns: `&[_, Some(_), .., None, _]` not covered - --> $DIR/match-slice-patterns.rs:4:11 + --> $DIR/match-slice-patterns.rs:2:11 | LL | match list { | ^^^^ pattern `&[_, Some(_), .., None, _]` not covered diff --git a/src/test/ui/pattern/usefulness/match-vec-unreachable.rs b/src/test/ui/pattern/usefulness/match-vec-unreachable.rs index 78810525ba..3342389be6 100644 --- a/src/test/ui/pattern/usefulness/match-vec-unreachable.rs +++ b/src/test/ui/pattern/usefulness/match-vec-unreachable.rs @@ -1,4 +1,3 @@ -#![feature(slice_patterns)] #![deny(unreachable_patterns)] fn main() { diff --git a/src/test/ui/pattern/usefulness/match-vec-unreachable.stderr b/src/test/ui/pattern/usefulness/match-vec-unreachable.stderr index 415c24ae77..e9a751074c 100644 --- a/src/test/ui/pattern/usefulness/match-vec-unreachable.stderr +++ b/src/test/ui/pattern/usefulness/match-vec-unreachable.stderr @@ -1,23 +1,23 @@ error: unreachable pattern - --> $DIR/match-vec-unreachable.rs:9:9 + --> $DIR/match-vec-unreachable.rs:8:9 | LL | [(1, 2), (2, 3), b] => (), | ^^^^^^^^^^^^^^^^^^^ | note: lint level defined here - --> $DIR/match-vec-unreachable.rs:2:9 + --> $DIR/match-vec-unreachable.rs:1:9 | LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ error: unreachable pattern - --> $DIR/match-vec-unreachable.rs:19:9 + --> $DIR/match-vec-unreachable.rs:18:9 | LL | [_, _, _, _, _] => { } | ^^^^^^^^^^^^^^^ error: unreachable pattern - --> $DIR/match-vec-unreachable.rs:27:9 + --> $DIR/match-vec-unreachable.rs:26:9 | LL | ['a', 'b', 'c'] => {} | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.rs b/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.rs index 9423a2891a..d198144790 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.rs +++ b/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - enum T { A(U), B } enum U { C, D } diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.stderr b/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.stderr index 67c818e19c..72b4b52219 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.stderr +++ b/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.stderr @@ -1,5 +1,5 @@ error[E0004]: non-exhaustive patterns: `(Some(&[]), Err(_))` not covered - --> $DIR/non-exhaustive-match-nested.rs:7:11 + --> $DIR/non-exhaustive-match-nested.rs:5:11 | LL | match (l1, l2) { | ^^^^^^^^ pattern `(Some(&[]), Err(_))` not covered @@ -7,7 +7,7 @@ LL | match (l1, l2) { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `A(C)` not covered - --> $DIR/non-exhaustive-match-nested.rs:17:11 + --> $DIR/non-exhaustive-match-nested.rs:15:11 | LL | enum T { A(U), B } | ------------------ diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-match.rs b/src/test/ui/pattern/usefulness/non-exhaustive-match.rs index bfca535235..9947989dc1 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-match.rs +++ b/src/test/ui/pattern/usefulness/non-exhaustive-match.rs @@ -1,4 +1,3 @@ -#![feature(slice_patterns)] #![allow(illegal_floating_point_literal_pattern)] enum T { A, B } diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr b/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr index 577867e4e7..a06ad57885 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr +++ b/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr @@ -1,5 +1,5 @@ error[E0004]: non-exhaustive patterns: `A` not covered - --> $DIR/non-exhaustive-match.rs:8:11 + --> $DIR/non-exhaustive-match.rs:7:11 | LL | enum T { A, B } | --------------- @@ -13,7 +13,7 @@ LL | match x { T::B => { } } = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `false` not covered - --> $DIR/non-exhaustive-match.rs:9:11 + --> $DIR/non-exhaustive-match.rs:8:11 | LL | match true { | ^^^^ pattern `false` not covered @@ -21,7 +21,7 @@ LL | match true { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `Some(_)` not covered - --> $DIR/non-exhaustive-match.rs:12:11 + --> $DIR/non-exhaustive-match.rs:11:11 | LL | match Some(10) { | ^^^^^^^^ pattern `Some(_)` not covered @@ -29,7 +29,7 @@ LL | match Some(10) { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `(_, _, std::i32::MIN..=3i32)` and `(_, _, 5i32..=std::i32::MAX)` not covered - --> $DIR/non-exhaustive-match.rs:15:11 + --> $DIR/non-exhaustive-match.rs:14:11 | LL | match (2, 3, 4) { | ^^^^^^^^^ patterns `(_, _, std::i32::MIN..=3i32)` and `(_, _, 5i32..=std::i32::MAX)` not covered @@ -37,7 +37,7 @@ LL | match (2, 3, 4) { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `(A, A)` not covered - --> $DIR/non-exhaustive-match.rs:19:11 + --> $DIR/non-exhaustive-match.rs:18:11 | LL | match (T::A, T::A) { | ^^^^^^^^^^^^ pattern `(A, A)` not covered @@ -45,7 +45,7 @@ LL | match (T::A, T::A) { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `B` not covered - --> $DIR/non-exhaustive-match.rs:23:11 + --> $DIR/non-exhaustive-match.rs:22:11 | LL | enum T { A, B } | --------------- @@ -59,7 +59,7 @@ LL | match T::A { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `[]` not covered - --> $DIR/non-exhaustive-match.rs:34:11 + --> $DIR/non-exhaustive-match.rs:33:11 | LL | match *vec { | ^^^^ pattern `[]` not covered @@ -67,7 +67,7 @@ LL | match *vec { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `[_, _, _, _, ..]` not covered - --> $DIR/non-exhaustive-match.rs:47:11 + --> $DIR/non-exhaustive-match.rs:46:11 | LL | match *vec { | ^^^^ pattern `[_, _, _, _, ..]` not covered diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-pattern-witness.rs b/src/test/ui/pattern/usefulness/non-exhaustive-pattern-witness.rs index 4ca1cbcebc..abb4ea8daf 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-pattern-witness.rs +++ b/src/test/ui/pattern/usefulness/non-exhaustive-pattern-witness.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - struct Foo { first: bool, second: Option<[usize; 4]> diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-pattern-witness.stderr b/src/test/ui/pattern/usefulness/non-exhaustive-pattern-witness.stderr index a0b497dd4c..2a9fa07d22 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-pattern-witness.stderr +++ b/src/test/ui/pattern/usefulness/non-exhaustive-pattern-witness.stderr @@ -1,5 +1,5 @@ error[E0004]: non-exhaustive patterns: `Foo { first: false, second: Some([_, _, _, _]) }` not covered - --> $DIR/non-exhaustive-pattern-witness.rs:9:11 + --> $DIR/non-exhaustive-pattern-witness.rs:7:11 | LL | / struct Foo { LL | | first: bool, @@ -13,7 +13,7 @@ LL | match (Foo { first: true, second: None }) { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `Red` not covered - --> $DIR/non-exhaustive-pattern-witness.rs:25:11 + --> $DIR/non-exhaustive-pattern-witness.rs:23:11 | LL | / enum Color { LL | | Red, @@ -29,7 +29,7 @@ LL | match Color::Red { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `East`, `South` and `West` not covered - --> $DIR/non-exhaustive-pattern-witness.rs:37:11 + --> $DIR/non-exhaustive-pattern-witness.rs:35:11 | LL | / enum Direction { LL | | North, East, South, West @@ -46,7 +46,7 @@ LL | match Direction::North { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `Second`, `Third`, `Fourth` and 8 more not covered - --> $DIR/non-exhaustive-pattern-witness.rs:48:11 + --> $DIR/non-exhaustive-pattern-witness.rs:46:11 | LL | / enum ExcessiveEnum { LL | | First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth, Ninth, Tenth, Eleventh, Twelfth @@ -59,7 +59,7 @@ LL | match ExcessiveEnum::First { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `CustomRGBA { a: true, .. }` not covered - --> $DIR/non-exhaustive-pattern-witness.rs:56:11 + --> $DIR/non-exhaustive-pattern-witness.rs:54:11 | LL | / enum Color { LL | | Red, @@ -75,7 +75,7 @@ LL | match Color::Red { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `[Second(true), Second(false)]` not covered - --> $DIR/non-exhaustive-pattern-witness.rs:72:11 + --> $DIR/non-exhaustive-pattern-witness.rs:70:11 | LL | match *x { | ^^ pattern `[Second(true), Second(false)]` not covered @@ -83,7 +83,7 @@ LL | match *x { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `((), false)` not covered - --> $DIR/non-exhaustive-pattern-witness.rs:85:11 + --> $DIR/non-exhaustive-pattern-witness.rs:83:11 | LL | match ((), false) { | ^^^^^^^^^^^ pattern `((), false)` not covered diff --git a/src/test/ui/pattern/usefulness/slice-patterns-exhaustiveness.rs b/src/test/ui/pattern/usefulness/slice-patterns-exhaustiveness.rs index 41ba2cc450..52d1320dad 100644 --- a/src/test/ui/pattern/usefulness/slice-patterns-exhaustiveness.rs +++ b/src/test/ui/pattern/usefulness/slice-patterns-exhaustiveness.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - fn main() { let s: &[bool] = &[true; 0]; let s1: &[bool; 1] = &[false; 1]; diff --git a/src/test/ui/pattern/usefulness/slice-patterns-exhaustiveness.stderr b/src/test/ui/pattern/usefulness/slice-patterns-exhaustiveness.stderr index 8cb342f33d..b3701efef3 100644 --- a/src/test/ui/pattern/usefulness/slice-patterns-exhaustiveness.stderr +++ b/src/test/ui/pattern/usefulness/slice-patterns-exhaustiveness.stderr @@ -1,5 +1,5 @@ error[E0004]: non-exhaustive patterns: `&[false, _]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:10:11 + --> $DIR/slice-patterns-exhaustiveness.rs:8:11 | LL | match s2 { | ^^ pattern `&[false, _]` not covered @@ -7,7 +7,7 @@ LL | match s2 { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[false, ..]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:14:11 + --> $DIR/slice-patterns-exhaustiveness.rs:12:11 | LL | match s3 { | ^^ pattern `&[false, ..]` not covered @@ -15,7 +15,7 @@ LL | match s3 { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[false, ..]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:18:11 + --> $DIR/slice-patterns-exhaustiveness.rs:16:11 | LL | match s10 { | ^^^ pattern `&[false, ..]` not covered @@ -23,7 +23,7 @@ LL | match s10 { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[false, true]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:27:11 + --> $DIR/slice-patterns-exhaustiveness.rs:25:11 | LL | match s2 { | ^^ pattern `&[false, true]` not covered @@ -31,7 +31,7 @@ LL | match s2 { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[false, .., true]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:32:11 + --> $DIR/slice-patterns-exhaustiveness.rs:30:11 | LL | match s3 { | ^^ pattern `&[false, .., true]` not covered @@ -39,7 +39,7 @@ LL | match s3 { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[false, .., true]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:37:11 + --> $DIR/slice-patterns-exhaustiveness.rs:35:11 | LL | match s { | ^ pattern `&[false, .., true]` not covered @@ -47,7 +47,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[_, ..]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:44:11 + --> $DIR/slice-patterns-exhaustiveness.rs:42:11 | LL | match s { | ^ pattern `&[_, ..]` not covered @@ -55,7 +55,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[_, _, ..]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:48:11 + --> $DIR/slice-patterns-exhaustiveness.rs:46:11 | LL | match s { | ^ pattern `&[_, _, ..]` not covered @@ -63,7 +63,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[false, ..]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:53:11 + --> $DIR/slice-patterns-exhaustiveness.rs:51:11 | LL | match s { | ^ pattern `&[false, ..]` not covered @@ -71,7 +71,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[false, _, ..]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:58:11 + --> $DIR/slice-patterns-exhaustiveness.rs:56:11 | LL | match s { | ^ pattern `&[false, _, ..]` not covered @@ -79,7 +79,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[_, .., false]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:64:11 + --> $DIR/slice-patterns-exhaustiveness.rs:62:11 | LL | match s { | ^ pattern `&[_, .., false]` not covered @@ -87,7 +87,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[_, _, .., true]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:71:11 + --> $DIR/slice-patterns-exhaustiveness.rs:69:11 | LL | match s { | ^ pattern `&[_, _, .., true]` not covered @@ -95,7 +95,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[true, _, .., _]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:78:11 + --> $DIR/slice-patterns-exhaustiveness.rs:76:11 | LL | match s { | ^ pattern `&[true, _, .., _]` not covered @@ -103,7 +103,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[..]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:87:11 + --> $DIR/slice-patterns-exhaustiveness.rs:85:11 | LL | match s { | ^ pattern `&[..]` not covered @@ -111,7 +111,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[true]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:91:11 + --> $DIR/slice-patterns-exhaustiveness.rs:89:11 | LL | match s { | ^ pattern `&[true]` not covered @@ -119,7 +119,7 @@ LL | match s { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[false]` not covered - --> $DIR/slice-patterns-exhaustiveness.rs:99:11 + --> $DIR/slice-patterns-exhaustiveness.rs:97:11 | LL | match s1 { | ^^ pattern `&[false]` not covered diff --git a/src/test/ui/pattern/usefulness/slice-patterns-irrefutable.rs b/src/test/ui/pattern/usefulness/slice-patterns-irrefutable.rs index 3b716bae77..cbf64e2c53 100644 --- a/src/test/ui/pattern/usefulness/slice-patterns-irrefutable.rs +++ b/src/test/ui/pattern/usefulness/slice-patterns-irrefutable.rs @@ -1,5 +1,4 @@ // check-pass -#![feature(slice_patterns)] fn main() { let s: &[bool] = &[true; 0]; diff --git a/src/test/ui/pattern/usefulness/slice-patterns-reachability.rs b/src/test/ui/pattern/usefulness/slice-patterns-reachability.rs index cd229a0fcb..7c747b5e0b 100644 --- a/src/test/ui/pattern/usefulness/slice-patterns-reachability.rs +++ b/src/test/ui/pattern/usefulness/slice-patterns-reachability.rs @@ -1,4 +1,3 @@ -#![feature(slice_patterns)] #![deny(unreachable_patterns)] fn main() { diff --git a/src/test/ui/pattern/usefulness/slice-patterns-reachability.stderr b/src/test/ui/pattern/usefulness/slice-patterns-reachability.stderr index 333ce17028..e24d102811 100644 --- a/src/test/ui/pattern/usefulness/slice-patterns-reachability.stderr +++ b/src/test/ui/pattern/usefulness/slice-patterns-reachability.stderr @@ -1,41 +1,41 @@ error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:9:9 + --> $DIR/slice-patterns-reachability.rs:8:9 | LL | [true, ..] => {} | ^^^^^^^^^^ | note: lint level defined here - --> $DIR/slice-patterns-reachability.rs:2:9 + --> $DIR/slice-patterns-reachability.rs:1:9 | LL | #![deny(unreachable_patterns)] | ^^^^^^^^^^^^^^^^^^^^ error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:10:9 + --> $DIR/slice-patterns-reachability.rs:9:9 | LL | [true] => {} | ^^^^^^ error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:15:9 + --> $DIR/slice-patterns-reachability.rs:14:9 | LL | [.., true] => {} | ^^^^^^^^^^ error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:16:9 + --> $DIR/slice-patterns-reachability.rs:15:9 | LL | [true] => {} | ^^^^^^ error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:21:9 + --> $DIR/slice-patterns-reachability.rs:20:9 | LL | [false, .., true] => {} | ^^^^^^^^^^^^^^^^^ error: unreachable pattern - --> $DIR/slice-patterns-reachability.rs:22:9 + --> $DIR/slice-patterns-reachability.rs:21:9 | LL | [false, true] => {} | ^^^^^^^^^^^^^ diff --git a/src/test/ui/pattern/usefulness/struct-pattern-match-useless.stderr b/src/test/ui/pattern/usefulness/struct-pattern-match-useless.stderr index 5b0c930544..0115fc081a 100644 --- a/src/test/ui/pattern/usefulness/struct-pattern-match-useless.stderr +++ b/src/test/ui/pattern/usefulness/struct-pattern-match-useless.stderr @@ -1,8 +1,10 @@ error: unreachable pattern --> $DIR/struct-pattern-match-useless.rs:12:9 | +LL | Foo { x: _x, y: _y } => (), + | -------------------- matches any value LL | Foo { .. } => () - | ^^^^^^^^^^ + | ^^^^^^^^^^ unreachable pattern | note: lint level defined here --> $DIR/struct-pattern-match-useless.rs:1:9 diff --git a/src/test/ui/point-to-type-err-cause-on-impl-trait-return.rs b/src/test/ui/point-to-type-err-cause-on-impl-trait-return.rs index 58109be447..a80e5df1a2 100644 --- a/src/test/ui/point-to-type-err-cause-on-impl-trait-return.rs +++ b/src/test/ui/point-to-type-err-cause-on-impl-trait-return.rs @@ -29,7 +29,7 @@ fn qux() -> impl std::fmt::Display { 0i32 } else { 1u32 - //~^ ERROR if and else have incompatible types + //~^ ERROR `if` and `else` have incompatible types } } diff --git a/src/test/ui/point-to-type-err-cause-on-impl-trait-return.stderr b/src/test/ui/point-to-type-err-cause-on-impl-trait-return.stderr index d5ea2ba39a..b663cccbee 100644 --- a/src/test/ui/point-to-type-err-cause-on-impl-trait-return.stderr +++ b/src/test/ui/point-to-type-err-cause-on-impl-trait-return.stderr @@ -9,6 +9,12 @@ LL | return 0i32; LL | } LL | 1u32 | ^^^^ expected `i32`, found `u32` + | + = note: to return `impl Trait`, all returned values must be of the same type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = help: you can instead return a boxed trait object using `Box<dyn std::fmt::Display>` + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = help: alternatively, create a new `enum` with a variant for each returned type error[E0308]: mismatched types --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:13:16 @@ -21,6 +27,12 @@ LL | return 0i32; LL | } else { LL | return 1u32; | ^^^^ expected `i32`, found `u32` + | + = note: to return `impl Trait`, all returned values must be of the same type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = help: you can instead return a boxed trait object using `Box<dyn std::fmt::Display>` + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = help: alternatively, create a new `enum` with a variant for each returned type error[E0308]: mismatched types --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:22:9 @@ -33,8 +45,14 @@ LL | return 0i32; LL | } else { LL | 1u32 | ^^^^ expected `i32`, found `u32` + | + = note: to return `impl Trait`, all returned values must be of the same type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = help: you can instead return a boxed trait object using `Box<dyn std::fmt::Display>` + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = help: alternatively, create a new `enum` with a variant for each returned type -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:31:9 | LL | / if false { @@ -45,7 +63,7 @@ LL | | 1u32 | | ^^^^ expected `i32`, found `u32` LL | | LL | | } - | |_____- if and else have incompatible types + | |_____- `if` and `else` have incompatible types error[E0308]: mismatched types --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:39:14 @@ -57,6 +75,12 @@ LL | 0 => return 0i32, | ---- ...is found to be `i32` here LL | _ => 1u32, | ^^^^ expected `i32`, found `u32` + | + = note: to return `impl Trait`, all returned values must be of the same type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = help: you can instead return a boxed trait object using `Box<dyn std::fmt::Display>` + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = help: alternatively, create a new `enum` with a variant for each returned type error[E0308]: mismatched types --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:45:5 @@ -71,6 +95,12 @@ LL | | 1 => 1u32, LL | | _ => 2u32, LL | | } | |_____^ expected `i32`, found `u32` + | + = note: to return `impl Trait`, all returned values must be of the same type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = help: you can instead return a boxed trait object using `Box<dyn std::fmt::Display>` + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = help: alternatively, create a new `enum` with a variant for each returned type error[E0308]: mismatched types --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:59:13 @@ -83,6 +113,12 @@ LL | return 0i32; ... LL | 1u32 | ^^^^ expected `i32`, found `u32` + | + = note: to return `impl Trait`, all returned values must be of the same type + = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits> + = help: you can instead return a boxed trait object using `Box<dyn std::fmt::Display>` + = note: for information on trait objects, see <https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types> + = help: alternatively, create a new `enum` with a variant for each returned type error: aborting due to 7 previous errors diff --git a/src/test/ui/print_type_sizes/zero-sized-fields.rs b/src/test/ui/print_type_sizes/zero-sized-fields.rs index 2ad488e8d8..71d0916774 100644 --- a/src/test/ui/print_type_sizes/zero-sized-fields.rs +++ b/src/test/ui/print_type_sizes/zero-sized-fields.rs @@ -1,5 +1,6 @@ // compile-flags: -Z print-type-sizes // build-pass (FIXME(62277): could be check-pass?) +// ignore-pass // At one point, zero-sized fields such as those in this file were causing // incorrect output from `-Z print-type-sizes`. diff --git a/src/test/ui/privacy/decl-macro.stderr b/src/test/ui/privacy/decl-macro.stderr index 230cf95de6..ae2e1b4b64 100644 --- a/src/test/ui/privacy/decl-macro.stderr +++ b/src/test/ui/privacy/decl-macro.stderr @@ -2,7 +2,13 @@ error[E0603]: macro `mac` is private --> $DIR/decl-macro.rs:8:8 | LL | m::mac!(); - | ^^^ + | ^^^ this macro is private + | +note: the macro `mac` is defined here + --> $DIR/decl-macro.rs:4:5 + | +LL | macro mac() {} + | ^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/privacy/privacy-in-paths.stderr b/src/test/ui/privacy/privacy-in-paths.stderr index 4b9faca045..8860d8f15f 100644 --- a/src/test/ui/privacy/privacy-in-paths.stderr +++ b/src/test/ui/privacy/privacy-in-paths.stderr @@ -2,19 +2,37 @@ error[E0603]: module `bar` is private --> $DIR/privacy-in-paths.rs:24:16 | LL | ::foo::bar::baz::f(); - | ^^^ + | ^^^ this module is private + | +note: the module `bar` is defined here + --> $DIR/privacy-in-paths.rs:3:5 + | +LL | mod bar { + | ^^^^^^^ error[E0603]: module `bar` is private --> $DIR/privacy-in-paths.rs:25:16 | LL | ::foo::bar::S::f(); - | ^^^ + | ^^^ this module is private + | +note: the module `bar` is defined here + --> $DIR/privacy-in-paths.rs:3:5 + | +LL | mod bar { + | ^^^^^^^ error[E0603]: trait `T` is private --> $DIR/privacy-in-paths.rs:26:23 | LL | <() as ::foo::T>::Assoc::f(); - | ^ + | ^ this trait is private + | +note: the trait `T` is defined here + --> $DIR/privacy-in-paths.rs:8:5 + | +LL | trait T { + | ^^^^^^^ error: aborting due to 3 previous errors diff --git a/src/test/ui/privacy/privacy-ns1.stderr b/src/test/ui/privacy/privacy-ns1.stderr index 45ca00f55a..66e9b78f67 100644 --- a/src/test/ui/privacy/privacy-ns1.stderr +++ b/src/test/ui/privacy/privacy-ns1.stderr @@ -63,6 +63,10 @@ LL | use foo2::Bar; | LL | use foo3::Bar; | +help: you might be missing a type parameter + | +LL | fn test_glob3<Bar>() { + | ^^^^^ error[E0107]: wrong number of const arguments: expected 0, found 1 --> $DIR/privacy-ns1.rs:35:17 diff --git a/src/test/ui/privacy/privacy-ns2.stderr b/src/test/ui/privacy/privacy-ns2.stderr index 2871573130..8b12109b37 100644 --- a/src/test/ui/privacy/privacy-ns2.stderr +++ b/src/test/ui/privacy/privacy-ns2.stderr @@ -58,19 +58,37 @@ error[E0603]: trait `Bar` is private --> $DIR/privacy-ns2.rs:63:15 | LL | use foo3::Bar; - | ^^^ + | ^^^ this trait is private + | +note: the trait `Bar` is defined here + --> $DIR/privacy-ns2.rs:55:5 + | +LL | trait Bar { + | ^^^^^^^^^ error[E0603]: trait `Bar` is private --> $DIR/privacy-ns2.rs:67:15 | LL | use foo3::Bar; - | ^^^ + | ^^^ this trait is private + | +note: the trait `Bar` is defined here + --> $DIR/privacy-ns2.rs:55:5 + | +LL | trait Bar { + | ^^^^^^^^^ error[E0603]: trait `Bar` is private --> $DIR/privacy-ns2.rs:74:16 | LL | use foo3::{Bar,Baz}; - | ^^^ + | ^^^ this trait is private + | +note: the trait `Bar` is defined here + --> $DIR/privacy-ns2.rs:55:5 + | +LL | trait Bar { + | ^^^^^^^^^ error[E0107]: wrong number of const arguments: expected 0, found 1 --> $DIR/privacy-ns2.rs:41:18 diff --git a/src/test/ui/privacy/privacy-ufcs.stderr b/src/test/ui/privacy/privacy-ufcs.stderr index 6be14df89d..08640b802a 100644 --- a/src/test/ui/privacy/privacy-ufcs.stderr +++ b/src/test/ui/privacy/privacy-ufcs.stderr @@ -2,7 +2,13 @@ error[E0603]: trait `Bar` is private --> $DIR/privacy-ufcs.rs:12:20 | LL | <i32 as ::foo::Bar>::baz(); - | ^^^ + | ^^^ this trait is private + | +note: the trait `Bar` is defined here + --> $DIR/privacy-ufcs.rs:4:5 + | +LL | trait Bar { + | ^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/privacy/privacy1.rs b/src/test/ui/privacy/privacy1.rs index d376237c35..fcf7b19572 100644 --- a/src/test/ui/privacy/privacy1.rs +++ b/src/test/ui/privacy/privacy1.rs @@ -131,6 +131,7 @@ mod foo { fn test2() { use bar::baz::{foo, bar}; //~^ ERROR: module `baz` is private + //~| ERROR: module `baz` is private foo(); bar(); diff --git a/src/test/ui/privacy/privacy1.stderr b/src/test/ui/privacy/privacy1.stderr index b647cc8ab8..215df0dc75 100644 --- a/src/test/ui/privacy/privacy1.stderr +++ b/src/test/ui/privacy/privacy1.stderr @@ -2,73 +2,157 @@ error[E0603]: module `baz` is private --> $DIR/privacy1.rs:132:18 | LL | use bar::baz::{foo, bar}; - | ^^^ + | ^^^ this module is private + | +note: the module `baz` is defined here + --> $DIR/privacy1.rs:50:5 + | +LL | mod baz { + | ^^^^^^^ + +error[E0603]: module `baz` is private + --> $DIR/privacy1.rs:132:18 + | +LL | use bar::baz::{foo, bar}; + | ^^^ this module is private + | +note: the module `baz` is defined here + --> $DIR/privacy1.rs:50:5 + | +LL | mod baz { + | ^^^^^^^ error[E0603]: module `baz` is private - --> $DIR/privacy1.rs:140:18 + --> $DIR/privacy1.rs:141:18 | LL | use bar::baz; - | ^^^ + | ^^^ this module is private + | +note: the module `baz` is defined here + --> $DIR/privacy1.rs:50:5 + | +LL | mod baz { + | ^^^^^^^ error[E0603]: module `i` is private - --> $DIR/privacy1.rs:164:20 + --> $DIR/privacy1.rs:165:20 | LL | use self::foo::i::A; - | ^ + | ^ this module is private + | +note: the module `i` is defined here + --> $DIR/privacy1.rs:170:9 + | +LL | mod i { + | ^^^^^ error[E0603]: module `baz` is private --> $DIR/privacy1.rs:104:16 | LL | ::bar::baz::A::foo(); - | ^^^ + | ^^^ this module is private + | +note: the module `baz` is defined here + --> $DIR/privacy1.rs:50:5 + | +LL | mod baz { + | ^^^^^^^ error[E0603]: module `baz` is private --> $DIR/privacy1.rs:105:16 | LL | ::bar::baz::A::bar(); - | ^^^ + | ^^^ this module is private + | +note: the module `baz` is defined here + --> $DIR/privacy1.rs:50:5 + | +LL | mod baz { + | ^^^^^^^ error[E0603]: module `baz` is private --> $DIR/privacy1.rs:107:16 | LL | ::bar::baz::A.foo2(); - | ^^^ + | ^^^ this module is private + | +note: the module `baz` is defined here + --> $DIR/privacy1.rs:50:5 + | +LL | mod baz { + | ^^^^^^^ error[E0603]: module `baz` is private --> $DIR/privacy1.rs:108:16 | LL | ::bar::baz::A.bar2(); - | ^^^ + | ^^^ this module is private + | +note: the module `baz` is defined here + --> $DIR/privacy1.rs:50:5 + | +LL | mod baz { + | ^^^^^^^ error[E0603]: trait `B` is private --> $DIR/privacy1.rs:112:16 | LL | ::bar::B::foo(); - | ^ + | ^ this trait is private + | +note: the trait `B` is defined here + --> $DIR/privacy1.rs:40:5 + | +LL | trait B { + | ^^^^^^^ error[E0603]: function `epriv` is private --> $DIR/privacy1.rs:118:20 | LL | ::bar::epriv(); - | ^^^^^ + | ^^^^^ this function is private + | +note: the function `epriv` is defined here + --> $DIR/privacy1.rs:65:9 + | +LL | fn epriv(); + | ^^^^^^^^^^^ error[E0603]: module `baz` is private --> $DIR/privacy1.rs:127:16 | LL | ::bar::baz::foo(); - | ^^^ + | ^^^ this module is private + | +note: the module `baz` is defined here + --> $DIR/privacy1.rs:50:5 + | +LL | mod baz { + | ^^^^^^^ error[E0603]: module `baz` is private --> $DIR/privacy1.rs:128:16 | LL | ::bar::baz::bar(); - | ^^^ + | ^^^ this module is private + | +note: the module `baz` is defined here + --> $DIR/privacy1.rs:50:5 + | +LL | mod baz { + | ^^^^^^^ error[E0603]: trait `B` is private - --> $DIR/privacy1.rs:156:17 + --> $DIR/privacy1.rs:157:17 | LL | impl ::bar::B for f32 { fn foo() -> f32 { 1.0 } } - | ^ + | ^ this trait is private + | +note: the trait `B` is defined here + --> $DIR/privacy1.rs:40:5 + | +LL | trait B { + | ^^^^^^^ error[E0624]: method `bar` is private --> $DIR/privacy1.rs:77:9 @@ -100,7 +184,7 @@ error[E0624]: method `bar2` is private LL | ::bar::baz::A.bar2(); | ^^^^ -error: aborting due to 17 previous errors +error: aborting due to 18 previous errors Some errors have detailed explanations: E0603, E0624. For more information about an error, try `rustc --explain E0603`. diff --git a/src/test/ui/privacy/privacy2.stderr b/src/test/ui/privacy/privacy2.stderr index 9f2359657b..719dc27ccf 100644 --- a/src/test/ui/privacy/privacy2.stderr +++ b/src/test/ui/privacy/privacy2.stderr @@ -4,11 +4,17 @@ error[E0432]: unresolved import `bar::foo` LL | use bar::foo; | ^^^^^^^^ no `foo` in `bar` -error[E0603]: function `foo` is private +error[E0603]: function import `foo` is private --> $DIR/privacy2.rs:23:20 | LL | use bar::glob::foo; - | ^^^ + | ^^^ this function import is private + | +note: the function import `foo` is defined here + --> $DIR/privacy2.rs:10:13 + | +LL | use foo; + | ^^^ error: requires `sized` lang_item diff --git a/src/test/ui/privacy/privacy4.stderr b/src/test/ui/privacy/privacy4.stderr index e4a20f920a..e34b2d5049 100644 --- a/src/test/ui/privacy/privacy4.stderr +++ b/src/test/ui/privacy/privacy4.stderr @@ -2,7 +2,13 @@ error[E0603]: module `glob` is private --> $DIR/privacy4.rs:21:14 | LL | use bar::glob::gpriv; - | ^^^^ + | ^^^^ this module is private + | +note: the module `glob` is defined here + --> $DIR/privacy4.rs:13:5 + | +LL | mod glob { + | ^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/privacy/privacy5.stderr b/src/test/ui/privacy/privacy5.stderr index 2ee83149b6..197a857cc3 100644 --- a/src/test/ui/privacy/privacy5.stderr +++ b/src/test/ui/privacy/privacy5.stderr @@ -5,7 +5,13 @@ LL | pub struct A(()); | -- a constructor is private if any of the fields is private ... LL | let a = a::A(()); - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/privacy5.rs:6:5 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:52:16 @@ -14,7 +20,13 @@ LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private ... LL | let b = a::B(2); - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/privacy5.rs:7:5 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:53:16 @@ -23,7 +35,13 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | let c = a::C(2, 3); - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:56:12 @@ -32,7 +50,13 @@ LL | pub struct A(()); | -- a constructor is private if any of the fields is private ... LL | let a::A(()) = a; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/privacy5.rs:6:5 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:57:12 @@ -41,7 +65,13 @@ LL | pub struct A(()); | -- a constructor is private if any of the fields is private ... LL | let a::A(_) = a; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/privacy5.rs:6:5 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:58:18 @@ -50,7 +80,13 @@ LL | pub struct A(()); | -- a constructor is private if any of the fields is private ... LL | match a { a::A(()) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/privacy5.rs:6:5 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:59:18 @@ -59,7 +95,13 @@ LL | pub struct A(()); | -- a constructor is private if any of the fields is private ... LL | match a { a::A(_) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/privacy5.rs:6:5 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:61:12 @@ -68,7 +110,13 @@ LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private ... LL | let a::B(_) = b; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/privacy5.rs:7:5 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:62:12 @@ -77,7 +125,13 @@ LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private ... LL | let a::B(_b) = b; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/privacy5.rs:7:5 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:63:18 @@ -86,7 +140,13 @@ LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private ... LL | match b { a::B(_) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/privacy5.rs:7:5 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:64:18 @@ -95,7 +155,13 @@ LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private ... LL | match b { a::B(_b) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/privacy5.rs:7:5 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:65:18 @@ -104,7 +170,13 @@ LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private ... LL | match b { a::B(1) => {} a::B(_) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/privacy5.rs:7:5 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:65:32 @@ -113,7 +185,13 @@ LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private ... LL | match b { a::B(1) => {} a::B(_) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/privacy5.rs:7:5 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:68:12 @@ -122,7 +200,13 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | let a::C(_, _) = c; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:69:12 @@ -131,7 +215,13 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | let a::C(_a, _) = c; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:70:12 @@ -140,7 +230,13 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | let a::C(_, _b) = c; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:71:12 @@ -149,7 +245,13 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | let a::C(_a, _b) = c; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:72:18 @@ -158,7 +260,13 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | match c { a::C(_, _) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:73:18 @@ -167,7 +275,13 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | match c { a::C(_a, _) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:74:18 @@ -176,7 +290,13 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | match c { a::C(_, _b) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:75:18 @@ -185,7 +305,13 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | match c { a::C(_a, _b) => {} } - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:83:17 @@ -194,7 +320,13 @@ LL | pub struct A(()); | -- a constructor is private if any of the fields is private ... LL | let a2 = a::A; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/privacy5.rs:6:5 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:84:17 @@ -203,7 +335,13 @@ LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private ... LL | let b2 = a::B; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/privacy5.rs:7:5 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:85:17 @@ -212,271 +350,421 @@ LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private ... LL | let c2 = a::C; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/privacy5.rs:8:5 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:90:20 | LL | let a = other::A(()); - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14 | LL | pub struct A(()); | -- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:1:1 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:91:20 | LL | let b = other::B(2); - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14 | LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:2:1 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:92:20 | LL | let c = other::C(2, 3); - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:95:16 | LL | let other::A(()) = a; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14 | LL | pub struct A(()); | -- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:1:1 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:96:16 | LL | let other::A(_) = a; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14 | LL | pub struct A(()); | -- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:1:1 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:97:22 | LL | match a { other::A(()) => {} } - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14 | LL | pub struct A(()); | -- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:1:1 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:98:22 | LL | match a { other::A(_) => {} } - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14 | LL | pub struct A(()); | -- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:1:1 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:100:16 | LL | let other::B(_) = b; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14 | LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:2:1 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:101:16 | LL | let other::B(_b) = b; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14 | LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:2:1 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:102:22 | LL | match b { other::B(_) => {} } - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14 | LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:2:1 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:103:22 | LL | match b { other::B(_b) => {} } - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14 | LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:2:1 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:104:22 | LL | match b { other::B(1) => {} - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14 | LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:2:1 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:105:16 | LL | other::B(_) => {} } - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14 | LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:2:1 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:107:16 | LL | let other::C(_, _) = c; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:108:16 | LL | let other::C(_a, _) = c; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:109:16 | LL | let other::C(_, _b) = c; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:110:16 | LL | let other::C(_a, _b) = c; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:111:22 | LL | match c { other::C(_, _) => {} } - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:112:22 | LL | match c { other::C(_a, _) => {} } - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:113:22 | LL | match c { other::C(_, _b) => {} } - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:114:22 | LL | match c { other::C(_a, _b) => {} } - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `A` is private --> $DIR/privacy5.rs:122:21 | LL | let a2 = other::A; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:1:14 | LL | pub struct A(()); | -- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `A` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:1:1 + | +LL | pub struct A(()); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `B` is private --> $DIR/privacy5.rs:123:21 | LL | let b2 = other::B; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:2:14 | LL | pub struct B(isize); | ----- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `B` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:2:1 + | +LL | pub struct B(isize); + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `C` is private --> $DIR/privacy5.rs:124:21 | LL | let c2 = other::C; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy_tuple_struct.rs:3:14 | LL | pub struct C(pub isize, isize); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `C` is defined here + --> $DIR/auxiliary/privacy_tuple_struct.rs:3:1 + | +LL | pub struct C(pub isize, isize); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to 48 previous errors diff --git a/src/test/ui/privacy/private-in-public-assoc-ty.rs b/src/test/ui/privacy/private-in-public-assoc-ty.rs index 3c42f24d5f..ad1052ada6 100644 --- a/src/test/ui/privacy/private-in-public-assoc-ty.rs +++ b/src/test/ui/privacy/private-in-public-assoc-ty.rs @@ -17,6 +17,8 @@ mod m { //~^ WARN private trait `m::PrivTr` in public interface //~| WARN this was previously accepted //~| WARN private type `m::Priv` in public interface + //~| WARN private type `m::Priv` in public interface + //~| WARN this was previously accepted //~| WARN this was previously accepted type Alias1: PrivTr; type Alias2: PubTrAux1<Priv> = u8; @@ -34,6 +36,7 @@ mod m { type Exist = impl PrivTr; //~^ ERROR private trait `m::PrivTr` in public interface + //~| ERROR private trait `m::PrivTr` in public interface fn infer_exist() -> Self::Exist { Priv } } } diff --git a/src/test/ui/privacy/private-in-public-assoc-ty.stderr b/src/test/ui/privacy/private-in-public-assoc-ty.stderr index 158862f922..3cc551cded 100644 --- a/src/test/ui/privacy/private-in-public-assoc-ty.stderr +++ b/src/test/ui/privacy/private-in-public-assoc-ty.stderr @@ -29,8 +29,23 @@ LL | | } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537> +warning: private type `m::Priv` in public interface (error E0446) + --> $DIR/private-in-public-assoc-ty.rs:16:5 + | +LL | / pub trait PubTr { +LL | | +LL | | +LL | | +... | +LL | | fn infer_exist() -> Self::Exist; +LL | | } + | |_____^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537> + error[E0446]: private type `m::Priv` in public interface - --> $DIR/private-in-public-assoc-ty.rs:25:9 + --> $DIR/private-in-public-assoc-ty.rs:27:9 | LL | struct Priv; | - `m::Priv` declared as private @@ -39,7 +54,7 @@ LL | type Alias4 = Priv; | ^^^^^^^^^^^^^^^^^^^ can't leak private type error[E0446]: private type `m::Priv` in public interface - --> $DIR/private-in-public-assoc-ty.rs:32:9 + --> $DIR/private-in-public-assoc-ty.rs:34:9 | LL | struct Priv; | - `m::Priv` declared as private @@ -48,7 +63,16 @@ LL | type Alias1 = Priv; | ^^^^^^^^^^^^^^^^^^^ can't leak private type error[E0445]: private trait `m::PrivTr` in public interface - --> $DIR/private-in-public-assoc-ty.rs:35:9 + --> $DIR/private-in-public-assoc-ty.rs:37:9 + | +LL | trait PrivTr {} + | - `m::PrivTr` declared as private +... +LL | type Exist = impl PrivTr; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait + +error[E0445]: private trait `m::PrivTr` in public interface + --> $DIR/private-in-public-assoc-ty.rs:37:9 | LL | trait PrivTr {} | - `m::PrivTr` declared as private @@ -56,7 +80,7 @@ LL | trait PrivTr {} LL | type Exist = impl PrivTr; | ^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait -error: aborting due to 3 previous errors +error: aborting due to 4 previous errors Some errors have detailed explanations: E0445, E0446. For more information about an error, try `rustc --explain E0445`. diff --git a/src/test/ui/privacy/private-item-simple.stderr b/src/test/ui/privacy/private-item-simple.stderr index 0d5435e1c5..f51b74f6cb 100644 --- a/src/test/ui/privacy/private-item-simple.stderr +++ b/src/test/ui/privacy/private-item-simple.stderr @@ -2,7 +2,13 @@ error[E0603]: function `f` is private --> $DIR/private-item-simple.rs:6:8 | LL | a::f(); - | ^ + | ^ this function is private + | +note: the function `f` is defined here + --> $DIR/private-item-simple.rs:2:5 + | +LL | fn f() {} + | ^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/privacy/restricted/test.stderr b/src/test/ui/privacy/restricted/test.stderr index e6a61fbefb..aac444b8e3 100644 --- a/src/test/ui/privacy/restricted/test.stderr +++ b/src/test/ui/privacy/restricted/test.stderr @@ -26,13 +26,25 @@ error[E0603]: struct `Crate` is private --> $DIR/test.rs:38:25 | LL | use pub_restricted::Crate; - | ^^^^^ + | ^^^^^ this struct is private + | +note: the struct `Crate` is defined here + --> $DIR/auxiliary/pub_restricted.rs:3:1 + | +LL | pub(crate) struct Crate; + | ^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: function `f` is private --> $DIR/test.rs:30:19 | LL | use foo::bar::f; - | ^ + | ^ this function is private + | +note: the function `f` is defined here + --> $DIR/test.rs:8:9 + | +LL | pub(super) fn f() {} + | ^^^^^^^^^^^^^^^^^ error[E0616]: field `x` of struct `foo::bar::S` is private --> $DIR/test.rs:31:5 diff --git a/src/test/ui/proc-macro/attributes-on-modules-fail.rs b/src/test/ui/proc-macro/attributes-on-modules-fail.rs index c8bc0b3437..c506e903e7 100644 --- a/src/test/ui/proc-macro/attributes-on-modules-fail.rs +++ b/src/test/ui/proc-macro/attributes-on-modules-fail.rs @@ -3,7 +3,7 @@ #[macro_use] extern crate test_macros; -#[identity_attr] //~ ERROR custom attributes cannot be applied to modules +#[identity_attr] mod m { pub struct X; @@ -19,11 +19,28 @@ mod n {} #[empty_attr] mod module; //~ ERROR non-inline modules in proc macro input are unstable -#[empty_attr] //~ ERROR custom attributes cannot be applied to modules +#[empty_attr] mod outer { mod inner; //~ ERROR non-inline modules in proc macro input are unstable mod inner_inline {} // OK } +#[derive(Empty)] +struct S { + field: [u8; { + #[path = "outer/inner.rs"] + mod inner; //~ ERROR non-inline modules in proc macro input are unstable + mod inner_inline {} // OK + 0 + }] +} + +#[identity_attr] +fn f() { + #[path = "outer/inner.rs"] + mod inner; //~ ERROR non-inline modules in proc macro input are unstable + mod inner_inline {} // OK +} + fn main() {} diff --git a/src/test/ui/proc-macro/attributes-on-modules-fail.stderr b/src/test/ui/proc-macro/attributes-on-modules-fail.stderr index 34a5a5aaa5..74b9932a91 100644 --- a/src/test/ui/proc-macro/attributes-on-modules-fail.stderr +++ b/src/test/ui/proc-macro/attributes-on-modules-fail.stderr @@ -1,12 +1,3 @@ -error[E0658]: custom attributes cannot be applied to modules - --> $DIR/attributes-on-modules-fail.rs:6:1 - | -LL | #[identity_attr] - | ^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/54727 - = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable - error: `derive` may only be applied to structs, enums and unions --> $DIR/attributes-on-modules-fail.rs:16:1 | @@ -31,11 +22,20 @@ LL | mod inner; = note: for more information, see https://github.com/rust-lang/rust/issues/54727 = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable -error[E0658]: custom attributes cannot be applied to modules - --> $DIR/attributes-on-modules-fail.rs:22:1 +error[E0658]: non-inline modules in proc macro input are unstable + --> $DIR/attributes-on-modules-fail.rs:33:9 + | +LL | mod inner; + | ^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/54727 + = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable + +error[E0658]: non-inline modules in proc macro input are unstable + --> $DIR/attributes-on-modules-fail.rs:42:5 | -LL | #[empty_attr] - | ^^^^^^^^^^^^^ +LL | mod inner; + | ^^^^^^^^^^ | = note: for more information, see https://github.com/rust-lang/rust/issues/54727 = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable diff --git a/src/test/ui/proc-macro/attributes-on-modules.rs b/src/test/ui/proc-macro/attributes-on-modules.rs index 12c3ac6d94..6c73b0bf19 100644 --- a/src/test/ui/proc-macro/attributes-on-modules.rs +++ b/src/test/ui/proc-macro/attributes-on-modules.rs @@ -1,13 +1,19 @@ +// check-pass // aux-build:test-macros.rs #[macro_use] extern crate test_macros; -#[identity_attr] //~ ERROR custom attributes cannot be applied to modules +#[identity_attr] mod m { pub struct S; } +#[identity_attr] +fn f() { + mod m {} +} + fn main() { let s = m::S; } diff --git a/src/test/ui/proc-macro/attributes-on-modules.stderr b/src/test/ui/proc-macro/attributes-on-modules.stderr deleted file mode 100644 index df75f0bf4b..0000000000 --- a/src/test/ui/proc-macro/attributes-on-modules.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0658]: custom attributes cannot be applied to modules - --> $DIR/attributes-on-modules.rs:6:1 - | -LL | #[identity_attr] - | ^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/54727 - = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/proc-macro/disappearing-resolution.rs b/src/test/ui/proc-macro/disappearing-resolution.rs index a01b8f302c..50f04b1eae 100644 --- a/src/test/ui/proc-macro/disappearing-resolution.rs +++ b/src/test/ui/proc-macro/disappearing-resolution.rs @@ -8,7 +8,7 @@ extern crate test_macros; mod m { use test_macros::Empty; } -use m::Empty; //~ ERROR derive macro `Empty` is private +use m::Empty; //~ ERROR derive macro import `Empty` is private // To resolve `empty_helper` we need to resolve `Empty`. // During initial resolution `use m::Empty` introduces no entries, so we proceed to `macro_use`, diff --git a/src/test/ui/proc-macro/disappearing-resolution.stderr b/src/test/ui/proc-macro/disappearing-resolution.stderr index a3377ef515..3beaedf61d 100644 --- a/src/test/ui/proc-macro/disappearing-resolution.stderr +++ b/src/test/ui/proc-macro/disappearing-resolution.stderr @@ -4,11 +4,17 @@ error: cannot find attribute `empty_helper` in this scope LL | #[empty_helper] | ^^^^^^^^^^^^ -error[E0603]: derive macro `Empty` is private +error[E0603]: derive macro import `Empty` is private --> $DIR/disappearing-resolution.rs:11:8 | LL | use m::Empty; - | ^^^^^ + | ^^^^^ this derive macro import is private + | +note: the derive macro import `Empty` is defined here + --> $DIR/disappearing-resolution.rs:9:9 + | +LL | use test_macros::Empty; + | ^^^^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/proc-macro/generate-mod.stderr b/src/test/ui/proc-macro/generate-mod.stderr index 829d8bf4c8..fe53fb242f 100644 --- a/src/test/ui/proc-macro/generate-mod.stderr +++ b/src/test/ui/proc-macro/generate-mod.stderr @@ -6,6 +6,9 @@ LL | generate_mod::check!(); | | | not found in this scope | in this macro invocation + | + = note: possible candidate is found in another module, you can import it into scope: + FromOutside error[E0412]: cannot find type `Outer` in this scope --> $DIR/generate-mod.rs:9:1 @@ -15,18 +18,27 @@ LL | generate_mod::check!(); | | | not found in this scope | in this macro invocation + | + = note: possible candidate is found in another module, you can import it into scope: + Outer error[E0412]: cannot find type `FromOutside` in this scope --> $DIR/generate-mod.rs:12:1 | LL | #[generate_mod::check_attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope + | + = note: possible candidate is found in another module, you can import it into scope: + FromOutside error[E0412]: cannot find type `OuterAttr` in this scope --> $DIR/generate-mod.rs:12:1 | LL | #[generate_mod::check_attr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope + | + = note: possible candidate is found in another module, you can import it into scope: + OuterAttr warning: cannot find type `FromOutside` in this scope --> $DIR/generate-mod.rs:16:10 diff --git a/src/test/ui/proc-macro/invalid-punct-ident-4.rs b/src/test/ui/proc-macro/invalid-punct-ident-4.rs index 5918782169..e50f24deae 100644 --- a/src/test/ui/proc-macro/invalid-punct-ident-4.rs +++ b/src/test/ui/proc-macro/invalid-punct-ident-4.rs @@ -4,4 +4,4 @@ extern crate invalid_punct_ident; lexer_failure!(); //~ ERROR proc macro panicked - //~| ERROR unexpected close delimiter: `)` + //~| ERROR unexpected closing delimiter: `)` diff --git a/src/test/ui/proc-macro/invalid-punct-ident-4.stderr b/src/test/ui/proc-macro/invalid-punct-ident-4.stderr index 65e40172ef..e7764004e8 100644 --- a/src/test/ui/proc-macro/invalid-punct-ident-4.stderr +++ b/src/test/ui/proc-macro/invalid-punct-ident-4.stderr @@ -1,10 +1,10 @@ -error: unexpected close delimiter: `)` +error: unexpected closing delimiter: `)` --> $DIR/invalid-punct-ident-4.rs:6:1 | LL | lexer_failure!(); | ^^^^^^^^^^^^^^^^^ | | - | unexpected close delimiter + | unexpected closing delimiter | in this macro invocation error: proc macro panicked diff --git a/src/test/ui/proc-macro/issue-50493.rs b/src/test/ui/proc-macro/issue-50493.rs index 5d1a9f25ba..f1934f62fd 100644 --- a/src/test/ui/proc-macro/issue-50493.rs +++ b/src/test/ui/proc-macro/issue-50493.rs @@ -4,6 +4,7 @@ extern crate issue_50493; #[derive(Derive)] //~ ERROR field `field` of struct `Restricted` is private + //~| ERROR field `field` of struct `Restricted` is private struct Restricted { pub(in restricted) field: usize, //~ visibilities can only be restricted to ancestor modules } diff --git a/src/test/ui/proc-macro/issue-50493.stderr b/src/test/ui/proc-macro/issue-50493.stderr index 6b8724457a..56c7800102 100644 --- a/src/test/ui/proc-macro/issue-50493.stderr +++ b/src/test/ui/proc-macro/issue-50493.stderr @@ -1,5 +1,5 @@ error[E0742]: visibilities can only be restricted to ancestor modules - --> $DIR/issue-50493.rs:8:12 + --> $DIR/issue-50493.rs:9:12 | LL | pub(in restricted) field: usize, | ^^^^^^^^^^ @@ -10,7 +10,13 @@ error[E0616]: field `field` of struct `Restricted` is private LL | #[derive(Derive)] | ^^^^^^ -error: aborting due to 2 previous errors +error[E0616]: field `field` of struct `Restricted` is private + --> $DIR/issue-50493.rs:6:10 + | +LL | #[derive(Derive)] + | ^^^^^^ + +error: aborting due to 3 previous errors Some errors have detailed explanations: E0616, E0742. For more information about an error, try `rustc --explain E0616`. diff --git a/src/test/ui/proc-macro/item-error.stderr b/src/test/ui/proc-macro/item-error.stderr index e801c26c43..01eadbe252 100644 --- a/src/test/ui/proc-macro/item-error.stderr +++ b/src/test/ui/proc-macro/item-error.stderr @@ -2,7 +2,13 @@ error[E0106]: missing lifetime specifier --> $DIR/item-error.rs:10:8 | LL | a: &u64 - | ^ expected lifetime parameter + | ^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | struct A<'lifetime> { +LL | a: &'lifetime u64 + | error: aborting due to previous error diff --git a/src/test/ui/proc-macro/macro-namespace-reserved-2.rs b/src/test/ui/proc-macro/macro-namespace-reserved-2.rs index b17c056593..470b22b487 100644 --- a/src/test/ui/proc-macro/macro-namespace-reserved-2.rs +++ b/src/test/ui/proc-macro/macro-namespace-reserved-2.rs @@ -46,6 +46,7 @@ fn check_attr2() {} fn check_attr3() {} #[derive(my_macro)] //~ ERROR cannot find derive macro `my_macro` in this scope + //~| ERROR cannot find derive macro `my_macro` in this scope #[derive(crate::my_macro)] //~ ERROR can't use a procedural macro from the same crate that defines //~| ERROR expected derive macro, found macro `crate::my_macro` struct CheckDerive1; diff --git a/src/test/ui/proc-macro/macro-namespace-reserved-2.stderr b/src/test/ui/proc-macro/macro-namespace-reserved-2.stderr index c011a70cd0..a617319fae 100644 --- a/src/test/ui/proc-macro/macro-namespace-reserved-2.stderr +++ b/src/test/ui/proc-macro/macro-namespace-reserved-2.stderr @@ -47,19 +47,19 @@ LL | #[MyTrait] | ^^^^^^^ not an attribute error: can't use a procedural macro from the same crate that defines it - --> $DIR/macro-namespace-reserved-2.rs:52:10 + --> $DIR/macro-namespace-reserved-2.rs:53:10 | LL | #[derive(my_macro_attr)] | ^^^^^^^^^^^^^ error: expected derive macro, found attribute macro `my_macro_attr` - --> $DIR/macro-namespace-reserved-2.rs:52:10 + --> $DIR/macro-namespace-reserved-2.rs:53:10 | LL | #[derive(my_macro_attr)] | ^^^^^^^^^^^^^ not a derive macro error: can't use a procedural macro from the same crate that defines it - --> $DIR/macro-namespace-reserved-2.rs:55:10 + --> $DIR/macro-namespace-reserved-2.rs:56:10 | LL | #[derive(MyTrait)] | ^^^^^^^ @@ -77,13 +77,13 @@ LL | #[crate::my_macro] | ^^^^^^^^^^^^^^^ not an attribute error: can't use a procedural macro from the same crate that defines it - --> $DIR/macro-namespace-reserved-2.rs:49:10 + --> $DIR/macro-namespace-reserved-2.rs:50:10 | LL | #[derive(crate::my_macro)] | ^^^^^^^^^^^^^^^ error: expected derive macro, found macro `crate::my_macro` - --> $DIR/macro-namespace-reserved-2.rs:49:10 + --> $DIR/macro-namespace-reserved-2.rs:50:10 | LL | #[derive(crate::my_macro)] | ^^^^^^^^^^^^^^^ not a derive macro @@ -112,5 +112,11 @@ error: cannot find derive macro `my_macro` in this scope LL | #[derive(my_macro)] | ^^^^^^^^ -error: aborting due to 19 previous errors +error: cannot find derive macro `my_macro` in this scope + --> $DIR/macro-namespace-reserved-2.rs:48:10 + | +LL | #[derive(my_macro)] + | ^^^^^^^^ + +error: aborting due to 20 previous errors diff --git a/src/test/ui/proc-macro/parent-source-spans.rs b/src/test/ui/proc-macro/parent-source-spans.rs index 7b2ffefb05..95a3f96951 100644 --- a/src/test/ui/proc-macro/parent-source-spans.rs +++ b/src/test/ui/proc-macro/parent-source-spans.rs @@ -1,3 +1,7 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // aux-build:parent-source-spans.rs #![feature(decl_macro, proc_macro_hygiene)] diff --git a/src/test/ui/proc-macro/parent-source-spans.stderr b/src/test/ui/proc-macro/parent-source-spans.stderr index 3e54a71f0e..9f0fefcfe6 100644 --- a/src/test/ui/proc-macro/parent-source-spans.stderr +++ b/src/test/ui/proc-macro/parent-source-spans.stderr @@ -1,5 +1,5 @@ error: first final: "hello" - --> $DIR/parent-source-spans.rs:15:12 + --> $DIR/parent-source-spans.rs:19:12 | LL | three!($a, $b); | ^^ @@ -8,7 +8,7 @@ LL | one!("hello", "world"); | ----------------------- in this macro invocation error: second final: "world" - --> $DIR/parent-source-spans.rs:15:16 + --> $DIR/parent-source-spans.rs:19:16 | LL | three!($a, $b); | ^^ @@ -17,7 +17,7 @@ LL | one!("hello", "world"); | ----------------------- in this macro invocation error: first parent: "hello" - --> $DIR/parent-source-spans.rs:9:5 + --> $DIR/parent-source-spans.rs:13:5 | LL | two!($a, $b); | ^^^^^^^^^^^^^ @@ -26,7 +26,7 @@ LL | one!("hello", "world"); | ----------------------- in this macro invocation error: second parent: "world" - --> $DIR/parent-source-spans.rs:9:5 + --> $DIR/parent-source-spans.rs:13:5 | LL | two!($a, $b); | ^^^^^^^^^^^^^ @@ -35,31 +35,31 @@ LL | one!("hello", "world"); | ----------------------- in this macro invocation error: first grandparent: "hello" - --> $DIR/parent-source-spans.rs:35:5 + --> $DIR/parent-source-spans.rs:39:5 | LL | one!("hello", "world"); | ^^^^^^^^^^^^^^^^^^^^^^^ error: second grandparent: "world" - --> $DIR/parent-source-spans.rs:35:5 + --> $DIR/parent-source-spans.rs:39:5 | LL | one!("hello", "world"); | ^^^^^^^^^^^^^^^^^^^^^^^ error: first source: "hello" - --> $DIR/parent-source-spans.rs:35:5 + --> $DIR/parent-source-spans.rs:39:5 | LL | one!("hello", "world"); | ^^^^^^^^^^^^^^^^^^^^^^^ error: second source: "world" - --> $DIR/parent-source-spans.rs:35:5 + --> $DIR/parent-source-spans.rs:39:5 | LL | one!("hello", "world"); | ^^^^^^^^^^^^^^^^^^^^^^^ error: first final: "yay" - --> $DIR/parent-source-spans.rs:15:12 + --> $DIR/parent-source-spans.rs:19:12 | LL | three!($a, $b); | ^^ @@ -68,7 +68,7 @@ LL | two!("yay", "rust"); | -------------------- in this macro invocation error: second final: "rust" - --> $DIR/parent-source-spans.rs:15:16 + --> $DIR/parent-source-spans.rs:19:16 | LL | three!($a, $b); | ^^ @@ -77,79 +77,94 @@ LL | two!("yay", "rust"); | -------------------- in this macro invocation error: first parent: "yay" - --> $DIR/parent-source-spans.rs:41:5 + --> $DIR/parent-source-spans.rs:45:5 | LL | two!("yay", "rust"); | ^^^^^^^^^^^^^^^^^^^^ error: second parent: "rust" - --> $DIR/parent-source-spans.rs:41:5 + --> $DIR/parent-source-spans.rs:45:5 | LL | two!("yay", "rust"); | ^^^^^^^^^^^^^^^^^^^^ error: first source: "yay" - --> $DIR/parent-source-spans.rs:41:5 + --> $DIR/parent-source-spans.rs:45:5 | LL | two!("yay", "rust"); | ^^^^^^^^^^^^^^^^^^^^ error: second source: "rust" - --> $DIR/parent-source-spans.rs:41:5 + --> $DIR/parent-source-spans.rs:45:5 | LL | two!("yay", "rust"); | ^^^^^^^^^^^^^^^^^^^^ error: first final: "hip" - --> $DIR/parent-source-spans.rs:47:12 + --> $DIR/parent-source-spans.rs:51:12 | LL | three!("hip", "hop"); | ^^^^^ error: second final: "hop" - --> $DIR/parent-source-spans.rs:47:19 + --> $DIR/parent-source-spans.rs:51:19 | LL | three!("hip", "hop"); | ^^^^^ error: first source: "hip" - --> $DIR/parent-source-spans.rs:47:12 + --> $DIR/parent-source-spans.rs:51:12 | LL | three!("hip", "hop"); | ^^^^^ error: second source: "hop" - --> $DIR/parent-source-spans.rs:47:19 + --> $DIR/parent-source-spans.rs:51:19 | LL | three!("hip", "hop"); | ^^^^^ error[E0425]: cannot find value `ok` in this scope - --> $DIR/parent-source-spans.rs:28:5 + --> $DIR/parent-source-spans.rs:32:5 | LL | parent_source_spans!($($tokens)*); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: a tuple variant with a similar name exists: `Ok` ... LL | one!("hello", "world"); | ----------------------- in this macro invocation + | + ::: $SRC_DIR/libcore/result.rs:LL:COL + | +LL | Ok(#[stable(feature = "rust1", since = "1.0.0")] T), + | --------------------------------------------------- similarly named tuple variant `Ok` defined here error[E0425]: cannot find value `ok` in this scope - --> $DIR/parent-source-spans.rs:28:5 + --> $DIR/parent-source-spans.rs:32:5 | LL | parent_source_spans!($($tokens)*); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: a tuple variant with a similar name exists: `Ok` ... LL | two!("yay", "rust"); | -------------------- in this macro invocation + | + ::: $SRC_DIR/libcore/result.rs:LL:COL + | +LL | Ok(#[stable(feature = "rust1", since = "1.0.0")] T), + | --------------------------------------------------- similarly named tuple variant `Ok` defined here error[E0425]: cannot find value `ok` in this scope - --> $DIR/parent-source-spans.rs:28:5 + --> $DIR/parent-source-spans.rs:32:5 | LL | parent_source_spans!($($tokens)*); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: a tuple variant with a similar name exists: `Ok` ... LL | three!("hip", "hop"); | --------------------- in this macro invocation + | + ::: $SRC_DIR/libcore/result.rs:LL:COL + | +LL | Ok(#[stable(feature = "rust1", since = "1.0.0")] T), + | --------------------------------------------------- similarly named tuple variant `Ok` defined here error: aborting due to 21 previous errors diff --git a/src/test/ui/proc-macro/proc-macro-gates.rs b/src/test/ui/proc-macro/proc-macro-gates.rs index 591c1e039b..5df6ac422a 100644 --- a/src/test/ui/proc-macro/proc-macro-gates.rs +++ b/src/test/ui/proc-macro/proc-macro-gates.rs @@ -10,12 +10,8 @@ fn _test_inner() { #![empty_attr] //~ ERROR: non-builtin inner attributes are unstable } -#[empty_attr] //~ ERROR: custom attributes cannot be applied to modules -mod _test2 {} - mod _test2_inner { - #![empty_attr] //~ ERROR: custom attributes cannot be applied to modules - //~| ERROR: non-builtin inner attributes are unstable + #![empty_attr] //~ ERROR: non-builtin inner attributes are unstable } #[empty_attr = "y"] //~ ERROR: key-value macro attributes are not supported diff --git a/src/test/ui/proc-macro/proc-macro-gates.stderr b/src/test/ui/proc-macro/proc-macro-gates.stderr index e939434243..fff96572e3 100644 --- a/src/test/ui/proc-macro/proc-macro-gates.stderr +++ b/src/test/ui/proc-macro/proc-macro-gates.stderr @@ -8,7 +8,7 @@ LL | #![empty_attr] = help: add `#![feature(custom_inner_attributes)]` to the crate attributes to enable error[E0658]: non-builtin inner attributes are unstable - --> $DIR/proc-macro-gates.rs:17:5 + --> $DIR/proc-macro-gates.rs:14:5 | LL | #![empty_attr] | ^^^^^^^^^^^^^^ @@ -16,32 +16,14 @@ LL | #![empty_attr] = note: for more information, see https://github.com/rust-lang/rust/issues/54726 = help: add `#![feature(custom_inner_attributes)]` to the crate attributes to enable -error[E0658]: custom attributes cannot be applied to modules - --> $DIR/proc-macro-gates.rs:13:1 - | -LL | #[empty_attr] - | ^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/54727 - = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable - -error[E0658]: custom attributes cannot be applied to modules - --> $DIR/proc-macro-gates.rs:17:5 - | -LL | #![empty_attr] - | ^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/54727 - = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable - error: key-value macro attributes are not supported - --> $DIR/proc-macro-gates.rs:21:1 + --> $DIR/proc-macro-gates.rs:17:1 | LL | #[empty_attr = "y"] | ^^^^^^^^^^^^^^^^^^^ error[E0658]: custom attributes cannot be applied to statements - --> $DIR/proc-macro-gates.rs:30:5 + --> $DIR/proc-macro-gates.rs:26:5 | LL | #[empty_attr] | ^^^^^^^^^^^^^ @@ -50,7 +32,7 @@ LL | #[empty_attr] = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: custom attributes cannot be applied to statements - --> $DIR/proc-macro-gates.rs:34:5 + --> $DIR/proc-macro-gates.rs:30:5 | LL | #[empty_attr] | ^^^^^^^^^^^^^ @@ -59,7 +41,7 @@ LL | #[empty_attr] = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: custom attributes cannot be applied to statements - --> $DIR/proc-macro-gates.rs:38:5 + --> $DIR/proc-macro-gates.rs:34:5 | LL | #[empty_attr] | ^^^^^^^^^^^^^ @@ -68,7 +50,7 @@ LL | #[empty_attr] = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: custom attributes cannot be applied to expressions - --> $DIR/proc-macro-gates.rs:42:14 + --> $DIR/proc-macro-gates.rs:38:14 | LL | let _x = #[identity_attr] 2; | ^^^^^^^^^^^^^^^^ @@ -77,7 +59,7 @@ LL | let _x = #[identity_attr] 2; = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: custom attributes cannot be applied to expressions - --> $DIR/proc-macro-gates.rs:45:15 + --> $DIR/proc-macro-gates.rs:41:15 | LL | let _x = [#[identity_attr] 2]; | ^^^^^^^^^^^^^^^^ @@ -86,7 +68,7 @@ LL | let _x = [#[identity_attr] 2]; = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: custom attributes cannot be applied to expressions - --> $DIR/proc-macro-gates.rs:48:14 + --> $DIR/proc-macro-gates.rs:44:14 | LL | let _x = #[identity_attr] println!(); | ^^^^^^^^^^^^^^^^ @@ -95,7 +77,7 @@ LL | let _x = #[identity_attr] println!(); = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: procedural macros cannot be expanded to patterns - --> $DIR/proc-macro-gates.rs:53:12 + --> $DIR/proc-macro-gates.rs:49:12 | LL | if let identity!(Some(_x)) = Some(3) {} | ^^^^^^^^^^^^^^^^^^^ @@ -104,7 +86,7 @@ LL | if let identity!(Some(_x)) = Some(3) {} = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: procedural macros cannot be expanded to statements - --> $DIR/proc-macro-gates.rs:56:5 + --> $DIR/proc-macro-gates.rs:52:5 | LL | empty!(struct S;); | ^^^^^^^^^^^^^^^^^^ @@ -113,7 +95,7 @@ LL | empty!(struct S;); = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: procedural macros cannot be expanded to statements - --> $DIR/proc-macro-gates.rs:57:5 + --> $DIR/proc-macro-gates.rs:53:5 | LL | empty!(let _x = 3;); | ^^^^^^^^^^^^^^^^^^^^ @@ -122,7 +104,7 @@ LL | empty!(let _x = 3;); = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: procedural macros cannot be expanded to expressions - --> $DIR/proc-macro-gates.rs:59:14 + --> $DIR/proc-macro-gates.rs:55:14 | LL | let _x = identity!(3); | ^^^^^^^^^^^^ @@ -131,7 +113,7 @@ LL | let _x = identity!(3); = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable error[E0658]: procedural macros cannot be expanded to expressions - --> $DIR/proc-macro-gates.rs:60:15 + --> $DIR/proc-macro-gates.rs:56:15 | LL | let _x = [empty!(3)]; | ^^^^^^^^^ @@ -139,6 +121,6 @@ LL | let _x = [empty!(3)]; = note: for more information, see https://github.com/rust-lang/rust/issues/54727 = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable -error: aborting due to 16 previous errors +error: aborting due to 14 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/proc-macro/resolve-error.rs b/src/test/ui/proc-macro/resolve-error.rs index d2282af27f..8ff36ff0a2 100644 --- a/src/test/ui/proc-macro/resolve-error.rs +++ b/src/test/ui/proc-macro/resolve-error.rs @@ -1,3 +1,7 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // aux-build:derive-foo.rs // aux-build:derive-clona.rs // aux-build:test-macros.rs @@ -21,6 +25,7 @@ macro_rules! attr_proc_mac { #[derive(FooWithLongNan)] //~^ ERROR cannot find +//~| ERROR cannot find struct Foo; // Interpreted as an unstable custom attribute @@ -33,14 +38,17 @@ struct Asdf; #[derive(Dlone)] //~^ ERROR cannot find +//~| ERROR cannot find struct A; #[derive(Dlona)] //~^ ERROR cannot find +//~| ERROR cannot find struct B; #[derive(attr_proc_macra)] //~^ ERROR cannot find +//~| ERROR cannot find struct C; fn main() { diff --git a/src/test/ui/proc-macro/resolve-error.stderr b/src/test/ui/proc-macro/resolve-error.stderr index 02c82c01ed..73a6ab1cfb 100644 --- a/src/test/ui/proc-macro/resolve-error.stderr +++ b/src/test/ui/proc-macro/resolve-error.stderr @@ -1,17 +1,22 @@ error: cannot find macro `bang_proc_macrp` in this scope - --> $DIR/resolve-error.rs:56:5 + --> $DIR/resolve-error.rs:64:5 | LL | bang_proc_macrp!(); | ^^^^^^^^^^^^^^^ help: a macro with a similar name exists: `bang_proc_macro` + | + ::: $DIR/auxiliary/test-macros.rs:15:1 + | +LL | pub fn empty(_: TokenStream) -> TokenStream { + | ------------------------------------------- similarly named macro `bang_proc_macro` defined here error: cannot find macro `Dlona` in this scope - --> $DIR/resolve-error.rs:53:5 + --> $DIR/resolve-error.rs:61:5 | LL | Dlona!(); | ^^^^^ error: cannot find macro `attr_proc_macra` in this scope - --> $DIR/resolve-error.rs:50:5 + --> $DIR/resolve-error.rs:58:5 | LL | / macro_rules! attr_proc_mac { LL | | () => {} @@ -22,7 +27,7 @@ LL | attr_proc_macra!(); | ^^^^^^^^^^^^^^^ help: a macro with a similar name exists: `attr_proc_mac` error: cannot find macro `FooWithLongNama` in this scope - --> $DIR/resolve-error.rs:47:5 + --> $DIR/resolve-error.rs:55:5 | LL | / macro_rules! FooWithLongNam { LL | | () => {} @@ -33,40 +38,99 @@ LL | FooWithLongNama!(); | ^^^^^^^^^^^^^^^ help: a macro with a similar name exists: `FooWithLongNam` error: cannot find derive macro `attr_proc_macra` in this scope - --> $DIR/resolve-error.rs:42:10 + --> $DIR/resolve-error.rs:49:10 | LL | #[derive(attr_proc_macra)] | ^^^^^^^^^^^^^^^ +error: cannot find derive macro `attr_proc_macra` in this scope + --> $DIR/resolve-error.rs:49:10 + | +LL | #[derive(attr_proc_macra)] + | ^^^^^^^^^^^^^^^ + +error: cannot find derive macro `Dlona` in this scope + --> $DIR/resolve-error.rs:44:10 + | +LL | #[derive(Dlona)] + | ^^^^^ help: a derive macro with a similar name exists: `Clona` + | + ::: $DIR/auxiliary/derive-clona.rs:11:1 + | +LL | pub fn derive_clonea(input: TokenStream) -> TokenStream { + | ------------------------------------------------------- similarly named derive macro `Clona` defined here + error: cannot find derive macro `Dlona` in this scope - --> $DIR/resolve-error.rs:38:10 + --> $DIR/resolve-error.rs:44:10 | LL | #[derive(Dlona)] | ^^^^^ help: a derive macro with a similar name exists: `Clona` + | + ::: $DIR/auxiliary/derive-clona.rs:11:1 + | +LL | pub fn derive_clonea(input: TokenStream) -> TokenStream { + | ------------------------------------------------------- similarly named derive macro `Clona` defined here + +error: cannot find derive macro `Dlone` in this scope + --> $DIR/resolve-error.rs:39:10 + | +LL | #[derive(Dlone)] + | ^^^^^ help: a derive macro with a similar name exists: `Clone` + | + ::: $SRC_DIR/libcore/clone.rs:LL:COL + | +LL | pub macro Clone($item:item) { + | --------------------------- similarly named derive macro `Clone` defined here error: cannot find derive macro `Dlone` in this scope - --> $DIR/resolve-error.rs:34:10 + --> $DIR/resolve-error.rs:39:10 | LL | #[derive(Dlone)] | ^^^^^ help: a derive macro with a similar name exists: `Clone` + | + ::: $SRC_DIR/libcore/clone.rs:LL:COL + | +LL | pub macro Clone($item:item) { + | --------------------------- similarly named derive macro `Clone` defined here error: cannot find attribute `FooWithLongNan` in this scope - --> $DIR/resolve-error.rs:31:3 + --> $DIR/resolve-error.rs:36:3 | LL | #[FooWithLongNan] | ^^^^^^^^^^^^^^ error: cannot find attribute `attr_proc_macra` in this scope - --> $DIR/resolve-error.rs:27:3 + --> $DIR/resolve-error.rs:32:3 | LL | #[attr_proc_macra] | ^^^^^^^^^^^^^^^ help: an attribute macro with a similar name exists: `attr_proc_macro` + | + ::: $DIR/auxiliary/test-macros.rs:20:1 + | +LL | pub fn empty_attr(_: TokenStream, _: TokenStream) -> TokenStream { + | ---------------------------------------------------------------- similarly named attribute macro `attr_proc_macro` defined here error: cannot find derive macro `FooWithLongNan` in this scope - --> $DIR/resolve-error.rs:22:10 + --> $DIR/resolve-error.rs:26:10 | LL | #[derive(FooWithLongNan)] | ^^^^^^^^^^^^^^ help: a derive macro with a similar name exists: `FooWithLongName` + | + ::: $DIR/auxiliary/derive-foo.rs:11:1 + | +LL | pub fn derive_foo(input: TokenStream) -> TokenStream { + | ---------------------------------------------------- similarly named derive macro `FooWithLongName` defined here + +error: cannot find derive macro `FooWithLongNan` in this scope + --> $DIR/resolve-error.rs:26:10 + | +LL | #[derive(FooWithLongNan)] + | ^^^^^^^^^^^^^^ help: a derive macro with a similar name exists: `FooWithLongName` + | + ::: $DIR/auxiliary/derive-foo.rs:11:1 + | +LL | pub fn derive_foo(input: TokenStream) -> TokenStream { + | ---------------------------------------------------- similarly named derive macro `FooWithLongName` defined here -error: aborting due to 10 previous errors +error: aborting due to 14 previous errors diff --git a/src/test/ui/qualified/qualified-path-params-2.rs b/src/test/ui/qualified/qualified-path-params-2.rs index ebdd749046..d0cc1fa3d5 100644 --- a/src/test/ui/qualified/qualified-path-params-2.rs +++ b/src/test/ui/qualified/qualified-path-params-2.rs @@ -16,7 +16,6 @@ impl S { } type A = <S as Tr>::A::f<u8>; -//~^ ERROR type arguments are not allowed for this type -//~| ERROR ambiguous associated type +//~^ ERROR ambiguous associated type fn main() {} diff --git a/src/test/ui/qualified/qualified-path-params-2.stderr b/src/test/ui/qualified/qualified-path-params-2.stderr index 15da5193e8..948f21fce4 100644 --- a/src/test/ui/qualified/qualified-path-params-2.stderr +++ b/src/test/ui/qualified/qualified-path-params-2.stderr @@ -1,16 +1,9 @@ -error[E0109]: type arguments are not allowed for this type - --> $DIR/qualified-path-params-2.rs:18:26 - | -LL | type A = <S as Tr>::A::f<u8>; - | ^^ type argument not allowed - error[E0223]: ambiguous associated type --> $DIR/qualified-path-params-2.rs:18:10 | LL | type A = <S as Tr>::A::f<u8>; | ^^^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<<S as Tr>::A as Trait>::f` -error: aborting due to 2 previous errors +error: aborting due to previous error -Some errors have detailed explanations: E0109, E0223. -For more information about an error, try `rustc --explain E0109`. +For more information about this error, try `rustc --explain E0223`. diff --git a/src/test/ui/range/range_traits-1.rs b/src/test/ui/range/range_traits-1.rs index e28e47435c..4f57c32e91 100644 --- a/src/test/ui/range/range_traits-1.rs +++ b/src/test/ui/range/range_traits-1.rs @@ -4,21 +4,45 @@ use std::ops::*; struct AllTheRanges { a: Range<usize>, //~^ ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare //~| ERROR Ord b: RangeTo<usize>, //~^ ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare //~| ERROR Ord c: RangeFrom<usize>, //~^ ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare //~| ERROR Ord d: RangeFull, //~^ ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare //~| ERROR Ord e: RangeInclusive<usize>, //~^ ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare //~| ERROR Ord f: RangeToInclusive<usize>, //~^ ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare + //~| ERROR can't compare //~| ERROR Ord } diff --git a/src/test/ui/range/range_traits-1.stderr b/src/test/ui/range/range_traits-1.stderr index d085cab89a..f60ec23bdb 100644 --- a/src/test/ui/range/range_traits-1.stderr +++ b/src/test/ui/range/range_traits-1.stderr @@ -8,7 +8,7 @@ LL | a: Range<usize>, = note: required by `std::cmp::PartialOrd::partial_cmp` error[E0277]: can't compare `std::ops::RangeTo<usize>` with `std::ops::RangeTo<usize>` - --> $DIR/range_traits-1.rs:8:5 + --> $DIR/range_traits-1.rs:12:5 | LL | b: RangeTo<usize>, | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo<usize> < std::ops::RangeTo<usize>` and `std::ops::RangeTo<usize> > std::ops::RangeTo<usize>` @@ -17,7 +17,7 @@ LL | b: RangeTo<usize>, = note: required by `std::cmp::PartialOrd::partial_cmp` error[E0277]: can't compare `std::ops::RangeFrom<usize>` with `std::ops::RangeFrom<usize>` - --> $DIR/range_traits-1.rs:11:5 + --> $DIR/range_traits-1.rs:19:5 | LL | c: RangeFrom<usize>, | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom<usize> < std::ops::RangeFrom<usize>` and `std::ops::RangeFrom<usize> > std::ops::RangeFrom<usize>` @@ -26,7 +26,7 @@ LL | c: RangeFrom<usize>, = note: required by `std::cmp::PartialOrd::partial_cmp` error[E0277]: can't compare `std::ops::RangeFull` with `std::ops::RangeFull` - --> $DIR/range_traits-1.rs:14:5 + --> $DIR/range_traits-1.rs:26:5 | LL | d: RangeFull, | ^^^^^^^^^^^^ no implementation for `std::ops::RangeFull < std::ops::RangeFull` and `std::ops::RangeFull > std::ops::RangeFull` @@ -35,7 +35,7 @@ LL | d: RangeFull, = note: required by `std::cmp::PartialOrd::partial_cmp` error[E0277]: can't compare `std::ops::RangeInclusive<usize>` with `std::ops::RangeInclusive<usize>` - --> $DIR/range_traits-1.rs:17:5 + --> $DIR/range_traits-1.rs:33:5 | LL | e: RangeInclusive<usize>, | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive<usize> < std::ops::RangeInclusive<usize>` and `std::ops::RangeInclusive<usize> > std::ops::RangeInclusive<usize>` @@ -44,7 +44,223 @@ LL | e: RangeInclusive<usize>, = note: required by `std::cmp::PartialOrd::partial_cmp` error[E0277]: can't compare `std::ops::RangeToInclusive<usize>` with `std::ops::RangeToInclusive<usize>` - --> $DIR/range_traits-1.rs:20:5 + --> $DIR/range_traits-1.rs:40:5 + | +LL | f: RangeToInclusive<usize>, + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive<usize> < std::ops::RangeToInclusive<usize>` and `std::ops::RangeToInclusive<usize> > std::ops::RangeToInclusive<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeToInclusive<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::Range<usize>` with `std::ops::Range<usize>` + --> $DIR/range_traits-1.rs:5:5 + | +LL | a: Range<usize>, + | ^^^^^^^^^^^^^^^ no implementation for `std::ops::Range<usize> < std::ops::Range<usize>` and `std::ops::Range<usize> > std::ops::Range<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::Range<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeTo<usize>` with `std::ops::RangeTo<usize>` + --> $DIR/range_traits-1.rs:12:5 + | +LL | b: RangeTo<usize>, + | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo<usize> < std::ops::RangeTo<usize>` and `std::ops::RangeTo<usize> > std::ops::RangeTo<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeTo<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeFrom<usize>` with `std::ops::RangeFrom<usize>` + --> $DIR/range_traits-1.rs:19:5 + | +LL | c: RangeFrom<usize>, + | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom<usize> < std::ops::RangeFrom<usize>` and `std::ops::RangeFrom<usize> > std::ops::RangeFrom<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeFrom<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeFull` with `std::ops::RangeFull` + --> $DIR/range_traits-1.rs:26:5 + | +LL | d: RangeFull, + | ^^^^^^^^^^^^ no implementation for `std::ops::RangeFull < std::ops::RangeFull` and `std::ops::RangeFull > std::ops::RangeFull` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeFull` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeInclusive<usize>` with `std::ops::RangeInclusive<usize>` + --> $DIR/range_traits-1.rs:33:5 + | +LL | e: RangeInclusive<usize>, + | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive<usize> < std::ops::RangeInclusive<usize>` and `std::ops::RangeInclusive<usize> > std::ops::RangeInclusive<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeInclusive<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeToInclusive<usize>` with `std::ops::RangeToInclusive<usize>` + --> $DIR/range_traits-1.rs:40:5 + | +LL | f: RangeToInclusive<usize>, + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive<usize> < std::ops::RangeToInclusive<usize>` and `std::ops::RangeToInclusive<usize> > std::ops::RangeToInclusive<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeToInclusive<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::Range<usize>` with `std::ops::Range<usize>` + --> $DIR/range_traits-1.rs:5:5 + | +LL | a: Range<usize>, + | ^^^^^^^^^^^^^^^ no implementation for `std::ops::Range<usize> < std::ops::Range<usize>` and `std::ops::Range<usize> > std::ops::Range<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::Range<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeTo<usize>` with `std::ops::RangeTo<usize>` + --> $DIR/range_traits-1.rs:12:5 + | +LL | b: RangeTo<usize>, + | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo<usize> < std::ops::RangeTo<usize>` and `std::ops::RangeTo<usize> > std::ops::RangeTo<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeTo<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeFrom<usize>` with `std::ops::RangeFrom<usize>` + --> $DIR/range_traits-1.rs:19:5 + | +LL | c: RangeFrom<usize>, + | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom<usize> < std::ops::RangeFrom<usize>` and `std::ops::RangeFrom<usize> > std::ops::RangeFrom<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeFrom<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeFull` with `std::ops::RangeFull` + --> $DIR/range_traits-1.rs:26:5 + | +LL | d: RangeFull, + | ^^^^^^^^^^^^ no implementation for `std::ops::RangeFull < std::ops::RangeFull` and `std::ops::RangeFull > std::ops::RangeFull` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeFull` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeInclusive<usize>` with `std::ops::RangeInclusive<usize>` + --> $DIR/range_traits-1.rs:33:5 + | +LL | e: RangeInclusive<usize>, + | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive<usize> < std::ops::RangeInclusive<usize>` and `std::ops::RangeInclusive<usize> > std::ops::RangeInclusive<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeInclusive<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeToInclusive<usize>` with `std::ops::RangeToInclusive<usize>` + --> $DIR/range_traits-1.rs:40:5 + | +LL | f: RangeToInclusive<usize>, + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive<usize> < std::ops::RangeToInclusive<usize>` and `std::ops::RangeToInclusive<usize> > std::ops::RangeToInclusive<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeToInclusive<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::Range<usize>` with `std::ops::Range<usize>` + --> $DIR/range_traits-1.rs:5:5 + | +LL | a: Range<usize>, + | ^^^^^^^^^^^^^^^ no implementation for `std::ops::Range<usize> < std::ops::Range<usize>` and `std::ops::Range<usize> > std::ops::Range<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::Range<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeTo<usize>` with `std::ops::RangeTo<usize>` + --> $DIR/range_traits-1.rs:12:5 + | +LL | b: RangeTo<usize>, + | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo<usize> < std::ops::RangeTo<usize>` and `std::ops::RangeTo<usize> > std::ops::RangeTo<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeTo<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeFrom<usize>` with `std::ops::RangeFrom<usize>` + --> $DIR/range_traits-1.rs:19:5 + | +LL | c: RangeFrom<usize>, + | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom<usize> < std::ops::RangeFrom<usize>` and `std::ops::RangeFrom<usize> > std::ops::RangeFrom<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeFrom<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeFull` with `std::ops::RangeFull` + --> $DIR/range_traits-1.rs:26:5 + | +LL | d: RangeFull, + | ^^^^^^^^^^^^ no implementation for `std::ops::RangeFull < std::ops::RangeFull` and `std::ops::RangeFull > std::ops::RangeFull` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeFull` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeInclusive<usize>` with `std::ops::RangeInclusive<usize>` + --> $DIR/range_traits-1.rs:33:5 + | +LL | e: RangeInclusive<usize>, + | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive<usize> < std::ops::RangeInclusive<usize>` and `std::ops::RangeInclusive<usize> > std::ops::RangeInclusive<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeInclusive<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeToInclusive<usize>` with `std::ops::RangeToInclusive<usize>` + --> $DIR/range_traits-1.rs:40:5 + | +LL | f: RangeToInclusive<usize>, + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive<usize> < std::ops::RangeToInclusive<usize>` and `std::ops::RangeToInclusive<usize> > std::ops::RangeToInclusive<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeToInclusive<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::Range<usize>` with `std::ops::Range<usize>` + --> $DIR/range_traits-1.rs:5:5 + | +LL | a: Range<usize>, + | ^^^^^^^^^^^^^^^ no implementation for `std::ops::Range<usize> < std::ops::Range<usize>` and `std::ops::Range<usize> > std::ops::Range<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::Range<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeTo<usize>` with `std::ops::RangeTo<usize>` + --> $DIR/range_traits-1.rs:12:5 + | +LL | b: RangeTo<usize>, + | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo<usize> < std::ops::RangeTo<usize>` and `std::ops::RangeTo<usize> > std::ops::RangeTo<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeTo<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeFrom<usize>` with `std::ops::RangeFrom<usize>` + --> $DIR/range_traits-1.rs:19:5 + | +LL | c: RangeFrom<usize>, + | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom<usize> < std::ops::RangeFrom<usize>` and `std::ops::RangeFrom<usize> > std::ops::RangeFrom<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeFrom<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeFull` with `std::ops::RangeFull` + --> $DIR/range_traits-1.rs:26:5 + | +LL | d: RangeFull, + | ^^^^^^^^^^^^ no implementation for `std::ops::RangeFull < std::ops::RangeFull` and `std::ops::RangeFull > std::ops::RangeFull` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeFull` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeInclusive<usize>` with `std::ops::RangeInclusive<usize>` + --> $DIR/range_traits-1.rs:33:5 + | +LL | e: RangeInclusive<usize>, + | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive<usize> < std::ops::RangeInclusive<usize>` and `std::ops::RangeInclusive<usize> > std::ops::RangeInclusive<usize>` + | + = help: the trait `std::cmp::PartialOrd` is not implemented for `std::ops::RangeInclusive<usize>` + = note: required by `std::cmp::PartialOrd::partial_cmp` + +error[E0277]: can't compare `std::ops::RangeToInclusive<usize>` with `std::ops::RangeToInclusive<usize>` + --> $DIR/range_traits-1.rs:40:5 | LL | f: RangeToInclusive<usize>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive<usize> < std::ops::RangeToInclusive<usize>` and `std::ops::RangeToInclusive<usize> > std::ops::RangeToInclusive<usize>` @@ -61,7 +277,7 @@ LL | a: Range<usize>, = note: required by `std::cmp::Ord::cmp` error[E0277]: the trait bound `std::ops::RangeTo<usize>: std::cmp::Ord` is not satisfied - --> $DIR/range_traits-1.rs:8:5 + --> $DIR/range_traits-1.rs:12:5 | LL | b: RangeTo<usize>, | ^^^^^^^^^^^^^^^^^ the trait `std::cmp::Ord` is not implemented for `std::ops::RangeTo<usize>` @@ -69,7 +285,7 @@ LL | b: RangeTo<usize>, = note: required by `std::cmp::Ord::cmp` error[E0277]: the trait bound `std::ops::RangeFrom<usize>: std::cmp::Ord` is not satisfied - --> $DIR/range_traits-1.rs:11:5 + --> $DIR/range_traits-1.rs:19:5 | LL | c: RangeFrom<usize>, | ^^^^^^^^^^^^^^^^^^^ the trait `std::cmp::Ord` is not implemented for `std::ops::RangeFrom<usize>` @@ -77,7 +293,7 @@ LL | c: RangeFrom<usize>, = note: required by `std::cmp::Ord::cmp` error[E0277]: the trait bound `std::ops::RangeFull: std::cmp::Ord` is not satisfied - --> $DIR/range_traits-1.rs:14:5 + --> $DIR/range_traits-1.rs:26:5 | LL | d: RangeFull, | ^^^^^^^^^^^^ the trait `std::cmp::Ord` is not implemented for `std::ops::RangeFull` @@ -85,7 +301,7 @@ LL | d: RangeFull, = note: required by `std::cmp::Ord::cmp` error[E0277]: the trait bound `std::ops::RangeInclusive<usize>: std::cmp::Ord` is not satisfied - --> $DIR/range_traits-1.rs:17:5 + --> $DIR/range_traits-1.rs:33:5 | LL | e: RangeInclusive<usize>, | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::cmp::Ord` is not implemented for `std::ops::RangeInclusive<usize>` @@ -93,13 +309,13 @@ LL | e: RangeInclusive<usize>, = note: required by `std::cmp::Ord::cmp` error[E0277]: the trait bound `std::ops::RangeToInclusive<usize>: std::cmp::Ord` is not satisfied - --> $DIR/range_traits-1.rs:20:5 + --> $DIR/range_traits-1.rs:40:5 | LL | f: RangeToInclusive<usize>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::cmp::Ord` is not implemented for `std::ops::RangeToInclusive<usize>` | = note: required by `std::cmp::Ord::cmp` -error: aborting due to 12 previous errors +error: aborting due to 36 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/raw-ref-op/raw-ref-op.rs b/src/test/ui/raw-ref-op/raw-ref-op.rs index de847909eb..0c6e23a00d 100644 --- a/src/test/ui/raw-ref-op/raw-ref-op.rs +++ b/src/test/ui/raw-ref-op/raw-ref-op.rs @@ -1,11 +1,11 @@ -// FIXME(#64490): make this run-pass +// run-pass #![feature(raw_ref_op)] fn main() { let mut x = 123; - let c_p = &raw const x; //~ ERROR not yet implemented - let m_p = &raw mut x; //~ ERROR not yet implemented + let c_p = &raw const x; + let m_p = &raw mut x; let i_r = &x; assert!(c_p == i_r); assert!(c_p == m_p); diff --git a/src/test/ui/raw-ref-op/raw-ref-op.stderr b/src/test/ui/raw-ref-op/raw-ref-op.stderr deleted file mode 100644 index 04c59c95fc..0000000000 --- a/src/test/ui/raw-ref-op/raw-ref-op.stderr +++ /dev/null @@ -1,18 +0,0 @@ -error: raw borrows are not yet implemented - --> $DIR/raw-ref-op.rs:7:15 - | -LL | let c_p = &raw const x; - | ^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/raw-ref-op.rs:8:15 - | -LL | let m_p = &raw mut x; - | ^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: aborting due to 2 previous errors - diff --git a/src/test/ui/raw-ref-op/raw-ref-temp-deref.rs b/src/test/ui/raw-ref-op/raw-ref-temp-deref.rs index d251586de5..a814003aeb 100644 --- a/src/test/ui/raw-ref-op/raw-ref-temp-deref.rs +++ b/src/test/ui/raw-ref-op/raw-ref-temp-deref.rs @@ -1,4 +1,4 @@ -// FIXME(#64490) This should be check-pass +// check-pass // Check that taking the address of a place that contains a dereference is // allowed. #![feature(raw_ref_op, type_ascription)] @@ -10,15 +10,15 @@ const SLICE_REF: &[i32] = &[5, 6]; fn main() { // These are all OK, we're not taking the address of the temporary - let deref_ref = &raw const *PAIR_REF; //~ ERROR not yet implemented - let field_deref_ref = &raw const PAIR_REF.0; //~ ERROR not yet implemented - let deref_ref = &raw const *ARRAY_REF; //~ ERROR not yet implemented - let index_deref_ref = &raw const ARRAY_REF[0]; //~ ERROR not yet implemented - let deref_ref = &raw const *SLICE_REF; //~ ERROR not yet implemented - let index_deref_ref = &raw const SLICE_REF[1]; //~ ERROR not yet implemented + let deref_ref = &raw const *PAIR_REF; + let field_deref_ref = &raw const PAIR_REF.0; + let deref_ref = &raw const *ARRAY_REF; + let index_deref_ref = &raw const ARRAY_REF[0]; + let deref_ref = &raw const *SLICE_REF; + let index_deref_ref = &raw const SLICE_REF[1]; let x = 0; - let ascribe_ref = &raw const (x: i32); //~ ERROR not yet implemented - let ascribe_deref = &raw const (*ARRAY_REF: [i32; 2]); //~ ERROR not yet implemented - let ascribe_index_deref = &raw const (ARRAY_REF[0]: i32); //~ ERROR not yet implemented + let ascribe_ref = &raw const (x: i32); + let ascribe_deref = &raw const (*ARRAY_REF: [i32; 2]); + let ascribe_index_deref = &raw const (ARRAY_REF[0]: i32); } diff --git a/src/test/ui/raw-ref-op/raw-ref-temp-deref.stderr b/src/test/ui/raw-ref-op/raw-ref-temp-deref.stderr deleted file mode 100644 index b0bfc74903..0000000000 --- a/src/test/ui/raw-ref-op/raw-ref-temp-deref.stderr +++ /dev/null @@ -1,74 +0,0 @@ -error: raw borrows are not yet implemented - --> $DIR/raw-ref-temp-deref.rs:13:21 - | -LL | let deref_ref = &raw const *PAIR_REF; - | ^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/raw-ref-temp-deref.rs:14:27 - | -LL | let field_deref_ref = &raw const PAIR_REF.0; - | ^^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/raw-ref-temp-deref.rs:15:21 - | -LL | let deref_ref = &raw const *ARRAY_REF; - | ^^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/raw-ref-temp-deref.rs:16:27 - | -LL | let index_deref_ref = &raw const ARRAY_REF[0]; - | ^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/raw-ref-temp-deref.rs:17:21 - | -LL | let deref_ref = &raw const *SLICE_REF; - | ^^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/raw-ref-temp-deref.rs:18:27 - | -LL | let index_deref_ref = &raw const SLICE_REF[1]; - | ^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/raw-ref-temp-deref.rs:21:23 - | -LL | let ascribe_ref = &raw const (x: i32); - | ^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/raw-ref-temp-deref.rs:22:25 - | -LL | let ascribe_deref = &raw const (*ARRAY_REF: [i32; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/raw-ref-temp-deref.rs:23:31 - | -LL | let ascribe_index_deref = &raw const (ARRAY_REF[0]: i32); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: aborting due to 9 previous errors - diff --git a/src/test/ui/raw-ref-op/raw-ref-temp.rs b/src/test/ui/raw-ref-op/raw-ref-temp.rs index ac2445f049..32df56468d 100644 --- a/src/test/ui/raw-ref-op/raw-ref-temp.rs +++ b/src/test/ui/raw-ref-op/raw-ref-temp.rs @@ -1,6 +1,8 @@ // Ensure that we don't allow taking the address of temporary values #![feature(raw_ref_op, type_ascription)] +const FOUR: u64 = 4; + const PAIR: (i32, i64) = (1, 2); const ARRAY: [i32; 2] = [1, 2]; @@ -8,8 +10,8 @@ const ARRAY: [i32; 2] = [1, 2]; fn main() { let ref_expr = &raw const 2; //~ ERROR cannot take address let mut_ref_expr = &raw mut 3; //~ ERROR cannot take address - let ref_const = &raw const 4; //~ ERROR cannot take address - let mut_ref_const = &raw mut 5; //~ ERROR cannot take address + let ref_const = &raw const FOUR; //~ ERROR cannot take address + let mut_ref_const = &raw mut FOUR; //~ ERROR cannot take address let field_ref_expr = &raw const (1, 2).0; //~ ERROR cannot take address let mut_field_ref_expr = &raw mut (1, 2).0; //~ ERROR cannot take address diff --git a/src/test/ui/raw-ref-op/raw-ref-temp.stderr b/src/test/ui/raw-ref-op/raw-ref-temp.stderr index de07073373..80dea76d59 100644 --- a/src/test/ui/raw-ref-op/raw-ref-temp.stderr +++ b/src/test/ui/raw-ref-op/raw-ref-temp.stderr @@ -1,95 +1,95 @@ error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:9:31 + --> $DIR/raw-ref-temp.rs:11:31 | LL | let ref_expr = &raw const 2; | ^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:10:33 + --> $DIR/raw-ref-temp.rs:12:33 | LL | let mut_ref_expr = &raw mut 3; | ^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:11:32 + --> $DIR/raw-ref-temp.rs:13:32 | -LL | let ref_const = &raw const 4; - | ^ temporary value +LL | let ref_const = &raw const FOUR; + | ^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:12:34 + --> $DIR/raw-ref-temp.rs:14:34 | -LL | let mut_ref_const = &raw mut 5; - | ^ temporary value +LL | let mut_ref_const = &raw mut FOUR; + | ^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:14:37 + --> $DIR/raw-ref-temp.rs:16:37 | LL | let field_ref_expr = &raw const (1, 2).0; | ^^^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:15:39 + --> $DIR/raw-ref-temp.rs:17:39 | LL | let mut_field_ref_expr = &raw mut (1, 2).0; | ^^^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:16:32 + --> $DIR/raw-ref-temp.rs:18:32 | LL | let field_ref = &raw const PAIR.0; | ^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:17:34 + --> $DIR/raw-ref-temp.rs:19:34 | LL | let mut_field_ref = &raw mut PAIR.0; | ^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:19:37 + --> $DIR/raw-ref-temp.rs:21:37 | LL | let index_ref_expr = &raw const [1, 2][0]; | ^^^^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:20:39 + --> $DIR/raw-ref-temp.rs:22:39 | LL | let mut_index_ref_expr = &raw mut [1, 2][0]; | ^^^^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:21:32 + --> $DIR/raw-ref-temp.rs:23:32 | LL | let index_ref = &raw const ARRAY[0]; | ^^^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:22:34 + --> $DIR/raw-ref-temp.rs:24:34 | LL | let mut_index_ref = &raw mut ARRAY[1]; | ^^^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:24:34 + --> $DIR/raw-ref-temp.rs:26:34 | LL | let ref_ascribe = &raw const (2: i32); | ^^^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:25:36 + --> $DIR/raw-ref-temp.rs:27:36 | LL | let mut_ref_ascribe = &raw mut (3: i32); | ^^^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:27:40 + --> $DIR/raw-ref-temp.rs:29:40 | LL | let ascribe_field_ref = &raw const (PAIR.0: i32); | ^^^^^^^^^^^^^ temporary value error[E0745]: cannot take address of a temporary - --> $DIR/raw-ref-temp.rs:28:38 + --> $DIR/raw-ref-temp.rs:30:38 | LL | let ascribe_index_ref = &raw mut (ARRAY[0]: i32); | ^^^^^^^^^^^^^^^ temporary value diff --git a/src/test/ui/raw-ref-op/unusual_locations.rs b/src/test/ui/raw-ref-op/unusual_locations.rs index f0a6bcce2a..6bf37408a8 100644 --- a/src/test/ui/raw-ref-op/unusual_locations.rs +++ b/src/test/ui/raw-ref-op/unusual_locations.rs @@ -1,25 +1,22 @@ -// FIXME(#64490): make this check-pass +// check-pass #![feature(raw_ref_op)] -const USES_PTR: () = { let u = (); &raw const u; }; //~ ERROR not yet implemented -static ALSO_USES_PTR: () = { let u = (); &raw const u; }; //~ ERROR not yet implemented +const USES_PTR: () = { let u = (); &raw const u; }; +static ALSO_USES_PTR: () = { let u = (); &raw const u; }; fn main() { - #[cfg(FALSE)] - { - let x: [i32; { let u = 2; let x = &raw const u; 4 }] - = [2; { let v = 3; let y = &raw const v; 4 }]; - let mut one = 1; - let two = 2; - if &raw const one == &raw mut one { - match &raw const two { - _ => {} - } + let x: [i32; { let u = 2; let x = &raw const u; 4 }] + = [2; { let v = 3; let y = &raw const v; 4 }]; + let mut one = 1; + let two = 2; + if &raw const one == &raw mut one { + match &raw const two { + _ => {} } - let three = 3; - let mut four = 4; - println!("{:p}", &raw const three); - unsafe { &raw mut four; } } + let three = 3; + let mut four = 4; + println!("{:p}", &raw const three); + unsafe { &raw mut four; } } diff --git a/src/test/ui/raw-ref-op/unusual_locations.stderr b/src/test/ui/raw-ref-op/unusual_locations.stderr deleted file mode 100644 index 3fae5db3d5..0000000000 --- a/src/test/ui/raw-ref-op/unusual_locations.stderr +++ /dev/null @@ -1,18 +0,0 @@ -error: raw borrows are not yet implemented - --> $DIR/unusual_locations.rs:5:36 - | -LL | const USES_PTR: () = { let u = (); &raw const u; }; - | ^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: raw borrows are not yet implemented - --> $DIR/unusual_locations.rs:6:42 - | -LL | static ALSO_USES_PTR: () = { let u = (); &raw const u; }; - | ^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/64490 - -error: aborting due to 2 previous errors - diff --git a/src/test/ui/reachable/unreachable-variant.stderr b/src/test/ui/reachable/unreachable-variant.stderr index 276c77f9b4..c2e1d774e2 100644 --- a/src/test/ui/reachable/unreachable-variant.stderr +++ b/src/test/ui/reachable/unreachable-variant.stderr @@ -2,7 +2,13 @@ error[E0603]: module `super_sekrit` is private --> $DIR/unreachable-variant.rs:6:21 | LL | let _x = other::super_sekrit::sooper_sekrit::baz; - | ^^^^^^^^^^^^ + | ^^^^^^^^^^^^ this module is private + | +note: the module `super_sekrit` is defined here + --> $DIR/auxiliary/unreachable_variant.rs:1:1 + | +LL | mod super_sekrit { + | ^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-26548.rs b/src/test/ui/recursion/issue-26548-recursion-via-normalize.rs similarity index 95% rename from src/test/ui/issues/issue-26548.rs rename to src/test/ui/recursion/issue-26548-recursion-via-normalize.rs index 5b6c77d0bd..6ee8c0fcfd 100644 --- a/src/test/ui/issues/issue-26548.rs +++ b/src/test/ui/recursion/issue-26548-recursion-via-normalize.rs @@ -2,6 +2,8 @@ //~| NOTE ...which requires computing layout of //~| NOTE ...which again requires computing layout of +// build-fail + trait Mirror { type It: ?Sized; } impl<T: ?Sized> Mirror for T { type It = Self; } struct S(Option<<S as Mirror>::It>); diff --git a/src/test/ui/issues/issue-26548.stderr b/src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr similarity index 88% rename from src/test/ui/issues/issue-26548.stderr rename to src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr index 7c1789cc1e..6a83f91ce5 100644 --- a/src/test/ui/issues/issue-26548.stderr +++ b/src/test/ui/recursion/issue-26548-recursion-via-normalize.stderr @@ -3,7 +3,7 @@ error[E0391]: cycle detected when computing layout of `std::option::Option<S>` = note: ...which requires computing layout of `S`... = note: ...which again requires computing layout of `std::option::Option<S>`, completing the cycle note: cycle used when processing `main` - --> $DIR/issue-26548.rs:9:1 + --> $DIR/issue-26548-recursion-via-normalize.rs:11:1 | LL | fn main() { | ^^^^^^^^^ diff --git a/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.rs b/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.rs new file mode 100644 index 0000000000..d9996b80ac --- /dev/null +++ b/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.rs @@ -0,0 +1,17 @@ +// Dropck shouldn't hit a recursion limit from checking `S<u32>` since it has +// no free regions or type parameters. +// Codegen however, has to error for the infinitely many `drop_in_place` +// functions it has been asked to create. +// build-fail + +struct S<T> { + t: T, + s: Box<S<fn(u: T)>>, +} + +fn f(x: S<u32>) {} + +fn main() { + // Force instantiation. + f as fn(_); +} diff --git a/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr b/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr new file mode 100644 index 0000000000..de6df4cd02 --- /dev/null +++ b/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr @@ -0,0 +1,4 @@ +error: reached the recursion limit while instantiating `std::intrinsics::drop_in_place::<S<fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(u32))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))>> - shim(Some(S<fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(u32))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))>))` + +error: aborting due to previous error + diff --git a/src/test/ui/recursion/recursion.rs b/src/test/ui/recursion/recursion.rs index ba3cc33dc3..9d939e1318 100644 --- a/src/test/ui/recursion/recursion.rs +++ b/src/test/ui/recursion/recursion.rs @@ -1,3 +1,5 @@ +// build-fail + enum Nil {NilValue} struct Cons<T> {head:isize, tail:T} trait Dot {fn dot(&self, other:Self) -> isize;} diff --git a/src/test/ui/recursion/recursion.stderr b/src/test/ui/recursion/recursion.stderr index 751d56b70f..17293720a4 100644 --- a/src/test/ui/recursion/recursion.stderr +++ b/src/test/ui/recursion/recursion.stderr @@ -1,5 +1,5 @@ error: reached the recursion limit while instantiating `test::<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Nil>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>` - --> $DIR/recursion.rs:12:1 + --> $DIR/recursion.rs:14:1 | LL | / fn test<T:Dot> (n:isize, i:isize, first:T, second:T) ->isize { LL | | match n { 0 => {first.dot(second)} diff --git a/src/test/ui/regions/region-invariant-static-error-reporting.stderr b/src/test/ui/regions/region-invariant-static-error-reporting.stderr index 381bad4210..750cc3566e 100644 --- a/src/test/ui/regions/region-invariant-static-error-reporting.stderr +++ b/src/test/ui/regions/region-invariant-static-error-reporting.stderr @@ -1,4 +1,4 @@ -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/region-invariant-static-error-reporting.rs:17:9 | LL | let bad = if x.is_some() { @@ -9,7 +9,7 @@ LL | | } else { LL | | mk_static() | | ^^^^^^^^^^^ lifetime mismatch LL | | }; - | |_____- if and else have incompatible types + | |_____- `if` and `else` have incompatible types | = note: expected struct `Invariant<'a>` found struct `Invariant<'static>` diff --git a/src/test/ui/regions/regions-bounded-by-trait-requiring-static.stderr b/src/test/ui/regions/regions-bounded-by-trait-requiring-static.stderr index fcd7332cf3..c72d6483c2 100644 --- a/src/test/ui/regions/regions-bounded-by-trait-requiring-static.stderr +++ b/src/test/ui/regions/regions-bounded-by-trait-requiring-static.stderr @@ -48,3 +48,4 @@ LL | assert_send::<*mut &'a isize>(); error: aborting due to 6 previous errors +For more information about this error, try `rustc --explain E0477`. diff --git a/src/test/ui/regions/regions-bounded-method-type-parameters.stderr b/src/test/ui/regions/regions-bounded-method-type-parameters.stderr index f77f97f44f..66b61b1349 100644 --- a/src/test/ui/regions/regions-bounded-method-type-parameters.stderr +++ b/src/test/ui/regions/regions-bounded-method-type-parameters.stderr @@ -8,3 +8,4 @@ LL | Foo.some_method::<&'a isize>(); error: aborting due to previous error +For more information about this error, try `rustc --explain E0477`. diff --git a/src/test/ui/regions/regions-close-object-into-object-5.rs b/src/test/ui/regions/regions-close-object-into-object-5.rs index 609c8ce279..2921a2bb39 100644 --- a/src/test/ui/regions/regions-close-object-into-object-5.rs +++ b/src/test/ui/regions/regions-close-object-into-object-5.rs @@ -21,6 +21,7 @@ fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> { //~| ERROR the parameter type `T` may not live long enough //~| ERROR the parameter type `T` may not live long enough //~| ERROR the parameter type `T` may not live long enough + //~| ERROR the parameter type `T` may not live long enough } fn main() {} diff --git a/src/test/ui/regions/regions-close-object-into-object-5.stderr b/src/test/ui/regions/regions-close-object-into-object-5.stderr index 01975d40fd..7c530cec7c 100644 --- a/src/test/ui/regions/regions-close-object-into-object-5.stderr +++ b/src/test/ui/regions/regions-close-object-into-object-5.stderr @@ -88,6 +88,21 @@ note: ...so that the type `(dyn A<T> + 'static)` is not borrowed for too long LL | box B(&*v) as Box<X> | ^^^ -error: aborting due to 6 previous errors +error[E0310]: the parameter type `T` may not live long enough + --> $DIR/regions-close-object-into-object-5.rs:17:11 + | +LL | fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> { + | - help: consider adding an explicit lifetime bound `T: 'static`... +LL | // oh dear! +LL | box B(&*v) as Box<X> + | ^^^ + | +note: ...so that the type `(dyn A<T> + 'static)` is not borrowed for too long + --> $DIR/regions-close-object-into-object-5.rs:17:11 + | +LL | box B(&*v) as Box<X> + | ^^^ + +error: aborting due to 7 previous errors For more information about this error, try `rustc --explain E0310`. diff --git a/src/test/ui/regions/regions-in-enums-anon.stderr b/src/test/ui/regions/regions-in-enums-anon.stderr index ae06e7653d..41655a210b 100644 --- a/src/test/ui/regions/regions-in-enums-anon.stderr +++ b/src/test/ui/regions/regions-in-enums-anon.stderr @@ -2,7 +2,13 @@ error[E0106]: missing lifetime specifier --> $DIR/regions-in-enums-anon.rs:4:9 | LL | Bar(&isize) - | ^ expected lifetime parameter + | ^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | enum Foo<'lifetime> { +LL | Bar(&'lifetime isize) + | error: aborting due to previous error diff --git a/src/test/ui/regions/regions-in-enums.stderr b/src/test/ui/regions/regions-in-enums.stderr index cfed9feba4..6653765329 100644 --- a/src/test/ui/regions/regions-in-enums.stderr +++ b/src/test/ui/regions/regions-in-enums.stderr @@ -1,12 +1,16 @@ error[E0261]: use of undeclared lifetime name `'foo` --> $DIR/regions-in-enums.rs:13:9 | +LL | enum No0 { + | - help: consider introducing lifetime `'foo` here: `<'foo>` LL | X5(&'foo usize) | ^^^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-in-enums.rs:17:9 | +LL | enum No1 { + | - help: consider introducing lifetime `'a` here: `<'a>` LL | X6(&'a usize) | ^^ undeclared lifetime diff --git a/src/test/ui/regions/regions-in-structs-anon.stderr b/src/test/ui/regions/regions-in-structs-anon.stderr index a1d4ebb597..fbe8036880 100644 --- a/src/test/ui/regions/regions-in-structs-anon.stderr +++ b/src/test/ui/regions/regions-in-structs-anon.stderr @@ -2,7 +2,13 @@ error[E0106]: missing lifetime specifier --> $DIR/regions-in-structs-anon.rs:4:8 | LL | x: &isize - | ^ expected lifetime parameter + | ^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | struct Foo<'lifetime> { +LL | x: &'lifetime isize + | error: aborting due to previous error diff --git a/src/test/ui/regions/regions-in-structs.stderr b/src/test/ui/regions/regions-in-structs.stderr index 8314942759..5dfdc2ee93 100644 --- a/src/test/ui/regions/regions-in-structs.stderr +++ b/src/test/ui/regions/regions-in-structs.stderr @@ -1,12 +1,17 @@ error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-in-structs.rs:10:9 | +LL | struct StructDecl { + | - help: consider introducing lifetime `'a` here: `<'a>` LL | a: &'a isize, | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-in-structs.rs:11:9 | +LL | struct StructDecl { + | - help: consider introducing lifetime `'a` here: `<'a>` +LL | a: &'a isize, LL | b: &'a isize, | ^^ undeclared lifetime diff --git a/src/test/ui/regions/regions-name-undeclared.stderr b/src/test/ui/regions/regions-name-undeclared.stderr index 5f6a48a35f..79ebef41dc 100644 --- a/src/test/ui/regions/regions-name-undeclared.stderr +++ b/src/test/ui/regions/regions-name-undeclared.stderr @@ -3,34 +3,67 @@ error[E0261]: use of undeclared lifetime name `'b` | LL | fn m4(&self, arg: &'b isize) { } | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | impl<'b, 'a> Foo<'a> { + | ^^^ +help: consider introducing lifetime `'b` here + | +LL | fn m4<'b>(&self, arg: &'b isize) { } + | ^^^^ error[E0261]: use of undeclared lifetime name `'b` --> $DIR/regions-name-undeclared.rs:16:12 | LL | fn m5(&'b self) { } | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | impl<'b, 'a> Foo<'a> { + | ^^^ +help: consider introducing lifetime `'b` here + | +LL | fn m5<'b>(&'b self) { } + | ^^^^ error[E0261]: use of undeclared lifetime name `'b` --> $DIR/regions-name-undeclared.rs:17:27 | LL | fn m6(&self, arg: Foo<'b>) { } | ^^ undeclared lifetime + | +help: consider introducing lifetime `'b` here + | +LL | impl<'b, 'a> Foo<'a> { + | ^^^ +help: consider introducing lifetime `'b` here + | +LL | fn m6<'b>(&self, arg: Foo<'b>) { } + | ^^^^ error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-name-undeclared.rs:25:22 | LL | type X = Option<&'a isize>; - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'a` here: `<'a>` error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-name-undeclared.rs:27:13 | +LL | enum E { + | - help: consider introducing lifetime `'a` here: `<'a>` LL | E1(&'a isize) | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-name-undeclared.rs:30:13 | +LL | struct S { + | - help: consider introducing lifetime `'a` here: `<'a>` LL | f: &'a isize | ^^ undeclared lifetime @@ -38,13 +71,17 @@ error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-name-undeclared.rs:32:14 | LL | fn f(a: &'a isize) { } - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'a` here: `<'a>` error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-name-undeclared.rs:40:17 | LL | fn fn_types(a: &'a isize, - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'a` here: `<'a>` error[E0261]: use of undeclared lifetime name `'b` --> $DIR/regions-name-undeclared.rs:42:36 @@ -61,6 +98,9 @@ LL | ... &'b isize)>, error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-name-undeclared.rs:46:17 | +LL | fn fn_types(a: &'a isize, + | - help: consider introducing lifetime `'a` here: `<'a>` +... LL | c: &'a isize) | ^^ undeclared lifetime diff --git a/src/test/ui/regions/regions-normalize-in-where-clause-list.rs b/src/test/ui/regions/regions-normalize-in-where-clause-list.rs index e94e8b25d6..e912805d85 100644 --- a/src/test/ui/regions/regions-normalize-in-where-clause-list.rs +++ b/src/test/ui/regions/regions-normalize-in-where-clause-list.rs @@ -20,6 +20,8 @@ fn foo<'a: 'b, 'b>() // Here we get an error: we need `'a: 'b`. fn bar<'a, 'b>() //~ ERROR cannot infer + //~| ERROR cannot infer + //~| ERROR cannot infer where <() as Project<'a, 'b>>::Item : Eq { } diff --git a/src/test/ui/regions/regions-normalize-in-where-clause-list.stderr b/src/test/ui/regions/regions-normalize-in-where-clause-list.stderr index 8a600d2a1e..cc2245f81a 100644 --- a/src/test/ui/regions/regions-normalize-in-where-clause-list.stderr +++ b/src/test/ui/regions/regions-normalize-in-where-clause-list.stderr @@ -2,6 +2,8 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` d --> $DIR/regions-normalize-in-where-clause-list.rs:22:1 | LL | / fn bar<'a, 'b>() +LL | | +LL | | LL | | where <() as Project<'a, 'b>>::Item : Eq LL | | { LL | | } @@ -21,6 +23,8 @@ note: ...so that the types are compatible --> $DIR/regions-normalize-in-where-clause-list.rs:22:1 | LL | / fn bar<'a, 'b>() +LL | | +LL | | LL | | where <() as Project<'a, 'b>>::Item : Eq LL | | { LL | | } @@ -28,6 +32,74 @@ LL | | } = note: expected `Project<'a, 'b>` found `Project<'_, '_>` -error: aborting due to previous error +error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements + --> $DIR/regions-normalize-in-where-clause-list.rs:22:1 + | +LL | / fn bar<'a, 'b>() +LL | | +LL | | +LL | | where <() as Project<'a, 'b>>::Item : Eq +LL | | { +LL | | } + | |_^ + | +note: first, the lifetime cannot outlive the lifetime `'a` as defined on the function body at 22:8... + --> $DIR/regions-normalize-in-where-clause-list.rs:22:8 + | +LL | fn bar<'a, 'b>() + | ^^ +note: ...but the lifetime must also be valid for the lifetime `'b` as defined on the function body at 22:12... + --> $DIR/regions-normalize-in-where-clause-list.rs:22:12 + | +LL | fn bar<'a, 'b>() + | ^^ +note: ...so that the types are compatible + --> $DIR/regions-normalize-in-where-clause-list.rs:22:1 + | +LL | / fn bar<'a, 'b>() +LL | | +LL | | +LL | | where <() as Project<'a, 'b>>::Item : Eq +LL | | { +LL | | } + | |_^ + = note: expected `Project<'a, 'b>` + found `Project<'_, '_>` + +error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements + --> $DIR/regions-normalize-in-where-clause-list.rs:22:1 + | +LL | / fn bar<'a, 'b>() +LL | | +LL | | +LL | | where <() as Project<'a, 'b>>::Item : Eq +LL | | { +LL | | } + | |_^ + | +note: first, the lifetime cannot outlive the lifetime `'a` as defined on the function body at 22:8... + --> $DIR/regions-normalize-in-where-clause-list.rs:22:8 + | +LL | fn bar<'a, 'b>() + | ^^ +note: ...but the lifetime must also be valid for the lifetime `'b` as defined on the function body at 22:12... + --> $DIR/regions-normalize-in-where-clause-list.rs:22:12 + | +LL | fn bar<'a, 'b>() + | ^^ +note: ...so that the types are compatible + --> $DIR/regions-normalize-in-where-clause-list.rs:22:1 + | +LL | / fn bar<'a, 'b>() +LL | | +LL | | +LL | | where <() as Project<'a, 'b>>::Item : Eq +LL | | { +LL | | } + | |_^ + = note: expected `Project<'a, 'b>` + found `Project<'_, '_>` + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0495`. diff --git a/src/test/ui/regions/regions-undeclared.stderr b/src/test/ui/regions/regions-undeclared.stderr index 495aec3fde..6bfde5524a 100644 --- a/src/test/ui/regions/regions-undeclared.stderr +++ b/src/test/ui/regions/regions-undeclared.stderr @@ -7,12 +7,17 @@ LL | static c_x: &'blk isize = &22; error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-undeclared.rs:4:10 | +LL | enum EnumDecl { + | - help: consider introducing lifetime `'a` here: `<'a>` LL | Foo(&'a isize), | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-undeclared.rs:5:10 | +LL | enum EnumDecl { + | - help: consider introducing lifetime `'a` here: `<'a>` +LL | Foo(&'a isize), LL | Bar(&'a isize), | ^^ undeclared lifetime @@ -20,11 +25,15 @@ error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-undeclared.rs:8:15 | LL | fn fnDecl(x: &'a isize, - | ^^ undeclared lifetime + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'a` here: `<'a>` error[E0261]: use of undeclared lifetime name `'a` --> $DIR/regions-undeclared.rs:9:15 | +LL | fn fnDecl(x: &'a isize, + | - help: consider introducing lifetime `'a` here: `<'a>` LL | y: &'a isize) | ^^ undeclared lifetime diff --git a/src/test/ui/reject-specialized-drops-8142.rs b/src/test/ui/reject-specialized-drops-8142.rs index 655b42f5f8..c4671736d7 100644 --- a/src/test/ui/reject-specialized-drops-8142.rs +++ b/src/test/ui/reject-specialized-drops-8142.rs @@ -1,5 +1,5 @@ // Issue 8142: Test that Drop impls cannot be specialized beyond the -// predicates attached to the struct/enum definition itself. +// predicates attached to the type definition itself. trait Bound { fn foo(&self) { } } struct K<'l1,'l2> { x: &'l1 i8, y: &'l2 u8 } @@ -16,12 +16,16 @@ struct U; struct V<Tva, Tvb> { x: *const Tva, y: *const Tvb } struct W<'l1, 'l2> { x: &'l1 i8, y: &'l2 u8 } +enum Enum<T> { Variant(T) } +struct TupleStruct<T>(T); +union Union<T: Copy> { f: T } + impl<'al,'adds_bnd:'al> Drop for K<'al,'adds_bnd> { // REJECT - //~^ ERROR The requirement `'adds_bnd : 'al` is added only by the Drop impl. + //~^ ERROR `Drop` impl requires `'adds_bnd: 'al` fn drop(&mut self) { } } impl<'al,'adds_bnd> Drop for L<'al,'adds_bnd> where 'adds_bnd:'al { // REJECT - //~^ ERROR The requirement `'adds_bnd : 'al` is added only by the Drop impl. + //~^ ERROR `Drop` impl requires `'adds_bnd: 'al` fn drop(&mut self) { } } impl<'ml> Drop for M<'ml> { fn drop(&mut self) { } } // ACCEPT @@ -34,13 +38,13 @@ impl Drop for N<'static> { fn drop(&mut self) { } } // RE impl<COkNoBound> Drop for O<COkNoBound> { fn drop(&mut self) { } } // ACCEPT impl Drop for P<i8> { fn drop(&mut self) { } } // REJECT -//~^ ERROR Implementations of Drop cannot be specialized +//~^ ERROR `Drop` impls cannot be specialized impl<AddsBnd:Bound> Drop for Q<AddsBnd> { fn drop(&mut self) { } } // REJECT -//~^ ERROR The requirement `AddsBnd: Bound` is added only by the Drop impl. +//~^ ERROR `Drop` impl requires `AddsBnd: Bound` impl<'rbnd,AddsRBnd:'rbnd> Drop for R<AddsRBnd> { fn drop(&mut self) { } } // REJECT -//~^ ERROR The requirement `AddsRBnd : 'rbnd` is added only by the Drop impl. +//~^ ERROR `Drop` impl requires `AddsRBnd: 'rbnd` impl<Bs:Bound> Drop for S<Bs> { fn drop(&mut self) { } } // ACCEPT @@ -49,9 +53,18 @@ impl<'t,Bt:'t> Drop for T<'t,Bt> { fn drop(&mut self) { } } // ACCEPT impl Drop for U { fn drop(&mut self) { } } // ACCEPT impl<One> Drop for V<One,One> { fn drop(&mut self) { } } // REJECT -//~^ ERROR Implementations of Drop cannot be specialized +//~^ ERROR `Drop` impls cannot be specialized impl<'lw> Drop for W<'lw,'lw> { fn drop(&mut self) { } } // REJECT //~^ ERROR cannot infer an appropriate lifetime for lifetime parameter `'lw` +impl<AddsBnd:Bound> Drop for Enum<AddsBnd> { fn drop(&mut self) { } } // REJECT +//~^ ERROR `Drop` impl requires `AddsBnd: Bound` + +impl<AddsBnd:Bound> Drop for TupleStruct<AddsBnd> { fn drop(&mut self) { } } // REJECT +//~^ ERROR `Drop` impl requires `AddsBnd: Bound` + +impl<AddsBnd:Copy + Bound> Drop for Union<AddsBnd> { fn drop(&mut self) { } } // REJECT +//~^ ERROR `Drop` impl requires `AddsBnd: Bound` + pub fn main() { } diff --git a/src/test/ui/reject-specialized-drops-8142.stderr b/src/test/ui/reject-specialized-drops-8142.stderr index 527babb012..c09418de51 100644 --- a/src/test/ui/reject-specialized-drops-8142.stderr +++ b/src/test/ui/reject-specialized-drops-8142.stderr @@ -1,33 +1,41 @@ -error[E0367]: The requirement `'adds_bnd : 'al` is added only by the Drop impl. - --> $DIR/reject-specialized-drops-8142.rs:19:1 +error[E0367]: `Drop` impl requires `AddsBnd: Bound` but the union it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:67:21 + | +LL | impl<AddsBnd:Copy + Bound> Drop for Union<AddsBnd> { fn drop(&mut self) { } } // REJECT + | ^^^^^ + | +note: the implementor must specify the same requirement + --> $DIR/reject-specialized-drops-8142.rs:21:1 + | +LL | union Union<T: Copy> { f: T } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0367]: `Drop` impl requires `'adds_bnd: 'al` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:23:20 | -LL | / impl<'al,'adds_bnd:'al> Drop for K<'al,'adds_bnd> { // REJECT -LL | | -LL | | fn drop(&mut self) { } } - | |____________________________^ +LL | impl<'al,'adds_bnd:'al> Drop for K<'al,'adds_bnd> { // REJECT + | ^^^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/reject-specialized-drops-8142.rs:5:1 | LL | struct K<'l1,'l2> { x: &'l1 i8, y: &'l2 u8 } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0367]: The requirement `'adds_bnd : 'al` is added only by the Drop impl. - --> $DIR/reject-specialized-drops-8142.rs:23:1 +error[E0367]: `Drop` impl requires `'adds_bnd: 'al` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:27:67 | -LL | / impl<'al,'adds_bnd> Drop for L<'al,'adds_bnd> where 'adds_bnd:'al { // REJECT -LL | | -LL | | fn drop(&mut self) { } } - | |____________________________^ +LL | impl<'al,'adds_bnd> Drop for L<'al,'adds_bnd> where 'adds_bnd:'al { // REJECT + | ^^^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/reject-specialized-drops-8142.rs:6:1 | LL | struct L<'l1,'l2> { x: &'l1 i8, y: &'l2 u8 } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0308]: mismatched types - --> $DIR/reject-specialized-drops-8142.rs:29:1 + --> $DIR/reject-specialized-drops-8142.rs:33:1 | LL | impl Drop for N<'static> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -41,56 +49,56 @@ LL | struct N<'n> { x: &'n i8 } | ^^ = note: ...does not necessarily outlive the static lifetime -error[E0366]: Implementations of Drop cannot be specialized - --> $DIR/reject-specialized-drops-8142.rs:36:1 +error[E0366]: `Drop` impls cannot be specialized + --> $DIR/reject-specialized-drops-8142.rs:40:1 | LL | impl Drop for P<i8> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -note: Use same sequence of generic type and region parameters that is on the struct/enum definition +note: use the same sequence of generic type, lifetime and const parameters as the struct definition --> $DIR/reject-specialized-drops-8142.rs:10:1 | LL | struct P<Tp> { x: *const Tp } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0367]: The requirement `AddsBnd: Bound` is added only by the Drop impl. - --> $DIR/reject-specialized-drops-8142.rs:39:1 +error[E0367]: `Drop` impl requires `AddsBnd: Bound` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:43:14 | LL | impl<AddsBnd:Bound> Drop for Q<AddsBnd> { fn drop(&mut self) { } } // REJECT - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/reject-specialized-drops-8142.rs:11:1 | LL | struct Q<Tq> { x: *const Tq } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0367]: The requirement `AddsRBnd : 'rbnd` is added only by the Drop impl. - --> $DIR/reject-specialized-drops-8142.rs:42:1 +error[E0367]: `Drop` impl requires `AddsRBnd: 'rbnd` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:46:21 | LL | impl<'rbnd,AddsRBnd:'rbnd> Drop for R<AddsRBnd> { fn drop(&mut self) { } } // REJECT - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^ | -note: The same requirement must be part of the struct/enum definition +note: the implementor must specify the same requirement --> $DIR/reject-specialized-drops-8142.rs:12:1 | LL | struct R<Tr> { x: *const Tr } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0366]: Implementations of Drop cannot be specialized - --> $DIR/reject-specialized-drops-8142.rs:51:1 +error[E0366]: `Drop` impls cannot be specialized + --> $DIR/reject-specialized-drops-8142.rs:55:1 | LL | impl<One> Drop for V<One,One> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -note: Use same sequence of generic type and region parameters that is on the struct/enum definition +note: use the same sequence of generic type, lifetime and const parameters as the struct definition --> $DIR/reject-specialized-drops-8142.rs:16:1 | LL | struct V<Tva, Tvb> { x: *const Tva, y: *const Tvb } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'lw` due to conflicting requirements - --> $DIR/reject-specialized-drops-8142.rs:54:1 + --> $DIR/reject-specialized-drops-8142.rs:58:1 | LL | impl<'lw> Drop for W<'lw,'lw> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -106,14 +114,38 @@ note: ...but the lifetime must also be valid for the lifetime `'l2` as defined o LL | struct W<'l1, 'l2> { x: &'l1 i8, y: &'l2 u8 } | ^^^ note: ...so that the types are compatible - --> $DIR/reject-specialized-drops-8142.rs:54:1 + --> $DIR/reject-specialized-drops-8142.rs:58:1 | LL | impl<'lw> Drop for W<'lw,'lw> { fn drop(&mut self) { } } // REJECT | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: expected `W<'l1, 'l2>` found `W<'_, '_>` -error: aborting due to 8 previous errors +error[E0367]: `Drop` impl requires `AddsBnd: Bound` but the enum it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:61:14 + | +LL | impl<AddsBnd:Bound> Drop for Enum<AddsBnd> { fn drop(&mut self) { } } // REJECT + | ^^^^^ + | +note: the implementor must specify the same requirement + --> $DIR/reject-specialized-drops-8142.rs:19:1 + | +LL | enum Enum<T> { Variant(T) } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0367]: `Drop` impl requires `AddsBnd: Bound` but the struct it is implemented for does not + --> $DIR/reject-specialized-drops-8142.rs:64:14 + | +LL | impl<AddsBnd:Bound> Drop for TupleStruct<AddsBnd> { fn drop(&mut self) { } } // REJECT + | ^^^^^ + | +note: the implementor must specify the same requirement + --> $DIR/reject-specialized-drops-8142.rs:20:1 + | +LL | struct TupleStruct<T>(T); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 11 previous errors Some errors have detailed explanations: E0308, E0366, E0367, E0495. For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/repr/repr-align-assign.fixed b/src/test/ui/repr/repr-align-assign.fixed index 2e1d9a2d32..59ca22e972 100644 --- a/src/test/ui/repr/repr-align-assign.fixed +++ b/src/test/ui/repr/repr-align-assign.fixed @@ -3,9 +3,11 @@ #![allow(dead_code)] #[repr(align(8))] //~ ERROR incorrect `repr(align)` attribute format + //~| ERROR incorrect `repr(align)` attribute format struct A(u64); #[repr(align(8))] //~ ERROR incorrect `repr(align)` attribute format + //~| ERROR incorrect `repr(align)` attribute format struct B(u64); fn main() {} diff --git a/src/test/ui/repr/repr-align-assign.rs b/src/test/ui/repr/repr-align-assign.rs index b8f7c15ded..6b7799297e 100644 --- a/src/test/ui/repr/repr-align-assign.rs +++ b/src/test/ui/repr/repr-align-assign.rs @@ -3,9 +3,11 @@ #![allow(dead_code)] #[repr(align=8)] //~ ERROR incorrect `repr(align)` attribute format + //~| ERROR incorrect `repr(align)` attribute format struct A(u64); #[repr(align="8")] //~ ERROR incorrect `repr(align)` attribute format + //~| ERROR incorrect `repr(align)` attribute format struct B(u64); fn main() {} diff --git a/src/test/ui/repr/repr-align-assign.stderr b/src/test/ui/repr/repr-align-assign.stderr index 177bd81e8f..192312d165 100644 --- a/src/test/ui/repr/repr-align-assign.stderr +++ b/src/test/ui/repr/repr-align-assign.stderr @@ -5,10 +5,22 @@ LL | #[repr(align=8)] | ^^^^^^^ help: use parentheses instead: `align(8)` error[E0693]: incorrect `repr(align)` attribute format - --> $DIR/repr-align-assign.rs:8:8 + --> $DIR/repr-align-assign.rs:9:8 | LL | #[repr(align="8")] | ^^^^^^^^^ help: use parentheses instead: `align(8)` -error: aborting due to 2 previous errors +error[E0693]: incorrect `repr(align)` attribute format + --> $DIR/repr-align-assign.rs:5:8 + | +LL | #[repr(align=8)] + | ^^^^^^^ help: use parentheses instead: `align(8)` + +error[E0693]: incorrect `repr(align)` attribute format + --> $DIR/repr-align-assign.rs:9:8 + | +LL | #[repr(align="8")] + | ^^^^^^^^^ help: use parentheses instead: `align(8)` + +error: aborting due to 4 previous errors diff --git a/src/test/ui/repr/repr-align.rs b/src/test/ui/repr/repr-align.rs index bc6a9fe562..58ecf9a518 100644 --- a/src/test/ui/repr/repr-align.rs +++ b/src/test/ui/repr/repr-align.rs @@ -1,24 +1,30 @@ #![allow(dead_code)] #[repr(align(16.0))] //~ ERROR: invalid `repr(align)` attribute: not an unsuffixed integer + //~| ERROR: invalid `repr(align)` attribute: not an unsuffixed integer struct S0(i32); #[repr(align(15))] //~ ERROR: invalid `repr(align)` attribute: not a power of two + //~| ERROR: invalid `repr(align)` attribute: not a power of two struct S1(i32); #[repr(align(4294967296))] //~ ERROR: invalid `repr(align)` attribute: larger than 2^29 + //~| ERROR: invalid `repr(align)` attribute: larger than 2^29 struct S2(i32); #[repr(align(536870912))] // ok: this is the largest accepted alignment struct S3(i32); #[repr(align(16.0))] //~ ERROR: invalid `repr(align)` attribute: not an unsuffixed integer + //~| ERROR: invalid `repr(align)` attribute: not an unsuffixed integer enum E0 { A, B } #[repr(align(15))] //~ ERROR: invalid `repr(align)` attribute: not a power of two + //~| ERROR: invalid `repr(align)` attribute: not a power of two enum E1 { A, B } #[repr(align(4294967296))] //~ ERROR: invalid `repr(align)` attribute: larger than 2^29 + //~| ERROR: invalid `repr(align)` attribute: larger than 2^29 enum E2 { A, B } #[repr(align(536870912))] // ok: this is the largest accepted alignment diff --git a/src/test/ui/repr/repr-align.stderr b/src/test/ui/repr/repr-align.stderr index 280cab2b4a..900a811bb8 100644 --- a/src/test/ui/repr/repr-align.stderr +++ b/src/test/ui/repr/repr-align.stderr @@ -5,35 +5,71 @@ LL | #[repr(align(16.0))] | ^^^^^^^^^^^ error[E0589]: invalid `repr(align)` attribute: not a power of two - --> $DIR/repr-align.rs:6:8 + --> $DIR/repr-align.rs:7:8 | LL | #[repr(align(15))] | ^^^^^^^^^ error[E0589]: invalid `repr(align)` attribute: larger than 2^29 - --> $DIR/repr-align.rs:9:8 + --> $DIR/repr-align.rs:11:8 | LL | #[repr(align(4294967296))] | ^^^^^^^^^^^^^^^^^ error[E0589]: invalid `repr(align)` attribute: not an unsuffixed integer - --> $DIR/repr-align.rs:15:8 + --> $DIR/repr-align.rs:18:8 + | +LL | #[repr(align(16.0))] + | ^^^^^^^^^^^ + +error[E0589]: invalid `repr(align)` attribute: not a power of two + --> $DIR/repr-align.rs:22:8 + | +LL | #[repr(align(15))] + | ^^^^^^^^^ + +error[E0589]: invalid `repr(align)` attribute: larger than 2^29 + --> $DIR/repr-align.rs:26:8 + | +LL | #[repr(align(4294967296))] + | ^^^^^^^^^^^^^^^^^ + +error[E0589]: invalid `repr(align)` attribute: not an unsuffixed integer + --> $DIR/repr-align.rs:3:8 | LL | #[repr(align(16.0))] | ^^^^^^^^^^^ error[E0589]: invalid `repr(align)` attribute: not a power of two + --> $DIR/repr-align.rs:7:8 + | +LL | #[repr(align(15))] + | ^^^^^^^^^ + +error[E0589]: invalid `repr(align)` attribute: larger than 2^29 + --> $DIR/repr-align.rs:11:8 + | +LL | #[repr(align(4294967296))] + | ^^^^^^^^^^^^^^^^^ + +error[E0589]: invalid `repr(align)` attribute: not an unsuffixed integer --> $DIR/repr-align.rs:18:8 | +LL | #[repr(align(16.0))] + | ^^^^^^^^^^^ + +error[E0589]: invalid `repr(align)` attribute: not a power of two + --> $DIR/repr-align.rs:22:8 + | LL | #[repr(align(15))] | ^^^^^^^^^ error[E0589]: invalid `repr(align)` attribute: larger than 2^29 - --> $DIR/repr-align.rs:21:8 + --> $DIR/repr-align.rs:26:8 | LL | #[repr(align(4294967296))] | ^^^^^^^^^^^^^^^^^ -error: aborting due to 6 previous errors +error: aborting due to 12 previous errors For more information about this error, try `rustc --explain E0589`. diff --git a/src/test/ui/repr/repr-packed-contains-align.rs b/src/test/ui/repr/repr-packed-contains-align.rs index a361034517..67d87eb5cd 100644 --- a/src/test/ui/repr/repr-packed-contains-align.rs +++ b/src/test/ui/repr/repr-packed-contains-align.rs @@ -16,34 +16,34 @@ union UB { } #[repr(packed)] -struct SC(SA); //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type +struct SC(SA); //~ ERROR: packed type cannot transitively contain a `#[repr(align)]` type #[repr(packed)] -struct SD(SB); //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type +struct SD(SB); //~ ERROR: packed type cannot transitively contain a `#[repr(align)]` type #[repr(packed)] -struct SE(UA); //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type +struct SE(UA); //~ ERROR: packed type cannot transitively contain a `#[repr(align)]` type #[repr(packed)] -struct SF(UB); //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type +struct SF(UB); //~ ERROR: packed type cannot transitively contain a `#[repr(align)]` type #[repr(packed)] -union UC { //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type +union UC { //~ ERROR: packed type cannot transitively contain a `#[repr(align)]` type a: UA } #[repr(packed)] -union UD { //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type +union UD { //~ ERROR: packed type cannot transitively contain a `#[repr(align)]` type n: UB } #[repr(packed)] -union UE { //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type +union UE { //~ ERROR: packed type cannot transitively contain a `#[repr(align)]` type a: SA } #[repr(packed)] -union UF { //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type +union UF { //~ ERROR: packed type cannot transitively contain a `#[repr(align)]` type n: SB } diff --git a/src/test/ui/repr/repr-packed-contains-align.stderr b/src/test/ui/repr/repr-packed-contains-align.stderr index df001d6b5f..32f9bb8bf3 100644 --- a/src/test/ui/repr/repr-packed-contains-align.stderr +++ b/src/test/ui/repr/repr-packed-contains-align.stderr @@ -1,58 +1,154 @@ -error[E0588]: packed type cannot transitively contain a `[repr(align)]` type +error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type --> $DIR/repr-packed-contains-align.rs:19:1 | LL | struct SC(SA); | ^^^^^^^^^^^^^^ + | +note: `SA` has a `#[repr(align)]` attribute + --> $DIR/repr-packed-contains-align.rs:5:1 + | +LL | struct SA(i32); + | ^^^^^^^^^^^^^^^ -error[E0588]: packed type cannot transitively contain a `[repr(align)]` type +error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type --> $DIR/repr-packed-contains-align.rs:22:1 | LL | struct SD(SB); | ^^^^^^^^^^^^^^ + | +note: `SA` has a `#[repr(align)]` attribute + --> $DIR/repr-packed-contains-align.rs:5:1 + | +LL | struct SA(i32); + | ^^^^^^^^^^^^^^^ +note: `SD` contains a field of type `SB` + --> $DIR/repr-packed-contains-align.rs:22:11 + | +LL | struct SD(SB); + | ^^ +note: ...which contains a field of type `SA` + --> $DIR/repr-packed-contains-align.rs:7:11 + | +LL | struct SB(SA); + | ^^ -error[E0588]: packed type cannot transitively contain a `[repr(align)]` type +error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type --> $DIR/repr-packed-contains-align.rs:25:1 | LL | struct SE(UA); | ^^^^^^^^^^^^^^ + | +note: `UA` has a `#[repr(align)]` attribute + --> $DIR/repr-packed-contains-align.rs:10:1 + | +LL | / union UA { +LL | | i: i32 +LL | | } + | |_^ -error[E0588]: packed type cannot transitively contain a `[repr(align)]` type +error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type --> $DIR/repr-packed-contains-align.rs:28:1 | LL | struct SF(UB); | ^^^^^^^^^^^^^^ + | +note: `UA` has a `#[repr(align)]` attribute + --> $DIR/repr-packed-contains-align.rs:10:1 + | +LL | / union UA { +LL | | i: i32 +LL | | } + | |_^ +note: `SF` contains a field of type `UB` + --> $DIR/repr-packed-contains-align.rs:28:11 + | +LL | struct SF(UB); + | ^^ +note: ...which contains a field of type `UA` + --> $DIR/repr-packed-contains-align.rs:15:5 + | +LL | a: UA + | ^ -error[E0588]: packed type cannot transitively contain a `[repr(align)]` type +error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type --> $DIR/repr-packed-contains-align.rs:31:1 | LL | / union UC { LL | | a: UA +LL | | } + | |_^ + | +note: `UA` has a `#[repr(align)]` attribute + --> $DIR/repr-packed-contains-align.rs:10:1 + | +LL | / union UA { +LL | | i: i32 LL | | } | |_^ -error[E0588]: packed type cannot transitively contain a `[repr(align)]` type +error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type --> $DIR/repr-packed-contains-align.rs:36:1 | LL | / union UD { LL | | n: UB LL | | } | |_^ + | +note: `UA` has a `#[repr(align)]` attribute + --> $DIR/repr-packed-contains-align.rs:10:1 + | +LL | / union UA { +LL | | i: i32 +LL | | } + | |_^ +note: `UD` contains a field of type `UB` + --> $DIR/repr-packed-contains-align.rs:37:5 + | +LL | n: UB + | ^ +note: ...which contains a field of type `UA` + --> $DIR/repr-packed-contains-align.rs:15:5 + | +LL | a: UA + | ^ -error[E0588]: packed type cannot transitively contain a `[repr(align)]` type +error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type --> $DIR/repr-packed-contains-align.rs:41:1 | LL | / union UE { LL | | a: SA LL | | } | |_^ + | +note: `SA` has a `#[repr(align)]` attribute + --> $DIR/repr-packed-contains-align.rs:5:1 + | +LL | struct SA(i32); + | ^^^^^^^^^^^^^^^ -error[E0588]: packed type cannot transitively contain a `[repr(align)]` type +error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type --> $DIR/repr-packed-contains-align.rs:46:1 | LL | / union UF { LL | | n: SB LL | | } | |_^ + | +note: `SA` has a `#[repr(align)]` attribute + --> $DIR/repr-packed-contains-align.rs:5:1 + | +LL | struct SA(i32); + | ^^^^^^^^^^^^^^^ +note: `UF` contains a field of type `SB` + --> $DIR/repr-packed-contains-align.rs:47:5 + | +LL | n: SB + | ^ +note: ...which contains a field of type `SA` + --> $DIR/repr-packed-contains-align.rs:7:11 + | +LL | struct SB(SA); + | ^^ error: aborting due to 8 previous errors diff --git a/src/test/ui/repr/repr-transparent.rs b/src/test/ui/repr/repr-transparent.rs index 730d428ff5..8fbdb4cc80 100644 --- a/src/test/ui/repr/repr-transparent.rs +++ b/src/test/ui/repr/repr-transparent.rs @@ -3,7 +3,7 @@ // - repr-transparent-other-reprs.rs // - repr-transparent-other-items.rs -#![feature(repr_align, transparent_enums, transparent_unions)] +#![feature(transparent_unions)] use std::marker::PhantomData; @@ -60,6 +60,16 @@ enum TooManyVariants { //~ ERROR transparent enum needs exactly one variant, but Bar, } +#[repr(transparent)] +enum NontrivialAlignZstEnum { + Foo(u32, [u16; 0]), //~ ERROR alignment larger than 1 +} + +#[repr(transparent)] +enum GenericAlignEnum<T> { + Foo { bar: ZstAlign32<T>, baz: u32 } //~ ERROR alignment larger than 1 +} + #[repr(transparent)] union UnitUnion { //~ ERROR transparent union needs exactly one non-zero-sized field, but has 0 u: (), diff --git a/src/test/ui/repr/repr-transparent.stderr b/src/test/ui/repr/repr-transparent.stderr index f0c1fbe8ac..cbc74fbb6a 100644 --- a/src/test/ui/repr/repr-transparent.stderr +++ b/src/test/ui/repr/repr-transparent.stderr @@ -94,14 +94,26 @@ LL | Foo(String), LL | Bar, | --- too many variants in `TooManyVariants` +error[E0691]: zero-sized field in transparent enum has alignment larger than 1 + --> $DIR/repr-transparent.rs:65:14 + | +LL | Foo(u32, [u16; 0]), + | ^^^^^^^^ has alignment larger than 1 + +error[E0691]: zero-sized field in transparent enum has alignment larger than 1 + --> $DIR/repr-transparent.rs:70:11 + | +LL | Foo { bar: ZstAlign32<T>, baz: u32 } + | ^^^^^^^^^^^^^^^^^^ has alignment larger than 1 + error[E0690]: transparent union needs exactly one non-zero-sized field, but has 0 - --> $DIR/repr-transparent.rs:64:1 + --> $DIR/repr-transparent.rs:74:1 | LL | union UnitUnion { | ^^^^^^^^^^^^^^^ needs exactly one non-zero-sized field, but has 0 error[E0690]: transparent union needs exactly one non-zero-sized field, but has 2 - --> $DIR/repr-transparent.rs:69:1 + --> $DIR/repr-transparent.rs:79:1 | LL | union TooManyFields { | ^^^^^^^^^^^^^^^^^^^ needs exactly one non-zero-sized field, but has 2 @@ -110,7 +122,7 @@ LL | u: u32, LL | s: i32 | ------ this field is non-zero-sized -error: aborting due to 15 previous errors +error: aborting due to 17 previous errors Some errors have detailed explanations: E0084, E0690, E0691, E0731. For more information about an error, try `rustc --explain E0084`. diff --git a/src/test/ui/required-lang-item.rs b/src/test/ui/required-lang-item.rs index ee3773675e..3b17c5b725 100644 --- a/src/test/ui/required-lang-item.rs +++ b/src/test/ui/required-lang-item.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(lang_items, no_core)] #![no_core] diff --git a/src/test/ui/resolve/impl-items-vis-unresolved.rs b/src/test/ui/resolve/impl-items-vis-unresolved.rs index 9b4fe49823..1494c1cf96 100644 --- a/src/test/ui/resolve/impl-items-vis-unresolved.rs +++ b/src/test/ui/resolve/impl-items-vis-unresolved.rs @@ -18,7 +18,8 @@ mod state { pub struct RawFloatState; impl RawFloatState { perftools_inline! { - pub(super) fn new() {} //~ ERROR failed to resolve: there are too many initial `super`s + pub(super) fn new() {} + //~^ ERROR failed to resolve: there are too many leading `super` keywords } } diff --git a/src/test/ui/resolve/impl-items-vis-unresolved.stderr b/src/test/ui/resolve/impl-items-vis-unresolved.stderr index 8e285e5312..f2293d28ea 100644 --- a/src/test/ui/resolve/impl-items-vis-unresolved.stderr +++ b/src/test/ui/resolve/impl-items-vis-unresolved.stderr @@ -1,8 +1,8 @@ -error[E0433]: failed to resolve: there are too many initial `super`s. +error[E0433]: failed to resolve: there are too many leading `super` keywords --> $DIR/impl-items-vis-unresolved.rs:21:13 | LL | pub(super) fn new() {} - | ^^^^^ there are too many initial `super`s. + | ^^^^^ there are too many leading `super` keywords error: aborting due to previous error diff --git a/src/test/ui/resolve/levenshtein.rs b/src/test/ui/resolve/levenshtein.rs index a6f4716256..6a98782a9b 100644 --- a/src/test/ui/resolve/levenshtein.rs +++ b/src/test/ui/resolve/levenshtein.rs @@ -1,3 +1,7 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl const MAX_ITEM: usize = 10; fn foo_bar() {} diff --git a/src/test/ui/resolve/levenshtein.stderr b/src/test/ui/resolve/levenshtein.stderr index 8d8f3f3521..a622d6cb34 100644 --- a/src/test/ui/resolve/levenshtein.stderr +++ b/src/test/ui/resolve/levenshtein.stderr @@ -1,11 +1,11 @@ error[E0412]: cannot find type `esize` in this scope - --> $DIR/levenshtein.rs:5:11 + --> $DIR/levenshtein.rs:9:11 | LL | fn foo(c: esize) {} // Misspelled primitive type name. | ^^^^^ help: a builtin type with a similar name exists: `isize` error[E0412]: cannot find type `Baz` in this scope - --> $DIR/levenshtein.rs:10:10 + --> $DIR/levenshtein.rs:14:10 | LL | enum Bar { } | ------------ similarly named enum `Bar` defined here @@ -14,19 +14,24 @@ LL | type A = Baz; // Misspelled type name. | ^^^ help: an enum with a similar name exists: `Bar` error[E0412]: cannot find type `Opiton` in this scope - --> $DIR/levenshtein.rs:12:10 + --> $DIR/levenshtein.rs:16:10 | LL | type B = Opiton<u8>; // Misspelled type name from the prelude. | ^^^^^^ help: an enum with a similar name exists: `Option` + | + ::: $SRC_DIR/libcore/option.rs:LL:COL + | +LL | pub enum Option<T> { + | ------------------ similarly named enum `Option` defined here error[E0412]: cannot find type `Baz` in this scope - --> $DIR/levenshtein.rs:16:14 + --> $DIR/levenshtein.rs:20:14 | LL | type A = Baz; // No suggestion here, Bar is not visible | ^^^ not found in this scope error[E0425]: cannot find value `MAXITEM` in this scope - --> $DIR/levenshtein.rs:24:20 + --> $DIR/levenshtein.rs:28:20 | LL | const MAX_ITEM: usize = 10; | --------------------------- similarly named constant `MAX_ITEM` defined here @@ -35,7 +40,7 @@ LL | let v = [0u32; MAXITEM]; // Misspelled constant name. | ^^^^^^^ help: a constant with a similar name exists: `MAX_ITEM` error[E0425]: cannot find function `foobar` in this scope - --> $DIR/levenshtein.rs:26:5 + --> $DIR/levenshtein.rs:30:5 | LL | fn foo_bar() {} | --------------- similarly named function `foo_bar` defined here @@ -44,7 +49,7 @@ LL | foobar(); // Misspelled function name. | ^^^^^^ help: a function with a similar name exists: `foo_bar` error[E0412]: cannot find type `first` in module `m` - --> $DIR/levenshtein.rs:28:15 + --> $DIR/levenshtein.rs:32:15 | LL | pub struct First; | ----------------- similarly named struct `First` defined here @@ -53,7 +58,7 @@ LL | let b: m::first = m::second; // Misspelled item in module. | ^^^^^ help: a struct with a similar name exists (notice the capitalization): `First` error[E0425]: cannot find value `second` in module `m` - --> $DIR/levenshtein.rs:28:26 + --> $DIR/levenshtein.rs:32:26 | LL | pub struct Second; | ------------------ similarly named unit struct `Second` defined here diff --git a/src/test/ui/resolve/privacy-enum-ctor.stderr b/src/test/ui/resolve/privacy-enum-ctor.stderr index 688720e8cd..08a1d79019 100644 --- a/src/test/ui/resolve/privacy-enum-ctor.stderr +++ b/src/test/ui/resolve/privacy-enum-ctor.stderr @@ -253,25 +253,49 @@ error[E0603]: enum `Z` is private --> $DIR/privacy-enum-ctor.rs:57:22 | LL | let _: Z = m::n::Z; - | ^ + | ^ this enum is private + | +note: the enum `Z` is defined here + --> $DIR/privacy-enum-ctor.rs:11:9 + | +LL | pub(in m) enum Z { + | ^^^^^^^^^^^^^^^^ error[E0603]: enum `Z` is private --> $DIR/privacy-enum-ctor.rs:61:22 | LL | let _: Z = m::n::Z::Fn; - | ^ + | ^ this enum is private + | +note: the enum `Z` is defined here + --> $DIR/privacy-enum-ctor.rs:11:9 + | +LL | pub(in m) enum Z { + | ^^^^^^^^^^^^^^^^ error[E0603]: enum `Z` is private --> $DIR/privacy-enum-ctor.rs:64:22 | LL | let _: Z = m::n::Z::Struct; - | ^ + | ^ this enum is private + | +note: the enum `Z` is defined here + --> $DIR/privacy-enum-ctor.rs:11:9 + | +LL | pub(in m) enum Z { + | ^^^^^^^^^^^^^^^^ error[E0603]: enum `Z` is private --> $DIR/privacy-enum-ctor.rs:68:22 | LL | let _: Z = m::n::Z::Unit {}; - | ^ + | ^ this enum is private + | +note: the enum `Z` is defined here + --> $DIR/privacy-enum-ctor.rs:11:9 + | +LL | pub(in m) enum Z { + | ^^^^^^^^^^^^^^^^ error[E0308]: mismatched types --> $DIR/privacy-enum-ctor.rs:27:20 diff --git a/src/test/ui/resolve/privacy-struct-ctor.stderr b/src/test/ui/resolve/privacy-struct-ctor.stderr index f1a1de4d9c..1673ec46ba 100644 --- a/src/test/ui/resolve/privacy-struct-ctor.stderr +++ b/src/test/ui/resolve/privacy-struct-ctor.stderr @@ -45,7 +45,13 @@ LL | pub(in m) struct Z(pub(in m::n) u8); | --------------- a constructor is private if any of the fields is private ... LL | n::Z; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `Z` is defined here + --> $DIR/privacy-struct-ctor.rs:12:9 + | +LL | pub(in m) struct Z(pub(in m::n) u8); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `S` is private --> $DIR/privacy-struct-ctor.rs:29:8 @@ -54,7 +60,13 @@ LL | pub struct S(u8); | -- a constructor is private if any of the fields is private ... LL | m::S; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `S` is defined here + --> $DIR/privacy-struct-ctor.rs:6:5 + | +LL | pub struct S(u8); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `S` is private --> $DIR/privacy-struct-ctor.rs:31:19 @@ -63,7 +75,13 @@ LL | pub struct S(u8); | -- a constructor is private if any of the fields is private ... LL | let _: S = m::S(2); - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `S` is defined here + --> $DIR/privacy-struct-ctor.rs:6:5 + | +LL | pub struct S(u8); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `Z` is private --> $DIR/privacy-struct-ctor.rs:35:11 @@ -72,29 +90,47 @@ LL | pub(in m) struct Z(pub(in m::n) u8); | --------------- a constructor is private if any of the fields is private ... LL | m::n::Z; - | ^ + | ^ this tuple struct constructor is private + | +note: the tuple struct constructor `Z` is defined here + --> $DIR/privacy-struct-ctor.rs:12:9 + | +LL | pub(in m) struct Z(pub(in m::n) u8); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `S` is private --> $DIR/privacy-struct-ctor.rs:41:16 | LL | xcrate::m::S; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy-struct-ctor.rs:2:18 | LL | pub struct S(u8); | -- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `S` is defined here + --> $DIR/auxiliary/privacy-struct-ctor.rs:2:5 + | +LL | pub struct S(u8); + | ^^^^^^^^^^^^^^^^^ error[E0603]: tuple struct constructor `Z` is private --> $DIR/privacy-struct-ctor.rs:45:19 | LL | xcrate::m::n::Z; - | ^ + | ^ this tuple struct constructor is private | ::: $DIR/auxiliary/privacy-struct-ctor.rs:5:28 | LL | pub(in m) struct Z(pub(in m::n) u8); | --------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `Z` is defined here + --> $DIR/auxiliary/privacy-struct-ctor.rs:5:9 + | +LL | pub(in m) struct Z(pub(in m::n) u8); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to 10 previous errors diff --git a/src/test/ui/resolve/resolve-inconsistent-binding-mode.stderr b/src/test/ui/resolve/resolve-inconsistent-binding-mode.stderr index 58455024d3..61d1001ce9 100644 --- a/src/test/ui/resolve/resolve-inconsistent-binding-mode.stderr +++ b/src/test/ui/resolve/resolve-inconsistent-binding-mode.stderr @@ -23,18 +23,24 @@ LL | Opts::A(ref mut i) | Opts::B(ref i) => {} error[E0308]: mismatched types --> $DIR/resolve-inconsistent-binding-mode.rs:7:32 | +LL | match x { + | - this expression has type `Opts` LL | Opts::A(ref i) | Opts::B(i) => {} | ^ expected `&isize`, found `isize` error[E0308]: mismatched types --> $DIR/resolve-inconsistent-binding-mode.rs:16:32 | +LL | match x { + | - this expression has type `Opts` LL | Opts::A(ref i) | Opts::B(i) => {} | ^ expected `&isize`, found `isize` error[E0308]: mismatched types --> $DIR/resolve-inconsistent-binding-mode.rs:25:36 | +LL | match x { + | - this expression has type `Opts` LL | Opts::A(ref mut i) | Opts::B(ref i) => {} | ^^^^^ types differ in mutability | diff --git a/src/test/ui/resolve/resolve-inconsistent-names.stderr b/src/test/ui/resolve/resolve-inconsistent-names.stderr index 271495012d..5c87f7c684 100644 --- a/src/test/ui/resolve/resolve-inconsistent-names.stderr +++ b/src/test/ui/resolve/resolve-inconsistent-names.stderr @@ -86,6 +86,8 @@ LL | (CONST1, _) | (_, Const2) => () error[E0308]: mismatched types --> $DIR/resolve-inconsistent-names.rs:19:19 | +LL | match x { + | - this expression has type `(E, E)` LL | (A, B) | (ref B, c) | (c, A) => () | ^^^^^ expected enum `E`, found `&E` diff --git a/src/test/ui/resolve/token-error-correct-2.rs b/src/test/ui/resolve/token-error-correct-2.rs index 807a39c8c7..f7c7d908c7 100644 --- a/src/test/ui/resolve/token-error-correct-2.rs +++ b/src/test/ui/resolve/token-error-correct-2.rs @@ -3,5 +3,5 @@ fn main() { if foo { //~^ ERROR: cannot find value `foo` - ) //~ ERROR: incorrect close delimiter: `)` + ) //~ ERROR: mismatched closing delimiter: `)` } diff --git a/src/test/ui/resolve/token-error-correct-2.stderr b/src/test/ui/resolve/token-error-correct-2.stderr index d568117d67..4014af2f41 100644 --- a/src/test/ui/resolve/token-error-correct-2.stderr +++ b/src/test/ui/resolve/token-error-correct-2.stderr @@ -1,11 +1,11 @@ -error: incorrect close delimiter: `)` +error: mismatched closing delimiter: `)` --> $DIR/token-error-correct-2.rs:6:5 | LL | if foo { - | - un-closed delimiter + | - unclosed delimiter LL | LL | ) - | ^ incorrect close delimiter + | ^ mismatched closing delimiter error[E0425]: cannot find value `foo` in this scope --> $DIR/token-error-correct-2.rs:4:8 diff --git a/src/test/ui/resolve/token-error-correct.rs b/src/test/ui/resolve/token-error-correct.rs index d64907780e..4f74df0bf1 100644 --- a/src/test/ui/resolve/token-error-correct.rs +++ b/src/test/ui/resolve/token-error-correct.rs @@ -4,6 +4,6 @@ fn main() { foo(bar(; //~^ ERROR cannot find function `bar` in this scope } -//~^ ERROR: incorrect close delimiter: `}` +//~^ ERROR: mismatched closing delimiter: `}` fn foo(_: usize) {} diff --git a/src/test/ui/resolve/token-error-correct.stderr b/src/test/ui/resolve/token-error-correct.stderr index 9452e2d68d..bf300ecd78 100644 --- a/src/test/ui/resolve/token-error-correct.stderr +++ b/src/test/ui/resolve/token-error-correct.stderr @@ -1,13 +1,13 @@ -error: incorrect close delimiter: `}` +error: mismatched closing delimiter: `}` --> $DIR/token-error-correct.rs:6:1 | LL | fn main() { - | - close delimiter possibly meant for this + | - closing delimiter possibly meant for this LL | foo(bar(; - | - un-closed delimiter + | - unclosed delimiter LL | LL | } - | ^ incorrect close delimiter + | ^ mismatched closing delimiter error[E0425]: cannot find function `bar` in this scope --> $DIR/token-error-correct.rs:4:9 diff --git a/src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.rs b/src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.rs index a028247ec5..519fb75be5 100644 --- a/src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.rs +++ b/src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.rs @@ -1,5 +1,8 @@ // compile-flags: --test -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl use std::num::ParseFloatError; diff --git a/src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.stderr b/src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.stderr index 9cefef58bf..ed4f34b527 100644 --- a/src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.stderr +++ b/src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.stderr @@ -1,5 +1,5 @@ error[E0277]: `main` has invalid return type `std::result::Result<f32, std::num::ParseFloatError>` - --> $DIR/termination-trait-test-wrong-type.rs:7:1 + --> $DIR/termination-trait-test-wrong-type.rs:10:1 | LL | / fn can_parse_zero_as_f32() -> Result<f32, ParseFloatError> { LL | | "0".parse() diff --git a/src/test/ui/rfc-2005-default-binding-mode/for.stderr b/src/test/ui/rfc-2005-default-binding-mode/for.stderr index 8a1ded1d5b..ebc6ff5d8c 100644 --- a/src/test/ui/rfc-2005-default-binding-mode/for.stderr +++ b/src/test/ui/rfc-2005-default-binding-mode/for.stderr @@ -4,7 +4,7 @@ error[E0009]: cannot bind by-move and by-ref in the same pattern LL | for (n, mut m) in &tups { | - ^^^^^ by-move pattern here | | - | both by-ref and by-move used + | by-ref pattern here error[E0507]: cannot move out of a shared reference --> $DIR/for.rs:6:23 diff --git a/src/test/ui/rfc-2005-default-binding-mode/slice.rs b/src/test/ui/rfc-2005-default-binding-mode/slice.rs index 1484b8c4a1..363a0e3e64 100644 --- a/src/test/ui/rfc-2005-default-binding-mode/slice.rs +++ b/src/test/ui/rfc-2005-default-binding-mode/slice.rs @@ -1,5 +1,3 @@ -#![feature(slice_patterns)] - pub fn main() { let sl: &[u8] = b"foo"; diff --git a/src/test/ui/rfc-2005-default-binding-mode/slice.stderr b/src/test/ui/rfc-2005-default-binding-mode/slice.stderr index f1e91a05f0..c234fdf46e 100644 --- a/src/test/ui/rfc-2005-default-binding-mode/slice.stderr +++ b/src/test/ui/rfc-2005-default-binding-mode/slice.stderr @@ -1,5 +1,5 @@ error[E0004]: non-exhaustive patterns: `&[]` not covered - --> $DIR/slice.rs:6:11 + --> $DIR/slice.rs:4:11 | LL | match sl { | ^^ pattern `&[]` not covered diff --git a/src/test/ui/rfc-2008-non-exhaustive/struct.stderr b/src/test/ui/rfc-2008-non-exhaustive/struct.stderr index 944965a15e..f992988c93 100644 --- a/src/test/ui/rfc-2008-non-exhaustive/struct.stderr +++ b/src/test/ui/rfc-2008-non-exhaustive/struct.stderr @@ -14,18 +14,30 @@ error[E0603]: tuple struct constructor `TupleStruct` is private --> $DIR/struct.rs:23:32 | LL | let ts_explicit = structs::TupleStruct(640, 480); - | ^^^^^^^^^^^ + | ^^^^^^^^^^^ this tuple struct constructor is private | ::: $DIR/auxiliary/structs.rs:11:24 | LL | pub struct TupleStruct(pub u16, pub u16); | ---------------- a constructor is private if any of the fields is private + | +note: the tuple struct constructor `TupleStruct` is defined here + --> $DIR/auxiliary/structs.rs:11:1 + | +LL | pub struct TupleStruct(pub u16, pub u16); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: unit struct `UnitStruct` is private --> $DIR/struct.rs:32:32 | LL | let us_explicit = structs::UnitStruct; - | ^^^^^^^^^^ + | ^^^^^^^^^^ this unit struct is private + | +note: the unit struct `UnitStruct` is defined here + --> $DIR/auxiliary/structs.rs:8:1 + | +LL | pub struct UnitStruct; + | ^^^^^^^^^^^^^^^^^^^^^^ error[E0639]: cannot create non-exhaustive struct using struct expression --> $DIR/struct.rs:7:14 diff --git a/src/test/ui/rfc-2008-non-exhaustive/variant.stderr b/src/test/ui/rfc-2008-non-exhaustive/variant.stderr index d9d6ea21b8..2a438753a2 100644 --- a/src/test/ui/rfc-2008-non-exhaustive/variant.stderr +++ b/src/test/ui/rfc-2008-non-exhaustive/variant.stderr @@ -2,31 +2,61 @@ error[E0603]: tuple variant `Tuple` is private --> $DIR/variant.rs:11:48 | LL | let variant_tuple = NonExhaustiveVariants::Tuple(640); - | ^^^^^ + | ^^^^^ this tuple variant is private + | +note: the tuple variant `Tuple` is defined here + --> $DIR/auxiliary/variants.rs:5:23 + | +LL | #[non_exhaustive] Tuple(u32), + | ^^^^^^^^^^ error[E0603]: unit variant `Unit` is private --> $DIR/variant.rs:14:47 | LL | let variant_unit = NonExhaustiveVariants::Unit; - | ^^^^ + | ^^^^ this unit variant is private + | +note: the unit variant `Unit` is defined here + --> $DIR/auxiliary/variants.rs:4:23 + | +LL | #[non_exhaustive] Unit, + | ^^^^ error[E0603]: unit variant `Unit` is private --> $DIR/variant.rs:18:32 | LL | NonExhaustiveVariants::Unit => "", - | ^^^^ + | ^^^^ this unit variant is private + | +note: the unit variant `Unit` is defined here + --> $DIR/auxiliary/variants.rs:4:23 + | +LL | #[non_exhaustive] Unit, + | ^^^^ error[E0603]: tuple variant `Tuple` is private --> $DIR/variant.rs:20:32 | LL | NonExhaustiveVariants::Tuple(fe_tpl) => "", - | ^^^^^ + | ^^^^^ this tuple variant is private + | +note: the tuple variant `Tuple` is defined here + --> $DIR/auxiliary/variants.rs:5:23 + | +LL | #[non_exhaustive] Tuple(u32), + | ^^^^^^^^^^ error[E0603]: tuple variant `Tuple` is private --> $DIR/variant.rs:26:35 | LL | if let NonExhaustiveVariants::Tuple(fe_tpl) = variant_struct { - | ^^^^^ + | ^^^^^ this tuple variant is private + | +note: the tuple variant `Tuple` is defined here + --> $DIR/auxiliary/variants.rs:5:23 + | +LL | #[non_exhaustive] Tuple(u32), + | ^^^^^^^^^^ error[E0639]: cannot create non-exhaustive variant using struct expression --> $DIR/variant.rs:8:26 diff --git a/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs b/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs index 0a79aea376..090e912c1d 100644 --- a/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs +++ b/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs @@ -4,16 +4,16 @@ #[inline(never)] #[track_caller] -fn defeat_const_prop() -> &'static core::panic::Location<'static> { +fn codegen_caller_loc() -> &'static core::panic::Location<'static> { core::panic::Location::caller() } macro_rules! caller_location_from_macro { - () => (defeat_const_prop()); + () => (codegen_caller_loc()); } fn main() { - let loc = defeat_const_prop(); + let loc = codegen_caller_loc(); assert_eq!(loc.file(), file!()); assert_eq!(loc.line(), 16); assert_eq!(loc.column(), 15); diff --git a/src/test/ui/rfc-2091-track-caller/diverging-caller-location.rs b/src/test/ui/rfc-2091-track-caller/diverging-caller-location.rs new file mode 100644 index 0000000000..1fb75ef35f --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/diverging-caller-location.rs @@ -0,0 +1,19 @@ +// run-fail + +//! This test ensures that `#[track_caller]` can be applied directly to diverging functions, as +//! the tracking issue says: https://github.com/rust-lang/rust/issues/47809#issue-292138490. +//! Because the annotated function must diverge and a panic keeps that faster than an infinite loop, +//! we don't inspect the location returned -- it would be difficult to distinguish between the +//! explicit panic and a failed assertion. That it compiles and runs is enough for this one. + +#![feature(track_caller)] + +#[track_caller] +fn doesnt_return() -> ! { + let _location = core::panic::Location::caller(); + panic!("huzzah"); +} + +fn main() { + doesnt_return(); +} diff --git a/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs b/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs new file mode 100644 index 0000000000..be13076b8a --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs @@ -0,0 +1,38 @@ +// run-pass +// ignore-wasm32-bare compiled with panic=abort by default + +#![feature(option_expect_none, option_unwrap_none)] + +//! Test that panic locations for `#[track_caller]` functions in std have the correct +//! location reported. + +fn main() { + // inspect the `PanicInfo` we receive to ensure the right file is the source + std::panic::set_hook(Box::new(|info| { + let actual = info.location().unwrap(); + if actual.file() != file!() { + eprintln!("expected a location in the test file, found {:?}", actual); + panic!(); + } + })); + + fn assert_panicked(f: impl FnOnce() + std::panic::UnwindSafe) { + std::panic::catch_unwind(f).unwrap_err(); + } + + let nope: Option<()> = None; + assert_panicked(|| nope.unwrap()); + assert_panicked(|| nope.expect("")); + + let yep: Option<()> = Some(()); + assert_panicked(|| yep.unwrap_none()); + assert_panicked(|| yep.expect_none("")); + + let oops: Result<(), ()> = Err(()); + assert_panicked(|| oops.unwrap()); + assert_panicked(|| oops.expect("")); + + let fine: Result<(), ()> = Ok(()); + assert_panicked(|| fine.unwrap_err()); + assert_panicked(|| fine.expect_err("")); +} diff --git a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs index 8436ee510a..76a380ed3e 100644 --- a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs +++ b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs @@ -1,6 +1,6 @@ // run-pass -#![feature(const_fn, track_caller)] +#![feature(track_caller)] use std::panic::Location; diff --git a/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs b/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs new file mode 100644 index 0000000000..0407eafbfd --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs @@ -0,0 +1,19 @@ +// run-pass + +#![feature(track_caller)] + +fn pass_to_ptr_call<T>(f: fn(T), x: T) { + f(x); +} + +#[track_caller] +fn tracked_unit(_: ()) { + let expected_line = line!() - 1; + let location = std::panic::Location::caller(); + assert_eq!(location.file(), file!()); + assert_eq!(location.line(), expected_line, "call shims report location as fn definition"); +} + +fn main() { + pass_to_ptr_call(tracked_unit, ()); +} diff --git a/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs b/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs new file mode 100644 index 0000000000..a4baaa26ce --- /dev/null +++ b/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs @@ -0,0 +1,19 @@ +// run-pass + +#![feature(track_caller)] + +fn ptr_call(f: fn()) { + f(); +} + +#[track_caller] +fn tracked() { + let expected_line = line!() - 1; + let location = std::panic::Location::caller(); + assert_eq!(location.file(), file!()); + assert_eq!(location.line(), expected_line, "call shims report location as fn definition"); +} + +fn main() { + ptr_call(tracked); +} diff --git a/src/test/ui/rfc-2093-infer-outlives/cross-crate.stderr b/src/test/ui/rfc-2093-infer-outlives/cross-crate.stderr index 3368e35d30..1da8e64825 100644 --- a/src/test/ui/rfc-2093-infer-outlives/cross-crate.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/cross-crate.stderr @@ -6,7 +6,7 @@ LL | | bar: std::slice::IterMut<'a, T> LL | | } | |_^ | - = note: T : 'a + = note: T: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/enum.stderr b/src/test/ui/rfc-2093-infer-outlives/enum.stderr index dd56c1f79c..868ca2c458 100644 --- a/src/test/ui/rfc-2093-infer-outlives/enum.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/enum.stderr @@ -6,7 +6,7 @@ LL | | One(Bar<'a, T>) LL | | } | |_^ | - = note: T : 'a + = note: T: 'a error: rustc_outlives --> $DIR/enum.rs:13:1 @@ -16,7 +16,7 @@ LL | | field2: &'b U LL | | } | |_^ | - = note: U : 'b + = note: U: 'b error: rustc_outlives --> $DIR/enum.rs:19:1 @@ -26,7 +26,7 @@ LL | | One(&'c Yang<K>) LL | | } | |_^ | - = note: K : 'c + = note: K: 'c error: aborting due to 3 previous errors diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.stderr index c87ef6c391..adb718ad79 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.stderr @@ -7,7 +7,7 @@ LL | | foo: Box<dyn Trait<'a, A>> LL | | } | |_^ | - = note: A : 'a + = note: A: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-enum.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-enum.stderr index 611df047cf..062f5d5e9a 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-enum.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-enum.stderr @@ -6,7 +6,7 @@ LL | | One(Bar<'a, U>) LL | | } | |_^ | - = note: U : 'a + = note: U: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-projection.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-projection.stderr index 8e9b158ab7..a85aa3d756 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-projection.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-projection.stderr @@ -7,7 +7,7 @@ LL | | foo: <A as Trait<'a, B>>::Type LL | | } | |_^ | - = note: B : 'a + = note: B: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-struct.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-struct.stderr index cbff2b777f..309c54bb44 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-struct.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-struct.stderr @@ -6,7 +6,7 @@ LL | | bar: Bar<'b, U> LL | | } | |_^ | - = note: U : 'b + = note: U: 'b error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-union.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-union.stderr index 8aa246e8bf..47c283faf5 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-union.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-union.stderr @@ -6,7 +6,7 @@ LL | | bar: Bar<'b, U> LL | | } | |_^ | - = note: U : 'b + = note: U: 'b error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/infer-static.stderr b/src/test/ui/rfc-2093-infer-outlives/infer-static.stderr index 106db765f7..6fbb7cf4cb 100644 --- a/src/test/ui/rfc-2093-infer-outlives/infer-static.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/infer-static.stderr @@ -6,7 +6,7 @@ LL | | bar: Bar<U> LL | | } | |_^ | - = note: U : 'static + = note: U: 'static error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-enum.stderr b/src/test/ui/rfc-2093-infer-outlives/nested-enum.stderr index 6b143ba7eb..10387f51b1 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-enum.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/nested-enum.stderr @@ -7,7 +7,7 @@ LL | | One(Bar<'a, T>) LL | | } | |_^ | - = note: T : 'a + = note: T: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-regions.stderr b/src/test/ui/rfc-2093-infer-outlives/nested-regions.stderr index 4d8f7b7c8c..ffdd5542bb 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-regions.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/nested-regions.stderr @@ -6,9 +6,9 @@ LL | | x: &'a &'b T LL | | } | |_^ | - = note: 'b : 'a - = note: T : 'a - = note: T : 'b + = note: 'b: 'a + = note: T: 'a + = note: T: 'b error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-structs.stderr b/src/test/ui/rfc-2093-infer-outlives/nested-structs.stderr index 17d7c014e1..86bcbe640e 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-structs.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/nested-structs.stderr @@ -6,7 +6,7 @@ LL | | field1: Bar<'a, T> LL | | } | |_^ | - = note: T : 'a + = note: T: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-union.stderr b/src/test/ui/rfc-2093-infer-outlives/nested-union.stderr index a42285a56d..e0f248fa38 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-union.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/nested-union.stderr @@ -6,7 +6,7 @@ LL | | field1: Bar<'a, T> LL | | } | |_^ | - = note: T : 'a + = note: T: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/projection.stderr b/src/test/ui/rfc-2093-infer-outlives/projection.stderr index 8a91c44c58..3746bab4d5 100644 --- a/src/test/ui/rfc-2093-infer-outlives/projection.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/projection.stderr @@ -6,7 +6,7 @@ LL | | bar: &'a T::Item LL | | } | |_^ | - = note: <T as std::iter::Iterator>::Item : 'a + = note: <T as std::iter::Iterator>::Item: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/reference.stderr b/src/test/ui/rfc-2093-infer-outlives/reference.stderr index adb1c4a629..d69aaf6f84 100644 --- a/src/test/ui/rfc-2093-infer-outlives/reference.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/reference.stderr @@ -6,7 +6,7 @@ LL | | bar: &'a T, LL | | } | |_^ | - = note: T : 'a + = note: T: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/self-dyn.stderr b/src/test/ui/rfc-2093-infer-outlives/self-dyn.stderr index 0be14a6956..77577fe094 100644 --- a/src/test/ui/rfc-2093-infer-outlives/self-dyn.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/self-dyn.stderr @@ -7,7 +7,7 @@ LL | | foo: Box<dyn Trait<'a, 'b, A>> LL | | } | |_^ | - = note: A : 'a + = note: A: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/self-structs.stderr b/src/test/ui/rfc-2093-infer-outlives/self-structs.stderr index b32c9743e9..b972ad8446 100644 --- a/src/test/ui/rfc-2093-infer-outlives/self-structs.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/self-structs.stderr @@ -6,7 +6,7 @@ LL | | field1: dyn Bar<'a, 'b, T> LL | | } | |_^ | - = note: T : 'a + = note: T: 'a error: aborting due to previous error diff --git a/src/test/ui/rfc-2457/idents-normalized.rs b/src/test/ui/rfc-2457/idents-normalized.rs new file mode 100644 index 0000000000..109cec7548 --- /dev/null +++ b/src/test/ui/rfc-2457/idents-normalized.rs @@ -0,0 +1,8 @@ +// check-pass +#![feature(non_ascii_idents)] + +struct Résumé; // ['LATIN SMALL LETTER E WITH ACUTE'] + +fn main() { + let _ = Résumé; // ['LATIN SMALL LETTER E', 'COMBINING ACUTE ACCENT'] +} diff --git a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr index 1143bddfe4..7170adca60 100644 --- a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr +++ b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr @@ -630,7 +630,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:67:12 | LL | if let Range { start: _, end: _ } = true..true && false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | | expected `bool`, found struct `std::ops::Range` | @@ -650,7 +650,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:71:12 | LL | if let Range { start: _, end: _ } = true..true || false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | | expected `bool`, found struct `std::ops::Range` | @@ -697,7 +697,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:86:12 | LL | if let Range { start: true, end } = t..&&false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this match expression has type `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `&&bool` | | | expected `bool`, found struct `std::ops::Range` | @@ -818,7 +818,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:131:15 | LL | while let Range { start: _, end: _ } = true..true && false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | | expected `bool`, found struct `std::ops::Range` | @@ -838,7 +838,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:135:15 | LL | while let Range { start: _, end: _ } = true..true || false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | | expected `bool`, found struct `std::ops::Range` | @@ -885,7 +885,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:150:15 | LL | while let Range { start: true, end } = t..&&false {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this match expression has type `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `&&bool` | | | expected `bool`, found struct `std::ops::Range` | @@ -961,7 +961,7 @@ error[E0308]: mismatched types --> $DIR/disallowed-positions.rs:198:10 | LL | (let Range { start: _, end: _ } = true..true || false); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool` | | | expected `bool`, found struct `std::ops::Range` | diff --git a/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs b/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs index 64987663ad..f5cb1860d4 100644 --- a/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs +++ b/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs @@ -123,9 +123,11 @@ fn _macros() { use_expr!((let 0 = 1 && 0 == 0)); //~^ ERROR `let` expressions in this position are experimental [E0658] //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here use_expr!((let 0 = 1)); //~^ ERROR `let` expressions in this position are experimental [E0658] //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here #[cfg(FALSE)] (let 0 = 1); //~^ ERROR `let` expressions in this position are experimental [E0658] use_expr!(let 0 = 1); diff --git a/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr b/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr index abe200944b..c14a45af40 100644 --- a/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr +++ b/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr @@ -1,5 +1,5 @@ error: no rules expected the token `let` - --> $DIR/feature-gate.rs:131:15 + --> $DIR/feature-gate.rs:133:15 | LL | macro_rules! use_expr { | --------------------- when calling this macro @@ -260,7 +260,7 @@ LL | while let Range { start: _, end: _ } = (true..true) && false {} = help: add `#![feature(let_chains)]` to the crate attributes to enable error[E0658]: `let` expressions in this position are experimental - --> $DIR/feature-gate.rs:129:20 + --> $DIR/feature-gate.rs:131:20 | LL | #[cfg(FALSE)] (let 0 = 1); | ^^^^^^^^^ @@ -287,7 +287,7 @@ LL | use_expr!((let 0 = 1 && 0 == 0)); = help: add `#![feature(let_chains)]` to the crate attributes to enable error[E0658]: `let` expressions in this position are experimental - --> $DIR/feature-gate.rs:126:16 + --> $DIR/feature-gate.rs:127:16 | LL | use_expr!((let 0 = 1)); | ^^^^^^^^^ @@ -557,7 +557,25 @@ LL | use_expr!((let 0 = 1 && 0 == 0)); = note: as well as when nested within `&&` and parenthesis in those conditions error: `let` expressions are not supported here - --> $DIR/feature-gate.rs:126:16 + --> $DIR/feature-gate.rs:123:16 + | +LL | use_expr!((let 0 = 1 && 0 == 0)); + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:127:16 + | +LL | use_expr!((let 0 = 1)); + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:127:16 | LL | use_expr!((let 0 = 1)); | ^^^^^^^^^ @@ -565,6 +583,6 @@ LL | use_expr!((let 0 = 1)); = note: only supported directly in conditions of `if`- and `while`-expressions = note: as well as when nested within `&&` and parenthesis in those conditions -error: aborting due to 63 previous errors +error: aborting due to 65 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.gated.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.gated.stderr new file mode 100644 index 0000000000..e4f4d4262b --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.gated.stderr @@ -0,0 +1,8 @@ +error: fatal error triggered by #[rustc_error] + --> $DIR/feature-gate.rs:16:1 + | +LL | fn main() {} + | ^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.rs b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.rs new file mode 100644 index 0000000000..d600b53e44 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.rs @@ -0,0 +1,16 @@ +// revisions: stock gated +// gate-test-const_trait_bound_opt_out + +#![cfg_attr(gated, feature(const_trait_bound_opt_out))] +#![allow(incomplete_features)] +#![feature(rustc_attrs)] + +trait T { + const CONST: i32; +} + +const fn get_assoc_const<S: ?const T>() -> i32 { <S as T>::CONST } +//[stock]~^ ERROR `?const` on trait bounds is experimental + +#[rustc_error] +fn main() {} //[gated]~ ERROR fatal error triggered by #[rustc_error] diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.stock.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.stock.stderr new file mode 100644 index 0000000000..fbd3840cb1 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/feature-gate.stock.stderr @@ -0,0 +1,12 @@ +error[E0658]: `?const` on trait bounds is experimental + --> $DIR/feature-gate.rs:12:29 + | +LL | const fn get_assoc_const<S: ?const T>() -> i32 { <S as T>::CONST } + | ^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/67794 + = help: add `#![feature(const_trait_bound_opt_out)]` to the crate attributes to enable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-impl-trait.rs b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-impl-trait.rs new file mode 100644 index 0000000000..f5561a922d --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-impl-trait.rs @@ -0,0 +1,21 @@ +#![feature(const_trait_bound_opt_out)] +#![feature(associated_type_bounds)] +#![allow(incomplete_features)] + +trait T {} +struct S; +impl T for S {} + +fn rpit() -> impl ?const T { S } +//~^ ERROR `?const` is not permitted in `impl Trait` + +fn apit(_: impl ?const T) {} +//~^ ERROR `?const` is not permitted in `impl Trait` + +fn rpit_assoc_bound() -> impl IntoIterator<Item: ?const T> { Some(S) } +//~^ ERROR `?const` is not permitted in `impl Trait` + +fn apit_assoc_bound(_: impl IntoIterator<Item: ?const T>) {} +//~^ ERROR `?const` is not permitted in `impl Trait` + +fn main() {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-impl-trait.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-impl-trait.stderr new file mode 100644 index 0000000000..06cd00a956 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-impl-trait.stderr @@ -0,0 +1,26 @@ +error: `?const` is not permitted in `impl Trait` + --> $DIR/in-impl-trait.rs:9:19 + | +LL | fn rpit() -> impl ?const T { S } + | ^^^^^^^^ + +error: `?const` is not permitted in `impl Trait` + --> $DIR/in-impl-trait.rs:12:17 + | +LL | fn apit(_: impl ?const T) {} + | ^^^^^^^^ + +error: `?const` is not permitted in `impl Trait` + --> $DIR/in-impl-trait.rs:15:50 + | +LL | fn rpit_assoc_bound() -> impl IntoIterator<Item: ?const T> { Some(S) } + | ^^^^^^^^ + +error: `?const` is not permitted in `impl Trait` + --> $DIR/in-impl-trait.rs:18:48 + | +LL | fn apit_assoc_bound(_: impl IntoIterator<Item: ?const T>) {} + | ^^^^^^^^ + +error: aborting due to 4 previous errors + diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-bounds.rs b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-bounds.rs new file mode 100644 index 0000000000..fc9ed5b1dc --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-bounds.rs @@ -0,0 +1,8 @@ +#![feature(const_trait_bound_opt_out)] +#![allow(incomplete_features)] + +trait Super {} +trait T: ?const Super {} +//~^ ERROR `?const` is not permitted in supertraits + +fn main() {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-bounds.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-bounds.stderr new file mode 100644 index 0000000000..a0d8f95acd --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-bounds.stderr @@ -0,0 +1,8 @@ +error: `?const` is not permitted in supertraits + --> $DIR/in-trait-bounds.rs:5:10 + | +LL | trait T: ?const Super {} + | ^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-object.rs b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-object.rs new file mode 100644 index 0000000000..b3d1f48ace --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-object.rs @@ -0,0 +1,19 @@ +#![feature(const_trait_bound_opt_out)] +#![allow(bare_trait_objects)] +#![allow(incomplete_features)] + +struct S; +trait T {} +impl T for S {} + +// An inherent impl for the trait object `?const T`. +impl ?const T {} +//~^ ERROR `?const` is not permitted in trait objects + +fn trait_object() -> &'static dyn ?const T { &S } +//~^ ERROR `?const` is not permitted in trait objects + +fn trait_object_in_apit(_: impl IntoIterator<Item = Box<dyn ?const T>>) {} +//~^ ERROR `?const` is not permitted in trait objects + +fn main() {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-object.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-object.stderr new file mode 100644 index 0000000000..331fe0423f --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/in-trait-object.stderr @@ -0,0 +1,20 @@ +error: `?const` is not permitted in trait objects + --> $DIR/in-trait-object.rs:10:6 + | +LL | impl ?const T {} + | ^^^^^^^^ + +error: `?const` is not permitted in trait objects + --> $DIR/in-trait-object.rs:13:35 + | +LL | fn trait_object() -> &'static dyn ?const T { &S } + | ^^^^^^^^ + +error: `?const` is not permitted in trait objects + --> $DIR/in-trait-object.rs:16:61 + | +LL | fn trait_object_in_apit(_: impl IntoIterator<Item = Box<dyn ?const T>>) {} + | ^^^^^^^^ + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/opt-out-twice.rs b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/opt-out-twice.rs new file mode 100644 index 0000000000..01e941a8fb --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/opt-out-twice.rs @@ -0,0 +1,8 @@ +// compile-flags: -Z parse-only + +#![feature(const_trait_bound_opt_out)] +#![allow(incomplete_features)] + +struct S<T: ?const ?const Tr>; +//~^ ERROR expected identifier, found keyword `const` +//~| ERROR expected one of `(`, `+`, `,`, `::`, `<`, `=`, or `>` diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/opt-out-twice.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/opt-out-twice.stderr new file mode 100644 index 0000000000..f7924b3f24 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/opt-out-twice.stderr @@ -0,0 +1,14 @@ +error: expected identifier, found keyword `const` + --> $DIR/opt-out-twice.rs:6:21 + | +LL | struct S<T: ?const ?const Tr>; + | ^^^^^ expected identifier, found keyword + +error: expected one of `(`, `+`, `,`, `::`, `<`, `=`, or `>`, found `Tr` + --> $DIR/opt-out-twice.rs:6:27 + | +LL | struct S<T: ?const ?const Tr>; + | ^^ expected one of 7 possible tokens + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/syntax.rs b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/syntax.rs new file mode 100644 index 0000000000..a0d9610bbb --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/syntax.rs @@ -0,0 +1,10 @@ +// compile-flags: -Z parse-only +// check-pass + +#![feature(const_trait_bound_opt_out)] +#![allow(incomplete_features)] + +struct S< + T: ?const ?for<'a> Tr<'a> + 'static + ?const std::ops::Add, + T: ?const ?for<'a: 'b> m::Trait<'a>, +>; diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/with-maybe-sized.rs b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/with-maybe-sized.rs new file mode 100644 index 0000000000..c2c8689e29 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/with-maybe-sized.rs @@ -0,0 +1,7 @@ +#![feature(const_trait_bound_opt_out)] +#![allow(incomplete_features)] + +struct S<T: ?const ?Sized>(std::marker::PhantomData<T>); +//~^ ERROR `?const` and `?` are mutually exclusive + +fn main() {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/with-maybe-sized.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/with-maybe-sized.stderr new file mode 100644 index 0000000000..e8e9d6c1e7 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/with-maybe-sized.stderr @@ -0,0 +1,8 @@ +error: `?const` and `?` are mutually exclusive + --> $DIR/with-maybe-sized.rs:4:13 + | +LL | struct S<T: ?const ?Sized>(std::marker::PhantomData<T>); + | ^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/without-question-mark.rs b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/without-question-mark.rs new file mode 100644 index 0000000000..b904a2eec0 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/without-question-mark.rs @@ -0,0 +1,7 @@ +// compile-flags: -Z parse-only + +#![feature(const_trait_bound_opt_out)] +#![allow(incomplete_features)] + +struct S<T: const Tr>; +//~^ ERROR expected one of `!`, `(`, `,`, `=`, `>`, `?`, `for`, lifetime, or path diff --git a/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/without-question-mark.stderr b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/without-question-mark.stderr new file mode 100644 index 0000000000..0dbca952c0 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/const-trait-bound-opt-out/without-question-mark.stderr @@ -0,0 +1,8 @@ +error: expected one of `!`, `(`, `,`, `=`, `>`, `?`, `for`, lifetime, or path, found keyword `const` + --> $DIR/without-question-mark.rs:6:13 + | +LL | struct S<T: const Tr>; + | ^^^^^ expected one of 9 possible tokens + +error: aborting due to previous error + diff --git a/src/test/ui/rfc-2632-const-trait-impl/feature-gate.gated.stderr b/src/test/ui/rfc-2632-const-trait-impl/feature-gate.gated.stderr new file mode 100644 index 0000000000..b196f9ef57 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/feature-gate.gated.stderr @@ -0,0 +1,8 @@ +error: const trait impls are not yet implemented + --> $DIR/feature-gate.rs:9:1 + | +LL | impl const T for S {} + | ^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/rfc-2632-const-trait-impl/feature-gate.rs b/src/test/ui/rfc-2632-const-trait-impl/feature-gate.rs new file mode 100644 index 0000000000..49b6c0926c --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/feature-gate.rs @@ -0,0 +1,13 @@ +// revisions: stock gated +// gate-test-const_trait_impl + +#![cfg_attr(gated, feature(const_trait_impl))] +#![allow(incomplete_features)] + +struct S; +trait T {} +impl const T for S {} +//[stock]~^ ERROR const trait impls are experimental +//[stock,gated]~^^ ERROR const trait impls are not yet implemented + +fn main() {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/feature-gate.stock.stderr b/src/test/ui/rfc-2632-const-trait-impl/feature-gate.stock.stderr new file mode 100644 index 0000000000..093946f859 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/feature-gate.stock.stderr @@ -0,0 +1,18 @@ +error[E0658]: const trait impls are experimental + --> $DIR/feature-gate.rs:9:6 + | +LL | impl const T for S {} + | ^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/67792 + = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable + +error: const trait impls are not yet implemented + --> $DIR/feature-gate.rs:9:1 + | +LL | impl const T for S {} + | ^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/rfc-2632-const-trait-impl/impl-opt-out-trait.rs b/src/test/ui/rfc-2632-const-trait-impl/impl-opt-out-trait.rs new file mode 100644 index 0000000000..98d3a220d8 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/impl-opt-out-trait.rs @@ -0,0 +1,11 @@ +#![feature(const_trait_bound_opt_out)] +#![feature(const_trait_impl)] +#![allow(incomplete_features)] + +struct S; +trait T {} + +impl ?const T for S {} +//~^ ERROR expected a trait, found type + +fn main() {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/impl-opt-out-trait.stderr b/src/test/ui/rfc-2632-const-trait-impl/impl-opt-out-trait.stderr new file mode 100644 index 0000000000..8f923efb09 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/impl-opt-out-trait.stderr @@ -0,0 +1,8 @@ +error: expected a trait, found type + --> $DIR/impl-opt-out-trait.rs:8:6 + | +LL | impl ?const T for S {} + | ^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/rfc-2632-const-trait-impl/inherent-impl.rs b/src/test/ui/rfc-2632-const-trait-impl/inherent-impl.rs new file mode 100644 index 0000000000..7f064c0c53 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/inherent-impl.rs @@ -0,0 +1,17 @@ +#![feature(const_trait_impl)] +#![feature(const_trait_bound_opt_out)] +#![allow(incomplete_features)] +#![allow(bare_trait_objects)] + +struct S; +trait T {} + +impl const S {} +//~^ ERROR inherent impls cannot be `const` +//~| ERROR const trait impls are not yet implemented + +impl const T {} +//~^ ERROR inherent impls cannot be `const` +//~| ERROR const trait impls are not yet implemented + +fn main() {} diff --git a/src/test/ui/rfc-2632-const-trait-impl/inherent-impl.stderr b/src/test/ui/rfc-2632-const-trait-impl/inherent-impl.stderr new file mode 100644 index 0000000000..508c6f4c74 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/inherent-impl.stderr @@ -0,0 +1,30 @@ +error: inherent impls cannot be `const` + --> $DIR/inherent-impl.rs:9:1 + | +LL | impl const S {} + | ^^^^^^^^^^^^^^^ + | + = note: only trait implementations may be annotated with `const` + +error: inherent impls cannot be `const` + --> $DIR/inherent-impl.rs:13:1 + | +LL | impl const T {} + | ^^^^^^^^^^^^^^^ + | + = note: only trait implementations may be annotated with `const` + +error: const trait impls are not yet implemented + --> $DIR/inherent-impl.rs:9:1 + | +LL | impl const S {} + | ^^^^^^^^^^^^^^^ + +error: const trait impls are not yet implemented + --> $DIR/inherent-impl.rs:13:1 + | +LL | impl const T {} + | ^^^^^^^^^^^^^^^ + +error: aborting due to 4 previous errors + diff --git a/src/test/ui/rfc-2632-const-trait-impl/syntax.rs b/src/test/ui/rfc-2632-const-trait-impl/syntax.rs new file mode 100644 index 0000000000..354d48d630 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/syntax.rs @@ -0,0 +1,9 @@ +// compile-flags: -Z parse-only +// check-pass + +#![feature(const_trait_bound_opt_out)] +#![feature(const_trait_impl)] +#![allow(incomplete_features)] + +// For now, this parses since an error does not occur until AST lowering. +impl ?const T {} diff --git a/src/test/ui/rfc1445/cant-hide-behind-direct-struct-embedded.rs b/src/test/ui/rfc1445/cant-hide-behind-direct-struct-embedded.rs index b8949ae8b5..e9dcb4f85f 100644 --- a/src/test/ui/rfc1445/cant-hide-behind-direct-struct-embedded.rs +++ b/src/test/ui/rfc1445/cant-hide-behind-direct-struct-embedded.rs @@ -21,6 +21,7 @@ fn main() { match WRAP_DIRECT_INLINE { WRAP_DIRECT_INLINE => { panic!("WRAP_DIRECT_INLINE matched itself"); } //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` + //~| ERROR must be annotated with `#[derive(PartialEq, Eq)]` _ => { println!("WRAP_DIRECT_INLINE did not match itself"); } } } diff --git a/src/test/ui/rfc1445/cant-hide-behind-direct-struct-embedded.stderr b/src/test/ui/rfc1445/cant-hide-behind-direct-struct-embedded.stderr index c73a6cf132..9c7d1f3a18 100644 --- a/src/test/ui/rfc1445/cant-hide-behind-direct-struct-embedded.stderr +++ b/src/test/ui/rfc1445/cant-hide-behind-direct-struct-embedded.stderr @@ -4,5 +4,11 @@ error: to use a constant of type `NoDerive` in a pattern, `NoDerive` must be ann LL | WRAP_DIRECT_INLINE => { panic!("WRAP_DIRECT_INLINE matched itself"); } | ^^^^^^^^^^^^^^^^^^ -error: aborting due to previous error +error: to use a constant of type `NoDerive` in a pattern, `NoDerive` must be annotated with `#[derive(PartialEq, Eq)]` + --> $DIR/cant-hide-behind-direct-struct-embedded.rs:22:9 + | +LL | WRAP_DIRECT_INLINE => { panic!("WRAP_DIRECT_INLINE matched itself"); } + | ^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors diff --git a/src/test/ui/rfc1445/cant-hide-behind-direct-struct-param.rs b/src/test/ui/rfc1445/cant-hide-behind-direct-struct-param.rs index 584e7a00f0..ab1cb3baba 100644 --- a/src/test/ui/rfc1445/cant-hide-behind-direct-struct-param.rs +++ b/src/test/ui/rfc1445/cant-hide-behind-direct-struct-param.rs @@ -21,6 +21,7 @@ fn main() { match WRAP_DIRECT_PARAM { WRAP_DIRECT_PARAM => { panic!("WRAP_DIRECT_PARAM matched itself"); } //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` + //~| ERROR must be annotated with `#[derive(PartialEq, Eq)]` _ => { println!("WRAP_DIRECT_PARAM did not match itself"); } } } diff --git a/src/test/ui/rfc1445/cant-hide-behind-direct-struct-param.stderr b/src/test/ui/rfc1445/cant-hide-behind-direct-struct-param.stderr index 6fdf9db89b..6f49a8a0c9 100644 --- a/src/test/ui/rfc1445/cant-hide-behind-direct-struct-param.stderr +++ b/src/test/ui/rfc1445/cant-hide-behind-direct-struct-param.stderr @@ -4,5 +4,11 @@ error: to use a constant of type `NoDerive` in a pattern, `NoDerive` must be ann LL | WRAP_DIRECT_PARAM => { panic!("WRAP_DIRECT_PARAM matched itself"); } | ^^^^^^^^^^^^^^^^^ -error: aborting due to previous error +error: to use a constant of type `NoDerive` in a pattern, `NoDerive` must be annotated with `#[derive(PartialEq, Eq)]` + --> $DIR/cant-hide-behind-direct-struct-param.rs:22:9 + | +LL | WRAP_DIRECT_PARAM => { panic!("WRAP_DIRECT_PARAM matched itself"); } + | ^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors diff --git a/src/test/ui/rfc1445/match-forbidden-without-eq.rs b/src/test/ui/rfc1445/match-forbidden-without-eq.rs index 1cca275206..59141eac3e 100644 --- a/src/test/ui/rfc1445/match-forbidden-without-eq.rs +++ b/src/test/ui/rfc1445/match-forbidden-without-eq.rs @@ -12,6 +12,7 @@ fn main() { match y { FOO => { } //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` + //~| ERROR must be annotated with `#[derive(PartialEq, Eq)]` _ => { } } diff --git a/src/test/ui/rfc1445/match-forbidden-without-eq.stderr b/src/test/ui/rfc1445/match-forbidden-without-eq.stderr index c05bb8f19f..b9476e399f 100644 --- a/src/test/ui/rfc1445/match-forbidden-without-eq.stderr +++ b/src/test/ui/rfc1445/match-forbidden-without-eq.stderr @@ -5,7 +5,7 @@ LL | FOO => { } | ^^^ warning: floating-point types cannot be used in patterns - --> $DIR/match-forbidden-without-eq.rs:20:9 + --> $DIR/match-forbidden-without-eq.rs:21:9 | LL | f32::INFINITY => { } | ^^^^^^^^^^^^^ @@ -14,8 +14,14 @@ LL | f32::INFINITY => { } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> +error: to use a constant of type `Foo` in a pattern, `Foo` must be annotated with `#[derive(PartialEq, Eq)]` + --> $DIR/match-forbidden-without-eq.rs:13:9 + | +LL | FOO => { } + | ^^^ + warning: floating-point types cannot be used in patterns - --> $DIR/match-forbidden-without-eq.rs:20:9 + --> $DIR/match-forbidden-without-eq.rs:21:9 | LL | f32::INFINITY => { } | ^^^^^^^^^^^^^ @@ -23,5 +29,5 @@ LL | f32::INFINITY => { } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620> -error: aborting due to previous error +error: aborting due to 2 previous errors diff --git a/src/test/ui/rfc1445/match-nonempty-array-forbidden-without-eq.rs b/src/test/ui/rfc1445/match-nonempty-array-forbidden-without-eq.rs index 3d56fb05dc..9ef8a68da8 100644 --- a/src/test/ui/rfc1445/match-nonempty-array-forbidden-without-eq.rs +++ b/src/test/ui/rfc1445/match-nonempty-array-forbidden-without-eq.rs @@ -15,5 +15,6 @@ fn main() { match [B(1)] { FOO => { } //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` + //~| ERROR must be annotated with `#[derive(PartialEq, Eq)]` } } diff --git a/src/test/ui/rfc1445/match-nonempty-array-forbidden-without-eq.stderr b/src/test/ui/rfc1445/match-nonempty-array-forbidden-without-eq.stderr index 371f8a0aa1..7e354bf9ad 100644 --- a/src/test/ui/rfc1445/match-nonempty-array-forbidden-without-eq.stderr +++ b/src/test/ui/rfc1445/match-nonempty-array-forbidden-without-eq.stderr @@ -4,5 +4,11 @@ error: to use a constant of type `B` in a pattern, `B` must be annotated with `# LL | FOO => { } | ^^^ -error: aborting due to previous error +error: to use a constant of type `B` in a pattern, `B` must be annotated with `#[derive(PartialEq, Eq)]` + --> $DIR/match-nonempty-array-forbidden-without-eq.rs:16:9 + | +LL | FOO => { } + | ^^^ + +error: aborting due to 2 previous errors diff --git a/src/test/ui/rfc1445/match-requires-both-partialeq-and-eq.rs b/src/test/ui/rfc1445/match-requires-both-partialeq-and-eq.rs index 6b7d94603b..9530a1ffec 100644 --- a/src/test/ui/rfc1445/match-requires-both-partialeq-and-eq.rs +++ b/src/test/ui/rfc1445/match-requires-both-partialeq-and-eq.rs @@ -16,6 +16,7 @@ fn main() { match y { FOO => { } //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` + //~| ERROR must be annotated with `#[derive(PartialEq, Eq)]` _ => { } } } diff --git a/src/test/ui/rfc1445/match-requires-both-partialeq-and-eq.stderr b/src/test/ui/rfc1445/match-requires-both-partialeq-and-eq.stderr index 4157cf6528..7ef082852b 100644 --- a/src/test/ui/rfc1445/match-requires-both-partialeq-and-eq.stderr +++ b/src/test/ui/rfc1445/match-requires-both-partialeq-and-eq.stderr @@ -4,5 +4,11 @@ error: to use a constant of type `Foo` in a pattern, `Foo` must be annotated wit LL | FOO => { } | ^^^ -error: aborting due to previous error +error: to use a constant of type `Foo` in a pattern, `Foo` must be annotated with `#[derive(PartialEq, Eq)]` + --> $DIR/match-requires-both-partialeq-and-eq.rs:17:9 + | +LL | FOO => { } + | ^^^ + +error: aborting due to 2 previous errors diff --git a/src/test/ui/rfc1598-generic-associated-types/collections.stderr b/src/test/ui/rfc1598-generic-associated-types/collections.stderr deleted file mode 100644 index fa8fcc9924..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/collections.stderr +++ /dev/null @@ -1,41 +0,0 @@ -warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash - --> $DIR/collections.rs:1:12 - | -LL | #![feature(generic_associated_types)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -error[E0109]: type arguments are not allowed for this type - --> $DIR/collections.rs:56:90 - | -LL | fn floatify<C>(ints: &C) -> <<C as Collection<i32>>::Family as CollectionFamily>::Member<f32> - | ^^^ type argument not allowed - -error[E0109]: type arguments are not allowed for this type - --> $DIR/collections.rs:68:69 - | -LL | fn floatify_sibling<C>(ints: &C) -> <C as Collection<i32>>::Sibling<f32> - | ^^^ type argument not allowed - -error[E0109]: type arguments are not allowed for this type - --> $DIR/collections.rs:17:71 - | -LL | <<Self as Collection<T>>::Family as CollectionFamily>::Member<U>; - | ^ type argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/collections.rs:24:50 - | -LL | fn iterate<'iter>(&'iter self) -> Self::Iter<'iter>; - | ^^^^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/collections.rs:50:50 - | -LL | fn iterate<'iter>(&'iter self) -> Self::Iter<'iter> { - | ^^^^^ lifetime argument not allowed - -error: aborting due to 5 previous errors - -For more information about this error, try `rustc --explain E0109`. diff --git a/src/test/ui/rfc1598-generic-associated-types/construct_with_other_type.rs b/src/test/ui/rfc1598-generic-associated-types/construct_with_other_type.rs deleted file mode 100644 index 3a459a4551..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/construct_with_other_type.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![feature(generic_associated_types)] -//~^ WARNING the feature `generic_associated_types` is incomplete - -use std::ops::Deref; - -// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a -// follow-up PR. - -trait Foo { - type Bar<'a, 'b>; -} - -trait Baz { - type Quux<'a>: Foo; - - // This weird type tests that we can use universal function call syntax to access the Item on - type Baa<'a>: Deref<Target = <Self::Quux<'a> as Foo>::Bar<'a, 'static>>; - //~^ ERROR lifetime arguments are not allowed for this type [E0109] - //~| ERROR lifetime arguments are not allowed for this type [E0109] -} - -impl<T> Baz for T where T: Foo { - type Quux<'a> = T; - - type Baa<'a> = &'a <T as Foo>::Bar<'a, 'static>; - //~^ ERROR lifetime arguments are not allowed for this type [E0109] -} - -fn main() {} diff --git a/src/test/ui/rfc1598-generic-associated-types/construct_with_other_type.stderr b/src/test/ui/rfc1598-generic-associated-types/construct_with_other_type.stderr deleted file mode 100644 index ab161ae21b..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/construct_with_other_type.stderr +++ /dev/null @@ -1,29 +0,0 @@ -warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash - --> $DIR/construct_with_other_type.rs:1:12 - | -LL | #![feature(generic_associated_types)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/construct_with_other_type.rs:17:46 - | -LL | type Baa<'a>: Deref<Target = <Self::Quux<'a> as Foo>::Bar<'a, 'static>>; - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/construct_with_other_type.rs:17:63 - | -LL | type Baa<'a>: Deref<Target = <Self::Quux<'a> as Foo>::Bar<'a, 'static>>; - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/construct_with_other_type.rs:25:40 - | -LL | type Baa<'a> = &'a <T as Foo>::Bar<'a, 'static>; - | ^^ lifetime argument not allowed - -error: aborting due to 3 previous errors - -For more information about this error, try `rustc --explain E0109`. diff --git a/src/test/ui/rfc1598-generic-associated-types/empty_generics.stderr b/src/test/ui/rfc1598-generic-associated-types/empty_generics.stderr deleted file mode 100644 index 9c8d3f192d..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/empty_generics.stderr +++ /dev/null @@ -1,16 +0,0 @@ -error: expected one of `>`, `const`, identifier, or lifetime, found `,` - --> $DIR/empty_generics.rs:5:14 - | -LL | type Bar<,>; - | ^ expected one of `>`, `const`, identifier, or lifetime - -warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash - --> $DIR/empty_generics.rs:1:12 - | -LL | #![feature(generic_associated_types)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -error: aborting due to previous error - diff --git a/src/test/ui/rfc1598-generic-associated-types/gat-dont-ice-on-absent-feature.stderr b/src/test/ui/rfc1598-generic-associated-types/gat-dont-ice-on-absent-feature.stderr deleted file mode 100644 index fb43a50df7..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/gat-dont-ice-on-absent-feature.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0658]: generic associated types are unstable - --> $DIR/gat-dont-ice-on-absent-feature.rs:7:5 - | -LL | type Item<'b> = &'b Foo; - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: for more information, see https://github.com/rust-lang/rust/issues/44265 - = help: add `#![feature(generic_associated_types)]` to the crate attributes to enable - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/rfc1598-generic-associated-types/generic-associated-types-where.stderr b/src/test/ui/rfc1598-generic-associated-types/generic-associated-types-where.stderr deleted file mode 100644 index 0d319a7a59..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/generic-associated-types-where.stderr +++ /dev/null @@ -1,8 +0,0 @@ -warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash - --> $DIR/generic-associated-types-where.rs:1:12 - | -LL | #![feature(generic_associated_types)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - diff --git a/src/test/ui/rfc1598-generic-associated-types/generic_associated_type_undeclared_lifetimes.rs b/src/test/ui/rfc1598-generic-associated-types/generic_associated_type_undeclared_lifetimes.rs deleted file mode 100644 index 150899a034..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/generic_associated_type_undeclared_lifetimes.rs +++ /dev/null @@ -1,22 +0,0 @@ -#![feature(generic_associated_types)] -//~^ WARNING the feature `generic_associated_types` is incomplete - -use std::ops::Deref; - -// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a -// follow-up PR. - -trait Iterable { - type Item<'a>; - type Iter<'a>: Iterator<Item = Self::Item<'a>> - //~^ ERROR lifetime arguments are not allowed for this type [E0109] - + Deref<Target = Self::Item<'b>>; - //~^ ERROR undeclared lifetime - //~| ERROR lifetime arguments are not allowed for this type [E0109] - - fn iter<'a>(&'a self) -> Self::Iter<'undeclared>; - //~^ ERROR undeclared lifetime - //~| ERROR lifetime arguments are not allowed for this type [E0109] -} - -fn main() {} diff --git a/src/test/ui/rfc1598-generic-associated-types/generic_associated_type_undeclared_lifetimes.stderr b/src/test/ui/rfc1598-generic-associated-types/generic_associated_type_undeclared_lifetimes.stderr deleted file mode 100644 index 40ea42f624..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/generic_associated_type_undeclared_lifetimes.stderr +++ /dev/null @@ -1,42 +0,0 @@ -warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash - --> $DIR/generic_associated_type_undeclared_lifetimes.rs:1:12 - | -LL | #![feature(generic_associated_types)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/generic_associated_type_undeclared_lifetimes.rs:13:37 - | -LL | + Deref<Target = Self::Item<'b>>; - | ^^ undeclared lifetime - -error[E0261]: use of undeclared lifetime name `'undeclared` - --> $DIR/generic_associated_type_undeclared_lifetimes.rs:17:41 - | -LL | fn iter<'a>(&'a self) -> Self::Iter<'undeclared>; - | ^^^^^^^^^^^ undeclared lifetime - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/generic_associated_type_undeclared_lifetimes.rs:11:47 - | -LL | type Iter<'a>: Iterator<Item = Self::Item<'a>> - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/generic_associated_type_undeclared_lifetimes.rs:13:37 - | -LL | + Deref<Target = Self::Item<'b>>; - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/generic_associated_type_undeclared_lifetimes.rs:17:41 - | -LL | fn iter<'a>(&'a self) -> Self::Iter<'undeclared>; - | ^^^^^^^^^^^ lifetime argument not allowed - -error: aborting due to 5 previous errors - -Some errors have detailed explanations: E0109, E0261. -For more information about an error, try `rustc --explain E0109`. diff --git a/src/test/ui/rfc1598-generic-associated-types/iterable.rs b/src/test/ui/rfc1598-generic-associated-types/iterable.rs deleted file mode 100644 index 29953b9db1..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/iterable.rs +++ /dev/null @@ -1,50 +0,0 @@ -#![feature(generic_associated_types)] -//~^ WARNING the feature `generic_associated_types` is incomplete - -use std::ops::Deref; - -// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a -// follow-up PR. - -trait Iterable { - type Item<'a>; - type Iter<'a>: Iterator<Item = Self::Item<'a>>; - //~^ ERROR lifetime arguments are not allowed for this type [E0109] - - fn iter<'a>(&'a self) -> Self::Iter<'a>; - //~^ ERROR lifetime arguments are not allowed for this type [E0109] -} - -// Impl for struct type -impl<T> Iterable for Vec<T> { - type Item<'a> = &'a T; - type Iter<'a> = std::slice::Iter<'a, T>; - - fn iter<'a>(&'a self) -> Self::Iter<'a> { - //~^ ERROR lifetime arguments are not allowed for this type [E0109] - self.iter() - } -} - -// Impl for a primitive type -impl<T> Iterable for [T] { - type Item<'a> = &'a T; - type Iter<'a> = std::slice::Iter<'a, T>; - - fn iter<'a>(&'a self) -> Self::Iter<'a> { - //~^ ERROR lifetime arguments are not allowed for this type [E0109] - self.iter() - } -} - -fn make_iter<'a, I: Iterable>(it: &'a I) -> I::Iter<'a> { - //~^ ERROR lifetime arguments are not allowed for this type [E0109] - it.iter() -} - -fn get_first<'a, I: Iterable>(it: &'a I) -> Option<I::Item<'a>> { - //~^ ERROR lifetime arguments are not allowed for this type [E0109] - it.iter().next() -} - -fn main() {} diff --git a/src/test/ui/rfc1598-generic-associated-types/iterable.stderr b/src/test/ui/rfc1598-generic-associated-types/iterable.stderr deleted file mode 100644 index 51246d3c90..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/iterable.stderr +++ /dev/null @@ -1,47 +0,0 @@ -warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash - --> $DIR/iterable.rs:1:12 - | -LL | #![feature(generic_associated_types)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/iterable.rs:11:47 - | -LL | type Iter<'a>: Iterator<Item = Self::Item<'a>>; - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/iterable.rs:40:53 - | -LL | fn make_iter<'a, I: Iterable>(it: &'a I) -> I::Iter<'a> { - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/iterable.rs:45:60 - | -LL | fn get_first<'a, I: Iterable>(it: &'a I) -> Option<I::Item<'a>> { - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/iterable.rs:14:41 - | -LL | fn iter<'a>(&'a self) -> Self::Iter<'a>; - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/iterable.rs:23:41 - | -LL | fn iter<'a>(&'a self) -> Self::Iter<'a> { - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/iterable.rs:34:41 - | -LL | fn iter<'a>(&'a self) -> Self::Iter<'a> { - | ^^ lifetime argument not allowed - -error: aborting due to 6 previous errors - -For more information about this error, try `rustc --explain E0109`. diff --git a/src/test/ui/rfc1598-generic-associated-types/parameter_number_and_kind.rs b/src/test/ui/rfc1598-generic-associated-types/parameter_number_and_kind.rs deleted file mode 100644 index aa3f4b186d..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/parameter_number_and_kind.rs +++ /dev/null @@ -1,47 +0,0 @@ -#![feature(generic_associated_types)] -//~^ WARNING the feature `generic_associated_types` is incomplete -#![feature(associated_type_defaults)] - -// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a -// follow-up PR. - -// FIXME(#44265): Update expected errors once E110 is resolved, now does not get past `trait Foo`. - -trait Foo { - type A<'a>; - type B<'a, 'b>; - type C; - type D<T>; - type E<'a, T>; - // Test parameters in default values - type FOk<T> = Self::E<'static, T>; - //~^ ERROR type arguments are not allowed for this type [E0109] - //~| ERROR lifetime arguments are not allowed for this type [E0109] - type FErr1 = Self::E<'static, 'static>; // Error - //~^ ERROR lifetime arguments are not allowed for this type [E0109] - type FErr2<T> = Self::E<'static, T, u32>; // Error - //~^ ERROR type arguments are not allowed for this type [E0109] - //~| ERROR lifetime arguments are not allowed for this type [E0109] -} - -struct Fooy; - -impl Foo for Fooy { - type A = u32; // Error: parameter expected - type B<'a, T> = Vec<T>; // Error: lifetime param expected - type C<'a> = u32; // Error: no param expected - type D<'a> = u32; // Error: type param expected - type E<T, U> = u32; // Error: lifetime expected as the first param -} - -struct Fooer; - -impl Foo for Fooer { - type A<T> = u32; // Error: lifetime parameter expected - type B<'a> = u32; // Error: another lifetime param expected - type C<T> = T; // Error: no param expected - type D<'b, T> = u32; // Error: unexpected lifetime param - type E<'a, 'b> = u32; // Error: type expected as the second param -} - -fn main() {} diff --git a/src/test/ui/rfc1598-generic-associated-types/parameter_number_and_kind.stderr b/src/test/ui/rfc1598-generic-associated-types/parameter_number_and_kind.stderr deleted file mode 100644 index 65dbd00c5b..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/parameter_number_and_kind.stderr +++ /dev/null @@ -1,41 +0,0 @@ -warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash - --> $DIR/parameter_number_and_kind.rs:1:12 - | -LL | #![feature(generic_associated_types)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/parameter_number_and_kind.rs:17:27 - | -LL | type FOk<T> = Self::E<'static, T>; - | ^^^^^^^ lifetime argument not allowed - -error[E0109]: type arguments are not allowed for this type - --> $DIR/parameter_number_and_kind.rs:17:36 - | -LL | type FOk<T> = Self::E<'static, T>; - | ^ type argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/parameter_number_and_kind.rs:20:26 - | -LL | type FErr1 = Self::E<'static, 'static>; // Error - | ^^^^^^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/parameter_number_and_kind.rs:22:29 - | -LL | type FErr2<T> = Self::E<'static, T, u32>; // Error - | ^^^^^^^ lifetime argument not allowed - -error[E0109]: type arguments are not allowed for this type - --> $DIR/parameter_number_and_kind.rs:22:38 - | -LL | type FErr2<T> = Self::E<'static, T, u32>; // Error - | ^ type argument not allowed - -error: aborting due to 5 previous errors - -For more information about this error, try `rustc --explain E0109`. diff --git a/src/test/ui/rfc1598-generic-associated-types/pointer_family.stderr b/src/test/ui/rfc1598-generic-associated-types/pointer_family.stderr deleted file mode 100644 index 626495350a..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/pointer_family.stderr +++ /dev/null @@ -1,35 +0,0 @@ -warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash - --> $DIR/pointer_family.rs:1:12 - | -LL | #![feature(generic_associated_types)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -error[E0109]: type arguments are not allowed for this type - --> $DIR/pointer_family.rs:37:21 - | -LL | bar: P::Pointer<String>, - | ^^^^^^ type argument not allowed - -error[E0109]: type arguments are not allowed for this type - --> $DIR/pointer_family.rs:12:42 - | -LL | fn new<T>(value: T) -> Self::Pointer<T>; - | ^ type argument not allowed - -error[E0109]: type arguments are not allowed for this type - --> $DIR/pointer_family.rs:20:42 - | -LL | fn new<T>(value: T) -> Self::Pointer<T> { - | ^ type argument not allowed - -error[E0109]: type arguments are not allowed for this type - --> $DIR/pointer_family.rs:30:42 - | -LL | fn new<T>(value: T) -> Self::Pointer<T> { - | ^ type argument not allowed - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0109`. diff --git a/src/test/ui/rfc1598-generic-associated-types/streaming_iterator.stderr b/src/test/ui/rfc1598-generic-associated-types/streaming_iterator.stderr deleted file mode 100644 index 09dd654b57..0000000000 --- a/src/test/ui/rfc1598-generic-associated-types/streaming_iterator.stderr +++ /dev/null @@ -1,41 +0,0 @@ -warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash - --> $DIR/streaming_iterator.rs:1:12 - | -LL | #![feature(generic_associated_types)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/streaming_iterator.rs:18:41 - | -LL | bar: <T as StreamingIterator>::Item<'static>, - | ^^^^^^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/streaming_iterator.rs:26:64 - | -LL | fn foo<T>(iter: T) where T: StreamingIterator, for<'a> T::Item<'a>: Display { /* ... */ } - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/streaming_iterator.rs:12:48 - | -LL | fn next<'a>(&'a self) -> Option<Self::Item<'a>>; - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/streaming_iterator.rs:38:37 - | -LL | type Item<'a> = (usize, I::Item<'a>); - | ^^ lifetime argument not allowed - -error[E0109]: lifetime arguments are not allowed for this type - --> $DIR/streaming_iterator.rs:40:48 - | -LL | fn next<'a>(&'a self) -> Option<Self::Item<'a>> { - | ^^ lifetime argument not allowed - -error: aborting due to 5 previous errors - -For more information about this error, try `rustc --explain E0109`. diff --git a/src/test/ui/rfc1623.stderr b/src/test/ui/rfc1623.stderr index 171c00ba7b..5b665e1814 100644 --- a/src/test/ui/rfc1623.stderr +++ b/src/test/ui/rfc1623.stderr @@ -2,7 +2,7 @@ error[E0106]: missing lifetime specifier --> $DIR/rfc1623.rs:8:42 | LL | static NON_ELIDABLE_FN: &fn(&u8, &u8) -> &u8 = - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from argument 1 or argument 2 @@ -10,7 +10,7 @@ error[E0106]: missing lifetime specifier --> $DIR/rfc1623.rs:10:39 | LL | &(non_elidable as fn(&u8, &u8) -> &u8); - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from argument 1 or argument 2 diff --git a/src/test/ui/rfcs/rfc-2005-default-binding-mode/slice.rs b/src/test/ui/rfcs/rfc-2005-default-binding-mode/slice.rs index 38b0941aad..33229a205f 100644 --- a/src/test/ui/rfcs/rfc-2005-default-binding-mode/slice.rs +++ b/src/test/ui/rfcs/rfc-2005-default-binding-mode/slice.rs @@ -1,5 +1,4 @@ // run-pass -#![feature(slice_patterns)] fn slice_pat() { let sl: &[u8] = b"foo"; diff --git a/src/test/ui/rfcs/rfc1717/auxiliary/clibrary.rs b/src/test/ui/rfcs/rfc1717/auxiliary/clibrary.rs deleted file mode 100644 index c1c5b70bc0..0000000000 --- a/src/test/ui/rfcs/rfc1717/auxiliary/clibrary.rs +++ /dev/null @@ -1,5 +0,0 @@ -// no-prefer-dynamic -#![crate_type = "staticlib"] - -#[no_mangle] -pub extern "C" fn foo(x:i32) -> i32 { x } diff --git a/src/test/ui/rmeta-rpass.rs b/src/test/ui/rmeta-rpass.rs index 5a63b5b859..173a6a394e 100644 --- a/src/test/ui/rmeta-rpass.rs +++ b/src/test/ui/rmeta-rpass.rs @@ -1,6 +1,11 @@ // run-pass // Test that using rlibs and rmeta dep crates work together. Specifically, that -// there can be both an rmeta and an rlib file and rustc will prefer the rlib. +// there can be both an rmeta and an rlib file and rustc will prefer the rmeta +// file. +// +// This behavior is simply making sure this doesn't accidentally change; in this +// case we want to make sure that the rlib isn't being used as that would cause +// bugs in -Zbinary-dep-depinfo (see #68298). // aux-build:rmeta-rmeta.rs // aux-build:rmeta-rlib-rpass.rs @@ -9,5 +14,5 @@ extern crate rmeta_aux; use rmeta_aux::Foo; pub fn main() { - let _ = Foo { field: 42 }; + let _ = Foo { field2: 42 }; } diff --git a/src/test/ui/rmeta_lib.rs b/src/test/ui/rmeta_lib.rs index 6c74aec32e..fa6826450c 100644 --- a/src/test/ui/rmeta_lib.rs +++ b/src/test/ui/rmeta_lib.rs @@ -1,3 +1,4 @@ +// build-fail // aux-build:rmeta-meta.rs // no-prefer-dynamic // error-pattern: crate `rmeta_meta` required to be available in rlib format, but was not found diff --git a/src/test/ui/rust-2018/uniform-paths/cross-crate.rs b/src/test/ui/rust-2018/uniform-paths/cross-crate.rs index 27d6dbf468..0ca7fa37a3 100644 --- a/src/test/ui/rust-2018/uniform-paths/cross-crate.rs +++ b/src/test/ui/rust-2018/uniform-paths/cross-crate.rs @@ -6,6 +6,7 @@ use cross_crate::*; #[built_in_attr] //~ ERROR cannot use a built-in attribute through an import #[tool_mod::skip] //~ ERROR cannot use a tool module through an import + //~| ERROR cannot use a tool module through an import fn main() { let _: built_in_type; // OK } diff --git a/src/test/ui/rust-2018/uniform-paths/cross-crate.stderr b/src/test/ui/rust-2018/uniform-paths/cross-crate.stderr index fdde75faf5..45f77a0c9f 100644 --- a/src/test/ui/rust-2018/uniform-paths/cross-crate.stderr +++ b/src/test/ui/rust-2018/uniform-paths/cross-crate.stderr @@ -22,5 +22,17 @@ note: the tool module imported here LL | use cross_crate::*; | ^^^^^^^^^^^^^^ -error: aborting due to 2 previous errors +error: cannot use a tool module through an import + --> $DIR/cross-crate.rs:8:3 + | +LL | #[tool_mod::skip] + | ^^^^^^^^ + | +note: the tool module imported here + --> $DIR/cross-crate.rs:5:5 + | +LL | use cross_crate::*; + | ^^^^^^^^^^^^^^ + +error: aborting due to 3 previous errors diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs index 541fc1be4e..44da71de08 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.rs @@ -15,5 +15,7 @@ mod tool_mod { #[imported_inline] //~ ERROR cannot use a built-in attribute through an import #[builtin::imported_inline] //~ ERROR cannot use a built-in attribute through an import #[imported_rustfmt::skip] //~ ERROR cannot use a tool module through an import + //~| ERROR cannot use a tool module through an import #[tool_mod::imported_rustfmt::skip] //~ ERROR cannot use a tool module through an import + //~| ERROR cannot use a tool module through an import fn main() {} diff --git a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr index fc6453193b..908bb49858 100644 --- a/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr +++ b/src/test/ui/rust-2018/uniform-paths/prelude-fail-2.stderr @@ -29,7 +29,7 @@ LL | use rustfmt as imported_rustfmt; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: cannot use a tool module through an import - --> $DIR/prelude-fail-2.rs:18:13 + --> $DIR/prelude-fail-2.rs:19:13 | LL | #[tool_mod::imported_rustfmt::skip] | ^^^^^^^^^^^^^^^^ @@ -40,5 +40,29 @@ note: the tool module imported here LL | pub use rustfmt as imported_rustfmt; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to 4 previous errors +error: cannot use a tool module through an import + --> $DIR/prelude-fail-2.rs:17:3 + | +LL | #[imported_rustfmt::skip] + | ^^^^^^^^^^^^^^^^ + | +note: the tool module imported here + --> $DIR/prelude-fail-2.rs:10:5 + | +LL | use rustfmt as imported_rustfmt; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: cannot use a tool module through an import + --> $DIR/prelude-fail-2.rs:19:13 + | +LL | #[tool_mod::imported_rustfmt::skip] + | ^^^^^^^^^^^^^^^^ + | +note: the tool module imported here + --> $DIR/prelude-fail-2.rs:12:13 + | +LL | pub use rustfmt as imported_rustfmt; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 6 previous errors diff --git a/src/test/ui/sanitizer-address.rs b/src/test/ui/sanitizer-address.rs new file mode 100644 index 0000000000..d27a30a2dc --- /dev/null +++ b/src/test/ui/sanitizer-address.rs @@ -0,0 +1,21 @@ +// needs-sanitizer-support +// only-x86_64 +// +// compile-flags: -Z sanitizer=address -O +// +// run-fail +// error-pattern: AddressSanitizer: stack-buffer-overflow +// error-pattern: 'xs' <== Memory access at offset + +#![feature(test)] + +use std::hint::black_box; +use std::mem; + +fn main() { + let xs = [0, 1, 2, 3]; + // Avoid optimizing everything out. + let xs = black_box(xs.as_ptr()); + let code = unsafe { *xs.offset(4) }; + std::process::exit(code); +} diff --git a/src/test/ui/sanitizer-leak.rs b/src/test/ui/sanitizer-leak.rs new file mode 100644 index 0000000000..5c2f2cb4e8 --- /dev/null +++ b/src/test/ui/sanitizer-leak.rs @@ -0,0 +1,21 @@ +// needs-sanitizer-support +// only-x86_64 +// +// compile-flags: -Z sanitizer=leak -O +// +// run-fail +// error-pattern: LeakSanitizer: detected memory leaks + +#![feature(test)] + +use std::hint::black_box; +use std::mem; + +fn main() { + for _ in 0..10 { + let xs = vec![1, 2, 3]; + // Prevent compiler from removing the memory allocation. + let xs = black_box(xs); + mem::forget(xs); + } +} diff --git a/src/test/ui/sanitizer-memory.rs b/src/test/ui/sanitizer-memory.rs new file mode 100644 index 0000000000..3e1cf4509a --- /dev/null +++ b/src/test/ui/sanitizer-memory.rs @@ -0,0 +1,44 @@ +// needs-sanitizer-support +// only-linux +// only-x86_64 +// +// compile-flags: -Z sanitizer=memory -Zsanitizer-memory-track-origins -O +// +// run-fail +// error-pattern: MemorySanitizer: use-of-uninitialized-value +// error-pattern: Uninitialized value was created by an allocation +// error-pattern: in the stack frame of function 'random' +// +// This test case intentionally limits the usage of the std, +// since it will be linked with an uninstrumented version of it. + +#![feature(core_intrinsics)] +#![feature(start)] +#![feature(test)] + +use std::hint::black_box; +use std::mem::MaybeUninit; + +#[inline(never)] +#[no_mangle] +fn random() -> [isize; 32] { + let r = unsafe { MaybeUninit::uninit().assume_init() }; + // Avoid optimizing everything out. + black_box(r) +} + +#[inline(never)] +#[no_mangle] +fn xor(a: &[isize]) -> isize { + let mut s = 0; + for i in 0..a.len() { + s = s ^ a[i]; + } + s +} + +#[start] +fn main(_: isize, _: *const *const u8) -> isize { + let r = random(); + xor(&r) +} diff --git a/src/test/ui/sanitizer-unsupported-target.rs b/src/test/ui/sanitizer-unsupported-target.rs new file mode 100644 index 0000000000..444333c3f0 --- /dev/null +++ b/src/test/ui/sanitizer-unsupported-target.rs @@ -0,0 +1,7 @@ +// ignore-tidy-linelength +// compile-flags: -Z sanitizer=leak --target i686-unknown-linux-gnu +// error-pattern: error: LeakSanitizer only works with the `x86_64-unknown-linux-gnu` or `x86_64-apple-darwin` target + +#![feature(no_core)] +#![no_core] +#![no_main] diff --git a/src/test/ui/sanitizer-unsupported-target.stderr b/src/test/ui/sanitizer-unsupported-target.stderr new file mode 100644 index 0000000000..38be58dd4b --- /dev/null +++ b/src/test/ui/sanitizer-unsupported-target.stderr @@ -0,0 +1,4 @@ +error: LeakSanitizer only works with the `x86_64-unknown-linux-gnu` or `x86_64-apple-darwin` target + +error: aborting due to previous error + diff --git a/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait-async.nll.stderr b/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait-async.nll.stderr index 5a63553adc..f2e556c63c 100644 --- a/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait-async.nll.stderr +++ b/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait-async.nll.stderr @@ -6,7 +6,7 @@ LL | async fn f(self: Pin<&Self>) -> impl Clone { self } | | | let's call the lifetime of this reference `'1` | -help: to allow this `impl Trait` to capture borrowed data with lifetime `'1`, add `'_` as a constraint +help: to allow this `impl Trait` to capture borrowed data with lifetime `'1`, add `'_` as a bound | LL | async fn f(self: Pin<&Self>) -> impl Clone + '_ { self } | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait.nll.stderr b/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait.nll.stderr index b46c6b9b71..b76966e869 100644 --- a/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait.nll.stderr +++ b/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait.nll.stderr @@ -6,7 +6,7 @@ LL | fn f(self: Pin<&Self>) -> impl Clone { self } | | | let's call the lifetime of this reference `'1` | -help: to allow this `impl Trait` to capture borrowed data with lifetime `'1`, add `'_` as a constraint +help: to allow this `impl Trait` to capture borrowed data with lifetime `'1`, add `'_` as a bound | LL | fn f(self: Pin<&Self>) -> impl Clone + '_ { self } | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait.stderr b/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait.stderr index 5118280e7e..9f54149951 100644 --- a/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait.stderr +++ b/src/test/ui/self/arbitrary_self_types_pin_lifetime_impl_trait.stderr @@ -11,7 +11,7 @@ note: ...can't outlive the anonymous lifetime #1 defined on the method body at 8 | LL | fn f(self: Pin<&Self>) -> impl Clone { self } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -help: you can add a constraint to the return type to make it last less than `'static` and match the anonymous lifetime #1 defined on the method body at 8:5 +help: you can add a bound to the return type to make it last less than `'static` and match the anonymous lifetime #1 defined on the method body at 8:5 | LL | fn f(self: Pin<&Self>) -> impl Clone + '_ { self } | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/self/point-at-arbitrary-self-type-method.stderr b/src/test/ui/self/point-at-arbitrary-self-type-method.stderr index dec5809f15..96401cb71d 100644 --- a/src/test/ui/self/point-at-arbitrary-self-type-method.stderr +++ b/src/test/ui/self/point-at-arbitrary-self-type-method.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `foo` found for type `A` in the current scope +error[E0599]: no method named `foo` found for struct `A` in the current scope --> $DIR/point-at-arbitrary-self-type-method.rs:8:7 | LL | struct A; diff --git a/src/test/ui/self/point-at-arbitrary-self-type-trait-method.stderr b/src/test/ui/self/point-at-arbitrary-self-type-trait-method.stderr index e93c4da9df..28a7b68a68 100644 --- a/src/test/ui/self/point-at-arbitrary-self-type-trait-method.stderr +++ b/src/test/ui/self/point-at-arbitrary-self-type-trait-method.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `foo` found for type `A` in the current scope +error[E0599]: no method named `foo` found for struct `A` in the current scope --> $DIR/point-at-arbitrary-self-type-trait-method.rs:9:7 | LL | trait B { fn foo(self: Box<Self>); } diff --git a/src/test/ui/self/self-infer.rs b/src/test/ui/self/self-infer.rs index 0956f2a569..77c8052123 100644 --- a/src/test/ui/self/self-infer.rs +++ b/src/test/ui/self/self-infer.rs @@ -2,7 +2,9 @@ struct S; impl S { fn f(self: _) {} //~ERROR the type placeholder `_` is not allowed within types on item sig + //~^ ERROR the type placeholder `_` is not allowed within types on item sig fn g(self: &_) {} //~ERROR the type placeholder `_` is not allowed within types on item sig + //~^ ERROR the type placeholder `_` is not allowed within types on item sig } fn main() {} diff --git a/src/test/ui/self/self-infer.stderr b/src/test/ui/self/self-infer.stderr index f91cfe5eb6..d6bf8b44d6 100644 --- a/src/test/ui/self/self-infer.stderr +++ b/src/test/ui/self/self-infer.stderr @@ -5,11 +5,33 @@ LL | fn f(self: _) {} | ^ not allowed in type signatures error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/self-infer.rs:5:17 + --> $DIR/self-infer.rs:4:16 + | +LL | fn f(self: _) {} + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn f<T>(self: T) {} + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/self-infer.rs:6:17 | LL | fn g(self: &_) {} | ^ not allowed in type signatures -error: aborting due to 2 previous errors +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/self-infer.rs:6:17 + | +LL | fn g(self: &_) {} + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn g<T>(self: &T) {} + | ^^^ ^ + +error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0121`. diff --git a/src/test/ui/self/suggest-self-2.rs b/src/test/ui/self/suggest-self-2.rs new file mode 100644 index 0000000000..1e001827e4 --- /dev/null +++ b/src/test/ui/self/suggest-self-2.rs @@ -0,0 +1,25 @@ +struct Foo {} + +impl Foo { + fn foo(&self) { + bar(self); + //~^ ERROR cannot find function `bar` in this scope + //~| HELP try calling `bar` as a method + + bar(&&self, 102); + //~^ ERROR cannot find function `bar` in this scope + //~| HELP try calling `bar` as a method + + bar(&mut self, 102, &"str"); + //~^ ERROR cannot find function `bar` in this scope + //~| HELP try calling `bar` as a method + + bar(); + //~^ ERROR cannot find function `bar` in this scope + + self.bar(); + //~^ ERROR no method named `bar` found for reference + } +} + +fn main() {} diff --git a/src/test/ui/self/suggest-self-2.stderr b/src/test/ui/self/suggest-self-2.stderr new file mode 100644 index 0000000000..4bd025ea07 --- /dev/null +++ b/src/test/ui/self/suggest-self-2.stderr @@ -0,0 +1,40 @@ +error[E0425]: cannot find function `bar` in this scope + --> $DIR/suggest-self-2.rs:5:9 + | +LL | bar(self); + | ^^^------ + | | + | help: try calling `bar` as a method: `self.bar()` + +error[E0425]: cannot find function `bar` in this scope + --> $DIR/suggest-self-2.rs:9:9 + | +LL | bar(&&self, 102); + | ^^^------------- + | | + | help: try calling `bar` as a method: `self.bar(102)` + +error[E0425]: cannot find function `bar` in this scope + --> $DIR/suggest-self-2.rs:13:9 + | +LL | bar(&mut self, 102, &"str"); + | ^^^------------------------ + | | + | help: try calling `bar` as a method: `self.bar(102, &"str")` + +error[E0425]: cannot find function `bar` in this scope + --> $DIR/suggest-self-2.rs:17:9 + | +LL | bar(); + | ^^^ not found in this scope + +error[E0599]: no method named `bar` found for reference `&Foo` in the current scope + --> $DIR/suggest-self-2.rs:20:14 + | +LL | self.bar(); + | ^^^ method not found in `&Foo` + +error: aborting due to 5 previous errors + +Some errors have detailed explanations: E0425, E0599. +For more information about an error, try `rustc --explain E0425`. diff --git a/src/test/ui/shadowed/shadowed-trait-methods.stderr b/src/test/ui/shadowed/shadowed-trait-methods.stderr index 3597cc5342..362907ecbd 100644 --- a/src/test/ui/shadowed/shadowed-trait-methods.stderr +++ b/src/test/ui/shadowed/shadowed-trait-methods.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `f` found for type `()` in the current scope +error[E0599]: no method named `f` found for unit type `()` in the current scope --> $DIR/shadowed-trait-methods.rs:13:8 | LL | ().f() diff --git a/src/test/ui/shadowed/shadowed-use-visibility.rs b/src/test/ui/shadowed/shadowed-use-visibility.rs index 8185e82ee8..6b801972f4 100644 --- a/src/test/ui/shadowed/shadowed-use-visibility.rs +++ b/src/test/ui/shadowed/shadowed-use-visibility.rs @@ -6,11 +6,11 @@ mod foo { } mod bar { - use foo::bar::f as g; //~ ERROR module `bar` is private + use foo::bar::f as g; //~ ERROR module import `bar` is private use foo as f; pub use foo::*; } -use bar::f::f; //~ ERROR module `f` is private +use bar::f::f; //~ ERROR module import `f` is private fn main() {} diff --git a/src/test/ui/shadowed/shadowed-use-visibility.stderr b/src/test/ui/shadowed/shadowed-use-visibility.stderr index 7c66fdf60b..cd8ec13794 100644 --- a/src/test/ui/shadowed/shadowed-use-visibility.stderr +++ b/src/test/ui/shadowed/shadowed-use-visibility.stderr @@ -1,14 +1,26 @@ -error[E0603]: module `bar` is private +error[E0603]: module import `bar` is private --> $DIR/shadowed-use-visibility.rs:9:14 | LL | use foo::bar::f as g; - | ^^^ + | ^^^ this module import is private + | +note: the module import `bar` is defined here + --> $DIR/shadowed-use-visibility.rs:4:9 + | +LL | use foo as bar; + | ^^^^^^^^^^ -error[E0603]: module `f` is private +error[E0603]: module import `f` is private --> $DIR/shadowed-use-visibility.rs:15:10 | LL | use bar::f::f; - | ^ + | ^ this module import is private + | +note: the module import `f` is defined here + --> $DIR/shadowed-use-visibility.rs:11:9 + | +LL | use foo as f; + | ^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.rs index 65cf31f2f1..4d23a1911a 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.rs @@ -1,3 +1,4 @@ +// build-fail // ignore-emscripten // ignore-tidy-linelength #![feature(repr_simd, platform_intrinsics)] diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.stderr index 0e88540bcc..1ed472a485 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.stderr @@ -1,11 +1,11 @@ error[E0511]: invalid monomorphization of `simd_saturating_add` intrinsic: expected element type `f32` of vector type `f32x4` to be a signed or unsigned integer type - --> $DIR/simd-intrinsic-generic-arithmetic-saturating.rs:33:9 + --> $DIR/simd-intrinsic-generic-arithmetic-saturating.rs:34:9 | LL | simd_saturating_add(z, z); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_saturating_sub` intrinsic: expected element type `f32` of vector type `f32x4` to be a signed or unsigned integer type - --> $DIR/simd-intrinsic-generic-arithmetic-saturating.rs:35:9 + --> $DIR/simd-intrinsic-generic-arithmetic-saturating.rs:36:9 | LL | simd_saturating_sub(z, z); | ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.rs index 7686b389a7..f95f548fee 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(repr_simd, platform_intrinsics)] #![allow(non_camel_case_types)] #[repr(simd)] diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.stderr index 27493950af..70cdc34684 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.stderr @@ -1,83 +1,83 @@ error[E0511]: invalid monomorphization of `simd_add` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:62:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:64:9 | LL | simd_add(0, 0); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_sub` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:64:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:66:9 | LL | simd_sub(0, 0); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_mul` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:66:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:68:9 | LL | simd_mul(0, 0); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_div` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:68:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:70:9 | LL | simd_div(0, 0); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shl` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:70:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:72:9 | LL | simd_shl(0, 0); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shr` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:72:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:74:9 | LL | simd_shr(0, 0); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_and` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:74:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:76:9 | LL | simd_and(0, 0); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_or` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:76:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:78:9 | LL | simd_or(0, 0); | ^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_xor` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:78:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:80:9 | LL | simd_xor(0, 0); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shl` intrinsic: unsupported operation on `f32x4` with element `f32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:82:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:84:9 | LL | simd_shl(z, z); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shr` intrinsic: unsupported operation on `f32x4` with element `f32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:84:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:86:9 | LL | simd_shr(z, z); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_and` intrinsic: unsupported operation on `f32x4` with element `f32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:86:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:88:9 | LL | simd_and(z, z); | ^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_or` intrinsic: unsupported operation on `f32x4` with element `f32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:88:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:90:9 | LL | simd_or(z, z); | ^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_xor` intrinsic: unsupported operation on `f32x4` with element `f32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:90:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:92:9 | LL | simd_xor(z, z); | ^^^^^^^^^^^^^^ diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs index 931ee9db1f..ed267d8411 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs @@ -1,3 +1,5 @@ +// build-fail + // Test that the simd_bitmask intrinsic produces ok-ish error // messages when misused. diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.stderr index d016838d09..8cb235b778 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.stderr @@ -1,29 +1,29 @@ error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u8` - --> $DIR/simd-intrinsic-generic-bitmask.rs:74:22 + --> $DIR/simd-intrinsic-generic-bitmask.rs:76:22 | LL | let _: u16 = simd_bitmask(m2); | ^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u8` - --> $DIR/simd-intrinsic-generic-bitmask.rs:77:22 + --> $DIR/simd-intrinsic-generic-bitmask.rs:79:22 | LL | let _: u16 = simd_bitmask(m8); | ^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u32`, expected `u16` - --> $DIR/simd-intrinsic-generic-bitmask.rs:80:22 + --> $DIR/simd-intrinsic-generic-bitmask.rs:82:22 | LL | let _: u32 = simd_bitmask(m16); | ^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u64`, expected `u32` - --> $DIR/simd-intrinsic-generic-bitmask.rs:83:22 + --> $DIR/simd-intrinsic-generic-bitmask.rs:85:22 | LL | let _: u64 = simd_bitmask(m32); | ^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u128`, expected `u64` - --> $DIR/simd-intrinsic-generic-bitmask.rs:86:23 + --> $DIR/simd-intrinsic-generic-bitmask.rs:88:23 | LL | let _: u128 = simd_bitmask(m64); | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-cast.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-cast.rs index c4016e75b1..4f4fa06b00 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-cast.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-cast.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(repr_simd, platform_intrinsics)] #[repr(simd)] diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-cast.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-cast.stderr index 6e33e3b30f..d794a742b4 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-cast.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-cast.stderr @@ -1,23 +1,23 @@ error[E0511]: invalid monomorphization of `simd_cast` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-cast.rs:32:9 + --> $DIR/simd-intrinsic-generic-cast.rs:34:9 | LL | simd_cast::<i32, i32>(0); | ^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_cast` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-cast.rs:34:9 + --> $DIR/simd-intrinsic-generic-cast.rs:36:9 | LL | simd_cast::<i32, i32x4>(0); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_cast` intrinsic: expected SIMD return type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-cast.rs:36:9 + --> $DIR/simd-intrinsic-generic-cast.rs:38:9 | LL | simd_cast::<i32x4, i32>(x); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_cast` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i32x8` with length 8 - --> $DIR/simd-intrinsic-generic-cast.rs:38:9 + --> $DIR/simd-intrinsic-generic-cast.rs:40:9 | LL | simd_cast::<_, i32x8>(x); | ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-comparison.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-comparison.rs index 3ac47d17da..3cd38042f0 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-comparison.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-comparison.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(repr_simd, platform_intrinsics)] #[repr(simd)] diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-comparison.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-comparison.stderr index d8da2e5ee5..36c6b934d5 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-comparison.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-comparison.stderr @@ -1,107 +1,107 @@ error[E0511]: invalid monomorphization of `simd_eq` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:26:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:28:9 | LL | simd_eq::<i32, i32>(0, 0); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_ne` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:28:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:30:9 | LL | simd_ne::<i32, i32>(0, 0); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_lt` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:30:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:32:9 | LL | simd_lt::<i32, i32>(0, 0); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_le` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:32:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:34:9 | LL | simd_le::<i32, i32>(0, 0); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_gt` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:34:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:36:9 | LL | simd_gt::<i32, i32>(0, 0); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_ge` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:36:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:38:9 | LL | simd_ge::<i32, i32>(0, 0); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_eq` intrinsic: expected SIMD return type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:39:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:41:9 | LL | simd_eq::<_, i32>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_ne` intrinsic: expected SIMD return type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:41:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:43:9 | LL | simd_ne::<_, i32>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_lt` intrinsic: expected SIMD return type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:43:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:45:9 | LL | simd_lt::<_, i32>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_le` intrinsic: expected SIMD return type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:45:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:47:9 | LL | simd_le::<_, i32>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_gt` intrinsic: expected SIMD return type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:47:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:49:9 | LL | simd_gt::<_, i32>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_ge` intrinsic: expected SIMD return type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-comparison.rs:49:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:51:9 | LL | simd_ge::<_, i32>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_eq` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8 - --> $DIR/simd-intrinsic-generic-comparison.rs:52:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:54:9 | LL | simd_eq::<_, i16x8>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_ne` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8 - --> $DIR/simd-intrinsic-generic-comparison.rs:54:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:56:9 | LL | simd_ne::<_, i16x8>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_lt` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8 - --> $DIR/simd-intrinsic-generic-comparison.rs:56:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:58:9 | LL | simd_lt::<_, i16x8>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_le` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8 - --> $DIR/simd-intrinsic-generic-comparison.rs:58:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:60:9 | LL | simd_le::<_, i16x8>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_gt` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8 - --> $DIR/simd-intrinsic-generic-comparison.rs:60:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:62:9 | LL | simd_gt::<_, i16x8>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_ge` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8 - --> $DIR/simd-intrinsic-generic-comparison.rs:62:9 + --> $DIR/simd-intrinsic-generic-comparison.rs:64:9 | LL | simd_ge::<_, i16x8>(x, x); | ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs index 28fcb6c57e..5929d05f4d 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(repr_simd, platform_intrinsics, rustc_attrs)] #[repr(simd)] diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr index 2f8ffb6035..78022c0c8b 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr @@ -1,89 +1,89 @@ error[E0511]: invalid monomorphization of `simd_insert` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-elements.rs:53:9 + --> $DIR/simd-intrinsic-generic-elements.rs:55:9 | LL | simd_insert(0, 0, 0); | ^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_insert` intrinsic: expected inserted type `i32` (element of input `i32x4`), found `f64` - --> $DIR/simd-intrinsic-generic-elements.rs:55:9 + --> $DIR/simd-intrinsic-generic-elements.rs:57:9 | LL | simd_insert(x, 0, 1.0); | ^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_extract` intrinsic: expected return type `i32` (element of input `i32x4`), found `f32` - --> $DIR/simd-intrinsic-generic-elements.rs:57:9 + --> $DIR/simd-intrinsic-generic-elements.rs:59:9 | LL | simd_extract::<_, f32>(x, 0); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle2` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-elements.rs:60:9 + --> $DIR/simd-intrinsic-generic-elements.rs:62:9 | LL | simd_shuffle2::<i32, i32>(0, 0, [0; 2]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle3` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-elements.rs:62:9 + --> $DIR/simd-intrinsic-generic-elements.rs:64:9 | LL | simd_shuffle3::<i32, i32>(0, 0, [0; 3]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle4` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-elements.rs:64:9 + --> $DIR/simd-intrinsic-generic-elements.rs:66:9 | LL | simd_shuffle4::<i32, i32>(0, 0, [0; 4]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle8` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-elements.rs:66:9 + --> $DIR/simd-intrinsic-generic-elements.rs:68:9 | LL | simd_shuffle8::<i32, i32>(0, 0, [0; 8]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle2` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x2` with element type `f32` - --> $DIR/simd-intrinsic-generic-elements.rs:69:9 + --> $DIR/simd-intrinsic-generic-elements.rs:71:9 | LL | simd_shuffle2::<_, f32x2>(x, x, [0; 2]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle3` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x3` with element type `f32` - --> $DIR/simd-intrinsic-generic-elements.rs:71:9 + --> $DIR/simd-intrinsic-generic-elements.rs:73:9 | LL | simd_shuffle3::<_, f32x3>(x, x, [0; 3]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle4` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x4` with element type `f32` - --> $DIR/simd-intrinsic-generic-elements.rs:73:9 + --> $DIR/simd-intrinsic-generic-elements.rs:75:9 | LL | simd_shuffle4::<_, f32x4>(x, x, [0; 4]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle8` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x8` with element type `f32` - --> $DIR/simd-intrinsic-generic-elements.rs:75:9 + --> $DIR/simd-intrinsic-generic-elements.rs:77:9 | LL | simd_shuffle8::<_, f32x8>(x, x, [0; 8]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle2` intrinsic: expected return type of length 2, found `i32x8` with length 8 - --> $DIR/simd-intrinsic-generic-elements.rs:78:9 + --> $DIR/simd-intrinsic-generic-elements.rs:80:9 | LL | simd_shuffle2::<_, i32x8>(x, x, [0; 2]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle3` intrinsic: expected return type of length 3, found `i32x4` with length 4 - --> $DIR/simd-intrinsic-generic-elements.rs:80:9 + --> $DIR/simd-intrinsic-generic-elements.rs:82:9 | LL | simd_shuffle3::<_, i32x4>(x, x, [0; 3]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle4` intrinsic: expected return type of length 4, found `i32x3` with length 3 - --> $DIR/simd-intrinsic-generic-elements.rs:82:9 + --> $DIR/simd-intrinsic-generic-elements.rs:84:9 | LL | simd_shuffle4::<_, i32x3>(x, x, [0; 4]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_shuffle8` intrinsic: expected return type of length 8, found `i32x2` with length 2 - --> $DIR/simd-intrinsic-generic-elements.rs:84:9 + --> $DIR/simd-intrinsic-generic-elements.rs:86:9 | LL | simd_shuffle8::<_, i32x2>(x, x, [0; 8]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-reduction.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-reduction.rs index 9a6dbe9d9a..ede4b26d19 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-reduction.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-reduction.rs @@ -1,3 +1,4 @@ +// build-fail // ignore-emscripten // Test that the simd_reduce_{op} intrinsics produce ok-ish error diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-reduction.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-reduction.stderr index 5f2a67dc14..91a62f6a1c 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-reduction.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-reduction.stderr @@ -1,59 +1,59 @@ error[E0511]: invalid monomorphization of `simd_reduce_add_ordered` intrinsic: expected return type `f32` (element of input `f32x4`), found `i32` - --> $DIR/simd-intrinsic-generic-reduction.rs:33:9 + --> $DIR/simd-intrinsic-generic-reduction.rs:34:9 | LL | simd_reduce_add_ordered(z, 0); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_reduce_mul_ordered` intrinsic: expected return type `f32` (element of input `f32x4`), found `i32` - --> $DIR/simd-intrinsic-generic-reduction.rs:35:9 + --> $DIR/simd-intrinsic-generic-reduction.rs:36:9 | LL | simd_reduce_mul_ordered(z, 1); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_reduce_and` intrinsic: expected return type `u32` (element of input `u32x4`), found `f32` - --> $DIR/simd-intrinsic-generic-reduction.rs:38:22 + --> $DIR/simd-intrinsic-generic-reduction.rs:39:22 | LL | let _: f32 = simd_reduce_and(x); | ^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_reduce_or` intrinsic: expected return type `u32` (element of input `u32x4`), found `f32` - --> $DIR/simd-intrinsic-generic-reduction.rs:40:22 + --> $DIR/simd-intrinsic-generic-reduction.rs:41:22 | LL | let _: f32 = simd_reduce_or(x); | ^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_reduce_xor` intrinsic: expected return type `u32` (element of input `u32x4`), found `f32` - --> $DIR/simd-intrinsic-generic-reduction.rs:42:22 + --> $DIR/simd-intrinsic-generic-reduction.rs:43:22 | LL | let _: f32 = simd_reduce_xor(x); | ^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_reduce_and` intrinsic: unsupported simd_reduce_and from `f32x4` with element `f32` to `f32` - --> $DIR/simd-intrinsic-generic-reduction.rs:45:22 + --> $DIR/simd-intrinsic-generic-reduction.rs:46:22 | LL | let _: f32 = simd_reduce_and(z); | ^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_reduce_or` intrinsic: unsupported simd_reduce_or from `f32x4` with element `f32` to `f32` - --> $DIR/simd-intrinsic-generic-reduction.rs:47:22 + --> $DIR/simd-intrinsic-generic-reduction.rs:48:22 | LL | let _: f32 = simd_reduce_or(z); | ^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_reduce_xor` intrinsic: unsupported simd_reduce_xor from `f32x4` with element `f32` to `f32` - --> $DIR/simd-intrinsic-generic-reduction.rs:49:22 + --> $DIR/simd-intrinsic-generic-reduction.rs:50:22 | LL | let _: f32 = simd_reduce_xor(z); | ^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_reduce_all` intrinsic: unsupported simd_reduce_all from `f32x4` with element `f32` to `bool` - --> $DIR/simd-intrinsic-generic-reduction.rs:52:23 + --> $DIR/simd-intrinsic-generic-reduction.rs:53:23 | LL | let _: bool = simd_reduce_all(z); | ^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_reduce_any` intrinsic: unsupported simd_reduce_any from `f32x4` with element `f32` to `bool` - --> $DIR/simd-intrinsic-generic-reduction.rs:54:23 + --> $DIR/simd-intrinsic-generic-reduction.rs:55:23 | LL | let _: bool = simd_reduce_any(z); | ^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-select.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-select.rs index 72f51a895b..a719b31415 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-select.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-select.rs @@ -1,3 +1,5 @@ +// build-fail + // Test that the simd_select intrinsic produces ok-ish error // messages when misused. diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-select.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-select.stderr index a46352c730..f68c969d13 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-select.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-select.stderr @@ -1,47 +1,47 @@ error[E0511]: invalid monomorphization of `simd_select` intrinsic: mismatched lengths: mask length `8` != other vector length `4` - --> $DIR/simd-intrinsic-generic-select.rs:38:9 + --> $DIR/simd-intrinsic-generic-select.rs:40:9 | LL | simd_select(m8, x, x); | ^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_select` intrinsic: mask element type is `u32`, expected `i_` - --> $DIR/simd-intrinsic-generic-select.rs:41:9 + --> $DIR/simd-intrinsic-generic-select.rs:43:9 | LL | simd_select(x, x, x); | ^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_select` intrinsic: mask element type is `f32`, expected `i_` - --> $DIR/simd-intrinsic-generic-select.rs:44:9 + --> $DIR/simd-intrinsic-generic-select.rs:46:9 | LL | simd_select(z, z, z); | ^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_select` intrinsic: expected SIMD argument type, found non-SIMD `u32` - --> $DIR/simd-intrinsic-generic-select.rs:47:9 + --> $DIR/simd-intrinsic-generic-select.rs:49:9 | LL | simd_select(m4, 0u32, 1u32); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: mismatched lengths: mask length `8` != other vector length `4` - --> $DIR/simd-intrinsic-generic-select.rs:50:9 + --> $DIR/simd-intrinsic-generic-select.rs:52:9 | LL | simd_select_bitmask(0u8, x, x); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: expected SIMD argument type, found non-SIMD `u32` - --> $DIR/simd-intrinsic-generic-select.rs:53:9 + --> $DIR/simd-intrinsic-generic-select.rs:55:9 | LL | simd_select_bitmask(0u8, 1u32, 2u32); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: `f32` is not an integral type - --> $DIR/simd-intrinsic-generic-select.rs:56:9 + --> $DIR/simd-intrinsic-generic-select.rs:58:9 | LL | simd_select_bitmask(0.0f32, x, x); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: `&str` is not an integral type - --> $DIR/simd-intrinsic-generic-select.rs:59:9 + --> $DIR/simd-intrinsic-generic-select.rs:61:9 | LL | simd_select_bitmask("x", x, x); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs new file mode 100644 index 0000000000..4c09ae25c5 --- /dev/null +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs @@ -0,0 +1,25 @@ +// This used to cause an ICE for an internal index out of range due to simd_shuffle_indices being +// passed the wrong Instance, causing issues with inlining. See #67557. +// +// run-pass +// compile-flags: -Zmir-opt-level=3 +#![feature(platform_intrinsics, repr_simd)] + +extern "platform-intrinsic" { + fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U; +} + +#[repr(simd)] +#[derive(Debug, PartialEq)] +struct Simd2(u8, u8); + +fn main() { + unsafe { + let _: Simd2 = inline_me(); + } +} + +#[inline(always)] +unsafe fn inline_me() -> Simd2 { + simd_shuffle2(Simd2(10, 11), Simd2(12, 13), [0, 3]) +} diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs new file mode 100644 index 0000000000..7a0d955686 --- /dev/null +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs @@ -0,0 +1,40 @@ +// This used to cause assert_10_13 to unexpectingly fail, due to simd_shuffle_indices being passed +// the wrong Instance, causing issues with inlining. See #67557. +// +// run-pass +// compile-flags: -Zmir-opt-level=3 +#![feature(platform_intrinsics, repr_simd)] + +extern "platform-intrinsic" { + fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U; +} + +#[repr(simd)] +#[derive(Debug, PartialEq)] +struct Simd2(u8, u8); + +fn main() { + unsafe { + let p_res: Simd2 = simd_shuffle2(Simd2(10, 11), Simd2(12, 13), [0, 1]); + let a_res: Simd2 = inline_me(); + + assert_10_11(p_res); + assert_10_13(a_res); + } +} + +#[inline(never)] +fn assert_10_11(x: Simd2) { + assert_eq!(x, Simd2(10, 11)); +} + +#[inline(never)] +fn assert_10_13(x: Simd2) { + assert_eq!(x, Simd2(10, 13)); +} + + +#[inline(always)] +unsafe fn inline_me() -> Simd2 { + simd_shuffle2(Simd2(10, 11), Simd2(12, 13), [0, 3]) +} diff --git a/src/test/ui/simd-type-generic-monomorphisation.rs b/src/test/ui/simd-type-generic-monomorphisation.rs index 68eb78759e..fc5e23f498 100644 --- a/src/test/ui/simd-type-generic-monomorphisation.rs +++ b/src/test/ui/simd-type-generic-monomorphisation.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(repr_simd, platform_intrinsics)] // error-pattern:monomorphising SIMD type `Simd2<X>` with a non-machine element type `X` diff --git a/src/test/ui/span/issue-37767.stderr b/src/test/ui/span/issue-37767.stderr index 0bbff45436..9ed6c8b826 100644 --- a/src/test/ui/span/issue-37767.stderr +++ b/src/test/ui/span/issue-37767.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in the trait `A` | LL | fn foo(&mut self) {} | ^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `A::foo(&a)` instead note: candidate #2 is defined in the trait `B` --> $DIR/issue-37767.rs:6:5 | LL | fn foo(&mut self) {} | ^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `B::foo(&a)` instead +help: disambiguate the method call for candidate #1 + | +LL | A::foo(&a) + | ^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | B::foo(&a) + | ^^^^^^^^^^ error[E0034]: multiple applicable items in scope --> $DIR/issue-37767.rs:22:7 @@ -28,13 +34,19 @@ note: candidate #1 is defined in the trait `C` | LL | fn foo(&self) {} | ^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `C::foo(&a)` instead note: candidate #2 is defined in the trait `D` --> $DIR/issue-37767.rs:18:5 | LL | fn foo(&self) {} | ^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `D::foo(&a)` instead +help: disambiguate the method call for candidate #1 + | +LL | C::foo(&a) + | ^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | D::foo(&a) + | ^^^^^^^^^^ error[E0034]: multiple applicable items in scope --> $DIR/issue-37767.rs:34:7 @@ -47,13 +59,19 @@ note: candidate #1 is defined in the trait `E` | LL | fn foo(self) {} | ^^^^^^^^^^^^ - = help: to disambiguate the method call, write `E::foo(a)` instead note: candidate #2 is defined in the trait `F` --> $DIR/issue-37767.rs:30:5 | LL | fn foo(self) {} | ^^^^^^^^^^^^ - = help: to disambiguate the method call, write `F::foo(a)` instead +help: disambiguate the method call for candidate #1 + | +LL | E::foo(a) + | ^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | F::foo(a) + | ^^^^^^^^^ error: aborting due to 3 previous errors diff --git a/src/test/ui/span/issue-39018.rs b/src/test/ui/span/issue-39018.rs index a3b1d1d817..b6db4008db 100644 --- a/src/test/ui/span/issue-39018.rs +++ b/src/test/ui/span/issue-39018.rs @@ -1,15 +1,15 @@ pub fn main() { let x = "Hello " + "World!"; - //~^ ERROR cannot be applied to type + //~^ ERROR cannot add // Make sure that the span outputs a warning // for not having an implementation for std::ops::Add // that won't output for the above string concatenation let y = World::Hello + World::Goodbye; - //~^ ERROR cannot be applied to type + //~^ ERROR cannot add let x = "Hello " + "World!".to_owned(); - //~^ ERROR cannot be applied to type + //~^ ERROR cannot add } enum World { @@ -23,16 +23,16 @@ fn foo() { let c = ""; let d = ""; let e = &a; - let _ = &a + &b; //~ ERROR binary operation - let _ = &a + b; //~ ERROR binary operation + let _ = &a + &b; //~ ERROR cannot add + let _ = &a + b; //~ ERROR cannot add let _ = a + &b; // ok let _ = a + b; //~ ERROR mismatched types - let _ = e + b; //~ ERROR binary operation - let _ = e + &b; //~ ERROR binary operation - let _ = e + d; //~ ERROR binary operation - let _ = e + &d; //~ ERROR binary operation - let _ = &c + &d; //~ ERROR binary operation - let _ = &c + d; //~ ERROR binary operation - let _ = c + &d; //~ ERROR binary operation - let _ = c + d; //~ ERROR binary operation + let _ = e + b; //~ ERROR cannot add + let _ = e + &b; //~ ERROR cannot add + let _ = e + d; //~ ERROR cannot add + let _ = e + &d; //~ ERROR cannot add + let _ = &c + &d; //~ ERROR cannot add + let _ = &c + d; //~ ERROR cannot add + let _ = c + &d; //~ ERROR cannot add + let _ = c + d; //~ ERROR cannot add } diff --git a/src/test/ui/span/issue-39018.stderr b/src/test/ui/span/issue-39018.stderr index 9637d1d82e..8a32561bd0 100644 --- a/src/test/ui/span/issue-39018.stderr +++ b/src/test/ui/span/issue-39018.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `&str` +error[E0369]: cannot add `&str` to `&str` --> $DIR/issue-39018.rs:2:22 | LL | let x = "Hello " + "World!"; @@ -12,7 +12,7 @@ help: `to_owned()` can be used to create an owned `String` from a string referen LL | let x = "Hello ".to_owned() + "World!"; | ^^^^^^^^^^^^^^^^^^^ -error[E0369]: binary operation `+` cannot be applied to type `World` +error[E0369]: cannot add `World` to `World` --> $DIR/issue-39018.rs:8:26 | LL | let y = World::Hello + World::Goodbye; @@ -22,7 +22,7 @@ LL | let y = World::Hello + World::Goodbye; | = note: an implementation of `std::ops::Add` might be missing for `World` -error[E0369]: binary operation `+` cannot be applied to type `&str` +error[E0369]: cannot add `std::string::String` to `&str` --> $DIR/issue-39018.rs:11:22 | LL | let x = "Hello " + "World!".to_owned(); @@ -36,7 +36,7 @@ help: `to_owned()` can be used to create an owned `String` from a string referen LL | let x = "Hello ".to_owned() + &"World!".to_owned(); | ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^ -error[E0369]: binary operation `+` cannot be applied to type `&std::string::String` +error[E0369]: cannot add `&std::string::String` to `&std::string::String` --> $DIR/issue-39018.rs:26:16 | LL | let _ = &a + &b; @@ -50,7 +50,7 @@ help: String concatenation appends the string on the right to the string on the LL | let _ = a + &b; | ^ -error[E0369]: binary operation `+` cannot be applied to type `&std::string::String` +error[E0369]: cannot add `std::string::String` to `&std::string::String` --> $DIR/issue-39018.rs:27:16 | LL | let _ = &a + b; @@ -73,7 +73,7 @@ LL | let _ = a + b; | expected `&str`, found struct `std::string::String` | help: consider borrowing here: `&b` -error[E0369]: binary operation `+` cannot be applied to type `&std::string::String` +error[E0369]: cannot add `std::string::String` to `&std::string::String` --> $DIR/issue-39018.rs:30:15 | LL | let _ = e + b; @@ -87,7 +87,7 @@ help: `to_owned()` can be used to create an owned `String` from a string referen LL | let _ = e.to_owned() + &b; | ^^^^^^^^^^^^ ^^ -error[E0369]: binary operation `+` cannot be applied to type `&std::string::String` +error[E0369]: cannot add `&std::string::String` to `&std::string::String` --> $DIR/issue-39018.rs:31:15 | LL | let _ = e + &b; @@ -101,7 +101,7 @@ help: `to_owned()` can be used to create an owned `String` from a string referen LL | let _ = e.to_owned() + &b; | ^^^^^^^^^^^^ -error[E0369]: binary operation `+` cannot be applied to type `&std::string::String` +error[E0369]: cannot add `&str` to `&std::string::String` --> $DIR/issue-39018.rs:32:15 | LL | let _ = e + d; @@ -115,7 +115,7 @@ help: `to_owned()` can be used to create an owned `String` from a string referen LL | let _ = e.to_owned() + d; | ^^^^^^^^^^^^ -error[E0369]: binary operation `+` cannot be applied to type `&std::string::String` +error[E0369]: cannot add `&&str` to `&std::string::String` --> $DIR/issue-39018.rs:33:15 | LL | let _ = e + &d; @@ -129,7 +129,7 @@ help: `to_owned()` can be used to create an owned `String` from a string referen LL | let _ = e.to_owned() + &d; | ^^^^^^^^^^^^ -error[E0369]: binary operation `+` cannot be applied to type `&&str` +error[E0369]: cannot add `&&str` to `&&str` --> $DIR/issue-39018.rs:34:16 | LL | let _ = &c + &d; @@ -139,7 +139,7 @@ LL | let _ = &c + &d; | = note: an implementation of `std::ops::Add` might be missing for `&&str` -error[E0369]: binary operation `+` cannot be applied to type `&&str` +error[E0369]: cannot add `&str` to `&&str` --> $DIR/issue-39018.rs:35:16 | LL | let _ = &c + d; @@ -149,7 +149,7 @@ LL | let _ = &c + d; | = note: an implementation of `std::ops::Add` might be missing for `&&str` -error[E0369]: binary operation `+` cannot be applied to type `&str` +error[E0369]: cannot add `&&str` to `&str` --> $DIR/issue-39018.rs:36:15 | LL | let _ = c + &d; @@ -163,7 +163,7 @@ help: `to_owned()` can be used to create an owned `String` from a string referen LL | let _ = c.to_owned() + &d; | ^^^^^^^^^^^^ -error[E0369]: binary operation `+` cannot be applied to type `&str` +error[E0369]: cannot add `&str` to `&str` --> $DIR/issue-39018.rs:37:15 | LL | let _ = c + d; diff --git a/src/test/ui/span/issue-43927-non-ADT-derive.rs b/src/test/ui/span/issue-43927-non-ADT-derive.rs index 8f1599a5ab..89b8eba1e9 100644 --- a/src/test/ui/span/issue-43927-non-ADT-derive.rs +++ b/src/test/ui/span/issue-43927-non-ADT-derive.rs @@ -5,6 +5,9 @@ //~| ERROR cannot determine resolution for the derive macro `Debug` //~| ERROR cannot determine resolution for the derive macro `PartialEq` //~| ERROR cannot determine resolution for the derive macro `Eq` +//~| ERROR cannot determine resolution for the derive macro `Debug` +//~| ERROR cannot determine resolution for the derive macro `PartialEq` +//~| ERROR cannot determine resolution for the derive macro `Eq` struct DerivedOn; fn main() {} diff --git a/src/test/ui/span/issue-43927-non-ADT-derive.stderr b/src/test/ui/span/issue-43927-non-ADT-derive.stderr index 47ce718600..b68681c529 100644 --- a/src/test/ui/span/issue-43927-non-ADT-derive.stderr +++ b/src/test/ui/span/issue-43927-non-ADT-derive.stderr @@ -28,5 +28,29 @@ LL | #![derive(Debug, PartialEq, Eq)] // should be an outer attribute! | = note: import resolution is stuck, try simplifying macro imports -error: aborting due to 4 previous errors +error: cannot determine resolution for the derive macro `Eq` + --> $DIR/issue-43927-non-ADT-derive.rs:3:29 + | +LL | #![derive(Debug, PartialEq, Eq)] // should be an outer attribute! + | ^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: cannot determine resolution for the derive macro `PartialEq` + --> $DIR/issue-43927-non-ADT-derive.rs:3:18 + | +LL | #![derive(Debug, PartialEq, Eq)] // should be an outer attribute! + | ^^^^^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: cannot determine resolution for the derive macro `Debug` + --> $DIR/issue-43927-non-ADT-derive.rs:3:11 + | +LL | #![derive(Debug, PartialEq, Eq)] // should be an outer attribute! + | ^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: aborting due to 7 previous errors diff --git a/src/test/ui/span/issue-7575.rs b/src/test/ui/span/issue-7575.rs index ea0a66540b..eddd158aef 100644 --- a/src/test/ui/span/issue-7575.rs +++ b/src/test/ui/span/issue-7575.rs @@ -60,15 +60,15 @@ impl ManyImplTrait for Myisize {} fn no_param_bound(u: usize, m: Myisize) -> usize { u.f8(42) + u.f9(342) + m.fff(42) - //~^ ERROR no method named `f9` found for type `usize` in the current scope - //~| ERROR no method named `fff` found for type `Myisize` in the current scope + //~^ ERROR no method named `f9` found + //~| ERROR no method named `fff` found } fn param_bound<T: ManyImplTrait>(t: T) -> bool { t.is_str() - //~^ ERROR no method named `is_str` found for type `T` in the current scope + //~^ ERROR no method named `is_str` found } fn main() { diff --git a/src/test/ui/span/issue-7575.stderr b/src/test/ui/span/issue-7575.stderr index 36db5bea86..eb85be039b 100644 --- a/src/test/ui/span/issue-7575.stderr +++ b/src/test/ui/span/issue-7575.stderr @@ -10,26 +10,35 @@ note: candidate #1 is defined in the trait `CtxtFn` | LL | fn f9(_: usize) -> usize; | ^^^^^^^^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `CtxtFn::f9(u, 342)` instead note: candidate #2 is defined in the trait `OtherTrait` --> $DIR/issue-7575.rs:8:5 | LL | fn f9(_: usize) -> usize; | ^^^^^^^^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `OtherTrait::f9(u, 342)` instead note: candidate #3 is defined in the trait `UnusedTrait` --> $DIR/issue-7575.rs:17:5 | LL | fn f9(_: usize) -> usize; | ^^^^^^^^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `UnusedTrait::f9(u, 342)` instead = help: items from traits can only be used if the trait is implemented and in scope = note: the following traits define an item `f9`, perhaps you need to implement one of them: candidate #1: `CtxtFn` candidate #2: `OtherTrait` candidate #3: `UnusedTrait` +help: disambiguate the method call for candidate #1 + | +LL | u.f8(42) + CtxtFn::f9(u, 342) + m.fff(42) + | ^^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | u.f8(42) + OtherTrait::f9(u, 342) + m.fff(42) + | ^^^^^^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #3 + | +LL | u.f8(42) + UnusedTrait::f9(u, 342) + m.fff(42) + | ^^^^^^^^^^^^^^^^^^^^^^^ -error[E0599]: no method named `fff` found for type `Myisize` in the current scope +error[E0599]: no method named `fff` found for struct `Myisize` in the current scope --> $DIR/issue-7575.rs:62:30 | LL | struct Myisize(isize); @@ -48,7 +57,7 @@ note: the candidate is defined in an impl for the type `Myisize` LL | fn fff(i: isize) -> isize { | ^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0599]: no method named `is_str` found for type `T` in the current scope +error[E0599]: no method named `is_str` found for type parameter `T` in the current scope --> $DIR/issue-7575.rs:70:7 | LL | t.is_str() @@ -60,8 +69,11 @@ note: the candidate is defined in the trait `ManyImplTrait` | LL | fn is_str() -> bool { | ^^^^^^^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `ManyImplTrait::is_str(t)` instead = help: items from traits can only be used if the type parameter is bounded by the trait +help: disambiguate the method call for the candidate + | +LL | ManyImplTrait::is_str(t) + | help: the following trait defines an item `is_str`, perhaps you need to restrict type parameter `T` with it: | LL | fn param_bound<T: ManyImplTrait + ManyImplTrait>(t: T) -> bool { diff --git a/src/test/ui/span/type-annotations-needed-expr.stderr b/src/test/ui/span/type-annotations-needed-expr.stderr index 8366285edc..2b92f9b93b 100644 --- a/src/test/ui/span/type-annotations-needed-expr.stderr +++ b/src/test/ui/span/type-annotations-needed-expr.stderr @@ -4,7 +4,7 @@ error[E0282]: type annotations needed LL | let _ = (vec![1,2,3]).into_iter().sum() as f64; | ^^^ | | - | cannot infer type for type parameter `S` + | cannot infer type for type parameter `S` declared on the method `sum` | help: consider specifying the type argument in the method call: `sum::<S>` | = note: type must be known at this point diff --git a/src/test/ui/span/type-binding.stderr b/src/test/ui/span/type-binding.stderr index 421af67d19..f698993355 100644 --- a/src/test/ui/span/type-binding.stderr +++ b/src/test/ui/span/type-binding.stderr @@ -2,7 +2,7 @@ error[E0220]: associated type `Trget` not found for `std::ops::Deref` --> $DIR/type-binding.rs:6:20 | LL | fn homura<T: Deref<Trget = i32>>(_: T) {} - | ^^^^^^^^^^^ associated type `Trget` not found + | ^^^^^ help: there is an associated type with a similar name: `Target` error: aborting due to previous error diff --git a/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.rs b/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.rs index 34a1416857..5c104449fe 100644 --- a/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.rs +++ b/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.rs @@ -20,5 +20,5 @@ default impl<T> Foo for T { fn main() { println!("{}", MyStruct.foo_one()); - //~^ ERROR no method named `foo_one` found for type `MyStruct` in the current scope + //~^ ERROR no method named `foo_one` found } diff --git a/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.stderr b/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.stderr index bbfe4c3d59..19809778a5 100644 --- a/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.stderr +++ b/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `foo_one` found for type `MyStruct` in the current scope +error[E0599]: no method named `foo_one` found for struct `MyStruct` in the current scope --> $DIR/specialization-trait-not-implemented.rs:22:29 | LL | struct MyStruct; diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity.rs b/src/test/ui/stability-attribute/stability-attribute-sanity.rs index 2e3d790d2d..5db924642e 100644 --- a/src/test/ui/stability-attribute/stability-attribute-sanity.rs +++ b/src/test/ui/stability-attribute/stability-attribute-sanity.rs @@ -22,7 +22,7 @@ mod bogus_attribute_types_1 { } mod missing_feature_names { - #[unstable(issue = "0")] //~ ERROR missing 'feature' [E0546] + #[unstable(issue = "none")] //~ ERROR missing 'feature' [E0546] fn f1() { } #[unstable(feature = "b")] //~ ERROR missing 'issue' [E0547] @@ -45,12 +45,12 @@ mod missing_version { fn f3() { } } -#[unstable(feature = "b", issue = "0")] +#[unstable(feature = "b", issue = "none")] #[stable(feature = "a", since = "b")] //~ ERROR multiple stability levels [E0544] fn multiple1() { } -#[unstable(feature = "b", issue = "0")] -#[unstable(feature = "b", issue = "0")] //~ ERROR multiple stability levels [E0544] +#[unstable(feature = "b", issue = "none")] +#[unstable(feature = "b", issue = "none")] //~ ERROR multiple stability levels [E0544] fn multiple2() { } #[stable(feature = "a", since = "b")] @@ -60,8 +60,8 @@ fn multiple3() { } #[stable(feature = "a", since = "b")] #[rustc_deprecated(since = "b", reason = "text")] #[rustc_deprecated(since = "b", reason = "text")] -#[rustc_const_unstable(feature = "c", issue = "0")] -#[rustc_const_unstable(feature = "d", issue = "0")] //~ ERROR multiple stability levels +#[rustc_const_unstable(feature = "c", issue = "none")] +#[rustc_const_unstable(feature = "d", issue = "none")] //~ ERROR multiple stability levels pub const fn multiple4() { } //~ ERROR multiple rustc_deprecated attributes [E0540] //~^ ERROR Invalid stability or deprecation version found diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity.stderr b/src/test/ui/stability-attribute/stability-attribute-sanity.stderr index 552e078f45..d0ca170503 100644 --- a/src/test/ui/stability-attribute/stability-attribute-sanity.stderr +++ b/src/test/ui/stability-attribute/stability-attribute-sanity.stderr @@ -31,8 +31,8 @@ LL | #[stable(feature(b), since = "a")] error[E0546]: missing 'feature' --> $DIR/stability-attribute-sanity.rs:25:5 | -LL | #[unstable(issue = "0")] - | ^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[unstable(issue = "none")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0547]: missing 'issue' --> $DIR/stability-attribute-sanity.rs:28:5 @@ -73,8 +73,8 @@ LL | #[stable(feature = "a", since = "b")] error[E0544]: multiple stability levels --> $DIR/stability-attribute-sanity.rs:53:1 | -LL | #[unstable(feature = "b", issue = "0")] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[unstable(feature = "b", issue = "none")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0544]: multiple stability levels --> $DIR/stability-attribute-sanity.rs:57:1 @@ -91,8 +91,8 @@ LL | pub const fn multiple4() { } error[E0544]: multiple stability levels --> $DIR/stability-attribute-sanity.rs:64:1 | -LL | #[rustc_const_unstable(feature = "d", issue = "0")] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[rustc_const_unstable(feature = "d", issue = "none")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: Invalid stability or deprecation version found --> $DIR/stability-attribute-sanity.rs:65:1 diff --git a/src/test/ui/stability-in-private-module.rs b/src/test/ui/stability-in-private-module.rs index f12e9198b0..1815897f17 100644 --- a/src/test/ui/stability-in-private-module.rs +++ b/src/test/ui/stability-in-private-module.rs @@ -1,3 +1,8 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl + fn main() { let _ = std::thread::thread_info::current_thread(); //~^ERROR module `thread_info` is private diff --git a/src/test/ui/stability-in-private-module.stderr b/src/test/ui/stability-in-private-module.stderr index c3edd62a15..3a974164f9 100644 --- a/src/test/ui/stability-in-private-module.stderr +++ b/src/test/ui/stability-in-private-module.stderr @@ -1,8 +1,14 @@ error[E0603]: module `thread_info` is private - --> $DIR/stability-in-private-module.rs:2:26 + --> $DIR/stability-in-private-module.rs:7:26 | LL | let _ = std::thread::thread_info::current_thread(); - | ^^^^^^^^^^^ + | ^^^^^^^^^^^ this module is private + | +note: the module `thread_info` is defined here + --> $SRC_DIR/libstd/thread/mod.rs:LL:COL + | +LL | use crate::sys_common::thread_info; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/static/static-priv-by-default2.stderr b/src/test/ui/static/static-priv-by-default2.stderr index 95bcf07633..f6cd40412d 100644 --- a/src/test/ui/static/static-priv-by-default2.stderr +++ b/src/test/ui/static/static-priv-by-default2.stderr @@ -2,13 +2,25 @@ error[E0603]: static `private` is private --> $DIR/static-priv-by-default2.rs:15:30 | LL | use child::childs_child::private; - | ^^^^^^^ + | ^^^^^^^ this static is private + | +note: the static `private` is defined here + --> $DIR/static-priv-by-default2.rs:7:9 + | +LL | static private: isize = 0; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0603]: static `private` is private --> $DIR/static-priv-by-default2.rs:23:33 | LL | use static_priv_by_default::private; - | ^^^^^^^ + | ^^^^^^^ this static is private + | +note: the static `private` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:3:1 + | +LL | static private: isize = 0; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/str/str-array-assignment.rs b/src/test/ui/str/str-array-assignment.rs index 4a78ed53ae..323eefb381 100644 --- a/src/test/ui/str/str-array-assignment.rs +++ b/src/test/ui/str/str-array-assignment.rs @@ -1,7 +1,7 @@ fn main() { let s = "abc"; let t = if true { s[..2] } else { s }; - //~^ ERROR if and else have incompatible types + //~^ ERROR `if` and `else` have incompatible types let u: &str = if true { s[..2] } else { s }; //~^ ERROR mismatched types let v = s[..2]; diff --git a/src/test/ui/str/str-array-assignment.stderr b/src/test/ui/str/str-array-assignment.stderr index a133c69eee..cc767de384 100644 --- a/src/test/ui/str/str-array-assignment.stderr +++ b/src/test/ui/str/str-array-assignment.stderr @@ -1,4 +1,4 @@ -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/str-array-assignment.rs:3:37 | LL | let t = if true { s[..2] } else { s }; diff --git a/src/test/ui/str/str-concat-on-double-ref.rs b/src/test/ui/str/str-concat-on-double-ref.rs index a671b6e191..23e5f89206 100644 --- a/src/test/ui/str/str-concat-on-double-ref.rs +++ b/src/test/ui/str/str-concat-on-double-ref.rs @@ -2,6 +2,6 @@ fn main() { let a: &String = &"1".to_owned(); let b: &str = &"2"; let c = a + b; - //~^ ERROR binary operation `+` cannot be applied to type `&std::string::String` + //~^ ERROR cannot add `&str` to `&std::string::String` println!("{:?}", c); } diff --git a/src/test/ui/str/str-concat-on-double-ref.stderr b/src/test/ui/str/str-concat-on-double-ref.stderr index d193955af4..d77e0d8f24 100644 --- a/src/test/ui/str/str-concat-on-double-ref.stderr +++ b/src/test/ui/str/str-concat-on-double-ref.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `&std::string::String` +error[E0369]: cannot add `&str` to `&std::string::String` --> $DIR/str-concat-on-double-ref.rs:4:15 | LL | let c = a + b; diff --git a/src/test/ui/structs-enums/enum-non-c-like-repr-c-and-int.rs b/src/test/ui/structs-enums/enum-non-c-like-repr-c-and-int.rs index 78d8e5e3a5..7d15d607dd 100644 --- a/src/test/ui/structs-enums/enum-non-c-like-repr-c-and-int.rs +++ b/src/test/ui/structs-enums/enum-non-c-like-repr-c-and-int.rs @@ -69,8 +69,10 @@ fn main() { unsafe { // This should be safe, because we don't match on it unless it's fully formed, // and it doesn't have a destructor. - #[allow(deprecated)] - let mut dest: MyEnum = mem::uninitialized(); + // + // MyEnum is repr(C, u8) so it is guaranteed to have a separate discriminant and each + // variant can be zero initialized. + let mut dest: MyEnum = mem::zeroed(); while buf.len() > 0 { match parse_my_enum(&mut dest, &mut buf) { Ok(()) => output.push(Ok(dest)), diff --git a/src/test/ui/structs-enums/enum-non-c-like-repr-c.rs b/src/test/ui/structs-enums/enum-non-c-like-repr-c.rs index 1209533efd..fc9efdeca7 100644 --- a/src/test/ui/structs-enums/enum-non-c-like-repr-c.rs +++ b/src/test/ui/structs-enums/enum-non-c-like-repr-c.rs @@ -69,8 +69,11 @@ fn main() { unsafe { // This should be safe, because we don't match on it unless it's fully formed, // and it doesn't have a destructor. - #[allow(deprecated)] - let mut dest: MyEnum = mem::uninitialized(); + // + // Furthermore, there are no types within MyEnum which cannot be initialized with zero, + // specifically, though padding and such are present, there are no references or similar + // types. + let mut dest: MyEnum = mem::zeroed(); while buf.len() > 0 { match parse_my_enum(&mut dest, &mut buf) { Ok(()) => output.push(Ok(dest)), diff --git a/src/test/ui/structs-enums/enum-non-c-like-repr-int.rs b/src/test/ui/structs-enums/enum-non-c-like-repr-int.rs index 5dd9c1863d..f9e96c1a0f 100644 --- a/src/test/ui/structs-enums/enum-non-c-like-repr-int.rs +++ b/src/test/ui/structs-enums/enum-non-c-like-repr-int.rs @@ -65,8 +65,10 @@ fn main() { unsafe { // This should be safe, because we don't match on it unless it's fully formed, // and it doesn't have a destructor. - #[allow(deprecated)] - let mut dest: MyEnum = mem::uninitialized(); + // + // MyEnum is repr(u8) so it is guaranteed to have a separate discriminant and each variant + // can be zero initialized. + let mut dest: MyEnum = mem::zeroed(); while buf.len() > 0 { match parse_my_enum(&mut dest, &mut buf) { Ok(()) => output.push(Ok(dest)), diff --git a/src/test/ui/structs/struct-path-associated-type.rs b/src/test/ui/structs/struct-path-associated-type.rs index 15b37facc5..e44a203b78 100644 --- a/src/test/ui/structs/struct-path-associated-type.rs +++ b/src/test/ui/structs/struct-path-associated-type.rs @@ -31,7 +31,6 @@ fn g<T: Tr<A = S>>() { fn main() { let s = S::A {}; //~ ERROR ambiguous associated type let z = S::A::<u8> {}; //~ ERROR ambiguous associated type - //~^ ERROR type arguments are not allowed for this type match S { S::A {} => {} //~ ERROR ambiguous associated type } diff --git a/src/test/ui/structs/struct-path-associated-type.stderr b/src/test/ui/structs/struct-path-associated-type.stderr index 7cfbd7b720..f8a2c7c6b6 100644 --- a/src/test/ui/structs/struct-path-associated-type.stderr +++ b/src/test/ui/structs/struct-path-associated-type.stderr @@ -34,12 +34,6 @@ error[E0223]: ambiguous associated type LL | let s = S::A {}; | ^^^^ help: use fully-qualified syntax: `<S as Trait>::A` -error[E0109]: type arguments are not allowed for this type - --> $DIR/struct-path-associated-type.rs:33:20 - | -LL | let z = S::A::<u8> {}; - | ^^ type argument not allowed - error[E0223]: ambiguous associated type --> $DIR/struct-path-associated-type.rs:33:13 | @@ -47,12 +41,12 @@ LL | let z = S::A::<u8> {}; | ^^^^^^^^^^ help: use fully-qualified syntax: `<S as Trait>::A` error[E0223]: ambiguous associated type - --> $DIR/struct-path-associated-type.rs:36:9 + --> $DIR/struct-path-associated-type.rs:35:9 | LL | S::A {} => {} | ^^^^ help: use fully-qualified syntax: `<S as Trait>::A` -error: aborting due to 9 previous errors +error: aborting due to 8 previous errors Some errors have detailed explanations: E0071, E0109, E0223. For more information about an error, try `rustc --explain E0071`. diff --git a/src/test/ui/structs/struct-variant-privacy-xc.stderr b/src/test/ui/structs/struct-variant-privacy-xc.stderr index 39241b6b3f..0203b7b524 100644 --- a/src/test/ui/structs/struct-variant-privacy-xc.stderr +++ b/src/test/ui/structs/struct-variant-privacy-xc.stderr @@ -2,13 +2,25 @@ error[E0603]: enum `Bar` is private --> $DIR/struct-variant-privacy-xc.rs:4:33 | LL | fn f(b: struct_variant_privacy::Bar) { - | ^^^ + | ^^^ this enum is private + | +note: the enum `Bar` is defined here + --> $DIR/auxiliary/struct_variant_privacy.rs:1:1 + | +LL | enum Bar { + | ^^^^^^^^ error[E0603]: enum `Bar` is private --> $DIR/struct-variant-privacy-xc.rs:6:33 | LL | struct_variant_privacy::Bar::Baz { a: _a } => {} - | ^^^ + | ^^^ this enum is private + | +note: the enum `Bar` is defined here + --> $DIR/auxiliary/struct_variant_privacy.rs:1:1 + | +LL | enum Bar { + | ^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/structs/struct-variant-privacy.stderr b/src/test/ui/structs/struct-variant-privacy.stderr index 127a650104..d1b603f9d4 100644 --- a/src/test/ui/structs/struct-variant-privacy.stderr +++ b/src/test/ui/structs/struct-variant-privacy.stderr @@ -2,13 +2,25 @@ error[E0603]: enum `Bar` is private --> $DIR/struct-variant-privacy.rs:7:14 | LL | fn f(b: foo::Bar) { - | ^^^ + | ^^^ this enum is private + | +note: the enum `Bar` is defined here + --> $DIR/struct-variant-privacy.rs:2:5 + | +LL | enum Bar { + | ^^^^^^^^ error[E0603]: enum `Bar` is private --> $DIR/struct-variant-privacy.rs:9:14 | LL | foo::Bar::Baz { a: _a } => {} - | ^^^ + | ^^^ this enum is private + | +note: the enum `Bar` is defined here + --> $DIR/struct-variant-privacy.rs:2:5 + | +LL | enum Bar { + | ^^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/structs/structure-constructor-type-mismatch.stderr b/src/test/ui/structs/structure-constructor-type-mismatch.stderr index 4bd3acac53..8cfa118a2d 100644 --- a/src/test/ui/structs/structure-constructor-type-mismatch.stderr +++ b/src/test/ui/structs/structure-constructor-type-mismatch.stderr @@ -86,7 +86,7 @@ error[E0308]: mismatched types --> $DIR/structure-constructor-type-mismatch.rs:54:9 | LL | match (Point { x: 1, y: 2 }) { - | ---------------------- this match expression has type `Point<{integer}>` + | ---------------------- this expression has type `Point<{integer}>` LL | PointF::<u32> { .. } => {} | ^^^^^^^^^^^^^^^^^^^^ expected integer, found `f32` | @@ -97,7 +97,7 @@ error[E0308]: mismatched types --> $DIR/structure-constructor-type-mismatch.rs:59:9 | LL | match (Point { x: 1, y: 2 }) { - | ---------------------- this match expression has type `Point<{integer}>` + | ---------------------- this expression has type `Point<{integer}>` LL | PointF { .. } => {} | ^^^^^^^^^^^^^ expected integer, found `f32` | @@ -108,7 +108,7 @@ error[E0308]: mismatched types --> $DIR/structure-constructor-type-mismatch.rs:67:9 | LL | match (Pair { x: 1, y: 2 }) { - | --------------------- this match expression has type `Pair<{integer}, {integer}>` + | --------------------- this expression has type `Pair<{integer}, {integer}>` LL | PairF::<u32> { .. } => {} | ^^^^^^^^^^^^^^^^^^^ expected integer, found `f32` | diff --git a/src/test/ui/suffixed-literal-meta.rs b/src/test/ui/suffixed-literal-meta.rs index a6531490c0..c3a4eabad7 100644 --- a/src/test/ui/suffixed-literal-meta.rs +++ b/src/test/ui/suffixed-literal-meta.rs @@ -1,15 +1,27 @@ #![feature(rustc_attrs)] #[rustc_dummy = 1usize] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1u8] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1u16] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1u32] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1u64] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1isize] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1i8] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1i16] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1i32] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1i64] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1.0f32] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes #[rustc_dummy = 1.0f64] //~ ERROR: suffixed literals are not allowed in attributes + //~| ERROR: suffixed literals are not allowed in attributes fn main() {} diff --git a/src/test/ui/suffixed-literal-meta.stderr b/src/test/ui/suffixed-literal-meta.stderr index 83de173b1a..84fe91d662 100644 --- a/src/test/ui/suffixed-literal-meta.stderr +++ b/src/test/ui/suffixed-literal-meta.stderr @@ -4,95 +4,191 @@ error: suffixed literals are not allowed in attributes LL | #[rustc_dummy = 1usize] | ^^^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:4:17 + --> $DIR/suffixed-literal-meta.rs:5:17 | LL | #[rustc_dummy = 1u8] | ^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:5:17 + --> $DIR/suffixed-literal-meta.rs:7:17 | LL | #[rustc_dummy = 1u16] | ^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:6:17 + --> $DIR/suffixed-literal-meta.rs:9:17 | LL | #[rustc_dummy = 1u32] | ^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:7:17 + --> $DIR/suffixed-literal-meta.rs:11:17 | LL | #[rustc_dummy = 1u64] | ^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:8:17 + --> $DIR/suffixed-literal-meta.rs:13:17 | LL | #[rustc_dummy = 1isize] | ^^^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:9:17 + --> $DIR/suffixed-literal-meta.rs:15:17 | LL | #[rustc_dummy = 1i8] | ^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:10:17 + --> $DIR/suffixed-literal-meta.rs:17:17 | LL | #[rustc_dummy = 1i16] | ^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:11:17 + --> $DIR/suffixed-literal-meta.rs:19:17 | LL | #[rustc_dummy = 1i32] | ^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:12:17 + --> $DIR/suffixed-literal-meta.rs:21:17 | LL | #[rustc_dummy = 1i64] | ^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:23:17 + | +LL | #[rustc_dummy = 1.0f32] + | ^^^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:25:17 + | +LL | #[rustc_dummy = 1.0f64] + | ^^^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:3:17 + | +LL | #[rustc_dummy = 1usize] + | ^^^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:5:17 + | +LL | #[rustc_dummy = 1u8] + | ^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:7:17 + | +LL | #[rustc_dummy = 1u16] + | ^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:9:17 + | +LL | #[rustc_dummy = 1u32] + | ^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:11:17 + | +LL | #[rustc_dummy = 1u64] + | ^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes --> $DIR/suffixed-literal-meta.rs:13:17 | +LL | #[rustc_dummy = 1isize] + | ^^^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:15:17 + | +LL | #[rustc_dummy = 1i8] + | ^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:17:17 + | +LL | #[rustc_dummy = 1i16] + | ^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:19:17 + | +LL | #[rustc_dummy = 1i32] + | ^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:21:17 + | +LL | #[rustc_dummy = 1i64] + | ^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: suffixed literals are not allowed in attributes + --> $DIR/suffixed-literal-meta.rs:23:17 + | LL | #[rustc_dummy = 1.0f32] | ^^^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) error: suffixed literals are not allowed in attributes - --> $DIR/suffixed-literal-meta.rs:14:17 + --> $DIR/suffixed-literal-meta.rs:25:17 | LL | #[rustc_dummy = 1.0f64] | ^^^^^^ | - = help: instead of using a suffixed literal (1u8, 1.0f32, etc.), use an unsuffixed version (1, 1.0, etc.). + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) -error: aborting due to 12 previous errors +error: aborting due to 24 previous errors diff --git a/src/test/ui/suggestions/attribute-typos.rs b/src/test/ui/suggestions/attribute-typos.rs index 7c8231bbb2..e1e3317093 100644 --- a/src/test/ui/suggestions/attribute-typos.rs +++ b/src/test/ui/suggestions/attribute-typos.rs @@ -1,3 +1,7 @@ +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl #[deprcated] //~ ERROR cannot find attribute `deprcated` in this scope fn foo() {} diff --git a/src/test/ui/suggestions/attribute-typos.stderr b/src/test/ui/suggestions/attribute-typos.stderr index e40329382f..a094359253 100644 --- a/src/test/ui/suggestions/attribute-typos.stderr +++ b/src/test/ui/suggestions/attribute-typos.stderr @@ -1,5 +1,5 @@ error[E0658]: attributes starting with `rustc` are reserved for use by the `rustc` compiler - --> $DIR/attribute-typos.rs:7:3 + --> $DIR/attribute-typos.rs:11:3 | LL | #[rustc_err] | ^^^^^^^^^ @@ -8,19 +8,24 @@ LL | #[rustc_err] = help: add `#![feature(rustc_attrs)]` to the crate attributes to enable error: cannot find attribute `rustc_err` in this scope - --> $DIR/attribute-typos.rs:7:3 + --> $DIR/attribute-typos.rs:11:3 | LL | #[rustc_err] | ^^^^^^^^^ help: a built-in attribute with a similar name exists: `rustc_error` error: cannot find attribute `tests` in this scope - --> $DIR/attribute-typos.rs:4:3 + --> $DIR/attribute-typos.rs:8:3 | LL | #[tests] | ^^^^^ help: an attribute macro with a similar name exists: `test` + | + ::: $SRC_DIR/libcore/macros/mod.rs:LL:COL + | +LL | pub macro test($item:item) { + | -------------------------- similarly named attribute macro `test` defined here error: cannot find attribute `deprcated` in this scope - --> $DIR/attribute-typos.rs:1:3 + --> $DIR/attribute-typos.rs:5:3 | LL | #[deprcated] | ^^^^^^^^^ help: a built-in attribute with a similar name exists: `deprecated` diff --git a/src/test/ui/suggestions/constrain-trait.fixed b/src/test/ui/suggestions/constrain-trait.fixed index dda9e93135..f292f27f0f 100644 --- a/src/test/ui/suggestions/constrain-trait.fixed +++ b/src/test/ui/suggestions/constrain-trait.fixed @@ -12,13 +12,13 @@ trait GetString { trait UseString: std::fmt::Debug + GetString { fn use_string(&self) { - println!("{:?}", self.get_a()); //~ ERROR no method named `get_a` found for type `&Self` + println!("{:?}", self.get_a()); //~ ERROR no method named `get_a` found } } trait UseString2: GetString { fn use_string(&self) { - println!("{:?}", self.get_a()); //~ ERROR no method named `get_a` found for type `&Self` + println!("{:?}", self.get_a()); //~ ERROR no method named `get_a` found } } diff --git a/src/test/ui/suggestions/constrain-trait.rs b/src/test/ui/suggestions/constrain-trait.rs index 4ef0eff5bd..99ccf7a7f3 100644 --- a/src/test/ui/suggestions/constrain-trait.rs +++ b/src/test/ui/suggestions/constrain-trait.rs @@ -12,13 +12,13 @@ trait GetString { trait UseString: std::fmt::Debug { fn use_string(&self) { - println!("{:?}", self.get_a()); //~ ERROR no method named `get_a` found for type `&Self` + println!("{:?}", self.get_a()); //~ ERROR no method named `get_a` found } } trait UseString2 { fn use_string(&self) { - println!("{:?}", self.get_a()); //~ ERROR no method named `get_a` found for type `&Self` + println!("{:?}", self.get_a()); //~ ERROR no method named `get_a` found } } diff --git a/src/test/ui/suggestions/constrain-trait.stderr b/src/test/ui/suggestions/constrain-trait.stderr index 3cc351ac80..f1c50e59a8 100644 --- a/src/test/ui/suggestions/constrain-trait.stderr +++ b/src/test/ui/suggestions/constrain-trait.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `get_a` found for type `&Self` in the current scope +error[E0599]: no method named `get_a` found for reference `&Self` in the current scope --> $DIR/constrain-trait.rs:15:31 | LL | println!("{:?}", self.get_a()); @@ -10,7 +10,7 @@ help: the following trait defines an item `get_a`, perhaps you need to add anoth LL | trait UseString: std::fmt::Debug + GetString { | ^^^^^^^^^^^ -error[E0599]: no method named `get_a` found for type `&Self` in the current scope +error[E0599]: no method named `get_a` found for reference `&Self` in the current scope --> $DIR/constrain-trait.rs:21:31 | LL | println!("{:?}", self.get_a()); diff --git a/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr b/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr index 2f0a457a79..232e54b5d3 100644 --- a/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr +++ b/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr @@ -236,7 +236,7 @@ error[E0308]: mismatched types --> $DIR/fn-or-tuple-struct-without-args.rs:46:20 | LL | let closure = || 42; - | -- closure defined here + | ----- the found closure LL | let _: usize = closure; | ----- ^^^^^^^ | | | diff --git a/src/test/ui/suggestions/for-i-in-vec.fixed b/src/test/ui/suggestions/for-i-in-vec.fixed new file mode 100644 index 0000000000..ec7358bd08 --- /dev/null +++ b/src/test/ui/suggestions/for-i-in-vec.fixed @@ -0,0 +1,15 @@ +// run-rustfix +#![allow(dead_code)] + +struct Foo { + v: Vec<u32>, +} + +impl Foo { + fn bar(&self) { + for _ in &self.v { //~ ERROR cannot move out of `self.v` which is behind a shared reference + } + } +} + +fn main() {} diff --git a/src/test/ui/suggestions/for-i-in-vec.rs b/src/test/ui/suggestions/for-i-in-vec.rs new file mode 100644 index 0000000000..304fe8cc81 --- /dev/null +++ b/src/test/ui/suggestions/for-i-in-vec.rs @@ -0,0 +1,15 @@ +// run-rustfix +#![allow(dead_code)] + +struct Foo { + v: Vec<u32>, +} + +impl Foo { + fn bar(&self) { + for _ in self.v { //~ ERROR cannot move out of `self.v` which is behind a shared reference + } + } +} + +fn main() {} diff --git a/src/test/ui/suggestions/for-i-in-vec.stderr b/src/test/ui/suggestions/for-i-in-vec.stderr new file mode 100644 index 0000000000..576a7cc2f6 --- /dev/null +++ b/src/test/ui/suggestions/for-i-in-vec.stderr @@ -0,0 +1,12 @@ +error[E0507]: cannot move out of `self.v` which is behind a shared reference + --> $DIR/for-i-in-vec.rs:10:18 + | +LL | for _ in self.v { + | ^^^^^^ + | | + | move occurs because `self.v` has type `std::vec::Vec<u32>`, which does not implement the `Copy` trait + | help: consider iterating over a slice of the `Vec<_>`'s content: `&self.v` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0507`. diff --git a/src/test/ui/suggestions/impl-trait-with-missing-trait-bounds-in-arg.stderr b/src/test/ui/suggestions/impl-trait-with-missing-trait-bounds-in-arg.stderr index 4aec72006e..db54d044d9 100644 --- a/src/test/ui/suggestions/impl-trait-with-missing-trait-bounds-in-arg.stderr +++ b/src/test/ui/suggestions/impl-trait-with-missing-trait-bounds-in-arg.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `hello` found for type `impl Foo` in the current scope +error[E0599]: no method named `hello` found for type parameter `impl Foo` in the current scope --> $DIR/impl-trait-with-missing-trait-bounds-in-arg.rs:15:9 | LL | foo.hello(); diff --git a/src/test/ui/suggestions/issue-21673.stderr b/src/test/ui/suggestions/issue-21673.stderr index f2496f696d..14c7b18ea5 100644 --- a/src/test/ui/suggestions/issue-21673.stderr +++ b/src/test/ui/suggestions/issue-21673.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `method` found for type `&T` in the current scope +error[E0599]: no method named `method` found for reference `&T` in the current scope --> $DIR/issue-21673.rs:6:7 | LL | x.method() @@ -10,7 +10,7 @@ help: the following trait defines an item `method`, perhaps you need to restrict LL | fn call_method<T: Foo + std::fmt::Debug>(x: &T) { | ^^^^^^^^ -error[E0599]: no method named `method` found for type `T` in the current scope +error[E0599]: no method named `method` found for type parameter `T` in the current scope --> $DIR/issue-21673.rs:10:7 | LL | x.method() diff --git a/src/test/ui/suggestions/issue-66968-suggest-sorted-words.rs b/src/test/ui/suggestions/issue-66968-suggest-sorted-words.rs new file mode 100644 index 0000000000..440bb653a8 --- /dev/null +++ b/src/test/ui/suggestions/issue-66968-suggest-sorted-words.rs @@ -0,0 +1,4 @@ +fn main() { + let a_longer_variable_name = 1; + println!("{}", a_variable_longer_name); //~ ERROR E0425 +} diff --git a/src/test/ui/suggestions/issue-66968-suggest-sorted-words.stderr b/src/test/ui/suggestions/issue-66968-suggest-sorted-words.stderr new file mode 100644 index 0000000000..d7b33ea41f --- /dev/null +++ b/src/test/ui/suggestions/issue-66968-suggest-sorted-words.stderr @@ -0,0 +1,9 @@ +error[E0425]: cannot find value `a_variable_longer_name` in this scope + --> $DIR/issue-66968-suggest-sorted-words.rs:3:20 + | +LL | println!("{}", a_variable_longer_name); + | ^^^^^^^^^^^^^^^^^^^^^^ help: a local variable with a similar name exists: `a_longer_variable_name` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0425`. diff --git a/src/test/ui/suggestions/let-binding-init-expr-as-ty.rs b/src/test/ui/suggestions/let-binding-init-expr-as-ty.rs index 94c72a31e5..06ee421fc3 100644 --- a/src/test/ui/suggestions/let-binding-init-expr-as-ty.rs +++ b/src/test/ui/suggestions/let-binding-init-expr-as-ty.rs @@ -1,7 +1,6 @@ pub fn foo(num: i32) -> i32 { let foo: i32::from_be(num); //~^ ERROR expected type, found local variable `num` - //~| ERROR type arguments are not allowed for this type //~| ERROR parenthesized type parameters may only be used with a `Fn` trait //~| ERROR ambiguous associated type foo diff --git a/src/test/ui/suggestions/let-binding-init-expr-as-ty.stderr b/src/test/ui/suggestions/let-binding-init-expr-as-ty.stderr index 5353b3a75b..63ba7893f0 100644 --- a/src/test/ui/suggestions/let-binding-init-expr-as-ty.stderr +++ b/src/test/ui/suggestions/let-binding-init-expr-as-ty.stderr @@ -15,19 +15,13 @@ LL | let foo: i32::from_be(num); | only `Fn` traits may use parentheses | help: use angle brackets instead: `from_be<num>` -error[E0109]: type arguments are not allowed for this type - --> $DIR/let-binding-init-expr-as-ty.rs:2:27 - | -LL | let foo: i32::from_be(num); - | ^^^ type argument not allowed - error[E0223]: ambiguous associated type --> $DIR/let-binding-init-expr-as-ty.rs:2:14 | LL | let foo: i32::from_be(num); | ^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<i32 as Trait>::from_be` -error: aborting due to 4 previous errors +error: aborting due to 3 previous errors -Some errors have detailed explanations: E0109, E0214, E0223, E0573. -For more information about an error, try `rustc --explain E0109`. +Some errors have detailed explanations: E0214, E0223, E0573. +For more information about an error, try `rustc --explain E0214`. diff --git a/src/test/ui/suggestions/mut-borrow-needed-by-trait.rs b/src/test/ui/suggestions/mut-borrow-needed-by-trait.rs index dcef2ada63..f8b8637718 100644 --- a/src/test/ui/suggestions/mut-borrow-needed-by-trait.rs +++ b/src/test/ui/suggestions/mut-borrow-needed-by-trait.rs @@ -19,5 +19,5 @@ fn main() { //~| ERROR the trait bound `&dyn std::io::Write: std::io::Write` is not satisfied //~| ERROR the trait bound `&dyn std::io::Write: std::io::Write` is not satisfied - writeln!(fp, "hello world").unwrap(); //~ ERROR no method named `write_fmt` found for type + writeln!(fp, "hello world").unwrap(); //~ ERROR no method named `write_fmt` found for struct } diff --git a/src/test/ui/suggestions/mut-borrow-needed-by-trait.stderr b/src/test/ui/suggestions/mut-borrow-needed-by-trait.stderr index daa8e1162d..2c3c07c19e 100644 --- a/src/test/ui/suggestions/mut-borrow-needed-by-trait.stderr +++ b/src/test/ui/suggestions/mut-borrow-needed-by-trait.stderr @@ -25,7 +25,7 @@ LL | let fp = BufWriter::new(fp); = note: `std::io::Write` is implemented for `&mut dyn std::io::Write`, but not for `&dyn std::io::Write` = note: required by `std::io::BufWriter` -error[E0599]: no method named `write_fmt` found for type `std::io::BufWriter<&dyn std::io::Write>` in the current scope +error[E0599]: no method named `write_fmt` found for struct `std::io::BufWriter<&dyn std::io::Write>` in the current scope --> $DIR/mut-borrow-needed-by-trait.rs:22:5 | LL | writeln!(fp, "hello world").unwrap(); diff --git a/src/test/ui/suggestions/no-extern-crate-in-type.stderr b/src/test/ui/suggestions/no-extern-crate-in-type.stderr index 22aad3b0a9..0a73a26913 100644 --- a/src/test/ui/suggestions/no-extern-crate-in-type.stderr +++ b/src/test/ui/suggestions/no-extern-crate-in-type.stderr @@ -8,6 +8,10 @@ help: possible candidate is found in another module, you can import it into scop | LL | use foo::Foo; | +help: you might be missing a type parameter + | +LL | type Output<Foo> = Option<Foo>; + | ^^^^^ error: aborting due to previous error diff --git a/src/test/ui/suggestions/opaque-type-error.rs b/src/test/ui/suggestions/opaque-type-error.rs index 979bb60d48..5e11474031 100644 --- a/src/test/ui/suggestions/opaque-type-error.rs +++ b/src/test/ui/suggestions/opaque-type-error.rs @@ -17,7 +17,7 @@ async fn thing() -> Result<(), ()> { if true { thing_one() } else { - thing_two() //~ ERROR if and else have incompatible types + thing_two() //~ ERROR `if` and `else` have incompatible types }.await } diff --git a/src/test/ui/suggestions/opaque-type-error.stderr b/src/test/ui/suggestions/opaque-type-error.stderr index e7bf84a411..167d61bdf7 100644 --- a/src/test/ui/suggestions/opaque-type-error.stderr +++ b/src/test/ui/suggestions/opaque-type-error.stderr @@ -1,6 +1,9 @@ -error[E0308]: if and else have incompatible types +error[E0308]: `if` and `else` have incompatible types --> $DIR/opaque-type-error.rs:20:9 | +LL | fn thing_two() -> impl Future<Output = Result<(), ()>> { + | ------------------------------------ the found opaque type +... LL | / if true { LL | | thing_one() | | ----------- expected because of this @@ -8,7 +11,7 @@ LL | | } else { LL | | thing_two() | | ^^^^^^^^^^^ expected opaque type, found a different opaque type LL | | }.await - | |_____- if and else have incompatible types + | |_____- `if` and `else` have incompatible types | = note: expected type `impl std::future::Future` (opaque type at <$DIR/opaque-type-error.rs:8:19>) found opaque type `impl std::future::Future` (opaque type at <$DIR/opaque-type-error.rs:12:19>) diff --git a/src/test/ui/suggestions/remove-as_str.rs b/src/test/ui/suggestions/remove-as_str.rs index d10300b48b..289a784ba6 100644 --- a/src/test/ui/suggestions/remove-as_str.rs +++ b/src/test/ui/suggestions/remove-as_str.rs @@ -1,21 +1,21 @@ fn foo1(s: &str) { s.as_str(); - //~^ ERROR no method named `as_str` found for type `&str` in the current scope + //~^ ERROR no method named `as_str` found } fn foo2<'a>(s: &'a str) { s.as_str(); - //~^ ERROR no method named `as_str` found for type `&'a str` in the current scope + //~^ ERROR no method named `as_str` found } fn foo3(s: &mut str) { s.as_str(); - //~^ ERROR no method named `as_str` found for type `&mut str` in the current scope + //~^ ERROR no method named `as_str` found } fn foo4(s: &&str) { s.as_str(); - //~^ ERROR no method named `as_str` found for type `&&str` in the current scope + //~^ ERROR no method named `as_str` found } fn main() {} diff --git a/src/test/ui/suggestions/remove-as_str.stderr b/src/test/ui/suggestions/remove-as_str.stderr index eae9cc0750..534c497780 100644 --- a/src/test/ui/suggestions/remove-as_str.stderr +++ b/src/test/ui/suggestions/remove-as_str.stderr @@ -1,22 +1,22 @@ -error[E0599]: no method named `as_str` found for type `&str` in the current scope +error[E0599]: no method named `as_str` found for reference `&str` in the current scope --> $DIR/remove-as_str.rs:2:7 | LL | s.as_str(); | -^^^^^^-- help: remove this method call -error[E0599]: no method named `as_str` found for type `&'a str` in the current scope +error[E0599]: no method named `as_str` found for reference `&'a str` in the current scope --> $DIR/remove-as_str.rs:7:7 | LL | s.as_str(); | -^^^^^^-- help: remove this method call -error[E0599]: no method named `as_str` found for type `&mut str` in the current scope +error[E0599]: no method named `as_str` found for mutable reference `&mut str` in the current scope --> $DIR/remove-as_str.rs:12:7 | LL | s.as_str(); | -^^^^^^-- help: remove this method call -error[E0599]: no method named `as_str` found for type `&&str` in the current scope +error[E0599]: no method named `as_str` found for reference `&&str` in the current scope --> $DIR/remove-as_str.rs:17:7 | LL | s.as_str(); diff --git a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish-through-deref.rs b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish-through-deref.rs index 5480adb310..f738a1f211 100644 --- a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish-through-deref.rs +++ b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish-through-deref.rs @@ -9,5 +9,5 @@ fn main() { let shared_state = RefCell::new(HasAssocMethod); let state = shared_state.borrow_mut(); state.hello(); - //~^ ERROR no method named `hello` found for type `std::cell::RefMut<'_, HasAssocMethod>` + //~^ ERROR no method named `hello` found } diff --git a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish-through-deref.stderr b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish-through-deref.stderr index a1c0126146..507f822e7b 100644 --- a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish-through-deref.stderr +++ b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish-through-deref.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `hello` found for type `std::cell::RefMut<'_, HasAssocMethod>` in the current scope +error[E0599]: no method named `hello` found for struct `std::cell::RefMut<'_, HasAssocMethod>` in the current scope --> $DIR/suggest-assoc-fn-call-with-turbofish-through-deref.rs:11:11 | LL | state.hello(); diff --git a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.rs b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.rs index ef4b38de94..2a829db538 100644 --- a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.rs +++ b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.rs @@ -7,5 +7,5 @@ impl<T> GenericAssocMethod<T> { fn main() { let x = GenericAssocMethod(33i32); x.default_hello(); - //~^ ERROR no method named `default_hello` found for type `GenericAssocMethod<i32>` + //~^ ERROR no method named `default_hello` found } diff --git a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.stderr b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.stderr index 8cfa7de08b..dfc1887d3a 100644 --- a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.stderr +++ b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `default_hello` found for type `GenericAssocMethod<i32>` in the current scope +error[E0599]: no method named `default_hello` found for struct `GenericAssocMethod<i32>` in the current scope --> $DIR/suggest-assoc-fn-call-with-turbofish.rs:9:7 | LL | struct GenericAssocMethod<T>(T); diff --git a/src/test/ui/suggestions/suggest-methods.stderr b/src/test/ui/suggestions/suggest-methods.stderr index 4678410eb4..a715c56594 100644 --- a/src/test/ui/suggestions/suggest-methods.stderr +++ b/src/test/ui/suggestions/suggest-methods.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `bat` found for type `Foo` in the current scope +error[E0599]: no method named `bat` found for struct `Foo` in the current scope --> $DIR/suggest-methods.rs:18:7 | LL | struct Foo; @@ -7,7 +7,7 @@ LL | struct Foo; LL | f.bat(1.0); | ^^^ help: there is a method with a similar name: `bar` -error[E0599]: no method named `is_emtpy` found for type `std::string::String` in the current scope +error[E0599]: no method named `is_emtpy` found for struct `std::string::String` in the current scope --> $DIR/suggest-methods.rs:21:15 | LL | let _ = s.is_emtpy(); diff --git a/src/test/ui/suggestions/suggest-variants.rs b/src/test/ui/suggestions/suggest-variants.rs index d418834432..dd05d0f04a 100644 --- a/src/test/ui/suggestions/suggest-variants.rs +++ b/src/test/ui/suggestions/suggest-variants.rs @@ -9,9 +9,9 @@ struct S { } fn main() { - println!("My shape is {:?}", Shape::Squareee { size: 5}); //~ ERROR no variant `Squareee` - println!("My shape is {:?}", Shape::Circl { size: 5}); //~ ERROR no variant `Circl` - println!("My shape is {:?}", Shape::Rombus{ size: 5}); //~ ERROR no variant `Rombus` + println!("My shape is {:?}", Shape::Squareee { size: 5}); //~ ERROR no variant named `Squareee` + println!("My shape is {:?}", Shape::Circl { size: 5}); //~ ERROR no variant named `Circl` + println!("My shape is {:?}", Shape::Rombus{ size: 5}); //~ ERROR no variant named `Rombus` Shape::Squareee; //~ ERROR no variant Shape::Circl; //~ ERROR no variant Shape::Rombus; //~ ERROR no variant diff --git a/src/test/ui/suggestions/suggest-variants.stderr b/src/test/ui/suggestions/suggest-variants.stderr index b4338e2055..9227baa3e1 100644 --- a/src/test/ui/suggestions/suggest-variants.stderr +++ b/src/test/ui/suggestions/suggest-variants.stderr @@ -1,4 +1,4 @@ -error: no variant `Squareee` in enum `Shape` +error[E0599]: no variant named `Squareee` found for enum `Shape` --> $DIR/suggest-variants.rs:12:41 | LL | enum Shape { @@ -7,7 +7,7 @@ LL | enum Shape { LL | println!("My shape is {:?}", Shape::Squareee { size: 5}); | ^^^^^^^^ help: there is a variant with a similar name: `Square` -error: no variant `Circl` in enum `Shape` +error[E0599]: no variant named `Circl` found for enum `Shape` --> $DIR/suggest-variants.rs:13:41 | LL | enum Shape { @@ -16,7 +16,7 @@ LL | enum Shape { LL | println!("My shape is {:?}", Shape::Circl { size: 5}); | ^^^^^ help: there is a variant with a similar name: `Circle` -error: no variant `Rombus` in enum `Shape` +error[E0599]: no variant named `Rombus` found for enum `Shape` --> $DIR/suggest-variants.rs:14:41 | LL | enum Shape { @@ -25,7 +25,7 @@ LL | enum Shape { LL | println!("My shape is {:?}", Shape::Rombus{ size: 5}); | ^^^^^^ variant not found in `Shape` -error[E0599]: no variant or associated item named `Squareee` found for type `Shape` in the current scope +error[E0599]: no variant or associated item named `Squareee` found for enum `Shape` in the current scope --> $DIR/suggest-variants.rs:15:12 | LL | enum Shape { @@ -37,7 +37,7 @@ LL | Shape::Squareee; | variant or associated item not found in `Shape` | help: there is a variant with a similar name: `Square` -error[E0599]: no variant or associated item named `Circl` found for type `Shape` in the current scope +error[E0599]: no variant or associated item named `Circl` found for enum `Shape` in the current scope --> $DIR/suggest-variants.rs:16:12 | LL | enum Shape { @@ -49,7 +49,7 @@ LL | Shape::Circl; | variant or associated item not found in `Shape` | help: there is a variant with a similar name: `Circle` -error[E0599]: no variant or associated item named `Rombus` found for type `Shape` in the current scope +error[E0599]: no variant or associated item named `Rombus` found for enum `Shape` in the current scope --> $DIR/suggest-variants.rs:17:12 | LL | enum Shape { diff --git a/src/test/ui/suggestions/use-type-argument-instead-of-assoc-type.stderr b/src/test/ui/suggestions/use-type-argument-instead-of-assoc-type.stderr index 098d76a5c4..58a73187fb 100644 --- a/src/test/ui/suggestions/use-type-argument-instead-of-assoc-type.stderr +++ b/src/test/ui/suggestions/use-type-argument-instead-of-assoc-type.stderr @@ -6,8 +6,8 @@ LL | i: Box<dyn T<usize, usize, usize, usize, B=usize>>, | | | unexpected type argument -error[E0191]: the value of the associated types `A` (from the trait `T`), `C` (from the trait `T`) must be specified - --> $DIR/use-type-argument-instead-of-assoc-type.rs:7:12 +error[E0191]: the value of the associated types `A` (from trait `T`), `C` (from trait `T`) must be specified + --> $DIR/use-type-argument-instead-of-assoc-type.rs:7:16 | LL | type A; | ------- `A` defined here @@ -16,12 +16,9 @@ LL | type C; | ------- `C` defined here ... LL | i: Box<dyn T<usize, usize, usize, usize, B=usize>>, - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | associated type `A` must be specified - | associated type `C` must be specified + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ associated types `A`, `C` must be specified | -help: if you meant to specify the associated types, write +help: specify the associated types | LL | i: Box<dyn T<usize, usize, A = usize, C = usize, B=usize>>, | ^^^^^^^^^ ^^^^^^^^^ diff --git a/src/test/ui/suggestions/vec-macro-in-pattern.stderr b/src/test/ui/suggestions/vec-macro-in-pattern.stderr index 59ca8ebbf6..1634fdde7d 100644 --- a/src/test/ui/suggestions/vec-macro-in-pattern.stderr +++ b/src/test/ui/suggestions/vec-macro-in-pattern.stderr @@ -5,11 +5,12 @@ LL | Some(vec![_x]) => (), | ^^^^^^^^ | | | unexpected `(` after qualified path + | the qualified path | in this macro invocation | help: use a slice pattern here instead: `[_x]` | = help: for more information, see https://doc.rust-lang.org/edition-guide/rust-2018/slice-patterns.html - = note: this warning originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error: aborting due to previous error diff --git a/src/test/ui/super-at-top-level.rs b/src/test/ui/super-at-top-level.rs index 41360df779..e4d587bc9e 100644 --- a/src/test/ui/super-at-top-level.rs +++ b/src/test/ui/super-at-top-level.rs @@ -1,4 +1,4 @@ -use super::f; //~ ERROR there are too many initial `super`s +use super::f; //~ ERROR there are too many leading `super` keywords fn main() { } diff --git a/src/test/ui/super-at-top-level.stderr b/src/test/ui/super-at-top-level.stderr index d04ce384fe..23613df675 100644 --- a/src/test/ui/super-at-top-level.stderr +++ b/src/test/ui/super-at-top-level.stderr @@ -1,8 +1,8 @@ -error[E0433]: failed to resolve: there are too many initial `super`s. +error[E0433]: failed to resolve: there are too many leading `super` keywords --> $DIR/super-at-top-level.rs:1:5 | LL | use super::f; - | ^^^^^ there are too many initial `super`s. + | ^^^^^ there are too many leading `super` keywords error: aborting due to previous error diff --git a/src/test/ui/symbol-names/basic.legacy.stderr b/src/test/ui/symbol-names/basic.legacy.stderr index 52e777285e..895ff5ae54 100644 --- a/src/test/ui/symbol-names/basic.legacy.stderr +++ b/src/test/ui/symbol-names/basic.legacy.stderr @@ -1,23 +1,23 @@ error: symbol-name(_ZN5basic4main17h81759b0695851718E) - --> $DIR/basic.rs:7:1 + --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling(basic::main::h81759b0695851718) - --> $DIR/basic.rs:7:1 + --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(basic::main) - --> $DIR/basic.rs:7:1 + --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(main) - --> $DIR/basic.rs:14:1 + --> $DIR/basic.rs:15:1 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/symbol-names/basic.rs b/src/test/ui/symbol-names/basic.rs index aa88184edd..ddc349d7f1 100644 --- a/src/test/ui/symbol-names/basic.rs +++ b/src/test/ui/symbol-names/basic.rs @@ -1,3 +1,4 @@ +// build-fail // revisions: legacy v0 //[legacy]compile-flags: -Z symbol-mangling-version=legacy //[v0]compile-flags: -Z symbol-mangling-version=v0 diff --git a/src/test/ui/symbol-names/basic.v0.stderr b/src/test/ui/symbol-names/basic.v0.stderr index 40a39daaed..36dba0dfc9 100644 --- a/src/test/ui/symbol-names/basic.v0.stderr +++ b/src/test/ui/symbol-names/basic.v0.stderr @@ -1,23 +1,23 @@ error: symbol-name(_RNvCs4fqI2P2rA04_5basic4main) - --> $DIR/basic.rs:7:1 + --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling(basic[317d481089b8c8fe]::main) - --> $DIR/basic.rs:7:1 + --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(basic::main) - --> $DIR/basic.rs:7:1 + --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(main) - --> $DIR/basic.rs:14:1 + --> $DIR/basic.rs:15:1 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/symbol-names/impl1.legacy.stderr b/src/test/ui/symbol-names/impl1.legacy.stderr index c9495b597e..33cacaf212 100644 --- a/src/test/ui/symbol-names/impl1.legacy.stderr +++ b/src/test/ui/symbol-names/impl1.legacy.stderr @@ -1,71 +1,71 @@ error: symbol-name(_ZN5impl13foo3Foo3bar17h92cf46db76791039E) - --> $DIR/impl1.rs:13:9 + --> $DIR/impl1.rs:16:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling(impl1::foo::Foo::bar::h92cf46db76791039) - --> $DIR/impl1.rs:13:9 + --> $DIR/impl1.rs:16:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(impl1::foo::Foo::bar) - --> $DIR/impl1.rs:13:9 + --> $DIR/impl1.rs:16:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(foo::Foo::bar) - --> $DIR/impl1.rs:20:9 + --> $DIR/impl1.rs:23:9 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ error: symbol-name(_ZN5impl13bar33_$LT$impl$u20$impl1..foo..Foo$GT$3baz17h90c4a800b1aa0df0E) - --> $DIR/impl1.rs:31:9 + --> $DIR/impl1.rs:34:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling(impl1::bar::<impl impl1::foo::Foo>::baz::h90c4a800b1aa0df0) - --> $DIR/impl1.rs:31:9 + --> $DIR/impl1.rs:34:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(impl1::bar::<impl impl1::foo::Foo>::baz) - --> $DIR/impl1.rs:31:9 + --> $DIR/impl1.rs:34:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(bar::<impl foo::Foo>::baz) - --> $DIR/impl1.rs:38:9 + --> $DIR/impl1.rs:41:9 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ -error: symbol-name(_ZN209_$LT$$u5b$$RF$dyn$u20$impl1..Foo$u2b$Assoc$u20$$u3d$$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$RF$u8$C$$u20$...$RP$$u2b$impl1..AutoTrait$u3b$$u20$_$u5d$$u20$as$u20$impl1..main..$u7b$$u7b$closure$u7d$$u7d$..Bar$GT$6method17h92c563325b7ff21aE) - --> $DIR/impl1.rs:61:13 +error: symbol-name(_ZN209_$LT$$u5b$$RF$dyn$u20$impl1..Foo$u2b$Assoc$u20$$u3d$$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$RF$u8$C$$u20$...$RP$$u2b$impl1..AutoTrait$u3b$$u20$3$u5d$$u20$as$u20$impl1..main..$u7b$$u7b$closure$u7d$$u7d$..Bar$GT$6method17SYMBOL_HASHE) + --> $DIR/impl1.rs:64:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; _] as impl1::main::{{closure}}::Bar>::method::h92c563325b7ff21a) - --> $DIR/impl1.rs:61:13 +error: demangling(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method::SYMBOL_HASH) + --> $DIR/impl1.rs:64:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling-alt(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; _] as impl1::main::{{closure}}::Bar>::method) - --> $DIR/impl1.rs:61:13 +error: demangling-alt(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method) + --> $DIR/impl1.rs:64:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; _] as main::{{closure}}#1::Bar>::method) - --> $DIR/impl1.rs:68:13 +error: def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{{closure}}#1::Bar>::method) + --> $DIR/impl1.rs:71:13 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/symbol-names/impl1.rs b/src/test/ui/symbol-names/impl1.rs index add0d10ea6..1f689a5bd2 100644 --- a/src/test/ui/symbol-names/impl1.rs +++ b/src/test/ui/symbol-names/impl1.rs @@ -1,7 +1,10 @@ +// build-fail // ignore-tidy-linelength // revisions: legacy v0 //[legacy]compile-flags: -Z symbol-mangling-version=legacy //[v0]compile-flags: -Z symbol-mangling-version=v0 +//[legacy]normalize-stderr-32bit: "hdb62078998ce7ea8" -> "SYMBOL_HASH" +//[legacy]normalize-stderr-64bit: "h62e540f14f879d56" -> "SYMBOL_HASH" #![feature(optin_builtin_traits, rustc_attrs)] #![allow(dead_code)] @@ -59,15 +62,15 @@ fn main() { // Test type mangling, by putting them in an `impl` header. impl Bar for [&'_ (dyn Foo<Assoc = extern fn(&u8, ...)> + AutoTrait); 3] { #[rustc_symbol_name] - //[legacy]~^ ERROR symbol-name(_ZN209_$LT$$u5b$$RF$dyn$u20$impl1..Foo$u2b$Assoc$u20$$u3d$$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$RF$u8$C$$u20$...$RP$$u2b$impl1..AutoTrait$u3b$$u20$_$u5d$$u20$as$u20$impl1..main..$u7b$$u7b$closure$u7d$$u7d$..Bar$GT$6method - //[legacy]~| ERROR demangling(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; _] as impl1::main::{{closure}}::Bar>::method - //[legacy]~| ERROR demangling-alt(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; _] as impl1::main::{{closure}}::Bar>::method) + //[legacy]~^ ERROR symbol-name(_ZN209_$LT$$u5b$$RF$dyn$u20$impl1..Foo$u2b$Assoc$u20$$u3d$$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$RF$u8$C$$u20$...$RP$$u2b$impl1..AutoTrait$u3b$$u20$3$u5d$$u20$as$u20$impl1..main..$u7b$$u7b$closure$u7d$$u7d$..Bar$GT$6method + //[legacy]~| ERROR demangling(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method + //[legacy]~| ERROR demangling-alt(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method) //[v0]~^^^^ ERROR symbol-name(_RNvXNCNvCs4fqI2P2rA04_5impl14mains_0ARDNtB6_3Foop5AssocFG_KCRL0_hvEuNtB6_9AutoTraitEL_j3_NtB2_3Bar6method) //[v0]~| ERROR demangling(<[&dyn impl1[317d481089b8c8fe]::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1[317d481089b8c8fe]::AutoTrait; 3: usize] as impl1[317d481089b8c8fe]::main::{closure#1}::Bar>::method) //[v0]~| ERROR demangling-alt(<[&dyn impl1::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1::AutoTrait; 3] as impl1::main::{closure#1}::Bar>::method) #[rustc_def_path] - //[legacy]~^ ERROR def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; _] as main::{{closure}}#1::Bar>::method) - //[v0]~^^ ERROR def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; _] as main::{{closure}}#1::Bar>::method) + //[legacy]~^ ERROR def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{{closure}}#1::Bar>::method) + //[v0]~^^ ERROR def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{{closure}}#1::Bar>::method) fn method(&self) {} } }; diff --git a/src/test/ui/symbol-names/impl1.v0.stderr b/src/test/ui/symbol-names/impl1.v0.stderr index 01fe39ddf6..b6a35d9746 100644 --- a/src/test/ui/symbol-names/impl1.v0.stderr +++ b/src/test/ui/symbol-names/impl1.v0.stderr @@ -1,71 +1,71 @@ error: symbol-name(_RNvMNtCs4fqI2P2rA04_5impl13fooNtB2_3Foo3bar) - --> $DIR/impl1.rs:13:9 + --> $DIR/impl1.rs:16:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling(<impl1[317d481089b8c8fe]::foo::Foo>::bar) - --> $DIR/impl1.rs:13:9 + --> $DIR/impl1.rs:16:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(<impl1::foo::Foo>::bar) - --> $DIR/impl1.rs:13:9 + --> $DIR/impl1.rs:16:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(foo::Foo::bar) - --> $DIR/impl1.rs:20:9 + --> $DIR/impl1.rs:23:9 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ error: symbol-name(_RNvMNtCs4fqI2P2rA04_5impl13barNtNtB4_3foo3Foo3baz) - --> $DIR/impl1.rs:31:9 + --> $DIR/impl1.rs:34:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling(<impl1[317d481089b8c8fe]::foo::Foo>::baz) - --> $DIR/impl1.rs:31:9 + --> $DIR/impl1.rs:34:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(<impl1::foo::Foo>::baz) - --> $DIR/impl1.rs:31:9 + --> $DIR/impl1.rs:34:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(bar::<impl foo::Foo>::baz) - --> $DIR/impl1.rs:38:9 + --> $DIR/impl1.rs:41:9 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ error: symbol-name(_RNvXNCNvCs4fqI2P2rA04_5impl14mains_0ARDNtB6_3Foop5AssocFG_KCRL0_hvEuNtB6_9AutoTraitEL_j3_NtB2_3Bar6method) - --> $DIR/impl1.rs:61:13 + --> $DIR/impl1.rs:64:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling(<[&dyn impl1[317d481089b8c8fe]::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1[317d481089b8c8fe]::AutoTrait; 3: usize] as impl1[317d481089b8c8fe]::main::{closure#1}::Bar>::method) - --> $DIR/impl1.rs:61:13 + --> $DIR/impl1.rs:64:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(<[&dyn impl1::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1::AutoTrait; 3] as impl1::main::{closure#1}::Bar>::method) - --> $DIR/impl1.rs:61:13 + --> $DIR/impl1.rs:64:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; _] as main::{{closure}}#1::Bar>::method) - --> $DIR/impl1.rs:68:13 +error: def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{{closure}}#1::Bar>::method) + --> $DIR/impl1.rs:71:13 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/symbol-names/impl2.rs b/src/test/ui/symbol-names/impl2.rs index d48b182f2a..08add29cb9 100644 --- a/src/test/ui/symbol-names/impl2.rs +++ b/src/test/ui/symbol-names/impl2.rs @@ -1,3 +1,5 @@ +// build-fail + #![feature(rustc_attrs)] #![allow(dead_code)] diff --git a/src/test/ui/symbol-names/impl2.stderr b/src/test/ui/symbol-names/impl2.stderr index de26fed441..9833003160 100644 --- a/src/test/ui/symbol-names/impl2.stderr +++ b/src/test/ui/symbol-names/impl2.stderr @@ -1,5 +1,5 @@ error: def-path(<[u8; _] as Foo>::baz) - --> $DIR/impl2.rs:9:5 + --> $DIR/impl2.rs:11:5 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/symbol-names/issue-60925.legacy.stderr b/src/test/ui/symbol-names/issue-60925.legacy.stderr index 19d9740fb1..0e3a34adbc 100644 --- a/src/test/ui/symbol-names/issue-60925.legacy.stderr +++ b/src/test/ui/symbol-names/issue-60925.legacy.stderr @@ -1,17 +1,17 @@ error: symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo17hc86312d25b60f6eeE) - --> $DIR/issue-60925.rs:21:9 + --> $DIR/issue-60925.rs:22:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling(issue_60925::foo::Foo<issue_60925::llvm::Foo>::foo::hc86312d25b60f6ee) - --> $DIR/issue-60925.rs:21:9 + --> $DIR/issue-60925.rs:22:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(issue_60925::foo::Foo<issue_60925::llvm::Foo>::foo) - --> $DIR/issue-60925.rs:21:9 + --> $DIR/issue-60925.rs:22:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/symbol-names/issue-60925.rs b/src/test/ui/symbol-names/issue-60925.rs index 02438351db..55b7041935 100644 --- a/src/test/ui/symbol-names/issue-60925.rs +++ b/src/test/ui/symbol-names/issue-60925.rs @@ -1,3 +1,4 @@ +// build-fail // ignore-tidy-linelength // revisions: legacy v0 //[legacy]compile-flags: -Z symbol-mangling-version=legacy diff --git a/src/test/ui/symbol-names/issue-60925.v0.stderr b/src/test/ui/symbol-names/issue-60925.v0.stderr index 5ead40211d..78594b88b4 100644 --- a/src/test/ui/symbol-names/issue-60925.v0.stderr +++ b/src/test/ui/symbol-names/issue-60925.v0.stderr @@ -1,17 +1,17 @@ error: symbol-name(_RNvMNtCs4fqI2P2rA04_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo) - --> $DIR/issue-60925.rs:21:9 + --> $DIR/issue-60925.rs:22:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling(<issue_60925[317d481089b8c8fe]::foo::Foo<issue_60925[317d481089b8c8fe]::llvm::Foo>>::foo) - --> $DIR/issue-60925.rs:21:9 + --> $DIR/issue-60925.rs:22:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(<issue_60925::foo::Foo<issue_60925::llvm::Foo>>::foo) - --> $DIR/issue-60925.rs:21:9 + --> $DIR/issue-60925.rs:22:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/terminal-width/non-1-width-unicode-multiline-label.rs b/src/test/ui/terminal-width/non-1-width-unicode-multiline-label.rs index cc94680530..1989ea8863 100644 --- a/src/test/ui/terminal-width/non-1-width-unicode-multiline-label.rs +++ b/src/test/ui/terminal-width/non-1-width-unicode-multiline-label.rs @@ -3,5 +3,5 @@ fn main() { let unicode_is_fun = "؁‱ஹ௸௵꧄.ဪ꧅⸻𒈙𒐫﷽𒌄𒈟𒍼𒁎𒀱𒌧𒅃 𒈓𒍙𒊎𒄡𒅌𒁏𒀰𒐪𒐩𒈙𒐫𪚥"; let _ = "ༀ༁༂༃༄༅༆༇༈༉༊་༌།༎༏༐༑༒༓༔༕༖༗༘༙༚༛༜༝༞༟༠༡༢༣༤༥༦༧༨༩༪༫༬༭༮༯༰༱༲༳༴༵༶༷༸༹༺༻༼༽༾༿ཀཁགགྷངཅཆཇ཈ཉཊཋཌཌྷཎཏཐདདྷནཔཕབབྷམཙཚཛཛྷཝཞཟའཡརལཤཥསཧཨཀྵཪཫཬ཭཮཯཰ཱཱཱིིུུྲྀཷླྀཹེཻོཽཾཿ྄ཱྀྀྂྃ྅྆྇ྈྉྊྋྌྍྎྏྐྑྒྒྷྔྕྖྗ྘ྙྚྛྜྜྷྞྟྠྡྡྷྣྤྥྦྦྷྨྩྪྫྫྷྭྮྯྰྱྲླྴྵྶྷྸྐྵྺྻྼ྽྾྿࿀࿁࿂࿃࿄࿅࿆࿇࿈࿉࿊࿋࿌࿍࿎࿏࿐࿑࿒࿓࿔࿕࿖࿗࿘࿙࿚"; let _a = unicode_is_fun + " really fun!"; - //~^ ERROR binary operation `+` cannot be applied to type `&str` + //~^ ERROR cannot add `&str` to `&str` } diff --git a/src/test/ui/terminal-width/non-1-width-unicode-multiline-label.stderr b/src/test/ui/terminal-width/non-1-width-unicode-multiline-label.stderr index 9f0f990670..69daa93412 100644 --- a/src/test/ui/terminal-width/non-1-width-unicode-multiline-label.stderr +++ b/src/test/ui/terminal-width/non-1-width-unicode-multiline-label.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `&str` +error[E0369]: cannot add `&str` to `&str` --> $DIR/non-1-width-unicode-multiline-label.rs:5:260 | LL | ...ཽཾཿ྄ཱྀྀྂྃ྅྆྇ྈྉྊྋྌྍྎྏྐྑྒྒྷྔྕྖྗ྘ྙྚྛྜྜྷྞྟྠྡྡྷྣྤྥྦྦྷྨྩྪྫྫྷྭྮྯྰྱྲླྴྵྶྷྸྐྵྺྻྼ྽྾྿࿀࿁࿂࿃࿄࿅࿆࿇...࿋࿌࿍࿎࿏࿐࿑࿒࿓࿔࿕࿖࿗࿘࿙࿚"; let _a = unicode_is_fun + " really fun!"; diff --git a/src/test/ui/test-attrs/test-should-panic-attr.stderr b/src/test/ui/test-attrs/test-should-panic-attr.stderr index 4b032eba5f..d7d0d84432 100644 --- a/src/test/ui/test-attrs/test-should-panic-attr.stderr +++ b/src/test/ui/test-attrs/test-should-panic-attr.stderr @@ -4,7 +4,7 @@ warning: argument must be of the form: `expected = "error message"` LL | #[should_panic(expected)] | ^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: Errors in this attribute were erroneously allowed and will become a hard error in a future release. + = note: errors in this attribute were erroneously allowed and will become a hard error in a future release. warning: argument must be of the form: `expected = "error message"` --> $DIR/test-should-panic-attr.rs:18:1 @@ -12,7 +12,7 @@ warning: argument must be of the form: `expected = "error message"` LL | #[should_panic(expect)] | ^^^^^^^^^^^^^^^^^^^^^^^ | - = note: Errors in this attribute were erroneously allowed and will become a hard error in a future release. + = note: errors in this attribute were erroneously allowed and will become a hard error in a future release. warning: argument must be of the form: `expected = "error message"` --> $DIR/test-should-panic-attr.rs:25:1 @@ -20,7 +20,7 @@ warning: argument must be of the form: `expected = "error message"` LL | #[should_panic(expected(foo, bar))] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: Errors in this attribute were erroneously allowed and will become a hard error in a future release. + = note: errors in this attribute were erroneously allowed and will become a hard error in a future release. warning: argument must be of the form: `expected = "error message"` --> $DIR/test-should-panic-attr.rs:32:1 @@ -28,5 +28,5 @@ warning: argument must be of the form: `expected = "error message"` LL | #[should_panic(expected = "foo", bar)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: Errors in this attribute were erroneously allowed and will become a hard error in a future release. + = note: errors in this attribute were erroneously allowed and will become a hard error in a future release. diff --git a/src/test/ui/test-panic-abort.rs b/src/test/ui/test-panic-abort.rs index b0679ea1d3..b7bf5a150e 100644 --- a/src/test/ui/test-panic-abort.rs +++ b/src/test/ui/test-panic-abort.rs @@ -11,6 +11,7 @@ #![cfg(test)] use std::io::Write; +use std::env; #[test] fn it_works() { @@ -35,3 +36,13 @@ fn it_fails() { fn it_exits() { std::process::exit(123); } + +#[test] +fn no_residual_environment() { + for (key, _) in env::vars() { + // Look for keys like __RUST_TEST_INVOKE. + if key.contains("TEST_INVOKE") { + panic!("shouldn't have '{}' in environment", key); + } + } +} diff --git a/src/test/ui/test-panic-abort.run.stdout b/src/test/ui/test-panic-abort.run.stdout index 0c8bc50208..2f4bc32ed6 100644 --- a/src/test/ui/test-panic-abort.run.stdout +++ b/src/test/ui/test-panic-abort.run.stdout @@ -1,9 +1,10 @@ -running 4 tests +running 5 tests test it_exits ... FAILED test it_fails ... FAILED test it_panics ... ok test it_works ... ok +test no_residual_environment ... ok failures: @@ -17,13 +18,13 @@ testing123 testing321 thread 'main' panicked at 'assertion failed: `(left == right)` left: `2`, - right: `5`', $DIR/test-panic-abort.rs:31:5 -note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. + right: `5`', $DIR/test-panic-abort.rs:32:5 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: it_exits it_fails -test result: FAILED. 2 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 3 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out diff --git a/src/test/ui/threads-sendsync/sync-send-iterators-in-libcore.rs b/src/test/ui/threads-sendsync/sync-send-iterators-in-libcore.rs index 44beb9dc1e..2f6d35f01b 100644 --- a/src/test/ui/threads-sendsync/sync-send-iterators-in-libcore.rs +++ b/src/test/ui/threads-sendsync/sync-send-iterators-in-libcore.rs @@ -88,6 +88,7 @@ fn main() { is_sync_send!((1..)); is_sync_send!(repeat(1)); is_sync_send!(empty::<usize>()); + is_sync_send!(empty::<*mut i32>()); is_sync_send!(once(1)); // for option.rs diff --git a/src/test/ui/tool-attributes/tool-attributes-misplaced-1.rs b/src/test/ui/tool-attributes/tool-attributes-misplaced-1.rs index d5698be8d4..bf45ba2ed8 100644 --- a/src/test/ui/tool-attributes/tool-attributes-misplaced-1.rs +++ b/src/test/ui/tool-attributes/tool-attributes-misplaced-1.rs @@ -2,6 +2,7 @@ type A = rustfmt; //~ ERROR expected type, found tool module `rustfmt` type B = rustfmt::skip; //~ ERROR expected type, found tool attribute `rustfmt::skip` #[derive(rustfmt)] //~ ERROR cannot find derive macro `rustfmt` in this scope + //~| ERROR cannot find derive macro `rustfmt` in this scope struct S; // Interpreted as an unstable custom attribute diff --git a/src/test/ui/tool-attributes/tool-attributes-misplaced-1.stderr b/src/test/ui/tool-attributes/tool-attributes-misplaced-1.stderr index b831e624cb..71fd5f1d44 100644 --- a/src/test/ui/tool-attributes/tool-attributes-misplaced-1.stderr +++ b/src/test/ui/tool-attributes/tool-attributes-misplaced-1.stderr @@ -4,14 +4,20 @@ error: cannot find derive macro `rustfmt` in this scope LL | #[derive(rustfmt)] | ^^^^^^^ +error: cannot find derive macro `rustfmt` in this scope + --> $DIR/tool-attributes-misplaced-1.rs:4:10 + | +LL | #[derive(rustfmt)] + | ^^^^^^^ + error: cannot find attribute `rustfmt` in this scope - --> $DIR/tool-attributes-misplaced-1.rs:8:3 + --> $DIR/tool-attributes-misplaced-1.rs:9:3 | LL | #[rustfmt] | ^^^^^^^ error: cannot find macro `rustfmt` in this scope - --> $DIR/tool-attributes-misplaced-1.rs:14:5 + --> $DIR/tool-attributes-misplaced-1.rs:15:5 | LL | rustfmt!(); | ^^^^^^^ @@ -29,18 +35,18 @@ LL | type B = rustfmt::skip; | ^^^^^^^^^^^^^ not a type error[E0423]: expected value, found tool module `rustfmt` - --> $DIR/tool-attributes-misplaced-1.rs:13:5 + --> $DIR/tool-attributes-misplaced-1.rs:14:5 | LL | rustfmt; | ^^^^^^^ not a value error[E0423]: expected value, found tool attribute `rustfmt::skip` - --> $DIR/tool-attributes-misplaced-1.rs:16:5 + --> $DIR/tool-attributes-misplaced-1.rs:17:5 | LL | rustfmt::skip; | ^^^^^^^^^^^^^ not a value -error: aborting due to 7 previous errors +error: aborting due to 8 previous errors Some errors have detailed explanations: E0423, E0573. For more information about an error, try `rustc --explain E0423`. diff --git a/src/test/ui/tool_lints.rs b/src/test/ui/tool_lints.rs index fa8f041c64..9c8540eede 100644 --- a/src/test/ui/tool_lints.rs +++ b/src/test/ui/tool_lints.rs @@ -1,3 +1,5 @@ #[warn(foo::bar)] //~^ ERROR an unknown tool name found in scoped lint: `foo::bar` +//~| ERROR an unknown tool name found in scoped lint: `foo::bar` +//~| ERROR an unknown tool name found in scoped lint: `foo::bar` fn main() {} diff --git a/src/test/ui/tool_lints.stderr b/src/test/ui/tool_lints.stderr index de941604a9..86f87784ea 100644 --- a/src/test/ui/tool_lints.stderr +++ b/src/test/ui/tool_lints.stderr @@ -4,5 +4,17 @@ error[E0710]: an unknown tool name found in scoped lint: `foo::bar` LL | #[warn(foo::bar)] | ^^^ -error: aborting due to previous error +error[E0710]: an unknown tool name found in scoped lint: `foo::bar` + --> $DIR/tool_lints.rs:1:8 + | +LL | #[warn(foo::bar)] + | ^^^ + +error[E0710]: an unknown tool name found in scoped lint: `foo::bar` + --> $DIR/tool_lints.rs:1:8 + | +LL | #[warn(foo::bar)] + | ^^^ + +error: aborting due to 3 previous errors diff --git a/src/test/ui/trailing-comma.rs b/src/test/ui/trailing-comma.rs index 929c35a9e1..97006ae50a 100644 --- a/src/test/ui/trailing-comma.rs +++ b/src/test/ui/trailing-comma.rs @@ -1,8 +1,6 @@ // run-pass // pretty-expanded FIXME #23616 -#![feature(slice_patterns)] - fn f<T,>(_: T,) {} struct Foo<T,>(T); diff --git a/src/test/ui/traits/trait-alias-ambiguous.stderr b/src/test/ui/traits/trait-alias-ambiguous.stderr index cde7dd0824..48a029104a 100644 --- a/src/test/ui/traits/trait-alias-ambiguous.stderr +++ b/src/test/ui/traits/trait-alias-ambiguous.stderr @@ -9,13 +9,19 @@ note: candidate #1 is defined in an impl of the trait `inner::A` for the type `u | LL | fn foo(&self) {} | ^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `inner::A::foo(t)` instead note: candidate #2 is defined in an impl of the trait `inner::B` for the type `u8` --> $DIR/trait-alias-ambiguous.rs:11:9 | LL | fn foo(&self) {} | ^^^^^^^^^^^^^ - = help: to disambiguate the method call, write `inner::B::foo(t)` instead +help: disambiguate the method call for candidate #1 + | +LL | inner::A::foo(&t); + | ^^^^^^^^^^^^^^^^^ +help: disambiguate the method call for candidate #2 + | +LL | inner::B::foo(&t); + | ^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr b/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr index 9a9b917703..5551b1303b 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr +++ b/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr @@ -6,11 +6,11 @@ LL | let _: &dyn EqAlias = &123; | = note: the trait cannot use `Self` as a type parameter in the supertraits or where-clauses -error[E0191]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) must be specified - --> $DIR/trait-alias-object-fail.rs:9:13 +error[E0191]: the value of the associated type `Item` (from trait `std::iter::Iterator`) must be specified + --> $DIR/trait-alias-object-fail.rs:9:17 | LL | let _: &dyn IteratorAlias = &vec![123].into_iter(); - | ^^^^^^^^^^^^^^^^^ associated type `Item` must be specified + | ^^^^^^^^^^^^^ help: specify the associated type: `IteratorAlias<Item = Type>` error: aborting due to 2 previous errors diff --git a/src/test/ui/traits/trait-bounds-same-crate-name.rs b/src/test/ui/traits/trait-bounds-same-crate-name.rs index af720ecfdc..1012edb109 100644 --- a/src/test/ui/traits/trait-bounds-same-crate-name.rs +++ b/src/test/ui/traits/trait-bounds-same-crate-name.rs @@ -31,7 +31,7 @@ fn main() { a::try_foo(foo); //~^ ERROR E0277 //~| trait impl with same name found - //~| Perhaps two different versions of crate `crate_a2` + //~| perhaps two different versions of crate `crate_a2` // We don't want to see the "version mismatch" help message here // because `implements_no_traits` has no impl for `Foo` diff --git a/src/test/ui/traits/trait-bounds-same-crate-name.stderr b/src/test/ui/traits/trait-bounds-same-crate-name.stderr index 8fd0bd13e5..8a6e059604 100644 --- a/src/test/ui/traits/trait-bounds-same-crate-name.stderr +++ b/src/test/ui/traits/trait-bounds-same-crate-name.stderr @@ -14,7 +14,7 @@ help: trait impl with same name found | LL | impl Bar for Foo {} | ^^^^^^^^^^^^^^^^^^^ - = note: Perhaps two different versions of crate `crate_a2` are being used? + = note: perhaps two different versions of crate `crate_a2` are being used? error[E0277]: the trait bound `main::a::DoesNotImplementTrait: main::a::Bar` is not satisfied --> $DIR/trait-bounds-same-crate-name.rs:38:20 @@ -43,7 +43,7 @@ help: trait impl with same name found | LL | impl Bar for ImplementsWrongTraitConditionally<isize> {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - = note: Perhaps two different versions of crate `crate_a2` are being used? + = note: perhaps two different versions of crate `crate_a2` are being used? error[E0277]: the trait bound `main::a::ImplementsTraitForUsize<isize>: main::a::Bar` is not satisfied --> $DIR/trait-bounds-same-crate-name.rs:51:20 diff --git a/src/test/ui/traits/trait-impl-1.rs b/src/test/ui/traits/trait-impl-1.rs index 43b8222183..d22ac72d1c 100644 --- a/src/test/ui/traits/trait-impl-1.rs +++ b/src/test/ui/traits/trait-impl-1.rs @@ -12,5 +12,5 @@ impl T for i32 {} fn main() { let x = &42i32; - x.foo(); //~ERROR: no method named `foo` found for type `&i32` in the current scope + x.foo(); //~ERROR: no method named `foo` found } diff --git a/src/test/ui/traits/trait-impl-1.stderr b/src/test/ui/traits/trait-impl-1.stderr index 0d61c3ed00..da0936e8ee 100644 --- a/src/test/ui/traits/trait-impl-1.stderr +++ b/src/test/ui/traits/trait-impl-1.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `foo` found for type `&i32` in the current scope +error[E0599]: no method named `foo` found for reference `&i32` in the current scope --> $DIR/trait-impl-1.rs:15:7 | LL | x.foo(); diff --git a/src/test/ui/traits/trait-item-privacy.rs b/src/test/ui/traits/trait-item-privacy.rs index d58bbef38c..8507d8ef17 100644 --- a/src/test/ui/traits/trait-item-privacy.rs +++ b/src/test/ui/traits/trait-item-privacy.rs @@ -64,8 +64,8 @@ fn check_method() { // Methods, method call // a, b, c are resolved as trait items, their traits need to be in scope - S.a(); //~ ERROR no method named `a` found for type `S` in the current scope - S.b(); //~ ERROR no method named `b` found for type `S` in the current scope + S.a(); //~ ERROR no method named `a` found + S.b(); //~ ERROR no method named `b` found S.c(); // OK // a, b, c are resolved as inherent items, their traits don't need to be in scope let c = &S as &dyn C; @@ -76,9 +76,9 @@ fn check_method() { // Methods, UFCS // a, b, c are resolved as trait items, their traits need to be in scope S::a(&S); - //~^ ERROR no function or associated item named `a` found for type `S` + //~^ ERROR no function or associated item named `a` found S::b(&S); - //~^ ERROR no function or associated item named `b` found for type `S` + //~^ ERROR no function or associated item named `b` found S::c(&S); // OK // a, b, c are resolved as inherent items, their traits don't need to be in scope C::a(&S); //~ ERROR method `a` is private @@ -94,8 +94,8 @@ fn check_assoc_const() { // Associated constants // A, B, C are resolved as trait items, their traits need to be in scope - S::A; //~ ERROR no associated item named `A` found for type `S` in the current scope - S::B; //~ ERROR no associated item named `B` found for type `S` in the current scope + S::A; //~ ERROR no associated item named `A` found + S::B; //~ ERROR no associated item named `B` found S::C; // OK // A, B, C are resolved as inherent items, their traits don't need to be in scope C::A; //~ ERROR associated constant `A` is private diff --git a/src/test/ui/traits/trait-item-privacy.stderr b/src/test/ui/traits/trait-item-privacy.stderr index 64a92c6b0b..4df8845de2 100644 --- a/src/test/ui/traits/trait-item-privacy.stderr +++ b/src/test/ui/traits/trait-item-privacy.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `a` found for type `S` in the current scope +error[E0599]: no method named `a` found for struct `S` in the current scope --> $DIR/trait-item-privacy.rs:67:7 | LL | struct S; @@ -11,7 +11,7 @@ LL | S.a(); = note: the following trait defines an item `a`, perhaps you need to implement it: candidate #1: `method::A` -error[E0599]: no method named `b` found for type `S` in the current scope +error[E0599]: no method named `b` found for struct `S` in the current scope --> $DIR/trait-item-privacy.rs:68:7 | LL | struct S; @@ -39,7 +39,7 @@ error[E0624]: method `a` is private LL | c.a(); | ^ -error[E0599]: no function or associated item named `a` found for type `S` in the current scope +error[E0599]: no function or associated item named `a` found for struct `S` in the current scope --> $DIR/trait-item-privacy.rs:78:8 | LL | struct S; @@ -52,7 +52,7 @@ LL | S::a(&S); = note: the following trait defines an item `a`, perhaps you need to implement it: candidate #1: `method::A` -error[E0599]: no function or associated item named `b` found for type `S` in the current scope +error[E0599]: no function or associated item named `b` found for struct `S` in the current scope --> $DIR/trait-item-privacy.rs:80:8 | LL | struct S; @@ -73,7 +73,7 @@ error[E0624]: method `a` is private LL | C::a(&S); | ^^^^ -error[E0599]: no associated item named `A` found for type `S` in the current scope +error[E0599]: no associated item named `A` found for struct `S` in the current scope --> $DIR/trait-item-privacy.rs:97:8 | LL | struct S; @@ -86,7 +86,7 @@ LL | S::A; = note: the following trait defines an item `A`, perhaps you need to implement it: candidate #1: `assoc_const::A` -error[E0599]: no associated item named `B` found for type `S` in the current scope +error[E0599]: no associated item named `B` found for struct `S` in the current scope --> $DIR/trait-item-privacy.rs:98:8 | LL | struct S; diff --git a/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.rs b/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.rs index 766bd14743..f34fa80a0c 100644 --- a/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.rs +++ b/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.rs @@ -43,8 +43,8 @@ impl NormalizableHelper for u32 fn main() { let _x: Box<dyn Helper<Target=i32>> = Box::new(2u32); - //~^ ERROR the value of the associated type `Output` (from the trait `Base`) must be specified + //~^ ERROR the value of the associated type `Output` (from trait `Base`) must be specified let _y: Box<dyn NormalizableHelper<Target=i32>> = Box::new(2u32); - //~^ ERROR the value of the associated type `Output` (from the trait `Base`) must be specified + //~^ ERROR the value of the associated type `Output` (from trait `Base`) must be specified } diff --git a/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.stderr b/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.stderr index 350f8ea850..79eb27e101 100644 --- a/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.stderr +++ b/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.stderr @@ -1,20 +1,20 @@ -error[E0191]: the value of the associated type `Output` (from the trait `Base`) must be specified - --> $DIR/trait-object-with-self-in-projection-output-bad.rs:45:17 +error[E0191]: the value of the associated type `Output` (from trait `Base`) must be specified + --> $DIR/trait-object-with-self-in-projection-output-bad.rs:45:21 | LL | type Output; | ------------ `Output` defined here ... LL | let _x: Box<dyn Helper<Target=i32>> = Box::new(2u32); - | ^^^^^^^^^^^^^^^^^^^^^^ associated type `Output` must be specified + | ^^^^^^^^^^^^^^^^^^ help: specify the associated type: `Helper<Target=i32, Output = Type>` -error[E0191]: the value of the associated type `Output` (from the trait `Base`) must be specified - --> $DIR/trait-object-with-self-in-projection-output-bad.rs:48:17 +error[E0191]: the value of the associated type `Output` (from trait `Base`) must be specified + --> $DIR/trait-object-with-self-in-projection-output-bad.rs:48:21 | LL | type Output; | ------------ `Output` defined here ... LL | let _y: Box<dyn NormalizableHelper<Target=i32>> = Box::new(2u32); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ associated type `Output` must be specified + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: specify the associated type: `NormalizableHelper<Target=i32, Output = Type>` error: aborting due to 2 previous errors diff --git a/src/test/ui/traits/trait-resolution-in-overloaded-op.rs b/src/test/ui/traits/trait-resolution-in-overloaded-op.rs index 96f81a21a3..2867769851 100644 --- a/src/test/ui/traits/trait-resolution-in-overloaded-op.rs +++ b/src/test/ui/traits/trait-resolution-in-overloaded-op.rs @@ -5,7 +5,7 @@ trait MyMul<Rhs, Res> { } fn foo<T: MyMul<f64, f64>>(a: &T, b: f64) -> f64 { - a * b //~ ERROR binary operation `*` cannot be applied to type `&T` + a * b //~ ERROR cannot multiply `f64` to `&T` } fn main() {} diff --git a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr b/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr index d11562e2a0..8d7ba36c66 100644 --- a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr +++ b/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `*` cannot be applied to type `&T` +error[E0369]: cannot multiply `f64` to `&T` --> $DIR/trait-resolution-in-overloaded-op.rs:8:7 | LL | a * b diff --git a/src/test/ui/traits/trait-suggest-where-clause.rs b/src/test/ui/traits/trait-suggest-where-clause.rs index 5d3464d20f..5b34ed0919 100644 --- a/src/test/ui/traits/trait-suggest-where-clause.rs +++ b/src/test/ui/traits/trait-suggest-where-clause.rs @@ -1,4 +1,7 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl use std::mem; struct Misc<T:?Sized>(T); diff --git a/src/test/ui/traits/trait-suggest-where-clause.stderr b/src/test/ui/traits/trait-suggest-where-clause.stderr index 2bb7defdac..831dd43929 100644 --- a/src/test/ui/traits/trait-suggest-where-clause.stderr +++ b/src/test/ui/traits/trait-suggest-where-clause.stderr @@ -1,5 +1,5 @@ error[E0277]: the size for values of type `U` cannot be known at compilation time - --> $DIR/trait-suggest-where-clause.rs:8:20 + --> $DIR/trait-suggest-where-clause.rs:11:20 | LL | fn check<T: Iterator, U: ?Sized>() { | -- help: consider further restricting this bound: `U: std::marker::Sized +` @@ -16,7 +16,7 @@ LL | pub const fn size_of<T>() -> usize { = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait> error[E0277]: the size for values of type `U` cannot be known at compilation time - --> $DIR/trait-suggest-where-clause.rs:11:5 + --> $DIR/trait-suggest-where-clause.rs:14:5 | LL | fn check<T: Iterator, U: ?Sized>() { | -- help: consider further restricting this bound: `U: std::marker::Sized +` @@ -34,7 +34,7 @@ LL | pub const fn size_of<T>() -> usize { = note: required because it appears within the type `Misc<U>` error[E0277]: the trait bound `u64: std::convert::From<T>` is not satisfied - --> $DIR/trait-suggest-where-clause.rs:16:5 + --> $DIR/trait-suggest-where-clause.rs:19:5 | LL | <u64 as From<T>>::from; | ^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<T>` is not implemented for `u64` @@ -42,7 +42,7 @@ LL | <u64 as From<T>>::from; = note: required by `std::convert::From::from` error[E0277]: the trait bound `u64: std::convert::From<<T as std::iter::Iterator>::Item>` is not satisfied - --> $DIR/trait-suggest-where-clause.rs:19:5 + --> $DIR/trait-suggest-where-clause.rs:22:5 | LL | <u64 as From<<T as Iterator>::Item>>::from; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<<T as std::iter::Iterator>::Item>` is not implemented for `u64` @@ -50,7 +50,7 @@ LL | <u64 as From<<T as Iterator>::Item>>::from; = note: required by `std::convert::From::from` error[E0277]: the trait bound `Misc<_>: std::convert::From<T>` is not satisfied - --> $DIR/trait-suggest-where-clause.rs:24:5 + --> $DIR/trait-suggest-where-clause.rs:27:5 | LL | <Misc<_> as From<T>>::from; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<T>` is not implemented for `Misc<_>` @@ -58,7 +58,7 @@ LL | <Misc<_> as From<T>>::from; = note: required by `std::convert::From::from` error[E0277]: the size for values of type `[T]` cannot be known at compilation time - --> $DIR/trait-suggest-where-clause.rs:29:20 + --> $DIR/trait-suggest-where-clause.rs:32:20 | LL | mem::size_of::<[T]>(); | ^^^ doesn't have a size known at compile-time @@ -72,7 +72,7 @@ LL | pub const fn size_of<T>() -> usize { = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait> error[E0277]: the size for values of type `[&U]` cannot be known at compilation time - --> $DIR/trait-suggest-where-clause.rs:32:5 + --> $DIR/trait-suggest-where-clause.rs:35:5 | LL | mem::size_of::<[&U]>(); | ^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time diff --git a/src/test/ui/traits/traits-multidispatch-convert-ambig-dest.stderr b/src/test/ui/traits/traits-multidispatch-convert-ambig-dest.stderr index 7bcda234c4..338c8cbf2e 100644 --- a/src/test/ui/traits/traits-multidispatch-convert-ambig-dest.stderr +++ b/src/test/ui/traits/traits-multidispatch-convert-ambig-dest.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/traits-multidispatch-convert-ambig-dest.rs:26:5 | LL | test(22, std::default::Default::default()); - | ^^^^ cannot infer type for type parameter `U` + | ^^^^ cannot infer type for type parameter `U` declared on the function `test` error: aborting due to previous error diff --git a/src/test/ui/trivial-bounds/trivial-bounds-inconsistent-associated-functions.rs b/src/test/ui/trivial-bounds/trivial-bounds-inconsistent-associated-functions.rs index 6450ddd1b6..69eee66e64 100644 --- a/src/test/ui/trivial-bounds/trivial-bounds-inconsistent-associated-functions.rs +++ b/src/test/ui/trivial-bounds/trivial-bounds-inconsistent-associated-functions.rs @@ -1,4 +1,8 @@ -// run-pass +// check-pass +// compile-flags: --emit=mir,link +// Force mir to be emitted, to ensure that const +// propagation doesn't ICE on a function +// with an 'impossible' body. See issue #67696 // Inconsistent bounds with trait implementations #![feature(trivial_bounds)] diff --git a/src/test/ui/trivial-bounds/trivial-bounds-lint.stderr b/src/test/ui/trivial-bounds/trivial-bounds-lint.stderr index 2f4b2df24c..37cf6f89d6 100644 --- a/src/test/ui/trivial-bounds/trivial-bounds-lint.stderr +++ b/src/test/ui/trivial-bounds/trivial-bounds-lint.stderr @@ -22,19 +22,19 @@ error: Trait bound i32: Z does not depend on any type or lifetime parameters LL | fn global_projection() where i32: Z<S = i32> {} | ^^^^^^^^^^ -error: Lifetime bound i32 : 'static does not depend on any type or lifetime parameters +error: Lifetime bound i32: 'static does not depend on any type or lifetime parameters --> $DIR/trivial-bounds-lint.rs:29:34 | LL | fn global_lifetimes() where i32: 'static, &'static str: 'static {} | ^^^^^^^ -error: Lifetime bound &'static str : 'static does not depend on any type or lifetime parameters +error: Lifetime bound &'static str: 'static does not depend on any type or lifetime parameters --> $DIR/trivial-bounds-lint.rs:29:57 | LL | fn global_lifetimes() where i32: 'static, &'static str: 'static {} | ^^^^^^^ -error: Lifetime bound 'static : 'static does not depend on any type or lifetime parameters +error: Lifetime bound 'static: 'static does not depend on any type or lifetime parameters --> $DIR/trivial-bounds-lint.rs:35:37 | LL | fn global_outlives() where 'static: 'static {} diff --git a/src/test/ui/try-on-option-diagnostics.rs b/src/test/ui/try-on-option-diagnostics.rs index 65d5e29ec2..63d17414c3 100644 --- a/src/test/ui/try-on-option-diagnostics.rs +++ b/src/test/ui/try-on-option-diagnostics.rs @@ -16,3 +16,32 @@ fn a_closure() -> u32 { }; a_closure() } + +fn a_method() -> u32 { + struct S; + + impl S { + fn a_method() { + let x: Option<u32> = None; + x?; //~ ERROR the `?` operator + } + } + + S::a_method(); + 22 +} + +fn a_trait_method() -> u32 { + struct S; + trait T { + fn a_trait_method() { + let x: Option<u32> = None; + x?; //~ ERROR the `?` operator + } + } + + impl T for S { } + + S::a_trait_method(); + 22 +} diff --git a/src/test/ui/try-on-option-diagnostics.stderr b/src/test/ui/try-on-option-diagnostics.stderr index ce3aca39fb..c9dc3f1b87 100644 --- a/src/test/ui/try-on-option-diagnostics.stderr +++ b/src/test/ui/try-on-option-diagnostics.stderr @@ -27,6 +27,32 @@ LL | | }; = help: the trait `std::ops::Try` is not implemented for `{integer}` = note: required by `std::ops::Try::from_error` -error: aborting due to 2 previous errors +error[E0277]: the `?` operator can only be used in a method that returns `Result` or `Option` (or another type that implements `std::ops::Try`) + --> $DIR/try-on-option-diagnostics.rs:26:13 + | +LL | / fn a_method() { +LL | | let x: Option<u32> = None; +LL | | x?; + | | ^^ cannot use the `?` operator in a method that returns `()` +LL | | } + | |_________- this function should return `Result` or `Option` to accept `?` + | + = help: the trait `std::ops::Try` is not implemented for `()` + = note: required by `std::ops::Try::from_error` + +error[E0277]: the `?` operator can only be used in a trait method that returns `Result` or `Option` (or another type that implements `std::ops::Try`) + --> $DIR/try-on-option-diagnostics.rs:39:13 + | +LL | / fn a_trait_method() { +LL | | let x: Option<u32> = None; +LL | | x?; + | | ^^ cannot use the `?` operator in a trait method that returns `()` +LL | | } + | |_________- this function should return `Result` or `Option` to accept `?` + | + = help: the trait `std::ops::Try` is not implemented for `()` + = note: required by `std::ops::Try::from_error` + +error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/tuple/tuple-struct-fields/test2.rs b/src/test/ui/tuple/tuple-struct-fields/test2.rs index fc0f78b12c..2b2a2c127e 100644 --- a/src/test/ui/tuple/tuple-struct-fields/test2.rs +++ b/src/test/ui/tuple/tuple-struct-fields/test2.rs @@ -9,6 +9,7 @@ macro_rules! define_struct { mod foo { define_struct! { (foo) } //~ ERROR cannot find type `foo` in this scope + //~| ERROR cannot find type `foo` in this scope } fn main() {} diff --git a/src/test/ui/tuple/tuple-struct-fields/test2.stderr b/src/test/ui/tuple/tuple-struct-fields/test2.stderr index d924c35143..2f1ca2fe0c 100644 --- a/src/test/ui/tuple/tuple-struct-fields/test2.stderr +++ b/src/test/ui/tuple/tuple-struct-fields/test2.stderr @@ -15,6 +15,12 @@ error[E0412]: cannot find type `foo` in this scope LL | define_struct! { (foo) } | ^^^ not found in this scope -error: aborting due to 2 previous errors +error[E0412]: cannot find type `foo` in this scope + --> $DIR/test2.rs:11:23 + | +LL | define_struct! { (foo) } + | ^^^ not found in this scope + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0412`. diff --git a/src/test/ui/tuple/tuple-struct-fields/test3.rs b/src/test/ui/tuple/tuple-struct-fields/test3.rs index 6b8534b452..98d19426e7 100644 --- a/src/test/ui/tuple/tuple-struct-fields/test3.rs +++ b/src/test/ui/tuple/tuple-struct-fields/test3.rs @@ -9,6 +9,7 @@ macro_rules! define_struct { mod foo { define_struct! { foo } //~ ERROR cannot find type `foo` in this scope + //~| ERROR cannot find type `foo` in this scope } fn main() {} diff --git a/src/test/ui/tuple/tuple-struct-fields/test3.stderr b/src/test/ui/tuple/tuple-struct-fields/test3.stderr index 50cac6c179..5d42fe6ef5 100644 --- a/src/test/ui/tuple/tuple-struct-fields/test3.stderr +++ b/src/test/ui/tuple/tuple-struct-fields/test3.stderr @@ -15,6 +15,12 @@ error[E0412]: cannot find type `foo` in this scope LL | define_struct! { foo } | ^^^ not found in this scope -error: aborting due to 2 previous errors +error[E0412]: cannot find type `foo` in this scope + --> $DIR/test3.rs:11:22 + | +LL | define_struct! { foo } + | ^^^ not found in this scope + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0412`. diff --git a/src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr b/src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr index dc4050e44a..db535b53fc 100644 --- a/src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr +++ b/src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr @@ -4,6 +4,11 @@ error[E0391]: cycle detected when const-evaluating + checking `Alpha::V3::{{cons LL | V3 = Self::V1 {} as u8 + 2, | ^^^^^^^^ | +note: ...which requires const-evaluating + checking `Alpha::V3::{{constant}}#0`... + --> $DIR/self-in-enum-definition.rs:5:10 + | +LL | V3 = Self::V1 {} as u8 + 2, + | ^^^^^^^^ note: ...which requires const-evaluating `Alpha::V3::{{constant}}#0`... --> $DIR/self-in-enum-definition.rs:5:10 | diff --git a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.nll.stderr b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.nll.stderr index dc41cbc5fe..9549074d4b 100644 --- a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.nll.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.nll.stderr @@ -11,6 +11,9 @@ LL | let z: i32 = x; | --- ^ expected `i32`, found opaque type | | | expected due to this +... +LL | type WrongGeneric<T> = impl 'static; + | ------------------------------------ the found opaque type | = note: expected type `i32` found opaque type `WrongGeneric::<&{integer}>` diff --git a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.stderr b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.stderr index 24d23de797..5a7f9d74eb 100644 --- a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.stderr @@ -11,6 +11,9 @@ LL | let z: i32 = x; | --- ^ expected `i32`, found opaque type | | | expected due to this +... +LL | type WrongGeneric<T> = impl 'static; + | ------------------------------------ the found opaque type | = note: expected type `i32` found opaque type `WrongGeneric::<&{integer}>` diff --git a/src/test/ui/type-alias-impl-trait/generic_underconstrained2.stderr b/src/test/ui/type-alias-impl-trait/generic_underconstrained2.stderr index d4c7c7c745..9e8414f9c1 100644 --- a/src/test/ui/type-alias-impl-trait/generic_underconstrained2.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_underconstrained2.stderr @@ -18,6 +18,8 @@ LL | type Underconstrained<T: std::fmt::Debug> = impl 'static; ... LL | fn underconstrained<U>(_: U) -> Underconstrained<U> { | - help: consider restricting this bound: `U: std::fmt::Debug` +LL | 5u32 + | ---- this returned value is of type `u32` | = help: the trait `std::fmt::Debug` is not implemented for `U` = note: the return type of a function must have a statically known size @@ -30,6 +32,8 @@ LL | type Underconstrained2<T: std::fmt::Debug> = impl 'static; ... LL | fn underconstrained2<U, V>(_: U, _: V) -> Underconstrained2<V> { | - help: consider restricting this bound: `V: std::fmt::Debug` +LL | 5u32 + | ---- this returned value is of type `u32` | = help: the trait `std::fmt::Debug` is not implemented for `V` = note: the return type of a function must have a statically known size diff --git a/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.rs b/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.rs new file mode 100644 index 0000000000..c46c471592 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.rs @@ -0,0 +1,16 @@ +// Regression test for issue 67856 + +#![feature(unboxed_closures)] +#![feature(type_alias_impl_trait)] +#![feature(fn_traits)] + +trait MyTrait {} +impl MyTrait for () {} + +impl<F> FnOnce<()> for &F { + //~^ ERROR conflicting implementations + //~| ERROR type parameter `F` must be used + type Output = impl MyTrait; + extern "rust-call" fn call_once(self, _: ()) -> Self::Output {} +} +fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.stderr b/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.stderr new file mode 100644 index 0000000000..f8e1e55f23 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.stderr @@ -0,0 +1,23 @@ +error[E0119]: conflicting implementations of trait `std::ops::FnOnce<()>` for type `&_`: + --> $DIR/incoherent-assoc-imp-trait.rs:10:1 + | +LL | impl<F> FnOnce<()> for &F { + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: conflicting implementation in crate `core`: + - impl<A, F> std::ops::FnOnce<A> for &F + where F: std::ops::Fn<A>, F: ?Sized; + +error[E0210]: type parameter `F` must be used as the type parameter for some local type (e.g., `MyStruct<F>`) + --> $DIR/incoherent-assoc-imp-trait.rs:10:6 + | +LL | impl<F> FnOnce<()> for &F { + | ^ type parameter `F` must be used as the type parameter for some local type + | + = note: implementing a foreign trait is only possible if at least one of the types for which is it implemented is local + = note: only traits defined in the current crate can be implemented for a type parameter + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0119, E0210. +For more information about an error, try `rustc --explain E0119`. diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs new file mode 100644 index 0000000000..1c2051e7ea --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs @@ -0,0 +1,27 @@ +// Regression test for issue #57611 +// Ensures that we don't ICE +// FIXME: This should compile, but it currently doesn't + +#![feature(trait_alias)] +#![feature(type_alias_impl_trait)] + +trait Foo { + type Bar: Baz<Self, Self>; + + fn bar(&self) -> Self::Bar; +} + +struct X; + +impl Foo for X { + type Bar = impl Baz<Self, Self>; //~ ERROR type mismatch in closure arguments + //~^ ERROR type mismatch resolving + + fn bar(&self) -> Self::Bar { + |x| x + } +} + +trait Baz<A, B> = Fn(&A) -> &B; + +fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr new file mode 100644 index 0000000000..f648b7bfc9 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr @@ -0,0 +1,23 @@ +error[E0631]: type mismatch in closure arguments + --> $DIR/issue-57611-trait-alias.rs:17:5 + | +LL | type Bar = impl Baz<Self, Self>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected signature of `for<'r> fn(&'r X) -> _` +... +LL | |x| x + | ----- found signature of `fn(_) -> _` + | + = note: the return type of a function must have a statically known size + +error[E0271]: type mismatch resolving `for<'r> <[closure@$DIR/issue-57611-trait-alias.rs:21:9: 21:14] as std::ops::FnOnce<(&'r X,)>>::Output == &'r X` + --> $DIR/issue-57611-trait-alias.rs:17:5 + | +LL | type Bar = impl Baz<Self, Self>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bound lifetime parameter, found concrete lifetime + | + = note: the return type of a function must have a statically known size + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0271, E0631. +For more information about an error, try `rustc --explain E0271`. diff --git a/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs b/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs new file mode 100644 index 0000000000..fcab2c7db2 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs @@ -0,0 +1,31 @@ +// Regression test for issue #57807 - ensure +// that we properly unify associated types within +// a type alias impl trait +// check-pass +#![feature(type_alias_impl_trait)] + +trait Bar { + type A; +} + +impl Bar for () { + type A = (); +} + +trait Foo { + type A; + type B: Bar<A = Self::A>; + + fn foo() -> Self::B; +} + +impl Foo for () { + type A = (); + type B = impl Bar<A = Self::A>; + + fn foo() -> Self::B { + () + } +} + +fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-65918.rs b/src/test/ui/type-alias-impl-trait/issue-65918.rs new file mode 100644 index 0000000000..97efb85ef6 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-65918.rs @@ -0,0 +1,49 @@ +// build-pass + +#![feature(type_alias_impl_trait)] + +use std::marker::PhantomData; + +/* copied Index and TryFrom for convinience (and simplicity) */ +trait MyIndex<T> { + type O; + fn my_index(self) -> Self::O; +} +trait MyFrom<T>: Sized { + type Error; + fn my_from(value: T) -> Result<Self, Self::Error>; +} + +/* MCVE starts here */ +trait F {} +impl F for () {} +type DummyT<T> = impl F; +fn _dummy_t<T>() -> DummyT<T> {} + +struct Phantom1<T>(PhantomData<T>); +struct Phantom2<T>(PhantomData<T>); +struct Scope<T>(Phantom2<DummyT<T>>); + +impl<T> Scope<T> { + fn new() -> Self { + unimplemented!() + } +} + +impl<T> MyFrom<Phantom2<T>> for Phantom1<T> { + type Error = (); + fn my_from(_: Phantom2<T>) -> Result<Self, Self::Error> { + unimplemented!() + } +} + +impl<T: MyFrom<Phantom2<DummyT<U>>>, U> MyIndex<Phantom1<T>> for Scope<U> { + type O = T; + fn my_index(self) -> Self::O { + MyFrom::my_from(self.0).ok().unwrap() + } +} + +fn main() { + let _pos: Phantom1<DummyT<()>> = Scope::new().my_index(); +} diff --git a/src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.rs b/src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.rs new file mode 100644 index 0000000000..d00f8d7a90 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.rs @@ -0,0 +1,13 @@ +// Regression test for issue #68368 +// Ensures that we don't ICE when emitting an error +// for a non-defining use when lifetimes are involved + +#![feature(type_alias_impl_trait)] +trait Trait<T> {} +type Alias<'a, U> = impl Trait<U>; //~ ERROR could not find defining uses +fn f<'a>() -> Alias<'a, ()> {} +//~^ ERROR defining opaque type use does not fully define opaque type: generic parameter `U` + +fn main() {} + +impl Trait<()> for () {} diff --git a/src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.stderr b/src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.stderr new file mode 100644 index 0000000000..b585942406 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.stderr @@ -0,0 +1,14 @@ +error: defining opaque type use does not fully define opaque type: generic parameter `U` is specified as concrete type `()` + --> $DIR/issue-68368-non-defining-use.rs:8:1 + | +LL | fn f<'a>() -> Alias<'a, ()> {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: could not find defining uses + --> $DIR/issue-68368-non-defining-use.rs:7:1 + | +LL | type Alias<'a, U> = impl Trait<U>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.stderr b/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.stderr index 07962e36da..70c99c944d 100644 --- a/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.stderr +++ b/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.stderr @@ -1,6 +1,9 @@ error[E0308]: mismatched types --> $DIR/never_reveal_concrete_type.rs:13:27 | +LL | type NoReveal = impl std::fmt::Debug; + | ------------------------------------- the found opaque type +... LL | let _: &'static str = x; | ------------ ^ expected `&str`, found opaque type | | diff --git a/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.stderr b/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.stderr index a2081424ab..375c0bc7fe 100644 --- a/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.stderr +++ b/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.stderr @@ -1,6 +1,9 @@ error[E0308]: mismatched types --> $DIR/no_revealing_outside_defining_module.rs:15:19 | +LL | pub type Boo = impl ::std::fmt::Debug; + | -------------------------------------- the found opaque type +... LL | let _: &str = bomp(); | ---- ^^^^^^ expected `&str`, found opaque type | | @@ -12,6 +15,9 @@ LL | let _: &str = bomp(); error[E0308]: mismatched types --> $DIR/no_revealing_outside_defining_module.rs:19:5 | +LL | pub type Boo = impl ::std::fmt::Debug; + | -------------------------------------- the expected opaque type +... LL | fn bomp() -> boo::Boo { | -------- expected `Boo` because of return type LL | "" diff --git a/src/test/ui/type-alias-impl-trait/not_well_formed.stderr b/src/test/ui/type-alias-impl-trait/not_well_formed.stderr index d374d6d33e..c2b6f7eae9 100644 --- a/src/test/ui/type-alias-impl-trait/not_well_formed.stderr +++ b/src/test/ui/type-alias-impl-trait/not_well_formed.stderr @@ -1,8 +1,8 @@ error[E0220]: associated type `Assoc` not found for `V` - --> $DIR/not_well_formed.rs:10:26 + --> $DIR/not_well_formed.rs:10:29 | LL | type Foo<V> = impl Trait<V::Assoc>; - | ^^^^^^^^ associated type `Assoc` not found + | ^^^^^ associated type `Assoc` not found error: aborting due to previous error diff --git a/src/test/ui/type-alias/issue-62364-self-ty-arg.stderr b/src/test/ui/type-alias/issue-62364-self-ty-arg.stderr index 5ed27760a8..cae41672ea 100644 --- a/src/test/ui/type-alias/issue-62364-self-ty-arg.stderr +++ b/src/test/ui/type-alias/issue-62364-self-ty-arg.stderr @@ -2,7 +2,9 @@ error[E0411]: cannot find type `Self` in this scope --> $DIR/issue-62364-self-ty-arg.rs:5:29 | LL | type Alias<'a> = Struct<&'a Self>; - | ^^^^ `Self` is only available in impls, traits, and type definitions + | - ^^^^ `Self` is only available in impls, traits, and type definitions + | | + | help: you might be missing a type parameter: `, Self` error: aborting due to previous error diff --git a/src/test/ui/type-inference/or_else-multiple-type-params.stderr b/src/test/ui/type-inference/or_else-multiple-type-params.stderr index 141cc25ffe..b9258b20f5 100644 --- a/src/test/ui/type-inference/or_else-multiple-type-params.stderr +++ b/src/test/ui/type-inference/or_else-multiple-type-params.stderr @@ -4,7 +4,7 @@ error[E0282]: type annotations needed LL | .or_else(|err| { | ^^^^^^^ | | - | cannot infer type for type parameter `F` + | cannot infer type for type parameter `F` declared on the method `or_else` | help: consider specifying the type arguments in the method call: `or_else::<F, O>` error: aborting due to previous error diff --git a/src/test/ui/type-inference/sort_by_key.stderr b/src/test/ui/type-inference/sort_by_key.stderr index 1d386bd1f4..e74c0dfa5e 100644 --- a/src/test/ui/type-inference/sort_by_key.stderr +++ b/src/test/ui/type-inference/sort_by_key.stderr @@ -4,7 +4,7 @@ error[E0282]: type annotations needed LL | lst.sort_by_key(|&(v, _)| v.iter().sum()); | ^^^^^^^^^^^ --- help: consider specifying the type argument in the method call: `sum::<S>` | | - | cannot infer type for type parameter `K` + | cannot infer type for type parameter `K` declared on the method `sort_by_key` error: aborting due to previous error diff --git a/src/test/ui/type-inference/unbounded-associated-type.stderr b/src/test/ui/type-inference/unbounded-associated-type.stderr index 726dd4b475..19e2bd4513 100644 --- a/src/test/ui/type-inference/unbounded-associated-type.stderr +++ b/src/test/ui/type-inference/unbounded-associated-type.stderr @@ -8,7 +8,7 @@ LL | S(std::marker::PhantomData).foo(); | ^-------------------------------- | | | this method call resolves to `<Self as T>::A` - | cannot infer type for type parameter `X` + | cannot infer type for type parameter `X` declared on the struct `S` error: aborting due to previous error diff --git a/src/test/ui/type-inference/unbounded-type-param-in-fn-with-assoc-type.stderr b/src/test/ui/type-inference/unbounded-type-param-in-fn-with-assoc-type.stderr index 52039d0e93..d60ca4a493 100644 --- a/src/test/ui/type-inference/unbounded-type-param-in-fn-with-assoc-type.stderr +++ b/src/test/ui/type-inference/unbounded-type-param-in-fn-with-assoc-type.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/unbounded-type-param-in-fn-with-assoc-type.rs:8:5 | LL | foo(); - | ^^^ cannot infer type for type parameter `T` + | ^^^ cannot infer type for type parameter `T` declared on the function `foo` error: aborting due to previous error diff --git a/src/test/ui/type-inference/unbounded-type-param-in-fn.stderr b/src/test/ui/type-inference/unbounded-type-param-in-fn.stderr index 8d317df6ce..45d879d8d5 100644 --- a/src/test/ui/type-inference/unbounded-type-param-in-fn.stderr +++ b/src/test/ui/type-inference/unbounded-type-param-in-fn.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/unbounded-type-param-in-fn.rs:6:5 | LL | foo(); - | ^^^ cannot infer type for type parameter `T` + | ^^^ cannot infer type for type parameter `T` declared on the function `foo` error: aborting due to previous error diff --git a/src/test/ui/type/ascription/issue-47666.stderr b/src/test/ui/type/ascription/issue-47666.stderr index 2f052341fa..648635f0c3 100644 --- a/src/test/ui/type/ascription/issue-47666.stderr +++ b/src/test/ui/type/ascription/issue-47666.stderr @@ -11,7 +11,7 @@ LL | let _ = Option:Some(vec![0, 1]); | = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>` = note: for more information, see https://github.com/rust-lang/rust/issues/23416 - = note: this warning originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error: aborting due to previous error diff --git a/src/test/ui/type/issue-67690-type-alias-bound-diagnostic-crash.rs b/src/test/ui/type/issue-67690-type-alias-bound-diagnostic-crash.rs new file mode 100644 index 0000000000..68aadcf605 --- /dev/null +++ b/src/test/ui/type/issue-67690-type-alias-bound-diagnostic-crash.rs @@ -0,0 +1,8 @@ +// Regression test for issue #67690 +// Rustc endless loop out-of-memory and consequent SIGKILL in generic new type + +// check-pass +pub type T<P: Send + Send + Send> = P; +//~^ WARN bounds on generic parameters are not enforced in type aliases + +fn main() {} diff --git a/src/test/ui/type/issue-67690-type-alias-bound-diagnostic-crash.stderr b/src/test/ui/type/issue-67690-type-alias-bound-diagnostic-crash.stderr new file mode 100644 index 0000000000..37b51b50b9 --- /dev/null +++ b/src/test/ui/type/issue-67690-type-alias-bound-diagnostic-crash.stderr @@ -0,0 +1,12 @@ +warning: bounds on generic parameters are not enforced in type aliases + --> $DIR/issue-67690-type-alias-bound-diagnostic-crash.rs:5:15 + | +LL | pub type T<P: Send + Send + Send> = P; + | ^^^^ ^^^^ ^^^^ + | + = note: `#[warn(type_alias_bounds)]` on by default +help: the bound will not be checked when the type alias is used, and should be removed + | +LL | pub type T<P> = P; + | -- + diff --git a/src/test/ui/type/type-alias-bounds.rs b/src/test/ui/type/type-alias-bounds.rs index 06705a2ebf..65b79650d4 100644 --- a/src/test/ui/type/type-alias-bounds.rs +++ b/src/test/ui/type/type-alias-bounds.rs @@ -1,6 +1,6 @@ // Test `ignored_generic_bounds` lint warning about bounds in type aliases. -// build-pass (FIXME(62277): could be check-pass?) +// check-pass #![allow(dead_code)] use std::rc::Rc; diff --git a/src/test/ui/type/type-alias-bounds.stderr b/src/test/ui/type/type-alias-bounds.stderr index c381d30c64..e4d3753f8a 100644 --- a/src/test/ui/type/type-alias-bounds.stderr +++ b/src/test/ui/type/type-alias-bounds.stderr @@ -8,7 +8,7 @@ LL | type SVec<T: Send + Send> = Vec<T>; help: the bound will not be checked when the type alias is used, and should be removed | LL | type SVec<T> = Vec<T>; - | -- -- + | -- warning: where clauses are not enforced in type aliases --> $DIR/type-alias-bounds.rs:10:21 @@ -30,7 +30,7 @@ LL | type VVec<'b, 'a: 'b + 'b> = (&'b u32, Vec<&'a i32>); help: the bound will not be checked when the type alias is used, and should be removed | LL | type VVec<'b, 'a> = (&'b u32, Vec<&'a i32>); - | -- -- + | -- warning: bounds on generic parameters are not enforced in type aliases --> $DIR/type-alias-bounds.rs:14:18 @@ -41,7 +41,7 @@ LL | type WVec<'b, T: 'b + 'b> = (&'b u32, Vec<T>); help: the bound will not be checked when the type alias is used, and should be removed | LL | type WVec<'b, T> = (&'b u32, Vec<T>); - | -- -- + | -- warning: where clauses are not enforced in type aliases --> $DIR/type-alias-bounds.rs:16:25 diff --git a/src/test/ui/type/type-annotation-needed.stderr b/src/test/ui/type/type-annotation-needed.stderr index 94425440d3..c6a811e836 100644 --- a/src/test/ui/type/type-annotation-needed.stderr +++ b/src/test/ui/type/type-annotation-needed.stderr @@ -7,7 +7,7 @@ LL | fn foo<T: Into<String>>(x: i32) {} LL | foo(42); | ^^^ | | - | cannot infer type for type parameter `T` + | cannot infer type for type parameter `T` declared on the function `foo` | help: consider specifying the type argument in the function call: `foo::<T>` | = note: cannot resolve `_: std::convert::Into<std::string::String>` diff --git a/src/test/ui/type/type-check/assignment-expected-bool.rs b/src/test/ui/type/type-check/assignment-expected-bool.rs index 03830fea06..191939bdb7 100644 --- a/src/test/ui/type/type-check/assignment-expected-bool.rs +++ b/src/test/ui/type/type-check/assignment-expected-bool.rs @@ -30,5 +30,5 @@ fn main() { // A test to check that not expecting `bool` behaves well: let _: usize = 0 = 0; //~^ ERROR mismatched types [E0308] - //~| ERROR invalid left-hand side expression [E0070] + //~| ERROR invalid left-hand side of assignment [E0070] } diff --git a/src/test/ui/type/type-check/assignment-expected-bool.stderr b/src/test/ui/type/type-check/assignment-expected-bool.stderr index 9a1cf5b256..3f1caddf72 100644 --- a/src/test/ui/type/type-check/assignment-expected-bool.stderr +++ b/src/test/ui/type/type-check/assignment-expected-bool.stderr @@ -97,11 +97,13 @@ LL | || (0 = 0); | expected `bool`, found `()` | help: try comparing for equality: `0 == 0` -error[E0070]: invalid left-hand side expression - --> $DIR/assignment-expected-bool.rs:31:20 +error[E0070]: invalid left-hand side of assignment + --> $DIR/assignment-expected-bool.rs:31:22 | LL | let _: usize = 0 = 0; - | ^^^^^ left-hand of expression not valid + | - ^ + | | + | cannot assign to this expression error[E0308]: mismatched types --> $DIR/assignment-expected-bool.rs:31:20 diff --git a/src/test/ui/type/type-check/assignment-in-if.rs b/src/test/ui/type/type-check/assignment-in-if.rs index 77b122b0a7..8da7b32b47 100644 --- a/src/test/ui/type/type-check/assignment-in-if.rs +++ b/src/test/ui/type/type-check/assignment-in-if.rs @@ -26,7 +26,7 @@ fn main() { //~^ ERROR mismatched types println!("{}", x); } - // "invalid left-hand side expression" error is suppresed + // "invalid left-hand side of assignment" error is suppresed if 3 = x { //~^ ERROR mismatched types println!("{}", x); diff --git a/src/test/ui/type/type-check/issue-67273-assignment-match-prior-arm-bool-expected-unit.rs b/src/test/ui/type/type-check/issue-67273-assignment-match-prior-arm-bool-expected-unit.rs index e23c0d0a40..c39ab95447 100644 --- a/src/test/ui/type/type-check/issue-67273-assignment-match-prior-arm-bool-expected-unit.rs +++ b/src/test/ui/type/type-check/issue-67273-assignment-match-prior-arm-bool-expected-unit.rs @@ -20,7 +20,7 @@ fn main() { // However, in #67273, we would delay the unification of this arm with the above // because we used the hitherto accumulated coercion as opposed to the "initial" type. 2 => i = 1, - //~^ ERROR match arms have incompatible types + //~^ ERROR `match` arms have incompatible types _ => (), } diff --git a/src/test/ui/type/type-check/issue-67273-assignment-match-prior-arm-bool-expected-unit.stderr b/src/test/ui/type/type-check/issue-67273-assignment-match-prior-arm-bool-expected-unit.stderr index 3547285542..a431fe89c2 100644 --- a/src/test/ui/type/type-check/issue-67273-assignment-match-prior-arm-bool-expected-unit.stderr +++ b/src/test/ui/type/type-check/issue-67273-assignment-match-prior-arm-bool-expected-unit.stderr @@ -1,4 +1,4 @@ -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/issue-67273-assignment-match-prior-arm-bool-expected-unit.rs:22:14 | LL | / match i { diff --git a/src/test/ui/type/type-check/missing_trait_impl.rs b/src/test/ui/type/type-check/missing_trait_impl.rs index dcca96b509..f61ada3f63 100644 --- a/src/test/ui/type/type-check/missing_trait_impl.rs +++ b/src/test/ui/type/type-check/missing_trait_impl.rs @@ -2,7 +2,7 @@ fn main() { } fn foo<T>(x: T, y: T) { - let z = x + y; //~ ERROR binary operation `+` cannot be applied to type `T` + let z = x + y; //~ ERROR cannot add `T` to `T` } fn bar<T>(x: T) { diff --git a/src/test/ui/type/type-check/missing_trait_impl.stderr b/src/test/ui/type/type-check/missing_trait_impl.stderr index 2a158ab856..7186d6a542 100644 --- a/src/test/ui/type/type-check/missing_trait_impl.stderr +++ b/src/test/ui/type/type-check/missing_trait_impl.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `T` +error[E0369]: cannot add `T` to `T` --> $DIR/missing_trait_impl.rs:5:15 | LL | let z = x + y; diff --git a/src/test/ui/type/type-parameter-defaults-referencing-Self.stderr b/src/test/ui/type/type-parameter-defaults-referencing-Self.stderr index 0d6ca9d9dc..eafd3cf79d 100644 --- a/src/test/ui/type/type-parameter-defaults-referencing-Self.stderr +++ b/src/test/ui/type/type-parameter-defaults-referencing-Self.stderr @@ -1,8 +1,13 @@ error[E0393]: the type parameter `T` must be explicitly specified --> $DIR/type-parameter-defaults-referencing-Self.rs:10:16 | -LL | fn foo(x: &dyn Foo) { } - | ^^^ missing reference to `T` +LL | / trait Foo<T=Self> { +LL | | fn method(&self); +LL | | } + | |_- type parameter `T` must be specified for this +LL | +LL | fn foo(x: &dyn Foo) { } + | ^^^ help: set the type parameter to the desired type: `Foo<T>` | = note: because of the default `Self` reference, type parameters must be specified on object types diff --git a/src/test/ui/type_length_limit.rs b/src/test/ui/type_length_limit.rs index 926f12911c..0ecd5cf5fa 100644 --- a/src/test/ui/type_length_limit.rs +++ b/src/test/ui/type_length_limit.rs @@ -1,4 +1,8 @@ -// ignore-x86 FIXME: missing sysroot spans (#53081) +// build-fail +// FIXME: missing sysroot spans (#53081) +// ignore-i586-unknown-linux-gnu +// ignore-i586-unknown-linux-musl +// ignore-i686-unknown-linux-musl // error-pattern: reached the type-length limit while instantiating // Test that the type length limit can be changed. diff --git a/src/test/ui/type_length_limit.stderr b/src/test/ui/type_length_limit.stderr index 7e308f107b..8a9ef993bd 100644 --- a/src/test/ui/type_length_limit.stderr +++ b/src/test/ui/type_length_limit.stderr @@ -1,8 +1,8 @@ error: reached the type-length limit while instantiating `std::mem::drop::<std::option::Op... G), (G, G, G), (G, G, G))))))>>` --> $SRC_DIR/libcore/mem/mod.rs:LL:COL | -LL | pub fn drop<T>(_x: T) { } - | ^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | pub fn drop<T>(_x: T) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^ | = note: consider adding a `#![type_length_limit="1094"]` attribute to your crate diff --git a/src/test/ui/typeck/issue-57673-ice-on-deref-of-boxed-trait.stderr b/src/test/ui/typeck/issue-57673-ice-on-deref-of-boxed-trait.stderr index 14c09ade7d..a656b20c23 100644 --- a/src/test/ui/typeck/issue-57673-ice-on-deref-of-boxed-trait.stderr +++ b/src/test/ui/typeck/issue-57673-ice-on-deref-of-boxed-trait.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | fn ice(x: Box<dyn Iterator<Item=()>>) { | - possibly return type missing here? LL | *x - | ^^ expected `()`, found trait `std::iter::Iterator` + | ^^ expected `()`, found trait object `dyn std::iter::Iterator` | = note: expected unit type `()` found trait object `(dyn std::iter::Iterator<Item = ()> + 'static)` diff --git a/src/test/ui/typeck/issue-69378-ice-on-invalid-type-node-after-recovery.rs b/src/test/ui/typeck/issue-69378-ice-on-invalid-type-node-after-recovery.rs new file mode 100644 index 0000000000..571692a537 --- /dev/null +++ b/src/test/ui/typeck/issue-69378-ice-on-invalid-type-node-after-recovery.rs @@ -0,0 +1,9 @@ +// Regression test for #69378: no type for node after struct parse recovery + +struct Foo { 0: u8 } //~ ERROR expected identifier + +fn test(f: Foo) { + Foo{foo: 4, ..f}; +} + +fn main() {} diff --git a/src/test/ui/typeck/issue-69378-ice-on-invalid-type-node-after-recovery.stderr b/src/test/ui/typeck/issue-69378-ice-on-invalid-type-node-after-recovery.stderr new file mode 100644 index 0000000000..6bc9c8498c --- /dev/null +++ b/src/test/ui/typeck/issue-69378-ice-on-invalid-type-node-after-recovery.stderr @@ -0,0 +1,8 @@ +error: expected identifier, found `0` + --> $DIR/issue-69378-ice-on-invalid-type-node-after-recovery.rs:3:14 + | +LL | struct Foo { 0: u8 } + | ^ expected identifier + +error: aborting due to previous error + diff --git a/src/test/ui/typeck/typeck_type_placeholder_item.rs b/src/test/ui/typeck/typeck_type_placeholder_item.rs deleted file mode 100644 index 46a5b8580d..0000000000 --- a/src/test/ui/typeck/typeck_type_placeholder_item.rs +++ /dev/null @@ -1,109 +0,0 @@ -// This test checks that it is not possible to enable global type -// inference by using the `_` type placeholder. - -fn test() -> _ { 5 } -//~^ ERROR the type placeholder `_` is not allowed within types on item signatures - -fn test2() -> (_, _) { (5, 5) } -//~^ ERROR the type placeholder `_` is not allowed within types on item signatures -//~^^ ERROR the type placeholder `_` is not allowed within types on item signatures - -static TEST3: _ = "test"; -//~^ ERROR the type placeholder `_` is not allowed within types on item signatures - -static TEST4: _ = 145; -//~^ ERROR the type placeholder `_` is not allowed within types on item signatures - -static TEST5: (_, _) = (1, 2); -//~^ ERROR the type placeholder `_` is not allowed within types on item signatures -//~^^ ERROR the type placeholder `_` is not allowed within types on item signatures - -fn test6(_: _) { } -//~^ ERROR the type placeholder `_` is not allowed within types on item signatures - -fn test7(x: _) { let _x: usize = x; } -//~^ ERROR the type placeholder `_` is not allowed within types on item signatures - -fn test8(_f: fn() -> _) { } -//~^ ERROR the type placeholder `_` is not allowed within types on item signatures - -struct Test9; - -impl Test9 { - fn test9(&self) -> _ { () } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - fn test10(&self, _x : _) { } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures -} - -impl Clone for Test9 { - fn clone(&self) -> _ { Test9 } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - fn clone_from(&mut self, other: _) { *self = Test9; } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures -} - -struct Test10 { - a: _, - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - b: (_, _), - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - //~^^ ERROR the type placeholder `_` is not allowed within types on item signatures -} - -pub fn main() { - fn fn_test() -> _ { 5 } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - fn fn_test2() -> (_, _) { (5, 5) } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - //~^^ ERROR the type placeholder `_` is not allowed within types on item signatures - - static FN_TEST3: _ = "test"; - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - static FN_TEST4: _ = 145; - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - static FN_TEST5: (_, _) = (1, 2); - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - //~^^ ERROR the type placeholder `_` is not allowed within types on item signatures - - fn fn_test6(_: _) { } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - fn fn_test7(x: _) { let _x: usize = x; } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - fn fn_test8(_f: fn() -> _) { } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - struct FnTest9; - - impl FnTest9 { - fn fn_test9(&self) -> _ { () } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - fn fn_test10(&self, _x : _) { } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - } - - impl Clone for FnTest9 { - fn clone(&self) -> _ { FnTest9 } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - - fn clone_from(&mut self, other: _) { *self = FnTest9; } - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - } - - struct FnTest10 { - a: _, - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - b: (_, _), - //~^ ERROR the type placeholder `_` is not allowed within types on item signatures - //~^^ ERROR the type placeholder `_` is not allowed within types on item signatures - } - -} diff --git a/src/test/ui/typeck/typeck_type_placeholder_item.stderr b/src/test/ui/typeck/typeck_type_placeholder_item.stderr deleted file mode 100644 index 2b4d9966c3..0000000000 --- a/src/test/ui/typeck/typeck_type_placeholder_item.stderr +++ /dev/null @@ -1,237 +0,0 @@ -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:4:14 - | -LL | fn test() -> _ { 5 } - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct return type: `i32` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:7:16 - | -LL | fn test2() -> (_, _) { (5, 5) } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:7:19 - | -LL | fn test2() -> (_, _) { (5, 5) } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:11:15 - | -LL | static TEST3: _ = "test"; - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct type: `&'static str` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:14:15 - | -LL | static TEST4: _ = 145; - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct type: `i32` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:17:16 - | -LL | static TEST5: (_, _) = (1, 2); - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:17:19 - | -LL | static TEST5: (_, _) = (1, 2); - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:21:13 - | -LL | fn test6(_: _) { } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:24:13 - | -LL | fn test7(x: _) { let _x: usize = x; } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:27:22 - | -LL | fn test8(_f: fn() -> _) { } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:49:8 - | -LL | a: _, - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:51:9 - | -LL | b: (_, _), - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:51:12 - | -LL | b: (_, _), - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:102:12 - | -LL | a: _, - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:104:13 - | -LL | b: (_, _), - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:104:16 - | -LL | b: (_, _), - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:57:21 - | -LL | fn fn_test() -> _ { 5 } - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct return type: `i32` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:60:23 - | -LL | fn fn_test2() -> (_, _) { (5, 5) } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:60:26 - | -LL | fn fn_test2() -> (_, _) { (5, 5) } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:64:22 - | -LL | static FN_TEST3: _ = "test"; - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct type: `&'static str` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:67:22 - | -LL | static FN_TEST4: _ = 145; - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct type: `i32` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:70:23 - | -LL | static FN_TEST5: (_, _) = (1, 2); - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:70:26 - | -LL | static FN_TEST5: (_, _) = (1, 2); - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:74:20 - | -LL | fn fn_test6(_: _) { } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:77:20 - | -LL | fn fn_test7(x: _) { let _x: usize = x; } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:80:29 - | -LL | fn fn_test8(_f: fn() -> _) { } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:33:24 - | -LL | fn test9(&self) -> _ { () } - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct return type: `()` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:36:27 - | -LL | fn test10(&self, _x : _) { } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:41:24 - | -LL | fn clone(&self) -> _ { Test9 } - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct return type: `Test9` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:44:37 - | -LL | fn clone_from(&mut self, other: _) { *self = Test9; } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:86:31 - | -LL | fn fn_test9(&self) -> _ { () } - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct return type: `()` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:89:34 - | -LL | fn fn_test10(&self, _x : _) { } - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:94:28 - | -LL | fn clone(&self) -> _ { FnTest9 } - | ^ - | | - | not allowed in type signatures - | help: replace `_` with the correct return type: `main::FnTest9` - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:97:41 - | -LL | fn clone_from(&mut self, other: _) { *self = FnTest9; } - | ^ not allowed in type signatures - -error: aborting due to 34 previous errors - -For more information about this error, try `rustc --explain E0121`. diff --git a/src/test/ui/typeck/typeck_type_placeholder_item_help.stderr b/src/test/ui/typeck/typeck_type_placeholder_item_help.stderr index c5b9566290..e3bc059d1f 100644 --- a/src/test/ui/typeck/typeck_type_placeholder_item_help.stderr +++ b/src/test/ui/typeck/typeck_type_placeholder_item_help.stderr @@ -5,7 +5,7 @@ LL | fn test1() -> _ { Some(42) } | ^ | | | not allowed in type signatures - | help: replace `_` with the correct return type: `std::option::Option<i32>` + | help: replace with the correct return type: `std::option::Option<i32>` error[E0121]: the type placeholder `_` is not allowed within types on item signatures --> $DIR/typeck_type_placeholder_item_help.rs:7:14 diff --git a/src/test/ui/ufcs/ufcs-partially-resolved.rs b/src/test/ui/ufcs/ufcs-partially-resolved.rs index 82a593ff16..66d4db3eba 100644 --- a/src/test/ui/ufcs/ufcs-partially-resolved.rs +++ b/src/test/ui/ufcs/ufcs-partially-resolved.rs @@ -35,7 +35,7 @@ fn main() { <u8 as A>::N::NN; //~ ERROR cannot find associated type `N` in `A` let _: <u8 as Tr>::Y::NN; //~ ERROR ambiguous associated type let _: <u8 as E>::Y::NN; //~ ERROR expected associated type, found variant `E::Y` - <u8 as Tr>::Y::NN; //~ ERROR no associated item named `NN` found for type `<u8 as Tr>::Y` + <u8 as Tr>::Y::NN; //~ ERROR no associated item named `NN` found <u8 as E>::Y::NN; //~ ERROR expected associated type, found variant `E::Y` let _: <u8 as Tr::N>::NN; //~ ERROR cannot find associated type `NN` in `Tr::N` @@ -52,5 +52,5 @@ fn main() { let _: <u8 as Dr>::Z; //~ ERROR expected associated type, found method `Dr::Z` <u8 as Dr>::X; //~ ERROR expected method or associated constant, found associated type `Dr::X` let _: <u8 as Dr>::Z::N; //~ ERROR expected associated type, found method `Dr::Z` - <u8 as Dr>::X::N; //~ ERROR no associated item named `N` found for type `<u8 as Dr>::X` + <u8 as Dr>::X::N; //~ ERROR no associated item named `N` found } diff --git a/src/test/ui/ufcs/ufcs-partially-resolved.stderr b/src/test/ui/ufcs/ufcs-partially-resolved.stderr index dbd41da6da..60ebe8ee05 100644 --- a/src/test/ui/ufcs/ufcs-partially-resolved.stderr +++ b/src/test/ui/ufcs/ufcs-partially-resolved.stderr @@ -207,13 +207,13 @@ error[E0223]: ambiguous associated type LL | let _: <u8 as Tr>::Y::NN; | ^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<<u8 as Tr>::Y as Trait>::NN` -error[E0599]: no associated item named `NN` found for type `<u8 as Tr>::Y` in the current scope +error[E0599]: no associated item named `NN` found for associated type `<u8 as Tr>::Y` in the current scope --> $DIR/ufcs-partially-resolved.rs:38:20 | LL | <u8 as Tr>::Y::NN; | ^^ associated item not found in `<u8 as Tr>::Y` -error[E0599]: no associated item named `N` found for type `<u8 as Dr>::X` in the current scope +error[E0599]: no associated item named `N` found for associated type `<u8 as Dr>::X` in the current scope --> $DIR/ufcs-partially-resolved.rs:55:20 | LL | <u8 as Dr>::X::N; diff --git a/src/test/ui/ui-testing-optout.rs b/src/test/ui/ui-testing-optout.rs index 041c0b0a85..901263c5bf 100644 --- a/src/test/ui/ui-testing-optout.rs +++ b/src/test/ui/ui-testing-optout.rs @@ -1,4 +1,4 @@ -// disable-ui-testing-normalization +// compile-flags: -Z ui-testing=no // Line number < 10 type A = B; //~ ERROR diff --git a/src/test/ui/unboxed-closures/unboxed-closure-feature-gate.stderr b/src/test/ui/unboxed-closures/unboxed-closure-feature-gate.stderr index a76954287e..7ae8caee6f 100644 --- a/src/test/ui/unboxed-closures/unboxed-closure-feature-gate.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closure-feature-gate.stderr @@ -2,7 +2,7 @@ error[E0658]: parenthetical notation is only stable when used with `Fn`-family t --> $DIR/unboxed-closure-feature-gate.rs:13:20 | LL | let x: Box<dyn Foo(isize)>; - | ^^^^^^^^^^ + | ^^^ | = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-lifetime-elision.stderr b/src/test/ui/unboxed-closures/unboxed-closure-sugar-lifetime-elision.stderr index 9fb9a07166..0a028e4491 100644 --- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-lifetime-elision.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-lifetime-elision.stderr @@ -2,9 +2,18 @@ error[E0106]: missing lifetime specifier --> $DIR/unboxed-closure-sugar-lifetime-elision.rs:26:39 | LL | let _: dyn Foo(&isize, &usize) -> &usize; - | ^ expected lifetime parameter + | ^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from argument 1 or argument 2 +help: consider introducing a named lifetime parameter + | +LL | fn main<'lifetime>() { +LL | eq::< dyn for<'a> Foo<(&'a isize,), Output=&'a isize>, +LL | dyn Foo(&isize) -> &isize >(); +LL | eq::< dyn for<'a> Foo<(&'a isize,), Output=(&'a isize, &'a isize)>, +LL | dyn Foo(&isize) -> (&isize, &isize) >(); +LL | + ... error: aborting due to previous error diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-not-used-on-fn.stderr b/src/test/ui/unboxed-closures/unboxed-closure-sugar-not-used-on-fn.stderr index c116728190..ba9d984e70 100644 --- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-not-used-on-fn.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-not-used-on-fn.stderr @@ -1,17 +1,17 @@ -error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead +error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change --> $DIR/unboxed-closure-sugar-not-used-on-fn.rs:3:17 | LL | fn bar1(x: &dyn Fn<(), Output=()>) { - | ^^^^^^^^^^^^^^^^^ + | ^^ help: use parenthetical notation instead: `Fn() -> ()` | = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable -error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead +error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change --> $DIR/unboxed-closure-sugar-not-used-on-fn.rs:7:28 | LL | fn bar2<T>(x: &T) where T: Fn<()> { - | ^^^^^^ + | ^^ help: use parenthetical notation instead: `Fn() -> ()` | = note: for more information, see https://github.com/rust-lang/rust/issues/29625 = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-region.stderr b/src/test/ui/unboxed-closures/unboxed-closure-sugar-region.stderr index e9d51983a7..b92f054498 100644 --- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-region.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-region.stderr @@ -2,7 +2,7 @@ error[E0107]: wrong number of lifetime arguments: expected 1, found 0 --> $DIR/unboxed-closure-sugar-region.rs:30:51 | LL | fn test2(x: &dyn Foo<(isize,),Output=()>, y: &dyn Foo(isize)) { - | ^^^^^^^^^^ expected 1 lifetime argument + | ^^^ expected 1 lifetime argument error: aborting due to previous error diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-wrong-number-number-type-parameters-3.stderr b/src/test/ui/unboxed-closures/unboxed-closure-sugar-wrong-number-number-type-parameters-3.stderr index f42ac38d37..f482098cbf 100644 --- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-wrong-number-number-type-parameters-3.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-wrong-number-number-type-parameters-3.stderr @@ -2,7 +2,7 @@ error[E0107]: wrong number of type arguments: expected 3, found 1 --> $DIR/unboxed-closure-sugar-wrong-number-number-type-parameters-3.rs:5:16 | LL | fn foo(_: &dyn Three()) - | ^^^^^^^ expected 3 type arguments + | ^^^^^ expected 3 type arguments error[E0220]: associated type `Output` not found for `Three<(), [type error], [type error]>` --> $DIR/unboxed-closure-sugar-wrong-number-number-type-parameters-3.rs:5:16 diff --git a/src/test/ui/unboxed-closures/unboxed-closure-sugar-wrong-trait.stderr b/src/test/ui/unboxed-closures/unboxed-closure-sugar-wrong-trait.stderr index c81402a3dc..ff65fd968c 100644 --- a/src/test/ui/unboxed-closures/unboxed-closure-sugar-wrong-trait.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closure-sugar-wrong-trait.stderr @@ -5,10 +5,10 @@ LL | fn f<F:Trait(isize) -> isize>(x: F) {} | ^^^^^^^^^^^^ unexpected type argument error[E0220]: associated type `Output` not found for `Trait` - --> $DIR/unboxed-closure-sugar-wrong-trait.rs:5:24 + --> $DIR/unboxed-closure-sugar-wrong-trait.rs:5:8 | LL | fn f<F:Trait(isize) -> isize>(x: F) {} - | ^^^^^ associated type `Output` not found + | ^^^^^^^^^^^^^^^^^^^^^ associated type `Output` not found error: aborting due to 2 previous errors diff --git a/src/test/ui/unboxed-closures/unboxed-closures-static-call-wrong-trait.stderr b/src/test/ui/unboxed-closures/unboxed-closures-static-call-wrong-trait.stderr index 18276d5710..0b6d94e71f 100644 --- a/src/test/ui/unboxed-closures/unboxed-closures-static-call-wrong-trait.stderr +++ b/src/test/ui/unboxed-closures/unboxed-closures-static-call-wrong-trait.stderr @@ -1,10 +1,10 @@ -error[E0599]: no method named `call` found for type `[closure@$DIR/unboxed-closures-static-call-wrong-trait.rs:6:26: 6:31]` in the current scope +error[E0599]: no method named `call` found for closure `[closure@$DIR/unboxed-closures-static-call-wrong-trait.rs:6:26: 6:31]` in the current scope --> $DIR/unboxed-closures-static-call-wrong-trait.rs:7:10 | LL | mut_.call((0, )); | ^^^^ method not found in `[closure@$DIR/unboxed-closures-static-call-wrong-trait.rs:6:26: 6:31]` | - = note: mut_ is a function, perhaps you wish to call it + = note: `mut_` is a function, perhaps you wish to call it error: aborting due to previous error diff --git a/src/test/ui/unconstrained-none.stderr b/src/test/ui/unconstrained-none.stderr index 6c4fde94a6..fbd71bd091 100644 --- a/src/test/ui/unconstrained-none.stderr +++ b/src/test/ui/unconstrained-none.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/unconstrained-none.rs:4:5 | LL | None; - | ^^^^ cannot infer type for type parameter `T` + | ^^^^ cannot infer type for type parameter `T` declared on the enum `Option` error: aborting due to previous error diff --git a/src/test/ui/unconstrained-ref.stderr b/src/test/ui/unconstrained-ref.stderr index d6985a61da..eb8ebb5165 100644 --- a/src/test/ui/unconstrained-ref.stderr +++ b/src/test/ui/unconstrained-ref.stderr @@ -2,7 +2,7 @@ error[E0282]: type annotations needed --> $DIR/unconstrained-ref.rs:6:5 | LL | S { o: &None }; - | ^ cannot infer type for type parameter `T` + | ^ cannot infer type for type parameter `T` declared on the struct `S` error: aborting due to previous error diff --git a/src/test/ui/underscore-imports/hygiene.stderr b/src/test/ui/underscore-imports/hygiene.stderr index 44cfc5cc5d..2983613786 100644 --- a/src/test/ui/underscore-imports/hygiene.stderr +++ b/src/test/ui/underscore-imports/hygiene.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `deref` found for type `&()` in the current scope +error[E0599]: no method named `deref` found for reference `&()` in the current scope --> $DIR/hygiene.rs:38:11 | LL | (&()).deref(); @@ -10,7 +10,7 @@ help: the following trait is implemented but not in scope; perhaps add a `use` f LL | use std::ops::Deref; | -error[E0599]: no method named `deref_mut` found for type `&mut ()` in the current scope +error[E0599]: no method named `deref_mut` found for mutable reference `&mut ()` in the current scope --> $DIR/hygiene.rs:39:15 | LL | (&mut ()).deref_mut(); diff --git a/src/test/ui/underscore-imports/shadow.stderr b/src/test/ui/underscore-imports/shadow.stderr index 102c17f6f5..eb16fa9d56 100644 --- a/src/test/ui/underscore-imports/shadow.stderr +++ b/src/test/ui/underscore-imports/shadow.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `deref` found for type `&()` in the current scope +error[E0599]: no method named `deref` found for reference `&()` in the current scope --> $DIR/shadow.rs:19:11 | LL | x.deref(); diff --git a/src/test/ui/underscore-lifetime/dyn-trait-underscore-in-struct.stderr b/src/test/ui/underscore-lifetime/dyn-trait-underscore-in-struct.stderr index b20c23ade2..04df2e4570 100644 --- a/src/test/ui/underscore-lifetime/dyn-trait-underscore-in-struct.stderr +++ b/src/test/ui/underscore-lifetime/dyn-trait-underscore-in-struct.stderr @@ -2,7 +2,13 @@ error[E0106]: missing lifetime specifier --> $DIR/dyn-trait-underscore-in-struct.rs:9:24 | LL | x: Box<dyn Debug + '_>, - | ^^ expected lifetime parameter + | ^^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | struct Foo<'lifetime> { +LL | x: Box<dyn Debug + 'lifetime>, + | error[E0228]: the lifetime bound for this object type cannot be deduced from context; please supply an explicit bound --> $DIR/dyn-trait-underscore-in-struct.rs:9:12 diff --git a/src/test/ui/underscore-lifetime/in-fn-return-illegal.stderr b/src/test/ui/underscore-lifetime/in-fn-return-illegal.stderr index ed61bdfddd..cf820249c8 100644 --- a/src/test/ui/underscore-lifetime/in-fn-return-illegal.stderr +++ b/src/test/ui/underscore-lifetime/in-fn-return-illegal.stderr @@ -2,9 +2,13 @@ error[E0106]: missing lifetime specifier --> $DIR/in-fn-return-illegal.rs:5:30 | LL | fn foo(x: &u32, y: &u32) -> &'_ u32 { loop { } } - | ^^ expected lifetime parameter + | ^^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or `y` +help: consider introducing a named lifetime parameter + | +LL | fn foo<'lifetime>(x: &u32, y: &u32) -> &'lifetime u32 { loop { } } + | ^^^^^^^^^^^ ^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/underscore-lifetime/in-struct.stderr b/src/test/ui/underscore-lifetime/in-struct.stderr index 6bbdc71195..e01b39a4b6 100644 --- a/src/test/ui/underscore-lifetime/in-struct.stderr +++ b/src/test/ui/underscore-lifetime/in-struct.stderr @@ -2,13 +2,25 @@ error[E0106]: missing lifetime specifier --> $DIR/in-struct.rs:6:9 | LL | x: &'_ u32, - | ^^ expected lifetime parameter + | ^^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | struct Foo<'lifetime> { +LL | x: &'lifetime u32, + | error[E0106]: missing lifetime specifier --> $DIR/in-struct.rs:10:14 | LL | Variant(&'_ u32), - | ^^ expected lifetime parameter + | ^^ expected named lifetime parameter + | +help: consider introducing a named lifetime parameter + | +LL | enum Bar<'lifetime> { +LL | Variant(&'lifetime u32), + | error: aborting due to 2 previous errors diff --git a/src/test/ui/underscore-lifetime/underscore-lifetime-binders.stderr b/src/test/ui/underscore-lifetime/underscore-lifetime-binders.stderr index ef9e7e39df..517904ee62 100644 --- a/src/test/ui/underscore-lifetime/underscore-lifetime-binders.stderr +++ b/src/test/ui/underscore-lifetime/underscore-lifetime-binders.stderr @@ -14,7 +14,7 @@ error[E0106]: missing lifetime specifier --> $DIR/underscore-lifetime-binders.rs:2:17 | LL | struct Baz<'a>(&'_ &'a u8); - | ^^ expected lifetime parameter + | ^^ help: consider using the named lifetime: `'a` error[E0106]: missing lifetime specifier --> $DIR/underscore-lifetime-binders.rs:10:33 @@ -28,9 +28,13 @@ error[E0106]: missing lifetime specifier --> $DIR/underscore-lifetime-binders.rs:16:35 | LL | fn foo2(_: &'_ u8, y: &'_ u8) -> &'_ u8 { y } - | ^^ expected lifetime parameter + | ^^ expected named lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from argument 1 or `y` +help: consider introducing a named lifetime parameter + | +LL | fn foo2<'lifetime>(_: &'_ u8, y: &'_ u8) -> &'lifetime u8 { y } + | ^^^^^^^^^^^ ^^^^^^^^^ error: aborting due to 5 previous errors diff --git a/src/test/ui/uninhabited/uninhabited-matches-feature-gated.rs b/src/test/ui/uninhabited/uninhabited-matches-feature-gated.rs index a5360fa13c..e804afcf9e 100644 --- a/src/test/ui/uninhabited/uninhabited-matches-feature-gated.rs +++ b/src/test/ui/uninhabited/uninhabited-matches-feature-gated.rs @@ -1,5 +1,4 @@ -#![allow(deprecated)] - +use std::mem::zeroed; enum Void {} fn main() { @@ -8,21 +7,25 @@ fn main() { Ok(n) => n, }; - let x: &Void = unsafe { std::mem::uninitialized() }; + // This is pretty much instant UB. However, we have no choice -- we need to + // test matching on a reference to `&Void`; we cannot do anything other than + // just accept the fact that this is UB if `main` did run, but it doesn't; + // this test only checks that these are feature-gated. + let x: &Void = unsafe { zeroed() }; let _ = match x {}; //~ ERROR non-exhaustive - let x: (Void,) = unsafe { std::mem::uninitialized() }; + let x: (Void,) = unsafe { zeroed() }; let _ = match x {}; //~ ERROR non-exhaustive - let x: [Void; 1] = unsafe { std::mem::uninitialized() }; + let x: [Void; 1] = unsafe { zeroed() }; let _ = match x {}; //~ ERROR non-exhaustive - let x: &[Void] = unsafe { std::mem::uninitialized() }; + let x: &[Void] = unsafe { zeroed() }; let _ = match x { //~ ERROR non-exhaustive &[] => (), }; - let x: Void = unsafe { std::mem::uninitialized() }; + let x: Void = unsafe { zeroed() }; let _ = match x {}; // okay let x: Result<u32, Void> = Ok(23); diff --git a/src/test/ui/uninhabited/uninhabited-matches-feature-gated.stderr b/src/test/ui/uninhabited/uninhabited-matches-feature-gated.stderr index 18ffdccb9b..a667e1fe2d 100644 --- a/src/test/ui/uninhabited/uninhabited-matches-feature-gated.stderr +++ b/src/test/ui/uninhabited/uninhabited-matches-feature-gated.stderr @@ -1,5 +1,5 @@ error[E0004]: non-exhaustive patterns: `Err(_)` not covered - --> $DIR/uninhabited-matches-feature-gated.rs:7:19 + --> $DIR/uninhabited-matches-feature-gated.rs:6:19 | LL | let _ = match x { | ^ pattern `Err(_)` not covered @@ -7,7 +7,7 @@ LL | let _ = match x { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: type `&Void` is non-empty - --> $DIR/uninhabited-matches-feature-gated.rs:12:19 + --> $DIR/uninhabited-matches-feature-gated.rs:15:19 | LL | enum Void {} | ------------ `Void` defined here @@ -18,7 +18,7 @@ LL | let _ = match x {}; = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: type `(Void,)` is non-empty - --> $DIR/uninhabited-matches-feature-gated.rs:15:19 + --> $DIR/uninhabited-matches-feature-gated.rs:18:19 | LL | let _ = match x {}; | ^ @@ -26,7 +26,7 @@ LL | let _ = match x {}; = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: type `[Void; 1]` is non-empty - --> $DIR/uninhabited-matches-feature-gated.rs:18:19 + --> $DIR/uninhabited-matches-feature-gated.rs:21:19 | LL | let _ = match x {}; | ^ @@ -34,7 +34,7 @@ LL | let _ = match x {}; = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `&[_, ..]` not covered - --> $DIR/uninhabited-matches-feature-gated.rs:21:19 + --> $DIR/uninhabited-matches-feature-gated.rs:24:19 | LL | let _ = match x { | ^ pattern `&[_, ..]` not covered @@ -42,7 +42,7 @@ LL | let _ = match x { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0004]: non-exhaustive patterns: `Err(_)` not covered - --> $DIR/uninhabited-matches-feature-gated.rs:29:19 + --> $DIR/uninhabited-matches-feature-gated.rs:32:19 | LL | let _ = match x { | ^ pattern `Err(_)` not covered @@ -50,7 +50,7 @@ LL | let _ = match x { = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms error[E0005]: refutable pattern in local binding: `Err(_)` not covered - --> $DIR/uninhabited-matches-feature-gated.rs:34:9 + --> $DIR/uninhabited-matches-feature-gated.rs:37:9 | LL | let Ok(x) = x; | ^^^^^ pattern `Err(_)` not covered diff --git a/src/test/ui/uninhabited/uninhabited-patterns.rs b/src/test/ui/uninhabited/uninhabited-patterns.rs index 1bf01184a0..58c726d218 100644 --- a/src/test/ui/uninhabited/uninhabited-patterns.rs +++ b/src/test/ui/uninhabited/uninhabited-patterns.rs @@ -2,7 +2,7 @@ #![feature(box_syntax)] #![feature(never_type)] #![feature(exhaustive_patterns)] -#![feature(slice_patterns)] + #![deny(unreachable_patterns)] mod foo { diff --git a/src/test/ui/uninit-empty-types.rs b/src/test/ui/uninit-empty-types.rs index 0d1235776a..b21de882b2 100644 --- a/src/test/ui/uninit-empty-types.rs +++ b/src/test/ui/uninit-empty-types.rs @@ -1,17 +1,19 @@ -// run-pass +// build-pass // Test the uninit() construct returning various empty types. // pretty-expanded FIXME #23616 -use std::mem; +use std::mem::MaybeUninit; -#[derive(Clone)] struct Foo; #[allow(deprecated)] pub fn main() { unsafe { - let _x: Foo = mem::uninitialized(); - let _x: [Foo; 2] = mem::uninitialized(); + // `Foo` and `[Foo; 2]` are both zero sized and inhabited, so this is safe. + let _x: Foo = MaybeUninit::uninit().assume_init(); + let _x: [Foo; 2] = MaybeUninit::uninit().assume_init(); + let _x: Foo = std::mem::uninitialized(); + let _x: [Foo; 2] = std::mem::uninitialized(); } } diff --git a/src/test/ui/union/union-const-pat.rs b/src/test/ui/union/union-const-pat.rs index e7cb248a20..cb2248cc6d 100644 --- a/src/test/ui/union/union-const-pat.rs +++ b/src/test/ui/union/union-const-pat.rs @@ -8,6 +8,7 @@ const C: U = U { a: 10 }; fn main() { match C { C => {} //~ ERROR cannot use unions in constant patterns + //~| ERROR cannot use unions in constant patterns _ => {} } } diff --git a/src/test/ui/union/union-const-pat.stderr b/src/test/ui/union/union-const-pat.stderr index dc87f4de52..bec720401b 100644 --- a/src/test/ui/union/union-const-pat.stderr +++ b/src/test/ui/union/union-const-pat.stderr @@ -4,5 +4,11 @@ error: cannot use unions in constant patterns LL | C => {} | ^ -error: aborting due to previous error +error: cannot use unions in constant patterns + --> $DIR/union-const-pat.rs:10:9 + | +LL | C => {} + | ^ + +error: aborting due to 2 previous errors diff --git a/src/test/ui/union/union-derive-clone.rs b/src/test/ui/union/union-derive-clone.rs index 60e280f53f..4a106cc940 100644 --- a/src/test/ui/union/union-derive-clone.rs +++ b/src/test/ui/union/union-derive-clone.rs @@ -34,5 +34,5 @@ struct CloneNoCopy; fn main() { let u = U5 { a: ManuallyDrop::new(CloneNoCopy) }; - let w = u.clone(); //~ ERROR no method named `clone` found for type `U5<CloneNoCopy>` + let w = u.clone(); //~ ERROR no method named `clone` found for union `U5<CloneNoCopy>` } diff --git a/src/test/ui/union/union-derive-clone.stderr b/src/test/ui/union/union-derive-clone.stderr index 6893f9176f..0ef5753b59 100644 --- a/src/test/ui/union/union-derive-clone.stderr +++ b/src/test/ui/union/union-derive-clone.stderr @@ -6,7 +6,7 @@ LL | #[derive(Clone)] | = note: required by `std::clone::AssertParamIsCopy` -error[E0599]: no method named `clone` found for type `U5<CloneNoCopy>` in the current scope +error[E0599]: no method named `clone` found for union `U5<CloneNoCopy>` in the current scope --> $DIR/union-derive-clone.rs:37:15 | LL | union U5<T> { diff --git a/src/test/ui/unique-object-noncopyable.stderr b/src/test/ui/unique-object-noncopyable.stderr index cd46878c19..92cda6482c 100644 --- a/src/test/ui/unique-object-noncopyable.stderr +++ b/src/test/ui/unique-object-noncopyable.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `clone` found for type `std::boxed::Box<dyn Foo>` in the current scope +error[E0599]: no method named `clone` found for struct `std::boxed::Box<dyn Foo>` in the current scope --> $DIR/unique-object-noncopyable.rs:24:16 | LL | let _z = y.clone(); diff --git a/src/test/ui/unique-pinned-nocopy.stderr b/src/test/ui/unique-pinned-nocopy.stderr index 19ef2b21c2..e5c3eaccbd 100644 --- a/src/test/ui/unique-pinned-nocopy.stderr +++ b/src/test/ui/unique-pinned-nocopy.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `clone` found for type `std::boxed::Box<R>` in the current scope +error[E0599]: no method named `clone` found for struct `std::boxed::Box<R>` in the current scope --> $DIR/unique-pinned-nocopy.rs:12:16 | LL | let _j = i.clone(); diff --git a/src/test/ui/unknown-lint-tool-name.rs b/src/test/ui/unknown-lint-tool-name.rs index c92a71e939..182aec34b4 100644 --- a/src/test/ui/unknown-lint-tool-name.rs +++ b/src/test/ui/unknown-lint-tool-name.rs @@ -1,4 +1,8 @@ #![deny(foo::bar)] //~ ERROR an unknown tool name found in scoped lint: `foo::bar` + //~| ERROR an unknown tool name found in scoped lint: `foo::bar` + //~| ERROR an unknown tool name found in scoped lint: `foo::bar` #[allow(foo::bar)] //~ ERROR an unknown tool name found in scoped lint: `foo::bar` + //~| ERROR an unknown tool name found in scoped lint: `foo::bar` + //~| ERROR an unknown tool name found in scoped lint: `foo::bar` fn main() {} diff --git a/src/test/ui/unknown-lint-tool-name.stderr b/src/test/ui/unknown-lint-tool-name.stderr index dd3070bbcb..1940f61a47 100644 --- a/src/test/ui/unknown-lint-tool-name.stderr +++ b/src/test/ui/unknown-lint-tool-name.stderr @@ -5,10 +5,34 @@ LL | #![deny(foo::bar)] | ^^^ error[E0710]: an unknown tool name found in scoped lint: `foo::bar` - --> $DIR/unknown-lint-tool-name.rs:3:9 + --> $DIR/unknown-lint-tool-name.rs:5:9 | LL | #[allow(foo::bar)] | ^^^ -error: aborting due to 2 previous errors +error[E0710]: an unknown tool name found in scoped lint: `foo::bar` + --> $DIR/unknown-lint-tool-name.rs:1:9 + | +LL | #![deny(foo::bar)] + | ^^^ + +error[E0710]: an unknown tool name found in scoped lint: `foo::bar` + --> $DIR/unknown-lint-tool-name.rs:5:9 + | +LL | #[allow(foo::bar)] + | ^^^ + +error[E0710]: an unknown tool name found in scoped lint: `foo::bar` + --> $DIR/unknown-lint-tool-name.rs:1:9 + | +LL | #![deny(foo::bar)] + | ^^^ + +error[E0710]: an unknown tool name found in scoped lint: `foo::bar` + --> $DIR/unknown-lint-tool-name.rs:5:9 + | +LL | #[allow(foo::bar)] + | ^^^ + +error: aborting due to 6 previous errors diff --git a/src/test/ui/unspecified-self-in-trait-ref.stderr b/src/test/ui/unspecified-self-in-trait-ref.stderr index 06370cec90..e057a7842b 100644 --- a/src/test/ui/unspecified-self-in-trait-ref.stderr +++ b/src/test/ui/unspecified-self-in-trait-ref.stderr @@ -1,22 +1,22 @@ -error[E0599]: no function or associated item named `lol` found for type `dyn Foo<_>` in the current scope +error[E0599]: no function or associated item named `lol` found for trait object `dyn Foo<_>` in the current scope --> $DIR/unspecified-self-in-trait-ref.rs:10:18 | LL | let a = Foo::lol(); | ^^^ function or associated item not found in `dyn Foo<_>` -error[E0599]: no function or associated item named `lol` found for type `dyn Foo<_>` in the current scope +error[E0599]: no function or associated item named `lol` found for trait object `dyn Foo<_>` in the current scope --> $DIR/unspecified-self-in-trait-ref.rs:12:23 | LL | let b = Foo::<_>::lol(); | ^^^ function or associated item not found in `dyn Foo<_>` -error[E0599]: no function or associated item named `lol` found for type `dyn Bar<_, _>` in the current scope +error[E0599]: no function or associated item named `lol` found for trait object `dyn Bar<_, _>` in the current scope --> $DIR/unspecified-self-in-trait-ref.rs:14:18 | LL | let c = Bar::lol(); | ^^^ function or associated item not found in `dyn Bar<_, _>` -error[E0599]: no function or associated item named `lol` found for type `dyn Bar<usize, _>` in the current scope +error[E0599]: no function or associated item named `lol` found for trait object `dyn Bar<usize, _>` in the current scope --> $DIR/unspecified-self-in-trait-ref.rs:16:30 | LL | let d = Bar::<usize, _>::lol(); @@ -25,8 +25,13 @@ LL | let d = Bar::<usize, _>::lol(); error[E0393]: the type parameter `A` must be explicitly specified --> $DIR/unspecified-self-in-trait-ref.rs:18:13 | -LL | let e = Bar::<usize>::lol(); - | ^^^^^^^^^^^^^^^^^ missing reference to `A` +LL | / pub trait Bar<X=usize, A=Self> { +LL | | fn foo(&self); +LL | | } + | |_- type parameter `A` must be specified for this +... +LL | let e = Bar::<usize>::lol(); + | ^^^ missing reference to `A` | = note: because of the default `Self` reference, type parameters must be specified on object types diff --git a/src/test/ui/use/auxiliary/extern-use-primitive-type-lib.rs b/src/test/ui/use/auxiliary/extern-use-primitive-type-lib.rs new file mode 100644 index 0000000000..3c7756ef7e --- /dev/null +++ b/src/test/ui/use/auxiliary/extern-use-primitive-type-lib.rs @@ -0,0 +1,3 @@ +// compile-flags: --edition=2018 + +pub use u32; diff --git a/src/test/ui/use/issue-60976-extern-use-primitive-type.rs b/src/test/ui/use/issue-60976-extern-use-primitive-type.rs new file mode 100644 index 0000000000..4cd458302a --- /dev/null +++ b/src/test/ui/use/issue-60976-extern-use-primitive-type.rs @@ -0,0 +1,7 @@ +// Regression test for #60976: ICE (with <=1.36.0) when another file had `use <primitive_type>;`. +// check-pass +// aux-build:extern-use-primitive-type-lib.rs + +extern crate extern_use_primitive_type_lib; + +fn main() {} diff --git a/src/test/ui/use/use-from-trait-xc.stderr b/src/test/ui/use/use-from-trait-xc.stderr index f7438cce22..3f38a6cae7 100644 --- a/src/test/ui/use/use-from-trait-xc.stderr +++ b/src/test/ui/use/use-from-trait-xc.stderr @@ -44,13 +44,25 @@ error[E0603]: struct `Foo` is private --> $DIR/use-from-trait-xc.rs:14:24 | LL | use use_from_trait_xc::Foo::new; - | ^^^ + | ^^^ this struct is private + | +note: the struct `Foo` is defined here + --> $DIR/auxiliary/use-from-trait-xc.rs:9:1 + | +LL | struct Foo; + | ^^^^^^^^^^^ error[E0603]: struct `Foo` is private --> $DIR/use-from-trait-xc.rs:17:24 | LL | use use_from_trait_xc::Foo::C; - | ^^^ + | ^^^ this struct is private + | +note: the struct `Foo` is defined here + --> $DIR/auxiliary/use-from-trait-xc.rs:9:1 + | +LL | struct Foo; + | ^^^^^^^^^^^ error: aborting due to 9 previous errors diff --git a/src/test/ui/use/use-mod/use-mod-3.stderr b/src/test/ui/use/use-mod/use-mod-3.stderr index 0c800ec35e..4852759286 100644 --- a/src/test/ui/use/use-mod/use-mod-3.stderr +++ b/src/test/ui/use/use-mod/use-mod-3.stderr @@ -2,13 +2,25 @@ error[E0603]: module `bar` is private --> $DIR/use-mod-3.rs:1:10 | LL | use foo::bar::{ - | ^^^ + | ^^^ this module is private + | +note: the module `bar` is defined here + --> $DIR/use-mod-3.rs:9:5 + | +LL | mod bar { pub type Bar = isize; } + | ^^^^^^^ error[E0603]: module `bar` is private --> $DIR/use-mod-3.rs:4:10 | LL | use foo::bar::{ - | ^^^ + | ^^^ this module is private + | +note: the module `bar` is defined here + --> $DIR/use-mod-3.rs:9:5 + | +LL | mod bar { pub type Bar = isize; } + | ^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/use/use-super-global-path.rs b/src/test/ui/use/use-super-global-path.rs index 3e0ebccc0a..27a4a653b4 100644 --- a/src/test/ui/use/use-super-global-path.rs +++ b/src/test/ui/use/use-super-global-path.rs @@ -5,6 +5,7 @@ struct Z; mod foo { use ::super::{S, Z}; //~ ERROR global paths cannot start with `super` + //~| ERROR global paths cannot start with `super` pub fn g() { use ::super::main; //~ ERROR global paths cannot start with `super` diff --git a/src/test/ui/use/use-super-global-path.stderr b/src/test/ui/use/use-super-global-path.stderr index 3ca30ebebb..7f98ac7cd0 100644 --- a/src/test/ui/use/use-super-global-path.stderr +++ b/src/test/ui/use/use-super-global-path.stderr @@ -5,13 +5,19 @@ LL | use ::super::{S, Z}; | ^^^^^ global paths cannot start with `super` error[E0433]: failed to resolve: global paths cannot start with `super` - --> $DIR/use-super-global-path.rs:10:15 + --> $DIR/use-super-global-path.rs:7:11 + | +LL | use ::super::{S, Z}; + | ^^^^^ global paths cannot start with `super` + +error[E0433]: failed to resolve: global paths cannot start with `super` + --> $DIR/use-super-global-path.rs:11:15 | LL | use ::super::main; | ^^^^^ global paths cannot start with `super` error[E0425]: cannot find function `main` in this scope - --> $DIR/use-super-global-path.rs:11:9 + --> $DIR/use-super-global-path.rs:12:9 | LL | main(); | ^^^^ not found in this scope @@ -21,7 +27,7 @@ help: possible candidate is found in another module, you can import it into scop LL | use main; | -error: aborting due to 3 previous errors +error: aborting due to 4 previous errors Some errors have detailed explanations: E0425, E0433. For more information about an error, try `rustc --explain E0425`. diff --git a/src/test/ui/vec/vec-res-add.rs b/src/test/ui/vec/vec-res-add.rs index ea2aa6cda2..4785178fb2 100644 --- a/src/test/ui/vec/vec-res-add.rs +++ b/src/test/ui/vec/vec-res-add.rs @@ -14,6 +14,6 @@ fn main() { let i = vec![r(0)]; let j = vec![r(1)]; let k = i + j; - //~^ ERROR binary operation `+` cannot be applied to type + //~^ ERROR cannot add `std::vec::Vec<R>` to `std::vec::Vec<R>` println!("{:?}", j); } diff --git a/src/test/ui/vec/vec-res-add.stderr b/src/test/ui/vec/vec-res-add.stderr index 78b70f09e9..1cc12a222e 100644 --- a/src/test/ui/vec/vec-res-add.stderr +++ b/src/test/ui/vec/vec-res-add.stderr @@ -1,4 +1,4 @@ -error[E0369]: binary operation `+` cannot be applied to type `std::vec::Vec<R>` +error[E0369]: cannot add `std::vec::Vec<R>` to `std::vec::Vec<R>` --> $DIR/vec-res-add.rs:16:15 | LL | let k = i + j; diff --git a/src/test/ui/wf/wf-unsafe-trait-obj-match.stderr b/src/test/ui/wf/wf-unsafe-trait-obj-match.stderr index d5799ccc83..594fad4138 100644 --- a/src/test/ui/wf/wf-unsafe-trait-obj-match.stderr +++ b/src/test/ui/wf/wf-unsafe-trait-obj-match.stderr @@ -1,4 +1,4 @@ -error[E0308]: match arms have incompatible types +error[E0308]: `match` arms have incompatible types --> $DIR/wf-unsafe-trait-obj-match.rs:23:17 | LL | / match opt() { diff --git a/src/test/ui/where-clauses/where-equality-constraints.rs b/src/test/ui/where-clauses/where-equality-constraints.rs index f2349144b8..8828f09d92 100644 --- a/src/test/ui/where-clauses/where-equality-constraints.rs +++ b/src/test/ui/where-clauses/where-equality-constraints.rs @@ -1,6 +1,6 @@ fn f() where u8 = u16 {} -//~^ ERROR equality constraints are not yet supported in where clauses +//~^ ERROR equality constraints are not yet supported in `where` clauses fn g() where for<'a> &'static (u8,) == u16, {} -//~^ ERROR equality constraints are not yet supported in where clauses +//~^ ERROR equality constraints are not yet supported in `where` clauses fn main() {} diff --git a/src/test/ui/where-clauses/where-equality-constraints.stderr b/src/test/ui/where-clauses/where-equality-constraints.stderr index 220447079c..54d6ad6a13 100644 --- a/src/test/ui/where-clauses/where-equality-constraints.stderr +++ b/src/test/ui/where-clauses/where-equality-constraints.stderr @@ -1,14 +1,18 @@ -error: equality constraints are not yet supported in where clauses (see #20041) +error: equality constraints are not yet supported in `where` clauses --> $DIR/where-equality-constraints.rs:1:14 | LL | fn f() where u8 = u16 {} - | ^^^^^^^^ + | ^^^^^^^^ not supported + | + = note: for more information, see https://github.com/rust-lang/rust/issues/20041 -error: equality constraints are not yet supported in where clauses (see #20041) +error: equality constraints are not yet supported in `where` clauses --> $DIR/where-equality-constraints.rs:3:14 | LL | fn g() where for<'a> &'static (u8,) == u16, {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not supported + | + = note: for more information, see https://github.com/rust-lang/rust/issues/20041 error: aborting due to 2 previous errors diff --git a/src/test/ui/where-clauses/where-lifetime-resolution.stderr b/src/test/ui/where-clauses/where-lifetime-resolution.stderr index 0081ae0716..49799a9301 100644 --- a/src/test/ui/where-clauses/where-lifetime-resolution.stderr +++ b/src/test/ui/where-clauses/where-lifetime-resolution.stderr @@ -1,6 +1,9 @@ error[E0261]: use of undeclared lifetime name `'a` --> $DIR/where-lifetime-resolution.rs:6:38 | +LL | fn f() where + | - help: consider introducing lifetime `'a` here: `<'a>` +LL | for<'a> dyn Trait1<'a>: Trait1<'a>, // OK LL | (dyn for<'a> Trait1<'a>): Trait1<'a>, | ^^ undeclared lifetime @@ -13,6 +16,9 @@ LL | for<'a> dyn for<'b> Trait2<'a, 'b>: Trait2<'a, 'b>, error[E0261]: use of undeclared lifetime name `'b` --> $DIR/where-lifetime-resolution.rs:8:52 | +LL | fn f() where + | - help: consider introducing lifetime `'b` here: `<'b>` +... LL | for<'a> dyn for<'b> Trait2<'a, 'b>: Trait2<'a, 'b>, | ^^ undeclared lifetime diff --git a/src/test/ui/while-let.stderr b/src/test/ui/while-let.stderr index 172874ad5f..09f0d641de 100644 --- a/src/test/ui/while-let.stderr +++ b/src/test/ui/while-let.stderr @@ -2,7 +2,7 @@ warning: irrefutable while-let pattern --> $DIR/while-let.rs:7:13 | LL | while let $p = $e $b - | ^^^^^ + | ^^^^^^^^^^^^^^^^^^^^ ... LL | / foo!(_a, 1, { LL | | println!("irrefutable pattern"); @@ -15,7 +15,7 @@ warning: irrefutable while-let pattern --> $DIR/while-let.rs:7:13 | LL | while let $p = $e $b - | ^^^^^ + | ^^^^^^^^^^^^^^^^^^^^ ... LL | / bar!(_a, 1, { LL | | println!("irrefutable pattern"); diff --git a/src/test/ui/wrapping-int-api.rs b/src/test/ui/wrapping-int-api.rs index 2a5baad8b7..ecdd742fb4 100644 --- a/src/test/ui/wrapping-int-api.rs +++ b/src/test/ui/wrapping-int-api.rs @@ -1,6 +1,9 @@ // run-pass // Test inherent wrapping_* methods for {i,u}{size,8,16,32,64}. +// Don't warn about overflowing ops on 32-bit platforms +#![cfg_attr(target_pointer_width = "32", allow(const_err))] + use std::{i8, i16, i32, i64, isize}; use std::{u8, u16, u32, u64, usize}; diff --git a/src/test/ui/xcrate/xcrate-private-by-default.stderr b/src/test/ui/xcrate/xcrate-private-by-default.stderr index da52b4249e..842069d613 100644 --- a/src/test/ui/xcrate/xcrate-private-by-default.stderr +++ b/src/test/ui/xcrate/xcrate-private-by-default.stderr @@ -2,61 +2,121 @@ error[E0603]: static `j` is private --> $DIR/xcrate-private-by-default.rs:23:29 | LL | static_priv_by_default::j; - | ^ + | ^ this static is private + | +note: the static `j` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:47:1 + | +LL | static j: isize = 0; + | ^^^^^^^^^^^^^^^^^^^^ error[E0603]: function `k` is private --> $DIR/xcrate-private-by-default.rs:25:29 | LL | static_priv_by_default::k; - | ^ + | ^ this function is private + | +note: the function `k` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:48:1 + | +LL | fn k() {} + | ^^^^^^ error[E0603]: unit struct `l` is private --> $DIR/xcrate-private-by-default.rs:27:29 | LL | static_priv_by_default::l; - | ^ + | ^ this unit struct is private + | +note: the unit struct `l` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:49:1 + | +LL | struct l; + | ^^^^^^^^^ error[E0603]: enum `m` is private --> $DIR/xcrate-private-by-default.rs:29:35 | LL | foo::<static_priv_by_default::m>(); - | ^ + | ^ this enum is private + | +note: the enum `m` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:50:1 + | +LL | enum m {} + | ^^^^^^ error[E0603]: type alias `n` is private --> $DIR/xcrate-private-by-default.rs:31:35 | LL | foo::<static_priv_by_default::n>(); - | ^ + | ^ this type alias is private + | +note: the type alias `n` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:51:1 + | +LL | type n = isize; + | ^^^^^^^^^^^^^^^ error[E0603]: module `foo` is private --> $DIR/xcrate-private-by-default.rs:35:29 | LL | static_priv_by_default::foo::a; - | ^^^ + | ^^^ this module is private + | +note: the module `foo` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:12:1 + | +LL | mod foo { + | ^^^^^^^ error[E0603]: module `foo` is private --> $DIR/xcrate-private-by-default.rs:37:29 | LL | static_priv_by_default::foo::b; - | ^^^ + | ^^^ this module is private + | +note: the module `foo` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:12:1 + | +LL | mod foo { + | ^^^^^^^ error[E0603]: module `foo` is private --> $DIR/xcrate-private-by-default.rs:39:29 | LL | static_priv_by_default::foo::c; - | ^^^ + | ^^^ this module is private + | +note: the module `foo` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:12:1 + | +LL | mod foo { + | ^^^^^^^ error[E0603]: module `foo` is private --> $DIR/xcrate-private-by-default.rs:41:35 | LL | foo::<static_priv_by_default::foo::d>(); - | ^^^ + | ^^^ this module is private + | +note: the module `foo` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:12:1 + | +LL | mod foo { + | ^^^^^^^ error[E0603]: module `foo` is private --> $DIR/xcrate-private-by-default.rs:43:35 | LL | foo::<static_priv_by_default::foo::e>(); - | ^^^ + | ^^^ this module is private + | +note: the module `foo` is defined here + --> $DIR/auxiliary/static_priv_by_default.rs:12:1 + | +LL | mod foo { + | ^^^^^^^ error: aborting due to 10 previous errors diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index d92924085e..98e9fe7a8b 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -6,16 +6,16 @@ #![deny(warnings)] -use toml; use serde::Serialize; +use toml; use std::collections::BTreeMap; +use std::collections::HashMap; use std::env; use std::fs::{self, File}; use std::io::{self, Read, Write}; -use std::path::{PathBuf, Path}; +use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; -use std::collections::HashMap; static HOSTS: &[&str] = &[ "aarch64-unknown-linux-gnu", @@ -69,6 +69,7 @@ static TARGETS: &[&str] = &[ "thumbv7neon-linux-androideabi", "armv7-unknown-linux-gnueabi", "armv7-unknown-linux-gnueabihf", + "armv7a-none-eabi", "thumbv7neon-unknown-linux-gnueabihf", "armv7-unknown-linux-musleabi", "armv7-unknown-linux-musleabihf", @@ -110,6 +111,7 @@ static TARGETS: &[&str] = &[ "riscv32imac-unknown-none-elf", "riscv64imac-unknown-none-elf", "riscv64gc-unknown-none-elf", + "riscv64gc-unknown-linux-gnu", "s390x-unknown-linux-gnu", "sparc64-unknown-linux-gnu", "sparcv9-sun-solaris", @@ -154,10 +156,7 @@ static DOCS_TARGETS: &[&str] = &[ "x86_64-unknown-linux-gnu", ]; -static MINGW: &[&str] = &[ - "i686-pc-windows-gnu", - "x86_64-pc-windows-gnu", -]; +static MINGW: &[&str] = &["i686-pc-windows-gnu", "x86_64-pc-windows-gnu"]; #[derive(Serialize)] #[serde(rename_all = "kebab-case")] @@ -193,7 +192,9 @@ struct Target { } impl Target { - fn unavailable() -> Self { Self::default() } + fn unavailable() -> Self { + Self::default() + } } #[derive(Serialize)] @@ -209,10 +210,12 @@ impl Component { } macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; } struct Builder { @@ -323,10 +326,21 @@ fn main() { miri_git_commit_hash: None, should_sign, - }.build(); + } + .build(); } -enum PkgType { RustSrc, Cargo, Rls, Clippy, Rustfmt, LlvmTools, Lldb, Miri, Other } +enum PkgType { + RustSrc, + Cargo, + Rls, + Clippy, + Rustfmt, + LlvmTools, + Lldb, + Miri, + Other, +} impl PkgType { fn from_component(component: &str) -> Self { @@ -362,8 +376,8 @@ impl Builder { self.rls_git_commit_hash = self.git_commit_hash("rls", "x86_64-unknown-linux-gnu"); self.clippy_git_commit_hash = self.git_commit_hash("clippy", "x86_64-unknown-linux-gnu"); self.rustfmt_git_commit_hash = self.git_commit_hash("rustfmt", "x86_64-unknown-linux-gnu"); - self.llvm_tools_git_commit_hash = self.git_commit_hash("llvm-tools", - "x86_64-unknown-linux-gnu"); + self.llvm_tools_git_commit_hash = + self.git_commit_hash("llvm-tools", "x86_64-unknown-linux-gnu"); self.lldb_git_commit_hash = self.git_commit_hash("lldb", "x86_64-unknown-linux-gnu"); self.miri_git_commit_hash = self.git_commit_hash("miri", "x86_64-unknown-linux-gnu"); @@ -381,11 +395,14 @@ impl Builder { /// Right now, we do this only for Miri. fn check_toolstate(&mut self) { let toolstates: Option<HashMap<String, String>> = - File::open(self.input.join("toolstates-linux.json")).ok() + File::open(self.input.join("toolstates-linux.json")) + .ok() .and_then(|f| serde_json::from_reader(&f).ok()); let toolstates = toolstates.unwrap_or_else(|| { - println!("WARNING: `toolstates-linux.json` missing/malformed; \ - assuming all tools failed"); + println!( + "WARNING: `toolstates-linux.json` missing/malformed; \ + assuming all tools failed" + ); HashMap::default() // Use empty map if anything went wrong. }); // Mark some tools as missing based on toolstate. @@ -442,30 +459,49 @@ impl Builder { fn add_profiles_to(&mut self, manifest: &mut Manifest) { let mut profile = |name, pkgs| self.profile(name, &mut manifest.profiles, pkgs); profile("minimal", &["rustc", "cargo", "rust-std", "rust-mingw"]); - profile("default", &[ - "rustc", "cargo", "rust-std", "rust-mingw", - "rust-docs", "rustfmt-preview", "clippy-preview" - ]); - profile("complete", &[ - "rustc", "cargo", "rust-std", "rust-mingw", - "rust-docs", "rustfmt-preview", "clippy-preview", - "rls-preview", "rust-src", "llvm-tools-preview", - "lldb-preview", "rust-analysis", "miri-preview" - ]); + profile( + "default", + &[ + "rustc", + "cargo", + "rust-std", + "rust-mingw", + "rust-docs", + "rustfmt-preview", + "clippy-preview", + ], + ); + profile( + "complete", + &[ + "rustc", + "cargo", + "rust-std", + "rust-mingw", + "rust-docs", + "rustfmt-preview", + "clippy-preview", + "rls-preview", + "rust-src", + "llvm-tools-preview", + "lldb-preview", + "rust-analysis", + "miri-preview", + ], + ); - // The compiler libraries are not stable for end users, but `rustc-dev` was only recently - // split out of `rust-std`. We'll include it by default as a transition for nightly users. + // The compiler libraries are not stable for end users, and they're also huge, so we only + // `rustc-dev` for nightly users, and only in the "complete" profile. It's still possible + // for users to install the additional component manually, if needed. if self.rust_release == "nightly" { - self.extend_profile("default", &mut manifest.profiles, &["rustc-dev"]); self.extend_profile("complete", &mut manifest.profiles, &["rustc-dev"]); } } fn add_renames_to(&self, manifest: &mut Manifest) { - let mut rename = |from: &str, to: &str| manifest.renames.insert( - from.to_owned(), - Rename { to: to.to_owned() } - ); + let mut rename = |from: &str, to: &str| { + manifest.renames.insert(from.to_owned(), Rename { to: to.to_owned() }) + }; rename("rls", "rls-preview"); rename("rustfmt", "rustfmt-preview"); rename("clippy", "clippy-preview"); @@ -474,10 +510,11 @@ impl Builder { fn rust_package(&mut self, manifest: &Manifest) -> Package { let mut pkg = Package { - version: self.cached_version("rust") - .as_ref() - .expect("Couldn't find Rust version") - .clone(), + version: self + .cached_version("rust") + .as_ref() + .expect("Couldn't find Rust version") + .clone(), git_commit_hash: self.cached_git_commit_hash("rust").clone(), target: BTreeMap::new(), }; @@ -486,7 +523,7 @@ impl Builder { pkg.target.insert(host.to_string(), target); } else { pkg.target.insert(host.to_string(), Target::unavailable()); - continue + continue; } } pkg @@ -514,15 +551,6 @@ impl Builder { components.push(host_component("rust-mingw")); } - // The compiler libraries are not stable for end users, but `rustc-dev` was only recently - // split out of `rust-std`. We'll include it by default as a transition for nightly users, - // but ship it as an optional component on the beta and stable channels. - if self.rust_release == "nightly" { - components.push(host_component("rustc-dev")); - } else { - extensions.push(host_component("rustc-dev")); - } - // Tools are always present in the manifest, // but might be marked as unavailable if they weren't built. extensions.extend(vec![ @@ -536,15 +564,12 @@ impl Builder { ]); extensions.extend( - TARGETS.iter() + TARGETS + .iter() .filter(|&&target| target != host) - .map(|target| Component::from_str("rust-std", target)) - ); - extensions.extend( - HOSTS.iter() - .filter(|&&target| target != host) - .map(|target| Component::from_str("rustc-dev", target)) + .map(|target| Component::from_str("rust-std", target)), ); + extensions.extend(HOSTS.iter().map(|target| Component::from_str("rustc-dev", target))); extensions.push(Component::from_str("rust-src", "*")); // If the components/extensions don't actually exist for this @@ -552,7 +577,7 @@ impl Builder { // lists. let has_component = |c: &Component| { if c.target == "*" { - return true + return true; } let pkg = match manifest.pkg.get(&c.pkg) { Some(p) => p, @@ -574,26 +599,29 @@ impl Builder { }) } - fn profile(&mut self, - profile_name: &str, - dst: &mut BTreeMap<String, Vec<String>>, - pkgs: &[&str]) { + fn profile( + &mut self, + profile_name: &str, + dst: &mut BTreeMap<String, Vec<String>>, + pkgs: &[&str], + ) { dst.insert(profile_name.to_owned(), pkgs.iter().map(|s| (*s).to_owned()).collect()); } - fn extend_profile(&mut self, - profile_name: &str, - dst: &mut BTreeMap<String, Vec<String>>, - pkgs: &[&str]) { - dst.get_mut(profile_name).expect("existing profile") + fn extend_profile( + &mut self, + profile_name: &str, + dst: &mut BTreeMap<String, Vec<String>>, + pkgs: &[&str], + ) { + dst.get_mut(profile_name) + .expect("existing profile") .extend(pkgs.iter().map(|s| (*s).to_owned())); } - fn package(&mut self, - pkgname: &str, - dst: &mut BTreeMap<String, Package>, - targets: &[&str]) { - let (version, mut is_present) = self.cached_version(pkgname) + fn package(&mut self, pkgname: &str, dst: &mut BTreeMap<String, Package>, targets: &[&str]) { + let (version, mut is_present) = self + .cached_version(pkgname) .as_ref() .cloned() .map(|version| (version, true)) @@ -604,46 +632,52 @@ impl Builder { is_present = false; // Pretend the component is entirely missing. } - let targets = targets.iter().map(|name| { - if is_present { - // The component generally exists, but it might still be missing for this target. - let filename = self.filename(pkgname, name); - let digest = match self.digests.remove(&filename) { - Some(digest) => digest, - // This component does not exist for this target -- skip it. - None => return (name.to_string(), Target::unavailable()), - }; - let xz_filename = filename.replace(".tar.gz", ".tar.xz"); - let xz_digest = self.digests.remove(&xz_filename); - - (name.to_string(), Target { - available: true, - url: Some(self.url(&filename)), - hash: Some(digest), - xz_url: xz_digest.as_ref().map(|_| self.url(&xz_filename)), - xz_hash: xz_digest, - components: None, - extensions: None, - }) - } else { - // If the component is not present for this build add it anyway but mark it as - // unavailable -- this way rustup won't allow upgrades without --force - (name.to_string(), Target::unavailable()) - } - }).collect(); - - dst.insert(pkgname.to_string(), Package { - version, - git_commit_hash: self.cached_git_commit_hash(pkgname).clone(), - target: targets, - }); + let targets = targets + .iter() + .map(|name| { + if is_present { + // The component generally exists, but it might still be missing for this target. + let filename = self.filename(pkgname, name); + let digest = match self.digests.remove(&filename) { + Some(digest) => digest, + // This component does not exist for this target -- skip it. + None => return (name.to_string(), Target::unavailable()), + }; + let xz_filename = filename.replace(".tar.gz", ".tar.xz"); + let xz_digest = self.digests.remove(&xz_filename); + + ( + name.to_string(), + Target { + available: true, + url: Some(self.url(&filename)), + hash: Some(digest), + xz_url: xz_digest.as_ref().map(|_| self.url(&xz_filename)), + xz_hash: xz_digest, + components: None, + extensions: None, + }, + ) + } else { + // If the component is not present for this build add it anyway but mark it as + // unavailable -- this way rustup won't allow upgrades without --force + (name.to_string(), Target::unavailable()) + } + }) + .collect(); + + dst.insert( + pkgname.to_string(), + Package { + version, + git_commit_hash: self.cached_git_commit_hash(pkgname).clone(), + target: targets, + }, + ); } fn url(&self, filename: &str) -> String { - format!("{}/{}/{}", - self.s3_address, - self.date, - filename) + format!("{}/{}/{}", self.s3_address, self.date, filename) } fn filename(&self, component: &str, target: &str) -> String { @@ -699,14 +733,14 @@ impl Builder { fn untar<F>(&self, component: &str, target: &str, dir: F) -> Option<String> where - F: FnOnce(String) -> String + F: FnOnce(String) -> String, { let mut cmd = Command::new("tar"); let filename = self.filename(component, target); cmd.arg("xf") - .arg(self.input.join(&filename)) - .arg(dir(filename.replace(".tar.gz", ""))) - .arg("-O"); + .arg(self.input.join(&filename)) + .arg(dir(filename.replace(".tar.gz", ""))) + .arg("-O"); let output = t!(cmd.output()); if output.status.success() { Some(String::from_utf8_lossy(&output.stdout).trim().to_string()) @@ -717,10 +751,11 @@ impl Builder { fn hash(&self, path: &Path) -> String { let sha = t!(Command::new("shasum") - .arg("-a").arg("256") - .arg(path.file_name().unwrap()) - .current_dir(path.parent().unwrap()) - .output()); + .arg("-a") + .arg("256") + .arg(path.file_name().unwrap()) + .current_dir(path.parent().unwrap()) + .output()); assert!(sha.status.success()); let filename = path.file_name().unwrap().to_str().unwrap(); @@ -744,11 +779,15 @@ impl Builder { .arg("--no-tty") .arg("--yes") .arg("--batch") - .arg("--passphrase-fd").arg("0") - .arg("--personal-digest-preferences").arg("SHA512") + .arg("--passphrase-fd") + .arg("0") + .arg("--personal-digest-preferences") + .arg("SHA512") .arg("--armor") - .arg("--output").arg(&asc) - .arg("--detach-sign").arg(path) + .arg("--output") + .arg(&asc) + .arg("--detach-sign") + .arg(path) .stdin(Stdio::piped()); let mut child = t!(cmd.spawn()); t!(child.stdin.take().unwrap().write_all(self.gpg_passphrase.as_bytes())); @@ -758,8 +797,11 @@ impl Builder { fn write_channel_files(&self, channel_name: &str, manifest: &Manifest) { self.write(&toml::to_string(&manifest).unwrap(), channel_name, ".toml"); self.write(&manifest.date, channel_name, "-date.txt"); - self.write(manifest.pkg["rust"].git_commit_hash.as_ref().unwrap(), - channel_name, "-git-commit-hash.txt"); + self.write( + manifest.pkg["rust"].git_commit_hash.as_ref().unwrap(), + channel_name, + "-git-commit-hash.txt", + ); } fn write(&self, contents: &str, channel_name: &str, suffix: &str) { diff --git a/src/tools/cargotest/main.rs b/src/tools/cargotest/main.rs index bdbc544d4f..cf00cb1ab8 100644 --- a/src/tools/cargotest/main.rs +++ b/src/tools/cargotest/main.rs @@ -1,9 +1,9 @@ #![deny(warnings)] use std::env; -use std::process::Command; -use std::path::{Path, PathBuf}; use std::fs; +use std::path::{Path, PathBuf}; +use std::process::Command; struct Test { repo: &'static str, @@ -93,11 +93,7 @@ fn clone_repo(test: &Test, out_dir: &Path) -> PathBuf { let out_dir = out_dir.join(test.name); if !out_dir.join(".git").is_dir() { - let status = Command::new("git") - .arg("init") - .arg(&out_dir) - .status() - .expect(""); + let status = Command::new("git").arg("init").arg(&out_dir).status().expect(""); assert!(status.success()); } @@ -106,23 +102,23 @@ fn clone_repo(test: &Test, out_dir: &Path) -> PathBuf { for depth in &[0, 1, 10, 100, 1000, 100000] { if *depth > 0 { let status = Command::new("git") - .arg("fetch") - .arg(test.repo) - .arg("master") - .arg(&format!("--depth={}", depth)) - .current_dir(&out_dir) - .status() - .expect(""); + .arg("fetch") + .arg(test.repo) + .arg("master") + .arg(&format!("--depth={}", depth)) + .current_dir(&out_dir) + .status() + .expect(""); assert!(status.success()); } let status = Command::new("git") - .arg("reset") - .arg(test.sha) - .arg("--hard") - .current_dir(&out_dir) - .status() - .expect(""); + .arg("reset") + .arg(test.sha) + .arg("--hard") + .current_dir(&out_dir) + .status() + .expect(""); if status.success() { found = true; @@ -133,12 +129,8 @@ fn clone_repo(test: &Test, out_dir: &Path) -> PathBuf { if !found { panic!("unable to find commit {}", test.sha) } - let status = Command::new("git") - .arg("clean") - .arg("-fdx") - .current_dir(&out_dir) - .status() - .unwrap(); + let status = + Command::new("git").arg("clean").arg("-fdx").current_dir(&out_dir).status().unwrap(); assert!(status.success()); out_dir diff --git a/src/tools/compiletest/Cargo.toml b/src/tools/compiletest/Cargo.toml index 80ef8dd662..a26c3a4aca 100644 --- a/src/tools/compiletest/Cargo.toml +++ b/src/tools/compiletest/Cargo.toml @@ -12,7 +12,7 @@ log = "0.4" regex = "1.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -rustfix = "0.4.1" +rustfix = "0.5.0" lazy_static = "1.0" walkdir = "2" diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs index 2358a065d6..9cc19060cb 100644 --- a/src/tools/compiletest/src/common.rs +++ b/src/tools/compiletest/src/common.rs @@ -5,8 +5,8 @@ use std::fmt; use std::path::{Path, PathBuf}; use std::str::FromStr; -use test::ColorConfig; use crate::util::PathBufExt; +use test::ColorConfig; #[derive(Clone, Copy, PartialEq, Debug)] pub enum Mode { @@ -14,10 +14,7 @@ pub enum Mode { RunFail, RunPassValgrind, Pretty, - DebugInfoCdb, - DebugInfoGdbLldb, - DebugInfoGdb, - DebugInfoLldb, + DebugInfo, Codegen, Rustdoc, CodegenUnits, @@ -32,13 +29,9 @@ pub enum Mode { impl Mode { pub fn disambiguator(self) -> &'static str { // Pretty-printing tests could run concurrently, and if they do, - // they need to keep their output segregated. Same is true for debuginfo tests that - // can be run on cdb, gdb, and lldb. + // they need to keep their output segregated. match self { Pretty => ".pretty", - DebugInfoCdb => ".cdb", - DebugInfoGdb => ".gdb", - DebugInfoLldb => ".lldb", _ => "", } } @@ -52,10 +45,7 @@ impl FromStr for Mode { "run-fail" => Ok(RunFail), "run-pass-valgrind" => Ok(RunPassValgrind), "pretty" => Ok(Pretty), - "debuginfo-cdb" => Ok(DebugInfoCdb), - "debuginfo-gdb+lldb" => Ok(DebugInfoGdbLldb), - "debuginfo-lldb" => Ok(DebugInfoLldb), - "debuginfo-gdb" => Ok(DebugInfoGdb), + "debuginfo" => Ok(DebugInfo), "codegen" => Ok(Codegen), "rustdoc" => Ok(Rustdoc), "codegen-units" => Ok(CodegenUnits), @@ -77,10 +67,7 @@ impl fmt::Display for Mode { RunFail => "run-fail", RunPassValgrind => "run-pass-valgrind", Pretty => "pretty", - DebugInfoCdb => "debuginfo-cdb", - DebugInfoGdbLldb => "debuginfo-gdb+lldb", - DebugInfoGdb => "debuginfo-gdb", - DebugInfoLldb => "debuginfo-lldb", + DebugInfo => "debuginfo", Codegen => "codegen", Rustdoc => "rustdoc", CodegenUnits => "codegen-units", @@ -100,7 +87,6 @@ pub enum PassMode { Check, Build, Run, - RunFail, } impl FromStr for PassMode { @@ -121,12 +107,18 @@ impl fmt::Display for PassMode { PassMode::Check => "check", PassMode::Build => "build", PassMode::Run => "run", - PassMode::RunFail => "run-fail", }; fmt::Display::fmt(s, f) } } +#[derive(Copy, Clone, Debug, PartialEq, PartialOrd)] +pub enum FailMode { + Check, + Build, + Run, +} + #[derive(Clone, Debug, PartialEq)] pub enum CompareMode { Nll, @@ -150,6 +142,29 @@ impl CompareMode { } } +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum Debugger { + Cdb, + Gdb, + Lldb, +} + +impl Debugger { + fn to_str(&self) -> &'static str { + match self { + Debugger::Cdb => "cdb", + Debugger::Gdb => "gdb", + Debugger::Lldb => "lldb", + } + } +} + +impl fmt::Display for Debugger { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self.to_str(), f) + } +} + /// Configuration for compiletest #[derive(Clone)] pub struct Config { @@ -203,6 +218,9 @@ pub struct Config { /// The test mode, compile-fail, run-fail, ui pub mode: Mode, + /// The debugger to use in debuginfo mode. Unset otherwise. + pub debugger: Option<Debugger>, + /// Run ignored tests pub run_ignored: bool, @@ -357,9 +375,11 @@ pub fn output_testname_unique( revision: Option<&str>, ) -> PathBuf { let mode = config.compare_mode.as_ref().map_or("", |m| m.to_str()); + let debugger = config.debugger.as_ref().map_or("", |m| m.to_str()); PathBuf::from(&testpaths.file.file_stem().unwrap()) .with_extra_extension(revision.unwrap_or("")) .with_extra_extension(mode) + .with_extra_extension(debugger) } /// Absolute path to the directory where all output for the given diff --git a/src/tools/compiletest/src/errors.rs b/src/tools/compiletest/src/errors.rs index 0ec2738181..c3d699b3e2 100644 --- a/src/tools/compiletest/src/errors.rs +++ b/src/tools/compiletest/src/errors.rs @@ -126,8 +126,7 @@ fn parse_expected( match (cfg, captures.name("cfgs")) { // Only error messages that contain our `cfg` betweeen the square brackets apply to us. - (Some(cfg), Some(filter)) if !filter.as_str().split(',').any(|s| s == cfg) - => return None, + (Some(cfg), Some(filter)) if !filter.as_str().split(',').any(|s| s == cfg) => return None, (Some(_), Some(_)) => {} (None, Some(_)) => panic!("Only tests with revisions should use `//[X]~`"), @@ -145,10 +144,7 @@ fn parse_expected( let whole_match = captures.get(0).unwrap(); let (_, mut msg) = line.split_at(whole_match.end()); - let first_word = msg - .split_whitespace() - .next() - .expect("Encountered unexpected empty comment"); + let first_word = msg.split_whitespace().next().expect("Encountered unexpected empty comment"); // If we find `//~ ERROR foo` or something like that, skip the first word. let kind = first_word.parse::<ErrorKind>().ok(); @@ -166,25 +162,18 @@ fn parse_expected( ); (FollowPrevious(line_num), line_num) } else { - let which = if adjusts > 0 { - AdjustBackward(adjusts) - } else { - ThisLine - }; + let which = if adjusts > 0 { AdjustBackward(adjusts) } else { ThisLine }; let line_num = line_num - adjusts; (which, line_num) }; debug!( "line={} tag={:?} which={:?} kind={:?} msg={:?}", - line_num, whole_match.as_str(), which, kind, msg - ); - Some(( + line_num, + whole_match.as_str(), which, - Error { - line_num, - kind, - msg, - }, - )) + kind, + msg + ); + Some((which, Error { line_num, kind, msg })) } diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index 46cce6394e..34f9ac037b 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -6,52 +6,13 @@ use std::path::{Path, PathBuf}; use log::*; -use crate::common::{self, CompareMode, Config, Mode, PassMode}; -use crate::util; +use crate::common::{CompareMode, Config, Debugger, FailMode, Mode, PassMode}; use crate::extract_gdb_version; +use crate::util; #[cfg(test)] mod tests; -/// Whether to ignore the test. -#[derive(Clone, Copy, PartialEq, Debug)] -pub enum Ignore { - /// Runs it. - Run, - /// Ignore it totally. - Ignore, - /// Ignore only the gdb test, but run the lldb test. - IgnoreGdb, - /// Ignore only the lldb test, but run the gdb test. - IgnoreLldb, -} - -impl Ignore { - pub fn can_run_gdb(&self) -> bool { - *self == Ignore::Run || *self == Ignore::IgnoreLldb - } - - pub fn can_run_lldb(&self) -> bool { - *self == Ignore::Run || *self == Ignore::IgnoreGdb - } - - pub fn no_gdb(&self) -> Ignore { - match *self { - Ignore::Run => Ignore::IgnoreGdb, - Ignore::IgnoreGdb => Ignore::IgnoreGdb, - _ => Ignore::Ignore, - } - } - - pub fn no_lldb(&self) -> Ignore { - match *self { - Ignore::Run => Ignore::IgnoreLldb, - Ignore::IgnoreLldb => Ignore::IgnoreLldb, - _ => Ignore::Ignore, - } - } -} - /// The result of parse_cfg_name_directive. #[derive(Clone, Copy, PartialEq, Debug)] enum ParsedNameDirective { @@ -59,16 +20,12 @@ enum ParsedNameDirective { NoMatch, /// Match. Match, - /// Mode was DebugInfoGdbLldb and this matched gdb. - MatchGdb, - /// Mode was DebugInfoGdbLldb and this matched lldb. - MatchLldb, } /// Properties which must be known very early, before actually running /// the test. pub struct EarlyProps { - pub ignore: Ignore, + pub ignore: bool, pub should_fail: bool, pub aux: Vec<String>, pub aux_crate: Vec<(String, String)>, @@ -78,81 +35,61 @@ pub struct EarlyProps { impl EarlyProps { pub fn from_file(config: &Config, testfile: &Path) -> Self { let mut props = EarlyProps { - ignore: Ignore::Run, + ignore: false, should_fail: false, aux: Vec::new(), aux_crate: Vec::new(), revisions: vec![], }; - if config.mode == common::DebugInfoGdbLldb { - if config.lldb_python_dir.is_none() { - props.ignore = props.ignore.no_lldb(); - } - if config.gdb_version.is_none() { - props.ignore = props.ignore.no_gdb(); - } - } else if config.mode == common::DebugInfoCdb { - if config.cdb.is_none() { - props.ignore = Ignore::Ignore; - } - } - let rustc_has_profiler_support = env::var_os("RUSTC_PROFILER_SUPPORT").is_some(); let rustc_has_sanitizer_support = env::var_os("RUSTC_SANITIZER_SUPPORT").is_some(); iter_header(testfile, None, &mut |ln| { // we should check if any only-<platform> exists and if it exists // and does not matches the current platform, skip the test - if props.ignore != Ignore::Ignore { + if !props.ignore { props.ignore = match config.parse_cfg_name_directive(ln, "ignore") { - ParsedNameDirective::Match => Ignore::Ignore, + ParsedNameDirective::Match => true, ParsedNameDirective::NoMatch => props.ignore, - ParsedNameDirective::MatchGdb => props.ignore.no_gdb(), - ParsedNameDirective::MatchLldb => props.ignore.no_lldb(), }; if config.has_cfg_prefix(ln, "only") { props.ignore = match config.parse_cfg_name_directive(ln, "only") { ParsedNameDirective::Match => props.ignore, - ParsedNameDirective::NoMatch => Ignore::Ignore, - ParsedNameDirective::MatchLldb => props.ignore.no_gdb(), - ParsedNameDirective::MatchGdb => props.ignore.no_lldb(), + ParsedNameDirective::NoMatch => true, }; } if ignore_llvm(config, ln) { - props.ignore = Ignore::Ignore; + props.ignore = true; } - if config.run_clang_based_tests_with.is_none() && - config.parse_needs_matching_clang(ln) { - props.ignore = Ignore::Ignore; + if config.run_clang_based_tests_with.is_none() + && config.parse_needs_matching_clang(ln) + { + props.ignore = true; } - if !rustc_has_profiler_support && - config.parse_needs_profiler_support(ln) { - props.ignore = Ignore::Ignore; + if !rustc_has_profiler_support && config.parse_needs_profiler_support(ln) { + props.ignore = true; } - if !rustc_has_sanitizer_support && - config.parse_needs_sanitizer_support(ln) { - props.ignore = Ignore::Ignore; + if !rustc_has_sanitizer_support && config.parse_needs_sanitizer_support(ln) { + props.ignore = true; } if config.target == "wasm32-unknown-unknown" && config.parse_check_run_results(ln) { - props.ignore = Ignore::Ignore; + props.ignore = true; } - } - if (config.mode == common::DebugInfoGdb || config.mode == common::DebugInfoGdbLldb) && - props.ignore.can_run_gdb() && ignore_gdb(config, ln) { - props.ignore = props.ignore.no_gdb(); - } + if config.debugger == Some(Debugger::Gdb) && ignore_gdb(config, ln) { + props.ignore = true; + } - if (config.mode == common::DebugInfoLldb || config.mode == common::DebugInfoGdbLldb) && - props.ignore.can_run_lldb() && ignore_lldb(config, ln) { - props.ignore = props.ignore.no_lldb(); + if config.debugger == Some(Debugger::Lldb) && ignore_lldb(config, ln) { + props.ignore = true; + } } if let Some(s) = config.parse_aux_build(ln) { @@ -207,12 +144,13 @@ impl EarlyProps { fn extract_gdb_version_range(line: &str) -> (u32, u32) { const ERROR_MESSAGE: &'static str = "Malformed GDB version directive"; - let range_components = line.split(&[' ', '-'][..]) - .filter(|word| !word.is_empty()) - .map(extract_gdb_version) - .skip_while(Option::is_none) - .take(3) // 3 or more = invalid, so take at most 3. - .collect::<Vec<Option<u32>>>(); + let range_components = line + .split(&[' ', '-'][..]) + .filter(|word| !word.is_empty()) + .map(extract_gdb_version) + .skip_while(Option::is_none) + .take(3) // 3 or more = invalid, so take at most 3. + .collect::<Vec<Option<u32>>>(); match range_components.len() { 1 => { @@ -231,7 +169,8 @@ impl EarlyProps { fn ignore_lldb(config: &Config, line: &str) -> bool { if let Some(ref actual_version) = config.lldb_version { if line.starts_with("min-lldb-version") { - let min_version = line.trim_end() + let min_version = line + .trim_end() .rsplit(' ') .next() .expect("Malformed lldb version directive"); @@ -254,7 +193,8 @@ impl EarlyProps { } if let Some(ref actual_version) = config.llvm_version { if line.starts_with("min-llvm-version") { - let min_version = line.trim_end() + let min_version = line + .trim_end() .rsplit(' ') .next() .expect("Malformed llvm version directive"); @@ -262,7 +202,8 @@ impl EarlyProps { // version &actual_version[..] < min_version } else if line.starts_with("min-system-llvm-version") { - let min_version = line.trim_end() + let min_version = line + .trim_end() .rsplit(' ') .next() .expect("Malformed llvm version directive"); @@ -271,16 +212,15 @@ impl EarlyProps { config.system_llvm && &actual_version[..] < min_version } else if line.starts_with("ignore-llvm-version") { // Syntax is: "ignore-llvm-version <version1> [- <version2>]" - let range_components = line.split(' ') + let range_components = line + .split(' ') .skip(1) // Skip the directive. .map(|s| s.trim()) .filter(|word| !word.is_empty() && word != &"-") .take(3) // 3 or more = invalid, so take at most 3. .collect::<Vec<&str>>(); match range_components.len() { - 1 => { - &actual_version[..] == range_components[0] - } + 1 => &actual_version[..] == range_components[0], 2 => { let v_min = range_components[0]; let v_max = range_components[1]; @@ -366,10 +306,10 @@ pub struct TestProps { pass_mode: Option<PassMode>, // Ignore `--pass` overrides from the command line for this test. ignore_pass: bool, + // How far this test should proceed to start failing. + pub fail_mode: Option<FailMode>, // rustdoc will test the output of the `--test` option pub check_test_line_numbers_match: bool, - // Do not pass `-Z ui-testing` to UI tests - pub disable_ui_testing_normalization: bool, // customized normalization rules pub normalize_stdout: Vec<(String, String)>, pub normalize_stderr: Vec<(String, String)>, @@ -411,9 +351,9 @@ impl TestProps { forbid_output: vec![], incremental_dir: None, pass_mode: None, + fail_mode: None, ignore_pass: false, check_test_line_numbers_match: false, - disable_ui_testing_normalization: false, normalize_stdout: vec![], normalize_stderr: vec![], failure_status: -1, @@ -437,6 +377,13 @@ impl TestProps { pub fn from_file(testfile: &Path, cfg: Option<&str>, config: &Config) -> Self { let mut props = TestProps::new(); props.load_from(testfile, cfg, config); + + match (props.pass_mode, props.fail_mode) { + (None, None) => props.fail_mode = Some(FailMode::Check), + (Some(_), None) | (None, Some(_)) => {} + (Some(_), Some(_)) => panic!("cannot use a *-fail and *-pass mode together"), + } + props } @@ -451,8 +398,7 @@ impl TestProps { } if let Some(flags) = config.parse_compile_flags(ln) { - self.compile_flags - .extend(flags.split_whitespace().map(|s| s.to_owned())); + self.compile_flags.extend(flags.split_whitespace().map(|s| s.to_owned())); } if let Some(edition) = config.parse_edition(ln) { @@ -548,16 +494,12 @@ impl TestProps { } self.update_pass_mode(ln, cfg, config); + self.update_fail_mode(ln, config); if !self.ignore_pass { self.ignore_pass = config.parse_ignore_pass(ln); } - if !self.disable_ui_testing_normalization { - self.disable_ui_testing_normalization = - config.parse_disable_ui_testing_normalization(ln); - } - if let Some(rule) = config.parse_custom_normalization(ln, "normalize-stdout") { self.normalize_stdout.push(rule); } @@ -602,14 +544,40 @@ impl TestProps { } } + fn update_fail_mode(&mut self, ln: &str, config: &Config) { + let check_ui = |mode: &str| { + if config.mode != Mode::Ui { + panic!("`{}-fail` header is only supported in UI tests", mode); + } + }; + let fail_mode = if config.parse_name_directive(ln, "check-fail") { + check_ui("check"); + Some(FailMode::Check) + } else if config.parse_name_directive(ln, "build-fail") { + check_ui("build"); + Some(FailMode::Build) + } else if config.parse_name_directive(ln, "run-fail") { + check_ui("run"); + Some(FailMode::Run) + } else { + None + }; + match (self.fail_mode, fail_mode) { + (None, Some(_)) => self.fail_mode = fail_mode, + (Some(_), Some(_)) => panic!("multiple `*-fail` headers in a single test"), + (_, None) => {} + } + } + fn update_pass_mode(&mut self, ln: &str, revision: Option<&str>, config: &Config) { let check_no_run = |s| { if config.mode != Mode::Ui && config.mode != Mode::Incremental { panic!("`{}` header is only supported in UI and incremental tests", s); } - if config.mode == Mode::Incremental && - !revision.map_or(false, |r| r.starts_with("cfail")) && - !self.revisions.iter().all(|r| r.starts_with("cfail")) { + if config.mode == Mode::Incremental + && !revision.map_or(false, |r| r.starts_with("cfail")) + && !self.revisions.iter().all(|r| r.starts_with("cfail")) + { panic!("`{}` header is only supported in `cfail` incremental tests", s); } }; @@ -624,11 +592,6 @@ impl TestProps { panic!("`run-pass` header is only supported in UI tests") } Some(PassMode::Run) - } else if config.parse_name_directive(ln, "run-fail") { - if config.mode != Mode::Ui { - panic!("`run-fail` header is only supported in UI tests") - } - Some(PassMode::RunFail) } else { None }; @@ -640,7 +603,7 @@ impl TestProps { } pub fn pass_mode(&self, config: &Config) -> Option<PassMode> { - if !self.ignore_pass { + if !self.ignore_pass && self.fail_mode.is_none() && config.mode == Mode::Ui { if let (mode @ Some(_), Some(_)) = (config.force_pass_mode, self.pass_mode) { return mode; } @@ -659,11 +622,7 @@ fn iter_header(testfile: &Path, cfg: Option<&str>, it: &mut dyn FnMut(&str)) { return; } - let comment = if testfile.to_string_lossy().ends_with(".rs") { - "//" - } else { - "#" - }; + let comment = if testfile.to_string_lossy().ends_with(".rs") { "//" } else { "#" }; // FIXME: would be nice to allow some whitespace between comment and brace :) // It took me like 2 days to debug why compile-flags weren’t taken into account for my test :) @@ -682,7 +641,7 @@ fn iter_header(testfile: &Path, cfg: Option<&str>, it: &mut dyn FnMut(&str)) { // A comment like `//[foo]` is specific to revision `foo` if let Some(close_brace) = ln.find(']') { let open_brace = ln.find('[').unwrap(); - let lncfg = &ln[open_brace + 1 .. close_brace]; + let lncfg = &ln[open_brace + 1..close_brace]; let matches = match cfg { Some(s) => s == &lncfg[..], None => false, @@ -691,11 +650,13 @@ fn iter_header(testfile: &Path, cfg: Option<&str>, it: &mut dyn FnMut(&str)) { it(ln[(close_brace + 1)..].trim_start()); } } else { - panic!("malformed condition directive: expected `{}foo]`, found `{}`", - comment_with_brace, ln) + panic!( + "malformed condition directive: expected `{}foo]`, found `{}`", + comment_with_brace, ln + ) } } else if ln.starts_with(comment) { - it(ln[comment.len() ..].trim_start()); + it(ln[comment.len()..].trim_start()); } } return; @@ -714,8 +675,7 @@ impl Config { } fn parse_aux_build(&self, line: &str) -> Option<String> { - self.parse_name_value_directive(line, "aux-build") - .map(|r| r.trim().to_string()) + self.parse_name_value_directive(line, "aux-build").map(|r| r.trim().to_string()) } fn parse_aux_crate(&self, line: &str) -> Option<(String, String)> { @@ -792,10 +752,6 @@ impl Config { } } - fn parse_disable_ui_testing_normalization(&self, line: &str) -> bool { - self.parse_name_directive(line, "disable-ui-testing-normalization") - } - fn parse_check_test_line_numbers_match(&self, line: &str) -> bool { self.parse_name_directive(line, "check-test-line-numbers-match") } @@ -805,8 +761,7 @@ impl Config { } fn parse_assembly_output(&self, line: &str) -> Option<String> { - self.parse_name_value_directive(line, "assembly-output") - .map(|r| r.trim().to_string()) + self.parse_name_value_directive(line, "assembly-output").map(|r| r.trim().to_string()) } fn parse_env(&self, line: &str, name: &str) -> Option<(String, String)> { @@ -860,63 +815,37 @@ impl Config { /// Parses a name-value directive which contains config-specific information, e.g., `ignore-x86` /// or `normalize-stderr-32bit`. fn parse_cfg_name_directive(&self, line: &str, prefix: &str) -> ParsedNameDirective { - if line.starts_with(prefix) && line.as_bytes().get(prefix.len()) == Some(&b'-') { - let name = line[prefix.len() + 1..] - .split(&[':', ' '][..]) - .next() - .unwrap(); - - if name == "test" || - util::matches_os(&self.target, name) || // target - util::matches_env(&self.target, name) || // env - name == util::get_arch(&self.target) || // architecture - name == util::get_pointer_width(&self.target) || // pointer width - name == self.stage_id.split('-').next().unwrap() || // stage - (self.target != self.host && name == "cross-compile") || - match self.compare_mode { - Some(CompareMode::Nll) => name == "compare-mode-nll", - Some(CompareMode::Polonius) => name == "compare-mode-polonius", - None => false, - } || - (cfg!(debug_assertions) && name == "debug") { - ParsedNameDirective::Match - } else { - match self.mode { - common::DebugInfoGdbLldb => { - if name == "gdb" { - ParsedNameDirective::MatchGdb - } else if name == "lldb" { - ParsedNameDirective::MatchLldb - } else { - ParsedNameDirective::NoMatch - } - }, - common::DebugInfoCdb => if name == "cdb" { - ParsedNameDirective::Match - } else { - ParsedNameDirective::NoMatch - }, - common::DebugInfoGdb => if name == "gdb" { - ParsedNameDirective::Match - } else { - ParsedNameDirective::NoMatch - }, - common::DebugInfoLldb => if name == "lldb" { - ParsedNameDirective::Match - } else { - ParsedNameDirective::NoMatch - }, - common::Pretty => if name == "pretty" { - ParsedNameDirective::Match - } else { - ParsedNameDirective::NoMatch - }, - _ => ParsedNameDirective::NoMatch, - } - } - } else { - ParsedNameDirective::NoMatch + if !line.as_bytes().starts_with(prefix.as_bytes()) { + return ParsedNameDirective::NoMatch; + } + if line.as_bytes().get(prefix.len()) != Some(&b'-') { + return ParsedNameDirective::NoMatch; } + + let name = line[prefix.len() + 1..].split(&[':', ' '][..]).next().unwrap(); + + let is_match = name == "test" || + &self.target == name || // triple + util::matches_os(&self.target, name) || // target + util::matches_env(&self.target, name) || // env + name == util::get_arch(&self.target) || // architecture + name == util::get_pointer_width(&self.target) || // pointer width + name == self.stage_id.split('-').next().unwrap() || // stage + (self.target != self.host && name == "cross-compile") || + match self.compare_mode { + Some(CompareMode::Nll) => name == "compare-mode-nll", + Some(CompareMode::Polonius) => name == "compare-mode-polonius", + None => false, + } || + (cfg!(debug_assertions) && name == "debug") || + match self.debugger { + Some(Debugger::Cdb) => name == "cdb", + Some(Debugger::Gdb) => name == "gdb", + Some(Debugger::Lldb) => name == "lldb", + None => false, + }; + + if is_match { ParsedNameDirective::Match } else { ParsedNameDirective::NoMatch } } fn has_cfg_prefix(&self, line: &str, prefix: &str) -> bool { @@ -929,10 +858,11 @@ impl Config { fn parse_name_directive(&self, line: &str, directive: &str) -> bool { // Ensure the directive is a whole word. Do not match "ignore-x86" when // the line says "ignore-x86_64". - line.starts_with(directive) && match line.as_bytes().get(directive.len()) { - None | Some(&b' ') | Some(&b':') => true, - _ => false, - } + line.starts_with(directive) + && match line.as_bytes().get(directive.len()) { + None | Some(&b' ') | Some(&b':') => true, + _ => false, + } } pub fn parse_name_value_directive(&self, line: &str, directive: &str) -> Option<String> { @@ -973,10 +903,8 @@ impl Config { } pub fn lldb_version_to_int(version_string: &str) -> isize { - let error_string = format!( - "Encountered LLDB version string with unexpected format: {}", - version_string - ); + let error_string = + format!("Encountered LLDB version string with unexpected format: {}", version_string); version_string.parse().expect(&error_string) } diff --git a/src/tools/compiletest/src/json.rs b/src/tools/compiletest/src/json.rs index 7930d1249e..52d0cbd4bf 100644 --- a/src/tools/compiletest/src/json.rs +++ b/src/tools/compiletest/src/json.rs @@ -95,10 +95,7 @@ pub fn extract_rendered(output: &str) -> String { } pub fn parse_output(file_name: &str, output: &str, proc_res: &ProcRes) -> Vec<Error> { - output - .lines() - .flat_map(|line| parse_line(file_name, line, output, proc_res)) - .collect() + output.lines().flat_map(|line| parse_line(file_name, line, output, proc_res)).collect() } fn parse_line(file_name: &str, line: &str, output: &str, proc_res: &ProcRes) -> Vec<Error> { @@ -138,11 +135,10 @@ fn push_expected_errors( .filter(|(_, span)| Path::new(&span.file_name) == Path::new(&file_name)) .collect(); - let spans_in_this_file: Vec<_> = spans_info_in_this_file.iter() - .map(|(_, span)| span) - .collect(); + let spans_in_this_file: Vec<_> = spans_info_in_this_file.iter().map(|(_, span)| span).collect(); - let primary_spans: Vec<_> = spans_info_in_this_file.iter() + let primary_spans: Vec<_> = spans_info_in_this_file + .iter() .filter(|(is_primary, _)| *is_primary) .map(|(_, span)| span) .take(1) // sometimes we have more than one showing up in the json; pick first @@ -166,24 +162,33 @@ fn push_expected_errors( let with_code = |span: &DiagnosticSpan, text: &str| { match diagnostic.code { Some(ref code) => - // FIXME(#33000) -- it'd be better to use a dedicated - // UI harness than to include the line/col number like - // this, but some current tests rely on it. - // - // Note: Do NOT include the filename. These can easily - // cause false matches where the expected message - // appears in the filename, and hence the message - // changes but the test still passes. - format!("{}:{}: {}:{}: {} [{}]", - span.line_start, span.column_start, - span.line_end, span.column_end, - text, code.code.clone()), + // FIXME(#33000) -- it'd be better to use a dedicated + // UI harness than to include the line/col number like + // this, but some current tests rely on it. + // + // Note: Do NOT include the filename. These can easily + // cause false matches where the expected message + // appears in the filename, and hence the message + // changes but the test still passes. + { + format!( + "{}:{}: {}:{}: {} [{}]", + span.line_start, + span.column_start, + span.line_end, + span.column_end, + text, + code.code.clone() + ) + } None => - // FIXME(#33000) -- it'd be better to use a dedicated UI harness - format!("{}:{}: {}:{}: {}", - span.line_start, span.column_start, - span.line_end, span.column_end, - text), + // FIXME(#33000) -- it'd be better to use a dedicated UI harness + { + format!( + "{}:{}: {}:{}: {}", + span.line_start, span.column_start, span.line_end, span.column_end, text + ) + } } }; @@ -195,11 +200,7 @@ fn push_expected_errors( for span in primary_spans { let msg = with_code(span, first_line); let kind = ErrorKind::from_str(&diagnostic.level).ok(); - expected_errors.push(Error { - line_num: span.line_start, - kind, - msg, - }); + expected_errors.push(Error { line_num: span.line_start, kind, msg }); } } for next_line in message_lines { @@ -233,10 +234,7 @@ fn push_expected_errors( } // Add notes for any labels that appear in the message. - for span in spans_in_this_file - .iter() - .filter(|span| span.label.is_some()) - { + for span in spans_in_this_file.iter().filter(|span| span.label.is_some()) { expected_errors.push(Error { line_num: span.line_start, kind: Some(ErrorKind::Note), diff --git a/src/tools/compiletest/src/main.rs b/src/tools/compiletest/src/main.rs index 15f8abd75d..5f8aa01f4f 100644 --- a/src/tools/compiletest/src/main.rs +++ b/src/tools/compiletest/src/main.rs @@ -1,15 +1,19 @@ #![crate_name = "compiletest"] -#![feature(test)] #![feature(vec_remove_item)] #![deny(warnings)] +// The `test` crate is the only unstable feature +// allowed here, just to share similar code. +#![feature(test)] extern crate test; -use crate::common::{CompareMode, PassMode}; use crate::common::{expected_output_path, output_base_dir, output_relative_path, UI_EXTENSIONS}; -use crate::common::{Config, TestPaths}; -use crate::common::{DebugInfoCdb, DebugInfoGdbLldb, DebugInfoGdb, DebugInfoLldb, Mode, Pretty}; +use crate::common::{CompareMode, Config, Debugger, Mode, PassMode, Pretty, TestPaths}; +use crate::util::logv; +use env_logger; +use getopts; use getopts::Options; +use log::*; use std::env; use std::ffi::OsString; use std::fs; @@ -18,13 +22,9 @@ use std::path::{Path, PathBuf}; use std::process::Command; use std::time::SystemTime; use test::ColorConfig; -use crate::util::logv; use walkdir::WalkDir; -use env_logger; -use getopts; -use log::*; -use self::header::{EarlyProps, Ignore}; +use self::header::EarlyProps; #[cfg(test)] mod tests; @@ -48,82 +48,24 @@ fn main() { } log_config(&config); - run_tests(&config); + run_tests(config); } pub fn parse_config(args: Vec<String>) -> Config { let mut opts = Options::new(); - opts.reqopt( - "", - "compile-lib-path", - "path to host shared libraries", - "PATH", - ).reqopt( - "", - "run-lib-path", - "path to target shared libraries", - "PATH", - ) - .reqopt( - "", - "rustc-path", - "path to rustc to use for compiling", - "PATH", - ) - .optopt( - "", - "rustdoc-path", - "path to rustdoc to use for compiling", - "PATH", - ) - .reqopt( - "", - "lldb-python", - "path to python to use for doc tests", - "PATH", - ) - .reqopt( - "", - "docck-python", - "path to python to use for doc tests", - "PATH", - ) - .optopt( - "", - "valgrind-path", - "path to Valgrind executable for Valgrind tests", - "PROGRAM", - ) - .optflag( - "", - "force-valgrind", - "fail if Valgrind tests cannot be run under Valgrind", - ) - .optopt( - "", - "run-clang-based-tests-with", - "path to Clang executable", - "PATH", - ) - .optopt( - "", - "llvm-filecheck", - "path to LLVM's FileCheck binary", - "DIR", - ) + opts.reqopt("", "compile-lib-path", "path to host shared libraries", "PATH") + .reqopt("", "run-lib-path", "path to target shared libraries", "PATH") + .reqopt("", "rustc-path", "path to rustc to use for compiling", "PATH") + .optopt("", "rustdoc-path", "path to rustdoc to use for compiling", "PATH") + .reqopt("", "lldb-python", "path to python to use for doc tests", "PATH") + .reqopt("", "docck-python", "path to python to use for doc tests", "PATH") + .optopt("", "valgrind-path", "path to Valgrind executable for Valgrind tests", "PROGRAM") + .optflag("", "force-valgrind", "fail if Valgrind tests cannot be run under Valgrind") + .optopt("", "run-clang-based-tests-with", "path to Clang executable", "PATH") + .optopt("", "llvm-filecheck", "path to LLVM's FileCheck binary", "DIR") .reqopt("", "src-base", "directory to scan for test files", "PATH") - .reqopt( - "", - "build-base", - "directory to deposit test outputs", - "PATH", - ) - .reqopt( - "", - "stage-id", - "the target-stage identifier", - "stageN-TARGET", - ) + .reqopt("", "build-base", "directory to deposit test outputs", "PATH") + .reqopt("", "stage-id", "the target-stage identifier", "stageN-TARGET") .reqopt( "", "mode", @@ -134,7 +76,7 @@ pub fn parse_config(args: Vec<String>) -> Config { "", "pass", "force {check,build,run}-pass tests to this mode.", - "check | build | run" + "check | build | run", ) .optflag("", "ignored", "run tests marked as ignored") .optflag("", "exact", "filters match exactly") @@ -145,97 +87,38 @@ pub fn parse_config(args: Vec<String>) -> Config { (eg. emulator, valgrind)", "PROGRAM", ) - .optopt( - "", - "host-rustcflags", - "flags to pass to rustc for host", - "FLAGS", - ) - .optopt( - "", - "target-rustcflags", - "flags to pass to rustc for target", - "FLAGS", - ) + .optopt("", "host-rustcflags", "flags to pass to rustc for host", "FLAGS") + .optopt("", "target-rustcflags", "flags to pass to rustc for target", "FLAGS") .optflag("", "verbose", "run tests verbosely, showing all output") .optflag( "", "bless", "overwrite stderr/stdout files instead of complaining about a mismatch", ) - .optflag( - "", - "quiet", - "print one character per test instead of one line", - ) + .optflag("", "quiet", "print one character per test instead of one line") .optopt("", "color", "coloring: auto, always, never", "WHEN") .optopt("", "logfile", "file to log test execution to", "FILE") .optopt("", "target", "the target to build for", "TARGET") .optopt("", "host", "the host to build for", "HOST") - .optopt( - "", - "cdb", - "path to CDB to use for CDB debuginfo tests", - "PATH", - ) - .optopt( - "", - "gdb", - "path to GDB to use for GDB debuginfo tests", - "PATH", - ) - .optopt( - "", - "lldb-version", - "the version of LLDB used", - "VERSION STRING", - ) - .optopt( - "", - "llvm-version", - "the version of LLVM used", - "VERSION STRING", - ) + .optopt("", "cdb", "path to CDB to use for CDB debuginfo tests", "PATH") + .optopt("", "gdb", "path to GDB to use for GDB debuginfo tests", "PATH") + .optopt("", "lldb-version", "the version of LLDB used", "VERSION STRING") + .optopt("", "llvm-version", "the version of LLVM used", "VERSION STRING") .optflag("", "system-llvm", "is LLVM the system LLVM") - .optopt( - "", - "android-cross-path", - "Android NDK standalone path", - "PATH", - ) + .optopt("", "android-cross-path", "Android NDK standalone path", "PATH") .optopt("", "adb-path", "path to the android debugger", "PATH") - .optopt( - "", - "adb-test-dir", - "path to tests for the android debugger", - "PATH", - ) - .optopt( - "", - "lldb-python-dir", - "directory containing LLDB's python module", - "PATH", - ) + .optopt("", "adb-test-dir", "path to tests for the android debugger", "PATH") + .optopt("", "lldb-python-dir", "directory containing LLDB's python module", "PATH") .reqopt("", "cc", "path to a C compiler", "PATH") .reqopt("", "cxx", "path to a C++ compiler", "PATH") .reqopt("", "cflags", "flags for the C compiler", "FLAGS") .optopt("", "ar", "path to an archiver", "PATH") .optopt("", "linker", "path to a linker", "PATH") - .reqopt( - "", - "llvm-components", - "list of LLVM components built in", - "LIST", - ) + .reqopt("", "llvm-components", "list of LLVM components built in", "LIST") .reqopt("", "llvm-cxxflags", "C++ flags for LLVM", "FLAGS") .optopt("", "llvm-bin-dir", "Path to LLVM's `bin` directory", "PATH") .optopt("", "nodejs", "the name of nodejs", "PATH") - .optopt( - "", - "remote-test-client", - "path to the remote test client", - "PATH", - ) + .optopt("", "remote-test-client", "path to the remote test client", "PATH") .optopt( "", "compare-mode", @@ -278,28 +161,21 @@ pub fn parse_config(args: Vec<String>) -> Config { } fn make_absolute(path: PathBuf) -> PathBuf { - if path.is_relative() { - env::current_dir().unwrap().join(path) - } else { - path - } + if path.is_relative() { env::current_dir().unwrap().join(path) } else { path } } let target = opt_str2(matches.opt_str("target")); let android_cross_path = opt_path(matches, "android-cross-path"); let cdb = analyze_cdb(matches.opt_str("cdb"), &target); - let (gdb, gdb_version, gdb_native_rust) = analyze_gdb(matches.opt_str("gdb"), &target, - &android_cross_path); + let (gdb, gdb_version, gdb_native_rust) = + analyze_gdb(matches.opt_str("gdb"), &target, &android_cross_path); let (lldb_version, lldb_native_rust) = extract_lldb_version(matches.opt_str("lldb-version")); let color = match matches.opt_str("color").as_ref().map(|x| &**x) { Some("auto") | None => ColorConfig::AutoColor, Some("always") => ColorConfig::AlwaysColor, Some("never") => ColorConfig::NeverColor, - Some(x) => panic!( - "argument for --color must be auto, always, or never, but found `{}`", - x - ), + Some(x) => panic!("argument for --color must be auto, always, or never, but found `{}`", x), }; let src_base = opt_path(matches, "src-base"); @@ -320,18 +196,15 @@ pub fn parse_config(args: Vec<String>) -> Config { src_base, build_base: opt_path(matches, "build-base"), stage_id: matches.opt_str("stage-id").unwrap(), - mode: matches - .opt_str("mode") - .unwrap() - .parse() - .expect("invalid mode"), + mode: matches.opt_str("mode").unwrap().parse().expect("invalid mode"), + debugger: None, run_ignored, filter: matches.free.first().cloned(), filter_exact: matches.opt_present("exact"), - force_pass_mode: matches.opt_str("pass").map(|mode| + force_pass_mode: matches.opt_str("pass").map(|mode| { mode.parse::<PassMode>() .unwrap_or_else(|_| panic!("unknown `--pass` option `{}` given", mode)) - ), + }), logfile: matches.opt_str("logfile").map(|s| PathBuf::from(&s)), runtool: matches.opt_str("runtool"), host_rustcflags: matches.opt_str("host-rustcflags"), @@ -374,10 +247,7 @@ pub fn parse_config(args: Vec<String>) -> Config { pub fn log_config(config: &Config) { let c = config; logv(c, "configuration:".to_string()); - logv( - c, - format!("compile_lib_path: {:?}", config.compile_lib_path), - ); + logv(c, format!("compile_lib_path: {:?}", config.compile_lib_path)); logv(c, format!("run_lib_path: {:?}", config.run_lib_path)); logv(c, format!("rustc_path: {:?}", config.rustc_path.display())); logv(c, format!("rustdoc_path: {:?}", config.rustdoc_path)); @@ -386,42 +256,21 @@ pub fn log_config(config: &Config) { logv(c, format!("stage_id: {}", config.stage_id)); logv(c, format!("mode: {}", config.mode)); logv(c, format!("run_ignored: {}", config.run_ignored)); - logv( - c, - format!( - "filter: {}", - opt_str(&config.filter.as_ref().map(|re| re.to_owned())) - ), - ); + logv(c, format!("filter: {}", opt_str(&config.filter.as_ref().map(|re| re.to_owned())))); logv(c, format!("filter_exact: {}", config.filter_exact)); - logv(c, format!( - "force_pass_mode: {}", - opt_str(&config.force_pass_mode.map(|m| format!("{}", m))), - )); - logv(c, format!("runtool: {}", opt_str(&config.runtool))); - logv( - c, - format!("host-rustcflags: {}", opt_str(&config.host_rustcflags)), - ); logv( c, - format!("target-rustcflags: {}", opt_str(&config.target_rustcflags)), + format!("force_pass_mode: {}", opt_str(&config.force_pass_mode.map(|m| format!("{}", m))),), ); + logv(c, format!("runtool: {}", opt_str(&config.runtool))); + logv(c, format!("host-rustcflags: {}", opt_str(&config.host_rustcflags))); + logv(c, format!("target-rustcflags: {}", opt_str(&config.target_rustcflags))); logv(c, format!("target: {}", config.target)); logv(c, format!("host: {}", config.host)); - logv( - c, - format!( - "android-cross-path: {:?}", - config.android_cross_path.display() - ), - ); + logv(c, format!("android-cross-path: {:?}", config.android_cross_path.display())); logv(c, format!("adb_path: {:?}", config.adb_path)); logv(c, format!("adb_test_dir: {:?}", config.adb_test_dir)); - logv( - c, - format!("adb_device_status: {}", config.adb_device_status), - ); + logv(c, format!("adb_device_status: {}", config.adb_device_status)); logv(c, format!("ar: {}", config.ar)); logv(c, format!("linker: {:?}", config.linker)); logv(c, format!("verbose: {}", config.verbose)); @@ -443,61 +292,7 @@ pub fn opt_str2(maybestr: Option<String>) -> String { } } -pub fn run_tests(config: &Config) { - if config.target.contains("android") { - if config.mode == DebugInfoGdb || config.mode == DebugInfoGdbLldb { - println!( - "{} debug-info test uses tcp 5039 port.\ - please reserve it", - config.target - ); - - // android debug-info test uses remote debugger so, we test 1 thread - // at once as they're all sharing the same TCP port to communicate - // over. - // - // we should figure out how to lift this restriction! (run them all - // on different ports allocated dynamically). - env::set_var("RUST_TEST_THREADS", "1"); - } - } - - match config.mode { - // Note that we don't need to emit the gdb warning when - // DebugInfoGdbLldb, so it is ok to list that here. - DebugInfoGdbLldb | DebugInfoLldb => { - if let Some(lldb_version) = config.lldb_version.as_ref() { - if is_blacklisted_lldb_version(&lldb_version[..]) { - println!( - "WARNING: The used version of LLDB ({}) has a \ - known issue that breaks debuginfo tests. See \ - issue #32520 for more information. Skipping all \ - LLDB-based tests!", - lldb_version - ); - return; - } - } - - // Some older versions of LLDB seem to have problems with multiple - // instances running in parallel, so only run one test thread at a - // time. - env::set_var("RUST_TEST_THREADS", "1"); - } - - DebugInfoGdb => { - if config.remote_test_client.is_some() && !config.target.contains("android") { - println!( - "WARNING: debuginfo tests are not available when \ - testing with remote" - ); - return; - } - } - - DebugInfoCdb | _ => { /* proceed */ } - } - +pub fn run_tests(config: Config) { // FIXME(#33435) Avoid spurious failures in codegen-units/partitioning tests. if let Mode::CodegenUnits = config.mode { let _ = fs::remove_dir_all("tmp/partitioning-tests"); @@ -516,8 +311,6 @@ pub fn run_tests(config: &Config) { } } - let opts = test_opts(config); - let tests = make_tests(config); // sadly osx needs some file descriptor limits raised for running tests in // parallel (especially when we have lots and lots of child processes). // For context, see #8904 @@ -531,6 +324,25 @@ pub fn run_tests(config: &Config) { // Let tests know which target they're running as env::set_var("TARGET", &config.target); + let opts = test_opts(&config); + + let mut configs = Vec::new(); + if let Mode::DebugInfo = config.mode { + // Debugging emscripten code doesn't make sense today + if !config.target.contains("emscripten") { + configs.extend(configure_cdb(&config)); + configs.extend(configure_gdb(&config)); + configs.extend(configure_lldb(&config)); + } + } else { + configs.push(config); + }; + + let mut tests = Vec::new(); + for c in &configs { + make_tests(c, &mut tests); + } + let res = test::run_tests_console(&opts, tests); match res { Ok(true) => {} @@ -541,21 +353,83 @@ pub fn run_tests(config: &Config) { } } +fn configure_cdb(config: &Config) -> Option<Config> { + if config.cdb.is_none() { + return None; + } + + Some(Config { debugger: Some(Debugger::Cdb), ..config.clone() }) +} + +fn configure_gdb(config: &Config) -> Option<Config> { + if config.gdb_version.is_none() { + return None; + } + + if util::matches_env(&config.target, "msvc") { + return None; + } + + if config.remote_test_client.is_some() && !config.target.contains("android") { + println!( + "WARNING: debuginfo tests are not available when \ + testing with remote" + ); + return None; + } + + if config.target.contains("android") { + println!( + "{} debug-info test uses tcp 5039 port.\ + please reserve it", + config.target + ); + + // android debug-info test uses remote debugger so, we test 1 thread + // at once as they're all sharing the same TCP port to communicate + // over. + // + // we should figure out how to lift this restriction! (run them all + // on different ports allocated dynamically). + env::set_var("RUST_TEST_THREADS", "1"); + } + + Some(Config { debugger: Some(Debugger::Gdb), ..config.clone() }) +} + +fn configure_lldb(config: &Config) -> Option<Config> { + if config.lldb_python_dir.is_none() { + return None; + } + + if let Some(lldb_version) = config.lldb_version.as_ref() { + if is_blacklisted_lldb_version(&lldb_version) { + println!( + "WARNING: The used version of LLDB ({}) has a \ + known issue that breaks debuginfo tests. See \ + issue #32520 for more information. Skipping all \ + LLDB-based tests!", + lldb_version + ); + return None; + } + } + + // Some older versions of LLDB seem to have problems with multiple + // instances running in parallel, so only run one test thread at a + // time. + env::set_var("RUST_TEST_THREADS", "1"); + + Some(Config { debugger: Some(Debugger::Lldb), ..config.clone() }) +} + pub fn test_opts(config: &Config) -> test::TestOpts { test::TestOpts { exclude_should_panic: false, filter: config.filter.clone(), filter_exact: config.filter_exact, - run_ignored: if config.run_ignored { - test::RunIgnored::Yes - } else { - test::RunIgnored::No - }, - format: if config.quiet { - test::OutputFormat::Terse - } else { - test::OutputFormat::Pretty - }, + run_ignored: if config.run_ignored { test::RunIgnored::Yes } else { test::RunIgnored::No }, + format: if config.quiet { test::OutputFormat::Terse } else { test::OutputFormat::Pretty }, logfile: config.logfile.clone(), run_tests: true, bench_benchmarks: true, @@ -569,29 +443,27 @@ pub fn test_opts(config: &Config) -> test::TestOpts { list: false, options: test::Options::new(), time_options: None, + force_run_in_process: false, } } -pub fn make_tests(config: &Config) -> Vec<test::TestDescAndFn> { +pub fn make_tests(config: &Config, tests: &mut Vec<test::TestDescAndFn>) { debug!("making tests from {:?}", config.src_base.display()); let inputs = common_inputs_stamp(config); - let mut tests = Vec::new(); collect_tests_from_dir( config, &config.src_base, &config.src_base, &PathBuf::new(), &inputs, - &mut tests, - ).expect(&format!("Could not read tests from {}", config.src_base.display())); - tests + tests, + ) + .expect(&format!("Could not read tests from {}", config.src_base.display())); } /// Returns a stamp constructed from input files common to all test cases. fn common_inputs_stamp(config: &Config) -> Stamp { - let rust_src_dir = config - .find_rust_src_root() - .expect("Could not find Rust source root"); + let rust_src_dir = config.find_rust_src_root().expect("Could not find Rust source root"); let mut stamp = Stamp::from_path(&config.rustc_path); @@ -660,18 +532,21 @@ fn collect_tests_from_dir( let file_name = file.file_name(); if is_test(&file_name) { debug!("found test file: {:?}", file_path.display()); - let paths = TestPaths { - file: file_path, - relative_dir: relative_dir_path.to_path_buf(), - }; + let paths = + TestPaths { file: file_path, relative_dir: relative_dir_path.to_path_buf() }; tests.extend(make_test(config, &paths, inputs)) } else if file_path.is_dir() { let relative_file_path = relative_dir_path.join(file.file_name()); if &file_name != "auxiliary" { debug!("found directory: {:?}", file_path.display()); collect_tests_from_dir( - config, base, &file_path, &relative_file_path, - inputs, tests)?; + config, + base, + &file_path, + &relative_file_path, + inputs, + tests, + )?; } } else { debug!("found other file/directory: {:?}", file_path.display()); @@ -680,7 +555,6 @@ fn collect_tests_from_dir( Ok(()) } - /// Returns true if `file_name` looks like a proper test file name. pub fn is_test(file_name: &OsString) -> bool { let file_name = file_name.to_str().unwrap(); @@ -707,11 +581,13 @@ fn make_test(config: &Config, testpaths: &TestPaths, inputs: &Stamp) -> Vec<test // If desired, we could add a `should-fail-pretty` annotation. let should_panic = match config.mode { Pretty => test::ShouldPanic::No, - _ => if early_props.should_fail { - test::ShouldPanic::Yes - } else { - test::ShouldPanic::No - }, + _ => { + if early_props.should_fail { + test::ShouldPanic::Yes + } else { + test::ShouldPanic::No + } + } }; // Incremental tests are special, they inherently cannot be run in parallel. @@ -724,13 +600,7 @@ fn make_test(config: &Config, testpaths: &TestPaths, inputs: &Stamp) -> Vec<test revisions .into_iter() .map(|revision| { - let ignore = early_props.ignore == Ignore::Ignore - // Debugging emscripten code doesn't make sense today - || ((config.mode == DebugInfoGdbLldb || config.mode == DebugInfoCdb || - config.mode == DebugInfoGdb || config.mode == DebugInfoLldb) - && config.target.contains("emscripten")) - || (config.mode == DebugInfoGdb && !early_props.ignore.can_run_gdb()) - || (config.mode == DebugInfoLldb && !early_props.ignore.can_run_lldb()) + let ignore = early_props.ignore // Ignore tests that already run and are up to date with respect to inputs. || is_up_to_date( config, @@ -747,7 +617,7 @@ fn make_test(config: &Config, testpaths: &TestPaths, inputs: &Stamp) -> Vec<test allow_fail: false, test_type: test::TestType::Unknown, }, - testfn: make_test_closure(config, early_props.ignore, testpaths, revision), + testfn: make_test_closure(config, testpaths, revision), } }) .collect() @@ -778,13 +648,11 @@ fn is_up_to_date( // Check timestamps. let mut inputs = inputs.clone(); - inputs.add_path(&testpaths.file); + // Use `add_dir` to account for run-make tests, which use their individual directory + inputs.add_dir(&testpaths.file); for aux in &props.aux { - let path = testpaths.file.parent() - .unwrap() - .join("auxiliary") - .join(aux); + let path = testpaths.file.parent().unwrap().join("auxiliary").join(aux); inputs.add_path(&path); } @@ -820,7 +688,9 @@ impl Stamp { for entry in WalkDir::new(path) { let entry = entry.unwrap(); if entry.file_type().is_file() { - let modified = entry.metadata().ok() + let modified = entry + .metadata() + .ok() .and_then(|metadata| metadata.modified().ok()) .unwrap_or(SystemTime::UNIX_EPOCH); self.time = self.time.max(modified); @@ -840,13 +710,19 @@ fn make_test_name( let path = PathBuf::from(config.src_base.file_name().unwrap()) .join(&testpaths.relative_dir) .join(&testpaths.file.file_name().unwrap()); + let debugger = match config.debugger { + Some(d) => format!("-{}", d), + None => String::new(), + }; let mode_suffix = match config.compare_mode { Some(ref mode) => format!(" ({})", mode.to_str()), None => String::new(), }; + test::DynTestName(format!( - "[{}{}] {}{}", + "[{}{}{}] {}{}", config.mode, + debugger, mode_suffix, path.display(), revision.map_or("".to_string(), |rev| format!("#{}", rev)) @@ -855,21 +731,10 @@ fn make_test_name( fn make_test_closure( config: &Config, - ignore: Ignore, testpaths: &TestPaths, revision: Option<&String>, ) -> test::TestFn { - let mut config = config.clone(); - if config.mode == DebugInfoGdbLldb { - // If both gdb and lldb were ignored, then the test as a whole - // would be ignored. - if !ignore.can_run_gdb() { - config.mode = DebugInfoLldb; - } else if !ignore.can_run_lldb() { - config.mode = DebugInfoGdb; - } - } - + let config = config.clone(); let testpaths = testpaths.clone(); let revision = revision.cloned(); test::DynTestFn(Box::new(move || { @@ -897,13 +762,13 @@ fn find_cdb(target: &String) -> Option<OsString> { } let pf86 = env::var_os("ProgramFiles(x86)").or(env::var_os("ProgramFiles"))?; - let cdb_arch = if cfg!(target_arch="x86") { + let cdb_arch = if cfg!(target_arch = "x86") { "x86" - } else if cfg!(target_arch="x86_64") { + } else if cfg!(target_arch = "x86_64") { "x64" - } else if cfg!(target_arch="aarch64") { + } else if cfg!(target_arch = "aarch64") { "arm64" - } else if cfg!(target_arch="arm") { + } else if cfg!(target_arch = "arm") { "arm" } else { return None; // No compatible CDB.exe in the Windows 10 SDK @@ -928,8 +793,11 @@ fn analyze_cdb(cdb: Option<String>, target: &String) -> Option<OsString> { } /// Returns (Path to GDB, GDB Version, GDB has Rust Support) -fn analyze_gdb(gdb: Option<String>, target: &String, android_cross_path: &PathBuf) - -> (Option<String>, Option<u32>, bool) { +fn analyze_gdb( + gdb: Option<String>, + target: &String, + android_cross_path: &PathBuf, +) -> (Option<String>, Option<u32>, bool) { #[cfg(not(windows))] const GDB_FALLBACK: &str = "gdb"; #[cfg(windows)] @@ -1007,23 +875,20 @@ fn extract_gdb_version(full_version_line: &str) -> Option<u32> { let line = &line[next_split + 1..]; let (minor, patch) = match line.find(|c: char| !c.is_digit(10)) { - Some(idx) => if line.as_bytes()[idx] == b'.' { - let patch = &line[idx + 1..]; - - let patch_len = patch - .find(|c: char| !c.is_digit(10)) - .unwrap_or_else(|| patch.len()); - let patch = &patch[..patch_len]; - let patch = if patch_len > 3 || patch_len == 0 { - None - } else { - Some(patch) - }; + Some(idx) => { + if line.as_bytes()[idx] == b'.' { + let patch = &line[idx + 1..]; - (&line[..idx], patch) - } else { - (&line[..idx], None) - }, + let patch_len = + patch.find(|c: char| !c.is_digit(10)).unwrap_or_else(|| patch.len()); + let patch = &patch[..patch_len]; + let patch = if patch_len > 3 || patch_len == 0 { None } else { Some(patch) }; + + (&line[..idx], patch) + } else { + (&line[..idx], None) + } + } None => (line, None), }; diff --git a/src/tools/compiletest/src/raise_fd_limit.rs b/src/tools/compiletest/src/raise_fd_limit.rs index e9c9109410..faded7c802 100644 --- a/src/tools/compiletest/src/raise_fd_limit.rs +++ b/src/tools/compiletest/src/raise_fd_limit.rs @@ -23,24 +23,15 @@ pub unsafe fn raise_fd_limit() { let mut mib: [libc::c_int; 2] = [CTL_KERN, KERN_MAXFILESPERPROC]; let mut maxfiles: libc::c_int = 0; let mut size: libc::size_t = size_of_val(&maxfiles) as libc::size_t; - if libc::sysctl( - &mut mib[0], - 2, - &mut maxfiles as *mut _ as *mut _, - &mut size, - null_mut(), - 0, - ) != 0 + if libc::sysctl(&mut mib[0], 2, &mut maxfiles as *mut _ as *mut _, &mut size, null_mut(), 0) + != 0 { let err = io::Error::last_os_error(); panic!("raise_fd_limit: error calling sysctl: {}", err); } // Fetch the current resource limits - let mut rlim = libc::rlimit { - rlim_cur: 0, - rlim_max: 0, - }; + let mut rlim = libc::rlimit { rlim_cur: 0, rlim_max: 0 }; if libc::getrlimit(libc::RLIMIT_NOFILE, &mut rlim) != 0 { let err = io::Error::last_os_error(); panic!("raise_fd_limit: error calling getrlimit: {}", err); diff --git a/src/tools/compiletest/src/read2.rs b/src/tools/compiletest/src/read2.rs index 6dfd8e97c6..da1d3db49d 100644 --- a/src/tools/compiletest/src/read2.rs +++ b/src/tools/compiletest/src/read2.rs @@ -197,9 +197,6 @@ mod imp { if v.capacity() == v.len() { v.reserve(1); } - slice::from_raw_parts_mut( - v.as_mut_ptr().offset(v.len() as isize), - v.capacity() - v.len(), - ) + slice::from_raw_parts_mut(v.as_mut_ptr().offset(v.len() as isize), v.capacity() - v.len()) } } diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 480868440b..be66c9ab2d 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -1,21 +1,20 @@ // ignore-tidy-filelength -use crate::common::{CompareMode, PassMode}; use crate::common::{expected_output_path, UI_EXTENSIONS, UI_FIXED, UI_STDERR, UI_STDOUT}; -use crate::common::{UI_RUN_STDERR, UI_RUN_STDOUT}; use crate::common::{output_base_dir, output_base_name, output_testname_unique}; -use crate::common::{Codegen, CodegenUnits, Rustdoc}; -use crate::common::{DebugInfoCdb, DebugInfoGdbLldb, DebugInfoGdb, DebugInfoLldb}; +use crate::common::{Assembly, Incremental, JsDocTest, MirOpt, RunMake, Ui}; +use crate::common::{Codegen, CodegenUnits, DebugInfo, Debugger, Rustdoc}; +use crate::common::{CompareMode, FailMode, PassMode}; use crate::common::{CompileFail, Pretty, RunFail, RunPassValgrind}; use crate::common::{Config, TestPaths}; -use crate::common::{Incremental, MirOpt, RunMake, Ui, JsDocTest, Assembly}; -use diff; +use crate::common::{UI_RUN_STDERR, UI_RUN_STDOUT}; use crate::errors::{self, Error, ErrorKind}; use crate::header::TestProps; use crate::json; +use crate::util::{logv, PathBufExt}; +use diff; use regex::{Captures, Regex}; use rustfix::{apply_suggestions, get_suggestions_from_json, Filter}; -use crate::util::{logv, PathBufExt}; use std::collections::hash_map::DefaultHasher; use std::collections::{HashMap, HashSet, VecDeque}; @@ -42,10 +41,8 @@ mod tests; #[cfg(windows)] fn disable_error_reporting<F: FnOnce() -> R, R>(f: F) -> R { use std::sync::Mutex; - const SEM_NOGPFAULTERRORBOX: u32 = 0x0002; - extern "system" { - fn SetErrorMode(mode: u32) -> u32; - } + use winapi::um::errhandlingapi::SetErrorMode; + use winapi::um::winbase::SEM_NOGPFAULTERRORBOX; lazy_static! { static ref LOCK: Mutex<()> = { Mutex::new(()) }; @@ -117,10 +114,7 @@ pub struct Mismatch { impl Mismatch { fn new(line_number: u32) -> Mismatch { - Mismatch { - line_number: line_number, - lines: Vec::new(), - } + Mismatch { line_number: line_number, lines: Vec::new() } } } @@ -197,7 +191,7 @@ pub fn run(config: Config, testpaths: &TestPaths, revision: Option<&str>) { _ => { // android has its own gdb handling - if config.mode == DebugInfoGdb && config.gdb.is_none() { + if config.debugger == Some(Debugger::Gdb) && config.gdb.is_none() { panic!("gdb not available but debuginfo gdb debuginfo test requested"); } } @@ -210,21 +204,13 @@ pub fn run(config: Config, testpaths: &TestPaths, revision: Option<&str>) { debug!("running {:?}", testpaths.file.display()); let props = TestProps::from_file(&testpaths.file, revision, &config); - let cx = TestCx { - config: &config, - props: &props, - testpaths, - revision: revision, - }; + let cx = TestCx { config: &config, props: &props, testpaths, revision: revision }; create_dir_all(&cx.output_base_dir()).unwrap(); if config.mode == Incremental { // Incremental tests are special because they cannot be run in // parallel. - assert!( - !props.revisions.is_empty(), - "Incremental tests require revisions." - ); + assert!(!props.revisions.is_empty(), "Incremental tests require revisions."); cx.init_incremental_test(); for revision in &props.revisions { let revision_props = TestProps::from_file(&testpaths.file, Some(revision), &config); @@ -247,24 +233,28 @@ pub fn compute_stamp_hash(config: &Config) -> String { let mut hash = DefaultHasher::new(); config.stage_id.hash(&mut hash); - if config.mode == DebugInfoCdb { - config.cdb.hash(&mut hash); - } + match config.debugger { + Some(Debugger::Cdb) => { + config.cdb.hash(&mut hash); + } - if config.mode == DebugInfoGdb || config.mode == DebugInfoGdbLldb { - match config.gdb { - None => env::var_os("PATH").hash(&mut hash), - Some(ref s) if s.is_empty() => env::var_os("PATH").hash(&mut hash), - Some(ref s) => s.hash(&mut hash), - }; - } + Some(Debugger::Gdb) => { + config.gdb.hash(&mut hash); + env::var_os("PATH").hash(&mut hash); + env::var_os("PYTHONPATH").hash(&mut hash); + } - if config.mode == DebugInfoLldb || config.mode == DebugInfoGdbLldb { - env::var_os("PATH").hash(&mut hash); - env::var_os("PYTHONPATH").hash(&mut hash); + Some(Debugger::Lldb) => { + config.lldb_python.hash(&mut hash); + config.lldb_python_dir.hash(&mut hash); + env::var_os("PATH").hash(&mut hash); + env::var_os("PYTHONPATH").hash(&mut hash); + } + + None => {} } - if let Ui | Incremental | Pretty = config.mode { + if let Ui = config.mode { config.force_pass_mode.hash(&mut hash); } @@ -294,13 +284,26 @@ enum TestOutput { Run, } +/// Will this test be executed? Should we use `make_exe_name`? +#[derive(Copy, Clone, PartialEq)] +enum WillExecute { + Yes, + No, +} + +/// Should `--emit metadata` be used? +#[derive(Copy, Clone)] +enum EmitMetadata { + Yes, + No, +} + impl<'test> TestCx<'test> { /// Code executed for each revision in turn (or, if there are no /// revisions, exactly once, with revision == None). fn run_revision(&self) { if self.props.should_ice { - if self.config.mode != CompileFail && - self.config.mode != Incremental { + if self.config.mode != CompileFail && self.config.mode != Incremental { self.fatal("cannot use should-ice in a test that is not cfail"); } } @@ -309,13 +312,7 @@ impl<'test> TestCx<'test> { RunFail => self.run_rfail_test(), RunPassValgrind => self.run_valgrind_test(), Pretty => self.run_pretty_test(), - DebugInfoGdbLldb => { - self.run_debuginfo_gdb_test(); - self.run_debuginfo_lldb_test(); - }, - DebugInfoCdb => self.run_debuginfo_cdb_test(), - DebugInfoGdb => self.run_debuginfo_gdb_test(), - DebugInfoLldb => self.run_debuginfo_lldb_test(), + DebugInfo => self.run_debuginfo_test(), Codegen => self.run_codegen_test(), Rustdoc => self.run_rustdoc_test(), CodegenUnits => self.run_codegen_units_test(), @@ -332,35 +329,36 @@ impl<'test> TestCx<'test> { self.props.pass_mode(self.config) } - fn should_run(&self) -> bool { - let pass_mode = self.pass_mode(); + fn should_run(&self, pm: Option<PassMode>) -> WillExecute { match self.config.mode { - Ui => pass_mode == Some(PassMode::Run) || pass_mode == Some(PassMode::RunFail), + Ui if pm == Some(PassMode::Run) || self.props.fail_mode == Some(FailMode::Run) => { + WillExecute::Yes + } + Ui => WillExecute::No, mode => panic!("unimplemented for mode {:?}", mode), } } - fn should_run_successfully(&self) -> bool { - let pass_mode = self.pass_mode(); + fn should_run_successfully(&self, pm: Option<PassMode>) -> bool { match self.config.mode { - Ui => pass_mode == Some(PassMode::Run), + Ui => pm == Some(PassMode::Run), mode => panic!("unimplemented for mode {:?}", mode), } } - fn should_compile_successfully(&self) -> bool { + fn should_compile_successfully(&self, pm: Option<PassMode>) -> bool { match self.config.mode { CompileFail => false, JsDocTest => true, - Ui => self.pass_mode().is_some(), + Ui => pm.is_some() || self.props.fail_mode > Some(FailMode::Build), Incremental => { - let revision = self.revision - .expect("incremental tests require a list of revisions"); + let revision = + self.revision.expect("incremental tests require a list of revisions"); if revision.starts_with("rpass") || revision.starts_with("rfail") { true } else if revision.starts_with("cfail") { // FIXME: would be nice if incremental revs could start with "cpass" - self.pass_mode().is_some() + pm.is_some() } else { panic!("revision name must begin with rpass, rfail, or cfail"); } @@ -369,8 +367,8 @@ impl<'test> TestCx<'test> { } } - fn check_if_test_should_compile(&self, proc_res: &ProcRes) { - if self.should_compile_successfully() { + fn check_if_test_should_compile(&self, proc_res: &ProcRes, pm: Option<PassMode>) { + if self.should_compile_successfully(pm) { if !proc_res.status.success() { self.fatal_proc_rec("test compilation failed although it shouldn't!", proc_res); } @@ -387,8 +385,9 @@ impl<'test> TestCx<'test> { } fn run_cfail_test(&self) { - let proc_res = self.compile_test(); - self.check_if_test_should_compile(&proc_res); + let pm = self.pass_mode(); + let proc_res = self.compile_test(WillExecute::No, self.should_emit_metadata(pm)); + self.check_if_test_should_compile(&proc_res, pm); self.check_no_compiler_crash(&proc_res, self.props.should_ice); let output_to_check = self.get_output(&proc_res); @@ -399,7 +398,7 @@ impl<'test> TestCx<'test> { } self.check_expected_errors(expected_errors, &proc_res); } else { - self.check_error_patterns(&output_to_check, &proc_res); + self.check_error_patterns(&output_to_check, &proc_res, pm); } if self.props.should_ice { match proc_res.status.code() { @@ -412,7 +411,8 @@ impl<'test> TestCx<'test> { } fn run_rfail_test(&self) { - let proc_res = self.compile_test(); + let pm = self.pass_mode(); + let proc_res = self.compile_test(WillExecute::Yes, self.should_emit_metadata(pm)); if !proc_res.status.success() { self.fatal_proc_rec("compilation failed!", &proc_res); @@ -428,7 +428,7 @@ impl<'test> TestCx<'test> { let output_to_check = self.get_output(&proc_res); self.check_correct_failure_status(&proc_res); - self.check_error_patterns(&output_to_check, &proc_res); + self.check_error_patterns(&output_to_check, &proc_res, pm); } fn get_output(&self, proc_res: &ProcRes) -> String { @@ -455,7 +455,8 @@ impl<'test> TestCx<'test> { } fn run_rpass_test(&self) { - let proc_res = self.compile_test(); + let emit_metadata = self.should_emit_metadata(self.pass_mode()); + let proc_res = self.compile_test(WillExecute::Yes, emit_metadata); if !proc_res.status.success() { self.fatal_proc_rec("compilation failed!", &proc_res); @@ -482,7 +483,7 @@ impl<'test> TestCx<'test> { return self.run_rpass_test(); } - let mut proc_res = self.compile_test(); + let mut proc_res = self.compile_test(WillExecute::Yes, EmitMetadata::No); if !proc_res.status.success() { self.fatal_proc_rec("compilation failed!", &proc_res); @@ -490,10 +491,7 @@ impl<'test> TestCx<'test> { let mut new_config = self.config.clone(); new_config.runtool = new_config.valgrind_path.clone(); - let new_cx = TestCx { - config: &new_config, - ..*self - }; + let new_cx = TestCx { config: &new_config, ..*self }; proc_res = new_cx.exec_compiled_test(); if !proc_res.status.success() { @@ -505,10 +503,7 @@ impl<'test> TestCx<'test> { if self.props.pp_exact.is_some() { logv(self.config, "testing for exact pretty-printing".to_owned()); } else { - logv( - self.config, - "testing for converging pretty-printing".to_owned(), - ); + logv(self.config, "testing for converging pretty-printing".to_owned()); } let rounds = match self.props.pp_exact { @@ -523,19 +518,12 @@ impl<'test> TestCx<'test> { while round < rounds { logv( self.config, - format!( - "pretty-printing round {} revision {:?}", - round, self.revision - ), + format!("pretty-printing round {} revision {:?}", round, self.revision), ); - let read_from = if round == 0 { - ReadFrom::Path - } else { - ReadFrom::Stdin(srcs[round].to_owned()) - }; + let read_from = + if round == 0 { ReadFrom::Path } else { ReadFrom::Stdin(srcs[round].to_owned()) }; - let proc_res = self.print_source(read_from, - &self.props.pretty_mode); + let proc_res = self.print_source(read_from, &self.props.pretty_mode); if !proc_res.status.success() { self.fatal_proc_rec( &format!( @@ -590,16 +578,10 @@ impl<'test> TestCx<'test> { self.fatal_proc_rec("pretty-printing (expanded) failed", &proc_res); } - let ProcRes { - stdout: expanded_src, - .. - } = proc_res; + let ProcRes { stdout: expanded_src, .. } = proc_res; let proc_res = self.typecheck_source(expanded_src); if !proc_res.status.success() { - self.fatal_proc_rec( - "pretty-printed source (expanded) does not typecheck", - &proc_res, - ); + self.fatal_proc_rec("pretty-printed source (expanded) does not typecheck", &proc_res); } } @@ -619,12 +601,14 @@ impl<'test> TestCx<'test> { .arg(&aux_dir) .args(&self.props.compile_flags) .envs(self.props.exec_env.clone()); - self.maybe_add_external_args(&mut rustc, - self.split_maybe_args(&self.config.target_rustcflags)); + self.maybe_add_external_args( + &mut rustc, + self.split_maybe_args(&self.config.target_rustcflags), + ); let src = match read_from { ReadFrom::Stdin(src) => Some(src), - ReadFrom::Path => None + ReadFrom::Path => None, }; self.compose_and_run( @@ -648,8 +632,8 @@ impl<'test> TestCx<'test> { {}\n\ ------------------------------------------\n\ \n", - expected, actual) - ); + expected, actual + )); } } @@ -669,11 +653,7 @@ impl<'test> TestCx<'test> { let _ = fs::remove_dir_all(&out_dir); create_dir_all(&out_dir).unwrap(); - let target = if self.props.force_host { - &*self.config.host - } else { - &*self.config.target - }; + let target = if self.props.force_host { &*self.config.host } else { &*self.config.target }; let aux_dir = self.aux_output_dir_name(); @@ -688,34 +668,40 @@ impl<'test> TestCx<'test> { .arg("-L") .arg(aux_dir); self.set_revision_flags(&mut rustc); - self.maybe_add_external_args(&mut rustc, - self.split_maybe_args(&self.config.target_rustcflags)); + self.maybe_add_external_args( + &mut rustc, + self.split_maybe_args(&self.config.target_rustcflags), + ); rustc.args(&self.props.compile_flags); self.compose_and_run_compiler(rustc, Some(src)) } + fn run_debuginfo_test(&self) { + match self.config.debugger.unwrap() { + Debugger::Cdb => self.run_debuginfo_cdb_test(), + Debugger::Gdb => self.run_debuginfo_gdb_test(), + Debugger::Lldb => self.run_debuginfo_lldb_test(), + } + } + fn run_debuginfo_cdb_test(&self) { assert!(self.revision.is_none(), "revisions not relevant here"); let config = Config { target_rustcflags: self.cleanup_debug_info_options(&self.config.target_rustcflags), host_rustcflags: self.cleanup_debug_info_options(&self.config.host_rustcflags), - mode: DebugInfoCdb, ..self.config.clone() }; - let test_cx = TestCx { - config: &config, - ..*self - }; + let test_cx = TestCx { config: &config, ..*self }; test_cx.run_debuginfo_cdb_test_no_opt(); } fn run_debuginfo_cdb_test_no_opt(&self) { // compile test file (it should have 'compile-flags:-g' in the header) - let compile_result = self.compile_test(); + let compile_result = self.compile_test(WillExecute::Yes, EmitMetadata::No); if !compile_result.status.success() { self.fatal_proc_rec("compilation failed!", &compile_result); } @@ -729,12 +715,8 @@ impl<'test> TestCx<'test> { }; // Parse debugger commands etc from test files - let DebuggerCommands { - commands, - check_lines, - breakpoint_lines, - .. - } = self.parse_debugger_commands(prefixes); + let DebuggerCommands { commands, check_lines, breakpoint_lines, .. } = + self.parse_debugger_commands(prefixes); // https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-commands let mut script_str = String::with_capacity(2048); @@ -744,10 +726,7 @@ impl<'test> TestCx<'test> { // Set breakpoints on every line that contains the string "#break" let source_file_name = self.testpaths.file.file_name().unwrap().to_string_lossy(); for line in &breakpoint_lines { - script_str.push_str(&format!( - "bp `{}:{}`\n", - source_file_name, line - )); + script_str.push_str(&format!("bp `{}:{}`\n", source_file_name, line)); } // Append the other `cdb-command:`s @@ -765,16 +744,16 @@ impl<'test> TestCx<'test> { let cdb_path = &self.config.cdb.as_ref().unwrap(); let mut cdb = Command::new(cdb_path); - cdb - .arg("-lines") // Enable source line debugging. - .arg("-cf").arg(&debugger_script) + cdb.arg("-lines") // Enable source line debugging. + .arg("-cf") + .arg(&debugger_script) .arg(&exe_file); let debugger_run_result = self.compose_and_run( cdb, self.config.run_lib_path.to_str().unwrap(), None, // aux_path - None // input + None, // input ); if !debugger_run_result.status.success() { @@ -790,14 +769,10 @@ impl<'test> TestCx<'test> { let config = Config { target_rustcflags: self.cleanup_debug_info_options(&self.config.target_rustcflags), host_rustcflags: self.cleanup_debug_info_options(&self.config.host_rustcflags), - mode: DebugInfoGdb, ..self.config.clone() }; - let test_cx = TestCx { - config: &config, - ..*self - }; + let test_cx = TestCx { config: &config, ..*self }; test_cx.run_debuginfo_gdb_test_no_opt(); } @@ -815,15 +790,12 @@ impl<'test> TestCx<'test> { PREFIXES }; - let DebuggerCommands { - commands, - check_lines, - breakpoint_lines, - } = self.parse_debugger_commands(prefixes); + let DebuggerCommands { commands, check_lines, breakpoint_lines } = + self.parse_debugger_commands(prefixes); let mut cmds = commands.join("\n"); // compile test file (it should have 'compile-flags:-g' in the header) - let compiler_run_result = self.compile_test(); + let compiler_run_result = self.compile_test(WillExecute::Yes, EmitMetadata::No); if !compiler_run_result.status.success() { self.fatal_proc_rec("compilation failed!", &compiler_run_result); } @@ -883,11 +855,7 @@ impl<'test> TestCx<'test> { "export LD_LIBRARY_PATH={}; \ gdbserver{} :5039 {}/{}", self.config.adb_test_dir.clone(), - if self.config.target.contains("aarch64") { - "64" - } else { - "" - }, + if self.config.target.contains("aarch64") { "64" } else { "" }, self.config.adb_test_dir.clone(), exe_file.file_name().unwrap().to_str().unwrap() ); @@ -916,19 +884,11 @@ impl<'test> TestCx<'test> { let mut debugger_script = OsString::from("-command="); debugger_script.push(self.make_out_name("debugger.script")); - let debugger_opts: &[&OsStr] = &[ - "-quiet".as_ref(), - "-batch".as_ref(), - "-nx".as_ref(), - &debugger_script, - ]; + let debugger_opts: &[&OsStr] = + &["-quiet".as_ref(), "-batch".as_ref(), "-nx".as_ref(), &debugger_script]; let gdb_path = self.config.gdb.as_ref().unwrap(); - let Output { - status, - stdout, - stderr, - } = Command::new(&gdb_path) + let Output { status, stdout, stderr } = Command::new(&gdb_path) .args(debugger_opts) .output() .expect(&format!("failed to exec `{:?}`", gdb_path)); @@ -950,16 +910,11 @@ impl<'test> TestCx<'test> { println!("Adb process is already finished."); } } else { - let rust_src_root = self - .config - .find_rust_src_root() - .expect("Could not find Rust source root"); + let rust_src_root = + self.config.find_rust_src_root().expect("Could not find Rust source root"); let rust_pp_module_rel_path = Path::new("./src/etc"); - let rust_pp_module_abs_path = rust_src_root - .join(rust_pp_module_rel_path) - .to_str() - .unwrap() - .to_owned(); + let rust_pp_module_abs_path = + rust_src_root.join(rust_pp_module_rel_path).to_str().unwrap().to_owned(); // write debugger script let mut script_str = String::with_capacity(2048); script_str.push_str(&format!("set charset {}\n", Self::charset())); @@ -967,10 +922,7 @@ impl<'test> TestCx<'test> { match self.config.gdb_version { Some(version) => { - println!( - "NOTE: compiletest thinks it is using GDB version {}", - version - ); + println!("NOTE: compiletest thinks it is using GDB version {}", version); if version > extract_gdb_version("7.4").unwrap() { // Add the directory containing the pretty printers to @@ -997,10 +949,8 @@ impl<'test> TestCx<'test> { script_str.push_str(&format!("directory {}\n", rust_pp_module_abs_path)); // Load the target executable - script_str.push_str(&format!( - "file {}\n", - exe_file.to_str().unwrap().replace(r"\", r"\\") - )); + script_str + .push_str(&format!("file {}\n", exe_file.to_str().unwrap().replace(r"\", r"\\"))); // Force GDB to print values in the Rust format. if self.config.gdb_native_rust { @@ -1025,23 +975,14 @@ impl<'test> TestCx<'test> { let mut debugger_script = OsString::from("-command="); debugger_script.push(self.make_out_name("debugger.script")); - let debugger_opts: &[&OsStr] = &[ - "-quiet".as_ref(), - "-batch".as_ref(), - "-nx".as_ref(), - &debugger_script, - ]; + let debugger_opts: &[&OsStr] = + &["-quiet".as_ref(), "-batch".as_ref(), "-nx".as_ref(), &debugger_script]; let mut gdb = Command::new(self.config.gdb.as_ref().unwrap()); - gdb.args(debugger_opts) - .env("PYTHONPATH", rust_pp_module_abs_path); - - debugger_run_result = self.compose_and_run( - gdb, - self.config.run_lib_path.to_str().unwrap(), - None, - None, - ); + gdb.args(debugger_opts).env("PYTHONPATH", rust_pp_module_abs_path); + + debugger_run_result = + self.compose_and_run(gdb, self.config.run_lib_path.to_str().unwrap(), None, None); } if !debugger_run_result.status.success() { @@ -1061,21 +1002,17 @@ impl<'test> TestCx<'test> { let config = Config { target_rustcflags: self.cleanup_debug_info_options(&self.config.target_rustcflags), host_rustcflags: self.cleanup_debug_info_options(&self.config.host_rustcflags), - mode: DebugInfoLldb, ..self.config.clone() }; - let test_cx = TestCx { - config: &config, - ..*self - }; + let test_cx = TestCx { config: &config, ..*self }; test_cx.run_debuginfo_lldb_test_no_opt(); } fn run_debuginfo_lldb_test_no_opt(&self) { // compile test file (it should have 'compile-flags:-g' in the header) - let compile_result = self.compile_test(); + let compile_result = self.compile_test(WillExecute::Yes, EmitMetadata::No); if !compile_result.status.success() { self.fatal_proc_rec("compilation failed!", &compile_result); } @@ -1084,10 +1021,7 @@ impl<'test> TestCx<'test> { match self.config.lldb_version { Some(ref version) => { - println!( - "NOTE: compiletest thinks it is using LLDB version {}", - version - ); + println!("NOTE: compiletest thinks it is using LLDB version {}", version); } _ => { println!( @@ -1108,12 +1042,8 @@ impl<'test> TestCx<'test> { }; // Parse debugger commands etc from test files - let DebuggerCommands { - commands, - check_lines, - breakpoint_lines, - .. - } = self.parse_debugger_commands(prefixes); + let DebuggerCommands { commands, check_lines, breakpoint_lines, .. } = + self.parse_debugger_commands(prefixes); // Write debugger script: // We don't want to hang when calling `quit` while the process is still running @@ -1123,16 +1053,11 @@ impl<'test> TestCx<'test> { script_str.push_str("version\n"); // Switch LLDB into "Rust mode" - let rust_src_root = self - .config - .find_rust_src_root() - .expect("Could not find Rust source root"); + let rust_src_root = + self.config.find_rust_src_root().expect("Could not find Rust source root"); let rust_pp_module_rel_path = Path::new("./src/etc/lldb_rust_formatters.py"); - let rust_pp_module_abs_path = rust_src_root - .join(rust_pp_module_rel_path) - .to_str() - .unwrap() - .to_owned(); + let rust_pp_module_abs_path = + rust_src_root.join(rust_pp_module_rel_path).to_str().unwrap().to_owned(); script_str .push_str(&format!("command script import {}\n", &rust_pp_module_abs_path[..])[..]); @@ -1193,15 +1118,9 @@ impl<'test> TestCx<'test> { fn cmd2procres(&self, cmd: &mut Command) -> ProcRes { let (status, out, err) = match cmd.output() { - Ok(Output { - status, - stdout, - stderr, - }) => ( - status, - String::from_utf8(stdout).unwrap(), - String::from_utf8(stderr).unwrap(), - ), + Ok(Output { status, stdout, stderr }) => { + (status, String::from_utf8(stdout).unwrap(), String::from_utf8(stderr).unwrap()) + } Err(e) => self.fatal(&format!( "Failed to setup Python process for \ LLDB script: {}", @@ -1210,12 +1129,7 @@ impl<'test> TestCx<'test> { }; self.dump_output(&out, &err); - ProcRes { - status, - stdout: out, - stderr: err, - cmdline: format!("{:?}", cmd), - } + ProcRes { status, stdout: out, stderr: err, cmdline: format!("{:?}", cmd) } } fn parse_debugger_commands(&self, debugger_prefixes: &[&str]) -> DebuggerCommands { @@ -1232,11 +1146,8 @@ impl<'test> TestCx<'test> { for line in reader.lines() { match line { Ok(line) => { - let line = if line.starts_with("//") { - line[2..].trim_start() - } else { - line.as_str() - }; + let line = + if line.starts_with("//") { line[2..].trim_start() } else { line.as_str() }; if line.contains("#break") { breakpoint_lines.push(counter); @@ -1257,11 +1168,7 @@ impl<'test> TestCx<'test> { counter += 1; } - DebuggerCommands { - commands, - check_lines, - breakpoint_lines, - } + DebuggerCommands { commands, check_lines, breakpoint_lines } } fn cleanup_debug_info_options(&self, options: &Option<String>) -> Option<String> { @@ -1285,18 +1192,19 @@ impl<'test> TestCx<'test> { // // Notable use-cases are: do not add our optimisation flag if // `compile-flags: -Copt-level=x` and similar for debug-info level as well. - const OPT_FLAGS: &[&str] = &["-O", "-Copt-level=", /*-C<space>*/"opt-level="]; - const DEBUG_FLAGS: &[&str] = &["-g", "-Cdebuginfo=", /*-C<space>*/"debuginfo="]; + const OPT_FLAGS: &[&str] = &["-O", "-Copt-level=", /*-C<space>*/ "opt-level="]; + const DEBUG_FLAGS: &[&str] = &["-g", "-Cdebuginfo=", /*-C<space>*/ "debuginfo="]; // FIXME: ideally we would "just" check the `cmd` itself, but it does not allow inspecting // its arguments. They need to be collected separately. For now I cannot be bothered to // implement this the "right" way. - let have_opt_flag = self.props.compile_flags.iter().any(|arg| { - OPT_FLAGS.iter().any(|f| arg.starts_with(f)) - }); - let have_debug_flag = self.props.compile_flags.iter().any(|arg| { - DEBUG_FLAGS.iter().any(|f| arg.starts_with(f)) - }); + let have_opt_flag = + self.props.compile_flags.iter().any(|arg| OPT_FLAGS.iter().any(|f| arg.starts_with(f))); + let have_debug_flag = self + .props + .compile_flags + .iter() + .any(|arg| DEBUG_FLAGS.iter().any(|f| arg.starts_with(f))); for arg in args { if OPT_FLAGS.iter().any(|f| arg.starts_with(f)) && have_opt_flag { @@ -1324,10 +1232,7 @@ impl<'test> TestCx<'test> { } if check_line_index != num_check_lines && num_check_lines > 0 { self.fatal_proc_rec( - &format!( - "line not found in debugger output: {}", - check_lines[check_line_index] - ), + &format!("line not found in debugger output: {}", check_lines[check_line_index]), debugger_run_result, ); } @@ -1340,10 +1245,8 @@ impl<'test> TestCx<'test> { let can_start_anywhere = check_line.starts_with("[...]"); let can_end_anywhere = check_line.ends_with("[...]"); - let check_fragments: Vec<&str> = check_line - .split("[...]") - .filter(|frag| !frag.is_empty()) - .collect(); + let check_fragments: Vec<&str> = + check_line.split("[...]").filter(|frag| !frag.is_empty()).collect(); if check_fragments.is_empty() { return true; } @@ -1374,10 +1277,16 @@ impl<'test> TestCx<'test> { } } - fn check_error_patterns(&self, output_to_check: &str, proc_res: &ProcRes) { + fn check_error_patterns( + &self, + output_to_check: &str, + proc_res: &ProcRes, + pm: Option<PassMode>, + ) { debug!("check_error_patterns"); if self.props.error_patterns.is_empty() { - if self.pass_mode().is_some() { + if pm.is_some() { + // FIXME(#65865) return; } else { self.fatal(&format!( @@ -1433,12 +1342,12 @@ impl<'test> TestCx<'test> { } fn check_expected_errors(&self, expected_errors: Vec<errors::Error>, proc_res: &ProcRes) { - debug!("check_expected_errors: expected_errors={:?} proc_res.status={:?}", - expected_errors, proc_res.status); + debug!( + "check_expected_errors: expected_errors={:?} proc_res.status={:?}", + expected_errors, proc_res.status + ); if proc_res.status.success() - && expected_errors - .iter() - .any(|x| x.kind == Some(ErrorKind::Error)) + && expected_errors.iter().any(|x| x.kind == Some(ErrorKind::Error)) { self.fatal_proc_rec("process did not return an error status", proc_res); } @@ -1454,26 +1363,22 @@ impl<'test> TestCx<'test> { // message, then we'll ensure that all "help" messages are expected. // Otherwise, all "help" messages reported by the compiler will be ignored. // This logic also applies to "note" messages. - let expect_help = expected_errors - .iter() - .any(|ee| ee.kind == Some(ErrorKind::Help)); - let expect_note = expected_errors - .iter() - .any(|ee| ee.kind == Some(ErrorKind::Note)); + let expect_help = expected_errors.iter().any(|ee| ee.kind == Some(ErrorKind::Help)); + let expect_note = expected_errors.iter().any(|ee| ee.kind == Some(ErrorKind::Note)); // Parse the JSON output from the compiler and extract out the messages. let actual_errors = json::parse_output(&os_file_name, &proc_res.stderr, proc_res); let mut unexpected = Vec::new(); let mut found = vec![false; expected_errors.len()]; for actual_error in &actual_errors { - let opt_index = expected_errors.iter().enumerate().position( - |(index, expected_error)| { - !found[index] && actual_error.line_num == expected_error.line_num + let opt_index = + expected_errors.iter().enumerate().position(|(index, expected_error)| { + !found[index] + && actual_error.line_num == expected_error.line_num && (expected_error.kind.is_none() || actual_error.kind == expected_error.kind) && actual_error.msg.contains(&expected_error.msg) - }, - ); + }); match opt_index { Some(index) => { @@ -1508,10 +1413,7 @@ impl<'test> TestCx<'test> { "{}:{}: expected {} not found: {}", file_name, expected_error.line_num, - expected_error - .kind - .as_ref() - .map_or("message".into(), |k| k.to_string()), + expected_error.kind.as_ref().map_or("message".into(), |k| k.to_string()), expected_error.msg )); not_found.push(expected_error); @@ -1553,22 +1455,30 @@ impl<'test> TestCx<'test> { } } - fn compile_test(&self) -> ProcRes { + fn should_emit_metadata(&self, pm: Option<PassMode>) -> EmitMetadata { + match (pm, self.props.fail_mode, self.config.mode) { + (Some(PassMode::Check), ..) | (_, Some(FailMode::Check), Ui) => EmitMetadata::Yes, + _ => EmitMetadata::No, + } + } + + fn compile_test(&self, will_execute: WillExecute, emit_metadata: EmitMetadata) -> ProcRes { + self.compile_test_general(will_execute, emit_metadata, self.props.local_pass_mode()) + } + + fn compile_test_general( + &self, + will_execute: WillExecute, + emit_metadata: EmitMetadata, + local_pm: Option<PassMode>, + ) -> ProcRes { // Only use `make_exe_name` when the test ends up being executed. - let will_execute = match self.config.mode { - Ui => self.should_run(), - Incremental => self.revision.unwrap().starts_with("r"), - RunFail | RunPassValgrind | MirOpt | - DebugInfoCdb | DebugInfoGdbLldb | DebugInfoGdb | DebugInfoLldb => true, - _ => false, - }; - let output_file = if will_execute { - TargetLocation::ThisFile(self.make_exe_name()) - } else { - TargetLocation::ThisDirectory(self.output_base_dir()) + let output_file = match will_execute { + WillExecute::Yes => TargetLocation::ThisFile(self.make_exe_name()), + WillExecute::No => TargetLocation::ThisDirectory(self.output_base_dir()), }; - let mut rustc = self.make_compile_args(&self.testpaths.file, output_file); + let mut rustc = self.make_compile_args(&self.testpaths.file, output_file, emit_metadata); rustc.arg("-L").arg(&self.aux_output_dir_name()); @@ -1579,11 +1489,12 @@ impl<'test> TestCx<'test> { // want to actually assert warnings about all this code. Instead // let's just ignore unused code warnings by defaults and tests // can turn it back on if needed. - if !self.config.src_base.ends_with("rustdoc-ui") && - // Note that we don't call pass_mode() here as we don't want + if !self.is_rustdoc() + // Note that we use the local pass mode here as we don't want // to set unused to allow if we've overriden the pass mode // via command line flags. - self.props.local_pass_mode() != Some(PassMode::Run) { + && local_pm != Some(PassMode::Run) + { rustc.args(&["-A", "unused"]); } } @@ -1598,8 +1509,7 @@ impl<'test> TestCx<'test> { for rel_ab in &self.props.aux_builds { let aux_testpaths = self.compute_aux_test_paths(rel_ab); let aux_props = - self.props - .from_aux_file(&aux_testpaths.file, self.revision, self.config); + self.props.from_aux_file(&aux_testpaths.file, self.revision, self.config); let aux_cx = TestCx { config: self.config, props: &aux_props, @@ -1617,11 +1527,7 @@ impl<'test> TestCx<'test> { let aux_dir = self.aux_output_dir_name(); - let rustdoc_path = self - .config - .rustdoc_path - .as_ref() - .expect("--rustdoc-path passed"); + let rustdoc_path = self.config.rustdoc_path.as_ref().expect("--rustdoc-path passed"); let mut rustdoc = Command::new(rustdoc_path); rustdoc @@ -1673,10 +1579,7 @@ impl<'test> TestCx<'test> { } let mut test_client = Command::new(self.config.remote_test_client.as_ref().unwrap()); - test_client - .args(&["run", &prog]) - .args(args) - .envs(env.clone()); + test_client.args(&["run", &prog]).args(args).envs(env.clone()); self.compose_and_run( test_client, self.config.run_lib_path.to_str().unwrap(), @@ -1700,10 +1603,7 @@ impl<'test> TestCx<'test> { let aux_dir = self.aux_output_dir_name(); let ProcArgs { prog, args } = self.make_run_args(); let mut program = Command::new(&prog); - program - .args(args) - .current_dir(&self.output_base_dir()) - .envs(env.clone()); + program.args(args).current_dir(&self.output_base_dir()).envs(env.clone()); self.compose_and_run( program, self.config.run_lib_path.to_str().unwrap(), @@ -1733,10 +1633,7 @@ impl<'test> TestCx<'test> { .join("auxiliary") .join(rel_ab); if !test_ab.exists() { - self.fatal(&format!( - "aux-build `{}` source not found", - test_ab.display() - )) + self.fatal(&format!("aux-build `{}` source not found", test_ab.display())) } TestPaths { @@ -1757,7 +1654,7 @@ impl<'test> TestCx<'test> { if self.config.target.contains("vxworks") { match env::var("RUST_VXWORKS_TEST_DYLINK") { Ok(s) => s != "1", - _ => true + _ => true, } } else { false @@ -1782,15 +1679,12 @@ impl<'test> TestCx<'test> { for (aux_name, aux_path) in &self.props.aux_crates { let is_dylib = self.build_auxiliary(&aux_path, &aux_dir); - let lib_name = get_lib_name(&aux_path.trim_end_matches(".rs").replace('-', "_"), - is_dylib); - rustc.arg("--extern") - .arg(format!("{}={}/{}", aux_name, aux_dir.display(), lib_name)); + let lib_name = + get_lib_name(&aux_path.trim_end_matches(".rs").replace('-', "_"), is_dylib); + rustc.arg("--extern").arg(format!("{}={}/{}", aux_name, aux_dir.display(), lib_name)); } - self.props.unset_rustc_env.clone() - .iter() - .fold(&mut rustc, |rustc, v| rustc.env_remove(v)); + self.props.unset_rustc_env.clone().iter().fold(&mut rustc, |rustc, v| rustc.env_remove(v)); rustc.envs(self.props.rustc_env.clone()); self.compose_and_run( rustc, @@ -1805,9 +1699,7 @@ impl<'test> TestCx<'test> { /// Returns whether or not it is a dylib. fn build_auxiliary(&self, source_path: &str, aux_dir: &Path) -> bool { let aux_testpaths = self.compute_aux_test_paths(source_path); - let aux_props = - self.props - .from_aux_file(&aux_testpaths.file, self.revision, self.config); + let aux_props = self.props.from_aux_file(&aux_testpaths.file, self.revision, self.config); let aux_output = TargetLocation::ThisDirectory(self.aux_output_dir_name()); let aux_cx = TestCx { config: self.config, @@ -1817,7 +1709,8 @@ impl<'test> TestCx<'test> { }; // Create the directory for the stdout/stderr files. create_dir_all(aux_cx.output_base_dir()).unwrap(); - let mut aux_rustc = aux_cx.make_compile_args(&aux_testpaths.file, aux_output); + let input_file = &aux_testpaths.file; + let mut aux_rustc = aux_cx.make_compile_args(input_file, aux_output, EmitMetadata::No); let (dylib, crate_type) = if aux_props.no_prefer_dynamic { (true, None) @@ -1881,10 +1774,7 @@ impl<'test> TestCx<'test> { cmdline }; - command - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .stdin(Stdio::piped()); + command.stdout(Stdio::piped()).stderr(Stdio::piped()).stdin(Stdio::piped()); // Need to be sure to put both the lib_path and the aux path in the dylib // search path for the child. @@ -1902,19 +1792,11 @@ impl<'test> TestCx<'test> { let mut child = disable_error_reporting(|| command.spawn()) .expect(&format!("failed to exec `{:?}`", &command)); if let Some(input) = input { - child - .stdin - .as_mut() - .unwrap() - .write_all(input.as_bytes()) - .unwrap(); + child.stdin.as_mut().unwrap().write_all(input.as_bytes()).unwrap(); } - let Output { - status, - stdout, - stderr, - } = read2_abbreviated(child).expect("failed to read output"); + let Output { status, stdout, stderr } = + read2_abbreviated(child).expect("failed to read output"); let result = ProcRes { status, @@ -1928,23 +1810,21 @@ impl<'test> TestCx<'test> { result } + fn is_rustdoc(&self) -> bool { + self.config.src_base.ends_with("rustdoc-ui") || self.config.src_base.ends_with("rustdoc-js") + } + fn make_compile_args( &self, input_file: &Path, output_file: TargetLocation, + emit_metadata: EmitMetadata, ) -> Command { - let is_rustdoc = self.config.src_base.ends_with("rustdoc-ui") || - self.config.src_base.ends_with("rustdoc-js"); + let is_rustdoc = self.is_rustdoc(); let mut rustc = if !is_rustdoc { Command::new(&self.config.rustc_path) } else { - Command::new( - &self - .config - .rustdoc_path - .clone() - .expect("no rustdoc built yet"), - ) + Command::new(&self.config.rustdoc_path.clone().expect("no rustdoc built yet")) }; // FIXME Why is -L here? rustc.arg(input_file); //.arg("-L").arg(&self.config.build_base); @@ -1953,18 +1833,11 @@ impl<'test> TestCx<'test> { rustc.arg("-Zthreads=1"); // Optionally prevent default --target if specified in test compile-flags. - let custom_target = self - .props - .compile_flags - .iter() - .any(|x| x.starts_with("--target")); + let custom_target = self.props.compile_flags.iter().any(|x| x.starts_with("--target")); if !custom_target { - let target = if self.props.force_host { - &*self.config.host - } else { - &*self.config.target - }; + let target = + if self.props.force_host { &*self.config.host } else { &*self.config.target }; rustc.arg(&format!("--target={}", target)); } @@ -1990,22 +1863,15 @@ impl<'test> TestCx<'test> { if self.props.error_patterns.is_empty() { rustc.args(&["--error-format", "json"]); } - if !self.props.disable_ui_testing_normalization { - rustc.arg("-Zui-testing"); - } + rustc.arg("-Zui-testing"); + rustc.arg("-Zdeduplicate-diagnostics=no"); } Ui => { - if !self - .props - .compile_flags - .iter() - .any(|s| s.starts_with("--error-format")) - { + if !self.props.compile_flags.iter().any(|s| s.starts_with("--error-format")) { rustc.args(&["--error-format", "json"]); } - if !self.props.disable_ui_testing_normalization { - rustc.arg("-Zui-testing"); - } + rustc.arg("-Zui-testing"); + rustc.arg("-Zdeduplicate-diagnostics=no"); } MirOpt => { rustc.args(&[ @@ -2023,19 +1889,18 @@ impl<'test> TestCx<'test> { rustc.arg(dir_opt); } - RunFail | RunPassValgrind | Pretty | DebugInfoCdb | DebugInfoGdbLldb | DebugInfoGdb - | DebugInfoLldb | Codegen | Rustdoc | RunMake | CodegenUnits | JsDocTest | Assembly => { + RunFail | RunPassValgrind | Pretty | DebugInfo | Codegen | Rustdoc | RunMake + | CodegenUnits | JsDocTest | Assembly => { // do not use JSON output } } - if let Some(PassMode::Check) = self.pass_mode() { + if let (false, EmitMetadata::Yes) = (is_rustdoc, emit_metadata) { rustc.args(&["--emit", "metadata"]); } if !is_rustdoc { - if self.config.target == "wasm32-unknown-unknown" - || self.is_vxworks_pure_static() { + if self.config.target == "wasm32-unknown-unknown" || self.is_vxworks_pure_static() { // rustc.arg("-g"); // get any backtrace at all on errors } else if !self.props.no_prefer_dynamic { rustc.args(&["-C", "prefer-dynamic"]); @@ -2067,11 +1932,15 @@ impl<'test> TestCx<'test> { } if self.props.force_host { - self.maybe_add_external_args(&mut rustc, - self.split_maybe_args(&self.config.host_rustcflags)); + self.maybe_add_external_args( + &mut rustc, + self.split_maybe_args(&self.config.host_rustcflags), + ); } else { - self.maybe_add_external_args(&mut rustc, - self.split_maybe_args(&self.config.target_rustcflags)); + self.maybe_add_external_args( + &mut rustc, + self.split_maybe_args(&self.config.target_rustcflags), + ); if !is_rustdoc { if let Some(ref linker) = self.config.linker { rustc.arg(format!("-Clinker={}", linker)); @@ -2080,8 +1949,7 @@ impl<'test> TestCx<'test> { } // Use dynamic musl for tests because static doesn't allow creating dylibs - if self.config.host.contains("musl") - || self.is_vxworks_pure_dynamic() { + if self.config.host.contains("musl") || self.is_vxworks_pure_dynamic() { rustc.arg("-Ctarget-feature=-crt-static"); } @@ -2128,10 +1996,15 @@ impl<'test> TestCx<'test> { self.fatal("no NodeJS binary found (--nodejs)"); } - let src = self.config.src_base - .parent().unwrap() // chop off `ui` - .parent().unwrap() // chop off `test` - .parent().unwrap(); // chop off `src` + let src = self + .config + .src_base + .parent() + .unwrap() // chop off `ui` + .parent() + .unwrap() // chop off `test` + .parent() + .unwrap(); // chop off `src` args.push(src.join("src/etc/wasm32-shim.js").display().to_string()); } @@ -2152,11 +2025,7 @@ impl<'test> TestCx<'test> { Some(ref s) => s .split(' ') .filter_map(|s| { - if s.chars().all(|c| c.is_whitespace()) { - None - } else { - Some(s.to_owned()) - } + if s.chars().all(|c| c.is_whitespace()) { None } else { Some(s.to_owned()) } }) .collect(), None => Vec::new(), @@ -2173,11 +2042,7 @@ impl<'test> TestCx<'test> { // Build the LD_LIBRARY_PATH variable as it would be seen on the command line // for diagnostic purposes fn lib_path_cmd_prefix(path: &str) -> String { - format!( - "{}=\"{}\"", - util::lib_path_env_var(), - util::make_new_path(path) - ) + format!("{}=\"{}\"", util::lib_path_env_var(), util::make_new_path(path)) } format!("{} {:?}", lib_path_cmd_prefix(libpath), command) @@ -2185,11 +2050,7 @@ impl<'test> TestCx<'test> { } fn dump_output(&self, out: &str, err: &str) { - let revision = if let Some(r) = self.revision { - format!("{}.", r) - } else { - String::new() - }; + let revision = if let Some(r) = self.revision { format!("{}.", r) } else { String::new() }; self.dump_output_file(out, &format!("{}out", revision)); self.dump_output_file(err, &format!("{}err", revision)); @@ -2223,11 +2084,7 @@ impl<'test> TestCx<'test> { /// The revision, ignored for incremental compilation since it wants all revisions in /// the same directory. fn safe_revision(&self) -> Option<&str> { - if self.config.mode == Incremental { - None - } else { - self.revision - } + if self.config.mode == Incremental { None } else { self.revision } } /// Gets the absolute path to the directory where all output for the given @@ -2278,7 +2135,8 @@ impl<'test> TestCx<'test> { let aux_dir = self.aux_output_dir_name(); let output_file = TargetLocation::ThisDirectory(self.output_base_dir()); - let mut rustc = self.make_compile_args(&self.testpaths.file, output_file); + let input_file = &self.testpaths.file; + let mut rustc = self.make_compile_args(input_file, output_file, EmitMetadata::No); rustc.arg("-L").arg(aux_dir).arg("--emit=llvm-ir"); self.compose_and_run_compiler(rustc, None) @@ -2290,7 +2148,8 @@ impl<'test> TestCx<'test> { let output_path = self.output_base_name().with_extension("s"); let output_file = TargetLocation::ThisFile(output_path.clone()); - let mut rustc = self.make_compile_args(&self.testpaths.file, output_file); + let input_file = &self.testpaths.file; + let mut rustc = self.make_compile_args(input_file, output_file, EmitMetadata::No); rustc.arg("-L").arg(self.aux_output_dir_name()); @@ -2312,10 +2171,7 @@ impl<'test> TestCx<'test> { fn verify_with_filecheck(&self, output: &Path) -> ProcRes { let mut filecheck = Command::new(self.config.llvm_filecheck.as_ref().unwrap()); - filecheck - .arg("--input-file") - .arg(output) - .arg(&self.testpaths.file); + filecheck.arg("--input-file").arg(output).arg(&self.testpaths.file); // It would be more appropriate to make most of the arguments configurable through // a comment-attribute similar to `compile-flags`. For example, --check-prefixes is a very // useful flag. @@ -2363,11 +2219,7 @@ impl<'test> TestCx<'test> { fn charset() -> &'static str { // FreeBSD 10.1 defaults to GDB 6.1.1 which doesn't support "auto" charset - if cfg!(target_os = "freebsd") { - "ISO-8859-1" - } else { - "UTF-8" - } + if cfg!(target_os = "freebsd") { "ISO-8859-1" } else { "UTF-8" } } fn run_rustdoc_test(&self) { @@ -2454,47 +2306,39 @@ impl<'test> TestCx<'test> { let mut path = self.testpaths.file.clone(); path.set_file_name(&format!("{}.rs", other_file)); files.insert( - path.strip_prefix(&cwd) - .unwrap_or(&path) - .to_str() - .unwrap() - .replace('\\', "/"), + path.strip_prefix(&cwd).unwrap_or(&path).to_str().unwrap().replace('\\', "/"), self.get_lines(&path, None), ); } let mut tested = 0; - for _ in res - .stdout - .split('\n') - .filter(|s| s.starts_with("test ")) - .inspect(|s| { - let tmp: Vec<&str> = s.split(" - ").collect(); - if tmp.len() == 2 { - let path = tmp[0].rsplit("test ").next().unwrap(); - if let Some(ref mut v) = files.get_mut(&path.replace('\\', "/")) { - tested += 1; - let mut iter = tmp[1].split("(line "); - iter.next(); - let line = iter - .next() - .unwrap_or(")") - .split(')') - .next() - .unwrap_or("0") - .parse() - .unwrap_or(0); - if let Ok(pos) = v.binary_search(&line) { - v.remove(pos); - } else { - self.fatal_proc_rec( - &format!("Not found doc test: \"{}\" in \"{}\":{:?}", s, path, v), - &res, - ); - } + for _ in res.stdout.split('\n').filter(|s| s.starts_with("test ")).inspect(|s| { + let tmp: Vec<&str> = s.split(" - ").collect(); + if tmp.len() == 2 { + let path = tmp[0].rsplit("test ").next().unwrap(); + if let Some(ref mut v) = files.get_mut(&path.replace('\\', "/")) { + tested += 1; + let mut iter = tmp[1].split("(line "); + iter.next(); + let line = iter + .next() + .unwrap_or(")") + .split(')') + .next() + .unwrap_or("0") + .parse() + .unwrap_or(0); + if let Ok(pos) = v.binary_search(&line) { + v.remove(pos); + } else { + self.fatal_proc_rec( + &format!("Not found doc test: \"{}\" in \"{}\":{:?}", s, path, v), + &res, + ); } } - }) {} + } + }) {} if tested == 0 { self.fatal_proc_rec(&format!("No test has been found... {:?}", files), &res); } else { @@ -2517,7 +2361,7 @@ impl<'test> TestCx<'test> { fn run_codegen_units_test(&self) { assert!(self.revision.is_none(), "revisions not relevant here"); - let proc_res = self.compile_test(); + let proc_res = self.compile_test(WillExecute::No, EmitMetadata::No); if !proc_res.status.success() { self.fatal_proc_rec("compilation failed!", &proc_res); @@ -2598,14 +2442,8 @@ impl<'test> TestCx<'test> { for &(ref expected_item, ref actual_item) in &wrong_cgus { println!("{}", expected_item.name); - println!( - " expected: {}", - codegen_units_to_str(&expected_item.codegen_units) - ); - println!( - " actual: {}", - codegen_units_to_str(&actual_item.codegen_units) - ); + println!(" expected: {}", codegen_units_to_str(&expected_item.codegen_units)); + println!(" actual: {}", codegen_units_to_str(&actual_item.codegen_units)); println!(); } } @@ -2623,19 +2461,12 @@ impl<'test> TestCx<'test> { // [MONO_ITEM] name [@@ (cgu)+] fn str_to_mono_item(s: &str, cgu_has_crate_disambiguator: bool) -> MonoItem { - let s = if s.starts_with(PREFIX) { - (&s[PREFIX.len()..]).trim() - } else { - s.trim() - }; + let s = if s.starts_with(PREFIX) { (&s[PREFIX.len()..]).trim() } else { s.trim() }; let full_string = format!("{}{}", PREFIX, s); - let parts: Vec<&str> = s - .split(CGU_MARKER) - .map(str::trim) - .filter(|s| !s.is_empty()) - .collect(); + let parts: Vec<&str> = + s.split(CGU_MARKER).map(str::trim).filter(|s| !s.is_empty()).collect(); let name = parts[0].trim(); @@ -2658,11 +2489,7 @@ impl<'test> TestCx<'test> { HashSet::new() }; - MonoItem { - name: name.to_owned(), - codegen_units: cgus, - string: full_string, - } + MonoItem { name: name.to_owned(), codegen_units: cgus, string: full_string } } fn codegen_units_to_str(cgus: &HashSet<String>) -> String { @@ -2683,23 +2510,22 @@ impl<'test> TestCx<'test> { // remove all crate-disambiguators. fn remove_crate_disambiguator_from_cgu(cgu: &str) -> String { lazy_static! { - static ref RE: Regex = Regex::new( - r"^[^\.]+(?P<d1>\.[[:alnum:]]+)(-in-[^\.]+(?P<d2>\.[[:alnum:]]+))?" - ).unwrap(); + static ref RE: Regex = + Regex::new(r"^[^\.]+(?P<d1>\.[[:alnum:]]+)(-in-[^\.]+(?P<d2>\.[[:alnum:]]+))?") + .unwrap(); } - let captures = RE.captures(cgu).unwrap_or_else(|| { - panic!("invalid cgu name encountered: {}", cgu) - }); + let captures = + RE.captures(cgu).unwrap_or_else(|| panic!("invalid cgu name encountered: {}", cgu)); let mut new_name = cgu.to_owned(); if let Some(d2) = captures.name("d2") { - new_name.replace_range(d2.start() .. d2.end(), ""); + new_name.replace_range(d2.start()..d2.end(), ""); } let d1 = captures.name("d1").unwrap(); - new_name.replace_range(d1.start() .. d1.end(), ""); + new_name.replace_range(d1.start()..d1.end(), ""); new_name } @@ -2722,10 +2548,7 @@ impl<'test> TestCx<'test> { fs::create_dir_all(&incremental_dir).unwrap(); if self.config.verbose { - print!( - "init_incremental_test: incremental_dir={}", - incremental_dir.display() - ); + print!("init_incremental_test: incremental_dir={}", incremental_dir.display()); } } @@ -2749,16 +2572,11 @@ impl<'test> TestCx<'test> { // FIXME -- use non-incremental mode as an oracle? That doesn't apply // to #[rustc_dirty] and clean tests I guess - let revision = self - .revision - .expect("incremental tests require a list of revisions"); + let revision = self.revision.expect("incremental tests require a list of revisions"); // Incremental workproduct directory should have already been created. let incremental_dir = self.incremental_dir(); - assert!( - incremental_dir.exists(), - "init_incremental_test failed to create incremental dir" - ); + assert!(incremental_dir.exists(), "init_incremental_test failed to create incremental dir"); // Add an extra flag pointing at the incremental directory. let mut revision_props = self.props.clone(); @@ -2772,10 +2590,7 @@ impl<'test> TestCx<'test> { }; if self.config.verbose { - print!( - "revision={:?} revision_props={:#?}", - revision, revision_props - ); + print!("revision={:?} revision_props={:#?}", revision, revision_props); } if revision.starts_with("rpass") { @@ -2802,15 +2617,7 @@ impl<'test> TestCx<'test> { fn run_rmake_test(&self) { let cwd = env::current_dir().unwrap(); - let src_root = self - .config - .src_base - .parent() - .unwrap() - .parent() - .unwrap() - .parent() - .unwrap(); + let src_root = self.config.src_base.parent().unwrap().parent().unwrap().parent().unwrap(); let src_root = cwd.join(&src_root); let tmpdir = cwd.join(self.output_base_name()); @@ -2845,7 +2652,6 @@ impl<'test> TestCx<'test> { .env("TARGET_RPATH_DIR", cwd.join(&self.config.run_lib_path)) .env("LLVM_COMPONENTS", &self.config.llvm_components) .env("LLVM_CXXFLAGS", &self.config.llvm_cxxflags) - // We for sure don't want these tests to run in parallel, so make // sure they don't have access to these vars if we run via `make` // at the top level @@ -2883,8 +2689,7 @@ impl<'test> TestCx<'test> { // Use dynamic musl for tests because static doesn't allow creating dylibs if self.config.host.contains("musl") { - cmd.env("RUSTFLAGS", "-Ctarget-feature=-crt-static") - .env("IS_MUSL_HOST", "1"); + cmd.env("RUSTFLAGS", "-Ctarget-feature=-crt-static").env("IS_MUSL_HOST", "1"); } if self.config.target.contains("msvc") && self.config.cc != "" { @@ -2918,10 +2723,7 @@ impl<'test> TestCx<'test> { } } - let output = cmd - .spawn() - .and_then(read2_abbreviated) - .expect("failed to spawn `make`"); + let output = cmd.spawn().and_then(read2_abbreviated).expect("failed to spawn `make`"); if !output.status.success() { let res = ProcRes { status: output.status, @@ -2977,12 +2779,15 @@ impl<'test> TestCx<'test> { } } - fn load_compare_outputs(&self, proc_res: &ProcRes, - output_kind: TestOutput, explicit_format: bool) -> usize { - + fn load_compare_outputs( + &self, + proc_res: &ProcRes, + output_kind: TestOutput, + explicit_format: bool, + ) -> usize { let (stderr_kind, stdout_kind) = match output_kind { TestOutput::Compile => (UI_STDERR, UI_STDOUT), - TestOutput::Run => (UI_RUN_STDERR, UI_RUN_STDOUT) + TestOutput::Run => (UI_RUN_STDERR, UI_RUN_STDOUT), }; let expected_stderr = self.load_expected_output(stderr_kind); @@ -2997,14 +2802,17 @@ impl<'test> TestCx<'test> { lazy_static! { static ref REMOTE_TEST_RE: Regex = Regex::new( "^uploaded \"\\$TEST_BUILD_DIR(/[[:alnum:]_\\-]+)+\", waiting for result\n" - ).unwrap(); + ) + .unwrap(); } - REMOTE_TEST_RE.replace( - &self.normalize_output(&proc_res.stdout, &self.props.normalize_stdout), - "" - ).to_string() - } - _ => self.normalize_output(&proc_res.stdout, &self.props.normalize_stdout) + REMOTE_TEST_RE + .replace( + &self.normalize_output(&proc_res.stdout, &self.props.normalize_stdout), + "", + ) + .to_string() + } + _ => self.normalize_output(&proc_res.stdout, &self.props.normalize_stdout), }; let stderr = if explicit_format { @@ -3033,16 +2841,23 @@ impl<'test> TestCx<'test> { } fn run_ui_test(&self) { + if let Some(FailMode::Build) = self.props.fail_mode { + // Make sure a build-fail test cannot fail due to failing analysis (e.g. typeck). + let pm = Some(PassMode::Check); + let proc_res = self.compile_test_general(WillExecute::No, EmitMetadata::Yes, pm); + self.check_if_test_should_compile(&proc_res, pm); + } + + let pm = self.pass_mode(); + let should_run = self.should_run(pm); + let emit_metadata = self.should_emit_metadata(pm); + let proc_res = self.compile_test(should_run, emit_metadata); + self.check_if_test_should_compile(&proc_res, pm); + // if the user specified a format in the ui test // print the output to the stderr file, otherwise extract // the rendered error messages from json and print them - let explicit = self - .props - .compile_flags - .iter() - .any(|s| s.contains("--error-format")); - let proc_res = self.compile_test(); - self.check_if_test_should_compile(&proc_res); + let explicit = self.props.compile_flags.iter().any(|s| s.contains("--error-format")); let expected_fixed = self.load_expected_output(UI_FIXED); @@ -3062,30 +2877,30 @@ impl<'test> TestCx<'test> { let suggestions = get_suggestions_from_json( &proc_res.stderr, &HashSet::new(), - Filter::MachineApplicableOnly - ).unwrap_or_default(); + Filter::MachineApplicableOnly, + ) + .unwrap_or_default(); if suggestions.len() > 0 && !self.props.run_rustfix - && !self.props.rustfix_only_machine_applicable { - let mut coverage_file_path = self.config.build_base.clone(); - coverage_file_path.push("rustfix_missing_coverage.txt"); - debug!("coverage_file_path: {}", coverage_file_path.display()); - - let mut file = OpenOptions::new() - .create(true) - .append(true) - .open(coverage_file_path.as_path()) - .expect("could not create or open file"); - - if let Err(_) = writeln!(file, "{}", self.testpaths.file.display()) { - panic!("couldn't write to {}", coverage_file_path.display()); - } + && !self.props.rustfix_only_machine_applicable + { + let mut coverage_file_path = self.config.build_base.clone(); + coverage_file_path.push("rustfix_missing_coverage.txt"); + debug!("coverage_file_path: {}", coverage_file_path.display()); + + let mut file = OpenOptions::new() + .create(true) + .append(true) + .open(coverage_file_path.as_path()) + .expect("could not create or open file"); + + if let Err(_) = writeln!(file, "{}", self.testpaths.file.display()) { + panic!("couldn't write to {}", coverage_file_path.display()); + } } } else if self.props.run_rustfix { // Apply suggestions from rustc to the code itself - let unfixed_code = self - .load_expected_output_from_path(&self.testpaths.file) - .unwrap(); + let unfixed_code = self.load_expected_output_from_path(&self.testpaths.file).unwrap(); let suggestions = get_suggestions_from_json( &proc_res.stderr, &HashSet::new(), @@ -3094,7 +2909,8 @@ impl<'test> TestCx<'test> { } else { Filter::Everything }, - ).unwrap(); + ) + .unwrap(); let fixed_code = apply_suggestions(&unfixed_code, &suggestions).expect(&format!( "failed to apply suggestions for {:?} with rustfix", self.testpaths.file @@ -3110,10 +2926,8 @@ impl<'test> TestCx<'test> { if errors > 0 { println!("To update references, rerun the tests and pass the `--bless` flag"); - let relative_path_to_file = self - .testpaths - .relative_dir - .join(self.testpaths.file.file_name().unwrap()); + let relative_path_to_file = + self.testpaths.relative_dir.join(self.testpaths.file.file_name().unwrap()); println!( "To only update this specific test, also pass `--test-args {}`", relative_path_to_file.display(), @@ -3126,7 +2940,7 @@ impl<'test> TestCx<'test> { let expected_errors = errors::load_errors(&self.testpaths.file, self.revision); - if self.should_run() { + if let WillExecute::Yes = should_run { let proc_res = self.exec_compiled_test(); let run_output_errors = if self.props.check_run_results { self.load_compare_outputs(&proc_res, TestOutput::Run, explicit) @@ -3135,11 +2949,11 @@ impl<'test> TestCx<'test> { }; if run_output_errors > 0 { self.fatal_proc_rec( - &format!("{} errors occured comparing run output.", run_output_errors), + &format!("{} errors occurred comparing run output.", run_output_errors), &proc_res, ); } - if self.should_run_successfully() { + if self.should_run_successfully(pm) { if !proc_res.status.success() { self.fatal_proc_rec("test run failed!", &proc_res); } @@ -3150,26 +2964,28 @@ impl<'test> TestCx<'test> { } if !self.props.error_patterns.is_empty() { // "// error-pattern" comments - self.check_error_patterns(&proc_res.stderr, &proc_res); + self.check_error_patterns(&proc_res.stderr, &proc_res, pm); } } - debug!("run_ui_test: explicit={:?} config.compare_mode={:?} expected_errors={:?} \ + debug!( + "run_ui_test: explicit={:?} config.compare_mode={:?} expected_errors={:?} \ proc_res.status={:?} props.error_patterns={:?}", - explicit, self.config.compare_mode, expected_errors, proc_res.status, - self.props.error_patterns); + explicit, + self.config.compare_mode, + expected_errors, + proc_res.status, + self.props.error_patterns + ); if !explicit && self.config.compare_mode.is_none() { let check_patterns = - !self.should_run() && - !self.props.error_patterns.is_empty(); + should_run == WillExecute::No && !self.props.error_patterns.is_empty(); - let check_annotations = - !check_patterns || - !expected_errors.is_empty(); + let check_annotations = !check_patterns || !expected_errors.is_empty(); if check_patterns { // "// error-pattern" comments - self.check_error_patterns(&proc_res.stderr, &proc_res); + self.check_error_patterns(&proc_res.stderr, &proc_res, pm); } if check_annotations { @@ -3184,6 +3000,7 @@ impl<'test> TestCx<'test> { let mut rustc = self.make_compile_args( &self.testpaths.file.with_extension(UI_FIXED), TargetLocation::ThisFile(self.make_exe_name()), + emit_metadata, ); rustc.arg("-L").arg(&self.aux_output_dir_name()); let res = self.compose_and_run_compiler(rustc, None); @@ -3197,7 +3014,7 @@ impl<'test> TestCx<'test> { } fn run_mir_opt_test(&self) { - let proc_res = self.compile_test(); + let proc_res = self.compile_test(WillExecute::Yes, EmitMetadata::No); if !proc_res.status.success() { self.fatal_proc_rec("compilation failed!", &proc_res); @@ -3250,10 +3067,7 @@ impl<'test> TestCx<'test> { let output_time = t(output_file); let source_time = t(source_file); if source_time > output_time { - debug!( - "source file time: {:?} output file time: {:?}", - source_time, output_time - ); + debug!("source file time: {:?} output file time: {:?}", source_time, output_time); panic!( "test source file `{}` is newer than potentially stale output file `{}`.", source_file.display(), @@ -3277,19 +3091,11 @@ impl<'test> TestCx<'test> { self.check_mir_test_timestamp(test_name, &output_file); let dumped_string = fs::read_to_string(&output_file).unwrap(); - let mut dumped_lines = dumped_string - .lines() - .map(|l| nocomment_mir_line(l)) - .filter(|l| !l.is_empty()); + let mut dumped_lines = + dumped_string.lines().map(|l| nocomment_mir_line(l)).filter(|l| !l.is_empty()); let mut expected_lines = expected_content .iter() - .filter(|&l| { - if let &ExpectedLine::Text(l) = l { - !l.is_empty() - } else { - true - } - }) + .filter(|&l| if let &ExpectedLine::Text(l) = l { !l.is_empty() } else { true }) .peekable(); let compare = |expected_line, dumped_line| { @@ -3311,11 +3117,8 @@ impl<'test> TestCx<'test> { &ExpectedLine::Elision => "... (elided)".into(), &ExpectedLine::Text(t) => t, }; - let expected_content = expected_content - .iter() - .map(|l| f(l)) - .collect::<Vec<_>>() - .join("\n"); + let expected_content = + expected_content.iter().map(|l| f(l)).collect::<Vec<_>>().join("\n"); panic!( "Did not find expected line, error: {}\n\ Expected Line: {:?}\n\ @@ -3433,16 +3236,18 @@ impl<'test> TestCx<'test> { // with placeholders as we do not want tests needing updated when compiler source code // changes. // eg. $SRC_DIR/libcore/mem.rs:323:14 becomes $SRC_DIR/libcore/mem.rs:LL:COL - normalized = Regex::new("SRC_DIR(.+):\\d+:\\d+").unwrap() - .replace_all(&normalized, "SRC_DIR$1:LL:COL").into_owned(); + normalized = Regex::new("SRC_DIR(.+):\\d+:\\d+") + .unwrap() + .replace_all(&normalized, "SRC_DIR$1:LL:COL") + .into_owned(); normalized = Self::normalize_platform_differences(&normalized); normalized = normalized.replace("\t", "\\t"); // makes tabs visible // Remove test annotations like `//~ ERROR text` from the output, // since they duplicate actual errors and make the output hard to read. - normalized = Regex::new("\\s*//(\\[.*\\])?~.*").unwrap() - .replace_all(&normalized, "").into_owned(); + normalized = + Regex::new("\\s*//(\\[.*\\])?~.*").unwrap().replace_all(&normalized, "").into_owned(); for rule in custom_rules { let re = Regex::new(&rule.0).expect("bad regex in custom normalization rule"); @@ -3475,19 +3280,17 @@ impl<'test> TestCx<'test> { let output = output.replace(r"\\", r"\"); - PATH_BACKSLASH_RE.replace_all(&output, |caps: &Captures<'_>| { - println!("{}", &caps[0]); - caps[0].replace(r"\", "/") - }).replace("\r\n", "\n") + PATH_BACKSLASH_RE + .replace_all(&output, |caps: &Captures<'_>| { + println!("{}", &caps[0]); + caps[0].replace(r"\", "/") + }) + .replace("\r\n", "\n") } fn expected_output_path(&self, kind: &str) -> PathBuf { - let mut path = expected_output_path( - &self.testpaths, - self.revision, - &self.config.compare_mode, - kind, - ); + let mut path = + expected_output_path(&self.testpaths, self.revision, &self.config.compare_mode, kind); if !path.exists() { if let Some(CompareMode::Polonius) = self.config.compare_mode { @@ -3527,11 +3330,7 @@ impl<'test> TestCx<'test> { fn delete_file(&self, file: &PathBuf) { if let Err(e) = fs::remove_file(file) { - self.fatal(&format!( - "failed to delete `{}`: {}", - file.display(), - e, - )); + self.fatal(&format!("failed to delete `{}`: {}", file.display(), e,)); } } @@ -3602,24 +3401,14 @@ impl<'test> TestCx<'test> { for output_file in files { println!("Actual {} saved to {}", kind, output_file.display()); } - if self.config.bless { - 0 - } else { - 1 - } + if self.config.bless { 0 } else { 1 } } fn prune_duplicate_output(&self, mode: CompareMode, kind: &str, canon_content: &str) { - let examined_path = expected_output_path( - &self.testpaths, - self.revision, - &Some(mode), - kind, - ); + let examined_path = expected_output_path(&self.testpaths, self.revision, &Some(mode), kind); - let examined_content = self - .load_expected_output_from_path(&examined_path) - .unwrap_or_else(|_| String::new()); + let examined_content = + self.load_expected_output_from_path(&examined_path).unwrap_or_else(|_| String::new()); if examined_path.exists() && canon_content == &examined_content { self.delete_file(&examined_path); @@ -3629,12 +3418,8 @@ impl<'test> TestCx<'test> { fn prune_duplicate_outputs(&self, modes: &[CompareMode]) { if self.config.bless { for kind in UI_EXTENSIONS { - let canon_comparison_path = expected_output_path( - &self.testpaths, - self.revision, - &None, - kind, - ); + let canon_comparison_path = + expected_output_path(&self.testpaths, self.revision, &None, kind); if let Ok(canon) = self.load_expected_output_from_path(&canon_comparison_path) { for mode in modes { @@ -3681,7 +3466,8 @@ impl ProcRes { {}\n\ ------------------------------------------\n\ \n", - self.status, self.cmdline, + self.status, + self.cmdline, json::extract_rendered(&self.stdout), json::extract_rendered(&self.stderr), ); @@ -3737,11 +3523,7 @@ fn read2_abbreviated(mut child: Child) -> io::Result<Output> { enum ProcOutput { Full(Vec<u8>), - Abbreviated { - head: Vec<u8>, - skipped: usize, - tail: Box<[u8]>, - }, + Abbreviated { head: Vec<u8>, skipped: usize, tail: Box<[u8]> }, } impl ProcOutput { @@ -3756,17 +3538,9 @@ fn read2_abbreviated(mut child: Child) -> io::Result<Output> { let tail = bytes.split_off(new_len - TAIL_LEN).into_boxed_slice(); let head = replace(bytes, Vec::new()); let skipped = new_len - HEAD_LEN - TAIL_LEN; - ProcOutput::Abbreviated { - head, - skipped, - tail, - } + ProcOutput::Abbreviated { head, skipped, tail } } - ProcOutput::Abbreviated { - ref mut skipped, - ref mut tail, - .. - } => { + ProcOutput::Abbreviated { ref mut skipped, ref mut tail, .. } => { *skipped += data.len(); if data.len() <= TAIL_LEN { tail[..data.len()].copy_from_slice(data); @@ -3783,11 +3557,7 @@ fn read2_abbreviated(mut child: Child) -> io::Result<Output> { fn into_bytes(self) -> Vec<u8> { match self { ProcOutput::Full(bytes) => bytes, - ProcOutput::Abbreviated { - mut head, - skipped, - tail, - } => { + ProcOutput::Abbreviated { mut head, skipped, tail } => { write!(&mut head, "\n\n<<<<<< SKIPPED {} BYTES >>>>>>\n\n", skipped).unwrap(); head.extend_from_slice(&tail); head @@ -3810,9 +3580,5 @@ fn read2_abbreviated(mut child: Child) -> io::Result<Output> { )?; let status = child.wait()?; - Ok(Output { - status, - stdout: stdout.into_bytes(), - stderr: stderr.into_bytes(), - }) + Ok(Output { status, stdout: stdout.into_bytes(), stderr: stderr.into_bytes() }) } diff --git a/src/tools/compiletest/src/runtest/tests.rs b/src/tools/compiletest/src/runtest/tests.rs index 79128aa9c6..5110511117 100644 --- a/src/tools/compiletest/src/runtest/tests.rs +++ b/src/tools/compiletest/src/runtest/tests.rs @@ -2,10 +2,7 @@ use super::*; #[test] fn normalize_platform_differences() { - assert_eq!( - TestCx::normalize_platform_differences(r"$DIR\foo.rs"), - "$DIR/foo.rs" - ); + assert_eq!(TestCx::normalize_platform_differences(r"$DIR\foo.rs"), "$DIR/foo.rs"); assert_eq!( TestCx::normalize_platform_differences(r"$BUILD_DIR\..\parser.rs"), "$BUILD_DIR/../parser.rs" @@ -18,14 +15,8 @@ fn normalize_platform_differences() { TestCx::normalize_platform_differences(r"either bar\baz.rs or bar\baz\mod.rs"), r"either bar/baz.rs or bar/baz/mod.rs", ); - assert_eq!( - TestCx::normalize_platform_differences(r"`.\some\path.rs`"), - r"`./some/path.rs`", - ); - assert_eq!( - TestCx::normalize_platform_differences(r"`some\path.rs`"), - r"`some/path.rs`", - ); + assert_eq!(TestCx::normalize_platform_differences(r"`.\some\path.rs`"), r"`./some/path.rs`",); + assert_eq!(TestCx::normalize_platform_differences(r"`some\path.rs`"), r"`some/path.rs`",); assert_eq!( TestCx::normalize_platform_differences(r"$DIR\path-with-dashes.rs"), r"$DIR/path-with-dashes.rs" @@ -34,9 +25,7 @@ fn normalize_platform_differences() { TestCx::normalize_platform_differences(r"$DIR\path_with_underscores.rs"), r"$DIR/path_with_underscores.rs", ); - assert_eq!( - TestCx::normalize_platform_differences(r"$DIR\foo.rs:12:11"), "$DIR/foo.rs:12:11", - ); + assert_eq!(TestCx::normalize_platform_differences(r"$DIR\foo.rs:12:11"), "$DIR/foo.rs:12:11",); assert_eq!( TestCx::normalize_platform_differences(r"$DIR\path with spaces 'n' quotes"), "$DIR/path with spaces 'n' quotes", diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs index 3a2ee44508..2663b3d160 100644 --- a/src/tools/compiletest/src/util.rs +++ b/src/tools/compiletest/src/util.rs @@ -1,7 +1,7 @@ -use std::ffi::OsStr; +use crate::common::Config; use std::env; +use std::ffi::OsStr; use std::path::PathBuf; -use crate::common::Config; use log::*; @@ -67,6 +67,7 @@ const ARCH_TABLE: &'static [(&'static str, &'static str)] = &[ ("powerpc", "powerpc"), ("powerpc64", "powerpc64"), ("powerpc64le", "powerpc64"), + ("riscv64gc", "riscv64"), ("s390x", "s390x"), ("sparc", "sparc"), ("sparc64", "sparc64"), @@ -106,11 +107,7 @@ pub fn get_arch(triple: &str) -> &'static str { } pub fn matches_env(triple: &str, name: &str) -> bool { - if let Some(env) = triple.split('-').nth(3) { - env.starts_with(name) - } else { - false - } + if let Some(env) = triple.split('-').nth(3) { env.starts_with(name) } else { false } } pub fn get_pointer_width(triple: &str) -> &'static str { diff --git a/src/tools/error_index_generator/build.rs b/src/tools/error_index_generator/build.rs index b6e7ede17e..efa4177d1d 100644 --- a/src/tools/error_index_generator/build.rs +++ b/src/tools/error_index_generator/build.rs @@ -1,6 +1,6 @@ -use walkdir::WalkDir; use std::path::PathBuf; use std::{env, fs}; +use walkdir::WalkDir; fn main() { // The src directory (we are in src/tools/error_index_generator) @@ -12,8 +12,9 @@ fn main() { let error_codes_path = "../../../src/librustc_error_codes/error_codes.rs"; println!("cargo:rerun-if-changed={}", error_codes_path); - let file = fs::read_to_string(error_codes_path).unwrap() - .replace(": include_str!(\"./error_codes/", ": include_str!(\"./"); + let file = fs::read_to_string(error_codes_path) + .unwrap() + .replace(": include_str!(\"./error_codes/", ": include_str!(\"./"); let contents = format!("(|| {{\n{}\n}})()", file); fs::write(&out_dir.join("all_error_codes.rs"), &contents).unwrap(); @@ -30,7 +31,8 @@ fn main() { } let mut all = String::new(); - all.push_str(r###" + all.push_str( + r###" fn register_all() -> Vec<(&'static str, Option<&'static str>)> { let mut long_codes: Vec<(&'static str, Option<&'static str>)> = Vec::new(); macro_rules! register_diagnostics { @@ -51,7 +53,8 @@ fn register_all() -> Vec<(&'static str, Option<&'static str>)> { )* ) } -"###); +"###, + ); all.push_str(r#"include!(concat!(env!("OUT_DIR"), "/all_error_codes.rs"));"#); all.push_str("\nlong_codes\n"); all.push_str("}\n"); diff --git a/src/tools/error_index_generator/main.rs b/src/tools/error_index_generator/main.rs index 31a802706c..313a303edb 100644 --- a/src/tools/error_index_generator/main.rs +++ b/src/tools/error_index_generator/main.rs @@ -2,8 +2,10 @@ #![deny(warnings)] extern crate env_logger; +extern crate rustc_span; extern crate syntax; +use std::cell::RefCell; use std::collections::BTreeMap; use std::env; use std::error::Error; @@ -11,11 +13,10 @@ use std::fs::File; use std::io::Write; use std::path::Path; use std::path::PathBuf; -use std::cell::RefCell; -use syntax::edition::DEFAULT_EDITION; +use rustc_span::edition::DEFAULT_EDITION; -use rustdoc::html::markdown::{Markdown, IdMap, ErrorCodes, Playground}; +use rustdoc::html::markdown::{ErrorCodes, IdMap, Markdown, Playground}; pub struct ErrorMetadata { pub description: Option<String>, @@ -33,10 +34,12 @@ enum OutputFormat { impl OutputFormat { fn from(format: &str, resource_suffix: &str) -> OutputFormat { match &*format.to_lowercase() { - "html" => OutputFormat::HTML(HTMLFormatter(RefCell::new(IdMap::new()), - resource_suffix.to_owned())), + "html" => OutputFormat::HTML(HTMLFormatter( + RefCell::new(IdMap::new()), + resource_suffix.to_owned(), + )), "markdown" => OutputFormat::Markdown(MarkdownFormatter), - s => OutputFormat::Unknown(s.to_owned()), + s => OutputFormat::Unknown(s.to_owned()), } } } @@ -44,8 +47,12 @@ impl OutputFormat { trait Formatter { fn header(&self, output: &mut dyn Write) -> Result<(), Box<dyn Error>>; fn title(&self, output: &mut dyn Write) -> Result<(), Box<dyn Error>>; - fn error_code_block(&self, output: &mut dyn Write, info: &ErrorMetadata, - err_code: &str) -> Result<(), Box<dyn Error>>; + fn error_code_block( + &self, + output: &mut dyn Write, + info: &ErrorMetadata, + err_code: &str, + ) -> Result<(), Box<dyn Error>>; fn footer(&self, output: &mut dyn Write) -> Result<(), Box<dyn Error>>; } @@ -54,7 +61,9 @@ struct MarkdownFormatter; impl Formatter for HTMLFormatter { fn header(&self, output: &mut dyn Write) -> Result<(), Box<dyn Error>> { - write!(output, r##"<!DOCTYPE html> + write!( + output, + r##"<!DOCTYPE html> <html> <head> <title>Rust Compiler Error Index @@ -69,7 +78,9 @@ impl Formatter for HTMLFormatter { -"##, suffix=self.1)?; +"##, + suffix = self.1 + )?; Ok(()) } @@ -78,8 +89,12 @@ impl Formatter for HTMLFormatter { Ok(()) } - fn error_code_block(&self, output: &mut dyn Write, info: &ErrorMetadata, - err_code: &str) -> Result<(), Box> { + fn error_code_block( + &self, + output: &mut dyn Write, + info: &ErrorMetadata, + err_code: &str, + ) -> Result<(), Box> { // Enclose each error in a div so they can be shown/hidden en masse. let desc_desc = match info.description { Some(_) => "error-described", @@ -88,9 +103,11 @@ impl Formatter for HTMLFormatter { write!(output, "
    ", desc_desc)?; // Error title (with self-link). - write!(output, - "

    {0}

    \n", - err_code)?; + write!( + output, + "

    {0}

    \n", + err_code + )?; // Description rendered as markdown. match info.description { @@ -100,10 +117,20 @@ impl Formatter for HTMLFormatter { crate_name: None, url: String::from("https://play.rust-lang.org/"), }; - write!(output, "{}", - Markdown(desc, &[], &mut id_map, - ErrorCodes::Yes, DEFAULT_EDITION, &Some(playground)).to_string())? - }, + write!( + output, + "{}", + Markdown( + desc, + &[], + &mut id_map, + ErrorCodes::Yes, + DEFAULT_EDITION, + &Some(playground) + ) + .to_string() + )? + } None => write!(output, "

    No description.

    \n")?, } @@ -112,7 +139,9 @@ impl Formatter for HTMLFormatter { } fn footer(&self, output: &mut dyn Write) -> Result<(), Box> { - write!(output, r##" -"##)?; +"## + )?; Ok(()) } } @@ -186,8 +216,12 @@ impl Formatter for MarkdownFormatter { Ok(()) } - fn error_code_block(&self, output: &mut dyn Write, info: &ErrorMetadata, - err_code: &str) -> Result<(), Box> { + fn error_code_block( + &self, + output: &mut dyn Write, + info: &ErrorMetadata, + err_code: &str, + ) -> Result<(), Box> { Ok(match info.description { Some(ref desc) => write!(output, "## {}\n{}\n", err_code, desc)?, None => (), @@ -201,8 +235,11 @@ impl Formatter for MarkdownFormatter { } /// Output an HTML page for the errors in `err_map` to `output_path`. -fn render_error_page(err_map: &ErrorMetadataMap, output_path: &Path, - formatter: T) -> Result<(), Box> { +fn render_error_page( + err_map: &ErrorMetadataMap, + output_path: &Path, + formatter: T, +) -> Result<(), Box> { let mut output_file = File::create(output_path)?; formatter.header(&mut output_file)?; @@ -219,13 +256,11 @@ fn main_with_result(format: OutputFormat, dst: &Path) -> Result<(), Box panic!("Unknown output format: {}", s), - OutputFormat::HTML(h) => render_error_page(&err_map, dst, h)?, + OutputFormat::Unknown(s) => panic!("Unknown output format: {}", s), + OutputFormat::HTML(h) => render_error_page(&err_map, dst, h)?, OutputFormat::Markdown(m) => render_error_page(&err_map, dst, m)?, } Ok(()) @@ -236,14 +271,13 @@ fn parse_args() -> (OutputFormat, PathBuf) { let format = args.next(); let dst = args.next(); let resource_suffix = args.next().unwrap_or_else(String::new); - let format = format.map(|a| OutputFormat::from(&a, &resource_suffix)) - .unwrap_or(OutputFormat::from("html", &resource_suffix)); - let dst = dst.map(PathBuf::from).unwrap_or_else(|| { - match format { - OutputFormat::HTML(..) => PathBuf::from("doc/error-index.html"), - OutputFormat::Markdown(..) => PathBuf::from("doc/error-index.md"), - OutputFormat::Unknown(..) => PathBuf::from(""), - } + let format = format + .map(|a| OutputFormat::from(&a, &resource_suffix)) + .unwrap_or(OutputFormat::from("html", &resource_suffix)); + let dst = dst.map(PathBuf::from).unwrap_or_else(|| match format { + OutputFormat::HTML(..) => PathBuf::from("doc/error-index.html"), + OutputFormat::Markdown(..) => PathBuf::from("doc/error-index.md"), + OutputFormat::Unknown(..) => PathBuf::from(""), }); (format, dst) } @@ -251,11 +285,9 @@ fn parse_args() -> (OutputFormat, PathBuf) { fn main() { env_logger::init(); let (format, dst) = parse_args(); - let result = syntax::with_default_globals(move || { - main_with_result(format, &dst) - }); + let result = syntax::with_default_globals(move || main_with_result(format, &dst)); if let Err(e) = result { - panic!("{}", e.description()); + panic!("{}", e.to_string()); } } diff --git a/src/tools/linkchecker/main.rs b/src/tools/linkchecker/main.rs index 79c98b780e..fb4611ed1c 100644 --- a/src/tools/linkchecker/main.rs +++ b/src/tools/linkchecker/main.rs @@ -20,16 +20,18 @@ use std::collections::hash_map::Entry; use std::collections::{HashMap, HashSet}; use std::env; use std::fs; -use std::path::{Path, PathBuf, Component}; +use std::path::{Component, Path, PathBuf}; use std::rc::Rc; use crate::Redirect::*; macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {:?}", stringify!($e), e), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {:?}", stringify!($e), e), + } + }; } fn main() { @@ -63,17 +65,17 @@ type Cache = HashMap; fn small_url_encode(s: &str) -> String { s.replace("<", "%3C") - .replace(">", "%3E") - .replace(" ", "%20") - .replace("?", "%3F") - .replace("'", "%27") - .replace("&", "%26") - .replace(",", "%2C") - .replace(":", "%3A") - .replace(";", "%3B") - .replace("[", "%5B") - .replace("]", "%5D") - .replace("\"", "%22") + .replace(">", "%3E") + .replace(" ", "%20") + .replace("?", "%3F") + .replace("'", "%27") + .replace("&", "%26") + .replace(",", "%2C") + .replace(":", "%3A") + .replace(";", "%3B") + .replace("[", "%5B") + .replace("]", "%5D") + .replace("\"", "%22") } impl FileEntry { @@ -111,11 +113,7 @@ fn walk(cache: &mut Cache, root: &Path, dir: &Path, errors: &mut bool) { } } -fn check(cache: &mut Cache, - root: &Path, - file: &Path, - errors: &mut bool) - -> Option { +fn check(cache: &mut Cache, root: &Path, file: &Path, errors: &mut bool) -> Option { // Ignore none HTML files. if file.extension().and_then(|s| s.to_str()) != Some("html") { return None; @@ -124,32 +122,23 @@ fn check(cache: &mut Cache, // Unfortunately we're not 100% full of valid links today to we need a few // whitelists to get this past `make check` today. // FIXME(#32129) - if file.ends_with("std/string/struct.String.html") || - file.ends_with("interpret/struct.ImmTy.html") || - file.ends_with("ast/struct.ThinVec.html") || - file.ends_with("util/struct.ThinVec.html") || - file.ends_with("layout/struct.TyLayout.html") || - file.ends_with("humantime/struct.Timestamp.html") || - file.ends_with("log/index.html") || - file.ends_with("ty/struct.Slice.html") || - file.ends_with("ty/enum.Attributes.html") || - file.ends_with("ty/struct.SymbolName.html") || - file.ends_with("io/struct.IoSlice.html") || - file.ends_with("io/struct.IoSliceMut.html") { + if file.ends_with("std/io/struct.IoSlice.html") + || file.ends_with("std/string/struct.String.html") + { return None; } // FIXME(#32553) - if file.ends_with("string/struct.String.html") { + if file.ends_with("alloc/string/struct.String.html") { return None; } // FIXME(#32130) - if file.ends_with("btree_set/struct.BTreeSet.html") || - file.ends_with("struct.BTreeSet.html") || - file.ends_with("btree_map/struct.BTreeMap.html") || - file.ends_with("hash_map/struct.HashMap.html") || - file.ends_with("hash_set/struct.HashSet.html") || - file.ends_with("sync/struct.Lrc.html") || - file.ends_with("sync/struct.RwLock.html") { + if file.ends_with("alloc/collections/btree_map/struct.BTreeMap.html") + || file.ends_with("alloc/collections/btree_set/struct.BTreeSet.html") + || file.ends_with("std/collections/btree_map/struct.BTreeMap.html") + || file.ends_with("std/collections/btree_set/struct.BTreeSet.html") + || file.ends_with("std/collections/hash_map/struct.HashMap.html") + || file.ends_with("std/collections/hash_set/struct.HashSet.html") + { return None; } @@ -159,17 +148,19 @@ fn check(cache: &mut Cache, Err(_) => return None, }; { - cache.get_mut(&pretty_file) - .unwrap() - .parse_ids(&pretty_file, &contents, errors); + cache.get_mut(&pretty_file).unwrap().parse_ids(&pretty_file, &contents, errors); } // Search for anything that's the regex 'href[ ]*=[ ]*".*?"' with_attrs_in_source(&contents, " href", |url, i, base| { // Ignore external URLs - if url.starts_with("http:") || url.starts_with("https:") || - url.starts_with("javascript:") || url.starts_with("ftp:") || - url.starts_with("irc:") || url.starts_with("data:") { + if url.starts_with("http:") + || url.starts_with("https:") + || url.starts_with("javascript:") + || url.starts_with("ftp:") + || url.starts_with("irc:") + || url.starts_with("data:") + { return; } let mut parts = url.splitn(2, "#"); @@ -185,21 +176,26 @@ fn check(cache: &mut Cache, path.pop(); for part in Path::new(base).join(url).components() { match part { - Component::Prefix(_) | - Component::RootDir => { + Component::Prefix(_) | Component::RootDir => { // Avoid absolute paths as they make the docs not // relocatable by making assumptions on where the docs // are hosted relative to the site root. *errors = true; - println!("{}:{}: absolute path - {}", - pretty_file.display(), - i + 1, - Path::new(base).join(url).display()); + println!( + "{}:{}: absolute path - {}", + pretty_file.display(), + i + 1, + Path::new(base).join(url).display() + ); return; } Component::CurDir => {} - Component::ParentDir => { path.pop(); } - Component::Normal(s) => { path.push(s); } + Component::ParentDir => { + path.pop(); + } + Component::Normal(s) => { + path.push(s); + } } } } @@ -212,10 +208,12 @@ fn check(cache: &mut Cache, // the docs offline so it's best to avoid them. *errors = true; let pretty_path = path.strip_prefix(root).unwrap_or(&path); - println!("{}:{}: directory link - {}", - pretty_file.display(), - i + 1, - pretty_path.display()); + println!( + "{}:{}: directory link - {}", + pretty_file.display(), + i + 1, + pretty_path.display() + ); return; } if let Some(extension) = path.extension() { @@ -232,10 +230,12 @@ fn check(cache: &mut Cache, } Err(LoadError::BrokenRedirect(target, _)) => { *errors = true; - println!("{}:{}: broken redirect to {}", - pretty_file.display(), - i + 1, - target.display()); + println!( + "{}:{}: broken redirect to {}", + pretty_file.display(), + i + 1, + target.display() + ); return; } Err(LoadError::IsRedirect) => unreachable!(), @@ -244,8 +244,7 @@ fn check(cache: &mut Cache, if let Some(ref fragment) = fragment { // Fragments like `#1-6` are most likely line numbers to be // interpreted by javascript, so we're ignoring these - if fragment.splitn(2, '-') - .all(|f| f.chars().all(|c| c.is_numeric())) { + if fragment.splitn(2, '-').all(|f| f.chars().all(|c| c.is_numeric())) { return; } @@ -259,9 +258,7 @@ fn check(cache: &mut Cache, if !entry.ids.contains(*fragment) { *errors = true; - print!("{}:{}: broken link fragment ", - pretty_file.display(), - i + 1); + print!("{}:{}: broken link fragment ", pretty_file.display(), i + 1); println!("`#{}` pointing to `{}`", fragment, pretty_path.display()); }; } @@ -275,17 +272,16 @@ fn check(cache: &mut Cache, Some(pretty_file) } -fn load_file(cache: &mut Cache, - root: &Path, - file: &Path, - redirect: Redirect) - -> Result<(PathBuf, Rc), LoadError> { +fn load_file( + cache: &mut Cache, + root: &Path, + file: &Path, + redirect: Redirect, +) -> Result<(PathBuf, Rc), LoadError> { let pretty_file = PathBuf::from(file.strip_prefix(root).unwrap_or(&file)); let (maybe_redirect, contents) = match cache.entry(pretty_file.clone()) { - Entry::Occupied(entry) => { - (None, entry.get().source.clone()) - } + Entry::Occupied(entry) => (None, entry.get().source.clone()), Entry::Vacant(entry) => { let contents = match fs::read_to_string(file) { Ok(s) => Rc::new(s), @@ -294,7 +290,7 @@ fn load_file(cache: &mut Cache, LoadError::BrokenRedirect(file.to_path_buf(), err) } else { LoadError::IOError(err) - }) + }); } }; @@ -304,18 +300,13 @@ fn load_file(cache: &mut Cache, return Err(LoadError::IsRedirect); } } else { - entry.insert(FileEntry { - source: contents.clone(), - ids: HashSet::new(), - }); + entry.insert(FileEntry { source: contents.clone(), ids: HashSet::new() }); } (maybe, contents) } }; match maybe_redirect.map(|url| file.parent().unwrap().join(url)) { - Some(redirect_file) => { - load_file(cache, root, &redirect_file, FromRedirect(true)) - } + Some(redirect_file) => load_file(cache, root, &redirect_file, FromRedirect(true)), None => Ok((pretty_file, contents)), } } diff --git a/src/tools/rustc-workspace-hack/Cargo.toml b/src/tools/rustc-workspace-hack/Cargo.toml index 285af038a1..936e8ae895 100644 --- a/src/tools/rustc-workspace-hack/Cargo.toml +++ b/src/tools/rustc-workspace-hack/Cargo.toml @@ -62,9 +62,10 @@ curl-sys = { version = "0.4.13", features = ["http2", "libnghttp2-sys"], optiona crossbeam-utils = { version = "0.6.5", features = ["nightly"] } serde = { version = "1.0.82", features = ['derive'] } serde_json = { version = "1.0.31", features = ["raw_value"] } -smallvec = { version = "0.6", features = ['union', 'may_dangle'] } +smallvec-0_6 = { package = "smallvec", version = "0.6", features = ['union', 'may_dangle'] } +smallvec = { version = "1.0", features = ['union', 'may_dangle'] } url = { version = "2.0", features = ['serde'] } -syn = { version = "0.15", features = ['full'] } +syn = { version = "0.15", features = ['full', 'extra-traits'] } [target.'cfg(not(windows))'.dependencies] openssl = { version = "0.10.12", optional = true } diff --git a/src/tools/rustdoc-themes/main.rs b/src/tools/rustdoc-themes/main.rs index a549b0d0ef..7cac985a9a 100644 --- a/src/tools/rustdoc-themes/main.rs +++ b/src/tools/rustdoc-themes/main.rs @@ -1,7 +1,7 @@ use std::env::args; use std::fs::read_dir; use std::path::Path; -use std::process::{Command, exit}; +use std::process::{exit, Command}; const FILES_TO_IGNORE: &[&str] = &["light.css"]; @@ -13,11 +13,11 @@ fn get_folders>(folder_path: P) -> Vec { let path = entry.path(); if !path.is_file() { - continue + continue; } let filename = path.file_name().expect("file_name failed"); if FILES_TO_IGNORE.iter().any(|x| x == &filename) { - continue + continue; } ret.push(format!("{}", path.display())); } @@ -40,11 +40,9 @@ fn main() { } let arg_name = "--check-theme".to_owned(); let status = Command::new(rustdoc_bin) - .args(&themes.iter() - .flat_map(|t| vec![&arg_name, t].into_iter()) - .collect::>()) - .status() - .expect("failed to execute child"); + .args(&themes.iter().flat_map(|t| vec![&arg_name, t].into_iter()).collect::>()) + .status() + .expect("failed to execute child"); if !status.success() { exit(1); } diff --git a/src/tools/rustdoc/main.rs b/src/tools/rustdoc/main.rs index 99573cadb9..5b499a1fa1 100644 --- a/src/tools/rustdoc/main.rs +++ b/src/tools/rustdoc/main.rs @@ -1 +1,3 @@ -fn main() { rustdoc::main() } +fn main() { + rustdoc::main() +} diff --git a/src/tools/tidy/src/bins.rs b/src/tools/tidy/src/bins.rs index 680585a6e0..589be26dc2 100644 --- a/src/tools/tidy/src/bins.rs +++ b/src/tools/tidy/src/bins.rs @@ -14,8 +14,8 @@ pub fn check(_path: &Path, _bad: &mut bool) {} #[cfg(unix)] pub fn check(path: &Path, bad: &mut bool) { use std::fs; - use std::process::{Command, Stdio}; use std::os::unix::prelude::*; + use std::process::{Command, Stdio}; if let Ok(contents) = fs::read_to_string("/proc/version") { // Probably on Windows Linux Subsystem or Docker via VirtualBox, @@ -25,33 +25,35 @@ pub fn check(path: &Path, bad: &mut bool) { } } - super::walk_no_read(path, - &mut |path| super::filter_dirs(path) || path.ends_with("src/etc"), - &mut |entry| { - let file = entry.path(); - let filename = file.file_name().unwrap().to_string_lossy(); - let extensions = [".py", ".sh"]; - if extensions.iter().any(|e| filename.ends_with(e)) { - return; - } + super::walk_no_read( + path, + &mut |path| super::filter_dirs(path) || path.ends_with("src/etc"), + &mut |entry| { + let file = entry.path(); + let filename = file.file_name().unwrap().to_string_lossy(); + let extensions = [".py", ".sh"]; + if extensions.iter().any(|e| filename.ends_with(e)) { + return; + } - let metadata = t!(entry.metadata(), file); - if metadata.mode() & 0o111 != 0 { - let rel_path = file.strip_prefix(path).unwrap(); - let git_friendly_path = rel_path.to_str().unwrap().replace("\\", "/"); - let output = Command::new("git") - .arg("ls-files") - .arg(&git_friendly_path) - .current_dir(path) - .stderr(Stdio::null()) - .output() - .unwrap_or_else(|e| { - panic!("could not run git ls-files: {}", e); - }); - let path_bytes = rel_path.as_os_str().as_bytes(); - if output.status.success() && output.stdout.starts_with(path_bytes) { - tidy_error!(bad, "binary checked into source: {}", file.display()); + let metadata = t!(entry.metadata(), file); + if metadata.mode() & 0o111 != 0 { + let rel_path = file.strip_prefix(path).unwrap(); + let git_friendly_path = rel_path.to_str().unwrap().replace("\\", "/"); + let output = Command::new("git") + .arg("ls-files") + .arg(&git_friendly_path) + .current_dir(path) + .stderr(Stdio::null()) + .output() + .unwrap_or_else(|e| { + panic!("could not run git ls-files: {}", e); + }); + let path_bytes = rel_path.as_os_str().as_bytes(); + if output.status.success() && output.stdout.starts_with(path_bytes) { + tidy_error!(bad, "binary checked into source: {}", file.display()); + } } - } - }) + }, + ) } diff --git a/src/tools/tidy/src/cargo.rs b/src/tools/tidy/src/cargo.rs index 26ced7fc82..7c45efba5e 100644 --- a/src/tools/tidy/src/cargo.rs +++ b/src/tools/tidy/src/cargo.rs @@ -10,7 +10,7 @@ use std::path::Path; pub fn check(path: &Path, bad: &mut bool) { if !super::filter_dirs(path) { - return + return; } for entry in t!(path.read_dir(), path).map(|e| t!(e)) { // Look for `Cargo.toml` with a sibling `src/lib.rs` or `lib.rs`. @@ -34,7 +34,7 @@ fn verify(tomlfile: &Path, libfile: &Path, bad: &mut bool) { let librs = t!(fs::read_to_string(&libfile)); if toml.contains("name = \"bootstrap\"") { - return + return; } // "Poor man's TOML parser" -- just assume we use one syntax for now. @@ -51,36 +51,41 @@ fn verify(tomlfile: &Path, libfile: &Path, bad: &mut bool) { // If we encounter a line starting with `[` then we assume it's the end of // the dependency section and bail out. let deps = match toml.find("[dependencies]") { - Some(i) => &toml[i+1..], + Some(i) => &toml[i + 1..], None => return, }; for line in deps.lines() { if line.starts_with('[') { - break + break; } let mut parts = line.splitn(2, '='); let krate = parts.next().unwrap().trim(); if parts.next().is_none() { - continue + continue; } // Don't worry about depending on core/std while not writing `extern crate // core/std` -- that's intentional. if krate == "core" || krate == "std" { - continue + continue; } // This is intentional -- this dependency just makes the crate available // for others later on. let whitelisted = krate.starts_with("panic"); if toml.contains("name = \"std\"") && whitelisted { - continue + continue; } if !librs.contains(&format!("extern crate {}", krate)) { - tidy_error!(bad, "{} doesn't have `extern crate {}`, but Cargo.toml \ - depends on it", libfile.display(), krate); + tidy_error!( + bad, + "{} doesn't have `extern crate {}`, but Cargo.toml \ + depends on it", + libfile.display(), + krate + ); } } } diff --git a/src/tools/tidy/src/debug_artifacts.rs b/src/tools/tidy/src/debug_artifacts.rs index ee555a3e5b..408be83b92 100644 --- a/src/tools/tidy/src/debug_artifacts.rs +++ b/src/tools/tidy/src/debug_artifacts.rs @@ -2,8 +2,7 @@ use std::path::{Path, PathBuf}; -const GRAPHVIZ_POSTFLOW_MSG: &'static str = - "`borrowck_graphviz_postflow` attribute in test"; +const GRAPHVIZ_POSTFLOW_MSG: &str = "`borrowck_graphviz_postflow` attribute in test"; pub fn check(path: &Path, bad: &mut bool) { let test_dir: PathBuf = path.join("test"); diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs index 36e412975b..352c00dbe4 100644 --- a/src/tools/tidy/src/deps.rs +++ b/src/tools/tidy/src/deps.rs @@ -1,6 +1,6 @@ //! Checks the licenses of third-party dependencies by inspecting vendors. -use std::collections::{BTreeSet, HashSet, HashMap}; +use std::collections::{BTreeSet, HashMap, HashSet}; use std::fs; use std::path::Path; use std::process::Command; @@ -62,10 +62,8 @@ const EXCEPTIONS: &[&str] = &[ ]; /// Which crates to check against the whitelist? -const WHITELIST_CRATES: &[CrateVersion<'_>] = &[ - CrateVersion("rustc", "0.0.0"), - CrateVersion("rustc_codegen_llvm", "0.0.0"), -]; +const WHITELIST_CRATES: &[CrateVersion<'_>] = + &[CrateVersion("rustc", "0.0.0"), CrateVersion("rustc_codegen_llvm", "0.0.0")]; /// Whitelist of crates rustc is allowed to depend on. Avoid adding to the list if possible. const WHITELIST: &[Crate<'_>] = &[ @@ -172,6 +170,9 @@ const WHITELIST: &[Crate<'_>] = &[ Crate("term_size"), Crate("thread_local"), Crate("ucd-util"), + Crate("unicode-normalization"), + Crate("unicode-script"), + Crate("unicode-security"), Crate("unicode-width"), Crate("unicode-xid"), Crate("unreachable"), @@ -258,10 +259,7 @@ pub fn check(path: &Path, bad: &mut bool) { // Skip our exceptions. let is_exception = EXCEPTIONS.iter().any(|exception| { - dir.path() - .to_str() - .unwrap() - .contains(&format!("vendor/{}", exception)) + dir.path().to_str().unwrap().contains(&format!("vendor/{}", exception)) }); if is_exception { continue; @@ -408,20 +406,17 @@ fn check_crate_duplicate(resolve: &Resolve, bad: &mut bool) { // These two crates take quite a long time to build, so don't allow two versions of them // to accidentally sneak into our dependency graph, in order to ensure we keep our CI times // under control. - "cargo", "rustc-ap-syntax", ]; let mut name_to_id: HashMap<_, Vec<_>> = HashMap::new(); for node in resolve.nodes.iter() { - name_to_id.entry(node.id.split_whitespace().next().unwrap()) - .or_default() - .push(&node.id); + name_to_id.entry(node.id.split_whitespace().next().unwrap()).or_default().push(&node.id); } for name in FORBIDDEN_TO_HAVE_DUPLICATES { if name_to_id[name].len() <= 1 { - continue + continue; } println!("crate `{}` is duplicated in `Cargo.lock`", name); for id in name_to_id[name].iter() { diff --git a/src/tools/tidy/src/error_codes_check.rs b/src/tools/tidy/src/error_codes_check.rs index 22e4111ff3..428c57d3ee 100644 --- a/src/tools/tidy/src/error_codes_check.rs +++ b/src/tools/tidy/src/error_codes_check.rs @@ -8,48 +8,11 @@ use std::path::Path; // A few of those error codes can't be tested but all the others can and *should* be tested! const WHITELIST: &[&str] = &[ - "E0183", - "E0227", - "E0279", - "E0280", - "E0311", - "E0313", - "E0314", - "E0315", - "E0377", - "E0456", - "E0461", - "E0462", - "E0464", - "E0465", - "E0472", - "E0473", - "E0474", - "E0475", - "E0476", - "E0479", - "E0480", - "E0481", - "E0482", - "E0483", - "E0484", - "E0485", - "E0486", - "E0487", - "E0488", - "E0489", - "E0514", - "E0519", - "E0523", - "E0553", - "E0554", - "E0570", - "E0629", - "E0630", - "E0640", - "E0717", - "E0727", - "E0729", + "E0183", "E0227", "E0279", "E0280", "E0311", "E0313", "E0314", "E0315", "E0377", "E0456", + "E0461", "E0462", "E0464", "E0465", "E0472", "E0473", "E0474", "E0475", "E0476", "E0479", + "E0480", "E0481", "E0482", "E0483", "E0484", "E0485", "E0486", "E0487", "E0488", "E0489", + "E0514", "E0519", "E0523", "E0553", "E0554", "E0570", "E0629", "E0630", "E0640", "E0717", + "E0727", "E0729", ]; fn check_error_code_explanation( @@ -70,12 +33,12 @@ fn check_error_code_explanation( } macro_rules! some_or_continue { - ($e:expr) => ( + ($e:expr) => { match $e { Some(e) => e, None => continue, } - ); + }; } fn extract_error_codes(f: &str, error_codes: &mut HashMap, path: &Path) { @@ -90,16 +53,12 @@ fn extract_error_codes(f: &str, error_codes: &mut HashMap, path: & error_codes.insert(err_code.clone(), false); } // Now we extract the tests from the markdown file! - let md = some_or_continue!(s.splitn(2, "include_str!(\"").skip(1).next()); + let md = some_or_continue!(s.splitn(2, "include_str!(\"").nth(1)); let md_file_name = some_or_continue!(md.splitn(2, "\")").next()); let path = some_or_continue!(path.parent()).join(md_file_name); match read_to_string(&path) { Ok(content) => { - check_error_code_explanation( - &content, - error_codes, - err_code, - ); + check_error_code_explanation(&content, error_codes, err_code); } Err(e) => { eprintln!("Couldn't read `{}`: {}", path.display(), e); @@ -109,7 +68,8 @@ fn extract_error_codes(f: &str, error_codes: &mut HashMap, path: & } else if reached_no_explanation && s.starts_with('E') { if let Some(err_code) = s.splitn(2, ',').next() { let err_code = err_code.to_owned(); - if !error_codes.contains_key(&err_code) { // this check should *never* fail! + if !error_codes.contains_key(&err_code) { + // this check should *never* fail! error_codes.insert(err_code, false); } } @@ -124,7 +84,7 @@ fn extract_error_codes_from_tests(f: &str, error_codes: &mut HashMap = HashMap::new(); - super::walk(path, - &mut |path| super::filter_dirs(path), - &mut |entry, contents| { + super::walk(path, &mut |path| super::filter_dirs(path), &mut |entry, contents| { let file_name = entry.file_name(); if file_name == "error_codes.rs" { extract_error_codes(contents, &mut error_codes, entry.path()); diff --git a/src/tools/tidy/src/errors.rs b/src/tools/tidy/src/errors.rs index 1bc2774537..dbcc9341a0 100644 --- a/src/tools/tidy/src/errors.rs +++ b/src/tools/tidy/src/errors.rs @@ -8,54 +8,51 @@ use std::path::Path; pub fn check(path: &Path, bad: &mut bool) { let mut map: HashMap<_, Vec<_>> = HashMap::new(); - super::walk(path, - &mut |path| super::filter_dirs(path) || path.ends_with("src/test"), - &mut |entry, contents| { - let file = entry.path(); - let filename = file.file_name().unwrap().to_string_lossy(); - if filename != "error_codes.rs" { - return - } - - // In the `register_long_diagnostics!` macro, entries look like this: - // - // ``` - // EXXXX: r##" - // - // "##, - // ``` - // - // and these long messages often have error codes themselves inside - // them, but we don't want to report duplicates in these cases. This - // variable keeps track of whether we're currently inside one of these - // long diagnostic messages. - let mut inside_long_diag = false; - for (num, line) in contents.lines().enumerate() { - if inside_long_diag { - inside_long_diag = !line.contains("\"##"); - continue + super::walk( + path, + &mut |path| super::filter_dirs(path) || path.ends_with("src/test"), + &mut |entry, contents| { + let file = entry.path(); + let filename = file.file_name().unwrap().to_string_lossy(); + if filename != "error_codes.rs" { + return; } - let mut search = line; - while let Some(i) = search.find('E') { - search = &search[i + 1..]; - let code = if search.len() > 4 { - search[..4].parse::() - } else { - continue - }; - let code = match code { - Ok(n) => n, - Err(..) => continue, - }; - map.entry(code).or_default() - .push((file.to_owned(), num + 1, line.to_owned())); - break - } + // In the `register_long_diagnostics!` macro, entries look like this: + // + // ``` + // EXXXX: r##" + // + // "##, + // ``` + // + // and these long messages often have error codes themselves inside + // them, but we don't want to report duplicates in these cases. This + // variable keeps track of whether we're currently inside one of these + // long diagnostic messages. + let mut inside_long_diag = false; + for (num, line) in contents.lines().enumerate() { + if inside_long_diag { + inside_long_diag = !line.contains("\"##"); + continue; + } - inside_long_diag = line.contains("r##\""); - } - }); + let mut search = line; + while let Some(i) = search.find('E') { + search = &search[i + 1..]; + let code = if search.len() > 4 { search[..4].parse::() } else { continue }; + let code = match code { + Ok(n) => n, + Err(..) => continue, + }; + map.entry(code).or_default().push((file.to_owned(), num + 1, line.to_owned())); + break; + } + + inside_long_diag = line.contains("r##\""); + } + }, + ); let mut max = 0; for (&code, entries) in map.iter() { @@ -63,7 +60,7 @@ pub fn check(path: &Path, bad: &mut bool) { max = code; } if entries.len() == 1 { - continue + continue; } tidy_error!(bad, "duplicate error code: {}", code); diff --git a/src/tools/tidy/src/extdeps.rs b/src/tools/tidy/src/extdeps.rs index 52e263df5e..e3f92d4806 100644 --- a/src/tools/tidy/src/extdeps.rs +++ b/src/tools/tidy/src/extdeps.rs @@ -4,9 +4,7 @@ use std::fs; use std::path::Path; /// List of whitelisted sources for packages. -const WHITELISTED_SOURCES: &[&str] = &[ - "\"registry+https://github.com/rust-lang/crates.io-index\"", -]; +const WHITELISTED_SOURCES: &[&str] = &["\"registry+https://github.com/rust-lang/crates.io-index\""]; /// Checks for external package sources. pub fn check(path: &Path, bad: &mut bool) { @@ -19,7 +17,7 @@ pub fn check(path: &Path, bad: &mut bool) { // Process each line. for line in cargo_lock.lines() { // Consider only source entries. - if ! line.starts_with("source = ") { + if !line.starts_with("source = ") { continue; } diff --git a/src/tools/tidy/src/features.rs b/src/tools/tidy/src/features.rs index 4ea101296b..12f93a87cb 100644 --- a/src/tools/tidy/src/features.rs +++ b/src/tools/tidy/src/features.rs @@ -12,6 +12,7 @@ use std::collections::HashMap; use std::fmt; use std::fs; +use std::num::NonZeroU32; use std::path::Path; use regex::Regex; @@ -48,7 +49,7 @@ pub struct Feature { pub level: Status, pub since: Option, pub has_gate_test: bool, - pub tracking_issue: Option, + pub tracking_issue: Option, } pub type Features = HashMap; @@ -66,20 +67,22 @@ pub fn collect_lib_features(base_src_path: &Path) -> Features { // has been moved out-of-tree. Now it can no longer be auto-discovered by // `tidy`, because we need to filter out its (submodule) directory. Manually // add it to the set of known library features so we can still generate docs. - lib_features.insert("compiler_builtins_lib".to_owned(), Feature { - level: Status::Unstable, - since: None, - has_gate_test: false, - tracking_issue: None, - }); - - map_lib_features(base_src_path, - &mut |res, _, _| { + lib_features.insert( + "compiler_builtins_lib".to_owned(), + Feature { + level: Status::Unstable, + since: None, + has_gate_test: false, + tracking_issue: None, + }, + ); + + map_lib_features(base_src_path, &mut |res, _, _| { if let Ok((name, feature)) = res { lib_features.insert(name.to_owned(), feature); } }); - lib_features + lib_features } pub fn check(path: &Path, bad: &mut bool, verbose: bool) -> CollectedFeatures { @@ -89,67 +92,77 @@ pub fn check(path: &Path, bad: &mut bool, verbose: bool) -> CollectedFeatures { let lib_features = get_and_check_lib_features(path, bad, &features); assert!(!lib_features.is_empty()); - super::walk_many(&[&path.join("test/ui"), - &path.join("test/ui-fulldeps"), - &path.join("test/compile-fail")], - &mut |path| super::filter_dirs(path), - &mut |entry, contents| { - let file = entry.path(); - let filename = file.file_name().unwrap().to_string_lossy(); - if !filename.ends_with(".rs") || filename == "features.rs" || - filename == "diagnostic_list.rs" { - return; - } + super::walk_many( + &[&path.join("test/ui"), &path.join("test/ui-fulldeps"), &path.join("test/compile-fail")], + &mut |path| super::filter_dirs(path), + &mut |entry, contents| { + let file = entry.path(); + let filename = file.file_name().unwrap().to_string_lossy(); + if !filename.ends_with(".rs") + || filename == "features.rs" + || filename == "diagnostic_list.rs" + { + return; + } - let filen_underscore = filename.replace('-',"_").replace(".rs",""); - let filename_is_gate_test = test_filen_gate(&filen_underscore, &mut features); + let filen_underscore = filename.replace('-', "_").replace(".rs", ""); + let filename_is_gate_test = test_filen_gate(&filen_underscore, &mut features); - for (i, line) in contents.lines().enumerate() { - let mut err = |msg: &str| { - tidy_error!(bad, "{}:{}: {}", file.display(), i + 1, msg); - }; + for (i, line) in contents.lines().enumerate() { + let mut err = |msg: &str| { + tidy_error!(bad, "{}:{}: {}", file.display(), i + 1, msg); + }; - let gate_test_str = "gate-test-"; + let gate_test_str = "gate-test-"; - let feature_name = match line.find(gate_test_str) { - Some(i) => { - line[i+gate_test_str.len()..].splitn(2, ' ').next().unwrap() - }, - None => continue, - }; - match features.get_mut(feature_name) { - Some(f) => { - if filename_is_gate_test { - err(&format!("The file is already marked as gate test \ + let feature_name = match line.find(gate_test_str) { + Some(i) => line[i + gate_test_str.len()..].splitn(2, ' ').next().unwrap(), + None => continue, + }; + match features.get_mut(feature_name) { + Some(f) => { + if filename_is_gate_test { + err(&format!( + "The file is already marked as gate test \ through its name, no need for a \ 'gate-test-{}' comment", - feature_name)); + feature_name + )); + } + f.has_gate_test = true; + } + None => { + err(&format!( + "gate-test test found referencing a nonexistent feature '{}'", + feature_name + )); } - f.has_gate_test = true; - } - None => { - err(&format!("gate-test test found referencing a nonexistent feature '{}'", - feature_name)); } } - } - }); + }, + ); // Only check the number of lang features. // Obligatory testing for library features is dumb. - let gate_untested = features.iter() - .filter(|&(_, f)| f.level == Status::Unstable) - .filter(|&(_, f)| !f.has_gate_test) - .collect::>(); + let gate_untested = features + .iter() + .filter(|&(_, f)| f.level == Status::Unstable) + .filter(|&(_, f)| !f.has_gate_test) + .collect::>(); for &(name, _) in gate_untested.iter() { println!("Expected a gate test for the feature '{}'.", name); - println!("Hint: create a failing test file named 'feature-gate-{}.rs'\ + println!( + "Hint: create a failing test file named 'feature-gate-{}.rs'\ \n in the 'ui' test suite, with its failures due to\ - \n missing usage of `#![feature({})]`.", name, name); - println!("Hint: If you already have such a test and don't want to rename it,\ + \n missing usage of `#![feature({})]`.", + name, name + ); + println!( + "Hint: If you already have such a test and don't want to rename it,\ \n you can also add a // gate-test-{} line to the test file.", - name); + name + ); } if !gate_untested.is_empty() { @@ -181,12 +194,13 @@ fn format_features<'a>( family: &'a str, ) -> impl Iterator + 'a { features.iter().map(move |(name, feature)| { - format!("{:<32} {:<8} {:<12} {:<8}", - name, - family, - feature.level, - feature.since.map_or("None".to_owned(), - |since| since.to_string())) + format!( + "{:<32} {:<8} {:<12} {:<8}", + name, + family, + feature.level, + feature.since.map_or("None".to_owned(), |since| since.to_string()) + ) }) } @@ -204,9 +218,7 @@ fn find_attr_val<'a>(line: &'a str, attr: &str) -> Option<&'a str> { _ => unimplemented!("{} not handled", attr), }; - r.captures(line) - .and_then(|c| c.get(1)) - .map(|m| m.as_str()) + r.captures(line).and_then(|c| c.get(1)).map(|m| m.as_str()) } fn test_filen_gate(filen_underscore: &str, features: &mut Features) -> bool { @@ -220,7 +232,7 @@ fn test_filen_gate(filen_underscore: &str, features: &mut Features) -> bool { } } } - return false; + false } pub fn collect_lang_features(base_src_path: &Path, bad: &mut bool) -> Features { @@ -242,7 +254,9 @@ fn collect_lang_features_in(base: &Path, file: &str, bad: &mut bool) -> Features let mut in_feature_group = false; let mut prev_since = None; - contents.lines().zip(1..) + contents + .lines() + .zip(1..) .filter_map(|(line, line_number)| { let line = line.trim(); @@ -330,156 +344,160 @@ fn collect_lang_features_in(base: &Path, file: &str, bad: &mut bool) -> Features } None } else { - let s = issue_str.split('(').nth(1).unwrap().split(')').nth(0).unwrap(); + let s = issue_str.split('(').nth(1).unwrap().split(')').next().unwrap(); Some(s.parse().unwrap()) }; - Some((name.to_owned(), - Feature { - level, - since, - has_gate_test: false, - tracking_issue, - })) + Some((name.to_owned(), Feature { level, since, has_gate_test: false, tracking_issue })) }) .collect() } -fn get_and_check_lib_features(base_src_path: &Path, - bad: &mut bool, - lang_features: &Features) -> Features { +fn get_and_check_lib_features( + base_src_path: &Path, + bad: &mut bool, + lang_features: &Features, +) -> Features { let mut lib_features = Features::new(); - map_lib_features(base_src_path, - &mut |res, file, line| { - match res { - Ok((name, f)) => { - let mut check_features = |f: &Feature, list: &Features, display: &str| { - if let Some(ref s) = list.get(name) { - if f.tracking_issue != s.tracking_issue && f.level != Status::Stable { - tidy_error!(bad, - "{}:{}: mismatches the `issue` in {}", - file.display(), - line, - display); - } - } - }; - check_features(&f, &lang_features, "corresponding lang feature"); - check_features(&f, &lib_features, "previous"); - lib_features.insert(name.to_owned(), f); - }, - Err(msg) => { - tidy_error!(bad, "{}:{}: {}", file.display(), line, msg); - }, - } - + map_lib_features(base_src_path, &mut |res, file, line| match res { + Ok((name, f)) => { + let mut check_features = |f: &Feature, list: &Features, display: &str| { + if let Some(ref s) = list.get(name) { + if f.tracking_issue != s.tracking_issue && f.level != Status::Stable { + tidy_error!( + bad, + "{}:{}: mismatches the `issue` in {}", + file.display(), + line, + display + ); + } + } + }; + check_features(&f, &lang_features, "corresponding lang feature"); + check_features(&f, &lib_features, "previous"); + lib_features.insert(name.to_owned(), f); + } + Err(msg) => { + tidy_error!(bad, "{}:{}: {}", file.display(), line, msg); + } }); lib_features } -fn map_lib_features(base_src_path: &Path, - mf: &mut dyn FnMut(Result<(&str, Feature), &str>, &Path, usize)) { - super::walk(base_src_path, - &mut |path| super::filter_dirs(path) || path.ends_with("src/test"), - &mut |entry, contents| { - let file = entry.path(); - let filename = file.file_name().unwrap().to_string_lossy(); - if !filename.ends_with(".rs") || filename == "features.rs" || - filename == "diagnostic_list.rs" || filename == "error_codes.rs" { - return; - } +fn map_lib_features( + base_src_path: &Path, + mf: &mut dyn FnMut(Result<(&str, Feature), &str>, &Path, usize), +) { + super::walk( + base_src_path, + &mut |path| super::filter_dirs(path) || path.ends_with("src/test"), + &mut |entry, contents| { + let file = entry.path(); + let filename = file.file_name().unwrap().to_string_lossy(); + if !filename.ends_with(".rs") + || filename == "features.rs" + || filename == "diagnostic_list.rs" + || filename == "error_codes.rs" + { + return; + } - // This is an early exit -- all the attributes we're concerned with must contain this: - // * rustc_const_unstable( - // * unstable( - // * stable( - if !contents.contains("stable(") { - return; - } + // This is an early exit -- all the attributes we're concerned with must contain this: + // * rustc_const_unstable( + // * unstable( + // * stable( + if !contents.contains("stable(") { + return; + } - let mut becoming_feature: Option<(&str, Feature)> = None; - let mut iter_lines = contents.lines().enumerate().peekable(); - while let Some((i, line)) = iter_lines.next() { - macro_rules! err { - ($msg:expr) => {{ - mf(Err($msg), file, i + 1); - continue; - }}; + let handle_issue_none = |s| match s { + "none" => None, + issue => { + let n = issue.parse().expect("issue number is not a valid integer"); + assert_ne!(n, 0, "\"none\" should be used when there is no issue, not \"0\""); + NonZeroU32::new(n) + } }; - if let Some((ref name, ref mut f)) = becoming_feature { - if f.tracking_issue.is_none() { - f.tracking_issue = find_attr_val(line, "issue") - .map(|s| s.parse().unwrap()); + let mut becoming_feature: Option<(&str, Feature)> = None; + let mut iter_lines = contents.lines().enumerate().peekable(); + while let Some((i, line)) = iter_lines.next() { + macro_rules! err { + ($msg:expr) => {{ + mf(Err($msg), file, i + 1); + continue; + }}; + }; + if let Some((ref name, ref mut f)) = becoming_feature { + if f.tracking_issue.is_none() { + f.tracking_issue = find_attr_val(line, "issue").and_then(handle_issue_none); + } + if line.ends_with(']') { + mf(Ok((name, f.clone())), file, i + 1); + } else if !line.ends_with(',') && !line.ends_with('\\') && !line.ends_with('"') + { + // We need to bail here because we might have missed the + // end of a stability attribute above because the ']' + // might not have been at the end of the line. + // We could then get into the very unfortunate situation that + // we continue parsing the file assuming the current stability + // attribute has not ended, and ignoring possible feature + // attributes in the process. + err!("malformed stability attribute"); + } else { + continue; + } } - if line.ends_with(']') { - mf(Ok((name, f.clone())), file, i + 1); - } else if !line.ends_with(',') && !line.ends_with('\\') && !line.ends_with('"') { - // We need to bail here because we might have missed the - // end of a stability attribute above because the ']' - // might not have been at the end of the line. - // We could then get into the very unfortunate situation that - // we continue parsing the file assuming the current stability - // attribute has not ended, and ignoring possible feature - // attributes in the process. - err!("malformed stability attribute"); - } else { + becoming_feature = None; + if line.contains("rustc_const_unstable(") { + // `const fn` features are handled specially. + let feature_name = match find_attr_val(line, "feature") { + Some(name) => name, + None => err!("malformed stability attribute: missing `feature` key"), + }; + let feature = Feature { + level: Status::Unstable, + since: None, + has_gate_test: false, + // FIXME(#57563): #57563 is now used as a common tracking issue, + // although we would like to have specific tracking issues for each + // `rustc_const_unstable` in the future. + tracking_issue: NonZeroU32::new(57563), + }; + mf(Ok((feature_name, feature)), file, i + 1); continue; } - } - becoming_feature = None; - if line.contains("rustc_const_unstable(") { - // `const fn` features are handled specially. - let feature_name = match find_attr_val(line, "feature") { + let level = if line.contains("[unstable(") { + Status::Unstable + } else if line.contains("[stable(") { + Status::Stable + } else { + continue; + }; + let feature_name = match find_attr_val(line, "feature") + .or_else(|| iter_lines.peek().and_then(|next| find_attr_val(next.1, "feature"))) + { Some(name) => name, None => err!("malformed stability attribute: missing `feature` key"), }; - let feature = Feature { - level: Status::Unstable, - since: None, - has_gate_test: false, - // FIXME(#57563): #57563 is now used as a common tracking issue, - // although we would like to have specific tracking issues for each - // `rustc_const_unstable` in the future. - tracking_issue: Some(57563), + let since = match find_attr_val(line, "since").map(|x| x.parse()) { + Some(Ok(since)) => Some(since), + Some(Err(_err)) => { + err!("malformed stability attribute: can't parse `since` key"); + } + None if level == Status::Stable => { + err!("malformed stability attribute: missing the `since` key"); + } + None => None, }; - mf(Ok((feature_name, feature)), file, i + 1); - continue; - } - let level = if line.contains("[unstable(") { - Status::Unstable - } else if line.contains("[stable(") { - Status::Stable - } else { - continue; - }; - let feature_name = match find_attr_val(line, "feature") - .or_else(|| iter_lines.peek().and_then(|next| find_attr_val(next.1, "feature"))) - { - Some(name) => name, - None => err!("malformed stability attribute: missing `feature` key"), - }; - let since = match find_attr_val(line, "since").map(|x| x.parse()) { - Some(Ok(since)) => Some(since), - Some(Err(_err)) => { - err!("malformed stability attribute: can't parse `since` key"); - }, - None if level == Status::Stable => { - err!("malformed stability attribute: missing the `since` key"); - } - None => None, - }; - let tracking_issue = find_attr_val(line, "issue").map(|s| s.parse().unwrap()); + let tracking_issue = find_attr_val(line, "issue").and_then(handle_issue_none); - let feature = Feature { - level, - since, - has_gate_test: false, - tracking_issue, - }; - if line.contains(']') { - mf(Ok((feature_name, feature)), file, i + 1); - } else { - becoming_feature = Some((feature_name, feature)); + let feature = Feature { level, since, has_gate_test: false, tracking_issue }; + if line.contains(']') { + mf(Ok((feature_name, feature)), file, i + 1); + } else { + becoming_feature = Some((feature_name, feature)); + } } - } - }); + }, + ); } diff --git a/src/tools/tidy/src/features/version.rs b/src/tools/tidy/src/features/version.rs index cc3a651024..620be2f985 100644 --- a/src/tools/tidy/src/features/version.rs +++ b/src/tools/tidy/src/features/version.rs @@ -1,6 +1,6 @@ -use std::str::FromStr; -use std::num::ParseIntError; use std::fmt; +use std::num::ParseIntError; +use std::str::FromStr; #[cfg(test)] mod tests; @@ -34,14 +34,11 @@ impl FromStr for Version { fn from_str(s: &str) -> Result { let mut iter = s.split('.').map(|part| Ok(part.parse()?)); - let mut part = || { - iter.next() - .unwrap_or(Err(ParseVersionError::WrongNumberOfParts)) - }; + let mut part = || iter.next().unwrap_or(Err(ParseVersionError::WrongNumberOfParts)); let parts = [part()?, part()?, part()?]; - if let Some(_) = iter.next() { + if iter.next().is_some() { // Ensure we don't have more than 3 parts. return Err(ParseVersionError::WrongNumberOfParts); } diff --git a/src/tools/tidy/src/lib.rs b/src/tools/tidy/src/lib.rs index d9db68ff66..c8c61b6fb5 100644 --- a/src/tools/tidy/src/lib.rs +++ b/src/tools/tidy/src/lib.rs @@ -3,22 +3,26 @@ //! This library contains the tidy lints and exposes it //! to be used by tools. -use walkdir::{DirEntry, WalkDir}; use std::fs::File; use std::io::Read; +use walkdir::{DirEntry, WalkDir}; use std::path::Path; macro_rules! t { - ($e:expr, $p:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed on {} with {}", stringify!($e), ($p).display(), e), - }); + ($e:expr, $p:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed on {} with {}", stringify!($e), ($p).display(), e), + } + }; - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; } macro_rules! tidy_error { @@ -30,19 +34,19 @@ macro_rules! tidy_error { } pub mod bins; -pub mod style; +pub mod cargo; pub mod debug_artifacts; +pub mod deps; +pub mod edition; +pub mod error_codes_check; pub mod errors; +pub mod extdeps; pub mod features; -pub mod cargo; -pub mod edition; pub mod pal; -pub mod deps; -pub mod extdeps; +pub mod style; pub mod ui_tests; pub mod unit_tests; pub mod unstable_book; -pub mod error_codes_check; fn filter_dirs(path: &Path) -> bool { let skip = [ @@ -54,7 +58,6 @@ fn filter_dirs(path: &Path) -> bool { "src/tools/rls", "src/tools/rust-installer", "src/tools/rustfmt", - // Filter RLS output directories "target/rls", ]; @@ -62,7 +65,9 @@ fn filter_dirs(path: &Path) -> bool { } fn walk_many( - paths: &[&Path], skip: &mut dyn FnMut(&Path) -> bool, f: &mut dyn FnMut(&DirEntry, &str) + paths: &[&Path], + skip: &mut dyn FnMut(&Path) -> bool, + f: &mut dyn FnMut(&DirEntry, &str), ) { for path in paths { walk(path, skip, f); @@ -81,8 +86,7 @@ fn walk(path: &Path, skip: &mut dyn FnMut(&Path) -> bool, f: &mut dyn FnMut(&Dir } fn walk_no_read(path: &Path, skip: &mut dyn FnMut(&Path) -> bool, f: &mut dyn FnMut(&DirEntry)) { - let walker = WalkDir::new(path).into_iter() - .filter_entry(|e| !skip(e.path())); + let walker = WalkDir::new(path).into_iter().filter_entry(|e| !skip(e.path())); for entry in walker { if let Ok(entry) = entry { if entry.file_type().is_dir() { diff --git a/src/tools/tidy/src/main.rs b/src/tools/tidy/src/main.rs index de6b0c5b28..ec8b14c288 100644 --- a/src/tools/tidy/src/main.rs +++ b/src/tools/tidy/src/main.rs @@ -8,9 +8,9 @@ use tidy::*; -use std::process; -use std::path::PathBuf; use std::env; +use std::path::PathBuf; +use std::process; fn main() { let path: PathBuf = env::args_os().nth(1).expect("need path to src").into(); diff --git a/src/tools/tidy/src/pal.rs b/src/tools/tidy/src/pal.rs index c6bb16318b..dcd4c9e8ef 100644 --- a/src/tools/tidy/src/pal.rs +++ b/src/tools/tidy/src/pal.rs @@ -31,8 +31,8 @@ //! platform-specific cfgs are allowed. Not sure yet how to deal with //! this in the long term. -use std::path::Path; use std::iter::Iterator; +use std::path::Path; // Paths that may contain platform-specific code. const EXCEPTION_PATHS: &[&str] = &[ @@ -45,17 +45,16 @@ const EXCEPTION_PATHS: &[&str] = &[ // (e.g. `wasm32-unknown-emscripten` vs `wasm32-unknown-unknown`): "src/libcore/hint.rs", "src/libstd/sys/", // Platform-specific code for std lives here. - // This has the trailing slash so that sys_common is not excepted. + // This has the trailing slash so that sys_common is not excepted. "src/libstd/os", // Platform-specific public interfaces "src/rtstartup", // Not sure what to do about this. magic stuff for mingw - // temporary exceptions "src/libstd/lib.rs", "src/libstd/path.rs", "src/libstd/f32.rs", "src/libstd/f64.rs", // Integration test for platform-specific run-time feature detection: - "src/libstd/tests/run-time-detect.rs" , + "src/libstd/tests/run-time-detect.rs", "src/libstd/net/test.rs", "src/libstd/sys_common/mod.rs", "src/libstd/sys_common/net.rs", @@ -63,18 +62,15 @@ const EXCEPTION_PATHS: &[&str] = &[ "src/libterm", // Not sure how to make this crate portable, but test crate needs it. "src/libtest", // Probably should defer to unstable `std::sys` APIs. "src/libstd/sync/mpsc", // some tests are only run on non-emscripten - // std testing crates, okay for now at least "src/libcore/tests", "src/liballoc/tests/lib.rs", - // The `VaList` implementation must have platform specific code. // The Windows implementation of a `va_list` is always a character // pointer regardless of the target architecture. As a result, // we must use `#[cfg(windows)]` to conditionally compile the // correct `VaList` structure for windows. "src/libcore/ffi.rs", - // non-std crates "src/test", "src/tools", @@ -91,10 +87,14 @@ pub fn check(path: &Path, bad: &mut bool) { super::walk(path, &mut super::filter_dirs, &mut |entry, contents| { let file = entry.path(); let filestr = file.to_string_lossy().replace("\\", "/"); - if !filestr.ends_with(".rs") { return } + if !filestr.ends_with(".rs") { + return; + } let is_exception_path = EXCEPTION_PATHS.iter().any(|s| filestr.contains(&**s)); - if is_exception_path { return } + if is_exception_path { + return; + } check_cfgs(contents, &file, bad, &mut saw_target_arch, &mut saw_cfg_bang); }); @@ -103,8 +103,13 @@ pub fn check(path: &Path, bad: &mut bool) { assert!(saw_cfg_bang); } -fn check_cfgs(contents: &str, file: &Path, - bad: &mut bool, saw_target_arch: &mut bool, saw_cfg_bang: &mut bool) { +fn check_cfgs( + contents: &str, + file: &Path, + bad: &mut bool, + saw_target_arch: &mut bool, + saw_cfg_bang: &mut bool, +) { // For now it's ok to have platform-specific code after 'mod tests'. let mod_tests_idx = find_test_mod(contents); let contents = &contents[..mod_tests_idx]; @@ -119,24 +124,29 @@ fn check_cfgs(contents: &str, file: &Path, let line_numbers = line_numbers.as_ref().expect(""); let line = match line_numbers.binary_search(&idx) { Ok(_) => unreachable!(), - Err(i) => i + 1 + Err(i) => i + 1, }; tidy_error!(bad, "{}:{}: platform-specific cfg: {}", file.display(), line, cfg); }; for (idx, cfg) in cfgs { // Sanity check that the parsing here works. - if !*saw_target_arch && cfg.contains("target_arch") { *saw_target_arch = true } - if !*saw_cfg_bang && cfg.contains("cfg!") { *saw_cfg_bang = true } + if !*saw_target_arch && cfg.contains("target_arch") { + *saw_target_arch = true + } + if !*saw_cfg_bang && cfg.contains("cfg!") { + *saw_cfg_bang = true + } - let contains_platform_specific_cfg = - cfg.contains("target_os") + let contains_platform_specific_cfg = cfg.contains("target_os") || cfg.contains("target_env") || cfg.contains("target_vendor") || cfg.contains("unix") || cfg.contains("windows"); - if !contains_platform_specific_cfg { continue } + if !contains_platform_specific_cfg { + continue; + } let preceeded_by_doc_comment = { let pre_contents = &contents[..idx]; @@ -149,7 +159,9 @@ fn check_cfgs(contents: &str, file: &Path, } }; - if preceeded_by_doc_comment { continue } + if preceeded_by_doc_comment { + continue; + } err(idx, cfg); } @@ -161,9 +173,10 @@ fn find_test_mod(contents: &str) -> usize { let prev_newline_idx = contents[..mod_tests_idx].rfind('\n').unwrap_or(mod_tests_idx); let prev_newline_idx = contents[..prev_newline_idx].rfind('\n'); if let Some(nl) = prev_newline_idx { - let prev_line = &contents[nl + 1 .. mod_tests_idx]; + let prev_line = &contents[nl + 1..mod_tests_idx]; if prev_line.contains("cfg(all(test, not(target_os") - || prev_line.contains("cfg(all(test, not(any(target_os") { + || prev_line.contains("cfg(all(test, not(any(target_os") + { nl } else { mod_tests_idx @@ -183,7 +196,9 @@ fn parse_cfgs<'a>(contents: &'a str) -> Vec<(usize, &'a str)> { // that appear to be tokens followed by a parenthesis. let cfgs = candidate_cfg_idxs.filter(|i| { let pre_idx = i.saturating_sub(*i); - let succeeds_non_ident = !contents.as_bytes().get(pre_idx) + let succeeds_non_ident = !contents + .as_bytes() + .get(pre_idx) .cloned() .map(char::from) .map(char::is_alphanumeric) @@ -191,10 +206,12 @@ fn parse_cfgs<'a>(contents: &'a str) -> Vec<(usize, &'a str)> { let contents_after = &contents[*i..]; let first_paren = contents_after.find('('); let paren_idx = first_paren.map(|ip| i + ip); - let preceeds_whitespace_and_paren = paren_idx.map(|ip| { - let maybe_space = &contents[*i + "cfg".len() .. ip]; - maybe_space.chars().all(|c| char::is_whitespace(c) || c == '!') - }).unwrap_or(false); + let preceeds_whitespace_and_paren = paren_idx + .map(|ip| { + let maybe_space = &contents[*i + "cfg".len()..ip]; + maybe_space.chars().all(|c| char::is_whitespace(c) || c == '!') + }) + .unwrap_or(false); succeeds_non_ident && preceeds_whitespace_and_paren }); @@ -213,12 +230,13 @@ fn parse_cfgs<'a>(contents: &'a str) -> Vec<(usize, &'a str)> { return Some((i, &contents_from[..=j])); } } - _ => { } + _ => {} } } // if the parentheses are unbalanced just ignore this cfg -- it'll be caught when attempting // to run the compiler, and there's no real reason to lint it separately here None - }).collect() + }) + .collect() } diff --git a/src/tools/tidy/src/style.rs b/src/tools/tidy/src/style.rs index 20636c86e1..4247fcb3b7 100644 --- a/src/tools/tidy/src/style.rs +++ b/src/tools/tidy/src/style.rs @@ -2,14 +2,17 @@ //! //! Example checks are: //! -//! * No lines over 100 characters. -//! * No files with over 3000 lines. +//! * No lines over 100 characters (in non-Rust files). +//! * No files with over 3000 lines (in non-Rust files). //! * No tabs. //! * No trailing whitespace. //! * No CR characters. //! * No `TODO` or `XXX` directives. //! * No unexplained ` ```ignore ` or ` ```rust,ignore ` doc tests. //! +//! Note that some of these rules are excluded from Rust files because we enforce rustfmt. It is +//! preferable to be formatted rather than tidy-clean. +//! //! A number of these checks can be opted-out of with various directives of the form: //! `// ignore-tidy-CHECK-NAME`. @@ -55,8 +58,7 @@ enum LIUState { fn line_is_url(columns: usize, line: &str) -> bool { // more basic check for error_codes.rs, to avoid complexity in implementing two state machines if columns == ERROR_CODE_COLS { - return line.starts_with("[") && - line.contains("]:") && line.contains("http"); + return line.starts_with('[') && line.contains("]:") && line.contains("http"); } use self::LIUState::*; @@ -65,25 +67,21 @@ fn line_is_url(columns: usize, line: &str) -> bool { for tok in line.split_whitespace() { match (state, tok) { - (EXP_COMMENT_START, "//") | - (EXP_COMMENT_START, "///") | - (EXP_COMMENT_START, "//!") => state = EXP_LINK_LABEL_OR_URL, + (EXP_COMMENT_START, "//") | (EXP_COMMENT_START, "///") | (EXP_COMMENT_START, "//!") => { + state = EXP_LINK_LABEL_OR_URL + } (EXP_LINK_LABEL_OR_URL, w) - if w.len() >= 4 && w.starts_with('[') && w.ends_with("]:") - => state = EXP_URL, + if w.len() >= 4 && w.starts_with('[') && w.ends_with("]:") => + { + state = EXP_URL + } - (EXP_LINK_LABEL_OR_URL, w) - if is_url(w) - => state = EXP_END, + (EXP_LINK_LABEL_OR_URL, w) if is_url(w) => state = EXP_END, - (EXP_URL, w) - if is_url(w) || w.starts_with("../") - => state = EXP_END, + (EXP_URL, w) if is_url(w) || w.starts_with("../") => state = EXP_END, - (_, w) - if w.len() > columns && is_url(w) - => state = EXP_END, + (_, w) if w.len() > columns && is_url(w) => state = EXP_END, (_, _) => {} } @@ -119,8 +117,9 @@ fn contains_ignore_directive(can_contain: bool, contents: &str, check: &str) -> return Directive::Deny; } // Update `can_contain` when changing this - if contents.contains(&format!("// ignore-tidy-{}", check)) || - contents.contains(&format!("# ignore-tidy-{}", check)) { + if contents.contains(&format!("// ignore-tidy-{}", check)) + || contents.contains(&format!("# ignore-tidy-{}", check)) + { Directive::Ignore(false) } else { Directive::Deny @@ -142,17 +141,22 @@ pub fn check(path: &Path, bad: &mut bool) { let file = entry.path(); let filename = file.file_name().unwrap().to_string_lossy(); let extensions = [".rs", ".py", ".js", ".sh", ".c", ".cpp", ".h", ".md"]; - if extensions.iter().all(|e| !filename.ends_with(e)) || - filename.starts_with(".#") { - return + if extensions.iter().all(|e| !filename.ends_with(e)) || filename.starts_with(".#") { + return; } - if filename.ends_with(".md") && - file.parent() - .unwrap() - .file_name() - .unwrap() - .to_string_lossy() != "error_codes" { + let under_rustfmt = filename.ends_with(".rs") && + // This list should ideally be sourced from rustfmt.toml but we don't want to add a toml + // parser to tidy. + !file.ancestors().any(|a| { + a.ends_with("src/test") || + a.ends_with("src/libstd/sys/cloudabi") || + a.ends_with("src/doc/book") + }); + + if filename.ends_with(".md") + && file.parent().unwrap().file_name().unwrap().to_string_lossy() != "error_codes" + { // We don't want to check all ".md" files (almost of of them aren't compliant // currently), just the long error code explanation ones. return; @@ -168,8 +172,8 @@ pub fn check(path: &Path, bad: &mut bool) { COLS }; - let can_contain = contents.contains("// ignore-tidy-") || - contents.contains("# ignore-tidy-"); + let can_contain = + contents.contains("// ignore-tidy-") || contents.contains("# ignore-tidy-"); let mut skip_cr = contains_ignore_directive(can_contain, &contents, "cr"); let mut skip_undocumented_unsafe = contains_ignore_directive(can_contain, &contents, "undocumented-unsafe"); @@ -189,8 +193,10 @@ pub fn check(path: &Path, bad: &mut bool) { let mut err = |msg: &str| { tidy_error!(bad, "{}:{}: {}", file.display(), i + 1, msg); }; - if line.chars().count() > max_columns && - !long_line_is_ok(max_columns, line) { + if !under_rustfmt + && line.chars().count() > max_columns + && !long_line_is_ok(max_columns, line) + { suppressible_tidy_err!( err, skip_line_length, @@ -228,11 +234,11 @@ pub fn check(path: &Path, bad: &mut bool) { } else { last_safety_comment = false; } - if (line.starts_with("// Copyright") || - line.starts_with("# Copyright") || - line.starts_with("Copyright")) - && (line.contains("Rust Developers") || - line.contains("Rust Project Developers")) { + if (line.starts_with("// Copyright") + || line.starts_with("# Copyright") + || line.starts_with("Copyright")) + && (line.contains("Rust Developers") || line.contains("Rust Project Developers")) + { suppressible_tidy_err!( err, skip_copyright, diff --git a/src/tools/tidy/src/ui_tests.rs b/src/tools/tidy/src/ui_tests.rs index 2c52cecccb..47b328dae4 100644 --- a/src/tools/tidy/src/ui_tests.rs +++ b/src/tools/tidy/src/ui_tests.rs @@ -27,11 +27,7 @@ pub fn check(path: &Path, bad: &mut bool) { .splitn(2, '.') .next() .unwrap(); - if !file_path - .with_file_name(testname) - .with_extension("rs") - .exists() - { + if !file_path.with_file_name(testname).with_extension("rs").exists() { println!("Stray file with UI testing output: {:?}", file_path); *bad = true; } diff --git a/src/tools/tidy/src/unit_tests.rs b/src/tools/tidy/src/unit_tests.rs index 6286945ad2..5f33f32f8f 100644 --- a/src/tools/tidy/src/unit_tests.rs +++ b/src/tools/tidy/src/unit_tests.rs @@ -14,8 +14,8 @@ pub fn check(root_path: &Path, bad: &mut bool) { let libcore_tests = &root_path.join("libcore/tests"); let libcore_benches = &root_path.join("libcore/benches"); let is_core = |path: &Path| { - path.starts_with(libcore) && - !(path.starts_with(libcore_tests) || path.starts_with(libcore_benches)) + path.starts_with(libcore) + && !(path.starts_with(libcore_tests) || path.starts_with(libcore_benches)) }; let mut skip = |path: &Path| { @@ -28,38 +28,38 @@ pub fn check(root_path: &Path, bad: &mut bool) { (file_name == "tests" || file_name == "benches") && !is_core(path) } else { let extension = path.extension().unwrap_or_default(); - extension != "rs" || - (file_name == "tests.rs" || file_name == "benches.rs") && !is_core(path) + extension != "rs" + || (file_name == "tests.rs" || file_name == "benches.rs") && !is_core(path) } }; - super::walk( - root_path, - &mut skip, - &mut |entry, contents| { - let path = entry.path(); - let is_libcore = path.starts_with(libcore); - for (i, line) in contents.lines().enumerate() { - let line = line.trim(); - let is_test = || line.contains("#[test]") && !line.contains("`#[test]"); - let is_bench = || line.contains("#[bench]") && !line.contains("`#[bench]"); - if !line.starts_with("//") && (is_test() || is_bench()) { - let explanation = if is_libcore { - "libcore unit tests and benchmarks must be placed into \ + super::walk(root_path, &mut skip, &mut |entry, contents| { + let path = entry.path(); + let is_libcore = path.starts_with(libcore); + for (i, line) in contents.lines().enumerate() { + let line = line.trim(); + let is_test = || line.contains("#[test]") && !line.contains("`#[test]"); + let is_bench = || line.contains("#[bench]") && !line.contains("`#[bench]"); + if !line.starts_with("//") && (is_test() || is_bench()) { + let explanation = if is_libcore { + "libcore unit tests and benchmarks must be placed into \ `libcore/tests` or `libcore/benches`" - } else { - "unit tests and benchmarks must be placed into \ + } else { + "unit tests and benchmarks must be placed into \ separate files or directories named \ `tests.rs`, `benches.rs`, `tests` or `benches`" - }; - let name = if is_test() { "test" } else { "bench" }; - tidy_error!( - bad, "`{}:{}` contains `#[{}]`; {}", - path.display(), i + 1, name, explanation, - ); - return; - } + }; + let name = if is_test() { "test" } else { "bench" }; + tidy_error!( + bad, + "`{}:{}` contains `#[{}]`; {}", + path.display(), + i + 1, + name, + explanation, + ); + return; } - }, - ); + } + }); } diff --git a/src/tools/tidy/src/unstable_book.rs b/src/tools/tidy/src/unstable_book.rs index fb63520f06..472d66459d 100644 --- a/src/tools/tidy/src/unstable_book.rs +++ b/src/tools/tidy/src/unstable_book.rs @@ -1,7 +1,7 @@ +use crate::features::{CollectedFeatures, Feature, Features, Status}; use std::collections::BTreeSet; use std::fs; -use std::path::{PathBuf, Path}; -use crate::features::{CollectedFeatures, Features, Feature, Status}; +use std::path::{Path, PathBuf}; pub const PATH_STR: &str = "doc/unstable-book"; @@ -30,10 +30,7 @@ pub fn unstable_book_lib_features_path(base_src_path: &Path) -> PathBuf { /// Tests whether `DirEntry` is a file. fn dir_entry_is_file(dir_entry: &fs::DirEntry) -> bool { - dir_entry - .file_type() - .expect("could not determine file type of directory entry") - .is_file() + dir_entry.file_type().expect("could not determine file type of directory entry").is_file() } /// Retrieves names of all unstable features. @@ -60,8 +57,9 @@ pub fn collect_unstable_book_section_file_names(dir: &Path) -> BTreeSet /// /// * hyphens replaced by underscores, /// * the markdown suffix ('.md') removed. -fn collect_unstable_book_lang_features_section_file_names(base_src_path: &Path) - -> BTreeSet { +fn collect_unstable_book_lang_features_section_file_names( + base_src_path: &Path, +) -> BTreeSet { collect_unstable_book_section_file_names(&unstable_book_lang_features_path(base_src_path)) } @@ -75,20 +73,25 @@ fn collect_unstable_book_lib_features_section_file_names(base_src_path: &Path) - pub fn check(path: &Path, features: CollectedFeatures, bad: &mut bool) { let lang_features = features.lang; - let mut lib_features = features.lib.into_iter().filter(|&(ref name, _)| { - !lang_features.contains_key(name) - }).collect::(); + let mut lib_features = features + .lib + .into_iter() + .filter(|&(ref name, _)| !lang_features.contains_key(name)) + .collect::(); // This library feature is defined in the `compiler_builtins` crate, which // has been moved out-of-tree. Now it can no longer be auto-discovered by // `tidy`, because we need to filter out its (submodule) directory. Manually // add it to the set of known library features so we can still generate docs. - lib_features.insert("compiler_builtins_lib".to_owned(), Feature { - level: Status::Unstable, - since: None, - has_gate_test: false, - tracking_issue: None, - }); + lib_features.insert( + "compiler_builtins_lib".to_owned(), + Feature { + level: Status::Unstable, + since: None, + has_gate_test: false, + tracking_issue: None, + }, + ); // Library features let unstable_lib_feature_names = collect_unstable_feature_names(&lib_features); @@ -101,23 +104,28 @@ pub fn check(path: &Path, features: CollectedFeatures, bad: &mut bool) { collect_unstable_book_lang_features_section_file_names(path); // Check for Unstable Book sections that don't have a corresponding unstable feature - for feature_name in &unstable_book_lib_features_section_file_names - - &unstable_lib_feature_names { + for feature_name in &unstable_book_lib_features_section_file_names - &unstable_lib_feature_names + { if !unstable_lang_feature_names.contains(&feature_name) { - tidy_error!(bad, - "The Unstable Book has a 'library feature' section '{}' which doesn't \ + tidy_error!( + bad, + "The Unstable Book has a 'library feature' section '{}' which doesn't \ correspond to an unstable library feature", - feature_name); + feature_name + ); } } // Check for Unstable Book sections that don't have a corresponding unstable feature. - for feature_name in &unstable_book_lang_features_section_file_names - - &unstable_lang_feature_names { - tidy_error!(bad, - "The Unstable Book has a 'language feature' section '{}' which doesn't \ + for feature_name in + &unstable_book_lang_features_section_file_names - &unstable_lang_feature_names + { + tidy_error!( + bad, + "The Unstable Book has a 'language feature' section '{}' which doesn't \ correspond to an unstable language feature", - feature_name) + feature_name + ) } // List unstable features that don't have Unstable Book sections. diff --git a/src/tools/unicode-table-generator/Cargo.toml b/src/tools/unicode-table-generator/Cargo.toml new file mode 100644 index 0000000000..92344cdfc8 --- /dev/null +++ b/src/tools/unicode-table-generator/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "unicode-bdd" +version = "0.1.0" +authors = ["Mark Rousskov "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +ucd-parse = "0.1.3" diff --git a/src/tools/unicode-table-generator/src/case_mapping.rs b/src/tools/unicode-table-generator/src/case_mapping.rs new file mode 100644 index 0000000000..01f199c213 --- /dev/null +++ b/src/tools/unicode-table-generator/src/case_mapping.rs @@ -0,0 +1,62 @@ +use crate::{fmt_list, UnicodeData}; +use std::fmt; + +pub(crate) fn generate_case_mapping(data: &UnicodeData) -> String { + let mut file = String::new(); + + file.push_str(HEADER.trim_start()); + + let decl_type = "&[(char, [char; 3])]"; + + file.push_str(&format!( + "static LOWERCASE_TABLE: {} = &[{}];", + decl_type, + fmt_list(data.to_lower.iter().map(to_mapping)) + )); + file.push_str("\n\n"); + file.push_str(&format!( + "static UPPERCASE_TABLE: {} = &[{}];", + decl_type, + fmt_list(data.to_upper.iter().map(to_mapping)) + )); + file +} + +fn to_mapping((key, (a, b, c)): (&u32, &(u32, u32, u32))) -> (CharEscape, [CharEscape; 3]) { + ( + CharEscape(std::char::from_u32(*key).unwrap()), + [ + CharEscape(std::char::from_u32(*a).unwrap()), + CharEscape(std::char::from_u32(*b).unwrap()), + CharEscape(std::char::from_u32(*c).unwrap()), + ], + ) +} + +struct CharEscape(char); + +impl fmt::Debug for CharEscape { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "'{}'", self.0.escape_default()) + } +} + +static HEADER: &str = " +pub fn to_lower(c: char) -> [char; 3] { + match bsearch_case_table(c, LOWERCASE_TABLE) { + None => [c, '\\0', '\\0'], + Some(index) => LOWERCASE_TABLE[index].1, + } +} + +pub fn to_upper(c: char) -> [char; 3] { + match bsearch_case_table(c, UPPERCASE_TABLE) { + None => [c, '\\0', '\\0'], + Some(index) => UPPERCASE_TABLE[index].1, + } +} + +fn bsearch_case_table(c: char, table: &[(char, [char; 3])]) -> Option { + table.binary_search_by(|&(key, _)| key.cmp(&c)).ok() +} +"; diff --git a/src/tools/unicode-table-generator/src/main.rs b/src/tools/unicode-table-generator/src/main.rs new file mode 100644 index 0000000000..be8508e397 --- /dev/null +++ b/src/tools/unicode-table-generator/src/main.rs @@ -0,0 +1,261 @@ +use std::collections::{BTreeMap, HashMap}; +use std::ops::Range; +use ucd_parse::Codepoints; + +mod case_mapping; +mod raw_emitter; +mod unicode_download; + +use raw_emitter::{emit_codepoints, RawEmitter}; + +static PROPERTIES: &[&str] = &[ + "Alphabetic", + "Lowercase", + "Uppercase", + "Cased", + "Case_Ignorable", + "Grapheme_Extend", + "White_Space", + "Cc", + "N", +]; + +struct UnicodeData { + ranges: Vec<(&'static str, Vec>)>, + to_upper: BTreeMap, + to_lower: BTreeMap, +} + +fn to_mapping(origin: u32, codepoints: Vec) -> Option<(u32, u32, u32)> { + let mut a = None; + let mut b = None; + let mut c = None; + + for codepoint in codepoints { + if origin == codepoint.value() { + return None; + } + + if a.is_none() { + a = Some(codepoint.value()); + } else if b.is_none() { + b = Some(codepoint.value()); + } else if c.is_none() { + c = Some(codepoint.value()); + } else { + panic!("more than 3 mapped codepoints") + } + } + + Some((a.unwrap(), b.unwrap_or(0), c.unwrap_or(0))) +} + +static UNICODE_DIRECTORY: &str = "unicode-downloads"; + +fn load_data() -> UnicodeData { + unicode_download::fetch_latest(); + + let mut properties = HashMap::new(); + for row in ucd_parse::parse::<_, ucd_parse::CoreProperty>(&UNICODE_DIRECTORY).unwrap() { + if let Some(name) = PROPERTIES.iter().find(|prop| **prop == row.property.as_str()) { + properties.entry(*name).or_insert_with(Vec::new).push(row.codepoints); + } + } + for row in ucd_parse::parse::<_, ucd_parse::Property>(&UNICODE_DIRECTORY).unwrap() { + if let Some(name) = PROPERTIES.iter().find(|prop| **prop == row.property.as_str()) { + properties.entry(*name).or_insert_with(Vec::new).push(row.codepoints); + } + } + + let mut to_lower = BTreeMap::new(); + let mut to_upper = BTreeMap::new(); + for row in ucd_parse::UnicodeDataExpander::new( + ucd_parse::parse::<_, ucd_parse::UnicodeData>(&UNICODE_DIRECTORY).unwrap(), + ) { + let general_category = if ["Nd", "Nl", "No"].contains(&row.general_category.as_str()) { + "N" + } else { + row.general_category.as_str() + }; + if let Some(name) = PROPERTIES.iter().find(|prop| **prop == general_category) { + properties + .entry(*name) + .or_insert_with(Vec::new) + .push(Codepoints::Single(row.codepoint)); + } + + if let Some(mapped) = row.simple_lowercase_mapping { + if mapped != row.codepoint { + to_lower.insert(row.codepoint.value(), (mapped.value(), 0, 0)); + } + } + if let Some(mapped) = row.simple_uppercase_mapping { + if mapped != row.codepoint { + to_upper.insert(row.codepoint.value(), (mapped.value(), 0, 0)); + } + } + } + + for row in ucd_parse::parse::<_, ucd_parse::SpecialCaseMapping>(&UNICODE_DIRECTORY).unwrap() { + if !row.conditions.is_empty() { + // Skip conditional case mappings + continue; + } + + let key = row.codepoint.value(); + if let Some(lower) = to_mapping(key, row.lowercase) { + to_lower.insert(key, lower); + } + if let Some(upper) = to_mapping(key, row.uppercase) { + to_upper.insert(key, upper); + } + } + + let mut properties: HashMap<&'static str, Vec>> = properties + .into_iter() + .map(|(k, v)| { + ( + k, + v.into_iter() + .flat_map(|codepoints| match codepoints { + Codepoints::Single(c) => c + .scalar() + .map(|ch| (ch as u32..ch as u32 + 1)) + .into_iter() + .collect::>(), + Codepoints::Range(c) => c + .into_iter() + .flat_map(|c| c.scalar().map(|ch| (ch as u32..ch as u32 + 1))) + .collect::>(), + }) + .collect::>>(), + ) + }) + .collect(); + + for ranges in properties.values_mut() { + merge_ranges(ranges); + } + + let mut properties = properties.into_iter().collect::>(); + properties.sort_by_key(|p| p.0); + UnicodeData { ranges: properties, to_lower, to_upper } +} + +fn main() { + let write_location = std::env::args().nth(1).unwrap_or_else(|| { + eprintln!("Must provide path to write unicode tables to"); + eprintln!( + "e.g. {} src/libcore/unicode/unicode_data.rs", + std::env::args().nth(0).unwrap_or_default() + ); + std::process::exit(1); + }); + + let unicode_data = load_data(); + let ranges_by_property = &unicode_data.ranges; + + let mut total_bytes = 0; + let mut modules = Vec::new(); + for (property, ranges) in ranges_by_property { + let datapoints = ranges.iter().map(|r| r.end - r.start).sum::(); + let mut emitter = RawEmitter::new(); + emit_codepoints(&mut emitter, &ranges); + + modules.push((property.to_lowercase().to_string(), emitter.file)); + println!("{:15}: {} bytes, {} codepoints", property, emitter.bytes_used, datapoints,); + total_bytes += emitter.bytes_used; + } + + let mut table_file = String::new(); + + table_file.push_str( + "///! This file is generated by src/tools/unicode-table-generator; do not edit manually!\n", + ); + + table_file.push_str("use super::range_search;\n\n"); + + table_file.push_str(&version()); + + table_file.push('\n'); + + modules.push((String::from("conversions"), case_mapping::generate_case_mapping(&unicode_data))); + + for (name, contents) in modules { + table_file.push_str("#[rustfmt::skip]\n"); + table_file.push_str(&format!("pub mod {} {{\n", name)); + for line in contents.lines() { + if !line.trim().is_empty() { + table_file.push_str(" "); + table_file.push_str(&line); + } + table_file.push('\n'); + } + table_file.push_str("}\n\n"); + } + + std::fs::write(&write_location, format!("{}\n", table_file.trim_end())).unwrap(); + + println!("Total table sizes: {} bytes", total_bytes); +} + +fn version() -> String { + let mut out = String::new(); + out.push_str("pub const UNICODE_VERSION: (u32, u32, u32) = "); + + let readme = + std::fs::read_to_string(std::path::Path::new(UNICODE_DIRECTORY).join("ReadMe.txt")) + .unwrap(); + + let prefix = "for Version "; + let start = readme.find(prefix).unwrap() + prefix.len(); + let end = readme.find(" of the Unicode Standard.").unwrap(); + let version = + readme[start..end].split('.').map(|v| v.parse::().expect(&v)).collect::>(); + let [major, minor, micro] = [version[0], version[1], version[2]]; + + out.push_str(&format!("({}, {}, {});\n", major, minor, micro)); + out +} + +fn fmt_list(values: impl IntoIterator) -> String { + let pieces = values.into_iter().map(|b| format!("{:?}, ", b)).collect::>(); + let mut out = String::new(); + let mut line = format!("\n "); + for piece in pieces { + if line.len() + piece.len() < 98 { + line.push_str(&piece); + } else { + out.push_str(line.trim_end()); + out.push('\n'); + line = format!(" {}", piece); + } + } + out.push_str(line.trim_end()); + out.push('\n'); + out +} + +fn merge_ranges(ranges: &mut Vec>) { + loop { + let mut new_ranges = Vec::new(); + let mut idx_iter = 0..(ranges.len() - 1); + while let Some(idx) = idx_iter.next() { + let cur = ranges[idx].clone(); + let next = ranges[idx + 1].clone(); + if cur.end == next.start { + let _ = idx_iter.next(); // skip next as we're merging it in + new_ranges.push(cur.start..next.end); + } else { + new_ranges.push(cur); + } + } + new_ranges.push(ranges.last().unwrap().clone()); + if new_ranges.len() == ranges.len() { + *ranges = new_ranges; + break; + } else { + *ranges = new_ranges; + } + } +} diff --git a/src/tools/unicode-table-generator/src/raw_emitter.rs b/src/tools/unicode-table-generator/src/raw_emitter.rs new file mode 100644 index 0000000000..3e60ce13f9 --- /dev/null +++ b/src/tools/unicode-table-generator/src/raw_emitter.rs @@ -0,0 +1,170 @@ +//! This implements the core logic of the compression scheme used to compactly +//! encode the Unicode character classes. +//! +//! The primary idea is that we 'flatten' the Unicode ranges into an enormous +//! bitset. To represent any arbitrary codepoint in a raw bitset, we would need +//! over 17 kilobytes of data per character set -- way too much for our +//! purposes. +//! +//! We have two primary goals with the encoding: we want to be compact, because +//! these tables often end up in ~every Rust program (especially the +//! grapheme_extend table, used for str debugging), including those for embedded +//! targets (where space is important). We also want to be relatively fast, +//! though this is more of a nice to have rather than a key design constraint. +//! In practice, due to modern processor design these two are closely related. +//! +//! The encoding scheme here compresses the bitset by first deduplicating the +//! "words" (64 bits on all platforms). In practice very few words are present +//! in most data sets. +//! +//! This gives us an array that maps `u8 -> word` (if we ever went beyond 256 +//! words, we could go to u16 -> word or have some dual compression scheme +//! mapping into two separate sets; currently this is not dealt with). +//! +//! With that scheme, we now have a single byte for every 64 codepoints. We +//! further group these by 16 (arbitrarily chosen), and again deduplicate and +//! store in an array (u8 -> [u8; 16]). +//! +//! The indices into this array represent ranges of 64*16 = 1024 codepoints. +//! +//! This already reduces the top-level array to at most 1,086 bytes, but in +//! practice we usually can encode in far fewer (the first couple Unicode planes +//! are dense). +//! +//! The last byte of this top-level array is pulled out to a separate static +//! and trailing zeros are dropped; this is simply because grapheme_extend and +//! case_ignorable have a single entry in the 896th entry, so this shrinks them +//! down considerably. + +use crate::fmt_list; +use std::collections::{BTreeSet, HashMap}; +use std::convert::TryFrom; +use std::fmt::Write; +use std::ops::Range; + +pub struct RawEmitter { + pub file: String, + pub bytes_used: usize, +} + +impl RawEmitter { + pub fn new() -> RawEmitter { + RawEmitter { file: String::new(), bytes_used: 0 } + } + + fn blank_line(&mut self) { + if self.file.is_empty() || self.file.ends_with("\n\n") { + return; + } + writeln!(&mut self.file, "").unwrap(); + } + + fn emit_bitset(&mut self, words: &[u64]) { + let unique_words = + words.iter().cloned().collect::>().into_iter().collect::>(); + if unique_words.len() > u8::max_value() as usize { + panic!("cannot pack {} into 8 bits", unique_words.len()); + } + + let word_indices = unique_words + .iter() + .cloned() + .enumerate() + .map(|(idx, word)| (word, u8::try_from(idx).unwrap())) + .collect::>(); + + let mut idx = words.iter().map(|w| word_indices[w]).collect::>(); + let chunk_length = 16; + for _ in 0..(chunk_length - (idx.len() % chunk_length)) { + assert_eq!(unique_words[0], 0, "first word is all zeros"); + // pad out bitset index with zero words so we have all chunks of 16 + idx.push(0); + } + + let mut chunks = BTreeSet::new(); + for chunk in idx.chunks(chunk_length) { + chunks.insert(chunk); + } + let chunk_map = chunks + .clone() + .into_iter() + .enumerate() + .map(|(idx, chunk)| (chunk, idx)) + .collect::>(); + let mut chunk_indices = Vec::new(); + for chunk in idx.chunks(chunk_length) { + chunk_indices.push(chunk_map[chunk]); + } + writeln!( + &mut self.file, + "static BITSET_LAST_CHUNK_MAP: (u16, u8) = ({}, {});", + chunk_indices.len() - 1, + chunk_indices.pop().unwrap(), + ) + .unwrap(); + self.bytes_used += 3; + // Strip out the empty pieces, presuming our above pop() made us now + // have some trailing zeros. + assert_eq!(unique_words[0], 0, "first word is all zeros"); + while let Some(0) = chunk_indices.last() { + chunk_indices.pop(); + } + writeln!( + &mut self.file, + "static BITSET_CHUNKS_MAP: [u8; {}] = [{}];", + chunk_indices.len(), + fmt_list(&chunk_indices), + ) + .unwrap(); + self.bytes_used += chunk_indices.len(); + writeln!( + &mut self.file, + "static BITSET_INDEX_CHUNKS: [[u8; 16]; {}] = [{}];", + chunks.len(), + fmt_list(chunks.iter()), + ) + .unwrap(); + self.bytes_used += 16 * chunks.len(); + writeln!( + &mut self.file, + "static BITSET: [u64; {}] = [{}];", + unique_words.len(), + fmt_list(&unique_words), + ) + .unwrap(); + self.bytes_used += 8 * unique_words.len(); + } + + pub fn emit_lookup(&mut self) { + writeln!(&mut self.file, "pub fn lookup(c: char) -> bool {{").unwrap(); + writeln!(&mut self.file, " super::range_search(",).unwrap(); + writeln!(&mut self.file, " c as u32,").unwrap(); + writeln!(&mut self.file, " &BITSET_CHUNKS_MAP,").unwrap(); + writeln!(&mut self.file, " BITSET_LAST_CHUNK_MAP,").unwrap(); + writeln!(&mut self.file, " &BITSET_INDEX_CHUNKS,").unwrap(); + writeln!(&mut self.file, " &BITSET,").unwrap(); + writeln!(&mut self.file, " )").unwrap(); + writeln!(&mut self.file, "}}").unwrap(); + } +} + +pub fn emit_codepoints(emitter: &mut RawEmitter, ranges: &[Range]) { + emitter.blank_line(); + + let last_code_point = ranges.last().unwrap().end; + // bitset for every bit in the codepoint range + // + // + 2 to ensure an all zero word to use for padding + let mut buckets = vec![0u64; (last_code_point as usize / 64) + 2]; + for range in ranges { + for codepoint in range.clone() { + let bucket = codepoint as usize / 64; + let bit = codepoint as u64 % 64; + buckets[bucket] |= 1 << bit; + } + } + + emitter.emit_bitset(&buckets); + emitter.blank_line(); + emitter.emit_lookup(); +} diff --git a/src/tools/unicode-table-generator/src/unicode_download.rs b/src/tools/unicode-table-generator/src/unicode_download.rs new file mode 100644 index 0000000000..3f6de9ea3b --- /dev/null +++ b/src/tools/unicode-table-generator/src/unicode_download.rs @@ -0,0 +1,42 @@ +use crate::UNICODE_DIRECTORY; +use std::path::Path; +use std::process::Command; + +static URL_PREFIX: &str = "https://www.unicode.org/Public/UCD/latest/ucd/"; + +static README: &str = "ReadMe.txt"; + +static RESOURCES: &[&str] = + &["DerivedCoreProperties.txt", "PropList.txt", "UnicodeData.txt", "SpecialCasing.txt"]; + +pub fn fetch_latest() { + let directory = Path::new(UNICODE_DIRECTORY); + if let Err(e) = std::fs::create_dir_all(directory) { + if e.kind() != std::io::ErrorKind::AlreadyExists { + panic!("Failed to create {:?}: {}", UNICODE_DIRECTORY, e); + } + } + let output = Command::new("curl").arg(URL_PREFIX.to_owned() + README).output().unwrap(); + if !output.status.success() { + panic!( + "Failed to run curl to fetch readme: stderr: {}", + String::from_utf8_lossy(&output.stderr) + ); + } + let current = std::fs::read_to_string(directory.join(README)).unwrap_or_default(); + if current.as_bytes() != &output.stdout[..] { + std::fs::write(directory.join(README), output.stdout).unwrap(); + } + + for resource in RESOURCES { + let output = Command::new("curl").arg(URL_PREFIX.to_owned() + resource).output().unwrap(); + if !output.status.success() { + panic!( + "Failed to run curl to fetch {}: stderr: {}", + resource, + String::from_utf8_lossy(&output.stderr) + ); + } + std::fs::write(directory.join(resource), output.stdout).unwrap(); + } +} diff --git a/src/tools/unstable-book-gen/src/main.rs b/src/tools/unstable-book-gen/src/main.rs index fdb0b6d3e5..c9d1561a9d 100644 --- a/src/tools/unstable-book-gen/src/main.rs +++ b/src/tools/unstable-book-gen/src/main.rs @@ -2,14 +2,16 @@ #![deny(warnings)] -use tidy::features::{Feature, Features, collect_lib_features, collect_lang_features}; -use tidy::unstable_book::{collect_unstable_feature_names, collect_unstable_book_section_file_names, - PATH_STR, LANG_FEATURES_DIR, LIB_FEATURES_DIR}; use std::collections::BTreeSet; -use std::io::Write; -use std::fs::{self, File}; use std::env; +use std::fs::{self, File}; +use std::io::Write; use std::path::Path; +use tidy::features::{collect_lang_features, collect_lib_features, Features}; +use tidy::unstable_book::{ + collect_unstable_book_section_file_names, collect_unstable_feature_names, LANG_FEATURES_DIR, + LIB_FEATURES_DIR, PATH_STR, +}; /// A helper macro to `unwrap` a result except also print out details like: /// @@ -17,69 +19,51 @@ use std::path::Path; /// * The expression that failed /// * The error itself macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; } fn generate_stub_issue(path: &Path, name: &str, issue: u32) { let mut file = t!(File::create(path)); - t!(file.write_fmt(format_args!(include_str!("stub-issue.md"), - name = name, - issue = issue))); + t!(file.write_fmt(format_args!(include_str!("stub-issue.md"), name = name, issue = issue))); } fn generate_stub_no_issue(path: &Path, name: &str) { let mut file = t!(File::create(path)); - t!(file.write_fmt(format_args!(include_str!("stub-no-issue.md"), - name = name))); + t!(file.write_fmt(format_args!(include_str!("stub-no-issue.md"), name = name))); } -fn set_to_summary_str(set: &BTreeSet, dir: &str -) -> String { - set - .iter() - .map(|ref n| format!(" - [{}]({}/{}.md)", - n.replace('-', "_"), - dir, - n)) +fn set_to_summary_str(set: &BTreeSet, dir: &str) -> String { + set.iter() + .map(|ref n| format!(" - [{}]({}/{}.md)", n.replace('-', "_"), dir, n)) .fold("".to_owned(), |s, a| s + &a + "\n") } fn generate_summary(path: &Path, lang_features: &Features, lib_features: &Features) { - let compiler_flags = collect_unstable_book_section_file_names( - &path.join("src/compiler-flags")); + let compiler_flags = collect_unstable_book_section_file_names(&path.join("src/compiler-flags")); - let compiler_flags_str = set_to_summary_str(&compiler_flags, - "compiler-flags"); + let compiler_flags_str = set_to_summary_str(&compiler_flags, "compiler-flags"); let unstable_lang_features = collect_unstable_feature_names(&lang_features); let unstable_lib_features = collect_unstable_feature_names(&lib_features); - let lang_features_str = set_to_summary_str(&unstable_lang_features, - "language-features"); - let lib_features_str = set_to_summary_str(&unstable_lib_features, - "library-features"); + let lang_features_str = set_to_summary_str(&unstable_lang_features, "language-features"); + let lib_features_str = set_to_summary_str(&unstable_lib_features, "library-features"); let mut file = t!(File::create(&path.join("src/SUMMARY.md"))); - t!(file.write_fmt(format_args!(include_str!("SUMMARY.md"), - compiler_flags = compiler_flags_str, - language_features = lang_features_str, - library_features = lib_features_str))); - -} - -fn has_valid_tracking_issue(f: &Feature) -> bool { - if let Some(n) = f.tracking_issue { - if n > 0 { - return true; - } - } - false + t!(file.write_fmt(format_args!( + include_str!("SUMMARY.md"), + compiler_flags = compiler_flags_str, + language_features = lang_features_str, + library_features = lib_features_str + ))); } -fn generate_unstable_book_files(src :&Path, out: &Path, features :&Features) { +fn generate_unstable_book_files(src: &Path, out: &Path, features: &Features) { let unstable_features = collect_unstable_feature_names(features); let unstable_section_file_names = collect_unstable_book_section_file_names(src); t!(fs::create_dir_all(&out)); @@ -89,10 +73,8 @@ fn generate_unstable_book_files(src :&Path, out: &Path, features :&Features) { let out_file_path = out.join(&file_name); let feature = &features[&feature_name_underscore]; - if has_valid_tracking_issue(&feature) { - generate_stub_issue(&out_file_path, - &feature_name_underscore, - feature.tracking_issue.unwrap()); + if let Some(issue) = feature.tracking_issue { + generate_stub_issue(&out_file_path, &feature_name_underscore, issue.get()); } else { generate_stub_no_issue(&out_file_path, &feature_name_underscore); } @@ -120,20 +102,25 @@ fn main() { let dest_path = Path::new(&dest_path_str); let lang_features = collect_lang_features(src_path, &mut false); - let lib_features = collect_lib_features(src_path).into_iter().filter(|&(ref name, _)| { - !lang_features.contains_key(name) - }).collect(); + let lib_features = collect_lib_features(src_path) + .into_iter() + .filter(|&(ref name, _)| !lang_features.contains_key(name)) + .collect(); let doc_src_path = src_path.join(PATH_STR); t!(fs::create_dir_all(&dest_path)); - generate_unstable_book_files(&doc_src_path.join(LANG_FEATURES_DIR), - &dest_path.join(LANG_FEATURES_DIR), - &lang_features); - generate_unstable_book_files(&doc_src_path.join(LIB_FEATURES_DIR), - &dest_path.join(LIB_FEATURES_DIR), - &lib_features); + generate_unstable_book_files( + &doc_src_path.join(LANG_FEATURES_DIR), + &dest_path.join(LANG_FEATURES_DIR), + &lang_features, + ); + generate_unstable_book_files( + &doc_src_path.join(LIB_FEATURES_DIR), + &dest_path.join(LIB_FEATURES_DIR), + &lib_features, + ); copy_recursive(&doc_src_path, &dest_path); diff --git a/vendor/anyhow/.cargo-checksum.json b/vendor/anyhow/.cargo-checksum.json new file mode 100644 index 0000000000..317f949cce --- /dev/null +++ b/vendor/anyhow/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"657fe44010b7b83d474b5f56c45b1ccd0d5acfe5f15278d069f9e916e8543240","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"7da2635d19b66cf9fec82f5c74b3bbb663c8f47859267cc44c30fc04cf78843f","build.rs":"42e4fff05dc773820ee1843aba8e36389a36386d6e6082e778d2203420bd72ab","src/backtrace.rs":"a82a8ffae2c68ee385dc78d8ec8cb6f3351234f0ad6af7e87df2371593e0f6aa","src/chain.rs":"1627608ce95c3484d26e1742a1b8b533b74c6159916b717bacffae3ae53731f9","src/context.rs":"f2be36af9588c924ed087bcb7bd681d330889e54b8f98cdc2aba93512a28762e","src/error.rs":"bbfc81a843d4f42e099fbabfffac05725a9363432181c7d9048109a402b2f53a","src/fmt.rs":"079d7b4faaa23f42423e0bb6b4e8a80d7d6d45c38c0d46bebd7d647c8679469f","src/kind.rs":"8481a8b7835eebb3859a8c32c217bf9c73543cfc62e3916b98d39af8b063125c","src/lib.rs":"555a530b3b78129c87780550583e682853ab43cc6a57e76d01705164bafd028f","src/macros.rs":"77722190b58a6106b21aefd3b5d4f136a076afcdbc0fae21562d99e2c22912e1","src/wrapper.rs":"1229beca67dbd95ca77c9ecce282272acc55276c267c58cb73a75388b4693dda","tests/common/mod.rs":"f9088c2d7afafa64ff730b629272045b776bfafc2f5957508242da630635f2e1","tests/compiletest.rs":"0a52a44786aea1c299c695bf948b2ed2081e4cc344e5c2cadceab4eb03d0010d","tests/drop/mod.rs":"464bc1ddeae307eac906928286ec3edb77057c5c1302e02150d3649e2b861f1a","tests/test_autotrait.rs":"981e792db353be2f14c7a1cabe43b5f1329c168cb7679077cc2be786a0920d48","tests/test_backtrace.rs":"0e50edbb33b6bd07ba89ff3db72fb7c688ba2a4371fccdbbb20309ab02948b6a","tests/test_boxed.rs":"98a45325b1e86d4c5d3094ab99cd1ada1f771c505d2d7322f0afcbe7bdb71cfa","tests/test_chain.rs":"f28efeae7395d1c395e6f1a647b4199c25a00410ade45248c145c6fcf2fb448a","tests/test_context.rs":"f82c915b182df1a604a4cd558a03b1a821414983d6f6af6822398104cea70676","tests/test_convert.rs":"62840be1ee8022ba5e8c0d3fc1752a1526b2c47d4cceecff2b86790524c3b3ea","tests/test_downcast.rs":"253d6f54e554965023b378b037827ec6289c4779a7a7c12706e19c2731d219fe","tests/test_fmt.rs":"17572596f257aac9aa2ec4620e292ca6a954128b94772bb948399fab53832e70","tests/test_macros.rs":"c7d3d5e0b756f59d4858035025fb341d031369c88486fd9f961ee16bae6c78bf","tests/test_repr.rs":"dbb9b04ddbe1ab31eb5331ea69f05bb3a147299da2275a3d4dcc92947b5591b9","tests/test_source.rs":"b80723cf635a4f8c4df21891b34bfab9ed2b2aa407e7a2f826d24e334cd5f88e","tests/ui/no-impl.rs":"fab6cbf2f6ea510b86f567dfb3b7c31250a9fd71ae5d110dbb9188be569ec593","tests/ui/no-impl.stderr":"e01fd55a3618d0efaf2061c9c4564372f21578af3d30142b8d7aa4411c61ad6c"},"package":"7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c"} \ No newline at end of file diff --git a/vendor/anyhow/Cargo.toml b/vendor/anyhow/Cargo.toml new file mode 100644 index 0000000000..fb692009db --- /dev/null +++ b/vendor/anyhow/Cargo.toml @@ -0,0 +1,37 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +edition = "2018" +name = "anyhow" +version = "1.0.26" +authors = ["David Tolnay "] +description = "Flexible concrete Error type built on std::error::Error" +documentation = "https://docs.rs/anyhow" +readme = "README.md" +license = "MIT OR Apache-2.0" +repository = "https://github.com/dtolnay/anyhow" +[dev-dependencies.futures] +version = "0.3" + +[dev-dependencies.rustversion] +version = "1.0" + +[dev-dependencies.thiserror] +version = "1.0" + +[dev-dependencies.trybuild] +version = "1.0" + +[features] +default = ["std"] +std = [] diff --git a/vendor/fixedbitset/LICENSE-APACHE b/vendor/anyhow/LICENSE-APACHE similarity index 100% rename from vendor/fixedbitset/LICENSE-APACHE rename to vendor/anyhow/LICENSE-APACHE diff --git a/vendor/wasi-0.7.0/LICENSE-MIT b/vendor/anyhow/LICENSE-MIT similarity index 100% rename from vendor/wasi-0.7.0/LICENSE-MIT rename to vendor/anyhow/LICENSE-MIT diff --git a/vendor/anyhow/README.md b/vendor/anyhow/README.md new file mode 100644 index 0000000000..16c0b42bef --- /dev/null +++ b/vendor/anyhow/README.md @@ -0,0 +1,163 @@ +Anyhow ¯\\\_(ツ)\_/¯ +========================= + +[![Build Status](https://api.travis-ci.com/dtolnay/anyhow.svg?branch=master)](https://travis-ci.com/dtolnay/anyhow) +[![Latest Version](https://img.shields.io/crates/v/anyhow.svg)](https://crates.io/crates/anyhow) +[![Rust Documentation](https://img.shields.io/badge/api-rustdoc-blue.svg)](https://docs.rs/anyhow) + +This library provides [`anyhow::Error`][Error], a trait object based error type +for easy idiomatic error handling in Rust applications. + +[Error]: https://docs.rs/anyhow/1.0/anyhow/struct.Error.html + +```toml +[dependencies] +anyhow = "1.0" +``` + +*Compiler support: requires rustc 1.34+* + +
    + +## Details + +- Use `Result`, or equivalently `anyhow::Result`, as the + return type of any fallible function. + + Within the function, use `?` to easily propagate any error that implements the + `std::error::Error` trait. + + ```rust + use anyhow::Result; + + fn get_cluster_info() -> Result { + let config = std::fs::read_to_string("cluster.json")?; + let map: ClusterMap = serde_json::from_str(&config)?; + Ok(map) + } + ``` + +- Attach context to help the person troubleshooting the error understand where + things went wrong. A low-level error like "No such file or directory" can be + annoying to debug without more context about what higher level step the + application was in the middle of. + + ```rust + use anyhow::{Context, Result}; + + fn main() -> Result<()> { + ... + it.detach().context("Failed to detach the important thing")?; + + let content = std::fs::read(path) + .with_context(|| format!("Failed to read instrs from {}", path))?; + ... + } + ``` + + ```console + Error: Failed to read instrs from ./path/to/instrs.json + + Caused by: + No such file or directory (os error 2) + ``` + +- Downcasting is supported and can be by value, by shared reference, or by + mutable reference as needed. + + ```rust + // If the error was caused by redaction, then return a + // tombstone instead of the content. + match root_cause.downcast_ref::() { + Some(DataStoreError::Censored(_)) => Ok(Poll::Ready(REDACTED_CONTENT)), + None => Err(error), + } + ``` + +- A backtrace is captured and printed with the error if the underlying error + type does not already provide its own. In order to see backtraces, the + `RUST_LIB_BACKTRACE=1` environment variable must be defined. + +- Anyhow works with any error type that has an impl of `std::error::Error`, + including ones defined in your crate. We do not bundle a `derive(Error)` macro + but you can write the impls yourself or use a standalone macro like + [thiserror]. + + ```rust + use thiserror::Error; + + #[derive(Error, Debug)] + pub enum FormatError { + #[error("Invalid header (expected {expected:?}, got {found:?})")] + InvalidHeader { + expected: String, + found: String, + }, + #[error("Missing attribute: {0}")] + MissingAttribute(String), + } + ``` + +- One-off error messages can be constructed using the `anyhow!` macro, which + supports string interpolation and produces an `anyhow::Error`. + + ```rust + return Err(anyhow!("Missing attribute: {}", missing)); + ``` + +
    + +## No-std support + +In no_std mode, the same API is almost all available and works the same way. To +depend on Anyhow in no_std mode, disable our default enabled "std" feature in +Cargo.toml. A global allocator is required. + +```toml +[dependencies] +anyhow = { version = "1.0", default-features = false } +``` + +Since the `?`-based error conversions would normally rely on the +`std::error::Error` trait which is only available through std, no_std mode will +require an explicit `.map_err(Error::msg)` when working with a non-Anyhow error +type inside a function that returns Anyhow's error type. + +
    + +## Comparison to failure + +The `anyhow::Error` type works something like `failure::Error`, but unlike +failure ours is built around the standard library's `std::error::Error` trait +rather than a separate trait `failure::Fail`. The standard library has adopted +the necessary improvements for this to be possible as part of [RFC 2504]. + +[RFC 2504]: https://github.com/rust-lang/rfcs/blob/master/text/2504-fix-error.md + +
    + +## Comparison to thiserror + +Use Anyhow if you don't care what error type your functions return, you just +want it to be easy. This is common in application code. Use [thiserror] if you +are a library that wants to design your own dedicated error type(s) so that on +failures the caller gets exactly the information that you choose. + +[thiserror]: https://github.com/dtolnay/thiserror + +
    + +#### License + + +Licensed under either of Apache License, Version +2.0 or MIT license at your option. + + +
    + + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in this crate by you, as defined in the Apache-2.0 license, shall +be dual licensed as above, without any additional terms or conditions. + diff --git a/vendor/anyhow/build.rs b/vendor/anyhow/build.rs new file mode 100644 index 0000000000..056164d697 --- /dev/null +++ b/vendor/anyhow/build.rs @@ -0,0 +1,62 @@ +use std::env; +use std::fs; +use std::path::Path; +use std::process::{Command, ExitStatus}; + +// This code exercises the surface area that we expect of the std Backtrace +// type. If the current toolchain is able to compile it, we go ahead and use +// backtrace in anyhow. +const PROBE: &str = r#" + #![feature(backtrace)] + #![allow(dead_code)] + + use std::backtrace::{Backtrace, BacktraceStatus}; + use std::error::Error; + use std::fmt::{self, Display}; + + #[derive(Debug)] + struct E; + + impl Display for E { + fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result { + unimplemented!() + } + } + + impl Error for E { + fn backtrace(&self) -> Option<&Backtrace> { + let backtrace = Backtrace::capture(); + match backtrace.status() { + BacktraceStatus::Captured | BacktraceStatus::Disabled | _ => {} + } + unimplemented!() + } + } +"#; + +fn main() { + if !cfg!(feature = "std") { + return; + } + match compile_probe() { + Some(status) if status.success() => println!("cargo:rustc-cfg=backtrace"), + _ => {} + } +} + +fn compile_probe() -> Option { + let rustc = env::var_os("RUSTC")?; + let out_dir = env::var_os("OUT_DIR")?; + let probefile = Path::new(&out_dir).join("probe.rs"); + fs::write(&probefile, PROBE).ok()?; + Command::new(rustc) + .arg("--edition=2018") + .arg("--crate-name=anyhow_build") + .arg("--crate-type=lib") + .arg("--emit=metadata") + .arg("--out-dir") + .arg(out_dir) + .arg(probefile) + .status() + .ok() +} diff --git a/vendor/anyhow/src/backtrace.rs b/vendor/anyhow/src/backtrace.rs new file mode 100644 index 0000000000..01e33cb237 --- /dev/null +++ b/vendor/anyhow/src/backtrace.rs @@ -0,0 +1,36 @@ +#[cfg(backtrace)] +pub(crate) use std::backtrace::Backtrace; + +#[cfg(not(backtrace))] +pub(crate) enum Backtrace {} + +#[cfg(backtrace)] +macro_rules! backtrace { + () => { + Some(Backtrace::capture()) + }; +} + +#[cfg(not(backtrace))] +macro_rules! backtrace { + () => { + None + }; +} + +#[cfg(backtrace)] +macro_rules! backtrace_if_absent { + ($err:expr) => { + match $err.backtrace() { + Some(_) => None, + None => Some(Backtrace::capture()), + } + }; +} + +#[cfg(all(feature = "std", not(backtrace)))] +macro_rules! backtrace_if_absent { + ($err:expr) => { + None + }; +} diff --git a/vendor/anyhow/src/chain.rs b/vendor/anyhow/src/chain.rs new file mode 100644 index 0000000000..207e4f0ca9 --- /dev/null +++ b/vendor/anyhow/src/chain.rs @@ -0,0 +1,101 @@ +use self::ChainState::*; +use crate::StdError; + +#[cfg(feature = "std")] +use std::vec; + +#[cfg(feature = "std")] +pub(crate) use crate::Chain; + +#[cfg(not(feature = "std"))] +pub(crate) struct Chain<'a> { + state: ChainState<'a>, +} + +#[derive(Clone)] +pub(crate) enum ChainState<'a> { + Linked { + next: Option<&'a (dyn StdError + 'static)>, + }, + #[cfg(feature = "std")] + Buffered { + rest: vec::IntoIter<&'a (dyn StdError + 'static)>, + }, +} + +impl<'a> Chain<'a> { + pub fn new(head: &'a (dyn StdError + 'static)) -> Self { + Chain { + state: ChainState::Linked { next: Some(head) }, + } + } +} + +impl<'a> Iterator for Chain<'a> { + type Item = &'a (dyn StdError + 'static); + + fn next(&mut self) -> Option { + match &mut self.state { + Linked { next } => { + let error = (*next)?; + *next = error.source(); + Some(error) + } + #[cfg(feature = "std")] + Buffered { rest } => rest.next(), + } + } + + fn size_hint(&self) -> (usize, Option) { + let len = self.len(); + (len, Some(len)) + } +} + +#[cfg(feature = "std")] +impl DoubleEndedIterator for Chain<'_> { + fn next_back(&mut self) -> Option { + match &mut self.state { + Linked { mut next } => { + let mut rest = Vec::new(); + while let Some(cause) = next { + next = cause.source(); + rest.push(cause); + } + let mut rest = rest.into_iter(); + let last = rest.next_back(); + self.state = Buffered { rest }; + last + } + Buffered { rest } => rest.next_back(), + } + } +} + +impl ExactSizeIterator for Chain<'_> { + fn len(&self) -> usize { + match &self.state { + Linked { mut next } => { + let mut len = 0; + while let Some(cause) = next { + next = cause.source(); + len += 1; + } + len + } + #[cfg(feature = "std")] + Buffered { rest } => rest.len(), + } + } +} + +#[cfg(feature = "std")] +impl Default for Chain<'_> { + fn default() -> Self { + Chain { + state: ChainState::Buffered { + rest: Vec::new().into_iter(), + }, + } + } +} diff --git a/vendor/anyhow/src/context.rs b/vendor/anyhow/src/context.rs new file mode 100644 index 0000000000..25d34114c1 --- /dev/null +++ b/vendor/anyhow/src/context.rs @@ -0,0 +1,177 @@ +use crate::error::ContextError; +use crate::{Context, Error, StdError}; +use core::convert::Infallible; +use core::fmt::{self, Debug, Display, Write}; + +#[cfg(backtrace)] +use std::backtrace::Backtrace; + +mod ext { + use super::*; + + pub trait StdError { + fn ext_context(self, context: C) -> Error + where + C: Display + Send + Sync + 'static; + } + + #[cfg(feature = "std")] + impl StdError for E + where + E: std::error::Error + Send + Sync + 'static, + { + fn ext_context(self, context: C) -> Error + where + C: Display + Send + Sync + 'static, + { + let backtrace = backtrace_if_absent!(self); + Error::from_context(context, self, backtrace) + } + } + + impl StdError for Error { + fn ext_context(self, context: C) -> Error + where + C: Display + Send + Sync + 'static, + { + self.context(context) + } + } +} + +impl Context for Result +where + E: ext::StdError + Send + Sync + 'static, +{ + fn context(self, context: C) -> Result + where + C: Display + Send + Sync + 'static, + { + self.map_err(|error| error.ext_context(context)) + } + + fn with_context(self, context: F) -> Result + where + C: Display + Send + Sync + 'static, + F: FnOnce() -> C, + { + self.map_err(|error| error.ext_context(context())) + } +} + +/// ``` +/// # type T = (); +/// # +/// use anyhow::{Context, Result}; +/// +/// fn maybe_get() -> Option { +/// # const IGNORE: &str = stringify! { +/// ... +/// # }; +/// # unimplemented!() +/// } +/// +/// fn demo() -> Result<()> { +/// let t = maybe_get().context("there is no T")?; +/// # const IGNORE: &str = stringify! { +/// ... +/// # }; +/// # unimplemented!() +/// } +/// ``` +impl Context for Option { + fn context(self, context: C) -> Result + where + C: Display + Send + Sync + 'static, + { + self.ok_or_else(|| Error::from_display(context, backtrace!())) + } + + fn with_context(self, context: F) -> Result + where + C: Display + Send + Sync + 'static, + F: FnOnce() -> C, + { + self.ok_or_else(|| Error::from_display(context(), backtrace!())) + } +} + +impl Debug for ContextError +where + C: Display, + E: Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("Error") + .field("context", &Quoted(&self.context)) + .field("source", &self.error) + .finish() + } +} + +impl Display for ContextError +where + C: Display, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + Display::fmt(&self.context, f) + } +} + +impl StdError for ContextError +where + C: Display, + E: StdError + 'static, +{ + #[cfg(backtrace)] + fn backtrace(&self) -> Option<&Backtrace> { + self.error.backtrace() + } + + fn source(&self) -> Option<&(dyn StdError + 'static)> { + Some(&self.error) + } +} + +impl StdError for ContextError +where + C: Display, +{ + #[cfg(backtrace)] + fn backtrace(&self) -> Option<&Backtrace> { + Some(self.error.backtrace()) + } + + fn source(&self) -> Option<&(dyn StdError + 'static)> { + Some(self.error.inner.error()) + } +} + +struct Quoted(C); + +impl Debug for Quoted +where + C: Display, +{ + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_char('"')?; + Quoted(&mut *formatter).write_fmt(format_args!("{}", self.0))?; + formatter.write_char('"')?; + Ok(()) + } +} + +impl Write for Quoted<&mut fmt::Formatter<'_>> { + fn write_str(&mut self, s: &str) -> fmt::Result { + Display::fmt(&s.escape_debug(), self.0) + } +} + +pub(crate) mod private { + use super::*; + + pub trait Sealed {} + + impl Sealed for Result where E: ext::StdError {} + impl Sealed for Option {} +} diff --git a/vendor/anyhow/src/error.rs b/vendor/anyhow/src/error.rs new file mode 100644 index 0000000000..88526dfe8f --- /dev/null +++ b/vendor/anyhow/src/error.rs @@ -0,0 +1,793 @@ +use crate::alloc::Box; +use crate::backtrace::Backtrace; +use crate::chain::Chain; +use crate::{Error, StdError}; +use core::any::TypeId; +use core::fmt::{self, Debug, Display}; +use core::mem::{self, ManuallyDrop}; +use core::ptr::{self, NonNull}; + +#[cfg(feature = "std")] +use core::ops::{Deref, DerefMut}; + +impl Error { + /// Create a new error object from any error type. + /// + /// The error type must be threadsafe and `'static`, so that the `Error` + /// will be as well. + /// + /// If the error type does not provide a backtrace, a backtrace will be + /// created here to ensure that a backtrace exists. + #[cfg(feature = "std")] + pub fn new(error: E) -> Self + where + E: StdError + Send + Sync + 'static, + { + let backtrace = backtrace_if_absent!(error); + Error::from_std(error, backtrace) + } + + /// Create a new error object from a printable error message. + /// + /// If the argument implements std::error::Error, prefer `Error::new` + /// instead which preserves the underlying error's cause chain and + /// backtrace. If the argument may or may not implement std::error::Error + /// now or in the future, use `anyhow!(err)` which handles either way + /// correctly. + /// + /// `Error::msg("...")` is equivalent to `anyhow!("...")` but occasionally + /// convenient in places where a function is preferable over a macro, such + /// as iterator or stream combinators: + /// + /// ``` + /// # mod ffi { + /// # pub struct Input; + /// # pub struct Output; + /// # pub async fn do_some_work(_: Input) -> Result { + /// # unimplemented!() + /// # } + /// # } + /// # + /// # use ffi::{Input, Output}; + /// # + /// use anyhow::{Error, Result}; + /// use futures::stream::{Stream, StreamExt, TryStreamExt}; + /// + /// async fn demo(stream: S) -> Result> + /// where + /// S: Stream, + /// { + /// stream + /// .then(ffi::do_some_work) // returns Result + /// .map_err(Error::msg) + /// .try_collect() + /// .await + /// } + /// ``` + pub fn msg(message: M) -> Self + where + M: Display + Debug + Send + Sync + 'static, + { + Error::from_adhoc(message, backtrace!()) + } + + #[cfg(feature = "std")] + pub(crate) fn from_std(error: E, backtrace: Option) -> Self + where + E: StdError + Send + Sync + 'static, + { + let vtable = &ErrorVTable { + object_drop: object_drop::, + object_ref: object_ref::, + #[cfg(feature = "std")] + object_mut: object_mut::, + object_boxed: object_boxed::, + object_downcast: object_downcast::, + object_drop_rest: object_drop_front::, + }; + + // Safety: passing vtable that operates on the right type E. + unsafe { Error::construct(error, vtable, backtrace) } + } + + pub(crate) fn from_adhoc(message: M, backtrace: Option) -> Self + where + M: Display + Debug + Send + Sync + 'static, + { + use crate::wrapper::MessageError; + let error: MessageError = MessageError(message); + let vtable = &ErrorVTable { + object_drop: object_drop::>, + object_ref: object_ref::>, + #[cfg(feature = "std")] + object_mut: object_mut::>, + object_boxed: object_boxed::>, + object_downcast: object_downcast::, + object_drop_rest: object_drop_front::, + }; + + // Safety: MessageError is repr(transparent) so it is okay for the + // vtable to allow casting the MessageError to M. + unsafe { Error::construct(error, vtable, backtrace) } + } + + pub(crate) fn from_display(message: M, backtrace: Option) -> Self + where + M: Display + Send + Sync + 'static, + { + use crate::wrapper::DisplayError; + let error: DisplayError = DisplayError(message); + let vtable = &ErrorVTable { + object_drop: object_drop::>, + object_ref: object_ref::>, + #[cfg(feature = "std")] + object_mut: object_mut::>, + object_boxed: object_boxed::>, + object_downcast: object_downcast::, + object_drop_rest: object_drop_front::, + }; + + // Safety: DisplayError is repr(transparent) so it is okay for the + // vtable to allow casting the DisplayError to M. + unsafe { Error::construct(error, vtable, backtrace) } + } + + #[cfg(feature = "std")] + pub(crate) fn from_context(context: C, error: E, backtrace: Option) -> Self + where + C: Display + Send + Sync + 'static, + E: StdError + Send + Sync + 'static, + { + let error: ContextError = ContextError { context, error }; + + let vtable = &ErrorVTable { + object_drop: object_drop::>, + object_ref: object_ref::>, + #[cfg(feature = "std")] + object_mut: object_mut::>, + object_boxed: object_boxed::>, + object_downcast: context_downcast::, + object_drop_rest: context_drop_rest::, + }; + + // Safety: passing vtable that operates on the right type. + unsafe { Error::construct(error, vtable, backtrace) } + } + + #[cfg(feature = "std")] + pub(crate) fn from_boxed( + error: Box, + backtrace: Option, + ) -> Self { + use crate::wrapper::BoxedError; + let error = BoxedError(error); + let vtable = &ErrorVTable { + object_drop: object_drop::, + object_ref: object_ref::, + #[cfg(feature = "std")] + object_mut: object_mut::, + object_boxed: object_boxed::, + object_downcast: object_downcast::>, + object_drop_rest: object_drop_front::>, + }; + + // Safety: BoxedError is repr(transparent) so it is okay for the vtable + // to allow casting to Box. + unsafe { Error::construct(error, vtable, backtrace) } + } + + // Takes backtrace as argument rather than capturing it here so that the + // user sees one fewer layer of wrapping noise in the backtrace. + // + // Unsafe because the given vtable must have sensible behavior on the error + // value of type E. + unsafe fn construct( + error: E, + vtable: &'static ErrorVTable, + backtrace: Option, + ) -> Self + where + E: StdError + Send + Sync + 'static, + { + let inner = Box::new(ErrorImpl { + vtable, + backtrace, + _object: error, + }); + // Erase the concrete type of E from the compile-time type system. This + // is equivalent to the safe unsize coersion from Box> to + // Box> except that the + // result is a thin pointer. The necessary behavior for manipulating the + // underlying ErrorImpl is preserved in the vtable provided by the + // caller rather than a builtin fat pointer vtable. + let erased = mem::transmute::>, Box>>(inner); + let inner = ManuallyDrop::new(erased); + Error { inner } + } + + /// Wrap the error value with additional context. + /// + /// For attaching context to a `Result` as it is propagated, the + /// [`Context`][crate::Context] extension trait may be more convenient than + /// this function. + /// + /// The primary reason to use `error.context(...)` instead of + /// `result.context(...)` via the `Context` trait would be if the context + /// needs to depend on some data held by the underlying error: + /// + /// ``` + /// # use std::fmt::{self, Debug, Display}; + /// # + /// # type T = (); + /// # + /// # impl std::error::Error for ParseError {} + /// # impl Debug for ParseError { + /// # fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + /// # unimplemented!() + /// # } + /// # } + /// # impl Display for ParseError { + /// # fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + /// # unimplemented!() + /// # } + /// # } + /// # + /// use anyhow::Result; + /// use std::fs::File; + /// use std::path::Path; + /// + /// struct ParseError { + /// line: usize, + /// column: usize, + /// } + /// + /// fn parse_impl(file: File) -> Result { + /// # const IGNORE: &str = stringify! { + /// ... + /// # }; + /// # unimplemented!() + /// } + /// + /// pub fn parse(path: impl AsRef) -> Result { + /// let file = File::open(&path)?; + /// parse_impl(file).map_err(|error| { + /// let context = format!( + /// "only the first {} lines of {} are valid", + /// error.line, path.as_ref().display(), + /// ); + /// anyhow::Error::new(error).context(context) + /// }) + /// } + /// ``` + pub fn context(self, context: C) -> Self + where + C: Display + Send + Sync + 'static, + { + let error: ContextError = ContextError { + context, + error: self, + }; + + let vtable = &ErrorVTable { + object_drop: object_drop::>, + object_ref: object_ref::>, + #[cfg(feature = "std")] + object_mut: object_mut::>, + object_boxed: object_boxed::>, + object_downcast: context_chain_downcast::, + object_drop_rest: context_chain_drop_rest::, + }; + + // As the cause is anyhow::Error, we already have a backtrace for it. + let backtrace = None; + + // Safety: passing vtable that operates on the right type. + unsafe { Error::construct(error, vtable, backtrace) } + } + + /// Get the backtrace for this Error. + /// + /// Backtraces are only available on the nightly channel. Tracking issue: + /// [rust-lang/rust#53487][tracking]. + /// + /// In order for the backtrace to be meaningful, the environment variable + /// `RUST_LIB_BACKTRACE=1` must be defined. Backtraces are somewhat + /// expensive to capture in Rust, so we don't necessarily want to be + /// capturing them all over the place all the time. + /// + /// [tracking]: https://github.com/rust-lang/rust/issues/53487 + #[cfg(backtrace)] + pub fn backtrace(&self) -> &Backtrace { + self.inner.backtrace() + } + + /// An iterator of the chain of source errors contained by this Error. + /// + /// This iterator will visit every error in the cause chain of this error + /// object, beginning with the error that this error object was created + /// from. + /// + /// # Example + /// + /// ``` + /// use anyhow::Error; + /// use std::io; + /// + /// pub fn underlying_io_error_kind(error: &Error) -> Option { + /// for cause in error.chain() { + /// if let Some(io_error) = cause.downcast_ref::() { + /// return Some(io_error.kind()); + /// } + /// } + /// None + /// } + /// ``` + #[cfg(feature = "std")] + pub fn chain(&self) -> Chain { + self.inner.chain() + } + + /// The lowest level cause of this error — this error's cause's + /// cause's cause etc. + /// + /// The root cause is the last error in the iterator produced by + /// [`chain()`][Error::chain]. + #[cfg(feature = "std")] + pub fn root_cause(&self) -> &(dyn StdError + 'static) { + let mut chain = self.chain(); + let mut root_cause = chain.next().unwrap(); + for cause in chain { + root_cause = cause; + } + root_cause + } + + /// Returns true if `E` is the type held by this error object. + /// + /// For errors with context, this method returns true if `E` matches the + /// type of the context `C` **or** the type of the error on which the + /// context has been attached. For details about the interaction between + /// context and downcasting, [see here]. + /// + /// [see here]: trait.Context.html#effect-on-downcasting + pub fn is(&self) -> bool + where + E: Display + Debug + Send + Sync + 'static, + { + self.downcast_ref::().is_some() + } + + /// Attempt to downcast the error object to a concrete type. + pub fn downcast(self) -> Result + where + E: Display + Debug + Send + Sync + 'static, + { + let target = TypeId::of::(); + unsafe { + // Use vtable to find NonNull<()> which points to a value of type E + // somewhere inside the data structure. + let addr = match (self.inner.vtable.object_downcast)(&self.inner, target) { + Some(addr) => addr, + None => return Err(self), + }; + + // Prepare to read E out of the data structure. We'll drop the rest + // of the data structure separately so that E is not dropped. + let outer = ManuallyDrop::new(self); + + // Read E from where the vtable found it. + let error = ptr::read(addr.cast::().as_ptr()); + + // Read Box> from self. Can't move it out because + // Error has a Drop impl which we want to not run. + let inner = ptr::read(&outer.inner); + let erased = ManuallyDrop::into_inner(inner); + + // Drop rest of the data structure outside of E. + (erased.vtable.object_drop_rest)(erased, target); + + Ok(error) + } + } + + /// Downcast this error object by reference. + /// + /// # Example + /// + /// ``` + /// # use anyhow::anyhow; + /// # use std::fmt::{self, Display}; + /// # use std::task::Poll; + /// # + /// # #[derive(Debug)] + /// # enum DataStoreError { + /// # Censored(()), + /// # } + /// # + /// # impl Display for DataStoreError { + /// # fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + /// # unimplemented!() + /// # } + /// # } + /// # + /// # impl std::error::Error for DataStoreError {} + /// # + /// # const REDACTED_CONTENT: () = (); + /// # + /// # let error = anyhow!("..."); + /// # let root_cause = &error; + /// # + /// # let ret = + /// // If the error was caused by redaction, then return a tombstone instead + /// // of the content. + /// match root_cause.downcast_ref::() { + /// Some(DataStoreError::Censored(_)) => Ok(Poll::Ready(REDACTED_CONTENT)), + /// None => Err(error), + /// } + /// # ; + /// ``` + pub fn downcast_ref(&self) -> Option<&E> + where + E: Display + Debug + Send + Sync + 'static, + { + let target = TypeId::of::(); + unsafe { + // Use vtable to find NonNull<()> which points to a value of type E + // somewhere inside the data structure. + let addr = (self.inner.vtable.object_downcast)(&self.inner, target)?; + Some(&*addr.cast::().as_ptr()) + } + } + + /// Downcast this error object by mutable reference. + pub fn downcast_mut(&mut self) -> Option<&mut E> + where + E: Display + Debug + Send + Sync + 'static, + { + let target = TypeId::of::(); + unsafe { + // Use vtable to find NonNull<()> which points to a value of type E + // somewhere inside the data structure. + let addr = (self.inner.vtable.object_downcast)(&self.inner, target)?; + Some(&mut *addr.cast::().as_ptr()) + } + } +} + +#[cfg(feature = "std")] +impl From for Error +where + E: StdError + Send + Sync + 'static, +{ + fn from(error: E) -> Self { + let backtrace = backtrace_if_absent!(error); + Error::from_std(error, backtrace) + } +} + +#[cfg(feature = "std")] +impl Deref for Error { + type Target = dyn StdError + Send + Sync + 'static; + + fn deref(&self) -> &Self::Target { + self.inner.error() + } +} + +#[cfg(feature = "std")] +impl DerefMut for Error { + fn deref_mut(&mut self) -> &mut Self::Target { + self.inner.error_mut() + } +} + +impl Display for Error { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + self.inner.display(formatter) + } +} + +impl Debug for Error { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + self.inner.debug(formatter) + } +} + +impl Drop for Error { + fn drop(&mut self) { + unsafe { + // Read Box> from self. + let inner = ptr::read(&self.inner); + let erased = ManuallyDrop::into_inner(inner); + + // Invoke the vtable's drop behavior. + (erased.vtable.object_drop)(erased); + } + } +} + +struct ErrorVTable { + object_drop: unsafe fn(Box>), + object_ref: unsafe fn(&ErrorImpl<()>) -> &(dyn StdError + Send + Sync + 'static), + #[cfg(feature = "std")] + object_mut: unsafe fn(&mut ErrorImpl<()>) -> &mut (dyn StdError + Send + Sync + 'static), + object_boxed: unsafe fn(Box>) -> Box, + object_downcast: unsafe fn(&ErrorImpl<()>, TypeId) -> Option>, + object_drop_rest: unsafe fn(Box>, TypeId), +} + +// Safety: requires layout of *e to match ErrorImpl. +unsafe fn object_drop(e: Box>) { + // Cast back to ErrorImpl so that the allocator receives the correct + // Layout to deallocate the Box's memory. + let unerased = mem::transmute::>, Box>>(e); + drop(unerased); +} + +// Safety: requires layout of *e to match ErrorImpl. +unsafe fn object_drop_front(e: Box>, target: TypeId) { + // Drop the fields of ErrorImpl other than E as well as the Box allocation, + // without dropping E itself. This is used by downcast after doing a + // ptr::read to take ownership of the E. + let _ = target; + let unerased = mem::transmute::>, Box>>>(e); + drop(unerased); +} + +// Safety: requires layout of *e to match ErrorImpl. +unsafe fn object_ref(e: &ErrorImpl<()>) -> &(dyn StdError + Send + Sync + 'static) +where + E: StdError + Send + Sync + 'static, +{ + // Attach E's native StdError vtable onto a pointer to self._object. + &(*(e as *const ErrorImpl<()> as *const ErrorImpl))._object +} + +// Safety: requires layout of *e to match ErrorImpl. +#[cfg(feature = "std")] +unsafe fn object_mut(e: &mut ErrorImpl<()>) -> &mut (dyn StdError + Send + Sync + 'static) +where + E: StdError + Send + Sync + 'static, +{ + // Attach E's native StdError vtable onto a pointer to self._object. + &mut (*(e as *mut ErrorImpl<()> as *mut ErrorImpl))._object +} + +// Safety: requires layout of *e to match ErrorImpl. +unsafe fn object_boxed(e: Box>) -> Box +where + E: StdError + Send + Sync + 'static, +{ + // Attach ErrorImpl's native StdError vtable. The StdError impl is below. + mem::transmute::>, Box>>(e) +} + +// Safety: requires layout of *e to match ErrorImpl. +unsafe fn object_downcast(e: &ErrorImpl<()>, target: TypeId) -> Option> +where + E: 'static, +{ + if TypeId::of::() == target { + // Caller is looking for an E pointer and e is ErrorImpl, take a + // pointer to its E field. + let unerased = e as *const ErrorImpl<()> as *const ErrorImpl; + let addr = &(*unerased)._object as *const E as *mut (); + Some(NonNull::new_unchecked(addr)) + } else { + None + } +} + +// Safety: requires layout of *e to match ErrorImpl>. +#[cfg(feature = "std")] +unsafe fn context_downcast(e: &ErrorImpl<()>, target: TypeId) -> Option> +where + C: 'static, + E: 'static, +{ + if TypeId::of::() == target { + let unerased = e as *const ErrorImpl<()> as *const ErrorImpl>; + let addr = &(*unerased)._object.context as *const C as *mut (); + Some(NonNull::new_unchecked(addr)) + } else if TypeId::of::() == target { + let unerased = e as *const ErrorImpl<()> as *const ErrorImpl>; + let addr = &(*unerased)._object.error as *const E as *mut (); + Some(NonNull::new_unchecked(addr)) + } else { + None + } +} + +// Safety: requires layout of *e to match ErrorImpl>. +#[cfg(feature = "std")] +unsafe fn context_drop_rest(e: Box>, target: TypeId) +where + C: 'static, + E: 'static, +{ + // Called after downcasting by value to either the C or the E and doing a + // ptr::read to take ownership of that value. + if TypeId::of::() == target { + let unerased = mem::transmute::< + Box>, + Box, E>>>, + >(e); + drop(unerased); + } else { + let unerased = mem::transmute::< + Box>, + Box>>>, + >(e); + drop(unerased); + } +} + +// Safety: requires layout of *e to match ErrorImpl>. +unsafe fn context_chain_downcast(e: &ErrorImpl<()>, target: TypeId) -> Option> +where + C: 'static, +{ + if TypeId::of::() == target { + let unerased = e as *const ErrorImpl<()> as *const ErrorImpl>; + let addr = &(*unerased)._object.context as *const C as *mut (); + Some(NonNull::new_unchecked(addr)) + } else { + // Recurse down the context chain per the inner error's vtable. + let unerased = e as *const ErrorImpl<()> as *const ErrorImpl>; + let source = &(*unerased)._object.error; + (source.inner.vtable.object_downcast)(&source.inner, target) + } +} + +// Safety: requires layout of *e to match ErrorImpl>. +unsafe fn context_chain_drop_rest(e: Box>, target: TypeId) +where + C: 'static, +{ + // Called after downcasting by value to either the C or one of the causes + // and doing a ptr::read to take ownership of that value. + if TypeId::of::() == target { + let unerased = mem::transmute::< + Box>, + Box, Error>>>, + >(e); + // Drop the entire rest of the data structure rooted in the next Error. + drop(unerased); + } else { + let unerased = mem::transmute::< + Box>, + Box>>>, + >(e); + // Read out a ManuallyDrop>> from the next error. + let inner = ptr::read(&unerased._object.error.inner); + drop(unerased); + let erased = ManuallyDrop::into_inner(inner); + // Recursively drop the next error using the same target typeid. + (erased.vtable.object_drop_rest)(erased, target); + } +} + +// repr C to ensure that E remains in the final position. +#[repr(C)] +pub(crate) struct ErrorImpl { + vtable: &'static ErrorVTable, + backtrace: Option, + // NOTE: Don't use directly. Use only through vtable. Erased type may have + // different alignment. + _object: E, +} + +// repr C to ensure that ContextError has the same layout as +// ContextError, E> and ContextError>. +#[repr(C)] +pub(crate) struct ContextError { + pub context: C, + pub error: E, +} + +impl ErrorImpl { + fn erase(&self) -> &ErrorImpl<()> { + // Erase the concrete type of E but preserve the vtable in self.vtable + // for manipulating the resulting thin pointer. This is analogous to an + // unsize coersion. + unsafe { &*(self as *const ErrorImpl as *const ErrorImpl<()>) } + } +} + +impl ErrorImpl<()> { + pub(crate) fn error(&self) -> &(dyn StdError + Send + Sync + 'static) { + // Use vtable to attach E's native StdError vtable for the right + // original type E. + unsafe { &*(self.vtable.object_ref)(self) } + } + + #[cfg(feature = "std")] + pub(crate) fn error_mut(&mut self) -> &mut (dyn StdError + Send + Sync + 'static) { + // Use vtable to attach E's native StdError vtable for the right + // original type E. + unsafe { &mut *(self.vtable.object_mut)(self) } + } + + #[cfg(backtrace)] + pub(crate) fn backtrace(&self) -> &Backtrace { + // This unwrap can only panic if the underlying error's backtrace method + // is nondeterministic, which would only happen in maliciously + // constructed code. + self.backtrace + .as_ref() + .or_else(|| self.error().backtrace()) + .expect("backtrace capture failed") + } + + pub(crate) fn chain(&self) -> Chain { + Chain::new(self.error()) + } +} + +impl StdError for ErrorImpl +where + E: StdError, +{ + #[cfg(backtrace)] + fn backtrace(&self) -> Option<&Backtrace> { + Some(self.erase().backtrace()) + } + + fn source(&self) -> Option<&(dyn StdError + 'static)> { + self.erase().error().source() + } +} + +impl Debug for ErrorImpl +where + E: Debug, +{ + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + self.erase().debug(formatter) + } +} + +impl Display for ErrorImpl +where + E: Display, +{ + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + Display::fmt(&self.erase().error(), formatter) + } +} + +impl From for Box { + fn from(error: Error) -> Self { + let outer = ManuallyDrop::new(error); + unsafe { + // Read Box> from error. Can't move it out because + // Error has a Drop impl which we want to not run. + let inner = ptr::read(&outer.inner); + let erased = ManuallyDrop::into_inner(inner); + + // Use vtable to attach ErrorImpl's native StdError vtable for + // the right original type E. + (erased.vtable.object_boxed)(erased) + } + } +} + +impl From for Box { + fn from(error: Error) -> Self { + Box::::from(error) + } +} + +#[cfg(feature = "std")] +impl AsRef for Error { + fn as_ref(&self) -> &(dyn StdError + Send + Sync + 'static) { + &**self + } +} + +#[cfg(feature = "std")] +impl AsRef for Error { + fn as_ref(&self) -> &(dyn StdError + 'static) { + &**self + } +} diff --git a/vendor/anyhow/src/fmt.rs b/vendor/anyhow/src/fmt.rs new file mode 100644 index 0000000000..16a82ba8d8 --- /dev/null +++ b/vendor/anyhow/src/fmt.rs @@ -0,0 +1,149 @@ +use crate::chain::Chain; +use crate::error::ErrorImpl; +use core::fmt::{self, Debug, Write}; + +impl ErrorImpl<()> { + pub(crate) fn display(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.error())?; + + if f.alternate() { + for cause in self.chain().skip(1) { + write!(f, ": {}", cause)?; + } + } + + Ok(()) + } + + pub(crate) fn debug(&self, f: &mut fmt::Formatter) -> fmt::Result { + let error = self.error(); + + if f.alternate() { + return Debug::fmt(error, f); + } + + write!(f, "{}", error)?; + + if let Some(cause) = error.source() { + write!(f, "\n\nCaused by:")?; + let multiple = cause.source().is_some(); + for (n, error) in Chain::new(cause).enumerate() { + writeln!(f)?; + let mut indented = Indented { + inner: f, + number: if multiple { Some(n) } else { None }, + started: false, + }; + write!(indented, "{}", error)?; + } + } + + #[cfg(backtrace)] + { + use std::backtrace::BacktraceStatus; + + let backtrace = self.backtrace(); + if let BacktraceStatus::Captured = backtrace.status() { + let mut backtrace = backtrace.to_string(); + if backtrace.starts_with("stack backtrace:") { + // Capitalize to match "Caused by:" + backtrace.replace_range(0..1, "S"); + } + backtrace.truncate(backtrace.trim_end().len()); + write!(f, "\n\n{}", backtrace)?; + } + } + + Ok(()) + } +} + +struct Indented<'a, D> { + inner: &'a mut D, + number: Option, + started: bool, +} + +impl Write for Indented<'_, T> +where + T: Write, +{ + fn write_str(&mut self, s: &str) -> fmt::Result { + for (i, line) in s.split('\n').enumerate() { + if !self.started { + self.started = true; + match self.number { + Some(number) => write!(self.inner, "{: >5}: ", number)?, + None => self.inner.write_str(" ")?, + } + } else if i > 0 { + self.inner.write_char('\n')?; + if self.number.is_some() { + self.inner.write_str(" ")?; + } else { + self.inner.write_str(" ")?; + } + } + + self.inner.write_str(line)?; + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn one_digit() { + let input = "verify\nthis"; + let expected = " 2: verify\n this"; + let mut output = String::new(); + + Indented { + inner: &mut output, + number: Some(2), + started: false, + } + .write_str(input) + .unwrap(); + + assert_eq!(expected, output); + } + + #[test] + fn two_digits() { + let input = "verify\nthis"; + let expected = " 12: verify\n this"; + let mut output = String::new(); + + Indented { + inner: &mut output, + number: Some(12), + started: false, + } + .write_str(input) + .unwrap(); + + assert_eq!(expected, output); + } + + #[test] + fn no_digits() { + let input = "verify\nthis"; + let expected = " verify\n this"; + let mut output = String::new(); + + Indented { + inner: &mut output, + number: None, + started: false, + } + .write_str(input) + .unwrap(); + + assert_eq!(expected, output); + } +} diff --git a/vendor/anyhow/src/kind.rs b/vendor/anyhow/src/kind.rs new file mode 100644 index 0000000000..fdeb060ad8 --- /dev/null +++ b/vendor/anyhow/src/kind.rs @@ -0,0 +1,116 @@ +// Tagged dispatch mechanism for resolving the behavior of `anyhow!($expr)`. +// +// When anyhow! is given a single expr argument to turn into anyhow::Error, we +// want the resulting Error to pick up the input's implementation of source() +// and backtrace() if it has a std::error::Error impl, otherwise require nothing +// more than Display and Debug. +// +// Expressed in terms of specialization, we want something like: +// +// trait AnyhowNew { +// fn new(self) -> Error; +// } +// +// impl AnyhowNew for T +// where +// T: Display + Debug + Send + Sync + 'static, +// { +// default fn new(self) -> Error { +// /* no std error impl */ +// } +// } +// +// impl AnyhowNew for T +// where +// T: std::error::Error + Send + Sync + 'static, +// { +// fn new(self) -> Error { +// /* use std error's source() and backtrace() */ +// } +// } +// +// Since specialization is not stable yet, instead we rely on autoref behavior +// of method resolution to perform tagged dispatch. Here we have two traits +// AdhocKind and TraitKind that both have an anyhow_kind() method. AdhocKind is +// implemented whether or not the caller's type has a std error impl, while +// TraitKind is implemented only when a std error impl does exist. The ambiguity +// is resolved by AdhocKind requiring an extra autoref so that it has lower +// precedence. +// +// The anyhow! macro will set up the call in this form: +// +// #[allow(unused_imports)] +// use $crate::private::{AdhocKind, TraitKind}; +// let error = $msg; +// (&error).anyhow_kind().new(error) + +use crate::Error; +use core::fmt::{Debug, Display}; + +#[cfg(feature = "std")] +use crate::StdError; + +#[cfg(backtrace)] +use std::backtrace::Backtrace; + +pub struct Adhoc; + +pub trait AdhocKind: Sized { + #[inline] + fn anyhow_kind(&self) -> Adhoc { + Adhoc + } +} + +impl AdhocKind for &T where T: ?Sized + Display + Debug + Send + Sync + 'static {} + +impl Adhoc { + pub fn new(self, message: M) -> Error + where + M: Display + Debug + Send + Sync + 'static, + { + Error::from_adhoc(message, backtrace!()) + } +} + +pub struct Trait; + +pub trait TraitKind: Sized { + #[inline] + fn anyhow_kind(&self) -> Trait { + Trait + } +} + +impl TraitKind for E where E: Into {} + +impl Trait { + pub fn new(self, error: E) -> Error + where + E: Into, + { + error.into() + } +} + +#[cfg(feature = "std")] +pub struct Boxed; + +#[cfg(feature = "std")] +pub trait BoxedKind: Sized { + #[inline] + fn anyhow_kind(&self) -> Boxed { + Boxed + } +} + +#[cfg(feature = "std")] +impl BoxedKind for Box {} + +#[cfg(feature = "std")] +impl Boxed { + pub fn new(self, error: Box) -> Error { + let backtrace = backtrace_if_absent!(error); + Error::from_boxed(error, backtrace) + } +} diff --git a/vendor/anyhow/src/lib.rs b/vendor/anyhow/src/lib.rs new file mode 100644 index 0000000000..39bd6a02f2 --- /dev/null +++ b/vendor/anyhow/src/lib.rs @@ -0,0 +1,582 @@ +//! This library provides [`anyhow::Error`][Error], a trait object based error +//! type for easy idiomatic error handling in Rust applications. +//! +//!
    +//! +//! # Details +//! +//! - Use `Result`, or equivalently `anyhow::Result`, as +//! the return type of any fallible function. +//! +//! Within the function, use `?` to easily propagate any error that implements +//! the `std::error::Error` trait. +//! +//! ``` +//! # pub trait Deserialize {} +//! # +//! # mod serde_json { +//! # use super::Deserialize; +//! # use std::io; +//! # +//! # pub fn from_str(json: &str) -> io::Result { +//! # unimplemented!() +//! # } +//! # } +//! # +//! # struct ClusterMap; +//! # +//! # impl Deserialize for ClusterMap {} +//! # +//! use anyhow::Result; +//! +//! fn get_cluster_info() -> Result { +//! let config = std::fs::read_to_string("cluster.json")?; +//! let map: ClusterMap = serde_json::from_str(&config)?; +//! Ok(map) +//! } +//! # +//! # fn main() {} +//! ``` +//! +//! - Attach context to help the person troubleshooting the error understand +//! where things went wrong. A low-level error like "No such file or +//! directory" can be annoying to debug without more context about what higher +//! level step the application was in the middle of. +//! +//! ``` +//! # struct It; +//! # +//! # impl It { +//! # fn detach(&self) -> Result<()> { +//! # unimplemented!() +//! # } +//! # } +//! # +//! use anyhow::{Context, Result}; +//! +//! fn main() -> Result<()> { +//! # return Ok(()); +//! # +//! # const _: &str = stringify! { +//! ... +//! # }; +//! # +//! # let it = It; +//! # let path = "./path/to/instrs.json"; +//! # +//! it.detach().context("Failed to detach the important thing")?; +//! +//! let content = std::fs::read(path) +//! .with_context(|| format!("Failed to read instrs from {}", path))?; +//! # +//! # const _: &str = stringify! { +//! ... +//! # }; +//! # +//! # Ok(()) +//! } +//! ``` +//! +//! ```console +//! Error: Failed to read instrs from ./path/to/instrs.json +//! +//! Caused by: +//! No such file or directory (os error 2) +//! ``` +//! +//! - Downcasting is supported and can be by value, by shared reference, or by +//! mutable reference as needed. +//! +//! ``` +//! # use anyhow::anyhow; +//! # use std::fmt::{self, Display}; +//! # use std::task::Poll; +//! # +//! # #[derive(Debug)] +//! # enum DataStoreError { +//! # Censored(()), +//! # } +//! # +//! # impl Display for DataStoreError { +//! # fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +//! # unimplemented!() +//! # } +//! # } +//! # +//! # impl std::error::Error for DataStoreError {} +//! # +//! # const REDACTED_CONTENT: () = (); +//! # +//! # let error = anyhow!("..."); +//! # let root_cause = &error; +//! # +//! # let ret = +//! // If the error was caused by redaction, then return a +//! // tombstone instead of the content. +//! match root_cause.downcast_ref::() { +//! Some(DataStoreError::Censored(_)) => Ok(Poll::Ready(REDACTED_CONTENT)), +//! None => Err(error), +//! } +//! # ; +//! ``` +//! +//! - A backtrace is captured and printed with the error if the underlying error +//! type does not already provide its own. In order to see backtraces, the +//! `RUST_LIB_BACKTRACE=1` environment variable must be defined. +//! +//! - Anyhow works with any error type that has an impl of `std::error::Error`, +//! including ones defined in your crate. We do not bundle a `derive(Error)` +//! macro but you can write the impls yourself or use a standalone macro like +//! [thiserror]. +//! +//! [thiserror]: https://github.com/dtolnay/thiserror +//! +//! ``` +//! use thiserror::Error; +//! +//! #[derive(Error, Debug)] +//! pub enum FormatError { +//! #[error("Invalid header (expected {expected:?}, got {found:?})")] +//! InvalidHeader { +//! expected: String, +//! found: String, +//! }, +//! #[error("Missing attribute: {0}")] +//! MissingAttribute(String), +//! } +//! ``` +//! +//! - One-off error messages can be constructed using the `anyhow!` macro, which +//! supports string interpolation and produces an `anyhow::Error`. +//! +//! ``` +//! # use anyhow::{anyhow, Result}; +//! # +//! # fn demo() -> Result<()> { +//! # let missing = "..."; +//! return Err(anyhow!("Missing attribute: {}", missing)); +//! # Ok(()) +//! # } +//! ``` +//! +//!
    +//! +//! # No-std support +//! +//! In no_std mode, the same API is almost all available and works the same way. +//! To depend on Anyhow in no_std mode, disable our default enabled "std" +//! feature in Cargo.toml. A global allocator is required. +//! +//! ```toml +//! [dependencies] +//! anyhow = { version = "1.0", default-features = false } +//! ``` +//! +//! Since the `?`-based error conversions would normally rely on the +//! `std::error::Error` trait which is only available through std, no_std mode +//! will require an explicit `.map_err(Error::msg)` when working with a +//! non-Anyhow error type inside a function that returns Anyhow's error type. + +#![doc(html_root_url = "https://docs.rs/anyhow/1.0.26")] +#![cfg_attr(backtrace, feature(backtrace))] +#![cfg_attr(not(feature = "std"), no_std)] +#![allow( + clippy::needless_doctest_main, + clippy::new_ret_no_self, + clippy::wrong_self_convention +)] + +mod alloc { + #[cfg(not(feature = "std"))] + extern crate alloc; + + #[cfg(not(feature = "std"))] + pub use alloc::boxed::Box; + + #[cfg(feature = "std")] + pub use std::boxed::Box; +} + +#[macro_use] +mod backtrace; +mod chain; +mod context; +mod error; +mod fmt; +mod kind; +mod macros; +mod wrapper; + +use crate::alloc::Box; +use crate::error::ErrorImpl; +use core::fmt::Display; +use core::mem::ManuallyDrop; + +#[cfg(not(feature = "std"))] +use core::fmt::Debug; + +#[cfg(feature = "std")] +use std::error::Error as StdError; + +#[cfg(not(feature = "std"))] +trait StdError: Debug + Display { + fn source(&self) -> Option<&(dyn StdError + 'static)> { + None + } +} + +pub use anyhow as format_err; + +/// The `Error` type, a wrapper around a dynamic error type. +/// +/// `Error` works a lot like `Box`, but with these +/// differences: +/// +/// - `Error` requires that the error is `Send`, `Sync`, and `'static`. +/// - `Error` guarantees that a backtrace is available, even if the underlying +/// error type does not provide one. +/// - `Error` is represented as a narrow pointer — exactly one word in +/// size instead of two. +/// +///
    +/// +/// # Display representations +/// +/// When you print an error object using "{}" or to_string(), only the outermost +/// underlying error or context is printed, not any of the lower level causes. +/// This is exactly as if you had called the Display impl of the error from +/// which you constructed your anyhow::Error. +/// +/// ```console +/// Failed to read instrs from ./path/to/instrs.json +/// ``` +/// +/// To print causes as well using anyhow's default formatting of causes, use the +/// alternate selector "{:#}". +/// +/// ```console +/// Failed to read instrs from ./path/to/instrs.json: No such file or directory (os error 2) +/// ``` +/// +/// The Debug format "{:?}" includes your backtrace if one was captured. Note +/// that this is the representation you get by default if you return an error +/// from `fn main` instead of printing it explicitly yourself. +/// +/// ```console +/// Error: Failed to read instrs from ./path/to/instrs.json +/// +/// Caused by: +/// No such file or directory (os error 2) +/// +/// Stack backtrace: +/// 0: ::ext_context +/// at /git/anyhow/src/backtrace.rs:26 +/// 1: core::result::Result::map_err +/// at /git/rustc/src/libcore/result.rs:596 +/// 2: anyhow::context:: for core::result::Result>::with_context +/// at /git/anyhow/src/context.rs:58 +/// 3: testing::main +/// at src/main.rs:5 +/// 4: std::rt::lang_start +/// at /git/rustc/src/libstd/rt.rs:61 +/// 5: main +/// 6: __libc_start_main +/// 7: _start +/// ``` +/// +/// To see a conventional struct-style Debug representation, use "{:#?}". +/// +/// ```console +/// Error { +/// context: "Failed to read instrs from ./path/to/instrs.json", +/// source: Os { +/// code: 2, +/// kind: NotFound, +/// message: "No such file or directory", +/// }, +/// } +/// ``` +/// +/// If none of the built-in representations are appropriate and you would prefer +/// to render the error and its cause chain yourself, it can be done something +/// like this: +/// +/// ``` +/// use anyhow::{Context, Result}; +/// +/// fn main() { +/// if let Err(err) = try_main() { +/// eprintln!("ERROR: {}", err); +/// err.chain().skip(1).for_each(|cause| eprintln!("because: {}", cause)); +/// std::process::exit(1); +/// } +/// } +/// +/// fn try_main() -> Result<()> { +/// # const IGNORE: &str = stringify! { +/// ... +/// # }; +/// # Ok(()) +/// } +/// ``` +pub struct Error { + inner: ManuallyDrop>>, +} + +/// Iterator of a chain of source errors. +/// +/// This type is the iterator returned by [`Error::chain`]. +/// +/// # Example +/// +/// ``` +/// use anyhow::Error; +/// use std::io; +/// +/// pub fn underlying_io_error_kind(error: &Error) -> Option { +/// for cause in error.chain() { +/// if let Some(io_error) = cause.downcast_ref::() { +/// return Some(io_error.kind()); +/// } +/// } +/// None +/// } +/// ``` +#[cfg(feature = "std")] +#[derive(Clone)] +pub struct Chain<'a> { + state: crate::chain::ChainState<'a>, +} + +/// `Result` +/// +/// This is a reasonable return type to use throughout your application but also +/// for `fn main`; if you do, failures will be printed along with any +/// [context][Context] and a backtrace if one was captured. +/// +/// `anyhow::Result` may be used with one *or* two type parameters. +/// +/// ```rust +/// use anyhow::Result; +/// +/// # const IGNORE: &str = stringify! { +/// fn demo1() -> Result {...} +/// // ^ equivalent to std::result::Result +/// +/// fn demo2() -> Result {...} +/// // ^ equivalent to std::result::Result +/// # }; +/// ``` +/// +/// # Example +/// +/// ``` +/// # pub trait Deserialize {} +/// # +/// # mod serde_json { +/// # use super::Deserialize; +/// # use std::io; +/// # +/// # pub fn from_str(json: &str) -> io::Result { +/// # unimplemented!() +/// # } +/// # } +/// # +/// # #[derive(Debug)] +/// # struct ClusterMap; +/// # +/// # impl Deserialize for ClusterMap {} +/// # +/// use anyhow::Result; +/// +/// fn main() -> Result<()> { +/// # return Ok(()); +/// let config = std::fs::read_to_string("cluster.json")?; +/// let map: ClusterMap = serde_json::from_str(&config)?; +/// println!("cluster info: {:#?}", map); +/// Ok(()) +/// } +/// ``` +pub type Result = core::result::Result; + +/// Provides the `context` method for `Result`. +/// +/// This trait is sealed and cannot be implemented for types outside of +/// `anyhow`. +/// +///
    +/// +/// # Example +/// +/// ``` +/// use anyhow::{Context, Result}; +/// use std::fs; +/// use std::path::PathBuf; +/// +/// pub struct ImportantThing { +/// path: PathBuf, +/// } +/// +/// impl ImportantThing { +/// # const IGNORE: &'static str = stringify! { +/// pub fn detach(&mut self) -> Result<()> {...} +/// # }; +/// # fn detach(&mut self) -> Result<()> { +/// # unimplemented!() +/// # } +/// } +/// +/// pub fn do_it(mut it: ImportantThing) -> Result> { +/// it.detach().context("Failed to detach the important thing")?; +/// +/// let path = &it.path; +/// let content = fs::read(path) +/// .with_context(|| format!("Failed to read instrs from {}", path.display()))?; +/// +/// Ok(content) +/// } +/// ``` +/// +/// When printed, the outermost context would be printed first and the lower +/// level underlying causes would be enumerated below. +/// +/// ```console +/// Error: Failed to read instrs from ./path/to/instrs.json +/// +/// Caused by: +/// No such file or directory (os error 2) +/// ``` +/// +///
    +/// +/// # Effect on downcasting +/// +/// After attaching context of type `C` onto an error of type `E`, the resulting +/// `anyhow::Error` may be downcast to `C` **or** to `E`. +/// +/// That is, in codebases that rely on downcasting, Anyhow's context supports +/// both of the following use cases: +/// +/// - **Attaching context whose type is insignificant onto errors whose type +/// is used in downcasts.** +/// +/// In other error libraries whose context is not designed this way, it can +/// be risky to introduce context to existing code because new context might +/// break existing working downcasts. In Anyhow, any downcast that worked +/// before adding context will continue to work after you add a context, so +/// you should freely add human-readable context to errors wherever it would +/// be helpful. +/// +/// ``` +/// # use anyhow::bail; +/// # use thiserror::Error; +/// # +/// # #[derive(Error, Debug)] +/// # #[error("???")] +/// # struct SuspiciousError; +/// # +/// # fn helper() -> Result<()> { +/// # bail!(SuspiciousError); +/// # } +/// # +/// use anyhow::{Context, Result}; +/// +/// fn do_it() -> Result<()> { +/// helper().context("Failed to complete the work")?; +/// # const IGNORE: &str = stringify! { +/// ... +/// # }; +/// # unreachable!() +/// } +/// +/// fn main() { +/// let err = do_it().unwrap_err(); +/// if let Some(e) = err.downcast_ref::() { +/// // If helper() returned SuspiciousError, this downcast will +/// // correctly succeed even with the context in between. +/// # return; +/// } +/// # panic!("expected downcast to succeed"); +/// } +/// ``` +/// +/// - **Attaching context whose type is used in downcasts onto errors whose +/// type is insignificant.** +/// +/// Some codebases prefer to use machine-readable context to categorize +/// lower level errors in a way that will be actionable to higher levels of +/// the application. +/// +/// ``` +/// # use anyhow::bail; +/// # use thiserror::Error; +/// # +/// # #[derive(Error, Debug)] +/// # #[error("???")] +/// # struct HelperFailed; +/// # +/// # fn helper() -> Result<()> { +/// # bail!("no such file or directory"); +/// # } +/// # +/// use anyhow::{Context, Result}; +/// +/// fn do_it() -> Result<()> { +/// helper().context(HelperFailed)?; +/// # const IGNORE: &str = stringify! { +/// ... +/// # }; +/// # unreachable!() +/// } +/// +/// fn main() { +/// let err = do_it().unwrap_err(); +/// if let Some(e) = err.downcast_ref::() { +/// // If helper failed, this downcast will succeed because +/// // HelperFailed is the context that has been attached to +/// // that error. +/// # return; +/// } +/// # panic!("expected downcast to succeed"); +/// } +/// ``` +pub trait Context: context::private::Sealed { + /// Wrap the error value with additional context. + fn context(self, context: C) -> Result + where + C: Display + Send + Sync + 'static; + + /// Wrap the error value with additional context that is evaluated lazily + /// only once an error does occur. + fn with_context(self, f: F) -> Result + where + C: Display + Send + Sync + 'static, + F: FnOnce() -> C; +} + +// Not public API. Referenced by macro-generated code. +#[doc(hidden)] +pub mod private { + use crate::Error; + use core::fmt::{Debug, Display}; + + #[cfg(backtrace)] + use std::backtrace::Backtrace; + + pub use core::result::Result::Err; + + #[doc(hidden)] + pub mod kind { + pub use crate::kind::{AdhocKind, TraitKind}; + + #[cfg(feature = "std")] + pub use crate::kind::BoxedKind; + } + + pub fn new_adhoc(message: M) -> Error + where + M: Display + Debug + Send + Sync + 'static, + { + Error::from_adhoc(message, backtrace!()) + } +} diff --git a/vendor/anyhow/src/macros.rs b/vendor/anyhow/src/macros.rs new file mode 100644 index 0000000000..15a920810c --- /dev/null +++ b/vendor/anyhow/src/macros.rs @@ -0,0 +1,163 @@ +/// Return early with an error. +/// +/// This macro is equivalent to `return Err(From::from($err))`. +/// +/// # Example +/// +/// ``` +/// # use anyhow::{bail, Result}; +/// # +/// # fn has_permission(user: usize, resource: usize) -> bool { +/// # true +/// # } +/// # +/// # fn main() -> Result<()> { +/// # let user = 0; +/// # let resource = 0; +/// # +/// if !has_permission(user, resource) { +/// bail!("permission denied for accessing {}", resource); +/// } +/// # Ok(()) +/// # } +/// ``` +/// +/// ``` +/// # use anyhow::{bail, Result}; +/// # use thiserror::Error; +/// # +/// # const MAX_DEPTH: usize = 1; +/// # +/// #[derive(Error, Debug)] +/// enum ScienceError { +/// #[error("recursion limit exceeded")] +/// RecursionLimitExceeded, +/// # #[error("...")] +/// # More = (stringify! { +/// ... +/// # }, 1).1, +/// } +/// +/// # fn main() -> Result<()> { +/// # let depth = 0; +/// # +/// if depth > MAX_DEPTH { +/// bail!(ScienceError::RecursionLimitExceeded); +/// } +/// # Ok(()) +/// # } +/// ``` +#[macro_export] +macro_rules! bail { + ($msg:literal $(,)?) => { + return $crate::private::Err($crate::anyhow!($msg)); + }; + ($err:expr $(,)?) => { + return $crate::private::Err($crate::anyhow!($err)); + }; + ($fmt:expr, $($arg:tt)*) => { + return $crate::private::Err($crate::anyhow!($fmt, $($arg)*)); + }; +} + +/// Return early with an error if a condition is not satisfied. +/// +/// This macro is equivalent to `if !$cond { return Err(From::from($err)); }`. +/// +/// Analogously to `assert!`, `ensure!` takes a condition and exits the function +/// if the condition fails. Unlike `assert!`, `ensure!` returns an `Error` +/// rather than panicking. +/// +/// # Example +/// +/// ``` +/// # use anyhow::{ensure, Result}; +/// # +/// # fn main() -> Result<()> { +/// # let user = 0; +/// # +/// ensure!(user == 0, "only user 0 is allowed"); +/// # Ok(()) +/// # } +/// ``` +/// +/// ``` +/// # use anyhow::{ensure, Result}; +/// # use thiserror::Error; +/// # +/// # const MAX_DEPTH: usize = 1; +/// # +/// #[derive(Error, Debug)] +/// enum ScienceError { +/// #[error("recursion limit exceeded")] +/// RecursionLimitExceeded, +/// # #[error("...")] +/// # More = (stringify! { +/// ... +/// # }, 1).1, +/// } +/// +/// # fn main() -> Result<()> { +/// # let depth = 0; +/// # +/// ensure!(depth <= MAX_DEPTH, ScienceError::RecursionLimitExceeded); +/// # Ok(()) +/// # } +/// ``` +#[macro_export] +macro_rules! ensure { + ($cond:expr, $msg:literal $(,)?) => { + if !$cond { + return $crate::private::Err($crate::anyhow!($msg)); + } + }; + ($cond:expr, $err:expr $(,)?) => { + if !$cond { + return $crate::private::Err($crate::anyhow!($err)); + } + }; + ($cond:expr, $fmt:expr, $($arg:tt)*) => { + if !$cond { + return $crate::private::Err($crate::anyhow!($fmt, $($arg)*)); + } + }; +} + +/// Construct an ad-hoc error from a string. +/// +/// This evaluates to an `Error`. It can take either just a string, or a format +/// string with arguments. It also can take any custom type which implements +/// `Debug` and `Display`. +/// +/// # Example +/// +/// ``` +/// # type V = (); +/// # +/// use anyhow::{anyhow, Result}; +/// +/// fn lookup(key: &str) -> Result { +/// if key.len() != 16 { +/// return Err(anyhow!("key length must be 16 characters, got {:?}", key)); +/// } +/// +/// // ... +/// # Ok(()) +/// } +/// ``` +#[macro_export] +macro_rules! anyhow { + ($msg:literal $(,)?) => { + // Handle $:literal as a special case to make cargo-expanded code more + // concise in the common case. + $crate::private::new_adhoc($msg) + }; + ($err:expr $(,)?) => ({ + use $crate::private::kind::*; + let error = $err; + (&error).anyhow_kind().new(error) + }); + ($fmt:expr, $($arg:tt)*) => { + $crate::private::new_adhoc(format!($fmt, $($arg)*)) + }; +} diff --git a/vendor/anyhow/src/wrapper.rs b/vendor/anyhow/src/wrapper.rs new file mode 100644 index 0000000000..3ebe51a883 --- /dev/null +++ b/vendor/anyhow/src/wrapper.rs @@ -0,0 +1,78 @@ +use crate::StdError; +use core::fmt::{self, Debug, Display}; + +#[repr(transparent)] +pub struct MessageError(pub M); + +impl Debug for MessageError +where + M: Display + Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + Debug::fmt(&self.0, f) + } +} + +impl Display for MessageError +where + M: Display + Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + Display::fmt(&self.0, f) + } +} + +impl StdError for MessageError where M: Display + Debug + 'static {} + +#[repr(transparent)] +pub struct DisplayError(pub M); + +impl Debug for DisplayError +where + M: Display, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + Display::fmt(&self.0, f) + } +} + +impl Display for DisplayError +where + M: Display, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + Display::fmt(&self.0, f) + } +} + +impl StdError for DisplayError where M: Display + 'static {} + +#[cfg(feature = "std")] +#[repr(transparent)] +pub struct BoxedError(pub Box); + +#[cfg(feature = "std")] +impl Debug for BoxedError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + Debug::fmt(&self.0, f) + } +} + +#[cfg(feature = "std")] +impl Display for BoxedError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + Display::fmt(&self.0, f) + } +} + +#[cfg(feature = "std")] +impl StdError for BoxedError { + #[cfg(backtrace)] + fn backtrace(&self) -> Option<&crate::backtrace::Backtrace> { + self.0.backtrace() + } + + fn source(&self) -> Option<&(dyn StdError + 'static)> { + self.0.source() + } +} diff --git a/vendor/anyhow/tests/common/mod.rs b/vendor/anyhow/tests/common/mod.rs new file mode 100644 index 0000000000..fc165a5be9 --- /dev/null +++ b/vendor/anyhow/tests/common/mod.rs @@ -0,0 +1,14 @@ +use anyhow::{bail, Result}; +use std::io; + +pub fn bail_literal() -> Result<()> { + bail!("oh no!"); +} + +pub fn bail_fmt() -> Result<()> { + bail!("{} {}!", "oh", "no"); +} + +pub fn bail_error() -> Result<()> { + bail!(io::Error::new(io::ErrorKind::Other, "oh no!")); +} diff --git a/vendor/anyhow/tests/compiletest.rs b/vendor/anyhow/tests/compiletest.rs new file mode 100644 index 0000000000..f9aea23b51 --- /dev/null +++ b/vendor/anyhow/tests/compiletest.rs @@ -0,0 +1,6 @@ +#[rustversion::attr(not(nightly), ignore)] +#[test] +fn ui() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/ui/*.rs"); +} diff --git a/vendor/anyhow/tests/drop/mod.rs b/vendor/anyhow/tests/drop/mod.rs new file mode 100644 index 0000000000..c9d7144479 --- /dev/null +++ b/vendor/anyhow/tests/drop/mod.rs @@ -0,0 +1,52 @@ +use std::error::Error as StdError; +use std::fmt::{self, Display}; +use std::sync::atomic::AtomicBool; +use std::sync::atomic::Ordering::SeqCst; +use std::sync::Arc; + +#[derive(Debug)] +pub struct Flag { + atomic: Arc, +} + +impl Flag { + pub fn new() -> Self { + Flag { + atomic: Arc::new(AtomicBool::new(false)), + } + } + + pub fn get(&self) -> bool { + self.atomic.load(SeqCst) + } +} + +#[derive(Debug)] +pub struct DetectDrop { + has_dropped: Flag, +} + +impl DetectDrop { + pub fn new(has_dropped: &Flag) -> Self { + DetectDrop { + has_dropped: Flag { + atomic: Arc::clone(&has_dropped.atomic), + }, + } + } +} + +impl StdError for DetectDrop {} + +impl Display for DetectDrop { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "oh no!") + } +} + +impl Drop for DetectDrop { + fn drop(&mut self) { + let already_dropped = self.has_dropped.atomic.swap(true, SeqCst); + assert!(!already_dropped); + } +} diff --git a/vendor/anyhow/tests/test_autotrait.rs b/vendor/anyhow/tests/test_autotrait.rs new file mode 100644 index 0000000000..0c9326dad6 --- /dev/null +++ b/vendor/anyhow/tests/test_autotrait.rs @@ -0,0 +1,13 @@ +use anyhow::Error; + +#[test] +fn test_send() { + fn assert_send() {} + assert_send::(); +} + +#[test] +fn test_sync() { + fn assert_sync() {} + assert_sync::(); +} diff --git a/vendor/anyhow/tests/test_backtrace.rs b/vendor/anyhow/tests/test_backtrace.rs new file mode 100644 index 0000000000..ce385f5011 --- /dev/null +++ b/vendor/anyhow/tests/test_backtrace.rs @@ -0,0 +1,13 @@ +#[rustversion::not(nightly)] +#[ignore] +#[test] +fn test_backtrace() {} + +#[rustversion::nightly] +#[test] +fn test_backtrace() { + use anyhow::anyhow; + + let error = anyhow!("oh no!"); + let _ = error.backtrace(); +} diff --git a/vendor/anyhow/tests/test_boxed.rs b/vendor/anyhow/tests/test_boxed.rs new file mode 100644 index 0000000000..38a568fb73 --- /dev/null +++ b/vendor/anyhow/tests/test_boxed.rs @@ -0,0 +1,40 @@ +use anyhow::anyhow; +use std::error::Error as StdError; +use std::io; +use thiserror::Error; + +#[derive(Error, Debug)] +#[error("outer")] +struct MyError { + source: io::Error, +} + +#[test] +fn test_boxed_str() { + let error = Box::::from("oh no!"); + let error = anyhow!(error); + assert_eq!("oh no!", error.to_string()); + assert_eq!( + "oh no!", + error + .downcast_ref::>() + .unwrap() + .to_string() + ); +} + +#[test] +fn test_boxed_thiserror() { + let error = MyError { + source: io::Error::new(io::ErrorKind::Other, "oh no!"), + }; + let error = anyhow!(error); + assert_eq!("oh no!", error.source().unwrap().to_string()); +} + +#[test] +fn test_boxed_anyhow() { + let error = anyhow!("oh no!").context("it failed"); + let error = anyhow!(error); + assert_eq!("oh no!", error.source().unwrap().to_string()); +} diff --git a/vendor/anyhow/tests/test_chain.rs b/vendor/anyhow/tests/test_chain.rs new file mode 100644 index 0000000000..b1c5a3daaa --- /dev/null +++ b/vendor/anyhow/tests/test_chain.rs @@ -0,0 +1,45 @@ +use anyhow::{anyhow, Error}; + +fn error() -> Error { + anyhow!(0).context(1).context(2).context(3) +} + +#[test] +fn test_iter() { + let e = error(); + let mut chain = e.chain(); + assert_eq!("3", chain.next().unwrap().to_string()); + assert_eq!("2", chain.next().unwrap().to_string()); + assert_eq!("1", chain.next().unwrap().to_string()); + assert_eq!("0", chain.next().unwrap().to_string()); + assert!(chain.next().is_none()); + assert!(chain.next_back().is_none()); +} + +#[test] +fn test_rev() { + let e = error(); + let mut chain = e.chain().rev(); + assert_eq!("0", chain.next().unwrap().to_string()); + assert_eq!("1", chain.next().unwrap().to_string()); + assert_eq!("2", chain.next().unwrap().to_string()); + assert_eq!("3", chain.next().unwrap().to_string()); + assert!(chain.next().is_none()); + assert!(chain.next_back().is_none()); +} + +#[test] +fn test_len() { + let e = error(); + let mut chain = e.chain(); + assert_eq!(4, chain.len()); + assert_eq!("3", chain.next().unwrap().to_string()); + assert_eq!(3, chain.len()); + assert_eq!("0", chain.next_back().unwrap().to_string()); + assert_eq!(2, chain.len()); + assert_eq!("2", chain.next().unwrap().to_string()); + assert_eq!(1, chain.len()); + assert_eq!("1", chain.next_back().unwrap().to_string()); + assert_eq!(0, chain.len()); + assert!(chain.next().is_none()); +} diff --git a/vendor/anyhow/tests/test_context.rs b/vendor/anyhow/tests/test_context.rs new file mode 100644 index 0000000000..44c1c7036e --- /dev/null +++ b/vendor/anyhow/tests/test_context.rs @@ -0,0 +1,159 @@ +mod drop; + +use crate::drop::{DetectDrop, Flag}; +use anyhow::{Context, Error, Result}; +use std::fmt::{self, Display}; +use thiserror::Error; + +// https://github.com/dtolnay/anyhow/issues/18 +#[test] +fn test_inference() -> Result<()> { + let x = "1"; + let y: u32 = x.parse().context("...")?; + assert_eq!(y, 1); + Ok(()) +} + +macro_rules! context_type { + ($name:ident) => { + #[derive(Debug)] + struct $name { + message: &'static str, + drop: DetectDrop, + } + + impl Display for $name { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.write_str(self.message) + } + } + }; +} + +context_type!(HighLevel); +context_type!(MidLevel); + +#[derive(Error, Debug)] +#[error("{message}")] +struct LowLevel { + message: &'static str, + drop: DetectDrop, +} + +struct Dropped { + low: Flag, + mid: Flag, + high: Flag, +} + +impl Dropped { + fn none(&self) -> bool { + !self.low.get() && !self.mid.get() && !self.high.get() + } + + fn all(&self) -> bool { + self.low.get() && self.mid.get() && self.high.get() + } +} + +fn make_chain() -> (Error, Dropped) { + let dropped = Dropped { + low: Flag::new(), + mid: Flag::new(), + high: Flag::new(), + }; + + let low = LowLevel { + message: "no such file or directory", + drop: DetectDrop::new(&dropped.low), + }; + + // impl Context for Result + let mid = Err::<(), LowLevel>(low) + .context(MidLevel { + message: "failed to load config", + drop: DetectDrop::new(&dropped.mid), + }) + .unwrap_err(); + + // impl Context for Result + let high = Err::<(), Error>(mid) + .context(HighLevel { + message: "failed to start server", + drop: DetectDrop::new(&dropped.high), + }) + .unwrap_err(); + + (high, dropped) +} + +#[test] +fn test_downcast_ref() { + let (err, dropped) = make_chain(); + + assert!(!err.is::()); + assert!(err.downcast_ref::().is_none()); + + assert!(err.is::()); + let high = err.downcast_ref::().unwrap(); + assert_eq!(high.to_string(), "failed to start server"); + + assert!(err.is::()); + let mid = err.downcast_ref::().unwrap(); + assert_eq!(mid.to_string(), "failed to load config"); + + assert!(err.is::()); + let low = err.downcast_ref::().unwrap(); + assert_eq!(low.to_string(), "no such file or directory"); + + assert!(dropped.none()); + drop(err); + assert!(dropped.all()); +} + +#[test] +fn test_downcast_high() { + let (err, dropped) = make_chain(); + + let err = err.downcast::().unwrap(); + assert!(!dropped.high.get()); + assert!(dropped.low.get() && dropped.mid.get()); + + drop(err); + assert!(dropped.all()); +} + +#[test] +fn test_downcast_mid() { + let (err, dropped) = make_chain(); + + let err = err.downcast::().unwrap(); + assert!(!dropped.mid.get()); + assert!(dropped.low.get() && dropped.high.get()); + + drop(err); + assert!(dropped.all()); +} + +#[test] +fn test_downcast_low() { + let (err, dropped) = make_chain(); + + let err = err.downcast::().unwrap(); + assert!(!dropped.low.get()); + assert!(dropped.mid.get() && dropped.high.get()); + + drop(err); + assert!(dropped.all()); +} + +#[test] +fn test_unsuccessful_downcast() { + let (err, dropped) = make_chain(); + + let err = err.downcast::().unwrap_err(); + assert!(dropped.none()); + + drop(err); + assert!(dropped.all()); +} diff --git a/vendor/anyhow/tests/test_convert.rs b/vendor/anyhow/tests/test_convert.rs new file mode 100644 index 0000000000..72da020be6 --- /dev/null +++ b/vendor/anyhow/tests/test_convert.rs @@ -0,0 +1,24 @@ +mod drop; + +use self::drop::{DetectDrop, Flag}; +use anyhow::{Error, Result}; +use std::error::Error as StdError; + +#[test] +fn test_convert() { + let has_dropped = Flag::new(); + let error = Error::new(DetectDrop::new(&has_dropped)); + let box_dyn = Box::::from(error); + assert_eq!("oh no!", box_dyn.to_string()); + drop(box_dyn); + assert!(has_dropped.get()); +} + +#[test] +fn test_question_mark() -> Result<(), Box> { + fn f() -> Result<()> { + Ok(()) + } + f()?; + Ok(()) +} diff --git a/vendor/anyhow/tests/test_downcast.rs b/vendor/anyhow/tests/test_downcast.rs new file mode 100644 index 0000000000..c2c3e129ff --- /dev/null +++ b/vendor/anyhow/tests/test_downcast.rs @@ -0,0 +1,106 @@ +mod common; +mod drop; + +use self::common::*; +use self::drop::{DetectDrop, Flag}; +use anyhow::Error; +use std::error::Error as StdError; +use std::fmt::{self, Display}; +use std::io; + +#[test] +fn test_downcast() { + assert_eq!( + "oh no!", + bail_literal().unwrap_err().downcast::<&str>().unwrap(), + ); + assert_eq!( + "oh no!", + bail_fmt().unwrap_err().downcast::().unwrap(), + ); + assert_eq!( + "oh no!", + bail_error() + .unwrap_err() + .downcast::() + .unwrap() + .to_string(), + ); +} + +#[test] +fn test_downcast_ref() { + assert_eq!( + "oh no!", + *bail_literal().unwrap_err().downcast_ref::<&str>().unwrap(), + ); + assert_eq!( + "oh no!", + bail_fmt().unwrap_err().downcast_ref::().unwrap(), + ); + assert_eq!( + "oh no!", + bail_error() + .unwrap_err() + .downcast_ref::() + .unwrap() + .to_string(), + ); +} + +#[test] +fn test_downcast_mut() { + assert_eq!( + "oh no!", + *bail_literal().unwrap_err().downcast_mut::<&str>().unwrap(), + ); + assert_eq!( + "oh no!", + bail_fmt().unwrap_err().downcast_mut::().unwrap(), + ); + assert_eq!( + "oh no!", + bail_error() + .unwrap_err() + .downcast_mut::() + .unwrap() + .to_string(), + ); +} + +#[test] +fn test_drop() { + let has_dropped = Flag::new(); + let error = Error::new(DetectDrop::new(&has_dropped)); + drop(error.downcast::().unwrap()); + assert!(has_dropped.get()); +} + +#[test] +fn test_large_alignment() { + #[repr(align(64))] + #[derive(Debug)] + struct LargeAlignedError(&'static str); + + impl Display for LargeAlignedError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.write_str(self.0) + } + } + + impl StdError for LargeAlignedError {} + + let error = Error::new(LargeAlignedError("oh no!")); + assert_eq!( + "oh no!", + error.downcast_ref::().unwrap().0 + ); +} + +#[test] +fn test_unsuccessful_downcast() { + let mut error = bail_error().unwrap_err(); + assert!(error.downcast_ref::<&str>().is_none()); + assert!(error.downcast_mut::<&str>().is_none()); + assert!(error.downcast::<&str>().is_err()); +} diff --git a/vendor/anyhow/tests/test_fmt.rs b/vendor/anyhow/tests/test_fmt.rs new file mode 100644 index 0000000000..cc4929197d --- /dev/null +++ b/vendor/anyhow/tests/test_fmt.rs @@ -0,0 +1,94 @@ +use anyhow::{bail, Context, Result}; +use std::io; + +fn f() -> Result<()> { + bail!(io::Error::new(io::ErrorKind::PermissionDenied, "oh no!")); +} + +fn g() -> Result<()> { + f().context("f failed") +} + +fn h() -> Result<()> { + g().context("g failed") +} + +const EXPECTED_ALTDISPLAY_F: &str = "oh no!"; + +const EXPECTED_ALTDISPLAY_G: &str = "f failed: oh no!"; + +const EXPECTED_ALTDISPLAY_H: &str = "g failed: f failed: oh no!"; + +const EXPECTED_DEBUG_F: &str = "oh no!"; + +const EXPECTED_DEBUG_G: &str = "\ +f failed + +Caused by: + oh no!\ +"; + +const EXPECTED_DEBUG_H: &str = "\ +g failed + +Caused by: + 0: f failed + 1: oh no!\ +"; + +const EXPECTED_ALTDEBUG_F: &str = "\ +Custom { + kind: PermissionDenied, + error: \"oh no!\", +}\ +"; + +const EXPECTED_ALTDEBUG_G: &str = "\ +Error { + context: \"f failed\", + source: Custom { + kind: PermissionDenied, + error: \"oh no!\", + }, +}\ +"; + +const EXPECTED_ALTDEBUG_H: &str = "\ +Error { + context: \"g failed\", + source: Error { + context: \"f failed\", + source: Custom { + kind: PermissionDenied, + error: \"oh no!\", + }, + }, +}\ +"; + +#[test] +fn test_display() { + assert_eq!("g failed", h().unwrap_err().to_string()); +} + +#[test] +fn test_altdisplay() { + assert_eq!(EXPECTED_ALTDISPLAY_F, format!("{:#}", f().unwrap_err())); + assert_eq!(EXPECTED_ALTDISPLAY_G, format!("{:#}", g().unwrap_err())); + assert_eq!(EXPECTED_ALTDISPLAY_H, format!("{:#}", h().unwrap_err())); +} + +#[test] +#[cfg_attr(not(backtrace), ignore)] +fn test_debug() { + assert_eq!(EXPECTED_DEBUG_F, format!("{:?}", f().unwrap_err())); + assert_eq!(EXPECTED_DEBUG_G, format!("{:?}", g().unwrap_err())); + assert_eq!(EXPECTED_DEBUG_H, format!("{:?}", h().unwrap_err())); +} + +#[test] +fn test_altdebug() { + assert_eq!(EXPECTED_ALTDEBUG_F, format!("{:#?}", f().unwrap_err())); + assert_eq!(EXPECTED_ALTDEBUG_G, format!("{:#?}", g().unwrap_err())); + assert_eq!(EXPECTED_ALTDEBUG_H, format!("{:#?}", h().unwrap_err())); +} diff --git a/vendor/anyhow/tests/test_macros.rs b/vendor/anyhow/tests/test_macros.rs new file mode 100644 index 0000000000..c6888b6b63 --- /dev/null +++ b/vendor/anyhow/tests/test_macros.rs @@ -0,0 +1,33 @@ +mod common; + +use self::common::*; +use anyhow::ensure; + +#[test] +fn test_messages() { + assert_eq!("oh no!", bail_literal().unwrap_err().to_string()); + assert_eq!("oh no!", bail_fmt().unwrap_err().to_string()); + assert_eq!("oh no!", bail_error().unwrap_err().to_string()); +} + +#[test] +fn test_ensure() { + let f = || { + ensure!(1 + 1 == 2, "This is correct"); + Ok(()) + }; + assert!(f().is_ok()); + + let v = 1; + let f = || { + ensure!(v + v == 2, "This is correct, v: {}", v); + Ok(()) + }; + assert!(f().is_ok()); + + let f = || { + ensure!(v + v == 1, "This is not correct, v: {}", v); + Ok(()) + }; + assert!(f().is_err()); +} diff --git a/vendor/anyhow/tests/test_repr.rs b/vendor/anyhow/tests/test_repr.rs new file mode 100644 index 0000000000..72f5002ae1 --- /dev/null +++ b/vendor/anyhow/tests/test_repr.rs @@ -0,0 +1,29 @@ +mod drop; + +use self::drop::{DetectDrop, Flag}; +use anyhow::Error; +use std::marker::Unpin; +use std::mem; + +#[test] +fn test_error_size() { + assert_eq!(mem::size_of::(), mem::size_of::()); +} + +#[test] +fn test_null_pointer_optimization() { + assert_eq!(mem::size_of::>(), mem::size_of::()); +} + +#[test] +fn test_autotraits() { + fn assert() {} + assert::(); +} + +#[test] +fn test_drop() { + let has_dropped = Flag::new(); + drop(Error::new(DetectDrop::new(&has_dropped))); + assert!(has_dropped.get()); +} diff --git a/vendor/anyhow/tests/test_source.rs b/vendor/anyhow/tests/test_source.rs new file mode 100644 index 0000000000..018267d315 --- /dev/null +++ b/vendor/anyhow/tests/test_source.rs @@ -0,0 +1,62 @@ +use anyhow::anyhow; +use std::error::Error as StdError; +use std::fmt::{self, Display}; +use std::io; + +#[derive(Debug)] +enum TestError { + Io(io::Error), +} + +impl Display for TestError { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + match self { + TestError::Io(e) => Display::fmt(e, formatter), + } + } +} + +impl StdError for TestError { + fn source(&self) -> Option<&(dyn StdError + 'static)> { + match self { + TestError::Io(io) => Some(io), + } + } +} + +#[test] +fn test_literal_source() { + let error = anyhow!("oh no!"); + assert!(error.source().is_none()); +} + +#[test] +fn test_variable_source() { + let msg = "oh no!"; + let error = anyhow!(msg); + assert!(error.source().is_none()); + + let msg = msg.to_owned(); + let error = anyhow!(msg); + assert!(error.source().is_none()); +} + +#[test] +fn test_fmt_source() { + let error = anyhow!("{} {}!", "oh", "no"); + assert!(error.source().is_none()); +} + +#[test] +fn test_io_source() { + let io = io::Error::new(io::ErrorKind::Other, "oh no!"); + let error = anyhow!(TestError::Io(io)); + assert_eq!("oh no!", error.source().unwrap().to_string()); +} + +#[test] +fn test_anyhow_from_anyhow() { + let error = anyhow!("oh no!").context("context"); + let error = anyhow!(error); + assert_eq!("oh no!", error.source().unwrap().to_string()); +} diff --git a/vendor/anyhow/tests/ui/no-impl.rs b/vendor/anyhow/tests/ui/no-impl.rs new file mode 100644 index 0000000000..d2e89afc1b --- /dev/null +++ b/vendor/anyhow/tests/ui/no-impl.rs @@ -0,0 +1,8 @@ +use anyhow::anyhow; + +#[derive(Debug)] +struct Error; + +fn main() { + let _ = anyhow!(Error); +} diff --git a/vendor/anyhow/tests/ui/no-impl.stderr b/vendor/anyhow/tests/ui/no-impl.stderr new file mode 100644 index 0000000000..4dd22309a6 --- /dev/null +++ b/vendor/anyhow/tests/ui/no-impl.stderr @@ -0,0 +1,16 @@ +error[E0599]: no method named `anyhow_kind` found for type `&Error` in the current scope + --> $DIR/no-impl.rs:7:13 + | +7 | let _ = anyhow!(Error); + | ^^^^^^^^^^^^^^ method not found in `&Error` + | + = note: the method `anyhow_kind` exists but the following trait bounds were not satisfied: + `&Error : anyhow::kind::AdhocKind` + `&Error : anyhow::kind::TraitKind` + `Error : anyhow::kind::TraitKind` + = help: items from traits can only be used if the trait is implemented and in scope + = note: the following traits define an item `anyhow_kind`, perhaps you need to implement one of them: + candidate #1: `anyhow::kind::AdhocKind` + candidate #2: `anyhow::kind::TraitKind` + candidate #3: `anyhow::kind::BoxedKind` + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) diff --git a/vendor/autocfg/.cargo-checksum.json b/vendor/autocfg/.cargo-checksum.json index e7bd53b6e1..87bafe6059 100644 --- a/vendor/autocfg/.cargo-checksum.json +++ b/vendor/autocfg/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"461e5e87b13d7faf25813b08b5003060c39d8af0953f30d5b80ae0926c888022","Cargo.toml":"1eded5c9954b3bb92bb2c7403e026198e66a2a42199db06fc9cafddc8d1fd677","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"27995d58ad5c1145c1a8cd86244ce844886958a35eb2b78c6b772748669999ac","README.md":"ba9a1621483e0b9f017f07c282d00d5cf3a2d8660cca6df6b14941319d748953","examples/integers.rs":"589ff4271566dfa322becddf3e2c7b592e6e0bc97b02892ce75619b7e452e930","examples/paths.rs":"1b30e466b824ce8df7ad0a55334424131d9d2573d6cf9f7d5d50c09c8901d526","examples/traits.rs":"cbee6a3e1f7db60b02ae25b714926517144a77cb492021f492774cf0e1865a9e","examples/versions.rs":"38535e6d9f5bfae0de474a3db79a40e8f5da8ba9334c5ff4c363de9bc99d4d12","src/error.rs":"12de7dafea4a35d1dc2f0fa79bfa038386bbbea72bf083979f4ddf227999eeda","src/lib.rs":"411d8dbc48ab0f67cb10243f1e16b235407818c96556c838182e4004da995dff","src/tests.rs":"0b1353344e832553d328c47f1639ced877b5dff70fd2024d84130bd1c33eee07","src/version.rs":"175727d5f02f2fe2271ddc9b041db2a5b9c6fe0f95afd17c73a4d982612764a3"},"package":"b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875"} \ No newline at end of file +{"files":{"Cargo.lock":"745ff40f42e9a1275945a9db2763deeac749909e81d8d91859948fab49f5c268","Cargo.toml":"4072e465bb2d1110644171c28d1a48a8cf5e9bb85c75d39409bb719348a131f6","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"27995d58ad5c1145c1a8cd86244ce844886958a35eb2b78c6b772748669999ac","README.md":"0ff4942223d94c9686f846bb0b1de12221f06e7f39c1818ecbaaec402e89e770","examples/integers.rs":"589ff4271566dfa322becddf3e2c7b592e6e0bc97b02892ce75619b7e452e930","examples/paths.rs":"1b30e466b824ce8df7ad0a55334424131d9d2573d6cf9f7d5d50c09c8901d526","examples/traits.rs":"cbee6a3e1f7db60b02ae25b714926517144a77cb492021f492774cf0e1865a9e","examples/versions.rs":"38535e6d9f5bfae0de474a3db79a40e8f5da8ba9334c5ff4c363de9bc99d4d12","src/error.rs":"12de7dafea4a35d1dc2f0fa79bfa038386bbbea72bf083979f4ddf227999eeda","src/lib.rs":"374704e933dc6263a334652144e4436a7e409f88069c2f4f8e8c4ef14f7aa76b","src/tests.rs":"0b1353344e832553d328c47f1639ced877b5dff70fd2024d84130bd1c33eee07","src/version.rs":"175727d5f02f2fe2271ddc9b041db2a5b9c6fe0f95afd17c73a4d982612764a3","tests/rustflags.rs":"a3788396e0b81a33406d06fef3bc31c5a328f323de6766570a345ebad885cbf9"},"package":"1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"} \ No newline at end of file diff --git a/vendor/autocfg/Cargo.lock b/vendor/autocfg/Cargo.lock index 4f899ca292..670c6c2076 100644 --- a/vendor/autocfg/Cargo.lock +++ b/vendor/autocfg/Cargo.lock @@ -2,5 +2,5 @@ # It is not intended for manual editing. [[package]] name = "autocfg" -version = "0.1.6" +version = "0.1.7" diff --git a/vendor/autocfg/Cargo.toml b/vendor/autocfg/Cargo.toml index 4453db3d98..c077b3e81d 100644 --- a/vendor/autocfg/Cargo.toml +++ b/vendor/autocfg/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "autocfg" -version = "0.1.6" +version = "0.1.7" authors = ["Josh Stone "] description = "Automatic cfg for Rust compiler features" readme = "README.md" diff --git a/vendor/autocfg/README.md b/vendor/autocfg/README.md index 40004a88e8..680f11e110 100644 --- a/vendor/autocfg/README.md +++ b/vendor/autocfg/README.md @@ -43,8 +43,11 @@ should only be used when the compiler supports it. ## Release Notes +- 0.1.7 (2019-10-20) + - Apply `RUSTFLAGS` when probing `$TARGET != $HOST`, mainly for sysroot, by @roblabla. + - 0.1.6 (2019-08-19) - - Add `probe`/`emit_sysroot_crate`, by @leo60228 + - Add `probe`/`emit_sysroot_crate`, by @leo60228. - 0.1.5 (2019-07-16) - Mask some warnings from newer rustc. @@ -54,11 +57,11 @@ should only be used when the compiler supports it. - Improve `rustc` bootstrap compatibility. - 0.1.3 (2019-05-21) - - Auto-detects if `#![no_std]` is needed for the `$TARGET` + - Auto-detects if `#![no_std]` is needed for the `$TARGET`. - 0.1.2 (2019-01-16) - - Add `rerun_env(ENV)` to print `cargo:rerun-if-env-changed=ENV` - - Add `rerun_path(PATH)` to print `cargo:rerun-if-changed=PATH` + - Add `rerun_env(ENV)` to print `cargo:rerun-if-env-changed=ENV`. + - Add `rerun_path(PATH)` to print `cargo:rerun-if-changed=PATH`. ## Minimum Rust version policy diff --git a/vendor/autocfg/src/lib.rs b/vendor/autocfg/src/lib.rs index 96cceedbfb..d5637005e2 100644 --- a/vendor/autocfg/src/lib.rs +++ b/vendor/autocfg/src/lib.rs @@ -41,6 +41,16 @@ #![allow(bare_trait_objects)] #![allow(ellipsis_inclusive_range_patterns)] +/// Local macro to avoid `std::try!`, deprecated in Rust 1.39. +macro_rules! try { + ($result:expr) => { + match $result { + Ok(value) => value, + Err(error) => return Err(error), + } + }; +} + use std::env; use std::ffi::OsString; use std::fs; @@ -68,6 +78,7 @@ pub struct AutoCfg { rustc_version: Version, target: Option, no_std: bool, + rustflags: Option>, } /// Writes a config flag for rustc on standard out. @@ -145,12 +156,35 @@ impl AutoCfg { return Err(error::from_str("output path is not a writable directory")); } + // Cargo only applies RUSTFLAGS for building TARGET artifact in + // cross-compilation environment. Sadly, we don't have a way to detect + // when we're building HOST artifact in a cross-compilation environment, + // so for now we only apply RUSTFLAGS when cross-compiling an artifact. + // + // See https://github.com/cuviper/autocfg/pull/10#issuecomment-527575030. + let rustflags = if env::var_os("TARGET") != env::var_os("HOST") { + env::var("RUSTFLAGS").ok().map(|rustflags| { + // This is meant to match how cargo handles the RUSTFLAG environment + // variable. + // See https://github.com/rust-lang/cargo/blob/69aea5b6f69add7c51cca939a79644080c0b0ba0/src/cargo/core/compiler/build_context/target_info.rs#L434-L441 + rustflags + .split(' ') + .map(str::trim) + .filter(|s| !s.is_empty()) + .map(str::to_string) + .collect::>() + }) + } else { + None + }; + let mut ac = AutoCfg { out_dir: dir, rustc: rustc, rustc_version: rustc_version, target: env::var_os("TARGET"), no_std: false, + rustflags: rustflags, }; // Sanity check with and without `std`. @@ -194,6 +228,10 @@ impl AutoCfg { .arg(&self.out_dir) .arg("--emit=llvm-ir"); + if let &Some(ref rustflags) = &self.rustflags { + command.args(rustflags); + } + if let Some(target) = self.target.as_ref() { command.arg("--target").arg(target); } diff --git a/vendor/autocfg/tests/rustflags.rs b/vendor/autocfg/tests/rustflags.rs new file mode 100644 index 0000000000..bfa0f03ee0 --- /dev/null +++ b/vendor/autocfg/tests/rustflags.rs @@ -0,0 +1,13 @@ +extern crate autocfg; + +/// Tests that autocfg uses the RUSTFLAGS environment variable when running +/// rustc. +#[test] +fn test_with_sysroot() { + std::env::set_var("RUSTFLAGS", "-L target/debug/deps -L target/debug"); + std::env::set_var("OUT_DIR", "target"); + // Ensure HOST != TARGET. + std::env::set_var("HOST", "lol"); + let ac = autocfg::AutoCfg::new().unwrap(); + assert!(ac.probe_sysroot_crate("autocfg")); +} diff --git a/vendor/bstr/.cargo-checksum.json b/vendor/bstr/.cargo-checksum.json new file mode 100644 index 0000000000..4a766f086a --- /dev/null +++ b/vendor/bstr/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"COPYING":"13361f93b3db60ddb43f8fdc97ba469461019bbf7589f6bde833eb3d995d2497","Cargo.toml":"21533e20756f48ec4d5a95f4315a2b970125d20a3c0949b2d50df1d6c76583fd","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"a43c71ad7400fe2382544d64c652200e769f4f2f3358960db79555bd619051d8","examples/graphemes-std.rs":"e77099f8b5abbf55f1067599bedce49e5e24ec5a32190e74ac59589644d01d8b","examples/graphemes.rs":"50837c1911aa8e50e1512cd92a39e04c782de298e746ac7c859a79d6e8f079c6","examples/lines-std.rs":"4f10775044285d811a52c364fcf12a9a8fa7fd993ed42276a9bcb93fd261c6ad","examples/lines.rs":"aeb20aea2361d3923b64cf79c1b60b4f8d5dd2c4e1f695c9895dc6f3333246ef","examples/uppercase-std.rs":"e49caff062ee2eb237d725c97a2d59f5f388ab70becbaf1abf8648939fd947cd","examples/uppercase.rs":"7d8e1db1354027d456fba24c5755ee3149c5b1d612ae25ef40a73c864b029c63","examples/words-std.rs":"c95a322f7125a4793404cc0df2a11ce2e8bd2fbd26668393a7ecf6b58eb5ea69","examples/words.rs":"953cc5d5be04b17024a089ef711071e96f605cbe7221a2839f125de7c2b8b73f","rustfmt.toml":"3025e466e14d8ac54e5371397434f79be4976b5bf3faf64e36c5e941980a0cf2","scripts/generate-unicode-data":"c89367f871815e4a4188c78ff86fa54ee6028e192e0ffe22bfb868b94b91cfed","scripts/regex/grapheme.sh":"d796bca73278f6ab04d65f285b2dc72efcad76874f98f4bfa22bf38f2eaeece7","scripts/regex/sentence.sh":"7892e07ac9e450967bd79279558cbef2f0fc0b0aefab24217910937ed6330f06","scripts/regex/word.sh":"b3f53e2331e9e50a1a7232b7d278aaecace6a42ef6c16dd0b8d0ec59fd2aaf4f","src/ascii.rs":"7686287aecf9515c55de1d3d5741ce8571e358e4a95eaed6747cb06baf53d888","src/bstr.rs":"a08ae3531a61b2d5802cb1bb4731f4b94ee601edf0d126c38c6f8ac7ae11ecdb","src/bstring.rs":"e73a2af4c9174b32a52d3aa8989b0219ae38a3038a96d38bfc2e6364f3883a67","src/cow.rs":"ce589c9a332353c5d71eebb372b58508ec945afb015ea8ae52b95cd171a8e149","src/freqs.rs":"3278a06c832c37cf273491346f0d1110f65f6e1f4cccd3c11b1e1f329457856e","src/impls.rs":"357396096fbeecdf9a5392ee679fd062e99ca207100eb0f8e3547b5d927a8998","src/io.rs":"3f168fad465f38c4ea21cbdab4d48fdcdf105d15f881791d0541bc625e44380a","src/lib.rs":"83fe5c79dcc3ed8147f4d16b9b35f417c91e102c75d3187cfe8a0e127375d7e4","src/search/byte_frequencies.rs":"3278a06c832c37cf273491346f0d1110f65f6e1f4cccd3c11b1e1f329457856e","src/search/mod.rs":"11a978f770530fd4c49fa482ec2ec470d946aa88f87c9daebf4dcbd5adb319f8","src/search/prefilter.rs":"4051ba3cdd819e4b9ac1428ba250a8d2c3f9f524ebfd998d7157daf03391dc5e","src/search/tests.rs":"99a31af953a852c746940094f21cf1900a34d26a1437773c577fa7fb4bca7655","src/search/twoway.rs":"fefbb755694cb97ab57909987d57499b1985ccb4f9727b0df5fdbae31ab59d2d","src/slice_index.rs":"2594ff35d173a904b30676bea307813621fea03b9b4feda4e413208f4dec0ff4","src/tests.rs":"9e50757473b50273ae3a8aeaed924282ffab82ded7134c15745f3b798b16e574","src/unicode/data/GraphemeBreakTest.txt":"4b26c6077d85fe2eabd16b433bf957d95dc5459a8f2626075cf8d611d6f833cb","src/unicode/data/SentenceBreakTest.txt":"cfa8d39787eb3e0883a40960e940d5df8ee6cdcbc8e1be5809fa74df97de8238","src/unicode/data/WordBreakTest.txt":"7e782466e4f13d281a3c0be9598426b0ebfdec5441843e77cb31772b8193fb0a","src/unicode/fsm/grapheme_break_fwd.bigendian.dfa":"204db02a5ee8c497187d333794789e65121626eaa06fe893c999eff4528f5b57","src/unicode/fsm/grapheme_break_fwd.littleendian.dfa":"9eed04ba2f576b6131fa54a26b1c173398f982055ba66f77764ff8d180266eda","src/unicode/fsm/grapheme_break_fwd.rs":"fc617e3ee9cde5f46144aad5250f29c2325460e0fa7f5b8b1f30bdab347928db","src/unicode/fsm/grapheme_break_rev.bigendian.dfa":"5c64f0c82ddc018acf4544f69db12799b1789fc862515f5e1b82b83595e1c15b","src/unicode/fsm/grapheme_break_rev.littleendian.dfa":"67f295d07b241e868331284aa7d3b4824206b1e7f44d41b9243ec0140ede8421","src/unicode/fsm/grapheme_break_rev.rs":"73da83baee17003c2baf84cba3b3f6da9c252bc47b1ee117f04dbf0c35f48c37","src/unicode/fsm/mod.rs":"50b8baa692e83f909a0fe62eced9666b712a68b6c7bf42976c8cc37e49dd9b64","src/unicode/fsm/regional_indicator_rev.bigendian.dfa":"db9db4c86bced5f4aaf68d5e475e13e5d4976c237deec13c192111a399aa5858","src/unicode/fsm/regional_indicator_rev.littleendian.dfa":"0905f70acddd423c1b53bfbeb73299009f724400029d7f9a987d63c32d36e36c","src/unicode/fsm/regional_indicator_rev.rs":"6ad6f07ce3caea6ac9723a21350945ad41f2f24fd3f0521546ce386eb4b55bb1","src/unicode/fsm/sentence_break_fwd.bigendian.dfa":"e27527ce7e7b3f14a7ed71bdf8d4059678013fe66c6078209ab4b776525725fa","src/unicode/fsm/sentence_break_fwd.littleendian.dfa":"d3bf857f941c44a8cb6060014aa1a06ad2b6c05bd2b53f3efcb203eead812073","src/unicode/fsm/sentence_break_fwd.rs":"87baa5002ba51d60533956a73d6595bf816fa103a44d9933508907fc3870d306","src/unicode/fsm/simple_word_fwd.bigendian.dfa":"8ffeef5f37e077b004b6f456d9bfb670e8f3f47efe7521ca637ce0eb9ba15550","src/unicode/fsm/simple_word_fwd.littleendian.dfa":"14f8f3a0ce42fd10c885b37c40f8b63e52e1bb624d7857bf1ab64cf149ed8ddd","src/unicode/fsm/simple_word_fwd.rs":"656e6aa0af53af8a17d3d07a44ca5255b5232eaafa25c47b510dd8349e5e993c","src/unicode/fsm/whitespace_anchored_fwd.bigendian.dfa":"593c8ad059ab0bee60a2ea25f4c1fc89c105cb19a9bda3fa98d1464b8e87cfc0","src/unicode/fsm/whitespace_anchored_fwd.littleendian.dfa":"a04ed70d5dbd969c0af0e12bec5033ca910161c486f741dd0a792d2e5b0cc6f6","src/unicode/fsm/whitespace_anchored_fwd.rs":"d9cd70d7444cbd38328fa20b8e04f20e492e0a8953b051e8a026b81e05ca0801","src/unicode/fsm/whitespace_anchored_rev.bigendian.dfa":"44bb1cf58f5c86f807f4d023a390f0610c31de0c27149a12ab9b40d136f51471","src/unicode/fsm/whitespace_anchored_rev.littleendian.dfa":"0933c1651d9cb6cbc55ab849c071e13aaea3221f636c93e830ff810c84389dff","src/unicode/fsm/whitespace_anchored_rev.rs":"d4fc79e97583d16bdeac6fb7bd1c24896b1ad94a95678539d182cfa473670eb4","src/unicode/fsm/word_break_fwd.bigendian.dfa":"7fb8f7d43b27f5696f0448ff524fbac35919bda1b4aba641ec60ede4c79c5deb","src/unicode/fsm/word_break_fwd.littleendian.dfa":"c140103f07f79c788cc7c8d0f601f6f1a2e265b554568fff6607f5bd9660a7d4","src/unicode/fsm/word_break_fwd.rs":"1645db325cabd7d4256c0761c36a6d50e75af757af11b88e21320ffaca4b5ede","src/unicode/grapheme.rs":"c61f58cdba4d4ce171281bc11dbb51d0db4c269d1962b554242cedb4118002af","src/unicode/mod.rs":"bf5538ded23641a083117ca1c36b73e4d67fd1e810478ae288965de4453e32fc","src/unicode/sentence.rs":"c2633c4c6ceb6d214c7c0b3b648158d29af6d1528be025ab63dd9ac3beec41b3","src/unicode/whitespace.rs":"4e13e258cb67821c36fd1edd20b65b87f4e0127f288d8546a86ad7f5f390c267","src/unicode/word.rs":"8c0ec8b27a169e7644ef196da05d5f896daee1ff0febc2bf218ca5fd8e8c2c15","src/utf8.rs":"961ff338904636f3680e9ac86897cb888effdd29db95f8bd678954311b4d3e6f"},"package":"853b090ce0f45d0265902666bf88039ea3da825e33796716c511a1ec9c170036"} \ No newline at end of file diff --git a/vendor/bstr/COPYING b/vendor/bstr/COPYING new file mode 100644 index 0000000000..d5a7d7ec89 --- /dev/null +++ b/vendor/bstr/COPYING @@ -0,0 +1,8 @@ +This project is licensed under either of + + * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or + http://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or + http://opensource.org/licenses/MIT) + +at your option. diff --git a/vendor/bstr/Cargo.toml b/vendor/bstr/Cargo.toml new file mode 100644 index 0000000000..4f6ab92673 --- /dev/null +++ b/vendor/bstr/Cargo.toml @@ -0,0 +1,68 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +name = "bstr" +version = "0.1.3" +authors = ["Andrew Gallant "] +exclude = ["/ci/*", "/.travis.yml", "/appveyor.yml"] +description = "A string type that is not required to be valid UTF-8." +homepage = "https://github.com/BurntSushi/bstr" +documentation = "https://docs.rs/bstr" +readme = "README.md" +keywords = ["string", "str", "byte", "bytes", "text"] +categories = ["text-processing", "encoding"] +license = "MIT OR Apache-2.0" +repository = "https://github.com/BurntSushi/bstr" +[profile.release] +debug = true + +[lib] +bench = false +[dependencies.lazy_static] +version = "1.2" +optional = true + +[dependencies.memchr] +version = "2.1.2" +default-features = false + +[dependencies.regex-automata] +version = "0.1.5" +optional = true +default-features = false + +[dependencies.serde] +version = "1.0.85" +optional = true +default-features = false +[dev-dependencies.quickcheck] +version = "0.8.1" +default-features = false + +[dev-dependencies.ucd-parse] +version = "0.1.3" + +[dev-dependencies.unicode-segmentation] +version = "1.2.1" + +[features] +default = ["std", "unicode"] +serde1 = ["std", "serde1-nostd", "serde/std"] +serde1-nostd = ["serde"] +std = ["memchr/use_std"] +unicode = ["lazy_static", "regex-automata"] +[badges.appveyor] +repository = "BurntSushi/bstr" + +[badges.travis-ci] +repository = "BurntSushi/bstr" diff --git a/vendor/idna-0.1.5/LICENSE-APACHE b/vendor/bstr/LICENSE-APACHE similarity index 100% rename from vendor/idna-0.1.5/LICENSE-APACHE rename to vendor/bstr/LICENSE-APACHE diff --git a/vendor/bstr/LICENSE-MIT b/vendor/bstr/LICENSE-MIT new file mode 100644 index 0000000000..3b0a5dc09c --- /dev/null +++ b/vendor/bstr/LICENSE-MIT @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Andrew Gallant + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bstr/README.md b/vendor/bstr/README.md new file mode 100644 index 0000000000..28be1f32af --- /dev/null +++ b/vendor/bstr/README.md @@ -0,0 +1,252 @@ +bstr +==== +This crate provides a `BString` and `BStr` types that are conventionally UTF-8 +for Rust. They differ from the standard library's `String` and `str` types in +that they are not required to be valid UTF-8, but may be fully or partially +valid UTF-8. + +[![Linux build status](https://api.travis-ci.org/BurntSushi/bstr.svg)](https://travis-ci.org/BurntSushi/bstr) +[![Windows build status](https://ci.appveyor.com/api/projects/status/github/BurntSushi/bstr?svg=true)](https://ci.appveyor.com/project/BurntSushi/bstr) +[![](http://meritbadge.herokuapp.com/bstr)](https://crates.io/crates/bstr) + + +### Documentation + +https://docs.rs/bstr + + +### When should I use byte strings? + +See this part of the documentation for more details: +https://docs.rs/bstr/0.1.0/bstr/#when-should-i-use-byte-strings. + +The short story is that byte strings are useful when it is inconvenient or +incorrect to require valid UTF-8. + + +### Usage + +Add this to your `Cargo.toml`: + +```toml +[dependencies] +bstr = "0.1" +``` + + +### Examples + +The following two examples exhibit both the API features of byte strings and +the I/O convenience functions provided for reading line-by-line quickly. + +This first example simply shows how to efficiently iterate over lines in +stdin, and print out lines containing a particular substring: + +```rust +use std::error::Error; +use std::io::{self, Write}; + +use bstr::io::BufReadExt; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdout = io::BufWriter::new(io::stdout()); + + stdin.lock().for_byte_line_with_terminator(|line| { + if line.contains("Dimension") { + stdout.write_all(line.as_bytes())?; + } + Ok(true) + })?; + Ok(()) +} +``` + +This example shows how to count all of the words (Unicode-aware) in stdin, +line-by-line: + +```rust +use std::error::Error; +use std::io; + +use bstr::io::BufReadExt; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut words = 0; + stdin.lock().for_byte_line_with_terminator(|line| { + words += line.words().count(); + Ok(true) + })?; + println!("{}", words); + Ok(()) +} +``` + +This example shows how to convert a stream on stdin to uppercase without +performing UTF-8 validation _and_ amortizing allocation. On standard ASCII +text, this is quite a bit faster than what you can (easily) do with standard +library APIs. (N.B. Any invalid UTF-8 bytes are passed through unchanged.) + +```rust +use std::error::Error; +use std::io::{self, Write}; + +use bstr::BString; +use bstr::io::BufReadExt; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdout = io::BufWriter::new(io::stdout()); + + let mut upper = BString::new(); + stdin.lock().for_byte_line_with_terminator(|line| { + upper.clear(); + line.to_uppercase_into(&mut upper); + stdout.write_all(upper.as_bytes())?; + Ok(true) + })?; + Ok(()) +} +``` + +This example shows how to extract the first 10 visual characters (as grapheme +clusters) from each line, where invalid UTF-8 sequences are generally treated +as a single character and are passed through correctly: + +```rust +use std::error::Error; +use std::io::{self, Write}; + +use bstr::io::BufReadExt; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdout = io::BufWriter::new(io::stdout()); + + stdin.lock().for_byte_line_with_terminator(|line| { + let end = line + .grapheme_indices() + .map(|(_, end, _)| end) + .take(10) + .last() + .unwrap_or(line.len()); + stdout.write_all(line[..end].trim_end().as_bytes())?; + stdout.write_all(b"\n")?; + Ok(true) + })?; + Ok(()) +} +``` + + +### Cargo features + +This crates comes with a few features that control standard library, serde +and Unicode support. + +* `std` - **Enabled** by default. This provides APIs that require the standard + library, such as `BString`. +* `unicode` - **Enabled** by default. This provides APIs that require sizable + Unicode data compiled into the binary. This includes, but is not limited to, + grapheme/word/sentence segmenters. When this is disabled, basic support such + as UTF-8 decoding is still included. +* `serde1` - **Disabled** by default. Enables implementations of serde traits + for the `BStr` and `BString` types. +* `serde1-nostd` - **Disabled** by default. Enables implementations of serde + traits for the `BStr` type only, intended for use without the standard + library. Generally, you either want `serde1` or `serde1-nostd`, not both. + + +### Minimum Rust version policy + +This crate's minimum supported `rustc` version (MSRV) is `1.28.0`. + +In general, this crate will be conservative with respect to the minimum +supported version of Rust. MSRV may be bumped in minor version releases. + + +### Future work + +Since this is meant to be a core crate, getting a `1.0` release is a priority. +My hope is to move to `1.0` within the next year and commit to its API so that +`bstr` can be used as a public dependency. + +A large part of the API surface area was taken from the standard library, so +from an API design perspective, a good portion of this crate should be mature. +The main differences from the standard library are in how the various substring +search routines work. The standard library provides generic infrastructure for +supporting different types of searches with a single method, where as this +library prefers to define new methods for each type of search and drop the +generic infrastructure. + +Some _probable_ future considerations for APIs include, but are not limited to: + +* A convenience layer on top of the `aho-corasick` crate. +* Unicode normalization. +* More sophisticated support for dealing with Unicode case, perhaps by + combining the use cases supported by [`caseless`](http://docs.rs/caseless) + and [`unicase`](https://docs.rs/unicase). +* Add facilities for dealing with OS strings and file paths, probably via + simple conversion routines. + +Here are some examples that are _probably_ out of scope for this crate: + +* Regular expressions. +* Unicode collation. + +The exact scope isn't quite clear, but I expect we can iterate on it. + +In general, as stated below, this crate is an experiment in bringing lots of +related APIs together into a single crate while simultaneously attempting to +keep the total number of dependencies low. Indeed, every dependency of `bstr`, +except for `memchr`, is optional. + + +### High level motivation + +Strictly speaking, the `bstr` crate provides very little that can't already be +achieved with a `Vec`/`&[u8]` and the ecosystem of library crates. For +example: + +* The standard library's + [`Utf8Error`](https://doc.rust-lang.org/std/str/struct.Utf8Error.html) + can be used for incremental lossy decoding of `&[u8]`. +* The + [`unicode-segmentation`](https://unicode-rs.github.io/unicode-segmentation/unicode_segmentation/index.html) + crate can be used for iterating over graphemes (or words), but is only + implemented for `&str` types. One could use `Utf8Error` above to implement + grapheme iteration with the same semantics as what `bstr` provides (automatic + Unicode replacement codepoint substitution). +* The [`twoway`](https://docs.rs/twoway/0.2.0/twoway/) crate can be used for + fast substring searching on `&[u8]`. + +So why create `bstr`? Part of the point of the `bstr` crate is to provide a +uniform API of coupled components instead of relying on users to piece together +loosely coupled components from the crate ecosystem. For example, if you wanted +to perform a search and replace in a `Vec`, then writing the code to do +that with the `twoway` crate is not that difficult, but it's still additional +glue code you have to write. This work adds up depending on what you're doing. +Consider, for example, trimming and splitting, along with their different +variants. + +In other words, `bstr` is partially a way of pushing back against the +micro-crate ecosystem that appears to be evolving. It's not clear to me whether +this experiment will be successful or not, but it is definitely a goal of +`bstr` to keep its dependency list lightweight. For example, `serde` is an +optional dependency because there is no feasible alternative, but `twoway` is +not, where we instead prefer to implement our own substring search. In service +of this philosophy, currently, the only required dependency of `bstr` is +`memchr`. + + +### License + +This project is licensed under either of + + * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or + http://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or + http://opensource.org/licenses/MIT) + +at your option. diff --git a/vendor/bstr/examples/graphemes-std.rs b/vendor/bstr/examples/graphemes-std.rs new file mode 100644 index 0000000000..da3faf3253 --- /dev/null +++ b/vendor/bstr/examples/graphemes-std.rs @@ -0,0 +1,28 @@ +extern crate unicode_segmentation; + +use std::error::Error; +use std::io::{self, BufRead, Write}; + +use unicode_segmentation::UnicodeSegmentation; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdin = stdin.lock(); + let mut stdout = io::BufWriter::new(io::stdout()); + + let mut line = String::new(); + while stdin.read_line(&mut line)? > 0 { + let end = line + .grapheme_indices(true) + .map(|(start, g)| start + g.len()) + .take(10) + .last() + .unwrap_or(line.len()); + #[allow(deprecated)] // for Rust 1.28.0 + stdout.write_all(line[..end].trim_right().as_bytes())?; + stdout.write_all(b"\n")?; + + line.clear(); + } + Ok(()) +} diff --git a/vendor/bstr/examples/graphemes.rs b/vendor/bstr/examples/graphemes.rs new file mode 100644 index 0000000000..b680e024c5 --- /dev/null +++ b/vendor/bstr/examples/graphemes.rs @@ -0,0 +1,24 @@ +extern crate bstr; + +use std::error::Error; +use std::io::{self, Write}; + +use bstr::io::BufReadExt; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdout = io::BufWriter::new(io::stdout()); + + stdin.lock().for_byte_line_with_terminator(|line| { + let end = line + .grapheme_indices() + .map(|(_, end, _)| end) + .take(10) + .last() + .unwrap_or(line.len()); + stdout.write_all(line[..end].trim_end().as_bytes())?; + stdout.write_all(b"\n")?; + Ok(true) + })?; + Ok(()) +} diff --git a/vendor/bstr/examples/lines-std.rs b/vendor/bstr/examples/lines-std.rs new file mode 100644 index 0000000000..51da217b2a --- /dev/null +++ b/vendor/bstr/examples/lines-std.rs @@ -0,0 +1,17 @@ +use std::error::Error; +use std::io::{self, BufRead, Write}; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdin = stdin.lock(); + let mut stdout = io::BufWriter::new(io::stdout()); + + let mut line = String::new(); + while stdin.read_line(&mut line)? > 0 { + if line.contains("Dimension") { + stdout.write_all(line.as_bytes())?; + } + line.clear(); + } + Ok(()) +} diff --git a/vendor/bstr/examples/lines.rs b/vendor/bstr/examples/lines.rs new file mode 100644 index 0000000000..8429aee365 --- /dev/null +++ b/vendor/bstr/examples/lines.rs @@ -0,0 +1,19 @@ +extern crate bstr; + +use std::error::Error; +use std::io::{self, Write}; + +use bstr::io::BufReadExt; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdout = io::BufWriter::new(io::stdout()); + + stdin.lock().for_byte_line_with_terminator(|line| { + if line.contains("Dimension") { + stdout.write_all(line.as_bytes())?; + } + Ok(true) + })?; + Ok(()) +} diff --git a/vendor/bstr/examples/uppercase-std.rs b/vendor/bstr/examples/uppercase-std.rs new file mode 100644 index 0000000000..3029d76ca9 --- /dev/null +++ b/vendor/bstr/examples/uppercase-std.rs @@ -0,0 +1,15 @@ +use std::error::Error; +use std::io::{self, BufRead, Write}; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdin = stdin.lock(); + let mut stdout = io::BufWriter::new(io::stdout()); + + let mut line = String::new(); + while stdin.read_line(&mut line)? > 0 { + stdout.write_all(line.to_uppercase().as_bytes())?; + line.clear(); + } + Ok(()) +} diff --git a/vendor/bstr/examples/uppercase.rs b/vendor/bstr/examples/uppercase.rs new file mode 100644 index 0000000000..08bf40af07 --- /dev/null +++ b/vendor/bstr/examples/uppercase.rs @@ -0,0 +1,21 @@ +extern crate bstr; + +use std::error::Error; +use std::io::{self, Write}; + +use bstr::BString; +use bstr::io::BufReadExt; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdout = io::BufWriter::new(io::stdout()); + + let mut upper = BString::new(); + stdin.lock().for_byte_line_with_terminator(|line| { + upper.clear(); + line.to_uppercase_into(&mut upper); + stdout.write_all(upper.as_bytes())?; + Ok(true) + })?; + Ok(()) +} diff --git a/vendor/bstr/examples/words-std.rs b/vendor/bstr/examples/words-std.rs new file mode 100644 index 0000000000..39c82e30f2 --- /dev/null +++ b/vendor/bstr/examples/words-std.rs @@ -0,0 +1,20 @@ +extern crate unicode_segmentation; + +use std::error::Error; +use std::io::{self, BufRead}; + +use unicode_segmentation::UnicodeSegmentation; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut stdin = stdin.lock(); + + let mut words = 0; + let mut line = String::new(); + while stdin.read_line(&mut line)? > 0 { + words += line.unicode_words().count(); + line.clear(); + } + println!("{}", words); + Ok(()) +} diff --git a/vendor/bstr/examples/words.rs b/vendor/bstr/examples/words.rs new file mode 100644 index 0000000000..64fb19d690 --- /dev/null +++ b/vendor/bstr/examples/words.rs @@ -0,0 +1,17 @@ +extern crate bstr; + +use std::error::Error; +use std::io; + +use bstr::io::BufReadExt; + +fn main() -> Result<(), Box> { + let stdin = io::stdin(); + let mut words = 0; + stdin.lock().for_byte_line_with_terminator(|line| { + words += line.words().count(); + Ok(true) + })?; + println!("{}", words); + Ok(()) +} diff --git a/vendor/bstr/rustfmt.toml b/vendor/bstr/rustfmt.toml new file mode 100644 index 0000000000..c7ad93bafe --- /dev/null +++ b/vendor/bstr/rustfmt.toml @@ -0,0 +1 @@ +disable_all_formatting = true diff --git a/vendor/bstr/scripts/generate-unicode-data b/vendor/bstr/scripts/generate-unicode-data new file mode 100755 index 0000000000..eac4a75f7e --- /dev/null +++ b/vendor/bstr/scripts/generate-unicode-data @@ -0,0 +1,150 @@ +#!/bin/sh + +set -e +D="$(dirname "$0")" + +# Convenience function for checking that a command exists. +requires() { + cmd="$1" + if ! command -v "$cmd" > /dev/null 2>&1; then + echo "DEPENDENCY MISSING: $cmd must be installed" >&2 + exit 1 + fi +} + +# Test if an array ($2) contains a particular element ($1). +array_exists() { + needle="$1" + shift + + for el in "$@"; do + if [ "$el" = "$needle" ]; then + return 0 + fi + done + return 1 +} + +graphemes() { + regex="$(sh "$D/regex/grapheme.sh")" + + echo "generating forward grapheme DFA" + ucd-generate dfa \ + --name GRAPHEME_BREAK_FWD \ + --sparse --minimize --anchored --state-size 2 \ + src/unicode/fsm/ \ + "$regex" + + echo "generating reverse grapheme DFA" + ucd-generate dfa \ + --name GRAPHEME_BREAK_REV \ + --reverse --longest \ + --sparse --minimize --anchored --state-size 2 \ + src/unicode/fsm/ \ + "$regex" +} + +words() { + regex="$(sh "$D/regex/word.sh")" + + echo "generating forward word DFA (this can take a while)" + ucd-generate dfa \ + --name WORD_BREAK_FWD \ + --sparse --minimize --anchored --state-size 4 \ + src/unicode/fsm/ \ + "$regex" +} + +sentences() { + regex="$(sh "$D/regex/sentence.sh")" + + echo "generating forward sentence DFA (this can take a while)" + ucd-generate dfa \ + --name SENTENCE_BREAK_FWD \ + --minimize \ + --sparse --anchored --state-size 4 \ + src/unicode/fsm/ \ + "$regex" +} + +regional_indicator() { + # For finding all occurrences of region indicators. This is used to handle + # regional indicators as a special case for the reverse grapheme iterator + # and the reverse word iterator. + echo "generating regional indicator DFA" + ucd-generate dfa \ + --name REGIONAL_INDICATOR_REV \ + --reverse \ + --classes --minimize --anchored --premultiply --state-size 1 \ + src/unicode/fsm/ \ + "\p{gcb=Regional_Indicator}" +} + +simple_word() { + echo "generating forward simple word DFA" + ucd-generate dfa \ + --name SIMPLE_WORD_FWD \ + --sparse --minimize --state-size 2 \ + src/unicode/fsm/ \ + "\w" +} + +whitespace() { + echo "generating forward whitespace DFA" + ucd-generate dfa \ + --name WHITESPACE_ANCHORED_FWD \ + --anchored --classes --premultiply --minimize --state-size 1 \ + src/unicode/fsm/ \ + "\s+" + + echo "generating reverse whitespace DFA" + ucd-generate dfa \ + --name WHITESPACE_ANCHORED_REV \ + --reverse \ + --anchored --classes --minimize --state-size 1 \ + src/unicode/fsm/ \ + "\s+" +} + +main() { + if array_exists "-h" "$@" || array_exists "--help" "$@"; then + echo "Usage: $(basename "$0") [--list-commands] [] ..." >&2 + exit + fi + + commands=" + graphemes + sentences + words + regional-indicator + simple-word + whitespace + " + if array_exists "--list-commands" "$@"; then + for cmd in $commands; do + echo "$cmd" + done + exit + fi + + # ucd-generate is used to compile regexes into DFAs. + requires ucd-generate + + # For development when ucd-generate needs to be updated. + cargo install -f --path /home/andrew/rust/ucd-generate + + all= + if [ $# -eq 0 ] || array_exists "all" "$@"; then + all=yes + fi + for cmd in "$@"; do + if [ -n "$all" ] || array_exists "$cmd" $commands; then + fun="$(echo "$cmd" | sed 's/-/_/g')" + eval "$fun" + else + echo "unrecognized command: $cmd" >&2 + fi + done +} + +main "$@" diff --git a/vendor/bstr/scripts/regex/grapheme.sh b/vendor/bstr/scripts/regex/grapheme.sh new file mode 100644 index 0000000000..0b2b54daa2 --- /dev/null +++ b/vendor/bstr/scripts/regex/grapheme.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +# vim: indentexpr= nosmartindent autoindent +# vim: tabstop=2 shiftwidth=2 softtabstop=2 + +# This regex was manually written, derived from the rules in UAX #29. +# Particularly, from Table 1c, which lays out a regex for grapheme clusters. + +CR="\p{gcb=CR}" +LF="\p{gcb=LF}" +Control="\p{gcb=Control}" +Prepend="\p{gcb=Prepend}" +L="\p{gcb=L}" +V="\p{gcb=V}" +LV="\p{gcb=LV}" +LVT="\p{gcb=LVT}" +T="\p{gcb=T}" +RI="\p{gcb=RI}" +Extend="\p{gcb=Extend}" +ZWJ="\p{gcb=ZWJ}" +SpacingMark="\p{gcb=SpacingMark}" + +Any="\p{any}" +ExtendPict="\p{Extended_Pictographic}" + +echo "(?x) +$CR $LF +| +$Control +| +$Prepend* +( + ( + ($L* ($V+ | $LV $V* | $LVT) $T*) + | + $L+ + | + $T+ + ) + | + $RI $RI + | + $ExtendPict ($Extend* $ZWJ $ExtendPict)* + | + [^$Control $CR $LF] +) +[$Extend $ZWJ $SpacingMark]* +| +$Any +" diff --git a/vendor/bstr/scripts/regex/sentence.sh b/vendor/bstr/scripts/regex/sentence.sh new file mode 100644 index 0000000000..689d1849fd --- /dev/null +++ b/vendor/bstr/scripts/regex/sentence.sh @@ -0,0 +1,176 @@ +#!/bin/sh + +# vim: indentexpr= nosmartindent autoindent +# vim: tabstop=2 shiftwidth=2 softtabstop=2 + +# This is a regex that I reverse engineered from the sentence boundary chain +# rules in UAX #29. Unlike the grapheme regex, which is essentially provided +# for us in UAX #29, no such sentence regex exists. +# +# I looked into how ICU achieves this, since UAX #29 hints that producing +# finite state machines for grapheme/sentence/word/line breaking is possible, +# but only easy to do for graphemes. ICU does this by implementing their own +# DSL for describing the break algorithms in terms of the chaining rules +# directly. You can see an example for sentences in +# icu4c/source/data/brkitr/rules/sent.txt. ICU then builds a finite state +# machine from those rules in a mostly standard way, but implements the +# "chaining" aspect of the rules by connecting overlapping end and start +# states. For example, given SB7: +# +# (Upper | Lower) ATerm x Upper +# +# Then the naive way to convert this into a regex would be something like +# +# [\p{sb=Upper}\p{sb=Lower}]\p{sb=ATerm}\p{sb=Upper} +# +# Unfortunately, this is incorrect. Why? Well, consider an example like so: +# +# U.S.A. +# +# A correct implementation of the sentence breaking algorithm should not insert +# any breaks here, exactly in accordance with repeatedly applying rule SB7 as +# given above. Our regex fails to do this because it will first match `U.S` +# without breaking them---which is correct---but will then start looking for +# its next rule beginning with a full stop (in ATerm) and followed by an +# uppercase letter (A). This will wind up triggering rule SB11 (without +# matching `A`), which inserts a break. +# +# The reason why this happens is because our initial application of rule SB7 +# "consumes" the next uppercase letter (S), which we want to reuse as a prefix +# in the next rule application. A natural way to express this would be with +# look-around, although it's not clear that works in every case since you +# ultimately might want to consume that ending uppercase letter. In any case, +# we can't use look-around in our truly regular regexes, so we must fix this. +# The approach we take is to explicitly repeat rules when a suffix of a rule +# is a prefix of another rule. In the case of SB7, the end of the rule, an +# uppercase letter, also happens to match the beginning of the rule. This can +# in turn be repeated indefinitely. Thus, our actual translation to a regex is: +# +# [\p{sb=Upper}\p{sb=Lower}]\p{sb=ATerm}\p{sb=Upper}(\p{sb=ATerm}\p{sb=Upper}* +# +# It turns out that this is exactly what ICU does, but in their case, they do +# it automatically. In our case, we connect the chaining rules manually. It's +# tedious. With that said, we do no implement Unicode line breaking with this +# approach, which is a far scarier beast. In that case, it would probably be +# worth writing the code to do what ICU does. +# +# In the case of sentence breaks, there aren't *too* many overlaps of this +# nature. We list them out exhaustively to make this clear, because it's +# essentially impossible to easily observe this in the regex. (It took me a +# full day to figure all of this out.) Rules marked with N/A mean that they +# specify a break, and this strategy only really applies to stringing together +# non-breaks. +# +# SB1 - N/A +# SB2 - N/A +# SB3 - None +# SB4 - N/A +# SB5 - None +# SB6 - None +# SB7 - End overlaps with beginning of SB7 +# SB8 - End overlaps with beginning of SB7 +# SB8a - End overlaps with beginning of SB6, SB8, SB8a, SB9, SB10, SB11 +# SB9 - None +# SB10 - None +# SB11 - None +# SB998 - N/A +# +# SB8a is in particular quite tricky to get right without look-ahead, since it +# allows ping-ponging between match rules SB8a and SB9-11, where SB9-11 +# otherwise indicate that a break has been found. In the regex below, we tackle +# this by only permitting part of SB8a to match inside our core non-breaking +# repetition. In particular, we only allow the parts of SB8a to match that +# permit the non-breaking components to continue. If a part of SB8a matches +# that guarantees a pop out to SB9-11, (like `STerm STerm`), then we let it +# happen. This still isn't correct because an SContinue might be seen which +# would allow moving back into SB998 and thus the non-breaking repetition, so +# we handle that case as well. +# +# Finally, the last complication here is the sprinkling of $Ex* everywhere. +# This essentially corresponds to the implementation of SB5 by following +# UAX #29's recommendation in S6.2. Essentially, we use it avoid ever breaking +# in the middle of a grapheme cluster. + +CR="\p{sb=CR}" +LF="\p{sb=LF}" +Sep="\p{sb=Sep}" +Close="\p{sb=Close}" +Sp="\p{sb=Sp}" +STerm="\p{sb=STerm}" +ATerm="\p{sb=ATerm}" +SContinue="\p{sb=SContinue}" +Numeric="\p{sb=Numeric}" +Upper="\p{sb=Upper}" +Lower="\p{sb=Lower}" +OLetter="\p{sb=OLetter}" + +Ex="[\p{sb=Extend}\p{sb=Format}]" +ParaSep="[$Sep $CR $LF]" +SATerm="[$STerm $ATerm]" + +LetterSepTerm="[$OLetter $Upper $Lower $ParaSep $SATerm]" + +echo "(?x) +( + # SB6 + $ATerm $Ex* + $Numeric + | + # SB7 + [$Upper $Lower] $Ex* $ATerm $Ex* + $Upper $Ex* + # overlap with SB7 + ($ATerm $Ex* $Upper $Ex*)* + | + # SB8 + $ATerm $Ex* $Close* $Ex* $Sp* $Ex* + ([^$LetterSepTerm] $Ex*)* $Lower $Ex* + # overlap with SB7 + ($ATerm $Ex* $Upper $Ex*)* + | + # SB8a + $SATerm $Ex* $Close* $Ex* $Sp* $Ex* + ( + $SContinue + | + $ATerm $Ex* + # Permit repetition of SB8a + (($Close $Ex*)* ($Sp $Ex*)* $SATerm)* + # In order to continue non-breaking matching, we now must observe + # a match with a rule that keeps us in SB6-8a. Otherwise, we've entered + # one of SB9-11 and know that a break must follow. + ( + # overlap with SB6 + $Numeric + | + # overlap with SB8 + ($Close $Ex*)* ($Sp $Ex*)* + ([^$LetterSepTerm] $Ex*)* $Lower $Ex* + # overlap with SB7 + ($ATerm $Ex* $Upper $Ex*)* + | + # overlap with SB8a + ($Close $Ex*)* ($Sp $Ex*)* $SContinue + ) + | + $STerm $Ex* + # Permit repetition of SB8a + (($Close $Ex*)* ($Sp $Ex*)* $SATerm)* + # As with ATerm above, in order to continue non-breaking matching, we + # must now observe a match with a rule that keeps us out of SB9-11. + # For STerm, the only such possibility is to see an SContinue. Anything + # else will result in a break. + ($Close $Ex*)* ($Sp $Ex*)* $SContinue + ) + | + # SB998 + # The logic behind this catch-all is that if we get to this point and + # see a Sep, CR, LF, STerm or ATerm, then it has to fall into one of + # SB9, SB10 or SB11. In the cases of SB9-11, we always find a break since + # SB11 acts as a catch-all to induce a break following a SATerm that isn't + # handled by rules SB6-SB8a. + [^$ParaSep $SATerm] +)* +# The following collapses rules SB3, SB4, part of SB8a, SB9, SB10 and SB11. +($SATerm $Ex* ($Close $Ex*)* ($Sp $Ex*)*)* ($CR $LF | $ParaSep)? +" diff --git a/vendor/bstr/scripts/regex/word.sh b/vendor/bstr/scripts/regex/word.sh new file mode 100644 index 0000000000..78c7a05cf3 --- /dev/null +++ b/vendor/bstr/scripts/regex/word.sh @@ -0,0 +1,111 @@ +#!/bin/sh + +# vim: indentexpr= nosmartindent autoindent +# vim: tabstop=2 shiftwidth=2 softtabstop=2 + +# See the comments in regex/sentence.sh for the general approach to how this +# regex was written. +# +# Writing the regex for this was *hard*. It took me two days of hacking to get +# this far, and that was after I had finished the sentence regex, so my brain +# was fully cached on this. Unlike the sentence regex, the rules in the regex +# below don't correspond as nicely to the rules in UAX #29. In particular, the +# UAX #29 rules have a ton of overlap with each other, which requires crazy +# stuff in the regex. I'm not even sure the regex below is 100% correct or even +# minimal, however, I did compare this with the ICU word segmenter on a few +# different corpora, and it produces identical results. (In addition to of +# course passing the UCD tests.) +# +# In general, I consider this approach to be a failure. Firstly, this is +# clearly a write-only regex. Secondly, building the minimized DFA for this is +# incredibly slow. Thirdly, the DFA is itself very large (~240KB). Fourthly, +# reversing this regex (for reverse word iteration) results in a >19MB DFA. +# Yes. That's MB. Wat. And it took 5 minutes to build. +# +# I think we might consider changing our approach to this problem. The normal +# path I've seen, I think, is to decode codepoints one at a time, and then +# thread them through a state machine in the code itself. We could take this +# approach, or possibly combine it with a DFA that tells us which Word_Break +# value a codepoint has. I'd prefer the latter approach, but it requires adding +# RegexSet support to regex-automata. Something that should definitely be done, +# but is a fair amount of work. +# +# Gah. + +CR="\p{wb=CR}" +LF="\p{wb=LF}" +Newline="\p{wb=Newline}" +ZWJ="\p{wb=ZWJ}" +RI="\p{wb=Regional_Indicator}" +Katakana="\p{wb=Katakana}" +HebrewLet="\p{wb=HebrewLetter}" +ALetter="\p{wb=ALetter}" +SingleQuote="\p{wb=SingleQuote}" +DoubleQuote="\p{wb=DoubleQuote}" +MidNumLet="\p{wb=MidNumLet}" +MidLetter="\p{wb=MidLetter}" +MidNum="\p{wb=MidNum}" +Numeric="\p{wb=Numeric}" +ExtendNumLet="\p{wb=ExtendNumLet}" +WSegSpace="\p{wb=WSegSpace}" + +Any="\p{any}" +Ex="[\p{wb=Extend} \p{wb=Format} $ZWJ]" +ExtendPict="\p{Extended_Pictographic}" +AHLetter="[$ALetter $HebrewLet]" +MidNumLetQ="[$MidNumLet $SingleQuote]" + +AHLetterRepeat="$AHLetter $Ex* ([$MidLetter $MidNumLetQ] $Ex* $AHLetter $Ex*)*" +NumericRepeat="$Numeric $Ex* ([$MidNum $MidNumLetQ] $Ex* $Numeric $Ex*)*" + +echo "(?x) +$CR $LF +| +[$Newline $CR $LF] +| +$WSegSpace $WSegSpace+ +| +( + ([^$Newline $CR $LF]? $Ex* $ZWJ $ExtendPict $Ex*)+ + | + ($ExtendNumLet $Ex*)* $AHLetter $Ex* + ( + ( + ($NumericRepeat | $ExtendNumLet $Ex*)* + | + [$MidLetter $MidNumLetQ] $Ex* + ) + $AHLetter $Ex* + )+ + ($NumericRepeat | $ExtendNumLet $Ex*)* + | + ($ExtendNumLet $Ex*)* $AHLetter $Ex* ($NumericRepeat | $ExtendNumLet $Ex*)+ + | + ($ExtendNumLet $Ex*)* $Numeric $Ex* + ( + ( + ($AHLetterRepeat | $ExtendNumLet $Ex*)* + | + [$MidNum $MidNumLetQ] $Ex* + ) + $Numeric $Ex* + )+ + ($AHLetterRepeat | $ExtendNumLet $Ex*)* + | + ($ExtendNumLet $Ex*)* $Numeric $Ex* ($AHLetterRepeat | $ExtendNumLet $Ex*)+ + | + $Katakana $Ex* + (($Katakana | $ExtendNumLet) $Ex*)+ + | + $ExtendNumLet $Ex* + (($ExtendNumLet | $AHLetter | $Numeric | $Katakana) $Ex*)+ +)+ +| +$HebrewLet $Ex* $SingleQuote $Ex* +| +($HebrewLet $Ex* $DoubleQuote $Ex*)+ $HebrewLet $Ex* +| +$RI $Ex* $RI $Ex* +| +$Any $Ex* +" diff --git a/vendor/bstr/src/ascii.rs b/vendor/bstr/src/ascii.rs new file mode 100644 index 0000000000..9799d1083d --- /dev/null +++ b/vendor/bstr/src/ascii.rs @@ -0,0 +1,322 @@ +use core::mem; + +// The following ~400 lines of code exists for exactly one purpose, which is +// to optimize this code: +// +// byte_slice.iter().position(|&b| b > 0x7F).unwrap_or(byte_slice.len()) +// +// Yes... Overengineered is a word that comes to mind, but this is effectively +// a very similar problem to memchr, and virtually nobody has been able to +// resist optimizing the crap out of that (except for perhaps the BSD and MUSL +// folks). In particular, this routine makes a very common case (ASCII) very +// fast, which seems worth it. We do stop short of adding AVX variants of the +// code below in order to retain our sanity and also to avoid needing to deal +// with runtime target feature detection. RESIST! +// +// In order to understand the SIMD version below, it would be good to read this +// comment describing how my memchr routine works: +// https://github.com/BurntSushi/rust-memchr/blob/b0a29f267f4a7fad8ffcc8fe8377a06498202883/src/x86/sse2.rs#L19-L106 +// +// The primary difference with memchr is that for ASCII, we can do a bit less +// work. In particular, we don't need to detect the presence of a specific +// byte, but rather, whether any byte has its most significant bit set. That +// means we can effectively skip the _mm_cmpeq_epi8 step and jump straight to +// _mm_movemask_epi8. + +#[cfg(any(test, not(target_arch = "x86_64")))] +const USIZE_BYTES: usize = mem::size_of::(); +#[cfg(any(test, not(target_arch = "x86_64")))] +const FALLBACK_LOOP_SIZE: usize = 2 * USIZE_BYTES; + +// This is a mask where the most significant bit of each byte in the usize +// is set. We test this bit to determine whether a character is ASCII or not. +// Namely, a single byte is regarded as an ASCII codepoint if and only if it's +// most significant bit is not set. +#[cfg(any(test, not(target_arch = "x86_64")))] +const ASCII_MASK_U64: u64 = 0x8080808080808080; +#[cfg(any(test, not(target_arch = "x86_64")))] +const ASCII_MASK: usize = ASCII_MASK_U64 as usize; + +/// Returns the index of the first non ASCII byte in the given slice. +/// +/// If slice only contains ASCII bytes, then the length of the slice is +/// returned. +pub fn first_non_ascii_byte(slice: &[u8]) -> usize { + #[cfg(not(target_arch = "x86_64"))] + { + first_non_ascii_byte_fallback(slice) + } + + #[cfg(target_arch = "x86_64")] + { + first_non_ascii_byte_sse2(slice) + } +} + +#[cfg(any(test, not(target_arch = "x86_64")))] +fn first_non_ascii_byte_fallback(slice: &[u8]) -> usize { + let align = USIZE_BYTES - 1; + let start_ptr = slice.as_ptr(); + let end_ptr = slice[slice.len()..].as_ptr(); + let mut ptr = start_ptr; + + unsafe { + if slice.len() < USIZE_BYTES { + return first_non_ascii_byte_slow(start_ptr, end_ptr, ptr); + } + + let chunk = read_unaligned_usize(ptr); + let mask = chunk & ASCII_MASK; + if mask != 0 { + return first_non_ascii_byte_mask(mask); + } + + ptr = ptr_add(ptr, USIZE_BYTES - (start_ptr as usize & align)); + debug_assert!(ptr > start_ptr); + debug_assert!(ptr_sub(end_ptr, USIZE_BYTES) >= start_ptr); + if slice.len() >= FALLBACK_LOOP_SIZE { + while ptr <= ptr_sub(end_ptr, FALLBACK_LOOP_SIZE) { + debug_assert_eq!(0, (ptr as usize) % USIZE_BYTES); + + let a = *(ptr as *const usize); + let b = *(ptr_add(ptr, USIZE_BYTES) as *const usize); + if (a | b) & ASCII_MASK != 0 { + // What a kludge. We wrap the position finding code into + // a non-inlineable function, which makes the codegen in + // the tight loop above a bit better by avoiding a + // couple extra movs. We pay for it by two additional + // stores, but only in the case of finding a non-ASCII + // byte. + #[inline(never)] + unsafe fn findpos( + start_ptr: *const u8, + ptr: *const u8, + ) -> usize { + let a = *(ptr as *const usize); + let b = *(ptr_add(ptr, USIZE_BYTES) as *const usize); + + let mut at = sub(ptr, start_ptr); + let maska = a & ASCII_MASK; + if maska != 0 { + return at + first_non_ascii_byte_mask(maska); + } + + at += USIZE_BYTES; + let maskb = b & ASCII_MASK; + debug_assert!(maskb != 0); + return at + first_non_ascii_byte_mask(maskb); + } + return findpos(start_ptr, ptr); + } + ptr = ptr_add(ptr, FALLBACK_LOOP_SIZE); + } + } + first_non_ascii_byte_slow(start_ptr, end_ptr, ptr) + } +} + +#[cfg(target_arch = "x86_64")] +fn first_non_ascii_byte_sse2(slice: &[u8]) -> usize { + use core::arch::x86_64::*; + + const VECTOR_SIZE: usize = mem::size_of::<__m128i>(); + const VECTOR_ALIGN: usize = VECTOR_SIZE - 1; + const VECTOR_LOOP_SIZE: usize = 4 * VECTOR_SIZE; + + let start_ptr = slice.as_ptr(); + let end_ptr = slice[slice.len()..].as_ptr(); + let mut ptr = start_ptr; + + unsafe { + if slice.len() < VECTOR_SIZE { + return first_non_ascii_byte_slow(start_ptr, end_ptr, ptr); + } + + let chunk = _mm_loadu_si128(ptr as *const __m128i); + let mask = _mm_movemask_epi8(chunk); + if mask != 0 { + return mask.trailing_zeros() as usize; + } + + ptr = ptr.add(VECTOR_SIZE - (start_ptr as usize & VECTOR_ALIGN)); + debug_assert!(ptr > start_ptr); + debug_assert!(end_ptr.sub(VECTOR_SIZE) >= start_ptr); + if slice.len() >= VECTOR_LOOP_SIZE { + while ptr <= ptr_sub(end_ptr, VECTOR_LOOP_SIZE) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + let a = _mm_load_si128(ptr as *const __m128i); + let b = _mm_load_si128(ptr.add(VECTOR_SIZE) as *const __m128i); + let c = _mm_load_si128(ptr.add(2 * VECTOR_SIZE) as *const __m128i); + let d = _mm_load_si128(ptr.add(3 * VECTOR_SIZE) as *const __m128i); + + let or1 = _mm_or_si128(a, b); + let or2 = _mm_or_si128(c, d); + let or3 = _mm_or_si128(or1, or2); + if _mm_movemask_epi8(or3) != 0 { + let mut at = sub(ptr, start_ptr); + let mask = _mm_movemask_epi8(a); + if mask != 0 { + return at + mask.trailing_zeros() as usize; + } + + at += VECTOR_SIZE; + let mask = _mm_movemask_epi8(b); + if mask != 0 { + return at + mask.trailing_zeros() as usize; + } + + at += VECTOR_SIZE; + let mask = _mm_movemask_epi8(c); + if mask != 0 { + return at + mask.trailing_zeros() as usize; + } + + at += VECTOR_SIZE; + let mask = _mm_movemask_epi8(d); + debug_assert!(mask != 0); + return at + mask.trailing_zeros() as usize; + } + ptr = ptr_add(ptr, VECTOR_LOOP_SIZE); + } + } + while ptr <= end_ptr.sub(VECTOR_SIZE) { + debug_assert!(sub(end_ptr, ptr) >= VECTOR_SIZE); + + let chunk = _mm_loadu_si128(ptr as *const __m128i); + let mask = _mm_movemask_epi8(chunk); + if mask != 0 { + return sub(ptr, start_ptr) + mask.trailing_zeros() as usize; + } + ptr = ptr.add(VECTOR_SIZE); + } + first_non_ascii_byte_slow(start_ptr, end_ptr, ptr) + } +} + +#[inline(always)] +unsafe fn first_non_ascii_byte_slow( + start_ptr: *const u8, + end_ptr: *const u8, + mut ptr: *const u8, +) -> usize { + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr); + + while ptr < end_ptr { + if *ptr > 0x7F { + return sub(ptr, start_ptr); + } + ptr = ptr.offset(1); + } + sub(end_ptr, start_ptr) +} + +/// Compute the position of the first ASCII byte in the given mask. +/// +/// The mask should be computed by `chunk & ASCII_MASK`, where `chunk` is +/// 8 contiguous bytes of the slice being checked where *at least* one of those +/// bytes is not an ASCII byte. +/// +/// The position returned is always in the inclusive range [0, 7]. +#[cfg(any(test, not(target_arch = "x86_64")))] +fn first_non_ascii_byte_mask(mask: usize) -> usize { + #[cfg(target_endian = "little")] + { mask.trailing_zeros() as usize / 8 } + #[cfg(target_endian = "big")] + { mask.leading_zeros() as usize / 8 } +} + +/// Increment the given pointer by the given amount. +unsafe fn ptr_add(ptr: *const u8, amt: usize) -> *const u8 { + debug_assert!(amt < ::core::isize::MAX as usize); + ptr.offset(amt as isize) +} + +/// Decrement the given pointer by the given amount. +unsafe fn ptr_sub(ptr: *const u8, amt: usize) -> *const u8 { + debug_assert!(amt < ::core::isize::MAX as usize); + ptr.offset((amt as isize).wrapping_neg()) +} + +#[cfg(any(test, not(target_arch = "x86_64")))] +unsafe fn read_unaligned_usize(ptr: *const u8) -> usize { + use core::ptr; + + let mut n: usize = 0; + ptr::copy_nonoverlapping(ptr, &mut n as *mut _ as *mut u8, USIZE_BYTES); + n +} + +/// Subtract `b` from `a` and return the difference. `a` should be greater than +/// or equal to `b`. +fn sub(a: *const u8, b: *const u8) -> usize { + debug_assert!(a >= b); + (a as usize) - (b as usize) +} + +#[cfg(test)] +mod tests { + use super::*; + + // Our testing approach here is to try and exhaustively test every case. + // This includes the position at which a non-ASCII byte occurs in addition + // to the alignment of the slice that we're searching. + + #[test] + fn positive_fallback_forward() { + for i in 0..517 { + let s = "a".repeat(i); + assert_eq!( + i, + first_non_ascii_byte_fallback(s.as_bytes()), + "i: {:?}, len: {:?}, s: {:?}", + i, s.len(), s + ); + } + } + + #[test] + #[cfg(target_arch = "x86_64")] + fn positive_sse2_forward() { + for i in 0..517 { + let b = "a".repeat(i).into_bytes(); + assert_eq!(b.len(), first_non_ascii_byte_sse2(&b)); + } + } + + #[test] + fn negative_fallback_forward() { + for i in 0..517 { + for align in 0..65 { + let mut s = "a".repeat(i); + s.push_str("☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃"); + let s = s.get(align..).unwrap_or(""); + assert_eq!( + i.saturating_sub(align), + first_non_ascii_byte_fallback(s.as_bytes()), + "i: {:?}, align: {:?}, len: {:?}, s: {:?}", + i, align, s.len(), s + ); + } + } + } + + #[test] + #[cfg(target_arch = "x86_64")] + fn negative_sse2_forward() { + for i in 0..517 { + for align in 0..65 { + let mut s = "a".repeat(i); + s.push_str("☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃☃"); + let s = s.get(align..).unwrap_or(""); + assert_eq!( + i.saturating_sub(align), + first_non_ascii_byte_sse2(s.as_bytes()), + "i: {:?}, align: {:?}, len: {:?}, s: {:?}", + i, align, s.len(), s + ); + } + } + } +} diff --git a/vendor/bstr/src/bstr.rs b/vendor/bstr/src/bstr.rs new file mode 100644 index 0000000000..0bed001da0 --- /dev/null +++ b/vendor/bstr/src/bstr.rs @@ -0,0 +1,3991 @@ +#[cfg(feature = "std")] +use std::borrow::Cow; +#[cfg(feature = "std")] +use std::ffi::OsStr; +#[cfg(feature = "std")] +use std::iter; +#[cfg(feature = "std")] +use std::path::Path; + +use core::cmp; +use core::mem; +use core::ops; +use core::ptr; +use core::slice; +use core::str; + +use memchr::{memchr, memrchr}; + +use ascii; +#[cfg(feature = "std")] +use bstring::BString; +use search::{PrefilterState, TwoWay}; +use slice_index::SliceIndex; +#[cfg(feature = "unicode")] +use unicode::{ + Graphemes, GraphemeIndices, + Sentences, SentenceIndices, + Words, WordIndices, WordsWithBreaks, WordsWithBreakIndices, + whitespace_len_fwd, whitespace_len_rev, +}; +use utf8::{self, Chars, CharIndices, Utf8Error}; + +/// A short-hand constructor for building a `&BStr`. +/// +/// This idiosyncratic constructor is useful for concisely building byte string +/// slices. Its primary utility is in conveniently writing byte string literals +/// in a uniform way. For example, consider this code that does not compile: +/// +/// ```ignore +/// let strs = vec![b"a", b"xy"]; +/// ``` +/// +/// The above code doesn't compile because the type of the byte string literal +/// `b"a"` is `&'static [u8; 1]`, and the type of `b"xy"` is +/// `&'static [u8; 2]`. Since their types aren't the same, they can't be stored +/// in the same `Vec`. (This is dissimilar from normal Unicode string slices, +/// where both `"a"` and `"xy"` have the same type of `&'static str`.) +/// +/// One way of getting the above code to compile is to convert byte strings to +/// slices. You might try this: +/// +/// ```ignore +/// let strs = vec![&b"a", &b"xy"]; +/// ``` +/// +/// But this just creates values with type `& &'static [u8; 1]` and +/// `& &'static [u8; 2]`. Instead, you need to force the issue like so: +/// +/// ``` +/// let strs = vec![&b"a"[..], &b"xy"[..]]; +/// // or +/// let strs = vec![b"a".as_ref(), b"xy".as_ref()]; +/// ``` +/// +/// But neither of these are particularly convenient to type, especially when +/// it's something as common as a string literal. Thus, this constructor +/// permits writing the following instead: +/// +/// ``` +/// use bstr::B; +/// +/// let strs = vec![B("a"), B(b"xy")]; +/// ``` +/// +/// Notice that this also lets you mix and match both string literals and byte +/// string literals. This can be quite convenient! +#[allow(non_snake_case)] +#[inline] +pub fn B<'a, B: ?Sized + AsRef<[u8]>>(bytes: &'a B) -> &'a BStr { + BStr::new(bytes.as_ref()) +} + +/// A byte string slice that is conventionally UTF-8. +/// +/// A byte string slice is the core string type in this library, and is usually +/// seen in its borrowed form, `&BStr`. The principle difference between a +/// `&BStr` and a `&str` (Rust's standard Unicode string slice) is that a +/// `&BStr` is only *conventionally* UTF-8, where as a `&str` is guaranteed to +/// always be valid UTF-8. +/// +/// If you need ownership or a growable byte string buffer, then use +/// [`BString`](struct.BString.html). +/// +/// # Literals +/// +/// A byte string literal has type `&'static BStr`. The most convenient way to +/// write a byte string literal is by using the short-hand [`B`](fn.B.html) +/// constructor function: +/// +/// ``` +/// use bstr::{B, BStr}; +/// +/// // A byte string literal can be constructed from a normal Unicode string. +/// let s = B("a byte string literal"); +/// // A byte string literal can also be constructed from a Rust byte string. +/// let s = B(b"another byte string literal"); +/// +/// // BStr::new can also be used: +/// let s = BStr::new("a byte string literal"); +/// let s = BStr::new(b"another byte string literal"); +/// ``` +/// +/// # Representation +/// +/// A `&BStr` has the same representation as a `&str`. That is, a `&BStr` is +/// a fat pointer which consists of a pointer to some bytes and a length. +/// +/// # Trait implementations +/// +/// The `BStr` type has a number of trait implementations, and in particular, +/// defines equality and ordinal comparisons between `&BStr`, `&str` and +/// `&[u8]` for convenience. +/// +/// The `Debug` implementation for `BStr` shows its bytes as a normal string. +/// For invalid UTF-8, hex escape sequences are used. +/// +/// The `Display` implementation behaves as if `BStr` were first lossily +/// converted to a `str`. Invalid UTF-8 bytes are substituted with the Unicode +/// replacement codepoint, which looks like this: �. +/// +/// # Indexing and slicing +/// +/// A `BStr` implements indexing and slicing using `[..]` notation. Unlike +/// the standard `str` type, the `BStr` type permits callers to index +/// individual bytes. For example: +/// +/// ``` +/// use bstr::B; +/// +/// let s = B("foo☃bar"); +/// assert_eq!(&s[0..3], "foo"); +/// assert_eq!(s[2], b'o'); +/// assert_eq!(&s[3..6], "☃"); +/// +/// // Nothing stops you from indexing or slicing invalid UTF-8. +/// assert_eq!(s[3], b'\xE2'); +/// assert_eq!(&s[3..5], B(b"\xE2\x98")); +/// ``` +#[derive(Hash)] +pub struct BStr { + bytes: [u8], +} + +impl BStr { + /// Create a byte string slice from anything that can be borrowed as a + /// sequence of bytes. This includes, but is not limited to, `&Vec`, + /// `&[u8]`, `&String` and `&str`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BStr; + /// + /// assert_eq!("abc", BStr::new("abc")); + /// assert_eq!("abc", BStr::new(b"abc")); + /// ``` + #[inline] + pub fn new>(bytes: &B) -> &BStr { + BStr::from_bytes(bytes.as_ref()) + } + + /// Create a mutable byte string slice from anything that can be borrowed + /// as a sequence of bytes. This includes, but is not limited to, `&mut + /// Vec` and `&mut [u8]`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BStr; + /// + /// assert_eq!("abc", BStr::new("abc")); + /// assert_eq!("abc", BStr::new(b"abc")); + /// ``` + #[inline] + pub fn new_mut>(bytes: &mut B) -> &mut BStr { + BStr::from_bytes_mut(bytes.as_mut()) + } + + /// Create an immutable byte string slice from an immutable byte slice. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BStr; + /// + /// let bytes = &[b'a']; + /// let bs = BStr::from_bytes(bytes); + /// assert_eq!("a", bs); + /// ``` + #[inline] + pub fn from_bytes(slice: &[u8]) -> &BStr { + unsafe { mem::transmute(slice) } + } + + /// Create a mutable byte string slice from a mutable byte slice. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BStr; + /// + /// let bytes = &mut [b'a']; + /// { + /// let bs = BStr::from_bytes_mut(bytes); + /// bs[0] = b'b'; + /// } + /// assert_eq!(b"b", bytes); + /// ``` + #[inline] + pub fn from_bytes_mut(slice: &mut [u8]) -> &mut BStr { + unsafe { mem::transmute(slice) } + } + + /// Create a byte string from its constituent pointer and length, where + /// the length is the number of bytes in the byte string. + /// + /// # Safety + /// + /// This function is unsafe as there is no guarantee that the given pointer + /// is valid for `len` elements, nor whether the lifetime inferred is a + /// suitable lifetime for the returned slice. + /// + /// `data` must be a non-null pointer, even for a zero length slice. A + /// pointer that is usable for zero-length slices can be obtaining from + /// the standard library's `NonNull::dangling()` constructor. + /// + /// The total size of the given slice must be no larger than `isize::MAX` + /// bytes in memory. + /// + /// # Caveat + /// + /// The lifetime for the returned slice is inferred from its usage. To + /// prevent accidental misuse, it's suggested to tie the lifetime to + /// whichever source lifetime is safe in the context, such as by providing + /// a helper function taking the lifetime of a host value for the slice, or + /// by explicit annotation. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BStr; + /// + /// // manifest a byte string from a single byte + /// let x = b'Z'; + /// let ptr = &x as *const u8; + /// let s = unsafe { BStr::from_raw_parts(ptr, 1) }; + /// assert_eq!(s, "Z"); + /// ``` + pub unsafe fn from_raw_parts<'a>(data: *const u8, len: usize) -> &'a BStr { + BStr::new(slice::from_raw_parts(data, len)) + } + + /// Create a mutable byte string from its constituent pointer and length, + /// where the length is the number of bytes in the byte string. + /// + /// # Safety + /// + /// This function is unsafe as there is no guarantee that the given pointer + /// is valid for `len` elements, nor whether the lifetime inferred is a + /// suitable lifetime for the returned slice. + /// + /// `data` must be a non-null pointer, even for a zero length slice. A + /// pointer that is usable for zero-length slices can be obtaining from + /// the standard library's `NonNull::dangling()` constructor. + /// + /// The total size of the given slice must be no larger than `isize::MAX` + /// bytes in memory. + /// + /// The above reasons are the same as for + /// [`from_raw_parts`](#method.from_raw_parts). In addition, for this + /// constructor, callers must guarantee that the mutable slice returned + /// is not aliased with any other reference. + /// + /// # Caveat + /// + /// The lifetime for the returned slice is inferred from its usage. To + /// prevent accidental misuse, it's suggested to tie the lifetime to + /// whichever source lifetime is safe in the context, such as by providing + /// a helper function taking the lifetime of a host value for the slice, or + /// by explicit annotation. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::mem; + /// use bstr::{BStr, BString}; + /// + /// // For demonstration purposes, get a mutable pointer to a byte string. + /// let mut buf = BString::from("bar"); + /// let ptr = buf.as_mut_ptr(); + /// // Drop buf without deallocating, to avoid &mut aliasing. + /// mem::forget(buf); + /// + /// // Now convert it to a mutable byte string from the raw pointer. + /// let mut s = unsafe { BStr::from_raw_parts_mut(ptr, 3) }; + /// s.make_ascii_uppercase(); + /// assert_eq!(s, "BAR"); + /// ``` + pub unsafe fn from_raw_parts_mut<'a>( + data: *mut u8, + len: usize, + ) -> &'a mut BStr { + BStr::new_mut(slice::from_raw_parts_mut(data, len)) + } + + /// Create an immutable byte string from an OS string slice. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this returns `None` if the given OS string is not valid UTF-8. (For + /// example, on Windows, file paths are allowed to be a sequence of + /// arbitrary 16-bit integers. Not all such sequences can be transcoded to + /// valid UTF-8.) + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::ffi::OsStr; + /// + /// use bstr::BStr; + /// + /// let os_str = OsStr::new("foo"); + /// let bs = BStr::from_os_str(os_str).expect("should be valid UTF-8"); + /// assert_eq!(bs, "foo"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn from_os_str(os_str: &OsStr) -> Option<&BStr> { + BStr::from_os_str_imp(os_str) + } + + #[cfg(feature = "std")] + #[cfg(unix)] + #[inline] + fn from_os_str_imp(os_str: &OsStr) -> Option<&BStr> { + use std::os::unix::ffi::OsStrExt; + + Some(BStr::new(os_str.as_bytes())) + } + + #[cfg(feature = "std")] + #[cfg(not(unix))] + #[inline] + fn from_os_str_imp(os_str: &OsStr) -> Option<&BStr> { + os_str.to_str().map(BStr::new) + } + + /// Create an immutable byte string from a file path. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this returns `None` if the given path is not valid UTF-8. (For example, + /// on Windows, file paths are allowed to be a sequence of arbitrary 16-bit + /// integers. Not all such sequences can be transcoded to valid UTF-8.) + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::path::Path; + /// + /// use bstr::BStr; + /// + /// let path = Path::new("foo"); + /// let bs = BStr::from_path(path).expect("should be valid UTF-8"); + /// assert_eq!(bs, "foo"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn from_path(path: &Path) -> Option<&BStr> { + BStr::from_os_str(path.as_os_str()) + } + + /// Returns the length, in bytes, of this byte string. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BStr; + /// + /// assert_eq!(0, BStr::new("").len()); + /// assert_eq!(3, BStr::new("abc").len()); + /// assert_eq!(8, BStr::new("☃βツ").len()); + /// ``` + #[inline] + pub fn len(&self) -> usize { + self.bytes.len() + } + + /// Returns true if and only if the length of this byte string is zero. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BStr; + /// + /// assert!(BStr::new("").is_empty()); + /// assert!(!BStr::new("abc").is_empty()); + /// ``` + #[inline] + pub fn is_empty(&self) -> bool { + self.bytes.is_empty() + } + + /// Returns an immutable byte slice of this `BStr`'s contents. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("hello"); + /// + /// assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes()); + /// ``` + #[inline] + pub fn as_bytes(&self) -> &[u8] { + &self.bytes + } + + /// Returns a mutable byte slice of this `BStr`'s contents. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("hello"); + /// s.as_bytes_mut()[1] = b'a'; + /// + /// assert_eq!(&[104, 97, 108, 108, 111], s.as_bytes()); + /// ``` + #[inline] + pub fn as_bytes_mut(&mut self) -> &mut [u8] { + &mut self.bytes + } + + /// Create a new owned byte string from this byte string slice. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BStr; + /// + /// let s = BStr::new("abc"); + /// let mut owned = s.to_bstring(); + /// owned.push_char('d'); + /// assert_eq!("abcd", owned); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn to_bstring(&self) -> BString { + BString::from_vec(self.as_bytes().to_vec()) + } + + /// Safely convert this byte string into a `&str` if it's valid UTF-8. + /// + /// If this byte string is not valid UTF-8, then an error is returned. The + /// error returned indicates the first invalid byte found and the length + /// of the error. + /// + /// In cases where a lossy conversion to `&str` is acceptable, then use one + /// of the [`to_str_lossy`](#method.to_str_lossy) + /// or [`to_str_lossy_into`](#method.to_str_lossy_into) methods. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// # fn example() -> Result<(), bstr::Utf8Error> { + /// let s = B("☃βツ").to_str()?; + /// assert_eq!("☃βツ", s); + /// + /// let mut bstring = BString::from("☃βツ"); + /// bstring.push_byte(b'\xFF'); + /// let err = bstring.to_str().unwrap_err(); + /// assert_eq!(8, err.valid_up_to()); + /// # Ok(()) }; example().unwrap() + /// ``` + #[inline] + pub fn to_str(&self) -> Result<&str, Utf8Error> { + utf8::validate(self.as_bytes()).map(|_| { + // SAFETY: This is safe because of the guarantees provided by + // utf8::validate. + unsafe { + str::from_utf8_unchecked(self.as_bytes()) + } + }) + } + + /// Unsafely convert this byte string into a `&str`, without checking for + /// valid UTF-8. + /// + /// # Safety + /// + /// Callers *must* ensure that this byte string is valid UTF-8 before + /// calling this method. Converting a byte string into a `&str` that is + /// not valid UTF-8 is considered undefined behavior. + /// + /// This routine is useful in performance sensitive contexts where the + /// UTF-8 validity of the byte string is already known and it is + /// undesirable to pay the cost of an additional UTF-8 validation check + /// that [`to_str`](#method.to_str) performs. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// // SAFETY: This is safe because string literals are guaranteed to be + /// // valid UTF-8 by the Rust compiler. + /// let s = unsafe { B("☃βツ").to_str_unchecked() }; + /// assert_eq!("☃βツ", s); + /// ``` + pub unsafe fn to_str_unchecked(&self) -> &str { + str::from_utf8_unchecked(self.as_bytes()) + } + + /// Convert this byte string to a valid UTF-8 string by replacing invalid + /// UTF-8 bytes with the Unicode replacement codepoint (`U+FFFD`). + /// + /// If the byte string is already valid UTF-8, then no copying or + /// allocation is performed and a borrrowed string slice is returned. If + /// the byte string is not valid UTF-8, then an owned string buffer is + /// returned with invalid bytes replaced by the replacement codepoint. + /// + /// This method uses the "substitution of maximal subparts" (Unicode + /// Standard, Chapter 3, Section 9) strategy for inserting the replacement + /// codepoint. Specifically, a replacement codepoint is inserted whenever a + /// byte is found that cannot possibly lead to a valid code unit sequence. + /// If there were previous bytes that represented a prefix of a well-formed + /// code unit sequence, then all of those bytes are substituted with a + /// single replacement codepoint. The "substitution of maximal subparts" + /// strategy is the same strategy used by + /// [W3C's Encoding standard](https://www.w3.org/TR/encoding/). + /// For a more precise description of the maximal subpart strategy, see + /// the Unicode Standard, Chapter 3, Section 9. See also + /// [Public Review Issue #121](http://www.unicode.org/review/pr-121.html). + /// + /// N.B. Rust's standard library also appears to use the same strategy, + /// but it does not appear to be an API guarantee. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::borrow::Cow; + /// use bstr::BString; + /// + /// let mut bstring = BString::from("☃βツ"); + /// assert_eq!(Cow::Borrowed("☃βツ"), bstring.to_str_lossy()); + /// + /// // Add a byte that makes the sequence invalid. + /// bstring.push_byte(b'\xFF'); + /// assert_eq!(Cow::Borrowed("☃βツ\u{FFFD}"), bstring.to_str_lossy()); + /// ``` + /// + /// This demonstrates the "maximal subpart" substitution logic. + /// + /// ``` + /// use bstr::B; + /// + /// // \x61 is the ASCII codepoint for 'a'. + /// // \xF1\x80\x80 is a valid 3-byte code unit prefix. + /// // \xE1\x80 is a valid 2-byte code unit prefix. + /// // \xC2 is a valid 1-byte code unit prefix. + /// // \x62 is the ASCII codepoint for 'b'. + /// // + /// // In sum, each of the prefixes is replaced by a single replacement + /// // codepoint since none of the prefixes are properly completed. This + /// // is in contrast to other strategies that might insert a replacement + /// // codepoint for every single byte. + /// let bs = B(b"\x61\xF1\x80\x80\xE1\x80\xC2\x62"); + /// assert_eq!("a\u{FFFD}\u{FFFD}\u{FFFD}b", bs.to_str_lossy()); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn to_str_lossy(&self) -> Cow { + match utf8::validate(self.as_bytes()) { + Ok(()) => { + // SAFETY: This is safe because of the guarantees provided by + // utf8::validate. + unsafe { + Cow::Borrowed(str::from_utf8_unchecked(self.as_bytes())) + } + } + Err(err) => { + let mut lossy = String::with_capacity(self.len()); + let (valid, after) = self + .as_bytes() + .split_at(err.valid_up_to()); + // SAFETY: This is safe because utf8::validate guarantees + // that all of `valid` is valid UTF-8. + lossy.push_str(unsafe { str::from_utf8_unchecked(valid) }); + lossy.push_str("\u{FFFD}"); + if let Some(len) = err.error_len() { + B(&after[len..]).to_str_lossy_into(&mut lossy); + } + Cow::Owned(lossy) + } + } + } + + /// Copy the contents of this byte string into the given owned string + /// buffer, while replacing invalid UTF-8 code unit sequences with the + /// Unicode replacement codepoint (`U+FFFD`). + /// + /// This method uses the same "substitution of maximal subparts" strategy + /// for inserting the replacement codepoint as the + /// [`to_str_lossy`](#method.to_str_lossy) method. + /// + /// This routine is useful for amortizing allocation. However, unlike + /// `to_str_lossy`, this routine will _always_ copy the contents of this + /// byte string into the destination buffer, even if this byte string is + /// valid UTF-8. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::borrow::Cow; + /// use bstr::BString; + /// + /// let mut bstring = BString::from("☃βツ"); + /// // Add a byte that makes the sequence invalid. + /// bstring.push_byte(b'\xFF'); + /// + /// let mut dest = String::new(); + /// bstring.to_str_lossy_into(&mut dest); + /// assert_eq!("☃βツ\u{FFFD}", dest); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn to_str_lossy_into(&self, dest: &mut String) { + dest.reserve(self.len()); + let mut bytes = self.as_bytes(); + loop { + match utf8::validate(bytes) { + Ok(()) => { + // SAFETY: This is safe because utf8::validate guarantees + // that all of `bytes` is valid UTF-8. + dest.push_str(unsafe { str::from_utf8_unchecked(bytes) }); + break; + } + Err(err) => { + let (valid, after) = bytes.split_at(err.valid_up_to()); + // SAFETY: This is safe because utf8::validate guarantees + // that all of `valid` is valid UTF-8. + dest.push_str(unsafe { str::from_utf8_unchecked(valid) }); + dest.push_str("\u{FFFD}"); + match err.error_len() { + None => break, + Some(len) => bytes = &after[len..], + } + } + } + } + } + + /// Create an OS string slice from this byte string. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this returns a UTF-8 decoding error if this byte string is not valid + /// UTF-8. (For example, on Windows, file paths are allowed to be a + /// sequence of arbitrary 16-bit integers. There is no obvious mapping from + /// an arbitrary sequence of 8-bit integers to an arbitrary sequence of + /// 16-bit integers.) + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("foo"); + /// let os_str = bs.to_os_str().expect("should be valid UTF-8"); + /// assert_eq!(os_str, "foo"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn to_os_str(&self) -> Result<&OsStr, Utf8Error> { + self.to_os_str_imp() + } + + #[cfg(feature = "std")] + #[cfg(unix)] + #[inline] + fn to_os_str_imp(&self) -> Result<&OsStr, Utf8Error> { + use std::os::unix::ffi::OsStrExt; + + Ok(OsStr::from_bytes(self.as_bytes())) + } + + #[cfg(feature = "std")] + #[cfg(not(unix))] + #[inline] + fn to_os_str_imp(&self) -> Result<&OsStr, Utf8Error> { + self.to_str().map(OsStr::new) + } + + /// Lossily create an OS string slice from this byte string. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this will perform a UTF-8 check and lossily convert this byte string + /// into valid UTF-8 using the Unicode replacement codepoint. + /// + /// Note that this can prevent the correct roundtripping of file paths on + /// non-Unix systems such as Windows, where file paths are an arbitrary + /// sequence of 16-bit integers. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B(b"foo\xFFbar"); + /// let os_str = bs.to_os_str_lossy(); + /// assert_eq!(os_str.to_string_lossy(), "foo\u{FFFD}bar"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn to_os_str_lossy(&self) -> Cow { + self.to_os_str_lossy_imp() + } + + #[cfg(feature = "std")] + #[cfg(unix)] + #[inline] + fn to_os_str_lossy_imp(&self) -> Cow { + use std::os::unix::ffi::OsStrExt; + + Cow::Borrowed(OsStr::from_bytes(self.as_bytes())) + } + + #[cfg(feature = "std")] + #[cfg(not(unix))] + #[inline] + fn to_os_str_lossy_imp(&self) -> Cow { + use std::ffi::OsString; + + match self.to_str_lossy() { + Cow::Borrowed(x) => Cow::Borrowed(OsStr::new(x)), + Cow::Owned(x) => Cow::Owned(OsString::from(x)), + } + } + + /// Create a path slice from this byte string. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this returns a UTF-8 decoding error if this byte string is not valid + /// UTF-8. (For example, on Windows, file paths are allowed to be a + /// sequence of arbitrary 16-bit integers. There is no obvious mapping from + /// an arbitrary sequence of 8-bit integers to an arbitrary sequence of + /// 16-bit integers.) + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("foo"); + /// let path = bs.to_path().expect("should be valid UTF-8"); + /// assert_eq!(path.as_os_str(), "foo"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn to_path(&self) -> Result<&Path, Utf8Error> { + self.to_os_str().map(Path::new) + } + + /// Lossily create a path slice from this byte string. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this will perform a UTF-8 check and lossily convert this byte string + /// into valid UTF-8 using the Unicode replacement codepoint. + /// + /// Note that this can prevent the correct roundtripping of file paths on + /// non-Unix systems such as Windows, where file paths are an arbitrary + /// sequence of 16-bit integers. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B(b"foo\xFFbar"); + /// let path = bs.to_path_lossy(); + /// assert_eq!(path.to_string_lossy(), "foo\u{FFFD}bar"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn to_path_lossy(&self) -> Cow { + use std::path::PathBuf; + + match self.to_os_str_lossy() { + Cow::Borrowed(x) => Cow::Borrowed(Path::new(x)), + Cow::Owned(x) => Cow::Owned(PathBuf::from(x)), + } + } + + /// Create a new `BString` by repeating this byte string `n` times. + /// + /// # Panics + /// + /// This function panics if the capacity of the new `BString` would + /// overflow. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert_eq!("foofoofoofoo", B("foo").repeat(4)); + /// assert_eq!("", B("foo").repeat(0)); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn repeat(&self, n: usize) -> BString { + iter::repeat(self).take(n).collect() + } + + /// Returns true if and only if this byte string contains the given needle. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert!(B("foo bar").contains("foo")); + /// assert!(B("foo bar").contains("bar")); + /// assert!(!B("foo").contains("foobar")); + /// ``` + #[inline] + pub fn contains>(&self, needle: B) -> bool { + self.find(needle).is_some() + } + + /// Returns true if and only if this byte string has the given prefix. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert!(B("foo bar").starts_with("foo")); + /// assert!(!B("foo bar").starts_with("bar")); + /// assert!(!B("foo").starts_with("foobar")); + /// ``` + #[inline] + pub fn starts_with>(&self, prefix: B) -> bool { + let prefix = prefix.as_ref(); + self.get(..prefix.len()).map_or(false, |x| x == prefix) + } + + /// Returns true if and only if this byte string has the given suffix. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert!(B("foo bar").ends_with("bar")); + /// assert!(!B("foo bar").ends_with("foo")); + /// assert!(!B("bar").ends_with("foobar")); + /// ``` + #[inline] + pub fn ends_with>(&self, suffix: B) -> bool { + let suffix = suffix.as_ref(); + self.len() + .checked_sub(suffix.len()) + .map_or(false, |s| &self[s..] == suffix) + } + + /// Returns the index of the first occurrence of the given needle. + /// + /// The needle may be any type that can be cheaply converted into a + /// `&[u8]`. This includes, but is not limited to, `&str`, `&BStr`, and of + /// course, `&[u8]` itself. + /// + /// Note that if you're are searching for the same needle in many + /// different small haystacks, it may be faster to initialize a + /// [`Finder`](struct.Finder.html) once, and reuse it for each search. + /// + /// # Complexity + /// + /// This routine is guaranteed to have worst case linear time complexity + /// with respect to both the needle and the haystack. That is, this runs + /// in `O(needle.len() + haystack.len())` time. + /// + /// This routine is also guaranteed to have worst case constant space + /// complexity. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("foo bar baz"); + /// assert_eq!(Some(0), s.find("foo")); + /// assert_eq!(Some(4), s.find("bar")); + /// assert_eq!(None, s.find("quux")); + /// ``` + #[inline] + pub fn find>(&self, needle: B) -> Option { + Finder::new(needle.as_ref()).find(self) + } + + /// Returns the index of the last occurrence of the given needle. + /// + /// The needle may be any type that can be cheaply converted into a + /// `&[u8]`. This includes, but is not limited to, `&str`, `&BStr`, and of + /// course, `&[u8]` itself. + /// + /// Note that if you're are searching for the same needle in many + /// different small haystacks, it may be faster to initialize a + /// [`FinderReverse`](struct.FinderReverse.html) once, and reuse it for + /// each search. + /// + /// # Complexity + /// + /// This routine is guaranteed to have worst case linear time complexity + /// with respect to both the needle and the haystack. That is, this runs + /// in `O(needle.len() + haystack.len())` time. + /// + /// This routine is also guaranteed to have worst case constant space + /// complexity. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("foo bar baz"); + /// assert_eq!(Some(0), s.rfind("foo")); + /// assert_eq!(Some(4), s.rfind("bar")); + /// assert_eq!(Some(8), s.rfind("ba")); + /// assert_eq!(None, s.rfind("quux")); + /// ``` + #[inline] + pub fn rfind>(&self, needle: B) -> Option { + FinderReverse::new(needle.as_ref()).rfind(self) + } + + /// Returns an iterator of the non-overlapping occurrences of the given + /// needle. The iterator yields byte offset positions indicating the start + /// of each match. + /// + /// # Complexity + /// + /// This routine is guaranteed to have worst case linear time complexity + /// with respect to both the needle and the haystack. That is, this runs + /// in `O(needle.len() + haystack.len())` time. + /// + /// This routine is also guaranteed to have worst case constant space + /// complexity. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("foo bar foo foo quux foo"); + /// let matches: Vec = s.find_iter("foo").collect(); + /// assert_eq!(matches, vec![0, 8, 12, 21]); + /// ``` + /// + /// An empty string matches at every position, including the position + /// immediately following the last byte: + /// + /// ``` + /// use bstr::B; + /// + /// let matches: Vec = B("foo").find_iter("").collect(); + /// assert_eq!(matches, vec![0, 1, 2, 3]); + /// + /// let matches: Vec = B("").find_iter("").collect(); + /// assert_eq!(matches, vec![0]); + /// ``` + #[inline] + pub fn find_iter<'a, B: ?Sized + AsRef<[u8]>>( + &'a self, + needle: &'a B, + ) -> Find<'a> { + Find::new(self, BStr::new(needle.as_ref())) + } + + /// Returns an iterator of the non-overlapping occurrences of the given + /// needle in reverse. The iterator yields byte offset positions indicating + /// the start of each match. + /// + /// # Complexity + /// + /// This routine is guaranteed to have worst case linear time complexity + /// with respect to both the needle and the haystack. That is, this runs + /// in `O(needle.len() + haystack.len())` time. + /// + /// This routine is also guaranteed to have worst case constant space + /// complexity. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("foo bar foo foo quux foo"); + /// let matches: Vec = s.rfind_iter("foo").collect(); + /// assert_eq!(matches, vec![21, 12, 8, 0]); + /// ``` + /// + /// An empty string matches at every position, including the position + /// immediately following the last byte: + /// + /// ``` + /// use bstr::B; + /// + /// let matches: Vec = B("foo").rfind_iter("").collect(); + /// assert_eq!(matches, vec![3, 2, 1, 0]); + /// + /// let matches: Vec = B("").rfind_iter("").collect(); + /// assert_eq!(matches, vec![0]); + /// ``` + #[inline] + pub fn rfind_iter<'a, B: ?Sized + AsRef<[u8]>>( + &'a self, + needle: &'a B, + ) -> FindReverse<'a> { + FindReverse::new(self, BStr::new(needle.as_ref())) + } + + /// Returns the index of the first occurrence of the given byte. If the + /// byte does not occur in this byte string, then `None` is returned. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert_eq!(Some(10), B("foo bar baz").find_byte(b'z')); + /// assert_eq!(None, B("foo bar baz").find_byte(b'y')); + /// ``` + #[inline] + pub fn find_byte(&self, byte: u8) -> Option { + memchr(byte, self.as_bytes()) + } + + /// Returns the index of the last occurrence of the given byte. If the + /// byte does not occur in this byte string, then `None` is returned. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert_eq!(Some(10), B("foo bar baz").rfind_byte(b'z')); + /// assert_eq!(None, B("foo bar baz").rfind_byte(b'y')); + /// ``` + #[inline] + pub fn rfind_byte(&self, byte: u8) -> Option { + memrchr(byte, self.as_bytes()) + } + + /// Returns the index of the first occurrence of the given codepoint. + /// If the codepoint does not occur in this byte string, then `None` is + /// returned. + /// + /// Note that if one searches for the replacement codepoint, `\u{FFFD}`, + /// then only explicit occurrences of that encoding will be found. Invalid + /// UTF-8 sequences will not be matched. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert_eq!(Some(10), B("foo bar baz").find_char('z')); + /// assert_eq!(Some(4), B("αβγγδ").find_char('γ')); + /// assert_eq!(None, B("foo bar baz").find_char('y')); + /// ``` + #[inline] + pub fn find_char(&self, ch: char) -> Option { + self.find(ch.encode_utf8(&mut [0; 4])) + } + + /// Returns the index of the last occurrence of the given codepoint. + /// If the codepoint does not occur in this byte string, then `None` is + /// returned. + /// + /// Note that if one searches for the replacement codepoint, `\u{FFFD}`, + /// then only explicit occurrences of that encoding will be found. Invalid + /// UTF-8 sequences will not be matched. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert_eq!(Some(10), B("foo bar baz").rfind_char('z')); + /// assert_eq!(Some(6), B("αβγγδ").rfind_char('γ')); + /// assert_eq!(None, B("foo bar baz").rfind_char('y')); + /// ``` + #[inline] + pub fn rfind_char(&self, ch: char) -> Option { + self.rfind(ch.encode_utf8(&mut [0; 4])) + } + + /// Returns an iterator over the fields in a byte string, separated by + /// contiguous whitespace. + /// + /// # Example + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let s = B(" foo\tbar\t\u{2003}\nquux \n"); + /// let fields: Vec<&BStr> = s.fields().collect(); + /// assert_eq!(fields, vec!["foo", "bar", "quux"]); + /// ``` + /// + /// A byte string consisting of just whitespace yields no elements: + /// + /// ``` + /// use bstr::B; + /// + /// assert_eq!(0, B(" \n\t\u{2003}\n \t").fields().count()); + /// ``` + #[inline] + pub fn fields(&self) -> Fields { + Fields::new(self) + } + + /// Returns an iterator over the fields in a byte string, separated by + /// contiguous codepoints satisfying the given predicate. + /// + /// If this byte + /// + /// # Example + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let s = B("123foo999999bar1quux123456"); + /// let fields: Vec<&BStr> = s.fields_with(|c| c.is_numeric()).collect(); + /// assert_eq!(fields, vec!["foo", "bar", "quux"]); + /// ``` + /// + /// A byte string consisting of all codepoints satisfying the predicate + /// yields no elements: + /// + /// ``` + /// use bstr::B; + /// + /// assert_eq!(0, B("1911354563").fields_with(|c| c.is_numeric()).count()); + /// ``` + #[inline] + pub fn fields_with bool>(&self, f: F) -> FieldsWith { + FieldsWith::new(self, f) + } + + /// Returns an iterator over substrings of this byte string, separated + /// by the given byte string. Each element yielded is guaranteed not to + /// include the splitter substring. + /// + /// The splitter may be any type that can be cheaply converted into a + /// `&[u8]`. This includes, but is not limited to, `&str`, `&BStr`, and of + /// course, `&[u8]` itself. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B("Mary had a little lamb").split(" ").collect(); + /// assert_eq!(x, vec!["Mary", "had", "a", "little", "lamb"]); + /// + /// let x: Vec<&BStr> = B("").split("X").collect(); + /// assert_eq!(x, vec![""]); + /// + /// let x: Vec<&BStr> = B("lionXXtigerXleopard").split("X").collect(); + /// assert_eq!(x, vec!["lion", "", "tiger", "leopard"]); + /// + /// let x: Vec<&BStr> = B("lion::tiger::leopard").split("::").collect(); + /// assert_eq!(x, vec!["lion", "tiger", "leopard"]); + /// ``` + /// + /// If a string contains multiple contiguous separators, you will end up + /// with empty strings yielded by the iterator: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B("||||a||b|c").split("|").collect(); + /// assert_eq!(x, vec!["", "", "", "", "a", "", "b", "c"]); + /// + /// let x: Vec<&BStr> = B("(///)").split("/").collect(); + /// assert_eq!(x, vec!["(", "", "", ")"]); + /// ``` + /// + /// Separators at the start or end of a string are neighbored by empty + /// strings. + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B("010").split("0").collect(); + /// assert_eq!(x, vec!["", "1", ""]); + /// ``` + /// + /// When the empty string is used as a separator, it splits every **byte** + /// in the byte string, along with the beginning and end of the byte + /// string. + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B("rust").split("").collect(); + /// assert_eq!(x, vec!["", "r", "u", "s", "t", ""]); + /// + /// // Splitting by an empty string is not UTF-8 aware. Elements yielded + /// // may not be valid UTF-8! + /// let x: Vec<&BStr> = B("☃").split("").collect(); + /// assert_eq!(x, vec![B(""), B(b"\xE2"), B(b"\x98"), B(b"\x83"), B("")]); + /// ``` + /// + /// Contiguous separators, especially whitespace, can lead to possibly + /// surprising behavior. For example, this code is correct: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B(" a b c").split(" ").collect(); + /// assert_eq!(x, vec!["", "", "", "", "a", "", "b", "c"]); + /// ``` + /// + /// It does *not* give you `["a", "b", "c"]`. For that behavior, use + /// [`fields`](#method.fields) instead. + #[inline] + pub fn split<'a, B: ?Sized + AsRef<[u8]>>( + &'a self, + splitter: &'a B, + ) -> Split<'a> { + Split::new(self, BStr::new(splitter.as_ref())) + } + + /// Returns an iterator over substrings of this byte string, separated by + /// the given byte string, in reverse. Each element yielded is guaranteed + /// not to include the splitter substring. + /// + /// The splitter may be any type that can be cheaply converted into a + /// `&[u8]`. This includes, but is not limited to, `&str`, `&BStr`, and of + /// course, `&[u8]` itself. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B("Mary had a little lamb").rsplit(" ").collect(); + /// assert_eq!(x, vec!["lamb", "little", "a", "had", "Mary"]); + /// + /// let x: Vec<&BStr> = B("").rsplit("X").collect(); + /// assert_eq!(x, vec![""]); + /// + /// let x: Vec<&BStr> = B("lionXXtigerXleopard").rsplit("X").collect(); + /// assert_eq!(x, vec!["leopard", "tiger", "", "lion"]); + /// + /// let x: Vec<&BStr> = B("lion::tiger::leopard").rsplit("::").collect(); + /// assert_eq!(x, vec!["leopard", "tiger", "lion"]); + /// ``` + /// + /// If a string contains multiple contiguous separators, you will end up + /// with empty strings yielded by the iterator: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B("||||a||b|c").rsplit("|").collect(); + /// assert_eq!(x, vec!["c", "b", "", "a", "", "", "", ""]); + /// + /// let x: Vec<&BStr> = B("(///)").rsplit("/").collect(); + /// assert_eq!(x, vec![")", "", "", "("]); + /// ``` + /// + /// Separators at the start or end of a string are neighbored by empty + /// strings. + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B("010").rsplit("0").collect(); + /// assert_eq!(x, vec!["", "1", ""]); + /// ``` + /// + /// When the empty string is used as a separator, it splits every **byte** + /// in the byte string, along with the beginning and end of the byte + /// string. + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B("rust").rsplit("").collect(); + /// assert_eq!(x, vec!["", "t", "s", "u", "r", ""]); + /// + /// // Splitting by an empty string is not UTF-8 aware. Elements yielded + /// // may not be valid UTF-8! + /// let x: Vec<&BStr> = B("☃").rsplit("").collect(); + /// assert_eq!(x, vec![B(""), B(b"\x83"), B(b"\x98"), B(b"\xE2"), B("")]); + /// ``` + /// + /// Contiguous separators, especially whitespace, can lead to possibly + /// surprising behavior. For example, this code is correct: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<&BStr> = B(" a b c").rsplit(" ").collect(); + /// assert_eq!(x, vec!["c", "b", "", "a", "", "", "", ""]); + /// ``` + /// + /// It does *not* give you `["a", "b", "c"]`. + #[inline] + pub fn rsplit<'a, B: ?Sized + AsRef<[u8]>>( + &'a self, + splitter: &'a B, + ) -> SplitReverse<'a> { + SplitReverse::new(self, BStr::new(splitter.as_ref())) + } + + /// Returns an iterator of at most `limit` substrings of this byte string, + /// separated by the given byte string. If `limit` substrings are yielded, + /// then the last substring will contain the remainder of this byte string. + /// + /// The splitter may be any type that can be cheaply converted into a + /// `&[u8]`. This includes, but is not limited to, `&str`, `&BStr`, and of + /// course, `&[u8]` itself. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<_> = B("Mary had a little lamb").splitn(3, " ").collect(); + /// assert_eq!(x, vec!["Mary", "had", "a little lamb"]); + /// + /// let x: Vec<_> = B("").splitn(3, "X").collect(); + /// assert_eq!(x, vec![""]); + /// + /// let x: Vec<_> = B("lionXXtigerXleopard").splitn(3, "X").collect(); + /// assert_eq!(x, vec!["lion", "", "tigerXleopard"]); + /// + /// let x: Vec<_> = B("lion::tiger::leopard").splitn(2, "::").collect(); + /// assert_eq!(x, vec!["lion", "tiger::leopard"]); + /// + /// let x: Vec<_> = B("abcXdef").splitn(1, "X").collect(); + /// assert_eq!(x, vec!["abcXdef"]); + /// + /// let x: Vec<_> = B("abcXdef").splitn(0, "X").collect(); + /// assert!(x.is_empty()); + /// ``` + #[inline] + pub fn splitn<'a, B: ?Sized + AsRef<[u8]>>( + &'a self, + limit: usize, + splitter: &'a B, + ) -> SplitN<'a> { + SplitN::new(self, BStr::new(splitter.as_ref()), limit) + } + + /// Returns an iterator of at most `limit` substrings of this byte string, + /// separated by the given byte string, in reverse. If `limit` substrings + /// are yielded, then the last substring will contain the remainder of this + /// byte string. + /// + /// The splitter may be any type that can be cheaply converted into a + /// `&[u8]`. This includes, but is not limited to, `&str`, `&BStr`, and of + /// course, `&[u8]` itself. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let x: Vec<_> = B("Mary had a little lamb").rsplitn(3, " ").collect(); + /// assert_eq!(x, vec!["lamb", "little", "Mary had a"]); + /// + /// let x: Vec<_> = B("").rsplitn(3, "X").collect(); + /// assert_eq!(x, vec![""]); + /// + /// let x: Vec<_> = B("lionXXtigerXleopard").rsplitn(3, "X").collect(); + /// assert_eq!(x, vec!["leopard", "tiger", "lionX"]); + /// + /// let x: Vec<_> = B("lion::tiger::leopard").rsplitn(2, "::").collect(); + /// assert_eq!(x, vec!["leopard", "lion::tiger"]); + /// + /// let x: Vec<_> = B("abcXdef").rsplitn(1, "X").collect(); + /// assert_eq!(x, vec!["abcXdef"]); + /// + /// let x: Vec<_> = B("abcXdef").rsplitn(0, "X").collect(); + /// assert!(x.is_empty()); + /// ``` + #[inline] + pub fn rsplitn<'a, B: ?Sized + AsRef<[u8]>>( + &'a self, + limit: usize, + splitter: &'a B, + ) -> SplitNReverse<'a> { + SplitNReverse::new(self, BStr::new(splitter.as_ref()), limit) + } + + /// Replace all matches of the given needle with the given replacement, and + /// the result as a new `BString`. + /// + /// This routine is useful as a convenience. If you need to reuse an + /// allocation, use [`replace_into`](#method.replace_into) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("this is old").replace("old", "new"); + /// assert_eq!(s, "this is new"); + /// ``` + /// + /// When the pattern doesn't match: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("this is old").replace("nada nada", "limonada"); + /// assert_eq!(s, "this is old"); + /// ``` + /// + /// When the needle is an empty string: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("foo").replace("", "Z"); + /// assert_eq!(s, "ZfZoZoZ"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn replace, R: AsRef<[u8]>>( + &self, + needle: N, + replacement: R, + ) -> BString { + let mut dest = BString::with_capacity(self.len()); + self.replace_into(needle, replacement, &mut dest); + dest + } + + /// Replace up to `limit` matches of the given needle with the given + /// replacement, and the result as a new `BString`. + /// + /// This routine is useful as a convenience. If you need to reuse an + /// allocation, use [`replacen_into`](#method.replacen_into) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("foofoo").replacen("o", "z", 2); + /// assert_eq!(s, "fzzfoo"); + /// ``` + /// + /// When the pattern doesn't match: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("foofoo").replacen("a", "z", 2); + /// assert_eq!(s, "foofoo"); + /// ``` + /// + /// When the needle is an empty string: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("foo").replacen("", "Z", 2); + /// assert_eq!(s, "ZfZoo"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn replacen, R: AsRef<[u8]>>( + &self, + needle: N, + replacement: R, + limit: usize, + ) -> BString { + let mut dest = BString::with_capacity(self.len()); + self.replacen_into(needle, replacement, limit, &mut dest); + dest + } + + /// Replace all matches of the given needle with the given replacement, + /// and write the result into the provided `BString`. + /// + /// This does **not** clear `dest` before writing to it. + /// + /// This routine is useful for reusing allocation. For a more convenient + /// API, use [`replace`](#method.replace) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("this is old"); + /// + /// let mut dest = BString::new(); + /// s.replace_into("old", "new", &mut dest); + /// assert_eq!(dest, "this is new"); + /// ``` + /// + /// When the pattern doesn't match: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("this is old"); + /// + /// let mut dest = BString::new(); + /// s.replace_into("nada nada", "limonada", &mut dest); + /// assert_eq!(dest, "this is old"); + /// ``` + /// + /// When the needle is an empty string: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("foo"); + /// + /// let mut dest = BString::new(); + /// s.replace_into("", "Z", &mut dest); + /// assert_eq!(dest, "ZfZoZoZ"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn replace_into, R: AsRef<[u8]>>( + &self, + needle: N, + replacement: R, + dest: &mut BString, + ) { + let (needle, replacement) = (needle.as_ref(), replacement.as_ref()); + + let mut last = 0; + for start in self.find_iter(needle) { + dest.push(&self[last..start]); + dest.push(replacement); + last = start + needle.len(); + } + dest.push(&self[last..]); + } + + /// Replace up to `limit` matches of the given needle with the given + /// replacement, and write the result into the provided `BString`. + /// + /// This does **not** clear `dest` before writing to it. + /// + /// This routine is useful for reusing allocation. For a more convenient + /// API, use [`replace`](#method.replacen) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("foofoo"); + /// + /// let mut dest = BString::new(); + /// s.replacen_into("o", "z", 2, &mut dest); + /// assert_eq!(dest, "fzzfoo"); + /// ``` + /// + /// When the pattern doesn't match: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("foofoo"); + /// + /// let mut dest = BString::new(); + /// s.replacen_into("a", "z", 2, &mut dest); + /// assert_eq!(dest, "foofoo"); + /// ``` + /// + /// When the needle is an empty string: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("foo"); + /// + /// let mut dest = BString::new(); + /// s.replacen_into("", "Z", 2, &mut dest); + /// assert_eq!(dest, "ZfZoo"); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn replacen_into, R: AsRef<[u8]>>( + &self, + needle: N, + replacement: R, + limit: usize, + dest: &mut BString, + ) { + let (needle, replacement) = (needle.as_ref(), replacement.as_ref()); + + let mut last = 0; + for start in self.find_iter(needle).take(limit) { + dest.push(&self[last..start]); + dest.push(replacement); + last = start + needle.len(); + } + dest.push(&self[last..]); + } + + /// Returns an iterator over the bytes in this byte string. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("foobar"); + /// let bytes: Vec = bs.bytes().collect(); + /// assert_eq!(bytes, bs); + /// ``` + #[inline] + pub fn bytes(&self) -> Bytes { + Bytes { it: self.as_bytes().iter() } + } + + /// Returns an iterator over the Unicode scalar values in this byte string. + /// If invalid UTF-8 is encountered, then the Unicode replacement codepoint + /// is yielded instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B(b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"); + /// let chars: Vec = bs.chars().collect(); + /// assert_eq!(vec!['☃', '\u{FFFD}', '𝞃', '\u{FFFD}', 'a'], chars); + /// ``` + /// + /// Codepoints can also be iterated over in reverse: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B(b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"); + /// let chars: Vec = bs.chars().rev().collect(); + /// assert_eq!(vec!['a', '\u{FFFD}', '𝞃', '\u{FFFD}', '☃'], chars); + /// ``` + #[inline] + pub fn chars(&self) -> Chars { + Chars::new(self) + } + + /// Returns an iterator over the Unicode scalar values in this byte string + /// along with their starting and ending byte index positions. If invalid + /// UTF-8 is encountered, then the Unicode replacement codepoint is yielded + /// instead. + /// + /// Note that this is slightly different from the `CharIndices` iterator + /// provided by the standard library. Aside from working on possibly + /// invalid UTF-8, this iterator provides both the corresponding starting + /// and ending byte indices of each codepoint yielded. The ending position + /// is necessary to slice the original byte string when invalid UTF-8 bytes + /// are converted into a Unicode replacement codepoint, since a single + /// replacement codepoint can substitute anywhere from 1 to 3 invalid bytes + /// (inclusive). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B(b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"); + /// let chars: Vec<(usize, usize, char)> = bs.char_indices().collect(); + /// assert_eq!(chars, vec![ + /// (0, 3, '☃'), + /// (3, 4, '\u{FFFD}'), + /// (4, 8, '𝞃'), + /// (8, 10, '\u{FFFD}'), + /// (10, 11, 'a'), + /// ]); + /// ``` + /// + /// Codepoints can also be iterated over in reverse: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B(b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"); + /// let chars: Vec<(usize, usize, char)> = bs + /// .char_indices() + /// .rev() + /// .collect(); + /// assert_eq!(chars, vec![ + /// (10, 11, 'a'), + /// (8, 10, '\u{FFFD}'), + /// (4, 8, '𝞃'), + /// (3, 4, '\u{FFFD}'), + /// (0, 3, '☃'), + /// ]); + /// ``` + #[inline] + pub fn char_indices(&self) -> CharIndices { + CharIndices::new(self) + } + + /// Returns an iterator over the grapheme clusters in this byte string. + /// If invalid UTF-8 is encountered, then the Unicode replacement codepoint + /// is yielded instead. + /// + /// # Examples + /// + /// This example shows how multiple codepoints can combine to form a + /// single grapheme cluster: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("a\u{0300}\u{0316}\u{1F1FA}\u{1F1F8}"); + /// let graphemes: Vec<&str> = bs.graphemes().collect(); + /// assert_eq!(vec!["à̖", "🇺🇸"], graphemes); + /// ``` + /// + /// This shows that graphemes can be iterated over in reverse: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("a\u{0300}\u{0316}\u{1F1FA}\u{1F1F8}"); + /// let graphemes: Vec<&str> = bs.graphemes().rev().collect(); + /// assert_eq!(vec!["🇺🇸", "à̖"], graphemes); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn graphemes(&self) -> Graphemes { + Graphemes::new(self) + } + + /// Returns an iterator over the grapheme clusters in this byte string + /// along with their starting and ending byte index positions. If invalid + /// UTF-8 is encountered, then the Unicode replacement codepoint is yielded + /// instead. + /// + /// # Examples + /// + /// This example shows how to get the byte offsets of each individual + /// grapheme cluster: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("a\u{0300}\u{0316}\u{1F1FA}\u{1F1F8}"); + /// let graphemes: Vec<(usize, usize, &str)> = + /// bs.grapheme_indices().collect(); + /// assert_eq!(vec![(0, 5, "à̖"), (5, 13, "🇺🇸")], graphemes); + /// ``` + /// + /// This example shows what happens when invalid UTF-8 is enountered. Note + /// that the offsets are valid indices into the original string, and do + /// not necessarily correspond to the length of the `&str` returned! + /// + /// ``` + /// use bstr::BString; + /// + /// let mut bytes = BString::new(); + /// bytes.push("a\u{0300}\u{0316}"); + /// bytes.push_byte(b'\xFF'); + /// bytes.push("\u{1F1FA}\u{1F1F8}"); + /// + /// let graphemes: Vec<(usize, usize, &str)> = + /// bytes.grapheme_indices().collect(); + /// assert_eq!( + /// graphemes, + /// vec![(0, 5, "à̖"), (5, 6, "\u{FFFD}"), (6, 14, "🇺🇸")] + /// ); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn grapheme_indices(&self) -> GraphemeIndices { + GraphemeIndices::new(self) + } + + /// Returns an iterator over the words in this byte string. If invalid + /// UTF-8 is encountered, then the Unicode replacement codepoint is yielded + /// instead. + /// + /// This is similar to + /// [`words_with_breaks`](struct.BStr.html#method.words_with_breaks), + /// except it only returns elements that contain a "word" character. A word + /// character is defined by UTS #18 (Annex C) to be the combination of the + /// `Alphabetic` and `Join_Control` properties, along with the + /// `Decimal_Number`, `Mark` and `Connector_Punctuation` general + /// categories. + /// + /// Since words are made up of one or more codepoints, this iterator + /// yields `&str` elements. When invalid UTF-8 is encountered, replacement + /// codepoints are [substituted](index.html#handling-of-invalid-utf-8). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B(r#"The quick ("brown") fox can't jump 32.3 feet, right?"#); + /// let words: Vec<&str> = bs.words().collect(); + /// assert_eq!(words, vec![ + /// "The", "quick", "brown", "fox", "can't", + /// "jump", "32.3", "feet", "right", + /// ]); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn words(&self) -> Words { + Words::new(self) + } + + /// Returns an iterator over the words in this byte string along with + /// their starting and ending byte index positions. + /// + /// This is similar to + /// [`words_with_break_indices`](struct.BStr.html#method.words_with_break_indices), + /// except it only returns elements that contain a "word" character. A word + /// character is defined by UTS #18 (Annex C) to be the combination of the + /// `Alphabetic` and `Join_Control` properties, along with the + /// `Decimal_Number`, `Mark` and `Connector_Punctuation` general + /// categories. + /// + /// Since words are made up of one or more codepoints, this iterator + /// yields `&str` elements. When invalid UTF-8 is encountered, replacement + /// codepoints are [substituted](index.html#handling-of-invalid-utf-8). + /// + /// # Examples + /// + /// This example shows how to get the byte offsets of each individual + /// word: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("can't jump 32.3 feet"); + /// let words: Vec<(usize, usize, &str)> = bs.word_indices().collect(); + /// assert_eq!(words, vec![ + /// (0, 5, "can't"), + /// (6, 10, "jump"), + /// (11, 15, "32.3"), + /// (16, 20, "feet"), + /// ]); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn word_indices(&self) -> WordIndices { + WordIndices::new(self) + } + + /// Returns an iterator over the words in this byte string, along with + /// all breaks between the words. Concatenating all elements yielded by + /// the iterator results in the original string (modulo Unicode replacement + /// codepoint substitutions if invalid UTF-8 is encountered). + /// + /// Since words are made up of one or more codepoints, this iterator + /// yields `&str` elements. When invalid UTF-8 is encountered, replacement + /// codepoints are [substituted](index.html#handling-of-invalid-utf-8). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B(r#"The quick ("brown") fox can't jump 32.3 feet, right?"#); + /// let words: Vec<&str> = bs.words_with_breaks().collect(); + /// assert_eq!(words, vec![ + /// "The", " ", "quick", " ", "(", "\"", "brown", "\"", ")", + /// " ", "fox", " ", "can't", " ", "jump", " ", "32.3", " ", "feet", + /// ",", " ", "right", "?", + /// ]); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn words_with_breaks(&self) -> WordsWithBreaks { + WordsWithBreaks::new(self) + } + + /// Returns an iterator over the words and their byte offsets in this + /// byte string, along with all breaks between the words. Concatenating + /// all elements yielded by the iterator results in the original string + /// (modulo Unicode replacement codepoint substitutions if invalid UTF-8 is + /// encountered). + /// + /// Since words are made up of one or more codepoints, this iterator + /// yields `&str` elements. When invalid UTF-8 is encountered, replacement + /// codepoints are [substituted](index.html#handling-of-invalid-utf-8). + /// + /// # Examples + /// + /// This example shows how to get the byte offsets of each individual + /// word: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("can't jump 32.3 feet"); + /// let words: Vec<(usize, usize, &str)> = + /// bs.words_with_break_indices().collect(); + /// assert_eq!(words, vec![ + /// (0, 5, "can't"), + /// (5, 6, " "), + /// (6, 10, "jump"), + /// (10, 11, " "), + /// (11, 15, "32.3"), + /// (15, 16, " "), + /// (16, 20, "feet"), + /// ]); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn words_with_break_indices(&self) -> WordsWithBreakIndices { + WordsWithBreakIndices::new(self) + } + + /// Returns an iterator over the sentences in this byte string. + /// + /// Typically, a sentence will include its trailing punctuation and + /// whitespace. Concatenating all elements yielded by the iterator + /// results in the original string (modulo Unicode replacement codepoint + /// substitutions if invalid UTF-8 is encountered). + /// + /// Since sentences are made up of one or more codepoints, this iterator + /// yields `&str` elements. When invalid UTF-8 is encountered, replacement + /// codepoints are [substituted](index.html#handling-of-invalid-utf-8). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("I want this. Not that. Right now."); + /// let sentences: Vec<&str> = bs.sentences().collect(); + /// assert_eq!(sentences, vec![ + /// "I want this. ", + /// "Not that. ", + /// "Right now.", + /// ]); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn sentences(&self) -> Sentences { + Sentences::new(self) + } + + /// Returns an iterator over the sentences in this byte string along with + /// their starting and ending byte index positions. + /// + /// Typically, a sentence will include its trailing punctuation and + /// whitespace. Concatenating all elements yielded by the iterator + /// results in the original string (modulo Unicode replacement codepoint + /// substitutions if invalid UTF-8 is encountered). + /// + /// Since sentences are made up of one or more codepoints, this iterator + /// yields `&str` elements. When invalid UTF-8 is encountered, replacement + /// codepoints are [substituted](index.html#handling-of-invalid-utf-8). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let bs = B("I want this. Not that. Right now."); + /// let sentences: Vec<(usize, usize, &str)> = + /// bs.sentence_indices().collect(); + /// assert_eq!(sentences, vec![ + /// (0, 13, "I want this. "), + /// (13, 23, "Not that. "), + /// (23, 33, "Right now."), + /// ]); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn sentence_indices(&self) -> SentenceIndices { + SentenceIndices::new(self) + } + + /// An iterator over all lines in a byte string, without their + /// terminators. + /// + /// For this iterator, the only line terminators recognized are `\r\n` and + /// `\n`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let s = B("\ + /// foo + /// + /// bar\r + /// baz + /// + /// + /// quux"); + /// let lines: Vec<&BStr> = s.lines().collect(); + /// assert_eq!(lines, vec![ + /// "foo", "", "bar", "baz", "", "", "quux", + /// ]); + /// ``` + #[inline] + pub fn lines(&self) -> Lines { + Lines::new(self) + } + + /// An iterator over all lines in a byte string, including their + /// terminators. + /// + /// For this iterator, the only line terminator recognized is `\n`. (Since + /// line terminators are included, this also handles `\r\n` line endings.) + /// + /// Line terminators are only included if they are present in the original + /// byte string. For example, the last line in a byte string may not end + /// with a line terminator. + /// + /// Concatenating all elements yielded by this iterator is guaranteed to + /// yield the original byte string. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BStr}; + /// + /// let s = B("\ + /// foo + /// + /// bar\r + /// baz + /// + /// + /// quux"); + /// let lines: Vec<&BStr> = s.lines_with_terminator().collect(); + /// assert_eq!(lines, vec![ + /// "foo\n", "\n", "bar\r\n", "baz\n", "\n", "\n", "quux", + /// ]); + /// ``` + #[inline] + pub fn lines_with_terminator(&self) -> LinesWithTerminator { + LinesWithTerminator::new(self) + } + + /// Return a byte string slice with leading and trailing whitespace + /// removed. + /// + /// Whitespace is defined according to the terms of the `White_Space` + /// Unicode property. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B(" foo\tbar\t\u{2003}\n"); + /// assert_eq!(s.trim(), "foo\tbar"); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn trim(&self) -> &BStr { + self.trim_start().trim_end() + } + + /// Return a byte string slice with leading whitespace removed. + /// + /// Whitespace is defined according to the terms of the `White_Space` + /// Unicode property. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B(" foo\tbar\t\u{2003}\n"); + /// assert_eq!(s.trim_start(), "foo\tbar\t\u{2003}\n"); + /// ``` + #[inline] + pub fn trim_start(&self) -> &BStr { + self.trim_start_imp() + } + + #[cfg(feature = "unicode")] + #[inline] + fn trim_start_imp(&self) -> &BStr { + let start = whitespace_len_fwd(self.as_bytes()); + &self[start..] + } + + #[cfg(not(feature = "unicode"))] + #[inline] + fn trim_start_imp(&self) -> &BStr { + self.trim_start_with(|c| c.is_whitespace()) + } + + /// Return a byte string slice with trailing whitespace removed. + /// + /// Whitespace is defined according to the terms of the `White_Space` + /// Unicode property. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B(" foo\tbar\t\u{2003}\n"); + /// assert_eq!(s.trim_end(), " foo\tbar"); + /// ``` + #[inline] + pub fn trim_end(&self) -> &BStr { + self.trim_end_imp() + } + + #[cfg(feature = "unicode")] + #[inline] + fn trim_end_imp(&self) -> &BStr { + let end = whitespace_len_rev(self.as_bytes()); + &self[..end] + } + + #[cfg(not(feature = "unicode"))] + #[inline] + fn trim_end_imp(&self) -> &BStr { + self.trim_end_with(|c| c.is_whitespace()) + } + + /// Return a byte string slice with leading and trailing characters + /// satisfying the given predicate removed. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("123foo5bar789"); + /// assert_eq!(s.trim_with(|c| c.is_numeric()), "foo5bar"); + /// ``` + #[inline] + pub fn trim_with bool>(&self, mut trim: F) -> &BStr { + self.trim_start_with(&mut trim).trim_end_with(&mut trim) + } + + /// Return a byte string slice with leading characters satisfying the given + /// predicate removed. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("123foo5bar789"); + /// assert_eq!(s.trim_start_with(|c| c.is_numeric()), "foo5bar789"); + /// ``` + #[inline] + pub fn trim_start_with bool>( + &self, + mut trim: F, + ) -> &BStr { + for (s, _, ch) in self.char_indices() { + if !trim(ch) { + return &self[s..]; + } + } + B("") + } + + /// Return a byte string slice with trailing characters satisfying the + /// given predicate removed. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("123foo5bar"); + /// assert_eq!(s.trim_end_with(|c| c.is_numeric()), "123foo5bar"); + /// ``` + #[inline] + pub fn trim_end_with bool>( + &self, + mut trim: F, + ) -> &BStr { + for (_, e, ch) in self.char_indices().rev() { + if !trim(ch) { + return &self[..e]; + } + } + B("") + } + + /// Returns a new `BString` containing the lowercase equivalent of this + /// byte string. + /// + /// In this case, lowercase is defined according to the `Lowercase` Unicode + /// property. + /// + /// If invalid UTF-8 is seen, or if a character has no lowercase variant, + /// then it is written to the given buffer unchanged. + /// + /// Note that some characters in this byte string may expand into multiple + /// characters when changing the case, so the number of bytes written to + /// the given byte string may not be equivalent to the number of bytes in + /// this byte string. + /// + /// If you'd like to reuse an allocation for performance reasons, then use + /// [`to_lowercase_into`](#method.to_lowercase_into) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("HELLO Β"); + /// assert_eq!("hello β", s.to_lowercase()); + /// ``` + /// + /// Scripts without case are not changed: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("农历新年"); + /// assert_eq!("农历新年", s.to_lowercase()); + /// ``` + /// + /// Invalid UTF-8 remains as is: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B(b"FOO\xFFBAR\xE2\x98BAZ"); + /// assert_eq!(B(b"foo\xFFbar\xE2\x98baz"), s.to_lowercase()); + /// ``` + #[cfg(all(feature = "std", feature = "unicode"))] + #[inline] + pub fn to_lowercase(&self) -> BString { + let mut buf = BString::new(); + self.to_lowercase_into(&mut buf); + buf + } + + /// Writes the lowercase equivalent of this byte string into the given + /// buffer. The buffer is not cleared before written to. + /// + /// In this case, lowercase is defined according to the `Lowercase` + /// Unicode property. + /// + /// If invalid UTF-8 is seen, or if a character has no lowercase variant, + /// then it is written to the given buffer unchanged. + /// + /// Note that some characters in this byte string may expand into multiple + /// characters when changing the case, so the number of bytes written to + /// the given byte string may not be equivalent to the number of bytes in + /// this byte string. + /// + /// If you don't need to amortize allocation and instead prefer + /// convenience, then use [`to_lowercase`](#method.to_lowercase) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("HELLO Β"); + /// + /// let mut buf = BString::new(); + /// s.to_lowercase_into(&mut buf); + /// assert_eq!("hello β", buf); + /// ``` + /// + /// Scripts without case are not changed: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("农历新年"); + /// + /// let mut buf = BString::new(); + /// s.to_lowercase_into(&mut buf); + /// assert_eq!("农历新年", buf); + /// ``` + /// + /// Invalid UTF-8 remains as is: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B(b"FOO\xFFBAR\xE2\x98BAZ"); + /// + /// let mut buf = BString::new(); + /// s.to_lowercase_into(&mut buf); + /// assert_eq!(B(b"foo\xFFbar\xE2\x98baz"), buf); + /// ``` + #[cfg(all(feature = "std", feature = "unicode"))] + #[inline] + pub fn to_lowercase_into(&self, buf: &mut BString) { + // TODO: This is the best we can do given what std exposes I think. + // If we roll our own case handling, then we might be able to do this + // a bit faster. We shouldn't roll our own case handling unless we + // need to, e.g., for doing caseless matching or case folding. + + // TODO(BUG): This doesn't handle any special casing rules. + + buf.reserve(self.len()); + for (s, e, ch) in self.char_indices() { + if ch == '\u{FFFD}' { + buf.push(&self[s..e]); + } else { + for upper in ch.to_lowercase() { + buf.push_char(upper); + } + } + } + } + + /// Returns a new `BString` containing the ASCII lowercase equivalent of + /// this byte string. + /// + /// In this case, lowercase is only defined in ASCII letters. Namely, the + /// letters `A-Z` are converted to `a-z`. All other bytes remain unchanged. + /// In particular, the length of the byte string returned is always + /// equivalent to the length of this byte string. + /// + /// If you'd like to reuse an allocation for performance reasons, then use + /// [`make_ascii_lowercase`](#method.make_ascii_lowercase) to perform + /// the conversion in place. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("HELLO Β"); + /// assert_eq!("hello Β", s.to_ascii_lowercase()); + /// ``` + /// + /// Invalid UTF-8 remains as is: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B(b"FOO\xFFBAR\xE2\x98BAZ"); + /// assert_eq!(B(b"foo\xFFbar\xE2\x98baz"), s.to_ascii_lowercase()); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn to_ascii_lowercase(&self) -> BString { + BString::from(self.as_bytes().to_ascii_lowercase()) + } + + /// Convert this byte string to its lowercase ASCII equivalent in place. + /// + /// In this case, lowercase is only defined in ASCII letters. Namely, the + /// letters `A-Z` are converted to `a-z`. All other bytes remain unchanged. + /// + /// If you don't need to do the conversion in + /// place and instead prefer convenience, then use + /// [`to_ascii_lowercase`](#method.to_ascii_lowercase) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("HELLO Β"); + /// s.make_ascii_lowercase(); + /// assert_eq!("hello Β", s); + /// ``` + /// + /// Invalid UTF-8 remains as is: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let mut s = BString::from_slice(b"FOO\xFFBAR\xE2\x98BAZ"); + /// s.make_ascii_lowercase(); + /// assert_eq!(B(b"foo\xFFbar\xE2\x98baz"), s); + /// ``` + #[inline] + pub fn make_ascii_lowercase(&mut self) { + self.as_bytes_mut().make_ascii_lowercase(); + } + + /// Returns a new `BString` containing the uppercase equivalent of this + /// byte string. + /// + /// In this case, uppercase is defined according to the `Uppercase` + /// Unicode property. + /// + /// If invalid UTF-8 is seen, or if a character has no uppercase variant, + /// then it is written to the given buffer unchanged. + /// + /// Note that some characters in this byte string may expand into multiple + /// characters when changing the case, so the number of bytes written to + /// the given byte string may not be equivalent to the number of bytes in + /// this byte string. + /// + /// If you'd like to reuse an allocation for performance reasons, then use + /// [`to_uppercase_into`](#method.to_uppercase_into) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("hello β"); + /// assert_eq!("HELLO Β", s.to_uppercase()); + /// ``` + /// + /// Scripts without case are not changed: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("农历新年"); + /// assert_eq!("农历新年", s.to_uppercase()); + /// ``` + /// + /// Invalid UTF-8 remains as is: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B(b"foo\xFFbar\xE2\x98baz"); + /// assert_eq!(B(b"FOO\xFFBAR\xE2\x98BAZ"), s.to_uppercase()); + /// ``` + #[cfg(all(feature = "std", feature = "unicode"))] + #[inline] + pub fn to_uppercase(&self) -> BString { + let mut buf = BString::new(); + self.to_uppercase_into(&mut buf); + buf + } + + /// Writes the uppercase equivalent of this byte string into the given + /// buffer. The buffer is not cleared before written to. + /// + /// In this case, uppercase is defined according to the `Uppercase` + /// Unicode property. + /// + /// If invalid UTF-8 is seen, or if a character has no uppercase variant, + /// then it is written to the given buffer unchanged. + /// + /// Note that some characters in this byte string may expand into multiple + /// characters when changing the case, so the number of bytes written to + /// the given byte string may not be equivalent to the number of bytes in + /// this byte string. + /// + /// If you don't need to amortize allocation and instead prefer + /// convenience, then use [`to_uppercase`](#method.to_uppercase) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("hello β"); + /// + /// let mut buf = BString::new(); + /// s.to_uppercase_into(&mut buf); + /// assert_eq!("HELLO Β", buf); + /// ``` + /// + /// Scripts without case are not changed: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("农历新年"); + /// + /// let mut buf = BString::new(); + /// s.to_uppercase_into(&mut buf); + /// assert_eq!("农历新年", buf); + /// ``` + /// + /// Invalid UTF-8 remains as is: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B(b"foo\xFFbar\xE2\x98baz"); + /// + /// let mut buf = BString::new(); + /// s.to_uppercase_into(&mut buf); + /// assert_eq!(B(b"FOO\xFFBAR\xE2\x98BAZ"), buf); + /// ``` + #[cfg(all(feature = "std", feature = "unicode"))] + #[inline] + pub fn to_uppercase_into(&self, buf: &mut BString) { + // TODO: This is the best we can do given what std exposes I think. + // If we roll our own case handling, then we might be able to do this + // a bit faster. We shouldn't roll our own case handling unless we + // need to, e.g., for doing caseless matching or case folding. + buf.reserve(self.len()); + for (s, e, ch) in self.char_indices() { + if ch == '\u{FFFD}' { + buf.push(&self[s..e]); + } else if ch.is_ascii() { + buf.push_char(ch.to_ascii_uppercase()); + } else { + for upper in ch.to_uppercase() { + buf.push_char(upper); + } + } + } + } + + /// Returns a new `BString` containing the ASCII uppercase equivalent of + /// this byte string. + /// + /// In this case, uppercase is only defined in ASCII letters. Namely, the + /// letters `a-z` are converted to `A-Z`. All other bytes remain unchanged. + /// In particular, the length of the byte string returned is always + /// equivalent to the length of this byte string. + /// + /// If you'd like to reuse an allocation for performance reasons, then use + /// [`make_ascii_uppercase`](#method.make_ascii_uppercase) to perform + /// the conversion in place. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B("hello β"); + /// assert_eq!("HELLO β", s.to_ascii_uppercase()); + /// ``` + /// + /// Invalid UTF-8 remains as is: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let s = B(b"foo\xFFbar\xE2\x98baz"); + /// assert_eq!(B(b"FOO\xFFBAR\xE2\x98BAZ"), s.to_ascii_uppercase()); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn to_ascii_uppercase(&self) -> BString { + BString::from(self.as_bytes().to_ascii_uppercase()) + } + + /// Convert this byte string to its uppercase ASCII equivalent in place. + /// + /// In this case, uppercase is only defined in ASCII letters. Namely, the + /// letters `a-z` are converted to `A-Z`. All other bytes remain unchanged. + /// + /// If you don't need to do the conversion in + /// place and instead prefer convenience, then use + /// [`to_ascii_uppercase`](#method.to_ascii_uppercase) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("hello β"); + /// s.make_ascii_uppercase(); + /// assert_eq!("HELLO β", s); + /// ``` + /// + /// Invalid UTF-8 remains as is: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let mut s = BString::from_slice(b"foo\xFFbar\xE2\x98baz"); + /// s.make_ascii_uppercase(); + /// assert_eq!(B(b"FOO\xFFBAR\xE2\x98BAZ"), s); + /// ``` + #[inline] + pub fn make_ascii_uppercase(&mut self) { + self.as_bytes_mut().make_ascii_uppercase(); + } + + /// Reverse the bytes in this string, in place. + /// + /// Note that this is not necessarily a well formed operation. For example, + /// if this byte string contains valid UTF-8 that isn't ASCII, then + /// reversing the string will likely result in invalid UTF-8 and otherwise + /// non-sensical content. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("hello"); + /// s.reverse_bytes(); + /// assert_eq!(s, "olleh"); + /// ``` + #[inline] + pub fn reverse_bytes(&mut self) { + self.as_bytes_mut().reverse(); + } + + /// Reverse the codepoints in this string, in place. + /// + /// If this byte string is valid UTF-8, then its reversal by codepoint + /// is also guaranteed to be valid UTF-8. + /// + /// This operation is equivalent to the following, but without allocating: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foo☃bar"); + /// + /// let mut chars: Vec = s.chars().collect(); + /// chars.reverse(); + /// + /// let reversed: String = chars.into_iter().collect(); + /// assert_eq!(reversed, "rab☃oof"); + /// ``` + /// + /// Note that this is not necessarily a well formed operation. For example, + /// if this byte string contains grapheme clusters with more than one + /// codepoint, then those grapheme clusters will not necessarily be + /// preserved. If you'd like to preserve grapheme clusters, then use + /// [`reverse_graphemes`](#method.reverse_graphemes) instead. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foo☃bar"); + /// s.reverse_chars(); + /// assert_eq!(s, "rab☃oof"); + /// ``` + /// + /// This example shows that not all reversals lead to a well formed string. + /// For example, in this case, combining marks are used to put accents over + /// some letters, and those accent marks must appear after the codepoints + /// they modify. + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let mut s = BString::from("résumé"); + /// s.reverse_chars(); + /// assert_eq!(s, B(b"\xCC\x81emus\xCC\x81er")); + /// ``` + /// + /// A word of warning: the above example relies on the fact that + /// `résumé` is in decomposed normal form, which means there are separate + /// codepoints for the accents above `e`. If it is instead in composed + /// normal form, then the example works: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let mut s = BString::from("résumé"); + /// s.reverse_chars(); + /// assert_eq!(s, "émusér"); + /// ``` + /// + /// The point here is to be cautious and not assume that just because + /// `reverse_chars` works in one case, that it therefore works in all + /// cases. + #[inline] + pub fn reverse_chars(&mut self) { + let mut i = 0; + loop { + let (_, size) = utf8::decode(self[i..].as_bytes()); + if size == 0 { + break; + } + if size > 1 { + self[i..i + size].reverse_bytes(); + } + i += size; + } + self.reverse_bytes(); + } + + /// Reverse the graphemes in this string, in place. + /// + /// If this byte string is valid UTF-8, then its reversal by grapheme + /// is also guaranteed to be valid UTF-8. + /// + /// This operation is equivalent to the following, but without allocating: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foo☃bar"); + /// + /// let mut graphemes: Vec<&str> = s.graphemes().collect(); + /// graphemes.reverse(); + /// + /// let reversed = graphemes.concat(); + /// assert_eq!(reversed, "rab☃oof"); + /// ``` + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foo☃bar"); + /// s.reverse_graphemes(); + /// assert_eq!(s, "rab☃oof"); + /// ``` + /// + /// This example shows how this correctly handles grapheme clusters, + /// unlike `reverse_chars`. + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("résumé"); + /// s.reverse_graphemes(); + /// assert_eq!(s, "émusér"); + /// ``` + #[cfg(feature = "unicode")] + #[inline] + pub fn reverse_graphemes(&mut self) { + use unicode::decode_grapheme; + + let mut i = 0; + loop { + let (_, size) = decode_grapheme(&self[i..]); + if size == 0 { + break; + } + if size > 1 { + self[i..i + size].reverse_bytes(); + } + i += size; + } + self.reverse_bytes(); + } + + /// Returns true if and only if every byte in this byte string is ASCII. + /// + /// ASCII is an encoding that defines 128 codepoints. A byte corresponds to + /// an ASCII codepoint if and only if it is in the inclusive range + /// `[0, 127]`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert!(B("abc").is_ascii()); + /// assert!(!B("☃βツ").is_ascii()); + /// assert!(!B(b"\xFF").is_ascii()); + /// ``` + #[inline] + pub fn is_ascii(&self) -> bool { + ascii::first_non_ascii_byte(&self.bytes) == self.len() + } + + /// Returns true if and only if the entire byte string is valid UTF-8. + /// + /// If you need location information about where a byte string's first + /// invalid UTF-8 byte is, then use the [`to_str`](#method.to_str) method. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert!(B("abc").is_utf8()); + /// assert!(B("☃βツ").is_utf8()); + /// // invalid bytes + /// assert!(!B(b"abc\xFF").is_utf8()); + /// // surrogate encoding + /// assert!(!B(b"\xED\xA0\x80").is_utf8()); + /// // incomplete sequence + /// assert!(!B(b"\xF0\x9D\x9Ca").is_utf8()); + /// // overlong sequence + /// assert!(!B(b"\xF0\x82\x82\xAC").is_utf8()); + /// ``` + #[inline] + pub fn is_utf8(&self) -> bool { + utf8::validate(self.as_bytes()).is_ok() + } + + /// Divides this byte string into two at an index. + /// + /// The first byte string will contain all bytes at indices `[0, at)`, and + /// the second byte string will contain all bytes at indices `[at, len)`. + /// + /// # Panics + /// + /// Panics if `at > len`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert_eq!(B("foobar").split_at(3), (B("foo"), B("bar"))); + /// assert_eq!(B("foobar").split_at(0), (B(""), B("foobar"))); + /// assert_eq!(B("foobar").split_at(6), (B("foobar"), B(""))); + /// ``` + #[inline] + pub fn split_at(&self, at: usize) -> (&BStr, &BStr) { + let (left, right) = self.as_bytes().split_at(at); + (BStr::new(left), BStr::new(right)) + } + + /// Divides this mutable byte string into two at an index. + /// + /// The first byte string will contain all bytes at indices `[0, at)`, and + /// the second byte string will contain all bytes at indices `[at, len)`. + /// + /// # Panics + /// + /// Panics if `at > len`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let mut b = BString::from("foobar"); + /// { + /// let (left, right) = b.split_at_mut(3); + /// left[2] = b'z'; + /// right[2] = b'z'; + /// } + /// assert_eq!(b, B("fozbaz")); + /// ``` + #[inline] + pub fn split_at_mut(&mut self, at: usize) -> (&mut BStr, &mut BStr) { + let (left, right) = self.as_bytes_mut().split_at_mut(at); + (BStr::new_mut(left), BStr::new_mut(right)) + } + + /// Retrieve a reference to a byte or a subslice, depending on the type of + /// the index given. + /// + /// If given a position, this returns a reference to the byte at that + /// position, if it exists. + /// + /// If given a range, this returns the slice of bytes corresponding to that + /// range in this byte string. + /// + /// In the case of invalid indices, this returns `None`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("baz"); + /// assert_eq!(s.get(1), Some(&b'a')); + /// assert_eq!(s.get(0..2), Some(B("ba"))); + /// assert_eq!(s.get(2..), Some(B("z"))); + /// assert_eq!(s.get(1..=2), Some(B("az"))); + /// ``` + #[inline] + pub fn get(&self, at: I) -> Option<&I::Output> { + at.get(self) + } + + /// Retrieve a mutable reference to a byte or a subslice, depending on the + /// type of the index given. + /// + /// If given a position, this returns a reference to the byte at that + /// position, if it exists. + /// + /// If given a range, this returns the slice of bytes corresponding to that + /// range in this byte string. + /// + /// In the case of invalid indices, this returns `None`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("baz"); + /// if let Some(mut slice) = s.get_mut(1..) { + /// slice[0] = b'o'; + /// slice[1] = b'p'; + /// } + /// assert_eq!(s, "bop"); + /// ``` + #[inline] + pub fn get_mut(&mut self, at: I) -> Option<&mut I::Output> { + at.get_mut(self) + } + + /// Retrieve a reference to a byte or a subslice, depending on the type of + /// the index given, while explicitly eliding bounds checks. + /// + /// If given a position, this returns a reference to the byte at that + /// position, if it exists. + /// + /// If given a range, this returns the slice of bytes corresponding to that + /// range in this byte string. + /// + /// In the case of invalid indices, this returns `None`. + /// + /// # Safety + /// + /// Callers must ensure that the supplied bounds are correct. If they + /// are out of bounds, then this results in undefined behavior. For a + /// safe alternative, use [`get`](#method.get). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("baz"); + /// unsafe { + /// assert_eq!(s.get_unchecked(1), &b'a'); + /// assert_eq!(s.get_unchecked(0..2), "ba"); + /// assert_eq!(s.get_unchecked(2..), "z"); + /// assert_eq!(s.get_unchecked(1..=2), "az"); + /// } + /// ``` + pub unsafe fn get_unchecked(&self, at: I) -> &I::Output { + at.get_unchecked(self) + } + + /// Retrieve a mutable reference to a byte or a subslice, depending on the + /// type of the index given, while explicitly eliding bounds checks. + /// + /// If given a position, this returns a reference to the byte at that + /// position, if it exists. + /// + /// If given a range, this returns the slice of bytes corresponding to that + /// range in this byte string. + /// + /// In the case of invalid indices, this returns `None`. + /// + /// # Safety + /// + /// Callers must ensure that the supplied bounds are correct. If they + /// are out of bounds, then this results in undefined behavior. For a + /// safe alternative, use [`get_mut`](#method.get_mut). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("baz"); + /// { + /// let mut slice = unsafe { s.get_unchecked_mut(1..) }; + /// slice[0] = b'o'; + /// slice[1] = b'p'; + /// } + /// assert_eq!(s, "bop"); + /// ``` + pub unsafe fn get_unchecked_mut( + &mut self, + at: I, + ) -> &mut I::Output { + at.get_unchecked_mut(self) + } + + /// Returns the last byte in this byte string, if it's non-empty. If this + /// byte string is empty, this returns `None`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// assert_eq!(Some(b'z'), B("baz").last()); + /// assert_eq!(None, B("").last()); + /// ``` + #[inline] + pub fn last(&self) -> Option { + self.get(self.len().saturating_sub(1)).map(|&b| b) + } + + /// Copies elements from one part of the slice to another part of itself, + /// where the parts may be overlapping. + /// + /// `src` is the range within this byte string to copy from, while `dest` + /// is the starting index of the range within this byte string to copy to. + /// The length indicated by `src` must be less than or equal to the number + /// of bytes from `dest` to the end of the byte string. + /// + /// # Panics + /// + /// Panics if either range is out of bounds, or if `src` is too big to fit + /// into `dest`, or if the end of `src` is before the start. + /// + /// # Examples + /// + /// Copying four bytes within a byte string: + /// + /// ``` + /// use bstr::BStr; + /// + /// let mut buf = *b"Hello, World!"; + /// let s = BStr::new_mut(&mut buf); + /// s.copy_within(1..5, 8); + /// assert_eq!(s, "Hello, Wello!"); + /// ``` + #[inline] + pub fn copy_within( + &mut self, + src: R, + dest: usize, + ) where R: ops::RangeBounds + { + let src_start = match src.start_bound() { + ops::Bound::Included(&n) => n, + ops::Bound::Excluded(&n) => { + n.checked_add(1).expect("attempted to index slice beyond max") + } + ops::Bound::Unbounded => 0, + }; + let src_end = match src.end_bound() { + ops::Bound::Included(&n) => { + n.checked_add(1).expect("attempted to index slice beyond max") + } + ops::Bound::Excluded(&n) => n, + ops::Bound::Unbounded => self.len(), + }; + assert!(src_start <= src_end, "src end is before src start"); + assert!(src_end <= self.len(), "src is out of bounds"); + let count = src_end - src_start; + assert!(dest <= self.len() - count, "dest is out of bounds"); + + // SAFETY: This is safe because we use ptr::copy to handle overlapping + // copies, and is also safe because we've checked all the bounds above. + // Finally, we are only dealing with u8 data, which is Copy, which + // means we can copy without worrying about ownership/destructors. + unsafe { + ptr::copy( + self.get_unchecked(src_start), + self.get_unchecked_mut(dest), + count, + ); + } + } + + /// Returns a raw pointer to this byte string's underlying bytes. + /// + /// # Safety + /// + /// The caller must ensure that the byte string outlives the pointer this + /// function returns, or else it will end up pointing to garbage. + /// + /// Modifying the container (like a `BString`) referenced by this byte + /// string may cause its buffer to be reallocated, which would also make + /// any pointers to it invalid. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B("hello"); + /// let p = s.as_ptr(); + /// + /// unsafe { + /// assert_eq!(*p.add(2), b'l'); + /// } + /// ``` + #[inline] + pub fn as_ptr(&self) -> *const u8 { + self.as_bytes().as_ptr() + } + + /// Returns a raw mutable pointer to this byte string's underlying bytes. + /// + /// # Safety + /// + /// The caller must ensure that the byte string outlives the pointer this + /// function returns, or else it will end up pointing to garbage. + /// + /// Modifying the container (like a `BString`) referenced by this byte + /// string may cause its buffer to be reallocated, which would also make + /// any pointers to it invalid. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BStr; + /// + /// let mut buf = &mut [b'h', b'e', b'l', b'l', b'o']; + /// let mut s = BStr::new_mut(buf); + /// let p = s.as_mut_ptr(); + /// + /// unsafe { + /// *p.add(2) = b'Z'; + /// } + /// assert_eq!("heZlo", s); + /// ``` + #[inline] + pub fn as_mut_ptr(&mut self) -> *mut u8 { + self.as_bytes_mut().as_mut_ptr() + } +} + +/// A single substring searcher fixed to a particular needle. +/// +/// The purpose of this type is to permit callers to construct a substring +/// searcher that can be used to search haystacks without the overhead of +/// constructing the searcher in the first place. This is a somewhat niche +/// concern when it's necessary to re-use the same needle to search multiple +/// different haystacks with as little overhead as possible. In general, using +/// [`BStr::find`](struct.BStr.html#method.find) +/// or +/// [`BStr::find_iter`](struct.BStr.html#method.find_iter) +/// is good enough, but `Finder` is useful when you can meaningfully observe +/// searcher construction time in a profile. +/// +/// When the `std` feature is enabled, then this type has an `into_owned` +/// version which permits building a `Finder` that is not connected to the +/// lifetime of its needle. +#[derive(Clone, Debug)] +pub struct Finder<'a> { + searcher: TwoWay<'a>, +} + +impl<'a> Finder<'a> { + /// Create a new finder for the given needle. + #[inline] + pub fn new>(needle: &'a B) -> Finder<'a> { + Finder { searcher: TwoWay::forward(BStr::new(needle)) } + } + + /// Convert this finder into its owned variant, such that it no longer + /// borrows the needle. + /// + /// If this is already an owned finder, then this is a no-op. Otherwise, + /// this copies the needle. + /// + /// This is only available when the `std` feature is enabled. + #[cfg(feature = "std")] + #[inline] + pub fn into_owned(self) -> Finder<'static> { + Finder { searcher: self.searcher.into_owned() } + } + + /// Returns the needle that this finder searches for. + /// + /// Note that the lifetime of the needle returned is tied to the lifetime + /// of the finder, and may be shorter than the `'a` lifetime. Namely, a + /// finder's needle can be either borrowed or owned, so the lifetime of the + /// needle returned must necessarily be the shorter of the two. + #[inline] + pub fn needle(&self) -> &BStr { + self.searcher.needle() + } + + /// Returns the index of the first occurrence of this needle in the given + /// haystack. + /// + /// The haystack may be any type that can be cheaply converted into a + /// `&[u8]`. This includes, but is not limited to, `&str`, `&BStr`, and of + /// course, `&[u8]` itself. + /// + /// # Complexity + /// + /// This routine is guaranteed to have worst case linear time complexity + /// with respect to both the needle and the haystack. That is, this runs + /// in `O(needle.len() + haystack.len())` time. + /// + /// This routine is also guaranteed to have worst case constant space + /// complexity. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::Finder; + /// + /// let haystack = "foo bar baz"; + /// assert_eq!(Some(0), Finder::new("foo").find(haystack)); + /// assert_eq!(Some(4), Finder::new("bar").find(haystack)); + /// assert_eq!(None, Finder::new("quux").find(haystack)); + /// ``` + #[inline] + pub fn find>(&self, haystack: B) -> Option { + self.searcher.find(BStr::new(haystack.as_ref())) + } +} + +/// A single substring reverse searcher fixed to a particular needle. +/// +/// The purpose of this type is to permit callers to construct a substring +/// searcher that can be used to search haystacks without the overhead of +/// constructing the searcher in the first place. This is a somewhat niche +/// concern when it's necessary to re-use the same needle to search multiple +/// different haystacks with as little overhead as possible. In general, using +/// [`BStr::rfind`](struct.BStr.html#method.rfind) +/// or +/// [`BStr::rfind_iter`](struct.BStr.html#method.rfind_iter) +/// is good enough, but `FinderReverse` is useful when you can meaningfully +/// observe searcher construction time in a profile. +/// +/// When the `std` feature is enabled, then this type has an `into_owned` +/// version which permits building a `FinderReverse` that is not connected to +/// the lifetime of its needle. +#[derive(Clone, Debug)] +pub struct FinderReverse<'a> { + searcher: TwoWay<'a>, +} + +impl<'a> FinderReverse<'a> { + /// Create a new reverse finder for the given needle. + #[inline] + pub fn new>(needle: &'a B) -> FinderReverse<'a> { + FinderReverse { searcher: TwoWay::reverse(BStr::new(needle)) } + } + + /// Convert this finder into its owned variant, such that it no longer + /// borrows the needle. + /// + /// If this is already an owned finder, then this is a no-op. Otherwise, + /// this copies the needle. + /// + /// This is only available when the `std` feature is enabled. + #[cfg(feature = "std")] + #[inline] + pub fn into_owned(self) -> FinderReverse<'static> { + FinderReverse { searcher: self.searcher.into_owned() } + } + + /// Returns the needle that this finder searches for. + /// + /// Note that the lifetime of the needle returned is tied to the lifetime + /// of this finder, and may be shorter than the `'a` lifetime. Namely, + /// a finder's needle can be either borrowed or owned, so the lifetime of + /// the needle returned must necessarily be the shorter of the two. + #[inline] + pub fn needle(&self) -> &BStr { + self.searcher.needle() + } + + /// Returns the index of the last occurrence of this needle in the given + /// haystack. + /// + /// The haystack may be any type that can be cheaply converted into a + /// `&[u8]`. This includes, but is not limited to, `&str`, `&BStr`, and of + /// course, `&[u8]` itself. + /// + /// # Complexity + /// + /// This routine is guaranteed to have worst case linear time complexity + /// with respect to both the needle and the haystack. That is, this runs + /// in `O(needle.len() + haystack.len())` time. + /// + /// This routine is also guaranteed to have worst case constant space + /// complexity. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::FinderReverse; + /// + /// let haystack = "foo bar baz"; + /// assert_eq!(Some(0), FinderReverse::new("foo").rfind(haystack)); + /// assert_eq!(Some(4), FinderReverse::new("bar").rfind(haystack)); + /// assert_eq!(None, FinderReverse::new("quux").rfind(haystack)); + /// ``` + #[inline] + pub fn rfind>(&self, haystack: B) -> Option { + self.searcher.rfind(BStr::new(haystack.as_ref())) + } +} + +/// An iterator over non-overlapping substring matches. +/// +/// Matches are reported by the byte offset at which they begin. +/// +/// `'a` is the shorter of two lifetimes: the byte string being searched or the +/// byte string being looked for. +#[derive(Debug)] +pub struct Find<'a> { + haystack: &'a BStr, + prestate: PrefilterState, + searcher: TwoWay<'a>, + pos: usize, +} + +impl<'a> Find<'a> { + fn new(haystack: &'a BStr, needle: &'a BStr) -> Find<'a> { + let searcher = TwoWay::forward(needle); + let prestate = searcher.prefilter_state(); + Find { haystack, prestate, searcher, pos: 0 } + } +} + +impl<'a> Iterator for Find<'a> { + type Item = usize; + + #[inline] + fn next(&mut self) -> Option { + if self.pos > self.haystack.len() { + return None; + } + let result = self.searcher.find_with( + &mut self.prestate, + &self.haystack[self.pos..], + ); + match result { + None => None, + Some(i) => { + let pos = self.pos + i; + self.pos = pos + cmp::max(1, self.searcher.needle().len()); + Some(pos) + } + } + } +} + +/// An iterator over non-overlapping substring matches in reverse. +/// +/// Matches are reported by the byte offset at which they begin. +/// +/// `'a` is the shorter of two lifetimes: the byte string being searched or the +/// byte string being looked for. +#[derive(Debug)] +pub struct FindReverse<'a> { + haystack: &'a BStr, + prestate: PrefilterState, + searcher: TwoWay<'a>, + /// When searching with an empty needle, this gets set to `None` after + /// we've yielded the last element at `0`. + pos: Option, +} + +impl<'a> FindReverse<'a> { + fn new(haystack: &'a BStr, needle: &'a BStr) -> FindReverse<'a> { + let searcher = TwoWay::reverse(needle); + let prestate = searcher.prefilter_state(); + let pos = Some(haystack.len()); + FindReverse { haystack, prestate, searcher, pos } + } + + fn haystack(&self) -> &'a BStr { + self.haystack + } + + fn needle(&self) -> &BStr { + self.searcher.needle() + } +} + +impl<'a> Iterator for FindReverse<'a> { + type Item = usize; + + #[inline] + fn next(&mut self) -> Option { + let pos = match self.pos { + None => return None, + Some(pos) => pos, + }; + let result = self.searcher.rfind_with( + &mut self.prestate, + &self.haystack[..pos], + ); + match result { + None => None, + Some(i) => { + if pos == i { + self.pos = pos.checked_sub(1); + } else { + self.pos = Some(i); + } + Some(i) + } + } + } +} + +/// An iterator over the bytes in a byte string. +/// +/// `'a` is the lifetime of the byte string being traversed. +#[derive(Debug)] +pub struct Bytes<'a> { + it: slice::Iter<'a, u8>, +} + +impl<'a> Iterator for Bytes<'a> { + type Item = u8; + + #[inline] + fn next(&mut self) -> Option { + self.it.next().map(|&b| b) + } +} + +impl<'a> DoubleEndedIterator for Bytes<'a> { + #[inline] + fn next_back(&mut self) -> Option { + self.it.next_back().map(|&b| b) + } +} + +impl<'a> ExactSizeIterator for Bytes<'a> { + #[inline] + fn len(&self) -> usize { + self.it.len() + } +} + +/// An iterator over the fields in a byte string, separated by whitespace. +/// +/// This iterator splits on contiguous runs of whitespace, such that the fields +/// in `foo\t\t\n \nbar` are `foo` and `bar`. +/// +/// `'a` is the lifetime of the byte string being split. +#[derive(Debug)] +pub struct Fields<'a> { + it: FieldsWith<'a, fn(char) -> bool>, +} + +impl<'a> Fields<'a> { + fn new(bytes: &'a BStr) -> Fields<'a> { + Fields { it: bytes.fields_with(|ch| ch.is_whitespace()) } + } +} + +impl<'a> Iterator for Fields<'a> { + type Item = &'a BStr; + + #[inline] + fn next(&mut self) -> Option<&'a BStr> { + self.it.next() + } +} + +/// An iterator over fields in the byte string, separated by a predicate over +/// codepoints. +/// +/// This iterator splits a byte string based on its predicate function such +/// that the elements returned are separated by contiguous runs of codepoints +/// for which the predicate returns true. +/// +/// `'a` is the lifetime of the byte string being split, while `F` is the type +/// of the predicate, i.e., `FnMut(char) -> bool`. +#[derive(Debug)] +pub struct FieldsWith<'a, F> { + f: F, + bytes: &'a BStr, + chars: CharIndices<'a>, +} + +impl<'a, F: FnMut(char) -> bool> FieldsWith<'a, F> { + fn new(bytes: &'a BStr, f: F) -> FieldsWith<'a, F> { + FieldsWith { + f: f, + bytes: bytes, + chars: bytes.char_indices(), + } + } +} + +impl<'a, F: FnMut(char) -> bool> Iterator for FieldsWith<'a, F> { + type Item = &'a BStr; + + #[inline] + fn next(&mut self) -> Option<&'a BStr> { + let (start, mut end); + loop { + match self.chars.next() { + None => return None, + Some((s, e, ch)) => { + if !(self.f)(ch) { + start = s; + end = e; + break; + } + } + } + } + while let Some((_, e, ch)) = self.chars.next() { + if (self.f)(ch) { + break; + } + end = e; + } + Some(&self.bytes[start..end]) + } +} + +/// An iterator over substrings in a byte string, split by a separator. +/// +/// `'a` is the lifetime of the byte string being split, while `F` is the type +/// of the predicate, i.e., `FnMut(char) -> bool`. +#[derive(Debug)] +pub struct Split<'a> { + finder: Find<'a>, + /// The end position of the previous match of our splitter. The element + /// we yield corresponds to the substring starting at `last` up to the + /// beginning of the next match of the splitter. + last: usize, + /// Only set when iteration is complete. A corner case here is when a + /// splitter is matched at the end of the haystack. At that point, we still + /// need to yield an empty string following it. + done: bool, +} + +impl<'a> Split<'a> { + fn new(haystack: &'a BStr, splitter: &'a BStr) -> Split<'a> { + let finder = haystack.find_iter(splitter); + Split { finder, last: 0, done: false } + } +} + +impl<'a> Iterator for Split<'a> { + type Item = &'a BStr; + + #[inline] + fn next(&mut self) -> Option<&'a BStr> { + let haystack = self.finder.haystack; + match self.finder.next() { + Some(start) => { + let next = &haystack[self.last..start]; + self.last = start + self.finder.searcher.needle().len(); + Some(next) + } + None => { + if self.last >= haystack.len() { + if !self.done { + self.done = true; + Some(B("")) + } else { + None + } + } else { + let s = &haystack[self.last..]; + self.last = haystack.len(); + self.done = true; + Some(s) + } + } + } + } +} + +/// An iterator over substrings in a byte string, split by a separator, in +/// reverse. +/// +/// `'a` is the lifetime of the byte string being split, while `F` is the type +/// of the predicate, i.e., `FnMut(char) -> bool`. +#[derive(Debug)] +pub struct SplitReverse<'a> { + finder: FindReverse<'a>, + /// The end position of the previous match of our splitter. The element + /// we yield corresponds to the substring starting at `last` up to the + /// beginning of the next match of the splitter. + last: usize, + /// Only set when iteration is complete. A corner case here is when a + /// splitter is matched at the end of the haystack. At that point, we still + /// need to yield an empty string following it. + done: bool, +} + +impl<'a> SplitReverse<'a> { + fn new(haystack: &'a BStr, splitter: &'a BStr) -> SplitReverse<'a> { + let finder = haystack.rfind_iter(splitter); + SplitReverse { finder, last: haystack.len(), done: false } + } +} + +impl<'a> Iterator for SplitReverse<'a> { + type Item = &'a BStr; + + #[inline] + fn next(&mut self) -> Option<&'a BStr> { + let haystack = self.finder.haystack(); + match self.finder.next() { + Some(start) => { + let nlen = self.finder.needle().len(); + let next = &haystack[start + nlen..self.last]; + self.last = start; + Some(next) + } + None => { + if self.last == 0 { + if !self.done { + self.done = true; + Some(B("")) + } else { + None + } + } else { + let s = &haystack[..self.last]; + self.last = 0; + self.done = true; + Some(s) + } + } + } + } +} + +/// An iterator over at most `n` substrings in a byte string, split by a +/// separator. +/// +/// `'a` is the lifetime of the byte string being split, while `F` is the type +/// of the predicate, i.e., `FnMut(char) -> bool`. +#[derive(Debug)] +pub struct SplitN<'a> { + split: Split<'a>, + limit: usize, + count: usize, +} + +impl<'a> SplitN<'a> { + fn new( + haystack: &'a BStr, + splitter: &'a BStr, + limit: usize, + ) -> SplitN<'a> { + let split = haystack.split(splitter); + SplitN { split, limit, count: 0 } + } +} + +impl<'a> Iterator for SplitN<'a> { + type Item = &'a BStr; + + #[inline] + fn next(&mut self) -> Option<&'a BStr> { + self.count += 1; + if self.count > self.limit { + None + } else if self.count == self.limit { + Some(&self.split.finder.haystack[self.split.last..]) + } else { + self.split.next() + } + } +} + + +/// An iterator over at most `n` substrings in a byte string, split by a +/// separator, in reverse. +/// +/// `'a` is the lifetime of the byte string being split, while `F` is the type +/// of the predicate, i.e., `FnMut(char) -> bool`. +#[derive(Debug)] +pub struct SplitNReverse<'a> { + split: SplitReverse<'a>, + limit: usize, + count: usize, +} + +impl<'a> SplitNReverse<'a> { + fn new( + haystack: &'a BStr, + splitter: &'a BStr, + limit: usize, + ) -> SplitNReverse<'a> { + let split = haystack.rsplit(splitter); + SplitNReverse { split, limit, count: 0 } + } +} + +impl<'a> Iterator for SplitNReverse<'a> { + type Item = &'a BStr; + + #[inline] + fn next(&mut self) -> Option<&'a BStr> { + self.count += 1; + if self.count > self.limit { + None + } else if self.count == self.limit { + Some(&self.split.finder.haystack()[..self.split.last]) + } else { + self.split.next() + } + } +} + +/// An iterator over all lines in a byte string, without their terminators. +/// +/// For this iterator, the only line terminators recognized are `\r\n` and +/// `\n`. +/// +/// `'a` is the lifetime of the byte string being iterated over. +pub struct Lines<'a> { + it: LinesWithTerminator<'a>, +} + +impl<'a> Lines<'a> { + fn new(bytes: &'a BStr) -> Lines<'a> { + Lines { it: LinesWithTerminator::new(bytes) } + } +} + +impl<'a> Iterator for Lines<'a> { + type Item = &'a BStr; + + #[inline] + fn next(&mut self) -> Option<&'a BStr> { + let mut line = self.it.next()?; + if line.last() == Some(b'\n') { + line = &line[..line.len() - 1]; + if line.last() == Some(b'\r') { + line = &line[..line.len() - 1]; + } + } + Some(line) + } +} + +/// An iterator over all lines in a byte string, including their terminators. +/// +/// For this iterator, the only line terminator recognized is `\n`. (Since +/// line terminators are included, this also handles `\r\n` line endings.) +/// +/// Line terminators are only included if they are present in the original +/// byte string. For example, the last line in a byte string may not end with +/// a line terminator. +/// +/// Concatenating all elements yielded by this iterator is guaranteed to yield +/// the original byte string. +/// +/// `'a` is the lifetime of the byte string being iterated over. +pub struct LinesWithTerminator<'a> { + bytes: &'a BStr, +} + +impl<'a> LinesWithTerminator<'a> { + fn new(bytes: &'a BStr) -> LinesWithTerminator<'a> { + LinesWithTerminator { bytes } + } +} + +impl<'a> Iterator for LinesWithTerminator<'a> { + type Item = &'a BStr; + + #[inline] + fn next(&mut self) -> Option<&'a BStr> { + match self.bytes.find_byte(b'\n') { + None if self.bytes.is_empty() => None, + None => { + let line = self.bytes; + self.bytes = B(""); + Some(line) + } + Some(end) => { + let line = &self.bytes[..end + 1]; + self.bytes = &self.bytes[end + 1..]; + Some(line) + } + } + } +} + +#[cfg(test)] +mod tests { + use tests::LOSSY_TESTS; + use super::*; + + #[test] + fn to_str_lossy() { + for (i, &(expected, input)) in LOSSY_TESTS.iter().enumerate() { + let got = B(input).to_str_lossy(); + assert_eq!( + expected.as_bytes(), + got.as_bytes(), + "to_str_lossy(ith: {:?}, given: {:?})", + i, input, + ); + + let mut got = String::new(); + B(input).to_str_lossy_into(&mut got); + assert_eq!( + expected.as_bytes(), got.as_bytes(), "to_str_lossy_into", + ); + + let got = String::from_utf8_lossy(input); + assert_eq!(expected.as_bytes(), got.as_bytes(), "std"); + } + } + + #[test] + #[should_panic] + fn copy_within_fail1() { + let mut buf = *b"foobar"; + let s = BStr::new_mut(&mut buf); + s.copy_within(0..2, 5); + } + + #[test] + #[should_panic] + fn copy_within_fail2() { + let mut buf = *b"foobar"; + let s = BStr::new_mut(&mut buf); + s.copy_within(3..2, 0); + } + + #[test] + #[should_panic] + fn copy_within_fail3() { + let mut buf = *b"foobar"; + let s = BStr::new_mut(&mut buf); + s.copy_within(5..7, 0); + } + + #[test] + #[should_panic] + fn copy_within_fail4() { + let mut buf = *b"foobar"; + let s = BStr::new_mut(&mut buf); + s.copy_within(0..1, 6); + } +} diff --git a/vendor/bstr/src/bstring.rs b/vendor/bstr/src/bstring.rs new file mode 100644 index 0000000000..016ccbac85 --- /dev/null +++ b/vendor/bstr/src/bstring.rs @@ -0,0 +1,1588 @@ +use std::borrow::Cow; +use std::error; +use std::ffi::{OsStr, OsString}; +use std::fmt; +use std::iter; +use std::ops; +use std::path::{Path, PathBuf}; +use std::ptr; +use std::str; +use std::vec; + +use bstr::BStr; +use utf8::{self, Utf8Error}; + +/// Concatenate the elements given by the iterator together into a single +/// `BString`. +/// +/// The elements may be any type that can be cheaply converted into an `&[u8]`. +/// This includes, but is not limited to, `&str`, `&BStr` and `&[u8]` itself. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// use bstr; +/// +/// let s = bstr::concat(&["foo", "bar", "baz"]); +/// assert_eq!(s, "foobarbaz"); +/// ``` +#[inline] +pub fn concat( + elements: I, +) -> BString +where T: AsRef<[u8]>, + I: IntoIterator +{ + let mut dest = BString::new(); + for element in elements { + dest.push(element); + } + dest +} + +/// Join the elements given by the iterator with the given separator into a +/// single `BString`. +/// +/// Both the separator and the elements may be any type that can be cheaply +/// converted into an `&[u8]`. This includes, but is not limited to, +/// `&str`, `&BStr` and `&[u8]` itself. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// use bstr; +/// +/// let s = bstr::join(",", &["foo", "bar", "baz"]); +/// assert_eq!(s, "foo,bar,baz"); +/// ``` +#[inline] +pub fn join( + separator: B, + elements: I, +) -> BString +where B: AsRef<[u8]>, + T: AsRef<[u8]>, + I: IntoIterator +{ + let mut it = elements.into_iter(); + let mut dest = BString::new(); + match it.next() { + None => return dest, + Some(first) => { + dest.push(first); + } + } + for element in it { + dest.push(&separator); + dest.push(element); + } + dest +} + +/// A growable byte string that is conventionally UTF-8. +/// +/// A `BString` has ownership over its contents and corresponds to +/// a growable or shrinkable buffer. Its borrowed counterpart is a +/// [`BStr`](struct.BStr.html), called a byte string slice. +/// +/// # Examples +/// +/// You can create a new `BString` from a literal Unicode string or a literal +/// byte string with `BString::from`: +/// +/// ``` +/// use bstr::BString; +/// +/// let s = BString::from("Hello, world!"); +/// ``` +/// +/// You can append bytes, characters or other strings to a `BString`: +/// +/// ``` +/// use bstr::BString; +/// +/// let mut s = BString::from("Hello, "); +/// s.push_byte(b'w'); +/// s.push_char('o'); +/// s.push("rl"); +/// s.push(b"d!"); +/// assert_eq!(s, "Hello, world!"); +/// ``` +/// +/// If you have a `String` or a `Vec`, then you can create a `BString` +/// from it with zero cost: +/// +/// ``` +/// use bstr::BString; +/// +/// let s = BString::from(vec![b'f', b'o', b'o']); +/// let s = BString::from("foo".to_string()); +/// ``` +/// +/// A `BString` can be freely converted back to a `Vec`: +/// +/// ``` +/// use bstr::BString; +/// +/// let s = BString::from("foo"); +/// let vector = s.into_vec(); +/// assert_eq!(vector, vec![b'f', b'o', b'o']); +/// ``` +/// +/// However, converting from a `BString` to a `String` requires UTF-8 +/// validation: +/// +/// ``` +/// use bstr::BString; +/// +/// # fn example() -> Result<(), ::bstr::FromUtf8Error> { +/// let bytes = BString::from("hello"); +/// let string = bytes.into_string()?; +/// +/// assert_eq!("hello", string); +/// # Ok(()) }; example().unwrap() +/// ``` +/// +/// # UTF-8 +/// +/// Like byte string slices (`BStr`), a `BString` is only conventionally +/// UTF-8. This is in constrast to the standard library's `String` type, which +/// is guaranteed to be valid UTF-8. +/// +/// Because of this relaxation, types such as `Vec`, `&[u8]`, `String` and +/// `&str` can all be converted to a `BString` (or `BStr`) at zero cost without +/// any validation step. +/// +/// Moreover, this relaxation implies that many of the restrictions around +/// mutating a `String` do not apply to `BString`. Namely, if your `BString` +/// is valid UTF-8, then the various methods that mutate the `BString` do not +/// necessarily prevent you from causing the bytes to become invalid UTF-8. +/// For example: +/// +/// ``` +/// use bstr::{B, BString}; +/// +/// let mut s = BString::from("hello"); +/// s[1] = b'\xFF'; +/// // `s` was valid UTF-8, but now it's now. +/// assert_eq!(s, B(b"h\xFFllo")); +/// ``` +/// +/// # Deref +/// +/// The `BString` type implements `Deref` and `DerefMut`, where the target +/// types are `&BStr` and `&mut BStr`, respectively. `Deref` permits all of the +/// methods defined on `BStr` to be implicitly callable on any `BString`. +/// For example, the `contains` method is defined on `BStr` and not `BString`, +/// but values of type `BString` can still use it directly: +/// +/// ``` +/// use bstr::BString; +/// +/// let s = BString::from("foobarbaz"); +/// assert!(s.contains("bar")); +/// ``` +/// +/// For more information about how deref works, see the documentation for the +/// [`std::ops::Deref`](https://doc.rust-lang.org/std/ops/trait.Deref.html) +/// trait. +/// +/// # Representation +/// +/// A `BString` has the same representation as a `Vec` and a `String`. +/// That is, it is made up of three word sized components: a pointer to a +/// region of memory containing the bytes, a length and a capacity. +#[derive(Clone, Hash)] +pub struct BString { + bytes: Vec, +} + +impl BString { + /// Creates a new empty `BString`. + /// + /// Given that the `BString` is empty, this will not allocate any initial + /// buffer. While that means that this initial operation is very + /// inexpensive, it may cause excessive allocation later when you add + /// data. If you have an idea of how much data the `String` will hold, + /// consider the [`with_capacity`] method to prevent excessive + /// re-allocation. + /// + /// [`with_capacity`]: #method.with_capacity + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let s = BString::new(); + /// ``` + #[inline] + pub fn new() -> BString { + BString { bytes: vec![] } + } + + /// Creates a new empty `BString` with a particular capacity. + /// + /// `BString`s have an internal buffer to hold their data. The capacity is + /// the length of that buffer, and can be queried with the [`capacity`] + /// method. This method creates an empty `BString`, but one with an initial + /// buffer that can hold `capacity` bytes. This is useful when you may be + /// appending a bunch of data to the `BString`, reducing the number of + /// reallocations it needs to do. + /// + /// [`capacity`]: #method.capacity + /// + /// If the given capacity is `0`, no allocation will occur, and this method + /// is identical to the [`new`] method. + /// + /// [`new`]: #method.new + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::with_capacity(10); + /// + /// // The String contains no chars, even though it has capacity for more + /// assert_eq!(s.len(), 0); + /// + /// // These are all done without reallocating... + /// let cap = s.capacity(); + /// for i in 0..10 { + /// s.push_char('a'); + /// } + /// + /// assert_eq!(s.capacity(), cap); + /// + /// // ...but this may make the vector reallocate + /// s.push_char('a'); + /// ``` + #[inline] + pub fn with_capacity(capacity: usize) -> BString { + BString { bytes: Vec::with_capacity(capacity) } + } + + /// Create a new byte string from the given bytes. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let bytes = vec![b'a', b'b', b'c']; + /// let s = BString::from_vec(bytes); + /// assert_eq!("abc", s); + /// ``` + #[inline] + pub fn from_vec(bytes: Vec) -> BString { + BString { bytes } + } + + /// Create a new byte string by copying the given slice. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let s = BString::from_slice(b"abc"); + /// assert_eq!("abc", s); + /// ``` + #[inline] + pub fn from_slice>(slice: B) -> BString { + BString::from_vec(slice.as_ref().to_vec()) + } + + /// Create a new byte string from an owned OS string. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this returns the original OS string if it is not valid UTF-8. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::ffi::OsString; + /// + /// use bstr::BString; + /// + /// let os_str = OsString::from("foo"); + /// let bs = BString::from_os_string(os_str).expect("must be valid UTF-8"); + /// assert_eq!(bs, "foo"); + /// ``` + #[inline] + pub fn from_os_string(os_str: OsString) -> Result { + BString::from_os_string_imp(os_str) + } + + #[cfg(unix)] + #[inline] + fn from_os_string_imp(os_str: OsString) -> Result { + use std::os::unix::ffi::OsStringExt; + + Ok(BString::from(os_str.into_vec())) + } + + #[cfg(not(unix))] + #[inline] + fn from_os_string_imp(os_str: OsString) -> Result { + os_str.into_string().map(BString::from) + } + + /// Lossily create a new byte string from an OS string slice. + /// + /// On Unix, this always succeeds, is zero cost and always returns a slice. + /// On non-Unix systems, this does a UTF-8 check. If the given OS string + /// slice is not valid UTF-8, then it is lossily decoded into valid UTF-8 + /// (with invalid bytes replaced by the Unicode replacement codepoint). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::ffi::OsStr; + /// + /// use bstr::{B, BString}; + /// + /// let os_str = OsStr::new("foo"); + /// let bs = BString::from_os_str_lossy(os_str); + /// assert_eq!(bs, B("foo")); + /// ``` + #[inline] + pub fn from_os_str_lossy<'a>(os_str: &'a OsStr) -> Cow<'a, BStr> { + BString::from_os_str_lossy_imp(os_str) + } + + #[cfg(unix)] + #[inline] + fn from_os_str_lossy_imp<'a>(os_str: &'a OsStr) -> Cow<'a, BStr> { + use std::os::unix::ffi::OsStrExt; + + Cow::Borrowed(BStr::new(os_str.as_bytes())) + } + + #[cfg(not(unix))] + #[inline] + fn from_os_str_lossy_imp<'a>(os_str: &'a OsStr) -> Cow<'a, BStr> { + match os_str.to_string_lossy() { + Cow::Borrowed(x) => Cow::Borrowed(BStr::new(x)), + Cow::Owned(x) => Cow::Owned(BString::from(x)), + } + } + + /// Create a new byte string from an owned file path. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this returns the original path if it is not valid UTF-8. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::path::PathBuf; + /// + /// use bstr::BString; + /// + /// let path = PathBuf::from("foo"); + /// let bs = BString::from_path_buf(path).expect("must be valid UTF-8"); + /// assert_eq!(bs, "foo"); + /// ``` + #[inline] + pub fn from_path_buf(path: PathBuf) -> Result { + BString::from_os_string(path.into_os_string()) + .map_err(PathBuf::from) + } + + /// Lossily create a new byte string from a file path. + /// + /// On Unix, this always succeeds, is zero cost and always returns a slice. + /// On non-Unix systems, this does a UTF-8 check. If the given path is not + /// valid UTF-8, then it is lossily decoded into valid UTF-8 (with invalid + /// bytes replaced by the Unicode replacement codepoint). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::path::Path; + /// + /// use bstr::{B, BString}; + /// + /// let path = Path::new("foo"); + /// let bs = BString::from_path_lossy(path); + /// assert_eq!(bs, B("foo")); + /// ``` + #[inline] + pub fn from_path_lossy<'a>(path: &'a Path) -> Cow<'a, BStr> { + BString::from_os_str_lossy(path.as_os_str()) + } + + /// Appends the given byte to the end of this byte string. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("abc"); + /// s.push_byte(b'\xE2'); + /// s.push_byte(b'\x98'); + /// s.push_byte(b'\x83'); + /// assert_eq!("abc☃", s); + /// ``` + #[inline] + pub fn push_byte(&mut self, byte: u8) { + self.bytes.push(byte); + } + + /// Appends the given `char` to the end of this byte string. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("abc"); + /// s.push_char('1'); + /// s.push_char('2'); + /// s.push_char('3'); + /// assert_eq!("abc123", s); + /// ``` + #[inline] + pub fn push_char(&mut self, ch: char) { + if ch.len_utf8() == 1 { + self.bytes.push(ch as u8); + return; + } + self.bytes.extend_from_slice(ch.encode_utf8(&mut [0; 4]).as_bytes()); + } + + /// Appends the given slice to the end of this byte string. This accepts + /// any type that be converted to a `&[u8]`. This includes, but is not + /// limited to, `&str`, `&BStr`, and of course, `&[u8]` itself. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("abc"); + /// s.push(b"123"); + /// assert_eq!("abc123", s); + /// ``` + #[inline] + pub fn push>(&mut self, bytes: B) { + self.bytes.extend_from_slice(bytes.as_ref()); + } + + /// Extracts a byte string slice containing the entire `BString`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{BStr, BString}; + /// + /// let s = BString::from("foo"); + /// + /// assert_eq!(BStr::new("foo"), s.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &BStr { + BStr::from_bytes(&self.bytes) + } + + /// Returns this `BString` as a borrowed byte vector. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let bs = BString::from("ab"); + /// assert!(bs.as_vec().capacity() >= 2); + /// ``` + #[inline] + pub fn as_vec(&self) -> &Vec { + &self.bytes + } + + /// Converts a `BString` into a mutable string slice. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foobar"); + /// let s_mut_str = s.as_mut_bstr(); + /// + /// s_mut_str[0] = b'F'; + /// + /// assert_eq!("Foobar", s_mut_str); + /// ``` + #[inline] + pub fn as_mut_bstr(&mut self) -> &mut BStr { + BStr::from_bytes_mut(&mut self.bytes) + } + + /// Returns this `BString` as a mutable byte vector. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut bs = BString::from("ab"); + /// bs.as_mut_vec().push(b'c'); + /// assert_eq!("abc", bs); + /// ``` + #[inline] + pub fn as_mut_vec(&mut self) -> &mut Vec { + &mut self.bytes + } + + /// Converts a `BString` into a byte vector. + /// + /// This consumes the `BString`, and thus the contents are not copied. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let s = BString::from("hello"); + /// let bytes = s.into_vec(); + /// + /// assert_eq!(vec![104, 101, 108, 108, 111], &bytes[..]); + /// ``` + #[inline] + pub fn into_vec(self) -> Vec { + self.bytes + } + + /// Converts a `BString` into a `String` if and only if this byte string is + /// valid UTF-8. + /// + /// If it is not valid UTF-8, then the error `std::string::FromUtf8Error` + /// is returned. (This error can be used to examine why UTF-8 validation + /// failed, or to regain the original byte string.) + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// # fn example() -> Result<(), ::bstr::FromUtf8Error> { + /// let bytes = BString::from("hello"); + /// let string = bytes.into_string()?; + /// + /// assert_eq!("hello", string); + /// # Ok(()) }; example().unwrap() + /// ``` + /// + /// If this byte string is not valid UTF-8, then an error will be returned. + /// That error can then be used to inspect the location at which invalid + /// UTF-8 was found, or to regain the original byte string: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let bytes = BString::from_slice(b"foo\xFFbar"); + /// let err = bytes.into_string().unwrap_err(); + /// + /// assert_eq!(err.utf8_error().valid_up_to(), 3); + /// assert_eq!(err.utf8_error().error_len(), Some(1)); + /// + /// // At no point in this example is an allocation performed. + /// let bytes = BString::from(err.into_bstring()); + /// assert_eq!(bytes, B(b"foo\xFFbar")); + /// ``` + #[inline] + pub fn into_string(self) -> Result { + match utf8::validate(self.as_bytes()) { + Err(err) => { + Err(FromUtf8Error { original: self, err: err }) + } + Ok(()) => { + // SAFETY: This is safe because of the guarantees provided by + // utf8::validate. + unsafe { Ok(self.into_string_unchecked()) } + } + } + } + + /// Lossily converts a `BString` into a `String`. If this byte string + /// contains invalid UTF-8, then the invalid bytes are replaced with the + /// Unicode replacement codepoint. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let bytes = BString::from_slice(b"foo\xFFbar"); + /// let string = bytes.into_string_lossy(); + /// assert_eq!(string, "foo\u{FFFD}bar"); + /// ``` + #[inline] + pub fn into_string_lossy(self) -> String { + self.to_string() + } + + /// Unsafely convert this byte string into a `String`, without checking for + /// valid UTF-8. + /// + /// # Safety + /// + /// Callers *must* ensure that this byte string is valid UTF-8 before + /// calling this method. Converting a byte string into a `String` that is + /// not valid UTF-8 is considered undefined behavior. + /// + /// This routine is useful in performance sensitive contexts where the + /// UTF-8 validity of the byte string is already known and it is + /// undesirable to pay the cost of an additional UTF-8 validation check + /// that [`into_string`](#method.into_string) performs. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// // SAFETY: This is safe because string literals are guaranteed to be + /// // valid UTF-8 by the Rust compiler. + /// let s = unsafe { BString::from("☃βツ").into_string_unchecked() }; + /// assert_eq!("☃βツ", s); + /// ``` + pub unsafe fn into_string_unchecked(self) -> String { + String::from_utf8_unchecked(self.into_vec()) + } + + /// Converts this byte string into an OS string, in place. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this returns the original byte string if it is not valid UTF-8. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::ffi::OsStr; + /// + /// use bstr::BString; + /// + /// let bs = BString::from("foo"); + /// let os_str = bs.into_os_string().expect("should be valid UTF-8"); + /// assert_eq!(os_str, OsStr::new("foo")); + /// ``` + #[inline] + pub fn into_os_string(self) -> Result { + self.into_os_string_imp() + } + + #[cfg(unix)] + #[inline] + fn into_os_string_imp(self) -> Result { + use std::os::unix::ffi::OsStringExt; + + Ok(OsString::from_vec(self.into_vec())) + } + + #[cfg(not(unix))] + #[inline] + fn into_os_string_imp(self) -> Result { + match self.into_string() { + Ok(s) => Ok(OsString::from(s)), + Err(err) => Err(err.into_bstring()), + } + } + + /// Lossily converts this byte string into an OS string, in place. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this will perform a UTF-8 check and lossily convert this byte string + /// into valid UTF-8 using the Unicode replacement codepoint. + /// + /// Note that this can prevent the correct roundtripping of file paths on + /// non-Unix systems such as Windows, where file paths are an arbitrary + /// sequence of 16-bit integers. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let bs = BString::from_slice(b"foo\xFFbar"); + /// let os_str = bs.into_os_string_lossy(); + /// assert_eq!(os_str.to_string_lossy(), "foo\u{FFFD}bar"); + /// ``` + #[inline] + pub fn into_os_string_lossy(self) -> OsString { + self.into_os_string_lossy_imp() + } + + #[cfg(unix)] + #[inline] + fn into_os_string_lossy_imp(self) -> OsString { + use std::os::unix::ffi::OsStringExt; + + OsString::from_vec(self.into_vec()) + } + + #[cfg(not(unix))] + #[inline] + fn into_os_string_lossy_imp(self) -> OsString { + OsString::from(self.into_string_lossy()) + } + + /// Converts this byte string into an owned file path, in place. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this returns the original byte string if it is not valid UTF-8. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let bs = BString::from("foo"); + /// let path = bs.into_path_buf().expect("should be valid UTF-8"); + /// assert_eq!(path.as_os_str(), "foo"); + /// ``` + #[inline] + pub fn into_path_buf(self) -> Result { + self.into_os_string().map(PathBuf::from) + } + + /// Lossily converts this byte string into an owned file path, in place. + /// + /// On Unix, this always succeeds and is zero cost. On non-Unix systems, + /// this will perform a UTF-8 check and lossily convert this byte string + /// into valid UTF-8 using the Unicode replacement codepoint. + /// + /// Note that this can prevent the correct roundtripping of file paths on + /// non-Unix systems such as Windows, where file paths are an arbitrary + /// sequence of 16-bit integers. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let bs = BString::from_slice(b"foo\xFFbar"); + /// let path = bs.into_path_buf_lossy(); + /// assert_eq!(path.to_string_lossy(), "foo\u{FFFD}bar"); + /// ``` + #[inline] + pub fn into_path_buf_lossy(self) -> PathBuf { + PathBuf::from(self.into_os_string_lossy()) + } + + /// Converts this `BString` into a `Box`. + /// + /// This will drop any excess capacity. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let s = BString::from("foobar"); + /// let b = s.into_boxed_bstr(); + /// assert_eq!(6, b.len()); + /// ``` + #[inline] + pub fn into_boxed_bstr(self) -> Box { + unsafe { + let slice = self.bytes.into_boxed_slice(); + Box::from_raw(Box::into_raw(slice) as *mut BStr) + } + } + + /// Returns this byte string's capacity, in bytes. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let s = BString::with_capacity(10); + /// assert_eq!(10, s.capacity()); + /// ``` + #[inline] + pub fn capacity(&self) -> usize { + self.bytes.capacity() + } + + /// Truncates this byte string, removing all contents. + /// + /// The resulting byte string will always have length `0`, but its capacity + /// remains unchanged. + #[inline] + pub fn clear(&mut self) { + self.bytes.clear(); + } + + /// Ensures that this `BString`'s capacity is at least `additional` + /// bytes larger than its length. + /// + /// The capacity may be increased by more than `additional` bytes if it + /// chooses, to prevent frequent reallocations. + /// + /// If you do not want this "at least" behavior, use the + /// [`reserve_exact`](#method.reserve_exact) method instead. + /// + /// # Panics + /// + /// Panics if the new capacity overflows `usize`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::new(); + /// s.reserve(10); + /// assert!(s.capacity() >= 10); + /// ``` + #[inline] + pub fn reserve(&mut self, additional: usize) { + self.bytes.reserve(additional); + } + + /// Ensures that this `BString`'s capacity is exactly `additional` + /// bytes larger than its length. + /// + /// Consider using the [`reserve`](#method.reserve) method unless you + /// absolutely know better than the allocator. + /// + /// # Panics + /// + /// Panics if the new capacity overflows `usize`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::new(); + /// s.reserve_exact(10); + /// assert!(s.capacity() >= 10); + /// ``` + #[inline] + pub fn reserve_exact(&mut self, additional: usize) { + self.bytes.reserve_exact(additional); + } + + /// Shrinks the capacity of this `BString` to match its length. + /// + /// Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foo"); + /// s.reserve(10); + /// assert!(s.capacity() >= 10); + /// s.shrink_to_fit(); + /// assert_eq!(3, s.capacity()); + /// ``` + #[inline] + pub fn shrink_to_fit(&mut self) { + self.bytes.shrink_to_fit(); + } + + /// Shortens this `BString` to the specified length, in bytes. + /// + /// If `new_len` is greater than or equal to this byte string's current + /// length, then this has no effect. + /// + /// Note that this does _not_ panic if the result is not on a valid + /// `char` boundary. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foobar"); + /// s.truncate(3); + /// assert_eq!("foo", s); + /// ``` + #[inline] + pub fn truncate(&mut self, new_len: usize) { + if new_len < self.len() { + self.bytes.truncate(new_len); + } + } + + /// Resizes this byte string in place so that the length of this byte + /// string is equivalent to `new_len`. + /// + /// If `new_len` is greater than the length of this byte string, then + /// the byte string is extended by the difference, which each additional + /// byte filled with the given value. If `new_len` is less than the length + /// of this byte string, then it is simply truncated. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("f"); + /// s.resize(3, b'o'); + /// assert_eq!(s, "foo"); + /// s.resize(1, b'o'); + /// assert_eq!(s, "f"); + /// ``` + #[inline] + pub fn resize(&mut self, new_len: usize, value: u8) { + self.bytes.resize(new_len, value); + } + + /// Removes the last codepoint from this `BString` and returns it. + /// + /// If this byte string is empty, then `None` is returned. If the last + /// bytes of this byte string do not correspond to a valid UTF-8 code unit + /// sequence, then the Unicode replacement codepoint is yielded instead in + /// accordance with the + /// [replacement codepoint substitution policy](index.html#handling-of-invalid-utf8-8). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foo"); + /// assert_eq!(s.pop_char(), Some('o')); + /// assert_eq!(s.pop_char(), Some('o')); + /// assert_eq!(s.pop_char(), Some('f')); + /// assert_eq!(s.pop_char(), None); + /// ``` + /// + /// This shows the replacement codepoint substitution policy. Note that + /// the first pop yields a replacement codepoint but actually removes two + /// bytes. This is in contrast with subsequent pops when encountering + /// `\xFF` since `\xFF` is never a valid prefix for any valid UTF-8 + /// code unit sequence. + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from_slice(b"f\xFF\xFF\xFFoo\xE2\x98"); + /// assert_eq!(s.pop_char(), Some('\u{FFFD}')); + /// assert_eq!(s.pop_char(), Some('o')); + /// assert_eq!(s.pop_char(), Some('o')); + /// assert_eq!(s.pop_char(), Some('\u{FFFD}')); + /// assert_eq!(s.pop_char(), Some('\u{FFFD}')); + /// assert_eq!(s.pop_char(), Some('\u{FFFD}')); + /// assert_eq!(s.pop_char(), Some('f')); + /// assert_eq!(s.pop_char(), None); + /// ``` + #[inline] + pub fn pop_char(&mut self) -> Option { + let (ch, size) = utf8::decode_last_lossy(self.as_bytes()); + if size == 0 { + return None; + } + let new_len = self.len() - size; + self.truncate(new_len); + Some(ch) + } + + /// Removes the last byte from this `BString` and returns it. + /// + /// If this byte string is empty, then `None` is returned. + /// + /// Note that if the last codepoint in this byte string is not ASCII, then + /// removing the last byte could make this byte string contain invalid + /// UTF-8. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foo"); + /// assert_eq!(s.pop_byte(), Some(b'o')); + /// assert_eq!(s.pop_byte(), Some(b'o')); + /// assert_eq!(s.pop_byte(), Some(b'f')); + /// assert_eq!(s.pop_byte(), None); + /// ``` + #[inline] + pub fn pop_byte(&mut self) -> Option { + self.bytes.pop() + } + + /// **DEPRECATED**: Use + /// [`pop_char`](struct.BString.html#method.pop_char) + /// or + /// [`pop_byte`](struct.BString.html#method.pop_byte) + /// instead. + /// + /// Removes the last codepoint from this `BString` and returns it. + /// + /// If this byte string is empty, then `None` is returned. If the last + /// bytes of this byte string do not correspond to a valid UTF-8 code unit + /// sequence, then the Unicode replacement codepoint is yielded instead in + /// accordance with the + /// [replacement codepoint substitution policy](index.html#handling-of-invalid-utf8-8). + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foo"); + /// assert_eq!(s.pop(), Some('o')); + /// assert_eq!(s.pop(), Some('o')); + /// assert_eq!(s.pop(), Some('f')); + /// assert_eq!(s.pop(), None); + /// ``` + /// + /// This shows the replacement codepoint substitution policy. Note that + /// the first pop yields a replacement codepoint but actually removes two + /// bytes. This is in contrast with subsequent pops when encountering + /// `\xFF` since `\xFF` is never a valid prefix for any valid UTF-8 + /// code unit sequence. + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from_slice(b"f\xFF\xFF\xFFoo\xE2\x98"); + /// assert_eq!(s.pop(), Some('\u{FFFD}')); + /// assert_eq!(s.pop(), Some('o')); + /// assert_eq!(s.pop(), Some('o')); + /// assert_eq!(s.pop(), Some('\u{FFFD}')); + /// assert_eq!(s.pop(), Some('\u{FFFD}')); + /// assert_eq!(s.pop(), Some('\u{FFFD}')); + /// assert_eq!(s.pop(), Some('f')); + /// assert_eq!(s.pop(), None); + /// ``` + #[deprecated(since = "0.1.1", note = "use pop_char or pop_byte instead")] + #[inline] + pub fn pop(&mut self) -> Option { + self.pop_char() + } + + /// Removes a `char` from this `BString` at the given byte position and + /// returns it. + /// + /// If the bytes at the given position do not lead to a valid UTF-8 code + /// unit sequence, then a + /// [replacement codepoint is returned instead](index.html#handling-of-invalid-utf8-8). + /// + /// # Panics + /// + /// Panics if `at` is larger than or equal to this byte string's length. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foo☃bar"); + /// assert_eq!('☃', s.remove(3)); + /// assert_eq!("foobar", s); + /// ``` + /// + /// This example shows how the Unicode replacement codepoint policy is + /// used: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from_slice(b"foo\xFFbar"); + /// assert_eq!('\u{FFFD}', s.remove(3)); + /// assert_eq!("foobar", s); + /// ``` + #[inline] + pub fn remove(&mut self, at: usize) -> char { + let (ch, size) = utf8::decode_lossy(self[at..].as_bytes()); + assert!(size > 0, "expected {} to be less than {}", at, self.len()); + self.bytes.drain(at..at + size); + ch + } + + /// Inserts the given codepoint into this `BString` at a particular byte + /// position. + /// + /// This is an `O(n)` operation as it may copy a number of elements in this + /// byte string proportional to its length. + /// + /// # Panics + /// + /// Panics if `at` is larger than the byte string's length. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foobar"); + /// s.insert_char(3, '☃'); + /// assert_eq!("foo☃bar", s); + /// ``` + #[inline] + pub fn insert_char(&mut self, at: usize, ch: char) { + self.insert(at, ch.encode_utf8(&mut [0; 4]).as_bytes()); + } + + /// Inserts the given byte string into this byte string at a particular + /// byte position. + /// + /// This is an `O(n)` operation as it may copy a number of elements in this + /// byte string proportional to its length. + /// + /// Note that the type parameter `B` on this method means that it can + /// accept anything that can be cheaply converted to a `&[u8]`. This + /// includes, but is not limited to, `&str`, `&BStr` and `&[u8]` itself. + /// + /// # Panics + /// + /// Panics if `at` is larger than the byte string's length. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foobar"); + /// s.insert(3, "☃☃☃"); + /// assert_eq!("foo☃☃☃bar", s); + /// ``` + #[inline] + pub fn insert>(&mut self, at: usize, bytes: B) { + assert!(at <= self.len(), "expected {} to be <= {}", at, self.len()); + + let bytes = bytes.as_ref(); + let len = self.len(); + + // SAFETY: We'd like to efficiently splice in the given bytes into + // this byte string. Since we are only working with `u8` elements here, + // we only need to consider whether our bounds are correct and whether + // our byte string has enough space. + self.reserve(bytes.len()); + unsafe { + // Shift bytes after `at` over by the length of `bytes` to make + // room for it. This requires referencing two regions of memory + // that may overlap, so we use ptr::copy. + ptr::copy( + self.bytes.as_ptr().add(at), + self.bytes.as_mut_ptr().add(at + bytes.len()), + len - at, + ); + // Now copy the bytes given into the room we made above. In this + // case, we know that the given bytes cannot possibly overlap + // with this byte string since we have a mutable borrow of the + // latter. Thus, we can use a nonoverlapping copy. + ptr::copy_nonoverlapping( + bytes.as_ptr(), + self.bytes.as_mut_ptr().add(at), + bytes.len(), + ); + self.bytes.set_len(len + bytes.len()); + } + } + + /// Splits this `BString` into two separate byte strings at the given + /// index. + /// + /// This returns a newly allocated `BString`, while `self` retans bytes + /// `[0, at)` and the returned `BString` contains bytes `[at, len)`. + /// + /// The capacity of `self` does not change. + /// + /// # Panics + /// + /// Panics if `at` is beyond the end of this byte string. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foobar"); + /// let bar = s.split_off(3); + /// assert_eq!(s, "foo"); + /// assert_eq!(bar, "bar"); + /// ``` + #[inline] + pub fn split_off(&mut self, at: usize) -> BString { + BString::from(self.bytes.split_off(at)) + } + + /// Removes the specified range in this byte string and replaces it with + /// the given bytes. The given bytes do not need to have the same length + /// as the range provided. + /// + /// # Panics + /// + /// Panics if the given range is invalid. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foobar"); + /// s.replace_range(2..4, "xxxxx"); + /// assert_eq!(s, "foxxxxxar"); + /// ``` + #[inline] + pub fn replace_range( + &mut self, + range: R, + replace_with: B, + ) where R: ops::RangeBounds, + B: AsRef<[u8]> + { + self.bytes.splice(range, replace_with.as_ref().iter().cloned()); + } + + /// Creates a draining iterator that removes the specified range in this + /// `BString` and yields each of the removed bytes. + /// + /// Note that the elements specified by the given range are removed + /// regardless of whether the returned iterator is fully exhausted. + /// + /// Also note that is is unspecified how many bytes are removed from the + /// `BString` if the `DrainBytes` iterator is leaked. + /// + /// # Panics + /// + /// Panics if the given range is not valid. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::BString; + /// + /// let mut s = BString::from("foobar"); + /// { + /// let mut drainer = s.drain_bytes(2..4); + /// assert_eq!(drainer.next(), Some(b'o')); + /// assert_eq!(drainer.next(), Some(b'b')); + /// assert_eq!(drainer.next(), None); + /// } + /// assert_eq!(s, "foar"); + /// ``` + #[inline] + pub fn drain_bytes( + &mut self, + range: R, + ) -> DrainBytes + where R: ops::RangeBounds + { + DrainBytes { it: self.bytes.drain(range) } + } +} + +/// A draining byte oriented iterator for `BString`. +/// +/// This iterator is created by +/// [`BString::drain`](struct.BString.html#method.drain). +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// use bstr::BString; +/// +/// let mut s = BString::from("foobar"); +/// { +/// let mut drainer = s.drain_bytes(2..4); +/// assert_eq!(drainer.next(), Some(b'o')); +/// assert_eq!(drainer.next(), Some(b'b')); +/// assert_eq!(drainer.next(), None); +/// } +/// assert_eq!(s, "foar"); +/// ``` +#[derive(Debug)] +pub struct DrainBytes<'a> { + it: vec::Drain<'a, u8>, +} + +impl<'a> iter::FusedIterator for DrainBytes<'a> {} + +impl<'a> Iterator for DrainBytes<'a> { + type Item = u8; + + #[inline] + fn next(&mut self) -> Option { + self.it.next() + } +} + +impl<'a> DoubleEndedIterator for DrainBytes<'a> { + #[inline] + fn next_back(&mut self) -> Option { + self.it.next_back() + } +} + +impl<'a> ExactSizeIterator for DrainBytes<'a> { + #[inline] + fn len(&self) -> usize { + self.it.len() + } +} + +/// An error that may occur when converting a `BString` to a `String`. +/// +/// This error includes the original `BString` that failed to convert to a +/// `String`. This permits callers to recover the allocation used even if it +/// it not valid UTF-8. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// use bstr::{B, BString}; +/// +/// let bytes = BString::from_slice(b"foo\xFFbar"); +/// let err = bytes.into_string().unwrap_err(); +/// +/// assert_eq!(err.utf8_error().valid_up_to(), 3); +/// assert_eq!(err.utf8_error().error_len(), Some(1)); +/// +/// // At no point in this example is an allocation performed. +/// let bytes = BString::from(err.into_bstring()); +/// assert_eq!(bytes, B(b"foo\xFFbar")); +/// ``` +#[derive(Debug, Eq, PartialEq)] +pub struct FromUtf8Error { + original: BString, + err: Utf8Error, +} + +impl FromUtf8Error { + /// Return the original bytes as a slice that failed to convert to a + /// `String`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let bytes = BString::from_slice(b"foo\xFFbar"); + /// let err = bytes.into_string().unwrap_err(); + /// + /// // At no point in this example is an allocation performed. + /// assert_eq!(err.as_bstr(), B(b"foo\xFFbar")); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &BStr { + &self.original + } + + /// Consume this error and return the original byte string that failed to + /// convert to a `String`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let bytes = BString::from_slice(b"foo\xFFbar"); + /// let err = bytes.into_string().unwrap_err(); + /// let original = err.into_bstring(); + /// + /// // At no point in this example is an allocation performed. + /// assert_eq!(original, B(b"foo\xFFbar")); + /// ``` + #[inline] + pub fn into_bstring(self) -> BString { + self.original + } + + /// Return the underlying UTF-8 error that occurred. This error provides + /// information on the nature and location of the invalid UTF-8 detected. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use bstr::{B, BString}; + /// + /// let bytes = BString::from_slice(b"foo\xFFbar"); + /// let err = bytes.into_string().unwrap_err(); + /// + /// assert_eq!(err.utf8_error().valid_up_to(), 3); + /// assert_eq!(err.utf8_error().error_len(), Some(1)); + /// ``` + #[inline] + pub fn utf8_error(&self) -> &Utf8Error { + &self.err + } +} + +impl error::Error for FromUtf8Error { + #[inline] + fn description(&self) -> &str { "invalid UTF-8 vector" } +} + +impl fmt::Display for FromUtf8Error { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.err) + } +} + +#[cfg(test)] +mod tests { + use bstr::B; + use super::*; + + #[test] + fn insert() { + let mut s = BString::new(); + s.insert(0, "foo"); + assert_eq!("foo", s); + + let mut s = BString::from("a"); + s.insert(0, "foo"); + assert_eq!("fooa", s); + + let mut s = BString::from("a"); + s.insert(1, "foo"); + assert_eq!("afoo", s); + + let mut s = BString::from("foobar"); + s.insert(3, "quux"); + assert_eq!("fooquuxbar", s); + + let mut s = BString::from("foobar"); + s.insert(3, "x"); + assert_eq!("fooxbar", s); + + let mut s = BString::from("foobar"); + s.insert(0, "x"); + assert_eq!("xfoobar", s); + + let mut s = BString::from("foobar"); + s.insert(6, "x"); + assert_eq!("foobarx", s); + + let mut s = BString::from("foobar"); + s.insert(3, "quuxbazquux"); + assert_eq!("fooquuxbazquuxbar", s); + } + + #[test] + #[should_panic] + fn insert_fail1() { + let mut s = BString::new(); + s.insert(1, "foo"); + } + + #[test] + #[should_panic] + fn insert_fail2() { + let mut s = BString::from("a"); + s.insert(2, "foo"); + } + + #[test] + #[should_panic] + fn insert_fail3() { + let mut s = BString::from("foobar"); + s.insert(7, "foo"); + } + + #[test] + fn collect() { + let s: BString = vec!['a', 'b', 'c'].into_iter().collect(); + assert_eq!(s, "abc"); + + let s: BString = vec!["a", "b", "c"].into_iter().collect(); + assert_eq!(s, "abc"); + + let s: BString = vec![B("a"), B("b"), B("c")].into_iter().collect(); + assert_eq!(s, "abc"); + } +} diff --git a/vendor/bstr/src/cow.rs b/vendor/bstr/src/cow.rs new file mode 100644 index 0000000000..9e6efa9b00 --- /dev/null +++ b/vendor/bstr/src/cow.rs @@ -0,0 +1,89 @@ +#[cfg(feature = "std")] +use std::borrow::Cow; +use core::ops; + +use bstr::BStr; +#[cfg(feature = "std")] +use bstring::BString; + +/// A specialized copy-on-write BStr. +/// +/// The purpose of this type is to permit usage of a "borrowed or owned byte +/// string" in a way that keeps std/no-std compatibility. That is, in no-std +/// mode, this type devolves into a simple &BStr with no owned variant +/// availble. +#[derive(Clone, Debug)] +pub struct CowBStr<'a>(Imp<'a>); + +#[cfg(feature = "std")] +#[derive(Clone, Debug)] +struct Imp<'a>(Cow<'a, BStr>); + +#[cfg(not(feature = "std"))] +#[derive(Clone, Debug)] +struct Imp<'a>(&'a BStr); + +impl<'a> ops::Deref for CowBStr<'a> { + type Target = BStr; + + fn deref(&self) -> &BStr { + self.as_bstr() + } +} + +impl<'a> CowBStr<'a> { + /// Create a new borrowed CowBStr. + pub fn new>(bytes: &'a B) -> CowBStr<'a> { + CowBStr(Imp::new(BStr::new(bytes))) + } + + /// Create a new owned CowBStr. + #[cfg(feature = "std")] + pub fn new_owned(bytes: BString) -> CowBStr<'static> { + CowBStr(Imp(Cow::Owned(bytes))) + } + + /// Return a borrowed byte string, regardless of whether this is an owned + /// or borrowed byte string internally. + pub fn as_bstr(&self) -> &BStr { + self.0.as_bstr() + } + + /// Return an owned version of this copy-on-write byte string. + /// + /// If this is already an owned byte string internally, then this is a + /// no-op. Otherwise, the internal byte string is copied. + #[cfg(feature = "std")] + pub fn into_owned(self) -> CowBStr<'static> { + match (self.0).0 { + Cow::Borrowed(b) => CowBStr::new_owned(b.to_bstring()), + Cow::Owned(b) => CowBStr::new_owned(b), + } + } +} + +impl<'a> Imp<'a> { + #[cfg(feature = "std")] + pub fn new(bytes: &'a BStr) -> Imp<'a> { + Imp(Cow::Borrowed(bytes)) + } + + #[cfg(not(feature = "std"))] + pub fn new(bytes: &'a BStr) -> Imp<'a> { + Imp(bytes) + } + + #[cfg(feature = "std")] + pub fn as_bstr(&self) -> &BStr { + // &*self.0 + match self.0 { + Cow::Owned(ref x) => x, + Cow::Borrowed(x) => x, + } + } + + #[cfg(not(feature = "std"))] + pub fn as_bstr(&self) -> &BStr { + self.0 + } +} diff --git a/vendor/bstr/src/freqs.rs b/vendor/bstr/src/freqs.rs new file mode 100644 index 0000000000..bad6aaf21b --- /dev/null +++ b/vendor/bstr/src/freqs.rs @@ -0,0 +1,258 @@ +pub const BYTE_FREQUENCIES: [u8; 256] = [ + 55, // '\x00' + 52, // '\x01' + 51, // '\x02' + 50, // '\x03' + 49, // '\x04' + 48, // '\x05' + 47, // '\x06' + 46, // '\x07' + 45, // '\x08' + 103, // '\t' + 242, // '\n' + 66, // '\x0b' + 67, // '\x0c' + 229, // '\r' + 44, // '\x0e' + 43, // '\x0f' + 42, // '\x10' + 41, // '\x11' + 40, // '\x12' + 39, // '\x13' + 38, // '\x14' + 37, // '\x15' + 36, // '\x16' + 35, // '\x17' + 34, // '\x18' + 33, // '\x19' + 56, // '\x1a' + 32, // '\x1b' + 31, // '\x1c' + 30, // '\x1d' + 29, // '\x1e' + 28, // '\x1f' + 255, // ' ' + 148, // '!' + 164, // '"' + 149, // '#' + 136, // '$' + 160, // '%' + 155, // '&' + 173, // "'" + 221, // '(' + 222, // ')' + 134, // '*' + 122, // '+' + 232, // ',' + 202, // '-' + 215, // '.' + 224, // '/' + 208, // '0' + 220, // '1' + 204, // '2' + 187, // '3' + 183, // '4' + 179, // '5' + 177, // '6' + 168, // '7' + 178, // '8' + 200, // '9' + 226, // ':' + 195, // ';' + 154, // '<' + 184, // '=' + 174, // '>' + 126, // '?' + 120, // '@' + 191, // 'A' + 157, // 'B' + 194, // 'C' + 170, // 'D' + 189, // 'E' + 162, // 'F' + 161, // 'G' + 150, // 'H' + 193, // 'I' + 142, // 'J' + 137, // 'K' + 171, // 'L' + 176, // 'M' + 185, // 'N' + 167, // 'O' + 186, // 'P' + 112, // 'Q' + 175, // 'R' + 192, // 'S' + 188, // 'T' + 156, // 'U' + 140, // 'V' + 143, // 'W' + 123, // 'X' + 133, // 'Y' + 128, // 'Z' + 147, // '[' + 138, // '\\' + 146, // ']' + 114, // '^' + 223, // '_' + 151, // '`' + 249, // 'a' + 216, // 'b' + 238, // 'c' + 236, // 'd' + 253, // 'e' + 227, // 'f' + 218, // 'g' + 230, // 'h' + 247, // 'i' + 135, // 'j' + 180, // 'k' + 241, // 'l' + 233, // 'm' + 246, // 'n' + 244, // 'o' + 231, // 'p' + 139, // 'q' + 245, // 'r' + 243, // 's' + 251, // 't' + 235, // 'u' + 201, // 'v' + 196, // 'w' + 240, // 'x' + 214, // 'y' + 152, // 'z' + 182, // '{' + 205, // '|' + 181, // '}' + 127, // '~' + 27, // '\x7f' + 212, // '\x80' + 211, // '\x81' + 210, // '\x82' + 213, // '\x83' + 228, // '\x84' + 197, // '\x85' + 169, // '\x86' + 159, // '\x87' + 131, // '\x88' + 172, // '\x89' + 105, // '\x8a' + 80, // '\x8b' + 98, // '\x8c' + 96, // '\x8d' + 97, // '\x8e' + 81, // '\x8f' + 207, // '\x90' + 145, // '\x91' + 116, // '\x92' + 115, // '\x93' + 144, // '\x94' + 130, // '\x95' + 153, // '\x96' + 121, // '\x97' + 107, // '\x98' + 132, // '\x99' + 109, // '\x9a' + 110, // '\x9b' + 124, // '\x9c' + 111, // '\x9d' + 82, // '\x9e' + 108, // '\x9f' + 118, // '\xa0' + 141, // '¡' + 113, // '¢' + 129, // '£' + 119, // '¤' + 125, // '¥' + 165, // '¦' + 117, // '§' + 92, // '¨' + 106, // '©' + 83, // 'ª' + 72, // '«' + 99, // '¬' + 93, // '\xad' + 65, // '®' + 79, // '¯' + 166, // '°' + 237, // '±' + 163, // '²' + 199, // '³' + 190, // '´' + 225, // 'µ' + 209, // '¶' + 203, // '·' + 198, // '¸' + 217, // '¹' + 219, // 'º' + 206, // '»' + 234, // '¼' + 248, // '½' + 158, // '¾' + 239, // '¿' + 255, // 'À' + 255, // 'Á' + 255, // 'Â' + 255, // 'Ã' + 255, // 'Ä' + 255, // 'Å' + 255, // 'Æ' + 255, // 'Ç' + 255, // 'È' + 255, // 'É' + 255, // 'Ê' + 255, // 'Ë' + 255, // 'Ì' + 255, // 'Í' + 255, // 'Î' + 255, // 'Ï' + 255, // 'Ð' + 255, // 'Ñ' + 255, // 'Ò' + 255, // 'Ó' + 255, // 'Ô' + 255, // 'Õ' + 255, // 'Ö' + 255, // '×' + 255, // 'Ø' + 255, // 'Ù' + 255, // 'Ú' + 255, // 'Û' + 255, // 'Ü' + 255, // 'Ý' + 255, // 'Þ' + 255, // 'ß' + 255, // 'à' + 255, // 'á' + 255, // 'â' + 255, // 'ã' + 255, // 'ä' + 255, // 'å' + 255, // 'æ' + 255, // 'ç' + 255, // 'è' + 255, // 'é' + 255, // 'ê' + 255, // 'ë' + 255, // 'ì' + 255, // 'í' + 255, // 'î' + 255, // 'ï' + 255, // 'ð' + 255, // 'ñ' + 255, // 'ò' + 255, // 'ó' + 255, // 'ô' + 255, // 'õ' + 255, // 'ö' + 255, // '÷' + 255, // 'ø' + 255, // 'ù' + 255, // 'ú' + 255, // 'û' + 255, // 'ü' + 255, // 'ý' + 255, // 'þ' + 255, // 'ÿ' +]; diff --git a/vendor/bstr/src/impls.rs b/vendor/bstr/src/impls.rs new file mode 100644 index 0000000000..1129f181f0 --- /dev/null +++ b/vendor/bstr/src/impls.rs @@ -0,0 +1,715 @@ +macro_rules! impl_partial_eq { + ($lhs:ty, $rhs:ty) => { + impl<'a, 'b> PartialEq<$rhs> for $lhs { + #[inline] + fn eq(&self, other: &$rhs) -> bool { + let other: &[u8] = other.as_ref(); + PartialEq::eq(self.as_bytes(), other) + } + } + + impl<'a, 'b> PartialEq<$lhs> for $rhs { + #[inline] + fn eq(&self, other: &$lhs) -> bool { + let this: &[u8] = self.as_ref(); + PartialEq::eq(this, other.as_bytes()) + } + } + } +} + +macro_rules! impl_partial_eq_cow { + ($lhs:ty, $rhs:ty) => { + impl<'a, 'b> PartialEq<$rhs> for $lhs { + #[inline] + fn eq(&self, other: &$rhs) -> bool { + let other: &[u8] = (&**other).as_ref(); + PartialEq::eq(self.as_bytes(), other) + } + } + + impl<'a, 'b> PartialEq<$lhs> for $rhs { + #[inline] + fn eq(&self, other: &$lhs) -> bool { + let this: &[u8] = (&**other).as_ref(); + PartialEq::eq(this, other.as_bytes()) + } + } + } +} + +macro_rules! impl_partial_ord { + ($lhs:ty, $rhs:ty) => { + impl<'a, 'b> PartialOrd<$rhs> for $lhs { + #[inline] + fn partial_cmp(&self, other: &$rhs) -> Option { + let other: &[u8] = other.as_ref(); + PartialOrd::partial_cmp(self.as_bytes(), other) + } + } + + impl<'a, 'b> PartialOrd<$lhs> for $rhs { + #[inline] + fn partial_cmp(&self, other: &$lhs) -> Option { + let this: &[u8] = self.as_ref(); + PartialOrd::partial_cmp(this, other.as_bytes()) + } + } + } +} + +#[cfg(feature = "std")] +mod bstring { + use std::borrow::{Borrow, ToOwned}; + use std::cmp::Ordering; + use std::fmt; + use std::iter::FromIterator; + use std::ops; + + use bstr::BStr; + use bstring::BString; + + impl fmt::Display for BString { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::Display::fmt(self.as_bstr(), f) + } + } + + impl fmt::Debug for BString { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::Debug::fmt(self.as_bstr(), f) + } + } + + impl ops::Deref for BString { + type Target = BStr; + + #[inline] + fn deref(&self) -> &BStr { + self.as_bstr() + } + } + + impl ops::DerefMut for BString { + #[inline] + fn deref_mut(&mut self) -> &mut BStr { + self.as_mut_bstr() + } + } + + impl AsRef<[u8]> for BString { + #[inline] + fn as_ref(&self) -> &[u8] { + self.as_bytes() + } + } + + impl AsRef for BString { + #[inline] + fn as_ref(&self) -> &BStr { + self.as_bstr() + } + } + + impl AsMut<[u8]> for BString { + #[inline] + fn as_mut(&mut self) -> &mut [u8] { + self.as_bytes_mut() + } + } + + impl AsMut for BString { + #[inline] + fn as_mut(&mut self) -> &mut BStr { + self.as_mut_bstr() + } + } + + impl Borrow for BString { + #[inline] + fn borrow(&self) -> &BStr { + self.as_bstr() + } + } + + impl ToOwned for BStr { + type Owned = BString; + + #[inline] + fn to_owned(&self) -> BString { + self.to_bstring() + } + } + + impl<'a> From<&'a [u8]> for BString { + #[inline] + fn from(s: &'a [u8]) -> BString { + BString::from_vec(s.to_vec()) + } + } + + impl From> for BString { + #[inline] + fn from(s: Vec) -> BString { + BString::from_vec(s) + } + } + + impl From for Vec { + #[inline] + fn from(s: BString) -> Vec { + s.into_vec() + } + } + + impl<'a> From<&'a str> for BString { + #[inline] + fn from(s: &'a str) -> BString { + BString::from_vec(s.as_bytes().to_vec()) + } + } + + impl From for BString { + #[inline] + fn from(s: String) -> BString { + BString::from_vec(s.into_bytes()) + } + } + + impl<'a> From<&'a BStr> for BString { + #[inline] + fn from(s: &'a BStr) -> BString { + s.to_bstring() + } + } + + impl FromIterator for BString { + #[inline] + fn from_iter>(iter: T) -> BString { + BString::from(iter.into_iter().collect::()) + } + } + + impl FromIterator for BString { + #[inline] + fn from_iter>(iter: T) -> BString { + BString::from(iter.into_iter().collect::>()) + } + } + + impl<'a> FromIterator<&'a str> for BString { + #[inline] + fn from_iter>(iter: T) -> BString { + let mut buf = BString::new(); + for b in iter { + buf.push(b); + } + buf + } + } + + impl<'a> FromIterator<&'a [u8]> for BString { + #[inline] + fn from_iter>(iter: T) -> BString { + let mut buf = BString::new(); + for b in iter { + buf.push(b); + } + buf + } + } + + impl<'a> FromIterator<&'a BStr> for BString { + #[inline] + fn from_iter>(iter: T) -> BString { + let mut buf = BString::new(); + for b in iter { + buf.push(b); + } + buf + } + } + + impl FromIterator for BString { + #[inline] + fn from_iter>(iter: T) -> BString { + let mut buf = BString::new(); + for b in iter { + buf.push(b); + } + buf + } + } + + impl Eq for BString {} + + impl PartialEq for BString { + #[inline] + fn eq(&self, other: &BString) -> bool { + &self[..] == &other[..] + } + } + + impl_partial_eq!(BString, Vec); + impl_partial_eq!(BString, [u8]); + impl_partial_eq!(BString, &'a [u8]); + impl_partial_eq!(BString, String); + impl_partial_eq!(BString, str); + impl_partial_eq!(BString, &'a str); + impl_partial_eq!(BString, BStr); + impl_partial_eq!(BString, &'a BStr); + + impl PartialOrd for BString { + #[inline] + fn partial_cmp(&self, other: &BString) -> Option { + PartialOrd::partial_cmp(self.as_bytes(), other.as_bytes()) + } + } + + impl Ord for BString { + #[inline] + fn cmp(&self, other: &BString) -> Ordering { + self.partial_cmp(other).unwrap() + } + } + + impl_partial_ord!(BString, Vec); + impl_partial_ord!(BString, [u8]); + impl_partial_ord!(BString, &'a [u8]); + impl_partial_ord!(BString, String); + impl_partial_ord!(BString, str); + impl_partial_ord!(BString, &'a str); + impl_partial_ord!(BString, BStr); + impl_partial_ord!(BString, &'a BStr); +} + +mod bstr { + #[cfg(feature = "std")] + use std::borrow::Cow; + + use core::cmp::Ordering; + use core::fmt; + use core::ops; + + use bstr::BStr; + + impl fmt::Display for BStr { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + if let Ok(allutf8) = self.to_str() { + return fmt::Display::fmt(allutf8, f); + } + for ch in self.chars() { + write!(f, "{}", ch)?; + } + Ok(()) + } + } + + impl fmt::Debug for BStr { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "\"")?; + for (s, e, ch) in self.char_indices() { + if ch == '\u{FFFD}' { + for &b in self[s..e].as_bytes() { + write!(f, r"\x{:X}", b)?; + } + } else { + write!(f, "{}", ch.escape_debug())?; + } + } + write!(f, "\"")?; + Ok(()) + } + } + + impl ops::Index for BStr { + type Output = u8; + + #[inline] + fn index(&self, idx: usize) -> &u8 { + &self.as_bytes()[idx] + } + } + + impl ops::Index for BStr { + type Output = BStr; + + #[inline] + fn index(&self, _: ops::RangeFull) -> &BStr { + self + } + } + + impl ops::Index> for BStr { + type Output = BStr; + + #[inline] + fn index(&self, r: ops::Range) -> &BStr { + BStr::new(&self.as_bytes()[r.start..r.end]) + } + } + + impl ops::Index> for BStr { + type Output = BStr; + + #[inline] + fn index(&self, r: ops::RangeInclusive) -> &BStr { + BStr::new(&self.as_bytes()[*r.start()..=*r.end()]) + } + } + + impl ops::Index> for BStr { + type Output = BStr; + + #[inline] + fn index(&self, r: ops::RangeFrom) -> &BStr { + BStr::new(&self.as_bytes()[r.start..]) + } + } + + impl ops::Index> for BStr { + type Output = BStr; + + #[inline] + fn index(&self, r: ops::RangeTo) -> &BStr { + BStr::new(&self.as_bytes()[..r.end]) + } + } + + impl ops::Index> for BStr { + type Output = BStr; + + #[inline] + fn index(&self, r: ops::RangeToInclusive) -> &BStr { + BStr::new(&self.as_bytes()[..=r.end]) + } + } + + impl ops::IndexMut for BStr { + #[inline] + fn index_mut(&mut self, idx: usize) -> &mut u8 { + &mut self.as_bytes_mut()[idx] + } + } + + impl ops::IndexMut for BStr { + #[inline] + fn index_mut(&mut self, _: ops::RangeFull) -> &mut BStr { + self + } + } + + impl ops::IndexMut> for BStr { + #[inline] + fn index_mut(&mut self, r: ops::Range) -> &mut BStr { + BStr::from_bytes_mut(&mut self.as_bytes_mut()[r.start..r.end]) + } + } + + impl ops::IndexMut> for BStr { + #[inline] + fn index_mut(&mut self, r: ops::RangeInclusive) -> &mut BStr { + BStr::from_bytes_mut(&mut self.as_bytes_mut()[*r.start()..=*r.end()]) + } + } + + impl ops::IndexMut> for BStr { + #[inline] + fn index_mut(&mut self, r: ops::RangeFrom) -> &mut BStr { + BStr::from_bytes_mut(&mut self.as_bytes_mut()[r.start..]) + } + } + + impl ops::IndexMut> for BStr { + #[inline] + fn index_mut(&mut self, r: ops::RangeTo) -> &mut BStr { + BStr::from_bytes_mut(&mut self.as_bytes_mut()[..r.end]) + } + } + + impl ops::IndexMut> for BStr { + #[inline] + fn index_mut(&mut self, r: ops::RangeToInclusive) -> &mut BStr { + BStr::from_bytes_mut(&mut self.as_bytes_mut()[..=r.end]) + } + } + + impl AsRef<[u8]> for BStr { + #[inline] + fn as_ref(&self) -> &[u8] { + self.as_bytes() + } + } + + impl AsRef for [u8] { + #[inline] + fn as_ref(&self) -> &BStr { + BStr::new(self) + } + } + + impl AsRef for str { + #[inline] + fn as_ref(&self) -> &BStr { + BStr::new(self) + } + } + + impl AsMut<[u8]> for BStr { + #[inline] + fn as_mut(&mut self) -> &mut [u8] { + self.as_bytes_mut() + } + } + + impl AsMut for [u8] { + #[inline] + fn as_mut(&mut self) -> &mut BStr { + BStr::new_mut(self) + } + } + + impl<'a> From<&'a [u8]> for &'a BStr { + #[inline] + fn from(s: &'a [u8]) -> &'a BStr { + BStr::from_bytes(s) + } + } + + impl<'a> From<&'a str> for &'a BStr { + #[inline] + fn from(s: &'a str) -> &'a BStr { + BStr::from_bytes(s.as_bytes()) + } + } + + impl Eq for BStr {} + + impl PartialEq for BStr { + #[inline] + fn eq(&self, other: &BStr) -> bool { + self.as_bytes() == other.as_bytes() + } + } + + impl_partial_eq!(BStr, [u8]); + impl_partial_eq!(BStr, &'a [u8]); + impl_partial_eq!(BStr, str); + impl_partial_eq!(BStr, &'a str); + + #[cfg(feature = "std")] + impl_partial_eq!(BStr, Vec); + #[cfg(feature = "std")] + impl_partial_eq!(&'a BStr, Vec); + #[cfg(feature = "std")] + impl_partial_eq!(BStr, String); + #[cfg(feature = "std")] + impl_partial_eq!(&'a BStr, String); + #[cfg(feature = "std")] + impl_partial_eq_cow!(&'a BStr, Cow<'a, BStr>); + #[cfg(feature = "std")] + impl_partial_eq_cow!(&'a BStr, Cow<'a, str>); + #[cfg(feature = "std")] + impl_partial_eq_cow!(&'a BStr, Cow<'a, [u8]>); + + impl PartialOrd for BStr { + #[inline] + fn partial_cmp(&self, other: &BStr) -> Option { + PartialOrd::partial_cmp(self.as_bytes(), other.as_bytes()) + } + } + + impl Ord for BStr { + #[inline] + fn cmp(&self, other: &BStr) -> Ordering { + self.partial_cmp(other).unwrap() + } + } + + impl_partial_ord!(BStr, [u8]); + impl_partial_ord!(BStr, &'a [u8]); + impl_partial_ord!(BStr, str); + impl_partial_ord!(BStr, &'a str); + + #[cfg(feature = "std")] + impl_partial_ord!(BStr, Vec); + #[cfg(feature = "std")] + impl_partial_ord!(&'a BStr, Vec); + #[cfg(feature = "std")] + impl_partial_ord!(BStr, String); + #[cfg(feature = "std")] + impl_partial_ord!(&'a BStr, String); +} + +#[cfg(feature = "serde1-nostd")] +mod bstr_serde { + use std::fmt; + + use serde::{ + Serialize, Serializer, + Deserialize, Deserializer, de::Error, de::Visitor, + }; + + use bstr::BStr; + + impl Serialize for BStr { + #[inline] + fn serialize( + &self, + serializer: S, + ) -> Result + where S: Serializer + { + serializer.serialize_bytes(self.as_bytes()) + } + } + + impl<'a, 'de: 'a> Deserialize<'de> for &'a BStr { + #[inline] + fn deserialize( + deserializer: D, + ) -> Result<&'a BStr, D::Error> + where D: Deserializer<'de> + { + struct BStrVisitor; + + impl<'de> Visitor<'de> for BStrVisitor { + type Value = &'de BStr; + + fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.write_str("a borrowed byte string") + } + + #[inline] + fn visit_borrowed_bytes( + self, + value: &'de [u8], + ) -> Result<&'de BStr, E> { + Ok(BStr::new(value)) + } + + #[inline] + fn visit_borrowed_str( + self, + value: &'de str, + ) -> Result<&'de BStr, E> { + Ok(BStr::new(value)) + } + } + + deserializer.deserialize_bytes(BStrVisitor) + } + } +} + +#[cfg(feature = "serde1")] +mod bstring_serde { + use std::cmp; + use std::fmt; + + use serde::{ + Serialize, Serializer, + Deserialize, Deserializer, de::Error, de::SeqAccess, de::Visitor, + }; + + use bstring::BString; + + impl Serialize for BString { + #[inline] + fn serialize( + &self, + serializer: S, + ) -> Result + where S: Serializer + { + serializer.serialize_bytes(self.as_bytes()) + } + } + + impl<'de> Deserialize<'de> for BString { + #[inline] + fn deserialize( + deserializer: D, + ) -> Result + where D: Deserializer<'de> + { + struct BStringVisitor; + + impl<'de> Visitor<'de> for BStringVisitor { + type Value = BString; + + fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.write_str("a byte string") + } + + #[inline] + fn visit_seq>( + self, + mut visitor: V, + ) -> Result { + let len = cmp::min(visitor.size_hint().unwrap_or(0), 256); + let mut bytes = BString::with_capacity(len); + while let Some(v) = visitor.next_element()? { + bytes.push_byte(v); + } + Ok(bytes) + } + + #[inline] + fn visit_bytes( + self, + value: &[u8], + ) -> Result { + Ok(BString::from(value)) + } + + #[inline] + fn visit_byte_buf( + self, + value: Vec, + ) -> Result { + Ok(BString::from(value)) + } + + #[inline] + fn visit_str( + self, + value: &str, + ) -> Result { + Ok(BString::from(value)) + } + + #[inline] + fn visit_string( + self, + value: String, + ) -> Result { + Ok(BString::from(value)) + } + } + + deserializer.deserialize_byte_buf(BStringVisitor) + } + } +} + +#[cfg(test)] +mod bstring_arbitrary { + use bstring::BString; + + use quickcheck::{Arbitrary, Gen}; + + impl Arbitrary for BString { + fn arbitrary(g: &mut G) -> BString { + BString::from(Vec::::arbitrary(g)) + } + + fn shrink(&self) -> Box> { + Box::new(self.as_vec().shrink().map(BString::from)) + } + } +} diff --git a/vendor/bstr/src/io.rs b/vendor/bstr/src/io.rs new file mode 100644 index 0000000000..6937be2eb1 --- /dev/null +++ b/vendor/bstr/src/io.rs @@ -0,0 +1,203 @@ +/*! +Utilities for working with I/O using byte strings. + +This module currently only exports a single trait, `BufReadExt`, which provides +facilities for conveniently and efficiently working with lines as byte strings. + +More APIs may be added in the future. +*/ + +use std::io; + +use bstr::BStr; +use bstring::BString; + +/// An extention trait for +/// [`std::io::BufRead`](https://doc.rust-lang.org/std/io/trait.BufRead.html) +/// which provides convenience APIs for dealing with byte strings. +pub trait BufReadExt: io::BufRead { + /// Returns an iterator over the lines of this reader, where each line + /// is represented as a byte string. + /// + /// Each item yielded by this iterator is a `io::Result`, where + /// an error is yielded if there was a problem reading from the underlying + /// reader. + /// + /// On success, the next line in the iterator is returned. The line does + /// *not* contain a trailing `\n` or `\r\n`. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::io; + /// + /// use bstr::io::BufReadExt; + /// + /// # fn example() -> Result<(), io::Error> { + /// let cursor = io::Cursor::new(b"lorem\nipsum\r\ndolor"); + /// + /// let mut lines = vec![]; + /// for result in cursor.byte_lines() { + /// let line = result?; + /// lines.push(line); + /// } + /// assert_eq!(lines.len(), 3); + /// assert_eq!(lines[0], "lorem"); + /// assert_eq!(lines[1], "ipsum"); + /// assert_eq!(lines[2], "dolor"); + /// # Ok(()) }; example().unwrap() + /// ``` + fn byte_lines(self) -> ByteLines where Self: Sized { + ByteLines { buf: self } + } + + /// Executes the given closure on each line in the underlying reader. + /// + /// If the closure returns an error (or if the underlying reader returns an + /// error), then iteration is stopped and the error is returned. If false + /// is returned, then iteration is stopped and no error is returned. + /// + /// The closure given is called on exactly the same values as yielded by + /// the [`byte_lines`](trait.BufReadExt.html#method.byte_lines) + /// iterator. Namely, lines do _not_ contain trailing `\n` or `\r\n` bytes. + /// + /// This routine is useful for iterating over lines as quickly as + /// possible. Namely, a single allocation is reused for each line. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::io; + /// + /// use bstr::io::BufReadExt; + /// + /// # fn example() -> Result<(), io::Error> { + /// let cursor = io::Cursor::new(b"lorem\nipsum\r\ndolor"); + /// + /// let mut lines = vec![]; + /// cursor.for_byte_line(|line| { + /// lines.push(line.to_bstring()); + /// Ok(true) + /// })?; + /// assert_eq!(lines.len(), 3); + /// assert_eq!(lines[0], "lorem"); + /// assert_eq!(lines[1], "ipsum"); + /// assert_eq!(lines[2], "dolor"); + /// # Ok(()) }; example().unwrap() + /// ``` + fn for_byte_line( + mut self, + mut for_each_line: F, + ) -> io::Result<()> + where Self: Sized, + F: FnMut(&BStr) -> io::Result + { + let mut bytes = BString::new(); + while self.read_until(b'\n', bytes.as_mut_vec())? > 0 { + trim_line(&mut bytes); + if !for_each_line(&bytes)? { + break; + } + bytes.clear(); + } + Ok(()) + } + + /// Executes the given closure on each line in the underlying reader. + /// + /// If the closure returns an error (or if the underlying reader returns an + /// error), then iteration is stopped and the error is returned. If false + /// is returned, then iteration is stopped and no error is returned. + /// + /// Unlike + /// [`for_byte_line`](trait.BufReadExt.html#method.for_byte_line), + /// the lines given to the closure *do* include the line terminator, if one + /// exists. + /// + /// This routine is useful for iterating over lines as quickly as + /// possible. Namely, a single allocation is reused for each line. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use std::io; + /// + /// use bstr::io::BufReadExt; + /// + /// # fn example() -> Result<(), io::Error> { + /// let cursor = io::Cursor::new(b"lorem\nipsum\r\ndolor"); + /// + /// let mut lines = vec![]; + /// cursor.for_byte_line_with_terminator(|line| { + /// lines.push(line.to_bstring()); + /// Ok(true) + /// })?; + /// assert_eq!(lines.len(), 3); + /// assert_eq!(lines[0], "lorem\n"); + /// assert_eq!(lines[1], "ipsum\r\n"); + /// assert_eq!(lines[2], "dolor"); + /// # Ok(()) }; example().unwrap() + /// ``` + fn for_byte_line_with_terminator( + mut self, + mut for_each_line: F, + ) -> io::Result<()> + where Self: Sized, + F: FnMut(&BStr) -> io::Result + { + let mut bytes = BString::new(); + while self.read_until(b'\n', bytes.as_mut_vec())? > 0 { + if !for_each_line(&bytes)? { + break; + } + bytes.clear(); + } + Ok(()) + } +} + +impl BufReadExt for B {} + +/// An iterator over lines from an instance of +/// [`std::io::BufRead`](https://doc.rust-lang.org/std/io/trait.BufRead.html). +/// +/// This iterator is generally created by calling the +/// [`byte_lines`](trait.BufReadExt.html#method.byte_lines) +/// method on the +/// [`BufReadExt`](trait.BufReadExt.html) +/// trait. +#[derive(Debug)] +pub struct ByteLines { + buf: B, +} + +impl Iterator for ByteLines { + type Item = io::Result; + + fn next(&mut self) -> Option> { + let mut bytes = BString::new(); + match self.buf.read_until(b'\n', bytes.as_mut_vec()) { + Err(e) => Some(Err(e)), + Ok(0) => None, + Ok(_) => { + trim_line(&mut bytes); + Some(Ok(bytes)) + } + } + } +} + +fn trim_line(line: &mut BString) { + if line.last() == Some(b'\n') { + line.pop_byte(); + if line.last() == Some(b'\r') { + line.pop_byte(); + } + } +} diff --git a/vendor/bstr/src/lib.rs b/vendor/bstr/src/lib.rs new file mode 100644 index 0000000000..89b6219c6c --- /dev/null +++ b/vendor/bstr/src/lib.rs @@ -0,0 +1,407 @@ +/*! +An experimental byte string library. + +Byte strings are just like standard Unicode strings with one very important +difference: byte strings are only *conventionally* UTF-8 while Rust's standard +Unicode strings are *guaranteed* to be valid UTF-8. The primary motivation for +this type is for handling arbitrary bytes that are mostly UTF-8. + +# Overview + +There are two primary types in this crate: + +* [`BString`](struct.BString.html) is an owned growable byte string buffer, + analogous to `String`. +* [`BStr`](struct.BStr.html) is a byte string slice, analogous to `str`. + +Additionally, the free function [`B`](fn.B.html) serves as a convenient short +hand for writing byte string literals. + +# Quick examples + +Byte strings are effectively the same thing as a `Vec` or a `&[u8]`, except +they provide a string oriented API. Operations such as iterating over +graphemes, searching for substrings, replacing substrings, trimming and case +conversion are examples of things not provided on the standard `&[u8]` APIs +but are provided by this crate. For example, this code iterates over all of +occurrences of a subtring: + +``` +use bstr::B; + +let s = B("foo bar foo foo quux foo"); + +let mut matches = vec![]; +for start in s.find_iter("foo") { + matches.push(start); +} +assert_eq!(matches, [0, 8, 12, 21]); +``` + +Here's another example showing how to do a search and replace: + +``` +use bstr::B; + +let old = B("foo bar foo foo quux foo"); +let new = old.replace("foo", "hello"); +assert_eq!(new, "hello bar hello hello quux hello"); +``` + +And here's an example that shows case conversion, even in the presence of +invalid UTF-8: + +``` +use bstr::{B, BString}; + +let mut lower = BString::from("hello β"); +lower[0] = b'\xFF'; +// lowercase β is uppercased to Β +assert_eq!(lower.to_uppercase(), B(b"\xFFELLO \xCE\x92")); +``` + +# When should I use byte strings? + +This library is somewhat of an experiment that reflects my hypothesis that +UTF-8 by convention is a better trade off in some circumstances than guaranteed +UTF-8. It's possible, perhaps even likely, that this is a niche concern for +folks working closely with core text primitives. + +The first time this idea hit me was in the implementation of Rust's regex +engine. In particular, very little of the internal implementation cares at all +about searching valid UTF-8 encoded strings. Indeed, internally, the +implementation converts `&str` from the API to `&[u8]` fairly quickly and +just deals with raw bytes. UTF-8 match boundaries are then guaranteed by the +finite state machine itself rather than any specific string type. This makes it +possible to not only run regexes on `&str` values, but also on `&[u8]` values. + +Why would you ever want to run a regex on a `&[u8]` though? Well, `&[u8]` is +the fundamental way at which one reads data from all sorts of streams, via the +standard library's [`Read`](https://doc.rust-lang.org/std/io/trait.Read.html) +trait. In particular, there is no platform independent way to determine whether +what you're reading from is some binary file or a human readable text file. +Therefore, if you're writing a program to search files, you probably need to +deal with `&[u8]` directly unless you're okay with first converting it to a +`&str` and dropping any bytes that aren't valid UTF-8. (Or otherwise determine +the encoding---which is often impractical---and perform a transcoding step.) +Often, the simplest and most robust way to approach this is to simply treat the +contents of a file as if it were mostly valid UTF-8 and pass through invalid +UTF-8 untouched. This may not be the most correct approach though! + +One case in particular exacerbates these issues, and that's memory mapping +a file. When you memory map a file, that file may be gigabytes big, but all +you get is a `&[u8]`. Converting that to a `&str` all in one go is generally +not a good idea because of the costs associated with doing so, and also +because it generally causes one to do two passes over the data instead of +one, which is quite undesirable. It is of course usually possible to do it an +incremental way by only parsing chunks at a time, but this is often complex to +do or impractical. For example, many regex engines only accept one contiguous +sequence of bytes at a time with no way to perform incremental matching. + +In summary, the conventional UTF-8 byte strings provided by this library is an +experiment. They are definitely useful in some limited circumstances, but how +useful they are more broadly isn't clear yet. + +# `bstr` in public APIs + +Since this library is still experimental, you should not use it in the public +API of your crates until it hits `1.0` (unless you're OK with with tracking +breaking releases of `bstr`). It is a priority to move this crate to `1.0` +expediently so that `BString` and `BStr` may be used in the public APIs of +other crates. While both `BString` and `BStr` do provide zero cost ways of +converting between `Vec` and `&[u8]`, it is often convenient to provide +trait implementations for `BString` and `BStr`, which requires making `bstr` a +public dependency. + +# Differences with standard strings + +The primary difference between `BStr` and `str` is that the former is +conventionally UTF-8 while the latter is guaranteed to be UTF-8. The phrase +"conventionally UTF-8" means that a `BStr` may contain bytes that do not form +a valid UTF-8 sequence, but operations defined on the type are generally most +useful on valid UTF-8 sequences. For example, iterating over Unicode codepoints +or grapheme clusters is an operation that is only defined on valid UTF-8. +Therefore, when invalid UTF-8 is encountered, the Unicode replacement codepoint +is substituted. Thus, a byte string that is not UTF-8 at all is of limited +utility when using these methods. + +However, not all operations on byte strings are specifically Unicode aware. For +example, substring search has no specific Unicode semantics ascribed to it. It +works just as well for byte strings that are completely valid UTF-8 as for byte +strings that contain no valid UTF-8 at all. Similarly for replacements and +various other operations. + +Aside from the difference in how UTF-8 is handled, the APIs between `BStr` and +`str` (and `BString` and `String`) are intentionally very similar, including +maintaining the same behavior for corner cases in things like substring +splitting. There are, however, some differences: + +* Substring search is not done with `matches`, but instead, `find_iter`. + In general, this crate does not define any generic + [`Pattern`](https://doc.rust-lang.org/std/str/pattern/trait.Pattern.html) + infrastructure, and instead prefers adding new methods for different + argument types. For example, `matches` can search by a `char` or a `&str`, + where as `find_iter` can only search by a byte string. `find_char` can be + used for searching by a `char`. +* Since `SliceConcatExt` in the standard library is unstable, it is not + possible to reuse that to implement `join` and `concat` methods. Instead, + [`join`](fn.join.html) and [`concat`](fn.concat.html) are provided as free + functions that perform a similar task. +* This library bundles in a few more Unicode operations, such as grapheme, + word and sentence iterators. More operations, such as normalization and + case folding, may be provided in the future. +* Some `String`/`str` APIs will panic if a particular index was not on a valid + UTF-8 code unit sequence boundary. Conversely, no such checking is performed + in this crate, as is consistent with treating byte strings as a sequence of + bytes. This means callers are responsible for maintaining a UTF-8 invariant + if that's important. + +Otherwise, you should find most of the APIs between this crate and the standard +library to be very similar, if not identical. + +# Handling of invalid UTF-8 + +Since byte strings are only *conventionally* UTF-8, there is no guarantee +that byte strings contain valid UTF-8. Indeed, it is perfectly legal for a +byte string to contain arbitrary bytes. However, since this library defines +a *string* type, it provides many operations specified by Unicode. These +operations are typically only defined over codepoints, and thus have no real +meaning on bytes that are invalid UTF-8 because they do not map to a particular +codepoint. + +For this reason, whenever operations defined only on codepoints are used, this +library will automatically convert invalid UTF-8 to the Unicode replacement +codepoint, `U+FFFD`, which looks like this: `�`. For example, an +[iterator over codepoints](struct.Chars.html) will yield a Unicode +replacement codepoint whenever it comes across bytes that are not valid UTF-8: + +``` +use bstr::B; + +let bs = B(b"a\xFF\xFFz"); +let chars: Vec = bs.chars().collect(); +assert_eq!(vec!['a', '\u{FFFD}', '\u{FFFD}', 'z'], chars); +``` + +There are a few ways in which invalid bytes can be substituted with a Unicode +replacement codepoint. One way, not used by this crate, is to replace every +individual invalid byte with a single replacement codepoint. In contrast, the +approach this crate uses is called the "substitution of maximal subparts," as +specified by the Unicode Standard (Chapter 3, Section 9). (This approach is +also used by [W3C's Encoding Standard](https://www.w3.org/TR/encoding/).) In +this strategy, a replacement codepoint is inserted whenever a byte is found +that cannot possibly lead to a valid UTF-8 code unit sequence. If there were +previous bytes that represented a *prefix* of a well-formed UTF-8 code unit +sequence, then all of those bytes (up to 3) are substituted with a single +replacement codepoint. For example: + +``` +use bstr::B; + +let bs = B(b"a\xF0\x9F\x87z"); +let chars: Vec = bs.chars().collect(); +// The bytes \xF0\x9F\x87 could lead to a valid UTF-8 sequence, but 3 of them +// on their own are invalid. Only one replacement codepoint is substituted, +// which demonstrates the "substitution of maximal subparts" strategy. +assert_eq!(vec!['a', '\u{FFFD}', 'z'], chars); +``` + +If you do need to access the raw bytes for some reason in an iterator like +`Chars`, then you should use the iterator's "indices" variant, which gives +the byte offsets containing the invalid UTF-8 bytes that were substituted with +the replacement codepoint. For example: + +``` +use bstr::{B, BStr}; + +let bs = B(b"a\xE2\x98z"); +let chars: Vec<(usize, usize, char)> = bs.char_indices().collect(); +// Even though the replacement codepoint is encoded as 3 bytes itself, the +// byte range given here is only two bytes, corresponding to the original +// raw bytes. +assert_eq!(vec![(0, 1, 'a'), (1, 3, '\u{FFFD}'), (3, 4, 'z')], chars); + +// Thus, getting the original raw bytes is as simple as slicing the original +// byte string: +let chars: Vec<&BStr> = bs.char_indices().map(|(s, e, _)| &bs[s..e]).collect(); +assert_eq!(vec![B("a"), B(b"\xE2\x98"), B("z")], chars); +``` + +# File paths and OS strings + +One of the premiere features of Rust's standard library is how it handles file +paths. In particular, it makes it very hard to write incorrect code while +simultaneously providing a correct cross platform abstraction for manipulating +file paths. The key challenge that one faces with file paths across platforms +is derived from the following observations: + +* On most Unix-like systems, file paths are an arbitrary sequence of bytes. +* On Windows, file paths are an arbitrary sequence of 16-bit integers. + +(In both cases, certain sequences aren't allowed. For example a `NUL` byte is +not allowed in either case. But we can ignore this for the purposes of this +section.) + +Byte strings, like the ones provided in this crate, line up really well with +file paths on Unix like systems, which are themselves just arbitrary sequences +of bytes. It turns out that if you treat them as "mostly UTF-8," then things +work out pretty well. On the contrary, byte strings _don't_ really work +that well on Windows because it's not possible to correctly roundtrip file +paths between 16-bit integers and something that looks like UTF-8 _without_ +explicitly defining an encoding to do this for you, which is anathema to byte +strings, which are just bytes. + +Rust's standard library elegantly solves this problem by specifying an +internal encoding for file paths that's only used on Windows called +[WTF-8](https://simonsapin.github.io/wtf-8/). Its key properties are that they +permit losslessly roundtripping file paths on Windows by extending UTF-8 to +support an encoding of surrogate codepoints, while simultaneously supporting +zero-cost conversion from Rust's Unicode strings to file paths. (Since UTF-8 is +a proper subset of WTF-8.) + +The fundamental point at which the above strategy fails is when you want to +treat file paths as things that look like strings in a zero cost way. In most +cases, this is actually the wrong thing to do, but some cases call for it, +for example, glob or regex matching on file paths. This is because WTF-8 is +treated as an internal implementation detail, and there is no way to access +those bytes via a public API. Therefore, such consumers are limited in what +they can do: + +1. One could re-implement WTF-8 and re-encode file paths on Windows to WTF-8 + by accessing their underlying 16-bit integer representation. Unfortunately, + this isn't zero cost (it introduces a second WTF-8 decoding step) and it's + not clear this is a good thing to do, since WTF-8 should ideally remain an + internal implementation detail. +2. One could instead declare that they will not handle paths on Windows that + are not valid UTF-16, and return an error when one is encountered. +3. Like (2), but instead of returning an error, lossily decode the file path + on Windows that isn't valid UTF-16 into UTF-16 by replacing invalid bytes + with the Unicode replacement codepoint. + +While this library may provide facilities for (1) in the future, currently, +this library only provides facilities for (2) and (3). In particular, a suite +of conversion functions are provided that permit converting between byte +strings, OS strings and file paths. For owned `BString`s, they are: + +* [`BString::from_os_string`](struct.BString.html#method.from_os_string) +* [`BString::from_os_str_lossy`](struct.BString.html#method.from_os_str_lossy) +* [`BString::from_path_buf`](struct.BString.html#method.from_path_buf) +* [`BString::from_path_lossy`](struct.BString.html#method.from_path_lossy) +* [`BString::into_os_string`](struct.BString.html#method.into_os_string) +* [`BString::into_os_string_lossy`](struct.BString.html#method.into_os_string_lossy) +* [`BString::into_path_buf`](struct.BString.html#method.into_path_buf) +* [`BString::into_path_buf_lossy`](struct.BString.html#method.into_path_buf_lossy) + +For byte string slices, they are: + +* [`BStr::from_os_str`](struct.BStr.html#method.from_os_str) +* [`BStr::from_path`](struct.BStr.html#method.from_path) +* [`BStr::to_os_str`](struct.BStr.html#method.to_os_str) +* [`BStr::to_os_str_lossy`](struct.BStr.html#method.to_os_str_lossy) +* [`BStr::to_path`](struct.BStr.html#method.to_path) +* [`BStr::to_path_lossy`](struct.BStr.html#method.to_path_lossy) + +On Unix, all of these conversions are rigorously zero cost, which gives one +a way to ergonomically deal with raw file paths exactly as they are using +normal string-related functions. On Windows, these conversion routines perform +a UTF-8 check and either return an error or lossily decode the file path +into valid UTF-8, depending on which function you use. This means that you +cannot roundtrip all file paths on Windows correctly using these conversion +routines. However, this may be an acceptable downside since such file paths +are exceptionally rare. Moreover, roundtripping isn't always necessary, for +example, if all you're doing is filtering based on file paths. + +The reason why using byte strings for this is potentially superior than the +standard library's approach is that a lot of Rust code is already lossily +converting file paths to Rust's Unicode strings, which are required to be valid +UTF-8, and thus contain latent bugs on Unix where paths with invalid UTF-8 are +not terribly uncommon. If you instead use byte strings, then you're guaranteed +to write correct code for Unix, at the cost of getting a corner case wrong on +Windows. +*/ + +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(feature = "std")] +extern crate core; + +#[cfg(feature = "unicode")] +#[macro_use] +extern crate lazy_static; +extern crate memchr; +#[cfg(test)] +#[macro_use] +extern crate quickcheck; +#[cfg(feature = "unicode")] +extern crate regex_automata; +#[cfg(feature = "serde1-nostd")] +extern crate serde; +#[cfg(test)] +extern crate ucd_parse; + +pub use bstr::{ + B, BStr, + Bytes, + Finder, FinderReverse, Find, FindReverse, + Split, SplitReverse, SplitN, SplitNReverse, + Fields, FieldsWith, + Lines, LinesWithTerminator, +}; +#[cfg(feature = "std")] +pub use bstring::{BString, DrainBytes, FromUtf8Error, concat, join}; +pub use slice_index::SliceIndex; +#[cfg(feature = "unicode")] +pub use unicode::{ + Graphemes, GraphemeIndices, + Sentences, SentenceIndices, + Words, WordIndices, WordsWithBreaks, WordsWithBreakIndices, +}; +pub use utf8::{ + Utf8Error, Chars, CharIndices, + decode as decode_utf8, + decode_last as decode_last_utf8, +}; + +mod ascii; +mod bstr; +#[cfg(feature = "std")] +mod bstring; +mod cow; +mod impls; +#[cfg(feature = "std")] +pub mod io; +mod search; +mod slice_index; +#[cfg(test)] +mod tests; +#[cfg(feature = "unicode")] +mod unicode; +mod utf8; + +#[cfg(test)] +mod apitests { + use super::*; + + #[test] + fn oibits() { + use std::panic::{RefUnwindSafe, UnwindSafe}; + + fn assert_send() {} + fn assert_sync() {} + fn assert_unwind_safe() {} + + assert_send::<&BStr>(); + assert_sync::<&BStr>(); + assert_unwind_safe::<&BStr>(); + assert_send::(); + assert_sync::(); + assert_unwind_safe::(); + + assert_send::(); + assert_sync::(); + assert_unwind_safe::(); + assert_send::(); + assert_sync::(); + assert_unwind_safe::(); + } +} diff --git a/vendor/bstr/src/search/byte_frequencies.rs b/vendor/bstr/src/search/byte_frequencies.rs new file mode 100644 index 0000000000..bad6aaf21b --- /dev/null +++ b/vendor/bstr/src/search/byte_frequencies.rs @@ -0,0 +1,258 @@ +pub const BYTE_FREQUENCIES: [u8; 256] = [ + 55, // '\x00' + 52, // '\x01' + 51, // '\x02' + 50, // '\x03' + 49, // '\x04' + 48, // '\x05' + 47, // '\x06' + 46, // '\x07' + 45, // '\x08' + 103, // '\t' + 242, // '\n' + 66, // '\x0b' + 67, // '\x0c' + 229, // '\r' + 44, // '\x0e' + 43, // '\x0f' + 42, // '\x10' + 41, // '\x11' + 40, // '\x12' + 39, // '\x13' + 38, // '\x14' + 37, // '\x15' + 36, // '\x16' + 35, // '\x17' + 34, // '\x18' + 33, // '\x19' + 56, // '\x1a' + 32, // '\x1b' + 31, // '\x1c' + 30, // '\x1d' + 29, // '\x1e' + 28, // '\x1f' + 255, // ' ' + 148, // '!' + 164, // '"' + 149, // '#' + 136, // '$' + 160, // '%' + 155, // '&' + 173, // "'" + 221, // '(' + 222, // ')' + 134, // '*' + 122, // '+' + 232, // ',' + 202, // '-' + 215, // '.' + 224, // '/' + 208, // '0' + 220, // '1' + 204, // '2' + 187, // '3' + 183, // '4' + 179, // '5' + 177, // '6' + 168, // '7' + 178, // '8' + 200, // '9' + 226, // ':' + 195, // ';' + 154, // '<' + 184, // '=' + 174, // '>' + 126, // '?' + 120, // '@' + 191, // 'A' + 157, // 'B' + 194, // 'C' + 170, // 'D' + 189, // 'E' + 162, // 'F' + 161, // 'G' + 150, // 'H' + 193, // 'I' + 142, // 'J' + 137, // 'K' + 171, // 'L' + 176, // 'M' + 185, // 'N' + 167, // 'O' + 186, // 'P' + 112, // 'Q' + 175, // 'R' + 192, // 'S' + 188, // 'T' + 156, // 'U' + 140, // 'V' + 143, // 'W' + 123, // 'X' + 133, // 'Y' + 128, // 'Z' + 147, // '[' + 138, // '\\' + 146, // ']' + 114, // '^' + 223, // '_' + 151, // '`' + 249, // 'a' + 216, // 'b' + 238, // 'c' + 236, // 'd' + 253, // 'e' + 227, // 'f' + 218, // 'g' + 230, // 'h' + 247, // 'i' + 135, // 'j' + 180, // 'k' + 241, // 'l' + 233, // 'm' + 246, // 'n' + 244, // 'o' + 231, // 'p' + 139, // 'q' + 245, // 'r' + 243, // 's' + 251, // 't' + 235, // 'u' + 201, // 'v' + 196, // 'w' + 240, // 'x' + 214, // 'y' + 152, // 'z' + 182, // '{' + 205, // '|' + 181, // '}' + 127, // '~' + 27, // '\x7f' + 212, // '\x80' + 211, // '\x81' + 210, // '\x82' + 213, // '\x83' + 228, // '\x84' + 197, // '\x85' + 169, // '\x86' + 159, // '\x87' + 131, // '\x88' + 172, // '\x89' + 105, // '\x8a' + 80, // '\x8b' + 98, // '\x8c' + 96, // '\x8d' + 97, // '\x8e' + 81, // '\x8f' + 207, // '\x90' + 145, // '\x91' + 116, // '\x92' + 115, // '\x93' + 144, // '\x94' + 130, // '\x95' + 153, // '\x96' + 121, // '\x97' + 107, // '\x98' + 132, // '\x99' + 109, // '\x9a' + 110, // '\x9b' + 124, // '\x9c' + 111, // '\x9d' + 82, // '\x9e' + 108, // '\x9f' + 118, // '\xa0' + 141, // '¡' + 113, // '¢' + 129, // '£' + 119, // '¤' + 125, // '¥' + 165, // '¦' + 117, // '§' + 92, // '¨' + 106, // '©' + 83, // 'ª' + 72, // '«' + 99, // '¬' + 93, // '\xad' + 65, // '®' + 79, // '¯' + 166, // '°' + 237, // '±' + 163, // '²' + 199, // '³' + 190, // '´' + 225, // 'µ' + 209, // '¶' + 203, // '·' + 198, // '¸' + 217, // '¹' + 219, // 'º' + 206, // '»' + 234, // '¼' + 248, // '½' + 158, // '¾' + 239, // '¿' + 255, // 'À' + 255, // 'Á' + 255, // 'Â' + 255, // 'Ã' + 255, // 'Ä' + 255, // 'Å' + 255, // 'Æ' + 255, // 'Ç' + 255, // 'È' + 255, // 'É' + 255, // 'Ê' + 255, // 'Ë' + 255, // 'Ì' + 255, // 'Í' + 255, // 'Î' + 255, // 'Ï' + 255, // 'Ð' + 255, // 'Ñ' + 255, // 'Ò' + 255, // 'Ó' + 255, // 'Ô' + 255, // 'Õ' + 255, // 'Ö' + 255, // '×' + 255, // 'Ø' + 255, // 'Ù' + 255, // 'Ú' + 255, // 'Û' + 255, // 'Ü' + 255, // 'Ý' + 255, // 'Þ' + 255, // 'ß' + 255, // 'à' + 255, // 'á' + 255, // 'â' + 255, // 'ã' + 255, // 'ä' + 255, // 'å' + 255, // 'æ' + 255, // 'ç' + 255, // 'è' + 255, // 'é' + 255, // 'ê' + 255, // 'ë' + 255, // 'ì' + 255, // 'í' + 255, // 'î' + 255, // 'ï' + 255, // 'ð' + 255, // 'ñ' + 255, // 'ò' + 255, // 'ó' + 255, // 'ô' + 255, // 'õ' + 255, // 'ö' + 255, // '÷' + 255, // 'ø' + 255, // 'ù' + 255, // 'ú' + 255, // 'û' + 255, // 'ü' + 255, // 'ý' + 255, // 'þ' + 255, // 'ÿ' +]; diff --git a/vendor/bstr/src/search/mod.rs b/vendor/bstr/src/search/mod.rs new file mode 100644 index 0000000000..a0d1b45611 --- /dev/null +++ b/vendor/bstr/src/search/mod.rs @@ -0,0 +1,8 @@ +pub use self::prefilter::PrefilterState; +pub use self::twoway::TwoWay; + +mod byte_frequencies; +mod prefilter; +#[cfg(test)] +mod tests; +mod twoway; diff --git a/vendor/bstr/src/search/prefilter.rs b/vendor/bstr/src/search/prefilter.rs new file mode 100644 index 0000000000..43315422fe --- /dev/null +++ b/vendor/bstr/src/search/prefilter.rs @@ -0,0 +1,424 @@ +use core::mem; + +use bstr::BStr; +use search::byte_frequencies::BYTE_FREQUENCIES; + +/// PrefilterState tracks state associated with the effectiveness of a +/// prefilter. It is used to track how many bytes, on average, are skipped by +/// the prefilter. If this average dips below a certain threshold over time, +/// then the state renders the prefilter inert and stops using it. +/// +/// A prefilter state should be created for each search. (Where creating an +/// iterator via, e.g., `find_iter`, is treated as a single search.) +#[derive(Clone, Debug)] +pub struct PrefilterState { + /// The number of skips that has been executed. + skips: usize, + /// The total number of bytes that have been skipped. + skipped: usize, + /// The maximum length of a match. This is used to help determine how many + /// bytes on average should be skipped in order for a prefilter to be + /// effective. + max_match_len: usize, + /// Once this heuristic has been deemed ineffective, it will be inert + /// throughout the rest of its lifetime. This serves as a cheap way to + /// check inertness. + inert: bool, +} + +impl PrefilterState { + /// The minimum number of skip attempts to try before considering whether + /// a prefilter is effective or not. + const MIN_SKIPS: usize = 50; + + /// The minimum amount of bytes that skipping must average. + /// + /// This value was chosen based on varying it and checking the bstr/find/ + /// microbenchmarks. In particular, this can impact the + /// pathological/repeated-{huge,small} benchmarks quite a bit if it's + /// set too low. + const MIN_SKIP_BYTES: usize = 8; + + /// Create a fresh prefilter state. + pub fn new(max_match_len: usize) -> PrefilterState { + if max_match_len == 0 { + return PrefilterState::inert(); + } + PrefilterState { skips: 0, skipped: 0, max_match_len, inert: false } + } + + /// Create a fresh prefilter state that is always inert. + fn inert() -> PrefilterState { + PrefilterState { skips: 0, skipped: 0, max_match_len: 0, inert: true } + } + + /// Update this state with the number of bytes skipped on the last + /// invocation of the prefilter. + #[inline] + pub fn update(&mut self, skipped: usize) { + self.skips += 1; + self.skipped += skipped; + } + + /// Return true if and only if this state indicates that a prefilter is + /// still effective. + #[inline] + pub fn is_effective(&mut self) -> bool { + if self.inert { + return false; + } + if self.skips < PrefilterState::MIN_SKIPS { + return true; + } + if self.skipped >= PrefilterState::MIN_SKIP_BYTES * self.skips { + return true; + } + + // We're inert. + self.inert = true; + false + } +} + +/// A heuristic frequency based prefilter for searching a single needle. +/// +/// This prefilter attempts to pick out the byte in a needle that is predicted +/// to occur least frequently, and search for that using fast vectorized +/// routines. If a rare enough byte could not be found, then this prefilter's +/// constructors will return `None`. +/// +/// This can be combined with `PrefilterState` to dynamically render this +/// prefilter inert if it proves to ineffective. +#[derive(Clone, Debug)] +pub struct Freqy { + /// Whether this prefilter should be used or not. + inert: bool, + /// The length of the needle we're searching for. + needle_len: usize, + /// The rarest byte in the needle, according to pre-computed frequency + /// analysis. + rare1: u8, + /// The leftmost offset of the rarest byte in the needle. + rare1i: usize, + /// The second rarest byte in the needle, according to pre-computed + /// frequency analysis. (This may be equivalent to the rarest byte.) + /// + /// The second rarest byte is used as a type of guard for quickly detecting + /// a mismatch after memchr locates an instance of the rarest byte. This + /// is a hedge against pathological cases where the pre-computed frequency + /// analysis may be off. (But of course, does not prevent *all* + /// pathological cases.) + rare2: u8, + /// The leftmost offset of the second rarest byte in the needle. + rare2i: usize, +} + +impl Freqy { + /// The maximum frequency rank permitted. If the rarest byte in the needle + /// has a frequency rank above this value, then Freqy is not used. + const MAX_RANK: usize = 200; + + /// Return a fresh prefilter state that can be used with this prefilter. A + /// prefilter state is used to track the effectiveness of a prefilter for + /// speeding up searches. Therefore, the prefilter state should generally + /// be reused on subsequent searches (such as in an iterator). For searches + /// on a different haystack, then a new prefilter state should be used. + pub fn prefilter_state(&self) -> PrefilterState { + if self.inert { + PrefilterState::inert() + } else { + PrefilterState::new(self.needle_len) + } + } + + /// Returns a valid but inert prefilter. This is valid for both the forward + /// and reverse direction. + /// + /// It is never correct to use an inert prefilter. The results of finding + /// the next (or previous) candidate are unspecified. + fn inert() -> Freqy { + Freqy { + inert: true, + needle_len: 0, + rare1: 0, + rare1i: 0, + rare2: 0, + rare2i: 0, + } + } + + /// Return search info for the given needle in the forward direction. + pub fn forward(needle: &BStr) -> Freqy { + if needle.is_empty() { + return Freqy::inert(); + } + + // Find the rarest two bytes. Try to make them distinct (but it's not + // required). + let (mut rare1, mut rare1i) = (needle[0], 0); + let (mut rare2, mut rare2i) = (needle[0], 0); + if needle.len() >= 2 { + rare2 = needle[1]; + rare2i = 1; + } + if Freqy::rank(rare2) < Freqy::rank(rare1) { + mem::swap(&mut rare1, &mut rare2); + mem::swap(&mut rare1i, &mut rare2i); + } + for (i, b) in needle.bytes().enumerate().skip(2) { + if Freqy::rank(b) < Freqy::rank(rare1) { + rare2 = rare1; + rare2i = rare1i; + rare1 = b; + rare1i = i; + } else if b != rare1 && Freqy::rank(b) < Freqy::rank(rare2) { + rare2 = b; + rare2i = i; + } + } + if Freqy::rank(rare1) > Freqy::MAX_RANK { + return Freqy::inert(); + } + let needle_len = needle.len(); + Freqy { inert: false, needle_len, rare1, rare1i, rare2, rare2i } + } + + /// Return search info for the given needle in the reverse direction. + pub fn reverse(needle: &BStr) -> Freqy { + if needle.is_empty() { + return Freqy::inert(); + } + + // Find the rarest two bytes. Try to make them distinct (but it's not + // required). In reverse, the offsets correspond to the number of bytes + // from the end of the needle. So `0` is the last byte in the needle. + let (mut rare1i, mut rare2i) = (0, 0); + if needle.len() >= 2 { + rare2i += 1; + } + let mut rare1 = needle[needle.len() - rare1i - 1]; + let mut rare2 = needle[needle.len() - rare2i - 1]; + if Freqy::rank(rare2) < Freqy::rank(rare1) { + mem::swap(&mut rare1, &mut rare2); + mem::swap(&mut rare1i, &mut rare2i); + } + for (i, b) in needle.bytes().rev().enumerate().skip(2) { + if Freqy::rank(b) < Freqy::rank(rare1) { + rare2 = rare1; + rare2i = rare1i; + rare1 = b; + rare1i = i; + } else if b != rare1 && Freqy::rank(b) < Freqy::rank(rare2) { + rare2 = b; + rare2i = i; + } + } + if Freqy::rank(rare1) > Freqy::MAX_RANK { + return Freqy::inert(); + } + let needle_len = needle.len(); + Freqy { inert: false, needle_len, rare1, rare1i, rare2, rare2i } + } + + /// Look for a possible occurrence of needle. The position returned + /// corresponds to the beginning of the occurrence, if one exists. + /// + /// Callers may assume that this never returns false negatives (i.e., it + /// never misses an actual occurrence), but must check that the returned + /// position corresponds to a match. That is, it can return false + /// positives. + /// + /// This should only be used when Freqy is constructed for forward + /// searching. + pub fn find_candidate( + &self, + prestate: &mut PrefilterState, + haystack: &BStr, + ) -> Option { + debug_assert!(!self.inert); + + let mut i = 0; + while prestate.is_effective() { + // Use a fast vectorized implementation to skip to the next + // occurrence of the rarest byte (heuristically chosen) in the + // needle. + i += match haystack[i..].find_byte(self.rare1) { + None => return None, + Some(found) => { + prestate.update(found); + found + } + }; + + // If we can't align our first match with the haystack, then a + // match is impossible. + if i < self.rare1i { + i += 1; + continue; + } + + // Align our rare2 byte with the haystack. A mismatch means that + // a match is impossible. + let aligned_rare2i = i - self.rare1i + self.rare2i; + if haystack.get(aligned_rare2i) != Some(&self.rare2) { + i += 1; + continue; + } + + // We've done what we can. There might be a match here. + return Some(i - self.rare1i); + } + // The only way we get here is if we believe our skipping heuristic + // has become ineffective. We're allowed to return false positives, + // so return the position at which we advanced to, aligned to the + // haystack. + Some(i.saturating_sub(self.rare1i)) + } + + /// Look for a possible occurrence of needle, in reverse, starting from the + /// end of the given haystack. The position returned corresponds to the + /// position immediately after the end of the occurrence, if one exists. + /// + /// Callers may assume that this never returns false negatives (i.e., it + /// never misses an actual occurrence), but must check that the returned + /// position corresponds to a match. That is, it can return false + /// positives. + /// + /// This should only be used when Freqy is constructed for reverse + /// searching. + pub fn rfind_candidate( + &self, + prestate: &mut PrefilterState, + haystack: &BStr, + ) -> Option { + debug_assert!(!self.inert); + + let mut i = haystack.len(); + while prestate.is_effective() { + // Use a fast vectorized implementation to skip to the next + // occurrence of the rarest byte (heuristically chosen) in the + // needle. + i = match haystack[..i].rfind_byte(self.rare1) { + None => return None, + Some(found) => { + prestate.update(i - found); + found + } + }; + + // If we can't align our first match with the haystack, then a + // match is impossible. + if i + self.rare1i + 1 > haystack.len() { + continue; + } + + // Align our rare2 byte with the haystack. A mismatch means that + // a match is impossible. + let aligned = match (i + self.rare1i).checked_sub(self.rare2i) { + None => continue, + Some(aligned) => aligned, + }; + if haystack.get(aligned) != Some(&self.rare2) { + continue; + } + + // We've done what we can. There might be a match here. + return Some(i + self.rare1i + 1); + } + // The only way we get here is if we believe our skipping heuristic + // has become ineffective. We're allowed to return false positives, + // so return the position at which we advanced to, aligned to the + // haystack. + Some(i + self.rare1i + 1) + } + + /// Return the heuristical frequency rank of the given byte. A lower rank + /// means the byte is believed to occur less frequently. + fn rank(b: u8) -> usize { + BYTE_FREQUENCIES[b as usize] as usize + } +} + +#[cfg(test)] +mod tests { + use bstr::B; + use super::*; + + #[test] + fn freqy_forward() { + // N.B. We sometimes use uppercase here since that mostly ensures freqy + // will be constructable. Lowercase letters may be too common for freqy + // to work. + + let s = Freqy::forward(B("BAR")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(0), s.find_candidate(&mut pre, B("BARFOO"))); + + let s = Freqy::forward(B("BAR")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(3), s.find_candidate(&mut pre, B("FOOBAR"))); + + let s = Freqy::forward(B("zyzy")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(0), s.find_candidate(&mut pre, B("zyzz"))); + + let s = Freqy::forward(B("zyzy")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(2), s.find_candidate(&mut pre, B("zzzy"))); + + let s = Freqy::forward(B("zyzy")); + let mut pre = s.prefilter_state(); + assert_eq!(None, s.find_candidate(&mut pre, B("zazb"))); + + let s = Freqy::forward(B("yzyz")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(0), s.find_candidate(&mut pre, B("yzyy"))); + + let s = Freqy::forward(B("yzyz")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(2), s.find_candidate(&mut pre, B("yyyz"))); + + let s = Freqy::forward(B("yzyz")); + let mut pre = s.prefilter_state(); + assert_eq!(None, s.find_candidate(&mut pre, B("yayb"))); + } + + #[test] + fn freqy_reverse() { + // N.B. We sometimes use uppercase here since that mostly ensures freqy + // will be constructable. Lowercase letters may be too common for freqy + // to work. + + let s = Freqy::reverse(B("BAR")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(3), s.rfind_candidate(&mut pre, B("BARFOO"))); + + let s = Freqy::reverse(B("BAR")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(6), s.rfind_candidate(&mut pre, B("FOOBAR"))); + + let s = Freqy::reverse(B("zyzy")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(2), s.rfind_candidate(&mut pre, B("zyzz"))); + + let s = Freqy::reverse(B("zyzy")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(4), s.rfind_candidate(&mut pre, B("zzzy"))); + + let s = Freqy::reverse(B("zyzy")); + let mut pre = s.prefilter_state(); + assert_eq!(None, s.rfind_candidate(&mut pre, B("zazb"))); + + let s = Freqy::reverse(B("yzyz")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(2), s.rfind_candidate(&mut pre, B("yzyy"))); + + let s = Freqy::reverse(B("yzyz")); + let mut pre = s.prefilter_state(); + assert_eq!(Some(4), s.rfind_candidate(&mut pre, B("yyyz"))); + + let s = Freqy::reverse(B("yzyz")); + let mut pre = s.prefilter_state(); + assert_eq!(None, s.rfind_candidate(&mut pre, B("yayb"))); + } +} diff --git a/vendor/bstr/src/search/tests.rs b/vendor/bstr/src/search/tests.rs new file mode 100644 index 0000000000..aa7f6b268e --- /dev/null +++ b/vendor/bstr/src/search/tests.rs @@ -0,0 +1,223 @@ +use bstr::{B, BStr}; +use bstring::BString; +use search::twoway::TwoWay; + +/// Each test is a (needle, haystack, expected_fwd, expected_rev) tuple. +type SearchTest = (&'static str, &'static str, Option, Option); + +const SEARCH_TESTS: &'static [SearchTest] = &[ + ("", "", Some(0), Some(0)), + ("", "a", Some(0), Some(1)), + ("", "ab", Some(0), Some(2)), + ("", "abc", Some(0), Some(3)), + ("a", "", None, None), + ("a", "a", Some(0), Some(0)), + ("a", "aa", Some(0), Some(1)), + ("a", "ba", Some(1), Some(1)), + ("a", "bba", Some(2), Some(2)), + ("a", "bbba", Some(3), Some(3)), + ("a", "bbbab", Some(3), Some(3)), + ("a", "bbbabb", Some(3), Some(3)), + ("a", "bbbabbb", Some(3), Some(3)), + ("a", "bbbbbb", None, None), + ("ab", "", None, None), + ("ab", "a", None, None), + ("ab", "b", None, None), + ("ab", "ab", Some(0), Some(0)), + ("ab", "aab", Some(1), Some(1)), + ("ab", "aaab", Some(2), Some(2)), + ("ab", "abaab", Some(0), Some(3)), + ("ab", "baaab", Some(3), Some(3)), + ("ab", "acb", None, None), + ("ab", "abba", Some(0), Some(0)), + ("abc", "ab", None, None), + ("abc", "abc", Some(0), Some(0)), + ("abc", "abcz", Some(0), Some(0)), + ("abc", "abczz", Some(0), Some(0)), + ("abc", "zabc", Some(1), Some(1)), + ("abc", "zzabc", Some(2), Some(2)), + ("abc", "azbc", None, None), + ("abc", "abzc", None, None), + + ("abczdef", "abczdefzzzzzzzzzzzzzzzzzzzz", Some(0), Some(0)), + ("abczdef", "zzzzzzzzzzzzzzzzzzzzabczdef", Some(20), Some(20)), + + // Failures caught by quickcheck. + ("\u{0}\u{15}", "\u{0}\u{15}\u{15}\u{0}", Some(0), Some(0)), + ("\u{0}\u{1e}", "\u{1e}\u{0}", None, None), +]; + +#[test] +fn unit_twoway_fwd() { + run_search_tests_fwd("TwoWay", |n, h| TwoWay::forward(n).find(h)); +} + +#[test] +fn unit_twoway_rev() { + run_search_tests_rev("TwoWay", |n, h| TwoWay::reverse(n).rfind(h)); +} + +/// Run the substring search tests. `name` should be the type of searcher used, +/// for diagnostics. `search` should be a closure that accepts a needle and a +/// haystack and returns the starting position of the first occurrence of +/// needle in the haystack, or `None` if one doesn't exist. +fn run_search_tests_fwd( + name: &str, + mut search: impl FnMut(&BStr, &BStr) -> Option, +) { + for &(needle, haystack, expected_fwd, _) in SEARCH_TESTS { + let (n, h) = (B(needle), B(haystack)); + assert_eq!( + expected_fwd, + search(n, h), + "{}: needle: {:?}, haystack: {:?}, expected: {:?}", + name, n, h, expected_fwd + ); + } +} + +/// Run the substring search tests. `name` should be the type of searcher used, +/// for diagnostics. `search` should be a closure that accepts a needle and a +/// haystack and returns the starting position of the last occurrence of +/// needle in the haystack, or `None` if one doesn't exist. +fn run_search_tests_rev( + name: &str, + mut search: impl FnMut(&BStr, &BStr) -> Option, +) { + for &(needle, haystack, _, expected_rev) in SEARCH_TESTS { + let (n, h) = (B(needle), B(haystack)); + assert_eq!( + expected_rev, + search(n, h), + "{}: needle: {:?}, haystack: {:?}, expected: {:?}", + name, n, h, expected_rev + ); + } +} + +quickcheck! { + fn qc_twoway_fwd_prefix_is_substring(bs: BString) -> bool { + prop_prefix_is_substring(false, &bs, |n, h| TwoWay::forward(n).find(h)) + } + + fn qc_twoway_fwd_suffix_is_substring(bs: BString) -> bool { + prop_suffix_is_substring(false, &bs, |n, h| TwoWay::forward(n).find(h)) + } + + fn qc_twoway_rev_prefix_is_substring(bs: BString) -> bool { + prop_prefix_is_substring(true, &bs, |n, h| TwoWay::reverse(n).rfind(h)) + } + + fn qc_twoway_rev_suffix_is_substring(bs: BString) -> bool { + prop_suffix_is_substring(true, &bs, |n, h| TwoWay::reverse(n).rfind(h)) + } + + fn qc_twoway_fwd_matches_naive( + needle: BString, + haystack: BString + ) -> bool { + prop_matches_naive( + false, + &needle, + &haystack, + |n, h| TwoWay::forward(n).find(h), + ) + } + + fn qc_twoway_rev_matches_naive( + needle: BString, + haystack: BString + ) -> bool { + prop_matches_naive( + true, + &needle, + &haystack, + |n, h| TwoWay::reverse(n).rfind(h), + ) + } +} + +/// Check that every prefix of the given byte string is a substring. +fn prop_prefix_is_substring( + reverse: bool, + bs: &BStr, + mut search: impl FnMut(&BStr, &BStr) -> Option, +) -> bool { + if bs.is_empty() { + return true; + } + for i in 0..(bs.len() - 1) { + let prefix = &bs[..i]; + if reverse { + assert_eq!(naive_rfind(prefix, bs), search(prefix, bs)); + } else { + assert_eq!(naive_find(prefix, bs), search(prefix, bs)); + } + } + true +} + +/// Check that every suffix of the given byte string is a substring. +fn prop_suffix_is_substring( + reverse: bool, + bs: &BStr, + mut search: impl FnMut(&BStr, &BStr) -> Option, +) -> bool { + if bs.is_empty() { + return true; + } + for i in 0..(bs.len() - 1) { + let suffix = &bs[i..]; + if reverse { + assert_eq!(naive_rfind(suffix, bs), search(suffix, bs)); + } else { + assert_eq!(naive_find(suffix, bs), search(suffix, bs)); + } + } + true +} + +/// Check that naive substring search matches the result of the given search +/// algorithm. +fn prop_matches_naive( + reverse: bool, + needle: &BStr, + haystack: &BStr, + mut search: impl FnMut(&BStr, &BStr) -> Option, +) -> bool { + if reverse { + naive_rfind(needle, haystack) == search(needle, haystack) + } else { + naive_find(needle, haystack) == search(needle, haystack) + } +} + +/// Naively search forwards for the given needle in the given haystack. +fn naive_find(needle: &BStr, haystack: &BStr) -> Option { + if needle.is_empty() { + return Some(0); + } else if haystack.len() < needle.len() { + return None; + } + for i in 0..(haystack.len() - needle.len() + 1) { + if needle == &haystack[i..i + needle.len()] { + return Some(i); + } + } + None +} + +/// Naively search in reverse for the given needle in the given haystack. +fn naive_rfind(needle: &BStr, haystack: &BStr) -> Option { + if needle.is_empty() { + return Some(haystack.len()); + } else if haystack.len() < needle.len() { + return None; + } + for i in (0..(haystack.len() - needle.len() + 1)).rev() { + if needle == &haystack[i..i + needle.len()] { + return Some(i); + } + } + None +} diff --git a/vendor/bstr/src/search/twoway.rs b/vendor/bstr/src/search/twoway.rs new file mode 100644 index 0000000000..b3b45e3b9c --- /dev/null +++ b/vendor/bstr/src/search/twoway.rs @@ -0,0 +1,883 @@ +use core::cmp; + +use bstr::BStr; +use cow::CowBStr; +use search::prefilter::{Freqy, PrefilterState}; + +/// An implementation of the TwoWay substring search algorithm, with heuristics +/// for accelerating search based on frequency analysis. +/// +/// This searcher supports forward and reverse search, although not +/// simultaneously. It runs in O(n + m) time and O(1) space, where +/// `n ~ len(needle)` and `m ~ len(haystack)`. +/// +/// The implementation here roughly matches that which was developed by +/// Crochemore and Perrin in their 1991 paper "Two-way string-matching." The +/// only change in this implementation is the use of zero-based indices and +/// the addition of heuristics for a fast skip loop. That is, this will detect +/// bytes that are believed to be rare in the needle and use fast vectorized +/// instructions to find their occurrences quickly. The Two-Way algorithm is +/// then used to confirm whether a match at that location occurred. +/// +/// The heuristic for fast skipping is automatically shut off if it's +/// detected to be ineffective at search time. Generally, this only occurs in +/// pathological cases. But this is generally necessary in order to preserve +/// a `O(n + m)` time bound. +/// +/// The code below is fairly complex and not obviously correct at all. It's +/// likely necessary to read the Two-Way paper cited above in order to fully +/// grok this code. +#[derive(Clone, Debug)] +pub struct TwoWay<'b> { + /// The needle that we're looking for. + needle: CowBStr<'b>, + /// An implementation of a fast skip loop based on hard-coded frequency + /// data. This is only used when conditions are deemed favorable. + freqy: Freqy, + /// A critical position in needle. Specifically, this position corresponds + /// to beginning of either the minimal or maximal suffix in needle. (N.B. + /// See SuffixType below for why "minimal" isn't quite the correct word + /// here.) + /// + /// This is the position at which every search begins. Namely, search + /// starts by scanning text to the right of this position, and only if + /// there's a match does the text to the left of this position get scanned. + critical_pos: usize, + /// The amount we shift by in the Two-Way search algorithm. This + /// corresponds to the "small period" and "large period" cases. + shift: Shift, +} + +impl<'b> TwoWay<'b> { + /// Create a searcher that uses the Two-Way algorithm by searching forwards + /// through any haystack. + pub fn forward(needle: &'b BStr) -> TwoWay<'b> { + let freqy = Freqy::forward(needle); + if needle.is_empty() { + return TwoWay { + needle: CowBStr::new(needle), + freqy, + critical_pos: 0, + shift: Shift::Large { shift: 0 }, + }; + } + + let min_suffix = Suffix::forward(needle, SuffixKind::Minimal); + let max_suffix = Suffix::forward(needle, SuffixKind::Maximal); + let (period_lower_bound, critical_pos) = + if min_suffix.pos > max_suffix.pos { + (min_suffix.period, min_suffix.pos) + } else { + (max_suffix.period, max_suffix.pos) + }; + let shift = Shift::forward(needle, period_lower_bound, critical_pos); + let needle = CowBStr::new(needle); + TwoWay { needle, freqy, critical_pos, shift } + } + + /// Create a searcher that uses the Two-Way algorithm by searching in + /// reverse through any haystack. + pub fn reverse(needle: &'b BStr) -> TwoWay<'b> { + let freqy = Freqy::reverse(needle); + if needle.is_empty() { + return TwoWay { + needle: CowBStr::new(needle), + freqy, + critical_pos: 0, + shift: Shift::Large { shift: 0 }, + }; + } + + let min_suffix = Suffix::reverse(needle, SuffixKind::Minimal); + let max_suffix = Suffix::reverse(needle, SuffixKind::Maximal); + let (period_lower_bound, critical_pos) = + if min_suffix.pos < max_suffix.pos { + (min_suffix.period, min_suffix.pos) + } else { + (max_suffix.period, max_suffix.pos) + }; + let shift = Shift::reverse(needle, period_lower_bound, critical_pos); + let needle = CowBStr::new(needle); + TwoWay { needle, freqy, critical_pos, shift } + } + + /// Return a fresh prefilter state that can be used with this searcher. + /// A prefilter state is used to track the effectiveness of a searcher's + /// prefilter for speeding up searches. Therefore, the prefilter state + /// should generally be reused on subsequent searches (such as in an + /// iterator). For searches on a different haystack, then a new prefilter + /// state should be used. + /// + /// This always initializes a valid prefilter state even if this searcher + /// does not have a prefilter enabled. + pub fn prefilter_state(&self) -> PrefilterState { + self.freqy.prefilter_state() + } + + /// Return the needle used by this searcher. + pub fn needle(&self) -> &BStr { + self.needle.as_bstr() + } + + /// Convert this searched into an owned version, where the needle is + /// copied if it isn't already owned. + #[cfg(feature = "std")] + pub fn into_owned(self) -> TwoWay<'static> { + TwoWay { + needle: self.needle.into_owned(), + freqy: self.freqy, + critical_pos: self.critical_pos, + shift: self.shift, + } + } + + /// Find the position of the first occurrence of this searcher's needle in + /// the given haystack. If one does not exist, then return None. + /// + /// This will automatically initialize prefilter state. This should only + /// be used for one-off searches. + pub fn find(&self, haystack: &BStr) -> Option { + self.find_with(&mut self.prefilter_state(), haystack) + } + + /// Find the position of the last occurrence of this searcher's needle + /// in the given haystack. If one does not exist, then return None. + /// + /// This will automatically initialize prefilter state. This should only + /// be used for one-off searches. + pub fn rfind(&self, haystack: &BStr) -> Option { + self.rfind_with(&mut self.prefilter_state(), haystack) + } + + /// Find the position of the first occurrence of this searcher's needle in + /// the given haystack. If one does not exist, then return None. + /// + /// This accepts prefilter state that is useful when using the same + /// searcher multiple times, such as in an iterator. + pub fn find_with( + &self, + prestate: &mut PrefilterState, + haystack: &BStr, + ) -> Option { + if self.needle.is_empty() { + return Some(0); + } else if haystack.len() < self.needle.len() { + return None; + } else if self.needle.len() == 1 { + return haystack.find_byte(self.needle[0]); + } + match self.shift { + Shift::Small { period } => { + self.find_small(prestate, haystack, period) + } + Shift::Large { shift } => { + self.find_large(prestate, haystack, shift) + } + } + } + + /// Find the position of the last occurrence of this searcher's needle + /// in the given haystack. If one does not exist, then return None. + /// + /// This accepts prefilter state that is useful when using the same + /// searcher multiple times, such as in an iterator. + pub fn rfind_with( + &self, + prestate: &mut PrefilterState, + haystack: &BStr, + ) -> Option { + if self.needle.is_empty() { + return Some(haystack.len()); + } else if haystack.len() < self.needle.len() { + return None; + } else if self.needle.len() == 1 { + return haystack.rfind_byte(self.needle[0]); + } + match self.shift { + Shift::Small { period } => { + self.rfind_small(prestate, haystack, period) + } + Shift::Large { shift } => { + self.rfind_large(prestate, haystack, shift) + } + } + } + + // Below is the actual implementation of TwoWay searching, including both + // forwards and backwards searching. Each forward and reverse search has + // two fairly similar implementations, each handling the small and large + // period cases, for a total 4 different search routines. + // + // On top of that, each search implementation can be accelerated by a + // Freqy prefilter, but it is not always enabled. To avoid its overhead + // when its disabled, we explicitly inline each search implementation based + // on whether Freqy will be used or not. This brings us up to a total of + // 8 monomorphized versions of the search code. + + #[inline(never)] + fn find_small( + &self, + prestate: &mut PrefilterState, + haystack: &BStr, + period: usize, + ) -> Option { + if prestate.is_effective() { + self.find_small_imp(prestate, true, haystack, period) + } else { + self.find_small_imp(prestate, false, haystack, period) + } + } + + #[inline(always)] + fn find_small_imp( + &self, + prestate: &mut PrefilterState, + prefilter: bool, + haystack: &BStr, + period: usize, + ) -> Option { + let needle = self.needle.as_bstr(); + let mut pos = 0; + let mut shift = 0; + while pos + needle.len() <= haystack.len() { + let mut i = cmp::max(self.critical_pos, shift); + if prefilter && prestate.is_effective() { + match self.freqy.find_candidate(prestate, &haystack[pos..]) { + None => return None, + Some(found) => { + shift = 0; + i = self.critical_pos; + pos += found; + if pos + needle.len() > haystack.len() { + return None; + } + } + } + } + while i < needle.len() && needle[i] == haystack[pos + i] { + i += 1; + } + if i < needle.len() { + pos += i - self.critical_pos + 1; + shift = 0; + } else { + let mut j = self.critical_pos; + while j > shift && needle[j] == haystack[pos + j] { + j -= 1; + } + if j <= shift && needle[shift] == haystack[pos + shift] { + return Some(pos); + } + pos += period; + shift = needle.len() - period; + } + } + None + } + + #[inline(never)] + fn find_large( + &self, + prestate: &mut PrefilterState, + haystack: &BStr, + shift: usize, + ) -> Option { + if prestate.is_effective() { + self.find_large_imp(prestate, true, haystack, shift) + } else { + self.find_large_imp(prestate, false, haystack, shift) + } + } + + #[inline(always)] + fn find_large_imp( + &self, + prestate: &mut PrefilterState, + prefilter: bool, + haystack: &BStr, + shift: usize, + ) -> Option { + let needle = self.needle.as_bstr(); + let mut pos = 0; + while pos + needle.len() <= haystack.len() { + let mut i = self.critical_pos; + if prefilter && prestate.is_effective() { + match self.freqy.find_candidate(prestate, &haystack[pos..]) { + None => return None, + Some(found) => { + pos += found; + if pos + needle.len() > haystack.len() { + return None; + } + } + } + } + while i < needle.len() && needle[i] == haystack[pos + i] { + i += 1; + } + if i < needle.len() { + pos += i - self.critical_pos + 1; + } else { + let mut j = self.critical_pos; + while j > 0 && needle[j] == haystack[pos + j] { + j -= 1; + } + if j == 0 && needle[0] == haystack[pos] { + return Some(pos); + } + pos += shift; + } + } + None + } + + #[inline(never)] + fn rfind_small( + &self, + prestate: &mut PrefilterState, + haystack: &BStr, + period: usize, + ) -> Option { + if prestate.is_effective() { + self.rfind_small_imp(prestate, true, haystack, period) + } else { + self.rfind_small_imp(prestate, false, haystack, period) + } + } + + #[inline(always)] + fn rfind_small_imp( + &self, + prestate: &mut PrefilterState, + prefilter: bool, + haystack: &BStr, + period: usize, + ) -> Option { + let needle = &*self.needle; + let nlen = needle.len(); + let mut pos = haystack.len(); + let mut shift = nlen; + while pos >= nlen { + let mut i = cmp::min(self.critical_pos, shift); + if prefilter && prestate.is_effective() { + match self.freqy.rfind_candidate(prestate, &haystack[..pos]) { + None => return None, + Some(found) => { + shift = nlen; + i = self.critical_pos; + pos = found; + if pos < nlen { + return None; + } + } + } + } + while i > 0 && needle[i - 1] == haystack[pos - nlen + i - 1] { + i -= 1; + } + if i > 0 || needle[0] != haystack[pos - nlen] { + pos -= self.critical_pos - i + 1; + shift = nlen; + } else { + let mut j = self.critical_pos; + while j < shift && needle[j] == haystack[pos - nlen + j] { + j += 1; + } + if j == shift { + return Some(pos - nlen); + } + pos -= period; + shift = period; + } + } + None + } + + #[inline(never)] + fn rfind_large( + &self, + prestate: &mut PrefilterState, + haystack: &BStr, + shift: usize, + ) -> Option { + if prestate.is_effective() { + self.rfind_large_imp(prestate, true, haystack, shift) + } else { + self.rfind_large_imp(prestate, false, haystack, shift) + } + } + + #[inline(always)] + fn rfind_large_imp( + &self, + prestate: &mut PrefilterState, + prefilter: bool, + haystack: &BStr, + shift: usize, + ) -> Option { + let needle = &*self.needle; + let nlen = needle.len(); + let mut pos = haystack.len(); + while pos >= nlen { + if prefilter && prestate.is_effective() { + match self.freqy.rfind_candidate(prestate, &haystack[..pos]) { + None => return None, + Some(found) => { + pos = found; + if pos < nlen { + return None; + } + } + } + } + + let mut i = self.critical_pos; + while i > 0 && needle[i - 1] == haystack[pos - nlen + i - 1] { + i -= 1; + } + if i > 0 || needle[0] != haystack[pos - nlen] { + pos -= self.critical_pos - i + 1; + } else { + let mut j = self.critical_pos; + while j < nlen && needle[j] == haystack[pos - nlen + j] { + j += 1; + } + if j == nlen { + return Some(pos - nlen); + } + pos -= shift; + } + } + None + } +} + +/// A representation of the amount we're allowed to shift by during Two-Way +/// search. +/// +/// When computing a critical factorization of the needle, we find the position +/// of the critical factorization by finding the needle's maximal (or minimal) +/// suffix, along with the period of that suffix. It turns out that the period +/// of that suffix is a lower bound on the period of the needle itself. +/// +/// This lower bound is equivalent to the actual period of the needle in +/// some cases. To describe that case, we denote the needle as `x` where +/// `x = uv` and `v` is the lexicographic maximal suffix of `v`. The lower +/// bound given here is always the period of `v`, which is `<= period(x)`. The +/// case where `period(v) == period(x)` occurs when `len(u) < (len(x) / 2)` and +/// where `u` is a suffix of `v[0..period(v)]`. +/// +/// This case is important because the search algorithm for when the +/// periods are equivalent is slightly different than the search algorithm +/// for when the periods are not equivalent. In particular, when they aren't +/// equivalent, we know that the period of the needle is no less than half its +/// length. In this case, we shift by an amount less than or equal to the +/// period of the needle (determined by the maximum length of the components +/// of the critical factorization of `x`, i.e., `max(len(u), len(v))`).. +/// +/// The above two cases are represented by the variants below. Each entails +/// a different instantiation of the Two-Way search algorithm. +/// +/// N.B. If we could find a way to compute the exact period in all cases, +/// then we could collapse this case analysis and simplify the algorithm. The +/// Two-Way paper suggests this is possible, but more reading is required to +/// grok why the authors didn't pursue that path. +#[derive(Clone, Debug)] +enum Shift { + Small { period: usize }, + Large { shift: usize }, +} + +impl Shift { + /// Compute the shift for a given needle in the forward direction. + /// + /// This requires a lower bound on the period and a critical position. + /// These can be computed by extracting both the minimal and maximal + /// lexicographic suffixes, and choosing the right-most starting position. + /// The lower bound on the period is then the period of the chosen suffix. + fn forward( + needle: &BStr, + period_lower_bound: usize, + critical_pos: usize, + ) -> Shift { + let large = cmp::max(critical_pos, needle.len() - critical_pos); + if critical_pos * 2 >= needle.len() { + return Shift::Large { shift: large }; + } + + let (u, v) = needle.split_at(critical_pos); + if !v[..period_lower_bound].ends_with(u) { + return Shift::Large { shift: large }; + } + Shift::Small { period: period_lower_bound } + } + + /// Compute the shift for a given needle in the reverse direction. + /// + /// This requires a lower bound on the period and a critical position. + /// These can be computed by extracting both the minimal and maximal + /// lexicographic suffixes, and choosing the left-most starting position. + /// The lower bound on the period is then the period of the chosen suffix. + fn reverse( + needle: &BStr, + period_lower_bound: usize, + critical_pos: usize, + ) -> Shift { + let large = cmp::max(critical_pos, needle.len() - critical_pos); + if (needle.len() - critical_pos) * 2 >= needle.len() { + return Shift::Large { shift: large }; + } + + let (v, u) = needle.split_at(critical_pos); + if !v[v.len() - period_lower_bound..].starts_with(u) { + return Shift::Large { shift: large }; + } + Shift::Small { period: period_lower_bound } + } +} + +/// A suffix extracted from a needle along with its period. +#[derive(Debug)] +struct Suffix { + /// The starting position of this suffix. + /// + /// If this is a forward suffix, then `&bytes[pos..]` can be used. If this + /// is a reverse suffix, then `&bytes[..pos]` can be used. That is, for + /// forward suffixes, this is an inclusive starting position, where as for + /// reverse suffixes, this is an exclusive ending position. + pos: usize, + /// The period of this suffix. + /// + /// Note that this is NOT necessarily the period of the string from which + /// this suffix comes from. (It is always less than or equal to the period + /// of the original string.) + period: usize, +} + +impl Suffix { + fn forward(needle: &BStr, kind: SuffixKind) -> Suffix { + debug_assert!(!needle.is_empty()); + + // suffix represents our maximal (or minimal) suffix, along with + // its period. + let mut suffix = Suffix { pos: 0, period: 1 }; + // The start of a suffix in `needle` that we are considering as a + // more maximal (or minimal) suffix than what's in `suffix`. + let mut candidate_start = 1; + // The current offset of our suffixes that we're comparing. + // + // When the characters at this offset are the same, then we mush on + // to the next position since no decision is possible. When the + // candidate's character is greater (or lesser) than the corresponding + // character than our current maximal (or minimal) suffix, then the + // current suffix is changed over to the candidate and we restart our + // search. Otherwise, the candidate suffix is no good and we restart + // our search on the next candidate. + // + // The three cases above correspond to the three cases in the loop + // below. + let mut offset = 0; + + while candidate_start + offset < needle.len() { + let current = needle[suffix.pos + offset]; + let candidate = needle[candidate_start + offset]; + match kind.cmp(current, candidate) { + SuffixOrdering::Accept => { + suffix = Suffix { pos: candidate_start, period: 1 }; + candidate_start += 1; + offset = 0; + } + SuffixOrdering::Skip => { + candidate_start += offset + 1; + offset = 0; + suffix.period = candidate_start - suffix.pos; + } + SuffixOrdering::Push => { + if offset + 1 == suffix.period { + candidate_start += suffix.period; + offset = 0; + } else { + offset += 1; + } + } + } + } + suffix + } + + fn reverse(needle: &BStr, kind: SuffixKind) -> Suffix { + debug_assert!(!needle.is_empty()); + + // See the comments in `forward` for how this works. + let mut suffix = Suffix { pos: needle.len(), period: 1 }; + if needle.len() == 1 { + return suffix; + } + let mut candidate_start = needle.len() - 1; + let mut offset = 0; + + while offset < candidate_start { + let current = needle[suffix.pos - offset - 1]; + let candidate = needle[candidate_start - offset - 1]; + match kind.cmp(current, candidate) { + SuffixOrdering::Accept => { + suffix = Suffix { pos: candidate_start, period: 1 }; + candidate_start -= 1; + offset = 0; + } + SuffixOrdering::Skip => { + candidate_start -= offset + 1; + offset = 0; + suffix.period = suffix.pos - candidate_start; + } + SuffixOrdering::Push => { + if offset + 1 == suffix.period { + candidate_start -= suffix.period; + offset = 0; + } else { + offset += 1; + } + } + } + } + suffix + } +} + +/// The kind of suffix to extract. +#[derive(Clone, Copy, Debug)] +enum SuffixKind { + /// Extract the smallest lexicographic suffix from a string. + /// + /// Technically, this doesn't actually pick the smallest lexicographic + /// suffix. e.g., Given the choice between `a` and `aa`, this will choose + /// the latter over the former, even though `a < aa`. The reasoning for + /// this isn't clear from the paper, but it still smells like a minimal + /// suffix. + Minimal, + /// Extract the largest lexicographic suffix from a string. + /// + /// Unlike `Minimal`, this really does pick the maximum suffix. e.g., Given + /// the choice between `z` and `zz`, this will choose the latter over the + /// former. + Maximal, +} + +/// The result of comparing corresponding bytes between two suffixes. +#[derive(Clone, Copy, Debug)] +enum SuffixOrdering { + /// This occurs when the given candidate byte indicates that the candidate + /// suffix is better than the current maximal (or minimal) suffix. That is, + /// the current candidate suffix should supplant the current maximal (or + /// minimal) suffix. + Accept, + /// This occurs when the given candidate byte excludes the candidate suffix + /// from being better than the current maximal (or minimal) suffix. That + /// is, the current candidate suffix should be dropped and the next one + /// should be considered. + Skip, + /// This occurs when no decision to accept or skip the candidate suffix + /// can be made, e.g., when corresponding bytes are equivalent. In this + /// case, the next corresponding bytes should be compared. + Push, +} + +impl SuffixKind { + /// Returns true if and only if the given candidate byte indicates that + /// it should replace the current suffix as the maximal (or minimal) + /// suffix. + fn cmp(self, current: u8, candidate: u8) -> SuffixOrdering { + use self::SuffixOrdering::*; + + match self { + SuffixKind::Minimal if candidate < current => Accept, + SuffixKind::Minimal if candidate > current => Skip, + SuffixKind::Minimal => Push, + SuffixKind::Maximal if candidate > current => Accept, + SuffixKind::Maximal if candidate < current => Skip, + SuffixKind::Maximal => Push, + } + } +} + +// N.B. There are more holistic tests in src/search/tests.rs. +#[cfg(test)] +mod tests { + use bstr::{B, BStr}; + use bstring::BString; + + use super::*; + + /// Convenience wrapper for computing the suffix as a byte string. + fn get_suffix_forward(needle: &BStr, kind: SuffixKind) -> (&BStr, usize) { + let s = Suffix::forward(needle, kind); + (&needle[s.pos..], s.period) + } + + /// Convenience wrapper for computing the reverse suffix as a byte string. + fn get_suffix_reverse(needle: &BStr, kind: SuffixKind) -> (&BStr, usize) { + let s = Suffix::reverse(needle, kind); + (&needle[..s.pos], s.period) + } + + /// Return all of the non-empty suffixes in the given byte string. + fn suffixes(bytes: &BStr) -> Vec<&BStr> { + (0..bytes.len()).map(|i| &bytes[i..]).collect() + } + + /// Return the lexicographically maximal suffix of the given byte string. + fn naive_maximal_suffix_forward(needle: &BStr) -> &BStr { + let mut sufs = suffixes(needle); + sufs.sort(); + sufs.pop().unwrap() + } + + /// Return the lexicographically maximal suffix of the reverse of the given + /// byte string. + fn naive_maximal_suffix_reverse(needle: &BStr) -> BString { + let mut reversed = needle.to_bstring(); + reversed.reverse_bytes(); + let mut got = naive_maximal_suffix_forward(&reversed).to_bstring(); + got.reverse_bytes(); + got + } + + #[test] + fn suffix_forward() { + macro_rules! assert_suffix_min { + ($given:expr, $expected:expr, $period:expr) => { + let (got_suffix, got_period) = get_suffix_forward( + B($given), + SuffixKind::Minimal, + ); + assert_eq!((B($expected), $period), (got_suffix, got_period)); + }; + } + + macro_rules! assert_suffix_max { + ($given:expr, $expected:expr, $period:expr) => { + let (got_suffix, got_period) = get_suffix_forward( + B($given), + SuffixKind::Maximal, + ); + assert_eq!((B($expected), $period), (got_suffix, got_period)); + }; + } + + assert_suffix_min!("a", "a", 1); + assert_suffix_max!("a", "a", 1); + + assert_suffix_min!("ab", "ab", 2); + assert_suffix_max!("ab", "b", 1); + + assert_suffix_min!("ba", "a", 1); + assert_suffix_max!("ba", "ba", 2); + + assert_suffix_min!("abc", "abc", 3); + assert_suffix_max!("abc", "c", 1); + + assert_suffix_min!("acb", "acb", 3); + assert_suffix_max!("acb", "cb", 2); + + assert_suffix_min!("cba", "a", 1); + assert_suffix_max!("cba", "cba", 3); + + assert_suffix_min!("abcabc", "abcabc", 3); + assert_suffix_max!("abcabc", "cabc", 3); + + assert_suffix_min!("abcabcabc", "abcabcabc", 3); + assert_suffix_max!("abcabcabc", "cabcabc", 3); + + assert_suffix_min!("abczz", "abczz", 5); + assert_suffix_max!("abczz", "zz", 1); + + assert_suffix_min!("zzabc", "abc", 3); + assert_suffix_max!("zzabc", "zzabc", 5); + + assert_suffix_min!("aaa", "aaa", 1); + assert_suffix_max!("aaa", "aaa", 1); + + assert_suffix_min!("foobar", "ar", 2); + assert_suffix_max!("foobar", "r", 1); + } + + #[test] + fn suffix_reverse() { + macro_rules! assert_suffix_min { + ($given:expr, $expected:expr, $period:expr) => { + let (got_suffix, got_period) = get_suffix_reverse( + B($given), + SuffixKind::Minimal, + ); + assert_eq!((B($expected), $period), (got_suffix, got_period)); + }; + } + + macro_rules! assert_suffix_max { + ($given:expr, $expected:expr, $period:expr) => { + let (got_suffix, got_period) = get_suffix_reverse( + B($given), + SuffixKind::Maximal, + ); + assert_eq!((B($expected), $period), (got_suffix, got_period)); + }; + } + + assert_suffix_min!("a", "a", 1); + assert_suffix_max!("a", "a", 1); + + assert_suffix_min!("ab", "a", 1); + assert_suffix_max!("ab", "ab", 2); + + assert_suffix_min!("ba", "ba", 2); + assert_suffix_max!("ba", "b", 1); + + assert_suffix_min!("abc", "a", 1); + assert_suffix_max!("abc", "abc", 3); + + assert_suffix_min!("acb", "a", 1); + assert_suffix_max!("acb", "ac", 2); + + assert_suffix_min!("cba", "cba", 3); + assert_suffix_max!("cba", "c", 1); + + assert_suffix_min!("abcabc", "abca", 3); + assert_suffix_max!("abcabc", "abcabc", 3); + + assert_suffix_min!("abcabcabc", "abcabca", 3); + assert_suffix_max!("abcabcabc", "abcabcabc", 3); + + assert_suffix_min!("abczz", "a", 1); + assert_suffix_max!("abczz", "abczz", 5); + + assert_suffix_min!("zzabc", "zza", 3); + assert_suffix_max!("zzabc", "zz", 1); + + assert_suffix_min!("aaa", "aaa", 1); + assert_suffix_max!("aaa", "aaa", 1); + } + + quickcheck! { + fn qc_suffix_forward_maximal(bytes: Vec) -> bool { + let bytes = BString::from(bytes); + if bytes.is_empty() { + return true; + } + + let (got, _) = get_suffix_forward(&bytes, SuffixKind::Maximal); + let expected = naive_maximal_suffix_forward(&bytes); + got == expected + } + + fn qc_suffix_reverse_maximal(bytes: Vec) -> bool { + let bytes = BString::from(bytes); + if bytes.is_empty() { + return true; + } + + let (got, _) = get_suffix_reverse(&bytes, SuffixKind::Maximal); + let expected = naive_maximal_suffix_reverse(&bytes); + got == expected + } + } +} diff --git a/vendor/bstr/src/slice_index.rs b/vendor/bstr/src/slice_index.rs new file mode 100644 index 0000000000..300ff60b86 --- /dev/null +++ b/vendor/bstr/src/slice_index.rs @@ -0,0 +1,292 @@ +use core::ops; + +use bstr::BStr; + +/// Ensure that callers cannot implement `SliceIndex` by making an +/// umplementable trait its super trait. +pub trait Sealed {} +impl Sealed for usize {} +impl Sealed for ops::Range {} +impl Sealed for ops::RangeTo {} +impl Sealed for ops::RangeFrom {} +impl Sealed for ops::RangeFull {} +impl Sealed for ops::RangeInclusive {} +impl Sealed for ops::RangeToInclusive {} + +/// A trait that parameterizes the different types of indexing a byte string. +/// +/// In general, this trait makes it possible to define generic routines like +/// `get` that can accept either single positions or ranges, and return single +/// bytes or slices, respectively. +/// +/// This trait is sealed such that callers cannot implement it. In general, +/// callers should not need to interact with this trait directly unless you're +/// defining generic functions that index or slice a byte string. +pub trait SliceIndex: Sealed { + /// The output type returned by methods. For indexing by position, this + /// is always a single byte (`u8`). For ranges, this is always a slice + /// (`BStr`). + type Output: ?Sized; + + /// Returns a shared reference to the output at this location, if in + /// bounds. + fn get(self, slice: &BStr) -> Option<&Self::Output>; + + /// Returns a mutable reference to the output at this location, if in + /// bounds. + fn get_mut(self, slice: &mut BStr) -> Option<&mut Self::Output>; + + /// Returns a shared reference to the output at this location, without + /// performing any bounds checking. + unsafe fn get_unchecked(self, slice: &BStr) -> &Self::Output; + + /// Returns a mutable reference to the output at this location, without + /// performing any bounds checking. + unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut Self::Output; + + /// Returns a shared reference to the output at this location, panicking + /// if out of bounds. + fn index(self, slice: &BStr) -> &Self::Output; + + /// Returns a mutable reference to the output at this location, panicking + /// if out of bounds. + fn index_mut(self, slice: &mut BStr) -> &mut Self::Output; +} + +impl SliceIndex for usize { + type Output = u8; + + #[inline] + fn get(self, slice: &BStr) -> Option<&u8> { + slice.as_bytes().get(self) + } + + #[inline] + fn get_mut(self, slice: &mut BStr) -> Option<&mut u8> { + slice.as_bytes_mut().get_mut(self) + } + + #[inline] + unsafe fn get_unchecked(self, slice: &BStr) -> &u8 { + slice.as_bytes().get_unchecked(self) + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut u8 { + slice.as_bytes_mut().get_unchecked_mut(self) + } + + #[inline] + fn index(self, slice: &BStr) -> &u8 { + &slice.as_bytes()[self] + } + + #[inline] + fn index_mut(self, slice: &mut BStr) -> &mut u8 { + &mut slice.as_bytes_mut()[self] + } +} + +impl SliceIndex for ops::Range { + type Output = BStr; + + #[inline] + fn get(self, slice: &BStr) -> Option<&BStr> { + slice.as_bytes().get(self).map(BStr::new) + } + + #[inline] + fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> { + slice.as_bytes_mut().get_mut(self).map(BStr::new_mut) + } + + #[inline] + unsafe fn get_unchecked(self, slice: &BStr) -> &BStr { + BStr::new(slice.as_bytes().get_unchecked(self)) + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr { + BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self)) + } + + #[inline] + fn index(self, slice: &BStr) -> &BStr { + &slice[self] + } + + #[inline] + fn index_mut(self, slice: &mut BStr) -> &mut BStr { + &mut slice[self] + } +} + +impl SliceIndex for ops::RangeTo { + type Output = BStr; + + #[inline] + fn get(self, slice: &BStr) -> Option<&BStr> { + slice.as_bytes().get(self).map(BStr::new) + } + + #[inline] + fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> { + slice.as_bytes_mut().get_mut(self).map(BStr::new_mut) + } + + #[inline] + unsafe fn get_unchecked(self, slice: &BStr) -> &BStr { + BStr::new(slice.as_bytes().get_unchecked(self)) + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr { + BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self)) + } + + #[inline] + fn index(self, slice: &BStr) -> &BStr { + &slice[self] + } + + #[inline] + fn index_mut(self, slice: &mut BStr) -> &mut BStr { + &mut slice[self] + } +} + +impl SliceIndex for ops::RangeFrom { + type Output = BStr; + + #[inline] + fn get(self, slice: &BStr) -> Option<&BStr> { + slice.as_bytes().get(self).map(BStr::new) + } + + #[inline] + fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> { + slice.as_bytes_mut().get_mut(self).map(BStr::new_mut) + } + + #[inline] + unsafe fn get_unchecked(self, slice: &BStr) -> &BStr { + BStr::new(slice.as_bytes().get_unchecked(self)) + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr { + BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self)) + } + + #[inline] + fn index(self, slice: &BStr) -> &BStr { + &slice[self] + } + + #[inline] + fn index_mut(self, slice: &mut BStr) -> &mut BStr { + &mut slice[self] + } +} + +impl SliceIndex for ops::RangeFull { + type Output = BStr; + + #[inline] + fn get(self, slice: &BStr) -> Option<&BStr> { + slice.as_bytes().get(self).map(BStr::new) + } + + #[inline] + fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> { + slice.as_bytes_mut().get_mut(self).map(BStr::new_mut) + } + + #[inline] + unsafe fn get_unchecked(self, slice: &BStr) -> &BStr { + BStr::new(slice.as_bytes().get_unchecked(self)) + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr { + BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self)) + } + + #[inline] + fn index(self, slice: &BStr) -> &BStr { + &slice[self] + } + + #[inline] + fn index_mut(self, slice: &mut BStr) -> &mut BStr { + &mut slice[self] + } +} + +impl SliceIndex for ops::RangeInclusive { + type Output = BStr; + + #[inline] + fn get(self, slice: &BStr) -> Option<&BStr> { + slice.as_bytes().get(self).map(BStr::new) + } + + #[inline] + fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> { + slice.as_bytes_mut().get_mut(self).map(BStr::new_mut) + } + + #[inline] + unsafe fn get_unchecked(self, slice: &BStr) -> &BStr { + BStr::new(slice.as_bytes().get_unchecked(self)) + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr { + BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self)) + } + + #[inline] + fn index(self, slice: &BStr) -> &BStr { + &slice[self] + } + + #[inline] + fn index_mut(self, slice: &mut BStr) -> &mut BStr { + &mut slice[self] + } +} + +impl SliceIndex for ops::RangeToInclusive { + type Output = BStr; + + #[inline] + fn get(self, slice: &BStr) -> Option<&BStr> { + slice.as_bytes().get(self).map(BStr::new) + } + + #[inline] + fn get_mut(self, slice: &mut BStr) -> Option<&mut BStr> { + slice.as_bytes_mut().get_mut(self).map(BStr::new_mut) + } + + #[inline] + unsafe fn get_unchecked(self, slice: &BStr) -> &BStr { + BStr::new(slice.as_bytes().get_unchecked(self)) + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: &mut BStr) -> &mut BStr { + BStr::new_mut(slice.as_bytes_mut().get_unchecked_mut(self)) + } + + #[inline] + fn index(self, slice: &BStr) -> &BStr { + &slice[self] + } + + #[inline] + fn index_mut(self, slice: &mut BStr) -> &mut BStr { + &mut slice[self] + } +} diff --git a/vendor/bstr/src/tests.rs b/vendor/bstr/src/tests.rs new file mode 100644 index 0000000000..f4179fd1d1 --- /dev/null +++ b/vendor/bstr/src/tests.rs @@ -0,0 +1,32 @@ +/// A sequence of tests for checking whether lossy decoding uses the maximal +/// subpart strategy correctly. Namely, if a sequence of otherwise invalid +/// UTF-8 bytes is a valid prefix of a valid UTF-8 sequence, then the entire +/// prefix is replaced by a single replacement codepoint. In all other cases, +/// each invalid byte is replaced by a single replacement codepoint. +/// +/// The first element in each tuple is the expected result of lossy decoding, +/// while the second element is the input given. +pub const LOSSY_TESTS: &[(&str, &[u8])] = &[ + ("a", b"a"), + ("\u{FFFD}", b"\xFF"), + ("\u{FFFD}\u{FFFD}", b"\xFF\xFF"), + ("β\u{FFFD}", b"\xCE\xB2\xFF"), + ("☃\u{FFFD}", b"\xE2\x98\x83\xFF"), + ("𝝱\u{FFFD}", b"\xF0\x9D\x9D\xB1\xFF"), + ("\u{FFFD}\u{FFFD}", b"\xCE\xF0"), + ("\u{FFFD}\u{FFFD}", b"\xCE\xFF"), + ("\u{FFFD}\u{FFFD}", b"\xE2\x98\xF0"), + ("\u{FFFD}\u{FFFD}", b"\xE2\x98\xFF"), + ("\u{FFFD}", b"\xF0\x9D\x9D"), + ("\u{FFFD}\u{FFFD}", b"\xF0\x9D\x9D\xF0"), + ("\u{FFFD}\u{FFFD}", b"\xF0\x9D\x9D\xFF"), + ("\u{FFFD}", b"\xCE"), + ("a\u{FFFD}", b"a\xCE"), + ("\u{FFFD}", b"\xE2\x98"), + ("a\u{FFFD}", b"a\xE2\x98"), + ("\u{FFFD}", b"\xF0\x9D\x9C"), + ("a\u{FFFD}", b"a\xF0\x9D\x9C"), + ("a\u{FFFD}\u{FFFD}\u{FFFD}z", b"a\xED\xA0\x80z"), + ("☃βツ\u{FFFD}", b"\xe2\x98\x83\xce\xb2\xe3\x83\x84\xFF"), + ("a\u{FFFD}\u{FFFD}\u{FFFD}b", b"\x61\xF1\x80\x80\xE1\x80\xC2\x62"), +]; diff --git a/vendor/bstr/src/unicode/data/GraphemeBreakTest.txt b/vendor/bstr/src/unicode/data/GraphemeBreakTest.txt new file mode 100644 index 0000000000..6847953c23 --- /dev/null +++ b/vendor/bstr/src/unicode/data/GraphemeBreakTest.txt @@ -0,0 +1,700 @@ +# GraphemeBreakTest-11.0.0.txt +# Date: 2018-03-18, 13:30:33 GMT +# © 2018 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Default Grapheme_Cluster_Break Test +# +# Format: +# (# )? +# contains hex Unicode code points, with +# ÷ wherever there is a break opportunity, and +# × wherever there is not. +# the format can change, but currently it shows: +# - the sample character name +# - (x) the Grapheme_Cluster_Break property value for the sample character +# - [x] the rule that determines whether there is a break or not, +# as listed in the Rules section of GraphemeBreakTest.html +# +# These samples may be extended or changed in the future. +# +÷ 0020 ÷ 0020 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0020 × 0308 ÷ 0020 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0020 ÷ 000D ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] (CR) ÷ [0.3] +÷ 0020 × 0308 ÷ 000D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0020 ÷ 000A ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] (LF) ÷ [0.3] +÷ 0020 × 0308 ÷ 000A ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0020 ÷ 0001 ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] (Control) ÷ [0.3] +÷ 0020 × 0308 ÷ 0001 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0020 × 034F ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0020 × 0308 × 034F ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0020 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0020 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0020 ÷ 0600 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0020 × 0308 ÷ 0600 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0020 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0020 × 0308 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0020 ÷ 1100 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0020 × 0308 ÷ 1100 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0020 ÷ 1160 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0020 × 0308 ÷ 1160 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0020 ÷ 11A8 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0020 × 0308 ÷ 11A8 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0020 ÷ AC00 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0020 × 0308 ÷ AC00 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0020 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0020 × 0308 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0020 ÷ 231A ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0020 × 0308 ÷ 231A ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0020 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0020 × 0308 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0020 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0020 × 0308 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0020 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] (Other) ÷ [0.3] +÷ 0020 × 0308 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0020 ÷ D800 ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] (Control) ÷ [0.3] +÷ 0020 × 0308 ÷ D800 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 000D ÷ 0020 ÷ # ÷ [0.2] (CR) ÷ [4.0] SPACE (Other) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 000D ÷ 000D ÷ # ÷ [0.2] (CR) ÷ [4.0] (CR) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 000D × 000A ÷ # ÷ [0.2] (CR) × [3.0] (LF) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 000D ÷ 0001 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Control) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 000D ÷ 034F ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 000D ÷ 0308 × 034F ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 000D ÷ 1F1E6 ÷ # ÷ [0.2] (CR) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000D ÷ 0600 ÷ # ÷ [0.2] (CR) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 000D ÷ 0903 ÷ # ÷ [0.2] (CR) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 000D ÷ 0308 × 0903 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 000D ÷ 1100 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 000D ÷ 1160 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1160 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 000D ÷ 11A8 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 11A8 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 000D ÷ AC00 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 000D ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 000D ÷ AC01 ÷ # ÷ [0.2] (CR) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 000D ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 000D ÷ 231A ÷ # ÷ [0.2] (CR) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 000D ÷ 0300 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 000D ÷ 200D ÷ # ÷ [0.2] (CR) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 000D ÷ 0378 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Other) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 000D ÷ D800 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Control) ÷ [0.3] +÷ 000D ÷ 0308 ÷ D800 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 000A ÷ 0020 ÷ # ÷ [0.2] (LF) ÷ [4.0] SPACE (Other) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 000A ÷ 000D ÷ # ÷ [0.2] (LF) ÷ [4.0] (CR) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 000A ÷ 000A ÷ # ÷ [0.2] (LF) ÷ [4.0] (LF) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 000A ÷ 0001 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Control) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 000A ÷ 034F ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 000A ÷ 0308 × 034F ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 000A ÷ 1F1E6 ÷ # ÷ [0.2] (LF) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000A ÷ 0600 ÷ # ÷ [0.2] (LF) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 000A ÷ 0903 ÷ # ÷ [0.2] (LF) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 000A ÷ 0308 × 0903 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 000A ÷ 1100 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 000A ÷ 1160 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1160 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 000A ÷ 11A8 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 11A8 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 000A ÷ AC00 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 000A ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 000A ÷ AC01 ÷ # ÷ [0.2] (LF) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 000A ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 000A ÷ 231A ÷ # ÷ [0.2] (LF) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 000A ÷ 0300 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 000A ÷ 200D ÷ # ÷ [0.2] (LF) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 000A ÷ 0378 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Other) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 000A ÷ D800 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Control) ÷ [0.3] +÷ 000A ÷ 0308 ÷ D800 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0001 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] SPACE (Other) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0001 ÷ 000D ÷ # ÷ [0.2] (Control) ÷ [4.0] (CR) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0001 ÷ 000A ÷ # ÷ [0.2] (Control) ÷ [4.0] (LF) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0001 ÷ 0001 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Control) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0001 ÷ 034F ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0001 ÷ 0308 × 034F ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0001 ÷ 1F1E6 ÷ # ÷ [0.2] (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0001 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0001 ÷ 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0001 ÷ 0308 × 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0001 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0001 ÷ 1160 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 1160 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0001 ÷ 11A8 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 11A8 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0001 ÷ AC00 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0001 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0001 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0001 ÷ 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0001 ÷ 0308 × 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0001 ÷ 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0001 ÷ 0308 × 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0001 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Other) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0001 ÷ D800 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Control) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ D800 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 034F ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 034F × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 034F ÷ 000D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] (CR) ÷ [0.3] +÷ 034F × 0308 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 034F ÷ 000A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] (LF) ÷ [0.3] +÷ 034F × 0308 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 034F ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] (Control) ÷ [0.3] +÷ 034F × 0308 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 034F × 034F ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 034F × 0308 × 034F ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 034F ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 034F × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 034F ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 034F × 0308 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 034F × 0903 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 034F × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 034F ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 034F × 0308 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 034F ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 034F × 0308 ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 034F ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 034F × 0308 ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 034F ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 034F × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 034F ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 034F × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 034F ÷ 231A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 034F × 0308 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 034F × 0300 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 034F × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 034F × 200D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 034F × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 034F ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] (Other) ÷ [0.3] +÷ 034F × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 034F ÷ D800 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] (Control) ÷ [0.3] +÷ 034F × 0308 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 1F1E6 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] (CR) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 1F1E6 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] (LF) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 1F1E6 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] (Control) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 1F1E6 × 034F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 1F1E6 × 0308 × 034F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 1F1E6 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F1E6 ÷ 0600 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0600 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1F1E6 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F1E6 × 0308 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F1E6 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F1E6 ÷ 1160 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1160 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1F1E6 ÷ 11A8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 11A8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1F1E6 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1F1E6 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1F1E6 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 1F1E6 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 1F1E6 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] (Other) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 1F1E6 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] (Control) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0600 × 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] SPACE (Other) ÷ [0.3] +÷ 0600 × 0308 ÷ 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0600 ÷ 000D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] (CR) ÷ [0.3] +÷ 0600 × 0308 ÷ 000D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0600 ÷ 000A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] (LF) ÷ [0.3] +÷ 0600 × 0308 ÷ 000A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0600 ÷ 0001 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] (Control) ÷ [0.3] +÷ 0600 × 0308 ÷ 0001 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0600 × 034F ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0600 × 0308 × 034F ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0600 × 1F1E6 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0600 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0600 × 0600 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0600 × 0308 ÷ 0600 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0600 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0600 × 0308 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0600 × 1100 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0600 × 0308 ÷ 1100 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0600 × 1160 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0600 × 0308 ÷ 1160 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0600 × 11A8 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0600 × 0308 ÷ 11A8 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0600 × AC00 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0600 × 0308 ÷ AC00 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0600 × AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0600 × 0308 ÷ AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0600 × 231A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] WATCH (ExtPict) ÷ [0.3] +÷ 0600 × 0308 ÷ 231A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0600 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0600 × 0308 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0600 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0600 × 0308 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0600 × 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] (Other) ÷ [0.3] +÷ 0600 × 0308 ÷ 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0600 ÷ D800 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] (Control) ÷ [0.3] +÷ 0600 × 0308 ÷ D800 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0903 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0903 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0903 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (CR) ÷ [0.3] +÷ 0903 × 0308 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0903 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (LF) ÷ [0.3] +÷ 0903 × 0308 ÷ 000A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0903 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (Control) ÷ [0.3] +÷ 0903 × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0903 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0903 × 0308 × 034F ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0903 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0903 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0903 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0903 × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0903 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0903 × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0903 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0903 × 0308 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0903 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0903 × 0308 ÷ 1160 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0903 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0903 × 0308 ÷ 11A8 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0903 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0903 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0903 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0903 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0903 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0903 × 0308 ÷ 231A ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0903 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0903 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0903 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0903 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0903 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] (Other) ÷ [0.3] +÷ 0903 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0903 ÷ D800 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (Control) ÷ [0.3] +÷ 0903 × 0308 ÷ D800 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 1100 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1100 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1100 ÷ 000D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (CR) ÷ [0.3] +÷ 1100 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 1100 ÷ 000A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (LF) ÷ [0.3] +÷ 1100 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 1100 ÷ 0001 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (Control) ÷ [0.3] +÷ 1100 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 1100 × 034F ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 1100 × 0308 × 034F ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 1100 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1100 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1100 ÷ 0600 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1100 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1100 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1100 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1100 × 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1100 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1100 × 1160 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1100 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1100 ÷ 11A8 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1100 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1100 × AC00 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1100 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1100 × AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1100 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1100 ÷ 231A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 1100 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 1100 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 1100 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 1100 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 1100 × 0308 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 1100 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] (Other) ÷ [0.3] +÷ 1100 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 1100 ÷ D800 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (Control) ÷ [0.3] +÷ 1100 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 1160 ÷ 0020 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1160 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1160 ÷ 000D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] (CR) ÷ [0.3] +÷ 1160 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 1160 ÷ 000A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] (LF) ÷ [0.3] +÷ 1160 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 1160 ÷ 0001 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] (Control) ÷ [0.3] +÷ 1160 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 1160 × 034F ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 1160 × 0308 × 034F ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 1160 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1160 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1160 ÷ 0600 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1160 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1160 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1160 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1160 ÷ 1100 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1160 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1160 × 1160 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [7.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1160 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1160 × 11A8 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [7.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1160 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1160 ÷ AC00 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1160 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1160 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1160 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1160 ÷ 231A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 1160 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 1160 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 1160 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 1160 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 1160 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 1160 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] (Other) ÷ [0.3] +÷ 1160 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 1160 ÷ D800 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] (Control) ÷ [0.3] +÷ 1160 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 11A8 ÷ 0020 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 11A8 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 11A8 ÷ 000D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] (CR) ÷ [0.3] +÷ 11A8 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 11A8 ÷ 000A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] (LF) ÷ [0.3] +÷ 11A8 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 11A8 ÷ 0001 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] (Control) ÷ [0.3] +÷ 11A8 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 11A8 × 034F ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 11A8 × 0308 × 034F ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 11A8 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 11A8 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 11A8 ÷ 0600 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 11A8 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 11A8 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 11A8 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 11A8 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 11A8 ÷ 1160 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 11A8 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 11A8 × 11A8 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [8.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 11A8 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 11A8 ÷ AC00 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 11A8 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 11A8 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 11A8 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 11A8 ÷ 231A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 11A8 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 11A8 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 11A8 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 11A8 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 11A8 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 11A8 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] (Other) ÷ [0.3] +÷ 11A8 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 11A8 ÷ D800 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] (Control) ÷ [0.3] +÷ 11A8 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ AC00 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ AC00 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ AC00 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] (CR) ÷ [0.3] +÷ AC00 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ AC00 ÷ 000A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] (LF) ÷ [0.3] +÷ AC00 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ AC00 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] (Control) ÷ [0.3] +÷ AC00 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ AC00 × 034F ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ AC00 × 0308 × 034F ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ AC00 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ AC00 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ AC00 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ AC00 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ AC00 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ AC00 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ AC00 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ AC00 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ AC00 × 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ AC00 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ AC00 × 11A8 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ AC00 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ AC00 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ AC00 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ AC00 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ AC00 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ AC00 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ AC00 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ AC00 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ AC00 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ AC00 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ AC00 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ AC00 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] (Other) ÷ [0.3] +÷ AC00 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ AC00 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] (Control) ÷ [0.3] +÷ AC00 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ AC01 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ AC01 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ AC01 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] (CR) ÷ [0.3] +÷ AC01 × 0308 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ AC01 ÷ 000A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] (LF) ÷ [0.3] +÷ AC01 × 0308 ÷ 000A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ AC01 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] (Control) ÷ [0.3] +÷ AC01 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ AC01 × 034F ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ AC01 × 0308 × 034F ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ AC01 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ AC01 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ AC01 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ AC01 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ AC01 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ AC01 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ AC01 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ AC01 × 0308 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ AC01 ÷ 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ AC01 × 0308 ÷ 1160 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ AC01 × 11A8 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [8.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ AC01 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ AC01 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ AC01 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ AC01 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ AC01 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ AC01 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ AC01 × 0308 ÷ 231A ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ AC01 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ AC01 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ AC01 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ AC01 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ AC01 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] (Other) ÷ [0.3] +÷ AC01 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ AC01 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] (Control) ÷ [0.3] +÷ AC01 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 231A ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 231A × 0308 ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 231A ÷ 000D ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (CR) ÷ [0.3] +÷ 231A × 0308 ÷ 000D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 231A ÷ 000A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (LF) ÷ [0.3] +÷ 231A × 0308 ÷ 000A ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 231A ÷ 0001 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (Control) ÷ [0.3] +÷ 231A × 0308 ÷ 0001 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 231A × 034F ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 231A × 0308 × 034F ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 231A ÷ 1F1E6 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 231A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 231A ÷ 0600 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 231A × 0308 ÷ 0600 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 231A × 0903 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 231A × 0308 × 0903 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 231A ÷ 1100 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 231A × 0308 ÷ 1100 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 231A ÷ 1160 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 231A × 0308 ÷ 1160 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 231A ÷ 11A8 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 231A × 0308 ÷ 11A8 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 231A ÷ AC00 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 231A × 0308 ÷ AC00 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 231A ÷ AC01 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 231A × 0308 ÷ AC01 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 231A ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 231A × 0308 ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 231A × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 231A × 0308 × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 231A × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 231A × 0308 × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 231A ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] (Other) ÷ [0.3] +÷ 231A × 0308 ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 231A ÷ D800 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (Control) ÷ [0.3] +÷ 231A × 0308 ÷ D800 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0300 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0300 × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0300 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0300 × 0308 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0300 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0300 × 0308 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0300 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0300 × 0308 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0300 × 034F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0300 × 0308 × 034F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0300 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0300 × 0308 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0300 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0300 × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0300 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0300 × 0308 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0300 ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0300 × 0308 ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0300 ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0300 × 0308 ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0300 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0300 × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0300 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0300 × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0300 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0300 × 0308 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0300 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0300 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0300 × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0300 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0300 × 0308 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 200D ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 200D × 0308 ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 200D ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 200D × 0308 ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 200D ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 200D × 0308 ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 200D ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 200D × 0308 ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 200D × 034F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 200D × 0308 × 034F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 200D ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 200D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 200D ÷ 0600 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 200D × 0308 ÷ 0600 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 200D × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 200D × 0308 × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 200D ÷ 1100 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 200D × 0308 ÷ 1100 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 200D ÷ 1160 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 200D × 0308 ÷ 1160 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 200D ÷ 11A8 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 200D × 0308 ÷ 11A8 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 200D ÷ AC00 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 200D × 0308 ÷ AC00 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 200D ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 200D × 0308 ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 200D ÷ 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 200D × 0308 ÷ 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 200D × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 200D × 0308 × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 200D × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 200D ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 200D × 0308 ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 200D ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 200D × 0308 ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0378 ÷ 0020 ÷ # ÷ [0.2] (Other) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0378 × 0308 ÷ 0020 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0378 ÷ 000D ÷ # ÷ [0.2] (Other) ÷ [5.0] (CR) ÷ [0.3] +÷ 0378 × 0308 ÷ 000D ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ 0378 ÷ 000A ÷ # ÷ [0.2] (Other) ÷ [5.0] (LF) ÷ [0.3] +÷ 0378 × 0308 ÷ 000A ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ 0378 ÷ 0001 ÷ # ÷ [0.2] (Other) ÷ [5.0] (Control) ÷ [0.3] +÷ 0378 × 0308 ÷ 0001 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 0378 × 034F ÷ # ÷ [0.2] (Other) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0378 × 0308 × 034F ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ 0378 ÷ 1F1E6 ÷ # ÷ [0.2] (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0378 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0378 ÷ 0600 ÷ # ÷ [0.2] (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0378 × 0308 ÷ 0600 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0378 × 0903 ÷ # ÷ [0.2] (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0378 × 0308 × 0903 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0378 ÷ 1100 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0378 × 0308 ÷ 1100 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0378 ÷ 1160 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0378 × 0308 ÷ 1160 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0378 ÷ 11A8 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0378 × 0308 ÷ 11A8 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0378 ÷ AC00 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0378 × 0308 ÷ AC00 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0378 ÷ AC01 ÷ # ÷ [0.2] (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0378 × 0308 ÷ AC01 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0378 ÷ 231A ÷ # ÷ [0.2] (Other) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0378 × 0308 ÷ 231A ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0378 × 0300 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0378 × 0308 × 0300 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ 0378 × 200D ÷ # ÷ [0.2] (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0378 × 0308 × 200D ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0378 ÷ 0378 ÷ # ÷ [0.2] (Other) ÷ [999.0] (Other) ÷ [0.3] +÷ 0378 × 0308 ÷ 0378 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ 0378 ÷ D800 ÷ # ÷ [0.2] (Other) ÷ [5.0] (Control) ÷ [0.3] +÷ 0378 × 0308 ÷ D800 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ D800 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] SPACE (Other) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ D800 ÷ 000D ÷ # ÷ [0.2] (Control) ÷ [4.0] (CR) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] +÷ D800 ÷ 000A ÷ # ÷ [0.2] (Control) ÷ [4.0] (LF) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] +÷ D800 ÷ 0001 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Control) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ D800 ÷ 034F ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ D800 ÷ 0308 × 034F ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] +÷ D800 ÷ 1F1E6 ÷ # ÷ [0.2] (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ D800 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ D800 ÷ 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ D800 ÷ 0308 × 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ D800 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ D800 ÷ 1160 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 1160 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ D800 ÷ 11A8 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 11A8 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ D800 ÷ AC00 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ D800 ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ D800 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ D800 ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ D800 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ D800 ÷ 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ D800 ÷ 0308 × 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] +÷ D800 ÷ 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ D800 ÷ 0308 × 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ D800 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Other) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] +÷ D800 ÷ D800 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Control) ÷ [0.3] +÷ D800 ÷ 0308 ÷ D800 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] +÷ 000D × 000A ÷ 0061 ÷ 000A ÷ 0308 ÷ # ÷ [0.2] (CR) × [3.0] (LF) ÷ [4.0] LATIN SMALL LETTER A (Other) ÷ [5.0] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [0.3] +÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [0.3] +÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] ARABIC LETTER NOON (Other) ÷ [0.3] +÷ 0646 × 200D ÷ 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1100 × 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ AC00 × 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ AC01 × 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [8.0] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [12.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 × 200D ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 200D ÷ 1F1E7 × 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 × 1F1E9 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER D (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] +÷ 0061 × 0308 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 × 0903 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 0600 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) × [9.2] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 1F476 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3] +÷ 0061 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) ÷ [0.3] +÷ 0061 × 1F3FF ÷ 1F476 × 200D × 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 1F476 × 1F3FF × 0308 × 200D × 1F476 × 1F3FF ÷ # ÷ [0.2] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] BABY (ExtPict) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [0.3] +÷ 1F6D1 × 200D × 1F6D1 ÷ # ÷ [0.2] OCTAGONAL SIGN (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 0061 × 200D ÷ 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 2701 × 200D × 2701 ÷ # ÷ [0.2] UPPER BLADE SCISSORS (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] +÷ 0061 × 200D ÷ 2701 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] +# +# Lines: 672 +# +# EOF diff --git a/vendor/bstr/src/unicode/data/SentenceBreakTest.txt b/vendor/bstr/src/unicode/data/SentenceBreakTest.txt new file mode 100644 index 0000000000..70898a3177 --- /dev/null +++ b/vendor/bstr/src/unicode/data/SentenceBreakTest.txt @@ -0,0 +1,530 @@ +# SentenceBreakTest-11.0.0.txt +# Date: 2018-01-31, 08:20:29 GMT +# © 2018 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Default Sentence_Break Test +# +# Format: +# (# )? +# contains hex Unicode code points, with +# ÷ wherever there is a break opportunity, and +# × wherever there is not. +# the format can change, but currently it shows: +# - the sample character name +# - (x) the Sentence_Break property value for the sample character +# - [x] the rule that determines whether there is a break or not, +# as listed in the Rules section of SentenceBreakTest.html +# +# These samples may be extended or changed in the future. +# +÷ 0001 × 0001 ÷ # ÷ [0.2] (Other) × [998.0] (Other) ÷ [0.3] +÷ 0001 × 0308 × 0001 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 0001 × 000D ÷ # ÷ [0.2] (Other) × [998.0] (CR) ÷ [0.3] +÷ 0001 × 0308 × 000D ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 0001 × 000A ÷ # ÷ [0.2] (Other) × [998.0] (LF) ÷ [0.3] +÷ 0001 × 0308 × 000A ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 0001 × 0085 ÷ # ÷ [0.2] (Other) × [998.0] (Sep) ÷ [0.3] +÷ 0001 × 0308 × 0085 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 0001 × 0009 ÷ # ÷ [0.2] (Other) × [998.0] (Sp) ÷ [0.3] +÷ 0001 × 0308 × 0009 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 0001 × 0061 ÷ # ÷ [0.2] (Other) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0001 × 0308 × 0061 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0001 × 0041 ÷ # ÷ [0.2] (Other) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0001 × 0308 × 0041 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0001 × 01BB ÷ # ÷ [0.2] (Other) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0001 × 0308 × 01BB ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0001 × 0030 ÷ # ÷ [0.2] (Other) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0001 × 0308 × 0030 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0001 × 002E ÷ # ÷ [0.2] (Other) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0001 × 0308 × 002E ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0001 × 0021 ÷ # ÷ [0.2] (Other) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0001 × 0308 × 0021 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0001 × 0022 ÷ # ÷ [0.2] (Other) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0001 × 0308 × 0022 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0001 × 002C ÷ # ÷ [0.2] (Other) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0001 × 0308 × 002C ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0001 × 00AD ÷ # ÷ [0.2] (Other) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0001 × 0308 × 00AD ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0001 × 0300 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0001 × 0308 × 0300 ÷ # ÷ [0.2] (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000D ÷ 0001 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Other) ÷ [0.3] +÷ 000D ÷ 0308 × 0001 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 000D ÷ 000D ÷ # ÷ [0.2] (CR) ÷ [4.0] (CR) ÷ [0.3] +÷ 000D ÷ 0308 × 000D ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 000D × 000A ÷ # ÷ [0.2] (CR) × [3.0] (LF) ÷ [0.3] +÷ 000D ÷ 0308 × 000A ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 000D ÷ 0085 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Sep) ÷ [0.3] +÷ 000D ÷ 0308 × 0085 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 000D ÷ 0009 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Sp) ÷ [0.3] +÷ 000D ÷ 0308 × 0009 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 000D ÷ 0061 ÷ # ÷ [0.2] (CR) ÷ [4.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 000D ÷ 0308 × 0061 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 000D ÷ 0041 ÷ # ÷ [0.2] (CR) ÷ [4.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 000D ÷ 0308 × 0041 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 000D ÷ 01BB ÷ # ÷ [0.2] (CR) ÷ [4.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 000D ÷ 0308 × 01BB ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 000D ÷ 0030 ÷ # ÷ [0.2] (CR) ÷ [4.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000D ÷ 0308 × 0030 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000D ÷ 002E ÷ # ÷ [0.2] (CR) ÷ [4.0] FULL STOP (ATerm) ÷ [0.3] +÷ 000D ÷ 0308 × 002E ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 000D ÷ 0021 ÷ # ÷ [0.2] (CR) ÷ [4.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 000D ÷ 0308 × 0021 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 000D ÷ 0022 ÷ # ÷ [0.2] (CR) ÷ [4.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 000D ÷ 0308 × 0022 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 000D ÷ 002C ÷ # ÷ [0.2] (CR) ÷ [4.0] COMMA (SContinue) ÷ [0.3] +÷ 000D ÷ 0308 × 002C ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 000D ÷ 00AD ÷ # ÷ [0.2] (CR) ÷ [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000D ÷ 0308 × 00AD ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000D ÷ 0300 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000A ÷ 0001 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Other) ÷ [0.3] +÷ 000A ÷ 0308 × 0001 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 000A ÷ 000D ÷ # ÷ [0.2] (LF) ÷ [4.0] (CR) ÷ [0.3] +÷ 000A ÷ 0308 × 000D ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 000A ÷ 000A ÷ # ÷ [0.2] (LF) ÷ [4.0] (LF) ÷ [0.3] +÷ 000A ÷ 0308 × 000A ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 000A ÷ 0085 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Sep) ÷ [0.3] +÷ 000A ÷ 0308 × 0085 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 000A ÷ 0009 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Sp) ÷ [0.3] +÷ 000A ÷ 0308 × 0009 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 000A ÷ 0061 ÷ # ÷ [0.2] (LF) ÷ [4.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 000A ÷ 0308 × 0061 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 000A ÷ 0041 ÷ # ÷ [0.2] (LF) ÷ [4.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 000A ÷ 0308 × 0041 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 000A ÷ 01BB ÷ # ÷ [0.2] (LF) ÷ [4.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 000A ÷ 0308 × 01BB ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 000A ÷ 0030 ÷ # ÷ [0.2] (LF) ÷ [4.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000A ÷ 0308 × 0030 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000A ÷ 002E ÷ # ÷ [0.2] (LF) ÷ [4.0] FULL STOP (ATerm) ÷ [0.3] +÷ 000A ÷ 0308 × 002E ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 000A ÷ 0021 ÷ # ÷ [0.2] (LF) ÷ [4.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 000A ÷ 0308 × 0021 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 000A ÷ 0022 ÷ # ÷ [0.2] (LF) ÷ [4.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 000A ÷ 0308 × 0022 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 000A ÷ 002C ÷ # ÷ [0.2] (LF) ÷ [4.0] COMMA (SContinue) ÷ [0.3] +÷ 000A ÷ 0308 × 002C ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 000A ÷ 00AD ÷ # ÷ [0.2] (LF) ÷ [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000A ÷ 0308 × 00AD ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000A ÷ 0300 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0085 ÷ 0001 ÷ # ÷ [0.2] (Sep) ÷ [4.0] (Other) ÷ [0.3] +÷ 0085 ÷ 0308 × 0001 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 0085 ÷ 000D ÷ # ÷ [0.2] (Sep) ÷ [4.0] (CR) ÷ [0.3] +÷ 0085 ÷ 0308 × 000D ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 0085 ÷ 000A ÷ # ÷ [0.2] (Sep) ÷ [4.0] (LF) ÷ [0.3] +÷ 0085 ÷ 0308 × 000A ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 0085 ÷ 0085 ÷ # ÷ [0.2] (Sep) ÷ [4.0] (Sep) ÷ [0.3] +÷ 0085 ÷ 0308 × 0085 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 0085 ÷ 0009 ÷ # ÷ [0.2] (Sep) ÷ [4.0] (Sp) ÷ [0.3] +÷ 0085 ÷ 0308 × 0009 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 0085 ÷ 0061 ÷ # ÷ [0.2] (Sep) ÷ [4.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0085 ÷ 0308 × 0061 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0085 ÷ 0041 ÷ # ÷ [0.2] (Sep) ÷ [4.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0085 ÷ 0308 × 0041 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0085 ÷ 01BB ÷ # ÷ [0.2] (Sep) ÷ [4.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0085 ÷ 0308 × 01BB ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0085 ÷ 0030 ÷ # ÷ [0.2] (Sep) ÷ [4.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0085 ÷ 0308 × 0030 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0085 ÷ 002E ÷ # ÷ [0.2] (Sep) ÷ [4.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0085 ÷ 0308 × 002E ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0085 ÷ 0021 ÷ # ÷ [0.2] (Sep) ÷ [4.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0085 ÷ 0308 × 0021 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0085 ÷ 0022 ÷ # ÷ [0.2] (Sep) ÷ [4.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0085 ÷ 0308 × 0022 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0085 ÷ 002C ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMMA (SContinue) ÷ [0.3] +÷ 0085 ÷ 0308 × 002C ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0085 ÷ 00AD ÷ # ÷ [0.2] (Sep) ÷ [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0085 ÷ 0308 × 00AD ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0085 ÷ 0300 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0085 ÷ 0308 × 0300 ÷ # ÷ [0.2] (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0009 × 0001 ÷ # ÷ [0.2] (Sp) × [998.0] (Other) ÷ [0.3] +÷ 0009 × 0308 × 0001 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 0009 × 000D ÷ # ÷ [0.2] (Sp) × [998.0] (CR) ÷ [0.3] +÷ 0009 × 0308 × 000D ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 0009 × 000A ÷ # ÷ [0.2] (Sp) × [998.0] (LF) ÷ [0.3] +÷ 0009 × 0308 × 000A ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 0009 × 0085 ÷ # ÷ [0.2] (Sp) × [998.0] (Sep) ÷ [0.3] +÷ 0009 × 0308 × 0085 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 0009 × 0009 ÷ # ÷ [0.2] (Sp) × [998.0] (Sp) ÷ [0.3] +÷ 0009 × 0308 × 0009 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 0009 × 0061 ÷ # ÷ [0.2] (Sp) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0009 × 0308 × 0061 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0009 × 0041 ÷ # ÷ [0.2] (Sp) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0009 × 0308 × 0041 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0009 × 01BB ÷ # ÷ [0.2] (Sp) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0009 × 0308 × 01BB ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0009 × 0030 ÷ # ÷ [0.2] (Sp) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0009 × 0308 × 0030 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0009 × 002E ÷ # ÷ [0.2] (Sp) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0009 × 0308 × 002E ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0009 × 0021 ÷ # ÷ [0.2] (Sp) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0009 × 0308 × 0021 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0009 × 0022 ÷ # ÷ [0.2] (Sp) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0009 × 0308 × 0022 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0009 × 002C ÷ # ÷ [0.2] (Sp) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0009 × 0308 × 002C ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0009 × 00AD ÷ # ÷ [0.2] (Sp) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0009 × 0308 × 00AD ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0009 × 0300 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0009 × 0308 × 0300 ÷ # ÷ [0.2] (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] (Other) ÷ [0.3] +÷ 0061 × 0308 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 0061 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] (CR) ÷ [0.3] +÷ 0061 × 0308 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 0061 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] (LF) ÷ [0.3] +÷ 0061 × 0308 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 0061 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] (Sep) ÷ [0.3] +÷ 0061 × 0308 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 0061 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] (Sp) ÷ [0.3] +÷ 0061 × 0308 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 0061 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0061 × 0308 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0061 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0061 × 0308 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0061 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0061 × 0308 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0061 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 × 0308 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0061 × 0308 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0061 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0061 × 0308 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0061 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0061 × 0308 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0061 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0061 × 0308 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0061 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0041 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] (Other) ÷ [0.3] +÷ 0041 × 0308 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 0041 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] (CR) ÷ [0.3] +÷ 0041 × 0308 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 0041 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] (LF) ÷ [0.3] +÷ 0041 × 0308 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 0041 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] (Sep) ÷ [0.3] +÷ 0041 × 0308 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 0041 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] (Sp) ÷ [0.3] +÷ 0041 × 0308 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 0041 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0041 × 0308 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0041 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0041 × 0308 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0041 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0041 × 0308 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0041 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0041 × 0308 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0041 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0041 × 0308 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0041 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0041 × 0308 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0041 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0041 × 0308 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0041 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0041 × 0308 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0041 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0041 × 0308 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0041 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0041 × 0308 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 01BB × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] (Other) ÷ [0.3] +÷ 01BB × 0308 × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 01BB × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] (CR) ÷ [0.3] +÷ 01BB × 0308 × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 01BB × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] (LF) ÷ [0.3] +÷ 01BB × 0308 × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 01BB × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] (Sep) ÷ [0.3] +÷ 01BB × 0308 × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 01BB × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] (Sp) ÷ [0.3] +÷ 01BB × 0308 × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 01BB × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 01BB × 0308 × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 01BB × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 01BB × 0308 × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 01BB × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 01BB × 0308 × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 01BB × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 01BB × 0308 × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 01BB × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 01BB × 0308 × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 01BB × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 01BB × 0308 × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 01BB × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 01BB × 0308 × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 01BB × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 01BB × 0308 × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 01BB × 00AD ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 01BB × 0308 × 00AD ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 01BB × 0300 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 01BB × 0308 × 0300 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0030 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] (Other) ÷ [0.3] +÷ 0030 × 0308 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 0030 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] (CR) ÷ [0.3] +÷ 0030 × 0308 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 0030 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] (LF) ÷ [0.3] +÷ 0030 × 0308 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 0030 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] (Sep) ÷ [0.3] +÷ 0030 × 0308 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 0030 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] (Sp) ÷ [0.3] +÷ 0030 × 0308 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 0030 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0030 × 0308 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0030 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0030 × 0308 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0030 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0030 × 0308 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0030 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0030 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0030 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0030 × 0308 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0030 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0030 × 0308 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0030 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0030 × 0308 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0030 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0030 × 0308 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0030 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0030 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0030 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0030 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002E ÷ 0001 ÷ # ÷ [0.2] FULL STOP (ATerm) ÷ [11.0] (Other) ÷ [0.3] +÷ 002E × 0308 ÷ 0001 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] (Other) ÷ [0.3] +÷ 002E × 000D ÷ # ÷ [0.2] FULL STOP (ATerm) × [9.0] (CR) ÷ [0.3] +÷ 002E × 0308 × 000D ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] (CR) ÷ [0.3] +÷ 002E × 000A ÷ # ÷ [0.2] FULL STOP (ATerm) × [9.0] (LF) ÷ [0.3] +÷ 002E × 0308 × 000A ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] (LF) ÷ [0.3] +÷ 002E × 0085 ÷ # ÷ [0.2] FULL STOP (ATerm) × [9.0] (Sep) ÷ [0.3] +÷ 002E × 0308 × 0085 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] (Sep) ÷ [0.3] +÷ 002E × 0009 ÷ # ÷ [0.2] FULL STOP (ATerm) × [9.0] (Sp) ÷ [0.3] +÷ 002E × 0308 × 0009 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] (Sp) ÷ [0.3] +÷ 002E × 0061 ÷ # ÷ [0.2] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 002E × 0308 × 0061 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 002E ÷ 0041 ÷ # ÷ [0.2] FULL STOP (ATerm) ÷ [11.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 002E × 0308 ÷ 0041 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 002E ÷ 01BB ÷ # ÷ [0.2] FULL STOP (ATerm) ÷ [11.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 002E × 0308 ÷ 01BB ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 002E × 0030 ÷ # ÷ [0.2] FULL STOP (ATerm) × [6.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002E × 0308 × 0030 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [6.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002E × 002E ÷ # ÷ [0.2] FULL STOP (ATerm) × [8.1] FULL STOP (ATerm) ÷ [0.3] +÷ 002E × 0308 × 002E ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.1] FULL STOP (ATerm) ÷ [0.3] +÷ 002E × 0021 ÷ # ÷ [0.2] FULL STOP (ATerm) × [8.1] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 002E × 0308 × 0021 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.1] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 002E × 0022 ÷ # ÷ [0.2] FULL STOP (ATerm) × [9.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 002E × 0308 × 0022 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 002E × 002C ÷ # ÷ [0.2] FULL STOP (ATerm) × [8.1] COMMA (SContinue) ÷ [0.3] +÷ 002E × 0308 × 002C ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.1] COMMA (SContinue) ÷ [0.3] +÷ 002E × 00AD ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 002E × 0308 × 00AD ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 002E × 0300 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002E × 0308 × 0300 ÷ # ÷ [0.2] FULL STOP (ATerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0021 ÷ 0001 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) ÷ [11.0] (Other) ÷ [0.3] +÷ 0021 × 0308 ÷ 0001 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] (Other) ÷ [0.3] +÷ 0021 × 000D ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [9.0] (CR) ÷ [0.3] +÷ 0021 × 0308 × 000D ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] (CR) ÷ [0.3] +÷ 0021 × 000A ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [9.0] (LF) ÷ [0.3] +÷ 0021 × 0308 × 000A ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] (LF) ÷ [0.3] +÷ 0021 × 0085 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [9.0] (Sep) ÷ [0.3] +÷ 0021 × 0308 × 0085 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] (Sep) ÷ [0.3] +÷ 0021 × 0009 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [9.0] (Sp) ÷ [0.3] +÷ 0021 × 0308 × 0009 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] (Sp) ÷ [0.3] +÷ 0021 ÷ 0061 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) ÷ [11.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0021 × 0308 ÷ 0061 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0021 ÷ 0041 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) ÷ [11.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0021 × 0308 ÷ 0041 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0021 ÷ 01BB ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) ÷ [11.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0021 × 0308 ÷ 01BB ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0021 ÷ 0030 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) ÷ [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0021 × 0308 ÷ 0030 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0021 × 002E ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [8.1] FULL STOP (ATerm) ÷ [0.3] +÷ 0021 × 0308 × 002E ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.1] FULL STOP (ATerm) ÷ [0.3] +÷ 0021 × 0021 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [8.1] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0021 × 0308 × 0021 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.1] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0021 × 0022 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [9.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0021 × 0308 × 0022 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [9.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0021 × 002C ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [8.1] COMMA (SContinue) ÷ [0.3] +÷ 0021 × 0308 × 002C ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.1] COMMA (SContinue) ÷ [0.3] +÷ 0021 × 00AD ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0021 × 0308 × 00AD ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0021 × 0300 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0021 × 0308 × 0300 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0022 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] (Other) ÷ [0.3] +÷ 0022 × 0308 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 0022 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] (CR) ÷ [0.3] +÷ 0022 × 0308 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 0022 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] (LF) ÷ [0.3] +÷ 0022 × 0308 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 0022 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] (Sep) ÷ [0.3] +÷ 0022 × 0308 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 0022 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] (Sp) ÷ [0.3] +÷ 0022 × 0308 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 0022 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0022 × 0308 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0022 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0022 × 0308 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0022 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0022 × 0308 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0022 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0022 × 0308 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0022 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0022 × 0308 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0022 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0022 × 0308 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0022 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0022 × 0308 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0022 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0022 × 0308 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0022 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0022 × 0308 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0022 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0022 × 0308 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002C × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] (Other) ÷ [0.3] +÷ 002C × 0308 × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 002C × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] (CR) ÷ [0.3] +÷ 002C × 0308 × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 002C × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] (LF) ÷ [0.3] +÷ 002C × 0308 × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 002C × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] (Sep) ÷ [0.3] +÷ 002C × 0308 × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 002C × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] (Sp) ÷ [0.3] +÷ 002C × 0308 × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 002C × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 002C × 0308 × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 002C × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 002C × 0308 × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 002C × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 002C × 0308 × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 002C × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002C × 0308 × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002C × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 002C × 0308 × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 002C × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 002C × 0308 × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 002C × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 002C × 0308 × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 002C × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 002C × 0308 × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 002C × 00AD ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 002C × 0300 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 00AD × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] (Other) ÷ [0.3] +÷ 00AD × 0308 × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 00AD × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] (CR) ÷ [0.3] +÷ 00AD × 0308 × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 00AD × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] (LF) ÷ [0.3] +÷ 00AD × 0308 × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 00AD × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] (Sep) ÷ [0.3] +÷ 00AD × 0308 × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 00AD × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] (Sp) ÷ [0.3] +÷ 00AD × 0308 × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 00AD × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 00AD × 0308 × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 00AD × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 00AD × 0308 × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 00AD × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 00AD × 0308 × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 00AD × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 00AD × 0308 × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 00AD × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 00AD × 0308 × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 00AD × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 00AD × 0308 × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 00AD × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 00AD × 0308 × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 00AD × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 00AD × 0308 × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 00AD × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 00AD × 0308 × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 00AD × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 00AD × 0308 × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0300 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 0300 × 0308 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Other) ÷ [0.3] +÷ 0300 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 0300 × 0308 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (CR) ÷ [0.3] +÷ 0300 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 0300 × 0308 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (LF) ÷ [0.3] +÷ 0300 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 0300 × 0308 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sep) ÷ [0.3] +÷ 0300 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 0300 × 0308 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] (Sp) ÷ [0.3] +÷ 0300 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0300 × 0308 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0300 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0300 × 0308 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0300 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0300 × 0308 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0300 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0300 × 0308 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0300 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0300 × 0308 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0300 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0300 × 0308 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0300 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0300 × 0308 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0300 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0300 × 0308 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0300 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0300 × 0308 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000D × 000A ÷ 0061 × 000A ÷ 0308 ÷ # ÷ [0.2] (CR) × [3.0] (LF) ÷ [4.0] LATIN SMALL LETTER A (Lower) × [998.0] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [0.3] +÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [0.3] +÷ 0020 × 200D × 0646 ÷ # ÷ [0.2] SPACE (Sp) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [998.0] ARABIC LETTER NOON (OLetter) ÷ [0.3] +÷ 0646 × 200D × 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (OLetter) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [998.0] SPACE (Sp) ÷ [0.3] +÷ 0028 × 0022 × 0047 × 006F × 002E × 0022 × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [998.0] QUOTATION MARK (Close) × [998.0] LATIN CAPITAL LETTER G (Upper) × [998.0] LATIN SMALL LETTER O (Lower) × [998.0] FULL STOP (ATerm) × [9.0] QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [998.0] LATIN CAPITAL LETTER H (Upper) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] LATIN SMALL LETTER I (Lower) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3] +÷ 0028 × 201C × 0047 × 006F × 003F × 201D × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [998.0] LEFT DOUBLE QUOTATION MARK (Close) × [998.0] LATIN CAPITAL LETTER G (Upper) × [998.0] LATIN SMALL LETTER O (Lower) × [998.0] QUESTION MARK (STerm) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [998.0] LATIN CAPITAL LETTER H (Upper) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] LATIN SMALL LETTER I (Lower) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3] +÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E × 0020 × 0069 × 0073 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER I (Lower) × [998.0] LATIN SMALL LETTER S (Lower) ÷ [0.3] +÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 003F × 0020 ÷ 0048 × 0065 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] QUESTION MARK (STerm) × [9.0] SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0033 × 002E × 0034 ÷ # ÷ [0.2] DIGIT THREE (Numeric) × [998.0] FULL STOP (ATerm) × [6.0] DIGIT FOUR (Numeric) ÷ [0.3] +÷ 0063 × 002E × 0064 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3] +÷ 0043 × 002E × 0064 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [998.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3] +÷ 0063 × 002E × 0044 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3] +÷ 0043 × 002E × 0044 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 2018 × 0028 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [998.0] LEFT PARENTHESIS (Close) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 2018 × 0028 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [998.0] LEFT PARENTHESIS (Close) × [998.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 000A ÷ 0308 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0074 × 0068 × 0065 × 0020 × 0072 × 0065 × 0073 × 0070 × 002E × 0020 × 006C × 0065 × 0061 × 0064 × 0065 × 0072 × 0073 × 0020 × 0061 × 0072 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER R (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER S (Lower) × [998.0] LATIN SMALL LETTER P (Lower) × [998.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER L (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER A (Lower) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER R (Lower) × [998.0] LATIN SMALL LETTER S (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER A (Lower) × [998.0] LATIN SMALL LETTER R (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 5B57 × 002E ÷ 5B57 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [998.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E ÷ 5B83 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 3002 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.1] IDEOGRAPHIC FULL STOP (STerm) ÷ [0.3] +÷ 5B57 × 3002 ÷ 5B83 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [998.0] IDEOGRAPHIC FULL STOP (STerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3] +÷ 0021 × 0020 × 0020 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [9.0] SPACE (Sp) × [10.0] SPACE (Sp) ÷ [0.3] +÷ 2060 × 0028 × 2060 × 0022 × 2060 × 0047 × 2060 × 006F × 2060 × 002E × 2060 × 0022 × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0028 × 2060 × 201C × 2060 × 0047 × 2060 × 006F × 2060 × 003F × 2060 × 201D × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LEFT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 0020 × 2060 × 0069 × 2060 × 0073 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 003F × 2060 × 0020 × 2060 ÷ 0048 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0033 × 2060 × 002E × 2060 × 0034 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] DIGIT THREE (Numeric) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [6.0] DIGIT FOUR (Numeric) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0063 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0043 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0063 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0043 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 2018 × 2060 × 0028 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 2018 × 2060 × 0028 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 000A ÷ 2060 × 0308 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] (LF) ÷ [4.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 0020 × 2060 × 0072 × 2060 × 0065 × 2060 × 0073 × 2060 × 0070 × 2060 × 002E × 2060 × 0020 × 2060 × 006C × 2060 × 0065 × 2060 × 0061 × 2060 × 0064 × 2060 × 0065 × 2060 × 0072 × 2060 × 0073 × 2060 × 0020 × 2060 × 0061 × 2060 × 0072 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER P (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER L (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 5B57 × 2060 × 002E × 2060 ÷ 5B57 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 3002 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.1] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 5B57 × 2060 × 3002 × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [998.0] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0021 × 2060 × 0020 × 2060 × 0020 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] EXCLAMATION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [10.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +# +# Lines: 502 +# +# EOF diff --git a/vendor/bstr/src/unicode/data/WordBreakTest.txt b/vendor/bstr/src/unicode/data/WordBreakTest.txt new file mode 100644 index 0000000000..c4c92550ec --- /dev/null +++ b/vendor/bstr/src/unicode/data/WordBreakTest.txt @@ -0,0 +1,1851 @@ +# WordBreakTest-11.0.0.txt +# Date: 2018-03-16, 20:34:16 GMT +# © 2018 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Default Word_Break Test +# +# Format: +# (# )? +# contains hex Unicode code points, with +# ÷ wherever there is a break opportunity, and +# × wherever there is not. +# the format can change, but currently it shows: +# - the sample character name +# - (x) the Word_Break property value for the sample character +# - [x] the rule that determines whether there is a break or not, +# as listed in the Rules section of WordBreakTest.html +# +# These samples may be extended or changed in the future. +# +÷ 0001 ÷ 0001 ÷ # ÷ [0.2] (Other) ÷ [999.0] (Other) ÷ [0.3] +÷ 0001 × 0308 ÷ 0001 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0001 ÷ 000D ÷ # ÷ [0.2] (Other) ÷ [3.2] (CR) ÷ [0.3] +÷ 0001 × 0308 ÷ 000D ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0001 ÷ 000A ÷ # ÷ [0.2] (Other) ÷ [3.2] (LF) ÷ [0.3] +÷ 0001 × 0308 ÷ 000A ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0001 ÷ 000B ÷ # ÷ [0.2] (Other) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0001 × 0308 ÷ 000B ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0001 ÷ 3031 ÷ # ÷ [0.2] (Other) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0001 × 0308 ÷ 3031 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0001 ÷ 0041 ÷ # ÷ [0.2] (Other) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0001 × 0308 ÷ 0041 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0001 ÷ 003A ÷ # ÷ [0.2] (Other) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0001 × 0308 ÷ 003A ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0001 ÷ 002C ÷ # ÷ [0.2] (Other) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0001 × 0308 ÷ 002C ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0001 ÷ 002E ÷ # ÷ [0.2] (Other) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0001 × 0308 ÷ 002E ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0001 ÷ 0030 ÷ # ÷ [0.2] (Other) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0001 × 0308 ÷ 0030 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0001 ÷ 005F ÷ # ÷ [0.2] (Other) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0001 × 0308 ÷ 005F ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0001 ÷ 1F1E6 ÷ # ÷ [0.2] (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0001 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0001 ÷ 05D0 ÷ # ÷ [0.2] (Other) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0001 × 0308 ÷ 05D0 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0001 ÷ 0022 ÷ # ÷ [0.2] (Other) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0001 × 0308 ÷ 0022 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0001 ÷ 0027 ÷ # ÷ [0.2] (Other) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0001 × 0308 ÷ 0027 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0001 ÷ 231A ÷ # ÷ [0.2] (Other) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0001 × 0308 ÷ 231A ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0001 ÷ 0020 ÷ # ÷ [0.2] (Other) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0001 × 0308 ÷ 0020 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0001 × 00AD ÷ # ÷ [0.2] (Other) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0001 × 0308 × 00AD ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0001 × 0300 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0001 × 0308 × 0300 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0001 × 200D ÷ # ÷ [0.2] (Other) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0001 × 0308 × 200D ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0001 ÷ 0061 × 2060 ÷ # ÷ [0.2] (Other) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0001 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0001 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] (Other) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0001 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0001 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] (Other) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0001 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0001 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] (Other) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0001 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0001 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] (Other) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0001 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0001 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] (Other) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0001 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0001 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] (Other) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0001 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0001 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] (Other) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0001 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0001 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] (Other) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0001 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000D ÷ 0001 ÷ # ÷ [0.2] (CR) ÷ [3.1] (Other) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 000D ÷ 000D ÷ # ÷ [0.2] (CR) ÷ [3.1] (CR) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 000D × 000A ÷ # ÷ [0.2] (CR) × [3.0] (LF) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 000D ÷ 000B ÷ # ÷ [0.2] (CR) ÷ [3.1] (Newline) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 000B ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 000D ÷ 3031 ÷ # ÷ [0.2] (CR) ÷ [3.1] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 3031 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 000D ÷ 0041 ÷ # ÷ [0.2] (CR) ÷ [3.1] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0041 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 000D ÷ 003A ÷ # ÷ [0.2] (CR) ÷ [3.1] COLON (MidLetter) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 003A ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000D ÷ 002C ÷ # ÷ [0.2] (CR) ÷ [3.1] COMMA (MidNum) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 002C ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000D ÷ 002E ÷ # ÷ [0.2] (CR) ÷ [3.1] FULL STOP (MidNumLet) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 002E ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 000D ÷ 0030 ÷ # ÷ [0.2] (CR) ÷ [3.1] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0030 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000D ÷ 005F ÷ # ÷ [0.2] (CR) ÷ [3.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 005F ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 000D ÷ 1F1E6 ÷ # ÷ [0.2] (CR) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000D ÷ 05D0 ÷ # ÷ [0.2] (CR) ÷ [3.1] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 05D0 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 000D ÷ 0022 ÷ # ÷ [0.2] (CR) ÷ [3.1] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0022 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 000D ÷ 0027 ÷ # ÷ [0.2] (CR) ÷ [3.1] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0027 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000D ÷ 231A ÷ # ÷ [0.2] (CR) ÷ [3.1] WATCH (ExtPict) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 000D ÷ 0020 ÷ # ÷ [0.2] (CR) ÷ [3.1] SPACE (WSegSpace) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 000D ÷ 00AD ÷ # ÷ [0.2] (CR) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000D ÷ 0308 × 00AD ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000D ÷ 0300 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000D ÷ 200D ÷ # ÷ [0.2] (CR) ÷ [3.1] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 000D ÷ 0061 × 2060 ÷ # ÷ [0.2] (CR) ÷ [3.1] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000D ÷ 0061 ÷ 003A ÷ # ÷ [0.2] (CR) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000D ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] (CR) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000D ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] (CR) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000D ÷ 0061 ÷ 002C ÷ # ÷ [0.2] (CR) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000D ÷ 0031 ÷ 003A ÷ # ÷ [0.2] (CR) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000D ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] (CR) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000D ÷ 0031 ÷ 002C ÷ # ÷ [0.2] (CR) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000D ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] (CR) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000A ÷ 0001 ÷ # ÷ [0.2] (LF) ÷ [3.1] (Other) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 000A ÷ 000D ÷ # ÷ [0.2] (LF) ÷ [3.1] (CR) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 000A ÷ 000A ÷ # ÷ [0.2] (LF) ÷ [3.1] (LF) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 000A ÷ 000B ÷ # ÷ [0.2] (LF) ÷ [3.1] (Newline) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 000B ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 000A ÷ 3031 ÷ # ÷ [0.2] (LF) ÷ [3.1] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 3031 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 000A ÷ 0041 ÷ # ÷ [0.2] (LF) ÷ [3.1] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0041 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 000A ÷ 003A ÷ # ÷ [0.2] (LF) ÷ [3.1] COLON (MidLetter) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 003A ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000A ÷ 002C ÷ # ÷ [0.2] (LF) ÷ [3.1] COMMA (MidNum) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 002C ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000A ÷ 002E ÷ # ÷ [0.2] (LF) ÷ [3.1] FULL STOP (MidNumLet) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 002E ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 000A ÷ 0030 ÷ # ÷ [0.2] (LF) ÷ [3.1] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0030 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000A ÷ 005F ÷ # ÷ [0.2] (LF) ÷ [3.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 005F ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 000A ÷ 1F1E6 ÷ # ÷ [0.2] (LF) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000A ÷ 05D0 ÷ # ÷ [0.2] (LF) ÷ [3.1] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 05D0 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 000A ÷ 0022 ÷ # ÷ [0.2] (LF) ÷ [3.1] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0022 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 000A ÷ 0027 ÷ # ÷ [0.2] (LF) ÷ [3.1] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0027 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000A ÷ 231A ÷ # ÷ [0.2] (LF) ÷ [3.1] WATCH (ExtPict) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 000A ÷ 0020 ÷ # ÷ [0.2] (LF) ÷ [3.1] SPACE (WSegSpace) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 000A ÷ 00AD ÷ # ÷ [0.2] (LF) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000A ÷ 0308 × 00AD ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000A ÷ 0300 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000A ÷ 200D ÷ # ÷ [0.2] (LF) ÷ [3.1] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 000A ÷ 0061 × 2060 ÷ # ÷ [0.2] (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000A ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000A ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000A ÷ 0061 ÷ 002C ÷ # ÷ [0.2] (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000A ÷ 0031 ÷ 003A ÷ # ÷ [0.2] (LF) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000A ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] (LF) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000A ÷ 0031 ÷ 002C ÷ # ÷ [0.2] (LF) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000A ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] (LF) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000B ÷ 0001 ÷ # ÷ [0.2] (Newline) ÷ [3.1] (Other) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 000B ÷ 000D ÷ # ÷ [0.2] (Newline) ÷ [3.1] (CR) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 000B ÷ 000A ÷ # ÷ [0.2] (Newline) ÷ [3.1] (LF) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 000B ÷ 000B ÷ # ÷ [0.2] (Newline) ÷ [3.1] (Newline) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 000B ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 000B ÷ 3031 ÷ # ÷ [0.2] (Newline) ÷ [3.1] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 3031 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 000B ÷ 0041 ÷ # ÷ [0.2] (Newline) ÷ [3.1] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0041 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 000B ÷ 003A ÷ # ÷ [0.2] (Newline) ÷ [3.1] COLON (MidLetter) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 003A ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000B ÷ 002C ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMMA (MidNum) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 002C ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000B ÷ 002E ÷ # ÷ [0.2] (Newline) ÷ [3.1] FULL STOP (MidNumLet) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 002E ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 000B ÷ 0030 ÷ # ÷ [0.2] (Newline) ÷ [3.1] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0030 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000B ÷ 005F ÷ # ÷ [0.2] (Newline) ÷ [3.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 005F ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 000B ÷ 1F1E6 ÷ # ÷ [0.2] (Newline) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000B ÷ 05D0 ÷ # ÷ [0.2] (Newline) ÷ [3.1] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 05D0 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 000B ÷ 0022 ÷ # ÷ [0.2] (Newline) ÷ [3.1] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0022 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 000B ÷ 0027 ÷ # ÷ [0.2] (Newline) ÷ [3.1] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0027 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000B ÷ 231A ÷ # ÷ [0.2] (Newline) ÷ [3.1] WATCH (ExtPict) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 000B ÷ 0020 ÷ # ÷ [0.2] (Newline) ÷ [3.1] SPACE (WSegSpace) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 000B ÷ 00AD ÷ # ÷ [0.2] (Newline) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000B ÷ 0308 × 00AD ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 000B ÷ 0300 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000B ÷ 0308 × 0300 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000B ÷ 200D ÷ # ÷ [0.2] (Newline) ÷ [3.1] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 000B ÷ 0308 × 200D ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 000B ÷ 0061 × 2060 ÷ # ÷ [0.2] (Newline) ÷ [3.1] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000B ÷ 0061 ÷ 003A ÷ # ÷ [0.2] (Newline) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000B ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] (Newline) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000B ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] (Newline) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000B ÷ 0061 ÷ 002C ÷ # ÷ [0.2] (Newline) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000B ÷ 0031 ÷ 003A ÷ # ÷ [0.2] (Newline) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 000B ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] (Newline) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000B ÷ 0031 ÷ 002C ÷ # ÷ [0.2] (Newline) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 000B ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] (Newline) ÷ [3.1] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 3031 ÷ 0001 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] (Other) ÷ [0.3] +÷ 3031 × 0308 ÷ 0001 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 3031 ÷ 000D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [3.2] (CR) ÷ [0.3] +÷ 3031 × 0308 ÷ 000D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 3031 ÷ 000A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [3.2] (LF) ÷ [0.3] +÷ 3031 × 0308 ÷ 000A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 3031 ÷ 000B ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [3.2] (Newline) ÷ [0.3] +÷ 3031 × 0308 ÷ 000B ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 3031 × 3031 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 3031 × 0308 × 3031 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 3031 ÷ 0041 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 3031 × 0308 ÷ 0041 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 3031 ÷ 003A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 3031 × 0308 ÷ 003A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 3031 ÷ 002C ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 3031 × 0308 ÷ 002C ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 3031 ÷ 002E ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 3031 × 0308 ÷ 002E ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 3031 ÷ 0030 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 3031 × 0308 ÷ 0030 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 3031 × 005F ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 3031 × 0308 × 005F ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 3031 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 3031 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 3031 ÷ 05D0 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 3031 × 0308 ÷ 05D0 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 3031 ÷ 0022 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 3031 × 0308 ÷ 0022 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 3031 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 3031 × 0308 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 3031 ÷ 231A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 3031 × 0308 ÷ 231A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 3031 ÷ 0020 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 3031 × 0308 ÷ 0020 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 3031 × 00AD ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 3031 × 0308 × 00AD ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 3031 × 0300 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 3031 × 0308 × 0300 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 3031 × 200D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 3031 × 0308 × 200D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 3031 ÷ 0061 × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 3031 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 3031 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 3031 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 3031 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 3031 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 3031 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 3031 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 3031 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 3031 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 3031 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 3031 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 3031 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 3031 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 3031 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 3031 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 3031 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 3031 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0041 ÷ 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] (Other) ÷ [0.3] +÷ 0041 × 0308 ÷ 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0041 ÷ 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [3.2] (CR) ÷ [0.3] +÷ 0041 × 0308 ÷ 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0041 ÷ 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [3.2] (LF) ÷ [0.3] +÷ 0041 × 0308 ÷ 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0041 ÷ 000B ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0041 × 0308 ÷ 000B ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0041 ÷ 3031 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0041 × 0308 ÷ 3031 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0041 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0041 × 0308 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0041 ÷ 003A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0041 × 0308 ÷ 003A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0041 ÷ 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0041 × 0308 ÷ 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0041 ÷ 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0041 × 0308 ÷ 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0041 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0041 × 0308 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0041 × 005F ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0041 × 0308 × 005F ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0041 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0041 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0041 × 05D0 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0041 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0041 ÷ 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0041 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0041 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0041 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0041 ÷ 231A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0041 × 0308 ÷ 231A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0041 ÷ 0020 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0041 × 0308 ÷ 0020 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0041 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0041 × 0308 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0041 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0041 × 0308 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0041 × 200D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0041 × 0308 × 200D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0041 × 0061 × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0041 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0041 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0041 × 0308 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0041 × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0041 × 0308 × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0041 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0041 × 0308 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0041 × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0041 × 0308 × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0041 × 0031 ÷ 003A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0041 × 0308 × 0031 ÷ 003A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0041 × 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0041 × 0308 × 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0041 × 0031 ÷ 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0041 × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0041 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0041 × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 003A ÷ 0001 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] (Other) ÷ [0.3] +÷ 003A × 0308 ÷ 0001 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 003A ÷ 000D ÷ # ÷ [0.2] COLON (MidLetter) ÷ [3.2] (CR) ÷ [0.3] +÷ 003A × 0308 ÷ 000D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 003A ÷ 000A ÷ # ÷ [0.2] COLON (MidLetter) ÷ [3.2] (LF) ÷ [0.3] +÷ 003A × 0308 ÷ 000A ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 003A ÷ 000B ÷ # ÷ [0.2] COLON (MidLetter) ÷ [3.2] (Newline) ÷ [0.3] +÷ 003A × 0308 ÷ 000B ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 003A ÷ 3031 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 003A × 0308 ÷ 3031 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 003A ÷ 0041 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 003A × 0308 ÷ 0041 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 003A ÷ 003A ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 003A × 0308 ÷ 003A ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 003A ÷ 002C ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 003A × 0308 ÷ 002C ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 003A ÷ 002E ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 003A × 0308 ÷ 002E ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 003A ÷ 0030 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 003A × 0308 ÷ 0030 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 003A ÷ 005F ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 003A × 0308 ÷ 005F ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 003A ÷ 05D0 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 003A × 0308 ÷ 05D0 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 003A ÷ 0022 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 003A × 0308 ÷ 0022 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 003A ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 003A × 0308 ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 003A ÷ 231A ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 003A × 0308 ÷ 231A ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 003A ÷ 0020 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 003A × 0308 ÷ 0020 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 003A × 00AD ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 003A × 0308 × 00AD ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 003A × 0300 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 003A × 0308 × 0300 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 003A × 200D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 003A × 0308 × 200D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 003A ÷ 0061 × 2060 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 003A × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 003A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 003A × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 003A ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 003A × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 003A ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 003A × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 003A ÷ 0061 ÷ 002C ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 003A × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 003A ÷ 0031 ÷ 003A ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 003A × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 003A ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 003A × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 003A ÷ 0031 ÷ 002C ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 003A × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 003A ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 003A × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002C ÷ 0001 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] (Other) ÷ [0.3] +÷ 002C × 0308 ÷ 0001 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 002C ÷ 000D ÷ # ÷ [0.2] COMMA (MidNum) ÷ [3.2] (CR) ÷ [0.3] +÷ 002C × 0308 ÷ 000D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 002C ÷ 000A ÷ # ÷ [0.2] COMMA (MidNum) ÷ [3.2] (LF) ÷ [0.3] +÷ 002C × 0308 ÷ 000A ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 002C ÷ 000B ÷ # ÷ [0.2] COMMA (MidNum) ÷ [3.2] (Newline) ÷ [0.3] +÷ 002C × 0308 ÷ 000B ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 002C ÷ 3031 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 002C × 0308 ÷ 3031 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 002C ÷ 0041 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 002C × 0308 ÷ 0041 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 002C ÷ 003A ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002C × 0308 ÷ 003A ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002C ÷ 002C ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002C × 0308 ÷ 002C ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002C ÷ 002E ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 002C × 0308 ÷ 002E ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 002C ÷ 0030 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002C × 0308 ÷ 0030 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002C ÷ 005F ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 002C × 0308 ÷ 005F ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 002C ÷ 05D0 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 002C × 0308 ÷ 05D0 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 002C ÷ 0022 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 002C × 0308 ÷ 0022 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 002C ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002C × 0308 ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002C ÷ 231A ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 002C × 0308 ÷ 231A ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 002C ÷ 0020 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 002C × 0308 ÷ 0020 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 002C × 00AD ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 002C × 0300 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002C × 200D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 002C × 0308 × 200D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 002C ÷ 0061 × 2060 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002C × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002C ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002C × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002C ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002C × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002C ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002C × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002C ÷ 0061 ÷ 002C ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002C × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002C ÷ 0031 ÷ 003A ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002C × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002C ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002C × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002C ÷ 0031 ÷ 002C ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002C × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002C ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002C × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002E ÷ 0001 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] (Other) ÷ [0.3] +÷ 002E × 0308 ÷ 0001 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 002E ÷ 000D ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [3.2] (CR) ÷ [0.3] +÷ 002E × 0308 ÷ 000D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 002E ÷ 000A ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [3.2] (LF) ÷ [0.3] +÷ 002E × 0308 ÷ 000A ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 002E ÷ 000B ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [3.2] (Newline) ÷ [0.3] +÷ 002E × 0308 ÷ 000B ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 002E ÷ 3031 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 002E × 0308 ÷ 3031 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 002E ÷ 0041 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 002E × 0308 ÷ 0041 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 002E ÷ 003A ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002E × 0308 ÷ 003A ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002E ÷ 002C ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002E × 0308 ÷ 002C ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002E ÷ 002E ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 002E × 0308 ÷ 002E ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 002E ÷ 0030 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002E × 0308 ÷ 0030 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002E ÷ 005F ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 002E × 0308 ÷ 005F ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 002E ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 002E × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 002E ÷ 05D0 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 002E × 0308 ÷ 05D0 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 002E ÷ 0022 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 002E × 0308 ÷ 0022 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 002E ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002E × 0308 ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002E ÷ 231A ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 002E × 0308 ÷ 231A ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 002E ÷ 0020 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 002E × 0308 ÷ 0020 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 002E × 00AD ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 002E × 0308 × 00AD ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 002E × 0300 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002E × 0308 × 0300 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002E × 200D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 002E × 0308 × 200D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 002E ÷ 0061 × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002E × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002E ÷ 0061 ÷ 003A ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002E × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002E ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002E × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002E ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002E × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002E ÷ 0061 ÷ 002C ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002E × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002E ÷ 0031 ÷ 003A ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002E × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 002E ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002E × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002E ÷ 0031 ÷ 002C ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002E × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 002E ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 002E × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0030 ÷ 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] (Other) ÷ [0.3] +÷ 0030 × 0308 ÷ 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0030 ÷ 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [3.2] (CR) ÷ [0.3] +÷ 0030 × 0308 ÷ 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0030 ÷ 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [3.2] (LF) ÷ [0.3] +÷ 0030 × 0308 ÷ 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0030 ÷ 000B ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0030 × 0308 ÷ 000B ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0030 ÷ 3031 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0030 × 0308 ÷ 3031 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0030 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0030 × 0308 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0030 ÷ 003A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0030 × 0308 ÷ 003A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0030 ÷ 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0030 × 0308 ÷ 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0030 ÷ 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0030 × 0308 ÷ 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0030 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [8.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0030 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [8.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0030 × 005F ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0030 × 0308 × 005F ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0030 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0030 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0030 × 05D0 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0030 × 0308 × 05D0 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0030 ÷ 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0030 × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0030 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0030 × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0030 ÷ 231A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0030 × 0308 ÷ 231A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0030 ÷ 0020 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0030 × 0308 ÷ 0020 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0030 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0030 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0030 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0030 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0030 × 200D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0030 × 0308 × 200D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0030 × 0061 × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0030 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0030 × 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0030 × 0308 × 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0030 × 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0030 × 0308 × 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0030 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0030 × 0308 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0030 × 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0030 × 0308 × 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0030 × 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [8.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0030 × 0308 × 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [8.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0030 × 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [8.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0030 × 0308 × 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [8.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0030 × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [8.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0030 × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [8.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0030 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [8.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0030 × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [8.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 005F ÷ 0001 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] (Other) ÷ [0.3] +÷ 005F × 0308 ÷ 0001 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 005F ÷ 000D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [3.2] (CR) ÷ [0.3] +÷ 005F × 0308 ÷ 000D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 005F ÷ 000A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [3.2] (LF) ÷ [0.3] +÷ 005F × 0308 ÷ 000A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 005F ÷ 000B ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [3.2] (Newline) ÷ [0.3] +÷ 005F × 0308 ÷ 000B ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 005F × 3031 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 005F × 0308 × 3031 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 005F × 0041 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 005F × 0308 × 0041 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 005F ÷ 003A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 005F × 0308 ÷ 003A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 005F ÷ 002C ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 005F × 0308 ÷ 002C ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 005F ÷ 002E ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 005F × 0308 ÷ 002E ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 005F × 0030 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 005F × 0308 × 0030 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 005F × 005F ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 005F × 0308 × 005F ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 005F ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 005F × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 005F × 05D0 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 005F × 0308 × 05D0 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 005F ÷ 0022 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 005F × 0308 ÷ 0022 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 005F ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 005F × 0308 ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 005F ÷ 231A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 005F × 0308 ÷ 231A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 005F ÷ 0020 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 005F × 0308 ÷ 0020 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 005F × 00AD ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 005F × 0308 × 00AD ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 005F × 0300 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 005F × 0308 × 0300 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 005F × 200D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 005F × 0308 × 200D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 005F × 0061 × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 005F × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 005F × 0061 ÷ 003A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 005F × 0308 × 0061 ÷ 003A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 005F × 0061 ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 005F × 0308 × 0061 ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 005F × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 005F × 0308 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 005F × 0061 ÷ 002C ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 005F × 0308 × 0061 ÷ 002C ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 005F × 0031 ÷ 003A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 005F × 0308 × 0031 ÷ 003A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 005F × 0031 ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 005F × 0308 × 0031 ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 005F × 0031 ÷ 002C ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 005F × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 005F × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 005F × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] (Other) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [3.2] (CR) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 1F1E6 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [3.2] (LF) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 1F1E6 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [3.2] (Newline) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 1F1E6 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 1F1E6 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F1E6 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 1F1E6 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 1F1E6 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 1F1E6 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [15.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F1E6 × 0308 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [15.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F1E6 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 1F1E6 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 1F1E6 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 231A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 1F1E6 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 1F1E6 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0308 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 1F1E6 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 1F1E6 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 05D0 ÷ 0001 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] (Other) ÷ [0.3] +÷ 05D0 × 0308 ÷ 0001 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 05D0 ÷ 000D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [3.2] (CR) ÷ [0.3] +÷ 05D0 × 0308 ÷ 000D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 05D0 ÷ 000A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [3.2] (LF) ÷ [0.3] +÷ 05D0 × 0308 ÷ 000A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 05D0 ÷ 000B ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [3.2] (Newline) ÷ [0.3] +÷ 05D0 × 0308 ÷ 000B ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 05D0 ÷ 3031 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 05D0 × 0308 ÷ 3031 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 05D0 × 0041 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 05D0 × 0308 × 0041 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 05D0 ÷ 003A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 05D0 × 0308 ÷ 003A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 05D0 ÷ 002C ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 05D0 × 0308 ÷ 002C ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 05D0 ÷ 002E ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 05D0 × 0308 ÷ 002E ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 05D0 × 0030 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 05D0 × 0308 × 0030 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 05D0 × 005F ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 05D0 × 0308 × 005F ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 05D0 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 05D0 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 05D0 × 05D0 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 05D0 × 0308 × 05D0 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 05D0 ÷ 0022 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 05D0 × 0308 ÷ 0022 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 05D0 × 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [7.1] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 05D0 × 0308 × 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.1] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 05D0 ÷ 231A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 05D0 × 0308 ÷ 231A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 05D0 ÷ 0020 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 05D0 × 0308 ÷ 0020 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 05D0 × 00AD ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 05D0 × 0308 × 00AD ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 05D0 × 0300 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 05D0 × 0308 × 0300 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 05D0 × 200D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 05D0 × 0308 × 200D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 05D0 × 0061 × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 05D0 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 05D0 × 0061 ÷ 003A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 05D0 × 0308 × 0061 ÷ 003A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 05D0 × 0061 ÷ 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 05D0 × 0308 × 0061 ÷ 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 05D0 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 05D0 × 0308 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 05D0 × 0061 ÷ 002C ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 05D0 × 0308 × 0061 ÷ 002C ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 05D0 × 0031 ÷ 003A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 05D0 × 0308 × 0031 ÷ 003A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 05D0 × 0031 ÷ 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 05D0 × 0308 × 0031 ÷ 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 05D0 × 0031 ÷ 002C ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 05D0 × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 05D0 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 05D0 × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0022 ÷ 0001 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] (Other) ÷ [0.3] +÷ 0022 × 0308 ÷ 0001 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0022 ÷ 000D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [3.2] (CR) ÷ [0.3] +÷ 0022 × 0308 ÷ 000D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0022 ÷ 000A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [3.2] (LF) ÷ [0.3] +÷ 0022 × 0308 ÷ 000A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0022 ÷ 000B ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0022 × 0308 ÷ 000B ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0022 ÷ 3031 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0022 × 0308 ÷ 3031 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0022 ÷ 0041 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0022 × 0308 ÷ 0041 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0022 ÷ 003A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0022 × 0308 ÷ 003A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0022 ÷ 002C ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0022 × 0308 ÷ 002C ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0022 ÷ 002E ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0022 × 0308 ÷ 002E ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0022 ÷ 0030 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0022 × 0308 ÷ 0030 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0022 ÷ 005F ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0022 × 0308 ÷ 005F ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0022 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0022 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0022 ÷ 05D0 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0022 × 0308 ÷ 05D0 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0022 ÷ 0022 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0022 × 0308 ÷ 0022 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0022 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0022 × 0308 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0022 ÷ 231A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0022 × 0308 ÷ 231A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0022 ÷ 0020 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0022 × 0308 ÷ 0020 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0022 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0022 × 0308 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0022 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0022 × 0308 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0022 × 200D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0022 × 0308 × 200D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0022 ÷ 0061 × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0022 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0022 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0022 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0022 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0022 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0022 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0022 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0022 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0022 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0022 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0022 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0022 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0022 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0022 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0022 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0022 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0022 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0027 ÷ 0001 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] (Other) ÷ [0.3] +÷ 0027 × 0308 ÷ 0001 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0027 ÷ 000D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [3.2] (CR) ÷ [0.3] +÷ 0027 × 0308 ÷ 000D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0027 ÷ 000A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [3.2] (LF) ÷ [0.3] +÷ 0027 × 0308 ÷ 000A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0027 ÷ 000B ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0027 × 0308 ÷ 000B ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0027 ÷ 3031 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0027 × 0308 ÷ 3031 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0027 ÷ 0041 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0027 × 0308 ÷ 0041 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0027 ÷ 003A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0027 × 0308 ÷ 003A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0027 ÷ 002C ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0027 × 0308 ÷ 002C ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0027 ÷ 002E ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0027 × 0308 ÷ 002E ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0027 ÷ 0030 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0027 × 0308 ÷ 0030 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0027 ÷ 005F ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0027 × 0308 ÷ 005F ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0027 ÷ 05D0 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0027 × 0308 ÷ 05D0 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0027 ÷ 0022 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0027 × 0308 ÷ 0022 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0027 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0027 × 0308 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0027 ÷ 231A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0027 × 0308 ÷ 231A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0027 ÷ 0020 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0027 × 0308 ÷ 0020 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0027 × 00AD ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0027 × 0308 × 00AD ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0027 × 0300 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0027 × 0308 × 0300 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0027 × 200D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0027 × 0308 × 200D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0027 ÷ 0061 × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0027 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0027 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0027 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0027 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0027 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0027 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0027 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0027 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0027 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0027 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0027 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0027 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0027 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0027 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0027 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0027 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0027 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 231A ÷ 0001 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] (Other) ÷ [0.3] +÷ 231A × 0308 ÷ 0001 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 231A ÷ 000D ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [3.2] (CR) ÷ [0.3] +÷ 231A × 0308 ÷ 000D ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 231A ÷ 000A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [3.2] (LF) ÷ [0.3] +÷ 231A × 0308 ÷ 000A ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 231A ÷ 000B ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [3.2] (Newline) ÷ [0.3] +÷ 231A × 0308 ÷ 000B ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 231A ÷ 3031 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 231A × 0308 ÷ 3031 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 231A ÷ 0041 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 231A × 0308 ÷ 0041 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 231A ÷ 003A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 231A × 0308 ÷ 003A ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 231A ÷ 002C ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 231A × 0308 ÷ 002C ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 231A ÷ 002E ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 231A × 0308 ÷ 002E ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 231A ÷ 0030 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 231A × 0308 ÷ 0030 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 231A ÷ 005F ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 231A × 0308 ÷ 005F ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 231A ÷ 1F1E6 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 231A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 231A ÷ 05D0 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 231A × 0308 ÷ 05D0 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 231A ÷ 0022 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 231A × 0308 ÷ 0022 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 231A ÷ 0027 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 231A × 0308 ÷ 0027 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 231A ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 231A × 0308 ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 231A ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 231A × 0308 ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 231A × 00AD ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 231A × 0308 × 00AD ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 231A × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 231A × 0308 × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 231A × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 231A × 0308 × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 231A ÷ 0061 × 2060 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 231A × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 231A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 231A × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 231A ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 231A × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 231A ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 231A × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 231A ÷ 0061 ÷ 002C ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 231A × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 231A ÷ 0031 ÷ 003A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 231A × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 231A ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 231A × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 231A ÷ 0031 ÷ 002C ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 231A × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 231A ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 231A × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] WATCH (ExtPict) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0020 ÷ 0001 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] (Other) ÷ [0.3] +÷ 0020 × 0308 ÷ 0001 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0020 ÷ 000D ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [3.2] (CR) ÷ [0.3] +÷ 0020 × 0308 ÷ 000D ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0020 ÷ 000A ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [3.2] (LF) ÷ [0.3] +÷ 0020 × 0308 ÷ 000A ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0020 ÷ 000B ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0020 × 0308 ÷ 000B ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0020 ÷ 3031 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0020 × 0308 ÷ 3031 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0020 ÷ 0041 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0020 × 0308 ÷ 0041 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0020 ÷ 003A ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0020 × 0308 ÷ 003A ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0020 ÷ 002C ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0020 × 0308 ÷ 002C ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0020 ÷ 002E ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0020 × 0308 ÷ 002E ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0020 ÷ 0030 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0020 × 0308 ÷ 0030 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0020 ÷ 005F ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0020 × 0308 ÷ 005F ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0020 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0020 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0020 ÷ 05D0 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0020 × 0308 ÷ 05D0 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0020 ÷ 0022 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0020 × 0308 ÷ 0022 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0020 ÷ 0027 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0020 × 0308 ÷ 0027 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0020 ÷ 231A ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0020 × 0308 ÷ 231A ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0020 × 0020 ÷ # ÷ [0.2] SPACE (WSegSpace) × [3.4] SPACE (WSegSpace) ÷ [0.3] +÷ 0020 × 0308 ÷ 0020 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0020 × 00AD ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0020 × 0308 × 00AD ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0020 × 0300 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0020 × 0308 × 0300 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0020 × 200D ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0020 × 0308 × 200D ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0020 ÷ 0061 × 2060 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0020 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0020 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0020 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0020 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0020 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0020 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0020 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0020 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0020 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0020 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0020 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0020 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0020 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0020 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0020 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0020 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] SPACE (WSegSpace) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0020 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 00AD ÷ 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 00AD × 0308 ÷ 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 00AD ÷ 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 00AD × 0308 ÷ 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 00AD ÷ 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 00AD × 0308 ÷ 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 00AD ÷ 000B ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 00AD × 0308 ÷ 000B ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 00AD ÷ 3031 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 00AD × 0308 ÷ 3031 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 00AD ÷ 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 00AD × 0308 ÷ 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 00AD ÷ 003A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 00AD × 0308 ÷ 003A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 00AD ÷ 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 00AD × 0308 ÷ 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 00AD ÷ 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 00AD × 0308 ÷ 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 00AD ÷ 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 00AD × 0308 ÷ 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 00AD ÷ 005F ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 00AD × 0308 ÷ 005F ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 00AD ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 00AD × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 00AD ÷ 05D0 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 00AD × 0308 ÷ 05D0 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 00AD ÷ 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 00AD × 0308 ÷ 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 00AD ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 00AD × 0308 ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 00AD ÷ 231A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 00AD × 0308 ÷ 231A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 00AD ÷ 0020 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 00AD × 0308 ÷ 0020 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 00AD × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 00AD × 0308 × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 00AD × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 00AD × 0308 × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 00AD × 200D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 00AD × 0308 × 200D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 00AD ÷ 0061 × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 00AD × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 00AD ÷ 0061 ÷ 003A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 00AD × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 00AD ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 00AD × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 00AD ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 00AD × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 00AD ÷ 0061 ÷ 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 00AD × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 00AD ÷ 0031 ÷ 003A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 00AD × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 00AD ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 00AD × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 00AD ÷ 0031 ÷ 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 00AD × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 00AD ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 00AD × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0300 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0300 × 0308 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0300 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0300 × 0308 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0300 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0300 × 0308 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0300 ÷ 000B ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0300 × 0308 ÷ 000B ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0300 ÷ 3031 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0300 × 0308 ÷ 3031 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0300 ÷ 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0300 × 0308 ÷ 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0300 ÷ 003A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0300 × 0308 ÷ 003A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0300 ÷ 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0300 × 0308 ÷ 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0300 ÷ 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0300 × 0308 ÷ 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0300 ÷ 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0300 × 0308 ÷ 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0300 ÷ 005F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0300 × 0308 ÷ 005F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0300 ÷ 05D0 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0300 × 0308 ÷ 05D0 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0300 ÷ 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0300 × 0308 ÷ 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0300 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0300 × 0308 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0300 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0300 × 0308 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0300 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0300 × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0300 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0300 × 0308 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0300 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0300 ÷ 0061 × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0300 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0300 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0300 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0300 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0300 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0300 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0300 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0300 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0300 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0300 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0300 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0300 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0300 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0300 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0300 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0300 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0300 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 200D × 0308 ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 200D ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 200D × 0308 ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 200D ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 200D × 0308 ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 200D ÷ 000B ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 200D × 0308 ÷ 000B ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 200D ÷ 3031 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 200D × 0308 ÷ 3031 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 200D ÷ 0041 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 200D × 0308 ÷ 0041 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 200D ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D × 0308 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D × 0308 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D ÷ 002E ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 200D × 0308 ÷ 002E ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 200D ÷ 0030 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 200D × 0308 ÷ 0030 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 200D ÷ 005F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 200D × 0308 ÷ 005F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 200D ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 200D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 200D ÷ 05D0 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 200D × 0308 ÷ 05D0 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 200D ÷ 0022 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 200D × 0308 ÷ 0022 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 200D ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D × 0308 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D × 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] WATCH (ExtPict) ÷ [0.3] +÷ 200D × 0308 ÷ 231A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 200D ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 200D × 0308 ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 200D × 00AD ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 200D × 0308 × 00AD ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 200D × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 200D × 0308 × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 200D × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 200D ÷ 0061 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D ÷ 0061 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D ÷ 0061 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D ÷ 0031 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D ÷ 0031 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 2060 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 × 2060 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 × 2060 ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 × 2060 ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 × 2060 ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 × 2060 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 2060 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 2060 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 × 2060 ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 × 2060 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 × 2060 × 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 × 2060 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 × 2060 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 × 2060 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 2060 ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 × 2060 ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 × 2060 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 × 2060 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 × 2060 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 × 2060 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 2060 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 2060 × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 2060 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 2060 × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 × 2060 × 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 2060 × 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 2060 × 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 × 2060 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 × 003A × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 003A × 0308 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 × 003A × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 × 003A × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 ÷ 003A × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 ÷ 003A × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 003A × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 × 003A × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 003A × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 003A × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 003A × 0308 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 003A × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 003A × 0308 × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 003A × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 003A × 0308 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 003A × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 × 003A × 0308 × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 × 0027 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 0027 × 0308 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 × 0027 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 × 0027 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 ÷ 0027 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 × 0027 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 0027 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 0027 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 0027 × 0308 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 0027 × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 0027 × 0308 × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 0027 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 0027 × 0308 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 0027 × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 × 0027 × 0308 × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0308 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0308 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0308 × 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0308 × 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 × 0027 × 2060 × 0308 × 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 000B ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 3031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 231A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0020 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0061 ÷ 002C × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0001 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] (Other) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0001 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 000D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [3.2] (CR) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 000D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 000A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [3.2] (LF) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 000A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 000B ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 000B ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 3031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 3031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0041 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0041 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 002E ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 002E ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 231A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 231A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0020 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0020 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0031 ÷ 003A × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0001 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] (Other) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0001 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 000D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [3.2] (CR) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 000D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 000A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [3.2] (LF) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 000A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 000B ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 000B ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 3031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 3031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0041 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0041 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 002E ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 002E ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0031 × 0027 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0031 × 0027 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 231A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 231A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0020 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0020 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0031 ÷ 0027 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0031 ÷ 0027 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 0027 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 × 0027 × 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 × 0027 × 0308 × 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 × 0027 × 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 × 0027 × 0308 × 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 × 0027 × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 × 0027 × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 × 0027 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 × 0027 × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0001 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] (Other) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0001 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 000D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [3.2] (CR) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 000D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 000A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [3.2] (LF) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 000A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 000B ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 000B ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 3031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 3031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0041 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0041 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 002E ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 002E ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0031 × 002C × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0031 × 002C × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 231A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 231A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0020 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0020 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0031 ÷ 002C × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002C × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 002C × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 × 002C × 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 × 002C × 0308 × 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 × 002C × 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 × 002C × 0308 × 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 × 002C × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 × 002C × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 × 002C × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 × 002C × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0001 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0001 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] (Other) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 000D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 000D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (CR) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 000A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 000A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (LF) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 000B ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 000B ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] (Newline) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 3031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 3031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0041 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0041 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 002E ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 002E ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 231A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 231A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0020 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0020 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0308 × 0031 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0308 × 0031 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 0031 × 002E × 2060 × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 000D × 000A ÷ 0061 ÷ 000A ÷ 0308 ÷ # ÷ [0.2] (CR) × [3.0] (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [3.2] (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [0.3] +÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [0.3] +÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (WSegSpace) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] ARABIC LETTER NOON (ALetter) ÷ [0.3] +÷ 0646 × 200D ÷ 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (ALetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] SPACE (WSegSpace) ÷ [0.3] +÷ 0041 × 0041 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0041 × 003A × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0041 ÷ 003A ÷ 003A ÷ 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 05D0 × 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [7.1] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 05D0 × 0022 × 05D0 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [7.2] QUOTATION MARK (Double_Quote) × [7.3] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 0041 × 0030 × 0030 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [9.0] DIGIT ZERO (Numeric) × [8.0] DIGIT ZERO (Numeric) × [10.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0030 × 002C × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0030 ÷ 002C ÷ 002C ÷ 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 3031 × 3031 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0041 × 005F × 0030 × 005F × 3031 × 005F ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ZERO (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0041 × 005F × 005F × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [15.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 × 200D ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 200D × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 × 1F1E9 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER D (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 1F476 × 1F3FF ÷ 1F476 ÷ # ÷ [0.2] BABY (ExtPict) × [4.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend_FE) ÷ [999.0] BABY (ExtPict) ÷ [0.3] +÷ 1F6D1 × 200D × 1F6D1 ÷ # ÷ [0.2] OCTAGONAL SIGN (ExtPict) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 0061 × 200D × 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 2701 × 200D × 2701 ÷ # ÷ [0.2] UPPER BLADE SCISSORS (Other) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] UPPER BLADE SCISSORS (Other) ÷ [0.3] +÷ 0061 × 200D × 2701 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] UPPER BLADE SCISSORS (Other) ÷ [0.3] +÷ 1F476 × 1F3FF × 0308 × 200D × 1F476 × 1F3FF ÷ # ÷ [0.2] BABY (ExtPict) × [4.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BABY (ExtPict) × [4.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend_FE) ÷ [0.3] +÷ 1F6D1 × 1F3FF ÷ # ÷ [0.2] OCTAGONAL SIGN (ExtPict) × [4.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend_FE) ÷ [0.3] +÷ 200D × 1F6D1 × 1F3FF ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] OCTAGONAL SIGN (ExtPict) × [4.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend_FE) ÷ [0.3] +÷ 200D × 1F6D1 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 200D × 1F6D1 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 1F6D1 ÷ 1F6D1 ÷ # ÷ [0.2] OCTAGONAL SIGN (ExtPict) ÷ [999.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3] +÷ 0061 × 0308 × 200D × 0308 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0061 ÷ 0020 × 0020 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] SPACE (WSegSpace) × [3.4] SPACE (WSegSpace) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 003A ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 003A ÷ 003A ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 003A ÷ 003A ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 002E ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 003A ÷ 002E ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 003A ÷ 002E ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 002E ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 003A ÷ 002E ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 003A ÷ 002E ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 002C ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 003A ÷ 002C ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 003A ÷ 002C ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 002C ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 003A ÷ 002C ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 003A ÷ 002C ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002E ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002E ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002E ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 ÷ 002E ÷ 003A ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002E ÷ 003A ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002E ÷ 003A ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002E ÷ 002E ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002E ÷ 002E ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002E ÷ 002E ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 ÷ 002E ÷ 002E ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002E ÷ 002E ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002E ÷ 002E ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002E ÷ 002C ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002E ÷ 002C ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002E ÷ 002C ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 ÷ 002E ÷ 002C ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002E ÷ 002C ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002E ÷ 002C ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002C ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002C ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 003A ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002C ÷ 003A ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002C ÷ 003A ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 002E ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002C ÷ 002E ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002C ÷ 002E ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 002E ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002C ÷ 002E ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002C ÷ 002E ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 002C ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002C ÷ 002C ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002C ÷ 002C ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0031 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0031 × 005F × 0061 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 003A ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 003A ÷ 003A ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 003A ÷ 003A ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 002E ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 003A ÷ 002E ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 003A ÷ 002E ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 002E ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 003A ÷ 002E ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 003A ÷ 002E ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 002C ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 003A ÷ 002C ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 003A ÷ 002C ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 003A ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 003A ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 002E ÷ 003A ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002E ÷ 003A ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002E ÷ 003A ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 ÷ 002E ÷ 003A ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002E ÷ 003A ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002E ÷ 003A ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 002E ÷ 002E ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002E ÷ 002E ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002E ÷ 002E ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 ÷ 002E ÷ 002E ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002E ÷ 002E ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002E ÷ 002E ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 002E ÷ 002C ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002E ÷ 002C ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002E ÷ 002C ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 ÷ 002E ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002E ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002E ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 003A ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002C ÷ 003A ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002C ÷ 003A ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 003A ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002C ÷ 003A ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002C ÷ 003A ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 002E ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002C ÷ 002E ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002C ÷ 002E ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 002E ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002C ÷ 002E ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002C ÷ 002E ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 002C ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002C ÷ 002C ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002C ÷ 002C ÷ 0031 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0031 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +÷ 0061 × 005F × 0061 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] +# +# Lines: 1823 +# +# EOF diff --git a/vendor/bstr/src/unicode/fsm/grapheme_break_fwd.bigendian.dfa b/vendor/bstr/src/unicode/fsm/grapheme_break_fwd.bigendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..e6eda05cc6d6063780571c250b96f0f91f7c889d GIT binary patch literal 10223 zcmd5?3w&HvTEF+sGnr(PCiBd5QqqW65Gz(hL_|bHtcbYQiff9c8`o}k4FwUg+)R?0 zyl0Z;(M%qb$K?H*Wb#g$U>7T5scWsJETz0Ec1tO>)QYw4`v1UGs_C4Ege&So(i=TM><{dk?3*Y~NAPN%x z+28tn{wu!8f2Cc5C~34hy}_7}Xi7>pr=+e+OSf2Uc84<~Gb=kM*Oj;ahWrf$KXKzv z-tKD zL%;Lz?>_Q-U-|v5f3WQjAN`}R{&C^<$Npr;<2%1r^rv6{vt8fV{mpOvdGQl_o_y*r zp8m^c{_5Gk-us+f;w~*K_joHRtEy{i>wNzDhJB4q%`N*|18wacox!f|p59Pj|G?nT z@W|-c_(XVeDl$DYJ2$_uxU_s=W%c>LIr!}t{`Sz{z4-Sp{lnpxkNo3z{^{sHAN!Z% zubg=GyRV&m{nQ(8zV-Gyr~mcce>?NNv+tdI|NI9R{{7;Im;U4Oe}42|SN{9z|KM~4 z!G8Gg%P${2di?k+ubepX>Z`B4cJk!wub(>g#v5OH9su5ZXbntf*dB~3uvenauPBYB(G zT>*SCF;OTKEZ1J;TJTd}BKYh43S{fGAzmBjyj>h--jN?ARM$}j>a7Y?yKC>kgWsm} z{VqG-=-HnBo_f0H&(r>KJs)1WBoyU@^~E`dkb1ITz=bK^G^t*nvXPbQyw`M(f@Y<)#?P6Fz6(}1DK*kc?t zjvMEVhm41f$Bk!<7mXhozn@@C@Fbi}xR`J?@s7m%6L$*PvRpzOR90T@@p!9iYHDli z>U=(b!#?7o=9ZTI`&(NBfws2x_KuFu&R}mS)HgCZIyN@GTClUAMqiv?h7>@;dFLO> zKZg9GzIcPM!M5Q>L(zu2kRIGnx8X3_&LdqdNYfV!TC7@GRaL#3zY*i_L5nD_B2Sk? zeSQ5C;qc_-)KnxgJv}osJ3BWwKfkcBxVW^mynNum%E~H6uD9unUAMWmxOTXn$-U?@ zx^g~Q6YgevbC;^S^Hx+;(yFmt`s?c(Xs3-$pSIUvS66p;PfsuHxv#%}U|?`?XlQtN zgztZR;+lAV9(F&DzW)a&@R_&s$>pY?-~cK6Xi0hE!d(jF4!t0 z_=)afJQeI()!e5aMLLCa4(W>KKH>=E8kwk&`k!WPKHeh~33`QdJzj6cs=h&AtZzr^ z(YFf{=Bz?v6cG&kO7cW_6}3Vk3EGnQf##^xOgsjT%Gr|hDDtl(J&oi+Y6M4WWa32X zznj%aPEc(VYMJs{&LX+Nd5L6(Dlyh_5zfI-WY}#eGc+5*hDF0^)XpP)WRxJYk_<)q zVk3Cl=rZ19yxq73ZH2~S>ZiTH+R({0wLU-b9(IH}OE}|^(a9-j^Jtr1COPJ>544Sr z#ad~!B=_|LlK6sc= zBGYPHV-qiF&<9Zw0MRccrdVgq=_;q-(TIi&<+i)5s*N**aL?7voJb`gyX(e*0{=h0`qNFKtmz8_HRHj~kfO@Ng;V`Rfo7;n-fx+Q1 z-p^*%hxtrVuA&+J7%502kplqum7&UwUn#(5Pn#Fb$IPe9 z7tEJagp~Cu8&mE{c_d|LiY#bGN9X5PR?Lm&fH@=>NGdcpx3w`n8%!)q>@m4an@qQx z9yS#UVpmtd_7a0Y0xxlS~eXreFri}?(OaCGwm|DO%;OZ^O<%EBI7!p z?5Wt_*4-QGA6Ds-DAC_cc^Ofqo@weK*e6q*PtgYMLaveB<<%-Z3!=LWZIV1oqgZKl zW`>U|D{BjOgJW1t?C3$SR!R0K{G}&Z8=i_VR|8{< z;yBtpKsE$mQah4V?ukTLNk_9HGqaGBu{lI>l{Kv2FgiX#9t=tCxfNidKv4D=40iSO z;%uU@N}+lbSbR0e3%R7sTTxxx($dr0KgxCn+*C+}&CHy#Bf^GRhMk>p{RyzorXt)X zQ!KI=7V0>msX-Tp!Is|$!TnhwrHxz`fXL<=z#z1d=x9C z)zB~ii;%2Ux)Gv|xcd;ale3G9%Zj{Za3xuhxPrc_&R-7`o7tUfW=Z6p5+p$+$x570 z`RpQcT}f%Vr^YwG$Z3pVQeR&`<)Hz}J$}kNiE5#Zx)>d!9;Euj)HIjXVt5jDz1!{a zR97?i7;_mchCgPOkoLmA7TTq}YjTxQIA5(FIzf=U@U!t-1bTu+0b6}$mON@~ms;Z! zQEy)#Yts!y9q_mj+R{?;JC>KD7-%7Xrsw8Kzw&=UUs8gbhyP9X*8;G5o%Vha_(x+x%gM;aO$A7@xWhtiFd zRw8FQ6u(8P4rOKZ`UBKUI+V3Ub*R!$GoeFS4LTIR(4okg4rQ%hQinPob?kQRaqM-} zI0BAAq=QH&kuExo&NOGf^A<k;cQ z>#2|HuUH;6U9dbxI@$8jTAgf3vSe6pwA^C3-Exnrlhe;y1dCp9#@U?Y zQ-93z@92OYiuawF)t|mCeMkE4^k>uE>HE3WpWc}sG8Cl`BZbpv)0fi^rXNQ6c>0^j zI|ZrMH^JqXG&;#;fuO0Ys}GDRasfJ_4;-v3@dW}C6H|-JQF%dpT}hHil$i|m@Uo9u zrdhd(Z>s9niI8aj<-ra$f^-NoIBiE5XLVFKY`!tMSqR%|IKs zC3ssz9mnhkY8z!%14?3W7`a9!3qi%$Ag{3u&>#OV&d@kmIAjgrUu3dOluM~~Vuox6 zDv>T{C1`B?iX(HBcZ^UzO4w?keW80%V&kEC+gM4gYQ?WKF{?s?cBTD83#pov)%YsV zq^zc4nzTjf5hLux4je!o{7LyNtr@2|m5~Gmnv?R-0OcM(%B#7R9$R)Wnb_=8jsfX=L1HA{W$65eW)p<&t&Z%T%Vuqgp z;PeiU5>&JgBV$Td?d(>g6Jt*})XLDyl9)YG%D!226phnV#&NP)J& zK@Ov$0wXm(-%w;8b_Q>Ay9wIx2MT3}yOOG~d}bEqQ(ZBt8kcQ_ogZNRIr$wATHwsy9H>3#h68lDweE5N&g7TW{aM5TD6bXr2j=3ALDKE8{+=;vYY$?*d~*TL{fWoxarF3+MeD;z8Y`WaY)Uvm8e~E zyA?U2mEE3-D)<-CHE<3}ALdeDQ*#tcnya*uM-rWbGjfw;(N$IXKvVmJ%1v<`q{+z$ zmwckP4x==vFD$9NBv#Pv>Grph=f1EIm2WgxoTR;Ifrq!YrB$7Qc8>?``Z2QR=Xh`k zw8wc2xu7NYfK!)3%{sRmJ~g8-btHbpjv#W0XpGY=(HJXfVI$AZDX&H}1N)|zoQg_D zbt()2v_}w#_SiflY*Pwgjlk_9ziWw)#C*bwl7@x5;JdI|qVk%}DRgvfD#ECg_bRya zeSu!l%3hF|M@jEYpJu^p*}Ea5Wn~Q`wcvG}EN^-fC!ZjO58-5FFXk}H;fph$Rhg;c zj5`R8jIvlLP%3}xo zwNAxCFu*RYsHAv@!ZT_Qo2Mh+72Ff`RjD`XJ7X5ns_K6e{`_CiVjAN*6&hP-4S%U) z**fHnmxBT-5xi9RjJ30~WF@VF31lo^he0GgjTxK=8Ey&=f(CrZux73FN=)3yFy`YF zC|dNuDpyYheKa=8oitX(6x#D+r$K!}0;dY1V2ZtRp62s7EinA)oC&IOW^86`cSdkG z#cYYgJA>eHzI!zX9OCTAGWP0PE)#c32s3S!X<6DW-C_X~3Qmau21W6}T1cf4t z@#A%f0o2se8%KPrf!z|_50lz)xNt~(WkgDpo+4op9N_U*Ra2Y;+7s=h332nlh2K3< zq#f8nx`VI1*Ylpv-vaUq^LAd>dw>`W=56~t9?E-!-h7FFs+WMFI7s*-`h%RkCAi%z zR{ceAJ44Zs>%vY#j60ZjBJULQZWcigp6VrbL*&&{ePEE^m;q5X#z{=Sv3MJClTgTV zqBv+$)Fq@$At^c8oa@^A+;d;(D~3YhF(xAl^FBhn`+3COl&=|#vb3`HYX-ebze&GU z|5bd=pqvta@4x;VBo5CnxUN&m{rtGcwc__{-(d2S*1o}fGLpYG*7|=N)4kzRz8*Zo zcq__Ti=a;rQHOV57g>}N(JOKuiIvbJ$^*!Ch{T2`6$u}ey*gR_&LUnS>t(1+|G)&} zZNOyzjJC9hMpjk@$@^w?l1TKO0=>w`Lm*kw8lVrK*0xe?mdTPe@}G93LNqXaI5-r+ zBP`P~Dz0oj4b%JTSe;B?R*_{JzY19wi%U`K3D|R6m%g@8EE%>s#WIzcDPX6f=B=PH z{AHZ<7TJS@Eq%5XKQpSk*5H=HWFp14)vr7n_VI5!dU}a-KXsN00eY{osbxQ{NcRNn zKQUe-lf@d_J3^=x^r2bYNbHm}0qr2ZRg!CcsN-M5ZVP2a$5W(Qtw}Ol6J_puNJt^nf=UU zp1=9cZ+_32zw?R5ciilJ>>H0gb@P@dc6|F=TXt-@`SI^;aX$Xo&0Du^5kLG$C-nHO zS}Ek;n>zJBU$6cPojxi$#t>^<78jq8Xfh`)PfoE|ZT8f(^o-1`>>S66l{c(fz2>KG z{OOy1X6?6Ei@ymDq%3Z&D_pjaa>-YY~hTpvJx9_i@5B>hbfAFeC#Sbq1*X95I@PDrS@74eN z=!Zhs#o@y*y>#Trv16~ia{TzKufF!$i4(8Ce)8lSZ@l^DTW`Jn_B-#KJ^Svv=gz(N z-uv%gxbVRTPQz*QIrByHRdZZYQc`--+NAYKcP8DF^gvSW$|G54vM#OkN9~Pv-thAB z^((F{7eXiE;&O%MI##(B{1=l5zk0cXY`qSM*Ty-2MHuFaA1Bl!4h8krFjTv6>^ykz zyQJ^;C4CoYd+G-obQ>W4vhm(D;$jxXiQc#IlRat}eSH?!LHfaaqFUDxd@v6&HIv-tvly z%F3!LpRc-h7p17ap<&OS#zw!tscG-t=H`}`Ku2e1*TCT5(9pj5ZEGslI1NRsoCZHq z5b4mWqsT8JiPg5%H?Gc$y$k7q)m5txuXY;FBVApcj5*OC(NJh?Y6w|?*#igW=H@Zdw$f?1&9Tw3)$z3B zVvf;~?f7KvZnZaep|(43Nl7VJjqI|zrlyuVt=s)+dkwUL-Q7Jsy}f;X z{rv-K|NDloiRb5G_mk-R|EIubpUzKW|4%y{UzrC!i@UA||2>X<4)8iTS90w}@cyPX z%S1K#E+SKb*7*%lgN6-JCy~w}T|uHmY>0{yE^;ACPpLMa>d6xZwX?z^kJno=Uu$q0 z_9C?-*K^K%uE>MsaN$4d!@>DHkt-4etR>}vb2M(Ij6tF{WtlqgqS9AQ*~5_KUI2D9@>Rjd~-fhJ+t zzG|&4G^VxH?Up6bvb+NQ3MzKuE#c}oD{Y-Tft|1w+Er^qOL@f-%m9bFTCS6?H!eN} z$t$4Xs?1gAS8Q7WegMaTa>Mz0ohU5j?rRRrV`jcSN))(@ioITz*<0;rZ+RdXWIbBc z?+tYJ^!5*_emS!yC}#p*8E153q+Se!4jkZ^96@dQ<#pvV8C4l|87&!88OJitWtcJ@ znWoIUGIKMXnbnysnNyiBW}eEtlIc%yWNl8nD=Rl^d)AIDPgX@%d)8pqT$Yt*3Er-( z4BIJCqP@MdQ)z5zucW>Xg(fFoPCJu!B`qo4mhMQuDgDm$htfBtKbl^YUYkCfelY!1 z`sMW0j5{(O$Z%%hj9i6&1=o~m>)K8GrP=DVsLP3YHqI1`SV3h0r51wqi&*)+ds|x-#e%`nQDuE+X0FDY5>gY^CES~^ zF=1=M_JoQAe?lG^W-TfM0O5Uw!UIeZ*2x+PN;Gc{tIaNA>{O)oWmuvj26Ye5% zuWN#%WNC1GoTVsHRMZq`gT(Ns6U{BmgJUwEU|usv&FZVAlqjy7T98&i^eFj)1_D0@ zM?*5yAQp=x+TBAR0x%VJdQt2Nh1icBVpeE;0(vqsha6X0!Twk=xNn#d47K*;957K3 z_@B530*TT))x(9qt|J;>)4>_&DixvfC#D8W^JAr6OPz{5|Caon(l+pWb zRB&R5|HRY+R@$y=d*Bh$Tjhy>JG2$}KU$1TOi#~-^)2CIpJ9z_5M@=>HE^+|-??~} zUNAf*B%PpUm6DHqVw&7hP+07#@J&rC9wSVS=;~(P*~8pZ&AbI%i`9Isl8;djus%FG zCUrIVd4#lfyFH%rav2_DE`JIW%q*bwlJ*GEb?XSMw&XCv?uJd!3oqhqjt4)%qkykI zKEa3@+tr|G{{hX_)y4TSqHiGp*Lq2(!a~L!v$Glo(crMrvB@dgSM@W9f&!d8;&(;_ z+FZhn6~LeIJpz2{d9?$MU`Z$XrR{5!){U#=>uqSQhV9acVNgLQNXr-jx#{Q(`$Fqr zHSb2!i@v^n`-lN;C{LuYl$M`1l<+kh$})Sa{p_U;Wj$g;Rll4G8>+^-$~dDNBb5zh z>sPg*kECu--I2O8wIbD@+KY4$=>*cnRAX9l+N!i$()_8nq|I6GP1~H7oAzXyE6tNu zm*!6krcI>1koHAvsM}s)_uB{UqxM<*A^TzbG5ZPoY5N8HWqU$ua%yJkn$%lU*Qef@ z`cP`B)B}vcJf4aQ#+HjMjuuyTcJl0$rLDI4ZLPL$ThKObd*1ejAF)4b&$mBmf5x7iOiklCXK`Adv3M-i7Qdy_vd=PQnX??WoV8rAT(JnN z!J1^fVoA3;tZS@mt?R6JTkp3%Xx(hxYJJk`vQ}9mHu-CoM=TfOAGOdXKWJHMlM^iI zmK!a%SZ=r6W6^B#*%VBZoP(gjhXs;b666xIun$}XuDeSZJ& z@aXjHg1(@{mZF9cQipm}*~gYKS>7%43bg1&iO(OPl(V!C?JQMS2#r}aw=FJ1l2Z1fLW?2ZfS3!m)@zyk{@nww?(u4*H z))o7wCe2Q z*gRF2bSfAa9+wm#oR0oMKxKPBZl1V9WtkeK)oEyGgs&nwSHhGMfQXN_jO*&Ez^kQgozvQMUQQz3oIwIvjol=pfva(rnqoRAWJk8p=(Xg!4 z?iz*PO-S^2u*Y3$v`&;)vR>@z>tnxOv{c_$ayCD+tUncE8dQ@E{tSI=XuL|fBUaao zU2Pq}m%QLAoL-P$)OJ===S>fzLAL5Y(*=F1j`Ju@6*? zZ10$stEqOhN=Wq!E3sVZDY^UW|-{q~?Q^Rgn&;@1F_Fl1`N1^kT%GMn>-Y_iOr%b9G__djXCx z*_92A;TdfAczCNeL~njlJq{^9Q{^}dL<5Su6vxJ3$B3yVhiN0pnau%mDtS!tEP0Hj zXmB%bv%|MWoI(2HCa0uSa-9Z)yeGLHyvKP)`lfuq8bH{^xNAm@okh(#V5hd@LKE;CvwRmqRd0EZH9JI7C*5b=r{{Uiw z2tI^v6!OL#PB~(68MCUH8qPd}&VfPs7N@o0X0*1BegkC!5fyI!rOr~=YNM2VD2i(G z!5V)$!3a*t2kYeR!b0_Spl<6lEMV(g1tq0??+D9`*28(Q7l>UUJqxiadlzD7%p$L9 z@wdW{^P&Z&NvYGI$#s^<7sqKo39%R)P>RRPu$-|^(UK)VRG2`=s&ynpN+4z^8C*O* zigGBiW-IoOgM!3KjMX>=1!w9ifLE?jMbZj41DbSds}YA!QiCv-3B?uUV7|R7nO5^6 z_$zER3@G0U3q=7VrJHZIl<<}SWL)iD%fpf#8iQ5hOiDXx0%;G8LEbeiDe=TJBJm17 z`=Kksr-(g=rC#f$)XTdeda%$7+jLSY7jFI5X1Cf@lmV`Dx!r5BUAE7Q3X-zv&-i@l z*^X>zdO+mO74v=>KUP35K}++F1FgA`VAKMw9i5RH?>#%DfBH!W0xF8AR^mG^o}Tlwn97sN%aQY!gA!dt0% z4FdlI3SUt8vbbnGTKQ(lJB~%IkSv}O&qr$Q2rgkrYGu5XsGdAAO}ppumX+h3V;Vb2 z!fB%gCl6fY*^?vf;B@F5+zolX*K?n)?gDc0-f%tl0f;*Sn^%0E3_ZMpcfORL@|h%^ zPV@qQoB?umm*95Gx9Tr|+nE)74Y?ld^zi=!f#WMq0*4@I1TOHD&yb#s>SevBSDqNC zA5fAc?VEgWqcr78nUWj_OG@pNCo+UcNK7>4ICeh!?7=Va6+^CgRO*Oa@gd%Fo^wRL zW^ftj^h>{Ha2VDZHW|Kd$Tw(IQuqDWe}a59TC?hUsFZV!caLkm-!Hv`Nm#Y?4(5|D z`Agqg9bx|b^6&aza87W(uWKB~?c*q^zU9Ipa^{mhHt0}(3>LGWi_e|5@ zqhyCQyrz56s(oj%NFzf>z-U+Z3`^Oj-r!2aXofiFGQ$lmdUTEY*_7L5c&XbHH3MXlh4N+0Ty zempId!#18T)!`aO$yIYn<>8=wkETwBuf^|H_>zu*rO%x0V_++XkB<6XD=Xy HS77Z&CW844 literal 0 HcmV?d00001 diff --git a/vendor/bstr/src/unicode/fsm/grapheme_break_fwd.rs b/vendor/bstr/src/unicode/fsm/grapheme_break_fwd.rs new file mode 100644 index 0000000000..ad1d22d643 --- /dev/null +++ b/vendor/bstr/src/unicode/fsm/grapheme_break_fwd.rs @@ -0,0 +1,45 @@ +// DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: +// +// ucd-generate dfa --name GRAPHEME_BREAK_FWD --sparse --minimize --anchored --state-size 2 src/unicode/fsm/ [snip (arg too long)] +// +// ucd-generate is available on crates.io. + +#[cfg(target_endian = "big")] +lazy_static! { + pub static ref GRAPHEME_BREAK_FWD: ::regex_automata::SparseDFA<&'static [u8], u16> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("grapheme_break_fwd.bigendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} + +#[cfg(target_endian = "little")] +lazy_static! { + pub static ref GRAPHEME_BREAK_FWD: ::regex_automata::SparseDFA<&'static [u8], u16> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("grapheme_break_fwd.littleendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} diff --git a/vendor/bstr/src/unicode/fsm/grapheme_break_rev.bigendian.dfa b/vendor/bstr/src/unicode/fsm/grapheme_break_rev.bigendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..930d7c24439b823c8535f77da99ee46e6b834e56 GIT binary patch literal 51923 zcmc(I3!IhJb?;#`L`NhkF_x%Fh#`g~NSt9Xgb-sALv2baHL10h+Gq`dVT1$;A%qfw z@hEMnS%x6E>^TuAEzp13OcUhmCztH!K{l3)y%eQ>x)~|l; z>$iPlz@Odz=imH`fqyyZuLl419pC!)-`x4Pcm3Vne?R0O?)k^>+mak}9xoY*Awd>Yz*tltP^AlUPKDllCQ!P7o?%Mry z>odU1FjP&MHhsn~elc_ABac+iohM^2YTWuH z2BMK3c;SJ=^!m*MZ$0qN$V*3d9@&-ty`Ek@N8U`Y+vs)2$RX5Uhbynl4bFA)y-J_+ z<}F(EZc-?(Yh<|npn*=mqHe#hgjj~{yc?BlI-@0mMh z?qqtsHTRu)!{&{hS2^#|xo^$S(Q7EZ4mR8}_pOG34J{4(=yj~2Wx?$WnisS#XkJ*l zaKXY23l}WvMz5LlTHJU|W6wf#FsdTZ!B@LYWR{a33VBZdxn(-*(MKNx+h5ky)PiyS zoH>sR>-h~03q0>7OP4MK_Z3Y|E5U#Dnl)=7gY_FWY=j&(H#a{K%A#e*j@(^0PyNEs zzJ0$~^u?Y19{tk5{#W;Z>&q|PQt_2*zH;K$MPL2?*NVPY{q{-T@Q- z?3UZFy1n_&@Be1;H+TNU=z-k^9{bDLgT6NC{9hdyy!@|+-f`2nI)3ZKx7Ym5)H}=n z_O`pOzU$Y2x8d%oe?NA}uzwhI&%l4|_nn^iUVmSw`+omVC+=_g?%bghzjynv(p>LU z8C1`j^{8@<^Awign9h(bZujn|;iLb0;K08feT96pbwkOJ*25)LCCk^eG#y)eu%xQA zj$Q*xs(N?EtF&(0oTpFsu6+9TvaY==_e?G8x@W_#ma?wTG|}&Gl(qHg1(q{li4VNZK(;=SSL79+&I(gRT9=ZqnqMD-C2C`op_nD~Dft z>E+|kzO8lw^v17A*3Yha?gU}3?7aubceU&(ZYhtfBW5An59YIwTuCOAdGm$IA7k^( zEW0d29n7d_Z$?}aA9CLlVWxZS+ zpLlG_eJaw6W((>SRx9eYYuEXiFpR6lj(~VW8xTjcgILj>BK_xj>}r7*l(l(#Nk+_E z_ZTYVdWsC`X2Sx=*yEB|k{6RmF^qrDu8E_9HzI~_?-oY5D7r!OIzLH9fqVjZbY4OR zj1(9-FtP`cScnW+FU_j3)}7}?zoj&z(oA|9FL+(=%4ZJ}wnb%KMP8Uo5#b=W*8Zso zKj&<-J%p0!WaInyLzp9xnIC<{;DlB)aFSo`YT33^H0x3B8W@+O&iJ{{=0PjA=OwCm zB_D&XLwPFROsqSm@9box%4oMQ@^)C(2AQU#&3z_;6xo%}BhzuF={*llXntp>9n&L} z_laHZYVjyl^ScJdeVB8LeA>@1&jOJ?QEjzPNMWZl$WDQk=3k4|T0kn=8xu0k@+Q%} z_>*Sj7lpXAuJrU%JuTj64#EP&v-)%rzd}@kC8VO3IV?Q}XuOPDL*d9@K62zJS@7y{ z5*0#uL)yT<``IJ|$$mTovE?)dY$-Pe?t=8Krw;2A^m9YL3Ct z&av`Y#qQanndlRqDX@abryFLL^i*Xe83y?HIm1VjXr&!xbn2xU_@gLYC%OPe#Vd1~ z#F9Rpb`1K5YrmA0Mvelx2R>Ms=2G55er|frb>Rr0pYQ_$Xbi%Vx+&Qtb!sp z?;{}2MDsgy>eH#U7#@qro<|>joabgUi|Yh?yZQHZQ+aKQc=`1iI0d{YCwr>r({shH zl$o-kwHvW1h}Gv)S$Us`GXkIZ9(A|^j`>EmrIB_{?^-}CX#X~}wBCy(i*LF0>D_sC zB70PJPbBWsar}0-y)Yif)ylA2Ywb*CF~=g(1$?|W?F_=oo}%|<6@{?LS?kg@bQo9t zs?TS~ny2BqSGa4Ku9H`e9Xo#9TNn7OZ^9grv@g~SbJ|X`fW$3jwEdj|^<$&Kg|jM* z6Jl_{3s(v*lo#|=C@Y>z(yo7G=_{O3y#HvXnjWQ@)6>_8|A5n`$*L=|Jl>Jhcnw{_ zhpeVNqx|y>v&p9?+5ghmt^TCf?fg!d)mCVIa!m*GWs=j)%1Ps!ojJh^tInryS8hAU zN|xxg6~>1SNBvbDW+qp5k`V$k5}5hxbNT!$o12Yx%x?E-)!4?0jmOg1r7M>{m_)zIbzpM$^O#fU^=5@#E4(-4t3-? z(RE|THix7w0=U#UNDk~ zu6DP5oVU4lSp5O3{63|5EbmJu$J1F@{Rrn2d<@LbPIusRFBJOn`Rl&t5#g~0#oj$J zTsL9Gfzp9H&#!3#!_ph9S82Xc+6<;U_mX#A|5Q)Mlvf=)$ClM>e`m)!UU^is7@o3X z>Qj}77+68|r&BIryni>i;y{s}!-#VRU&^aij{~d1*zW9=#XHOgrTiTXDrF&KYsFWp*}e(J&;Cq2n*5 zvQK(%e&(`sr~cbMZ)ej_jj^obI^Hq8q-xt7vFP55dcU!wS6Q27+_IP0v;T^g)uOZb zk`Ln?S?I-&RAZMc9s~^$&ip~Nfq=e zt4Hg@dGvaX=L$Oxxu#n3yTjDmamX`0J|ADPSeULZ62HATrlQj%&kUW)nK~P#E=H%G zDb9O_Ik26B97l~!7r?Pbyp;B%Drk?8?3N=h;!-K>HdT*$Vo*=#Or3`7S;&U7EjDhi zNpA4VR9l4x^~4>`uev8S*4Zhp8c`JTwn{58nroiAL%40H9bV6ky>STf%VMV|K9yZz z+`>E}Z8pv1w{nZ+7e&`hcD?TtcEpWVGuw7jys05}HKIAN!nw~rh9O<439ldM`8{P= zi00xaKlL=WX8MV&sA;)pwS5q=YM&9GEFx`TXEd}$V#8;40v?pnOGL4!twU{v=d6AF zgf%8LX7_T`pM=iouLYhir-Y6oio1T?8r&WD=W^@ z>E$ANT}CYvtwv7TRvom!+4>zPPo8r9a1Z!%KSNcA{@X^rv2R?F7HH#vTYu2Mknx zrfsYh7$~ljr%XH5h3gM3ZGUH9i*$<~i#kg?mUgJyv#+rQXn%~&aXmprI$|M)tC9VQ z|7de9v@Xx|_|apGj69qch`Y5O}tHW`g5{juG~EYhRWF?mGMfw4FmH|h-<@LF(v zh8ST-!PpWjoVFr8Pz6)0o$C)4Z>)fMM?I#DZuCHMjE$Ta6*3IkxKS+&*hs9MVPRXM z5G%W-)d^ai`)$%n2Ist;xSoui*sGno6EdjqExBmso}8src}fMf4tf#$s}As$SjEc ze$R>L1+Ks0{kv^NB}0Z+4DU`mTFbZHQ*wUzmf_v;yL;jHL*>2jD!**_mKAT6FW!7x z`R1T1IA;*TekZy=c&osR-6Y(2={yZNGy$<6!;5>R72Uq3Q zTuheMT~0g1@Wb9nJBmL0XS6nUe4JK>cVBS;mW3U6 zuMy>g_`CIR`C{0M!x`eEpb&<7!myNUkZ% zNMA{A5wpni7Z#nXID(nY>O_}L7U%<-!SL0+5dFoVR<#Va)r_wx;ZYpW=B`-UXqH{pRKktwPHP%j6wdKRNIB7D{ zl|#JUksL{uX-HG5Kf|+l=@_%+nTGMQ@?LAp*PIrF$V=fF>(6m)t=3bJChMQ_+h(2$y1+(_OhdH8x0GMDs;kBNL{Dg4yr`n5 z_z)rww4Z`FSuf%d>+BS_fI?Ao^+I#;>T%-zA#z9=*f-8hqQ@MIELqWu?IzK4zU9wU zX|#HmYW@NZWN>-nNu8t0$;Le+pCxSUCmPXAQgi`sSvp}>a>t3Z7%X`)bmHd&A2p(S zze2Dhx&gE30QeNE%vBOIDteOLnAy`sH(%{y<*wEPl(Nf}jZ)`+jczRC;oVn{dtxYN z3$+)>_yVv7bG<_wkHxt5VX=laTqzY?Nr_^`BuIJAaCxK1l-5dJ@Di!&{I791!vo1BG1xmvtfZ|iCscAD1%lTpuC$ceRvmLS(PvoXJzjd^&5 zwFH_+SiH5zh`#yG zc&x}JZ91%DNJF1m&*wbQ*mN8@);>TFD@jKl_rxS(j=$bQY&Dif47HDNX0-O<&ra)^ zT=v3E2R65ax$x#+s~4)2dA&KKq8ORS#(u!Nc_{3oVgh!xQ)h86<8-vinOv(xyccF7 zUVmqZSk{-AJ7Cc|hf_uuVWzb)tvCxnZL30jy`-!xH3#*xUE!-sfBwT%QLZ>3JfxP- z?#N3-G1A{nOnSnERv#g=xK6O2tvkZ$J1?ocHbuPr z>I(YtI$GBQnbxYVo6bje6)}r4lo{o_!KNTqJ`Pz{-Y4RWF1VI2+tR>d{r**5`T9a& zY2~}&8_1@x7nesTX;(|a`rJ5vy}|&kq@C(WdJNU_DF>R<;$W9~%vHo(pFRfAYp($)&2aVCL&s3bn+Lo6Q86-NtpQF{$NCvP)xFC_lgB=~h8$ zx`P#l>?9*o?Zqw9o=VKe@A!tDh8e;+jpIGotG1J;+!xSYzEu zd&imV-?KVCVZG`*mUUdmbOosUinqj~iD{QL_f-^I#;e~M(O3Lew5%4L#rM6f;{&^r z<@p&S=SgS0rkYoKjxk4P=flLfXPOtk*L8ex&a0+-PiC)wNez<|OjzK{%OXV|0do-<|3cTUl-yTZDnv{kduh-Ht>Yf&qvGHn%gQ|`Rh0N5j2 zX^pp4veLj-X%$9u&8l03+sYx98)r-tFsG)^sP4%P%C0bO$-Qd(%nhtxGWns7&+u!9 zUHN2TN8D&N({v5R8#--`Gs~>|Qv1_^RKK#lM>lj>HvX$_Dze6;4QFVOE zYUO35vrK&{BkYV43pzn-^~J1+P3no8_pFW&%uw6r^F70lEfh8>SKE;f7>;yG9_MJA z28-6{XJ6JBY0ldw*j7-5m)pm|+T}f}<1<|2wyD18n3mrqOvyHh7c6wd-IVp-i9sjI-1HMU&A+YQpFptI?vSa*!sN2HQc7a`Z&{H>WEa+|5a}{kBRIjP+xId#Ik1DWkf^P#+g-8OL@GRkQ&%ZzB$u^ugNd@VmE2 zvmIW4lYhQJKm9J6?xD%k&upEE?4junr_B~J>t>=IK~(>^>IPpqhcgZ(ReMhO`;UaR zb6PovXCm=^Tq{s>%(cZ)RlHQt;gi%Vx}wU54<8F<-^pv2&Zl78+upyFt-|ycSnzMPxS7{k?39Jk|p$aW2pDa#zuZWUVdA$ zWchM@gWe}kuB_zVI?%uO*GS5tcaeC7pq}1y5Kqi=mC}BDO$iCXoD)o-izqojBlXo`&S)zj+NSP zlKS>Oow7BM>u~rm7_r7j>4&B5;^Qp0%vOLQKXhxD?=Skn z?LRm-dhUb09^5(RmN5r^IP`~ajV&L0`bXtIdVSoYA7Az3>EkaOU-gqqe=`0j=O{Na_;B2Y9HR$BD zwMU3GasuOvFTV21oO==|BaDi!c0ldbwFBl1tly7!b)D!ZP%_5a!Eua)(w;2xanD(h zU|p~vhE}m=B85CLGUQpi2lAXl7+9X?>EBl1oznyIB!vAP;!+@v@TQ^Frxoeb7GpRO zff7#`Oi1#;fk@x2HG2bO&^RND5Db{pw{8*MM_Mivk!X0HL8B*Wug6d{=A$(Mu5FbCnKzVjX!xgi7s3B@)%x%o82ysSQQrrLy(O=#-O6hd3iPL^kcvbR-m4 z({DAkZvzEmBrGZ)-~yT&jtnd(t+7!=h}>HFGk0OACrC)7J0)4?x@B>ud#YIZXN>>SOXRVslV%1hw7k&pHGd+K--ME9XoslDQ6vJ$aVAn`E*UkWSL? zdtT(j{(DT~thWuuN7hH4(j78Vi%k3*SS!9|-?=W58|Kwea#n6?ug-&=#u9i$U$x!I zR-vzGRPV7l^$$5|DCZucdN`6&a@2Olq%p`p;UlmU9T!%LI8nbl;^`wf>BZNTH8e!C zv9EZ;JRDRP?R)-kWS_P7sPt(>9+m7?a~QCN$0FXJ!_U;wNy@3COWxwg<~wTad;ZX& z!!I2@D&CPXI_aL~vbROrI=1p=9eeJ<=<~=w9D5nxpBXmer;T1$M|0RIW{;S#zqSVB zN4!Z2e*8$^GK)=_=1!2Mjtx7@9vLz}g^^_rx8u@#$Ud^_YRP~cgtYlQ7eu8Y7=WV(Rg*;h2I(5u<(~0NG8Zkv@ znp+r&B@xy)K_aR_!RcdTeX(RJfK%GXJg#olu`mOC4!QLpFd>_;`vT%(Z}^2l+|b!$rKlDe1f6Ip|tGil02+a0H7Z^!rFLtUiJXN>I#N{)C^KcKQ}M~iV(wVX2&CiXS*cwmgn>eEh}GCwD9 z@XTk|GqU5Efk~xAJ6OC^6vtFQ7^rIdi#{1qDKdJ@NlARU8{B*(-h~LHnS9Vl8fQ;>p$QvH!$xzN%eCrhJ|oE)T;#L#8+&QY+6bAii;wnro#g!4 zc-o0ZG{L?X^%$I$a@nI~PbpYc zmZEFPrS=^<^b+md96Mgu;&e@TflQFol z`VYlSxj#d6UdZ5fm|e8Ax)%?UtV`r8XV$RSNVtz4J${^!(wdd7IK?oNr!!uIb`ha1 zwP*<|bTUlWkQOstBXj4QrmB>EhsWKB0UP4X# zgDhXZhR0W;A_15pO#(1z#dqHDnpv(0hSP|LO75INx_Nym@_Jt3F4 zN_$?4pAaG*)LGZ(}EPuRZfboXAR2Sr`lVvPaB?g~#m$`wWf;$zNC?w*zwf zIuDzn*`bbbJ02YIA{KSDi^`}=`KMYA_2IP<-fd!P0>3`DDV7^3`Y^+ioqvm7P`k{O z@khAhsOxU88w=m8s|r~l4E-Melt=8jD%_eb&Qdit^#hoHEOAyvi=p|l@ z-4hGUD7TZ{^oP7dt4aE5bZ;)cqGWKp$P&m~aqHO!*o%)W+qQ?2#+BIsFR;QwtfU1m zvVWH|Vy;o!u$G}w(0Zv{&5rU2!5T=|BK6sAEDjP%cqPzAYjCy;*mfjc*fXI*rVHub z~71Ah;@h~|_;B-2^jpF77q7~;d# zFuTH*NNi(53~B9YvDi3L-rozb5;BSwwQtibLgz%}x&i$T#5fC)L@n96KbtHP4dbwt ztY#dcWN|gmWf`>_Jlfg=Br}#O%a?XWQ+%w3knz5cwDCAKCyG{)DqH*HA$nM)N;k@f z{e3s}x`MX=zUsJd-_fINpNIkbC1&x+g46BExfn2@76=!sHM)OIUO@?daNxxeg5twWD(#==X`aOJuH!zA55X+Gbp?2!Ds~a@@nIQ+Q9O59zEO{iN3P z34Xt%q2a`dwzk^Q7%z88bv1gWw)jhGb@C*>!8>V#cPCEpXWTEnr9r%yY)`6m6mRM=3j^jEbL=@aV3j7Vrso^)v5r>$RoRoesmym>4Sl16oPEipZH zs;v#H9Gt)OV+iBgiS!pVD#l=}4(*AES#@fJWrD+%M!vvH&w^iGI6OFpwk| zg~%c5EA}16X=wQEZ&@33_Eh>>ut5J-#&HNQm07~e7~iuL#<3hOk?%zVzzxY_eAo?J zO%Yl!E4C&X8Kcgcg*CazNwvV^IxPT`;)DH&&~l&pO^(^K2QVgTNoRJ^e*S!nMDH%Cwieo9-aN9BOXV|TQN%Tp0<_Ck z&H5!7%E@0oHJ)~V2HLoy2eP>nf58(>{2h37=1F~)M0Ebwox}cB-;yD}8p= zV&~+iW}=riPx)%~uz&*VaUthFtO3!uMO>v4fCd)cYFe zFp7fFDUOB)IeQLlbS``t&ZbvY;RJePKl<%D|14C#!v1rq0ITIZ6V|g}0WyrHCfXBP zBPV6$bTUh5F>_90l23qp7^60F!`b$#D*RpUnn{yHS5v0QdFsdb9Q7PtGb8(2L0LFu zU6jwr6OvmfD`Z(rXsn9q$c-2u55MOwkvm%BTs)1-62M7&lE8TR4X5qto4az?{!G@w zgppP?bUj^a;$-fXc^5est$A0=$zeIIE%t&w0?VWmrtxlXwPX~qz4`NT;)QbD zRdTIuE3bbqlG8QW9+>TaG**`PW%FV^qB?>#C;k=fZl-w{?`1DZdKgOyn#=MqmSS9Y zjRR1J@o*LDFvyO^P#mD&q%H$?MW0*~`BqiZv*1^fyQlkAsvQM5M7Q!28qV)YOO|B% z(gm`HH(@NtTRnz8dzU??I>lqI6`o0tnLi&sgG!hTuc=Cn7#!Orrdx?da)nMGo zQvCG3M4!`1Qi>4ok}p-zh+{FTMUlH!d?`7X&7TinTCya4He+u}ixK(RzE9aw9Sr<| z_|go)C!0j-V4R$}=Fe}}vuqr+?=$h_E}cwuOpv|AY??vY>gabyhP;}d@7LkA*YNY~ zSyVKgIfI|Cy+%JNv*OSA-I+7ghTfeygYVG34K1mSw3XJFO8a8?krf|WmzjhsE9?OcBUAC+X{k(434a?{$MHwwdnif}>KCp)- z&*$0^^fUmyExVt3^dm}J-|mKG+$z`6^+$+YFF^Bt_YI?U-}Ps#mrru1;-*G?s6}a_ zm1PV~_%XPjWp@WCd8DI9W4$Ega^y&&#rr4G>_B$nv4~_9t^XF+t}R!z7|fh5i~5i~ zG~4EeWzr8?;GFiww74$nqd4dT`wMm?X(hS=Cmk(p1N~giR~6zdyaujgP94rf{(1(U zEZ+7SJ^7U0ouR5_@z*o#-);CwYrQkCQ7xnU9&PEfv+~)A6V#S!|9B-By_+?wO}?cS z(8-hh*XUoK(+n$7A5N}%+>Q%nNzh!nAM5TA_TAFGnJXZ%0`i_r&;He?-x@zIZN_td z&GQ`9n-}%ov#VuKF+T$rb*bXdc;auSPv<&3^bjf;r%YK+>pl9peECHBohn49Oc^Udkn-@kw7WmT8ob@{pCNmpEd#r{s?uk3c^3!N)J@XZf) z|KQ#~nb75iE+;-T=c<7p?)>3BSC9SEo?Sb3J^GP3*W7Jc$Me7%IN;@ z=&x)|_sLVib7-|4Aw``ys?)Kf7_mw|y;a+DYenN_aO%}pe;s?~ugZb;NZ^5j2KZCu zhStnfTUO8Vy+=KRVai<`v_I6WI}E^^y9;AS4D~JyR)X$Xw&>Z*&)_wh_RpzJwA8*m zVskeJX)V%lvVgq3tW$L3?(qS6m|B0bB4;C}<{o#ofUU7C>|F=~y}=$*HL&Ur6=wqt zU_`G0BY!id;DUr?)Igddf7W}@m)@TtA;S*8!~FoPHy9ZL8^wOLB(!oKnAxMXe%!&q z-HSjuI4?ziUU$xh#7|u-^k?lM;H!NG{$Xv+cptc1{>DN>A2fHJh_x4wirF3Cr^2yJ z{foHWLB{UM%Azy99|&m!tu2RCJPG-zKRP)AiD;1eRD0G|M$2NWPRo$Dm4`!WnQ?zA zhg91}>x6wfUm?42I0IktEofXDmBE1{m9d%=iThb^#>c`kwe*t1v!k4v$csp(&{G}ETlij0;75sX&i$2fUud!r?Mt= z+REi5nvIEX%BbARF|hZaaxBr0&K9_?5ZR#iCi6083youLWNn$qBb@Avmy#_wuIhb8 zTP}Ce*qvaJM{b5|FrxJ$l^mltUdi%3doG9{il6>9{c%dc8%WJna}KgLRAQJhi2uiTqXLltW{1r}r7ObRJTBTF{sJVJu5AG7W4=vt?Mi@^x0?a9R5`?R@r@8N0bJc$vfrtDPtw zLnl@*2@g9#mK@7T#rC*QgOTmSMNnnqw3nO{OlB645U$05dpkH&DfWwOZ9J4SAs{GC9*4k3+Qr5kWk?q$>7AOO21A@?-+S8YxnO&^Y zUL$=$17V*|PH34TDY2Sak2=g6A*Hp-!q`LJoGoCeam(X2Gr!^qGJt3=jCP(fJZ)RG z?)7lip!*`$>K$WcfVsv0U1W7?N3op%Z5P=mq+?e^m@Oku5m{<`r+YVF`uQ9!8`q#E z?Ujm0JG-Y=!8(CkUBoVm{GCDJX1s8w6-gLvsvKm!?yObY86Plnm5q&6FL3#6*)f3B6Rni3@ic>seb`)u&sk^LHW9Q z7p<*drs8q(vHosWx9HXEk3fo+WuR@92z!CDOSLqxOIVw;T<^JJK@OvDLF4KUh1wX$ zBjY3C4u$YAerF{U)2{M}G#l7=7@c)&>euKd9#gbGXeR2@*e$nq^NF@~oY7J<9@clr zTeQvGlRE^T%jAV8mfhR2*^Fkp^Xxw}3gi|{X;jo9{) zo}Bk`6m)1sxz zQ~j9Ks$Cf-*cb$28Pz|iT-`X{^yy}Hqz zjoR!=#wBg#S$&#bw3Q#x`J#>&d2BoW9gVBDiPqJ#Y*dQ+g+}vfHH-(&e{8=FYdj)o zYbT*(WHjFFQJ_7&@~$t1pJ@q(mR~HMXX=V$v#c+T9%Mdt%-FjUnlPj1v65I00-WIr zFP|phw_qhRxQP}TZCOf?YuKk_ALq3-UV?KDI$-ZWlqLs`mZ=0U~vH AjsO4v literal 0 HcmV?d00001 diff --git a/vendor/bstr/src/unicode/fsm/grapheme_break_rev.littleendian.dfa b/vendor/bstr/src/unicode/fsm/grapheme_break_rev.littleendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..b4b5dab9c1ced61cdfff2faadc716e7a04856b9e GIT binary patch literal 51923 zcmc(I4SZHdnQurd(lm`ORu(B%tcX}sBmpWSR@BONU6y6h?XoP}wQNNQX`&Pnk;Rmz z;X|Z>ViHn5LJ}YZ2;nQ`GlVp4k)^#X%TiiWNK&sC1I0?Yz1&_eyYrvtJZGMnGw00< zR@?qw^5%UfGynhdHP6hM=bRZod~D`DGrs%1@6NvG;UCV-fAry*58w0H_aC0|*mv)F zWXi)S|8=cfN~-#QX-$g$Z)qz1%m{v_bW6SI<_~oLV2@kUZcV=}<3k_*vz{Nh{iD79 zy!XfY+|l>rcYdPZC-3@H|4$G2%)rmy{khD027P{TR`!sg!|wgU@Gp+|(#S90_mxp! z{o2>>|HkOQc;GL;`B!89dhFkf``hu~`u5*F`1ce3Vd6hd`lpBf`8y9!{+CC-JLP** zr{zq~eKars`#+fR*vuc!`qAtk&-uyRf1UT!g2(4SQTSxhf`y9~|7^+6mp)azZ28kG zeo<0dwzB-0Rjb#mtyouCRlR=0#+psFo40JO+g87Q$Ie~58=l>>ci;X42OAGH9d3TE z<@pz0Jo3w<|90%9m;cA{e?RdbC;#)*E2m$5?M&9=qF?(*AL{`Wio=j#7`_y7I=|6lvBl$4L81Q?1IELyze=RaS%^r@$cSFNV8E35YI z!$4}JmmfX-=*y4(`q3+oUVHTByo|iwdDkAjOT9Al?#;{0yI;M==S|8>N$Hky+il}g z(nYV-=jzp!mHYM`JUAwQeEyjHN%>RqAF7#^KR17V{=)pF`7822A2>eXBP^FvpDZd`uwdcBMbH_KRJ`oz6)S#GT2{95 znN=jcigoKME32xitJiO=soAu7%a*O%>g%`f+_h`>vwQaJ6-dTE)AG!zXD+ILA6hkY z)qM53vg+EZsjFwLE?m8Q^_5jAYp$%CqFyK0+_(11sxfOD*B(=^v+DIgMMFi4dS$Px zShqvH`c+n}TdH2wm3^u*tCG<{ZobsPS5x}U(=6vdVe?%4Gs$$>^5sv1?Jr77O2K$# zdHFNMdd=Fk6^8fv4I4Is`=;93&EUVau5KG-uzkmlosh%shK6TtSu`FxG$Cc-y;Ht0 ze0b^?o4&Yw#F#Jj8hK^p%U{mDug_Q7zEU~r`(I7{TJhHgef{*;=iT4$8%Mt}cl3RK zar*-e4?OahY2R%6=8V7UH|Fe^6@UG;u~)~Q_?wz>Q~q}F`0n3o`&Qkz7yez&gZKY^ zuL-}Ju;U*VPMr0RQzwo6r!fzW_~*>;-1Tt!MVbMVoBKXKweT3=Vbxua!L*6Eg_teULGy0f(>w-sfTWfx_Q zQLl_4c$Hpiq^$igGNhweDic)0h_+UI)@y*#9IX!F3TQ% zq;Lp0O;nsN52-xRv>!ifpTDd=mCOzd?HmebUo{Ylz7oV)L3u!HdKrcc+g> z?$F*tiN(Md>t4Ju7DI`JjJQ6X+z1mBqe3o-xf}M>WaaKe%ysp0V|?7$^l8=$XAA5V zQY-AW+v?3sXvbAyM?l=U1BfZskQF_stO(K{_+sN>ctPjTlLy#dq7k#diwe0OBSX5m zwgNIXxG0t+#6(iG<6qqiE-H8^;&R;!g+op%Y?Vr4BrnXRh;WeG$QB>M&l%h73L#}W@%aAp z6y``|=B=*_oY1NtCp6o5xM@FW)}S17*p(yC_;)8lOSWeu%6KUsgRX6PGTvCMiw~tY zA(oL;32o&8V~3qXAyYrv&qk3VyE1vCAE!_632;L5=}n6d5z5JdT{a#zC|UDkbe7@f z7YVhWSe{8DEq+#NfAJys^%5mfV8x6eu}TYYBMvO!o~TUYyoq#A{=^yi4IwVeKA)X= zP~tuLJS>1bD}5OG6`~R>!G}7S!~8LTR5%$ZhY!LzqgRIud@X#@WY%~1xF z{TK#h%RUB>{k>7yFA7$owhpkQcQa958`&!(zc2kinaXJp^pr~yp#!Bn`#E6mG1hx>Jv2FQE%)A1YR^g8;unG@y z-m`dS6AOsuH8NMjGWk@r~Jsak=o5& z%UsXqr(0x(gp8Px=RH@JUGRJqd*{%x&m)G%N5R2SD*`PHgl@|%c9>Q-qjh6`JI;gCut{q$kT7Aelq{7#(Gho!a9yqQQJ z!;I&~GjnxZbGA6^AnqV*l2*w8|lr#gA%ielC$tf;}p^C*u0Fi(l@xC&%O5iNMOR zTPy9%X2H6Ek5>j()_D+qlMEZnx_Aw3$5pfHGubicX}IoX?;84b^7`4c=gyr7tqXi= zxATs=ZC}s~ak{4VBY1u$M%VO81vznI{aDf9`dKB%2{G8>g)0Tu%L{r+mKCD2_xeYi zzU&#r_z!2Q{wS?E^?8o`2b|{bVqIknF}gy$hOXd4Qd5Re;&}#a66%Tezc_ZYKk;=t zvlAw@Wm_Lz)4_Zh;dF1viC1Qv)gpF-7gn7QJjdK-HBpvmv}MPK)^7GJ8eG|lMhMJE zU}mn*CGxL$ZZg_wcITT}W4SxeM!XB`d<>K2XS0jdU6h@?j^&FVbmbM9gRMK8-?=G* z-G>D`xwqM%vIwa?n;Z5ObA#PPTX!xu&yM%PMa<0PnrxA-m)TbulVsJo1FWi>Y-6CdFvrc8U{ow;#;{BZ}y3ce4)|EhT34d%Z88t*(;BttGxBb3C4f*^h8e z!NkDC?05%`_d=mBlfNE&2@xJ^Q0(0+hI8vrY#Nh&wW+ZV3 zsaVfUX{9u)sYK1m^@ot9=MI%TX~k4D%#9fMeI!n~*zx|o;EDr9d=A6q48AI_n!Oc_ zl4Col$;UQ#sLS@G%DpBH!=4jf{SKrLi?aUWACqwxTycJ3KsIX=5r*HBW^rY~aJ?L? zfoC;g{r#0ay=|@x=8M!*y~K!j-_sCKNh>3|8|Tl+R^T7hpuMDF+QIS zuf-J~mowt(ipF@>q+v+FuVdxIKC6y;Z(`=ObI1PMHSf@-XC9QST^%nzRFqY|pDemk z?dAk(bC zHd$VBdNwO6b6UprWo6Te`F6!MNBc46q~1D@r7VeKv|qm-raUXTRxQ^dCc}{X7L=>o zTzzr++$43KLt1lD7W7K1N9n`JZf$#Jz4j4YVaGOCpC!LXOpP7eJpJ+cT=gbmn!1(z z_Qsf!PNO{iIt|X$$tZOrIyFpj-qX&3Rcuk0{;Y z#O^!$No&}dhsJo8AkBg87O{%aYZt>ad6w>333p{}PLkuqE}crYV#_3T`m!dAxVpB< zzG#>ZA3{vQlGfWJls54jEL3tmpdt*}X_1aJk}YU?~_)E2<~0h{64 zriygPLJU_a`?lY7hAp^@x`VMEq! z>TzVnKv>lgU#)@|itB}_SHbm+N;SXZ^deQOpss^XF;FEz^wb3;>&Z8%B98L0=qzY6 zu~!f@3u3?DaMJUFuD{Xycd7d)W#vxmKdrH@ChMX7SF`r0_xPP(`2EzhK{+AG0W@^Eo}IAKzEIx99ZpIm{@I4H$W^PA6hy zuFEi^&0BC)w@WsI_p_G3rgopv(J7@Puwyp&@2<`v4H-5KS~smqKR&&HN#Hl;{COf4 zd>zJczA{c#u~lvMT69oWbJk9+j4oPttKL zthe*9pqe}5A2x?cyP9)|#oT?Dwu4KmVw9G2b{?HWG4I%oX8;nRr$@b^>J(<5906Xz12D3^RAA%lQ#FMC7twC9wJ$>b%7mt$tcWv3Qhz_ zkEgv2!;f;n&)6Gc;JFGfS+Fi{goWBY*Y+Or!2HIQf$tR; z=*7$x{nOX*;YQ^A_8P8x=q0BBB!xTpf-` z2-zA;)-J9O56%%X9{fba7#u+a&qIu!Q!C{YL@?|-^W0<3YXS>rF$wDdH7Z>VnAQO6 ztgWZ~i|2U8RGssn!qu!ijO0Xf{MfCKSK00;y1PkM$)MxfI^ zOUs2UeMkpJQQBwmjJ8>xz!)!255^ujgK~1Vov$N=$V**>tnF*{wy#2#2{oQrj!B_J zMUm0?`8xPYhLR-Z&(OIoNwP~HQct}|oab~|`xmEo8||KHJ#u<)kytaIh1SW7G6Nq% z7q`{-O!Lo#$s2QtpaGVr$H7> zXRmKW(gA9Y(8wAw6B25&jJ zwN({j>LqDq$vLQ*?UG+zn)4sBigFY2pjtjyId~W@M*7W4`k6}lSn(sSAi`h=6`V4a zE@)Ovqz{pkNPXDMT%BM)n|Fl$J1>4-yL|eQypU=2-g0#p*%dQmR?RudvJ!DfvNAs5 zGP>?sJ|7eIjUGA2xA)$HT~*uCnseYA$Z+pe*-E^Rc(0Zq62;@^D-6(z?^H+BV^l34 zbD&y2wlkXr>jFOBtgd6h%1&*8-z3AvvM!zx?3ilKsF-U$oQEaLC8&9md}_BdAKSj5 z8RFErnd25S>eOqGuJvO@gX?FNoPH34EnZy9cRjqIr({`SF7fQ1Q5C5#9@sMqM`_%0 zG_KYoc zC&>x5e72tC%n4ptOHSIw+}_HU&JDKUIf|aHnh8?Qjn4P@xf@}Mjd0BflH|z>7nGT!8 zHNW`So{=i9!Sb%|AE}nlu%cSNf%Tk4kgmXp_>}B`pJ9F-KAmil_;Bn<%*Y!xjDN{W zDxZdA24QI_%%Ul7oVzd75>@hn4_^U^KS6v^V%C^zdq(^}*UZH6LeeLx#R&y5vc# zr48cR4@biHw~h~tl4HAMn~&|1=`LG}kJz8VYff!uZj|-=Q^!YKajIanSaFe7jb?Fu zz;MNCi#^lT?AWc~TDL8Z<@;a9M~sJWyP6fpxQ9N|hHEx1XGGN_TamHY8fMm{VMxHQ zj(m^;aij$fBFo&fR1clO*G7>dFQAFY%qLtr^z={CwZvIzBL~ z$x6%^Igg)laUE8BhB4WZt`Lo(IJx{gmW?LQ5ArIjN-#|v!Z^*T^+g}2&V|A6PN$Wrx|*oD zOSV|E$;u&9!&i`ZSyl3h>N2`oWYyi(RiRC?^>L;@|A=$SO$$>qW)PWglc|rR)?Ck~ zE0AP8TTsnrw~`f2st!@q(XlkRKiyLH7uLt2$7Jf`3>(AMRHB)0o!Ti;Q$}sNu8$)` z*roJTfjRxb9?(i^$e>~=pha@^aXdEuLP}TFvRQR+%q41Xs<12u7WWVAj`j&3mu z>&qk~OVU<-ob1P9;nc_3EUcDJeVpAgg6$HjXeBmbBO!L`1Cs5Q^1Cbe_pP_}zn5c9 zZXq+0btaU}^A0Cvx0Ef!*3ASvf~fups~b$^9L_itWwjkK_aCuq=eTkX&qQiGj0$qp z9CKYYKMjd0t)urVgKZQ(dHVF^ya_2csdoz&;QiF#x7ym>yYbu9JhZB<#rtmR-DLGU zPTNk+!@I&K(Q1x<*V>An@Y$I&!Mnos>nG>U%u~G=R#oBsoZz?h>uYN84SJtHzpxO! zsoo3mZ+m;HlKrw}dFuUJZ$Sf{o%p1!4ZXkh*6-d%)NoF!)6>;RAN;g2Qy*vRgrAM) z)G!HM=sE%D0hQoUE#Q73t|ne+zO3$scX>$nU(RZx+VAvX2b3=GbQQk_x}}^x4MvbV zq@J1rnM2~;)H_I~px}uo%JcF2?%i|Lzpbs1#+fttx2g)C)YRbH`SbB_M@L2eD04#A z204=(*+)r>)pH9dCU%#$;x{P4;T zb7q~NmGh&wepEU8_8%|)agRAgb8i00oS$6%NzvTC|9bRaN6kAr@BW{@{L^n2yjJl2 z$KQQ?_WVopi=Vi+@Ic|jC$BuYyeMMDa(27{seFKsD#r>v!9r22VW{mfQBvr9*- ze@B<1Wp?RB^(lU@$gjwcqFlI8KOJxdRo)78bo$mH#MRXZ##df>{q={+U6hQG(Ty(c zr4WrNKfV(0(#uAd0wrM_r}0XR75Uc5BEHT|wRI#Jioo;X4JZYeohB9W1{ zNs=V7;pLTDqon1e5s`*hBOV6NJ2Z1d{dNx?=oS)l5w&Qm8(F$*C1g@kdR$41wb@eQ z!&8y}2@@XzeJ&0x4$qzxbsNy3!E)%>OD9e+4rq?`1`mKtI+UJ(V|Y1ie{^ZOYGbS( z7LWgfr(B782wkTcR6D9_jS33|Fz~&*%yl%4g(PAl!FU)qU7;CR-l5(NQZ_`0@HtC| zJh7LO7NH95h9wfz*sLZUnX@Q_#z!nrPHD<#>j@ybXQ~dQb3(E(% zfQBLiFoiWXj0lmND}Pq4v-JcCk#tNP4rK%jcJYwL7}IfWJtQ4ShNaX?>5=5~arP@h z6XICARv?K*uuAn01h8M02XxazON1h&Z`8n2xvs}QYVGD2_OK7;9yc=N54P!L(eeAm za#r_Lk@Alj|J7IH#=oZIL370Mm5jhA_fIkcL^Ec;8a}d4)>qm7VOhYdubvHLU`qgA z0|fm`FNO#p2OkP?UYgF)F_Kjw5_=ansT|?hOC%p4IUB@TV;lIimwJsZ?OzHRu|>K+ zZM^sv_S%=_hS}eioRk~eYv{qOu_zvv*6}jG$AGh!E9_Q-Y^ea)kVi%Ivv>OL!~s!A%;^NpBUOF*g`AN z$0hx*cXTCX@931bn6dR8HIBV>>eT61TU*IH{G&tn$IIRgvL+szc{|*#(N`<~2-(y4 z=FG4d-#2<$S%;c8z#f)#ysSizPrTEWf{h56-YGMv3Ph|V zRJMeyY?(CV)OP8+>A1Nv-+z~M#<_)%SQKHcvQhF)@>$B0$yP>}rmdt5jDBay@lT%9 zEAlNX77+w-UCEE4hp{AFcT`ygycdW@DBFbhN|`Z^G%YC_5td~1R*`=fMQ3A2;+bn| zmDd;?Mgo>jFmDk8 zWEnhnkv1GK-&UP*>a$WQjs6z z7|;fggf&HaZoeTM$}{v#0zHuCkC%}}CXE976d{sTlxIjRUU|TavrAbTG-DBx(JQk{ zT`V)yXEd)Fix6uQ$b$Fw#MS!brDFU8IwCZrpZc=&(tb)ZE~1O-GlS|8WjmxJ;V(eN z`#647wVS=Nk^Txil*Pp1VOv3TGdLpohNwmeB1ZLkntu$2J$pl+Idf)s7&CwYs|#Z( zz4Sf=EQLp(YVDR-(F$@1vmFudQNe++DYLUiwmpTSW_M))@09V#Bo%kmf#y!*)~F$4 zUct+I+3?)QvD}gZAsL|dJ@AesK=v?F$pF?kTCL;ZG4!5d2hBJ5#6>9fk=Q;$*&rLT z_GWmWLEVB%tr@+$Gp9~LQ&L`Lrs=101(F$gHjpNV(up&|cGNxQC}-pP8^+az7F|@7 zGqSH`m%_eWS*d$PSocxa-V~LVT+h&ICI%Br=}3@6yO_qU1gepNK7lA(?UIm%NAV3X z^O5W4&j?L&jz@Pxi$iwS=#VViV1o{UjMkvAG(r}Kt0G^?P2Pb%f{t_;SQ_JtL3ZZM z*$~^(GDyzFXRNGRA?4Wv^H)@6h>=2Wdd26&NVU@&WT=dcbPDT_*q9Gnx?TtHT!NLU z#FedogO|G2R*|owhm;%pC-1|DmIp7zzL(134Mx7#l8$4|&B%Ogbci8Rc6K!BQ2V>k zaAh$2+6Y^_(d;6kN3d5OO3ywauBGVFut$QugXn?1-Md#tG1@q7l(5pM9Pf_Gk!5Jk z>*y;OVZ38GZc!KBV2M$j=YC&C{!4q%jFU1s!iZgcip@4kp3kF5J@RCvfwm(Ek>Q#8 zhXgn=V;FxSoS4ZdA{$-f9S~j@N~>0*3yeO$Irmy9&9f!P)s7A%Xrw4H!lwyiwVw4U zGmXkpw zj<1CNEYX=cSK!lL9inSclEdy3#cD#3UV2*V7To3rN{LtO(ekhzGjmelK9!JrPG!rj_>?%Y|mX2caI7c(Rbye*muWL&AT znrsX0LwXLF8suj-W_6A1@%fCGrEJF~orgIQ-o7slJ?lW-jNITQv~+bWDqrjy5n{TA z2kT`ClYH5NZM5nxb(90C9g2mF);_BnTni56EOT5RYTQNLK@Pl2wUtQZcz?B|yS`eA zJuk*j`q*w}-7RpVysF{fsuxP|o?+;lA)IUmqKwval-Ys3}U z1Llzj6!MX!khg93v@(%)6XX&4iju$`MixunjGI?>uon|q_8+h$4LRF**+QhG2`}b5 zWRN^Z`(zwOLFuJ*HJi{X3B$522}`6VyLIAVgR*8q%WH7fHA@%vY@|C_Nte;0B~bei z3tJ|i;Mi^rUbX^vso)7$te2lFCKM~X5O=yLmQ`L*Ti_ity=ULF4smDBM zu3#)cUv)fothE*Pi5PG^h*?Ial(AEcWgP=yb!d&OcZpK(k}*Cb!>83#1j2n>5w8qF z*e7eAt`s#=wgxW;KHxMGBz+=-0K)F-MH=s~>=UPi=*$a#UQ+wwBuSFuP3klu@|oGC zGfL-`c1u~ic82=5qGDd@O)0duLf@pSZz?Ld&Fs=t{df3|dg$oD`_^taYuDNhtvfpK z`%UUyTU%%641J>Hrj+7h^g6o~t{?%-BR9uyCVPQfK7Wl{%T&(iy0AU+S?h;2g25Gyus~(ef4U{1JWoi2Gfp?&Q7dy zaQ@PaL5$}qju;hV0INaU7BDL=246^Z*)sH2QPI(Xze-IhR+7gzKvhuzNdPhT*4fFu z-IP*N0^HO$$;JGpM-IMA)h*Eu`XLsn3N_9@LKkR@eo4O25o7^wHwPHrc!N-o90;HL z9qHh=zeO)NdkS5F0sk$H!w7Fqp-j`r7~ew*kTFov_dqpIYKkIgnlayGxQPN@f=B%MQA^c~9*7-3gHOMLhn zVh<*S2@*p)aKcDvU#zW%P-ov{Bw9pnK=cVb_Az@ zFAwSJ6mVahrq($Vozm5nlTVlFGjXuDb?el(rcMMZ1Z;%FQa+$RS+IaVo0^AD`|5o+ zv{iHCLOMOX0?&piQP1Y)ef#QKm1$5E-=puhe(2EY(-?1ZUU>u;A&o=FIM%MEv**Bu z)6h7ZUQ~n==p)qcebs4amY90ZgSwVL&)_T7c_w)oGK|_OqWNt#J7y zM#zABs+N|N7*4bo72)stD2b4+7A&Ci)KBYk)a823jBI?9%ED<@qbDRcs;m&Qm|In( z`i^P}3f${zq?|t#SNOP!;faU`K((?3sn7$^kKI&l@0e!@In31S?2MMe3l}J&C zF+xdP#R2sj)n&l0X6E%_-ztiF7Ge?Q?tZ`W*^wC?@62zc;l!S_etn!TT`%h~#QRC+ z9eRwCyxIqN4?U*XzQlj);>-5PrYl!P8rRC6< z6kAx?d*w^HN}sbLvFnb&m!fmonlzIIsV)m%O>ej3wWXP-UR(brJZ{pvJ7g5o4;R61B^UYLM z`_tZz&*MYbCb#OH zc9-bdsdKWymp7q8%H&P_)J%TPvRylMUOfTM&YO;?%n46KMef8;fkRcBTf^2PrGT;% zl`~dst5=yv>c$=$du~kK*mvWAjhP#D-KD2Ro@k+}9!(3dq~~)Tl0A*qy*;9O6eCjG zu-$--)T+DbPa)!7fJW6EnvukJBX#e$q!fgw;uZ#cQa5HRq{Jv}CHsIT!ZE1DL>r}+ zOKYp$OH?jr&bTcUS~WYUh!J9OaF}m#?b_ipPIFSyqE=K{CfW?xNN9BnoYTI67JY+0 zR9z_MQ0@c!3t}W{MY_?PxTVzw`cWD{CT054EsO^GYEH^)1Ao0>yzR{++S@Lus%7%m z3);UswMQ>ocHzxDRn4dTS$~hV>a&aVSzFtMi>Uq6E5YF1vSpq6TdaWE+ws@<8_zu- zqaGaYxTq`%n)CZH?+#)2#qZ6!0un1A+;*GGB+dj z8!0Kbq@~^ZiGK5b`cwC;1bb^=tJ6a? zL2G^Yfj55TJoA_3VBLiP`1J^`+|Zhzhpb`_cHd3!LC;|5xr+n$hiAHm7^vPHV-v&R z4gkxRO9_Ux`smrn4-q5!#Ax-r-{2XvZp*N5gIL^+fm)L^SQc8|M%EtP(0y8?cR|2Y zec47#%{}gFp`v|YN%AfPtmlxCR|CJ_axqtGKwG8JfRMi#Gk7vEc7@1hENPPbF{<4c z-=D#ip}H%8iaM4z2pIxfY6?qFw+f$@9oM6_B3s7cGlU5pd#Ucv=q|J&@>6aVSY>3~ zsO5zIA#F`~AGk~Y!a{8y6nB%b+mnU5cBk)C;k8oc5V1SRI3g96vu-Upc=2%Gp?ugM zLpcIFX^?QoX_;)5N7wyHd4x!%EMQ@w9K5!T)~?N|$Yornja-bLR&?b4AZzMVT810XjUQOLk$s1{ z=AJF9V2jY!#?gzAQjd^lMBiRZhQ5=-$_Q)?m?zWoEKD}3`-DsltB@1fTf~ArE$gb# zinXdTVxHS!L;5M=Mn9Ub^sZR@mJIYPbcvrxZhFf|)%}H--VpOK>yIVkTAQ>>!vkoBOe!D_Ib6Pkjgjm%*bAme@5mGA;i1leHX&nKiEZa0E&wR~Tg?}Te1>>Vn z9^JH%oF!i^M_OB{oTeTNuL&xxa{-JiB0nx`$< zkOeVD!&%ydlyvAPF)XM*W}!zlEIb@SYhY|5^0BO~s25lbXJcfqG%ETs3{;EIqnIUH zgtG;%D>%K;yo}j`<5-A~TOwDpW=xiy^ipLDAy@W3p)C_-f>thzL~=7+?GcR?6L!WW zy)ww_t@y$1GE!xKI;*nU5&n$SuI1;lkqF2yc@B_B5pQHmmBo6p6Sk}j|BA@TP$UxO zDaUBgn|lwn39?UtQQJotL0#>6<^&ND z3<5}sB8-*+$02J?#_@w&hOwNZLK}2+Nzd?h&yFUweVR;wElu|qGSglv`ZIPRa2gGW zbrR1x$ygiZiWUOz>Nr+kW@Zj!9on*m29eh8GnA9vtAzr&MkotAyEV2bY|KPcF_TBN z5XLQo+i8!#A-^UY=Do0Sv7T1EpR*ri4c>KM$e662aGAf0#5`f61$o>~hg{LJt_nR{86L+GYn^~r6ZE>95Lhx~+ZUF~o=txT9ciBuc{R`5(U#f=xKHFL z5lK+~NJ!*dCF3K>4Eh5*kqv0iBM)V%hWNY|@!>|>8uW-pp4QB5_y(=Kdm@om%vMB3 zgC87lKR)bx>Rv-Tw|6{DuW}YrF~rJLs1^HJL@SmKB?hle3(dfqjO}rJ)OKQ9s*u0k zo_sB|ES8Cd-}e_0d$FV60yB_SUy_b#v{V`hFHb z%1oTbCy9v`YFy5!h&Qg2B-){n{X`_=XqT-)_+7Xfw4*bR?OCCt&v1=L?VuUzQ`)U! zYt3iWmi3}rO1(I|N!#GATS^NIvvz4qVFU=Q&K(`I0j@fb#C_{|!A{jvqeT7$MO zZUtOno^5)|NR{@jad}qs}qm|JVhm8`7Qqm(88g|SPC zLL$(8hH`SbVUB0HbDtWs{THD<$@U}*=9wSh+U&1Ua)7PPs^qvk)JthD@kDM8L4dRy1#J7VLx}7=vGEA zmQF~1E;c3SuodC=VN-gG_yxC1v`#f+CcjQKf8$6;L{*6td4+80u2ZQ$wwvo&r_x_C zPdSFWPQBiij7Ikv>Pz}3ya>JW=*C86c17b-Ze=_|>(q+G)Js>ZPwp+4FG5_dFS4Dp zZR%)Hyi7)=z{g>qu8m4L+VQ~KZ*Ox}0)KW8){G3%ptgduc zL+eYaO*?*S?+T-$)V#nM%E7i0&s<`!@DgZ3TMSsy3?9Y-$jaD)maE-o$llg3Ya+0R SgsVo=f7sf@K?{j3+y4fu33!eG literal 0 HcmV?d00001 diff --git a/vendor/bstr/src/unicode/fsm/grapheme_break_rev.rs b/vendor/bstr/src/unicode/fsm/grapheme_break_rev.rs new file mode 100644 index 0000000000..273f68276d --- /dev/null +++ b/vendor/bstr/src/unicode/fsm/grapheme_break_rev.rs @@ -0,0 +1,45 @@ +// DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: +// +// ucd-generate dfa --name GRAPHEME_BREAK_REV --reverse --longest --sparse --minimize --anchored --state-size 2 src/unicode/fsm/ [snip (arg too long)] +// +// ucd-generate is available on crates.io. + +#[cfg(target_endian = "big")] +lazy_static! { + pub static ref GRAPHEME_BREAK_REV: ::regex_automata::SparseDFA<&'static [u8], u16> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("grapheme_break_rev.bigendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} + +#[cfg(target_endian = "little")] +lazy_static! { + pub static ref GRAPHEME_BREAK_REV: ::regex_automata::SparseDFA<&'static [u8], u16> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("grapheme_break_rev.littleendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} diff --git a/vendor/bstr/src/unicode/fsm/mod.rs b/vendor/bstr/src/unicode/fsm/mod.rs new file mode 100644 index 0000000000..ae6c499fc3 --- /dev/null +++ b/vendor/bstr/src/unicode/fsm/mod.rs @@ -0,0 +1,8 @@ +pub mod grapheme_break_fwd; +pub mod grapheme_break_rev; +pub mod regional_indicator_rev; +pub mod sentence_break_fwd; +pub mod simple_word_fwd; +pub mod whitespace_anchored_fwd; +pub mod whitespace_anchored_rev; +pub mod word_break_fwd; diff --git a/vendor/bstr/src/unicode/fsm/regional_indicator_rev.bigendian.dfa b/vendor/bstr/src/unicode/fsm/regional_indicator_rev.bigendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..1a3357f714d45e1cab013e2d861509c889f1c053 GIT binary patch literal 366 zcmXRaEiTb5N=;9#&`m5Y$pMenwnHeBJ7fQ21X-+6T&=eyRcEHR6 e2CO&%8;O9O0~KKLxHLjc1;J!sfQFS2Pz(TV><#+> literal 0 HcmV?d00001 diff --git a/vendor/bstr/src/unicode/fsm/regional_indicator_rev.littleendian.dfa b/vendor/bstr/src/unicode/fsm/regional_indicator_rev.littleendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..e437aae3ad775a5b2aeb507e618100b7d9fa8e90 GIT binary patch literal 366 zcmXRaEiTb5N=;9#&`m5Y$ = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("regional_indicator_rev.bigendian.dfa"), + }; + + unsafe { + ::regex_automata::DenseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} + +#[cfg(target_endian = "little")] +lazy_static! { + pub static ref REGIONAL_INDICATOR_REV: ::regex_automata::DenseDFA<&'static [u8], u8> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("regional_indicator_rev.littleendian.dfa"), + }; + + unsafe { + ::regex_automata::DenseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} diff --git a/vendor/bstr/src/unicode/fsm/sentence_break_fwd.bigendian.dfa b/vendor/bstr/src/unicode/fsm/sentence_break_fwd.bigendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..10aec4692b32f7e2d6ebca5c42f6d9ae0d77afd1 GIT binary patch literal 144343 zcmd?S3!Ii!wLiX}_njH85*nGBAtIuA42jH$jL1wqMjj+IL*$?tktvayKaZK`Wf)*) zfSF;qUuQt>*WrFsA~cVg$K&yMJRTz>GLMnR$jppG_WyqOUh8@Hv)|{P8Fa8dpa1*$ ztj~Jhz1LcM?d!8IYwhRG@7{IyNALXlH@<%FM{oY_-QT|B=DTnH=w0J(zVoiHfArST zH=DQrVj@#wGRFM`pY)ddd*+=c%4ADQ%i6W?(6LkJle)aG>&d6QzuN~+{orY*pYfqH zKivJS9%uJFr`Nf?&pZDk7yR9YAMJBd-;eeC_{E>N{ierDij2Yv3c&tLw9 zE3Uli@2~#i;4fYC4@0gU`sHEQUH_FEzB>HI5jTze$5A)m^0iyPKKdJDzIofXZogyf zx5s_w&b#jZ?mhqS-haC9d-s3;fq%}8FP~5`anj_Z6X$&>&3)W1Fb@6Y_lv;XyE|NR?(c=L~M{pslc9s4s%$Cyu;4jq~Kle+Xc`|O?{?bGL?fuH^Cph2G-e&eW{ z@B7|A@8ACjQ+VuOn8p)7`N@+{{_DR!_0+#HrDy)*Kc0Q|KmYT&=l<)zo@atTJ-{S? ze(>NgesSo~FMs*cuMacP|9$PX-~RTCCPjW>`QY9P8y@a2LBJDlm4{GWZ%{a3v5 zd1F>}HKxb;z-w81UK8-gx6pH+}DW-~ayp{Vcs_o{7uszipZQ>_xBC4j*P|{r>mHwA<^-%Hqr2 z{|?Ak8Onjcvg{^h=Z8ytCezs_l*XOMc50*d=G8v{;L27O?0RZupRK4iGJA|Fc?q)SO(Y( z*avvsL@#YM(XXB}(aZJ5d=dHmVh+!b8Z#Jr48GVz|8ooAX=A?B%S5kS4Lr#7Z==5b z-!Hh{ooJ~+|CZWlu7{tp&Xss1tyX)s;tR&0=XNdL!`a&}fDFHfUx1##@YUU255M45 zWB%?Gz(Bw_*R%hw4$sdTb0LzyunV9k;2L8-inRK)2UNPA-DhdCr(Xm;F9PoudH{nT zy}gIFeYSk<-^bUlPd;XBTeTQ%iJ0wA+a)pnXL>(xGUt>7ssZ(`|DH1+&l>>y0qB?K z95I<*=(D}hXM6Pn3;+xR@2e(r9{TxtO(t_L=z637_J*w9tKO?o>f}Di86e1&4bwQ_ z%m)UW%*p!zj{}}|xjY#;KN&edHD*rf0RY`8*8s)<#sTgH-|Z%I>iGche(+S2>2@`6 zFTe=Io%vqnQpQ^7+5A|1a^pM8D-qWr7@K z&KZl=h8FZrTI0E0(F#`q@HPor`y1@T(24H^vz3>Pa^}X=uNE1E!qjhbu49NqjFv&SDFET|dt1g0K3M@P+=e;;Pd z6R!c^2Ur2v4M4~J3HtI+4jc0f=%2xi^FJ`iJ=+rion($~{y5f53 zPK=RvVpO`TAK*3s#?8C712DGU1sQi?cR=KY;bbU*5w z>#2M1w{_LioBd;b-=|OE+Fo`;QdY0|m3`U@fUUea_}$jT+r#`0C4mNLUhf6~@9UQW zMgZKK!@NET&-0D>{q+E}+&A!Eeq$(LAK)$f=J>Feo3oi0UB|RR9wLl5k+}gd3V_`Q zgYn-~0OkTV1NH$>TLv{1VO)zk0#F;#3)qvp6R;St&P3TW09X-c?=)X1GKRSsW4!Z# zovZY|(wbeYlzKbyyAJFX!7hWHRfb_-Sd2C3QDfJ;SDb-ehV$jQuibGlSKJ1CCtw-i zki?-ybA5azMxiTv0q{P!avWe4;Gi*Al>r6B3fwWO4lzshtz_em{MPv8!#1(Fgec=JN-a8S?@31O8Xck&NLC z<1?}TR~p5vGksS4-KJKJWagiyVicQMFp`=3o=c2m=KE0N`@I3EoA1vCJOp^dmW?h0eZLuY;KjK4TvSL2^CrX2N%k<66uZbe=FmEJnFKzQ1*K)tcEHW(ej9ls9K{KSAI63HsJgDgfwP zI-C0m#)T&@0K969GWBI!JxB13A-QLxe%;x?E_A{F6MLM$Ss1}ZLjOWM( z99>%8s#1?GeFn5>(c!%8Go2GXB>K#L6Mg0t6AkPEz|3Ia?SN%~M*)yA5VL{Lo&v!9 zZP1%0`rJKnsYjnfFVcD0Wmt7yw$+w;^!Yxm=plcl(X6>Sbogd(ZVnyNrpy+i?^L#~ zuG(@AeRnSt-Hny$Jy_M>gV9aTB>Xw_|C@=qGu}$x9Qtpdhcs6++C#bxPR;|kSH(EL zhwMfFZ_Uc3t#|x>_^OE>!Jf+_HThC+VaKm?uC}gj`t2^G3PW|yKde3^&58X+O>Q4 z9@Xj$$Jw(Fv;bF6k-)O)=~Bz)Hf`R#Md`~d{mEX*&YU%C_PqJ?7cl>e7B6mSXk_k% zo^pB&1Pld0%O1$>*(g(npWPoY7;rCOE?_6%d8g0WuUlM_dvMvZ<;z$2(lGx+jg;oJ zE+me%c-B!!b~&Ng4V0n%dgB4I7KqPHB$4 zj%_)eza+;VI%R5MY&ORpi*VMroWy2xY^z}y?M=ck(Kx|NbCi&dEiw$_*bs)%^d%XV z$=Oj!QpmtU2Jx|;x$(CBdFiv(CQY6?ZCVXmT~e0vDK5>?a)zce>2z5;Iwa$=Ikv52 zSgEz!sjQkaHyN(!WYH4JCnV#txjhfrR_W=U$;BGmzGeSOtI66lLK!p*N`_@H{vbrS zN^&!1&Y5dR+MxAibF?c8dF^Nxr#N%gy!lCrlH8=p^)oDAAg?sXw}~e+u;1xmd&9Jv znp(E4#wB)~_3~~4dd)#8_~tKYT(V@TXrk##8_4ARQq1OPHI>vklUu(5A;Oo*En1xa zSDM?rWy{v>J9g|$@@UOva(=pH=quGz*b{f{&dX5AinC}{aqi->q?J}OjciW(vsVi2 zjdq+(ge_bYw~M&t)AlPVuQbQ8X8DR@V?;K$X6@Q_NglSUuw}NhZx-5^S(`F9GQ_om zH=(Cn8QMctHQ(ocE$FDFIEywJw^J#R(`?F|FH}{}n8~qv?z}~d-8*f?%9X1)maX5g zVdK_qd@I`)%yhN(PXI2%$Wc|z78;j!N-9~5r14lL@tK?*w?)59&L4&2TJ~hc%Jg!6O3v=V7; z>n=knZQIWIdUNxd_o0Vz1~YY9Z5^#h7c6XOT(^GHX2&aKkfL)~!)gE9S{ionQ4lFyLBH| zDmtq3EyP;q+mCM!zJb{Sv_-ji~-ZPn(a} zSqtl*<04B@*RyUt=jYG8v(j?MoN+XkJYD*fF_#`P<}>|_Iq#^;+h=aYTJ-^A&PV#p z>-oq7@n@jRXSM^L1Moj|W%$4g1YZqW?0(s>+Yk;J*hO>yAH_3Pjh{unKidn?A1l{- zV?NRq&o{W0=4Tf={E@y09|Bkbc+z|z&bM0wxt)Tv`a)~D6tXY9#hBh$Azz9*=?y)4 zV_)>Vo=%VRF2VEV@{IhQH`=9nDfB)M^q)fAQGe$DyvOWwiKGwdpFZMZFNM~iIy1*T zi*PjMjI#Nb21!h#*Ji={knSsPuV6qIV_=hJSKjA#$1`*tFaQ{3G~iAE+R6a%4R{9d zG5~e<=^g;Iw@;&puyIM$_4awet^!rmW3*^jr%2YRd(4D1xkKn9k z>o#wPsXxk=sr8q3-anU5J=}TfKNIzISm;p)dAuU4pz{g0{u5OLhXDl<pX_GLCkFw*OBtV>ia7MUPp**vkKy?( zl+7vbfB%6NpOmuC6^}=h(^J~x#XXR(0jaxP=Hg+98)M}qcD~RJsLN@xU&5JMes_^? zujC$>ma_E7kE2vRKFVqPah3+OVH(=wliFCYBYSO{(jIjsIU%>Vq@7yR|@TOM&QtZ}ogn4k8 zr#oqduLOIBlA`8UBr(R@`60c;WOH@X<2jwTm>t}drKpIz8c8#n$0&~BivMQeC zdRnt2H#Tv`UUVi6>JpSB$0VfW@v?-tBer7Y)@_Al#~B~@t0qn6%tUkyxV1c}v%hD; zaPD-FyRwQY2Wtagjy?-+kN1V{N6AbfDB~~>Tu0irs&v5I{cWyPy4d|OI+#tX;W+3# z%GRxCy%v^*=CdW7!HPsm3MIf@0q&ALhmBGsj{6<)o{LCl`(C@w+j-MeW1h9^!o3@|hw3Stx5WF%UTKHr(vFJ-`&O-+ zzF?u0NT93oaL1h^W4JS-`m=nzohj86n0sv;MdOvS7ss~UKG(Eq`wr^M9h|W5Y5G1c zk=4If(jv1RwB)>(Gr)MiFi1}&m0&lm*cc%F)GNDqUXlpgwmmHWj&XmSGPSmjduy%9 zk&ee%jKwQfN==B~S?qAx-Fh$OQj|d5bZ^H~^C-2)Hq8$$>mEZ83n zyq~;%Ovq|+w>03^8pvXIGn}twb31p1`)6f#?}g)A(a{rS(+*?0Tc4%0Lv7W9JD}y4 zPjF{1Q>HF`Ff3oyFvNV&6t^t z3 zF0NV2TJiSDJPOUVmU3xs>4RL6#(M^&WuAnGCl}=to}|8 z9x?YB3v`cL=Vft9Dw(sbs_KSDmb1%$+?#{6RYxClwiWJ3aJI!giNZd|H$W_1a(t5A z`{bN-(PFL{IXbN0(6lLjf3-pj9b4R3JHFiQ3{Ya&_k7)zs~z4!?mX1nHPt%Q)CHGe zq@OvfrP}7$GGnIf9D8G$rk=r0S-uW=Cd6~m!t&xy5#PEzzptqkjzA-oS!(AIa^jeh zW+_&kYu9aT3P&F0&*o;&iQkZt`!bw@a`x%%DQdZRxYX|LZfuHcRy7owEHn#SLwkhj z?r+dmlv}Y#;ry_1N!l(ucg6hjWWAQ+jlwrme3Gd8iquYMx6amrJ72Co?HN)^$!Q6N zIGd9_Qk4z-KI}hp4&i#^s@3Z^=q_6GWvFe@V$FGgv$?tR!Wzn8_a)zwIM?J3aItqt zJLI}!ag&thO_DB&IWznj$U4PZc5%FWt7rNxUwmqP%!eM6xt(a6DP43yBU7V zGTCFoI;3_gg;!7a`QbZH`LZPoPB34Z>ci{Kar7=EdX+ zXP8RQxk5bdNxJQXhkdW0cL!~br?+;k>D5=q9B=RN_qWsPEUkr7s|-@l_Xdt)Tv$$> z#{H|-SkGkbygo01>3rOD=+wDOkDedBXyBkhC&;5NzKKC?zngnJ--h z+7X3Tr6X$cR;BcryJ;W*{vkJw0>IDYrh5Q&09cmZv<|Qv0E^O*vrY7mJ54kS`*Lcj zIO?{%Rq4&JV!ZhtXUhw(tSDD&_f4(c6ZTJw?#q7o70_XSiF>Wxk2ri*AHkRnorS$a z*_Y*df8Ba_x-DZU_r7}daJy9S-M4#Ty@tCTVZ^=9)<5@icyi`WQP{HFN)NTnQs#Xs z#I$N8W=X5fDCcDwrdZ-i@jjk2SLXRrJC;}IGP&Kf*JBJI605IFZpJL^TuLZczZ2^@ zw_Ce@{YIfCzowrQBJZN81^^ zN9)GY*uITgiVj&jNB439t}>L=-1*L`&5I!y`#rIx;s~5LT~wP%6ypiT<Vpy%Gv1uz(Zz2rOIHfAh#zQ@i595UwHy#d(i|Mru{ zjOz-(Nz6FxTaQB-eWx1${q{Q*0F*Dfpt%r|g0@Qq3Ua`KIrjTuu0KWF7(D_2T}Q71JOnrZIEJ!Cd4krh(AlFatSvO&8ehBAmG0N(18)U@ z>uXP-G|_Irk>RW?S3o<7fxQj6w~KLQRfBsgFXAMjMaOt=bwR>8O1&7i*-?fT}Y0fzyo*;_gTE(Z(+prmeD41m73yy;|o4Y#YX7N92z z>8`PEB!}*&nFwi>V>0mu87+!rNJ1*RgLZl zQxlZ=6}Q=Xceu_zd*`eizje$5mUC7Ku_v5tTbKnp%Q<}q+EGL7`B@%wti^f$WV49< zg`Ev=-4?I9Mxd-m3{C0;81JwnjVwK;4aa6|K1p zAiOt$<|dRh>;0w+0Vv(;`v4CIjFoV-0~?R_cGKekl=Mx90dJ!XK-S1^E`H>hcZJHbQ z8NE3X{puq^^WiQ&3JwW@G@ke9vRQJ z@)cM%7N1`UTnyI~Iikegu#oaWcHH|9FD!t20$-55Y6V3p&$?r}VW z?z%Vaf1X=3$mz3MfglepVK!9`7mz5-29Q(vBM|F^^5itFdJIFfo8+8cBi z16-cX&|55Rv|s_kx|__xg^i7Pg6`;<(Qf2zXqm}4uYqgdwzL?vP=_M#TBm8my+DjS z5v@dsmu_^JXL|gJ3(yUlRFf(z ztE;C@t*e^>bN9J(=g(ibaPeX%ZS7i0d-!3##aobcyz!;g)e9S!EnBmOtFRQ=p3MPc zy|M~y4!jsENB+k)2Of9ApNHWn$yWLE2(6XR(r@Megg=k)wBXOvO3Bn9)t{#bf5M+f zXj1)oitrcs^8|FIuzyJS^AyB$_2~KY6vT6m$rT`4Ls-ICE5+6#UTu5UB3>vPm zDJosC^3w2#r~9Cbaxz{>+sv%pNRJvy0F+hLVznGwl}M!U=ODsN(~vu4qBEFG*_=xgMK!Iy^~D+~cdlihQ~T@n80h)&FX6yQv*oZcbS5x}$N z$||0Z*)tAL^H@uSVYQvNe-Tc~(%f@5#@gep-q>XKq{CVyt&}ECJ75cAcfWl}h_%)* z*mSJLS@AYn=99~-H=7#60LTSvPb758VUt3vU{Kl%7Fa((iT8EUXRTRH0l0mAeP|QI zSf-#{iW!EuvdNRHs%mN$FUHP=Yn4`GauI~O1a>o0D#E8F(UI@nX*JX9SFhf*Y3o+* z`tB8-RYn??JadOmPZesXb4P8Vb$g8MYc#bGQ)U}u#TJ2dS_)c* z!W(fX2G4jOPMTCH??Z{R~Vxg<^>Yh4t6k{dDGX&wtBxrG*^;x#@Xn^a_p%q=`j*=RknJ~UNiAkiLJ7pP)HmhjicY1l zsEKWO0xs&&Ve;ha>d=aZbSbp4K1dO^6R^c)nhh&ftX`eSt=5B;0XgmSmOb-WYF<0{ za&M`%By$aF;iGy;d6i6^x^m^7J$q5|s-@rzT>c+C`CDI3v*yn#)_5 zlo5TOiRqaOoPm`Wo}{cwU`drel4cgIka8qfN#43j^%Sk54X(61;H^gsE6k=>uiml4 z&7vh0O-(hWM1@Rw`NWCwzbJ>*8nxx9jrE0X2mD_*-DzLB(VIc@9t5|y$V>K}Ck_q> zWu%Q;i?*8Z9K{RQk>AO)doY+gEN-Cv@y2c2;Qa?xmV2D6@6;sog9{r*19jzPtm7gIV+uDyuaajt9KW0587H%yOK_! zxBN_#{GxpZ2B6SfY8*3?%Bs5QaP$<5G-?onwnh3_BM$oz&Vo_tkU|N46dPA_w}7Eq za(IU4<3?xICT{?3Yl7+h+u+(RLdufXZAz=lz!I+Q zG?UxD6RU5fE-#-nY04C56US7108Q4KfO)w=7(Cs179^BB@8M|=M)k%`J9j_ykXNdH z{Arl!qXckI+z7v%`F8$W)+{KXBle{)`< zl7{BimV|_1_QKcToQ9Pv-Tnu)O#@q-Z0DSBqr};=N$24*v7z(EIqIvaOCGw|eu?Qs zC9Sd8Z_p=kp9U5n9EW)xOG?dY(A(nPr&2}ND3`PPl(>(8aDRs}9#ynwj}6P@DtM+R ze3{w?dDAlFWNWj>kBQK7B5%95v5B7!5eq(QsB*PlR7)Kn`jPzOpetMd&mOANd&9L!^_qg&C3temv$S{%dLCooB+rzfotY^9Um3#73 z?z_U82jDW4hv!pXB&E!R3cg!~4`WN^l&Sp03&O~uWh_{{%|({yZH^G$0noT)aOvd9wY78Rpk=1SgTEv0j-a=J+i%za%SCHp6O?{j z8`_EmbN|fVq`(w~Ct8cQ5G3Pl8wcODv*#^tT)J%Kdfb1V7zx;J11Kw>hE^Y2lxi${ zC7+oFN+$H#-@|dHNQwF3rC1@OB<5jyl3r4b--N|Sk&?`gA3tgGoH+^J%ycYw;}EXq z5;m^XSTzqyE(1GnsS)TN+!r7@WsWoS8Fnc^0z5vLh8u~rXRKW>yGEohn>G!$vkht~ z?Q1|yM2j*EiVf@6+mkS8p*oV<ROm?*$1%J~ zom~G-;6H2n41>(<#7Q_)ML%G;#BoO~wygEj)p+b+zz-eHHBzd~smPN1Yr(U}_2g+OD;M5TiCIkrJURlqTusL>6>TvR zhf!(?tWxr&0@{qT$rXx{yfv=M6B(EhRZp#($JvFJiKJ9;*8}t6^``b}!@GVx<|lSX zjT9=M*ayVL7P}rz!Hp3?Dy_INBH*y?)YCKVf69#!DNFQK%QHNMmAc?%v~ zzOv9l*)KCKC#~-QXJL=rz_+5(K_9HEw{2r>Qa1syQszHU;#6UGyoV>LmE~%u&#^mm zn4cxVLtDOs33*%bu1TI*-*rm8RJ}=dL6vL7O zD_L8s7j_b6oX~Jeyj!^gE~56H0Vxla+mf~-vrAwTJ$KQf2F?{W<#&d?)ZIr_4SX()2sDUh?VuAPoWHQY8ZcjfMhrXFHnx|SViL>sMD?C>7H zHogxfEw|&E#mc1_ja0)l%@B4H-xsLOX?T;)FR$;)A^8A z%$c`&vm0-GUOszp61E|dR`IsKI?H&UPtypo=2OC9iG))RYag%N8UxFCnJ=ge;l+Lw zcK#<-RZW>%1Dmx*oKmk?v1;|Yb&zDO=C%ELdi!}ueP$Y(j^K6^xwGwdK^EwYQMDx2 zyx_U>crKSYlXn(8&i?nj7n1Ss{jvjs(H?za(&WNhV^|NM z?_C1u3%K4%Z|#jS=iTRSjG?x2Q%sLIO`dhKjp_|O+!5s-gx)fhx9SS)WUaK9agW9W zkb2ZwlK4}qU3w4p<&4q*w!pxxsvvv@C1PU))v_K;~)b&mpmb2YJVkwbur(v zI1N2M-FH~sQSyH!y_s$|JJL?9gac50{j6E@Fz;|By=v7Olyg(l)~z^?+O4|)ZK&xP zlQ6zdomx{xxq}b7>ZK%8TvN+EEp45QabF9=-e-H3kGEP}*!eQ(+3eM3h4t zcx^R4Y0Q$Y@YKQ_cS$b*=4wl>0Nf5(W6aXdfDr)1FU4-ogM$DSfESEeb^%~40Q0wH zsQcw-0`3IN1z?W60=CmDMgr~y)B`XdT-h5i4geV|oARCpZRoY-JUD3)V^8`QAcqT{ zHD+NM0I7fDWq4!ZSv|KF4n{aMT!`5yJ+~GjHw%{{9&@XO+W`lRS%k7*)DdtAY~*2+ zzX)?@`co{b0bn0pJ+~G;h5w{KX6?hx;y%VKz7%jbpb{_}fZn{+3oXIwz^yj?} zjMBFlG8*16rm;U@+`ISSnlsjzInNn07kQt11za4mpbdT=d(>;)*B1v@QmiU-$hlp0HU&M;tb2OeDS!dI&v zbyzXyN)2KiL4thxjE4{g*dtL`OZrbEN&XjRjp)%2st!9c*^ z=pK4yO}snrl{N8c=an@P^*yN(fV>y+%A(z$wHc!~R{2wwFYvx9e*^yGC~dYD;t5^s zbKrfYV;8XaIY>y>-o=YK8%H%+e_5}iHulJJ_u^-DTiC1U$lxA)!we{dMSa*)j7b-yjNBAR{VcR;?ZlW(MRD`)hZ9FYUl(#K4f<= zX}uiY-^tSp?yBUi!5SL9TRfT9$r}KVyYwf&=5S@kn97cT?tohW_X9vz3A#$O%1Y>1 z`8wdJF;(pWeE`=0#sX@bj4I@-3iMSdJET*@r)u)WlJcFjkdP(> z&gg|#aS3_Jt*>ve51Wys1*YT(%r z)91h34E<+H$@j!|Ag zJoh7KIs3EJc-zisT9SK zCjK`f0Vkd5{x^*Gb3Er}xjH%g`D7GlN&)C!w- zai#j-sGJZ}UKkeqxBfQ>EAYP|otA=@q43(BE<7jvZzRsI|JeUVUY7Yv%F1;dY*{9IKTQ|^6Q6}Bt1{G zc0if%I1ve+_lU~W63P3EXpG2em7j?6sD{ASBLs7{W_&)#rFE%TW_fWQy>K0Eiu!yg zuVV6QiRd%2A1@kvJ|EDks~rny(agDk=kt;D_)yutJPlL5^}o^xrd>>aexKs)5zt$m zDU0DETf9A_>|5pSA+!Zv9*`V(c`z+W=R?Q2yPWU{VOu{DAUV-?^1fztjD1kvi5^HN z@LSQ8wPpo(rQb^89M+w}dM597S{vrY^bThNp_ zQ^~EBB4L3C4@0T5a)_=ic<|7Ef|Q!uv=LF$Ry}|N&mBz@F|G2-VXDfb<*O;HCiKc7 zjaqmF@hy7gkX~i^>1n!b{mc>R@LZY;ymB->p-Xt>h>TP0%_*=}tEt8Jn_xu0SS&<% zOV`$|))&Y5zs7aw_c^aT<9H1V>F~cSS20QaZs^lRO3}^7nTlrpZZubdqa3_AAt{5e zBz7dQ z+#?gWBSCgjc5_oHMo+4w|i`*DW&Q8{eU|5`{6hxIZg5O(R7FB)9bU0$1QsLXjzk9p92}Orw_v=uE5hrc{D!s^r39g$&OUcn@6dAZ=OIBQ*4Dd zPoTSa^H3I`LoUUeN7M0h9!QD3c|;C#Al^K}?RoR4JduGJO`10kVzc~mtJ*C|9T)N7 zQJI>)VsOPCJRVKDwOOGpTx_+Kv?OY)v8NSs@V)9f_$OfXzp@E;j4Fq=c=_Ln+l1)N zIOCb`?lN21WcwiFeOi51?8)nZl;$86T3h4hhWvMFl}2R+SUrv=%QtH0EQGG|jaut9 z&9nlZ*8VT*aisODm}zL63~=mmr1cM4&$|erv3HS50}i~4ycnB~^w1*SMWogePQxOt z72ZWEsTihojT4=0$`aP1caid@X{ljK1Kfglkw@uk5o@RtsVQlNUi^8|y^B<)@`hOC zG~->Q5<*N#8m483|DsL0cahSETIheq16uGdQYpo7nq~-V(Yr|HsW#1F(00Pvl=|8v zyo*#$h*R_`OL`Y6ho3USn)NPHo?k2w?@@MLwVZ3{4W=MG}|z2AtR_VQvPG9D2g=4NYr9%-dPQ z+&LiTJ2nLud=(;~$>w-_h^(k24*N#D)lmNNmaUnytk+MF2EV$%TSAiD?`h{NbZl+>5sv9k9Uc)8=;Gv;k8PaRze`m-Tj z>E)mko>M#pNI?#ti@jU^w~=MMpNgh-0&z1|+EOAcjiOfC9u0f5t|IL-{-;`LD-TmlP#QLlP&*JY_ffg znFF2W3P&5*WIqBMvPVWbo9stmh4n}d0Q@uh$lKirNm zl;D4+r`7q9}b&)H<}f7V!=>_^I+ee;R3$=-`m z!v-65@$iL!0f5^9lK}Gps{k(mUV(O90BEKD_cQhmdnY#8d(a1(v&r5AEohUy2U@93 z_8yeap2p*`$>!*_>6t>C?9FfFZL+tZZfIk@<$hzf_GrCLcGE3sHrY*;#;iu`rwu7_ z6M6)m1Dk9ar#MoIO}2#m745Hg4|H17{(3k1Chf0xk1n*o-hJP@v%lVrexdf)yB}-b z{(3js9ZQn-*SlY_&+mc#^>(DV{dxdK$nA9iw4&|km)nm3-Zo|jdNsA8{q+v?+Z|{* zJ9fLUou?YJvpWE#x$_DM8;)nt*|7P*cu$aj=YGM59Iok&Fr;DQkj^fQoVy@Lzl*VJ zB>vwEnB-`7t-$k(0ML?WcQ1=uZGXKDc_QDo=K*gaZx{vis}{cf^>*}%?dTz`wZGoB z*vfrZ_SajX+g9Yw>R00MyRpCChO)G>`XjGsP1{D>|3&Ptw~lnwTNmQ}h0@-N7C`R6 z{H)dmj3`H_C9;-*~So+hv$S1tx(5x0Xlx4+TCG~a`*TwjV*WHTklps zT1rJNW+@*$O2=ohn3a^#x?_u3@4kA*`f2MkWfA0m5nEZGTRBCO3~r$p-65xl<*U$Y zjtem30cwj@)bds3gqS%9!-D_T@)cpF_U3uHb)Gaqeyp`C!m%fg6T*DXsB>)L>d7v! zaMd`KODtiW5%7k2k*XAsELN>TS8DH(_wJAnWQrxLgyJg=jeFzOuxHQ8cm<@tvO+*M;aecl46r5q3z{{Zts5XP_F)GE#TR+#*+{`wnK~98qebp zYdnSk=%q|+;F`MlW^Sd`T=+7nt+T@usxo^kcYGtaNY(T$Mwn-NrxbzwQd$u=nOH3Qt+xclD{lMPNi*2>No$`3SGEp|%H78A5+1qJ)iaE2?lEibuo=#}~ zMy#Hwjc8k7^@O-)t)38XZIpmhY?PRPZOcq0fP{^b#%Y-Wr&=G8&X+6lQ|yP7l31yd zHw7yN<$38^`ys@Y#y17$-#R{B2TW(UrpVt8+~DM}&1t^@W=K*B7vnQ_CUhv z*#iZ#vN^fiS91s1MXY|5Q&Uk4&e-b5qbX`lqI`<|649Iqj;%>lE^~%k{?J0mh0xfV zM5O^^?Iw5CVpZ*hYxxziBOxWF76XywtsA^sYB%QZs8u<|uxOr0M`&BLAW@mcbo6C| z_9U#r_3K)7@cZTcwDIk5&DxHr9OVnK$Z;o+{>`-ZR$Ao_agd{C?M0L~ zOj-Yn2DA;(Qpw*&Yj2`e3B|Cl4W3)H5m7m+L30?i9SUqjys=PaDfVOf>d^$}}G2;N9J%&x&-85@&nN{v$*vlvTOkn?^ zTtRvr^LdSLm&N_(O5FlZwfRsUO-XR4f*WNw@z{=PO6lPOyA8w@*ll?9s)^!+-GgN? zshvRFjD>)f5^zxq0guL(w*Hqsl4>EKG`eQc|B5jO2<~xXj8ZE`SW%k+l|<}63va5; zfYJhs&46%<&4Bz%u^FILiM3klTt>p)z0E+>f1NSEneA)_euER>-|RF|f1Kz1=2a7Y z3g<$vP6EEynE&k!{1osi6Ad`cnAa`=#`(}|dx19_^V{=H^l51O+cm&97;~fx@KWFh zfL{k*VWLYr1Ns~DyHS9<0gdm4&A==5Ci*0dtUlQ<)n*|2 za>aYxelzfd+6+XOTxFt5kS1*gUVf%+Z3h15K4&xV3i3jmfmeF8U^5VX;&o>;@T*r( zgv~(xRAUYuHRhL#O?2_zLYsk?pdW1pUK)mYc%y&fOgwJ@?8oyZ#{4P+j8^?CwC+zd zCTs?xPdxcfYzBUDMYA>o(Z%Qov>Eutn|YgoLue(3j>l#o`e;`Z_32k&GZ0-gEVdbl zE849M}x#*aa*$0}^sv@7d0% zF?}0)663HSE{pp`T*|xXWRyB%J&CwqVp46Ldf+!C;u5srjV;YQ{?xYy)A48$ z&rBbXcx(82kq^)=SG9J_cHBdb4}isgmd$r-<#li!3CdZ*RTD)Edq{4ec;`UrHz%r`5c}m8#>szcKZfUo{TSndTwD7wgva({!cU!J`!NjzF0dcdIF(B* zVV?aMLzDuN#ePia3hc)MnPNYtQpZfyJ0d$!4vp7R2Pi@DS)4GT^ z4f0FwjmcXELkap{u}T)q*@W(E;3|qGOZfFpH$L(NAfUGYDM`Y`{!RY1%KlAg3+@zz z)W9ZAHAWfyP1?i-Wpl!8;*d^Y6Q?O_2?eB4M7L97DXA7VPA7kJ8g9mapmfSke#d;{Fxvl|R#71#|zw<30f%BiU+MryI$phr{GZczCYvrM%_0vy{7s$AwQZ#Rh0*ltjz z0VnJRy>LyXh}|G5sY@{sN#1%f-EL6j6vLFSahjI=Z_#crGRDs1>TIWh-Jo&> z=@qdXRO%LRs@cwHs8P7I0uUNNV8_yFvMPLhJ^;)HKypyFt-`bx_1^P$^Py zf!!cz3hV}bKK~ghChP_!4q7%g@;lpm@KqzuzE3{p-XwgB0Icnw#qh8ro=|0RwyJ8n z{YtaYF)lm4yaM0#PVkrHCf4y@NX#!hNN*~ zzWxjuf8Gbc`P!e+oBn*nn4_J6-$q`#<3>B~^uP;c>QsKUo#kr3({4-8nE!hQDR%_m zr0G~c08%`56#yq{$B^PNoE9Cs4-!!t$I1by#bawQGr>2m!Hx9)?+J6tj2ZgvIM(3O zrG<645$%#Pjy3{T0igZS?Euus(U$6&5q}(hqT`IlPB|A+^pxdYqxG? zyZ#f}&7UCcPsrt;_5xl6ybO2^@TTdh^&;nJ@Daicf67#N!c$M|^v#$Zf0J+F!p26| zhS+vCZ{BL{m^l{waVek)fE50Sy8Poo08)4>1Lz7sIleUz0PWeL-?{}*1DFk11K14M z4R~Ds9|ArMcpX|AKzqQMfW838`4j5nPbjZHLC&90wtuPyEH>?!Z?^Bmbe010B4r3UZ1Z!tSKf=3C6Ri zyuwlDw)3nHJeDuFj=Qe%ucV@)vT{Mg5;x*%C~>stK}!{FkkPowaYao|->AY#kLJ#G zbkk8{4PiQHRW~j z<><3LH-h{u?;TjYI3dTL6(KIlO|apajoWtSQ-a>*6ZqY%1P|p#IkY(9wHRZ8GmF+f zl+Q)94(%PGS$D3J;Les$m^^vUcl8FS+Qq>8pk8FHOZUs);8 zI@&HZpBv9_0SFIfIW@J7n^H;B(+{bU+YB; zd-D1!mA7x~@i8_#e*D@^+w!f3VbOzbUIlB|^76{*GZ!ps;1^1R*`CUd=FPX-bl_g@ z+=gY#+%E1ew7o(eJ8NX^AG17^Q97{-CqK(pYc%9rHl<_?wwa!U0pkK_UyS0 zUOQCHi8GrvZFO%3%f+uEBQ%Rpyt@;Uqe?eND49FYeg~_tG$P)63+@u=K6%=lc}adN zf6^o;pX<@}XlwCW^cdc{ za*}J%e5_l8LPNU-g%s&1dIm2cj%-Vz^Zq&28}vm z{o3&Yz!1Q#SU0u@z88=K%mge2tN|cT9idal7eK?fR{%$#YYE^KKo7tG0Q`YE4Z*4l zI(LGOogQ#DJQF79y3<4*P%a(7-vM>e5&Z4%1O|P_ZWw>KvWz;c1MEA_m1Wd^1!SQt z+iwM6MT3=P)cz0vdUinhcQ_3IJv*R(b+`srI0v zmhJBYptNl&i%prorZiC&WtDx_L?yr_PXV3-AdiiW2)_?46Kiq1nvAk2S#yKHsCYH$ z+G^oyGHUl0(lmhf0IZU*nvB|`CAIGl7}Q3q$*A<8iArBXyUPI11fX4%A%(KRfZ>4q zureG74DH!A%bEZO04V1&XxI)Kwu6T4PL==AupQ{z!AGs#Fu(}FI6wseYaOg6qjo5p zb{ha_6YWr5?GC4|CZp1=&}~1~gqRaxH5rvY4S3$JCZp2EU^N+)4npiTfLj2!0qzA% zidU0SX;=J*cBTFCe(+b1`O$)-0l}>vf$i$?SiE|4vH8_wp3|)!K`E<87n70Iqxrl1GNZE+La`BFzk#zpPtJF-Ye^N?9>&d#=3mF z)gQ%U!%*Q#s^Z(syl5%u4sp+76?5-rRT}>i)vYK?<{%TTroNgGA>?+TN zx-})ZWlbrec1?+N<29v|YU?wxrgY)DrgYr8rj$5YOS*slTGEARo^>thLi20MJXK~( zqMg`v8S;96{f+tKT)&xN{G zA9G^Ai7DLqRbQUht@<$2@K$|JBK2Y}{8gXEI9!5NAMZ2a8bf0oPuAU`CE*grw_#!h zh!V1^KGa*T)~@(A`m4QoK888qn+tekMrv-FDzbfF^uV>rQ~upZ&|Fc@Zksh?8*S+j;yns1h>v&O}KTI3oTq{fkM_< zjzZU2BE_z+(CXs#l?!K@{`!jPxb>Bb$Lu#=UopgKZ@FZBCGze13f!{3a`C+`*Bogw~>Ay{wmWR`uN zSgrBYdM^Ag;dY&dxRiTB$U!QV5a2etC&W)hQ#*mU8Q*LzA>g9-gm^TGQf7$*3VgbY z(X$Wg*F!v-qCVXoOK z8GqLUFcN^3z~4Oucm?pLi7rIgg%1E80$_!3;j#DN4v?r9)=9nk0d7t8_l|m@UIKsb zs2BEB;qM*wB4GV=Zb!f=fPU8RF*ffpTn2PW!?HFnPzO>_=w z@SMJd_kGMe6KVBw9)a_41~CsiwewyF?dA3^kLaA|>|GwwIfs$&j+U;_XFKXS%=&Cc zJ*T$yJs#q-9i8>0iF%9!JXzqg9rbt}zS)CJbT;baY?SNSLjkt~a)27ZJ^)(X*>9jM zP&camg|`styP>@TC-3oyx?!b{0-_%% zanx%RL?v^4IeUk3Nk0q*p7v!lUkJr}*|q)V+I~dxb~c(ci@@ zJnDW=vtHp*_iCpTyuzdIIAMW)C*CVOIs>iX42*DRTn@MufI2;6F5pqXGbZ{F_M=!* z@CuJUbQxd>pvHzpA3`tx(Ca2T^Ax}tF6_)ccm|yf8w*@1;j;yAx7c`I;nA5$>r9L~ zA1;Z#!lMsklz~@x^x=Vy@53YUJR9KnqYodj;m7M09-Y3=M5iAt>J=WHj$VHTHsf0P z?T_g6`Bsm2;}ssAb`U-BsLSW+JuEhD;1wR7j-Gou`sV4kSefZw;n8XLxs*@Ct`olf z5uJuHlQkZAg_p)&;TRJbA9#cp@%r|9e`1CegeSbdB@Sz#yw|sc1zz8tl)&rTi}BM< zczws|h}XBr<9U61p_EkA>s#r#ru61mI=?I8^-V5v2zRQ7x6(jr?BVT)`QP*qIf-w2 zNSN#$@*lwS+-8WUb;5I7sN)=gF4c3Jbj&q%q>T!#4LshWp4-Z&82qyDDBMLnw;Ai{ z96yT=`oDbXpKOWM92a2513Vl1bf0XM6Jq8f3=96--B5%je6mRs zj zYThTCAqtS%j8C>o1TOH&);Q5G@X6L#a@I|+UkRJF?K_}*N*y%oh3&}+c@tjPq*Gd^ z!F(mZ+o7=m4!p1#D>+JdVGCEn3tPi{FKh`b>V+-wv99`GboRp&zScq~zSi>3^R-qv zqI;`+t(8a92Da8sz}OY5qn~xYwW(%hIrXWw{?z2v7OEIwp6@hLajTWQ-?X#?r4KRq zaV`SyXj;a?@_}jSzKYO_|Fh(vRsPRH`#0&)tTiF{gn2YWe&ErpDF=0s@MtED53FBj zB_^RM-pip}{m;6@bKt$KvCty+Ue++1nmu1&2q49KS!p#Fl8S9PiiCOI%M9^ixO+w`^NPyGHP|=UzJnI3DoOQFi7Fj9@K06_ z#B@NPRnO#&O`cCOxm6-}K9xtpILEB2#@Be4(|4EF(y@Q5aw&&m?Tx_nBwn~kdbETm zyo-hBZ^VY|nu}*MeUzwFn^Lm#cBCIX(lY z`sGSoT)UzL?eiL9&J-V9!y@+oFr25naV$Nsb`m$}IM(;_rJKT~PI34dBIT%{KArzItI zDF!0Ro9n0h)2f_enDRAF(~|!!`qPGd%I{;P0dCfx)}!t!4+pIsW%JX&cpBWD* z;!msGA*KW`tXY3rrSntupBWEm#-COt6vMtYcy7_3R^|9w6nh43sz0sD2(hP2S<;_Y zDgBfXR@9$X>5E}6rBr`f<@3|iXT|}V@uyYpV%STa?KJSGRjwetBL1{W-2zVar&S(J zNpQ3Nw93;0#`>BTz_i(>R8k9v_|wY26XH+nrKYK-`qPRI)Uadl9gbbQ;~S@ysu^71 zTMOC(-&&vFe@5yF-&%?L>zy%}gX7#jDb5(0y?M6wIb&*ZB6L$3po`i5N4xOq0Zc#z}a8N|XxjR3Q!XrT9zPC~xaGZBJ||(@$NWH8<2m!iwyz z`x2B}@==1lb;+TGXs+7XFH^JT z_M|D5FVTLJnwopxrBZARX0_UvHXL z!y5Cx)$7x$L=9s(;n~~CBZbBy7u?};U*m<$<;$CP(Wcppw|&)@D$nihS9qyO{3Tv; zDW`HsIWfFoM^0%)N1I0pE0gc;di6m`$|2JA4v31%>G;0s0^CjkyN&!l-RVPI4X6%U z`XN@S(xzJdrCsIIysBJHkGpuJp&pbS#J6~xAn8>WWoUYeWrxhl#dFGT7By1|3I7|DnYo4?gS~f zVwQ)d6yP$oiRONAvTjK!`Rtmj&@XIydoy@z=f9Gwx)sAIbrZkA5!VIR73eoS^~@cH2Hv|1nfCjn${FG`JwekYUjjAxZ;Vo! z{my78CH$Wz6=9u_>xq-x7d&gH^F|X&Y$m@ca-0Qp_!ZC=IM+sLBbPeoHZfjGsYUB^5vA>g7G?H-M-YyB^EpZeuXrP12e|B8`*Y~8M5 zz^T^l)YYR&Jc|wq>vlhH|b%1A0bOY=mZ$R7)jR3@b6?+_Cy#`PZ zc)~=(A!GOe0IYC_F9W<{q8l@St^kDH2>Z($p98?Ya>S|m9U6O2ti44F_qx~C)$um6 z1)TB8ePpmfNV%QMznRQheDij-9xx9`0uyqLA4S2!s0Yt-&n&`Ur0F=me zD5dMLbFzP*{ia!T-95(IxL>!b?QGnyMQsi>#@e_K9oTvs_n}}KjUA++7)9~D%4q0Y z$oFYB4=Fb8*WTuA+^=2Q);8|-DAzqG^J@;7=pSIO`45K*ZQO^nx8JIahM?sQK}#Jn z1_0fM%m$#v4MFP~0vnoZu>*H)ucVFpwL{*Cjr*5SQzN&c=I;aE4-01OH+kPBi@vnM zL|=LtT3-M_YrE!tz$(CY(@pP0n>lmVEZl}M7ZcC8Rl6@K+ne>^pYVC~u*)|W+PHt= z*}RSW6@8t}`V}KgbS3J!wKndbzbwth{qrcfOP_Hq6*&5QxqS|7+;#i`78`d7`RnaJ zM}v1;O|6al;HR98`(U({HvaNiH2BSU|2g^+b~e%H%}DHJkL>2sA9*HP1xjsXFSLMb zBy2FA(a*7~dE)n@=&ILD^!M!n=L4<+pmqFxB>+9*@6md=FU$SstIGfwpRY!5 zM_6<<+U?cb0q8MTW3FMtFxq{QbO`%mKLB>;8UDrLg3$*k&$n^^BGUTeQo!T!{&V!j zSB%+puZad{9N*xccpeUL{L$b>8{X>u=WUNVIagI6zsro--Z^#uIl5{m;-752jr&z2 zt=xCB{~TS3QRm9NPQNQLg0g(t!p8kdjKWuS2DrWY^!?}P%7K#d{m#by$~vb(u>V}d zhTZGki8)mep0Ht;xP%S6gatP2o|M3b-HY+lP1vx<>4*)x$K%o)b3gj0^H(ZP*bW+pr5ib&hS=H4M1m1VH0dF0q7p zHtY;h3P=_kcA+b>5kX(1zWMV|g`e z!yeFT84)LJ*h#0fkV(0L4ZFq$I5>G=tmG(R!!BG28+HxzZP+EOs13Ws$GYl&(b*4A z*su$o*s#k#?*v5Ui0-YjVOJha8<=*m&L5W+?A!#xE)D5)C9YU`<$ovP<9wN44CAUV zws9wowqku&If{|CXZH^2w4WMZK4mH`-?^%EUk#Hzqfi=ipprBWVeECz65ihO?Zzl26IjD51*LmhSZjF1C9L6nT6ykJaNgM9tiUo}!Zltjsz(G)!oRX)Y6SJghiv1Po2lh-JL|J0X_wUTT_Zs%5+yXCel^M7T#hgQJZ!(N;mhRndjR+vOEtl|%CEtA0M7QCrZ3fPxX7&L*W6aGsOS^3}04?#h z8o)vT^u6r~!1I8Yp%u#bTipPtn{Qo}Ji-3fn0Io5Jtl`U%B`qvwAqvsY+KV~cA99+ zGk_NWN1;75_-4=JIl;aeZRBe>9sP#`fMdoC>1gZ?Yqz3}3_;4gZSB?y!A&Om`UTCN zVE5s^-Gm7hw0WbQpl2Q8zB6Xe)aO_m5#Hz4tc6JY1wML>Ticou18{CU3~-BUSwp)x z%zM+u^l)d&W1x9kpDB;I1oH7tzv&S0t<9b($39c^X&Q5<)h`}zY`NeIZ==C^U;qH^cJwWP zae&!YlV~*F5*$A`qW*u~oqvp7#g*speQs=Hj3J0&z<>b{V)*HJ5JIB}MF=4jMG;~~ zk%QQTwOD?55kgrOA%qa~+_c-je_$KC{e$ktv>V$P+Zf|t7=#d$B_zub1{lIH41*$u z%@BqqU<^29Ki{fz?yGy>d+j#Znauw2)wy-*)Tz34@2y*Ps_N8DScWw3NiF6#oseb! z^KK~Zfp|Zd$~A34;BhB6O^xYqnr4)*QF7^=@=ZL2oA^R+8Vv1KctdZZ4ZP`j^zn`% zpWmc>e+6jA6rMIV(BaN0=Qpg3>26rZyT~_q!wZG(Y|b{quUkCd3PI;O?nReg?0CbV#fFe*3Y2p$ax9@vYD`V}SPTykFHb0%-czFKb)sU#o zShI6aAz!O6Uy;Twye|pW7bkhy45{m^cPHf{Zp%{*ot+EUr&>B6ZiMJx&sg~Q6YdAe zw1r+vJ)AFR9QM!5oVOtK>5?+|T{`Vpym;ddP7iG8_ZaMUvpHF;w^x49lU)3oUh4b> z_bpz(o_(;}qDSl&QZ6k@&EB_qO*yApy?cIxQ_LbJnwV4Xnzgzi6E)S@8C2%wdJ{=k zTlJ*&h?s_aW4w+h1T^?j%k-{=I(071t!u`dmAz%T+U(hz8=U-JPSYaAh?z6z%+bj` zNosuF&$L}Z30D%eIq6%12hYdTH%bz@y*D*x(HdGirY~H&w5KQGczz@5_xJQwo?C6! zthJ4_weF=_du$~c)=XHX)Joe?zi-L?J;fYWB9U9}_*vrYuipOt7Cq#sAp-Vcne>SH^ZVD^({_SNo+k6wc zM{L=;Eu4yIHKJPZ(;1p;u(mCn;%Krq%VZ%=gj@93&fR;$d1#3?uh&|A_TZ+X=4&(4 z_s(XJEY-;ROiouUc51cIC7rpoZaT?f^^RRSzpo;h%n?;$j-Xeyl5^O?sfm?1X{kN5 zA$cp9(+}Q}%r{aC`H*HgC%qPB=%{n{+J-0PLB1l-YKS={-$shJ|BUEx-oJshoJh>7 zNk-Kg!5*sj&r6b&Cfpe_GL8G_m^pLd!sW~R8XUjF5%ov6JXvW?!psYL@moG`VR`~! zrB+-=$d8twuc)^XoDMsf{K+Jd>-;jP&8V2Jj`{N!_i;L2i;^wwd-TytI~(RqNI9au ztY=lFwP3cOYu21b8I)Hs2V%L2*TG&@b`{GTX2R8VzC5PR?~ie{`e5=#*=&ZT;T(Z^ zD>zNDSxYf%k!a5cP2)iN$F0@pEm~2OqN5(q32fHrr&es=$)}q9yuOy;Z>?UCDuyIiw|? z9bAc1?j1bICChu)uzRW!OUmUdwr-7QMpoh^%ZWYo1k2C#n7aCDoHjjo-U7}l@9!TN z7#v);e&a?Y!x<_q^i=b07aqYLs#TTmE}tIrryrz~rcFB|fTWM9Ij;!j357Ti9cj%G-KRmC!@9BPz|sb32T*#g3>W z_m*pk61CkCrP8Vns#HACaz~WQ`ict=J0<^ON0jrREq6qztcgtN+R9Mc5tZJX(gE8M zWm?Q`Y@s$gqAWJ7MoBf2;~}so&&U3?U_!7b=L;_68oTgSAbi<7Vut{FGk1WtHCnxETZ0A3GPj3pmu`O?wgqQ;(q z!)H&PdrFqiJrhi6ZBL$yJtjT%V;WY{X&a(FdG2=7y_x0nuo2B01I`WhnS9=L!IG8F zy93^`hCO*6^7Ebpypgie%utT~n`frv-TlC*>&-Lrc4U5=cZ3pD~SJ>?T>J{)#kSU!Qa_6GJlYbQ)taQl+ z%Ug9PZ~FhRw;Y<^`BHe|SeuY4P7Lw33u?QmjPsTMs=j~OHS2GswpY~R{u8!}OQ_91 z`c^TYyXOC&R&h3#`PtjD?A@)cTg7+Zwbt&G#thuQj*Ps2Jfa7rQP`#@=n{G znf#q*(qgLJnMunxi+}tdq}|EhxSV#Tb-VK)xW}^l`|&wyKCF9MoDb{f4{)gG!@6lr zfAoBu59_AI9cqtd_j|ESnh)#V8?OHV^I@Iz<~r{JOTjkq3V1Ke?>!z&1pGtwrd|Ck z*StaZ_5@1XlXYDNt^+q4j~eYlF7Td)+B{R&yD@&o$fz%!51T<=Gx!(J;HgZR zV{*3>UI12GnEu9$kExmCW4Jr^IfgwSHa*sEKApF}^As?-G#{4zAkL8Ho%G#0uO9w< z*mQb0)Wz4@V>x|vmQSA;?`t}Bt@=I`GiK9&h~6KASf_3FSk`Ih^)%~m$N97R$FT&J z`Li~AEd9@X09x8(X|mXz8s`KVucJP&cKwEpK0Z&hR`ysXG3h9=w8yf@$M#qzX*%i~ zA2n}$2{(=_)%VuS^U77S0|dV~>T|eUWmM+;HhV0UN+~S$h`vYhRcLku)6{a`rKcn3 zV&7%Tql{sm(Muz_bT6joS6{HOm}NAc%`_?mlD(MXxIV5+dofMAsB7d(doh!AK}O~A zy_iYbmU}UkRx)WVb8UMuEp?l{n2JsF_G{@9EZk-y_j5=_F^ioaz9}&Cj4R+)zYiX#a>M3L7VnsdYtPOHJ-)+ zcAk(pE`es-i)nIAdoe3IZ7-&4ZS2Jq$AQ)sdoevv*9dLei|KJDTiJ{0vCtZK!#u9Z zHSNqyBvpGu?#!&ndX0&ec4kV>Wzi|Um7SR$TcMSmnToY?mv&}as?yF(=cPL{jn{T( zro|U!^{|yW<(GD5nw;&-v`|O)qWhNKAADfB9xMB>=A%80=M5dgr=_IbF6gv6zD)T3 z&BmRczGJf&r)0Kg)6+Ut+T*_$TOD2NPDImqD`~QalTsZUM$z(PS>4B3tmjfXtC^C% zG{06dmbdm2G<>sYHCbh+rdd6Pt~`~Pm>)N?oa2?wDfc-E4tU0?jbEh z8a8d-##Z*@C9%WufvH?Qjoo39v)8KZ{E~4yzn9FO!~uO^O5UGZnxE(E)(pvUUE0NG zGJhm<#wv}KwrLk1aYOFnBYsSM{(|U}a{Y$nbQ`bFD)l-u8fKc&(q@mJORJ0(l=k>} zoZcy2LtF0gv$*2PnSN%lxP`v>Hdu*U?DX^0qL#9<)6XSTj-)JM)|$A|PQO&vu7}*| z=XH^OPnNEj}k}69(m?r-};^VaS?m*Ymj!M7B zd0rMi;O@X`I!~Wcmw^tsJ1~(;zsHtkGua_`2fDtrEa|o4L7Uxyp1Mkj?VJJ99Q zT+?gCgCTYYx`uW%Ee+QP+#Tq8(o(d$Mz-bdK-W>FNm)jg*H5@)niIUXy8~Um9Zhm- zxjWF)rTO`_;=mBQ13h&+n&htcw6Z(UQ&sY7vpdkG4?tV)4)iphlhGk}2YQ+VP{xtz zxjB-y6t+9iLWgB{V3M2X+H!ZGl|j#7h~0rM)rzY30KaK>AiSpCfob~mn%qmf11)Y8 zf9yDOtlbgVnPf|>ocNvn^>u-NkYlCl3K#D+!#~IojBAnx?`yj@|MR(wQC0vhSlC$6 z>r&LhAEjTJ%9A>5>wL+l;#bCV_8Kx;@+%{m6x5=v_%&_|zcN+59wx1HRs70$EV&nc zWt#IKAvNz6fxax3q5)A}*X|0|DWUB7={)v>I{TMZp>EGv1h&7sD!l4GR!6vj~fi1#aH_MJrdY?qysjIkiG2pOLmUw@L@c0BU<&Yincbwm`4s`c`l^SOx}+5AA!O@N?i- zfa`T*!FVtcTnxSqSm(5ED!3~0Y;vxd z5F2Qo%kwZyxJ~*@5%$!*S2LoWM+3}(4UppicQinb1LQc+3Fd&F zEMFrTYII;7c%Bxs-bw63l;xo}v*VVqf;H|(Y`0r;^Ja7~GrDFaSOZAChSY1Q;Wcl8 zcfrSK8wZ%7eCSMYA-Dou38n$%xH>y>cfs}GHc$sk!5YB5^}Pvr&U&N!GjKk* z2z&=n%6>}O&od8U()KR^%fJBG2%Z72fOo)$U>|od5}XdGkq0l!M){fz_RFzCgE}O? zUh?bxoP0-vW5J1lG+VdAe<>TOHGZ>a$NPfwV{i}PE$QVg>0Jl5)6c8R=K|N4f~jB{ z&tL`gFSC66&hP}7{h8Ineu{y?4aF1jCnK6KS{C?uS8R!DYu9Uz)t()elNoc>s#!Rs z=YVoG{|d`5+LPweVFAVF0bDk z__fVpUzcg_VU&ICB@Ml*j>IWX#)3~2}aznPZ_~G^2qYN<}k8R(*n}g3Q&rZ5@u38~C zf?Z_yEm>ZKl}Am-OBA`~_HR`yrr3OYEc+39&hr+s(W5z!Ah!&ylq+957}E_r9B8e3 z(f#bgK~speTF>n*8zsMEHa=R(m?(ub%cN?3y#0X3moLQ1b!W`;dJl(k&U) zU`majTZuZJT#&nPQlhA!zOl=U) zGBKnQ%v=(#Z7-q8&??TFO{-Xx0Df-ol6DTxf1po02Tj`VG#LeWjM0wi(>detu_qdD zqo)}W&vPr~6lcdfXWh4S)dPLn1FasaKedYHe8tL;c1)c!GM6mv=^GeWw|)b?xm~>L zjlQkDA0b!ud8Nhsz0|@;PQsc^n>sMK`KiV?Sx8u(`TPYTWxgo(G;6cwu5bJiYODI! zHCpf5jP60JWm4z&(&9pEJ*!kI*S9&&gXi|AXD=xG+178`v}aEt6J+)D^sML;DIDf( zpd;tZP4@;$$~32R1p5LPu6&>rH{yZ5HESMT7kRFI6Z=fLrnOSbVzo13@zSl^D$lL9 zc*#~;bH5AiJmR`mU!oC$aTyced#^l9%%#r!**TT;jBd5uCSB`)WJ~-q#L2s6#QR-N zn@4!W{k{ER*PTg=S6lbU7M_&dv(0W;d`G=Y&UzoQGTQxxRQ1jW8-L<_FiO-0c06e{ zj%;XmphqlPyfp3yWJgw#vtQThyOMvm?+|=+#}39G<@P(I@KPv;74g1uc_2h{F~5-H zVtWJ!>>KnLQu8;BJHea>9ohK9`9Cs=^%AqnOaDPeQJlcm@}4BAl@qh)&R_G8cH6bk z!frHaS;pVAWqhr(GwC1DW9XhWhktLAEYB>FL#yQOU)Dye#p@s5q)DaBJL5n3h&gi> zF6F$GzT^!}@1iCfXrUpW8NcWeaOqzZ{Gf3b{TVcO^sERzxSDGt*WOr3Q1+Sgm#-+N z4?4QLgGAdg_ctbm_|lkKJWv`xi>I&0;`H7(jhH>oC^essn3LFKgerHR{r!FrYyvNWH^Hv} zV}vdA;4?jC2*M#$Ok zW`RZUC4-JFl6wQZ$MyHa2s!)Rm)y&Q1C5Y3UqjA4jC!#p@4pawHDI)qjF7YacV*e< z)W-f!_}ukCF+$!vDa*ci;UGuI+2^$UpHuox%b+hXf_)3hXlm02@EjT^0!Fu+*j@9* z_n_}WZ>5|W7~gV)oPFNGNNqc^H$#6N%IhO!<&}Nj(>y|cWE=moce8vWbR$n-<9k`Q zcN1f;$yxJ=H~WnD;4|KX&*(*brg1pW;4@10*$3qM!$UOU%|2bjK6#$Oqql(WEc=vl zJ-U>)u?D5?AAO!tCU4=sE8-ivk2ikb0{HJh=?(1L3U(8whe0^sbS(7O&g%T^@m8f6S0;QLPa4O@lNMr(6i0}Od@@25*Fi4H2oY{+ zOlVT2QJ{EUHc^m_0zK9wiqV?$p~-m6xh8GnG2_S3;nUcRLbci8B)J69A~uidys|2&aO`sJ3!>o4hjS7M6ZccN$5y>HSC z(d(8*ziZXIdfnm;uh%U}fqH7u%k|iV7Cl<=lpiSit}X{}$bKnuNxza%N24d1=nc;! z_8E=a)cX@Zg_S5i8oPD}3riZSYkPm#ec#_NPadjK)g}lw`#|Gp zDcI}@m--bZTiEI?tn{V6hWL7N9#7fLR&Si9o`*{st@J#S*kG$C9BlQ_q$eUN<*J(E z`fK+@_S})>duYq|&<5|JecbaCKwG}&<4B(xZ}d{5Q?vZ3I-o6oigx}f{$-LE-NAqP zsn@_>@FgRJ34k{I>5IU3z*PYI;?sA6#b2o>l0TVc`IEHkPfh}t#h%EMQ@Fks+y*Gy zle54wupK-XdLsFgFLV6{;4k>(e#$%soCzrN9$I|a>i1B_J=5Z<^Ly`g`+Sz~?g!M% zZqo05C(Cz{X7{hbM;Zmn0>Aqn&~uRei(Kco?V1LYNv1)(cN#AVe`=lBRDCI8hY}YkFx%@aAncCj7eA{1wo3s20 z=o8n2Tfk!ewcPKvWBIBJtNXTd>929;0l#*uyWU06+y}{b@^bcTjr0n>(%mw}HC=CEP&?cTmC| z8!b!;cf10q`yJH%j*lqqNH89p9r_^oPU?T><$(8XC-t?n-ntL6{kxRm>Y@*lZ@-c7 zt+5ZX{o+a=B!A*HYMy8J#6F~W+S|v0QyNzHCkBb5bWglU8Pf}|hiu_lqriVm-^qMJtX znylzaTqt)E4*O;Z7yUBDc^;a>B^<2iP_v>-0wldQaje9Ov0j^TgB4xe*n4xXtms@9 zR&?M=f*9p=ZTbA&&45^U_IwLSkFaeJ%^U8 z=aQ`;Sj{Cbt2xxH=8}?DSE{Hir%tGDUV>yh9(YqGUwbtt)UD3;SdE(7NY@D$Ao@=uZ8+XW_xTK?n*rd%uY@uA1 zVXh0yu<^saH!Q<&%`$B9Nq=4(yOWSAT82$7Sca84_VP`(WDz#WwC2nrY%xt^f@%uS z9U3gc#0QHow6F*#X*%#`X5)s0t9vLc!U?}(5l&*#5?3t3ZKO&T;TAF_i*Sp0vj|%Z ze?7MdS7gm1Y}}GXxFV^0C|QJC#0QJ8PbNXne<7rKay+)OShQJ|UL%MZSlPhH)TqExe#9 zg`_GeJbZ|}pryHZZikT$;RVfW2-?;QS|Sr_*~6-F(9#Q<%czBxoQIvtvNN}@Kb(Z& zJZM`lXo*adF7&tbf~GVE^MYnt%nO=@+IT^;*zoU{O(D69L*Vb{4SM|lI6ito`^QOK zUji7{{o{|prYwJR3}EE;<_7RVmjBcFfVh9!o#k&4_ts^AQQcdNUEX5k@XzS@=kJ5X z;OQ)Xy9Q1H=K^?dZv`J_`M-34$$tnhXg{T7KV>xgQ*6(x&%#3&blOP3^|Wtg`3qcE zyrAW8JWm{@f8j#F=;?)fKsOkSUeI3P%ly%ogg+{KLHpTpS^l%r!KKlU#LuR3eJkh( zl;LNzHuHHKdSBq0zy0Zq=6*gd8_EmXL7l4c#zk5FMpvd&HS*`_Q4aT1jpu(7y_x-# zIURX3`za&JpUw;S(86cWFZV~EJE>C9vaC?@&ej>QN*^}ApE2Af~*Lee9e;$0E z<-a^0P?x`CRQyZc#$Vn6Rs#mH*S!GvZdBL5eCMlpGJ9<_9)wtj)aF!;{IyH7{Ixp) zHTN1%_8-Op-mHK4&cS#x`}xEy|KFE4dop|R#)c=e7wHA*bd4AJ68~=Tkf&;tJemFN zHLX0E{cRol*RSK73eEqPnq`kf>;V^^%)I@9nkO^k4Et|5wyXU2bB&dMTjAm7@Oec1 zDs91;^x6M2wgt~mpbenyIlOJb|N8lmZGryfT5sGntA7J4wzuz)*JHg8`XBq>Ecv5_ zzZ>Doj&^@zh&fs-hZd!0%xW$8lY4>1TA|6x?7_II zJopq-sl0@#Ue}+zy`|mi7XL@GTV18Gk~ZyDCvM2y>WZ(PIqNlIG>lb|JHUQ)m7;>u zesqsZ-h`I>(IuBY7b``Jz2`0|>QcNk@{rCEAm7?w5a+9?&wnCuA-g1-kdMl{$i@oKhLA7Ul%S|HL zTVB!CW*@mrxkjgGF7}ZpGT~2A_=VMesXx@IQTeOi3;)PW-tu0Z8olMcN-yP5d&_&3 z)e`P4@713V?Je)sw_};)E$`J2!gcX4?TR}f55wtEzql>Se?br87b^jMv0uCa=$E`a z9?;i%nSP6QT*_PC%RPX(gO~Z%up;zeNxVOAl?uy>>URi4Cwh{k6H51e4uU;7V2kkBI7bkFk^e@|a%lpN5 ziNALE-tu1hFqGqKdCPl=^1O6ayw8{J2=tJ6%X?`KdV9gnptFs)yuW+Na%Kdh)23dU z7)vlbZ+W9>f0B0B+qx<(dCRjj*xMT3@{CvUmX~O+c*{#-()>%_@``-STV9eT@s^ix zrRm79-?)XhJeTu-r-zNU@s_7pr7)?Mp7C5p?WFdO=CpkT5mC?Q6C28Aw!Si%ZNpJIJmb#4>JjEtuF0QQ% z9&Y0WFHN0lQSN==3^yxJ8!vbk>v!Bl6%P`RA+5dOxt=Q3T~v9MaG1@5SMq`-ch90Ro)y0dK(A)3Vcy8@P!{#{x{T0s@H!n$#aDG%F%OGDU6qRju0n_X=yLg zY?^;_sYbts4rvuqdM}NCtNtx(#!hiQV`p_WEUQqe*Yzh>Ay&Yw>MJz2^?jz4DRfu< z#45D#edf6#oA^G1Tg*f!8cV*<629ls#`js0NAVn!8uv0MJ(RVBYRzRz6x0JNp=Gf(3=86DF1nWs4bW%Q8xK9jVi zFyChuIxN1=lH5GkmcGxd40;Abc=&OtA!w8DGh~~5pQY*3YjQ97KC?Kr%8ivO@%$9| z_}{fVp8XzLxK^uGb$R+LI9(o~6-L$qoo&Bb#&jC6=q zD_%>`wyRbWnNrQFUO>xLE1t%CD;{=AzhES*R&*{StB~ZENii<%6kgkPEUrm3y|%P1 z*Ri-P)Yh?BN?XTbp%&{{q}5_WDZO7~yhE^#T)?aV*KI+lGavwYtg@Jj1-Ec-rgTE|kH=J(m@S^n7-fOQ?8-46QWI+o9P z2eppnvwfW8_gp;9@4sU!|NKNiO?`evwD5j@C)eHJY49?5JIii`F-<9M3ir_VI6ZMlJ`ula@*r+_o#^$p00cLU`WWlEyuX?~wlr#E&| zw+Lwc%f7pyta538n%~}@IPble`Ii5-4eSA|G?9NvavCrDgL}bh`2WJ&ysQeEX>Q@s zEX$_O0gJ(4mj9OL@G)=V$L}|y*jNMeZ{Le+VE&DJe*cu=pXT=-b2F@+shsBb917_zwxCHzV%mTEOAG`?O%<_LfJ(fx{k^lbJ;1;kU@bV8wX8DKX0PpUHml^Lm zuJ14&dOqatuOZEc)Fd^N|KD2Fr*pfmdDeKx!ao;W6RM8z8A?l8)F<*9$>O(e!NT>Mx9oC{IqHc^R#YgS z9bWMmGx61=nuu*XXX#p;qRr+kO#}8Cd{@b78D&_sB6yz+D=ii8_mf`xy{TLl-)81A zO_gdQWd}2tcE6HJ?y=1*rb|h(6%-E=+h6NhOxIJT(plwI!eJH@-Y9wYo3AhIf!^Le zdlr6wUOSdH%xH4WSILZ~eU+{^x$9zf)8n8`vzs30d5IcNeF)8NCONoNl8eoBS{kiq zdt{@Yf*c-lA88% zEK1?;va+xLv7Nj31YdlqW`B;((;LEdGW#eAkEJZd?4$ESo?-S;93bnL)?qHtH@$Z4 zmR)M$T-xs@&DXAN4$>q?%U7lTiz_)@YR4}5tTg?hwe<9^kGNz$(j|>H%}0u_JGHwF zb!)tl(W@n=k%m5jxXQy*SibH%dzfdp`PWmWuGPv?S?Qj{4%^?or}6sn9Md^Y$@mKoFME3Jq0x}u|41uwqEHLZg8G)8R|yi2F6;46~S zsAr^d4X#tKEA+Um{A3u*nm#Y?)7HgH7r;01Jf)}GMxAVUBi9&a?Meer=Ty(uOJAYIN(0v$>SwV$pehyIVx@s= zgW?$>?s?ZfnjjUPtt6!1>b=c+14&7DJ6Jx)GP9)-RQaqm#)Vt)|NL|@HndWDX-hPX zvofXe2V8Y-IM)G{3y0t_r&gs(d0uyD8*&}OFiSJ8@njd=zifHWs@`5J(Uz@4 zlql8i*IqJ8d%!gbokCo@V&-;W0LW7?Wn(h z7GGJ?IgALo1MDuX~mJ(Rf{02`Os98#{e@4}W?_;j)Wu z-?2k}-=g=!v{pQYYe=d3h=iNgJiu#O^N^-XugR;l=E35cyf%+|I?G1Bo@F_+8_=+B zf$O|3$GA|PlmsojF6tj8S@HaYBnyjI^13L#?$hH*YhD+PQ}Vi)X!aC|*TqU~@VbbW z;B^t2cwLlk9OODUTSn|Ry(#17JzkNyYZn% zjwAdU*bBbQYTuXu&IcEP?|`eo9pE0&^Od|V){e&K-_ajswQ(l`bdRH4{$rTjD2#!{BCdx!0xaUy!Q0q)``^d3d(quv6n zIT)LPao}ulG59w49+(QI0p&({#%^!v|G75irK~pQb?`R&#sbQF6zPxR>4dyCHu-<9 z9r3HIHu3}j9d#_=DU2fDQOv2~tFd;(o-E9pcIkwq+7Yj@GU93jrHUsc+1JtRtFbnQ znjCW%pyXrbfDM3}978RRdG-+bYOIa^ZdMyjsYc%dy1`Pg2Ji-qehzSNqrc>BW}S!L z=p%UsM_vi0fSUoOJd#o#Im^PNJ#q`!3HW-Bd=b0@_EPE&a2yy9cur$31AGNzuFt9` zB-KWf-)Qn1eF``iTnN4eE(^XIYok7@_-d?;T1?GT>!Wx>M)8J>dI7vn%UBO5B-KV; zN4OKPmyZ*YYNM{fciqm=5|(^7+7t11Ni_Iw6qWBrsQGR*$-;M|g+q$Yt|%FOH(HGO zZnRM1yHT8^)hm2ACj4+hl4>!YkYq9D!_h+Fgd}9b2}z>z=}27g=?JwMBuRt9r=!A_ zd*aj4q$H_W^XX`EXwnHuCR6xyv{>Iv} ziYFwQW@%~i?U=-Q8J&iCl%U5>NRq7QrG6{n;M);uz8xh2_?G>IByp6+($Sjf%p&6k z-;P|HZ%60KwOgGC%*Z1lmuM!?P&7hgd}mJk4NJsJ|2zZ`pw6qaSI=h ziIn+x6bHS*$0OIl$D^oxJVHx89wl2rt`m}!e(hk03%(waF<+08R%~x?jFtZ}`XNnT z$0et~y5Rj4yKZ?xl4JzQ$i^p1K1F)M!6PJkTbz(2$yTXNYvqI_&r38(8GJ{gKlqLm z)yYW2n-59d5h#2}Dy-BX@gZqaUaR3`B%y0$_{NKKipj}H>XG`>N^6!h!Mh~1 zjgNMvlxC$?N|`Vl#gmaN6i!Bx zOgtIMx$+zG->mDX`yg367s?SCA`A_ zrNxK3kNz*E6|UJJEk5yoDUM_cxo|R)$p!zHN*(=QnrzAcrAc~S#=OFbNEXxN|FW9G zbB6~1m&6DEm(ao%n50SkUnX3Yzwm#V@Ue*anSVMFDTzt1Su>NKh}1@^_pllOv1$TqhU<2`t zKPK!1&wy9JJK#ggJqDZzPLJd4(@z+9`?K1_6Tq3^e89MD;+0?u_%WCR z23n7^Pq~Qk-s|Y-M&H<2ULR*GuTw`ikF)=DR#yAd-C6BK=!x6F9zbpSIQvh|ctAIN*67XX_0HEx%QrPNI0|f2ue8jEkwqAA;+_A$+qZp!W~=W}kXFPrWnC z_MZz~2mKcK4wwS22e-ga-t1GKfww`u8Cj4{Jr-Qj_Fc<9*E@Czm=@o)Q`SLgWe)OP z%l5W9PosA7TUqVocL86;$$NRTDc30{fC=ENLuI2m=_gt3B)-3s-lMgv0q%J`IgGy$ zTneUQ7x@x;7obkYF9Xkl7XT$3PYK6U!ts2!3ZF~~Pv+Y_nQ!-GzTJ~A15?1w;7;y> z*7Ib(&y$yeO@Qz1Bi@zS>V3QG*O$KT<8Ivq*G8UFZI8Q^8(I#UtW|Of{ zVv`X^eLRaPY%&SoY%#_$Ta1N*?S<=Ldx4tmMX{i;y(nzCB(@im3VG`fA5W(?IkUaE zCO@4zDXZCDOrm6aN%9N%k}9#ic&zCPHWzq>&BZjTTunBYB+l#1X|TBjJ!W%}tmh${ z3*lgMftt-l5+Jd;h@&)?&TKBm4K^39&F11<*<83TY%by(N;VhcnaxEZaxt5W$3%ICTmHAfv`ly5Ojqx@e_qx?2f zrBQwhnbIh~MZAsjEhZV|S7dFJZ`{%-zapu7D2?)4#D`J7idHiM)}ZWlwXkyqkMQnwxqHdD4kj%uFdLenhLA0!uCETR$r3} z>A5y*uW=J=ucx*cv-TP{SbMoPYp=-^)?Skecf5XkC~IQvHR(_`t`lpo#~4kly&j|c z;kvN)if_DOTYE_}jP_Y|Ty3AlBezQXY}``&4DSGMgi`5F((@_x4>)2neG|1#qO6n< z4Hlfq6${Sf5ZAEa#IWSc7999`Pv8eoez)L6PO}B4p-CyK7MwkU+T+~Gw`aA<{eZszWJYI`p9737Ci4!8{>6z#zipJB{$Jb!=7B-5&G^vs8LRxo zE8t_m80ErKz`5W;a0S4&aN(`s4zTE}S#Zw2Caax&9he1HM+?qmMwVw&_OmJb*)M}P zzyqc2q?!nU0`0c;GDx4=$zfO5cEru^C@eSPv;*0 z8l9v+`yy}&xEy?s?=*~FCy&f(fByQx+GW1UlbrNnR{Q2SFfrO?zKQN{eivL1ZUc7# z?)978>o*6$(}0%goAlF~&Zn$Rx*d&o1Ef{TNj#BB?*MX{v@a{4Pgy(XdG7b~tadK+ zT%Osv`?K146GIQScGec&&%zdS79-F<>om+MY%%eTEq!U<*dN~5la#izbN>7lD^{*- z_z76EMm_@YH;IRjjXGyYKJK?X_SoZ(@7O_!uL0Kq?$@4eK8A7Z;e57#{xIg1O%A^I zH6thXH7QMf$pa4r-O@jFUlVETYepU3*EEefQB7sMzqdc^?@@USX<*NYG4z9+QfxY6UlXqNHKS~~ui41aQ`w1XrlZ9gpGgz=zOac*nglM6_M=HtxV{$L zc&O}0=hMoZe>^xFTn4TJ8pa#YON_YV!ynqs3K+6!q zl<)%DnG0?Kv@;iUf@NR>*ct6d7yN|lSHK5=_F>Yot?ftWy+PaYUc-KL-d@6ZV3Gak zyq{Fno+vek46^KWdaB>~Th4v>$PIo1c(BWy^`y*VpWbV{Zy(3{yr^z%%Q;oD??Tj>Qr{)8F+M#LEu00)1#ZtILI-0T= zD^X)K)yOI7N2K;Ha%<6luyIRK&srIya*40{D)%2;8i~AK4^qu`k#gC?-Kn%7+C@mK z-B9Rg*hLy?QoBfltJDp7U9uJ^hn#TBEv- S77=|bU4Hs!MJifECjURl3`)5G literal 0 HcmV?d00001 diff --git a/vendor/bstr/src/unicode/fsm/sentence_break_fwd.littleendian.dfa b/vendor/bstr/src/unicode/fsm/sentence_break_fwd.littleendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..a7736d18b3ef92831c9de22c80a043dd3b13481f GIT binary patch literal 144343 zcmdqK3wT~tcHVy^3y+8KI1V9%5W+ZwFb-urloCoD$~c5lN?b}QWhlc?h7v+3A%vMw z>LFB?W!aW(NxtB_E!p^fm2Kf0#wLVJ2yrPT#37VY;<%JhN<4&8N-6pO-o4LzzWp72 zpCp6L%=4F?_gUwxz4qFdv(G;Jvey0{_?>Tm=PM8V+OPlGLtpvU?|kRCe)C)3`PNsy zegC%}`1Y@T<<7glmHq9<4Ovsx$bbC%;ERzyaCXjUXdKpb%J9#P`249~82QCfKQj79 zPy4acfBcM}IP)jZ`l+*j`kXI~`I&Qn_Pn1v|I1^4{(`@A;aA3e^`gIf@!z}T7cTw# zm;K`SU%LDsT=BIDzkKDdT=fsH{zupR<7H( zty9~kO`p*|bJpyR&aOFg=gog~!NNt0mn>bjd_{N9%2ki8UbA-H`VAX5ZQinVTkrNA zJNq8rwR_LreNXIv^1#8Te(&kuf94Oq_lM8^(Q|)%=s!IFA7A)SFaF6(e|q@OUjFk} z{`0H<<+cC%`d=LR%cKA8jsO1UU%mA|-u|EO{PnT#zxy}u{jc}`_Xq#y!~gry|NHoF zv+NhL?DMCp@LwD?=4XE9+^>uq_th)D_O%HUe)*Pf-2Sae-~IPbKmGek;d_6mG@kq8 zKR$HmKm3R1pZ||a>BT?!lb2rl(?30Y_|N|AWhMBZUsaO-_4U{P;xCRI`OCjN`d4o$ z(f|3*JAeJx$BupfZ{B-PPvOdjEIf^?ayl`m7Za#(-@i62-kZL>F3U!*&$6*&vg{)0 zRr&P|(0jqrFJ)O9bPsqRNbb}Pk)8v+7+eh`_YAs3&z_QHt9~b5cR;@bc6=wxt^gN- zH_yqkS>KMdHK+IfLv(^M;7pKZ4cV!us#ND^pU-P@jB4`SFaJC(X59GkU;ElOzVXd( ze)qe-`@2s+t=fC>#iGvsJk;5Lc`d26x8721{mtJT_*|?jQPq{``=8IUmxo7$x;j19 zQObAtWsQy5&ER%$H@JFnLv}y36)XaK!1ur#ARE@0jR2#;1>g5;y{`Kcz97 z4*I}9%CZqI=cq5mlK$-ZUykp`xUYWoqVc~J+Rrz>aqF$${N`>pLPrWgKGxjogWo1;hniZ)fWsCWN{Hg)t@vP^HYo`9(8$~@J}_s)v1 z=vq{AqLwjL+w-;QRe#ZtjeL-&4UT{n|CV;}P?qfixBolZ&DFFY(1YB1@I83%g1aVV z*?r&@c(cBnW!F5MWv_#-BMsRu@D4ctFB`InpcSkJJHS)mUC?*5Av^rv8nU@>G-MC_ zYL+#FXShCpVwPP3?)dKw*$d#jf0AX_zS)pXfL?Z@-t9ksCBEHNEw%K1ho_+$)sqk{ zzu}uti~M?T_}v!_{DzMmlVzKcN#F37xfkDW_}ko{_IG#!;C`UDybJmg$S%yXQQ%x~ z9T@!;n)0|Tn-27*uga<4^od_3F3_9)5>#*dn5uW&@AvV%*B||8tRYd=kf_?9+ofoD zpU-d1T7I@MYX@_I-rptAt>9^J1RMjS&*Pm17lZNOM({RqTff|x^@1Zm$NMW?U_JP3 zdZ}@gN+_4geA9_P-k3f0qm9|K;02&kz6^aEWT!P|W576Y9k?6Z4;}*d5^wAo#06*k zL}PaC>5bWW&|AUTgnc%pbYEL8rTL~kl;)F^axNvk?#Jkl!R3@trQ8FK0hRL8x5j#3 znR1ElqosY));O9LxE{O&%B}H={$CS~v&Mb(7svZMQW=Guly67t$oM{r`rDyve-m62 zwZ0eP=^G)s{tt%sU3lvN{W&Oq7tT9a{atv4`|PQP>@sjaXa)PhtKcp00l47zprm`& zAJR7fe;1zm{mOUYwr3i$LqOk!tC7`r;l#cjPk$lSpr~q4^wm>i4Z3I3y=pS$D@+*0 zJ3kIw3a$X^1Fi#ifCs?>uo^rAUITA{cfg1x@W8E0`BH+Xz_?`%*JhGAa;0U;WQ$sc#ocF)76VM0L zdwzairqB11I(Q4b3siy+p`*4pWaok_!S&#N&<^H;C7=)7zk}zsvmv_#TnT!?5ip{! zA^WBNeLyh_N#-D*>D#aGliunwP2c$5FAnXE&qh&BP=4db!}CaR!hg!LW89zdBeZ=m z33Pz(fj7W=pm8*<1RMjWokslvzwys-U5o^OjFBJ+Bf-<-8-G>*IzBgy+AB5v8IITM z^|`9;H@_Hb-n9G#%r{m4>ub}aFJwa+qrdz|jKM+q$(;5a^S*qHt|xONcn97j=vuH3 zybE6a<1Bj%oc1CkPLTZxqsy20CICN~(SJ&RJ28&Yw{m^<;Ve9v7V@aRc#!#2ONHDn)wbH3Ym}f(zoF%VtKQ49 z8^BZG1E4R*Pp75%8I{HJm``7ZtFngdW^g;W8{7|C!6L8&JOy3{AA-gPR#3n>;1%#d zV?(wAYzAiyV@3=f08GDzwDQ2pRqc0WD63dCp4-V@b*Qz

    Z*M3iuF=9g}5evBEG` z;Myw=_i+CJSPhQkVejX3G~LX3;977$SPxzY!>^&|0=I#C!6dL5-1m>Oto2%Ys9&x0 zWYf8JPj)#y+D4$a<3ccmp6my*GIae<#&=Cr@0z~fx?cSgyazuX?@iT{i7y#li~8O& zrg}cUHtqeLp?!5`u^KcVlzXzntPc6Bqn<4LUFsX$1{Q$*;5~5qBlJYzB5(&d@82_; zY$nf>E6?f@uKlcDU_ICco&oQJJ)2np+`{wRT6tE_a_whz*Eafjp!e#!-XT4!|KGn?5C757 zp4CuBb9%3yWhAH3-1&dZy9HXoe&EsE2V7rpD9hdkqn^*Q=YU5DA93wxwd6nYL1GlA zXXVk{75%?apYeLeKyQ(IHuq}fUQXfa*+g3|AKJL=MdV%q^GJIazb_L`G zPMzA;Hf`GU=`&`ux6hRJ1q&B0TC`Yu*UOf#T(#=4$5tz?jhlM6Z{M-+i6{1l)E+rE z%jSX}pp>@e^l9ij`Sqwg)pK)tX-;p-={-4p1Uf6fUIN{kUt8|VTwg=h9MV2DYmPbE zw0ZNEEnD~O-Meq!6CvcRTyh*#v2M!mRX6wK*Tb^r?K^ht4D!Qs-jAj=JO9x~7c5?~ zWU0!(e8r0H?jDss$V<-^;0CZ2JPk(vOsxCMpcBDEU=i2@UIwb2cXQg5H9xj`^_n$n z3vCynK@z8A&3+akOi%Gca8@3!vNvWL(>8DG4Oi+zh&7|Vvundfc)FKFH6^?Vk&YNj zS_PN-P>G9sN&HCGtg_2;!KMqUY1Q)+`}aRtCEGvEavrMhNlzuM(m~5sE0pM3e-}B@tD27WeN-CXQc{?@#%$Tyq3p3j1%~$WYXz}tD@td}G z-MaO9^R{f=x~=bVeU)j!WvwUrp0cz~ozboqTJ;w8D~n9@s&Ye{qTjCMr#b0`DSN+O z8(!#NT^FLHzIx5ZOB?R)m-?#DpzjJrlc?X!m6jv`x!@X z>Nz{RLZ6uCuTr||`XDWR*=3SgrO#>6W2oiRhnKaH3+1vZ7Cf0VR`Ezd-!6UMs`yTU zII@|n3WK+9eW|UZ$5xb8vWcF4UjpJxpD{pf5Uw6Cd}+$%)BPyb>a^*q(Kr&Wj0J1d zNG%Pu>YY}g@25=WrF9=uPP2SZ9&GzMU_B@v?IHAYsSavUZK`Wd z5!*RVrAS2|UbQgwRRh-A2tDo2Ez!&$-$>d|`^@g1ZN0tQYig#RV&ACQLp1zV zuUJ)=W!>d_O3*Sz-z<${`8L!lWu=vopW;oW*4C^oD4TfcL?vS4O_*)4zbFCA1AJ0k46N!D+w3Yz*80y1)wX0{HnjYSHsozo=UDd^XPK z((=V`R;|*hWa^DWnV!F#{TOiZKVV+=OAZj=*!?#>hL^p8PGg?^v`G6&0K2+x-6#`!Mh%;1&6?oSIQmd zKyjs@*7G`e9%Z=$+;l$A1bPqjBXDkBwo9Q`<<~br?*d~DAw@F5sOt}X%hf)zk>?ESfp7r0kWd3V*$V=tMsX@#AYmw5v8mi$`v zFdfV#Z%;vA0$<3&Tl?sO1qvK#h!N&WfW4uPjyG2#sp` z9xqmyZpIW@DcqaW=A0_^^2*bE!o2$QVlJmus5kQK4|Doew;8W~cqOWwE7fM&ekyIp z`7O8eFn@pe68Z+P5xfB20!{QM7lEt5!$4)yTGdvr)z=)!d6!+vo*Ym+@jA`D+_&Yt zJnw6^6`t>6l9 zylZ1ih`$v)o9hX!T&s>@o$Ni{38iu|p-Msa-@0cFP_0)kHgSz=&05yz+_nd!)I?|3 zf`wIIZ{C~LYc_1$yrqgOP2@Q6&v2J-OMV}IHa?Ai@uyy+(wGV zXkKrD-hd@b)xPtU8^LH|M z%Gz~(k5{Fqe1s97YOigYMkXPTY055nk>_O1L^%s99g01DhElGY8>D)CZOZ6z(`K(n zg^_|&vV^H?h#FhbOj1UFj3nl*edg>A^@Gu)Z1Wa9*M4>3lm?^BfQjvV z@ND7=tj0)%&T{T~0$aBgt0HL%)I|I`X+=$bZ~b(Xbx{)_;mPvUIaTw1#c?V)|g*9*%szDLWB zo%Q;F@Sdi1#`6i|k`nLnU8VY`f7U9mTJ6kPon2a68$yY!l~gouD%z&_@E%*uYQ1Gd zsne-#U2}>RPnXG0BeZGNKvkQzlqogP*`@hh(PAAEo>{U!TK0b84N6KC`j7!uOUtpH z3MDI6y%XM^y`}XtN~8Ig`nNj0r|N`fuT{pX6;f+;y_k|?&9LL%%gkA;9xK(a`gZ+=x6yeX}vUYi-Jx~beNU8T#g1Fn#akN3nbCo_PAtb3&HKfToAgwQb+S~V zoCdYC>M_ko^ECs>O2%;r*Ha6-etP2N_>@=UqN>{CeQclE+2u82tuvPL?$)W59H(T> zVYD@)y}L*C9Lt}#drLS*ElPemyGkn(ymMMPEwv$)2I-BPlDA4cM#5VA)R=Vn3e6eS zJ8aq7yFLGY4J8-S6vqIIjCRIQp?n^QNXRnD0^|ItC7cIaE? z%?~TbY2K`rz9k>Wh(mqNo3DM*eti@<^Gd6BIl@zSPE4(nG}R*)`(x&t65idjY4f(; zQqSXXp3Q=V`4`eWN<05ijXsMtMTevm&05>t)?26Dpt*HwsWtGFTBmyTx2mnUT&7Nm zT56fnv$Do2JNnnGP3luMPM#iHtuIr)lV~m0%345YSG2Xz%2#}z>><^9T8>+$q#M>q zQ$B0Fads8o#`PPvZ1pPIfOVLr>pYez=`C7ZdP20MWYkWnr?hGXxXw3(_M~~B$C&-v zn@ZwTL;pLaHLjA?trvFp`;T732q&$Tv~>0OXlj|FF}lXVab+~FjMvQNKpN@)_0^Nj z%j^z~rU%#?Omjm|SSgEk5fpdGsnb5ybC-Hv>8GvhJFHoF9N`bDGrTdSXBcv4EjohY zxN=t&+p~;8^WoYdKN>|>wF2HC)o@3r))S;rV}sIL==k+0?N#f|JNrr_Ov{sQ+qAsj zGmkbL@TR@JVl#IS*S0Dh@h##4St`mt9($)w zt)I&7NwnU&?3+K$`jXaJ!LgiZ~Ez^l%9WI zv?37~@16W@Zl3q(9&rTTmB}qr=W1-XY0H*vK|<*`EnkbOCY2v*VO#G`%Al2x(36Xs zrkutWpEoMbRlVMP~N@4>XRmZuFd^mfd~ zY;Et3&<0d0+QE!XT0G!=pr6hA$ck+A4NvQ0%%|R6yyaeYZ@>=lJ@68E6O8&z#wB1Y z_!!)HA9k4F2sr<@Sm_6c!07w4>{8GM4uI2to7HpB3VK2I04wX@60i(B3r_nsI=~HJ zT-F?Sxu)=~c54nhwb;!1xoSK-*xr_RQLFYDulse@@xgSk6}$n4-%aXZJh%pY2eg2> z|C$^^H-ZD;5O^1y`5W{|U?OP0iTw}g$KPa+5&8@`3f>0UJ=7W)2h>;J4!sYo1^d9W z;0X8#oc(X&`ulY`y#v|;UIrh7FBP@InvdRe?cc=xN4;~ZkGPjy-ld5w^1Fruyd?A7I)|%7R&>i{pQ#pM-r`cURO(6M8M8ViGe1o7ZU_ICmUIib4@zkwk zX~p>yZEX$q0-cwW8`bU-&aHO>c<^Cb##xyxvxDvQakPW> z+er(o1y6z3!8_peZ^hh?gW-U1(kk$1401#SSXUC zOi$r1@_8RnPp-V5#vEwFhRWW4x~Cs(eM9dq$?x38PSV$TkDz^E5_R!3^f~Y%cm*5* z$H4f1g?AKK4MtLy>%na*Q`{NVoGOe6sjH->;@2@)7#v(diuSJNBI3Kj<2&3V? z$Mad&_*?1gz#TyO8g)aS*ZlqwXd74pR)I4J-vw2>cnZ;DX#AJ-LqNP`(AD4t@N&-k06OxP z$h!=B8@Lxt0*bRXr+v_;^XtRVW8jQ$#Qs=vmvVhQxCiLI9r`qQC%+%V6A}NEO!g~t z=FmD0>g^NncIf^2b)(*>gW@QJ*4@chD7@J>=RC%r-N7!?W6!PIG`=;W;^?a2d=yZKBo6lF4b%C41>P+a~}Tnq33DHR_1ioHuXde z+2i^Bitc#7FxS$q4kp4F>2ZmgYCz9G5IfnvG5 zqI`oAn}akYmE^eun}ZTh-;!dEqne}-h%=vPDXucvL9g;m>N*>hatI`|T zpXYc|;Ejsk&BULlUVL&=`14qX`1(p~lo7rM1C@~WrV0bp8li9My?W}JqzICK?O3nevb>UBkOhXp?h*S73Fk=nAN8~1R^)(icC(_2!Puy?BzD7Kk%cXE!PF4%yw3R7sZPUZ|&|yl`^24%d ziQ_QQyuS;6ZL+~}n9~w9FU)i3k-}S5m7_Ej`UUK994C$ooP*D0*uiMzEnlC~`(+uY z+?dHmC()D7oYYhDE~>vcplio#$|kq(+$*aQ#W9pK^6lAK=bWYDI1OtTJtb?M8ZC9= zILTp_ZOUfM*cMh!rNN=1q}(z^wZ7f5&eJIw7B#sIPdS$EKTkVuZ?CrE5xX`Hs-O<9w`Ea?KvRSj%t$X5$0|%_# zv@yfwFZ3JYG-UW!LwQbd&6{hd(vU6hj$w1c%v#r#u%68^Y-Xn{gwn8KS?jc}t_4LJ z3ges9sW#A*(dPvF260`E7?S!%DpcGUcYXdni{Gn;EcSbi*@Eu%MJlIcZ2HaEwQDa1 zABt6mq+>jVs9o;dxvPjRo+S1a9Cjq06!!~R#oB59{6#FuM~f%dM439>l+Sb0j$(KG z3i}yJk~$744$G!bmtB;2j>*Yr;a>TQU*Q;IZs0a#GxAWZyoymrQ-&o~&7QO|TfR2d zqqH<-wytt&&Q(LUHPkkvkmy^=XnMnj-Mcl4_7gF6Txm2oiMD0xRNwL3=jys4J8)3* z3$=rI-!(^+lgqbNM$n8dqh;H?`BWG0fM)(|5XPR?t;N*y73U)57d?N}7uH}HJFMtl z#SC!U2S?9fk>>KH z)OFjC%?>5zz3G$%qh*vrQzjq9o(-D=R~)CucWz5=)fT=0)@I5#hcSq9FV65RwQjSF z>%^2CEWlc)$bn*$4jcY6JM0In+=(yfnsj#U*=O!4w9vM;nKNY*r&Ll%W>^+Xz>3o3 z8YcG@(qX?x7IF0IJ=^!}+rPh3t7-XN25HbW{lJW99j6*{sA3Guu!^I9FfUJYN@e^; zn$aSzL#eJ=)4R7i%@`w=S6ciG8Z+6YTJMN#%9QX+7K@n!bnm9KRER?z$8{}!Q`XzN zqi^?~IO?*r=;yM@lcy|M(JlKod5Kz!ODiqrY4oDc;KJ^8>$LtMnOex7rrLSoIW0Lq zNzvh1ZbMh}b7@L01D4f#FPUpk*ROWyz2Pgyc^XVWo;;}iSV_91e#^?#`FCFFznXR3 zl*Jzb>FLp3D#aJ|3Grxit-ZaD*O+y7$FHO~^ch+W(T|D9a-w3px2;z{9TF_~ltb%v znVdWK8`@o#jCYqE?owf0C!3ZT?dp#z7Jk7NN%@exWz+PWu4`R#`IAxO3Etz5FKRjU z4zdRn&pLjBUWTWj6{SHu%cEa;s?T~q4Nc=RzD#_|>!s9~O=+D`eCyP=OrJSRKk*XE z$`VX_zo96g%NdU z=fZ``SIT#MW`46fKDQ`!sAB0_IaZB?uY%fnoMCGnzN*G8SEi>hU+JJG7Bf6i zSQ#;VJCl#vH93raxNX|Pg=xITY!1_1bHZ#cv2hjOId_ejvhR@0-Q*n}XT$t*OI$UQ)Nn=#*v@uGOX)NR%864Sp3y0GZ`l%d!m7R~X$;Po z3t@a!7%47_D;ddrDV25K$@obvVoIxbqSTM^C6#RY{L^dKk#(@z)W)9bHt`)6R>X44 z+BDrtI4cWq9eaKJNTPicM~JMN`EZ*SwU5b}b!iQ+wQ0 zpKIB%^o^<-)wJT#QDv7~k*qwUvKIAHE3rzEtf10iO@cL`V>2tst#Qq<4%*j@_E}wv zrX$7qY~sMgk*#cJhl zTtq7~KtUKp0sm5)CvFpB~EjTsPRJ-d=Va|=8Dl5Flog3;&qp0v?JM=aePnMZW z-5d>+Gv$`2$@hY%Ih!x(BCVG9tXi{f(-y2Ei?*EB%|O?ANh@~XaVZ zC#|!|&xQ?tgUYE&OBnU1w&Dwy`U!oa+W35Y??SqMKF)19edk)?;kl&wSl;b?^u~Fu zrEAfY=N2O#b)X#qa#L$3Kb`RxZ+rf($FEeX+a)Per>RvECXuZR7w_1i z{w9s9>l9zig5N=E6(8PLS;nXF%4zxDY5Jb8V>7!R$@*#~1k3m^UNFaTwI0RFf7^^1 zGiP;Rv)02d_1d*;3vWh~zJGZc(tHngtu&mD>F2VkTG@`PAWJJ_c!xVb(mgVptm(2w z^7`&+ZC;itr8mhjtRbZuQ|eypq+9YCrfZZZq-Qti69~@RLqzov73AoRgQ%!=eft1Lbp0l#b3h5q*mAd-Ln&oX*eb zdT4sa$*Vb^FKzSWgU9l_AJbhN^TwU_{-?(1IUH;{pHnb^PK;5?Lp?EO(wDPvVvOSW zq?j?4G&KuS8}$i2+C$J9gio2OSans|$x7QBXx2F!K9A?(v9-_RX@)QP`8oC3JJ06# zujce4sL$Gw{Ma!uo@n{3ohI2a2d~qy7euKWb4uG$s}0^8_LHK#=4@uFbLL5R#k$T#x z)0yzko%`sciy3#snqI$tBlXK+GkR_LPAh=@y|x^x6jF_< zgE61lYwJ)C;UhB36J5)0$u?Ztj6mA%m+uo*=yL# z0*k;AFlsG!_~0Qh7kmiLUx$r6Xa&8X;%RUKy|!#W8`kFzEyXGw3|~g-pzOId5#B?f z8OXP2K6Dk3=hiOhtDtc?o-W{0AkVEyQ2A4IK(_*WZavTStKcIb`|xoq_{Add9WWg% z0KMQj@EXtvc62x1VTs9VkudJiokDEiQ0*k!K;-y_L3C^2++o)QVTu z3tY>a>LX}R8)XOeyt0@p1)DL+Ki?AL(VOd8=BHe~2Uowfrl%}AiX7;=DN5ygQ0}`# z>G`l6FozW6YgRQIi+#Zf_Q;Co;pXeO^?b7CcE;SxCu=R&^2yoYE*t%?fG@3w``4T0^SWf{!=;Y_+@?2PU&WH zoFkYB9s+a00dNS6o)vR-CG>940-nlwXU`_*;CgT~Q0^as&I01?0j~l1WxWkm_?aD% zo)5KO);RINeL%gfq=fF1?%sv3$1)meEw)|=uJ(g>*f{7&s&XjP?R4c6ULoZ_i8w@#yn2D*MHr;XG3 z0)cbD9pGWG6+8vXL+qF=~bv@5Yv zhv#kClAk(}`20vNMH<&S=xtfsp4u6Ir^Z}K^5w-wouj!P#ZQ3MmdZY5EuG>uX+?Mj zUay zkLqZtcE?h_H0Yjitw%m8`?EUX;a$U1p=Nk^ikJrB0m-Q{sRm!GCGZr3uaBRgD7BpX z`lMXti#dquzn`y<<;vrA^J{zYC{!^lRnJ?;TB#B25~{s*tV6l8w@%8#`o8eiu^ztx ziqnuqJ0t3$@YbaF8EB3F3pn5R|MJ>g3)4)vb+-=ukQy5dom!v9A1g7Rbeu#Xcg zbE5x^^JF>6S|86V_rFOsDO4*)lS}?L(qt{BQJeg4tU)`SVVAPxf1~g;FTQqOq{+P6 z{x_)xOFAC|``=i)sqnvXJf~jU|He|vTP-MD2D6Uj8@Y@kFZp zZ^U!CTnfk4N|&x_D~11!!<44w?SJDi(eUIodgT;c`QJFqX^EN_M!JRnjkuOdQ;GgJ zj#JCy#$nEvwM35_hq5x+Exk>JUyVWxg^(YQyK}!9YqAc}vR{qEEZbD&SL0AoQqKKq zEbAPX{c6%!%Gp4EHD%fKo~NPRN9}+HzZ!)(+-Xa{(BH4dl4a_cy#I+`jig*IdaJ^s z-?4{f75|tDui_VDUPBgtk#1P-1Eah-#bH_eT`=+dHL2%$Vtr-m@}_)Bl6aoD6p~Cm zP8_4+Jz|dYSMe8dh;{J=8`Mw4ahyX@d4y=pR^R7Cv7ElCM|swm@{8W4j?ahVnkueK z;cL+}+&QlJd?;mXi8Pa~;q#Gtd{}p?&phYb_m(jYb}^OleLrsx%cWGhbZ_0!+ru@* z8#Ac4hh=HyRbC#_T4;y!3iyZ>DwNH`{#X0Wh5cYpR+g-OaE6;&58#+4Jsjj(Cy$v6&-PBBF z*5F!EE&2M>Qt3*)f%NQBC_MEB^0Q=oiZ_rY!#+aE8z^lBeoxGkR$bFKC*D8~RT}mN zGEXr`6K^1K1k&v14P@y`E-NEo=OKCnS+c)3koCtDV|?pVSj8L2lBQ*EAn~QerIi-* zsy%qbO+%em?8ns0YRFZ?gGcrgl63CUo=|D}-f227)t)~ET`VwUOCpmIlIYz50=Pjj;%q;8s-MCbyjCvne`uHm( z^L6T?%Hzh;ri9B@G+16Lw)v*iRpD`C9&xHXZp=4r%e5nkOP>dY;y!cCKsj%HBx| z8_4@e;XK6}-ba4oW$L%plvbpEE38ymR^CU_tUcQP-baopi8A;?72Zb`@$QqowDW~*?8Rf7HZ};3v)4D2tKa!@T!S6@?luO#*)5qzE zI*n>iA4@przL%$ut{J^ndHOh9^1gO|%-A_vJ$i2=TFQnJrC*Hnx~#*VKH@v9?CE2^ zDg8v1r;keNJSm@znY?)_(iLwW^HLhx$$;KGu1UvYgn&1X?gT~%{k(Z9l9lIB)}kIz z-aOW$5=3tv$F6wum}4Cp(e(G`Q7BsR=81Moe#Vrrh6j&zI(<{cLQC-ANoDF-oAtMa zE3CFsOCq)E&kB46r*$zK$D?sw?{25++VDNCmk(6@h1wGqSSlhU6h7Mzu(Z>-bIpDD)nG(%6n(C75z}`jHR*yOrp9vW(-FsrA(NF0zI)P0QxG zlZ##{t(7zJ2JLG#$>@I`J+Nw-RFSB6A#7s5D=--L)iixz(q zqN2NYUYR}B_)UnxVmX{r6u$|P@Fut9=hh}X`4Cm*m$(ZS<|kbwa@yAqa()6~ui#U7 z>Uge`j(*IOr+}_iZ@H&U?kOOyVx+OuZhU`YEaTHuoZ88x^qF<6v|S^jVa2kBm3Atl zy70ZO1>#NB1}`IG?}v0-Mo&16V}6`*@Y@>r;Fu>`&n7#SNw1v;-n)J_*^)CDgEFOe z%xIJCJI&*&ZL-rGs{|h9I>wk!ZIgZ0?_)O&^h+8KK%2pQ&mD$4o9y0REWNk)x5<8QN5v-l`km3X z`eEppKE5PvL$k@g1KqOCrtj7sOKy`r9qz6Tv6YLi;$AJDv4Ny=n{4+}qV#-N)0q?B z`yYh;^%eVKPGx_61J|;@z6)Bmzn%o|)7W3P5a0IK-{X29`|DQ-SMACE`px{h(lfT6 zB>U@YcHzkl?gw3<7d!)wfseuEyJN0oe|;a<4}*OlL})Ph)@mjNU{L-kn_Er?J02GuLq$bRxJbzh|6X<2NmC z%TrzkmHl;ZeqXk~CU%YAdGNbD7)>puEz9Uz7Sds)Z619`Vij$!D18qd&(xW-be??C zholl3DWS8ligs8Sk3~z|ke1{;!p-9Z8(hnal8@X5H|0v25oS#rT+5ZmXXe+o!BwbY zSc+d#DNf6`Ci36U?$+^Q{^Ke6)jWC(PRO^8C|5cCzLH+Wp4L2iY3ylrCr}ewspRA- z-C3WmRj)q7-qK3Pa)kQ~`-5pb$;A8wyV)Wo@t8l?w3wAn>vnwQb7v7-t-G+8EzYZV zUL4o?unynXwv|m|Thcjclof19UAjnJD?!CsPVwXv%R03(Rk%>tqUl#?YgoQoPnk+z znODA-<*Rr+4NZ*n8*JgeTpn4wN=|PjJA_5al!h%_Q{CZ7X)KUixH`;wMa`oPY2j+h z)T)%FIa;+^?v!|rd~t@n`PLaNS{%6VD1@HFW0sOVt2K$1?O7e> zw418zSsg0cn4x~V<;pg!sibl5QdJ&Vw(Wo~2BA5{a#< zxXw4vy|7iabZV0KQ`P^l_zE@mb^B(2ac;<*Ibz9@5 zF-Q$-JaGh4vo&6RGPh-&`&6f{qaB{5hR0L6^AowP)#*EK#rDn;re)hZ>vc@!!n`J* zo*i}hs z>d84&?Ub#a6gH66lfq@ABuaZO*(jy;Er~Kx8zqM+j;=*(Ssyvf&(XBM{g5R^D^lr6 z!In^3X}Yo>QW)P_+Yg2NvK-%;vdz$d_Cik2c0#&0uWTn|zA1U>XD8(Rh(RFRGo@rVm&XuXHNvt=P%+@60l5(&nu{Kfa+twsu zZ^2>KTHB69Qm%zs)LPPcLvl*(HlI;zJ@u$`JIv|$elQCX%Q;>xY8g@V^*^6BKbyDb?e?dTWi#^9kGn#m8tbGYtznSdNM7i(mHmTmUHGDB(uKaG+M_kr|f&@AlL@j z=dp4cEho`hLp_@2M%RPch**zvFc6h2eO%c_q;8(lyfE8J>_Td#Djs#G6;15~&c;`r zed=)PY~2)6J-)7G3*xX^rBj%Y+GB*YvHs&sVosTL?0PgUr>-e$V*lY-PFwc^t*j_( zak}hYOAkghYbe`%IF3^?{X+i}W%Ywd!4l7L2BVB@6FUz{I|e77c61hXbTVu^($t*l zDLy$iIW^W{D))$ZT5RQ{*g;EMw%d?4YFW>yI2G0@h^E&{k$%3g+i=*YwGepoi?PS| z=uy$(zZRi=l*pRio&HfGa{Qt>` zPSEwxGsib%m%hXP5cB|a2XyRTQ?_4f$TmW6hK@SMJ|grH=)2Ih(24zt72L zpa)cT#!i;az}z>fxWC_!T?}g34BP;}p3T4`gx&sE?5BX$T)zOcv-Jx1+5>zCnx5k} z?k#rO!0FVWc7Yz|`f9Ep0WWYp7wU7|MpDCL$FN%lJ()HG*IY`PKR2`dW1s`u47~db4Z&vM?f-T%YzB0W+lNQ6a`{V6p1P!=pUuFSqtRyIM(9z( z&n7opxqcd4%5@{Tx(|9Ov@PA_-zKR{)>Ta2EIcsWHazSa)r$RCFlV|w;34y z725Z>hJNR`-T2jpY|`~{&%c*z?ft(BZN8{s$TkBDUZ`a=upjQrf0XaVLJxBv_C3{` z7d8X#r$p)buo*Dtc)qi(BP-uj$2avCQq;U*I$t!mTJTr2|F>w|k4CMICCcc5-|VSa zoTXvuH%M`ZWzo_sm8tdBkZdZGUi({?el^m3Nmd|V`Z911IX?iFduCZrDldJX{+nq&j&i&b3D}FgbuE^g7PK`>ehR!}$)}0d{~|--I{dE3fImJ zt#86;pl`zUApIsh%>AeTCOkslpPud6#{CYUZ$cBfzY)v@$M;QGaG25DpY^vRd*$Vd z9oeOS9{ct?pu=Cm#u3yz+w%u!<#qq-vE|6htCee6c`bsTXe+PH=sX5=%I2xm{XkY; z=Mb*eEGw@I^Xtl3w)G@gdEN0U7G9toYy{7N*TAX&g;6=U2`E?7p$)ASG%Ik1`U$*jM#31V?&8c-}=t0FP zpR##>9+!2H;yg`{DoDMCm6$^Zqp6jcWwokqD>3t$s;tD!6=l4ZSc#<}={O9Xg_W3P z-~}r%-;0t?ZUvTdrHNGp)lYP#^#Yv0iF&4)%Om_mclUs)A&boB1aj7lCEbaQ29N~p! zSQ<|1aRZIOI_)$tC+ShdNJXs&FCQ2dZU1W<6ypePv$xUiM?+@yrVQG2OcymY4mQuJyjk ze$0HOVf!)jM8osc%64u)<}m9OHIJ4S*7~Lft(K7HXg_ATvi+F(juGw0%xx+x#>6qC zm0m)P~G)oGVeCP$)j_y0eR)m0aB2qqB00_rP&d8g{|dhw8W1 zRF*~js557or83g(yqP*&VHJxral@`{JZn(Dr>5WW?nzG>ENk$+sWqF1(S$weIErHB zO8t7L(oI)REG;TczK>@L`i`0z)c(z~w5_T$1*NsxCeArlUVa#D;#?BblVuYp{na*c zPSG`Fn%cxkCWUG-J-g0v_>y8LXG!MZB|EutTE3S)UGt76c5)7tcH7CBrx>J$ot!vA znDOh7jE=6{PR_E?NO3kg`+M7QW z*Umupe2Pn7U*i-rm$6L!oK2~>;uJH>%0f`r+M%pI#Y}l}Oi7fHS_nGK^%D2|qc7u|X{(7*cbiP>2ZqRz_QR#P>)AD^7 zfijn^_q+C%bG%yAGNS0KYd4t6rFk;nx^-`!t@di!4O+(W%G7%3DQnmbI(C_sbLJc* zv;D$u&~eKt``$UIZ#QTS^=O(KT~ojG+dQv2zg%xU&cQ%bvdo|Q*$rApnWlMR&Yjo| zS~5*dyn1$nmaj+Clxo=xI$oNduN5ZLw;OcqdNfU4*OXPOJ^8QFJ61V8T3HRdK}!!t zHQOrN4LXifG9Acn&~XN%jPw(`K}kDCv>Wu@$*>ztQ*%1C>;@gCa@V#Sv_vghwi}cT zwOnO4n8r)5l_LFoVK?Y7<+7(ozq9?s6B>Pg#J5X*ydm2^T|>7;I%S6FFxHml@GH%h zi##oAPn(wVcq&u7bS`9f%GGrvb_l(_=AM#qs`K)0-0U`PF)yX)Y0)o*_g1AS33ApR z>Dr)eShi{B-n~ygna2K7us6&1Bx?Qceed?|JK`_r=`1JjTEt(`V-$Pg$5@Af+ri!7 zVbBFu=k&Rp9?R+Izhw^zTmfzdcLB+ZUiSezAkej7D|jBf3XXygfJ$^0I2T+Fev)>r zedpP;^&4u-mht;mVO3?-D($eWU(fG9aXRsqEjkIC^QAbWc=zrdA8|?ocpbb4M*Kha zwZJ*xLNFd&39bisf(Jk|m=3zYYOn)51zrJff@5IhhwN)X&!H^EymHE{S^CxXwbX0) zo%T?BFaBS~^Q3$MxEPEF*MOVAo#0+D30#N97HB)z2pGrl8`rCe{Tw(gn>WwD9mnt7 zuUxgN|1;dSO*(qOde8-Sf#<+c@HY4moQ}40!3E$lFcI7c?gP`oGVu9q^X9(3J+f9Q zo_rH=RqE5hIH0s{0uKYFwFrDJ>*|^_XTbvfdcB^_jsJ@$3~qd%S_RX=R`4|7_ojL- zB#idVQ`HLZ)!e=G{fJkgtj$jDDO&l6EdCa^p7W+neSJ?px%U5{4eSC3z-!!X;fG&LR6beho426&O}=HzdU|3TQrp?Fqc7MoKk>w>|IJAZ-~f0L zybj(0jkMm;-~w<3xEiQM-vK(n0Ee2;>FJex@(X64@SXl(-$q}H|y4JO#2gGbMo{8T{mQ{p$}@z z)@;~PJUdconL4w&KWoTZS`~wKzUzrXlDo~1KW?o}oGd?m`qJ)|p~p2hrnCI9NVn#_ zac_vl-bctU`3Tw@vPFxc+?)fEcFq+g9rn+3mETRT^x(>E@4hFC&|G5j?AeJtyJEf@ zmg$$pcJB0jF3-M~Icnom+h)w}-}ev8He(TXAmq)`4LoUGH*l_jDEXNpM|_8i>TAd1 z%j|^O`Ee+*9N~D$keQIw{2G?4-MJmkWynd zcio0vmTAhi@7lMIA5E;P6@~I-lP~YEj5W(S^AX^(OXg1&}q&DwasdYvf0me}>^VqHaUtZD5==$^XlT)3!bTYMIl66M|ES9o`P}ITfH=*A3a;CnD|W6y<5} z=qttt>|2L#reldVWi2iIn&iyKLJ8B52F{p|I6ZJh7##M~` z`Myq{Gk@vw?v2~ZqdjYA$QCcrHFGJ}au;>4UL99)_tN&taWra_Y|3X;IYTS7Yqvca z-hwnN=4N(Bq+Mam)|gG7xuNJ`8?&W7>xu z%J*#Q4Q*R@^!`<^RbAVcDZAdiGbh$;NE`rrx4wB8RM+SvRe?b;;5d-J6PhIYi%$ zmBqLmuZSSQj^^$siuz?2dG36E*>y+X?!AteQgrOCeDOY)Em*wtu{G;9Y|-x~#a5C^ zr`NQ`P@aZtUdXGy4Esu726$Sps(Od?h1y?|(=6X#km~PGnj%vCT$)xSdbd};%c+E} zX=VI^?9AD#9@|&cVJZ`QxS6vT@U=?$zHX!yR=#i4eoNc*cD`*6H`Pxew z*`meacd+`^Mnkqe@YKTOdee$?OACdx|l)SjL#TRa!l+oL&XPD78?kWHDP`*aSf z`^bxPP~VG^YCZ=|xk@e0LCr1CLCrVS6RONX%@x%gG}5)bqMn25TIq;>+BxW~FEnI( zz*FE^@G5v8oH{bni*kBXP9KCW0IR_Pa0p0VblGq`rJy6f*pQtLE&*49Yr$>cF3<)# zz^A5lfbk%+s3}uC?|k<24cVLEBhZA72Sy+dJst2C@#Wi0$W!3>W|nKwvjFsgXMtvx zN1(^Rsc1VBi~-}omEc-%CwK%b0wb7NR?jQ1Bj!!uPM};)0v$l9tN_ES=9H_3HDoV= zRZR`q^WZS}2xts92|g{8deCfgK6f|67j6e}HmUX}^q);LOk;@U_450gq zpjUva!HwWna6f1TbAe`)JT`mQpUG{=;DF_-k6 z=aRk`ZOnF7wUZ~qtU$eyLYX6lJf}0tG`6oblZ^7K*NMiNq^^{A`oU1ky%@M`bj7Kv>^JDy#D|0>FlF=+MYS8RYS21Rs{ps4Vn;4hH*`K9M$qTbS-|=Mg zS)XG&B+mNG)vQm~#AeoK8Cp`9^;t?(vp&(LV%BGAKv_A9<8#aG6PhYW__Z(ZJlApx2-bU^LR}0v7DOG&D_qqV%)AU^3hBz-uHx( zHfHG@O!gQG?LXfVw+zp>QoiR~;wgQB_pVv@!!*OIo?n?STA5$PJI${gPJ7AcSK>JLxg7H=%V~ZUxtd>DHl1Ht zGNqJ>`IR~4`IY&mPCeG&;!qyVuN1DnQu8azijw!-9w6l^wr5!>zj~IHhNRckv#c~E zy{0u5v#gZwYr?~fPO~iYQW|Gj=1`7&mSv79^~WsBchc%vmU$_4xMo=?-`ARD={lWd zIV`1dmSv7+S-SQt%Y0GIvP4huENgEix7BjnLn+kS;#?~YjhfopM1wV5&;9(p9hT}+T4NY3tgN}Cm+oc`v@5&n{D$lepx+Jo5IW+^%r3y?U=lbC&L7*5 zJqY%J55VO=&v+di2BR)u<_jJIz2HMI=I<~A2JPT^@FsX4+;$`r`q5|mMpBT^_AKa${p}C?Y#;g( zbI~!ZX$bT9&d+BD6@IgaIYuMS5HqoKSjfRk0|{X z=XjX&gYyc1|EFV4Ed!MManLJ)c=v(nK>P(c-IdeSEBqOFuYo3>ioL?m z<62(fSL9FXHs}JdE5Cm=r^o9R{?t!4WUqsIUg7T%HiB{w)hm1n@+#k_@d|&Px9~$C zJ!5ixC&DZI66peWkINED?efwP>jHX`S zmem}{Uf<@?wuWG7RwY-v&uTG}7@sIt#DwgcrQNeJ@Hnxz~5fl_tiLs)v4F z-^U5An*yr1W`J#DlQbGZ@GVJJnN; z%QGsxuq9_%$;EP|Uf2#TQ))Z$!d9qD#Ir5DupKM)!mjWtUfAZ<^TKv`nL5uYKlQaX zKl)nxuBq^~Hph9VKONN9+Hst=sH~ersTKWZLo%+kG_A!x)%a6O)@hoGSMi-zynMD& z@tZDss(SHxw#}2}ZMbq(;S-(8M*nB$iMMM||7XkoFnTmQZ>A^9qgnc^J(``OpPgyy z(JYx1@%d`Mz+9eh$$Po1*Y}F6YuZ=hz3fn>ZtrFD^3>R05Jw2DsmgoVvd+Cz5smTH z_gJdhd)Zng=lJ4Ptk5iBTJ~NR-zn)@TFh%Ie&wSa5?0T&g3vm>XCt$SUAvzwa_D?W zt2H@=YX9Uk6pfu-_DtT^TlgfWCA*TzrQFe4(;!Q>kv`ryxIrX64IXLLi)*qUP77JD$S%8{Ap8}dj7PIXR7#4xlH{#9M&64VSie2NjdDF zS(_+zTlmwad~2`mPb*33uLo;N$NIJWX|1Oom41ggE#D93Pir~Ht3@p%I*>nYDwpQT zeCyV|dG=MC@PwUuaTF#kskj&Hye_F>ar|f&@puRt?HPoYNZgf4E zKdtpR2Ln;b^1bZmPiq}zn&yQOaNiN@Jz8+0es^w4XcxigRR+v!VpVqPK z(KK~kQ&!E?bAMXLDyK&)tKm;;>A|Q*?+k-l7cSnhLsre@JUBJcf&6I)OUL1iJrjRg zaUBxxAX@gVl`J)0#!f(9>e{t`)fsau#;yGcYeCx7uU(N{(bRN|6<^iXD3_|SDCfPa7%uD^7k0R z$+Lf#^?R@j904Bzojg1CVs_tvYD&K^zJlxW$+LUl>Ezj?xtva(ZTfqWcM()4&)$0r zKA~JoPkQp~)9}U9$+InluLs^^(8;swJE~8feOCH%J?G~&G}JwY37jsgv@WM?w}ScH zrzg+u&%=-RUOCB2_!kKsh0JlioNmenWEzQ(TtD3A27&4ZsjdmxvtxyPWBt2lL5 zb02%iH)e7C#domg+Pme-zj0!I?X`D>Du$&rKHRGF`X1jEdUo|GmWlmK{Eh9D$5%(I z=sHP?nP?i~Jd20sVnto|LaIG{SFo(@=-jZackjO9m$EGG zYO##tP@7uG4z0wzw1z@GBrDjKac)G-_VHRsx>ZMwp=@?9H7Q$KeP^OaPAxr zjiohehd734d5zj(mZc0@F;=d^uRSZ=GEPxB6h`1_+S$p<_1t+2IdO8s#_$vs;uxlm zNgGO5k`?N7nfU-Jo7R&cG&aTvqJ)R|}JXI}Q|C&%Ksmrm2vzi4GGDZhHf&k|0@ zlwKgN;ZZj|+xP6-kAGb%YmMf)CMb2jk|zm=N-G-uYrN=Ov!-`%wMJ=3wfcHQuo31r zgBLH!e~DLGt=Uq}xA^51ImM!j&o^xZpPEV_Nk~vYowCnUty+WpRb=`k8D=ocZm65JyIZSb!Lao&- zhq;ud{nxK7DQYR+ZLdgGy{&EoqOMQ+>1ey9{pNT|T<8-lW1ZzvI$Si=iDDHiOV(~` zEzT|PL+dQXpxfiX*NvO_{XmDMDV5`SbxE>Zmv6LY5&BNI&zzmC&G6OsucRu5(y2$&Fl$YDyoLQwDAT9_-_`h~PNmDKC`^!M zg*lv_wY(-Gog5Efi84)7aXuwO{)!stsQkvLwDCKmWi93VT3W@Ub(Ys9q_M8PT6%H| zXtnP2S3n2Ux_N#nV)X)J3pO~YJ&;-%{p#qW1YXE?1ejb%+` zYHeTa|NETMQ~X9}IbQkRddzRqFLLT#Eo$8opYyL~hBvvVYD}vfTP~I_%-q!<)tJ3I zEywVEO4S4FK7XFFK;u-TO?55W{Y7vOUcNV97VQe77b{t`iz_Khmg$MHXirmdYA2J@ zqm?Y$-RHT6M8k-shDCcSqvz^-T?=9C#6X)di%<0Kwv3;y?@g7yf3eIw(OTB+l1*jO zYv)0;p((Ukog|i)O|k-e99XwIX0&eioxWw&zjK+EQYA<=Ds0TBwsGJ8FBrt!6m8s3 zhn@>A1vi2D;24gaKech6zYN=Uc(QRn1br8rd1FI122222VR;BD zd)Hae!@o!C`wf0)2>Zg#-0uUg0Ie8&2pvHUj|bO*TftLLb9&f{EPIe^*|@KVo+uml z{r`-oc|){uzXCc`8}}QKm5uvRsBGLnfSyUYRR&sR$;SO2Qjv}OD(H!|aes*4sXX)q zHpSOrulY||O#@{c_Yv1)$@?g)YtT!<-Jk_50IR`aa1@+M?#=_Ljr;Z7AHR+Jga2e; z8~3e*zX2{F*O!5Z!FsR@4Bf`P>sNRSuj+5({?b3J*tlPGb+lE#6`K8{q1(7$iSGV3 z?svm|@$&eTMO(Pn6K5`&*tolQ%6l(HK<515)}QxHj5*c%^YdKG#{CHNMBBK(k4~>Y zkLL*wWaEAv;i^5YKi`^PpZxXb*RR2g28{T}^d{gMa4VP&7J!$4a;5d>;n&h0!3{vX ztW~OH@SXjFWL-KkNg!iL>E*@o{4y{kBsFt=e(b?G`?ao4@zI#gZ>FKpP$rHy%vHtcEKu&!LP zVNc8LG!$R?+*#yPt+H5cFV@;6pQi0=#TR^Ed!0RvZAs@K+OYeM)U`8SvSD|qQ!7)2 z3#na8EgN?0DO2ey^UC+KVHc05QP{BSzFZ#Ju#2y^NjB`(qcm*8Zk}j)2f$(0D{3BX zNDKB;rUtE+kmhK^Zn?4zyZMe0ZP?9iDs0%rF{HKr{($3(miGr7=G2<1epk$)F=n+5 zdm5(n2eM%=%cl1{qr!$=e1}PAELXA%Q9L0_nNr)y&V#rv5zn@;VYhT@!(QQ4Y}n1K zXT$FBGIgF)erm&RezaltU1bNv9Os?>bWj_1$8p-C#PiOHEZDUO6l%^haZ|_jJ?m~U z-uy@7FNUq+Oy=CiT{6y>uN}`+X;l!{*OFCyS+DOESJ%A9iB-HqmAb9s&C656Dqb8R%$BRH;w|gkI~CCwUsmy! zs?WOconO7OPH4T;KX-Ix|SC6Dpv935Z>K5=TEHSCF6H4)#z){YO8psqmb}c zvxWC)$uizDetTU??X5Y?yfA{TX(4Y3$1wF9DoP(*{MMGke>kk+l^f@DSXONfudsov z;bVBUHN0!XRMzm4)B0lnU#YT`B+5wl4;`kbscX?%`-cv*UQ;Hv z8r~90In9Nv;T6VL+}P0-3m`zb$adeY#Fb6^U9X-=9@;#c;BU#@#dwJ zoEQ6-%8|=&8R`zpc-;v+$C72db2~ATB5R(X^wS}S`Ev1OIf3- zG?QAej8A3i?T0#^X_a0<0UEm^d`be zx~6{VUwB@1erd{joP&X=Wa+QUJJ5CWl;(w5SYjDpD^>BRyTV$$gF`kJE?nBpZ{OBU zA=TsST9)w+t5rIM3F(e=NIULh_r`HlS{7?FO~Z6eSvCL9E#p%uONvJ;E6Q5zaPPJB zU{oXcvSqyED3ufgS;jlgV3hG^Vi_-K$B35kzB?I~@o8#KrmS= zvuA6!ciy~5A6>X`aajNA?q0c4XZ5aIr{9*@!tXQaSChiY<^1x`ll;1dby)vrK^a3# zZ!c1&);c$B?JMjiR9dVNmWy&~`Ig>Z*H}}wfL|@>~s5G6dkifn-qDE~#R zl|ws?PQMSPHe38g)Q)@ERR(W>T07Y9!B2OvNBk!H?La%&=Rhw56Tyw(ZlFDyhoRcd z8pm}P*WSV2$n_4e52$p{LJxyupo!WX3C;rA!5$0M4z}b@)DHH>f5Z7qK&P}x?@)KJ zj}k{a*bh<{+QDvxt^m@(yB%k(dRfk!2)#Y$-<{J3bDHicKLT$qSPQ(TypQW= z!Ep2`{TH}C3O)w9ADP$CQ1_IV(Eb!}J#;^K4p?^|{!B0D;cr0S14G?YZp-7Hu9WsPfHYgtN-wU*LbV#p0Kh8SbW zjd9tV8$+m}thJOHVyrR77-Pp_7=F*dfH3@!8OLFOVSoX~;io`|rPf+&t+kd~%MxO( zwbWY6x-RSX^?uItexCDv=KCE6fm?6?c;|D@=X}oRoafhh&iR~kKIdA@7(btt%*bJg zFEm~0d-d*F>>~wxTQ~nIVnxH5c_#TK}6xT4U?ZSh8_@ z9-}wXu(=uGya3SfU(OuWikiu8NYVbMva4BMXRT5#yZjUT#{trOa#4ykIPcoiL4a zKGxB&4@jw;I+t>@69Ou7q?%jTY>u_ukTfk`zG-WPT%Bh0at`O~>{AY`=}VR`5B^E4 zfoHRLNxCb@98*pnh~5%PX0EMxqa?+75@{LqUt5c}uReLXb=|u5_JU)L=y;{Qqw=|N zQrOaMc}+PnVBMxX##eROnK0{)Dc7`S?JMos99En%DhZ`yqiSee)w)|P{ZkLE3(C5t&Cb4+h!|ka$N*eIvzkaTt3yC%u}(`^wpCy+?x=0dqyUPtD795^T29P`r3FJfiondmASb za~?6H>VfnxbuHdO*Ceiuc$~Pfr}($ABVkEv>xK;-L+%`{$?pE6m92?pUZewi#I z#R-7o)dJ@UtZMCWD(6nV_Igk8Clh~EvU|5E?+r65maOM%ZtLLejw&^4>)5@!vYpkO ziE>iw_3fKqt;hqfv1#e@Tyv1qc@?`V{$o7lMa`{ys=P&L1;gnjGuWVK8=B-=1G;>f>T0Mpp z`C6xg2anX0bUD{b-S9pcswuJvn$GBZam95FmSnN!WGFTjYYa#0xei>Z!V`PPR>=>n74LS zythhG&e*$3IX88d-M6Ad#xm-saoY5Xl`WiA-r3pR-P5yUXI~$ZBY0-zGU7P%nv0ig zuKeye7dS0n{h-}>O?U!JiausK=T)5Rk)EENpX_n;Sei@o_bTg|I|5a!diwSdZv35s zCz&`6%g70(^LFM|Q>CBm*Uc{C*^G}?TEVg)5^P~8qxDi*YUB< zG4&5?%dOIM56V=!>$8weZC_qzBb7U zyjv_vaL!;ic8s^6%8n?f>I!0wD)H*=$!At!`Dh9DLgL|_V758iLbx&R%s4$BxQ>^s-Xo_xm& zcE*55K{b2wbMRw(@)qpKy*lv&43hQ%cQ&I5Hs)J^t|>k(3mMNeIJt!>e5^Y|WK!F~rm6_%T;tO<$D4nw?%*R zB9_~ihT5Wk{?7_q^g6<_MW2K|(ZKsjX(Kr?WcBkQA8oguW$@X3Vi4~6e;VF$(f5g` zZ+wu-P7HC|B}&W3ZYpzr=wH?Ql&wd9E4758PW#Pk6$fb%fBdat7cJrcFRkLkYJb4~ z&#JeIpTXDr9Jh+2|7+mgmC=WwbF%Q|TE$Ok8DILmR;&04U%O`LYPE`2-|oEhCzb8a zOxl|^pmygHm`e?QJ?+keXZWxF5&sJCF8C0f18SQ>Zy=ikQ{V5`HV^iz=Fom=K5PMD z&4;}Rz1H(#tI_#3JqOK)eMoq?`LNGP*E^{Bu!~u^=r3Kb`LKnJ{4>BhFaSOTpMzT# zF+&RG0oCf%>?CO;+zCF-c+;EMK?)uRPXfuk1Z~TB$Dto*{LeBvdU248=fiG+HwF9( zcs}e|!YyD6kltg^Z@?|totd7|k5>{O=r zYW7%;LC2&_&&-Toiy5=W(DgJ}p6O(zSQQ_CUFschhtEPafA&olFVCN)E7X@P#ZBmD zt@Y4MG_!mDGhdFzdn_$0yOZ}=npdC1do0ZrrAHF&v5ZsHBXAs@`5w!Nm+rB2T$FOM zJ(e+7niyBImSX5RL6$3z%FM66$5N^BNb-iHV>iAEQ#*n+F^a^}Sn0pe`BWqCyR76< zN9Gx=BghqdFFJ_!iGNC?U zFJ_zZ8Z*$!KW6=O|JUnqTi0l=e2YGzp1$3B?ztZ8GnGDvYfmJRzr9uc&#vL#YjCajMl4(j4|;TCTho(|qR$ zdoj(e&-Y@AV@NA)fyXA<46QXduV{HMrqe82U$Ga{siJiW>i1cW)1xa+7m6iSo8fk5 zmSy8OPb}Y=DZbOBGhAi7Gt;SM%Dsv_2`b#qtR$C<6?Qa<0ASYKRTH5tpMdkKp5 znmY5SVyCC&Vyf~K_dN--@xD{E4xWuabU3q%`|3|7yb5%?5Nx8E(Ki$UnvrK)@Of}OiEwY#o z-Q#B|Nt6-q@pGD-R7j(IUfTg6U5 zYqJdfJ?7386L{LCoq(2eK2!5~Lg}2kHK>;1j2uhUC*21R(Q|t<@BLT@d6{J|=CZ}7 z232+kT9->PRcUBRcVxsewRQ(OpQ-Y@Hf8GFfz}(Y%)0}{rQ~!D-`YgE-}&yqm~ZXX zcLz#R`fI_O^8aI{Z`OQwp!L+E((g2v<@n`x2U^bgs!_{`4!1inmW%6TzI7{Zp7-WO zYYg(ed6sd$GPNGsM9p~0=EWT58tqSG^?`GjX}M;uK{O({;u_T69at{C9FJ?G@a1*~ zI)C|IREtZNHg3r7K<)}eb2-&^2RcpHU3+(+rK(Z&9>g#24it|&uIII6)rR)=jnRKfX=Pos z`D#H@TawerFYA@~?d;L2dgAxv*=~?48!MGpxVYCW{*{ejtVtT&*S0qQn=E5m&kDen zRb=Ol`$_Xja9+o2$bei9I}9XiZ#QQFfIF) z5#J>#EG_2M`)r4_^f=|pM!9~k%hct#{2w}&wO)T;<*}^OeTObLmX*9^ha1aEP9w!1 z)-o!$?tt3e&Q9$wK6+F&KlNLobk#u6O1g~h4Rq16Kwo`TEeZR0maSng@+UVH`Pk#p zh*^J$U9Tetqzj_&O{dUwZ~oz6GV7`$Vb zQ>pKANwLB=)mESEI&kRF;lppfDXvO&jz38E3}a!cvD2^Ws-I{-?Grt${Q>Qu6AXa& zz`2Z$*&gCkGWrPgDexj#54wTmMZfG|eG~M&!eHzU_Q!%rU>dj|%m(wo3*h(l9Wypv zwMx5#)18Z{H?poST@9zRvmdNae&zS54ZU}78#*?D zF3<@2!CT-{@EQ09j6>TU;7%|VJOmyA3qT{-0)CqG^$iTD_Qg)>J+HCC2OI}q0M+*% z@EA~8%fU|)?b%zuK0P&xXLD)`Wr9<$vNix*1b1v@b`)^6otsGGt>&pVF+V>*Y|6%f zX;7@>FL$Qjq2A&#>>iNE06phjy9Nf{d~+7Hm<{HE1z;&y4cb8`n3TOQ(F%a2-U;iy zg~h(YE$qPv?@;Ga8mjvl?6w{#l#1$Y8H0~)|O&;?F`Pr!MgH#+HL=O?%q%mlN* zY%o8IH$Yp!de9B}z)A2SI0wE0--6Lx!9*|xJOF-@=(_cOvtN!iz2~`yUxM$z7|Ir5YW$Skk5q~gy(?;U{tbkq_@3T$gCB(<#IT52n|kH0swBXnT90 zYmQ5DRMOfeO8LxPDkM;EX4OulaY>8E`^u~(Pau~PSE=NEdDSY*Nz?X$LX&1C4;*l+ z_>wq~YvB&lDO$#9Z{c5INl~Fb>BF}Hvw~@T&6OVZGwoD-6sM>uPOTSd_RwXEs^7n4 z>55ewHgvt-)7PKZE0%FsGkyx|>Q}7Xx>aH67u76Zpbd*e>yo|f>rzPI-Y~FUwqeVw zip6#0S{dq@i^cVz!ga~3yN>18!?$om+-$dG%2zz_8W$~DvSzdE5pplzxOt00;!+cK zqgkG{_>FLc9euL^YD%sW(;@#VW_U6^EY*Z+uhPzH{n`+_dF-x>|?S}Tw zz5Diur=!1m+@Ek5+Xhcsr@m!AK)1f0ekGw4->ZU}KPm||X8#Q{FPbOXw5g**K37yD zONDzHa*HR7PSoCaWV1fzipDwdDbXR`sO0d`KtunD*042b-MfDv?XM`6H3{rcJD9#D zN)_t8yD+_Dk}|ma2ZIicGR);|T+EnmU$`!%I|ZvPo@EphcT}=ut-`zmj2bM%+t2ob zZQCp*%9obDOZD10xa!r8qj`O;y%+^pk7+&kl`{_ay^+6-&T~W7=Z{O`iSt)%Y+Sl# z-R4(2diSb_8u#O@Rg|`RlPIM}Ne(v0nx8CejZ|+I&a>%i$U9>J~ z-+U~;Z=;gE={z{!QF`ZT1y`}3ZRegn$I`VYE>|@a_-mxCh~{jRHac0pqSzZK3FnCE z4cZsjx+!gy%;yi%(bctmhvJ3yJ$n>ZYqfcculw5{ELz`8WIqA>Z^ zzM7Y!G4Y~B@-VTY#m~+(NNZo9b<`!DyZX~FLmd87i^KJ9*sS;s$tzns*>z`WQFd4E z>Obylrfg<6oX)%7Bxk+5(mMM3LN3i>SdI}xD#5(@!K3LN52YSY$2P1?Xj>Qd10Hsc zm{R89;@_R`5Zrz6AY+e;_FK7Ji%`PG^twhRYtuUGpQU|ev39N@n_q~z%FQ2Qk|+%n}YT)br2id9{&AE_wAa-^qat>u79Vx}1M+ETgcVSs^E_l6z%+b*)aFS-NlhLm-I{q(NsSNH1v%!2IInhVHO_FA457-0V1D}BN;9IZ*-M91HCxQFG4;dlv zzr^b4y`z$|(DP7_kiR87`7hXg10DclDeDR7Ge9HcrO?%2GW`9}>CiLK&%v(b5pNwSzB@q=ou8jF% zJZVlCPdcVCl17M*i>lQLBSggvl|p-;jS$7vU(91dOVQ%xqd@UoH&LM&1v=Fd9<7-# zN=>ryn7NjwCXC0-4dXD!=q=@AE%5|A$S~HjL>LPdF^yduE00w|?$E~SKj65+?&Ujg zxI*{Z%@qx~)N41_{d31fi+;Icl_~Chms8yPj-^N1`&ORXy>6xI&!Q{Um8sV)p8J*J z)$VmmQc&)pytOtYOEufyr2hcO%0=NWjqRw}MsbD%#Ph=)^0SI6AqD8jP zcOK!sfHUA6n0lCh74&PMHnOqtB|`1s$}I5Dqh|qV2AhET7X#2!;1lo#_!=Z=z6IO? zrh!@DNiYTre5L*U{2_WMU@W;*%jsYaP$^G?(G|A$pAVo1{QM1iZD1j21F~0*htKKa5qpNWE%8AFc&NY z4WL>d^oGPyTjvz_hGKr`4Ve>qLyqA^ z?zqCTri)Sz)^vpg^-$DTQrM;N9%g+dOF5OiSzk#UY1%$unYiayg_SWJNc>8kH4Yd|kDy=nDI)Wkpw2Lyu7*m4ffS)Gn#kNIcr}w9c{hJkIT~tmZ+!d%Gw;2I+Y!6tsrB z%(G9e<+7CrDM^MqAWBP_TgP92-GAJeDlB`ra#N?5Z4D21$al*0wb#14ogyo@a>>da z%9d4IA;JA!g_T37$5zzbykf=c=@nU0l)H*G+Z^7C%$n`oP6^g*b7jp|nA}*iEyG)w zTC*)BDr>fA(QCG}>J?J@aq@TY(D7W4CF*l)wmHt@{}4H{Ob{U}+IL%cJsZCxT8vLprBi$ghOd$G7>*j^m- z-MbdA(Av@_S9-7zng8KDwg_7?rd%HuVROo30`pB>x+rf#dOflTD_!lc zEW(x*rS93dA?7N#{s^)N$NWl*aGVl{D=ortN*vbcz!u?{?=b1PMcBNU28*ycTt{XR zHpi6vheg;iX|+YzyqG#&7U7uhuq?s~#};9y#WYxi&5=b|VOxaF7p1?qO7zBjoL1Df zQf^;*6?)r(T{un+nwpzM)0JU`M>MV9sW^E;-@jI?d6$&;2{nufe8)}sr=Cz6tNuz} z(8QILCCl{MctMLxacS3+^8VKFf~K12&WSQBOwR$kAnQT!gpr?L5zAQCYXe2eH^d8? z^QeW6^OzqjJ1aUmISIo&(OO>6VwpJXdhnJH@q#8fgKvgyTh1B0pgG1{P{j+HQ*{NZ zZG06I>65%xb$wO5wrq%JtZ0qgM`svU{3k{OoT@PedLNhto(6lsO`kAw1HIq^nEanf z14qD3pEC9Z3qT(@52pMV?4zI!90zr089{)1KpWT(z5?}s!pbT^&pO@1b-lcx_5Dl! zXW%nX%?sM-cZPaFdz-r=e?L=6n+;w9&7cR!E61l$`7ikz8hb&z`CpAnCW0A2ekA5W zp8}m=0GtB$g7yjFyC-7feRp^-Xup@=p{B5wJ$OK?=JV{tz0|u2=v0mUZx8i&7W?#x z{q~$jwh`}Tv$;p|X0{Nz66hMz70KxnYRXR4xbz=+mj94H9J#LTsTytblGKygv;Tqh zVIQ;Z5WKsVH*+1c8(`)iV?l@a9P|kEZSWnqg&N%rrhx_EIj{u`g4mPUIpSCDQE1FZ zT<6>*d4VT?3i`za>^RUf;2fAi`t#rzcn6H5_S3;kFmg|3lXwpv{MU^7|1e1|ftzLp z&p`9vD?FKEEzvY~|n2`OE*bA7@+8f9G#zTQGsI^C@tB+k$uh#qe!G z`Y%`OArH2+5{ceMMBQ7Ug8D~DFcXUu91H5*xvrZ*-vTHdX$wBdHEhxE!bXMIOZ zHCC0J`YyHiqf4R;#*?gbTD@@-i({P@zX{d$qf1UQF5PtK-g8Te7E-)4@{rCEoxi!#E5l$`ZCtTHRWFL%;S&1+?QekS1A8%tIfkLB7Yb=lJ=470 zsFOKbT6Icrx(7IT^zc=dHA{=r6i&aoO`EeFOWU@I=MkOdT!Y}3&euiG%lf6W?2plN zgzIK{y*x)qf2HRLm+1RzsyWaw|Ggt^*Cc0zr>|LXa~SKCJV%uEIi+*yHsg0uRix2 zAx@maw;SdIB72c$)AWYB9@gmV5FO4cr2H<~Uy8qF&Dbf;Gj=XxBvzqVul4)O6s5Pq zxoy^5%lDab#?aNc7G-MRXD&^$l+v~~Z*lZ5*GzP*k$+6?`z+>Ldv)JuaT)QQcG#NY zo=mIyF*+d(ub`Z7#?J51hg2TxE7LeF)~zs4wShwkE6+lU{D4}Q^Hrmk5k+6)BK2+M zXG|yd>dZ9lb9`ek{|;h#>2ut=6*n(!->F|U-)EL_zB08Q`jMLFEcrfj?lO&Qq%_x{ zn(s5`Etl-L(uLZ-&#a*qjccPY_ZOQO&x<{495={L+s>|S+js5O`slK(Yf+1;Oj?5> zzRyNd7kYz{?=$C!OA?QJm-_>YeVUAtL{+yK$K)DlDrKrfOP)gDo*qJ5Pe$z zGM{^>^)D|#hd<4){bHE+z5u=UYhZfj@f`j)*ZK`}7ofZb=H~ws*1$}K&H&GYHqZkG zz?a}VFqzst1mZO?&k(=zH87K?O}qxCe45`J(si0&H`J&3?I(N^jC>7D-{ zFm9(rY57G@EBMMy1;wj6EN|A zhMH(5@|T1cg5Hcb`YYCJf$87@pc+38eJWW@L1vGm&jPA?fM+AG8SIGvd|G?K(@^H(;bQkRnZ8E!jLr02%}iv=vT&^v(RD9)B-5!mpP@66bFz}#p_+;8%i<%OiS)O8 zIU3JIT9$s2W+JtY<%Ig6=Bt;Z-W}~oG%M*;QQDzsRx(bBdx`Yz^I1vDz)NQ(9T%mX zY*sSnX8lXXhl@4;ziG2p1ZF30S+3j{Gr#(*q*9f`QnD?T&+D>`N@o{QIxAVpD`q9F zhil4bCC#IyWmZx#f%_%P&9YiZrNxBqbP znB#O&!TPwT?BkPdDAuG@v|yKFcvd>OOL9ZCY0lCbWUtBREO~2E?~|;wRJyMx4!bVW z>h$U}mvJsjil?0Q>=VSF7uRc!^;Vz7w3PBzgVKfA_E&8d(|XEOI?KFrT(g+saj!Lt z8CHsI?Wnj@z6$5njHbf+Dw)wtze=a6Ov`(A(`lmVGgZGJJLAh~zL%orrF{s-dW-WC zEESg$W;&fGUC*|wPftOHnsl`8G}p^o!mOuL>+@MpaSWA2J=~Kio&Dv!qUBjnr@6Gs zSx={ioRzblahl2>Zq~Cb8^^iVn)TG(!vpQkol0}M?}hXWWAJatIzg>^->^|5-uxYQ z4pZmkyNzZ;mFg>{mC0vAohzOVEqKLjsCl(!L!Dlxu7AvrXG6_rt=#qqOhPTX*V>P^L)i< zq+cIxwpY7X{A2yKh^oG#^kK^@-_y3nGOmH-9d>!v;Z^YBJFUD5-h9)r3f{4J6})*d zO`nnKm9K?&*``D5rgibsA<&{VtyKPSR$uQf_6%6RG&r}Z(|G&S)$!IN*|0j^62o{Gu-@=&z0yEjN={cASeq#QQLi*$ z-Bp|-{kjvUGq?K9=);2!0R_PpmwBCSmp;sJOQ!T0zoaQ>kyvwaRaNb%qjde+u z|HjZ&2O7tw>kh1~7Ii7AsbnnYng42Q4=m%nWokY22Q_mTuRTz`a0qSy zZG5+I`bJCZI{eaWO;bmw%1rl-xpu=*mudaxosJ5#$vd~L3ecw>{7H?(V1v9mWlapd4Z`F->19&2590BJ zD%L#2`Qor@!rwa=!_VFP;Bct=64WI?=0E0mCqT_yAmwW`h2)+jsezz`}4DJOp!7T6` zcnP$FAL4cKi{GwGz6Q6ALpPWKW`ak-li+#K09wEva16WyJ^*LH1#k)6M4j&hQ^9oA z|21YVpbJ1g%By-p()VNQlKZH^F5`@w_1RhJxro&x6pQut?lhujyz z$owb6@!jZHeeTIx9JgT#+jnEk z*9l3I2|gU15_~v1M*Y%rnb^!bB;?ysacZ6Vc2wBV zpVH??$hV{U)u`rC#Mjl!x1++Yx8_R}=Z~{UH28K@NZ{Vk)zt|}iYbrtajkTw%$09P zg@bR$g4=gQVf%Je*s#}b>k~itc2r2*;M>viIw2`=<>S%Z!pEaIrqqu$;bf$OyLX>-^ZlfEp4Klv8ObuDs-eJYyGF%jPgTB3pYgtXN{L}lmzBJ5 zGLm?O_C0$PRx7o6i|>y8UOIP>(8);V$QG(F`S5#buI66ilaWHc;u-7YsGU149sFK8 z#{X%tX4bthn`JTVP&)&BZc%T=)2+n(z3DtOH0O- z>%{-1Ic5Ks=9{{7QTe|VU;Zye^^el7Bg=|X_skX;bCuivFJrzeBL1TtPv40+)nTNf z6OqgIO)0n%WCQLn>Z24DO^Y9|I!>&?jQay9g|l3zceqVPM817nC~#( zMEVbo{a-pQrosQEIr4w0u>D_}FDn0+qLt?q#1abYI}FnM(reK>7rbDWC0Se5EMBc~ z_SZMMb!j-Eu*TVeE?OoUkFymIyfDsoTvX4`Cn+heHqYsLf5Pbo=9I_T=9}vIg>#jZ z*IZGJvjgqv7cIuwin*Ou_-e=5kNp8HELaWNK_55`&SW&17~*$j^dabc@GNKnTY%(6 z8*it-5B&t32laoQQ3kjjOaU|hMqTn4^a=11_#xx$vwy8F`5cU!zz7I_gs=fBU6S0#JGKDmUE2Z9fGd61PF>X4p?r$9B`3zhD7lCXvx1xOl zxC>08j_U7TosH)7@ALhE&p{on-FPqoOa(K*JRlp*3sAL&>%l4T4)_#&1}=b0S^QRN zdMB6+rh^B-qu@#KJdlm18M+Sa0ms1mpqhqI|(+sV&(cA^+UN95P z0&~GapizlzG#B}*ZzVnf@Yl<2GX8pFDw~YrvdM@Bn~WvUnA&6<50Z^dK~gpur|=$O zlX0v*x5LYiTS}6V@|NeI40YR!m_=HQVzBkg#_xC+FlfPDf%;qv&SsuRPtuF z7jdL%`+#L)+lzUUIFOgcoy=`7)@Z7-3)@S~RaiC`QT1oFNK;{>Y;!Tc8kNmOd|kC{ zE(-gqWphznHW$%gb5Tg(o@6!`#gxbSxJGO)=E~-xaIm=)+`c0U+vcLM5!+nM3pN+U zR7$Y96lt=xI9AwN%rT{2*jgO3t;KQCU~5rGrO4Kzuxu@X4yJXEZ7t%LAsb7O@7^vN zY%B@|t>G@0Z7V@i(&2ySxc+_BY%4y&OY&vgiqgcFZAE&j+g22~e2n(Z z9d5KAq&3>NbQtYBrcu7a9_5=aT8#2TOrw0K^UY_Yd~tj|nH-~h%W0G!xEkeKHXh|$ zGNxP~qkMD9qkQvCUAm}7`QmGoFRE5iqkPMXQul0>A9I!4qx_g(Im(Yy;&A0CKTe6m z8YOy^AM+h1Js;(p7t=7xH;3!UM)~HLa{n0RJ0`6j<(n5%r)!iS^BvYGU*UL^@3feP zQNB4Eod;xAvOjJht|VZ{Be2wC<9jJeO~uC0%Zx#ZzgO?X$UY`z+q@Z-gXN z6INm__W6|3@H2SyO-^KVZ=j2oiN+Qj#RD%`a2yxaw`mKG;(AYiLV;j10zKKnD;dawiZgSWt^;OmUu_V+^k{*2Crz64f+ z9xwnTFM4V+;~VHV;1all#Vz-Mso){-2zUxS2Ude0V!@enH?|Y76l?*q;4Gy4e!_2o z55O7lIT-V|7=-{?aPEXo1~b4T;4$zVXaXyNEI6B>M?iSri}NWbqW_m*GCJ=C_kjn& z!+`IU(d%eZKmMCnYL`j=E|#PzSd5^Pfb25&L4N_B0MCFIz*4XUbc5sIWAHT?dOqc| zXnPTC0jlLG=sBQLz6F)%Q@+i$eh1#Zhi3*Zfk}Tmta<3aE4IbFL#z?2m9QKHTa4a6 zA^y@X(H@I;t)A`kH!-f@O0L(lJ*%gN{@Ty>I1+lce66Vspm(pXG5!WM!=-Cxm2*17 z)!n^gXD`0{kG<);A!)aHk`!NGaJ|k_>*(Y(HN`9~3H3n(-McT)6IsjEnbL5wnsN!6 zZ<5r|o~O8FxaS%3eX^Q(*6O~d<-`wtO>@-ORG6=TzNWdu^)-XE`kIyweND&I*HqYj zP4h*IzGjH2ujzE2PS)2H$5)Wa(bu$``kH~OzNTg4zNRH(%JtFLG-s&&Xae8XU0@2B z24p{a6gn5o2a~dQ=j!Z7qiJ7n0e6E3z$`EqJOdg)Cy@Q<2vlwHN1*QSV5tTZz+GSp zxG#%83Vi}B1TTO_upab+LqPVU)6fsW1#k(B=W43ikIv9;d=6|sx=8r@v@O}c|1`AH zel#D>vtTJ$4YqNkllY zBk{|S{V2$HZx;>rBZY$2aF==Z>Dru5&SMQyk__5Jhn~k8+j%4*P?!81)^KOa)}+@s zht(;v_k@}qJ{ro@Xi6c$qbY@zL#WS3Q = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("sentence_break_fwd.bigendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} + +#[cfg(target_endian = "little")] +lazy_static! { + pub static ref SENTENCE_BREAK_FWD: ::regex_automata::SparseDFA<&'static [u8], u32> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("sentence_break_fwd.littleendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} diff --git a/vendor/bstr/src/unicode/fsm/simple_word_fwd.bigendian.dfa b/vendor/bstr/src/unicode/fsm/simple_word_fwd.bigendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..4864885e9e37a4d2c827b15ec6772bed2da9a645 GIT binary patch literal 8665 zcmb7K3w%@68Na=cG-;EjP1`hWd31~^b3>6ir;agXn`4f#jWM?&tKvYNL+t<=LxxxA z`<1kmwzP$&KuhU^mbA1bf_2CkLqvy&iWL!&p;KhaoXZ^U``?pu?@d}5^82Ot=H7F@ z$Nzhuu=tTBOD8T~c;CY16X!p&^x+5RFP%SeNzVMmOBPOCaPNHK;-^B4APW4S%x+>b z!w*CuMwDd55^J@^#oHYT&cq~Fa!RT@&6A#yIcoHnv00xR_xbT(xa#T&U%ci^U!HjF zb(5~2{FNKNdgIq_y7`u`Px;2wZ%(^)`nSIQo!h=U<9oM%f94Nn{qRRWp8bwm^-}9>l3-7(}{$D@vn?(;k^l;8^7cW`*$gtuW9s9p z*W~8q7Zes1mz0*3dwms^Ypd2(*VL}Bt8dt_vC-eOY4eummaVPZ+S)rhw|8~#2=w&s z?CT%c6?|g%o+k&N`s3cG_x)-ApAY=y;4_DwJ^bABe?9WT(HD=s^ztjmUmbew#Oo*D zIQ8b~x6b_S?A!1B{oVJ@y?_26AAES>pCA3}<9~<#^T~e+9sHXlTsP_FTc+JQ_s;CQ z?z;Q#`70iMZ13KupWb)ynP(0idiL4Fho1x8BQLyg^yrH(9y|8ZOE16t$}7i@zxwLX z&}*-qIPv=HCr`fd#;H?pzIpoeTW8;X`yH@)@7%ff-#-s_A6~d1$Yg`a&wk;w5Q-7# zb4|>Qn8kEe=~Eul5EFFpFkQ#EiCd?M9UDb!j<4lkizS0Yv0}#=owi8 zS&&t)udW_+xqcEM*twnav8ijTs@A~)Teod%gQM{`d_ArrQDGD$74FN|i0Y02ySI?8 zu*mK`M8brp_V?W8dDr;WW;;d3(5+Mfc*W?x!6%}*4m3zHDUjU1gmKAd9 z5(=TTYTL}TEp$DY_OWN2XPV~@&;6cdsjWiDQ|PJow0eS`qjdjKy2pMdeX=VjeOmh5 z^qlln>Av)h>Agx&2&EqrLMgeKT^R!BVKqNu`~22)q3 zwx$MBpHDp@gi_Dj7C<)gB4(LEA>_)@o*GRf;lNO={`FpCuK!SF5Q*8j->R`b-%-ta+0nWQ?pWMlWg}Be@WG>CWMmTO%4ep z6UpXQH*bmduuJ+Dba5RKLXJ|`$z+!}CwT(Vnk-I9o|1ff^1S3_^v#!Cm)z@YP2Ml0 zk-so4tJbZnMy5gXHhd@2s|S@K%cj@`vH7u8@~PMsc~tXAV z^#gg9O|T`%ryxE3l~nj3-6>CL&%EpnMX#)`$wkCNM?#$bifUIki?!>ASu)bk4XJBt znY>r#>A;P7`Cwve;$gz6PYK$lE5XE*^f{OKNm4@6DBH{=^3|jnN!dv`Nvj~8!;?h* zl~k8>z}}E_Jn6g=bcysyblv8fcOy=jmlqV8;}y}$ z^x)X@$Tf5^a!Yh~Cnnsuc2}o@;1L$bQC7m^ws<$1%<^ z4NvfK-0qm?cz~(~@)+_faS`Xx>LGd?N8STek^ML}^xocJTR?wXG^*Y9y>#`c41Hj4 zU=D3K-YipcDM|LYbMaOs7(WhF;wQyVjb9mG9KW0HkH??2TkNCklkGE!*^metKC3vTbr?))zPA2wlYpdEF*uQHli}NwR3vr%8R(q&GY(n z4q7HCF7f)vYxFwn(lCPl3{_TTQByg(@c!t|Y^3j3Yh4OtGhz>3fO>;=b)@{xdBW#7 z&v5P5yN*bmM&f)W&*D_%wfY8s6S@iH+e_(XQSrW`Gtd*=C0bN8;w7c#E{I8o4lOs2 zcS@4VBAChLRM8=zOXqDmVw3kN{|{S9vkzZo*E&e_QQ!c&pfhsk#UzUj$7E44av-O} zF_l!z4g6`WRtpdvEayeys%ToF)8gwvMNyHpSbP}k(SH^dqn1XlMJI(B#{5)L`}%=& zc(>Zo8ObA7Ljawqzlp~Pm!Gbbv%-5-Zc$lnYwzmby+@}hSV$iDJ-Sunsm4)72h8pU zcCkBI%Y$aw70R}ltPsU!-n>VLjG(`1bN_&uFVl(jz_@1-X||U{_!&JmYIxHood-oa zmrb8IR6Tl$Cwr^Vy5^RyZZlov9F8iaZ{60_y(_3wCRrqHRteLm=?Fc7*N4dwTA8$@ zdn4j% zVy=tM6C8W1mRr!d)vj;!o8ysFLcAE>YEv;+qk{MoLra2)lkw%=?yh44e&MNZdOk@tX)IR+*2N@F^A zXc3uTP*RG@j=BzSzkD4MNvlRba$}eeq0F^{1}$3+twf3*{tlAp85(;j&xBV}PUowD zmswtgsKXBo6v0&_Te2OJifkUHBiJcgD%T<}z!MP(yazE`&wQ_Fy$-rvPJ_{}T+8$m zRgMp%})W3YRDoxh1;A4ZlTOz~S+ z-`t|(O)>ZQYMdcL9-JKl|A-x$uS(=?1~SMa#U*BWMUskR==DKMMnl%5#pJ+oQmC@_ z^bU(c>Ubk+9ASckO|$hx>IgWFy0@!6y^OYve4gbF_#8am;K_N@m7s&D<>1 zx3Cl3Xen$|#R>}1|8(y_teN7-Y(tWR;TEf%3Zi~Q<}SuvqRzl%Q=$#J+>*3L>q*Qx zO{UCRRu0^_M(7n0{iwy!cp}!lKEuE8&7kkr=Y*nSP*_)8yMDvQ$TL2iuwrsG_;J3M zyIM$-qGEIzygu^PETiC?NEMS|E~)0ORnmGs-5N9lw6$}O18T9Vz&PV;r{4ah5z@40j`#U^?rbkgWgFoo-q=KD=4V){Z9+~WG zq7bk3^t#bXC@XjysHx<-F=cC~8x0oG*QWQ1fIVpsuf z*l#S{YZx+&qlIceuwj$}6r#WZA(^mFJ3j-_R0Bg@!&~@bbCD4OkJ)-@AYiV3vl+)P! zQtsv6xUms@b_Dd3J)CH1%`Lot8@`9hmKc@=xf=bwS(Yoy`wlJNVcvijp+{%fo1=d?cg}a@Y4S?y zjd`AgXCpf>d$6-n!)u0fXS$>QF*`8SQ2+RE0XW;-(!8}5c?`cHUb!tm+fMe#%g4zJ z!vy{k-D5=hhE2W3Y`V3bmq!qtO8OFk_&SMCR}7o z^B$eQVD!8>_s>~0de);09(icif?1>IXU>{8f6nOH_s!Bixe%c_G);5j!+#kO^2&GO zUxec-r)$8#$f!ZlG49y7_ykX4QgTYFH!VG5@Q|UyhJS9v=SP0w>T5=Q@!BtadGvMH zkGWy&S8n|3O<%kDmRr9*?i=I3IpMa6-}?4F#!yo;4>QAQq^v<9C z{1?;jn(@n-ci%JX-e1k0bKm_B{QAM)%zfzLM>2mqZ~lTu7yfS1?-xI|!YUV7=}mtT41=+ReS zJ$CH1*Nz{5{q++k-gx8W$v59Tb?U7%Z@>KxS-p4m?ECMZBfAgJpLfCr_Rn7Jl%{K1 zgsxp1F)3mmu0DK9BkCf$BKAdm6cOprwG_uV$L)@3j+u@{4&AZyDvxuVbBc4Cb0+>C zcAj*eaZYqKxEfvEu7R4bxuvDGd)v029l_ueeRf_h%~w@jUDLCDdv9MzjtI?%r$HJl zkegRlUf-}`V{2Pmd;8|i9hOxgO5j2IM1I$kPxgha0iE2uy!`xvqT=F`lI6=w*RET) zK1>eD`zp=1t*2+Zu^&%a+1blNPaU0|TZ|_mcg@O`we<}aZg^Wz7$^&qAzJg%mFP>9 z!XId9-Q3Z&wO{i&;gs8n_K8;775fI2dM}O z*iH8}*5Lh?E^$AAy3!&$cY#C*d#5&BYiL+YjMi`1uyJE!-oaA`R}S7kIA+L{Ax%S$4$+3* zIy7@=*U;yO4j6Xhu!n~&8CE*%<6&11pD}#i@RH$Uh#0Y7mQzqzSfuP$>h}i%WkkJp z)vCI>)vMR6sjt6cSt+L}p{`Y>PLA4;s%!gG|D8I*JHdOW_W|!hZ&R|a6?m(>P2QmQ zuvgbU@_N%w$Ba$O^h`*bo|c)mG%b*}CapUy=+d<#X}Xq^G&k;Cnj_ttu4~ufGcJ8< zdP#a?dU8mEoLt(yth~IUqOw2a`Wz`qDPvP6q)bU^N~!V$UAt2bqy$|@Qck7l+6O7l z)DfvSr{0@dkQ#KslNBzKD!r*MJGm*jEBX24C?4L(9|`?l#W>U z!9Kcn$TdXsNtvo^J}aWwACr`lq-!ISZo=Pbj>-5tGbuA^aZ(QMN|O$Gx^dl`a-b<#=cPdcFyeGqp~xx_oa{6<9bvK&S{ zbR^& zp)yB?waDd;`YRyjtRPs$DNNG z1QbTbPmN!MYb`#Jns0fj%qwN(^bv3@!Cqa<2EQuY!M@Z3@3ZlQxbg=WFT$pa@Ft%2 z4{0H*6!W2(Ye?;M%sEKlaC_Y&+!F+SzP-ae!~LKeRfBnq`4wEIp}HQ!TEzOY9HPqX zr?A2IbuqJ}bgdC9bgeUHH?CgIC($SNA%;k!yM(&wkt;i@JKyo<97^ zXMy~1yg@XrUSm`)A0m)73>4O`Gh)oaY}dU_y=TW}tj7DQYPA!qSv4UM(Q9rock?Y) z78Z$>um@wA`Gd8Qm9eGOprNX+yh75PTz|miATmKwu|EK>QFYcMF{1twRas?OQx&@K zezp2?*K1^#LfJyGM=xN#VY}L2epfu{bBd=?yY0GMj`Nj#2h^C?R@F7EWjDcmdkMYJ zkMR4p_O7jAT_V0=BVJr$>4Kz`uy$5~##^jqRcCaFoM*=seo3C}v@BHc zmRU>0M`%6X(g#>e?Q7XdafY$Hg$zC0fwbD~YiqahfK)_)ooK^aBSx&gft+RR^%)k0 z-?y}Obne_`(uCy-3hDRkR?WAPqYoXhao4*;++jcSphb4*;}3AMLKNG08$G&^k@VNC z-`;ECE9oM3(H-&Lh)9dQpna*|?6L7gKQVbA(v@uH#Njie7r2OTAzfbn#>S3L3tf>h z3{-{mP0byhJAx)Sm~sa<<9|tZ=LVl;t7{5-Y=YkW@V*erSI+_|m7?^|QYaIa;mj|B9-pMrTgWfimWy zy49SQ+uDUa``>5NOy*2VZc4>n&{<7VrcLBN*pXA9xf*d*U1Qb=vD24Dt!%kiO5!v2 zfjYzMxIh{(44J$Lp_H38A?IKSI>44dh(s63#To;xn6!!2s<`()@%}QH5DoP?= zOm78M&eg17%wLz}k50=Uu%G}cV)is`$9^DWyFi)f4s1Nz+C$&dJ1qH2AWiK8W$5D6 zE?$8t>p)m#hpj3qt7|OP2=Z)dG9v_5UB5xl!O9g?>^)4XK%M78%(aZ#-W}}qOn*=~ zhOT12#d46SzJYZYIX$$>;A4qFNW{oC__}38=H(Zcu(GqR)7vjwhaBvP>Kl+76(3YZ zr4==3++=D6jg1;(NMdGa?nRz4RwAb>3dGAIFZ8NgO+PSEsjwXpQi$>tOgB(etCt^51b6Nz=nY0` zYnC{&@_-z|9?(b~58HB=(;HJ2NgD;EG&srRYr-*fb z!1OQSDJFfKvM_d7p9+geVMSHV%GGP^XM8+i<>YGeQ+zLX1%5fXg+=T#%#KQG3_mhr z2zN$b2dOMwE1uZ%nbyDz(9&vn9BDvbc>>Aa-DWjP1ba%0+mOJ_Vf6;)72EeAU0`40 z!D`3;#3qT8=ytJjY zeY4TUQx|vy@u*x;-w>8v5!K8Ow5IGPO{xk5v4Yyj-&icufLa0SMa3#}*gO@QZ~`%C zVjV5YPA<$UKqfbj{$!ggu$ya5iG-ak9VWhCRcGP^8l)ap_aQyKV`Z(Zg8kSHQWckQ zh0V{Y8*nTvDp_tp9y~Zd@r>S-N_f3L!08^@N_m*DlBF-lPTD=p%VK5ULhQm%1uR?@ z&ekiWWg_{h*4YnmM*#8BB7OD=pG$`&<)yir{zoqI?#W%^_bO; zyRfdj!uAUe)^V;7xim!g67x&fR{rV{<`1D=3QwHRsQIPTue@J{G3!)$g>{l*Zc-C2`e&>vwANtWrWwPl)r^+Y&80}OUZ?)Ov=Js z&Hmmh%N6B)^q`!*IB(F4*rQAAEzy55cav}b)8rM@8{0fd&t`Uz_K;_zmiSOO*{`Dh zNjpf?SpVcy%_!j+(WWNmG5&^l#kL?1^dZ^Ha`RNqma}eHk71VuRfGAFwxb1h1a0xH z*22z=D@j+L+)orSD) zmdX=aMWlc#PdV5{H@7fbGN = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("simple_word_fwd.bigendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} + +#[cfg(target_endian = "little")] +lazy_static! { + pub static ref SIMPLE_WORD_FWD: ::regex_automata::SparseDFA<&'static [u8], u16> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("simple_word_fwd.littleendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} diff --git a/vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.bigendian.dfa b/vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.bigendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..bcfc4e9a15d370165a346e47d19a64c7668aa2b3 GIT binary patch literal 572 zcmXRaEiTb5N=;9#&`m5Y$pMenwnHeC!1WI#3X(=epz`zIsOc;Qf zg|>i|jh&sHgA)X}Pysg&5b*NxLx6yQAP5KvV*n9Ryg*D`LJ|*v`yZ1b#efJMsH`7D wM$;Sypg1lWs5*!=h9ZdUHcYD+F1*4b2o}Po8lo15@jyu_5P&JdstiRC0G?SMU;qFB literal 0 HcmV?d00001 diff --git a/vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.littleendian.dfa b/vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.littleendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..d534a464a506577560bbfc69c245b8afcd6ee24e GIT binary patch literal 572 zcmXRaEiTb5N=;9#&`m5Y$#$a0WTjv1PBNSf`E`P1`rX&3&g}FB=G>a|1lX-3>bmr$B@x9 uhXE*#O9pBRL>fa8M0OjdRSXwiVG#riVN(rJi^F)Jq!b9i6k%0{A_xGW#~xq+ literal 0 HcmV?d00001 diff --git a/vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.rs b/vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.rs new file mode 100644 index 0000000000..648b95d87e --- /dev/null +++ b/vendor/bstr/src/unicode/fsm/whitespace_anchored_fwd.rs @@ -0,0 +1,45 @@ +// DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: +// +// ucd-generate dfa --name WHITESPACE_ANCHORED_FWD --anchored --classes --premultiply --minimize --state-size 1 src/unicode/fsm/ \s+ +// +// ucd-generate is available on crates.io. + +#[cfg(target_endian = "big")] +lazy_static! { + pub static ref WHITESPACE_ANCHORED_FWD: ::regex_automata::DenseDFA<&'static [u8], u8> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("whitespace_anchored_fwd.bigendian.dfa"), + }; + + unsafe { + ::regex_automata::DenseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} + +#[cfg(target_endian = "little")] +lazy_static! { + pub static ref WHITESPACE_ANCHORED_FWD: ::regex_automata::DenseDFA<&'static [u8], u8> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("whitespace_anchored_fwd.littleendian.dfa"), + }; + + unsafe { + ::regex_automata::DenseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} diff --git a/vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.bigendian.dfa b/vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.bigendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..bb217f17a0f04cb8547dc29414a4b936931fa275 GIT binary patch literal 598 zcmXRaEiTb5N=;9#&`m5Y$pMenwnHV4dMsq{?j8K|^fe{3lFaR?P zZ2>DAJ3BiECkSw%0&X54;N|0o0099(5D*f^03xDzfta|2Bpv|wKPCedZb0v|vH+#n z*cn)W5DIY1fD~|oRdGSpB2yg5927R13?f<>7|^6pv>|hl^&pFb*|;ScaY=#10jj1J ANB{r; literal 0 HcmV?d00001 diff --git a/vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.littleendian.dfa b/vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.littleendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..a7cb5a78a7416271dea570ea04061c98167e5693 GIT binary patch literal 598 zcmXRaEiTb5N=;9#&`m5Y$fKqJi x3@kth1-NBE3OK>4xS(p0DGp=~3L8xZId;&bP_!X)ko6#ogW0$x8F5L0!~v@f7Dxa9 literal 0 HcmV?d00001 diff --git a/vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.rs b/vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.rs new file mode 100644 index 0000000000..8e845320be --- /dev/null +++ b/vendor/bstr/src/unicode/fsm/whitespace_anchored_rev.rs @@ -0,0 +1,45 @@ +// DO NOT EDIT THIS FILE. IT WAS AUTOMATICALLY GENERATED BY: +// +// ucd-generate dfa --name WHITESPACE_ANCHORED_REV --reverse --anchored --classes --minimize --state-size 1 src/unicode/fsm/ \s+ +// +// ucd-generate is available on crates.io. + +#[cfg(target_endian = "big")] +lazy_static! { + pub static ref WHITESPACE_ANCHORED_REV: ::regex_automata::DenseDFA<&'static [u8], u8> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("whitespace_anchored_rev.bigendian.dfa"), + }; + + unsafe { + ::regex_automata::DenseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} + +#[cfg(target_endian = "little")] +lazy_static! { + pub static ref WHITESPACE_ANCHORED_REV: ::regex_automata::DenseDFA<&'static [u8], u8> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("whitespace_anchored_rev.littleendian.dfa"), + }; + + unsafe { + ::regex_automata::DenseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} diff --git a/vendor/bstr/src/unicode/fsm/word_break_fwd.bigendian.dfa b/vendor/bstr/src/unicode/fsm/word_break_fwd.bigendian.dfa new file mode 100644 index 0000000000000000000000000000000000000000..ebfcbd4e5d551cd8c48ce61269a53f16118bc745 GIT binary patch literal 218729 zcmdSC3!GL}z5l=VerAS?sAx!NM2Lz=hy)x$QX@hlL?k03@+f)8V;&+85gD0148sfz zx8dRd1I!FC+=kn5m0M&)9*-Fzkr5Fhk;e#)gXHm;+5i1rm;J0~&-2U-h@Ss%Ua!xr zXRq~L-}PPhwb%Nt?;i7=Z;!os%-8?*>yO?1weO7m);GU4_G>qP`_ZqB`S#au9{JGM z)Vu#sfyz;#lE1{gEw!sYe64jms~}9|yNhiSlescU3dKr?QiUGQ^${Yy1DZ$T|UvZTlatJ@yVXI_WIOqx8L#U-k<67*}ix7 z`&|Fe54daK-GlBK{DphJIOI!1zdY(PH7^X;+U8TZ}CzBm5+kN@C_A0{W{Pb`>JSTuP`@ziP4XUr^_HG9t7CrjteUr@Gi z(c`Ce$Ie~5f3)YvPyb}^Pxt-ong4k9 zKcD;g^S{{t%L6YQ{MDgfzxbQOzdiE1qrX4)((#v1{NdyuU-_?B|8(llr(b*hFK7Py z>>KC)`sV+<^}lcb?VZ0G*LI=hUgc{N>Dh?c`ht5^_?OE_>ltubg=YvmQ^Id(&m2XbplMV7FH$YrwmlD7bUrRn zp2Qail9z)3nPc+YbmNVkI(6>c<NCS1c;IW}_wN1aPxn3d^Pfv8?ce`PDgA@L z`qiOBzy7r=u_H$^l^Ip>nk~0*z!2r2E~N~3R+p42)$D+F6Fn(~7uu=d#^-T+s6@|e z0M9Rs0kgG#qGx{_z6HO%gx?3ofl{!|(!8n?w{`;L@7Cd9G@zb)LHnsO;J8ZMMp`$& zrGj6-&F>nOxV;q^syf_wqvX0*uZx%K4-Zoz&^Z>@&vBd9h;01ba8(K`OQK=la zxi3A(Z61ZD091p0CdX~gsKm#*gCXESK#6>8kxI0^UnQ;`3r?s+yD*jGcAHex&8 zIr)Iv%-IHL8N^NGyrUAiy}<}TZRSFgyGkYU9#M%#N$|Q#G$yU86<|HTkE%qIz93)y zpS0xukEPY?`_hv8m#f6*AFADwKR@mNq9u2xmA>CCx$|U|xMgtdmV67X{rzsqEk@B2 z-{+Rxg8Aqw#;bTszKWWrC7;h66~0z}!E;pjml@0l%wKj+2+!2$IjUv5cIPoOg%z)= z@Hg+O@Gvvn;mbfv&<1n@y#ceq;RnIvpajeZm0-OJfBOhHrNSf40dbCu2W8+HbyK@` z7k`XKR@Hb<)^R%Am_9RwmCvZKa(~)59ag@cHcp32LKQ9{&r2B3mkiZm;gWoQ6L-lg z;G7DVHU^!+85M4%TsGoYH8&ck!{w|THeI8_<)_qjpBa8pW??=5Fb9P@tI~RGxRdT(w{?=mxSxa(nluK?t0*C9Z??irKqFk-~l#()2Z7q;#^ z`KMFz67bsVuglt#7lAjC8)kJWtFAXOz1AlnM&^DRoDlx`mRH5_`YPOUlPDi&|wfoYjtB zHp5wm58ngGyDOWo^8P97dRI1IW%T&!!+R}UhUvm}QHww%Kl;3?%1J>yOyi*1D zA63Bv_nESIfH<;tcV#nzwa19(Oxb*`tuC8S+E(@PPMvN}wX9Fw_I{UDu;{F5FEQ7Z zp$m8Is#aMpj+NzN%5rh6EEiL*ep!|`RY7?dFcwfY5>|dv1r@yk?XF@xU{&I5uwoR@ z|0enUx+$Bt`|7g!e`I98k+q38dPyk+H=bjpYM&atI!LdiSGm!v1EY6`cU5o`qu5RK zItjaJtqM9e28?ta`v69zj`X^Zv-aym{7!F~9(OZw{L!m(3q~?Ved%$X5C6YCdc9Ga zR+hmVhg9&!(e#<%+-2!yd9H&B&J6;L`sbcAVSl9@|H`cT*J4l(wu5(6@FpYS|1eX& zHNuqTTQ%ur`M)Dn@W1;_S-yS!2irrtZ81Hv`&YSTT`J%8m&rFzh7dK?8OmHI-J zQePRY)F*p@vBv)^v;ztMB)#vG^uDhw0>l}vKqnJ6d?df02Csm(mHKK6Fi@%cE>r5C zyMP+gL+>Zf?M(scGSaL2@qd63k9MXWAiWQAWRI84Kb5DKO^+wY8~Jo))3rbO&jDW9 zd~$Mn*?f}GrYCvsN#1%&{G+&(*{$UF)}DYexs_4yR?_N4d-)V)ds}GA;x-D@FPq!j z^E}s-&FyD(*__YYw(7#@*jjK9904c58Kpi-9zNO%!2hGY!4PmCpbkGeMyWQPmFjX# zsZTu0Z{mFH4t^Kl7N6JKzPh%ZQrC6_T|qC<2Mh+JbM0fG5LALKfO5WeA3)Z2GnBfH zGQ6%kAkKA^)pdKosq;&}^-=9lclBe z$`&qMv}p0-^74v`${(}0alKMkQ=->A2F5OvullII*B$(xk#E#l=&nPMbD;`ivPf<-Ed4GjG0;rJ}NO$&#f@ zmo2NRTE2Y6ij^x@ty;ahx_Zr;wQJX{Tfct8hMJm#p6qf5aJv3Ky~~u#oow zc6!5wLy&=YxcSG7yYNB$#(@IBZpcE;7ZyHaX-}(gQ8UmUP{YL2JQnrmd8moM=uv)e z0sFyG@Q(3c+|s%oRk-**0Nvsz0BI~<0iI6rYsvfNV&X5RH;HVEdFL!Q@w=pzO<_^d zu&^{gEmMKPf$FskW9&>0A76o~)=$m7!^4+jq$Mn6$1vKlWpY z^jGRwVQD8*0;PkZ9Ec1l?(7MaE(P0E9(C;MhWaR)pQ0+Fr4*T#a=Df|)gN3+VDH;YCr^sVd^5}ZhQ`;qXJ9l~cDrjRk z6fhe?9r7+57SQG=RqE%wr0KcRI!!Fqx+xvI73c~2nOMmUHH6aNRd~J1O-?DES+crX z`|<4jof{GkwG9cA%U9UAAMUKKOs4v}Ys*gR^jZnaucs%`_R1^4dXtOt-TZzIP#)!! zM@1gE#)R?q7FJMh6%T`aut){#)+t4*dbHB+2J<{|igv?UKaw^;h#)Z`zhF{PQS_|+ zl9Nix7SZZ0jkw{|iW=4i)+eWQaYfb2Rn;aX=PPbv=FC~Mq};r?L9$ps2P+JRaLwi) z{V1aNn2eA0jE<=>pmw>1`RoY^vW7Op#Fj`%1#@tFItzGIHXe+nC;g%$T%Pqp? zX|Nxh0H?rN_|O5mTm~5RyL1G7!7!D(cJ218n<)S+iw}w69wj*>1T8v;)X^%K&gM7_QpZo~6tj?&hb|?6hc6Wu>Xlnwm|U z%uKXv7cFH37!4i=l-SMl0i|{G7C=sJJ^+}rX;JFtx0UML9&`q`0ZOYgE6>iu?eoL9 zj{-`na}qG~bf*7xt_GXH(_lY%6}(9fnyMUGKgf6v_uimC7z~D~U=uNJ?yB-wn-or& zVq{mU(_w%tosi|`5HtsER3e#Nwru%w{8xcz!2w3uqM59GuBH60Wt@?btR-WSjIflo z9$(~HRzupQ&4?@G3$7hs_$5!#_+p>6pBrC1KRdoyA8&l|XmngRzIgt6eBoJ-FSvGm zu@vuhd{G^#iH_R=^a0I-r)W<1B?RK#4AnT4MYz83S$BFmxebyhhJ$3W(laz7} zVExgF8LCq+&<6|!_k$-uA*ejB@kQML#deg6bxyI`qXI?Z%gzy7JVk{_&;5eZ(9H z9sy&(G*AZC1Inwz9`HP%oI9KVZ^9ROZ(FN zK|9b9kb@i8H<0n=y0gj~U#@RPi-*F#CE4-Cwxe3(%Z-%jjjw>$0Wx-I3EF`67h`;B z--*`J3-kw+So@KH(rTXsGXSltJ>!G4sP@l*v*2wcA*VM|S~pU=H@3IW)bNeB0ZQt| zfnW%D7>ol?fN7u%Yyo@0i^>~c+EXg+TY%Q!dNaP<@NRs3xuJ?uMV1?o<%a#>C^(fG zUv3!7^IX6RMMjq!Mwt8T|3k+p)n~YjEBuuW|x;1)A6cjA1SYpPmh+=Vh<+6w(sG&TF8`Nww?krlS zJkOl1-7uNI-RE8?>nfX8BAH*aQ)VIitm93e?&7U9oW(bsRJeI_LYuu zBV7BGjQ92_s4%6KNKV|fo3}>iFK(k`LDA%?)91}wx@^T-n+reO{~c^Kal>R`d3nSo zkTo2fg5*T)h8wn~OjB86QOwO!KwWPpu3Cb%B)ehDR zq!w=2v?bLdf*KSC@Xg83FD#rob(!Jpry3?FY)RE?A~~sYV@$qag=zOe(HxUPa$&Iw>AO;LXc<`BYatxDm7N=qdQ)d{7Cl#(<9iDL&k!(@S1Pdu$jrA&Wb;+5436B1OJo|0QKd+w@r>nQsjQTi^g;)cl`-uRVM zx?th59K)<3UHG?>B{?2C)r}jsnDIl$Dl)Apf$xr8 zyVE!alc($F-1!USO>M^xPgw(fYv)XU znI}DG+NWsFw9h)8%$X*h%$Y8pnKRv!nKPp&J!iTnGiTZ-J!kSenlr7x@U1mxdSNbI z=ju6=a64yONHs@W6#FW%t)>!eDoUM=SfN?moO$q#NT+4qoh zi^9Tb)8xEj&YaXvhdVo|s*;^6yQdT;*?CH`cOZL8L$(9f_d^Z=-pq!a0`DsIr999A z@P;L)a$o9U-M;)D2bKcHvM=oe2jNA_uzOSNKjh~ZvrC?=!hbaU?yvn8mu;8m6E*5; zZ!cF)8srSdoCeA6IQvYT1o`JLdjDHw>^d0S4@Lp{V%Hgf($ZnHeC;A{*XQkT@~r)M zujzUcoCfDOp$v_Gx90qAV}5tt#~46+ro_YPGi6Ur>Oh{>Zj_PVJ|$+%m{lfkGWJgRCs%(9AzKTqpTxX^~v{Iq4IoeGmY%1-_HoPvg9Xg_ycrou7%0Xm0c*!>^F&gi!l zU}yB(?Et&D-yRHxfe~P|3deQ??1YY`b&n;^ci6T44m-8qDf~at-VX;HA@A*sCIa_R z!U5;NJNS(Ov$cPCmkZy5-(D5o1>Ifb>#j#ZiKW4RAUpa4+k@_a6RUw^Rd_eFgV-4! zv=fk)XoGMMCA^2ea?e>64({>+-$MyobxO;zoTZ1YkgyeR@-D}%OwNNBY>r#4Ae}4dafRmc+O4Eo4>fcYWbSAndusH@+GOutvY*RC@FfJ;;A=Hve(RMnmY-X z^KN+iGS?A1k(ATjbXjt^379`opQ*W+R)z%9)yO*8`QtVr=jJTgJN@^&b{e>0F*PbDpdM%=O6C)e?UP8zy?j^JVhW7ytOP@b~ERk}{{t zX|+E4bUAl1t(!pdY16&j;h)1?Cb|u_uB@z5R!ul9tzIKHH>HIetq0}O_2?owtc-2b z=JIU16m^{zswY`NJ^89qKVTj&Z46q19)Pt+DSq?r11~By{|-RuEP!UgIB-m-D9`Bta&#qQ#Hqy*N^2d-)be_IxHAu{T~ktI<8OI@`l*jB&{N9dB{=b`pI|dgX&|O;VY|xEr zl3p{zYZm#LHBzau$SwTFGUm^E%!W~J{V6YQPzXOg>f(MhX>#Igy)>+zNmtVN_tv1J z{e6d0GoA*ofVc7AWc~5`_x(!EB)?-Q>zVz)a8M5RfMWpJO5jrhj}lsT31#^0-Q*$9 z@F+R1T`f21x_1jL!;IOax1ymM4N~gU2PpNeYVaI5Y*P3ZQh)25Qjb#OkG6!S56Yy)q6ca_TF$7UB=Ilx^^G6ZmCjzXd8V->1Ulk!V~C{ zR4$>6h4v1l!PP5f?c&dPB^obsGu>*8+;N-I?*fuPc_+AIsIKW8O{F!@+$d??(CCub zQS1}7T3AX$N=AZ|&di1Dkg0#$qSU`pmeO)YQL`fJs20YZHqbuzP-@x;{3*d{<8kMM zwKmQ{exFt9o6SI5Lod9(*%^?3;rC7Q{mn8!THo9YPFVkUj6036(W5{T{%@L*WAtv^ z7gPMCr;a9_=`D@lw@7Px5B)neRu;%v_WPhqri!{NRYVOIJq%`mo#2R4ldlBr0VN|j z{nz{XT>_XrrnEACQ^?g6;!GjVlxMBqIi-rB7r)}pV2D!R7>^5o;ls@;?S6w&_y#>f z`z^ws_{FcAF;@JhUZd0_&`#}bXr?~IZ_=I$e+i$~RlBuy$#i|AF{P=bzKWWf`Ya+h z#B{o3hK?}&a#Ffv!dqe$zN14LpiAar$n5a-PA1*L8E{z7GdchI3gahS9c>|PrI5Dr z_1AUJa$`Gv?Q_FZRG*{FK9{ebTO~~kkU2A@LnzvF=~`t@?+s3pR$toHowQ&1eWxig zox3~x@k~m0ZUfXpzZNFf{V45z)L1`iwqGT98XPzAKc|oey3cji&$2SisDsvre7Ssn zwyoj&*_eILdB())b4a^(1d;KCl~tNH8qa$D z>A6-L&H999cfgKCO_S1-#Gr<((nTk=dJSpYv8g_no#{z4OG@Vv!=-0q=8~J@sWVHo zPNIZ4j&{9zrOvI4wMOsAtY~DdmeT3+xH|3^=-#N`AJWGRX*otaH(mGC&B9JD(am*o zMLLtV9Z};M@f7JS$hF(=^iay}SV$4dzTaaPf0> z$;sPyI*(Mij1{6ao-JI)NYOCQ7B26zVp}IeI6XCy6g_Lgyjsplu3cv(@_a=iGlG>Z zlwO_ob{K0(Ld(wj1o(cAv5%*mWc8X2HJR$YG4JFuiio+NipphG8RU#fasGFdRsU0F zjo$xlr9K}5X2Q=iYkr;??DM_BAi(_d`Nu&4mR2$&!5>HrA4i&^BZ6Ypt# zul1e(>s=MT+Kjz4c0ylm3;G%D{?gw39&Y{7^L=$3C;;2QK5$rte`*dog1&%V(?2}{ zkXf{!|Fj9Pzjn&%Tc6?(wYZ|khimot_$5z~9-n>Ieol|i^Rs$< z*2mN1^JsKjr^n~{Ydt=mwH_a?)#I}iACq_g+8V1VEn9XP>U{J6a-LFOW=8%p_4eg1 zpf4B(Mp<{Zb+=phFz#DQ4I|z#;tgZw7kY6AK{JdtGHf&$2TDN|SPPy8%<{ut1!t7{ zN>lev+aNt*^`+ySk`Q-jW6&C04_Lhn?G5^ap@8-1P~;vu9^?bkA6gDbf9Ou|EI0tj z!_c?P`%6ks_zTqO7mk2)fR;R%T-}>PZ{{p!;zZG-mGdaVMuIV*5X=RO0J;1EJ5Kd! z5f3KLVB!oW&S2sU-UFTo4u|v-bc5iNQcc^az zg8|YG9swQ(kAf#^pBN3iQmKJ=D0R02*8sTRO?}dmaY`U^bvM?%4^R1xJ0ozd={R zow6I$4luSPlcHICH#r`Zqhi{{cO%u^NOkus!27YUe2608BL0r*jz_l6;{4!5kqrpB!8V&YY$CI9A;;l^O(rN)(I;#a3J!y>w z_hd90?331L;CH0aVErY9S{e;rn1uV#8V&eajRqU4H5&M>H5w$;Xf)VRT7+mcI9e$^ zp%sk=aYds+T+wL2jWingEzbh0(O{pnMuYeojRr?!G#c!ar_o@2B3?$L!TLrT4IY)& zXy93EG>9uBfw-d4fSab#z_a7*T&>X{^rF!qu4pufD;f>ByjxdtJdld_p*K}9oikQ( zMZZC4#g%8#s>cmExv$W_bf{=OKxMTa_@#Y?LgI?{1Fon2U@62`U^NEqQ>6XiQEBZ5 zp0)Oaj-fRMEd@2Y9PJ1Dq_rRT9ce#Ue=S2w`@!>-kVyN%^S9a$)+emqun|36d7=ao zV%kyk80@nt6@BVVs4gp6>q?oG(DTHVvvuvx({7&Ap4hO#ma@9HS(FQ*6foY;ooloy ztdCBSR0Gkf5LdJ+#I@2~z`F8Y#st~>y^wX~y(^UZVo&BK<|#tKFUbuAW4s=K@=Wy(e+nY4Ys3 zXihF(ykyC$RWc%aw3&W4Dkvx_5{;xePtKbsn$UI7=R7%Y$H>FF`5U<;!Pe&M8| zg^Qxlu%zV4C!;5=X-s*gX&Otp#}H{6d;WoF8uM&5jcth4G`3G#$3|$3rm^!CO=Iyj zn#R`GY8pEl(KP0Fq-kvZ#V-&|V_d6gY(uQ3arC4$jqOt)n#TOrn#Qzk%&9HSK3(=?4UglkP>q4PD3Gth-b)7XXta#F$XNYmJhp*4+p zPSZ5@!d=N~O=JAo&vlx{F{(f`jqz)sPKwN_vg;GuZOoucB9t*I|2c!^hmDa@Tf?P` zD|_-;wKY6CEvI{qNm5H&!_mcE;$_v=(6sa|DUWW}m2|`(_q?<<{B#`;;cIzCS`)VH zGiYl#O3#h7H5_+1$FwyZHGJ#T*6`?}TC`j*g0{vFSO@)Jx6#)40dJm9GzA^OgW!Nt zKO796Q!3dNu$oUo!yRfh;h<9atT*zR_wr9GHL*XaR;qy6w17ATn*g;jX&_)_G-(=O zRW#`^CsQ2&^o8R;2yKn;(wD!>+w*skGMl!>_pV1P;|_2yKw3FV^R+d;x0mO0Xkv5% zy}$_0*4p6GgGF0oJh}C?HNLOV#%KYcm9whvL;wA;fD-)vGvEk#-Dqn(PFs`o9)HZb zl+=Z4Yka3U8X7%}w#IkJcSE%`#?3a`8sknHZH@2tX_&Ug*nTE|W1m2~VSc){#@ORF zjC{(T)^|eve9^Tu{(U4G8O5NywwA`fQ?6sEhcWE{(j(|;6vOp4GLLqfb^MjSD;O$k=Gl zORdlUxyHpPYFK0+MJ1*1x;x z@{~FBebcyjh<^4^OF&6HbRVF;AEG@xbR3*R)1s@9N;EG1bt%}Z)WaQ(-@}Xp4_AWc z!4c#44f@D8$btBMgIs*$Aut}mS4#XF@YXJU$7x)A<0RS@l++{0AmgNjKk^_T&Lfuo zk^Sh;v;xQ|;r~{q-3!!+_&Oue*O4rnM#R^*5OxUE(uf#&%%m@4uxLb#JguKEP$Oa_ z{d*+sPjWQ!(G=$k(TEsX01rmhk()FhS$$>Hi1?T7sdWD3O*6KPr1V9G3(<)97seyv zdRh(i@+?{n-iVO4>Wlg3)YfXS6t%P(Tui&Ji=CdkP~6z*xfkL~l6HD-X`(Y&FOGKx z>-h?&jAyVh8ogSCmN$7hgSDXzIBAXX;Wp3?;>$V|ZaGOgp-nq!wxyDbMv>?rZ;`v@ zP`Vf{Wzpe|G`?*bk`FoeUApY4?P=%2{tDXi;_jI2H&{7%%R(omWLB-Seakrq4d&T% z(q;)8Q*{59EKQe@J^P7TgI;0_9WG}SMax%gsL?4{uF=Y#XQ}HAHIXK>7t^onMoF;} zH?w5bYSGNLsXA^}BF8lsjw@E$Q};MON~DR_cqlBISt4hiR)5}=w9nK3O}ON4liU&a zcs8X~6ik{tW!iKpf1|1HQ3zMZMe4#yYTZU!uXWAZr?$uR=xy2gC2)z>JrWHCv4JLf zH&Pa)72{dgb1tn;bO&?^`f1p9a)mA#_wgXngmCutJY92_pYupJ%7;z!3R<1{P?6MW z$t=++TC~`FpJ?qm+xA^Lao45m{QZ15KkJ4`-HR+mBTCR{SxM=|YRUDKC}vc)_(=b9 z_ZYN}mQXo4oNGDcB-eB4Ke|U^`I(-OoFH1Mi_2}=u{I~`Hd#GbJunwD#y^4fN1VIW zS+f%4akFdNWd4iE?;aU7Z>eXt_2-^l^%(ZrYrt59CV2 zccIVIEmrDx;Udf1&y%G#Wjm!k`#Rf(I*uBsyg!L z;#oHbON=v1YSkB^c5NZ~(oazj^aGjSyr>$`Py8{tfTeq zoIh?Z_h)97Y~2>MX)B|vQPIMWryzC=izZ9k6f2TZd3jt#`dl5;S}t^9UM=NtcWB=H zOd5lUjA}MoNij(la+>U33MN_Alo5j*{Wo-0x3F~UT zvD96CiYx6vuXH>aLRwNvg50E(n%wA0`RQES6hm&#r9w>3^z0r>HDr!X(S?ja{*xag zm->}jkIKj8&9)dBm!+r0+lA}noDLO=tx{jg%NT`b&ym^D%=oLTW$cSIYh$uTF*Esl zC6%i+eC0hgl@}e?(u7HW>G^OYH0a*~xxY)kX7?z`ylP*Osb(2pS*K6M`-4eyjV|5{` zR&S(srQuxCNE`9QU;D`yAFT|LR9YL|O2IjntgNk!c6_p7O>~QqHIUrsTDmM6sVsM0 zdlJ)sCT^J2cRnpod1KSh9+ix5W@g;DNk)cfe6upTIV|Grm6?_mI??H0zCzxbq*iQc zx%i|l?;vyL+7ZJ^>G2UA==jRM32j7X+y!N#=Wlzp$1_bX;bnVyBI&IwEPWH+9E|3$ z@Y}g7>Om6j%j4!28&6JvWCdAZ?c8K zNBM}}&js;wlJghXm4u&Ps1n@a(EZiLz?EGKNx_zml!VQvyzy34)>=yt>fIyJTxXW( zk-|$Yto7j98Krp1P%dnOM}>|2o8$Ep7|hb#F@^gExt zZMd69wO8|wHk;ct;vv0DR-oroE9MT0tinZtSUd7cTxukjH2i|tG3KIrU{tlyBHqFLiaHRH7+xj(XQy}ujj+EQb^%Oe)N!@0tjqPDsl2ihFWz=cWWEoZB zHU*-!nQ-zXbusI5^Vo0Px~N_{z?J$QP|aWAb_Lh}4dp{D}P&P3_l~<=li? zFPSxOzS;4$>#z)Tx~yF*ChnE2m1KuBzC*ofvsgnhc04G*4D!2t)a!auT%|`6mP%7) zrjxN>_HN57oYWgPnH2S0BJph7i(FSmF3dgq^4VUO)~YOh3!7UR_2l-gzaK9v3oplh z%6=;1-_U0#CGHiB6!JD8IhXlNR@RbpS=pO*n%>)@9M>g>%2zBm_&K~t zx${!IT(3Z6N7tM>$oUnQxXF`z1*MK0`6cK|$!nF8E0>da%M_a{7e6Qd`H75k>FrYH z;W~2Ta!_BcsLK!Q_XX*3t|dHKD!1R=*O{dF_>>8&39)uXny&tR-sjT>v&BQ^X0*vk zh35Rrof+9TO_!s%>$o|8TW6QhuVob~En8Y#t&yreiQ#uSJe)KP;fxJ(lh?JU_g4DN zqfss;W2_xX&RnisF6(oJ-o}&m<4Z4nJ0(3`+?{f|`po3|={Z^aUO}9u%mb;imQ_GB zBV;RMPs-+=lrv_|nJcB78hx|&*i3TSeCzh<$tXK}B4Oz~IW5|>IhsNI{QCSdNG&_G zGN#O!DR<>XMmgh=aWYy(`P^Jd#a$YyK=G-<$ z6H8lm%4I~1*0V0$@)D~~vhOK-ld=YoxkpA!U6-zOVsWC@>HIy{?98uS7g=cYOBK4t zy55T>Pn#}lGrc16V!JjRjWxuU6?&mq*Yrv%s~&~ie9&<`JqqiWRU5*F$Fw2D*XEzQ zf0BOm0&dtAVnEzOgLV+X&MtYWmm6qM&;ljZy&2@vc9bBB4 z9C5j7Jxe@^gX_=MZsw|`?cmahyDnYlZ+ZGP?aIs3c7VE;wu5kR+-wP?Vn%PuI%Z7U z!H*f^5Yu)LN?U_+3Lj}ZIDb$2n6`sYAsnoPY1$5!rj~w#iyOu9^c!qgM!f|Ia}qh1 zv@_@}xD*@}Zk>7yKE39cRd2yj;%3oH@F=8g&r>fU7TeXhxLNfQB#z6eR~J$1kudSc ztwS#%Q_3!;t*H!p2{u-mrhxU!pcP<4vT6X>@CKbkTUx(_GUeE{Z|7z`XO3ixoeH~j zqSor2`r5DyIQ5m7u5`1wvGZ0ZhjZ;WgEO4B#=j;E|61p*aLIDsO6)A>t@;j??9u2q zXt_h><>Eb^y4pO+zEw1`*%q6_OkF%RZNJZ!SBA4yS2oVoIrnyzth}O=8J(?K+N>w0 zHcpgR{}~yhGg8k#>lvv{%Z-*1Pn%cQOT|Cq8L5j;zG|J3dSSvRIwKW-DKXrPXQXNI zs8f-}`9*EsJ0rDWS`AO=dii5jrQet!;VE zaw6lnS~tNdYjo0L{W6@i#9~Q()pODk@h>nZE%I!otaZ}j!lW!?V^Zv-#Zfv}sNtG+ z(jsASN;_$>es!LaSQ_0Ht)x!k$klx98Hq=q^{hZ>>flxDtibV(Q!Fn*Tu(e&{=>-ucePa$J3Xb3XS+%T34S9I16yx<6P@|_EN0(EWo7^cl|V6 znAa*LH!dd)I16wbe6Hu&GX33!tY-l(ooue3zN7JTg-jQ879hNQ-VMoHef03G<1D~Q zA9o#B=WlbD^(;W>T%5XG=;}QSaA{_9eg2Nd%GbcN02j;WR99IGz0l$|=q$kT&*u8+ zI+|Gf$#NFpsC^DjatX6iHsCD4aq?ZCtMj)Uny;9TRs`j0vt`ut#uaQ!Y!``odv|=xDh^+TjyB-d@`H`IPT*5b!q+6&H}7o zUEie$PjRPLY`va(9F&4;V=wj;_F+$PgII_0m8~Lf#{XIA=d0M;lyB_F*^!())b*W> z@Xy@0{qwz`*zo#uxe8BTufmq^n&;C4cphedKg93xCjHYh_`L-j2Uym8ttWUy)8$lG zuUofu>&~4@UBOLcc^4BGuri*nzXNQa#ZTLO(_!<y@i5}&vV*Y&^Tqlb!5%+H zn_I|dL9sHmM7~Yr#dp8a)|A^UHiSJ4^Zg-tw%mA26>VEf!S|LHpm0)NF1OAy@Jl2o z&(g9u4kDwd%@h@tRBymOlW=vg@pFt#UE%0L#3i(m`8LoRR6&i-uj6_p_n`&u8TXRp z9M16;n{NTRF9C_gETM69mT#1f_&YxQ&P9V$PM7uGlTT~ohsk2O4PZm$J%H1`6nCiP zJw<=zXXj3_h30rWUY5^AuoCkcxqprO@vof$w8+=73GjM*a4#qY$Cdg^8^B%uzi^NL zF9(%6(;V~%vjI2M&tMbazgvPKU>d;hzd3C_i{IHkU@*8Ji~&i&%yaf>a9nkcdXnsr zyRXH_$!5u{I=<Zmcxn?MC#Oy;C4HJc zs{Y&>bTl-7?#l1pU=SeZe|{V+0#$(A9g*kfl{$`HfC>NKTx8Xl*~F@0N|?g<8h z5dez{rz^pFup7JxPMLIGYi(W9eeDkL2zWxTAiePg&6qi~+n9}JrB03o)XB-G!L#6i zQh#iLR9F}IV+YU$Aju#5nNm<-6xACcydN7=*Iwu|jp7FjSpnFB}4?<8e$ zlCr3nk4t%+ybp|2YF#_rQSZrix90is>q@=+rs4ncyGosC1xWJ*QlCI#N%sV4o*>N= zqd+-W0T}&GyrR?}6d>1sAjf~`4~BxrK`Gbc<=|aA=Df$eblnr+f8I_LJfCDC%$Byxv+BimS9-}s2qV>FVC1?w}gFc4tC2Hp-TKP+lfkNvy zgWuHFOI3il{$Jo=n2Mw z^Gf_Ie`B$=#P=} zV@sJOcw5%_LHERz#qTI9DU;uY*2SiyXj?|UVF}}^c{=j8YQ~*YMp9S5J9bFT?$LXr z!bQfpBL!eKpmiQWt|Q1LVLJQ(&*bgMS!s=?)RbB?#)PgJ&+p0VL$XGiGR2iUcU@xN zo-w7aR5hhjO?#=Py$JW}+W>W5jTF_Cc6E*Qe~#aW!CCm{0cvLrwX=rWSwrcpxu11o zveJB$WVzN=*{Rg(920vrWhmTNcLn{x69D;5OPPty;Z^WnMf+QI4)9%4xmCuDn@CP6 zS#5v2)j*KM;y+=5=pWP9Sc^}dzmSiKtf)5gyX}K+rGO2@5?Z>QzvWD&xP;oU&oa-W zYcUBG)2gbKD_6_M?Xl%!jFR=SR>Eqwc$IurB#kb=V5)pc#Q9P8*6O+~A8U2pm7cS@ z?w4LNsnq4X7bL4|c1N6Yl9Njo7(48aw~dpsQFUIcEqyymueaPd!3`+49*M2Ele)G2W_mu%S`jLZ%&?H#xKWu;VzB1n`VnN1HGI%X0=6{fj-V(o@?16 zts`D8cMHw!)bu<%zD@KOVr7jceZb!2se_-37jlynjd+9t9QNyG;6A`O`XY1l ziz@)Mzv%#&Ie)WXsl#0WG>6v$!hXxF`rC&`0NMk4!2$55@sszX7g`&>&r*^*hV$PxLWG8(waQGiq(7=SZ$4AL4F)SO3=UoY)sgjcaafvRWv1)cQcIhVFe`sh`qg zM82Q&H?scJw!oiK_9FXF9|Yq-38(_(_NNC;oS(j>)ILgRAGN-(Un;NCLiPj0eivG6hG;SKO?PYOm9%nwB@&vGqoZ!JITh< zkJ|?`yNI$+U~U$qcEqIq%saZ>31elJT9X+qeS61RN@vdqkOWA$hZeZ!h$(>|Bhin0 z8cBbAKfjlP-AX-8skoYddc2{1y3+VPP5h^A{HM>Eacw)L^b<-#;<%dl32pKxBds4L z^pipW4;e!>9ejTBic)*?%=2Exti81Uy{qgqX+W3ZJFPlLeGQfV-NQ(@hZau^(Kpg| zbX*vIvG26%5F>8`t&&O%k^DzCM?ZSPj3hr=i+eaFi{wnxk~5l`+S7u!^yCCrH}sp` z@1&@I)RfrQ>*ou!O1g8dQajfhjyn&fIPZKFe^S~t42%NXj9j};@cT`qAV0hNfCoXo ziMM+xzoFaBNI^cbS|#1i_~i1r{aM3z`w8Q>oiukmLfVuSG@>PKTDI)zl6#4_y*C&H zM%(Adwd?7zF^Z&pr!~V`$lAQKA)ZB3e6myf`(U!*aZH`z-1HaH3 zi{-DdeF^IGe_y`PdXZ$SPxkW-&+>)V21*;VG3&(=9WCz*tzL*<6Y?$;eWBITL| z{j@K%W}wUEjVbyM zEQJ{z^$u|?4m)31PNEd-8?U&s(u}MGTY7s}E_%{;<)SBlbhUToY*^a8IP2%jnS-4t zd&4vqn(;1NjK*nUvlg5szGy5Md%%%3;4G9b#XM~VII;npg*vPK z-z@ZwyYHHIsc+84VqLDsn9Le$`VMN0-skGqcP4+)-Er0gWMw9IWEU-#oA;5e-}k^> zQWrgBY0a`nlU{SaZ0rg%&WY7ezm3HumK`x|>%@~u-g?BENNwJ-wv*AhZk{35F;j7C z-Cy%k5_#=f#`=1edGSfGR~7GjVbb@J`z?}3()0SE{6FM-Qf6Yecbxu@CGZ9x3SdX|wh&&ZB$ zJ+WjIi>&8b+KiTS>)|80@GR%XsO|kt>zj51F7mUsqr8~jtvJtD%1ETvwsJjxvx3dk zqa&M<9(Bx0t{39!K-@Gdxfy6YE4i`I$V#r~Z>{87AI~nXMnfu(YquHVdiNEy6#nkJXWy1E*;(+*!Sv_IzHN+m?7n3z)V0eD z_boF}M)xhfu-JXew2(CWwq8h`w<-URq4@tw<Szm`yIzt+-u_G@*R|K4KnI$27wOlam2XMZ-;3Z0CZ+(gpa zi?n=%M#ehZ8$Dks2Q(6}C!1zXHbxOoL$o_YE^99~3w4(Jk6EZC4fDn(mX|kfiqC3s z8S1eMTSqGK79{VES|8GjlgE3KXBE~9@ndJbOPPh<dnt&Fx_8<0{~Tdxg> z>!i$L>$QO#%-ATetMZmw_dJkh>oo&^?^bUtRQjdfDe?S0Td$t4dE>XXUOjrDl6A-Q8Di;G+j)(Jy4q~4=d(2Hu30Eu4DTK>l(BonS>k56 zN1TCDT6XOjL@bv@7F;vLlDwu_aJ4j22YMgCE3q)CZxvgL3^$51@Q>Xn&Ol*GJIzXK z7OEU=Q`KL8x>8NEqnaVM?Ec9)pty$#9Lpc=a`Mu zEL<97BQ;B0m*;G5$hs}nvva6(Yxgw9ua?czTH(feq@H18VUl*{JvDbfIVC|hIqUMj zGTKw~Et85oX;w)yNR_Eh>PkuI&-3>2MM_nqx-6?D(o8${_2t8byIYmn?i$w~N6)v^ zF0Ey2)U*|Cb^8L!$4Q)dhc>d-e*v6b&iq~4)IDO?!nJjq_rP6Jk(HZzrq)EypuQE+hV|*o^og77vda7`>kOH@O-VP5gR3*&HM>f_T~lW>^ul=h zH*Q5rV1|8{<>!wr?yv<89vmD3L~qZ z87QQErQPtgG(mE^)_-T;wsN)6gcp7Kl65s(%o7^$qF;h`i|EAjl#`rTvS8U$?rwp* zVM%C^L*dE?cyy7DpW$PC3b0bNF7Ve~(0X0IVi*$7=e_#TBb!w;xRJDX^`4TFY1ocCra&94-u(-Jzn%Q>T}d%$p})5M8lW zYFxq{TuRQh{`R!R`s)45k_F{9p7`22v06zH9cO6VL8g9%kN8?zc^BU*XJ(dC!V}4) z*yc{r8oz=9KR)Sje`C#4QA~ZONPHKsaW$@Kuxgp2k#{{(lD+@c?sl?BjGxqG^o`Ca zMkJS&FNa*%FLSz_SeKqr$oDuGBe&36dU3f~B46KhxpW~WS0xL?>bUq>Ie5dGy>hkJ z0-?hy>EtQ$Ma`Xj9>B>haXenG=0t~|v&@nOm11PPb}QF$Y+QK@!=N``%A4={zvRZj zN)^giFr&0`lT)X!Sd~Ez%QH+)FG-a_kTj(qB+ZBt*j~y>i>(Whhck@I$|wcSZr9l| zA&eUU@|8*xDrq2Hm|X0|M$>2V%vs#zvl58Qxm;y*>&%vHn4B{|b>k{buJn3bkX)wY z2T7CDF!^NV%7`Op;Ple19H#7!m%f*##IfasZ;&)CozmN~HR2>RwjV>o3AfmPw>-qc z9>&_GQ$IOx!Pf0NU0SX_#P!m1^%PX@*8V|~5s2_avPiz*n4%?KkTfz#`sn3aEsB~zBszlFEQZ}($-20H_~XFESxjXd~vaQ+xA+w=Hk+8Nl^okuPIu2 z#0`?>PJbX@Pt?zh>*C7UJT7NT-rch>SyYp%Q~FNjhRxnc)_jOcOrMF32IBHt;u{`O zJt9@OBr0iW!U<(7tVGO`=6rXLId!o)$jvV*o;iD7*`gh(lpSZ&I+uAZ3%#AGDY_tu z#}m1!!bmnZ4v3B5OV-5`n82-1n{YkIVdG>kHQe~`O|dOu&nq^~&|TiWt0do+A&P|C&j zMn}brUNpzH;FO>JvY_LHiv|T+ZVQ$#ccZ&-cd6lq@&&;tKcc6oza3bzV3#Rr$6LEL zUQSI77d-i_m62Iev&fw=p^|+wx-L9DDRe#aoHwCx%8Xg1l`B@oZ!JbG0r|KQ>9vF$ z`JNvJ+`V~RI3r8Wq)F8qHg4Tz`ms(=R%lZ0V%Ji}I-wLlfToLlXU;uM@-2jLd#W-u zR_Z&r&;=!XG<}eqr`>SFhW!L*%ve4RI5brp%b(jqnmDus247q*TxG;+*92l`Gfjb{LZftqM~b&Yu|EOw={JZ9C=X{5@ChEzc+^ zo$sd|(Gfq`utCSWq06nG8UDZnUmL%7?@xca@427<{Q2j9@r(WYfBDM;FC0Aht6v>D z^y^>0_~LJVbNKLYe|zM}?|ygm=?rItXq zq$8lEErDjq7^RkWCyi4|{TFk?vNx5gVrHpg#a^`+Kc1IAtn$z`z_!l%^~So6*bfrP zq|DuKp08zo^XzkA7YDsnvC@%lQ$S{rsw%OZ5Z#uIzMr7fpU{B+(|BxXJPpvI{}a-P z^^QLw$&f<;jrt)-E0#P?k()2&0m8r3PN}Z_aeG*|FTclurGV1<5~cX1gTy1}^;rJk z+|jdQ6xoD82GY!C`(w!cgpD*>|JeU{54J2`?XIrYx-dpBPj*B^|JQw)k^w{RuSYjs z57NOi9cD)TM;|=^Ep9r6jsSCw^TiQSH)}x}F55!8y)LLgU}9 zIlpOBnr5HOwcPKbA4;v;n&(DB$?CNmH|hO(*LPg2z-4BbF=JMlTk*M=xK^W2d}v8| zGDgxO7$s#5>9;Q#3FR5eMyZj_tkt9q#>Y0{Nblj)YRZ)O2xr6MquiybQEe$!2E@V# z;~L-d$TqSGAD3I-wf@{~pSxgnbtJdQZf+3U_i#%Wtl497pPW*Ozle9@Ot4Uvw?|>Q$!Rk%>mXlcjQn(YNnBFPmG3ZCu3gU?v+6YkbDvJ+#!qUh#*$I-cP=WV`nja#*fKL`rhJ%MW=@3^?3*y@dBN<3L! zsaLF)+Q>AeWI+wBL+V#RSoEz!p|g1u4UMTK3)YZB=WD5B_I6#UbA<{XtYKE9N=Nhz zQ}5jLUB1S*po}`Q)Xt@SmtYnxRhn>WTrxZTi-oE3w6Z#xor`XgwGd)*_vC#4y-%oE zgHE1a;;eS0+KT2NTs@$pzAgS%(kQ>6a9YWn(uI|n`q;)i;L*o_H;#WL&``Vb%HSsC z`+$|Um)r2La?7@qocb+?kTiS088|iKq|$!-kM)>sbt0=zYwJMtVp4lUo3~};JHEbK%U(~v`xq`p-em##+_$svBkd+!!%g4U0#p!F7T2%J;FM?-*Jj*kup&#ItJ zf3Q~tAL|I_18CYl2%b~HwL?KAIH`hmy}?oyT-Ov3=Q`G<*S)TS>-&O{pa9f>11h+o zEr9-pF&}`1nxJK&3R;!{r2KG8y>AhGco4s51El#dcIU)KRjVFg02pa#T8-g1aa&b_ zo#3bF#IO*7Ed_+112HKPC}c+DPg z5WJ#-k3jR0PA0vN(0;L&7kq@0`bZUcn;L0*UKVPC7L8TVqBB7D7RcU$d|yRrU;2uX zIuMcg(q6=m4p+kn> zhh8_f2gC-!b7##C#>KEuBeFKX7mP6JG#|@v^4R=oKnrgEs`Yi7QXL^=t-hM))*VqLlx=3 z+ObH+O?!fCeLe`wG(ppCDrib;liInYv1yH$(95NTUvj;5d-8iAcnFLKw3tgM1s#W0 za|vTwGw7R9deUOWzgZV>hl$^87{3<*(rUI3oV5P$8uwCK*`=dFJ}3b-fL?wnCGPmq z1A|LR=Q4J|M7GP?fj;{8`)`>h$fc#_wgQwy?)`xNo=bntJppKmdEJdvc_a8;1;}M1 z#wC%o(Oj?;><34UUt`9Z#^gZ!8utMYgU3O!4QI}jxQ!`=#_S8~-;_WTN~#GmFm`Ic zCL?)9mL`_I$pLEf8gRb}Z@Ngk87$LC9pxABP}bjO~<-0%QQjI zT?N4)%^?WJrqT~4;}7@XEfs{#z);h+!+d_1g1z7bsfWO{{UFhY-$Q}PkF5AAoPF07 z=4-@SyZIlcZ|VI0<3W?}f0)@o{ev`BQ((%;XrIZ>vuBy+UFzgr>hB+>&#Hg4)N3_amAH&RSuE4ou_NDo1*{88# zk$oCZhI;MOc(kq^H`I;n(|A1UuutPrH6(>v_G#*fAK9nzXv~cs&pwS87EeFTK1~L? zH2X9e!#(>n8N)sMH1TkHYGj|rt7XqVjpr+pn-MH#pC(4*MikE?O)T9E7HMJ>j)!xt zMH)-xS)_6C?3h!_B8>~TGRhu-zJDtI)=%;z`|y!n8W+d%^n0i;H#&NT$JFaQpbC2_*B(r|cUHJGs{omb0^VWXP-Q$_%d+v^cSP@65LnoV%4zF(& z$E6c@UAoTS&xiA~uBYXSPpxml3zg&MdRP=wpMP84(l5;^z4T6ID?et8gZEANm}F_+ zgtzJF^zCnX)AOw9_!Ql!S1V!kO?Z#HU2|EAS{8O3r-+07LVOyB=-msO^g1`g%PO4rx|>nv;9&XRZ2p zd_1c@&NrgAR(+g5Zmza}g>JE&F?;?lk7;_Aq$o5o+dh6QOChqQ+4gZXUM+dHeO#z@ zBilZnzqRdSeXNBJ`{Y^r@nVP!SuOp<=+biT+q9Ui~5Oxuer1jSN{ zSqO5a6>~FK2yzr2zsN$6^MfWQS-E8AuE;`3T1c9OAQyuESq?kP6_q-UXroC=HndLL zL5@Q<*Ge4O4)W+c+d-bMw0mni$ofjz>XIkK$z;k#>z%tV8@f2!ly}GOWl1{#&VBJ*MEkuwV_~n zMjGoLm5hn95~~oc_3dKm+nyl`4IJFO7o{M6mY;T^lYJ~S+4&|SxpAfC;zKL%Es-@N ziR*<)8uH$+d%yVGaJl&*`)O%*j{JCT?r?tgIUzdlR=3}!)5K}M`&N*g9L`0Kw7l}1 z#UheRF@q~o%h`e0mq5dgLv>rfj@D1j`(2N9B%wr}v~th#99c*5;xrO1d*42im$EA( zm-nnTk{mym6Y0~Q4Du~^^zs)+YhR&rG5h^m@%Mv>tUlns^*va*;tsgvjQR&8hfBHjgZ?3$S_Q%IzY$8EhV9;O^Nx zBGlSEvUHKXA1_{H^T_kd(>9ORZ`inLv*>+#A-V?ab1nNvKAqH-_nc<`$n$qKl*Rs0 zoHEOEM*BxuXd|hp+o(J|Y18Z<+4`@;{!x59vN8OY>hdVA+&dDh5i-KbJQ*7&B(`vL zT*yO4TS)cgjqt3tkQxxz^^+{NkQ&Ir?3{YGkm`t+W(z3;oo5Tlh1xQb{;JE-`Qv)F zkUU?>m1hfykjNI2MY%my-4OtRvwQvySBAI@h+%4Azli6q1_klUt2#V{QsW;H3Ar|tfaaEkoU@Lpug%u1HQc9N6Xb7QuXEI-FLB}c&|J&s9Cn;Xe(nnfiS z)-5HMiyzYtca+YRRN*Q!a5P#<7@TCas_h`VGQ>}0o@R8#MaR&|EEJZL#1x&inI*EP z8*591NotqS>cw8us@2kh%$g&z-PGKquH|Uxjm#h0i_T%%nqJP9u;n`|!pWc?G_e{ytQI<;&-#pLte3`r?X z_dP?(O{jIN`_5~*T~}qG(>e26)|HHDvM(C9{^M*(S&Io7vJ zYhCQgmdujVE@M51TVJB-?b3+5K2I0swMvQSauRQu&i2s7&53_%lCn|da$~hvout{^ z`f}B+yZW$xZ$D34Rg#|18$R#(8J>06tCAEYmALDqaQ?Q=E|Gft|mQ!GB*R>lXpg?L(T-UDbb8rK9m%Q+_ zTSzXB=jvNVJg418^1>aj47ZRZn>6}j(gU*DV{2)A8wym z?|h1MLUZY9Q|Hcg{$p34oou)l;V#k_9#_E^7}vgV2;KN2xaU-GZwr9#{=GX@@Woz$@FA^1F+ijI zOG5x-+R*-hF>>gOD)@3&Fc-X|f?>oNwg?ju0sVMp^(1!#20RF;70K%W zYIZ;kI0`6_yLy2!ny${fNd1QyUj0kVU8Mf-5PtocGq(5EVHfi*lIDFU`MdKrlg^!k z`Ar_~Tm(q_&VAOO^1YMRcjxOW=+_=}2ej6H)4*DQjQt4zTr1ECj0B}%KeFSe^MJp& z$scRi-AOVsD0sIxpF2r?PO0Fty}<}D+Hn5t{{>)c*}(Kr8V{)0Ju-k zmwwZCcRhEKf?KGwF4XBK3cxl%9dN%W_yjj+#O>P8x}*60t_r$w6DD>iDd@~tSL;qv zaLbkEu7SO45!}M;uJ3lF-AQsI9j<3pl2Pgdxs&v1%IeekrtCg#Zm(R&V@!cLse-oZb)fo3idrS@+&%=%x01)1rDGG|#pPp60KbCBEO;QY4VfpPEyd#_ASY0w>J&n?#+!1-AS{1IWn1Y z%5*0w=tg~Yqb$4GKHIHY$Mxb;ZX(VlN^kB{cal7sMvQS2 z^1VArURXT+v^z-|=+f>aWeoT3BxMZu?j*&->8a73B(Ju;J4v3eNS^UdQjErp1Kypa zSh^YRB*iEk59iuDNtVjHll1=)_x5pGRoA`vIcEk$B*q%cHTl@o5Tn*htTonatTD#7 zTI=;vL#?&e7;C6eG=>;sh_MgDFu=gPFu?E*BQFCC12e$zPOYU}W2iA`Ew#iLgTz{D zthM?0$;Y49{J!74*E-KS`#I;C2PDZK>$A?;d+oK?emO6D?X}j{a`Mip@JZ7Abe@V& z64NEE!Y4_~2v7SIi#4cFWPFmel;IrsB(XlB%J?Knn)oE8cg`m%y>ng}>7DaQlDpI= zN%;e3e3GP{slEXBflrbt>E@@D$n{B5Zc@8)&G;mR{LqtyK1t+bdD?5txYQ@f@GS62 zQVM<>l?%sEB^6xZlVtO?oZv#ABwHr<7FRyuh=~uI4X4>>IjuwHS4}=iTIML~O-EAd zw7YACK1o_nh_zl#x9!k0!Qv4i6cs*6q*8ABgry~&t!i2_@JX^I0}jR~NlI($Gd@XD zkE>s<1D_;I!EqG{Q=cTmUH-X*qQWOhIi(!LCn>`rwJ<}f@kt_$_6@H2J<0eaDUT3C z;vAnOmBdhce=p;c#5|qHmfms9_$1{~qD00gNohsO67eQq2$ zkry%Yy-l#;V|G+UpQL~;eUs&+8=s^gSA3ErwZbPUpf)~9K~CzEWYP!qNg}PC zwVY#i_8MMpR19s#CrRkUCrR!yK1r67a1rZg$uT}jmKG9;Pm-jHPf~j4_VMK|;XHr>Wm{=zAd}x@D8(Uc2pGtdh#C})DaCd(9EW|&bGk0#Mk4h-D z3x$?cob6xnTv0hNK3*e1>nNN?w8;7}DTffJ98sgU0A9tjFQf+?cHRsb-zLrkskN$a zlS)>EWk#jGO@_|+Hknk)Bfd?N$}viPnhAT!|=4~tO=I*HT zZ8BwyZxd3*w~6^q;?yq&DY?E)%BcuDF3!qUc&5HhA`@jV^lj4i=(}Fa*in|6GrmpQ zTUs788Q&(A*6>Mvo3sw#T;C?cQ@`tJ|BIZdZD!hdJx|xQkwqK*_ek@-zHP0!neuP9QI$KZm& zsci3v60Od8CftSu3Vj~gX8ma%2q%$q` zf08oC;QwT5sdbzOqs#Gs%BjWpKOtBApVGFmxA9&#AAlNR_tnH)E_|0hdfMpH*N*Z+xSEUkTpB;EKwAtmsC(z1$W zZszzu1r&THsFTn5KdCepi$sC{6DgRZTm@(RpF|dpmeaJ7K1~z#YT#w@_1r7 zot=ucS2R!Wt$gO`NM#fHqx5*ntA&!-TC3e_dElBno(z3O%k%1COIgOWUdOWrk0-6I z*48MUsc}$`C#@sI%F9TezKtbKTT+9^lXACQ^ZF~yH!ZPyGKC&bT2B$S{FTN$YaG*K z@_14?YiW~}p&C7SR`GaJ=|imCHC2mNO z9#1Nbax22xbCO@-@f4J+@OaXE;gjp}q%;Ap@OaXE;Z@b+DQsWRj&znPPvDHlla^PE z{2Y%bQ(9+-{pMsmo`iOg^LVsA)vM^eVCU(Ayc|y!mI$creRWS3Cv}z5IbJJLU#_Q# zN)JrUQKhFzR^x6pO?i@3_?Q^}j$ZH4g52|N*fP@SEKscJz(?g{qV*9g4?cr>PyS4o z=Q78~L@5nUeN31pB?BK5rABU59}`2D${}2jgOADA&yV7-kMlkzUvI)S{6xM!0C+u$ zAG#HAFp9r17O*>tABH{Z!=QN>7RcYc4e(kNPlWC4MA)ZJd@hQ=brE1O0A(Jz3{V2V zR`n6so_>2I0QTJ9hK2ICHvvHZX#KCk$7BL*qbER`36Q+V$7I5G_>f!-xE=ueW?IZz zACn1?_G|S3@c9~OzV-mDZyy2fgoXIkzO*lLrs@`o8`VkH<6~yN}6NM@R8jZ}L7SUxjS7`j~vR$NQLkb-(v9`Rbds`ItQL zyl>xEM?}#q^qciDndL3;qgn9(yAHPEvlcqq-$MKv#vh@lDfieGE%uQPvZw7rzrBVL z7wKKbI3-^D>c%DXF}WXodO!N~e)Q=zdwm~XgYlw|$^GbC`j~v>WWXrEH~{9sSGoZ^ z0dGa|1499@vwr|%YJE%|SmSt|S}IFGpYSbP>HEm|1wQtj_~p^!{=O^VBSN?XaKD!% z^dq?sqjKMFpLgFOT)zz|PXXZBy8r6vWLU)e{^5>h=RDg#u$2E|LlobMu?qc2{_1J( zKXTXkg7L)O^=cG<>AXrmk}u-jR_RCb#arR?wbhR%aQwvw-8FT3=4=~%n*oazxTO5r z{Yb{cW5)TD;K?0-v-cwzj}blIek9}D@x&*9k*EjnNIv~VekAwdsZc+X`$oI#Ux6RV zUt=cyHRkhQ-wwdLJRTP|`0y1VEWDqs*5d zm$V~Md{4bkyXP!iUl0F~Q-E*x`S(2P@n`Vf`OF=X)`9%T0f*gt((%3*W#~t8@5P?x zUc3+QMcwxv@%Q7;b@&+lJjUUf8uub)zm{Gs#*-}#qZ050Am;u!rr zz62S*^tNx&xHCK^=VS5n7)NQY2Kb&X^z-=AUFCYdwA{a2zO>t?9gCmGmu_}tjjslt z@&aEC^G3-0y#?txz8XSN;j5t~<-acQ3D8{Nz$d`uSV=NI0YZ~nmYXuhvfQMSQ?6xs zK%;-XHQ0{_B@6Asg)Tj-!u*>ST6asCz`C2M@&}t*WNR95#v)rdq<`1A4=l1xN!!o4 z7TL;8|DR<{GZxt)KhRXQ$hJJ~HAX76$TmC+EV7k?|K`di_|x}e&#&>i-fi0h|9dkU zT0V2agUy##*JMqtvS^RhinTq!R&!TqO|A8WSnJbt+YU_=Y-~A^QejO^D&;0Upgkr3 z4#L}8{5DOUI!$)CY{`H_U`;KOkZ;DCTGNg6fi<Q! z?V_2d5-CRAId;)ngHi!kwTrg&j$@%+v{C{W*gYExJ^@E*_Z*bg5hpIRduADJsTqrO z_Arm>z*X#?^J>zW4Xkje*HCeg}t?i+_7Tb5MpXXDjO`9&U z^|gJ(sca?^zDY07aEWwp@{Yl(l(pH~Wqfp;h=UmOdF^#njA@x?yJ`8SG3K>Sa0_D0 zXL2$z<~8RJ2T&%p!^EBIGs%5lc9_z(Alf@Qhpk3h#v+pWF3ng(N|{1CM=6s^Z|~8g zsb!-{FSKlwx^#A=Jj3w>U9M%LmPZ>ZEE`Q8=R<1Q$aLwOT+2pVF8Fe&oEghTp)a&- zH1)ap8SpHyY*Z<7aG_GbK4(dK=D zU6gVaT!-^7T)b!HfcE6rI|ZfK(n0K zPRs+RjJ=bjRkc(S8aImC8zFXlB}$v2FSOVpO~^yE%9 zpOZu9-YVM9sI|xnBF8?5+#r|AS2H$J9F={J)@L#Mi85%K-rN3@d6AJ-=#SDqC$E;H z=>aVdT$6o{q0h8Z(`{=h2V2TK(|R4x8tik5xQ4Za_ol`{?Q^t_5L=#_XJ#c^r7fw! zK1VrNuC&*4LybEpSctIm*8X+j^BIm_G&fIZACg zsN~EODQmFLQBD?Hu9_|!-FwQ&Sk*qqmR0F;aE7;PEf|Z>DgPFZg5rm9MI+1=a|wuJM1?nW1l0m;^`P+A0{~qeKr8EtD(&N zQxWXF8(1c}&x|3;ryjPJ|XRKnBKB>gBwe-Y9#uf>@Z1ZYhd6S;tgfFowLTYMD zV<;Hac*|D)+e)1OfPnK{_U;OktQ|Mj zZY9%kr?-;nc*I-DbS$pTN@mvGzJ0U0etlLlZLn2fzg-2}l+a41eT46C=C^+Ya1&s> zr*ChHT%67J$B~9Hoi#FRB{S2v!SW@ZI#w{A-f3w2v@w-dGL5hbsI-!4ge>SK zXV1XiYVOzSNe;qw80B;(@|ZM79omRiZQ z?x}7i)B2*9iP2VD-*(r(0xKDgUh{bX%&g|S0PTR4e$F>z?#z%FowSmff!>*cH}Z^? z<&mE`)YHx!?bBvrUd_atoP1|umhjz0E18)CKL4|eJ+@XdGx5%yc?f{FKCB7d$h3^| zRx&MO&(v~v6u0yO4*UGpkq#fDmCW=P{nK1zB{Ln8G~)>$+)8G8kCWpVtz@R5p6R|N z@$}1l%h+?rVkI+u40vG#r+Yi3LMxeR-mb@u(6p!gNKHHB>pm7MnQ4B+jFk+Y`vNN& z^G2|LCib6)={Z(1QnKEivu-2psqQhbk1;g`_Aw^M%8;>-5t`IK#+0cq^{$t5s7xw3 z<=V#tG}_V{>|=tGh4wK*=ljgXK?q9LxpQL6|B;k6W9y>y=I^z>l>Sj_uHanzmVidb zq|W{Sn}2%Lz+P&a+SZQ1Hn1SgN~OJ{n0r6dru(!0yalM?rFG`~@eXyiwYjz`XuEQ+ zFJ)r>F-LmfgK~Nh4(q}pleE9($yWX(BzNAf)_n|^D|tQPtZbFSlZATMbN4r=g-2Nn zcP0Gks7sd_Zf0~j1BSXY$x>UBunwW-X&>(VMU&63{Ji-~mKxrY8`zeZGVVzeo=M4a ztgtH4QYp2a(~RarnNhbHNscHZmrZF}u#i^Nm6GY0b45A5nU>4>GzGRGDwALzbCTz| zZQbVWp9f#xhVq_>_)i?AWnHVfyH|6L8Hs|iQt63@;c4cy?3g`&0nZ&Vr2;8+HZvwz z_@rg*JfvKXokyC(8I?ElKj5B}rl~V#aZEnl`O-hWOu6;y1osQY_<}Y5tKIKSrWo+k=QVxc5;&4d|RBMoO5IswUbq45Z<=|@P z-m{c{Up5xPV@PS!=FJ1eElbc}AXSduBE%9{31q*lXa&fq{L_l3&rJ&R~m^Ns%-KS+q_#D_4QTCzu zCamjai_=)J_B|uA3~H00QmDOw+*jBnFkNYY2Z?PYTy*wjF!PLNux7gj;TiS=?=x|X zgpPk%J?m`zFfCctRsp4t$yUKh(X-AyKV}?iuvHLwRk|WvV5?wDbIi?sj;(^^GFn_q zD^IYl_7xxIo}0|6)rNccmEgUxOaNtInGlvupQYv*{)}`Rzt(X#&lBxH!e~wf76?H- zNh!5Ia8J#gxjfHWG@NFnY|jm1dmuG4E2n4=>tC* zY5R_&m;+{Bsl-Kl>F-}+yB;a;pX+Q-qf;JDzZm)1FN}S6lqdNf?HJcUUuDm{hSF|) zrClew_q;vBx3;l88PBmj`*z;^g^QMT`JS$ggU&K5jsF9;rwZ$dy~n^4Jz;m6=U_tk z6MA(%*totmKNrD#@Ol!JxVn@dNc)WE@bVO1FG>3DuVr4E`m648*EkPq+~ppOn~{p+ zS+UC+gCD&3;tzlL(n~-3(aSIY_{WD1z4FSDBmeoI zZ@&58|LycU@!v0u;=f-G=mBg3>;ym$`uETY|NWa$yk|H78u2~Y7ua(x0DCZd?u_Dp zz>eEL^aHS~_Ya4ocrWtyLesss1KQ5U%&D+qYsk52=VvhD+G8&M1@dy@U$8{b3%rjP zV+RK~CxV5P80z#K_Ow)2hSI1Mz+5F1#<4JT_I(q|!_j&RfI`_XRW%KIP9$`$2 zvR`{&e|m1JsW&apK43cVQN^?{yqw&5_v9_3loQiJYSr3_(|vg5=0;*wH+6*aHq%nz zds2GtuzJe}JN1S((_S-H$6@DwJ9eVBW5#pme)~Sa3xJJ&q zJW-(k`zwDHJNH{2j^Zsd0eC)(cJ8-ezolAyi>=u6*?JuSE!f%$K#LjQVk=t9o%?M= zvpe_OMkDPCz&O8uvJLfbL(8{e4`$}=ryhmu&T;2^_B+>#l>HdwsJ3%g()|{MvW!`$l=$KZ}0tyV&pC_n}XZ_s)Ia1Ld9j zKGemhzbL*%AHGZ)-=cqnyZ#mI-1iKR;vT%UdoBlHUiY*E`T=-8dhk4~yVOg?o%?m; z08M~5d|L0#QQV6%y(rTwR!6<~D)b)qY3u8wc>Q^P=YIX=zRddDJ+?dd>+$|szZ9^y zymP<)O}}%$VWg+ua9I>@K;0Ym`TIU^QE-eq_iGnN@!H*}?FH=4*L#k5#!^d^wfm6| z2?pP}Uwe-$b&NarYaqj#1HRrh@0RO7mYw^xr$FYj0KTUSckb6*U9M+MgMYWIS?tq} zW#@j)#jdQ`xyMspuyb$T2${dZAU$X2UMMQ!TU3->xoT}s?|S?}nLi)?Zw34JK{@wl zh7y_md!b49?@bxAe{WJ*XYT%eK%=$Quzw$vEZn~rx=efvNh^$RA^Aak3#Q87Y#QG} z(||L3{=z}qqy601pYHpcl6FLL_y3if{!7b!CcZ@uzpC*qEKhsw#=2p$(?l4a1@SGE zBA8R!Pl~IaIHVTL?c&l!0Y(adBpdM<=Qo9JrJBIicEUCR)fV~GR?LW+kWhkfG z48>^=$UgN+?$ok!oWC&kg_aAkm8Zhu0`>ZtJYyy`%&l$IN@dP3qwWl|Eaa;9DR)R2 zM9DCH@xClL$OjVSM9Gkxw5QPHnJ5_|LFU{rDN`6FL&`Xw96@^zDbgqzCcQ99hSZhH zr)A`+)u)&FxluB-JmlctNXCN1l z{v@EXr3#~DXc=3Zxz3G}p=AO*s6~p>tF;O1LF+0kQb?yXz$ax++X~Lw5}x|xD0Xc( zwkX_9;QpU~L#$lo_t7_Qa#kHemzLFXDz9RZmm`z0OOgC4@ia)0ws!TJ^t3R;(al@X z9g~d;%4Ondh(tBms0gKI- z+Gk$Ujim}w0!tMw8{nK68UY1IFE@q;=~QZBk*L6eCE%Kgp&@xWF*Jfw?4d#ISfoUH zW)Sa1%8D2onwRsQ31Vm{Wq>m=G?)iYnHU<9RyBr((74gJ{b}oRd}UwD&=AlvX_ks(fXE0yORKuVfGt=9 zt_XZ`qGwp{Ib)fzF%nuI$zg6Mbur#EKNa_{#1>PpksZT{Q8b@WR2+t8Ce zwt^=w(`%{nYzlrc=$BG-K1BRXZxla+9qVVX>;B9Ez>z5aK6V?wj~#l4uNM4(;7(xd zwS6DEliw%p&jF+d{>~FoydOKD`%z~94FK#$?k@pa0kH7ek9O=w9s6Gb{5(3{`GGXF zw3JWUSiYPs(RQRKY@ijJH*eb(#oxOE0DFS(-4B=sXa``w^LuE;_XYq@0Z_yD4g=70 z-+^S`gN?;A31B4PJisLYNcYSgfV%-`*)xvlNH*emug|+SL2B1y*&^PnMwv^4*z$9>6BR(}05j>;~_H zbo+(_(C7Ou1i&U>-&g=zxvwD_(%ZXz`>tKiXDa?K(!To;0J1oKbD|R%J*KmB(IR-- z!Rj9taC-pY`+w0J|Mv~R+mK-t;NmFm>O$T^tWMEV_~Z3 zzlKenI%7slOGn3=HS5+53}E)f--VRlJri)QwCn<0j{)2Q7#DrqkLqM<7^XDQJ8;?z zr~A_rL~weDIb)@(YsCtGqKf;w+2m*Hu3Z?rGXNN`?_3VJ34rnX&Vzsk0LJ}0D*@<9 z&bseBAH`2afMEcXd+ICzdh)3&a~#semL*`EThr!bCBf!9;L;8PF06M&w3 z>JR`u_uW&Xp= z_L#gQrF^nvY1fLBBJNu2-%R}jKCOSN$B>EK<5}oAmTc>AI4L#2=d&zdQ+J=daUC@% zA#?vu&N!79IB98-Hz=ttcD^C#A`D z)cUrVUcsAY@shG^rIMkH*WnGtdP~!NJC>|7lE=N6#jJT!^X479%I#xXGIi>#MJd;~ z+0U7zZ>z1jWA$1YKa{B7xOFGOC7CaxtC{>u_$~%LTHlPH+u8FlAC!vNwR^Mh)KTTz z2zl{VFYS;?lczMzY}>vwrzS_Y3QrH{la;G&TbuAUAQ$Q3q}0}BW~%a9y3AAUz`KP! z`Zf)ixz)eXrPenzG&Rkbv0}BSC0Bu@G-;qb6YBBxU(mHtc&B4ZzNP8i>&v4&b+)gq zG}+8UynWjjtXgH;fRc`j^m_f|$unEp7wjrasCCr$_iq~5wmq1Yl(KHpq;-8;%A@Ae zR=|Wq>fycP(j&dIV4-ib+nH(W!CMIw@xE8fZSGpxZF;i3-{{=G_2CzD zz%e6e8I1O4ek zfaQSQfW3g{!0Q0MB6!#0-vMu+hK6Q*3!eTt?w5k!?X`cupS~&ju=DSh?UpzF#Qv8I(^D`Az}$#2#c``$D_{kfm;FSE#$>dqg{>$@?Q9~T%*k{ z?M2|jfY$*(gAOe5>7P0U*B|xQ7w*NZcRTUY_jNtcRmd~WaUcxQS+*NrzF?j)zi#?; zH`{pa@=3GKzqz2{?Od?5Yx&C6>o*RRpDj`tsBdUNZ!B0?eq-u06EE@4e$p{#lYE^} zF6o%Psr;pg<>{^~&0ey^yt~LFnbB(AyvdZNwdHqP(zUMNzfqhlO>JJjdHxMsH+N~* zZhZrZtoV;_U(o-!qf-f!QlojhKv&(qV4asuDe$d(tl~-T7Wr5DZvoytkdq|{L)ts$ ztXaPvZ;Q$`2W3r4JIwdKzH`B%6{}XS4gL`*^8)!=%+{~jyU)&Aj*rMdoNU}U;J>BrZmONPb;#SXOP)R{mrTP~Cgm`6{(`QxT>I?U zA+52!t5U@qec!^iuxV<`yaic~j;g82Kbcrva}{3S)3bj4mMuGXIz5&1ljm9=fL)*Y z{O@pjr8I5c(v`j0G`CLwL=$!%V3n|S+fMf{f_qzz*F&1n@p#uiwjx_z>5|eG#<)pq znlyQOv%goVU?YY0DaDXd=Yj=`7B5|jZ=I%DTvwXrGzCl}2f`4qEokrQ!_z5g%AIul zcYx-AU(Xp*>Pw3OoErP+AXLz4i_2XqM=`gZc&qVgy=D~sk455e1!T1R@A zD@TiyQgcf=hdWtVcRTJ%HKdtd;21}|+qD+0fi%a#FXoL)qxcQ{9lU|B{2Q$R^y?e= zr+MSWDE`kg0e1ngQvJ_^QT!%WqHkUgm_}81N8J(cpYV4KLzknz-Yh? zfboC_0Vw<8Gr;Xpd}z>-KCU+bo(8-e#s3xo&ct(#|Dr~xF#tc%`~*_{WWbmC$)4zapU(OU_`M?h zUO`X40=Zv-+^@VB#fL}udJaSO!|18Qm_vte2HXyq0DwG)QT{OI%i-q%uL0hMd?NuD z0LB0w5?LD^rj?M>#c%{)X$LHgej}YBRrGO(y3uzp0A2_D%=0|-F3O{SUxA#jd<1YV z;9{Tm%GJ2O32-amPQU}vaMiTT!S|x96*>Tp{{qf0YzJVDy@2}{FxLMH4*z-!;AsGQ zgKM$_yRC-kz=0@!7Bh!%;IL|l^xZ|xDX!1aCua&)gqbHNJvVl~J5#s(f7;!hJxkZk zFZ2zcnJ9i4a=eTlXAi!NdHFJ=co}lP{3-xF^J6?0KRyL;7T`ip_v34EJr;nT`0)dh z_AstXfL6c&o)_@>@gBf_0QmhF{cs384vhv}1i*82Xbj+XU!F7h(EWgi0F8k8(I>R6 ze#TPAr7hOJFRwH3rgxe_ZEL9K`r#c>{KE$U4S>af9>C)O$o9jxqWGm#0g&w_jPgsM zeQ7BGZFuQ0;O9~NqoDxIiXWXX_gCT?^8X0({|K`G2)uvv2%s6z57_7589ze#AH9dZ z9052Ja06fhpacI=*tc~p!OFt-!VkfbBk@D@j>ES^SZBAlr>RLh-j8y3MKq$z>7wj2EdAD-+>JMJTKe;(kHsLuD7&wH^Ov;)zHyoOEt+O2;w zXEv+m?FVSn5AbCC0OLo#KfoCN0Au)rt$@9NBf_^He9_M@js{!-7z?-?0Qwg}|6)fp ztW@d}{jNV{If@Tn?MolLOE7xxU<6QxdOtg;%{zEH0DXKA^XuSc@IdolZLS2? z%60l3r9Ov$6Z|*FbCuEl=`&|A{yd@o)2}hKNsZ0v9qjq1U|VhF%GImaav87#dR48b z8vam2!_=wMr$h7GHmhUKoO$!`59HRCj#p1FdF{r3do>e0`mXvz>p{)>J^`&X;3!G+GQ`n~tO3;UZDlRSc zwYIN^{?ny^g1!Y?(>qv;uGkjzbzH*Q80ERTZHG44@=w}2W-oKKIDTD^c}^w&haZ=q zscw<+0`T+R6$WRjz~E+vm+&g1vXI%@%1a z9m}ee#AW{z-a)rLwV9e%Tq|YS&%{%}gMvFvLP4s!(gvsL))Jnsgg*pmZ!(-pjsB@7 zC1xtL-f5X7>l|%DKag^&tkjayGP5?~&R+A3O`B;k=VzX+MLE_(m)$;#k+j0x`qE_j zfGkQQ=PJTJ`~obH@=n#1zY-fR2;*Wxy(Q@0fG-I+FhMt`bZR}PkjoCp#hv}+Ys zewFfRNm_Y3?fd-s8CkSFN!KRm;FbT7(u|hwHD0r?94t;sE$yboCF$joJoWNaB_*z9 zwH%^9;tx`5z$nmzP9D3AZ1coVxEYkG<$ye3xTML zCND0n@HLlw8UT18)!lww$^Y4$v~cf6)&>-O-w9?H$~@KHd};BwntJ4>P~ zfR@nTi;ke(-{Wu5d>xb0RA@~}N01#Gndu2MJZ0WVNk_}|#A7lCCoS|PVT1j6`m_#d znA+UdF>m2w?C~gX#Vn1UF|#EpHO(l~#ig09Ox*6}t}D%KU)HlO!-rmQ*fo;(ijxOi zS%dWo(H`Slu&h6c=V`zA85D~iiV+VRFmdn}g|=ZicAm&jdF0`^v{~w$)WFD(mIiaY zYvZPE_|I`V2kBAm1La)TysCS>^n{k?dwjOe#k5tE8^bRgb}-u7xMM9e#7Sul_N|mV zy-X)JA_fh1uQW|Dsm%@+?wF!51hxl=fQUzKYlgp;9y+OMdh4vtuI@GAUlA!3@W*9F zxvsRFdtj*~tgCLyl%76lLY1$>+zmrsGR5luaN`F&Nddl+8ge>*poyqGLbN38+C-L998G5`0OIEJr3b!wU^Z8dLAC%-&1aS8kI z?wPWEg#QLZkEo&RHuNEacG_o@jHT*Ju)bNZbHmnMS6bc29ePb;31~;%SZv*1{+rW$ zVy<0U+dJpmx;3BWV_3)V{^Os!^@|ht?D>a(*t_o^|B=z7o_Xf`-{1f2bI<+LKRy5a zKmW5vk~(-WFP7AQy#CXlYCI|MBER_GpfP!NlwXxSd$DLQuzr3PE3{`jB)v;8{`#JU zKH%9yfVZRgxsiYieBN_d^*+}M*Z|lK*bjI!ivMX-6u$=kuVMZ8&(}xsC$SFyXRKil zU=924rvMMoW`tVr4I8}P8@pOgGWN4v^ZsL5O@iO0q^_;3KY+g+V`$4hWu6Z1$ZgOr zJ_3DOJzxZ`7X#k{{3`bPo(CKPKvL1i9rgZY4f;F$U#b3%yPHQYgGQ_ufWGCr8yYeKj~@HpXI)EMpNrbcah0*H z=gPh}jpfRDSC#dlPHKmX|~XAY<{`>A}E%-e`{4e|S_?w!PY z_q=iT$ulyd{2p2k4Z&bA;yYy&VsdmRpMI7+PHJeR+xQTmB8Y9?%6KnAD~TT z4MS*If;C#+TABHXsMg$qcguWNI+RK85nmou{hPKFyrE!;(J*CN=lt?}O-t65+B@b3 z=}BoJc9Ka!Y5CVuE{C0^?S7sV^=q2SIP5*a*PrcCZgu!pa8Ens z?6~5D<1{7R)kaP_ZrIW0wfb2pM@^f-{cNd)n12afk8uwx`v;>^;46;ZZIyxlwB?mw z($coD+}D_Y?br}ZT%Z`UQH#+h{3Emd7u zxqjw_fRi@1hJVs0G&DBNY@gk^s0#|Tt^V&LET{LwN^?7@(WGTBHL2zQ7gE@M)cd;9 z`~{1;%DMrjCtU+u%W}rtzjr-9xsj*eSzUqU$oK^9v*yi*PJlbTX3VrMVn)R&Yacdk z^%`D33R;GAA!r^k{57b7Xl*0{1In{w|-3~bh z(Sc}5mWJ1{w=P(KJzm74hn=+J$~=XzW~~*Os(27`e4pPJ!^V)WM*W@le|Fd?JDLkWY1;zg{@%x8T6Us4BeRYnARF{ zx9Q{rPX%8ScK-Ps;C~OP7L!HjUS#=^-7{p?M?s)>eAHaNgH21IT9x7K)t< zH*Vf#^qI<^7&=6?5;0#1D>bjhMnu~)75}%mPOU>Uop@S{%fsIt4iZtj5Y`m(bR3|$ z=ry(zOhd#Z9Ii9dTZstgOnF+0Af3@id3uVT_TVfaU^(LaHR91(tm(keFY${So#E_E z_~z=t%7z{fl6qo?&n1>}HAaU$74Om!%B%N(P32z zV7_q+qr)0HSHIo|^5jN`60q;i1$a4YL0p~)yFBJ}*JK2GX2hW=`M@wAZSMo;-TNAZeJ8_zry83`|xI3KPrm;aj3h0-&Qu)oR3(rSo?F$f6bUEIRX8D z!aaaTD`LbZCv>8kZ0v-Zv0PF$0gEpYwOpMs%#JgM_wa17} zhF(2rjM!u-Mnq!7CPSa|F=DTt79~Spg@n;yF=F4rm+b$8p6K^5M}7}u^?T@N#)N%$ zzsLXYLc!3?{6A=8-h<`=`8*BG#kwNxJD0dL?pEPd-$?H%{2RV=J8aXQ_cH@He&=C# zjkPPN(ikNAW&@V}H%a+*$B0daTGSIvJU{sOIyAVFn}*xm1X`T0J%04d%+p6nhPAnh&4G@l1z+Pp-E%JnldIvtVt!O+!(O|js8K_5F<7ySr{W$=rS>4 zC9N<XGvpwh3MXgyQdP1!AX}a*VPn7Fj^jq0Rhba{? zV#z_dNe`4urn?rdWDq0PmJB!qF=9z6BS@>Ld9>|Winp4k8|nGKLpyVNZv_mEwu&G9Zlw`M2b;&PK;QsL8*YN#)!4_j$>hrSfvCmh!JZj z*tbU+BQ_|Vjs(&RW5lwIw$zM8I(wMMbl@s6V)JU&k}^^`F=C}uCPu8J)#Hp=`EOP} zl2aHXR`P3#5i7K|hw@si^ILIYjM!ARAV#d#lg?HXBUbW`Ax11qYOfUF+!(Par`im~ zX%9#o$cp%`C}X0seh}*yQ~Udh%1S=&dGY!@^NyFCR5rBH+TW-InW(H%rZ6h2N}Y!x zMH-dW zo{}vmvn}nvboRlDN4?{OzA!4Qsn4}1;8_rrRi((ml$xtqo`CB2?C>Svn?-4*b+-3- zog0-^%P1D<293(9^qj}6n{@(LL}ewN(g0VD$|^kdiBjy^rO{P^k0~mv%Bxu9rQDgQ ztdd_PDk~|{)>eti3c6#8%8GKCsH`GU4N+NzGMxtn_XQ^hTWZb%y+>PfBD6~GAQ4&( z59L=Fq1Dow8Kvb+gjP@n5n8pZVwuG`5n2NZjwJWhWUn7j6rLrHF6k^5i3%dLDp$do z2(6Nq6QMOI#X1Lx(3$6zv&@{a#)-;(H8JQ&SC?m8gM_WrR zEmnFh5BwWgg=6D%dNZse=(9b4fwKWzMqPljQlPb`p?A`U_sUl>TS^+<3$2c44RKnP zyK<`)n;Hj=)2elZ*w&?aW>&H_+L9XLv?>S7wU%*WIhFyo>-fSrty)hJw)HEGZ53oX zrZ}zSWqH@qw!!GZvr3#+l|IDERnw()g>hO*r)8>P&YRqJcglNPw9IIYUR2-|vcCsNiBr&T#wY`JQ>a16gE zRpYeUvMOB;t}#xlax22xbCO>Xr!^?Ym6=~<1?v>ylN+Zs;Gu8fia4!GC%kHk(;Adf z-g&rcoL2D3iPNgwiS1ZQdL~Y*q$N1>7=0sFHz$@l=lKX4{!8ZeEhSHB@-SEN8EYVv zIo|#P$wd#t_8<2A+-HKnKypzB0K37)Um&??r{oVH9s6e&Jp(utCBL5l&Tx6j?_Y*% z?9=`JLckipZorFCa`DnA`Cqud1Ur+LTpX#tKynFomOp(XU}iML$H>{XO`_yP7xlWH zPX5O&4%^5#n&(D>qX8J|Vr|;kH(JtC(Q`{9-Y6Fv!^Wkd=Aq>nHUk5ZrfLatB=>S8 zn~>rJZ!feC##nyzC?#9O8BNf8V8rvyMz!gOb*k!Rl}>sit%vE#2iG>XO)8}+<73-s zj*V@jX)0voUICKjrUA6Q83`%r7yrP4bBwBSyAK zK5;W5(%`B6#9hFcEfU!#`2@aDM;X~B`NT~0ICvnkP4bDo?%BzUY?FNA1>`k?=Jn`o zZ7X);B+6uQWE*;>bybUPlY9*CpiyYesF8pR0I&xeg*i3~PwFTz!=%H>Jh^R&(B$>0?r2902t@r7H5@k zjqmVTc$c1qXW%Tz@`;ZCYKcyhd~8~je5@0&5`ej7qSGWFdm3r5CCQ0SlYH#{nxoSs zAB(`}WPtp697S}Rk5?I>BqgHAk$3*YyB#w#R6IVtq(Oi1Jdaqc=H;r4u{Bqn9&jZnz%aKd;F8~sS zQA=D|7q!II;wXGH61^veSG9|4?b682$*D0(ETyAnOcF%vP18|=5lmo@L46O(+TIQ0 zlVtKm9(O9QDaW05#3zA1l@UrZB}`i@qm(#G*B-FshX66PR|2V;?No+?ku23i}DMC*XByNgJY(xME~ z8WEkfTpnf1aY;y-xJcZtjLXyLBut^T=UV-@rG%)RW0Kk1ak%JP-5 zNtB{8Hi^q|av%b=Mkf(Duw#@)C{em<5lWOsG5q7W20>ixRW3$}OV?IN9Xb>Ew=Ho> z^vPsf6SJ7>Yj(xToj*!^eM1j1xXL%ad`gN#}A%@ zB#o&-is~^nTzy)PU_{WJJ-e%KvtMnwwHqbC&ft)iwvLXubA40{+%wOv?aC1{$al!p zsjaOG7e2-q>PneXv$Tttp%PS!m_eF)M!|qzj){XI{h5u0;rLNrv?j9`FKOji7^KXP zd7(1p;dK99_>l(ljWO8MXcw*=rBfR1Vcf$XTVq~`{7PlxUX;^(+zY)Yh7A+<)Lqo} zG+k>0F2}%NF888b3=9{;-OVYLidf2(BVjm>%n`7WFw)u#hk75?!p=eAYhznz$r!OM zczvReUon3HBf|CIX`)gH^ta`T1!Fkc9GL(Q3!M!3*a$DLHt&x~-vw94ob zj?&GHYzzse^Dm<)Mg;TEJ?EVB&%fZ)mtOk0Tfgvy;}Ru8p9=Se5$%d=6C_N|yEvl> z;_4td{RY5zq<8o~snb1D|cR33wTRRSy5QK8(N7592TP!_5G!MLvvP{xJS> zKZ2Fad3Q$1|HS{>8J9$12R$19 zxQHLYRc$gFe~bn3Ba%dpx%_Ozg)~p{8F7JWdSZafrzCj0*YU&v zm4a`3l&OrqkaA=xas}Av3(7Hp?%YRTaP`TV0-Ed682R6vDd5w@o%`~$>v@@157ilv3sq9AC!u8fRsdTr_*5k^7a9>0r& z;5d-dP-i%3KT9v<$3jR;hcf8B)G*w}LQp#cU$@Gja)8Hl^X0 z%##~@M1<}>7ZbsiC5_UtEU&fIxXzD@kSSqnR1Sh=?b#{OCm6x2xV@(4;^+ufYtE4b zPaPuxFggNGmT;w64?$%`YiR{#VcIULi-1wKYX$W=KT?!}Q3s@0?NNi2i8ojy_m z`fyXW9XU0!Y#1-0qAo25OppCcyaac?hbuuUrPMYlmU&{MCS+(y=Ojs^Cb+XTv}GCo zGTVLZ1kFjN@_Y?~ko`klaQw&NOF?rX4yxOOPu zdO$1S=_vU_{FndXl>q#w|KTRU;V8N8e87!>i2$rWu0z@%jRb)1kB|oM^5l=e?~k4V z8~_{vycH$apAHxexZ#(0)K;FQCD9JKufQ_ z&Fl5AzQ^rkBv-d1Z6yFba`lq{wDjsjfVa_$=!t8v^C4$lB-dORxmDRUcR3s%+wR|0 zm!L)1o#Hy_syl#B1Ka{>u;Y+()-Jp_5co4?*4u5u;2Zo&-9g8lU|86=#_T?9tO+=bOAO1(7RV+=f&>+T{X=0 zW=*?)pBs&SdI9h{;Aegm4!w)ry?Ve1z(*k8?Z8-nbN&3e@wmPTa4W7cpFcOPX!q~a zd!yvi{_O7GA7F0$!9l}t80q(33r^BR=MNER8oae%b8wn$BFsW zIXgNNyO{SO)TgnFZH{Ym8YkHC$%*XCbnTrmvajZ8KK0D52A)h?mcm8$RoY73vgRoE zy-|+r>o~GiscxAm8re6^MOqBKvde=OivD@LR@oTsmyvyKnvLvh(^8L5@wbc}Bp2gWnxi-hvQcXv!Wk?@_<`EY~ z%4ME{tuyaBUpuU|gthCva?gvDt9goT8I>SkFI=rw%_FXil&f_qmDZy;Un6X(RZ7L0 zM-1($KN~oWl*?2LVX0zWu=3Rs)i7yoq};GZ-iKP?BK|^4jVX==_mOffKUUNcmlIk^eySyHG!Ke4^;TajvJ*Veld7|7y&p9fc4`ztRKf+4!8+`)$zEQfGz-ZMdR>Q9k(}1{<;(;cb^Kl z1b|ia-N?K9DZtMH4RiD9>}`wTh80QNrq(l?H#()2FAW zDkr2Qe}Fw%S<|!>x#7%!nJsd*GSh8Y<_}Y^l-^$JmqPB;z_YJJF6BC?Z;D7p?x{q) zCO=|;)kP~`i^VsEoIq`L(MolK`lf8(?$2IU?o!4|eH`@CcRU>>cf9BI(qF{*e-T=g zFJ20OUgV2C0BC9Mybu7*&7Js9yYtm3`Kz-4w*k5VDF0VKkCMAE$L_itfO&Nn(!Mkt zfV3~&47dw00nh}P19$@PJm6=)Y!8*&UyhR7UyG72oLsD%{=)gyb<Ra&^x)rg3%xNyi-9zP; z_oC#_PX~;y)KUNWrCvw<=i`xI0`vl&1RMms0ohIlpl5Hr5`bL-tE0a45!ahF>8Nj^ zw)6$S>wp3s^(~mYw>;!W>Xya0M!!%;ean8pOGP^BF?b68WNcPPeG{Ijn=p57nja;f z9|5>LaysfUmtZ}U>Zr%ugm)5V4`Iw5qNCO~jq^~!JK$HMqy96@PkN~Q*&MH<{xj;T z(PQt&L*>t)t5hBJpS^+W0v+`&3G&caw~RdA9x7wUM#)%=&R9IjV=>Ri_5k(*4g>HG z`_qqlE%l#Xg6kUq&44`sjQ5`&0f6S_QvqlD`T)gzr#OApDzh+twmG)`CGh)3g*4lRO>Tg zvGGs=b;d&l_wIY|^wnBM_0@V$>^xL}#T$j?++8nD3Q;=MSL;1-rM_BolT=^L6ytw_ zyHH>4D7=>ma{d2-c$vsODN-*Jrt#kZxP0<0@7%u#F`!PpOf(%OjF*X~5+f(nU}w0w z{}q1G3`^wE35G)JtIq{o+2#g#!B_xq^PdXIm!9|O_--w}4%Yd`^ zj<6k+qsnQklsl_ccP){UR;#WpENj)7lCM=)+B~dUb(>e=A;S7G0x6C5tdq9FLnM{9 zd@`z*Oye#J4b!o2SN0Imbgj*eyPlFt>KqRdEki8j$~t#fGjjy2&fTT4ErvtjA)+P0 z*J|Fig!2#q&9JidxcY}6HTjEij(0fI#A3X$F|ZhSa|ZK8W!0y}d5C~trM_O}2=(<$ zucohO{_mV~&gjwf5&45ZIDS4N<_U1mEbd(^*eX6fx80uc6Y>A(u(GfbL;iS_|7%h| zkw3mTO8$5Z-~m9p|L6H*{7c?26oCK78!iG|2Y4__{x@iE!yoTo-Vh}>9*j~yk^h7L z&%d02wZH{Y{t2V5Cyk~3aq$qj{UNNGH>9h|U#f>l!HN{$w1$SpMtY^=gwf>oo3Yl* zu1TwSh}5$F`pf=bj)%zYJYAG<>?e#G4-h^Np$7=k)Q5uDczN*|_WmEBDSV1KTQINj zhu+v&;r-#BWub6$i?zvn(|Kp$KF2$QQ~_kXGc-@%k9?-mT{D)<_0C`^dC!HrX0A4o zi`ULO132~0U|9m+fa;wg_vBf*gO+k6m2l2@X9&mg4jN174w@@16m_9@2I*us&DLVP zGgy*!O8*4j8Jeq@RG>EA8OSN`tg(*DowZa#)}x#Z79R|zuzc=`lzHWx+$dpp)|Afq zU?9)#tZAOb6+Rf0B9v2FU2T6Y<;k)k7@k#pFi53fCD3b;LZ!>!WveQOazZTyJ{VfR zVr_}c4qJDQ4+cwVi4bcZaIO!A)~IwUtF{{H`8#e^TddrGWo4H2!C<}xm6~Z%bMd}g z)tZ%)VsH$6Fv5DJ&T#jwuolp#dtzlD49k_*rhc}lcn_{xJv#2POP2M)7^Fs)4R_)y z>QYI83w$taEw)X(W}b|e-H)rN#YvLmgJF3qFJSS(kX-S>kbK>nb9E>MPVI%4hESZ4 z=Yt`6wiK_!eLAMueY%uhTZ??>gF(E0y<3$zj|==gI(uT`$7n|cbY~V zm+&V=-0k_{JGE{zqbvwd=KVHKCwpuK&mmsb-K|l;)~)O1DUkTP$T{ndF^_k-^HzCk zP4WQ#Rv(xNm;*p-9zb0W>;t^y@mGfnzF07{reAFUv;#o<)yE|rcsyvo3eD^U;0dP! zpp~6)EnqAFTHFZ_0Z_+;m4L^i)4lC>OUq)7If!UQY>BqRwqo<WXox7G{2Hn>I zSO{1XecX>K;w!k-0M5vpHe&|Yt&|cc0?p2z&(_toVg*jn=9%a2T*d*OZM1dQt|+;8 z900v>FUIy>%$j?90GMU>J`FescmwdRpLOFu3XC~1{w4s*jlUm&UL4;n_w#|fz21NP z23+sxk62MJd%lT&tXCPz$kFCDd-=Vlx^U*`dknJm@8rxPwL(ja zyeZw=vDDyVENQMQIi+bcEZda6)Id9JxkIlqic)&-=zF(e?35yL8f@Nq{*!m{T=Fy* z>G-3dtVtNH{l*OL?@pImH>r8^j$Ni*q?|f+)}oYK+${ajx7F6@VhL%D^&7YD#F6v- z9;gh0@s)G&m^7WT*ZbH&hzz8u#LS5|%N&r=bUUWVi?@1dhrkQDX=dAY7yTxvi9F&} zcsiKww6ZDJrgoPaBYu?2^_Im_J{GCtrOQ0k4!k><*SBe)Jg4IRjV`smp`od1#*7uK zJ&o}2Tqn_bQc~y{iRd-L+l`pgmZo>FPv>qtb+#{4nr!AD-mVghhWxa&>!G#2hw3L! zhAqs3U1bTCs;pB~SrpeznzXKOi!Yz1t?22s{}ir{9{;>LdtFNH?R8atMv6(>>1=e7 z6ZiT4i4hfnyq%RTaHZ}*Yqr?g+9I|2GUxSj@dW?T{$=lTGXYw z08Mv1s0(nE?ruucS~Kgq*7eI+Q)0wmU`bu!D;Jj*tngi4snLu#clH+0QWhLkcD$D! ztLWQqPZO{7PvwyIjyY@AuirGVZAaQ3TeH}|f-6(&I~Ockv1;{N|L`2HowBrRKLRE9rJaCljgD~-3mu3hR$EmwU+;v zJ9bEGQof`Wh!NR>*U&jNO>LRCV0W66QqbZM6kN$LZo9WO0mcf3_ldXBV?=g{sEW_$WQ|fiqlBQ^mu2=M)nClgXv0fog{AxvNd*3USNAVB$DE_b>#kb^9 z=;a?h05}48&*Q(r{~GWA=6b>R;JO)ra({zzfAfT-13!Et?q9~gNd&;(Sm|8A#emBJ zHvw)1Oa$ORzqD9S5)W4@{{ODLO7UxyZ%>GlZ=>wD7Xt9F`E9(hzr7dm9N-|}HNcwy z%8mc+M^6Kw{zoqWp#Dd10Ne_|KlY<&!=ugNx@6)@Q8Mx8QSz;!fRm%-n`p_mMnY1z zE}8fYat}lwT!1K&i;7nz$v45_n~-H9xJ(3>iI8C;`d}jZZzB3&B4n6&H{c<_qks-T zFW`ynisYO7zz1!k6y*2KH!D{pUq>H&{ZN!Vv=Z<*;7I`fh`)h9V#fXbdaGTLe0@#C z({u^R1hmGjNOY#1;8!H&^~g6TqE3v{H!;@VgpA+Z1lS4K6P;Q6T7P)>f=ALXzDaOD{n4JCf_DEt_bZ(+vj+j;`tmJ{%W znt=EF*YLLd+G&7MfXe`QvwiIrz#V}5qvS!nLBECf*dtft8fCtIDXx+Kb-c0GuB8ss z@0~&(?wvY~AvH@)O|*w;Lrm7JHi;Url`Hv0Rvq5AFUOY_?^1j#qp{loPXe9?90D8x zym!J#Ea@9%z!~nRR>F7>gk~zjp7A!Wl-Iy6MyXJmc;(#}D9lr16{^-%ZW4 zxX$}-rsZ5&tR#v3N>Zu)N>cCqt}>rL`eLT3Gtf6I=~j=Lnz+@Y-f{KFYh68RIx#&g ziD9p5-UGP9dQs`{4SLKxi&!PPl2|1Y+f|~LuvqtUeJ_<)iI#@fTqQaT4@hENC0aUI z`f-)$@-SZ*usXCk_8Plyer4#^g*L}t!?VY)39%xy>3WS_8C?zL<|l3) zsMN4_<;rf}yb4XoQ52m4`pJ!q zo?1?c;?XYWROB>H;c55F-9D_}h26Ay^T0NL)(3W5O)250e2*5N97k!{A z?rGn_G|`s|#rxKm&i;9n%zP6@&C;Cf0ay(=+$gw5@IK%p0F;}Ha&yo0 z>BKDqxW58$2jFhNGyt?*bC&|Jewzz@+uVbILx6XWPG8#b9R4g&w&R^BnSC-~B;YK- zg@8)|SkcVJx^Xt-o;@D$AOQ8xZU>AFvnj zG~jsvdZ+D80D8E61mJAIrO`0jckI|;AR)S6@FL%8n*EcIH}nfH4wEBZL2WtBeHHv+NKvJ$(v zeW$3FRVdYtBU7TG(Z4^umQ^T4%c|wXj>DGob{v{QI}TSr>^K~zmX&f)%L*)7)|9)` zvMP76;2@oX)3W+<)Us+huVvLcuVqc|oR(GZyp~n&oR$^Wsg_mJ$+tqwYVx#R#ZJqL ze9^KBrPH$F+G$yt>$R+sidO3?KBOFuJrpVLdJ9x|Lwipx-+wGC6i!ErYp0_n7XBF> zDQTe{I0hYQM-#rj_%7o6c-(ZP<~ut~zq5K)C2AXw+HS^|Rlc;)n%b{zg$A|g`!?&z zUycT~1M(a{uON&}JvFEsw@`;F=d?Vyc3K|bjFv}eY@0>PBRNLP6VN*SD$<;m2RPO87`jx; zW7Aa2W6}aGkIAu;1^U$js*IK=hbE)t$;lTjkK`CFPe3bL9!bq;c>+qdA*1EV$#+^F z(pfD}4xMOuB*$raaGh#-ObMsu!F@){WAe3Uot6jbM#~dWIV}&;lG64acvs6hu^y2P zc%EK4MYTK__4f4}kZ$xP5>-IT!ds(}tI_2vwr$U>Rz**wbr55pvb|gfq?|$>PB}$s z>q;H7m+@V1YULS~k1fxp;csSYxpY$6&}Z+g)(Sh5jpaQ2O-|khtI#a}Rj>k+G?ATj zX_~Z`e(r15_Te=6YNGJds|RixR-lC;#U|R_?}E+d1v1O zJy*biG6!4`%L10?>v};M?hKGo^7h63(MJi&Kl_l~P=yRA>DaEkV_vJ^wmuhjKdyni!Nx~I(S$db_{?GVS zx@Um@XQteV=pnv0*^+tl7c8v!$_H~n<*LKn37?LmvSiv{ijw`)0PTSJfG)rWz%u~o zZ}-0$CC@_l_$;)9&q7Q1?D>Gp0MLv+2R-9+O99YV{?jl3^8V>o_~!aAYqQrgw{rI> z=!=5ZuvJ5Pde*O}z4%UQZ#waFICEHF1+ze<1JRK$5>j5_cP<}h+y zMai1W0XG4j1pM4-z>`&P;jNW=J$K_d=|V1{8)NHz4EW3goG%UVIi%+v;V<)avGr&* zBe$-kz3cp5Bd;Bc>Vt49l5pV)QQMvi7CQ$gOK%hs0R8=0$FW zUH6B)F9y~k&eI+L%X2$bOW}O;)k|aTZQy?o;8FkNA8q8;wM{5H2e3TCzj>FpJX+=L zjga~g{~WEoR4_*WAl^p@@s#{vbX1R(I{rxDWgZ_q9dIV#B9y|Lh@K#r_nAFP+`I3o z!O#=7%ijf3Y5CF&FHQGFCKbNU;u|7m(p^i#gWl)<`@B_Z^>;3EtCrJUOH(c>sh}>%PMIN`JG3nHHn8>XrC;hWR$@(d(H>03@iSrfSx6cV|WWnA9>-`m*-Yf)Y4zR%mo0}@13Mj6L(j4^Upb{lV&EQ8I;Ck^RXbhq;NW6wYMM0yCL39Wo z2RLG)=nz0OmSx@Fv-ev4?(VnW11ioRt5)x|*Is+~?%iMO>0Yad+=?XiHreb-udK`2UUff~?=jt=7(Gx+QX}>fM%RS=&Z>5}w&}3-7yk@OOWq ztf7{$Ao2w%1LCj=U zSV9+%Xfw{L_u##Sqg2FMrB;#iemIQ}BttBO;;8$KSi1zBm&JriaaO&zgjeFMdQ0q< z;;dSW@b47cNsPw(@ApWn(iyNU^scqx6h^}u(K_M!P>HoFX)#`#=YZy8ttQT@jiV*b zDstVEXZFmxV|Kv)o9C?0*+6AX$Wy!-9uDzzyQP!&o~yIZHBM=p_b-mn)Fe*n!jD_t!1{?(x+iZN z3orWAUnF$=iRaWYBeIUShPD3FwQ$?s{31c?sT!wLYtL5zd{F!@;f_1!&5P$i{5nBe z{hbA}z?vV>{8Hf&MNtXofz`E~5Bh2WyRETC3QhHDREksTa=*T?Qj<8P)Yir+RV!QP zEpbY{&g#P#56C<=iH|~8$0AOt+Gqr{0rkhpFF)~oT|>=Ei6bk;DOGDIiBqcn{5uJ& zl}1aP(jc1_vi^l}S#QFVe;lHj6jGZXU2W(7pI_ja3!Z=3PDg0_ki;oPBZ*T=sU}XT ztW+%}W&8HRwA#ceP4r76LSBkfYI@=O47N*gN^5Mi#3`-O@gvu7oKkP6*{YJ)!TX6* zDlMmU&VAeF-uJ#uoKo+rItDLW4{hRReefnJDcx*;*`2|Z`B`1mvc*hBlh%!_%$v4${Ky@KaQJb_T2iw z{3qfU0PT7~UK6KO+9~;%B*Xe3?$SRr`;Y$Wi4f(nauxCx&ec-e@Y*<~X>YD;`hMoL z#3@bnT-SJ;IHhSX(yX-do=R~_tG&>M_agt+C`9ln?4wcA%mR%3BWRieK5_9$r= zqxgi`566*Af=L{oq9?PS9;KEzrC8OsQ`g^cQ;6(S==xq$AHGk5cSiKbv7dp>clv<) zP%hy!tAW^ z!pey3ywJxsZ^m8(O<+1`Qisz<9EkHS3;mTzgwR*UK$Er3|#}^t$gW~tno6k zm+`>AjNZ%0US0-a@8u6c9~%(f&y|Nm<00NdR$iTrDW1-oe+BA$Ce55hCr$nb6#mE` zb=Bxae4C^%283@X@nM&5${Nex${H&MwMTVU;ER15@B7>M_uu|7_#8X7k`rtzUs7&m zq$`+(73V`&LG0;@8={|f1?Z(vofS_)yk)OoMpkTx*wYvAAHRVA_yuO-h4VmdE{bT* z3ztNn<_kTspHG*EZ#iD%<#>zrCbIk{_-@dg<)9}*bC!eR2+di(v=z-+&Ympi?dEer zb2>INOV6!>-pv}%GrN6*;|%mM_P)cAG223Oo@d6M7rz$jf#yMrpckPv5VO0SHYu93 z{G?!OkI4za^xDLm8`szK$ah^ULJ7b`6(e@|6aXQw1hjwQ}oU2b?UWel>-4xHDryItH zg4D21`p0pWu8BAfE53x|*x69rZz(4@PAGxn#QU;JF}jzvDi9nihx2MG2u^4h5FD$q z|IWOfBREOB&h8s}?u-$>bO-i3vMe=o@2P}G>+zz#1;LR$?*Xq#fEk>hyC+o#~b9sW%peg_F4E+J7R@NdxXM#pRXPO#lm2esBufSzW zmdI{Xv`i2gbiyBYaD5YO-#}5S!D147KEecxsnm9M|B&x~?^K*1pEuKBee$iZq9vDV zs4ZbJ(uVrQVob+pl-Q~I#(M6(JO^W4wdvg3IQD6xFwJ_mgieCLAPx8nJi%Wmwcszv z+Tt(N`3Q?W_HhMU75oL6yh8drFg{J|o5`M{v>W6_z1f~Rx43OKjs$H{PZ4dgR{f$a z=v2@av#5SbXp31(&=w?Z&=%8eIaS}h%Au^Egb zOb`}pBW%5TRpI>k$xrU(zecwUZ*&)^3MC@xMpQ-d<&qx!C?|M|Y$Q~|QzWmn&b#l4 zQRiHaP6&9y%2fEc%0`XS(VmU?P-jFcH&g!9>vjW;HH z73z%f#)Pb-HH<6qCd*FuO*3z~^`{(P?hTp&p9SMB-eg%z^ny1Tnf*U!eKmeO(|bm@ z#)IruoTF9pAiJIJS>Z3ccup1`WUJMlg+J}!MRqII+1Mrfu_Br!GOeTFFV;UkiQM-o z@f1^=c#0|2c#37AY9%R~r`WXGc#0E!AG!0Ar`Ys@r=fZ;^7ZgAa@`;(B@%DCvoSKd9EpTO}>p zc!XWUTcq6U;CN4C%(*zrkMOU#YE$x-)~X+0uxS*>!&}yIbS;v(e8H_fQs3eQZf8I0 z#wd3&TUFU!+K%mh{J*JYI%=203xD(M**Zp#EbO;0%|(mn*R6REUWS`@dFITY5~WJ( z-mfXraXq#3ZQ~`Muh+SKcvsWstN49xL7EAfx7Q@$A5*pqKX0NL{xPM@^JN;vuZ`Un z-!3gnzFoJRv=6>r)#5K<{RaEe+^kXtZ&B z2BAE~IQQZ$k3+QELc1+nA?d?cADK1Y91QU${w7~CzBw7fFYzW{SiX53G#$DR;;sM9 z=Ra9=qQ2Q#qmQ^a@Vs2j3 z+|0`MLQMBp@6H;p&W9F3FG8yzj_a!&*H=GgJ+YQn9~#%y>XYG@K^&#k?CI)mh<#W+ z%gXcM4?)cL>L(#)ZZ$Kvn)zPM%&q>2Q8VAK9R-brCZsWkUS(EZod(?m{WQjOfAz|0 zw4qmrQF|oBSYG`aGzq$xr?~EzJ8D%Ql4Z$+E7swvqpJ4&l+XrpcS)5nIvS5VmoAw5+~Y_v_jS>>BOv2 z+6pCkal9`^74t=TEnLxtq9&Q53QZzXC`Xj*#T-#ZNzsOix|kix>J)8AH6CrK&_Y&? zHk8&?w?kei*$gq=y*6ZoLaJy(K^AjCNiXQ~gJLl*#dMc6WPuVV+E6It2@&^bL!qTw zi(>vKD~0?|+K&03Tqov#vQjhJP|1#JLriy0!y<+*bsC)$w8X|$oV zoo_4JP-urgA#gki;$8ZdY|aDoA72!nj=9T8>UTTmLN}*P|4B(6y$R9|_H5;Z{7}d` zlpji5c~h_&aMZww2Pm$1fa)#gPhm@?A|9ZXgUsUrCNhf$Xp-g~SNbXW9XFNfj;nHr z2MD)#fY$Oe-*G`18XLJzZ{#|?@gC@LXa%%B@=aVpRNge&_(Zm^fM~agcAGe^p&q`D zYw@NfP%p$hZypF83>^+}mD_wObTP!0bMv*I?2g-ee%9!vZSOS@{q%CB?VSfLgcd{3 zLn|T1-Mbaq$++l$<4}nHH;#c$h0cK3hmBWM@3_5a^`g~_Rxer`j)0>X@3_4~C>^}} zJMM;4XgLa+0G$hc2bu!SfS9ihcR>$8%=3n)pjRM`H_J*H9XAX@ejvmsg1zHg@3m`o zWsN@^3H3oAXN|R85PPte)iQT()>!jWdaqsc$E@)>8iClGh=$oZYPr|0XHM5Ig;qd} zas77aL&nnB8~56E16eHxLq|c(*t&5Lv$gJ9&=nA?Yu$8cCUg(<60{m(PuDS9>o~gW z8?n5eBfNe%#7wOp1sxBKht7vChQ0$$fqJ0X(8BayyOvp5yAApPYgxS4u3b~T*RJhG zgR!h-ENkaOi=buAd+pluD1Q$Ev(vqH?b+d8n=!lTy;kKag~)!$Lu5a=AuOip_u8~o z_(w*XF|wa&8p7i39AUAt+FN8llZ42AZ0laDTHR{{S7bkFhkLEIVksadR`PqT*NTV8 zezBb}5^onH`*|rw_A5#uvY(gYzbRG_;1m?B~|?6(-vu zvY%>WWIwCrjMx7muFJhP=qi7T+9$Tz`vY$Bj+EAW5H*!VxL!RDi({{ccBKxVmeD~t=+KUUqWC3pi{fXJkUxd(;JJpI=h|v5XNv3gEC@Y>czkLj z|E;*bWQLdg&DJIzQ4xPFsSEMfC|mqBtFicNRto-O>BRVJE>-+BNn`vqlUn>W*O6zK z?ZPW;a>;^M7!De&{1#S2N#5Y16ymR0Da2o6JH%gum*TIPj<*yy&#u)Z@z*N4A^sY& z;I)NwO$b>KQ(ItgF~3F9w#aXh$SU#IlA6?7CH`6)ty2888XY`7&HNTM^%j54YCxeq zzePotIZxKE#aH{6S;}8g(Nx*$W0d`x`VfCjdj3tM{9`qG<{Pt`;2UGR@Qo!cf^Up+ zDgIhg@76>7HRPT8$}xW9SkVeTFl6ysQar0GODoUj&1;F*6g=c&@{(UmyezJ3N#NvS z3i6nlm6}-6wIpmwmw$G(?bi~Qi#IW{R2sBB53Ac052%=H>RO_0T}y&2W?*&wkQb-W zyZkhFO% zDd}h=%BU(%)EsfYmZW-qEh))7mnv;sUcQ#Nw93oZl4`A&(`$*#Ql4H*QhBi*bEewp zn%9z|-p3uYrCKSymb7T1lU_^e>UAxVJiV6G>BVb_*XUZJZNHYdTwK=@@$_1f*86tI zgo{+64g(w zym#aJVxhSo`ZG!Yfm-yzN-y44QO)K*D8!PMNsm67!T6i`to}wtT%2|LoVkkgWqB%U zw7pdw*LUQtYw4c2#NQHZ&mqs^_NdD;jQyhn){@uPb$~f7&p$)xAfIGtm%AP#5&CeeKoq% z2(r39R9BMXFjV6rc6HCYcm9J9|56b`TaTvqHh^`hy;t6vs@3YgbrQL-wQp$+;`-D) zJM_hW^$J$Cm6rLwi+E^=wp?3Hrxe>QXyN9gHI2{gqy6CQ ztntBR5T3CQu7bF;eZVv12M-%xWgP#UAmgHhqN08Fcr>J|R;;H>fIQy}`;PCwgOkK50HE{tB`ZGBm16M^0Kah46|Oo1BjEOf81t=tx` z@OvE5_pXGdK#cLd+0cE^!+XOkyyLN~v12K;5@N=7;OX7LUhEtQ9Sm_5-8mLI6*?EX z2AT@7o_8`^J6T&hSzDpZ`r66*+R04qTm`L#wm}~=+AfHhdGAQ*G>G;3-X*D5c*jra z`EF<)^icE)@0eco3hx+0Eo0fiSaw_pT@GEP6%rBH?H^G-3_9vl|NY-@M%V4{?#;jd zIp!r_wXFeN^PGaOnsV?}!_8N18ilVqZ2>N<*5<3W8uL|qJNH#5?aWtglHjXmJNT-_ z<*OE#uNrQ?YPMo2_^Pc`_^PcO+9}s}Y$so}w~M}NFGXK>&jOxUHPiT<*OE#uNq$Xs@Yaq zWWH)E1z)wK@k@8tiLr*Pl=!MmQrHT(u$Ky7b)pq~)s%y;T72%@Fp7|chH}YQowReC z!B?$z@>Pq=S1m4IHQapFYz3)&)uDDy-3R6M;_ibg$vmHk^`N@44=UA8x63}Lv?kq7eNd^~w^JXK z%TjLsY#UwE2bJn*+x*$4m-?WpnkuJ0sJi;#&z4^5&oXW?h4bU^>RK>2>`(FP&??ZI|TW%#0Z5uuQr}$aZ zg5LY9`_f4S@74(Pnhmb4$_vVt_C4=@h*#jIEy?t>d)Lq6n>t>LWQID)Kks_x;>3a`={u_dpnJl$Eo{KoYVg2Wr&>{%^pjcqIT1huaGL=m%KOfHTyXl z{w1y3gUZq2Z=GWAb;WLXji~lFD4c({@sE$6f4errFmAptrjq=Y_a}Q}n^G^?vnaVvUahMMHUc@}aq451M7)L1%lQ0jfcV5I{ zO4=83m|P}1x_MlGz4C9weq<}L*BL$9dIIzst8K}=;Z_eMl7Ps|@V1#Zq~m(ttM?hH;$VxDs8-*qdRK;A{17q%t|gzKWdh`9WwL#CNfM z%taq_p}Fg0uKKKd&y<%V*xdMTmTlY>?Qi@z%Ma{?4u|M>)8r`MM4y{3 zN5(id&4ynEO@|gjFG8%S16ffAG4}@@37rjHmSvk6|K_!E?+=<9_?|>^$`81fS^S7` z4TXl=*p6VES>4F2Zv0x7AMh~z(rEjDrEFt=BggrGl~7-sNKW~_i?e(XZ(#Rd1u>)d zb54BWCWuw>g>6|rn7tg#U;p?7^L=Mzx=R0mPsOgM#MkoMFUYd>E8`5TXSJ^1lI27D;Je^kvyAWa^PwNYPlC>fdK)feo0YubYG}I2X0kmC zng^|bUWa-ij{b&^n6V+uIPLk{AU}Zh%9)k*UI}p|wDPp3dzq&LE`~nSd05V2C+ugeHZ#Z+bbc>AnQxllA)ac>zIY19YG^-C@L+#`}j_Q;T{t*3v&|$It z{L`{*{zQnL=g)vxEwVeGBTOEXZ2oro=z>T;vMWJ;*n3fv* z;4NA9^9j&(5aW+mDE=+T9zf#(R?h=F(IQTkzVcx8m#`Z)^GKpH%PUJvleIMSe1A z_=c|MPT?-9m(*t4zA-BFitHS&XSzicDANqb!?Sa^E*v~HX6JAj{a7q0YiZdzR3GX> zL@2APM1=CbDm;k@<-HhBB0{N6(k_VzmDbP>?_5O8TpL+SL?~~Q==c$6$tyZ9w0!Y0;rfT11CZ*<`iRp{&kFn~uh1MRtzFmcGQif58)l?Rcz0 zj3~2M6C=vod!K2UZDu;==Fkj@hE8U$LL^yh5hFZt71{rkVx^YiMO7@yN)j*1tOVPk zKl3iS9B%QVOj7-J6Pz;9bvr39;zeovrrVO8Lv=dxt|L9ujbCVn>>R!}OsmMwk&K}D zHq$M^_eryJxZHcw>WOir%!+@NY1ugv+hKIpE8h&-A-jE zc;r{Vd9v8|a8wyVj+f|efBV&uhPq;|0?*VT8~bqI6c@2lL|h-z>>MU7w6u3nz(Q%& z**!0QjTc9d?0XT3%38>R?#V@V4wpNpzN?vQL$REN*}6sFru;>Ju8q$CpDN2nelX9C z2e0C-Wl4Nr`V&uQdSCj}F1}zwK6w-L7BZgl-x`!<7x3hA0reLg8NV^P;AG?DkxhZ_ zfjABqJOjN#JLY^h?^?u3O5e3S@+jk)${Wk$jBPA5E?i5`qCAlm8~+G1DdNl=HQ@Z%lei@R`h^s-VLpC zt5c7GWETqPzDCh~V;UdLuLiDdyp(st>s%LW7AZ}(sVzlHv;K;{Lp=b%+=m`spnsCA zP2jd2z6?OG$h(pBSmfQ1Oe3I;zSA|7O&D8hQCccPMbtE}r_Sg&J<(D413iHzM|d&p{hr zL{m%Z!*>i=EFnWReYfP@sL}Bw*EXhF(yt%C5>IUQlXpW}PF0JN+uZwXw27?deaS){ zSr2XUZg~IB-GZ%-wC|euYW?-?b@1A}8{VVq`3(48BX1LBEp6fBb?$X=d&8JzvFsGx zu{qz;bKOeM{lr>JTX>J{IJ%r$Y2FR*)2)cJw?g4dc{jYiY8iPE2Q5ZiyYH8~-J>>f z*L)ckmeVt=c%e$cx^~E3TRHEB_hi=7UW?dlK2mJx8>1rchWFw& zD2MNOq*u+lE?kKiZk`XVg!Win8Xd4edldK0>I<~TWymYp)}`qrE$cDCe7shi+7`^m zZ7UCn$jk7yn2&T^&+L{);dam|VLqv@wKvSiY6{H9t-~vrkK1-zrnwg|pRp^moTo5l zThCAAF3wX}ej*<26Y*Z2_%QTAmY;Mogs1W(JnSdEmE~U<1zifU7QaIKui&jb8IRt{ z--YHu$o^pngzO(KhQ0$$fo4GX^8Vo&=ym9W&l~eOzAwv<-PweNWQ zThLVK9_UHx#=_S_TcOsx9Qg_3&|z;+V1`b(0lGWH-Oo?J*GOKD{Djq6$M3dh9nW>L z&Fq}OjEx-(9RZyLoeMF0WBD@QvaRQ1d%{@qu}kBaK2?5>{8&bF?2?e5BR_V_Zu4{G z$G#i#bL7Vj4EZ_ozROSeoU>tb*Rn@-eKtN`8)f z%+QdZBOikoeawXr??Pklh894qn=u^GG20pAaEK$9i6eGSL@^j?JfYTh)E9rJgK5>e^C%j{M7) zW%-vMf|g|Y2-d`iZ%0(;OPBIIT%bB%x+d%RcRn72@-N-s|DNcahXSetAL(zudkNL) z=$)H&^ssx$K1EFa0y895Jn3VH?N>M)A4brfgo zD6)=_Z9N}#Da08&itF7d&gfB`(MKN$p>y=95NC8Kb5xI>60)u5M>FE1Z!NN|=SR<_ zybS7%SBs=S&~TRe9v3mTc?!NUpFWudL0| zk&irT&+(iQD_ECYl}B(!=y-mDEFFz6j;7sC#=%+{IkXPX8F53fnvZzE_~Uz!r6V8F z9q}C2eF@K@T-!*dGDA=|pQb37+$m*6?- z&-;|6X08sEnz=eC6?jh4#&UJYHqrvmv9k8Lz;h(ia{)ZTa}v#R4ebg%$F-5Q;5ptV(eWeDg6E`T(kv%!D|k-T zn#!7!X0~-~1w03yWc#30;5lv`SuLJZ*GJMOoLALs>%o4KZJlyFRz=PaBsF-B+x0%v zGTWWaZ0ocS?^Uu)?%*W1Ii^{I=eUhF zyufqJp89IRb5y4z?>e$&_7XhD*M?~ocuvxDf#N<8M~Jluf2^@xn{8b>o$rR;J=1!+Mzl^Ucn*?~Wm+w* z2hDT9b0{Zxj>hKWgBN&CA}`@NE_aT#eTblN`yKig9B;FFt9(=2Hn+NT<&Vdf`x5pF z>T~=xybmra-k3hm-0JP#wm2UCwl!l0qv7eT^1jtRxB4EvTm1cFpBmTcFSmMr{Geb>LvDbAe|#*>^Ier~m7!;!^AFJL^#3XCV|vA}pF(+Fr+!FXiJEjmY5U_4$= zU6Na!Qi1WPl~IB5s4v^&0^^a6SxYb;mzs73B z)2hLEd=A?10^>>Q1IB~J62?>0cMHZ-qvJ=eEyk1dTdWMpoD!S;U_8=ts#=uX=H8EC z8;r;M^1iFwdT4|3c>m75wXKe{?;4D!zrMW=UW@T~kFMu4;Cqd{4aSqU@bNnLI(RL{ zqxzK6cGh!07>`@`R{e2wD;Q6;UzO>z1>#2nCRC_^}w;=!Tx|v%&wXJR0f*ZzTwTAIn zeSz^%g#sg3O=}~RRm||wbKRuMY z@M@3{d-4B!D*P{(bEdLq0CIx?9{Qu^!r}Oi#WBwOzt}yguQE`h#R=QRuvf0{R0V`CozljAxAt{TaU) zREP6t{PS?`2%iQ08NZg<#>S>G%pOO%9r|-7=c>@3Gf&&w=+EibWcleFozw4uzl}s=R?;)^Y#?|IsG(7JFyl0IsGE!ob6-{$?cDx za7|fzAMzvj9Q_%`*)?u8#FgaJpg-fb(_aP+$!h-Q88PF&5~LWO_D$C+JV28MGb!aXBp#^v9**)U=>KX}ygn zpg)Pcg8n2m#ghvyYtSEQLM8M^GRDyc{c+pa3r|ET_d0kj`lEU$wM+C}o}fR}Cg_jr z+H5E2PtYsSAJ>z8bW7-u>YxJsaos4JHcijGAGJyLT-zb~27hDx^3lh_c=YsN zyy@W2OfVo?8wO-{`o)0IsbD~AWi3k>kjWAZ2uT|Z$aLLK$_orA(P_beRHx(bIzAhe zYcL?wDq%o{%;K%PC3pz~a=G^wj#ZHxp4u7=$lHipy95K0G@%j(l(y79QLbP>-V(bd z49Hpr42bQ4@gIjf?wmKz|KgEGzAMDx|e%SfF@< zgX$cJ|N2O$-C1Cm4^O4jrrmgB-MQeXkgSOOd{A6Z$~CBvYbLye3c1{`FIY@aA!=(; zA+@qK-hv8woz(|a2w8y&sa~Wj$d70C+-ZKXaHXP64JzaoougGkh0J1t3Lz;_A*)rN zEvQhCP5V)Z&@Vk3bAk%F)aIvx3VE$_X<;Klg{VnTAxbrjilYDkSZcd`yyIy&qIa8m^skm&0pOA=RhkZ6&ig zY(a%o=X&B^hPOe5q~YW(lUCkS2^I2s*N4}lLT=Z&M$NXNLMAm-NG0kERLI*%KcYgW zF`y0=vbthVtaS@2guH|bnVz42Y9CM`_}FaUL4)_(Z^+*ral{w@{`miP>bTP{{vVh8 z^FLpD>HoaufBo;JOP_xFnH4X*@ZyWV``t?~z5MdZe}Cnb-~WEqs#jlKz52D+UVr^R z{$tIWKm1|s+I8#Juivntw|C>lO`A4v?)%eQZ@sB0pq2-xv+f z8V7%zb?o3<_8olFzGHN#>-aZ(%GZs6hU32iDHwTJ)-i&pLl5$|_w2WzyRbbh%g#QP z|Cbrl@sG#yVLV|U!vE02JE6fbi#FpsIC^hyzWFYYtB|>S&fK~8+%s=p$kQ|bA;oo7 zE}8|8KKg6&yjAjtGW~HR!ZGS1 z2EYveSKFkqChJ;4S#Jh-_ld?hPyZBJE6F;#yF~AmRf45wT5`8wU$~+to2Z9 zmt|RYmp{Awae;MNR#+BT7Fd>L<)7do9FE5jO9?TA5JL>LmJ-7;lv+#e@AI9R`+4Vm z_T6O>O|Rd3UEk||X6BxI?wM!)Ju~;rJL50E^5|z~{Lvr((c_=_@?Sps=YRI)N5A}; zuT1~)jIaFBXQn>*<>Wu#DN6b##mS(%`y~2(;$w~^BLhu}iu?4vqTdIu{HgvQyy`<& ze|W%02LALlA070u!5_c&XRiC%AwM_t6W4!o*r#sz^zfg*@fSvXX5?o_eeR}Ty!pS~ z^51X${OB*-_Di?_@|Z7<{grXQddIJg|Mfe6W5RFV^;;8v`|jVF^t<=`-sIoE_Ydy- z!~4H9<;xHJkEwt3;2%HqClCMWv_E^~&!_*zjITWUmyi9`6zjNZd zuYB+1_h0?NsegFwA7B5c)Bk+thj0Ao?Eic7$LId#{J*~SZ*Twmh5vZxKNCu4=+N(f z|J7H2@PlHCX7QvxNgY@ZKAP;`f9TNHzkcM%%P)WHTgQ%l``h37&WRJ>{q8HTeD8ZF zPx?5gPygsgXV3ol$K!sdPjcPhBx(O)ak2~S2ZzBa@D}LzMsYF}+zf65K_#+ z2TAJ;xcO{xQUm(&d;*#zMM?ku_0U1+*n3?R^WEw*fqWbRZ-J~nKc9U1(<4TV969Rq zU--fo@BPx3zC3gP{;z)Zz>8n|no8-Vm;O$rf8-nAIC}J(-?S1te!Nhb@hX1k%Wcw~ z#fjm}hZ6T(`@tkRd{vT&Cb#xUuK)X@kEC7lOVZ`e1E1WdHb71NgL0Df2mJ$4;W6qmFv-? z->Y0t{#bD$D9564j;|Y%pW}oa-G<+^!NqBg@53GEcslMf&;kyGu(Qycf38n52|NHE z1NGqkp?#7^KhY<76%=2e%W*r;*M723G8ud-8TI-1Dz7aAlVtiwc(VgM9nlwES0%}E z&v^M&C52yTTBX-tw4pcHp4=mdvD*ahgAEBYi;z$2g(tOpPG>ywmxpilA! z7;$Bvq`4_cHiHv9kNYY3z<)(eetdlXdwoA@asz2R`0HJ3@_hV$@-_Lsk@-1(KWcIX zX-xcV*P8qoe(!fpo_5XqUy~P;#=RfyT9X^_Q%$~c@Z3at~eRHm-h@TPXqVyKEV#~U-2%R zc~9{ye^J~yc*WwLQf45p3N0Wq9O^aPTON*P6@Kl@qDyuL8zi}(J){a^ahlqp}H`PYB@?&h7R{^_(n0)F_$8=8CaA@JjK z=WhPRBoWF#Rg_27;>}MjLp++3ikkb5CySC+YP)Lu(LihPyJ2`yG8M>w4{p)LxSPRY z+-Je)zb#501PYrEJq%s}Q+}l=c@sLMq$oKFic9Gsz}>ec$q}epOfu5DOJ^esoc<+d zQDsF*zuS}Kvnn~2*!x^wDxbJ4vSsu5z4>L+iF+?N3#@EL{y~1(jK}>DXa&bY*ns)Nx4^DHEJ{w?&s_gYzARdyaoOBAr6_q3sBDIQ*_X|Kw_5cJBSw5CSF^rw z+xuKrZ`S*|m8DjO=5O_?OIfbWlqK%HATG)EXz_VuhgdZ0B)iZ><6_29-p?}R=E zI)eL!Ku5 z29JY1;B_FLq5qO3Pk_~+6C4Ito~InZnSV`^X>a+m*aOwq*0g`~?h@!5K=o$a+rDgW zwl=#@7X zB_qLDa35F-?)inH zeJ;QE8jkxeuo%1;!mj)mMh;K~8o&;40qi}`NcpdfoNxKEY=g#SIpyDql9zzWa@gBH z+1{(;7k!ItrP`}yYSt!d?t#BgOS^@&32+KD{dST}#P1ef_M<@lrMN{`REDslJut>1_HU;a1Z&CZ=sJuf0Dgd zwrm>yTYlL*Nxt>~n6TwvQI4B2=pabjy z2fz`q@OsMdle`Ns7Bqmp;54|D^!Jn3cbossMN_4O-PHZ-hS)wpliU`q7kN%Fw8yg9HQT!Y{KK!^Q|ci#zZ2B(6%C@I+| zK4^8I`?O9Xe=@*tkTliv&+in%qg#|s+u=%{`>_C7A~yTeuZhXY`NEERb%5b z&#Yd(W=&Jm+O^Hi>(;GbzhOg5%f^kZt(!J&-n?Z?TiaIcVsvcZy=TvJ>|qo?U7U;t zS|6JPRobsC_w)hWkAX6<9JGUjK)h$5SJf9MH-OPV@#H_A=X-*CIqi zqRzjwTq)(s$Cpg|HkHlx&dz6d?cTj-U-2?h12=-(!TsQI&;)jX(?FW`rNqXA2f*G? zdMd>;U`#C~wZiiqeSk5lB|IO1o(6sE0P)0kBhTZ&%;28N za}{_2DEy5;uS`mOO;OENt=*@0^je6eXK5sQF8Hy2t#WgG3Uj%WpGwcwOmV*$LIxxy zs~U4<=yo!TE$?b^F9jUmkkhFBw@DuKIz!EmS_e3t3fB|r*~}cX5VtY_l>KW z=jVg_!(QuLd$2bhTBpT%WlnMOCb+AdcLiF3QalDd0|q1SRxlYn9%T1d9<4<^yFdq#`%^`0?9N?8@E08oW=UN zME&DMddFNJ(52i4ma<+1ZU(o3iC`*tJkW+f4+MG&+IKcJAB+H_f%rvV`wZhgbS5YT zt3eys0S1K?rsI4B1T!D`R~c7TK6C^!L5fxhVMTH>tPv$t*AzWv!}A7hqK0~$axc>J^M zbU~?&C8ebg^7IJ!aN_&iMl|hO>RYzd5UT_7-Te$n z5nwbJ3+@5;gC{{bXatwizdZKy#03qY9qa-xfS185;0!niiqT~N7z{>$o55Hx5!??R z1do7)AisYZOYDi@e()d|Hylo=?_X}>X*9T4|8gI(CV+>*3@{(mfz6;3>;;FwaqucQ z4+bE27>N6qk@(*Nq=n>70@?oM+F^|6;L1yt%(e64 zWbKAcE~b1*p>)o?7S|_PELO|P^i0j{^l1cF>-O!&!(M&a)2p6weV6$aCo3Bo*O&{d zpAJ1kJ3U>r*VF37qDU{@k?Mh~d|&F4R&BeUdro|YqGZ7Wi?_~6_O3bQ+qM~xWNu5P z;3}z{p9^b!cCXVwK1InYS6ZYrd-tBbX&i-pASo%ETQP6JvSq8+G`IR(n3OCnO18VW z(!Zg>Ldmo9rEi@rzv5)e_Po57)UV9(mXzqZDB1X|rz*RDOxT`iVTG-n2Du0BcC!kR@(mYG|$DA^X? zpnoH3``*9PX?R64YxbP-`PDmib(QY<);4?Ew9eD=8c%(Rp+R+HT9b+rFNJlynNogHBPd83`m{Tk>-~7Jg0GMzJBb1g|T?<5}!iJ?EKoZ zcCAS(N_<)NNoLQUzhHN&hr;_N%xyZJ-H~656vDfkwQU`+@>XywG%C}5Yb5t@lZiFsMwz$0W9zreK=xWCmN$rY;#??*hHf>GYhe;B}#$`cu zbzNHXYF(ro;wp>~~uF zF(vlST>r(aXvNcO)~?%-$}`@gWQEhRC|Tn2sXk#>rcc1HdJ+AB#S!K0&fb&ZW6V$c zj$CgO$I>%grRrh$*4vuvQ?p$3>~rQ;&Rej0%`T@`fpC{rZALHS<14H*S0@>%OUo;& z=+!LTsLDLYN2+Dwd#W}+x5jPZ>K)B5ri>o0&$}Y2s;XXETf2N!t|rBN#mUyK9j^b7 zZ&5PW)uul3-MM>D%*p!60=ch9maov4+RmLhZS(oIx^g0?eDEw-wjxi8Po=!vOUjLz z_9Y!tjhX(NyUcxi`!Ulvs0(h)G`Ht0Efb|I88a;e7h|TmY|J#b=hv8NJ{mLitTEHm zMSDH1UMz|{#!Nj07h|Tmq?N`@bBk)s44kFwoMi9Pm}z{Hxh<7~i!n17rZLl88Z-5* z_MtJ;{6({4W*nA%)|e?j(qhcCP>q>-)|lx-HD+3<^r~NJE_g~j@5X06UAfWI)?K1D zX6o7C$4qmv^R+_Hj4F(o=1afFm}#!um}x#n(I#5;u`$y^MKxx6>feaQOz-Y=8pdO0 z9M7JMlC{mAziFMP&V%pA9`2O2Xy*UsIde$32qwQbdN-*n8h5Ti(C%rqD8 z*^Qaz7S)*P>D(ov#9+)c4qPQ`*P2UXrk-ugG=I_Dm>K(eZa-$m{>6#LO!Lv0sb~7_ zI?=v~+dp93bR6^)#_7jTbJ42Z3Yx}G`Dy$VC7*6pRcnHW|B>|}&?nijLHi2>KkB84 z4kmZAST8CoD=(ivU;7nHmgH7CZ11G0Nh?==O=(97D~~{HN;@VozXwObtKc+v2lV@0 zz7W9mK)Z6c1Ue4-7+4MVfCJzNh}WjjoVBT{swUFV>eT(n%YMamw@TE;F4)I;du7^% zv7H9(!T8-Et&X$K#7?pc0D34q9}V;b^b|M)&Vgcf zZxv?%bVztsJlgj@m3VQopnA&|J$YB_*1gVOu0F}ag^TJorEbrmm18~mUVc_}UEP)~ z?Ys8maVcCVN-CW{wU+g7`S@B<@|+JXcYf$n?cE*0{Zydyoj-dW)pe`HA;`7ag?rch zC~eZ2GdB%W9#!KmWf$<^4D1qb=Nl3FGI#}?0m)Zb83osa+rUIH8B76>fEyoWB@`S6 zuYl2iiQOV72mck;`^WFhw-7yt`vQn9W3T^>e9PEda8Cr&K}`tT5A8RBJv(qS7!Mu= zxBMn6!*_9Z2pk8pV9+^~s^4O_1dN)CW#?iiZ<=xM z0w=-SA?${av(62wz;e(Ej)0}t@`itg{hsUC?*W$M*Lj}!v#f`M_wyXe!>ia=2eR$a zIg}2t2gK)4`ZxOUA*C)d`d@}ihfYzrS|!K?y75AHg4Xs zt;6Lk<}?06Ib>crr@XqxcDY^e8S|T*kdLZ)s~Wv^fKE4te2S+d)B>a8m%k``t$xhY zETG99kKDkD*p{}PESNCjS>7y;rC-P``7u9VdKy!;Tg~2QHl|77t?0mJnmhUP4%arz zw!x)ux=I4?tFo$PqfTzBhC8bVOE=~-J>;i&Lz#m*;Y&DY4dM65dz)9a_;eq+Wii@-E0>_%~`qgU>Xq5Oz1+e9!w&<9P9;$z?)#mA2EMiN}u%zE6LDfGuZ=VBtHXv826K)3CQn7 z=qsQrA_@r;8`1+9;Ic?Y47hp=+!o8u|(;8w4zI6s?|_?*O6FTH!u`=s-Af5A8b^n5$? z`GxF1fVV+=@P8iq61cjWvYx@-2lQUh0QQ1cz?z&^#FQzO7JAStgw&w=9Uv_H@Y&q1KDGth(-t_3%PyFkxY zUQ8cI;Zi7p6e&tW}9;lw_?^JWJJX0L&vqYIU(|4NB=epLgoQ0Hnf}G9FyS5?g_*2Rf zs7(7!^ZH#A=!E&+eGBd>JWqwrgf54+0>wE3eG^>uXY{&2`IG-ho^K28d!Tio1MCN{ z0`Xl4v~E77{Rp!oaGq!N9DBgaz~rf=z6k~`@P0$77q^7xsIQE_@T@hy2exE4&*cq* zhrmLx3mgXnE7&~)Q-L(S|Bu<_=eZ3GuJnE-(1lSN`1?L2rNPLeTDxgUhKfpfuq6QwEtuC`=)M}x_MLiOCAXVDvi zAGO`tl3AGesJFqE%wkf@|*Z zWi$pl36y|F@H{vPq<4ZQ*MN~hBR4ZFV1xE5y^G~@=&yLWqoMM<7y1I|KrgwO8QR)~ zTD{YGIq{pp!64^opuPuDzoI!2^VZZF&E`lkg*%!#<6?Ed`XuJ+>cw=ShGtT-Np0Df z_D$ADbw{ZyWpk=)YL}&RO5;SQ*=1Gps%x-GlrHAqfzB>%pIh~{-tNd-!fLLTv*}8u z#<{UvUkd%S|9-GlA>U`H=6LJeeA`nSg-tKn=9*r?X7Wt@?>1)ze)8~B3+cW(#m`dnS`Dw?bP=^l~wu*%1b31 z4^8y>mB&MT%?tDe=q#8E<-p|7ilnW+zVl>6;p!`7HQrsg`bb%rcNebjS>3JECA@={ zivF^*&U@R`kk(C3BWu$}Ll0K>v|4rabtr9($0)r}$*g@H^q&evX3NGcZ3W&tV_HR} zdJ$dsv#N1TQx`o=qR~q~qkMY2pQFDGE&g>zNiZ0U0As*i;34n?Cba9|N0zC$O3-p^z zJTMZ7Uv$S^)Dh?-;4x4Onm{Xf9=rfv2WLV5-_L#1_Qp>5zyZ{b^W8f{|zhBHwxZ}5(<$`nI0+>9J_IS6OkFXard$#Oo zwI4N=uo<8nECuyIC(>HM#jO0wk+~GqgC?*S90Di7>)Ug?48mGwo} z7fyY#3$8~v{M@B%mi za&~_Mk$f$<9^44jf48?^palEk%D4Vojc*$`01koU;B~-g;;f5j@Vpq*0a^b&?C5S+ z#*BEW^`Eu%n97ntZdw0{dP@f5AO&a1U~bP@TIM-r$zUPqk0pb-%#y*}qVzu{I+5wE z04+oo4L-E3)6+$JJ*{3Wid-xj^b}lJG?+`;$)dsBqOxcRoLDqih-{FU3Fo9>(GaoJE8Ai)!8yTLH#l*=Jca$dBA$(O{vnXwWkyGuwyCqQOE{BkEV0 zOQq*|H$Lm>%8j13?h-YN20a_RMT5Cy(V%B<(O|ybqQP7_iw5&CiZ)m@n9D30%q=R5 z22cGPQBUCAole8pq9KlF&$4Ln{7vgTEwAy^ml*E=iv|`bLk?A!c-z&U`dT5|K<{pL z6s?)&$j3|Cxm(m*J(wKXMEKCQt)hKX>j&d7iZrYr%!NMA`oY|yvVQP%?h;XAVEtem zxUhaOm#iQ3Y}OCvFPgJ{hGR6P zq??W+%oi_ZUfE3CTYo1vuY8zi%`0O&4r!-Z@1@&uOq;~|9?+QoUfFTPa|dSaVeVk3 zVaJhLJbRF3M?8b*?U-FlIlLEE9wSLVw(__Iw^na2)5>G5-iPX||7Ow~>P!7*=We_2 zWfZO&=lPZ`Td_hLNZv=H?QyZ4$)y~^ChOWhZu`N1)#CiS5% z%&Azs6wAq#E1!90{rYVk#@8MF0JivZ=gJ~!$y3Xgty$L{pZxnKPc3`qnYOllX?n(u z-NAM}GnUSMy54-TwWxXODRW_??#9m8(%8x{reeVAlrxsb79tmWsA&z5rLno_=Us>_jpY|x z8XHeck%gtP`Q$8(&Bv%LjrA-`V^PgJWNB>S!OvM5=lgj}=a9$*iUwZ;X||4F_@!2{qhnE1Es;DDP-lB5w_01wY%_Y&M+ z%HB3O1IEv07a9yKBMxW>=fQ+ItfPSWU6ktTpa<)aUO>=yDKSYn%*WZ$P!C zRg69=i_2NXRXJs?G^YLqH`Ra!khRh{fuF22t_Qb(nV=5r0xyAnUtt9X+zrY=Y^8B6 zdMmx&TVhQ5^NU+zjGE309FXKEpf#Wc9012a&z2Z3e~C4{DP1iwhCbk}DoO)g4;}qK zSh)jP3ycb6$j`4>n#ILteD#*}hD2Y$t!MhI$l}8K9Z|+<_9M*azuMyB`e|NYSzO!+ zWO4C0c&{xk2GH8g;$k7sJy~2N)CZNJEH1``=cvDXpDZqlA7q^p+yd?c6<|F$3C@9= z{@80Ji;LA@Ke+KB@3$D*2o8bc!LQ$+kOLsUG0+ErEG{a5a<@Lv*y7?8egm+sxCNNS z#RELc;$l5eyqBPZ{}dg8+;xGzJBx@r=#3u)-C0C*5Ox%FwTO6Ss!v}nQWg+bY~Hc{dgjEkPbFJXkfTl^3>Z zu=am3NfryXSF;;+dP7Sh{;2`MEtYDW%WSQ+! zwJ_7jq>^Ik?B;cD*F7swJj}^u@lZaux<-~N&VF8LNlq*?epa~4UHi7Y+|hPQW|hsU zsGPq*~2&R>6O`b!CH-V5MX{Zr-Mv>FmJFH!Gi7*s?JroqS@mW*U%A z{mPB4UD}C-BVl7J{lArq^gu#rYGBJVDS_}NtDd0n%BN9vIml;Cd;T~k{{Jr zz2B$nyR=w~70R}(eBj3g*_EXn+ksBg*5Te_UnvCF=YunoSthcr5(n__>g?3a zzFAiA>DW;yMJq3p=-y}hHgaq7EEavC>=k5BDEq2z^JnplB2g_j^S%^HO$v1@xIzn* zi<;-otLWJ@z^{HKb5P+0Ny~p$^Pu zQB!r3TO?y?(#_mRR!nzuq4{+XZanC@Wa+Zy1uO>1)w=bW-kFk#EV6J#wGT;8)#~oa zF1ond<8K1hNVS9O5xSg9GJU$EL3)&)9&rfy)fkpa zl0??(N@n?ycHVq{vRE}&ePe1%XzwVdrcIW{Jfyd(k(o}c19_=mnQA~@RBAfWmHJ7d zNr5}E6AU?HbkC*=Uu3t4tD-XH!4<_I#Wh^)*zM>_c>PMXv`oFQJdme3<=j;oYk9SL zp~XuyI{FcRLyP*pU|E~h)nXR%w^T&YMC-)*PEGR?$01))--&DSlC-38Mei9Gvq_Up z4%D;e$)sfGR%~f2&_-N8ysB|aoBoC{9TDyQ7==r7E58!%QnHX(V^Yp*72+Y~#%Ekj zGyOzENXe|ar#UU24RQ4<%v4Q2EpQgwD6$$~v{?V9Sie%OFfXq0W~u2)IdQ_zLR~pg zigD^8pXzNgXG=TK+G4`Bd5cqLQBtf|swK#e< zd7|>CK37()_YjrCGj@=iaaJ z#;L{6%yvpDqxvalDXlz;v$vG|tF+R0uDHzcR_T?+wOhTGks3;ma+ws^B?y@;bA+7zEKSCB(uWHQ9B@{|s zCSN8Usns>~6y^>b%a*4-8EsYL-a2xU;fpn){+GJ`l z?SeOC@r_C*^Ypm&Xsj;4X)&^ty03SmUPoWVUGigE#8jzTdBpzswQS7PJ6d^VmCk)} z?bI{Rtk&FU(`F3guwSG`DYn&=i&1)}S*89ic1a8GF^(mP=2kw*oBs;(>o^xZ&0%?= zedwD{UmJGvC>`63=VFw%VlvdaGy}bax8lBeXO(KfLK<{=@9|rte(0Qw{&l$^AH9qI zj5+!mu`=R)Ro6uRk_xwUjpkdH7VV*AR@ypW=4dt2r1Dnv zc67JCM&szqO&q3a{LEX`zf9|!Of@NOXEAU5cFZ6BX^{$%5AAfxQh&mUR&G2-JKz#0 zTvhY@h@7c!#v#pkTUuN4{}T~fvm}|;qLL~ck&8!1elQR5`dvN@UAlgq6}nH6=q6C#~i zDWz8WT*fpN6}Kp8cHO+f(perS_~|C3~kpfz}pl zoXtV(rcAWz+{4$IxcM&Dz6F=2@?E2UXn(q1?MHc6+_Y84l6$KG?a`m>)tIgoE>0hI zS9a#FbSSUoE2IbKSz~`om+)1M(l5+G&EF{PIea7PEx|pzO!ue2UFfZ$rB+^+E%z(F zZXQ;MPnvZAD+zY&{fa_%g}Qy4ZbR|+cofv%^t>32wcs|5+$#0LYW4kEyKPuyT5oOl zDKeHQp0tdqrDcBR7BxTRF7}UQTw}RaucyuJFp_oRn%D%o-F)Ay;FgmyyW9KI*Hi&LcCX$GPdUBBy~{VNV}lPCQP zO1C+ROVCP5xlwK{H)&3?HB)!4yyrQ|+dol1mtQY64tJXy%fZERrQCf?J(a#(%jT%e z{LDtD-|gR-RDArE39|{^c9o9jv1}`)%c0VlxvSP6Y#!(LjNF%|wtR%8zPXrl-1?rjkcpQV;I6p$n&P&|J&v(`A)Db`sXh<#f!eM^@`DrfD25tu3Cb zKe6^|+d1uN;(nJ?@vZc-)JoT6injyAX)^Ct-LbOPEFg>sF;`ZSNu(TdWxTL@$x@Ya zuJ`Sx#b%{hN~V9TBQ=35%FwWOnRbiXw}lZzag0BfXR>1IR%q3yEUeb)bLpr(9`%!9 z78Oe~sae_)O3wTlLH%r+c}=1CgqP3tbK$&jlf%5w$M^fTc|4YeQDpgPSU6u!ku`*TE&t4aNI!B#Ut@%Ydp(pcuGwWN zCz?Bp36mv?7OBOArQ8wfhum%+pIS`BF(uz(Py_szc4RSOVWy`^CB@WYA}dck%-8%r zP63OFSZ4ezU0m+yOJbSy2?Z=Bj3ds0QZ`MElB;elCMCg-M-l^;C z%C{Qox5csadrK8hyrOxdbvM=ymQI#hdggC3<8rbvYF7ASmk%YCXYC+AlV&9l#SCA{ zA!hE@Mrv*xGb@1>5m`H!JW)zNwRSN7SbJ)*ALaDz+NGRLLuycJ?O;-noM+!){!yIN zzQMvMjV^Wz3Nww2s$9`5W4B;Zj7t=WDy4#U3o(C?sF^|my9MJEC0$MPGj<6vhh$xv zT|zc?>}K@yD{^`RkzIm#ET>Ab1Bl8mOKHuORT_uXD)a0T;*=E2r0TgNNTl{?zd71x zvRJ%#H&?KjqHt%d0*sp)QP2Xw!h5q5ZM-opl;c<<@sf7IeP)wGc;2qC`CA!~({$I@ z!Y+N+S24TO*8E-lO7~kWEu;3I!Ej~vTP?)oh`RR^t)WT^@29|it6~#UV82x-qzKU( z4U*)FbK&M@?{e4G@`RRanldZ;q^N!|TJN)bk@L*ns>v}La-Oa#nZBfx?yVXxV`jk} zQ;SoGs%|06?UBaeuBG}`nzu)4X<1#eIFe(z5|uyou*)8)#TO6Zd3&UBSkTMuky;v} zhX&f)sOESz&9@9Ni<40D(J<>S6Scb(byhm!Gg{afIz#ggbT8SyO_?aHR%PywH zF={y^4b5S@-Nj7#sr8nQC~raE*Xcf{_|!5KCQ8Y}C9b^ECuMepjJxL@8RLp;DP>Y{M<(XAHzR8P z)DgZ{&4>3B?Z_C9QRy#ExH3C3Sq^DNee1F#BRGQgE-JkPIsY$#Q*Ev{zs<#iMX)QrHVn2;AvjKq1L!(Pb~7 z5T7J>08yundZt3(Z(a5Rvig~x7o)Kjm$DaN>BZF2GCy;RnxAqP`zxmwc4>P77Aq^Q zw{D9s%Gc{f_X1-6SZnjormLJPO#a4`uApCZFTi4CrC!V(r+Bfw081lF<1{Qxxlyhy zH)&2Tx))#)VyPynC#rasTHfkHH+un=PIoj;-+1C&NtbuC7hrn!l$SW|-tb9g_j>`R zeU@4(=5M*9Z_TYwM|%O{vp79b@m*{$z|!oF#`2BF^y}STfW?X>^;DMP7q6(RKNr~x zF!|llI9=nh99UT4y#V7ju9zxJZqbYH1(>9mW~Et~7*DJtHKE(R0OOD4nXH)hZZE*3 zbw^Dr3ugq)+Y2y%qlD+}1(?6dVdm0hFTi-R6j^zD0Tynudb1ahjbrXY)TP(WUV!+! z?ghkBtaj)fm_IX}bT7dCdir0AJGs+UcfCFVtpzRNj@JXwSAfFKK+n%DPLhB2?o0Wf zjjM@sH>e768=%9^6esTt^0Myac`{Hs4?<@G-D$fJ+5t|2x52GHEKVK<;_I8Vv~1e6 zefzFm(?8$3An5a=V~&6Sl0OskKX(zU6oiSlDxPmj4KrJC3jCE4b07 zqKaFlo>`L@-}spGZGScmA*EUR{~?8%G&r_wO*u%fb_E6}4GoQ{pUDzMLd7C-o7@JA$5+&xn!0-K!?O@kh0+4tZ8IA&1(nUONo^U(9Sy+TqVxkx*vDJx z{|m_e3CL?=d?we@k-y2&^A+3=hJA~>M<(XA_>@J}g0!5;>stNSkA;f5?-chhKf884 z_ngT#S;jf^vTuoL`5~vu!CCMQ==VmF+yL$dwcsQe@*~djgF0{o3^>azFJLj)0ZxHI z|Bw6s!F;d-oCky6K!Io|~X!z+K=z z@C2v_O<;%I$GJ5D`rt|KEQIzugA6bT3um`*hP6MTL9VIS$BlLFg zFnAKU8KhZW(3`Qgz9h|Ix&!;@Dc%Wq9=re!gKPeQ`%chmICK=a72E-o$|UF`paRr` zJ>Ue;j$E+vaQgxN*4@5H8vx*Q*@qKCw(DOUc!LO1g zxC2ZA^1lx{6-)ySpc(7}uYu$TM2mQHMkKV!k zpF(Zz)BMw>v%gqN?QEu%ksyLz>qzt;1@Su)=a|WuO1=t&NTRx566Bt#57EZei`P zd-t{9p{D|4!F^ylr~)luFE|C>0mDwv;=p5IGuQ)O2B*L~VBmMX`v&M}Fdj?<_k(HR zQBVOkgBO7MnOC6~zyL~h7?=p20ILC`1YgT8KiHnAEc&B`XmOwep^P^4rsm6?j`XW? zy^Zv%63(2`liK^;xl?a;FRQ}hQ2J$HF=zyv!3#iP!eO3Ifj5C_qc61?8-3_ZXa)G` zL~o$7(#oB)E}8$H@ufbnh57<+29kao^iJ>ur~++3{x3q0fj2=v?XAtt80ax7Yc}|2 zjlcqJtJ2fmuDvm@NpIw~_7_v$MOjU)jo(P*hLoBW=GHjRdf4nan3y&-ty{N2e{RoR z?h3ycewzD7=gzIHoHuU)rj$#U>b6w%EUUb%mR8Byvv=>sJ$}Ns%qLjK0uWEK_T|KudTewkjw6wOPGtVEtg*BV= zYYBc8RqI=_e5Gac7N&lB_oU0M>sCIvxOLrJcI&#iMX7xyw|>~gYiZkKTA^=6%?kaq zy!lw1QSiT;*_JyU<>p(~Pjolq($~q%6~)PKZm+JJcW zLXUtmpx=e!WCW0`yP=ZRmw)njkmuzqi<6h?xi>b1H$!)Y=NAHf6?z^F`VamO8H}zk zPVR(G2Q@(HNw(-7+$X?I@9-4{m<#prFS06YeQS0{^;LuYpXQ+Z3h`*}A%FPNe~~T3 z$M=dxp7cLt3-Op9Xza%~n>%adcKbLz#j@DcOn3iH%!{Aqo_RUI&wV+?eDqXZ{y8=d zw=}Yp+^2Vu7UJg%OiM928>Hx;V+-+T<;zV8=G{fwQ#|yse~rz{v&ki&IxDF;n%aOn z$XK8pnhKOKtO^*NXnr)qJz`^1u1kA7N$;4uc&B{Y?HW&jY@} zECd_}la4aG0atyK84uVChQ7?46r2Uazs1N2UIL?z!2?>sS#Za7(>zN^p z1rLGuzZWY1I$uWM6zKnw&*4~TIXD2$f&qWWcNe%FOa}U%c@R1iECrjvQPA%&-xpvs zxaT?M_0W$0&0Gyy2XsH%X6Sx!7@QA&l6T$Td$}zyFiZJglmPDgz!Sm0KF~JkVQ>R) zVFI|6^`&dRhHl_VuoyIh5r_ERK}YF!H_uamo*#jh0_j!@Z38F31u&YjngPVu(|XzD z7d=l6v<2)1l6MR`W`_@ZGx+sG7sbr~K8O^o!G-Uh!u?)3468YrCCssKkSn{u}#gF<;ruO z`WUDIO<*rL0+gq>po0(ae!v~T@~Rp#DYzejwu3|9ICvX~@0!rMhC?3*^FbX@&#)hy z047f@@h#Ag_btDn&@tgT>I>8F)My>duOe!lz@IG0t%&J%B>#;bR>GK>q#q(Vl>`x*xh4>;Z$H&uKrCXYn=$zk|@@!S5VY{n{hctKs1d z*qgWq_tfC0+FTAAf%;ITcaZ1TKtJB1+#{gV!TR7n9w^@e{+zj1O!VdGTIRUDISp^& zSsLCQ{Ajf*H^-+iNvGaM|I;e&;UR>bCEdG}KfBfGhIGY8@fAawPYv2X2~|C51;>J) zc#QWo{1Q^Q2Dp}G?`GeHJvpxaa19Hw-`%aGOLsB)0Hu30Q0ehH&lkYt-Hhp=6UhHn z=y^S(#aQqFC=D8|hIWF(!R_W@1^%bCD)jP__X5vOZt%MReRwBj6?9=9CL0a)09w;^ z|I?~b;x3?CBfXyp)b}7Zdtz3W{!gp*Dlvtd9R~Bk6;8^?hdHrUd}K-I|1oo|{-@P= zFGi^=;YQOeCn4cqTC*XH3d*NirTr7C>XcTbqkm}4#(KAIR`N7McdJ@yZ=pKxRutW7 zv|LZ&*A{bnb@LCc?^c)hJ09;+BS+>RT6>!+Z!EfFHjYKB)D2kSA6nxOtAV2QCE9dK zXYs+$^+RzSYykWi=Ifho_|tl+tsM8d?!_`q4|Gu7%9DWwgxXYre`qZv!6X%;v{2tZ z!#}k46dz68KeWa?#Mg`<{fE{#ESnx}S|z8^DK9t1N4R=|E0K@VU_7PXXdtFoxBfs{a%VR>nmbP2}bw&b|(!k|0Uv1oOQ>=``5}_ zUI|fdI?Kjwr`cG@^j4@n%B03e5~;^|=hw0_;btylzPO^VEwpp@@>-}U98qgTSJjhn zUro%1u3A$I_w2?Yaao2ww%avK!b@f;x6#T~EQ?g4Q*3caoJy$88rk#i*6ohJkU#5k z%4go$wL*Mxx(cU-+KIJrkM6}{QR=H2!znf6CG{>h=UP}#l=l;E&dqZ19yz~hzNDF+ zfQ$Ux$q;jkA}^eZi+z=6r!{xw#{O`tr9}11Lg9Ajn#?WgYD{`dZX6PqDK$bd-7UF= zct|tclA8@BO?Mk=>`y6hORo74H{6SBK1QiQ>Qpoz$h#NU!h1u5^k`hPSZL9(D%FA< z=G}{HTtTApA&YQ1w<-9v_W4^eId-8YhIoum$eCW@8faXF! zl@vGOnvYTVqPbYe2Pd{I+$en9>l(SZ1vhd2X}r4d)f)i;HvL7LF_GNhxXdZE2{uT-mz&!z_+b z*Au4aEzLJe;mVx1%yP(0%3byyNI5!h8OI`|BzM1U973z<_Ac9)ucx|)F78xi%ukBp zRAuZdDU={L-FL~>- zPJo}jj?>atEZ(b5nnvy2QlcIBeFm-6T;xlNo+v$uYVl*rDpi4dUt^A*-XAqwb9T*2 z{T)Y{JaiY=${-HMFFo68>C=k4x%bsLdP{k4{@zzNSB%q*CAc0{Ir3lKUD{fA@n{E{ z&#Bi_IcN>D%bc{kxaQBBFd4E5*0)^rbrfr9F=86}M$IgxL0(OY`6P!rp*;zmxhlv< z%?qb`v#Iiq++DA+KitwantNC%^`5mQOP#pxu2%~cC9cN%=sVH42?=+-#{3H9P3rCF zrq}4JBg@6;lDXYA%aL`XZ8%4)5K@WG5odYL4OiwIv4zCc)$B|=C1!M9IOetz5G7`M zgRAklcfeXx%!lsW-)bDl&YUQ=keI?1ohXh&V##ntXNSAv;%!w{&0kQU4p7(9dsGX> zCfuJ9W(E|eYrN#P%Q_BmRCl{=VVq`CJ5X!%ZPD)iYgko4Lrdvml#k`{_-5-x>a+Ueu>Dpkp$4t96?IQnkA)D&5f^s9E=oi#4lhAt%) zzVWrzsP!$iAFa^%x)QDBUy8g`Y7U?k3f&^wt2RxYR?p^VDY?5teM$F9LZQ5dRi#)Xzk1J2 zN0*v2@w@sEYw7oqtv*C6KJP}la^QAVa;L9*)RNp;ndv4_-2>`1iN5$RMGv~Z<<(>A;hEwX= z_b7PtXO_1&ZkJv-?OTYSxq;rYW*a@UB{!Q3w|$xvEcSND+MThzp>czryghx*rnU~b zWC2eYH-4InaesEriZ##rvjyT-h=8nWQPL@+=T6TLcp3UPR6Tjl#%Dr|@<2BS>dtf^ zX|~)*a<_b1JW>40o45GWwn|-o=u|qJn?0X}5uc)Y6 zP`z^1`ux)mO3^^Bxs$VPr)eYEe6h`*!(SLIS>M86foz3s^Zn4arFOPFtv!dOVlj(tO z)r;3{NNb>Y>75w(^pBdmG+d^qUn~`q7kJ%%ZOw{CT{5252!&Z1rXhLe9?F_Ux`WcU z|5%c^d>QJtNlS~~Xx@V6^rU5`?f_*M!RC(ffdHJr{QJ*7|B zs!eGa$_9_34x`F~t&>D-YyH75>n#y}>QQI)49pfGfCXZnkhCC(rB zbKbwkxk0YBv7nke8usbg(k51TkJ73*c_x&!csK=I z*X&Z#D2YUU>F?FE<=~2>bZ%Ak;$?O9JJXa+vX@t~CRejat9)L{M{eea+_+rPH_Ye% zi}?3KlVG)#5bo9N$lT^2uAr0C(R3me_9YZ5pQ2=$m7S|=MTx&C_ia$Jc?&>$&I^5vu&T{&$!49H)#4A9QnCh zGtDhZzf;0W?~1i+^T%_ANhT%0?Ucx*5*Pf18&0P0{3(rmt^VEm$SYtTef1N zZ}L^&^xP-Wy_Wt|y8HyBa;h@tniJg+LfFE_w682m{Mmw{q{h`?-sUpJ>zDBF#e8A6 zuovLp+o^xZ-HF;NZUb4dvZ<+= zlkhE@w(RVB3e@5kqJ5G%l?xZ3{!Fl{1TC1AEmppgtY~HNfb##A_G*b!Kv)rGcK816%`d%rYKOc*{YTf6M zf2V*(kftWxoY3|5j=TPevu5D=Q~vgjW}bC>$9d?{Nm%NG(?B}FbaL&9)$=1`_XACI?L*R8uZ=YWpVTC zN%C=KJeIn%<1PPjsM5BfHZ3YUv7C+Gg;85^8 z8t4h=DR2gy1I4UEh<5;VNO)E}jkTQba`)2Po2QL%{=ao=J41wOfnZ^xv`E_eqB=k0 zlaE3D+-@gJHL0KLBdHPelFy|*x_H&2nbZ$NJ)7ogika=(6i2Ox@vEe=a%o-3sb!qyClAa-dW!HNrXk(b&3~FKF|N`HGSbSB~htg!^4K#AVti znYWPHj|;axnex;Af;$!EN0>M@lZ>>6#*Kc~Y7&c*@@h$86kQ=o9=WU6bn25l)zBDf zv&BG4WzCAVz2X++kDt4NH%^te!Fi3E6&u~{Uy^9tZjO}xvtb;^xJ1!}`*uweT->y4 zE@W3?gS4V9y=zOd6^bSmHC&6PXTz0A&EoujEVR6syeuWPow=JGkonZ|Ouf_`v|>Sx z-P)1X6-zUw#P8_Le3g8Fn>5Pj*DR@hx{<3sI^Fy$juSsKd(PbatI%w@#copM{{b6a zD>wh*q_Lwj)l*+N3ZW*Z_x&1YOv$JAL)?G=F&}ervZ-6yYkcB6($J7 zIA8W`VWO<}yY-=k3zsd!cvdS!d|&LL^b~4{HLz#X!rc86bm4D0!#Y*x4z%fcoyuY= z6;`?U6Zv@y7A;!At#|f6dX~OX#SpA!n*^6O7rWRRnY*PYEjx=9Q%SVgvd5TPsWmbk z18d%*f4j33jn8;3*YbC%TIsVgcgd-`lCMq6ee2dZ)$UThiV2$-?_6jJ074_5AdhDF-RhNi}ZRzWrHlP4aUziyg<(GyU1z%GTU{ zl=7qJ;xaY;>)47k70a!{8QIE3U3uxo5ZR5%mcdz8Xpcrv3{lO?Vz>E|iY$xV`3m!k zDdFkeFtNYM;;Yep!BP{su`|9U#=fJBGfUCi&GIX{+!RwNoosAM%-s|d^D=5`o)>QV zR1DJrZg*cy%uQYHa$igwo=wr*lt_ACjPYCPin>ukUok#+)iu$5F)^R%XL4go-O0Nz zrl)x1!`&uI4WJ6-ZWL7T0;#m9cbVK1s0@ zMTcJYt)x#}$9xqW1?NEV&lV-ugL}aXVEmAxWIwp^=Zcc$;2d~hXi@SaxaSkBB7;+4 z%=JadYS90a!~ref4KQw4Q8E>jfi`d$4E+@RUcA;5=wsx9b&I>8i@{-V0bDn@D7gjP38n(^%z&1IMz9N<0mD9C zl-vX+gV*~MB~L=zK16Pzhk?%6pMt&xuDTXpAiv4bX<#|n3yy%-z*Rp}l#BpMZ+f6* z&?fLU7|I*DlpAWUyrw7_31)zDPzQ#7l(f)MdfdVDB%tR9ppOBiT?K6eC%^?TnzEV! z#OHRV{Tm8v7iq7y?}?xGJRMNoP;(S2d2c}9j~i+v`|bfn$rPaHN1=7#d2kfG4&;9x z+V>+x$v|)?m<*K;tDpf*29VN z?M0txK0k?@X*&DU&j6L(l^^uAaZsSc0=*SF0Xzt1f;zAnD9%ynIdJt=^m{=0lm955 zZx8Ot(0b4b4uDfYeD4H0kk<7GCa`!22zQt_ClG6T$DwD=94?zp>DV zz!RVfD0eM^?u8x-&#yrT{uDX@^_}9I%5xQH0dgOPUd!9OAIM!FC^N9k%`|#PulMy_ zdOpsx==tDBt5vzVyHyn?Y1G^3W*TuH3L#iv_2On4mnNE@584kP_9!q8Ob?R8qqIby z#IFJD0Ip?qxtT^>^+@Xs65rj;G&dI&C3gX(`)Ht&T)}facne%r%yjaoycabNn6N zAGk8a85F4RK{U6~T!;B+dNYm9ePRlCG$Y0pEV@Qdh#wG?t#l zKqqdJH_~MFW)#cZ zNR#C-8Aj>RuwpkZB!?Sm%*Xm1a+`M}jfI;Wa_jzqUH<0h@}yoY+)HC|Os2U-(Sv^5 zd`K<*?{@POHOc51{dc>3jSD@}J8H}i*;trHF7Bv_T%niMTY!^0YAg&{&eGH5i=tV2 zZ;feV`H|bT^z{GSpSy)w>L%6IGb}@O&r(*Nc=)nci`9)bI$!P9 zb*zrYGUI23yWC+n8q1{r!)`R(c!TZe)A|R2lq1f8QZ`MEk}KVPgGDJP-+EXBksL;S z8&UFZz%g09p_EMepYYIsU+3l;c29@`gtOQIdG5KmT*{)sM`Wm%gT&9On zlR!%g{|RrgO(RNQ_T>D%ZG)2_|CqmYf5OKx(Uv)vX+S!8H|&@s z3rB+chxm+y@a-sH@*rEbP$Mm#LMVxnS*dlcU$wK+h^g{MepF*M^Wj{fl|r2BAW>_V z=|9QKFXpjlQ6y@F3I8Nth*LVaa#k6JRXxRw^MI7-jvkX@rDT*bT-s}PgT3yvTII%I zA=^q#JBw9_(sFZkC;F#(@hWwT6YFSljk!xr2LE zBe(jPzbNlpts2|nT)Og);>h+hFAjBJHrsQmo7|}yOOtNqMzUhMyM4^h%2aOj40roj zs8RHEcl(%Il(OJ%AM?S*?GxrgQn=~Ie2luG$VB`Fq4JM8xEAmizdn#O49?hcCiNHN?U6#Is< zvP#g)8a}aD^Ln6vo)1TIRomot3)(R~eIDh=zP~hk|L34$fjd=5~FeM)*~-TBkSB zZPmOp@koNTIE!PYVpRUL0cXjsyHBjNEWXkv9DDYqs~YKL90qbhH>3qvYS+jugjXriqn(*kjK0sFn*WPjaBXtjirqCeQfQ zrej@r$6AYY^AGup&v-&_5Z#Jo(nM*s;Z~&BS2AdAnLCdx^_WtF3*LDY^O#04jZ>r4 zs%yfXN9OPR!ktGZ>(cK$GHLH6rCc(19u<;K4-)P?QYfxyEs4B!S$o3I-FXztA|>5< zw0X{nJjnx&O%8k8xg%(zp2gkJKZ%(IT#!iYKIuaX4?qWT-z3cOk_b-Nlr@`_i3Nsykq$K{_54ickGW z??NgRPHz!<84I;C;(fWhkj!5c?r;}U>?@sU4<-ICB!v*y-Gvl$5mz&t=v&_MNJzK~ zDdtxwZ&hzc|1Y8OG_06dJkwOM?3uU9W(H%UY{2|^`*duwcrmqj=pSxJk`L`Px*f@Q zj9T4a#yUEJGZ{YQC={IKw@ zPg7JFDP-tBw^u#YWUsGz&>Q#K7l6R+5p%@mkCrX(_cRF<^g|FdR7rWD` zySNwgr#)sY+Bc{5QE|H~L&^)g_Il0yQvNungy-D>mDPjx9KH;d0^F(Xd!ZE3QtK_w z_MOjiXCYaLPa0S&P>Sr{`gMfty0qOT<<^uepRxW~eYRRBG`>S(WeZwkiKz5cX5DIgZ`g^p#V| zmcONyzR&LNpX#zkn3Z}lcbp>aPBW1BE-HJI`k$lpo6)p08mD1?ajleJnv-nJw7ZAi z)12h(n&j@NvfMZ;R@1aQda+#TU4BeGmA*YM;jSvB7t5BM%XLd8bJuR}tGZYYE!^H2 zV@~e2CCw9bV-;gqZ#5SmbxGfuepZ>gyUN}`w{^*MiA%)%Oh4?Mte4B(s+Cud6x(9O zl6op@@moAse`4*O4W-Uigx)ypZN}}{(lZ*TYkrmk3uE5xcM*L)da-X9Ye_le%2>Bu z`EMfAvYQrbX4n>`EWT0k^A)1^?oOci z8?a(2;*8xY6=s0y+4E+NpG>}Z?|X4NzxIRtM<}@R@3F%JhdzxpI`mF(H<$qy1Nk=w z+5z1UUIpjDpd;8K0`W|QE(Dvw9&i|(1?}I!eH2^%Zz3DK^%<>E*p-8Sl6#}W1{mhckLZ>HO4OT4a*;8z4yt7t`c_=T9*6jbAujv4{n`4{5D0A>Gr;y@s(=$sciS!hb z@muQ^b!)+zGx*%uDJ0esBq`>M-6l!Y-Vt>r?<`VJamh`Wvq+MqIA=cO>w;197iApp z@hp;ftOVlpO@`$`Zpn}N`5M$pUUU{o5-g@s-iYb%fVi71iS{WnuyImPZPLO*I;QO$b|CW84H!$W`ijpbd5g;i~K&!xV&;zt3^D0lWxwzUWk-ciiON)1dEwvA^iu=W;qk=~C! zE;^Gm5Xm}gpf@c#0=J&&&!RI)*3*fyZWPvN)k}TO^Z74MKYrx5^!MQ3vhVz5&H@3I zT|HF#wFJ5&&_mFZ;BC3bP?Nw|pg0dfE5K^d2^3%c2Y5ab+-IPpzQ}t4lfmOae2W8Z zh8FXl2Z3QgJ;U8#8Zdcki4~wW_;o^G4$o0vsF|`^gIb^H$DGSLleGNv)HHAiya|Sk z=EN0v3{-&^fHXY^z4Z&^53{FujWHyz^75;b1~A!B`>ZA;%cwa|lBi%n*VxL+}Y9 z3?>X=2*WT8#)J?;2qA%dXmc*Q%iEtiz4Eu1n*eDz5`N6GiJhm3a@mbS5d5fjP*iXOg0<`}ue& z`KfP}GeYTNhNh9#;!M)9=EOM7qqI1aG+KH}lFlSW8PZqIB*nOT4H-q{nWR>7#Oqm+ z_Jy>G*SsN}Noo`CT~?LWQaLnIDStYX6z?`Yq&Sllxk^zy!768x>M{H7is_T;sGklHM5oeO5C+dvXDod(eu?N|* zJpWppNph~S2FlqbHKkUSGfC!KdrZ$;-*1%4nWUIT@}q@mnet3h%)>3ms)bsn^$J_D zwoq@C(ejJsahr%%R@d}ql!b7)eCo40Qk+S0K6UE+%#Zaj&y;?QRm>8!cI8Zxq^!*? z5K=O03Mre`w&FydQ<_=>Bds`-^Op;3y zrO{Y9lcYG;JIWUt^@b_VB(;)Miqy_(Lv~YJCf0#+g)>Q(a9*ao!&Q2H-PFz`IYp#S z)rvB5^9)jD3TKieD;-V~%jgy`P2X91`&P~*#njeftx9Q)>3)`Hl42^Jg(J=+#dU*wD5+~x?B26|q(O7HT*OM8NyLKN-AnIvLWmT{XZOgW1)Nscw8R_RQV!=khWXOhez#4dD)&{UjBGRHLa zo)%}496ugfXb<^06{X-zl0($Dawf@q(?SpH!seJ#-*hI)VNt%i^D29rGf9&1J&H8y zh<78(kY7425aX!}JG7mex|C;<%!@f9%^n-a6gA`RZjLE(oJk5H&Lo9UNI{O}nIuWL zyzVi?muHf!AyVp;&LqXOqn}BNsofIFwH4p-qLidOlhjII@r zXOhIB2I)+aV?}A%;!INHsuX;C=bee=xg@uk*QXqQDb;fc@m&52vXPaU^ z=<=*vHBD!m9B&$RIG?oMt{pCwvrUd|MN_F;oNcmf%q?E0^=$0|WvehVfmQwTZJ4YK zv7MA+tT6RYXPcrd-a^}yB3iaQ z|73pR73ZIv=Gf0aS=%>Bc~aHRKef`%Q>Hloq*y|nf3h5P8)4^ym(B}WMwFbw`KK78 z7IBz9SULY>ek)2}D$hUF_n%(d=KPb#m?g)eJbzl8e~PK3(P5R9y5)IRIRE52j7AwBd6#MJ{L^S@VmnBV zyJ8)BW)|n4#;YOCs>AuG(bCaB%JWaH@z9me zKPiT^>HJfaB5gSTREsIjKSi#za#w5TpQ40IDxR;ot0T@o#rT+BIXE5VFU~)S!#EA+ zpDbhQzKK-r{8L>*xpB8D=bv1fNZmis7|uVrtk!Bu>z3!AT$XgVit|r_m(D*qC*?v8 zwewHb8YxoY{FC*WT9Q1|`6q>)N2+Z&|KvF3T~ALg;rx>&O(iX@gbs!kUzl@lc+BQk-~^GP>KIe^SXL?-I76Md{Ms$0$#}<@u+WpYtF6{8OtG zPB|K-O~U!7c3PNuKRwp@r*>(_;xiscoPSc9R&8g#YD9aL=bs|q`4L|^|75-?@#Tr9 zR(Vk_SsE)Ro?6MNEU_=OJy%jW@zkosF4#a$&tXyX;^=U^5#MRc`#I)`C#R@u9V;AjWTfevLsnwhLuIw} z>4|jW$$8Xi%)@c9SBh8Gr1g4CJ{eb;4MeT2+N&O~T*MQttjV-F@#K=Wqfx(QVy#rB z<2mspT~YUV>Nb|Vbn>;@=ERdrU#He;zH7%@rsatz$vMqvRC4qs%|7#YWQ!9|&a)kj z`Yq$~v70K}V)gZnsKt!s0eSSFT{p3wHhljWm6>xy*r6HiWUZSAN_<#^tp zl@m|qn-X6+@npXB@Fh6n#FJ&}6kU}QPmZ^)(M~+o>*qAq(Tb-0iW5&xZz_4_9lGz~ z#8cEF$r#qX;EPmG_R8~>zE?dJ)AB@&?JCaSRJ)fImn>_QlPuy|sud;QJhS!w)5=Mf z*mGK?W}a3%wc`9}wGk&xTzXOZvO05f?K}MMCd#P<4%bUSuc@3dv0R-h9p7**&zMNo zy}(rR;*0X+9QPTMn6GuX{0d9Is9TjUZdpsh858FkDZM3~F|l@OpxxKz(^byLdZ}mI zGbYyR{9QKDb5Hnm+Qt8d|3CnpG3kab0z1G_aK~euI{~-;TlTnv3m-=Yd=BpXcl@;g zT>1q2Q^8?y*}rG6D0mxO^(4I;906Z|N&kWU+~6Lt4IBoYPyLrTV{*YGlm>Kzc4tiX z5I5Qxlf%S!{%iDr8^FUr`=k4y+DU#08qb(~MEGlP-lKW9?e)+*!3?k&90ERLa)fK` z%>6DcE_xzoOfLFY>}m%(W6}p5?-`RpWOc^m4XDnTd@3E|IAikW!?}K^A%E}u>KT*A z32XOpH}tdX`A2dQ{_A;5R$g|B`zF?gQOm z0PF*wfs?7j)!<JzhQS52#h%)CFvfN+TIg%efn9HkkB)4&`b0iN#zv*)%z3B8glA~OYc8=sU?ycHT z=SVIpuD|_rBp3cu`ZKr-Oa;T>4RFf+oTUSI0F_GTNV>TmQ23u^-eb_IU>F=McppPM zAIQA(p*H}XBe@GIJx>)ho+DWR?;!X9_#DX@|2&@~xg4r=cR~li$3^%8T2uVvJLhrW zK2FGicIP}kCGHGbVdOcFJN|xtPH9ByoJS9mD#!7i^LU35_XUuKa|%t;d_3noE+PH3 z;I2YX`ub{d&g0%9Kjrg0*P;gs-tnCCxUERb2rtfRXq5BKsgu_(`x+F1>! z;G45@R>ORM*O4-u32>}vvM!hZDTy)h8;NJ1Y@g}7-7@gf&T@xE$*0&^9=X!Q7prEN zm7V2v8Hf3nA7lTxB~7V+%YEUFr>y0^aPvsha(B1msY}@1Ev~;b(Ux{(nY_R#{T**nt&w(r;Vr z$hJhRfpT_9O{rDe9of#^lv-7GQ=9KvV-d-g3hirHuuvA4Jb&J?Gy4o-7mm|7|M60# zldNdPa;KR}i`~@Dr%s)p`PLcR$#Fa%irv)W&{CD%)Z$s2TOgz?c2gHAn=?vQxMIq> z26}ebO>KRmw0^mp+Wc60dU3XRY1hk$c6JHrLFI00Ye92m|FrobO}T&CakR#WebI_@ ziA>e5luS=n-Kk<P{ zHr`*^YEj$wtTe8v(zsp4Q#eva^UR)>`<`3n?3C6>@6mqNu$RoKxbNjoWb=@&?K*Z0 zJ)-3fW5;8E$bD^;ovxOR)a9+yC_~;Y_pw@r_{y$R^W6s2wA@wdxMSZ{s+9Fo*2AfP zm3ujzSDhlIHQg3_H>19Ef5N^NY2p5a{h5|7Vp{CO+`*R~X^MTA3Q5-KlATulTw_AJ ztd_6X!%x4{cY|fxQP+vO)OJKV##9=pOSvP`C4g7%h_ozk!It|Rou(DlctKa%*%;%~ z*lV$~(RsOdI8A-riBHcOv9r2R1jmQO9q zqpRi4#+YB!;dIIVsyA_EXQN|V(NyXdI~y&l)@XIjGknC}L(7@EhU78o-b2f)AIH1J zU8w9ml$>Qm>7z9t>DCl!nrq00x~e~W(^va2{-TU>t%u_X;U3NFE%pOij@;YqkCTK` zQ-`*D-Xurc9P_R>X;B9E;MATI^7ZsdR50R$X}-)%IpN7G0z4i?USg zXS7MneNj<1_7n4)`=Z3*{)Bx|mN9kTM5?wgsxG0D(c4Gti;|p6E$R}XvBkb9Yc=Km zmHVB{BV}#BlVc)9YLxv>mPCKr@1(FxnQ9UCJ2_4zcY8QJxrF^rmNb>Lw317?-^nTA zmHVB{V+^+4sbm@JZbel>^rkhbC{Ismxnrl54!44Ir6)__u{iQ|t$2D;aV|ufkS_P< zw9-r|^u=4*pVLY%wzG0-y9;8({v2sjYL{=kG?wC6_UAaiNS&v74vU)Sei6&+xMSO& z<5V%1sC6v9(~B~T9CLq8lvh6Wa6LcOR5G#l<^3FUe~z`+wT=~zIgYhI$9dFg%)@aW z{jN<}lQH+_SVPo0p8KS9&aE=bZ?iwg`Lv@kf6K&LsZ7VSKgZ=9Pn}{JMw6G$_WN^O z`Z~3C^Ibchtu6QGNX}_SqmmnIe~$BPN27krxP0T=pW{?f(^zdNS*1(;XN>(h*58iC zd@bV|IF1>6i~Tv4wp65wQ&@ED{W;bYX2im%NGeJ9qs9sJj;C>=0(cWrMjD^t&iJ!fAFa*^J)3Yejf8% zQOd1Ze&y5+B^|L3C#I#O>a<-{l`T8hplqTwp9*FANkz3x${cP3oVrP(nJZ$J+o)$uF`H^*AUBo?g{Ub zx%3%U_JMZE*hAzUgr5LMzzu!uJpkt}#?v7<3@%&39t?2KQuZBymEd!5?K0Lq!C`RT zv&4Y|;2rQaxL`T{Fu@YA2fPcys33Oy6_M?&@P@^2b%E?_?oxO8Fr zT{8C)H`*?lr-)wzj(`uqsf+UJ?W(G%Gv^WuEUMqRZ_<|gQPcgfs?taiyf3Dqu{<yOpJ+TNZ+5u{us-^ zOZ#IS7A2oze@x^`6W?MZ_Q%v^9Ok=zjQuf|G)-UaoA^_3o3GoV&BEHCQ&J20QYgP8 zRaUf>dtEH&mQ)yRgbeD~<}QR%%CVN_4(c3yC7yQE4wDrtD_oU`oWtG{ z>oT=Yo)keNJ+ZQ@q=j_2hvc32h*WyB(vY|2fm*L_Q8H^yGs>AgZU4H0mKJ+KoZ6IU ztM`KJ+O4_Qex`Pzl$INf(zmtOrQ-R{@@^@IBjw5AeIHAfY92b`E?C-HxQDCyYaMiuQMCwyVAD>M#5DA7g8{KT`&M;|#1DQ7dBPIj+TM zr9a_4-6g^%&^>*@Lix?q&NAI;)$};ZLrd5Ea5)cK4IH+eCADfTCwMDX!qb|w<&&-L zIQLjs2R&J{*S0mIRo1O9TZP^x`-Xa(|5abcxt~~bq_q0X9=&yv7tLBs@n`zT)qNzd z5qlY;Og%q`8GAY_9DFfJn`5nkyOMp=S9U2lwiV@#lV>H`SyCGZb$QAV{`X#wby?DT zX%v4*PUrmw4s*{cdlJOAj3|9~6yHYH;@%gj;@k^G)7RfP_AOXvD@xBT_boV{{-Ave z!GD-zs9W2;3X-ACj(M+w(ou?XuY&WUoyPE{W67~7y{W}sg_uhBJcen3+Fk|6(s%S_ zq`e}=eo#NvA|=P#U#p$I9c3gJ9$O?qE@5XvJ&k)PQnj54mb8Szscpl&ywKlb2ZB?Z zQYQ9jIz(=@y$6no6sb}69#|5ou*<;QSZcKKUR=FJ?%db0;eBbFSQNBR3k1o9hpIx5+Jt61j z>()~S|A{UMez`>Sw&2!4H!wcRXV*hyUCQAxg zsPCKN)0emUV&7u={I?|j{5%^pV?OT53! zm2KxTsd33K9y;{eYrpxMhYue)@_WDc)?2^-`+x8U@4WMefB5dZfAmN1z4ym|{QmoY z@+TjE{AYjm>8F4G=c?bb|BcguU=VBr`@k#U9q=hQ^$-?ua5cCN+yw3c-}`k|y}%Lh z0l4lZEZtxMz}i_|F;Cwax~r{5tjlgH{}(D*n%Pv=%f+=+q@S@CsxaRxH4hd}L5u1+ z(>uSMA1aMXBMH+qOBlI+p57@@&hoJ~E)P$`Y2CBZ>nT6eu{1hut30iPbUm~3D*DhS z%`n*^EuBs)>h$J|@_nFr%`<&^F3JC^X8B6rVtqa8vJTh9VNsWfR;&56kcKF!F#RyC z!&|%Jxf8*sg;Pl{ZET+wc?=bHRm+%4HrChW6g}~k`$zWBg|EB9X^ ztCjn6X$P&`UjrS_%KcZ{bNwzQ{a@6|{pPLoUhom9uiSqPFa1Mx8}|>)21DRA@E$mu z@?Qk*1$`i{+`mp(_htMm_va3ey>kB;GMj-ke+E675^ClCX6OT8^p*R2)^PrQ?Z}n; zp@F;_fBL#iFN3}ePF+88<^C*mj9j_D67H@Q`EH8dN?1LY=T}&{_mfSO8FFF$)05~g zdgcDSExEk%Z*e)-TDiX&`c1FgKa5VV+`q>4Xe;+eiB}tH<^DA8wXVbS?ps>9KXs6& zHn`ixm}eZv%Kh>U>=Fa*R_@;*?o%-K z%KZaKsb0soa({pkcLYeo*9FyBKc1EQGbqXV;Oe48>8q@Te~W8FK9jjte#;Bq@vPim zUZiD&7c2J~@2ywv;}ao%nbi3_M`|ngmS7H0@o!Rx%6$%P|&J9+DAFCl^NUB&hr?&}FJq=VQKg*4s&8o)5)(hNNk!ihm37 z>e{R|e>+%r8ef{h=XLM$?!|U+N_uwiZ(*(|tzY`LFyA>y6TLX>L5LEuZuFqizlCMc zT-k|WzA0%+{}$#^r>^>c{}ksEnHD9>buax}Sc|1Zi&mQ1(_$w>lrJ=DHr3+4f0h)b zMOy4>h!WD3*3HN5-=dy6hIxNA?{fIBpJZIqcrV0LI8sJ)8~+wDCu?y^$I*Lg{w*BC zJuLS?rWp?x3FxaE^nPi8S-xF-@-D)SNvO;Z%R!|{}$#Q zyMGI%te3JL<|(dyOnJ3=%kVZH*L+_%U7g1K)BOxP zE|f>nllA{bt@Fq#75rn=wbjGcu2Rx7f|rcg7L@(C|5oO9U|iO`WH`oDWubI2y;dIt*>hg+mH_Lq~j%O@sU&`h!TY3CcR+J>+)YP`^9u>*aipRW1 zMd>I}xktq%8hek5CC8%FE$>lD&wn6Lt&RP)gtU}aa^l=N-n{Nh9&EiTuL7rijyXIr4J4B z7{_gWXjrDMJBACrXYWdsFF3&z-Q>#yTaVczROdLqjo0mp(LFX{HqV zj;Q$1XeB4jF{iek3cPP8eJjRtyL{uNu@uMRL&K$v)Onicu&8;WksoV(YD>WR{^%;wi~6<<8Zmv^$=&Ylrp{dJ9Fg=3C<_iKg|cllKQZsStb zY0RTloOoqTTH6o8eg$iYTGe)Ag_TY+q7@rLbN7#Hqwkz!x;HM9smpRa-ZNaz@zlxr zj76oh{Z1g4x=yXN&gZGx(tC#FoMtpCIr@@!xM=UFPJ_q-={s;jt z*J`wq#(Ut}iKhNDa<`C6&xY%4rE4{&Tjgt>smp{tAluX`f48YiSz1(arnEz|ja&ZR z#+o9nYjYb!8T04~ZM|n$KI(J2NXNIY$lAtBd3RR!71h%bU)fhwkLR0Z#J-}sjKk=v z>?<6RP|PjZK?0$I)J&f^Nxl%1qIY#{3t4lwuT`*w9kO^y#`bRI=V>%a=PW z+S!=J4y}zFhldqX9RyvU)aYBWY7N^eHx2KNDJ(a!F>l`d`NL(7;#0PsOb3!aa-6ww z`wK5vr{aDl`H)zxKQHG$_v(qF6BF9QqdxsNC;H-lWTo*9(tsPmBcKb+19-SPA&Xr$kexY~Q|f=kDDDuTm%QIyeHR{vVVb%C~UW8F8Jd zrc;?+?;xc8ciw~7(Rljl{<0sQ(wIJd)~q>m7A#o5e&fa+J6?FYE`b+lkj@LN-zL6g9G4I zz?kk@y?X81>$tuTJOn22EVw$+{pmjFjWA=$v(K$wGcc$zUkB~cCtgQmYESP{UFiwY z(OA1-Q+XfBXY#aJgXx*)^wfW8PE9aQCbq(#@Y1xU5sZ*a_^;~*Jn%B`- zv9f=)L-ec-%9nAzLpYZo zoH_XkDk({<+p(+EB3?&hTKD$tP5G|L+sk;h_RQJ2jU6t{v@@;%J8{@vd#z*=!X( zX_l|BR)w096B-+LD~4z6%v_HZ8=EDkKkrj4Z?2y0d-s?16R(3YJ^xv2rEjJ_)6v+n zE9Sgl-G+4kB-h#4x@(`d)mK^~>+j;dSZ&eHMh~0u7cTDK;5MW4ubRZkJy#p0{V;$egm=+5ypy#+r4puHC&kHn%YCG_SwxsS_Gm7vpbLmfE{N z>)5hwN7=Wy8(YQgY)qcq-92m8>U9c5p!Mk;W&Jz#_Fvk+HS6|0&3e0L4s0@KLSy>E zf;*+z4@u3PT)Vbe2g&3X%B|knm@;MdoZhAT%Mw~+XJdGH+m79Ps=ZR_xz|r`+_JO0 zYniuta439pL&3H!JiZZyZsfqtU-+Ahcv}`VN`U*pk|cyO-MI z*!O%t_#4gl&9UzJ?jr4(uQm64f1hjZ`JTu#THicp{&fE063t&2tSU_H?w&oHwWoOt z7gpasdSk9xqbGZQ=by&c!bL#u{5`ie8ZU!4!TaE2@MCcDKWa420_TD2FKsj~FX*+< z$H4R80C));2JzcLPoT+@dwRa4)cSh33w`5#f8Royzn14+#e0>tX6@L`U&DH%@&%x; zsOR+G#r#dkH-pM}Gq?*p2reeixzNo(aUY{s^d<0G!F#iy??68QN5SWygKu-mo&o({ zajkTW4)!d$?I$({`SQ$TTs+~VvX>n=Q154opV*i=Q@zbPB*QZFlx%GjMlYb;$>J~1shp|K*3{f@?hMcdNbNofcz+*ZCR_<~HmnLD&_#fs*$ zOFB9lv*tFRyn4fID4%VNk&VOYiIPj)Jui>3#pww_7NLbuSAeYLkDPqcaS^+qh87D}m-@Kl;|pe9{;hi+-U zeU-*=y^)=)_wD@o1FW$&zewtG3e!)fO`kbyj>@qwmDN(B)`(PkgZGUnucal~!JDA@ zjO80_a`%iL-ul%VTCeV3Q(8Gl`kB6Zi^Lo(mA)h@?G~l@N}Hna$&H?#d5ik`maH1s z((JWSQr8`gty_1bcWDky5B+wc;`nuh(`1Pmyk&HyI-lHFvb2AL=01D(=GwT;Vwwq! zt*LFf=S(2xEM8jCC`ophc4yl4BhAJ;8-s(JHtpQGZ=dG)IwvnG(5w5F@ZI5X!CSm? z%}|A>dAibZAJ~<^CPKbNq8_I|iJWKj@T`AsbtS#yxlcQHmoeo2^pu%BDQs;>Y{@5I zl!pBJmM(pE`O203Wh(0uMZ*kP3UnvPS9AJ=t+$p z`5NFpzVJfi`}*7y_Go$KC(O`57nlqBz%K9(IQP$(!GY(&+u-a^@skE-fPJ9z|7PX~ zZU#?+ec&iK`!jgpVbBNGfFbZAcm;d{I{utFGPsEM^Rb_c8ELH;>B;h|kICgflMA>C zXt(g4(8=I=Z~(jk-UUa&S3oiyN120y?}3ZJjo?A>D3}ahe~0-W^!oQ{Dd?-+~=EUGCa09p<+y|Zj(mzztebCpzSKxG7JFR=<6GCYouRTE{tx0eEpV)yw=ZDOL z!CByTa37_45c(*167&G&wgkFO*Wf+S_)pwdK+os9Xllx73HpY>4xluLpeOow)}cQ^ zACSHS&^N%x;K$&!4>JEO=sDnga2vP_JOY-0A@Cx26MO`|0Fx-!CE#Z87?AF%1!eRk zTa0+U?gfP28h;M8Of z%6qt)R-vOu(ENLR)xJd^14qGE;M(8kj)B*}kAdc72ax3{#Ym8a=m?=3emmm>uCs+m zPY!{xx<&K{<;a=FjIiPh*89nxS(46}H@{B@2J*@(Ai3+Hw}N}X!v*hgXcw3Zc7P*{mqXAuz`NimIG+~22wVmB4fS)QXY;Nmx{&eXw`!K);n%nxuKVW2l zhk(*Q2Av9aftSF?K>SX0o(V1j*MM8W{opY$6)XU(U3B#qv#NCVdf&Bg=hXKW^bu$m z*aI#?b0;=4Spw(HI~&fq;4*L(knKnBOr8=mdpG23g#~oX%yfTx7xQE+t$!YKk#ZNN z_Vy`-xP&;>;Sl>Urc7J)95(fJ>o#Z_uy_A{#f^oZ;@fxn^qDiU{LW*W(xSzS`36dJ z%cN^?NV*OjJUEt~V~MApGiPDsT)Sao%Q9wrrfW{iC3~jBqKu)bMH?*YE5C}kZ_8J% zdj9#f0~>}mQ~&H6VziQ}4X2gq84J^<_sm(;w|pgbw07w_^)1}p)4QNdXGyfJ&3?bc zL9T1^vgLfXIo^~SE$YLT>98ogxxJgK{R7^Np7q(woMp*l^3+)&gdNu{LmYNohiu1n zxM;7z;R8-h31{>!m1Wl)%hEIVhzDIM%81`IyhB%o7S78!L@B4N-d$~L(#=ymaZ?$& zWn1Rd^A;>zr7KDB4tg%ruI_?vF6h#NP7y^@I#uIzMLD|j+(02}GkFSUXkK_B%4E4Y zb9&dCn=}oq+u^Y2NgBW1ItjC@te0}NOiIIgy2CjQZ_TMQXD?%AF!Gg7pgi*zZj{B@ z97zfEvu@rZbLOpBwZ3}CEh);~gUcoBvF$6f2q|0*woo zly3+^>zZ+tEIqZLsgA@x)4$HT)Pjt#oj9Njvu4MdrZg$FIBKsQJ1cQ}LumKGvTlqf zj0sx3=w0~C;-x#ah9ODcKT)TQe4cgb*-M$1i%$zopSfo3fMu1AxKxHzwr!4qJ73q( z83j#oNO2NH9Hm9y@^ztBY$n_KD|u2b+D?_ zf6!$-sWEwa&%6bTmo490>Xwv{HFvFU_7*gE&no38@9bRu-c)YtIJknjyCtH`wzr8H}scbW2X zYGY`Vbx7|-<`08g_NQ^@d?qxOF4HyE{b2t?*WCW{dDUDgljH^esag8Yv{JT}^+3f~ zr}Cu#r*RD(7XL4$Z|ffHcuQBTS)&>7;HE8mM}7~+8r82U|IE2_n@`Q0PaZS$jtvS^ z^3XNHZ7TYPV?}Albz4}WH%}?J)A?TP+EaedI9`+lLST&hNbW=I{Ql zJxRU&b}L^}|M}>j{%Q6nW!+zMXU@Z7p}F1Vh2`QF=p$f3!S65V4(K89KKKGmI*e5Z zDDBPAxnMIm0Nwzff^ENp{*RbHf*XF9dH3IB4huaU>&O}Z7jsmo_Ke8ty?L|j-dfdC z=~Qc9EBv#Jro!Hs=8AchQns6R>y#sHaCc%^d=l6Ox14L);68-LwM*OMj&=QVJoY<% zU)g@w({mL$*DZKj={$bR)J?SN@veP-NZPN!S(K{2_IWY96J7h9*qAeqopx#U)AyEf z#LRxE_zKpYjxlrR&R>?lio`V-qs1C(9$R`w4G-&^zTR_`BCe-OK0b|dd|pr0Gf82| z2+}2-7M?@ebvOExNE)27PI)rSShRFQnw3aS(8_JDMRVQOC5W^$t=TT)3ovq(1J4fT z49wA5%#{^Sk7KsPvt@}=*URKES|l~RZD;Ez6!!^3!i>HpBQ#K}-UZK8`P`vpD^^Lj zN=s;7GiO3O_oO?e_z8`tlSa5hTT0znPM1|u3~o*{YNep0vvnp+C&FBM<>K6k=L}f? z&}L?O=0!Q4I;joGk@ai0rdF!3cxd8&P>+~$i4)Ps{$<`UuzRWmea-m1wp42 zJteJuZ;-uRCtCO`fXiwfbxIDbhFc1q&n&6+D`socSS__Jtjs^=>ub{Q*j4+I{*LTZ zvwIizJ=>1~ZCCpGuza2JRaiU6C5hOk^)NXuS^8{$X&X>HvzHya%5rM`UK(im^7K|K zjr5Z8^w!o9_r@vMh0P?Ov_5Rxl`XvKE?A~st9qGrUPEj9bLTEzynF?Q%GJYL*(;Fx zk#ty(X-x0yQyY|`r?i3W+Cw=;w}CjNv@&Zeb{8yVjhEvQ?2~rRrjmCW)08X5QCnV; zb-QdUr-;;b5asTseG0w3I#+@p&$8cH%K4b4{DP(DnDZ-kJmgm1y47_vbxEDS-VRe} z*SS0caeRRVb@iI{gPYkEUf?Uw$bvEHtNA>Ah*J!jI}u@hec(1 zQ$6O+UBq5!_4~1Vfb=lGoieR&+1Bm*oAylW7iHvjdzVP_Em1Fd-XmfzI~3>Y+Pg!{ z7iDdIjwpJ0xOiWPa*9&E<_R=?=1_C*g!tTjmJnym)-Dmt#q^BvZt-amc0QDU@l4)F zeU9TImWg$)!_<6Hp4!a1ed;4UxpeAWCms@a!B6D0qE3g^bR6Dc2hSYo1w|)Qm|y)! zarBVvA7l3(`Qc@@Ew1Vo&k!lBoiL(&YiOol>^G5=Q&8?U-eFw|(e%XC%sTJ>o7bEF zuA0uqL^*4&mqTINd4zXZr&T#)TJu$Q+N^nh^j1xGNHLPqE+M7#ZXxHaILRD~k67pG zwDqv^kWS}8+tqx;#*{80eKYxpwKnm&AHhegQ%Nr^J*tn`DC<^pnViG9C%hNttkXLh zHv;*HeGvKtSOyM*Yksn$@glhLjE=_h;Ecc0(RdKN4SslLN8@#H_D^**?gV?lch6!! z8+Z|%_tPDX`@jM44)_{eFsY+)Jy-(vfRDi?dc)@(Am5UY*wg=jum6yo%(D--P*9pH5PWj6n$y?yX&>w<_z#_07*hlOEu4M;k z(Bh&e;v@E>pXg{@bZSTP5&I-`ygp)kk(H0wT~PUmJt7^yl06-!^Lt^B4*L-N58fa3 zlApXGz5*S5wb2;9KHD^2gwu$Vqb;63(h-*`vC3%kAcnL5cmpQL>;1!*n0^p5B4ZEPr9|;Q=^(*dop9@ z@3Mme_)p1Ca@_-#fFZC98T*Jm%(Z;P&bSsk3fB!vIJ%G6?ys;D{Xg`PU*KMWSAqP! zzVUUYm;S$*-VXg3T>Rr4=E+q4-SrA|jPwzE7u+}5o2Gh*K2BKIJijzPi$4kaxg*M3 z5zB))zt9}V$;L!4ss5|E+@I68IPcKGk{$Pu5BNNucXJfy3f1Dp`S%?Or@c;304;&U(W zos?&+XKJ>&W@{Da7HKEFALGeOow@wc#oU=6f_uOWumijaPMgrtI2YUnR4Vz1?csV5 zoY|3iPe5mY9pF&G`viK*#LT+@dJ~Y3*n6PTGr6GAM{FOwL*OG|AF*e3b|fFMS3;HU zZs;KRqzGR`Yl_dg?c?wf`{Mt{UO&*zN9^asokc5*^bz~@f&5%jueyY1`dlPcj^pzY z`yM0iDB<)@yyPR+GNR;D_=t^MY0|7~>eOi!AF*{AhxuY3!$+(oO{srNAF+<7 ztfh}w^EBg`re_5+0)G?wD^w+>F2P5vQdtUZX*Y{`qG&69#5xDJzQU=UOCPZ@Wo&0! zX@rkhYjf__N{*$E*t$N+FoRHw>yNP`e8fhb@mgg`wPUwT)JeZ(w@m$yvX+Q7P|hx? zDYep@i`_IM|10acJO8aV@#`%wzDxG9S zEB;;7OY+}lu>i2-KeQ?RP1yO=sq-`6I%7LIj^{(MM@Jl5s^TM7JZp0cgp|dqMUk>O z-{ddPF=br?Jv;b_wLVc=zw{Anek?t`7+WH}N~gEV=T==mJ*e~%Yb|K5_=q*%wIWUF zBi3=WM%W9KN2%gmB2%?1CDW5tcZyv>v862~ibl0kOCPb$RdR*KHa=o4DN4RAe8ffx z=_)*H>T8ZYL}UH=ww^kMd4JieQ27I{WL#6_=yr8&B4sqU@evzyavM6OHPU-(K4P7U zdzi+bQ;H&8^AT%ldPGYfv5p^)k66n_>hjiUlp*hyK4L9He8oqs`ECPh%D$ZZ?_9?n zyN_63{Ll5lEj+tw?qJp9ZmDQ4CQF>g9KL^KD>IDv~Ts*gG9$FoXu2DR+ zT1q;6O`Ejz(CT=%gQ@v^rxhMr#o_)053QClbuUJ$=ApGNpE3b_VfRaTj_8sNLP9W1rM#( z>AOWwDm=6*2I+E*zm;Z6q4$5qLu)I!*v`tStvAdO9$M?=b2-PNu@uMRq1E|C>b%Tz zSkyfC3)R%|jypCFtxjbv$4Z@ElzC!153Ty9Nj_Smyh>jW*Yo%DPkhUk_j61?txi$b zI#yWeoa0!2TAfFo#ylM7r=fM1H5t=St2IQe@$R?dE1h$z%;VemX>~sBXw1hlu~sV6 z@%U+VImc6{SccK$rL(=CR+qj`t=)Xrj%RC2Kdq8;n$f7_#`4qZJloNz-!d*AcJ6GC z7}Za!Q$&L72dE1E02 zfh7A)pBH%iGS;7eJFm{@yubp&%RoFYu#d1-Z+u?hb;9q1j=$B>I0q>1D(Dkn8CVYv zfOo*k%L)H&_BdR@UIyUv0v~dH(=T>3W`mOoA33{sXD>NJm*sJI`(N!yZMLX$etUv-EglE$~VoHsT4Kv`HRs<-=yj4s)GCnxvf>RN={{ED|V<9qYW$J>gwF*ZNTh@ILtdB^`~2!Det2T=)yD6@z~87C7%x zcIkje!2tLGob%tn1KnT%90u=!Pe2F#^9*nmxEVYQF4nv4ICk}T4?yX|L{B%Z0O?=! zr9a^x{>_fY4d7wW&dW_Naie*;SxNjs$$$^RS3n*kPQRF%;(g;XsJ;7M&-HEK0q_)9 z0EWO}@E-UC$lJ{+w5~?zl?6RMZ#TUcbTnQ8I%)F>bS!T-UmzoIH)s3}N&`I~TK9JI zC^9p^x8?2T(D!);fiJ+RKVYu`o@>++_I7hNJbAmh0eTnc0c*e>@ESM@z5?e`#w$Ve zc5??|=^Bq`o3DPJKFr-4&9lu#l<_(so%cZ>1@dgO2>Lu|eSYZWzfLQEj}qg}#-44K z{0t)sd;uOfx1+Hf$g@o!vOKjI0rG4!Oz54<8wm%w&Yo>F<^^_oZV~-KIbyy&&o(#F zIv>7=-yx_x+uRF{o^2i{e5{^rW=jVxF3&bEaox_d&0ECDv&~WH_shCYE%(5*_iV$T z+(z|n^U2RroAY?@flI)(;4bhKSOE3_`L;O>{Sci0bL?0I4}hs)0T===7U4Ic9|8Gs z{sP*`$AJ9XoC*CtxDnh3^t9-LE(4pvA@B+KE;YOcjP0Ff1|{zUYrr-Tz0geR6Ni0CjT4?>kXQHwm1zE$!CkhqVm}ys<^4M=BDoiy=!x7 z`J=Wpx#7peA^S0LShSPxn5yRz$C7qse>xSL_1bTV;)yH#mJ~Yh#%#|e{t8fuC}G8G zNlq)TCAumk(*6yHMM;(XTI*WcL@8(ClO#%JY561>-fO;6BxyX8>?*%r6swrJe-fuM zRhv#>9_g?sUpef!kPmEmD2Xw#uH;$sQX)wKo$R9+PAAwERw~Ug%X2`b7ZU4M%hcgG zQRW3BypV`*C~cHCpZiwqa1e(Qv%^6?wk@lY={nut^7|9H%vOkOa@;QG9AhBIc!Q?iJpt`zL+jL5;oaixC_2;nyY-2xzsU!?y(pknWtT3fb z>+HknPX{pYNRitopBnwFrCxV{#G@DS zjSD=heV6NY{v$4CE`B2ZBihY~)x(0 zKT-b?i~#wH*t!juJswNG&!Rk83cnC}yj1-{#9krkQ%8((dApL-Xro*yHLiK4cFmkw z9qW#h4#8#o%dI^~?7`P(Sr5yKN>2>?+Whp4pFAafr<*4~63UbQQTqdcOA{$?v*Hf` z{i()^^RrgD(UOJ#2F1|sBRnpMFUcal;&H)oj+e&;@hErtV}Py&9X{PGUe!0BfT+5-nv^+G~IjaUL-yA%$$_J!cQ>Sb`)IWUh4z7SLf?K5z!sZ%L$YZh(o5y28p6{+Jy z`8p3C5eBx%CxZBf(<$s)>$owrguPkLmBrxnj_NS!MF5)@}S*WHv7*8C;t{~qmfa4P4-TcPxtP|roOl%({Upnq#P zebg^q3TNL5j^R&Q{9i*M#oL2|W3#;euVD#t;<42H!-jLR_L!0)T4_uGYbX+2WV51?bO`)x)_>wfC-yqU{&KaYk;(O0bdiA$*X<3tYW zud|lsy_#1192V7zUzXJBo@3C$>YhVh-E&y9bHwVNW1IgW5C=`gdY(d*pt5S0CA4a% zE4|BA#wok^q>}jEjt>4IAPIq-i}gCEag6>(+q>S}q=}U}hehjabTO{Xoi)11r~T6! zomS`~U-AOwsjbdQN}$}u-vJcj3#vIYE!X9&(b^()oT%qU@$UfQ8%h`D&8G~-x|}$) z3F~qzS4PQnhmwV;kVq?XmXKajm1}Y07jkJW&T^t?;_m?F5Gq#T#L?dY3YlX4O(Eu6 zUDf{pICZ4WwYJDr$!Po9TAL+^sjamsMxZw3x|(^KbF}mPZy8g{oYvLys+zd5?R72C zYswWh$6JHK@?@Vq|BI`&G*Q~DSW8ogl2+Ez#G@Z*b~wVXz2Xd)A?Ay&%DS0k$*u5A zUxbPkGlh7Pjk01UiI_{Sk^b|mm_l2z3YJ4Uk?K^Vt#V0*dl%NS#BoY$QLbf~M=grA zEO97zi?uAvwxZ}vYgsW)_qe%|r5MM$)(S_z?T$xVxqcORY5mIKoL1{sYu82|H7VAt z#H9xnYgT#1DoX0Qxmu-AL|mEb$-(`cPa*SxLy8?hyuzSYffn`p&J zJnmm@#YtRAk#l9mN&NJFYqR2{c-fq@T+?^4!gX|(zKdgwa;04hJ9E}E(#|ZtTZi&g z?97gHyzI>4p%pu`u5w78eJxA>so9ntV_LLEX-zx$BN3cZ;m4mPAlr# zWutwuCvV&yd8r@uKc~M_R%De%AjiUntW<;w8?r(pEydzS?atYh^jL~5#b|6{DIP67 zH7G5`mXoDe*VLr66gw_bTD`OsZyixrOO9qEwv5{*Qpbs+qh=${7GlL2ZV~Hndh=Ub zhoh8JMr!T62ZD7t+lC!y>U7pA+S)E`38#qEaiZMMU>BBESX{%YVv5!lVM{ngq>d9M zznZ69aU-14soL9uE#VZSQORoD*cM#RQDMFrDpufj`YoHSve^n8^~H3$Zg2mMlCkvW zi>k$<{dem&aU-14si;TA@@sxwPJCOJqo>@_bX!-n`I=|_qKw?q=9?|PQLC@Bwbvne z%GI^)yylC_Q?4j_d7MN~xlzj3Jaa0xUGcg5rES-8Dygq!+tu}?#wEXa=#c)Aarm(R zi_z+@82OJFvMhi7Pk2M#$LtrJ1+a7`z0!{wdz)?q{9}t^@1A zE8ufbwJ`4}&d#d5vM?)5OB5Dn`NoYBlDZZ9qbMy=+L z@SIB8Xv1l<=kzjf>Q6bww2G&%7N=5%hMMP6q(SW@xLnpc*4Y%vSvFovmvYRdYW{aQ z$|_D_S{hrlV`!1m7Hu9Qrtn9*XOI59Z0(MZr9StB?b5H^jRghBE`8>&VMPH~g8RTA z_#9k%4`)2UX7C|6{~u$a1q0wU@FlqL-j2ropdY*jPNg4S2yO%Sf=56%SOi`KZ-URk zw|he6y}Phvg42Jsy>0qp;zqMgUq$?#;7KqQECI4T4MAmRI}G&+l@Gc89GpUno&zoc zH-Lx1Q@|%wW^*mO&B1~mpN)Fk9jpZa*{IL>pU1XQpN))c)R#hKqrMJWw^8?@ZxDQ2 zHfo(v`SIhmeX zST^e0ka-M9=W^&E&%9gG** zs6XMlosGJKmX(cq67>6JUB_di9_xh4t+(=w0#AZIFbG}(AAm2x_x@3~QeOeR5%hpV z;0^FG_!69X8>IpYUkSYl=!D9h&k~;6Dmic4QhW8xE(wN#BRdRU0_yR{VyV^%mDfo3Huwne?yXs>?=G}< z6?86iY)kd+NXb&Ie$V^9v{ZXcM2fz`QY|iT*7Agk!g`D56Dm%FM6y>qEGm1oD7vs$ zJBASUYKLsEc38A?guU9aO?$OCXe#X03Q>ZJy*f+CUac#AF{q5PS36v!N~cV8ty+na ze_^$bl36;RGBIB%l5{#{Vy>uS>K5!6UzP_8cI4|TxOvJX#z>=53FKL`V@pz?j^!y6 zg_WwcHQTzaGg8Niwz6i6Zzx@qH=nyxShK~U#KkES%c^9$PIoccvxdE4MhQ{VOL*tS8c@l{<1(QtDZ=a$AC! znw48I0<|cu+~)D!+SbZ#8B=5{r$@y1T~Q5nZBW0`)}2p}Sc_BTHnGK9Tv@zDX~n|g ztq`TISiHq+XYp2?;gYz7g|3RlyWo{4MHDXXRblrQhv(ubc5g|mx$M z8!hinDa*UAPYJun^Z5{Q?_*XV>VBbXp8}zcS%a(Y7?+&lB`3I@Wv^G5veoSMmZGgI z_ImNtTfU9GUh#i}6CxK~q%$JF^h@8=84=f1RBa}zTBuf{cimY%C-OP*UxVl|T}ZeCq%|G z{~D%Mzl{?j*Hh9HJt4xgu{Z&e$3yi5NW9~^^YN6I#<0$RNT%H=RvPtdeW6dCT0i}v zo^J_h5t`$9<3WY>K5nj+`PpS@Q{ETl=?wEMD~;5$ST$2DqkhEc4Dlsd#8+0$9Orng znu*5~C7sUDwUD2Hv)H$rZG;Ld4Rxrkpjo4-q|jEbpjjj3E>_UQ@d}z_Gp~9&qu{00 zG+n#QJQs`88Roiu(%T}fso@)^@~y43t^*}0R@RiBP_eS6(8!fFah*>qN_tk-EJg2V zv9i`Gooho|l`CtO)5@Bzxx3}cn&Tqntx~S6=?q4UvwqilwDmQoQ<^#)C))lDhGGrp zY)#_36pm}X$|gytYDJv`vz)NX<}(j{V3l<`@py8T>vWcPTPdt{x=c51(z{dZVFlfi>6DqG9SyB;=}MSbtZX@)dHL)_ zq)CuuaPhLc7FnsA29i(l`k;Pf8xiY^a%FI!>lfXMPNA?2Css53wr9m z%HhikdM9);=mo>zAdtN1sSjeA6@7$n5^x2$4%`av2akc}U=273_)k>&_MJ0lxqS}y z>tE+<*RCu6)D^v%ZQs6o_c{L(iz>JQ+zTEAPkz>B~uJg;+o1bhsB3{Io8 z=Yq??Rp8;*`4b-WUcj@45>1)1eY@6(KYEDs3ZPS|z{~%F6&omTUcPnTBIZ4CMq^3# zoA_)$r5|}Gwrn~2GJbwY`#LxZJ_o0h@*HqExE9<9?f{R1CqW+=1}}k=8bd>S_UzxU zmD*v_?g1)`^c?};Y2Yh*eqZ0S&t}h!=l?TSWWa?FFrxvtgQ;K%&>F_qX@yudWvEP_ zgrwG=y#}4vFxtapR61FT8LEIo<;v0IJy|&;?)_SPy=#xU2jL zwcMpXYu0RhwW^f-5olrc|7`vJt5@e!EBT*nxu@>mf8Rf+HNXt891Mbk;5G0z_yl|n z)a$+nZUDD{`@losNzhY-mp})A?Eagf2Y|}{67((bA@~Gz{zrD>Lra}av6aNZ$15Dsq(4Xl3^gKv2>?O}Ww|dRMpzlkh%-j1E<}Tx7M^}34WZSvr z$S2v(9Tt`CT$KKd?c6bhu$?<(+quJ8e#OfE)#kAOY=^F)yE2`BFw=PpMA0{SPpO@9 zBwM&*{A^U&hFLck&(PlO{G^nWB;;esvAKTJy0>pPN4ab-~E65_kc zF&&L9JDaUS96w63MunP^?04L)m~2sYdRDXd>6$lF&-T6h%X($W>C@*wt1E$j6{cLt zaaYW7!MY9Ueo3aYv31wJeFwrD >qYnIiP>}>Gk@%alE_iwP2sOmeRvAyU6`EKfI zqd5M#nM#XQEbUd^)540G<<<^}@+8N9Pg84mZ;s6^OZ%|1Se(qw@97DRm8)`i?|xD0 zyKP6=r??AS#qGo^LU;G9S*zD66oJ;Kca%M#v#?EO-M*JuZ`aI$P3ExcXko#f((Hev z<_@l1+pL3Ratq~F?`%w&!d@7>&$tZM*t97+#*};g^u{ea%eyB2#K!8uq3}(S^B63? zWtJ|JOx~|+E$sNfQ;b8h`RRH>V@qlu?pSIA?Xnf0H)73p;FOWls)g;qT-Szu{^_pp zj##uUJtrhVXyLYU?8+7(E`2T80-}zN0T>-LSu32^Pb^b zizu2a{ujjKeot-QZzNdH*_g`YvcsGF+=#XvNHP-|YtpDZsnNS&(fUoBw(Z!R`fJR! z$c0(Dxt)!^rO&QjyKY1J_B2-%3vVjDX5b2w_mq9LClbAC-h4fc%DX2?m6o0{1&;(} zKH^uNUt5|_KE)ZXDYC`9R&(0s)4wjKFg+s8LsgD_l^hjojYt(cHS6V#I{B8I+$=Tk zxir&TytrCJ>(w1=N-Kvvs~Rl_OQolHrQKpVcoR-h_~b@U&%8x_eM?qpmSYK1*DcR* z%*`_#h4P))x^>6i{RbQ?$~O!n-4Z7^;u&*uqr9#sG`6O;<(~7AHfQnDipDI_-JR*C zO_!yaP1lx8r_2=1GZ2bc@p^YwfK7b3r z<=|>?3%CP30VadxfIpqIoT=1LTWgN;$bTR$SOzwOUEn2f7`zQW0-u5(gVQL_S>OV2 z3Ah^E2<`y)fCoSipcjXE$-7Um;s8$m_sk=}d;gB_NhsrkdCBX<905PsNZ#Dr&Pu){ z)kolDWKRbdfXl%R;1+NPxF0+Qo&pQN5O@*98Of{YI1E$@>H8GaXC%A+4X3}sn#cHt z2QP!8pz&|j)BF495=T!jW+dwg=`X;->&z4LjKuxuJH?E|^N}aWZ!+is3&1w84;%vL zCY{=OHTGOY=Vd()*|yEIkXI<-5%2-{5;W*Jr-O6Ah2RQs9Z-+D2h0V1U=0`oJHVkL z{08(b@E-UGdHYnL}NdPccl`>`9VzQ>j{mu16h8} zx=g!!GtDhV378o)rE@>f%pgnc-7lJF22H8qt-9_kX9kWjMJqD{hq%w21#I>(@%ejr z@eZE8P+?Lq8*mCjU2E4mG@+5(a$=eR?6369=C{A4P5tffuxLm6_BUrjW3YJtFI^^H zXR%jcaI-?+K9-@tj` zDsVHn9o!8b0vA5Y^P05RK1mv`ujI*pJJ;RNiP&5=ZQ8t9tD7p9Xto&YY2MwPSIXL1jmFF1P4GVW82lIBkUaF()hhRR z-+oi6>G7^<-+U>%9KeI%V)C2|-3+vreGX;$=GL^;_7mw_!^3&Z>OKf3mHq3$0m;N3 zrud1CnKL!h)V1OT%_>E)hA&;&|NNSDo3^%mCQdBQZaQ5~yCRKZo<__h9Yctjq(hoX z>Y5S9OtQ(HH8*oLdo(xC9v#x`QP-Y5nlH*TIF%Z$%orV`(8e-nLd+E%$MYb?XqG5m zoF!T&Qc^QZG^aUBG{;o4L|to^D5`gkW{Hk3cxjec<>mQd2V@v33u`&zR; zUE@otnDsS#l4V5me9s)6Gt;%#vdkCNIWy6dnB)1BS&a9!W_P-#rp4^eF{WCl(zQq4 z#eX%Ay86fy|KdqNw2+A-&wPzMUB{8k!P7m^T;!&Ir7Xg)yUJe zMxLlgp5qH%8hKS-9(j>h9eFV(UROt6jEUEAhI^rds>IhtFT&gZLYSKsW?!QQXMb- z0pFs`XZ0^J{r9gYt*mJ;4(n=*7V)dg#a@kUuBn#g8e}f%avji|@<%^X4UV@g-*!6o zG^mEpF7IdQYt7mXgM%CS|M7TpWrQx`zhxD9{z|Ep=2hIP^ee}8>o@SFxY;Y>71?8L z89fo`2NfOcThgxio>{Z!s4U7m{YBzO6{+#$q?x2v6{pYa(JJbw=_v`FaD7FF^s-_k@U3{^(dhUpLjVeZ7*V8{b zgMB9|86$6yKV-8wRWA!MGiFxCq$Oy9rzg+ssic_D*tAJHnI$LP&@DMUWu|Dhm+DHe zz0~2%%l6X9%l1-pn)Xt2Ol>c9SduNd5)6TT;1GBfd<=MZ27BoPy-0&WunpWej}%ai z3E2jCU|#v-sBtN}w{ENkim=zJV>ff?X=FbrM-uYotg``}aXB{+?I zz7MVhr=>^%>@*S)8v0owL~s0WJc!fct=K zET8m5`|2r3elb1c$IxtFb-%0ISKph9wGw;^z658J|GD4-(bUc-Vqd+Oo^=(t0o(=d z1CN5qpckwJLqI+774SLu8k|Z=&II2D7XXDX2UmmZz)j#b@Bnxmbb+~GIoJhW0&jt) zef4y-P6FQp-v@dMZQJ(sKj0BWsA^>$pj~%>SHK(KU2qie+(}l}$GGkTD}k)64<))k zJ$HCImZu`!=8?+Es<5oAqS?x7335nQR)@3X)9KN-8 z=o-2!)AGksIaXFy$EqhRU*QlkUAor3j7(Q- z%yejQK|lYK|$T!OH58t*j1<%F3E)z9V`93l6KYnETLF4OMbOmmBI53sUsFYoCWKczf#Z=iI1Ux|}b?Ah8n#Q;7c;9a?&;NET zsCQAmZ_a|MJA+3a{b_k;9+A3Fy2qm534KFnfh1k;9hT?aQU3qM=|z=Bkd;R?T6r87 zsjWPbCo7M_*~;UXY~^uCR-P;)D^HUTM(Ys^be@vhq}U*~$}n zRVz=7iPu#tPmGDz-1pMH8u`8^zO?d~7iqTgn8S0Xu&d0Jm$#Cqib7v%omlFM>JY_V!W?q<fL+7Y}Fb(Hx(u2yxuYom2#SFI3>rj zJ{z|U!WWT8J(APb^OigI>mKX|FE8?b1E#uIYyj4UC0KB#A0!#W`_9R#ETsH3h zyx#R2w&=uLOz$-6Wm5*$?c6mYHno&$yluPABvj(9-8AKl|B9G{-X~8hJ%34+2bmR> zSmp23rj$iH&o>U0HFpfB(`-wdGk5MhRu5OHP9x+j--@Dr<*L*Uj&&PgZ{k$aoVoL4 zpOZaAe`VKMjJ<5O<$q$aR!%!!n%cj2{_+*IzTouSX?$ZigtY8X$yyR~bxG4bk$q|U zj1e-{VOj3U;w8^6uaqABvVM(7>ok;RaAR2-LRe=UhrY5GnTJHUTePr7CH6{{#WK21 zGkyEgDD}Iq5UK4h_$RWMnE zoo+Nrd#Y2nXff^^XQ7>zJeRNF`Q@-E65&agN;R~pB7t`GRGu6$omvBFS#K+RYCnaS zpYCtX+8f)C`=pc`_zEjiyJeIMc`jVEcu5P(D0!}1A5s-{SiPpyLydTfxvXe~i&tFRydU$r5V@iE@ z@1a-@i>4>;yk4y^sGqgCGf}#@Q>*%U3&wju33*mqk`kyb)~qc#jzKQuP?VIO>v&V- zf+d_#kRjFTH7%dXw9N7q>hZOE>XM>oT6dY(>3VK1Sh#peKB1;@sZ(^t>WNEYy5J|W z&3Y_KpVcakEc$#0w33!aN)nzbgcd9;+mleZM}*Mh8gK{o!YS(@U8%LV47cvzypndN z)RQLW@>9Oqc&WidD5nN1F|KJ*zVMwx4*k#ZhwSQ_k~9+2_4Kl5*AA2=R7s2PGmT2p zDCF{s@??6NjR!M({{Py}KiH}&%kNhnO&dZpG$D>Ljzbe04RIX97-J}77-9$^h8T;s zEMhr^vaBx3vMkG@C_@pz=MxYgPjmoj#MkuWiGc8U(1^$&Lla|c+NN!qW@wtGZHCx1 z%`h}^3}sRIeD~hpbN4;(-pB7hzP0vVYwaIrpL6y;XRUMA){!h;^6JvkDxdcwFUPTm zXNp{YAzw1h+=KlVw1Fj{9jpT%flt6m(EmqR3Bho1E4T}M4yJvK#Sg3nSN|9pm;}=7 z{`{Qit$VRm-lv+e$a|X~jrdDp?fQP3F3UTjrdmox{o+JV~S|uGJW>($UxPf@*MW=ZfFzx?RTQT#xwq zUSgK#lzW5tt>$pVMf_It!uq*-4L3m^z132;Jrpb2w{_+&`d{0pzsvuBK#^OwLU)2s zz`)H|>%lT`09^Yv))CMOc7wiKuxEp(K|A;u40;C(1$Y{CgO9;kFkmY-ad0cR3w#qy z2g|^fjodnCBXxh!whvivkz0=-@4E^A54Z)428zWv5vu5u&p`cOZ!76#pbP8* z`@t!2Eh9P{ICAUlq!k_Uu|zK}a_e!9Vxt!LNc z!+?J!Bey=bj_VD)0?LtFSHM%`*1gbA!4Ud$D;NVF08>FTSPgc8JaX$1^5+}5_0U_K z9nRiya2lxG7tp>$W*q>o1A}OPERkj<8$tSM(u&-Ar}&_LJ*-5tFbO$-n# zYc`Dk9Vq4j@3zH%69ZS{bq05U`@o}M23QWd!G56q#ZE!{t>Ft`FdfVT9iSWR28UDr zH1z7V@el56pf>_XZXHSbLGTpNY%w3I$gQ2wt>7pa%n{xR&M$K7o;R7NKsj>jad;Ja zTrYC#W@P6Zx%DA*r+^tiSNw%WZf&95D_{lCvw3@3m11;<>r$Re7z>(QD~4XaujN^P*S>n?)1*NoaRa;y0&5wt_(R&zxqDMxP2y-YSx2}4obU2G4a%<8{ zkz1{&`lZW}6_Hyd6X1o&t=2WKnLmBaQ(4+bkz2)$|Jf^*WGQm1IAQ#4ZQ5QwHs`C6 zTiuE&$61Qpnn_BLTO|=ViXw8Wc|2n`jNED+Q*^^@PDHhp#Gk3To^*ujwGp0#!(Tf~ zmc+=du0>Q@aZDV!Ra`}G6=f7tekH2ddmI~{IroWGjCWSoKWDdoVxj~#&$+=ddy#~YL*7N$d_sjfY zwR*MwvC_W^Ter%~?D2EjR)()}WS1JJ^akGU9?~0LdWSl63(sw&j~?S4gf9U6PuAn` zZv7*k3%^mR3<1M{yzzG=dJl9eSOKg~ENxhfvi-dSR)y63m&u3kKBb^UOKLmkJyBTT(pBREJQ#AJ&A~RI5+*zcAnX);49nE#j1#XI<6E z47&8S*L@vx*Yt=}>b6CZ*TgBc%;ojPgLvGLAvTH9LYzTjoKojihGQtjDV5Ze?QA`pq#3@zUtuU{oIHl%#eCXZmXNx$cmYPaSb!&$>l*4&%Jc1owV0*q#3`*;&PT&o6>&}%mzLwFOP-n0nxowqHT5WPg*2F1o)Qb4rE9v{2xJzJd zt$9h;&Ux1p_Wahig{xMxr!@XWyhLul-VwMKQH^2z-e>vpcMM$mHE5|voKnm3Qc5#})x;?kkC_WI|=c&t@8RlNtEvfc|!Xx zo(V~}UtJwp`F)h9ro!)&%RM%ANT+Yg9)0NTMJFz6$!+~66|2|fmceuxDg zJOMhv``|b@1N!XY9|dp&xCcB4rh!{@-|J2B+2-nBf%=|Ft6z#vn*9%$yjbPvMY7-W z#en?VMSR##{x^Trfc_sg_Uhb-tT(UDNaXi}r@%8{4v?L85mc7xZO}d75I6=0nfr&3OeKd2`l5<;~d%Eqimu!Fvc? zDR0g;ydiu47k(|!=YyW!oI&v9%^4#Krh_)n0k(kM-~c!ShS1O4n{zvPjp|qV6G`ub z{MpwqV(^2se=cv%Jaq1$zp8Ty>HA5`o6|{p6R7XaIr(0n%E2AA-kfcJ$$Q{Ve43yY z>;UrS>_C?pDS2}aklT)jQ}~p0^ycW^7Uazly{WiMuADdL{r96c=Od`RIR~M+H)kxo ziC{8#5@>{`L1%(iunFwr-q;D<0}g?cs)PGP-kh5my++=gyO7D7GamZ&;#ix{!<(bn zSB-r+d%j2fD{u-7*u}X3w}J^^GMEkI%UK3p4L$`!|0gq5JK=Z@39QRrHBcWr#Q(y_$0?zHn(I_sY$L-(@>486wqpcBN2X7~+=f{}_ z|9t&8H=uh97!6eKh4^v4NuS11?g8*9;AyYq$N7Y7UA6W}wGV=x+mCY~+#&D!*`V;_ z_-@E4^(8-!xa9ETc!i7}9BZ?#1`m$&qVnLRa(Hkop%y$i&e?|qX#t}oTwoWj#BEi`X~>M^HF0a|EVb@&~ozKY5E2iet zhvcIXhcUrNvwXSI)(mGTyk8`Z;GMCCv?x{hWyDW5%RpX0s>6})5F*#Q~W9&=57;7LY`C=pyIGVy2W1ikQ=FH{m-V{MubsN?( zrO&|^6Fo8FO4HP(xN3_1^DK7_$}^{RZ`^E&{4bI+X377e96hb^zlg_mptr-8`FzRw z=ZjzcuA(rzmb`xPaz1s{_+L_M_+P9=+sX4H88cZgo)>Aj1yjoNN1^*bF1;VbmgH@5 zDc%4ZdRwH!xy!sQu2Jo96ot3Nwb2ssZhaK=yNZS6(Eawi@9NuL zNi6lzD$jqLD?8unD#kzcu<)?B3@ro?i}SIpJS;0$<~)uhc~!*a3QAs;=u^oxm9F|z zl*^I(Q}R+CBl;8kDb7nL_oTRtJSj@Y*wac0eM9VN*@MmTn8+s*HOf8_antD3_(a6# zI9uj4@QFyS|KXxu)vm038GTc{vG$^0(on06YqBQCdU{%ut(oLC)?~{(TCygKN3B?s zm5R9+T4T%73zWN~akwp3Jq+C>>{Y>a(z-#D{ajn{0H+`Mod z1$*(<&~Nia1&$+GidBkSvJ@-V(^4#MUVC0!DvzbuTHK9wEXBQ*=LiZ*vGrsrR+=Lz zEX9`Plu<7%#T$AYt2KMG5nIP&lT*t?sU!TW*V?*xF+WFOBkkI-ZQJ&6UL?e^WcGV5>`n-Nu?*R11mu2VF$+QTkv4VTENWulzV%q}deu(*axF*ag;Y~5I2WQx>RFZur*wwH!5A-H?{?rTU4HBh8inyqx!8It+LSy zoY$9^Q@XMJH`mO2Z@#ETEVut|=oUAJOS%-tQDgZvzpN*|t;tumsu*IfN$sS>sZp6YctI?0w)UI05<`#j*)TBzj+>QxjbT-3)etL*O`& zzUZ)h*aQ9#Z{px~FcC}!Q@{++0y@Du@Bz4x=tRqpP!_xo4uDUcbHmEExW*epuVWq&pNNtALpaKzS%X0C(%txLpMkI()LIfEEJ_aq75mPa#(SkQ?C?l$azsk8%ml)8?q!u z8>;3MZ79nTZK#@4v?1pdZAfWa3ekql7uDLGM;ppz<+P#=iO10pZOBrNIdGX_pN&#Q z8?qE#eo%A{ota82+EApgt%-E)R#8VAQrd{ohMZHhA*ExqA#=HBi8kb1HQJClru2q2 z$2mtEa$Z!?h9Zq;ME8EoZw@_V-75Bc%F8*eXhTuIOY@mFu&!qc%< zIB`XDaE4|*+uX7s=h0`Z3DS=B#Vbcq;A8%scO!l4EtS&ho9OyTpPefjS6`(B#{+ae z^5Tk{^WutYPIbjK$J8sX^P*aDBkk-GjVrD-E_KD7_Djw=SPE8v&EP|DDAB&3#Qcav z$3v%pX<#8}2hta9{W)_z^f34oT+PaI4Y&b}1f#$tFd0k-7qa5sf0(l18PEzAfez3O zwt^499&iX82dBZ+^lK2f0o(#cfiYk_m;!27+#4uy3m65)fT6!Y6RJCJ_UwVAt^wy- zaqpzm&0s8;0KN&Pf_Y#eSPE8w&0stD7#s%`>dyC1=?`x(P%l*9ZJ@l?es+Kr;AeP8 zz**4mAV&a31Kn>QA@57?Q~JL!YHO{vHnp?XI;UP~t#w{hYpp1nthJWJwYHkmTASrqYpXe}wa#g+ zRhpKl-tyMa%wdTgP*176hYmO(;e+x^0LvL8ns*^jH- z7g{4%@z>0y$Lx;ioZ_!3ZL6^PqTC~)*Nijq*DO(PP0=zr;;&hz_-nCbN4Qh+_-oe5 zDW$ROnp2IxW{#=iuPH67t*GV%#b2{L@k0EyT3(F5mh)Kii|6#}Y?Es!jaIUSYJZEe z)Olw1BL13rIhDo7QTB7b(=q;Z_B{9DyypQH{iOb~Fb4kwAT%vrOODu_ViF2Au zqK@X0D))uf$kkk8Zk$V;(_Eso=MwWpHJ6Ao&dep2D7R)~mSZk)PIHOUisdMp&n4E$ zDRnWIm{Xlg%rVtmqO|4`QO_loCtjFKYI$)k$$7PNNiNCLwR1@>$(1t$m?U=^yTrZ zON*#}(st{n9LK6Ri{sF}!`I6%@NG&Kt|l$OH|9XSu}=I0bYxW`c=X9F zTll3FsZe{Byx2+rLjCpHMF}5?>5hK!$d;uebj&c(@P(10#3_oZ;(<^;m#a6f$Ndxy zy(>ldx+dNkF?yov{PRUi2>VbQeM#Rczr%p{7#Fpaw{Wp}uFK}<=FZc%^rbkgdF_m3 z7H5xK7D1L{>#R7pY&ARo95LzS2`_3D&;zPc%O5bUh=DJ)@HF9mF zt3U6nwD1$>cZa_CFU?@(y7D|%yUvR4aqTyhMI9`+b5wOy{b^@FKv_y46=P_A0+!Sm*ArHzk({tQ2tRrm;H_kvU43>ZSW zVc-sMHy8^hg2`YCm;si6wIH_&Z>H>apuVWSgP?2`9`Lu=RKXcA0=j>zC-hmf;_9QTw`>)DjP{-YQ^5?d9CU(pU?}5~#{yt3m~&ws z*iFB~<_z|LBj7kV1Fq(py$0L}Mgm>K6TmZIHfRG&Ks#8M^4p-hz;3V?90Vu9S@D$J$@}2LjT=|7YpZtyB zV*mc{ZAaG=)PMQ@{@3|t_AUIvp1pD^Teb4CRf|SjwKX{IV5@dMYR+zsnzB_}!di%} z+Bw^*osasmRhz^6<0hq{nD~)#jMe8*J6i*;ehmsBG1d z#xtTBDdsna9_F^{yqwdrRY(1fHzI9mi!_cHJ-}97)sEMJY}HZgop(i}eW|L|wL$5= zg{|5WQ)Qd$NeVLW_^SX8O-C@NOWP^%yeHb6vpkjVaxb|}!l*{DQHmIB@ z8*$#HF9NxGB?_woRbYoY1^R87nKc4lyiX%$`a+)Y|L`l zpq!HpN@>}kL~|RIb#h8w*r3d*+Mvual?_U1*`P!mC7cg{+9It&$8@7;+DMW})yTWi*3SV+7?IszF+!^niHou9Grz=gC(3>Qc^|Ys&Ri4=roI)?goV$(%A$ zaX((!_c9x4xeuu>U1JUJ1mgDVdevQ1-VwRZm6i9RUTc;`j$^-X!w(DnK9D~lHU{yWF{ z%UceuE?TVJl)5*@7&LXq%&nO+$F)2k&ZIf670Jw5HTxoE674@z+IvV>JgcT6Gu5#2ytl*_G0tsxFmULIbE!(^VyW&inXRNins98rqHWQnMx zTx~TwZ@AXgg9%y=oEPQlF2!VGAGdAqy(gLVT(8>^-}NY+M`p@(U7lwIA~RXSv99c7 zcCb`5JU0}vnOwI^SaT?rgKuBb&Kt+CZK~YxkD4kce_N@HgpLA}KnwT~47skUazAJT zAAx@VxT$gvm=4|t$HBGNH&w=iIba7k4o3U|JTMhBgN2|IYyyYDX)xr5rYpSjM&WEDTa-UgsqBV6 zcDPbG1?_jdQW*&PF`7fb&EPI@AD9B#z;dt+oqb>}X|;1G(GiUP-Czos0S4>dj8Ut? zpFFH-FUMU3h(e|360NjbKKuuqH?ZRf_rj2-${y&Dzphl8>DA59+rXV*EKqAVp!0-y z&}Gnjp$DP*H!}Z{Ia;ijQS)Xnl3GUt)i4425O@>}d#h4;9Qp@({-=NJ5!NuC*2?Ia zi%F>WXD&a^jT=%!CaAGB$)U~ukXHvg(pIS5quZ1SS#6Uk}%SDPwdFp7id&$X#Dt1oQuXQ)M4G2_7BLR9OUM6P$-Ga~f9yuh!3ZkQ>`K zqMLN|Qg{Ypu3fM6O~sXSc_KM=9pZ?9j`9%nC^#~xsqz{0ICStYDwQ+P+o5BC^d5jt z0npie-D7stx8 z(k1W9vGyz6NnkHH0s0JVs$3850{4Nb;Ox&h$IuS&3Apa}xYxlLa37cgW~BT=XeSu= z^GanCbSHS6^wVGu>CeC*Mox3d2%SauFR{^zaFUeyH<0?z;rMVbOG@{gzg8YKtI~J z4%`ZEq})g_8tBUqo@K*V3vqXjE!3{k`x8A19s4FTA~*&5R^oYHuwefxt{!k2bfKl) zIdt{&q*3^8d}rj8b(g44UOicN!|oi;Yn6@O9G5{OcypW=y^7dQqSS>q#}aaQbDXm` z$9YjkKkd$;_S~ip{y+)&*3!@p*)yd zvf*jD*qy^#u1WbgCW;PasiH$kgHa?pl)3aeM2Aw|Jgya9P->$?S(dkvml2=3LUgE{ z4=?P_;qvKR5hKbReM9u};`|R!m$ycqS6U;jy*b>MiG#vXrFWLp6Il+n-}!rSY*p$@ zS-hxnjVi;LP4S{6b=|2w)mB{H;)UzIc!S{>YQNol!*w*G97Fh8Q|(xXtEFal4#_lL z){&ld>22Db!`Ftjs5!)rvZg4!@NK4bL|HqE-8sy6Yw0WzN6NKu#ick>+MUB(Q_16okLu~T8wLmM3wWynw%n0 znQy9c{j$9_;!Yc`QNCMievKaHZ$$IwV@p|}_l`yO{n$dbyrV;J7(L&YR?*yEu!FZ2 zy)SkCI=(M`2F-Wb(7RLrWAyAB7q-jB`MhgkU8s52@;-92=~tt-Eqz_}X!gc+@oyFf z|6$Wbe}%LAQ?4CQVYJG7a6C=#FW*-pnN4c;-4M?*l@olm>2I~zi+tY=-__POWhO25-7wF(s*$;oNNK*RxgUysH{6~| zW%43Ynt8dNz6_8)_ZnXYw7;3R*i?!8ZiuHIs2ulp;brTpnX}!hw5TmaO>>Kq(Qo$M zFvs5$xIIxy&24+NYrER=5yK0fHPIzVy&w68@=V48&QrhL{rP<`i?<0a&`;PP`$Rf3hfyR`)<_J@lk88 z(4Gaj%2uuJ>h9j0b}h);Rl1D4&c^$0NXsbKD874PS^darZmZk}=iLHN>se&A;CsT3 zWvQu4`Rb@?yGMMr-rBZIl;^kbO-H`(hFi3rTk=thUq8xPUc&t~wM^7+82P>%;^)ZA zx#h;O)?B+w^+u(udrM!H#CKj_&HowJdYvAR1Ac$^DIvrBPq|Zdiks zn3me#bX>N)r+F!*nZZJAHtAT8nX8D+W_`<)*LOUk*l(ITV!QPKA*A%<5A=DQ3>g2mlN-r;@TSdeB5W(?K)h}^@yMQ zd@Ro?s}4RNb2#Fa^7*(%QSR5d)%`eJw@X-a=q3An_Kd{3`6u*%Jvpv{-T>|fQ@}d# zIk@BYrpnWx8yo{S{|l_$U^UnSz5uu0fkhK^fIVQ~zk~-Sfp3DTU>;Zkc7grib8uyM zTR(Ce9w;#QpJTiIO^j^+5Og+J0k(mW$a>qCV>I$dz)Ua)ECY(W-v!kk1N)%fZT%SO z&%ppjbtt$UOaM=V*}%K4w~i1n6@MBgI}E8i^s$>%ky+VSf%$FdHlbU0@eD0#1Qz z>ElR{@6T~RdDV43UY&bs|6KcX%s|JxtuG<%-PSuvZvyq-z1sc>*7qCn4Q9KoPyTvS zWi8kNZXb?E1IVlM2)fK#$*c1Wxyp~O3YbGWdUbTq3-aoS-W2rZqq{s_o%X|5RdxW4 z+(*!TVAF`EigsJy2G#x?A42o}Ii`J`|8wA9$o?FMR0sEq_UE{U(QC9n#|UKFpW|-m z@ZwmTFN0TS`b~IWK?m3lJ_g6ZfSb7wz*wLiIv#;O4Z6WG@HrU#PtgIRzyzTDWH1#x z`T_rcKo3I1beAh3wKXg8rSRTp!vS1b8+q`E%x^T302y8G7zrI%c9J ze~zwuo+S!@j`C%&rlwswB%$_Vw{_*Uf<}Li%b^kcInIl+GBk@)7ycYe$l=d%&i)+d zMf(>19Ieb=oh6C>9CN5C?bRU}J*e5MBkIeaqm;_1kMid@pGpOPj?y|RQQA-boLn<% zM}Lm_DiO4UKgV2ANpgRV`<&CzAN)CaIi6H9e@-q@jVdkBW@!%(X$sU??6$7FO4ax0 zxNg^(Q_DpCww3#H#5Ytf*EgTDlXmhDhaM+?j&;>DrNdbadlDqQX$A@R_y8_ znE)^NbF6Eg{5j^SEN!H{J;aUv9Ho*h?eHN^82`ebQ$9B5tNt9fV#;xrcKFC7r5!#b z5jcushY$1gcGGBw59^qsTjS3W-#yh4Ds6-(;liI|E!U)c924*MA&LAsqKsnN?L#?w zU9;PVcw8%bC+)G@hh&C(lDAD=HM@PJ`itGxl~3m??fD@N^J2-LQ?5JDE6v$SyRECd z-m65lPcX-ZmD7ESyRAzm4sW6j_y3R%wPyQ&h~ttRSMcY!UeR#97jGvVL&=|$>$;wt zQfKhzdp5EaS267Qo7!5>*Am28(Y`4VTiA5M9}>3 zO5x8jR~mxHS^ga5>04>Hb!#!!H9L!lAJ*gsJBuW_JTm%1Evy;kFQpspt*)}N$E$a? zC0q`#&ojIWZUKH{x{`aVH+tLB`Ka!#K8fCx-?tj?t$sf57MuR~;{7_k?X7+ zop^QB?ya7mb)EhCd#g*Uw`*P{b(J&2)cAPBvrKge)vJHacICC!RQJH~oo;PYX4k^U zW1e+YBlBh24M$S$k;2F0_QY2@$qOHkdAXi^JksMj2|gaBg*abCACL1Y$1!9+p1ekB zxn^oBcE)jy^gHdXE{=UXmPTIf-s*`Ld^}3KHD;0I<1yFcL+`TxrYtp;mg=ALh zd8X^(<8h1Db4xyI@$36|@)GW^sb!*m>&SgP;^)ZAx#h+_9@p+ty;14v-m3a|%Izwz zHn}2ed_0X>5ubada($5i9vk<5B| z+v3;v@ic0|rQK5Q<0-cyU3yaE<8k@Ce$}OX^zm2{eLTuZZXb`OQC~hDYtT}SkH;;! z_PiuBSk3-Bk}-1?J|6434&~+J5v~5yBdPui5*4sWhQC<3?vj^hJO4}P8q%6Lp6K*Y z`cU|Ktiw9NAJ;GaMSPEurX)iCe~)=CrP}B{zn!)51!;R|F)u4QS8nq7tX*5(b6quP zd<6H)wVuoG<6fxtJgvIKi@geaiNCavzvWzSPFacY`wvU>6uT0h=S32R;Cm|BQDCOa(i@Q84&E{sIEC z!B%h--1uMMfhWNXFdwvob>ILv0S4ZGrM*9A#$%EEkJwv5Bk#{RWW9NR9zZ@7ECS0x zH;_H|eW)zh$D#KAR2a>HU>LXqj0cZ`d0+{!_otJzEUfzzy*TgB{C|%X8|Yo;81!7; zpHt|_`!ir%^!^Nmmc2huqSFknr1xk4zhlHezp*{NKSSWj`!g0g3ABKAunBwsJ_VnF z>*?biAou<}KwhJIKHi`4w0|z|&vbOAK1jqY>Rd*8HEHe6zMAwFP~ZF0`mdWR&)i+> z{dwfyP#SCpBS&*h0C|5NMwb~dd4HynyY9}27ShrCqx)Wv_eb=mpnqk(Ki&64@6T4K zygwg6FV*{VP<15l&k#nhk@x3jWb*#p1sz@-Yx8CB{yg)iO_f%#0&D|&z%kH&3|?<= z50LlgVdzt!3w#Pb1B3o8I^a%lFHrsw@HCM3XEwA=dG=u+%%ZuR^e%7+XtwwqDkIKd zMqxO(AItz9;QYKlchS@FpzQs55Z>dUp7&=M{PXqxe84ri4;%v*Zypb@-3&Wmy$ zn?1jfJl=sK^R4RCX zl-5y+(th&(4O(<>Q#x`y+|G zKcb9c^8P4CuWP(N;&H9i_5Mg^xF>nr)K%mCN%a@rALY}zO5PuFm=}BT{zxNlOKE03 ztVdYy`J+d2J^lMlNA^sPF!_KajXogP)0+=SI-K9k2PBS5a&(0c$h>gX2Op3)97!D? zkag=(>I^=hT&C+F_W?NQvPyyh1z&e`~dh(>PmWr8oh;S9{(Nk%2^W3>T?*(h97NL4S ztl6%-)}UIikTr9fdxgyRJfRwyL6cWVQtp}_ULo;)jU%t|3Rz~kyh7q}M+UEu(n6d; zqF2aymEjmlULi?co2Wo-g;&Tm((mLI631R4OCzt=E0lP_E2OkrVO~jIA#*)GVYV&) z{IS$jTB?JdB(IPpfXFUE~heOSSH%oD&M zsC0F2RlP#xc9mC~T#?QBpFfRS5ubadxnuqTHh-qiQ$rYDYuk+g)FzeC_U-n6>`0%s!QqU6*4z^g_M)rULi}P zzPv)#prsyOAtn}$bNsizJ#pf1{^sP# zzy00m(|%4|o}LxGD~@`QKPz6t6L6j%jcxm`TVe7w{S0<-&~6SNb+PwtJAWUr2bTB; zo{#h%zMC2V&R)ZgAiv|Ab}#}+=YhYxsxo}WRh4VOIPAdJgGs~rcVtbaa*R$b1w*KN z)Hu%FpHwQFZ;SbfbY|V}^CXRI0Jy61R*0g_Zav}8^%q}M?2{1J;q~_R6)QSAR)u(2 zMKr9gjT_&7yS#tMyovld@OPKKhX^wQy?FN7jT`lU*nQMG6=;8ud|waNN1jN>AknTK z=ew)MNc6Si@2EiIlfG(Ny`Iqy=ZMz1ndgW2&a2mnYsrqZXOhljQ-x@Z#2~OtJZ#`I zmA|U8bg9Nd_0F2rMQVF!ZRX6xrGD4TUIaSdngz3C?(+?N2%!EkpP@D#v-T%cyM2p4 Q%azM}NwjtPD6a7T0gD>%8vp = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("word_break_fwd.bigendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} + +#[cfg(target_endian = "little")] +lazy_static! { + pub static ref WORD_BREAK_FWD: ::regex_automata::SparseDFA<&'static [u8], u32> = { + #[repr(C)] + struct Aligned { + _align: [u8; 0], + bytes: B, + } + + static ALIGNED: &'static Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!("word_break_fwd.littleendian.dfa"), + }; + + unsafe { + ::regex_automata::SparseDFA::from_bytes(&ALIGNED.bytes) + } + }; +} diff --git a/vendor/bstr/src/unicode/grapheme.rs b/vendor/bstr/src/unicode/grapheme.rs new file mode 100644 index 0000000000..fe9a852370 --- /dev/null +++ b/vendor/bstr/src/unicode/grapheme.rs @@ -0,0 +1,357 @@ +use regex_automata::DFA; + +use bstr::BStr; +use unicode::fsm::grapheme_break_fwd::GRAPHEME_BREAK_FWD; +use unicode::fsm::grapheme_break_rev::GRAPHEME_BREAK_REV; +use unicode::fsm::regional_indicator_rev::REGIONAL_INDICATOR_REV; +use utf8; + +/// An iterator over grapheme clusters in a byte string. +/// +/// This iterator is typically constructed by +/// [`bstr::graphemes`](struct.BStr.html#method.graphemes). +/// +/// Unicode defines a grapheme cluster as an *approximation* to a single user +/// visible character. A grapheme cluster, or just "grapheme," is made up of +/// one or more codepoints. For end user oriented tasks, one should generally +/// prefer using graphemes instead of [`Chars`](struct.Chars.html), which +/// always yields one codepoint at a time. +/// +/// Since graphemes are made up of one or more codepoints, this iterator yields +/// `&str` elements. When invalid UTF-8 is encountered, replacement codepoints +/// are [substituted](index.html#handling-of-invalid-utf-8). +/// +/// This iterator can be used in reverse. When reversed, exactly the same +/// set of grapheme clusters are yielded, but in reverse order. +/// +/// This iterator only yields *extended* grapheme clusters, in accordance with +/// [UAX #29](https://www.unicode.org/reports/tr29/tr29-33.html#Grapheme_Cluster_Boundaries). +#[derive(Clone, Debug)] +pub struct Graphemes<'a> { + bs: &'a BStr, +} + +impl<'a> Graphemes<'a> { + pub(crate) fn new(bs: &'a BStr) -> Graphemes<'a> { + Graphemes { bs } + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::B; + /// + /// let mut it = B("abc").graphemes(); + /// + /// assert_eq!("abc", it.as_bstr()); + /// it.next(); + /// assert_eq!("bc", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!("", it.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.bs + } +} + +impl<'a> Iterator for Graphemes<'a> { + type Item = &'a str; + + #[inline] + fn next(&mut self) -> Option<&'a str> { + let (grapheme, size) = decode_grapheme(self.bs); + if size == 0 { + return None; + } + self.bs = &self.bs[size..]; + Some(grapheme) + } +} + +impl<'a> DoubleEndedIterator for Graphemes<'a> { + #[inline] + fn next_back(&mut self) -> Option<&'a str> { + let (grapheme, size) = decode_last_grapheme(self.bs); + if size == 0 { + return None; + } + self.bs = &self.bs[..self.bs.len()-size]; + Some(grapheme) + } +} + +/// An iterator over grapheme clusters in a byte string and their byte index +/// positions. +/// +/// This iterator is typically constructed by +/// [`bstr::grapheme_indices`](struct.BStr.html#method.grapheme_indices). +/// +/// Unicode defines a grapheme cluster as an *approximation* to a single user +/// visible character. A grapheme cluster, or just "grapheme," is made up of +/// one or more codepoints. For end user oriented tasks, one should generally +/// prefer using graphemes instead of [`Chars`](struct.Chars.html), which +/// always yields one codepoint at a time. +/// +/// Since graphemes are made up of one or more codepoints, this iterator +/// yields `&str` elements (along with their start and end byte offsets). +/// When invalid UTF-8 is encountered, replacement codepoints are +/// [substituted](index.html#handling-of-invalid-utf-8). Because of this, the +/// indices yielded by this iterator may not correspond to the length of the +/// grapheme cluster yielded with those indices. For example, when this +/// iterator encounters `\xFF` in the byte string, then it will yield a pair +/// of indices ranging over a single byte, but will provide an `&str` +/// equivalent to `"\u{FFFD}"`, which is three bytes in length. However, when +/// given only valid UTF-8, then all indices are in exact correspondence with +/// their paired grapheme cluster. +/// +/// This iterator can be used in reverse. When reversed, exactly the same +/// set of grapheme clusters are yielded, but in reverse order. +/// +/// This iterator only yields *extended* grapheme clusters, in accordance with +/// [UAX #29](https://www.unicode.org/reports/tr29/tr29-33.html#Grapheme_Cluster_Boundaries). +#[derive(Clone, Debug)] +pub struct GraphemeIndices<'a> { + bs: &'a BStr, + forward_index: usize, + reverse_index: usize, +} + +impl<'a> GraphemeIndices<'a> { + pub(crate) fn new(bs: &'a BStr) -> GraphemeIndices<'a> { + GraphemeIndices { bs: bs, forward_index: 0, reverse_index: bs.len() } + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::B; + /// + /// let mut it = B("abc").grapheme_indices(); + /// + /// assert_eq!("abc", it.as_bstr()); + /// it.next(); + /// assert_eq!("bc", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!("", it.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.bs + } +} + +impl<'a> Iterator for GraphemeIndices<'a> { + type Item = (usize, usize, &'a str); + + #[inline] + fn next(&mut self) -> Option<(usize, usize, &'a str)> { + let index = self.forward_index; + let (grapheme, size) = decode_grapheme(self.bs); + if size == 0 { + return None; + } + self.bs = &self.bs[size..]; + self.forward_index += size; + Some((index, index + size, grapheme)) + } +} + +impl<'a> DoubleEndedIterator for GraphemeIndices<'a> { + #[inline] + fn next_back(&mut self) -> Option<(usize, usize, &'a str)> { + let (grapheme, size) = decode_last_grapheme(self.bs); + if size == 0 { + return None; + } + self.bs = &self.bs[..self.bs.len()-size]; + self.reverse_index -= size; + Some((self.reverse_index, self.reverse_index + size, grapheme)) + } +} + +/// Decode a grapheme from the given byte string. +/// +/// This returns the resulting grapheme (which may be a Unicode replacement +/// codepoint if invalid UTF-8 was found), along with the number of bytes +/// decoded in the byte string. The number of bytes decoded may not be the +/// same as the length of grapheme in the case where invalid UTF-8 is found. +pub fn decode_grapheme(bs: &BStr) -> (&str, usize) { + if bs.is_empty() { + ("", 0) + } else if let Some(end) = GRAPHEME_BREAK_FWD.find(bs.as_bytes()) { + // Safe because a match can only occur for valid UTF-8. + let grapheme = unsafe { bs[..end].to_str_unchecked() }; + (grapheme, grapheme.len()) + } else { + const INVALID: &'static str = "\u{FFFD}"; + // No match on non-empty bytes implies we found invalid UTF-8. + let (_, size) = utf8::decode_lossy(bs.as_bytes()); + (INVALID, size) + } +} + +fn decode_last_grapheme(bs: &BStr) -> (&str, usize) { + if bs.is_empty() { + ("", 0) + } else if let Some(mut start) = GRAPHEME_BREAK_REV.rfind(bs.as_bytes()) { + start = adjust_rev_for_regional_indicator(bs, start); + // Safe because a match can only occur for valid UTF-8. + let grapheme = unsafe { bs[start..].to_str_unchecked() }; + (grapheme, grapheme.len()) + } else { + const INVALID: &'static str = "\u{FFFD}"; + // No match on non-empty bytes implies we found invalid UTF-8. + let (_, size) = utf8::decode_last_lossy(bs.as_bytes()); + (INVALID, size) + } +} + +/// Return the correct offset for the next grapheme decoded at the end of the +/// given byte string, where `i` is the initial guess. In particular, +/// `&bs[i..]` represents the candidate grapheme. +/// +/// `i` is returned by this function in all cases except when `&bs[i..]` is +/// a pair of regional indicator codepoints. In that case, if an odd number of +/// additional regional indicator codepoints precedes `i`, then `i` is +/// adjusted such that it points to only a single regional indicator. +/// +/// This "fixing" is necessary to handle the requirement that a break cannot +/// occur between regional indicators where it would cause an odd number of +/// regional indicators to exist before the break from the *start* of the +/// string. A reverse regex cannot detect this case easily without look-around. +fn adjust_rev_for_regional_indicator(mut bs: &BStr, i: usize) -> usize { + // All regional indicators use a 4 byte encoding, and we only care about + // the case where we found a pair of regional indicators. + if bs.len() - i != 8 { + return i; + } + // Count all contiguous occurrences of regional indicators. If there's an + // even number of them, then we can accept the pair we found. Otherwise, + // we can only take one of them. + // + // FIXME: This is quadratic in the worst case, e.g., a string of just + // regional indicator codepoints. A fix probably requires refactoring this + // code a bit such that we don't rescan regional indicators. + let mut count = 0; + while let Some(start) = REGIONAL_INDICATOR_REV.rfind(bs.as_bytes()) { + bs = &bs[..start]; + count += 1; + } + if count % 2 == 0 { + i + } else { + i + 4 + } +} + +#[cfg(test)] +mod tests { + use ucd_parse::GraphemeClusterBreakTest; + + use bstr::B; + use tests::LOSSY_TESTS; + use super::*; + + #[test] + fn forward_ucd() { + for (i, test) in ucdtests().into_iter().enumerate() { + let given = test.grapheme_clusters.concat(); + let got: Vec = Graphemes::new(B(&given)) + .map(|cluster| cluster.to_string()) + .collect(); + assert_eq!( + test.grapheme_clusters, + got, + "\ngrapheme forward break test {} failed:\n\ + given: {:?}\n\ + expected: {:?}\n\ + got: {:?}\n", + i, + uniescape(&given), + uniescape_vec(&test.grapheme_clusters), + uniescape_vec(&got), + ); + } + } + + #[test] + fn reverse_ucd() { + for (i, test) in ucdtests().into_iter().enumerate() { + let given = test.grapheme_clusters.concat(); + let mut got: Vec = Graphemes::new(B(&given)) + .rev() + .map(|cluster| cluster.to_string()) + .collect(); + got.reverse(); + assert_eq!( + test.grapheme_clusters, + got, + "\n\ngrapheme reverse break test {} failed:\n\ + given: {:?}\n\ + expected: {:?}\n\ + got: {:?}\n", + i, + uniescape(&given), + uniescape_vec(&test.grapheme_clusters), + uniescape_vec(&got), + ); + } + } + + #[test] + fn forward_lossy() { + for &(expected, input) in LOSSY_TESTS { + let got = Graphemes::new(B(input)).collect::(); + assert_eq!(expected, got); + } + } + + #[test] + fn reverse_lossy() { + for &(expected, input) in LOSSY_TESTS { + let expected: String = expected.chars().rev().collect(); + let got = Graphemes::new(B(input)) + .rev() + .collect::(); + assert_eq!(expected, got); + } + } + + fn uniescape(s: &str) -> String { + s.chars().flat_map(|c| c.escape_unicode()).collect::() + } + + fn uniescape_vec(strs: &[String]) -> Vec { + strs.iter().map(|s| uniescape(s)).collect() + } + + /// Return all of the UCD for grapheme breaks. + fn ucdtests() -> Vec { + const TESTDATA: &'static str = include_str!( + "data/GraphemeBreakTest.txt" + ); + + let mut tests = vec![]; + for mut line in TESTDATA.lines() { + line = line.trim(); + if line.starts_with("#") || line.contains("surrogate") { + continue; + } + tests.push(line.parse().unwrap()); + } + tests + } +} diff --git a/vendor/bstr/src/unicode/mod.rs b/vendor/bstr/src/unicode/mod.rs new file mode 100644 index 0000000000..b3835c7f2b --- /dev/null +++ b/vendor/bstr/src/unicode/mod.rs @@ -0,0 +1,12 @@ +pub use self::grapheme::{Graphemes, GraphemeIndices, decode_grapheme}; +pub use self::sentence::{Sentences, SentenceIndices}; +pub use self::whitespace::{whitespace_len_fwd, whitespace_len_rev}; +pub use self::word::{ + Words, WordIndices, WordsWithBreaks, WordsWithBreakIndices, +}; + +mod fsm; +mod grapheme; +mod sentence; +mod whitespace; +mod word; diff --git a/vendor/bstr/src/unicode/sentence.rs b/vendor/bstr/src/unicode/sentence.rs new file mode 100644 index 0000000000..f732f081ad --- /dev/null +++ b/vendor/bstr/src/unicode/sentence.rs @@ -0,0 +1,221 @@ +use regex_automata::DFA; + +use bstr::BStr; +use unicode::fsm::sentence_break_fwd::SENTENCE_BREAK_FWD; +use utf8; + +/// An iterator over sentences in a byte string. +/// +/// This iterator is typically constructed by +/// [`bstr::sentences`](struct.BStr.html#method.sentences). +/// +/// Sentences typically include their trailing punctuation and whitespace. +/// +/// Since sentences are made up of one or more codepoints, this iterator yields +/// `&str` elements. When invalid UTF-8 is encountered, replacement codepoints +/// are [substituted](index.html#handling-of-invalid-utf-8). +/// +/// This iterator yields words in accordance with the default sentence boundary +/// rules specified in +/// [UAX #29](https://www.unicode.org/reports/tr29/tr29-33.html#Sentence_Boundaries). +#[derive(Clone, Debug)] +pub struct Sentences<'a> { + bs: &'a BStr, +} + +impl<'a> Sentences<'a> { + pub(crate) fn new(bs: &'a BStr) -> Sentences<'a> { + Sentences { bs } + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::B; + /// + /// let mut it = B("I want this. Not that. Right now.").sentences(); + /// + /// assert_eq!("I want this. Not that. Right now.", it.as_bstr()); + /// it.next(); + /// assert_eq!("Not that. Right now.", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!("", it.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.bs + } +} + +impl<'a> Iterator for Sentences<'a> { + type Item = &'a str; + + #[inline] + fn next(&mut self) -> Option<&'a str> { + let (sentence, size) = decode_sentence(self.bs); + if size == 0 { + return None; + } + self.bs = &self.bs[size..]; + Some(sentence) + } +} + +/// An iterator over sentences in a byte string, along with their byte offsets. +/// +/// This iterator is typically constructed by +/// [`bstr::sentence_indices`](struct.BStr.html#method.sentence_indices). +/// +/// Sentences typically include their trailing punctuation and whitespace. +/// +/// Since sentences are made up of one or more codepoints, this iterator +/// yields `&str` elements (along with their start and end byte offsets). +/// When invalid UTF-8 is encountered, replacement codepoints are +/// [substituted](index.html#handling-of-invalid-utf-8). Because of this, the +/// indices yielded by this iterator may not correspond to the length of the +/// sentence yielded with those indices. For example, when this iterator +/// encounters `\xFF` in the byte string, then it will yield a pair of indices +/// ranging over a single byte, but will provide an `&str` equivalent to +/// `"\u{FFFD}"`, which is three bytes in length. However, when given only +/// valid UTF-8, then all indices are in exact correspondence with their paired +/// word. +/// +/// This iterator yields words in accordance with the default sentence boundary +/// rules specified in +/// [UAX #29](https://www.unicode.org/reports/tr29/tr29-33.html#Sentence_Boundaries). +#[derive(Clone, Debug)] +pub struct SentenceIndices<'a> { + bs: &'a BStr, + forward_index: usize, +} + +impl<'a> SentenceIndices<'a> { + pub(crate) fn new(bs: &'a BStr) -> SentenceIndices<'a> { + SentenceIndices { bs: bs, forward_index: 0 } + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::B; + /// + /// let mut it = B("I want this. Not that. Right now.").sentence_indices(); + /// + /// assert_eq!("I want this. Not that. Right now.", it.as_bstr()); + /// it.next(); + /// assert_eq!("Not that. Right now.", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!("", it.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.bs + } +} + +impl<'a> Iterator for SentenceIndices<'a> { + type Item = (usize, usize, &'a str); + + #[inline] + fn next(&mut self) -> Option<(usize, usize, &'a str)> { + let index = self.forward_index; + let (word, size) = decode_sentence(self.bs); + if size == 0 { + return None; + } + self.bs = &self.bs[size..]; + self.forward_index += size; + Some((index, index + size, word)) + } +} + +fn decode_sentence(bs: &BStr) -> (&str, usize) { + if bs.is_empty() { + ("", 0) + } else if let Some(end) = SENTENCE_BREAK_FWD.find(bs.as_bytes()) { + // Safe because a match can only occur for valid UTF-8. + let sentence = unsafe { bs[..end].to_str_unchecked() }; + (sentence, sentence.len()) + } else { + const INVALID: &'static str = "\u{FFFD}"; + // No match on non-empty bytes implies we found invalid UTF-8. + let (_, size) = utf8::decode_lossy(bs.as_bytes()); + (INVALID, size) + } +} + +#[cfg(test)] +mod tests { + use ucd_parse::SentenceBreakTest; + + use bstr::{B, BStr}; + + #[test] + fn forward_ucd() { + for (i, test) in ucdtests().into_iter().enumerate() { + let given = test.sentences.concat(); + let got = sentences(given.as_bytes()); + assert_eq!( + test.sentences, + got, + "\n\nsentence forward break test {} failed:\n\ + given: {:?}\n\ + expected: {:?}\n\ + got: {:?}\n", + i, + BStr::new(&given), + strs_to_bstrs(&test.sentences), + strs_to_bstrs(&got), + ); + } + } + + // Some additional tests that don't seem to be covered by the UCD tests. + #[test] + fn forward_additional() { + assert_eq!(vec!["a.. ", "A"], sentences(b"a.. A")); + assert_eq!(vec!["a.. a"], sentences(b"a.. a")); + + assert_eq!(vec!["a... ", "A"], sentences(b"a... A")); + assert_eq!(vec!["a... a"], sentences(b"a... a")); + + assert_eq!(vec!["a...,..., a"], sentences(b"a...,..., a")); + } + + fn sentences(bytes: &[u8]) -> Vec<&str> { + BStr::new(bytes).sentences().collect() + } + + fn strs_to_bstrs>(strs: &[S]) -> Vec<&BStr> { + strs.iter().map(|s| B(s.as_ref())).collect() + } + + /// Return all of the UCD for sentence breaks. + fn ucdtests() -> Vec { + const TESTDATA: &'static str = include_str!( + "data/SentenceBreakTest.txt" + ); + + let mut tests = vec![]; + for mut line in TESTDATA.lines() { + line = line.trim(); + if line.starts_with("#") || line.contains("surrogate") { + continue; + } + tests.push(line.parse().unwrap()); + } + tests + } +} diff --git a/vendor/bstr/src/unicode/whitespace.rs b/vendor/bstr/src/unicode/whitespace.rs new file mode 100644 index 0000000000..a8da1447ac --- /dev/null +++ b/vendor/bstr/src/unicode/whitespace.rs @@ -0,0 +1,14 @@ +use regex_automata::DFA; + +use unicode::fsm::whitespace_anchored_fwd::WHITESPACE_ANCHORED_FWD; +use unicode::fsm::whitespace_anchored_rev::WHITESPACE_ANCHORED_REV; + +/// Return the first position of a non-whitespace character. +pub fn whitespace_len_fwd(slice: &[u8]) -> usize { + WHITESPACE_ANCHORED_FWD.find(slice).unwrap_or(0) +} + +/// Return the last position of a non-whitespace character. +pub fn whitespace_len_rev(slice: &[u8]) -> usize { + WHITESPACE_ANCHORED_REV.rfind(slice).unwrap_or(slice.len()) +} diff --git a/vendor/bstr/src/unicode/word.rs b/vendor/bstr/src/unicode/word.rs new file mode 100644 index 0000000000..d55dfc5038 --- /dev/null +++ b/vendor/bstr/src/unicode/word.rs @@ -0,0 +1,447 @@ +use regex_automata::DFA; + +use bstr::BStr; +use unicode::fsm::simple_word_fwd::SIMPLE_WORD_FWD; +use unicode::fsm::word_break_fwd::WORD_BREAK_FWD; +use utf8; + +/// An iterator over words in a byte string. +/// +/// This iterator is typically constructed by +/// [`bstr::words`](struct.BStr.html#method.words). +/// +/// This is similar to the [`WordsWithBreaks`](struct.WordsWithBreaks.html) +/// iterator, except it only returns elements that contain a "word" character. +/// A word character is defined by UTS #18 (Annex C) to be the combination +/// of the `Alphabetic` and `Join_Control` properties, along with the +/// `Decimal_Number`, `Mark` and `Connector_Punctuation` general categories. +/// +/// Since words are made up of one or more codepoints, this iterator yields +/// `&str` elements. When invalid UTF-8 is encountered, replacement codepoints +/// are [substituted](index.html#handling-of-invalid-utf-8). +/// +/// This iterator yields words in accordance with the default word boundary +/// rules specified in +/// [UAX #29](https://www.unicode.org/reports/tr29/tr29-33.html#Word_Boundaries). +/// In particular, this may not be suitable for Japanese and Chinese scripts +/// that do not use spaces between words. +#[derive(Clone, Debug)] +pub struct Words<'a>(WordsWithBreaks<'a>); + +impl<'a> Words<'a> { + pub(crate) fn new(bs: &'a BStr) -> Words<'a> { + Words(WordsWithBreaks::new(bs)) + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::B; + /// + /// let mut it = B("foo bar baz").words(); + /// + /// assert_eq!("foo bar baz", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!(" baz", it.as_bstr()); + /// it.next(); + /// assert_eq!("", it.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.0.as_bstr() + } +} + +impl<'a> Iterator for Words<'a> { + type Item = &'a str; + + #[inline] + fn next(&mut self) -> Option<&'a str> { + while let Some(word) = self.0.next() { + if SIMPLE_WORD_FWD.is_match(word.as_bytes()) { + return Some(word); + } + } + None + } +} + +/// An iterator over words in a byte string and their byte index positions. +/// +/// This iterator is typically constructed by +/// [`bstr::word_indices`](struct.BStr.html#method.word_indices). +/// +/// This is similar to the +/// [`WordsWithBreakIndices`](struct.WordsWithBreakIndices.html) iterator, +/// except it only returns elements that contain a "word" character. A +/// word character is defined by UTS #18 (Annex C) to be the combination +/// of the `Alphabetic` and `Join_Control` properties, along with the +/// `Decimal_Number`, `Mark` and `Connector_Punctuation` general categories. +/// +/// Since words are made up of one or more codepoints, this iterator +/// yields `&str` elements (along with their start and end byte offsets). +/// When invalid UTF-8 is encountered, replacement codepoints are +/// [substituted](index.html#handling-of-invalid-utf-8). Because of this, the +/// indices yielded by this iterator may not correspond to the length of the +/// word yielded with those indices. For example, when this iterator encounters +/// `\xFF` in the byte string, then it will yield a pair of indices ranging +/// over a single byte, but will provide an `&str` equivalent to `"\u{FFFD}"`, +/// which is three bytes in length. However, when given only valid UTF-8, then +/// all indices are in exact correspondence with their paired word. +/// +/// This iterator yields words in accordance with the default word boundary +/// rules specified in +/// [UAX #29](https://www.unicode.org/reports/tr29/tr29-33.html#Word_Boundaries). +/// In particular, this may not be suitable for Japanese and Chinese scripts +/// that do not use spaces between words. +#[derive(Clone, Debug)] +pub struct WordIndices<'a>(WordsWithBreakIndices<'a>); + +impl<'a> WordIndices<'a> { + pub(crate) fn new(bs: &'a BStr) -> WordIndices<'a> { + WordIndices(WordsWithBreakIndices::new(bs)) + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::B; + /// + /// let mut it = B("foo bar baz").word_indices(); + /// + /// assert_eq!("foo bar baz", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!(" baz", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!("", it.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.0.as_bstr() + } +} + +impl<'a> Iterator for WordIndices<'a> { + type Item = (usize, usize, &'a str); + + #[inline] + fn next(&mut self) -> Option<(usize, usize, &'a str)> { + while let Some((start, end, word)) = self.0.next() { + if SIMPLE_WORD_FWD.is_match(word.as_bytes()) { + return Some((start, end, word)); + } + } + None + } +} + +/// An iterator over all word breaks in a byte string. +/// +/// This iterator is typically constructed by +/// [`bstr::words_with_breaks`](struct.BStr.html#method.words_with_breaks). +/// +/// This iterator yields not only all words, but the content that comes between +/// words. In particular, if all elements yielded by this iterator are +/// concatenated, then the result is the original string (subject to Unicode +/// replacement codepoint substitutions). +/// +/// Since words are made up of one or more codepoints, this iterator yields +/// `&str` elements. When invalid UTF-8 is encountered, replacement codepoints +/// are [substituted](index.html#handling-of-invalid-utf-8). +/// +/// This iterator yields words in accordance with the default word boundary +/// rules specified in +/// [UAX #29](https://www.unicode.org/reports/tr29/tr29-33.html#Word_Boundaries). +/// In particular, this may not be suitable for Japanese and Chinese scripts +/// that do not use spaces between words. +#[derive(Clone, Debug)] +pub struct WordsWithBreaks<'a> { + bs: &'a BStr, +} + +impl<'a> WordsWithBreaks<'a> { + pub(crate) fn new(bs: &'a BStr) -> WordsWithBreaks<'a> { + WordsWithBreaks { bs } + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::B; + /// + /// let mut it = B("foo bar baz").words_with_breaks(); + /// + /// assert_eq!("foo bar baz", it.as_bstr()); + /// it.next(); + /// assert_eq!(" bar baz", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!(" baz", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!("", it.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.bs + } +} + +impl<'a> Iterator for WordsWithBreaks<'a> { + type Item = &'a str; + + #[inline] + fn next(&mut self) -> Option<&'a str> { + let (word, size) = decode_word(self.bs); + if size == 0 { + return None; + } + self.bs = &self.bs[size..]; + Some(word) + } +} + +/// An iterator over all word breaks in a byte string, along with their byte +/// index positions. +/// +/// This iterator is typically constructed by +/// [`bstr::words_with_break_indices`](struct.BStr.html#method.words_with_break_indices). +/// +/// This iterator yields not only all words, but the content that comes between +/// words. In particular, if all elements yielded by this iterator are +/// concatenated, then the result is the original string (subject to Unicode +/// replacement codepoint substitutions). +/// +/// Since words are made up of one or more codepoints, this iterator +/// yields `&str` elements (along with their start and end byte offsets). +/// When invalid UTF-8 is encountered, replacement codepoints are +/// [substituted](index.html#handling-of-invalid-utf-8). Because of this, the +/// indices yielded by this iterator may not correspond to the length of the +/// word yielded with those indices. For example, when this iterator encounters +/// `\xFF` in the byte string, then it will yield a pair of indices ranging +/// over a single byte, but will provide an `&str` equivalent to `"\u{FFFD}"`, +/// which is three bytes in length. However, when given only valid UTF-8, then +/// all indices are in exact correspondence with their paired word. +/// +/// This iterator yields words in accordance with the default word boundary +/// rules specified in +/// [UAX #29](https://www.unicode.org/reports/tr29/tr29-33.html#Word_Boundaries). +/// In particular, this may not be suitable for Japanese and Chinese scripts +/// that do not use spaces between words. +#[derive(Clone, Debug)] +pub struct WordsWithBreakIndices<'a> { + bs: &'a BStr, + forward_index: usize, +} + +impl<'a> WordsWithBreakIndices<'a> { + pub(crate) fn new(bs: &'a BStr) -> WordsWithBreakIndices<'a> { + WordsWithBreakIndices { bs: bs, forward_index: 0 } + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::B; + /// + /// let mut it = B("foo bar baz").words_with_break_indices(); + /// + /// assert_eq!("foo bar baz", it.as_bstr()); + /// it.next(); + /// assert_eq!(" bar baz", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!(" baz", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!("", it.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.bs + } +} + +impl<'a> Iterator for WordsWithBreakIndices<'a> { + type Item = (usize, usize, &'a str); + + #[inline] + fn next(&mut self) -> Option<(usize, usize, &'a str)> { + let index = self.forward_index; + let (word, size) = decode_word(self.bs); + if size == 0 { + return None; + } + self.bs = &self.bs[size..]; + self.forward_index += size; + Some((index, index + size, word)) + } +} + +fn decode_word(bs: &BStr) -> (&str, usize) { + if bs.is_empty() { + ("", 0) + } else if let Some(end) = WORD_BREAK_FWD.find(bs.as_bytes()) { + // Safe because a match can only occur for valid UTF-8. + let word = unsafe { bs[..end].to_str_unchecked() }; + (word, word.len()) + } else { + const INVALID: &'static str = "\u{FFFD}"; + // No match on non-empty bytes implies we found invalid UTF-8. + let (_, size) = utf8::decode_lossy(bs.as_bytes()); + (INVALID, size) + } +} + +#[cfg(test)] +mod tests { + use ucd_parse::WordBreakTest; + + use bstr::BStr; + + #[test] + fn forward_ucd() { + for (i, test) in ucdtests().into_iter().enumerate() { + let given = test.words.concat(); + let got = words(given.as_bytes()); + assert_eq!( + test.words, + got, + "\n\nword forward break test {} failed:\n\ + given: {:?}\n\ + expected: {:?}\n\ + got: {:?}\n", + i, + BStr::new(&given), + strs_to_bstrs(&test.words), + strs_to_bstrs(&got), + ); + } + } + + // Some additional tests that don't seem to be covered by the UCD tests. + // + // It's pretty amazing that the UCD tests miss these cases. I only found + // them by running this crate's segmenter and ICU's segmenter on the same + // text and comparing the output. + #[test] + fn forward_additional() { + assert_eq!(vec!["a", ".", " ", "Y"], words(b"a. Y")); + assert_eq!( + vec!["r", ".", " ", "Yo"], + words(b"r. Yo") + ); + assert_eq!( + vec!["whatsoever", ".", " ", "You", " ", "may"], + words(b"whatsoever. You may") + ); + assert_eq!( + vec!["21stcentury'syesterday"], + words(b"21stcentury'syesterday") + ); + + assert_eq!( + vec!["Bonta_", "'", "s"], + words(b"Bonta_'s") + ); + assert_eq!( + vec!["_vhat's"], + words(b"_vhat's") + ); + assert_eq!( + vec!["__on'anima"], + words(b"__on'anima") + ); + assert_eq!( + vec!["123_", "'", "4"], + words(b"123_'4") + ); + assert_eq!( + vec!["_123'4"], + words(b"_123'4") + ); + assert_eq!( + vec!["__12'345"], + words(b"__12'345") + ); + + assert_eq!( + vec!["tomorrowat4", ":", "00", ","], + words(b"tomorrowat4:00,") + ); + assert_eq!( + vec!["RS1", "'", "s"], + words(b"RS1's") + ); + assert_eq!( + vec!["X38"], + words(b"X38") + ); + + assert_eq!( + vec!["4abc", ":", "00", ","], + words(b"4abc:00,") + ); + assert_eq!( + vec!["12S", "'", "1"], + words(b"12S'1") + ); + assert_eq!( + vec!["1XY"], + words(b"1XY") + ); + + assert_eq!( + vec!["\u{FEFF}", "Ты"], + words("\u{FEFF}Ты".as_bytes()) + ); + } + + fn words(bytes: &[u8]) -> Vec<&str> { + BStr::new(bytes).words_with_breaks().collect() + } + + fn strs_to_bstrs>(strs: &[S]) -> Vec<&BStr> { + strs.iter().map(|s| BStr::new(s.as_ref())).collect() + } + + /// Return all of the UCD for word breaks. + fn ucdtests() -> Vec { + const TESTDATA: &'static str = include_str!( + "data/WordBreakTest.txt" + ); + + let mut tests = vec![]; + for mut line in TESTDATA.lines() { + line = line.trim(); + if line.starts_with("#") || line.contains("surrogate") { + continue; + } + tests.push(line.parse().unwrap()); + } + tests + } +} diff --git a/vendor/bstr/src/utf8.rs b/vendor/bstr/src/utf8.rs new file mode 100644 index 0000000000..e35da36244 --- /dev/null +++ b/vendor/bstr/src/utf8.rs @@ -0,0 +1,1108 @@ +use core::char; +use core::cmp; +#[cfg(feature = "std")] +use std::error; +use core::fmt; + +use ascii; +use bstr::BStr; + +// The UTF-8 decoder provided here is based on the one presented here: +// https://bjoern.hoehrmann.de/utf-8/decoder/dfa/ +// +// We *could* have done UTF-8 decoding by using a DFA generated by `\p{any}` +// using regex-automata that is roughly the same size. The real benefit of +// Hoehrmann's formulation is that the byte class mapping below is manually +// tailored such that each byte's class doubles as a shift to mask out the +// bits necessary for constructing the leading bits of each codepoint value +// from the initial byte. +// +// There are some minor differences between this implementation and Hoehrmann's +// formulation. +// +// Firstly, we make REJECT have state ID 0, since it makes the state table +// itself a little easier to read and is consistent with the notion that 0 +// means "false" or "bad." +// +// Secondly, when doing bulk decoding, we add a SIMD accelerated ASCII fast +// path. +// +// Thirdly, we pre-multiply the state IDs to avoid a multiplication instruction +// in the core decoding loop. (Which is what regex-automata would do by +// default.) +// +// Fourthly, we split the byte class mapping and transition table into two +// arrays because it's clearer. +// +// It is unlikely that this is the fastest way to do UTF-8 decoding, however, +// it is fairly simple. + +const ACCEPT: usize = 12; +const REJECT: usize = 0; + +static CLASSES: [u8; 256] = [ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, +]; + +static STATES_FORWARD: &'static [u8] = &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 0, 24, 36, 60, 96, 84, 0, 0, 0, 48, 72, + 0, 12, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, + 0, 24, 0, 0, 0, 0, 0, 24, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 0, 24, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 36, 0, 36, 0, 0, + 0, 36, 0, 0, 0, 0, 0, 36, 0, 36, 0, 0, + 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +]; + +/// An iterator over Unicode scalar values in a byte string. +/// +/// When invalid UTF-8 byte sequences are found, they are substituted with the +/// Unicode replacement codepoint (`U+FFFD`) using the +/// ["maximal subpart" strategy](http://www.unicode.org/review/pr-121.html). +/// +/// This iterator is created by the +/// [`chars`](struct.BStr.html#method.chars) method on +/// [`BStr`](struct.BStr.html). +#[derive(Clone, Debug)] +pub struct Chars<'a> { + bs: &'a BStr, +} + +impl<'a> Chars<'a> { + pub(crate) fn new(bs: &'a BStr) -> Chars<'a> { + Chars { bs } + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::BStr; + /// + /// let mut chars = BStr::new("abc").chars(); + /// + /// assert_eq!("abc", chars.as_bstr()); + /// chars.next(); + /// assert_eq!("bc", chars.as_bstr()); + /// chars.next(); + /// chars.next(); + /// assert_eq!("", chars.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.bs + } +} + +impl<'a> Iterator for Chars<'a> { + type Item = char; + + #[inline] + fn next(&mut self) -> Option { + let (ch, size) = decode_lossy(self.bs.as_bytes()); + if size == 0 { + return None; + } + self.bs = &self.bs[size..]; + Some(ch) + } +} + +impl<'a> DoubleEndedIterator for Chars<'a> { + #[inline] + fn next_back(&mut self) -> Option { + let (ch, size) = decode_last_lossy(self.bs.as_bytes()); + if size == 0 { + return None; + } + self.bs = &self.bs[..self.bs.len()-size]; + Some(ch) + } +} + +/// An iterator over Unicode scalar values in a byte string and their +/// byte index positions. +/// +/// When invalid UTF-8 byte sequences are found, they are substituted with the +/// Unicode replacement codepoint (`U+FFFD`) using the +/// ["maximal subpart" strategy](http://www.unicode.org/review/pr-121.html). +/// +/// Note that this is slightly different from the `CharIndices` iterator +/// provided by the standard library. Aside from working on possibly invalid +/// UTF-8, this iterator provides both the corresponding starting and ending +/// byte indices of each codepoint yielded. The ending position is necessary to +/// slice the original byte string when invalid UTF-8 bytes are converted into +/// a Unicode replacement codepoint, since a single replacement codepoint can +/// substitute anywhere from 1 to 3 invalid bytes (inclusive). +/// +/// This iterator is created by the +/// [`char_indices`](struct.BStr.html#method.char_indices) method on +/// [`BStr`](struct.BStr.html). +#[derive(Clone, Debug)] +pub struct CharIndices<'a> { + bs: &'a BStr, + forward_index: usize, + reverse_index: usize, +} + +impl<'a> CharIndices<'a> { + pub(crate) fn new(bs: &'a BStr) -> CharIndices<'a> { + CharIndices { bs: bs, forward_index: 0, reverse_index: bs.len() } + } + + /// View the underlying data as a subslice of the original data. + /// + /// The slice returned has the same lifetime as the original slice, and so + /// the iterator can continue to be used while this exists. + /// + /// # Examples + /// + /// ``` + /// use bstr::B; + /// + /// let mut it = B("abc").char_indices(); + /// + /// assert_eq!("abc", it.as_bstr()); + /// it.next(); + /// assert_eq!("bc", it.as_bstr()); + /// it.next(); + /// it.next(); + /// assert_eq!("", it.as_bstr()); + /// ``` + #[inline] + pub fn as_bstr(&self) -> &'a BStr { + self.bs + } +} + +impl<'a> Iterator for CharIndices<'a> { + type Item = (usize, usize, char); + + #[inline] + fn next(&mut self) -> Option<(usize, usize, char)> { + let index = self.forward_index; + let (ch, size) = decode_lossy(self.bs.as_bytes()); + if size == 0 { + return None; + } + self.bs = &self.bs[size..]; + self.forward_index += size; + Some((index, index + size, ch)) + } +} + +impl<'a> DoubleEndedIterator for CharIndices<'a> { + #[inline] + fn next_back(&mut self) -> Option<(usize, usize, char)> { + let (ch, size) = decode_last_lossy(self.bs.as_bytes()); + if size == 0 { + return None; + } + self.bs = &self.bs[..self.bs.len()-size]; + self.reverse_index -= size; + Some((self.reverse_index, self.reverse_index + size, ch)) + } +} + +/// An error that occurs when UTF-8 decoding fails. +/// +/// This error occurs when attempting to convert a non-UTF-8 byte +/// string to a Rust string that must be valid UTF-8. For example, +/// [`to_str`](struct.BStr.html#method.to_str) is one such method. +/// +/// # Example +/// +/// This example shows what happens when a given byte sequence is invalid, +/// but ends with a sequence that is a possible prefix of valid UTF-8. +/// +/// ``` +/// use bstr::B; +/// +/// let s = B(b"foobar\xF1\x80\x80"); +/// let err = s.to_str().unwrap_err(); +/// assert_eq!(err.valid_up_to(), 6); +/// assert_eq!(err.error_len(), None); +/// ``` +/// +/// This example shows what happens when a given byte sequence contains +/// invalid UTF-8. +/// +/// ``` +/// use bstr::B; +/// +/// let s = B(b"foobar\xF1\x80\x80quux"); +/// let err = s.to_str().unwrap_err(); +/// assert_eq!(err.valid_up_to(), 6); +/// // The error length reports the maximum number of bytes that correspond to +/// // a valid prefix of a UTF-8 encoded codepoint. +/// assert_eq!(err.error_len(), Some(3)); +/// +/// // In contrast to the above which contains a single invalid prefix, +/// // consider the case of multiple individal bytes that are never valid +/// // prefixes. Note how the value of error_len changes! +/// let s = B(b"foobar\xFF\xFFquux"); +/// let err = s.to_str().unwrap_err(); +/// assert_eq!(err.valid_up_to(), 6); +/// assert_eq!(err.error_len(), Some(1)); +/// +/// // The fact that it's an invalid prefix does not change error_len even +/// // when it immediately precedes the end of the string. +/// let s = B(b"foobar\xFF"); +/// let err = s.to_str().unwrap_err(); +/// assert_eq!(err.valid_up_to(), 6); +/// assert_eq!(err.error_len(), Some(1)); +/// ``` +#[derive(Debug, Eq, PartialEq)] +pub struct Utf8Error { + valid_up_to: usize, + error_len: Option, +} + +impl Utf8Error { + /// Returns the byte index of the position immediately following the last + /// valid UTF-8 byte. + /// + /// # Example + /// + /// This examples shows how `valid_up_to` can be used to retrieve a + /// possibly empty prefix that is guaranteed to be valid UTF-8: + /// + /// ``` + /// use bstr::B; + /// + /// let s = B(b"foobar\xF1\x80\x80quux"); + /// let err = s.to_str().unwrap_err(); + /// + /// // This is guaranteed to never panic. + /// let string = s[..err.valid_up_to()].to_str().unwrap(); + /// assert_eq!(string, "foobar"); + /// ``` + #[inline] + pub fn valid_up_to(&self) -> usize { + self.valid_up_to + } + + /// Returns the total number of invalid UTF-8 bytes immediately following + /// the position returned by `valid_up_to`. This value is always at least + /// `1`, but can be up to `3` if bytes form a valid prefix of some UTF-8 + /// encoded codepoint. + /// + /// If the end of the original input was found before a valid UTF-8 encoded + /// codepoint could be completed, then this returns `None`. This is useful + /// when processing streams, where a `None` value signals that more input + /// might be needed. + #[inline] + pub fn error_len(&self) -> Option { + self.error_len + } +} + +#[cfg(feature = "std")] +impl error::Error for Utf8Error { + fn description(&self) -> &str { "invalid UTF-8" } +} + +impl fmt::Display for Utf8Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "invalid UTF-8 found at byte offset {}", self.valid_up_to) + } +} + +/// Returns OK if and only if the given slice is completely valid UTF-8. +/// +/// If the slice isn't valid UTF-8, then an error is returned that explains +/// the first location at which invalid UTF-89 was detected. +pub fn validate(slice: &[u8]) -> Result<(), Utf8Error> { + // The fast path for validating UTF-8. It steps through a UTF-8 automaton + // and uses a SIMD accelerated ASCII fast path on x86_64. If an error is + // detected, it backs up and runs the slower version of the UTF-8 automaton + // to determine correct error information. + fn fast(slice: &[u8]) -> Result<(), Utf8Error> { + let mut state = ACCEPT; + let mut i = 0; + + while i < slice.len() { + let b = slice[i]; + + // ASCII fast path. If we see two consecutive ASCII bytes, then try + // to validate as much ASCII as possible very quickly. + if state == ACCEPT + && b <= 0x7F + && slice.get(i+1).map_or(false, |&b| b <= 0x7F) + { + i += ascii::first_non_ascii_byte(&slice[i..]); + continue; + } + + state = step(state, b); + if state == REJECT { + return Err(find_valid_up_to(slice, i)); + } + i += 1; + } + if state != ACCEPT { + Err(find_valid_up_to(slice, slice.len())) + } else { + Ok(()) + } + } + + // Given the first position at which a UTF-8 sequence was determined to be + // invalid, return an error that correctly reports the position at which + // the last complete UTF-8 sequence ends. + #[inline(never)] + fn find_valid_up_to(slice: &[u8], rejected_at: usize) -> Utf8Error { + // In order to find the last valid byte, we need to back up an amount + // that guarantees every preceding byte is part of a valid UTF-8 + // code unit sequence. To do this, we simply locate the last leading + // byte that occurs before rejected_at. + let mut backup = rejected_at.saturating_sub(1); + while backup > 0 && !is_leading_utf8_byte(slice[backup]) { + backup -= 1; + } + let upto = cmp::min(slice.len(), rejected_at.saturating_add(1)); + let mut err = slow(&slice[backup..upto]).unwrap_err(); + err.valid_up_to += backup; + err + } + + // Like top-level UTF-8 decoding, except it correctly reports a UTF-8 error + // when an invalid sequence is found. This is split out from validate so + // that the fast path doesn't need to keep track of the position of the + // last valid UTF-8 byte. In particular, tracking this requires checking + // for an ACCEPT state on each byte, which degrades throughput pretty + // badly. + fn slow(slice: &[u8]) -> Result<(), Utf8Error> { + let mut state = ACCEPT; + let mut valid_up_to = 0; + for (i, &b) in slice.iter().enumerate() { + state = step(state, b); + if state == ACCEPT { + valid_up_to = i + 1; + } else if state == REJECT { + // Our error length must always be at least 1. + let error_len = Some(cmp::max(1, i - valid_up_to)); + return Err(Utf8Error { valid_up_to, error_len }); + } + } + if state != ACCEPT { + Err(Utf8Error { valid_up_to, error_len: None }) + } else { + Ok(()) + } + } + + // Advance to the next state given the current state and current byte. + fn step(state: usize, b: u8) -> usize { + let class = CLASSES[b as usize]; + // SAFETY: This is safe because 'class' is always <=11 and 'state' is + // always <=96. Therefore, the maximal index is 96+11 = 107, where + // STATES_FORWARD.len() = 108 such that every index is guaranteed to be + // valid by construction of the state machine and the byte equivalence + // classes. + unsafe { + *STATES_FORWARD.get_unchecked(state + class as usize) as usize + } + } + + fast(slice) +} + +/// UTF-8 decode a single Unicode scalar value from the beginning of a slice. +/// +/// When successful, the corresponding Unicode scalar value is returned along +/// with the number of bytes it was encoded with. The number of bytes consumed +/// for a successful decode is always between 1 and 4, inclusive. +/// +/// When unsuccessful, `None` is returned along with the number of bytes that +/// make up a maximal prefix of a valid UTF-8 code unit sequence. In this case, +/// the number of bytes consumed is always between 0 and 3, inclusive, where +/// 0 is only returned when `slice` is empty. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// use bstr::decode_utf8; +/// +/// // Decoding a valid codepoint. +/// let (ch, size) = decode_utf8(b"\xE2\x98\x83"); +/// assert_eq!(Some('☃'), ch); +/// assert_eq!(3, size); +/// +/// // Decoding an incomplete codepoint. +/// let (ch, size) = decode_utf8(b"\xE2\x98"); +/// assert_eq!(None, ch); +/// assert_eq!(2, size); +/// ``` +/// +/// This example shows how to iterate over all codepoints in UTF-8 encoded +/// bytes, while replacing invalid UTF-8 sequences with the replacement +/// codepoint: +/// +/// ``` +/// use bstr::decode_utf8; +/// +/// let mut bytes = &b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"[..]; +/// let mut chars = vec![]; +/// while !bytes.is_empty() { +/// let (ch, size) = decode_utf8(bytes); +/// bytes = &bytes[size..]; +/// chars.push(ch.unwrap_or('\u{FFFD}')); +/// } +/// assert_eq!(vec!['☃', '\u{FFFD}', '𝞃', '\u{FFFD}', 'a'], chars); +/// ``` +#[inline] +pub fn decode>(slice: B) -> (Option, usize) { + let slice = slice.as_ref(); + match slice.get(0) { + None => return (None, 0), + Some(&b) if b <= 0x7F => return (Some(b as char), 1), + _ => {} + } + + let (mut state, mut cp, mut i) = (ACCEPT, 0, 0); + while i < slice.len() { + decode_step(&mut state, &mut cp, slice[i]); + i += 1; + + if state == ACCEPT { + // SAFETY: This is safe because `decode_step` guarantees that + // `cp` is a valid Unicode scalar value in an ACCEPT state. + let ch = unsafe { char::from_u32_unchecked(cp) }; + return (Some(ch), i); + } else if state == REJECT { + // At this point, we always want to advance at least one byte. + return (None, cmp::max(1, i.saturating_sub(1))); + } + } + (None, i) +} + +/// Lossily UTF-8 decode a single Unicode scalar value from the beginning of a +/// slice. +/// +/// When successful, the corresponding Unicode scalar value is returned along +/// with the number of bytes it was encoded with. The number of bytes consumed +/// for a successful decode is always between 1 and 4, inclusive. +/// +/// When unsuccessful, the Unicode replacement codepoint (`U+FFFD`) is returned +/// along with the number of bytes that make up a maximal prefix of a valid +/// UTF-8 code unit sequence. In this case, the number of bytes consumed is +/// always between 0 and 3, inclusive, where 0 is only returned when `slice` is +/// empty. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ```ignore +/// use bstr::decode_utf8_lossy; +/// +/// // Decoding a valid codepoint. +/// let (ch, size) = decode_utf8_lossy(b"\xE2\x98\x83"); +/// assert_eq!('☃', ch); +/// assert_eq!(3, size); +/// +/// // Decoding an incomplete codepoint. +/// let (ch, size) = decode_utf8_lossy(b"\xE2\x98"); +/// assert_eq!('\u{FFFD}', ch); +/// assert_eq!(2, size); +/// ``` +/// +/// This example shows how to iterate over all codepoints in UTF-8 encoded +/// bytes, while replacing invalid UTF-8 sequences with the replacement +/// codepoint: +/// +/// ```ignore +/// use bstr::decode_utf8_lossy; +/// +/// let mut bytes = &b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"[..]; +/// let mut chars = vec![]; +/// while !bytes.is_empty() { +/// let (ch, size) = decode_utf8_lossy(bytes); +/// bytes = &bytes[size..]; +/// chars.push(ch); +/// } +/// assert_eq!(vec!['☃', '\u{FFFD}', '𝞃', '\u{FFFD}', 'a'], chars); +/// ``` +#[inline] +pub fn decode_lossy>(slice: B) -> (char, usize) { + match decode(slice) { + (Some(ch), size) => (ch, size), + (None, size) => ('\u{FFFD}', size), + } +} + +/// UTF-8 decode a single Unicode scalar value from the end of a slice. +/// +/// When successful, the corresponding Unicode scalar value is returned along +/// with the number of bytes it was encoded with. The number of bytes consumed +/// for a successful decode is always between 1 and 4, inclusive. +/// +/// When unsuccessful, `None` is returned along with the number of bytes that +/// make up a maximal prefix of a valid UTF-8 code unit sequence. In this case, +/// the number of bytes consumed is always between 0 and 3, inclusive, where +/// 0 is only returned when `slice` is empty. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// use bstr::decode_last_utf8; +/// +/// // Decoding a valid codepoint. +/// let (ch, size) = decode_last_utf8(b"\xE2\x98\x83"); +/// assert_eq!(Some('☃'), ch); +/// assert_eq!(3, size); +/// +/// // Decoding an incomplete codepoint. +/// let (ch, size) = decode_last_utf8(b"\xE2\x98"); +/// assert_eq!(None, ch); +/// assert_eq!(2, size); +/// ``` +/// +/// This example shows how to iterate over all codepoints in UTF-8 encoded +/// bytes in reverse, while replacing invalid UTF-8 sequences with the +/// replacement codepoint: +/// +/// ``` +/// use bstr::decode_last_utf8; +/// +/// let mut bytes = &b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"[..]; +/// let mut chars = vec![]; +/// while !bytes.is_empty() { +/// let (ch, size) = decode_last_utf8(bytes); +/// bytes = &bytes[..bytes.len()-size]; +/// chars.push(ch.unwrap_or('\u{FFFD}')); +/// } +/// assert_eq!(vec!['a', '\u{FFFD}', '𝞃', '\u{FFFD}', '☃'], chars); +/// ``` +#[inline] +pub fn decode_last>(slice: B) -> (Option, usize) { + // TODO: We could implement this by reversing the UTF-8 automaton, but for + // now, we do it the slow way by using the forward automaton. + + let slice = slice.as_ref(); + if slice.is_empty() { + return (None, 0); + } + let mut start = slice.len() - 1; + let limit = slice.len().saturating_sub(4); + while start > limit && !is_leading_utf8_byte(slice[start]) { + start -= 1; + } + let (ch, size) = decode(&slice[start..]); + // If we didn't consume all of the bytes, then that means there's at least + // one stray byte that never occurs in a valid code unit prefix, so we can + // advance by one byte. + if start + size != slice.len() { + (None, 1) + } else { + (ch, size) + } +} + +/// Lossily UTF-8 decode a single Unicode scalar value from the end of a slice. +/// +/// When successful, the corresponding Unicode scalar value is returned along +/// with the number of bytes it was encoded with. The number of bytes consumed +/// for a successful decode is always between 1 and 4, inclusive. +/// +/// When unsuccessful, the Unicode replacement codepoint (`U+FFFD`) is returned +/// along with the number of bytes that make up a maximal prefix of a valid +/// UTF-8 code unit sequence. In this case, the number of bytes consumed is +/// always between 0 and 3, inclusive, where 0 is only returned when `slice` is +/// empty. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ```ignore +/// use bstr::decode_last_utf8_lossy; +/// +/// // Decoding a valid codepoint. +/// let (ch, size) = decode_last_utf8_lossy(b"\xE2\x98\x83"); +/// assert_eq!('☃', ch); +/// assert_eq!(3, size); +/// +/// // Decoding an incomplete codepoint. +/// let (ch, size) = decode_last_utf8_lossy(b"\xE2\x98"); +/// assert_eq!('\u{FFFD}', ch); +/// assert_eq!(2, size); +/// ``` +/// +/// This example shows how to iterate over all codepoints in UTF-8 encoded +/// bytes in reverse, while replacing invalid UTF-8 sequences with the +/// replacement codepoint: +/// +/// ```ignore +/// use bstr::decode_last_utf8_lossy; +/// +/// let mut bytes = &b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"[..]; +/// let mut chars = vec![]; +/// while !bytes.is_empty() { +/// let (ch, size) = decode_last_utf8_lossy(bytes); +/// bytes = &bytes[..bytes.len()-size]; +/// chars.push(ch); +/// } +/// assert_eq!(vec!['a', '\u{FFFD}', '𝞃', '\u{FFFD}', '☃'], chars); +/// ``` +#[inline] +pub fn decode_last_lossy>(slice: B) -> (char, usize) { + match decode_last(slice) { + (Some(ch), size) => (ch, size), + (None, size) => ('\u{FFFD}', size), + } +} + +#[inline] +pub fn decode_step(state: &mut usize, cp: &mut u32, b: u8) { + let class = CLASSES[b as usize]; + if *state == ACCEPT { + *cp = (0xFF >> class) & (b as u32); + } else { + *cp = (b as u32 & 0b111111) | (*cp << 6); + } + *state = STATES_FORWARD[*state + class as usize] as usize; +} + +fn is_leading_utf8_byte(b: u8) -> bool { + // In the ASCII case, the most significant bit is never set. The leading + // byte of a 2/3/4-byte sequence always has the top two most significant + // bigs set. + (b & 0b1100_0000) != 0b1000_0000 +} + +#[cfg(test)] +mod tests { + use std::char; + + use bstr::B; + use tests::LOSSY_TESTS; + use utf8::{self, Utf8Error}; + + fn utf8e(valid_up_to: usize) -> Utf8Error { + Utf8Error { valid_up_to, error_len: None } + } + + fn utf8e2(valid_up_to: usize, error_len: usize) -> Utf8Error { + Utf8Error { valid_up_to, error_len: Some(error_len) } + } + + #[test] + fn validate_all_codepoints() { + for i in 0..(0x10FFFF + 1) { + let cp = match char::from_u32(i) { + None => continue, + Some(cp) => cp, + }; + let mut buf = [0; 4]; + let s = cp.encode_utf8(&mut buf); + assert_eq!(Ok(()), utf8::validate(s.as_bytes())); + } + } + + #[test] + fn validate_multiple_codepoints() { + assert_eq!(Ok(()), utf8::validate(b"abc")); + assert_eq!(Ok(()), utf8::validate(b"a\xE2\x98\x83a")); + assert_eq!(Ok(()), utf8::validate(b"a\xF0\x9D\x9C\xB7a")); + assert_eq!(Ok(()), utf8::validate( + b"\xE2\x98\x83\xF0\x9D\x9C\xB7", + )); + assert_eq!(Ok(()), utf8::validate( + b"a\xE2\x98\x83a\xF0\x9D\x9C\xB7a", + )); + assert_eq!(Ok(()), utf8::validate( + b"\xEF\xBF\xBD\xE2\x98\x83\xEF\xBF\xBD", + )); + } + + #[test] + fn validate_errors() { + // single invalid byte + assert_eq!(Err(utf8e2(0, 1)), utf8::validate(b"\xFF")); + // single invalid byte after ASCII + assert_eq!(Err(utf8e2(1, 1)), utf8::validate(b"a\xFF")); + // single invalid byte after 2 byte sequence + assert_eq!(Err(utf8e2(2, 1)), utf8::validate(b"\xCE\xB2\xFF")); + // single invalid byte after 3 byte sequence + assert_eq!(Err(utf8e2(3, 1)), utf8::validate(b"\xE2\x98\x83\xFF")); + // single invalid byte after 4 byte sequence + assert_eq!(Err(utf8e2(4, 1)), utf8::validate(b"\xF0\x9D\x9D\xB1\xFF")); + + // An invalid 2-byte sequence with a valid 1-byte prefix. + assert_eq!(Err(utf8e2(0, 1)), utf8::validate(b"\xCE\xF0")); + // An invalid 3-byte sequence with a valid 2-byte prefix. + assert_eq!(Err(utf8e2(0, 2)), utf8::validate(b"\xE2\x98\xF0")); + // An invalid 4-byte sequence with a valid 3-byte prefix. + assert_eq!(Err(utf8e2(0, 3)), utf8::validate(b"\xF0\x9D\x9D\xF0")); + + // An overlong sequence. Should be \xE2\x82\xAC, but we encode the + // same codepoint value in 4 bytes. This not only tests that we reject + // overlong sequences, but that we get valid_up_to correct. + assert_eq!(Err(utf8e2(0, 1)), utf8::validate(b"\xF0\x82\x82\xAC")); + assert_eq!(Err(utf8e2(1, 1)), utf8::validate(b"a\xF0\x82\x82\xAC")); + assert_eq!(Err(utf8e2(3, 1)), utf8::validate( + b"\xE2\x98\x83\xF0\x82\x82\xAC", + )); + + // Check that encoding a surrogate codepoint using the UTF-8 scheme + // fails validation. + assert_eq!(Err(utf8e2(0, 1)), utf8::validate(b"\xED\xA0\x80")); + assert_eq!(Err(utf8e2(1, 1)), utf8::validate(b"a\xED\xA0\x80")); + assert_eq!(Err(utf8e2(3, 1)), utf8::validate( + b"\xE2\x98\x83\xED\xA0\x80", + )); + + // Check that an incomplete 2-byte sequence fails. + assert_eq!(Err(utf8e2(0, 1)), utf8::validate(b"\xCEa")); + assert_eq!(Err(utf8e2(1, 1)), utf8::validate(b"a\xCEa")); + assert_eq!(Err(utf8e2(3, 1)), utf8::validate( + b"\xE2\x98\x83\xCE\xE2\x98\x83", + )); + // Check that an incomplete 3-byte sequence fails. + assert_eq!(Err(utf8e2(0, 2)), utf8::validate(b"\xE2\x98a")); + assert_eq!(Err(utf8e2(1, 2)), utf8::validate(b"a\xE2\x98a")); + assert_eq!(Err(utf8e2(3, 2)), utf8::validate( + b"\xE2\x98\x83\xE2\x98\xE2\x98\x83", + )); + // Check that an incomplete 4-byte sequence fails. + assert_eq!(Err(utf8e2(0, 3)), utf8::validate(b"\xF0\x9D\x9Ca")); + assert_eq!(Err(utf8e2(1, 3)), utf8::validate(b"a\xF0\x9D\x9Ca")); + assert_eq!(Err(utf8e2(4, 3)), utf8::validate( + b"\xF0\x9D\x9C\xB1\xF0\x9D\x9C\xE2\x98\x83", + )); + assert_eq!(Err(utf8e2(6, 3)), utf8::validate( + b"foobar\xF1\x80\x80quux", + )); + + // Check that an incomplete (EOF) 2-byte sequence fails. + assert_eq!(Err(utf8e(0)), utf8::validate(b"\xCE")); + assert_eq!(Err(utf8e(1)), utf8::validate(b"a\xCE")); + assert_eq!(Err(utf8e(3)), utf8::validate(b"\xE2\x98\x83\xCE")); + // Check that an incomplete (EOF) 3-byte sequence fails. + assert_eq!(Err(utf8e(0)), utf8::validate(b"\xE2\x98")); + assert_eq!(Err(utf8e(1)), utf8::validate(b"a\xE2\x98")); + assert_eq!(Err(utf8e(3)), utf8::validate(b"\xE2\x98\x83\xE2\x98")); + // Check that an incomplete (EOF) 4-byte sequence fails. + assert_eq!(Err(utf8e(0)), utf8::validate(b"\xF0\x9D\x9C")); + assert_eq!(Err(utf8e(1)), utf8::validate(b"a\xF0\x9D\x9C")); + assert_eq!(Err(utf8e(4)), utf8::validate( + b"\xF0\x9D\x9C\xB1\xF0\x9D\x9C", + )); + + // Test that we errors correct even after long valid sequences. This + // checks that our "backup" logic for detecting errors is correct. + assert_eq!(Err(utf8e2(8, 1)), utf8::validate( + b"\xe2\x98\x83\xce\xb2\xe3\x83\x84\xFF", + )); + } + + #[test] + fn decode_valid() { + fn d(mut s: &str) -> Vec { + let mut chars = vec![]; + while !s.is_empty() { + let (ch, size) = utf8::decode(s.as_bytes()); + s = &s[size..]; + chars.push(ch.unwrap()); + } + chars + } + + assert_eq!(vec!['☃'], d("☃")); + assert_eq!(vec!['☃', '☃'], d("☃☃")); + assert_eq!(vec!['α', 'β', 'γ', 'δ', 'ε'], d("αβγδε")); + assert_eq!(vec!['☃', '⛄', '⛇'], d("☃⛄⛇")); + assert_eq!(vec!['𝗮', '𝗯', '𝗰', '𝗱', '𝗲'], d("𝗮𝗯𝗰𝗱𝗲")); + } + + #[test] + fn decode_invalid() { + let (ch, size) = utf8::decode(b""); + assert_eq!(None, ch); + assert_eq!(0, size); + + let (ch, size) = utf8::decode(b"\xFF"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode(b"\xCE\xF0"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode(b"\xE2\x98\xF0"); + assert_eq!(None, ch); + assert_eq!(2, size); + + let (ch, size) = utf8::decode(b"\xF0\x9D\x9D"); + assert_eq!(None, ch); + assert_eq!(3, size); + + let (ch, size) = utf8::decode(b"\xF0\x9D\x9D\xF0"); + assert_eq!(None, ch); + assert_eq!(3, size); + + let (ch, size) = utf8::decode(b"\xF0\x82\x82\xAC"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode(b"\xED\xA0\x80"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode(b"\xCEa"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode(b"\xE2\x98a"); + assert_eq!(None, ch); + assert_eq!(2, size); + + let (ch, size) = utf8::decode(b"\xF0\x9D\x9Ca"); + assert_eq!(None, ch); + assert_eq!(3, size); + } + + #[test] + fn decode_lossy() { + let (ch, size) = utf8::decode_lossy(b""); + assert_eq!('\u{FFFD}', ch); + assert_eq!(0, size); + + let (ch, size) = utf8::decode_lossy(b"\xFF"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_lossy(b"\xCE\xF0"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_lossy(b"\xE2\x98\xF0"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(2, size); + + let (ch, size) = utf8::decode_lossy(b"\xF0\x9D\x9D\xF0"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(3, size); + + let (ch, size) = utf8::decode_lossy(b"\xF0\x82\x82\xAC"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_lossy(b"\xED\xA0\x80"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_lossy(b"\xCEa"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_lossy(b"\xE2\x98a"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(2, size); + + let (ch, size) = utf8::decode_lossy(b"\xF0\x9D\x9Ca"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(3, size); + } + + #[test] + fn decode_last_valid() { + fn d(mut s: &str) -> Vec { + let mut chars = vec![]; + while !s.is_empty() { + let (ch, size) = utf8::decode_last(s.as_bytes()); + s = &s[..s.len()-size]; + chars.push(ch.unwrap()); + } + chars + } + + assert_eq!(vec!['☃'], d("☃")); + assert_eq!(vec!['☃', '☃'], d("☃☃")); + assert_eq!(vec!['ε', 'δ', 'γ', 'β', 'α'], d("αβγδε")); + assert_eq!(vec!['⛇', '⛄', '☃'], d("☃⛄⛇")); + assert_eq!(vec!['𝗲', '𝗱', '𝗰', '𝗯', '𝗮'], d("𝗮𝗯𝗰𝗱𝗲")); + } + + #[test] + fn decode_last_invalid() { + let (ch, size) = utf8::decode_last(b""); + assert_eq!(None, ch); + assert_eq!(0, size); + + let (ch, size) = utf8::decode_last(b"\xFF"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"\xCE\xF0"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"\xCE"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"\xE2\x98\xF0"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"\xE2\x98"); + assert_eq!(None, ch); + assert_eq!(2, size); + + let (ch, size) = utf8::decode_last(b"\xF0\x9D\x9D\xF0"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"\xF0\x9D\x9D"); + assert_eq!(None, ch); + assert_eq!(3, size); + + let (ch, size) = utf8::decode_last(b"\xF0\x82\x82\xAC"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"\xED\xA0\x80"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"\xED\xA0"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"\xED"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"a\xCE"); + assert_eq!(None, ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last(b"a\xE2\x98"); + assert_eq!(None, ch); + assert_eq!(2, size); + + let (ch, size) = utf8::decode_last(b"a\xF0\x9D\x9C"); + assert_eq!(None, ch); + assert_eq!(3, size); + } + + #[test] + fn decode_last_lossy() { + let (ch, size) = utf8::decode_last_lossy(b""); + assert_eq!('\u{FFFD}', ch); + assert_eq!(0, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xFF"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xCE\xF0"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xCE"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xE2\x98\xF0"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xE2\x98"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(2, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xF0\x9D\x9D\xF0"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xF0\x9D\x9D"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(3, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xF0\x82\x82\xAC"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xED\xA0\x80"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xED\xA0"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"\xED"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"a\xCE"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(1, size); + + let (ch, size) = utf8::decode_last_lossy(b"a\xE2\x98"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(2, size); + + let (ch, size) = utf8::decode_last_lossy(b"a\xF0\x9D\x9C"); + assert_eq!('\u{FFFD}', ch); + assert_eq!(3, size); + } + + #[test] + fn chars() { + for (i, &(expected, input)) in LOSSY_TESTS.iter().enumerate() { + let got: String = B(input).chars().collect(); + assert_eq!( + expected, got, + "chars(ith: {:?}, given: {:?})", i, input, + ); + let got: String = B(input) + .char_indices() + .map(|(_, _, ch)| ch) + .collect(); + assert_eq!( + expected, got, + "char_indices(ith: {:?}, given: {:?})", i, input, + ); + + let expected: String = expected.chars().rev().collect(); + + let got: String = B(input).chars().rev().collect(); + assert_eq!( + expected, got, + "chars.rev(ith: {:?}, given: {:?})", i, input, + ); + let got: String = B(input) + .char_indices() + .rev() + .map(|(_, _, ch)| ch) + .collect(); + assert_eq!( + expected, got, + "char_indices.rev(ith: {:?}, given: {:?})", i, input, + ); + } + } +} diff --git a/vendor/c2-chacha/.cargo-checksum.json b/vendor/c2-chacha/.cargo-checksum.json index ce4e2eca1a..051db01780 100644 --- a/vendor/c2-chacha/.cargo-checksum.json +++ b/vendor/c2-chacha/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"ede5475ae0bdb869e4ac5a78f945ed0c0aff8f5bbaebef85699bcb57f1709688","LICENSE-APACHE":"0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a","LICENSE-MIT":"4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f","README.md":"e884c49fd9cf2d6316cb825e1cfc310ed8d9005ecf702506393f95330102a63b","benches/chacha20.rs":"e499e9d8607ad6ac89663258fb8ce4d37cebb5cd231bc8d9c1112fb7905eccb6","benches/machine.rs":"4cf35e235de6df06467ab449049d2d39137a38954966280306292db53dd2a44e","src/guts.rs":"ef6337688f5a3d5cbd848e882b53ef2b96824126783103c77709c5dd2856b660","src/lib.rs":"9d85f9c265dc627e9175945a63fb38687ecd17454ede1f8e1dfa2c397d8f4736","src/rustcrypto_impl.rs":"805692d33643b40430559710184e52ac49c82d41a23e6c112e19251e2ea84656"},"package":"7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101"} \ No newline at end of file +{"files":{"Cargo.toml":"ca60f483e157aa3a4da8f2e81328a91085df95aac950af29b98ba00264670118","LICENSE-APACHE":"0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a","LICENSE-MIT":"4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f","README.md":"e884c49fd9cf2d6316cb825e1cfc310ed8d9005ecf702506393f95330102a63b","benches/chacha20.rs":"e499e9d8607ad6ac89663258fb8ce4d37cebb5cd231bc8d9c1112fb7905eccb6","src/guts.rs":"ef6337688f5a3d5cbd848e882b53ef2b96824126783103c77709c5dd2856b660","src/lib.rs":"f963f2932409ff28a21a89d5dc4f44c1a9b320705cc474246a93067abcf4b528","src/rustcrypto_impl.rs":"805692d33643b40430559710184e52ac49c82d41a23e6c112e19251e2ea84656"},"package":"214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb"} \ No newline at end of file diff --git a/vendor/c2-chacha/Cargo.toml b/vendor/c2-chacha/Cargo.toml index 4f085ce26b..d93ef9c7d5 100644 --- a/vendor/c2-chacha/Cargo.toml +++ b/vendor/c2-chacha/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "c2-chacha" -version = "0.2.2" +version = "0.2.3" authors = ["The CryptoCorrosion Contributors"] description = "The ChaCha family of stream ciphers" documentation = "https://docs.rs/c2-chacha" @@ -26,24 +26,21 @@ repository = "https://github.com/cryptocorrosion/cryptocorrosion" version = "1.3" optional = true -[dependencies.lazy_static] -version = "1.2" -optional = true - [dependencies.ppv-lite86] -version = "0.2.1" +version = "0.2.6" +default-features = false package = "ppv-lite86" [dependencies.stream-cipher] version = "0.3" optional = true [dev-dependencies.hex-literal] -version = "0.1" +version = "0.2" [features] default = ["std", "simd", "rustcrypto_api"] rustcrypto_api = ["stream-cipher", "byteorder"] simd = ["ppv-lite86/simd"] -std = ["lazy_static"] +std = ["ppv-lite86/std"] [badges.travis-ci] repository = "cryptocorrosion/cryptocorrosion" diff --git a/vendor/c2-chacha/benches/machine.rs b/vendor/c2-chacha/benches/machine.rs deleted file mode 100644 index 530c5db6d2..0000000000 --- a/vendor/c2-chacha/benches/machine.rs +++ /dev/null @@ -1,39 +0,0 @@ -#![feature(test)] -extern crate c2_chacha; -extern crate stream_cipher; -extern crate test; - -use c2_chacha::simd::machine::x86; -use c2_chacha::simd::Machine; -use c2_chacha::ChaChaState; -use test::Bencher; - -macro_rules! mach_bench { - ($MachName:ident, $feature:expr, $enable:expr) => { - #[allow(non_snake_case)] - #[bench] - pub fn $MachName(b: &mut Bencher) { - if !$enable { - return; - } - let m = unsafe { x86::$MachName::instance() }; - let z = m - .vec::<::u64x2, _>([0x0, 0x0]) - .into(); - let mut state = ChaChaState { b: z, c: z, d: z }; - let mut out = [0; 256]; - #[target_feature(enable = $feature)] - unsafe fn runner(m: M, state: &mut ChaChaState, out: &mut [u8; 256]) { - c2_chacha::refill_wide_impl(m, state, 40 * 20 / 2, out) - } - b.iter(|| unsafe { runner(m, &mut state, &mut out) }); - b.bytes = 10240; - } - }; -} - -mach_bench!(SSE2, "sse2", is_x86_feature_detected!("sse2")); -mach_bench!(SSSE3, "ssse3", is_x86_feature_detected!("ssse3")); -mach_bench!(SSE41, "sse4.1", is_x86_feature_detected!("sse4.1")); -mach_bench!(AVX, "avx", is_x86_feature_detected!("avx")); -mach_bench!(AVX2, "avx2", is_x86_feature_detected!("avx2")); diff --git a/vendor/c2-chacha/src/lib.rs b/vendor/c2-chacha/src/lib.rs index 7b0ddf6c28..363a1a7b9d 100644 --- a/vendor/c2-chacha/src/lib.rs +++ b/vendor/c2-chacha/src/lib.rs @@ -34,10 +34,6 @@ #[macro_use] extern crate hex_literal; -#[cfg(feature = "std")] -#[macro_use] -extern crate lazy_static; - #[macro_use] extern crate ppv_lite86; diff --git a/vendor/cc/.cargo-checksum.json b/vendor/cc/.cargo-checksum.json index 417fde7953..2be6c57d44 100644 --- a/vendor/cc/.cargo-checksum.json +++ b/vendor/cc/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"3aff5f8b0a7f4d72852b11b0526f0002e6bf55f19f1ebd6470d7f97fbd540e60","Cargo.toml":"6ab10d9b6a9c6f0909074e6698c90c6b6a7223661ec2e83174d2593117cbe7f2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"7184fbdf375a057e673257348f6d7584c0dd11b66318d98f3647f69eb610b097","src/bin/gcc-shim.rs":"b77907875029494b6288841c3aed2e4939ed40708c7f597fca5c9e2570490ca6","src/com.rs":"bcdaf1c28b71e6ef889c6b08d1ce9d7c0761344a677f523bc4c3cd297957f804","src/lib.rs":"4753929dbb7b676c19d7cfa06d0a47e37003554b80c536cbf2b892d591ef61c2","src/registry.rs":"3cc1b5a50879fa751572878ae1d0afbfc960c11665258492754b2c8bccb0ff5d","src/setup_config.rs":"7014103587d3382eac599cb76f016e2609b8140970861b2237982d1db24af265","src/winapi.rs":"ea8b7edbb9ff87957254f465c2334e714c5d6b3b19a8d757c48ea7ca0881c50c","src/windows_registry.rs":"388e79dcf3e84078ae0b086c6cdee9cf9eb7e3ffafdcbf3e2df26163661f5856","tests/cc_env.rs":"e02b3b0824ad039b47e4462c5ef6dbe6c824c28e7953af94a0f28f7b5158042e","tests/cflags.rs":"57f06eb5ce1557e5b4a032d0c4673e18fbe6f8d26c1deb153126e368b96b41b3","tests/cxxflags.rs":"c2c6c6d8a0d7146616fa1caed26876ee7bc9fcfffd525eb4743593cade5f3371","tests/support/mod.rs":"71620b178583b6e6e5e0d4cac14e2cef6afc62fb6841e0c72ed1784543abf8ac","tests/test.rs":"1605640c9b94a77f48fc92e1dc0485bdf1960da5626e2e00279e4703691656bc"},"package":"aa87058dce70a3ff5621797f1506cb837edd02ac4c0ae642b4542dce802908b8"} \ No newline at end of file +{"files":{"Cargo.lock":"acfa31548ea5c306264d7172a193241fe959e19f289edcd13367b363b1e6c092","Cargo.toml":"a5de831059d43ce5a823420eae1a8b4d4ab167408c5f4d0db53ba526fa7a9303","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"7184fbdf375a057e673257348f6d7584c0dd11b66318d98f3647f69eb610b097","src/bin/gcc-shim.rs":"b77907875029494b6288841c3aed2e4939ed40708c7f597fca5c9e2570490ca6","src/com.rs":"bcdaf1c28b71e6ef889c6b08d1ce9d7c0761344a677f523bc4c3cd297957f804","src/lib.rs":"081f51f4ab13b32654ae6d674fed4b423c170c5db8cfdab319e9a80db724e0c3","src/registry.rs":"3cc1b5a50879fa751572878ae1d0afbfc960c11665258492754b2c8bccb0ff5d","src/setup_config.rs":"7014103587d3382eac599cb76f016e2609b8140970861b2237982d1db24af265","src/winapi.rs":"ea8b7edbb9ff87957254f465c2334e714c5d6b3b19a8d757c48ea7ca0881c50c","src/windows_registry.rs":"388e79dcf3e84078ae0b086c6cdee9cf9eb7e3ffafdcbf3e2df26163661f5856","tests/cc_env.rs":"e02b3b0824ad039b47e4462c5ef6dbe6c824c28e7953af94a0f28f7b5158042e","tests/cflags.rs":"57f06eb5ce1557e5b4a032d0c4673e18fbe6f8d26c1deb153126e368b96b41b3","tests/cxxflags.rs":"c2c6c6d8a0d7146616fa1caed26876ee7bc9fcfffd525eb4743593cade5f3371","tests/support/mod.rs":"0a83e858abc4793d9f243fdc211b653a4dc7b909ac00b577acda6a677d23ed47","tests/test.rs":"1605640c9b94a77f48fc92e1dc0485bdf1960da5626e2e00279e4703691656bc"},"package":"95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd"} \ No newline at end of file diff --git a/vendor/cc/Cargo.lock b/vendor/cc/Cargo.lock index ee899568d1..3bf70b011c 100644 --- a/vendor/cc/Cargo.lock +++ b/vendor/cc/Cargo.lock @@ -1,12 +1,19 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "c2-chacha" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cc" -version = "1.0.47" +version = "1.0.50" dependencies = [ - "jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "jobserver 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -14,84 +21,75 @@ name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "getrandom" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.64 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jobserver" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.64 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libc" -version = "0.2.64" +version = "0.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "log" -version = "0.4.8" +name = "ppv-lite86" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] -name = "num_cpus" -version = "1.10.1" +name = "rand" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.64 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "rand" -version = "0.4.6" +name = "rand_chacha" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.64 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_core" -version = "0.3.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "rand_core" -version = "0.4.2" +name = "rand_hc" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] -name = "rdrand" -version = "0.4.0" +name = "redox_syscall" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "remove_dir_all" @@ -102,17 +100,21 @@ dependencies = [ ] [[package]] -name = "tempdir" -version = "0.3.7" +name = "tempfile" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasi" -version = "0.7.0" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -135,20 +137,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] +"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571" -"checksum jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b1d42ef453b30b7387e113da1c83ab1605d90c5b4e0eb8e96d016ed3b8c160" -"checksum libc 0.2.64 (registry+https://github.com/rust-lang/crates.io-index)" = "74dfca3d9957906e8d1e6a0b641dc9a59848e793f1da2165889fd4f62d10d79c" -"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" -"checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" -"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +"checksum jobserver 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "230ae9adf468173aecd4176c7233bddc84a15871a586c5971ace9a55f881c075" +"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" +"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" +"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412" +"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" +"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" -"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" +"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/vendor/cc/Cargo.toml b/vendor/cc/Cargo.toml index 8efe26374c..130ddd34f4 100644 --- a/vendor/cc/Cargo.toml +++ b/vendor/cc/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "cc" -version = "1.0.47" +version = "1.0.50" authors = ["Alex Crichton "] exclude = ["/.travis.yml", "/appveyor.yml"] description = "A build-time dependency for Cargo build scripts to assist in invoking the native\nC compiler to compile native C code into a static archive to be linked into Rust\ncode.\n" @@ -27,12 +27,8 @@ repository = "https://github.com/alexcrichton/cc-rs" [dependencies.jobserver] version = "0.1.16" optional = true - -[dependencies.num_cpus] -version = "1.10" -optional = true -[dev-dependencies.tempdir] -version = "0.3" +[dev-dependencies.tempfile] +version = "3" [features] -parallel = ["num_cpus", "jobserver"] +parallel = ["jobserver"] diff --git a/vendor/cc/src/lib.rs b/vendor/cc/src/lib.rs index 621d31d6b8..cc1d58c882 100644 --- a/vendor/cc/src/lib.rs +++ b/vendor/cc/src/lib.rs @@ -167,6 +167,8 @@ impl Display for Error { } } +impl std::error::Error for Error {} + /// Configuration used to represent an invocation of a C compiler. /// /// This can be used to figure out what compiler is in use, what the arguments @@ -1099,9 +1101,13 @@ impl Build { return client; } - // ... but if that fails for whatever reason fall back to the number - // of cpus on the system or the `NUM_JOBS` env var. - let mut parallelism = num_cpus::get(); + // ... but if that fails for whatever reason select something + // reasonable and crate a new jobserver. Use `NUM_JOBS` if set (it's + // configured by Cargo) and otherwise just fall back to a + // semi-reasonable number. Note that we could use `num_cpus` here + // but it's an extra dependency that will almost never be used, so + // it's generally not too worth it. + let mut parallelism = 4; if let Ok(amt) = env::var("NUM_JOBS") { if let Ok(amt) = amt.parse() { parallelism = amt; @@ -1365,11 +1371,11 @@ impl Build { cmd.push_cc_arg("-ffunction-sections".into()); cmd.push_cc_arg("-fdata-sections".into()); } - // Disable generation of PIC on RISC-V for now: rust-lld doesn't support this yet - if self - .pic - .unwrap_or(!target.contains("windows-gnu") && !target.contains("riscv")) - { + // Disable generation of PIC on bare-metal RISC-V for now: rust-lld doesn't support this yet + if self.pic.unwrap_or( + !target.contains("windows-gnu") + && !(target.contains("riscv") && target.contains("-none-")), + ) { cmd.push_cc_arg("-fPIC".into()); // PLT only applies if code is compiled with PIC support, // and only for ELF targets. @@ -1588,9 +1594,11 @@ impl Build { if let Some(arch) = parts.next() { let arch = &arch[5..]; cmd.args.push(("-march=rv".to_owned() + arch).into()); - // ABI is always soft-float right now, update this when this is no longer the - // case: - if arch.starts_with("64") { + if target.contains("linux") && arch.starts_with("64") { + cmd.args.push("-mabi=lp64d".into()); + } else if target.contains("linux") && arch.starts_with("32") { + cmd.args.push("-mabi=ilp32d".into()); + } else if arch.starts_with("64") { cmd.args.push("-mabi=lp64".into()); } else { cmd.args.push("-mabi=ilp32".into()); @@ -2025,6 +2033,7 @@ impl Build { "riscv32imc-unknown-none-elf" => Some("riscv32-unknown-elf"), "riscv64gc-unknown-none-elf" => Some("riscv64-unknown-elf"), "riscv64imac-unknown-none-elf" => Some("riscv64-unknown-elf"), + "riscv64gc-unknown-linux-gnu" => Some("riscv64-linux-gnu"), "s390x-unknown-linux-gnu" => Some("s390x-linux-gnu"), "sparc-unknown-linux-gnu" => Some("sparc-linux-gnu"), "sparc64-unknown-linux-gnu" => Some("sparc64-linux-gnu"), diff --git a/vendor/cc/tests/support/mod.rs b/vendor/cc/tests/support/mod.rs index 7d74719c9f..fe8acded12 100644 --- a/vendor/cc/tests/support/mod.rs +++ b/vendor/cc/tests/support/mod.rs @@ -8,7 +8,7 @@ use std::io::prelude::*; use std::path::{Path, PathBuf}; use cc; -use tempdir::TempDir; +use tempfile::{Builder, TempDir}; pub struct Test { pub td: TempDir, @@ -27,7 +27,7 @@ impl Test { if gcc.ends_with("deps") { gcc.pop(); } - let td = TempDir::new_in(&gcc, "gcc-test").unwrap(); + let td = Builder::new().prefix("gcc-test").tempdir_in(&gcc).unwrap(); gcc.push(format!("gcc-shim{}", env::consts::EXE_SUFFIX)); Test { td: td, diff --git a/vendor/cfg-if/.cargo-checksum.json b/vendor/cfg-if/.cargo-checksum.json index 2fc7fb2d10..c0c9f9d043 100644 --- a/vendor/cfg-if/.cargo-checksum.json +++ b/vendor/cfg-if/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"3afba03daa3f3d3bed94d951b8575bfc657bb93aa655136312af5169769c76ab","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"5c345e0dd1ae68db560831c02bc2e5f1825bd10d9b68ddae40dac0bc494d651e","src/lib.rs":"caaa0c2b554377933ce62a32c45e094e9c1faa719c8a2783d6319d8f65467795","tests/xcrate.rs":"30dcb70fbb9c96fda2b7825592558279f534776f72e2a8a0a3e26df4dedb3caa"},"package":"89431bba4e6b7092fb5fcd00a6f6ca596c55cc26b2f1e6dcdd08a1f4933f66b2"} \ No newline at end of file +{"files":{"Cargo.toml":"2cb2370b62c56a7d51b51f9e405b2f377b3ad6f7f8d33bc69e20eb819ad66012","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"2406e83ee174e30aa67f8ab266836fa78545012b196395aff37c152321e2c713","src/lib.rs":"8dfd667d32d8b06e529643c975dfa14c29ce9a894a80e381a1bd867252e65e56","tests/xcrate.rs":"c0734dae6e63beafcd60bf53546115a2320735b51035c9e2387fdf9301580934"},"package":"4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"} \ No newline at end of file diff --git a/vendor/cfg-if/Cargo.toml b/vendor/cfg-if/Cargo.toml index f2b458a5bb..5da1d1b4bf 100644 --- a/vendor/cfg-if/Cargo.toml +++ b/vendor/cfg-if/Cargo.toml @@ -11,8 +11,9 @@ # will likely look very different (and much more reasonable) [package] +edition = "2018" name = "cfg-if" -version = "0.1.8" +version = "0.1.10" authors = ["Alex Crichton "] description = "A macro to ergonomically define an item depending on a large number of #[cfg]\nparameters. Structured like an if-else chain, the first matching branch is the\nitem that gets emitted.\n" homepage = "https://github.com/alexcrichton/cfg-if" diff --git a/vendor/cfg-if/README.md b/vendor/cfg-if/README.md index 86837212cb..50b5e3b2dc 100644 --- a/vendor/cfg-if/README.md +++ b/vendor/cfg-if/README.md @@ -1,7 +1,5 @@ # cfg-if -[![Build Status](https://travis-ci.com/alexcrichton/cfg-if.svg?branch=master)](https://travis-ci.com/alexcrichton/cfg-if) - [Documentation](https://docs.rs/cfg-if) A macro to ergonomically define an item depending on a large number of #[cfg] @@ -16,10 +14,7 @@ cfg-if = "0.1" ## Example ```rust -#[macro_use] -extern crate cfg_if; - -cfg_if! { +cfg_if::cfg_if! { if #[cfg(unix)] { fn foo() { /* unix specific functionality */ } } else if #[cfg(target_pointer_width = "32")] { @@ -48,5 +43,5 @@ at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in Serde by you, as defined in the Apache-2.0 license, shall be +for inclusion in `cfg-if` by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. diff --git a/vendor/cfg-if/src/lib.rs b/vendor/cfg-if/src/lib.rs index e867e65a89..6c5058dadf 100644 --- a/vendor/cfg-if/src/lib.rs +++ b/vendor/cfg-if/src/lib.rs @@ -10,10 +10,7 @@ //! # Example //! //! ``` -//! #[macro_use] -//! extern crate cfg_if; -//! -//! cfg_if! { +//! cfg_if::cfg_if! { //! if #[cfg(unix)] { //! fn foo() { /* unix specific functionality */ } //! } else if #[cfg(target_pointer_width = "32")] { @@ -27,41 +24,40 @@ //! ``` #![no_std] - #![doc(html_root_url = "https://docs.rs/cfg-if")] #![deny(missing_docs)] #![cfg_attr(test, deny(warnings))] /// The main macro provided by this crate. See crate documentation for more /// information. -#[macro_export(local_inner_macros)] +#[macro_export] macro_rules! cfg_if { // match if/else chains with a final `else` ($( - if #[cfg($($meta:meta),*)] { $($it:item)* } + if #[cfg($($meta:meta),*)] { $($tokens:tt)* } ) else * else { - $($it2:item)* + $($tokens2:tt)* }) => { - cfg_if! { + $crate::cfg_if! { @__items () ; - $( ( ($($meta),*) ($($it)*) ), )* - ( () ($($it2)*) ), + $( ( ($($meta),*) ($($tokens)*) ), )* + ( () ($($tokens2)*) ), } }; // match if/else chains lacking a final `else` ( - if #[cfg($($i_met:meta),*)] { $($i_it:item)* } + if #[cfg($($i_met:meta),*)] { $($i_tokens:tt)* } $( - else if #[cfg($($e_met:meta),*)] { $($e_it:item)* } + else if #[cfg($($e_met:meta),*)] { $($e_tokens:tt)* } )* ) => { - cfg_if! { + $crate::cfg_if! { @__items () ; - ( ($($i_met),*) ($($i_it)*) ), - $( ( ($($e_met),*) ($($e_it)*) ), )* + ( ($($i_met),*) ($($i_tokens)*) ), + $( ( ($($e_met),*) ($($e_tokens)*) ), )* ( () () ), } }; @@ -71,21 +67,22 @@ macro_rules! cfg_if { // Collects all the negated cfgs in a list at the beginning and after the // semicolon is all the remaining items (@__items ($($not:meta,)*) ; ) => {}; - (@__items ($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), $($rest:tt)*) => { - // Emit all items within one block, applying an approprate #[cfg]. The + (@__items ($($not:meta,)*) ; ( ($($m:meta),*) ($($tokens:tt)*) ), $($rest:tt)*) => { + // Emit all items within one block, applying an appropriate #[cfg]. The // #[cfg] will require all `$m` matchers specified and must also negate // all previous matchers. - cfg_if! { @__apply cfg(all($($m,)* not(any($($not),*)))), $($it)* } + #[cfg(all($($m,)* not(any($($not),*))))] $crate::cfg_if! { @__identity $($tokens)* } // Recurse to emit all other items in `$rest`, and when we do so add all // our `$m` matchers to the list of `$not` matchers as future emissions // will have to negate everything we just matched as well. - cfg_if! { @__items ($($not,)* $($m,)*) ; $($rest)* } + $crate::cfg_if! { @__items ($($not,)* $($m,)*) ; $($rest)* } }; - // Internal macro to Apply a cfg attribute to a list of items - (@__apply $m:meta, $($it:item)*) => { - $(#[$m] $it)* + // Internal macro to make __apply work out right for different match types, + // because of how macros matching/expand stuff. + (@__identity $($tokens:tt)*) => { + $($tokens)* }; } @@ -141,4 +138,39 @@ mod tests { assert!(works4().is_some()); assert!(works5()); } + + #[test] + #[allow(clippy::assertions_on_constants)] + fn test_usage_within_a_function() { + cfg_if! {if #[cfg(debug_assertions)] { + // we want to put more than one thing here to make sure that they + // all get configured properly. + assert!(cfg!(debug_assertions)); + assert_eq!(4, 2+2); + } else { + assert!(works1().is_some()); + assert_eq!(10, 5+5); + }} + } + + trait Trait { + fn blah(&self); + } + + #[allow(dead_code)] + struct Struct; + + impl Trait for Struct { + cfg_if! { + if #[cfg(feature = "blah")] { + fn blah(&self) { + unimplemented!(); + } + } else { + fn blah(&self) { + unimplemented!(); + } + } + } + } } diff --git a/vendor/cfg-if/tests/xcrate.rs b/vendor/cfg-if/tests/xcrate.rs index f42b877670..e7b4a362ad 100644 --- a/vendor/cfg-if/tests/xcrate.rs +++ b/vendor/cfg-if/tests/xcrate.rs @@ -1,7 +1,4 @@ -#[macro_use] -extern crate cfg_if; - -cfg_if! { +cfg_if::cfg_if! { if #[cfg(foo)] { fn works() -> bool { false } } else if #[cfg(test)] { diff --git a/vendor/cmake/.cargo-checksum.json b/vendor/cmake/.cargo-checksum.json index 1b8b0a086d..3104bc45a4 100644 --- a/vendor/cmake/.cargo-checksum.json +++ b/vendor/cmake/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"e4ffbb39a78f7948351089ccdd2bda917c0e4971081eb9211ca26fe8f5da949c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"4644bfb37c46739179f9f4e73531df7c3c8a801078e7b8a72e3647d685d87912","src/lib.rs":"dbdde299d03dcf4411774f3c639181062d48626139017fab1491624f52b6a215"},"package":"96210eec534fc3fbfc0452a63769424eaa80205fda6cea98e5b61cb3d97bcec8"} \ No newline at end of file +{"files":{"Cargo.toml":"1041ef5daf0481026b809a7f0b90de1b449d103593aa219e7c71ced776542d77","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"a4ad0b734acb4d50db72782207587552c5e33c52500318c202776cd32dbdea4a","src/lib.rs":"166e1c3f86d5b5017b88fcc9c2fa3a9b7bd59feab5c2c54b643931f6055bb608"},"package":"81fb25b677f8bf1eb325017cb6bb8452f87969db0fedb4f757b297bee78a7c62"} \ No newline at end of file diff --git a/vendor/cmake/Cargo.toml b/vendor/cmake/Cargo.toml index 2adeb6abbb..833b43ccc4 100644 --- a/vendor/cmake/Cargo.toml +++ b/vendor/cmake/Cargo.toml @@ -3,7 +3,7 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies +# to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're @@ -12,7 +12,7 @@ [package] name = "cmake" -version = "0.1.38" +version = "0.1.42" authors = ["Alex Crichton "] description = "A build dependency for running `cmake` to build a native library\n" homepage = "https://github.com/alexcrichton/cmake-rs" @@ -23,4 +23,4 @@ categories = ["development-tools::build-utils"] license = "MIT/Apache-2.0" repository = "https://github.com/alexcrichton/cmake-rs" [dependencies.cc] -version = "1.0.32" +version = "1.0.41" diff --git a/vendor/cmake/README.md b/vendor/cmake/README.md index b83a586996..7ef49ca026 100644 --- a/vendor/cmake/README.md +++ b/vendor/cmake/README.md @@ -1,7 +1,5 @@ # cmake -[![Build Status](https://travis-ci.com/alexcrichton/cmake-rs.svg?branch=master)](https://travis-ci.com/alexcrichton/cmake-rs) - [Documentation](https://docs.rs/cmake) A build dependency for running the `cmake` build tool to compile a native diff --git a/vendor/cmake/src/lib.rs b/vendor/cmake/src/lib.rs index 221ac75775..3e96118af9 100644 --- a/vendor/cmake/src/lib.rs +++ b/vendor/cmake/src/lib.rs @@ -176,7 +176,9 @@ impl Config { self } - /// Disables the target option for this compilation. + /// Disables the cmake target option for this compilation. + /// + /// Note that this isn't related to the target triple passed to the compiler! pub fn no_build_target(&mut self, no_build_target: bool) -> &mut Config { self.no_build_target = no_build_target; self @@ -275,6 +277,18 @@ impl Config { self } + // Simple heuristic to determine if we're cross-compiling using the Android + // NDK toolchain file. + fn uses_android_ndk(&self) -> bool { + // `ANDROID_ABI` is the only required flag: + // https://developer.android.com/ndk/guides/cmake#android_abi + self.defined("ANDROID_ABI") + && self.defines.iter().any(|(flag, value)| { + flag == "CMAKE_TOOLCHAIN_FILE" + && Path::new(value).file_name() == Some("android.toolchain.cmake".as_ref()) + }) + } + /// Run this configuration, compiling the library with all the configured /// options. /// @@ -293,23 +307,30 @@ impl Config { }; let host = self.host.clone().unwrap_or_else(|| getenv_unwrap("HOST")); let msvc = target.contains("msvc"); + let ndk = self.uses_android_ndk(); let mut c_cfg = cc::Build::new(); c_cfg .cargo_metadata(false) .opt_level(0) .debug(false) - .target(&target) .warnings(false) - .host(&host); + .host(&host) + .no_default_flags(ndk); + if !ndk { + c_cfg.target(&target); + } let mut cxx_cfg = cc::Build::new(); cxx_cfg .cargo_metadata(false) .cpp(true) .opt_level(0) .debug(false) - .target(&target) .warnings(false) - .host(&host); + .host(&host) + .no_default_flags(ndk); + if !ndk { + cxx_cfg.target(&target); + } if let Some(static_crt) = self.static_crt { c_cfg.static_crt(static_crt); cxx_cfg.static_crt(static_crt); @@ -413,9 +434,31 @@ impl Config { } else { using_nmake_generator = self.generator.as_ref().unwrap() == "NMake Makefiles"; } - if target.contains("x86_64") && !is_ninja && !using_nmake_generator { - cmd.arg("-Thost=x64"); - cmd.arg("-DCMAKE_GENERATOR_PLATFORM=x64"); + if !is_ninja && !using_nmake_generator { + if target.contains("x86_64") { + cmd.arg("-Thost=x64"); + cmd.arg("-Ax64"); + } else if target.contains("thumbv7a") { + cmd.arg("-Thost=x64"); + cmd.arg("-Aarm"); + } else if target.contains("aarch64") { + cmd.arg("-Thost=x64"); + cmd.arg("-AARM64"); + } else if target.contains("i686") { + use cc::windows_registry::{find_vs_version, VsVers}; + match find_vs_version() { + Ok(VsVers::Vs16) => { + // 32-bit x86 toolset used to be the default for all hosts, + // but Visual Studio 2019 changed the default toolset to match the host, + // so we need to manually override it for x86 targets + cmd.arg("-Thost=x86"); + cmd.arg("-AWin32"); + } + _ => {} + }; + } else { + panic!("unsupported msvc target: {}", target); + } } } else if target.contains("redox") { if !self.defined("CMAKE_SYSTEM_NAME") { @@ -489,7 +532,8 @@ impl Config { (OptLevel::Release, false) => "Release", (OptLevel::Release, true) => "RelWithDebInfo", (OptLevel::Size, _) => "MinSizeRel", - }.to_string() + } + .to_string() }); for &(ref k, ref v) in &self.defines { let mut os = OsString::from("-D"); @@ -596,7 +640,8 @@ impl Config { } else { wchar } - }).collect::>(); + }) + .collect::>(); ccompiler = OsString::from_wide(&wchars); } cmd.arg(ccompiler); @@ -718,7 +763,10 @@ impl Config { ), Err(msg) => panic!(msg), }; - if target.contains("i686") || target.contains("x86_64") { + if ["i686", "x86_64", "thumbv7a", "aarch64"] + .iter() + .any(|t| target.contains(t)) + { base.to_string() } else { panic!("unsupported msvc target: {}", target); diff --git a/vendor/compiler_builtins/.cargo-checksum.json b/vendor/compiler_builtins/.cargo-checksum.json index c06fc75f03..666031c9c9 100644 --- a/vendor/compiler_builtins/.cargo-checksum.json +++ b/vendor/compiler_builtins/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"b496786b900b1dbf032be57b076e719ffd4dd5099f71475d96d5dadcd061768a","Cargo.toml":"80f5cf10e551b5cfd855c695a1afc8ad4d3768417dbe6cf71665e46996775b7b","README.md":"2dd28b207028773ffee09ed0db563ac71b255b6b67256289d67a13cb19d15f94","build.rs":"f53df24724687cf7409e16c4520e3db92fba511dcc4ec9932b5517e164e31311","examples/intrinsics.rs":"9caf42160ffa191cf19a2562122f3f77f970d249ca11079e7f6d69c447013991","libm/src/math/acos.rs":"fb066ba84aba1372d706425ec14f35ff8d971756d15eeebd22ecf42a716493bb","libm/src/math/acosf.rs":"a112b82309bba1d35c4e3d6ad4d6c21ef305343d9ab601ddf4bc61d43bc9f1af","libm/src/math/acosh.rs":"56dac8538e4350cd7cf001327c89f087b68abb2e6aaad58edba8a094b09f6b0f","libm/src/math/acoshf.rs":"df5b0c4d8e37e64cf5ff2d8328b28bc35c78e84060ff769e64523ea9ff9065c1","libm/src/math/asin.rs":"095a1e98996daff45df0b154ca0ec35bbf31db964ee9fdda0207308cb20df441","libm/src/math/asinf.rs":"49cccb4db2881982643a4a7d5453f4f8daf527711bbb67313607a3c178856d61","libm/src/math/asinh.rs":"e8fc94031015fddf35e9c26b94da9f6431ee17c81cd7bd37da8ffc98f7e0b32c","libm/src/math/asinhf.rs":"8a0b8933a98a17617a66fef4c7b89eba645fdf05302000babf4a5a5f45328430","libm/src/math/atan.rs":"d4fe46e1c5739dd09997869dcfbc3c85f03c534af52e700d6c6bcf9c3fedda07","libm/src/math/atan2.rs":"2623bc8ca707d13a7092ce49adf68e9cbf4452ad1bf4a861dc40ca858606a747","libm/src/math/atan2f.rs":"dd01943e0e1f1955912e5c3ffc9467529cf64bd02ac0a6ad5ab31dbe6657f05d","libm/src/math/atanf.rs":"c8e85a1c32335d003151603d09225cdf553240b7cab9d3a2c8b4fb286ef2711c","libm/src/math/atanh.rs":"5934dbd6b7395ca4f103ace7598da723a9270e1cf6b47e7f786debe4bb3651ff","libm/src/math/atanhf.rs":"8ba4711dda19ef2dc33622be65c1483902868083543198c6bbd040d4026293de","libm/src/math/cbrt.rs":"f2c45612d2eecd93cfcdd9ebf824c754fc8f8dfd6d16862c0b9c4ccea78c2a0f","libm/src/math/cbrtf.rs":"ad0b483854aa9f17a44d36c049bf0e8ebab34c27e90b787c05f45cc230ec7d19","libm/src/math/ceil.rs":"0e6caff1597818471c28b7c3226dbfe9976fdb38ace5246172ac030754be6b79","libm/src/math/ceilf.rs":"f942bcea617de7da880b68bdfe676837a7984e2a887eaafe181be24c6bc13cc2","libm/src/math/copysign.rs":"d80c880efaf0cdf2ce0a4d4f5a68dd6c36c88d46fa997ec8ac8604bfdb26fa33","libm/src/math/copysignf.rs":"1547116071e68a42b1605eb2fc722db6466a34517dc96b92de1f29a274c3d8e3","libm/src/math/cos.rs":"74babdc13ede78e400c5ca1854c3e22d2e08cbdc5618aefa5bba6f9303ef65b6","libm/src/math/cosf.rs":"09c40f93c445b741e22477ceedf163ca33b6a47f973f7c9876cfba2692edb29c","libm/src/math/cosh.rs":"0d0a7cef18577f321996b8b87561963139f754ad7f2ea0a3b3883811f3f0693a","libm/src/math/coshf.rs":"be8ca8739e4cf1978425b349f941cb4838bba8c10cb559c7940b9fd4fdde21ad","libm/src/math/erf.rs":"9c55fc6756ba816996f0b585e07ccfa4cd87575ad525cd30c4a968b30acffda3","libm/src/math/erff.rs":"cb020e8bada9a54573a11fe3271750d73f14fed3092a881a9ceaf98fe32fd5a6","libm/src/math/exp.rs":"bb678aa085c4a22bd7c9608f71428d323966235728d8d69d7ae78a4bc111fb70","libm/src/math/exp10.rs":"2deb037f88feac87a0e924b69dd496f0dd3b5d35f2a58e09d4c5166b207e517b","libm/src/math/exp10f.rs":"6979464dfe3f4f2da1f9afc909646499c4bfaef15e10a039384750e2f1586fea","libm/src/math/exp2.rs":"d6fea08b03e65ae494c445dc87fd08ca7e50d754c5a374d2369722c4e8350337","libm/src/math/exp2f.rs":"720dd3cd8c3668e0addbe0e6a25baf13bb3d271940b67795e0690394cfba6fc5","libm/src/math/expf.rs":"d41b1ffe03245173e9bf7769f8691178d3e90ecfa8987e2e72ce01ee5989abc8","libm/src/math/expm1.rs":"124069f456c8ad331f265c7509d9e223b2a300e461bbfd3d6adfdcdd2ee5b8ac","libm/src/math/expm1f.rs":"18e2116d31ea8410051cc709b9d04b754b0e3ba6758ee1bf0b48749f4999b840","libm/src/math/expo2.rs":"4f4f9fecfccb43f30c2784aa7c0bb656754a52b8ab431f7d1b551c673ab133f1","libm/src/math/fabs.rs":"e6c7db39f98508098cdf64ac0c2f53866c466149a7490afb9fe22b44c4dd81b3","libm/src/math/fabsf.rs":"dc85b66e4ef662721276ae3a301af22795524e4367ee8dd40f0c24c439773c6d","libm/src/math/fdim.rs":"8ec091996005207297c2389ae563e1b18dbc6a9eac951de29a976c5cd7bc32a7","libm/src/math/fdimf.rs":"c7f3f2269834d55be26b6580ddc07c42531577955fa4de35bad1e2a361085614","libm/src/math/fenv.rs":"8730d45aa4c591f91dccdcc1ce533fa23e9c6df0c38defb9c57f749cb25e1cd0","libm/src/math/floor.rs":"be15e687a6798defc6f2c6b43028481f8104fb93d2b3f359d3d5d16b78e79d4f","libm/src/math/floorf.rs":"4ec41aa64cfafd23b8cfc043eacea5e9125cca5dcb3f5e655cc3d3458c6ba2c5","libm/src/math/fma.rs":"6872e79787e9270520189b53608f602b8ad5a099f3cef10ad5b9e0c06ef01fe0","libm/src/math/fmaf.rs":"3e0f5727e56f31218f674b9b8975d7e67b3a24a097f06a2a3eca9723cd786213","libm/src/math/fmax.rs":"f6c8e96a8b1a170648d2fa3513e7b6b459085d708c839869f82e305fe58fac37","libm/src/math/fmaxf.rs":"dff0025433232e8a5ec7bd54d847ccf596d762ea4e35f5c54fbaac9404d732fd","libm/src/math/fmin.rs":"95b6cb66ca0e0e22276f0bf88dbe8fb69796a69a196a7491bd4802efbcf2e298","libm/src/math/fminf.rs":"304bc839b15ea3d84e68d2af9f40524ec120d30a36a667b22fcb98a6c258f4c7","libm/src/math/fmod.rs":"a1c0550fc7df8164733d914e222ff0966a2ab886d6e75a1098f24fe0283ae227","libm/src/math/fmodf.rs":"ee51ed092c0eeb8195f35735ff725cfd46612e0d689a7c483538bd92fbe61828","libm/src/math/frexp.rs":"28af70026922a8ab979744c7ad4d8faba6079c4743b7eeb6d14c983a982fbbcc","libm/src/math/frexpf.rs":"2e2593ae8002ba420809ebfaf737ef001cdc912354be3d978a8c0cb930350d4d","libm/src/math/hypot.rs":"841131c4a0cea75bc8a86e29f3f6d0815a61fc99731c9984651ce83d3050d218","libm/src/math/hypotf.rs":"5f317323edc2eb699580fe54b074b7e570a7734d51a0a149c0b49b54470a836c","libm/src/math/ilogb.rs":"813413bf6266d4fc40db9c5921af3cef4f892ba93e8f6d9efe62a449d1234532","libm/src/math/ilogbf.rs":"dec462780f46682e16cfaa733238bed3b692729e951f53a44726100b6c73a716","libm/src/math/j0.rs":"9572b6396c489927d332d0e717920e61ec0618e5e9c31f7eeeec70f5e4abab06","libm/src/math/j0f.rs":"802c8254bded9b3afb6eea8b9af240038a5a4a5d811396729f69ca509e3e7d87","libm/src/math/j1.rs":"97b1af1611fa3d110c2b349ee8e4176100132ea1391b619086b47ac063b81803","libm/src/math/j1f.rs":"1d504d7750c0481273baad88196d3644f258af9ad10f8b5b16341c0aab8b9125","libm/src/math/jn.rs":"847d122334e5707ad9627146cddccc082a1f2f5bcd3e5ef54399013a7007ce88","libm/src/math/jnf.rs":"4045076f7d1a1b89882ed60d4dd60a4cbbc66b85cfb90491378c8015effcc476","libm/src/math/k_cos.rs":"f34a69e44d6b8901b03b578a75972f438ab20a7b98a0903fc1903d6fde3899be","libm/src/math/k_cosf.rs":"8f7117ff21cebf8e890a5bcfd7ea858a94172f4172b79a66d53824c2cb0888b1","libm/src/math/k_expo2.rs":"eb4ca9e6a525b7ea6da868c3cb136896682cc46f8396ba2a2ebc3ae9e9ba54b0","libm/src/math/k_expo2f.rs":"d51ad5df61cb5d1258bdb90c52bfed4572bb446a9337de9c04411ed9454ae0cb","libm/src/math/k_sin.rs":"14b2aba6ca07150c92768b5a72acaf5cde6a11d6619e14896512a7ba242e289a","libm/src/math/k_sinf.rs":"2775fcc710807164e6f37a4f8da3c8143cd5f16e19ce7c31c5591522151d7a96","libm/src/math/k_tan.rs":"a72beae4ccd9631eeeb61d6365bbeecae81c8411f3120a999c515cca0d5ea5c5","libm/src/math/k_tanf.rs":"6a794be56fa4b2f60452b9bab19af01c388f174560acbf829a351378ea39495d","libm/src/math/ldexp.rs":"b647f0096e80e4d926d8dd18d294c892ee2cb1778effe2c5e1b2664ae5cb1a4e","libm/src/math/ldexpf.rs":"98743fad2cd97a7be496f40ba3157ac1438fce0d0c25d5ab90c3b8c71c3fd0ed","libm/src/math/lgamma.rs":"498552658cc8106d7754f85ae8dbc3306ac2f0a9f7eb5a796be70c5beac92c41","libm/src/math/lgamma_r.rs":"77fb6442aeb5343926d8965e1549dde3e2cc4fd09555de6b56506001d956c344","libm/src/math/lgammaf.rs":"457105f53a4c8717e8f5a117d261dcf94e222e83981337fe23602abe883fe3f7","libm/src/math/lgammaf_r.rs":"44de75babbdd53c4a5879cd6f426e7311db82669def39df5f63914d67d6cc1b1","libm/src/math/log.rs":"b5e0c5f30d9e94351488732801be3107c12b854c3f95ad37e256dd88eeca408f","libm/src/math/log10.rs":"3425ff8be001fd1646ba15e254eb6ef4bdc6ccaf0cbee27ddf1fa84e04178b90","libm/src/math/log10f.rs":"fee4f71879bc4c99259e68c0c641364901629fb29a8ebddfcc0d090102cceddd","libm/src/math/log1p.rs":"9cf400852f165e6be19b97036ae9521fb9ca857d0a9a91c117d9123221622185","libm/src/math/log1pf.rs":"2716e6d2afa271996b7c8f47fd9e4952c88f4c1fd8c07c3e8ce8c62794bf71d8","libm/src/math/log2.rs":"dbbbfbaaa8aa6a4dbefea554ea3983090a9691228b011910c751f6adca912c40","libm/src/math/log2f.rs":"92a90350d8edce21c31c285c3e620fca7c62a2366008921715945c2c73b5b79f","libm/src/math/logf.rs":"845342cffc34d3db1f5ec12d8e5b773cd5a79056e28662fcb9bcd80207596f50","libm/src/math/mod.rs":"2dff1e74386ada00a5cb4ff16e0455b574f68edfddb2e38de1786e4b7d6472c6","libm/src/math/modf.rs":"d012ed5a708ef52b6d1313c22a46cadaf5764dde1220816e3df2f03a0fcc60ae","libm/src/math/modff.rs":"f8f1e4c27a85d2cdb3c8e74439d59ef64aa543b948f22c23227d02d8388d61c2","libm/src/math/nextafter.rs":"3282e7eef214a32736fb6928d490198ad394b26b402b45495115b104839eebfe","libm/src/math/nextafterf.rs":"0937dc8a8155c19842c12181e741cec1f7df1f7a00cee81fcb2475e2842761b7","libm/src/math/pow.rs":"7312f6b315db1302cef3e59cb98366d9b2af13b173f7f06ac971b866b2542eb7","libm/src/math/powf.rs":"4ea3e6ef09136fa6250aae51e8807c6fd3e7d55be8066c5d9ab43502f49a7141","libm/src/math/rem_pio2.rs":"fcd3514e894bf6343c306698b44fd2e820fb6a80b85237fec4daeaa41c581545","libm/src/math/rem_pio2_large.rs":"c230108b86867d0d46752a23c5ec457e3eb378b52c894972117266685d4df020","libm/src/math/rem_pio2f.rs":"377349d1308bda8cd2f776e4856fe090baa78fa3db816b680780ddf31b80d446","libm/src/math/remainder.rs":"63865f4370853c476b45bb27a5c54a4072146aa4a626835ae5263871a4e7e5dc","libm/src/math/remainderf.rs":"dd3fa432dbda8f2135428198be7bd69c57f8d13df3f365b12f52bf6a82352ac4","libm/src/math/remquo.rs":"3cc0bf55069f165c4843f2c358b3a27279c01e8cdd99f9057a3f7f31f45408f2","libm/src/math/remquof.rs":"cc749e18ecb7e766b8b8eeabdbf89ac99087d3d587e71e30f690676a3d2c1f9b","libm/src/math/round.rs":"955649c893fa3151b4a81c8e550fbc03f01bb99b40d60986e5f153ee71043f69","libm/src/math/roundf.rs":"8ae8f1f71eedd158566771cfe80b352d2f13c170a0ce8dc2691a14e8a791cfbb","libm/src/math/scalbn.rs":"b5c9d6d4177fe393cbfe1c634d75ce14b754f6cbce87c5bf979a9661491748a2","libm/src/math/scalbnf.rs":"4f198d06db1896386256fb9a5ac5b805b16b836226c18780a475cf18d7c1449c","libm/src/math/sin.rs":"0e014e6377c9673a73395ab2ffcf5962e512392afddf8a4e731fb694098faf34","libm/src/math/sincos.rs":"59e9f196140681fa817652134b8d1bdd2d6dd47bb8557b0346c77b176389f883","libm/src/math/sincosf.rs":"3a9ea06965f3a3a18db8beb305be7811f9a5b41e2e357852cf51c83d98a5c09e","libm/src/math/sinf.rs":"dcddac1d56b084cbb8d0e019433c9c5fe2201d9b257a7dcf2f85c9a8f14b79cf","libm/src/math/sinh.rs":"d8ee4c7af883a526f36c1a6da13bb81fba9181b477e2f2538161a2bee97edc35","libm/src/math/sinhf.rs":"d06eb030ba9dbf7094df127262bfe99f149b4db49fa8ab8c15499660f1e46b26","libm/src/math/sqrt.rs":"824570a631c2542ccee68b65e3eb08fe79c037a29bbaaf54da5367e7b236124a","libm/src/math/sqrtf.rs":"d9e12ac55c5471c18175efdfb15c092ba71a2eb914d2e1ee3b3310a22202042e","libm/src/math/tan.rs":"930ecedaadc60f704c2dfa4e15186f59713c1ba7d948529d215223b424827db5","libm/src/math/tanf.rs":"894156a3b107aee08461eb4e7e412fc049aa237d176ae705c6e3e2d7060d94e3","libm/src/math/tanh.rs":"f1f08eb98ed959a17370a7aaf0177be36e3764543424e78feb033ed3f5e8ec98","libm/src/math/tanhf.rs":"74027b0c672a4e64bdef6d7a3069b90caec50e1e7dbb2c12d2828f310502f41e","libm/src/math/tgamma.rs":"a6aabb8365410af6611f19f58694ccb74e82bb9ba9e1cdec7e1af787cfa44815","libm/src/math/tgammaf.rs":"c95bd69957387533853532164f7e2251d2b04f5e775406b9e647226ae2bdd5ad","libm/src/math/trunc.rs":"642264897cc1505e720c8cf313be81aa9fd53aae866644a2e988d01dbc77fd8a","libm/src/math/truncf.rs":"619b675b6a9bb81eccddb1fa8214cff63e1f62136629b645c87f036672311732","src/arm.rs":"f87a9ecde925c4f81fecf8bc8552bd7704f99119cb9e8a697d21bc6fead72a9f","src/arm_linux.rs":"80d18ce84bdfa841fa133f5ee9e9fd50167344436d2d398f74347a90f27606c6","src/float/add.rs":"1a230ed4e17148cfffb7c880929c9c0d5d48d85581d75164c5031b8f05a5d567","src/float/cmp.rs":"a86ccbc0e56f07ba439dc6a4fd835184645178c0a6da625bd4ae24ecf9a790f8","src/float/conv.rs":"0af148b6c717d124e870e5d1926eaa562de37e374c605ea81c1f7eea994146f4","src/float/div.rs":"58bdcd73c5ffafde9cca8a0e7986de0660fb8b5b4d4132e7a63dd21f93f4fe0e","src/float/extend.rs":"180b2e791c58e0526de0a798845c580ce3222c8a15c8665e6e6a4bf5cf1a34aa","src/float/mod.rs":"b6408cd776a6a363f3fe541213ebe0315d13d301f26b331de13e55f4044029e5","src/float/mul.rs":"9465960b326897a04543789aa44640aefeb4cc63311e58ae8213f664dd4ac21e","src/float/pow.rs":"64f4935f4bed46d3b9cde4d16f59cca76a110d36d02d76f4b909157349edf5e3","src/float/sub.rs":"c2a87f4628f51d5d908d0f25b5d51ce0599dc559d5a72b20e131261f484d5848","src/int/addsub.rs":"9e7a393c76958fe9e8fb7de9bfe1304766c276bfdaa25761913357e0f6172369","src/int/mod.rs":"021d95719bfc396d5431ae309ef6f484d8612152d4586f022cd3c45af3af411b","src/int/mul.rs":"3142da8783cfac3ef704efcae19838bfda4916965fb852294685cf7664976e8a","src/int/sdiv.rs":"ca47f2a41fe0aad1e37f4e56ab1e0959c5b10c32c3593596c8cef2ff17694389","src/int/shift.rs":"0427e05a39cf6a0abab0b6525e8567afcf336f49fbb0ed0977b480e16a878bd8","src/int/udiv.rs":"9a222e79c0bf74ab77728cfa2026508508b33e7f2ac6cafc1fa34040e5538ba0","src/lib.rs":"008b3ff9822e16323de020e4b2c0c34965f1746824da6945439300a5d27f29b9","src/macros.rs":"7beec9106d0ccb0120566a377ace53a5a3c19d412bd2751a5732b3a121d70099","src/math.rs":"a2e45a208bcdd742d32639591c91525a44f891db6057ce066052d67c4d4ae809","src/mem.rs":"4ece60ca07aaff3611a716a80f55668a785ad8399b65fc36cc9ab4b481fa639c","src/probestack.rs":"8a42401b267d68219a1041a02a6f39994f864ce0d41eb446000166204be5247d","src/riscv32.rs":"b9b433d248fce35e43a7df430697545f39898fad46be7d0197284764e44993b2","src/x86.rs":"cfae51814619da70fafa0ce912198e8d697e9337c76a7467baed2bb0cda388a9","src/x86_64.rs":"0b0c0014b59a7f09e492f92fe87d1f855b35df24bc2c6c23a3720ef9a683a0af"},"package":"e6f083abf9bb9005a27d2da62706f661245278cb7096da37ab27410eaf60f2c1"} \ No newline at end of file +{"files":{"Cargo.lock":"a793ef7f630dbe3dc7973e2d400d9f5f7ba4f7d3deaca5e9c14ab8a195c324fc","Cargo.toml":"4c14f572f576e295fc01b41f7dc4090217ccdf9217e09c4fab629426cce8023a","README.md":"2dd28b207028773ffee09ed0db563ac71b255b6b67256289d67a13cb19d15f94","build.rs":"f53df24724687cf7409e16c4520e3db92fba511dcc4ec9932b5517e164e31311","examples/intrinsics.rs":"9caf42160ffa191cf19a2562122f3f77f970d249ca11079e7f6d69c447013991","libm/src/math/acos.rs":"fb066ba84aba1372d706425ec14f35ff8d971756d15eeebd22ecf42a716493bb","libm/src/math/acosf.rs":"a112b82309bba1d35c4e3d6ad4d6c21ef305343d9ab601ddf4bc61d43bc9f1af","libm/src/math/acosh.rs":"56dac8538e4350cd7cf001327c89f087b68abb2e6aaad58edba8a094b09f6b0f","libm/src/math/acoshf.rs":"df5b0c4d8e37e64cf5ff2d8328b28bc35c78e84060ff769e64523ea9ff9065c1","libm/src/math/asin.rs":"095a1e98996daff45df0b154ca0ec35bbf31db964ee9fdda0207308cb20df441","libm/src/math/asinf.rs":"49cccb4db2881982643a4a7d5453f4f8daf527711bbb67313607a3c178856d61","libm/src/math/asinh.rs":"e8fc94031015fddf35e9c26b94da9f6431ee17c81cd7bd37da8ffc98f7e0b32c","libm/src/math/asinhf.rs":"8a0b8933a98a17617a66fef4c7b89eba645fdf05302000babf4a5a5f45328430","libm/src/math/atan.rs":"d4fe46e1c5739dd09997869dcfbc3c85f03c534af52e700d6c6bcf9c3fedda07","libm/src/math/atan2.rs":"2623bc8ca707d13a7092ce49adf68e9cbf4452ad1bf4a861dc40ca858606a747","libm/src/math/atan2f.rs":"dd01943e0e1f1955912e5c3ffc9467529cf64bd02ac0a6ad5ab31dbe6657f05d","libm/src/math/atanf.rs":"c8e85a1c32335d003151603d09225cdf553240b7cab9d3a2c8b4fb286ef2711c","libm/src/math/atanh.rs":"5934dbd6b7395ca4f103ace7598da723a9270e1cf6b47e7f786debe4bb3651ff","libm/src/math/atanhf.rs":"8ba4711dda19ef2dc33622be65c1483902868083543198c6bbd040d4026293de","libm/src/math/cbrt.rs":"f2c45612d2eecd93cfcdd9ebf824c754fc8f8dfd6d16862c0b9c4ccea78c2a0f","libm/src/math/cbrtf.rs":"ad0b483854aa9f17a44d36c049bf0e8ebab34c27e90b787c05f45cc230ec7d19","libm/src/math/ceil.rs":"0e6caff1597818471c28b7c3226dbfe9976fdb38ace5246172ac030754be6b79","libm/src/math/ceilf.rs":"f942bcea617de7da880b68bdfe676837a7984e2a887eaafe181be24c6bc13cc2","libm/src/math/copysign.rs":"d80c880efaf0cdf2ce0a4d4f5a68dd6c36c88d46fa997ec8ac8604bfdb26fa33","libm/src/math/copysignf.rs":"1547116071e68a42b1605eb2fc722db6466a34517dc96b92de1f29a274c3d8e3","libm/src/math/cos.rs":"74babdc13ede78e400c5ca1854c3e22d2e08cbdc5618aefa5bba6f9303ef65b6","libm/src/math/cosf.rs":"09c40f93c445b741e22477ceedf163ca33b6a47f973f7c9876cfba2692edb29c","libm/src/math/cosh.rs":"0d0a7cef18577f321996b8b87561963139f754ad7f2ea0a3b3883811f3f0693a","libm/src/math/coshf.rs":"be8ca8739e4cf1978425b349f941cb4838bba8c10cb559c7940b9fd4fdde21ad","libm/src/math/erf.rs":"9c55fc6756ba816996f0b585e07ccfa4cd87575ad525cd30c4a968b30acffda3","libm/src/math/erff.rs":"cb020e8bada9a54573a11fe3271750d73f14fed3092a881a9ceaf98fe32fd5a6","libm/src/math/exp.rs":"bb678aa085c4a22bd7c9608f71428d323966235728d8d69d7ae78a4bc111fb70","libm/src/math/exp10.rs":"2deb037f88feac87a0e924b69dd496f0dd3b5d35f2a58e09d4c5166b207e517b","libm/src/math/exp10f.rs":"6979464dfe3f4f2da1f9afc909646499c4bfaef15e10a039384750e2f1586fea","libm/src/math/exp2.rs":"d6fea08b03e65ae494c445dc87fd08ca7e50d754c5a374d2369722c4e8350337","libm/src/math/exp2f.rs":"720dd3cd8c3668e0addbe0e6a25baf13bb3d271940b67795e0690394cfba6fc5","libm/src/math/expf.rs":"d41b1ffe03245173e9bf7769f8691178d3e90ecfa8987e2e72ce01ee5989abc8","libm/src/math/expm1.rs":"124069f456c8ad331f265c7509d9e223b2a300e461bbfd3d6adfdcdd2ee5b8ac","libm/src/math/expm1f.rs":"18e2116d31ea8410051cc709b9d04b754b0e3ba6758ee1bf0b48749f4999b840","libm/src/math/expo2.rs":"4f4f9fecfccb43f30c2784aa7c0bb656754a52b8ab431f7d1b551c673ab133f1","libm/src/math/fabs.rs":"e6c7db39f98508098cdf64ac0c2f53866c466149a7490afb9fe22b44c4dd81b3","libm/src/math/fabsf.rs":"dc85b66e4ef662721276ae3a301af22795524e4367ee8dd40f0c24c439773c6d","libm/src/math/fdim.rs":"8ec091996005207297c2389ae563e1b18dbc6a9eac951de29a976c5cd7bc32a7","libm/src/math/fdimf.rs":"c7f3f2269834d55be26b6580ddc07c42531577955fa4de35bad1e2a361085614","libm/src/math/fenv.rs":"8730d45aa4c591f91dccdcc1ce533fa23e9c6df0c38defb9c57f749cb25e1cd0","libm/src/math/floor.rs":"be15e687a6798defc6f2c6b43028481f8104fb93d2b3f359d3d5d16b78e79d4f","libm/src/math/floorf.rs":"4ec41aa64cfafd23b8cfc043eacea5e9125cca5dcb3f5e655cc3d3458c6ba2c5","libm/src/math/fma.rs":"6872e79787e9270520189b53608f602b8ad5a099f3cef10ad5b9e0c06ef01fe0","libm/src/math/fmaf.rs":"3e0f5727e56f31218f674b9b8975d7e67b3a24a097f06a2a3eca9723cd786213","libm/src/math/fmax.rs":"f6c8e96a8b1a170648d2fa3513e7b6b459085d708c839869f82e305fe58fac37","libm/src/math/fmaxf.rs":"dff0025433232e8a5ec7bd54d847ccf596d762ea4e35f5c54fbaac9404d732fd","libm/src/math/fmin.rs":"95b6cb66ca0e0e22276f0bf88dbe8fb69796a69a196a7491bd4802efbcf2e298","libm/src/math/fminf.rs":"304bc839b15ea3d84e68d2af9f40524ec120d30a36a667b22fcb98a6c258f4c7","libm/src/math/fmod.rs":"a1c0550fc7df8164733d914e222ff0966a2ab886d6e75a1098f24fe0283ae227","libm/src/math/fmodf.rs":"ee51ed092c0eeb8195f35735ff725cfd46612e0d689a7c483538bd92fbe61828","libm/src/math/frexp.rs":"28af70026922a8ab979744c7ad4d8faba6079c4743b7eeb6d14c983a982fbbcc","libm/src/math/frexpf.rs":"2e2593ae8002ba420809ebfaf737ef001cdc912354be3d978a8c0cb930350d4d","libm/src/math/hypot.rs":"841131c4a0cea75bc8a86e29f3f6d0815a61fc99731c9984651ce83d3050d218","libm/src/math/hypotf.rs":"5f317323edc2eb699580fe54b074b7e570a7734d51a0a149c0b49b54470a836c","libm/src/math/ilogb.rs":"813413bf6266d4fc40db9c5921af3cef4f892ba93e8f6d9efe62a449d1234532","libm/src/math/ilogbf.rs":"dec462780f46682e16cfaa733238bed3b692729e951f53a44726100b6c73a716","libm/src/math/j0.rs":"9572b6396c489927d332d0e717920e61ec0618e5e9c31f7eeeec70f5e4abab06","libm/src/math/j0f.rs":"802c8254bded9b3afb6eea8b9af240038a5a4a5d811396729f69ca509e3e7d87","libm/src/math/j1.rs":"97b1af1611fa3d110c2b349ee8e4176100132ea1391b619086b47ac063b81803","libm/src/math/j1f.rs":"1d504d7750c0481273baad88196d3644f258af9ad10f8b5b16341c0aab8b9125","libm/src/math/jn.rs":"847d122334e5707ad9627146cddccc082a1f2f5bcd3e5ef54399013a7007ce88","libm/src/math/jnf.rs":"4045076f7d1a1b89882ed60d4dd60a4cbbc66b85cfb90491378c8015effcc476","libm/src/math/k_cos.rs":"f34a69e44d6b8901b03b578a75972f438ab20a7b98a0903fc1903d6fde3899be","libm/src/math/k_cosf.rs":"8f7117ff21cebf8e890a5bcfd7ea858a94172f4172b79a66d53824c2cb0888b1","libm/src/math/k_expo2.rs":"eb4ca9e6a525b7ea6da868c3cb136896682cc46f8396ba2a2ebc3ae9e9ba54b0","libm/src/math/k_expo2f.rs":"d51ad5df61cb5d1258bdb90c52bfed4572bb446a9337de9c04411ed9454ae0cb","libm/src/math/k_sin.rs":"14b2aba6ca07150c92768b5a72acaf5cde6a11d6619e14896512a7ba242e289a","libm/src/math/k_sinf.rs":"2775fcc710807164e6f37a4f8da3c8143cd5f16e19ce7c31c5591522151d7a96","libm/src/math/k_tan.rs":"a72beae4ccd9631eeeb61d6365bbeecae81c8411f3120a999c515cca0d5ea5c5","libm/src/math/k_tanf.rs":"6a794be56fa4b2f60452b9bab19af01c388f174560acbf829a351378ea39495d","libm/src/math/ldexp.rs":"b647f0096e80e4d926d8dd18d294c892ee2cb1778effe2c5e1b2664ae5cb1a4e","libm/src/math/ldexpf.rs":"98743fad2cd97a7be496f40ba3157ac1438fce0d0c25d5ab90c3b8c71c3fd0ed","libm/src/math/lgamma.rs":"498552658cc8106d7754f85ae8dbc3306ac2f0a9f7eb5a796be70c5beac92c41","libm/src/math/lgamma_r.rs":"77fb6442aeb5343926d8965e1549dde3e2cc4fd09555de6b56506001d956c344","libm/src/math/lgammaf.rs":"457105f53a4c8717e8f5a117d261dcf94e222e83981337fe23602abe883fe3f7","libm/src/math/lgammaf_r.rs":"44de75babbdd53c4a5879cd6f426e7311db82669def39df5f63914d67d6cc1b1","libm/src/math/log.rs":"b5e0c5f30d9e94351488732801be3107c12b854c3f95ad37e256dd88eeca408f","libm/src/math/log10.rs":"3425ff8be001fd1646ba15e254eb6ef4bdc6ccaf0cbee27ddf1fa84e04178b90","libm/src/math/log10f.rs":"fee4f71879bc4c99259e68c0c641364901629fb29a8ebddfcc0d090102cceddd","libm/src/math/log1p.rs":"9cf400852f165e6be19b97036ae9521fb9ca857d0a9a91c117d9123221622185","libm/src/math/log1pf.rs":"2716e6d2afa271996b7c8f47fd9e4952c88f4c1fd8c07c3e8ce8c62794bf71d8","libm/src/math/log2.rs":"dbbbfbaaa8aa6a4dbefea554ea3983090a9691228b011910c751f6adca912c40","libm/src/math/log2f.rs":"92a90350d8edce21c31c285c3e620fca7c62a2366008921715945c2c73b5b79f","libm/src/math/logf.rs":"845342cffc34d3db1f5ec12d8e5b773cd5a79056e28662fcb9bcd80207596f50","libm/src/math/mod.rs":"2dff1e74386ada00a5cb4ff16e0455b574f68edfddb2e38de1786e4b7d6472c6","libm/src/math/modf.rs":"d012ed5a708ef52b6d1313c22a46cadaf5764dde1220816e3df2f03a0fcc60ae","libm/src/math/modff.rs":"f8f1e4c27a85d2cdb3c8e74439d59ef64aa543b948f22c23227d02d8388d61c2","libm/src/math/nextafter.rs":"3282e7eef214a32736fb6928d490198ad394b26b402b45495115b104839eebfe","libm/src/math/nextafterf.rs":"0937dc8a8155c19842c12181e741cec1f7df1f7a00cee81fcb2475e2842761b7","libm/src/math/pow.rs":"7312f6b315db1302cef3e59cb98366d9b2af13b173f7f06ac971b866b2542eb7","libm/src/math/powf.rs":"4ea3e6ef09136fa6250aae51e8807c6fd3e7d55be8066c5d9ab43502f49a7141","libm/src/math/rem_pio2.rs":"fcd3514e894bf6343c306698b44fd2e820fb6a80b85237fec4daeaa41c581545","libm/src/math/rem_pio2_large.rs":"c230108b86867d0d46752a23c5ec457e3eb378b52c894972117266685d4df020","libm/src/math/rem_pio2f.rs":"377349d1308bda8cd2f776e4856fe090baa78fa3db816b680780ddf31b80d446","libm/src/math/remainder.rs":"63865f4370853c476b45bb27a5c54a4072146aa4a626835ae5263871a4e7e5dc","libm/src/math/remainderf.rs":"dd3fa432dbda8f2135428198be7bd69c57f8d13df3f365b12f52bf6a82352ac4","libm/src/math/remquo.rs":"3cc0bf55069f165c4843f2c358b3a27279c01e8cdd99f9057a3f7f31f45408f2","libm/src/math/remquof.rs":"cc749e18ecb7e766b8b8eeabdbf89ac99087d3d587e71e30f690676a3d2c1f9b","libm/src/math/round.rs":"955649c893fa3151b4a81c8e550fbc03f01bb99b40d60986e5f153ee71043f69","libm/src/math/roundf.rs":"8ae8f1f71eedd158566771cfe80b352d2f13c170a0ce8dc2691a14e8a791cfbb","libm/src/math/scalbn.rs":"b5c9d6d4177fe393cbfe1c634d75ce14b754f6cbce87c5bf979a9661491748a2","libm/src/math/scalbnf.rs":"4f198d06db1896386256fb9a5ac5b805b16b836226c18780a475cf18d7c1449c","libm/src/math/sin.rs":"0e014e6377c9673a73395ab2ffcf5962e512392afddf8a4e731fb694098faf34","libm/src/math/sincos.rs":"59e9f196140681fa817652134b8d1bdd2d6dd47bb8557b0346c77b176389f883","libm/src/math/sincosf.rs":"3a9ea06965f3a3a18db8beb305be7811f9a5b41e2e357852cf51c83d98a5c09e","libm/src/math/sinf.rs":"dcddac1d56b084cbb8d0e019433c9c5fe2201d9b257a7dcf2f85c9a8f14b79cf","libm/src/math/sinh.rs":"d8ee4c7af883a526f36c1a6da13bb81fba9181b477e2f2538161a2bee97edc35","libm/src/math/sinhf.rs":"d06eb030ba9dbf7094df127262bfe99f149b4db49fa8ab8c15499660f1e46b26","libm/src/math/sqrt.rs":"824570a631c2542ccee68b65e3eb08fe79c037a29bbaaf54da5367e7b236124a","libm/src/math/sqrtf.rs":"d9e12ac55c5471c18175efdfb15c092ba71a2eb914d2e1ee3b3310a22202042e","libm/src/math/tan.rs":"930ecedaadc60f704c2dfa4e15186f59713c1ba7d948529d215223b424827db5","libm/src/math/tanf.rs":"894156a3b107aee08461eb4e7e412fc049aa237d176ae705c6e3e2d7060d94e3","libm/src/math/tanh.rs":"f1f08eb98ed959a17370a7aaf0177be36e3764543424e78feb033ed3f5e8ec98","libm/src/math/tanhf.rs":"74027b0c672a4e64bdef6d7a3069b90caec50e1e7dbb2c12d2828f310502f41e","libm/src/math/tgamma.rs":"a6aabb8365410af6611f19f58694ccb74e82bb9ba9e1cdec7e1af787cfa44815","libm/src/math/tgammaf.rs":"c95bd69957387533853532164f7e2251d2b04f5e775406b9e647226ae2bdd5ad","libm/src/math/trunc.rs":"642264897cc1505e720c8cf313be81aa9fd53aae866644a2e988d01dbc77fd8a","libm/src/math/truncf.rs":"619b675b6a9bb81eccddb1fa8214cff63e1f62136629b645c87f036672311732","src/arm.rs":"f87a9ecde925c4f81fecf8bc8552bd7704f99119cb9e8a697d21bc6fead72a9f","src/arm_linux.rs":"80d18ce84bdfa841fa133f5ee9e9fd50167344436d2d398f74347a90f27606c6","src/float/add.rs":"1a230ed4e17148cfffb7c880929c9c0d5d48d85581d75164c5031b8f05a5d567","src/float/cmp.rs":"a86ccbc0e56f07ba439dc6a4fd835184645178c0a6da625bd4ae24ecf9a790f8","src/float/conv.rs":"0af148b6c717d124e870e5d1926eaa562de37e374c605ea81c1f7eea994146f4","src/float/div.rs":"58bdcd73c5ffafde9cca8a0e7986de0660fb8b5b4d4132e7a63dd21f93f4fe0e","src/float/extend.rs":"180b2e791c58e0526de0a798845c580ce3222c8a15c8665e6e6a4bf5cf1a34aa","src/float/mod.rs":"b6408cd776a6a363f3fe541213ebe0315d13d301f26b331de13e55f4044029e5","src/float/mul.rs":"9465960b326897a04543789aa44640aefeb4cc63311e58ae8213f664dd4ac21e","src/float/pow.rs":"64f4935f4bed46d3b9cde4d16f59cca76a110d36d02d76f4b909157349edf5e3","src/float/sub.rs":"c2a87f4628f51d5d908d0f25b5d51ce0599dc559d5a72b20e131261f484d5848","src/int/addsub.rs":"9e7a393c76958fe9e8fb7de9bfe1304766c276bfdaa25761913357e0f6172369","src/int/mod.rs":"021d95719bfc396d5431ae309ef6f484d8612152d4586f022cd3c45af3af411b","src/int/mul.rs":"3142da8783cfac3ef704efcae19838bfda4916965fb852294685cf7664976e8a","src/int/sdiv.rs":"ca47f2a41fe0aad1e37f4e56ab1e0959c5b10c32c3593596c8cef2ff17694389","src/int/shift.rs":"0427e05a39cf6a0abab0b6525e8567afcf336f49fbb0ed0977b480e16a878bd8","src/int/udiv.rs":"9a222e79c0bf74ab77728cfa2026508508b33e7f2ac6cafc1fa34040e5538ba0","src/lib.rs":"008b3ff9822e16323de020e4b2c0c34965f1746824da6945439300a5d27f29b9","src/macros.rs":"c7efeeadc477545658736cfcd18e74331e6c63cbab5bcff5407cf8bee30414b0","src/math.rs":"a2e45a208bcdd742d32639591c91525a44f891db6057ce066052d67c4d4ae809","src/mem.rs":"4ece60ca07aaff3611a716a80f55668a785ad8399b65fc36cc9ab4b481fa639c","src/probestack.rs":"204692298669a408159d50bad43facd947ef7a0bbcf935a3553270b2301598c3","src/riscv32.rs":"b9b433d248fce35e43a7df430697545f39898fad46be7d0197284764e44993b2","src/x86.rs":"cfae51814619da70fafa0ce912198e8d697e9337c76a7467baed2bb0cda388a9","src/x86_64.rs":"0b0c0014b59a7f09e492f92fe87d1f855b35df24bc2c6c23a3720ef9a683a0af"},"package":"438ac08ddc5efe81452f984a9e33ba425b00b31d1f48e6acd9e2210aa28cc52e"} \ No newline at end of file diff --git a/vendor/compiler_builtins/Cargo.lock b/vendor/compiler_builtins/Cargo.lock index 903da558d5..cb1d823b65 100644 --- a/vendor/compiler_builtins/Cargo.lock +++ b/vendor/compiler_builtins/Cargo.lock @@ -2,13 +2,13 @@ # It is not intended for manual editing. [[package]] name = "cc" -version = "1.0.48" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52a465a666ca3d838ebbf08b241383421412fe7ebb463527bba275526d89f76" +checksum = "e450b8da92aa6f274e7c6437692f9f2ce6d701fb73bacfcf87897b3f89a4c20e" [[package]] name = "compiler_builtins" -version = "0.1.22" +version = "0.1.25" dependencies = [ "cc", "rustc-std-workspace-core", diff --git a/vendor/compiler_builtins/Cargo.toml b/vendor/compiler_builtins/Cargo.toml index 07a205574f..8f83bf58c0 100644 --- a/vendor/compiler_builtins/Cargo.toml +++ b/vendor/compiler_builtins/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "compiler_builtins" -version = "0.1.22" +version = "0.1.25" authors = ["Jorge Aparicio "] links = "compiler-rt" include = ["/Cargo.toml", "/build.rs", "/src/*", "/examples/*", "/LICENSE.txt", "/README.md", "/compiler-rt/*", "/libm/src/math/*"] diff --git a/vendor/compiler_builtins/src/macros.rs b/vendor/compiler_builtins/src/macros.rs index 2d11ba622b..a86794072c 100644 --- a/vendor/compiler_builtins/src/macros.rs +++ b/vendor/compiler_builtins/src/macros.rs @@ -165,13 +165,13 @@ macro_rules! intrinsics { $($rest:tt)* ) => ( - #[cfg(all(windows, target_pointer_width = "64"))] + #[cfg(all(windows, target_arch = "x86_64"))] $(#[$($attr)*])* pub extern $abi fn $name( $($argname: $ty),* ) -> $ret { $($body)* } - #[cfg(all(windows, target_pointer_width = "64"))] + #[cfg(all(windows, target_arch = "x86_64"))] pub mod $name { intrinsics! { @@ -184,7 +184,7 @@ macro_rules! intrinsics { } } - #[cfg(not(all(windows, target_pointer_width = "64")))] + #[cfg(not(all(windows, target_arch = "x86_64")))] intrinsics! { $(#[$($attr)*])* pub extern $abi fn $name( $($argname: $ty),* ) -> $ret { diff --git a/vendor/compiler_builtins/src/probestack.rs b/vendor/compiler_builtins/src/probestack.rs index 933a60dd98..19307df4e9 100644 --- a/vendor/compiler_builtins/src/probestack.rs +++ b/vendor/compiler_builtins/src/probestack.rs @@ -56,7 +56,7 @@ extern "C" { // emitted for the function. // // This is the ELF version. -#[cfg(not(target_vendor = "apple"))] +#[cfg(not(any(target_vendor = "apple", target_os = "uefi")))] macro_rules! define_rust_probestack { ($body: expr) => { concat!( @@ -64,6 +64,7 @@ macro_rules! define_rust_probestack { .pushsection .text.__rust_probestack .globl __rust_probestack .type __rust_probestack, @function + .hidden __rust_probestack __rust_probestack: ", $body, @@ -75,7 +76,21 @@ macro_rules! define_rust_probestack { }; } -// Same as above, but for Mach-O. +#[cfg(target_os = "uefi")] +macro_rules! define_rust_probestack { + ($body: expr) => { + concat!( + " + .globl __rust_probestack + __rust_probestack: + ", + $body + ) + }; +} + +// Same as above, but for Mach-O. Note that the triple underscore +// is deliberate #[cfg(target_vendor = "apple")] macro_rules! define_rust_probestack { ($body: expr) => { diff --git a/vendor/crossbeam-channel/.cargo-checksum.json b/vendor/crossbeam-channel/.cargo-checksum.json new file mode 100644 index 0000000000..a39e37da05 --- /dev/null +++ b/vendor/crossbeam-channel/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"e3f2e919beea9c6641fdd62fa1567cb63a894836c814f3a85b802273909d44c4","Cargo.toml":"120ad305158b75139456a66abb44ef3a191fee44b9b29e209a5bb52e7887cd28","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","LICENSE-THIRD-PARTY":"924a49392dc8304def57586be4ebd69aaf51e16fd245b55b4b69ad2cce6b715a","README.md":"077c5ddbd471d4a21f5b183e415b708e5100fcad8baed335fd4ad5b6f959a8be","examples/fibonacci.rs":"8755bcb9cf05e391d8679fbb51db40ed9692703c3b66341cd1c1e4cca2068874","examples/matching.rs":"1fd35488bf42e1782a339b9691a4e82dcf23ad12502809e33555d46c91739476","examples/stopwatch.rs":"4e90ce134475859a421da0a095baea52a575b03e41fb8fb50cf47446f422ee6e","src/channel.rs":"4d398567823e2e8189de91d67ef58e4b61d1b8d3f1e373da2664ed40ae154717","src/context.rs":"8480d39c053f7533838fdf9cae019d1a5218a146ea071f1a89f2be8f625ef992","src/counter.rs":"3a9c1b0fa94beeabd349789ca94453f0cb3aa67f5d56bc619a7e029956fd3dbf","src/err.rs":"1a9ac9d7f4d5561f9c3e513b2f776782783954efa0bf9428598f3ad9ccb9d5c9","src/flavors/after.rs":"4f761618efe21036145e44f01506bdfbc2524879368ac138600e0feed921a6a7","src/flavors/array.rs":"5155741d55b40715f3c65bf19c106b3f73476f4e77de877b14fb3a2ff53a4631","src/flavors/list.rs":"fef0ae43b96a321961f73e466cdb0aa06afed8597d34bac30795dc14a1908849","src/flavors/mod.rs":"a5af9b6105207e293c0d64928b4486fb1da9bfe0318354c66c8b5069e41ec31f","src/flavors/never.rs":"86e21b4d8b154e5d795cf72c7203a1d16a846c4d670095c8b592c12569f35a98","src/flavors/tick.rs":"3ae19df71310972e7b5fd8cac17d90bff683e1493ed3db26d0d3d329dff133ff","src/flavors/zero.rs":"cae6eb914d36e58810704d7200b1dc90ff6cc03b23a97fa3ac04fbd00f18381a","src/lib.rs":"bc843b55c65d3a20ad1fc56da675e48232af5373339f2e513b4f6d4460e0000d","src/select.rs":"2e1655da701253388949a6e9d6cc30d3f65481d5e071222ede7fba2a9312c0ba","src/select_macro.rs":"e8f3998ab86f54e46acaa48bd6bba9b2e955ed11710d23c46f256295575fd638","src/utils.rs":"ebf230fed429c353f6202fe10c33dcca69a0917a947665a7ee03d230b88a29bf","src/waker.rs":"e85114e43a4db4befadd79b574c2567f3076e460791c2ea6b9588ee824d2c988","tests/after.rs":"9336716edbb6e3145f006e62af59a4e82160ecfb8748fac174b844fb81442d45","tests/array.rs":"1e87f8e2e75dcbaf0dbc75394cfa329c0fd5719db0bdb9ba2aa0cc86b2a18044","tests/golang.rs":"08c13a4fafd25da03809f20965203e4e88bdf936ff53342f2e43430e6603d3fa","tests/iter.rs":"3beaac492a9df39d2eae31d7cdb88f4ee3bd3cb57e2c5c9705811b8ee2abe744","tests/list.rs":"0a664517f3ff49e0885f6c649cbc76f5e5c7a4940096d7a1c98728cbe1655948","tests/mpsc.rs":"d268beb7bcb0be864bdb745585979c97343b82761705907fd90b0ec85f2db7d4","tests/never.rs":"cd455a4c78403d9a96fe0f3a4e968164cca533cc85c96aaa4558987f9b088fcc","tests/ready.rs":"7bc0dd86cd987dcae7db84c9f4379a2421e088b4e5dbdc07affb10c853fc7f55","tests/select.rs":"1ace0bbd2aecf488827d2c16d5d32b47baf00b0a1f7f7470bf9c8e16ddf92dad","tests/select_macro.rs":"d303abb0a3f7ff9bb3b5253951d7d17bfb30e4f77fb66d11c40a063691f9a9ae","tests/thread_locals.rs":"e9d25086d4bc590bacdaf20b5ff0ff3741d3403a413a8b817eaf15f61fb5e644","tests/tick.rs":"011c39a85f1e0427e61e7afc0860cf6dc29d41f7e8be9709684e4ffdc26ef9b8","tests/zero.rs":"983998a52173fba22045fb8390566a59ebb0392834477ab94cac934d637a3231"},"package":"0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b"} \ No newline at end of file diff --git a/vendor/crossbeam-channel/CHANGELOG.md b/vendor/crossbeam-channel/CHANGELOG.md new file mode 100644 index 0000000000..0cffdbc028 --- /dev/null +++ b/vendor/crossbeam-channel/CHANGELOG.md @@ -0,0 +1,137 @@ +# Version 0.3.8 + +- Bump the minimum required version of `crossbeam-utils`. + +# Version 0.3.7 + +- Remove `parking_lot` and `rand` dependencies. +- Expand documentation. +- Implement `Default` for `Select`. +- Make `size_of::>()` smaller. +- Several minor optimizations. +- Add more tests. + +# Version 0.3.6 + +- Fix a bug in initialization of unbounded channels. + +# Version 0.3.5 + +- New implementation for unbounded channels. +- A number of small performance improvements. +- Remove `crossbeam-epoch` dependency. + +# Version 0.3.4 + +- Bump `crossbeam-epoch` to `0.7`. +- Improve documentation. + +# Version 0.3.3 + +- Relax the lifetime in `SelectedOperation<'_>`. +- Add `Select::try_ready()`, `Select::ready()`, and `Select::ready_timeout()`. +- Update licensing notices. +- Improve documentation. +- Add methods `is_disconnected()`, `is_timeout()`, `is_empty()`, and `is_full()` on error types. + +# Version 0.3.2 + +- More elaborate licensing notices. + +# Version 0.3.1 + +- Update `crossbeam-utils` to `0.6`. + +# Version 0.3.0 + +- Add a special `never` channel type. +- Dropping all receivers now closes the channel. +- The interface of sending and receiving methods is now very similar to those in v0.1. +- The syntax for `send` in `select!` is now `send(sender, msg) -> res => body`. +- The syntax for `recv` in `select!` is now `recv(receiver) -> res => body`. +- New, more efficient interface for `Select` without callbacks. +- Timeouts can be specified in `select!`. + +# Version 0.2.6 + +- `Select` struct that can add cases dynamically. +- More documentation (in particular, the FAQ section). +- Optimize contended sends/receives in unbounded channels. + +# Version 0.2.5 + +- Use `LocalKey::try_with` instead of `LocalKey::with`. +- Remove helper macros `__crossbeam_channel*`. + +# Version 0.2.4 + +- Make `select!` linearizable with other channel operations. +- Update `crossbeam-utils` to `0.5.0`. +- Update `parking_lot` to `0.6.3`. +- Remove Mac OS X tests. + +# Version 0.2.3 + +- Add Mac OS X tests. +- Lower some memory orderings. +- Eliminate calls to `mem::unitialized`, which caused bugs with ZST. + +# Version 0.2.2 + +- Add more tests. +- Update `crossbeam-epoch` to 0.5.0 +- Initialize the RNG seed to a random value. +- Replace `libc::abort` with `std::process::abort`. +- Ignore clippy warnings in `select!`. +- Better interaction of `select!` with the NLL borrow checker. + +# Version 0.2.1 + +- Fix compilation errors when using `select!` with `#[deny(unsafe_code)]`. + +# Version 0.2.0 + +- Implement `IntoIterator` for `Receiver`. +- Add a new `select!` macro. +- Add special channels `after` and `tick`. +- Dropping receivers doesn't close the channel anymore. +- Change the signature of `recv`, `send`, and `try_recv`. +- Remove `Sender::is_closed` and `Receiver::is_closed`. +- Remove `Sender::close` and `Receiver::close`. +- Remove `Sender::send_timeout` and `Receiver::recv_timeout`. +- Remove `Sender::try_send`. +- Remove `Select` and `select_loop!`. +- Remove all error types. +- Remove `Iter`, `TryIter`, and `IntoIter`. +- Remove the `nightly` feature. +- Remove ordering operators for `Sender` and `Receiver`. + +# Version 0.1.3 + +- Add `Sender::disconnect` and `Receiver::disconnect`. +- Implement comparison operators for `Sender` and `Receiver`. +- Allow arbitrary patterns in place of `msg` in `recv(r, msg)`. +- Add a few conversion impls between error types. +- Add benchmarks for `atomicring` and `mpmc`. +- Add benchmarks for different message sizes. +- Documentation improvements. +- Update `crossbeam-epoch` to 0.4.0 +- Update `crossbeam-utils` to 0.3.0 +- Update `parking_lot` to 0.5 +- Update `rand` to 0.4 + +# Version 0.1.2 + +- Allow conditional cases in `select_loop!` macro. +- Fix typos in documentation. +- Fix deadlock in selection when all channels are disconnected and a timeout is specified. + +# Version 0.1.1 + +- Implement `Debug` for `Sender`, `Receiver`, `Iter`, `TryIter`, `IntoIter`, and `Select`. +- Implement `Default` for `Select`. + +# Version 0.1.0 + +- First implementation of the channels. +- Add `select_loop!` macro by @TimNN. diff --git a/vendor/crossbeam-channel/Cargo.toml b/vendor/crossbeam-channel/Cargo.toml new file mode 100644 index 0000000000..42a078589a --- /dev/null +++ b/vendor/crossbeam-channel/Cargo.toml @@ -0,0 +1,34 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g. crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +name = "crossbeam-channel" +version = "0.3.8" +authors = ["The Crossbeam Project Developers"] +description = "Multi-producer multi-consumer channels for message passing" +homepage = "https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-channel" +documentation = "https://docs.rs/crossbeam-channel" +readme = "README.md" +keywords = ["channel", "mpmc", "select", "golang", "message"] +categories = ["algorithms", "concurrency", "data-structures"] +license = "MIT/Apache-2.0" +repository = "https://github.com/crossbeam-rs/crossbeam" +[dependencies.crossbeam-utils] +version = "0.6.5" + +[dependencies.smallvec] +version = "0.6.2" +[dev-dependencies.rand] +version = "0.6" + +[dev-dependencies.signal-hook] +version = "0.1.5" diff --git a/vendor/itertools-0.7.8/LICENSE-APACHE b/vendor/crossbeam-channel/LICENSE-APACHE similarity index 100% rename from vendor/itertools-0.7.8/LICENSE-APACHE rename to vendor/crossbeam-channel/LICENSE-APACHE diff --git a/vendor/itertools-0.7.8/LICENSE-MIT b/vendor/crossbeam-channel/LICENSE-MIT similarity index 98% rename from vendor/itertools-0.7.8/LICENSE-MIT rename to vendor/crossbeam-channel/LICENSE-MIT index 9203baa055..31aa79387f 100644 --- a/vendor/itertools-0.7.8/LICENSE-MIT +++ b/vendor/crossbeam-channel/LICENSE-MIT @@ -1,5 +1,3 @@ -Copyright (c) 2015 - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the diff --git a/vendor/crossbeam-channel/LICENSE-THIRD-PARTY b/vendor/crossbeam-channel/LICENSE-THIRD-PARTY new file mode 100644 index 0000000000..d15e32bc71 --- /dev/null +++ b/vendor/crossbeam-channel/LICENSE-THIRD-PARTY @@ -0,0 +1,625 @@ +=============================================================================== + +Bounded MPMC queue +http://www.1024cores.net/home/code-license + +Copyright (c) 2010-2011 Dmitry Vyukov. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY DMITRY VYUKOV "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL DMITRY VYUKOV OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of Dmitry Vyukov. + +=============================================================================== + +matching.go +https://creativecommons.org/licenses/by/3.0/legalcode + +Creative Commons Legal Code + +Attribution 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined above) for the purposes of this + License. + c. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + d. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + e. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + f. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + g. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + h. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + i. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(b), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(b), as requested. + b. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Section 3(b), in the case of an Adaptation, + a credit identifying the use of the Work in the Adaptation (e.g., + "French translation of the Work by Original Author," or "Screenplay + based on original Work by Original Author"). The credit required by + this Section 4 (b) may be implemented in any reasonable manner; + provided, however, that in the case of a Adaptation or Collection, at + a minimum such credit will appear, if a credit for all contributing + authors of the Adaptation or Collection appears, then as part of these + credits and in a manner at least as prominent as the credits for the + other contributing authors. For the avoidance of doubt, You may only + use the credit required by this Section for the purpose of attribution + in the manner set out above and, by exercising Your rights under this + License, You may not implicitly or explicitly assert or imply any + connection with, sponsorship or endorsement by the Original Author, + Licensor and/or Attribution Parties, as appropriate, of You or Your + use of the Work, without the separate, express prior written + permission of the Original Author, Licensor and/or Attribution + Parties. + c. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of this License. + + Creative Commons may be contacted at https://creativecommons.org/. + +=============================================================================== + +The Go Programming Language +https://golang.org/LICENSE + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=============================================================================== + +The Rust Programming Language +https://github.com/rust-lang/rust/blob/master/LICENSE-MIT + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +=============================================================================== + +The Rust Programming Language +https://github.com/rust-lang/rust/blob/master/LICENSE-APACHE + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/crossbeam-channel/README.md b/vendor/crossbeam-channel/README.md new file mode 100644 index 0000000000..39f1e21bb6 --- /dev/null +++ b/vendor/crossbeam-channel/README.md @@ -0,0 +1,88 @@ +# Crossbeam Channel + +[![Build Status](https://travis-ci.org/crossbeam-rs/crossbeam.svg?branch=master)]( +https://travis-ci.org/crossbeam-rs/crossbeam) +[![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)]( +https://github.com/crossbeam-rs/crossbeam-channel) +[![Cargo](https://img.shields.io/crates/v/crossbeam-channel.svg)]( +https://crates.io/crates/crossbeam-channel) +[![Documentation](https://docs.rs/crossbeam-channel/badge.svg)]( +https://docs.rs/crossbeam-channel) +[![Rust 1.26+](https://img.shields.io/badge/rust-1.26+-lightgray.svg)]( +https://www.rust-lang.org) + +This crate provides multi-producer multi-consumer channels for message passing. +It is an alternative to [`std::sync::mpsc`] with more features and better performance. + +Some highlights: + +* [`Sender`]s and [`Receiver`]s can be cloned and shared among threads. +* Two main kinds of channels are [`bounded`] and [`unbounded`]. +* Convenient extra channels like [`after`], [`never`], and [`tick`]. +* The [`select!`] macro can block on multiple channel operations. +* [`Select`] can select over a dynamically built list of channel operations. +* Channels use locks very sparingly for maximum [performance](benchmarks). + +[`std::sync::mpsc`]: https://doc.rust-lang.org/std/sync/mpsc/index.html +[`Sender`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/struct.Sender.html +[`Receiver`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/struct.Receiver.html +[`bounded`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.bounded.html +[`unbounded`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.unbounded.html +[`after`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.after.html +[`never`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.never.html +[`tick`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.tick.html +[`select!`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/macro.select.html +[`Select`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/struct.Select.html + +## Usage + +Add this to your `Cargo.toml`: + +```toml +[dependencies] +crossbeam-channel = "0.3" +``` + +Next, add this to your crate: + +```rust +#[macro_use] +extern crate crossbeam_channel; +``` + +## License + +Licensed under either of + + * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +#### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in the work by you, as defined in the Apache-2.0 license, shall be +dual licensed as above, without any additional terms or conditions. + +#### Third party software + +This product includes copies and modifications of software developed by third parties: + +* [examples/matching.rs](examples/matching.rs) includes + [matching.go](http://www.nada.kth.se/~snilsson/concurrency/src/matching.go) by Stefan Nilsson, + licensed under Creative Commons Attribution 3.0 Unported License. + +* [src/flavors/array.rs](src/flavors/array.rs) is based on + [Bounded MPMC queue](http://www.1024cores.net/home/lock-free-algorithms/queues/bounded-mpmc-queue) + by Dmitry Vyukov, licensed under the Simplified BSD License and the Apache License, Version 2.0. + +* [tests/mpsc.rs](tests/mpsc.rs) includes modifications of code from The Rust Programming Language, + licensed under the MIT License and the Apache License, Version 2.0. + +* [tests/golang.rs](tests/golang.rs) is based on code from The Go Programming Language, licensed + under the 3-Clause BSD License. + +See the source code files for more details. + +Copies of third party licenses can be found in [LICENSE-THIRD-PARTY](LICENSE-THIRD-PARTY). diff --git a/vendor/crossbeam-channel/examples/fibonacci.rs b/vendor/crossbeam-channel/examples/fibonacci.rs new file mode 100644 index 0000000000..499887a052 --- /dev/null +++ b/vendor/crossbeam-channel/examples/fibonacci.rs @@ -0,0 +1,27 @@ +//! An asynchronous fibonacci sequence generator. + +extern crate crossbeam_channel; + +use std::thread; + +use crossbeam_channel::{bounded, Sender}; + +// Sends the Fibonacci sequence into the channel until it becomes disconnected. +fn fibonacci(sender: Sender) { + let (mut x, mut y) = (0, 1); + while sender.send(x).is_ok() { + let tmp = x; + x = y; + y = tmp + y; + } +} + +fn main() { + let (s, r) = bounded(0); + thread::spawn(|| fibonacci(s)); + + // Print the first 20 Fibonacci numbers. + for num in r.iter().take(20) { + println!("{}", num); + } +} diff --git a/vendor/crossbeam-channel/examples/matching.rs b/vendor/crossbeam-channel/examples/matching.rs new file mode 100644 index 0000000000..b765fcef47 --- /dev/null +++ b/vendor/crossbeam-channel/examples/matching.rs @@ -0,0 +1,75 @@ +//! Using `select!` to send and receive on the same channel at the same time. +//! +//! This example is based on the following program in Go. +//! +//! Source: +//! - https://web.archive.org/web/20171209034309/https://www.nada.kth.se/~snilsson/concurrency +//! - http://www.nada.kth.se/~snilsson/concurrency/src/matching.go +//! +//! Copyright & License: +//! - Stefan Nilsson +//! - Creative Commons Attribution 3.0 Unported License +//! - https://creativecommons.org/licenses/by/3.0/ +//! +//! ```go +//! func main() { +//! people := []string{"Anna", "Bob", "Cody", "Dave", "Eva"} +//! match := make(chan string, 1) // Make room for one unmatched send. +//! wg := new(sync.WaitGroup) +//! for _, name := range people { +//! wg.Add(1) +//! go Seek(name, match, wg) +//! } +//! wg.Wait() +//! select { +//! case name := <-match: +//! fmt.Printf("No one received %s’s message.\n", name) +//! default: +//! // There was no pending send operation. +//! } +//! } +//! +//! // Seek either sends or receives, whichever possible, a name on the match +//! // channel and notifies the wait group when done. +//! func Seek(name string, match chan string, wg *sync.WaitGroup) { +//! select { +//! case peer := <-match: +//! fmt.Printf("%s received a message from %s.\n", name, peer) +//! case match <- name: +//! // Wait for someone to receive my message. +//! } +//! wg.Done() +//! } +//! ``` + +#[macro_use] +extern crate crossbeam_channel; +extern crate crossbeam_utils; + +use crossbeam_channel::bounded; +use crossbeam_utils::thread; + +fn main() { + let people = vec!["Anna", "Bob", "Cody", "Dave", "Eva"]; + let (s, r) = bounded(1); // Make room for one unmatched send. + + // Either send my name into the channel or receive someone else's, whatever happens first. + let seek = |name, s, r| { + select! { + recv(r) -> peer => println!("{} received a message from {}.", name, peer.unwrap()), + send(s, name) -> _ => {}, // Wait for someone to receive my message. + } + }; + + thread::scope(|scope| { + for name in people { + let (s, r) = (s.clone(), r.clone()); + scope.spawn(move |_| seek(name, s, r)); + } + }).unwrap(); + + // Check if there is a pending send operation. + if let Ok(name) = r.try_recv() { + println!("No one received {}’s message.", name); + } +} diff --git a/vendor/crossbeam-channel/examples/stopwatch.rs b/vendor/crossbeam-channel/examples/stopwatch.rs new file mode 100644 index 0000000000..137ea210e6 --- /dev/null +++ b/vendor/crossbeam-channel/examples/stopwatch.rs @@ -0,0 +1,58 @@ +//! Prints the elapsed time every 1 second and quits on Ctrl+C. + +#[macro_use] +extern crate crossbeam_channel; +extern crate signal_hook; + +use std::io; +use std::thread; +use std::time::{Duration, Instant}; + +use crossbeam_channel::{bounded, tick, Receiver}; +use signal_hook::iterator::Signals; +use signal_hook::SIGINT; + +// Creates a channel that gets a message every time `SIGINT` is signalled. +fn sigint_notifier() -> io::Result> { + let (s, r) = bounded(100); + let signals = Signals::new(&[SIGINT])?; + + thread::spawn(move || { + for _ in signals.forever() { + if s.send(()).is_err() { + break; + } + } + }); + + Ok(r) +} + +// Prints the elapsed time. +fn show(dur: Duration) { + println!( + "Elapsed: {}.{:03} sec", + dur.as_secs(), + dur.subsec_nanos() / 1_000_000 + ); +} + +fn main() { + let start = Instant::now(); + let update = tick(Duration::from_secs(1)); + let ctrl_c = sigint_notifier().unwrap(); + + loop { + select! { + recv(update) -> _ => { + show(start.elapsed()); + } + recv(ctrl_c) -> _ => { + println!(); + println!("Goodbye!"); + show(start.elapsed()); + break; + } + } + } +} diff --git a/vendor/crossbeam-channel/src/channel.rs b/vendor/crossbeam-channel/src/channel.rs new file mode 100644 index 0000000000..e71b22bccf --- /dev/null +++ b/vendor/crossbeam-channel/src/channel.rs @@ -0,0 +1,1340 @@ +//! The channel interface. + +use std::fmt; +use std::iter::FusedIterator; +use std::mem; +use std::panic::{RefUnwindSafe, UnwindSafe}; +use std::sync::Arc; +use std::time::{Duration, Instant}; + +use context::Context; +use counter; +use err::{RecvError, RecvTimeoutError, SendError, SendTimeoutError, TryRecvError, TrySendError}; +use flavors; +use select::{Operation, SelectHandle, Token}; + +/// Creates a channel of unbounded capacity. +/// +/// This channel has a growable buffer that can hold any number of messages at a time. +/// +/// # Examples +/// +/// ``` +/// use std::thread; +/// use crossbeam_channel::unbounded; +/// +/// let (s, r) = unbounded(); +/// +/// // Computes the n-th Fibonacci number. +/// fn fib(n: i32) -> i32 { +/// if n <= 1 { +/// n +/// } else { +/// fib(n - 1) + fib(n - 2) +/// } +/// } +/// +/// // Spawn an asynchronous computation. +/// thread::spawn(move || s.send(fib(20)).unwrap()); +/// +/// // Print the result of the computation. +/// println!("{}", r.recv().unwrap()); +/// ``` +pub fn unbounded() -> (Sender, Receiver) { + let (s, r) = counter::new(flavors::list::Channel::new()); + let s = Sender { + flavor: SenderFlavor::List(s), + }; + let r = Receiver { + flavor: ReceiverFlavor::List(r), + }; + (s, r) +} + +/// Creates a channel of bounded capacity. +/// +/// This channel has a buffer that can hold at most `cap` messages at a time. +/// +/// A special case is zero-capacity channel, which cannot hold any messages. Instead, send and +/// receive operations must appear at the same time in order to pair up and pass the message over. +/// +/// # Panics +/// +/// Panics if the capacity is greater than `usize::max_value() / 4`. +/// +/// # Examples +/// +/// A channel of capacity 1: +/// +/// ``` +/// use std::thread; +/// use std::time::Duration; +/// use crossbeam_channel::bounded; +/// +/// let (s, r) = bounded(1); +/// +/// // This call returns immediately because there is enough space in the channel. +/// s.send(1).unwrap(); +/// +/// thread::spawn(move || { +/// // This call blocks the current thread because the channel is full. +/// // It will be able to complete only after the first message is received. +/// s.send(2).unwrap(); +/// }); +/// +/// thread::sleep(Duration::from_secs(1)); +/// assert_eq!(r.recv(), Ok(1)); +/// assert_eq!(r.recv(), Ok(2)); +/// ``` +/// +/// A zero-capacity channel: +/// +/// ``` +/// use std::thread; +/// use std::time::Duration; +/// use crossbeam_channel::bounded; +/// +/// let (s, r) = bounded(0); +/// +/// thread::spawn(move || { +/// // This call blocks the current thread until a receive operation appears +/// // on the other side of the channel. +/// s.send(1).unwrap(); +/// }); +/// +/// thread::sleep(Duration::from_secs(1)); +/// assert_eq!(r.recv(), Ok(1)); +/// ``` +pub fn bounded(cap: usize) -> (Sender, Receiver) { + if cap == 0 { + let (s, r) = counter::new(flavors::zero::Channel::new()); + let s = Sender { + flavor: SenderFlavor::Zero(s), + }; + let r = Receiver { + flavor: ReceiverFlavor::Zero(r), + }; + (s, r) + } else { + let (s, r) = counter::new(flavors::array::Channel::with_capacity(cap)); + let s = Sender { + flavor: SenderFlavor::Array(s), + }; + let r = Receiver { + flavor: ReceiverFlavor::Array(r), + }; + (s, r) + } +} + +/// Creates a receiver that delivers a message after a certain duration of time. +/// +/// The channel is bounded with capacity of 1 and never gets disconnected. Exactly one message will +/// be sent into the channel after `duration` elapses. The message is the instant at which it is +/// sent. +/// +/// # Examples +/// +/// Using an `after` channel for timeouts: +/// +/// ``` +/// # #[macro_use] +/// # extern crate crossbeam_channel; +/// # fn main() { +/// use std::time::Duration; +/// use crossbeam_channel::{after, unbounded}; +/// +/// let (s, r) = unbounded::(); +/// let timeout = Duration::from_millis(100); +/// +/// select! { +/// recv(r) -> msg => println!("received {:?}", msg), +/// recv(after(timeout)) -> _ => println!("timed out"), +/// } +/// # } +/// ``` +/// +/// When the message gets sent: +/// +/// ``` +/// use std::thread; +/// use std::time::{Duration, Instant}; +/// use crossbeam_channel::after; +/// +/// // Converts a number of milliseconds into a `Duration`. +/// let ms = |ms| Duration::from_millis(ms); +/// +/// // Returns `true` if `a` and `b` are very close `Instant`s. +/// let eq = |a, b| a + ms(50) > b && b + ms(50) > a; +/// +/// let start = Instant::now(); +/// let r = after(ms(100)); +/// +/// thread::sleep(ms(500)); +/// +/// // This message was sent 100 ms from the start and received 500 ms from the start. +/// assert!(eq(r.recv().unwrap(), start + ms(100))); +/// assert!(eq(Instant::now(), start + ms(500))); +/// ``` +pub fn after(duration: Duration) -> Receiver { + Receiver { + flavor: ReceiverFlavor::After(Arc::new(flavors::after::Channel::new(duration))), + } +} + +/// Creates a receiver that never delivers messages. +/// +/// The channel is bounded with capacity of 0 and never gets disconnected. +/// +/// # Examples +/// +/// Using a `never` channel to optionally add a timeout to [`select!`]: +/// +/// ``` +/// # #[macro_use] +/// # extern crate crossbeam_channel; +/// # fn main() { +/// use std::thread; +/// use std::time::{Duration, Instant}; +/// use crossbeam_channel::{after, never, unbounded}; +/// +/// let (s, r) = unbounded(); +/// +/// thread::spawn(move || { +/// thread::sleep(Duration::from_secs(1)); +/// s.send(1).unwrap(); +/// }); +/// +/// // Suppose this duration can be a `Some` or a `None`. +/// let duration = Some(Duration::from_millis(100)); +/// +/// // Create a channel that times out after the specified duration. +/// let timeout = duration +/// .map(|d| after(d)) +/// .unwrap_or(never()); +/// +/// select! { +/// recv(r) -> msg => assert_eq!(msg, Ok(1)), +/// recv(timeout) -> _ => println!("timed out"), +/// } +/// # } +/// ``` +/// +/// [`select!`]: macro.select.html +pub fn never() -> Receiver { + Receiver { + flavor: ReceiverFlavor::Never(flavors::never::Channel::new()), + } +} + +/// Creates a receiver that delivers messages periodically. +/// +/// The channel is bounded with capacity of 1 and never gets disconnected. Messages will be +/// sent into the channel in intervals of `duration`. Each message is the instant at which it is +/// sent. +/// +/// # Examples +/// +/// Using a `tick` channel to periodically print elapsed time: +/// +/// ``` +/// use std::time::{Duration, Instant}; +/// use crossbeam_channel::tick; +/// +/// let start = Instant::now(); +/// let ticker = tick(Duration::from_millis(100)); +/// +/// for _ in 0..5 { +/// ticker.recv().unwrap(); +/// println!("elapsed: {:?}", start.elapsed()); +/// } +/// ``` +/// +/// When messages get sent: +/// +/// ``` +/// use std::thread; +/// use std::time::{Duration, Instant}; +/// use crossbeam_channel::tick; +/// +/// // Converts a number of milliseconds into a `Duration`. +/// let ms = |ms| Duration::from_millis(ms); +/// +/// // Returns `true` if `a` and `b` are very close `Instant`s. +/// let eq = |a, b| a + ms(50) > b && b + ms(50) > a; +/// +/// let start = Instant::now(); +/// let r = tick(ms(100)); +/// +/// // This message was sent 100 ms from the start and received 100 ms from the start. +/// assert!(eq(r.recv().unwrap(), start + ms(100))); +/// assert!(eq(Instant::now(), start + ms(100))); +/// +/// thread::sleep(ms(500)); +/// +/// // This message was sent 200 ms from the start and received 600 ms from the start. +/// assert!(eq(r.recv().unwrap(), start + ms(200))); +/// assert!(eq(Instant::now(), start + ms(600))); +/// +/// // This message was sent 700 ms from the start and received 700 ms from the start. +/// assert!(eq(r.recv().unwrap(), start + ms(700))); +/// assert!(eq(Instant::now(), start + ms(700))); +/// ``` +pub fn tick(duration: Duration) -> Receiver { + Receiver { + flavor: ReceiverFlavor::Tick(Arc::new(flavors::tick::Channel::new(duration))), + } +} + +/// The sending side of a channel. +/// +/// # Examples +/// +/// ``` +/// use std::thread; +/// use crossbeam_channel::unbounded; +/// +/// let (s1, r) = unbounded(); +/// let s2 = s1.clone(); +/// +/// thread::spawn(move || s1.send(1).unwrap()); +/// thread::spawn(move || s2.send(2).unwrap()); +/// +/// let msg1 = r.recv().unwrap(); +/// let msg2 = r.recv().unwrap(); +/// +/// assert_eq!(msg1 + msg2, 3); +/// ``` +pub struct Sender { + flavor: SenderFlavor, +} + +/// Sender flavors. +enum SenderFlavor { + /// Bounded channel based on a preallocated array. + Array(counter::Sender>), + + /// Unbounded channel implemented as a linked list. + List(counter::Sender>), + + /// Zero-capacity channel. + Zero(counter::Sender>), +} + +unsafe impl Send for Sender {} +unsafe impl Sync for Sender {} + +impl UnwindSafe for Sender {} +impl RefUnwindSafe for Sender {} + +impl Sender { + /// Attempts to send a message into the channel without blocking. + /// + /// This method will either send a message into the channel immediately or return an error if + /// the channel is full or disconnected. The returned error contains the original message. + /// + /// If called on a zero-capacity channel, this method will send the message only if there + /// happens to be a receive operation on the other side of the channel at the same time. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::{bounded, TrySendError}; + /// + /// let (s, r) = bounded(1); + /// + /// assert_eq!(s.try_send(1), Ok(())); + /// assert_eq!(s.try_send(2), Err(TrySendError::Full(2))); + /// + /// drop(r); + /// assert_eq!(s.try_send(3), Err(TrySendError::Disconnected(3))); + /// ``` + pub fn try_send(&self, msg: T) -> Result<(), TrySendError> { + match &self.flavor { + SenderFlavor::Array(chan) => chan.try_send(msg), + SenderFlavor::List(chan) => chan.try_send(msg), + SenderFlavor::Zero(chan) => chan.try_send(msg), + } + } + + /// Blocks the current thread until a message is sent or the channel is disconnected. + /// + /// If the channel is full and not disconnected, this call will block until the send operation + /// can proceed. If the channel becomes disconnected, this call will wake up and return an + /// error. The returned error contains the original message. + /// + /// If called on a zero-capacity channel, this method will wait for a receive operation to + /// appear on the other side of the channel. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use std::time::Duration; + /// use crossbeam_channel::{bounded, SendError}; + /// + /// let (s, r) = bounded(1); + /// assert_eq!(s.send(1), Ok(())); + /// + /// thread::spawn(move || { + /// assert_eq!(r.recv(), Ok(1)); + /// thread::sleep(Duration::from_secs(1)); + /// drop(r); + /// }); + /// + /// assert_eq!(s.send(2), Ok(())); + /// assert_eq!(s.send(3), Err(SendError(3))); + /// ``` + pub fn send(&self, msg: T) -> Result<(), SendError> { + match &self.flavor { + SenderFlavor::Array(chan) => chan.send(msg, None), + SenderFlavor::List(chan) => chan.send(msg, None), + SenderFlavor::Zero(chan) => chan.send(msg, None), + }.map_err(|err| match err { + SendTimeoutError::Disconnected(msg) => SendError(msg), + SendTimeoutError::Timeout(_) => unreachable!(), + }) + } + + /// Waits for a message to be sent into the channel, but only for a limited time. + /// + /// If the channel is full and not disconnected, this call will block until the send operation + /// can proceed or the operation times out. If the channel becomes disconnected, this call will + /// wake up and return an error. The returned error contains the original message. + /// + /// If called on a zero-capacity channel, this method will wait for a receive operation to + /// appear on the other side of the channel. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use std::time::Duration; + /// use crossbeam_channel::{bounded, SendTimeoutError}; + /// + /// let (s, r) = bounded(0); + /// + /// thread::spawn(move || { + /// thread::sleep(Duration::from_secs(1)); + /// assert_eq!(r.recv(), Ok(2)); + /// drop(r); + /// }); + /// + /// assert_eq!( + /// s.send_timeout(1, Duration::from_millis(500)), + /// Err(SendTimeoutError::Timeout(1)), + /// ); + /// assert_eq!( + /// s.send_timeout(2, Duration::from_secs(1)), + /// Ok(()), + /// ); + /// assert_eq!( + /// s.send_timeout(3, Duration::from_millis(500)), + /// Err(SendTimeoutError::Disconnected(3)), + /// ); + /// ``` + pub fn send_timeout(&self, msg: T, timeout: Duration) -> Result<(), SendTimeoutError> { + let deadline = Instant::now() + timeout; + + match &self.flavor { + SenderFlavor::Array(chan) => chan.send(msg, Some(deadline)), + SenderFlavor::List(chan) => chan.send(msg, Some(deadline)), + SenderFlavor::Zero(chan) => chan.send(msg, Some(deadline)), + } + } + + /// Returns `true` if the channel is empty. + /// + /// Note: Zero-capacity channels are always empty. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::unbounded; + /// + /// let (s, r) = unbounded(); + /// assert!(s.is_empty()); + /// + /// s.send(0).unwrap(); + /// assert!(!s.is_empty()); + /// ``` + pub fn is_empty(&self) -> bool { + match &self.flavor { + SenderFlavor::Array(chan) => chan.is_empty(), + SenderFlavor::List(chan) => chan.is_empty(), + SenderFlavor::Zero(chan) => chan.is_empty(), + } + } + + /// Returns `true` if the channel is full. + /// + /// Note: Zero-capacity channels are always full. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::bounded; + /// + /// let (s, r) = bounded(1); + /// + /// assert!(!s.is_full()); + /// s.send(0).unwrap(); + /// assert!(s.is_full()); + /// ``` + pub fn is_full(&self) -> bool { + match &self.flavor { + SenderFlavor::Array(chan) => chan.is_full(), + SenderFlavor::List(chan) => chan.is_full(), + SenderFlavor::Zero(chan) => chan.is_full(), + } + } + + /// Returns the number of messages in the channel. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::unbounded; + /// + /// let (s, r) = unbounded(); + /// assert_eq!(s.len(), 0); + /// + /// s.send(1).unwrap(); + /// s.send(2).unwrap(); + /// assert_eq!(s.len(), 2); + /// ``` + pub fn len(&self) -> usize { + match &self.flavor { + SenderFlavor::Array(chan) => chan.len(), + SenderFlavor::List(chan) => chan.len(), + SenderFlavor::Zero(chan) => chan.len(), + } + } + + /// If the channel is bounded, returns its capacity. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::{bounded, unbounded}; + /// + /// let (s, _) = unbounded::(); + /// assert_eq!(s.capacity(), None); + /// + /// let (s, _) = bounded::(5); + /// assert_eq!(s.capacity(), Some(5)); + /// + /// let (s, _) = bounded::(0); + /// assert_eq!(s.capacity(), Some(0)); + /// ``` + pub fn capacity(&self) -> Option { + match &self.flavor { + SenderFlavor::Array(chan) => chan.capacity(), + SenderFlavor::List(chan) => chan.capacity(), + SenderFlavor::Zero(chan) => chan.capacity(), + } + } +} + +impl Drop for Sender { + fn drop(&mut self) { + unsafe { + match &self.flavor { + SenderFlavor::Array(chan) => chan.release(|c| c.disconnect()), + SenderFlavor::List(chan) => chan.release(|c| c.disconnect()), + SenderFlavor::Zero(chan) => chan.release(|c| c.disconnect()), + } + } + } +} + +impl Clone for Sender { + fn clone(&self) -> Self { + let flavor = match &self.flavor { + SenderFlavor::Array(chan) => SenderFlavor::Array(chan.acquire()), + SenderFlavor::List(chan) => SenderFlavor::List(chan.acquire()), + SenderFlavor::Zero(chan) => SenderFlavor::Zero(chan.acquire()), + }; + + Sender { flavor } + } +} + +impl fmt::Debug for Sender { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.pad("Sender { .. }") + } +} + +/// The receiving side of a channel. +/// +/// # Examples +/// +/// ``` +/// use std::thread; +/// use std::time::Duration; +/// use crossbeam_channel::unbounded; +/// +/// let (s, r) = unbounded(); +/// +/// thread::spawn(move || { +/// s.send(1); +/// thread::sleep(Duration::from_secs(1)); +/// s.send(2); +/// }); +/// +/// assert_eq!(r.recv(), Ok(1)); // Received immediately. +/// assert_eq!(r.recv(), Ok(2)); // Received after 1 second. +/// ``` +pub struct Receiver { + flavor: ReceiverFlavor, +} + +/// Receiver flavors. +enum ReceiverFlavor { + /// Bounded channel based on a preallocated array. + Array(counter::Receiver>), + + /// Unbounded channel implemented as a linked list. + List(counter::Receiver>), + + /// Zero-capacity channel. + Zero(counter::Receiver>), + + /// The after flavor. + After(Arc), + + /// The tick flavor. + Tick(Arc), + + /// The never flavor. + Never(flavors::never::Channel), +} + +unsafe impl Send for Receiver {} +unsafe impl Sync for Receiver {} + +impl UnwindSafe for Receiver {} +impl RefUnwindSafe for Receiver {} + +impl Receiver { + /// Attempts to receive a message from the channel without blocking. + /// + /// This method will either receive a message from the channel immediately or return an error + /// if the channel is empty. + /// + /// If called on a zero-capacity channel, this method will receive a message only if there + /// happens to be a send operation on the other side of the channel at the same time. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::{unbounded, TryRecvError}; + /// + /// let (s, r) = unbounded(); + /// assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + /// + /// s.send(5).unwrap(); + /// drop(s); + /// + /// assert_eq!(r.try_recv(), Ok(5)); + /// assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)); + /// ``` + pub fn try_recv(&self) -> Result { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.try_recv(), + ReceiverFlavor::List(chan) => chan.try_recv(), + ReceiverFlavor::Zero(chan) => chan.try_recv(), + ReceiverFlavor::After(chan) => { + let msg = chan.try_recv(); + unsafe { + mem::transmute_copy::, Result>( + &msg, + ) + } + } + ReceiverFlavor::Tick(chan) => { + let msg = chan.try_recv(); + unsafe { + mem::transmute_copy::, Result>( + &msg, + ) + } + } + ReceiverFlavor::Never(chan) => chan.try_recv(), + } + } + + /// Blocks the current thread until a message is received or the channel is empty and + /// disconnected. + /// + /// If the channel is empty and not disconnected, this call will block until the receive + /// operation can proceed. If the channel is empty and becomes disconnected, this call will + /// wake up and return an error. + /// + /// If called on a zero-capacity channel, this method will wait for a send operation to appear + /// on the other side of the channel. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use std::time::Duration; + /// use crossbeam_channel::{unbounded, RecvError}; + /// + /// let (s, r) = unbounded(); + /// + /// thread::spawn(move || { + /// thread::sleep(Duration::from_secs(1)); + /// s.send(5).unwrap(); + /// drop(s); + /// }); + /// + /// assert_eq!(r.recv(), Ok(5)); + /// assert_eq!(r.recv(), Err(RecvError)); + /// ``` + pub fn recv(&self) -> Result { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.recv(None), + ReceiverFlavor::List(chan) => chan.recv(None), + ReceiverFlavor::Zero(chan) => chan.recv(None), + ReceiverFlavor::After(chan) => { + let msg = chan.recv(None); + unsafe { + mem::transmute_copy::< + Result, + Result, + >(&msg) + } + } + ReceiverFlavor::Tick(chan) => { + let msg = chan.recv(None); + unsafe { + mem::transmute_copy::< + Result, + Result, + >(&msg) + } + } + ReceiverFlavor::Never(chan) => chan.recv(None), + }.map_err(|_| RecvError) + } + + /// Waits for a message to be received from the channel, but only for a limited time. + /// + /// If the channel is empty and not disconnected, this call will block until the receive + /// operation can proceed or the operation times out. If the channel is empty and becomes + /// disconnected, this call will wake up and return an error. + /// + /// If called on a zero-capacity channel, this method will wait for a send operation to appear + /// on the other side of the channel. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use std::time::Duration; + /// use crossbeam_channel::{unbounded, RecvTimeoutError}; + /// + /// let (s, r) = unbounded(); + /// + /// thread::spawn(move || { + /// thread::sleep(Duration::from_secs(1)); + /// s.send(5).unwrap(); + /// drop(s); + /// }); + /// + /// assert_eq!( + /// r.recv_timeout(Duration::from_millis(500)), + /// Err(RecvTimeoutError::Timeout), + /// ); + /// assert_eq!( + /// r.recv_timeout(Duration::from_secs(1)), + /// Ok(5), + /// ); + /// assert_eq!( + /// r.recv_timeout(Duration::from_secs(1)), + /// Err(RecvTimeoutError::Disconnected), + /// ); + /// ``` + pub fn recv_timeout(&self, timeout: Duration) -> Result { + let deadline = Instant::now() + timeout; + + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.recv(Some(deadline)), + ReceiverFlavor::List(chan) => chan.recv(Some(deadline)), + ReceiverFlavor::Zero(chan) => chan.recv(Some(deadline)), + ReceiverFlavor::After(chan) => { + let msg = chan.recv(Some(deadline)); + unsafe { + mem::transmute_copy::< + Result, + Result, + >(&msg) + } + } + ReceiverFlavor::Tick(chan) => { + let msg = chan.recv(Some(deadline)); + unsafe { + mem::transmute_copy::< + Result, + Result, + >(&msg) + } + } + ReceiverFlavor::Never(chan) => chan.recv(Some(deadline)), + } + } + + /// Returns `true` if the channel is empty. + /// + /// Note: Zero-capacity channels are always empty. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::unbounded; + /// + /// let (s, r) = unbounded(); + /// + /// assert!(r.is_empty()); + /// s.send(0).unwrap(); + /// assert!(!r.is_empty()); + /// ``` + pub fn is_empty(&self) -> bool { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.is_empty(), + ReceiverFlavor::List(chan) => chan.is_empty(), + ReceiverFlavor::Zero(chan) => chan.is_empty(), + ReceiverFlavor::After(chan) => chan.is_empty(), + ReceiverFlavor::Tick(chan) => chan.is_empty(), + ReceiverFlavor::Never(chan) => chan.is_empty(), + } + } + + /// Returns `true` if the channel is full. + /// + /// Note: Zero-capacity channels are always full. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::bounded; + /// + /// let (s, r) = bounded(1); + /// + /// assert!(!r.is_full()); + /// s.send(0).unwrap(); + /// assert!(r.is_full()); + /// ``` + pub fn is_full(&self) -> bool { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.is_full(), + ReceiverFlavor::List(chan) => chan.is_full(), + ReceiverFlavor::Zero(chan) => chan.is_full(), + ReceiverFlavor::After(chan) => chan.is_full(), + ReceiverFlavor::Tick(chan) => chan.is_full(), + ReceiverFlavor::Never(chan) => chan.is_full(), + } + } + + /// Returns the number of messages in the channel. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::unbounded; + /// + /// let (s, r) = unbounded(); + /// assert_eq!(r.len(), 0); + /// + /// s.send(1).unwrap(); + /// s.send(2).unwrap(); + /// assert_eq!(r.len(), 2); + /// ``` + pub fn len(&self) -> usize { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.len(), + ReceiverFlavor::List(chan) => chan.len(), + ReceiverFlavor::Zero(chan) => chan.len(), + ReceiverFlavor::After(chan) => chan.len(), + ReceiverFlavor::Tick(chan) => chan.len(), + ReceiverFlavor::Never(chan) => chan.len(), + } + } + + /// If the channel is bounded, returns its capacity. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::{bounded, unbounded}; + /// + /// let (_, r) = unbounded::(); + /// assert_eq!(r.capacity(), None); + /// + /// let (_, r) = bounded::(5); + /// assert_eq!(r.capacity(), Some(5)); + /// + /// let (_, r) = bounded::(0); + /// assert_eq!(r.capacity(), Some(0)); + /// ``` + pub fn capacity(&self) -> Option { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.capacity(), + ReceiverFlavor::List(chan) => chan.capacity(), + ReceiverFlavor::Zero(chan) => chan.capacity(), + ReceiverFlavor::After(chan) => chan.capacity(), + ReceiverFlavor::Tick(chan) => chan.capacity(), + ReceiverFlavor::Never(chan) => chan.capacity(), + } + } + + /// A blocking iterator over messages in the channel. + /// + /// Each call to [`next`] blocks waiting for the next message and then returns it. However, if + /// the channel becomes empty and disconnected, it returns [`None`] without blocking. + /// + /// [`next`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.next + /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use crossbeam_channel::unbounded; + /// + /// let (s, r) = unbounded(); + /// + /// thread::spawn(move || { + /// s.send(1).unwrap(); + /// s.send(2).unwrap(); + /// s.send(3).unwrap(); + /// drop(s); // Disconnect the channel. + /// }); + /// + /// // Collect all messages from the channel. + /// // Note that the call to `collect` blocks until the sender is dropped. + /// let v: Vec<_> = r.iter().collect(); + /// + /// assert_eq!(v, [1, 2, 3]); + /// ``` + pub fn iter(&self) -> Iter { + Iter { receiver: self } + } + + /// A non-blocking iterator over messages in the channel. + /// + /// Each call to [`next`] returns a message if there is one ready to be received. The iterator + /// never blocks waiting for the next message. + /// + /// [`next`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.next + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use std::time::Duration; + /// use crossbeam_channel::unbounded; + /// + /// let (s, r) = unbounded::(); + /// + /// thread::spawn(move || { + /// s.send(1).unwrap(); + /// thread::sleep(Duration::from_secs(1)); + /// s.send(2).unwrap(); + /// thread::sleep(Duration::from_secs(2)); + /// s.send(3).unwrap(); + /// }); + /// + /// thread::sleep(Duration::from_secs(2)); + /// + /// // Collect all messages from the channel without blocking. + /// // The third message hasn't been sent yet so we'll collect only the first two. + /// let v: Vec<_> = r.try_iter().collect(); + /// + /// assert_eq!(v, [1, 2]); + /// ``` + pub fn try_iter(&self) -> TryIter { + TryIter { receiver: self } + } +} + +impl Drop for Receiver { + fn drop(&mut self) { + unsafe { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.release(|c| c.disconnect()), + ReceiverFlavor::List(chan) => chan.release(|c| c.disconnect()), + ReceiverFlavor::Zero(chan) => chan.release(|c| c.disconnect()), + ReceiverFlavor::After(_) => {}, + ReceiverFlavor::Tick(_) => {}, + ReceiverFlavor::Never(_) => {}, + } + } + } +} + +impl Clone for Receiver { + fn clone(&self) -> Self { + let flavor = match &self.flavor { + ReceiverFlavor::Array(chan) => ReceiverFlavor::Array(chan.acquire()), + ReceiverFlavor::List(chan) => ReceiverFlavor::List(chan.acquire()), + ReceiverFlavor::Zero(chan) => ReceiverFlavor::Zero(chan.acquire()), + ReceiverFlavor::After(chan) => ReceiverFlavor::After(chan.clone()), + ReceiverFlavor::Tick(chan) => ReceiverFlavor::Tick(chan.clone()), + ReceiverFlavor::Never(_) => ReceiverFlavor::Never(flavors::never::Channel::new()), + }; + + Receiver { flavor } + } +} + +impl fmt::Debug for Receiver { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.pad("Receiver { .. }") + } +} + +impl<'a, T> IntoIterator for &'a Receiver { + type Item = T; + type IntoIter = Iter<'a, T>; + + fn into_iter(self) -> Self::IntoIter { + self.iter() + } +} + +impl IntoIterator for Receiver { + type Item = T; + type IntoIter = IntoIter; + + fn into_iter(self) -> Self::IntoIter { + IntoIter { receiver: self } + } +} + +/// A blocking iterator over messages in a channel. +/// +/// Each call to [`next`] blocks waiting for the next message and then returns it. However, if the +/// channel becomes empty and disconnected, it returns [`None`] without blocking. +/// +/// [`next`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.next +/// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None +/// +/// # Examples +/// +/// ``` +/// use std::thread; +/// use crossbeam_channel::unbounded; +/// +/// let (s, r) = unbounded(); +/// +/// thread::spawn(move || { +/// s.send(1).unwrap(); +/// s.send(2).unwrap(); +/// s.send(3).unwrap(); +/// drop(s); // Disconnect the channel. +/// }); +/// +/// // Collect all messages from the channel. +/// // Note that the call to `collect` blocks until the sender is dropped. +/// let v: Vec<_> = r.iter().collect(); +/// +/// assert_eq!(v, [1, 2, 3]); +/// ``` +pub struct Iter<'a, T: 'a> { + receiver: &'a Receiver, +} + +impl<'a, T> FusedIterator for Iter<'a, T> {} + +impl<'a, T> Iterator for Iter<'a, T> { + type Item = T; + + fn next(&mut self) -> Option { + self.receiver.recv().ok() + } +} + +impl<'a, T> fmt::Debug for Iter<'a, T> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.pad("Iter { .. }") + } +} + +/// A non-blocking iterator over messages in a channel. +/// +/// Each call to [`next`] returns a message if there is one ready to be received. The iterator +/// never blocks waiting for the next message. +/// +/// [`next`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.next +/// +/// # Examples +/// +/// ``` +/// use std::thread; +/// use std::time::Duration; +/// use crossbeam_channel::unbounded; +/// +/// let (s, r) = unbounded::(); +/// +/// thread::spawn(move || { +/// s.send(1).unwrap(); +/// thread::sleep(Duration::from_secs(1)); +/// s.send(2).unwrap(); +/// thread::sleep(Duration::from_secs(2)); +/// s.send(3).unwrap(); +/// }); +/// +/// thread::sleep(Duration::from_secs(2)); +/// +/// // Collect all messages from the channel without blocking. +/// // The third message hasn't been sent yet so we'll collect only the first two. +/// let v: Vec<_> = r.try_iter().collect(); +/// +/// assert_eq!(v, [1, 2]); +/// ``` +pub struct TryIter<'a, T: 'a> { + receiver: &'a Receiver, +} + +impl<'a, T> Iterator for TryIter<'a, T> { + type Item = T; + + fn next(&mut self) -> Option { + self.receiver.try_recv().ok() + } +} + +impl<'a, T> fmt::Debug for TryIter<'a, T> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.pad("TryIter { .. }") + } +} + +/// A blocking iterator over messages in a channel. +/// +/// Each call to [`next`] blocks waiting for the next message and then returns it. However, if the +/// channel becomes empty and disconnected, it returns [`None`] without blocking. +/// +/// [`next`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.next +/// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None +/// +/// # Examples +/// +/// ``` +/// use std::thread; +/// use crossbeam_channel::unbounded; +/// +/// let (s, r) = unbounded(); +/// +/// thread::spawn(move || { +/// s.send(1).unwrap(); +/// s.send(2).unwrap(); +/// s.send(3).unwrap(); +/// drop(s); // Disconnect the channel. +/// }); +/// +/// // Collect all messages from the channel. +/// // Note that the call to `collect` blocks until the sender is dropped. +/// let v: Vec<_> = r.into_iter().collect(); +/// +/// assert_eq!(v, [1, 2, 3]); +/// ``` +pub struct IntoIter { + receiver: Receiver, +} + +impl FusedIterator for IntoIter {} + +impl Iterator for IntoIter { + type Item = T; + + fn next(&mut self) -> Option { + self.receiver.recv().ok() + } +} + +impl fmt::Debug for IntoIter { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.pad("IntoIter { .. }") + } +} + +impl SelectHandle for Sender { + fn try_select(&self, token: &mut Token) -> bool { + match &self.flavor { + SenderFlavor::Array(chan) => chan.sender().try_select(token), + SenderFlavor::List(chan) => chan.sender().try_select(token), + SenderFlavor::Zero(chan) => chan.sender().try_select(token), + } + } + + fn deadline(&self) -> Option { + None + } + + fn register(&self, oper: Operation, cx: &Context) -> bool { + match &self.flavor { + SenderFlavor::Array(chan) => chan.sender().register(oper, cx), + SenderFlavor::List(chan) => chan.sender().register(oper, cx), + SenderFlavor::Zero(chan) => chan.sender().register(oper, cx), + } + } + + fn unregister(&self, oper: Operation) { + match &self.flavor { + SenderFlavor::Array(chan) => chan.sender().unregister(oper), + SenderFlavor::List(chan) => chan.sender().unregister(oper), + SenderFlavor::Zero(chan) => chan.sender().unregister(oper), + } + } + + fn accept(&self, token: &mut Token, cx: &Context) -> bool { + match &self.flavor { + SenderFlavor::Array(chan) => chan.sender().accept(token, cx), + SenderFlavor::List(chan) => chan.sender().accept(token, cx), + SenderFlavor::Zero(chan) => chan.sender().accept(token, cx), + } + } + + fn is_ready(&self) -> bool { + match &self.flavor { + SenderFlavor::Array(chan) => chan.sender().is_ready(), + SenderFlavor::List(chan) => chan.sender().is_ready(), + SenderFlavor::Zero(chan) => chan.sender().is_ready(), + } + } + + fn watch(&self, oper: Operation, cx: &Context) -> bool { + match &self.flavor { + SenderFlavor::Array(chan) => chan.sender().watch(oper, cx), + SenderFlavor::List(chan) => chan.sender().watch(oper, cx), + SenderFlavor::Zero(chan) => chan.sender().watch(oper, cx), + } + } + + fn unwatch(&self, oper: Operation) { + match &self.flavor { + SenderFlavor::Array(chan) => chan.sender().unwatch(oper), + SenderFlavor::List(chan) => chan.sender().unwatch(oper), + SenderFlavor::Zero(chan) => chan.sender().unwatch(oper), + } + } +} + +impl SelectHandle for Receiver { + fn try_select(&self, token: &mut Token) -> bool { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.receiver().try_select(token), + ReceiverFlavor::List(chan) => chan.receiver().try_select(token), + ReceiverFlavor::Zero(chan) => chan.receiver().try_select(token), + ReceiverFlavor::After(chan) => chan.try_select(token), + ReceiverFlavor::Tick(chan) => chan.try_select(token), + ReceiverFlavor::Never(chan) => chan.try_select(token), + } + } + + fn deadline(&self) -> Option { + match &self.flavor { + ReceiverFlavor::Array(_) => None, + ReceiverFlavor::List(_) => None, + ReceiverFlavor::Zero(_) => None, + ReceiverFlavor::After(chan) => chan.deadline(), + ReceiverFlavor::Tick(chan) => chan.deadline(), + ReceiverFlavor::Never(chan) => chan.deadline(), + } + } + + fn register(&self, oper: Operation, cx: &Context) -> bool { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.receiver().register(oper, cx), + ReceiverFlavor::List(chan) => chan.receiver().register(oper, cx), + ReceiverFlavor::Zero(chan) => chan.receiver().register(oper, cx), + ReceiverFlavor::After(chan) => chan.register(oper, cx), + ReceiverFlavor::Tick(chan) => chan.register(oper, cx), + ReceiverFlavor::Never(chan) => chan.register(oper, cx), + } + } + + fn unregister(&self, oper: Operation) { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.receiver().unregister(oper), + ReceiverFlavor::List(chan) => chan.receiver().unregister(oper), + ReceiverFlavor::Zero(chan) => chan.receiver().unregister(oper), + ReceiverFlavor::After(chan) => chan.unregister(oper), + ReceiverFlavor::Tick(chan) => chan.unregister(oper), + ReceiverFlavor::Never(chan) => chan.unregister(oper), + } + } + + fn accept(&self, token: &mut Token, cx: &Context) -> bool { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.receiver().accept(token, cx), + ReceiverFlavor::List(chan) => chan.receiver().accept(token, cx), + ReceiverFlavor::Zero(chan) => chan.receiver().accept(token, cx), + ReceiverFlavor::After(chan) => chan.accept(token, cx), + ReceiverFlavor::Tick(chan) => chan.accept(token, cx), + ReceiverFlavor::Never(chan) => chan.accept(token, cx), + } + } + + fn is_ready(&self) -> bool { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.receiver().is_ready(), + ReceiverFlavor::List(chan) => chan.receiver().is_ready(), + ReceiverFlavor::Zero(chan) => chan.receiver().is_ready(), + ReceiverFlavor::After(chan) => chan.is_ready(), + ReceiverFlavor::Tick(chan) => chan.is_ready(), + ReceiverFlavor::Never(chan) => chan.is_ready(), + } + } + + fn watch(&self, oper: Operation, cx: &Context) -> bool { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.receiver().watch(oper, cx), + ReceiverFlavor::List(chan) => chan.receiver().watch(oper, cx), + ReceiverFlavor::Zero(chan) => chan.receiver().watch(oper, cx), + ReceiverFlavor::After(chan) => chan.watch(oper, cx), + ReceiverFlavor::Tick(chan) => chan.watch(oper, cx), + ReceiverFlavor::Never(chan) => chan.watch(oper, cx), + } + } + + fn unwatch(&self, oper: Operation) { + match &self.flavor { + ReceiverFlavor::Array(chan) => chan.receiver().unwatch(oper), + ReceiverFlavor::List(chan) => chan.receiver().unwatch(oper), + ReceiverFlavor::Zero(chan) => chan.receiver().unwatch(oper), + ReceiverFlavor::After(chan) => chan.unwatch(oper), + ReceiverFlavor::Tick(chan) => chan.unwatch(oper), + ReceiverFlavor::Never(chan) => chan.unwatch(oper), + } + } +} + +/// Writes a message into the channel. +pub unsafe fn write(s: &Sender, token: &mut Token, msg: T) -> Result<(), T> { + match &s.flavor { + SenderFlavor::Array(chan) => chan.write(token, msg), + SenderFlavor::List(chan) => chan.write(token, msg), + SenderFlavor::Zero(chan) => chan.write(token, msg), + } +} + +/// Reads a message from the channel. +pub unsafe fn read(r: &Receiver, token: &mut Token) -> Result { + match &r.flavor { + ReceiverFlavor::Array(chan) => chan.read(token), + ReceiverFlavor::List(chan) => chan.read(token), + ReceiverFlavor::Zero(chan) => chan.read(token), + ReceiverFlavor::After(chan) => { + mem::transmute_copy::, Result>(&chan.read(token)) + } + ReceiverFlavor::Tick(chan) => { + mem::transmute_copy::, Result>(&chan.read(token)) + } + ReceiverFlavor::Never(chan) => chan.read(token), + } +} diff --git a/vendor/crossbeam-channel/src/context.rs b/vendor/crossbeam-channel/src/context.rs new file mode 100644 index 0000000000..cd1613ab6e --- /dev/null +++ b/vendor/crossbeam-channel/src/context.rs @@ -0,0 +1,189 @@ +//! Thread-local context used in select. + +use std::cell::Cell; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; +use std::thread::{self, Thread, ThreadId}; +use std::time::Instant; + +use crossbeam_utils::Backoff; + +use select::Selected; + +/// Thread-local context used in select. +#[derive(Clone)] +pub struct Context { + inner: Arc, +} + +/// Inner representation of `Context`. +struct Inner { + /// Selected operation. + select: AtomicUsize, + + /// A slot into which another thread may store a pointer to its `Packet`. + packet: AtomicUsize, + + /// Thread handle. + thread: Thread, + + /// Thread id. + thread_id: ThreadId, +} + +impl Context { + /// Creates a new context for the duration of the closure. + #[inline] + pub fn with(f: F) -> R + where + F: FnOnce(&Context) -> R, + { + thread_local! { + /// Cached thread-local context. + static CONTEXT: Cell> = Cell::new(Some(Context::new())); + } + + let mut f = Some(f); + let mut f = move |cx: &Context| -> R { + let f = f.take().unwrap(); + f(cx) + }; + + CONTEXT + .try_with(|cell| match cell.take() { + None => f(&Context::new()), + Some(cx) => { + cx.reset(); + let res = f(&cx); + cell.set(Some(cx)); + res + } + }).unwrap_or_else(|_| f(&Context::new())) + } + + /// Creates a new `Context`. + #[cold] + fn new() -> Context { + Context { + inner: Arc::new(Inner { + select: AtomicUsize::new(Selected::Waiting.into()), + packet: AtomicUsize::new(0), + thread: thread::current(), + thread_id: thread::current().id(), + }), + } + } + + /// Resets `select` and `packet`. + #[inline] + fn reset(&self) { + self.inner + .select + .store(Selected::Waiting.into(), Ordering::Release); + self.inner.packet.store(0, Ordering::Release); + } + + /// Attempts to select an operation. + /// + /// On failure, the previously selected operation is returned. + #[inline] + pub fn try_select(&self, select: Selected) -> Result<(), Selected> { + self.inner + .select + .compare_exchange( + Selected::Waiting.into(), + select.into(), + Ordering::AcqRel, + Ordering::Acquire, + ) + .map(|_| ()) + .map_err(|e| e.into()) + } + + /// Returns the selected operation. + #[inline] + pub fn selected(&self) -> Selected { + Selected::from(self.inner.select.load(Ordering::Acquire)) + } + + /// Stores a packet. + /// + /// This method must be called after `try_select` succeeds and there is a packet to provide. + #[inline] + pub fn store_packet(&self, packet: usize) { + if packet != 0 { + self.inner.packet.store(packet, Ordering::Release); + } + } + + /// Waits until a packet is provided and returns it. + #[inline] + pub fn wait_packet(&self) -> usize { + let backoff = Backoff::new(); + loop { + let packet = self.inner.packet.load(Ordering::Acquire); + if packet != 0 { + return packet; + } + backoff.snooze(); + } + } + + /// Waits until an operation is selected and returns it. + /// + /// If the deadline is reached, `Selected::Aborted` will be selected. + #[inline] + pub fn wait_until(&self, deadline: Option) -> Selected { + // Spin for a short time, waiting until an operation is selected. + let backoff = Backoff::new(); + loop { + let sel = Selected::from(self.inner.select.load(Ordering::Acquire)); + if sel != Selected::Waiting { + return sel; + } + + if backoff.is_completed() { + break; + } else { + backoff.snooze(); + } + } + + loop { + // Check whether an operation has been selected. + let sel = Selected::from(self.inner.select.load(Ordering::Acquire)); + if sel != Selected::Waiting { + return sel; + } + + // If there's a deadline, park the current thread until the deadline is reached. + if let Some(end) = deadline { + let now = Instant::now(); + + if now < end { + thread::park_timeout(end - now); + } else { + // The deadline has been reached. Try aborting select. + return match self.try_select(Selected::Aborted) { + Ok(()) => Selected::Aborted, + Err(s) => s, + }; + } + } else { + thread::park(); + } + } + } + + /// Unparks the thread this context belongs to. + #[inline] + pub fn unpark(&self) { + self.inner.thread.unpark(); + } + + /// Returns the id of the thread this context belongs to. + #[inline] + pub fn thread_id(&self) -> ThreadId { + self.inner.thread_id + } +} diff --git a/vendor/crossbeam-channel/src/counter.rs b/vendor/crossbeam-channel/src/counter.rs new file mode 100644 index 0000000000..1d76480fd2 --- /dev/null +++ b/vendor/crossbeam-channel/src/counter.rs @@ -0,0 +1,132 @@ +///! Reference counter for channels. + +use std::isize; +use std::ops; +use std::process; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; + +/// Reference counter internals. +struct Counter { + /// The number of senders associated with the channel. + senders: AtomicUsize, + + /// The number of receivers associated with the channel. + receivers: AtomicUsize, + + /// If `true`, either the sending or receiving side has been dropped. + disconnected: AtomicBool, + + /// The internal channel. + chan: C, +} + +/// Wraps a channel into the reference counter. +pub fn new(chan: C) -> (Sender, Receiver) { + let counter = Box::into_raw(Box::new(Counter { + senders: AtomicUsize::new(1), + receivers: AtomicUsize::new(1), + disconnected: AtomicBool::new(false), + chan, + })); + let s = Sender { counter }; + let r = Receiver { counter }; + (s, r) +} + +/// The sending side. +pub struct Sender { + counter: *mut Counter, +} + +impl Sender { + /// Returns the internal `Counter`. + fn counter(&self) -> &Counter { + unsafe { &*self.counter } + } + + /// Acquires another sender reference. + pub fn acquire(&self) -> Sender { + let count = self.counter().senders.fetch_add(1, Ordering::Relaxed); + + // Cloning senders and calling `mem::forget` on the clones could potentially overflow the + // counter. It's very difficult to recover sensibly from such degenerate scenarios so we + // just abort when the count becomes very large. + if count > isize::MAX as usize { + process::abort(); + } + + Sender { + counter: self.counter, + } + } + + /// Releases the sender reference. + /// + /// Function `f` will be called if this is the last sender reference. + pub unsafe fn release(&self, f: F) { + if self.counter().senders.fetch_sub(1, Ordering::AcqRel) == 1 { + f(&self.counter().chan); + + if self.counter().disconnected.swap(true, Ordering::AcqRel) { + drop(Box::from_raw(self.counter)); + } + } + } +} + +impl ops::Deref for Sender { + type Target = C; + + fn deref(&self) -> &C { + &self.counter().chan + } +} + +/// The receiving side. +pub struct Receiver { + counter: *mut Counter, +} + +impl Receiver { + /// Returns the internal `Counter`. + fn counter(&self) -> &Counter { + unsafe { &*self.counter } + } + + /// Acquires another receiver reference. + pub fn acquire(&self) -> Receiver { + let count = self.counter().receivers.fetch_add(1, Ordering::Relaxed); + + // Cloning receivers and calling `mem::forget` on the clones could potentially overflow the + // counter. It's very difficult to recover sensibly from such degenerate scenarios so we + // just abort when the count becomes very large. + if count > isize::MAX as usize { + process::abort(); + } + + Receiver { + counter: self.counter, + } + } + + /// Releases the receiver reference. + /// + /// Function `f` will be called if this is the last receiver reference. + pub unsafe fn release(&self, f: F) { + if self.counter().receivers.fetch_sub(1, Ordering::AcqRel) == 1 { + f(&self.counter().chan); + + if self.counter().disconnected.swap(true, Ordering::AcqRel) { + drop(Box::from_raw(self.counter)); + } + } + } +} + +impl ops::Deref for Receiver { + type Target = C; + + fn deref(&self) -> &C { + &self.counter().chan + } +} diff --git a/vendor/crossbeam-channel/src/err.rs b/vendor/crossbeam-channel/src/err.rs new file mode 100644 index 0000000000..02c7d44f4e --- /dev/null +++ b/vendor/crossbeam-channel/src/err.rs @@ -0,0 +1,451 @@ +use std::error; +use std::fmt; + +/// An error returned from the [`send`] method. +/// +/// The message could not be sent because the channel is disconnected. +/// +/// The error contains the message so it can be recovered. +/// +/// [`send`]: struct.Sender.html#method.send +#[derive(PartialEq, Eq, Clone, Copy)] +pub struct SendError(pub T); + +/// An error returned from the [`try_send`] method. +/// +/// The error contains the message being sent so it can be recovered. +/// +/// [`try_send`]: struct.Sender.html#method.try_send +#[derive(PartialEq, Eq, Clone, Copy)] +pub enum TrySendError { + /// The message could not be sent because the channel is full. + /// + /// If this is a zero-capacity channel, then the error indicates that there was no receiver + /// available to receive the message at the time. + Full(T), + + /// The message could not be sent because the channel is disconnected. + Disconnected(T), +} + +/// An error returned from the [`send_timeout`] method. +/// +/// The error contains the message being sent so it can be recovered. +/// +/// [`send_timeout`]: struct.Sender.html#method.send_timeout +#[derive(PartialEq, Eq, Clone, Copy)] +pub enum SendTimeoutError { + /// The message could not be sent because the channel is full and the operation timed out. + /// + /// If this is a zero-capacity channel, then the error indicates that there was no receiver + /// available to receive the message and the operation timed out. + Timeout(T), + + /// The message could not be sent because the channel is disconnected. + Disconnected(T), +} + +/// An error returned from the [`recv`] method. +/// +/// A message could not be received because the channel is empty and disconnected. +/// +/// [`recv`]: struct.Receiver.html#method.recv +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +pub struct RecvError; + +/// An error returned from the [`try_recv`] method. +/// +/// [`try_recv`]: struct.Receiver.html#method.recv +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +pub enum TryRecvError { + /// A message could not be received because the channel is empty. + /// + /// If this is a zero-capacity channel, then the error indicates that there was no sender + /// available to send a message at the time. + Empty, + + /// The message could not be received because the channel is empty and disconnected. + Disconnected, +} + +/// An error returned from the [`recv_timeout`] method. +/// +/// [`recv_timeout`]: struct.Receiver.html#method.recv_timeout +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +pub enum RecvTimeoutError { + /// A message could not be received because the channel is empty and the operation timed out. + /// + /// If this is a zero-capacity channel, then the error indicates that there was no sender + /// available to send a message and the operation timed out. + Timeout, + + /// The message could not be received because the channel is empty and disconnected. + Disconnected, +} + +/// An error returned from the [`try_select`] method. +/// +/// Failed because none of the channel operations were ready. +/// +/// [`try_select`]: struct.Select.html#method.try_select +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +pub struct TrySelectError; + +/// An error returned from the [`select_timeout`] method. +/// +/// Failed because none of the channel operations became ready before the timeout. +/// +/// [`select_timeout`]: struct.Select.html#method.select_timeout +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +pub struct SelectTimeoutError; + +/// An error returned from the [`try_ready`] method. +/// +/// Failed because none of the channel operations were ready. +/// +/// [`try_ready`]: struct.Select.html#method.try_ready +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +pub struct TryReadyError; + +/// An error returned from the [`ready_timeout`] method. +/// +/// Failed because none of the channel operations became ready before the timeout. +/// +/// [`ready_timeout`]: struct.Select.html#method.ready_timeout +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +pub struct ReadyTimeoutError; + +impl fmt::Debug for SendError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + "SendError(..)".fmt(f) + } +} + +impl fmt::Display for SendError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + "sending on a disconnected channel".fmt(f) + } +} + +impl error::Error for SendError { + fn description(&self) -> &str { + "sending on a disconnected channel" + } + + fn cause(&self) -> Option<&error::Error> { + None + } +} + +impl SendError { + /// Unwraps the message. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::unbounded; + /// + /// let (s, r) = unbounded(); + /// drop(r); + /// + /// if let Err(err) = s.send("foo") { + /// assert_eq!(err.into_inner(), "foo"); + /// } + /// ``` + pub fn into_inner(self) -> T { + self.0 + } +} + +impl fmt::Debug for TrySendError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + TrySendError::Full(..) => "Full(..)".fmt(f), + TrySendError::Disconnected(..) => "Disconnected(..)".fmt(f), + } + } +} + +impl fmt::Display for TrySendError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + TrySendError::Full(..) => "sending on a full channel".fmt(f), + TrySendError::Disconnected(..) => "sending on a disconnected channel".fmt(f), + } + } +} + +impl error::Error for TrySendError { + fn description(&self) -> &str { + match *self { + TrySendError::Full(..) => "sending on a full channel", + TrySendError::Disconnected(..) => "sending on a disconnected channel", + } + } + + fn cause(&self) -> Option<&error::Error> { + None + } +} + +impl From> for TrySendError { + fn from(err: SendError) -> TrySendError { + match err { + SendError(t) => TrySendError::Disconnected(t), + } + } +} + +impl TrySendError { + /// Unwraps the message. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::bounded; + /// + /// let (s, r) = bounded(0); + /// + /// if let Err(err) = s.try_send("foo") { + /// assert_eq!(err.into_inner(), "foo"); + /// } + /// ``` + pub fn into_inner(self) -> T { + match self { + TrySendError::Full(v) => v, + TrySendError::Disconnected(v) => v, + } + } + + /// Returns `true` if the send operation failed because the channel is full. + pub fn is_full(&self) -> bool { + match self { + TrySendError::Full(_) => true, + _ => false, + } + } + + /// Returns `true` if the send operation failed because the channel is disconnected. + pub fn is_disconnected(&self) -> bool { + match self { + TrySendError::Disconnected(_) => true, + _ => false, + } + } +} + +impl fmt::Debug for SendTimeoutError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + "SendTimeoutError(..)".fmt(f) + } +} + +impl fmt::Display for SendTimeoutError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + SendTimeoutError::Timeout(..) => "timed out waiting on send operation".fmt(f), + SendTimeoutError::Disconnected(..) => "sending on a disconnected channel".fmt(f), + } + } +} + +impl error::Error for SendTimeoutError { + fn description(&self) -> &str { + "sending on an empty and disconnected channel" + } + + fn cause(&self) -> Option<&error::Error> { + None + } +} + +impl From> for SendTimeoutError { + fn from(err: SendError) -> SendTimeoutError { + match err { + SendError(e) => SendTimeoutError::Disconnected(e), + } + } +} + +impl SendTimeoutError { + /// Unwraps the message. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use crossbeam_channel::unbounded; + /// + /// let (s, r) = unbounded(); + /// + /// if let Err(err) = s.send_timeout("foo", Duration::from_secs(1)) { + /// assert_eq!(err.into_inner(), "foo"); + /// } + /// ``` + pub fn into_inner(self) -> T { + match self { + SendTimeoutError::Timeout(v) => v, + SendTimeoutError::Disconnected(v) => v, + } + } + + /// Returns `true` if the send operation timed out. + pub fn is_timeout(&self) -> bool { + match self { + SendTimeoutError::Timeout(_) => true, + _ => false, + } + } + + /// Returns `true` if the send operation failed because the channel is disconnected. + pub fn is_disconnected(&self) -> bool { + match self { + SendTimeoutError::Disconnected(_) => true, + _ => false, + } + } +} + +impl fmt::Display for RecvError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + "receiving on an empty and disconnected channel".fmt(f) + } +} + +impl error::Error for RecvError { + fn description(&self) -> &str { + "receiving on an empty and disconnected channel" + } + + fn cause(&self) -> Option<&error::Error> { + None + } +} + +impl fmt::Display for TryRecvError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + TryRecvError::Empty => "receiving on an empty channel".fmt(f), + TryRecvError::Disconnected => "receiving on an empty and disconnected channel".fmt(f), + } + } +} + +impl error::Error for TryRecvError { + fn description(&self) -> &str { + match *self { + TryRecvError::Empty => "receiving on an empty channel", + TryRecvError::Disconnected => "receiving on an empty and disconnected channel", + } + } + + fn cause(&self) -> Option<&error::Error> { + None + } +} + +impl From for TryRecvError { + fn from(err: RecvError) -> TryRecvError { + match err { + RecvError => TryRecvError::Disconnected, + } + } +} + +impl TryRecvError { + /// Returns `true` if the receive operation failed because the channel is empty. + pub fn is_empty(&self) -> bool { + match self { + TryRecvError::Empty => true, + _ => false, + } + } + + /// Returns `true` if the receive operation failed because the channel is disconnected. + pub fn is_disconnected(&self) -> bool { + match self { + TryRecvError::Disconnected => true, + _ => false, + } + } +} + +impl fmt::Display for RecvTimeoutError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + RecvTimeoutError::Timeout => "timed out waiting on receive operation".fmt(f), + RecvTimeoutError::Disconnected => "channel is empty and disconnected".fmt(f), + } + } +} + +impl error::Error for RecvTimeoutError { + fn description(&self) -> &str { + match *self { + RecvTimeoutError::Timeout => "timed out waiting on receive operation", + RecvTimeoutError::Disconnected => "channel is empty and disconnected", + } + } + + fn cause(&self) -> Option<&error::Error> { + None + } +} + +impl From for RecvTimeoutError { + fn from(err: RecvError) -> RecvTimeoutError { + match err { + RecvError => RecvTimeoutError::Disconnected, + } + } +} + +impl RecvTimeoutError { + /// Returns `true` if the receive operation timed out. + pub fn is_timeout(&self) -> bool { + match self { + RecvTimeoutError::Timeout => true, + _ => false, + } + } + + /// Returns `true` if the receive operation failed because the channel is disconnected. + pub fn is_disconnected(&self) -> bool { + match self { + RecvTimeoutError::Disconnected => true, + _ => false, + } + } +} + +impl fmt::Display for TrySelectError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + "all operations in select would block".fmt(f) + } +} + +impl error::Error for TrySelectError { + fn description(&self) -> &str { + "all operations in select would block" + } + + fn cause(&self) -> Option<&error::Error> { + None + } +} + +impl fmt::Display for SelectTimeoutError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + "timed out waiting on select".fmt(f) + } +} + +impl error::Error for SelectTimeoutError { + fn description(&self) -> &str { + "timed out waiting on select" + } + + fn cause(&self) -> Option<&error::Error> { + None + } +} diff --git a/vendor/crossbeam-channel/src/flavors/after.rs b/vendor/crossbeam-channel/src/flavors/after.rs new file mode 100644 index 0000000000..b57f8a7879 --- /dev/null +++ b/vendor/crossbeam-channel/src/flavors/after.rs @@ -0,0 +1,200 @@ +//! Channel that delivers a message after a certain amount of time. +//! +//! Messages cannot be sent into this kind of channel; they are materialized on demand. + +use std::sync::atomic::{AtomicBool, Ordering}; +use std::thread; +use std::time::{Duration, Instant}; + +use context::Context; +use err::{RecvTimeoutError, TryRecvError}; +use select::{Operation, SelectHandle, Token}; +use utils; + +/// Result of a receive operation. +pub type AfterToken = Option; + +/// Channel that delivers a message after a certain amount of time. +pub struct Channel { + /// The instant at which the message will be delivered. + delivery_time: Instant, + + /// `true` if the message has been received. + received: AtomicBool, +} + +impl Channel { + /// Creates a channel that delivers a message after a certain duration of time. + #[inline] + pub fn new(dur: Duration) -> Self { + Channel { + delivery_time: Instant::now() + dur, + received: AtomicBool::new(false), + } + } + + /// Attempts to receive a message without blocking. + #[inline] + pub fn try_recv(&self) -> Result { + // We use relaxed ordering because this is just an optional optimistic check. + if self.received.load(Ordering::Relaxed) { + // The message has already been received. + return Err(TryRecvError::Empty); + } + + if Instant::now() < self.delivery_time { + // The message was not delivered yet. + return Err(TryRecvError::Empty); + } + + // Try receiving the message if it is still available. + if !self.received.swap(true, Ordering::SeqCst) { + // Success! Return delivery time as the message. + Ok(self.delivery_time) + } else { + // The message was already received. + Err(TryRecvError::Empty) + } + } + + /// Receives a message from the channel. + #[inline] + pub fn recv(&self, deadline: Option) -> Result { + // We use relaxed ordering because this is just an optional optimistic check. + if self.received.load(Ordering::Relaxed) { + // The message has already been received. + utils::sleep_until(deadline); + return Err(RecvTimeoutError::Timeout); + } + + // Wait until the message is received or the deadline is reached. + loop { + let now = Instant::now(); + + // Check if we can receive the next message. + if now >= self.delivery_time { + break; + } + + // Check if the deadline has been reached. + if let Some(d) = deadline { + if now >= d { + return Err(RecvTimeoutError::Timeout); + } + + thread::sleep(self.delivery_time.min(d) - now); + } else { + thread::sleep(self.delivery_time - now); + } + } + + // Try receiving the message if it is still available. + if !self.received.swap(true, Ordering::SeqCst) { + // Success! Return the message, which is the instant at which it was delivered. + Ok(self.delivery_time) + } else { + // The message was already received. Block forever. + utils::sleep_until(None); + unreachable!() + } + } + + /// Reads a message from the channel. + #[inline] + pub unsafe fn read(&self, token: &mut Token) -> Result { + token.after.ok_or(()) + } + + /// Returns `true` if the channel is empty. + #[inline] + pub fn is_empty(&self) -> bool { + // We use relaxed ordering because this is just an optional optimistic check. + if self.received.load(Ordering::Relaxed) { + return true; + } + + // If the delivery time hasn't been reached yet, the channel is empty. + if Instant::now() < self.delivery_time { + return true; + } + + // The delivery time has been reached. The channel is empty only if the message has already + // been received. + self.received.load(Ordering::SeqCst) + } + + /// Returns `true` if the channel is full. + #[inline] + pub fn is_full(&self) -> bool { + !self.is_empty() + } + + /// Returns the number of messages in the channel. + #[inline] + pub fn len(&self) -> usize { + if self.is_empty() { + 0 + } else { + 1 + } + } + + /// Returns the capacity of the channel. + #[inline] + pub fn capacity(&self) -> Option { + Some(1) + } +} + +impl SelectHandle for Channel { + #[inline] + fn try_select(&self, token: &mut Token) -> bool { + match self.try_recv() { + Ok(msg) => { + token.after = Some(msg); + true + } + Err(TryRecvError::Disconnected) => { + token.after = None; + true + } + Err(TryRecvError::Empty) => false, + } + } + + #[inline] + fn deadline(&self) -> Option { + // We use relaxed ordering because this is just an optional optimistic check. + if self.received.load(Ordering::Relaxed) { + None + } else { + Some(self.delivery_time) + } + } + + #[inline] + fn register(&self, _oper: Operation, _cx: &Context) -> bool { + self.is_ready() + } + + #[inline] + fn unregister(&self, _oper: Operation) {} + + #[inline] + fn accept(&self, token: &mut Token, _cx: &Context) -> bool { + self.try_select(token) + } + + #[inline] + fn is_ready(&self) -> bool { + !self.is_empty() + } + + #[inline] + fn watch(&self, _oper: Operation, _cx: &Context) -> bool { + self.is_ready() + } + + #[inline] + fn unwatch(&self, _oper: Operation) {} +} diff --git a/vendor/crossbeam-channel/src/flavors/array.rs b/vendor/crossbeam-channel/src/flavors/array.rs new file mode 100644 index 0000000000..d38dc28e42 --- /dev/null +++ b/vendor/crossbeam-channel/src/flavors/array.rs @@ -0,0 +1,637 @@ +//! Bounded channel based on a preallocated array. +//! +//! This flavor has a fixed, positive capacity. +//! +//! The implementation is based on Dmitry Vyukov's bounded MPMC queue. +//! +//! Source: +//! - http://www.1024cores.net/home/lock-free-algorithms/queues/bounded-mpmc-queue +//! - https://docs.google.com/document/d/1yIAYmbvL3JxOKOjuCyon7JhW4cSv1wy5hC0ApeGMV9s/pub +//! +//! Copyright & License: +//! - Copyright (c) 2010-2011 Dmitry Vyukov +//! - Simplified BSD License and Apache License, Version 2.0 +//! - http://www.1024cores.net/home/code-license + +use std::cell::UnsafeCell; +use std::marker::PhantomData; +use std::mem; +use std::ptr; +use std::sync::atomic::{self, AtomicUsize, Ordering}; +use std::time::Instant; + +use crossbeam_utils::{Backoff, CachePadded}; + +use context::Context; +use err::{RecvTimeoutError, SendTimeoutError, TryRecvError, TrySendError}; +use select::{Operation, SelectHandle, Selected, Token}; +use waker::SyncWaker; + +/// A slot in a channel. +struct Slot { + /// The current stamp. + stamp: AtomicUsize, + + /// The message in this slot. + msg: UnsafeCell, +} + +/// The token type for the array flavor. +pub struct ArrayToken { + /// Slot to read from or write to. + slot: *const u8, + + /// Stamp to store into the slot after reading or writing. + stamp: usize, +} + +impl Default for ArrayToken { + #[inline] + fn default() -> Self { + ArrayToken { + slot: ptr::null(), + stamp: 0, + } + } +} + +/// Bounded channel based on a preallocated array. +pub struct Channel { + /// The head of the channel. + /// + /// This value is a "stamp" consisting of an index into the buffer, a mark bit, and a lap, but + /// packed into a single `usize`. The lower bits represent the index, while the upper bits + /// represent the lap. The mark bit in the head is always zero. + /// + /// Messages are popped from the head of the channel. + head: CachePadded, + + /// The tail of the channel. + /// + /// This value is a "stamp" consisting of an index into the buffer, a mark bit, and a lap, but + /// packed into a single `usize`. The lower bits represent the index, while the upper bits + /// represent the lap. The mark bit indicates that the channel is disconnected. + /// + /// Messages are pushed into the tail of the channel. + tail: CachePadded, + + /// The buffer holding slots. + buffer: *mut Slot, + + /// The channel capacity. + cap: usize, + + /// A stamp with the value of `{ lap: 1, mark: 0, index: 0 }`. + one_lap: usize, + + /// If this bit is set in the tail, that means the channel is disconnected. + mark_bit: usize, + + /// Senders waiting while the channel is full. + senders: SyncWaker, + + /// Receivers waiting while the channel is empty and not disconnected. + receivers: SyncWaker, + + /// Indicates that dropping a `Channel` may drop values of type `T`. + _marker: PhantomData, +} + +impl Channel { + /// Creates a bounded channel of capacity `cap`. + /// + /// # Panics + /// + /// Panics if the capacity is not in the range `1 ..= usize::max_value() / 4`. + pub fn with_capacity(cap: usize) -> Self { + assert!(cap > 0, "capacity must be positive"); + + // Make sure there are at least two most significant bits: one to encode laps and one more + // to indicate that the channel is disconnected. If we can't reserve two bits, then panic. + // In that case, the buffer is likely too large to allocate anyway. + let cap_limit = usize::max_value() / 4; + assert!( + cap <= cap_limit, + "channel capacity is too large: {} > {}", + cap, + cap_limit + ); + + // Compute constants `mark_bit` and `one_lap`. + let mark_bit = (cap + 1).next_power_of_two(); + let one_lap = mark_bit * 2; + + // Head is initialized to `{ lap: 0, mark: 0, index: 0 }`. + let head = 0; + // Tail is initialized to `{ lap: 0, mark: 0, index: 0 }`. + let tail = 0; + + // Allocate a buffer of `cap` slots. + let buffer = { + let mut v = Vec::>::with_capacity(cap); + let ptr = v.as_mut_ptr(); + mem::forget(v); + ptr + }; + + // Initialize stamps in the slots. + for i in 0..cap { + unsafe { + // Set the stamp to `{ lap: 0, mark: 0, index: i }`. + let slot = buffer.add(i); + ptr::write(&mut (*slot).stamp, AtomicUsize::new(i)); + } + } + + Channel { + buffer, + cap, + one_lap, + mark_bit, + head: CachePadded::new(AtomicUsize::new(head)), + tail: CachePadded::new(AtomicUsize::new(tail)), + senders: SyncWaker::new(), + receivers: SyncWaker::new(), + _marker: PhantomData, + } + } + + /// Returns a receiver handle to the channel. + pub fn receiver(&self) -> Receiver { + Receiver(self) + } + + /// Returns a sender handle to the channel. + pub fn sender(&self) -> Sender { + Sender(self) + } + + /// Attempts to reserve a slot for sending a message. + fn start_send(&self, token: &mut Token) -> bool { + let backoff = Backoff::new(); + let mut tail = self.tail.load(Ordering::Relaxed); + + loop { + // Check if the channel is disconnected. + if tail & self.mark_bit != 0 { + token.array.slot = ptr::null(); + token.array.stamp = 0; + return true; + } + + // Deconstruct the tail. + let index = tail & (self.mark_bit - 1); + let lap = tail & !(self.one_lap - 1); + + // Inspect the corresponding slot. + let slot = unsafe { &*self.buffer.add(index) }; + let stamp = slot.stamp.load(Ordering::Acquire); + + // If the tail and the stamp match, we may attempt to push. + if tail == stamp { + let new_tail = if index + 1 < self.cap { + // Same lap, incremented index. + // Set to `{ lap: lap, mark: 0, index: index + 1 }`. + tail + 1 + } else { + // One lap forward, index wraps around to zero. + // Set to `{ lap: lap.wrapping_add(1), mark: 0, index: 0 }`. + lap.wrapping_add(self.one_lap) + }; + + // Try moving the tail. + match self + .tail + .compare_exchange_weak(tail, new_tail, Ordering::SeqCst, Ordering::Relaxed) + { + Ok(_) => { + // Prepare the token for the follow-up call to `write`. + token.array.slot = slot as *const Slot as *const u8; + token.array.stamp = tail + 1; + return true; + } + Err(t) => { + tail = t; + backoff.spin(); + } + } + } else if stamp.wrapping_add(self.one_lap) == tail + 1 { + atomic::fence(Ordering::SeqCst); + let head = self.head.load(Ordering::Relaxed); + + // If the head lags one lap behind the tail as well... + if head.wrapping_add(self.one_lap) == tail { + // ...then the channel is full. + return false; + } + + backoff.spin(); + tail = self.tail.load(Ordering::Relaxed); + } else { + // Snooze because we need to wait for the stamp to get updated. + backoff.snooze(); + tail = self.tail.load(Ordering::Relaxed); + } + } + } + + /// Writes a message into the channel. + pub unsafe fn write(&self, token: &mut Token, msg: T) -> Result<(), T> { + // If there is no slot, the channel is disconnected. + if token.array.slot.is_null() { + return Err(msg); + } + + let slot: &Slot = &*(token.array.slot as *const Slot); + + // Write the message into the slot and update the stamp. + slot.msg.get().write(msg); + slot.stamp.store(token.array.stamp, Ordering::Release); + + // Wake a sleeping receiver. + self.receivers.notify(); + Ok(()) + } + + /// Attempts to reserve a slot for receiving a message. + fn start_recv(&self, token: &mut Token) -> bool { + let backoff = Backoff::new(); + let mut head = self.head.load(Ordering::Relaxed); + + loop { + // Deconstruct the head. + let index = head & (self.mark_bit - 1); + let lap = head & !(self.one_lap - 1); + + // Inspect the corresponding slot. + let slot = unsafe { &*self.buffer.add(index) }; + let stamp = slot.stamp.load(Ordering::Acquire); + + // If the the stamp is ahead of the head by 1, we may attempt to pop. + if head + 1 == stamp { + let new = if index + 1 < self.cap { + // Same lap, incremented index. + // Set to `{ lap: lap, mark: 0, index: index + 1 }`. + head + 1 + } else { + // One lap forward, index wraps around to zero. + // Set to `{ lap: lap.wrapping_add(1), mark: 0, index: 0 }`. + lap.wrapping_add(self.one_lap) + }; + + // Try moving the head. + match self + .head + .compare_exchange_weak(head, new, Ordering::SeqCst, Ordering::Relaxed) + { + Ok(_) => { + // Prepare the token for the follow-up call to `read`. + token.array.slot = slot as *const Slot as *const u8; + token.array.stamp = head.wrapping_add(self.one_lap); + return true; + } + Err(h) => { + head = h; + backoff.spin(); + } + } + } else if stamp == head { + atomic::fence(Ordering::SeqCst); + let tail = self.tail.load(Ordering::Relaxed); + + // If the tail equals the head, that means the channel is empty. + if (tail & !self.mark_bit) == head { + // If the channel is disconnected... + if tail & self.mark_bit != 0 { + // ...then receive an error. + token.array.slot = ptr::null(); + token.array.stamp = 0; + return true; + } else { + // Otherwise, the receive operation is not ready. + return false; + } + } + + backoff.spin(); + head = self.head.load(Ordering::Relaxed); + } else { + // Snooze because we need to wait for the stamp to get updated. + backoff.snooze(); + head = self.head.load(Ordering::Relaxed); + } + } + } + + /// Reads a message from the channel. + pub unsafe fn read(&self, token: &mut Token) -> Result { + if token.array.slot.is_null() { + // The channel is disconnected. + return Err(()); + } + + let slot: &Slot = &*(token.array.slot as *const Slot); + + // Read the message from the slot and update the stamp. + let msg = slot.msg.get().read(); + slot.stamp.store(token.array.stamp, Ordering::Release); + + // Wake a sleeping sender. + self.senders.notify(); + Ok(msg) + } + + /// Attempts to send a message into the channel. + pub fn try_send(&self, msg: T) -> Result<(), TrySendError> { + let token = &mut Token::default(); + if self.start_send(token) { + unsafe { self.write(token, msg).map_err(TrySendError::Disconnected) } + } else { + Err(TrySendError::Full(msg)) + } + } + + /// Sends a message into the channel. + pub fn send(&self, msg: T, deadline: Option) -> Result<(), SendTimeoutError> { + let token = &mut Token::default(); + loop { + // Try sending a message several times. + let backoff = Backoff::new(); + loop { + if self.start_send(token) { + let res = unsafe { self.write(token, msg) }; + return res.map_err(SendTimeoutError::Disconnected); + } + + if backoff.is_completed() { + break; + } else { + backoff.snooze(); + } + } + + Context::with(|cx| { + // Prepare for blocking until a receiver wakes us up. + let oper = Operation::hook(token); + self.senders.register(oper, cx); + + // Has the channel become ready just now? + if !self.is_full() || self.is_disconnected() { + let _ = cx.try_select(Selected::Aborted); + } + + // Block the current thread. + let sel = cx.wait_until(deadline); + + match sel { + Selected::Waiting => unreachable!(), + Selected::Aborted | Selected::Disconnected => { + self.senders.unregister(oper).unwrap(); + } + Selected::Operation(_) => {} + } + }); + + if let Some(d) = deadline { + if Instant::now() >= d { + return Err(SendTimeoutError::Timeout(msg)); + } + } + } + } + + /// Attempts to receive a message without blocking. + pub fn try_recv(&self) -> Result { + let token = &mut Token::default(); + + if self.start_recv(token) { + unsafe { self.read(token).map_err(|_| TryRecvError::Disconnected) } + } else { + Err(TryRecvError::Empty) + } + } + + /// Receives a message from the channel. + pub fn recv(&self, deadline: Option) -> Result { + let token = &mut Token::default(); + loop { + // Try receiving a message several times. + let backoff = Backoff::new(); + loop { + if self.start_recv(token) { + let res = unsafe { self.read(token) }; + return res.map_err(|_| RecvTimeoutError::Disconnected); + } + + if backoff.is_completed() { + break; + } else { + backoff.snooze(); + } + } + + Context::with(|cx| { + // Prepare for blocking until a sender wakes us up. + let oper = Operation::hook(token); + self.receivers.register(oper, cx); + + // Has the channel become ready just now? + if !self.is_empty() || self.is_disconnected() { + let _ = cx.try_select(Selected::Aborted); + } + + // Block the current thread. + let sel = cx.wait_until(deadline); + + match sel { + Selected::Waiting => unreachable!(), + Selected::Aborted | Selected::Disconnected => { + self.receivers.unregister(oper).unwrap(); + // If the channel was disconnected, we still have to check for remaining + // messages. + } + Selected::Operation(_) => {} + } + }); + + if let Some(d) = deadline { + if Instant::now() >= d { + return Err(RecvTimeoutError::Timeout); + } + } + } + } + + /// Returns the current number of messages inside the channel. + pub fn len(&self) -> usize { + loop { + // Load the tail, then load the head. + let tail = self.tail.load(Ordering::SeqCst); + let head = self.head.load(Ordering::SeqCst); + + // If the tail didn't change, we've got consistent values to work with. + if self.tail.load(Ordering::SeqCst) == tail { + let hix = head & (self.mark_bit - 1); + let tix = tail & (self.mark_bit - 1); + + return if hix < tix { + tix - hix + } else if hix > tix { + self.cap - hix + tix + } else if (tail & !self.mark_bit) == head { + 0 + } else { + self.cap + }; + } + } + } + + /// Returns the capacity of the channel. + pub fn capacity(&self) -> Option { + Some(self.cap) + } + + /// Disconnects the channel and wakes up all blocked receivers. + pub fn disconnect(&self) { + let tail = self.tail.fetch_or(self.mark_bit, Ordering::SeqCst); + + if tail & self.mark_bit == 0 { + self.senders.disconnect(); + self.receivers.disconnect(); + } + } + + /// Returns `true` if the channel is disconnected. + pub fn is_disconnected(&self) -> bool { + self.tail.load(Ordering::SeqCst) & self.mark_bit != 0 + } + + /// Returns `true` if the channel is empty. + pub fn is_empty(&self) -> bool { + let head = self.head.load(Ordering::SeqCst); + let tail = self.tail.load(Ordering::SeqCst); + + // Is the tail equal to the head? + // + // Note: If the head changes just before we load the tail, that means there was a moment + // when the channel was not empty, so it is safe to just return `false`. + (tail & !self.mark_bit) == head + } + + /// Returns `true` if the channel is full. + pub fn is_full(&self) -> bool { + let tail = self.tail.load(Ordering::SeqCst); + let head = self.head.load(Ordering::SeqCst); + + // Is the head lagging one lap behind tail? + // + // Note: If the tail changes just before we load the head, that means there was a moment + // when the channel was not full, so it is safe to just return `false`. + head.wrapping_add(self.one_lap) == tail & !self.mark_bit + } +} + +impl Drop for Channel { + fn drop(&mut self) { + // Get the index of the head. + let hix = self.head.load(Ordering::Relaxed) & (self.mark_bit - 1); + + // Loop over all slots that hold a message and drop them. + for i in 0..self.len() { + // Compute the index of the next slot holding a message. + let index = if hix + i < self.cap { + hix + i + } else { + hix + i - self.cap + }; + + unsafe { + self.buffer.add(index).drop_in_place(); + } + } + + // Finally, deallocate the buffer, but don't run any destructors. + unsafe { + Vec::from_raw_parts(self.buffer, 0, self.cap); + } + } +} + +/// Receiver handle to a channel. +pub struct Receiver<'a, T: 'a>(&'a Channel); + +/// Sender handle to a channel. +pub struct Sender<'a, T: 'a>(&'a Channel); + +impl<'a, T> SelectHandle for Receiver<'a, T> { + fn try_select(&self, token: &mut Token) -> bool { + self.0.start_recv(token) + } + + fn deadline(&self) -> Option { + None + } + + fn register(&self, oper: Operation, cx: &Context) -> bool { + self.0.receivers.register(oper, cx); + self.is_ready() + } + + fn unregister(&self, oper: Operation) { + self.0.receivers.unregister(oper); + } + + fn accept(&self, token: &mut Token, _cx: &Context) -> bool { + self.try_select(token) + } + + fn is_ready(&self) -> bool { + !self.0.is_empty() || self.0.is_disconnected() + } + + fn watch(&self, oper: Operation, cx: &Context) -> bool { + self.0.receivers.watch(oper, cx); + self.is_ready() + } + + fn unwatch(&self, oper: Operation) { + self.0.receivers.unwatch(oper); + } +} + +impl<'a, T> SelectHandle for Sender<'a, T> { + fn try_select(&self, token: &mut Token) -> bool { + self.0.start_send(token) + } + + fn deadline(&self) -> Option { + None + } + + fn register(&self, oper: Operation, cx: &Context) -> bool { + self.0.senders.register(oper, cx); + self.is_ready() + } + + fn unregister(&self, oper: Operation) { + self.0.senders.unregister(oper); + } + + fn accept(&self, token: &mut Token, _cx: &Context) -> bool { + self.try_select(token) + } + + fn is_ready(&self) -> bool { + !self.0.is_full() || self.0.is_disconnected() + } + + fn watch(&self, oper: Operation, cx: &Context) -> bool { + self.0.senders.watch(oper, cx); + self.is_ready() + } + + fn unwatch(&self, oper: Operation) { + self.0.senders.unwatch(oper); + } +} diff --git a/vendor/crossbeam-channel/src/flavors/list.rs b/vendor/crossbeam-channel/src/flavors/list.rs new file mode 100644 index 0000000000..fae0600597 --- /dev/null +++ b/vendor/crossbeam-channel/src/flavors/list.rs @@ -0,0 +1,657 @@ +//! Unbounded channel implemented as a linked list. + +use std::cell::UnsafeCell; +use std::marker::PhantomData; +use std::mem::{self, ManuallyDrop}; +use std::ptr; +use std::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering}; +use std::time::Instant; + +use crossbeam_utils::{Backoff, CachePadded}; + +use context::Context; +use err::{RecvTimeoutError, SendTimeoutError, TryRecvError, TrySendError}; +use select::{Operation, SelectHandle, Selected, Token}; +use waker::SyncWaker; + +// TODO(stjepang): Once we bump the minimum required Rust version to 1.28 or newer, re-apply the +// following changes by @kleimkuhler: +// +// 1. https://github.com/crossbeam-rs/crossbeam-channel/pull/100 +// 2. https://github.com/crossbeam-rs/crossbeam-channel/pull/101 + +// Bits indicating the state of a slot: +// * If a message has been written into the slot, `WRITE` is set. +// * If a message has been read from the slot, `READ` is set. +// * If the block is being destroyed, `DESTROY` is set. +const WRITE: usize = 1; +const READ: usize = 2; +const DESTROY: usize = 4; + +// Each block covers one "lap" of indices. +const LAP: usize = 32; +// The maximum number of messages a block can hold. +const BLOCK_CAP: usize = LAP - 1; +// How many lower bits are reserved for metadata. +const SHIFT: usize = 1; +// Has two different purposes: +// * If set in head, indicates that the block is not the last one. +// * If set in tail, indicates that the channel is disconnected. +const MARK_BIT: usize = 1; + +/// A slot in a block. +struct Slot { + /// The message. + msg: UnsafeCell>, + + /// The state of the slot. + state: AtomicUsize, +} + +impl Slot { + /// Waits until a message is written into the slot. + fn wait_write(&self) { + let backoff = Backoff::new(); + while self.state.load(Ordering::Acquire) & WRITE == 0 { + backoff.snooze(); + } + } +} + +/// A block in a linked list. +/// +/// Each block in the list can hold up to `BLOCK_CAP` messages. +struct Block { + /// The next block in the linked list. + next: AtomicPtr>, + + /// Slots for messages. + slots: [Slot; BLOCK_CAP], +} + +impl Block { + /// Creates an empty block. + fn new() -> Block { + unsafe { mem::zeroed() } + } + + /// Waits until the next pointer is set. + fn wait_next(&self) -> *mut Block { + let backoff = Backoff::new(); + loop { + let next = self.next.load(Ordering::Acquire); + if !next.is_null() { + return next; + } + backoff.snooze(); + } + } + + /// Sets the `DESTROY` bit in slots starting from `start` and destroys the block. + unsafe fn destroy(this: *mut Block, start: usize) { + // It is not necessary to set the `DESTROY bit in the last slot because that slot has begun + // destruction of the block. + for i in start..BLOCK_CAP - 1 { + let slot = (*this).slots.get_unchecked(i); + + // Mark the `DESTROY` bit if a thread is still using the slot. + if slot.state.load(Ordering::Acquire) & READ == 0 + && slot.state.fetch_or(DESTROY, Ordering::AcqRel) & READ == 0 + { + // If a thread is still using the slot, it will continue destruction of the block. + return; + } + } + + // No thread is using the block, now it is safe to destroy it. + drop(Box::from_raw(this)); + } +} + +/// A position in a channel. +#[derive(Debug)] +struct Position { + /// The index in the channel. + index: AtomicUsize, + + /// The block in the linked list. + block: AtomicPtr>, +} + +/// The token type for the list flavor. +pub struct ListToken { + /// The block of slots. + block: *const u8, + + /// The offset into the block. + offset: usize, +} + +impl Default for ListToken { + #[inline] + fn default() -> Self { + ListToken { + block: ptr::null(), + offset: 0, + } + } +} + +/// Unbounded channel implemented as a linked list. +/// +/// Each message sent into the channel is assigned a sequence number, i.e. an index. Indices are +/// represented as numbers of type `usize` and wrap on overflow. +/// +/// Consecutive messages are grouped into blocks in order to put less pressure on the allocator and +/// improve cache efficiency. +pub struct Channel { + /// The head of the channel. + head: CachePadded>, + + /// The tail of the channel. + tail: CachePadded>, + + /// Receivers waiting while the channel is empty and not disconnected. + receivers: SyncWaker, + + /// Indicates that dropping a `Channel` may drop messages of type `T`. + _marker: PhantomData, +} + +impl Channel { + /// Creates a new unbounded channel. + pub fn new() -> Self { + Channel { + head: CachePadded::new(Position { + block: AtomicPtr::new(ptr::null_mut()), + index: AtomicUsize::new(0), + }), + tail: CachePadded::new(Position { + block: AtomicPtr::new(ptr::null_mut()), + index: AtomicUsize::new(0), + }), + receivers: SyncWaker::new(), + _marker: PhantomData, + } + } + + /// Returns a receiver handle to the channel. + pub fn receiver(&self) -> Receiver { + Receiver(self) + } + + /// Returns a sender handle to the channel. + pub fn sender(&self) -> Sender { + Sender(self) + } + + /// Attempts to reserve a slot for sending a message. + fn start_send(&self, token: &mut Token) -> bool { + let backoff = Backoff::new(); + let mut tail = self.tail.index.load(Ordering::Acquire); + let mut block = self.tail.block.load(Ordering::Acquire); + let mut next_block = None; + + loop { + // Check if the channel is disconnected. + if tail & MARK_BIT != 0 { + token.list.block = ptr::null(); + return true; + } + + // Calculate the offset of the index into the block. + let offset = (tail >> SHIFT) % LAP; + + // If we reached the end of the block, wait until the next one is installed. + if offset == BLOCK_CAP { + backoff.snooze(); + tail = self.tail.index.load(Ordering::Acquire); + block = self.tail.block.load(Ordering::Acquire); + continue; + } + + // If we're going to have to install the next block, allocate it in advance in order to + // make the wait for other threads as short as possible. + if offset + 1 == BLOCK_CAP && next_block.is_none() { + next_block = Some(Box::new(Block::::new())); + } + + // If this is the first message to be sent into the channel, we need to allocate the + // first block and install it. + if block.is_null() { + let new = Box::into_raw(Box::new(Block::::new())); + + if self.tail.block.compare_and_swap(block, new, Ordering::Release) == block { + self.head.block.store(new, Ordering::Release); + block = new; + } else { + next_block = unsafe { Some(Box::from_raw(new)) }; + tail = self.tail.index.load(Ordering::Acquire); + block = self.tail.block.load(Ordering::Acquire); + continue; + } + } + + let new_tail = tail + (1 << SHIFT); + + // Try advancing the tail forward. + match self.tail.index + .compare_exchange_weak( + tail, + new_tail, + Ordering::SeqCst, + Ordering::Acquire, + ) + { + Ok(_) => unsafe { + // If we've reached the end of the block, install the next one. + if offset + 1 == BLOCK_CAP { + let next_block = Box::into_raw(next_block.unwrap()); + self.tail.block.store(next_block, Ordering::Release); + self.tail.index.fetch_add(1 << SHIFT, Ordering::Release); + (*block).next.store(next_block, Ordering::Release); + } + + token.list.block = block as *const u8; + token.list.offset = offset; + return true; + } + Err(t) => { + tail = t; + block = self.tail.block.load(Ordering::Acquire); + backoff.spin(); + } + } + } + } + + /// Writes a message into the channel. + pub unsafe fn write(&self, token: &mut Token, msg: T) -> Result<(), T> { + // If there is no slot, the channel is disconnected. + if token.list.block.is_null() { + return Err(msg); + } + + // Write the message into the slot. + let block = token.list.block as *mut Block; + let offset = token.list.offset; + let slot = (*block).slots.get_unchecked(offset); + slot.msg.get().write(ManuallyDrop::new(msg)); + slot.state.fetch_or(WRITE, Ordering::Release); + + // Wake a sleeping receiver. + self.receivers.notify(); + Ok(()) + } + + /// Attempts to reserve a slot for receiving a message. + fn start_recv(&self, token: &mut Token) -> bool { + let backoff = Backoff::new(); + let mut head = self.head.index.load(Ordering::Acquire); + let mut block = self.head.block.load(Ordering::Acquire); + + loop { + // Calculate the offset of the index into the block. + let offset = (head >> SHIFT) % LAP; + + // If we reached the end of the block, wait until the next one is installed. + if offset == BLOCK_CAP { + backoff.snooze(); + head = self.head.index.load(Ordering::Acquire); + block = self.head.block.load(Ordering::Acquire); + continue; + } + + let mut new_head = head + (1 << SHIFT); + + if new_head & MARK_BIT == 0 { + atomic::fence(Ordering::SeqCst); + let tail = self.tail.index.load(Ordering::Relaxed); + + // If the tail equals the head, that means the channel is empty. + if head >> SHIFT == tail >> SHIFT { + // If the channel is disconnected... + if tail & MARK_BIT != 0 { + // ...then receive an error. + token.list.block = ptr::null(); + return true; + } else { + // Otherwise, the receive operation is not ready. + return false; + } + } + + // If head and tail are not in the same block, set `MARK_BIT` in head. + if (head >> SHIFT) / LAP != (tail >> SHIFT) / LAP { + new_head |= MARK_BIT; + } + } + + // The block can be null here only if the first message is being sent into the channel. + // In that case, just wait until it gets initialized. + if block.is_null() { + backoff.snooze(); + head = self.head.index.load(Ordering::Acquire); + block = self.head.block.load(Ordering::Acquire); + continue; + } + + // Try moving the head index forward. + match self.head.index + .compare_exchange_weak( + head, + new_head, + Ordering::SeqCst, + Ordering::Acquire, + ) + { + Ok(_) => unsafe { + // If we've reached the end of the block, move to the next one. + if offset + 1 == BLOCK_CAP { + let next = (*block).wait_next(); + let mut next_index = (new_head & !MARK_BIT).wrapping_add(1 << SHIFT); + if !(*next).next.load(Ordering::Relaxed).is_null() { + next_index |= MARK_BIT; + } + + self.head.block.store(next, Ordering::Release); + self.head.index.store(next_index, Ordering::Release); + } + + token.list.block = block as *const u8; + token.list.offset = offset; + return true; + } + Err(h) => { + head = h; + block = self.head.block.load(Ordering::Acquire); + backoff.spin(); + } + } + } + } + + /// Reads a message from the channel. + pub unsafe fn read(&self, token: &mut Token) -> Result { + if token.list.block.is_null() { + // The channel is disconnected. + return Err(()); + } + + // Read the message. + let block = token.list.block as *mut Block; + let offset = token.list.offset; + let slot = (*block).slots.get_unchecked(offset); + slot.wait_write(); + let m = slot.msg.get().read(); + let msg = ManuallyDrop::into_inner(m); + + // Destroy the block if we've reached the end, or if another thread wanted to destroy but + // couldn't because we were busy reading from the slot. + if offset + 1 == BLOCK_CAP { + Block::destroy(block, 0); + } else if slot.state.fetch_or(READ, Ordering::AcqRel) & DESTROY != 0 { + Block::destroy(block, offset + 1); + } + + Ok(msg) + } + + /// Attempts to send a message into the channel. + pub fn try_send(&self, msg: T) -> Result<(), TrySendError> { + self.send(msg, None).map_err(|err| match err { + SendTimeoutError::Disconnected(msg) => TrySendError::Disconnected(msg), + SendTimeoutError::Timeout(_) => unreachable!(), + }) + } + + /// Sends a message into the channel. + pub fn send(&self, msg: T, _deadline: Option) -> Result<(), SendTimeoutError> { + let token = &mut Token::default(); + assert!(self.start_send(token)); + unsafe { + self.write(token, msg) + .map_err(SendTimeoutError::Disconnected) + } + } + + /// Attempts to receive a message without blocking. + pub fn try_recv(&self) -> Result { + let token = &mut Token::default(); + + if self.start_recv(token) { + unsafe { self.read(token).map_err(|_| TryRecvError::Disconnected) } + } else { + Err(TryRecvError::Empty) + } + } + + /// Receives a message from the channel. + pub fn recv(&self, deadline: Option) -> Result { + let token = &mut Token::default(); + loop { + // Try receiving a message several times. + let backoff = Backoff::new(); + loop { + if self.start_recv(token) { + unsafe { + return self.read(token).map_err(|_| RecvTimeoutError::Disconnected); + } + } + + if backoff.is_completed() { + break; + } else { + backoff.snooze(); + } + } + + // Prepare for blocking until a sender wakes us up. + Context::with(|cx| { + let oper = Operation::hook(token); + self.receivers.register(oper, cx); + + // Has the channel become ready just now? + if !self.is_empty() || self.is_disconnected() { + let _ = cx.try_select(Selected::Aborted); + } + + // Block the current thread. + let sel = cx.wait_until(deadline); + + match sel { + Selected::Waiting => unreachable!(), + Selected::Aborted | Selected::Disconnected => { + self.receivers.unregister(oper).unwrap(); + // If the channel was disconnected, we still have to check for remaining + // messages. + } + Selected::Operation(_) => {} + } + }); + + if let Some(d) = deadline { + if Instant::now() >= d { + return Err(RecvTimeoutError::Timeout); + } + } + } + } + + /// Returns the current number of messages inside the channel. + pub fn len(&self) -> usize { + loop { + // Load the tail index, then load the head index. + let mut tail = self.tail.index.load(Ordering::SeqCst); + let mut head = self.head.index.load(Ordering::SeqCst); + + // If the tail index didn't change, we've got consistent indices to work with. + if self.tail.index.load(Ordering::SeqCst) == tail { + // Erase the lower bits. + tail &= !((1 << SHIFT) - 1); + head &= !((1 << SHIFT) - 1); + + // Rotate indices so that head falls into the first block. + let lap = (head >> SHIFT) / LAP; + tail = tail.wrapping_sub((lap * LAP) << SHIFT); + head = head.wrapping_sub((lap * LAP) << SHIFT); + + // Remove the lower bits. + tail >>= SHIFT; + head >>= SHIFT; + + // Fix up indices if they fall onto block ends. + if head == BLOCK_CAP { + head = 0; + tail -= LAP; + } + if tail == BLOCK_CAP { + tail += 1; + } + + // Return the difference minus the number of blocks between tail and head. + return tail - head - tail / LAP; + } + } + } + + /// Returns the capacity of the channel. + pub fn capacity(&self) -> Option { + None + } + + /// Disconnects the channel and wakes up all blocked receivers. + pub fn disconnect(&self) { + let tail = self.tail.index.fetch_or(MARK_BIT, Ordering::SeqCst); + + if tail & MARK_BIT == 0 { + self.receivers.disconnect(); + } + } + + /// Returns `true` if the channel is disconnected. + pub fn is_disconnected(&self) -> bool { + self.tail.index.load(Ordering::SeqCst) & MARK_BIT != 0 + } + + /// Returns `true` if the channel is empty. + pub fn is_empty(&self) -> bool { + let head = self.head.index.load(Ordering::SeqCst); + let tail = self.tail.index.load(Ordering::SeqCst); + head >> SHIFT == tail >> SHIFT + } + + /// Returns `true` if the channel is full. + pub fn is_full(&self) -> bool { + false + } +} + +impl Drop for Channel { + fn drop(&mut self) { + let mut head = self.head.index.load(Ordering::Relaxed); + let mut tail = self.tail.index.load(Ordering::Relaxed); + let mut block = self.head.block.load(Ordering::Relaxed); + + // Erase the lower bits. + head &= !((1 << SHIFT) - 1); + tail &= !((1 << SHIFT) - 1); + + unsafe { + // Drop all messages between head and tail and deallocate the heap-allocated blocks. + while head != tail { + let offset = (head >> SHIFT) % LAP; + + if offset < BLOCK_CAP { + // Drop the message in the slot. + let slot = (*block).slots.get_unchecked(offset); + ManuallyDrop::drop(&mut *(*slot).msg.get()); + } else { + // Deallocate the block and move to the next one. + let next = (*block).next.load(Ordering::Relaxed); + drop(Box::from_raw(block)); + block = next; + } + + head = head.wrapping_add(1 << SHIFT); + } + + // Deallocate the last remaining block. + if !block.is_null() { + drop(Box::from_raw(block)); + } + } + } +} + +/// Receiver handle to a channel. +pub struct Receiver<'a, T: 'a>(&'a Channel); + +/// Sender handle to a channel. +pub struct Sender<'a, T: 'a>(&'a Channel); + +impl<'a, T> SelectHandle for Receiver<'a, T> { + fn try_select(&self, token: &mut Token) -> bool { + self.0.start_recv(token) + } + + fn deadline(&self) -> Option { + None + } + + fn register(&self, oper: Operation, cx: &Context) -> bool { + self.0.receivers.register(oper, cx); + self.is_ready() + } + + fn unregister(&self, oper: Operation) { + self.0.receivers.unregister(oper); + } + + fn accept(&self, token: &mut Token, _cx: &Context) -> bool { + self.try_select(token) + } + + fn is_ready(&self) -> bool { + !self.0.is_empty() || self.0.is_disconnected() + } + + fn watch(&self, oper: Operation, cx: &Context) -> bool { + self.0.receivers.watch(oper, cx); + self.is_ready() + } + + fn unwatch(&self, oper: Operation) { + self.0.receivers.unwatch(oper); + } +} + +impl<'a, T> SelectHandle for Sender<'a, T> { + fn try_select(&self, token: &mut Token) -> bool { + self.0.start_send(token) + } + + fn deadline(&self) -> Option { + None + } + + fn register(&self, _oper: Operation, _cx: &Context) -> bool { + self.is_ready() + } + + fn unregister(&self, _oper: Operation) {} + + fn accept(&self, token: &mut Token, _cx: &Context) -> bool { + self.try_select(token) + } + + fn is_ready(&self) -> bool { + true + } + + fn watch(&self, _oper: Operation, _cx: &Context) -> bool { + self.is_ready() + } + + fn unwatch(&self, _oper: Operation) {} +} diff --git a/vendor/crossbeam-channel/src/flavors/mod.rs b/vendor/crossbeam-channel/src/flavors/mod.rs new file mode 100644 index 0000000000..ebd0cfa540 --- /dev/null +++ b/vendor/crossbeam-channel/src/flavors/mod.rs @@ -0,0 +1,17 @@ +//! Channel flavors. +//! +//! There are six flavors: +//! +//! 1. `after` - Channel that delivers a message after a certain amount of time. +//! 2. `array` - Bounded channel based on a preallocated array. +//! 3. `list` - Unbounded channel implemented as a linked list. +//! 4. `never` - Channel that never delivers messages. +//! 5. `tick` - Channel that delivers messages periodically. +//! 6. `zero` - Zero-capacity channel. + +pub mod after; +pub mod array; +pub mod list; +pub mod never; +pub mod tick; +pub mod zero; diff --git a/vendor/crossbeam-channel/src/flavors/never.rs b/vendor/crossbeam-channel/src/flavors/never.rs new file mode 100644 index 0000000000..5fb12e67ed --- /dev/null +++ b/vendor/crossbeam-channel/src/flavors/never.rs @@ -0,0 +1,110 @@ +//! Channel that never delivers messages. +//! +//! Messages cannot be sent into this kind of channel. + +use std::marker::PhantomData; +use std::time::Instant; + +use context::Context; +use err::{RecvTimeoutError, TryRecvError}; +use select::{Operation, SelectHandle, Token}; +use utils; + +/// This flavor doesn't need a token. +pub type NeverToken = (); + +/// Channel that never delivers messages. +pub struct Channel { + _marker: PhantomData, +} + +impl Channel { + /// Creates a channel that never delivers messages. + #[inline] + pub fn new() -> Self { + Channel { + _marker: PhantomData, + } + } + + /// Attempts to receive a message without blocking. + #[inline] + pub fn try_recv(&self) -> Result { + Err(TryRecvError::Empty) + } + + /// Receives a message from the channel. + #[inline] + pub fn recv(&self, deadline: Option) -> Result { + utils::sleep_until(deadline); + Err(RecvTimeoutError::Timeout) + } + + /// Reads a message from the channel. + #[inline] + pub unsafe fn read(&self, _token: &mut Token) -> Result { + Err(()) + } + + /// Returns `true` if the channel is empty. + #[inline] + pub fn is_empty(&self) -> bool { + true + } + + /// Returns `true` if the channel is full. + #[inline] + pub fn is_full(&self) -> bool { + true + } + + /// Returns the number of messages in the channel. + #[inline] + pub fn len(&self) -> usize { + 0 + } + + /// Returns the capacity of the channel. + #[inline] + pub fn capacity(&self) -> Option { + Some(0) + } +} + +impl SelectHandle for Channel { + #[inline] + fn try_select(&self, _token: &mut Token) -> bool { + false + } + + #[inline] + fn deadline(&self) -> Option { + None + } + + #[inline] + fn register(&self, _oper: Operation, _cx: &Context) -> bool { + self.is_ready() + } + + #[inline] + fn unregister(&self, _oper: Operation) {} + + #[inline] + fn accept(&self, token: &mut Token, _cx: &Context) -> bool { + self.try_select(token) + } + + #[inline] + fn is_ready(&self) -> bool { + false + } + + #[inline] + fn watch(&self, _oper: Operation, _cx: &Context) -> bool { + self.is_ready() + } + + #[inline] + fn unwatch(&self, _oper: Operation) {} +} diff --git a/vendor/crossbeam-channel/src/flavors/tick.rs b/vendor/crossbeam-channel/src/flavors/tick.rs new file mode 100644 index 0000000000..7418661a79 --- /dev/null +++ b/vendor/crossbeam-channel/src/flavors/tick.rs @@ -0,0 +1,173 @@ +//! Channel that delivers messages periodically. +//! +//! Messages cannot be sent into this kind of channel; they are materialized on demand. + +use std::thread; +use std::time::{Duration, Instant}; + +use crossbeam_utils::atomic::AtomicCell; + +use context::Context; +use err::{RecvTimeoutError, TryRecvError}; +use select::{Operation, SelectHandle, Token}; + +/// Result of a receive operation. +pub type TickToken = Option; + +/// Channel that delivers messages periodically. +pub struct Channel { + /// The instant at which the next message will be delivered. + delivery_time: AtomicCell, + + /// The time interval in which messages get delivered. + duration: Duration, +} + +impl Channel { + /// Creates a channel that delivers messages periodically. + #[inline] + pub fn new(dur: Duration) -> Self { + Channel { + delivery_time: AtomicCell::new(Instant::now() + dur), + duration: dur, + } + } + + /// Attempts to receive a message without blocking. + #[inline] + pub fn try_recv(&self) -> Result { + loop { + let now = Instant::now(); + let delivery_time = self.delivery_time.load(); + + if now < delivery_time { + return Err(TryRecvError::Empty); + } + + if self + .delivery_time + .compare_exchange(delivery_time, now + self.duration) + .is_ok() + { + return Ok(delivery_time); + } + } + } + + /// Receives a message from the channel. + #[inline] + pub fn recv(&self, deadline: Option) -> Result { + loop { + // Compute the time to sleep until the next message or the deadline. + let offset = { + let mut delivery_time = self.delivery_time.load(); + let now = Instant::now(); + + // Check if we can receive the next message. + if now >= delivery_time + && self + .delivery_time + .compare_exchange(delivery_time, now + self.duration) + .is_ok() + { + return Ok(delivery_time); + } + + // Check if the operation deadline has been reached. + if let Some(d) = deadline { + if now >= d { + return Err(RecvTimeoutError::Timeout); + } + + delivery_time.min(d) - now + } else { + delivery_time - now + } + }; + + thread::sleep(offset); + } + } + + /// Reads a message from the channel. + #[inline] + pub unsafe fn read(&self, token: &mut Token) -> Result { + token.tick.ok_or(()) + } + + /// Returns `true` if the channel is empty. + #[inline] + pub fn is_empty(&self) -> bool { + Instant::now() < self.delivery_time.load() + } + + /// Returns `true` if the channel is full. + #[inline] + pub fn is_full(&self) -> bool { + !self.is_empty() + } + + /// Returns the number of messages in the channel. + #[inline] + pub fn len(&self) -> usize { + if self.is_empty() { + 0 + } else { + 1 + } + } + + /// Returns the capacity of the channel. + #[inline] + pub fn capacity(&self) -> Option { + Some(1) + } +} + +impl SelectHandle for Channel { + #[inline] + fn try_select(&self, token: &mut Token) -> bool { + match self.try_recv() { + Ok(msg) => { + token.tick = Some(msg); + true + } + Err(TryRecvError::Disconnected) => { + token.tick = None; + true + } + Err(TryRecvError::Empty) => false, + } + } + + #[inline] + fn deadline(&self) -> Option { + Some(self.delivery_time.load()) + } + + #[inline] + fn register(&self, _oper: Operation, _cx: &Context) -> bool { + self.is_ready() + } + + #[inline] + fn unregister(&self, _oper: Operation) {} + + #[inline] + fn accept(&self, token: &mut Token, _cx: &Context) -> bool { + self.try_select(token) + } + + #[inline] + fn is_ready(&self) -> bool { + !self.is_empty() + } + + #[inline] + fn watch(&self, _oper: Operation, _cx: &Context) -> bool { + self.is_ready() + } + + #[inline] + fn unwatch(&self, _oper: Operation) {} +} diff --git a/vendor/crossbeam-channel/src/flavors/zero.rs b/vendor/crossbeam-channel/src/flavors/zero.rs new file mode 100644 index 0000000000..031bfb8b11 --- /dev/null +++ b/vendor/crossbeam-channel/src/flavors/zero.rs @@ -0,0 +1,461 @@ +//! Zero-capacity channel. +//! +//! This kind of channel is also known as *rendezvous* channel. + +use std::cell::UnsafeCell; +use std::marker::PhantomData; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::time::Instant; + +use crossbeam_utils::Backoff; + +use context::Context; +use err::{RecvTimeoutError, SendTimeoutError, TryRecvError, TrySendError}; +use select::{Operation, SelectHandle, Selected, Token}; +use utils::Mutex; +use waker::Waker; + +/// A pointer to a packet. +pub type ZeroToken = usize; + +/// A slot for passing one message from a sender to a receiver. +struct Packet { + /// Equals `true` if the packet is allocated on the stack. + on_stack: bool, + + /// Equals `true` once the packet is ready for reading or writing. + ready: AtomicBool, + + /// The message. + msg: UnsafeCell>, +} + +impl Packet { + /// Creates an empty packet on the stack. + fn empty_on_stack() -> Packet { + Packet { + on_stack: true, + ready: AtomicBool::new(false), + msg: UnsafeCell::new(None), + } + } + + /// Creates an empty packet on the heap. + fn empty_on_heap() -> Box> { + Box::new(Packet { + on_stack: false, + ready: AtomicBool::new(false), + msg: UnsafeCell::new(None), + }) + } + + /// Creates a packet on the stack, containing a message. + fn message_on_stack(msg: T) -> Packet { + Packet { + on_stack: true, + ready: AtomicBool::new(false), + msg: UnsafeCell::new(Some(msg)), + } + } + + /// Waits until the packet becomes ready for reading or writing. + fn wait_ready(&self) { + let backoff = Backoff::new(); + while !self.ready.load(Ordering::Acquire) { + backoff.snooze(); + } + } +} + +/// Inner representation of a zero-capacity channel. +struct Inner { + /// Senders waiting to pair up with a receive operation. + senders: Waker, + + /// Receivers waiting to pair up with a send operation. + receivers: Waker, + + /// Equals `true` when the channel is disconnected. + is_disconnected: bool, +} + +/// Zero-capacity channel. +pub struct Channel { + /// Inner representation of the channel. + inner: Mutex, + + /// Indicates that dropping a `Channel` may drop values of type `T`. + _marker: PhantomData, +} + +impl Channel { + /// Constructs a new zero-capacity channel. + pub fn new() -> Self { + Channel { + inner: Mutex::new(Inner { + senders: Waker::new(), + receivers: Waker::new(), + is_disconnected: false, + }), + _marker: PhantomData, + } + } + + /// Returns a receiver handle to the channel. + pub fn receiver(&self) -> Receiver { + Receiver(self) + } + + /// Returns a sender handle to the channel. + pub fn sender(&self) -> Sender { + Sender(self) + } + + /// Attempts to reserve a slot for sending a message. + fn start_send(&self, token: &mut Token) -> bool { + let mut inner = self.inner.lock(); + + // If there's a waiting receiver, pair up with it. + if let Some(operation) = inner.receivers.try_select() { + token.zero = operation.packet; + true + } else if inner.is_disconnected { + token.zero = 0; + true + } else { + false + } + } + + /// Writes a message into the packet. + pub unsafe fn write(&self, token: &mut Token, msg: T) -> Result<(), T> { + // If there is no packet, the channel is disconnected. + if token.zero == 0 { + return Err(msg); + } + + let packet = &*(token.zero as *const Packet); + packet.msg.get().write(Some(msg)); + packet.ready.store(true, Ordering::Release); + Ok(()) + } + + /// Attempts to pair up with a sender. + fn start_recv(&self, token: &mut Token) -> bool { + let mut inner = self.inner.lock(); + + // If there's a waiting sender, pair up with it. + if let Some(operation) = inner.senders.try_select() { + token.zero = operation.packet; + true + } else if inner.is_disconnected { + token.zero = 0; + true + } else { + false + } + } + + /// Reads a message from the packet. + pub unsafe fn read(&self, token: &mut Token) -> Result { + // If there is no packet, the channel is disconnected. + if token.zero == 0 { + return Err(()); + } + + let packet = &*(token.zero as *const Packet); + + if packet.on_stack { + // The message has been in the packet from the beginning, so there is no need to wait + // for it. However, after reading the message, we need to set `ready` to `true` in + // order to signal that the packet can be destroyed. + let msg = packet.msg.get().replace(None).unwrap(); + packet.ready.store(true, Ordering::Release); + Ok(msg) + } else { + // Wait until the message becomes available, then read it and destroy the + // heap-allocated packet. + packet.wait_ready(); + let msg = packet.msg.get().replace(None).unwrap(); + drop(Box::from_raw(packet as *const Packet as *mut Packet)); + Ok(msg) + } + } + + /// Attempts to send a message into the channel. + pub fn try_send(&self, msg: T) -> Result<(), TrySendError> { + let token = &mut Token::default(); + let mut inner = self.inner.lock(); + + // If there's a waiting receiver, pair up with it. + if let Some(operation) = inner.receivers.try_select() { + token.zero = operation.packet; + drop(inner); + unsafe { + self.write(token, msg).ok().unwrap(); + } + Ok(()) + } else if inner.is_disconnected { + Err(TrySendError::Disconnected(msg)) + } else { + Err(TrySendError::Full(msg)) + } + } + + /// Sends a message into the channel. + pub fn send(&self, msg: T, deadline: Option) -> Result<(), SendTimeoutError> { + let token = &mut Token::default(); + let mut inner = self.inner.lock(); + + // If there's a waiting receiver, pair up with it. + if let Some(operation) = inner.receivers.try_select() { + token.zero = operation.packet; + drop(inner); + unsafe { + self.write(token, msg).ok().unwrap(); + } + return Ok(()); + } + + if inner.is_disconnected { + return Err(SendTimeoutError::Disconnected(msg)); + } + + Context::with(|cx| { + // Prepare for blocking until a receiver wakes us up. + let oper = Operation::hook(token); + let packet = Packet::::message_on_stack(msg); + inner + .senders + .register_with_packet(oper, &packet as *const Packet as usize, cx); + inner.receivers.notify(); + drop(inner); + + // Block the current thread. + let sel = cx.wait_until(deadline); + + match sel { + Selected::Waiting => unreachable!(), + Selected::Aborted => { + self.inner.lock().senders.unregister(oper).unwrap(); + let msg = unsafe { packet.msg.get().replace(None).unwrap() }; + Err(SendTimeoutError::Timeout(msg)) + } + Selected::Disconnected => { + self.inner.lock().senders.unregister(oper).unwrap(); + let msg = unsafe { packet.msg.get().replace(None).unwrap() }; + Err(SendTimeoutError::Disconnected(msg)) + } + Selected::Operation(_) => { + // Wait until the message is read, then drop the packet. + packet.wait_ready(); + Ok(()) + } + } + }) + } + + /// Attempts to receive a message without blocking. + pub fn try_recv(&self) -> Result { + let token = &mut Token::default(); + let mut inner = self.inner.lock(); + + // If there's a waiting sender, pair up with it. + if let Some(operation) = inner.senders.try_select() { + token.zero = operation.packet; + drop(inner); + unsafe { self.read(token).map_err(|_| TryRecvError::Disconnected) } + } else if inner.is_disconnected { + Err(TryRecvError::Disconnected) + } else { + Err(TryRecvError::Empty) + } + } + + /// Receives a message from the channel. + pub fn recv(&self, deadline: Option) -> Result { + let token = &mut Token::default(); + let mut inner = self.inner.lock(); + + // If there's a waiting sender, pair up with it. + if let Some(operation) = inner.senders.try_select() { + token.zero = operation.packet; + drop(inner); + unsafe { + return self.read(token).map_err(|_| RecvTimeoutError::Disconnected); + } + } + + if inner.is_disconnected { + return Err(RecvTimeoutError::Disconnected); + } + + Context::with(|cx| { + // Prepare for blocking until a sender wakes us up. + let oper = Operation::hook(token); + let packet = Packet::::empty_on_stack(); + inner + .receivers + .register_with_packet(oper, &packet as *const Packet as usize, cx); + inner.senders.notify(); + drop(inner); + + // Block the current thread. + let sel = cx.wait_until(deadline); + + match sel { + Selected::Waiting => unreachable!(), + Selected::Aborted => { + self.inner.lock().receivers.unregister(oper).unwrap(); + Err(RecvTimeoutError::Timeout) + } + Selected::Disconnected => { + self.inner.lock().receivers.unregister(oper).unwrap(); + Err(RecvTimeoutError::Disconnected) + } + Selected::Operation(_) => { + // Wait until the message is provided, then read it. + packet.wait_ready(); + unsafe { Ok(packet.msg.get().replace(None).unwrap()) } + } + } + }) + } + + /// Disconnects the channel and wakes up all blocked receivers. + pub fn disconnect(&self) { + let mut inner = self.inner.lock(); + + if !inner.is_disconnected { + inner.is_disconnected = true; + inner.senders.disconnect(); + inner.receivers.disconnect(); + } + } + + /// Returns the current number of messages inside the channel. + pub fn len(&self) -> usize { + 0 + } + + /// Returns the capacity of the channel. + pub fn capacity(&self) -> Option { + Some(0) + } + + /// Returns `true` if the channel is empty. + pub fn is_empty(&self) -> bool { + true + } + + /// Returns `true` if the channel is full. + pub fn is_full(&self) -> bool { + true + } +} + +/// Receiver handle to a channel. +pub struct Receiver<'a, T: 'a>(&'a Channel); + +/// Sender handle to a channel. +pub struct Sender<'a, T: 'a>(&'a Channel); + +impl<'a, T> SelectHandle for Receiver<'a, T> { + fn try_select(&self, token: &mut Token) -> bool { + self.0.start_recv(token) + } + + fn deadline(&self) -> Option { + None + } + + fn register(&self, oper: Operation, cx: &Context) -> bool { + let packet = Box::into_raw(Packet::::empty_on_heap()); + + let mut inner = self.0.inner.lock(); + inner + .receivers + .register_with_packet(oper, packet as usize, cx); + inner.senders.notify(); + inner.senders.can_select() || inner.is_disconnected + } + + fn unregister(&self, oper: Operation) { + if let Some(operation) = self.0.inner.lock().receivers.unregister(oper) { + unsafe { + drop(Box::from_raw(operation.packet as *mut Packet)); + } + } + } + + fn accept(&self, token: &mut Token, cx: &Context) -> bool { + token.zero = cx.wait_packet(); + true + } + + fn is_ready(&self) -> bool { + let inner = self.0.inner.lock(); + inner.senders.can_select() || inner.is_disconnected + } + + fn watch(&self, oper: Operation, cx: &Context) -> bool { + let mut inner = self.0.inner.lock(); + inner.receivers.watch(oper, cx); + inner.senders.can_select() || inner.is_disconnected + } + + fn unwatch(&self, oper: Operation) { + let mut inner = self.0.inner.lock(); + inner.receivers.unwatch(oper); + } +} + +impl<'a, T> SelectHandle for Sender<'a, T> { + fn try_select(&self, token: &mut Token) -> bool { + self.0.start_send(token) + } + + fn deadline(&self) -> Option { + None + } + + fn register(&self, oper: Operation, cx: &Context) -> bool { + let packet = Box::into_raw(Packet::::empty_on_heap()); + + let mut inner = self.0.inner.lock(); + inner + .senders + .register_with_packet(oper, packet as usize, cx); + inner.receivers.notify(); + inner.receivers.can_select() || inner.is_disconnected + } + + fn unregister(&self, oper: Operation) { + if let Some(operation) = self.0.inner.lock().senders.unregister(oper) { + unsafe { + drop(Box::from_raw(operation.packet as *mut Packet)); + } + } + } + + fn accept(&self, token: &mut Token, cx: &Context) -> bool { + token.zero = cx.wait_packet(); + true + } + + fn is_ready(&self) -> bool { + let inner = self.0.inner.lock(); + inner.receivers.can_select() || inner.is_disconnected + } + + fn watch(&self, oper: Operation, cx: &Context) -> bool { + let mut inner = self.0.inner.lock(); + inner.senders.watch(oper, cx); + inner.receivers.can_select() || inner.is_disconnected + } + + fn unwatch(&self, oper: Operation) { + let mut inner = self.0.inner.lock(); + inner.senders.unwatch(oper); + } +} diff --git a/vendor/crossbeam-channel/src/lib.rs b/vendor/crossbeam-channel/src/lib.rs new file mode 100644 index 0000000000..877378cea4 --- /dev/null +++ b/vendor/crossbeam-channel/src/lib.rs @@ -0,0 +1,372 @@ +//! Multi-producer multi-consumer channels for message passing. +//! +//! This crate is an alternative to [`std::sync::mpsc`] with more features and better performance. +//! +//! # Hello, world! +//! +//! ``` +//! use crossbeam_channel::unbounded; +//! +//! // Create a channel of unbounded capacity. +//! let (s, r) = unbounded(); +//! +//! // Send a message into the channel. +//! s.send("Hello, world!").unwrap(); +//! +//! // Receive the message from the channel. +//! assert_eq!(r.recv(), Ok("Hello, world!")); +//! ``` +//! +//! # Channel types +//! +//! Channels can be created using two functions: +//! +//! * [`bounded`] creates a channel of bounded capacity, i.e. there is a limit to how many messages +//! it can hold at a time. +//! +//! * [`unbounded`] creates a channel of unbounded capacity, i.e. it can hold any number of +//! messages at a time. +//! +//! Both functions return a [`Sender`] and a [`Receiver`], which represent the two opposite sides +//! of a channel. +//! +//! Creating a bounded channel: +//! +//! ``` +//! use crossbeam_channel::bounded; +//! +//! // Create a channel that can hold at most 5 messages at a time. +//! let (s, r) = bounded(5); +//! +//! // Can send only 5 messages without blocking. +//! for i in 0..5 { +//! s.send(i).unwrap(); +//! } +//! +//! // Another call to `send` would block because the channel is full. +//! // s.send(5).unwrap(); +//! ``` +//! +//! Creating an unbounded channel: +//! +//! ``` +//! use crossbeam_channel::unbounded; +//! +//! // Create an unbounded channel. +//! let (s, r) = unbounded(); +//! +//! // Can send any number of messages into the channel without blocking. +//! for i in 0..1000 { +//! s.send(i).unwrap(); +//! } +//! ``` +//! +//! A special case is zero-capacity channel, which cannot hold any messages. Instead, send and +//! receive operations must appear at the same time in order to pair up and pass the message over: +//! +//! ``` +//! use std::thread; +//! use crossbeam_channel::bounded; +//! +//! // Create a zero-capacity channel. +//! let (s, r) = bounded(0); +//! +//! // Sending blocks until a receive operation appears on the other side. +//! thread::spawn(move || s.send("Hi!").unwrap()); +//! +//! // Receiving blocks until a send operation appears on the other side. +//! assert_eq!(r.recv(), Ok("Hi!")); +//! ``` +//! +//! # Sharing channels +//! +//! Senders and receivers can be cloned and sent to other threads: +//! +//! ``` +//! use std::thread; +//! use crossbeam_channel::bounded; +//! +//! let (s1, r1) = bounded(0); +//! let (s2, r2) = (s1.clone(), r1.clone()); +//! +//! // Spawn a thread that receives a message and then sends one. +//! thread::spawn(move || { +//! r2.recv().unwrap(); +//! s2.send(2).unwrap(); +//! }); +//! +//! // Send a message and then receive one. +//! s1.send(1).unwrap(); +//! r1.recv().unwrap(); +//! ``` +//! +//! Note that cloning only creates a new handle to the same sending or receiving side. It does not +//! create a separate stream of messages in any way: +//! +//! ``` +//! use crossbeam_channel::unbounded; +//! +//! let (s1, r1) = unbounded(); +//! let (s2, r2) = (s1.clone(), r1.clone()); +//! let (s3, r3) = (s2.clone(), r2.clone()); +//! +//! s1.send(10).unwrap(); +//! s2.send(20).unwrap(); +//! s3.send(30).unwrap(); +//! +//! assert_eq!(r3.recv(), Ok(10)); +//! assert_eq!(r1.recv(), Ok(20)); +//! assert_eq!(r2.recv(), Ok(30)); +//! ``` +//! +//! It's also possible to share senders and receivers by reference: +//! +//! ``` +//! # extern crate crossbeam_channel; +//! # extern crate crossbeam_utils; +//! # fn main() { +//! use std::thread; +//! use crossbeam_channel::bounded; +//! use crossbeam_utils::thread::scope; +//! +//! let (s, r) = bounded(0); +//! +//! scope(|scope| { +//! // Spawn a thread that receives a message and then sends one. +//! scope.spawn(|_| { +//! r.recv().unwrap(); +//! s.send(2).unwrap(); +//! }); +//! +//! // Send a message and then receive one. +//! s.send(1).unwrap(); +//! r.recv().unwrap(); +//! }).unwrap(); +//! # } +//! ``` +//! +//! # Disconnection +//! +//! When all senders or all receivers associated with a channel get dropped, the channel becomes +//! disconnected. No more messages can be sent, but any remaining messages can still be received. +//! Send and receive operations on a disconnected channel never block. +//! +//! ``` +//! use crossbeam_channel::{unbounded, RecvError}; +//! +//! let (s, r) = unbounded(); +//! s.send(1).unwrap(); +//! s.send(2).unwrap(); +//! s.send(3).unwrap(); +//! +//! // The only sender is dropped, disconnecting the channel. +//! drop(s); +//! +//! // The remaining messages can be received. +//! assert_eq!(r.recv(), Ok(1)); +//! assert_eq!(r.recv(), Ok(2)); +//! assert_eq!(r.recv(), Ok(3)); +//! +//! // There are no more messages in the channel. +//! assert!(r.is_empty()); +//! +//! // Note that calling `r.recv()` does not block. +//! // Instead, `Err(RecvError)` is returned immediately. +//! assert_eq!(r.recv(), Err(RecvError)); +//! ``` +//! +//! # Blocking operations +//! +//! Send and receive operations come in three flavors: +//! +//! * Non-blocking (returns immediately with success or failure). +//! * Blocking (waits until the operation succeeds or the channel becomes disconnected). +//! * Blocking with a timeout (blocks only for a certain duration of time). +//! +//! A simple example showing the difference between non-blocking and blocking operations: +//! +//! ``` +//! use crossbeam_channel::{bounded, RecvError, TryRecvError}; +//! +//! let (s, r) = bounded(1); +//! +//! // Send a message into the channel. +//! s.send("foo").unwrap(); +//! +//! // This call would block because the channel is full. +//! // s.send("bar").unwrap(); +//! +//! // Receive the message. +//! assert_eq!(r.recv(), Ok("foo")); +//! +//! // This call would block because the channel is empty. +//! // r.recv(); +//! +//! // Try receiving a message without blocking. +//! assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +//! +//! // Disconnect the channel. +//! drop(s); +//! +//! // This call doesn't block because the channel is now disconnected. +//! assert_eq!(r.recv(), Err(RecvError)); +//! ``` +//! +//! # Iteration +//! +//! Receivers can be used as iterators. For example, method [`iter`] creates an iterator that +//! receives messages until the channel becomes empty and disconnected. Note that iteration may +//! block waiting for next message to arrive. +//! +//! ``` +//! use std::thread; +//! use crossbeam_channel::unbounded; +//! +//! let (s, r) = unbounded(); +//! +//! thread::spawn(move || { +//! s.send(1).unwrap(); +//! s.send(2).unwrap(); +//! s.send(3).unwrap(); +//! drop(s); // Disconnect the channel. +//! }); +//! +//! // Collect all messages from the channel. +//! // Note that the call to `collect` blocks until the sender is dropped. +//! let v: Vec<_> = r.iter().collect(); +//! +//! assert_eq!(v, [1, 2, 3]); +//! ``` +//! +//! A non-blocking iterator can be created using [`try_iter`], which receives all available +//! messages without blocking: +//! +//! ``` +//! use crossbeam_channel::unbounded; +//! +//! let (s, r) = unbounded(); +//! s.send(1).unwrap(); +//! s.send(2).unwrap(); +//! s.send(3).unwrap(); +//! // No need to drop the sender. +//! +//! // Receive all messages currently in the channel. +//! let v: Vec<_> = r.try_iter().collect(); +//! +//! assert_eq!(v, [1, 2, 3]); +//! ``` +//! +//! # Selection +//! +//! The [`select!`] macro allows you to define a set of channel operations, wait until any one of +//! them becomes ready, and finally execute it. If multiple operations are ready at the same time, +//! a random one among them is selected. +//! +//! It is also possible to define a `default` case that gets executed if none of the operations are +//! ready, either right away or for a certain duration of time. +//! +//! An operation is considered to be ready if it doesn't have to block. Note that it is ready even +//! when it will simply return an error because the channel is disconnected. +//! +//! An example of receiving a message from two channels: +//! +//! ``` +//! # #[macro_use] +//! # extern crate crossbeam_channel; +//! # fn main() { +//! use std::thread; +//! use std::time::Duration; +//! use crossbeam_channel::unbounded; +//! +//! let (s1, r1) = unbounded(); +//! let (s2, r2) = unbounded(); +//! +//! thread::spawn(move || s1.send(10).unwrap()); +//! thread::spawn(move || s2.send(20).unwrap()); +//! +//! // At most one of these two receive operations will be executed. +//! select! { +//! recv(r1) -> msg => assert_eq!(msg, Ok(10)), +//! recv(r2) -> msg => assert_eq!(msg, Ok(20)), +//! default(Duration::from_secs(1)) => println!("timed out"), +//! } +//! # } +//! ``` +//! +//! If you need to select over a dynamically created list of channel operations, use [`Select`] +//! instead. The [`select!`] macro is just a convenience wrapper around [`Select`]. +//! +//! # Extra channels +//! +//! Three functions can create special kinds of channels, all of which return just a [`Receiver`] +//! handle: +//! +//! * [`after`] creates a channel that delivers a single message after a certain duration of time. +//! * [`tick`] creates a channel that delivers messages periodically. +//! * [`never`] creates a channel that never delivers messages. +//! +//! These channels are very efficient because messages get lazily generated on receive operations. +//! +//! An example that prints elapsed time every 50 milliseconds for the duration of 1 second: +//! +//! ``` +//! # #[macro_use] +//! # extern crate crossbeam_channel; +//! # fn main() { +//! use std::time::{Duration, Instant}; +//! use crossbeam_channel::{after, tick}; +//! +//! let start = Instant::now(); +//! let ticker = tick(Duration::from_millis(50)); +//! let timeout = after(Duration::from_secs(1)); +//! +//! loop { +//! select! { +//! recv(ticker) -> _ => println!("elapsed: {:?}", start.elapsed()), +//! recv(timeout) -> _ => break, +//! } +//! } +//! # } +//! ``` +//! +//! [`std::sync::mpsc`]: https://doc.rust-lang.org/std/sync/mpsc/index.html +//! [`unbounded`]: fn.unbounded.html +//! [`bounded`]: fn.bounded.html +//! [`after`]: fn.after.html +//! [`tick`]: fn.tick.html +//! [`never`]: fn.never.html +//! [`send`]: struct.Sender.html#method.send +//! [`recv`]: struct.Receiver.html#method.recv +//! [`iter`]: struct.Receiver.html#method.iter +//! [`try_iter`]: struct.Receiver.html#method.try_iter +//! [`select!`]: macro.select.html +//! [`Select`]: struct.Select.html +//! [`Sender`]: struct.Sender.html +//! [`Receiver`]: struct.Receiver.html + +#![warn(missing_docs)] +#![warn(missing_debug_implementations)] + +extern crate crossbeam_utils; +extern crate smallvec; + +mod channel; +mod context; +mod counter; +mod err; +mod flavors; +mod select; +mod select_macro; +mod utils; +mod waker; + +pub use channel::{after, never, tick}; +pub use channel::{bounded, unbounded}; +pub use channel::{IntoIter, Iter, TryIter}; +pub use channel::{Receiver, Sender}; + +pub use select::{Select, SelectedOperation}; + +pub use err::{RecvError, RecvTimeoutError, TryRecvError}; +pub use err::{ReadyTimeoutError, SelectTimeoutError, TryReadyError, TrySelectError}; +pub use err::{SendError, SendTimeoutError, TrySendError}; diff --git a/vendor/crossbeam-channel/src/select.rs b/vendor/crossbeam-channel/src/select.rs new file mode 100644 index 0000000000..c7a8fa58b2 --- /dev/null +++ b/vendor/crossbeam-channel/src/select.rs @@ -0,0 +1,1078 @@ +//! Interface to the select mechanism. + +use std::fmt; +use std::marker::PhantomData; +use std::mem; +use std::time::{Duration, Instant}; + +use crossbeam_utils::Backoff; +use smallvec::SmallVec; + +use channel::{self, Receiver, Sender}; +use context::Context; +use err::{ReadyTimeoutError, TryReadyError}; +use err::{RecvError, SendError}; +use err::{SelectTimeoutError, TrySelectError}; +use flavors; +use utils; + +/// Temporary data that gets initialized during select or a blocking operation, and is consumed by +/// `read` or `write`. +/// +/// Each field contains data associated with a specific channel flavor. +#[derive(Default)] +pub struct Token { + pub after: flavors::after::AfterToken, + pub array: flavors::array::ArrayToken, + pub list: flavors::list::ListToken, + pub never: flavors::never::NeverToken, + pub tick: flavors::tick::TickToken, + pub zero: flavors::zero::ZeroToken, +} + +/// Identifier associated with an operation by a specific thread on a specific channel. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Operation(usize); + +impl Operation { + /// Creates an operation identifier from a mutable reference. + /// + /// This function essentially just turns the address of the reference into a number. The + /// reference should point to a variable that is specific to the thread and the operation, + /// and is alive for the entire duration of select or blocking operation. + #[inline] + pub fn hook(r: &mut T) -> Operation { + let val = r as *mut T as usize; + // Make sure that the pointer address doesn't equal the numerical representation of + // `Selected::{Waiting, Aborted, Disconnected}`. + assert!(val > 2); + Operation(val) + } +} + +/// Current state of a select or a blocking operation. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Selected { + /// Still waiting for an operation. + Waiting, + + /// The attempt to block the current thread has been aborted. + Aborted, + + /// An operation became ready because a channel is disconnected. + Disconnected, + + /// An operation became ready because a message can be sent or received. + Operation(Operation), +} + +impl From for Selected { + #[inline] + fn from(val: usize) -> Selected { + match val { + 0 => Selected::Waiting, + 1 => Selected::Aborted, + 2 => Selected::Disconnected, + oper => Selected::Operation(Operation(oper)), + } + } +} + +impl Into for Selected { + #[inline] + fn into(self) -> usize { + match self { + Selected::Waiting => 0, + Selected::Aborted => 1, + Selected::Disconnected => 2, + Selected::Operation(Operation(val)) => val, + } + } +} + +/// A receiver or a sender that can participate in select. +/// +/// This is a handle that assists select in executing an operation, registration, deciding on the +/// appropriate deadline for blocking, etc. +pub trait SelectHandle { + /// Attempts to select an operation and returns `true` on success. + fn try_select(&self, token: &mut Token) -> bool; + + /// Returns a deadline for an operation, if there is one. + fn deadline(&self) -> Option; + + /// Registers an operation for execution and returns `true` if it is now ready. + fn register(&self, oper: Operation, cx: &Context) -> bool; + + /// Unregisters an operation for execution. + fn unregister(&self, oper: Operation); + + /// Attempts to select an operation the thread got woken up for and returns `true` on success. + fn accept(&self, token: &mut Token, cx: &Context) -> bool; + + /// Returns `true` if an operation can be executed without blocking. + fn is_ready(&self) -> bool; + + /// Registers an operation for readiness notification and returns `true` if it is now ready. + fn watch(&self, oper: Operation, cx: &Context) -> bool; + + /// Unregisters an operation for readiness notification. + fn unwatch(&self, oper: Operation); +} + +impl<'a, T: SelectHandle> SelectHandle for &'a T { + fn try_select(&self, token: &mut Token) -> bool { + (**self).try_select(token) + } + + fn deadline(&self) -> Option { + (**self).deadline() + } + + fn register(&self, oper: Operation, cx: &Context) -> bool { + (**self).register(oper, cx) + } + + fn unregister(&self, oper: Operation) { + (**self).unregister(oper); + } + + fn accept(&self, token: &mut Token, cx: &Context) -> bool { + (**self).accept(token, cx) + } + + fn is_ready(&self) -> bool { + (**self).is_ready() + } + + fn watch(&self, oper: Operation, cx: &Context) -> bool { + (**self).watch(oper, cx) + } + + fn unwatch(&self, oper: Operation) { + (**self).unwatch(oper) + } +} + +/// Determines when a select operation should time out. +#[derive(Clone, Copy, Eq, PartialEq)] +enum Timeout { + /// No blocking. + Now, + + /// Block forever. + Never, + + /// Time out after the time instant. + At(Instant), +} + +/// Runs until one of the operations is selected, potentially blocking the current thread. +/// +/// Successful receive operations will have to be followed up by `channel::read()` and successful +/// send operations by `channel::write()`. +fn run_select( + handles: &mut [(&SelectHandle, usize, *const u8)], + timeout: Timeout, +) -> Option<(Token, usize, *const u8)> { + if handles.is_empty() { + // Wait until the timeout and return. + match timeout { + Timeout::Now => return None, + Timeout::Never => { + utils::sleep_until(None); + unreachable!(); + } + Timeout::At(when) => { + utils::sleep_until(Some(when)); + return None; + } + } + } + + // Shuffle the operations for fairness. + utils::shuffle(handles); + + // Create a token, which serves as a temporary variable that gets initialized in this function + // and is later used by a call to `channel::read()` or `channel::write()` that completes the + // selected operation. + let mut token = Token::default(); + + // Try selecting one of the operations without blocking. + for &(handle, i, ptr) in handles.iter() { + if handle.try_select(&mut token) { + return Some((token, i, ptr)); + } + } + + loop { + // Prepare for blocking. + let res = Context::with(|cx| { + let mut sel = Selected::Waiting; + let mut registered_count = 0; + let mut index_ready = None; + + if let Timeout::Now = timeout { + cx.try_select(Selected::Aborted).unwrap(); + } + + // Register all operations. + for (handle, i, _) in handles.iter_mut() { + registered_count += 1; + + // If registration returns `false`, that means the operation has just become ready. + if handle.register(Operation::hook::<&SelectHandle>(handle), cx) { + // Try aborting select. + sel = match cx.try_select(Selected::Aborted) { + Ok(()) => { + index_ready = Some(*i); + Selected::Aborted + } + Err(s) => s, + }; + break; + } + + // If another thread has already selected one of the operations, stop registration. + sel = cx.selected(); + if sel != Selected::Waiting { + break; + } + } + + if sel == Selected::Waiting { + // Check with each operation for how long we're allowed to block, and compute the + // earliest deadline. + let mut deadline: Option = match timeout { + Timeout::Now => return None, + Timeout::Never => None, + Timeout::At(when) => Some(when), + }; + for &(handle, _, _) in handles.iter() { + if let Some(x) = handle.deadline() { + deadline = deadline.map(|y| x.min(y)).or(Some(x)); + } + } + + // Block the current thread. + sel = cx.wait_until(deadline); + } + + // Unregister all registered operations. + for (handle, _, _) in handles.iter_mut().take(registered_count) { + handle.unregister(Operation::hook::<&SelectHandle>(handle)); + } + + match sel { + Selected::Waiting => unreachable!(), + Selected::Aborted => { + // If an operation became ready during registration, try selecting it. + if let Some(index_ready) = index_ready { + for &(handle, i, ptr) in handles.iter() { + if i == index_ready && handle.try_select(&mut token) { + return Some((i, ptr)); + } + } + } + } + Selected::Disconnected => {} + Selected::Operation(_) => { + // Find the selected operation. + for (handle, i, ptr) in handles.iter_mut() { + // Is this the selected operation? + if sel == Selected::Operation(Operation::hook::<&SelectHandle>(handle)) { + // Try selecting this operation. + if handle.accept(&mut token, cx) { + return Some((*i, *ptr)); + } + } + } + } + } + + None + }); + + // Return if an operation was selected. + if let Some((i, ptr)) = res { + return Some((token, i, ptr)); + } + + // Try selecting one of the operations without blocking. + for &(handle, i, ptr) in handles.iter() { + if handle.try_select(&mut token) { + return Some((token, i, ptr)); + } + } + + match timeout { + Timeout::Now => return None, + Timeout::Never => {} + Timeout::At(when) => { + if Instant::now() >= when { + return None; + } + } + } + } +} + +/// Runs until one of the operations becomes ready, potentially blocking the current thread. +fn run_ready( + handles: &mut [(&SelectHandle, usize, *const u8)], + timeout: Timeout, +) -> Option { + if handles.is_empty() { + // Wait until the timeout and return. + match timeout { + Timeout::Now => return None, + Timeout::Never => { + utils::sleep_until(None); + unreachable!(); + } + Timeout::At(when) => { + utils::sleep_until(Some(when)); + return None; + } + } + } + + // Shuffle the operations for fairness. + utils::shuffle(handles); + + loop { + let backoff = Backoff::new(); + loop { + // Check operations for readiness. + for &(handle, i, _) in handles.iter() { + if handle.is_ready() { + return Some(i); + } + } + + if backoff.is_completed() { + break; + } else { + backoff.snooze(); + } + } + + // Check for timeout. + match timeout { + Timeout::Now => return None, + Timeout::Never => {} + Timeout::At(when) => { + if Instant::now() >= when { + return None; + } + } + } + + // Prepare for blocking. + let res = Context::with(|cx| { + let mut sel = Selected::Waiting; + let mut registered_count = 0; + + // Begin watching all operations. + for (handle, _, _) in handles.iter_mut() { + registered_count += 1; + let oper = Operation::hook::<&SelectHandle>(handle); + + // If registration returns `false`, that means the operation has just become ready. + if handle.watch(oper, cx) { + sel = match cx.try_select(Selected::Operation(oper)) { + Ok(()) => Selected::Operation(oper), + Err(s) => s, + }; + break; + } + + // If another thread has already chosen one of the operations, stop registration. + sel = cx.selected(); + if sel != Selected::Waiting { + break; + } + } + + if sel == Selected::Waiting { + // Check with each operation for how long we're allowed to block, and compute the + // earliest deadline. + let mut deadline: Option = match timeout { + Timeout::Now => unreachable!(), + Timeout::Never => None, + Timeout::At(when) => Some(when), + }; + for &(handle, _, _) in handles.iter() { + if let Some(x) = handle.deadline() { + deadline = deadline.map(|y| x.min(y)).or(Some(x)); + } + } + + // Block the current thread. + sel = cx.wait_until(deadline); + } + + // Unwatch all operations. + for (handle, _, _) in handles.iter_mut().take(registered_count) { + handle.unwatch(Operation::hook::<&SelectHandle>(handle)); + } + + match sel { + Selected::Waiting => unreachable!(), + Selected::Aborted => {} + Selected::Disconnected => {} + Selected::Operation(_) => { + for (handle, i, _) in handles.iter_mut() { + let oper = Operation::hook::<&SelectHandle>(handle); + if sel == Selected::Operation(oper) { + return Some(*i); + } + } + } + } + + None + }); + + // Return if an operation became ready. + if res.is_some() { + return res; + } + } +} + +/// Selects from a set of channel operations. +/// +/// `Select` allows you to define a set of channel operations, wait until any one of them becomes +/// ready, and finally execute it. If multiple operations are ready at the same time, a random one +/// among them is selected. +/// +/// An operation is considered to be ready if it doesn't have to block. Note that it is ready even +/// when it will simply return an error because the channel is disconnected. +/// +/// The [`select!`] macro is a convenience wrapper around `Select`. However, it cannot select over a +/// dynamically created list of channel operations. +/// +/// Once a list of operations has been built with `Select`, there are two different ways of +/// proceeding: +/// +/// * Select an operation with [`try_select`], [`select`], or [`select_timeout`]. If successful, +/// the returned selected operation has already begun and **must** be completed. If we don't +/// complete it, a panic will occur. +/// +/// * Wait for an operation to become ready with [`try_ready`], [`ready`], or [`ready_timeout`]. If +/// successful, we may attempt to execute the operation, but are not obliged to. In fact, it's +/// possible for another thread to make the operation not ready just before we try executing it, +/// so it's wise to use a retry loop. However, note that these methods might return with success +/// spuriously, so it's a good idea to always double check if the operation is really ready. +/// +/// # Examples +/// +/// Use [`select`] to receive a message from a list of receivers: +/// +/// ``` +/// use crossbeam_channel::{Receiver, RecvError, Select}; +/// +/// fn recv_multiple(rs: &[Receiver]) -> Result { +/// // Build a list of operations. +/// let mut sel = Select::new(); +/// for r in rs { +/// sel.recv(r); +/// } +/// +/// // Complete the selected operation. +/// let oper = sel.select(); +/// let index = oper.index(); +/// oper.recv(&rs[index]) +/// } +/// ``` +/// +/// Use [`ready`] to receive a message from a list of receivers: +/// +/// ``` +/// use crossbeam_channel::{Receiver, RecvError, Select}; +/// +/// fn recv_multiple(rs: &[Receiver]) -> Result { +/// // Build a list of operations. +/// let mut sel = Select::new(); +/// for r in rs { +/// sel.recv(r); +/// } +/// +/// loop { +/// // Wait until a receive operation becomes ready and try executing it. +/// let index = sel.ready(); +/// let res = rs[index].try_recv(); +/// +/// // If the operation turns out not to be ready, retry. +/// if let Err(e) = res { +/// if e.is_empty() { +/// continue; +/// } +/// } +/// +/// // Success! +/// return res.map_err(|_| RecvError); +/// } +/// } +/// ``` +/// +/// [`select!`]: macro.select.html +/// [`try_select`]: struct.Select.html#method.try_select +/// [`select`]: struct.Select.html#method.select +/// [`select_timeout`]: struct.Select.html#method.select_timeout +/// [`try_ready`]: struct.Select.html#method.try_ready +/// [`ready`]: struct.Select.html#method.ready +/// [`ready_timeout`]: struct.Select.html#method.ready_timeout +pub struct Select<'a> { + /// A list of senders and receivers participating in selection. + handles: SmallVec<[(&'a SelectHandle, usize, *const u8); 4]>, +} + +unsafe impl<'a> Send for Select<'a> {} +unsafe impl<'a> Sync for Select<'a> {} + +impl<'a> Select<'a> { + /// Creates an empty list of channel operations for selection. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::Select; + /// + /// let mut sel = Select::new(); + /// + /// // The list of operations is empty, which means no operation can be selected. + /// assert!(sel.try_select().is_err()); + /// ``` + pub fn new() -> Select<'a> { + Select { + handles: SmallVec::new(), + } + } + + /// Adds a send operation. + /// + /// Returns the index of the added operation. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use crossbeam_channel::{unbounded, Select}; + /// + /// let (s, r) = unbounded::(); + /// + /// let mut sel = Select::new(); + /// let index = sel.send(&s); + /// ``` + pub fn send(&mut self, s: &'a Sender) -> usize { + let i = self.handles.len(); + let ptr = s as *const Sender<_> as *const u8; + self.handles.push((s, i, ptr)); + i + } + + /// Adds a receive operation. + /// + /// Returns the index of the added operation. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use crossbeam_channel::{unbounded, Select}; + /// + /// let (s, r) = unbounded::(); + /// + /// let mut sel = Select::new(); + /// let index = sel.recv(&r); + /// ``` + pub fn recv(&mut self, r: &'a Receiver) -> usize { + let i = self.handles.len(); + let ptr = r as *const Receiver<_> as *const u8; + self.handles.push((r, i, ptr)); + i + } + + /// Attempts to select one of the operations without blocking. + /// + /// If an operation is ready, it is selected and returned. If multiple operations are ready at + /// the same time, a random one among them is selected. If none of the operations are ready, an + /// error is returned. + /// + /// An operation is considered to be ready if it doesn't have to block. Note that it is ready + /// even when it will simply return an error because the channel is disconnected. + /// + /// The selected operation must be completed with [`SelectedOperation::send`] + /// or [`SelectedOperation::recv`]. + /// + /// [`SelectedOperation::send`]: struct.SelectedOperation.html#method.send + /// [`SelectedOperation::recv`]: struct.SelectedOperation.html#method.recv + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use crossbeam_channel::{unbounded, Select}; + /// + /// let (s1, r1) = unbounded(); + /// let (s2, r2) = unbounded(); + /// + /// s1.send(10).unwrap(); + /// s2.send(20).unwrap(); + /// + /// let mut sel = Select::new(); + /// let oper1 = sel.recv(&r1); + /// let oper2 = sel.recv(&r2); + /// + /// // Both operations are initially ready, so a random one will be executed. + /// let oper = sel.try_select(); + /// match oper { + /// Err(_) => panic!("both operations should be ready"), + /// Ok(oper) => match oper.index() { + /// i if i == oper1 => assert_eq!(oper.recv(&r1), Ok(10)), + /// i if i == oper2 => assert_eq!(oper.recv(&r2), Ok(20)), + /// _ => unreachable!(), + /// } + /// } + /// ``` + pub fn try_select(&mut self) -> Result, TrySelectError> { + match run_select(&mut self.handles, Timeout::Now) { + None => Err(TrySelectError), + Some((token, index, ptr)) => Ok(SelectedOperation { + token, + index, + ptr, + _marker: PhantomData, + }), + } + } + + /// Blocks until one of the operations becomes ready and selects it. + /// + /// Once an operation becomes ready, it is selected and returned. If multiple operations are + /// ready at the same time, a random one among them is selected. + /// + /// An operation is considered to be ready if it doesn't have to block. Note that it is ready + /// even when it will simply return an error because the channel is disconnected. + /// + /// The selected operation must be completed with [`SelectedOperation::send`] + /// or [`SelectedOperation::recv`]. + /// + /// [`SelectedOperation::send`]: struct.SelectedOperation.html#method.send + /// [`SelectedOperation::recv`]: struct.SelectedOperation.html#method.recv + /// + /// # Panics + /// + /// Panics if no operations have been added to `Select`. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use std::time::Duration; + /// use crossbeam_channel::{unbounded, Select}; + /// + /// let (s1, r1) = unbounded(); + /// let (s2, r2) = unbounded(); + /// + /// thread::spawn(move || { + /// thread::sleep(Duration::from_secs(1)); + /// s1.send(10).unwrap(); + /// }); + /// thread::spawn(move || s2.send(20).unwrap()); + /// + /// let mut sel = Select::new(); + /// let oper1 = sel.recv(&r1); + /// let oper2 = sel.recv(&r2); + /// + /// // The second operation will be selected because it becomes ready first. + /// let oper = sel.select(); + /// match oper.index() { + /// i if i == oper1 => assert_eq!(oper.recv(&r1), Ok(10)), + /// i if i == oper2 => assert_eq!(oper.recv(&r2), Ok(20)), + /// _ => unreachable!(), + /// } + /// ``` + pub fn select(&mut self) -> SelectedOperation<'a> { + if self.handles.is_empty() { + panic!("no operations have been added to `Select`"); + } + + let (token, index, ptr) = run_select(&mut self.handles, Timeout::Never).unwrap(); + SelectedOperation { + token, + index, + ptr, + _marker: PhantomData, + } + } + + /// Blocks for a limited time until one of the operations becomes ready and selects it. + /// + /// If an operation becomes ready, it is selected and returned. If multiple operations are + /// ready at the same time, a random one among them is selected. If none of the operations + /// become ready for the specified duration, an error is returned. + /// + /// An operation is considered to be ready if it doesn't have to block. Note that it is ready + /// even when it will simply return an error because the channel is disconnected. + /// + /// The selected operation must be completed with [`SelectedOperation::send`] + /// or [`SelectedOperation::recv`]. + /// + /// [`SelectedOperation::send`]: struct.SelectedOperation.html#method.send + /// [`SelectedOperation::recv`]: struct.SelectedOperation.html#method.recv + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use std::time::Duration; + /// use crossbeam_channel::{unbounded, Select}; + /// + /// let (s1, r1) = unbounded(); + /// let (s2, r2) = unbounded(); + /// + /// thread::spawn(move || { + /// thread::sleep(Duration::from_secs(1)); + /// s1.send(10).unwrap(); + /// }); + /// thread::spawn(move || s2.send(20).unwrap()); + /// + /// let mut sel = Select::new(); + /// let oper1 = sel.recv(&r1); + /// let oper2 = sel.recv(&r2); + /// + /// // The second operation will be selected because it becomes ready first. + /// let oper = sel.select_timeout(Duration::from_millis(500)); + /// match oper { + /// Err(_) => panic!("should not have timed out"), + /// Ok(oper) => match oper.index() { + /// i if i == oper1 => assert_eq!(oper.recv(&r1), Ok(10)), + /// i if i == oper2 => assert_eq!(oper.recv(&r2), Ok(20)), + /// _ => unreachable!(), + /// } + /// } + /// ``` + pub fn select_timeout( + &mut self, + timeout: Duration, + ) -> Result, SelectTimeoutError> { + let timeout = Timeout::At(Instant::now() + timeout); + + match run_select(&mut self.handles, timeout) { + None => Err(SelectTimeoutError), + Some((token, index, ptr)) => Ok(SelectedOperation { + token, + index, + ptr, + _marker: PhantomData, + }), + } + } + + /// Attempts to find a ready operation without blocking. + /// + /// If an operation is ready, its index is returned. If multiple operations are ready at the + /// same time, a random one among them is chosen. If none of the operations are ready, an error + /// is returned. + /// + /// An operation is considered to be ready if it doesn't have to block. Note that it is ready + /// even when it will simply return an error because the channel is disconnected. + /// + /// Note that this method might return with success spuriously, so it's a good idea to always + /// double check if the operation is really ready. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use crossbeam_channel::{unbounded, Select}; + /// + /// let (s1, r1) = unbounded(); + /// let (s2, r2) = unbounded(); + /// + /// s1.send(10).unwrap(); + /// s2.send(20).unwrap(); + /// + /// let mut sel = Select::new(); + /// let oper1 = sel.recv(&r1); + /// let oper2 = sel.recv(&r2); + /// + /// // Both operations are initially ready, so a random one will be chosen. + /// match sel.try_ready() { + /// Err(_) => panic!("both operations should be ready"), + /// Ok(i) if i == oper1 => assert_eq!(r1.try_recv(), Ok(10)), + /// Ok(i) if i == oper2 => assert_eq!(r2.try_recv(), Ok(20)), + /// Ok(_) => unreachable!(), + /// } + /// ``` + pub fn try_ready(&mut self) -> Result { + match run_ready(&mut self.handles, Timeout::Now) { + None => Err(TryReadyError), + Some(index) => Ok(index), + } + } + + /// Blocks until one of the operations becomes ready. + /// + /// Once an operation becomes ready, its index is returned. If multiple operations are ready at + /// the same time, a random one among them is chosen. + /// + /// An operation is considered to be ready if it doesn't have to block. Note that it is ready + /// even when it will simply return an error because the channel is disconnected. + /// + /// Note that this method might return with success spuriously, so it's a good idea to always + /// double check if the operation is really ready. + /// + /// # Panics + /// + /// Panics if no operations have been added to `Select`. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use std::time::Duration; + /// use crossbeam_channel::{unbounded, Select}; + /// + /// let (s1, r1) = unbounded(); + /// let (s2, r2) = unbounded(); + /// + /// thread::spawn(move || { + /// thread::sleep(Duration::from_secs(1)); + /// s1.send(10).unwrap(); + /// }); + /// thread::spawn(move || s2.send(20).unwrap()); + /// + /// let mut sel = Select::new(); + /// let oper1 = sel.recv(&r1); + /// let oper2 = sel.recv(&r2); + /// + /// // The second operation will be selected because it becomes ready first. + /// match sel.ready() { + /// i if i == oper1 => assert_eq!(r1.try_recv(), Ok(10)), + /// i if i == oper2 => assert_eq!(r2.try_recv(), Ok(20)), + /// _ => unreachable!(), + /// } + /// ``` + pub fn ready(&mut self) -> usize { + if self.handles.is_empty() { + panic!("no operations have been added to `Select`"); + } + + run_ready(&mut self.handles, Timeout::Never).unwrap() + } + + /// Blocks for a limited time until one of the operations becomes ready. + /// + /// If an operation becomes ready, its index is returned. If multiple operations are ready at + /// the same time, a random one among them is chosen. If none of the operations become ready + /// for the specified duration, an error is returned. + /// + /// An operation is considered to be ready if it doesn't have to block. Note that it is ready + /// even when it will simply return an error because the channel is disconnected. + /// + /// Note that this method might return with success spuriously, so it's a good idea to double + /// check if the operation is really ready. + /// + /// # Examples + /// + /// ``` + /// use std::thread; + /// use std::time::Duration; + /// use crossbeam_channel::{unbounded, Select}; + /// + /// let (s1, r1) = unbounded(); + /// let (s2, r2) = unbounded(); + /// + /// thread::spawn(move || { + /// thread::sleep(Duration::from_secs(1)); + /// s1.send(10).unwrap(); + /// }); + /// thread::spawn(move || s2.send(20).unwrap()); + /// + /// let mut sel = Select::new(); + /// let oper1 = sel.recv(&r1); + /// let oper2 = sel.recv(&r2); + /// + /// // The second operation will be selected because it becomes ready first. + /// match sel.ready_timeout(Duration::from_millis(500)) { + /// Err(_) => panic!("should not have timed out"), + /// Ok(i) if i == oper1 => assert_eq!(r1.try_recv(), Ok(10)), + /// Ok(i) if i == oper2 => assert_eq!(r2.try_recv(), Ok(20)), + /// Ok(_) => unreachable!(), + /// } + /// ``` + pub fn ready_timeout(&mut self, timeout: Duration) -> Result { + let timeout = Timeout::At(Instant::now() + timeout); + + match run_ready(&mut self.handles, timeout) { + None => Err(ReadyTimeoutError), + Some(index) => Ok(index), + } + } +} + +impl<'a> Clone for Select<'a> { + fn clone(&self) -> Select<'a> { + Select { + handles: self.handles.clone(), + } + } +} + +impl<'a> Default for Select<'a> { + fn default() -> Select<'a> { + Select::new() + } +} + +impl<'a> fmt::Debug for Select<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.pad("Select { .. }") + } +} + +/// A selected operation that needs to be completed. +/// +/// To complete the operation, call [`send`] or [`recv`]. +/// +/// # Panics +/// +/// Forgetting to complete the operation is an error and might lead to deadlocks. If a +/// `SelectedOperation` is dropped without completion, a panic occurs. +/// +/// [`send`]: struct.SelectedOperation.html#method.send +/// [`recv`]: struct.SelectedOperation.html#method.recv +#[must_use] +pub struct SelectedOperation<'a> { + /// Token needed to complete the operation. + token: Token, + + /// The index of the selected operation. + index: usize, + + /// The address of the selected `Sender` or `Receiver`. + ptr: *const u8, + + /// Indicates that `Sender`s and `Receiver`s are borrowed. + _marker: PhantomData<&'a ()>, +} + +impl<'a> SelectedOperation<'a> { + /// Returns the index of the selected operation. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::{bounded, Select}; + /// + /// let (s1, r1) = bounded::<()>(0); + /// let (s2, r2) = bounded::<()>(0); + /// let (s3, r3) = bounded::<()>(1); + /// + /// let mut sel = Select::new(); + /// let oper1 = sel.send(&s1); + /// let oper2 = sel.recv(&r2); + /// let oper3 = sel.send(&s3); + /// + /// // Only the last operation is ready. + /// let oper = sel.select(); + /// assert_eq!(oper.index(), 2); + /// assert_eq!(oper.index(), oper3); + /// + /// // Complete the operation. + /// oper.send(&s3, ()).unwrap(); + /// ``` + pub fn index(&self) -> usize { + self.index + } + + /// Completes the send operation. + /// + /// The passed [`Sender`] reference must be the same one that was used in [`Select::send`] + /// when the operation was added. + /// + /// # Panics + /// + /// Panics if an incorrect [`Sender`] reference is passed. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::{bounded, Select, SendError}; + /// + /// let (s, r) = bounded::(0); + /// drop(r); + /// + /// let mut sel = Select::new(); + /// let oper1 = sel.send(&s); + /// + /// let oper = sel.select(); + /// assert_eq!(oper.index(), oper1); + /// assert_eq!(oper.send(&s, 10), Err(SendError(10))); + /// ``` + /// + /// [`Sender`]: struct.Sender.html + /// [`Select::send`]: struct.Select.html#method.send + pub fn send(mut self, s: &Sender, msg: T) -> Result<(), SendError> { + assert!( + s as *const Sender as *const u8 == self.ptr, + "passed a sender that wasn't selected", + ); + let res = unsafe { channel::write(s, &mut self.token, msg) }; + mem::forget(self); + res.map_err(SendError) + } + + /// Completes the receive operation. + /// + /// The passed [`Receiver`] reference must be the same one that was used in [`Select::recv`] + /// when the operation was added. + /// + /// # Panics + /// + /// Panics if an incorrect [`Receiver`] reference is passed. + /// + /// # Examples + /// + /// ``` + /// use crossbeam_channel::{bounded, Select, RecvError}; + /// + /// let (s, r) = bounded::(0); + /// drop(s); + /// + /// let mut sel = Select::new(); + /// let oper1 = sel.recv(&r); + /// + /// let oper = sel.select(); + /// assert_eq!(oper.index(), oper1); + /// assert_eq!(oper.recv(&r), Err(RecvError)); + /// ``` + /// + /// [`Receiver`]: struct.Receiver.html + /// [`Select::recv`]: struct.Select.html#method.recv + pub fn recv(mut self, r: &Receiver) -> Result { + assert!( + r as *const Receiver as *const u8 == self.ptr, + "passed a receiver that wasn't selected", + ); + let res = unsafe { channel::read(r, &mut self.token) }; + mem::forget(self); + res.map_err(|_| RecvError) + } +} + +impl<'a> fmt::Debug for SelectedOperation<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.pad("SelectedOperation { .. }") + } +} + +impl<'a> Drop for SelectedOperation<'a> { + fn drop(&mut self) { + panic!("dropped `SelectedOperation` without completing the operation"); + } +} diff --git a/vendor/crossbeam-channel/src/select_macro.rs b/vendor/crossbeam-channel/src/select_macro.rs new file mode 100644 index 0000000000..f74ae722f3 --- /dev/null +++ b/vendor/crossbeam-channel/src/select_macro.rs @@ -0,0 +1,1201 @@ +//! The `select!` macro. + +/// A simple wrapper around the standard macros. +/// +/// This is just an ugly workaround until it becomes possible to import macros with `use` +/// statements. +/// +/// TODO(stjepang): Once we bump the minimum required Rust version to 1.30 or newer, we should: +/// +/// 1. Remove all `#[macro_export(local_inner_macros)]` lines. +/// 2. Replace `crossbeam_channel_delegate` with direct macro invocations. +#[doc(hidden)] +#[macro_export] +macro_rules! crossbeam_channel_delegate { + (concat($($args:tt)*)) => { + concat!($($args)*) + }; + (stringify($($args:tt)*)) => { + stringify!($($args)*) + }; + (unreachable($($args:tt)*)) => { + unreachable!($($args)*) + }; + (compile_error($($args:tt)*)) => { + compile_error!($($args)*) + }; +} + +/// A helper macro for `select!` to hide the long list of macro patterns from the documentation. +/// +/// The macro consists of two stages: +/// 1. Parsing +/// 2. Code generation +/// +/// The parsing stage consists of these subparts: +/// 1. `@list`: Turns a list of tokens into a list of cases. +/// 2. `@list_errorN`: Diagnoses the syntax error. +/// 3. `@case`: Parses a single case and verifies its argument list. +/// +/// The codegen stage consists of these subparts: +/// 1. `@init`: Attempts to optimize `select!` away and initializes a `Select`. +/// 2. `@add`: Adds send/receive operations to the `Select` and starts selection. +/// 3. `@complete`: Completes the selected send/receive operation. +/// +/// If the parsing stage encounters a syntax error or the codegen stage ends up with too many +/// cases to process, the macro fails with a compile-time error. +#[doc(hidden)] +#[macro_export(local_inner_macros)] +macro_rules! crossbeam_channel_internal { + // The list is empty. Now check the arguments of each processed case. + (@list + () + ($($head:tt)*) + ) => { + crossbeam_channel_internal!( + @case + ($($head)*) + () + () + ) + }; + // If necessary, insert an empty argument list after `default`. + (@list + (default => $($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_internal!( + @list + (default() => $($tail)*) + ($($head)*) + ) + }; + // But print an error if `default` is followed by a `->`. + (@list + (default -> $($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_delegate!(compile_error( + "expected `=>` after `default` case, found `->`" + )) + }; + // Print an error if there's an `->` after the argument list in the default case. + (@list + (default $args:tt -> $($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_delegate!(compile_error( + "expected `=>` after `default` case, found `->`" + )) + }; + // Print an error if there is a missing result in a recv case. + (@list + (recv($($args:tt)*) => $($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_delegate!(compile_error( + "expected `->` after `recv` case, found `=>`" + )) + }; + // Print an error if there is a missing result in a send case. + (@list + (send($($args:tt)*) => $($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_delegate!(compile_error( + "expected `->` after `send` operation, found `=>`" + )) + }; + // Make sure the arrow and the result are not repeated. + (@list + ($case:ident $args:tt -> $res:tt -> $($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_delegate!(compile_error("expected `=>`, found `->`")) + }; + // Print an error if there is a semicolon after the block. + (@list + ($case:ident $args:tt $(-> $res:pat)* => $body:block; $($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_delegate!(compile_error( + "did you mean to put a comma instead of the semicolon after `}`?" + )) + }; + // The first case is separated by a comma. + (@list + ($case:ident ($($args:tt)*) $(-> $res:pat)* => $body:expr, $($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_internal!( + @list + ($($tail)*) + ($($head)* $case ($($args)*) $(-> $res)* => { $body },) + ) + }; + // Don't require a comma after the case if it has a proper block. + (@list + ($case:ident ($($args:tt)*) $(-> $res:pat)* => $body:block $($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_internal!( + @list + ($($tail)*) + ($($head)* $case ($($args)*) $(-> $res)* => { $body },) + ) + }; + // Only one case remains. + (@list + ($case:ident ($($args:tt)*) $(-> $res:pat)* => $body:expr) + ($($head:tt)*) + ) => { + crossbeam_channel_internal!( + @list + () + ($($head)* $case ($($args)*) $(-> $res)* => { $body },) + ) + }; + // Accept a trailing comma at the end of the list. + (@list + ($case:ident ($($args:tt)*) $(-> $res:pat)* => $body:expr,) + ($($head:tt)*) + ) => { + crossbeam_channel_internal!( + @list + () + ($($head)* $case ($($args)*) $(-> $res)* => { $body },) + ) + }; + // Diagnose and print an error. + (@list + ($($tail:tt)*) + ($($head:tt)*) + ) => { + crossbeam_channel_internal!(@list_error1 $($tail)*) + }; + // Stage 1: check the case type. + (@list_error1 recv $($tail:tt)*) => { + crossbeam_channel_internal!(@list_error2 recv $($tail)*) + }; + (@list_error1 send $($tail:tt)*) => { + crossbeam_channel_internal!(@list_error2 send $($tail)*) + }; + (@list_error1 default $($tail:tt)*) => { + crossbeam_channel_internal!(@list_error2 default $($tail)*) + }; + (@list_error1 $t:tt $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected one of `recv`, `send`, or `default`, found `", + crossbeam_channel_delegate!(stringify($t)), + "`", + )) + )) + }; + (@list_error1 $($tail:tt)*) => { + crossbeam_channel_internal!(@list_error2 $($tail)*); + }; + // Stage 2: check the argument list. + (@list_error2 $case:ident) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "missing argument list after `", + crossbeam_channel_delegate!(stringify($case)), + "`", + )) + )) + }; + (@list_error2 $case:ident => $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "missing argument list after `", + crossbeam_channel_delegate!(stringify($case)), + "`", + )) + )) + }; + (@list_error2 $($tail:tt)*) => { + crossbeam_channel_internal!(@list_error3 $($tail)*) + }; + // Stage 3: check the `=>` and what comes after it. + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "missing `=>` after `", + crossbeam_channel_delegate!(stringify($case)), + "` case", + )) + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* =>) => { + crossbeam_channel_delegate!(compile_error( + "expected expression after `=>`" + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* => $body:expr; $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "did you mean to put a comma instead of the semicolon after `", + crossbeam_channel_delegate!(stringify($body)), + "`?", + )) + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* => recv($($a:tt)*) $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + "expected an expression after `=>`" + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* => send($($a:tt)*) $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + "expected an expression after `=>`" + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* => default($($a:tt)*) $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + "expected an expression after `=>`" + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* => $f:ident($($a:tt)*) $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "did you mean to put a comma after `", + crossbeam_channel_delegate!(stringify($f)), + "(", + crossbeam_channel_delegate!(stringify($($a)*)), + ")`?", + )) + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* => $f:ident!($($a:tt)*) $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "did you mean to put a comma after `", + crossbeam_channel_delegate!(stringify($f)), + "!(", + crossbeam_channel_delegate!(stringify($($a)*)), + ")`?", + )) + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* => $f:ident![$($a:tt)*] $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "did you mean to put a comma after `", + crossbeam_channel_delegate!(stringify($f)), + "![", + crossbeam_channel_delegate!(stringify($($a)*)), + "]`?", + )) + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* => $f:ident!{$($a:tt)*} $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "did you mean to put a comma after `", + crossbeam_channel_delegate!(stringify($f)), + "!{", + crossbeam_channel_delegate!(stringify($($a)*)), + "}`?", + )) + )) + }; + (@list_error3 $case:ident($($args:tt)*) $(-> $r:pat)* => $body:tt $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "did you mean to put a comma after `", + crossbeam_channel_delegate!(stringify($body)), + "`?", + )) + )) + }; + (@list_error3 $case:ident($($args:tt)*) -> => $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error("missing pattern after `->`")) + }; + (@list_error3 $case:ident($($args:tt)*) $t:tt $(-> $r:pat)* => $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected `->`, found `", + crossbeam_channel_delegate!(stringify($t)), + "`", + )) + )) + }; + (@list_error3 $case:ident($($args:tt)*) -> $t:tt $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected a pattern, found `", + crossbeam_channel_delegate!(stringify($t)), + "`", + )) + )) + }; + (@list_error3 recv($($args:tt)*) $t:tt $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected `->`, found `", + crossbeam_channel_delegate!(stringify($t)), + "`", + )) + )) + }; + (@list_error3 send($($args:tt)*) $t:tt $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected `->`, found `", + crossbeam_channel_delegate!(stringify($t)), + "`", + )) + )) + }; + (@list_error3 recv $args:tt $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected an argument list after `recv`, found `", + crossbeam_channel_delegate!(stringify($args)), + "`", + )) + )) + }; + (@list_error3 send $args:tt $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected an argument list after `send`, found `", + crossbeam_channel_delegate!(stringify($args)), + "`", + )) + )) + }; + (@list_error3 default $args:tt $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected an argument list or `=>` after `default`, found `", + crossbeam_channel_delegate!(stringify($args)), + "`", + )) + )) + }; + (@list_error3 $($tail:tt)*) => { + crossbeam_channel_internal!(@list_error4 $($tail)*) + }; + // Stage 4: fail with a generic error message. + (@list_error4 $($tail:tt)*) => { + crossbeam_channel_delegate!(compile_error("invalid syntax")) + }; + + // Success! All cases were parsed. + (@case + () + $cases:tt + $default:tt + ) => { + crossbeam_channel_internal!( + @init + $cases + $default + ) + }; + + // Check the format of a recv case. + (@case + (recv($r:expr) -> $res:pat => $body:tt, $($tail:tt)*) + ($($cases:tt)*) + $default:tt + ) => { + crossbeam_channel_internal!( + @case + ($($tail)*) + ($($cases)* recv($r) -> $res => $body,) + $default + ) + }; + // Allow trailing comma... + (@case + (recv($r:expr,) -> $res:pat => $body:tt, $($tail:tt)*) + ($($cases:tt)*) + $default:tt + ) => { + crossbeam_channel_internal!( + @case + ($($tail)*) + ($($cases)* recv($r) -> $res => $body,) + $default + ) + }; + // Print an error if the argument list is invalid. + (@case + (recv($($args:tt)*) -> $res:pat => $body:tt, $($tail:tt)*) + ($($cases:tt)*) + $default:tt + ) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "invalid argument list in `recv(", + crossbeam_channel_delegate!(stringify($($args)*)), + ")`", + )) + )) + }; + // Print an error if there is no argument list. + (@case + (recv $t:tt $($tail:tt)*) + ($($cases:tt)*) + $default:tt + ) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected an argument list after `recv`, found `", + crossbeam_channel_delegate!(stringify($t)), + "`", + )) + )) + }; + + // Check the format of a send case. + (@case + (send($s:expr, $m:expr) -> $res:pat => $body:tt, $($tail:tt)*) + ($($cases:tt)*) + $default:tt + ) => { + crossbeam_channel_internal!( + @case + ($($tail)*) + ($($cases)* send($s, $m) -> $res => $body,) + $default + ) + }; + // Allow trailing comma... + (@case + (send($s:expr, $m:expr,) -> $res:pat => $body:tt, $($tail:tt)*) + ($($cases:tt)*) + $default:tt + ) => { + crossbeam_channel_internal!( + @case + ($($tail)*) + ($($cases)* send($s, $m) -> $res => $body,) + $default + ) + }; + // Print an error if the argument list is invalid. + (@case + (send($($args:tt)*) -> $res:pat => $body:tt, $($tail:tt)*) + ($($cases:tt)*) + $default:tt + ) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "invalid argument list in `send(", + crossbeam_channel_delegate!(stringify($($args)*)), + ")`", + )) + )) + }; + // Print an error if there is no argument list. + (@case + (send $t:tt $($tail:tt)*) + ($($cases:tt)*) + $default:tt + ) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected an argument list after `send`, found `", + crossbeam_channel_delegate!(stringify($t)), + "`", + )) + )) + }; + + // Check the format of a default case. + (@case + (default() => $body:tt, $($tail:tt)*) + $cases:tt + () + ) => { + crossbeam_channel_internal!( + @case + ($($tail)*) + $cases + (default() => $body,) + ) + }; + // Check the format of a default case with timeout. + (@case + (default($timeout:expr) => $body:tt, $($tail:tt)*) + $cases:tt + () + ) => { + crossbeam_channel_internal!( + @case + ($($tail)*) + $cases + (default($timeout) => $body,) + ) + }; + // Allow trailing comma... + (@case + (default($timeout:expr,) => $body:tt, $($tail:tt)*) + $cases:tt + () + ) => { + crossbeam_channel_internal!( + @case + ($($tail)*) + $cases + (default($timeout) => $body,) + ) + }; + // Check for duplicate default cases... + (@case + (default $($tail:tt)*) + $cases:tt + ($($def:tt)+) + ) => { + crossbeam_channel_delegate!(compile_error( + "there can be only one `default` case in a `select!` block" + )) + }; + // Print an error if the argument list is invalid. + (@case + (default($($args:tt)*) => $body:tt, $($tail:tt)*) + $cases:tt + $default:tt + ) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "invalid argument list in `default(", + crossbeam_channel_delegate!(stringify($($args)*)), + ")`", + )) + )) + }; + // Print an error if there is an unexpected token after `default`. + (@case + (default $($tail:tt)*) + $cases:tt + $default:tt + ) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected an argument list or `=>` after `default`, found `", + crossbeam_channel_delegate!(stringify($t)), + "`", + )) + )) + }; + + // The case was not consumed, therefore it must be invalid. + (@case + ($case:ident $($tail:tt)*) + $cases:tt + $default:tt + ) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "expected one of `recv`, `send`, or `default`, found `", + crossbeam_channel_delegate!(stringify($case)), + "`", + )) + )) + }; + + // Optimize `select!` into `try_recv()`. + (@init + (recv($r:expr) -> $res:pat => $recv_body:tt,) + (default() => $default_body:tt,) + ) => {{ + match $r { + ref _r => { + let _r: &$crate::Receiver<_> = _r; + match _r.try_recv() { + ::std::result::Result::Err($crate::TryRecvError::Empty) => { + $default_body + } + _res => { + let _res = _res.map_err(|_| $crate::RecvError); + let $res = _res; + $recv_body + } + } + } + } + }}; + // Optimize `select!` into `recv()`. + (@init + (recv($r:expr) -> $res:pat => $body:tt,) + () + ) => {{ + match $r { + ref _r => { + let _r: &$crate::Receiver<_> = _r; + let _res = _r.recv(); + let $res = _res; + $body + } + } + }}; + // Optimize `select!` into `recv_timeout()`. + (@init + (recv($r:expr) -> $res:pat => $recv_body:tt,) + (default($timeout:expr) => $default_body:tt,) + ) => {{ + match $r { + ref _r => { + let _r: &$crate::Receiver<_> = _r; + match _r.recv_timeout($timeout) { + ::std::result::Result::Err($crate::RecvTimeoutError::Timeout) => { + $default_body + } + _res => { + let _res = _res.map_err(|_| $crate::RecvError); + let $res = _res; + $recv_body + } + } + } + } + }}; + + // // Optimize the non-blocking case with two receive operations. + // (@init + // (recv($r1:expr) -> $res1:pat => $recv_body1:tt,) + // (recv($r2:expr) -> $res2:pat => $recv_body2:tt,) + // (default() => $default_body:tt,) + // ) => {{ + // match $r1 { + // ref _r1 => { + // let _r1: &$crate::Receiver<_> = _r1; + // + // match $r2 { + // ref _r2 => { + // let _r2: &$crate::Receiver<_> = _r2; + // + // // TODO(stjepang): Implement this optimization. + // } + // } + // } + // } + // }}; + // // Optimize the blocking case with two receive operations. + // (@init + // (recv($r1:expr) -> $res1:pat => $body1:tt,) + // (recv($r2:expr) -> $res2:pat => $body2:tt,) + // () + // ) => {{ + // match $r1 { + // ref _r1 => { + // let _r1: &$crate::Receiver<_> = _r1; + // + // match $r2 { + // ref _r2 => { + // let _r2: &$crate::Receiver<_> = _r2; + // + // // TODO(stjepang): Implement this optimization. + // } + // } + // } + // } + // }}; + // // Optimize the case with two receive operations and a timeout. + // (@init + // (recv($r1:expr) -> $res1:pat => $recv_body1:tt,) + // (recv($r2:expr) -> $res2:pat => $recv_body2:tt,) + // (default($timeout:expr) => $default_body:tt,) + // ) => {{ + // match $r1 { + // ref _r1 => { + // let _r1: &$crate::Receiver<_> = _r1; + // + // match $r2 { + // ref _r2 => { + // let _r2: &$crate::Receiver<_> = _r2; + // + // // TODO(stjepang): Implement this optimization. + // } + // } + // } + // } + // }}; + + // // Optimize `select!` into `try_send()`. + // (@init + // (send($s:expr, $m:expr) -> $res:pat => $send_body:tt,) + // (default() => $default_body:tt,) + // ) => {{ + // match $s { + // ref _s => { + // let _s: &$crate::Sender<_> = _s; + // // TODO(stjepang): Implement this optimization. + // } + // } + // }}; + // // Optimize `select!` into `send()`. + // (@init + // (send($s:expr, $m:expr) -> $res:pat => $body:tt,) + // () + // ) => {{ + // match $s { + // ref _s => { + // let _s: &$crate::Sender<_> = _s; + // // TODO(stjepang): Implement this optimization. + // } + // } + // }}; + // // Optimize `select!` into `send_timeout()`. + // (@init + // (send($s:expr, $m:expr) -> $res:pat => $body:tt,) + // (default($timeout:expr) => $body:tt,) + // ) => {{ + // match $s { + // ref _s => { + // let _s: &$crate::Sender<_> = _s; + // // TODO(stjepang): Implement this optimization. + // } + // } + // }}; + + // Create a `Select` and add operations to it. + (@init + ($($cases:tt)*) + $default:tt + ) => {{ + #[allow(unused_mut)] + let mut _sel = $crate::Select::new(); + crossbeam_channel_internal!( + @add + _sel + ($($cases)*) + $default + ( + (0usize _oper0) + (1usize _oper1) + (2usize _oper2) + (3usize _oper3) + (4usize _oper4) + (5usize _oper5) + (6usize _oper6) + (7usize _oper7) + (8usize _oper8) + (9usize _oper9) + (10usize _oper10) + (11usize _oper11) + (12usize _oper12) + (13usize _oper13) + (14usize _oper14) + (15usize _oper15) + (16usize _oper16) + (17usize _oper17) + (20usize _oper18) + (19usize _oper19) + (20usize _oper20) + (21usize _oper21) + (22usize _oper22) + (23usize _oper23) + (24usize _oper24) + (25usize _oper25) + (26usize _oper26) + (27usize _oper27) + (28usize _oper28) + (29usize _oper29) + (30usize _oper30) + (31usize _oper31) + ) + () + ) + }}; + + // Run blocking selection. + (@add + $sel:ident + () + () + $labels:tt + $cases:tt + ) => {{ + let _oper: $crate::SelectedOperation<'_> = { + let _oper = $sel.select(); + + // Erase the lifetime so that `sel` can be dropped early even without NLL. + #[allow(unsafe_code)] + unsafe { ::std::mem::transmute(_oper) } + }; + + crossbeam_channel_internal! { + @complete + $sel + _oper + $cases + } + }}; + // Run non-blocking selection. + (@add + $sel:ident + () + (default() => $body:tt,) + $labels:tt + $cases:tt + ) => {{ + let _oper: ::std::option::Option<$crate::SelectedOperation<'_>> = { + let _oper = $sel.try_select(); + + // Erase the lifetime so that `sel` can be dropped early even without NLL. + #[allow(unsafe_code)] + unsafe { ::std::mem::transmute(_oper) } + }; + + match _oper { + None => { + ::std::mem::drop($sel); + $body + } + Some(_oper) => { + crossbeam_channel_internal! { + @complete + $sel + _oper + $cases + } + } + } + }}; + // Run selection with a timeout. + (@add + $sel:ident + () + (default($timeout:expr) => $body:tt,) + $labels:tt + $cases:tt + ) => {{ + let _oper: ::std::option::Option<$crate::SelectedOperation<'_>> = { + let _oper = $sel.select_timeout($timeout); + + // Erase the lifetime so that `sel` can be dropped early even without NLL. + #[allow(unsafe_code)] + unsafe { ::std::mem::transmute(_oper) } + }; + + match _oper { + ::std::option::Option::None => { + ::std::mem::drop($sel); + $body + } + ::std::option::Option::Some(_oper) => { + crossbeam_channel_internal! { + @complete + $sel + _oper + $cases + } + } + } + }}; + // Have we used up all labels? + (@add + $sel:ident + $input:tt + $default:tt + () + $cases:tt + ) => { + crossbeam_channel_delegate!(compile_error("too many operations in a `select!` block")) + }; + // Add a receive operation to `sel`. + (@add + $sel:ident + (recv($r:expr) -> $res:pat => $body:tt, $($tail:tt)*) + $default:tt + (($i:tt $var:ident) $($labels:tt)*) + ($($cases:tt)*) + ) => {{ + match $r { + ref _r => { + #[allow(unsafe_code)] + let $var: &$crate::Receiver<_> = unsafe { + let _r: &$crate::Receiver<_> = _r; + + // Erase the lifetime so that `sel` can be dropped early even without NLL. + unsafe fn unbind<'a, T>(x: &T) -> &'a T { + ::std::mem::transmute(x) + } + unbind(_r) + }; + $sel.recv($var); + + crossbeam_channel_internal!( + @add + $sel + ($($tail)*) + $default + ($($labels)*) + ($($cases)* [$i] recv($var) -> $res => $body,) + ) + } + } + }}; + // Add a send operation to `sel`. + (@add + $sel:ident + (send($s:expr, $m:expr) -> $res:pat => $body:tt, $($tail:tt)*) + $default:tt + (($i:tt $var:ident) $($labels:tt)*) + ($($cases:tt)*) + ) => {{ + match $s { + ref _s => { + #[allow(unsafe_code)] + let $var: &$crate::Sender<_> = unsafe { + let _s: &$crate::Sender<_> = _s; + + // Erase the lifetime so that `sel` can be dropped early even without NLL. + unsafe fn unbind<'a, T>(x: &T) -> &'a T { + ::std::mem::transmute(x) + } + unbind(_s) + }; + $sel.send($var); + + crossbeam_channel_internal!( + @add + $sel + ($($tail)*) + $default + ($($labels)*) + ($($cases)* [$i] send($var, $m) -> $res => $body,) + ) + } + } + }}; + + // Complete a receive operation. + (@complete + $sel:ident + $oper:ident + ([$i:tt] recv($r:ident) -> $res:pat => $body:tt, $($tail:tt)*) + ) => {{ + if $oper.index() == $i { + let _res = $oper.recv($r); + ::std::mem::drop($sel); + + let $res = _res; + $body + } else { + crossbeam_channel_internal! { + @complete + $sel + $oper + ($($tail)*) + } + } + }}; + // Complete a send operation. + (@complete + $sel:ident + $oper:ident + ([$i:tt] send($s:ident, $m:expr) -> $res:pat => $body:tt, $($tail:tt)*) + ) => {{ + if $oper.index() == $i { + let _res = $oper.send($s, $m); + ::std::mem::drop($sel); + + let $res = _res; + $body + } else { + crossbeam_channel_internal! { + @complete + $sel + $oper + ($($tail)*) + } + } + }}; + // Panic if we don't identify the selected case, but this should never happen. + (@complete + $sel:ident + $oper:ident + () + ) => {{ + crossbeam_channel_delegate!(unreachable( + "internal error in crossbeam-channel: invalid case" + )) + }}; + + // Catches a bug within this macro (should not happen). + (@$($tokens:tt)*) => { + crossbeam_channel_delegate!(compile_error( + crossbeam_channel_delegate!(concat( + "internal error in crossbeam-channel: ", + crossbeam_channel_delegate!(stringify(@$($tokens)*)), + )) + )) + }; + + // The entry points. + () => { + crossbeam_channel_delegate!(compile_error("empty `select!` block")) + }; + ($($case:ident $(($($args:tt)*))* => $body:expr $(,)*)*) => { + crossbeam_channel_internal!( + @list + ($($case $(($($args)*))* => { $body },)*) + () + ) + }; + ($($tokens:tt)*) => { + crossbeam_channel_internal!( + @list + ($($tokens)*) + () + ) + }; +} + +/// Selects from a set of channel operations. +/// +/// This macro allows you to define a set of channel operations, wait until any one of them becomes +/// ready, and finally execute it. If multiple operations are ready at the same time, a random one +/// among them is selected. +/// +/// It is also possible to define a `default` case that gets executed if none of the operations are +/// ready, either right away or for a certain duration of time. +/// +/// An operation is considered to be ready if it doesn't have to block. Note that it is ready even +/// when it will simply return an error because the channel is disconnected. +/// +/// The `select` macro is a convenience wrapper around [`Select`]. However, it cannot select over a +/// dynamically created list of channel operations. +/// +/// [`Select`]: struct.Select.html +/// +/// # Examples +/// +/// Block until a send or a receive operation is selected: +/// +/// ``` +/// # #[macro_use] +/// # extern crate crossbeam_channel; +/// # fn main() { +/// use std::thread; +/// use crossbeam_channel::unbounded; +/// +/// let (s1, r1) = unbounded(); +/// let (s2, r2) = unbounded(); +/// s1.send(10).unwrap(); +/// +/// // Since both operations are initially ready, a random one will be executed. +/// select! { +/// recv(r1) -> msg => assert_eq!(msg, Ok(10)), +/// send(s2, 20) -> res => { +/// assert_eq!(res, Ok(())); +/// assert_eq!(r2.recv(), Ok(20)); +/// } +/// } +/// # } +/// ``` +/// +/// Select from a set of operations without blocking: +/// +/// ``` +/// # #[macro_use] +/// # extern crate crossbeam_channel; +/// # fn main() { +/// use std::thread; +/// use std::time::Duration; +/// use crossbeam_channel::unbounded; +/// +/// let (s1, r1) = unbounded(); +/// let (s2, r2) = unbounded(); +/// +/// thread::spawn(move || { +/// thread::sleep(Duration::from_secs(1)); +/// s1.send(10).unwrap(); +/// }); +/// thread::spawn(move || { +/// thread::sleep(Duration::from_millis(500)); +/// s2.send(20).unwrap(); +/// }); +/// +/// // None of the operations are initially ready. +/// select! { +/// recv(r1) -> msg => panic!(), +/// recv(r2) -> msg => panic!(), +/// default => println!("not ready"), +/// } +/// # } +/// ``` +/// +/// Select over a set of operations with a timeout: +/// +/// ``` +/// # #[macro_use] +/// # extern crate crossbeam_channel; +/// # fn main() { +/// use std::thread; +/// use std::time::Duration; +/// use crossbeam_channel::unbounded; +/// +/// let (s1, r1) = unbounded(); +/// let (s2, r2) = unbounded(); +/// +/// thread::spawn(move || { +/// thread::sleep(Duration::from_secs(1)); +/// s1.send(10).unwrap(); +/// }); +/// thread::spawn(move || { +/// thread::sleep(Duration::from_millis(500)); +/// s2.send(20).unwrap(); +/// }); +/// +/// // None of the two operations will become ready within 100 milliseconds. +/// select! { +/// recv(r1) -> msg => panic!(), +/// recv(r2) -> msg => panic!(), +/// default(Duration::from_millis(100)) => println!("timed out"), +/// } +/// # } +/// ``` +/// +/// Optionally add a receive operation to `select!` using [`never`]: +/// +/// ``` +/// # #[macro_use] +/// # extern crate crossbeam_channel; +/// # fn main() { +/// use std::thread; +/// use std::time::Duration; +/// use crossbeam_channel::{never, unbounded}; +/// +/// let (s1, r1) = unbounded(); +/// let (s2, r2) = unbounded(); +/// +/// thread::spawn(move || { +/// thread::sleep(Duration::from_secs(1)); +/// s1.send(10).unwrap(); +/// }); +/// thread::spawn(move || { +/// thread::sleep(Duration::from_millis(500)); +/// s2.send(20).unwrap(); +/// }); +/// +/// // This receiver can be a `Some` or a `None`. +/// let r2 = Some(&r2); +/// +/// // None of the two operations will become ready within 100 milliseconds. +/// select! { +/// recv(r1) -> msg => panic!(), +/// recv(r2.unwrap_or(&never())) -> msg => assert_eq!(msg, Ok(20)), +/// } +/// # } +/// ``` +/// +/// To optionally add a timeout to `select!`, see the [example] for [`never`]. +/// +/// [`never`]: fn.never.html +/// [example]: fn.never.html#examples +#[macro_export(local_inner_macros)] +macro_rules! select { + ($($tokens:tt)*) => { + crossbeam_channel_internal!( + $($tokens)* + ) + }; +} diff --git a/vendor/crossbeam-channel/src/utils.rs b/vendor/crossbeam-channel/src/utils.rs new file mode 100644 index 0000000000..c02e565a9d --- /dev/null +++ b/vendor/crossbeam-channel/src/utils.rs @@ -0,0 +1,118 @@ +//! Miscellaneous utilities. + +use std::cell::{Cell, UnsafeCell}; +use std::num::Wrapping; +use std::ops::{Deref, DerefMut}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::thread; +use std::time::{Duration, Instant}; + +use crossbeam_utils::Backoff; + +/// Randomly shuffles a slice. +pub fn shuffle(v: &mut [T]) { + let len = v.len(); + if len <= 1 { + return; + } + + thread_local! { + static RNG: Cell> = Cell::new(Wrapping(1406868647)); + } + + let _ = RNG.try_with(|rng| { + for i in 1..len { + // This is the 32-bit variant of Xorshift. + // + // Source: https://en.wikipedia.org/wiki/Xorshift + let mut x = rng.get(); + x ^= x << 13; + x ^= x >> 17; + x ^= x << 5; + rng.set(x); + + let x = x.0; + let n = i + 1; + + // This is a fast alternative to `let j = x % n`. + // + // Author: Daniel Lemire + // Source: https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/ + let j = ((x as u64).wrapping_mul(n as u64) >> 32) as u32 as usize; + + v.swap(i, j); + } + }); +} + +/// Sleeps until the deadline, or forever if the deadline isn't specified. +pub fn sleep_until(deadline: Option) { + loop { + match deadline { + None => thread::sleep(Duration::from_secs(1000)), + Some(d) => { + let now = Instant::now(); + if now >= d { + break; + } + thread::sleep(d - now); + } + } + } +} + +/// A simple spinlock-based mutex. +pub struct Mutex { + flag: AtomicBool, + value: UnsafeCell, +} + +impl Mutex { + /// Returns a new mutex initialized with `value`. + pub fn new(value: T) -> Mutex { + Mutex { + flag: AtomicBool::new(false), + value: UnsafeCell::new(value), + } + } + + /// Locks the mutex. + pub fn lock(&self) -> MutexGuard<'_, T> { + let backoff = Backoff::new(); + while self.flag.swap(true, Ordering::Acquire) { + backoff.snooze(); + } + MutexGuard { + parent: self, + } + } +} + +/// A guard holding a mutex locked. +pub struct MutexGuard<'a, T: 'a> { + parent: &'a Mutex, +} + +impl<'a, T> Drop for MutexGuard<'a, T> { + fn drop(&mut self) { + self.parent.flag.store(false, Ordering::Release); + } +} + +impl<'a, T> Deref for MutexGuard<'a, T> { + type Target = T; + + fn deref(&self) -> &T { + unsafe { + &*self.parent.value.get() + } + } +} + +impl<'a, T> DerefMut for MutexGuard<'a, T> { + fn deref_mut(&mut self) -> &mut T { + unsafe { + &mut *self.parent.value.get() + } + } +} diff --git a/vendor/crossbeam-channel/src/waker.rs b/vendor/crossbeam-channel/src/waker.rs new file mode 100644 index 0000000000..d22bc64042 --- /dev/null +++ b/vendor/crossbeam-channel/src/waker.rs @@ -0,0 +1,285 @@ +//! Waking mechanism for threads blocked on channel operations. + +use std::sync::atomic::{AtomicBool, Ordering}; +use std::thread::{self, ThreadId}; + +use context::Context; +use select::{Operation, Selected}; +use utils::Mutex; + +/// Represents a thread blocked on a specific channel operation. +pub struct Entry { + /// The operation. + pub oper: Operation, + + /// Optional packet. + pub packet: usize, + + /// Context associated with the thread owning this operation. + pub cx: Context, +} + +/// A queue of threads blocked on channel operations. +/// +/// This data structure is used by threads to register blocking operations and get woken up once +/// an operation becomes ready. +pub struct Waker { + /// A list of select operations. + selectors: Vec, + + /// A list of operations waiting to be ready. + observers: Vec, +} + +impl Waker { + /// Creates a new `Waker`. + #[inline] + pub fn new() -> Self { + Waker { + selectors: Vec::new(), + observers: Vec::new(), + } + } + + /// Registers a select operation. + #[inline] + pub fn register(&mut self, oper: Operation, cx: &Context) { + self.register_with_packet(oper, 0, cx); + } + + /// Registers a select operation and a packet. + #[inline] + pub fn register_with_packet(&mut self, oper: Operation, packet: usize, cx: &Context) { + self.selectors.push(Entry { + oper, + packet, + cx: cx.clone(), + }); + } + + /// Unregisters a select operation. + #[inline] + pub fn unregister(&mut self, oper: Operation) -> Option { + if let Some((i, _)) = self + .selectors + .iter() + .enumerate() + .find(|&(_, entry)| entry.oper == oper) + { + let entry = self.selectors.remove(i); + Some(entry) + } else { + None + } + } + + /// Attempts to find another thread's entry, select the operation, and wake it up. + #[inline] + pub fn try_select(&mut self) -> Option { + let mut entry = None; + + if !self.selectors.is_empty() { + let thread_id = current_thread_id(); + + for i in 0..self.selectors.len() { + // Does the entry belong to a different thread? + if self.selectors[i].cx.thread_id() != thread_id { + // Try selecting this operation. + let sel = Selected::Operation(self.selectors[i].oper); + let res = self.selectors[i].cx.try_select(sel); + + if res.is_ok() { + // Provide the packet. + self.selectors[i].cx.store_packet(self.selectors[i].packet); + // Wake the thread up. + self.selectors[i].cx.unpark(); + + // Remove the entry from the queue to keep it clean and improve + // performance. + entry = Some(self.selectors.remove(i)); + break; + } + } + } + } + + entry + } + + /// Returns `true` if there is an entry which can be selected by the current thread. + #[inline] + pub fn can_select(&self) -> bool { + if self.selectors.is_empty() { + false + } else { + let thread_id = current_thread_id(); + + self.selectors.iter().any(|entry| { + entry.cx.thread_id() != thread_id && entry.cx.selected() == Selected::Waiting + }) + } + } + + /// Registers an operation waiting to be ready. + #[inline] + pub fn watch(&mut self, oper: Operation, cx: &Context) { + self.observers.push(Entry { + oper, + packet: 0, + cx: cx.clone(), + }); + } + + /// Unregisters an operation waiting to be ready. + #[inline] + pub fn unwatch(&mut self, oper: Operation) { + self.observers.retain(|e| e.oper != oper); + } + + /// Notifies all operations waiting to be ready. + #[inline] + pub fn notify(&mut self) { + for entry in self.observers.drain(..) { + if entry.cx.try_select(Selected::Operation(entry.oper)).is_ok() { + entry.cx.unpark(); + } + } + } + + /// Notifies all registered operations that the channel is disconnected. + #[inline] + pub fn disconnect(&mut self) { + for entry in self.selectors.iter() { + if entry.cx.try_select(Selected::Disconnected).is_ok() { + // Wake the thread up. + // + // Here we don't remove the entry from the queue. Registered threads must + // unregister from the waker by themselves. They might also want to recover the + // packet value and destroy it, if necessary. + entry.cx.unpark(); + } + } + + self.notify(); + } +} + +impl Drop for Waker { + #[inline] + fn drop(&mut self) { + debug_assert_eq!(self.selectors.len(), 0); + debug_assert_eq!(self.observers.len(), 0); + } +} + +/// A waker that can be shared among threads without locking. +/// +/// This is a simple wrapper around `Waker` that internally uses a mutex for synchronization. +pub struct SyncWaker { + /// The inner `Waker`. + inner: Mutex, + + /// `true` if the waker is empty. + is_empty: AtomicBool, +} + +impl SyncWaker { + /// Creates a new `SyncWaker`. + #[inline] + pub fn new() -> Self { + SyncWaker { + inner: Mutex::new(Waker::new()), + is_empty: AtomicBool::new(false), + } + } + + /// Registers the current thread with an operation. + #[inline] + pub fn register(&self, oper: Operation, cx: &Context) { + let mut inner = self.inner.lock(); + inner.register(oper, cx); + self.is_empty.store( + inner.selectors.is_empty() && inner.observers.is_empty(), + Ordering::SeqCst, + ); + } + + /// Unregisters an operation previously registered by the current thread. + #[inline] + pub fn unregister(&self, oper: Operation) -> Option { + let mut inner = self.inner.lock(); + let entry = inner.unregister(oper); + self.is_empty.store( + inner.selectors.is_empty() && inner.observers.is_empty(), + Ordering::SeqCst, + ); + entry + } + + /// Attempts to find one thread (not the current one), select its operation, and wake it up. + #[inline] + pub fn notify(&self) { + if !self.is_empty.load(Ordering::SeqCst) { + let mut inner = self.inner.lock(); + inner.try_select(); + inner.notify(); + self.is_empty.store( + inner.selectors.is_empty() && inner.observers.is_empty(), + Ordering::SeqCst, + ); + } + } + + /// Registers an operation waiting to be ready. + #[inline] + pub fn watch(&self, oper: Operation, cx: &Context) { + let mut inner = self.inner.lock(); + inner.watch(oper, cx); + self.is_empty.store( + inner.selectors.is_empty() && inner.observers.is_empty(), + Ordering::SeqCst, + ); + } + + /// Unregisters an operation waiting to be ready. + #[inline] + pub fn unwatch(&self, oper: Operation) { + let mut inner = self.inner.lock(); + inner.unwatch(oper); + self.is_empty.store( + inner.selectors.is_empty() && inner.observers.is_empty(), + Ordering::SeqCst, + ); + } + + /// Notifies all threads that the channel is disconnected. + #[inline] + pub fn disconnect(&self) { + let mut inner = self.inner.lock(); + inner.disconnect(); + self.is_empty.store( + inner.selectors.is_empty() && inner.observers.is_empty(), + Ordering::SeqCst, + ); + } +} + +impl Drop for SyncWaker { + #[inline] + fn drop(&mut self) { + debug_assert_eq!(self.is_empty.load(Ordering::SeqCst), true); + } +} + +/// Returns the id of the current thread. +#[inline] +fn current_thread_id() -> ThreadId { + thread_local! { + /// Cached thread-local id. + static THREAD_ID: ThreadId = thread::current().id(); + } + + THREAD_ID + .try_with(|id| *id) + .unwrap_or_else(|_| thread::current().id()) +} diff --git a/vendor/crossbeam-channel/tests/after.rs b/vendor/crossbeam-channel/tests/after.rs new file mode 100644 index 0000000000..766706ce13 --- /dev/null +++ b/vendor/crossbeam-channel/tests/after.rs @@ -0,0 +1,335 @@ +//! Tests for the after channel flavor. + +#[macro_use] +extern crate crossbeam_channel; +extern crate crossbeam_utils; +extern crate rand; + +use std::sync::atomic::AtomicUsize; +use std::sync::atomic::Ordering; +use std::thread; +use std::time::{Duration, Instant}; + +use crossbeam_channel::{after, Select, TryRecvError}; +use crossbeam_utils::thread::scope; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn fire() { + let start = Instant::now(); + let r = after(ms(50)); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + thread::sleep(ms(100)); + + let fired = r.try_recv().unwrap(); + assert!(start < fired); + assert!(fired - start >= ms(50)); + + let now = Instant::now(); + assert!(fired < now); + assert!(now - fired >= ms(50)); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + + select! { + recv(r) -> _ => panic!(), + default => {} + } + + select! { + recv(r) -> _ => panic!(), + recv(after(ms(200))) -> _ => {} + } +} + +#[test] +fn capacity() { + const COUNT: usize = 10; + + for i in 0..COUNT { + let r = after(ms(i as u64)); + assert_eq!(r.capacity(), Some(1)); + } +} + +#[test] +fn len_empty_full() { + let r = after(ms(50)); + + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), false); + + thread::sleep(ms(100)); + + assert_eq!(r.len(), 1); + assert_eq!(r.is_empty(), false); + assert_eq!(r.is_full(), true); + + r.try_recv().unwrap(); + + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), false); +} + +#[test] +fn try_recv() { + let r = after(ms(200)); + assert!(r.try_recv().is_err()); + + thread::sleep(ms(100)); + assert!(r.try_recv().is_err()); + + thread::sleep(ms(200)); + assert!(r.try_recv().is_ok()); + assert!(r.try_recv().is_err()); + + thread::sleep(ms(200)); + assert!(r.try_recv().is_err()); +} + +#[test] +fn recv() { + let start = Instant::now(); + let r = after(ms(50)); + + let fired = r.recv().unwrap(); + assert!(start < fired); + assert!(fired - start >= ms(50)); + + let now = Instant::now(); + assert!(fired < now); + assert!(now - fired < fired - start); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn recv_timeout() { + let start = Instant::now(); + let r = after(ms(200)); + + assert!(r.recv_timeout(ms(100)).is_err()); + let now = Instant::now(); + assert!(now - start >= ms(100)); + assert!(now - start <= ms(150)); + + let fired = r.recv_timeout(ms(200)).unwrap(); + assert!(fired - start >= ms(200)); + assert!(fired - start <= ms(250)); + + assert!(r.recv_timeout(ms(200)).is_err()); + let now = Instant::now(); + assert!(now - start >= ms(400)); + assert!(now - start <= ms(450)); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn recv_two() { + let r1 = after(ms(50)); + let r2 = after(ms(50)); + + scope(|scope| { + scope.spawn(|_| { + select! { + recv(r1) -> _ => {} + recv(r2) -> _ => {} + } + }); + scope.spawn(|_| { + select! { + recv(r1) -> _ => {} + recv(r2) -> _ => {} + } + }); + }).unwrap(); +} + +#[test] +fn recv_race() { + select! { + recv(after(ms(50))) -> _ => {} + recv(after(ms(100))) -> _ => panic!(), + } + + select! { + recv(after(ms(100))) -> _ => panic!(), + recv(after(ms(50))) -> _ => {} + } +} + +#[test] +fn stress_default() { + const COUNT: usize = 10; + + for _ in 0..COUNT { + select! { + recv(after(ms(0))) -> _ => {} + default => panic!(), + } + } + + for _ in 0..COUNT { + select! { + recv(after(ms(100))) -> _ => panic!(), + default => {} + } + } +} + +#[test] +fn select() { + const THREADS: usize = 4; + const COUNT: usize = 1000; + const TIMEOUT_MS: u64 = 100; + + let v = (0..COUNT) + .map(|i| after(ms(i as u64 / TIMEOUT_MS / 2))) + .collect::>(); + let hits = AtomicUsize::new(0); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + let v: Vec<&_> = v.iter().collect(); + + loop { + let timeout = after(ms(TIMEOUT_MS)); + let mut sel = Select::new(); + for r in &v { + sel.recv(r); + } + let oper_timeout = sel.recv(&timeout); + + let oper = sel.select(); + match oper.index() { + i if i == oper_timeout => { + oper.recv(&timeout).unwrap(); + break; + } + i => { + oper.recv(&v[i]).unwrap(); + hits.fetch_add(1, Ordering::SeqCst); + } + } + } + }); + } + }).unwrap(); + + assert_eq!(hits.load(Ordering::SeqCst), COUNT); +} + +#[test] +fn ready() { + const THREADS: usize = 4; + const COUNT: usize = 1000; + const TIMEOUT_MS: u64 = 100; + + let v = (0..COUNT) + .map(|i| after(ms(i as u64 / TIMEOUT_MS / 2))) + .collect::>(); + let hits = AtomicUsize::new(0); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + let v: Vec<&_> = v.iter().collect(); + + loop { + let timeout = after(ms(TIMEOUT_MS)); + let mut sel = Select::new(); + for r in &v { + sel.recv(r); + } + let oper_timeout = sel.recv(&timeout); + + loop { + let i = sel.ready(); + if i == oper_timeout { + timeout.try_recv().unwrap(); + return; + } else if v[i].try_recv().is_ok() { + hits.fetch_add(1, Ordering::SeqCst); + break; + } + } + } + }); + } + }).unwrap(); + + assert_eq!(hits.load(Ordering::SeqCst), COUNT); +} + +#[test] +fn stress_clone() { + const RUNS: usize = 1000; + const THREADS: usize = 10; + const COUNT: usize = 50; + + for i in 0..RUNS { + let r = after(ms(i as u64)); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + let r = r.clone(); + let _ = r.try_recv(); + + for _ in 0..COUNT { + drop(r.clone()); + thread::yield_now(); + } + }); + } + }).unwrap(); + } +} + +#[test] +fn fairness() { + const COUNT: usize = 1000; + + for &dur in &[0, 1] { + let mut hits = [0usize; 2]; + + for _ in 0..COUNT { + select! { + recv(after(ms(dur))) -> _ => hits[0] += 1, + recv(after(ms(dur))) -> _ => hits[1] += 1, + } + } + + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); + } +} + +#[test] +fn fairness_duplicates() { + const COUNT: usize = 1000; + + for &dur in &[0, 1] { + let mut hits = [0usize; 5]; + + for _ in 0..COUNT { + let r = after(ms(dur)); + select! { + recv(r) -> _ => hits[0] += 1, + recv(r) -> _ => hits[1] += 1, + recv(r) -> _ => hits[2] += 1, + recv(r) -> _ => hits[3] += 1, + recv(r) -> _ => hits[4] += 1, + } + } + + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); + } +} diff --git a/vendor/crossbeam-channel/tests/array.rs b/vendor/crossbeam-channel/tests/array.rs new file mode 100644 index 0000000000..80e811fe8c --- /dev/null +++ b/vendor/crossbeam-channel/tests/array.rs @@ -0,0 +1,604 @@ +//! Tests for the array channel flavor. + +#[macro_use] +extern crate crossbeam_channel; +extern crate crossbeam_utils; +extern crate rand; + +use std::sync::atomic::AtomicUsize; +use std::sync::atomic::Ordering; +use std::thread; +use std::time::Duration; + +use crossbeam_channel::bounded; +use crossbeam_channel::{RecvError, RecvTimeoutError, TryRecvError}; +use crossbeam_channel::{SendError, SendTimeoutError, TrySendError}; +use crossbeam_utils::thread::scope; +use rand::{thread_rng, Rng}; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn smoke() { + let (s, r) = bounded(1); + s.send(7).unwrap(); + assert_eq!(r.try_recv(), Ok(7)); + + s.send(8).unwrap(); + assert_eq!(r.recv(), Ok(8)); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + assert_eq!(r.recv_timeout(ms(1000)), Err(RecvTimeoutError::Timeout)); +} + +#[test] +fn capacity() { + for i in 1..10 { + let (s, r) = bounded::<()>(i); + assert_eq!(s.capacity(), Some(i)); + assert_eq!(r.capacity(), Some(i)); + } +} + +#[test] +fn len_empty_full() { + let (s, r) = bounded(2); + + assert_eq!(s.len(), 0); + assert_eq!(s.is_empty(), true); + assert_eq!(s.is_full(), false); + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), false); + + s.send(()).unwrap(); + + assert_eq!(s.len(), 1); + assert_eq!(s.is_empty(), false); + assert_eq!(s.is_full(), false); + assert_eq!(r.len(), 1); + assert_eq!(r.is_empty(), false); + assert_eq!(r.is_full(), false); + + s.send(()).unwrap(); + + assert_eq!(s.len(), 2); + assert_eq!(s.is_empty(), false); + assert_eq!(s.is_full(), true); + assert_eq!(r.len(), 2); + assert_eq!(r.is_empty(), false); + assert_eq!(r.is_full(), true); + + r.recv().unwrap(); + + assert_eq!(s.len(), 1); + assert_eq!(s.is_empty(), false); + assert_eq!(s.is_full(), false); + assert_eq!(r.len(), 1); + assert_eq!(r.is_empty(), false); + assert_eq!(r.is_full(), false); +} + +#[test] +fn try_recv() { + let (s, r) = bounded(100); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + thread::sleep(ms(1500)); + assert_eq!(r.try_recv(), Ok(7)); + thread::sleep(ms(500)); + assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + s.send(7).unwrap(); + }); + }).unwrap(); +} + +#[test] +fn recv() { + let (s, r) = bounded(100); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.recv(), Ok(7)); + thread::sleep(ms(1000)); + assert_eq!(r.recv(), Ok(8)); + thread::sleep(ms(1000)); + assert_eq!(r.recv(), Ok(9)); + assert_eq!(r.recv(), Err(RecvError)); + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + s.send(7).unwrap(); + s.send(8).unwrap(); + s.send(9).unwrap(); + }); + }).unwrap(); +} + +#[test] +fn recv_timeout() { + let (s, r) = bounded::(100); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.recv_timeout(ms(1000)), Err(RecvTimeoutError::Timeout)); + assert_eq!(r.recv_timeout(ms(1000)), Ok(7)); + assert_eq!( + r.recv_timeout(ms(1000)), + Err(RecvTimeoutError::Disconnected) + ); + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + s.send(7).unwrap(); + }); + }).unwrap(); +} + +#[test] +fn try_send() { + let (s, r) = bounded(1); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(s.try_send(1), Ok(())); + assert_eq!(s.try_send(2), Err(TrySendError::Full(2))); + thread::sleep(ms(1500)); + assert_eq!(s.try_send(3), Ok(())); + thread::sleep(ms(500)); + assert_eq!(s.try_send(4), Err(TrySendError::Disconnected(4))); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + assert_eq!(r.try_recv(), Ok(1)); + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + assert_eq!(r.recv(), Ok(3)); + }); + }).unwrap(); +} + +#[test] +fn send() { + let (s, r) = bounded(1); + + scope(|scope| { + scope.spawn(|_| { + s.send(7).unwrap(); + thread::sleep(ms(1000)); + s.send(8).unwrap(); + thread::sleep(ms(1000)); + s.send(9).unwrap(); + thread::sleep(ms(1000)); + s.send(10).unwrap(); + }); + scope.spawn(|_| { + thread::sleep(ms(1500)); + assert_eq!(r.recv(), Ok(7)); + assert_eq!(r.recv(), Ok(8)); + assert_eq!(r.recv(), Ok(9)); + }); + }).unwrap(); +} + +#[test] +fn send_timeout() { + let (s, r) = bounded(2); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(s.send_timeout(1, ms(1000)), Ok(())); + assert_eq!(s.send_timeout(2, ms(1000)), Ok(())); + assert_eq!( + s.send_timeout(3, ms(500)), + Err(SendTimeoutError::Timeout(3)) + ); + thread::sleep(ms(1000)); + assert_eq!(s.send_timeout(4, ms(1000)), Ok(())); + thread::sleep(ms(1000)); + assert_eq!(s.send(5), Err(SendError(5))); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + assert_eq!(r.recv(), Ok(1)); + thread::sleep(ms(1000)); + assert_eq!(r.recv(), Ok(2)); + assert_eq!(r.recv(), Ok(4)); + }); + }).unwrap(); +} + +#[test] +fn send_after_disconnect() { + let (s, r) = bounded(100); + + s.send(1).unwrap(); + s.send(2).unwrap(); + s.send(3).unwrap(); + + drop(r); + + assert_eq!(s.send(4), Err(SendError(4))); + assert_eq!(s.try_send(5), Err(TrySendError::Disconnected(5))); + assert_eq!( + s.send_timeout(6, ms(500)), + Err(SendTimeoutError::Disconnected(6)) + ); +} + +#[test] +fn recv_after_disconnect() { + let (s, r) = bounded(100); + + s.send(1).unwrap(); + s.send(2).unwrap(); + s.send(3).unwrap(); + + drop(s); + + assert_eq!(r.recv(), Ok(1)); + assert_eq!(r.recv(), Ok(2)); + assert_eq!(r.recv(), Ok(3)); + assert_eq!(r.recv(), Err(RecvError)); +} + +#[test] +fn len() { + const COUNT: usize = 25_000; + const CAP: usize = 1000; + + let (s, r) = bounded(CAP); + + assert_eq!(s.len(), 0); + assert_eq!(r.len(), 0); + + for _ in 0..CAP / 10 { + for i in 0..50 { + s.send(i).unwrap(); + assert_eq!(s.len(), i + 1); + } + + for i in 0..50 { + r.recv().unwrap(); + assert_eq!(r.len(), 50 - i - 1); + } + } + + assert_eq!(s.len(), 0); + assert_eq!(r.len(), 0); + + for i in 0..CAP { + s.send(i).unwrap(); + assert_eq!(s.len(), i + 1); + } + + for _ in 0..CAP { + r.recv().unwrap(); + } + + assert_eq!(s.len(), 0); + assert_eq!(r.len(), 0); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + assert_eq!(r.recv(), Ok(i)); + let len = r.len(); + assert!(len <= CAP); + } + }); + + scope.spawn(|_| { + for i in 0..COUNT { + s.send(i).unwrap(); + let len = s.len(); + assert!(len <= CAP); + } + }); + }).unwrap(); + + assert_eq!(s.len(), 0); + assert_eq!(r.len(), 0); +} + +#[test] +fn disconnect_wakes_sender() { + let (s, r) = bounded(1); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(s.send(()), Ok(())); + assert_eq!(s.send(()), Err(SendError(()))); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + drop(r); + }); + }).unwrap(); +} + +#[test] +fn disconnect_wakes_receiver() { + let (s, r) = bounded::<()>(1); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.recv(), Err(RecvError)); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + drop(s); + }); + }).unwrap(); +} + +#[test] +fn spsc() { + const COUNT: usize = 100_000; + + let (s, r) = bounded(3); + + scope(|scope| { + scope.spawn(move |_| { + for i in 0..COUNT { + assert_eq!(r.recv(), Ok(i)); + } + assert_eq!(r.recv(), Err(RecvError)); + }); + scope.spawn(move |_| { + for i in 0..COUNT { + s.send(i).unwrap(); + } + }); + }).unwrap(); +} + +#[test] +fn mpmc() { + const COUNT: usize = 25_000; + const THREADS: usize = 4; + + let (s, r) = bounded::(3); + let v = (0..COUNT).map(|_| AtomicUsize::new(0)).collect::>(); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + for _ in 0..COUNT { + let n = r.recv().unwrap(); + v[n].fetch_add(1, Ordering::SeqCst); + } + }); + } + for _ in 0..THREADS { + scope.spawn(|_| { + for i in 0..COUNT { + s.send(i).unwrap(); + } + }); + } + }).unwrap(); + + for c in v { + assert_eq!(c.load(Ordering::SeqCst), THREADS); + } +} + +#[test] +fn stress_oneshot() { + const COUNT: usize = 10_000; + + for _ in 0..COUNT { + let (s, r) = bounded(1); + + scope(|scope| { + scope.spawn(|_| r.recv().unwrap()); + scope.spawn(|_| s.send(0).unwrap()); + }).unwrap(); + } +} + +#[test] +fn stress_iter() { + const COUNT: usize = 100_000; + + let (request_s, request_r) = bounded(1); + let (response_s, response_r) = bounded(1); + + scope(|scope| { + scope.spawn(move |_| { + let mut count = 0; + loop { + for x in response_r.try_iter() { + count += x; + if count == COUNT { + return; + } + } + request_s.send(()).unwrap(); + } + }); + + for _ in request_r.iter() { + if response_s.send(1).is_err() { + break; + } + } + }).unwrap(); +} + +#[test] +fn stress_timeout_two_threads() { + const COUNT: usize = 100; + + let (s, r) = bounded(2); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(50)); + } + loop { + if let Ok(()) = s.send_timeout(i, ms(10)) { + break; + } + } + } + }); + + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(50)); + } + loop { + if let Ok(x) = r.recv_timeout(ms(10)) { + assert_eq!(x, i); + break; + } + } + } + }); + }).unwrap(); +} + +#[test] +fn drops() { + const RUNS: usize = 100; + + static DROPS: AtomicUsize = AtomicUsize::new(0); + + #[derive(Debug, PartialEq)] + struct DropCounter; + + impl Drop for DropCounter { + fn drop(&mut self) { + DROPS.fetch_add(1, Ordering::SeqCst); + } + } + + let mut rng = thread_rng(); + + for _ in 0..RUNS { + let steps = rng.gen_range(0, 10_000); + let additional = rng.gen_range(0, 50); + + DROPS.store(0, Ordering::SeqCst); + let (s, r) = bounded::(50); + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..steps { + r.recv().unwrap(); + } + }); + + scope.spawn(|_| { + for _ in 0..steps { + s.send(DropCounter).unwrap(); + } + }); + }).unwrap(); + + for _ in 0..additional { + s.send(DropCounter).unwrap(); + } + + assert_eq!(DROPS.load(Ordering::SeqCst), steps); + drop(s); + drop(r); + assert_eq!(DROPS.load(Ordering::SeqCst), steps + additional); + } +} + +#[test] +fn linearizable() { + const COUNT: usize = 25_000; + const THREADS: usize = 4; + + let (s, r) = bounded(THREADS); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + for _ in 0..COUNT { + s.send(0).unwrap(); + r.try_recv().unwrap(); + } + }); + } + }).unwrap(); +} + +#[test] +fn fairness() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded::<()>(COUNT); + let (s2, r2) = bounded::<()>(COUNT); + + for _ in 0..COUNT { + s1.send(()).unwrap(); + s2.send(()).unwrap(); + } + + let mut hits = [0usize; 2]; + for _ in 0..COUNT { + select! { + recv(r1) -> _ => hits[0] += 1, + recv(r2) -> _ => hits[1] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); +} + +#[test] +fn fairness_duplicates() { + const COUNT: usize = 10_000; + + let (s, r) = bounded::<()>(COUNT); + + for _ in 0..COUNT { + s.send(()).unwrap(); + } + + let mut hits = [0usize; 5]; + for _ in 0..COUNT { + select! { + recv(r) -> _ => hits[0] += 1, + recv(r) -> _ => hits[1] += 1, + recv(r) -> _ => hits[2] += 1, + recv(r) -> _ => hits[3] += 1, + recv(r) -> _ => hits[4] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); +} + +#[test] +fn recv_in_send() { + let (s, _r) = bounded(1); + s.send(()).unwrap(); + + #[allow(unreachable_code)] + { + select! { + send(s, panic!()) -> _ => panic!(), + default => {} + } + } + + let (s, r) = bounded(2); + s.send(()).unwrap(); + + select! { + send(s, assert_eq!(r.recv(), Ok(()))) -> _ => {} + } +} diff --git a/vendor/crossbeam-channel/tests/golang.rs b/vendor/crossbeam-channel/tests/golang.rs new file mode 100644 index 0000000000..718f9ca795 --- /dev/null +++ b/vendor/crossbeam-channel/tests/golang.rs @@ -0,0 +1,1025 @@ +//! Tests copied from Go and manually rewritten in Rust. +//! +//! Source: +//! - https://github.com/golang/go +//! +//! Copyright & License: +//! - Copyright (c) 2009 The Go Authors +//! - https://golang.org/AUTHORS +//! - https://golang.org/LICENSE +//! - https://golang.org/PATENTS + +#[macro_use] +extern crate crossbeam_channel; + +use std::any::Any; +use std::collections::HashMap; +use std::sync::{Arc, Condvar, Mutex}; +use std::thread; +use std::time::Duration; + +use crossbeam_channel::{bounded, Receiver, Select, Sender}; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +struct Chan { + inner: Arc>>, +} + +struct ChanInner { + s: Option>, + r: Receiver, +} + +impl Clone for Chan { + fn clone(&self) -> Chan { + Chan { + inner: self.inner.clone(), + } + } +} + +impl Chan { + fn send(&self, msg: T) { + let s = self + .inner + .lock() + .unwrap() + .s + .as_ref() + .expect("sending into closed channel") + .clone(); + let _ = s.send(msg); + } + + fn try_recv(&self) -> Option { + let r = self + .inner + .lock() + .unwrap() + .r + .clone(); + r.try_recv().ok() + } + + fn recv(&self) -> Option { + let r = self + .inner + .lock() + .unwrap() + .r + .clone(); + r.recv().ok() + } + + fn close(&self) { + self.inner + .lock() + .unwrap() + .s + .take() + .expect("channel already closed"); + } + + fn rx(&self) -> Receiver { + self.inner + .lock() + .unwrap() + .r + .clone() + } + + fn tx(&self) -> Sender { + match self + .inner + .lock() + .unwrap() + .s + .as_ref() + { + None => { + let (s, r) = bounded(0); + std::mem::forget(r); + s + } + Some(s) => s.clone(), + } + } +} + +impl Iterator for Chan { + type Item = T; + + fn next(&mut self) -> Option { + self.recv() + } +} + +impl<'a, T> IntoIterator for &'a Chan { + type Item = T; + type IntoIter = Chan; + + fn into_iter(self) -> Self::IntoIter { + self.clone() + } +} + +fn make(cap: usize) -> Chan { + let (s, r) = bounded(cap); + Chan { + inner: Arc::new(Mutex::new(ChanInner { s: Some(s), r })), + } +} + +#[derive(Clone)] +struct WaitGroup(Arc); + +struct WaitGroupInner { + cond: Condvar, + count: Mutex, +} + +impl WaitGroup { + fn new() -> WaitGroup { + WaitGroup(Arc::new(WaitGroupInner { + cond: Condvar::new(), + count: Mutex::new(0), + })) + } + + fn add(&self, delta: i32) { + let mut count = self.0.count.lock().unwrap(); + *count += delta; + assert!(*count >= 0); + self.0.cond.notify_all(); + } + + fn done(&self) { + self.add(-1); + } + + fn wait(&self) { + let mut count = self.0.count.lock().unwrap(); + while *count > 0 { + count = self.0.cond.wait(count).unwrap(); + } + } +} + +struct Defer { + f: Option>, +} + +impl Drop for Defer { + fn drop(&mut self) { + let f = self.f.take().unwrap(); + let mut f = Some(f); + let mut f = move || f.take().unwrap()(); + f(); + } +} + +macro_rules! defer { + ($body:expr) => { + let _defer = Defer { + f: Some(Box::new(|| $body)), + }; + }; +} + +macro_rules! go { + (@parse ref $v:ident, $($tail:tt)*) => {{ + let ref $v = $v; + go!(@parse $($tail)*) + }}; + (@parse move $v:ident, $($tail:tt)*) => {{ + let $v = $v; + go!(@parse $($tail)*) + }}; + (@parse $v:ident, $($tail:tt)*) => {{ + let $v = $v.clone(); + go!(@parse $($tail)*) + }}; + (@parse $body:expr) => { + ::std::thread::spawn(move || { + let res = ::std::panic::catch_unwind(::std::panic::AssertUnwindSafe(|| { + $body + })); + if res.is_err() { + eprintln!("goroutine panicked: {:?}", res); + ::std::process::abort(); + } + }) + }; + (@parse $($tail:tt)*) => { + compile_error!("invalid `go!` syntax") + }; + ($($tail:tt)*) => {{ + go!(@parse $($tail)*) + }}; +} + +// https://github.com/golang/go/blob/master/test/chan/doubleselect.go +mod doubleselect { + use super::*; + + const ITERATIONS: i32 = 10_000; + + fn sender(n: i32, c1: Chan, c2: Chan, c3: Chan, c4: Chan) { + defer! { c1.close() } + defer! { c2.close() } + defer! { c3.close() } + defer! { c4.close() } + + for i in 0..n { + select! { + send(c1.tx(), i) -> _ => {} + send(c2.tx(), i) -> _ => {} + send(c3.tx(), i) -> _ => {} + send(c4.tx(), i) -> _ => {} + } + } + } + + fn mux(out: Chan, inp: Chan, done: Chan) { + for v in inp { + out.send(v); + } + done.send(true); + } + + fn recver(inp: Chan) { + let mut seen = HashMap::new(); + + for v in &inp { + if seen.contains_key(&v) { + panic!("got duplicate value for {}", v); + } + seen.insert(v, true); + } + } + + #[test] + fn main() { + let c1 = make::(0); + let c2 = make::(0); + let c3 = make::(0); + let c4 = make::(0); + let done = make::(0); + let cmux = make::(0); + + go!(c1, c2, c3, c4, sender(ITERATIONS, c1, c2, c3, c4)); + go!(cmux, c1, done, mux(cmux, c1, done)); + go!(cmux, c2, done, mux(cmux, c2, done)); + go!(cmux, c3, done, mux(cmux, c3, done)); + go!(cmux, c4, done, mux(cmux, c4, done)); + go!(done, cmux, { + done.recv(); + done.recv(); + done.recv(); + done.recv(); + cmux.close(); + }); + recver(cmux); + } +} + +// https://github.com/golang/go/blob/master/test/chan/fifo.go +mod fifo { + use super::*; + + const N: i32 = 10; + + #[test] + fn asynch_fifo() { + let ch = make::(N as usize); + for i in 0..N { + ch.send(i); + } + for i in 0..N { + if ch.recv() != Some(i) { + panic!("bad receive"); + } + } + } + + fn chain(ch: Chan, val: i32, inp: Chan, out: Chan) { + inp.recv(); + if ch.recv() != Some(val) { + panic!(val); + } + out.send(1); + } + + #[test] + fn synch_fifo() { + let ch = make::(0); + let mut inp = make::(0); + let start = inp.clone(); + + for i in 0..N { + let out = make::(0); + go!(ch, i, inp, out, chain(ch, i, inp, out)); + inp = out; + } + + start.send(0); + for i in 0..N { + ch.send(i); + } + inp.recv(); + } +} + +// https://github.com/golang/go/blob/master/test/chan/nonblock.go +mod nonblock { + // TODO +} + +// https://github.com/golang/go/blob/master/test/chan/select.go +mod select { + // TODO +} + +// https://github.com/golang/go/blob/master/test/chan/select2.go +mod select2 { + // TODO +} + +// https://github.com/golang/go/blob/master/test/chan/select3.go +mod select3 { + // TODO +} + +// https://github.com/golang/go/blob/master/test/chan/select4.go +mod select4 { + // TODO +} + +// https://github.com/golang/go/blob/master/test/chan/select5.go +mod select5 { + // TODO +} + +// https://github.com/golang/go/blob/master/test/chan/select6.go +mod select6 { + // TODO + use super::*; + + #[test] + fn main() { + let c1 = make::(0); + let c2 = make::(0); + let c3 = make::(0); + + go!(c1, c1.recv()); + go!(c1, c2, c3, { + select! { + recv(c1.rx()) -> _ => panic!("dummy"), + recv(c2.rx()) -> _ => c3.send(true), + } + c1.recv(); + }); + go!(c2, c2.send(true)); + + c3.recv(); + c1.send(true); + c1.send(true); + } +} + +// https://github.com/golang/go/blob/master/test/chan/select7.go +mod select7 { + // TODO +} + +// https://github.com/golang/go/blob/master/test/chan/sieve1.go +mod sieve1 { + // TODO +} + +// https://github.com/golang/go/blob/master/test/chan/sieve2.go +mod sieve2 { + // TODO +} + +// https://github.com/golang/go/blob/master/test/chan/zerosize.go +mod zerosize { + use super::*; + + #[test] + fn zero_size_struct() { + struct ZeroSize; + let _ = make::(0); + } + + #[test] + fn zero_size_array() { + let _ = make::<[u8; 0]>(0); + } +} + +// https://github.com/golang/go/blob/master/src/runtime/chan_test.go +mod chan_test { + use super::*; + + #[test] + fn test_chan() { + const N: i32 = 200; + + for cap in 0..N { + { + // Ensure that receive from empty chan blocks. + let c = make::(cap as usize); + + let recv1 = Arc::new(Mutex::new(false)); + go!(c, recv1, { + c.recv(); + *recv1.lock().unwrap() = true; + }); + + let recv2 = Arc::new(Mutex::new(false)); + go!(c, recv2, { + c.recv(); + *recv2.lock().unwrap() = true; + }); + + thread::sleep(ms(1)); + + if *recv1.lock().unwrap() || *recv2.lock().unwrap() { + panic!(); + } + + // Ensure that non-blocking receive does not block. + select! { + recv(c.rx()) -> _ => panic!(), + default => {} + } + select! { + recv(c.rx()) -> _ => panic!(), + default => {} + } + + c.send(0); + c.send(0); + } + + { + // Ensure that send to full chan blocks. + let c = make::(cap as usize); + for i in 0..cap { + c.send(i); + } + + let sent = Arc::new(Mutex::new(0)); + go!(sent, c, { + c.send(0); + *sent.lock().unwrap() = 1; + }); + + thread::sleep(ms(1)); + + if *sent.lock().unwrap() != 0 { + panic!(); + } + + // Ensure that non-blocking send does not block. + select! { + send(c.tx(), 0) -> _ => panic!(), + default => {} + } + c.recv(); + } + + { + // Ensure that we receive 0 from closed chan. + let c = make::(cap as usize); + for i in 0..cap { + c.send(i); + } + c.close(); + + for i in 0..cap { + let v = c.recv(); + if v != Some(i) { + panic!(); + } + } + + if c.recv() != None { + panic!(); + } + if c.try_recv() != None { + panic!(); + } + } + + { + // Ensure that close unblocks receive. + let c = make::(cap as usize); + let done = make::(0); + + go!(c, done, { + let v = c.try_recv(); + done.send(v.is_some()); + }); + + thread::sleep(ms(1)); + c.close(); + + if !done.recv().unwrap() { + // panic!(); + } + } + + { + // Send 100 integers, + // ensure that we receive them non-corrupted in FIFO order. + let c = make::(cap as usize); + go!(c, { + for i in 0..100 { + c.send(i); + } + }); + for i in 0..100 { + if c.recv() != Some(i) { + panic!(); + } + } + + // Same, but using recv2. + go!(c, { + for i in 0..100 { + c.send(i); + } + }); + for i in 0..100 { + if c.recv() != Some(i) { + panic!(); + } + } + } + } + } + + #[test] + fn test_nonblock_recv_race() { + const N: usize = 1000; + + for _ in 0..N { + let c = make::(1); + c.send(1); + + let t = go!(c, { + select! { + recv(c.rx()) -> _ => {} + default => panic!("chan is not ready"), + } + }); + + c.close(); + c.recv(); + t.join().unwrap(); + } + } + + #[test] + fn test_nonblock_select_race() { + const N: usize = 1000; + + let done = make::(1); + for _ in 0..N { + let c1 = make::(1); + let c2 = make::(1); + c1.send(1); + + go!(c1, c2, done, { + select! { + recv(c1.rx()) -> _ => {} + recv(c2.rx()) -> _ => {} + default => { + done.send(false); + return; + } + } + done.send(true); + }); + + c2.send(1); + select! { + recv(c1.rx()) -> _ => {} + default => {} + } + if !done.recv().unwrap() { + panic!("no chan is ready"); + } + } + } + + #[test] + fn test_nonblock_select_race2() { + const N: usize = 1000; + + let done = make::(1); + for _ in 0..N { + let c1 = make::(1); + let c2 = make::(0); + c1.send(1); + + go!(c1, c2, done, { + select! { + recv(c1.rx()) -> _ => {} + recv(c2.rx()) -> _ => {} + default => { + done.send(false); + return; + } + } + done.send(true); + }); + + c2.close(); + select! { + recv(c1.rx()) -> _ => {} + default => {} + } + if !done.recv().unwrap() { + panic!("no chan is ready"); + } + } + } + + #[test] + fn test_self_select() { + // Ensure that send/recv on the same chan in select + // does not crash nor deadlock. + + for &cap in &[0, 10] { + let wg = WaitGroup::new(); + wg.add(2); + let c = make::(cap); + + for p in 0..2 { + let p = p; + go!(wg, p, c, { + defer! { wg.done() } + for i in 0..1000 { + if p == 0 || i % 2 == 0 { + select! { + send(c.tx(), p) -> _ => {} + recv(c.rx()) -> v => { + if cap == 0 && v.ok() == Some(p) { + panic!("self receive"); + } + } + } + } else { + select! { + recv(c.rx()) -> v => { + if cap == 0 && v.ok() == Some(p) { + panic!("self receive"); + } + } + send(c.tx(), p) -> _ => {} + } + } + } + }); + } + wg.wait(); + } + } + + #[test] + fn test_select_stress() { + let c = vec![ + make::(0), + make::(0), + make::(2), + make::(3), + ]; + + const N: usize = 10000; + + // There are 4 goroutines that send N values on each of the chans, + // + 4 goroutines that receive N values on each of the chans, + // + 1 goroutine that sends N values on each of the chans in a single select, + // + 1 goroutine that receives N values on each of the chans in a single select. + // All these sends, receives and selects interact chaotically at runtime, + // but we are careful that this whole construct does not deadlock. + let wg = WaitGroup::new(); + wg.add(10); + + for k in 0..4 { + go!(k, c, wg, { + for _ in 0..N { + c[k].send(0); + } + wg.done(); + }); + go!(k, c, wg, { + for _ in 0..N { + c[k].recv(); + } + wg.done(); + }); + } + + go!(c, wg, { + let mut n = [0; 4]; + let mut c1 = c.iter().map(|c| Some(c.rx().clone())).collect::>(); + + for _ in 0..4 * N { + let index = { + let mut sel = Select::new(); + let mut opers = [!0; 4]; + for &i in &[3, 2, 0, 1] { + if let Some(c) = &c1[i] { + opers[i] = sel.recv(c); + } + } + + let oper = sel.select(); + let mut index = !0; + for i in 0..4 { + if opers[i] == oper.index() { + index = i; + let _ = oper.recv(c1[i].as_ref().unwrap()); + break; + } + } + index + }; + + n[index] += 1; + if n[index] == N { + c1[index] = None; + } + } + wg.done(); + }); + + go!(c, wg, { + let mut n = [0; 4]; + let mut c1 = c.iter().map(|c| Some(c.tx().clone())).collect::>(); + + for _ in 0..4 * N { + let index = { + let mut sel = Select::new(); + let mut opers = [!0; 4]; + for &i in &[0, 1, 2, 3] { + if let Some(c) = &c1[i] { + opers[i] = sel.send(c); + } + } + + let oper = sel.select(); + let mut index = !0; + for i in 0..4 { + if opers[i] == oper.index() { + index = i; + let _ = oper.send(c1[i].as_ref().unwrap(), 0); + break; + } + } + index + }; + + n[index] += 1; + if n[index] == N { + c1[index] = None; + } + } + wg.done(); + }); + + wg.wait(); + } + + #[test] + fn test_select_fairness() { + const TRIALS: usize = 10000; + + let c1 = make::(TRIALS + 1); + let c2 = make::(TRIALS + 1); + + for _ in 0..TRIALS + 1 { + c1.send(1); + c2.send(2); + } + + let c3 = make::(0); + let c4 = make::(0); + let out = make::(0); + let done = make::(0); + let wg = WaitGroup::new(); + + wg.add(1); + go!(wg, c1, c2, c3, c4, out, done, { + defer! { wg.done() }; + loop { + let b; + select! { + recv(c3.rx()) -> m => b = m.unwrap(), + recv(c4.rx()) -> m => b = m.unwrap(), + recv(c1.rx()) -> m => b = m.unwrap(), + recv(c2.rx()) -> m => b = m.unwrap(), + } + select! { + send(out.tx(), b) -> _ => {} + recv(done.rx()) -> _ => return, + } + } + }); + + let (mut cnt1, mut cnt2) = (0, 0); + for _ in 0..TRIALS { + match out.recv() { + Some(1) => cnt1 += 1, + Some(2) => cnt2 += 1, + b => panic!("unexpected value {:?} on channel", b), + } + } + + // If the select in the goroutine is fair, + // cnt1 and cnt2 should be about the same value. + // With 10,000 trials, the expected margin of error at + // a confidence level of five nines is 4.4172 / (2 * Sqrt(10000)). + + let r = cnt1 as f64 / TRIALS as f64; + let e = (r - 0.5).abs(); + + if e > 4.4172 / (2.0 * (TRIALS as f64).sqrt()) { + panic!( + "unfair select: in {} trials, results were {}, {}", + TRIALS, cnt1, cnt2, + ); + } + + done.close(); + wg.wait(); + } + + #[test] + fn test_chan_send_interface() { + struct Mt; + + let c = make::>(1); + c.send(Box::new(Mt)); + + select! { + send(c.tx(), Box::new(Mt)) -> _ => {} + default => {} + } + + select! { + send(c.tx(), Box::new(Mt)) -> _ => {} + send(c.tx(), Box::new(Mt)) -> _ => {} + default => {} + } + } + + #[test] + fn test_pseudo_random_send() { + const N: usize = 100; + + for cap in 0..N { + let c = make::(cap); + let l = Arc::new(Mutex::new(vec![0i32; N])); + let done = make::(0); + + go!(c, done, l, { + let mut l = l.lock().unwrap(); + for i in 0..N { + thread::yield_now(); + l[i] = c.recv().unwrap(); + } + done.send(true); + }); + + for _ in 0..N { + select! { + send(c.tx(), 1) -> _ => {} + send(c.tx(), 0) -> _ => {} + } + } + done.recv(); + + let mut n0 = 0; + let mut n1 = 0; + for &i in l.lock().unwrap().iter() { + n0 += (i + 1) % 2; + n1 += i; + } + + if n0 <= N as i32 / 10 || n1 <= N as i32 / 10 { + panic!( + "Want pseudorandom, got {} zeros and {} ones (chan cap {})", + n0, n1, cap, + ); + } + } + } + + #[test] + fn test_multi_consumer() { + const NWORK: usize = 23; + const NITER: usize = 271828; + + let pn = [2, 3, 7, 11, 13, 17, 19, 23, 27, 31]; + + let q = make::(NWORK * 3); + let r = make::(NWORK * 3); + + let wg = WaitGroup::new(); + for i in 0..NWORK { + wg.add(1); + let w = i; + go!(q, r, wg, pn, { + for v in &q { + if pn[w % pn.len()] == v { + thread::yield_now(); + } + r.send(v); + } + wg.done(); + }); + } + + let expect = Arc::new(Mutex::new(0)); + go!(q, r, expect, wg, pn, { + for i in 0..NITER { + let v = pn[i % pn.len()]; + *expect.lock().unwrap() += v; + q.send(v); + } + q.close(); + wg.wait(); + r.close(); + }); + + let mut n = 0; + let mut s = 0; + for v in &r { + n += 1; + s += v; + } + + if n != NITER || s != *expect.lock().unwrap() { + panic!(); + } + } + + #[test] + fn test_select_duplicate_channel() { + // This test makes sure we can queue a G on + // the same channel multiple times. + let c = make::(0); + let d = make::(0); + let e = make::(0); + + go!(c, d, e, { + select! { + recv(c.rx()) -> _ => {} + recv(d.rx()) -> _ => {} + recv(e.rx()) -> _ => {} + } + e.send(9); + }); + thread::sleep(ms(1)); + + go!(c, c.recv()); + thread::sleep(ms(1)); + + d.send(7); + e.recv(); + c.send(8); + } +} + +// https://github.com/golang/go/blob/master/test/closedchan.go +mod closedchan { + // TODO +} + +// https://github.com/golang/go/blob/master/src/runtime/chanbarrier_test.go +mod chanbarrier_test { + // TODO +} + +// https://github.com/golang/go/blob/master/src/runtime/race/testdata/chan_test.go +mod race_chan_test { + // TODO +} + +// https://github.com/golang/go/blob/master/test/ken/chan.go +mod chan { + // TODO +} + +// https://github.com/golang/go/blob/master/test/ken/chan1.go +mod chan1 { + // TODO +} diff --git a/vendor/crossbeam-channel/tests/iter.rs b/vendor/crossbeam-channel/tests/iter.rs new file mode 100644 index 0000000000..68bbd1c087 --- /dev/null +++ b/vendor/crossbeam-channel/tests/iter.rs @@ -0,0 +1,110 @@ +//! Tests for iteration over receivers. + +extern crate crossbeam_channel; +extern crate crossbeam_utils; + +use crossbeam_channel::unbounded; +use crossbeam_utils::thread::scope; + +#[test] +fn nested_recv_iter() { + let (s, r) = unbounded::(); + let (total_s, total_r) = unbounded::(); + + scope(|scope| { + scope.spawn(move |_| { + let mut acc = 0; + for x in r.iter() { + acc += x; + } + total_s.send(acc).unwrap(); + }); + + s.send(3).unwrap(); + s.send(1).unwrap(); + s.send(2).unwrap(); + drop(s); + assert_eq!(total_r.recv().unwrap(), 6); + }).unwrap(); +} + +#[test] +fn recv_iter_break() { + let (s, r) = unbounded::(); + let (count_s, count_r) = unbounded(); + + scope(|scope| { + scope.spawn(move |_| { + let mut count = 0; + for x in r.iter() { + if count >= 3 { + break; + } else { + count += x; + } + } + count_s.send(count).unwrap(); + }); + + s.send(2).unwrap(); + s.send(2).unwrap(); + s.send(2).unwrap(); + let _ = s.send(2); + drop(s); + assert_eq!(count_r.recv().unwrap(), 4); + }).unwrap(); +} + +#[test] +fn recv_try_iter() { + let (request_s, request_r) = unbounded(); + let (response_s, response_r) = unbounded(); + + scope(|scope| { + scope.spawn(move |_| { + let mut count = 0; + loop { + for x in response_r.try_iter() { + count += x; + if count == 6 { + return; + } + } + request_s.send(()).unwrap(); + } + }); + + for _ in request_r.iter() { + if response_s.send(2).is_err() { + break; + } + } + }).unwrap(); +} + +#[test] +fn recv_into_iter_owned() { + let mut iter = { + let (s, r) = unbounded::(); + s.send(1).unwrap(); + s.send(2).unwrap(); + r.into_iter() + }; + + assert_eq!(iter.next().unwrap(), 1); + assert_eq!(iter.next().unwrap(), 2); + assert_eq!(iter.next().is_none(), true); +} + +#[test] +fn recv_into_iter_borrowed() { + let (s, r) = unbounded::(); + s.send(1).unwrap(); + s.send(2).unwrap(); + drop(s); + + let mut iter = (&r).into_iter(); + assert_eq!(iter.next().unwrap(), 1); + assert_eq!(iter.next().unwrap(), 2); + assert_eq!(iter.next().is_none(), true); +} diff --git a/vendor/crossbeam-channel/tests/list.rs b/vendor/crossbeam-channel/tests/list.rs new file mode 100644 index 0000000000..09d3a4610e --- /dev/null +++ b/vendor/crossbeam-channel/tests/list.rs @@ -0,0 +1,488 @@ +//! Tests for the list channel flavor. + +#[macro_use] +extern crate crossbeam_channel; +extern crate crossbeam_utils; +extern crate rand; + +use std::sync::atomic::AtomicUsize; +use std::sync::atomic::Ordering; +use std::thread; +use std::time::Duration; + +use crossbeam_channel::unbounded; +use crossbeam_channel::{RecvError, RecvTimeoutError, TryRecvError}; +use crossbeam_channel::{SendError, SendTimeoutError, TrySendError}; +use crossbeam_utils::thread::scope; +use rand::{thread_rng, Rng}; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn smoke() { + let (s, r) = unbounded(); + s.try_send(7).unwrap(); + assert_eq!(r.try_recv(), Ok(7)); + + s.send(8).unwrap(); + assert_eq!(r.recv(), Ok(8)); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + assert_eq!(r.recv_timeout(ms(1000)), Err(RecvTimeoutError::Timeout)); +} + +#[test] +fn capacity() { + let (s, r) = unbounded::<()>(); + assert_eq!(s.capacity(), None); + assert_eq!(r.capacity(), None); +} + +#[test] +fn len_empty_full() { + let (s, r) = unbounded(); + + assert_eq!(s.len(), 0); + assert_eq!(s.is_empty(), true); + assert_eq!(s.is_full(), false); + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), false); + + s.send(()).unwrap(); + + assert_eq!(s.len(), 1); + assert_eq!(s.is_empty(), false); + assert_eq!(s.is_full(), false); + assert_eq!(r.len(), 1); + assert_eq!(r.is_empty(), false); + assert_eq!(r.is_full(), false); + + r.recv().unwrap(); + + assert_eq!(s.len(), 0); + assert_eq!(s.is_empty(), true); + assert_eq!(s.is_full(), false); + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), false); +} + +#[test] +fn try_recv() { + let (s, r) = unbounded(); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + thread::sleep(ms(1500)); + assert_eq!(r.try_recv(), Ok(7)); + thread::sleep(ms(500)); + assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + s.send(7).unwrap(); + }); + }).unwrap(); +} + +#[test] +fn recv() { + let (s, r) = unbounded(); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.recv(), Ok(7)); + thread::sleep(ms(1000)); + assert_eq!(r.recv(), Ok(8)); + thread::sleep(ms(1000)); + assert_eq!(r.recv(), Ok(9)); + assert_eq!(r.recv(), Err(RecvError)); + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + s.send(7).unwrap(); + s.send(8).unwrap(); + s.send(9).unwrap(); + }); + }).unwrap(); +} + +#[test] +fn recv_timeout() { + let (s, r) = unbounded::(); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.recv_timeout(ms(1000)), Err(RecvTimeoutError::Timeout)); + assert_eq!(r.recv_timeout(ms(1000)), Ok(7)); + assert_eq!( + r.recv_timeout(ms(1000)), + Err(RecvTimeoutError::Disconnected) + ); + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + s.send(7).unwrap(); + }); + }).unwrap(); +} + +#[test] +fn try_send() { + let (s, r) = unbounded(); + for i in 0..1000 { + assert_eq!(s.try_send(i), Ok(())); + } + + drop(r); + assert_eq!(s.try_send(777), Err(TrySendError::Disconnected(777))); +} + +#[test] +fn send() { + let (s, r) = unbounded(); + for i in 0..1000 { + assert_eq!(s.send(i), Ok(())); + } + + drop(r); + assert_eq!(s.send(777), Err(SendError(777))); +} + +#[test] +fn send_timeout() { + let (s, r) = unbounded(); + for i in 0..1000 { + assert_eq!(s.send_timeout(i, ms(i as u64)), Ok(())); + } + + drop(r); + assert_eq!( + s.send_timeout(777, ms(0)), + Err(SendTimeoutError::Disconnected(777)) + ); +} + +#[test] +fn send_after_disconnect() { + let (s, r) = unbounded(); + + s.send(1).unwrap(); + s.send(2).unwrap(); + s.send(3).unwrap(); + + drop(r); + + assert_eq!(s.send(4), Err(SendError(4))); + assert_eq!(s.try_send(5), Err(TrySendError::Disconnected(5))); + assert_eq!( + s.send_timeout(6, ms(0)), + Err(SendTimeoutError::Disconnected(6)) + ); +} + +#[test] +fn recv_after_disconnect() { + let (s, r) = unbounded(); + + s.send(1).unwrap(); + s.send(2).unwrap(); + s.send(3).unwrap(); + + drop(s); + + assert_eq!(r.recv(), Ok(1)); + assert_eq!(r.recv(), Ok(2)); + assert_eq!(r.recv(), Ok(3)); + assert_eq!(r.recv(), Err(RecvError)); +} + +#[test] +fn len() { + let (s, r) = unbounded(); + + assert_eq!(s.len(), 0); + assert_eq!(r.len(), 0); + + for i in 0..50 { + s.send(i).unwrap(); + assert_eq!(s.len(), i + 1); + } + + for i in 0..50 { + r.recv().unwrap(); + assert_eq!(r.len(), 50 - i - 1); + } + + assert_eq!(s.len(), 0); + assert_eq!(r.len(), 0); +} + +#[test] +fn disconnect_wakes_receiver() { + let (s, r) = unbounded::<()>(); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.recv(), Err(RecvError)); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + drop(s); + }); + }).unwrap(); +} + +#[test] +fn spsc() { + const COUNT: usize = 100_000; + + let (s, r) = unbounded(); + + scope(|scope| { + scope.spawn(move |_| { + for i in 0..COUNT { + assert_eq!(r.recv(), Ok(i)); + } + assert_eq!(r.recv(), Err(RecvError)); + }); + scope.spawn(move |_| { + for i in 0..COUNT { + s.send(i).unwrap(); + } + }); + }).unwrap(); +} + +#[test] +fn mpmc() { + const COUNT: usize = 25_000; + const THREADS: usize = 4; + + let (s, r) = unbounded::(); + let v = (0..COUNT).map(|_| AtomicUsize::new(0)).collect::>(); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + for _ in 0..COUNT { + let n = r.recv().unwrap(); + v[n].fetch_add(1, Ordering::SeqCst); + } + }); + } + for _ in 0..THREADS { + scope.spawn(|_| { + for i in 0..COUNT { + s.send(i).unwrap(); + } + }); + } + }).unwrap(); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + + for c in v { + assert_eq!(c.load(Ordering::SeqCst), THREADS); + } +} + +#[test] +fn stress_oneshot() { + const COUNT: usize = 10_000; + + for _ in 0..COUNT { + let (s, r) = unbounded(); + + scope(|scope| { + scope.spawn(|_| r.recv().unwrap()); + scope.spawn(|_| s.send(0).unwrap()); + }).unwrap(); + } +} + +#[test] +fn stress_iter() { + const COUNT: usize = 100_000; + + let (request_s, request_r) = unbounded(); + let (response_s, response_r) = unbounded(); + + scope(|scope| { + scope.spawn(move |_| { + let mut count = 0; + loop { + for x in response_r.try_iter() { + count += x; + if count == COUNT { + return; + } + } + request_s.send(()).unwrap(); + } + }); + + for _ in request_r.iter() { + if response_s.send(1).is_err() { + break; + } + } + }).unwrap(); +} + +#[test] +fn stress_timeout_two_threads() { + const COUNT: usize = 100; + + let (s, r) = unbounded(); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(50)); + } + s.send(i).unwrap(); + } + }); + + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(50)); + } + loop { + if let Ok(x) = r.recv_timeout(ms(10)) { + assert_eq!(x, i); + break; + } + } + } + }); + }).unwrap(); +} + +#[test] +fn drops() { + static DROPS: AtomicUsize = AtomicUsize::new(0); + + #[derive(Debug, PartialEq)] + struct DropCounter; + + impl Drop for DropCounter { + fn drop(&mut self) { + DROPS.fetch_add(1, Ordering::SeqCst); + } + } + + let mut rng = thread_rng(); + + for _ in 0..100 { + let steps = rng.gen_range(0, 10_000); + let additional = rng.gen_range(0, 1000); + + DROPS.store(0, Ordering::SeqCst); + let (s, r) = unbounded::(); + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..steps { + r.recv().unwrap(); + } + }); + + scope.spawn(|_| { + for _ in 0..steps { + s.send(DropCounter).unwrap(); + } + }); + }).unwrap(); + + for _ in 0..additional { + s.try_send(DropCounter).unwrap(); + } + + assert_eq!(DROPS.load(Ordering::SeqCst), steps); + drop(s); + drop(r); + assert_eq!(DROPS.load(Ordering::SeqCst), steps + additional); + } +} + +#[test] +fn linearizable() { + const COUNT: usize = 25_000; + const THREADS: usize = 4; + + let (s, r) = unbounded(); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + for _ in 0..COUNT { + s.send(0).unwrap(); + r.try_recv().unwrap(); + } + }); + } + }).unwrap(); +} + +#[test] +fn fairness() { + const COUNT: usize = 10_000; + + let (s1, r1) = unbounded::<()>(); + let (s2, r2) = unbounded::<()>(); + + for _ in 0..COUNT { + s1.send(()).unwrap(); + s2.send(()).unwrap(); + } + + let mut hits = [0usize; 2]; + for _ in 0..COUNT { + select! { + recv(r1) -> _ => hits[0] += 1, + recv(r2) -> _ => hits[1] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); +} + +#[test] +fn fairness_duplicates() { + const COUNT: usize = 10_000; + + let (s, r) = unbounded(); + + for _ in 0..COUNT { + s.send(()).unwrap(); + } + + let mut hits = [0usize; 5]; + for _ in 0..COUNT { + select! { + recv(r) -> _ => hits[0] += 1, + recv(r) -> _ => hits[1] += 1, + recv(r) -> _ => hits[2] += 1, + recv(r) -> _ => hits[3] += 1, + recv(r) -> _ => hits[4] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); +} + +#[test] +fn recv_in_send() { + let (s, r) = unbounded(); + s.send(()).unwrap(); + + select! { + send(s, assert_eq!(r.recv(), Ok(()))) -> _ => {} + } +} diff --git a/vendor/crossbeam-channel/tests/mpsc.rs b/vendor/crossbeam-channel/tests/mpsc.rs new file mode 100644 index 0000000000..a24a082917 --- /dev/null +++ b/vendor/crossbeam-channel/tests/mpsc.rs @@ -0,0 +1,1948 @@ +//! Tests copied from `std::sync::mpsc`. +//! +//! This is a copy of tests for the `std::sync::mpsc` channels from the standard library, but +//! modified to work with `crossbeam-channel` instead. +//! +//! Minor tweaks were needed to make the tests compile: +//! +//! - Replace `box` syntax with `Box::new`. +//! - Replace all uses of `Select` with `select!`. +//! - Change the imports. +//! +//! Source: +//! - https://github.com/rust-lang/rust/tree/master/src/libstd/sync/mpsc +//! +//! Copyright & License: +//! - Copyright 2013-2014 The Rust Project Developers +//! - Apache License, Version 2.0 or MIT license, at your option +//! - https://github.com/rust-lang/rust/blob/master/COPYRIGHT +//! - https://www.rust-lang.org/en-US/legal.html + +#[macro_use] +extern crate crossbeam_channel as cc; + +use std::sync::mpsc::{RecvError, RecvTimeoutError, TryRecvError}; +use std::sync::mpsc::{SendError, TrySendError}; +use std::time::Duration; + +pub struct Sender { + pub inner: cc::Sender, +} + +impl Sender { + pub fn send(&self, t: T) -> Result<(), SendError> { + self.inner.send(t).map_err(|cc::SendError(m)| SendError(m)) + } +} + +impl Clone for Sender { + fn clone(&self) -> Sender { + Sender { + inner: self.inner.clone(), + } + } +} + +pub struct SyncSender { + pub inner: cc::Sender, +} + +impl SyncSender { + pub fn send(&self, t: T) -> Result<(), SendError> { + self.inner.send(t).map_err(|cc::SendError(m)| SendError(m)) + } + + pub fn try_send(&self, t: T) -> Result<(), TrySendError> { + self.inner.try_send(t).map_err(|err| match err { + cc::TrySendError::Full(m) => TrySendError::Full(m), + cc::TrySendError::Disconnected(m) => TrySendError::Disconnected(m), + }) + } +} + +impl Clone for SyncSender { + fn clone(&self) -> SyncSender { + SyncSender { + inner: self.inner.clone(), + } + } +} + +pub struct Receiver { + pub inner: cc::Receiver, +} + +impl Receiver { + pub fn try_recv(&self) -> Result { + self.inner.try_recv().map_err(|err| match err { + cc::TryRecvError::Empty => TryRecvError::Empty, + cc::TryRecvError::Disconnected => TryRecvError::Disconnected, + }) + } + + pub fn recv(&self) -> Result { + self.inner.recv().map_err(|_| RecvError) + } + + pub fn recv_timeout(&self, timeout: Duration) -> Result { + self.inner.recv_timeout(timeout).map_err(|err| match err { + cc::RecvTimeoutError::Timeout => RecvTimeoutError::Timeout, + cc::RecvTimeoutError::Disconnected => RecvTimeoutError::Disconnected, + }) + } + + pub fn iter(&self) -> Iter { + Iter { inner: self } + } + + pub fn try_iter(&self) -> TryIter { + TryIter { inner: self } + } +} + +impl<'a, T> IntoIterator for &'a Receiver { + type Item = T; + type IntoIter = Iter<'a, T>; + + fn into_iter(self) -> Iter<'a, T> { + self.iter() + } +} + +impl IntoIterator for Receiver { + type Item = T; + type IntoIter = IntoIter; + + fn into_iter(self) -> IntoIter { + IntoIter { inner: self } + } +} + +pub struct TryIter<'a, T: 'a> { + inner: &'a Receiver, +} + +impl<'a, T> Iterator for TryIter<'a, T> { + type Item = T; + + fn next(&mut self) -> Option { + self.inner.try_recv().ok() + } +} + +pub struct Iter<'a, T: 'a> { + inner: &'a Receiver, +} + +impl<'a, T> Iterator for Iter<'a, T> { + type Item = T; + + fn next(&mut self) -> Option { + self.inner.recv().ok() + } +} + +pub struct IntoIter { + inner: Receiver, +} + +impl Iterator for IntoIter { + type Item = T; + + fn next(&mut self) -> Option { + self.inner.recv().ok() + } +} + +pub fn channel() -> (Sender, Receiver) { + let (s, r) = cc::unbounded(); + let s = Sender { inner: s }; + let r = Receiver { inner: r }; + (s, r) +} + +pub fn sync_channel(bound: usize) -> (SyncSender, Receiver) { + let (s, r) = cc::bounded(bound); + let s = SyncSender { inner: s }; + let r = Receiver { inner: r }; + (s, r) +} + +macro_rules! select { + ( + $($name:pat = $rx:ident.$meth:ident() => $code:expr),+ + ) => ({ + crossbeam_channel_internal! { + $( + recv(($rx).inner) -> res => { + let $name = res.map_err(|_| ::std::sync::mpsc::RecvError); + $code + } + )+ + } + }) +} + +// Source: https://github.com/rust-lang/rust/blob/master/src/libstd/sync/mpsc/mod.rs +mod channel_tests { + use super::*; + + use std::env; + use std::thread; + use std::time::{Duration, Instant}; + + pub fn stress_factor() -> usize { + match env::var("RUST_TEST_STRESS") { + Ok(val) => val.parse().unwrap(), + Err(..) => 1, + } + } + + #[test] + fn smoke() { + let (tx, rx) = channel::(); + tx.send(1).unwrap(); + assert_eq!(rx.recv().unwrap(), 1); + } + + #[test] + fn drop_full() { + let (tx, _rx) = channel::>(); + tx.send(Box::new(1)).unwrap(); + } + + #[test] + fn drop_full_shared() { + let (tx, _rx) = channel::>(); + drop(tx.clone()); + drop(tx.clone()); + tx.send(Box::new(1)).unwrap(); + } + + #[test] + fn smoke_shared() { + let (tx, rx) = channel::(); + tx.send(1).unwrap(); + assert_eq!(rx.recv().unwrap(), 1); + let tx = tx.clone(); + tx.send(1).unwrap(); + assert_eq!(rx.recv().unwrap(), 1); + } + + #[test] + fn smoke_threads() { + let (tx, rx) = channel::(); + let _t = thread::spawn(move || { + tx.send(1).unwrap(); + }); + assert_eq!(rx.recv().unwrap(), 1); + } + + #[test] + fn smoke_port_gone() { + let (tx, rx) = channel::(); + drop(rx); + assert!(tx.send(1).is_err()); + } + + #[test] + fn smoke_shared_port_gone() { + let (tx, rx) = channel::(); + drop(rx); + assert!(tx.send(1).is_err()) + } + + #[test] + fn smoke_shared_port_gone2() { + let (tx, rx) = channel::(); + drop(rx); + let tx2 = tx.clone(); + drop(tx); + assert!(tx2.send(1).is_err()); + } + + #[test] + fn port_gone_concurrent() { + let (tx, rx) = channel::(); + let _t = thread::spawn(move || { + rx.recv().unwrap(); + }); + while tx.send(1).is_ok() {} + } + + #[test] + fn port_gone_concurrent_shared() { + let (tx, rx) = channel::(); + let tx2 = tx.clone(); + let _t = thread::spawn(move || { + rx.recv().unwrap(); + }); + while tx.send(1).is_ok() && tx2.send(1).is_ok() {} + } + + #[test] + fn smoke_chan_gone() { + let (tx, rx) = channel::(); + drop(tx); + assert!(rx.recv().is_err()); + } + + #[test] + fn smoke_chan_gone_shared() { + let (tx, rx) = channel::<()>(); + let tx2 = tx.clone(); + drop(tx); + drop(tx2); + assert!(rx.recv().is_err()); + } + + #[test] + fn chan_gone_concurrent() { + let (tx, rx) = channel::(); + let _t = thread::spawn(move || { + tx.send(1).unwrap(); + tx.send(1).unwrap(); + }); + while rx.recv().is_ok() {} + } + + #[test] + fn stress() { + let (tx, rx) = channel::(); + let t = thread::spawn(move || { + for _ in 0..10000 { + tx.send(1).unwrap(); + } + }); + for _ in 0..10000 { + assert_eq!(rx.recv().unwrap(), 1); + } + t.join().ok().unwrap(); + } + + #[test] + fn stress_shared() { + const AMT: u32 = 10000; + const NTHREADS: u32 = 8; + let (tx, rx) = channel::(); + + let t = thread::spawn(move || { + for _ in 0..AMT * NTHREADS { + assert_eq!(rx.recv().unwrap(), 1); + } + match rx.try_recv() { + Ok(..) => panic!(), + _ => {} + } + }); + + for _ in 0..NTHREADS { + let tx = tx.clone(); + thread::spawn(move || { + for _ in 0..AMT { + tx.send(1).unwrap(); + } + }); + } + drop(tx); + t.join().ok().unwrap(); + } + + #[test] + fn send_from_outside_runtime() { + let (tx1, rx1) = channel::<()>(); + let (tx2, rx2) = channel::(); + let t1 = thread::spawn(move || { + tx1.send(()).unwrap(); + for _ in 0..40 { + assert_eq!(rx2.recv().unwrap(), 1); + } + }); + rx1.recv().unwrap(); + let t2 = thread::spawn(move || { + for _ in 0..40 { + tx2.send(1).unwrap(); + } + }); + t1.join().ok().unwrap(); + t2.join().ok().unwrap(); + } + + #[test] + fn recv_from_outside_runtime() { + let (tx, rx) = channel::(); + let t = thread::spawn(move || { + for _ in 0..40 { + assert_eq!(rx.recv().unwrap(), 1); + } + }); + for _ in 0..40 { + tx.send(1).unwrap(); + } + t.join().ok().unwrap(); + } + + #[test] + fn no_runtime() { + let (tx1, rx1) = channel::(); + let (tx2, rx2) = channel::(); + let t1 = thread::spawn(move || { + assert_eq!(rx1.recv().unwrap(), 1); + tx2.send(2).unwrap(); + }); + let t2 = thread::spawn(move || { + tx1.send(1).unwrap(); + assert_eq!(rx2.recv().unwrap(), 2); + }); + t1.join().ok().unwrap(); + t2.join().ok().unwrap(); + } + + #[test] + fn oneshot_single_thread_close_port_first() { + // Simple test of closing without sending + let (_tx, rx) = channel::(); + drop(rx); + } + + #[test] + fn oneshot_single_thread_close_chan_first() { + // Simple test of closing without sending + let (tx, _rx) = channel::(); + drop(tx); + } + + #[test] + fn oneshot_single_thread_send_port_close() { + // Testing that the sender cleans up the payload if receiver is closed + let (tx, rx) = channel::>(); + drop(rx); + assert!(tx.send(Box::new(0)).is_err()); + } + + #[test] + fn oneshot_single_thread_recv_chan_close() { + // Receiving on a closed chan will panic + let res = thread::spawn(move || { + let (tx, rx) = channel::(); + drop(tx); + rx.recv().unwrap(); + }).join(); + // What is our res? + assert!(res.is_err()); + } + + #[test] + fn oneshot_single_thread_send_then_recv() { + let (tx, rx) = channel::>(); + tx.send(Box::new(10)).unwrap(); + assert!(*rx.recv().unwrap() == 10); + } + + #[test] + fn oneshot_single_thread_try_send_open() { + let (tx, rx) = channel::(); + assert!(tx.send(10).is_ok()); + assert!(rx.recv().unwrap() == 10); + } + + #[test] + fn oneshot_single_thread_try_send_closed() { + let (tx, rx) = channel::(); + drop(rx); + assert!(tx.send(10).is_err()); + } + + #[test] + fn oneshot_single_thread_try_recv_open() { + let (tx, rx) = channel::(); + tx.send(10).unwrap(); + assert!(rx.recv() == Ok(10)); + } + + #[test] + fn oneshot_single_thread_try_recv_closed() { + let (tx, rx) = channel::(); + drop(tx); + assert!(rx.recv().is_err()); + } + + #[test] + fn oneshot_single_thread_peek_data() { + let (tx, rx) = channel::(); + assert_eq!(rx.try_recv(), Err(TryRecvError::Empty)); + tx.send(10).unwrap(); + assert_eq!(rx.try_recv(), Ok(10)); + } + + #[test] + fn oneshot_single_thread_peek_close() { + let (tx, rx) = channel::(); + drop(tx); + assert_eq!(rx.try_recv(), Err(TryRecvError::Disconnected)); + assert_eq!(rx.try_recv(), Err(TryRecvError::Disconnected)); + } + + #[test] + fn oneshot_single_thread_peek_open() { + let (_tx, rx) = channel::(); + assert_eq!(rx.try_recv(), Err(TryRecvError::Empty)); + } + + #[test] + fn oneshot_multi_task_recv_then_send() { + let (tx, rx) = channel::>(); + let _t = thread::spawn(move || { + assert!(*rx.recv().unwrap() == 10); + }); + + tx.send(Box::new(10)).unwrap(); + } + + #[test] + fn oneshot_multi_task_recv_then_close() { + let (tx, rx) = channel::>(); + let _t = thread::spawn(move || { + drop(tx); + }); + let res = thread::spawn(move || { + assert!(*rx.recv().unwrap() == 10); + }).join(); + assert!(res.is_err()); + } + + #[test] + fn oneshot_multi_thread_close_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = channel::(); + let _t = thread::spawn(move || { + drop(rx); + }); + drop(tx); + } + } + + #[test] + fn oneshot_multi_thread_send_close_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = channel::(); + let _t = thread::spawn(move || { + drop(rx); + }); + let _ = thread::spawn(move || { + tx.send(1).unwrap(); + }).join(); + } + } + + #[test] + fn oneshot_multi_thread_recv_close_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = channel::(); + thread::spawn(move || { + let res = thread::spawn(move || { + rx.recv().unwrap(); + }).join(); + assert!(res.is_err()); + }); + let _t = thread::spawn(move || { + thread::spawn(move || { + drop(tx); + }); + }); + } + } + + #[test] + fn oneshot_multi_thread_send_recv_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = channel::>(); + let _t = thread::spawn(move || { + tx.send(Box::new(10)).unwrap(); + }); + assert!(*rx.recv().unwrap() == 10); + } + } + + #[test] + fn stream_send_recv_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = channel(); + + send(tx, 0); + recv(rx, 0); + + fn send(tx: Sender>, i: i32) { + if i == 10 { + return; + } + + thread::spawn(move || { + tx.send(Box::new(i)).unwrap(); + send(tx, i + 1); + }); + } + + fn recv(rx: Receiver>, i: i32) { + if i == 10 { + return; + } + + thread::spawn(move || { + assert!(*rx.recv().unwrap() == i); + recv(rx, i + 1); + }); + } + } + } + + #[test] + fn oneshot_single_thread_recv_timeout() { + let (tx, rx) = channel(); + tx.send(()).unwrap(); + assert_eq!(rx.recv_timeout(Duration::from_millis(1)), Ok(())); + assert_eq!( + rx.recv_timeout(Duration::from_millis(1)), + Err(RecvTimeoutError::Timeout) + ); + tx.send(()).unwrap(); + assert_eq!(rx.recv_timeout(Duration::from_millis(1)), Ok(())); + } + + #[test] + fn stress_recv_timeout_two_threads() { + let (tx, rx) = channel(); + let stress = stress_factor() + 100; + let timeout = Duration::from_millis(100); + + thread::spawn(move || { + for i in 0..stress { + if i % 2 == 0 { + thread::sleep(timeout * 2); + } + tx.send(1usize).unwrap(); + } + }); + + let mut recv_count = 0; + loop { + match rx.recv_timeout(timeout) { + Ok(n) => { + assert_eq!(n, 1usize); + recv_count += 1; + } + Err(RecvTimeoutError::Timeout) => continue, + Err(RecvTimeoutError::Disconnected) => break, + } + } + + assert_eq!(recv_count, stress); + } + + #[test] + fn recv_timeout_upgrade() { + let (tx, rx) = channel::<()>(); + let timeout = Duration::from_millis(1); + let _tx_clone = tx.clone(); + + let start = Instant::now(); + assert_eq!(rx.recv_timeout(timeout), Err(RecvTimeoutError::Timeout)); + assert!(Instant::now() >= start + timeout); + } + + #[test] + fn stress_recv_timeout_shared() { + let (tx, rx) = channel(); + let stress = stress_factor() + 100; + + for i in 0..stress { + let tx = tx.clone(); + thread::spawn(move || { + thread::sleep(Duration::from_millis(i as u64 * 10)); + tx.send(1usize).unwrap(); + }); + } + + drop(tx); + + let mut recv_count = 0; + loop { + match rx.recv_timeout(Duration::from_millis(10)) { + Ok(n) => { + assert_eq!(n, 1usize); + recv_count += 1; + } + Err(RecvTimeoutError::Timeout) => continue, + Err(RecvTimeoutError::Disconnected) => break, + } + } + + assert_eq!(recv_count, stress); + } + + #[test] + fn recv_a_lot() { + // Regression test that we don't run out of stack in scheduler context + let (tx, rx) = channel(); + for _ in 0..10000 { + tx.send(()).unwrap(); + } + for _ in 0..10000 { + rx.recv().unwrap(); + } + } + + #[test] + fn shared_recv_timeout() { + let (tx, rx) = channel(); + let total = 5; + for _ in 0..total { + let tx = tx.clone(); + thread::spawn(move || { + tx.send(()).unwrap(); + }); + } + + for _ in 0..total { + rx.recv().unwrap(); + } + + assert_eq!( + rx.recv_timeout(Duration::from_millis(1)), + Err(RecvTimeoutError::Timeout) + ); + tx.send(()).unwrap(); + assert_eq!(rx.recv_timeout(Duration::from_millis(1)), Ok(())); + } + + #[test] + fn shared_chan_stress() { + let (tx, rx) = channel(); + let total = stress_factor() + 100; + for _ in 0..total { + let tx = tx.clone(); + thread::spawn(move || { + tx.send(()).unwrap(); + }); + } + + for _ in 0..total { + rx.recv().unwrap(); + } + } + + #[test] + fn test_nested_recv_iter() { + let (tx, rx) = channel::(); + let (total_tx, total_rx) = channel::(); + + let _t = thread::spawn(move || { + let mut acc = 0; + for x in rx.iter() { + acc += x; + } + total_tx.send(acc).unwrap(); + }); + + tx.send(3).unwrap(); + tx.send(1).unwrap(); + tx.send(2).unwrap(); + drop(tx); + assert_eq!(total_rx.recv().unwrap(), 6); + } + + #[test] + fn test_recv_iter_break() { + let (tx, rx) = channel::(); + let (count_tx, count_rx) = channel(); + + let _t = thread::spawn(move || { + let mut count = 0; + for x in rx.iter() { + if count >= 3 { + break; + } else { + count += x; + } + } + count_tx.send(count).unwrap(); + }); + + tx.send(2).unwrap(); + tx.send(2).unwrap(); + tx.send(2).unwrap(); + let _ = tx.send(2); + drop(tx); + assert_eq!(count_rx.recv().unwrap(), 4); + } + + #[test] + fn test_recv_try_iter() { + let (request_tx, request_rx) = channel(); + let (response_tx, response_rx) = channel(); + + // Request `x`s until we have `6`. + let t = thread::spawn(move || { + let mut count = 0; + loop { + for x in response_rx.try_iter() { + count += x; + if count == 6 { + return count; + } + } + request_tx.send(()).unwrap(); + } + }); + + for _ in request_rx.iter() { + if response_tx.send(2).is_err() { + break; + } + } + + assert_eq!(t.join().unwrap(), 6); + } + + #[test] + fn test_recv_into_iter_owned() { + let mut iter = { + let (tx, rx) = channel::(); + tx.send(1).unwrap(); + tx.send(2).unwrap(); + + rx.into_iter() + }; + assert_eq!(iter.next().unwrap(), 1); + assert_eq!(iter.next().unwrap(), 2); + assert_eq!(iter.next().is_none(), true); + } + + #[test] + fn test_recv_into_iter_borrowed() { + let (tx, rx) = channel::(); + tx.send(1).unwrap(); + tx.send(2).unwrap(); + drop(tx); + let mut iter = (&rx).into_iter(); + assert_eq!(iter.next().unwrap(), 1); + assert_eq!(iter.next().unwrap(), 2); + assert_eq!(iter.next().is_none(), true); + } + + #[test] + fn try_recv_states() { + let (tx1, rx1) = channel::(); + let (tx2, rx2) = channel::<()>(); + let (tx3, rx3) = channel::<()>(); + let _t = thread::spawn(move || { + rx2.recv().unwrap(); + tx1.send(1).unwrap(); + tx3.send(()).unwrap(); + rx2.recv().unwrap(); + drop(tx1); + tx3.send(()).unwrap(); + }); + + assert_eq!(rx1.try_recv(), Err(TryRecvError::Empty)); + tx2.send(()).unwrap(); + rx3.recv().unwrap(); + assert_eq!(rx1.try_recv(), Ok(1)); + assert_eq!(rx1.try_recv(), Err(TryRecvError::Empty)); + tx2.send(()).unwrap(); + rx3.recv().unwrap(); + assert_eq!(rx1.try_recv(), Err(TryRecvError::Disconnected)); + } + + // This bug used to end up in a livelock inside of the Receiver destructor + // because the internal state of the Shared packet was corrupted + #[test] + fn destroy_upgraded_shared_port_when_sender_still_active() { + let (tx, rx) = channel(); + let (tx2, rx2) = channel(); + let _t = thread::spawn(move || { + rx.recv().unwrap(); // wait on a oneshot + drop(rx); // destroy a shared + tx2.send(()).unwrap(); + }); + // make sure the other thread has gone to sleep + for _ in 0..5000 { + thread::yield_now(); + } + + // upgrade to a shared chan and send a message + let t = tx.clone(); + drop(tx); + t.send(()).unwrap(); + + // wait for the child thread to exit before we exit + rx2.recv().unwrap(); + } + + #[test] + fn issue_32114() { + let (tx, _) = channel(); + let _ = tx.send(123); + assert_eq!(tx.send(123), Err(SendError(123))); + } +} + +// Source: https://github.com/rust-lang/rust/blob/master/src/libstd/sync/mpsc/mod.rs +mod sync_channel_tests { + use super::*; + + use std::env; + use std::thread; + use std::time::Duration; + + pub fn stress_factor() -> usize { + match env::var("RUST_TEST_STRESS") { + Ok(val) => val.parse().unwrap(), + Err(..) => 1, + } + } + + #[test] + fn smoke() { + let (tx, rx) = sync_channel::(1); + tx.send(1).unwrap(); + assert_eq!(rx.recv().unwrap(), 1); + } + + #[test] + fn drop_full() { + let (tx, _rx) = sync_channel::>(1); + tx.send(Box::new(1)).unwrap(); + } + + #[test] + fn smoke_shared() { + let (tx, rx) = sync_channel::(1); + tx.send(1).unwrap(); + assert_eq!(rx.recv().unwrap(), 1); + let tx = tx.clone(); + tx.send(1).unwrap(); + assert_eq!(rx.recv().unwrap(), 1); + } + + #[test] + fn recv_timeout() { + let (tx, rx) = sync_channel::(1); + assert_eq!( + rx.recv_timeout(Duration::from_millis(1)), + Err(RecvTimeoutError::Timeout) + ); + tx.send(1).unwrap(); + assert_eq!(rx.recv_timeout(Duration::from_millis(1)), Ok(1)); + } + + #[test] + fn smoke_threads() { + let (tx, rx) = sync_channel::(0); + let _t = thread::spawn(move || { + tx.send(1).unwrap(); + }); + assert_eq!(rx.recv().unwrap(), 1); + } + + #[test] + fn smoke_port_gone() { + let (tx, rx) = sync_channel::(0); + drop(rx); + assert!(tx.send(1).is_err()); + } + + #[test] + fn smoke_shared_port_gone2() { + let (tx, rx) = sync_channel::(0); + drop(rx); + let tx2 = tx.clone(); + drop(tx); + assert!(tx2.send(1).is_err()); + } + + #[test] + fn port_gone_concurrent() { + let (tx, rx) = sync_channel::(0); + let _t = thread::spawn(move || { + rx.recv().unwrap(); + }); + while tx.send(1).is_ok() {} + } + + #[test] + fn port_gone_concurrent_shared() { + let (tx, rx) = sync_channel::(0); + let tx2 = tx.clone(); + let _t = thread::spawn(move || { + rx.recv().unwrap(); + }); + while tx.send(1).is_ok() && tx2.send(1).is_ok() {} + } + + #[test] + fn smoke_chan_gone() { + let (tx, rx) = sync_channel::(0); + drop(tx); + assert!(rx.recv().is_err()); + } + + #[test] + fn smoke_chan_gone_shared() { + let (tx, rx) = sync_channel::<()>(0); + let tx2 = tx.clone(); + drop(tx); + drop(tx2); + assert!(rx.recv().is_err()); + } + + #[test] + fn chan_gone_concurrent() { + let (tx, rx) = sync_channel::(0); + thread::spawn(move || { + tx.send(1).unwrap(); + tx.send(1).unwrap(); + }); + while rx.recv().is_ok() {} + } + + #[test] + fn stress() { + let (tx, rx) = sync_channel::(0); + thread::spawn(move || { + for _ in 0..10000 { + tx.send(1).unwrap(); + } + }); + for _ in 0..10000 { + assert_eq!(rx.recv().unwrap(), 1); + } + } + + #[test] + fn stress_recv_timeout_two_threads() { + let (tx, rx) = sync_channel::(0); + + thread::spawn(move || { + for _ in 0..10000 { + tx.send(1).unwrap(); + } + }); + + let mut recv_count = 0; + loop { + match rx.recv_timeout(Duration::from_millis(1)) { + Ok(v) => { + assert_eq!(v, 1); + recv_count += 1; + } + Err(RecvTimeoutError::Timeout) => continue, + Err(RecvTimeoutError::Disconnected) => break, + } + } + + assert_eq!(recv_count, 10000); + } + + #[test] + fn stress_recv_timeout_shared() { + const AMT: u32 = 1000; + const NTHREADS: u32 = 8; + let (tx, rx) = sync_channel::(0); + let (dtx, drx) = sync_channel::<()>(0); + + thread::spawn(move || { + let mut recv_count = 0; + loop { + match rx.recv_timeout(Duration::from_millis(10)) { + Ok(v) => { + assert_eq!(v, 1); + recv_count += 1; + } + Err(RecvTimeoutError::Timeout) => continue, + Err(RecvTimeoutError::Disconnected) => break, + } + } + + assert_eq!(recv_count, AMT * NTHREADS); + assert!(rx.try_recv().is_err()); + + dtx.send(()).unwrap(); + }); + + for _ in 0..NTHREADS { + let tx = tx.clone(); + thread::spawn(move || { + for _ in 0..AMT { + tx.send(1).unwrap(); + } + }); + } + + drop(tx); + + drx.recv().unwrap(); + } + + #[test] + fn stress_shared() { + const AMT: u32 = 1000; + const NTHREADS: u32 = 8; + let (tx, rx) = sync_channel::(0); + let (dtx, drx) = sync_channel::<()>(0); + + thread::spawn(move || { + for _ in 0..AMT * NTHREADS { + assert_eq!(rx.recv().unwrap(), 1); + } + match rx.try_recv() { + Ok(..) => panic!(), + _ => {} + } + dtx.send(()).unwrap(); + }); + + for _ in 0..NTHREADS { + let tx = tx.clone(); + thread::spawn(move || { + for _ in 0..AMT { + tx.send(1).unwrap(); + } + }); + } + drop(tx); + drx.recv().unwrap(); + } + + #[test] + fn oneshot_single_thread_close_port_first() { + // Simple test of closing without sending + let (_tx, rx) = sync_channel::(0); + drop(rx); + } + + #[test] + fn oneshot_single_thread_close_chan_first() { + // Simple test of closing without sending + let (tx, _rx) = sync_channel::(0); + drop(tx); + } + + #[test] + fn oneshot_single_thread_send_port_close() { + // Testing that the sender cleans up the payload if receiver is closed + let (tx, rx) = sync_channel::>(0); + drop(rx); + assert!(tx.send(Box::new(0)).is_err()); + } + + #[test] + fn oneshot_single_thread_recv_chan_close() { + // Receiving on a closed chan will panic + let res = thread::spawn(move || { + let (tx, rx) = sync_channel::(0); + drop(tx); + rx.recv().unwrap(); + }).join(); + // What is our res? + assert!(res.is_err()); + } + + #[test] + fn oneshot_single_thread_send_then_recv() { + let (tx, rx) = sync_channel::>(1); + tx.send(Box::new(10)).unwrap(); + assert!(*rx.recv().unwrap() == 10); + } + + #[test] + fn oneshot_single_thread_try_send_open() { + let (tx, rx) = sync_channel::(1); + assert_eq!(tx.try_send(10), Ok(())); + assert!(rx.recv().unwrap() == 10); + } + + #[test] + fn oneshot_single_thread_try_send_closed() { + let (tx, rx) = sync_channel::(0); + drop(rx); + assert_eq!(tx.try_send(10), Err(TrySendError::Disconnected(10))); + } + + #[test] + fn oneshot_single_thread_try_send_closed2() { + let (tx, _rx) = sync_channel::(0); + assert_eq!(tx.try_send(10), Err(TrySendError::Full(10))); + } + + #[test] + fn oneshot_single_thread_try_recv_open() { + let (tx, rx) = sync_channel::(1); + tx.send(10).unwrap(); + assert!(rx.recv() == Ok(10)); + } + + #[test] + fn oneshot_single_thread_try_recv_closed() { + let (tx, rx) = sync_channel::(0); + drop(tx); + assert!(rx.recv().is_err()); + } + + #[test] + fn oneshot_single_thread_try_recv_closed_with_data() { + let (tx, rx) = sync_channel::(1); + tx.send(10).unwrap(); + drop(tx); + assert_eq!(rx.try_recv(), Ok(10)); + assert_eq!(rx.try_recv(), Err(TryRecvError::Disconnected)); + } + + #[test] + fn oneshot_single_thread_peek_data() { + let (tx, rx) = sync_channel::(1); + assert_eq!(rx.try_recv(), Err(TryRecvError::Empty)); + tx.send(10).unwrap(); + assert_eq!(rx.try_recv(), Ok(10)); + } + + #[test] + fn oneshot_single_thread_peek_close() { + let (tx, rx) = sync_channel::(0); + drop(tx); + assert_eq!(rx.try_recv(), Err(TryRecvError::Disconnected)); + assert_eq!(rx.try_recv(), Err(TryRecvError::Disconnected)); + } + + #[test] + fn oneshot_single_thread_peek_open() { + let (_tx, rx) = sync_channel::(0); + assert_eq!(rx.try_recv(), Err(TryRecvError::Empty)); + } + + #[test] + fn oneshot_multi_task_recv_then_send() { + let (tx, rx) = sync_channel::>(0); + let _t = thread::spawn(move || { + assert!(*rx.recv().unwrap() == 10); + }); + + tx.send(Box::new(10)).unwrap(); + } + + #[test] + fn oneshot_multi_task_recv_then_close() { + let (tx, rx) = sync_channel::>(0); + let _t = thread::spawn(move || { + drop(tx); + }); + let res = thread::spawn(move || { + assert!(*rx.recv().unwrap() == 10); + }).join(); + assert!(res.is_err()); + } + + #[test] + fn oneshot_multi_thread_close_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = sync_channel::(0); + let _t = thread::spawn(move || { + drop(rx); + }); + drop(tx); + } + } + + #[test] + fn oneshot_multi_thread_send_close_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = sync_channel::(0); + let _t = thread::spawn(move || { + drop(rx); + }); + let _ = thread::spawn(move || { + tx.send(1).unwrap(); + }).join(); + } + } + + #[test] + fn oneshot_multi_thread_recv_close_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = sync_channel::(0); + let _t = thread::spawn(move || { + let res = thread::spawn(move || { + rx.recv().unwrap(); + }).join(); + assert!(res.is_err()); + }); + let _t = thread::spawn(move || { + thread::spawn(move || { + drop(tx); + }); + }); + } + } + + #[test] + fn oneshot_multi_thread_send_recv_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = sync_channel::>(0); + let _t = thread::spawn(move || { + tx.send(Box::new(10)).unwrap(); + }); + assert!(*rx.recv().unwrap() == 10); + } + } + + #[test] + fn stream_send_recv_stress() { + for _ in 0..stress_factor() { + let (tx, rx) = sync_channel::>(0); + + send(tx, 0); + recv(rx, 0); + + fn send(tx: SyncSender>, i: i32) { + if i == 10 { + return; + } + + thread::spawn(move || { + tx.send(Box::new(i)).unwrap(); + send(tx, i + 1); + }); + } + + fn recv(rx: Receiver>, i: i32) { + if i == 10 { + return; + } + + thread::spawn(move || { + assert!(*rx.recv().unwrap() == i); + recv(rx, i + 1); + }); + } + } + } + + #[test] + fn recv_a_lot() { + // Regression test that we don't run out of stack in scheduler context + let (tx, rx) = sync_channel(10000); + for _ in 0..10000 { + tx.send(()).unwrap(); + } + for _ in 0..10000 { + rx.recv().unwrap(); + } + } + + #[test] + fn shared_chan_stress() { + let (tx, rx) = sync_channel(0); + let total = stress_factor() + 100; + for _ in 0..total { + let tx = tx.clone(); + thread::spawn(move || { + tx.send(()).unwrap(); + }); + } + + for _ in 0..total { + rx.recv().unwrap(); + } + } + + #[test] + fn test_nested_recv_iter() { + let (tx, rx) = sync_channel::(0); + let (total_tx, total_rx) = sync_channel::(0); + + let _t = thread::spawn(move || { + let mut acc = 0; + for x in rx.iter() { + acc += x; + } + total_tx.send(acc).unwrap(); + }); + + tx.send(3).unwrap(); + tx.send(1).unwrap(); + tx.send(2).unwrap(); + drop(tx); + assert_eq!(total_rx.recv().unwrap(), 6); + } + + #[test] + fn test_recv_iter_break() { + let (tx, rx) = sync_channel::(0); + let (count_tx, count_rx) = sync_channel(0); + + let _t = thread::spawn(move || { + let mut count = 0; + for x in rx.iter() { + if count >= 3 { + break; + } else { + count += x; + } + } + count_tx.send(count).unwrap(); + }); + + tx.send(2).unwrap(); + tx.send(2).unwrap(); + tx.send(2).unwrap(); + let _ = tx.try_send(2); + drop(tx); + assert_eq!(count_rx.recv().unwrap(), 4); + } + + #[test] + fn try_recv_states() { + let (tx1, rx1) = sync_channel::(1); + let (tx2, rx2) = sync_channel::<()>(1); + let (tx3, rx3) = sync_channel::<()>(1); + let _t = thread::spawn(move || { + rx2.recv().unwrap(); + tx1.send(1).unwrap(); + tx3.send(()).unwrap(); + rx2.recv().unwrap(); + drop(tx1); + tx3.send(()).unwrap(); + }); + + assert_eq!(rx1.try_recv(), Err(TryRecvError::Empty)); + tx2.send(()).unwrap(); + rx3.recv().unwrap(); + assert_eq!(rx1.try_recv(), Ok(1)); + assert_eq!(rx1.try_recv(), Err(TryRecvError::Empty)); + tx2.send(()).unwrap(); + rx3.recv().unwrap(); + assert_eq!(rx1.try_recv(), Err(TryRecvError::Disconnected)); + } + + // This bug used to end up in a livelock inside of the Receiver destructor + // because the internal state of the Shared packet was corrupted + #[test] + fn destroy_upgraded_shared_port_when_sender_still_active() { + let (tx, rx) = sync_channel::<()>(0); + let (tx2, rx2) = sync_channel::<()>(0); + let _t = thread::spawn(move || { + rx.recv().unwrap(); // wait on a oneshot + drop(rx); // destroy a shared + tx2.send(()).unwrap(); + }); + // make sure the other thread has gone to sleep + for _ in 0..5000 { + thread::yield_now(); + } + + // upgrade to a shared chan and send a message + let t = tx.clone(); + drop(tx); + t.send(()).unwrap(); + + // wait for the child thread to exit before we exit + rx2.recv().unwrap(); + } + + #[test] + fn send1() { + let (tx, rx) = sync_channel::(0); + let _t = thread::spawn(move || { + rx.recv().unwrap(); + }); + assert_eq!(tx.send(1), Ok(())); + } + + #[test] + fn send2() { + let (tx, rx) = sync_channel::(0); + let _t = thread::spawn(move || { + drop(rx); + }); + assert!(tx.send(1).is_err()); + } + + #[test] + fn send3() { + let (tx, rx) = sync_channel::(1); + assert_eq!(tx.send(1), Ok(())); + let _t = thread::spawn(move || { + drop(rx); + }); + assert!(tx.send(1).is_err()); + } + + #[test] + fn send4() { + let (tx, rx) = sync_channel::(0); + let tx2 = tx.clone(); + let (done, donerx) = channel(); + let done2 = done.clone(); + let _t = thread::spawn(move || { + assert!(tx.send(1).is_err()); + done.send(()).unwrap(); + }); + let _t = thread::spawn(move || { + assert!(tx2.send(2).is_err()); + done2.send(()).unwrap(); + }); + drop(rx); + donerx.recv().unwrap(); + donerx.recv().unwrap(); + } + + #[test] + fn try_send1() { + let (tx, _rx) = sync_channel::(0); + assert_eq!(tx.try_send(1), Err(TrySendError::Full(1))); + } + + #[test] + fn try_send2() { + let (tx, _rx) = sync_channel::(1); + assert_eq!(tx.try_send(1), Ok(())); + assert_eq!(tx.try_send(1), Err(TrySendError::Full(1))); + } + + #[test] + fn try_send3() { + let (tx, rx) = sync_channel::(1); + assert_eq!(tx.try_send(1), Ok(())); + drop(rx); + assert_eq!(tx.try_send(1), Err(TrySendError::Disconnected(1))); + } + + #[test] + fn issue_15761() { + fn repro() { + let (tx1, rx1) = sync_channel::<()>(3); + let (tx2, rx2) = sync_channel::<()>(3); + + let _t = thread::spawn(move || { + rx1.recv().unwrap(); + tx2.try_send(()).unwrap(); + }); + + tx1.try_send(()).unwrap(); + rx2.recv().unwrap(); + } + + for _ in 0..100 { + repro() + } + } +} + +// Source: https://github.com/rust-lang/rust/blob/master/src/libstd/sync/mpsc/select.rs +mod select_tests { + use super::*; + + use std::thread; + + #[test] + fn smoke() { + let (tx1, rx1) = channel::(); + let (tx2, rx2) = channel::(); + tx1.send(1).unwrap(); + select! { + foo = rx1.recv() => { assert_eq!(foo.unwrap(), 1); }, + _bar = rx2.recv() => { panic!() } + } + tx2.send(2).unwrap(); + select! { + _foo = rx1.recv() => { panic!() }, + bar = rx2.recv() => { assert_eq!(bar.unwrap(), 2) } + } + drop(tx1); + select! { + foo = rx1.recv() => { assert!(foo.is_err()); }, + _bar = rx2.recv() => { panic!() } + } + drop(tx2); + select! { + bar = rx2.recv() => { assert!(bar.is_err()); } + } + } + + #[test] + fn smoke2() { + let (_tx1, rx1) = channel::(); + let (_tx2, rx2) = channel::(); + let (_tx3, rx3) = channel::(); + let (_tx4, rx4) = channel::(); + let (tx5, rx5) = channel::(); + tx5.send(4).unwrap(); + select! { + _foo = rx1.recv() => { panic!("1") }, + _foo = rx2.recv() => { panic!("2") }, + _foo = rx3.recv() => { panic!("3") }, + _foo = rx4.recv() => { panic!("4") }, + foo = rx5.recv() => { assert_eq!(foo.unwrap(), 4); } + } + } + + #[test] + fn closed() { + let (_tx1, rx1) = channel::(); + let (tx2, rx2) = channel::(); + drop(tx2); + + select! { + _a1 = rx1.recv() => { panic!() }, + a2 = rx2.recv() => { assert!(a2.is_err()); } + } + } + + #[test] + fn unblocks() { + let (tx1, rx1) = channel::(); + let (_tx2, rx2) = channel::(); + let (tx3, rx3) = channel::(); + + let _t = thread::spawn(move || { + for _ in 0..20 { + thread::yield_now(); + } + tx1.send(1).unwrap(); + rx3.recv().unwrap(); + for _ in 0..20 { + thread::yield_now(); + } + }); + + select! { + a = rx1.recv() => { assert_eq!(a.unwrap(), 1); }, + _b = rx2.recv() => { panic!() } + } + tx3.send(1).unwrap(); + select! { + a = rx1.recv() => { assert!(a.is_err()) }, + _b = rx2.recv() => { panic!() } + } + } + + #[test] + fn both_ready() { + let (tx1, rx1) = channel::(); + let (tx2, rx2) = channel::(); + let (tx3, rx3) = channel::<()>(); + + let _t = thread::spawn(move || { + for _ in 0..20 { + thread::yield_now(); + } + tx1.send(1).unwrap(); + tx2.send(2).unwrap(); + rx3.recv().unwrap(); + }); + + select! { + a = rx1.recv() => { assert_eq!(a.unwrap(), 1); }, + a = rx2.recv() => { assert_eq!(a.unwrap(), 2); } + } + select! { + a = rx1.recv() => { assert_eq!(a.unwrap(), 1); }, + a = rx2.recv() => { assert_eq!(a.unwrap(), 2); } + } + assert_eq!(rx1.try_recv(), Err(TryRecvError::Empty)); + assert_eq!(rx2.try_recv(), Err(TryRecvError::Empty)); + tx3.send(()).unwrap(); + } + + #[test] + fn stress() { + const AMT: i32 = 10000; + let (tx1, rx1) = channel::(); + let (tx2, rx2) = channel::(); + let (tx3, rx3) = channel::<()>(); + + let _t = thread::spawn(move || { + for i in 0..AMT { + if i % 2 == 0 { + tx1.send(i).unwrap(); + } else { + tx2.send(i).unwrap(); + } + rx3.recv().unwrap(); + } + }); + + for i in 0..AMT { + select! { + i1 = rx1.recv() => { assert!(i % 2 == 0 && i == i1.unwrap()); }, + i2 = rx2.recv() => { assert!(i % 2 == 1 && i == i2.unwrap()); } + } + tx3.send(()).unwrap(); + } + } + + #[allow(unused_must_use)] + #[test] + fn cloning() { + let (tx1, rx1) = channel::(); + let (_tx2, rx2) = channel::(); + let (tx3, rx3) = channel::<()>(); + + let _t = thread::spawn(move || { + rx3.recv().unwrap(); + tx1.clone(); + assert_eq!(rx3.try_recv(), Err(TryRecvError::Empty)); + tx1.send(2).unwrap(); + rx3.recv().unwrap(); + }); + + tx3.send(()).unwrap(); + select! { + _i1 = rx1.recv() => {}, + _i2 = rx2.recv() => panic!() + } + tx3.send(()).unwrap(); + } + + #[allow(unused_must_use)] + #[test] + fn cloning2() { + let (tx1, rx1) = channel::(); + let (_tx2, rx2) = channel::(); + let (tx3, rx3) = channel::<()>(); + + let _t = thread::spawn(move || { + rx3.recv().unwrap(); + tx1.clone(); + assert_eq!(rx3.try_recv(), Err(TryRecvError::Empty)); + tx1.send(2).unwrap(); + rx3.recv().unwrap(); + }); + + tx3.send(()).unwrap(); + select! { + _i1 = rx1.recv() => {}, + _i2 = rx2.recv() => panic!() + } + tx3.send(()).unwrap(); + } + + #[test] + fn cloning3() { + let (tx1, rx1) = channel::<()>(); + let (tx2, rx2) = channel::<()>(); + let (tx3, rx3) = channel::<()>(); + let _t = thread::spawn(move || { + select! { + _ = rx1.recv() => panic!(), + _ = rx2.recv() => {} + } + tx3.send(()).unwrap(); + }); + + for _ in 0..1000 { + thread::yield_now(); + } + drop(tx1.clone()); + tx2.send(()).unwrap(); + rx3.recv().unwrap(); + } + + #[test] + fn preflight1() { + let (tx, rx) = channel(); + tx.send(()).unwrap(); + select! { + _n = rx.recv() => {} + } + } + + #[test] + fn preflight2() { + let (tx, rx) = channel(); + tx.send(()).unwrap(); + tx.send(()).unwrap(); + select! { + _n = rx.recv() => {} + } + } + + #[test] + fn preflight3() { + let (tx, rx) = channel(); + drop(tx.clone()); + tx.send(()).unwrap(); + select! { + _n = rx.recv() => {} + } + } + + #[test] + fn preflight4() { + let (tx, rx) = channel(); + tx.send(()).unwrap(); + select! { + _ = rx.recv() => {} + } + } + + #[test] + fn preflight5() { + let (tx, rx) = channel(); + tx.send(()).unwrap(); + tx.send(()).unwrap(); + select! { + _ = rx.recv() => {} + } + } + + #[test] + fn preflight6() { + let (tx, rx) = channel(); + drop(tx.clone()); + tx.send(()).unwrap(); + select! { + _ = rx.recv() => {} + } + } + + #[test] + fn preflight7() { + let (tx, rx) = channel::<()>(); + drop(tx); + select! { + _ = rx.recv() => {} + } + } + + #[test] + fn preflight8() { + let (tx, rx) = channel(); + tx.send(()).unwrap(); + drop(tx); + rx.recv().unwrap(); + select! { + _ = rx.recv() => {} + } + } + + #[test] + fn preflight9() { + let (tx, rx) = channel(); + drop(tx.clone()); + tx.send(()).unwrap(); + drop(tx); + rx.recv().unwrap(); + select! { + _ = rx.recv() => {} + } + } + + #[test] + fn oneshot_data_waiting() { + let (tx1, rx1) = channel(); + let (tx2, rx2) = channel(); + let _t = thread::spawn(move || { + select! { + _n = rx1.recv() => {} + } + tx2.send(()).unwrap(); + }); + + for _ in 0..100 { + thread::yield_now() + } + tx1.send(()).unwrap(); + rx2.recv().unwrap(); + } + + #[test] + fn stream_data_waiting() { + let (tx1, rx1) = channel(); + let (tx2, rx2) = channel(); + tx1.send(()).unwrap(); + tx1.send(()).unwrap(); + rx1.recv().unwrap(); + rx1.recv().unwrap(); + let _t = thread::spawn(move || { + select! { + _n = rx1.recv() => {} + } + tx2.send(()).unwrap(); + }); + + for _ in 0..100 { + thread::yield_now() + } + tx1.send(()).unwrap(); + rx2.recv().unwrap(); + } + + #[test] + fn shared_data_waiting() { + let (tx1, rx1) = channel(); + let (tx2, rx2) = channel(); + drop(tx1.clone()); + tx1.send(()).unwrap(); + rx1.recv().unwrap(); + let _t = thread::spawn(move || { + select! { + _n = rx1.recv() => {} + } + tx2.send(()).unwrap(); + }); + + for _ in 0..100 { + thread::yield_now() + } + tx1.send(()).unwrap(); + rx2.recv().unwrap(); + } + + #[test] + fn sync1() { + let (tx, rx) = sync_channel::(1); + tx.send(1).unwrap(); + select! { + n = rx.recv() => { assert_eq!(n.unwrap(), 1); } + } + } + + #[test] + fn sync2() { + let (tx, rx) = sync_channel::(0); + let _t = thread::spawn(move || { + for _ in 0..100 { + thread::yield_now() + } + tx.send(1).unwrap(); + }); + select! { + n = rx.recv() => { assert_eq!(n.unwrap(), 1); } + } + } + + #[test] + fn sync3() { + let (tx1, rx1) = sync_channel::(0); + let (tx2, rx2): (Sender, Receiver) = channel(); + let _t = thread::spawn(move || { + tx1.send(1).unwrap(); + }); + let _t = thread::spawn(move || { + tx2.send(2).unwrap(); + }); + select! { + n = rx1.recv() => { + let n = n.unwrap(); + assert_eq!(n, 1); + assert_eq!(rx2.recv().unwrap(), 2); + }, + n = rx2.recv() => { + let n = n.unwrap(); + assert_eq!(n, 2); + assert_eq!(rx1.recv().unwrap(), 1); + } + } + } +} diff --git a/vendor/crossbeam-channel/tests/never.rs b/vendor/crossbeam-channel/tests/never.rs new file mode 100644 index 0000000000..35b6f74dda --- /dev/null +++ b/vendor/crossbeam-channel/tests/never.rs @@ -0,0 +1,99 @@ +//! Tests for the never channel flavor. + +#[macro_use] +extern crate crossbeam_channel; +extern crate rand; + +use std::thread; +use std::time::{Duration, Instant}; + +use crossbeam_channel::{never, tick, unbounded}; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn smoke() { + select! { + recv(never::()) -> _ => panic!(), + default => {} + } +} + +#[test] +fn optional() { + let (s, r) = unbounded::(); + s.send(1).unwrap(); + s.send(2).unwrap(); + + let mut r = Some(&r); + select! { + recv(r.unwrap_or(&never())) -> _ => {} + default => panic!(), + } + + r = None; + select! { + recv(r.unwrap_or(&never())) -> _ => panic!(), + default => {} + } +} + +#[test] +fn tick_n() { + let mut r = tick(ms(100)); + let mut step = 0; + + loop { + select! { + recv(r) -> _ => step += 1, + default(ms(500)) => break, + } + + if step == 10 { + r = never(); + } + } + + assert_eq!(step, 10); +} + +#[test] +fn capacity() { + let r = never::(); + assert_eq!(r.capacity(), Some(0)); +} + +#[test] +fn len_empty_full() { + let r = never::(); + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), true); +} + +#[test] +fn try_recv() { + let r = never::(); + assert!(r.try_recv().is_err()); + + thread::sleep(ms(100)); + assert!(r.try_recv().is_err()); +} + +#[test] +fn recv_timeout() { + let start = Instant::now(); + let r = never::(); + + assert!(r.recv_timeout(ms(100)).is_err()); + let now = Instant::now(); + assert!(now - start >= ms(100)); + assert!(now - start <= ms(150)); + + assert!(r.recv_timeout(ms(100)).is_err()); + let now = Instant::now(); + assert!(now - start >= ms(200)); + assert!(now - start <= ms(250)); +} diff --git a/vendor/crossbeam-channel/tests/ready.rs b/vendor/crossbeam-channel/tests/ready.rs new file mode 100644 index 0000000000..1242eea079 --- /dev/null +++ b/vendor/crossbeam-channel/tests/ready.rs @@ -0,0 +1,822 @@ +//! Tests for channel readiness using the `Select` struct. + +extern crate crossbeam_channel; +extern crate crossbeam_utils; + +use std::any::Any; +use std::cell::Cell; +use std::thread; +use std::time::{Duration, Instant}; + +use crossbeam_channel::{after, bounded, tick, unbounded}; +use crossbeam_channel::{Receiver, Select, TryRecvError, TrySendError}; +use crossbeam_utils::thread::scope; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn smoke1() { + let (s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + s1.send(1).unwrap(); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + assert_eq!(sel.ready(), 0); + assert_eq!(r1.try_recv(), Ok(1)); + + s2.send(2).unwrap(); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + assert_eq!(sel.ready(), 1); + assert_eq!(r2.try_recv(), Ok(2)); +} + +#[test] +fn smoke2() { + let (_s1, r1) = unbounded::(); + let (_s2, r2) = unbounded::(); + let (_s3, r3) = unbounded::(); + let (_s4, r4) = unbounded::(); + let (s5, r5) = unbounded::(); + + s5.send(5).unwrap(); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + sel.recv(&r3); + sel.recv(&r4); + sel.recv(&r5); + assert_eq!(sel.ready(), 4); + assert_eq!(r5.try_recv(), Ok(5)); +} + +#[test] +fn disconnected() { + let (s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + scope(|scope| { + scope.spawn(|_| { + drop(s1); + thread::sleep(ms(500)); + s2.send(5).unwrap(); + }); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + match sel.ready_timeout(ms(1000)) { + Ok(0) => assert_eq!(r1.try_recv(), Err(TryRecvError::Disconnected)), + _ => panic!(), + } + + r2.recv().unwrap(); + }).unwrap(); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + match sel.ready_timeout(ms(1000)) { + Ok(0) => assert_eq!(r1.try_recv(), Err(TryRecvError::Disconnected)), + _ => panic!(), + } + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + drop(s2); + }); + + let mut sel = Select::new(); + sel.recv(&r2); + match sel.ready_timeout(ms(1000)) { + Ok(0) => assert_eq!(r2.try_recv(), Err(TryRecvError::Disconnected)), + _ => panic!(), + } + }).unwrap(); +} + +#[test] +fn default() { + let (s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + assert!(sel.try_ready().is_err()); + + drop(s1); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + match sel.try_ready() { + Ok(0) => assert!(r1.try_recv().is_err()), + _ => panic!(), + } + + s2.send(2).unwrap(); + + let mut sel = Select::new(); + sel.recv(&r2); + match sel.try_ready() { + Ok(0) => assert_eq!(r2.try_recv(), Ok(2)), + _ => panic!(), + } + + let mut sel = Select::new(); + sel.recv(&r2); + assert!(sel.try_ready().is_err()); + + let mut sel = Select::new(); + assert!(sel.try_ready().is_err()); +} + +#[test] +fn timeout() { + let (_s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(1500)); + s2.send(2).unwrap(); + }); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + assert!(sel.ready_timeout(ms(1000)).is_err()); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + match sel.ready_timeout(ms(1000)) { + Ok(1) => assert_eq!(r2.try_recv(), Ok(2)), + _ => panic!(), + } + }).unwrap(); + + scope(|scope| { + let (s, r) = unbounded::(); + + scope.spawn(move |_| { + thread::sleep(ms(500)); + drop(s); + }); + + let mut sel = Select::new(); + assert!(sel.ready_timeout(ms(1000)).is_err()); + + let mut sel = Select::new(); + sel.recv(&r); + match sel.try_ready() { + Ok(0) => assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)), + _ => panic!(), + } + }).unwrap(); +} + +#[test] +fn default_when_disconnected() { + let (_, r) = unbounded::(); + + let mut sel = Select::new(); + sel.recv(&r); + match sel.try_ready() { + Ok(0) => assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)), + _ => panic!(), + } + + let (_, r) = unbounded::(); + + let mut sel = Select::new(); + sel.recv(&r); + match sel.ready_timeout(ms(1000)) { + Ok(0) => assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)), + _ => panic!(), + } + + let (s, _) = bounded::(0); + + let mut sel = Select::new(); + sel.send(&s); + match sel.try_ready() { + Ok(0) => assert_eq!(s.try_send(0), Err(TrySendError::Disconnected(0))), + _ => panic!(), + } + + let (s, _) = bounded::(0); + + let mut sel = Select::new(); + sel.send(&s); + match sel.ready_timeout(ms(1000)) { + Ok(0) => assert_eq!(s.try_send(0), Err(TrySendError::Disconnected(0))), + _ => panic!(), + } +} + +#[test] +fn default_only() { + let start = Instant::now(); + + let mut sel = Select::new(); + assert!(sel.try_ready().is_err()); + let now = Instant::now(); + assert!(now - start <= ms(50)); + + let start = Instant::now(); + let mut sel = Select::new(); + assert!(sel.ready_timeout(ms(500)).is_err()); + let now = Instant::now(); + assert!(now - start >= ms(450)); + assert!(now - start <= ms(550)); +} + +#[test] +fn unblocks() { + let (s1, r1) = bounded::(0); + let (s2, r2) = bounded::(0); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + s2.send(2).unwrap(); + }); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + match sel.ready_timeout(ms(1000)) { + Ok(1) => assert_eq!(r2.try_recv(), Ok(2)), + _ => panic!(), + } + }).unwrap(); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + assert_eq!(r1.recv().unwrap(), 1); + }); + + let mut sel = Select::new(); + let oper1 = sel.send(&s1); + let oper2 = sel.send(&s2); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => oper.send(&s1, 1).unwrap(), + i if i == oper2 => panic!(), + _ => unreachable!(), + }, + } + }).unwrap(); +} + +#[test] +fn both_ready() { + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + s1.send(1).unwrap(); + assert_eq!(r2.recv().unwrap(), 2); + }); + + for _ in 0..2 { + let mut sel = Select::new(); + sel.recv(&r1); + sel.send(&s2); + match sel.ready() { + 0 => assert_eq!(r1.try_recv(), Ok(1)), + 1 => s2.try_send(2).unwrap(), + _ => panic!(), + } + } + }).unwrap(); +} + +#[test] +fn cloning1() { + scope(|scope| { + let (s1, r1) = unbounded::(); + let (_s2, r2) = unbounded::(); + let (s3, r3) = unbounded::<()>(); + + scope.spawn(move |_| { + r3.recv().unwrap(); + drop(s1.clone()); + assert!(r3.try_recv().is_err()); + s1.send(1).unwrap(); + r3.recv().unwrap(); + }); + + s3.send(()).unwrap(); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + match sel.ready() { + 0 => drop(r1.try_recv()), + 1 => drop(r2.try_recv()), + _ => panic!(), + } + + s3.send(()).unwrap(); + }).unwrap(); +} + +#[test] +fn cloning2() { + let (s1, r1) = unbounded::<()>(); + let (s2, r2) = unbounded::<()>(); + let (_s3, _r3) = unbounded::<()>(); + + scope(|scope| { + scope.spawn(move |_| { + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + match sel.ready() { + 0 => panic!(), + 1 => drop(r2.try_recv()), + _ => panic!(), + } + }); + + thread::sleep(ms(500)); + drop(s1.clone()); + s2.send(()).unwrap(); + }).unwrap(); +} + +#[test] +fn preflight1() { + let (s, r) = unbounded(); + s.send(()).unwrap(); + + let mut sel = Select::new(); + sel.recv(&r); + match sel.ready() { + 0 => drop(r.try_recv()), + _ => panic!(), + } +} + +#[test] +fn preflight2() { + let (s, r) = unbounded(); + drop(s.clone()); + s.send(()).unwrap(); + drop(s); + + let mut sel = Select::new(); + sel.recv(&r); + match sel.ready() { + 0 => assert_eq!(r.try_recv(), Ok(())), + _ => panic!(), + } + + assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)); +} + +#[test] +fn preflight3() { + let (s, r) = unbounded(); + drop(s.clone()); + s.send(()).unwrap(); + drop(s); + r.recv().unwrap(); + + let mut sel = Select::new(); + sel.recv(&r); + match sel.ready() { + 0 => assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)), + _ => panic!(), + } +} + +#[test] +fn duplicate_operations() { + let (s, r) = unbounded::(); + let hit = vec![Cell::new(false); 4]; + + while hit.iter().map(|h| h.get()).any(|hit| !hit) { + let mut sel = Select::new(); + sel.recv(&r); + sel.recv(&r); + sel.send(&s); + sel.send(&s); + match sel.ready() { + 0 => { + assert!(r.try_recv().is_ok()); + hit[0].set(true); + } + 1 => { + assert!(r.try_recv().is_ok()); + hit[1].set(true); + } + 2 => { + assert!(s.try_send(0).is_ok()); + hit[2].set(true); + } + 3 => { + assert!(s.try_send(0).is_ok()); + hit[3].set(true); + } + _ => panic!(), + } + } +} + +#[test] +fn nesting() { + let (s, r) = unbounded::(); + + let mut sel = Select::new(); + sel.send(&s); + match sel.ready() { + 0 => { + assert!(s.try_send(0).is_ok()); + + let mut sel = Select::new(); + sel.recv(&r); + match sel.ready() { + 0 => { + assert_eq!(r.try_recv(), Ok(0)); + + let mut sel = Select::new(); + sel.send(&s); + match sel.ready() { + 0 => { + assert!(s.try_send(1).is_ok()); + + let mut sel = Select::new(); + sel.recv(&r); + match sel.ready() { + 0 => { + assert_eq!(r.try_recv(), Ok(1)); + } + _ => panic!(), + } + } + _ => panic!(), + } + } + _ => panic!(), + } + } + _ => panic!(), + } +} + +#[test] +fn stress_recv() { + const COUNT: usize = 10_000; + + let (s1, r1) = unbounded(); + let (s2, r2) = bounded(5); + let (s3, r3) = bounded(0); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + s1.send(i).unwrap(); + r3.recv().unwrap(); + + s2.send(i).unwrap(); + r3.recv().unwrap(); + } + }); + + for i in 0..COUNT { + for _ in 0..2 { + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + match sel.ready() { + 0 => assert_eq!(r1.try_recv(), Ok(i)), + 1 => assert_eq!(r2.try_recv(), Ok(i)), + _ => panic!(), + } + + s3.send(()).unwrap(); + } + } + }).unwrap(); +} + +#[test] +fn stress_send() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + let (s3, r3) = bounded(100); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + assert_eq!(r1.recv().unwrap(), i); + assert_eq!(r2.recv().unwrap(), i); + r3.recv().unwrap(); + } + }); + + for i in 0..COUNT { + for _ in 0..2 { + let mut sel = Select::new(); + sel.send(&s1); + sel.send(&s2); + match sel.ready() { + 0 => assert!(s1.try_send(i).is_ok()), + 1 => assert!(s2.try_send(i).is_ok()), + _ => panic!(), + } + } + s3.send(()).unwrap(); + } + }).unwrap(); +} + +#[test] +fn stress_mixed() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + let (s3, r3) = bounded(100); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + s1.send(i).unwrap(); + assert_eq!(r2.recv().unwrap(), i); + r3.recv().unwrap(); + } + }); + + for i in 0..COUNT { + for _ in 0..2 { + let mut sel = Select::new(); + sel.recv(&r1); + sel.send(&s2); + match sel.ready() { + 0 => assert_eq!(r1.try_recv(), Ok(i)), + 1 => assert!(s2.try_send(i).is_ok()), + _ => panic!(), + } + } + s3.send(()).unwrap(); + } + }).unwrap(); +} + +#[test] +fn stress_timeout_two_threads() { + const COUNT: usize = 20; + + let (s, r) = bounded(2); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(500)); + } + + let mut done = false; + while !done { + let mut sel = Select::new(); + sel.send(&s); + match sel.ready_timeout(ms(100)) { + Err(_) => {} + Ok(0) => { + assert!(s.try_send(i).is_ok()); + break; + }, + Ok(_) => panic!(), + } + } + } + }); + + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(500)); + } + + let mut done = false; + while !done { + let mut sel = Select::new(); + sel.recv(&r); + match sel.ready_timeout(ms(100)) { + Err(_) => {} + Ok(0) => { + assert_eq!(r.try_recv(), Ok(i)); + done = true; + }, + Ok(_) => panic!(), + } + } + } + }); + }).unwrap(); +} + +#[test] +fn send_recv_same_channel() { + let (s, r) = bounded::(0); + let mut sel = Select::new(); + sel.send(&s); + sel.recv(&r); + assert!(sel.ready_timeout(ms(100)).is_err()); + + let (s, r) = unbounded::(); + let mut sel = Select::new(); + sel.send(&s); + sel.recv(&r); + match sel.ready_timeout(ms(100)) { + Err(_) => panic!(), + Ok(0) => assert!(s.try_send(0).is_ok()), + Ok(_) => panic!(), + } +} + +#[test] +fn channel_through_channel() { + const COUNT: usize = 1000; + + type T = Box; + + for cap in 1..4 { + let (s, r) = bounded::(cap); + + scope(|scope| { + scope.spawn(move |_| { + let mut s = s; + + for _ in 0..COUNT { + let (new_s, new_r) = bounded(cap); + let mut new_r: T = Box::new(Some(new_r)); + + { + let mut sel = Select::new(); + sel.send(&s); + match sel.ready() { + 0 => assert!(s.try_send(new_r).is_ok()), + _ => panic!(), + } + } + + s = new_s; + } + }); + + scope.spawn(move |_| { + let mut r = r; + + for _ in 0..COUNT { + let new = { + let mut sel = Select::new(); + sel.recv(&r); + match sel.ready() { + 0 => r + .try_recv() + .unwrap() + .downcast_mut::>>() + .unwrap() + .take() + .unwrap(), + _ => panic!(), + } + }; + r = new; + } + }); + }).unwrap(); + } +} + +#[test] +fn fairness1() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded::<()>(COUNT); + let (s2, r2) = unbounded::<()>(); + + for _ in 0..COUNT { + s1.send(()).unwrap(); + s2.send(()).unwrap(); + } + + let hits = vec![Cell::new(0usize); 4]; + for _ in 0..COUNT { + let after = after(ms(0)); + let tick = tick(ms(0)); + + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + sel.recv(&after); + sel.recv(&tick); + match sel.ready() { + 0 => { + r1.try_recv().unwrap(); + hits[0].set(hits[0].get() + 1); + } + 1 => { + r2.try_recv().unwrap(); + hits[1].set(hits[1].get() + 1); + } + 2 => { + after.try_recv().unwrap(); + hits[2].set(hits[2].get() + 1); + } + 3 => { + tick.try_recv().unwrap(); + hits[3].set(hits[3].get() + 1); + } + _ => panic!(), + } + } + assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 2)); +} + +#[test] +fn fairness2() { + const COUNT: usize = 10_000; + + let (s1, r1) = unbounded::<()>(); + let (s2, r2) = bounded::<()>(1); + let (s3, r3) = bounded::<()>(0); + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..COUNT { + let mut sel = Select::new(); + let mut oper1 = None; + let mut oper2 = None; + if s1.is_empty() { + oper1 = Some(sel.send(&s1)); + } + if s2.is_empty() { + oper2 = Some(sel.send(&s2)); + } + let oper3 = sel.send(&s3); + let oper = sel.select(); + match oper.index() { + i if Some(i) == oper1 => assert!(oper.send(&s1, ()).is_ok()), + i if Some(i) == oper2 => assert!(oper.send(&s2, ()).is_ok()), + i if i == oper3 => assert!(oper.send(&s3, ()).is_ok()), + _ => unreachable!(), + } + } + }); + + let hits = vec![Cell::new(0usize); 3]; + for _ in 0..COUNT { + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + sel.recv(&r3); + loop { + match sel.ready() { + 0 => { + if r1.try_recv().is_ok() { + hits[0].set(hits[0].get() + 1); + break; + } + } + 1 => { + if r2.try_recv().is_ok() { + hits[1].set(hits[1].get() + 1); + break; + } + } + 2 => { + if r3.try_recv().is_ok() { + hits[2].set(hits[2].get() + 1); + break; + } + } + _ => unreachable!(), + } + } + } + assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 10)); + }).unwrap(); +} diff --git a/vendor/crossbeam-channel/tests/select.rs b/vendor/crossbeam-channel/tests/select.rs new file mode 100644 index 0000000000..b8c3e05af9 --- /dev/null +++ b/vendor/crossbeam-channel/tests/select.rs @@ -0,0 +1,1285 @@ +//! Tests for channel selection using the `Select` struct. + +extern crate crossbeam_channel; +extern crate crossbeam_utils; + +use std::any::Any; +use std::cell::Cell; +use std::thread; +use std::time::{Duration, Instant}; + +use crossbeam_channel::{after, bounded, tick, unbounded, Receiver, Select, TryRecvError}; +use crossbeam_utils::thread::scope; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn smoke1() { + let (s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + s1.send(1).unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => assert_eq!(oper.recv(&r1), Ok(1)), + i if i == oper2 => panic!(), + _ => unreachable!(), + } + + s2.send(2).unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => panic!(), + i if i == oper2 => assert_eq!(oper.recv(&r2), Ok(2)), + _ => unreachable!(), + } +} + +#[test] +fn smoke2() { + let (_s1, r1) = unbounded::(); + let (_s2, r2) = unbounded::(); + let (_s3, r3) = unbounded::(); + let (_s4, r4) = unbounded::(); + let (s5, r5) = unbounded::(); + + s5.send(5).unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper3 = sel.recv(&r3); + let oper4 = sel.recv(&r4); + let oper5 = sel.recv(&r5); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => panic!(), + i if i == oper2 => panic!(), + i if i == oper3 => panic!(), + i if i == oper4 => panic!(), + i if i == oper5 => assert_eq!(oper.recv(&r5), Ok(5)), + _ => unreachable!(), + } +} + +#[test] +fn disconnected() { + let (s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + scope(|scope| { + scope.spawn(|_| { + drop(s1); + thread::sleep(ms(500)); + s2.send(5).unwrap(); + }); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert!(oper.recv(&r1).is_err()), + i if i == oper2 => panic!(), + _ => unreachable!(), + }, + } + + r2.recv().unwrap(); + }).unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert!(oper.recv(&r1).is_err()), + i if i == oper2 => panic!(), + _ => unreachable!(), + }, + } + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + drop(s2); + }); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r2); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert!(oper.recv(&r2).is_err()), + _ => unreachable!(), + }, + } + }).unwrap(); +} + +#[test] +fn default() { + let (s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + let mut sel = Select::new(); + let _oper1 = sel.recv(&r1); + let _oper2 = sel.recv(&r2); + let oper = sel.try_select(); + match oper { + Err(_) => {} + Ok(_) => panic!(), + } + + drop(s1); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.try_select(); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert!(oper.recv(&r1).is_err()), + i if i == oper2 => panic!(), + _ => unreachable!(), + }, + } + + s2.send(2).unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r2); + let oper = sel.try_select(); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert_eq!(oper.recv(&r2), Ok(2)), + _ => unreachable!(), + }, + } + + let mut sel = Select::new(); + let _oper1 = sel.recv(&r2); + let oper = sel.try_select(); + match oper { + Err(_) => {} + Ok(_) => panic!(), + } + + let mut sel = Select::new(); + let oper = sel.try_select(); + match oper { + Err(_) => {} + Ok(_) => panic!(), + } +} + +#[test] +fn timeout() { + let (_s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(1500)); + s2.send(2).unwrap(); + }); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => {} + Ok(oper) => match oper.index() { + i if i == oper1 => panic!(), + i if i == oper2 => panic!(), + _ => unreachable!(), + }, + } + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => panic!(), + i if i == oper2 => assert_eq!(oper.recv(&r2), Ok(2)), + _ => unreachable!(), + }, + } + }).unwrap(); + + scope(|scope| { + let (s, r) = unbounded::(); + + scope.spawn(move |_| { + thread::sleep(ms(500)); + drop(s); + }); + + let mut sel = Select::new(); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => { + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.try_select(); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert!(oper.recv(&r).is_err()), + _ => unreachable!(), + }, + } + } + Ok(_) => unreachable!(), + } + }).unwrap(); +} + +#[test] +fn default_when_disconnected() { + let (_, r) = unbounded::(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.try_select(); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert!(oper.recv(&r).is_err()), + _ => unreachable!(), + }, + } + + let (_, r) = unbounded::(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert!(oper.recv(&r).is_err()), + _ => unreachable!(), + }, + } + + let (s, _) = bounded::(0); + + let mut sel = Select::new(); + let oper1 = sel.send(&s); + let oper = sel.try_select(); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert!(oper.send(&s, 0).is_err()), + _ => unreachable!(), + }, + } + + let (s, _) = bounded::(0); + + let mut sel = Select::new(); + let oper1 = sel.send(&s); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => assert!(oper.send(&s, 0).is_err()), + _ => unreachable!(), + }, + } +} + +#[test] +fn default_only() { + let start = Instant::now(); + + let mut sel = Select::new(); + let oper = sel.try_select(); + assert!(oper.is_err()); + let now = Instant::now(); + assert!(now - start <= ms(50)); + + let start = Instant::now(); + let mut sel = Select::new(); + let oper = sel.select_timeout(ms(500)); + assert!(oper.is_err()); + let now = Instant::now(); + assert!(now - start >= ms(450)); + assert!(now - start <= ms(550)); +} + +#[test] +fn unblocks() { + let (s1, r1) = bounded::(0); + let (s2, r2) = bounded::(0); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + s2.send(2).unwrap(); + }); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => panic!(), + i if i == oper2 => assert_eq!(oper.recv(&r2), Ok(2)), + _ => unreachable!(), + }, + } + }).unwrap(); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + assert_eq!(r1.recv().unwrap(), 1); + }); + + let mut sel = Select::new(); + let oper1 = sel.send(&s1); + let oper2 = sel.send(&s2); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + i if i == oper1 => oper.send(&s1, 1).unwrap(), + i if i == oper2 => panic!(), + _ => unreachable!(), + }, + } + }).unwrap(); +} + +#[test] +fn both_ready() { + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + s1.send(1).unwrap(); + assert_eq!(r2.recv().unwrap(), 2); + }); + + for _ in 0..2 { + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.send(&s2); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => assert_eq!(oper.recv(&r1), Ok(1)), + i if i == oper2 => oper.send(&s2, 2).unwrap(), + _ => unreachable!(), + } + } + }).unwrap(); +} + +#[test] +fn loop_try() { + const RUNS: usize = 20; + + for _ in 0..RUNS { + let (s1, r1) = bounded::(0); + let (s2, r2) = bounded::(0); + let (s_end, r_end) = bounded::<()>(0); + + scope(|scope| { + scope.spawn(|_| { + loop { + let mut done = false; + + let mut sel = Select::new(); + let oper1 = sel.send(&s1); + let oper = sel.try_select(); + match oper { + Err(_) => {} + Ok(oper) => match oper.index() { + i if i == oper1 => { + let _ = oper.send(&s1, 1); + done = true; + } + _ => unreachable!(), + }, + } + if done { + break; + } + + let mut sel = Select::new(); + let oper1 = sel.recv(&r_end); + let oper = sel.try_select(); + match oper { + Err(_) => {} + Ok(oper) => match oper.index() { + i if i == oper1 => { + let _ = oper.recv(&r_end); + done = true; + } + _ => unreachable!(), + }, + } + if done { + break; + } + } + }); + + scope.spawn(|_| { + loop { + if let Ok(x) = r2.try_recv() { + assert_eq!(x, 2); + break; + } + + let mut done = false; + let mut sel = Select::new(); + let oper1 = sel.recv(&r_end); + let oper = sel.try_select(); + match oper { + Err(_) => {} + Ok(oper) => match oper.index() { + i if i == oper1 => { + let _ = oper.recv(&r_end); + done = true; + } + _ => unreachable!(), + }, + } + if done { + break; + } + } + }); + + scope.spawn(|_| { + thread::sleep(ms(500)); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.send(&s2); + let oper = sel.select_timeout(ms(1000)); + match oper { + Err(_) => {} + Ok(oper) => match oper.index() { + i if i == oper1 => assert_eq!(oper.recv(&r1), Ok(1)), + i if i == oper2 => assert!(oper.send(&s2, 2).is_ok()), + _ => unreachable!(), + }, + } + + drop(s_end); + }); + }).unwrap(); + } +} + +#[test] +fn cloning1() { + scope(|scope| { + let (s1, r1) = unbounded::(); + let (_s2, r2) = unbounded::(); + let (s3, r3) = unbounded::<()>(); + + scope.spawn(move |_| { + r3.recv().unwrap(); + drop(s1.clone()); + assert!(r3.try_recv().is_err()); + s1.send(1).unwrap(); + r3.recv().unwrap(); + }); + + s3.send(()).unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => drop(oper.recv(&r1)), + i if i == oper2 => drop(oper.recv(&r2)), + _ => unreachable!(), + } + + s3.send(()).unwrap(); + }).unwrap(); +} + +#[test] +fn cloning2() { + let (s1, r1) = unbounded::<()>(); + let (s2, r2) = unbounded::<()>(); + let (_s3, _r3) = unbounded::<()>(); + + scope(|scope| { + scope.spawn(move |_| { + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => panic!(), + i if i == oper2 => drop(oper.recv(&r2)), + _ => unreachable!(), + } + }); + + thread::sleep(ms(500)); + drop(s1.clone()); + s2.send(()).unwrap(); + }).unwrap(); +} + +#[test] +fn preflight1() { + let (s, r) = unbounded(); + s.send(()).unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => drop(oper.recv(&r)), + _ => unreachable!(), + } +} + +#[test] +fn preflight2() { + let (s, r) = unbounded(); + drop(s.clone()); + s.send(()).unwrap(); + drop(s); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => assert_eq!(oper.recv(&r), Ok(())), + _ => unreachable!(), + } + + assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)); +} + +#[test] +fn preflight3() { + let (s, r) = unbounded(); + drop(s.clone()); + s.send(()).unwrap(); + drop(s); + r.recv().unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => assert!(oper.recv(&r).is_err()), + _ => unreachable!(), + } +} + +#[test] +fn duplicate_operations() { + let (s, r) = unbounded::(); + let hit = vec![Cell::new(false); 4]; + + while hit.iter().map(|h| h.get()).any(|hit| !hit) { + let mut sel = Select::new(); + let oper0 = sel.recv(&r); + let oper1 = sel.recv(&r); + let oper2 = sel.send(&s); + let oper3 = sel.send(&s); + let oper = sel.select(); + match oper.index() { + i if i == oper0 => { + assert!(oper.recv(&r).is_ok()); + hit[0].set(true); + } + i if i == oper1 => { + assert!(oper.recv(&r).is_ok()); + hit[1].set(true); + } + i if i == oper2 => { + assert!(oper.send(&s, 0).is_ok()); + hit[2].set(true); + } + i if i == oper3 => { + assert!(oper.send(&s, 0).is_ok()); + hit[3].set(true); + } + _ => unreachable!(), + } + } +} + +#[test] +fn nesting() { + let (s, r) = unbounded::(); + + let mut sel = Select::new(); + let oper1 = sel.send(&s); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => { + assert!(oper.send(&s, 0).is_ok()); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => { + assert_eq!(oper.recv(&r), Ok(0)); + + let mut sel = Select::new(); + let oper1 = sel.send(&s); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => { + assert!(oper.send(&s, 1).is_ok()); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => { + assert_eq!(oper.recv(&r), Ok(1)); + } + _ => unreachable!(), + } + } + _ => unreachable!(), + } + } + _ => unreachable!(), + } + } + _ => unreachable!(), + } +} + +#[test] +fn stress_recv() { + const COUNT: usize = 10_000; + + let (s1, r1) = unbounded(); + let (s2, r2) = bounded(5); + let (s3, r3) = bounded(100); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + s1.send(i).unwrap(); + r3.recv().unwrap(); + + s2.send(i).unwrap(); + r3.recv().unwrap(); + } + }); + + for i in 0..COUNT { + for _ in 0..2 { + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => assert_eq!(oper.recv(&r1), Ok(i)), + ix if ix == oper2 => assert_eq!(oper.recv(&r2), Ok(i)), + _ => unreachable!(), + } + + s3.send(()).unwrap(); + } + } + }).unwrap(); +} + +#[test] +fn stress_send() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + let (s3, r3) = bounded(100); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + assert_eq!(r1.recv().unwrap(), i); + assert_eq!(r2.recv().unwrap(), i); + r3.recv().unwrap(); + } + }); + + for i in 0..COUNT { + for _ in 0..2 { + let mut sel = Select::new(); + let oper1 = sel.send(&s1); + let oper2 = sel.send(&s2); + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => assert!(oper.send(&s1, i).is_ok()), + ix if ix == oper2 => assert!(oper.send(&s2, i).is_ok()), + _ => unreachable!(), + } + } + s3.send(()).unwrap(); + } + }).unwrap(); +} + +#[test] +fn stress_mixed() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + let (s3, r3) = bounded(100); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + s1.send(i).unwrap(); + assert_eq!(r2.recv().unwrap(), i); + r3.recv().unwrap(); + } + }); + + for i in 0..COUNT { + for _ in 0..2 { + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.send(&s2); + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => assert_eq!(oper.recv(&r1), Ok(i)), + ix if ix == oper2 => assert!(oper.send(&s2, i).is_ok()), + _ => unreachable!(), + } + } + s3.send(()).unwrap(); + } + }).unwrap(); +} + +#[test] +fn stress_timeout_two_threads() { + const COUNT: usize = 20; + + let (s, r) = bounded(2); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(500)); + } + + let mut done = false; + while !done { + let mut sel = Select::new(); + let oper1 = sel.send(&s); + let oper = sel.select_timeout(ms(100)); + match oper { + Err(_) => {} + Ok(oper) => match oper.index() { + ix if ix == oper1 => { + assert!(oper.send(&s, i).is_ok()); + break; + } + _ => unreachable!(), + }, + } + } + } + }); + + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(500)); + } + + let mut done = false; + while !done { + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.select_timeout(ms(100)); + match oper { + Err(_) => {} + Ok(oper) => match oper.index() { + ix if ix == oper1 => { + assert_eq!(oper.recv(&r), Ok(i)); + done = true; + } + _ => unreachable!(), + }, + } + } + } + }); + }).unwrap(); +} + +#[test] +fn send_recv_same_channel() { + let (s, r) = bounded::(0); + let mut sel = Select::new(); + let oper1 = sel.send(&s); + let oper2 = sel.recv(&r); + let oper = sel.select_timeout(ms(100)); + match oper { + Err(_) => {} + Ok(oper) => match oper.index() { + ix if ix == oper1 => panic!(), + ix if ix == oper2 => panic!(), + _ => unreachable!(), + }, + } + + let (s, r) = unbounded::(); + let mut sel = Select::new(); + let oper1 = sel.send(&s); + let oper2 = sel.recv(&r); + let oper = sel.select_timeout(ms(100)); + match oper { + Err(_) => panic!(), + Ok(oper) => match oper.index() { + ix if ix == oper1 => assert!(oper.send(&s, 0).is_ok()), + ix if ix == oper2 => panic!(), + _ => unreachable!(), + }, + } +} + +#[test] +fn matching() { + const THREADS: usize = 44; + + let (s, r) = &bounded::(0); + + scope(|scope| { + for i in 0..THREADS { + scope.spawn(move |_| { + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper2 = sel.send(&s); + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => assert_ne!(oper.recv(&r), Ok(i)), + ix if ix == oper2 => assert!(oper.send(&s, i).is_ok()), + _ => unreachable!(), + } + }); + } + }).unwrap(); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn matching_with_leftover() { + const THREADS: usize = 55; + + let (s, r) = &bounded::(0); + + scope(|scope| { + for i in 0..THREADS { + scope.spawn(move |_| { + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper2 = sel.send(&s); + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => assert_ne!(oper.recv(&r), Ok(i)), + ix if ix == oper2 => assert!(oper.send(&s, i).is_ok()), + _ => unreachable!(), + } + }); + } + s.send(!0).unwrap(); + }).unwrap(); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn channel_through_channel() { + const COUNT: usize = 1000; + + type T = Box; + + for cap in 0..3 { + let (s, r) = bounded::(cap); + + scope(|scope| { + scope.spawn(move |_| { + let mut s = s; + + for _ in 0..COUNT { + let (new_s, new_r) = bounded(cap); + let mut new_r: T = Box::new(Some(new_r)); + + { + let mut sel = Select::new(); + let oper1 = sel.send(&s); + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => assert!(oper.send(&s, new_r).is_ok()), + _ => unreachable!(), + } + } + + s = new_s; + } + }); + + scope.spawn(move |_| { + let mut r = r; + + for _ in 0..COUNT { + let new = { + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => oper + .recv(&r) + .unwrap() + .downcast_mut::>>() + .unwrap() + .take() + .unwrap(), + _ => unreachable!(), + } + }; + r = new; + } + }); + }).unwrap(); + } +} + +#[test] +fn linearizable_try() { + const COUNT: usize = 100_000; + + for step in 0..2 { + let (start_s, start_r) = bounded::<()>(0); + let (end_s, end_r) = bounded::<()>(0); + + let ((s1, r1), (s2, r2)) = if step == 0 { + (bounded::(1), bounded::(1)) + } else { + (unbounded::(), unbounded::()) + }; + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..COUNT { + start_s.send(()).unwrap(); + + s1.send(1).unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.try_select(); + match oper { + Err(_) => unreachable!(), + Ok(oper) => match oper.index() { + ix if ix == oper1 => assert!(oper.recv(&r1).is_ok()), + ix if ix == oper2 => assert!(oper.recv(&r2).is_ok()), + _ => unreachable!(), + }, + } + + end_s.send(()).unwrap(); + let _ = r2.try_recv(); + } + }); + + for _ in 0..COUNT { + start_r.recv().unwrap(); + + s2.send(1).unwrap(); + let _ = r1.try_recv(); + + end_r.recv().unwrap(); + } + }).unwrap(); + } +} + +#[test] +fn linearizable_timeout() { + const COUNT: usize = 100_000; + + for step in 0..2 { + let (start_s, start_r) = bounded::<()>(0); + let (end_s, end_r) = bounded::<()>(0); + + let ((s1, r1), (s2, r2)) = if step == 0 { + (bounded::(1), bounded::(1)) + } else { + (unbounded::(), unbounded::()) + }; + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..COUNT { + start_s.send(()).unwrap(); + + s1.send(1).unwrap(); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper = sel.select_timeout(ms(0)); + match oper { + Err(_) => unreachable!(), + Ok(oper) => match oper.index() { + ix if ix == oper1 => assert!(oper.recv(&r1).is_ok()), + ix if ix == oper2 => assert!(oper.recv(&r2).is_ok()), + _ => unreachable!(), + }, + } + + end_s.send(()).unwrap(); + let _ = r2.try_recv(); + } + }); + + for _ in 0..COUNT { + start_r.recv().unwrap(); + + s2.send(1).unwrap(); + let _ = r1.try_recv(); + + end_r.recv().unwrap(); + } + }).unwrap(); + } +} + +#[test] +fn fairness1() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded::<()>(COUNT); + let (s2, r2) = unbounded::<()>(); + + for _ in 0..COUNT { + s1.send(()).unwrap(); + s2.send(()).unwrap(); + } + + let hits = vec![Cell::new(0usize); 4]; + for _ in 0..COUNT { + let after = after(ms(0)); + let tick = tick(ms(0)); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper3 = sel.recv(&after); + let oper4 = sel.recv(&tick); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => { + oper.recv(&r1).unwrap(); + hits[0].set(hits[0].get() + 1); + } + i if i == oper2 => { + oper.recv(&r2).unwrap(); + hits[1].set(hits[1].get() + 1); + } + i if i == oper3 => { + oper.recv(&after).unwrap(); + hits[2].set(hits[2].get() + 1); + } + i if i == oper4 => { + oper.recv(&tick).unwrap(); + hits[3].set(hits[3].get() + 1); + } + _ => unreachable!(), + } + } + assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 2)); +} + +#[test] +fn fairness2() { + const COUNT: usize = 10_000; + + let (s1, r1) = unbounded::<()>(); + let (s2, r2) = bounded::<()>(1); + let (s3, r3) = bounded::<()>(0); + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..COUNT { + let mut sel = Select::new(); + let mut oper1 = None; + let mut oper2 = None; + if s1.is_empty() { + oper1 = Some(sel.send(&s1)); + } + if s2.is_empty() { + oper2 = Some(sel.send(&s2)); + } + let oper3 = sel.send(&s3); + let oper = sel.select(); + match oper.index() { + i if Some(i) == oper1 => assert!(oper.send(&s1, ()).is_ok()), + i if Some(i) == oper2 => assert!(oper.send(&s2, ()).is_ok()), + i if i == oper3 => assert!(oper.send(&s3, ()).is_ok()), + _ => unreachable!(), + } + } + }); + + let hits = vec![Cell::new(0usize); 3]; + for _ in 0..COUNT { + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper3 = sel.recv(&r3); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => { + oper.recv(&r1).unwrap(); + hits[0].set(hits[0].get() + 1); + } + i if i == oper2 => { + oper.recv(&r2).unwrap(); + hits[1].set(hits[1].get() + 1); + } + i if i == oper3 => { + oper.recv(&r3).unwrap(); + hits[2].set(hits[2].get() + 1); + } + _ => unreachable!(), + } + } + assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 50)); + }).unwrap(); +} + +#[test] +fn sync_and_clone() { + const THREADS: usize = 20; + + let (s, r) = &bounded::(0); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper2 = sel.send(&s); + let sel = &sel; + + scope(|scope| { + for i in 0..THREADS { + scope.spawn(move |_| { + let mut sel = sel.clone(); + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => assert_ne!(oper.recv(&r), Ok(i)), + ix if ix == oper2 => assert!(oper.send(&s, i).is_ok()), + _ => unreachable!(), + } + }); + } + }).unwrap(); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn send_and_clone() { + const THREADS: usize = 20; + + let (s, r) = &bounded::(0); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r); + let oper2 = sel.send(&s); + + scope(|scope| { + for i in 0..THREADS { + let mut sel = sel.clone(); + scope.spawn(move |_| { + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => assert_ne!(oper.recv(&r), Ok(i)), + ix if ix == oper2 => assert!(oper.send(&s, i).is_ok()), + _ => unreachable!(), + } + }); + } + }).unwrap(); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn reuse() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + let (s3, r3) = bounded(100); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + s1.send(i).unwrap(); + assert_eq!(r2.recv().unwrap(), i); + r3.recv().unwrap(); + } + }); + + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.send(&s2); + + for i in 0..COUNT { + for _ in 0..2 { + let oper = sel.select(); + match oper.index() { + ix if ix == oper1 => assert_eq!(oper.recv(&r1), Ok(i)), + ix if ix == oper2 => assert!(oper.send(&s2, i).is_ok()), + _ => unreachable!(), + } + } + s3.send(()).unwrap(); + } + }).unwrap(); +} diff --git a/vendor/crossbeam-channel/tests/select_macro.rs b/vendor/crossbeam-channel/tests/select_macro.rs new file mode 100644 index 0000000000..3b02e51978 --- /dev/null +++ b/vendor/crossbeam-channel/tests/select_macro.rs @@ -0,0 +1,1416 @@ +//! Tests for the `select!` macro. + +#![deny(unsafe_code)] + +#[macro_use] +extern crate crossbeam_channel; +extern crate crossbeam_utils; + +use std::any::Any; +use std::cell::Cell; +use std::ops::Deref; +use std::thread; +use std::time::{Duration, Instant}; + +use crossbeam_channel::{after, bounded, never, tick, unbounded}; +use crossbeam_channel::{Receiver, RecvError, SendError, Sender, TryRecvError}; +use crossbeam_utils::thread::scope; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn smoke1() { + let (s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + s1.send(1).unwrap(); + + select! { + recv(r1) -> v => assert_eq!(v, Ok(1)), + recv(r2) -> _ => panic!(), + } + + s2.send(2).unwrap(); + + select! { + recv(r1) -> _ => panic!(), + recv(r2) -> v => assert_eq!(v, Ok(2)), + } +} + +#[test] +fn smoke2() { + let (_s1, r1) = unbounded::(); + let (_s2, r2) = unbounded::(); + let (_s3, r3) = unbounded::(); + let (_s4, r4) = unbounded::(); + let (s5, r5) = unbounded::(); + + s5.send(5).unwrap(); + + select! { + recv(r1) -> _ => panic!(), + recv(r2) -> _ => panic!(), + recv(r3) -> _ => panic!(), + recv(r4) -> _ => panic!(), + recv(r5) -> v => assert_eq!(v, Ok(5)), + } +} + +#[test] +fn disconnected() { + let (s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + scope(|scope| { + scope.spawn(|_| { + drop(s1); + thread::sleep(ms(500)); + s2.send(5).unwrap(); + }); + + select! { + recv(r1) -> v => assert!(v.is_err()), + recv(r2) -> _ => panic!(), + default(ms(1000)) => panic!(), + } + + r2.recv().unwrap(); + }).unwrap(); + + select! { + recv(r1) -> v => assert!(v.is_err()), + recv(r2) -> _ => panic!(), + default(ms(1000)) => panic!(), + } + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + drop(s2); + }); + + select! { + recv(r2) -> v => assert!(v.is_err()), + default(ms(1000)) => panic!(), + } + }).unwrap(); +} + +#[test] +fn default() { + let (s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + select! { + recv(r1) -> _ => panic!(), + recv(r2) -> _ => panic!(), + default => {} + } + + drop(s1); + + select! { + recv(r1) -> v => assert!(v.is_err()), + recv(r2) -> _ => panic!(), + default => panic!(), + } + + s2.send(2).unwrap(); + + select! { + recv(r2) -> v => assert_eq!(v, Ok(2)), + default => panic!(), + } + + select! { + recv(r2) -> _ => panic!(), + default => {}, + } + + select! { + default => {}, + } +} + +#[test] +fn timeout() { + let (_s1, r1) = unbounded::(); + let (s2, r2) = unbounded::(); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(1500)); + s2.send(2).unwrap(); + }); + + select! { + recv(r1) -> _ => panic!(), + recv(r2) -> _ => panic!(), + default(ms(1000)) => {}, + } + + select! { + recv(r1) -> _ => panic!(), + recv(r2) -> v => assert_eq!(v, Ok(2)), + default(ms(1000)) => panic!(), + } + }).unwrap(); + + scope(|scope| { + let (s, r) = unbounded::(); + + scope.spawn(move |_| { + thread::sleep(ms(500)); + drop(s); + }); + + select! { + default(ms(1000)) => { + select! { + recv(r) -> v => assert!(v.is_err()), + default => panic!(), + } + } + } + }).unwrap(); +} + +#[test] +fn default_when_disconnected() { + let (_, r) = unbounded::(); + + select! { + recv(r) -> res => assert!(res.is_err()), + default => panic!(), + } + + let (_, r) = unbounded::(); + + select! { + recv(r) -> res => assert!(res.is_err()), + default(ms(1000)) => panic!(), + } + + let (s, _) = bounded::(0); + + select! { + send(s, 0) -> res => assert!(res.is_err()), + default => panic!(), + } + + let (s, _) = bounded::(0); + + select! { + send(s, 0) -> res => assert!(res.is_err()), + default(ms(1000)) => panic!(), + } +} + +#[test] +fn default_only() { + let start = Instant::now(); + select! { + default => {} + } + let now = Instant::now(); + assert!(now - start <= ms(50)); + + let start = Instant::now(); + select! { + default(ms(500)) => {} + } + let now = Instant::now(); + assert!(now - start >= ms(450)); + assert!(now - start <= ms(550)); +} + +#[test] +fn unblocks() { + let (s1, r1) = bounded::(0); + let (s2, r2) = bounded::(0); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + s2.send(2).unwrap(); + }); + + select! { + recv(r1) -> _ => panic!(), + recv(r2) -> v => assert_eq!(v, Ok(2)), + default(ms(1000)) => panic!(), + } + }).unwrap(); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + assert_eq!(r1.recv().unwrap(), 1); + }); + + select! { + send(s1, 1) -> _ => {}, + send(s2, 2) -> _ => panic!(), + default(ms(1000)) => panic!(), + } + }).unwrap(); +} + +#[test] +fn both_ready() { + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(500)); + s1.send(1).unwrap(); + assert_eq!(r2.recv().unwrap(), 2); + }); + + for _ in 0..2 { + select! { + recv(r1) -> v => assert_eq!(v, Ok(1)), + send(s2, 2) -> _ => {}, + } + } + }).unwrap(); +} + +#[test] +fn loop_try() { + const RUNS: usize = 20; + + for _ in 0..RUNS { + let (s1, r1) = bounded::(0); + let (s2, r2) = bounded::(0); + let (s_end, r_end) = bounded::<()>(0); + + scope(|scope| { + scope.spawn(|_| { + loop { + select! { + send(s1, 1) -> _ => break, + default => {} + } + + select! { + recv(r_end) -> _ => break, + default => {} + } + } + }); + + scope.spawn(|_| { + loop { + if let Ok(x) = r2.try_recv() { + assert_eq!(x, 2); + break; + } + + select! { + recv(r_end) -> _ => break, + default => {} + } + } + }); + + scope.spawn(|_| { + thread::sleep(ms(500)); + + select! { + recv(r1) -> v => assert_eq!(v, Ok(1)), + send(s2, 2) -> _ => {}, + default(ms(500)) => panic!(), + } + + drop(s_end); + }); + }).unwrap(); + } +} + +#[test] +fn cloning1() { + scope(|scope| { + let (s1, r1) = unbounded::(); + let (_s2, r2) = unbounded::(); + let (s3, r3) = unbounded::<()>(); + + scope.spawn(move |_| { + r3.recv().unwrap(); + drop(s1.clone()); + assert_eq!(r3.try_recv(), Err(TryRecvError::Empty)); + s1.send(1).unwrap(); + r3.recv().unwrap(); + }); + + s3.send(()).unwrap(); + + select! { + recv(r1) -> _ => {}, + recv(r2) -> _ => {}, + } + + s3.send(()).unwrap(); + }).unwrap(); +} + +#[test] +fn cloning2() { + let (s1, r1) = unbounded::<()>(); + let (s2, r2) = unbounded::<()>(); + let (_s3, _r3) = unbounded::<()>(); + + scope(|scope| { + scope.spawn(move |_| { + select! { + recv(r1) -> _ => panic!(), + recv(r2) -> _ => {}, + } + }); + + thread::sleep(ms(500)); + drop(s1.clone()); + s2.send(()).unwrap(); + }).unwrap(); +} + +#[test] +fn preflight1() { + let (s, r) = unbounded(); + s.send(()).unwrap(); + + select! { + recv(r) -> _ => {} + } +} + +#[test] +fn preflight2() { + let (s, r) = unbounded(); + drop(s.clone()); + s.send(()).unwrap(); + drop(s); + + select! { + recv(r) -> v => assert!(v.is_ok()), + } + assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)); +} + +#[test] +fn preflight3() { + let (s, r) = unbounded(); + drop(s.clone()); + s.send(()).unwrap(); + drop(s); + r.recv().unwrap(); + + select! { + recv(r) -> v => assert!(v.is_err()) + } +} + +#[test] +fn duplicate_operations() { + let (s, r) = unbounded::(); + let mut hit = [false; 4]; + + while hit.iter().any(|hit| !hit) { + select! { + recv(r) -> _ => hit[0] = true, + recv(r) -> _ => hit[1] = true, + send(s, 0) -> _ => hit[2] = true, + send(s, 0) -> _ => hit[3] = true, + } + } +} + +#[test] +fn nesting() { + let (s, r) = unbounded::(); + + select! { + send(s, 0) -> _ => { + select! { + recv(r) -> v => { + assert_eq!(v, Ok(0)); + select! { + send(s, 1) -> _ => { + select! { + recv(r) -> v => { + assert_eq!(v, Ok(1)); + } + } + } + } + } + } + } + } +} + +#[test] +#[should_panic(expected = "send panicked")] +fn panic_sender() { + fn get() -> Sender { + panic!("send panicked") + } + + #[allow(unreachable_code)] + { + select! { + send(get(), panic!()) -> _ => {} + } + } +} + +#[test] +#[should_panic(expected = "recv panicked")] +fn panic_receiver() { + fn get() -> Receiver { + panic!("recv panicked") + } + + select! { + recv(get()) -> _ => {} + } +} + +#[test] +fn stress_recv() { + const COUNT: usize = 10_000; + + let (s1, r1) = unbounded(); + let (s2, r2) = bounded(5); + let (s3, r3) = bounded(100); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + s1.send(i).unwrap(); + r3.recv().unwrap(); + + s2.send(i).unwrap(); + r3.recv().unwrap(); + } + }); + + for i in 0..COUNT { + for _ in 0..2 { + select! { + recv(r1) -> v => assert_eq!(v, Ok(i)), + recv(r2) -> v => assert_eq!(v, Ok(i)), + } + + s3.send(()).unwrap(); + } + } + }).unwrap(); +} + +#[test] +fn stress_send() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + let (s3, r3) = bounded(100); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + assert_eq!(r1.recv().unwrap(), i); + assert_eq!(r2.recv().unwrap(), i); + r3.recv().unwrap(); + } + }); + + for i in 0..COUNT { + for _ in 0..2 { + select! { + send(s1, i) -> _ => {}, + send(s2, i) -> _ => {}, + } + } + s3.send(()).unwrap(); + } + }).unwrap(); +} + +#[test] +fn stress_mixed() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded(0); + let (s2, r2) = bounded(0); + let (s3, r3) = bounded(100); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + s1.send(i).unwrap(); + assert_eq!(r2.recv().unwrap(), i); + r3.recv().unwrap(); + } + }); + + for i in 0..COUNT { + for _ in 0..2 { + select! { + recv(r1) -> v => assert_eq!(v, Ok(i)), + send(s2, i) -> _ => {}, + } + } + s3.send(()).unwrap(); + } + }).unwrap(); +} + +#[test] +fn stress_timeout_two_threads() { + const COUNT: usize = 20; + + let (s, r) = bounded(2); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(500)); + } + + loop { + select! { + send(s, i) -> _ => break, + default(ms(100)) => {} + } + } + } + }); + + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(500)); + } + + loop { + select! { + recv(r) -> v => { + assert_eq!(v, Ok(i)); + break; + } + default(ms(100)) => {} + } + } + } + }); + }).unwrap(); +} + +#[test] +fn send_recv_same_channel() { + let (s, r) = bounded::(0); + select! { + send(s, 0) -> _ => panic!(), + recv(r) -> _ => panic!(), + default(ms(500)) => {} + } + + let (s, r) = unbounded::(); + select! { + send(s, 0) -> _ => {}, + recv(r) -> _ => panic!(), + default(ms(500)) => panic!(), + } +} + +#[test] +fn matching() { + const THREADS: usize = 44; + + let (s, r) = &bounded::(0); + + scope(|scope| { + for i in 0..THREADS { + scope.spawn(move |_| { + select! { + recv(r) -> v => assert_ne!(v.unwrap(), i), + send(s, i) -> _ => {}, + } + }); + } + }).unwrap(); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn matching_with_leftover() { + const THREADS: usize = 55; + + let (s, r) = &bounded::(0); + + scope(|scope| { + for i in 0..THREADS { + scope.spawn(move |_| { + select! { + recv(r) -> v => assert_ne!(v.unwrap(), i), + send(s, i) -> _ => {}, + } + }); + } + s.send(!0).unwrap(); + }).unwrap(); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn channel_through_channel() { + const COUNT: usize = 1000; + + type T = Box; + + for cap in 0..3 { + let (s, r) = bounded::(cap); + + scope(|scope| { + scope.spawn(move |_| { + let mut s = s; + + for _ in 0..COUNT { + let (new_s, new_r) = bounded(cap); + let mut new_r: T = Box::new(Some(new_r)); + + select! { + send(s, new_r) -> _ => {} + } + + s = new_s; + } + }); + + scope.spawn(move |_| { + let mut r = r; + + for _ in 0..COUNT { + r = select! { + recv(r) -> mut msg => { + msg.unwrap() + .downcast_mut::>>() + .unwrap() + .take() + .unwrap() + } + } + } + }); + }).unwrap(); + } +} + +#[test] +fn linearizable_default() { + const COUNT: usize = 100_000; + + for step in 0..2 { + let (start_s, start_r) = bounded::<()>(0); + let (end_s, end_r) = bounded::<()>(0); + + let ((s1, r1), (s2, r2)) = if step == 0 { + (bounded::(1), bounded::(1)) + } else { + (unbounded::(), unbounded::()) + }; + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..COUNT { + start_s.send(()).unwrap(); + + s1.send(1).unwrap(); + select! { + recv(r1) -> _ => {} + recv(r2) -> _ => {} + default => unreachable!() + } + + end_s.send(()).unwrap(); + let _ = r2.try_recv(); + } + }); + + for _ in 0..COUNT { + start_r.recv().unwrap(); + + s2.send(1).unwrap(); + let _ = r1.try_recv(); + + end_r.recv().unwrap(); + } + }).unwrap(); + } +} + +#[test] +fn linearizable_timeout() { + const COUNT: usize = 100_000; + + for step in 0..2 { + let (start_s, start_r) = bounded::<()>(0); + let (end_s, end_r) = bounded::<()>(0); + + let ((s1, r1), (s2, r2)) = if step == 0 { + (bounded::(1), bounded::(1)) + } else { + (unbounded::(), unbounded::()) + }; + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..COUNT { + start_s.send(()).unwrap(); + + s1.send(1).unwrap(); + select! { + recv(r1) -> _ => {} + recv(r2) -> _ => {} + default(ms(0)) => unreachable!() + } + + end_s.send(()).unwrap(); + let _ = r2.try_recv(); + } + }); + + for _ in 0..COUNT { + start_r.recv().unwrap(); + + s2.send(1).unwrap(); + let _ = r1.try_recv(); + + end_r.recv().unwrap(); + } + }).unwrap(); + } +} + +#[test] +fn fairness1() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded::<()>(COUNT); + let (s2, r2) = unbounded::<()>(); + + for _ in 0..COUNT { + s1.send(()).unwrap(); + s2.send(()).unwrap(); + } + + let mut hits = [0usize; 4]; + for _ in 0..COUNT { + select! { + recv(r1) -> _ => hits[0] += 1, + recv(r2) -> _ => hits[1] += 1, + recv(after(ms(0))) -> _ => hits[2] += 1, + recv(tick(ms(0))) -> _ => hits[3] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); +} + +#[test] +fn fairness2() { + const COUNT: usize = 10_000; + + let (s1, r1) = unbounded::<()>(); + let (s2, r2) = bounded::<()>(1); + let (s3, r3) = bounded::<()>(0); + + scope(|scope| { + scope.spawn(|_| { + let (hole, _r) = bounded(0); + + for _ in 0..COUNT { + let s1 = if s1.is_empty() { &s1 } else { &hole }; + let s2 = if s2.is_empty() { &s2 } else { &hole }; + + select! { + send(s1, ()) -> res => assert!(res.is_ok()), + send(s2, ()) -> res => assert!(res.is_ok()), + send(s3, ()) -> res => assert!(res.is_ok()), + } + } + }); + + let hits = vec![Cell::new(0usize); 3]; + for _ in 0..COUNT { + select! { + recv(r1) -> _ => hits[0].set(hits[0].get() + 1), + recv(r2) -> _ => hits[1].set(hits[1].get() + 1), + recv(r3) -> _ => hits[2].set(hits[2].get() + 1), + } + } + assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 50)); + }).unwrap(); +} + +#[test] +fn fairness_recv() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded::<()>(COUNT); + let (s2, r2) = unbounded::<()>(); + + for _ in 0..COUNT { + s1.send(()).unwrap(); + s2.send(()).unwrap(); + } + + let mut hits = [0usize; 2]; + while hits[0] + hits[1] < COUNT { + select! { + recv(r1) -> _ => hits[0] += 1, + recv(r2) -> _ => hits[1] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / 4)); +} + +#[test] +fn fairness_send() { + const COUNT: usize = 10_000; + + let (s1, _r1) = bounded::<()>(COUNT); + let (s2, _r2) = unbounded::<()>(); + + let mut hits = [0usize; 2]; + for _ in 0..COUNT { + select! { + send(s1, ()) -> _ => hits[0] += 1, + send(s2, ()) -> _ => hits[1] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / 4)); +} + +#[test] +fn references() { + let (s, r) = unbounded::(); + select! { + send(s, 0) -> _ => {} + recv(r) -> _ => {} + } + select! { + send(&&&&s, 0) -> _ => {} + recv(&&&&r) -> _ => {} + } + select! { + recv(Some(&r).unwrap_or(&never())) -> _ => {}, + default => {} + } + select! { + recv(Some(r).unwrap_or(never())) -> _ => {}, + default => {} + } +} + +#[test] +fn case_blocks() { + let (s, r) = unbounded::(); + + select! { + recv(r) -> _ => 3.0, + recv(r) -> _ => loop { + unreachable!() + }, + recv(r) -> _ => match 7 + 3 { + _ => unreachable!() + }, + default => 7. + }; + + select! { + recv(r) -> msg => if msg.is_ok() { + unreachable!() + }, + default => () + } + + drop(s); +} + +#[test] +fn move_handles() { + let (s, r) = unbounded::(); + select! { + recv((move || r)()) -> _ => {} + send((move || s)(), 0) -> _ => {} + } +} + +#[test] +fn infer_types() { + let (s, r) = unbounded(); + select! { + recv(r) -> _ => {} + default => {} + } + s.send(()).unwrap(); + + let (s, r) = unbounded(); + select! { + send(s, ()) -> _ => {} + } + r.recv().unwrap(); +} + +#[test] +fn default_syntax() { + let (s, r) = bounded::(0); + + select! { + recv(r) -> _ => panic!(), + default => {} + } + select! { + send(s, 0) -> _ => panic!(), + default() => {} + } + select! { + default => {} + } + select! { + default() => {} + } +} + +#[test] +fn same_variable_name() { + let (_, r) = unbounded::(); + select! { + recv(r) -> r => assert!(r.is_err()), + } +} + +#[test] +fn handles_on_heap() { + let (s, r) = unbounded::(); + let (s, r) = (Box::new(s), Box::new(r)); + + select! { + send(*s, 0) -> _ => {} + recv(*r) -> _ => {} + default => {} + } + + drop(s); + drop(r); +} + +#[test] +fn once_blocks() { + let (s, r) = unbounded::(); + + let once = Box::new(()); + select! { + send(s, 0) -> _ => drop(once), + } + + let once = Box::new(()); + select! { + recv(r) -> _ => drop(once), + } + + let once1 = Box::new(()); + let once2 = Box::new(()); + select! { + send(s, 0) -> _ => drop(once1), + default => drop(once2), + } + + let once1 = Box::new(()); + let once2 = Box::new(()); + select! { + recv(r) -> _ => drop(once1), + default => drop(once2), + } + + let once1 = Box::new(()); + let once2 = Box::new(()); + select! { + recv(r) -> _ => drop(once1), + send(s, 0) -> _ => drop(once2), + } +} + +#[test] +fn once_receiver() { + let (_, r) = unbounded::(); + + let once = Box::new(()); + let get = move || { + drop(once); + r + }; + + select! { + recv(get()) -> _ => {} + } +} + +#[test] +fn once_sender() { + let (s, _) = unbounded::(); + + let once = Box::new(()); + let get = move || { + drop(once); + s + }; + + select! { + send(get(), 5) -> _ => {} + } +} + +#[test] +fn parse_nesting() { + let (_, r) = unbounded::(); + + select! { + recv(r) -> _ => {} + recv(r) -> _ => { + select! { + recv(r) -> _ => {} + recv(r) -> _ => { + select! { + recv(r) -> _ => {} + recv(r) -> _ => { + select! { + default => {} + } + } + } + } + } + } + } +} + +#[test] +fn evaluate() { + let (s, r) = unbounded::(); + + let v = select! { + recv(r) -> _ => "foo".into(), + send(s, 0) -> _ => "bar".to_owned(), + default => "baz".to_string(), + }; + assert_eq!(v, "bar"); + + let v = select! { + recv(r) -> _ => "foo".into(), + default => "baz".to_string(), + }; + assert_eq!(v, "foo"); + + let v = select! { + recv(r) -> _ => "foo".into(), + default => "baz".to_string(), + }; + assert_eq!(v, "baz"); +} + +#[test] +fn deref() { + use crossbeam_channel as cc; + + struct Sender(cc::Sender); + struct Receiver(cc::Receiver); + + impl Deref for Receiver { + type Target = cc::Receiver; + + fn deref(&self) -> &Self::Target { + &self.0 + } + } + + impl Deref for Sender { + type Target = cc::Sender; + + fn deref(&self) -> &Self::Target { + &self.0 + } + } + + let (s, r) = bounded::(0); + let (s, r) = (Sender(s), Receiver(r)); + + select! { + send(s, 0) -> _ => panic!(), + recv(r) -> _ => panic!(), + default => {} + } +} + +#[test] +fn result_types() { + let (s, _) = bounded::(0); + let (_, r) = bounded::(0); + + select! { + recv(r) -> res => drop::>(res), + } + select! { + recv(r) -> res => drop::>(res), + default => {} + } + select! { + recv(r) -> res => drop::>(res), + default(ms(0)) => {} + } + + select! { + send(s, 0) -> res => drop::>>(res), + } + select! { + send(s, 0) -> res => drop::>>(res), + default => {} + } + select! { + send(s, 0) -> res => drop::>>(res), + default(ms(0)) => {} + } + + select! { + send(s, 0) -> res => drop::>>(res), + recv(r) -> res => drop::>(res), + } +} + +#[test] +fn try_recv() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + select! { + recv(r) -> _ => panic!(), + default => {} + } + thread::sleep(ms(1500)); + select! { + recv(r) -> v => assert_eq!(v, Ok(7)), + default => panic!(), + } + thread::sleep(ms(500)); + select! { + recv(r) -> v => assert_eq!(v, Err(RecvError)), + default => panic!(), + } + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + select! { + send(s, 7) -> res => res.unwrap(), + } + }); + }).unwrap(); +} + +#[test] +fn recv() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + select! { + recv(r) -> v => assert_eq!(v, Ok(7)), + } + thread::sleep(ms(1000)); + select! { + recv(r) -> v => assert_eq!(v, Ok(8)), + } + thread::sleep(ms(1000)); + select! { + recv(r) -> v => assert_eq!(v, Ok(9)), + } + select! { + recv(r) -> v => assert_eq!(v, Err(RecvError)), + } + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + select! { + send(s, 7) -> res => res.unwrap(), + } + select! { + send(s, 8) -> res => res.unwrap(), + } + select! { + send(s, 9) -> res => res.unwrap(), + } + }); + }).unwrap(); +} + +#[test] +fn recv_timeout() { + let (s, r) = bounded::(0); + + scope(|scope| { + scope.spawn(move |_| { + select! { + recv(r) -> _ => panic!(), + default(ms(1000)) => {} + } + select! { + recv(r) -> v => assert_eq!(v, Ok(7)), + default(ms(1000)) => panic!(), + } + select! { + recv(r) -> v => assert_eq!(v, Err(RecvError)), + default(ms(1000)) => panic!(), + } + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + select! { + send(s, 7) -> res => res.unwrap(), + } + }); + }).unwrap(); +} + +#[test] +fn try_send() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + select! { + send(s, 7) -> _ => panic!(), + default => {} + } + thread::sleep(ms(1500)); + select! { + send(s, 8) -> res => res.unwrap(), + default => panic!(), + } + thread::sleep(ms(500)); + select! { + send(s, 8) -> res => assert_eq!(res, Err(SendError(8))), + default => panic!(), + } + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + select! { + recv(r) -> v => assert_eq!(v, Ok(8)), + } + }); + }).unwrap(); +} + +#[test] +fn send() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + select! { + send(s, 7) -> res => res.unwrap(), + } + thread::sleep(ms(1000)); + select! { + send(s, 8) -> res => res.unwrap(), + } + thread::sleep(ms(1000)); + select! { + send(s, 9) -> res => res.unwrap(), + } + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + select! { + recv(r) -> v => assert_eq!(v, Ok(7)), + } + select! { + recv(r) -> v => assert_eq!(v, Ok(8)), + } + select! { + recv(r) -> v => assert_eq!(v, Ok(9)), + } + }); + }).unwrap(); +} + +#[test] +fn send_timeout() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + select! { + send(s, 7) -> _ => panic!(), + default(ms(1000)) => {} + } + select! { + send(s, 8) -> res => res.unwrap(), + default(ms(1000)) => panic!(), + } + select! { + send(s, 9) -> res => assert_eq!(res, Err(SendError(9))), + default(ms(1000)) => panic!(), + } + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + select! { + recv(r) -> v => assert_eq!(v, Ok(8)), + } + }); + }).unwrap(); +} + +#[test] +fn disconnect_wakes_sender() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + select! { + send(s, ()) -> res => assert_eq!(res, Err(SendError(()))), + } + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + drop(r); + }); + }).unwrap(); +} + +#[test] +fn disconnect_wakes_receiver() { + let (s, r) = bounded::<()>(0); + + scope(|scope| { + scope.spawn(move |_| { + select! { + recv(r) -> res => assert_eq!(res, Err(RecvError)), + } + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + drop(s); + }); + }).unwrap(); +} diff --git a/vendor/crossbeam-channel/tests/thread_locals.rs b/vendor/crossbeam-channel/tests/thread_locals.rs new file mode 100644 index 0000000000..bc4af4d80e --- /dev/null +++ b/vendor/crossbeam-channel/tests/thread_locals.rs @@ -0,0 +1,53 @@ +//! Tests that make sure accessing thread-locals while exiting the thread doesn't cause panics. + +#[macro_use] +extern crate crossbeam_channel; +extern crate crossbeam_utils; + +use std::thread; +use std::time::Duration; + +use crossbeam_channel::unbounded; +use crossbeam_utils::thread::scope; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn use_while_exiting() { + struct Foo; + + impl Drop for Foo { + fn drop(&mut self) { + // A blocking operation after the thread-locals have been dropped. This will attempt to + // use the thread-locals and must not panic. + let (_s, r) = unbounded::<()>(); + select! { + recv(r) -> _ => {} + default(ms(100)) => {} + } + } + } + + thread_local! { + static FOO: Foo = Foo; + } + + let (s, r) = unbounded::<()>(); + + scope(|scope| { + scope.spawn(|_| { + // First initialize `FOO`, then the thread-locals related to crossbeam-channel. + FOO.with(|_| ()); + r.recv().unwrap(); + // At thread exit, thread-locals related to crossbeam-channel get dropped first and + // `FOO` is dropped last. + }); + + scope.spawn(|_| { + thread::sleep(ms(100)); + s.send(()).unwrap(); + }); + }).unwrap(); +} diff --git a/vendor/crossbeam-channel/tests/tick.rs b/vendor/crossbeam-channel/tests/tick.rs new file mode 100644 index 0000000000..3873db87d5 --- /dev/null +++ b/vendor/crossbeam-channel/tests/tick.rs @@ -0,0 +1,350 @@ +//! Tests for the tick channel flavor. + +#[macro_use] +extern crate crossbeam_channel; +extern crate crossbeam_utils; +extern crate rand; + +use std::sync::atomic::AtomicUsize; +use std::sync::atomic::Ordering; +use std::thread; +use std::time::{Duration, Instant}; + +use crossbeam_channel::{after, tick, Select, TryRecvError}; +use crossbeam_utils::thread::scope; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn fire() { + let start = Instant::now(); + let r = tick(ms(50)); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + thread::sleep(ms(100)); + + let fired = r.try_recv().unwrap(); + assert!(start < fired); + assert!(fired - start >= ms(50)); + + let now = Instant::now(); + assert!(fired < now); + assert!(now - fired >= ms(50)); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + + select! { + recv(r) -> _ => panic!(), + default => {} + } + + select! { + recv(r) -> _ => {} + recv(tick(ms(200))) -> _ => panic!(), + } +} + +#[test] +fn intervals() { + let start = Instant::now(); + let r = tick(ms(50)); + + let t1 = r.recv().unwrap(); + assert!(start + ms(50) <= t1); + assert!(start + ms(100) > t1); + + thread::sleep(ms(300)); + let t2 = r.try_recv().unwrap(); + assert!(start + ms(100) <= t2); + assert!(start + ms(150) > t2); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + let t3 = r.recv().unwrap(); + assert!(start + ms(400) <= t3); + assert!(start + ms(450) > t3); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn capacity() { + const COUNT: usize = 10; + + for i in 0..COUNT { + let r = tick(ms(i as u64)); + assert_eq!(r.capacity(), Some(1)); + } +} + +#[test] +fn len_empty_full() { + let r = tick(ms(50)); + + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), false); + + thread::sleep(ms(100)); + + assert_eq!(r.len(), 1); + assert_eq!(r.is_empty(), false); + assert_eq!(r.is_full(), true); + + r.try_recv().unwrap(); + + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), false); +} + +#[test] +fn try_recv() { + let r = tick(ms(200)); + assert!(r.try_recv().is_err()); + + thread::sleep(ms(100)); + assert!(r.try_recv().is_err()); + + thread::sleep(ms(200)); + assert!(r.try_recv().is_ok()); + assert!(r.try_recv().is_err()); + + thread::sleep(ms(200)); + assert!(r.try_recv().is_ok()); + assert!(r.try_recv().is_err()); +} + +#[test] +fn recv() { + let start = Instant::now(); + let r = tick(ms(50)); + + let fired = r.recv().unwrap(); + assert!(start < fired); + assert!(fired - start >= ms(50)); + + let now = Instant::now(); + assert!(fired < now); + assert!(now - fired < fired - start); + + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn recv_timeout() { + let start = Instant::now(); + let r = tick(ms(200)); + + assert!(r.recv_timeout(ms(100)).is_err()); + let now = Instant::now(); + assert!(now - start >= ms(100)); + assert!(now - start <= ms(150)); + + let fired = r.recv_timeout(ms(200)).unwrap(); + assert!(fired - start >= ms(200)); + assert!(fired - start <= ms(250)); + + assert!(r.recv_timeout(ms(100)).is_err()); + let now = Instant::now(); + assert!(now - start >= ms(300)); + assert!(now - start <= ms(350)); + + let fired = r.recv_timeout(ms(200)).unwrap(); + assert!(fired - start >= ms(400)); + assert!(fired - start <= ms(450)); +} + +#[test] +fn recv_two() { + let r1 = tick(ms(50)); + let r2 = tick(ms(50)); + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..10 { + select! { + recv(r1) -> _ => {} + recv(r2) -> _ => {} + } + } + }); + scope.spawn(|_| { + for _ in 0..10 { + select! { + recv(r1) -> _ => {} + recv(r2) -> _ => {} + } + } + }); + }).unwrap(); +} + +#[test] +fn recv_race() { + select! { + recv(tick(ms(50))) -> _ => {} + recv(tick(ms(100))) -> _ => panic!(), + } + + select! { + recv(tick(ms(100))) -> _ => panic!(), + recv(tick(ms(50))) -> _ => {} + } +} + +#[test] +fn stress_default() { + const COUNT: usize = 10; + + for _ in 0..COUNT { + select! { + recv(tick(ms(0))) -> _ => {} + default => panic!(), + } + } + + for _ in 0..COUNT { + select! { + recv(tick(ms(100))) -> _ => panic!(), + default => {} + } + } +} + +#[test] +fn select() { + const THREADS: usize = 4; + + let hits = AtomicUsize::new(0); + let r1 = tick(ms(200)); + let r2 = tick(ms(300)); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + let timeout = after(ms(1100)); + loop { + let mut sel = Select::new(); + let oper1 = sel.recv(&r1); + let oper2 = sel.recv(&r2); + let oper3 = sel.recv(&timeout); + let oper = sel.select(); + match oper.index() { + i if i == oper1 => { + oper.recv(&r1).unwrap(); + hits.fetch_add(1, Ordering::SeqCst); + } + i if i == oper2 => { + oper.recv(&r2).unwrap(); + hits.fetch_add(1, Ordering::SeqCst); + } + i if i == oper3 => { + oper.recv(&timeout).unwrap(); + break; + } + _ => unreachable!(), + } + } + }); + } + }).unwrap(); + + assert_eq!(hits.load(Ordering::SeqCst), 8); +} + +#[test] +fn ready() { + const THREADS: usize = 4; + + let hits = AtomicUsize::new(0); + let r1 = tick(ms(200)); + let r2 = tick(ms(300)); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + let timeout = after(ms(1100)); + 'outer: loop { + let mut sel = Select::new(); + sel.recv(&r1); + sel.recv(&r2); + sel.recv(&timeout); + loop { + match sel.ready() { + 0 => { + if r1.try_recv().is_ok() { + hits.fetch_add(1, Ordering::SeqCst); + break; + } + } + 1 => { + if r2.try_recv().is_ok() { + hits.fetch_add(1, Ordering::SeqCst); + break; + } + } + 2 => { + if timeout.try_recv().is_ok() { + break 'outer; + } + } + _ => unreachable!(), + } + } + } + }); + } + }).unwrap(); + + assert_eq!(hits.load(Ordering::SeqCst), 8); +} + +#[test] +fn fairness() { + const COUNT: usize = 30; + + for &dur in &[0, 1] { + let mut hits = [0usize; 2]; + + for _ in 0..COUNT { + let r1 = tick(ms(dur)); + let r2 = tick(ms(dur)); + + for _ in 0..COUNT { + select! { + recv(r1) -> _ => hits[0] += 1, + recv(r2) -> _ => hits[1] += 1, + } + } + } + + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); + } +} + +#[test] +fn fairness_duplicates() { + const COUNT: usize = 30; + + for &dur in &[0, 1] { + let mut hits = [0usize; 5]; + + for _ in 0..COUNT { + let r = tick(ms(dur)); + + for _ in 0..COUNT { + select! { + recv(r) -> _ => hits[0] += 1, + recv(r) -> _ => hits[1] += 1, + recv(r) -> _ => hits[2] += 1, + recv(r) -> _ => hits[3] += 1, + recv(r) -> _ => hits[4] += 1, + } + } + } + + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); + } +} diff --git a/vendor/crossbeam-channel/tests/zero.rs b/vendor/crossbeam-channel/tests/zero.rs new file mode 100644 index 0000000000..cb989e30c4 --- /dev/null +++ b/vendor/crossbeam-channel/tests/zero.rs @@ -0,0 +1,501 @@ +//! Tests for the zero channel flavor. + +#[macro_use] +extern crate crossbeam_channel; +extern crate crossbeam_utils; +extern crate rand; + +use std::sync::atomic::AtomicUsize; +use std::sync::atomic::Ordering; +use std::thread; +use std::time::Duration; + +use crossbeam_channel::bounded; +use crossbeam_channel::{RecvError, RecvTimeoutError, TryRecvError}; +use crossbeam_channel::{SendError, SendTimeoutError, TrySendError}; +use crossbeam_utils::thread::scope; +use rand::{thread_rng, Rng}; + +fn ms(ms: u64) -> Duration { + Duration::from_millis(ms) +} + +#[test] +fn smoke() { + let (s, r) = bounded(0); + assert_eq!(s.try_send(7), Err(TrySendError::Full(7))); + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); +} + +#[test] +fn capacity() { + let (s, r) = bounded::<()>(0); + assert_eq!(s.capacity(), Some(0)); + assert_eq!(r.capacity(), Some(0)); +} + +#[test] +fn len_empty_full() { + let (s, r) = bounded(0); + + assert_eq!(s.len(), 0); + assert_eq!(s.is_empty(), true); + assert_eq!(s.is_full(), true); + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), true); + + scope(|scope| { + scope.spawn(|_| s.send(0).unwrap()); + scope.spawn(|_| r.recv().unwrap()); + }).unwrap(); + + assert_eq!(s.len(), 0); + assert_eq!(s.is_empty(), true); + assert_eq!(s.is_full(), true); + assert_eq!(r.len(), 0); + assert_eq!(r.is_empty(), true); + assert_eq!(r.is_full(), true); +} + +#[test] +fn try_recv() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.try_recv(), Err(TryRecvError::Empty)); + thread::sleep(ms(1500)); + assert_eq!(r.try_recv(), Ok(7)); + thread::sleep(ms(500)); + assert_eq!(r.try_recv(), Err(TryRecvError::Disconnected)); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + s.send(7).unwrap(); + }); + }).unwrap(); +} + +#[test] +fn recv() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.recv(), Ok(7)); + thread::sleep(ms(1000)); + assert_eq!(r.recv(), Ok(8)); + thread::sleep(ms(1000)); + assert_eq!(r.recv(), Ok(9)); + assert_eq!(r.recv(), Err(RecvError)); + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + s.send(7).unwrap(); + s.send(8).unwrap(); + s.send(9).unwrap(); + }); + }).unwrap(); +} + +#[test] +fn recv_timeout() { + let (s, r) = bounded::(0); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.recv_timeout(ms(1000)), Err(RecvTimeoutError::Timeout)); + assert_eq!(r.recv_timeout(ms(1000)), Ok(7)); + assert_eq!( + r.recv_timeout(ms(1000)), + Err(RecvTimeoutError::Disconnected) + ); + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + s.send(7).unwrap(); + }); + }).unwrap(); +} + +#[test] +fn try_send() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(s.try_send(7), Err(TrySendError::Full(7))); + thread::sleep(ms(1500)); + assert_eq!(s.try_send(8), Ok(())); + thread::sleep(ms(500)); + assert_eq!(s.try_send(9), Err(TrySendError::Disconnected(9))); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + assert_eq!(r.recv(), Ok(8)); + }); + }).unwrap(); +} + +#[test] +fn send() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + s.send(7).unwrap(); + thread::sleep(ms(1000)); + s.send(8).unwrap(); + thread::sleep(ms(1000)); + s.send(9).unwrap(); + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + assert_eq!(r.recv(), Ok(7)); + assert_eq!(r.recv(), Ok(8)); + assert_eq!(r.recv(), Ok(9)); + }); + }).unwrap(); +} + +#[test] +fn send_timeout() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!( + s.send_timeout(7, ms(1000)), + Err(SendTimeoutError::Timeout(7)) + ); + assert_eq!(s.send_timeout(8, ms(1000)), Ok(())); + assert_eq!( + s.send_timeout(9, ms(1000)), + Err(SendTimeoutError::Disconnected(9)) + ); + }); + scope.spawn(move |_| { + thread::sleep(ms(1500)); + assert_eq!(r.recv(), Ok(8)); + }); + }).unwrap(); +} + +#[test] +fn len() { + const COUNT: usize = 25_000; + + let (s, r) = bounded(0); + + assert_eq!(s.len(), 0); + assert_eq!(r.len(), 0); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + assert_eq!(r.recv(), Ok(i)); + assert_eq!(r.len(), 0); + } + }); + + scope.spawn(|_| { + for i in 0..COUNT { + s.send(i).unwrap(); + assert_eq!(s.len(), 0); + } + }); + }).unwrap(); + + assert_eq!(s.len(), 0); + assert_eq!(r.len(), 0); +} + +#[test] +fn disconnect_wakes_sender() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(s.send(()), Err(SendError(()))); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + drop(r); + }); + }).unwrap(); +} + +#[test] +fn disconnect_wakes_receiver() { + let (s, r) = bounded::<()>(0); + + scope(|scope| { + scope.spawn(move |_| { + assert_eq!(r.recv(), Err(RecvError)); + }); + scope.spawn(move |_| { + thread::sleep(ms(1000)); + drop(s); + }); + }).unwrap(); +} + +#[test] +fn spsc() { + const COUNT: usize = 100_000; + + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + for i in 0..COUNT { + assert_eq!(r.recv(), Ok(i)); + } + assert_eq!(r.recv(), Err(RecvError)); + }); + scope.spawn(move |_| { + for i in 0..COUNT { + s.send(i).unwrap(); + } + }); + }).unwrap(); +} + +#[test] +fn mpmc() { + const COUNT: usize = 25_000; + const THREADS: usize = 4; + + let (s, r) = bounded::(0); + let v = (0..COUNT).map(|_| AtomicUsize::new(0)).collect::>(); + + scope(|scope| { + for _ in 0..THREADS { + scope.spawn(|_| { + for _ in 0..COUNT { + let n = r.recv().unwrap(); + v[n].fetch_add(1, Ordering::SeqCst); + } + }); + } + for _ in 0..THREADS { + scope.spawn(|_| { + for i in 0..COUNT { + s.send(i).unwrap(); + } + }); + } + }).unwrap(); + + for c in v { + assert_eq!(c.load(Ordering::SeqCst), THREADS); + } +} + +#[test] +fn stress_oneshot() { + const COUNT: usize = 10_000; + + for _ in 0..COUNT { + let (s, r) = bounded(1); + + scope(|scope| { + scope.spawn(|_| r.recv().unwrap()); + scope.spawn(|_| s.send(0).unwrap()); + }).unwrap(); + } +} + +#[test] +fn stress_iter() { + const COUNT: usize = 1000; + + let (request_s, request_r) = bounded(0); + let (response_s, response_r) = bounded(0); + + scope(|scope| { + scope.spawn(move |_| { + let mut count = 0; + loop { + for x in response_r.try_iter() { + count += x; + if count == COUNT { + return; + } + } + let _ = request_s.try_send(()); + } + }); + + for _ in request_r.iter() { + if response_s.send(1).is_err() { + break; + } + } + }).unwrap(); +} + +#[test] +fn stress_timeout_two_threads() { + const COUNT: usize = 100; + + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(50)); + } + loop { + if let Ok(()) = s.send_timeout(i, ms(10)) { + break; + } + } + } + }); + + scope.spawn(|_| { + for i in 0..COUNT { + if i % 2 == 0 { + thread::sleep(ms(50)); + } + loop { + if let Ok(x) = r.recv_timeout(ms(10)) { + assert_eq!(x, i); + break; + } + } + } + }); + }).unwrap(); +} + +#[test] +fn drops() { + static DROPS: AtomicUsize = AtomicUsize::new(0); + + #[derive(Debug, PartialEq)] + struct DropCounter; + + impl Drop for DropCounter { + fn drop(&mut self) { + DROPS.fetch_add(1, Ordering::SeqCst); + } + } + + let mut rng = thread_rng(); + + for _ in 0..100 { + let steps = rng.gen_range(0, 3_000); + + DROPS.store(0, Ordering::SeqCst); + let (s, r) = bounded::(0); + + scope(|scope| { + scope.spawn(|_| { + for _ in 0..steps { + r.recv().unwrap(); + } + }); + + scope.spawn(|_| { + for _ in 0..steps { + s.send(DropCounter).unwrap(); + } + }); + }).unwrap(); + + assert_eq!(DROPS.load(Ordering::SeqCst), steps); + drop(s); + drop(r); + assert_eq!(DROPS.load(Ordering::SeqCst), steps); + } +} + +#[test] +fn fairness() { + const COUNT: usize = 10_000; + + let (s1, r1) = bounded::<()>(0); + let (s2, r2) = bounded::<()>(0); + + scope(|scope| { + scope.spawn(|_| { + let mut hits = [0usize; 2]; + for _ in 0..COUNT { + select! { + recv(r1) -> _ => hits[0] += 1, + recv(r2) -> _ => hits[1] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); + }); + + let mut hits = [0usize; 2]; + for _ in 0..COUNT { + select! { + send(s1, ()) -> _ => hits[0] += 1, + send(s2, ()) -> _ => hits[1] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); + }).unwrap(); +} + +#[test] +fn fairness_duplicates() { + const COUNT: usize = 10_000; + + let (s, r) = bounded::<()>(0); + + scope(|scope| { + scope.spawn(|_| { + let mut hits = [0usize; 5]; + for _ in 0..COUNT { + select! { + recv(r) -> _ => hits[0] += 1, + recv(r) -> _ => hits[1] += 1, + recv(r) -> _ => hits[2] += 1, + recv(r) -> _ => hits[3] += 1, + recv(r) -> _ => hits[4] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); + }); + + let mut hits = [0usize; 5]; + for _ in 0..COUNT { + select! { + send(s, ()) -> _ => hits[0] += 1, + send(s, ()) -> _ => hits[1] += 1, + send(s, ()) -> _ => hits[2] += 1, + send(s, ()) -> _ => hits[3] += 1, + send(s, ()) -> _ => hits[4] += 1, + } + } + assert!(hits.iter().all(|x| *x >= COUNT / hits.len() / 2)); + }).unwrap(); +} + +#[test] +fn recv_in_send() { + let (s, r) = bounded(0); + + scope(|scope| { + scope.spawn(|_| { + thread::sleep(ms(100)); + r.recv() + }); + + scope.spawn(|_| { + thread::sleep(ms(500)); + s.send(()).unwrap(); + }); + + select! { + send(s, r.recv().unwrap()) -> _ => {} + } + }).unwrap(); +} diff --git a/vendor/fixedbitset/.cargo-checksum.json b/vendor/fixedbitset/.cargo-checksum.json deleted file mode 100644 index aaa2d55ed2..0000000000 --- a/vendor/fixedbitset/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"3d2663ac3e53cc4ec5f59b249c80466a17bb1fddba1be31e0d090c76915e2555","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ce592787ff2321feab698a4c612237f4378cc658ebb1d472913e5802cc47afb4","README.rst":"86b1b75febbb6f51502f41551066a2c246a64b3dba4cd2169755e8b437b53699","benches/benches.rs":"745803c7962409ba8a63635336ca5f6b971ef1dc8f46e2cdee2a8a0c6b86e9a9","src/lib.rs":"288c0bd61e043792f51c5ae938ed3b02513218ed3828cda31b5e696599853e56","src/range.rs":"6c9fd2462e353221dcf63393a78783428995a9460de3e4c799bd00a273dda9d8"},"package":"86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33"} \ No newline at end of file diff --git a/vendor/fixedbitset/Cargo.toml b/vendor/fixedbitset/Cargo.toml deleted file mode 100644 index 62db06c938..0000000000 --- a/vendor/fixedbitset/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies -# -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -name = "fixedbitset" -version = "0.1.9" -authors = ["bluss"] -description = "FixedBitSet is a simple bitset collection" -documentation = "https://docs.rs/fixedbitset/" -keywords = ["container", "data-structure", "bitvec", "bitset"] -categories = ["data-structures"] -license = "MIT/Apache-2.0" -repository = "https://github.com/bluss/fixedbitset" -[package.metadata.release] -no-dev-version = true diff --git a/vendor/fixedbitset/LICENSE-MIT b/vendor/fixedbitset/LICENSE-MIT deleted file mode 100644 index 327cc6174c..0000000000 --- a/vendor/fixedbitset/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2015-2017 - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/vendor/fixedbitset/README.rst b/vendor/fixedbitset/README.rst deleted file mode 100644 index bfff9dc6d6..0000000000 --- a/vendor/fixedbitset/README.rst +++ /dev/null @@ -1,82 +0,0 @@ - -fixedbitset -=========== - -A simple bitset container for Rust - -Please read the `API documentation here`__ - -__ https://docs.rs/fixedbitset/ - -|build_status|_ |crates|_ - -.. |build_status| image:: https://travis-ci.org/bluss/fixedbitset.svg?branch=master -.. _build_status: https://travis-ci.org/bluss/fixedbitset - -.. |crates| image:: http://meritbadge.herokuapp.com/fixedbitset -.. _crates: https://crates.io/crates/fixedbitset - -Recent Changes --------------- - -- 0.1.9 - - + Add intersection, union, difference iterators by @jrraymond - + Add intersection: ``&`` and union: ``|`` operator implementations by @jrraymond - + Add Extend and FromIterator implementations (from sequences of bit indices) - by @jrraymond - -- 0.1.8 - - + Add missing ``#[inline]`` on the ones iterator - + Fix docs for ``insert_range, set_range`` - -- 0.1.7 - - + Add fast methods ``.insert_range``, ``.set_range`` by @kennytm - -- 0.1.6 - - + Add iterator ``.ones()`` by @mneumann - + Fix bug with ``.count_ones()`` where it would erronously have an - out-of-bounds panic for even block endpoints - -- 0.1.5 - - + Add method ``.count_ones(range)``. - -- 0.1.4 - - + Remove an assertion in ``.copy_bit(from, to)`` so that it is in line - with the documentation. The ``from`` bit does not need to be in bounds. - + Improve ``.grow()`` to use ``Vec::resize`` internally. - -- 0.1.3 - - + Add method ``.put()`` to enable a bit and return previous value - -- 0.1.2 - - + Add method ``.copy_bit()`` (by fuine) - + impl Default - -- 0.1.1 - - + Update documentation URL - -- 0.1.0 - - + Add method ``.grow()`` - -License -------- - -Dual-licensed to be compatible with the Rust project. - -Licensed under the Apache License, Version 2.0 -http://www.apache.org/licenses/LICENSE-2.0 or the MIT license -http://opensource.org/licenses/MIT, at your -option. This file may not be copied, modified, or distributed -except according to those terms. - - diff --git a/vendor/fixedbitset/benches/benches.rs b/vendor/fixedbitset/benches/benches.rs deleted file mode 100644 index ac999b014a..0000000000 --- a/vendor/fixedbitset/benches/benches.rs +++ /dev/null @@ -1,133 +0,0 @@ -#![feature(test)] - -extern crate test; -extern crate fixedbitset; -use test::Bencher; -use fixedbitset::{FixedBitSet}; -use std::mem::size_of; - -#[inline] -fn iter_ones_using_contains(fb: &FixedBitSet, f: &mut F) { - for bit in 0 .. fb.len() { - if fb.contains(bit) { - f(bit); - } - } -} - -#[inline] -fn iter_ones_using_slice_directly(fb: &FixedBitSet, f: &mut F) { - for (block_idx, &block) in fb.as_slice().iter().enumerate() { - let mut bit_pos = block_idx * size_of::() * 8; - let mut block: u32 = block; - - while block != 0 { - if (block & 1) == 1 { - f(bit_pos); - } - block = block >> 1; - bit_pos += 1; - } - } -} - -#[bench] -fn bench_iter_ones_using_contains_all_zeros(b: &mut Bencher) { - const N: usize = 1_000_000; - let fb = FixedBitSet::with_capacity(N); - - b.iter(|| { - let mut count = 0; - iter_ones_using_contains(&fb, &mut |_bit| count += 1); - count - }); -} - -#[bench] -fn bench_iter_ones_using_contains_all_ones(b: &mut Bencher) { - const N: usize = 1_000_000; - let mut fb = FixedBitSet::with_capacity(N); - fb.insert_range(..); - - b.iter(|| { - let mut count = 0; - iter_ones_using_contains(&fb, &mut |_bit| count += 1); - count - }); -} - -#[bench] -fn bench_iter_ones_using_slice_directly_all_zero(b: &mut Bencher) { - const N: usize = 1_000_000; - let fb = FixedBitSet::with_capacity(N); - - b.iter(|| { - let mut count = 0; - iter_ones_using_slice_directly(&fb, &mut |_bit| count += 1); - count - }); -} - -#[bench] -fn bench_iter_ones_using_slice_directly_all_ones(b: &mut Bencher) { - const N: usize = 1_000_000; - let mut fb = FixedBitSet::with_capacity(N); - fb.insert_range(..); - - b.iter(|| { - let mut count = 0; - iter_ones_using_slice_directly(&fb, &mut |_bit| count += 1); - count - }); -} - -#[bench] -fn bench_iter_ones_all_zeros(b: &mut Bencher) { - const N: usize = 1_000_000; - let fb = FixedBitSet::with_capacity(N); - - b.iter(|| { - let mut count = 0; - for _ in fb.ones() { - count += 1; - } - count - }); -} - -#[bench] -fn bench_iter_ones_all_ones(b: &mut Bencher) { - const N: usize = 1_000_000; - let mut fb = FixedBitSet::with_capacity(N); - fb.insert_range(..); - - b.iter(|| { - let mut count = 0; - for _ in fb.ones() { - count += 1; - } - count - }); -} - -#[bench] -fn bench_insert_range(b: &mut Bencher) { - const N: usize = 1_000_000; - let mut fb = FixedBitSet::with_capacity(N); - - b.iter(|| { - fb.insert_range(..) - }); -} - -#[bench] -fn bench_insert_range_using_loop(b: &mut Bencher) { - const N: usize = 1_000_000; - let mut fb = FixedBitSet::with_capacity(N); - - b.iter(|| { - for i in 0..N { - fb.insert(i); - } - }); -} diff --git a/vendor/fixedbitset/src/lib.rs b/vendor/fixedbitset/src/lib.rs deleted file mode 100644 index 78e66ecd06..0000000000 --- a/vendor/fixedbitset/src/lib.rs +++ /dev/null @@ -1,988 +0,0 @@ -//! `FixedBitSet` is a simple fixed size set of bits. -#![doc(html_root_url="https://docs.rs/fixedbitset/0.1/")] - -mod range; - -use std::ops::{BitAnd, BitOr, Index}; -use std::cmp::{Ord, Ordering}; -use std::iter::{Chain, FromIterator}; -pub use range::IndexRange; - -static TRUE: bool = true; -static FALSE: bool = false; - -const BITS: usize = 32; -type Block = u32; - -#[inline] -fn div_rem(x: usize, d: usize) -> (usize, usize) -{ - (x / d, x % d) -} - -/// `FixedBitSet` is a simple fixed size set of bits that each can -/// be enabled (1 / **true**) or disabled (0 / **false**). -/// -/// The bit set has a fixed capacity in terms of enabling bits (and the -/// capacity can grow using the `grow` method). -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] -pub struct FixedBitSet { - data: Vec, - /// length in bits - length: usize, -} - -impl FixedBitSet -{ - /// Create a new **FixedBitSet** with a specific number of bits, - /// all initially clear. - pub fn with_capacity(bits: usize) -> Self - { - let (mut blocks, rem) = div_rem(bits, BITS); - blocks += (rem > 0) as usize; - FixedBitSet { - data: vec![0; blocks], - length: bits, - } - } - - /// Grow capacity to **bits**, all new bits initialized to zero - pub fn grow(&mut self, bits: usize) { - let (mut blocks, rem) = div_rem(bits, BITS); - blocks += (rem > 0) as usize; - if bits > self.length { - self.length = bits; - self.data.resize(blocks, 0); - } - } - - /// Return the length of the `FixedBitSet` in bits. - #[inline] - pub fn len(&self) -> usize { self.length } - - /// Return **true** if the bit is enabled in the **FixedBitSet**, - /// **false** otherwise. - /// - /// Note: bits outside the capacity are always disabled. - /// - /// Note: Also available with index syntax: `bitset[bit]`. - #[inline] - pub fn contains(&self, bit: usize) -> bool - { - let (block, i) = div_rem(bit, BITS); - match self.data.get(block) { - None => false, - Some(b) => (b & (1 << i)) != 0, - } - } - - /// Clear all bits. - #[inline] - pub fn clear(&mut self) - { - for elt in &mut self.data[..] { - *elt = 0 - } - } - - /// Enable `bit`. - /// - /// **Panics** if **bit** is out of bounds. - #[inline] - pub fn insert(&mut self, bit: usize) - { - assert!(bit < self.length); - let (block, i) = div_rem(bit, BITS); - unsafe { - *self.data.get_unchecked_mut(block) |= 1 << i; - } - } - - /// Enable `bit`, and return its previous value. - /// - /// **Panics** if **bit** is out of bounds. - #[inline] - pub fn put(&mut self, bit: usize) -> bool - { - assert!(bit < self.length); - let (block, i) = div_rem(bit, BITS); - unsafe { - let word = self.data.get_unchecked_mut(block); - let prev = *word & (1 << i) != 0; - *word |= 1 << i; - prev - } - } - - /// **Panics** if **bit** is out of bounds. - #[inline] - pub fn set(&mut self, bit: usize, enabled: bool) - { - assert!(bit < self.length); - let (block, i) = div_rem(bit, BITS); - unsafe { - let elt = self.data.get_unchecked_mut(block); - if enabled { - *elt |= 1 << i; - } else { - *elt &= !(1 << i); - } - } - } - - /// Copies boolean value from specified bit to the specified bit. - /// - /// **Panics** if **to** is out of bounds. - #[inline] - pub fn copy_bit(&mut self, from: usize, to: usize) - { - assert!(to < self.length); - let (to_block, t) = div_rem(to, BITS); - let enabled = self.contains(from); - unsafe { - let to_elt = self.data.get_unchecked_mut(to_block); - if enabled { - *to_elt |= 1 << t; - } else { - *to_elt &= !(1 << t); - } - } - } - - /// Count the number of set bits in the given bit range. - /// - /// Use `..` to count the whole content of the bitset. - /// - /// **Panics** if the range extends past the end of the bitset. - #[inline] - pub fn count_ones(&self, range: T) -> usize - { - Masks::new(range, self.length) - .map(|(block, mask)| unsafe { - let value = *self.data.get_unchecked(block); - (value & mask).count_ones() as usize - }) - .sum() - } - - /// Sets every bit in the given range to the given state (`enabled`) - /// - /// Use `..` to toggle the whole bitset. - /// - /// **Panics** if the range extends past the end of the bitset. - #[inline] - pub fn set_range(&mut self, range: T, enabled: bool) - { - for (block, mask) in Masks::new(range, self.length) { - unsafe { - if enabled { - *self.data.get_unchecked_mut(block) |= mask; - } else { - *self.data.get_unchecked_mut(block) &= !mask; - } - } - } - } - - /// Enables every bit in the given range. - /// - /// Use `..` to make the whole bitset ones. - /// - /// **Panics** if the range extends past the end of the bitset. - #[inline] - pub fn insert_range(&mut self, range: T) - { - self.set_range(range, true); - } - - /// View the bitset as a slice of `u32` blocks - #[inline] - pub fn as_slice(&self) -> &[u32] - { - &self.data - } - - /// View the bitset as a mutable slice of `u32` blocks. Writing past the bitlength in the last - /// will cause `contains` to return potentially incorrect results for bits past the bitlength. - #[inline] - pub fn as_mut_slice(&mut self) -> &mut [u32] - { - &mut self.data - } - - /// Iterates over all enabled bits. - /// - /// Iterator element is the index of the `1` bit, type `usize`. - #[inline] - pub fn ones(&self) -> Ones { - match self.as_slice().split_first() { - Some((&block, rem)) => { - Ones { - current_bit_idx: 0, - current_block_idx: 0, - current_block: block, - remaining_blocks: rem - } - } - None => { - Ones { - current_bit_idx: 0, - current_block_idx: 0, - current_block: 0, - remaining_blocks: &[] - } - } - } - } - - /// Returns a lazy iterator over the intersection of two `FixedBitSet`s - pub fn intersection<'a>(&'a self, other: &'a FixedBitSet) -> Intersection<'a> - { - Intersection { - iter: self.ones(), - other: other, - } - } - - /// Returns a lazy iterator over the union of two `FixedBitSet`s. - pub fn union<'a>(&'a self, other: &'a FixedBitSet) -> Union<'a> - { - Union { - iter: self.ones().chain(other.difference(self)), - } - } - - /// Returns a lazy iterator over the difference of two `FixedBitSet`s. The difference of `a` - /// and `b` is the elements of `a` which are not in `b`. - pub fn difference<'a>(&'a self, other: &'a FixedBitSet) -> Difference<'a> - { - Difference { - iter: self.ones(), - other: other, - } - } -} - -/// An iterator producing elements in the difference of two sets. -/// -/// This struct is created by the [`FixedBitSet::difference`] method. -pub struct Difference<'a> { - iter: Ones<'a>, - other: &'a FixedBitSet, -} - -impl<'a> Iterator for Difference<'a> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - while let Some(nxt) = self.iter.next() { - if !self.other.contains(nxt) { - return Some(nxt); - } - } - None - } -} - - -/// An iterator producing elements in the intersection of two sets. -/// -/// This struct is created by the [`FixedBitSet::intersection`] method. -pub struct Intersection<'a> { - iter: Ones<'a>, - other: &'a FixedBitSet, -} - -impl<'a> Iterator for Intersection<'a> { - type Item = usize; // the bit position of the '1' - - #[inline] - fn next(&mut self) -> Option { - while let Some(nxt) = self.iter.next() { - if self.other.contains(nxt) { - return Some(nxt); - } - } - None - } -} - -/// An iterator producing elements in the union of two sets. -/// -/// This struct is created by the [`FixedBitSet::union`] method. -pub struct Union<'a> { - iter: Chain, Difference<'a>>, -} - -impl<'a> Iterator for Union<'a> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - self.iter.next() - } -} - - -struct Masks { - first_block: usize, - first_mask: Block, - last_block: usize, - last_mask: Block, -} - -impl Masks { - #[inline] - fn new(range: T, length: usize) -> Masks { - let start = range.start().unwrap_or(0); - let end = range.end().unwrap_or(length); - assert!(start <= end && end <= length); - - let (first_block, first_rem) = div_rem(start, BITS); - let (last_block, last_rem) = div_rem(end, BITS); - - Masks { - first_block: first_block as usize, - first_mask: Block::max_value() << first_rem, - last_block: last_block as usize, - last_mask: (Block::max_value() >> 1) >> (BITS - last_rem - 1), - // this is equivalent to `MAX >> (BITS - x)` with correct semantics when x == 0. - } - } -} - -impl Iterator for Masks { - type Item = (usize, Block); - #[inline] - fn next(&mut self) -> Option { - match self.first_block.cmp(&self.last_block) { - Ordering::Less => { - let res = (self.first_block, self.first_mask); - self.first_block += 1; - self.first_mask = !0; - Some(res) - } - Ordering::Equal => { - let mask = self.first_mask & self.last_mask; - let res = if mask == 0 { - None - } else { - Some((self.first_block, mask)) - }; - self.first_block += 1; - res - } - Ordering::Greater => None, - } - } -} - - -/// An iterator producing the indices of the set bit in a set. -/// -/// This struct is created by the [`FixedBitSet::ones`] method. -pub struct Ones<'a> { - current_bit_idx: usize, - current_block_idx: usize, - remaining_blocks: &'a [Block], - current_block: Block -} - -impl<'a> Iterator for Ones<'a> { - type Item = usize; // the bit position of the '1' - - #[inline] - fn next(&mut self) -> Option { - let mut block = self.current_block; - let mut idx = self.current_bit_idx; - - loop { - loop { - if (block & 1) == 1 { - self.current_block = block >> 1; - self.current_bit_idx = idx + 1; - return Some(idx); - } - // reordering the two lines below makes a huge (2x) difference in performance! - block = block >> 1; - idx += 1; - if block == 0 { - break; - } - } - - // go to next block - match self.remaining_blocks.split_first() { - Some((&next_block, rest)) => { - self.remaining_blocks = rest; - self.current_block_idx += 1; - idx = self.current_block_idx * BITS; - block = next_block; - } - None => { - // last block => done - return None; - } - } - } - } -} - -impl Clone for FixedBitSet -{ - #[inline] - fn clone(&self) -> Self - { - FixedBitSet { - data: self.data.clone(), - length: self.length, - } - } -} - -/// Return **true** if the bit is enabled in the bitset, -/// or **false** otherwise. -/// -/// Note: bits outside the capacity are always disabled, and thus -/// indexing a FixedBitSet will not panic. -impl Index for FixedBitSet -{ - type Output = bool; - - #[inline] - fn index(&self, bit: usize) -> &bool - { - if self.contains(bit) { - &TRUE - } else { - &FALSE - } - } -} - -/// Sets the bit at index **i** to **true** for each item **i** in the input **src**. -impl Extend for FixedBitSet -{ - fn extend>(&mut self, src: I) { - let iter = src.into_iter(); - for i in iter { - if i >= self.len() { - self.grow(i + 1); - } - self.put(i); - } - } -} - -/// Return a FixedBitSet containing bits set to **true** for every bit index in -/// the iterator, other bits are set to **false**. -impl FromIterator for FixedBitSet -{ - fn from_iter>(src: I) -> Self { - let mut fbs = FixedBitSet::with_capacity(0); - fbs.extend(src); - fbs - } -} - -impl <'a> BitAnd for &'a FixedBitSet -{ - type Output = FixedBitSet; - fn bitand(self, other: &FixedBitSet) -> FixedBitSet { - let (short, long) = { - if self.len() <= other.len() { - (&self.data, &other.data) - } else { - (&other.data, &self.data) - } - }; - let mut data = short.clone(); - for (i, &block) in long.iter().take(short.len()).enumerate() { - data[i] &= block; - } - let len = std::cmp::min(self.len(), other.len()); - FixedBitSet{data: data, length: len} - } -} - -impl <'a> BitOr for &'a FixedBitSet -{ - type Output = FixedBitSet; - fn bitor(self, other: &FixedBitSet) -> FixedBitSet { - let (short, long) = { - if self.len() <= other.len() { - (&self.data, &other.data) - } else { - (&other.data, &self.data) - } - }; - let mut data = long.clone(); - for (i, &block) in short.iter().enumerate() { - data[i] |= block; - } - let len = std::cmp::max(self.len(), other.len()); - FixedBitSet{data: data, length: len} - } -} - -#[test] -fn it_works() { - const N: usize = 50; - let mut fb = FixedBitSet::with_capacity(N); - println!("{:?}", fb); - - for i in 0..(N + 10) { - assert_eq!(fb.contains(i), false); - } - - fb.insert(10); - fb.set(11, false); - fb.set(12, false); - fb.set(12, true); - fb.set(N-1, true); - println!("{:?}", fb); - assert!(fb.contains(10)); - assert!(!fb.contains(11)); - assert!(fb.contains(12)); - assert!(fb.contains(N-1)); - for i in 0..N { - let contain = i == 10 || i == 12 || i == N - 1; - assert_eq!(contain, fb[i]); - } - - fb.clear(); -} - -#[test] -fn grow() { - let mut fb = FixedBitSet::with_capacity(48); - for i in 0..fb.len() { - fb.set(i, true); - } - - let old_len = fb.len(); - fb.grow(72); - for j in 0..fb.len() { - assert_eq!(fb.contains(j), j < old_len); - } - fb.set(64, true); - assert!(fb.contains(64)); -} - -#[test] -fn copy_bit() { - let mut fb = FixedBitSet::with_capacity(48); - for i in 0..fb.len() { - fb.set(i, true); - } - fb.set(42, false); - fb.copy_bit(42, 2); - assert!(!fb.contains(42)); - assert!(!fb.contains(2)); - assert!(fb.contains(1)); - fb.copy_bit(1, 42); - assert!(fb.contains(42)); - fb.copy_bit(1024, 42); - assert!(!fb[42]); -} - -#[test] -fn count_ones() { - let mut fb = FixedBitSet::with_capacity(100); - fb.set(11, true); - fb.set(12, true); - fb.set(7, true); - fb.set(35, true); - fb.set(40, true); - fb.set(77, true); - fb.set(95, true); - fb.set(50, true); - fb.set(99, true); - assert_eq!(fb.count_ones(..7), 0); - assert_eq!(fb.count_ones(..8), 1); - assert_eq!(fb.count_ones(..11), 1); - assert_eq!(fb.count_ones(..12), 2); - assert_eq!(fb.count_ones(..13), 3); - assert_eq!(fb.count_ones(..35), 3); - assert_eq!(fb.count_ones(..36), 4); - assert_eq!(fb.count_ones(..40), 4); - assert_eq!(fb.count_ones(..41), 5); - assert_eq!(fb.count_ones(50..), 4); - assert_eq!(fb.count_ones(70..95), 1); - assert_eq!(fb.count_ones(70..96), 2); - assert_eq!(fb.count_ones(70..99), 2); - assert_eq!(fb.count_ones(..), 9); - assert_eq!(fb.count_ones(0..100), 9); - assert_eq!(fb.count_ones(0..0), 0); - assert_eq!(fb.count_ones(100..100), 0); - assert_eq!(fb.count_ones(7..), 9); - assert_eq!(fb.count_ones(8..), 8); -} - -#[test] -fn ones() { - let mut fb = FixedBitSet::with_capacity(100); - fb.set(11, true); - fb.set(12, true); - fb.set(7, true); - fb.set(35, true); - fb.set(40, true); - fb.set(77, true); - fb.set(95, true); - fb.set(50, true); - fb.set(99, true); - - let ones: Vec<_> = fb.ones().collect(); - - assert_eq!(vec![7, 11, 12, 35, 40, 50, 77, 95, 99], ones); -} - -#[test] -fn iter_ones_range() { - fn test_range(from: usize, to: usize, capa: usize) { - assert!(to <= capa); - let mut fb = FixedBitSet::with_capacity(capa); - for i in from..to { - fb.insert(i); - } - let ones: Vec<_> = fb.ones().collect(); - let expected: Vec<_> = (from..to).collect(); - assert_eq!(expected, ones); - } - - for i in 0..100 { - test_range(i, 100, 100); - test_range(0, i, 100); - } -} - -#[should_panic] -#[test] -fn count_ones_oob() { - let fb = FixedBitSet::with_capacity(100); - fb.count_ones(90..101); -} - -#[should_panic] -#[test] -fn count_ones_negative_range() { - let fb = FixedBitSet::with_capacity(100); - fb.count_ones(90..80); -} - -#[test] -fn count_ones_panic() { - for i in 1..128 { - let fb = FixedBitSet::with_capacity(i); - for j in 0..fb.len() + 1 { - for k in j..fb.len() + 1 { - assert_eq!(fb.count_ones(j..k), 0); - } - } - } -} - - -#[test] -fn default() { - let fb = FixedBitSet::default(); - assert_eq!(fb.len(), 0); -} - -#[test] -fn insert_range() { - let mut fb = FixedBitSet::with_capacity(97); - fb.insert_range(..3); - fb.insert_range(9..32); - fb.insert_range(37..81); - fb.insert_range(90..); - for i in 0..97 { - assert_eq!(fb.contains(i), i<3 || 9<=i&&i<32 || 37<=i&&i<81 || 90<=i); - } - assert!(!fb.contains(97)); - assert!(!fb.contains(127)); - assert!(!fb.contains(128)); -} - -#[test] -fn set_range() { - let mut fb = FixedBitSet::with_capacity(48); - fb.insert_range(..); - - fb.set_range(..32, false); - fb.set_range(37.., false); - fb.set_range(5..9, true); - fb.set_range(40..40, true); - - for i in 0..48 { - assert_eq!(fb.contains(i), 5<=i&&i<9 || 32<=i&&i<37); - } - assert!(!fb.contains(48)); - assert!(!fb.contains(64)); -} - -#[test] -fn bitand_equal_lengths() { - let len = 109; - let a_end = 59; - let b_start = 23; - let mut a = FixedBitSet::with_capacity(len); - let mut b = FixedBitSet::with_capacity(len); - a.set_range(..a_end, true); - b.set_range(b_start.., true); - let ab = &a & &b; - for i in 0..b_start { - assert!(!ab.contains(i)); - } - for i in b_start..a_end { - assert!(ab.contains(i)); - } - for i in a_end..len { - assert!(!ab.contains(i)); - } - assert_eq!(a.len(), ab.len()); -} - -#[test] -fn bitand_first_smaller() { - let a_len = 113; - let b_len = 137; - let len = std::cmp::min(a_len, b_len); - let a_end = 97; - let b_start = 89; - let mut a = FixedBitSet::with_capacity(a_len); - let mut b = FixedBitSet::with_capacity(b_len); - a.set_range(..a_end, true); - b.set_range(b_start.., true); - let ab = &a & &b; - for i in 0..b_start { - assert!(!ab.contains(i)); - } - for i in b_start..a_end { - assert!(ab.contains(i)); - } - for i in a_end..len { - assert!(!ab.contains(i)); - } - assert_eq!(a.len(), ab.len()); -} - -#[test] -fn bitand_first_larger() { - let a_len = 173; - let b_len = 137; - let len = std::cmp::min(a_len, b_len); - let a_end = 107; - let b_start = 43; - let mut a = FixedBitSet::with_capacity(a_len); - let mut b = FixedBitSet::with_capacity(b_len); - a.set_range(..a_end, true); - b.set_range(b_start.., true); - let ab = &a & &b; - for i in 0..b_start { - assert!(!ab.contains(i)); - } - for i in b_start..a_end { - assert!(ab.contains(i)); - } - for i in a_end..len { - assert!(!ab.contains(i)); - } - assert_eq!(b.len(), ab.len()); -} - -#[test] -fn intersection() { - let len = 109; - let a_end = 59; - let b_start = 23; - let mut a = FixedBitSet::with_capacity(len); - let mut b = FixedBitSet::with_capacity(len); - a.set_range(..a_end, true); - b.set_range(b_start.., true); - - let ab = a.intersection(&b).collect::(); - - for i in 0..b_start { - assert!(!ab.contains(i)); - } - for i in b_start..a_end { - assert!(ab.contains(i)); - } - for i in a_end..len { - assert!(!ab.contains(i)); - } -} - -#[test] -fn union() { - let a_len = 173; - let b_len = 137; - let a_start = 139; - let b_end = 107; - let mut a = FixedBitSet::with_capacity(a_len); - let mut b = FixedBitSet::with_capacity(b_len); - a.set_range(a_start.., true); - b.set_range(..b_end, true); - let ab = a.union(&b).collect::(); - for i in a_start..a_len { - assert!(ab.contains(i)); - } - for i in 0..b_end { - assert!(ab.contains(i)); - } - for i in b_end..a_start { - assert!(!ab.contains(i)); - } -} - -#[test] -fn difference() { - let a_len = 83; - let b_len = 151; - let a_start = 0; - let a_end = 79; - let b_start = 53; - let mut a = FixedBitSet::with_capacity(a_len); - let mut b = FixedBitSet::with_capacity(b_len); - a.set_range(a_start..a_end, true); - b.set_range(b_start..b_len, true); - let a_diff_b = a.difference(&b).collect::(); - for i in a_start..b_start { - assert!(a_diff_b.contains(i)); - } - for i in b_start..b_len { - assert!(!a_diff_b.contains(i)); - } -} - -#[test] -fn bitor_equal_lengths() { - let len = 109; - let a_start = 17; - let a_end = 23; - let b_start = 19; - let b_end = 59; - let mut a = FixedBitSet::with_capacity(len); - let mut b = FixedBitSet::with_capacity(len); - a.set_range(a_start..a_end, true); - b.set_range(b_start..b_end, true); - let ab = &a | &b; - for i in 0..a_start { - assert!(!ab.contains(i)); - } - for i in a_start..b_end { - assert!(ab.contains(i)); - } - for i in b_end..len { - assert!(!ab.contains(i)); - } - assert_eq!(ab.len(), len); -} - -#[test] -fn bitor_first_smaller() { - let a_len = 113; - let b_len = 137; - let a_end = 89; - let b_start = 97; - let mut a = FixedBitSet::with_capacity(a_len); - let mut b = FixedBitSet::with_capacity(b_len); - a.set_range(..a_end, true); - b.set_range(b_start.., true); - let ab = &a | &b; - for i in 0..a_end { - assert!(ab.contains(i)); - } - for i in a_end..b_start { - assert!(!ab.contains(i)); - } - for i in b_start..b_len { - assert!(ab.contains(i)); - } - assert_eq!(b_len, ab.len()); -} - -#[test] -fn bitor_first_larger() { - let a_len = 173; - let b_len = 137; - let a_start = 139; - let b_end = 107; - let mut a = FixedBitSet::with_capacity(a_len); - let mut b = FixedBitSet::with_capacity(b_len); - a.set_range(a_start.., true); - b.set_range(..b_end, true); - let ab = &a | &b; - for i in a_start..a_len { - assert!(ab.contains(i)); - } - for i in 0..b_end { - assert!(ab.contains(i)); - } - for i in b_end..a_start { - assert!(!ab.contains(i)); - } - assert_eq!(a_len, ab.len()); -} - -#[test] -fn extend_on_empty() { - let items: Vec = vec![2, 3, 5, 7, 11, 13, 17, 19, 23, 27, 29, 31, 37, 167]; - let mut fbs = FixedBitSet::with_capacity(0); - fbs.extend(items.iter().cloned()); - let ones = fbs.ones().collect::>(); - assert!(ones == items); -} - -#[test] -fn extend() { - let items: Vec = vec![2, 3, 5, 7, 11, 13, 17, 19, 23, 27, 29, 31, 37, 167]; - let mut fbs = FixedBitSet::with_capacity(168); - let new: Vec = vec![7, 37, 67, 137]; - for i in &new { - fbs.put(*i); - } - - fbs.extend(items.iter().cloned()); - - let ones = fbs.ones().collect::>(); - let expected = { - let mut tmp = items.clone(); - tmp.extend(new); - tmp.sort(); - tmp.dedup(); - tmp - }; - - assert!(ones == expected); -} - -#[test] -fn from_iterator() { - let items: Vec = vec![0, 2, 4, 6, 8]; - let fb = items.iter().cloned().collect::(); - for i in items { - assert!(fb.contains(i)); - } - for i in vec![1, 3, 5, 7] { - assert!(!fb.contains(i)); - } - assert_eq!(fb.len(), 9); -} - -#[test] -fn from_iterator_ones() { - let len = 257; - let mut fb = FixedBitSet::with_capacity(len); - for i in (0..len).filter(|i| i % 7 == 0) { - fb.put(i); - } - fb.put(len - 1); - let dup = fb.ones().collect::(); - println!("{0:?}\n{1:?}", fb, dup); - println!("{0:?}\n{1:?}", fb.ones().collect::>(), dup.ones().collect::>()); - assert_eq!(fb.len(), dup.len()); - assert_eq!(fb.ones().collect::>(), dup.ones().collect::>()); -} diff --git a/vendor/fixedbitset/src/range.rs b/vendor/fixedbitset/src/range.rs deleted file mode 100644 index aaa48961b5..0000000000 --- a/vendor/fixedbitset/src/range.rs +++ /dev/null @@ -1,39 +0,0 @@ -use std::ops::{ - RangeFull, - RangeFrom, - RangeTo, - Range, -}; - -// Taken from https://github.com/bluss/odds/blob/master/src/range.rs. - -/// **IndexRange** is implemented by Rust's built-in range types, produced -/// by range syntax like `..`, `a..`, `..b` or `c..d`. -pub trait IndexRange { - #[inline] - /// Start index (inclusive) - fn start(&self) -> Option { None } - #[inline] - /// End index (exclusive) - fn end(&self) -> Option { None } -} - - -impl IndexRange for RangeFull {} - -impl IndexRange for RangeFrom { - #[inline] - fn start(&self) -> Option { Some(self.start) } -} - -impl IndexRange for RangeTo { - #[inline] - fn end(&self) -> Option { Some(self.end) } -} - -impl IndexRange for Range { - #[inline] - fn start(&self) -> Option { Some(self.start) } - #[inline] - fn end(&self) -> Option { Some(self.end) } -} diff --git a/vendor/getrandom/.cargo-checksum.json b/vendor/getrandom/.cargo-checksum.json index bdece4d2af..19bc9388aa 100644 --- a/vendor/getrandom/.cargo-checksum.json +++ b/vendor/getrandom/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"98896a2bc5487f23fd5aee0da960aab5b7615f6a867516ff4a1fe16a43781924","Cargo.toml":"a6ba2222a4179323d821b1663b164be709ee0221ce9c65c4695abdd66bcec6f8","LICENSE-APACHE":"aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf","LICENSE-MIT":"209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b","README.md":"434a2c0978ade0a0c1d24b72a23952243358982b34ebb3a52f9ae41dac18a6ae","benches/mod.rs":"eae05a2128105062d27090af25e5c35ac2cf422115e335582f13c5127c3507b4","build.rs":"9000429ff834eb551f6e3800414cd8d339a6e45ea96c751aa465e204c673357d","src/cloudabi.rs":"cd493b696ab968113d46b3b38cff52ecd89e79228640802ba523452932183d2b","src/dummy.rs":"184e81035f38a5edd3e7f3ed9ea0d3e4dc462ca5d224fad11cb660412dcd9198","src/error.rs":"bc1f2dd348d3edd0c0fecbf5d49f54529f5d077cf529548f530315ae01e1e658","src/error_impls.rs":"e8a33ce04a71c588d88776dcd895446da9526f3843ae72ed438c65ac386e87da","src/freebsd.rs":"c41e51c4549a075d6d5a87a1518f1ad742497570576d0e730814dba6b830c4c7","src/fuchsia.rs":"470d8509deb5b06fa6417f294c0a49e0e35a580249a5d8944c3be5aa746f64ea","src/ios.rs":"e88214b6077eb75e471b388d57f952a9af8f6f0e514df5c6e655d6c22384313d","src/lib.rs":"fa9e2f97fb541994ea0c204d8cbbb821512fba82e7edd75984fe120402eff7a7","src/linux_android.rs":"b7975157fa1b28f4eb3dabf3ca28e055f974fcc391163cf4c9e5c8123fabc1e1","src/macos.rs":"757ddafd8645ad382fb041f2db3735f4da4ea174f87892411de63a208b3db619","src/openbsd.rs":"c77acddffa3287dc7f82d13a4650a8ac8ef991ee882f71650ebbc76f9df431f6","src/rdrand.rs":"fb162ff041eede073e9558875c4053bf4406480e0baf64178229d13c00c99c3c","src/solaris_illumos.rs":"f0c34c6eab80b35309c3b47cf89ff1749400ea11dcb1de21c83f03c52fe983b2","src/use_file.rs":"f265fc53be3186d028291a1305d079bbd3bf1dd3f7670d190cfbdc5f2140403e","src/util.rs":"f7d62cf0b8818eb70f3a4d8d01acb7d016653181f3c5ac5fdd7dece8df50d3db","src/util_libc.rs":"134a183f48fc07a0d0f08594a4b9b988b59a2f867e55df40123b7a92321af489","src/wasi.rs":"e820d8f9242d827bc178d0d8e71f783dd3974c30a2e3783420d02a125a11cbaf","src/wasm32_bindgen.rs":"ca908b95c67656d3397275f187eea82de0a06787e2f0ba9c881aa27ef7654678","src/wasm32_stdweb.rs":"274e1a6b12b4812008e1bac36b2468e8b6e02a9d7e95954b860a1a3c64f6f7a8","src/windows.rs":"f568b343e6bfbdc158ebc4728baa1c1c08d55417657b940540d9df279f9536d9","src/windows_uwp.rs":"e400b03f1b5ff9df493f1ad96993185072945b3ad528a4de24700f44c4836cc3","tests/mod.rs":"919327a90d370a9dca30f5dcb97a3c8dcf78558ee0b0cf9e59da0bc23c95ed2a"},"package":"473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571"} \ No newline at end of file +{"files":{"CHANGELOG.md":"1625342bb37174f74c248536f6ff9ad19a5b0200073488c2501e731d4a77fac9","Cargo.toml":"65146ccd727399666c8993298191be7cbd6f7131bb1ed8beed82eaa31e34d47d","LICENSE-APACHE":"aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf","LICENSE-MIT":"209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b","README.md":"434a2c0978ade0a0c1d24b72a23952243358982b34ebb3a52f9ae41dac18a6ae","benches/mod.rs":"eae05a2128105062d27090af25e5c35ac2cf422115e335582f13c5127c3507b4","build.rs":"9000429ff834eb551f6e3800414cd8d339a6e45ea96c751aa465e204c673357d","src/bsd_arandom.rs":"4f90c31eb72046ad8181c5cee217d38a3c964e601fcf02e57bb97453f4d4023b","src/cloudabi.rs":"cd493b696ab968113d46b3b38cff52ecd89e79228640802ba523452932183d2b","src/dummy.rs":"184e81035f38a5edd3e7f3ed9ea0d3e4dc462ca5d224fad11cb660412dcd9198","src/error.rs":"1673d24e1fae25553c4317a3a093c1f76bee494644b4c8f5b96e56dfbd2dd56e","src/error_impls.rs":"e8a33ce04a71c588d88776dcd895446da9526f3843ae72ed438c65ac386e87da","src/fuchsia.rs":"470d8509deb5b06fa6417f294c0a49e0e35a580249a5d8944c3be5aa746f64ea","src/ios.rs":"e88214b6077eb75e471b388d57f952a9af8f6f0e514df5c6e655d6c22384313d","src/lib.rs":"88ca49c455552efc817adf372966141fd614f250a939d91d47a193bb6153c822","src/linux_android.rs":"b7975157fa1b28f4eb3dabf3ca28e055f974fcc391163cf4c9e5c8123fabc1e1","src/macos.rs":"757ddafd8645ad382fb041f2db3735f4da4ea174f87892411de63a208b3db619","src/openbsd.rs":"c77acddffa3287dc7f82d13a4650a8ac8ef991ee882f71650ebbc76f9df431f6","src/rdrand.rs":"c3435e63b9d54d3423b2d31f7cb605901b795a4e982cd50b2428b1dc6de580b4","src/solaris_illumos.rs":"e3323277622d35d8a544879cabc539f9a684e799007861b824a1cba09285be13","src/use_file.rs":"7aa9391f35fb04a5af4d74aa0a810a6a5962b382e342fc9fa9b922560bddd5f6","src/util.rs":"8b891961a22be402cb967f9df8b46159c0506634b9b537067af96dd2893ebd7d","src/util_libc.rs":"3b2e0cc899501df8bd05c3550aad7fe04b31cbaa1918fa803b3434517f6e5268","src/vxworks.rs":"e5159caf5ae2521c977f5e824e3a580e2440f182deae2433f74e37a8ac01bc8d","src/wasi.rs":"3413e5a391b156f5d05600f4651f7f8eb4df2c8984fca7766ca50c0cfe0b2e9c","src/wasm32_bindgen.rs":"ca908b95c67656d3397275f187eea82de0a06787e2f0ba9c881aa27ef7654678","src/wasm32_stdweb.rs":"274e1a6b12b4812008e1bac36b2468e8b6e02a9d7e95954b860a1a3c64f6f7a8","src/windows.rs":"f568b343e6bfbdc158ebc4728baa1c1c08d55417657b940540d9df279f9536d9","src/windows_uwp.rs":"9d8d98fd55f8b1e0ca5b80da318d1238cd376b552731c8605dc4a30ea2f34874","tests/common.rs":"2d213ef77db39cd3d89d393569d847e67086fe828ca597faf5bd354943f954f8"},"package":"7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"} \ No newline at end of file diff --git a/vendor/getrandom/CHANGELOG.md b/vendor/getrandom/CHANGELOG.md index 6f43b26f36..29b447c407 100644 --- a/vendor/getrandom/CHANGELOG.md +++ b/vendor/getrandom/CHANGELOG.md @@ -4,6 +4,36 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.1.14] - 2020-01-07 +### Changed +- Remove use of spin-locks in the `use_file` module. [#125] +- Update `wasi` to v0.9. [#126] +- Do not read errno value on DragonFlyBSD to fix compilation failure. [#129] + +[#125]: https://github.com/rust-random/getrandom/pull/125 +[#126]: https://github.com/rust-random/getrandom/pull/126 +[#129]: https://github.com/rust-random/getrandom/pull/129 + +## [0.1.13] - 2019-08-25 +### Added +- VxWorks targets support. [#86] + +### Changed +- If zero-length slice is passed to the `getrandom` function, always return +`Ok(())` immediately without doing any calls to the underlying operating +system. [#104] +- Use the `kern.arandom` sysctl on NetBSD. [#115] + +### Fixed +- Bump `cfg-if` minimum version from 0.1.0 to 0.1.2. [#112] +- Typos and bad doc links. [#117] + +[#86]: https://github.com/rust-random/getrandom/pull/86 +[#104]: https://github.com/rust-random/getrandom/pull/104 +[#112]: https://github.com/rust-random/getrandom/pull/112 +[#115]: https://github.com/rust-random/getrandom/pull/115 +[#117]: https://github.com/rust-random/getrandom/pull/117 + ## [0.1.12] - 2019-08-18 ### Changed - Update wasi dependency from v0.5 to v0.7. [#100] diff --git a/vendor/getrandom/Cargo.toml b/vendor/getrandom/Cargo.toml index 64d0ec5cfc..1c1f718cfa 100644 --- a/vendor/getrandom/Cargo.toml +++ b/vendor/getrandom/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "getrandom" -version = "0.1.12" +version = "0.1.14" authors = ["The Rand Project Developers"] exclude = ["utils/*", ".*", "appveyor.yml"] description = "A small cross-platform library for retrieving random data from system source" @@ -22,7 +22,7 @@ categories = ["os", "no-std"] license = "MIT OR Apache-2.0" repository = "https://github.com/rust-random/getrandom" [dependencies.cfg-if] -version = "0.1" +version = "0.1.2" [dependencies.compiler_builtins] version = "0.1" @@ -41,11 +41,12 @@ optional = true dummy = [] rustc-dep-of-std = ["compiler_builtins", "core"] std = [] -[target."cfg(any(unix, target_os = \"redox\"))".dependencies.libc] -version = "0.2.62" -default-features = false +test-in-browser = ["wasm-bindgen"] [target."cfg(target_os = \"wasi\")".dependencies.wasi] -version = "0.7" +version = "0.9" +[target."cfg(unix)".dependencies.libc] +version = "0.2.64" +default-features = false [target.wasm32-unknown-unknown.dependencies.stdweb] version = "0.4.18" optional = true @@ -53,6 +54,8 @@ optional = true [target.wasm32-unknown-unknown.dependencies.wasm-bindgen] version = "0.2.29" optional = true +[target.wasm32-unknown-unknown.dev-dependencies.wasm-bindgen-test] +version = "0.2" [badges.appveyor] repository = "rust-random/getrandom" diff --git a/vendor/getrandom/src/freebsd.rs b/vendor/getrandom/src/bsd_arandom.rs similarity index 57% rename from vendor/getrandom/src/freebsd.rs rename to vendor/getrandom/src/bsd_arandom.rs index 61feaf733f..eb564ffff8 100644 --- a/vendor/getrandom/src/freebsd.rs +++ b/vendor/getrandom/src/bsd_arandom.rs @@ -6,12 +6,10 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -//! Implementation for FreeBSD -use crate::util_libc::{sys_fill_exact, Weak}; +//! Implementation for FreeBSD and NetBSD +use crate::util_libc::sys_fill_exact; use crate::Error; -use core::{mem, ptr}; - -type GetRandomFn = unsafe extern "C" fn(*mut u8, libc::size_t, libc::c_uint) -> libc::ssize_t; +use core::ptr; fn kern_arnd(buf: &mut [u8]) -> libc::ssize_t { static MIB: [libc::c_int; 2] = [libc::CTL_KERN, libc::KERN_ARND]; @@ -27,7 +25,7 @@ fn kern_arnd(buf: &mut [u8]) -> libc::ssize_t { ) }; if ret == -1 { - error!("freebsd: kern.arandom syscall failed"); + error!("sysctl kern.arandom: syscall failed"); -1 } else { len as libc::ssize_t @@ -35,11 +33,17 @@ fn kern_arnd(buf: &mut [u8]) -> libc::ssize_t { } pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { - static GETRANDOM: Weak = unsafe { Weak::new("getrandom\0") }; - if let Some(fptr) = GETRANDOM.ptr() { - let func: GetRandomFn = unsafe { mem::transmute(fptr) }; - sys_fill_exact(dest, |buf| unsafe { func(buf.as_mut_ptr(), buf.len(), 0) }) - } else { - sys_fill_exact(dest, kern_arnd) + #[cfg(target_os = "freebsd")] + { + use crate::util_libc::Weak; + static GETRANDOM: Weak = unsafe { Weak::new("getrandom\0") }; + type GetRandomFn = + unsafe extern "C" fn(*mut u8, libc::size_t, libc::c_uint) -> libc::ssize_t; + + if let Some(fptr) = GETRANDOM.ptr() { + let func: GetRandomFn = unsafe { core::mem::transmute(fptr) }; + return sys_fill_exact(dest, |buf| unsafe { func(buf.as_mut_ptr(), buf.len(), 0) }); + } } + sys_fill_exact(dest, kern_arnd) } diff --git a/vendor/getrandom/src/error.rs b/vendor/getrandom/src/error.rs index a27a750eab..31ae24da75 100644 --- a/vendor/getrandom/src/error.rs +++ b/vendor/getrandom/src/error.rs @@ -40,7 +40,7 @@ impl Error { /// /// This method is identical to `std::io::Error::raw_os_error()`, except /// that it works in `no_std` contexts. If this method returns `None`, the - /// error value can still be formatted via the `Diplay` implementation. + /// error value can still be formatted via the `Display` implementation. #[inline] pub fn raw_os_error(self) -> Option { if self.0.get() < Self::INTERNAL_START { @@ -62,7 +62,7 @@ impl Error { cfg_if! { if #[cfg(unix)] { - fn os_err_desc(errno: i32, buf: &mut [u8]) -> Option<&str> { + fn os_err(errno: i32, buf: &mut [u8]) -> Option<&str> { let buf_ptr = buf.as_mut_ptr() as *mut libc::c_char; if unsafe { libc::strerror_r(errno, buf_ptr, buf.len()) } != 0 { return None; @@ -74,12 +74,11 @@ cfg_if! { core::str::from_utf8(&buf[..idx]).ok() } } else if #[cfg(target_os = "wasi")] { - fn os_err_desc(errno: i32, _buf: &mut [u8]) -> Option<&str> { - core::num::NonZeroU16::new(errno as u16) - .and_then(wasi::wasi_unstable::error_str) + fn os_err(errno: i32, _buf: &mut [u8]) -> Option { + wasi::Error::from_raw_error(errno as _) } } else { - fn os_err_desc(_errno: i32, _buf: &mut [u8]) -> Option<&str> { + fn os_err(_errno: i32, _buf: &mut [u8]) -> Option<&str> { None } } @@ -91,8 +90,8 @@ impl fmt::Debug for Error { if let Some(errno) = self.raw_os_error() { dbg.field("os_error", &errno); let mut buf = [0u8; 128]; - if let Some(desc) = os_err_desc(errno, &mut buf) { - dbg.field("description", &desc); + if let Some(err) = os_err(errno, &mut buf) { + dbg.field("description", &err); } } else if let Some(desc) = internal_desc(*self) { dbg.field("internal_code", &self.0.get()); @@ -108,8 +107,8 @@ impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let Some(errno) = self.raw_os_error() { let mut buf = [0u8; 128]; - match os_err_desc(errno, &mut buf) { - Some(desc) => f.write_str(desc), + match os_err(errno, &mut buf) { + Some(err) => err.fmt(f), None => write!(f, "OS Error: {}", errno), } } else if let Some(desc) = internal_desc(*self) { @@ -145,6 +144,7 @@ pub(crate) const BINDGEN_CRYPTO_UNDEF: Error = internal_error!(7); pub(crate) const BINDGEN_GRV_UNDEF: Error = internal_error!(8); pub(crate) const STDWEB_NO_RNG: Error = internal_error!(9); pub(crate) const STDWEB_RNG_FAILED: Error = internal_error!(10); +pub(crate) const RAND_SECURE_FATAL: Error = internal_error!(11); fn internal_desc(error: Error) -> Option<&'static str> { match error { @@ -159,6 +159,7 @@ fn internal_desc(error: Error) -> Option<&'static str> { BINDGEN_GRV_UNDEF => Some("wasm-bindgen: crypto.getRandomValues is undefined"), STDWEB_NO_RNG => Some("stdweb: no randomness source available"), STDWEB_RNG_FAILED => Some("stdweb: failed to get randomness"), + RAND_SECURE_FATAL => Some("randSecure: random number generator module is not initialized"), _ => None, } } diff --git a/vendor/getrandom/src/lib.rs b/vendor/getrandom/src/lib.rs index 023a623050..c305406231 100644 --- a/vendor/getrandom/src/lib.rs +++ b/vendor/getrandom/src/lib.rs @@ -18,7 +18,7 @@ //! | iOS | [`SecRandomCopyBytes`][4] //! | FreeBSD | [`getrandom()`][21] if available, otherwise [`kern.arandom`][5] //! | OpenBSD | [`getentropy`][6] -//! | NetBSD | [`/dev/urandom`][7] after successfully polling `/dev/random` +//! | NetBSD | [`kern.arandom`][7] //! | Dragonfly BSD | [`/dev/random`][8] //! | Solaris, illumos | [`getrandom`][9] system call if available, otherwise [`/dev/random`][10] //! | Fuchsia OS | [`cprng_draw`][11] @@ -27,8 +27,9 @@ //! | Haiku | `/dev/random` (identical to `/dev/urandom`) //! | L4RE, SGX, UEFI | [RDRAND][18] //! | Hermit | [RDRAND][18] as [`sys_rand`][22] is currently broken. -//! | Web browsers | [`Crypto.getRandomValues`][14] (see [Support for WebAssembly and ams.js][14]) -//! | Node.js | [`crypto.randomBytes`][15] (see [Support for WebAssembly and ams.js][16]) +//! | VxWorks | `randABytes` after checking entropy pool initialization with `randSecure` +//! | Web browsers | [`Crypto.getRandomValues`][14] (see [Support for WebAssembly and asm.js][16]) +//! | Node.js | [`crypto.randomBytes`][15] (see [Support for WebAssembly and asm.js][16]) //! | WASI | [`__wasi_random_get`][17] //! //! Getrandom doesn't have a blanket implementation for all Unix-like operating @@ -82,7 +83,7 @@ //! A few, Linux, NetBSD and Solaris, offer a choice between blocking and //! getting an error; in these cases we always choose to block. //! -//! On Linux (when the `genrandom` system call is not available) and on NetBSD +//! On Linux (when the `getrandom` system call is not available) and on NetBSD //! reading from `/dev/urandom` never blocks, even when the OS hasn't collected //! enough entropy yet. To avoid returning low-entropy bytes, we first read from //! `/dev/random` and only switch to `/dev/urandom` once this has succeeded. @@ -104,7 +105,7 @@ //! [4]: https://developer.apple.com/documentation/security/1399291-secrandomcopybytes?language=objc //! [5]: https://www.freebsd.org/cgi/man.cgi?query=random&sektion=4 //! [6]: https://man.openbsd.org/getentropy.2 -//! [7]: http://netbsd.gw.com/cgi-bin/man-cgi?random+4+NetBSD-current +//! [7]: https://netbsd.gw.com/cgi-bin/man-cgi?sysctl+7+NetBSD-8.0 //! [8]: https://leaf.dragonflybsd.org/cgi/web-man?command=random§ion=4 //! [9]: https://docs.oracle.com/cd/E88353_01/html/E37841/getrandom-2.html //! [10]: https://docs.oracle.com/cd/E86824_01/html/E54777/random-7d.html @@ -113,7 +114,7 @@ //! [13]: https://github.com/nuxinl/cloudabi#random_get //! [14]: https://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues //! [15]: https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback -//! [16]: #support-for-webassembly-and-amsjs +//! [16]: #support-for-webassembly-and-asmjs //! [17]: https://github.com/WebAssembly/WASI/blob/master/design/WASI-core.md#__wasi_random_get //! [18]: https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide //! [19]: https://www.unix.com/man-page/mojave/2/getentropy/ @@ -160,6 +161,10 @@ pub use crate::error::Error; #[allow(dead_code)] mod util; +#[cfg(target_os = "vxworks")] +#[allow(dead_code)] +mod util_libc; + cfg_if! { // Unlike the other Unix, Fuchsia and iOS don't use the libc to make any calls. if #[cfg(any(target_os = "android", target_os = "dragonfly", target_os = "emscripten", @@ -168,7 +173,7 @@ cfg_if! { target_os = "openbsd", target_os = "redox", target_os = "solaris"))] { #[allow(dead_code)] mod util_libc; - // Keep std-only trait definitions for backwards compatiblity + // Keep std-only trait definitions for backwards compatibility mod error_impls; } else if #[cfg(feature = "std")] { mod error_impls; @@ -198,7 +203,7 @@ cfg_if! { } else if #[cfg(target_os = "emscripten")] { #[path = "use_file.rs"] mod imp; } else if #[cfg(target_os = "freebsd")] { - #[path = "freebsd.rs"] mod imp; + #[path = "bsd_arandom.rs"] mod imp; } else if #[cfg(target_os = "fuchsia")] { #[path = "fuchsia.rs"] mod imp; } else if #[cfg(target_os = "haiku")] { @@ -212,7 +217,7 @@ cfg_if! { } else if #[cfg(target_os = "macos")] { #[path = "macos.rs"] mod imp; } else if #[cfg(target_os = "netbsd")] { - #[path = "use_file.rs"] mod imp; + #[path = "bsd_arandom.rs"] mod imp; } else if #[cfg(target_os = "openbsd")] { #[path = "openbsd.rs"] mod imp; } else if #[cfg(target_os = "redox")] { @@ -221,6 +226,8 @@ cfg_if! { #[path = "solaris_illumos.rs"] mod imp; } else if #[cfg(target_os = "wasi")] { #[path = "wasi.rs"] mod imp; + } else if #[cfg(target_os = "vxworks")] { + #[path = "vxworks.rs"] mod imp; } else if #[cfg(all(windows, getrandom_uwp))] { #[path = "windows_uwp.rs"] mod imp; } else if #[cfg(windows)] { @@ -258,7 +265,9 @@ cfg_if! { /// source. /// /// This function returns an error on any failure, including partial reads. We -/// make no guarantees regarding the contents of `dest` on error. +/// make no guarantees regarding the contents of `dest` on error. If `dest` is +/// empty, `getrandom` immediately returns success, making no calls to the +/// underlying operating system. /// /// Blocking is possible, at least during early boot; see module documentation. /// @@ -266,5 +275,8 @@ cfg_if! { /// significantly slower than a user-space CSPRNG; for the latter consider /// [`rand::thread_rng`](https://docs.rs/rand/*/rand/fn.thread_rng.html). pub fn getrandom(dest: &mut [u8]) -> Result<(), error::Error> { + if dest.is_empty() { + return Ok(()); + } imp::getrandom_inner(dest) } diff --git a/vendor/getrandom/src/rdrand.rs b/vendor/getrandom/src/rdrand.rs index 96229673fe..e4416821ba 100644 --- a/vendor/getrandom/src/rdrand.rs +++ b/vendor/getrandom/src/rdrand.rs @@ -26,7 +26,7 @@ unsafe fn rdrand() -> Result<[u8; WORD_SIZE], Error> { let mut el = mem::zeroed(); if _rdrand64_step(&mut el) == 1 { // AMD CPUs from families 14h to 16h (pre Ryzen) sometimes fail to - // set CF on bogus random data, so we check these values explictly. + // set CF on bogus random data, so we check these values explicitly. // See https://github.com/systemd/systemd/issues/11810#issuecomment-489727505 // We perform this check regardless of target to guard against // any implementation that incorrectly fails to set CF. diff --git a/vendor/getrandom/src/solaris_illumos.rs b/vendor/getrandom/src/solaris_illumos.rs index 7550fce96e..947312302c 100644 --- a/vendor/getrandom/src/solaris_illumos.rs +++ b/vendor/getrandom/src/solaris_illumos.rs @@ -15,7 +15,7 @@ //! //! Since Solaris 11.3 and mid-2015 illumos, the `getrandom` syscall is available. //! To make sure we can compile on both Solaris and its derivatives, as well as -//! function, we check for the existance of getrandom(2) in libc by calling +//! function, we check for the existence of getrandom(2) in libc by calling //! libc::dlsym. use crate::util_libc::{sys_fill_exact, Weak}; use crate::{use_file, Error}; diff --git a/vendor/getrandom/src/use_file.rs b/vendor/getrandom/src/use_file.rs index 21e35343a8..6e50955cd1 100644 --- a/vendor/getrandom/src/use_file.rs +++ b/vendor/getrandom/src/use_file.rs @@ -7,8 +7,11 @@ // except according to those terms. //! Implementations that just need to read from a file -use crate::util_libc::{last_os_error, open_readonly, sys_fill_exact, LazyFd}; +use crate::util::LazyUsize; +use crate::util_libc::{open_readonly, sys_fill_exact}; use crate::Error; +use core::cell::UnsafeCell; +use core::sync::atomic::{AtomicUsize, Ordering::Relaxed}; #[cfg(target_os = "redox")] const FILE_PATH: &str = "rand:\0"; @@ -21,10 +24,11 @@ const FILE_PATH: &str = "rand:\0"; target_os = "illumos" ))] const FILE_PATH: &str = "/dev/random\0"; +#[cfg(any(target_os = "android", target_os = "linux"))] +const FILE_PATH: &str = "/dev/urandom\0"; pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { - static FD: LazyFd = LazyFd::new(); - let fd = FD.init(init_file).ok_or_else(last_os_error)?; + let fd = get_rng_fd()?; let read = |buf: &mut [u8]| unsafe { libc::read(fd, buf.as_mut_ptr() as *mut _, buf.len()) }; if cfg!(target_os = "emscripten") { @@ -38,36 +42,96 @@ pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { Ok(()) } -cfg_if! { - if #[cfg(any(target_os = "android", target_os = "linux", target_os = "netbsd"))] { - fn init_file() -> Option { - // Poll /dev/random to make sure it is ok to read from /dev/urandom. - let mut pfd = libc::pollfd { - fd: unsafe { open_readonly("/dev/random\0")? }, - events: libc::POLLIN, - revents: 0, - }; - - let ret = loop { - // A negative timeout means an infinite timeout. - let res = unsafe { libc::poll(&mut pfd, 1, -1) }; - if res == 1 { - break unsafe { open_readonly("/dev/urandom\0") }; - } else if res < 0 { - let e = last_os_error().raw_os_error(); - if e == Some(libc::EINTR) || e == Some(libc::EAGAIN) { - continue; - } - } - // We either hard failed, or poll() returned the wrong pfd. - break None; - }; - unsafe { libc::close(pfd.fd) }; - ret +// Returns the file descriptor for the device file used to retrieve random +// bytes. The file will be opened exactly once. All successful calls will +// return the same file descriptor. This file descriptor is never closed. +fn get_rng_fd() -> Result { + static FD: AtomicUsize = AtomicUsize::new(LazyUsize::UNINIT); + fn get_fd() -> Option { + match FD.load(Relaxed) { + LazyUsize::UNINIT => None, + val => Some(val as libc::c_int), } - } else { - fn init_file() -> Option { - unsafe { open_readonly(FILE_PATH) } + } + + // Use double-checked locking to avoid acquiring the lock if possible. + if let Some(fd) = get_fd() { + return Ok(fd); + } + + // SAFETY: We use the mutex only in this method, and we always unlock it + // before returning, making sure we don't violate the pthread_mutex_t API. + static MUTEX: Mutex = Mutex::new(); + unsafe { MUTEX.lock() }; + let _guard = DropGuard(|| unsafe { MUTEX.unlock() }); + + if let Some(fd) = get_fd() { + return Ok(fd); + } + + // On Linux, /dev/urandom might return insecure values. + #[cfg(any(target_os = "android", target_os = "linux"))] + wait_until_rng_ready()?; + + let fd = unsafe { open_readonly(FILE_PATH)? }; + // The fd always fits in a usize without conflicting with UNINIT. + debug_assert!(fd >= 0 && (fd as usize) < LazyUsize::UNINIT); + FD.store(fd as usize, Relaxed); + + Ok(fd) +} + +// Succeeds once /dev/urandom is safe to read from +#[cfg(any(target_os = "android", target_os = "linux"))] +fn wait_until_rng_ready() -> Result<(), Error> { + // Poll /dev/random to make sure it is ok to read from /dev/urandom. + let fd = unsafe { open_readonly("/dev/random\0")? }; + let mut pfd = libc::pollfd { + fd, + events: libc::POLLIN, + revents: 0, + }; + let _guard = DropGuard(|| unsafe { + libc::close(fd); + }); + + loop { + // A negative timeout means an infinite timeout. + let res = unsafe { libc::poll(&mut pfd, 1, -1) }; + if res >= 0 { + assert_eq!(res, 1); // We only used one fd, and cannot timeout. + return Ok(()); } + let err = crate::util_libc::last_os_error(); + match err.raw_os_error() { + Some(libc::EINTR) | Some(libc::EAGAIN) => continue, + _ => return Err(err), + } + } +} + +struct Mutex(UnsafeCell); + +impl Mutex { + const fn new() -> Self { + Self(UnsafeCell::new(libc::PTHREAD_MUTEX_INITIALIZER)) + } + unsafe fn lock(&self) { + let r = libc::pthread_mutex_lock(self.0.get()); + debug_assert_eq!(r, 0); + } + unsafe fn unlock(&self) { + let r = libc::pthread_mutex_unlock(self.0.get()); + debug_assert_eq!(r, 0); + } +} + +unsafe impl Sync for Mutex {} + +struct DropGuard(F); + +impl Drop for DropGuard { + fn drop(&mut self) { + self.0() } } diff --git a/vendor/getrandom/src/util.rs b/vendor/getrandom/src/util.rs index 63a9eab38e..8dbd8ae803 100644 --- a/vendor/getrandom/src/util.rs +++ b/vendor/getrandom/src/util.rs @@ -8,8 +8,8 @@ use core::sync::atomic::{AtomicUsize, Ordering::Relaxed}; -// This structure represents a laziliy initialized static usize value. Useful -// when it is perferable to just rerun initialization instead of locking. +// This structure represents a lazily initialized static usize value. Useful +// when it is preferable to just rerun initialization instead of locking. // Both unsync_init and sync_init will invoke an init() function until it // succeeds, then return the cached value for future calls. // @@ -25,7 +25,7 @@ use core::sync::atomic::{AtomicUsize, Ordering::Relaxed}; // v // } // the effects of c() or writes to shared memory will not necessarily be -// observed and additional syncronization methods with be needed. +// observed and additional synchronization methods with be needed. pub struct LazyUsize(AtomicUsize); impl LazyUsize { @@ -35,8 +35,6 @@ impl LazyUsize { // The initialization is not completed. pub const UNINIT: usize = usize::max_value(); - // The initialization is currently running. - pub const ACTIVE: usize = usize::max_value() - 1; // Runs the init() function at least once, returning the value of some run // of init(). Multiple callers can run their init() functions in parallel. @@ -50,36 +48,6 @@ impl LazyUsize { } val } - - // Synchronously runs the init() function. Only one caller will have their - // init() function running at a time, and exactly one successful call will - // be run. init() returning UNINIT or ACTIVE will be considered a failure, - // and future calls to sync_init will rerun their init() function. - pub fn sync_init(&self, init: impl FnOnce() -> usize, mut wait: impl FnMut()) -> usize { - // Common and fast path with no contention. Don't wast time on CAS. - match self.0.load(Relaxed) { - Self::UNINIT | Self::ACTIVE => {} - val => return val, - } - // Relaxed ordering is fine, as we only have a single atomic variable. - loop { - match self.0.compare_and_swap(Self::UNINIT, Self::ACTIVE, Relaxed) { - Self::UNINIT => { - let val = init(); - self.0.store( - match val { - Self::UNINIT | Self::ACTIVE => Self::UNINIT, - val => val, - }, - Relaxed, - ); - return val; - } - Self::ACTIVE => wait(), - val => return val, - } - } - } } // Identical to LazyUsize except with bool instead of usize. diff --git a/vendor/getrandom/src/util_libc.rs b/vendor/getrandom/src/util_libc.rs index d662fc6204..1cdc13e5ab 100644 --- a/vendor/getrandom/src/util_libc.rs +++ b/vendor/getrandom/src/util_libc.rs @@ -18,15 +18,27 @@ cfg_if! { use libc::__errno_location as errno_location; } else if #[cfg(any(target_os = "solaris", target_os = "illumos"))] { use libc::___errno as errno_location; - } else if #[cfg(any(target_os = "macos", target_os = "freebsd", target_os = "dragonfly"))] { + } else if #[cfg(any(target_os = "macos", target_os = "freebsd"))] { use libc::__error as errno_location; } else if #[cfg(target_os = "haiku")] { use libc::_errnop as errno_location; } } +cfg_if! { + if #[cfg(target_os = "vxworks")] { + use libc::errnoGet as get_errno; + } else if #[cfg(target_os = "dragonfly")] { + // Until rust-lang/rust#29594 is stable, we cannot get the errno value + // on DragonFlyBSD. So we just return an out-of-range errno. + unsafe fn get_errno() -> libc::c_int { -1 } + } else { + unsafe fn get_errno() -> libc::c_int { *errno_location() } + } +} + pub fn last_os_error() -> Error { - let errno = unsafe { *errno_location() }; + let errno = unsafe { get_errno() }; if errno > 0 { Error::from(NonZeroU32::new(errno as u32).unwrap()) } else { @@ -86,37 +98,6 @@ impl Weak { } } -pub struct LazyFd(LazyUsize); - -impl LazyFd { - pub const fn new() -> Self { - Self(LazyUsize::new()) - } - - // If init() returns Some(x), x should be nonnegative. - pub fn init(&self, init: impl FnOnce() -> Option) -> Option { - let fd = self.0.sync_init( - || match init() { - // OK as val >= 0 and val <= c_int::MAX < usize::MAX - Some(val) => val as usize, - None => LazyUsize::UNINIT, - }, - || unsafe { - // We are usually waiting on an open(2) syscall to complete, - // which typically takes < 10us if the file is a device. - // However, we might end up waiting much longer if the entropy - // pool isn't initialized, but even in that case, this loop will - // consume a negligible amount of CPU on most platforms. - libc::usleep(10); - }, - ); - match fd { - LazyUsize::UNINIT => None, - val => Some(val as libc::c_int), - } - } -} - cfg_if! { if #[cfg(any(target_os = "linux", target_os = "emscripten"))] { use libc::open64 as open; @@ -126,15 +107,15 @@ cfg_if! { } // SAFETY: path must be null terminated, FD must be manually closed. -pub unsafe fn open_readonly(path: &str) -> Option { +pub unsafe fn open_readonly(path: &str) -> Result { debug_assert!(path.as_bytes().last() == Some(&0)); - let fd = open(path.as_ptr() as *mut _, libc::O_RDONLY | libc::O_CLOEXEC); + let fd = open(path.as_ptr() as *const _, libc::O_RDONLY | libc::O_CLOEXEC); if fd < 0 { - return None; + return Err(last_os_error()); } // O_CLOEXEC works on all Unix targets except for older Linux kernels (pre // 2.6.23), so we also use an ioctl to make sure FD_CLOEXEC is set. #[cfg(target_os = "linux")] libc::ioctl(fd, libc::FIOCLEX); - Some(fd) + Ok(fd) } diff --git a/vendor/getrandom/src/vxworks.rs b/vendor/getrandom/src/vxworks.rs new file mode 100644 index 0000000000..a2fe52ada8 --- /dev/null +++ b/vendor/getrandom/src/vxworks.rs @@ -0,0 +1,35 @@ +// Copyright 2018 Developers of the Rand project. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Implementation for VxWorks +use crate::error::{Error, RAND_SECURE_FATAL}; +use crate::util_libc::last_os_error; +use core::sync::atomic::{AtomicBool, Ordering::Relaxed}; + +pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { + static RNG_INIT: AtomicBool = AtomicBool::new(false); + while !RNG_INIT.load(Relaxed) { + let ret = unsafe { libc::randSecure() }; + if ret < 0 { + return Err(RAND_SECURE_FATAL); + } else if ret > 0 { + RNG_INIT.store(true, Relaxed); + break; + } + unsafe { libc::usleep(10) }; + } + + // Prevent overflow of i32 + for chunk in dest.chunks_mut(i32::max_value() as usize) { + let ret = unsafe { libc::randABytes(chunk.as_mut_ptr(), chunk.len() as i32) }; + if ret != 0 { + return Err(last_os_error()); + } + } + Ok(()) +} diff --git a/vendor/getrandom/src/wasi.rs b/vendor/getrandom/src/wasi.rs index 713c1ab90b..4674f43960 100644 --- a/vendor/getrandom/src/wasi.rs +++ b/vendor/getrandom/src/wasi.rs @@ -8,12 +8,12 @@ //! Implementation for WASI use crate::Error; -use core::num; -use wasi::wasi_unstable::random_get; +use core::num::NonZeroU32; +use wasi::random_get; pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { - random_get(dest).map_err(|e: num::NonZeroU16| { - // convert wasi's NonZeroU16 error into getrandom's NonZeroU32 error - num::NonZeroU32::new(e.get() as u32).unwrap().into() + unsafe { random_get(dest.as_mut_ptr(), dest.len()) }.map_err(|e: wasi::Error| { + // convert wasi's Error into getrandom's NonZeroU32 error + NonZeroU32::new(e.raw_error() as u32).unwrap().into() }) } diff --git a/vendor/getrandom/src/windows_uwp.rs b/vendor/getrandom/src/windows_uwp.rs index bf15d1a2f6..586c6f61c2 100644 --- a/vendor/getrandom/src/windows_uwp.rs +++ b/vendor/getrandom/src/windows_uwp.rs @@ -7,7 +7,7 @@ // except according to those terms. //! Implementation for Windows UWP targets. After deprecation of Windows XP -//! and Vista, this can superseed the `RtlGenRandom`-based implementation. +//! and Vista, this can supersede the `RtlGenRandom`-based implementation. use crate::Error; use core::{ffi::c_void, num::NonZeroU32, ptr}; diff --git a/vendor/getrandom/tests/mod.rs b/vendor/getrandom/tests/common.rs similarity index 80% rename from vendor/getrandom/tests/mod.rs rename to vendor/getrandom/tests/common.rs index 66a36562fc..afefa03123 100644 --- a/vendor/getrandom/tests/mod.rs +++ b/vendor/getrandom/tests/common.rs @@ -1,13 +1,19 @@ -extern crate getrandom; +#[cfg(feature = "wasm-bindgen")] +use wasm_bindgen_test::*; use getrandom::getrandom; +#[cfg(feature = "test-in-browser")] +wasm_bindgen_test_configure!(run_in_browser); + +#[cfg_attr(feature = "wasm-bindgen", wasm_bindgen_test)] #[test] fn test_zero() { // Test that APIs are happy with zero-length requests getrandom(&mut [0u8; 0]).unwrap(); } +#[cfg_attr(feature = "wasm-bindgen", wasm_bindgen_test)] #[test] fn test_diff() { let mut v1 = [0u8; 1000]; @@ -25,6 +31,7 @@ fn test_diff() { assert!(n_diff_bits >= v1.len() as u32); } +#[cfg_attr(feature = "wasm-bindgen", wasm_bindgen_test)] #[test] fn test_huge() { let mut huge = [0u8; 100_000]; diff --git a/vendor/globset/.cargo-checksum.json b/vendor/globset/.cargo-checksum.json new file mode 100644 index 0000000000..0307a062e1 --- /dev/null +++ b/vendor/globset/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"d39cda571d73f748cf46480a669e2646b1a8f326a3527f83e5784d878e1f74e8","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"2ae48dce209627403a6b0a088bd5b1890a7d6a01ee7a381d7610fe5e3229d831","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"fcebec92ad5dbe13b87bd5b28707fbe18800cd9be3acc90a643767b90f4a378a","src/glob.rs":"eb56d371872d5414297b0ca9508d305f9ca37f5a0e550a0c1f0e38fd424894ad","src/lib.rs":"757b1bd7e2e8a3fd1a27d07aeb264fe318efe93c5c71506240354cfca6bc424e","src/pathutil.rs":"a4da10d62474458360f9ee73979242203bf1d4c1d267560a26475a7c9c3f94a8"},"package":"ef4feaabe24a0a658fd9cf4a9acf6ed284f045c77df0f49020ba3245cfb7b454"} \ No newline at end of file diff --git a/vendor/globset/COPYING b/vendor/globset/COPYING new file mode 100644 index 0000000000..bb9c20a094 --- /dev/null +++ b/vendor/globset/COPYING @@ -0,0 +1,3 @@ +This project is dual-licensed under the Unlicense and MIT licenses. + +You may use this code under the terms of either license. diff --git a/vendor/globset/Cargo.toml b/vendor/globset/Cargo.toml new file mode 100644 index 0000000000..f01d1843a1 --- /dev/null +++ b/vendor/globset/Cargo.toml @@ -0,0 +1,48 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +name = "globset" +version = "0.4.3" +authors = ["Andrew Gallant "] +description = "Cross platform single glob and glob set matching. Glob set matching is the\nprocess of matching one or more glob patterns against a single candidate path\nsimultaneously, and returning all of the globs that matched.\n" +homepage = "https://github.com/BurntSushi/ripgrep/tree/master/globset" +documentation = "https://docs.rs/globset" +readme = "README.md" +keywords = ["regex", "glob", "multiple", "set", "pattern"] +license = "Unlicense/MIT" +repository = "https://github.com/BurntSushi/ripgrep/tree/master/globset" + +[lib] +name = "globset" +bench = false +[dependencies.aho-corasick] +version = "0.7.3" + +[dependencies.bstr] +version = "0.1.2" +features = ["std"] +default-features = false + +[dependencies.fnv] +version = "1.0.6" + +[dependencies.log] +version = "0.4.5" + +[dependencies.regex] +version = "1.1.5" +[dev-dependencies.glob] +version = "0.3.0" + +[features] +simd-accel = [] diff --git a/vendor/globset/LICENSE-MIT b/vendor/globset/LICENSE-MIT new file mode 100644 index 0000000000..3b0a5dc09c --- /dev/null +++ b/vendor/globset/LICENSE-MIT @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Andrew Gallant + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/globset/README.md b/vendor/globset/README.md new file mode 100644 index 0000000000..5d54172aa8 --- /dev/null +++ b/vendor/globset/README.md @@ -0,0 +1,122 @@ +globset +======= +Cross platform single glob and glob set matching. Glob set matching is the +process of matching one or more glob patterns against a single candidate path +simultaneously, and returning all of the globs that matched. + +[![Linux build status](https://api.travis-ci.org/BurntSushi/ripgrep.svg)](https://travis-ci.org/BurntSushi/ripgrep) +[![Windows build status](https://ci.appveyor.com/api/projects/status/github/BurntSushi/ripgrep?svg=true)](https://ci.appveyor.com/project/BurntSushi/ripgrep) +[![](https://img.shields.io/crates/v/globset.svg)](https://crates.io/crates/globset) + +Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org). + +### Documentation + +[https://docs.rs/globset](https://docs.rs/globset) + +### Usage + +Add this to your `Cargo.toml`: + +```toml +[dependencies] +globset = "0.3" +``` + +and this to your crate root: + +```rust +extern crate globset; +``` + +### Example: one glob + +This example shows how to match a single glob against a single file path. + +```rust +use globset::Glob; + +let glob = Glob::new("*.rs")?.compile_matcher(); + +assert!(glob.is_match("foo.rs")); +assert!(glob.is_match("foo/bar.rs")); +assert!(!glob.is_match("Cargo.toml")); +``` + +### Example: configuring a glob matcher + +This example shows how to use a `GlobBuilder` to configure aspects of match +semantics. In this example, we prevent wildcards from matching path separators. + +```rust +use globset::GlobBuilder; + +let glob = GlobBuilder::new("*.rs") + .literal_separator(true).build()?.compile_matcher(); + +assert!(glob.is_match("foo.rs")); +assert!(!glob.is_match("foo/bar.rs")); // no longer matches +assert!(!glob.is_match("Cargo.toml")); +``` + +### Example: match multiple globs at once + +This example shows how to match multiple glob patterns at once. + +```rust +use globset::{Glob, GlobSetBuilder}; + +let mut builder = GlobSetBuilder::new(); +// A GlobBuilder can be used to configure each glob's match semantics +// independently. +builder.add(Glob::new("*.rs")?); +builder.add(Glob::new("src/lib.rs")?); +builder.add(Glob::new("src/**/foo.rs")?); +let set = builder.build()?; + +assert_eq!(set.matches("src/bar/baz/foo.rs"), vec![0, 2]); +``` + +### Performance + +This crate implements globs by converting them to regular expressions, and +executing them with the +[`regex`](https://github.com/rust-lang-nursery/regex) +crate. + +For single glob matching, performance of this crate should be roughly on par +with the performance of the +[`glob`](https://github.com/rust-lang-nursery/glob) +crate. (`*_regex` correspond to benchmarks for this library while `*_glob` +correspond to benchmarks for the `glob` library.) +Optimizations in the `regex` crate may propel this library past `glob`, +particularly when matching longer paths. + +``` +test ext_glob ... bench: 425 ns/iter (+/- 21) +test ext_regex ... bench: 175 ns/iter (+/- 10) +test long_glob ... bench: 182 ns/iter (+/- 11) +test long_regex ... bench: 173 ns/iter (+/- 10) +test short_glob ... bench: 69 ns/iter (+/- 4) +test short_regex ... bench: 83 ns/iter (+/- 2) +``` + +The primary performance advantage of this crate is when matching multiple +globs against a single path. With the `glob` crate, one must match each glob +synchronously, one after the other. In this crate, many can be matched +simultaneously. For example: + +``` +test many_short_glob ... bench: 1,063 ns/iter (+/- 47) +test many_short_regex_set ... bench: 186 ns/iter (+/- 11) +``` + +### Comparison with the [`glob`](https://github.com/rust-lang-nursery/glob) crate + +* Supports alternate "or" globs, e.g., `*.{foo,bar}`. +* Can match non-UTF-8 file paths correctly. +* Supports matching multiple globs at once. +* Doesn't provide a recursive directory iterator of matching file paths, + although I believe this crate should grow one eventually. +* Supports case insensitive and require-literal-separator match options, but + **doesn't** support the require-literal-leading-dot option. diff --git a/vendor/globset/UNLICENSE b/vendor/globset/UNLICENSE new file mode 100644 index 0000000000..68a49daad8 --- /dev/null +++ b/vendor/globset/UNLICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/vendor/globset/benches/bench.rs b/vendor/globset/benches/bench.rs new file mode 100644 index 0000000000..e142ed72ef --- /dev/null +++ b/vendor/globset/benches/bench.rs @@ -0,0 +1,121 @@ +/*! +This module benchmarks the glob implementation. For benchmarks on the ripgrep +tool itself, see the benchsuite directory. +*/ +#![feature(test)] + +extern crate glob; +extern crate globset; +#[macro_use] +extern crate lazy_static; +extern crate regex; +extern crate test; + +use std::ffi::OsStr; +use std::path::Path; + +use globset::{Candidate, Glob, GlobMatcher, GlobSet, GlobSetBuilder}; + +const EXT: &'static str = "some/a/bigger/path/to/the/crazy/needle.txt"; +const EXT_PAT: &'static str = "*.txt"; + +const SHORT: &'static str = "some/needle.txt"; +const SHORT_PAT: &'static str = "some/**/needle.txt"; + +const LONG: &'static str = "some/a/bigger/path/to/the/crazy/needle.txt"; +const LONG_PAT: &'static str = "some/**/needle.txt"; + +fn new_glob(pat: &str) -> glob::Pattern { + glob::Pattern::new(pat).unwrap() +} + +fn new_reglob(pat: &str) -> GlobMatcher { + Glob::new(pat).unwrap().compile_matcher() +} + +fn new_reglob_many(pats: &[&str]) -> GlobSet { + let mut builder = GlobSetBuilder::new(); + for pat in pats { + builder.add(Glob::new(pat).unwrap()); + } + builder.build().unwrap() +} + +#[bench] +fn ext_glob(b: &mut test::Bencher) { + let pat = new_glob(EXT_PAT); + b.iter(|| assert!(pat.matches(EXT))); +} + +#[bench] +fn ext_regex(b: &mut test::Bencher) { + let set = new_reglob(EXT_PAT); + let cand = Candidate::new(EXT); + b.iter(|| assert!(set.is_match_candidate(&cand))); +} + +#[bench] +fn short_glob(b: &mut test::Bencher) { + let pat = new_glob(SHORT_PAT); + b.iter(|| assert!(pat.matches(SHORT))); +} + +#[bench] +fn short_regex(b: &mut test::Bencher) { + let set = new_reglob(SHORT_PAT); + let cand = Candidate::new(SHORT); + b.iter(|| assert!(set.is_match_candidate(&cand))); +} + +#[bench] +fn long_glob(b: &mut test::Bencher) { + let pat = new_glob(LONG_PAT); + b.iter(|| assert!(pat.matches(LONG))); +} + +#[bench] +fn long_regex(b: &mut test::Bencher) { + let set = new_reglob(LONG_PAT); + let cand = Candidate::new(LONG); + b.iter(|| assert!(set.is_match_candidate(&cand))); +} + +const MANY_SHORT_GLOBS: &'static [&'static str] = &[ + // Taken from a random .gitignore on my system. + ".*.swp", + "tags", + "target", + "*.lock", + "tmp", + "*.csv", + "*.fst", + "*-got", + "*.csv.idx", + "words", + "98m*", + "dict", + "test", + "months", +]; + +const MANY_SHORT_SEARCH: &'static str = "98m-blah.csv.idx"; + +#[bench] +fn many_short_glob(b: &mut test::Bencher) { + let pats: Vec<_> = MANY_SHORT_GLOBS.iter().map(|&s| new_glob(s)).collect(); + b.iter(|| { + let mut count = 0; + for pat in &pats { + if pat.matches(MANY_SHORT_SEARCH) { + count += 1; + } + } + assert_eq!(2, count); + }) +} + +#[bench] +fn many_short_regex_set(b: &mut test::Bencher) { + let set = new_reglob_many(MANY_SHORT_GLOBS); + b.iter(|| assert_eq!(2, set.matches(MANY_SHORT_SEARCH).iter().count())); +} diff --git a/vendor/globset/src/glob.rs b/vendor/globset/src/glob.rs new file mode 100644 index 0000000000..5e635a205a --- /dev/null +++ b/vendor/globset/src/glob.rs @@ -0,0 +1,1497 @@ +use std::fmt; +use std::hash; +use std::iter; +use std::ops::{Deref, DerefMut}; +use std::path::{Path, is_separator}; +use std::str; + +use regex; +use regex::bytes::Regex; + +use {Candidate, Error, ErrorKind, new_regex}; + +/// Describes a matching strategy for a particular pattern. +/// +/// This provides a way to more quickly determine whether a pattern matches +/// a particular file path in a way that scales with a large number of +/// patterns. For example, if many patterns are of the form `*.ext`, then it's +/// possible to test whether any of those patterns matches by looking up a +/// file path's extension in a hash table. +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum MatchStrategy { + /// A pattern matches if and only if the entire file path matches this + /// literal string. + Literal(String), + /// A pattern matches if and only if the file path's basename matches this + /// literal string. + BasenameLiteral(String), + /// A pattern matches if and only if the file path's extension matches this + /// literal string. + Extension(String), + /// A pattern matches if and only if this prefix literal is a prefix of the + /// candidate file path. + Prefix(String), + /// A pattern matches if and only if this prefix literal is a prefix of the + /// candidate file path. + /// + /// An exception: if `component` is true, then `suffix` must appear at the + /// beginning of a file path or immediately following a `/`. + Suffix { + /// The actual suffix. + suffix: String, + /// Whether this must start at the beginning of a path component. + component: bool, + }, + /// A pattern matches only if the given extension matches the file path's + /// extension. Note that this is a necessary but NOT sufficient criterion. + /// Namely, if the extension matches, then a full regex search is still + /// required. + RequiredExtension(String), + /// A regex needs to be used for matching. + Regex, +} + +impl MatchStrategy { + /// Returns a matching strategy for the given pattern. + pub fn new(pat: &Glob) -> MatchStrategy { + if let Some(lit) = pat.basename_literal() { + MatchStrategy::BasenameLiteral(lit) + } else if let Some(lit) = pat.literal() { + MatchStrategy::Literal(lit) + } else if let Some(ext) = pat.ext() { + MatchStrategy::Extension(ext) + } else if let Some(prefix) = pat.prefix() { + MatchStrategy::Prefix(prefix) + } else if let Some((suffix, component)) = pat.suffix() { + MatchStrategy::Suffix { suffix: suffix, component: component } + } else if let Some(ext) = pat.required_ext() { + MatchStrategy::RequiredExtension(ext) + } else { + MatchStrategy::Regex + } + } +} + +/// Glob represents a successfully parsed shell glob pattern. +/// +/// It cannot be used directly to match file paths, but it can be converted +/// to a regular expression string or a matcher. +#[derive(Clone, Debug, Eq)] +pub struct Glob { + glob: String, + re: String, + opts: GlobOptions, + tokens: Tokens, +} + +impl PartialEq for Glob { + fn eq(&self, other: &Glob) -> bool { + self.glob == other.glob && self.opts == other.opts + } +} + +impl hash::Hash for Glob { + fn hash(&self, state: &mut H) { + self.glob.hash(state); + self.opts.hash(state); + } +} + +impl fmt::Display for Glob { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.glob.fmt(f) + } +} + +/// A matcher for a single pattern. +#[derive(Clone, Debug)] +pub struct GlobMatcher { + /// The underlying pattern. + pat: Glob, + /// The pattern, as a compiled regex. + re: Regex, +} + +impl GlobMatcher { + /// Tests whether the given path matches this pattern or not. + pub fn is_match>(&self, path: P) -> bool { + self.is_match_candidate(&Candidate::new(path.as_ref())) + } + + /// Tests whether the given path matches this pattern or not. + pub fn is_match_candidate(&self, path: &Candidate) -> bool { + self.re.is_match(path.path.as_bytes()) + } +} + +/// A strategic matcher for a single pattern. +#[cfg(test)] +#[derive(Clone, Debug)] +struct GlobStrategic { + /// The match strategy to use. + strategy: MatchStrategy, + /// The underlying pattern. + pat: Glob, + /// The pattern, as a compiled regex. + re: Regex, +} + +#[cfg(test)] +impl GlobStrategic { + /// Tests whether the given path matches this pattern or not. + fn is_match>(&self, path: P) -> bool { + self.is_match_candidate(&Candidate::new(path.as_ref())) + } + + /// Tests whether the given path matches this pattern or not. + fn is_match_candidate(&self, candidate: &Candidate) -> bool { + let byte_path = candidate.path.as_bytes(); + + match self.strategy { + MatchStrategy::Literal(ref lit) => lit.as_bytes() == byte_path, + MatchStrategy::BasenameLiteral(ref lit) => { + lit.as_bytes() == &*candidate.basename + } + MatchStrategy::Extension(ref ext) => { + ext.as_bytes() == &*candidate.ext + } + MatchStrategy::Prefix(ref pre) => { + starts_with(pre.as_bytes(), byte_path) + } + MatchStrategy::Suffix { ref suffix, component } => { + if component && byte_path == &suffix.as_bytes()[1..] { + return true; + } + ends_with(suffix.as_bytes(), byte_path) + } + MatchStrategy::RequiredExtension(ref ext) => { + let ext = ext.as_bytes(); + &*candidate.ext == ext && self.re.is_match(byte_path) + } + MatchStrategy::Regex => self.re.is_match(byte_path), + } + } +} + +/// A builder for a pattern. +/// +/// This builder enables configuring the match semantics of a pattern. For +/// example, one can make matching case insensitive. +/// +/// The lifetime `'a` refers to the lifetime of the pattern string. +#[derive(Clone, Debug)] +pub struct GlobBuilder<'a> { + /// The glob pattern to compile. + glob: &'a str, + /// Options for the pattern. + opts: GlobOptions, +} + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +struct GlobOptions { + /// Whether to match case insensitively. + case_insensitive: bool, + /// Whether to require a literal separator to match a separator in a file + /// path. e.g., when enabled, `*` won't match `/`. + literal_separator: bool, + /// Whether or not to use `\` to escape special characters. + /// e.g., when enabled, `\*` will match a literal `*`. + backslash_escape: bool, +} + +impl GlobOptions { + fn default() -> GlobOptions { + GlobOptions { + case_insensitive: false, + literal_separator: false, + backslash_escape: !is_separator('\\'), + } + } +} + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +struct Tokens(Vec); + +impl Deref for Tokens { + type Target = Vec; + fn deref(&self) -> &Vec { &self.0 } +} + +impl DerefMut for Tokens { + fn deref_mut(&mut self) -> &mut Vec { &mut self.0 } +} + +#[derive(Clone, Debug, Eq, PartialEq)] +enum Token { + Literal(char), + Any, + ZeroOrMore, + RecursivePrefix, + RecursiveSuffix, + RecursiveZeroOrMore, + Class { + negated: bool, + ranges: Vec<(char, char)>, + }, + Alternates(Vec), +} + +impl Glob { + /// Builds a new pattern with default options. + pub fn new(glob: &str) -> Result { + GlobBuilder::new(glob).build() + } + + /// Returns a matcher for this pattern. + pub fn compile_matcher(&self) -> GlobMatcher { + let re = new_regex(&self.re) + .expect("regex compilation shouldn't fail"); + GlobMatcher { + pat: self.clone(), + re: re, + } + } + + /// Returns a strategic matcher. + /// + /// This isn't exposed because it's not clear whether it's actually + /// faster than just running a regex for a *single* pattern. If it + /// is faster, then GlobMatcher should do it automatically. + #[cfg(test)] + fn compile_strategic_matcher(&self) -> GlobStrategic { + let strategy = MatchStrategy::new(self); + let re = new_regex(&self.re) + .expect("regex compilation shouldn't fail"); + GlobStrategic { + strategy: strategy, + pat: self.clone(), + re: re, + } + } + + /// Returns the original glob pattern used to build this pattern. + pub fn glob(&self) -> &str { + &self.glob + } + + /// Returns the regular expression string for this glob. + /// + /// Note that regular expressions for globs are intended to be matched on + /// arbitrary bytes (`&[u8]`) instead of Unicode strings (`&str`). In + /// particular, globs are frequently used on file paths, where there is no + /// general guarantee that file paths are themselves valid UTF-8. As a + /// result, callers will need to ensure that they are using a regex API + /// that can match on arbitrary bytes. For example, the + /// [`regex`](https://crates.io/regex) + /// crate's + /// [`Regex`](https://docs.rs/regex/*/regex/struct.Regex.html) + /// API is not suitable for this since it matches on `&str`, but its + /// [`bytes::Regex`](https://docs.rs/regex/*/regex/bytes/struct.Regex.html) + /// API is suitable for this. + pub fn regex(&self) -> &str { + &self.re + } + + /// Returns the pattern as a literal if and only if the pattern must match + /// an entire path exactly. + /// + /// The basic format of these patterns is `{literal}`. + fn literal(&self) -> Option { + if self.opts.case_insensitive { + return None; + } + let mut lit = String::new(); + for t in &*self.tokens { + match *t { + Token::Literal(c) => lit.push(c), + _ => return None, + } + } + if lit.is_empty() { + None + } else { + Some(lit) + } + } + + /// Returns an extension if this pattern matches a file path if and only + /// if the file path has the extension returned. + /// + /// Note that this extension returned differs from the extension that + /// std::path::Path::extension returns. Namely, this extension includes + /// the '.'. Also, paths like `.rs` are considered to have an extension + /// of `.rs`. + fn ext(&self) -> Option { + if self.opts.case_insensitive { + return None; + } + let start = match self.tokens.get(0) { + Some(&Token::RecursivePrefix) => 1, + Some(_) => 0, + _ => return None, + }; + match self.tokens.get(start) { + Some(&Token::ZeroOrMore) => { + // If there was no recursive prefix, then we only permit + // `*` if `*` can match a `/`. For example, if `*` can't + // match `/`, then `*.c` doesn't match `foo/bar.c`. + if start == 0 && self.opts.literal_separator { + return None; + } + } + _ => return None, + } + match self.tokens.get(start + 1) { + Some(&Token::Literal('.')) => {} + _ => return None, + } + let mut lit = ".".to_string(); + for t in self.tokens[start + 2..].iter() { + match *t { + Token::Literal('.') | Token::Literal('/') => return None, + Token::Literal(c) => lit.push(c), + _ => return None, + } + } + if lit.is_empty() { + None + } else { + Some(lit) + } + } + + /// This is like `ext`, but returns an extension even if it isn't sufficent + /// to imply a match. Namely, if an extension is returned, then it is + /// necessary but not sufficient for a match. + fn required_ext(&self) -> Option { + if self.opts.case_insensitive { + return None; + } + // We don't care at all about the beginning of this pattern. All we + // need to check for is if it ends with a literal of the form `.ext`. + let mut ext: Vec = vec![]; // built in reverse + for t in self.tokens.iter().rev() { + match *t { + Token::Literal('/') => return None, + Token::Literal(c) => { + ext.push(c); + if c == '.' { + break; + } + } + _ => return None, + } + } + if ext.last() != Some(&'.') { + None + } else { + ext.reverse(); + Some(ext.into_iter().collect()) + } + } + + /// Returns a literal prefix of this pattern if the entire pattern matches + /// if the literal prefix matches. + fn prefix(&self) -> Option { + if self.opts.case_insensitive { + return None; + } + let end = match self.tokens.last() { + Some(&Token::ZeroOrMore) => { + if self.opts.literal_separator { + // If a trailing `*` can't match a `/`, then we can't + // assume a match of the prefix corresponds to a match + // of the overall pattern. e.g., `foo/*` with + // `literal_separator` enabled matches `foo/bar` but not + // `foo/bar/baz`, even though `foo/bar/baz` has a `foo/` + // literal prefix. + return None; + } + self.tokens.len() - 1 + } + _ => self.tokens.len(), + }; + let mut lit = String::new(); + for t in &self.tokens[0..end] { + match *t { + Token::Literal(c) => lit.push(c), + _ => return None, + } + } + if lit.is_empty() { + None + } else { + Some(lit) + } + } + + /// Returns a literal suffix of this pattern if the entire pattern matches + /// if the literal suffix matches. + /// + /// If a literal suffix is returned and it must match either the entire + /// file path or be preceded by a `/`, then also return true. This happens + /// with a pattern like `**/foo/bar`. Namely, this pattern matches + /// `foo/bar` and `baz/foo/bar`, but not `foofoo/bar`. In this case, the + /// suffix returned is `/foo/bar` (but should match the entire path + /// `foo/bar`). + /// + /// When this returns true, the suffix literal is guaranteed to start with + /// a `/`. + fn suffix(&self) -> Option<(String, bool)> { + if self.opts.case_insensitive { + return None; + } + let mut lit = String::new(); + let (start, entire) = match self.tokens.get(0) { + Some(&Token::RecursivePrefix) => { + // We only care if this follows a path component if the next + // token is a literal. + if let Some(&Token::Literal(_)) = self.tokens.get(1) { + lit.push('/'); + (1, true) + } else { + (1, false) + } + } + _ => (0, false), + }; + let start = match self.tokens.get(start) { + Some(&Token::ZeroOrMore) => { + // If literal_separator is enabled, then a `*` can't + // necessarily match everything, so reporting a suffix match + // as a match of the pattern would be a false positive. + if self.opts.literal_separator { + return None; + } + start + 1 + } + _ => start, + }; + for t in &self.tokens[start..] { + match *t { + Token::Literal(c) => lit.push(c), + _ => return None, + } + } + if lit.is_empty() || lit == "/" { + None + } else { + Some((lit, entire)) + } + } + + /// If this pattern only needs to inspect the basename of a file path, + /// then the tokens corresponding to only the basename match are returned. + /// + /// For example, given a pattern of `**/*.foo`, only the tokens + /// corresponding to `*.foo` are returned. + /// + /// Note that this will return None if any match of the basename tokens + /// doesn't correspond to a match of the entire pattern. For example, the + /// glob `foo` only matches when a file path has a basename of `foo`, but + /// doesn't *always* match when a file path has a basename of `foo`. e.g., + /// `foo` doesn't match `abc/foo`. + fn basename_tokens(&self) -> Option<&[Token]> { + if self.opts.case_insensitive { + return None; + } + let start = match self.tokens.get(0) { + Some(&Token::RecursivePrefix) => 1, + _ => { + // With nothing to gobble up the parent portion of a path, + // we can't assume that matching on only the basename is + // correct. + return None; + } + }; + if self.tokens[start..].is_empty() { + return None; + } + for t in &self.tokens[start..] { + match *t { + Token::Literal('/') => return None, + Token::Literal(_) => {} // OK + Token::Any | Token::ZeroOrMore => { + if !self.opts.literal_separator { + // In this case, `*` and `?` can match a path + // separator, which means this could reach outside + // the basename. + return None; + } + } + Token::RecursivePrefix + | Token::RecursiveSuffix + | Token::RecursiveZeroOrMore => { + return None; + } + Token::Class{..} | Token::Alternates(..) => { + // We *could* be a little smarter here, but either one + // of these is going to prevent our literal optimizations + // anyway, so give up. + return None; + } + } + } + Some(&self.tokens[start..]) + } + + /// Returns the pattern as a literal if and only if the pattern exclusively + /// matches the basename of a file path *and* is a literal. + /// + /// The basic format of these patterns is `**/{literal}`, where `{literal}` + /// does not contain a path separator. + fn basename_literal(&self) -> Option { + let tokens = match self.basename_tokens() { + None => return None, + Some(tokens) => tokens, + }; + let mut lit = String::new(); + for t in tokens { + match *t { + Token::Literal(c) => lit.push(c), + _ => return None, + } + } + Some(lit) + } +} + +impl<'a> GlobBuilder<'a> { + /// Create a new builder for the pattern given. + /// + /// The pattern is not compiled until `build` is called. + pub fn new(glob: &'a str) -> GlobBuilder<'a> { + GlobBuilder { + glob: glob, + opts: GlobOptions::default(), + } + } + + /// Parses and builds the pattern. + pub fn build(&self) -> Result { + let mut p = Parser { + glob: &self.glob, + stack: vec![Tokens::default()], + chars: self.glob.chars().peekable(), + prev: None, + cur: None, + opts: &self.opts, + }; + p.parse()?; + if p.stack.is_empty() { + Err(Error { + glob: Some(self.glob.to_string()), + kind: ErrorKind::UnopenedAlternates, + }) + } else if p.stack.len() > 1 { + Err(Error { + glob: Some(self.glob.to_string()), + kind: ErrorKind::UnclosedAlternates, + }) + } else { + let tokens = p.stack.pop().unwrap(); + Ok(Glob { + glob: self.glob.to_string(), + re: tokens.to_regex_with(&self.opts), + opts: self.opts, + tokens: tokens, + }) + } + } + + /// Toggle whether the pattern matches case insensitively or not. + /// + /// This is disabled by default. + pub fn case_insensitive(&mut self, yes: bool) -> &mut GlobBuilder<'a> { + self.opts.case_insensitive = yes; + self + } + + /// Toggle whether a literal `/` is required to match a path separator. + pub fn literal_separator(&mut self, yes: bool) -> &mut GlobBuilder<'a> { + self.opts.literal_separator = yes; + self + } + + /// When enabled, a back slash (`\`) may be used to escape + /// special characters in a glob pattern. Additionally, this will + /// prevent `\` from being interpreted as a path separator on all + /// platforms. + /// + /// This is enabled by default on platforms where `\` is not a + /// path separator and disabled by default on platforms where `\` + /// is a path separator. + pub fn backslash_escape(&mut self, yes: bool) -> &mut GlobBuilder<'a> { + self.opts.backslash_escape = yes; + self + } +} + +impl Tokens { + /// Convert this pattern to a string that is guaranteed to be a valid + /// regular expression and will represent the matching semantics of this + /// glob pattern and the options given. + fn to_regex_with(&self, options: &GlobOptions) -> String { + let mut re = String::new(); + re.push_str("(?-u)"); + if options.case_insensitive { + re.push_str("(?i)"); + } + re.push('^'); + // Special case. If the entire glob is just `**`, then it should match + // everything. + if self.len() == 1 && self[0] == Token::RecursivePrefix { + re.push_str(".*"); + re.push('$'); + return re; + } + self.tokens_to_regex(options, &self, &mut re); + re.push('$'); + re + } + + fn tokens_to_regex( + &self, + options: &GlobOptions, + tokens: &[Token], + re: &mut String, + ) { + for tok in tokens { + match *tok { + Token::Literal(c) => { + re.push_str(&char_to_escaped_literal(c)); + } + Token::Any => { + if options.literal_separator { + re.push_str("[^/]"); + } else { + re.push_str("."); + } + } + Token::ZeroOrMore => { + if options.literal_separator { + re.push_str("[^/]*"); + } else { + re.push_str(".*"); + } + } + Token::RecursivePrefix => { + re.push_str("(?:/?|.*/)"); + } + Token::RecursiveSuffix => { + re.push_str("(?:/?|/.*)"); + } + Token::RecursiveZeroOrMore => { + re.push_str("(?:/|/.*/)"); + } + Token::Class { negated, ref ranges } => { + re.push('['); + if negated { + re.push('^'); + } + for r in ranges { + if r.0 == r.1 { + // Not strictly necessary, but nicer to look at. + re.push_str(&char_to_escaped_literal(r.0)); + } else { + re.push_str(&char_to_escaped_literal(r.0)); + re.push('-'); + re.push_str(&char_to_escaped_literal(r.1)); + } + } + re.push(']'); + } + Token::Alternates(ref patterns) => { + let mut parts = vec![]; + for pat in patterns { + let mut altre = String::new(); + self.tokens_to_regex(options, &pat, &mut altre); + if !altre.is_empty() { + parts.push(altre); + } + } + + // It is possible to have an empty set in which case the + // resulting alternation '()' would be an error. + if !parts.is_empty() { + re.push('('); + re.push_str(&parts.join("|")); + re.push(')'); + } + } + } + } + } +} + +/// Convert a Unicode scalar value to an escaped string suitable for use as +/// a literal in a non-Unicode regex. +fn char_to_escaped_literal(c: char) -> String { + bytes_to_escaped_literal(&c.to_string().into_bytes()) +} + +/// Converts an arbitrary sequence of bytes to a UTF-8 string. All non-ASCII +/// code units are converted to their escaped form. +fn bytes_to_escaped_literal(bs: &[u8]) -> String { + let mut s = String::with_capacity(bs.len()); + for &b in bs { + if b <= 0x7F { + s.push_str(®ex::escape(&(b as char).to_string())); + } else { + s.push_str(&format!("\\x{:02x}", b)); + } + } + s +} + +struct Parser<'a> { + glob: &'a str, + stack: Vec, + chars: iter::Peekable>, + prev: Option, + cur: Option, + opts: &'a GlobOptions, +} + +impl<'a> Parser<'a> { + fn error(&self, kind: ErrorKind) -> Error { + Error { glob: Some(self.glob.to_string()), kind: kind } + } + + fn parse(&mut self) -> Result<(), Error> { + while let Some(c) = self.bump() { + match c { + '?' => self.push_token(Token::Any)?, + '*' => self.parse_star()?, + '[' => self.parse_class()?, + '{' => self.push_alternate()?, + '}' => self.pop_alternate()?, + ',' => self.parse_comma()?, + '\\' => self.parse_backslash()?, + c => self.push_token(Token::Literal(c))?, + } + } + Ok(()) + } + + fn push_alternate(&mut self) -> Result<(), Error> { + if self.stack.len() > 1 { + return Err(self.error(ErrorKind::NestedAlternates)); + } + Ok(self.stack.push(Tokens::default())) + } + + fn pop_alternate(&mut self) -> Result<(), Error> { + let mut alts = vec![]; + while self.stack.len() >= 2 { + alts.push(self.stack.pop().unwrap()); + } + self.push_token(Token::Alternates(alts)) + } + + fn push_token(&mut self, tok: Token) -> Result<(), Error> { + if let Some(ref mut pat) = self.stack.last_mut() { + return Ok(pat.push(tok)); + } + Err(self.error(ErrorKind::UnopenedAlternates)) + } + + fn pop_token(&mut self) -> Result { + if let Some(ref mut pat) = self.stack.last_mut() { + return Ok(pat.pop().unwrap()); + } + Err(self.error(ErrorKind::UnopenedAlternates)) + } + + fn have_tokens(&self) -> Result { + match self.stack.last() { + None => Err(self.error(ErrorKind::UnopenedAlternates)), + Some(ref pat) => Ok(!pat.is_empty()), + } + } + + fn parse_comma(&mut self) -> Result<(), Error> { + // If we aren't inside a group alternation, then don't + // treat commas specially. Otherwise, we need to start + // a new alternate. + if self.stack.len() <= 1 { + self.push_token(Token::Literal(',')) + } else { + Ok(self.stack.push(Tokens::default())) + } + } + + fn parse_backslash(&mut self) -> Result<(), Error> { + if self.opts.backslash_escape { + match self.bump() { + None => Err(self.error(ErrorKind::DanglingEscape)), + Some(c) => self.push_token(Token::Literal(c)), + } + } else if is_separator('\\') { + // Normalize all patterns to use / as a separator. + self.push_token(Token::Literal('/')) + } else { + self.push_token(Token::Literal('\\')) + } + } + + fn parse_star(&mut self) -> Result<(), Error> { + let prev = self.prev; + if self.peek() != Some('*') { + self.push_token(Token::ZeroOrMore)?; + return Ok(()); + } + assert!(self.bump() == Some('*')); + if !self.have_tokens()? { + if !self.peek().map_or(true, is_separator) { + self.push_token(Token::ZeroOrMore)?; + self.push_token(Token::ZeroOrMore)?; + } else { + self.push_token(Token::RecursivePrefix)?; + assert!(self.bump().map_or(true, is_separator)); + } + return Ok(()); + } + + if !prev.map(is_separator).unwrap_or(false) { + if self.stack.len() <= 1 + || (prev != Some(',') && prev != Some('{')) + { + self.push_token(Token::ZeroOrMore)?; + self.push_token(Token::ZeroOrMore)?; + return Ok(()); + } + } + let is_suffix = + match self.peek() { + None => { + assert!(self.bump().is_none()); + true + } + Some(',') | Some('}') if self.stack.len() >= 2 => { + true + } + Some(c) if is_separator(c) => { + assert!(self.bump().map(is_separator).unwrap_or(false)); + false + } + _ => { + self.push_token(Token::ZeroOrMore)?; + self.push_token(Token::ZeroOrMore)?; + return Ok(()); + } + }; + match self.pop_token()? { + Token::RecursivePrefix => { + self.push_token(Token::RecursivePrefix)?; + } + Token::RecursiveSuffix => { + self.push_token(Token::RecursiveSuffix)?; + } + _ => { + if is_suffix { + self.push_token(Token::RecursiveSuffix)?; + } else { + self.push_token(Token::RecursiveZeroOrMore)?; + } + } + } + Ok(()) + } + + fn parse_class(&mut self) -> Result<(), Error> { + fn add_to_last_range( + glob: &str, + r: &mut (char, char), + add: char, + ) -> Result<(), Error> { + r.1 = add; + if r.1 < r.0 { + Err(Error { + glob: Some(glob.to_string()), + kind: ErrorKind::InvalidRange(r.0, r.1), + }) + } else { + Ok(()) + } + } + let mut ranges = vec![]; + let negated = match self.chars.peek() { + Some(&'!') | Some(&'^') => { + let bump = self.bump(); + assert!(bump == Some('!') || bump == Some('^')); + true + } + _ => false, + }; + let mut first = true; + let mut in_range = false; + loop { + let c = match self.bump() { + Some(c) => c, + // The only way to successfully break this loop is to observe + // a ']'. + None => return Err(self.error(ErrorKind::UnclosedClass)), + }; + match c { + ']' => { + if first { + ranges.push((']', ']')); + } else { + break; + } + } + '-' => { + if first { + ranges.push(('-', '-')); + } else if in_range { + // invariant: in_range is only set when there is + // already at least one character seen. + let r = ranges.last_mut().unwrap(); + add_to_last_range(&self.glob, r, '-')?; + in_range = false; + } else { + assert!(!ranges.is_empty()); + in_range = true; + } + } + c => { + if in_range { + // invariant: in_range is only set when there is + // already at least one character seen. + add_to_last_range( + &self.glob, ranges.last_mut().unwrap(), c)?; + } else { + ranges.push((c, c)); + } + in_range = false; + } + } + first = false; + } + if in_range { + // Means that the last character in the class was a '-', so add + // it as a literal. + ranges.push(('-', '-')); + } + self.push_token(Token::Class { + negated: negated, + ranges: ranges, + }) + } + + fn bump(&mut self) -> Option { + self.prev = self.cur; + self.cur = self.chars.next(); + self.cur + } + + fn peek(&mut self) -> Option { + self.chars.peek().map(|&ch| ch) + } +} + +#[cfg(test)] +fn starts_with(needle: &[u8], haystack: &[u8]) -> bool { + needle.len() <= haystack.len() && needle == &haystack[..needle.len()] +} + +#[cfg(test)] +fn ends_with(needle: &[u8], haystack: &[u8]) -> bool { + if needle.len() > haystack.len() { + return false; + } + needle == &haystack[haystack.len() - needle.len()..] +} + +#[cfg(test)] +mod tests { + use {GlobSetBuilder, ErrorKind}; + use super::{Glob, GlobBuilder, Token}; + use super::Token::*; + + #[derive(Clone, Copy, Debug, Default)] + struct Options { + casei: Option, + litsep: Option, + bsesc: Option, + } + + macro_rules! syntax { + ($name:ident, $pat:expr, $tokens:expr) => { + #[test] + fn $name() { + let pat = Glob::new($pat).unwrap(); + assert_eq!($tokens, pat.tokens.0); + } + } + } + + macro_rules! syntaxerr { + ($name:ident, $pat:expr, $err:expr) => { + #[test] + fn $name() { + let err = Glob::new($pat).unwrap_err(); + assert_eq!(&$err, err.kind()); + } + } + } + + macro_rules! toregex { + ($name:ident, $pat:expr, $re:expr) => { + toregex!($name, $pat, $re, Options::default()); + }; + ($name:ident, $pat:expr, $re:expr, $options:expr) => { + #[test] + fn $name() { + let mut builder = GlobBuilder::new($pat); + if let Some(casei) = $options.casei { + builder.case_insensitive(casei); + } + if let Some(litsep) = $options.litsep { + builder.literal_separator(litsep); + } + if let Some(bsesc) = $options.bsesc { + builder.backslash_escape(bsesc); + } + let pat = builder.build().unwrap(); + assert_eq!(format!("(?-u){}", $re), pat.regex()); + } + }; + } + + macro_rules! matches { + ($name:ident, $pat:expr, $path:expr) => { + matches!($name, $pat, $path, Options::default()); + }; + ($name:ident, $pat:expr, $path:expr, $options:expr) => { + #[test] + fn $name() { + let mut builder = GlobBuilder::new($pat); + if let Some(casei) = $options.casei { + builder.case_insensitive(casei); + } + if let Some(litsep) = $options.litsep { + builder.literal_separator(litsep); + } + if let Some(bsesc) = $options.bsesc { + builder.backslash_escape(bsesc); + } + let pat = builder.build().unwrap(); + let matcher = pat.compile_matcher(); + let strategic = pat.compile_strategic_matcher(); + let set = GlobSetBuilder::new().add(pat).build().unwrap(); + assert!(matcher.is_match($path)); + assert!(strategic.is_match($path)); + assert!(set.is_match($path)); + } + }; + } + + macro_rules! nmatches { + ($name:ident, $pat:expr, $path:expr) => { + nmatches!($name, $pat, $path, Options::default()); + }; + ($name:ident, $pat:expr, $path:expr, $options:expr) => { + #[test] + fn $name() { + let mut builder = GlobBuilder::new($pat); + if let Some(casei) = $options.casei { + builder.case_insensitive(casei); + } + if let Some(litsep) = $options.litsep { + builder.literal_separator(litsep); + } + if let Some(bsesc) = $options.bsesc { + builder.backslash_escape(bsesc); + } + let pat = builder.build().unwrap(); + let matcher = pat.compile_matcher(); + let strategic = pat.compile_strategic_matcher(); + let set = GlobSetBuilder::new().add(pat).build().unwrap(); + assert!(!matcher.is_match($path)); + assert!(!strategic.is_match($path)); + assert!(!set.is_match($path)); + } + }; + } + + fn s(string: &str) -> String { string.to_string() } + + fn class(s: char, e: char) -> Token { + Class { negated: false, ranges: vec![(s, e)] } + } + + fn classn(s: char, e: char) -> Token { + Class { negated: true, ranges: vec![(s, e)] } + } + + fn rclass(ranges: &[(char, char)]) -> Token { + Class { negated: false, ranges: ranges.to_vec() } + } + + fn rclassn(ranges: &[(char, char)]) -> Token { + Class { negated: true, ranges: ranges.to_vec() } + } + + syntax!(literal1, "a", vec![Literal('a')]); + syntax!(literal2, "ab", vec![Literal('a'), Literal('b')]); + syntax!(any1, "?", vec![Any]); + syntax!(any2, "a?b", vec![Literal('a'), Any, Literal('b')]); + syntax!(seq1, "*", vec![ZeroOrMore]); + syntax!(seq2, "a*b", vec![Literal('a'), ZeroOrMore, Literal('b')]); + syntax!(seq3, "*a*b*", vec![ + ZeroOrMore, Literal('a'), ZeroOrMore, Literal('b'), ZeroOrMore, + ]); + syntax!(rseq1, "**", vec![RecursivePrefix]); + syntax!(rseq2, "**/", vec![RecursivePrefix]); + syntax!(rseq3, "/**", vec![RecursiveSuffix]); + syntax!(rseq4, "/**/", vec![RecursiveZeroOrMore]); + syntax!(rseq5, "a/**/b", vec![ + Literal('a'), RecursiveZeroOrMore, Literal('b'), + ]); + syntax!(cls1, "[a]", vec![class('a', 'a')]); + syntax!(cls2, "[!a]", vec![classn('a', 'a')]); + syntax!(cls3, "[a-z]", vec![class('a', 'z')]); + syntax!(cls4, "[!a-z]", vec![classn('a', 'z')]); + syntax!(cls5, "[-]", vec![class('-', '-')]); + syntax!(cls6, "[]]", vec![class(']', ']')]); + syntax!(cls7, "[*]", vec![class('*', '*')]); + syntax!(cls8, "[!!]", vec![classn('!', '!')]); + syntax!(cls9, "[a-]", vec![rclass(&[('a', 'a'), ('-', '-')])]); + syntax!(cls10, "[-a-z]", vec![rclass(&[('-', '-'), ('a', 'z')])]); + syntax!(cls11, "[a-z-]", vec![rclass(&[('a', 'z'), ('-', '-')])]); + syntax!(cls12, "[-a-z-]", vec![ + rclass(&[('-', '-'), ('a', 'z'), ('-', '-')]), + ]); + syntax!(cls13, "[]-z]", vec![class(']', 'z')]); + syntax!(cls14, "[--z]", vec![class('-', 'z')]); + syntax!(cls15, "[ --]", vec![class(' ', '-')]); + syntax!(cls16, "[0-9a-z]", vec![rclass(&[('0', '9'), ('a', 'z')])]); + syntax!(cls17, "[a-z0-9]", vec![rclass(&[('a', 'z'), ('0', '9')])]); + syntax!(cls18, "[!0-9a-z]", vec![rclassn(&[('0', '9'), ('a', 'z')])]); + syntax!(cls19, "[!a-z0-9]", vec![rclassn(&[('a', 'z'), ('0', '9')])]); + syntax!(cls20, "[^a]", vec![classn('a', 'a')]); + syntax!(cls21, "[^a-z]", vec![classn('a', 'z')]); + + syntaxerr!(err_unclosed1, "[", ErrorKind::UnclosedClass); + syntaxerr!(err_unclosed2, "[]", ErrorKind::UnclosedClass); + syntaxerr!(err_unclosed3, "[!", ErrorKind::UnclosedClass); + syntaxerr!(err_unclosed4, "[!]", ErrorKind::UnclosedClass); + syntaxerr!(err_range1, "[z-a]", ErrorKind::InvalidRange('z', 'a')); + syntaxerr!(err_range2, "[z--]", ErrorKind::InvalidRange('z', '-')); + + const CASEI: Options = Options { + casei: Some(true), + litsep: None, + bsesc: None, + }; + const SLASHLIT: Options = Options { + casei: None, + litsep: Some(true), + bsesc: None, + }; + const NOBSESC: Options = Options { + casei: None, + litsep: None, + bsesc: Some(false), + }; + const BSESC: Options = Options { + casei: None, + litsep: None, + bsesc: Some(true), + }; + + toregex!(re_casei, "a", "(?i)^a$", &CASEI); + + toregex!(re_slash1, "?", r"^[^/]$", SLASHLIT); + toregex!(re_slash2, "*", r"^[^/]*$", SLASHLIT); + + toregex!(re1, "a", "^a$"); + toregex!(re2, "?", "^.$"); + toregex!(re3, "*", "^.*$"); + toregex!(re4, "a?", "^a.$"); + toregex!(re5, "?a", "^.a$"); + toregex!(re6, "a*", "^a.*$"); + toregex!(re7, "*a", "^.*a$"); + toregex!(re8, "[*]", r"^[\*]$"); + toregex!(re9, "[+]", r"^[\+]$"); + toregex!(re10, "+", r"^\+$"); + toregex!(re11, "☃", r"^\xe2\x98\x83$"); + toregex!(re12, "**", r"^.*$"); + toregex!(re13, "**/", r"^.*$"); + toregex!(re14, "**/*", r"^(?:/?|.*/).*$"); + toregex!(re15, "**/**", r"^.*$"); + toregex!(re16, "**/**/*", r"^(?:/?|.*/).*$"); + toregex!(re17, "**/**/**", r"^.*$"); + toregex!(re18, "**/**/**/*", r"^(?:/?|.*/).*$"); + toregex!(re19, "a/**", r"^a(?:/?|/.*)$"); + toregex!(re20, "a/**/**", r"^a(?:/?|/.*)$"); + toregex!(re21, "a/**/**/**", r"^a(?:/?|/.*)$"); + toregex!(re22, "a/**/b", r"^a(?:/|/.*/)b$"); + toregex!(re23, "a/**/**/b", r"^a(?:/|/.*/)b$"); + toregex!(re24, "a/**/**/**/b", r"^a(?:/|/.*/)b$"); + toregex!(re25, "**/b", r"^(?:/?|.*/)b$"); + toregex!(re26, "**/**/b", r"^(?:/?|.*/)b$"); + toregex!(re27, "**/**/**/b", r"^(?:/?|.*/)b$"); + toregex!(re28, "a**", r"^a.*.*$"); + toregex!(re29, "**a", r"^.*.*a$"); + toregex!(re30, "a**b", r"^a.*.*b$"); + toregex!(re31, "***", r"^.*.*.*$"); + toregex!(re32, "/a**", r"^/a.*.*$"); + toregex!(re33, "/**a", r"^/.*.*a$"); + toregex!(re34, "/a**b", r"^/a.*.*b$"); + + matches!(match1, "a", "a"); + matches!(match2, "a*b", "a_b"); + matches!(match3, "a*b*c", "abc"); + matches!(match4, "a*b*c", "a_b_c"); + matches!(match5, "a*b*c", "a___b___c"); + matches!(match6, "abc*abc*abc", "abcabcabcabcabcabcabc"); + matches!(match7, "a*a*a*a*a*a*a*a*a", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + matches!(match8, "a*b[xyz]c*d", "abxcdbxcddd"); + matches!(match9, "*.rs", ".rs"); + matches!(match10, "☃", "☃"); + + matches!(matchrec1, "some/**/needle.txt", "some/needle.txt"); + matches!(matchrec2, "some/**/needle.txt", "some/one/needle.txt"); + matches!(matchrec3, "some/**/needle.txt", "some/one/two/needle.txt"); + matches!(matchrec4, "some/**/needle.txt", "some/other/needle.txt"); + matches!(matchrec5, "**", "abcde"); + matches!(matchrec6, "**", ""); + matches!(matchrec7, "**", ".asdf"); + matches!(matchrec8, "**", "/x/.asdf"); + matches!(matchrec9, "some/**/**/needle.txt", "some/needle.txt"); + matches!(matchrec10, "some/**/**/needle.txt", "some/one/needle.txt"); + matches!(matchrec11, "some/**/**/needle.txt", "some/one/two/needle.txt"); + matches!(matchrec12, "some/**/**/needle.txt", "some/other/needle.txt"); + matches!(matchrec13, "**/test", "one/two/test"); + matches!(matchrec14, "**/test", "one/test"); + matches!(matchrec15, "**/test", "test"); + matches!(matchrec16, "/**/test", "/one/two/test"); + matches!(matchrec17, "/**/test", "/one/test"); + matches!(matchrec18, "/**/test", "/test"); + matches!(matchrec19, "**/.*", ".abc"); + matches!(matchrec20, "**/.*", "abc/.abc"); + matches!(matchrec21, ".*/**", ".abc"); + matches!(matchrec22, ".*/**", ".abc/abc"); + matches!(matchrec23, "foo/**", "foo"); + matches!(matchrec24, "**/foo/bar", "foo/bar"); + matches!(matchrec25, "some/*/needle.txt", "some/one/needle.txt"); + + matches!(matchrange1, "a[0-9]b", "a0b"); + matches!(matchrange2, "a[0-9]b", "a9b"); + matches!(matchrange3, "a[!0-9]b", "a_b"); + matches!(matchrange4, "[a-z123]", "1"); + matches!(matchrange5, "[1a-z23]", "1"); + matches!(matchrange6, "[123a-z]", "1"); + matches!(matchrange7, "[abc-]", "-"); + matches!(matchrange8, "[-abc]", "-"); + matches!(matchrange9, "[-a-c]", "b"); + matches!(matchrange10, "[a-c-]", "b"); + matches!(matchrange11, "[-]", "-"); + matches!(matchrange12, "a[^0-9]b", "a_b"); + + matches!(matchpat1, "*hello.txt", "hello.txt"); + matches!(matchpat2, "*hello.txt", "gareth_says_hello.txt"); + matches!(matchpat3, "*hello.txt", "some/path/to/hello.txt"); + matches!(matchpat4, "*hello.txt", "some\\path\\to\\hello.txt"); + matches!(matchpat5, "*hello.txt", "/an/absolute/path/to/hello.txt"); + matches!(matchpat6, "*some/path/to/hello.txt", "some/path/to/hello.txt"); + matches!(matchpat7, "*some/path/to/hello.txt", + "a/bigger/some/path/to/hello.txt"); + + matches!(matchescape, "_[[]_[]]_[?]_[*]_!_", "_[_]_?_*_!_"); + + matches!(matchcasei1, "aBcDeFg", "aBcDeFg", CASEI); + matches!(matchcasei2, "aBcDeFg", "abcdefg", CASEI); + matches!(matchcasei3, "aBcDeFg", "ABCDEFG", CASEI); + matches!(matchcasei4, "aBcDeFg", "AbCdEfG", CASEI); + + matches!(matchalt1, "a,b", "a,b"); + matches!(matchalt2, ",", ","); + matches!(matchalt3, "{a,b}", "a"); + matches!(matchalt4, "{a,b}", "b"); + matches!(matchalt5, "{**/src/**,foo}", "abc/src/bar"); + matches!(matchalt6, "{**/src/**,foo}", "foo"); + matches!(matchalt7, "{[}],foo}", "}"); + matches!(matchalt8, "{foo}", "foo"); + matches!(matchalt9, "{}", ""); + matches!(matchalt10, "{,}", ""); + matches!(matchalt11, "{*.foo,*.bar,*.wat}", "test.foo"); + matches!(matchalt12, "{*.foo,*.bar,*.wat}", "test.bar"); + matches!(matchalt13, "{*.foo,*.bar,*.wat}", "test.wat"); + + matches!(matchslash1, "abc/def", "abc/def", SLASHLIT); + #[cfg(unix)] + nmatches!(matchslash2, "abc?def", "abc/def", SLASHLIT); + #[cfg(not(unix))] + nmatches!(matchslash2, "abc?def", "abc\\def", SLASHLIT); + nmatches!(matchslash3, "abc*def", "abc/def", SLASHLIT); + matches!(matchslash4, "abc[/]def", "abc/def", SLASHLIT); // differs + #[cfg(unix)] + nmatches!(matchslash5, "abc\\def", "abc/def", SLASHLIT); + #[cfg(not(unix))] + matches!(matchslash5, "abc\\def", "abc/def", SLASHLIT); + + matches!(matchbackslash1, "\\[", "[", BSESC); + matches!(matchbackslash2, "\\?", "?", BSESC); + matches!(matchbackslash3, "\\*", "*", BSESC); + matches!(matchbackslash4, "\\[a-z]", "\\a", NOBSESC); + matches!(matchbackslash5, "\\?", "\\a", NOBSESC); + matches!(matchbackslash6, "\\*", "\\\\", NOBSESC); + #[cfg(unix)] + matches!(matchbackslash7, "\\a", "a"); + #[cfg(not(unix))] + matches!(matchbackslash8, "\\a", "/a"); + + nmatches!(matchnot1, "a*b*c", "abcd"); + nmatches!(matchnot2, "abc*abc*abc", "abcabcabcabcabcabcabca"); + nmatches!(matchnot3, "some/**/needle.txt", "some/other/notthis.txt"); + nmatches!(matchnot4, "some/**/**/needle.txt", "some/other/notthis.txt"); + nmatches!(matchnot5, "/**/test", "test"); + nmatches!(matchnot6, "/**/test", "/one/notthis"); + nmatches!(matchnot7, "/**/test", "/notthis"); + nmatches!(matchnot8, "**/.*", "ab.c"); + nmatches!(matchnot9, "**/.*", "abc/ab.c"); + nmatches!(matchnot10, ".*/**", "a.bc"); + nmatches!(matchnot11, ".*/**", "abc/a.bc"); + nmatches!(matchnot12, "a[0-9]b", "a_b"); + nmatches!(matchnot13, "a[!0-9]b", "a0b"); + nmatches!(matchnot14, "a[!0-9]b", "a9b"); + nmatches!(matchnot15, "[!-]", "-"); + nmatches!(matchnot16, "*hello.txt", "hello.txt-and-then-some"); + nmatches!(matchnot17, "*hello.txt", "goodbye.txt"); + nmatches!(matchnot18, "*some/path/to/hello.txt", + "some/path/to/hello.txt-and-then-some"); + nmatches!(matchnot19, "*some/path/to/hello.txt", + "some/other/path/to/hello.txt"); + nmatches!(matchnot20, "a", "foo/a"); + nmatches!(matchnot21, "./foo", "foo"); + nmatches!(matchnot22, "**/foo", "foofoo"); + nmatches!(matchnot23, "**/foo/bar", "foofoo/bar"); + nmatches!(matchnot24, "/*.c", "mozilla-sha1/sha1.c"); + nmatches!(matchnot25, "*.c", "mozilla-sha1/sha1.c", SLASHLIT); + nmatches!(matchnot26, "**/m4/ltoptions.m4", + "csharp/src/packages/repositories.config", SLASHLIT); + nmatches!(matchnot27, "a[^0-9]b", "a0b"); + nmatches!(matchnot28, "a[^0-9]b", "a9b"); + nmatches!(matchnot29, "[^-]", "-"); + nmatches!(matchnot30, "some/*/needle.txt", "some/needle.txt"); + nmatches!( + matchrec31, + "some/*/needle.txt", "some/one/two/needle.txt", SLASHLIT); + nmatches!( + matchrec32, + "some/*/needle.txt", "some/one/two/three/needle.txt", SLASHLIT); + + macro_rules! extract { + ($which:ident, $name:ident, $pat:expr, $expect:expr) => { + extract!($which, $name, $pat, $expect, Options::default()); + }; + ($which:ident, $name:ident, $pat:expr, $expect:expr, $options:expr) => { + #[test] + fn $name() { + let mut builder = GlobBuilder::new($pat); + if let Some(casei) = $options.casei { + builder.case_insensitive(casei); + } + if let Some(litsep) = $options.litsep { + builder.literal_separator(litsep); + } + if let Some(bsesc) = $options.bsesc { + builder.backslash_escape(bsesc); + } + let pat = builder.build().unwrap(); + assert_eq!($expect, pat.$which()); + } + }; + } + + macro_rules! literal { + ($($tt:tt)*) => { extract!(literal, $($tt)*); } + } + + macro_rules! basetokens { + ($($tt:tt)*) => { extract!(basename_tokens, $($tt)*); } + } + + macro_rules! ext { + ($($tt:tt)*) => { extract!(ext, $($tt)*); } + } + + macro_rules! required_ext { + ($($tt:tt)*) => { extract!(required_ext, $($tt)*); } + } + + macro_rules! prefix { + ($($tt:tt)*) => { extract!(prefix, $($tt)*); } + } + + macro_rules! suffix { + ($($tt:tt)*) => { extract!(suffix, $($tt)*); } + } + + macro_rules! baseliteral { + ($($tt:tt)*) => { extract!(basename_literal, $($tt)*); } + } + + literal!(extract_lit1, "foo", Some(s("foo"))); + literal!(extract_lit2, "foo", None, CASEI); + literal!(extract_lit3, "/foo", Some(s("/foo"))); + literal!(extract_lit4, "/foo/", Some(s("/foo/"))); + literal!(extract_lit5, "/foo/bar", Some(s("/foo/bar"))); + literal!(extract_lit6, "*.foo", None); + literal!(extract_lit7, "foo/bar", Some(s("foo/bar"))); + literal!(extract_lit8, "**/foo/bar", None); + + basetokens!(extract_basetoks1, "**/foo", Some(&*vec![ + Literal('f'), Literal('o'), Literal('o'), + ])); + basetokens!(extract_basetoks2, "**/foo", None, CASEI); + basetokens!(extract_basetoks3, "**/foo", Some(&*vec![ + Literal('f'), Literal('o'), Literal('o'), + ]), SLASHLIT); + basetokens!(extract_basetoks4, "*foo", None, SLASHLIT); + basetokens!(extract_basetoks5, "*foo", None); + basetokens!(extract_basetoks6, "**/fo*o", None); + basetokens!(extract_basetoks7, "**/fo*o", Some(&*vec![ + Literal('f'), Literal('o'), ZeroOrMore, Literal('o'), + ]), SLASHLIT); + + ext!(extract_ext1, "**/*.rs", Some(s(".rs"))); + ext!(extract_ext2, "**/*.rs.bak", None); + ext!(extract_ext3, "*.rs", Some(s(".rs"))); + ext!(extract_ext4, "a*.rs", None); + ext!(extract_ext5, "/*.c", None); + ext!(extract_ext6, "*.c", None, SLASHLIT); + ext!(extract_ext7, "*.c", Some(s(".c"))); + + required_ext!(extract_req_ext1, "*.rs", Some(s(".rs"))); + required_ext!(extract_req_ext2, "/foo/bar/*.rs", Some(s(".rs"))); + required_ext!(extract_req_ext3, "/foo/bar/*.rs", Some(s(".rs"))); + required_ext!(extract_req_ext4, "/foo/bar/.rs", Some(s(".rs"))); + required_ext!(extract_req_ext5, ".rs", Some(s(".rs"))); + required_ext!(extract_req_ext6, "./rs", None); + required_ext!(extract_req_ext7, "foo", None); + required_ext!(extract_req_ext8, ".foo/", None); + required_ext!(extract_req_ext9, "foo/", None); + + prefix!(extract_prefix1, "/foo", Some(s("/foo"))); + prefix!(extract_prefix2, "/foo/*", Some(s("/foo/"))); + prefix!(extract_prefix3, "**/foo", None); + prefix!(extract_prefix4, "foo/**", None); + + suffix!(extract_suffix1, "**/foo/bar", Some((s("/foo/bar"), true))); + suffix!(extract_suffix2, "*/foo/bar", Some((s("/foo/bar"), false))); + suffix!(extract_suffix3, "*/foo/bar", None, SLASHLIT); + suffix!(extract_suffix4, "foo/bar", Some((s("foo/bar"), false))); + suffix!(extract_suffix5, "*.foo", Some((s(".foo"), false))); + suffix!(extract_suffix6, "*.foo", None, SLASHLIT); + suffix!(extract_suffix7, "**/*_test", Some((s("_test"), false))); + + baseliteral!(extract_baselit1, "**/foo", Some(s("foo"))); + baseliteral!(extract_baselit2, "foo", None); + baseliteral!(extract_baselit3, "*foo", None); + baseliteral!(extract_baselit4, "*/foo", None); +} diff --git a/vendor/globset/src/lib.rs b/vendor/globset/src/lib.rs new file mode 100644 index 0000000000..6b3ca85c6d --- /dev/null +++ b/vendor/globset/src/lib.rs @@ -0,0 +1,871 @@ +/*! +The globset crate provides cross platform single glob and glob set matching. + +Glob set matching is the process of matching one or more glob patterns against +a single candidate path simultaneously, and returning all of the globs that +matched. For example, given this set of globs: + +```ignore +*.rs +src/lib.rs +src/**/foo.rs +``` + +and a path `src/bar/baz/foo.rs`, then the set would report the first and third +globs as matching. + +# Example: one glob + +This example shows how to match a single glob against a single file path. + +``` +# fn example() -> Result<(), globset::Error> { +use globset::Glob; + +let glob = Glob::new("*.rs")?.compile_matcher(); + +assert!(glob.is_match("foo.rs")); +assert!(glob.is_match("foo/bar.rs")); +assert!(!glob.is_match("Cargo.toml")); +# Ok(()) } example().unwrap(); +``` + +# Example: configuring a glob matcher + +This example shows how to use a `GlobBuilder` to configure aspects of match +semantics. In this example, we prevent wildcards from matching path separators. + +``` +# fn example() -> Result<(), globset::Error> { +use globset::GlobBuilder; + +let glob = GlobBuilder::new("*.rs") + .literal_separator(true).build()?.compile_matcher(); + +assert!(glob.is_match("foo.rs")); +assert!(!glob.is_match("foo/bar.rs")); // no longer matches +assert!(!glob.is_match("Cargo.toml")); +# Ok(()) } example().unwrap(); +``` + +# Example: match multiple globs at once + +This example shows how to match multiple glob patterns at once. + +``` +# fn example() -> Result<(), globset::Error> { +use globset::{Glob, GlobSetBuilder}; + +let mut builder = GlobSetBuilder::new(); +// A GlobBuilder can be used to configure each glob's match semantics +// independently. +builder.add(Glob::new("*.rs")?); +builder.add(Glob::new("src/lib.rs")?); +builder.add(Glob::new("src/**/foo.rs")?); +let set = builder.build()?; + +assert_eq!(set.matches("src/bar/baz/foo.rs"), vec![0, 2]); +# Ok(()) } example().unwrap(); +``` + +# Syntax + +Standard Unix-style glob syntax is supported: + +* `?` matches any single character. (If the `literal_separator` option is + enabled, then `?` can never match a path separator.) +* `*` matches zero or more characters. (If the `literal_separator` option is + enabled, then `*` can never match a path separator.) +* `**` recursively matches directories but are only legal in three situations. + First, if the glob starts with \*\*/, then it matches + all directories. For example, \*\*/foo matches `foo` + and `bar/foo` but not `foo/bar`. Secondly, if the glob ends with + /\*\*, then it matches all sub-entries. For example, + foo/\*\* matches `foo/a` and `foo/a/b`, but not `foo`. + Thirdly, if the glob contains /\*\*/ anywhere within + the pattern, then it matches zero or more directories. Using `**` anywhere + else is illegal (N.B. the glob `**` is allowed and means "match everything"). +* `{a,b}` matches `a` or `b` where `a` and `b` are arbitrary glob patterns. + (N.B. Nesting `{...}` is not currently allowed.) +* `[ab]` matches `a` or `b` where `a` and `b` are characters. Use + `[!ab]` to match any character except for `a` and `b`. +* Metacharacters such as `*` and `?` can be escaped with character class + notation. e.g., `[*]` matches `*`. +* When backslash escapes are enabled, a backslash (`\`) will escape all meta + characters in a glob. If it precedes a non-meta character, then the slash is + ignored. A `\\` will match a literal `\\`. Note that this mode is only + enabled on Unix platforms by default, but can be enabled on any platform + via the `backslash_escape` setting on `Glob`. + +A `GlobBuilder` can be used to prevent wildcards from matching path separators, +or to enable case insensitive matching. +*/ + +#![deny(missing_docs)] + +extern crate aho_corasick; +extern crate bstr; +extern crate fnv; +#[macro_use] +extern crate log; +extern crate regex; + +use std::borrow::Cow; +use std::collections::{BTreeMap, HashMap}; +use std::error::Error as StdError; +use std::fmt; +use std::hash; +use std::path::Path; +use std::str; + +use aho_corasick::AhoCorasick; +use bstr::{B, BStr, BString}; +use regex::bytes::{Regex, RegexBuilder, RegexSet}; + +use pathutil::{file_name, file_name_ext, normalize_path}; +use glob::MatchStrategy; +pub use glob::{Glob, GlobBuilder, GlobMatcher}; + +mod glob; +mod pathutil; + +/// Represents an error that can occur when parsing a glob pattern. +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Error { + /// The original glob provided by the caller. + glob: Option, + /// The kind of error. + kind: ErrorKind, +} + +/// The kind of error that can occur when parsing a glob pattern. +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum ErrorKind { + /// **DEPRECATED**. + /// + /// This error used to occur for consistency with git's glob specification, + /// but the specification now accepts all uses of `**`. When `**` does not + /// appear adjacent to a path separator or at the beginning/end of a glob, + /// it is now treated as two consecutive `*` patterns. As such, this error + /// is no longer used. + InvalidRecursive, + /// Occurs when a character class (e.g., `[abc]`) is not closed. + UnclosedClass, + /// Occurs when a range in a character (e.g., `[a-z]`) is invalid. For + /// example, if the range starts with a lexicographically larger character + /// than it ends with. + InvalidRange(char, char), + /// Occurs when a `}` is found without a matching `{`. + UnopenedAlternates, + /// Occurs when a `{` is found without a matching `}`. + UnclosedAlternates, + /// Occurs when an alternating group is nested inside another alternating + /// group, e.g., `{{a,b},{c,d}}`. + NestedAlternates, + /// Occurs when an unescaped '\' is found at the end of a glob. + DanglingEscape, + /// An error associated with parsing or compiling a regex. + Regex(String), + /// Hints that destructuring should not be exhaustive. + /// + /// This enum may grow additional variants, so this makes sure clients + /// don't count on exhaustive matching. (Otherwise, adding a new variant + /// could break existing code.) + #[doc(hidden)] + __Nonexhaustive, +} + +impl StdError for Error { + fn description(&self) -> &str { + self.kind.description() + } +} + +impl Error { + /// Return the glob that caused this error, if one exists. + pub fn glob(&self) -> Option<&str> { + self.glob.as_ref().map(|s| &**s) + } + + /// Return the kind of this error. + pub fn kind(&self) -> &ErrorKind { + &self.kind + } +} + +impl ErrorKind { + fn description(&self) -> &str { + match *self { + ErrorKind::InvalidRecursive => { + "invalid use of **; must be one path component" + } + ErrorKind::UnclosedClass => { + "unclosed character class; missing ']'" + } + ErrorKind::InvalidRange(_, _) => { + "invalid character range" + } + ErrorKind::UnopenedAlternates => { + "unopened alternate group; missing '{' \ + (maybe escape '}' with '[}]'?)" + } + ErrorKind::UnclosedAlternates => { + "unclosed alternate group; missing '}' \ + (maybe escape '{' with '[{]'?)" + } + ErrorKind::NestedAlternates => { + "nested alternate groups are not allowed" + } + ErrorKind::DanglingEscape => { + "dangling '\\'" + } + ErrorKind::Regex(ref err) => err, + ErrorKind::__Nonexhaustive => unreachable!(), + } + } +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self.glob { + None => self.kind.fmt(f), + Some(ref glob) => { + write!(f, "error parsing glob '{}': {}", glob, self.kind) + } + } + } +} + +impl fmt::Display for ErrorKind { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + ErrorKind::InvalidRecursive + | ErrorKind::UnclosedClass + | ErrorKind::UnopenedAlternates + | ErrorKind::UnclosedAlternates + | ErrorKind::NestedAlternates + | ErrorKind::DanglingEscape + | ErrorKind::Regex(_) => { + write!(f, "{}", self.description()) + } + ErrorKind::InvalidRange(s, e) => { + write!(f, "invalid range; '{}' > '{}'", s, e) + } + ErrorKind::__Nonexhaustive => unreachable!(), + } + } +} + +fn new_regex(pat: &str) -> Result { + RegexBuilder::new(pat) + .dot_matches_new_line(true) + .size_limit(10 * (1 << 20)) + .dfa_size_limit(10 * (1 << 20)) + .build() + .map_err(|err| { + Error { + glob: Some(pat.to_string()), + kind: ErrorKind::Regex(err.to_string()), + } + }) +} + +fn new_regex_set(pats: I) -> Result + where S: AsRef, I: IntoIterator { + RegexSet::new(pats).map_err(|err| { + Error { + glob: None, + kind: ErrorKind::Regex(err.to_string()), + } + }) +} + +type Fnv = hash::BuildHasherDefault; + +/// GlobSet represents a group of globs that can be matched together in a +/// single pass. +#[derive(Clone, Debug)] +pub struct GlobSet { + len: usize, + strats: Vec, +} + +impl GlobSet { + /// Create an empty `GlobSet`. An empty set matches nothing. + #[inline] + pub fn empty() -> GlobSet { + GlobSet { + len: 0, + strats: vec![], + } + } + + /// Returns true if this set is empty, and therefore matches nothing. + #[inline] + pub fn is_empty(&self) -> bool { + self.len == 0 + } + + /// Returns the number of globs in this set. + #[inline] + pub fn len(&self) -> usize { + self.len + } + + /// Returns true if any glob in this set matches the path given. + pub fn is_match>(&self, path: P) -> bool { + self.is_match_candidate(&Candidate::new(path.as_ref())) + } + + /// Returns true if any glob in this set matches the path given. + /// + /// This takes a Candidate as input, which can be used to amortize the + /// cost of preparing a path for matching. + pub fn is_match_candidate(&self, path: &Candidate) -> bool { + if self.is_empty() { + return false; + } + for strat in &self.strats { + if strat.is_match(path) { + return true; + } + } + false + } + + /// Returns the sequence number of every glob pattern that matches the + /// given path. + pub fn matches>(&self, path: P) -> Vec { + self.matches_candidate(&Candidate::new(path.as_ref())) + } + + /// Returns the sequence number of every glob pattern that matches the + /// given path. + /// + /// This takes a Candidate as input, which can be used to amortize the + /// cost of preparing a path for matching. + pub fn matches_candidate(&self, path: &Candidate) -> Vec { + let mut into = vec![]; + if self.is_empty() { + return into; + } + self.matches_candidate_into(path, &mut into); + into + } + + /// Adds the sequence number of every glob pattern that matches the given + /// path to the vec given. + /// + /// `into` is is cleared before matching begins, and contains the set of + /// sequence numbers (in ascending order) after matching ends. If no globs + /// were matched, then `into` will be empty. + pub fn matches_into>( + &self, + path: P, + into: &mut Vec, + ) { + self.matches_candidate_into(&Candidate::new(path.as_ref()), into); + } + + /// Adds the sequence number of every glob pattern that matches the given + /// path to the vec given. + /// + /// `into` is is cleared before matching begins, and contains the set of + /// sequence numbers (in ascending order) after matching ends. If no globs + /// were matched, then `into` will be empty. + /// + /// This takes a Candidate as input, which can be used to amortize the + /// cost of preparing a path for matching. + pub fn matches_candidate_into( + &self, + path: &Candidate, + into: &mut Vec, + ) { + into.clear(); + if self.is_empty() { + return; + } + for strat in &self.strats { + strat.matches_into(path, into); + } + into.sort(); + into.dedup(); + } + + fn new(pats: &[Glob]) -> Result { + if pats.is_empty() { + return Ok(GlobSet { len: 0, strats: vec![] }); + } + let mut lits = LiteralStrategy::new(); + let mut base_lits = BasenameLiteralStrategy::new(); + let mut exts = ExtensionStrategy::new(); + let mut prefixes = MultiStrategyBuilder::new(); + let mut suffixes = MultiStrategyBuilder::new(); + let mut required_exts = RequiredExtensionStrategyBuilder::new(); + let mut regexes = MultiStrategyBuilder::new(); + for (i, p) in pats.iter().enumerate() { + match MatchStrategy::new(p) { + MatchStrategy::Literal(lit) => { + lits.add(i, lit); + } + MatchStrategy::BasenameLiteral(lit) => { + base_lits.add(i, lit); + } + MatchStrategy::Extension(ext) => { + exts.add(i, ext); + } + MatchStrategy::Prefix(prefix) => { + prefixes.add(i, prefix); + } + MatchStrategy::Suffix { suffix, component } => { + if component { + lits.add(i, suffix[1..].to_string()); + } + suffixes.add(i, suffix); + } + MatchStrategy::RequiredExtension(ext) => { + required_exts.add(i, ext, p.regex().to_owned()); + } + MatchStrategy::Regex => { + debug!("glob converted to regex: {:?}", p); + regexes.add(i, p.regex().to_owned()); + } + } + } + debug!("built glob set; {} literals, {} basenames, {} extensions, \ + {} prefixes, {} suffixes, {} required extensions, {} regexes", + lits.0.len(), base_lits.0.len(), exts.0.len(), + prefixes.literals.len(), suffixes.literals.len(), + required_exts.0.len(), regexes.literals.len()); + Ok(GlobSet { + len: pats.len(), + strats: vec![ + GlobSetMatchStrategy::Extension(exts), + GlobSetMatchStrategy::BasenameLiteral(base_lits), + GlobSetMatchStrategy::Literal(lits), + GlobSetMatchStrategy::Suffix(suffixes.suffix()), + GlobSetMatchStrategy::Prefix(prefixes.prefix()), + GlobSetMatchStrategy::RequiredExtension( + required_exts.build()?), + GlobSetMatchStrategy::Regex(regexes.regex_set()?), + ], + }) + } +} + +/// GlobSetBuilder builds a group of patterns that can be used to +/// simultaneously match a file path. +#[derive(Clone, Debug)] +pub struct GlobSetBuilder { + pats: Vec, +} + +impl GlobSetBuilder { + /// Create a new GlobSetBuilder. A GlobSetBuilder can be used to add new + /// patterns. Once all patterns have been added, `build` should be called + /// to produce a `GlobSet`, which can then be used for matching. + pub fn new() -> GlobSetBuilder { + GlobSetBuilder { pats: vec![] } + } + + /// Builds a new matcher from all of the glob patterns added so far. + /// + /// Once a matcher is built, no new patterns can be added to it. + pub fn build(&self) -> Result { + GlobSet::new(&self.pats) + } + + /// Add a new pattern to this set. + pub fn add(&mut self, pat: Glob) -> &mut GlobSetBuilder { + self.pats.push(pat); + self + } +} + +/// A candidate path for matching. +/// +/// All glob matching in this crate operates on `Candidate` values. +/// Constructing candidates has a very small cost associated with it, so +/// callers may find it beneficial to amortize that cost when matching a single +/// path against multiple globs or sets of globs. +#[derive(Clone, Debug)] +pub struct Candidate<'a> { + path: Cow<'a, BStr>, + basename: Cow<'a, BStr>, + ext: Cow<'a, BStr>, +} + +impl<'a> Candidate<'a> { + /// Create a new candidate for matching from the given path. + pub fn new + ?Sized>(path: &'a P) -> Candidate<'a> { + let path = normalize_path(BString::from_path_lossy(path.as_ref())); + let basename = file_name(&path).unwrap_or(Cow::Borrowed(B(""))); + let ext = file_name_ext(&basename).unwrap_or(Cow::Borrowed(B(""))); + Candidate { + path: path, + basename: basename, + ext: ext, + } + } + + fn path_prefix(&self, max: usize) -> &BStr { + if self.path.len() <= max { + &*self.path + } else { + &self.path[..max] + } + } + + fn path_suffix(&self, max: usize) -> &BStr { + if self.path.len() <= max { + &*self.path + } else { + &self.path[self.path.len() - max..] + } + } +} + +#[derive(Clone, Debug)] +enum GlobSetMatchStrategy { + Literal(LiteralStrategy), + BasenameLiteral(BasenameLiteralStrategy), + Extension(ExtensionStrategy), + Prefix(PrefixStrategy), + Suffix(SuffixStrategy), + RequiredExtension(RequiredExtensionStrategy), + Regex(RegexSetStrategy), +} + +impl GlobSetMatchStrategy { + fn is_match(&self, candidate: &Candidate) -> bool { + use self::GlobSetMatchStrategy::*; + match *self { + Literal(ref s) => s.is_match(candidate), + BasenameLiteral(ref s) => s.is_match(candidate), + Extension(ref s) => s.is_match(candidate), + Prefix(ref s) => s.is_match(candidate), + Suffix(ref s) => s.is_match(candidate), + RequiredExtension(ref s) => s.is_match(candidate), + Regex(ref s) => s.is_match(candidate), + } + } + + fn matches_into(&self, candidate: &Candidate, matches: &mut Vec) { + use self::GlobSetMatchStrategy::*; + match *self { + Literal(ref s) => s.matches_into(candidate, matches), + BasenameLiteral(ref s) => s.matches_into(candidate, matches), + Extension(ref s) => s.matches_into(candidate, matches), + Prefix(ref s) => s.matches_into(candidate, matches), + Suffix(ref s) => s.matches_into(candidate, matches), + RequiredExtension(ref s) => s.matches_into(candidate, matches), + Regex(ref s) => s.matches_into(candidate, matches), + } + } +} + +#[derive(Clone, Debug)] +struct LiteralStrategy(BTreeMap, Vec>); + +impl LiteralStrategy { + fn new() -> LiteralStrategy { + LiteralStrategy(BTreeMap::new()) + } + + fn add(&mut self, global_index: usize, lit: String) { + self.0.entry(lit.into_bytes()).or_insert(vec![]).push(global_index); + } + + fn is_match(&self, candidate: &Candidate) -> bool { + self.0.contains_key(candidate.path.as_bytes()) + } + + #[inline(never)] + fn matches_into(&self, candidate: &Candidate, matches: &mut Vec) { + if let Some(hits) = self.0.get(candidate.path.as_bytes()) { + matches.extend(hits); + } + } +} + +#[derive(Clone, Debug)] +struct BasenameLiteralStrategy(BTreeMap, Vec>); + +impl BasenameLiteralStrategy { + fn new() -> BasenameLiteralStrategy { + BasenameLiteralStrategy(BTreeMap::new()) + } + + fn add(&mut self, global_index: usize, lit: String) { + self.0.entry(lit.into_bytes()).or_insert(vec![]).push(global_index); + } + + fn is_match(&self, candidate: &Candidate) -> bool { + if candidate.basename.is_empty() { + return false; + } + self.0.contains_key(candidate.basename.as_bytes()) + } + + #[inline(never)] + fn matches_into(&self, candidate: &Candidate, matches: &mut Vec) { + if candidate.basename.is_empty() { + return; + } + if let Some(hits) = self.0.get(candidate.basename.as_bytes()) { + matches.extend(hits); + } + } +} + +#[derive(Clone, Debug)] +struct ExtensionStrategy(HashMap, Vec, Fnv>); + +impl ExtensionStrategy { + fn new() -> ExtensionStrategy { + ExtensionStrategy(HashMap::with_hasher(Fnv::default())) + } + + fn add(&mut self, global_index: usize, ext: String) { + self.0.entry(ext.into_bytes()).or_insert(vec![]).push(global_index); + } + + fn is_match(&self, candidate: &Candidate) -> bool { + if candidate.ext.is_empty() { + return false; + } + self.0.contains_key(candidate.ext.as_bytes()) + } + + #[inline(never)] + fn matches_into(&self, candidate: &Candidate, matches: &mut Vec) { + if candidate.ext.is_empty() { + return; + } + if let Some(hits) = self.0.get(candidate.ext.as_bytes()) { + matches.extend(hits); + } + } +} + +#[derive(Clone, Debug)] +struct PrefixStrategy { + matcher: AhoCorasick, + map: Vec, + longest: usize, +} + +impl PrefixStrategy { + fn is_match(&self, candidate: &Candidate) -> bool { + let path = candidate.path_prefix(self.longest); + for m in self.matcher.find_overlapping_iter(path) { + if m.start() == 0 { + return true; + } + } + false + } + + fn matches_into(&self, candidate: &Candidate, matches: &mut Vec) { + let path = candidate.path_prefix(self.longest); + for m in self.matcher.find_overlapping_iter(path) { + if m.start() == 0 { + matches.push(self.map[m.pattern()]); + } + } + } +} + +#[derive(Clone, Debug)] +struct SuffixStrategy { + matcher: AhoCorasick, + map: Vec, + longest: usize, +} + +impl SuffixStrategy { + fn is_match(&self, candidate: &Candidate) -> bool { + let path = candidate.path_suffix(self.longest); + for m in self.matcher.find_overlapping_iter(path) { + if m.end() == path.len() { + return true; + } + } + false + } + + fn matches_into(&self, candidate: &Candidate, matches: &mut Vec) { + let path = candidate.path_suffix(self.longest); + for m in self.matcher.find_overlapping_iter(path) { + if m.end() == path.len() { + matches.push(self.map[m.pattern()]); + } + } + } +} + +#[derive(Clone, Debug)] +struct RequiredExtensionStrategy(HashMap, Vec<(usize, Regex)>, Fnv>); + +impl RequiredExtensionStrategy { + fn is_match(&self, candidate: &Candidate) -> bool { + if candidate.ext.is_empty() { + return false; + } + match self.0.get(candidate.ext.as_bytes()) { + None => false, + Some(regexes) => { + for &(_, ref re) in regexes { + if re.is_match(candidate.path.as_bytes()) { + return true; + } + } + false + } + } + } + + #[inline(never)] + fn matches_into(&self, candidate: &Candidate, matches: &mut Vec) { + if candidate.ext.is_empty() { + return; + } + if let Some(regexes) = self.0.get(candidate.ext.as_bytes()) { + for &(global_index, ref re) in regexes { + if re.is_match(candidate.path.as_bytes()) { + matches.push(global_index); + } + } + } + } +} + +#[derive(Clone, Debug)] +struct RegexSetStrategy { + matcher: RegexSet, + map: Vec, +} + +impl RegexSetStrategy { + fn is_match(&self, candidate: &Candidate) -> bool { + self.matcher.is_match(candidate.path.as_bytes()) + } + + fn matches_into(&self, candidate: &Candidate, matches: &mut Vec) { + for i in self.matcher.matches(candidate.path.as_bytes()) { + matches.push(self.map[i]); + } + } +} + +#[derive(Clone, Debug)] +struct MultiStrategyBuilder { + literals: Vec, + map: Vec, + longest: usize, +} + +impl MultiStrategyBuilder { + fn new() -> MultiStrategyBuilder { + MultiStrategyBuilder { + literals: vec![], + map: vec![], + longest: 0, + } + } + + fn add(&mut self, global_index: usize, literal: String) { + if literal.len() > self.longest { + self.longest = literal.len(); + } + self.map.push(global_index); + self.literals.push(literal); + } + + fn prefix(self) -> PrefixStrategy { + PrefixStrategy { + matcher: AhoCorasick::new_auto_configured(&self.literals), + map: self.map, + longest: self.longest, + } + } + + fn suffix(self) -> SuffixStrategy { + SuffixStrategy { + matcher: AhoCorasick::new_auto_configured(&self.literals), + map: self.map, + longest: self.longest, + } + } + + fn regex_set(self) -> Result { + Ok(RegexSetStrategy { + matcher: new_regex_set(self.literals)?, + map: self.map, + }) + } +} + +#[derive(Clone, Debug)] +struct RequiredExtensionStrategyBuilder( + HashMap, Vec<(usize, String)>>, +); + +impl RequiredExtensionStrategyBuilder { + fn new() -> RequiredExtensionStrategyBuilder { + RequiredExtensionStrategyBuilder(HashMap::new()) + } + + fn add(&mut self, global_index: usize, ext: String, regex: String) { + self.0 + .entry(ext.into_bytes()) + .or_insert(vec![]) + .push((global_index, regex)); + } + + fn build(self) -> Result { + let mut exts = HashMap::with_hasher(Fnv::default()); + for (ext, regexes) in self.0.into_iter() { + exts.insert(ext.clone(), vec![]); + for (global_index, regex) in regexes { + let compiled = new_regex(®ex)?; + exts.get_mut(&ext).unwrap().push((global_index, compiled)); + } + } + Ok(RequiredExtensionStrategy(exts)) + } +} + +#[cfg(test)] +mod tests { + use super::GlobSetBuilder; + use glob::Glob; + + #[test] + fn set_works() { + let mut builder = GlobSetBuilder::new(); + builder.add(Glob::new("src/**/*.rs").unwrap()); + builder.add(Glob::new("*.c").unwrap()); + builder.add(Glob::new("src/lib.rs").unwrap()); + let set = builder.build().unwrap(); + + assert!(set.is_match("foo.c")); + assert!(set.is_match("src/foo.c")); + assert!(!set.is_match("foo.rs")); + assert!(!set.is_match("tests/foo.rs")); + assert!(set.is_match("src/foo.rs")); + assert!(set.is_match("src/grep/src/main.rs")); + + let matches = set.matches("src/lib.rs"); + assert_eq!(2, matches.len()); + assert_eq!(0, matches[0]); + assert_eq!(2, matches[1]); + } + + #[test] + fn empty_set_works() { + let set = GlobSetBuilder::new().build().unwrap(); + assert!(!set.is_match("")); + assert!(!set.is_match("a")); + } +} diff --git a/vendor/globset/src/pathutil.rs b/vendor/globset/src/pathutil.rs new file mode 100644 index 0000000000..6c2fb1e99b --- /dev/null +++ b/vendor/globset/src/pathutil.rs @@ -0,0 +1,129 @@ +use std::borrow::Cow; + +use bstr::BStr; + +/// The final component of the path, if it is a normal file. +/// +/// If the path terminates in ., .., or consists solely of a root of prefix, +/// file_name will return None. +pub fn file_name<'a>(path: &Cow<'a, BStr>) -> Option> { + if path.is_empty() { + return None; + } else if path.last() == Some(b'.') { + return None; + } + let last_slash = path.rfind_byte(b'/').map(|i| i + 1).unwrap_or(0); + Some(match *path { + Cow::Borrowed(path) => Cow::Borrowed(&path[last_slash..]), + Cow::Owned(ref path) => { + let mut path = path.clone(); + path.drain_bytes(..last_slash); + Cow::Owned(path) + } + }) +} + +/// Return a file extension given a path's file name. +/// +/// Note that this does NOT match the semantics of std::path::Path::extension. +/// Namely, the extension includes the `.` and matching is otherwise more +/// liberal. Specifically, the extenion is: +/// +/// * None, if the file name given is empty; +/// * None, if there is no embedded `.`; +/// * Otherwise, the portion of the file name starting with the final `.`. +/// +/// e.g., A file name of `.rs` has an extension `.rs`. +/// +/// N.B. This is done to make certain glob match optimizations easier. Namely, +/// a pattern like `*.rs` is obviously trying to match files with a `rs` +/// extension, but it also matches files like `.rs`, which doesn't have an +/// extension according to std::path::Path::extension. +pub fn file_name_ext<'a>(name: &Cow<'a, BStr>) -> Option> { + if name.is_empty() { + return None; + } + let last_dot_at = match name.rfind_byte(b'.') { + None => return None, + Some(i) => i, + }; + Some(match *name { + Cow::Borrowed(name) => Cow::Borrowed(&name[last_dot_at..]), + Cow::Owned(ref name) => { + let mut name = name.clone(); + name.drain_bytes(..last_dot_at); + Cow::Owned(name) + } + }) +} + +/// Normalizes a path to use `/` as a separator everywhere, even on platforms +/// that recognize other characters as separators. +#[cfg(unix)] +pub fn normalize_path(path: Cow) -> Cow { + // UNIX only uses /, so we're good. + path +} + +/// Normalizes a path to use `/` as a separator everywhere, even on platforms +/// that recognize other characters as separators. +#[cfg(not(unix))] +pub fn normalize_path(mut path: Cow) -> Cow { + use std::path::is_separator; + + for i in 0..path.len() { + if path[i] == b'/' || !is_separator(path[i] as char) { + continue; + } + path.to_mut()[i] = b'/'; + } + path +} + +#[cfg(test)] +mod tests { + use std::borrow::Cow; + + use bstr::{B, BString}; + + use super::{file_name_ext, normalize_path}; + + macro_rules! ext { + ($name:ident, $file_name:expr, $ext:expr) => { + #[test] + fn $name() { + let bs = BString::from($file_name); + let got = file_name_ext(&Cow::Owned(bs)); + assert_eq!($ext.map(|s| Cow::Borrowed(B(s))), got); + } + }; + } + + ext!(ext1, "foo.rs", Some(".rs")); + ext!(ext2, ".rs", Some(".rs")); + ext!(ext3, "..rs", Some(".rs")); + ext!(ext4, "", None::<&str>); + ext!(ext5, "foo", None::<&str>); + + macro_rules! normalize { + ($name:ident, $path:expr, $expected:expr) => { + #[test] + fn $name() { + let bs = BString::from_slice($path); + let got = normalize_path(Cow::Owned(bs)); + assert_eq!($expected.to_vec(), got.into_owned()); + } + }; + } + + normalize!(normal1, b"foo", b"foo"); + normalize!(normal2, b"foo/bar", b"foo/bar"); + #[cfg(unix)] + normalize!(normal3, b"foo\\bar", b"foo\\bar"); + #[cfg(not(unix))] + normalize!(normal3, b"foo\\bar", b"foo/bar"); + #[cfg(unix)] + normalize!(normal4, b"foo\\bar/baz", b"foo\\bar/baz"); + #[cfg(not(unix))] + normalize!(normal4, b"foo\\bar/baz", b"foo/bar/baz"); +} diff --git a/vendor/humantime/.cargo-checksum.json b/vendor/humantime-1.3.0/.cargo-checksum.json similarity index 100% rename from vendor/humantime/.cargo-checksum.json rename to vendor/humantime-1.3.0/.cargo-checksum.json diff --git a/vendor/humantime/Cargo.toml b/vendor/humantime-1.3.0/Cargo.toml similarity index 100% rename from vendor/humantime/Cargo.toml rename to vendor/humantime-1.3.0/Cargo.toml diff --git a/vendor/humantime/LICENSE-APACHE b/vendor/humantime-1.3.0/LICENSE-APACHE similarity index 100% rename from vendor/humantime/LICENSE-APACHE rename to vendor/humantime-1.3.0/LICENSE-APACHE diff --git a/vendor/humantime/LICENSE-MIT b/vendor/humantime-1.3.0/LICENSE-MIT similarity index 100% rename from vendor/humantime/LICENSE-MIT rename to vendor/humantime-1.3.0/LICENSE-MIT diff --git a/vendor/humantime/README.md b/vendor/humantime-1.3.0/README.md similarity index 100% rename from vendor/humantime/README.md rename to vendor/humantime-1.3.0/README.md diff --git a/vendor/humantime/benches/datetime_format.rs b/vendor/humantime-1.3.0/benches/datetime_format.rs similarity index 100% rename from vendor/humantime/benches/datetime_format.rs rename to vendor/humantime-1.3.0/benches/datetime_format.rs diff --git a/vendor/humantime/benches/datetime_parse.rs b/vendor/humantime-1.3.0/benches/datetime_parse.rs similarity index 100% rename from vendor/humantime/benches/datetime_parse.rs rename to vendor/humantime-1.3.0/benches/datetime_parse.rs diff --git a/vendor/humantime/bulk.yaml b/vendor/humantime-1.3.0/bulk.yaml similarity index 100% rename from vendor/humantime/bulk.yaml rename to vendor/humantime-1.3.0/bulk.yaml diff --git a/vendor/humantime/src/date.rs b/vendor/humantime-1.3.0/src/date.rs similarity index 100% rename from vendor/humantime/src/date.rs rename to vendor/humantime-1.3.0/src/date.rs diff --git a/vendor/humantime/src/duration.rs b/vendor/humantime-1.3.0/src/duration.rs similarity index 100% rename from vendor/humantime/src/duration.rs rename to vendor/humantime-1.3.0/src/duration.rs diff --git a/vendor/humantime/src/lib.rs b/vendor/humantime-1.3.0/src/lib.rs similarity index 100% rename from vendor/humantime/src/lib.rs rename to vendor/humantime-1.3.0/src/lib.rs diff --git a/vendor/humantime/src/wrapper.rs b/vendor/humantime-1.3.0/src/wrapper.rs similarity index 100% rename from vendor/humantime/src/wrapper.rs rename to vendor/humantime-1.3.0/src/wrapper.rs diff --git a/vendor/humantime/vagga.yaml b/vendor/humantime-1.3.0/vagga.yaml similarity index 100% rename from vendor/humantime/vagga.yaml rename to vendor/humantime-1.3.0/vagga.yaml diff --git a/vendor/idna-0.1.5/.cargo-checksum.json b/vendor/idna-0.1.5/.cargo-checksum.json deleted file mode 100644 index e5132e7fde..0000000000 --- a/vendor/idna-0.1.5/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"54137714de2992a66f028e5a2bbb3345e3f0d8406c62cb98024f8b442739cecd","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","src/IdnaMappingTable.txt":"813a8308aeff8bcb9368751e1fd0ad7cc467130965d53ac860f82c4d0d11523f","src/lib.rs":"a85a09d6816dcbd77e5c0830f28fe8ee42cd8ee616df107e16ae281f5561ad35","src/make_uts46_mapping_table.py":"fd4ff62fc27dc8d15d5b61c3504f5f754aded1c3e16c1179506adff5df766d74","src/punycode.rs":"3b1fa1878572adac0ed2058d642acaecb6fd579a2d9ffc40867169519861ec07","src/uts46.rs":"48e88c64f274c41eec8e42444969deab9b79f9c827e1a0972dac3276ae8d3d12","src/uts46_mapping_table.rs":"9d0b645182592709ea87c6db7ca1c4e1d9b2826b68efd746f764cafcb0545da2","tests/IdnaTest.txt":"921c68e5d3fbb631b26140d232af90040fc4df612857d1894641ded319e52822","tests/punycode.rs":"57854e04949a43ed4b6b263c24d7d6502617a31e439cebb5b1cbd8cbce013dfb","tests/punycode_tests.json":"3d4ac0cf25984c37b9ce197f5df680a0136f728fb8ec82bc76624e42139eb3a8","tests/tests.rs":"590e1b0544a08419ae1816e3df2892bcc9d5fde3d5a69f37ac65567a61a530c0","tests/unit.rs":"d2993b27bc6242f2c0315c66cfc1875187b329980569571adfc17c302d266d3f","tests/uts46.rs":"f40e0d84d44e09d0e35c5b6315da056d7fdd1325187c5c023386dda80e645d36"},"package":"38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"} \ No newline at end of file diff --git a/vendor/idna-0.1.5/Cargo.toml b/vendor/idna-0.1.5/Cargo.toml deleted file mode 100644 index 8e6c0215ed..0000000000 --- a/vendor/idna-0.1.5/Cargo.toml +++ /dev/null @@ -1,43 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies -# -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -name = "idna" -version = "0.1.5" -authors = ["The rust-url developers"] -description = "IDNA (Internationalizing Domain Names in Applications) and Punycode." -license = "MIT/Apache-2.0" -repository = "https://github.com/servo/rust-url/" - -[lib] -test = false -doctest = false - -[[test]] -name = "tests" -harness = false - -[[test]] -name = "unit" -[dependencies.matches] -version = "0.1" - -[dependencies.unicode-bidi] -version = "0.3" - -[dependencies.unicode-normalization] -version = "0.1.5" -[dev-dependencies.rustc-serialize] -version = "0.3" - -[dev-dependencies.rustc-test] -version = "0.3" diff --git a/vendor/idna-0.1.5/LICENSE-MIT b/vendor/idna-0.1.5/LICENSE-MIT deleted file mode 100644 index 24de6b418e..0000000000 --- a/vendor/idna-0.1.5/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2013-2016 The rust-url developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/vendor/idna-0.1.5/src/IdnaMappingTable.txt b/vendor/idna-0.1.5/src/IdnaMappingTable.txt deleted file mode 100644 index 295606447f..0000000000 --- a/vendor/idna-0.1.5/src/IdnaMappingTable.txt +++ /dev/null @@ -1,8405 +0,0 @@ -# IdnaMappingTable-10.0.0.txt -# Date: 2017-02-23, 14:18:32 GMT -# © 2017 Unicode®, Inc. -# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# -# Unicode IDNA Compatible Preprocessing (UTS #46) -# For documentation, see http://www.unicode.org/reports/tr46/ - -0000..002C ; disallowed_STD3_valid # 1.1 ..COMMA -002D..002E ; valid # 1.1 HYPHEN-MINUS..FULL STOP -002F ; disallowed_STD3_valid # 1.1 SOLIDUS -0030..0039 ; valid # 1.1 DIGIT ZERO..DIGIT NINE -003A..0040 ; disallowed_STD3_valid # 1.1 COLON..COMMERCIAL AT -0041 ; mapped ; 0061 # 1.1 LATIN CAPITAL LETTER A -0042 ; mapped ; 0062 # 1.1 LATIN CAPITAL LETTER B -0043 ; mapped ; 0063 # 1.1 LATIN CAPITAL LETTER C -0044 ; mapped ; 0064 # 1.1 LATIN CAPITAL LETTER D -0045 ; mapped ; 0065 # 1.1 LATIN CAPITAL LETTER E -0046 ; mapped ; 0066 # 1.1 LATIN CAPITAL LETTER F -0047 ; mapped ; 0067 # 1.1 LATIN CAPITAL LETTER G -0048 ; mapped ; 0068 # 1.1 LATIN CAPITAL LETTER H -0049 ; mapped ; 0069 # 1.1 LATIN CAPITAL LETTER I -004A ; mapped ; 006A # 1.1 LATIN CAPITAL LETTER J -004B ; mapped ; 006B # 1.1 LATIN CAPITAL LETTER K -004C ; mapped ; 006C # 1.1 LATIN CAPITAL LETTER L -004D ; mapped ; 006D # 1.1 LATIN CAPITAL LETTER M -004E ; mapped ; 006E # 1.1 LATIN CAPITAL LETTER N -004F ; mapped ; 006F # 1.1 LATIN CAPITAL LETTER O -0050 ; mapped ; 0070 # 1.1 LATIN CAPITAL LETTER P -0051 ; mapped ; 0071 # 1.1 LATIN CAPITAL LETTER Q -0052 ; mapped ; 0072 # 1.1 LATIN CAPITAL LETTER R -0053 ; mapped ; 0073 # 1.1 LATIN CAPITAL LETTER S -0054 ; mapped ; 0074 # 1.1 LATIN CAPITAL LETTER T -0055 ; mapped ; 0075 # 1.1 LATIN CAPITAL LETTER U -0056 ; mapped ; 0076 # 1.1 LATIN CAPITAL LETTER V -0057 ; mapped ; 0077 # 1.1 LATIN CAPITAL LETTER W -0058 ; mapped ; 0078 # 1.1 LATIN CAPITAL LETTER X -0059 ; mapped ; 0079 # 1.1 LATIN CAPITAL LETTER Y -005A ; mapped ; 007A # 1.1 LATIN CAPITAL LETTER Z -005B..0060 ; disallowed_STD3_valid # 1.1 LEFT SQUARE BRACKET..GRAVE ACCENT -0061..007A ; valid # 1.1 LATIN SMALL LETTER A..LATIN SMALL LETTER Z -007B..007F ; disallowed_STD3_valid # 1.1 LEFT CURLY BRACKET.. -0080..009F ; disallowed # 1.1 .. -00A0 ; disallowed_STD3_mapped ; 0020 # 1.1 NO-BREAK SPACE -00A1..00A7 ; valid ; ; NV8 # 1.1 INVERTED EXCLAMATION MARK..SECTION SIGN -00A8 ; disallowed_STD3_mapped ; 0020 0308 # 1.1 DIAERESIS -00A9 ; valid ; ; NV8 # 1.1 COPYRIGHT SIGN -00AA ; mapped ; 0061 # 1.1 FEMININE ORDINAL INDICATOR -00AB..00AC ; valid ; ; NV8 # 1.1 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK..NOT SIGN -00AD ; ignored # 1.1 SOFT HYPHEN -00AE ; valid ; ; NV8 # 1.1 REGISTERED SIGN -00AF ; disallowed_STD3_mapped ; 0020 0304 # 1.1 MACRON -00B0..00B1 ; valid ; ; NV8 # 1.1 DEGREE SIGN..PLUS-MINUS SIGN -00B2 ; mapped ; 0032 # 1.1 SUPERSCRIPT TWO -00B3 ; mapped ; 0033 # 1.1 SUPERSCRIPT THREE -00B4 ; disallowed_STD3_mapped ; 0020 0301 # 1.1 ACUTE ACCENT -00B5 ; mapped ; 03BC # 1.1 MICRO SIGN -00B6 ; valid ; ; NV8 # 1.1 PILCROW SIGN -00B7 ; valid # 1.1 MIDDLE DOT -00B8 ; disallowed_STD3_mapped ; 0020 0327 # 1.1 CEDILLA -00B9 ; mapped ; 0031 # 1.1 SUPERSCRIPT ONE -00BA ; mapped ; 006F # 1.1 MASCULINE ORDINAL INDICATOR -00BB ; valid ; ; NV8 # 1.1 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -00BC ; mapped ; 0031 2044 0034 #1.1 VULGAR FRACTION ONE QUARTER -00BD ; mapped ; 0031 2044 0032 #1.1 VULGAR FRACTION ONE HALF -00BE ; mapped ; 0033 2044 0034 #1.1 VULGAR FRACTION THREE QUARTERS -00BF ; valid ; ; NV8 # 1.1 INVERTED QUESTION MARK -00C0 ; mapped ; 00E0 # 1.1 LATIN CAPITAL LETTER A WITH GRAVE -00C1 ; mapped ; 00E1 # 1.1 LATIN CAPITAL LETTER A WITH ACUTE -00C2 ; mapped ; 00E2 # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX -00C3 ; mapped ; 00E3 # 1.1 LATIN CAPITAL LETTER A WITH TILDE -00C4 ; mapped ; 00E4 # 1.1 LATIN CAPITAL LETTER A WITH DIAERESIS -00C5 ; mapped ; 00E5 # 1.1 LATIN CAPITAL LETTER A WITH RING ABOVE -00C6 ; mapped ; 00E6 # 1.1 LATIN CAPITAL LETTER AE -00C7 ; mapped ; 00E7 # 1.1 LATIN CAPITAL LETTER C WITH CEDILLA -00C8 ; mapped ; 00E8 # 1.1 LATIN CAPITAL LETTER E WITH GRAVE -00C9 ; mapped ; 00E9 # 1.1 LATIN CAPITAL LETTER E WITH ACUTE -00CA ; mapped ; 00EA # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX -00CB ; mapped ; 00EB # 1.1 LATIN CAPITAL LETTER E WITH DIAERESIS -00CC ; mapped ; 00EC # 1.1 LATIN CAPITAL LETTER I WITH GRAVE -00CD ; mapped ; 00ED # 1.1 LATIN CAPITAL LETTER I WITH ACUTE -00CE ; mapped ; 00EE # 1.1 LATIN CAPITAL LETTER I WITH CIRCUMFLEX -00CF ; mapped ; 00EF # 1.1 LATIN CAPITAL LETTER I WITH DIAERESIS -00D0 ; mapped ; 00F0 # 1.1 LATIN CAPITAL LETTER ETH -00D1 ; mapped ; 00F1 # 1.1 LATIN CAPITAL LETTER N WITH TILDE -00D2 ; mapped ; 00F2 # 1.1 LATIN CAPITAL LETTER O WITH GRAVE -00D3 ; mapped ; 00F3 # 1.1 LATIN CAPITAL LETTER O WITH ACUTE -00D4 ; mapped ; 00F4 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX -00D5 ; mapped ; 00F5 # 1.1 LATIN CAPITAL LETTER O WITH TILDE -00D6 ; mapped ; 00F6 # 1.1 LATIN CAPITAL LETTER O WITH DIAERESIS -00D7 ; valid ; ; NV8 # 1.1 MULTIPLICATION SIGN -00D8 ; mapped ; 00F8 # 1.1 LATIN CAPITAL LETTER O WITH STROKE -00D9 ; mapped ; 00F9 # 1.1 LATIN CAPITAL LETTER U WITH GRAVE -00DA ; mapped ; 00FA # 1.1 LATIN CAPITAL LETTER U WITH ACUTE -00DB ; mapped ; 00FB # 1.1 LATIN CAPITAL LETTER U WITH CIRCUMFLEX -00DC ; mapped ; 00FC # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS -00DD ; mapped ; 00FD # 1.1 LATIN CAPITAL LETTER Y WITH ACUTE -00DE ; mapped ; 00FE # 1.1 LATIN CAPITAL LETTER THORN -00DF ; deviation ; 0073 0073 # 1.1 LATIN SMALL LETTER SHARP S -00E0..00F6 ; valid # 1.1 LATIN SMALL LETTER A WITH GRAVE..LATIN SMALL LETTER O WITH DIAERESIS -00F7 ; valid ; ; NV8 # 1.1 DIVISION SIGN -00F8..00FF ; valid # 1.1 LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS -0100 ; mapped ; 0101 # 1.1 LATIN CAPITAL LETTER A WITH MACRON -0101 ; valid # 1.1 LATIN SMALL LETTER A WITH MACRON -0102 ; mapped ; 0103 # 1.1 LATIN CAPITAL LETTER A WITH BREVE -0103 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE -0104 ; mapped ; 0105 # 1.1 LATIN CAPITAL LETTER A WITH OGONEK -0105 ; valid # 1.1 LATIN SMALL LETTER A WITH OGONEK -0106 ; mapped ; 0107 # 1.1 LATIN CAPITAL LETTER C WITH ACUTE -0107 ; valid # 1.1 LATIN SMALL LETTER C WITH ACUTE -0108 ; mapped ; 0109 # 1.1 LATIN CAPITAL LETTER C WITH CIRCUMFLEX -0109 ; valid # 1.1 LATIN SMALL LETTER C WITH CIRCUMFLEX -010A ; mapped ; 010B # 1.1 LATIN CAPITAL LETTER C WITH DOT ABOVE -010B ; valid # 1.1 LATIN SMALL LETTER C WITH DOT ABOVE -010C ; mapped ; 010D # 1.1 LATIN CAPITAL LETTER C WITH CARON -010D ; valid # 1.1 LATIN SMALL LETTER C WITH CARON -010E ; mapped ; 010F # 1.1 LATIN CAPITAL LETTER D WITH CARON -010F ; valid # 1.1 LATIN SMALL LETTER D WITH CARON -0110 ; mapped ; 0111 # 1.1 LATIN CAPITAL LETTER D WITH STROKE -0111 ; valid # 1.1 LATIN SMALL LETTER D WITH STROKE -0112 ; mapped ; 0113 # 1.1 LATIN CAPITAL LETTER E WITH MACRON -0113 ; valid # 1.1 LATIN SMALL LETTER E WITH MACRON -0114 ; mapped ; 0115 # 1.1 LATIN CAPITAL LETTER E WITH BREVE -0115 ; valid # 1.1 LATIN SMALL LETTER E WITH BREVE -0116 ; mapped ; 0117 # 1.1 LATIN CAPITAL LETTER E WITH DOT ABOVE -0117 ; valid # 1.1 LATIN SMALL LETTER E WITH DOT ABOVE -0118 ; mapped ; 0119 # 1.1 LATIN CAPITAL LETTER E WITH OGONEK -0119 ; valid # 1.1 LATIN SMALL LETTER E WITH OGONEK -011A ; mapped ; 011B # 1.1 LATIN CAPITAL LETTER E WITH CARON -011B ; valid # 1.1 LATIN SMALL LETTER E WITH CARON -011C ; mapped ; 011D # 1.1 LATIN CAPITAL LETTER G WITH CIRCUMFLEX -011D ; valid # 1.1 LATIN SMALL LETTER G WITH CIRCUMFLEX -011E ; mapped ; 011F # 1.1 LATIN CAPITAL LETTER G WITH BREVE -011F ; valid # 1.1 LATIN SMALL LETTER G WITH BREVE -0120 ; mapped ; 0121 # 1.1 LATIN CAPITAL LETTER G WITH DOT ABOVE -0121 ; valid # 1.1 LATIN SMALL LETTER G WITH DOT ABOVE -0122 ; mapped ; 0123 # 1.1 LATIN CAPITAL LETTER G WITH CEDILLA -0123 ; valid # 1.1 LATIN SMALL LETTER G WITH CEDILLA -0124 ; mapped ; 0125 # 1.1 LATIN CAPITAL LETTER H WITH CIRCUMFLEX -0125 ; valid # 1.1 LATIN SMALL LETTER H WITH CIRCUMFLEX -0126 ; mapped ; 0127 # 1.1 LATIN CAPITAL LETTER H WITH STROKE -0127 ; valid # 1.1 LATIN SMALL LETTER H WITH STROKE -0128 ; mapped ; 0129 # 1.1 LATIN CAPITAL LETTER I WITH TILDE -0129 ; valid # 1.1 LATIN SMALL LETTER I WITH TILDE -012A ; mapped ; 012B # 1.1 LATIN CAPITAL LETTER I WITH MACRON -012B ; valid # 1.1 LATIN SMALL LETTER I WITH MACRON -012C ; mapped ; 012D # 1.1 LATIN CAPITAL LETTER I WITH BREVE -012D ; valid # 1.1 LATIN SMALL LETTER I WITH BREVE -012E ; mapped ; 012F # 1.1 LATIN CAPITAL LETTER I WITH OGONEK -012F ; valid # 1.1 LATIN SMALL LETTER I WITH OGONEK -0130 ; mapped ; 0069 0307 # 1.1 LATIN CAPITAL LETTER I WITH DOT ABOVE -0131 ; valid # 1.1 LATIN SMALL LETTER DOTLESS I -0132..0133 ; mapped ; 0069 006A # 1.1 LATIN CAPITAL LIGATURE IJ..LATIN SMALL LIGATURE IJ -0134 ; mapped ; 0135 # 1.1 LATIN CAPITAL LETTER J WITH CIRCUMFLEX -0135 ; valid # 1.1 LATIN SMALL LETTER J WITH CIRCUMFLEX -0136 ; mapped ; 0137 # 1.1 LATIN CAPITAL LETTER K WITH CEDILLA -0137..0138 ; valid # 1.1 LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA -0139 ; mapped ; 013A # 1.1 LATIN CAPITAL LETTER L WITH ACUTE -013A ; valid # 1.1 LATIN SMALL LETTER L WITH ACUTE -013B ; mapped ; 013C # 1.1 LATIN CAPITAL LETTER L WITH CEDILLA -013C ; valid # 1.1 LATIN SMALL LETTER L WITH CEDILLA -013D ; mapped ; 013E # 1.1 LATIN CAPITAL LETTER L WITH CARON -013E ; valid # 1.1 LATIN SMALL LETTER L WITH CARON -013F..0140 ; mapped ; 006C 00B7 # 1.1 LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH MIDDLE DOT -0141 ; mapped ; 0142 # 1.1 LATIN CAPITAL LETTER L WITH STROKE -0142 ; valid # 1.1 LATIN SMALL LETTER L WITH STROKE -0143 ; mapped ; 0144 # 1.1 LATIN CAPITAL LETTER N WITH ACUTE -0144 ; valid # 1.1 LATIN SMALL LETTER N WITH ACUTE -0145 ; mapped ; 0146 # 1.1 LATIN CAPITAL LETTER N WITH CEDILLA -0146 ; valid # 1.1 LATIN SMALL LETTER N WITH CEDILLA -0147 ; mapped ; 0148 # 1.1 LATIN CAPITAL LETTER N WITH CARON -0148 ; valid # 1.1 LATIN SMALL LETTER N WITH CARON -0149 ; mapped ; 02BC 006E # 1.1 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -014A ; mapped ; 014B # 1.1 LATIN CAPITAL LETTER ENG -014B ; valid # 1.1 LATIN SMALL LETTER ENG -014C ; mapped ; 014D # 1.1 LATIN CAPITAL LETTER O WITH MACRON -014D ; valid # 1.1 LATIN SMALL LETTER O WITH MACRON -014E ; mapped ; 014F # 1.1 LATIN CAPITAL LETTER O WITH BREVE -014F ; valid # 1.1 LATIN SMALL LETTER O WITH BREVE -0150 ; mapped ; 0151 # 1.1 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -0151 ; valid # 1.1 LATIN SMALL LETTER O WITH DOUBLE ACUTE -0152 ; mapped ; 0153 # 1.1 LATIN CAPITAL LIGATURE OE -0153 ; valid # 1.1 LATIN SMALL LIGATURE OE -0154 ; mapped ; 0155 # 1.1 LATIN CAPITAL LETTER R WITH ACUTE -0155 ; valid # 1.1 LATIN SMALL LETTER R WITH ACUTE -0156 ; mapped ; 0157 # 1.1 LATIN CAPITAL LETTER R WITH CEDILLA -0157 ; valid # 1.1 LATIN SMALL LETTER R WITH CEDILLA -0158 ; mapped ; 0159 # 1.1 LATIN CAPITAL LETTER R WITH CARON -0159 ; valid # 1.1 LATIN SMALL LETTER R WITH CARON -015A ; mapped ; 015B # 1.1 LATIN CAPITAL LETTER S WITH ACUTE -015B ; valid # 1.1 LATIN SMALL LETTER S WITH ACUTE -015C ; mapped ; 015D # 1.1 LATIN CAPITAL LETTER S WITH CIRCUMFLEX -015D ; valid # 1.1 LATIN SMALL LETTER S WITH CIRCUMFLEX -015E ; mapped ; 015F # 1.1 LATIN CAPITAL LETTER S WITH CEDILLA -015F ; valid # 1.1 LATIN SMALL LETTER S WITH CEDILLA -0160 ; mapped ; 0161 # 1.1 LATIN CAPITAL LETTER S WITH CARON -0161 ; valid # 1.1 LATIN SMALL LETTER S WITH CARON -0162 ; mapped ; 0163 # 1.1 LATIN CAPITAL LETTER T WITH CEDILLA -0163 ; valid # 1.1 LATIN SMALL LETTER T WITH CEDILLA -0164 ; mapped ; 0165 # 1.1 LATIN CAPITAL LETTER T WITH CARON -0165 ; valid # 1.1 LATIN SMALL LETTER T WITH CARON -0166 ; mapped ; 0167 # 1.1 LATIN CAPITAL LETTER T WITH STROKE -0167 ; valid # 1.1 LATIN SMALL LETTER T WITH STROKE -0168 ; mapped ; 0169 # 1.1 LATIN CAPITAL LETTER U WITH TILDE -0169 ; valid # 1.1 LATIN SMALL LETTER U WITH TILDE -016A ; mapped ; 016B # 1.1 LATIN CAPITAL LETTER U WITH MACRON -016B ; valid # 1.1 LATIN SMALL LETTER U WITH MACRON -016C ; mapped ; 016D # 1.1 LATIN CAPITAL LETTER U WITH BREVE -016D ; valid # 1.1 LATIN SMALL LETTER U WITH BREVE -016E ; mapped ; 016F # 1.1 LATIN CAPITAL LETTER U WITH RING ABOVE -016F ; valid # 1.1 LATIN SMALL LETTER U WITH RING ABOVE -0170 ; mapped ; 0171 # 1.1 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -0171 ; valid # 1.1 LATIN SMALL LETTER U WITH DOUBLE ACUTE -0172 ; mapped ; 0173 # 1.1 LATIN CAPITAL LETTER U WITH OGONEK -0173 ; valid # 1.1 LATIN SMALL LETTER U WITH OGONEK -0174 ; mapped ; 0175 # 1.1 LATIN CAPITAL LETTER W WITH CIRCUMFLEX -0175 ; valid # 1.1 LATIN SMALL LETTER W WITH CIRCUMFLEX -0176 ; mapped ; 0177 # 1.1 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX -0177 ; valid # 1.1 LATIN SMALL LETTER Y WITH CIRCUMFLEX -0178 ; mapped ; 00FF # 1.1 LATIN CAPITAL LETTER Y WITH DIAERESIS -0179 ; mapped ; 017A # 1.1 LATIN CAPITAL LETTER Z WITH ACUTE -017A ; valid # 1.1 LATIN SMALL LETTER Z WITH ACUTE -017B ; mapped ; 017C # 1.1 LATIN CAPITAL LETTER Z WITH DOT ABOVE -017C ; valid # 1.1 LATIN SMALL LETTER Z WITH DOT ABOVE -017D ; mapped ; 017E # 1.1 LATIN CAPITAL LETTER Z WITH CARON -017E ; valid # 1.1 LATIN SMALL LETTER Z WITH CARON -017F ; mapped ; 0073 # 1.1 LATIN SMALL LETTER LONG S -0180 ; valid # 1.1 LATIN SMALL LETTER B WITH STROKE -0181 ; mapped ; 0253 # 1.1 LATIN CAPITAL LETTER B WITH HOOK -0182 ; mapped ; 0183 # 1.1 LATIN CAPITAL LETTER B WITH TOPBAR -0183 ; valid # 1.1 LATIN SMALL LETTER B WITH TOPBAR -0184 ; mapped ; 0185 # 1.1 LATIN CAPITAL LETTER TONE SIX -0185 ; valid # 1.1 LATIN SMALL LETTER TONE SIX -0186 ; mapped ; 0254 # 1.1 LATIN CAPITAL LETTER OPEN O -0187 ; mapped ; 0188 # 1.1 LATIN CAPITAL LETTER C WITH HOOK -0188 ; valid # 1.1 LATIN SMALL LETTER C WITH HOOK -0189 ; mapped ; 0256 # 1.1 LATIN CAPITAL LETTER AFRICAN D -018A ; mapped ; 0257 # 1.1 LATIN CAPITAL LETTER D WITH HOOK -018B ; mapped ; 018C # 1.1 LATIN CAPITAL LETTER D WITH TOPBAR -018C..018D ; valid # 1.1 LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA -018E ; mapped ; 01DD # 1.1 LATIN CAPITAL LETTER REVERSED E -018F ; mapped ; 0259 # 1.1 LATIN CAPITAL LETTER SCHWA -0190 ; mapped ; 025B # 1.1 LATIN CAPITAL LETTER OPEN E -0191 ; mapped ; 0192 # 1.1 LATIN CAPITAL LETTER F WITH HOOK -0192 ; valid # 1.1 LATIN SMALL LETTER F WITH HOOK -0193 ; mapped ; 0260 # 1.1 LATIN CAPITAL LETTER G WITH HOOK -0194 ; mapped ; 0263 # 1.1 LATIN CAPITAL LETTER GAMMA -0195 ; valid # 1.1 LATIN SMALL LETTER HV -0196 ; mapped ; 0269 # 1.1 LATIN CAPITAL LETTER IOTA -0197 ; mapped ; 0268 # 1.1 LATIN CAPITAL LETTER I WITH STROKE -0198 ; mapped ; 0199 # 1.1 LATIN CAPITAL LETTER K WITH HOOK -0199..019B ; valid # 1.1 LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE -019C ; mapped ; 026F # 1.1 LATIN CAPITAL LETTER TURNED M -019D ; mapped ; 0272 # 1.1 LATIN CAPITAL LETTER N WITH LEFT HOOK -019E ; valid # 1.1 LATIN SMALL LETTER N WITH LONG RIGHT LEG -019F ; mapped ; 0275 # 1.1 LATIN CAPITAL LETTER O WITH MIDDLE TILDE -01A0 ; mapped ; 01A1 # 1.1 LATIN CAPITAL LETTER O WITH HORN -01A1 ; valid # 1.1 LATIN SMALL LETTER O WITH HORN -01A2 ; mapped ; 01A3 # 1.1 LATIN CAPITAL LETTER OI -01A3 ; valid # 1.1 LATIN SMALL LETTER OI -01A4 ; mapped ; 01A5 # 1.1 LATIN CAPITAL LETTER P WITH HOOK -01A5 ; valid # 1.1 LATIN SMALL LETTER P WITH HOOK -01A6 ; mapped ; 0280 # 1.1 LATIN LETTER YR -01A7 ; mapped ; 01A8 # 1.1 LATIN CAPITAL LETTER TONE TWO -01A8 ; valid # 1.1 LATIN SMALL LETTER TONE TWO -01A9 ; mapped ; 0283 # 1.1 LATIN CAPITAL LETTER ESH -01AA..01AB ; valid # 1.1 LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK -01AC ; mapped ; 01AD # 1.1 LATIN CAPITAL LETTER T WITH HOOK -01AD ; valid # 1.1 LATIN SMALL LETTER T WITH HOOK -01AE ; mapped ; 0288 # 1.1 LATIN CAPITAL LETTER T WITH RETROFLEX HOOK -01AF ; mapped ; 01B0 # 1.1 LATIN CAPITAL LETTER U WITH HORN -01B0 ; valid # 1.1 LATIN SMALL LETTER U WITH HORN -01B1 ; mapped ; 028A # 1.1 LATIN CAPITAL LETTER UPSILON -01B2 ; mapped ; 028B # 1.1 LATIN CAPITAL LETTER V WITH HOOK -01B3 ; mapped ; 01B4 # 1.1 LATIN CAPITAL LETTER Y WITH HOOK -01B4 ; valid # 1.1 LATIN SMALL LETTER Y WITH HOOK -01B5 ; mapped ; 01B6 # 1.1 LATIN CAPITAL LETTER Z WITH STROKE -01B6 ; valid # 1.1 LATIN SMALL LETTER Z WITH STROKE -01B7 ; mapped ; 0292 # 1.1 LATIN CAPITAL LETTER EZH -01B8 ; mapped ; 01B9 # 1.1 LATIN CAPITAL LETTER EZH REVERSED -01B9..01BB ; valid # 1.1 LATIN SMALL LETTER EZH REVERSED..LATIN LETTER TWO WITH STROKE -01BC ; mapped ; 01BD # 1.1 LATIN CAPITAL LETTER TONE FIVE -01BD..01C3 ; valid # 1.1 LATIN SMALL LETTER TONE FIVE..LATIN LETTER RETROFLEX CLICK -01C4..01C6 ; mapped ; 0064 017E # 1.1 LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER DZ WITH CARON -01C7..01C9 ; mapped ; 006C 006A # 1.1 LATIN CAPITAL LETTER LJ..LATIN SMALL LETTER LJ -01CA..01CC ; mapped ; 006E 006A # 1.1 LATIN CAPITAL LETTER NJ..LATIN SMALL LETTER NJ -01CD ; mapped ; 01CE # 1.1 LATIN CAPITAL LETTER A WITH CARON -01CE ; valid # 1.1 LATIN SMALL LETTER A WITH CARON -01CF ; mapped ; 01D0 # 1.1 LATIN CAPITAL LETTER I WITH CARON -01D0 ; valid # 1.1 LATIN SMALL LETTER I WITH CARON -01D1 ; mapped ; 01D2 # 1.1 LATIN CAPITAL LETTER O WITH CARON -01D2 ; valid # 1.1 LATIN SMALL LETTER O WITH CARON -01D3 ; mapped ; 01D4 # 1.1 LATIN CAPITAL LETTER U WITH CARON -01D4 ; valid # 1.1 LATIN SMALL LETTER U WITH CARON -01D5 ; mapped ; 01D6 # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON -01D6 ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON -01D7 ; mapped ; 01D8 # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE -01D8 ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE -01D9 ; mapped ; 01DA # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON -01DA ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS AND CARON -01DB ; mapped ; 01DC # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE -01DC..01DD ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E -01DE ; mapped ; 01DF # 1.1 LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON -01DF ; valid # 1.1 LATIN SMALL LETTER A WITH DIAERESIS AND MACRON -01E0 ; mapped ; 01E1 # 1.1 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON -01E1 ; valid # 1.1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON -01E2 ; mapped ; 01E3 # 1.1 LATIN CAPITAL LETTER AE WITH MACRON -01E3 ; valid # 1.1 LATIN SMALL LETTER AE WITH MACRON -01E4 ; mapped ; 01E5 # 1.1 LATIN CAPITAL LETTER G WITH STROKE -01E5 ; valid # 1.1 LATIN SMALL LETTER G WITH STROKE -01E6 ; mapped ; 01E7 # 1.1 LATIN CAPITAL LETTER G WITH CARON -01E7 ; valid # 1.1 LATIN SMALL LETTER G WITH CARON -01E8 ; mapped ; 01E9 # 1.1 LATIN CAPITAL LETTER K WITH CARON -01E9 ; valid # 1.1 LATIN SMALL LETTER K WITH CARON -01EA ; mapped ; 01EB # 1.1 LATIN CAPITAL LETTER O WITH OGONEK -01EB ; valid # 1.1 LATIN SMALL LETTER O WITH OGONEK -01EC ; mapped ; 01ED # 1.1 LATIN CAPITAL LETTER O WITH OGONEK AND MACRON -01ED ; valid # 1.1 LATIN SMALL LETTER O WITH OGONEK AND MACRON -01EE ; mapped ; 01EF # 1.1 LATIN CAPITAL LETTER EZH WITH CARON -01EF..01F0 ; valid # 1.1 LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON -01F1..01F3 ; mapped ; 0064 007A # 1.1 LATIN CAPITAL LETTER DZ..LATIN SMALL LETTER DZ -01F4 ; mapped ; 01F5 # 1.1 LATIN CAPITAL LETTER G WITH ACUTE -01F5 ; valid # 1.1 LATIN SMALL LETTER G WITH ACUTE -01F6 ; mapped ; 0195 # 3.0 LATIN CAPITAL LETTER HWAIR -01F7 ; mapped ; 01BF # 3.0 LATIN CAPITAL LETTER WYNN -01F8 ; mapped ; 01F9 # 3.0 LATIN CAPITAL LETTER N WITH GRAVE -01F9 ; valid # 3.0 LATIN SMALL LETTER N WITH GRAVE -01FA ; mapped ; 01FB # 1.1 LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE -01FB ; valid # 1.1 LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE -01FC ; mapped ; 01FD # 1.1 LATIN CAPITAL LETTER AE WITH ACUTE -01FD ; valid # 1.1 LATIN SMALL LETTER AE WITH ACUTE -01FE ; mapped ; 01FF # 1.1 LATIN CAPITAL LETTER O WITH STROKE AND ACUTE -01FF ; valid # 1.1 LATIN SMALL LETTER O WITH STROKE AND ACUTE -0200 ; mapped ; 0201 # 1.1 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE -0201 ; valid # 1.1 LATIN SMALL LETTER A WITH DOUBLE GRAVE -0202 ; mapped ; 0203 # 1.1 LATIN CAPITAL LETTER A WITH INVERTED BREVE -0203 ; valid # 1.1 LATIN SMALL LETTER A WITH INVERTED BREVE -0204 ; mapped ; 0205 # 1.1 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE -0205 ; valid # 1.1 LATIN SMALL LETTER E WITH DOUBLE GRAVE -0206 ; mapped ; 0207 # 1.1 LATIN CAPITAL LETTER E WITH INVERTED BREVE -0207 ; valid # 1.1 LATIN SMALL LETTER E WITH INVERTED BREVE -0208 ; mapped ; 0209 # 1.1 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE -0209 ; valid # 1.1 LATIN SMALL LETTER I WITH DOUBLE GRAVE -020A ; mapped ; 020B # 1.1 LATIN CAPITAL LETTER I WITH INVERTED BREVE -020B ; valid # 1.1 LATIN SMALL LETTER I WITH INVERTED BREVE -020C ; mapped ; 020D # 1.1 LATIN CAPITAL LETTER O WITH DOUBLE GRAVE -020D ; valid # 1.1 LATIN SMALL LETTER O WITH DOUBLE GRAVE -020E ; mapped ; 020F # 1.1 LATIN CAPITAL LETTER O WITH INVERTED BREVE -020F ; valid # 1.1 LATIN SMALL LETTER O WITH INVERTED BREVE -0210 ; mapped ; 0211 # 1.1 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE -0211 ; valid # 1.1 LATIN SMALL LETTER R WITH DOUBLE GRAVE -0212 ; mapped ; 0213 # 1.1 LATIN CAPITAL LETTER R WITH INVERTED BREVE -0213 ; valid # 1.1 LATIN SMALL LETTER R WITH INVERTED BREVE -0214 ; mapped ; 0215 # 1.1 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE -0215 ; valid # 1.1 LATIN SMALL LETTER U WITH DOUBLE GRAVE -0216 ; mapped ; 0217 # 1.1 LATIN CAPITAL LETTER U WITH INVERTED BREVE -0217 ; valid # 1.1 LATIN SMALL LETTER U WITH INVERTED BREVE -0218 ; mapped ; 0219 # 3.0 LATIN CAPITAL LETTER S WITH COMMA BELOW -0219 ; valid # 3.0 LATIN SMALL LETTER S WITH COMMA BELOW -021A ; mapped ; 021B # 3.0 LATIN CAPITAL LETTER T WITH COMMA BELOW -021B ; valid # 3.0 LATIN SMALL LETTER T WITH COMMA BELOW -021C ; mapped ; 021D # 3.0 LATIN CAPITAL LETTER YOGH -021D ; valid # 3.0 LATIN SMALL LETTER YOGH -021E ; mapped ; 021F # 3.0 LATIN CAPITAL LETTER H WITH CARON -021F ; valid # 3.0 LATIN SMALL LETTER H WITH CARON -0220 ; mapped ; 019E # 3.2 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG -0221 ; valid # 4.0 LATIN SMALL LETTER D WITH CURL -0222 ; mapped ; 0223 # 3.0 LATIN CAPITAL LETTER OU -0223 ; valid # 3.0 LATIN SMALL LETTER OU -0224 ; mapped ; 0225 # 3.0 LATIN CAPITAL LETTER Z WITH HOOK -0225 ; valid # 3.0 LATIN SMALL LETTER Z WITH HOOK -0226 ; mapped ; 0227 # 3.0 LATIN CAPITAL LETTER A WITH DOT ABOVE -0227 ; valid # 3.0 LATIN SMALL LETTER A WITH DOT ABOVE -0228 ; mapped ; 0229 # 3.0 LATIN CAPITAL LETTER E WITH CEDILLA -0229 ; valid # 3.0 LATIN SMALL LETTER E WITH CEDILLA -022A ; mapped ; 022B # 3.0 LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON -022B ; valid # 3.0 LATIN SMALL LETTER O WITH DIAERESIS AND MACRON -022C ; mapped ; 022D # 3.0 LATIN CAPITAL LETTER O WITH TILDE AND MACRON -022D ; valid # 3.0 LATIN SMALL LETTER O WITH TILDE AND MACRON -022E ; mapped ; 022F # 3.0 LATIN CAPITAL LETTER O WITH DOT ABOVE -022F ; valid # 3.0 LATIN SMALL LETTER O WITH DOT ABOVE -0230 ; mapped ; 0231 # 3.0 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON -0231 ; valid # 3.0 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON -0232 ; mapped ; 0233 # 3.0 LATIN CAPITAL LETTER Y WITH MACRON -0233 ; valid # 3.0 LATIN SMALL LETTER Y WITH MACRON -0234..0236 ; valid # 4.0 LATIN SMALL LETTER L WITH CURL..LATIN SMALL LETTER T WITH CURL -0237..0239 ; valid # 4.1 LATIN SMALL LETTER DOTLESS J..LATIN SMALL LETTER QP DIGRAPH -023A ; mapped ; 2C65 # 4.1 LATIN CAPITAL LETTER A WITH STROKE -023B ; mapped ; 023C # 4.1 LATIN CAPITAL LETTER C WITH STROKE -023C ; valid # 4.1 LATIN SMALL LETTER C WITH STROKE -023D ; mapped ; 019A # 4.1 LATIN CAPITAL LETTER L WITH BAR -023E ; mapped ; 2C66 # 4.1 LATIN CAPITAL LETTER T WITH DIAGONAL STROKE -023F..0240 ; valid # 4.1 LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL -0241 ; mapped ; 0242 # 4.1 LATIN CAPITAL LETTER GLOTTAL STOP -0242 ; valid # 5.0 LATIN SMALL LETTER GLOTTAL STOP -0243 ; mapped ; 0180 # 5.0 LATIN CAPITAL LETTER B WITH STROKE -0244 ; mapped ; 0289 # 5.0 LATIN CAPITAL LETTER U BAR -0245 ; mapped ; 028C # 5.0 LATIN CAPITAL LETTER TURNED V -0246 ; mapped ; 0247 # 5.0 LATIN CAPITAL LETTER E WITH STROKE -0247 ; valid # 5.0 LATIN SMALL LETTER E WITH STROKE -0248 ; mapped ; 0249 # 5.0 LATIN CAPITAL LETTER J WITH STROKE -0249 ; valid # 5.0 LATIN SMALL LETTER J WITH STROKE -024A ; mapped ; 024B # 5.0 LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL -024B ; valid # 5.0 LATIN SMALL LETTER Q WITH HOOK TAIL -024C ; mapped ; 024D # 5.0 LATIN CAPITAL LETTER R WITH STROKE -024D ; valid # 5.0 LATIN SMALL LETTER R WITH STROKE -024E ; mapped ; 024F # 5.0 LATIN CAPITAL LETTER Y WITH STROKE -024F ; valid # 5.0 LATIN SMALL LETTER Y WITH STROKE -0250..02A8 ; valid # 1.1 LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TC DIGRAPH WITH CURL -02A9..02AD ; valid # 3.0 LATIN SMALL LETTER FENG DIGRAPH..LATIN LETTER BIDENTAL PERCUSSIVE -02AE..02AF ; valid # 4.0 LATIN SMALL LETTER TURNED H WITH FISHHOOK..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0 ; mapped ; 0068 # 1.1 MODIFIER LETTER SMALL H -02B1 ; mapped ; 0266 # 1.1 MODIFIER LETTER SMALL H WITH HOOK -02B2 ; mapped ; 006A # 1.1 MODIFIER LETTER SMALL J -02B3 ; mapped ; 0072 # 1.1 MODIFIER LETTER SMALL R -02B4 ; mapped ; 0279 # 1.1 MODIFIER LETTER SMALL TURNED R -02B5 ; mapped ; 027B # 1.1 MODIFIER LETTER SMALL TURNED R WITH HOOK -02B6 ; mapped ; 0281 # 1.1 MODIFIER LETTER SMALL CAPITAL INVERTED R -02B7 ; mapped ; 0077 # 1.1 MODIFIER LETTER SMALL W -02B8 ; mapped ; 0079 # 1.1 MODIFIER LETTER SMALL Y -02B9..02C1 ; valid # 1.1 MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP -02C2..02C5 ; valid ; ; NV8 # 1.1 MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD -02C6..02D1 ; valid # 1.1 MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02D2..02D7 ; valid ; ; NV8 # 1.1 MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN -02D8 ; disallowed_STD3_mapped ; 0020 0306 # 1.1 BREVE -02D9 ; disallowed_STD3_mapped ; 0020 0307 # 1.1 DOT ABOVE -02DA ; disallowed_STD3_mapped ; 0020 030A # 1.1 RING ABOVE -02DB ; disallowed_STD3_mapped ; 0020 0328 # 1.1 OGONEK -02DC ; disallowed_STD3_mapped ; 0020 0303 # 1.1 SMALL TILDE -02DD ; disallowed_STD3_mapped ; 0020 030B # 1.1 DOUBLE ACUTE ACCENT -02DE ; valid ; ; NV8 # 1.1 MODIFIER LETTER RHOTIC HOOK -02DF ; valid ; ; NV8 # 3.0 MODIFIER LETTER CROSS ACCENT -02E0 ; mapped ; 0263 # 1.1 MODIFIER LETTER SMALL GAMMA -02E1 ; mapped ; 006C # 1.1 MODIFIER LETTER SMALL L -02E2 ; mapped ; 0073 # 1.1 MODIFIER LETTER SMALL S -02E3 ; mapped ; 0078 # 1.1 MODIFIER LETTER SMALL X -02E4 ; mapped ; 0295 # 1.1 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02E5..02E9 ; valid ; ; NV8 # 1.1 MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER EXTRA-LOW TONE BAR -02EA..02EB ; valid ; ; NV8 # 3.0 MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK -02EC ; valid # 3.0 MODIFIER LETTER VOICING -02ED ; valid ; ; NV8 # 3.0 MODIFIER LETTER UNASPIRATED -02EE ; valid # 3.0 MODIFIER LETTER DOUBLE APOSTROPHE -02EF..02FF ; valid ; ; NV8 # 4.0 MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW -0300..033F ; valid # 1.1 COMBINING GRAVE ACCENT..COMBINING DOUBLE OVERLINE -0340 ; mapped ; 0300 # 1.1 COMBINING GRAVE TONE MARK -0341 ; mapped ; 0301 # 1.1 COMBINING ACUTE TONE MARK -0342 ; valid # 1.1 COMBINING GREEK PERISPOMENI -0343 ; mapped ; 0313 # 1.1 COMBINING GREEK KORONIS -0344 ; mapped ; 0308 0301 # 1.1 COMBINING GREEK DIALYTIKA TONOS -0345 ; mapped ; 03B9 # 1.1 COMBINING GREEK YPOGEGRAMMENI -0346..034E ; valid # 3.0 COMBINING BRIDGE ABOVE..COMBINING UPWARDS ARROW BELOW -034F ; ignored # 3.2 COMBINING GRAPHEME JOINER -0350..0357 ; valid # 4.0 COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE -0358..035C ; valid # 4.1 COMBINING DOT ABOVE RIGHT..COMBINING DOUBLE BREVE BELOW -035D..035F ; valid # 4.0 COMBINING DOUBLE BREVE..COMBINING DOUBLE MACRON BELOW -0360..0361 ; valid # 1.1 COMBINING DOUBLE TILDE..COMBINING DOUBLE INVERTED BREVE -0362 ; valid # 3.0 COMBINING DOUBLE RIGHTWARDS ARROW BELOW -0363..036F ; valid # 3.2 COMBINING LATIN SMALL LETTER A..COMBINING LATIN SMALL LETTER X -0370 ; mapped ; 0371 # 5.1 GREEK CAPITAL LETTER HETA -0371 ; valid # 5.1 GREEK SMALL LETTER HETA -0372 ; mapped ; 0373 # 5.1 GREEK CAPITAL LETTER ARCHAIC SAMPI -0373 ; valid # 5.1 GREEK SMALL LETTER ARCHAIC SAMPI -0374 ; mapped ; 02B9 # 1.1 GREEK NUMERAL SIGN -0375 ; valid # 1.1 GREEK LOWER NUMERAL SIGN -0376 ; mapped ; 0377 # 5.1 GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA -0377 ; valid # 5.1 GREEK SMALL LETTER PAMPHYLIAN DIGAMMA -0378..0379 ; disallowed # NA .. -037A ; disallowed_STD3_mapped ; 0020 03B9 # 1.1 GREEK YPOGEGRAMMENI -037B..037D ; valid # 5.0 GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL -037E ; disallowed_STD3_mapped ; 003B # 1.1 GREEK QUESTION MARK -037F ; mapped ; 03F3 # 7.0 GREEK CAPITAL LETTER YOT -0380..0383 ; disallowed # NA .. -0384 ; disallowed_STD3_mapped ; 0020 0301 # 1.1 GREEK TONOS -0385 ; disallowed_STD3_mapped ; 0020 0308 0301 #1.1 GREEK DIALYTIKA TONOS -0386 ; mapped ; 03AC # 1.1 GREEK CAPITAL LETTER ALPHA WITH TONOS -0387 ; mapped ; 00B7 # 1.1 GREEK ANO TELEIA -0388 ; mapped ; 03AD # 1.1 GREEK CAPITAL LETTER EPSILON WITH TONOS -0389 ; mapped ; 03AE # 1.1 GREEK CAPITAL LETTER ETA WITH TONOS -038A ; mapped ; 03AF # 1.1 GREEK CAPITAL LETTER IOTA WITH TONOS -038B ; disallowed # NA -038C ; mapped ; 03CC # 1.1 GREEK CAPITAL LETTER OMICRON WITH TONOS -038D ; disallowed # NA -038E ; mapped ; 03CD # 1.1 GREEK CAPITAL LETTER UPSILON WITH TONOS -038F ; mapped ; 03CE # 1.1 GREEK CAPITAL LETTER OMEGA WITH TONOS -0390 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -0391 ; mapped ; 03B1 # 1.1 GREEK CAPITAL LETTER ALPHA -0392 ; mapped ; 03B2 # 1.1 GREEK CAPITAL LETTER BETA -0393 ; mapped ; 03B3 # 1.1 GREEK CAPITAL LETTER GAMMA -0394 ; mapped ; 03B4 # 1.1 GREEK CAPITAL LETTER DELTA -0395 ; mapped ; 03B5 # 1.1 GREEK CAPITAL LETTER EPSILON -0396 ; mapped ; 03B6 # 1.1 GREEK CAPITAL LETTER ZETA -0397 ; mapped ; 03B7 # 1.1 GREEK CAPITAL LETTER ETA -0398 ; mapped ; 03B8 # 1.1 GREEK CAPITAL LETTER THETA -0399 ; mapped ; 03B9 # 1.1 GREEK CAPITAL LETTER IOTA -039A ; mapped ; 03BA # 1.1 GREEK CAPITAL LETTER KAPPA -039B ; mapped ; 03BB # 1.1 GREEK CAPITAL LETTER LAMDA -039C ; mapped ; 03BC # 1.1 GREEK CAPITAL LETTER MU -039D ; mapped ; 03BD # 1.1 GREEK CAPITAL LETTER NU -039E ; mapped ; 03BE # 1.1 GREEK CAPITAL LETTER XI -039F ; mapped ; 03BF # 1.1 GREEK CAPITAL LETTER OMICRON -03A0 ; mapped ; 03C0 # 1.1 GREEK CAPITAL LETTER PI -03A1 ; mapped ; 03C1 # 1.1 GREEK CAPITAL LETTER RHO -03A2 ; disallowed # NA -03A3 ; mapped ; 03C3 # 1.1 GREEK CAPITAL LETTER SIGMA -03A4 ; mapped ; 03C4 # 1.1 GREEK CAPITAL LETTER TAU -03A5 ; mapped ; 03C5 # 1.1 GREEK CAPITAL LETTER UPSILON -03A6 ; mapped ; 03C6 # 1.1 GREEK CAPITAL LETTER PHI -03A7 ; mapped ; 03C7 # 1.1 GREEK CAPITAL LETTER CHI -03A8 ; mapped ; 03C8 # 1.1 GREEK CAPITAL LETTER PSI -03A9 ; mapped ; 03C9 # 1.1 GREEK CAPITAL LETTER OMEGA -03AA ; mapped ; 03CA # 1.1 GREEK CAPITAL LETTER IOTA WITH DIALYTIKA -03AB ; mapped ; 03CB # 1.1 GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA -03AC..03C1 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER RHO -03C2 ; deviation ; 03C3 # 1.1 GREEK SMALL LETTER FINAL SIGMA -03C3..03CE ; valid # 1.1 GREEK SMALL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS -03CF ; mapped ; 03D7 # 5.1 GREEK CAPITAL KAI SYMBOL -03D0 ; mapped ; 03B2 # 1.1 GREEK BETA SYMBOL -03D1 ; mapped ; 03B8 # 1.1 GREEK THETA SYMBOL -03D2 ; mapped ; 03C5 # 1.1 GREEK UPSILON WITH HOOK SYMBOL -03D3 ; mapped ; 03CD # 1.1 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL -03D4 ; mapped ; 03CB # 1.1 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL -03D5 ; mapped ; 03C6 # 1.1 GREEK PHI SYMBOL -03D6 ; mapped ; 03C0 # 1.1 GREEK PI SYMBOL -03D7 ; valid # 3.0 GREEK KAI SYMBOL -03D8 ; mapped ; 03D9 # 3.2 GREEK LETTER ARCHAIC KOPPA -03D9 ; valid # 3.2 GREEK SMALL LETTER ARCHAIC KOPPA -03DA ; mapped ; 03DB # 1.1 GREEK LETTER STIGMA -03DB ; valid # 3.0 GREEK SMALL LETTER STIGMA -03DC ; mapped ; 03DD # 1.1 GREEK LETTER DIGAMMA -03DD ; valid # 3.0 GREEK SMALL LETTER DIGAMMA -03DE ; mapped ; 03DF # 1.1 GREEK LETTER KOPPA -03DF ; valid # 3.0 GREEK SMALL LETTER KOPPA -03E0 ; mapped ; 03E1 # 1.1 GREEK LETTER SAMPI -03E1 ; valid # 3.0 GREEK SMALL LETTER SAMPI -03E2 ; mapped ; 03E3 # 1.1 COPTIC CAPITAL LETTER SHEI -03E3 ; valid # 1.1 COPTIC SMALL LETTER SHEI -03E4 ; mapped ; 03E5 # 1.1 COPTIC CAPITAL LETTER FEI -03E5 ; valid # 1.1 COPTIC SMALL LETTER FEI -03E6 ; mapped ; 03E7 # 1.1 COPTIC CAPITAL LETTER KHEI -03E7 ; valid # 1.1 COPTIC SMALL LETTER KHEI -03E8 ; mapped ; 03E9 # 1.1 COPTIC CAPITAL LETTER HORI -03E9 ; valid # 1.1 COPTIC SMALL LETTER HORI -03EA ; mapped ; 03EB # 1.1 COPTIC CAPITAL LETTER GANGIA -03EB ; valid # 1.1 COPTIC SMALL LETTER GANGIA -03EC ; mapped ; 03ED # 1.1 COPTIC CAPITAL LETTER SHIMA -03ED ; valid # 1.1 COPTIC SMALL LETTER SHIMA -03EE ; mapped ; 03EF # 1.1 COPTIC CAPITAL LETTER DEI -03EF ; valid # 1.1 COPTIC SMALL LETTER DEI -03F0 ; mapped ; 03BA # 1.1 GREEK KAPPA SYMBOL -03F1 ; mapped ; 03C1 # 1.1 GREEK RHO SYMBOL -03F2 ; mapped ; 03C3 # 1.1 GREEK LUNATE SIGMA SYMBOL -03F3 ; valid # 1.1 GREEK LETTER YOT -03F4 ; mapped ; 03B8 # 3.1 GREEK CAPITAL THETA SYMBOL -03F5 ; mapped ; 03B5 # 3.1 GREEK LUNATE EPSILON SYMBOL -03F6 ; valid ; ; NV8 # 3.2 GREEK REVERSED LUNATE EPSILON SYMBOL -03F7 ; mapped ; 03F8 # 4.0 GREEK CAPITAL LETTER SHO -03F8 ; valid # 4.0 GREEK SMALL LETTER SHO -03F9 ; mapped ; 03C3 # 4.0 GREEK CAPITAL LUNATE SIGMA SYMBOL -03FA ; mapped ; 03FB # 4.0 GREEK CAPITAL LETTER SAN -03FB ; valid # 4.0 GREEK SMALL LETTER SAN -03FC ; valid # 4.1 GREEK RHO WITH STROKE SYMBOL -03FD ; mapped ; 037B # 4.1 GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL -03FE ; mapped ; 037C # 4.1 GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL -03FF ; mapped ; 037D # 4.1 GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL -0400 ; mapped ; 0450 # 3.0 CYRILLIC CAPITAL LETTER IE WITH GRAVE -0401 ; mapped ; 0451 # 1.1 CYRILLIC CAPITAL LETTER IO -0402 ; mapped ; 0452 # 1.1 CYRILLIC CAPITAL LETTER DJE -0403 ; mapped ; 0453 # 1.1 CYRILLIC CAPITAL LETTER GJE -0404 ; mapped ; 0454 # 1.1 CYRILLIC CAPITAL LETTER UKRAINIAN IE -0405 ; mapped ; 0455 # 1.1 CYRILLIC CAPITAL LETTER DZE -0406 ; mapped ; 0456 # 1.1 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -0407 ; mapped ; 0457 # 1.1 CYRILLIC CAPITAL LETTER YI -0408 ; mapped ; 0458 # 1.1 CYRILLIC CAPITAL LETTER JE -0409 ; mapped ; 0459 # 1.1 CYRILLIC CAPITAL LETTER LJE -040A ; mapped ; 045A # 1.1 CYRILLIC CAPITAL LETTER NJE -040B ; mapped ; 045B # 1.1 CYRILLIC CAPITAL LETTER TSHE -040C ; mapped ; 045C # 1.1 CYRILLIC CAPITAL LETTER KJE -040D ; mapped ; 045D # 3.0 CYRILLIC CAPITAL LETTER I WITH GRAVE -040E ; mapped ; 045E # 1.1 CYRILLIC CAPITAL LETTER SHORT U -040F ; mapped ; 045F # 1.1 CYRILLIC CAPITAL LETTER DZHE -0410 ; mapped ; 0430 # 1.1 CYRILLIC CAPITAL LETTER A -0411 ; mapped ; 0431 # 1.1 CYRILLIC CAPITAL LETTER BE -0412 ; mapped ; 0432 # 1.1 CYRILLIC CAPITAL LETTER VE -0413 ; mapped ; 0433 # 1.1 CYRILLIC CAPITAL LETTER GHE -0414 ; mapped ; 0434 # 1.1 CYRILLIC CAPITAL LETTER DE -0415 ; mapped ; 0435 # 1.1 CYRILLIC CAPITAL LETTER IE -0416 ; mapped ; 0436 # 1.1 CYRILLIC CAPITAL LETTER ZHE -0417 ; mapped ; 0437 # 1.1 CYRILLIC CAPITAL LETTER ZE -0418 ; mapped ; 0438 # 1.1 CYRILLIC CAPITAL LETTER I -0419 ; mapped ; 0439 # 1.1 CYRILLIC CAPITAL LETTER SHORT I -041A ; mapped ; 043A # 1.1 CYRILLIC CAPITAL LETTER KA -041B ; mapped ; 043B # 1.1 CYRILLIC CAPITAL LETTER EL -041C ; mapped ; 043C # 1.1 CYRILLIC CAPITAL LETTER EM -041D ; mapped ; 043D # 1.1 CYRILLIC CAPITAL LETTER EN -041E ; mapped ; 043E # 1.1 CYRILLIC CAPITAL LETTER O -041F ; mapped ; 043F # 1.1 CYRILLIC CAPITAL LETTER PE -0420 ; mapped ; 0440 # 1.1 CYRILLIC CAPITAL LETTER ER -0421 ; mapped ; 0441 # 1.1 CYRILLIC CAPITAL LETTER ES -0422 ; mapped ; 0442 # 1.1 CYRILLIC CAPITAL LETTER TE -0423 ; mapped ; 0443 # 1.1 CYRILLIC CAPITAL LETTER U -0424 ; mapped ; 0444 # 1.1 CYRILLIC CAPITAL LETTER EF -0425 ; mapped ; 0445 # 1.1 CYRILLIC CAPITAL LETTER HA -0426 ; mapped ; 0446 # 1.1 CYRILLIC CAPITAL LETTER TSE -0427 ; mapped ; 0447 # 1.1 CYRILLIC CAPITAL LETTER CHE -0428 ; mapped ; 0448 # 1.1 CYRILLIC CAPITAL LETTER SHA -0429 ; mapped ; 0449 # 1.1 CYRILLIC CAPITAL LETTER SHCHA -042A ; mapped ; 044A # 1.1 CYRILLIC CAPITAL LETTER HARD SIGN -042B ; mapped ; 044B # 1.1 CYRILLIC CAPITAL LETTER YERU -042C ; mapped ; 044C # 1.1 CYRILLIC CAPITAL LETTER SOFT SIGN -042D ; mapped ; 044D # 1.1 CYRILLIC CAPITAL LETTER E -042E ; mapped ; 044E # 1.1 CYRILLIC CAPITAL LETTER YU -042F ; mapped ; 044F # 1.1 CYRILLIC CAPITAL LETTER YA -0430..044F ; valid # 1.1 CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER YA -0450 ; valid # 3.0 CYRILLIC SMALL LETTER IE WITH GRAVE -0451..045C ; valid # 1.1 CYRILLIC SMALL LETTER IO..CYRILLIC SMALL LETTER KJE -045D ; valid # 3.0 CYRILLIC SMALL LETTER I WITH GRAVE -045E..045F ; valid # 1.1 CYRILLIC SMALL LETTER SHORT U..CYRILLIC SMALL LETTER DZHE -0460 ; mapped ; 0461 # 1.1 CYRILLIC CAPITAL LETTER OMEGA -0461 ; valid # 1.1 CYRILLIC SMALL LETTER OMEGA -0462 ; mapped ; 0463 # 1.1 CYRILLIC CAPITAL LETTER YAT -0463 ; valid # 1.1 CYRILLIC SMALL LETTER YAT -0464 ; mapped ; 0465 # 1.1 CYRILLIC CAPITAL LETTER IOTIFIED E -0465 ; valid # 1.1 CYRILLIC SMALL LETTER IOTIFIED E -0466 ; mapped ; 0467 # 1.1 CYRILLIC CAPITAL LETTER LITTLE YUS -0467 ; valid # 1.1 CYRILLIC SMALL LETTER LITTLE YUS -0468 ; mapped ; 0469 # 1.1 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS -0469 ; valid # 1.1 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS -046A ; mapped ; 046B # 1.1 CYRILLIC CAPITAL LETTER BIG YUS -046B ; valid # 1.1 CYRILLIC SMALL LETTER BIG YUS -046C ; mapped ; 046D # 1.1 CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS -046D ; valid # 1.1 CYRILLIC SMALL LETTER IOTIFIED BIG YUS -046E ; mapped ; 046F # 1.1 CYRILLIC CAPITAL LETTER KSI -046F ; valid # 1.1 CYRILLIC SMALL LETTER KSI -0470 ; mapped ; 0471 # 1.1 CYRILLIC CAPITAL LETTER PSI -0471 ; valid # 1.1 CYRILLIC SMALL LETTER PSI -0472 ; mapped ; 0473 # 1.1 CYRILLIC CAPITAL LETTER FITA -0473 ; valid # 1.1 CYRILLIC SMALL LETTER FITA -0474 ; mapped ; 0475 # 1.1 CYRILLIC CAPITAL LETTER IZHITSA -0475 ; valid # 1.1 CYRILLIC SMALL LETTER IZHITSA -0476 ; mapped ; 0477 # 1.1 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -0477 ; valid # 1.1 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -0478 ; mapped ; 0479 # 1.1 CYRILLIC CAPITAL LETTER UK -0479 ; valid # 1.1 CYRILLIC SMALL LETTER UK -047A ; mapped ; 047B # 1.1 CYRILLIC CAPITAL LETTER ROUND OMEGA -047B ; valid # 1.1 CYRILLIC SMALL LETTER ROUND OMEGA -047C ; mapped ; 047D # 1.1 CYRILLIC CAPITAL LETTER OMEGA WITH TITLO -047D ; valid # 1.1 CYRILLIC SMALL LETTER OMEGA WITH TITLO -047E ; mapped ; 047F # 1.1 CYRILLIC CAPITAL LETTER OT -047F ; valid # 1.1 CYRILLIC SMALL LETTER OT -0480 ; mapped ; 0481 # 1.1 CYRILLIC CAPITAL LETTER KOPPA -0481 ; valid # 1.1 CYRILLIC SMALL LETTER KOPPA -0482 ; valid ; ; NV8 # 1.1 CYRILLIC THOUSANDS SIGN -0483..0486 ; valid # 1.1 COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA -0487 ; valid # 5.1 COMBINING CYRILLIC POKRYTIE -0488..0489 ; valid ; ; NV8 # 3.0 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -048A ; mapped ; 048B # 3.2 CYRILLIC CAPITAL LETTER SHORT I WITH TAIL -048B ; valid # 3.2 CYRILLIC SMALL LETTER SHORT I WITH TAIL -048C ; mapped ; 048D # 3.0 CYRILLIC CAPITAL LETTER SEMISOFT SIGN -048D ; valid # 3.0 CYRILLIC SMALL LETTER SEMISOFT SIGN -048E ; mapped ; 048F # 3.0 CYRILLIC CAPITAL LETTER ER WITH TICK -048F ; valid # 3.0 CYRILLIC SMALL LETTER ER WITH TICK -0490 ; mapped ; 0491 # 1.1 CYRILLIC CAPITAL LETTER GHE WITH UPTURN -0491 ; valid # 1.1 CYRILLIC SMALL LETTER GHE WITH UPTURN -0492 ; mapped ; 0493 # 1.1 CYRILLIC CAPITAL LETTER GHE WITH STROKE -0493 ; valid # 1.1 CYRILLIC SMALL LETTER GHE WITH STROKE -0494 ; mapped ; 0495 # 1.1 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK -0495 ; valid # 1.1 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK -0496 ; mapped ; 0497 # 1.1 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER -0497 ; valid # 1.1 CYRILLIC SMALL LETTER ZHE WITH DESCENDER -0498 ; mapped ; 0499 # 1.1 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER -0499 ; valid # 1.1 CYRILLIC SMALL LETTER ZE WITH DESCENDER -049A ; mapped ; 049B # 1.1 CYRILLIC CAPITAL LETTER KA WITH DESCENDER -049B ; valid # 1.1 CYRILLIC SMALL LETTER KA WITH DESCENDER -049C ; mapped ; 049D # 1.1 CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE -049D ; valid # 1.1 CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE -049E ; mapped ; 049F # 1.1 CYRILLIC CAPITAL LETTER KA WITH STROKE -049F ; valid # 1.1 CYRILLIC SMALL LETTER KA WITH STROKE -04A0 ; mapped ; 04A1 # 1.1 CYRILLIC CAPITAL LETTER BASHKIR KA -04A1 ; valid # 1.1 CYRILLIC SMALL LETTER BASHKIR KA -04A2 ; mapped ; 04A3 # 1.1 CYRILLIC CAPITAL LETTER EN WITH DESCENDER -04A3 ; valid # 1.1 CYRILLIC SMALL LETTER EN WITH DESCENDER -04A4 ; mapped ; 04A5 # 1.1 CYRILLIC CAPITAL LIGATURE EN GHE -04A5 ; valid # 1.1 CYRILLIC SMALL LIGATURE EN GHE -04A6 ; mapped ; 04A7 # 1.1 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK -04A7 ; valid # 1.1 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK -04A8 ; mapped ; 04A9 # 1.1 CYRILLIC CAPITAL LETTER ABKHASIAN HA -04A9 ; valid # 1.1 CYRILLIC SMALL LETTER ABKHASIAN HA -04AA ; mapped ; 04AB # 1.1 CYRILLIC CAPITAL LETTER ES WITH DESCENDER -04AB ; valid # 1.1 CYRILLIC SMALL LETTER ES WITH DESCENDER -04AC ; mapped ; 04AD # 1.1 CYRILLIC CAPITAL LETTER TE WITH DESCENDER -04AD ; valid # 1.1 CYRILLIC SMALL LETTER TE WITH DESCENDER -04AE ; mapped ; 04AF # 1.1 CYRILLIC CAPITAL LETTER STRAIGHT U -04AF ; valid # 1.1 CYRILLIC SMALL LETTER STRAIGHT U -04B0 ; mapped ; 04B1 # 1.1 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE -04B1 ; valid # 1.1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE -04B2 ; mapped ; 04B3 # 1.1 CYRILLIC CAPITAL LETTER HA WITH DESCENDER -04B3 ; valid # 1.1 CYRILLIC SMALL LETTER HA WITH DESCENDER -04B4 ; mapped ; 04B5 # 1.1 CYRILLIC CAPITAL LIGATURE TE TSE -04B5 ; valid # 1.1 CYRILLIC SMALL LIGATURE TE TSE -04B6 ; mapped ; 04B7 # 1.1 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER -04B7 ; valid # 1.1 CYRILLIC SMALL LETTER CHE WITH DESCENDER -04B8 ; mapped ; 04B9 # 1.1 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE -04B9 ; valid # 1.1 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE -04BA ; mapped ; 04BB # 1.1 CYRILLIC CAPITAL LETTER SHHA -04BB ; valid # 1.1 CYRILLIC SMALL LETTER SHHA -04BC ; mapped ; 04BD # 1.1 CYRILLIC CAPITAL LETTER ABKHASIAN CHE -04BD ; valid # 1.1 CYRILLIC SMALL LETTER ABKHASIAN CHE -04BE ; mapped ; 04BF # 1.1 CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER -04BF ; valid # 1.1 CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER -04C0 ; disallowed # 1.1 CYRILLIC LETTER PALOCHKA -04C1 ; mapped ; 04C2 # 1.1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE -04C2 ; valid # 1.1 CYRILLIC SMALL LETTER ZHE WITH BREVE -04C3 ; mapped ; 04C4 # 1.1 CYRILLIC CAPITAL LETTER KA WITH HOOK -04C4 ; valid # 1.1 CYRILLIC SMALL LETTER KA WITH HOOK -04C5 ; mapped ; 04C6 # 3.2 CYRILLIC CAPITAL LETTER EL WITH TAIL -04C6 ; valid # 3.2 CYRILLIC SMALL LETTER EL WITH TAIL -04C7 ; mapped ; 04C8 # 1.1 CYRILLIC CAPITAL LETTER EN WITH HOOK -04C8 ; valid # 1.1 CYRILLIC SMALL LETTER EN WITH HOOK -04C9 ; mapped ; 04CA # 3.2 CYRILLIC CAPITAL LETTER EN WITH TAIL -04CA ; valid # 3.2 CYRILLIC SMALL LETTER EN WITH TAIL -04CB ; mapped ; 04CC # 1.1 CYRILLIC CAPITAL LETTER KHAKASSIAN CHE -04CC ; valid # 1.1 CYRILLIC SMALL LETTER KHAKASSIAN CHE -04CD ; mapped ; 04CE # 3.2 CYRILLIC CAPITAL LETTER EM WITH TAIL -04CE ; valid # 3.2 CYRILLIC SMALL LETTER EM WITH TAIL -04CF ; valid # 5.0 CYRILLIC SMALL LETTER PALOCHKA -04D0 ; mapped ; 04D1 # 1.1 CYRILLIC CAPITAL LETTER A WITH BREVE -04D1 ; valid # 1.1 CYRILLIC SMALL LETTER A WITH BREVE -04D2 ; mapped ; 04D3 # 1.1 CYRILLIC CAPITAL LETTER A WITH DIAERESIS -04D3 ; valid # 1.1 CYRILLIC SMALL LETTER A WITH DIAERESIS -04D4 ; mapped ; 04D5 # 1.1 CYRILLIC CAPITAL LIGATURE A IE -04D5 ; valid # 1.1 CYRILLIC SMALL LIGATURE A IE -04D6 ; mapped ; 04D7 # 1.1 CYRILLIC CAPITAL LETTER IE WITH BREVE -04D7 ; valid # 1.1 CYRILLIC SMALL LETTER IE WITH BREVE -04D8 ; mapped ; 04D9 # 1.1 CYRILLIC CAPITAL LETTER SCHWA -04D9 ; valid # 1.1 CYRILLIC SMALL LETTER SCHWA -04DA ; mapped ; 04DB # 1.1 CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS -04DB ; valid # 1.1 CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS -04DC ; mapped ; 04DD # 1.1 CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS -04DD ; valid # 1.1 CYRILLIC SMALL LETTER ZHE WITH DIAERESIS -04DE ; mapped ; 04DF # 1.1 CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS -04DF ; valid # 1.1 CYRILLIC SMALL LETTER ZE WITH DIAERESIS -04E0 ; mapped ; 04E1 # 1.1 CYRILLIC CAPITAL LETTER ABKHASIAN DZE -04E1 ; valid # 1.1 CYRILLIC SMALL LETTER ABKHASIAN DZE -04E2 ; mapped ; 04E3 # 1.1 CYRILLIC CAPITAL LETTER I WITH MACRON -04E3 ; valid # 1.1 CYRILLIC SMALL LETTER I WITH MACRON -04E4 ; mapped ; 04E5 # 1.1 CYRILLIC CAPITAL LETTER I WITH DIAERESIS -04E5 ; valid # 1.1 CYRILLIC SMALL LETTER I WITH DIAERESIS -04E6 ; mapped ; 04E7 # 1.1 CYRILLIC CAPITAL LETTER O WITH DIAERESIS -04E7 ; valid # 1.1 CYRILLIC SMALL LETTER O WITH DIAERESIS -04E8 ; mapped ; 04E9 # 1.1 CYRILLIC CAPITAL LETTER BARRED O -04E9 ; valid # 1.1 CYRILLIC SMALL LETTER BARRED O -04EA ; mapped ; 04EB # 1.1 CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS -04EB ; valid # 1.1 CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS -04EC ; mapped ; 04ED # 3.0 CYRILLIC CAPITAL LETTER E WITH DIAERESIS -04ED ; valid # 3.0 CYRILLIC SMALL LETTER E WITH DIAERESIS -04EE ; mapped ; 04EF # 1.1 CYRILLIC CAPITAL LETTER U WITH MACRON -04EF ; valid # 1.1 CYRILLIC SMALL LETTER U WITH MACRON -04F0 ; mapped ; 04F1 # 1.1 CYRILLIC CAPITAL LETTER U WITH DIAERESIS -04F1 ; valid # 1.1 CYRILLIC SMALL LETTER U WITH DIAERESIS -04F2 ; mapped ; 04F3 # 1.1 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE -04F3 ; valid # 1.1 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE -04F4 ; mapped ; 04F5 # 1.1 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS -04F5 ; valid # 1.1 CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F6 ; mapped ; 04F7 # 4.1 CYRILLIC CAPITAL LETTER GHE WITH DESCENDER -04F7 ; valid # 4.1 CYRILLIC SMALL LETTER GHE WITH DESCENDER -04F8 ; mapped ; 04F9 # 1.1 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS -04F9 ; valid # 1.1 CYRILLIC SMALL LETTER YERU WITH DIAERESIS -04FA ; mapped ; 04FB # 5.0 CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK -04FB ; valid # 5.0 CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK -04FC ; mapped ; 04FD # 5.0 CYRILLIC CAPITAL LETTER HA WITH HOOK -04FD ; valid # 5.0 CYRILLIC SMALL LETTER HA WITH HOOK -04FE ; mapped ; 04FF # 5.0 CYRILLIC CAPITAL LETTER HA WITH STROKE -04FF ; valid # 5.0 CYRILLIC SMALL LETTER HA WITH STROKE -0500 ; mapped ; 0501 # 3.2 CYRILLIC CAPITAL LETTER KOMI DE -0501 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI DE -0502 ; mapped ; 0503 # 3.2 CYRILLIC CAPITAL LETTER KOMI DJE -0503 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI DJE -0504 ; mapped ; 0505 # 3.2 CYRILLIC CAPITAL LETTER KOMI ZJE -0505 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI ZJE -0506 ; mapped ; 0507 # 3.2 CYRILLIC CAPITAL LETTER KOMI DZJE -0507 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI DZJE -0508 ; mapped ; 0509 # 3.2 CYRILLIC CAPITAL LETTER KOMI LJE -0509 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI LJE -050A ; mapped ; 050B # 3.2 CYRILLIC CAPITAL LETTER KOMI NJE -050B ; valid # 3.2 CYRILLIC SMALL LETTER KOMI NJE -050C ; mapped ; 050D # 3.2 CYRILLIC CAPITAL LETTER KOMI SJE -050D ; valid # 3.2 CYRILLIC SMALL LETTER KOMI SJE -050E ; mapped ; 050F # 3.2 CYRILLIC CAPITAL LETTER KOMI TJE -050F ; valid # 3.2 CYRILLIC SMALL LETTER KOMI TJE -0510 ; mapped ; 0511 # 5.0 CYRILLIC CAPITAL LETTER REVERSED ZE -0511 ; valid # 5.0 CYRILLIC SMALL LETTER REVERSED ZE -0512 ; mapped ; 0513 # 5.0 CYRILLIC CAPITAL LETTER EL WITH HOOK -0513 ; valid # 5.0 CYRILLIC SMALL LETTER EL WITH HOOK -0514 ; mapped ; 0515 # 5.1 CYRILLIC CAPITAL LETTER LHA -0515 ; valid # 5.1 CYRILLIC SMALL LETTER LHA -0516 ; mapped ; 0517 # 5.1 CYRILLIC CAPITAL LETTER RHA -0517 ; valid # 5.1 CYRILLIC SMALL LETTER RHA -0518 ; mapped ; 0519 # 5.1 CYRILLIC CAPITAL LETTER YAE -0519 ; valid # 5.1 CYRILLIC SMALL LETTER YAE -051A ; mapped ; 051B # 5.1 CYRILLIC CAPITAL LETTER QA -051B ; valid # 5.1 CYRILLIC SMALL LETTER QA -051C ; mapped ; 051D # 5.1 CYRILLIC CAPITAL LETTER WE -051D ; valid # 5.1 CYRILLIC SMALL LETTER WE -051E ; mapped ; 051F # 5.1 CYRILLIC CAPITAL LETTER ALEUT KA -051F ; valid # 5.1 CYRILLIC SMALL LETTER ALEUT KA -0520 ; mapped ; 0521 # 5.1 CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK -0521 ; valid # 5.1 CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK -0522 ; mapped ; 0523 # 5.1 CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK -0523 ; valid # 5.1 CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK -0524 ; mapped ; 0525 # 5.2 CYRILLIC CAPITAL LETTER PE WITH DESCENDER -0525 ; valid # 5.2 CYRILLIC SMALL LETTER PE WITH DESCENDER -0526 ; mapped ; 0527 # 6.0 CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER -0527 ; valid # 6.0 CYRILLIC SMALL LETTER SHHA WITH DESCENDER -0528 ; mapped ; 0529 # 7.0 CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK -0529 ; valid # 7.0 CYRILLIC SMALL LETTER EN WITH LEFT HOOK -052A ; mapped ; 052B # 7.0 CYRILLIC CAPITAL LETTER DZZHE -052B ; valid # 7.0 CYRILLIC SMALL LETTER DZZHE -052C ; mapped ; 052D # 7.0 CYRILLIC CAPITAL LETTER DCHE -052D ; valid # 7.0 CYRILLIC SMALL LETTER DCHE -052E ; mapped ; 052F # 7.0 CYRILLIC CAPITAL LETTER EL WITH DESCENDER -052F ; valid # 7.0 CYRILLIC SMALL LETTER EL WITH DESCENDER -0530 ; disallowed # NA -0531 ; mapped ; 0561 # 1.1 ARMENIAN CAPITAL LETTER AYB -0532 ; mapped ; 0562 # 1.1 ARMENIAN CAPITAL LETTER BEN -0533 ; mapped ; 0563 # 1.1 ARMENIAN CAPITAL LETTER GIM -0534 ; mapped ; 0564 # 1.1 ARMENIAN CAPITAL LETTER DA -0535 ; mapped ; 0565 # 1.1 ARMENIAN CAPITAL LETTER ECH -0536 ; mapped ; 0566 # 1.1 ARMENIAN CAPITAL LETTER ZA -0537 ; mapped ; 0567 # 1.1 ARMENIAN CAPITAL LETTER EH -0538 ; mapped ; 0568 # 1.1 ARMENIAN CAPITAL LETTER ET -0539 ; mapped ; 0569 # 1.1 ARMENIAN CAPITAL LETTER TO -053A ; mapped ; 056A # 1.1 ARMENIAN CAPITAL LETTER ZHE -053B ; mapped ; 056B # 1.1 ARMENIAN CAPITAL LETTER INI -053C ; mapped ; 056C # 1.1 ARMENIAN CAPITAL LETTER LIWN -053D ; mapped ; 056D # 1.1 ARMENIAN CAPITAL LETTER XEH -053E ; mapped ; 056E # 1.1 ARMENIAN CAPITAL LETTER CA -053F ; mapped ; 056F # 1.1 ARMENIAN CAPITAL LETTER KEN -0540 ; mapped ; 0570 # 1.1 ARMENIAN CAPITAL LETTER HO -0541 ; mapped ; 0571 # 1.1 ARMENIAN CAPITAL LETTER JA -0542 ; mapped ; 0572 # 1.1 ARMENIAN CAPITAL LETTER GHAD -0543 ; mapped ; 0573 # 1.1 ARMENIAN CAPITAL LETTER CHEH -0544 ; mapped ; 0574 # 1.1 ARMENIAN CAPITAL LETTER MEN -0545 ; mapped ; 0575 # 1.1 ARMENIAN CAPITAL LETTER YI -0546 ; mapped ; 0576 # 1.1 ARMENIAN CAPITAL LETTER NOW -0547 ; mapped ; 0577 # 1.1 ARMENIAN CAPITAL LETTER SHA -0548 ; mapped ; 0578 # 1.1 ARMENIAN CAPITAL LETTER VO -0549 ; mapped ; 0579 # 1.1 ARMENIAN CAPITAL LETTER CHA -054A ; mapped ; 057A # 1.1 ARMENIAN CAPITAL LETTER PEH -054B ; mapped ; 057B # 1.1 ARMENIAN CAPITAL LETTER JHEH -054C ; mapped ; 057C # 1.1 ARMENIAN CAPITAL LETTER RA -054D ; mapped ; 057D # 1.1 ARMENIAN CAPITAL LETTER SEH -054E ; mapped ; 057E # 1.1 ARMENIAN CAPITAL LETTER VEW -054F ; mapped ; 057F # 1.1 ARMENIAN CAPITAL LETTER TIWN -0550 ; mapped ; 0580 # 1.1 ARMENIAN CAPITAL LETTER REH -0551 ; mapped ; 0581 # 1.1 ARMENIAN CAPITAL LETTER CO -0552 ; mapped ; 0582 # 1.1 ARMENIAN CAPITAL LETTER YIWN -0553 ; mapped ; 0583 # 1.1 ARMENIAN CAPITAL LETTER PIWR -0554 ; mapped ; 0584 # 1.1 ARMENIAN CAPITAL LETTER KEH -0555 ; mapped ; 0585 # 1.1 ARMENIAN CAPITAL LETTER OH -0556 ; mapped ; 0586 # 1.1 ARMENIAN CAPITAL LETTER FEH -0557..0558 ; disallowed # NA .. -0559 ; valid # 1.1 ARMENIAN MODIFIER LETTER LEFT HALF RING -055A..055F ; valid ; ; NV8 # 1.1 ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK -0560 ; disallowed # NA -0561..0586 ; valid # 1.1 ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LETTER FEH -0587 ; mapped ; 0565 0582 # 1.1 ARMENIAN SMALL LIGATURE ECH YIWN -0588 ; disallowed # NA -0589 ; valid ; ; NV8 # 1.1 ARMENIAN FULL STOP -058A ; valid ; ; NV8 # 3.0 ARMENIAN HYPHEN -058B..058C ; disallowed # NA .. -058D..058E ; valid ; ; NV8 # 7.0 RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN -058F ; valid ; ; NV8 # 6.1 ARMENIAN DRAM SIGN -0590 ; disallowed # NA -0591..05A1 ; valid # 2.0 HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER -05A2 ; valid # 4.1 HEBREW ACCENT ATNAH HAFUKH -05A3..05AF ; valid # 2.0 HEBREW ACCENT MUNAH..HEBREW MARK MASORA CIRCLE -05B0..05B9 ; valid # 1.1 HEBREW POINT SHEVA..HEBREW POINT HOLAM -05BA ; valid # 5.0 HEBREW POINT HOLAM HASER FOR VAV -05BB..05BD ; valid # 1.1 HEBREW POINT QUBUTS..HEBREW POINT METEG -05BE ; valid ; ; NV8 # 1.1 HEBREW PUNCTUATION MAQAF -05BF ; valid # 1.1 HEBREW POINT RAFE -05C0 ; valid ; ; NV8 # 1.1 HEBREW PUNCTUATION PASEQ -05C1..05C2 ; valid # 1.1 HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C3 ; valid ; ; NV8 # 1.1 HEBREW PUNCTUATION SOF PASUQ -05C4 ; valid # 2.0 HEBREW MARK UPPER DOT -05C5 ; valid # 4.1 HEBREW MARK LOWER DOT -05C6 ; valid ; ; NV8 # 4.1 HEBREW PUNCTUATION NUN HAFUKHA -05C7 ; valid # 4.1 HEBREW POINT QAMATS QATAN -05C8..05CF ; disallowed # NA .. -05D0..05EA ; valid # 1.1 HEBREW LETTER ALEF..HEBREW LETTER TAV -05EB..05EF ; disallowed # NA .. -05F0..05F4 ; valid # 1.1 HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW PUNCTUATION GERSHAYIM -05F5..05FF ; disallowed # NA .. -0600..0603 ; disallowed # 4.0 ARABIC NUMBER SIGN..ARABIC SIGN SAFHA -0604 ; disallowed # 6.1 ARABIC SIGN SAMVAT -0605 ; disallowed # 7.0 ARABIC NUMBER MARK ABOVE -0606..060A ; valid ; ; NV8 # 5.1 ARABIC-INDIC CUBE ROOT..ARABIC-INDIC PER TEN THOUSAND SIGN -060B ; valid ; ; NV8 # 4.1 AFGHANI SIGN -060C ; valid ; ; NV8 # 1.1 ARABIC COMMA -060D..060F ; valid ; ; NV8 # 4.0 ARABIC DATE SEPARATOR..ARABIC SIGN MISRA -0610..0615 ; valid # 4.0 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH -0616..061A ; valid # 5.1 ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH..ARABIC SMALL KASRA -061B ; valid ; ; NV8 # 1.1 ARABIC SEMICOLON -061C ; disallowed # 6.3 ARABIC LETTER MARK -061D ; disallowed # NA -061E ; valid ; ; NV8 # 4.1 ARABIC TRIPLE DOT PUNCTUATION MARK -061F ; valid ; ; NV8 # 1.1 ARABIC QUESTION MARK -0620 ; valid # 6.0 ARABIC LETTER KASHMIRI YEH -0621..063A ; valid # 1.1 ARABIC LETTER HAMZA..ARABIC LETTER GHAIN -063B..063F ; valid # 5.1 ARABIC LETTER KEHEH WITH TWO DOTS ABOVE..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE -0640 ; valid ; ; NV8 # 1.1 ARABIC TATWEEL -0641..0652 ; valid # 1.1 ARABIC LETTER FEH..ARABIC SUKUN -0653..0655 ; valid # 3.0 ARABIC MADDAH ABOVE..ARABIC HAMZA BELOW -0656..0658 ; valid # 4.0 ARABIC SUBSCRIPT ALEF..ARABIC MARK NOON GHUNNA -0659..065E ; valid # 4.1 ARABIC ZWARAKAY..ARABIC FATHA WITH TWO DOTS -065F ; valid # 6.0 ARABIC WAVY HAMZA BELOW -0660..0669 ; valid # 1.1 ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE -066A..066D ; valid ; ; NV8 # 1.1 ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR -066E..066F ; valid # 3.2 ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0670..0674 ; valid # 1.1 ARABIC LETTER SUPERSCRIPT ALEF..ARABIC LETTER HIGH HAMZA -0675 ; mapped ; 0627 0674 # 1.1 ARABIC LETTER HIGH HAMZA ALEF -0676 ; mapped ; 0648 0674 # 1.1 ARABIC LETTER HIGH HAMZA WAW -0677 ; mapped ; 06C7 0674 # 1.1 ARABIC LETTER U WITH HAMZA ABOVE -0678 ; mapped ; 064A 0674 # 1.1 ARABIC LETTER HIGH HAMZA YEH -0679..06B7 ; valid # 1.1 ARABIC LETTER TTEH..ARABIC LETTER LAM WITH THREE DOTS ABOVE -06B8..06B9 ; valid # 3.0 ARABIC LETTER LAM WITH THREE DOTS BELOW..ARABIC LETTER NOON WITH DOT BELOW -06BA..06BE ; valid # 1.1 ARABIC LETTER NOON GHUNNA..ARABIC LETTER HEH DOACHASHMEE -06BF ; valid # 3.0 ARABIC LETTER TCHEH WITH DOT ABOVE -06C0..06CE ; valid # 1.1 ARABIC LETTER HEH WITH YEH ABOVE..ARABIC LETTER YEH WITH SMALL V -06CF ; valid # 3.0 ARABIC LETTER WAW WITH DOT ABOVE -06D0..06D3 ; valid # 1.1 ARABIC LETTER E..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D4 ; valid ; ; NV8 # 1.1 ARABIC FULL STOP -06D5..06DC ; valid # 1.1 ARABIC LETTER AE..ARABIC SMALL HIGH SEEN -06DD ; disallowed # 1.1 ARABIC END OF AYAH -06DE ; valid ; ; NV8 # 1.1 ARABIC START OF RUB EL HIZB -06DF..06E8 ; valid # 1.1 ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH NOON -06E9 ; valid ; ; NV8 # 1.1 ARABIC PLACE OF SAJDAH -06EA..06ED ; valid # 1.1 ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -06EE..06EF ; valid # 4.0 ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06F0..06F9 ; valid # 1.1 EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE -06FA..06FE ; valid # 3.0 ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC SIGN SINDHI POSTPOSITION MEN -06FF ; valid # 4.0 ARABIC LETTER HEH WITH INVERTED V -0700..070D ; valid ; ; NV8 # 3.0 SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS -070E ; disallowed # NA -070F ; disallowed # 3.0 SYRIAC ABBREVIATION MARK -0710..072C ; valid # 3.0 SYRIAC LETTER ALAPH..SYRIAC LETTER TAW -072D..072F ; valid # 4.0 SYRIAC LETTER PERSIAN BHETH..SYRIAC LETTER PERSIAN DHALATH -0730..074A ; valid # 3.0 SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -074B..074C ; disallowed # NA .. -074D..074F ; valid # 4.0 SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0750..076D ; valid # 4.1 ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE -076E..077F ; valid # 5.1 ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE -0780..07B0 ; valid # 3.0 THAANA LETTER HAA..THAANA SUKUN -07B1 ; valid # 3.2 THAANA LETTER NAA -07B2..07BF ; disallowed # NA .. -07C0..07F5 ; valid # 5.0 NKO DIGIT ZERO..NKO LOW TONE APOSTROPHE -07F6..07FA ; valid ; ; NV8 # 5.0 NKO SYMBOL OO DENNEN..NKO LAJANYALAN -07FB..07FF ; disallowed # NA .. -0800..082D ; valid # 5.2 SAMARITAN LETTER ALAF..SAMARITAN MARK NEQUDAA -082E..082F ; disallowed # NA .. -0830..083E ; valid ; ; NV8 # 5.2 SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU -083F ; disallowed # NA -0840..085B ; valid # 6.0 MANDAIC LETTER HALQA..MANDAIC GEMINATION MARK -085C..085D ; disallowed # NA .. -085E ; valid ; ; NV8 # 6.0 MANDAIC PUNCTUATION -085F ; disallowed # NA -0860..086A ; valid # 10.0 SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA -086B..089F ; disallowed # NA .. -08A0 ; valid # 6.1 ARABIC LETTER BEH WITH SMALL V BELOW -08A1 ; valid # 7.0 ARABIC LETTER BEH WITH HAMZA ABOVE -08A2..08AC ; valid # 6.1 ARABIC LETTER JEEM WITH TWO DOTS ABOVE..ARABIC LETTER ROHINGYA YEH -08AD..08B2 ; valid # 7.0 ARABIC LETTER LOW ALEF..ARABIC LETTER ZAIN WITH INVERTED V ABOVE -08B3..08B4 ; valid # 8.0 ARABIC LETTER AIN WITH THREE DOTS BELOW..ARABIC LETTER KAF WITH DOT BELOW -08B5 ; disallowed # NA -08B6..08BD ; valid # 9.0 ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON -08BE..08D3 ; disallowed # NA .. -08D4..08E1 ; valid # 9.0 ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA -08E2 ; disallowed # 9.0 ARABIC DISPUTED END OF AYAH -08E3 ; valid # 8.0 ARABIC TURNED DAMMA BELOW -08E4..08FE ; valid # 6.1 ARABIC CURLY FATHA..ARABIC DAMMA WITH DOT -08FF ; valid # 7.0 ARABIC MARK SIDEWAYS NOON GHUNNA -0900 ; valid # 5.2 DEVANAGARI SIGN INVERTED CANDRABINDU -0901..0903 ; valid # 1.1 DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN VISARGA -0904 ; valid # 4.0 DEVANAGARI LETTER SHORT A -0905..0939 ; valid # 1.1 DEVANAGARI LETTER A..DEVANAGARI LETTER HA -093A..093B ; valid # 6.0 DEVANAGARI VOWEL SIGN OE..DEVANAGARI VOWEL SIGN OOE -093C..094D ; valid # 1.1 DEVANAGARI SIGN NUKTA..DEVANAGARI SIGN VIRAMA -094E ; valid # 5.2 DEVANAGARI VOWEL SIGN PRISHTHAMATRA E -094F ; valid # 6.0 DEVANAGARI VOWEL SIGN AW -0950..0954 ; valid # 1.1 DEVANAGARI OM..DEVANAGARI ACUTE ACCENT -0955 ; valid # 5.2 DEVANAGARI VOWEL SIGN CANDRA LONG E -0956..0957 ; valid # 6.0 DEVANAGARI VOWEL SIGN UE..DEVANAGARI VOWEL SIGN UUE -0958 ; mapped ; 0915 093C # 1.1 DEVANAGARI LETTER QA -0959 ; mapped ; 0916 093C # 1.1 DEVANAGARI LETTER KHHA -095A ; mapped ; 0917 093C # 1.1 DEVANAGARI LETTER GHHA -095B ; mapped ; 091C 093C # 1.1 DEVANAGARI LETTER ZA -095C ; mapped ; 0921 093C # 1.1 DEVANAGARI LETTER DDDHA -095D ; mapped ; 0922 093C # 1.1 DEVANAGARI LETTER RHA -095E ; mapped ; 092B 093C # 1.1 DEVANAGARI LETTER FA -095F ; mapped ; 092F 093C # 1.1 DEVANAGARI LETTER YYA -0960..0963 ; valid # 1.1 DEVANAGARI LETTER VOCALIC RR..DEVANAGARI VOWEL SIGN VOCALIC LL -0964..0965 ; valid ; ; NV8 # 1.1 DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA -0966..096F ; valid # 1.1 DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE -0970 ; valid ; ; NV8 # 1.1 DEVANAGARI ABBREVIATION SIGN -0971..0972 ; valid # 5.1 DEVANAGARI SIGN HIGH SPACING DOT..DEVANAGARI LETTER CANDRA A -0973..0977 ; valid # 6.0 DEVANAGARI LETTER OE..DEVANAGARI LETTER UUE -0978 ; valid # 7.0 DEVANAGARI LETTER MARWARI DDA -0979..097A ; valid # 5.2 DEVANAGARI LETTER ZHA..DEVANAGARI LETTER HEAVY YA -097B..097C ; valid # 5.0 DEVANAGARI LETTER GGA..DEVANAGARI LETTER JJA -097D ; valid # 4.1 DEVANAGARI LETTER GLOTTAL STOP -097E..097F ; valid # 5.0 DEVANAGARI LETTER DDDA..DEVANAGARI LETTER BBA -0980 ; valid # 7.0 BENGALI ANJI -0981..0983 ; valid # 1.1 BENGALI SIGN CANDRABINDU..BENGALI SIGN VISARGA -0984 ; disallowed # NA -0985..098C ; valid # 1.1 BENGALI LETTER A..BENGALI LETTER VOCALIC L -098D..098E ; disallowed # NA .. -098F..0990 ; valid # 1.1 BENGALI LETTER E..BENGALI LETTER AI -0991..0992 ; disallowed # NA .. -0993..09A8 ; valid # 1.1 BENGALI LETTER O..BENGALI LETTER NA -09A9 ; disallowed # NA -09AA..09B0 ; valid # 1.1 BENGALI LETTER PA..BENGALI LETTER RA -09B1 ; disallowed # NA -09B2 ; valid # 1.1 BENGALI LETTER LA -09B3..09B5 ; disallowed # NA .. -09B6..09B9 ; valid # 1.1 BENGALI LETTER SHA..BENGALI LETTER HA -09BA..09BB ; disallowed # NA .. -09BC ; valid # 1.1 BENGALI SIGN NUKTA -09BD ; valid # 4.0 BENGALI SIGN AVAGRAHA -09BE..09C4 ; valid # 1.1 BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN VOCALIC RR -09C5..09C6 ; disallowed # NA .. -09C7..09C8 ; valid # 1.1 BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09C9..09CA ; disallowed # NA .. -09CB..09CD ; valid # 1.1 BENGALI VOWEL SIGN O..BENGALI SIGN VIRAMA -09CE ; valid # 4.1 BENGALI LETTER KHANDA TA -09CF..09D6 ; disallowed # NA .. -09D7 ; valid # 1.1 BENGALI AU LENGTH MARK -09D8..09DB ; disallowed # NA .. -09DC ; mapped ; 09A1 09BC # 1.1 BENGALI LETTER RRA -09DD ; mapped ; 09A2 09BC # 1.1 BENGALI LETTER RHA -09DE ; disallowed # NA -09DF ; mapped ; 09AF 09BC # 1.1 BENGALI LETTER YYA -09E0..09E3 ; valid # 1.1 BENGALI LETTER VOCALIC RR..BENGALI VOWEL SIGN VOCALIC LL -09E4..09E5 ; disallowed # NA .. -09E6..09F1 ; valid # 1.1 BENGALI DIGIT ZERO..BENGALI LETTER RA WITH LOWER DIAGONAL -09F2..09FA ; valid ; ; NV8 # 1.1 BENGALI RUPEE MARK..BENGALI ISSHAR -09FB ; valid ; ; NV8 # 5.2 BENGALI GANDA MARK -09FC ; valid # 10.0 BENGALI LETTER VEDIC ANUSVARA -09FD ; valid ; ; NV8 # 10.0 BENGALI ABBREVIATION SIGN -09FE..0A00 ; disallowed # NA .. -0A01 ; valid # 4.0 GURMUKHI SIGN ADAK BINDI -0A02 ; valid # 1.1 GURMUKHI SIGN BINDI -0A03 ; valid # 4.0 GURMUKHI SIGN VISARGA -0A04 ; disallowed # NA -0A05..0A0A ; valid # 1.1 GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0B..0A0E ; disallowed # NA .. -0A0F..0A10 ; valid # 1.1 GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A11..0A12 ; disallowed # NA .. -0A13..0A28 ; valid # 1.1 GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A29 ; disallowed # NA -0A2A..0A30 ; valid # 1.1 GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A31 ; disallowed # NA -0A32 ; valid # 1.1 GURMUKHI LETTER LA -0A33 ; mapped ; 0A32 0A3C # 1.1 GURMUKHI LETTER LLA -0A34 ; disallowed # NA -0A35 ; valid # 1.1 GURMUKHI LETTER VA -0A36 ; mapped ; 0A38 0A3C # 1.1 GURMUKHI LETTER SHA -0A37 ; disallowed # NA -0A38..0A39 ; valid # 1.1 GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3A..0A3B ; disallowed # NA .. -0A3C ; valid # 1.1 GURMUKHI SIGN NUKTA -0A3D ; disallowed # NA -0A3E..0A42 ; valid # 1.1 GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN UU -0A43..0A46 ; disallowed # NA .. -0A47..0A48 ; valid # 1.1 GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A49..0A4A ; disallowed # NA .. -0A4B..0A4D ; valid # 1.1 GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A4E..0A50 ; disallowed # NA .. -0A51 ; valid # 5.1 GURMUKHI SIGN UDAAT -0A52..0A58 ; disallowed # NA .. -0A59 ; mapped ; 0A16 0A3C # 1.1 GURMUKHI LETTER KHHA -0A5A ; mapped ; 0A17 0A3C # 1.1 GURMUKHI LETTER GHHA -0A5B ; mapped ; 0A1C 0A3C # 1.1 GURMUKHI LETTER ZA -0A5C ; valid # 1.1 GURMUKHI LETTER RRA -0A5D ; disallowed # NA -0A5E ; mapped ; 0A2B 0A3C # 1.1 GURMUKHI LETTER FA -0A5F..0A65 ; disallowed # NA .. -0A66..0A74 ; valid # 1.1 GURMUKHI DIGIT ZERO..GURMUKHI EK ONKAR -0A75 ; valid # 5.1 GURMUKHI SIGN YAKASH -0A76..0A80 ; disallowed # NA .. -0A81..0A83 ; valid # 1.1 GUJARATI SIGN CANDRABINDU..GUJARATI SIGN VISARGA -0A84 ; disallowed # NA -0A85..0A8B ; valid # 1.1 GUJARATI LETTER A..GUJARATI LETTER VOCALIC R -0A8C ; valid # 4.0 GUJARATI LETTER VOCALIC L -0A8D ; valid # 1.1 GUJARATI VOWEL CANDRA E -0A8E ; disallowed # NA -0A8F..0A91 ; valid # 1.1 GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A92 ; disallowed # NA -0A93..0AA8 ; valid # 1.1 GUJARATI LETTER O..GUJARATI LETTER NA -0AA9 ; disallowed # NA -0AAA..0AB0 ; valid # 1.1 GUJARATI LETTER PA..GUJARATI LETTER RA -0AB1 ; disallowed # NA -0AB2..0AB3 ; valid # 1.1 GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB4 ; disallowed # NA -0AB5..0AB9 ; valid # 1.1 GUJARATI LETTER VA..GUJARATI LETTER HA -0ABA..0ABB ; disallowed # NA .. -0ABC..0AC5 ; valid # 1.1 GUJARATI SIGN NUKTA..GUJARATI VOWEL SIGN CANDRA E -0AC6 ; disallowed # NA -0AC7..0AC9 ; valid # 1.1 GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN CANDRA O -0ACA ; disallowed # NA -0ACB..0ACD ; valid # 1.1 GUJARATI VOWEL SIGN O..GUJARATI SIGN VIRAMA -0ACE..0ACF ; disallowed # NA .. -0AD0 ; valid # 1.1 GUJARATI OM -0AD1..0ADF ; disallowed # NA .. -0AE0 ; valid # 1.1 GUJARATI LETTER VOCALIC RR -0AE1..0AE3 ; valid # 4.0 GUJARATI LETTER VOCALIC LL..GUJARATI VOWEL SIGN VOCALIC LL -0AE4..0AE5 ; disallowed # NA .. -0AE6..0AEF ; valid # 1.1 GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE -0AF0 ; valid ; ; NV8 # 6.1 GUJARATI ABBREVIATION SIGN -0AF1 ; valid ; ; NV8 # 4.0 GUJARATI RUPEE SIGN -0AF2..0AF8 ; disallowed # NA .. -0AF9 ; valid # 8.0 GUJARATI LETTER ZHA -0AFA..0AFF ; valid # 10.0 GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE -0B00 ; disallowed # NA -0B01..0B03 ; valid # 1.1 ORIYA SIGN CANDRABINDU..ORIYA SIGN VISARGA -0B04 ; disallowed # NA -0B05..0B0C ; valid # 1.1 ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0D..0B0E ; disallowed # NA .. -0B0F..0B10 ; valid # 1.1 ORIYA LETTER E..ORIYA LETTER AI -0B11..0B12 ; disallowed # NA .. -0B13..0B28 ; valid # 1.1 ORIYA LETTER O..ORIYA LETTER NA -0B29 ; disallowed # NA -0B2A..0B30 ; valid # 1.1 ORIYA LETTER PA..ORIYA LETTER RA -0B31 ; disallowed # NA -0B32..0B33 ; valid # 1.1 ORIYA LETTER LA..ORIYA LETTER LLA -0B34 ; disallowed # NA -0B35 ; valid # 4.0 ORIYA LETTER VA -0B36..0B39 ; valid # 1.1 ORIYA LETTER SHA..ORIYA LETTER HA -0B3A..0B3B ; disallowed # NA .. -0B3C..0B43 ; valid # 1.1 ORIYA SIGN NUKTA..ORIYA VOWEL SIGN VOCALIC R -0B44 ; valid # 5.1 ORIYA VOWEL SIGN VOCALIC RR -0B45..0B46 ; disallowed # NA .. -0B47..0B48 ; valid # 1.1 ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B49..0B4A ; disallowed # NA .. -0B4B..0B4D ; valid # 1.1 ORIYA VOWEL SIGN O..ORIYA SIGN VIRAMA -0B4E..0B55 ; disallowed # NA .. -0B56..0B57 ; valid # 1.1 ORIYA AI LENGTH MARK..ORIYA AU LENGTH MARK -0B58..0B5B ; disallowed # NA .. -0B5C ; mapped ; 0B21 0B3C # 1.1 ORIYA LETTER RRA -0B5D ; mapped ; 0B22 0B3C # 1.1 ORIYA LETTER RHA -0B5E ; disallowed # NA -0B5F..0B61 ; valid # 1.1 ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B62..0B63 ; valid # 5.1 ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL -0B64..0B65 ; disallowed # NA .. -0B66..0B6F ; valid # 1.1 ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0B70 ; valid ; ; NV8 # 1.1 ORIYA ISSHAR -0B71 ; valid # 4.0 ORIYA LETTER WA -0B72..0B77 ; valid ; ; NV8 # 6.0 ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS -0B78..0B81 ; disallowed # NA .. -0B82..0B83 ; valid # 1.1 TAMIL SIGN ANUSVARA..TAMIL SIGN VISARGA -0B84 ; disallowed # NA -0B85..0B8A ; valid # 1.1 TAMIL LETTER A..TAMIL LETTER UU -0B8B..0B8D ; disallowed # NA .. -0B8E..0B90 ; valid # 1.1 TAMIL LETTER E..TAMIL LETTER AI -0B91 ; disallowed # NA -0B92..0B95 ; valid # 1.1 TAMIL LETTER O..TAMIL LETTER KA -0B96..0B98 ; disallowed # NA .. -0B99..0B9A ; valid # 1.1 TAMIL LETTER NGA..TAMIL LETTER CA -0B9B ; disallowed # NA -0B9C ; valid # 1.1 TAMIL LETTER JA -0B9D ; disallowed # NA -0B9E..0B9F ; valid # 1.1 TAMIL LETTER NYA..TAMIL LETTER TTA -0BA0..0BA2 ; disallowed # NA .. -0BA3..0BA4 ; valid # 1.1 TAMIL LETTER NNA..TAMIL LETTER TA -0BA5..0BA7 ; disallowed # NA .. -0BA8..0BAA ; valid # 1.1 TAMIL LETTER NA..TAMIL LETTER PA -0BAB..0BAD ; disallowed # NA .. -0BAE..0BB5 ; valid # 1.1 TAMIL LETTER MA..TAMIL LETTER VA -0BB6 ; valid # 4.1 TAMIL LETTER SHA -0BB7..0BB9 ; valid # 1.1 TAMIL LETTER SSA..TAMIL LETTER HA -0BBA..0BBD ; disallowed # NA .. -0BBE..0BC2 ; valid # 1.1 TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN UU -0BC3..0BC5 ; disallowed # NA .. -0BC6..0BC8 ; valid # 1.1 TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BC9 ; disallowed # NA -0BCA..0BCD ; valid # 1.1 TAMIL VOWEL SIGN O..TAMIL SIGN VIRAMA -0BCE..0BCF ; disallowed # NA .. -0BD0 ; valid # 5.1 TAMIL OM -0BD1..0BD6 ; disallowed # NA .. -0BD7 ; valid # 1.1 TAMIL AU LENGTH MARK -0BD8..0BE5 ; disallowed # NA .. -0BE6 ; valid # 4.1 TAMIL DIGIT ZERO -0BE7..0BEF ; valid # 1.1 TAMIL DIGIT ONE..TAMIL DIGIT NINE -0BF0..0BF2 ; valid ; ; NV8 # 1.1 TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND -0BF3..0BFA ; valid ; ; NV8 # 4.0 TAMIL DAY SIGN..TAMIL NUMBER SIGN -0BFB..0BFF ; disallowed # NA .. -0C00 ; valid # 7.0 TELUGU SIGN COMBINING CANDRABINDU ABOVE -0C01..0C03 ; valid # 1.1 TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C04 ; disallowed # NA -0C05..0C0C ; valid # 1.1 TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0D ; disallowed # NA -0C0E..0C10 ; valid # 1.1 TELUGU LETTER E..TELUGU LETTER AI -0C11 ; disallowed # NA -0C12..0C28 ; valid # 1.1 TELUGU LETTER O..TELUGU LETTER NA -0C29 ; disallowed # NA -0C2A..0C33 ; valid # 1.1 TELUGU LETTER PA..TELUGU LETTER LLA -0C34 ; valid # 7.0 TELUGU LETTER LLLA -0C35..0C39 ; valid # 1.1 TELUGU LETTER VA..TELUGU LETTER HA -0C3A..0C3C ; disallowed # NA .. -0C3D ; valid # 5.1 TELUGU SIGN AVAGRAHA -0C3E..0C44 ; valid # 1.1 TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN VOCALIC RR -0C45 ; disallowed # NA -0C46..0C48 ; valid # 1.1 TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C49 ; disallowed # NA -0C4A..0C4D ; valid # 1.1 TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C4E..0C54 ; disallowed # NA .. -0C55..0C56 ; valid # 1.1 TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C57 ; disallowed # NA -0C58..0C59 ; valid # 5.1 TELUGU LETTER TSA..TELUGU LETTER DZA -0C5A ; valid # 8.0 TELUGU LETTER RRRA -0C5B..0C5F ; disallowed # NA .. -0C60..0C61 ; valid # 1.1 TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C62..0C63 ; valid # 5.1 TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL -0C64..0C65 ; disallowed # NA .. -0C66..0C6F ; valid # 1.1 TELUGU DIGIT ZERO..TELUGU DIGIT NINE -0C70..0C77 ; disallowed # NA .. -0C78..0C7F ; valid ; ; NV8 # 5.1 TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU SIGN TUUMU -0C80 ; valid # 9.0 KANNADA SIGN SPACING CANDRABINDU -0C81 ; valid # 7.0 KANNADA SIGN CANDRABINDU -0C82..0C83 ; valid # 1.1 KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C84 ; disallowed # NA -0C85..0C8C ; valid # 1.1 KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8D ; disallowed # NA -0C8E..0C90 ; valid # 1.1 KANNADA LETTER E..KANNADA LETTER AI -0C91 ; disallowed # NA -0C92..0CA8 ; valid # 1.1 KANNADA LETTER O..KANNADA LETTER NA -0CA9 ; disallowed # NA -0CAA..0CB3 ; valid # 1.1 KANNADA LETTER PA..KANNADA LETTER LLA -0CB4 ; disallowed # NA -0CB5..0CB9 ; valid # 1.1 KANNADA LETTER VA..KANNADA LETTER HA -0CBA..0CBB ; disallowed # NA .. -0CBC..0CBD ; valid # 4.0 KANNADA SIGN NUKTA..KANNADA SIGN AVAGRAHA -0CBE..0CC4 ; valid # 1.1 KANNADA VOWEL SIGN AA..KANNADA VOWEL SIGN VOCALIC RR -0CC5 ; disallowed # NA -0CC6..0CC8 ; valid # 1.1 KANNADA VOWEL SIGN E..KANNADA VOWEL SIGN AI -0CC9 ; disallowed # NA -0CCA..0CCD ; valid # 1.1 KANNADA VOWEL SIGN O..KANNADA SIGN VIRAMA -0CCE..0CD4 ; disallowed # NA .. -0CD5..0CD6 ; valid # 1.1 KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CD7..0CDD ; disallowed # NA .. -0CDE ; valid # 1.1 KANNADA LETTER FA -0CDF ; disallowed # NA -0CE0..0CE1 ; valid # 1.1 KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0CE2..0CE3 ; valid # 5.0 KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0CE4..0CE5 ; disallowed # NA .. -0CE6..0CEF ; valid # 1.1 KANNADA DIGIT ZERO..KANNADA DIGIT NINE -0CF0 ; disallowed # NA -0CF1..0CF2 ; valid # 5.0 KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA -0CF3..0CFF ; disallowed # NA .. -0D00 ; valid # 10.0 MALAYALAM SIGN COMBINING ANUSVARA ABOVE -0D01 ; valid # 7.0 MALAYALAM SIGN CANDRABINDU -0D02..0D03 ; valid # 1.1 MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D04 ; disallowed # NA -0D05..0D0C ; valid # 1.1 MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0D ; disallowed # NA -0D0E..0D10 ; valid # 1.1 MALAYALAM LETTER E..MALAYALAM LETTER AI -0D11 ; disallowed # NA -0D12..0D28 ; valid # 1.1 MALAYALAM LETTER O..MALAYALAM LETTER NA -0D29 ; valid # 6.0 MALAYALAM LETTER NNNA -0D2A..0D39 ; valid # 1.1 MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D3A ; valid # 6.0 MALAYALAM LETTER TTTA -0D3B..0D3C ; valid # 10.0 MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA -0D3D ; valid # 5.1 MALAYALAM SIGN AVAGRAHA -0D3E..0D43 ; valid # 1.1 MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN VOCALIC R -0D44 ; valid # 5.1 MALAYALAM VOWEL SIGN VOCALIC RR -0D45 ; disallowed # NA -0D46..0D48 ; valid # 1.1 MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D49 ; disallowed # NA -0D4A..0D4D ; valid # 1.1 MALAYALAM VOWEL SIGN O..MALAYALAM SIGN VIRAMA -0D4E ; valid # 6.0 MALAYALAM LETTER DOT REPH -0D4F ; valid ; ; NV8 # 9.0 MALAYALAM SIGN PARA -0D50..0D53 ; disallowed # NA .. -0D54..0D56 ; valid # 9.0 MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL -0D57 ; valid # 1.1 MALAYALAM AU LENGTH MARK -0D58..0D5E ; valid ; ; NV8 # 9.0 MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH -0D5F ; valid # 8.0 MALAYALAM LETTER ARCHAIC II -0D60..0D61 ; valid # 1.1 MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D62..0D63 ; valid # 5.1 MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL -0D64..0D65 ; disallowed # NA .. -0D66..0D6F ; valid # 1.1 MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D70..0D75 ; valid ; ; NV8 # 5.1 MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS -0D76..0D78 ; valid ; ; NV8 # 9.0 MALAYALAM FRACTION ONE SIXTEENTH..MALAYALAM FRACTION THREE SIXTEENTHS -0D79 ; valid ; ; NV8 # 5.1 MALAYALAM DATE MARK -0D7A..0D7F ; valid # 5.1 MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K -0D80..0D81 ; disallowed # NA .. -0D82..0D83 ; valid # 3.0 SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D84 ; disallowed # NA -0D85..0D96 ; valid # 3.0 SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D97..0D99 ; disallowed # NA .. -0D9A..0DB1 ; valid # 3.0 SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB2 ; disallowed # NA -0DB3..0DBB ; valid # 3.0 SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBC ; disallowed # NA -0DBD ; valid # 3.0 SINHALA LETTER DANTAJA LAYANNA -0DBE..0DBF ; disallowed # NA .. -0DC0..0DC6 ; valid # 3.0 SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DC7..0DC9 ; disallowed # NA .. -0DCA ; valid # 3.0 SINHALA SIGN AL-LAKUNA -0DCB..0DCE ; disallowed # NA .. -0DCF..0DD4 ; valid # 3.0 SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD5 ; disallowed # NA -0DD6 ; valid # 3.0 SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD7 ; disallowed # NA -0DD8..0DDF ; valid # 3.0 SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DE0..0DE5 ; disallowed # NA .. -0DE6..0DEF ; valid # 7.0 SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE -0DF0..0DF1 ; disallowed # NA .. -0DF2..0DF3 ; valid # 3.0 SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0DF4 ; valid ; ; NV8 # 3.0 SINHALA PUNCTUATION KUNDDALIYA -0DF5..0E00 ; disallowed # NA .. -0E01..0E32 ; valid # 1.1 THAI CHARACTER KO KAI..THAI CHARACTER SARA AA -0E33 ; mapped ; 0E4D 0E32 # 1.1 THAI CHARACTER SARA AM -0E34..0E3A ; valid # 1.1 THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E3B..0E3E ; disallowed # NA .. -0E3F ; valid ; ; NV8 # 1.1 THAI CURRENCY SYMBOL BAHT -0E40..0E4E ; valid # 1.1 THAI CHARACTER SARA E..THAI CHARACTER YAMAKKAN -0E4F ; valid ; ; NV8 # 1.1 THAI CHARACTER FONGMAN -0E50..0E59 ; valid # 1.1 THAI DIGIT ZERO..THAI DIGIT NINE -0E5A..0E5B ; valid ; ; NV8 # 1.1 THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT -0E5C..0E80 ; disallowed # NA .. -0E81..0E82 ; valid # 1.1 LAO LETTER KO..LAO LETTER KHO SUNG -0E83 ; disallowed # NA -0E84 ; valid # 1.1 LAO LETTER KHO TAM -0E85..0E86 ; disallowed # NA .. -0E87..0E88 ; valid # 1.1 LAO LETTER NGO..LAO LETTER CO -0E89 ; disallowed # NA -0E8A ; valid # 1.1 LAO LETTER SO TAM -0E8B..0E8C ; disallowed # NA .. -0E8D ; valid # 1.1 LAO LETTER NYO -0E8E..0E93 ; disallowed # NA .. -0E94..0E97 ; valid # 1.1 LAO LETTER DO..LAO LETTER THO TAM -0E98 ; disallowed # NA -0E99..0E9F ; valid # 1.1 LAO LETTER NO..LAO LETTER FO SUNG -0EA0 ; disallowed # NA -0EA1..0EA3 ; valid # 1.1 LAO LETTER MO..LAO LETTER LO LING -0EA4 ; disallowed # NA -0EA5 ; valid # 1.1 LAO LETTER LO LOOT -0EA6 ; disallowed # NA -0EA7 ; valid # 1.1 LAO LETTER WO -0EA8..0EA9 ; disallowed # NA .. -0EAA..0EAB ; valid # 1.1 LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAC ; disallowed # NA -0EAD..0EB2 ; valid # 1.1 LAO LETTER O..LAO VOWEL SIGN AA -0EB3 ; mapped ; 0ECD 0EB2 # 1.1 LAO VOWEL SIGN AM -0EB4..0EB9 ; valid # 1.1 LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBA ; disallowed # NA -0EBB..0EBD ; valid # 1.1 LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN NYO -0EBE..0EBF ; disallowed # NA .. -0EC0..0EC4 ; valid # 1.1 LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC5 ; disallowed # NA -0EC6 ; valid # 1.1 LAO KO LA -0EC7 ; disallowed # NA -0EC8..0ECD ; valid # 1.1 LAO TONE MAI EK..LAO NIGGAHITA -0ECE..0ECF ; disallowed # NA .. -0ED0..0ED9 ; valid # 1.1 LAO DIGIT ZERO..LAO DIGIT NINE -0EDA..0EDB ; disallowed # NA .. -0EDC ; mapped ; 0EAB 0E99 # 1.1 LAO HO NO -0EDD ; mapped ; 0EAB 0EA1 # 1.1 LAO HO MO -0EDE..0EDF ; valid # 6.1 LAO LETTER KHMU GO..LAO LETTER KHMU NYO -0EE0..0EFF ; disallowed # NA .. -0F00 ; valid # 2.0 TIBETAN SYLLABLE OM -0F01..0F0A ; valid ; ; NV8 # 2.0 TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK BKA- SHOG YIG MGO -0F0B ; valid # 2.0 TIBETAN MARK INTERSYLLABIC TSHEG -0F0C ; mapped ; 0F0B # 2.0 TIBETAN MARK DELIMITER TSHEG BSTAR -0F0D..0F17 ; valid ; ; NV8 # 2.0 TIBETAN MARK SHAD..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS -0F18..0F19 ; valid # 2.0 TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F1A..0F1F ; valid ; ; NV8 # 2.0 TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG -0F20..0F29 ; valid # 2.0 TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -0F2A..0F34 ; valid ; ; NV8 # 2.0 TIBETAN DIGIT HALF ONE..TIBETAN MARK BSDUS RTAGS -0F35 ; valid # 2.0 TIBETAN MARK NGAS BZUNG NYI ZLA -0F36 ; valid ; ; NV8 # 2.0 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN -0F37 ; valid # 2.0 TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F38 ; valid ; ; NV8 # 2.0 TIBETAN MARK CHE MGO -0F39 ; valid # 2.0 TIBETAN MARK TSA -PHRU -0F3A..0F3D ; valid ; ; NV8 # 2.0 TIBETAN MARK GUG RTAGS GYON..TIBETAN MARK ANG KHANG GYAS -0F3E..0F42 ; valid # 2.0 TIBETAN SIGN YAR TSHES..TIBETAN LETTER GA -0F43 ; mapped ; 0F42 0FB7 # 2.0 TIBETAN LETTER GHA -0F44..0F47 ; valid # 2.0 TIBETAN LETTER NGA..TIBETAN LETTER JA -0F48 ; disallowed # NA -0F49..0F4C ; valid # 2.0 TIBETAN LETTER NYA..TIBETAN LETTER DDA -0F4D ; mapped ; 0F4C 0FB7 # 2.0 TIBETAN LETTER DDHA -0F4E..0F51 ; valid # 2.0 TIBETAN LETTER NNA..TIBETAN LETTER DA -0F52 ; mapped ; 0F51 0FB7 # 2.0 TIBETAN LETTER DHA -0F53..0F56 ; valid # 2.0 TIBETAN LETTER NA..TIBETAN LETTER BA -0F57 ; mapped ; 0F56 0FB7 # 2.0 TIBETAN LETTER BHA -0F58..0F5B ; valid # 2.0 TIBETAN LETTER MA..TIBETAN LETTER DZA -0F5C ; mapped ; 0F5B 0FB7 # 2.0 TIBETAN LETTER DZHA -0F5D..0F68 ; valid # 2.0 TIBETAN LETTER WA..TIBETAN LETTER A -0F69 ; mapped ; 0F40 0FB5 # 2.0 TIBETAN LETTER KSSA -0F6A ; valid # 3.0 TIBETAN LETTER FIXED-FORM RA -0F6B..0F6C ; valid # 5.1 TIBETAN LETTER KKA..TIBETAN LETTER RRA -0F6D..0F70 ; disallowed # NA .. -0F71..0F72 ; valid # 2.0 TIBETAN VOWEL SIGN AA..TIBETAN VOWEL SIGN I -0F73 ; mapped ; 0F71 0F72 # 2.0 TIBETAN VOWEL SIGN II -0F74 ; valid # 2.0 TIBETAN VOWEL SIGN U -0F75 ; mapped ; 0F71 0F74 # 2.0 TIBETAN VOWEL SIGN UU -0F76 ; mapped ; 0FB2 0F80 # 2.0 TIBETAN VOWEL SIGN VOCALIC R -0F77 ; mapped ; 0FB2 0F71 0F80 #2.0 TIBETAN VOWEL SIGN VOCALIC RR -0F78 ; mapped ; 0FB3 0F80 # 2.0 TIBETAN VOWEL SIGN VOCALIC L -0F79 ; mapped ; 0FB3 0F71 0F80 #2.0 TIBETAN VOWEL SIGN VOCALIC LL -0F7A..0F80 ; valid # 2.0 TIBETAN VOWEL SIGN E..TIBETAN VOWEL SIGN REVERSED I -0F81 ; mapped ; 0F71 0F80 # 2.0 TIBETAN VOWEL SIGN REVERSED II -0F82..0F84 ; valid # 2.0 TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA -0F85 ; valid ; ; NV8 # 2.0 TIBETAN MARK PALUTA -0F86..0F8B ; valid # 2.0 TIBETAN SIGN LCI RTAGS..TIBETAN SIGN GRU MED RGYINGS -0F8C..0F8F ; valid # 6.0 TIBETAN SIGN INVERTED MCHU CAN..TIBETAN SUBJOINED SIGN INVERTED MCHU CAN -0F90..0F92 ; valid # 2.0 TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER GA -0F93 ; mapped ; 0F92 0FB7 # 2.0 TIBETAN SUBJOINED LETTER GHA -0F94..0F95 ; valid # 2.0 TIBETAN SUBJOINED LETTER NGA..TIBETAN SUBJOINED LETTER CA -0F96 ; valid # 3.0 TIBETAN SUBJOINED LETTER CHA -0F97 ; valid # 2.0 TIBETAN SUBJOINED LETTER JA -0F98 ; disallowed # NA -0F99..0F9C ; valid # 2.0 TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER DDA -0F9D ; mapped ; 0F9C 0FB7 # 2.0 TIBETAN SUBJOINED LETTER DDHA -0F9E..0FA1 ; valid # 2.0 TIBETAN SUBJOINED LETTER NNA..TIBETAN SUBJOINED LETTER DA -0FA2 ; mapped ; 0FA1 0FB7 # 2.0 TIBETAN SUBJOINED LETTER DHA -0FA3..0FA6 ; valid # 2.0 TIBETAN SUBJOINED LETTER NA..TIBETAN SUBJOINED LETTER BA -0FA7 ; mapped ; 0FA6 0FB7 # 2.0 TIBETAN SUBJOINED LETTER BHA -0FA8..0FAB ; valid # 2.0 TIBETAN SUBJOINED LETTER MA..TIBETAN SUBJOINED LETTER DZA -0FAC ; mapped ; 0FAB 0FB7 # 2.0 TIBETAN SUBJOINED LETTER DZHA -0FAD ; valid # 2.0 TIBETAN SUBJOINED LETTER WA -0FAE..0FB0 ; valid # 3.0 TIBETAN SUBJOINED LETTER ZHA..TIBETAN SUBJOINED LETTER -A -0FB1..0FB7 ; valid # 2.0 TIBETAN SUBJOINED LETTER YA..TIBETAN SUBJOINED LETTER HA -0FB8 ; valid # 3.0 TIBETAN SUBJOINED LETTER A -0FB9 ; mapped ; 0F90 0FB5 # 2.0 TIBETAN SUBJOINED LETTER KSSA -0FBA..0FBC ; valid # 3.0 TIBETAN SUBJOINED LETTER FIXED-FORM WA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FBD ; disallowed # NA -0FBE..0FC5 ; valid ; ; NV8 # 3.0 TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE -0FC6 ; valid # 3.0 TIBETAN SYMBOL PADMA GDAN -0FC7..0FCC ; valid ; ; NV8 # 3.0 TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL -0FCD ; disallowed # NA -0FCE ; valid ; ; NV8 # 5.1 TIBETAN SIGN RDEL NAG RDEL DKAR -0FCF ; valid ; ; NV8 # 3.0 TIBETAN SIGN RDEL NAG GSUM -0FD0..0FD1 ; valid ; ; NV8 # 4.1 TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN -0FD2..0FD4 ; valid ; ; NV8 # 5.1 TIBETAN MARK NYIS TSHEG..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA -0FD5..0FD8 ; valid ; ; NV8 # 5.2 RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS -0FD9..0FDA ; valid ; ; NV8 # 6.0 TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS -0FDB..0FFF ; disallowed # NA .. -1000..1021 ; valid # 3.0 MYANMAR LETTER KA..MYANMAR LETTER A -1022 ; valid # 5.1 MYANMAR LETTER SHAN A -1023..1027 ; valid # 3.0 MYANMAR LETTER I..MYANMAR LETTER E -1028 ; valid # 5.1 MYANMAR LETTER MON E -1029..102A ; valid # 3.0 MYANMAR LETTER O..MYANMAR LETTER AU -102B ; valid # 5.1 MYANMAR VOWEL SIGN TALL AA -102C..1032 ; valid # 3.0 MYANMAR VOWEL SIGN AA..MYANMAR VOWEL SIGN AI -1033..1035 ; valid # 5.1 MYANMAR VOWEL SIGN MON II..MYANMAR VOWEL SIGN E ABOVE -1036..1039 ; valid # 3.0 MYANMAR SIGN ANUSVARA..MYANMAR SIGN VIRAMA -103A..103F ; valid # 5.1 MYANMAR SIGN ASAT..MYANMAR LETTER GREAT SA -1040..1049 ; valid # 3.0 MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -104A..104F ; valid ; ; NV8 # 3.0 MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE -1050..1059 ; valid # 3.0 MYANMAR LETTER SHA..MYANMAR VOWEL SIGN VOCALIC LL -105A..1099 ; valid # 5.1 MYANMAR LETTER MON NGA..MYANMAR SHAN DIGIT NINE -109A..109D ; valid # 5.2 MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON AI -109E..109F ; valid ; ; NV8 # 5.1 MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION -10A0..10C5 ; disallowed # 1.1 GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10C6 ; disallowed # NA -10C7 ; mapped ; 2D27 # 6.1 GEORGIAN CAPITAL LETTER YN -10C8..10CC ; disallowed # NA .. -10CD ; mapped ; 2D2D # 6.1 GEORGIAN CAPITAL LETTER AEN -10CE..10CF ; disallowed # NA .. -10D0..10F6 ; valid # 1.1 GEORGIAN LETTER AN..GEORGIAN LETTER FI -10F7..10F8 ; valid # 3.2 GEORGIAN LETTER YN..GEORGIAN LETTER ELIFI -10F9..10FA ; valid # 4.1 GEORGIAN LETTER TURNED GAN..GEORGIAN LETTER AIN -10FB ; valid ; ; NV8 # 1.1 GEORGIAN PARAGRAPH SEPARATOR -10FC ; mapped ; 10DC # 4.1 MODIFIER LETTER GEORGIAN NAR -10FD..10FF ; valid # 6.1 GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN -1100..1159 ; valid ; ; NV8 # 1.1 HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115A..115E ; valid ; ; NV8 # 5.2 HANGUL CHOSEONG KIYEOK-TIKEUT..HANGUL CHOSEONG TIKEUT-RIEUL -115F..1160 ; disallowed # 1.1 HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER -1161..11A2 ; valid ; ; NV8 # 1.1 HANGUL JUNGSEONG A..HANGUL JUNGSEONG SSANGARAEA -11A3..11A7 ; valid ; ; NV8 # 5.2 HANGUL JUNGSEONG A-EU..HANGUL JUNGSEONG O-YAE -11A8..11F9 ; valid ; ; NV8 # 1.1 HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -11FA..11FF ; valid ; ; NV8 # 5.2 HANGUL JONGSEONG KIYEOK-NIEUN..HANGUL JONGSEONG SSANGNIEUN -1200..1206 ; valid # 3.0 ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO -1207 ; valid # 4.1 ETHIOPIC SYLLABLE HOA -1208..1246 ; valid # 3.0 ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO -1247 ; valid # 4.1 ETHIOPIC SYLLABLE QOA -1248 ; valid # 3.0 ETHIOPIC SYLLABLE QWA -1249 ; disallowed # NA -124A..124D ; valid # 3.0 ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -124E..124F ; disallowed # NA .. -1250..1256 ; valid # 3.0 ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1257 ; disallowed # NA -1258 ; valid # 3.0 ETHIOPIC SYLLABLE QHWA -1259 ; disallowed # NA -125A..125D ; valid # 3.0 ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -125E..125F ; disallowed # NA .. -1260..1286 ; valid # 3.0 ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO -1287 ; valid # 4.1 ETHIOPIC SYLLABLE XOA -1288 ; valid # 3.0 ETHIOPIC SYLLABLE XWA -1289 ; disallowed # NA -128A..128D ; valid # 3.0 ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -128E..128F ; disallowed # NA .. -1290..12AE ; valid # 3.0 ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO -12AF ; valid # 4.1 ETHIOPIC SYLLABLE KOA -12B0 ; valid # 3.0 ETHIOPIC SYLLABLE KWA -12B1 ; disallowed # NA -12B2..12B5 ; valid # 3.0 ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B6..12B7 ; disallowed # NA .. -12B8..12BE ; valid # 3.0 ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12BF ; disallowed # NA -12C0 ; valid # 3.0 ETHIOPIC SYLLABLE KXWA -12C1 ; disallowed # NA -12C2..12C5 ; valid # 3.0 ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C6..12C7 ; disallowed # NA .. -12C8..12CE ; valid # 3.0 ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO -12CF ; valid # 4.1 ETHIOPIC SYLLABLE WOA -12D0..12D6 ; valid # 3.0 ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O -12D7 ; disallowed # NA -12D8..12EE ; valid # 3.0 ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO -12EF ; valid # 4.1 ETHIOPIC SYLLABLE YOA -12F0..130E ; valid # 3.0 ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO -130F ; valid # 4.1 ETHIOPIC SYLLABLE GOA -1310 ; valid # 3.0 ETHIOPIC SYLLABLE GWA -1311 ; disallowed # NA -1312..1315 ; valid # 3.0 ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1316..1317 ; disallowed # NA .. -1318..131E ; valid # 3.0 ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO -131F ; valid # 4.1 ETHIOPIC SYLLABLE GGWAA -1320..1346 ; valid # 3.0 ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO -1347 ; valid # 4.1 ETHIOPIC SYLLABLE TZOA -1348..135A ; valid # 3.0 ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA -135B..135C ; disallowed # NA .. -135D..135E ; valid # 6.0 ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING VOWEL LENGTH MARK -135F ; valid # 4.1 ETHIOPIC COMBINING GEMINATION MARK -1360 ; valid ; ; NV8 # 4.1 ETHIOPIC SECTION MARK -1361..137C ; valid ; ; NV8 # 3.0 ETHIOPIC WORDSPACE..ETHIOPIC NUMBER TEN THOUSAND -137D..137F ; disallowed # NA .. -1380..138F ; valid # 4.1 ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE -1390..1399 ; valid ; ; NV8 # 4.1 ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT -139A..139F ; disallowed # NA .. -13A0..13F4 ; valid # 3.0 CHEROKEE LETTER A..CHEROKEE LETTER YV -13F5 ; valid # 8.0 CHEROKEE LETTER MV -13F6..13F7 ; disallowed # NA .. -13F8 ; mapped ; 13F0 # 8.0 CHEROKEE SMALL LETTER YE -13F9 ; mapped ; 13F1 # 8.0 CHEROKEE SMALL LETTER YI -13FA ; mapped ; 13F2 # 8.0 CHEROKEE SMALL LETTER YO -13FB ; mapped ; 13F3 # 8.0 CHEROKEE SMALL LETTER YU -13FC ; mapped ; 13F4 # 8.0 CHEROKEE SMALL LETTER YV -13FD ; mapped ; 13F5 # 8.0 CHEROKEE SMALL LETTER MV -13FE..13FF ; disallowed # NA .. -1400 ; valid ; ; NV8 # 5.2 CANADIAN SYLLABICS HYPHEN -1401..166C ; valid # 3.0 CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166D..166E ; valid ; ; NV8 # 3.0 CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP -166F..1676 ; valid # 3.0 CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -1677..167F ; valid # 5.2 CANADIAN SYLLABICS WOODS-CREE THWEE..CANADIAN SYLLABICS BLACKFOOT W -1680 ; disallowed # 3.0 OGHAM SPACE MARK -1681..169A ; valid # 3.0 OGHAM LETTER BEITH..OGHAM LETTER PEITH -169B..169C ; valid ; ; NV8 # 3.0 OGHAM FEATHER MARK..OGHAM REVERSED FEATHER MARK -169D..169F ; disallowed # NA .. -16A0..16EA ; valid # 3.0 RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EB..16F0 ; valid ; ; NV8 # 3.0 RUNIC SINGLE PUNCTUATION..RUNIC BELGTHOR SYMBOL -16F1..16F8 ; valid # 7.0 RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC -16F9..16FF ; disallowed # NA .. -1700..170C ; valid # 3.2 TAGALOG LETTER A..TAGALOG LETTER YA -170D ; disallowed # NA -170E..1714 ; valid # 3.2 TAGALOG LETTER LA..TAGALOG SIGN VIRAMA -1715..171F ; disallowed # NA .. -1720..1734 ; valid # 3.2 HANUNOO LETTER A..HANUNOO SIGN PAMUDPOD -1735..1736 ; valid ; ; NV8 # 3.2 PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION -1737..173F ; disallowed # NA .. -1740..1753 ; valid # 3.2 BUHID LETTER A..BUHID VOWEL SIGN U -1754..175F ; disallowed # NA .. -1760..176C ; valid # 3.2 TAGBANWA LETTER A..TAGBANWA LETTER YA -176D ; disallowed # NA -176E..1770 ; valid # 3.2 TAGBANWA LETTER LA..TAGBANWA LETTER SA -1771 ; disallowed # NA -1772..1773 ; valid # 3.2 TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -1774..177F ; disallowed # NA .. -1780..17B3 ; valid # 3.0 KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B4..17B5 ; disallowed # 3.0 KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -17B6..17D3 ; valid # 3.0 KHMER VOWEL SIGN AA..KHMER SIGN BATHAMASAT -17D4..17D6 ; valid ; ; NV8 # 3.0 KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH -17D7 ; valid # 3.0 KHMER SIGN LEK TOO -17D8..17DB ; valid ; ; NV8 # 3.0 KHMER SIGN BEYYAL..KHMER CURRENCY SYMBOL RIEL -17DC ; valid # 3.0 KHMER SIGN AVAKRAHASANYA -17DD ; valid # 4.0 KHMER SIGN ATTHACAN -17DE..17DF ; disallowed # NA .. -17E0..17E9 ; valid # 3.0 KHMER DIGIT ZERO..KHMER DIGIT NINE -17EA..17EF ; disallowed # NA .. -17F0..17F9 ; valid ; ; NV8 # 4.0 KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON -17FA..17FF ; disallowed # NA .. -1800..1805 ; valid ; ; NV8 # 3.0 MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS -1806 ; disallowed # 3.0 MONGOLIAN TODO SOFT HYPHEN -1807..180A ; valid ; ; NV8 # 3.0 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU -180B..180D ; ignored # 3.0 MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -180E ; disallowed # 3.0 MONGOLIAN VOWEL SEPARATOR -180F ; disallowed # NA -1810..1819 ; valid # 3.0 MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -181A..181F ; disallowed # NA .. -1820..1877 ; valid # 3.0 MONGOLIAN LETTER A..MONGOLIAN LETTER MANCHU ZHA -1878..187F ; disallowed # NA .. -1880..18A9 ; valid # 3.0 MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI DAGALGA -18AA ; valid # 5.1 MONGOLIAN LETTER MANCHU ALI GALI LHA -18AB..18AF ; disallowed # NA .. -18B0..18F5 ; valid # 5.2 CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S -18F6..18FF ; disallowed # NA .. -1900..191C ; valid # 4.0 LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -191D..191E ; valid # 7.0 LIMBU LETTER GYAN..LIMBU LETTER TRA -191F ; disallowed # NA -1920..192B ; valid # 4.0 LIMBU VOWEL SIGN A..LIMBU SUBJOINED LETTER WA -192C..192F ; disallowed # NA .. -1930..193B ; valid # 4.0 LIMBU SMALL LETTER KA..LIMBU SIGN SA-I -193C..193F ; disallowed # NA .. -1940 ; valid ; ; NV8 # 4.0 LIMBU SIGN LOO -1941..1943 ; disallowed # NA .. -1944..1945 ; valid ; ; NV8 # 4.0 LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK -1946..196D ; valid # 4.0 LIMBU DIGIT ZERO..TAI LE LETTER AI -196E..196F ; disallowed # NA .. -1970..1974 ; valid # 4.0 TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -1975..197F ; disallowed # NA .. -1980..19A9 ; valid # 4.1 NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA -19AA..19AB ; valid # 5.2 NEW TAI LUE LETTER HIGH SUA..NEW TAI LUE LETTER LOW SUA -19AC..19AF ; disallowed # NA .. -19B0..19C9 ; valid # 4.1 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 -19CA..19CF ; disallowed # NA .. -19D0..19D9 ; valid # 4.1 NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE -19DA ; valid ; ; XV8 # 5.2 NEW TAI LUE THAM DIGIT ONE -19DB..19DD ; disallowed # NA .. -19DE..19DF ; valid ; ; NV8 # 4.1 NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV -19E0..19FF ; valid ; ; NV8 # 4.0 KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC -1A00..1A1B ; valid # 4.1 BUGINESE LETTER KA..BUGINESE VOWEL SIGN AE -1A1C..1A1D ; disallowed # NA .. -1A1E..1A1F ; valid ; ; NV8 # 4.1 BUGINESE PALLAWA..BUGINESE END OF SECTION -1A20..1A5E ; valid # 5.2 TAI THAM LETTER HIGH KA..TAI THAM CONSONANT SIGN SA -1A5F ; disallowed # NA -1A60..1A7C ; valid # 5.2 TAI THAM SIGN SAKOT..TAI THAM SIGN KHUEN-LUE KARAN -1A7D..1A7E ; disallowed # NA .. -1A7F..1A89 ; valid # 5.2 TAI THAM COMBINING CRYPTOGRAMMIC DOT..TAI THAM HORA DIGIT NINE -1A8A..1A8F ; disallowed # NA .. -1A90..1A99 ; valid # 5.2 TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE -1A9A..1A9F ; disallowed # NA .. -1AA0..1AA6 ; valid ; ; NV8 # 5.2 TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA -1AA7 ; valid # 5.2 TAI THAM SIGN MAI YAMOK -1AA8..1AAD ; valid ; ; NV8 # 5.2 TAI THAM SIGN KAAN..TAI THAM SIGN CAANG -1AAE..1AAF ; disallowed # NA .. -1AB0..1ABD ; valid # 7.0 COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW -1ABE ; valid ; ; NV8 # 7.0 COMBINING PARENTHESES OVERLAY -1ABF..1AFF ; disallowed # NA .. -1B00..1B4B ; valid # 5.0 BALINESE SIGN ULU RICEM..BALINESE LETTER ASYURA SASAK -1B4C..1B4F ; disallowed # NA .. -1B50..1B59 ; valid # 5.0 BALINESE DIGIT ZERO..BALINESE DIGIT NINE -1B5A..1B6A ; valid ; ; NV8 # 5.0 BALINESE PANTI..BALINESE MUSICAL SYMBOL DANG GEDE -1B6B..1B73 ; valid # 5.0 BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG -1B74..1B7C ; valid ; ; NV8 # 5.0 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING -1B7D..1B7F ; disallowed # NA .. -1B80..1BAA ; valid # 5.1 SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PAMAAEH -1BAB..1BAD ; valid # 6.1 SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA -1BAE..1BB9 ; valid # 5.1 SUNDANESE LETTER KHA..SUNDANESE DIGIT NINE -1BBA..1BBF ; valid # 6.1 SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M -1BC0..1BF3 ; valid # 6.0 BATAK LETTER A..BATAK PANONGONAN -1BF4..1BFB ; disallowed # NA .. -1BFC..1BFF ; valid ; ; NV8 # 6.0 BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT -1C00..1C37 ; valid # 5.1 LEPCHA LETTER KA..LEPCHA SIGN NUKTA -1C38..1C3A ; disallowed # NA .. -1C3B..1C3F ; valid ; ; NV8 # 5.1 LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK -1C40..1C49 ; valid # 5.1 LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE -1C4A..1C4C ; disallowed # NA .. -1C4D..1C7D ; valid # 5.1 LEPCHA LETTER TTA..OL CHIKI AHAD -1C7E..1C7F ; valid ; ; NV8 # 5.1 OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD -1C80 ; mapped ; 0432 # 9.0 CYRILLIC SMALL LETTER ROUNDED VE -1C81 ; mapped ; 0434 # 9.0 CYRILLIC SMALL LETTER LONG-LEGGED DE -1C82 ; mapped ; 043E # 9.0 CYRILLIC SMALL LETTER NARROW O -1C83 ; mapped ; 0441 # 9.0 CYRILLIC SMALL LETTER WIDE ES -1C84..1C85 ; mapped ; 0442 # 9.0 CYRILLIC SMALL LETTER TALL TE..CYRILLIC SMALL LETTER THREE-LEGGED TE -1C86 ; mapped ; 044A # 9.0 CYRILLIC SMALL LETTER TALL HARD SIGN -1C87 ; mapped ; 0463 # 9.0 CYRILLIC SMALL LETTER TALL YAT -1C88 ; mapped ; A64B # 9.0 CYRILLIC SMALL LETTER UNBLENDED UK -1C89..1CBF ; disallowed # NA .. -1CC0..1CC7 ; valid ; ; NV8 # 6.1 SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA -1CC8..1CCF ; disallowed # NA .. -1CD0..1CD2 ; valid # 5.2 VEDIC TONE KARSHANA..VEDIC TONE PRENKHA -1CD3 ; valid ; ; NV8 # 5.2 VEDIC SIGN NIHSHVASA -1CD4..1CF2 ; valid # 5.2 VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC SIGN ARDHAVISARGA -1CF3..1CF6 ; valid # 6.1 VEDIC SIGN ROTATED ARDHAVISARGA..VEDIC SIGN UPADHMANIYA -1CF7 ; valid # 10.0 VEDIC SIGN ATIKRAMA -1CF8..1CF9 ; valid # 7.0 VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -1CFA..1CFF ; disallowed # NA .. -1D00..1D2B ; valid # 4.0 LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C ; mapped ; 0061 # 4.0 MODIFIER LETTER CAPITAL A -1D2D ; mapped ; 00E6 # 4.0 MODIFIER LETTER CAPITAL AE -1D2E ; mapped ; 0062 # 4.0 MODIFIER LETTER CAPITAL B -1D2F ; valid # 4.0 MODIFIER LETTER CAPITAL BARRED B -1D30 ; mapped ; 0064 # 4.0 MODIFIER LETTER CAPITAL D -1D31 ; mapped ; 0065 # 4.0 MODIFIER LETTER CAPITAL E -1D32 ; mapped ; 01DD # 4.0 MODIFIER LETTER CAPITAL REVERSED E -1D33 ; mapped ; 0067 # 4.0 MODIFIER LETTER CAPITAL G -1D34 ; mapped ; 0068 # 4.0 MODIFIER LETTER CAPITAL H -1D35 ; mapped ; 0069 # 4.0 MODIFIER LETTER CAPITAL I -1D36 ; mapped ; 006A # 4.0 MODIFIER LETTER CAPITAL J -1D37 ; mapped ; 006B # 4.0 MODIFIER LETTER CAPITAL K -1D38 ; mapped ; 006C # 4.0 MODIFIER LETTER CAPITAL L -1D39 ; mapped ; 006D # 4.0 MODIFIER LETTER CAPITAL M -1D3A ; mapped ; 006E # 4.0 MODIFIER LETTER CAPITAL N -1D3B ; valid # 4.0 MODIFIER LETTER CAPITAL REVERSED N -1D3C ; mapped ; 006F # 4.0 MODIFIER LETTER CAPITAL O -1D3D ; mapped ; 0223 # 4.0 MODIFIER LETTER CAPITAL OU -1D3E ; mapped ; 0070 # 4.0 MODIFIER LETTER CAPITAL P -1D3F ; mapped ; 0072 # 4.0 MODIFIER LETTER CAPITAL R -1D40 ; mapped ; 0074 # 4.0 MODIFIER LETTER CAPITAL T -1D41 ; mapped ; 0075 # 4.0 MODIFIER LETTER CAPITAL U -1D42 ; mapped ; 0077 # 4.0 MODIFIER LETTER CAPITAL W -1D43 ; mapped ; 0061 # 4.0 MODIFIER LETTER SMALL A -1D44 ; mapped ; 0250 # 4.0 MODIFIER LETTER SMALL TURNED A -1D45 ; mapped ; 0251 # 4.0 MODIFIER LETTER SMALL ALPHA -1D46 ; mapped ; 1D02 # 4.0 MODIFIER LETTER SMALL TURNED AE -1D47 ; mapped ; 0062 # 4.0 MODIFIER LETTER SMALL B -1D48 ; mapped ; 0064 # 4.0 MODIFIER LETTER SMALL D -1D49 ; mapped ; 0065 # 4.0 MODIFIER LETTER SMALL E -1D4A ; mapped ; 0259 # 4.0 MODIFIER LETTER SMALL SCHWA -1D4B ; mapped ; 025B # 4.0 MODIFIER LETTER SMALL OPEN E -1D4C ; mapped ; 025C # 4.0 MODIFIER LETTER SMALL TURNED OPEN E -1D4D ; mapped ; 0067 # 4.0 MODIFIER LETTER SMALL G -1D4E ; valid # 4.0 MODIFIER LETTER SMALL TURNED I -1D4F ; mapped ; 006B # 4.0 MODIFIER LETTER SMALL K -1D50 ; mapped ; 006D # 4.0 MODIFIER LETTER SMALL M -1D51 ; mapped ; 014B # 4.0 MODIFIER LETTER SMALL ENG -1D52 ; mapped ; 006F # 4.0 MODIFIER LETTER SMALL O -1D53 ; mapped ; 0254 # 4.0 MODIFIER LETTER SMALL OPEN O -1D54 ; mapped ; 1D16 # 4.0 MODIFIER LETTER SMALL TOP HALF O -1D55 ; mapped ; 1D17 # 4.0 MODIFIER LETTER SMALL BOTTOM HALF O -1D56 ; mapped ; 0070 # 4.0 MODIFIER LETTER SMALL P -1D57 ; mapped ; 0074 # 4.0 MODIFIER LETTER SMALL T -1D58 ; mapped ; 0075 # 4.0 MODIFIER LETTER SMALL U -1D59 ; mapped ; 1D1D # 4.0 MODIFIER LETTER SMALL SIDEWAYS U -1D5A ; mapped ; 026F # 4.0 MODIFIER LETTER SMALL TURNED M -1D5B ; mapped ; 0076 # 4.0 MODIFIER LETTER SMALL V -1D5C ; mapped ; 1D25 # 4.0 MODIFIER LETTER SMALL AIN -1D5D ; mapped ; 03B2 # 4.0 MODIFIER LETTER SMALL BETA -1D5E ; mapped ; 03B3 # 4.0 MODIFIER LETTER SMALL GREEK GAMMA -1D5F ; mapped ; 03B4 # 4.0 MODIFIER LETTER SMALL DELTA -1D60 ; mapped ; 03C6 # 4.0 MODIFIER LETTER SMALL GREEK PHI -1D61 ; mapped ; 03C7 # 4.0 MODIFIER LETTER SMALL CHI -1D62 ; mapped ; 0069 # 4.0 LATIN SUBSCRIPT SMALL LETTER I -1D63 ; mapped ; 0072 # 4.0 LATIN SUBSCRIPT SMALL LETTER R -1D64 ; mapped ; 0075 # 4.0 LATIN SUBSCRIPT SMALL LETTER U -1D65 ; mapped ; 0076 # 4.0 LATIN SUBSCRIPT SMALL LETTER V -1D66 ; mapped ; 03B2 # 4.0 GREEK SUBSCRIPT SMALL LETTER BETA -1D67 ; mapped ; 03B3 # 4.0 GREEK SUBSCRIPT SMALL LETTER GAMMA -1D68 ; mapped ; 03C1 # 4.0 GREEK SUBSCRIPT SMALL LETTER RHO -1D69 ; mapped ; 03C6 # 4.0 GREEK SUBSCRIPT SMALL LETTER PHI -1D6A ; mapped ; 03C7 # 4.0 GREEK SUBSCRIPT SMALL LETTER CHI -1D6B ; valid # 4.0 LATIN SMALL LETTER UE -1D6C..1D77 ; valid # 4.1 LATIN SMALL LETTER B WITH MIDDLE TILDE..LATIN SMALL LETTER TURNED G -1D78 ; mapped ; 043D # 4.1 MODIFIER LETTER CYRILLIC EN -1D79..1D9A ; valid # 4.1 LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK -1D9B ; mapped ; 0252 # 4.1 MODIFIER LETTER SMALL TURNED ALPHA -1D9C ; mapped ; 0063 # 4.1 MODIFIER LETTER SMALL C -1D9D ; mapped ; 0255 # 4.1 MODIFIER LETTER SMALL C WITH CURL -1D9E ; mapped ; 00F0 # 4.1 MODIFIER LETTER SMALL ETH -1D9F ; mapped ; 025C # 4.1 MODIFIER LETTER SMALL REVERSED OPEN E -1DA0 ; mapped ; 0066 # 4.1 MODIFIER LETTER SMALL F -1DA1 ; mapped ; 025F # 4.1 MODIFIER LETTER SMALL DOTLESS J WITH STROKE -1DA2 ; mapped ; 0261 # 4.1 MODIFIER LETTER SMALL SCRIPT G -1DA3 ; mapped ; 0265 # 4.1 MODIFIER LETTER SMALL TURNED H -1DA4 ; mapped ; 0268 # 4.1 MODIFIER LETTER SMALL I WITH STROKE -1DA5 ; mapped ; 0269 # 4.1 MODIFIER LETTER SMALL IOTA -1DA6 ; mapped ; 026A # 4.1 MODIFIER LETTER SMALL CAPITAL I -1DA7 ; mapped ; 1D7B # 4.1 MODIFIER LETTER SMALL CAPITAL I WITH STROKE -1DA8 ; mapped ; 029D # 4.1 MODIFIER LETTER SMALL J WITH CROSSED-TAIL -1DA9 ; mapped ; 026D # 4.1 MODIFIER LETTER SMALL L WITH RETROFLEX HOOK -1DAA ; mapped ; 1D85 # 4.1 MODIFIER LETTER SMALL L WITH PALATAL HOOK -1DAB ; mapped ; 029F # 4.1 MODIFIER LETTER SMALL CAPITAL L -1DAC ; mapped ; 0271 # 4.1 MODIFIER LETTER SMALL M WITH HOOK -1DAD ; mapped ; 0270 # 4.1 MODIFIER LETTER SMALL TURNED M WITH LONG LEG -1DAE ; mapped ; 0272 # 4.1 MODIFIER LETTER SMALL N WITH LEFT HOOK -1DAF ; mapped ; 0273 # 4.1 MODIFIER LETTER SMALL N WITH RETROFLEX HOOK -1DB0 ; mapped ; 0274 # 4.1 MODIFIER LETTER SMALL CAPITAL N -1DB1 ; mapped ; 0275 # 4.1 MODIFIER LETTER SMALL BARRED O -1DB2 ; mapped ; 0278 # 4.1 MODIFIER LETTER SMALL PHI -1DB3 ; mapped ; 0282 # 4.1 MODIFIER LETTER SMALL S WITH HOOK -1DB4 ; mapped ; 0283 # 4.1 MODIFIER LETTER SMALL ESH -1DB5 ; mapped ; 01AB # 4.1 MODIFIER LETTER SMALL T WITH PALATAL HOOK -1DB6 ; mapped ; 0289 # 4.1 MODIFIER LETTER SMALL U BAR -1DB7 ; mapped ; 028A # 4.1 MODIFIER LETTER SMALL UPSILON -1DB8 ; mapped ; 1D1C # 4.1 MODIFIER LETTER SMALL CAPITAL U -1DB9 ; mapped ; 028B # 4.1 MODIFIER LETTER SMALL V WITH HOOK -1DBA ; mapped ; 028C # 4.1 MODIFIER LETTER SMALL TURNED V -1DBB ; mapped ; 007A # 4.1 MODIFIER LETTER SMALL Z -1DBC ; mapped ; 0290 # 4.1 MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK -1DBD ; mapped ; 0291 # 4.1 MODIFIER LETTER SMALL Z WITH CURL -1DBE ; mapped ; 0292 # 4.1 MODIFIER LETTER SMALL EZH -1DBF ; mapped ; 03B8 # 4.1 MODIFIER LETTER SMALL THETA -1DC0..1DC3 ; valid # 4.1 COMBINING DOTTED GRAVE ACCENT..COMBINING SUSPENSION MARK -1DC4..1DCA ; valid # 5.0 COMBINING MACRON-ACUTE..COMBINING LATIN SMALL LETTER R BELOW -1DCB..1DE6 ; valid # 5.1 COMBINING BREVE-MACRON..COMBINING LATIN SMALL LETTER Z -1DE7..1DF5 ; valid # 7.0 COMBINING LATIN SMALL LETTER ALPHA..COMBINING UP TACK ABOVE -1DF6..1DF9 ; valid # 10.0 COMBINING KAVYKA ABOVE RIGHT..COMBINING WIDE INVERTED BRIDGE BELOW -1DFA ; disallowed # NA -1DFB ; valid # 9.0 COMBINING DELETION MARK -1DFC ; valid # 6.0 COMBINING DOUBLE INVERTED BREVE BELOW -1DFD ; valid # 5.2 COMBINING ALMOST EQUAL TO BELOW -1DFE..1DFF ; valid # 5.0 COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -1E00 ; mapped ; 1E01 # 1.1 LATIN CAPITAL LETTER A WITH RING BELOW -1E01 ; valid # 1.1 LATIN SMALL LETTER A WITH RING BELOW -1E02 ; mapped ; 1E03 # 1.1 LATIN CAPITAL LETTER B WITH DOT ABOVE -1E03 ; valid # 1.1 LATIN SMALL LETTER B WITH DOT ABOVE -1E04 ; mapped ; 1E05 # 1.1 LATIN CAPITAL LETTER B WITH DOT BELOW -1E05 ; valid # 1.1 LATIN SMALL LETTER B WITH DOT BELOW -1E06 ; mapped ; 1E07 # 1.1 LATIN CAPITAL LETTER B WITH LINE BELOW -1E07 ; valid # 1.1 LATIN SMALL LETTER B WITH LINE BELOW -1E08 ; mapped ; 1E09 # 1.1 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE -1E09 ; valid # 1.1 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE -1E0A ; mapped ; 1E0B # 1.1 LATIN CAPITAL LETTER D WITH DOT ABOVE -1E0B ; valid # 1.1 LATIN SMALL LETTER D WITH DOT ABOVE -1E0C ; mapped ; 1E0D # 1.1 LATIN CAPITAL LETTER D WITH DOT BELOW -1E0D ; valid # 1.1 LATIN SMALL LETTER D WITH DOT BELOW -1E0E ; mapped ; 1E0F # 1.1 LATIN CAPITAL LETTER D WITH LINE BELOW -1E0F ; valid # 1.1 LATIN SMALL LETTER D WITH LINE BELOW -1E10 ; mapped ; 1E11 # 1.1 LATIN CAPITAL LETTER D WITH CEDILLA -1E11 ; valid # 1.1 LATIN SMALL LETTER D WITH CEDILLA -1E12 ; mapped ; 1E13 # 1.1 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW -1E13 ; valid # 1.1 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW -1E14 ; mapped ; 1E15 # 1.1 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE -1E15 ; valid # 1.1 LATIN SMALL LETTER E WITH MACRON AND GRAVE -1E16 ; mapped ; 1E17 # 1.1 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE -1E17 ; valid # 1.1 LATIN SMALL LETTER E WITH MACRON AND ACUTE -1E18 ; mapped ; 1E19 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW -1E19 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW -1E1A ; mapped ; 1E1B # 1.1 LATIN CAPITAL LETTER E WITH TILDE BELOW -1E1B ; valid # 1.1 LATIN SMALL LETTER E WITH TILDE BELOW -1E1C ; mapped ; 1E1D # 1.1 LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE -1E1D ; valid # 1.1 LATIN SMALL LETTER E WITH CEDILLA AND BREVE -1E1E ; mapped ; 1E1F # 1.1 LATIN CAPITAL LETTER F WITH DOT ABOVE -1E1F ; valid # 1.1 LATIN SMALL LETTER F WITH DOT ABOVE -1E20 ; mapped ; 1E21 # 1.1 LATIN CAPITAL LETTER G WITH MACRON -1E21 ; valid # 1.1 LATIN SMALL LETTER G WITH MACRON -1E22 ; mapped ; 1E23 # 1.1 LATIN CAPITAL LETTER H WITH DOT ABOVE -1E23 ; valid # 1.1 LATIN SMALL LETTER H WITH DOT ABOVE -1E24 ; mapped ; 1E25 # 1.1 LATIN CAPITAL LETTER H WITH DOT BELOW -1E25 ; valid # 1.1 LATIN SMALL LETTER H WITH DOT BELOW -1E26 ; mapped ; 1E27 # 1.1 LATIN CAPITAL LETTER H WITH DIAERESIS -1E27 ; valid # 1.1 LATIN SMALL LETTER H WITH DIAERESIS -1E28 ; mapped ; 1E29 # 1.1 LATIN CAPITAL LETTER H WITH CEDILLA -1E29 ; valid # 1.1 LATIN SMALL LETTER H WITH CEDILLA -1E2A ; mapped ; 1E2B # 1.1 LATIN CAPITAL LETTER H WITH BREVE BELOW -1E2B ; valid # 1.1 LATIN SMALL LETTER H WITH BREVE BELOW -1E2C ; mapped ; 1E2D # 1.1 LATIN CAPITAL LETTER I WITH TILDE BELOW -1E2D ; valid # 1.1 LATIN SMALL LETTER I WITH TILDE BELOW -1E2E ; mapped ; 1E2F # 1.1 LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE -1E2F ; valid # 1.1 LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE -1E30 ; mapped ; 1E31 # 1.1 LATIN CAPITAL LETTER K WITH ACUTE -1E31 ; valid # 1.1 LATIN SMALL LETTER K WITH ACUTE -1E32 ; mapped ; 1E33 # 1.1 LATIN CAPITAL LETTER K WITH DOT BELOW -1E33 ; valid # 1.1 LATIN SMALL LETTER K WITH DOT BELOW -1E34 ; mapped ; 1E35 # 1.1 LATIN CAPITAL LETTER K WITH LINE BELOW -1E35 ; valid # 1.1 LATIN SMALL LETTER K WITH LINE BELOW -1E36 ; mapped ; 1E37 # 1.1 LATIN CAPITAL LETTER L WITH DOT BELOW -1E37 ; valid # 1.1 LATIN SMALL LETTER L WITH DOT BELOW -1E38 ; mapped ; 1E39 # 1.1 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON -1E39 ; valid # 1.1 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON -1E3A ; mapped ; 1E3B # 1.1 LATIN CAPITAL LETTER L WITH LINE BELOW -1E3B ; valid # 1.1 LATIN SMALL LETTER L WITH LINE BELOW -1E3C ; mapped ; 1E3D # 1.1 LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW -1E3D ; valid # 1.1 LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW -1E3E ; mapped ; 1E3F # 1.1 LATIN CAPITAL LETTER M WITH ACUTE -1E3F ; valid # 1.1 LATIN SMALL LETTER M WITH ACUTE -1E40 ; mapped ; 1E41 # 1.1 LATIN CAPITAL LETTER M WITH DOT ABOVE -1E41 ; valid # 1.1 LATIN SMALL LETTER M WITH DOT ABOVE -1E42 ; mapped ; 1E43 # 1.1 LATIN CAPITAL LETTER M WITH DOT BELOW -1E43 ; valid # 1.1 LATIN SMALL LETTER M WITH DOT BELOW -1E44 ; mapped ; 1E45 # 1.1 LATIN CAPITAL LETTER N WITH DOT ABOVE -1E45 ; valid # 1.1 LATIN SMALL LETTER N WITH DOT ABOVE -1E46 ; mapped ; 1E47 # 1.1 LATIN CAPITAL LETTER N WITH DOT BELOW -1E47 ; valid # 1.1 LATIN SMALL LETTER N WITH DOT BELOW -1E48 ; mapped ; 1E49 # 1.1 LATIN CAPITAL LETTER N WITH LINE BELOW -1E49 ; valid # 1.1 LATIN SMALL LETTER N WITH LINE BELOW -1E4A ; mapped ; 1E4B # 1.1 LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW -1E4B ; valid # 1.1 LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW -1E4C ; mapped ; 1E4D # 1.1 LATIN CAPITAL LETTER O WITH TILDE AND ACUTE -1E4D ; valid # 1.1 LATIN SMALL LETTER O WITH TILDE AND ACUTE -1E4E ; mapped ; 1E4F # 1.1 LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS -1E4F ; valid # 1.1 LATIN SMALL LETTER O WITH TILDE AND DIAERESIS -1E50 ; mapped ; 1E51 # 1.1 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE -1E51 ; valid # 1.1 LATIN SMALL LETTER O WITH MACRON AND GRAVE -1E52 ; mapped ; 1E53 # 1.1 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE -1E53 ; valid # 1.1 LATIN SMALL LETTER O WITH MACRON AND ACUTE -1E54 ; mapped ; 1E55 # 1.1 LATIN CAPITAL LETTER P WITH ACUTE -1E55 ; valid # 1.1 LATIN SMALL LETTER P WITH ACUTE -1E56 ; mapped ; 1E57 # 1.1 LATIN CAPITAL LETTER P WITH DOT ABOVE -1E57 ; valid # 1.1 LATIN SMALL LETTER P WITH DOT ABOVE -1E58 ; mapped ; 1E59 # 1.1 LATIN CAPITAL LETTER R WITH DOT ABOVE -1E59 ; valid # 1.1 LATIN SMALL LETTER R WITH DOT ABOVE -1E5A ; mapped ; 1E5B # 1.1 LATIN CAPITAL LETTER R WITH DOT BELOW -1E5B ; valid # 1.1 LATIN SMALL LETTER R WITH DOT BELOW -1E5C ; mapped ; 1E5D # 1.1 LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON -1E5D ; valid # 1.1 LATIN SMALL LETTER R WITH DOT BELOW AND MACRON -1E5E ; mapped ; 1E5F # 1.1 LATIN CAPITAL LETTER R WITH LINE BELOW -1E5F ; valid # 1.1 LATIN SMALL LETTER R WITH LINE BELOW -1E60 ; mapped ; 1E61 # 1.1 LATIN CAPITAL LETTER S WITH DOT ABOVE -1E61 ; valid # 1.1 LATIN SMALL LETTER S WITH DOT ABOVE -1E62 ; mapped ; 1E63 # 1.1 LATIN CAPITAL LETTER S WITH DOT BELOW -1E63 ; valid # 1.1 LATIN SMALL LETTER S WITH DOT BELOW -1E64 ; mapped ; 1E65 # 1.1 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE -1E65 ; valid # 1.1 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE -1E66 ; mapped ; 1E67 # 1.1 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE -1E67 ; valid # 1.1 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE -1E68 ; mapped ; 1E69 # 1.1 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE -1E69 ; valid # 1.1 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE -1E6A ; mapped ; 1E6B # 1.1 LATIN CAPITAL LETTER T WITH DOT ABOVE -1E6B ; valid # 1.1 LATIN SMALL LETTER T WITH DOT ABOVE -1E6C ; mapped ; 1E6D # 1.1 LATIN CAPITAL LETTER T WITH DOT BELOW -1E6D ; valid # 1.1 LATIN SMALL LETTER T WITH DOT BELOW -1E6E ; mapped ; 1E6F # 1.1 LATIN CAPITAL LETTER T WITH LINE BELOW -1E6F ; valid # 1.1 LATIN SMALL LETTER T WITH LINE BELOW -1E70 ; mapped ; 1E71 # 1.1 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW -1E71 ; valid # 1.1 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW -1E72 ; mapped ; 1E73 # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW -1E73 ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS BELOW -1E74 ; mapped ; 1E75 # 1.1 LATIN CAPITAL LETTER U WITH TILDE BELOW -1E75 ; valid # 1.1 LATIN SMALL LETTER U WITH TILDE BELOW -1E76 ; mapped ; 1E77 # 1.1 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW -1E77 ; valid # 1.1 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW -1E78 ; mapped ; 1E79 # 1.1 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE -1E79 ; valid # 1.1 LATIN SMALL LETTER U WITH TILDE AND ACUTE -1E7A ; mapped ; 1E7B # 1.1 LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS -1E7B ; valid # 1.1 LATIN SMALL LETTER U WITH MACRON AND DIAERESIS -1E7C ; mapped ; 1E7D # 1.1 LATIN CAPITAL LETTER V WITH TILDE -1E7D ; valid # 1.1 LATIN SMALL LETTER V WITH TILDE -1E7E ; mapped ; 1E7F # 1.1 LATIN CAPITAL LETTER V WITH DOT BELOW -1E7F ; valid # 1.1 LATIN SMALL LETTER V WITH DOT BELOW -1E80 ; mapped ; 1E81 # 1.1 LATIN CAPITAL LETTER W WITH GRAVE -1E81 ; valid # 1.1 LATIN SMALL LETTER W WITH GRAVE -1E82 ; mapped ; 1E83 # 1.1 LATIN CAPITAL LETTER W WITH ACUTE -1E83 ; valid # 1.1 LATIN SMALL LETTER W WITH ACUTE -1E84 ; mapped ; 1E85 # 1.1 LATIN CAPITAL LETTER W WITH DIAERESIS -1E85 ; valid # 1.1 LATIN SMALL LETTER W WITH DIAERESIS -1E86 ; mapped ; 1E87 # 1.1 LATIN CAPITAL LETTER W WITH DOT ABOVE -1E87 ; valid # 1.1 LATIN SMALL LETTER W WITH DOT ABOVE -1E88 ; mapped ; 1E89 # 1.1 LATIN CAPITAL LETTER W WITH DOT BELOW -1E89 ; valid # 1.1 LATIN SMALL LETTER W WITH DOT BELOW -1E8A ; mapped ; 1E8B # 1.1 LATIN CAPITAL LETTER X WITH DOT ABOVE -1E8B ; valid # 1.1 LATIN SMALL LETTER X WITH DOT ABOVE -1E8C ; mapped ; 1E8D # 1.1 LATIN CAPITAL LETTER X WITH DIAERESIS -1E8D ; valid # 1.1 LATIN SMALL LETTER X WITH DIAERESIS -1E8E ; mapped ; 1E8F # 1.1 LATIN CAPITAL LETTER Y WITH DOT ABOVE -1E8F ; valid # 1.1 LATIN SMALL LETTER Y WITH DOT ABOVE -1E90 ; mapped ; 1E91 # 1.1 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX -1E91 ; valid # 1.1 LATIN SMALL LETTER Z WITH CIRCUMFLEX -1E92 ; mapped ; 1E93 # 1.1 LATIN CAPITAL LETTER Z WITH DOT BELOW -1E93 ; valid # 1.1 LATIN SMALL LETTER Z WITH DOT BELOW -1E94 ; mapped ; 1E95 # 1.1 LATIN CAPITAL LETTER Z WITH LINE BELOW -1E95..1E99 ; valid # 1.1 LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER Y WITH RING ABOVE -1E9A ; mapped ; 0061 02BE # 1.1 LATIN SMALL LETTER A WITH RIGHT HALF RING -1E9B ; mapped ; 1E61 # 2.0 LATIN SMALL LETTER LONG S WITH DOT ABOVE -1E9C..1E9D ; valid # 5.1 LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE..LATIN SMALL LETTER LONG S WITH HIGH STROKE -1E9E ; mapped ; 0073 0073 # 5.1 LATIN CAPITAL LETTER SHARP S -1E9F ; valid # 5.1 LATIN SMALL LETTER DELTA -1EA0 ; mapped ; 1EA1 # 1.1 LATIN CAPITAL LETTER A WITH DOT BELOW -1EA1 ; valid # 1.1 LATIN SMALL LETTER A WITH DOT BELOW -1EA2 ; mapped ; 1EA3 # 1.1 LATIN CAPITAL LETTER A WITH HOOK ABOVE -1EA3 ; valid # 1.1 LATIN SMALL LETTER A WITH HOOK ABOVE -1EA4 ; mapped ; 1EA5 # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA5 ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA6 ; mapped ; 1EA7 # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE -1EA7 ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE -1EA8 ; mapped ; 1EA9 # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -1EA9 ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -1EAA ; mapped ; 1EAB # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE -1EAB ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE -1EAC ; mapped ; 1EAD # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1EAD ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1EAE ; mapped ; 1EAF # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND ACUTE -1EAF ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND ACUTE -1EB0 ; mapped ; 1EB1 # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE -1EB1 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND GRAVE -1EB2 ; mapped ; 1EB3 # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE -1EB3 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE -1EB4 ; mapped ; 1EB5 # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND TILDE -1EB5 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND TILDE -1EB6 ; mapped ; 1EB7 # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW -1EB7 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW -1EB8 ; mapped ; 1EB9 # 1.1 LATIN CAPITAL LETTER E WITH DOT BELOW -1EB9 ; valid # 1.1 LATIN SMALL LETTER E WITH DOT BELOW -1EBA ; mapped ; 1EBB # 1.1 LATIN CAPITAL LETTER E WITH HOOK ABOVE -1EBB ; valid # 1.1 LATIN SMALL LETTER E WITH HOOK ABOVE -1EBC ; mapped ; 1EBD # 1.1 LATIN CAPITAL LETTER E WITH TILDE -1EBD ; valid # 1.1 LATIN SMALL LETTER E WITH TILDE -1EBE ; mapped ; 1EBF # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE -1EBF ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE -1EC0 ; mapped ; 1EC1 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC1 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC2 ; mapped ; 1EC3 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -1EC3 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -1EC4 ; mapped ; 1EC5 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE -1EC5 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE -1EC6 ; mapped ; 1EC7 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1EC7 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1EC8 ; mapped ; 1EC9 # 1.1 LATIN CAPITAL LETTER I WITH HOOK ABOVE -1EC9 ; valid # 1.1 LATIN SMALL LETTER I WITH HOOK ABOVE -1ECA ; mapped ; 1ECB # 1.1 LATIN CAPITAL LETTER I WITH DOT BELOW -1ECB ; valid # 1.1 LATIN SMALL LETTER I WITH DOT BELOW -1ECC ; mapped ; 1ECD # 1.1 LATIN CAPITAL LETTER O WITH DOT BELOW -1ECD ; valid # 1.1 LATIN SMALL LETTER O WITH DOT BELOW -1ECE ; mapped ; 1ECF # 1.1 LATIN CAPITAL LETTER O WITH HOOK ABOVE -1ECF ; valid # 1.1 LATIN SMALL LETTER O WITH HOOK ABOVE -1ED0 ; mapped ; 1ED1 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED1 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED2 ; mapped ; 1ED3 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED3 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED4 ; mapped ; 1ED5 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -1ED5 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -1ED6 ; mapped ; 1ED7 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE -1ED7 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE -1ED8 ; mapped ; 1ED9 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW -1ED9 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW -1EDA ; mapped ; 1EDB # 1.1 LATIN CAPITAL LETTER O WITH HORN AND ACUTE -1EDB ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND ACUTE -1EDC ; mapped ; 1EDD # 1.1 LATIN CAPITAL LETTER O WITH HORN AND GRAVE -1EDD ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND GRAVE -1EDE ; mapped ; 1EDF # 1.1 LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE -1EDF ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE -1EE0 ; mapped ; 1EE1 # 1.1 LATIN CAPITAL LETTER O WITH HORN AND TILDE -1EE1 ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND TILDE -1EE2 ; mapped ; 1EE3 # 1.1 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW -1EE3 ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND DOT BELOW -1EE4 ; mapped ; 1EE5 # 1.1 LATIN CAPITAL LETTER U WITH DOT BELOW -1EE5 ; valid # 1.1 LATIN SMALL LETTER U WITH DOT BELOW -1EE6 ; mapped ; 1EE7 # 1.1 LATIN CAPITAL LETTER U WITH HOOK ABOVE -1EE7 ; valid # 1.1 LATIN SMALL LETTER U WITH HOOK ABOVE -1EE8 ; mapped ; 1EE9 # 1.1 LATIN CAPITAL LETTER U WITH HORN AND ACUTE -1EE9 ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND ACUTE -1EEA ; mapped ; 1EEB # 1.1 LATIN CAPITAL LETTER U WITH HORN AND GRAVE -1EEB ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND GRAVE -1EEC ; mapped ; 1EED # 1.1 LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE -1EED ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE -1EEE ; mapped ; 1EEF # 1.1 LATIN CAPITAL LETTER U WITH HORN AND TILDE -1EEF ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND TILDE -1EF0 ; mapped ; 1EF1 # 1.1 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW -1EF1 ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW -1EF2 ; mapped ; 1EF3 # 1.1 LATIN CAPITAL LETTER Y WITH GRAVE -1EF3 ; valid # 1.1 LATIN SMALL LETTER Y WITH GRAVE -1EF4 ; mapped ; 1EF5 # 1.1 LATIN CAPITAL LETTER Y WITH DOT BELOW -1EF5 ; valid # 1.1 LATIN SMALL LETTER Y WITH DOT BELOW -1EF6 ; mapped ; 1EF7 # 1.1 LATIN CAPITAL LETTER Y WITH HOOK ABOVE -1EF7 ; valid # 1.1 LATIN SMALL LETTER Y WITH HOOK ABOVE -1EF8 ; mapped ; 1EF9 # 1.1 LATIN CAPITAL LETTER Y WITH TILDE -1EF9 ; valid # 1.1 LATIN SMALL LETTER Y WITH TILDE -1EFA ; mapped ; 1EFB # 5.1 LATIN CAPITAL LETTER MIDDLE-WELSH LL -1EFB ; valid # 5.1 LATIN SMALL LETTER MIDDLE-WELSH LL -1EFC ; mapped ; 1EFD # 5.1 LATIN CAPITAL LETTER MIDDLE-WELSH V -1EFD ; valid # 5.1 LATIN SMALL LETTER MIDDLE-WELSH V -1EFE ; mapped ; 1EFF # 5.1 LATIN CAPITAL LETTER Y WITH LOOP -1EFF ; valid # 5.1 LATIN SMALL LETTER Y WITH LOOP -1F00..1F07 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F08 ; mapped ; 1F00 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI -1F09 ; mapped ; 1F01 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA -1F0A ; mapped ; 1F02 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA -1F0B ; mapped ; 1F03 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA -1F0C ; mapped ; 1F04 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA -1F0D ; mapped ; 1F05 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA -1F0E ; mapped ; 1F06 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI -1F0F ; mapped ; 1F07 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F10..1F15 ; valid # 1.1 GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F16..1F17 ; disallowed # NA .. -1F18 ; mapped ; 1F10 # 1.1 GREEK CAPITAL LETTER EPSILON WITH PSILI -1F19 ; mapped ; 1F11 # 1.1 GREEK CAPITAL LETTER EPSILON WITH DASIA -1F1A ; mapped ; 1F12 # 1.1 GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA -1F1B ; mapped ; 1F13 # 1.1 GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA -1F1C ; mapped ; 1F14 # 1.1 GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA -1F1D ; mapped ; 1F15 # 1.1 GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F1E..1F1F ; disallowed # NA .. -1F20..1F27 ; valid # 1.1 GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI -1F28 ; mapped ; 1F20 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI -1F29 ; mapped ; 1F21 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA -1F2A ; mapped ; 1F22 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA -1F2B ; mapped ; 1F23 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA -1F2C ; mapped ; 1F24 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA -1F2D ; mapped ; 1F25 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA -1F2E ; mapped ; 1F26 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI -1F2F ; mapped ; 1F27 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI -1F30..1F37 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI -1F38 ; mapped ; 1F30 # 1.1 GREEK CAPITAL LETTER IOTA WITH PSILI -1F39 ; mapped ; 1F31 # 1.1 GREEK CAPITAL LETTER IOTA WITH DASIA -1F3A ; mapped ; 1F32 # 1.1 GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA -1F3B ; mapped ; 1F33 # 1.1 GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA -1F3C ; mapped ; 1F34 # 1.1 GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA -1F3D ; mapped ; 1F35 # 1.1 GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA -1F3E ; mapped ; 1F36 # 1.1 GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI -1F3F ; mapped ; 1F37 # 1.1 GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI -1F40..1F45 ; valid # 1.1 GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F46..1F47 ; disallowed # NA .. -1F48 ; mapped ; 1F40 # 1.1 GREEK CAPITAL LETTER OMICRON WITH PSILI -1F49 ; mapped ; 1F41 # 1.1 GREEK CAPITAL LETTER OMICRON WITH DASIA -1F4A ; mapped ; 1F42 # 1.1 GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA -1F4B ; mapped ; 1F43 # 1.1 GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA -1F4C ; mapped ; 1F44 # 1.1 GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA -1F4D ; mapped ; 1F45 # 1.1 GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F4E..1F4F ; disallowed # NA .. -1F50..1F57 ; valid # 1.1 GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F58 ; disallowed # NA -1F59 ; mapped ; 1F51 # 1.1 GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5A ; disallowed # NA -1F5B ; mapped ; 1F53 # 1.1 GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5C ; disallowed # NA -1F5D ; mapped ; 1F55 # 1.1 GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5E ; disallowed # NA -1F5F ; mapped ; 1F57 # 1.1 GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F60..1F67 ; valid # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI -1F68 ; mapped ; 1F60 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI -1F69 ; mapped ; 1F61 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA -1F6A ; mapped ; 1F62 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA -1F6B ; mapped ; 1F63 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA -1F6C ; mapped ; 1F64 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA -1F6D ; mapped ; 1F65 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA -1F6E ; mapped ; 1F66 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI -1F6F ; mapped ; 1F67 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI -1F70 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH VARIA -1F71 ; mapped ; 03AC # 1.1 GREEK SMALL LETTER ALPHA WITH OXIA -1F72 ; valid # 1.1 GREEK SMALL LETTER EPSILON WITH VARIA -1F73 ; mapped ; 03AD # 1.1 GREEK SMALL LETTER EPSILON WITH OXIA -1F74 ; valid # 1.1 GREEK SMALL LETTER ETA WITH VARIA -1F75 ; mapped ; 03AE # 1.1 GREEK SMALL LETTER ETA WITH OXIA -1F76 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH VARIA -1F77 ; mapped ; 03AF # 1.1 GREEK SMALL LETTER IOTA WITH OXIA -1F78 ; valid # 1.1 GREEK SMALL LETTER OMICRON WITH VARIA -1F79 ; mapped ; 03CC # 1.1 GREEK SMALL LETTER OMICRON WITH OXIA -1F7A ; valid # 1.1 GREEK SMALL LETTER UPSILON WITH VARIA -1F7B ; mapped ; 03CD # 1.1 GREEK SMALL LETTER UPSILON WITH OXIA -1F7C ; valid # 1.1 GREEK SMALL LETTER OMEGA WITH VARIA -1F7D ; mapped ; 03CE # 1.1 GREEK SMALL LETTER OMEGA WITH OXIA -1F7E..1F7F ; disallowed # NA .. -1F80 ; mapped ; 1F00 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI -1F81 ; mapped ; 1F01 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI -1F82 ; mapped ; 1F02 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI -1F83 ; mapped ; 1F03 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI -1F84 ; mapped ; 1F04 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI -1F85 ; mapped ; 1F05 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI -1F86 ; mapped ; 1F06 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -1F87 ; mapped ; 1F07 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1F88 ; mapped ; 1F00 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI -1F89 ; mapped ; 1F01 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI -1F8A ; mapped ; 1F02 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI -1F8B ; mapped ; 1F03 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI -1F8C ; mapped ; 1F04 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI -1F8D ; mapped ; 1F05 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI -1F8E ; mapped ; 1F06 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -1F8F ; mapped ; 1F07 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1F90 ; mapped ; 1F20 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI -1F91 ; mapped ; 1F21 03B9 # 1.1 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI -1F92 ; mapped ; 1F22 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI -1F93 ; mapped ; 1F23 03B9 # 1.1 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI -1F94 ; mapped ; 1F24 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI -1F95 ; mapped ; 1F25 03B9 # 1.1 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI -1F96 ; mapped ; 1F26 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -1F97 ; mapped ; 1F27 03B9 # 1.1 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1F98 ; mapped ; 1F20 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI -1F99 ; mapped ; 1F21 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI -1F9A ; mapped ; 1F22 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI -1F9B ; mapped ; 1F23 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI -1F9C ; mapped ; 1F24 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI -1F9D ; mapped ; 1F25 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI -1F9E ; mapped ; 1F26 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -1F9F ; mapped ; 1F27 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1FA0 ; mapped ; 1F60 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI -1FA1 ; mapped ; 1F61 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI -1FA2 ; mapped ; 1F62 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI -1FA3 ; mapped ; 1F63 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI -1FA4 ; mapped ; 1F64 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI -1FA5 ; mapped ; 1F65 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI -1FA6 ; mapped ; 1F66 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -1FA7 ; mapped ; 1F67 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1FA8 ; mapped ; 1F60 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI -1FA9 ; mapped ; 1F61 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI -1FAA ; mapped ; 1F62 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI -1FAB ; mapped ; 1F63 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI -1FAC ; mapped ; 1F64 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI -1FAD ; mapped ; 1F65 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI -1FAE ; mapped ; 1F66 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -1FAF ; mapped ; 1F67 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1FB0..1FB1 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH MACRON -1FB2 ; mapped ; 1F70 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI -1FB3 ; mapped ; 03B1 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI -1FB4 ; mapped ; 03AC 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB5 ; disallowed # NA -1FB6 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH PERISPOMENI -1FB7 ; mapped ; 1FB6 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI -1FB8 ; mapped ; 1FB0 # 1.1 GREEK CAPITAL LETTER ALPHA WITH VRACHY -1FB9 ; mapped ; 1FB1 # 1.1 GREEK CAPITAL LETTER ALPHA WITH MACRON -1FBA ; mapped ; 1F70 # 1.1 GREEK CAPITAL LETTER ALPHA WITH VARIA -1FBB ; mapped ; 03AC # 1.1 GREEK CAPITAL LETTER ALPHA WITH OXIA -1FBC ; mapped ; 03B1 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBD ; disallowed_STD3_mapped ; 0020 0313 # 1.1 GREEK KORONIS -1FBE ; mapped ; 03B9 # 1.1 GREEK PROSGEGRAMMENI -1FBF ; disallowed_STD3_mapped ; 0020 0313 # 1.1 GREEK PSILI -1FC0 ; disallowed_STD3_mapped ; 0020 0342 # 1.1 GREEK PERISPOMENI -1FC1 ; disallowed_STD3_mapped ; 0020 0308 0342 #1.1 GREEK DIALYTIKA AND PERISPOMENI -1FC2 ; mapped ; 1F74 03B9 # 1.1 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI -1FC3 ; mapped ; 03B7 03B9 # 1.1 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI -1FC4 ; mapped ; 03AE 03B9 # 1.1 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC5 ; disallowed # NA -1FC6 ; valid # 1.1 GREEK SMALL LETTER ETA WITH PERISPOMENI -1FC7 ; mapped ; 1FC6 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI -1FC8 ; mapped ; 1F72 # 1.1 GREEK CAPITAL LETTER EPSILON WITH VARIA -1FC9 ; mapped ; 03AD # 1.1 GREEK CAPITAL LETTER EPSILON WITH OXIA -1FCA ; mapped ; 1F74 # 1.1 GREEK CAPITAL LETTER ETA WITH VARIA -1FCB ; mapped ; 03AE # 1.1 GREEK CAPITAL LETTER ETA WITH OXIA -1FCC ; mapped ; 03B7 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FCD ; disallowed_STD3_mapped ; 0020 0313 0300 #1.1 GREEK PSILI AND VARIA -1FCE ; disallowed_STD3_mapped ; 0020 0313 0301 #1.1 GREEK PSILI AND OXIA -1FCF ; disallowed_STD3_mapped ; 0020 0313 0342 #1.1 GREEK PSILI AND PERISPOMENI -1FD0..1FD2 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA -1FD3 ; mapped ; 0390 # 1.1 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD4..1FD5 ; disallowed # NA .. -1FD6..1FD7 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI -1FD8 ; mapped ; 1FD0 # 1.1 GREEK CAPITAL LETTER IOTA WITH VRACHY -1FD9 ; mapped ; 1FD1 # 1.1 GREEK CAPITAL LETTER IOTA WITH MACRON -1FDA ; mapped ; 1F76 # 1.1 GREEK CAPITAL LETTER IOTA WITH VARIA -1FDB ; mapped ; 03AF # 1.1 GREEK CAPITAL LETTER IOTA WITH OXIA -1FDC ; disallowed # NA -1FDD ; disallowed_STD3_mapped ; 0020 0314 0300 #1.1 GREEK DASIA AND VARIA -1FDE ; disallowed_STD3_mapped ; 0020 0314 0301 #1.1 GREEK DASIA AND OXIA -1FDF ; disallowed_STD3_mapped ; 0020 0314 0342 #1.1 GREEK DASIA AND PERISPOMENI -1FE0..1FE2 ; valid # 1.1 GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA -1FE3 ; mapped ; 03B0 # 1.1 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA -1FE4..1FE7 ; valid # 1.1 GREEK SMALL LETTER RHO WITH PSILI..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI -1FE8 ; mapped ; 1FE0 # 1.1 GREEK CAPITAL LETTER UPSILON WITH VRACHY -1FE9 ; mapped ; 1FE1 # 1.1 GREEK CAPITAL LETTER UPSILON WITH MACRON -1FEA ; mapped ; 1F7A # 1.1 GREEK CAPITAL LETTER UPSILON WITH VARIA -1FEB ; mapped ; 03CD # 1.1 GREEK CAPITAL LETTER UPSILON WITH OXIA -1FEC ; mapped ; 1FE5 # 1.1 GREEK CAPITAL LETTER RHO WITH DASIA -1FED ; disallowed_STD3_mapped ; 0020 0308 0300 #1.1 GREEK DIALYTIKA AND VARIA -1FEE ; disallowed_STD3_mapped ; 0020 0308 0301 #1.1 GREEK DIALYTIKA AND OXIA -1FEF ; disallowed_STD3_mapped ; 0060 # 1.1 GREEK VARIA -1FF0..1FF1 ; disallowed # NA .. -1FF2 ; mapped ; 1F7C 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI -1FF3 ; mapped ; 03C9 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI -1FF4 ; mapped ; 03CE 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF5 ; disallowed # NA -1FF6 ; valid # 1.1 GREEK SMALL LETTER OMEGA WITH PERISPOMENI -1FF7 ; mapped ; 1FF6 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI -1FF8 ; mapped ; 1F78 # 1.1 GREEK CAPITAL LETTER OMICRON WITH VARIA -1FF9 ; mapped ; 03CC # 1.1 GREEK CAPITAL LETTER OMICRON WITH OXIA -1FFA ; mapped ; 1F7C # 1.1 GREEK CAPITAL LETTER OMEGA WITH VARIA -1FFB ; mapped ; 03CE # 1.1 GREEK CAPITAL LETTER OMEGA WITH OXIA -1FFC ; mapped ; 03C9 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -1FFD ; disallowed_STD3_mapped ; 0020 0301 # 1.1 GREEK OXIA -1FFE ; disallowed_STD3_mapped ; 0020 0314 # 1.1 GREEK DASIA -1FFF ; disallowed # NA -2000..200A ; disallowed_STD3_mapped ; 0020 # 1.1 EN QUAD..HAIR SPACE -200B ; ignored # 1.1 ZERO WIDTH SPACE -200C..200D ; deviation ; # 1.1 ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER -200E..200F ; disallowed # 1.1 LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK -2010 ; valid ; ; NV8 # 1.1 HYPHEN -2011 ; mapped ; 2010 # 1.1 NON-BREAKING HYPHEN -2012..2016 ; valid ; ; NV8 # 1.1 FIGURE DASH..DOUBLE VERTICAL LINE -2017 ; disallowed_STD3_mapped ; 0020 0333 # 1.1 DOUBLE LOW LINE -2018..2023 ; valid ; ; NV8 # 1.1 LEFT SINGLE QUOTATION MARK..TRIANGULAR BULLET -2024..2026 ; disallowed # 1.1 ONE DOT LEADER..HORIZONTAL ELLIPSIS -2027 ; valid ; ; NV8 # 1.1 HYPHENATION POINT -2028..202E ; disallowed # 1.1 LINE SEPARATOR..RIGHT-TO-LEFT OVERRIDE -202F ; disallowed_STD3_mapped ; 0020 # 3.0 NARROW NO-BREAK SPACE -2030..2032 ; valid ; ; NV8 # 1.1 PER MILLE SIGN..PRIME -2033 ; mapped ; 2032 2032 # 1.1 DOUBLE PRIME -2034 ; mapped ; 2032 2032 2032 #1.1 TRIPLE PRIME -2035 ; valid ; ; NV8 # 1.1 REVERSED PRIME -2036 ; mapped ; 2035 2035 # 1.1 REVERSED DOUBLE PRIME -2037 ; mapped ; 2035 2035 2035 #1.1 REVERSED TRIPLE PRIME -2038..203B ; valid ; ; NV8 # 1.1 CARET..REFERENCE MARK -203C ; disallowed_STD3_mapped ; 0021 0021 # 1.1 DOUBLE EXCLAMATION MARK -203D ; valid ; ; NV8 # 1.1 INTERROBANG -203E ; disallowed_STD3_mapped ; 0020 0305 # 1.1 OVERLINE -203F..2046 ; valid ; ; NV8 # 1.1 UNDERTIE..RIGHT SQUARE BRACKET WITH QUILL -2047 ; disallowed_STD3_mapped ; 003F 003F # 3.2 DOUBLE QUESTION MARK -2048 ; disallowed_STD3_mapped ; 003F 0021 # 3.0 QUESTION EXCLAMATION MARK -2049 ; disallowed_STD3_mapped ; 0021 003F # 3.0 EXCLAMATION QUESTION MARK -204A..204D ; valid ; ; NV8 # 3.0 TIRONIAN SIGN ET..BLACK RIGHTWARDS BULLET -204E..2052 ; valid ; ; NV8 # 3.2 LOW ASTERISK..COMMERCIAL MINUS SIGN -2053..2054 ; valid ; ; NV8 # 4.0 SWUNG DASH..INVERTED UNDERTIE -2055..2056 ; valid ; ; NV8 # 4.1 FLOWER PUNCTUATION MARK..THREE DOT PUNCTUATION -2057 ; mapped ; 2032 2032 2032 2032 #3.2 QUADRUPLE PRIME -2058..205E ; valid ; ; NV8 # 4.1 FOUR DOT PUNCTUATION..VERTICAL FOUR DOTS -205F ; disallowed_STD3_mapped ; 0020 # 3.2 MEDIUM MATHEMATICAL SPACE -2060 ; ignored # 3.2 WORD JOINER -2061..2063 ; disallowed # 3.2 FUNCTION APPLICATION..INVISIBLE SEPARATOR -2064 ; ignored # 5.1 INVISIBLE PLUS -2065 ; disallowed # NA -2066..2069 ; disallowed # 6.3 LEFT-TO-RIGHT ISOLATE..POP DIRECTIONAL ISOLATE -206A..206F ; disallowed # 1.1 INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES -2070 ; mapped ; 0030 # 1.1 SUPERSCRIPT ZERO -2071 ; mapped ; 0069 # 3.2 SUPERSCRIPT LATIN SMALL LETTER I -2072..2073 ; disallowed # NA .. -2074 ; mapped ; 0034 # 1.1 SUPERSCRIPT FOUR -2075 ; mapped ; 0035 # 1.1 SUPERSCRIPT FIVE -2076 ; mapped ; 0036 # 1.1 SUPERSCRIPT SIX -2077 ; mapped ; 0037 # 1.1 SUPERSCRIPT SEVEN -2078 ; mapped ; 0038 # 1.1 SUPERSCRIPT EIGHT -2079 ; mapped ; 0039 # 1.1 SUPERSCRIPT NINE -207A ; disallowed_STD3_mapped ; 002B # 1.1 SUPERSCRIPT PLUS SIGN -207B ; mapped ; 2212 # 1.1 SUPERSCRIPT MINUS -207C ; disallowed_STD3_mapped ; 003D # 1.1 SUPERSCRIPT EQUALS SIGN -207D ; disallowed_STD3_mapped ; 0028 # 1.1 SUPERSCRIPT LEFT PARENTHESIS -207E ; disallowed_STD3_mapped ; 0029 # 1.1 SUPERSCRIPT RIGHT PARENTHESIS -207F ; mapped ; 006E # 1.1 SUPERSCRIPT LATIN SMALL LETTER N -2080 ; mapped ; 0030 # 1.1 SUBSCRIPT ZERO -2081 ; mapped ; 0031 # 1.1 SUBSCRIPT ONE -2082 ; mapped ; 0032 # 1.1 SUBSCRIPT TWO -2083 ; mapped ; 0033 # 1.1 SUBSCRIPT THREE -2084 ; mapped ; 0034 # 1.1 SUBSCRIPT FOUR -2085 ; mapped ; 0035 # 1.1 SUBSCRIPT FIVE -2086 ; mapped ; 0036 # 1.1 SUBSCRIPT SIX -2087 ; mapped ; 0037 # 1.1 SUBSCRIPT SEVEN -2088 ; mapped ; 0038 # 1.1 SUBSCRIPT EIGHT -2089 ; mapped ; 0039 # 1.1 SUBSCRIPT NINE -208A ; disallowed_STD3_mapped ; 002B # 1.1 SUBSCRIPT PLUS SIGN -208B ; mapped ; 2212 # 1.1 SUBSCRIPT MINUS -208C ; disallowed_STD3_mapped ; 003D # 1.1 SUBSCRIPT EQUALS SIGN -208D ; disallowed_STD3_mapped ; 0028 # 1.1 SUBSCRIPT LEFT PARENTHESIS -208E ; disallowed_STD3_mapped ; 0029 # 1.1 SUBSCRIPT RIGHT PARENTHESIS -208F ; disallowed # NA -2090 ; mapped ; 0061 # 4.1 LATIN SUBSCRIPT SMALL LETTER A -2091 ; mapped ; 0065 # 4.1 LATIN SUBSCRIPT SMALL LETTER E -2092 ; mapped ; 006F # 4.1 LATIN SUBSCRIPT SMALL LETTER O -2093 ; mapped ; 0078 # 4.1 LATIN SUBSCRIPT SMALL LETTER X -2094 ; mapped ; 0259 # 4.1 LATIN SUBSCRIPT SMALL LETTER SCHWA -2095 ; mapped ; 0068 # 6.0 LATIN SUBSCRIPT SMALL LETTER H -2096 ; mapped ; 006B # 6.0 LATIN SUBSCRIPT SMALL LETTER K -2097 ; mapped ; 006C # 6.0 LATIN SUBSCRIPT SMALL LETTER L -2098 ; mapped ; 006D # 6.0 LATIN SUBSCRIPT SMALL LETTER M -2099 ; mapped ; 006E # 6.0 LATIN SUBSCRIPT SMALL LETTER N -209A ; mapped ; 0070 # 6.0 LATIN SUBSCRIPT SMALL LETTER P -209B ; mapped ; 0073 # 6.0 LATIN SUBSCRIPT SMALL LETTER S -209C ; mapped ; 0074 # 6.0 LATIN SUBSCRIPT SMALL LETTER T -209D..209F ; disallowed # NA .. -20A0..20A7 ; valid ; ; NV8 # 1.1 EURO-CURRENCY SIGN..PESETA SIGN -20A8 ; mapped ; 0072 0073 # 1.1 RUPEE SIGN -20A9..20AA ; valid ; ; NV8 # 1.1 WON SIGN..NEW SHEQEL SIGN -20AB ; valid ; ; NV8 # 2.0 DONG SIGN -20AC ; valid ; ; NV8 # 2.1 EURO SIGN -20AD..20AF ; valid ; ; NV8 # 3.0 KIP SIGN..DRACHMA SIGN -20B0..20B1 ; valid ; ; NV8 # 3.2 GERMAN PENNY SIGN..PESO SIGN -20B2..20B5 ; valid ; ; NV8 # 4.1 GUARANI SIGN..CEDI SIGN -20B6..20B8 ; valid ; ; NV8 # 5.2 LIVRE TOURNOIS SIGN..TENGE SIGN -20B9 ; valid ; ; NV8 # 6.0 INDIAN RUPEE SIGN -20BA ; valid ; ; NV8 # 6.2 TURKISH LIRA SIGN -20BB..20BD ; valid ; ; NV8 # 7.0 NORDIC MARK SIGN..RUBLE SIGN -20BE ; valid ; ; NV8 # 8.0 LARI SIGN -20BF ; valid ; ; NV8 # 10.0 BITCOIN SIGN -20C0..20CF ; disallowed # NA .. -20D0..20E1 ; valid ; ; NV8 # 1.1 COMBINING LEFT HARPOON ABOVE..COMBINING LEFT RIGHT ARROW ABOVE -20E2..20E3 ; valid ; ; NV8 # 3.0 COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING KEYCAP -20E4..20EA ; valid ; ; NV8 # 3.2 COMBINING ENCLOSING UPWARD POINTING TRIANGLE..COMBINING LEFTWARDS ARROW OVERLAY -20EB ; valid ; ; NV8 # 4.1 COMBINING LONG DOUBLE SOLIDUS OVERLAY -20EC..20EF ; valid ; ; NV8 # 5.0 COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS..COMBINING RIGHT ARROW BELOW -20F0 ; valid ; ; NV8 # 5.1 COMBINING ASTERISK ABOVE -20F1..20FF ; disallowed # NA .. -2100 ; disallowed_STD3_mapped ; 0061 002F 0063 #1.1 ACCOUNT OF -2101 ; disallowed_STD3_mapped ; 0061 002F 0073 #1.1 ADDRESSED TO THE SUBJECT -2102 ; mapped ; 0063 # 1.1 DOUBLE-STRUCK CAPITAL C -2103 ; mapped ; 00B0 0063 # 1.1 DEGREE CELSIUS -2104 ; valid ; ; NV8 # 1.1 CENTRE LINE SYMBOL -2105 ; disallowed_STD3_mapped ; 0063 002F 006F #1.1 CARE OF -2106 ; disallowed_STD3_mapped ; 0063 002F 0075 #1.1 CADA UNA -2107 ; mapped ; 025B # 1.1 EULER CONSTANT -2108 ; valid ; ; NV8 # 1.1 SCRUPLE -2109 ; mapped ; 00B0 0066 # 1.1 DEGREE FAHRENHEIT -210A ; mapped ; 0067 # 1.1 SCRIPT SMALL G -210B..210E ; mapped ; 0068 # 1.1 SCRIPT CAPITAL H..PLANCK CONSTANT -210F ; mapped ; 0127 # 1.1 PLANCK CONSTANT OVER TWO PI -2110..2111 ; mapped ; 0069 # 1.1 SCRIPT CAPITAL I..BLACK-LETTER CAPITAL I -2112..2113 ; mapped ; 006C # 1.1 SCRIPT CAPITAL L..SCRIPT SMALL L -2114 ; valid ; ; NV8 # 1.1 L B BAR SYMBOL -2115 ; mapped ; 006E # 1.1 DOUBLE-STRUCK CAPITAL N -2116 ; mapped ; 006E 006F # 1.1 NUMERO SIGN -2117..2118 ; valid ; ; NV8 # 1.1 SOUND RECORDING COPYRIGHT..SCRIPT CAPITAL P -2119 ; mapped ; 0070 # 1.1 DOUBLE-STRUCK CAPITAL P -211A ; mapped ; 0071 # 1.1 DOUBLE-STRUCK CAPITAL Q -211B..211D ; mapped ; 0072 # 1.1 SCRIPT CAPITAL R..DOUBLE-STRUCK CAPITAL R -211E..211F ; valid ; ; NV8 # 1.1 PRESCRIPTION TAKE..RESPONSE -2120 ; mapped ; 0073 006D # 1.1 SERVICE MARK -2121 ; mapped ; 0074 0065 006C #1.1 TELEPHONE SIGN -2122 ; mapped ; 0074 006D # 1.1 TRADE MARK SIGN -2123 ; valid ; ; NV8 # 1.1 VERSICLE -2124 ; mapped ; 007A # 1.1 DOUBLE-STRUCK CAPITAL Z -2125 ; valid ; ; NV8 # 1.1 OUNCE SIGN -2126 ; mapped ; 03C9 # 1.1 OHM SIGN -2127 ; valid ; ; NV8 # 1.1 INVERTED OHM SIGN -2128 ; mapped ; 007A # 1.1 BLACK-LETTER CAPITAL Z -2129 ; valid ; ; NV8 # 1.1 TURNED GREEK SMALL LETTER IOTA -212A ; mapped ; 006B # 1.1 KELVIN SIGN -212B ; mapped ; 00E5 # 1.1 ANGSTROM SIGN -212C ; mapped ; 0062 # 1.1 SCRIPT CAPITAL B -212D ; mapped ; 0063 # 1.1 BLACK-LETTER CAPITAL C -212E ; valid ; ; NV8 # 1.1 ESTIMATED SYMBOL -212F..2130 ; mapped ; 0065 # 1.1 SCRIPT SMALL E..SCRIPT CAPITAL E -2131 ; mapped ; 0066 # 1.1 SCRIPT CAPITAL F -2132 ; disallowed # 1.1 TURNED CAPITAL F -2133 ; mapped ; 006D # 1.1 SCRIPT CAPITAL M -2134 ; mapped ; 006F # 1.1 SCRIPT SMALL O -2135 ; mapped ; 05D0 # 1.1 ALEF SYMBOL -2136 ; mapped ; 05D1 # 1.1 BET SYMBOL -2137 ; mapped ; 05D2 # 1.1 GIMEL SYMBOL -2138 ; mapped ; 05D3 # 1.1 DALET SYMBOL -2139 ; mapped ; 0069 # 3.0 INFORMATION SOURCE -213A ; valid ; ; NV8 # 3.0 ROTATED CAPITAL Q -213B ; mapped ; 0066 0061 0078 #4.0 FACSIMILE SIGN -213C ; mapped ; 03C0 # 4.1 DOUBLE-STRUCK SMALL PI -213D..213E ; mapped ; 03B3 # 3.2 DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL GAMMA -213F ; mapped ; 03C0 # 3.2 DOUBLE-STRUCK CAPITAL PI -2140 ; mapped ; 2211 # 3.2 DOUBLE-STRUCK N-ARY SUMMATION -2141..2144 ; valid ; ; NV8 # 3.2 TURNED SANS-SERIF CAPITAL G..TURNED SANS-SERIF CAPITAL Y -2145..2146 ; mapped ; 0064 # 3.2 DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL D -2147 ; mapped ; 0065 # 3.2 DOUBLE-STRUCK ITALIC SMALL E -2148 ; mapped ; 0069 # 3.2 DOUBLE-STRUCK ITALIC SMALL I -2149 ; mapped ; 006A # 3.2 DOUBLE-STRUCK ITALIC SMALL J -214A..214B ; valid ; ; NV8 # 3.2 PROPERTY LINE..TURNED AMPERSAND -214C ; valid ; ; NV8 # 4.1 PER SIGN -214D ; valid ; ; NV8 # 5.0 AKTIESELSKAB -214E ; valid # 5.0 TURNED SMALL F -214F ; valid ; ; NV8 # 5.1 SYMBOL FOR SAMARITAN SOURCE -2150 ; mapped ; 0031 2044 0037 #5.2 VULGAR FRACTION ONE SEVENTH -2151 ; mapped ; 0031 2044 0039 #5.2 VULGAR FRACTION ONE NINTH -2152 ; mapped ; 0031 2044 0031 0030 #5.2 VULGAR FRACTION ONE TENTH -2153 ; mapped ; 0031 2044 0033 #1.1 VULGAR FRACTION ONE THIRD -2154 ; mapped ; 0032 2044 0033 #1.1 VULGAR FRACTION TWO THIRDS -2155 ; mapped ; 0031 2044 0035 #1.1 VULGAR FRACTION ONE FIFTH -2156 ; mapped ; 0032 2044 0035 #1.1 VULGAR FRACTION TWO FIFTHS -2157 ; mapped ; 0033 2044 0035 #1.1 VULGAR FRACTION THREE FIFTHS -2158 ; mapped ; 0034 2044 0035 #1.1 VULGAR FRACTION FOUR FIFTHS -2159 ; mapped ; 0031 2044 0036 #1.1 VULGAR FRACTION ONE SIXTH -215A ; mapped ; 0035 2044 0036 #1.1 VULGAR FRACTION FIVE SIXTHS -215B ; mapped ; 0031 2044 0038 #1.1 VULGAR FRACTION ONE EIGHTH -215C ; mapped ; 0033 2044 0038 #1.1 VULGAR FRACTION THREE EIGHTHS -215D ; mapped ; 0035 2044 0038 #1.1 VULGAR FRACTION FIVE EIGHTHS -215E ; mapped ; 0037 2044 0038 #1.1 VULGAR FRACTION SEVEN EIGHTHS -215F ; mapped ; 0031 2044 # 1.1 FRACTION NUMERATOR ONE -2160 ; mapped ; 0069 # 1.1 ROMAN NUMERAL ONE -2161 ; mapped ; 0069 0069 # 1.1 ROMAN NUMERAL TWO -2162 ; mapped ; 0069 0069 0069 #1.1 ROMAN NUMERAL THREE -2163 ; mapped ; 0069 0076 # 1.1 ROMAN NUMERAL FOUR -2164 ; mapped ; 0076 # 1.1 ROMAN NUMERAL FIVE -2165 ; mapped ; 0076 0069 # 1.1 ROMAN NUMERAL SIX -2166 ; mapped ; 0076 0069 0069 #1.1 ROMAN NUMERAL SEVEN -2167 ; mapped ; 0076 0069 0069 0069 #1.1 ROMAN NUMERAL EIGHT -2168 ; mapped ; 0069 0078 # 1.1 ROMAN NUMERAL NINE -2169 ; mapped ; 0078 # 1.1 ROMAN NUMERAL TEN -216A ; mapped ; 0078 0069 # 1.1 ROMAN NUMERAL ELEVEN -216B ; mapped ; 0078 0069 0069 #1.1 ROMAN NUMERAL TWELVE -216C ; mapped ; 006C # 1.1 ROMAN NUMERAL FIFTY -216D ; mapped ; 0063 # 1.1 ROMAN NUMERAL ONE HUNDRED -216E ; mapped ; 0064 # 1.1 ROMAN NUMERAL FIVE HUNDRED -216F ; mapped ; 006D # 1.1 ROMAN NUMERAL ONE THOUSAND -2170 ; mapped ; 0069 # 1.1 SMALL ROMAN NUMERAL ONE -2171 ; mapped ; 0069 0069 # 1.1 SMALL ROMAN NUMERAL TWO -2172 ; mapped ; 0069 0069 0069 #1.1 SMALL ROMAN NUMERAL THREE -2173 ; mapped ; 0069 0076 # 1.1 SMALL ROMAN NUMERAL FOUR -2174 ; mapped ; 0076 # 1.1 SMALL ROMAN NUMERAL FIVE -2175 ; mapped ; 0076 0069 # 1.1 SMALL ROMAN NUMERAL SIX -2176 ; mapped ; 0076 0069 0069 #1.1 SMALL ROMAN NUMERAL SEVEN -2177 ; mapped ; 0076 0069 0069 0069 #1.1 SMALL ROMAN NUMERAL EIGHT -2178 ; mapped ; 0069 0078 # 1.1 SMALL ROMAN NUMERAL NINE -2179 ; mapped ; 0078 # 1.1 SMALL ROMAN NUMERAL TEN -217A ; mapped ; 0078 0069 # 1.1 SMALL ROMAN NUMERAL ELEVEN -217B ; mapped ; 0078 0069 0069 #1.1 SMALL ROMAN NUMERAL TWELVE -217C ; mapped ; 006C # 1.1 SMALL ROMAN NUMERAL FIFTY -217D ; mapped ; 0063 # 1.1 SMALL ROMAN NUMERAL ONE HUNDRED -217E ; mapped ; 0064 # 1.1 SMALL ROMAN NUMERAL FIVE HUNDRED -217F ; mapped ; 006D # 1.1 SMALL ROMAN NUMERAL ONE THOUSAND -2180..2182 ; valid ; ; NV8 # 1.1 ROMAN NUMERAL ONE THOUSAND C D..ROMAN NUMERAL TEN THOUSAND -2183 ; disallowed # 3.0 ROMAN NUMERAL REVERSED ONE HUNDRED -2184 ; valid # 5.0 LATIN SMALL LETTER REVERSED C -2185..2188 ; valid ; ; NV8 # 5.1 ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND -2189 ; mapped ; 0030 2044 0033 #5.2 VULGAR FRACTION ZERO THIRDS -218A..218B ; valid ; ; NV8 # 8.0 TURNED DIGIT TWO..TURNED DIGIT THREE -218C..218F ; disallowed # NA .. -2190..21EA ; valid ; ; NV8 # 1.1 LEFTWARDS ARROW..UPWARDS WHITE ARROW FROM BAR -21EB..21F3 ; valid ; ; NV8 # 3.0 UPWARDS WHITE ARROW ON PEDESTAL..UP DOWN WHITE ARROW -21F4..21FF ; valid ; ; NV8 # 3.2 RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW -2200..222B ; valid ; ; NV8 # 1.1 FOR ALL..INTEGRAL -222C ; mapped ; 222B 222B # 1.1 DOUBLE INTEGRAL -222D ; mapped ; 222B 222B 222B #1.1 TRIPLE INTEGRAL -222E ; valid ; ; NV8 # 1.1 CONTOUR INTEGRAL -222F ; mapped ; 222E 222E # 1.1 SURFACE INTEGRAL -2230 ; mapped ; 222E 222E 222E #1.1 VOLUME INTEGRAL -2231..225F ; valid ; ; NV8 # 1.1 CLOCKWISE INTEGRAL..QUESTIONED EQUAL TO -2260 ; disallowed_STD3_valid # 1.1 NOT EQUAL TO -2261..226D ; valid ; ; NV8 # 1.1 IDENTICAL TO..NOT EQUIVALENT TO -226E..226F ; disallowed_STD3_valid # 1.1 NOT LESS-THAN..NOT GREATER-THAN -2270..22F1 ; valid ; ; NV8 # 1.1 NEITHER LESS-THAN NOR EQUAL TO..DOWN RIGHT DIAGONAL ELLIPSIS -22F2..22FF ; valid ; ; NV8 # 3.2 ELEMENT OF WITH LONG HORIZONTAL STROKE..Z NOTATION BAG MEMBERSHIP -2300 ; valid ; ; NV8 # 1.1 DIAMETER SIGN -2301 ; valid ; ; NV8 # 3.0 ELECTRIC ARROW -2302..2328 ; valid ; ; NV8 # 1.1 HOUSE..KEYBOARD -2329 ; mapped ; 3008 # 1.1 LEFT-POINTING ANGLE BRACKET -232A ; mapped ; 3009 # 1.1 RIGHT-POINTING ANGLE BRACKET -232B..237A ; valid ; ; NV8 # 1.1 ERASE TO THE LEFT..APL FUNCTIONAL SYMBOL ALPHA -237B ; valid ; ; NV8 # 3.0 NOT CHECK MARK -237C ; valid ; ; NV8 # 3.2 RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -237D..239A ; valid ; ; NV8 # 3.0 SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL -239B..23CE ; valid ; ; NV8 # 3.2 LEFT PARENTHESIS UPPER HOOK..RETURN SYMBOL -23CF..23D0 ; valid ; ; NV8 # 4.0 EJECT SYMBOL..VERTICAL LINE EXTENSION -23D1..23DB ; valid ; ; NV8 # 4.1 METRICAL BREVE..FUSE -23DC..23E7 ; valid ; ; NV8 # 5.0 TOP PARENTHESIS..ELECTRICAL INTERSECTION -23E8 ; valid ; ; NV8 # 5.2 DECIMAL EXPONENT SYMBOL -23E9..23F3 ; valid ; ; NV8 # 6.0 BLACK RIGHT-POINTING DOUBLE TRIANGLE..HOURGLASS WITH FLOWING SAND -23F4..23FA ; valid ; ; NV8 # 7.0 BLACK MEDIUM LEFT-POINTING TRIANGLE..BLACK CIRCLE FOR RECORD -23FB..23FE ; valid ; ; NV8 # 9.0 POWER SYMBOL..POWER SLEEP SYMBOL -23FF ; valid ; ; NV8 # 10.0 OBSERVER EYE SYMBOL -2400..2424 ; valid ; ; NV8 # 1.1 SYMBOL FOR NULL..SYMBOL FOR NEWLINE -2425..2426 ; valid ; ; NV8 # 3.0 SYMBOL FOR DELETE FORM TWO..SYMBOL FOR SUBSTITUTE FORM TWO -2427..243F ; disallowed # NA .. -2440..244A ; valid ; ; NV8 # 1.1 OCR HOOK..OCR DOUBLE BACKSLASH -244B..245F ; disallowed # NA .. -2460 ; mapped ; 0031 # 1.1 CIRCLED DIGIT ONE -2461 ; mapped ; 0032 # 1.1 CIRCLED DIGIT TWO -2462 ; mapped ; 0033 # 1.1 CIRCLED DIGIT THREE -2463 ; mapped ; 0034 # 1.1 CIRCLED DIGIT FOUR -2464 ; mapped ; 0035 # 1.1 CIRCLED DIGIT FIVE -2465 ; mapped ; 0036 # 1.1 CIRCLED DIGIT SIX -2466 ; mapped ; 0037 # 1.1 CIRCLED DIGIT SEVEN -2467 ; mapped ; 0038 # 1.1 CIRCLED DIGIT EIGHT -2468 ; mapped ; 0039 # 1.1 CIRCLED DIGIT NINE -2469 ; mapped ; 0031 0030 # 1.1 CIRCLED NUMBER TEN -246A ; mapped ; 0031 0031 # 1.1 CIRCLED NUMBER ELEVEN -246B ; mapped ; 0031 0032 # 1.1 CIRCLED NUMBER TWELVE -246C ; mapped ; 0031 0033 # 1.1 CIRCLED NUMBER THIRTEEN -246D ; mapped ; 0031 0034 # 1.1 CIRCLED NUMBER FOURTEEN -246E ; mapped ; 0031 0035 # 1.1 CIRCLED NUMBER FIFTEEN -246F ; mapped ; 0031 0036 # 1.1 CIRCLED NUMBER SIXTEEN -2470 ; mapped ; 0031 0037 # 1.1 CIRCLED NUMBER SEVENTEEN -2471 ; mapped ; 0031 0038 # 1.1 CIRCLED NUMBER EIGHTEEN -2472 ; mapped ; 0031 0039 # 1.1 CIRCLED NUMBER NINETEEN -2473 ; mapped ; 0032 0030 # 1.1 CIRCLED NUMBER TWENTY -2474 ; disallowed_STD3_mapped ; 0028 0031 0029 #1.1 PARENTHESIZED DIGIT ONE -2475 ; disallowed_STD3_mapped ; 0028 0032 0029 #1.1 PARENTHESIZED DIGIT TWO -2476 ; disallowed_STD3_mapped ; 0028 0033 0029 #1.1 PARENTHESIZED DIGIT THREE -2477 ; disallowed_STD3_mapped ; 0028 0034 0029 #1.1 PARENTHESIZED DIGIT FOUR -2478 ; disallowed_STD3_mapped ; 0028 0035 0029 #1.1 PARENTHESIZED DIGIT FIVE -2479 ; disallowed_STD3_mapped ; 0028 0036 0029 #1.1 PARENTHESIZED DIGIT SIX -247A ; disallowed_STD3_mapped ; 0028 0037 0029 #1.1 PARENTHESIZED DIGIT SEVEN -247B ; disallowed_STD3_mapped ; 0028 0038 0029 #1.1 PARENTHESIZED DIGIT EIGHT -247C ; disallowed_STD3_mapped ; 0028 0039 0029 #1.1 PARENTHESIZED DIGIT NINE -247D ; disallowed_STD3_mapped ; 0028 0031 0030 0029 #1.1 PARENTHESIZED NUMBER TEN -247E ; disallowed_STD3_mapped ; 0028 0031 0031 0029 #1.1 PARENTHESIZED NUMBER ELEVEN -247F ; disallowed_STD3_mapped ; 0028 0031 0032 0029 #1.1 PARENTHESIZED NUMBER TWELVE -2480 ; disallowed_STD3_mapped ; 0028 0031 0033 0029 #1.1 PARENTHESIZED NUMBER THIRTEEN -2481 ; disallowed_STD3_mapped ; 0028 0031 0034 0029 #1.1 PARENTHESIZED NUMBER FOURTEEN -2482 ; disallowed_STD3_mapped ; 0028 0031 0035 0029 #1.1 PARENTHESIZED NUMBER FIFTEEN -2483 ; disallowed_STD3_mapped ; 0028 0031 0036 0029 #1.1 PARENTHESIZED NUMBER SIXTEEN -2484 ; disallowed_STD3_mapped ; 0028 0031 0037 0029 #1.1 PARENTHESIZED NUMBER SEVENTEEN -2485 ; disallowed_STD3_mapped ; 0028 0031 0038 0029 #1.1 PARENTHESIZED NUMBER EIGHTEEN -2486 ; disallowed_STD3_mapped ; 0028 0031 0039 0029 #1.1 PARENTHESIZED NUMBER NINETEEN -2487 ; disallowed_STD3_mapped ; 0028 0032 0030 0029 #1.1 PARENTHESIZED NUMBER TWENTY -2488..249B ; disallowed # 1.1 DIGIT ONE FULL STOP..NUMBER TWENTY FULL STOP -249C ; disallowed_STD3_mapped ; 0028 0061 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER A -249D ; disallowed_STD3_mapped ; 0028 0062 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER B -249E ; disallowed_STD3_mapped ; 0028 0063 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER C -249F ; disallowed_STD3_mapped ; 0028 0064 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER D -24A0 ; disallowed_STD3_mapped ; 0028 0065 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER E -24A1 ; disallowed_STD3_mapped ; 0028 0066 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER F -24A2 ; disallowed_STD3_mapped ; 0028 0067 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER G -24A3 ; disallowed_STD3_mapped ; 0028 0068 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER H -24A4 ; disallowed_STD3_mapped ; 0028 0069 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER I -24A5 ; disallowed_STD3_mapped ; 0028 006A 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER J -24A6 ; disallowed_STD3_mapped ; 0028 006B 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER K -24A7 ; disallowed_STD3_mapped ; 0028 006C 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER L -24A8 ; disallowed_STD3_mapped ; 0028 006D 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER M -24A9 ; disallowed_STD3_mapped ; 0028 006E 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER N -24AA ; disallowed_STD3_mapped ; 0028 006F 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER O -24AB ; disallowed_STD3_mapped ; 0028 0070 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER P -24AC ; disallowed_STD3_mapped ; 0028 0071 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER Q -24AD ; disallowed_STD3_mapped ; 0028 0072 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER R -24AE ; disallowed_STD3_mapped ; 0028 0073 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER S -24AF ; disallowed_STD3_mapped ; 0028 0074 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER T -24B0 ; disallowed_STD3_mapped ; 0028 0075 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER U -24B1 ; disallowed_STD3_mapped ; 0028 0076 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER V -24B2 ; disallowed_STD3_mapped ; 0028 0077 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER W -24B3 ; disallowed_STD3_mapped ; 0028 0078 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER X -24B4 ; disallowed_STD3_mapped ; 0028 0079 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER Y -24B5 ; disallowed_STD3_mapped ; 0028 007A 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER Z -24B6 ; mapped ; 0061 # 1.1 CIRCLED LATIN CAPITAL LETTER A -24B7 ; mapped ; 0062 # 1.1 CIRCLED LATIN CAPITAL LETTER B -24B8 ; mapped ; 0063 # 1.1 CIRCLED LATIN CAPITAL LETTER C -24B9 ; mapped ; 0064 # 1.1 CIRCLED LATIN CAPITAL LETTER D -24BA ; mapped ; 0065 # 1.1 CIRCLED LATIN CAPITAL LETTER E -24BB ; mapped ; 0066 # 1.1 CIRCLED LATIN CAPITAL LETTER F -24BC ; mapped ; 0067 # 1.1 CIRCLED LATIN CAPITAL LETTER G -24BD ; mapped ; 0068 # 1.1 CIRCLED LATIN CAPITAL LETTER H -24BE ; mapped ; 0069 # 1.1 CIRCLED LATIN CAPITAL LETTER I -24BF ; mapped ; 006A # 1.1 CIRCLED LATIN CAPITAL LETTER J -24C0 ; mapped ; 006B # 1.1 CIRCLED LATIN CAPITAL LETTER K -24C1 ; mapped ; 006C # 1.1 CIRCLED LATIN CAPITAL LETTER L -24C2 ; mapped ; 006D # 1.1 CIRCLED LATIN CAPITAL LETTER M -24C3 ; mapped ; 006E # 1.1 CIRCLED LATIN CAPITAL LETTER N -24C4 ; mapped ; 006F # 1.1 CIRCLED LATIN CAPITAL LETTER O -24C5 ; mapped ; 0070 # 1.1 CIRCLED LATIN CAPITAL LETTER P -24C6 ; mapped ; 0071 # 1.1 CIRCLED LATIN CAPITAL LETTER Q -24C7 ; mapped ; 0072 # 1.1 CIRCLED LATIN CAPITAL LETTER R -24C8 ; mapped ; 0073 # 1.1 CIRCLED LATIN CAPITAL LETTER S -24C9 ; mapped ; 0074 # 1.1 CIRCLED LATIN CAPITAL LETTER T -24CA ; mapped ; 0075 # 1.1 CIRCLED LATIN CAPITAL LETTER U -24CB ; mapped ; 0076 # 1.1 CIRCLED LATIN CAPITAL LETTER V -24CC ; mapped ; 0077 # 1.1 CIRCLED LATIN CAPITAL LETTER W -24CD ; mapped ; 0078 # 1.1 CIRCLED LATIN CAPITAL LETTER X -24CE ; mapped ; 0079 # 1.1 CIRCLED LATIN CAPITAL LETTER Y -24CF ; mapped ; 007A # 1.1 CIRCLED LATIN CAPITAL LETTER Z -24D0 ; mapped ; 0061 # 1.1 CIRCLED LATIN SMALL LETTER A -24D1 ; mapped ; 0062 # 1.1 CIRCLED LATIN SMALL LETTER B -24D2 ; mapped ; 0063 # 1.1 CIRCLED LATIN SMALL LETTER C -24D3 ; mapped ; 0064 # 1.1 CIRCLED LATIN SMALL LETTER D -24D4 ; mapped ; 0065 # 1.1 CIRCLED LATIN SMALL LETTER E -24D5 ; mapped ; 0066 # 1.1 CIRCLED LATIN SMALL LETTER F -24D6 ; mapped ; 0067 # 1.1 CIRCLED LATIN SMALL LETTER G -24D7 ; mapped ; 0068 # 1.1 CIRCLED LATIN SMALL LETTER H -24D8 ; mapped ; 0069 # 1.1 CIRCLED LATIN SMALL LETTER I -24D9 ; mapped ; 006A # 1.1 CIRCLED LATIN SMALL LETTER J -24DA ; mapped ; 006B # 1.1 CIRCLED LATIN SMALL LETTER K -24DB ; mapped ; 006C # 1.1 CIRCLED LATIN SMALL LETTER L -24DC ; mapped ; 006D # 1.1 CIRCLED LATIN SMALL LETTER M -24DD ; mapped ; 006E # 1.1 CIRCLED LATIN SMALL LETTER N -24DE ; mapped ; 006F # 1.1 CIRCLED LATIN SMALL LETTER O -24DF ; mapped ; 0070 # 1.1 CIRCLED LATIN SMALL LETTER P -24E0 ; mapped ; 0071 # 1.1 CIRCLED LATIN SMALL LETTER Q -24E1 ; mapped ; 0072 # 1.1 CIRCLED LATIN SMALL LETTER R -24E2 ; mapped ; 0073 # 1.1 CIRCLED LATIN SMALL LETTER S -24E3 ; mapped ; 0074 # 1.1 CIRCLED LATIN SMALL LETTER T -24E4 ; mapped ; 0075 # 1.1 CIRCLED LATIN SMALL LETTER U -24E5 ; mapped ; 0076 # 1.1 CIRCLED LATIN SMALL LETTER V -24E6 ; mapped ; 0077 # 1.1 CIRCLED LATIN SMALL LETTER W -24E7 ; mapped ; 0078 # 1.1 CIRCLED LATIN SMALL LETTER X -24E8 ; mapped ; 0079 # 1.1 CIRCLED LATIN SMALL LETTER Y -24E9 ; mapped ; 007A # 1.1 CIRCLED LATIN SMALL LETTER Z -24EA ; mapped ; 0030 # 1.1 CIRCLED DIGIT ZERO -24EB..24FE ; valid ; ; NV8 # 3.2 NEGATIVE CIRCLED NUMBER ELEVEN..DOUBLE CIRCLED NUMBER TEN -24FF ; valid ; ; NV8 # 4.0 NEGATIVE CIRCLED DIGIT ZERO -2500..2595 ; valid ; ; NV8 # 1.1 BOX DRAWINGS LIGHT HORIZONTAL..RIGHT ONE EIGHTH BLOCK -2596..259F ; valid ; ; NV8 # 3.2 QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT -25A0..25EF ; valid ; ; NV8 # 1.1 BLACK SQUARE..LARGE CIRCLE -25F0..25F7 ; valid ; ; NV8 # 3.0 WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT -25F8..25FF ; valid ; ; NV8 # 3.2 UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE -2600..2613 ; valid ; ; NV8 # 1.1 BLACK SUN WITH RAYS..SALTIRE -2614..2615 ; valid ; ; NV8 # 4.0 UMBRELLA WITH RAIN DROPS..HOT BEVERAGE -2616..2617 ; valid ; ; NV8 # 3.2 WHITE SHOGI PIECE..BLACK SHOGI PIECE -2618 ; valid ; ; NV8 # 4.1 SHAMROCK -2619 ; valid ; ; NV8 # 3.0 REVERSED ROTATED FLORAL HEART BULLET -261A..266F ; valid ; ; NV8 # 1.1 BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN -2670..2671 ; valid ; ; NV8 # 3.0 WEST SYRIAC CROSS..EAST SYRIAC CROSS -2672..267D ; valid ; ; NV8 # 3.2 UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL -267E..267F ; valid ; ; NV8 # 4.1 PERMANENT PAPER SIGN..WHEELCHAIR SYMBOL -2680..2689 ; valid ; ; NV8 # 3.2 DIE FACE-1..BLACK CIRCLE WITH TWO WHITE DOTS -268A..2691 ; valid ; ; NV8 # 4.0 MONOGRAM FOR YANG..BLACK FLAG -2692..269C ; valid ; ; NV8 # 4.1 HAMMER AND PICK..FLEUR-DE-LIS -269D ; valid ; ; NV8 # 5.1 OUTLINED WHITE STAR -269E..269F ; valid ; ; NV8 # 5.2 THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT -26A0..26A1 ; valid ; ; NV8 # 4.0 WARNING SIGN..HIGH VOLTAGE SIGN -26A2..26B1 ; valid ; ; NV8 # 4.1 DOUBLED FEMALE SIGN..FUNERAL URN -26B2 ; valid ; ; NV8 # 5.0 NEUTER -26B3..26BC ; valid ; ; NV8 # 5.1 CERES..SESQUIQUADRATE -26BD..26BF ; valid ; ; NV8 # 5.2 SOCCER BALL..SQUARED KEY -26C0..26C3 ; valid ; ; NV8 # 5.1 WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING -26C4..26CD ; valid ; ; NV8 # 5.2 SNOWMAN WITHOUT SNOW..DISABLED CAR -26CE ; valid ; ; NV8 # 6.0 OPHIUCHUS -26CF..26E1 ; valid ; ; NV8 # 5.2 PICK..RESTRICTED LEFT ENTRY-2 -26E2 ; valid ; ; NV8 # 6.0 ASTRONOMICAL SYMBOL FOR URANUS -26E3 ; valid ; ; NV8 # 5.2 HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE -26E4..26E7 ; valid ; ; NV8 # 6.0 PENTAGRAM..INVERTED PENTAGRAM -26E8..26FF ; valid ; ; NV8 # 5.2 BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE -2700 ; valid ; ; NV8 # 7.0 BLACK SAFETY SCISSORS -2701..2704 ; valid ; ; NV8 # 1.1 UPPER BLADE SCISSORS..WHITE SCISSORS -2705 ; valid ; ; NV8 # 6.0 WHITE HEAVY CHECK MARK -2706..2709 ; valid ; ; NV8 # 1.1 TELEPHONE LOCATION SIGN..ENVELOPE -270A..270B ; valid ; ; NV8 # 6.0 RAISED FIST..RAISED HAND -270C..2727 ; valid ; ; NV8 # 1.1 VICTORY HAND..WHITE FOUR POINTED STAR -2728 ; valid ; ; NV8 # 6.0 SPARKLES -2729..274B ; valid ; ; NV8 # 1.1 STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274C ; valid ; ; NV8 # 6.0 CROSS MARK -274D ; valid ; ; NV8 # 1.1 SHADOWED WHITE CIRCLE -274E ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED CROSS MARK -274F..2752 ; valid ; ; NV8 # 1.1 LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE -2753..2755 ; valid ; ; NV8 # 6.0 BLACK QUESTION MARK ORNAMENT..WHITE EXCLAMATION MARK ORNAMENT -2756 ; valid ; ; NV8 # 1.1 BLACK DIAMOND MINUS WHITE X -2757 ; valid ; ; NV8 # 5.2 HEAVY EXCLAMATION MARK SYMBOL -2758..275E ; valid ; ; NV8 # 1.1 LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -275F..2760 ; valid ; ; NV8 # 6.0 HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT..HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT -2761..2767 ; valid ; ; NV8 # 1.1 CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET -2768..2775 ; valid ; ; NV8 # 3.2 MEDIUM LEFT PARENTHESIS ORNAMENT..MEDIUM RIGHT CURLY BRACKET ORNAMENT -2776..2794 ; valid ; ; NV8 # 1.1 DINGBAT NEGATIVE CIRCLED DIGIT ONE..HEAVY WIDE-HEADED RIGHTWARDS ARROW -2795..2797 ; valid ; ; NV8 # 6.0 HEAVY PLUS SIGN..HEAVY DIVISION SIGN -2798..27AF ; valid ; ; NV8 # 1.1 HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B0 ; valid ; ; NV8 # 6.0 CURLY LOOP -27B1..27BE ; valid ; ; NV8 # 1.1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW -27BF ; valid ; ; NV8 # 6.0 DOUBLE CURLY LOOP -27C0..27C6 ; valid ; ; NV8 # 4.1 THREE DIMENSIONAL ANGLE..RIGHT S-SHAPED BAG DELIMITER -27C7..27CA ; valid ; ; NV8 # 5.0 OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE -27CB ; valid ; ; NV8 # 6.1 MATHEMATICAL RISING DIAGONAL -27CC ; valid ; ; NV8 # 5.1 LONG DIVISION -27CD ; valid ; ; NV8 # 6.1 MATHEMATICAL FALLING DIAGONAL -27CE..27CF ; valid ; ; NV8 # 6.0 SQUARED LOGICAL AND..SQUARED LOGICAL OR -27D0..27EB ; valid ; ; NV8 # 3.2 WHITE DIAMOND WITH CENTRED DOT..MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27EC..27EF ; valid ; ; NV8 # 5.1 MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET..MATHEMATICAL RIGHT FLATTENED PARENTHESIS -27F0..27FF ; valid ; ; NV8 # 3.2 UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW -2800..28FF ; valid ; ; NV8 # 3.0 BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 -2900..2A0B ; valid ; ; NV8 # 3.2 RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..SUMMATION WITH INTEGRAL -2A0C ; mapped ; 222B 222B 222B 222B #3.2 QUADRUPLE INTEGRAL OPERATOR -2A0D..2A73 ; valid ; ; NV8 # 3.2 FINITE PART INTEGRAL..EQUALS SIGN ABOVE TILDE OPERATOR -2A74 ; disallowed_STD3_mapped ; 003A 003A 003D #3.2 DOUBLE COLON EQUAL -2A75 ; disallowed_STD3_mapped ; 003D 003D # 3.2 TWO CONSECUTIVE EQUALS SIGNS -2A76 ; disallowed_STD3_mapped ; 003D 003D 003D #3.2 THREE CONSECUTIVE EQUALS SIGNS -2A77..2ADB ; valid ; ; NV8 # 3.2 EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW..TRANSVERSAL INTERSECTION -2ADC ; mapped ; 2ADD 0338 # 3.2 FORKING -2ADD..2AFF ; valid ; ; NV8 # 3.2 NONFORKING..N-ARY WHITE VERTICAL BAR -2B00..2B0D ; valid ; ; NV8 # 4.0 NORTH EAST WHITE ARROW..UP DOWN BLACK ARROW -2B0E..2B13 ; valid ; ; NV8 # 4.1 RIGHTWARDS ARROW WITH TIP DOWNWARDS..SQUARE WITH BOTTOM HALF BLACK -2B14..2B1A ; valid ; ; NV8 # 5.0 SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK..DOTTED SQUARE -2B1B..2B1F ; valid ; ; NV8 # 5.1 BLACK LARGE SQUARE..BLACK PENTAGON -2B20..2B23 ; valid ; ; NV8 # 5.0 WHITE PENTAGON..HORIZONTAL BLACK HEXAGON -2B24..2B4C ; valid ; ; NV8 # 5.1 BLACK LARGE CIRCLE..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B4D..2B4F ; valid ; ; NV8 # 7.0 DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW -2B50..2B54 ; valid ; ; NV8 # 5.1 WHITE MEDIUM STAR..WHITE RIGHT-POINTING PENTAGON -2B55..2B59 ; valid ; ; NV8 # 5.2 HEAVY LARGE CIRCLE..HEAVY CIRCLED SALTIRE -2B5A..2B73 ; valid ; ; NV8 # 7.0 SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR -2B74..2B75 ; disallowed # NA .. -2B76..2B95 ; valid ; ; NV8 # 7.0 NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW -2B96..2B97 ; disallowed # NA .. -2B98..2BB9 ; valid ; ; NV8 # 7.0 THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX -2BBA..2BBC ; disallowed # NA .. -2BBD..2BC8 ; valid ; ; NV8 # 7.0 BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED -2BC9 ; disallowed # NA -2BCA..2BD1 ; valid ; ; NV8 # 7.0 TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN -2BD2 ; valid ; ; NV8 # 10.0 GROUP MARK -2BD3..2BEB ; disallowed # NA .. -2BEC..2BEF ; valid ; ; NV8 # 8.0 LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2BF0..2BFF ; disallowed # NA .. -2C00 ; mapped ; 2C30 # 4.1 GLAGOLITIC CAPITAL LETTER AZU -2C01 ; mapped ; 2C31 # 4.1 GLAGOLITIC CAPITAL LETTER BUKY -2C02 ; mapped ; 2C32 # 4.1 GLAGOLITIC CAPITAL LETTER VEDE -2C03 ; mapped ; 2C33 # 4.1 GLAGOLITIC CAPITAL LETTER GLAGOLI -2C04 ; mapped ; 2C34 # 4.1 GLAGOLITIC CAPITAL LETTER DOBRO -2C05 ; mapped ; 2C35 # 4.1 GLAGOLITIC CAPITAL LETTER YESTU -2C06 ; mapped ; 2C36 # 4.1 GLAGOLITIC CAPITAL LETTER ZHIVETE -2C07 ; mapped ; 2C37 # 4.1 GLAGOLITIC CAPITAL LETTER DZELO -2C08 ; mapped ; 2C38 # 4.1 GLAGOLITIC CAPITAL LETTER ZEMLJA -2C09 ; mapped ; 2C39 # 4.1 GLAGOLITIC CAPITAL LETTER IZHE -2C0A ; mapped ; 2C3A # 4.1 GLAGOLITIC CAPITAL LETTER INITIAL IZHE -2C0B ; mapped ; 2C3B # 4.1 GLAGOLITIC CAPITAL LETTER I -2C0C ; mapped ; 2C3C # 4.1 GLAGOLITIC CAPITAL LETTER DJERVI -2C0D ; mapped ; 2C3D # 4.1 GLAGOLITIC CAPITAL LETTER KAKO -2C0E ; mapped ; 2C3E # 4.1 GLAGOLITIC CAPITAL LETTER LJUDIJE -2C0F ; mapped ; 2C3F # 4.1 GLAGOLITIC CAPITAL LETTER MYSLITE -2C10 ; mapped ; 2C40 # 4.1 GLAGOLITIC CAPITAL LETTER NASHI -2C11 ; mapped ; 2C41 # 4.1 GLAGOLITIC CAPITAL LETTER ONU -2C12 ; mapped ; 2C42 # 4.1 GLAGOLITIC CAPITAL LETTER POKOJI -2C13 ; mapped ; 2C43 # 4.1 GLAGOLITIC CAPITAL LETTER RITSI -2C14 ; mapped ; 2C44 # 4.1 GLAGOLITIC CAPITAL LETTER SLOVO -2C15 ; mapped ; 2C45 # 4.1 GLAGOLITIC CAPITAL LETTER TVRIDO -2C16 ; mapped ; 2C46 # 4.1 GLAGOLITIC CAPITAL LETTER UKU -2C17 ; mapped ; 2C47 # 4.1 GLAGOLITIC CAPITAL LETTER FRITU -2C18 ; mapped ; 2C48 # 4.1 GLAGOLITIC CAPITAL LETTER HERU -2C19 ; mapped ; 2C49 # 4.1 GLAGOLITIC CAPITAL LETTER OTU -2C1A ; mapped ; 2C4A # 4.1 GLAGOLITIC CAPITAL LETTER PE -2C1B ; mapped ; 2C4B # 4.1 GLAGOLITIC CAPITAL LETTER SHTA -2C1C ; mapped ; 2C4C # 4.1 GLAGOLITIC CAPITAL LETTER TSI -2C1D ; mapped ; 2C4D # 4.1 GLAGOLITIC CAPITAL LETTER CHRIVI -2C1E ; mapped ; 2C4E # 4.1 GLAGOLITIC CAPITAL LETTER SHA -2C1F ; mapped ; 2C4F # 4.1 GLAGOLITIC CAPITAL LETTER YERU -2C20 ; mapped ; 2C50 # 4.1 GLAGOLITIC CAPITAL LETTER YERI -2C21 ; mapped ; 2C51 # 4.1 GLAGOLITIC CAPITAL LETTER YATI -2C22 ; mapped ; 2C52 # 4.1 GLAGOLITIC CAPITAL LETTER SPIDERY HA -2C23 ; mapped ; 2C53 # 4.1 GLAGOLITIC CAPITAL LETTER YU -2C24 ; mapped ; 2C54 # 4.1 GLAGOLITIC CAPITAL LETTER SMALL YUS -2C25 ; mapped ; 2C55 # 4.1 GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL -2C26 ; mapped ; 2C56 # 4.1 GLAGOLITIC CAPITAL LETTER YO -2C27 ; mapped ; 2C57 # 4.1 GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS -2C28 ; mapped ; 2C58 # 4.1 GLAGOLITIC CAPITAL LETTER BIG YUS -2C29 ; mapped ; 2C59 # 4.1 GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS -2C2A ; mapped ; 2C5A # 4.1 GLAGOLITIC CAPITAL LETTER FITA -2C2B ; mapped ; 2C5B # 4.1 GLAGOLITIC CAPITAL LETTER IZHITSA -2C2C ; mapped ; 2C5C # 4.1 GLAGOLITIC CAPITAL LETTER SHTAPIC -2C2D ; mapped ; 2C5D # 4.1 GLAGOLITIC CAPITAL LETTER TROKUTASTI A -2C2E ; mapped ; 2C5E # 4.1 GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE -2C2F ; disallowed # NA -2C30..2C5E ; valid # 4.1 GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE -2C5F ; disallowed # NA -2C60 ; mapped ; 2C61 # 5.0 LATIN CAPITAL LETTER L WITH DOUBLE BAR -2C61 ; valid # 5.0 LATIN SMALL LETTER L WITH DOUBLE BAR -2C62 ; mapped ; 026B # 5.0 LATIN CAPITAL LETTER L WITH MIDDLE TILDE -2C63 ; mapped ; 1D7D # 5.0 LATIN CAPITAL LETTER P WITH STROKE -2C64 ; mapped ; 027D # 5.0 LATIN CAPITAL LETTER R WITH TAIL -2C65..2C66 ; valid # 5.0 LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE -2C67 ; mapped ; 2C68 # 5.0 LATIN CAPITAL LETTER H WITH DESCENDER -2C68 ; valid # 5.0 LATIN SMALL LETTER H WITH DESCENDER -2C69 ; mapped ; 2C6A # 5.0 LATIN CAPITAL LETTER K WITH DESCENDER -2C6A ; valid # 5.0 LATIN SMALL LETTER K WITH DESCENDER -2C6B ; mapped ; 2C6C # 5.0 LATIN CAPITAL LETTER Z WITH DESCENDER -2C6C ; valid # 5.0 LATIN SMALL LETTER Z WITH DESCENDER -2C6D ; mapped ; 0251 # 5.1 LATIN CAPITAL LETTER ALPHA -2C6E ; mapped ; 0271 # 5.1 LATIN CAPITAL LETTER M WITH HOOK -2C6F ; mapped ; 0250 # 5.1 LATIN CAPITAL LETTER TURNED A -2C70 ; mapped ; 0252 # 5.2 LATIN CAPITAL LETTER TURNED ALPHA -2C71 ; valid # 5.1 LATIN SMALL LETTER V WITH RIGHT HOOK -2C72 ; mapped ; 2C73 # 5.1 LATIN CAPITAL LETTER W WITH HOOK -2C73 ; valid # 5.1 LATIN SMALL LETTER W WITH HOOK -2C74 ; valid # 5.0 LATIN SMALL LETTER V WITH CURL -2C75 ; mapped ; 2C76 # 5.0 LATIN CAPITAL LETTER HALF H -2C76..2C77 ; valid # 5.0 LATIN SMALL LETTER HALF H..LATIN SMALL LETTER TAILLESS PHI -2C78..2C7B ; valid # 5.1 LATIN SMALL LETTER E WITH NOTCH..LATIN LETTER SMALL CAPITAL TURNED E -2C7C ; mapped ; 006A # 5.1 LATIN SUBSCRIPT SMALL LETTER J -2C7D ; mapped ; 0076 # 5.1 MODIFIER LETTER CAPITAL V -2C7E ; mapped ; 023F # 5.2 LATIN CAPITAL LETTER S WITH SWASH TAIL -2C7F ; mapped ; 0240 # 5.2 LATIN CAPITAL LETTER Z WITH SWASH TAIL -2C80 ; mapped ; 2C81 # 4.1 COPTIC CAPITAL LETTER ALFA -2C81 ; valid # 4.1 COPTIC SMALL LETTER ALFA -2C82 ; mapped ; 2C83 # 4.1 COPTIC CAPITAL LETTER VIDA -2C83 ; valid # 4.1 COPTIC SMALL LETTER VIDA -2C84 ; mapped ; 2C85 # 4.1 COPTIC CAPITAL LETTER GAMMA -2C85 ; valid # 4.1 COPTIC SMALL LETTER GAMMA -2C86 ; mapped ; 2C87 # 4.1 COPTIC CAPITAL LETTER DALDA -2C87 ; valid # 4.1 COPTIC SMALL LETTER DALDA -2C88 ; mapped ; 2C89 # 4.1 COPTIC CAPITAL LETTER EIE -2C89 ; valid # 4.1 COPTIC SMALL LETTER EIE -2C8A ; mapped ; 2C8B # 4.1 COPTIC CAPITAL LETTER SOU -2C8B ; valid # 4.1 COPTIC SMALL LETTER SOU -2C8C ; mapped ; 2C8D # 4.1 COPTIC CAPITAL LETTER ZATA -2C8D ; valid # 4.1 COPTIC SMALL LETTER ZATA -2C8E ; mapped ; 2C8F # 4.1 COPTIC CAPITAL LETTER HATE -2C8F ; valid # 4.1 COPTIC SMALL LETTER HATE -2C90 ; mapped ; 2C91 # 4.1 COPTIC CAPITAL LETTER THETHE -2C91 ; valid # 4.1 COPTIC SMALL LETTER THETHE -2C92 ; mapped ; 2C93 # 4.1 COPTIC CAPITAL LETTER IAUDA -2C93 ; valid # 4.1 COPTIC SMALL LETTER IAUDA -2C94 ; mapped ; 2C95 # 4.1 COPTIC CAPITAL LETTER KAPA -2C95 ; valid # 4.1 COPTIC SMALL LETTER KAPA -2C96 ; mapped ; 2C97 # 4.1 COPTIC CAPITAL LETTER LAULA -2C97 ; valid # 4.1 COPTIC SMALL LETTER LAULA -2C98 ; mapped ; 2C99 # 4.1 COPTIC CAPITAL LETTER MI -2C99 ; valid # 4.1 COPTIC SMALL LETTER MI -2C9A ; mapped ; 2C9B # 4.1 COPTIC CAPITAL LETTER NI -2C9B ; valid # 4.1 COPTIC SMALL LETTER NI -2C9C ; mapped ; 2C9D # 4.1 COPTIC CAPITAL LETTER KSI -2C9D ; valid # 4.1 COPTIC SMALL LETTER KSI -2C9E ; mapped ; 2C9F # 4.1 COPTIC CAPITAL LETTER O -2C9F ; valid # 4.1 COPTIC SMALL LETTER O -2CA0 ; mapped ; 2CA1 # 4.1 COPTIC CAPITAL LETTER PI -2CA1 ; valid # 4.1 COPTIC SMALL LETTER PI -2CA2 ; mapped ; 2CA3 # 4.1 COPTIC CAPITAL LETTER RO -2CA3 ; valid # 4.1 COPTIC SMALL LETTER RO -2CA4 ; mapped ; 2CA5 # 4.1 COPTIC CAPITAL LETTER SIMA -2CA5 ; valid # 4.1 COPTIC SMALL LETTER SIMA -2CA6 ; mapped ; 2CA7 # 4.1 COPTIC CAPITAL LETTER TAU -2CA7 ; valid # 4.1 COPTIC SMALL LETTER TAU -2CA8 ; mapped ; 2CA9 # 4.1 COPTIC CAPITAL LETTER UA -2CA9 ; valid # 4.1 COPTIC SMALL LETTER UA -2CAA ; mapped ; 2CAB # 4.1 COPTIC CAPITAL LETTER FI -2CAB ; valid # 4.1 COPTIC SMALL LETTER FI -2CAC ; mapped ; 2CAD # 4.1 COPTIC CAPITAL LETTER KHI -2CAD ; valid # 4.1 COPTIC SMALL LETTER KHI -2CAE ; mapped ; 2CAF # 4.1 COPTIC CAPITAL LETTER PSI -2CAF ; valid # 4.1 COPTIC SMALL LETTER PSI -2CB0 ; mapped ; 2CB1 # 4.1 COPTIC CAPITAL LETTER OOU -2CB1 ; valid # 4.1 COPTIC SMALL LETTER OOU -2CB2 ; mapped ; 2CB3 # 4.1 COPTIC CAPITAL LETTER DIALECT-P ALEF -2CB3 ; valid # 4.1 COPTIC SMALL LETTER DIALECT-P ALEF -2CB4 ; mapped ; 2CB5 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC AIN -2CB5 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC AIN -2CB6 ; mapped ; 2CB7 # 4.1 COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE -2CB7 ; valid # 4.1 COPTIC SMALL LETTER CRYPTOGRAMMIC EIE -2CB8 ; mapped ; 2CB9 # 4.1 COPTIC CAPITAL LETTER DIALECT-P KAPA -2CB9 ; valid # 4.1 COPTIC SMALL LETTER DIALECT-P KAPA -2CBA ; mapped ; 2CBB # 4.1 COPTIC CAPITAL LETTER DIALECT-P NI -2CBB ; valid # 4.1 COPTIC SMALL LETTER DIALECT-P NI -2CBC ; mapped ; 2CBD # 4.1 COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI -2CBD ; valid # 4.1 COPTIC SMALL LETTER CRYPTOGRAMMIC NI -2CBE ; mapped ; 2CBF # 4.1 COPTIC CAPITAL LETTER OLD COPTIC OOU -2CBF ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC OOU -2CC0 ; mapped ; 2CC1 # 4.1 COPTIC CAPITAL LETTER SAMPI -2CC1 ; valid # 4.1 COPTIC SMALL LETTER SAMPI -2CC2 ; mapped ; 2CC3 # 4.1 COPTIC CAPITAL LETTER CROSSED SHEI -2CC3 ; valid # 4.1 COPTIC SMALL LETTER CROSSED SHEI -2CC4 ; mapped ; 2CC5 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC SHEI -2CC5 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC SHEI -2CC6 ; mapped ; 2CC7 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC ESH -2CC7 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC ESH -2CC8 ; mapped ; 2CC9 # 4.1 COPTIC CAPITAL LETTER AKHMIMIC KHEI -2CC9 ; valid # 4.1 COPTIC SMALL LETTER AKHMIMIC KHEI -2CCA ; mapped ; 2CCB # 4.1 COPTIC CAPITAL LETTER DIALECT-P HORI -2CCB ; valid # 4.1 COPTIC SMALL LETTER DIALECT-P HORI -2CCC ; mapped ; 2CCD # 4.1 COPTIC CAPITAL LETTER OLD COPTIC HORI -2CCD ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC HORI -2CCE ; mapped ; 2CCF # 4.1 COPTIC CAPITAL LETTER OLD COPTIC HA -2CCF ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC HA -2CD0 ; mapped ; 2CD1 # 4.1 COPTIC CAPITAL LETTER L-SHAPED HA -2CD1 ; valid # 4.1 COPTIC SMALL LETTER L-SHAPED HA -2CD2 ; mapped ; 2CD3 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC HEI -2CD3 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC HEI -2CD4 ; mapped ; 2CD5 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC HAT -2CD5 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC HAT -2CD6 ; mapped ; 2CD7 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC GANGIA -2CD7 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC GANGIA -2CD8 ; mapped ; 2CD9 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC DJA -2CD9 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC DJA -2CDA ; mapped ; 2CDB # 4.1 COPTIC CAPITAL LETTER OLD COPTIC SHIMA -2CDB ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC SHIMA -2CDC ; mapped ; 2CDD # 4.1 COPTIC CAPITAL LETTER OLD NUBIAN SHIMA -2CDD ; valid # 4.1 COPTIC SMALL LETTER OLD NUBIAN SHIMA -2CDE ; mapped ; 2CDF # 4.1 COPTIC CAPITAL LETTER OLD NUBIAN NGI -2CDF ; valid # 4.1 COPTIC SMALL LETTER OLD NUBIAN NGI -2CE0 ; mapped ; 2CE1 # 4.1 COPTIC CAPITAL LETTER OLD NUBIAN NYI -2CE1 ; valid # 4.1 COPTIC SMALL LETTER OLD NUBIAN NYI -2CE2 ; mapped ; 2CE3 # 4.1 COPTIC CAPITAL LETTER OLD NUBIAN WAU -2CE3..2CE4 ; valid # 4.1 COPTIC SMALL LETTER OLD NUBIAN WAU..COPTIC SYMBOL KAI -2CE5..2CEA ; valid ; ; NV8 # 4.1 COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA -2CEB ; mapped ; 2CEC # 5.2 COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI -2CEC ; valid # 5.2 COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI -2CED ; mapped ; 2CEE # 5.2 COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA -2CEE..2CF1 ; valid # 5.2 COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA..COPTIC COMBINING SPIRITUS LENIS -2CF2 ; mapped ; 2CF3 # 6.1 COPTIC CAPITAL LETTER BOHAIRIC KHEI -2CF3 ; valid # 6.1 COPTIC SMALL LETTER BOHAIRIC KHEI -2CF4..2CF8 ; disallowed # NA .. -2CF9..2CFF ; valid ; ; NV8 # 4.1 COPTIC OLD NUBIAN FULL STOP..COPTIC MORPHOLOGICAL DIVIDER -2D00..2D25 ; valid # 4.1 GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE -2D26 ; disallowed # NA -2D27 ; valid # 6.1 GEORGIAN SMALL LETTER YN -2D28..2D2C ; disallowed # NA .. -2D2D ; valid # 6.1 GEORGIAN SMALL LETTER AEN -2D2E..2D2F ; disallowed # NA .. -2D30..2D65 ; valid # 4.1 TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ -2D66..2D67 ; valid # 6.1 TIFINAGH LETTER YE..TIFINAGH LETTER YO -2D68..2D6E ; disallowed # NA .. -2D6F ; mapped ; 2D61 # 4.1 TIFINAGH MODIFIER LETTER LABIALIZATION MARK -2D70 ; valid ; ; NV8 # 6.0 TIFINAGH SEPARATOR MARK -2D71..2D7E ; disallowed # NA .. -2D7F ; valid # 6.0 TIFINAGH CONSONANT JOINER -2D80..2D96 ; valid # 4.1 ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE -2D97..2D9F ; disallowed # NA .. -2DA0..2DA6 ; valid # 4.1 ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO -2DA7 ; disallowed # NA -2DA8..2DAE ; valid # 4.1 ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO -2DAF ; disallowed # NA -2DB0..2DB6 ; valid # 4.1 ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO -2DB7 ; disallowed # NA -2DB8..2DBE ; valid # 4.1 ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO -2DBF ; disallowed # NA -2DC0..2DC6 ; valid # 4.1 ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO -2DC7 ; disallowed # NA -2DC8..2DCE ; valid # 4.1 ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO -2DCF ; disallowed # NA -2DD0..2DD6 ; valid # 4.1 ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO -2DD7 ; disallowed # NA -2DD8..2DDE ; valid # 4.1 ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO -2DDF ; disallowed # NA -2DE0..2DFF ; valid # 5.1 COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -2E00..2E17 ; valid ; ; NV8 # 4.1 RIGHT ANGLE SUBSTITUTION MARKER..DOUBLE OBLIQUE HYPHEN -2E18..2E1B ; valid ; ; NV8 # 5.1 INVERTED INTERROBANG..TILDE WITH RING ABOVE -2E1C..2E1D ; valid ; ; NV8 # 4.1 LEFT LOW PARAPHRASE BRACKET..RIGHT LOW PARAPHRASE BRACKET -2E1E..2E2E ; valid ; ; NV8 # 5.1 TILDE WITH DOT ABOVE..REVERSED QUESTION MARK -2E2F ; valid # 5.1 VERTICAL TILDE -2E30 ; valid ; ; NV8 # 5.1 RING POINT -2E31 ; valid ; ; NV8 # 5.2 WORD SEPARATOR MIDDLE DOT -2E32..2E3B ; valid ; ; NV8 # 6.1 TURNED COMMA..THREE-EM DASH -2E3C..2E42 ; valid ; ; NV8 # 7.0 STENOGRAPHIC FULL STOP..DOUBLE LOW-REVERSED-9 QUOTATION MARK -2E43..2E44 ; valid ; ; NV8 # 9.0 DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK -2E45..2E49 ; valid ; ; NV8 # 10.0 INVERTED LOW KAVYKA..DOUBLE STACKED COMMA -2E4A..2E7F ; disallowed # NA .. -2E80..2E99 ; valid ; ; NV8 # 3.0 CJK RADICAL REPEAT..CJK RADICAL RAP -2E9A ; disallowed # NA -2E9B..2E9E ; valid ; ; NV8 # 3.0 CJK RADICAL CHOKE..CJK RADICAL DEATH -2E9F ; mapped ; 6BCD # 3.0 CJK RADICAL MOTHER -2EA0..2EF2 ; valid ; ; NV8 # 3.0 CJK RADICAL CIVILIAN..CJK RADICAL J-SIMPLIFIED TURTLE -2EF3 ; mapped ; 9F9F # 3.0 CJK RADICAL C-SIMPLIFIED TURTLE -2EF4..2EFF ; disallowed # NA .. -2F00 ; mapped ; 4E00 # 3.0 KANGXI RADICAL ONE -2F01 ; mapped ; 4E28 # 3.0 KANGXI RADICAL LINE -2F02 ; mapped ; 4E36 # 3.0 KANGXI RADICAL DOT -2F03 ; mapped ; 4E3F # 3.0 KANGXI RADICAL SLASH -2F04 ; mapped ; 4E59 # 3.0 KANGXI RADICAL SECOND -2F05 ; mapped ; 4E85 # 3.0 KANGXI RADICAL HOOK -2F06 ; mapped ; 4E8C # 3.0 KANGXI RADICAL TWO -2F07 ; mapped ; 4EA0 # 3.0 KANGXI RADICAL LID -2F08 ; mapped ; 4EBA # 3.0 KANGXI RADICAL MAN -2F09 ; mapped ; 513F # 3.0 KANGXI RADICAL LEGS -2F0A ; mapped ; 5165 # 3.0 KANGXI RADICAL ENTER -2F0B ; mapped ; 516B # 3.0 KANGXI RADICAL EIGHT -2F0C ; mapped ; 5182 # 3.0 KANGXI RADICAL DOWN BOX -2F0D ; mapped ; 5196 # 3.0 KANGXI RADICAL COVER -2F0E ; mapped ; 51AB # 3.0 KANGXI RADICAL ICE -2F0F ; mapped ; 51E0 # 3.0 KANGXI RADICAL TABLE -2F10 ; mapped ; 51F5 # 3.0 KANGXI RADICAL OPEN BOX -2F11 ; mapped ; 5200 # 3.0 KANGXI RADICAL KNIFE -2F12 ; mapped ; 529B # 3.0 KANGXI RADICAL POWER -2F13 ; mapped ; 52F9 # 3.0 KANGXI RADICAL WRAP -2F14 ; mapped ; 5315 # 3.0 KANGXI RADICAL SPOON -2F15 ; mapped ; 531A # 3.0 KANGXI RADICAL RIGHT OPEN BOX -2F16 ; mapped ; 5338 # 3.0 KANGXI RADICAL HIDING ENCLOSURE -2F17 ; mapped ; 5341 # 3.0 KANGXI RADICAL TEN -2F18 ; mapped ; 535C # 3.0 KANGXI RADICAL DIVINATION -2F19 ; mapped ; 5369 # 3.0 KANGXI RADICAL SEAL -2F1A ; mapped ; 5382 # 3.0 KANGXI RADICAL CLIFF -2F1B ; mapped ; 53B6 # 3.0 KANGXI RADICAL PRIVATE -2F1C ; mapped ; 53C8 # 3.0 KANGXI RADICAL AGAIN -2F1D ; mapped ; 53E3 # 3.0 KANGXI RADICAL MOUTH -2F1E ; mapped ; 56D7 # 3.0 KANGXI RADICAL ENCLOSURE -2F1F ; mapped ; 571F # 3.0 KANGXI RADICAL EARTH -2F20 ; mapped ; 58EB # 3.0 KANGXI RADICAL SCHOLAR -2F21 ; mapped ; 5902 # 3.0 KANGXI RADICAL GO -2F22 ; mapped ; 590A # 3.0 KANGXI RADICAL GO SLOWLY -2F23 ; mapped ; 5915 # 3.0 KANGXI RADICAL EVENING -2F24 ; mapped ; 5927 # 3.0 KANGXI RADICAL BIG -2F25 ; mapped ; 5973 # 3.0 KANGXI RADICAL WOMAN -2F26 ; mapped ; 5B50 # 3.0 KANGXI RADICAL CHILD -2F27 ; mapped ; 5B80 # 3.0 KANGXI RADICAL ROOF -2F28 ; mapped ; 5BF8 # 3.0 KANGXI RADICAL INCH -2F29 ; mapped ; 5C0F # 3.0 KANGXI RADICAL SMALL -2F2A ; mapped ; 5C22 # 3.0 KANGXI RADICAL LAME -2F2B ; mapped ; 5C38 # 3.0 KANGXI RADICAL CORPSE -2F2C ; mapped ; 5C6E # 3.0 KANGXI RADICAL SPROUT -2F2D ; mapped ; 5C71 # 3.0 KANGXI RADICAL MOUNTAIN -2F2E ; mapped ; 5DDB # 3.0 KANGXI RADICAL RIVER -2F2F ; mapped ; 5DE5 # 3.0 KANGXI RADICAL WORK -2F30 ; mapped ; 5DF1 # 3.0 KANGXI RADICAL ONESELF -2F31 ; mapped ; 5DFE # 3.0 KANGXI RADICAL TURBAN -2F32 ; mapped ; 5E72 # 3.0 KANGXI RADICAL DRY -2F33 ; mapped ; 5E7A # 3.0 KANGXI RADICAL SHORT THREAD -2F34 ; mapped ; 5E7F # 3.0 KANGXI RADICAL DOTTED CLIFF -2F35 ; mapped ; 5EF4 # 3.0 KANGXI RADICAL LONG STRIDE -2F36 ; mapped ; 5EFE # 3.0 KANGXI RADICAL TWO HANDS -2F37 ; mapped ; 5F0B # 3.0 KANGXI RADICAL SHOOT -2F38 ; mapped ; 5F13 # 3.0 KANGXI RADICAL BOW -2F39 ; mapped ; 5F50 # 3.0 KANGXI RADICAL SNOUT -2F3A ; mapped ; 5F61 # 3.0 KANGXI RADICAL BRISTLE -2F3B ; mapped ; 5F73 # 3.0 KANGXI RADICAL STEP -2F3C ; mapped ; 5FC3 # 3.0 KANGXI RADICAL HEART -2F3D ; mapped ; 6208 # 3.0 KANGXI RADICAL HALBERD -2F3E ; mapped ; 6236 # 3.0 KANGXI RADICAL DOOR -2F3F ; mapped ; 624B # 3.0 KANGXI RADICAL HAND -2F40 ; mapped ; 652F # 3.0 KANGXI RADICAL BRANCH -2F41 ; mapped ; 6534 # 3.0 KANGXI RADICAL RAP -2F42 ; mapped ; 6587 # 3.0 KANGXI RADICAL SCRIPT -2F43 ; mapped ; 6597 # 3.0 KANGXI RADICAL DIPPER -2F44 ; mapped ; 65A4 # 3.0 KANGXI RADICAL AXE -2F45 ; mapped ; 65B9 # 3.0 KANGXI RADICAL SQUARE -2F46 ; mapped ; 65E0 # 3.0 KANGXI RADICAL NOT -2F47 ; mapped ; 65E5 # 3.0 KANGXI RADICAL SUN -2F48 ; mapped ; 66F0 # 3.0 KANGXI RADICAL SAY -2F49 ; mapped ; 6708 # 3.0 KANGXI RADICAL MOON -2F4A ; mapped ; 6728 # 3.0 KANGXI RADICAL TREE -2F4B ; mapped ; 6B20 # 3.0 KANGXI RADICAL LACK -2F4C ; mapped ; 6B62 # 3.0 KANGXI RADICAL STOP -2F4D ; mapped ; 6B79 # 3.0 KANGXI RADICAL DEATH -2F4E ; mapped ; 6BB3 # 3.0 KANGXI RADICAL WEAPON -2F4F ; mapped ; 6BCB # 3.0 KANGXI RADICAL DO NOT -2F50 ; mapped ; 6BD4 # 3.0 KANGXI RADICAL COMPARE -2F51 ; mapped ; 6BDB # 3.0 KANGXI RADICAL FUR -2F52 ; mapped ; 6C0F # 3.0 KANGXI RADICAL CLAN -2F53 ; mapped ; 6C14 # 3.0 KANGXI RADICAL STEAM -2F54 ; mapped ; 6C34 # 3.0 KANGXI RADICAL WATER -2F55 ; mapped ; 706B # 3.0 KANGXI RADICAL FIRE -2F56 ; mapped ; 722A # 3.0 KANGXI RADICAL CLAW -2F57 ; mapped ; 7236 # 3.0 KANGXI RADICAL FATHER -2F58 ; mapped ; 723B # 3.0 KANGXI RADICAL DOUBLE X -2F59 ; mapped ; 723F # 3.0 KANGXI RADICAL HALF TREE TRUNK -2F5A ; mapped ; 7247 # 3.0 KANGXI RADICAL SLICE -2F5B ; mapped ; 7259 # 3.0 KANGXI RADICAL FANG -2F5C ; mapped ; 725B # 3.0 KANGXI RADICAL COW -2F5D ; mapped ; 72AC # 3.0 KANGXI RADICAL DOG -2F5E ; mapped ; 7384 # 3.0 KANGXI RADICAL PROFOUND -2F5F ; mapped ; 7389 # 3.0 KANGXI RADICAL JADE -2F60 ; mapped ; 74DC # 3.0 KANGXI RADICAL MELON -2F61 ; mapped ; 74E6 # 3.0 KANGXI RADICAL TILE -2F62 ; mapped ; 7518 # 3.0 KANGXI RADICAL SWEET -2F63 ; mapped ; 751F # 3.0 KANGXI RADICAL LIFE -2F64 ; mapped ; 7528 # 3.0 KANGXI RADICAL USE -2F65 ; mapped ; 7530 # 3.0 KANGXI RADICAL FIELD -2F66 ; mapped ; 758B # 3.0 KANGXI RADICAL BOLT OF CLOTH -2F67 ; mapped ; 7592 # 3.0 KANGXI RADICAL SICKNESS -2F68 ; mapped ; 7676 # 3.0 KANGXI RADICAL DOTTED TENT -2F69 ; mapped ; 767D # 3.0 KANGXI RADICAL WHITE -2F6A ; mapped ; 76AE # 3.0 KANGXI RADICAL SKIN -2F6B ; mapped ; 76BF # 3.0 KANGXI RADICAL DISH -2F6C ; mapped ; 76EE # 3.0 KANGXI RADICAL EYE -2F6D ; mapped ; 77DB # 3.0 KANGXI RADICAL SPEAR -2F6E ; mapped ; 77E2 # 3.0 KANGXI RADICAL ARROW -2F6F ; mapped ; 77F3 # 3.0 KANGXI RADICAL STONE -2F70 ; mapped ; 793A # 3.0 KANGXI RADICAL SPIRIT -2F71 ; mapped ; 79B8 # 3.0 KANGXI RADICAL TRACK -2F72 ; mapped ; 79BE # 3.0 KANGXI RADICAL GRAIN -2F73 ; mapped ; 7A74 # 3.0 KANGXI RADICAL CAVE -2F74 ; mapped ; 7ACB # 3.0 KANGXI RADICAL STAND -2F75 ; mapped ; 7AF9 # 3.0 KANGXI RADICAL BAMBOO -2F76 ; mapped ; 7C73 # 3.0 KANGXI RADICAL RICE -2F77 ; mapped ; 7CF8 # 3.0 KANGXI RADICAL SILK -2F78 ; mapped ; 7F36 # 3.0 KANGXI RADICAL JAR -2F79 ; mapped ; 7F51 # 3.0 KANGXI RADICAL NET -2F7A ; mapped ; 7F8A # 3.0 KANGXI RADICAL SHEEP -2F7B ; mapped ; 7FBD # 3.0 KANGXI RADICAL FEATHER -2F7C ; mapped ; 8001 # 3.0 KANGXI RADICAL OLD -2F7D ; mapped ; 800C # 3.0 KANGXI RADICAL AND -2F7E ; mapped ; 8012 # 3.0 KANGXI RADICAL PLOW -2F7F ; mapped ; 8033 # 3.0 KANGXI RADICAL EAR -2F80 ; mapped ; 807F # 3.0 KANGXI RADICAL BRUSH -2F81 ; mapped ; 8089 # 3.0 KANGXI RADICAL MEAT -2F82 ; mapped ; 81E3 # 3.0 KANGXI RADICAL MINISTER -2F83 ; mapped ; 81EA # 3.0 KANGXI RADICAL SELF -2F84 ; mapped ; 81F3 # 3.0 KANGXI RADICAL ARRIVE -2F85 ; mapped ; 81FC # 3.0 KANGXI RADICAL MORTAR -2F86 ; mapped ; 820C # 3.0 KANGXI RADICAL TONGUE -2F87 ; mapped ; 821B # 3.0 KANGXI RADICAL OPPOSE -2F88 ; mapped ; 821F # 3.0 KANGXI RADICAL BOAT -2F89 ; mapped ; 826E # 3.0 KANGXI RADICAL STOPPING -2F8A ; mapped ; 8272 # 3.0 KANGXI RADICAL COLOR -2F8B ; mapped ; 8278 # 3.0 KANGXI RADICAL GRASS -2F8C ; mapped ; 864D # 3.0 KANGXI RADICAL TIGER -2F8D ; mapped ; 866B # 3.0 KANGXI RADICAL INSECT -2F8E ; mapped ; 8840 # 3.0 KANGXI RADICAL BLOOD -2F8F ; mapped ; 884C # 3.0 KANGXI RADICAL WALK ENCLOSURE -2F90 ; mapped ; 8863 # 3.0 KANGXI RADICAL CLOTHES -2F91 ; mapped ; 897E # 3.0 KANGXI RADICAL WEST -2F92 ; mapped ; 898B # 3.0 KANGXI RADICAL SEE -2F93 ; mapped ; 89D2 # 3.0 KANGXI RADICAL HORN -2F94 ; mapped ; 8A00 # 3.0 KANGXI RADICAL SPEECH -2F95 ; mapped ; 8C37 # 3.0 KANGXI RADICAL VALLEY -2F96 ; mapped ; 8C46 # 3.0 KANGXI RADICAL BEAN -2F97 ; mapped ; 8C55 # 3.0 KANGXI RADICAL PIG -2F98 ; mapped ; 8C78 # 3.0 KANGXI RADICAL BADGER -2F99 ; mapped ; 8C9D # 3.0 KANGXI RADICAL SHELL -2F9A ; mapped ; 8D64 # 3.0 KANGXI RADICAL RED -2F9B ; mapped ; 8D70 # 3.0 KANGXI RADICAL RUN -2F9C ; mapped ; 8DB3 # 3.0 KANGXI RADICAL FOOT -2F9D ; mapped ; 8EAB # 3.0 KANGXI RADICAL BODY -2F9E ; mapped ; 8ECA # 3.0 KANGXI RADICAL CART -2F9F ; mapped ; 8F9B # 3.0 KANGXI RADICAL BITTER -2FA0 ; mapped ; 8FB0 # 3.0 KANGXI RADICAL MORNING -2FA1 ; mapped ; 8FB5 # 3.0 KANGXI RADICAL WALK -2FA2 ; mapped ; 9091 # 3.0 KANGXI RADICAL CITY -2FA3 ; mapped ; 9149 # 3.0 KANGXI RADICAL WINE -2FA4 ; mapped ; 91C6 # 3.0 KANGXI RADICAL DISTINGUISH -2FA5 ; mapped ; 91CC # 3.0 KANGXI RADICAL VILLAGE -2FA6 ; mapped ; 91D1 # 3.0 KANGXI RADICAL GOLD -2FA7 ; mapped ; 9577 # 3.0 KANGXI RADICAL LONG -2FA8 ; mapped ; 9580 # 3.0 KANGXI RADICAL GATE -2FA9 ; mapped ; 961C # 3.0 KANGXI RADICAL MOUND -2FAA ; mapped ; 96B6 # 3.0 KANGXI RADICAL SLAVE -2FAB ; mapped ; 96B9 # 3.0 KANGXI RADICAL SHORT TAILED BIRD -2FAC ; mapped ; 96E8 # 3.0 KANGXI RADICAL RAIN -2FAD ; mapped ; 9751 # 3.0 KANGXI RADICAL BLUE -2FAE ; mapped ; 975E # 3.0 KANGXI RADICAL WRONG -2FAF ; mapped ; 9762 # 3.0 KANGXI RADICAL FACE -2FB0 ; mapped ; 9769 # 3.0 KANGXI RADICAL LEATHER -2FB1 ; mapped ; 97CB # 3.0 KANGXI RADICAL TANNED LEATHER -2FB2 ; mapped ; 97ED # 3.0 KANGXI RADICAL LEEK -2FB3 ; mapped ; 97F3 # 3.0 KANGXI RADICAL SOUND -2FB4 ; mapped ; 9801 # 3.0 KANGXI RADICAL LEAF -2FB5 ; mapped ; 98A8 # 3.0 KANGXI RADICAL WIND -2FB6 ; mapped ; 98DB # 3.0 KANGXI RADICAL FLY -2FB7 ; mapped ; 98DF # 3.0 KANGXI RADICAL EAT -2FB8 ; mapped ; 9996 # 3.0 KANGXI RADICAL HEAD -2FB9 ; mapped ; 9999 # 3.0 KANGXI RADICAL FRAGRANT -2FBA ; mapped ; 99AC # 3.0 KANGXI RADICAL HORSE -2FBB ; mapped ; 9AA8 # 3.0 KANGXI RADICAL BONE -2FBC ; mapped ; 9AD8 # 3.0 KANGXI RADICAL TALL -2FBD ; mapped ; 9ADF # 3.0 KANGXI RADICAL HAIR -2FBE ; mapped ; 9B25 # 3.0 KANGXI RADICAL FIGHT -2FBF ; mapped ; 9B2F # 3.0 KANGXI RADICAL SACRIFICIAL WINE -2FC0 ; mapped ; 9B32 # 3.0 KANGXI RADICAL CAULDRON -2FC1 ; mapped ; 9B3C # 3.0 KANGXI RADICAL GHOST -2FC2 ; mapped ; 9B5A # 3.0 KANGXI RADICAL FISH -2FC3 ; mapped ; 9CE5 # 3.0 KANGXI RADICAL BIRD -2FC4 ; mapped ; 9E75 # 3.0 KANGXI RADICAL SALT -2FC5 ; mapped ; 9E7F # 3.0 KANGXI RADICAL DEER -2FC6 ; mapped ; 9EA5 # 3.0 KANGXI RADICAL WHEAT -2FC7 ; mapped ; 9EBB # 3.0 KANGXI RADICAL HEMP -2FC8 ; mapped ; 9EC3 # 3.0 KANGXI RADICAL YELLOW -2FC9 ; mapped ; 9ECD # 3.0 KANGXI RADICAL MILLET -2FCA ; mapped ; 9ED1 # 3.0 KANGXI RADICAL BLACK -2FCB ; mapped ; 9EF9 # 3.0 KANGXI RADICAL EMBROIDERY -2FCC ; mapped ; 9EFD # 3.0 KANGXI RADICAL FROG -2FCD ; mapped ; 9F0E # 3.0 KANGXI RADICAL TRIPOD -2FCE ; mapped ; 9F13 # 3.0 KANGXI RADICAL DRUM -2FCF ; mapped ; 9F20 # 3.0 KANGXI RADICAL RAT -2FD0 ; mapped ; 9F3B # 3.0 KANGXI RADICAL NOSE -2FD1 ; mapped ; 9F4A # 3.0 KANGXI RADICAL EVEN -2FD2 ; mapped ; 9F52 # 3.0 KANGXI RADICAL TOOTH -2FD3 ; mapped ; 9F8D # 3.0 KANGXI RADICAL DRAGON -2FD4 ; mapped ; 9F9C # 3.0 KANGXI RADICAL TURTLE -2FD5 ; mapped ; 9FA0 # 3.0 KANGXI RADICAL FLUTE -2FD6..2FEF ; disallowed # NA .. -2FF0..2FFB ; disallowed # 3.0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID -2FFC..2FFF ; disallowed # NA .. -3000 ; disallowed_STD3_mapped ; 0020 # 1.1 IDEOGRAPHIC SPACE -3001 ; valid ; ; NV8 # 1.1 IDEOGRAPHIC COMMA -3002 ; mapped ; 002E # 1.1 IDEOGRAPHIC FULL STOP -3003..3004 ; valid ; ; NV8 # 1.1 DITTO MARK..JAPANESE INDUSTRIAL STANDARD SYMBOL -3005..3007 ; valid # 1.1 IDEOGRAPHIC ITERATION MARK..IDEOGRAPHIC NUMBER ZERO -3008..3029 ; valid ; ; NV8 # 1.1 LEFT ANGLE BRACKET..HANGZHOU NUMERAL NINE -302A..302D ; valid # 1.1 IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK -302E..3035 ; valid ; ; NV8 # 1.1 HANGUL SINGLE DOT TONE MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3036 ; mapped ; 3012 # 1.1 CIRCLED POSTAL MARK -3037 ; valid ; ; NV8 # 1.1 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -3038 ; mapped ; 5341 # 3.0 HANGZHOU NUMERAL TEN -3039 ; mapped ; 5344 # 3.0 HANGZHOU NUMERAL TWENTY -303A ; mapped ; 5345 # 3.0 HANGZHOU NUMERAL THIRTY -303B ; valid ; ; NV8 # 3.2 VERTICAL IDEOGRAPHIC ITERATION MARK -303C ; valid # 3.2 MASU MARK -303D ; valid ; ; NV8 # 3.2 PART ALTERNATION MARK -303E ; valid ; ; NV8 # 3.0 IDEOGRAPHIC VARIATION INDICATOR -303F ; valid ; ; NV8 # 1.1 IDEOGRAPHIC HALF FILL SPACE -3040 ; disallowed # NA -3041..3094 ; valid # 1.1 HIRAGANA LETTER SMALL A..HIRAGANA LETTER VU -3095..3096 ; valid # 3.2 HIRAGANA LETTER SMALL KA..HIRAGANA LETTER SMALL KE -3097..3098 ; disallowed # NA .. -3099..309A ; valid # 1.1 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309B ; disallowed_STD3_mapped ; 0020 3099 # 1.1 KATAKANA-HIRAGANA VOICED SOUND MARK -309C ; disallowed_STD3_mapped ; 0020 309A # 1.1 KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309D..309E ; valid # 1.1 HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; mapped ; 3088 308A # 3.2 HIRAGANA DIGRAPH YORI -30A0 ; valid ; ; NV8 # 3.2 KATAKANA-HIRAGANA DOUBLE HYPHEN -30A1..30FE ; valid # 1.1 KATAKANA LETTER SMALL A..KATAKANA VOICED ITERATION MARK -30FF ; mapped ; 30B3 30C8 # 3.2 KATAKANA DIGRAPH KOTO -3100..3104 ; disallowed # NA .. -3105..312C ; valid # 1.1 BOPOMOFO LETTER B..BOPOMOFO LETTER GN -312D ; valid # 5.1 BOPOMOFO LETTER IH -312E ; valid # 10.0 BOPOMOFO LETTER O WITH DOT ABOVE -312F..3130 ; disallowed # NA .. -3131 ; mapped ; 1100 # 1.1 HANGUL LETTER KIYEOK -3132 ; mapped ; 1101 # 1.1 HANGUL LETTER SSANGKIYEOK -3133 ; mapped ; 11AA # 1.1 HANGUL LETTER KIYEOK-SIOS -3134 ; mapped ; 1102 # 1.1 HANGUL LETTER NIEUN -3135 ; mapped ; 11AC # 1.1 HANGUL LETTER NIEUN-CIEUC -3136 ; mapped ; 11AD # 1.1 HANGUL LETTER NIEUN-HIEUH -3137 ; mapped ; 1103 # 1.1 HANGUL LETTER TIKEUT -3138 ; mapped ; 1104 # 1.1 HANGUL LETTER SSANGTIKEUT -3139 ; mapped ; 1105 # 1.1 HANGUL LETTER RIEUL -313A ; mapped ; 11B0 # 1.1 HANGUL LETTER RIEUL-KIYEOK -313B ; mapped ; 11B1 # 1.1 HANGUL LETTER RIEUL-MIEUM -313C ; mapped ; 11B2 # 1.1 HANGUL LETTER RIEUL-PIEUP -313D ; mapped ; 11B3 # 1.1 HANGUL LETTER RIEUL-SIOS -313E ; mapped ; 11B4 # 1.1 HANGUL LETTER RIEUL-THIEUTH -313F ; mapped ; 11B5 # 1.1 HANGUL LETTER RIEUL-PHIEUPH -3140 ; mapped ; 111A # 1.1 HANGUL LETTER RIEUL-HIEUH -3141 ; mapped ; 1106 # 1.1 HANGUL LETTER MIEUM -3142 ; mapped ; 1107 # 1.1 HANGUL LETTER PIEUP -3143 ; mapped ; 1108 # 1.1 HANGUL LETTER SSANGPIEUP -3144 ; mapped ; 1121 # 1.1 HANGUL LETTER PIEUP-SIOS -3145 ; mapped ; 1109 # 1.1 HANGUL LETTER SIOS -3146 ; mapped ; 110A # 1.1 HANGUL LETTER SSANGSIOS -3147 ; mapped ; 110B # 1.1 HANGUL LETTER IEUNG -3148 ; mapped ; 110C # 1.1 HANGUL LETTER CIEUC -3149 ; mapped ; 110D # 1.1 HANGUL LETTER SSANGCIEUC -314A ; mapped ; 110E # 1.1 HANGUL LETTER CHIEUCH -314B ; mapped ; 110F # 1.1 HANGUL LETTER KHIEUKH -314C ; mapped ; 1110 # 1.1 HANGUL LETTER THIEUTH -314D ; mapped ; 1111 # 1.1 HANGUL LETTER PHIEUPH -314E ; mapped ; 1112 # 1.1 HANGUL LETTER HIEUH -314F ; mapped ; 1161 # 1.1 HANGUL LETTER A -3150 ; mapped ; 1162 # 1.1 HANGUL LETTER AE -3151 ; mapped ; 1163 # 1.1 HANGUL LETTER YA -3152 ; mapped ; 1164 # 1.1 HANGUL LETTER YAE -3153 ; mapped ; 1165 # 1.1 HANGUL LETTER EO -3154 ; mapped ; 1166 # 1.1 HANGUL LETTER E -3155 ; mapped ; 1167 # 1.1 HANGUL LETTER YEO -3156 ; mapped ; 1168 # 1.1 HANGUL LETTER YE -3157 ; mapped ; 1169 # 1.1 HANGUL LETTER O -3158 ; mapped ; 116A # 1.1 HANGUL LETTER WA -3159 ; mapped ; 116B # 1.1 HANGUL LETTER WAE -315A ; mapped ; 116C # 1.1 HANGUL LETTER OE -315B ; mapped ; 116D # 1.1 HANGUL LETTER YO -315C ; mapped ; 116E # 1.1 HANGUL LETTER U -315D ; mapped ; 116F # 1.1 HANGUL LETTER WEO -315E ; mapped ; 1170 # 1.1 HANGUL LETTER WE -315F ; mapped ; 1171 # 1.1 HANGUL LETTER WI -3160 ; mapped ; 1172 # 1.1 HANGUL LETTER YU -3161 ; mapped ; 1173 # 1.1 HANGUL LETTER EU -3162 ; mapped ; 1174 # 1.1 HANGUL LETTER YI -3163 ; mapped ; 1175 # 1.1 HANGUL LETTER I -3164 ; disallowed # 1.1 HANGUL FILLER -3165 ; mapped ; 1114 # 1.1 HANGUL LETTER SSANGNIEUN -3166 ; mapped ; 1115 # 1.1 HANGUL LETTER NIEUN-TIKEUT -3167 ; mapped ; 11C7 # 1.1 HANGUL LETTER NIEUN-SIOS -3168 ; mapped ; 11C8 # 1.1 HANGUL LETTER NIEUN-PANSIOS -3169 ; mapped ; 11CC # 1.1 HANGUL LETTER RIEUL-KIYEOK-SIOS -316A ; mapped ; 11CE # 1.1 HANGUL LETTER RIEUL-TIKEUT -316B ; mapped ; 11D3 # 1.1 HANGUL LETTER RIEUL-PIEUP-SIOS -316C ; mapped ; 11D7 # 1.1 HANGUL LETTER RIEUL-PANSIOS -316D ; mapped ; 11D9 # 1.1 HANGUL LETTER RIEUL-YEORINHIEUH -316E ; mapped ; 111C # 1.1 HANGUL LETTER MIEUM-PIEUP -316F ; mapped ; 11DD # 1.1 HANGUL LETTER MIEUM-SIOS -3170 ; mapped ; 11DF # 1.1 HANGUL LETTER MIEUM-PANSIOS -3171 ; mapped ; 111D # 1.1 HANGUL LETTER KAPYEOUNMIEUM -3172 ; mapped ; 111E # 1.1 HANGUL LETTER PIEUP-KIYEOK -3173 ; mapped ; 1120 # 1.1 HANGUL LETTER PIEUP-TIKEUT -3174 ; mapped ; 1122 # 1.1 HANGUL LETTER PIEUP-SIOS-KIYEOK -3175 ; mapped ; 1123 # 1.1 HANGUL LETTER PIEUP-SIOS-TIKEUT -3176 ; mapped ; 1127 # 1.1 HANGUL LETTER PIEUP-CIEUC -3177 ; mapped ; 1129 # 1.1 HANGUL LETTER PIEUP-THIEUTH -3178 ; mapped ; 112B # 1.1 HANGUL LETTER KAPYEOUNPIEUP -3179 ; mapped ; 112C # 1.1 HANGUL LETTER KAPYEOUNSSANGPIEUP -317A ; mapped ; 112D # 1.1 HANGUL LETTER SIOS-KIYEOK -317B ; mapped ; 112E # 1.1 HANGUL LETTER SIOS-NIEUN -317C ; mapped ; 112F # 1.1 HANGUL LETTER SIOS-TIKEUT -317D ; mapped ; 1132 # 1.1 HANGUL LETTER SIOS-PIEUP -317E ; mapped ; 1136 # 1.1 HANGUL LETTER SIOS-CIEUC -317F ; mapped ; 1140 # 1.1 HANGUL LETTER PANSIOS -3180 ; mapped ; 1147 # 1.1 HANGUL LETTER SSANGIEUNG -3181 ; mapped ; 114C # 1.1 HANGUL LETTER YESIEUNG -3182 ; mapped ; 11F1 # 1.1 HANGUL LETTER YESIEUNG-SIOS -3183 ; mapped ; 11F2 # 1.1 HANGUL LETTER YESIEUNG-PANSIOS -3184 ; mapped ; 1157 # 1.1 HANGUL LETTER KAPYEOUNPHIEUPH -3185 ; mapped ; 1158 # 1.1 HANGUL LETTER SSANGHIEUH -3186 ; mapped ; 1159 # 1.1 HANGUL LETTER YEORINHIEUH -3187 ; mapped ; 1184 # 1.1 HANGUL LETTER YO-YA -3188 ; mapped ; 1185 # 1.1 HANGUL LETTER YO-YAE -3189 ; mapped ; 1188 # 1.1 HANGUL LETTER YO-I -318A ; mapped ; 1191 # 1.1 HANGUL LETTER YU-YEO -318B ; mapped ; 1192 # 1.1 HANGUL LETTER YU-YE -318C ; mapped ; 1194 # 1.1 HANGUL LETTER YU-I -318D ; mapped ; 119E # 1.1 HANGUL LETTER ARAEA -318E ; mapped ; 11A1 # 1.1 HANGUL LETTER ARAEAE -318F ; disallowed # NA -3190..3191 ; valid ; ; NV8 # 1.1 IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK -3192 ; mapped ; 4E00 # 1.1 IDEOGRAPHIC ANNOTATION ONE MARK -3193 ; mapped ; 4E8C # 1.1 IDEOGRAPHIC ANNOTATION TWO MARK -3194 ; mapped ; 4E09 # 1.1 IDEOGRAPHIC ANNOTATION THREE MARK -3195 ; mapped ; 56DB # 1.1 IDEOGRAPHIC ANNOTATION FOUR MARK -3196 ; mapped ; 4E0A # 1.1 IDEOGRAPHIC ANNOTATION TOP MARK -3197 ; mapped ; 4E2D # 1.1 IDEOGRAPHIC ANNOTATION MIDDLE MARK -3198 ; mapped ; 4E0B # 1.1 IDEOGRAPHIC ANNOTATION BOTTOM MARK -3199 ; mapped ; 7532 # 1.1 IDEOGRAPHIC ANNOTATION FIRST MARK -319A ; mapped ; 4E59 # 1.1 IDEOGRAPHIC ANNOTATION SECOND MARK -319B ; mapped ; 4E19 # 1.1 IDEOGRAPHIC ANNOTATION THIRD MARK -319C ; mapped ; 4E01 # 1.1 IDEOGRAPHIC ANNOTATION FOURTH MARK -319D ; mapped ; 5929 # 1.1 IDEOGRAPHIC ANNOTATION HEAVEN MARK -319E ; mapped ; 5730 # 1.1 IDEOGRAPHIC ANNOTATION EARTH MARK -319F ; mapped ; 4EBA # 1.1 IDEOGRAPHIC ANNOTATION MAN MARK -31A0..31B7 ; valid # 3.0 BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H -31B8..31BA ; valid # 6.0 BOPOMOFO LETTER GH..BOPOMOFO LETTER ZY -31BB..31BF ; disallowed # NA .. -31C0..31CF ; valid ; ; NV8 # 4.1 CJK STROKE T..CJK STROKE N -31D0..31E3 ; valid ; ; NV8 # 5.1 CJK STROKE H..CJK STROKE Q -31E4..31EF ; disallowed # NA .. -31F0..31FF ; valid # 3.2 KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3200 ; disallowed_STD3_mapped ; 0028 1100 0029 #1.1 PARENTHESIZED HANGUL KIYEOK -3201 ; disallowed_STD3_mapped ; 0028 1102 0029 #1.1 PARENTHESIZED HANGUL NIEUN -3202 ; disallowed_STD3_mapped ; 0028 1103 0029 #1.1 PARENTHESIZED HANGUL TIKEUT -3203 ; disallowed_STD3_mapped ; 0028 1105 0029 #1.1 PARENTHESIZED HANGUL RIEUL -3204 ; disallowed_STD3_mapped ; 0028 1106 0029 #1.1 PARENTHESIZED HANGUL MIEUM -3205 ; disallowed_STD3_mapped ; 0028 1107 0029 #1.1 PARENTHESIZED HANGUL PIEUP -3206 ; disallowed_STD3_mapped ; 0028 1109 0029 #1.1 PARENTHESIZED HANGUL SIOS -3207 ; disallowed_STD3_mapped ; 0028 110B 0029 #1.1 PARENTHESIZED HANGUL IEUNG -3208 ; disallowed_STD3_mapped ; 0028 110C 0029 #1.1 PARENTHESIZED HANGUL CIEUC -3209 ; disallowed_STD3_mapped ; 0028 110E 0029 #1.1 PARENTHESIZED HANGUL CHIEUCH -320A ; disallowed_STD3_mapped ; 0028 110F 0029 #1.1 PARENTHESIZED HANGUL KHIEUKH -320B ; disallowed_STD3_mapped ; 0028 1110 0029 #1.1 PARENTHESIZED HANGUL THIEUTH -320C ; disallowed_STD3_mapped ; 0028 1111 0029 #1.1 PARENTHESIZED HANGUL PHIEUPH -320D ; disallowed_STD3_mapped ; 0028 1112 0029 #1.1 PARENTHESIZED HANGUL HIEUH -320E ; disallowed_STD3_mapped ; 0028 AC00 0029 #1.1 PARENTHESIZED HANGUL KIYEOK A -320F ; disallowed_STD3_mapped ; 0028 B098 0029 #1.1 PARENTHESIZED HANGUL NIEUN A -3210 ; disallowed_STD3_mapped ; 0028 B2E4 0029 #1.1 PARENTHESIZED HANGUL TIKEUT A -3211 ; disallowed_STD3_mapped ; 0028 B77C 0029 #1.1 PARENTHESIZED HANGUL RIEUL A -3212 ; disallowed_STD3_mapped ; 0028 B9C8 0029 #1.1 PARENTHESIZED HANGUL MIEUM A -3213 ; disallowed_STD3_mapped ; 0028 BC14 0029 #1.1 PARENTHESIZED HANGUL PIEUP A -3214 ; disallowed_STD3_mapped ; 0028 C0AC 0029 #1.1 PARENTHESIZED HANGUL SIOS A -3215 ; disallowed_STD3_mapped ; 0028 C544 0029 #1.1 PARENTHESIZED HANGUL IEUNG A -3216 ; disallowed_STD3_mapped ; 0028 C790 0029 #1.1 PARENTHESIZED HANGUL CIEUC A -3217 ; disallowed_STD3_mapped ; 0028 CC28 0029 #1.1 PARENTHESIZED HANGUL CHIEUCH A -3218 ; disallowed_STD3_mapped ; 0028 CE74 0029 #1.1 PARENTHESIZED HANGUL KHIEUKH A -3219 ; disallowed_STD3_mapped ; 0028 D0C0 0029 #1.1 PARENTHESIZED HANGUL THIEUTH A -321A ; disallowed_STD3_mapped ; 0028 D30C 0029 #1.1 PARENTHESIZED HANGUL PHIEUPH A -321B ; disallowed_STD3_mapped ; 0028 D558 0029 #1.1 PARENTHESIZED HANGUL HIEUH A -321C ; disallowed_STD3_mapped ; 0028 C8FC 0029 #1.1 PARENTHESIZED HANGUL CIEUC U -321D ; disallowed_STD3_mapped ; 0028 C624 C804 0029 #4.0 PARENTHESIZED KOREAN CHARACTER OJEON -321E ; disallowed_STD3_mapped ; 0028 C624 D6C4 0029 #4.0 PARENTHESIZED KOREAN CHARACTER O HU -321F ; disallowed # NA -3220 ; disallowed_STD3_mapped ; 0028 4E00 0029 #1.1 PARENTHESIZED IDEOGRAPH ONE -3221 ; disallowed_STD3_mapped ; 0028 4E8C 0029 #1.1 PARENTHESIZED IDEOGRAPH TWO -3222 ; disallowed_STD3_mapped ; 0028 4E09 0029 #1.1 PARENTHESIZED IDEOGRAPH THREE -3223 ; disallowed_STD3_mapped ; 0028 56DB 0029 #1.1 PARENTHESIZED IDEOGRAPH FOUR -3224 ; disallowed_STD3_mapped ; 0028 4E94 0029 #1.1 PARENTHESIZED IDEOGRAPH FIVE -3225 ; disallowed_STD3_mapped ; 0028 516D 0029 #1.1 PARENTHESIZED IDEOGRAPH SIX -3226 ; disallowed_STD3_mapped ; 0028 4E03 0029 #1.1 PARENTHESIZED IDEOGRAPH SEVEN -3227 ; disallowed_STD3_mapped ; 0028 516B 0029 #1.1 PARENTHESIZED IDEOGRAPH EIGHT -3228 ; disallowed_STD3_mapped ; 0028 4E5D 0029 #1.1 PARENTHESIZED IDEOGRAPH NINE -3229 ; disallowed_STD3_mapped ; 0028 5341 0029 #1.1 PARENTHESIZED IDEOGRAPH TEN -322A ; disallowed_STD3_mapped ; 0028 6708 0029 #1.1 PARENTHESIZED IDEOGRAPH MOON -322B ; disallowed_STD3_mapped ; 0028 706B 0029 #1.1 PARENTHESIZED IDEOGRAPH FIRE -322C ; disallowed_STD3_mapped ; 0028 6C34 0029 #1.1 PARENTHESIZED IDEOGRAPH WATER -322D ; disallowed_STD3_mapped ; 0028 6728 0029 #1.1 PARENTHESIZED IDEOGRAPH WOOD -322E ; disallowed_STD3_mapped ; 0028 91D1 0029 #1.1 PARENTHESIZED IDEOGRAPH METAL -322F ; disallowed_STD3_mapped ; 0028 571F 0029 #1.1 PARENTHESIZED IDEOGRAPH EARTH -3230 ; disallowed_STD3_mapped ; 0028 65E5 0029 #1.1 PARENTHESIZED IDEOGRAPH SUN -3231 ; disallowed_STD3_mapped ; 0028 682A 0029 #1.1 PARENTHESIZED IDEOGRAPH STOCK -3232 ; disallowed_STD3_mapped ; 0028 6709 0029 #1.1 PARENTHESIZED IDEOGRAPH HAVE -3233 ; disallowed_STD3_mapped ; 0028 793E 0029 #1.1 PARENTHESIZED IDEOGRAPH SOCIETY -3234 ; disallowed_STD3_mapped ; 0028 540D 0029 #1.1 PARENTHESIZED IDEOGRAPH NAME -3235 ; disallowed_STD3_mapped ; 0028 7279 0029 #1.1 PARENTHESIZED IDEOGRAPH SPECIAL -3236 ; disallowed_STD3_mapped ; 0028 8CA1 0029 #1.1 PARENTHESIZED IDEOGRAPH FINANCIAL -3237 ; disallowed_STD3_mapped ; 0028 795D 0029 #1.1 PARENTHESIZED IDEOGRAPH CONGRATULATION -3238 ; disallowed_STD3_mapped ; 0028 52B4 0029 #1.1 PARENTHESIZED IDEOGRAPH LABOR -3239 ; disallowed_STD3_mapped ; 0028 4EE3 0029 #1.1 PARENTHESIZED IDEOGRAPH REPRESENT -323A ; disallowed_STD3_mapped ; 0028 547C 0029 #1.1 PARENTHESIZED IDEOGRAPH CALL -323B ; disallowed_STD3_mapped ; 0028 5B66 0029 #1.1 PARENTHESIZED IDEOGRAPH STUDY -323C ; disallowed_STD3_mapped ; 0028 76E3 0029 #1.1 PARENTHESIZED IDEOGRAPH SUPERVISE -323D ; disallowed_STD3_mapped ; 0028 4F01 0029 #1.1 PARENTHESIZED IDEOGRAPH ENTERPRISE -323E ; disallowed_STD3_mapped ; 0028 8CC7 0029 #1.1 PARENTHESIZED IDEOGRAPH RESOURCE -323F ; disallowed_STD3_mapped ; 0028 5354 0029 #1.1 PARENTHESIZED IDEOGRAPH ALLIANCE -3240 ; disallowed_STD3_mapped ; 0028 796D 0029 #1.1 PARENTHESIZED IDEOGRAPH FESTIVAL -3241 ; disallowed_STD3_mapped ; 0028 4F11 0029 #1.1 PARENTHESIZED IDEOGRAPH REST -3242 ; disallowed_STD3_mapped ; 0028 81EA 0029 #1.1 PARENTHESIZED IDEOGRAPH SELF -3243 ; disallowed_STD3_mapped ; 0028 81F3 0029 #1.1 PARENTHESIZED IDEOGRAPH REACH -3244 ; mapped ; 554F # 5.2 CIRCLED IDEOGRAPH QUESTION -3245 ; mapped ; 5E7C # 5.2 CIRCLED IDEOGRAPH KINDERGARTEN -3246 ; mapped ; 6587 # 5.2 CIRCLED IDEOGRAPH SCHOOL -3247 ; mapped ; 7B8F # 5.2 CIRCLED IDEOGRAPH KOTO -3248..324F ; valid ; ; NV8 # 5.2 CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE -3250 ; mapped ; 0070 0074 0065 #4.0 PARTNERSHIP SIGN -3251 ; mapped ; 0032 0031 # 3.2 CIRCLED NUMBER TWENTY ONE -3252 ; mapped ; 0032 0032 # 3.2 CIRCLED NUMBER TWENTY TWO -3253 ; mapped ; 0032 0033 # 3.2 CIRCLED NUMBER TWENTY THREE -3254 ; mapped ; 0032 0034 # 3.2 CIRCLED NUMBER TWENTY FOUR -3255 ; mapped ; 0032 0035 # 3.2 CIRCLED NUMBER TWENTY FIVE -3256 ; mapped ; 0032 0036 # 3.2 CIRCLED NUMBER TWENTY SIX -3257 ; mapped ; 0032 0037 # 3.2 CIRCLED NUMBER TWENTY SEVEN -3258 ; mapped ; 0032 0038 # 3.2 CIRCLED NUMBER TWENTY EIGHT -3259 ; mapped ; 0032 0039 # 3.2 CIRCLED NUMBER TWENTY NINE -325A ; mapped ; 0033 0030 # 3.2 CIRCLED NUMBER THIRTY -325B ; mapped ; 0033 0031 # 3.2 CIRCLED NUMBER THIRTY ONE -325C ; mapped ; 0033 0032 # 3.2 CIRCLED NUMBER THIRTY TWO -325D ; mapped ; 0033 0033 # 3.2 CIRCLED NUMBER THIRTY THREE -325E ; mapped ; 0033 0034 # 3.2 CIRCLED NUMBER THIRTY FOUR -325F ; mapped ; 0033 0035 # 3.2 CIRCLED NUMBER THIRTY FIVE -3260 ; mapped ; 1100 # 1.1 CIRCLED HANGUL KIYEOK -3261 ; mapped ; 1102 # 1.1 CIRCLED HANGUL NIEUN -3262 ; mapped ; 1103 # 1.1 CIRCLED HANGUL TIKEUT -3263 ; mapped ; 1105 # 1.1 CIRCLED HANGUL RIEUL -3264 ; mapped ; 1106 # 1.1 CIRCLED HANGUL MIEUM -3265 ; mapped ; 1107 # 1.1 CIRCLED HANGUL PIEUP -3266 ; mapped ; 1109 # 1.1 CIRCLED HANGUL SIOS -3267 ; mapped ; 110B # 1.1 CIRCLED HANGUL IEUNG -3268 ; mapped ; 110C # 1.1 CIRCLED HANGUL CIEUC -3269 ; mapped ; 110E # 1.1 CIRCLED HANGUL CHIEUCH -326A ; mapped ; 110F # 1.1 CIRCLED HANGUL KHIEUKH -326B ; mapped ; 1110 # 1.1 CIRCLED HANGUL THIEUTH -326C ; mapped ; 1111 # 1.1 CIRCLED HANGUL PHIEUPH -326D ; mapped ; 1112 # 1.1 CIRCLED HANGUL HIEUH -326E ; mapped ; AC00 # 1.1 CIRCLED HANGUL KIYEOK A -326F ; mapped ; B098 # 1.1 CIRCLED HANGUL NIEUN A -3270 ; mapped ; B2E4 # 1.1 CIRCLED HANGUL TIKEUT A -3271 ; mapped ; B77C # 1.1 CIRCLED HANGUL RIEUL A -3272 ; mapped ; B9C8 # 1.1 CIRCLED HANGUL MIEUM A -3273 ; mapped ; BC14 # 1.1 CIRCLED HANGUL PIEUP A -3274 ; mapped ; C0AC # 1.1 CIRCLED HANGUL SIOS A -3275 ; mapped ; C544 # 1.1 CIRCLED HANGUL IEUNG A -3276 ; mapped ; C790 # 1.1 CIRCLED HANGUL CIEUC A -3277 ; mapped ; CC28 # 1.1 CIRCLED HANGUL CHIEUCH A -3278 ; mapped ; CE74 # 1.1 CIRCLED HANGUL KHIEUKH A -3279 ; mapped ; D0C0 # 1.1 CIRCLED HANGUL THIEUTH A -327A ; mapped ; D30C # 1.1 CIRCLED HANGUL PHIEUPH A -327B ; mapped ; D558 # 1.1 CIRCLED HANGUL HIEUH A -327C ; mapped ; CC38 ACE0 # 4.0 CIRCLED KOREAN CHARACTER CHAMKO -327D ; mapped ; C8FC C758 # 4.0 CIRCLED KOREAN CHARACTER JUEUI -327E ; mapped ; C6B0 # 4.1 CIRCLED HANGUL IEUNG U -327F ; valid ; ; NV8 # 1.1 KOREAN STANDARD SYMBOL -3280 ; mapped ; 4E00 # 1.1 CIRCLED IDEOGRAPH ONE -3281 ; mapped ; 4E8C # 1.1 CIRCLED IDEOGRAPH TWO -3282 ; mapped ; 4E09 # 1.1 CIRCLED IDEOGRAPH THREE -3283 ; mapped ; 56DB # 1.1 CIRCLED IDEOGRAPH FOUR -3284 ; mapped ; 4E94 # 1.1 CIRCLED IDEOGRAPH FIVE -3285 ; mapped ; 516D # 1.1 CIRCLED IDEOGRAPH SIX -3286 ; mapped ; 4E03 # 1.1 CIRCLED IDEOGRAPH SEVEN -3287 ; mapped ; 516B # 1.1 CIRCLED IDEOGRAPH EIGHT -3288 ; mapped ; 4E5D # 1.1 CIRCLED IDEOGRAPH NINE -3289 ; mapped ; 5341 # 1.1 CIRCLED IDEOGRAPH TEN -328A ; mapped ; 6708 # 1.1 CIRCLED IDEOGRAPH MOON -328B ; mapped ; 706B # 1.1 CIRCLED IDEOGRAPH FIRE -328C ; mapped ; 6C34 # 1.1 CIRCLED IDEOGRAPH WATER -328D ; mapped ; 6728 # 1.1 CIRCLED IDEOGRAPH WOOD -328E ; mapped ; 91D1 # 1.1 CIRCLED IDEOGRAPH METAL -328F ; mapped ; 571F # 1.1 CIRCLED IDEOGRAPH EARTH -3290 ; mapped ; 65E5 # 1.1 CIRCLED IDEOGRAPH SUN -3291 ; mapped ; 682A # 1.1 CIRCLED IDEOGRAPH STOCK -3292 ; mapped ; 6709 # 1.1 CIRCLED IDEOGRAPH HAVE -3293 ; mapped ; 793E # 1.1 CIRCLED IDEOGRAPH SOCIETY -3294 ; mapped ; 540D # 1.1 CIRCLED IDEOGRAPH NAME -3295 ; mapped ; 7279 # 1.1 CIRCLED IDEOGRAPH SPECIAL -3296 ; mapped ; 8CA1 # 1.1 CIRCLED IDEOGRAPH FINANCIAL -3297 ; mapped ; 795D # 1.1 CIRCLED IDEOGRAPH CONGRATULATION -3298 ; mapped ; 52B4 # 1.1 CIRCLED IDEOGRAPH LABOR -3299 ; mapped ; 79D8 # 1.1 CIRCLED IDEOGRAPH SECRET -329A ; mapped ; 7537 # 1.1 CIRCLED IDEOGRAPH MALE -329B ; mapped ; 5973 # 1.1 CIRCLED IDEOGRAPH FEMALE -329C ; mapped ; 9069 # 1.1 CIRCLED IDEOGRAPH SUITABLE -329D ; mapped ; 512A # 1.1 CIRCLED IDEOGRAPH EXCELLENT -329E ; mapped ; 5370 # 1.1 CIRCLED IDEOGRAPH PRINT -329F ; mapped ; 6CE8 # 1.1 CIRCLED IDEOGRAPH ATTENTION -32A0 ; mapped ; 9805 # 1.1 CIRCLED IDEOGRAPH ITEM -32A1 ; mapped ; 4F11 # 1.1 CIRCLED IDEOGRAPH REST -32A2 ; mapped ; 5199 # 1.1 CIRCLED IDEOGRAPH COPY -32A3 ; mapped ; 6B63 # 1.1 CIRCLED IDEOGRAPH CORRECT -32A4 ; mapped ; 4E0A # 1.1 CIRCLED IDEOGRAPH HIGH -32A5 ; mapped ; 4E2D # 1.1 CIRCLED IDEOGRAPH CENTRE -32A6 ; mapped ; 4E0B # 1.1 CIRCLED IDEOGRAPH LOW -32A7 ; mapped ; 5DE6 # 1.1 CIRCLED IDEOGRAPH LEFT -32A8 ; mapped ; 53F3 # 1.1 CIRCLED IDEOGRAPH RIGHT -32A9 ; mapped ; 533B # 1.1 CIRCLED IDEOGRAPH MEDICINE -32AA ; mapped ; 5B97 # 1.1 CIRCLED IDEOGRAPH RELIGION -32AB ; mapped ; 5B66 # 1.1 CIRCLED IDEOGRAPH STUDY -32AC ; mapped ; 76E3 # 1.1 CIRCLED IDEOGRAPH SUPERVISE -32AD ; mapped ; 4F01 # 1.1 CIRCLED IDEOGRAPH ENTERPRISE -32AE ; mapped ; 8CC7 # 1.1 CIRCLED IDEOGRAPH RESOURCE -32AF ; mapped ; 5354 # 1.1 CIRCLED IDEOGRAPH ALLIANCE -32B0 ; mapped ; 591C # 1.1 CIRCLED IDEOGRAPH NIGHT -32B1 ; mapped ; 0033 0036 # 3.2 CIRCLED NUMBER THIRTY SIX -32B2 ; mapped ; 0033 0037 # 3.2 CIRCLED NUMBER THIRTY SEVEN -32B3 ; mapped ; 0033 0038 # 3.2 CIRCLED NUMBER THIRTY EIGHT -32B4 ; mapped ; 0033 0039 # 3.2 CIRCLED NUMBER THIRTY NINE -32B5 ; mapped ; 0034 0030 # 3.2 CIRCLED NUMBER FORTY -32B6 ; mapped ; 0034 0031 # 3.2 CIRCLED NUMBER FORTY ONE -32B7 ; mapped ; 0034 0032 # 3.2 CIRCLED NUMBER FORTY TWO -32B8 ; mapped ; 0034 0033 # 3.2 CIRCLED NUMBER FORTY THREE -32B9 ; mapped ; 0034 0034 # 3.2 CIRCLED NUMBER FORTY FOUR -32BA ; mapped ; 0034 0035 # 3.2 CIRCLED NUMBER FORTY FIVE -32BB ; mapped ; 0034 0036 # 3.2 CIRCLED NUMBER FORTY SIX -32BC ; mapped ; 0034 0037 # 3.2 CIRCLED NUMBER FORTY SEVEN -32BD ; mapped ; 0034 0038 # 3.2 CIRCLED NUMBER FORTY EIGHT -32BE ; mapped ; 0034 0039 # 3.2 CIRCLED NUMBER FORTY NINE -32BF ; mapped ; 0035 0030 # 3.2 CIRCLED NUMBER FIFTY -32C0 ; mapped ; 0031 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY -32C1 ; mapped ; 0032 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY -32C2 ; mapped ; 0033 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH -32C3 ; mapped ; 0034 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL -32C4 ; mapped ; 0035 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY -32C5 ; mapped ; 0036 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE -32C6 ; mapped ; 0037 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY -32C7 ; mapped ; 0038 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST -32C8 ; mapped ; 0039 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER -32C9 ; mapped ; 0031 0030 6708 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER -32CA ; mapped ; 0031 0031 6708 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER -32CB ; mapped ; 0031 0032 6708 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER -32CC ; mapped ; 0068 0067 # 4.0 SQUARE HG -32CD ; mapped ; 0065 0072 0067 #4.0 SQUARE ERG -32CE ; mapped ; 0065 0076 # 4.0 SQUARE EV -32CF ; mapped ; 006C 0074 0064 #4.0 LIMITED LIABILITY SIGN -32D0 ; mapped ; 30A2 # 1.1 CIRCLED KATAKANA A -32D1 ; mapped ; 30A4 # 1.1 CIRCLED KATAKANA I -32D2 ; mapped ; 30A6 # 1.1 CIRCLED KATAKANA U -32D3 ; mapped ; 30A8 # 1.1 CIRCLED KATAKANA E -32D4 ; mapped ; 30AA # 1.1 CIRCLED KATAKANA O -32D5 ; mapped ; 30AB # 1.1 CIRCLED KATAKANA KA -32D6 ; mapped ; 30AD # 1.1 CIRCLED KATAKANA KI -32D7 ; mapped ; 30AF # 1.1 CIRCLED KATAKANA KU -32D8 ; mapped ; 30B1 # 1.1 CIRCLED KATAKANA KE -32D9 ; mapped ; 30B3 # 1.1 CIRCLED KATAKANA KO -32DA ; mapped ; 30B5 # 1.1 CIRCLED KATAKANA SA -32DB ; mapped ; 30B7 # 1.1 CIRCLED KATAKANA SI -32DC ; mapped ; 30B9 # 1.1 CIRCLED KATAKANA SU -32DD ; mapped ; 30BB # 1.1 CIRCLED KATAKANA SE -32DE ; mapped ; 30BD # 1.1 CIRCLED KATAKANA SO -32DF ; mapped ; 30BF # 1.1 CIRCLED KATAKANA TA -32E0 ; mapped ; 30C1 # 1.1 CIRCLED KATAKANA TI -32E1 ; mapped ; 30C4 # 1.1 CIRCLED KATAKANA TU -32E2 ; mapped ; 30C6 # 1.1 CIRCLED KATAKANA TE -32E3 ; mapped ; 30C8 # 1.1 CIRCLED KATAKANA TO -32E4 ; mapped ; 30CA # 1.1 CIRCLED KATAKANA NA -32E5 ; mapped ; 30CB # 1.1 CIRCLED KATAKANA NI -32E6 ; mapped ; 30CC # 1.1 CIRCLED KATAKANA NU -32E7 ; mapped ; 30CD # 1.1 CIRCLED KATAKANA NE -32E8 ; mapped ; 30CE # 1.1 CIRCLED KATAKANA NO -32E9 ; mapped ; 30CF # 1.1 CIRCLED KATAKANA HA -32EA ; mapped ; 30D2 # 1.1 CIRCLED KATAKANA HI -32EB ; mapped ; 30D5 # 1.1 CIRCLED KATAKANA HU -32EC ; mapped ; 30D8 # 1.1 CIRCLED KATAKANA HE -32ED ; mapped ; 30DB # 1.1 CIRCLED KATAKANA HO -32EE ; mapped ; 30DE # 1.1 CIRCLED KATAKANA MA -32EF ; mapped ; 30DF # 1.1 CIRCLED KATAKANA MI -32F0 ; mapped ; 30E0 # 1.1 CIRCLED KATAKANA MU -32F1 ; mapped ; 30E1 # 1.1 CIRCLED KATAKANA ME -32F2 ; mapped ; 30E2 # 1.1 CIRCLED KATAKANA MO -32F3 ; mapped ; 30E4 # 1.1 CIRCLED KATAKANA YA -32F4 ; mapped ; 30E6 # 1.1 CIRCLED KATAKANA YU -32F5 ; mapped ; 30E8 # 1.1 CIRCLED KATAKANA YO -32F6 ; mapped ; 30E9 # 1.1 CIRCLED KATAKANA RA -32F7 ; mapped ; 30EA # 1.1 CIRCLED KATAKANA RI -32F8 ; mapped ; 30EB # 1.1 CIRCLED KATAKANA RU -32F9 ; mapped ; 30EC # 1.1 CIRCLED KATAKANA RE -32FA ; mapped ; 30ED # 1.1 CIRCLED KATAKANA RO -32FB ; mapped ; 30EF # 1.1 CIRCLED KATAKANA WA -32FC ; mapped ; 30F0 # 1.1 CIRCLED KATAKANA WI -32FD ; mapped ; 30F1 # 1.1 CIRCLED KATAKANA WE -32FE ; mapped ; 30F2 # 1.1 CIRCLED KATAKANA WO -32FF ; disallowed # NA -3300 ; mapped ; 30A2 30D1 30FC 30C8 #1.1 SQUARE APAATO -3301 ; mapped ; 30A2 30EB 30D5 30A1 #1.1 SQUARE ARUHUA -3302 ; mapped ; 30A2 30F3 30DA 30A2 #1.1 SQUARE ANPEA -3303 ; mapped ; 30A2 30FC 30EB #1.1 SQUARE AARU -3304 ; mapped ; 30A4 30CB 30F3 30B0 #1.1 SQUARE ININGU -3305 ; mapped ; 30A4 30F3 30C1 #1.1 SQUARE INTI -3306 ; mapped ; 30A6 30A9 30F3 #1.1 SQUARE UON -3307 ; mapped ; 30A8 30B9 30AF 30FC 30C9 #1.1 SQUARE ESUKUUDO -3308 ; mapped ; 30A8 30FC 30AB 30FC #1.1 SQUARE EEKAA -3309 ; mapped ; 30AA 30F3 30B9 #1.1 SQUARE ONSU -330A ; mapped ; 30AA 30FC 30E0 #1.1 SQUARE OOMU -330B ; mapped ; 30AB 30A4 30EA #1.1 SQUARE KAIRI -330C ; mapped ; 30AB 30E9 30C3 30C8 #1.1 SQUARE KARATTO -330D ; mapped ; 30AB 30ED 30EA 30FC #1.1 SQUARE KARORII -330E ; mapped ; 30AC 30ED 30F3 #1.1 SQUARE GARON -330F ; mapped ; 30AC 30F3 30DE #1.1 SQUARE GANMA -3310 ; mapped ; 30AE 30AC # 1.1 SQUARE GIGA -3311 ; mapped ; 30AE 30CB 30FC #1.1 SQUARE GINII -3312 ; mapped ; 30AD 30E5 30EA 30FC #1.1 SQUARE KYURII -3313 ; mapped ; 30AE 30EB 30C0 30FC #1.1 SQUARE GIRUDAA -3314 ; mapped ; 30AD 30ED # 1.1 SQUARE KIRO -3315 ; mapped ; 30AD 30ED 30B0 30E9 30E0 #1.1 SQUARE KIROGURAMU -3316 ; mapped ; 30AD 30ED 30E1 30FC 30C8 30EB #1.1 SQUARE KIROMEETORU -3317 ; mapped ; 30AD 30ED 30EF 30C3 30C8 #1.1 SQUARE KIROWATTO -3318 ; mapped ; 30B0 30E9 30E0 #1.1 SQUARE GURAMU -3319 ; mapped ; 30B0 30E9 30E0 30C8 30F3 #1.1 SQUARE GURAMUTON -331A ; mapped ; 30AF 30EB 30BC 30A4 30ED #1.1 SQUARE KURUZEIRO -331B ; mapped ; 30AF 30ED 30FC 30CD #1.1 SQUARE KUROONE -331C ; mapped ; 30B1 30FC 30B9 #1.1 SQUARE KEESU -331D ; mapped ; 30B3 30EB 30CA #1.1 SQUARE KORUNA -331E ; mapped ; 30B3 30FC 30DD #1.1 SQUARE KOOPO -331F ; mapped ; 30B5 30A4 30AF 30EB #1.1 SQUARE SAIKURU -3320 ; mapped ; 30B5 30F3 30C1 30FC 30E0 #1.1 SQUARE SANTIIMU -3321 ; mapped ; 30B7 30EA 30F3 30B0 #1.1 SQUARE SIRINGU -3322 ; mapped ; 30BB 30F3 30C1 #1.1 SQUARE SENTI -3323 ; mapped ; 30BB 30F3 30C8 #1.1 SQUARE SENTO -3324 ; mapped ; 30C0 30FC 30B9 #1.1 SQUARE DAASU -3325 ; mapped ; 30C7 30B7 # 1.1 SQUARE DESI -3326 ; mapped ; 30C9 30EB # 1.1 SQUARE DORU -3327 ; mapped ; 30C8 30F3 # 1.1 SQUARE TON -3328 ; mapped ; 30CA 30CE # 1.1 SQUARE NANO -3329 ; mapped ; 30CE 30C3 30C8 #1.1 SQUARE NOTTO -332A ; mapped ; 30CF 30A4 30C4 #1.1 SQUARE HAITU -332B ; mapped ; 30D1 30FC 30BB 30F3 30C8 #1.1 SQUARE PAASENTO -332C ; mapped ; 30D1 30FC 30C4 #1.1 SQUARE PAATU -332D ; mapped ; 30D0 30FC 30EC 30EB #1.1 SQUARE BAARERU -332E ; mapped ; 30D4 30A2 30B9 30C8 30EB #1.1 SQUARE PIASUTORU -332F ; mapped ; 30D4 30AF 30EB #1.1 SQUARE PIKURU -3330 ; mapped ; 30D4 30B3 # 1.1 SQUARE PIKO -3331 ; mapped ; 30D3 30EB # 1.1 SQUARE BIRU -3332 ; mapped ; 30D5 30A1 30E9 30C3 30C9 #1.1 SQUARE HUARADDO -3333 ; mapped ; 30D5 30A3 30FC 30C8 #1.1 SQUARE HUIITO -3334 ; mapped ; 30D6 30C3 30B7 30A7 30EB #1.1 SQUARE BUSSYERU -3335 ; mapped ; 30D5 30E9 30F3 #1.1 SQUARE HURAN -3336 ; mapped ; 30D8 30AF 30BF 30FC 30EB #1.1 SQUARE HEKUTAARU -3337 ; mapped ; 30DA 30BD # 1.1 SQUARE PESO -3338 ; mapped ; 30DA 30CB 30D2 #1.1 SQUARE PENIHI -3339 ; mapped ; 30D8 30EB 30C4 #1.1 SQUARE HERUTU -333A ; mapped ; 30DA 30F3 30B9 #1.1 SQUARE PENSU -333B ; mapped ; 30DA 30FC 30B8 #1.1 SQUARE PEEZI -333C ; mapped ; 30D9 30FC 30BF #1.1 SQUARE BEETA -333D ; mapped ; 30DD 30A4 30F3 30C8 #1.1 SQUARE POINTO -333E ; mapped ; 30DC 30EB 30C8 #1.1 SQUARE BORUTO -333F ; mapped ; 30DB 30F3 # 1.1 SQUARE HON -3340 ; mapped ; 30DD 30F3 30C9 #1.1 SQUARE PONDO -3341 ; mapped ; 30DB 30FC 30EB #1.1 SQUARE HOORU -3342 ; mapped ; 30DB 30FC 30F3 #1.1 SQUARE HOON -3343 ; mapped ; 30DE 30A4 30AF 30ED #1.1 SQUARE MAIKURO -3344 ; mapped ; 30DE 30A4 30EB #1.1 SQUARE MAIRU -3345 ; mapped ; 30DE 30C3 30CF #1.1 SQUARE MAHHA -3346 ; mapped ; 30DE 30EB 30AF #1.1 SQUARE MARUKU -3347 ; mapped ; 30DE 30F3 30B7 30E7 30F3 #1.1 SQUARE MANSYON -3348 ; mapped ; 30DF 30AF 30ED 30F3 #1.1 SQUARE MIKURON -3349 ; mapped ; 30DF 30EA # 1.1 SQUARE MIRI -334A ; mapped ; 30DF 30EA 30D0 30FC 30EB #1.1 SQUARE MIRIBAARU -334B ; mapped ; 30E1 30AC # 1.1 SQUARE MEGA -334C ; mapped ; 30E1 30AC 30C8 30F3 #1.1 SQUARE MEGATON -334D ; mapped ; 30E1 30FC 30C8 30EB #1.1 SQUARE MEETORU -334E ; mapped ; 30E4 30FC 30C9 #1.1 SQUARE YAADO -334F ; mapped ; 30E4 30FC 30EB #1.1 SQUARE YAARU -3350 ; mapped ; 30E6 30A2 30F3 #1.1 SQUARE YUAN -3351 ; mapped ; 30EA 30C3 30C8 30EB #1.1 SQUARE RITTORU -3352 ; mapped ; 30EA 30E9 # 1.1 SQUARE RIRA -3353 ; mapped ; 30EB 30D4 30FC #1.1 SQUARE RUPII -3354 ; mapped ; 30EB 30FC 30D6 30EB #1.1 SQUARE RUUBURU -3355 ; mapped ; 30EC 30E0 # 1.1 SQUARE REMU -3356 ; mapped ; 30EC 30F3 30C8 30B2 30F3 #1.1 SQUARE RENTOGEN -3357 ; mapped ; 30EF 30C3 30C8 #1.1 SQUARE WATTO -3358 ; mapped ; 0030 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO -3359 ; mapped ; 0031 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE -335A ; mapped ; 0032 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO -335B ; mapped ; 0033 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE -335C ; mapped ; 0034 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR -335D ; mapped ; 0035 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE -335E ; mapped ; 0036 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX -335F ; mapped ; 0037 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN -3360 ; mapped ; 0038 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT -3361 ; mapped ; 0039 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE -3362 ; mapped ; 0031 0030 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN -3363 ; mapped ; 0031 0031 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN -3364 ; mapped ; 0031 0032 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE -3365 ; mapped ; 0031 0033 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN -3366 ; mapped ; 0031 0034 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN -3367 ; mapped ; 0031 0035 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN -3368 ; mapped ; 0031 0036 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN -3369 ; mapped ; 0031 0037 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN -336A ; mapped ; 0031 0038 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN -336B ; mapped ; 0031 0039 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN -336C ; mapped ; 0032 0030 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY -336D ; mapped ; 0032 0031 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE -336E ; mapped ; 0032 0032 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO -336F ; mapped ; 0032 0033 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE -3370 ; mapped ; 0032 0034 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR -3371 ; mapped ; 0068 0070 0061 #1.1 SQUARE HPA -3372 ; mapped ; 0064 0061 # 1.1 SQUARE DA -3373 ; mapped ; 0061 0075 # 1.1 SQUARE AU -3374 ; mapped ; 0062 0061 0072 #1.1 SQUARE BAR -3375 ; mapped ; 006F 0076 # 1.1 SQUARE OV -3376 ; mapped ; 0070 0063 # 1.1 SQUARE PC -3377 ; mapped ; 0064 006D # 4.0 SQUARE DM -3378 ; mapped ; 0064 006D 0032 #4.0 SQUARE DM SQUARED -3379 ; mapped ; 0064 006D 0033 #4.0 SQUARE DM CUBED -337A ; mapped ; 0069 0075 # 4.0 SQUARE IU -337B ; mapped ; 5E73 6210 # 1.1 SQUARE ERA NAME HEISEI -337C ; mapped ; 662D 548C # 1.1 SQUARE ERA NAME SYOUWA -337D ; mapped ; 5927 6B63 # 1.1 SQUARE ERA NAME TAISYOU -337E ; mapped ; 660E 6CBB # 1.1 SQUARE ERA NAME MEIZI -337F ; mapped ; 682A 5F0F 4F1A 793E #1.1 SQUARE CORPORATION -3380 ; mapped ; 0070 0061 # 1.1 SQUARE PA AMPS -3381 ; mapped ; 006E 0061 # 1.1 SQUARE NA -3382 ; mapped ; 03BC 0061 # 1.1 SQUARE MU A -3383 ; mapped ; 006D 0061 # 1.1 SQUARE MA -3384 ; mapped ; 006B 0061 # 1.1 SQUARE KA -3385 ; mapped ; 006B 0062 # 1.1 SQUARE KB -3386 ; mapped ; 006D 0062 # 1.1 SQUARE MB -3387 ; mapped ; 0067 0062 # 1.1 SQUARE GB -3388 ; mapped ; 0063 0061 006C #1.1 SQUARE CAL -3389 ; mapped ; 006B 0063 0061 006C #1.1 SQUARE KCAL -338A ; mapped ; 0070 0066 # 1.1 SQUARE PF -338B ; mapped ; 006E 0066 # 1.1 SQUARE NF -338C ; mapped ; 03BC 0066 # 1.1 SQUARE MU F -338D ; mapped ; 03BC 0067 # 1.1 SQUARE MU G -338E ; mapped ; 006D 0067 # 1.1 SQUARE MG -338F ; mapped ; 006B 0067 # 1.1 SQUARE KG -3390 ; mapped ; 0068 007A # 1.1 SQUARE HZ -3391 ; mapped ; 006B 0068 007A #1.1 SQUARE KHZ -3392 ; mapped ; 006D 0068 007A #1.1 SQUARE MHZ -3393 ; mapped ; 0067 0068 007A #1.1 SQUARE GHZ -3394 ; mapped ; 0074 0068 007A #1.1 SQUARE THZ -3395 ; mapped ; 03BC 006C # 1.1 SQUARE MU L -3396 ; mapped ; 006D 006C # 1.1 SQUARE ML -3397 ; mapped ; 0064 006C # 1.1 SQUARE DL -3398 ; mapped ; 006B 006C # 1.1 SQUARE KL -3399 ; mapped ; 0066 006D # 1.1 SQUARE FM -339A ; mapped ; 006E 006D # 1.1 SQUARE NM -339B ; mapped ; 03BC 006D # 1.1 SQUARE MU M -339C ; mapped ; 006D 006D # 1.1 SQUARE MM -339D ; mapped ; 0063 006D # 1.1 SQUARE CM -339E ; mapped ; 006B 006D # 1.1 SQUARE KM -339F ; mapped ; 006D 006D 0032 #1.1 SQUARE MM SQUARED -33A0 ; mapped ; 0063 006D 0032 #1.1 SQUARE CM SQUARED -33A1 ; mapped ; 006D 0032 # 1.1 SQUARE M SQUARED -33A2 ; mapped ; 006B 006D 0032 #1.1 SQUARE KM SQUARED -33A3 ; mapped ; 006D 006D 0033 #1.1 SQUARE MM CUBED -33A4 ; mapped ; 0063 006D 0033 #1.1 SQUARE CM CUBED -33A5 ; mapped ; 006D 0033 # 1.1 SQUARE M CUBED -33A6 ; mapped ; 006B 006D 0033 #1.1 SQUARE KM CUBED -33A7 ; mapped ; 006D 2215 0073 #1.1 SQUARE M OVER S -33A8 ; mapped ; 006D 2215 0073 0032 #1.1 SQUARE M OVER S SQUARED -33A9 ; mapped ; 0070 0061 # 1.1 SQUARE PA -33AA ; mapped ; 006B 0070 0061 #1.1 SQUARE KPA -33AB ; mapped ; 006D 0070 0061 #1.1 SQUARE MPA -33AC ; mapped ; 0067 0070 0061 #1.1 SQUARE GPA -33AD ; mapped ; 0072 0061 0064 #1.1 SQUARE RAD -33AE ; mapped ; 0072 0061 0064 2215 0073 #1.1 SQUARE RAD OVER S -33AF ; mapped ; 0072 0061 0064 2215 0073 0032 #1.1 SQUARE RAD OVER S SQUARED -33B0 ; mapped ; 0070 0073 # 1.1 SQUARE PS -33B1 ; mapped ; 006E 0073 # 1.1 SQUARE NS -33B2 ; mapped ; 03BC 0073 # 1.1 SQUARE MU S -33B3 ; mapped ; 006D 0073 # 1.1 SQUARE MS -33B4 ; mapped ; 0070 0076 # 1.1 SQUARE PV -33B5 ; mapped ; 006E 0076 # 1.1 SQUARE NV -33B6 ; mapped ; 03BC 0076 # 1.1 SQUARE MU V -33B7 ; mapped ; 006D 0076 # 1.1 SQUARE MV -33B8 ; mapped ; 006B 0076 # 1.1 SQUARE KV -33B9 ; mapped ; 006D 0076 # 1.1 SQUARE MV MEGA -33BA ; mapped ; 0070 0077 # 1.1 SQUARE PW -33BB ; mapped ; 006E 0077 # 1.1 SQUARE NW -33BC ; mapped ; 03BC 0077 # 1.1 SQUARE MU W -33BD ; mapped ; 006D 0077 # 1.1 SQUARE MW -33BE ; mapped ; 006B 0077 # 1.1 SQUARE KW -33BF ; mapped ; 006D 0077 # 1.1 SQUARE MW MEGA -33C0 ; mapped ; 006B 03C9 # 1.1 SQUARE K OHM -33C1 ; mapped ; 006D 03C9 # 1.1 SQUARE M OHM -33C2 ; disallowed # 1.1 SQUARE AM -33C3 ; mapped ; 0062 0071 # 1.1 SQUARE BQ -33C4 ; mapped ; 0063 0063 # 1.1 SQUARE CC -33C5 ; mapped ; 0063 0064 # 1.1 SQUARE CD -33C6 ; mapped ; 0063 2215 006B 0067 #1.1 SQUARE C OVER KG -33C7 ; disallowed # 1.1 SQUARE CO -33C8 ; mapped ; 0064 0062 # 1.1 SQUARE DB -33C9 ; mapped ; 0067 0079 # 1.1 SQUARE GY -33CA ; mapped ; 0068 0061 # 1.1 SQUARE HA -33CB ; mapped ; 0068 0070 # 1.1 SQUARE HP -33CC ; mapped ; 0069 006E # 1.1 SQUARE IN -33CD ; mapped ; 006B 006B # 1.1 SQUARE KK -33CE ; mapped ; 006B 006D # 1.1 SQUARE KM CAPITAL -33CF ; mapped ; 006B 0074 # 1.1 SQUARE KT -33D0 ; mapped ; 006C 006D # 1.1 SQUARE LM -33D1 ; mapped ; 006C 006E # 1.1 SQUARE LN -33D2 ; mapped ; 006C 006F 0067 #1.1 SQUARE LOG -33D3 ; mapped ; 006C 0078 # 1.1 SQUARE LX -33D4 ; mapped ; 006D 0062 # 1.1 SQUARE MB SMALL -33D5 ; mapped ; 006D 0069 006C #1.1 SQUARE MIL -33D6 ; mapped ; 006D 006F 006C #1.1 SQUARE MOL -33D7 ; mapped ; 0070 0068 # 1.1 SQUARE PH -33D8 ; disallowed # 1.1 SQUARE PM -33D9 ; mapped ; 0070 0070 006D #1.1 SQUARE PPM -33DA ; mapped ; 0070 0072 # 1.1 SQUARE PR -33DB ; mapped ; 0073 0072 # 1.1 SQUARE SR -33DC ; mapped ; 0073 0076 # 1.1 SQUARE SV -33DD ; mapped ; 0077 0062 # 1.1 SQUARE WB -33DE ; mapped ; 0076 2215 006D #4.0 SQUARE V OVER M -33DF ; mapped ; 0061 2215 006D #4.0 SQUARE A OVER M -33E0 ; mapped ; 0031 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE -33E1 ; mapped ; 0032 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO -33E2 ; mapped ; 0033 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE -33E3 ; mapped ; 0034 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR -33E4 ; mapped ; 0035 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE -33E5 ; mapped ; 0036 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX -33E6 ; mapped ; 0037 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN -33E7 ; mapped ; 0038 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT -33E8 ; mapped ; 0039 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE -33E9 ; mapped ; 0031 0030 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN -33EA ; mapped ; 0031 0031 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN -33EB ; mapped ; 0031 0032 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE -33EC ; mapped ; 0031 0033 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN -33ED ; mapped ; 0031 0034 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN -33EE ; mapped ; 0031 0035 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN -33EF ; mapped ; 0031 0036 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN -33F0 ; mapped ; 0031 0037 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN -33F1 ; mapped ; 0031 0038 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN -33F2 ; mapped ; 0031 0039 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN -33F3 ; mapped ; 0032 0030 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY -33F4 ; mapped ; 0032 0031 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE -33F5 ; mapped ; 0032 0032 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO -33F6 ; mapped ; 0032 0033 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE -33F7 ; mapped ; 0032 0034 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR -33F8 ; mapped ; 0032 0035 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE -33F9 ; mapped ; 0032 0036 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX -33FA ; mapped ; 0032 0037 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN -33FB ; mapped ; 0032 0038 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT -33FC ; mapped ; 0032 0039 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE -33FD ; mapped ; 0033 0030 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY -33FE ; mapped ; 0033 0031 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE -33FF ; mapped ; 0067 0061 006C #4.0 SQUARE GAL -3400..4DB5 ; valid # 3.0 CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4DB6..4DBF ; disallowed # NA .. -4DC0..4DFF ; valid ; ; NV8 # 4.0 HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -4E00..9FA5 ; valid # 1.1 CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 -9FA6..9FBB ; valid # 4.1 CJK UNIFIED IDEOGRAPH-9FA6..CJK UNIFIED IDEOGRAPH-9FBB -9FBC..9FC3 ; valid # 5.1 CJK UNIFIED IDEOGRAPH-9FBC..CJK UNIFIED IDEOGRAPH-9FC3 -9FC4..9FCB ; valid # 5.2 CJK UNIFIED IDEOGRAPH-9FC4..CJK UNIFIED IDEOGRAPH-9FCB -9FCC ; valid # 6.1 CJK UNIFIED IDEOGRAPH-9FCC -9FCD..9FD5 ; valid # 8.0 CJK UNIFIED IDEOGRAPH-9FCD..CJK UNIFIED IDEOGRAPH-9FD5 -9FD6..9FEA ; valid # 10.0 CJK UNIFIED IDEOGRAPH-9FD6..CJK UNIFIED IDEOGRAPH-9FEA -9FEB..9FFF ; disallowed # NA .. -A000..A48C ; valid # 3.0 YI SYLLABLE IT..YI SYLLABLE YYR -A48D..A48F ; disallowed # NA .. -A490..A4A1 ; valid ; ; NV8 # 3.0 YI RADICAL QOT..YI RADICAL GA -A4A2..A4A3 ; valid ; ; NV8 # 3.2 YI RADICAL ZUP..YI RADICAL CYT -A4A4..A4B3 ; valid ; ; NV8 # 3.0 YI RADICAL DDUR..YI RADICAL JO -A4B4 ; valid ; ; NV8 # 3.2 YI RADICAL NZUP -A4B5..A4C0 ; valid ; ; NV8 # 3.0 YI RADICAL JJY..YI RADICAL SHAT -A4C1 ; valid ; ; NV8 # 3.2 YI RADICAL ZUR -A4C2..A4C4 ; valid ; ; NV8 # 3.0 YI RADICAL SHOP..YI RADICAL ZZIET -A4C5 ; valid ; ; NV8 # 3.2 YI RADICAL NBIE -A4C6 ; valid ; ; NV8 # 3.0 YI RADICAL KE -A4C7..A4CF ; disallowed # NA .. -A4D0..A4FD ; valid # 5.2 LISU LETTER BA..LISU LETTER TONE MYA JEU -A4FE..A4FF ; valid ; ; NV8 # 5.2 LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP -A500..A60C ; valid # 5.1 VAI SYLLABLE EE..VAI SYLLABLE LENGTHENER -A60D..A60F ; valid ; ; NV8 # 5.1 VAI COMMA..VAI QUESTION MARK -A610..A62B ; valid # 5.1 VAI SYLLABLE NDOLE FA..VAI SYLLABLE NDOLE DO -A62C..A63F ; disallowed # NA .. -A640 ; mapped ; A641 # 5.1 CYRILLIC CAPITAL LETTER ZEMLYA -A641 ; valid # 5.1 CYRILLIC SMALL LETTER ZEMLYA -A642 ; mapped ; A643 # 5.1 CYRILLIC CAPITAL LETTER DZELO -A643 ; valid # 5.1 CYRILLIC SMALL LETTER DZELO -A644 ; mapped ; A645 # 5.1 CYRILLIC CAPITAL LETTER REVERSED DZE -A645 ; valid # 5.1 CYRILLIC SMALL LETTER REVERSED DZE -A646 ; mapped ; A647 # 5.1 CYRILLIC CAPITAL LETTER IOTA -A647 ; valid # 5.1 CYRILLIC SMALL LETTER IOTA -A648 ; mapped ; A649 # 5.1 CYRILLIC CAPITAL LETTER DJERV -A649 ; valid # 5.1 CYRILLIC SMALL LETTER DJERV -A64A ; mapped ; A64B # 5.1 CYRILLIC CAPITAL LETTER MONOGRAPH UK -A64B ; valid # 5.1 CYRILLIC SMALL LETTER MONOGRAPH UK -A64C ; mapped ; A64D # 5.1 CYRILLIC CAPITAL LETTER BROAD OMEGA -A64D ; valid # 5.1 CYRILLIC SMALL LETTER BROAD OMEGA -A64E ; mapped ; A64F # 5.1 CYRILLIC CAPITAL LETTER NEUTRAL YER -A64F ; valid # 5.1 CYRILLIC SMALL LETTER NEUTRAL YER -A650 ; mapped ; A651 # 5.1 CYRILLIC CAPITAL LETTER YERU WITH BACK YER -A651 ; valid # 5.1 CYRILLIC SMALL LETTER YERU WITH BACK YER -A652 ; mapped ; A653 # 5.1 CYRILLIC CAPITAL LETTER IOTIFIED YAT -A653 ; valid # 5.1 CYRILLIC SMALL LETTER IOTIFIED YAT -A654 ; mapped ; A655 # 5.1 CYRILLIC CAPITAL LETTER REVERSED YU -A655 ; valid # 5.1 CYRILLIC SMALL LETTER REVERSED YU -A656 ; mapped ; A657 # 5.1 CYRILLIC CAPITAL LETTER IOTIFIED A -A657 ; valid # 5.1 CYRILLIC SMALL LETTER IOTIFIED A -A658 ; mapped ; A659 # 5.1 CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS -A659 ; valid # 5.1 CYRILLIC SMALL LETTER CLOSED LITTLE YUS -A65A ; mapped ; A65B # 5.1 CYRILLIC CAPITAL LETTER BLENDED YUS -A65B ; valid # 5.1 CYRILLIC SMALL LETTER BLENDED YUS -A65C ; mapped ; A65D # 5.1 CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS -A65D ; valid # 5.1 CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS -A65E ; mapped ; A65F # 5.1 CYRILLIC CAPITAL LETTER YN -A65F ; valid # 5.1 CYRILLIC SMALL LETTER YN -A660 ; mapped ; A661 # 6.0 CYRILLIC CAPITAL LETTER REVERSED TSE -A661 ; valid # 6.0 CYRILLIC SMALL LETTER REVERSED TSE -A662 ; mapped ; A663 # 5.1 CYRILLIC CAPITAL LETTER SOFT DE -A663 ; valid # 5.1 CYRILLIC SMALL LETTER SOFT DE -A664 ; mapped ; A665 # 5.1 CYRILLIC CAPITAL LETTER SOFT EL -A665 ; valid # 5.1 CYRILLIC SMALL LETTER SOFT EL -A666 ; mapped ; A667 # 5.1 CYRILLIC CAPITAL LETTER SOFT EM -A667 ; valid # 5.1 CYRILLIC SMALL LETTER SOFT EM -A668 ; mapped ; A669 # 5.1 CYRILLIC CAPITAL LETTER MONOCULAR O -A669 ; valid # 5.1 CYRILLIC SMALL LETTER MONOCULAR O -A66A ; mapped ; A66B # 5.1 CYRILLIC CAPITAL LETTER BINOCULAR O -A66B ; valid # 5.1 CYRILLIC SMALL LETTER BINOCULAR O -A66C ; mapped ; A66D # 5.1 CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O -A66D..A66F ; valid # 5.1 CYRILLIC SMALL LETTER DOUBLE MONOCULAR O..COMBINING CYRILLIC VZMET -A670..A673 ; valid ; ; NV8 # 5.1 COMBINING CYRILLIC TEN MILLIONS SIGN..SLAVONIC ASTERISK -A674..A67B ; valid # 6.1 COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC LETTER OMEGA -A67C..A67D ; valid # 5.1 COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK -A67E ; valid ; ; NV8 # 5.1 CYRILLIC KAVYKA -A67F ; valid # 5.1 CYRILLIC PAYEROK -A680 ; mapped ; A681 # 5.1 CYRILLIC CAPITAL LETTER DWE -A681 ; valid # 5.1 CYRILLIC SMALL LETTER DWE -A682 ; mapped ; A683 # 5.1 CYRILLIC CAPITAL LETTER DZWE -A683 ; valid # 5.1 CYRILLIC SMALL LETTER DZWE -A684 ; mapped ; A685 # 5.1 CYRILLIC CAPITAL LETTER ZHWE -A685 ; valid # 5.1 CYRILLIC SMALL LETTER ZHWE -A686 ; mapped ; A687 # 5.1 CYRILLIC CAPITAL LETTER CCHE -A687 ; valid # 5.1 CYRILLIC SMALL LETTER CCHE -A688 ; mapped ; A689 # 5.1 CYRILLIC CAPITAL LETTER DZZE -A689 ; valid # 5.1 CYRILLIC SMALL LETTER DZZE -A68A ; mapped ; A68B # 5.1 CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK -A68B ; valid # 5.1 CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK -A68C ; mapped ; A68D # 5.1 CYRILLIC CAPITAL LETTER TWE -A68D ; valid # 5.1 CYRILLIC SMALL LETTER TWE -A68E ; mapped ; A68F # 5.1 CYRILLIC CAPITAL LETTER TSWE -A68F ; valid # 5.1 CYRILLIC SMALL LETTER TSWE -A690 ; mapped ; A691 # 5.1 CYRILLIC CAPITAL LETTER TSSE -A691 ; valid # 5.1 CYRILLIC SMALL LETTER TSSE -A692 ; mapped ; A693 # 5.1 CYRILLIC CAPITAL LETTER TCHE -A693 ; valid # 5.1 CYRILLIC SMALL LETTER TCHE -A694 ; mapped ; A695 # 5.1 CYRILLIC CAPITAL LETTER HWE -A695 ; valid # 5.1 CYRILLIC SMALL LETTER HWE -A696 ; mapped ; A697 # 5.1 CYRILLIC CAPITAL LETTER SHWE -A697 ; valid # 5.1 CYRILLIC SMALL LETTER SHWE -A698 ; mapped ; A699 # 7.0 CYRILLIC CAPITAL LETTER DOUBLE O -A699 ; valid # 7.0 CYRILLIC SMALL LETTER DOUBLE O -A69A ; mapped ; A69B # 7.0 CYRILLIC CAPITAL LETTER CROSSED O -A69B ; valid # 7.0 CYRILLIC SMALL LETTER CROSSED O -A69C ; mapped ; 044A # 7.0 MODIFIER LETTER CYRILLIC HARD SIGN -A69D ; mapped ; 044C # 7.0 MODIFIER LETTER CYRILLIC SOFT SIGN -A69E ; valid # 8.0 COMBINING CYRILLIC LETTER EF -A69F ; valid # 6.1 COMBINING CYRILLIC LETTER IOTIFIED E -A6A0..A6E5 ; valid # 5.2 BAMUM LETTER A..BAMUM LETTER KI -A6E6..A6EF ; valid ; ; NV8 # 5.2 BAMUM LETTER MO..BAMUM LETTER KOGHOM -A6F0..A6F1 ; valid # 5.2 BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS -A6F2..A6F7 ; valid ; ; NV8 # 5.2 BAMUM NJAEMLI..BAMUM QUESTION MARK -A6F8..A6FF ; disallowed # NA .. -A700..A716 ; valid ; ; NV8 # 4.1 MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR -A717..A71A ; valid # 5.0 MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOWER RIGHT CORNER ANGLE -A71B..A71F ; valid # 5.1 MODIFIER LETTER RAISED UP ARROW..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK -A720..A721 ; valid ; ; NV8 # 5.0 MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE -A722 ; mapped ; A723 # 5.1 LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF -A723 ; valid # 5.1 LATIN SMALL LETTER EGYPTOLOGICAL ALEF -A724 ; mapped ; A725 # 5.1 LATIN CAPITAL LETTER EGYPTOLOGICAL AIN -A725 ; valid # 5.1 LATIN SMALL LETTER EGYPTOLOGICAL AIN -A726 ; mapped ; A727 # 5.1 LATIN CAPITAL LETTER HENG -A727 ; valid # 5.1 LATIN SMALL LETTER HENG -A728 ; mapped ; A729 # 5.1 LATIN CAPITAL LETTER TZ -A729 ; valid # 5.1 LATIN SMALL LETTER TZ -A72A ; mapped ; A72B # 5.1 LATIN CAPITAL LETTER TRESILLO -A72B ; valid # 5.1 LATIN SMALL LETTER TRESILLO -A72C ; mapped ; A72D # 5.1 LATIN CAPITAL LETTER CUATRILLO -A72D ; valid # 5.1 LATIN SMALL LETTER CUATRILLO -A72E ; mapped ; A72F # 5.1 LATIN CAPITAL LETTER CUATRILLO WITH COMMA -A72F..A731 ; valid # 5.1 LATIN SMALL LETTER CUATRILLO WITH COMMA..LATIN LETTER SMALL CAPITAL S -A732 ; mapped ; A733 # 5.1 LATIN CAPITAL LETTER AA -A733 ; valid # 5.1 LATIN SMALL LETTER AA -A734 ; mapped ; A735 # 5.1 LATIN CAPITAL LETTER AO -A735 ; valid # 5.1 LATIN SMALL LETTER AO -A736 ; mapped ; A737 # 5.1 LATIN CAPITAL LETTER AU -A737 ; valid # 5.1 LATIN SMALL LETTER AU -A738 ; mapped ; A739 # 5.1 LATIN CAPITAL LETTER AV -A739 ; valid # 5.1 LATIN SMALL LETTER AV -A73A ; mapped ; A73B # 5.1 LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR -A73B ; valid # 5.1 LATIN SMALL LETTER AV WITH HORIZONTAL BAR -A73C ; mapped ; A73D # 5.1 LATIN CAPITAL LETTER AY -A73D ; valid # 5.1 LATIN SMALL LETTER AY -A73E ; mapped ; A73F # 5.1 LATIN CAPITAL LETTER REVERSED C WITH DOT -A73F ; valid # 5.1 LATIN SMALL LETTER REVERSED C WITH DOT -A740 ; mapped ; A741 # 5.1 LATIN CAPITAL LETTER K WITH STROKE -A741 ; valid # 5.1 LATIN SMALL LETTER K WITH STROKE -A742 ; mapped ; A743 # 5.1 LATIN CAPITAL LETTER K WITH DIAGONAL STROKE -A743 ; valid # 5.1 LATIN SMALL LETTER K WITH DIAGONAL STROKE -A744 ; mapped ; A745 # 5.1 LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE -A745 ; valid # 5.1 LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE -A746 ; mapped ; A747 # 5.1 LATIN CAPITAL LETTER BROKEN L -A747 ; valid # 5.1 LATIN SMALL LETTER BROKEN L -A748 ; mapped ; A749 # 5.1 LATIN CAPITAL LETTER L WITH HIGH STROKE -A749 ; valid # 5.1 LATIN SMALL LETTER L WITH HIGH STROKE -A74A ; mapped ; A74B # 5.1 LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY -A74B ; valid # 5.1 LATIN SMALL LETTER O WITH LONG STROKE OVERLAY -A74C ; mapped ; A74D # 5.1 LATIN CAPITAL LETTER O WITH LOOP -A74D ; valid # 5.1 LATIN SMALL LETTER O WITH LOOP -A74E ; mapped ; A74F # 5.1 LATIN CAPITAL LETTER OO -A74F ; valid # 5.1 LATIN SMALL LETTER OO -A750 ; mapped ; A751 # 5.1 LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER -A751 ; valid # 5.1 LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER -A752 ; mapped ; A753 # 5.1 LATIN CAPITAL LETTER P WITH FLOURISH -A753 ; valid # 5.1 LATIN SMALL LETTER P WITH FLOURISH -A754 ; mapped ; A755 # 5.1 LATIN CAPITAL LETTER P WITH SQUIRREL TAIL -A755 ; valid # 5.1 LATIN SMALL LETTER P WITH SQUIRREL TAIL -A756 ; mapped ; A757 # 5.1 LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER -A757 ; valid # 5.1 LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER -A758 ; mapped ; A759 # 5.1 LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE -A759 ; valid # 5.1 LATIN SMALL LETTER Q WITH DIAGONAL STROKE -A75A ; mapped ; A75B # 5.1 LATIN CAPITAL LETTER R ROTUNDA -A75B ; valid # 5.1 LATIN SMALL LETTER R ROTUNDA -A75C ; mapped ; A75D # 5.1 LATIN CAPITAL LETTER RUM ROTUNDA -A75D ; valid # 5.1 LATIN SMALL LETTER RUM ROTUNDA -A75E ; mapped ; A75F # 5.1 LATIN CAPITAL LETTER V WITH DIAGONAL STROKE -A75F ; valid # 5.1 LATIN SMALL LETTER V WITH DIAGONAL STROKE -A760 ; mapped ; A761 # 5.1 LATIN CAPITAL LETTER VY -A761 ; valid # 5.1 LATIN SMALL LETTER VY -A762 ; mapped ; A763 # 5.1 LATIN CAPITAL LETTER VISIGOTHIC Z -A763 ; valid # 5.1 LATIN SMALL LETTER VISIGOTHIC Z -A764 ; mapped ; A765 # 5.1 LATIN CAPITAL LETTER THORN WITH STROKE -A765 ; valid # 5.1 LATIN SMALL LETTER THORN WITH STROKE -A766 ; mapped ; A767 # 5.1 LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER -A767 ; valid # 5.1 LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER -A768 ; mapped ; A769 # 5.1 LATIN CAPITAL LETTER VEND -A769 ; valid # 5.1 LATIN SMALL LETTER VEND -A76A ; mapped ; A76B # 5.1 LATIN CAPITAL LETTER ET -A76B ; valid # 5.1 LATIN SMALL LETTER ET -A76C ; mapped ; A76D # 5.1 LATIN CAPITAL LETTER IS -A76D ; valid # 5.1 LATIN SMALL LETTER IS -A76E ; mapped ; A76F # 5.1 LATIN CAPITAL LETTER CON -A76F ; valid # 5.1 LATIN SMALL LETTER CON -A770 ; mapped ; A76F # 5.1 MODIFIER LETTER US -A771..A778 ; valid # 5.1 LATIN SMALL LETTER DUM..LATIN SMALL LETTER UM -A779 ; mapped ; A77A # 5.1 LATIN CAPITAL LETTER INSULAR D -A77A ; valid # 5.1 LATIN SMALL LETTER INSULAR D -A77B ; mapped ; A77C # 5.1 LATIN CAPITAL LETTER INSULAR F -A77C ; valid # 5.1 LATIN SMALL LETTER INSULAR F -A77D ; mapped ; 1D79 # 5.1 LATIN CAPITAL LETTER INSULAR G -A77E ; mapped ; A77F # 5.1 LATIN CAPITAL LETTER TURNED INSULAR G -A77F ; valid # 5.1 LATIN SMALL LETTER TURNED INSULAR G -A780 ; mapped ; A781 # 5.1 LATIN CAPITAL LETTER TURNED L -A781 ; valid # 5.1 LATIN SMALL LETTER TURNED L -A782 ; mapped ; A783 # 5.1 LATIN CAPITAL LETTER INSULAR R -A783 ; valid # 5.1 LATIN SMALL LETTER INSULAR R -A784 ; mapped ; A785 # 5.1 LATIN CAPITAL LETTER INSULAR S -A785 ; valid # 5.1 LATIN SMALL LETTER INSULAR S -A786 ; mapped ; A787 # 5.1 LATIN CAPITAL LETTER INSULAR T -A787..A788 ; valid # 5.1 LATIN SMALL LETTER INSULAR T..MODIFIER LETTER LOW CIRCUMFLEX ACCENT -A789..A78A ; valid ; ; NV8 # 5.1 MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN -A78B ; mapped ; A78C # 5.1 LATIN CAPITAL LETTER SALTILLO -A78C ; valid # 5.1 LATIN SMALL LETTER SALTILLO -A78D ; mapped ; 0265 # 6.0 LATIN CAPITAL LETTER TURNED H -A78E ; valid # 6.0 LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT -A78F ; valid # 8.0 LATIN LETTER SINOLOGICAL DOT -A790 ; mapped ; A791 # 6.0 LATIN CAPITAL LETTER N WITH DESCENDER -A791 ; valid # 6.0 LATIN SMALL LETTER N WITH DESCENDER -A792 ; mapped ; A793 # 6.1 LATIN CAPITAL LETTER C WITH BAR -A793 ; valid # 6.1 LATIN SMALL LETTER C WITH BAR -A794..A795 ; valid # 7.0 LATIN SMALL LETTER C WITH PALATAL HOOK..LATIN SMALL LETTER H WITH PALATAL HOOK -A796 ; mapped ; A797 # 7.0 LATIN CAPITAL LETTER B WITH FLOURISH -A797 ; valid # 7.0 LATIN SMALL LETTER B WITH FLOURISH -A798 ; mapped ; A799 # 7.0 LATIN CAPITAL LETTER F WITH STROKE -A799 ; valid # 7.0 LATIN SMALL LETTER F WITH STROKE -A79A ; mapped ; A79B # 7.0 LATIN CAPITAL LETTER VOLAPUK AE -A79B ; valid # 7.0 LATIN SMALL LETTER VOLAPUK AE -A79C ; mapped ; A79D # 7.0 LATIN CAPITAL LETTER VOLAPUK OE -A79D ; valid # 7.0 LATIN SMALL LETTER VOLAPUK OE -A79E ; mapped ; A79F # 7.0 LATIN CAPITAL LETTER VOLAPUK UE -A79F ; valid # 7.0 LATIN SMALL LETTER VOLAPUK UE -A7A0 ; mapped ; A7A1 # 6.0 LATIN CAPITAL LETTER G WITH OBLIQUE STROKE -A7A1 ; valid # 6.0 LATIN SMALL LETTER G WITH OBLIQUE STROKE -A7A2 ; mapped ; A7A3 # 6.0 LATIN CAPITAL LETTER K WITH OBLIQUE STROKE -A7A3 ; valid # 6.0 LATIN SMALL LETTER K WITH OBLIQUE STROKE -A7A4 ; mapped ; A7A5 # 6.0 LATIN CAPITAL LETTER N WITH OBLIQUE STROKE -A7A5 ; valid # 6.0 LATIN SMALL LETTER N WITH OBLIQUE STROKE -A7A6 ; mapped ; A7A7 # 6.0 LATIN CAPITAL LETTER R WITH OBLIQUE STROKE -A7A7 ; valid # 6.0 LATIN SMALL LETTER R WITH OBLIQUE STROKE -A7A8 ; mapped ; A7A9 # 6.0 LATIN CAPITAL LETTER S WITH OBLIQUE STROKE -A7A9 ; valid # 6.0 LATIN SMALL LETTER S WITH OBLIQUE STROKE -A7AA ; mapped ; 0266 # 6.1 LATIN CAPITAL LETTER H WITH HOOK -A7AB ; mapped ; 025C # 7.0 LATIN CAPITAL LETTER REVERSED OPEN E -A7AC ; mapped ; 0261 # 7.0 LATIN CAPITAL LETTER SCRIPT G -A7AD ; mapped ; 026C # 7.0 LATIN CAPITAL LETTER L WITH BELT -A7AE ; mapped ; 026A # 9.0 LATIN CAPITAL LETTER SMALL CAPITAL I -A7AF ; disallowed # NA -A7B0 ; mapped ; 029E # 7.0 LATIN CAPITAL LETTER TURNED K -A7B1 ; mapped ; 0287 # 7.0 LATIN CAPITAL LETTER TURNED T -A7B2 ; mapped ; 029D # 8.0 LATIN CAPITAL LETTER J WITH CROSSED-TAIL -A7B3 ; mapped ; AB53 # 8.0 LATIN CAPITAL LETTER CHI -A7B4 ; mapped ; A7B5 # 8.0 LATIN CAPITAL LETTER BETA -A7B5 ; valid # 8.0 LATIN SMALL LETTER BETA -A7B6 ; mapped ; A7B7 # 8.0 LATIN CAPITAL LETTER OMEGA -A7B7 ; valid # 8.0 LATIN SMALL LETTER OMEGA -A7B8..A7F6 ; disallowed # NA .. -A7F7 ; valid # 7.0 LATIN EPIGRAPHIC LETTER SIDEWAYS I -A7F8 ; mapped ; 0127 # 6.1 MODIFIER LETTER CAPITAL H WITH STROKE -A7F9 ; mapped ; 0153 # 6.1 MODIFIER LETTER SMALL LIGATURE OE -A7FA ; valid # 6.0 LATIN LETTER SMALL CAPITAL TURNED M -A7FB..A7FF ; valid # 5.1 LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M -A800..A827 ; valid # 4.1 SYLOTI NAGRI LETTER A..SYLOTI NAGRI VOWEL SIGN OO -A828..A82B ; valid ; ; NV8 # 4.1 SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 -A82C..A82F ; disallowed # NA .. -A830..A839 ; valid ; ; NV8 # 5.2 NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC QUANTITY MARK -A83A..A83F ; disallowed # NA .. -A840..A873 ; valid # 5.0 PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU -A874..A877 ; valid ; ; NV8 # 5.0 PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD -A878..A87F ; disallowed # NA .. -A880..A8C4 ; valid # 5.1 SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VIRAMA -A8C5 ; valid # 9.0 SAURASHTRA SIGN CANDRABINDU -A8C6..A8CD ; disallowed # NA .. -A8CE..A8CF ; valid ; ; NV8 # 5.1 SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA -A8D0..A8D9 ; valid # 5.1 SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE -A8DA..A8DF ; disallowed # NA .. -A8E0..A8F7 ; valid # 5.2 COMBINING DEVANAGARI DIGIT ZERO..DEVANAGARI SIGN CANDRABINDU AVAGRAHA -A8F8..A8FA ; valid ; ; NV8 # 5.2 DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET -A8FB ; valid # 5.2 DEVANAGARI HEADSTROKE -A8FC ; valid ; ; NV8 # 8.0 DEVANAGARI SIGN SIDDHAM -A8FD ; valid # 8.0 DEVANAGARI JAIN OM -A8FE..A8FF ; disallowed # NA .. -A900..A92D ; valid # 5.1 KAYAH LI DIGIT ZERO..KAYAH LI TONE CALYA PLOPHU -A92E..A92F ; valid ; ; NV8 # 5.1 KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA -A930..A953 ; valid # 5.1 REJANG LETTER KA..REJANG VIRAMA -A954..A95E ; disallowed # NA .. -A95F ; valid ; ; NV8 # 5.1 REJANG SECTION MARK -A960..A97C ; valid ; ; NV8 # 5.2 HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH -A97D..A97F ; disallowed # NA .. -A980..A9C0 ; valid # 5.2 JAVANESE SIGN PANYANGGA..JAVANESE PANGKON -A9C1..A9CD ; valid ; ; NV8 # 5.2 JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH -A9CE ; disallowed # NA -A9CF..A9D9 ; valid # 5.2 JAVANESE PANGRANGKEP..JAVANESE DIGIT NINE -A9DA..A9DD ; disallowed # NA .. -A9DE..A9DF ; valid ; ; NV8 # 5.2 JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN -A9E0..A9FE ; valid # 7.0 MYANMAR LETTER SHAN GHA..MYANMAR LETTER TAI LAING BHA -A9FF ; disallowed # NA -AA00..AA36 ; valid # 5.1 CHAM LETTER A..CHAM CONSONANT SIGN WA -AA37..AA3F ; disallowed # NA .. -AA40..AA4D ; valid # 5.1 CHAM LETTER FINAL K..CHAM CONSONANT SIGN FINAL H -AA4E..AA4F ; disallowed # NA .. -AA50..AA59 ; valid # 5.1 CHAM DIGIT ZERO..CHAM DIGIT NINE -AA5A..AA5B ; disallowed # NA .. -AA5C..AA5F ; valid ; ; NV8 # 5.1 CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA -AA60..AA76 ; valid # 5.2 MYANMAR LETTER KHAMTI GA..MYANMAR LOGOGRAM KHAMTI HM -AA77..AA79 ; valid ; ; NV8 # 5.2 MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO -AA7A..AA7B ; valid # 5.2 MYANMAR LETTER AITON RA..MYANMAR SIGN PAO KAREN TONE -AA7C..AA7F ; valid # 7.0 MYANMAR SIGN TAI LAING TONE-2..MYANMAR LETTER SHWE PALAUNG SHA -AA80..AAC2 ; valid # 5.2 TAI VIET LETTER LOW KO..TAI VIET TONE MAI SONG -AAC3..AADA ; disallowed # NA .. -AADB..AADD ; valid # 5.2 TAI VIET SYMBOL KON..TAI VIET SYMBOL SAM -AADE..AADF ; valid ; ; NV8 # 5.2 TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI -AAE0..AAEF ; valid # 6.1 MEETEI MAYEK LETTER E..MEETEI MAYEK VOWEL SIGN AAU -AAF0..AAF1 ; valid ; ; NV8 # 6.1 MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM -AAF2..AAF6 ; valid # 6.1 MEETEI MAYEK ANJI..MEETEI MAYEK VIRAMA -AAF7..AB00 ; disallowed # NA .. -AB01..AB06 ; valid # 6.0 ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO -AB07..AB08 ; disallowed # NA .. -AB09..AB0E ; valid # 6.0 ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO -AB0F..AB10 ; disallowed # NA .. -AB11..AB16 ; valid # 6.0 ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO -AB17..AB1F ; disallowed # NA .. -AB20..AB26 ; valid # 6.0 ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO -AB27 ; disallowed # NA -AB28..AB2E ; valid # 6.0 ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO -AB2F ; disallowed # NA -AB30..AB5A ; valid # 7.0 LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG -AB5B ; valid ; ; NV8 # 7.0 MODIFIER BREVE WITH INVERTED BREVE -AB5C ; mapped ; A727 # 7.0 MODIFIER LETTER SMALL HENG -AB5D ; mapped ; AB37 # 7.0 MODIFIER LETTER SMALL L WITH INVERTED LAZY S -AB5E ; mapped ; 026B # 7.0 MODIFIER LETTER SMALL L WITH MIDDLE TILDE -AB5F ; mapped ; AB52 # 7.0 MODIFIER LETTER SMALL U WITH LEFT HOOK -AB60..AB63 ; valid # 8.0 LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER UO -AB64..AB65 ; valid # 7.0 LATIN SMALL LETTER INVERTED ALPHA..GREEK LETTER SMALL CAPITAL OMEGA -AB66..AB6F ; disallowed # NA .. -AB70 ; mapped ; 13A0 # 8.0 CHEROKEE SMALL LETTER A -AB71 ; mapped ; 13A1 # 8.0 CHEROKEE SMALL LETTER E -AB72 ; mapped ; 13A2 # 8.0 CHEROKEE SMALL LETTER I -AB73 ; mapped ; 13A3 # 8.0 CHEROKEE SMALL LETTER O -AB74 ; mapped ; 13A4 # 8.0 CHEROKEE SMALL LETTER U -AB75 ; mapped ; 13A5 # 8.0 CHEROKEE SMALL LETTER V -AB76 ; mapped ; 13A6 # 8.0 CHEROKEE SMALL LETTER GA -AB77 ; mapped ; 13A7 # 8.0 CHEROKEE SMALL LETTER KA -AB78 ; mapped ; 13A8 # 8.0 CHEROKEE SMALL LETTER GE -AB79 ; mapped ; 13A9 # 8.0 CHEROKEE SMALL LETTER GI -AB7A ; mapped ; 13AA # 8.0 CHEROKEE SMALL LETTER GO -AB7B ; mapped ; 13AB # 8.0 CHEROKEE SMALL LETTER GU -AB7C ; mapped ; 13AC # 8.0 CHEROKEE SMALL LETTER GV -AB7D ; mapped ; 13AD # 8.0 CHEROKEE SMALL LETTER HA -AB7E ; mapped ; 13AE # 8.0 CHEROKEE SMALL LETTER HE -AB7F ; mapped ; 13AF # 8.0 CHEROKEE SMALL LETTER HI -AB80 ; mapped ; 13B0 # 8.0 CHEROKEE SMALL LETTER HO -AB81 ; mapped ; 13B1 # 8.0 CHEROKEE SMALL LETTER HU -AB82 ; mapped ; 13B2 # 8.0 CHEROKEE SMALL LETTER HV -AB83 ; mapped ; 13B3 # 8.0 CHEROKEE SMALL LETTER LA -AB84 ; mapped ; 13B4 # 8.0 CHEROKEE SMALL LETTER LE -AB85 ; mapped ; 13B5 # 8.0 CHEROKEE SMALL LETTER LI -AB86 ; mapped ; 13B6 # 8.0 CHEROKEE SMALL LETTER LO -AB87 ; mapped ; 13B7 # 8.0 CHEROKEE SMALL LETTER LU -AB88 ; mapped ; 13B8 # 8.0 CHEROKEE SMALL LETTER LV -AB89 ; mapped ; 13B9 # 8.0 CHEROKEE SMALL LETTER MA -AB8A ; mapped ; 13BA # 8.0 CHEROKEE SMALL LETTER ME -AB8B ; mapped ; 13BB # 8.0 CHEROKEE SMALL LETTER MI -AB8C ; mapped ; 13BC # 8.0 CHEROKEE SMALL LETTER MO -AB8D ; mapped ; 13BD # 8.0 CHEROKEE SMALL LETTER MU -AB8E ; mapped ; 13BE # 8.0 CHEROKEE SMALL LETTER NA -AB8F ; mapped ; 13BF # 8.0 CHEROKEE SMALL LETTER HNA -AB90 ; mapped ; 13C0 # 8.0 CHEROKEE SMALL LETTER NAH -AB91 ; mapped ; 13C1 # 8.0 CHEROKEE SMALL LETTER NE -AB92 ; mapped ; 13C2 # 8.0 CHEROKEE SMALL LETTER NI -AB93 ; mapped ; 13C3 # 8.0 CHEROKEE SMALL LETTER NO -AB94 ; mapped ; 13C4 # 8.0 CHEROKEE SMALL LETTER NU -AB95 ; mapped ; 13C5 # 8.0 CHEROKEE SMALL LETTER NV -AB96 ; mapped ; 13C6 # 8.0 CHEROKEE SMALL LETTER QUA -AB97 ; mapped ; 13C7 # 8.0 CHEROKEE SMALL LETTER QUE -AB98 ; mapped ; 13C8 # 8.0 CHEROKEE SMALL LETTER QUI -AB99 ; mapped ; 13C9 # 8.0 CHEROKEE SMALL LETTER QUO -AB9A ; mapped ; 13CA # 8.0 CHEROKEE SMALL LETTER QUU -AB9B ; mapped ; 13CB # 8.0 CHEROKEE SMALL LETTER QUV -AB9C ; mapped ; 13CC # 8.0 CHEROKEE SMALL LETTER SA -AB9D ; mapped ; 13CD # 8.0 CHEROKEE SMALL LETTER S -AB9E ; mapped ; 13CE # 8.0 CHEROKEE SMALL LETTER SE -AB9F ; mapped ; 13CF # 8.0 CHEROKEE SMALL LETTER SI -ABA0 ; mapped ; 13D0 # 8.0 CHEROKEE SMALL LETTER SO -ABA1 ; mapped ; 13D1 # 8.0 CHEROKEE SMALL LETTER SU -ABA2 ; mapped ; 13D2 # 8.0 CHEROKEE SMALL LETTER SV -ABA3 ; mapped ; 13D3 # 8.0 CHEROKEE SMALL LETTER DA -ABA4 ; mapped ; 13D4 # 8.0 CHEROKEE SMALL LETTER TA -ABA5 ; mapped ; 13D5 # 8.0 CHEROKEE SMALL LETTER DE -ABA6 ; mapped ; 13D6 # 8.0 CHEROKEE SMALL LETTER TE -ABA7 ; mapped ; 13D7 # 8.0 CHEROKEE SMALL LETTER DI -ABA8 ; mapped ; 13D8 # 8.0 CHEROKEE SMALL LETTER TI -ABA9 ; mapped ; 13D9 # 8.0 CHEROKEE SMALL LETTER DO -ABAA ; mapped ; 13DA # 8.0 CHEROKEE SMALL LETTER DU -ABAB ; mapped ; 13DB # 8.0 CHEROKEE SMALL LETTER DV -ABAC ; mapped ; 13DC # 8.0 CHEROKEE SMALL LETTER DLA -ABAD ; mapped ; 13DD # 8.0 CHEROKEE SMALL LETTER TLA -ABAE ; mapped ; 13DE # 8.0 CHEROKEE SMALL LETTER TLE -ABAF ; mapped ; 13DF # 8.0 CHEROKEE SMALL LETTER TLI -ABB0 ; mapped ; 13E0 # 8.0 CHEROKEE SMALL LETTER TLO -ABB1 ; mapped ; 13E1 # 8.0 CHEROKEE SMALL LETTER TLU -ABB2 ; mapped ; 13E2 # 8.0 CHEROKEE SMALL LETTER TLV -ABB3 ; mapped ; 13E3 # 8.0 CHEROKEE SMALL LETTER TSA -ABB4 ; mapped ; 13E4 # 8.0 CHEROKEE SMALL LETTER TSE -ABB5 ; mapped ; 13E5 # 8.0 CHEROKEE SMALL LETTER TSI -ABB6 ; mapped ; 13E6 # 8.0 CHEROKEE SMALL LETTER TSO -ABB7 ; mapped ; 13E7 # 8.0 CHEROKEE SMALL LETTER TSU -ABB8 ; mapped ; 13E8 # 8.0 CHEROKEE SMALL LETTER TSV -ABB9 ; mapped ; 13E9 # 8.0 CHEROKEE SMALL LETTER WA -ABBA ; mapped ; 13EA # 8.0 CHEROKEE SMALL LETTER WE -ABBB ; mapped ; 13EB # 8.0 CHEROKEE SMALL LETTER WI -ABBC ; mapped ; 13EC # 8.0 CHEROKEE SMALL LETTER WO -ABBD ; mapped ; 13ED # 8.0 CHEROKEE SMALL LETTER WU -ABBE ; mapped ; 13EE # 8.0 CHEROKEE SMALL LETTER WV -ABBF ; mapped ; 13EF # 8.0 CHEROKEE SMALL LETTER YA -ABC0..ABEA ; valid # 5.2 MEETEI MAYEK LETTER KOK..MEETEI MAYEK VOWEL SIGN NUNG -ABEB ; valid ; ; NV8 # 5.2 MEETEI MAYEK CHEIKHEI -ABEC..ABED ; valid # 5.2 MEETEI MAYEK LUM IYEK..MEETEI MAYEK APUN IYEK -ABEE..ABEF ; disallowed # NA .. -ABF0..ABF9 ; valid # 5.2 MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE -ABFA..ABFF ; disallowed # NA .. -AC00..D7A3 ; valid # 2.0 HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -D7A4..D7AF ; disallowed # NA .. -D7B0..D7C6 ; valid ; ; NV8 # 5.2 HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E -D7C7..D7CA ; disallowed # NA .. -D7CB..D7FB ; valid ; ; NV8 # 5.2 HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH -D7FC..D7FF ; disallowed # NA .. -D800..DFFF ; disallowed # 2.0 .. -E000..F8FF ; disallowed # 1.1 .. -F900 ; mapped ; 8C48 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F900 -F901 ; mapped ; 66F4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F901 -F902 ; mapped ; 8ECA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F902 -F903 ; mapped ; 8CC8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F903 -F904 ; mapped ; 6ED1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F904 -F905 ; mapped ; 4E32 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F905 -F906 ; mapped ; 53E5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F906 -F907..F908 ; mapped ; 9F9C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F907..CJK COMPATIBILITY IDEOGRAPH-F908 -F909 ; mapped ; 5951 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F909 -F90A ; mapped ; 91D1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90A -F90B ; mapped ; 5587 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90B -F90C ; mapped ; 5948 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90C -F90D ; mapped ; 61F6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90D -F90E ; mapped ; 7669 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90E -F90F ; mapped ; 7F85 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90F -F910 ; mapped ; 863F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F910 -F911 ; mapped ; 87BA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F911 -F912 ; mapped ; 88F8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F912 -F913 ; mapped ; 908F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F913 -F914 ; mapped ; 6A02 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F914 -F915 ; mapped ; 6D1B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F915 -F916 ; mapped ; 70D9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F916 -F917 ; mapped ; 73DE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F917 -F918 ; mapped ; 843D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F918 -F919 ; mapped ; 916A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F919 -F91A ; mapped ; 99F1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91A -F91B ; mapped ; 4E82 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91B -F91C ; mapped ; 5375 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91C -F91D ; mapped ; 6B04 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91D -F91E ; mapped ; 721B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91E -F91F ; mapped ; 862D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91F -F920 ; mapped ; 9E1E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F920 -F921 ; mapped ; 5D50 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F921 -F922 ; mapped ; 6FEB # 1.1 CJK COMPATIBILITY IDEOGRAPH-F922 -F923 ; mapped ; 85CD # 1.1 CJK COMPATIBILITY IDEOGRAPH-F923 -F924 ; mapped ; 8964 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F924 -F925 ; mapped ; 62C9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F925 -F926 ; mapped ; 81D8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F926 -F927 ; mapped ; 881F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F927 -F928 ; mapped ; 5ECA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F928 -F929 ; mapped ; 6717 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F929 -F92A ; mapped ; 6D6A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92A -F92B ; mapped ; 72FC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92B -F92C ; mapped ; 90CE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92C -F92D ; mapped ; 4F86 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92D -F92E ; mapped ; 51B7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92E -F92F ; mapped ; 52DE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92F -F930 ; mapped ; 64C4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F930 -F931 ; mapped ; 6AD3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F931 -F932 ; mapped ; 7210 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F932 -F933 ; mapped ; 76E7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F933 -F934 ; mapped ; 8001 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F934 -F935 ; mapped ; 8606 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F935 -F936 ; mapped ; 865C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F936 -F937 ; mapped ; 8DEF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F937 -F938 ; mapped ; 9732 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F938 -F939 ; mapped ; 9B6F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F939 -F93A ; mapped ; 9DFA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93A -F93B ; mapped ; 788C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93B -F93C ; mapped ; 797F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93C -F93D ; mapped ; 7DA0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93D -F93E ; mapped ; 83C9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93E -F93F ; mapped ; 9304 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93F -F940 ; mapped ; 9E7F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F940 -F941 ; mapped ; 8AD6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F941 -F942 ; mapped ; 58DF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F942 -F943 ; mapped ; 5F04 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F943 -F944 ; mapped ; 7C60 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F944 -F945 ; mapped ; 807E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F945 -F946 ; mapped ; 7262 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F946 -F947 ; mapped ; 78CA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F947 -F948 ; mapped ; 8CC2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F948 -F949 ; mapped ; 96F7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F949 -F94A ; mapped ; 58D8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94A -F94B ; mapped ; 5C62 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94B -F94C ; mapped ; 6A13 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94C -F94D ; mapped ; 6DDA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94D -F94E ; mapped ; 6F0F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94E -F94F ; mapped ; 7D2F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94F -F950 ; mapped ; 7E37 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F950 -F951 ; mapped ; 964B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F951 -F952 ; mapped ; 52D2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F952 -F953 ; mapped ; 808B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F953 -F954 ; mapped ; 51DC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F954 -F955 ; mapped ; 51CC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F955 -F956 ; mapped ; 7A1C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F956 -F957 ; mapped ; 7DBE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F957 -F958 ; mapped ; 83F1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F958 -F959 ; mapped ; 9675 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F959 -F95A ; mapped ; 8B80 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95A -F95B ; mapped ; 62CF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95B -F95C ; mapped ; 6A02 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95C -F95D ; mapped ; 8AFE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95D -F95E ; mapped ; 4E39 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95E -F95F ; mapped ; 5BE7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95F -F960 ; mapped ; 6012 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F960 -F961 ; mapped ; 7387 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F961 -F962 ; mapped ; 7570 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F962 -F963 ; mapped ; 5317 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F963 -F964 ; mapped ; 78FB # 1.1 CJK COMPATIBILITY IDEOGRAPH-F964 -F965 ; mapped ; 4FBF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F965 -F966 ; mapped ; 5FA9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F966 -F967 ; mapped ; 4E0D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F967 -F968 ; mapped ; 6CCC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F968 -F969 ; mapped ; 6578 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F969 -F96A ; mapped ; 7D22 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96A -F96B ; mapped ; 53C3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96B -F96C ; mapped ; 585E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96C -F96D ; mapped ; 7701 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96D -F96E ; mapped ; 8449 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96E -F96F ; mapped ; 8AAA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96F -F970 ; mapped ; 6BBA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F970 -F971 ; mapped ; 8FB0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F971 -F972 ; mapped ; 6C88 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F972 -F973 ; mapped ; 62FE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F973 -F974 ; mapped ; 82E5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F974 -F975 ; mapped ; 63A0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F975 -F976 ; mapped ; 7565 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F976 -F977 ; mapped ; 4EAE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F977 -F978 ; mapped ; 5169 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F978 -F979 ; mapped ; 51C9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F979 -F97A ; mapped ; 6881 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97A -F97B ; mapped ; 7CE7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97B -F97C ; mapped ; 826F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97C -F97D ; mapped ; 8AD2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97D -F97E ; mapped ; 91CF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97E -F97F ; mapped ; 52F5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97F -F980 ; mapped ; 5442 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F980 -F981 ; mapped ; 5973 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F981 -F982 ; mapped ; 5EEC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F982 -F983 ; mapped ; 65C5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F983 -F984 ; mapped ; 6FFE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F984 -F985 ; mapped ; 792A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F985 -F986 ; mapped ; 95AD # 1.1 CJK COMPATIBILITY IDEOGRAPH-F986 -F987 ; mapped ; 9A6A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F987 -F988 ; mapped ; 9E97 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F988 -F989 ; mapped ; 9ECE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F989 -F98A ; mapped ; 529B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98A -F98B ; mapped ; 66C6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98B -F98C ; mapped ; 6B77 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98C -F98D ; mapped ; 8F62 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98D -F98E ; mapped ; 5E74 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98E -F98F ; mapped ; 6190 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98F -F990 ; mapped ; 6200 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F990 -F991 ; mapped ; 649A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F991 -F992 ; mapped ; 6F23 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F992 -F993 ; mapped ; 7149 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F993 -F994 ; mapped ; 7489 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F994 -F995 ; mapped ; 79CA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F995 -F996 ; mapped ; 7DF4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F996 -F997 ; mapped ; 806F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F997 -F998 ; mapped ; 8F26 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F998 -F999 ; mapped ; 84EE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F999 -F99A ; mapped ; 9023 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99A -F99B ; mapped ; 934A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99B -F99C ; mapped ; 5217 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99C -F99D ; mapped ; 52A3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99D -F99E ; mapped ; 54BD # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99E -F99F ; mapped ; 70C8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99F -F9A0 ; mapped ; 88C2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A0 -F9A1 ; mapped ; 8AAA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A1 -F9A2 ; mapped ; 5EC9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A2 -F9A3 ; mapped ; 5FF5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A3 -F9A4 ; mapped ; 637B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A4 -F9A5 ; mapped ; 6BAE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A5 -F9A6 ; mapped ; 7C3E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A6 -F9A7 ; mapped ; 7375 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A7 -F9A8 ; mapped ; 4EE4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A8 -F9A9 ; mapped ; 56F9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A9 -F9AA ; mapped ; 5BE7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AA -F9AB ; mapped ; 5DBA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AB -F9AC ; mapped ; 601C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AC -F9AD ; mapped ; 73B2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AD -F9AE ; mapped ; 7469 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AE -F9AF ; mapped ; 7F9A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AF -F9B0 ; mapped ; 8046 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B0 -F9B1 ; mapped ; 9234 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B1 -F9B2 ; mapped ; 96F6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B2 -F9B3 ; mapped ; 9748 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B3 -F9B4 ; mapped ; 9818 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B4 -F9B5 ; mapped ; 4F8B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B5 -F9B6 ; mapped ; 79AE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B6 -F9B7 ; mapped ; 91B4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B7 -F9B8 ; mapped ; 96B8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B8 -F9B9 ; mapped ; 60E1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B9 -F9BA ; mapped ; 4E86 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BA -F9BB ; mapped ; 50DA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BB -F9BC ; mapped ; 5BEE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BC -F9BD ; mapped ; 5C3F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BD -F9BE ; mapped ; 6599 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BE -F9BF ; mapped ; 6A02 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BF -F9C0 ; mapped ; 71CE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C0 -F9C1 ; mapped ; 7642 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C1 -F9C2 ; mapped ; 84FC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C2 -F9C3 ; mapped ; 907C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C3 -F9C4 ; mapped ; 9F8D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C4 -F9C5 ; mapped ; 6688 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C5 -F9C6 ; mapped ; 962E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C6 -F9C7 ; mapped ; 5289 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C7 -F9C8 ; mapped ; 677B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C8 -F9C9 ; mapped ; 67F3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C9 -F9CA ; mapped ; 6D41 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CA -F9CB ; mapped ; 6E9C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CB -F9CC ; mapped ; 7409 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CC -F9CD ; mapped ; 7559 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CD -F9CE ; mapped ; 786B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CE -F9CF ; mapped ; 7D10 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CF -F9D0 ; mapped ; 985E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D0 -F9D1 ; mapped ; 516D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D1 -F9D2 ; mapped ; 622E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D2 -F9D3 ; mapped ; 9678 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D3 -F9D4 ; mapped ; 502B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D4 -F9D5 ; mapped ; 5D19 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D5 -F9D6 ; mapped ; 6DEA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D6 -F9D7 ; mapped ; 8F2A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D7 -F9D8 ; mapped ; 5F8B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D8 -F9D9 ; mapped ; 6144 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D9 -F9DA ; mapped ; 6817 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DA -F9DB ; mapped ; 7387 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DB -F9DC ; mapped ; 9686 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DC -F9DD ; mapped ; 5229 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DD -F9DE ; mapped ; 540F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DE -F9DF ; mapped ; 5C65 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DF -F9E0 ; mapped ; 6613 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E0 -F9E1 ; mapped ; 674E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E1 -F9E2 ; mapped ; 68A8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E2 -F9E3 ; mapped ; 6CE5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E3 -F9E4 ; mapped ; 7406 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E4 -F9E5 ; mapped ; 75E2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E5 -F9E6 ; mapped ; 7F79 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E6 -F9E7 ; mapped ; 88CF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E7 -F9E8 ; mapped ; 88E1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E8 -F9E9 ; mapped ; 91CC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E9 -F9EA ; mapped ; 96E2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EA -F9EB ; mapped ; 533F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EB -F9EC ; mapped ; 6EBA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EC -F9ED ; mapped ; 541D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9ED -F9EE ; mapped ; 71D0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EE -F9EF ; mapped ; 7498 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EF -F9F0 ; mapped ; 85FA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F0 -F9F1 ; mapped ; 96A3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F1 -F9F2 ; mapped ; 9C57 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F2 -F9F3 ; mapped ; 9E9F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F3 -F9F4 ; mapped ; 6797 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F4 -F9F5 ; mapped ; 6DCB # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F5 -F9F6 ; mapped ; 81E8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F6 -F9F7 ; mapped ; 7ACB # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F7 -F9F8 ; mapped ; 7B20 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F8 -F9F9 ; mapped ; 7C92 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F9 -F9FA ; mapped ; 72C0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FA -F9FB ; mapped ; 7099 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FB -F9FC ; mapped ; 8B58 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FC -F9FD ; mapped ; 4EC0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FD -F9FE ; mapped ; 8336 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FE -F9FF ; mapped ; 523A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FF -FA00 ; mapped ; 5207 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA00 -FA01 ; mapped ; 5EA6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA01 -FA02 ; mapped ; 62D3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA02 -FA03 ; mapped ; 7CD6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA03 -FA04 ; mapped ; 5B85 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA04 -FA05 ; mapped ; 6D1E # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA05 -FA06 ; mapped ; 66B4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA06 -FA07 ; mapped ; 8F3B # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA07 -FA08 ; mapped ; 884C # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA08 -FA09 ; mapped ; 964D # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA09 -FA0A ; mapped ; 898B # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0A -FA0B ; mapped ; 5ED3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0B -FA0C ; mapped ; 5140 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0C -FA0D ; mapped ; 55C0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0D -FA0E..FA0F ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F -FA10 ; mapped ; 585A # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA10 -FA11 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA11 -FA12 ; mapped ; 6674 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA12 -FA13..FA14 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14 -FA15 ; mapped ; 51DE # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA15 -FA16 ; mapped ; 732A # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA16 -FA17 ; mapped ; 76CA # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA17 -FA18 ; mapped ; 793C # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA18 -FA19 ; mapped ; 795E # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA19 -FA1A ; mapped ; 7965 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1A -FA1B ; mapped ; 798F # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1B -FA1C ; mapped ; 9756 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1C -FA1D ; mapped ; 7CBE # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1D -FA1E ; mapped ; 7FBD # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1E -FA1F ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1F -FA20 ; mapped ; 8612 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA20 -FA21 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA21 -FA22 ; mapped ; 8AF8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA22 -FA23..FA24 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24 -FA25 ; mapped ; 9038 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA25 -FA26 ; mapped ; 90FD # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA26 -FA27..FA29 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29 -FA2A ; mapped ; 98EF # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA2A -FA2B ; mapped ; 98FC # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA2B -FA2C ; mapped ; 9928 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA2C -FA2D ; mapped ; 9DB4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA2D -FA2E ; mapped ; 90DE # 6.1 CJK COMPATIBILITY IDEOGRAPH-FA2E -FA2F ; mapped ; 96B7 # 6.1 CJK COMPATIBILITY IDEOGRAPH-FA2F -FA30 ; mapped ; 4FAE # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA30 -FA31 ; mapped ; 50E7 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA31 -FA32 ; mapped ; 514D # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA32 -FA33 ; mapped ; 52C9 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA33 -FA34 ; mapped ; 52E4 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA34 -FA35 ; mapped ; 5351 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA35 -FA36 ; mapped ; 559D # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA36 -FA37 ; mapped ; 5606 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA37 -FA38 ; mapped ; 5668 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA38 -FA39 ; mapped ; 5840 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA39 -FA3A ; mapped ; 58A8 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3A -FA3B ; mapped ; 5C64 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3B -FA3C ; mapped ; 5C6E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3C -FA3D ; mapped ; 6094 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3D -FA3E ; mapped ; 6168 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3E -FA3F ; mapped ; 618E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3F -FA40 ; mapped ; 61F2 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA40 -FA41 ; mapped ; 654F # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA41 -FA42 ; mapped ; 65E2 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA42 -FA43 ; mapped ; 6691 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA43 -FA44 ; mapped ; 6885 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA44 -FA45 ; mapped ; 6D77 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA45 -FA46 ; mapped ; 6E1A # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA46 -FA47 ; mapped ; 6F22 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA47 -FA48 ; mapped ; 716E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA48 -FA49 ; mapped ; 722B # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA49 -FA4A ; mapped ; 7422 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4A -FA4B ; mapped ; 7891 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4B -FA4C ; mapped ; 793E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4C -FA4D ; mapped ; 7949 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4D -FA4E ; mapped ; 7948 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4E -FA4F ; mapped ; 7950 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4F -FA50 ; mapped ; 7956 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA50 -FA51 ; mapped ; 795D # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA51 -FA52 ; mapped ; 798D # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA52 -FA53 ; mapped ; 798E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA53 -FA54 ; mapped ; 7A40 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA54 -FA55 ; mapped ; 7A81 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA55 -FA56 ; mapped ; 7BC0 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA56 -FA57 ; mapped ; 7DF4 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA57 -FA58 ; mapped ; 7E09 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA58 -FA59 ; mapped ; 7E41 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA59 -FA5A ; mapped ; 7F72 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5A -FA5B ; mapped ; 8005 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5B -FA5C ; mapped ; 81ED # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5C -FA5D..FA5E ; mapped ; 8279 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5D..CJK COMPATIBILITY IDEOGRAPH-FA5E -FA5F ; mapped ; 8457 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5F -FA60 ; mapped ; 8910 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA60 -FA61 ; mapped ; 8996 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA61 -FA62 ; mapped ; 8B01 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA62 -FA63 ; mapped ; 8B39 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA63 -FA64 ; mapped ; 8CD3 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA64 -FA65 ; mapped ; 8D08 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA65 -FA66 ; mapped ; 8FB6 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA66 -FA67 ; mapped ; 9038 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA67 -FA68 ; mapped ; 96E3 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA68 -FA69 ; mapped ; 97FF # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA69 -FA6A ; mapped ; 983B # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA6A -FA6B ; mapped ; 6075 # 5.2 CJK COMPATIBILITY IDEOGRAPH-FA6B -FA6C ; mapped ; 242EE # 5.2 CJK COMPATIBILITY IDEOGRAPH-FA6C -FA6D ; mapped ; 8218 # 5.2 CJK COMPATIBILITY IDEOGRAPH-FA6D -FA6E..FA6F ; disallowed # NA .. -FA70 ; mapped ; 4E26 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA70 -FA71 ; mapped ; 51B5 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA71 -FA72 ; mapped ; 5168 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA72 -FA73 ; mapped ; 4F80 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA73 -FA74 ; mapped ; 5145 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA74 -FA75 ; mapped ; 5180 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA75 -FA76 ; mapped ; 52C7 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA76 -FA77 ; mapped ; 52FA # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA77 -FA78 ; mapped ; 559D # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA78 -FA79 ; mapped ; 5555 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA79 -FA7A ; mapped ; 5599 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7A -FA7B ; mapped ; 55E2 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7B -FA7C ; mapped ; 585A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7C -FA7D ; mapped ; 58B3 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7D -FA7E ; mapped ; 5944 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7E -FA7F ; mapped ; 5954 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7F -FA80 ; mapped ; 5A62 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA80 -FA81 ; mapped ; 5B28 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA81 -FA82 ; mapped ; 5ED2 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA82 -FA83 ; mapped ; 5ED9 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA83 -FA84 ; mapped ; 5F69 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA84 -FA85 ; mapped ; 5FAD # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA85 -FA86 ; mapped ; 60D8 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA86 -FA87 ; mapped ; 614E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA87 -FA88 ; mapped ; 6108 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA88 -FA89 ; mapped ; 618E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA89 -FA8A ; mapped ; 6160 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8A -FA8B ; mapped ; 61F2 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8B -FA8C ; mapped ; 6234 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8C -FA8D ; mapped ; 63C4 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8D -FA8E ; mapped ; 641C # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8E -FA8F ; mapped ; 6452 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8F -FA90 ; mapped ; 6556 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA90 -FA91 ; mapped ; 6674 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA91 -FA92 ; mapped ; 6717 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA92 -FA93 ; mapped ; 671B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA93 -FA94 ; mapped ; 6756 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA94 -FA95 ; mapped ; 6B79 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA95 -FA96 ; mapped ; 6BBA # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA96 -FA97 ; mapped ; 6D41 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA97 -FA98 ; mapped ; 6EDB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA98 -FA99 ; mapped ; 6ECB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA99 -FA9A ; mapped ; 6F22 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9A -FA9B ; mapped ; 701E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9B -FA9C ; mapped ; 716E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9C -FA9D ; mapped ; 77A7 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9D -FA9E ; mapped ; 7235 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9E -FA9F ; mapped ; 72AF # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9F -FAA0 ; mapped ; 732A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA0 -FAA1 ; mapped ; 7471 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA1 -FAA2 ; mapped ; 7506 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA2 -FAA3 ; mapped ; 753B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA3 -FAA4 ; mapped ; 761D # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA4 -FAA5 ; mapped ; 761F # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA5 -FAA6 ; mapped ; 76CA # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA6 -FAA7 ; mapped ; 76DB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA7 -FAA8 ; mapped ; 76F4 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA8 -FAA9 ; mapped ; 774A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA9 -FAAA ; mapped ; 7740 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAA -FAAB ; mapped ; 78CC # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAB -FAAC ; mapped ; 7AB1 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAC -FAAD ; mapped ; 7BC0 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAD -FAAE ; mapped ; 7C7B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAE -FAAF ; mapped ; 7D5B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAF -FAB0 ; mapped ; 7DF4 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB0 -FAB1 ; mapped ; 7F3E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB1 -FAB2 ; mapped ; 8005 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB2 -FAB3 ; mapped ; 8352 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB3 -FAB4 ; mapped ; 83EF # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB4 -FAB5 ; mapped ; 8779 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB5 -FAB6 ; mapped ; 8941 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB6 -FAB7 ; mapped ; 8986 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB7 -FAB8 ; mapped ; 8996 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB8 -FAB9 ; mapped ; 8ABF # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB9 -FABA ; mapped ; 8AF8 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABA -FABB ; mapped ; 8ACB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABB -FABC ; mapped ; 8B01 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABC -FABD ; mapped ; 8AFE # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABD -FABE ; mapped ; 8AED # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABE -FABF ; mapped ; 8B39 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABF -FAC0 ; mapped ; 8B8A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC0 -FAC1 ; mapped ; 8D08 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC1 -FAC2 ; mapped ; 8F38 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC2 -FAC3 ; mapped ; 9072 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC3 -FAC4 ; mapped ; 9199 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC4 -FAC5 ; mapped ; 9276 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC5 -FAC6 ; mapped ; 967C # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC6 -FAC7 ; mapped ; 96E3 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC7 -FAC8 ; mapped ; 9756 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC8 -FAC9 ; mapped ; 97DB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC9 -FACA ; mapped ; 97FF # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACA -FACB ; mapped ; 980B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACB -FACC ; mapped ; 983B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACC -FACD ; mapped ; 9B12 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACD -FACE ; mapped ; 9F9C # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACE -FACF ; mapped ; 2284A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACF -FAD0 ; mapped ; 22844 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD0 -FAD1 ; mapped ; 233D5 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD1 -FAD2 ; mapped ; 3B9D # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD2 -FAD3 ; mapped ; 4018 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD3 -FAD4 ; mapped ; 4039 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD4 -FAD5 ; mapped ; 25249 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD5 -FAD6 ; mapped ; 25CD0 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD6 -FAD7 ; mapped ; 27ED3 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD7 -FAD8 ; mapped ; 9F43 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD8 -FAD9 ; mapped ; 9F8E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD9 -FADA..FAFF ; disallowed # NA .. -FB00 ; mapped ; 0066 0066 # 1.1 LATIN SMALL LIGATURE FF -FB01 ; mapped ; 0066 0069 # 1.1 LATIN SMALL LIGATURE FI -FB02 ; mapped ; 0066 006C # 1.1 LATIN SMALL LIGATURE FL -FB03 ; mapped ; 0066 0066 0069 #1.1 LATIN SMALL LIGATURE FFI -FB04 ; mapped ; 0066 0066 006C #1.1 LATIN SMALL LIGATURE FFL -FB05..FB06 ; mapped ; 0073 0074 # 1.1 LATIN SMALL LIGATURE LONG S T..LATIN SMALL LIGATURE ST -FB07..FB12 ; disallowed # NA .. -FB13 ; mapped ; 0574 0576 # 1.1 ARMENIAN SMALL LIGATURE MEN NOW -FB14 ; mapped ; 0574 0565 # 1.1 ARMENIAN SMALL LIGATURE MEN ECH -FB15 ; mapped ; 0574 056B # 1.1 ARMENIAN SMALL LIGATURE MEN INI -FB16 ; mapped ; 057E 0576 # 1.1 ARMENIAN SMALL LIGATURE VEW NOW -FB17 ; mapped ; 0574 056D # 1.1 ARMENIAN SMALL LIGATURE MEN XEH -FB18..FB1C ; disallowed # NA .. -FB1D ; mapped ; 05D9 05B4 # 3.0 HEBREW LETTER YOD WITH HIRIQ -FB1E ; valid # 1.1 HEBREW POINT JUDEO-SPANISH VARIKA -FB1F ; mapped ; 05F2 05B7 # 1.1 HEBREW LIGATURE YIDDISH YOD YOD PATAH -FB20 ; mapped ; 05E2 # 1.1 HEBREW LETTER ALTERNATIVE AYIN -FB21 ; mapped ; 05D0 # 1.1 HEBREW LETTER WIDE ALEF -FB22 ; mapped ; 05D3 # 1.1 HEBREW LETTER WIDE DALET -FB23 ; mapped ; 05D4 # 1.1 HEBREW LETTER WIDE HE -FB24 ; mapped ; 05DB # 1.1 HEBREW LETTER WIDE KAF -FB25 ; mapped ; 05DC # 1.1 HEBREW LETTER WIDE LAMED -FB26 ; mapped ; 05DD # 1.1 HEBREW LETTER WIDE FINAL MEM -FB27 ; mapped ; 05E8 # 1.1 HEBREW LETTER WIDE RESH -FB28 ; mapped ; 05EA # 1.1 HEBREW LETTER WIDE TAV -FB29 ; disallowed_STD3_mapped ; 002B # 1.1 HEBREW LETTER ALTERNATIVE PLUS SIGN -FB2A ; mapped ; 05E9 05C1 # 1.1 HEBREW LETTER SHIN WITH SHIN DOT -FB2B ; mapped ; 05E9 05C2 # 1.1 HEBREW LETTER SHIN WITH SIN DOT -FB2C ; mapped ; 05E9 05BC 05C1 #1.1 HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT -FB2D ; mapped ; 05E9 05BC 05C2 #1.1 HEBREW LETTER SHIN WITH DAGESH AND SIN DOT -FB2E ; mapped ; 05D0 05B7 # 1.1 HEBREW LETTER ALEF WITH PATAH -FB2F ; mapped ; 05D0 05B8 # 1.1 HEBREW LETTER ALEF WITH QAMATS -FB30 ; mapped ; 05D0 05BC # 1.1 HEBREW LETTER ALEF WITH MAPIQ -FB31 ; mapped ; 05D1 05BC # 1.1 HEBREW LETTER BET WITH DAGESH -FB32 ; mapped ; 05D2 05BC # 1.1 HEBREW LETTER GIMEL WITH DAGESH -FB33 ; mapped ; 05D3 05BC # 1.1 HEBREW LETTER DALET WITH DAGESH -FB34 ; mapped ; 05D4 05BC # 1.1 HEBREW LETTER HE WITH MAPIQ -FB35 ; mapped ; 05D5 05BC # 1.1 HEBREW LETTER VAV WITH DAGESH -FB36 ; mapped ; 05D6 05BC # 1.1 HEBREW LETTER ZAYIN WITH DAGESH -FB37 ; disallowed # NA -FB38 ; mapped ; 05D8 05BC # 1.1 HEBREW LETTER TET WITH DAGESH -FB39 ; mapped ; 05D9 05BC # 1.1 HEBREW LETTER YOD WITH DAGESH -FB3A ; mapped ; 05DA 05BC # 1.1 HEBREW LETTER FINAL KAF WITH DAGESH -FB3B ; mapped ; 05DB 05BC # 1.1 HEBREW LETTER KAF WITH DAGESH -FB3C ; mapped ; 05DC 05BC # 1.1 HEBREW LETTER LAMED WITH DAGESH -FB3D ; disallowed # NA -FB3E ; mapped ; 05DE 05BC # 1.1 HEBREW LETTER MEM WITH DAGESH -FB3F ; disallowed # NA -FB40 ; mapped ; 05E0 05BC # 1.1 HEBREW LETTER NUN WITH DAGESH -FB41 ; mapped ; 05E1 05BC # 1.1 HEBREW LETTER SAMEKH WITH DAGESH -FB42 ; disallowed # NA -FB43 ; mapped ; 05E3 05BC # 1.1 HEBREW LETTER FINAL PE WITH DAGESH -FB44 ; mapped ; 05E4 05BC # 1.1 HEBREW LETTER PE WITH DAGESH -FB45 ; disallowed # NA -FB46 ; mapped ; 05E6 05BC # 1.1 HEBREW LETTER TSADI WITH DAGESH -FB47 ; mapped ; 05E7 05BC # 1.1 HEBREW LETTER QOF WITH DAGESH -FB48 ; mapped ; 05E8 05BC # 1.1 HEBREW LETTER RESH WITH DAGESH -FB49 ; mapped ; 05E9 05BC # 1.1 HEBREW LETTER SHIN WITH DAGESH -FB4A ; mapped ; 05EA 05BC # 1.1 HEBREW LETTER TAV WITH DAGESH -FB4B ; mapped ; 05D5 05B9 # 1.1 HEBREW LETTER VAV WITH HOLAM -FB4C ; mapped ; 05D1 05BF # 1.1 HEBREW LETTER BET WITH RAFE -FB4D ; mapped ; 05DB 05BF # 1.1 HEBREW LETTER KAF WITH RAFE -FB4E ; mapped ; 05E4 05BF # 1.1 HEBREW LETTER PE WITH RAFE -FB4F ; mapped ; 05D0 05DC # 1.1 HEBREW LIGATURE ALEF LAMED -FB50..FB51 ; mapped ; 0671 # 1.1 ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER ALEF WASLA FINAL FORM -FB52..FB55 ; mapped ; 067B # 1.1 ARABIC LETTER BEEH ISOLATED FORM..ARABIC LETTER BEEH MEDIAL FORM -FB56..FB59 ; mapped ; 067E # 1.1 ARABIC LETTER PEH ISOLATED FORM..ARABIC LETTER PEH MEDIAL FORM -FB5A..FB5D ; mapped ; 0680 # 1.1 ARABIC LETTER BEHEH ISOLATED FORM..ARABIC LETTER BEHEH MEDIAL FORM -FB5E..FB61 ; mapped ; 067A # 1.1 ARABIC LETTER TTEHEH ISOLATED FORM..ARABIC LETTER TTEHEH MEDIAL FORM -FB62..FB65 ; mapped ; 067F # 1.1 ARABIC LETTER TEHEH ISOLATED FORM..ARABIC LETTER TEHEH MEDIAL FORM -FB66..FB69 ; mapped ; 0679 # 1.1 ARABIC LETTER TTEH ISOLATED FORM..ARABIC LETTER TTEH MEDIAL FORM -FB6A..FB6D ; mapped ; 06A4 # 1.1 ARABIC LETTER VEH ISOLATED FORM..ARABIC LETTER VEH MEDIAL FORM -FB6E..FB71 ; mapped ; 06A6 # 1.1 ARABIC LETTER PEHEH ISOLATED FORM..ARABIC LETTER PEHEH MEDIAL FORM -FB72..FB75 ; mapped ; 0684 # 1.1 ARABIC LETTER DYEH ISOLATED FORM..ARABIC LETTER DYEH MEDIAL FORM -FB76..FB79 ; mapped ; 0683 # 1.1 ARABIC LETTER NYEH ISOLATED FORM..ARABIC LETTER NYEH MEDIAL FORM -FB7A..FB7D ; mapped ; 0686 # 1.1 ARABIC LETTER TCHEH ISOLATED FORM..ARABIC LETTER TCHEH MEDIAL FORM -FB7E..FB81 ; mapped ; 0687 # 1.1 ARABIC LETTER TCHEHEH ISOLATED FORM..ARABIC LETTER TCHEHEH MEDIAL FORM -FB82..FB83 ; mapped ; 068D # 1.1 ARABIC LETTER DDAHAL ISOLATED FORM..ARABIC LETTER DDAHAL FINAL FORM -FB84..FB85 ; mapped ; 068C # 1.1 ARABIC LETTER DAHAL ISOLATED FORM..ARABIC LETTER DAHAL FINAL FORM -FB86..FB87 ; mapped ; 068E # 1.1 ARABIC LETTER DUL ISOLATED FORM..ARABIC LETTER DUL FINAL FORM -FB88..FB89 ; mapped ; 0688 # 1.1 ARABIC LETTER DDAL ISOLATED FORM..ARABIC LETTER DDAL FINAL FORM -FB8A..FB8B ; mapped ; 0698 # 1.1 ARABIC LETTER JEH ISOLATED FORM..ARABIC LETTER JEH FINAL FORM -FB8C..FB8D ; mapped ; 0691 # 1.1 ARABIC LETTER RREH ISOLATED FORM..ARABIC LETTER RREH FINAL FORM -FB8E..FB91 ; mapped ; 06A9 # 1.1 ARABIC LETTER KEHEH ISOLATED FORM..ARABIC LETTER KEHEH MEDIAL FORM -FB92..FB95 ; mapped ; 06AF # 1.1 ARABIC LETTER GAF ISOLATED FORM..ARABIC LETTER GAF MEDIAL FORM -FB96..FB99 ; mapped ; 06B3 # 1.1 ARABIC LETTER GUEH ISOLATED FORM..ARABIC LETTER GUEH MEDIAL FORM -FB9A..FB9D ; mapped ; 06B1 # 1.1 ARABIC LETTER NGOEH ISOLATED FORM..ARABIC LETTER NGOEH MEDIAL FORM -FB9E..FB9F ; mapped ; 06BA # 1.1 ARABIC LETTER NOON GHUNNA ISOLATED FORM..ARABIC LETTER NOON GHUNNA FINAL FORM -FBA0..FBA3 ; mapped ; 06BB # 1.1 ARABIC LETTER RNOON ISOLATED FORM..ARABIC LETTER RNOON MEDIAL FORM -FBA4..FBA5 ; mapped ; 06C0 # 1.1 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM..ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM -FBA6..FBA9 ; mapped ; 06C1 # 1.1 ARABIC LETTER HEH GOAL ISOLATED FORM..ARABIC LETTER HEH GOAL MEDIAL FORM -FBAA..FBAD ; mapped ; 06BE # 1.1 ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM..ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM -FBAE..FBAF ; mapped ; 06D2 # 1.1 ARABIC LETTER YEH BARREE ISOLATED FORM..ARABIC LETTER YEH BARREE FINAL FORM -FBB0..FBB1 ; mapped ; 06D3 # 1.1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBB2..FBC1 ; valid ; ; NV8 # 6.0 ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW -FBC2..FBD2 ; disallowed # NA .. -FBD3..FBD6 ; mapped ; 06AD # 1.1 ARABIC LETTER NG ISOLATED FORM..ARABIC LETTER NG MEDIAL FORM -FBD7..FBD8 ; mapped ; 06C7 # 1.1 ARABIC LETTER U ISOLATED FORM..ARABIC LETTER U FINAL FORM -FBD9..FBDA ; mapped ; 06C6 # 1.1 ARABIC LETTER OE ISOLATED FORM..ARABIC LETTER OE FINAL FORM -FBDB..FBDC ; mapped ; 06C8 # 1.1 ARABIC LETTER YU ISOLATED FORM..ARABIC LETTER YU FINAL FORM -FBDD ; mapped ; 06C7 0674 # 1.1 ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM -FBDE..FBDF ; mapped ; 06CB # 1.1 ARABIC LETTER VE ISOLATED FORM..ARABIC LETTER VE FINAL FORM -FBE0..FBE1 ; mapped ; 06C5 # 1.1 ARABIC LETTER KIRGHIZ OE ISOLATED FORM..ARABIC LETTER KIRGHIZ OE FINAL FORM -FBE2..FBE3 ; mapped ; 06C9 # 1.1 ARABIC LETTER KIRGHIZ YU ISOLATED FORM..ARABIC LETTER KIRGHIZ YU FINAL FORM -FBE4..FBE7 ; mapped ; 06D0 # 1.1 ARABIC LETTER E ISOLATED FORM..ARABIC LETTER E MEDIAL FORM -FBE8..FBE9 ; mapped ; 0649 # 1.1 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM..ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM -FBEA..FBEB ; mapped ; 0626 0627 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM -FBEC..FBED ; mapped ; 0626 06D5 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM -FBEE..FBEF ; mapped ; 0626 0648 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM -FBF0..FBF1 ; mapped ; 0626 06C7 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM -FBF2..FBF3 ; mapped ; 0626 06C6 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM -FBF4..FBF5 ; mapped ; 0626 06C8 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM -FBF6..FBF8 ; mapped ; 0626 06D0 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM -FBF9..FBFB ; mapped ; 0626 0649 # 1.1 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM..ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM -FBFC..FBFF ; mapped ; 06CC # 1.1 ARABIC LETTER FARSI YEH ISOLATED FORM..ARABIC LETTER FARSI YEH MEDIAL FORM -FC00 ; mapped ; 0626 062C # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM -FC01 ; mapped ; 0626 062D # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM -FC02 ; mapped ; 0626 0645 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM -FC03 ; mapped ; 0626 0649 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM -FC04 ; mapped ; 0626 064A # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM -FC05 ; mapped ; 0628 062C # 1.1 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM -FC06 ; mapped ; 0628 062D # 1.1 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM -FC07 ; mapped ; 0628 062E # 1.1 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM -FC08 ; mapped ; 0628 0645 # 1.1 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM -FC09 ; mapped ; 0628 0649 # 1.1 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM -FC0A ; mapped ; 0628 064A # 1.1 ARABIC LIGATURE BEH WITH YEH ISOLATED FORM -FC0B ; mapped ; 062A 062C # 1.1 ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM -FC0C ; mapped ; 062A 062D # 1.1 ARABIC LIGATURE TEH WITH HAH ISOLATED FORM -FC0D ; mapped ; 062A 062E # 1.1 ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM -FC0E ; mapped ; 062A 0645 # 1.1 ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM -FC0F ; mapped ; 062A 0649 # 1.1 ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM -FC10 ; mapped ; 062A 064A # 1.1 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM -FC11 ; mapped ; 062B 062C # 1.1 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM -FC12 ; mapped ; 062B 0645 # 1.1 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM -FC13 ; mapped ; 062B 0649 # 1.1 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM -FC14 ; mapped ; 062B 064A # 1.1 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM -FC15 ; mapped ; 062C 062D # 1.1 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM -FC16 ; mapped ; 062C 0645 # 1.1 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM -FC17 ; mapped ; 062D 062C # 1.1 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM -FC18 ; mapped ; 062D 0645 # 1.1 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM -FC19 ; mapped ; 062E 062C # 1.1 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM -FC1A ; mapped ; 062E 062D # 1.1 ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM -FC1B ; mapped ; 062E 0645 # 1.1 ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM -FC1C ; mapped ; 0633 062C # 1.1 ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM -FC1D ; mapped ; 0633 062D # 1.1 ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM -FC1E ; mapped ; 0633 062E # 1.1 ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM -FC1F ; mapped ; 0633 0645 # 1.1 ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM -FC20 ; mapped ; 0635 062D # 1.1 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM -FC21 ; mapped ; 0635 0645 # 1.1 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM -FC22 ; mapped ; 0636 062C # 1.1 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM -FC23 ; mapped ; 0636 062D # 1.1 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM -FC24 ; mapped ; 0636 062E # 1.1 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM -FC25 ; mapped ; 0636 0645 # 1.1 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM -FC26 ; mapped ; 0637 062D # 1.1 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM -FC27 ; mapped ; 0637 0645 # 1.1 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM -FC28 ; mapped ; 0638 0645 # 1.1 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM -FC29 ; mapped ; 0639 062C # 1.1 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM -FC2A ; mapped ; 0639 0645 # 1.1 ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM -FC2B ; mapped ; 063A 062C # 1.1 ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM -FC2C ; mapped ; 063A 0645 # 1.1 ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM -FC2D ; mapped ; 0641 062C # 1.1 ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM -FC2E ; mapped ; 0641 062D # 1.1 ARABIC LIGATURE FEH WITH HAH ISOLATED FORM -FC2F ; mapped ; 0641 062E # 1.1 ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM -FC30 ; mapped ; 0641 0645 # 1.1 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM -FC31 ; mapped ; 0641 0649 # 1.1 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM -FC32 ; mapped ; 0641 064A # 1.1 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM -FC33 ; mapped ; 0642 062D # 1.1 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM -FC34 ; mapped ; 0642 0645 # 1.1 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM -FC35 ; mapped ; 0642 0649 # 1.1 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM -FC36 ; mapped ; 0642 064A # 1.1 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM -FC37 ; mapped ; 0643 0627 # 1.1 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM -FC38 ; mapped ; 0643 062C # 1.1 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM -FC39 ; mapped ; 0643 062D # 1.1 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM -FC3A ; mapped ; 0643 062E # 1.1 ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM -FC3B ; mapped ; 0643 0644 # 1.1 ARABIC LIGATURE KAF WITH LAM ISOLATED FORM -FC3C ; mapped ; 0643 0645 # 1.1 ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM -FC3D ; mapped ; 0643 0649 # 1.1 ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM -FC3E ; mapped ; 0643 064A # 1.1 ARABIC LIGATURE KAF WITH YEH ISOLATED FORM -FC3F ; mapped ; 0644 062C # 1.1 ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM -FC40 ; mapped ; 0644 062D # 1.1 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM -FC41 ; mapped ; 0644 062E # 1.1 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM -FC42 ; mapped ; 0644 0645 # 1.1 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM -FC43 ; mapped ; 0644 0649 # 1.1 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM -FC44 ; mapped ; 0644 064A # 1.1 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM -FC45 ; mapped ; 0645 062C # 1.1 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM -FC46 ; mapped ; 0645 062D # 1.1 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM -FC47 ; mapped ; 0645 062E # 1.1 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM -FC48 ; mapped ; 0645 0645 # 1.1 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM -FC49 ; mapped ; 0645 0649 # 1.1 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM -FC4A ; mapped ; 0645 064A # 1.1 ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM -FC4B ; mapped ; 0646 062C # 1.1 ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM -FC4C ; mapped ; 0646 062D # 1.1 ARABIC LIGATURE NOON WITH HAH ISOLATED FORM -FC4D ; mapped ; 0646 062E # 1.1 ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM -FC4E ; mapped ; 0646 0645 # 1.1 ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM -FC4F ; mapped ; 0646 0649 # 1.1 ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM -FC50 ; mapped ; 0646 064A # 1.1 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM -FC51 ; mapped ; 0647 062C # 1.1 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM -FC52 ; mapped ; 0647 0645 # 1.1 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM -FC53 ; mapped ; 0647 0649 # 1.1 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM -FC54 ; mapped ; 0647 064A # 1.1 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM -FC55 ; mapped ; 064A 062C # 1.1 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM -FC56 ; mapped ; 064A 062D # 1.1 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM -FC57 ; mapped ; 064A 062E # 1.1 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM -FC58 ; mapped ; 064A 0645 # 1.1 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM -FC59 ; mapped ; 064A 0649 # 1.1 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM -FC5A ; mapped ; 064A 064A # 1.1 ARABIC LIGATURE YEH WITH YEH ISOLATED FORM -FC5B ; mapped ; 0630 0670 # 1.1 ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM -FC5C ; mapped ; 0631 0670 # 1.1 ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM -FC5D ; mapped ; 0649 0670 # 1.1 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM -FC5E ; disallowed_STD3_mapped ; 0020 064C 0651 #1.1 ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM -FC5F ; disallowed_STD3_mapped ; 0020 064D 0651 #1.1 ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM -FC60 ; disallowed_STD3_mapped ; 0020 064E 0651 #1.1 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM -FC61 ; disallowed_STD3_mapped ; 0020 064F 0651 #1.1 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM -FC62 ; disallowed_STD3_mapped ; 0020 0650 0651 #1.1 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM -FC63 ; disallowed_STD3_mapped ; 0020 0651 0670 #1.1 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM -FC64 ; mapped ; 0626 0631 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM -FC65 ; mapped ; 0626 0632 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM -FC66 ; mapped ; 0626 0645 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM -FC67 ; mapped ; 0626 0646 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM -FC68 ; mapped ; 0626 0649 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM -FC69 ; mapped ; 0626 064A # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM -FC6A ; mapped ; 0628 0631 # 1.1 ARABIC LIGATURE BEH WITH REH FINAL FORM -FC6B ; mapped ; 0628 0632 # 1.1 ARABIC LIGATURE BEH WITH ZAIN FINAL FORM -FC6C ; mapped ; 0628 0645 # 1.1 ARABIC LIGATURE BEH WITH MEEM FINAL FORM -FC6D ; mapped ; 0628 0646 # 1.1 ARABIC LIGATURE BEH WITH NOON FINAL FORM -FC6E ; mapped ; 0628 0649 # 1.1 ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM -FC6F ; mapped ; 0628 064A # 1.1 ARABIC LIGATURE BEH WITH YEH FINAL FORM -FC70 ; mapped ; 062A 0631 # 1.1 ARABIC LIGATURE TEH WITH REH FINAL FORM -FC71 ; mapped ; 062A 0632 # 1.1 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM -FC72 ; mapped ; 062A 0645 # 1.1 ARABIC LIGATURE TEH WITH MEEM FINAL FORM -FC73 ; mapped ; 062A 0646 # 1.1 ARABIC LIGATURE TEH WITH NOON FINAL FORM -FC74 ; mapped ; 062A 0649 # 1.1 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM -FC75 ; mapped ; 062A 064A # 1.1 ARABIC LIGATURE TEH WITH YEH FINAL FORM -FC76 ; mapped ; 062B 0631 # 1.1 ARABIC LIGATURE THEH WITH REH FINAL FORM -FC77 ; mapped ; 062B 0632 # 1.1 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM -FC78 ; mapped ; 062B 0645 # 1.1 ARABIC LIGATURE THEH WITH MEEM FINAL FORM -FC79 ; mapped ; 062B 0646 # 1.1 ARABIC LIGATURE THEH WITH NOON FINAL FORM -FC7A ; mapped ; 062B 0649 # 1.1 ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM -FC7B ; mapped ; 062B 064A # 1.1 ARABIC LIGATURE THEH WITH YEH FINAL FORM -FC7C ; mapped ; 0641 0649 # 1.1 ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM -FC7D ; mapped ; 0641 064A # 1.1 ARABIC LIGATURE FEH WITH YEH FINAL FORM -FC7E ; mapped ; 0642 0649 # 1.1 ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM -FC7F ; mapped ; 0642 064A # 1.1 ARABIC LIGATURE QAF WITH YEH FINAL FORM -FC80 ; mapped ; 0643 0627 # 1.1 ARABIC LIGATURE KAF WITH ALEF FINAL FORM -FC81 ; mapped ; 0643 0644 # 1.1 ARABIC LIGATURE KAF WITH LAM FINAL FORM -FC82 ; mapped ; 0643 0645 # 1.1 ARABIC LIGATURE KAF WITH MEEM FINAL FORM -FC83 ; mapped ; 0643 0649 # 1.1 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM -FC84 ; mapped ; 0643 064A # 1.1 ARABIC LIGATURE KAF WITH YEH FINAL FORM -FC85 ; mapped ; 0644 0645 # 1.1 ARABIC LIGATURE LAM WITH MEEM FINAL FORM -FC86 ; mapped ; 0644 0649 # 1.1 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM -FC87 ; mapped ; 0644 064A # 1.1 ARABIC LIGATURE LAM WITH YEH FINAL FORM -FC88 ; mapped ; 0645 0627 # 1.1 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM -FC89 ; mapped ; 0645 0645 # 1.1 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM -FC8A ; mapped ; 0646 0631 # 1.1 ARABIC LIGATURE NOON WITH REH FINAL FORM -FC8B ; mapped ; 0646 0632 # 1.1 ARABIC LIGATURE NOON WITH ZAIN FINAL FORM -FC8C ; mapped ; 0646 0645 # 1.1 ARABIC LIGATURE NOON WITH MEEM FINAL FORM -FC8D ; mapped ; 0646 0646 # 1.1 ARABIC LIGATURE NOON WITH NOON FINAL FORM -FC8E ; mapped ; 0646 0649 # 1.1 ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM -FC8F ; mapped ; 0646 064A # 1.1 ARABIC LIGATURE NOON WITH YEH FINAL FORM -FC90 ; mapped ; 0649 0670 # 1.1 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM -FC91 ; mapped ; 064A 0631 # 1.1 ARABIC LIGATURE YEH WITH REH FINAL FORM -FC92 ; mapped ; 064A 0632 # 1.1 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM -FC93 ; mapped ; 064A 0645 # 1.1 ARABIC LIGATURE YEH WITH MEEM FINAL FORM -FC94 ; mapped ; 064A 0646 # 1.1 ARABIC LIGATURE YEH WITH NOON FINAL FORM -FC95 ; mapped ; 064A 0649 # 1.1 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM -FC96 ; mapped ; 064A 064A # 1.1 ARABIC LIGATURE YEH WITH YEH FINAL FORM -FC97 ; mapped ; 0626 062C # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM -FC98 ; mapped ; 0626 062D # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM -FC99 ; mapped ; 0626 062E # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM -FC9A ; mapped ; 0626 0645 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM -FC9B ; mapped ; 0626 0647 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM -FC9C ; mapped ; 0628 062C # 1.1 ARABIC LIGATURE BEH WITH JEEM INITIAL FORM -FC9D ; mapped ; 0628 062D # 1.1 ARABIC LIGATURE BEH WITH HAH INITIAL FORM -FC9E ; mapped ; 0628 062E # 1.1 ARABIC LIGATURE BEH WITH KHAH INITIAL FORM -FC9F ; mapped ; 0628 0645 # 1.1 ARABIC LIGATURE BEH WITH MEEM INITIAL FORM -FCA0 ; mapped ; 0628 0647 # 1.1 ARABIC LIGATURE BEH WITH HEH INITIAL FORM -FCA1 ; mapped ; 062A 062C # 1.1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM -FCA2 ; mapped ; 062A 062D # 1.1 ARABIC LIGATURE TEH WITH HAH INITIAL FORM -FCA3 ; mapped ; 062A 062E # 1.1 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM -FCA4 ; mapped ; 062A 0645 # 1.1 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM -FCA5 ; mapped ; 062A 0647 # 1.1 ARABIC LIGATURE TEH WITH HEH INITIAL FORM -FCA6 ; mapped ; 062B 0645 # 1.1 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM -FCA7 ; mapped ; 062C 062D # 1.1 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM -FCA8 ; mapped ; 062C 0645 # 1.1 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM -FCA9 ; mapped ; 062D 062C # 1.1 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM -FCAA ; mapped ; 062D 0645 # 1.1 ARABIC LIGATURE HAH WITH MEEM INITIAL FORM -FCAB ; mapped ; 062E 062C # 1.1 ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM -FCAC ; mapped ; 062E 0645 # 1.1 ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM -FCAD ; mapped ; 0633 062C # 1.1 ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM -FCAE ; mapped ; 0633 062D # 1.1 ARABIC LIGATURE SEEN WITH HAH INITIAL FORM -FCAF ; mapped ; 0633 062E # 1.1 ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM -FCB0 ; mapped ; 0633 0645 # 1.1 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM -FCB1 ; mapped ; 0635 062D # 1.1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM -FCB2 ; mapped ; 0635 062E # 1.1 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM -FCB3 ; mapped ; 0635 0645 # 1.1 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM -FCB4 ; mapped ; 0636 062C # 1.1 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM -FCB5 ; mapped ; 0636 062D # 1.1 ARABIC LIGATURE DAD WITH HAH INITIAL FORM -FCB6 ; mapped ; 0636 062E # 1.1 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM -FCB7 ; mapped ; 0636 0645 # 1.1 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM -FCB8 ; mapped ; 0637 062D # 1.1 ARABIC LIGATURE TAH WITH HAH INITIAL FORM -FCB9 ; mapped ; 0638 0645 # 1.1 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM -FCBA ; mapped ; 0639 062C # 1.1 ARABIC LIGATURE AIN WITH JEEM INITIAL FORM -FCBB ; mapped ; 0639 0645 # 1.1 ARABIC LIGATURE AIN WITH MEEM INITIAL FORM -FCBC ; mapped ; 063A 062C # 1.1 ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM -FCBD ; mapped ; 063A 0645 # 1.1 ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM -FCBE ; mapped ; 0641 062C # 1.1 ARABIC LIGATURE FEH WITH JEEM INITIAL FORM -FCBF ; mapped ; 0641 062D # 1.1 ARABIC LIGATURE FEH WITH HAH INITIAL FORM -FCC0 ; mapped ; 0641 062E # 1.1 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM -FCC1 ; mapped ; 0641 0645 # 1.1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM -FCC2 ; mapped ; 0642 062D # 1.1 ARABIC LIGATURE QAF WITH HAH INITIAL FORM -FCC3 ; mapped ; 0642 0645 # 1.1 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM -FCC4 ; mapped ; 0643 062C # 1.1 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM -FCC5 ; mapped ; 0643 062D # 1.1 ARABIC LIGATURE KAF WITH HAH INITIAL FORM -FCC6 ; mapped ; 0643 062E # 1.1 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM -FCC7 ; mapped ; 0643 0644 # 1.1 ARABIC LIGATURE KAF WITH LAM INITIAL FORM -FCC8 ; mapped ; 0643 0645 # 1.1 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM -FCC9 ; mapped ; 0644 062C # 1.1 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM -FCCA ; mapped ; 0644 062D # 1.1 ARABIC LIGATURE LAM WITH HAH INITIAL FORM -FCCB ; mapped ; 0644 062E # 1.1 ARABIC LIGATURE LAM WITH KHAH INITIAL FORM -FCCC ; mapped ; 0644 0645 # 1.1 ARABIC LIGATURE LAM WITH MEEM INITIAL FORM -FCCD ; mapped ; 0644 0647 # 1.1 ARABIC LIGATURE LAM WITH HEH INITIAL FORM -FCCE ; mapped ; 0645 062C # 1.1 ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM -FCCF ; mapped ; 0645 062D # 1.1 ARABIC LIGATURE MEEM WITH HAH INITIAL FORM -FCD0 ; mapped ; 0645 062E # 1.1 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM -FCD1 ; mapped ; 0645 0645 # 1.1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM -FCD2 ; mapped ; 0646 062C # 1.1 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM -FCD3 ; mapped ; 0646 062D # 1.1 ARABIC LIGATURE NOON WITH HAH INITIAL FORM -FCD4 ; mapped ; 0646 062E # 1.1 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM -FCD5 ; mapped ; 0646 0645 # 1.1 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM -FCD6 ; mapped ; 0646 0647 # 1.1 ARABIC LIGATURE NOON WITH HEH INITIAL FORM -FCD7 ; mapped ; 0647 062C # 1.1 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM -FCD8 ; mapped ; 0647 0645 # 1.1 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM -FCD9 ; mapped ; 0647 0670 # 1.1 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM -FCDA ; mapped ; 064A 062C # 1.1 ARABIC LIGATURE YEH WITH JEEM INITIAL FORM -FCDB ; mapped ; 064A 062D # 1.1 ARABIC LIGATURE YEH WITH HAH INITIAL FORM -FCDC ; mapped ; 064A 062E # 1.1 ARABIC LIGATURE YEH WITH KHAH INITIAL FORM -FCDD ; mapped ; 064A 0645 # 1.1 ARABIC LIGATURE YEH WITH MEEM INITIAL FORM -FCDE ; mapped ; 064A 0647 # 1.1 ARABIC LIGATURE YEH WITH HEH INITIAL FORM -FCDF ; mapped ; 0626 0645 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM -FCE0 ; mapped ; 0626 0647 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM -FCE1 ; mapped ; 0628 0645 # 1.1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM -FCE2 ; mapped ; 0628 0647 # 1.1 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM -FCE3 ; mapped ; 062A 0645 # 1.1 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM -FCE4 ; mapped ; 062A 0647 # 1.1 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM -FCE5 ; mapped ; 062B 0645 # 1.1 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM -FCE6 ; mapped ; 062B 0647 # 1.1 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM -FCE7 ; mapped ; 0633 0645 # 1.1 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM -FCE8 ; mapped ; 0633 0647 # 1.1 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM -FCE9 ; mapped ; 0634 0645 # 1.1 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM -FCEA ; mapped ; 0634 0647 # 1.1 ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM -FCEB ; mapped ; 0643 0644 # 1.1 ARABIC LIGATURE KAF WITH LAM MEDIAL FORM -FCEC ; mapped ; 0643 0645 # 1.1 ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM -FCED ; mapped ; 0644 0645 # 1.1 ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM -FCEE ; mapped ; 0646 0645 # 1.1 ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM -FCEF ; mapped ; 0646 0647 # 1.1 ARABIC LIGATURE NOON WITH HEH MEDIAL FORM -FCF0 ; mapped ; 064A 0645 # 1.1 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM -FCF1 ; mapped ; 064A 0647 # 1.1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM -FCF2 ; mapped ; 0640 064E 0651 #1.1 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM -FCF3 ; mapped ; 0640 064F 0651 #1.1 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM -FCF4 ; mapped ; 0640 0650 0651 #1.1 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM -FCF5 ; mapped ; 0637 0649 # 1.1 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM -FCF6 ; mapped ; 0637 064A # 1.1 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM -FCF7 ; mapped ; 0639 0649 # 1.1 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM -FCF8 ; mapped ; 0639 064A # 1.1 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM -FCF9 ; mapped ; 063A 0649 # 1.1 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM -FCFA ; mapped ; 063A 064A # 1.1 ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM -FCFB ; mapped ; 0633 0649 # 1.1 ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM -FCFC ; mapped ; 0633 064A # 1.1 ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM -FCFD ; mapped ; 0634 0649 # 1.1 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM -FCFE ; mapped ; 0634 064A # 1.1 ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM -FCFF ; mapped ; 062D 0649 # 1.1 ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM -FD00 ; mapped ; 062D 064A # 1.1 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM -FD01 ; mapped ; 062C 0649 # 1.1 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM -FD02 ; mapped ; 062C 064A # 1.1 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM -FD03 ; mapped ; 062E 0649 # 1.1 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM -FD04 ; mapped ; 062E 064A # 1.1 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM -FD05 ; mapped ; 0635 0649 # 1.1 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM -FD06 ; mapped ; 0635 064A # 1.1 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM -FD07 ; mapped ; 0636 0649 # 1.1 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM -FD08 ; mapped ; 0636 064A # 1.1 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM -FD09 ; mapped ; 0634 062C # 1.1 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM -FD0A ; mapped ; 0634 062D # 1.1 ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM -FD0B ; mapped ; 0634 062E # 1.1 ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM -FD0C ; mapped ; 0634 0645 # 1.1 ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM -FD0D ; mapped ; 0634 0631 # 1.1 ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM -FD0E ; mapped ; 0633 0631 # 1.1 ARABIC LIGATURE SEEN WITH REH ISOLATED FORM -FD0F ; mapped ; 0635 0631 # 1.1 ARABIC LIGATURE SAD WITH REH ISOLATED FORM -FD10 ; mapped ; 0636 0631 # 1.1 ARABIC LIGATURE DAD WITH REH ISOLATED FORM -FD11 ; mapped ; 0637 0649 # 1.1 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM -FD12 ; mapped ; 0637 064A # 1.1 ARABIC LIGATURE TAH WITH YEH FINAL FORM -FD13 ; mapped ; 0639 0649 # 1.1 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM -FD14 ; mapped ; 0639 064A # 1.1 ARABIC LIGATURE AIN WITH YEH FINAL FORM -FD15 ; mapped ; 063A 0649 # 1.1 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM -FD16 ; mapped ; 063A 064A # 1.1 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM -FD17 ; mapped ; 0633 0649 # 1.1 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM -FD18 ; mapped ; 0633 064A # 1.1 ARABIC LIGATURE SEEN WITH YEH FINAL FORM -FD19 ; mapped ; 0634 0649 # 1.1 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM -FD1A ; mapped ; 0634 064A # 1.1 ARABIC LIGATURE SHEEN WITH YEH FINAL FORM -FD1B ; mapped ; 062D 0649 # 1.1 ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM -FD1C ; mapped ; 062D 064A # 1.1 ARABIC LIGATURE HAH WITH YEH FINAL FORM -FD1D ; mapped ; 062C 0649 # 1.1 ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM -FD1E ; mapped ; 062C 064A # 1.1 ARABIC LIGATURE JEEM WITH YEH FINAL FORM -FD1F ; mapped ; 062E 0649 # 1.1 ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM -FD20 ; mapped ; 062E 064A # 1.1 ARABIC LIGATURE KHAH WITH YEH FINAL FORM -FD21 ; mapped ; 0635 0649 # 1.1 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM -FD22 ; mapped ; 0635 064A # 1.1 ARABIC LIGATURE SAD WITH YEH FINAL FORM -FD23 ; mapped ; 0636 0649 # 1.1 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM -FD24 ; mapped ; 0636 064A # 1.1 ARABIC LIGATURE DAD WITH YEH FINAL FORM -FD25 ; mapped ; 0634 062C # 1.1 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM -FD26 ; mapped ; 0634 062D # 1.1 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM -FD27 ; mapped ; 0634 062E # 1.1 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM -FD28 ; mapped ; 0634 0645 # 1.1 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM -FD29 ; mapped ; 0634 0631 # 1.1 ARABIC LIGATURE SHEEN WITH REH FINAL FORM -FD2A ; mapped ; 0633 0631 # 1.1 ARABIC LIGATURE SEEN WITH REH FINAL FORM -FD2B ; mapped ; 0635 0631 # 1.1 ARABIC LIGATURE SAD WITH REH FINAL FORM -FD2C ; mapped ; 0636 0631 # 1.1 ARABIC LIGATURE DAD WITH REH FINAL FORM -FD2D ; mapped ; 0634 062C # 1.1 ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM -FD2E ; mapped ; 0634 062D # 1.1 ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM -FD2F ; mapped ; 0634 062E # 1.1 ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM -FD30 ; mapped ; 0634 0645 # 1.1 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM -FD31 ; mapped ; 0633 0647 # 1.1 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM -FD32 ; mapped ; 0634 0647 # 1.1 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM -FD33 ; mapped ; 0637 0645 # 1.1 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM -FD34 ; mapped ; 0633 062C # 1.1 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM -FD35 ; mapped ; 0633 062D # 1.1 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM -FD36 ; mapped ; 0633 062E # 1.1 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM -FD37 ; mapped ; 0634 062C # 1.1 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM -FD38 ; mapped ; 0634 062D # 1.1 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM -FD39 ; mapped ; 0634 062E # 1.1 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM -FD3A ; mapped ; 0637 0645 # 1.1 ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM -FD3B ; mapped ; 0638 0645 # 1.1 ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM -FD3C..FD3D ; mapped ; 0627 064B # 1.1 ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD3E..FD3F ; valid ; ; NV8 # 1.1 ORNATE LEFT PARENTHESIS..ORNATE RIGHT PARENTHESIS -FD40..FD4F ; disallowed # NA .. -FD50 ; mapped ; 062A 062C 0645 #1.1 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM -FD51..FD52 ; mapped ; 062A 062D 062C #1.1 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM..ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM -FD53 ; mapped ; 062A 062D 0645 #1.1 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM -FD54 ; mapped ; 062A 062E 0645 #1.1 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM -FD55 ; mapped ; 062A 0645 062C #1.1 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM -FD56 ; mapped ; 062A 0645 062D #1.1 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM -FD57 ; mapped ; 062A 0645 062E #1.1 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM -FD58..FD59 ; mapped ; 062C 0645 062D #1.1 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM -FD5A ; mapped ; 062D 0645 064A #1.1 ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM -FD5B ; mapped ; 062D 0645 0649 #1.1 ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD5C ; mapped ; 0633 062D 062C #1.1 ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM -FD5D ; mapped ; 0633 062C 062D #1.1 ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM -FD5E ; mapped ; 0633 062C 0649 #1.1 ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM -FD5F..FD60 ; mapped ; 0633 0645 062D #1.1 ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM -FD61 ; mapped ; 0633 0645 062C #1.1 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM -FD62..FD63 ; mapped ; 0633 0645 0645 #1.1 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM -FD64..FD65 ; mapped ; 0635 062D 062D #1.1 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM..ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM -FD66 ; mapped ; 0635 0645 0645 #1.1 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM -FD67..FD68 ; mapped ; 0634 062D 0645 #1.1 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM..ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM -FD69 ; mapped ; 0634 062C 064A #1.1 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM -FD6A..FD6B ; mapped ; 0634 0645 062E #1.1 ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM..ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM -FD6C..FD6D ; mapped ; 0634 0645 0645 #1.1 ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM -FD6E ; mapped ; 0636 062D 0649 #1.1 ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM -FD6F..FD70 ; mapped ; 0636 062E 0645 #1.1 ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM..ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM -FD71..FD72 ; mapped ; 0637 0645 062D #1.1 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM -FD73 ; mapped ; 0637 0645 0645 #1.1 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM -FD74 ; mapped ; 0637 0645 064A #1.1 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM -FD75 ; mapped ; 0639 062C 0645 #1.1 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM -FD76..FD77 ; mapped ; 0639 0645 0645 #1.1 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM -FD78 ; mapped ; 0639 0645 0649 #1.1 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD79 ; mapped ; 063A 0645 0645 #1.1 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM -FD7A ; mapped ; 063A 0645 064A #1.1 ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM -FD7B ; mapped ; 063A 0645 0649 #1.1 ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD7C..FD7D ; mapped ; 0641 062E 0645 #1.1 ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM..ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM -FD7E ; mapped ; 0642 0645 062D #1.1 ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM -FD7F ; mapped ; 0642 0645 0645 #1.1 ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM -FD80 ; mapped ; 0644 062D 0645 #1.1 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM -FD81 ; mapped ; 0644 062D 064A #1.1 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM -FD82 ; mapped ; 0644 062D 0649 #1.1 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM -FD83..FD84 ; mapped ; 0644 062C 062C #1.1 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM..ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM -FD85..FD86 ; mapped ; 0644 062E 0645 #1.1 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM..ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM -FD87..FD88 ; mapped ; 0644 0645 062D #1.1 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM -FD89 ; mapped ; 0645 062D 062C #1.1 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM -FD8A ; mapped ; 0645 062D 0645 #1.1 ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM -FD8B ; mapped ; 0645 062D 064A #1.1 ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM -FD8C ; mapped ; 0645 062C 062D #1.1 ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM -FD8D ; mapped ; 0645 062C 0645 #1.1 ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM -FD8E ; mapped ; 0645 062E 062C #1.1 ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM -FD8F ; mapped ; 0645 062E 0645 #1.1 ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD90..FD91 ; disallowed # NA .. -FD92 ; mapped ; 0645 062C 062E #1.1 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM -FD93 ; mapped ; 0647 0645 062C #1.1 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM -FD94 ; mapped ; 0647 0645 0645 #1.1 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM -FD95 ; mapped ; 0646 062D 0645 #1.1 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM -FD96 ; mapped ; 0646 062D 0649 #1.1 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM -FD97..FD98 ; mapped ; 0646 062C 0645 #1.1 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM -FD99 ; mapped ; 0646 062C 0649 #1.1 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM -FD9A ; mapped ; 0646 0645 064A #1.1 ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM -FD9B ; mapped ; 0646 0645 0649 #1.1 ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD9C..FD9D ; mapped ; 064A 0645 0645 #1.1 ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM -FD9E ; mapped ; 0628 062E 064A #1.1 ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM -FD9F ; mapped ; 062A 062C 064A #1.1 ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM -FDA0 ; mapped ; 062A 062C 0649 #1.1 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM -FDA1 ; mapped ; 062A 062E 064A #1.1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM -FDA2 ; mapped ; 062A 062E 0649 #1.1 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM -FDA3 ; mapped ; 062A 0645 064A #1.1 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM -FDA4 ; mapped ; 062A 0645 0649 #1.1 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM -FDA5 ; mapped ; 062C 0645 064A #1.1 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM -FDA6 ; mapped ; 062C 062D 0649 #1.1 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM -FDA7 ; mapped ; 062C 0645 0649 #1.1 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM -FDA8 ; mapped ; 0633 062E 0649 #1.1 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM -FDA9 ; mapped ; 0635 062D 064A #1.1 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM -FDAA ; mapped ; 0634 062D 064A #1.1 ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM -FDAB ; mapped ; 0636 062D 064A #1.1 ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM -FDAC ; mapped ; 0644 062C 064A #1.1 ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM -FDAD ; mapped ; 0644 0645 064A #1.1 ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM -FDAE ; mapped ; 064A 062D 064A #1.1 ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM -FDAF ; mapped ; 064A 062C 064A #1.1 ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM -FDB0 ; mapped ; 064A 0645 064A #1.1 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM -FDB1 ; mapped ; 0645 0645 064A #1.1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM -FDB2 ; mapped ; 0642 0645 064A #1.1 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM -FDB3 ; mapped ; 0646 062D 064A #1.1 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM -FDB4 ; mapped ; 0642 0645 062D #1.1 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM -FDB5 ; mapped ; 0644 062D 0645 #1.1 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM -FDB6 ; mapped ; 0639 0645 064A #1.1 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM -FDB7 ; mapped ; 0643 0645 064A #1.1 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM -FDB8 ; mapped ; 0646 062C 062D #1.1 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM -FDB9 ; mapped ; 0645 062E 064A #1.1 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM -FDBA ; mapped ; 0644 062C 0645 #1.1 ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM -FDBB ; mapped ; 0643 0645 0645 #1.1 ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM -FDBC ; mapped ; 0644 062C 0645 #1.1 ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM -FDBD ; mapped ; 0646 062C 062D #1.1 ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM -FDBE ; mapped ; 062C 062D 064A #1.1 ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM -FDBF ; mapped ; 062D 062C 064A #1.1 ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM -FDC0 ; mapped ; 0645 062C 064A #1.1 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM -FDC1 ; mapped ; 0641 0645 064A #1.1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM -FDC2 ; mapped ; 0628 062D 064A #1.1 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM -FDC3 ; mapped ; 0643 0645 0645 #1.1 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM -FDC4 ; mapped ; 0639 062C 0645 #1.1 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM -FDC5 ; mapped ; 0635 0645 0645 #1.1 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM -FDC6 ; mapped ; 0633 062E 064A #1.1 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM -FDC7 ; mapped ; 0646 062C 064A #1.1 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDC8..FDCF ; disallowed # NA .. -FDD0..FDEF ; disallowed # 3.1 .. -FDF0 ; mapped ; 0635 0644 06D2 #1.1 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM -FDF1 ; mapped ; 0642 0644 06D2 #1.1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM -FDF2 ; mapped ; 0627 0644 0644 0647 #1.1 ARABIC LIGATURE ALLAH ISOLATED FORM -FDF3 ; mapped ; 0627 0643 0628 0631 #1.1 ARABIC LIGATURE AKBAR ISOLATED FORM -FDF4 ; mapped ; 0645 062D 0645 062F #1.1 ARABIC LIGATURE MOHAMMAD ISOLATED FORM -FDF5 ; mapped ; 0635 0644 0639 0645 #1.1 ARABIC LIGATURE SALAM ISOLATED FORM -FDF6 ; mapped ; 0631 0633 0648 0644 #1.1 ARABIC LIGATURE RASOUL ISOLATED FORM -FDF7 ; mapped ; 0639 0644 064A 0647 #1.1 ARABIC LIGATURE ALAYHE ISOLATED FORM -FDF8 ; mapped ; 0648 0633 0644 0645 #1.1 ARABIC LIGATURE WASALLAM ISOLATED FORM -FDF9 ; mapped ; 0635 0644 0649 #1.1 ARABIC LIGATURE SALLA ISOLATED FORM -FDFA ; disallowed_STD3_mapped ; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645 #1.1 ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM -FDFB ; disallowed_STD3_mapped ; 062C 0644 0020 062C 0644 0627 0644 0647 #1.1 ARABIC LIGATURE JALLAJALALOUHOU -FDFC ; mapped ; 0631 06CC 0627 0644 #3.2 RIAL SIGN -FDFD ; valid ; ; NV8 # 4.0 ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM -FDFE..FDFF ; disallowed # NA .. -FE00..FE0F ; ignored # 3.2 VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE10 ; disallowed_STD3_mapped ; 002C # 4.1 PRESENTATION FORM FOR VERTICAL COMMA -FE11 ; mapped ; 3001 # 4.1 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA -FE12 ; disallowed # 4.1 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP -FE13 ; disallowed_STD3_mapped ; 003A # 4.1 PRESENTATION FORM FOR VERTICAL COLON -FE14 ; disallowed_STD3_mapped ; 003B # 4.1 PRESENTATION FORM FOR VERTICAL SEMICOLON -FE15 ; disallowed_STD3_mapped ; 0021 # 4.1 PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK -FE16 ; disallowed_STD3_mapped ; 003F # 4.1 PRESENTATION FORM FOR VERTICAL QUESTION MARK -FE17 ; mapped ; 3016 # 4.1 PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET -FE18 ; mapped ; 3017 # 4.1 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET -FE19 ; disallowed # 4.1 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS -FE1A..FE1F ; disallowed # NA .. -FE20..FE23 ; valid # 1.1 COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF -FE24..FE26 ; valid # 5.1 COMBINING MACRON LEFT HALF..COMBINING CONJOINING MACRON -FE27..FE2D ; valid # 7.0 COMBINING LIGATURE LEFT HALF BELOW..COMBINING CONJOINING MACRON BELOW -FE2E..FE2F ; valid # 8.0 COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF -FE30 ; disallowed # 1.1 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER -FE31 ; mapped ; 2014 # 1.1 PRESENTATION FORM FOR VERTICAL EM DASH -FE32 ; mapped ; 2013 # 1.1 PRESENTATION FORM FOR VERTICAL EN DASH -FE33..FE34 ; disallowed_STD3_mapped ; 005F # 1.1 PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE35 ; disallowed_STD3_mapped ; 0028 # 1.1 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36 ; disallowed_STD3_mapped ; 0029 # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37 ; disallowed_STD3_mapped ; 007B # 1.1 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38 ; disallowed_STD3_mapped ; 007D # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE39 ; mapped ; 3014 # 1.1 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -FE3A ; mapped ; 3015 # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -FE3B ; mapped ; 3010 # 1.1 PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -FE3C ; mapped ; 3011 # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -FE3D ; mapped ; 300A # 1.1 PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -FE3E ; mapped ; 300B # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -FE3F ; mapped ; 3008 # 1.1 PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -FE40 ; mapped ; 3009 # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -FE41 ; mapped ; 300C # 1.1 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -FE42 ; mapped ; 300D # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -FE43 ; mapped ; 300E # 1.1 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -FE44 ; mapped ; 300F # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET -FE45..FE46 ; valid ; ; NV8 # 3.2 SESAME DOT..WHITE SESAME DOT -FE47 ; disallowed_STD3_mapped ; 005B # 4.0 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48 ; disallowed_STD3_mapped ; 005D # 4.0 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -FE49..FE4C ; disallowed_STD3_mapped ; 0020 0305 # 1.1 DASHED OVERLINE..DOUBLE WAVY OVERLINE -FE4D..FE4F ; disallowed_STD3_mapped ; 005F # 1.1 DASHED LOW LINE..WAVY LOW LINE -FE50 ; disallowed_STD3_mapped ; 002C # 1.1 SMALL COMMA -FE51 ; mapped ; 3001 # 1.1 SMALL IDEOGRAPHIC COMMA -FE52 ; disallowed # 1.1 SMALL FULL STOP -FE53 ; disallowed # NA -FE54 ; disallowed_STD3_mapped ; 003B # 1.1 SMALL SEMICOLON -FE55 ; disallowed_STD3_mapped ; 003A # 1.1 SMALL COLON -FE56 ; disallowed_STD3_mapped ; 003F # 1.1 SMALL QUESTION MARK -FE57 ; disallowed_STD3_mapped ; 0021 # 1.1 SMALL EXCLAMATION MARK -FE58 ; mapped ; 2014 # 1.1 SMALL EM DASH -FE59 ; disallowed_STD3_mapped ; 0028 # 1.1 SMALL LEFT PARENTHESIS -FE5A ; disallowed_STD3_mapped ; 0029 # 1.1 SMALL RIGHT PARENTHESIS -FE5B ; disallowed_STD3_mapped ; 007B # 1.1 SMALL LEFT CURLY BRACKET -FE5C ; disallowed_STD3_mapped ; 007D # 1.1 SMALL RIGHT CURLY BRACKET -FE5D ; mapped ; 3014 # 1.1 SMALL LEFT TORTOISE SHELL BRACKET -FE5E ; mapped ; 3015 # 1.1 SMALL RIGHT TORTOISE SHELL BRACKET -FE5F ; disallowed_STD3_mapped ; 0023 # 1.1 SMALL NUMBER SIGN -FE60 ; disallowed_STD3_mapped ; 0026 # 1.1 SMALL AMPERSAND -FE61 ; disallowed_STD3_mapped ; 002A # 1.1 SMALL ASTERISK -FE62 ; disallowed_STD3_mapped ; 002B # 1.1 SMALL PLUS SIGN -FE63 ; mapped ; 002D # 1.1 SMALL HYPHEN-MINUS -FE64 ; disallowed_STD3_mapped ; 003C # 1.1 SMALL LESS-THAN SIGN -FE65 ; disallowed_STD3_mapped ; 003E # 1.1 SMALL GREATER-THAN SIGN -FE66 ; disallowed_STD3_mapped ; 003D # 1.1 SMALL EQUALS SIGN -FE67 ; disallowed # NA -FE68 ; disallowed_STD3_mapped ; 005C # 1.1 SMALL REVERSE SOLIDUS -FE69 ; disallowed_STD3_mapped ; 0024 # 1.1 SMALL DOLLAR SIGN -FE6A ; disallowed_STD3_mapped ; 0025 # 1.1 SMALL PERCENT SIGN -FE6B ; disallowed_STD3_mapped ; 0040 # 1.1 SMALL COMMERCIAL AT -FE6C..FE6F ; disallowed # NA .. -FE70 ; disallowed_STD3_mapped ; 0020 064B # 1.1 ARABIC FATHATAN ISOLATED FORM -FE71 ; mapped ; 0640 064B # 1.1 ARABIC TATWEEL WITH FATHATAN ABOVE -FE72 ; disallowed_STD3_mapped ; 0020 064C # 1.1 ARABIC DAMMATAN ISOLATED FORM -FE73 ; valid # 3.2 ARABIC TAIL FRAGMENT -FE74 ; disallowed_STD3_mapped ; 0020 064D # 1.1 ARABIC KASRATAN ISOLATED FORM -FE75 ; disallowed # NA -FE76 ; disallowed_STD3_mapped ; 0020 064E # 1.1 ARABIC FATHA ISOLATED FORM -FE77 ; mapped ; 0640 064E # 1.1 ARABIC FATHA MEDIAL FORM -FE78 ; disallowed_STD3_mapped ; 0020 064F # 1.1 ARABIC DAMMA ISOLATED FORM -FE79 ; mapped ; 0640 064F # 1.1 ARABIC DAMMA MEDIAL FORM -FE7A ; disallowed_STD3_mapped ; 0020 0650 # 1.1 ARABIC KASRA ISOLATED FORM -FE7B ; mapped ; 0640 0650 # 1.1 ARABIC KASRA MEDIAL FORM -FE7C ; disallowed_STD3_mapped ; 0020 0651 # 1.1 ARABIC SHADDA ISOLATED FORM -FE7D ; mapped ; 0640 0651 # 1.1 ARABIC SHADDA MEDIAL FORM -FE7E ; disallowed_STD3_mapped ; 0020 0652 # 1.1 ARABIC SUKUN ISOLATED FORM -FE7F ; mapped ; 0640 0652 # 1.1 ARABIC SUKUN MEDIAL FORM -FE80 ; mapped ; 0621 # 1.1 ARABIC LETTER HAMZA ISOLATED FORM -FE81..FE82 ; mapped ; 0622 # 1.1 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM..ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM -FE83..FE84 ; mapped ; 0623 # 1.1 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM -FE85..FE86 ; mapped ; 0624 # 1.1 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM -FE87..FE88 ; mapped ; 0625 # 1.1 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM..ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM -FE89..FE8C ; mapped ; 0626 # 1.1 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM -FE8D..FE8E ; mapped ; 0627 # 1.1 ARABIC LETTER ALEF ISOLATED FORM..ARABIC LETTER ALEF FINAL FORM -FE8F..FE92 ; mapped ; 0628 # 1.1 ARABIC LETTER BEH ISOLATED FORM..ARABIC LETTER BEH MEDIAL FORM -FE93..FE94 ; mapped ; 0629 # 1.1 ARABIC LETTER TEH MARBUTA ISOLATED FORM..ARABIC LETTER TEH MARBUTA FINAL FORM -FE95..FE98 ; mapped ; 062A # 1.1 ARABIC LETTER TEH ISOLATED FORM..ARABIC LETTER TEH MEDIAL FORM -FE99..FE9C ; mapped ; 062B # 1.1 ARABIC LETTER THEH ISOLATED FORM..ARABIC LETTER THEH MEDIAL FORM -FE9D..FEA0 ; mapped ; 062C # 1.1 ARABIC LETTER JEEM ISOLATED FORM..ARABIC LETTER JEEM MEDIAL FORM -FEA1..FEA4 ; mapped ; 062D # 1.1 ARABIC LETTER HAH ISOLATED FORM..ARABIC LETTER HAH MEDIAL FORM -FEA5..FEA8 ; mapped ; 062E # 1.1 ARABIC LETTER KHAH ISOLATED FORM..ARABIC LETTER KHAH MEDIAL FORM -FEA9..FEAA ; mapped ; 062F # 1.1 ARABIC LETTER DAL ISOLATED FORM..ARABIC LETTER DAL FINAL FORM -FEAB..FEAC ; mapped ; 0630 # 1.1 ARABIC LETTER THAL ISOLATED FORM..ARABIC LETTER THAL FINAL FORM -FEAD..FEAE ; mapped ; 0631 # 1.1 ARABIC LETTER REH ISOLATED FORM..ARABIC LETTER REH FINAL FORM -FEAF..FEB0 ; mapped ; 0632 # 1.1 ARABIC LETTER ZAIN ISOLATED FORM..ARABIC LETTER ZAIN FINAL FORM -FEB1..FEB4 ; mapped ; 0633 # 1.1 ARABIC LETTER SEEN ISOLATED FORM..ARABIC LETTER SEEN MEDIAL FORM -FEB5..FEB8 ; mapped ; 0634 # 1.1 ARABIC LETTER SHEEN ISOLATED FORM..ARABIC LETTER SHEEN MEDIAL FORM -FEB9..FEBC ; mapped ; 0635 # 1.1 ARABIC LETTER SAD ISOLATED FORM..ARABIC LETTER SAD MEDIAL FORM -FEBD..FEC0 ; mapped ; 0636 # 1.1 ARABIC LETTER DAD ISOLATED FORM..ARABIC LETTER DAD MEDIAL FORM -FEC1..FEC4 ; mapped ; 0637 # 1.1 ARABIC LETTER TAH ISOLATED FORM..ARABIC LETTER TAH MEDIAL FORM -FEC5..FEC8 ; mapped ; 0638 # 1.1 ARABIC LETTER ZAH ISOLATED FORM..ARABIC LETTER ZAH MEDIAL FORM -FEC9..FECC ; mapped ; 0639 # 1.1 ARABIC LETTER AIN ISOLATED FORM..ARABIC LETTER AIN MEDIAL FORM -FECD..FED0 ; mapped ; 063A # 1.1 ARABIC LETTER GHAIN ISOLATED FORM..ARABIC LETTER GHAIN MEDIAL FORM -FED1..FED4 ; mapped ; 0641 # 1.1 ARABIC LETTER FEH ISOLATED FORM..ARABIC LETTER FEH MEDIAL FORM -FED5..FED8 ; mapped ; 0642 # 1.1 ARABIC LETTER QAF ISOLATED FORM..ARABIC LETTER QAF MEDIAL FORM -FED9..FEDC ; mapped ; 0643 # 1.1 ARABIC LETTER KAF ISOLATED FORM..ARABIC LETTER KAF MEDIAL FORM -FEDD..FEE0 ; mapped ; 0644 # 1.1 ARABIC LETTER LAM ISOLATED FORM..ARABIC LETTER LAM MEDIAL FORM -FEE1..FEE4 ; mapped ; 0645 # 1.1 ARABIC LETTER MEEM ISOLATED FORM..ARABIC LETTER MEEM MEDIAL FORM -FEE5..FEE8 ; mapped ; 0646 # 1.1 ARABIC LETTER NOON ISOLATED FORM..ARABIC LETTER NOON MEDIAL FORM -FEE9..FEEC ; mapped ; 0647 # 1.1 ARABIC LETTER HEH ISOLATED FORM..ARABIC LETTER HEH MEDIAL FORM -FEED..FEEE ; mapped ; 0648 # 1.1 ARABIC LETTER WAW ISOLATED FORM..ARABIC LETTER WAW FINAL FORM -FEEF..FEF0 ; mapped ; 0649 # 1.1 ARABIC LETTER ALEF MAKSURA ISOLATED FORM..ARABIC LETTER ALEF MAKSURA FINAL FORM -FEF1..FEF4 ; mapped ; 064A # 1.1 ARABIC LETTER YEH ISOLATED FORM..ARABIC LETTER YEH MEDIAL FORM -FEF5..FEF6 ; mapped ; 0644 0622 # 1.1 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM -FEF7..FEF8 ; mapped ; 0644 0623 # 1.1 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM -FEF9..FEFA ; mapped ; 0644 0625 # 1.1 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM -FEFB..FEFC ; mapped ; 0644 0627 # 1.1 ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FEFD..FEFE ; disallowed # NA .. -FEFF ; ignored # 1.1 ZERO WIDTH NO-BREAK SPACE -FF00 ; disallowed # NA -FF01 ; disallowed_STD3_mapped ; 0021 # 1.1 FULLWIDTH EXCLAMATION MARK -FF02 ; disallowed_STD3_mapped ; 0022 # 1.1 FULLWIDTH QUOTATION MARK -FF03 ; disallowed_STD3_mapped ; 0023 # 1.1 FULLWIDTH NUMBER SIGN -FF04 ; disallowed_STD3_mapped ; 0024 # 1.1 FULLWIDTH DOLLAR SIGN -FF05 ; disallowed_STD3_mapped ; 0025 # 1.1 FULLWIDTH PERCENT SIGN -FF06 ; disallowed_STD3_mapped ; 0026 # 1.1 FULLWIDTH AMPERSAND -FF07 ; disallowed_STD3_mapped ; 0027 # 1.1 FULLWIDTH APOSTROPHE -FF08 ; disallowed_STD3_mapped ; 0028 # 1.1 FULLWIDTH LEFT PARENTHESIS -FF09 ; disallowed_STD3_mapped ; 0029 # 1.1 FULLWIDTH RIGHT PARENTHESIS -FF0A ; disallowed_STD3_mapped ; 002A # 1.1 FULLWIDTH ASTERISK -FF0B ; disallowed_STD3_mapped ; 002B # 1.1 FULLWIDTH PLUS SIGN -FF0C ; disallowed_STD3_mapped ; 002C # 1.1 FULLWIDTH COMMA -FF0D ; mapped ; 002D # 1.1 FULLWIDTH HYPHEN-MINUS -FF0E ; mapped ; 002E # 1.1 FULLWIDTH FULL STOP -FF0F ; disallowed_STD3_mapped ; 002F # 1.1 FULLWIDTH SOLIDUS -FF10 ; mapped ; 0030 # 1.1 FULLWIDTH DIGIT ZERO -FF11 ; mapped ; 0031 # 1.1 FULLWIDTH DIGIT ONE -FF12 ; mapped ; 0032 # 1.1 FULLWIDTH DIGIT TWO -FF13 ; mapped ; 0033 # 1.1 FULLWIDTH DIGIT THREE -FF14 ; mapped ; 0034 # 1.1 FULLWIDTH DIGIT FOUR -FF15 ; mapped ; 0035 # 1.1 FULLWIDTH DIGIT FIVE -FF16 ; mapped ; 0036 # 1.1 FULLWIDTH DIGIT SIX -FF17 ; mapped ; 0037 # 1.1 FULLWIDTH DIGIT SEVEN -FF18 ; mapped ; 0038 # 1.1 FULLWIDTH DIGIT EIGHT -FF19 ; mapped ; 0039 # 1.1 FULLWIDTH DIGIT NINE -FF1A ; disallowed_STD3_mapped ; 003A # 1.1 FULLWIDTH COLON -FF1B ; disallowed_STD3_mapped ; 003B # 1.1 FULLWIDTH SEMICOLON -FF1C ; disallowed_STD3_mapped ; 003C # 1.1 FULLWIDTH LESS-THAN SIGN -FF1D ; disallowed_STD3_mapped ; 003D # 1.1 FULLWIDTH EQUALS SIGN -FF1E ; disallowed_STD3_mapped ; 003E # 1.1 FULLWIDTH GREATER-THAN SIGN -FF1F ; disallowed_STD3_mapped ; 003F # 1.1 FULLWIDTH QUESTION MARK -FF20 ; disallowed_STD3_mapped ; 0040 # 1.1 FULLWIDTH COMMERCIAL AT -FF21 ; mapped ; 0061 # 1.1 FULLWIDTH LATIN CAPITAL LETTER A -FF22 ; mapped ; 0062 # 1.1 FULLWIDTH LATIN CAPITAL LETTER B -FF23 ; mapped ; 0063 # 1.1 FULLWIDTH LATIN CAPITAL LETTER C -FF24 ; mapped ; 0064 # 1.1 FULLWIDTH LATIN CAPITAL LETTER D -FF25 ; mapped ; 0065 # 1.1 FULLWIDTH LATIN CAPITAL LETTER E -FF26 ; mapped ; 0066 # 1.1 FULLWIDTH LATIN CAPITAL LETTER F -FF27 ; mapped ; 0067 # 1.1 FULLWIDTH LATIN CAPITAL LETTER G -FF28 ; mapped ; 0068 # 1.1 FULLWIDTH LATIN CAPITAL LETTER H -FF29 ; mapped ; 0069 # 1.1 FULLWIDTH LATIN CAPITAL LETTER I -FF2A ; mapped ; 006A # 1.1 FULLWIDTH LATIN CAPITAL LETTER J -FF2B ; mapped ; 006B # 1.1 FULLWIDTH LATIN CAPITAL LETTER K -FF2C ; mapped ; 006C # 1.1 FULLWIDTH LATIN CAPITAL LETTER L -FF2D ; mapped ; 006D # 1.1 FULLWIDTH LATIN CAPITAL LETTER M -FF2E ; mapped ; 006E # 1.1 FULLWIDTH LATIN CAPITAL LETTER N -FF2F ; mapped ; 006F # 1.1 FULLWIDTH LATIN CAPITAL LETTER O -FF30 ; mapped ; 0070 # 1.1 FULLWIDTH LATIN CAPITAL LETTER P -FF31 ; mapped ; 0071 # 1.1 FULLWIDTH LATIN CAPITAL LETTER Q -FF32 ; mapped ; 0072 # 1.1 FULLWIDTH LATIN CAPITAL LETTER R -FF33 ; mapped ; 0073 # 1.1 FULLWIDTH LATIN CAPITAL LETTER S -FF34 ; mapped ; 0074 # 1.1 FULLWIDTH LATIN CAPITAL LETTER T -FF35 ; mapped ; 0075 # 1.1 FULLWIDTH LATIN CAPITAL LETTER U -FF36 ; mapped ; 0076 # 1.1 FULLWIDTH LATIN CAPITAL LETTER V -FF37 ; mapped ; 0077 # 1.1 FULLWIDTH LATIN CAPITAL LETTER W -FF38 ; mapped ; 0078 # 1.1 FULLWIDTH LATIN CAPITAL LETTER X -FF39 ; mapped ; 0079 # 1.1 FULLWIDTH LATIN CAPITAL LETTER Y -FF3A ; mapped ; 007A # 1.1 FULLWIDTH LATIN CAPITAL LETTER Z -FF3B ; disallowed_STD3_mapped ; 005B # 1.1 FULLWIDTH LEFT SQUARE BRACKET -FF3C ; disallowed_STD3_mapped ; 005C # 1.1 FULLWIDTH REVERSE SOLIDUS -FF3D ; disallowed_STD3_mapped ; 005D # 1.1 FULLWIDTH RIGHT SQUARE BRACKET -FF3E ; disallowed_STD3_mapped ; 005E # 1.1 FULLWIDTH CIRCUMFLEX ACCENT -FF3F ; disallowed_STD3_mapped ; 005F # 1.1 FULLWIDTH LOW LINE -FF40 ; disallowed_STD3_mapped ; 0060 # 1.1 FULLWIDTH GRAVE ACCENT -FF41 ; mapped ; 0061 # 1.1 FULLWIDTH LATIN SMALL LETTER A -FF42 ; mapped ; 0062 # 1.1 FULLWIDTH LATIN SMALL LETTER B -FF43 ; mapped ; 0063 # 1.1 FULLWIDTH LATIN SMALL LETTER C -FF44 ; mapped ; 0064 # 1.1 FULLWIDTH LATIN SMALL LETTER D -FF45 ; mapped ; 0065 # 1.1 FULLWIDTH LATIN SMALL LETTER E -FF46 ; mapped ; 0066 # 1.1 FULLWIDTH LATIN SMALL LETTER F -FF47 ; mapped ; 0067 # 1.1 FULLWIDTH LATIN SMALL LETTER G -FF48 ; mapped ; 0068 # 1.1 FULLWIDTH LATIN SMALL LETTER H -FF49 ; mapped ; 0069 # 1.1 FULLWIDTH LATIN SMALL LETTER I -FF4A ; mapped ; 006A # 1.1 FULLWIDTH LATIN SMALL LETTER J -FF4B ; mapped ; 006B # 1.1 FULLWIDTH LATIN SMALL LETTER K -FF4C ; mapped ; 006C # 1.1 FULLWIDTH LATIN SMALL LETTER L -FF4D ; mapped ; 006D # 1.1 FULLWIDTH LATIN SMALL LETTER M -FF4E ; mapped ; 006E # 1.1 FULLWIDTH LATIN SMALL LETTER N -FF4F ; mapped ; 006F # 1.1 FULLWIDTH LATIN SMALL LETTER O -FF50 ; mapped ; 0070 # 1.1 FULLWIDTH LATIN SMALL LETTER P -FF51 ; mapped ; 0071 # 1.1 FULLWIDTH LATIN SMALL LETTER Q -FF52 ; mapped ; 0072 # 1.1 FULLWIDTH LATIN SMALL LETTER R -FF53 ; mapped ; 0073 # 1.1 FULLWIDTH LATIN SMALL LETTER S -FF54 ; mapped ; 0074 # 1.1 FULLWIDTH LATIN SMALL LETTER T -FF55 ; mapped ; 0075 # 1.1 FULLWIDTH LATIN SMALL LETTER U -FF56 ; mapped ; 0076 # 1.1 FULLWIDTH LATIN SMALL LETTER V -FF57 ; mapped ; 0077 # 1.1 FULLWIDTH LATIN SMALL LETTER W -FF58 ; mapped ; 0078 # 1.1 FULLWIDTH LATIN SMALL LETTER X -FF59 ; mapped ; 0079 # 1.1 FULLWIDTH LATIN SMALL LETTER Y -FF5A ; mapped ; 007A # 1.1 FULLWIDTH LATIN SMALL LETTER Z -FF5B ; disallowed_STD3_mapped ; 007B # 1.1 FULLWIDTH LEFT CURLY BRACKET -FF5C ; disallowed_STD3_mapped ; 007C # 1.1 FULLWIDTH VERTICAL LINE -FF5D ; disallowed_STD3_mapped ; 007D # 1.1 FULLWIDTH RIGHT CURLY BRACKET -FF5E ; disallowed_STD3_mapped ; 007E # 1.1 FULLWIDTH TILDE -FF5F ; mapped ; 2985 # 3.2 FULLWIDTH LEFT WHITE PARENTHESIS -FF60 ; mapped ; 2986 # 3.2 FULLWIDTH RIGHT WHITE PARENTHESIS -FF61 ; mapped ; 002E # 1.1 HALFWIDTH IDEOGRAPHIC FULL STOP -FF62 ; mapped ; 300C # 1.1 HALFWIDTH LEFT CORNER BRACKET -FF63 ; mapped ; 300D # 1.1 HALFWIDTH RIGHT CORNER BRACKET -FF64 ; mapped ; 3001 # 1.1 HALFWIDTH IDEOGRAPHIC COMMA -FF65 ; mapped ; 30FB # 1.1 HALFWIDTH KATAKANA MIDDLE DOT -FF66 ; mapped ; 30F2 # 1.1 HALFWIDTH KATAKANA LETTER WO -FF67 ; mapped ; 30A1 # 1.1 HALFWIDTH KATAKANA LETTER SMALL A -FF68 ; mapped ; 30A3 # 1.1 HALFWIDTH KATAKANA LETTER SMALL I -FF69 ; mapped ; 30A5 # 1.1 HALFWIDTH KATAKANA LETTER SMALL U -FF6A ; mapped ; 30A7 # 1.1 HALFWIDTH KATAKANA LETTER SMALL E -FF6B ; mapped ; 30A9 # 1.1 HALFWIDTH KATAKANA LETTER SMALL O -FF6C ; mapped ; 30E3 # 1.1 HALFWIDTH KATAKANA LETTER SMALL YA -FF6D ; mapped ; 30E5 # 1.1 HALFWIDTH KATAKANA LETTER SMALL YU -FF6E ; mapped ; 30E7 # 1.1 HALFWIDTH KATAKANA LETTER SMALL YO -FF6F ; mapped ; 30C3 # 1.1 HALFWIDTH KATAKANA LETTER SMALL TU -FF70 ; mapped ; 30FC # 1.1 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71 ; mapped ; 30A2 # 1.1 HALFWIDTH KATAKANA LETTER A -FF72 ; mapped ; 30A4 # 1.1 HALFWIDTH KATAKANA LETTER I -FF73 ; mapped ; 30A6 # 1.1 HALFWIDTH KATAKANA LETTER U -FF74 ; mapped ; 30A8 # 1.1 HALFWIDTH KATAKANA LETTER E -FF75 ; mapped ; 30AA # 1.1 HALFWIDTH KATAKANA LETTER O -FF76 ; mapped ; 30AB # 1.1 HALFWIDTH KATAKANA LETTER KA -FF77 ; mapped ; 30AD # 1.1 HALFWIDTH KATAKANA LETTER KI -FF78 ; mapped ; 30AF # 1.1 HALFWIDTH KATAKANA LETTER KU -FF79 ; mapped ; 30B1 # 1.1 HALFWIDTH KATAKANA LETTER KE -FF7A ; mapped ; 30B3 # 1.1 HALFWIDTH KATAKANA LETTER KO -FF7B ; mapped ; 30B5 # 1.1 HALFWIDTH KATAKANA LETTER SA -FF7C ; mapped ; 30B7 # 1.1 HALFWIDTH KATAKANA LETTER SI -FF7D ; mapped ; 30B9 # 1.1 HALFWIDTH KATAKANA LETTER SU -FF7E ; mapped ; 30BB # 1.1 HALFWIDTH KATAKANA LETTER SE -FF7F ; mapped ; 30BD # 1.1 HALFWIDTH KATAKANA LETTER SO -FF80 ; mapped ; 30BF # 1.1 HALFWIDTH KATAKANA LETTER TA -FF81 ; mapped ; 30C1 # 1.1 HALFWIDTH KATAKANA LETTER TI -FF82 ; mapped ; 30C4 # 1.1 HALFWIDTH KATAKANA LETTER TU -FF83 ; mapped ; 30C6 # 1.1 HALFWIDTH KATAKANA LETTER TE -FF84 ; mapped ; 30C8 # 1.1 HALFWIDTH KATAKANA LETTER TO -FF85 ; mapped ; 30CA # 1.1 HALFWIDTH KATAKANA LETTER NA -FF86 ; mapped ; 30CB # 1.1 HALFWIDTH KATAKANA LETTER NI -FF87 ; mapped ; 30CC # 1.1 HALFWIDTH KATAKANA LETTER NU -FF88 ; mapped ; 30CD # 1.1 HALFWIDTH KATAKANA LETTER NE -FF89 ; mapped ; 30CE # 1.1 HALFWIDTH KATAKANA LETTER NO -FF8A ; mapped ; 30CF # 1.1 HALFWIDTH KATAKANA LETTER HA -FF8B ; mapped ; 30D2 # 1.1 HALFWIDTH KATAKANA LETTER HI -FF8C ; mapped ; 30D5 # 1.1 HALFWIDTH KATAKANA LETTER HU -FF8D ; mapped ; 30D8 # 1.1 HALFWIDTH KATAKANA LETTER HE -FF8E ; mapped ; 30DB # 1.1 HALFWIDTH KATAKANA LETTER HO -FF8F ; mapped ; 30DE # 1.1 HALFWIDTH KATAKANA LETTER MA -FF90 ; mapped ; 30DF # 1.1 HALFWIDTH KATAKANA LETTER MI -FF91 ; mapped ; 30E0 # 1.1 HALFWIDTH KATAKANA LETTER MU -FF92 ; mapped ; 30E1 # 1.1 HALFWIDTH KATAKANA LETTER ME -FF93 ; mapped ; 30E2 # 1.1 HALFWIDTH KATAKANA LETTER MO -FF94 ; mapped ; 30E4 # 1.1 HALFWIDTH KATAKANA LETTER YA -FF95 ; mapped ; 30E6 # 1.1 HALFWIDTH KATAKANA LETTER YU -FF96 ; mapped ; 30E8 # 1.1 HALFWIDTH KATAKANA LETTER YO -FF97 ; mapped ; 30E9 # 1.1 HALFWIDTH KATAKANA LETTER RA -FF98 ; mapped ; 30EA # 1.1 HALFWIDTH KATAKANA LETTER RI -FF99 ; mapped ; 30EB # 1.1 HALFWIDTH KATAKANA LETTER RU -FF9A ; mapped ; 30EC # 1.1 HALFWIDTH KATAKANA LETTER RE -FF9B ; mapped ; 30ED # 1.1 HALFWIDTH KATAKANA LETTER RO -FF9C ; mapped ; 30EF # 1.1 HALFWIDTH KATAKANA LETTER WA -FF9D ; mapped ; 30F3 # 1.1 HALFWIDTH KATAKANA LETTER N -FF9E ; mapped ; 3099 # 1.1 HALFWIDTH KATAKANA VOICED SOUND MARK -FF9F ; mapped ; 309A # 1.1 HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFA0 ; disallowed # 1.1 HALFWIDTH HANGUL FILLER -FFA1 ; mapped ; 1100 # 1.1 HALFWIDTH HANGUL LETTER KIYEOK -FFA2 ; mapped ; 1101 # 1.1 HALFWIDTH HANGUL LETTER SSANGKIYEOK -FFA3 ; mapped ; 11AA # 1.1 HALFWIDTH HANGUL LETTER KIYEOK-SIOS -FFA4 ; mapped ; 1102 # 1.1 HALFWIDTH HANGUL LETTER NIEUN -FFA5 ; mapped ; 11AC # 1.1 HALFWIDTH HANGUL LETTER NIEUN-CIEUC -FFA6 ; mapped ; 11AD # 1.1 HALFWIDTH HANGUL LETTER NIEUN-HIEUH -FFA7 ; mapped ; 1103 # 1.1 HALFWIDTH HANGUL LETTER TIKEUT -FFA8 ; mapped ; 1104 # 1.1 HALFWIDTH HANGUL LETTER SSANGTIKEUT -FFA9 ; mapped ; 1105 # 1.1 HALFWIDTH HANGUL LETTER RIEUL -FFAA ; mapped ; 11B0 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-KIYEOK -FFAB ; mapped ; 11B1 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-MIEUM -FFAC ; mapped ; 11B2 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-PIEUP -FFAD ; mapped ; 11B3 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-SIOS -FFAE ; mapped ; 11B4 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-THIEUTH -FFAF ; mapped ; 11B5 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH -FFB0 ; mapped ; 111A # 1.1 HALFWIDTH HANGUL LETTER RIEUL-HIEUH -FFB1 ; mapped ; 1106 # 1.1 HALFWIDTH HANGUL LETTER MIEUM -FFB2 ; mapped ; 1107 # 1.1 HALFWIDTH HANGUL LETTER PIEUP -FFB3 ; mapped ; 1108 # 1.1 HALFWIDTH HANGUL LETTER SSANGPIEUP -FFB4 ; mapped ; 1121 # 1.1 HALFWIDTH HANGUL LETTER PIEUP-SIOS -FFB5 ; mapped ; 1109 # 1.1 HALFWIDTH HANGUL LETTER SIOS -FFB6 ; mapped ; 110A # 1.1 HALFWIDTH HANGUL LETTER SSANGSIOS -FFB7 ; mapped ; 110B # 1.1 HALFWIDTH HANGUL LETTER IEUNG -FFB8 ; mapped ; 110C # 1.1 HALFWIDTH HANGUL LETTER CIEUC -FFB9 ; mapped ; 110D # 1.1 HALFWIDTH HANGUL LETTER SSANGCIEUC -FFBA ; mapped ; 110E # 1.1 HALFWIDTH HANGUL LETTER CHIEUCH -FFBB ; mapped ; 110F # 1.1 HALFWIDTH HANGUL LETTER KHIEUKH -FFBC ; mapped ; 1110 # 1.1 HALFWIDTH HANGUL LETTER THIEUTH -FFBD ; mapped ; 1111 # 1.1 HALFWIDTH HANGUL LETTER PHIEUPH -FFBE ; mapped ; 1112 # 1.1 HALFWIDTH HANGUL LETTER HIEUH -FFBF..FFC1 ; disallowed # NA .. -FFC2 ; mapped ; 1161 # 1.1 HALFWIDTH HANGUL LETTER A -FFC3 ; mapped ; 1162 # 1.1 HALFWIDTH HANGUL LETTER AE -FFC4 ; mapped ; 1163 # 1.1 HALFWIDTH HANGUL LETTER YA -FFC5 ; mapped ; 1164 # 1.1 HALFWIDTH HANGUL LETTER YAE -FFC6 ; mapped ; 1165 # 1.1 HALFWIDTH HANGUL LETTER EO -FFC7 ; mapped ; 1166 # 1.1 HALFWIDTH HANGUL LETTER E -FFC8..FFC9 ; disallowed # NA .. -FFCA ; mapped ; 1167 # 1.1 HALFWIDTH HANGUL LETTER YEO -FFCB ; mapped ; 1168 # 1.1 HALFWIDTH HANGUL LETTER YE -FFCC ; mapped ; 1169 # 1.1 HALFWIDTH HANGUL LETTER O -FFCD ; mapped ; 116A # 1.1 HALFWIDTH HANGUL LETTER WA -FFCE ; mapped ; 116B # 1.1 HALFWIDTH HANGUL LETTER WAE -FFCF ; mapped ; 116C # 1.1 HALFWIDTH HANGUL LETTER OE -FFD0..FFD1 ; disallowed # NA .. -FFD2 ; mapped ; 116D # 1.1 HALFWIDTH HANGUL LETTER YO -FFD3 ; mapped ; 116E # 1.1 HALFWIDTH HANGUL LETTER U -FFD4 ; mapped ; 116F # 1.1 HALFWIDTH HANGUL LETTER WEO -FFD5 ; mapped ; 1170 # 1.1 HALFWIDTH HANGUL LETTER WE -FFD6 ; mapped ; 1171 # 1.1 HALFWIDTH HANGUL LETTER WI -FFD7 ; mapped ; 1172 # 1.1 HALFWIDTH HANGUL LETTER YU -FFD8..FFD9 ; disallowed # NA .. -FFDA ; mapped ; 1173 # 1.1 HALFWIDTH HANGUL LETTER EU -FFDB ; mapped ; 1174 # 1.1 HALFWIDTH HANGUL LETTER YI -FFDC ; mapped ; 1175 # 1.1 HALFWIDTH HANGUL LETTER I -FFDD..FFDF ; disallowed # NA .. -FFE0 ; mapped ; 00A2 # 1.1 FULLWIDTH CENT SIGN -FFE1 ; mapped ; 00A3 # 1.1 FULLWIDTH POUND SIGN -FFE2 ; mapped ; 00AC # 1.1 FULLWIDTH NOT SIGN -FFE3 ; disallowed_STD3_mapped ; 0020 0304 # 1.1 FULLWIDTH MACRON -FFE4 ; mapped ; 00A6 # 1.1 FULLWIDTH BROKEN BAR -FFE5 ; mapped ; 00A5 # 1.1 FULLWIDTH YEN SIGN -FFE6 ; mapped ; 20A9 # 1.1 FULLWIDTH WON SIGN -FFE7 ; disallowed # NA -FFE8 ; mapped ; 2502 # 1.1 HALFWIDTH FORMS LIGHT VERTICAL -FFE9 ; mapped ; 2190 # 1.1 HALFWIDTH LEFTWARDS ARROW -FFEA ; mapped ; 2191 # 1.1 HALFWIDTH UPWARDS ARROW -FFEB ; mapped ; 2192 # 1.1 HALFWIDTH RIGHTWARDS ARROW -FFEC ; mapped ; 2193 # 1.1 HALFWIDTH DOWNWARDS ARROW -FFED ; mapped ; 25A0 # 1.1 HALFWIDTH BLACK SQUARE -FFEE ; mapped ; 25CB # 1.1 HALFWIDTH WHITE CIRCLE -FFEF..FFF8 ; disallowed # NA .. -FFF9..FFFB ; disallowed # 3.0 INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -FFFC ; disallowed # 2.1 OBJECT REPLACEMENT CHARACTER -FFFD ; disallowed # 1.1 REPLACEMENT CHARACTER -FFFE..FFFF ; disallowed # 1.1 .. -10000..1000B ; valid # 4.0 LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000C ; disallowed # NA -1000D..10026 ; valid # 4.0 LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10027 ; disallowed # NA -10028..1003A ; valid # 4.0 LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003B ; disallowed # NA -1003C..1003D ; valid # 4.0 LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003E ; disallowed # NA -1003F..1004D ; valid # 4.0 LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -1004E..1004F ; disallowed # NA .. -10050..1005D ; valid # 4.0 LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -1005E..1007F ; disallowed # NA .. -10080..100FA ; valid # 4.0 LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -100FB..100FF ; disallowed # NA .. -10100..10102 ; valid ; ; NV8 # 4.0 AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK -10103..10106 ; disallowed # NA .. -10107..10133 ; valid ; ; NV8 # 4.0 AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND -10134..10136 ; disallowed # NA .. -10137..1013F ; valid ; ; NV8 # 4.0 AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT -10140..1018A ; valid ; ; NV8 # 4.1 GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ZERO SIGN -1018B..1018C ; valid ; ; NV8 # 7.0 GREEK ONE QUARTER SIGN..GREEK SINUSOID SIGN -1018D..1018E ; valid ; ; NV8 # 9.0 GREEK INDICTION SIGN..NOMISMA SIGN -1018F ; disallowed # NA -10190..1019B ; valid ; ; NV8 # 5.1 ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN -1019C..1019F ; disallowed # NA .. -101A0 ; valid ; ; NV8 # 7.0 GREEK SYMBOL TAU RHO -101A1..101CF ; disallowed # NA .. -101D0..101FC ; valid ; ; NV8 # 5.1 PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND -101FD ; valid # 5.1 PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -101FE..1027F ; disallowed # NA .. -10280..1029C ; valid # 5.1 LYCIAN LETTER A..LYCIAN LETTER X -1029D..1029F ; disallowed # NA .. -102A0..102D0 ; valid # 5.1 CARIAN LETTER A..CARIAN LETTER UUU3 -102D1..102DF ; disallowed # NA .. -102E0 ; valid # 7.0 COPTIC EPACT THOUSANDS MARK -102E1..102FB ; valid ; ; NV8 # 7.0 COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED -102FC..102FF ; disallowed # NA .. -10300..1031E ; valid # 3.1 OLD ITALIC LETTER A..OLD ITALIC LETTER UU -1031F ; valid # 7.0 OLD ITALIC LETTER ESS -10320..10323 ; valid ; ; NV8 # 3.1 OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY -10324..1032C ; disallowed # NA .. -1032D..1032F ; valid # 10.0 OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE -10330..10340 ; valid # 3.1 GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA -10341 ; valid ; ; NV8 # 3.1 GOTHIC LETTER NINETY -10342..10349 ; valid # 3.1 GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL -1034A ; valid ; ; NV8 # 3.1 GOTHIC LETTER NINE HUNDRED -1034B..1034F ; disallowed # NA .. -10350..1037A ; valid # 7.0 OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII -1037B..1037F ; disallowed # NA .. -10380..1039D ; valid # 4.0 UGARITIC LETTER ALPA..UGARITIC LETTER SSU -1039E ; disallowed # NA -1039F ; valid ; ; NV8 # 4.0 UGARITIC WORD DIVIDER -103A0..103C3 ; valid # 4.1 OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA -103C4..103C7 ; disallowed # NA .. -103C8..103CF ; valid # 4.1 OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH -103D0..103D5 ; valid ; ; NV8 # 4.1 OLD PERSIAN WORD DIVIDER..OLD PERSIAN NUMBER HUNDRED -103D6..103FF ; disallowed # NA .. -10400 ; mapped ; 10428 # 3.1 DESERET CAPITAL LETTER LONG I -10401 ; mapped ; 10429 # 3.1 DESERET CAPITAL LETTER LONG E -10402 ; mapped ; 1042A # 3.1 DESERET CAPITAL LETTER LONG A -10403 ; mapped ; 1042B # 3.1 DESERET CAPITAL LETTER LONG AH -10404 ; mapped ; 1042C # 3.1 DESERET CAPITAL LETTER LONG O -10405 ; mapped ; 1042D # 3.1 DESERET CAPITAL LETTER LONG OO -10406 ; mapped ; 1042E # 3.1 DESERET CAPITAL LETTER SHORT I -10407 ; mapped ; 1042F # 3.1 DESERET CAPITAL LETTER SHORT E -10408 ; mapped ; 10430 # 3.1 DESERET CAPITAL LETTER SHORT A -10409 ; mapped ; 10431 # 3.1 DESERET CAPITAL LETTER SHORT AH -1040A ; mapped ; 10432 # 3.1 DESERET CAPITAL LETTER SHORT O -1040B ; mapped ; 10433 # 3.1 DESERET CAPITAL LETTER SHORT OO -1040C ; mapped ; 10434 # 3.1 DESERET CAPITAL LETTER AY -1040D ; mapped ; 10435 # 3.1 DESERET CAPITAL LETTER OW -1040E ; mapped ; 10436 # 3.1 DESERET CAPITAL LETTER WU -1040F ; mapped ; 10437 # 3.1 DESERET CAPITAL LETTER YEE -10410 ; mapped ; 10438 # 3.1 DESERET CAPITAL LETTER H -10411 ; mapped ; 10439 # 3.1 DESERET CAPITAL LETTER PEE -10412 ; mapped ; 1043A # 3.1 DESERET CAPITAL LETTER BEE -10413 ; mapped ; 1043B # 3.1 DESERET CAPITAL LETTER TEE -10414 ; mapped ; 1043C # 3.1 DESERET CAPITAL LETTER DEE -10415 ; mapped ; 1043D # 3.1 DESERET CAPITAL LETTER CHEE -10416 ; mapped ; 1043E # 3.1 DESERET CAPITAL LETTER JEE -10417 ; mapped ; 1043F # 3.1 DESERET CAPITAL LETTER KAY -10418 ; mapped ; 10440 # 3.1 DESERET CAPITAL LETTER GAY -10419 ; mapped ; 10441 # 3.1 DESERET CAPITAL LETTER EF -1041A ; mapped ; 10442 # 3.1 DESERET CAPITAL LETTER VEE -1041B ; mapped ; 10443 # 3.1 DESERET CAPITAL LETTER ETH -1041C ; mapped ; 10444 # 3.1 DESERET CAPITAL LETTER THEE -1041D ; mapped ; 10445 # 3.1 DESERET CAPITAL LETTER ES -1041E ; mapped ; 10446 # 3.1 DESERET CAPITAL LETTER ZEE -1041F ; mapped ; 10447 # 3.1 DESERET CAPITAL LETTER ESH -10420 ; mapped ; 10448 # 3.1 DESERET CAPITAL LETTER ZHEE -10421 ; mapped ; 10449 # 3.1 DESERET CAPITAL LETTER ER -10422 ; mapped ; 1044A # 3.1 DESERET CAPITAL LETTER EL -10423 ; mapped ; 1044B # 3.1 DESERET CAPITAL LETTER EM -10424 ; mapped ; 1044C # 3.1 DESERET CAPITAL LETTER EN -10425 ; mapped ; 1044D # 3.1 DESERET CAPITAL LETTER ENG -10426 ; mapped ; 1044E # 4.0 DESERET CAPITAL LETTER OI -10427 ; mapped ; 1044F # 4.0 DESERET CAPITAL LETTER EW -10428..1044D ; valid # 3.1 DESERET SMALL LETTER LONG I..DESERET SMALL LETTER ENG -1044E..1049D ; valid # 4.0 DESERET SMALL LETTER OI..OSMANYA LETTER OO -1049E..1049F ; disallowed # NA .. -104A0..104A9 ; valid # 4.0 OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE -104AA..104AF ; disallowed # NA .. -104B0 ; mapped ; 104D8 # 9.0 OSAGE CAPITAL LETTER A -104B1 ; mapped ; 104D9 # 9.0 OSAGE CAPITAL LETTER AI -104B2 ; mapped ; 104DA # 9.0 OSAGE CAPITAL LETTER AIN -104B3 ; mapped ; 104DB # 9.0 OSAGE CAPITAL LETTER AH -104B4 ; mapped ; 104DC # 9.0 OSAGE CAPITAL LETTER BRA -104B5 ; mapped ; 104DD # 9.0 OSAGE CAPITAL LETTER CHA -104B6 ; mapped ; 104DE # 9.0 OSAGE CAPITAL LETTER EHCHA -104B7 ; mapped ; 104DF # 9.0 OSAGE CAPITAL LETTER E -104B8 ; mapped ; 104E0 # 9.0 OSAGE CAPITAL LETTER EIN -104B9 ; mapped ; 104E1 # 9.0 OSAGE CAPITAL LETTER HA -104BA ; mapped ; 104E2 # 9.0 OSAGE CAPITAL LETTER HYA -104BB ; mapped ; 104E3 # 9.0 OSAGE CAPITAL LETTER I -104BC ; mapped ; 104E4 # 9.0 OSAGE CAPITAL LETTER KA -104BD ; mapped ; 104E5 # 9.0 OSAGE CAPITAL LETTER EHKA -104BE ; mapped ; 104E6 # 9.0 OSAGE CAPITAL LETTER KYA -104BF ; mapped ; 104E7 # 9.0 OSAGE CAPITAL LETTER LA -104C0 ; mapped ; 104E8 # 9.0 OSAGE CAPITAL LETTER MA -104C1 ; mapped ; 104E9 # 9.0 OSAGE CAPITAL LETTER NA -104C2 ; mapped ; 104EA # 9.0 OSAGE CAPITAL LETTER O -104C3 ; mapped ; 104EB # 9.0 OSAGE CAPITAL LETTER OIN -104C4 ; mapped ; 104EC # 9.0 OSAGE CAPITAL LETTER PA -104C5 ; mapped ; 104ED # 9.0 OSAGE CAPITAL LETTER EHPA -104C6 ; mapped ; 104EE # 9.0 OSAGE CAPITAL LETTER SA -104C7 ; mapped ; 104EF # 9.0 OSAGE CAPITAL LETTER SHA -104C8 ; mapped ; 104F0 # 9.0 OSAGE CAPITAL LETTER TA -104C9 ; mapped ; 104F1 # 9.0 OSAGE CAPITAL LETTER EHTA -104CA ; mapped ; 104F2 # 9.0 OSAGE CAPITAL LETTER TSA -104CB ; mapped ; 104F3 # 9.0 OSAGE CAPITAL LETTER EHTSA -104CC ; mapped ; 104F4 # 9.0 OSAGE CAPITAL LETTER TSHA -104CD ; mapped ; 104F5 # 9.0 OSAGE CAPITAL LETTER DHA -104CE ; mapped ; 104F6 # 9.0 OSAGE CAPITAL LETTER U -104CF ; mapped ; 104F7 # 9.0 OSAGE CAPITAL LETTER WA -104D0 ; mapped ; 104F8 # 9.0 OSAGE CAPITAL LETTER KHA -104D1 ; mapped ; 104F9 # 9.0 OSAGE CAPITAL LETTER GHA -104D2 ; mapped ; 104FA # 9.0 OSAGE CAPITAL LETTER ZA -104D3 ; mapped ; 104FB # 9.0 OSAGE CAPITAL LETTER ZHA -104D4..104D7 ; disallowed # NA .. -104D8..104FB ; valid # 9.0 OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA -104FC..104FF ; disallowed # NA .. -10500..10527 ; valid # 7.0 ELBASAN LETTER A..ELBASAN LETTER KHE -10528..1052F ; disallowed # NA .. -10530..10563 ; valid # 7.0 CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW -10564..1056E ; disallowed # NA .. -1056F ; valid ; ; NV8 # 7.0 CAUCASIAN ALBANIAN CITATION MARK -10570..105FF ; disallowed # NA .. -10600..10736 ; valid # 7.0 LINEAR A SIGN AB001..LINEAR A SIGN A664 -10737..1073F ; disallowed # NA .. -10740..10755 ; valid # 7.0 LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE -10756..1075F ; disallowed # NA .. -10760..10767 ; valid # 7.0 LINEAR A SIGN A800..LINEAR A SIGN A807 -10768..107FF ; disallowed # NA .. -10800..10805 ; valid # 4.0 CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10806..10807 ; disallowed # NA .. -10808 ; valid # 4.0 CYPRIOT SYLLABLE JO -10809 ; disallowed # NA -1080A..10835 ; valid # 4.0 CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10836 ; disallowed # NA -10837..10838 ; valid # 4.0 CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -10839..1083B ; disallowed # NA .. -1083C ; valid # 4.0 CYPRIOT SYLLABLE ZA -1083D..1083E ; disallowed # NA .. -1083F ; valid # 4.0 CYPRIOT SYLLABLE ZO -10840..10855 ; valid # 5.2 IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW -10856 ; disallowed # NA -10857..1085F ; valid ; ; NV8 # 5.2 IMPERIAL ARAMAIC SECTION SIGN..IMPERIAL ARAMAIC NUMBER TEN THOUSAND -10860..10876 ; valid # 7.0 PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW -10877..1087F ; valid ; ; NV8 # 7.0 PALMYRENE LEFT-POINTING FLEURON..PALMYRENE NUMBER TWENTY -10880..1089E ; valid # 7.0 NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW -1089F..108A6 ; disallowed # NA .. -108A7..108AF ; valid ; ; NV8 # 7.0 NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED -108B0..108DF ; disallowed # NA .. -108E0..108F2 ; valid # 8.0 HATRAN LETTER ALEPH..HATRAN LETTER QOPH -108F3 ; disallowed # NA -108F4..108F5 ; valid # 8.0 HATRAN LETTER SHIN..HATRAN LETTER TAW -108F6..108FA ; disallowed # NA .. -108FB..108FF ; valid ; ; NV8 # 8.0 HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED -10900..10915 ; valid # 5.0 PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU -10916..10919 ; valid ; ; NV8 # 5.0 PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED -1091A..1091B ; valid ; ; NV8 # 5.2 PHOENICIAN NUMBER TWO..PHOENICIAN NUMBER THREE -1091C..1091E ; disallowed # NA .. -1091F ; valid ; ; NV8 # 5.0 PHOENICIAN WORD SEPARATOR -10920..10939 ; valid # 5.1 LYDIAN LETTER A..LYDIAN LETTER C -1093A..1093E ; disallowed # NA .. -1093F ; valid ; ; NV8 # 5.1 LYDIAN TRIANGULAR MARK -10940..1097F ; disallowed # NA .. -10980..109B7 ; valid # 6.1 MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA -109B8..109BB ; disallowed # NA .. -109BC..109BD ; valid ; ; NV8 # 8.0 MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF -109BE..109BF ; valid # 6.1 MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN -109C0..109CF ; valid ; ; NV8 # 8.0 MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY -109D0..109D1 ; disallowed # NA .. -109D2..109FF ; valid ; ; NV8 # 8.0 MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS -10A00..10A03 ; valid # 4.1 KHAROSHTHI LETTER A..KHAROSHTHI VOWEL SIGN VOCALIC R -10A04 ; disallowed # NA -10A05..10A06 ; valid # 4.1 KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O -10A07..10A0B ; disallowed # NA .. -10A0C..10A13 ; valid # 4.1 KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI LETTER GHA -10A14 ; disallowed # NA -10A15..10A17 ; valid # 4.1 KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA -10A18 ; disallowed # NA -10A19..10A33 ; valid # 4.1 KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA -10A34..10A37 ; disallowed # NA .. -10A38..10A3A ; valid # 4.1 KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW -10A3B..10A3E ; disallowed # NA .. -10A3F ; valid # 4.1 KHAROSHTHI VIRAMA -10A40..10A47 ; valid ; ; NV8 # 4.1 KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND -10A48..10A4F ; disallowed # NA .. -10A50..10A58 ; valid ; ; NV8 # 4.1 KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES -10A59..10A5F ; disallowed # NA .. -10A60..10A7C ; valid # 5.2 OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH -10A7D..10A7F ; valid ; ; NV8 # 5.2 OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMERIC INDICATOR -10A80..10A9C ; valid # 7.0 OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH -10A9D..10A9F ; valid ; ; NV8 # 7.0 OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY -10AA0..10ABF ; disallowed # NA .. -10AC0..10AC7 ; valid # 7.0 MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW -10AC8 ; valid ; ; NV8 # 7.0 MANICHAEAN SIGN UD -10AC9..10AE6 ; valid # 7.0 MANICHAEAN LETTER ZAYIN..MANICHAEAN ABBREVIATION MARK BELOW -10AE7..10AEA ; disallowed # NA .. -10AEB..10AF6 ; valid ; ; NV8 # 7.0 MANICHAEAN NUMBER ONE..MANICHAEAN PUNCTUATION LINE FILLER -10AF7..10AFF ; disallowed # NA .. -10B00..10B35 ; valid # 5.2 AVESTAN LETTER A..AVESTAN LETTER HE -10B36..10B38 ; disallowed # NA .. -10B39..10B3F ; valid ; ; NV8 # 5.2 AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION -10B40..10B55 ; valid # 5.2 INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW -10B56..10B57 ; disallowed # NA .. -10B58..10B5F ; valid ; ; NV8 # 5.2 INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND -10B60..10B72 ; valid # 5.2 INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW -10B73..10B77 ; disallowed # NA .. -10B78..10B7F ; valid ; ; NV8 # 5.2 INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND -10B80..10B91 ; valid # 7.0 PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW -10B92..10B98 ; disallowed # NA .. -10B99..10B9C ; valid ; ; NV8 # 7.0 PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT -10B9D..10BA8 ; disallowed # NA .. -10BA9..10BAF ; valid ; ; NV8 # 7.0 PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED -10BB0..10BFF ; disallowed # NA .. -10C00..10C48 ; valid # 5.2 OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH -10C49..10C7F ; disallowed # NA .. -10C80 ; mapped ; 10CC0 # 8.0 OLD HUNGARIAN CAPITAL LETTER A -10C81 ; mapped ; 10CC1 # 8.0 OLD HUNGARIAN CAPITAL LETTER AA -10C82 ; mapped ; 10CC2 # 8.0 OLD HUNGARIAN CAPITAL LETTER EB -10C83 ; mapped ; 10CC3 # 8.0 OLD HUNGARIAN CAPITAL LETTER AMB -10C84 ; mapped ; 10CC4 # 8.0 OLD HUNGARIAN CAPITAL LETTER EC -10C85 ; mapped ; 10CC5 # 8.0 OLD HUNGARIAN CAPITAL LETTER ENC -10C86 ; mapped ; 10CC6 # 8.0 OLD HUNGARIAN CAPITAL LETTER ECS -10C87 ; mapped ; 10CC7 # 8.0 OLD HUNGARIAN CAPITAL LETTER ED -10C88 ; mapped ; 10CC8 # 8.0 OLD HUNGARIAN CAPITAL LETTER AND -10C89 ; mapped ; 10CC9 # 8.0 OLD HUNGARIAN CAPITAL LETTER E -10C8A ; mapped ; 10CCA # 8.0 OLD HUNGARIAN CAPITAL LETTER CLOSE E -10C8B ; mapped ; 10CCB # 8.0 OLD HUNGARIAN CAPITAL LETTER EE -10C8C ; mapped ; 10CCC # 8.0 OLD HUNGARIAN CAPITAL LETTER EF -10C8D ; mapped ; 10CCD # 8.0 OLD HUNGARIAN CAPITAL LETTER EG -10C8E ; mapped ; 10CCE # 8.0 OLD HUNGARIAN CAPITAL LETTER EGY -10C8F ; mapped ; 10CCF # 8.0 OLD HUNGARIAN CAPITAL LETTER EH -10C90 ; mapped ; 10CD0 # 8.0 OLD HUNGARIAN CAPITAL LETTER I -10C91 ; mapped ; 10CD1 # 8.0 OLD HUNGARIAN CAPITAL LETTER II -10C92 ; mapped ; 10CD2 # 8.0 OLD HUNGARIAN CAPITAL LETTER EJ -10C93 ; mapped ; 10CD3 # 8.0 OLD HUNGARIAN CAPITAL LETTER EK -10C94 ; mapped ; 10CD4 # 8.0 OLD HUNGARIAN CAPITAL LETTER AK -10C95 ; mapped ; 10CD5 # 8.0 OLD HUNGARIAN CAPITAL LETTER UNK -10C96 ; mapped ; 10CD6 # 8.0 OLD HUNGARIAN CAPITAL LETTER EL -10C97 ; mapped ; 10CD7 # 8.0 OLD HUNGARIAN CAPITAL LETTER ELY -10C98 ; mapped ; 10CD8 # 8.0 OLD HUNGARIAN CAPITAL LETTER EM -10C99 ; mapped ; 10CD9 # 8.0 OLD HUNGARIAN CAPITAL LETTER EN -10C9A ; mapped ; 10CDA # 8.0 OLD HUNGARIAN CAPITAL LETTER ENY -10C9B ; mapped ; 10CDB # 8.0 OLD HUNGARIAN CAPITAL LETTER O -10C9C ; mapped ; 10CDC # 8.0 OLD HUNGARIAN CAPITAL LETTER OO -10C9D ; mapped ; 10CDD # 8.0 OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE -10C9E ; mapped ; 10CDE # 8.0 OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE -10C9F ; mapped ; 10CDF # 8.0 OLD HUNGARIAN CAPITAL LETTER OEE -10CA0 ; mapped ; 10CE0 # 8.0 OLD HUNGARIAN CAPITAL LETTER EP -10CA1 ; mapped ; 10CE1 # 8.0 OLD HUNGARIAN CAPITAL LETTER EMP -10CA2 ; mapped ; 10CE2 # 8.0 OLD HUNGARIAN CAPITAL LETTER ER -10CA3 ; mapped ; 10CE3 # 8.0 OLD HUNGARIAN CAPITAL LETTER SHORT ER -10CA4 ; mapped ; 10CE4 # 8.0 OLD HUNGARIAN CAPITAL LETTER ES -10CA5 ; mapped ; 10CE5 # 8.0 OLD HUNGARIAN CAPITAL LETTER ESZ -10CA6 ; mapped ; 10CE6 # 8.0 OLD HUNGARIAN CAPITAL LETTER ET -10CA7 ; mapped ; 10CE7 # 8.0 OLD HUNGARIAN CAPITAL LETTER ENT -10CA8 ; mapped ; 10CE8 # 8.0 OLD HUNGARIAN CAPITAL LETTER ETY -10CA9 ; mapped ; 10CE9 # 8.0 OLD HUNGARIAN CAPITAL LETTER ECH -10CAA ; mapped ; 10CEA # 8.0 OLD HUNGARIAN CAPITAL LETTER U -10CAB ; mapped ; 10CEB # 8.0 OLD HUNGARIAN CAPITAL LETTER UU -10CAC ; mapped ; 10CEC # 8.0 OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE -10CAD ; mapped ; 10CED # 8.0 OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE -10CAE ; mapped ; 10CEE # 8.0 OLD HUNGARIAN CAPITAL LETTER EV -10CAF ; mapped ; 10CEF # 8.0 OLD HUNGARIAN CAPITAL LETTER EZ -10CB0 ; mapped ; 10CF0 # 8.0 OLD HUNGARIAN CAPITAL LETTER EZS -10CB1 ; mapped ; 10CF1 # 8.0 OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN -10CB2 ; mapped ; 10CF2 # 8.0 OLD HUNGARIAN CAPITAL LETTER US -10CB3..10CBF ; disallowed # NA .. -10CC0..10CF2 ; valid # 8.0 OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US -10CF3..10CF9 ; disallowed # NA .. -10CFA..10CFF ; valid ; ; NV8 # 8.0 OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND -10D00..10E5F ; disallowed # NA .. -10E60..10E7E ; valid ; ; NV8 # 5.2 RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS -10E7F..10FFF ; disallowed # NA .. -11000..11046 ; valid # 6.0 BRAHMI SIGN CANDRABINDU..BRAHMI VIRAMA -11047..1104D ; valid ; ; NV8 # 6.0 BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS -1104E..11051 ; disallowed # NA .. -11052..11065 ; valid ; ; NV8 # 6.0 BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND -11066..1106F ; valid # 6.0 BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE -11070..1107E ; disallowed # NA .. -1107F ; valid # 7.0 BRAHMI NUMBER JOINER -11080..110BA ; valid # 5.2 KAITHI SIGN CANDRABINDU..KAITHI SIGN NUKTA -110BB..110BC ; valid ; ; NV8 # 5.2 KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN -110BD ; disallowed # 5.2 KAITHI NUMBER SIGN -110BE..110C1 ; valid ; ; NV8 # 5.2 KAITHI SECTION MARK..KAITHI DOUBLE DANDA -110C2..110CF ; disallowed # NA .. -110D0..110E8 ; valid # 6.1 SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE -110E9..110EF ; disallowed # NA .. -110F0..110F9 ; valid # 6.1 SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE -110FA..110FF ; disallowed # NA .. -11100..11134 ; valid # 6.1 CHAKMA SIGN CANDRABINDU..CHAKMA MAAYYAA -11135 ; disallowed # NA -11136..1113F ; valid # 6.1 CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE -11140..11143 ; valid ; ; NV8 # 6.1 CHAKMA SECTION MARK..CHAKMA QUESTION MARK -11144..1114F ; disallowed # NA .. -11150..11173 ; valid # 7.0 MAHAJANI LETTER A..MAHAJANI SIGN NUKTA -11174..11175 ; valid ; ; NV8 # 7.0 MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK -11176 ; valid # 7.0 MAHAJANI LIGATURE SHRI -11177..1117F ; disallowed # NA .. -11180..111C4 ; valid # 6.1 SHARADA SIGN CANDRABINDU..SHARADA OM -111C5..111C8 ; valid ; ; NV8 # 6.1 SHARADA DANDA..SHARADA SEPARATOR -111C9 ; valid ; ; NV8 # 8.0 SHARADA SANDHI MARK -111CA..111CC ; valid # 8.0 SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK -111CD ; valid ; ; NV8 # 7.0 SHARADA SUTRA MARK -111CE..111CF ; disallowed # NA .. -111D0..111D9 ; valid # 6.1 SHARADA DIGIT ZERO..SHARADA DIGIT NINE -111DA ; valid # 7.0 SHARADA EKAM -111DB ; valid ; ; NV8 # 8.0 SHARADA SIGN SIDDHAM -111DC ; valid # 8.0 SHARADA HEADSTROKE -111DD..111DF ; valid ; ; NV8 # 8.0 SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 -111E0 ; disallowed # NA -111E1..111F4 ; valid ; ; NV8 # 7.0 SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND -111F5..111FF ; disallowed # NA .. -11200..11211 ; valid # 7.0 KHOJKI LETTER A..KHOJKI LETTER JJA -11212 ; disallowed # NA -11213..11237 ; valid # 7.0 KHOJKI LETTER NYA..KHOJKI SIGN SHADDA -11238..1123D ; valid ; ; NV8 # 7.0 KHOJKI DANDA..KHOJKI ABBREVIATION SIGN -1123E ; valid # 9.0 KHOJKI SIGN SUKUN -1123F..1127F ; disallowed # NA .. -11280..11286 ; valid # 8.0 MULTANI LETTER A..MULTANI LETTER GA -11287 ; disallowed # NA -11288 ; valid # 8.0 MULTANI LETTER GHA -11289 ; disallowed # NA -1128A..1128D ; valid # 8.0 MULTANI LETTER CA..MULTANI LETTER JJA -1128E ; disallowed # NA -1128F..1129D ; valid # 8.0 MULTANI LETTER NYA..MULTANI LETTER BA -1129E ; disallowed # NA -1129F..112A8 ; valid # 8.0 MULTANI LETTER BHA..MULTANI LETTER RHA -112A9 ; valid ; ; NV8 # 8.0 MULTANI SECTION MARK -112AA..112AF ; disallowed # NA .. -112B0..112EA ; valid # 7.0 KHUDAWADI LETTER A..KHUDAWADI SIGN VIRAMA -112EB..112EF ; disallowed # NA .. -112F0..112F9 ; valid # 7.0 KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE -112FA..112FF ; disallowed # NA .. -11300 ; valid # 8.0 GRANTHA SIGN COMBINING ANUSVARA ABOVE -11301..11303 ; valid # 7.0 GRANTHA SIGN CANDRABINDU..GRANTHA SIGN VISARGA -11304 ; disallowed # NA -11305..1130C ; valid # 7.0 GRANTHA LETTER A..GRANTHA LETTER VOCALIC L -1130D..1130E ; disallowed # NA .. -1130F..11310 ; valid # 7.0 GRANTHA LETTER EE..GRANTHA LETTER AI -11311..11312 ; disallowed # NA .. -11313..11328 ; valid # 7.0 GRANTHA LETTER OO..GRANTHA LETTER NA -11329 ; disallowed # NA -1132A..11330 ; valid # 7.0 GRANTHA LETTER PA..GRANTHA LETTER RA -11331 ; disallowed # NA -11332..11333 ; valid # 7.0 GRANTHA LETTER LA..GRANTHA LETTER LLA -11334 ; disallowed # NA -11335..11339 ; valid # 7.0 GRANTHA LETTER VA..GRANTHA LETTER HA -1133A..1133B ; disallowed # NA .. -1133C..11344 ; valid # 7.0 GRANTHA SIGN NUKTA..GRANTHA VOWEL SIGN VOCALIC RR -11345..11346 ; disallowed # NA .. -11347..11348 ; valid # 7.0 GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI -11349..1134A ; disallowed # NA .. -1134B..1134D ; valid # 7.0 GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA -1134E..1134F ; disallowed # NA .. -11350 ; valid # 8.0 GRANTHA OM -11351..11356 ; disallowed # NA .. -11357 ; valid # 7.0 GRANTHA AU LENGTH MARK -11358..1135C ; disallowed # NA .. -1135D..11363 ; valid # 7.0 GRANTHA SIGN PLUTA..GRANTHA VOWEL SIGN VOCALIC LL -11364..11365 ; disallowed # NA .. -11366..1136C ; valid # 7.0 COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX -1136D..1136F ; disallowed # NA .. -11370..11374 ; valid # 7.0 COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA -11375..113FF ; disallowed # NA .. -11400..1144A ; valid # 9.0 NEWA LETTER A..NEWA SIDDHI -1144B..1144F ; valid ; ; NV8 # 9.0 NEWA DANDA..NEWA ABBREVIATION SIGN -11450..11459 ; valid # 9.0 NEWA DIGIT ZERO..NEWA DIGIT NINE -1145A ; disallowed # NA -1145B ; valid ; ; NV8 # 9.0 NEWA PLACEHOLDER MARK -1145C ; disallowed # NA -1145D ; valid ; ; NV8 # 9.0 NEWA INSERTION SIGN -1145E..1147F ; disallowed # NA .. -11480..114C5 ; valid # 7.0 TIRHUTA ANJI..TIRHUTA GVANG -114C6 ; valid ; ; NV8 # 7.0 TIRHUTA ABBREVIATION SIGN -114C7 ; valid # 7.0 TIRHUTA OM -114C8..114CF ; disallowed # NA .. -114D0..114D9 ; valid # 7.0 TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE -114DA..1157F ; disallowed # NA .. -11580..115B5 ; valid # 7.0 SIDDHAM LETTER A..SIDDHAM VOWEL SIGN VOCALIC RR -115B6..115B7 ; disallowed # NA .. -115B8..115C0 ; valid # 7.0 SIDDHAM VOWEL SIGN E..SIDDHAM SIGN NUKTA -115C1..115C9 ; valid ; ; NV8 # 7.0 SIDDHAM SIGN SIDDHAM..SIDDHAM END OF TEXT MARK -115CA..115D7 ; valid ; ; NV8 # 8.0 SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES -115D8..115DD ; valid # 8.0 SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM VOWEL SIGN ALTERNATE UU -115DE..115FF ; disallowed # NA .. -11600..11640 ; valid # 7.0 MODI LETTER A..MODI SIGN ARDHACANDRA -11641..11643 ; valid ; ; NV8 # 7.0 MODI DANDA..MODI ABBREVIATION SIGN -11644 ; valid # 7.0 MODI SIGN HUVA -11645..1164F ; disallowed # NA .. -11650..11659 ; valid # 7.0 MODI DIGIT ZERO..MODI DIGIT NINE -1165A..1165F ; disallowed # NA .. -11660..1166C ; valid ; ; NV8 # 9.0 MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT -1166D..1167F ; disallowed # NA .. -11680..116B7 ; valid # 6.1 TAKRI LETTER A..TAKRI SIGN NUKTA -116B8..116BF ; disallowed # NA .. -116C0..116C9 ; valid # 6.1 TAKRI DIGIT ZERO..TAKRI DIGIT NINE -116CA..116FF ; disallowed # NA .. -11700..11719 ; valid # 8.0 AHOM LETTER KA..AHOM LETTER JHA -1171A..1171C ; disallowed # NA .. -1171D..1172B ; valid # 8.0 AHOM CONSONANT SIGN MEDIAL LA..AHOM SIGN KILLER -1172C..1172F ; disallowed # NA .. -11730..11739 ; valid # 8.0 AHOM DIGIT ZERO..AHOM DIGIT NINE -1173A..1173F ; valid ; ; NV8 # 8.0 AHOM NUMBER TEN..AHOM SYMBOL VI -11740..1189F ; disallowed # NA .. -118A0 ; mapped ; 118C0 # 7.0 WARANG CITI CAPITAL LETTER NGAA -118A1 ; mapped ; 118C1 # 7.0 WARANG CITI CAPITAL LETTER A -118A2 ; mapped ; 118C2 # 7.0 WARANG CITI CAPITAL LETTER WI -118A3 ; mapped ; 118C3 # 7.0 WARANG CITI CAPITAL LETTER YU -118A4 ; mapped ; 118C4 # 7.0 WARANG CITI CAPITAL LETTER YA -118A5 ; mapped ; 118C5 # 7.0 WARANG CITI CAPITAL LETTER YO -118A6 ; mapped ; 118C6 # 7.0 WARANG CITI CAPITAL LETTER II -118A7 ; mapped ; 118C7 # 7.0 WARANG CITI CAPITAL LETTER UU -118A8 ; mapped ; 118C8 # 7.0 WARANG CITI CAPITAL LETTER E -118A9 ; mapped ; 118C9 # 7.0 WARANG CITI CAPITAL LETTER O -118AA ; mapped ; 118CA # 7.0 WARANG CITI CAPITAL LETTER ANG -118AB ; mapped ; 118CB # 7.0 WARANG CITI CAPITAL LETTER GA -118AC ; mapped ; 118CC # 7.0 WARANG CITI CAPITAL LETTER KO -118AD ; mapped ; 118CD # 7.0 WARANG CITI CAPITAL LETTER ENY -118AE ; mapped ; 118CE # 7.0 WARANG CITI CAPITAL LETTER YUJ -118AF ; mapped ; 118CF # 7.0 WARANG CITI CAPITAL LETTER UC -118B0 ; mapped ; 118D0 # 7.0 WARANG CITI CAPITAL LETTER ENN -118B1 ; mapped ; 118D1 # 7.0 WARANG CITI CAPITAL LETTER ODD -118B2 ; mapped ; 118D2 # 7.0 WARANG CITI CAPITAL LETTER TTE -118B3 ; mapped ; 118D3 # 7.0 WARANG CITI CAPITAL LETTER NUNG -118B4 ; mapped ; 118D4 # 7.0 WARANG CITI CAPITAL LETTER DA -118B5 ; mapped ; 118D5 # 7.0 WARANG CITI CAPITAL LETTER AT -118B6 ; mapped ; 118D6 # 7.0 WARANG CITI CAPITAL LETTER AM -118B7 ; mapped ; 118D7 # 7.0 WARANG CITI CAPITAL LETTER BU -118B8 ; mapped ; 118D8 # 7.0 WARANG CITI CAPITAL LETTER PU -118B9 ; mapped ; 118D9 # 7.0 WARANG CITI CAPITAL LETTER HIYO -118BA ; mapped ; 118DA # 7.0 WARANG CITI CAPITAL LETTER HOLO -118BB ; mapped ; 118DB # 7.0 WARANG CITI CAPITAL LETTER HORR -118BC ; mapped ; 118DC # 7.0 WARANG CITI CAPITAL LETTER HAR -118BD ; mapped ; 118DD # 7.0 WARANG CITI CAPITAL LETTER SSUU -118BE ; mapped ; 118DE # 7.0 WARANG CITI CAPITAL LETTER SII -118BF ; mapped ; 118DF # 7.0 WARANG CITI CAPITAL LETTER VIYO -118C0..118E9 ; valid # 7.0 WARANG CITI SMALL LETTER NGAA..WARANG CITI DIGIT NINE -118EA..118F2 ; valid ; ; NV8 # 7.0 WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY -118F3..118FE ; disallowed # NA .. -118FF ; valid # 7.0 WARANG CITI OM -11900..119FF ; disallowed # NA .. -11A00..11A3E ; valid # 10.0 ZANABAZAR SQUARE LETTER A..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA -11A3F..11A46 ; valid ; ; NV8 # 10.0 ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK -11A47 ; valid # 10.0 ZANABAZAR SQUARE SUBJOINER -11A48..11A4F ; disallowed # NA .. -11A50..11A83 ; valid # 10.0 SOYOMBO LETTER A..SOYOMBO LETTER KSSA -11A84..11A85 ; disallowed # NA .. -11A86..11A99 ; valid # 10.0 SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO SUBJOINER -11A9A..11A9C ; valid ; ; NV8 # 10.0 SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD -11A9D ; disallowed # NA -11A9E..11AA2 ; valid ; ; NV8 # 10.0 SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 -11AA3..11ABF ; disallowed # NA .. -11AC0..11AF8 ; valid # 7.0 PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL -11AF9..11BFF ; disallowed # NA .. -11C00..11C08 ; valid # 9.0 BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L -11C09 ; disallowed # NA -11C0A..11C36 ; valid # 9.0 BHAIKSUKI LETTER E..BHAIKSUKI VOWEL SIGN VOCALIC L -11C37 ; disallowed # NA -11C38..11C40 ; valid # 9.0 BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN AVAGRAHA -11C41..11C45 ; valid ; ; NV8 # 9.0 BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 -11C46..11C4F ; disallowed # NA .. -11C50..11C59 ; valid # 9.0 BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE -11C5A..11C6C ; valid ; ; NV8 # 9.0 BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK -11C6D..11C6F ; disallowed # NA .. -11C70..11C71 ; valid ; ; NV8 # 9.0 MARCHEN HEAD MARK..MARCHEN MARK SHAD -11C72..11C8F ; valid # 9.0 MARCHEN LETTER KA..MARCHEN LETTER A -11C90..11C91 ; disallowed # NA .. -11C92..11CA7 ; valid # 9.0 MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA -11CA8 ; disallowed # NA -11CA9..11CB6 ; valid # 9.0 MARCHEN SUBJOINED LETTER YA..MARCHEN SIGN CANDRABINDU -11CB7..11CFF ; disallowed # NA .. -11D00..11D06 ; valid # 10.0 MASARAM GONDI LETTER A..MASARAM GONDI LETTER E -11D07 ; disallowed # NA -11D08..11D09 ; valid # 10.0 MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O -11D0A ; disallowed # NA -11D0B..11D36 ; valid # 10.0 MASARAM GONDI LETTER AU..MASARAM GONDI VOWEL SIGN VOCALIC R -11D37..11D39 ; disallowed # NA .. -11D3A ; valid # 10.0 MASARAM GONDI VOWEL SIGN E -11D3B ; disallowed # NA -11D3C..11D3D ; valid # 10.0 MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O -11D3E ; disallowed # NA -11D3F..11D47 ; valid # 10.0 MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI RA-KARA -11D48..11D4F ; disallowed # NA .. -11D50..11D59 ; valid # 10.0 MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE -11D5A..11FFF ; disallowed # NA .. -12000..1236E ; valid # 5.0 CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM -1236F..12398 ; valid # 7.0 CUNEIFORM SIGN KAP ELAMITE..CUNEIFORM SIGN UM TIMES ME -12399 ; valid # 8.0 CUNEIFORM SIGN U U -1239A..123FF ; disallowed # NA .. -12400..12462 ; valid ; ; NV8 # 5.0 CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER -12463..1246E ; valid ; ; NV8 # 7.0 CUNEIFORM NUMERIC SIGN ONE QUARTER GUR..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM -1246F ; disallowed # NA -12470..12473 ; valid ; ; NV8 # 5.0 CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON -12474 ; valid ; ; NV8 # 7.0 CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON -12475..1247F ; disallowed # NA .. -12480..12543 ; valid # 8.0 CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU -12544..12FFF ; disallowed # NA .. -13000..1342E ; valid # 5.2 EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 -1342F..143FF ; disallowed # NA .. -14400..14646 ; valid # 8.0 ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 -14647..167FF ; disallowed # NA .. -16800..16A38 ; valid # 6.0 BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ -16A39..16A3F ; disallowed # NA .. -16A40..16A5E ; valid # 7.0 MRO LETTER TA..MRO LETTER TEK -16A5F ; disallowed # NA -16A60..16A69 ; valid # 7.0 MRO DIGIT ZERO..MRO DIGIT NINE -16A6A..16A6D ; disallowed # NA .. -16A6E..16A6F ; valid ; ; NV8 # 7.0 MRO DANDA..MRO DOUBLE DANDA -16A70..16ACF ; disallowed # NA .. -16AD0..16AED ; valid # 7.0 BASSA VAH LETTER ENNI..BASSA VAH LETTER I -16AEE..16AEF ; disallowed # NA .. -16AF0..16AF4 ; valid # 7.0 BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE -16AF5 ; valid ; ; NV8 # 7.0 BASSA VAH FULL STOP -16AF6..16AFF ; disallowed # NA .. -16B00..16B36 ; valid # 7.0 PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG MARK CIM TAUM -16B37..16B3F ; valid ; ; NV8 # 7.0 PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN XYEEM FAIB -16B40..16B43 ; valid # 7.0 PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM -16B44..16B45 ; valid ; ; NV8 # 7.0 PAHAWH HMONG SIGN XAUS..PAHAWH HMONG SIGN CIM TSOV ROG -16B46..16B4F ; disallowed # NA .. -16B50..16B59 ; valid # 7.0 PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE -16B5A ; disallowed # NA -16B5B..16B61 ; valid ; ; NV8 # 7.0 PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS -16B62 ; disallowed # NA -16B63..16B77 ; valid # 7.0 PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS -16B78..16B7C ; disallowed # NA .. -16B7D..16B8F ; valid # 7.0 PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ -16B90..16EFF ; disallowed # NA .. -16F00..16F44 ; valid # 6.1 MIAO LETTER PA..MIAO LETTER HHA -16F45..16F4F ; disallowed # NA .. -16F50..16F7E ; valid # 6.1 MIAO LETTER NASALIZATION..MIAO VOWEL SIGN NG -16F7F..16F8E ; disallowed # NA .. -16F8F..16F9F ; valid # 6.1 MIAO TONE RIGHT..MIAO LETTER REFORMED TONE-8 -16FA0..16FDF ; disallowed # NA .. -16FE0 ; valid # 9.0 TANGUT ITERATION MARK -16FE1 ; valid # 10.0 NUSHU ITERATION MARK -16FE2..16FFF ; disallowed # NA .. -17000..187EC ; valid # 9.0 TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC -187ED..187FF ; disallowed # NA .. -18800..18AF2 ; valid # 9.0 TANGUT COMPONENT-001..TANGUT COMPONENT-755 -18AF3..1AFFF ; disallowed # NA .. -1B000..1B001 ; valid # 6.0 KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE -1B002..1B11E ; valid # 10.0 HENTAIGANA LETTER A-1..HENTAIGANA LETTER N-MU-MO-2 -1B11F..1B16F ; disallowed # NA .. -1B170..1B2FB ; valid # 10.0 NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB -1B2FC..1BBFF ; disallowed # NA .. -1BC00..1BC6A ; valid # 7.0 DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M -1BC6B..1BC6F ; disallowed # NA .. -1BC70..1BC7C ; valid # 7.0 DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK -1BC7D..1BC7F ; disallowed # NA .. -1BC80..1BC88 ; valid # 7.0 DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL -1BC89..1BC8F ; disallowed # NA .. -1BC90..1BC99 ; valid # 7.0 DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW -1BC9A..1BC9B ; disallowed # NA .. -1BC9C ; valid ; ; NV8 # 7.0 DUPLOYAN SIGN O WITH CROSS -1BC9D..1BC9E ; valid # 7.0 DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK -1BC9F ; valid ; ; NV8 # 7.0 DUPLOYAN PUNCTUATION CHINOOK FULL STOP -1BCA0..1BCA3 ; ignored # 7.0 SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP -1BCA4..1CFFF ; disallowed # NA .. -1D000..1D0F5 ; valid ; ; NV8 # 3.1 BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO -1D0F6..1D0FF ; disallowed # NA .. -1D100..1D126 ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 -1D127..1D128 ; disallowed # NA .. -1D129 ; valid ; ; NV8 # 5.1 MUSICAL SYMBOL MULTIPLE MEASURE REST -1D12A..1D15D ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL WHOLE NOTE -1D15E ; mapped ; 1D157 1D165 # 3.1 MUSICAL SYMBOL HALF NOTE -1D15F ; mapped ; 1D158 1D165 # 3.1 MUSICAL SYMBOL QUARTER NOTE -1D160 ; mapped ; 1D158 1D165 1D16E #3.1 MUSICAL SYMBOL EIGHTH NOTE -1D161 ; mapped ; 1D158 1D165 1D16F #3.1 MUSICAL SYMBOL SIXTEENTH NOTE -1D162 ; mapped ; 1D158 1D165 1D170 #3.1 MUSICAL SYMBOL THIRTY-SECOND NOTE -1D163 ; mapped ; 1D158 1D165 1D171 #3.1 MUSICAL SYMBOL SIXTY-FOURTH NOTE -1D164 ; mapped ; 1D158 1D165 1D172 #3.1 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE -1D165..1D172 ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING FLAG-5 -1D173..1D17A ; disallowed # 3.1 MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -1D17B..1D1BA ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL SEMIBREVIS BLACK -1D1BB ; mapped ; 1D1B9 1D165 # 3.1 MUSICAL SYMBOL MINIMA -1D1BC ; mapped ; 1D1BA 1D165 # 3.1 MUSICAL SYMBOL MINIMA BLACK -1D1BD ; mapped ; 1D1B9 1D165 1D16E #3.1 MUSICAL SYMBOL SEMIMINIMA WHITE -1D1BE ; mapped ; 1D1BA 1D165 1D16E #3.1 MUSICAL SYMBOL SEMIMINIMA BLACK -1D1BF ; mapped ; 1D1B9 1D165 1D16F #3.1 MUSICAL SYMBOL FUSA WHITE -1D1C0 ; mapped ; 1D1BA 1D165 1D16F #3.1 MUSICAL SYMBOL FUSA BLACK -1D1C1..1D1DD ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL LONGA PERFECTA REST..MUSICAL SYMBOL PES SUBPUNCTIS -1D1DE..1D1E8 ; valid ; ; NV8 # 8.0 MUSICAL SYMBOL KIEVAN C CLEF..MUSICAL SYMBOL KIEVAN FLAT SIGN -1D1E9..1D1FF ; disallowed # NA .. -1D200..1D245 ; valid ; ; NV8 # 4.1 GREEK VOCAL NOTATION SYMBOL-1..GREEK MUSICAL LEIMMA -1D246..1D2FF ; disallowed # NA .. -1D300..1D356 ; valid ; ; NV8 # 4.0 MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING -1D357..1D35F ; disallowed # NA .. -1D360..1D371 ; valid ; ; NV8 # 5.0 COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE -1D372..1D3FF ; disallowed # NA .. -1D400 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD CAPITAL A -1D401 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD CAPITAL B -1D402 ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD CAPITAL C -1D403 ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD CAPITAL D -1D404 ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD CAPITAL E -1D405 ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD CAPITAL F -1D406 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD CAPITAL G -1D407 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD CAPITAL H -1D408 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD CAPITAL I -1D409 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD CAPITAL J -1D40A ; mapped ; 006B # 3.1 MATHEMATICAL BOLD CAPITAL K -1D40B ; mapped ; 006C # 3.1 MATHEMATICAL BOLD CAPITAL L -1D40C ; mapped ; 006D # 3.1 MATHEMATICAL BOLD CAPITAL M -1D40D ; mapped ; 006E # 3.1 MATHEMATICAL BOLD CAPITAL N -1D40E ; mapped ; 006F # 3.1 MATHEMATICAL BOLD CAPITAL O -1D40F ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD CAPITAL P -1D410 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD CAPITAL Q -1D411 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD CAPITAL R -1D412 ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD CAPITAL S -1D413 ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD CAPITAL T -1D414 ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD CAPITAL U -1D415 ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD CAPITAL V -1D416 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD CAPITAL W -1D417 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD CAPITAL X -1D418 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD CAPITAL Y -1D419 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD CAPITAL Z -1D41A ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD SMALL A -1D41B ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD SMALL B -1D41C ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD SMALL C -1D41D ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD SMALL D -1D41E ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD SMALL E -1D41F ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD SMALL F -1D420 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD SMALL G -1D421 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD SMALL H -1D422 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD SMALL I -1D423 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD SMALL J -1D424 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD SMALL K -1D425 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD SMALL L -1D426 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD SMALL M -1D427 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD SMALL N -1D428 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD SMALL O -1D429 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD SMALL P -1D42A ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD SMALL Q -1D42B ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD SMALL R -1D42C ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD SMALL S -1D42D ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD SMALL T -1D42E ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD SMALL U -1D42F ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD SMALL V -1D430 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD SMALL W -1D431 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD SMALL X -1D432 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD SMALL Y -1D433 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD SMALL Z -1D434 ; mapped ; 0061 # 3.1 MATHEMATICAL ITALIC CAPITAL A -1D435 ; mapped ; 0062 # 3.1 MATHEMATICAL ITALIC CAPITAL B -1D436 ; mapped ; 0063 # 3.1 MATHEMATICAL ITALIC CAPITAL C -1D437 ; mapped ; 0064 # 3.1 MATHEMATICAL ITALIC CAPITAL D -1D438 ; mapped ; 0065 # 3.1 MATHEMATICAL ITALIC CAPITAL E -1D439 ; mapped ; 0066 # 3.1 MATHEMATICAL ITALIC CAPITAL F -1D43A ; mapped ; 0067 # 3.1 MATHEMATICAL ITALIC CAPITAL G -1D43B ; mapped ; 0068 # 3.1 MATHEMATICAL ITALIC CAPITAL H -1D43C ; mapped ; 0069 # 3.1 MATHEMATICAL ITALIC CAPITAL I -1D43D ; mapped ; 006A # 3.1 MATHEMATICAL ITALIC CAPITAL J -1D43E ; mapped ; 006B # 3.1 MATHEMATICAL ITALIC CAPITAL K -1D43F ; mapped ; 006C # 3.1 MATHEMATICAL ITALIC CAPITAL L -1D440 ; mapped ; 006D # 3.1 MATHEMATICAL ITALIC CAPITAL M -1D441 ; mapped ; 006E # 3.1 MATHEMATICAL ITALIC CAPITAL N -1D442 ; mapped ; 006F # 3.1 MATHEMATICAL ITALIC CAPITAL O -1D443 ; mapped ; 0070 # 3.1 MATHEMATICAL ITALIC CAPITAL P -1D444 ; mapped ; 0071 # 3.1 MATHEMATICAL ITALIC CAPITAL Q -1D445 ; mapped ; 0072 # 3.1 MATHEMATICAL ITALIC CAPITAL R -1D446 ; mapped ; 0073 # 3.1 MATHEMATICAL ITALIC CAPITAL S -1D447 ; mapped ; 0074 # 3.1 MATHEMATICAL ITALIC CAPITAL T -1D448 ; mapped ; 0075 # 3.1 MATHEMATICAL ITALIC CAPITAL U -1D449 ; mapped ; 0076 # 3.1 MATHEMATICAL ITALIC CAPITAL V -1D44A ; mapped ; 0077 # 3.1 MATHEMATICAL ITALIC CAPITAL W -1D44B ; mapped ; 0078 # 3.1 MATHEMATICAL ITALIC CAPITAL X -1D44C ; mapped ; 0079 # 3.1 MATHEMATICAL ITALIC CAPITAL Y -1D44D ; mapped ; 007A # 3.1 MATHEMATICAL ITALIC CAPITAL Z -1D44E ; mapped ; 0061 # 3.1 MATHEMATICAL ITALIC SMALL A -1D44F ; mapped ; 0062 # 3.1 MATHEMATICAL ITALIC SMALL B -1D450 ; mapped ; 0063 # 3.1 MATHEMATICAL ITALIC SMALL C -1D451 ; mapped ; 0064 # 3.1 MATHEMATICAL ITALIC SMALL D -1D452 ; mapped ; 0065 # 3.1 MATHEMATICAL ITALIC SMALL E -1D453 ; mapped ; 0066 # 3.1 MATHEMATICAL ITALIC SMALL F -1D454 ; mapped ; 0067 # 3.1 MATHEMATICAL ITALIC SMALL G -1D455 ; disallowed # NA -1D456 ; mapped ; 0069 # 3.1 MATHEMATICAL ITALIC SMALL I -1D457 ; mapped ; 006A # 3.1 MATHEMATICAL ITALIC SMALL J -1D458 ; mapped ; 006B # 3.1 MATHEMATICAL ITALIC SMALL K -1D459 ; mapped ; 006C # 3.1 MATHEMATICAL ITALIC SMALL L -1D45A ; mapped ; 006D # 3.1 MATHEMATICAL ITALIC SMALL M -1D45B ; mapped ; 006E # 3.1 MATHEMATICAL ITALIC SMALL N -1D45C ; mapped ; 006F # 3.1 MATHEMATICAL ITALIC SMALL O -1D45D ; mapped ; 0070 # 3.1 MATHEMATICAL ITALIC SMALL P -1D45E ; mapped ; 0071 # 3.1 MATHEMATICAL ITALIC SMALL Q -1D45F ; mapped ; 0072 # 3.1 MATHEMATICAL ITALIC SMALL R -1D460 ; mapped ; 0073 # 3.1 MATHEMATICAL ITALIC SMALL S -1D461 ; mapped ; 0074 # 3.1 MATHEMATICAL ITALIC SMALL T -1D462 ; mapped ; 0075 # 3.1 MATHEMATICAL ITALIC SMALL U -1D463 ; mapped ; 0076 # 3.1 MATHEMATICAL ITALIC SMALL V -1D464 ; mapped ; 0077 # 3.1 MATHEMATICAL ITALIC SMALL W -1D465 ; mapped ; 0078 # 3.1 MATHEMATICAL ITALIC SMALL X -1D466 ; mapped ; 0079 # 3.1 MATHEMATICAL ITALIC SMALL Y -1D467 ; mapped ; 007A # 3.1 MATHEMATICAL ITALIC SMALL Z -1D468 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL A -1D469 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL B -1D46A ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL C -1D46B ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL D -1D46C ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL E -1D46D ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL F -1D46E ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL G -1D46F ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL H -1D470 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL I -1D471 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL J -1D472 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL K -1D473 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL L -1D474 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL M -1D475 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL N -1D476 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL O -1D477 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL P -1D478 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL Q -1D479 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL R -1D47A ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL S -1D47B ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL T -1D47C ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL U -1D47D ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL V -1D47E ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL W -1D47F ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL X -1D480 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL Y -1D481 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL Z -1D482 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD ITALIC SMALL A -1D483 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD ITALIC SMALL B -1D484 ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD ITALIC SMALL C -1D485 ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD ITALIC SMALL D -1D486 ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD ITALIC SMALL E -1D487 ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD ITALIC SMALL F -1D488 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD ITALIC SMALL G -1D489 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD ITALIC SMALL H -1D48A ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD ITALIC SMALL I -1D48B ; mapped ; 006A # 3.1 MATHEMATICAL BOLD ITALIC SMALL J -1D48C ; mapped ; 006B # 3.1 MATHEMATICAL BOLD ITALIC SMALL K -1D48D ; mapped ; 006C # 3.1 MATHEMATICAL BOLD ITALIC SMALL L -1D48E ; mapped ; 006D # 3.1 MATHEMATICAL BOLD ITALIC SMALL M -1D48F ; mapped ; 006E # 3.1 MATHEMATICAL BOLD ITALIC SMALL N -1D490 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD ITALIC SMALL O -1D491 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD ITALIC SMALL P -1D492 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD ITALIC SMALL Q -1D493 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD ITALIC SMALL R -1D494 ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD ITALIC SMALL S -1D495 ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD ITALIC SMALL T -1D496 ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD ITALIC SMALL U -1D497 ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD ITALIC SMALL V -1D498 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD ITALIC SMALL W -1D499 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD ITALIC SMALL X -1D49A ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD ITALIC SMALL Y -1D49B ; mapped ; 007A # 3.1 MATHEMATICAL BOLD ITALIC SMALL Z -1D49C ; mapped ; 0061 # 3.1 MATHEMATICAL SCRIPT CAPITAL A -1D49D ; disallowed # NA -1D49E ; mapped ; 0063 # 3.1 MATHEMATICAL SCRIPT CAPITAL C -1D49F ; mapped ; 0064 # 3.1 MATHEMATICAL SCRIPT CAPITAL D -1D4A0..1D4A1 ; disallowed # NA .. -1D4A2 ; mapped ; 0067 # 3.1 MATHEMATICAL SCRIPT CAPITAL G -1D4A3..1D4A4 ; disallowed # NA .. -1D4A5 ; mapped ; 006A # 3.1 MATHEMATICAL SCRIPT CAPITAL J -1D4A6 ; mapped ; 006B # 3.1 MATHEMATICAL SCRIPT CAPITAL K -1D4A7..1D4A8 ; disallowed # NA .. -1D4A9 ; mapped ; 006E # 3.1 MATHEMATICAL SCRIPT CAPITAL N -1D4AA ; mapped ; 006F # 3.1 MATHEMATICAL SCRIPT CAPITAL O -1D4AB ; mapped ; 0070 # 3.1 MATHEMATICAL SCRIPT CAPITAL P -1D4AC ; mapped ; 0071 # 3.1 MATHEMATICAL SCRIPT CAPITAL Q -1D4AD ; disallowed # NA -1D4AE ; mapped ; 0073 # 3.1 MATHEMATICAL SCRIPT CAPITAL S -1D4AF ; mapped ; 0074 # 3.1 MATHEMATICAL SCRIPT CAPITAL T -1D4B0 ; mapped ; 0075 # 3.1 MATHEMATICAL SCRIPT CAPITAL U -1D4B1 ; mapped ; 0076 # 3.1 MATHEMATICAL SCRIPT CAPITAL V -1D4B2 ; mapped ; 0077 # 3.1 MATHEMATICAL SCRIPT CAPITAL W -1D4B3 ; mapped ; 0078 # 3.1 MATHEMATICAL SCRIPT CAPITAL X -1D4B4 ; mapped ; 0079 # 3.1 MATHEMATICAL SCRIPT CAPITAL Y -1D4B5 ; mapped ; 007A # 3.1 MATHEMATICAL SCRIPT CAPITAL Z -1D4B6 ; mapped ; 0061 # 3.1 MATHEMATICAL SCRIPT SMALL A -1D4B7 ; mapped ; 0062 # 3.1 MATHEMATICAL SCRIPT SMALL B -1D4B8 ; mapped ; 0063 # 3.1 MATHEMATICAL SCRIPT SMALL C -1D4B9 ; mapped ; 0064 # 3.1 MATHEMATICAL SCRIPT SMALL D -1D4BA ; disallowed # NA -1D4BB ; mapped ; 0066 # 3.1 MATHEMATICAL SCRIPT SMALL F -1D4BC ; disallowed # NA -1D4BD ; mapped ; 0068 # 3.1 MATHEMATICAL SCRIPT SMALL H -1D4BE ; mapped ; 0069 # 3.1 MATHEMATICAL SCRIPT SMALL I -1D4BF ; mapped ; 006A # 3.1 MATHEMATICAL SCRIPT SMALL J -1D4C0 ; mapped ; 006B # 3.1 MATHEMATICAL SCRIPT SMALL K -1D4C1 ; mapped ; 006C # 4.0 MATHEMATICAL SCRIPT SMALL L -1D4C2 ; mapped ; 006D # 3.1 MATHEMATICAL SCRIPT SMALL M -1D4C3 ; mapped ; 006E # 3.1 MATHEMATICAL SCRIPT SMALL N -1D4C4 ; disallowed # NA -1D4C5 ; mapped ; 0070 # 3.1 MATHEMATICAL SCRIPT SMALL P -1D4C6 ; mapped ; 0071 # 3.1 MATHEMATICAL SCRIPT SMALL Q -1D4C7 ; mapped ; 0072 # 3.1 MATHEMATICAL SCRIPT SMALL R -1D4C8 ; mapped ; 0073 # 3.1 MATHEMATICAL SCRIPT SMALL S -1D4C9 ; mapped ; 0074 # 3.1 MATHEMATICAL SCRIPT SMALL T -1D4CA ; mapped ; 0075 # 3.1 MATHEMATICAL SCRIPT SMALL U -1D4CB ; mapped ; 0076 # 3.1 MATHEMATICAL SCRIPT SMALL V -1D4CC ; mapped ; 0077 # 3.1 MATHEMATICAL SCRIPT SMALL W -1D4CD ; mapped ; 0078 # 3.1 MATHEMATICAL SCRIPT SMALL X -1D4CE ; mapped ; 0079 # 3.1 MATHEMATICAL SCRIPT SMALL Y -1D4CF ; mapped ; 007A # 3.1 MATHEMATICAL SCRIPT SMALL Z -1D4D0 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL A -1D4D1 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL B -1D4D2 ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL C -1D4D3 ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL D -1D4D4 ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL E -1D4D5 ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL F -1D4D6 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL G -1D4D7 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL H -1D4D8 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL I -1D4D9 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL J -1D4DA ; mapped ; 006B # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL K -1D4DB ; mapped ; 006C # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL L -1D4DC ; mapped ; 006D # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL M -1D4DD ; mapped ; 006E # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL N -1D4DE ; mapped ; 006F # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL O -1D4DF ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL P -1D4E0 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL Q -1D4E1 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL R -1D4E2 ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL S -1D4E3 ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL T -1D4E4 ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL U -1D4E5 ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL V -1D4E6 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL W -1D4E7 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL X -1D4E8 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL Y -1D4E9 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL Z -1D4EA ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL A -1D4EB ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL B -1D4EC ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL C -1D4ED ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL D -1D4EE ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL E -1D4EF ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL F -1D4F0 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL G -1D4F1 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL H -1D4F2 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL I -1D4F3 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD SCRIPT SMALL J -1D4F4 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD SCRIPT SMALL K -1D4F5 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD SCRIPT SMALL L -1D4F6 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD SCRIPT SMALL M -1D4F7 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD SCRIPT SMALL N -1D4F8 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD SCRIPT SMALL O -1D4F9 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL P -1D4FA ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL Q -1D4FB ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL R -1D4FC ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL S -1D4FD ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL T -1D4FE ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL U -1D4FF ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL V -1D500 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL W -1D501 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL X -1D502 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL Y -1D503 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD SCRIPT SMALL Z -1D504 ; mapped ; 0061 # 3.1 MATHEMATICAL FRAKTUR CAPITAL A -1D505 ; mapped ; 0062 # 3.1 MATHEMATICAL FRAKTUR CAPITAL B -1D506 ; disallowed # NA -1D507 ; mapped ; 0064 # 3.1 MATHEMATICAL FRAKTUR CAPITAL D -1D508 ; mapped ; 0065 # 3.1 MATHEMATICAL FRAKTUR CAPITAL E -1D509 ; mapped ; 0066 # 3.1 MATHEMATICAL FRAKTUR CAPITAL F -1D50A ; mapped ; 0067 # 3.1 MATHEMATICAL FRAKTUR CAPITAL G -1D50B..1D50C ; disallowed # NA .. -1D50D ; mapped ; 006A # 3.1 MATHEMATICAL FRAKTUR CAPITAL J -1D50E ; mapped ; 006B # 3.1 MATHEMATICAL FRAKTUR CAPITAL K -1D50F ; mapped ; 006C # 3.1 MATHEMATICAL FRAKTUR CAPITAL L -1D510 ; mapped ; 006D # 3.1 MATHEMATICAL FRAKTUR CAPITAL M -1D511 ; mapped ; 006E # 3.1 MATHEMATICAL FRAKTUR CAPITAL N -1D512 ; mapped ; 006F # 3.1 MATHEMATICAL FRAKTUR CAPITAL O -1D513 ; mapped ; 0070 # 3.1 MATHEMATICAL FRAKTUR CAPITAL P -1D514 ; mapped ; 0071 # 3.1 MATHEMATICAL FRAKTUR CAPITAL Q -1D515 ; disallowed # NA -1D516 ; mapped ; 0073 # 3.1 MATHEMATICAL FRAKTUR CAPITAL S -1D517 ; mapped ; 0074 # 3.1 MATHEMATICAL FRAKTUR CAPITAL T -1D518 ; mapped ; 0075 # 3.1 MATHEMATICAL FRAKTUR CAPITAL U -1D519 ; mapped ; 0076 # 3.1 MATHEMATICAL FRAKTUR CAPITAL V -1D51A ; mapped ; 0077 # 3.1 MATHEMATICAL FRAKTUR CAPITAL W -1D51B ; mapped ; 0078 # 3.1 MATHEMATICAL FRAKTUR CAPITAL X -1D51C ; mapped ; 0079 # 3.1 MATHEMATICAL FRAKTUR CAPITAL Y -1D51D ; disallowed # NA -1D51E ; mapped ; 0061 # 3.1 MATHEMATICAL FRAKTUR SMALL A -1D51F ; mapped ; 0062 # 3.1 MATHEMATICAL FRAKTUR SMALL B -1D520 ; mapped ; 0063 # 3.1 MATHEMATICAL FRAKTUR SMALL C -1D521 ; mapped ; 0064 # 3.1 MATHEMATICAL FRAKTUR SMALL D -1D522 ; mapped ; 0065 # 3.1 MATHEMATICAL FRAKTUR SMALL E -1D523 ; mapped ; 0066 # 3.1 MATHEMATICAL FRAKTUR SMALL F -1D524 ; mapped ; 0067 # 3.1 MATHEMATICAL FRAKTUR SMALL G -1D525 ; mapped ; 0068 # 3.1 MATHEMATICAL FRAKTUR SMALL H -1D526 ; mapped ; 0069 # 3.1 MATHEMATICAL FRAKTUR SMALL I -1D527 ; mapped ; 006A # 3.1 MATHEMATICAL FRAKTUR SMALL J -1D528 ; mapped ; 006B # 3.1 MATHEMATICAL FRAKTUR SMALL K -1D529 ; mapped ; 006C # 3.1 MATHEMATICAL FRAKTUR SMALL L -1D52A ; mapped ; 006D # 3.1 MATHEMATICAL FRAKTUR SMALL M -1D52B ; mapped ; 006E # 3.1 MATHEMATICAL FRAKTUR SMALL N -1D52C ; mapped ; 006F # 3.1 MATHEMATICAL FRAKTUR SMALL O -1D52D ; mapped ; 0070 # 3.1 MATHEMATICAL FRAKTUR SMALL P -1D52E ; mapped ; 0071 # 3.1 MATHEMATICAL FRAKTUR SMALL Q -1D52F ; mapped ; 0072 # 3.1 MATHEMATICAL FRAKTUR SMALL R -1D530 ; mapped ; 0073 # 3.1 MATHEMATICAL FRAKTUR SMALL S -1D531 ; mapped ; 0074 # 3.1 MATHEMATICAL FRAKTUR SMALL T -1D532 ; mapped ; 0075 # 3.1 MATHEMATICAL FRAKTUR SMALL U -1D533 ; mapped ; 0076 # 3.1 MATHEMATICAL FRAKTUR SMALL V -1D534 ; mapped ; 0077 # 3.1 MATHEMATICAL FRAKTUR SMALL W -1D535 ; mapped ; 0078 # 3.1 MATHEMATICAL FRAKTUR SMALL X -1D536 ; mapped ; 0079 # 3.1 MATHEMATICAL FRAKTUR SMALL Y -1D537 ; mapped ; 007A # 3.1 MATHEMATICAL FRAKTUR SMALL Z -1D538 ; mapped ; 0061 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL A -1D539 ; mapped ; 0062 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53A ; disallowed # NA -1D53B ; mapped ; 0064 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL D -1D53C ; mapped ; 0065 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL E -1D53D ; mapped ; 0066 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL F -1D53E ; mapped ; 0067 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D53F ; disallowed # NA -1D540 ; mapped ; 0069 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL I -1D541 ; mapped ; 006A # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL J -1D542 ; mapped ; 006B # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL K -1D543 ; mapped ; 006C # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL L -1D544 ; mapped ; 006D # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D545 ; disallowed # NA -1D546 ; mapped ; 006F # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D547..1D549 ; disallowed # NA .. -1D54A ; mapped ; 0073 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL S -1D54B ; mapped ; 0074 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL T -1D54C ; mapped ; 0075 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL U -1D54D ; mapped ; 0076 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL V -1D54E ; mapped ; 0077 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL W -1D54F ; mapped ; 0078 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL X -1D550 ; mapped ; 0079 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D551 ; disallowed # NA -1D552 ; mapped ; 0061 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL A -1D553 ; mapped ; 0062 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL B -1D554 ; mapped ; 0063 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL C -1D555 ; mapped ; 0064 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL D -1D556 ; mapped ; 0065 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL E -1D557 ; mapped ; 0066 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL F -1D558 ; mapped ; 0067 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL G -1D559 ; mapped ; 0068 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL H -1D55A ; mapped ; 0069 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL I -1D55B ; mapped ; 006A # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL J -1D55C ; mapped ; 006B # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL K -1D55D ; mapped ; 006C # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL L -1D55E ; mapped ; 006D # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL M -1D55F ; mapped ; 006E # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL N -1D560 ; mapped ; 006F # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL O -1D561 ; mapped ; 0070 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL P -1D562 ; mapped ; 0071 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL Q -1D563 ; mapped ; 0072 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL R -1D564 ; mapped ; 0073 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL S -1D565 ; mapped ; 0074 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL T -1D566 ; mapped ; 0075 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL U -1D567 ; mapped ; 0076 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL V -1D568 ; mapped ; 0077 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL W -1D569 ; mapped ; 0078 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL X -1D56A ; mapped ; 0079 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL Y -1D56B ; mapped ; 007A # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL Z -1D56C ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL A -1D56D ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL B -1D56E ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL C -1D56F ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL D -1D570 ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL E -1D571 ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL F -1D572 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL G -1D573 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL H -1D574 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL I -1D575 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL J -1D576 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL K -1D577 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL L -1D578 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL M -1D579 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL N -1D57A ; mapped ; 006F # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL O -1D57B ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL P -1D57C ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL Q -1D57D ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL R -1D57E ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL S -1D57F ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL T -1D580 ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL U -1D581 ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL V -1D582 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL W -1D583 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL X -1D584 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL Y -1D585 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL Z -1D586 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL A -1D587 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL B -1D588 ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL C -1D589 ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL D -1D58A ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL E -1D58B ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL F -1D58C ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL G -1D58D ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL H -1D58E ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL I -1D58F ; mapped ; 006A # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL J -1D590 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL K -1D591 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL L -1D592 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL M -1D593 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL N -1D594 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL O -1D595 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL P -1D596 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL Q -1D597 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL R -1D598 ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL S -1D599 ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL T -1D59A ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL U -1D59B ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL V -1D59C ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL W -1D59D ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL X -1D59E ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL Y -1D59F ; mapped ; 007A # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL Z -1D5A0 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL A -1D5A1 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL B -1D5A2 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL C -1D5A3 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL D -1D5A4 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL E -1D5A5 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL F -1D5A6 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL G -1D5A7 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL H -1D5A8 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL I -1D5A9 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF CAPITAL J -1D5AA ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF CAPITAL K -1D5AB ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF CAPITAL L -1D5AC ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF CAPITAL M -1D5AD ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF CAPITAL N -1D5AE ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF CAPITAL O -1D5AF ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL P -1D5B0 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL Q -1D5B1 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL R -1D5B2 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL S -1D5B3 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL T -1D5B4 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL U -1D5B5 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL V -1D5B6 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL W -1D5B7 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL X -1D5B8 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL Y -1D5B9 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF CAPITAL Z -1D5BA ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF SMALL A -1D5BB ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF SMALL B -1D5BC ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF SMALL C -1D5BD ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF SMALL D -1D5BE ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF SMALL E -1D5BF ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF SMALL F -1D5C0 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF SMALL G -1D5C1 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF SMALL H -1D5C2 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF SMALL I -1D5C3 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF SMALL J -1D5C4 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF SMALL K -1D5C5 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF SMALL L -1D5C6 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF SMALL M -1D5C7 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF SMALL N -1D5C8 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF SMALL O -1D5C9 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF SMALL P -1D5CA ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF SMALL Q -1D5CB ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF SMALL R -1D5CC ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF SMALL S -1D5CD ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF SMALL T -1D5CE ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF SMALL U -1D5CF ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF SMALL V -1D5D0 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF SMALL W -1D5D1 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF SMALL X -1D5D2 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF SMALL Y -1D5D3 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF SMALL Z -1D5D4 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL A -1D5D5 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL B -1D5D6 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL C -1D5D7 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL D -1D5D8 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL E -1D5D9 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL F -1D5DA ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL G -1D5DB ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL H -1D5DC ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL I -1D5DD ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL J -1D5DE ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL K -1D5DF ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL L -1D5E0 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL M -1D5E1 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL N -1D5E2 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL O -1D5E3 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL P -1D5E4 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL Q -1D5E5 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL R -1D5E6 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL S -1D5E7 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL T -1D5E8 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL U -1D5E9 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL V -1D5EA ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL W -1D5EB ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL X -1D5EC ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL Y -1D5ED ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL Z -1D5EE ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL A -1D5EF ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL B -1D5F0 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL C -1D5F1 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL D -1D5F2 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL E -1D5F3 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL F -1D5F4 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL G -1D5F5 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL H -1D5F6 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL I -1D5F7 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL J -1D5F8 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL K -1D5F9 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL L -1D5FA ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL M -1D5FB ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL N -1D5FC ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL O -1D5FD ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL P -1D5FE ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL Q -1D5FF ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL R -1D600 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL S -1D601 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL T -1D602 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL U -1D603 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL V -1D604 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL W -1D605 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL X -1D606 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL Y -1D607 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL Z -1D608 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL A -1D609 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL B -1D60A ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL C -1D60B ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL D -1D60C ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL E -1D60D ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL F -1D60E ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL G -1D60F ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL H -1D610 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL I -1D611 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL J -1D612 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL K -1D613 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL L -1D614 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL M -1D615 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL N -1D616 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL O -1D617 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL P -1D618 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q -1D619 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL R -1D61A ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL S -1D61B ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL T -1D61C ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL U -1D61D ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL V -1D61E ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL W -1D61F ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL X -1D620 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y -1D621 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z -1D622 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL A -1D623 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL B -1D624 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL C -1D625 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL D -1D626 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL E -1D627 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL F -1D628 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL G -1D629 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL H -1D62A ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL I -1D62B ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL J -1D62C ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL K -1D62D ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL L -1D62E ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL M -1D62F ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL N -1D630 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL O -1D631 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL P -1D632 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL Q -1D633 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL R -1D634 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL S -1D635 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL T -1D636 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL U -1D637 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL V -1D638 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL W -1D639 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL X -1D63A ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL Y -1D63B ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL Z -1D63C ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A -1D63D ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B -1D63E ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C -1D63F ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D -1D640 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E -1D641 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F -1D642 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G -1D643 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H -1D644 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I -1D645 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J -1D646 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K -1D647 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L -1D648 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M -1D649 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N -1D64A ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O -1D64B ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P -1D64C ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q -1D64D ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R -1D64E ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S -1D64F ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T -1D650 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U -1D651 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V -1D652 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W -1D653 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X -1D654 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y -1D655 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z -1D656 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A -1D657 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B -1D658 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C -1D659 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D -1D65A ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E -1D65B ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F -1D65C ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G -1D65D ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H -1D65E ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I -1D65F ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J -1D660 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K -1D661 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L -1D662 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M -1D663 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N -1D664 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O -1D665 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P -1D666 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q -1D667 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R -1D668 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S -1D669 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T -1D66A ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U -1D66B ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V -1D66C ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W -1D66D ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X -1D66E ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y -1D66F ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z -1D670 ; mapped ; 0061 # 3.1 MATHEMATICAL MONOSPACE CAPITAL A -1D671 ; mapped ; 0062 # 3.1 MATHEMATICAL MONOSPACE CAPITAL B -1D672 ; mapped ; 0063 # 3.1 MATHEMATICAL MONOSPACE CAPITAL C -1D673 ; mapped ; 0064 # 3.1 MATHEMATICAL MONOSPACE CAPITAL D -1D674 ; mapped ; 0065 # 3.1 MATHEMATICAL MONOSPACE CAPITAL E -1D675 ; mapped ; 0066 # 3.1 MATHEMATICAL MONOSPACE CAPITAL F -1D676 ; mapped ; 0067 # 3.1 MATHEMATICAL MONOSPACE CAPITAL G -1D677 ; mapped ; 0068 # 3.1 MATHEMATICAL MONOSPACE CAPITAL H -1D678 ; mapped ; 0069 # 3.1 MATHEMATICAL MONOSPACE CAPITAL I -1D679 ; mapped ; 006A # 3.1 MATHEMATICAL MONOSPACE CAPITAL J -1D67A ; mapped ; 006B # 3.1 MATHEMATICAL MONOSPACE CAPITAL K -1D67B ; mapped ; 006C # 3.1 MATHEMATICAL MONOSPACE CAPITAL L -1D67C ; mapped ; 006D # 3.1 MATHEMATICAL MONOSPACE CAPITAL M -1D67D ; mapped ; 006E # 3.1 MATHEMATICAL MONOSPACE CAPITAL N -1D67E ; mapped ; 006F # 3.1 MATHEMATICAL MONOSPACE CAPITAL O -1D67F ; mapped ; 0070 # 3.1 MATHEMATICAL MONOSPACE CAPITAL P -1D680 ; mapped ; 0071 # 3.1 MATHEMATICAL MONOSPACE CAPITAL Q -1D681 ; mapped ; 0072 # 3.1 MATHEMATICAL MONOSPACE CAPITAL R -1D682 ; mapped ; 0073 # 3.1 MATHEMATICAL MONOSPACE CAPITAL S -1D683 ; mapped ; 0074 # 3.1 MATHEMATICAL MONOSPACE CAPITAL T -1D684 ; mapped ; 0075 # 3.1 MATHEMATICAL MONOSPACE CAPITAL U -1D685 ; mapped ; 0076 # 3.1 MATHEMATICAL MONOSPACE CAPITAL V -1D686 ; mapped ; 0077 # 3.1 MATHEMATICAL MONOSPACE CAPITAL W -1D687 ; mapped ; 0078 # 3.1 MATHEMATICAL MONOSPACE CAPITAL X -1D688 ; mapped ; 0079 # 3.1 MATHEMATICAL MONOSPACE CAPITAL Y -1D689 ; mapped ; 007A # 3.1 MATHEMATICAL MONOSPACE CAPITAL Z -1D68A ; mapped ; 0061 # 3.1 MATHEMATICAL MONOSPACE SMALL A -1D68B ; mapped ; 0062 # 3.1 MATHEMATICAL MONOSPACE SMALL B -1D68C ; mapped ; 0063 # 3.1 MATHEMATICAL MONOSPACE SMALL C -1D68D ; mapped ; 0064 # 3.1 MATHEMATICAL MONOSPACE SMALL D -1D68E ; mapped ; 0065 # 3.1 MATHEMATICAL MONOSPACE SMALL E -1D68F ; mapped ; 0066 # 3.1 MATHEMATICAL MONOSPACE SMALL F -1D690 ; mapped ; 0067 # 3.1 MATHEMATICAL MONOSPACE SMALL G -1D691 ; mapped ; 0068 # 3.1 MATHEMATICAL MONOSPACE SMALL H -1D692 ; mapped ; 0069 # 3.1 MATHEMATICAL MONOSPACE SMALL I -1D693 ; mapped ; 006A # 3.1 MATHEMATICAL MONOSPACE SMALL J -1D694 ; mapped ; 006B # 3.1 MATHEMATICAL MONOSPACE SMALL K -1D695 ; mapped ; 006C # 3.1 MATHEMATICAL MONOSPACE SMALL L -1D696 ; mapped ; 006D # 3.1 MATHEMATICAL MONOSPACE SMALL M -1D697 ; mapped ; 006E # 3.1 MATHEMATICAL MONOSPACE SMALL N -1D698 ; mapped ; 006F # 3.1 MATHEMATICAL MONOSPACE SMALL O -1D699 ; mapped ; 0070 # 3.1 MATHEMATICAL MONOSPACE SMALL P -1D69A ; mapped ; 0071 # 3.1 MATHEMATICAL MONOSPACE SMALL Q -1D69B ; mapped ; 0072 # 3.1 MATHEMATICAL MONOSPACE SMALL R -1D69C ; mapped ; 0073 # 3.1 MATHEMATICAL MONOSPACE SMALL S -1D69D ; mapped ; 0074 # 3.1 MATHEMATICAL MONOSPACE SMALL T -1D69E ; mapped ; 0075 # 3.1 MATHEMATICAL MONOSPACE SMALL U -1D69F ; mapped ; 0076 # 3.1 MATHEMATICAL MONOSPACE SMALL V -1D6A0 ; mapped ; 0077 # 3.1 MATHEMATICAL MONOSPACE SMALL W -1D6A1 ; mapped ; 0078 # 3.1 MATHEMATICAL MONOSPACE SMALL X -1D6A2 ; mapped ; 0079 # 3.1 MATHEMATICAL MONOSPACE SMALL Y -1D6A3 ; mapped ; 007A # 3.1 MATHEMATICAL MONOSPACE SMALL Z -1D6A4 ; mapped ; 0131 # 4.1 MATHEMATICAL ITALIC SMALL DOTLESS I -1D6A5 ; mapped ; 0237 # 4.1 MATHEMATICAL ITALIC SMALL DOTLESS J -1D6A6..1D6A7 ; disallowed # NA .. -1D6A8 ; mapped ; 03B1 # 3.1 MATHEMATICAL BOLD CAPITAL ALPHA -1D6A9 ; mapped ; 03B2 # 3.1 MATHEMATICAL BOLD CAPITAL BETA -1D6AA ; mapped ; 03B3 # 3.1 MATHEMATICAL BOLD CAPITAL GAMMA -1D6AB ; mapped ; 03B4 # 3.1 MATHEMATICAL BOLD CAPITAL DELTA -1D6AC ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD CAPITAL EPSILON -1D6AD ; mapped ; 03B6 # 3.1 MATHEMATICAL BOLD CAPITAL ZETA -1D6AE ; mapped ; 03B7 # 3.1 MATHEMATICAL BOLD CAPITAL ETA -1D6AF ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD CAPITAL THETA -1D6B0 ; mapped ; 03B9 # 3.1 MATHEMATICAL BOLD CAPITAL IOTA -1D6B1 ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD CAPITAL KAPPA -1D6B2 ; mapped ; 03BB # 3.1 MATHEMATICAL BOLD CAPITAL LAMDA -1D6B3 ; mapped ; 03BC # 3.1 MATHEMATICAL BOLD CAPITAL MU -1D6B4 ; mapped ; 03BD # 3.1 MATHEMATICAL BOLD CAPITAL NU -1D6B5 ; mapped ; 03BE # 3.1 MATHEMATICAL BOLD CAPITAL XI -1D6B6 ; mapped ; 03BF # 3.1 MATHEMATICAL BOLD CAPITAL OMICRON -1D6B7 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD CAPITAL PI -1D6B8 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD CAPITAL RHO -1D6B9 ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD CAPITAL THETA SYMBOL -1D6BA ; mapped ; 03C3 # 3.1 MATHEMATICAL BOLD CAPITAL SIGMA -1D6BB ; mapped ; 03C4 # 3.1 MATHEMATICAL BOLD CAPITAL TAU -1D6BC ; mapped ; 03C5 # 3.1 MATHEMATICAL BOLD CAPITAL UPSILON -1D6BD ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD CAPITAL PHI -1D6BE ; mapped ; 03C7 # 3.1 MATHEMATICAL BOLD CAPITAL CHI -1D6BF ; mapped ; 03C8 # 3.1 MATHEMATICAL BOLD CAPITAL PSI -1D6C0 ; mapped ; 03C9 # 3.1 MATHEMATICAL BOLD CAPITAL OMEGA -1D6C1 ; mapped ; 2207 # 3.1 MATHEMATICAL BOLD NABLA -1D6C2 ; mapped ; 03B1 # 3.1 MATHEMATICAL BOLD SMALL ALPHA -1D6C3 ; mapped ; 03B2 # 3.1 MATHEMATICAL BOLD SMALL BETA -1D6C4 ; mapped ; 03B3 # 3.1 MATHEMATICAL BOLD SMALL GAMMA -1D6C5 ; mapped ; 03B4 # 3.1 MATHEMATICAL BOLD SMALL DELTA -1D6C6 ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD SMALL EPSILON -1D6C7 ; mapped ; 03B6 # 3.1 MATHEMATICAL BOLD SMALL ZETA -1D6C8 ; mapped ; 03B7 # 3.1 MATHEMATICAL BOLD SMALL ETA -1D6C9 ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD SMALL THETA -1D6CA ; mapped ; 03B9 # 3.1 MATHEMATICAL BOLD SMALL IOTA -1D6CB ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD SMALL KAPPA -1D6CC ; mapped ; 03BB # 3.1 MATHEMATICAL BOLD SMALL LAMDA -1D6CD ; mapped ; 03BC # 3.1 MATHEMATICAL BOLD SMALL MU -1D6CE ; mapped ; 03BD # 3.1 MATHEMATICAL BOLD SMALL NU -1D6CF ; mapped ; 03BE # 3.1 MATHEMATICAL BOLD SMALL XI -1D6D0 ; mapped ; 03BF # 3.1 MATHEMATICAL BOLD SMALL OMICRON -1D6D1 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD SMALL PI -1D6D2 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD SMALL RHO -1D6D3..1D6D4 ; mapped ; 03C3 # 3.1 MATHEMATICAL BOLD SMALL FINAL SIGMA..MATHEMATICAL BOLD SMALL SIGMA -1D6D5 ; mapped ; 03C4 # 3.1 MATHEMATICAL BOLD SMALL TAU -1D6D6 ; mapped ; 03C5 # 3.1 MATHEMATICAL BOLD SMALL UPSILON -1D6D7 ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD SMALL PHI -1D6D8 ; mapped ; 03C7 # 3.1 MATHEMATICAL BOLD SMALL CHI -1D6D9 ; mapped ; 03C8 # 3.1 MATHEMATICAL BOLD SMALL PSI -1D6DA ; mapped ; 03C9 # 3.1 MATHEMATICAL BOLD SMALL OMEGA -1D6DB ; mapped ; 2202 # 3.1 MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6DC ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD EPSILON SYMBOL -1D6DD ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD THETA SYMBOL -1D6DE ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD KAPPA SYMBOL -1D6DF ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD PHI SYMBOL -1D6E0 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD RHO SYMBOL -1D6E1 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD PI SYMBOL -1D6E2 ; mapped ; 03B1 # 3.1 MATHEMATICAL ITALIC CAPITAL ALPHA -1D6E3 ; mapped ; 03B2 # 3.1 MATHEMATICAL ITALIC CAPITAL BETA -1D6E4 ; mapped ; 03B3 # 3.1 MATHEMATICAL ITALIC CAPITAL GAMMA -1D6E5 ; mapped ; 03B4 # 3.1 MATHEMATICAL ITALIC CAPITAL DELTA -1D6E6 ; mapped ; 03B5 # 3.1 MATHEMATICAL ITALIC CAPITAL EPSILON -1D6E7 ; mapped ; 03B6 # 3.1 MATHEMATICAL ITALIC CAPITAL ZETA -1D6E8 ; mapped ; 03B7 # 3.1 MATHEMATICAL ITALIC CAPITAL ETA -1D6E9 ; mapped ; 03B8 # 3.1 MATHEMATICAL ITALIC CAPITAL THETA -1D6EA ; mapped ; 03B9 # 3.1 MATHEMATICAL ITALIC CAPITAL IOTA -1D6EB ; mapped ; 03BA # 3.1 MATHEMATICAL ITALIC CAPITAL KAPPA -1D6EC ; mapped ; 03BB # 3.1 MATHEMATICAL ITALIC CAPITAL LAMDA -1D6ED ; mapped ; 03BC # 3.1 MATHEMATICAL ITALIC CAPITAL MU -1D6EE ; mapped ; 03BD # 3.1 MATHEMATICAL ITALIC CAPITAL NU -1D6EF ; mapped ; 03BE # 3.1 MATHEMATICAL ITALIC CAPITAL XI -1D6F0 ; mapped ; 03BF # 3.1 MATHEMATICAL ITALIC CAPITAL OMICRON -1D6F1 ; mapped ; 03C0 # 3.1 MATHEMATICAL ITALIC CAPITAL PI -1D6F2 ; mapped ; 03C1 # 3.1 MATHEMATICAL ITALIC CAPITAL RHO -1D6F3 ; mapped ; 03B8 # 3.1 MATHEMATICAL ITALIC CAPITAL THETA SYMBOL -1D6F4 ; mapped ; 03C3 # 3.1 MATHEMATICAL ITALIC CAPITAL SIGMA -1D6F5 ; mapped ; 03C4 # 3.1 MATHEMATICAL ITALIC CAPITAL TAU -1D6F6 ; mapped ; 03C5 # 3.1 MATHEMATICAL ITALIC CAPITAL UPSILON -1D6F7 ; mapped ; 03C6 # 3.1 MATHEMATICAL ITALIC CAPITAL PHI -1D6F8 ; mapped ; 03C7 # 3.1 MATHEMATICAL ITALIC CAPITAL CHI -1D6F9 ; mapped ; 03C8 # 3.1 MATHEMATICAL ITALIC CAPITAL PSI -1D6FA ; mapped ; 03C9 # 3.1 MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FB ; mapped ; 2207 # 3.1 MATHEMATICAL ITALIC NABLA -1D6FC ; mapped ; 03B1 # 3.1 MATHEMATICAL ITALIC SMALL ALPHA -1D6FD ; mapped ; 03B2 # 3.1 MATHEMATICAL ITALIC SMALL BETA -1D6FE ; mapped ; 03B3 # 3.1 MATHEMATICAL ITALIC SMALL GAMMA -1D6FF ; mapped ; 03B4 # 3.1 MATHEMATICAL ITALIC SMALL DELTA -1D700 ; mapped ; 03B5 # 3.1 MATHEMATICAL ITALIC SMALL EPSILON -1D701 ; mapped ; 03B6 # 3.1 MATHEMATICAL ITALIC SMALL ZETA -1D702 ; mapped ; 03B7 # 3.1 MATHEMATICAL ITALIC SMALL ETA -1D703 ; mapped ; 03B8 # 3.1 MATHEMATICAL ITALIC SMALL THETA -1D704 ; mapped ; 03B9 # 3.1 MATHEMATICAL ITALIC SMALL IOTA -1D705 ; mapped ; 03BA # 3.1 MATHEMATICAL ITALIC SMALL KAPPA -1D706 ; mapped ; 03BB # 3.1 MATHEMATICAL ITALIC SMALL LAMDA -1D707 ; mapped ; 03BC # 3.1 MATHEMATICAL ITALIC SMALL MU -1D708 ; mapped ; 03BD # 3.1 MATHEMATICAL ITALIC SMALL NU -1D709 ; mapped ; 03BE # 3.1 MATHEMATICAL ITALIC SMALL XI -1D70A ; mapped ; 03BF # 3.1 MATHEMATICAL ITALIC SMALL OMICRON -1D70B ; mapped ; 03C0 # 3.1 MATHEMATICAL ITALIC SMALL PI -1D70C ; mapped ; 03C1 # 3.1 MATHEMATICAL ITALIC SMALL RHO -1D70D..1D70E ; mapped ; 03C3 # 3.1 MATHEMATICAL ITALIC SMALL FINAL SIGMA..MATHEMATICAL ITALIC SMALL SIGMA -1D70F ; mapped ; 03C4 # 3.1 MATHEMATICAL ITALIC SMALL TAU -1D710 ; mapped ; 03C5 # 3.1 MATHEMATICAL ITALIC SMALL UPSILON -1D711 ; mapped ; 03C6 # 3.1 MATHEMATICAL ITALIC SMALL PHI -1D712 ; mapped ; 03C7 # 3.1 MATHEMATICAL ITALIC SMALL CHI -1D713 ; mapped ; 03C8 # 3.1 MATHEMATICAL ITALIC SMALL PSI -1D714 ; mapped ; 03C9 # 3.1 MATHEMATICAL ITALIC SMALL OMEGA -1D715 ; mapped ; 2202 # 3.1 MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D716 ; mapped ; 03B5 # 3.1 MATHEMATICAL ITALIC EPSILON SYMBOL -1D717 ; mapped ; 03B8 # 3.1 MATHEMATICAL ITALIC THETA SYMBOL -1D718 ; mapped ; 03BA # 3.1 MATHEMATICAL ITALIC KAPPA SYMBOL -1D719 ; mapped ; 03C6 # 3.1 MATHEMATICAL ITALIC PHI SYMBOL -1D71A ; mapped ; 03C1 # 3.1 MATHEMATICAL ITALIC RHO SYMBOL -1D71B ; mapped ; 03C0 # 3.1 MATHEMATICAL ITALIC PI SYMBOL -1D71C ; mapped ; 03B1 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL ALPHA -1D71D ; mapped ; 03B2 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL BETA -1D71E ; mapped ; 03B3 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL GAMMA -1D71F ; mapped ; 03B4 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL DELTA -1D720 ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL EPSILON -1D721 ; mapped ; 03B6 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL ZETA -1D722 ; mapped ; 03B7 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL ETA -1D723 ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL THETA -1D724 ; mapped ; 03B9 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL IOTA -1D725 ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL KAPPA -1D726 ; mapped ; 03BB # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL LAMDA -1D727 ; mapped ; 03BC # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL MU -1D728 ; mapped ; 03BD # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL NU -1D729 ; mapped ; 03BE # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL XI -1D72A ; mapped ; 03BF # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL OMICRON -1D72B ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL PI -1D72C ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL RHO -1D72D ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL -1D72E ; mapped ; 03C3 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL SIGMA -1D72F ; mapped ; 03C4 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL TAU -1D730 ; mapped ; 03C5 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL UPSILON -1D731 ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL PHI -1D732 ; mapped ; 03C7 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL CHI -1D733 ; mapped ; 03C8 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL PSI -1D734 ; mapped ; 03C9 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D735 ; mapped ; 2207 # 3.1 MATHEMATICAL BOLD ITALIC NABLA -1D736 ; mapped ; 03B1 # 3.1 MATHEMATICAL BOLD ITALIC SMALL ALPHA -1D737 ; mapped ; 03B2 # 3.1 MATHEMATICAL BOLD ITALIC SMALL BETA -1D738 ; mapped ; 03B3 # 3.1 MATHEMATICAL BOLD ITALIC SMALL GAMMA -1D739 ; mapped ; 03B4 # 3.1 MATHEMATICAL BOLD ITALIC SMALL DELTA -1D73A ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD ITALIC SMALL EPSILON -1D73B ; mapped ; 03B6 # 3.1 MATHEMATICAL BOLD ITALIC SMALL ZETA -1D73C ; mapped ; 03B7 # 3.1 MATHEMATICAL BOLD ITALIC SMALL ETA -1D73D ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD ITALIC SMALL THETA -1D73E ; mapped ; 03B9 # 3.1 MATHEMATICAL BOLD ITALIC SMALL IOTA -1D73F ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD ITALIC SMALL KAPPA -1D740 ; mapped ; 03BB # 3.1 MATHEMATICAL BOLD ITALIC SMALL LAMDA -1D741 ; mapped ; 03BC # 3.1 MATHEMATICAL BOLD ITALIC SMALL MU -1D742 ; mapped ; 03BD # 3.1 MATHEMATICAL BOLD ITALIC SMALL NU -1D743 ; mapped ; 03BE # 3.1 MATHEMATICAL BOLD ITALIC SMALL XI -1D744 ; mapped ; 03BF # 3.1 MATHEMATICAL BOLD ITALIC SMALL OMICRON -1D745 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD ITALIC SMALL PI -1D746 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD ITALIC SMALL RHO -1D747..1D748 ; mapped ; 03C3 # 3.1 MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA..MATHEMATICAL BOLD ITALIC SMALL SIGMA -1D749 ; mapped ; 03C4 # 3.1 MATHEMATICAL BOLD ITALIC SMALL TAU -1D74A ; mapped ; 03C5 # 3.1 MATHEMATICAL BOLD ITALIC SMALL UPSILON -1D74B ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD ITALIC SMALL PHI -1D74C ; mapped ; 03C7 # 3.1 MATHEMATICAL BOLD ITALIC SMALL CHI -1D74D ; mapped ; 03C8 # 3.1 MATHEMATICAL BOLD ITALIC SMALL PSI -1D74E ; mapped ; 03C9 # 3.1 MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D74F ; mapped ; 2202 # 3.1 MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D750 ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD ITALIC EPSILON SYMBOL -1D751 ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD ITALIC THETA SYMBOL -1D752 ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD ITALIC KAPPA SYMBOL -1D753 ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD ITALIC PHI SYMBOL -1D754 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD ITALIC RHO SYMBOL -1D755 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD ITALIC PI SYMBOL -1D756 ; mapped ; 03B1 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA -1D757 ; mapped ; 03B2 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA -1D758 ; mapped ; 03B3 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA -1D759 ; mapped ; 03B4 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA -1D75A ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON -1D75B ; mapped ; 03B6 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA -1D75C ; mapped ; 03B7 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA -1D75D ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA -1D75E ; mapped ; 03B9 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA -1D75F ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA -1D760 ; mapped ; 03BB # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA -1D761 ; mapped ; 03BC # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL MU -1D762 ; mapped ; 03BD # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL NU -1D763 ; mapped ; 03BE # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL XI -1D764 ; mapped ; 03BF # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON -1D765 ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL PI -1D766 ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO -1D767 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL -1D768 ; mapped ; 03C3 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA -1D769 ; mapped ; 03C4 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU -1D76A ; mapped ; 03C5 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON -1D76B ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI -1D76C ; mapped ; 03C7 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI -1D76D ; mapped ; 03C8 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI -1D76E ; mapped ; 03C9 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D76F ; mapped ; 2207 # 3.1 MATHEMATICAL SANS-SERIF BOLD NABLA -1D770 ; mapped ; 03B1 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA -1D771 ; mapped ; 03B2 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL BETA -1D772 ; mapped ; 03B3 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA -1D773 ; mapped ; 03B4 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL DELTA -1D774 ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON -1D775 ; mapped ; 03B6 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL ZETA -1D776 ; mapped ; 03B7 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL ETA -1D777 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL THETA -1D778 ; mapped ; 03B9 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL IOTA -1D779 ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA -1D77A ; mapped ; 03BB # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA -1D77B ; mapped ; 03BC # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL MU -1D77C ; mapped ; 03BD # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL NU -1D77D ; mapped ; 03BE # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL XI -1D77E ; mapped ; 03BF # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON -1D77F ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL PI -1D780 ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL RHO -1D781..1D782 ; mapped ; 03C3 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA..MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA -1D783 ; mapped ; 03C4 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL TAU -1D784 ; mapped ; 03C5 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON -1D785 ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL PHI -1D786 ; mapped ; 03C7 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL CHI -1D787 ; mapped ; 03C8 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL PSI -1D788 ; mapped ; 03C9 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D789 ; mapped ; 2202 # 3.1 MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D78A ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL -1D78B ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL -1D78C ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL -1D78D ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL -1D78E ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL -1D78F ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD PI SYMBOL -1D790 ; mapped ; 03B1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA -1D791 ; mapped ; 03B2 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA -1D792 ; mapped ; 03B3 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA -1D793 ; mapped ; 03B4 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA -1D794 ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON -1D795 ; mapped ; 03B6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA -1D796 ; mapped ; 03B7 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA -1D797 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA -1D798 ; mapped ; 03B9 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA -1D799 ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA -1D79A ; mapped ; 03BB # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA -1D79B ; mapped ; 03BC # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU -1D79C ; mapped ; 03BD # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU -1D79D ; mapped ; 03BE # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI -1D79E ; mapped ; 03BF # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON -1D79F ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI -1D7A0 ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO -1D7A1 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL -1D7A2 ; mapped ; 03C3 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA -1D7A3 ; mapped ; 03C4 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU -1D7A4 ; mapped ; 03C5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON -1D7A5 ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI -1D7A6 ; mapped ; 03C7 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI -1D7A7 ; mapped ; 03C8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI -1D7A8 ; mapped ; 03C9 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7A9 ; mapped ; 2207 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7AA ; mapped ; 03B1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA -1D7AB ; mapped ; 03B2 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA -1D7AC ; mapped ; 03B3 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA -1D7AD ; mapped ; 03B4 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA -1D7AE ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON -1D7AF ; mapped ; 03B6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA -1D7B0 ; mapped ; 03B7 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA -1D7B1 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA -1D7B2 ; mapped ; 03B9 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA -1D7B3 ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA -1D7B4 ; mapped ; 03BB # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA -1D7B5 ; mapped ; 03BC # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU -1D7B6 ; mapped ; 03BD # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU -1D7B7 ; mapped ; 03BE # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI -1D7B8 ; mapped ; 03BF # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON -1D7B9 ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI -1D7BA ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO -1D7BB..1D7BC ; mapped ; 03C3 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA -1D7BD ; mapped ; 03C4 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU -1D7BE ; mapped ; 03C5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON -1D7BF ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI -1D7C0 ; mapped ; 03C7 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI -1D7C1 ; mapped ; 03C8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI -1D7C2 ; mapped ; 03C9 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C3 ; mapped ; 2202 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL -1D7C4 ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL -1D7C5 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL -1D7C6 ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL -1D7C7 ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL -1D7C8 ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL -1D7C9 ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -1D7CA..1D7CB ; mapped ; 03DD # 5.0 MATHEMATICAL BOLD CAPITAL DIGAMMA..MATHEMATICAL BOLD SMALL DIGAMMA -1D7CC..1D7CD ; disallowed # NA .. -1D7CE ; mapped ; 0030 # 3.1 MATHEMATICAL BOLD DIGIT ZERO -1D7CF ; mapped ; 0031 # 3.1 MATHEMATICAL BOLD DIGIT ONE -1D7D0 ; mapped ; 0032 # 3.1 MATHEMATICAL BOLD DIGIT TWO -1D7D1 ; mapped ; 0033 # 3.1 MATHEMATICAL BOLD DIGIT THREE -1D7D2 ; mapped ; 0034 # 3.1 MATHEMATICAL BOLD DIGIT FOUR -1D7D3 ; mapped ; 0035 # 3.1 MATHEMATICAL BOLD DIGIT FIVE -1D7D4 ; mapped ; 0036 # 3.1 MATHEMATICAL BOLD DIGIT SIX -1D7D5 ; mapped ; 0037 # 3.1 MATHEMATICAL BOLD DIGIT SEVEN -1D7D6 ; mapped ; 0038 # 3.1 MATHEMATICAL BOLD DIGIT EIGHT -1D7D7 ; mapped ; 0039 # 3.1 MATHEMATICAL BOLD DIGIT NINE -1D7D8 ; mapped ; 0030 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO -1D7D9 ; mapped ; 0031 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT ONE -1D7DA ; mapped ; 0032 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT TWO -1D7DB ; mapped ; 0033 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT THREE -1D7DC ; mapped ; 0034 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR -1D7DD ; mapped ; 0035 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE -1D7DE ; mapped ; 0036 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT SIX -1D7DF ; mapped ; 0037 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN -1D7E0 ; mapped ; 0038 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT -1D7E1 ; mapped ; 0039 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT NINE -1D7E2 ; mapped ; 0030 # 3.1 MATHEMATICAL SANS-SERIF DIGIT ZERO -1D7E3 ; mapped ; 0031 # 3.1 MATHEMATICAL SANS-SERIF DIGIT ONE -1D7E4 ; mapped ; 0032 # 3.1 MATHEMATICAL SANS-SERIF DIGIT TWO -1D7E5 ; mapped ; 0033 # 3.1 MATHEMATICAL SANS-SERIF DIGIT THREE -1D7E6 ; mapped ; 0034 # 3.1 MATHEMATICAL SANS-SERIF DIGIT FOUR -1D7E7 ; mapped ; 0035 # 3.1 MATHEMATICAL SANS-SERIF DIGIT FIVE -1D7E8 ; mapped ; 0036 # 3.1 MATHEMATICAL SANS-SERIF DIGIT SIX -1D7E9 ; mapped ; 0037 # 3.1 MATHEMATICAL SANS-SERIF DIGIT SEVEN -1D7EA ; mapped ; 0038 # 3.1 MATHEMATICAL SANS-SERIF DIGIT EIGHT -1D7EB ; mapped ; 0039 # 3.1 MATHEMATICAL SANS-SERIF DIGIT NINE -1D7EC ; mapped ; 0030 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO -1D7ED ; mapped ; 0031 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT ONE -1D7EE ; mapped ; 0032 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT TWO -1D7EF ; mapped ; 0033 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT THREE -1D7F0 ; mapped ; 0034 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR -1D7F1 ; mapped ; 0035 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE -1D7F2 ; mapped ; 0036 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT SIX -1D7F3 ; mapped ; 0037 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN -1D7F4 ; mapped ; 0038 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT -1D7F5 ; mapped ; 0039 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT NINE -1D7F6 ; mapped ; 0030 # 3.1 MATHEMATICAL MONOSPACE DIGIT ZERO -1D7F7 ; mapped ; 0031 # 3.1 MATHEMATICAL MONOSPACE DIGIT ONE -1D7F8 ; mapped ; 0032 # 3.1 MATHEMATICAL MONOSPACE DIGIT TWO -1D7F9 ; mapped ; 0033 # 3.1 MATHEMATICAL MONOSPACE DIGIT THREE -1D7FA ; mapped ; 0034 # 3.1 MATHEMATICAL MONOSPACE DIGIT FOUR -1D7FB ; mapped ; 0035 # 3.1 MATHEMATICAL MONOSPACE DIGIT FIVE -1D7FC ; mapped ; 0036 # 3.1 MATHEMATICAL MONOSPACE DIGIT SIX -1D7FD ; mapped ; 0037 # 3.1 MATHEMATICAL MONOSPACE DIGIT SEVEN -1D7FE ; mapped ; 0038 # 3.1 MATHEMATICAL MONOSPACE DIGIT EIGHT -1D7FF ; mapped ; 0039 # 3.1 MATHEMATICAL MONOSPACE DIGIT NINE -1D800..1D9FF ; valid ; ; NV8 # 8.0 SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD -1DA00..1DA36 ; valid # 8.0 SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN -1DA37..1DA3A ; valid ; ; NV8 # 8.0 SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE -1DA3B..1DA6C ; valid # 8.0 SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT -1DA6D..1DA74 ; valid ; ; NV8 # 8.0 SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING -1DA75 ; valid # 8.0 SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS -1DA76..1DA83 ; valid ; ; NV8 # 8.0 SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH -1DA84 ; valid # 8.0 SIGNWRITING LOCATION HEAD NECK -1DA85..1DA8B ; valid ; ; NV8 # 8.0 SIGNWRITING LOCATION TORSO..SIGNWRITING PARENTHESIS -1DA8C..1DA9A ; disallowed # NA .. -1DA9B..1DA9F ; valid # 8.0 SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 -1DAA0 ; disallowed # NA -1DAA1..1DAAF ; valid # 8.0 SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 -1DAB0..1DFFF ; disallowed # NA .. -1E000..1E006 ; valid # 9.0 COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE -1E007 ; disallowed # NA -1E008..1E018 ; valid # 9.0 COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU -1E019..1E01A ; disallowed # NA .. -1E01B..1E021 ; valid # 9.0 COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI -1E022 ; disallowed # NA -1E023..1E024 ; valid # 9.0 COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS -1E025 ; disallowed # NA -1E026..1E02A ; valid # 9.0 COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA -1E02B..1E7FF ; disallowed # NA .. -1E800..1E8C4 ; valid # 7.0 MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON -1E8C5..1E8C6 ; disallowed # NA .. -1E8C7..1E8CF ; valid ; ; NV8 # 7.0 MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE -1E8D0..1E8D6 ; valid # 7.0 MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS -1E8D7..1E8FF ; disallowed # NA .. -1E900 ; mapped ; 1E922 # 9.0 ADLAM CAPITAL LETTER ALIF -1E901 ; mapped ; 1E923 # 9.0 ADLAM CAPITAL LETTER DAALI -1E902 ; mapped ; 1E924 # 9.0 ADLAM CAPITAL LETTER LAAM -1E903 ; mapped ; 1E925 # 9.0 ADLAM CAPITAL LETTER MIIM -1E904 ; mapped ; 1E926 # 9.0 ADLAM CAPITAL LETTER BA -1E905 ; mapped ; 1E927 # 9.0 ADLAM CAPITAL LETTER SINNYIIYHE -1E906 ; mapped ; 1E928 # 9.0 ADLAM CAPITAL LETTER PE -1E907 ; mapped ; 1E929 # 9.0 ADLAM CAPITAL LETTER BHE -1E908 ; mapped ; 1E92A # 9.0 ADLAM CAPITAL LETTER RA -1E909 ; mapped ; 1E92B # 9.0 ADLAM CAPITAL LETTER E -1E90A ; mapped ; 1E92C # 9.0 ADLAM CAPITAL LETTER FA -1E90B ; mapped ; 1E92D # 9.0 ADLAM CAPITAL LETTER I -1E90C ; mapped ; 1E92E # 9.0 ADLAM CAPITAL LETTER O -1E90D ; mapped ; 1E92F # 9.0 ADLAM CAPITAL LETTER DHA -1E90E ; mapped ; 1E930 # 9.0 ADLAM CAPITAL LETTER YHE -1E90F ; mapped ; 1E931 # 9.0 ADLAM CAPITAL LETTER WAW -1E910 ; mapped ; 1E932 # 9.0 ADLAM CAPITAL LETTER NUN -1E911 ; mapped ; 1E933 # 9.0 ADLAM CAPITAL LETTER KAF -1E912 ; mapped ; 1E934 # 9.0 ADLAM CAPITAL LETTER YA -1E913 ; mapped ; 1E935 # 9.0 ADLAM CAPITAL LETTER U -1E914 ; mapped ; 1E936 # 9.0 ADLAM CAPITAL LETTER JIIM -1E915 ; mapped ; 1E937 # 9.0 ADLAM CAPITAL LETTER CHI -1E916 ; mapped ; 1E938 # 9.0 ADLAM CAPITAL LETTER HA -1E917 ; mapped ; 1E939 # 9.0 ADLAM CAPITAL LETTER QAAF -1E918 ; mapped ; 1E93A # 9.0 ADLAM CAPITAL LETTER GA -1E919 ; mapped ; 1E93B # 9.0 ADLAM CAPITAL LETTER NYA -1E91A ; mapped ; 1E93C # 9.0 ADLAM CAPITAL LETTER TU -1E91B ; mapped ; 1E93D # 9.0 ADLAM CAPITAL LETTER NHA -1E91C ; mapped ; 1E93E # 9.0 ADLAM CAPITAL LETTER VA -1E91D ; mapped ; 1E93F # 9.0 ADLAM CAPITAL LETTER KHA -1E91E ; mapped ; 1E940 # 9.0 ADLAM CAPITAL LETTER GBE -1E91F ; mapped ; 1E941 # 9.0 ADLAM CAPITAL LETTER ZAL -1E920 ; mapped ; 1E942 # 9.0 ADLAM CAPITAL LETTER KPO -1E921 ; mapped ; 1E943 # 9.0 ADLAM CAPITAL LETTER SHA -1E922..1E94A ; valid # 9.0 ADLAM SMALL LETTER ALIF..ADLAM NUKTA -1E94B..1E94F ; disallowed # NA .. -1E950..1E959 ; valid # 9.0 ADLAM DIGIT ZERO..ADLAM DIGIT NINE -1E95A..1E95D ; disallowed # NA .. -1E95E..1E95F ; valid ; ; NV8 # 9.0 ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK -1E960..1EDFF ; disallowed # NA .. -1EE00 ; mapped ; 0627 # 6.1 ARABIC MATHEMATICAL ALEF -1EE01 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL BEH -1EE02 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL JEEM -1EE03 ; mapped ; 062F # 6.1 ARABIC MATHEMATICAL DAL -1EE04 ; disallowed # NA -1EE05 ; mapped ; 0648 # 6.1 ARABIC MATHEMATICAL WAW -1EE06 ; mapped ; 0632 # 6.1 ARABIC MATHEMATICAL ZAIN -1EE07 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL HAH -1EE08 ; mapped ; 0637 # 6.1 ARABIC MATHEMATICAL TAH -1EE09 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL YEH -1EE0A ; mapped ; 0643 # 6.1 ARABIC MATHEMATICAL KAF -1EE0B ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL LAM -1EE0C ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL MEEM -1EE0D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL NOON -1EE0E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL SEEN -1EE0F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL AIN -1EE10 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL FEH -1EE11 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL SAD -1EE12 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL QAF -1EE13 ; mapped ; 0631 # 6.1 ARABIC MATHEMATICAL REH -1EE14 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL SHEEN -1EE15 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL TEH -1EE16 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL THEH -1EE17 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL KHAH -1EE18 ; mapped ; 0630 # 6.1 ARABIC MATHEMATICAL THAL -1EE19 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL DAD -1EE1A ; mapped ; 0638 # 6.1 ARABIC MATHEMATICAL ZAH -1EE1B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL GHAIN -1EE1C ; mapped ; 066E # 6.1 ARABIC MATHEMATICAL DOTLESS BEH -1EE1D ; mapped ; 06BA # 6.1 ARABIC MATHEMATICAL DOTLESS NOON -1EE1E ; mapped ; 06A1 # 6.1 ARABIC MATHEMATICAL DOTLESS FEH -1EE1F ; mapped ; 066F # 6.1 ARABIC MATHEMATICAL DOTLESS QAF -1EE20 ; disallowed # NA -1EE21 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL INITIAL BEH -1EE22 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL INITIAL JEEM -1EE23 ; disallowed # NA -1EE24 ; mapped ; 0647 # 6.1 ARABIC MATHEMATICAL INITIAL HEH -1EE25..1EE26 ; disallowed # NA .. -1EE27 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL INITIAL HAH -1EE28 ; disallowed # NA -1EE29 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL INITIAL YEH -1EE2A ; mapped ; 0643 # 6.1 ARABIC MATHEMATICAL INITIAL KAF -1EE2B ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL INITIAL LAM -1EE2C ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL INITIAL MEEM -1EE2D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL INITIAL NOON -1EE2E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL INITIAL SEEN -1EE2F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL INITIAL AIN -1EE30 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL INITIAL FEH -1EE31 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL INITIAL SAD -1EE32 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL INITIAL QAF -1EE33 ; disallowed # NA -1EE34 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL INITIAL SHEEN -1EE35 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL INITIAL TEH -1EE36 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL INITIAL THEH -1EE37 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL INITIAL KHAH -1EE38 ; disallowed # NA -1EE39 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL INITIAL DAD -1EE3A ; disallowed # NA -1EE3B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL INITIAL GHAIN -1EE3C..1EE41 ; disallowed # NA .. -1EE42 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL TAILED JEEM -1EE43..1EE46 ; disallowed # NA .. -1EE47 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL TAILED HAH -1EE48 ; disallowed # NA -1EE49 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL TAILED YEH -1EE4A ; disallowed # NA -1EE4B ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL TAILED LAM -1EE4C ; disallowed # NA -1EE4D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL TAILED NOON -1EE4E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL TAILED SEEN -1EE4F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL TAILED AIN -1EE50 ; disallowed # NA -1EE51 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL TAILED SAD -1EE52 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL TAILED QAF -1EE53 ; disallowed # NA -1EE54 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL TAILED SHEEN -1EE55..1EE56 ; disallowed # NA .. -1EE57 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL TAILED KHAH -1EE58 ; disallowed # NA -1EE59 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL TAILED DAD -1EE5A ; disallowed # NA -1EE5B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL TAILED GHAIN -1EE5C ; disallowed # NA -1EE5D ; mapped ; 06BA # 6.1 ARABIC MATHEMATICAL TAILED DOTLESS NOON -1EE5E ; disallowed # NA -1EE5F ; mapped ; 066F # 6.1 ARABIC MATHEMATICAL TAILED DOTLESS QAF -1EE60 ; disallowed # NA -1EE61 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL STRETCHED BEH -1EE62 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL STRETCHED JEEM -1EE63 ; disallowed # NA -1EE64 ; mapped ; 0647 # 6.1 ARABIC MATHEMATICAL STRETCHED HEH -1EE65..1EE66 ; disallowed # NA .. -1EE67 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL STRETCHED HAH -1EE68 ; mapped ; 0637 # 6.1 ARABIC MATHEMATICAL STRETCHED TAH -1EE69 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL STRETCHED YEH -1EE6A ; mapped ; 0643 # 6.1 ARABIC MATHEMATICAL STRETCHED KAF -1EE6B ; disallowed # NA -1EE6C ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL STRETCHED MEEM -1EE6D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL STRETCHED NOON -1EE6E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL STRETCHED SEEN -1EE6F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL STRETCHED AIN -1EE70 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL STRETCHED FEH -1EE71 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL STRETCHED SAD -1EE72 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL STRETCHED QAF -1EE73 ; disallowed # NA -1EE74 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL STRETCHED SHEEN -1EE75 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL STRETCHED TEH -1EE76 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL STRETCHED THEH -1EE77 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL STRETCHED KHAH -1EE78 ; disallowed # NA -1EE79 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL STRETCHED DAD -1EE7A ; mapped ; 0638 # 6.1 ARABIC MATHEMATICAL STRETCHED ZAH -1EE7B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL STRETCHED GHAIN -1EE7C ; mapped ; 066E # 6.1 ARABIC MATHEMATICAL STRETCHED DOTLESS BEH -1EE7D ; disallowed # NA -1EE7E ; mapped ; 06A1 # 6.1 ARABIC MATHEMATICAL STRETCHED DOTLESS FEH -1EE7F ; disallowed # NA -1EE80 ; mapped ; 0627 # 6.1 ARABIC MATHEMATICAL LOOPED ALEF -1EE81 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL LOOPED BEH -1EE82 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL LOOPED JEEM -1EE83 ; mapped ; 062F # 6.1 ARABIC MATHEMATICAL LOOPED DAL -1EE84 ; mapped ; 0647 # 6.1 ARABIC MATHEMATICAL LOOPED HEH -1EE85 ; mapped ; 0648 # 6.1 ARABIC MATHEMATICAL LOOPED WAW -1EE86 ; mapped ; 0632 # 6.1 ARABIC MATHEMATICAL LOOPED ZAIN -1EE87 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL LOOPED HAH -1EE88 ; mapped ; 0637 # 6.1 ARABIC MATHEMATICAL LOOPED TAH -1EE89 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL LOOPED YEH -1EE8A ; disallowed # NA -1EE8B ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL LOOPED LAM -1EE8C ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL LOOPED MEEM -1EE8D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL LOOPED NOON -1EE8E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL LOOPED SEEN -1EE8F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL LOOPED AIN -1EE90 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL LOOPED FEH -1EE91 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL LOOPED SAD -1EE92 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL LOOPED QAF -1EE93 ; mapped ; 0631 # 6.1 ARABIC MATHEMATICAL LOOPED REH -1EE94 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL LOOPED SHEEN -1EE95 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL LOOPED TEH -1EE96 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL LOOPED THEH -1EE97 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL LOOPED KHAH -1EE98 ; mapped ; 0630 # 6.1 ARABIC MATHEMATICAL LOOPED THAL -1EE99 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL LOOPED DAD -1EE9A ; mapped ; 0638 # 6.1 ARABIC MATHEMATICAL LOOPED ZAH -1EE9B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL LOOPED GHAIN -1EE9C..1EEA0 ; disallowed # NA .. -1EEA1 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK BEH -1EEA2 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM -1EEA3 ; mapped ; 062F # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK DAL -1EEA4 ; disallowed # NA -1EEA5 ; mapped ; 0648 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK WAW -1EEA6 ; mapped ; 0632 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN -1EEA7 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK HAH -1EEA8 ; mapped ; 0637 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK TAH -1EEA9 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK YEH -1EEAA ; disallowed # NA -1EEAB ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK LAM -1EEAC ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM -1EEAD ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK NOON -1EEAE ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN -1EEAF ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK AIN -1EEB0 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK FEH -1EEB1 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK SAD -1EEB2 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK QAF -1EEB3 ; mapped ; 0631 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK REH -1EEB4 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN -1EEB5 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK TEH -1EEB6 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK THEH -1EEB7 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH -1EEB8 ; mapped ; 0630 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK THAL -1EEB9 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK DAD -1EEBA ; mapped ; 0638 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH -1EEBB ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN -1EEBC..1EEEF ; disallowed # NA .. -1EEF0..1EEF1 ; valid ; ; NV8 # 6.1 ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL -1EEF2..1EFFF ; disallowed # NA .. -1F000..1F02B ; valid ; ; NV8 # 5.1 MAHJONG TILE EAST WIND..MAHJONG TILE BACK -1F02C..1F02F ; disallowed # NA .. -1F030..1F093 ; valid ; ; NV8 # 5.1 DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 -1F094..1F09F ; disallowed # NA .. -1F0A0..1F0AE ; valid ; ; NV8 # 6.0 PLAYING CARD BACK..PLAYING CARD KING OF SPADES -1F0AF..1F0B0 ; disallowed # NA .. -1F0B1..1F0BE ; valid ; ; NV8 # 6.0 PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS -1F0BF ; valid ; ; NV8 # 7.0 PLAYING CARD RED JOKER -1F0C0 ; disallowed # NA -1F0C1..1F0CF ; valid ; ; NV8 # 6.0 PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER -1F0D0 ; disallowed # NA -1F0D1..1F0DF ; valid ; ; NV8 # 6.0 PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER -1F0E0..1F0F5 ; valid ; ; NV8 # 7.0 PLAYING CARD FOOL..PLAYING CARD TRUMP-21 -1F0F6..1F0FF ; disallowed # NA .. -1F100 ; disallowed # 5.2 DIGIT ZERO FULL STOP -1F101 ; disallowed_STD3_mapped ; 0030 002C # 5.2 DIGIT ZERO COMMA -1F102 ; disallowed_STD3_mapped ; 0031 002C # 5.2 DIGIT ONE COMMA -1F103 ; disallowed_STD3_mapped ; 0032 002C # 5.2 DIGIT TWO COMMA -1F104 ; disallowed_STD3_mapped ; 0033 002C # 5.2 DIGIT THREE COMMA -1F105 ; disallowed_STD3_mapped ; 0034 002C # 5.2 DIGIT FOUR COMMA -1F106 ; disallowed_STD3_mapped ; 0035 002C # 5.2 DIGIT FIVE COMMA -1F107 ; disallowed_STD3_mapped ; 0036 002C # 5.2 DIGIT SIX COMMA -1F108 ; disallowed_STD3_mapped ; 0037 002C # 5.2 DIGIT SEVEN COMMA -1F109 ; disallowed_STD3_mapped ; 0038 002C # 5.2 DIGIT EIGHT COMMA -1F10A ; disallowed_STD3_mapped ; 0039 002C # 5.2 DIGIT NINE COMMA -1F10B..1F10C ; valid ; ; NV8 # 7.0 DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO -1F10D..1F10F ; disallowed # NA .. -1F110 ; disallowed_STD3_mapped ; 0028 0061 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER A -1F111 ; disallowed_STD3_mapped ; 0028 0062 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER B -1F112 ; disallowed_STD3_mapped ; 0028 0063 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER C -1F113 ; disallowed_STD3_mapped ; 0028 0064 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER D -1F114 ; disallowed_STD3_mapped ; 0028 0065 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER E -1F115 ; disallowed_STD3_mapped ; 0028 0066 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER F -1F116 ; disallowed_STD3_mapped ; 0028 0067 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER G -1F117 ; disallowed_STD3_mapped ; 0028 0068 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER H -1F118 ; disallowed_STD3_mapped ; 0028 0069 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER I -1F119 ; disallowed_STD3_mapped ; 0028 006A 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER J -1F11A ; disallowed_STD3_mapped ; 0028 006B 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER K -1F11B ; disallowed_STD3_mapped ; 0028 006C 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER L -1F11C ; disallowed_STD3_mapped ; 0028 006D 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER M -1F11D ; disallowed_STD3_mapped ; 0028 006E 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER N -1F11E ; disallowed_STD3_mapped ; 0028 006F 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER O -1F11F ; disallowed_STD3_mapped ; 0028 0070 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER P -1F120 ; disallowed_STD3_mapped ; 0028 0071 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER Q -1F121 ; disallowed_STD3_mapped ; 0028 0072 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER R -1F122 ; disallowed_STD3_mapped ; 0028 0073 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER S -1F123 ; disallowed_STD3_mapped ; 0028 0074 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER T -1F124 ; disallowed_STD3_mapped ; 0028 0075 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER U -1F125 ; disallowed_STD3_mapped ; 0028 0076 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER V -1F126 ; disallowed_STD3_mapped ; 0028 0077 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER W -1F127 ; disallowed_STD3_mapped ; 0028 0078 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER X -1F128 ; disallowed_STD3_mapped ; 0028 0079 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER Y -1F129 ; disallowed_STD3_mapped ; 0028 007A 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER Z -1F12A ; mapped ; 3014 0073 3015 #5.2 TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S -1F12B ; mapped ; 0063 # 5.2 CIRCLED ITALIC LATIN CAPITAL LETTER C -1F12C ; mapped ; 0072 # 5.2 CIRCLED ITALIC LATIN CAPITAL LETTER R -1F12D ; mapped ; 0063 0064 # 5.2 CIRCLED CD -1F12E ; mapped ; 0077 007A # 5.2 CIRCLED WZ -1F12F ; disallowed # NA -1F130 ; mapped ; 0061 # 6.0 SQUARED LATIN CAPITAL LETTER A -1F131 ; mapped ; 0062 # 5.2 SQUARED LATIN CAPITAL LETTER B -1F132 ; mapped ; 0063 # 6.0 SQUARED LATIN CAPITAL LETTER C -1F133 ; mapped ; 0064 # 6.0 SQUARED LATIN CAPITAL LETTER D -1F134 ; mapped ; 0065 # 6.0 SQUARED LATIN CAPITAL LETTER E -1F135 ; mapped ; 0066 # 6.0 SQUARED LATIN CAPITAL LETTER F -1F136 ; mapped ; 0067 # 6.0 SQUARED LATIN CAPITAL LETTER G -1F137 ; mapped ; 0068 # 6.0 SQUARED LATIN CAPITAL LETTER H -1F138 ; mapped ; 0069 # 6.0 SQUARED LATIN CAPITAL LETTER I -1F139 ; mapped ; 006A # 6.0 SQUARED LATIN CAPITAL LETTER J -1F13A ; mapped ; 006B # 6.0 SQUARED LATIN CAPITAL LETTER K -1F13B ; mapped ; 006C # 6.0 SQUARED LATIN CAPITAL LETTER L -1F13C ; mapped ; 006D # 6.0 SQUARED LATIN CAPITAL LETTER M -1F13D ; mapped ; 006E # 5.2 SQUARED LATIN CAPITAL LETTER N -1F13E ; mapped ; 006F # 6.0 SQUARED LATIN CAPITAL LETTER O -1F13F ; mapped ; 0070 # 5.2 SQUARED LATIN CAPITAL LETTER P -1F140 ; mapped ; 0071 # 6.0 SQUARED LATIN CAPITAL LETTER Q -1F141 ; mapped ; 0072 # 6.0 SQUARED LATIN CAPITAL LETTER R -1F142 ; mapped ; 0073 # 5.2 SQUARED LATIN CAPITAL LETTER S -1F143 ; mapped ; 0074 # 6.0 SQUARED LATIN CAPITAL LETTER T -1F144 ; mapped ; 0075 # 6.0 SQUARED LATIN CAPITAL LETTER U -1F145 ; mapped ; 0076 # 6.0 SQUARED LATIN CAPITAL LETTER V -1F146 ; mapped ; 0077 # 5.2 SQUARED LATIN CAPITAL LETTER W -1F147 ; mapped ; 0078 # 6.0 SQUARED LATIN CAPITAL LETTER X -1F148 ; mapped ; 0079 # 6.0 SQUARED LATIN CAPITAL LETTER Y -1F149 ; mapped ; 007A # 6.0 SQUARED LATIN CAPITAL LETTER Z -1F14A ; mapped ; 0068 0076 # 5.2 SQUARED HV -1F14B ; mapped ; 006D 0076 # 5.2 SQUARED MV -1F14C ; mapped ; 0073 0064 # 5.2 SQUARED SD -1F14D ; mapped ; 0073 0073 # 5.2 SQUARED SS -1F14E ; mapped ; 0070 0070 0076 #5.2 SQUARED PPV -1F14F ; mapped ; 0077 0063 # 6.0 SQUARED WC -1F150..1F156 ; valid ; ; NV8 # 6.0 NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER G -1F157 ; valid ; ; NV8 # 5.2 NEGATIVE CIRCLED LATIN CAPITAL LETTER H -1F158..1F15E ; valid ; ; NV8 # 6.0 NEGATIVE CIRCLED LATIN CAPITAL LETTER I..NEGATIVE CIRCLED LATIN CAPITAL LETTER O -1F15F ; valid ; ; NV8 # 5.2 NEGATIVE CIRCLED LATIN CAPITAL LETTER P -1F160..1F169 ; valid ; ; NV8 # 6.0 NEGATIVE CIRCLED LATIN CAPITAL LETTER Q..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z -1F16A ; mapped ; 006D 0063 # 6.1 RAISED MC SIGN -1F16B ; mapped ; 006D 0064 # 6.1 RAISED MD SIGN -1F16C..1F16F ; disallowed # NA .. -1F170..1F178 ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER I -1F179 ; valid ; ; NV8 # 5.2 NEGATIVE SQUARED LATIN CAPITAL LETTER J -1F17A ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER K -1F17B..1F17C ; valid ; ; NV8 # 5.2 NEGATIVE SQUARED LATIN CAPITAL LETTER L..NEGATIVE SQUARED LATIN CAPITAL LETTER M -1F17D..1F17E ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER N..NEGATIVE SQUARED LATIN CAPITAL LETTER O -1F17F ; valid ; ; NV8 # 5.2 NEGATIVE SQUARED LATIN CAPITAL LETTER P -1F180..1F189 ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER Q..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -1F18A..1F18D ; valid ; ; NV8 # 5.2 CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P..NEGATIVE SQUARED SA -1F18E..1F18F ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED AB..NEGATIVE SQUARED WC -1F190 ; mapped ; 0064 006A # 5.2 SQUARE DJ -1F191..1F19A ; valid ; ; NV8 # 6.0 SQUARED CL..SQUARED VS -1F19B..1F1AC ; valid ; ; NV8 # 9.0 SQUARED THREE D..SQUARED VOD -1F1AD..1F1E5 ; disallowed # NA .. -1F1E6..1F1FF ; valid ; ; NV8 # 6.0 REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z -1F200 ; mapped ; 307B 304B # 5.2 SQUARE HIRAGANA HOKA -1F201 ; mapped ; 30B3 30B3 # 6.0 SQUARED KATAKANA KOKO -1F202 ; mapped ; 30B5 # 6.0 SQUARED KATAKANA SA -1F203..1F20F ; disallowed # NA .. -1F210 ; mapped ; 624B # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-624B -1F211 ; mapped ; 5B57 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5B57 -1F212 ; mapped ; 53CC # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-53CC -1F213 ; mapped ; 30C7 # 5.2 SQUARED KATAKANA DE -1F214 ; mapped ; 4E8C # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4E8C -1F215 ; mapped ; 591A # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-591A -1F216 ; mapped ; 89E3 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-89E3 -1F217 ; mapped ; 5929 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5929 -1F218 ; mapped ; 4EA4 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4EA4 -1F219 ; mapped ; 6620 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6620 -1F21A ; mapped ; 7121 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-7121 -1F21B ; mapped ; 6599 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6599 -1F21C ; mapped ; 524D # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-524D -1F21D ; mapped ; 5F8C # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5F8C -1F21E ; mapped ; 518D # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-518D -1F21F ; mapped ; 65B0 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-65B0 -1F220 ; mapped ; 521D # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-521D -1F221 ; mapped ; 7D42 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-7D42 -1F222 ; mapped ; 751F # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-751F -1F223 ; mapped ; 8CA9 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-8CA9 -1F224 ; mapped ; 58F0 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-58F0 -1F225 ; mapped ; 5439 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5439 -1F226 ; mapped ; 6F14 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6F14 -1F227 ; mapped ; 6295 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6295 -1F228 ; mapped ; 6355 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6355 -1F229 ; mapped ; 4E00 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4E00 -1F22A ; mapped ; 4E09 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4E09 -1F22B ; mapped ; 904A # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-904A -1F22C ; mapped ; 5DE6 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5DE6 -1F22D ; mapped ; 4E2D # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4E2D -1F22E ; mapped ; 53F3 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-53F3 -1F22F ; mapped ; 6307 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6307 -1F230 ; mapped ; 8D70 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-8D70 -1F231 ; mapped ; 6253 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6253 -1F232 ; mapped ; 7981 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-7981 -1F233 ; mapped ; 7A7A # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-7A7A -1F234 ; mapped ; 5408 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-5408 -1F235 ; mapped ; 6E80 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-6E80 -1F236 ; mapped ; 6709 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-6709 -1F237 ; mapped ; 6708 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-6708 -1F238 ; mapped ; 7533 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-7533 -1F239 ; mapped ; 5272 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-5272 -1F23A ; mapped ; 55B6 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-55B6 -1F23B ; mapped ; 914D # 9.0 SQUARED CJK UNIFIED IDEOGRAPH-914D -1F23C..1F23F ; disallowed # NA .. -1F240 ; mapped ; 3014 672C 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C -1F241 ; mapped ; 3014 4E09 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 -1F242 ; mapped ; 3014 4E8C 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C -1F243 ; mapped ; 3014 5B89 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 -1F244 ; mapped ; 3014 70B9 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 -1F245 ; mapped ; 3014 6253 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 -1F246 ; mapped ; 3014 76D7 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 -1F247 ; mapped ; 3014 52DD 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD -1F248 ; mapped ; 3014 6557 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 -1F249..1F24F ; disallowed # NA .. -1F250 ; mapped ; 5F97 # 6.0 CIRCLED IDEOGRAPH ADVANTAGE -1F251 ; mapped ; 53EF # 6.0 CIRCLED IDEOGRAPH ACCEPT -1F252..1F25F ; disallowed # NA .. -1F260..1F265 ; valid ; ; NV8 # 10.0 ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI -1F266..1F2FF ; disallowed # NA .. -1F300..1F320 ; valid ; ; NV8 # 6.0 CYCLONE..SHOOTING STAR -1F321..1F32C ; valid ; ; NV8 # 7.0 THERMOMETER..WIND BLOWING FACE -1F32D..1F32F ; valid ; ; NV8 # 8.0 HOT DOG..BURRITO -1F330..1F335 ; valid ; ; NV8 # 6.0 CHESTNUT..CACTUS -1F336 ; valid ; ; NV8 # 7.0 HOT PEPPER -1F337..1F37C ; valid ; ; NV8 # 6.0 TULIP..BABY BOTTLE -1F37D ; valid ; ; NV8 # 7.0 FORK AND KNIFE WITH PLATE -1F37E..1F37F ; valid ; ; NV8 # 8.0 BOTTLE WITH POPPING CORK..POPCORN -1F380..1F393 ; valid ; ; NV8 # 6.0 RIBBON..GRADUATION CAP -1F394..1F39F ; valid ; ; NV8 # 7.0 HEART WITH TIP ON THE LEFT..ADMISSION TICKETS -1F3A0..1F3C4 ; valid ; ; NV8 # 6.0 CAROUSEL HORSE..SURFER -1F3C5 ; valid ; ; NV8 # 7.0 SPORTS MEDAL -1F3C6..1F3CA ; valid ; ; NV8 # 6.0 TROPHY..SWIMMER -1F3CB..1F3CE ; valid ; ; NV8 # 7.0 WEIGHT LIFTER..RACING CAR -1F3CF..1F3D3 ; valid ; ; NV8 # 8.0 CRICKET BAT AND BALL..TABLE TENNIS PADDLE AND BALL -1F3D4..1F3DF ; valid ; ; NV8 # 7.0 SNOW CAPPED MOUNTAIN..STADIUM -1F3E0..1F3F0 ; valid ; ; NV8 # 6.0 HOUSE BUILDING..EUROPEAN CASTLE -1F3F1..1F3F7 ; valid ; ; NV8 # 7.0 WHITE PENNANT..LABEL -1F3F8..1F3FF ; valid ; ; NV8 # 8.0 BADMINTON RACQUET AND SHUTTLECOCK..EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400..1F43E ; valid ; ; NV8 # 6.0 RAT..PAW PRINTS -1F43F ; valid ; ; NV8 # 7.0 CHIPMUNK -1F440 ; valid ; ; NV8 # 6.0 EYES -1F441 ; valid ; ; NV8 # 7.0 EYE -1F442..1F4F7 ; valid ; ; NV8 # 6.0 EAR..CAMERA -1F4F8 ; valid ; ; NV8 # 7.0 CAMERA WITH FLASH -1F4F9..1F4FC ; valid ; ; NV8 # 6.0 VIDEO CAMERA..VIDEOCASSETTE -1F4FD..1F4FE ; valid ; ; NV8 # 7.0 FILM PROJECTOR..PORTABLE STEREO -1F4FF ; valid ; ; NV8 # 8.0 PRAYER BEADS -1F500..1F53D ; valid ; ; NV8 # 6.0 TWISTED RIGHTWARDS ARROWS..DOWN-POINTING SMALL RED TRIANGLE -1F53E..1F53F ; valid ; ; NV8 # 7.0 LOWER RIGHT SHADOWED WHITE CIRCLE..UPPER RIGHT SHADOWED WHITE CIRCLE -1F540..1F543 ; valid ; ; NV8 # 6.1 CIRCLED CROSS POMMEE..NOTCHED LEFT SEMICIRCLE WITH THREE DOTS -1F544..1F54A ; valid ; ; NV8 # 7.0 NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS..DOVE OF PEACE -1F54B..1F54F ; valid ; ; NV8 # 8.0 KAABA..BOWL OF HYGIEIA -1F550..1F567 ; valid ; ; NV8 # 6.0 CLOCK FACE ONE OCLOCK..CLOCK FACE TWELVE-THIRTY -1F568..1F579 ; valid ; ; NV8 # 7.0 RIGHT SPEAKER..JOYSTICK -1F57A ; valid ; ; NV8 # 9.0 MAN DANCING -1F57B..1F5A3 ; valid ; ; NV8 # 7.0 LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX -1F5A4 ; valid ; ; NV8 # 9.0 BLACK HEART -1F5A5..1F5FA ; valid ; ; NV8 # 7.0 DESKTOP COMPUTER..WORLD MAP -1F5FB..1F5FF ; valid ; ; NV8 # 6.0 MOUNT FUJI..MOYAI -1F600 ; valid ; ; NV8 # 6.1 GRINNING FACE -1F601..1F610 ; valid ; ; NV8 # 6.0 GRINNING FACE WITH SMILING EYES..NEUTRAL FACE -1F611 ; valid ; ; NV8 # 6.1 EXPRESSIONLESS FACE -1F612..1F614 ; valid ; ; NV8 # 6.0 UNAMUSED FACE..PENSIVE FACE -1F615 ; valid ; ; NV8 # 6.1 CONFUSED FACE -1F616 ; valid ; ; NV8 # 6.0 CONFOUNDED FACE -1F617 ; valid ; ; NV8 # 6.1 KISSING FACE -1F618 ; valid ; ; NV8 # 6.0 FACE THROWING A KISS -1F619 ; valid ; ; NV8 # 6.1 KISSING FACE WITH SMILING EYES -1F61A ; valid ; ; NV8 # 6.0 KISSING FACE WITH CLOSED EYES -1F61B ; valid ; ; NV8 # 6.1 FACE WITH STUCK-OUT TONGUE -1F61C..1F61E ; valid ; ; NV8 # 6.0 FACE WITH STUCK-OUT TONGUE AND WINKING EYE..DISAPPOINTED FACE -1F61F ; valid ; ; NV8 # 6.1 WORRIED FACE -1F620..1F625 ; valid ; ; NV8 # 6.0 ANGRY FACE..DISAPPOINTED BUT RELIEVED FACE -1F626..1F627 ; valid ; ; NV8 # 6.1 FROWNING FACE WITH OPEN MOUTH..ANGUISHED FACE -1F628..1F62B ; valid ; ; NV8 # 6.0 FEARFUL FACE..TIRED FACE -1F62C ; valid ; ; NV8 # 6.1 GRIMACING FACE -1F62D ; valid ; ; NV8 # 6.0 LOUDLY CRYING FACE -1F62E..1F62F ; valid ; ; NV8 # 6.1 FACE WITH OPEN MOUTH..HUSHED FACE -1F630..1F633 ; valid ; ; NV8 # 6.0 FACE WITH OPEN MOUTH AND COLD SWEAT..FLUSHED FACE -1F634 ; valid ; ; NV8 # 6.1 SLEEPING FACE -1F635..1F640 ; valid ; ; NV8 # 6.0 DIZZY FACE..WEARY CAT FACE -1F641..1F642 ; valid ; ; NV8 # 7.0 SLIGHTLY FROWNING FACE..SLIGHTLY SMILING FACE -1F643..1F644 ; valid ; ; NV8 # 8.0 UPSIDE-DOWN FACE..FACE WITH ROLLING EYES -1F645..1F64F ; valid ; ; NV8 # 6.0 FACE WITH NO GOOD GESTURE..PERSON WITH FOLDED HANDS -1F650..1F67F ; valid ; ; NV8 # 7.0 NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD -1F680..1F6C5 ; valid ; ; NV8 # 6.0 ROCKET..LEFT LUGGAGE -1F6C6..1F6CF ; valid ; ; NV8 # 7.0 TRIANGLE WITH ROUNDED CORNERS..BED -1F6D0 ; valid ; ; NV8 # 8.0 PLACE OF WORSHIP -1F6D1..1F6D2 ; valid ; ; NV8 # 9.0 OCTAGONAL SIGN..SHOPPING TROLLEY -1F6D3..1F6D4 ; valid ; ; NV8 # 10.0 STUPA..PAGODA -1F6D5..1F6DF ; disallowed # NA .. -1F6E0..1F6EC ; valid ; ; NV8 # 7.0 HAMMER AND WRENCH..AIRPLANE ARRIVING -1F6ED..1F6EF ; disallowed # NA .. -1F6F0..1F6F3 ; valid ; ; NV8 # 7.0 SATELLITE..PASSENGER SHIP -1F6F4..1F6F6 ; valid ; ; NV8 # 9.0 SCOOTER..CANOE -1F6F7..1F6F8 ; valid ; ; NV8 # 10.0 SLED..FLYING SAUCER -1F6F9..1F6FF ; disallowed # NA .. -1F700..1F773 ; valid ; ; NV8 # 6.0 ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE -1F774..1F77F ; disallowed # NA .. -1F780..1F7D4 ; valid ; ; NV8 # 7.0 BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR -1F7D5..1F7FF ; disallowed # NA .. -1F800..1F80B ; valid ; ; NV8 # 7.0 LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F80C..1F80F ; disallowed # NA .. -1F810..1F847 ; valid ; ; NV8 # 7.0 LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW -1F848..1F84F ; disallowed # NA .. -1F850..1F859 ; valid ; ; NV8 # 7.0 LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW -1F85A..1F85F ; disallowed # NA .. -1F860..1F887 ; valid ; ; NV8 # 7.0 WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW -1F888..1F88F ; disallowed # NA .. -1F890..1F8AD ; valid ; ; NV8 # 7.0 LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F8AE..1F8FF ; disallowed # NA .. -1F900..1F90B ; valid ; ; NV8 # 10.0 CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT -1F90C..1F90F ; disallowed # NA .. -1F910..1F918 ; valid ; ; NV8 # 8.0 ZIPPER-MOUTH FACE..SIGN OF THE HORNS -1F919..1F91E ; valid ; ; NV8 # 9.0 CALL ME HAND..HAND WITH INDEX AND MIDDLE FINGERS CROSSED -1F91F ; valid ; ; NV8 # 10.0 I LOVE YOU HAND SIGN -1F920..1F927 ; valid ; ; NV8 # 9.0 FACE WITH COWBOY HAT..SNEEZING FACE -1F928..1F92F ; valid ; ; NV8 # 10.0 FACE WITH ONE EYEBROW RAISED..SHOCKED FACE WITH EXPLODING HEAD -1F930 ; valid ; ; NV8 # 9.0 PREGNANT WOMAN -1F931..1F932 ; valid ; ; NV8 # 10.0 BREAST-FEEDING..PALMS UP TOGETHER -1F933..1F93E ; valid ; ; NV8 # 9.0 SELFIE..HANDBALL -1F93F ; disallowed # NA -1F940..1F94B ; valid ; ; NV8 # 9.0 WILTED FLOWER..MARTIAL ARTS UNIFORM -1F94C ; valid ; ; NV8 # 10.0 CURLING STONE -1F94D..1F94F ; disallowed # NA .. -1F950..1F95E ; valid ; ; NV8 # 9.0 CROISSANT..PANCAKES -1F95F..1F96B ; valid ; ; NV8 # 10.0 DUMPLING..CANNED FOOD -1F96C..1F97F ; disallowed # NA .. -1F980..1F984 ; valid ; ; NV8 # 8.0 CRAB..UNICORN FACE -1F985..1F991 ; valid ; ; NV8 # 9.0 EAGLE..SQUID -1F992..1F997 ; valid ; ; NV8 # 10.0 GIRAFFE FACE..CRICKET -1F998..1F9BF ; disallowed # NA .. -1F9C0 ; valid ; ; NV8 # 8.0 CHEESE WEDGE -1F9C1..1F9CF ; disallowed # NA .. -1F9D0..1F9E6 ; valid ; ; NV8 # 10.0 FACE WITH MONOCLE..SOCKS -1F9E7..1FFFD ; disallowed # NA .. -1FFFE..1FFFF ; disallowed # 2.0 .. -20000..2A6D6 ; valid # 3.1 CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2A6D7..2A6FF ; disallowed # NA .. -2A700..2B734 ; valid # 5.2 CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 -2B735..2B73F ; disallowed # NA .. -2B740..2B81D ; valid # 6.0 CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D -2B81E..2B81F ; disallowed # NA .. -2B820..2CEA1 ; valid # 8.0 CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 -2CEA2..2CEAF ; disallowed # NA .. -2CEB0..2EBE0 ; valid # 10.0 CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 -2EBE1..2F7FF ; disallowed # NA .. -2F800 ; mapped ; 4E3D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F800 -2F801 ; mapped ; 4E38 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F801 -2F802 ; mapped ; 4E41 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F802 -2F803 ; mapped ; 20122 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F803 -2F804 ; mapped ; 4F60 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F804 -2F805 ; mapped ; 4FAE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F805 -2F806 ; mapped ; 4FBB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F806 -2F807 ; mapped ; 5002 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F807 -2F808 ; mapped ; 507A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F808 -2F809 ; mapped ; 5099 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F809 -2F80A ; mapped ; 50E7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80A -2F80B ; mapped ; 50CF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80B -2F80C ; mapped ; 349E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80C -2F80D ; mapped ; 2063A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80D -2F80E ; mapped ; 514D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80E -2F80F ; mapped ; 5154 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80F -2F810 ; mapped ; 5164 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F810 -2F811 ; mapped ; 5177 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F811 -2F812 ; mapped ; 2051C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F812 -2F813 ; mapped ; 34B9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F813 -2F814 ; mapped ; 5167 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F814 -2F815 ; mapped ; 518D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F815 -2F816 ; mapped ; 2054B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F816 -2F817 ; mapped ; 5197 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F817 -2F818 ; mapped ; 51A4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F818 -2F819 ; mapped ; 4ECC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F819 -2F81A ; mapped ; 51AC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81A -2F81B ; mapped ; 51B5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81B -2F81C ; mapped ; 291DF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81C -2F81D ; mapped ; 51F5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81D -2F81E ; mapped ; 5203 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81E -2F81F ; mapped ; 34DF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81F -2F820 ; mapped ; 523B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F820 -2F821 ; mapped ; 5246 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F821 -2F822 ; mapped ; 5272 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F822 -2F823 ; mapped ; 5277 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F823 -2F824 ; mapped ; 3515 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F824 -2F825 ; mapped ; 52C7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F825 -2F826 ; mapped ; 52C9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F826 -2F827 ; mapped ; 52E4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F827 -2F828 ; mapped ; 52FA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F828 -2F829 ; mapped ; 5305 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F829 -2F82A ; mapped ; 5306 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82A -2F82B ; mapped ; 5317 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82B -2F82C ; mapped ; 5349 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82C -2F82D ; mapped ; 5351 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82D -2F82E ; mapped ; 535A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82E -2F82F ; mapped ; 5373 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82F -2F830 ; mapped ; 537D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F830 -2F831..2F833 ; mapped ; 537F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F831..CJK COMPATIBILITY IDEOGRAPH-2F833 -2F834 ; mapped ; 20A2C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F834 -2F835 ; mapped ; 7070 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F835 -2F836 ; mapped ; 53CA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F836 -2F837 ; mapped ; 53DF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F837 -2F838 ; mapped ; 20B63 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F838 -2F839 ; mapped ; 53EB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F839 -2F83A ; mapped ; 53F1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83A -2F83B ; mapped ; 5406 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83B -2F83C ; mapped ; 549E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83C -2F83D ; mapped ; 5438 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83D -2F83E ; mapped ; 5448 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83E -2F83F ; mapped ; 5468 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83F -2F840 ; mapped ; 54A2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F840 -2F841 ; mapped ; 54F6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F841 -2F842 ; mapped ; 5510 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F842 -2F843 ; mapped ; 5553 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F843 -2F844 ; mapped ; 5563 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F844 -2F845..2F846 ; mapped ; 5584 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F845..CJK COMPATIBILITY IDEOGRAPH-2F846 -2F847 ; mapped ; 5599 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F847 -2F848 ; mapped ; 55AB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F848 -2F849 ; mapped ; 55B3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F849 -2F84A ; mapped ; 55C2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84A -2F84B ; mapped ; 5716 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84B -2F84C ; mapped ; 5606 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84C -2F84D ; mapped ; 5717 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84D -2F84E ; mapped ; 5651 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84E -2F84F ; mapped ; 5674 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84F -2F850 ; mapped ; 5207 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F850 -2F851 ; mapped ; 58EE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F851 -2F852 ; mapped ; 57CE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F852 -2F853 ; mapped ; 57F4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F853 -2F854 ; mapped ; 580D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F854 -2F855 ; mapped ; 578B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F855 -2F856 ; mapped ; 5832 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F856 -2F857 ; mapped ; 5831 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F857 -2F858 ; mapped ; 58AC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F858 -2F859 ; mapped ; 214E4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F859 -2F85A ; mapped ; 58F2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85A -2F85B ; mapped ; 58F7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85B -2F85C ; mapped ; 5906 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85C -2F85D ; mapped ; 591A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85D -2F85E ; mapped ; 5922 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85E -2F85F ; mapped ; 5962 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85F -2F860 ; mapped ; 216A8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F860 -2F861 ; mapped ; 216EA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F861 -2F862 ; mapped ; 59EC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F862 -2F863 ; mapped ; 5A1B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F863 -2F864 ; mapped ; 5A27 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F864 -2F865 ; mapped ; 59D8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F865 -2F866 ; mapped ; 5A66 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F866 -2F867 ; mapped ; 36EE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F867 -2F868 ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F868 -2F869 ; mapped ; 5B08 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F869 -2F86A..2F86B ; mapped ; 5B3E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86A..CJK COMPATIBILITY IDEOGRAPH-2F86B -2F86C ; mapped ; 219C8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86C -2F86D ; mapped ; 5BC3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86D -2F86E ; mapped ; 5BD8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86E -2F86F ; mapped ; 5BE7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86F -2F870 ; mapped ; 5BF3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F870 -2F871 ; mapped ; 21B18 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F871 -2F872 ; mapped ; 5BFF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F872 -2F873 ; mapped ; 5C06 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F873 -2F874 ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F874 -2F875 ; mapped ; 5C22 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F875 -2F876 ; mapped ; 3781 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F876 -2F877 ; mapped ; 5C60 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F877 -2F878 ; mapped ; 5C6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F878 -2F879 ; mapped ; 5CC0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F879 -2F87A ; mapped ; 5C8D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87A -2F87B ; mapped ; 21DE4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87B -2F87C ; mapped ; 5D43 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87C -2F87D ; mapped ; 21DE6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87D -2F87E ; mapped ; 5D6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87E -2F87F ; mapped ; 5D6B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87F -2F880 ; mapped ; 5D7C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F880 -2F881 ; mapped ; 5DE1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F881 -2F882 ; mapped ; 5DE2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F882 -2F883 ; mapped ; 382F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F883 -2F884 ; mapped ; 5DFD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F884 -2F885 ; mapped ; 5E28 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F885 -2F886 ; mapped ; 5E3D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F886 -2F887 ; mapped ; 5E69 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F887 -2F888 ; mapped ; 3862 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F888 -2F889 ; mapped ; 22183 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F889 -2F88A ; mapped ; 387C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88A -2F88B ; mapped ; 5EB0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88B -2F88C ; mapped ; 5EB3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88C -2F88D ; mapped ; 5EB6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88D -2F88E ; mapped ; 5ECA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88E -2F88F ; mapped ; 2A392 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88F -2F890 ; mapped ; 5EFE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F890 -2F891..2F892 ; mapped ; 22331 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F891..CJK COMPATIBILITY IDEOGRAPH-2F892 -2F893 ; mapped ; 8201 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F893 -2F894..2F895 ; mapped ; 5F22 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F894..CJK COMPATIBILITY IDEOGRAPH-2F895 -2F896 ; mapped ; 38C7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F896 -2F897 ; mapped ; 232B8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F897 -2F898 ; mapped ; 261DA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F898 -2F899 ; mapped ; 5F62 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F899 -2F89A ; mapped ; 5F6B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89A -2F89B ; mapped ; 38E3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89B -2F89C ; mapped ; 5F9A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89C -2F89D ; mapped ; 5FCD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89D -2F89E ; mapped ; 5FD7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89E -2F89F ; mapped ; 5FF9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89F -2F8A0 ; mapped ; 6081 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A0 -2F8A1 ; mapped ; 393A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A1 -2F8A2 ; mapped ; 391C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A2 -2F8A3 ; mapped ; 6094 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A3 -2F8A4 ; mapped ; 226D4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A4 -2F8A5 ; mapped ; 60C7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A5 -2F8A6 ; mapped ; 6148 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A6 -2F8A7 ; mapped ; 614C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A7 -2F8A8 ; mapped ; 614E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A8 -2F8A9 ; mapped ; 614C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A9 -2F8AA ; mapped ; 617A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AA -2F8AB ; mapped ; 618E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AB -2F8AC ; mapped ; 61B2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AC -2F8AD ; mapped ; 61A4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AD -2F8AE ; mapped ; 61AF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AE -2F8AF ; mapped ; 61DE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AF -2F8B0 ; mapped ; 61F2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B0 -2F8B1 ; mapped ; 61F6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B1 -2F8B2 ; mapped ; 6210 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B2 -2F8B3 ; mapped ; 621B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B3 -2F8B4 ; mapped ; 625D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B4 -2F8B5 ; mapped ; 62B1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B5 -2F8B6 ; mapped ; 62D4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B6 -2F8B7 ; mapped ; 6350 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B7 -2F8B8 ; mapped ; 22B0C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B8 -2F8B9 ; mapped ; 633D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B9 -2F8BA ; mapped ; 62FC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BA -2F8BB ; mapped ; 6368 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BB -2F8BC ; mapped ; 6383 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BC -2F8BD ; mapped ; 63E4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BD -2F8BE ; mapped ; 22BF1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BE -2F8BF ; mapped ; 6422 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BF -2F8C0 ; mapped ; 63C5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C0 -2F8C1 ; mapped ; 63A9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C1 -2F8C2 ; mapped ; 3A2E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C2 -2F8C3 ; mapped ; 6469 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C3 -2F8C4 ; mapped ; 647E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C4 -2F8C5 ; mapped ; 649D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C5 -2F8C6 ; mapped ; 6477 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C6 -2F8C7 ; mapped ; 3A6C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C7 -2F8C8 ; mapped ; 654F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C8 -2F8C9 ; mapped ; 656C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C9 -2F8CA ; mapped ; 2300A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CA -2F8CB ; mapped ; 65E3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CB -2F8CC ; mapped ; 66F8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CC -2F8CD ; mapped ; 6649 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CD -2F8CE ; mapped ; 3B19 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CE -2F8CF ; mapped ; 6691 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CF -2F8D0 ; mapped ; 3B08 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D0 -2F8D1 ; mapped ; 3AE4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D1 -2F8D2 ; mapped ; 5192 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D2 -2F8D3 ; mapped ; 5195 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D3 -2F8D4 ; mapped ; 6700 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D4 -2F8D5 ; mapped ; 669C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D5 -2F8D6 ; mapped ; 80AD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D6 -2F8D7 ; mapped ; 43D9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D7 -2F8D8 ; mapped ; 6717 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D8 -2F8D9 ; mapped ; 671B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D9 -2F8DA ; mapped ; 6721 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DA -2F8DB ; mapped ; 675E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DB -2F8DC ; mapped ; 6753 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DC -2F8DD ; mapped ; 233C3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DD -2F8DE ; mapped ; 3B49 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DE -2F8DF ; mapped ; 67FA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DF -2F8E0 ; mapped ; 6785 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E0 -2F8E1 ; mapped ; 6852 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E1 -2F8E2 ; mapped ; 6885 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E2 -2F8E3 ; mapped ; 2346D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E3 -2F8E4 ; mapped ; 688E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E4 -2F8E5 ; mapped ; 681F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E5 -2F8E6 ; mapped ; 6914 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E6 -2F8E7 ; mapped ; 3B9D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E7 -2F8E8 ; mapped ; 6942 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E8 -2F8E9 ; mapped ; 69A3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E9 -2F8EA ; mapped ; 69EA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EA -2F8EB ; mapped ; 6AA8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EB -2F8EC ; mapped ; 236A3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EC -2F8ED ; mapped ; 6ADB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8ED -2F8EE ; mapped ; 3C18 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EE -2F8EF ; mapped ; 6B21 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EF -2F8F0 ; mapped ; 238A7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F0 -2F8F1 ; mapped ; 6B54 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F1 -2F8F2 ; mapped ; 3C4E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F2 -2F8F3 ; mapped ; 6B72 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F3 -2F8F4 ; mapped ; 6B9F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F4 -2F8F5 ; mapped ; 6BBA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F5 -2F8F6 ; mapped ; 6BBB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F6 -2F8F7 ; mapped ; 23A8D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F7 -2F8F8 ; mapped ; 21D0B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F8 -2F8F9 ; mapped ; 23AFA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F9 -2F8FA ; mapped ; 6C4E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FA -2F8FB ; mapped ; 23CBC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FB -2F8FC ; mapped ; 6CBF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FC -2F8FD ; mapped ; 6CCD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FD -2F8FE ; mapped ; 6C67 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FE -2F8FF ; mapped ; 6D16 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FF -2F900 ; mapped ; 6D3E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F900 -2F901 ; mapped ; 6D77 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F901 -2F902 ; mapped ; 6D41 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F902 -2F903 ; mapped ; 6D69 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F903 -2F904 ; mapped ; 6D78 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F904 -2F905 ; mapped ; 6D85 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F905 -2F906 ; mapped ; 23D1E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F906 -2F907 ; mapped ; 6D34 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F907 -2F908 ; mapped ; 6E2F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F908 -2F909 ; mapped ; 6E6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F909 -2F90A ; mapped ; 3D33 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90A -2F90B ; mapped ; 6ECB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90B -2F90C ; mapped ; 6EC7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90C -2F90D ; mapped ; 23ED1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90D -2F90E ; mapped ; 6DF9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90E -2F90F ; mapped ; 6F6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90F -2F910 ; mapped ; 23F5E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F910 -2F911 ; mapped ; 23F8E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F911 -2F912 ; mapped ; 6FC6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F912 -2F913 ; mapped ; 7039 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F913 -2F914 ; mapped ; 701E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F914 -2F915 ; mapped ; 701B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F915 -2F916 ; mapped ; 3D96 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F916 -2F917 ; mapped ; 704A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F917 -2F918 ; mapped ; 707D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F918 -2F919 ; mapped ; 7077 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F919 -2F91A ; mapped ; 70AD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91A -2F91B ; mapped ; 20525 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91B -2F91C ; mapped ; 7145 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91C -2F91D ; mapped ; 24263 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91D -2F91E ; mapped ; 719C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91E -2F91F ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91F -2F920 ; mapped ; 7228 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F920 -2F921 ; mapped ; 7235 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F921 -2F922 ; mapped ; 7250 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F922 -2F923 ; mapped ; 24608 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F923 -2F924 ; mapped ; 7280 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F924 -2F925 ; mapped ; 7295 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F925 -2F926 ; mapped ; 24735 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F926 -2F927 ; mapped ; 24814 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F927 -2F928 ; mapped ; 737A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F928 -2F929 ; mapped ; 738B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F929 -2F92A ; mapped ; 3EAC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92A -2F92B ; mapped ; 73A5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92B -2F92C..2F92D ; mapped ; 3EB8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92C..CJK COMPATIBILITY IDEOGRAPH-2F92D -2F92E ; mapped ; 7447 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92E -2F92F ; mapped ; 745C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92F -2F930 ; mapped ; 7471 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F930 -2F931 ; mapped ; 7485 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F931 -2F932 ; mapped ; 74CA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F932 -2F933 ; mapped ; 3F1B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F933 -2F934 ; mapped ; 7524 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F934 -2F935 ; mapped ; 24C36 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F935 -2F936 ; mapped ; 753E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F936 -2F937 ; mapped ; 24C92 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F937 -2F938 ; mapped ; 7570 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F938 -2F939 ; mapped ; 2219F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F939 -2F93A ; mapped ; 7610 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93A -2F93B ; mapped ; 24FA1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93B -2F93C ; mapped ; 24FB8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93C -2F93D ; mapped ; 25044 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93D -2F93E ; mapped ; 3FFC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93E -2F93F ; mapped ; 4008 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93F -2F940 ; mapped ; 76F4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F940 -2F941 ; mapped ; 250F3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F941 -2F942 ; mapped ; 250F2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F942 -2F943 ; mapped ; 25119 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F943 -2F944 ; mapped ; 25133 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F944 -2F945 ; mapped ; 771E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F945 -2F946..2F947 ; mapped ; 771F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F946..CJK COMPATIBILITY IDEOGRAPH-2F947 -2F948 ; mapped ; 774A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F948 -2F949 ; mapped ; 4039 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F949 -2F94A ; mapped ; 778B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94A -2F94B ; mapped ; 4046 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94B -2F94C ; mapped ; 4096 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94C -2F94D ; mapped ; 2541D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94D -2F94E ; mapped ; 784E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94E -2F94F ; mapped ; 788C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94F -2F950 ; mapped ; 78CC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F950 -2F951 ; mapped ; 40E3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F951 -2F952 ; mapped ; 25626 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F952 -2F953 ; mapped ; 7956 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F953 -2F954 ; mapped ; 2569A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F954 -2F955 ; mapped ; 256C5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F955 -2F956 ; mapped ; 798F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F956 -2F957 ; mapped ; 79EB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F957 -2F958 ; mapped ; 412F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F958 -2F959 ; mapped ; 7A40 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F959 -2F95A ; mapped ; 7A4A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95A -2F95B ; mapped ; 7A4F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95B -2F95C ; mapped ; 2597C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95C -2F95D..2F95E ; mapped ; 25AA7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95D..CJK COMPATIBILITY IDEOGRAPH-2F95E -2F95F ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95F -2F960 ; mapped ; 4202 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F960 -2F961 ; mapped ; 25BAB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F961 -2F962 ; mapped ; 7BC6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F962 -2F963 ; mapped ; 7BC9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F963 -2F964 ; mapped ; 4227 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F964 -2F965 ; mapped ; 25C80 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F965 -2F966 ; mapped ; 7CD2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F966 -2F967 ; mapped ; 42A0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F967 -2F968 ; mapped ; 7CE8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F968 -2F969 ; mapped ; 7CE3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F969 -2F96A ; mapped ; 7D00 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96A -2F96B ; mapped ; 25F86 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96B -2F96C ; mapped ; 7D63 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96C -2F96D ; mapped ; 4301 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96D -2F96E ; mapped ; 7DC7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96E -2F96F ; mapped ; 7E02 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96F -2F970 ; mapped ; 7E45 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F970 -2F971 ; mapped ; 4334 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F971 -2F972 ; mapped ; 26228 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F972 -2F973 ; mapped ; 26247 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F973 -2F974 ; mapped ; 4359 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F974 -2F975 ; mapped ; 262D9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F975 -2F976 ; mapped ; 7F7A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F976 -2F977 ; mapped ; 2633E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F977 -2F978 ; mapped ; 7F95 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F978 -2F979 ; mapped ; 7FFA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F979 -2F97A ; mapped ; 8005 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97A -2F97B ; mapped ; 264DA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97B -2F97C ; mapped ; 26523 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97C -2F97D ; mapped ; 8060 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97D -2F97E ; mapped ; 265A8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97E -2F97F ; mapped ; 8070 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97F -2F980 ; mapped ; 2335F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F980 -2F981 ; mapped ; 43D5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F981 -2F982 ; mapped ; 80B2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F982 -2F983 ; mapped ; 8103 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F983 -2F984 ; mapped ; 440B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F984 -2F985 ; mapped ; 813E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F985 -2F986 ; mapped ; 5AB5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F986 -2F987 ; mapped ; 267A7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F987 -2F988 ; mapped ; 267B5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F988 -2F989 ; mapped ; 23393 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F989 -2F98A ; mapped ; 2339C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98A -2F98B ; mapped ; 8201 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98B -2F98C ; mapped ; 8204 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98C -2F98D ; mapped ; 8F9E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98D -2F98E ; mapped ; 446B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98E -2F98F ; mapped ; 8291 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98F -2F990 ; mapped ; 828B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F990 -2F991 ; mapped ; 829D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F991 -2F992 ; mapped ; 52B3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F992 -2F993 ; mapped ; 82B1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F993 -2F994 ; mapped ; 82B3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F994 -2F995 ; mapped ; 82BD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F995 -2F996 ; mapped ; 82E6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F996 -2F997 ; mapped ; 26B3C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F997 -2F998 ; mapped ; 82E5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F998 -2F999 ; mapped ; 831D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F999 -2F99A ; mapped ; 8363 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99A -2F99B ; mapped ; 83AD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99B -2F99C ; mapped ; 8323 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99C -2F99D ; mapped ; 83BD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99D -2F99E ; mapped ; 83E7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99E -2F99F ; mapped ; 8457 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99F -2F9A0 ; mapped ; 8353 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A0 -2F9A1 ; mapped ; 83CA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A1 -2F9A2 ; mapped ; 83CC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A2 -2F9A3 ; mapped ; 83DC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A3 -2F9A4 ; mapped ; 26C36 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A4 -2F9A5 ; mapped ; 26D6B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A5 -2F9A6 ; mapped ; 26CD5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A6 -2F9A7 ; mapped ; 452B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A7 -2F9A8 ; mapped ; 84F1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A8 -2F9A9 ; mapped ; 84F3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A9 -2F9AA ; mapped ; 8516 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AA -2F9AB ; mapped ; 273CA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AB -2F9AC ; mapped ; 8564 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AC -2F9AD ; mapped ; 26F2C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AD -2F9AE ; mapped ; 455D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AE -2F9AF ; mapped ; 4561 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AF -2F9B0 ; mapped ; 26FB1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B0 -2F9B1 ; mapped ; 270D2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B1 -2F9B2 ; mapped ; 456B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B2 -2F9B3 ; mapped ; 8650 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B3 -2F9B4 ; mapped ; 865C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B4 -2F9B5 ; mapped ; 8667 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B5 -2F9B6 ; mapped ; 8669 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B6 -2F9B7 ; mapped ; 86A9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B7 -2F9B8 ; mapped ; 8688 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B8 -2F9B9 ; mapped ; 870E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B9 -2F9BA ; mapped ; 86E2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BA -2F9BB ; mapped ; 8779 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BB -2F9BC ; mapped ; 8728 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BC -2F9BD ; mapped ; 876B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BD -2F9BE ; mapped ; 8786 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BE -2F9BF ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BF -2F9C0 ; mapped ; 87E1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C0 -2F9C1 ; mapped ; 8801 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C1 -2F9C2 ; mapped ; 45F9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C2 -2F9C3 ; mapped ; 8860 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C3 -2F9C4 ; mapped ; 8863 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C4 -2F9C5 ; mapped ; 27667 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C5 -2F9C6 ; mapped ; 88D7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C6 -2F9C7 ; mapped ; 88DE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C7 -2F9C8 ; mapped ; 4635 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C8 -2F9C9 ; mapped ; 88FA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C9 -2F9CA ; mapped ; 34BB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CA -2F9CB ; mapped ; 278AE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CB -2F9CC ; mapped ; 27966 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CC -2F9CD ; mapped ; 46BE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CD -2F9CE ; mapped ; 46C7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CE -2F9CF ; mapped ; 8AA0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CF -2F9D0 ; mapped ; 8AED # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D0 -2F9D1 ; mapped ; 8B8A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D1 -2F9D2 ; mapped ; 8C55 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D2 -2F9D3 ; mapped ; 27CA8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D3 -2F9D4 ; mapped ; 8CAB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D4 -2F9D5 ; mapped ; 8CC1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D5 -2F9D6 ; mapped ; 8D1B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D6 -2F9D7 ; mapped ; 8D77 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D7 -2F9D8 ; mapped ; 27F2F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D8 -2F9D9 ; mapped ; 20804 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D9 -2F9DA ; mapped ; 8DCB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DA -2F9DB ; mapped ; 8DBC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DB -2F9DC ; mapped ; 8DF0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DC -2F9DD ; mapped ; 208DE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DD -2F9DE ; mapped ; 8ED4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DE -2F9DF ; mapped ; 8F38 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DF -2F9E0 ; mapped ; 285D2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E0 -2F9E1 ; mapped ; 285ED # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E1 -2F9E2 ; mapped ; 9094 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E2 -2F9E3 ; mapped ; 90F1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E3 -2F9E4 ; mapped ; 9111 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E4 -2F9E5 ; mapped ; 2872E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E5 -2F9E6 ; mapped ; 911B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E6 -2F9E7 ; mapped ; 9238 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E7 -2F9E8 ; mapped ; 92D7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E8 -2F9E9 ; mapped ; 92D8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E9 -2F9EA ; mapped ; 927C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EA -2F9EB ; mapped ; 93F9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EB -2F9EC ; mapped ; 9415 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EC -2F9ED ; mapped ; 28BFA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9ED -2F9EE ; mapped ; 958B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EE -2F9EF ; mapped ; 4995 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EF -2F9F0 ; mapped ; 95B7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F0 -2F9F1 ; mapped ; 28D77 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F1 -2F9F2 ; mapped ; 49E6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F2 -2F9F3 ; mapped ; 96C3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F3 -2F9F4 ; mapped ; 5DB2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F4 -2F9F5 ; mapped ; 9723 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F5 -2F9F6 ; mapped ; 29145 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F6 -2F9F7 ; mapped ; 2921A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F7 -2F9F8 ; mapped ; 4A6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F8 -2F9F9 ; mapped ; 4A76 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F9 -2F9FA ; mapped ; 97E0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FA -2F9FB ; mapped ; 2940A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FB -2F9FC ; mapped ; 4AB2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FC -2F9FD ; mapped ; 29496 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FD -2F9FE..2F9FF ; mapped ; 980B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FE..CJK COMPATIBILITY IDEOGRAPH-2F9FF -2FA00 ; mapped ; 9829 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA00 -2FA01 ; mapped ; 295B6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA01 -2FA02 ; mapped ; 98E2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA02 -2FA03 ; mapped ; 4B33 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA03 -2FA04 ; mapped ; 9929 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA04 -2FA05 ; mapped ; 99A7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA05 -2FA06 ; mapped ; 99C2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA06 -2FA07 ; mapped ; 99FE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA07 -2FA08 ; mapped ; 4BCE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA08 -2FA09 ; mapped ; 29B30 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA09 -2FA0A ; mapped ; 9B12 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0A -2FA0B ; mapped ; 9C40 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0B -2FA0C ; mapped ; 9CFD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0C -2FA0D ; mapped ; 4CCE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0D -2FA0E ; mapped ; 4CED # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0E -2FA0F ; mapped ; 9D67 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0F -2FA10 ; mapped ; 2A0CE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA10 -2FA11 ; mapped ; 4CF8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA11 -2FA12 ; mapped ; 2A105 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA12 -2FA13 ; mapped ; 2A20E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA13 -2FA14 ; mapped ; 2A291 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA14 -2FA15 ; mapped ; 9EBB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA15 -2FA16 ; mapped ; 4D56 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA16 -2FA17 ; mapped ; 9EF9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA17 -2FA18 ; mapped ; 9EFE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA18 -2FA19 ; mapped ; 9F05 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA19 -2FA1A ; mapped ; 9F0F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA1A -2FA1B ; mapped ; 9F16 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA1B -2FA1C ; mapped ; 9F3B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA1C -2FA1D ; mapped ; 2A600 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA1D -2FA1E..2FFFD ; disallowed # NA .. -2FFFE..2FFFF ; disallowed # 2.0 .. -30000..3FFFD ; disallowed # NA .. -3FFFE..3FFFF ; disallowed # 2.0 .. -40000..4FFFD ; disallowed # NA .. -4FFFE..4FFFF ; disallowed # 2.0 .. -50000..5FFFD ; disallowed # NA .. -5FFFE..5FFFF ; disallowed # 2.0 .. -60000..6FFFD ; disallowed # NA .. -6FFFE..6FFFF ; disallowed # 2.0 .. -70000..7FFFD ; disallowed # NA .. -7FFFE..7FFFF ; disallowed # 2.0 .. -80000..8FFFD ; disallowed # NA .. -8FFFE..8FFFF ; disallowed # 2.0 .. -90000..9FFFD ; disallowed # NA .. -9FFFE..9FFFF ; disallowed # 2.0 .. -A0000..AFFFD ; disallowed # NA .. -AFFFE..AFFFF ; disallowed # 2.0 .. -B0000..BFFFD ; disallowed # NA .. -BFFFE..BFFFF ; disallowed # 2.0 .. -C0000..CFFFD ; disallowed # NA .. -CFFFE..CFFFF ; disallowed # 2.0 .. -D0000..DFFFD ; disallowed # NA .. -DFFFE..DFFFF ; disallowed # 2.0 .. -E0000 ; disallowed # NA -E0001 ; disallowed # 3.1 LANGUAGE TAG -E0002..E001F ; disallowed # NA .. -E0020..E007F ; disallowed # 3.1 TAG SPACE..CANCEL TAG -E0080..E00FF ; disallowed # NA .. -E0100..E01EF ; ignored # 4.0 VARIATION SELECTOR-17..VARIATION SELECTOR-256 -E01F0..EFFFD ; disallowed # NA .. -EFFFE..EFFFF ; disallowed # 2.0 .. -F0000..FFFFD ; disallowed # 2.0 .. -FFFFE..FFFFF ; disallowed # 2.0 .. -100000..10FFFD; disallowed # 2.0 .. -10FFFE..10FFFF; disallowed # 2.0 .. - -# Total code points: 1114112 - diff --git a/vendor/idna-0.1.5/src/lib.rs b/vendor/idna-0.1.5/src/lib.rs deleted file mode 100644 index 92b5df2306..0000000000 --- a/vendor/idna-0.1.5/src/lib.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2016 The rust-url developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! This Rust crate implements IDNA -//! [per the WHATWG URL Standard](https://url.spec.whatwg.org/#idna). -//! -//! It also exposes the underlying algorithms from [*Unicode IDNA Compatibility Processing* -//! (Unicode Technical Standard #46)](http://www.unicode.org/reports/tr46/) -//! and [Punycode (RFC 3492)](https://tools.ietf.org/html/rfc3492). -//! -//! Quoting from [UTS #46’s introduction](http://www.unicode.org/reports/tr46/#Introduction): -//! -//! > Initially, domain names were restricted to ASCII characters. -//! > A system was introduced in 2003 for internationalized domain names (IDN). -//! > This system is called Internationalizing Domain Names for Applications, -//! > or IDNA2003 for short. -//! > This mechanism supports IDNs by means of a client software transformation -//! > into a format known as Punycode. -//! > A revision of IDNA was approved in 2010 (IDNA2008). -//! > This revision has a number of incompatibilities with IDNA2003. -//! > -//! > The incompatibilities force implementers of client software, -//! > such as browsers and emailers, -//! > to face difficult choices during the transition period -//! > as registries shift from IDNA2003 to IDNA2008. -//! > This document specifies a mechanism -//! > that minimizes the impact of this transition for client software, -//! > allowing client software to access domains that are valid under either system. - -#[macro_use] extern crate matches; -extern crate unicode_bidi; -extern crate unicode_normalization; - -pub mod punycode; -pub mod uts46; - -/// The [domain to ASCII](https://url.spec.whatwg.org/#concept-domain-to-ascii) algorithm. -/// -/// Return the ASCII representation a domain name, -/// normalizing characters (upper-case to lower-case and other kinds of equivalence) -/// and using Punycode as necessary. -/// -/// This process may fail. -pub fn domain_to_ascii(domain: &str) -> Result { - uts46::to_ascii(domain, uts46::Flags { - use_std3_ascii_rules: false, - transitional_processing: false, - verify_dns_length: false, - }) -} - -/// The [domain to Unicode](https://url.spec.whatwg.org/#concept-domain-to-unicode) algorithm. -/// -/// Return the Unicode representation of a domain name, -/// normalizing characters (upper-case to lower-case and other kinds of equivalence) -/// and decoding Punycode as necessary. -/// -/// This may indicate [syntax violations](https://url.spec.whatwg.org/#syntax-violation) -/// but always returns a string for the mapped domain. -pub fn domain_to_unicode(domain: &str) -> (String, Result<(), uts46::Errors>) { - uts46::to_unicode(domain, uts46::Flags { - use_std3_ascii_rules: false, - - // Unused: - transitional_processing: false, - verify_dns_length: false, - }) -} diff --git a/vendor/idna-0.1.5/src/make_uts46_mapping_table.py b/vendor/idna-0.1.5/src/make_uts46_mapping_table.py deleted file mode 100644 index 16e4feb44b..0000000000 --- a/vendor/idna-0.1.5/src/make_uts46_mapping_table.py +++ /dev/null @@ -1,192 +0,0 @@ -# Copyright 2013-2014 The rust-url developers. -# -# Licensed under the Apache License, Version 2.0 or the MIT license -# , at your -# option. This file may not be copied, modified, or distributed -# except according to those terms. - -# Run as: python make_uts46_mapping_table.py IdnaMappingTable.txt > uts46_mapping_table.rs -# You can get the latest idna table from -# http://www.unicode.org/Public/idna/latest/IdnaMappingTable.txt - -from __future__ import print_function -import collections -import itertools - -print('''\ -// Copyright 2013-2014 The rust-url developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Generated by make_idna_table.py -''') - -txt = open("IdnaMappingTable.txt") - -def escape_char(c): - return "\\u{%x}" % ord(c[0]) - -def char(s): - return unichr(int(s, 16)) - -strtab = collections.OrderedDict() -strtab_offset = 0 - -def strtab_slice(s): - global strtab, strtab_offset - - if s in strtab: - return strtab[s] - else: - utf8_len = len(s.encode('utf8')) - c = (strtab_offset, utf8_len) - strtab[s] = c - strtab_offset += utf8_len - return c - -def rust_slice(s): - start = s[0] - length = s[1] - start_lo = start & 0xff - start_hi = start >> 8 - assert length <= 255 - assert start_hi <= 255 - return "(StringTableSlice { byte_start_lo: %d, byte_start_hi: %d, byte_len: %d })" % (start_lo, start_hi, length) - -ranges = [] - -for line in txt: - # remove comments - line, _, _ = line.partition('#') - # skip empty lines - if len(line.strip()) == 0: - continue - fields = line.split(';') - if fields[0].strip() == 'D800..DFFF': - continue # Surrogates don't occur in Rust strings. - first, _, last = fields[0].strip().partition('..') - if not last: - last = first - mapping = fields[1].strip().replace('_', ' ').title().replace(' ', '') - unicode_str = None - if len(fields) > 2: - if fields[2].strip(): - unicode_str = u''.join(char(c) for c in fields[2].strip().split(' ')) - elif mapping == "Deviation": - unicode_str = u'' - ranges.append((first, last, mapping, unicode_str)) - -def mergeable_key(r): - mapping = r[2] - - # These types have associated data, so we should not merge them. - if mapping in ('Mapped', 'Deviation', 'DisallowedStd3Mapped'): - return r - assert mapping in ('Valid', 'Ignored', 'Disallowed', 'DisallowedStd3Valid') - return mapping - -grouped_ranges = itertools.groupby(ranges, key=mergeable_key) - -optimized_ranges = [] - -for (k, g) in grouped_ranges: - group = list(g) - if len(group) == 1: - optimized_ranges.append(group[0]) - continue - # Assert that nothing in the group has an associated unicode string. - for g in group: - if g[3] is not None and len(g[3]) > 2: - assert not g[3][2].strip() - # Assert that consecutive members of the group don't leave gaps in - # the codepoint space. - a, b = itertools.tee(group) - next(b, None) - for (g1, g2) in itertools.izip(a, b): - last_char = int(g1[1], 16) - next_char = int(g2[0], 16) - if last_char + 1 == next_char: - continue - # There's a gap where surrogates would appear, but we don't have to - # worry about that gap, as surrogates never appear in Rust strings. - # Assert we're seeing the surrogate case here. - assert last_char == 0xd7ff - assert next_char == 0xe000 - first = group[0][0] - last = group[-1][1] - mapping = group[0][2] - unicode_str = group[0][3] - optimized_ranges.append((first, last, mapping, unicode_str)) - -def is_single_char_range(r): - (first, last, _, _) = r - return first == last - -# We can reduce the size of the character range table and the index table to about 1/4 -# by merging runs of single character ranges and using character offsets from the start -# of that range to retrieve the correct `Mapping` value -def merge_single_char_ranges(ranges): - current = [] - for r in ranges: - if not current or is_single_char_range(current[-1]) and is_single_char_range(r): - current.append(r) - continue - if len(current) != 0: - ret = current - current = [r] - yield ret - continue - current.append(r) - ret = current - current = [] - yield ret - yield current - -optimized_ranges = list(merge_single_char_ranges(optimized_ranges)) - - -print("static TABLE: &'static [Range] = &[") - -for ranges in optimized_ranges: - first = ranges[0][0] - last = ranges[-1][1] - print(" Range { from: '%s', to: '%s', }," % (escape_char(char(first)), - escape_char(char(last)))) - -print("];\n") - -print("static INDEX_TABLE: &'static [u16] = &[") - -SINGLE_MARKER = 1 << 15 - -offset = 0 -for ranges in optimized_ranges: - assert offset < SINGLE_MARKER - - block_len = len(ranges) - single = SINGLE_MARKER if block_len == 1 else 0 - print(" %s," % (offset | single)) - offset += block_len - -print("];\n") - -print("static MAPPING_TABLE: &'static [Mapping] = &[") - -for ranges in optimized_ranges: - for (first, last, mapping, unicode_str) in ranges: - if unicode_str is not None: - mapping += rust_slice(strtab_slice(unicode_str)) - print(" %s," % mapping) - -print("];\n") - -def escape_str(s): - return [escape_char(c) for c in s] - -print("static STRING_TABLE: &'static str = \"%s\";" - % '\\\n '.join(itertools.chain(*[escape_str(s) for s in strtab.iterkeys()]))) diff --git a/vendor/idna-0.1.5/src/punycode.rs b/vendor/idna-0.1.5/src/punycode.rs deleted file mode 100644 index acdde58972..0000000000 --- a/vendor/idna-0.1.5/src/punycode.rs +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright 2013 The rust-url developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Punycode ([RFC 3492](http://tools.ietf.org/html/rfc3492)) implementation. -//! -//! Since Punycode fundamentally works on unicode code points, -//! `encode` and `decode` take and return slices and vectors of `char`. -//! `encode_str` and `decode_to_string` provide convenience wrappers -//! that convert from and to Rust’s UTF-8 based `str` and `String` types. - -use std::u32; -use std::char; -#[allow(unused_imports, deprecated)] -use std::ascii::AsciiExt; - -// Bootstring parameters for Punycode -static BASE: u32 = 36; -static T_MIN: u32 = 1; -static T_MAX: u32 = 26; -static SKEW: u32 = 38; -static DAMP: u32 = 700; -static INITIAL_BIAS: u32 = 72; -static INITIAL_N: u32 = 0x80; -static DELIMITER: char = '-'; - - -#[inline] -fn adapt(mut delta: u32, num_points: u32, first_time: bool) -> u32 { - delta /= if first_time { DAMP } else { 2 }; - delta += delta / num_points; - let mut k = 0; - while delta > ((BASE - T_MIN) * T_MAX) / 2 { - delta /= BASE - T_MIN; - k += BASE; - } - k + (((BASE - T_MIN + 1) * delta) / (delta + SKEW)) -} - - -/// Convert Punycode to an Unicode `String`. -/// -/// This is a convenience wrapper around `decode`. -#[inline] -pub fn decode_to_string(input: &str) -> Option { - decode(input).map(|chars| chars.into_iter().collect()) -} - - -/// Convert Punycode to Unicode. -/// -/// Return None on malformed input or overflow. -/// Overflow can only happen on inputs that take more than -/// 63 encoded bytes, the DNS limit on domain name labels. -pub fn decode(input: &str) -> Option> { - // Handle "basic" (ASCII) code points. - // They are encoded as-is before the last delimiter, if any. - let (mut output, input) = match input.rfind(DELIMITER) { - None => (Vec::new(), input), - Some(position) => ( - input[..position].chars().collect(), - if position > 0 { &input[position + 1..] } else { input } - ) - }; - let mut code_point = INITIAL_N; - let mut bias = INITIAL_BIAS; - let mut i = 0; - let mut iter = input.bytes(); - loop { - let previous_i = i; - let mut weight = 1; - let mut k = BASE; - let mut byte = match iter.next() { - None => break, - Some(byte) => byte, - }; - // Decode a generalized variable-length integer into delta, - // which gets added to i. - loop { - let digit = match byte { - byte @ b'0' ... b'9' => byte - b'0' + 26, - byte @ b'A' ... b'Z' => byte - b'A', - byte @ b'a' ... b'z' => byte - b'a', - _ => return None - } as u32; - if digit > (u32::MAX - i) / weight { - return None // Overflow - } - i += digit * weight; - let t = if k <= bias { T_MIN } - else if k >= bias + T_MAX { T_MAX } - else { k - bias }; - if digit < t { - break - } - if weight > u32::MAX / (BASE - t) { - return None // Overflow - } - weight *= BASE - t; - k += BASE; - byte = match iter.next() { - None => return None, // End of input before the end of this delta - Some(byte) => byte, - }; - } - let length = output.len() as u32; - bias = adapt(i - previous_i, length + 1, previous_i == 0); - if i / (length + 1) > u32::MAX - code_point { - return None // Overflow - } - // i was supposed to wrap around from length+1 to 0, - // incrementing code_point each time. - code_point += i / (length + 1); - i %= length + 1; - let c = match char::from_u32(code_point) { - Some(c) => c, - None => return None - }; - output.insert(i as usize, c); - i += 1; - } - Some(output) -} - - -/// Convert an Unicode `str` to Punycode. -/// -/// This is a convenience wrapper around `encode`. -#[inline] -pub fn encode_str(input: &str) -> Option { - encode(&input.chars().collect::>()) -} - - -/// Convert Unicode to Punycode. -/// -/// Return None on overflow, which can only happen on inputs that would take more than -/// 63 encoded bytes, the DNS limit on domain name labels. -pub fn encode(input: &[char]) -> Option { - // Handle "basic" (ASCII) code points. They are encoded as-is. - let output_bytes = input.iter().filter_map(|&c| - if c.is_ascii() { Some(c as u8) } else { None } - ).collect(); - let mut output = unsafe { String::from_utf8_unchecked(output_bytes) }; - let basic_length = output.len() as u32; - if basic_length > 0 { - output.push_str("-") - } - let mut code_point = INITIAL_N; - let mut delta = 0; - let mut bias = INITIAL_BIAS; - let mut processed = basic_length; - let input_length = input.len() as u32; - while processed < input_length { - // All code points < code_point have been handled already. - // Find the next larger one. - let min_code_point = input.iter().map(|&c| c as u32) - .filter(|&c| c >= code_point).min().unwrap(); - if min_code_point - code_point > (u32::MAX - delta) / (processed + 1) { - return None // Overflow - } - // Increase delta to advance the decoder’s state to - delta += (min_code_point - code_point) * (processed + 1); - code_point = min_code_point; - for &c in input { - let c = c as u32; - if c < code_point { - delta += 1; - if delta == 0 { - return None // Overflow - } - } - if c == code_point { - // Represent delta as a generalized variable-length integer: - let mut q = delta; - let mut k = BASE; - loop { - let t = if k <= bias { T_MIN } - else if k >= bias + T_MAX { T_MAX } - else { k - bias }; - if q < t { - break - } - let value = t + ((q - t) % (BASE - t)); - output.push(value_to_digit(value)); - q = (q - t) / (BASE - t); - k += BASE; - } - output.push(value_to_digit(q)); - bias = adapt(delta, processed + 1, processed == basic_length); - delta = 0; - processed += 1; - } - } - delta += 1; - code_point += 1; - } - Some(output) -} - - -#[inline] -fn value_to_digit(value: u32) -> char { - match value { - 0 ... 25 => (value as u8 + 'a' as u8) as char, // a..z - 26 ... 35 => (value as u8 - 26 + '0' as u8) as char, // 0..9 - _ => panic!() - } -} diff --git a/vendor/idna-0.1.5/src/uts46.rs b/vendor/idna-0.1.5/src/uts46.rs deleted file mode 100644 index ac348d1fa8..0000000000 --- a/vendor/idna-0.1.5/src/uts46.rs +++ /dev/null @@ -1,433 +0,0 @@ -// Copyright 2013-2014 The rust-url developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! [*Unicode IDNA Compatibility Processing* -//! (Unicode Technical Standard #46)](http://www.unicode.org/reports/tr46/) - -use self::Mapping::*; -use punycode; -#[allow(unused_imports, deprecated)] -use std::ascii::AsciiExt; -use std::cmp::Ordering::{Equal, Less, Greater}; -use unicode_bidi::{BidiClass, bidi_class}; -use unicode_normalization::UnicodeNormalization; -use unicode_normalization::char::is_combining_mark; - -include!("uts46_mapping_table.rs"); - - -pub static PUNYCODE_PREFIX: &'static str = "xn--"; - - -#[derive(Debug)] -struct StringTableSlice { - // Store these as separate fields so the structure will have an - // alignment of 1 and thus pack better into the Mapping enum, below. - byte_start_lo: u8, - byte_start_hi: u8, - byte_len: u8, -} - -fn decode_slice(slice: &StringTableSlice) -> &'static str { - let lo = slice.byte_start_lo as usize; - let hi = slice.byte_start_hi as usize; - let start = (hi << 8) | lo; - let len = slice.byte_len as usize; - &STRING_TABLE[start..(start + len)] -} - -#[repr(u8)] -#[derive(Debug)] -enum Mapping { - Valid, - Ignored, - Mapped(StringTableSlice), - Deviation(StringTableSlice), - Disallowed, - DisallowedStd3Valid, - DisallowedStd3Mapped(StringTableSlice), -} - -struct Range { - from: char, - to: char, -} - -fn find_char(codepoint: char) -> &'static Mapping { - let r = TABLE.binary_search_by(|ref range| { - if codepoint > range.to { - Less - } else if codepoint < range.from { - Greater - } else { - Equal - } - }); - r.ok().map(|i| { - const SINGLE_MARKER: u16 = 1 << 15; - - let x = INDEX_TABLE[i]; - let single = (x & SINGLE_MARKER) != 0; - let offset = !SINGLE_MARKER & x; - - if single { - &MAPPING_TABLE[offset as usize] - } else { - &MAPPING_TABLE[(offset + (codepoint as u16 - TABLE[i].from as u16)) as usize] - } - }).unwrap() -} - -fn map_char(codepoint: char, flags: Flags, output: &mut String, errors: &mut Vec) { - match *find_char(codepoint) { - Mapping::Valid => output.push(codepoint), - Mapping::Ignored => {}, - Mapping::Mapped(ref slice) => output.push_str(decode_slice(slice)), - Mapping::Deviation(ref slice) => { - if flags.transitional_processing { - output.push_str(decode_slice(slice)) - } else { - output.push(codepoint) - } - } - Mapping::Disallowed => { - errors.push(Error::DissallowedCharacter); - output.push(codepoint); - } - Mapping::DisallowedStd3Valid => { - if flags.use_std3_ascii_rules { - errors.push(Error::DissallowedByStd3AsciiRules); - } - output.push(codepoint) - } - Mapping::DisallowedStd3Mapped(ref slice) => { - if flags.use_std3_ascii_rules { - errors.push(Error::DissallowedMappedInStd3); - } - output.push_str(decode_slice(slice)) - } - } -} - -// http://tools.ietf.org/html/rfc5893#section-2 -fn passes_bidi(label: &str, is_bidi_domain: bool) -> bool { - // Rule 0: Bidi Rules apply to Bidi Domain Names: a name with at least one RTL label. A label - // is RTL if it contains at least one character of bidi class R, AL or AN. - if !is_bidi_domain { - return true; - } - - let mut chars = label.chars(); - let first_char_class = match chars.next() { - Some(c) => bidi_class(c), - None => return true, // empty string - }; - - match first_char_class { - // LTR label - BidiClass::L => { - // Rule 5 - loop { - match chars.next() { - Some(c) => { - if !matches!(bidi_class(c), - BidiClass::L | BidiClass::EN | - BidiClass::ES | BidiClass::CS | - BidiClass::ET | BidiClass::ON | - BidiClass::BN | BidiClass::NSM - ) { - return false; - } - }, - None => { break; }, - } - } - - // Rule 6 - // must end in L or EN followed by 0 or more NSM - let mut rev_chars = label.chars().rev(); - let mut last_non_nsm = rev_chars.next(); - loop { - match last_non_nsm { - Some(c) if bidi_class(c) == BidiClass::NSM => { - last_non_nsm = rev_chars.next(); - continue; - } - _ => { break; }, - } - } - match last_non_nsm { - Some(c) if bidi_class(c) == BidiClass::L - || bidi_class(c) == BidiClass::EN => {}, - Some(_) => { return false; }, - _ => {} - } - - } - - // RTL label - BidiClass::R | BidiClass::AL => { - let mut found_en = false; - let mut found_an = false; - - // Rule 2 - loop { - match chars.next() { - Some(c) => { - let char_class = bidi_class(c); - - if char_class == BidiClass::EN { - found_en = true; - } - if char_class == BidiClass::AN { - found_an = true; - } - - if !matches!(char_class, BidiClass::R | BidiClass::AL | - BidiClass::AN | BidiClass::EN | - BidiClass::ES | BidiClass::CS | - BidiClass::ET | BidiClass::ON | - BidiClass::BN | BidiClass::NSM) { - return false; - } - }, - None => { break; }, - } - } - // Rule 3 - let mut rev_chars = label.chars().rev(); - let mut last = rev_chars.next(); - loop { // must end in L or EN followed by 0 or more NSM - match last { - Some(c) if bidi_class(c) == BidiClass::NSM => { - last = rev_chars.next(); - continue; - } - _ => { break; }, - } - } - match last { - Some(c) if matches!(bidi_class(c), BidiClass::R | BidiClass::AL | - BidiClass::EN | BidiClass::AN) => {}, - _ => { return false; } - } - - // Rule 4 - if found_an && found_en { - return false; - } - } - - // Rule 1: Should start with L or R/AL - _ => { - return false; - } - } - - return true; -} - -/// http://www.unicode.org/reports/tr46/#Validity_Criteria -fn validate_full(label: &str, is_bidi_domain: bool, flags: Flags, errors: &mut Vec) { - // V1: Must be in NFC form. - if label.nfc().ne(label.chars()) { - errors.push(Error::ValidityCriteria); - } else { - validate(label, is_bidi_domain, flags, errors); - } -} - -fn validate(label: &str, is_bidi_domain: bool, flags: Flags, errors: &mut Vec) { - let first_char = label.chars().next(); - if first_char == None { - // Empty string, pass - } - - // V2: No U+002D HYPHEN-MINUS in both third and fourth positions. - // - // NOTE: Spec says that the label must not contain a HYPHEN-MINUS character in both the - // third and fourth positions. But nobody follows this criteria. See the spec issue below: - // https://github.com/whatwg/url/issues/53 - // - // TODO: Add *CheckHyphens* flag. - - // V3: neither begin nor end with a U+002D HYPHEN-MINUS - else if label.starts_with("-") || label.ends_with("-") { - errors.push(Error::ValidityCriteria); - } - - // V4: not contain a U+002E FULL STOP - // - // Here, label can't contain '.' since the input is from .split('.') - - // V5: not begin with a GC=Mark - else if is_combining_mark(first_char.unwrap()) { - errors.push(Error::ValidityCriteria); - } - - // V6: Check against Mapping Table - else if label.chars().any(|c| match *find_char(c) { - Mapping::Valid => false, - Mapping::Deviation(_) => flags.transitional_processing, - Mapping::DisallowedStd3Valid => flags.use_std3_ascii_rules, - _ => true, - }) { - errors.push(Error::ValidityCriteria); - } - - // V7: ContextJ rules - // - // TODO: Implement rules and add *CheckJoiners* flag. - - // V8: Bidi rules - // - // TODO: Add *CheckBidi* flag - else if !passes_bidi(label, is_bidi_domain) - { - errors.push(Error::ValidityCriteria); - } -} - -/// http://www.unicode.org/reports/tr46/#Processing -fn processing(domain: &str, flags: Flags, errors: &mut Vec) -> String { - let mut mapped = String::with_capacity(domain.len()); - for c in domain.chars() { - map_char(c, flags, &mut mapped, errors) - } - let mut normalized = String::with_capacity(mapped.len()); - normalized.extend(mapped.nfc()); - - // Find out if it's a Bidi Domain Name - // - // First, check for literal bidi chars - let mut is_bidi_domain = domain.chars().any(|c| - matches!(bidi_class(c), BidiClass::R | BidiClass::AL | BidiClass::AN) - ); - if !is_bidi_domain { - // Then check for punycode-encoded bidi chars - for label in normalized.split('.') { - if label.starts_with(PUNYCODE_PREFIX) { - match punycode::decode_to_string(&label[PUNYCODE_PREFIX.len()..]) { - Some(decoded_label) => { - if decoded_label.chars().any(|c| - matches!(bidi_class(c), BidiClass::R | BidiClass::AL | BidiClass::AN) - ) { - is_bidi_domain = true; - } - } - None => { - is_bidi_domain = true; - } - } - } - } - } - - let mut validated = String::new(); - let mut first = true; - for label in normalized.split('.') { - if !first { - validated.push('.'); - } - first = false; - if label.starts_with(PUNYCODE_PREFIX) { - match punycode::decode_to_string(&label[PUNYCODE_PREFIX.len()..]) { - Some(decoded_label) => { - let flags = Flags { transitional_processing: false, ..flags }; - validate_full(&decoded_label, is_bidi_domain, flags, errors); - validated.push_str(&decoded_label) - } - None => errors.push(Error::PunycodeError) - } - } else { - // `normalized` is already `NFC` so we can skip that check - validate(label, is_bidi_domain, flags, errors); - validated.push_str(label) - } - } - validated -} - -#[derive(Copy, Clone)] -pub struct Flags { - pub use_std3_ascii_rules: bool, - pub transitional_processing: bool, - pub verify_dns_length: bool, -} - -#[derive(PartialEq, Eq, Clone, Copy, Debug)] -enum Error { - PunycodeError, - ValidityCriteria, - DissallowedByStd3AsciiRules, - DissallowedMappedInStd3, - DissallowedCharacter, - TooLongForDns, - TooShortForDns, -} - -/// Errors recorded during UTS #46 processing. -/// -/// This is opaque for now, only indicating the presence of at least one error. -/// More details may be exposed in the future. -#[derive(Debug)] -pub struct Errors(Vec); - -/// http://www.unicode.org/reports/tr46/#ToASCII -pub fn to_ascii(domain: &str, flags: Flags) -> Result { - let mut errors = Vec::new(); - let mut result = String::new(); - let mut first = true; - for label in processing(domain, flags, &mut errors).split('.') { - if !first { - result.push('.'); - } - first = false; - if label.is_ascii() { - result.push_str(label); - } else { - match punycode::encode_str(label) { - Some(x) => { - result.push_str(PUNYCODE_PREFIX); - result.push_str(&x); - }, - None => errors.push(Error::PunycodeError) - } - } - } - - if flags.verify_dns_length { - let domain = if result.ends_with(".") { &result[..result.len()-1] } else { &*result }; - if domain.len() < 1 || domain.split('.').any(|label| label.len() < 1) { - errors.push(Error::TooShortForDns) - } - if domain.len() > 253 || domain.split('.').any(|label| label.len() > 63) { - errors.push(Error::TooLongForDns) - } - } - if errors.is_empty() { - Ok(result) - } else { - Err(Errors(errors)) - } -} - -/// http://www.unicode.org/reports/tr46/#ToUnicode -/// -/// Only `use_std3_ascii_rules` is used in `flags`. -pub fn to_unicode(domain: &str, mut flags: Flags) -> (String, Result<(), Errors>) { - flags.transitional_processing = false; - let mut errors = Vec::new(); - let domain = processing(domain, flags, &mut errors); - let errors = if errors.is_empty() { - Ok(()) - } else { - Err(Errors(errors)) - }; - (domain, errors) -} diff --git a/vendor/idna-0.1.5/src/uts46_mapping_table.rs b/vendor/idna-0.1.5/src/uts46_mapping_table.rs deleted file mode 100644 index 2733290d69..0000000000 --- a/vendor/idna-0.1.5/src/uts46_mapping_table.rs +++ /dev/null @@ -1,16005 +0,0 @@ -// Copyright 2013-2014 The rust-url developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Generated by make_idna_table.py - -static TABLE: &'static [Range] = &[ - Range { from: '\u{0}', to: '\u{2c}', }, - Range { from: '\u{2d}', to: '\u{2e}', }, - Range { from: '\u{2f}', to: '\u{2f}', }, - Range { from: '\u{30}', to: '\u{39}', }, - Range { from: '\u{3a}', to: '\u{40}', }, - Range { from: '\u{41}', to: '\u{5a}', }, - Range { from: '\u{5b}', to: '\u{60}', }, - Range { from: '\u{61}', to: '\u{7a}', }, - Range { from: '\u{7b}', to: '\u{7f}', }, - Range { from: '\u{80}', to: '\u{9f}', }, - Range { from: '\u{a0}', to: '\u{a0}', }, - Range { from: '\u{a1}', to: '\u{a7}', }, - Range { from: '\u{a8}', to: '\u{aa}', }, - Range { from: '\u{ab}', to: '\u{ac}', }, - Range { from: '\u{ad}', to: '\u{af}', }, - Range { from: '\u{b0}', to: '\u{b1}', }, - Range { from: '\u{b2}', to: '\u{b5}', }, - Range { from: '\u{b6}', to: '\u{b7}', }, - Range { from: '\u{b8}', to: '\u{df}', }, - Range { from: '\u{e0}', to: '\u{ff}', }, - Range { from: '\u{100}', to: '\u{131}', }, - Range { from: '\u{132}', to: '\u{133}', }, - Range { from: '\u{134}', to: '\u{136}', }, - Range { from: '\u{137}', to: '\u{138}', }, - Range { from: '\u{139}', to: '\u{13e}', }, - Range { from: '\u{13f}', to: '\u{140}', }, - Range { from: '\u{141}', to: '\u{18b}', }, - Range { from: '\u{18c}', to: '\u{18d}', }, - Range { from: '\u{18e}', to: '\u{198}', }, - Range { from: '\u{199}', to: '\u{19b}', }, - Range { from: '\u{19c}', to: '\u{1a9}', }, - Range { from: '\u{1aa}', to: '\u{1ab}', }, - Range { from: '\u{1ac}', to: '\u{1b8}', }, - Range { from: '\u{1b9}', to: '\u{1bb}', }, - Range { from: '\u{1bc}', to: '\u{1bc}', }, - Range { from: '\u{1bd}', to: '\u{1c3}', }, - Range { from: '\u{1c4}', to: '\u{1c6}', }, - Range { from: '\u{1c7}', to: '\u{1c9}', }, - Range { from: '\u{1ca}', to: '\u{1cc}', }, - Range { from: '\u{1cd}', to: '\u{1db}', }, - Range { from: '\u{1dc}', to: '\u{1dd}', }, - Range { from: '\u{1de}', to: '\u{1ee}', }, - Range { from: '\u{1ef}', to: '\u{1f0}', }, - Range { from: '\u{1f1}', to: '\u{1f3}', }, - Range { from: '\u{1f4}', to: '\u{232}', }, - Range { from: '\u{233}', to: '\u{239}', }, - Range { from: '\u{23a}', to: '\u{23e}', }, - Range { from: '\u{23f}', to: '\u{240}', }, - Range { from: '\u{241}', to: '\u{24e}', }, - Range { from: '\u{24f}', to: '\u{2af}', }, - Range { from: '\u{2b0}', to: '\u{2b8}', }, - Range { from: '\u{2b9}', to: '\u{2d7}', }, - Range { from: '\u{2d8}', to: '\u{2dd}', }, - Range { from: '\u{2de}', to: '\u{2df}', }, - Range { from: '\u{2e0}', to: '\u{2e4}', }, - Range { from: '\u{2e5}', to: '\u{33f}', }, - Range { from: '\u{340}', to: '\u{345}', }, - Range { from: '\u{346}', to: '\u{34e}', }, - Range { from: '\u{34f}', to: '\u{34f}', }, - Range { from: '\u{350}', to: '\u{36f}', }, - Range { from: '\u{370}', to: '\u{377}', }, - Range { from: '\u{378}', to: '\u{379}', }, - Range { from: '\u{37a}', to: '\u{37a}', }, - Range { from: '\u{37b}', to: '\u{37d}', }, - Range { from: '\u{37e}', to: '\u{37f}', }, - Range { from: '\u{380}', to: '\u{383}', }, - Range { from: '\u{384}', to: '\u{3ab}', }, - Range { from: '\u{3ac}', to: '\u{3c1}', }, - Range { from: '\u{3c2}', to: '\u{3c2}', }, - Range { from: '\u{3c3}', to: '\u{3ce}', }, - Range { from: '\u{3cf}', to: '\u{3fa}', }, - Range { from: '\u{3fb}', to: '\u{3fc}', }, - Range { from: '\u{3fd}', to: '\u{42f}', }, - Range { from: '\u{430}', to: '\u{45f}', }, - Range { from: '\u{460}', to: '\u{480}', }, - Range { from: '\u{481}', to: '\u{489}', }, - Range { from: '\u{48a}', to: '\u{4cd}', }, - Range { from: '\u{4ce}', to: '\u{4cf}', }, - Range { from: '\u{4d0}', to: '\u{556}', }, - Range { from: '\u{557}', to: '\u{558}', }, - Range { from: '\u{559}', to: '\u{55f}', }, - Range { from: '\u{560}', to: '\u{560}', }, - Range { from: '\u{561}', to: '\u{586}', }, - Range { from: '\u{587}', to: '\u{588}', }, - Range { from: '\u{589}', to: '\u{58a}', }, - Range { from: '\u{58b}', to: '\u{58c}', }, - Range { from: '\u{58d}', to: '\u{58f}', }, - Range { from: '\u{590}', to: '\u{590}', }, - Range { from: '\u{591}', to: '\u{5c7}', }, - Range { from: '\u{5c8}', to: '\u{5cf}', }, - Range { from: '\u{5d0}', to: '\u{5ea}', }, - Range { from: '\u{5eb}', to: '\u{5ef}', }, - Range { from: '\u{5f0}', to: '\u{5f4}', }, - Range { from: '\u{5f5}', to: '\u{605}', }, - Range { from: '\u{606}', to: '\u{61b}', }, - Range { from: '\u{61c}', to: '\u{61d}', }, - Range { from: '\u{61e}', to: '\u{674}', }, - Range { from: '\u{675}', to: '\u{678}', }, - Range { from: '\u{679}', to: '\u{6dc}', }, - Range { from: '\u{6dd}', to: '\u{6dd}', }, - Range { from: '\u{6de}', to: '\u{70d}', }, - Range { from: '\u{70e}', to: '\u{70f}', }, - Range { from: '\u{710}', to: '\u{74a}', }, - Range { from: '\u{74b}', to: '\u{74c}', }, - Range { from: '\u{74d}', to: '\u{7b1}', }, - Range { from: '\u{7b2}', to: '\u{7bf}', }, - Range { from: '\u{7c0}', to: '\u{7fa}', }, - Range { from: '\u{7fb}', to: '\u{7ff}', }, - Range { from: '\u{800}', to: '\u{82d}', }, - Range { from: '\u{82e}', to: '\u{82f}', }, - Range { from: '\u{830}', to: '\u{83e}', }, - Range { from: '\u{83f}', to: '\u{83f}', }, - Range { from: '\u{840}', to: '\u{85b}', }, - Range { from: '\u{85c}', to: '\u{85d}', }, - Range { from: '\u{85e}', to: '\u{85f}', }, - Range { from: '\u{860}', to: '\u{86a}', }, - Range { from: '\u{86b}', to: '\u{89f}', }, - Range { from: '\u{8a0}', to: '\u{8b4}', }, - Range { from: '\u{8b5}', to: '\u{8b5}', }, - Range { from: '\u{8b6}', to: '\u{8bd}', }, - Range { from: '\u{8be}', to: '\u{8d3}', }, - Range { from: '\u{8d4}', to: '\u{8e1}', }, - Range { from: '\u{8e2}', to: '\u{8e2}', }, - Range { from: '\u{8e3}', to: '\u{957}', }, - Range { from: '\u{958}', to: '\u{95f}', }, - Range { from: '\u{960}', to: '\u{983}', }, - Range { from: '\u{984}', to: '\u{984}', }, - Range { from: '\u{985}', to: '\u{98c}', }, - Range { from: '\u{98d}', to: '\u{98e}', }, - Range { from: '\u{98f}', to: '\u{990}', }, - Range { from: '\u{991}', to: '\u{992}', }, - Range { from: '\u{993}', to: '\u{9a8}', }, - Range { from: '\u{9a9}', to: '\u{9a9}', }, - Range { from: '\u{9aa}', to: '\u{9b0}', }, - Range { from: '\u{9b1}', to: '\u{9b2}', }, - Range { from: '\u{9b3}', to: '\u{9b5}', }, - Range { from: '\u{9b6}', to: '\u{9b9}', }, - Range { from: '\u{9ba}', to: '\u{9bb}', }, - Range { from: '\u{9bc}', to: '\u{9c4}', }, - Range { from: '\u{9c5}', to: '\u{9c6}', }, - Range { from: '\u{9c7}', to: '\u{9c8}', }, - Range { from: '\u{9c9}', to: '\u{9ca}', }, - Range { from: '\u{9cb}', to: '\u{9ce}', }, - Range { from: '\u{9cf}', to: '\u{9d6}', }, - Range { from: '\u{9d7}', to: '\u{9d7}', }, - Range { from: '\u{9d8}', to: '\u{9db}', }, - Range { from: '\u{9dc}', to: '\u{9df}', }, - Range { from: '\u{9e0}', to: '\u{9e3}', }, - Range { from: '\u{9e4}', to: '\u{9e5}', }, - Range { from: '\u{9e6}', to: '\u{9fd}', }, - Range { from: '\u{9fe}', to: '\u{a00}', }, - Range { from: '\u{a01}', to: '\u{a03}', }, - Range { from: '\u{a04}', to: '\u{a04}', }, - Range { from: '\u{a05}', to: '\u{a0a}', }, - Range { from: '\u{a0b}', to: '\u{a0e}', }, - Range { from: '\u{a0f}', to: '\u{a10}', }, - Range { from: '\u{a11}', to: '\u{a12}', }, - Range { from: '\u{a13}', to: '\u{a28}', }, - Range { from: '\u{a29}', to: '\u{a29}', }, - Range { from: '\u{a2a}', to: '\u{a30}', }, - Range { from: '\u{a31}', to: '\u{a37}', }, - Range { from: '\u{a38}', to: '\u{a39}', }, - Range { from: '\u{a3a}', to: '\u{a3b}', }, - Range { from: '\u{a3c}', to: '\u{a3d}', }, - Range { from: '\u{a3e}', to: '\u{a42}', }, - Range { from: '\u{a43}', to: '\u{a46}', }, - Range { from: '\u{a47}', to: '\u{a48}', }, - Range { from: '\u{a49}', to: '\u{a4a}', }, - Range { from: '\u{a4b}', to: '\u{a4d}', }, - Range { from: '\u{a4e}', to: '\u{a50}', }, - Range { from: '\u{a51}', to: '\u{a51}', }, - Range { from: '\u{a52}', to: '\u{a58}', }, - Range { from: '\u{a59}', to: '\u{a5e}', }, - Range { from: '\u{a5f}', to: '\u{a65}', }, - Range { from: '\u{a66}', to: '\u{a75}', }, - Range { from: '\u{a76}', to: '\u{a80}', }, - Range { from: '\u{a81}', to: '\u{a83}', }, - Range { from: '\u{a84}', to: '\u{a84}', }, - Range { from: '\u{a85}', to: '\u{a8d}', }, - Range { from: '\u{a8e}', to: '\u{a8e}', }, - Range { from: '\u{a8f}', to: '\u{a91}', }, - Range { from: '\u{a92}', to: '\u{a92}', }, - Range { from: '\u{a93}', to: '\u{aa8}', }, - Range { from: '\u{aa9}', to: '\u{aa9}', }, - Range { from: '\u{aaa}', to: '\u{ab0}', }, - Range { from: '\u{ab1}', to: '\u{ab1}', }, - Range { from: '\u{ab2}', to: '\u{ab3}', }, - Range { from: '\u{ab4}', to: '\u{ab4}', }, - Range { from: '\u{ab5}', to: '\u{ab9}', }, - Range { from: '\u{aba}', to: '\u{abb}', }, - Range { from: '\u{abc}', to: '\u{ac5}', }, - Range { from: '\u{ac6}', to: '\u{ac6}', }, - Range { from: '\u{ac7}', to: '\u{ac9}', }, - Range { from: '\u{aca}', to: '\u{aca}', }, - Range { from: '\u{acb}', to: '\u{acd}', }, - Range { from: '\u{ace}', to: '\u{acf}', }, - Range { from: '\u{ad0}', to: '\u{ad0}', }, - Range { from: '\u{ad1}', to: '\u{adf}', }, - Range { from: '\u{ae0}', to: '\u{ae3}', }, - Range { from: '\u{ae4}', to: '\u{ae5}', }, - Range { from: '\u{ae6}', to: '\u{af1}', }, - Range { from: '\u{af2}', to: '\u{af8}', }, - Range { from: '\u{af9}', to: '\u{aff}', }, - Range { from: '\u{b00}', to: '\u{b00}', }, - Range { from: '\u{b01}', to: '\u{b03}', }, - Range { from: '\u{b04}', to: '\u{b04}', }, - Range { from: '\u{b05}', to: '\u{b0c}', }, - Range { from: '\u{b0d}', to: '\u{b0e}', }, - Range { from: '\u{b0f}', to: '\u{b10}', }, - Range { from: '\u{b11}', to: '\u{b12}', }, - Range { from: '\u{b13}', to: '\u{b28}', }, - Range { from: '\u{b29}', to: '\u{b29}', }, - Range { from: '\u{b2a}', to: '\u{b30}', }, - Range { from: '\u{b31}', to: '\u{b31}', }, - Range { from: '\u{b32}', to: '\u{b33}', }, - Range { from: '\u{b34}', to: '\u{b34}', }, - Range { from: '\u{b35}', to: '\u{b39}', }, - Range { from: '\u{b3a}', to: '\u{b3b}', }, - Range { from: '\u{b3c}', to: '\u{b44}', }, - Range { from: '\u{b45}', to: '\u{b46}', }, - Range { from: '\u{b47}', to: '\u{b48}', }, - Range { from: '\u{b49}', to: '\u{b4a}', }, - Range { from: '\u{b4b}', to: '\u{b4d}', }, - Range { from: '\u{b4e}', to: '\u{b55}', }, - Range { from: '\u{b56}', to: '\u{b57}', }, - Range { from: '\u{b58}', to: '\u{b5b}', }, - Range { from: '\u{b5c}', to: '\u{b5e}', }, - Range { from: '\u{b5f}', to: '\u{b63}', }, - Range { from: '\u{b64}', to: '\u{b65}', }, - Range { from: '\u{b66}', to: '\u{b77}', }, - Range { from: '\u{b78}', to: '\u{b81}', }, - Range { from: '\u{b82}', to: '\u{b83}', }, - Range { from: '\u{b84}', to: '\u{b84}', }, - Range { from: '\u{b85}', to: '\u{b8a}', }, - Range { from: '\u{b8b}', to: '\u{b8d}', }, - Range { from: '\u{b8e}', to: '\u{b90}', }, - Range { from: '\u{b91}', to: '\u{b91}', }, - Range { from: '\u{b92}', to: '\u{b95}', }, - Range { from: '\u{b96}', to: '\u{b98}', }, - Range { from: '\u{b99}', to: '\u{b9a}', }, - Range { from: '\u{b9b}', to: '\u{b9d}', }, - Range { from: '\u{b9e}', to: '\u{b9f}', }, - Range { from: '\u{ba0}', to: '\u{ba2}', }, - Range { from: '\u{ba3}', to: '\u{ba4}', }, - Range { from: '\u{ba5}', to: '\u{ba7}', }, - Range { from: '\u{ba8}', to: '\u{baa}', }, - Range { from: '\u{bab}', to: '\u{bad}', }, - Range { from: '\u{bae}', to: '\u{bb9}', }, - Range { from: '\u{bba}', to: '\u{bbd}', }, - Range { from: '\u{bbe}', to: '\u{bc2}', }, - Range { from: '\u{bc3}', to: '\u{bc5}', }, - Range { from: '\u{bc6}', to: '\u{bc8}', }, - Range { from: '\u{bc9}', to: '\u{bc9}', }, - Range { from: '\u{bca}', to: '\u{bcd}', }, - Range { from: '\u{bce}', to: '\u{bcf}', }, - Range { from: '\u{bd0}', to: '\u{bd0}', }, - Range { from: '\u{bd1}', to: '\u{bd6}', }, - Range { from: '\u{bd7}', to: '\u{bd7}', }, - Range { from: '\u{bd8}', to: '\u{be5}', }, - Range { from: '\u{be6}', to: '\u{bfa}', }, - Range { from: '\u{bfb}', to: '\u{bff}', }, - Range { from: '\u{c00}', to: '\u{c03}', }, - Range { from: '\u{c04}', to: '\u{c04}', }, - Range { from: '\u{c05}', to: '\u{c0c}', }, - Range { from: '\u{c0d}', to: '\u{c0d}', }, - Range { from: '\u{c0e}', to: '\u{c10}', }, - Range { from: '\u{c11}', to: '\u{c11}', }, - Range { from: '\u{c12}', to: '\u{c28}', }, - Range { from: '\u{c29}', to: '\u{c29}', }, - Range { from: '\u{c2a}', to: '\u{c39}', }, - Range { from: '\u{c3a}', to: '\u{c3c}', }, - Range { from: '\u{c3d}', to: '\u{c44}', }, - Range { from: '\u{c45}', to: '\u{c45}', }, - Range { from: '\u{c46}', to: '\u{c48}', }, - Range { from: '\u{c49}', to: '\u{c49}', }, - Range { from: '\u{c4a}', to: '\u{c4d}', }, - Range { from: '\u{c4e}', to: '\u{c54}', }, - Range { from: '\u{c55}', to: '\u{c56}', }, - Range { from: '\u{c57}', to: '\u{c57}', }, - Range { from: '\u{c58}', to: '\u{c5a}', }, - Range { from: '\u{c5b}', to: '\u{c5f}', }, - Range { from: '\u{c60}', to: '\u{c63}', }, - Range { from: '\u{c64}', to: '\u{c65}', }, - Range { from: '\u{c66}', to: '\u{c6f}', }, - Range { from: '\u{c70}', to: '\u{c77}', }, - Range { from: '\u{c78}', to: '\u{c83}', }, - Range { from: '\u{c84}', to: '\u{c84}', }, - Range { from: '\u{c85}', to: '\u{c8c}', }, - Range { from: '\u{c8d}', to: '\u{c8d}', }, - Range { from: '\u{c8e}', to: '\u{c90}', }, - Range { from: '\u{c91}', to: '\u{c91}', }, - Range { from: '\u{c92}', to: '\u{ca8}', }, - Range { from: '\u{ca9}', to: '\u{ca9}', }, - Range { from: '\u{caa}', to: '\u{cb3}', }, - Range { from: '\u{cb4}', to: '\u{cb4}', }, - Range { from: '\u{cb5}', to: '\u{cb9}', }, - Range { from: '\u{cba}', to: '\u{cbb}', }, - Range { from: '\u{cbc}', to: '\u{cc4}', }, - Range { from: '\u{cc5}', to: '\u{cc5}', }, - Range { from: '\u{cc6}', to: '\u{cc8}', }, - Range { from: '\u{cc9}', to: '\u{cc9}', }, - Range { from: '\u{cca}', to: '\u{ccd}', }, - Range { from: '\u{cce}', to: '\u{cd4}', }, - Range { from: '\u{cd5}', to: '\u{cd6}', }, - Range { from: '\u{cd7}', to: '\u{cdd}', }, - Range { from: '\u{cde}', to: '\u{cdf}', }, - Range { from: '\u{ce0}', to: '\u{ce3}', }, - Range { from: '\u{ce4}', to: '\u{ce5}', }, - Range { from: '\u{ce6}', to: '\u{cef}', }, - Range { from: '\u{cf0}', to: '\u{cf0}', }, - Range { from: '\u{cf1}', to: '\u{cf2}', }, - Range { from: '\u{cf3}', to: '\u{cff}', }, - Range { from: '\u{d00}', to: '\u{d03}', }, - Range { from: '\u{d04}', to: '\u{d04}', }, - Range { from: '\u{d05}', to: '\u{d0c}', }, - Range { from: '\u{d0d}', to: '\u{d0d}', }, - Range { from: '\u{d0e}', to: '\u{d10}', }, - Range { from: '\u{d11}', to: '\u{d11}', }, - Range { from: '\u{d12}', to: '\u{d44}', }, - Range { from: '\u{d45}', to: '\u{d45}', }, - Range { from: '\u{d46}', to: '\u{d48}', }, - Range { from: '\u{d49}', to: '\u{d49}', }, - Range { from: '\u{d4a}', to: '\u{d4f}', }, - Range { from: '\u{d50}', to: '\u{d53}', }, - Range { from: '\u{d54}', to: '\u{d63}', }, - Range { from: '\u{d64}', to: '\u{d65}', }, - Range { from: '\u{d66}', to: '\u{d7f}', }, - Range { from: '\u{d80}', to: '\u{d81}', }, - Range { from: '\u{d82}', to: '\u{d83}', }, - Range { from: '\u{d84}', to: '\u{d84}', }, - Range { from: '\u{d85}', to: '\u{d96}', }, - Range { from: '\u{d97}', to: '\u{d99}', }, - Range { from: '\u{d9a}', to: '\u{db1}', }, - Range { from: '\u{db2}', to: '\u{db2}', }, - Range { from: '\u{db3}', to: '\u{dbb}', }, - Range { from: '\u{dbc}', to: '\u{dbd}', }, - Range { from: '\u{dbe}', to: '\u{dbf}', }, - Range { from: '\u{dc0}', to: '\u{dc6}', }, - Range { from: '\u{dc7}', to: '\u{dc9}', }, - Range { from: '\u{dca}', to: '\u{dca}', }, - Range { from: '\u{dcb}', to: '\u{dce}', }, - Range { from: '\u{dcf}', to: '\u{dd4}', }, - Range { from: '\u{dd5}', to: '\u{dd7}', }, - Range { from: '\u{dd8}', to: '\u{ddf}', }, - Range { from: '\u{de0}', to: '\u{de5}', }, - Range { from: '\u{de6}', to: '\u{def}', }, - Range { from: '\u{df0}', to: '\u{df1}', }, - Range { from: '\u{df2}', to: '\u{df4}', }, - Range { from: '\u{df5}', to: '\u{e00}', }, - Range { from: '\u{e01}', to: '\u{e32}', }, - Range { from: '\u{e33}', to: '\u{e33}', }, - Range { from: '\u{e34}', to: '\u{e3a}', }, - Range { from: '\u{e3b}', to: '\u{e3e}', }, - Range { from: '\u{e3f}', to: '\u{e5b}', }, - Range { from: '\u{e5c}', to: '\u{e80}', }, - Range { from: '\u{e81}', to: '\u{e82}', }, - Range { from: '\u{e83}', to: '\u{e84}', }, - Range { from: '\u{e85}', to: '\u{e86}', }, - Range { from: '\u{e87}', to: '\u{e88}', }, - Range { from: '\u{e89}', to: '\u{e8a}', }, - Range { from: '\u{e8b}', to: '\u{e8c}', }, - Range { from: '\u{e8d}', to: '\u{e8d}', }, - Range { from: '\u{e8e}', to: '\u{e93}', }, - Range { from: '\u{e94}', to: '\u{e97}', }, - Range { from: '\u{e98}', to: '\u{e98}', }, - Range { from: '\u{e99}', to: '\u{e9f}', }, - Range { from: '\u{ea0}', to: '\u{ea0}', }, - Range { from: '\u{ea1}', to: '\u{ea3}', }, - Range { from: '\u{ea4}', to: '\u{ea7}', }, - Range { from: '\u{ea8}', to: '\u{ea9}', }, - Range { from: '\u{eaa}', to: '\u{eab}', }, - Range { from: '\u{eac}', to: '\u{eac}', }, - Range { from: '\u{ead}', to: '\u{eb2}', }, - Range { from: '\u{eb3}', to: '\u{eb3}', }, - Range { from: '\u{eb4}', to: '\u{eb9}', }, - Range { from: '\u{eba}', to: '\u{eba}', }, - Range { from: '\u{ebb}', to: '\u{ebd}', }, - Range { from: '\u{ebe}', to: '\u{ebf}', }, - Range { from: '\u{ec0}', to: '\u{ec4}', }, - Range { from: '\u{ec5}', to: '\u{ec7}', }, - Range { from: '\u{ec8}', to: '\u{ecd}', }, - Range { from: '\u{ece}', to: '\u{ecf}', }, - Range { from: '\u{ed0}', to: '\u{ed9}', }, - Range { from: '\u{eda}', to: '\u{edb}', }, - Range { from: '\u{edc}', to: '\u{edd}', }, - Range { from: '\u{ede}', to: '\u{edf}', }, - Range { from: '\u{ee0}', to: '\u{eff}', }, - Range { from: '\u{f00}', to: '\u{f0b}', }, - Range { from: '\u{f0c}', to: '\u{f0c}', }, - Range { from: '\u{f0d}', to: '\u{f42}', }, - Range { from: '\u{f43}', to: '\u{f43}', }, - Range { from: '\u{f44}', to: '\u{f47}', }, - Range { from: '\u{f48}', to: '\u{f48}', }, - Range { from: '\u{f49}', to: '\u{f4c}', }, - Range { from: '\u{f4d}', to: '\u{f4d}', }, - Range { from: '\u{f4e}', to: '\u{f51}', }, - Range { from: '\u{f52}', to: '\u{f52}', }, - Range { from: '\u{f53}', to: '\u{f56}', }, - Range { from: '\u{f57}', to: '\u{f57}', }, - Range { from: '\u{f58}', to: '\u{f5b}', }, - Range { from: '\u{f5c}', to: '\u{f5c}', }, - Range { from: '\u{f5d}', to: '\u{f68}', }, - Range { from: '\u{f69}', to: '\u{f69}', }, - Range { from: '\u{f6a}', to: '\u{f6c}', }, - Range { from: '\u{f6d}', to: '\u{f70}', }, - Range { from: '\u{f71}', to: '\u{f72}', }, - Range { from: '\u{f73}', to: '\u{f79}', }, - Range { from: '\u{f7a}', to: '\u{f80}', }, - Range { from: '\u{f81}', to: '\u{f81}', }, - Range { from: '\u{f82}', to: '\u{f92}', }, - Range { from: '\u{f93}', to: '\u{f93}', }, - Range { from: '\u{f94}', to: '\u{f97}', }, - Range { from: '\u{f98}', to: '\u{f98}', }, - Range { from: '\u{f99}', to: '\u{f9c}', }, - Range { from: '\u{f9d}', to: '\u{f9d}', }, - Range { from: '\u{f9e}', to: '\u{fa1}', }, - Range { from: '\u{fa2}', to: '\u{fa2}', }, - Range { from: '\u{fa3}', to: '\u{fa6}', }, - Range { from: '\u{fa7}', to: '\u{fa7}', }, - Range { from: '\u{fa8}', to: '\u{fab}', }, - Range { from: '\u{fac}', to: '\u{fac}', }, - Range { from: '\u{fad}', to: '\u{fb8}', }, - Range { from: '\u{fb9}', to: '\u{fb9}', }, - Range { from: '\u{fba}', to: '\u{fbc}', }, - Range { from: '\u{fbd}', to: '\u{fbd}', }, - Range { from: '\u{fbe}', to: '\u{fcc}', }, - Range { from: '\u{fcd}', to: '\u{fcd}', }, - Range { from: '\u{fce}', to: '\u{fda}', }, - Range { from: '\u{fdb}', to: '\u{fff}', }, - Range { from: '\u{1000}', to: '\u{109f}', }, - Range { from: '\u{10a0}', to: '\u{10c6}', }, - Range { from: '\u{10c7}', to: '\u{10c7}', }, - Range { from: '\u{10c8}', to: '\u{10cc}', }, - Range { from: '\u{10cd}', to: '\u{10cd}', }, - Range { from: '\u{10ce}', to: '\u{10cf}', }, - Range { from: '\u{10d0}', to: '\u{10fb}', }, - Range { from: '\u{10fc}', to: '\u{10fc}', }, - Range { from: '\u{10fd}', to: '\u{115e}', }, - Range { from: '\u{115f}', to: '\u{1160}', }, - Range { from: '\u{1161}', to: '\u{1248}', }, - Range { from: '\u{1249}', to: '\u{1249}', }, - Range { from: '\u{124a}', to: '\u{124d}', }, - Range { from: '\u{124e}', to: '\u{124f}', }, - Range { from: '\u{1250}', to: '\u{1256}', }, - Range { from: '\u{1257}', to: '\u{1259}', }, - Range { from: '\u{125a}', to: '\u{125d}', }, - Range { from: '\u{125e}', to: '\u{125f}', }, - Range { from: '\u{1260}', to: '\u{1288}', }, - Range { from: '\u{1289}', to: '\u{1289}', }, - Range { from: '\u{128a}', to: '\u{128d}', }, - Range { from: '\u{128e}', to: '\u{128f}', }, - Range { from: '\u{1290}', to: '\u{12b0}', }, - Range { from: '\u{12b1}', to: '\u{12b1}', }, - Range { from: '\u{12b2}', to: '\u{12b5}', }, - Range { from: '\u{12b6}', to: '\u{12b7}', }, - Range { from: '\u{12b8}', to: '\u{12be}', }, - Range { from: '\u{12bf}', to: '\u{12c1}', }, - Range { from: '\u{12c2}', to: '\u{12c5}', }, - Range { from: '\u{12c6}', to: '\u{12c7}', }, - Range { from: '\u{12c8}', to: '\u{12d6}', }, - Range { from: '\u{12d7}', to: '\u{12d7}', }, - Range { from: '\u{12d8}', to: '\u{1310}', }, - Range { from: '\u{1311}', to: '\u{1311}', }, - Range { from: '\u{1312}', to: '\u{1315}', }, - Range { from: '\u{1316}', to: '\u{1317}', }, - Range { from: '\u{1318}', to: '\u{135a}', }, - Range { from: '\u{135b}', to: '\u{135c}', }, - Range { from: '\u{135d}', to: '\u{137c}', }, - Range { from: '\u{137d}', to: '\u{137f}', }, - Range { from: '\u{1380}', to: '\u{1399}', }, - Range { from: '\u{139a}', to: '\u{139f}', }, - Range { from: '\u{13a0}', to: '\u{13f5}', }, - Range { from: '\u{13f6}', to: '\u{13f7}', }, - Range { from: '\u{13f8}', to: '\u{13fd}', }, - Range { from: '\u{13fe}', to: '\u{13ff}', }, - Range { from: '\u{1400}', to: '\u{167f}', }, - Range { from: '\u{1680}', to: '\u{1680}', }, - Range { from: '\u{1681}', to: '\u{169c}', }, - Range { from: '\u{169d}', to: '\u{169f}', }, - Range { from: '\u{16a0}', to: '\u{16f8}', }, - Range { from: '\u{16f9}', to: '\u{16ff}', }, - Range { from: '\u{1700}', to: '\u{170c}', }, - Range { from: '\u{170d}', to: '\u{170d}', }, - Range { from: '\u{170e}', to: '\u{1714}', }, - Range { from: '\u{1715}', to: '\u{171f}', }, - Range { from: '\u{1720}', to: '\u{1736}', }, - Range { from: '\u{1737}', to: '\u{173f}', }, - Range { from: '\u{1740}', to: '\u{1753}', }, - Range { from: '\u{1754}', to: '\u{175f}', }, - Range { from: '\u{1760}', to: '\u{176c}', }, - Range { from: '\u{176d}', to: '\u{176d}', }, - Range { from: '\u{176e}', to: '\u{1770}', }, - Range { from: '\u{1771}', to: '\u{1771}', }, - Range { from: '\u{1772}', to: '\u{1773}', }, - Range { from: '\u{1774}', to: '\u{177f}', }, - Range { from: '\u{1780}', to: '\u{17b3}', }, - Range { from: '\u{17b4}', to: '\u{17b5}', }, - Range { from: '\u{17b6}', to: '\u{17dd}', }, - Range { from: '\u{17de}', to: '\u{17df}', }, - Range { from: '\u{17e0}', to: '\u{17e9}', }, - Range { from: '\u{17ea}', to: '\u{17ef}', }, - Range { from: '\u{17f0}', to: '\u{17f9}', }, - Range { from: '\u{17fa}', to: '\u{17ff}', }, - Range { from: '\u{1800}', to: '\u{1805}', }, - Range { from: '\u{1806}', to: '\u{1806}', }, - Range { from: '\u{1807}', to: '\u{180a}', }, - Range { from: '\u{180b}', to: '\u{180d}', }, - Range { from: '\u{180e}', to: '\u{180f}', }, - Range { from: '\u{1810}', to: '\u{1819}', }, - Range { from: '\u{181a}', to: '\u{181f}', }, - Range { from: '\u{1820}', to: '\u{1877}', }, - Range { from: '\u{1878}', to: '\u{187f}', }, - Range { from: '\u{1880}', to: '\u{18aa}', }, - Range { from: '\u{18ab}', to: '\u{18af}', }, - Range { from: '\u{18b0}', to: '\u{18f5}', }, - Range { from: '\u{18f6}', to: '\u{18ff}', }, - Range { from: '\u{1900}', to: '\u{191e}', }, - Range { from: '\u{191f}', to: '\u{191f}', }, - Range { from: '\u{1920}', to: '\u{192b}', }, - Range { from: '\u{192c}', to: '\u{192f}', }, - Range { from: '\u{1930}', to: '\u{193b}', }, - Range { from: '\u{193c}', to: '\u{193f}', }, - Range { from: '\u{1940}', to: '\u{1940}', }, - Range { from: '\u{1941}', to: '\u{1943}', }, - Range { from: '\u{1944}', to: '\u{196d}', }, - Range { from: '\u{196e}', to: '\u{196f}', }, - Range { from: '\u{1970}', to: '\u{1974}', }, - Range { from: '\u{1975}', to: '\u{197f}', }, - Range { from: '\u{1980}', to: '\u{19ab}', }, - Range { from: '\u{19ac}', to: '\u{19af}', }, - Range { from: '\u{19b0}', to: '\u{19c9}', }, - Range { from: '\u{19ca}', to: '\u{19cf}', }, - Range { from: '\u{19d0}', to: '\u{19da}', }, - Range { from: '\u{19db}', to: '\u{19dd}', }, - Range { from: '\u{19de}', to: '\u{1a1b}', }, - Range { from: '\u{1a1c}', to: '\u{1a1d}', }, - Range { from: '\u{1a1e}', to: '\u{1a5e}', }, - Range { from: '\u{1a5f}', to: '\u{1a5f}', }, - Range { from: '\u{1a60}', to: '\u{1a7c}', }, - Range { from: '\u{1a7d}', to: '\u{1a7e}', }, - Range { from: '\u{1a7f}', to: '\u{1a89}', }, - Range { from: '\u{1a8a}', to: '\u{1a8f}', }, - Range { from: '\u{1a90}', to: '\u{1a99}', }, - Range { from: '\u{1a9a}', to: '\u{1a9f}', }, - Range { from: '\u{1aa0}', to: '\u{1aad}', }, - Range { from: '\u{1aae}', to: '\u{1aaf}', }, - Range { from: '\u{1ab0}', to: '\u{1abe}', }, - Range { from: '\u{1abf}', to: '\u{1aff}', }, - Range { from: '\u{1b00}', to: '\u{1b4b}', }, - Range { from: '\u{1b4c}', to: '\u{1b4f}', }, - Range { from: '\u{1b50}', to: '\u{1b7c}', }, - Range { from: '\u{1b7d}', to: '\u{1b7f}', }, - Range { from: '\u{1b80}', to: '\u{1bf3}', }, - Range { from: '\u{1bf4}', to: '\u{1bfb}', }, - Range { from: '\u{1bfc}', to: '\u{1c37}', }, - Range { from: '\u{1c38}', to: '\u{1c3a}', }, - Range { from: '\u{1c3b}', to: '\u{1c49}', }, - Range { from: '\u{1c4a}', to: '\u{1c4c}', }, - Range { from: '\u{1c4d}', to: '\u{1c7f}', }, - Range { from: '\u{1c80}', to: '\u{1c83}', }, - Range { from: '\u{1c84}', to: '\u{1c85}', }, - Range { from: '\u{1c86}', to: '\u{1c88}', }, - Range { from: '\u{1c89}', to: '\u{1cbf}', }, - Range { from: '\u{1cc0}', to: '\u{1cc7}', }, - Range { from: '\u{1cc8}', to: '\u{1ccf}', }, - Range { from: '\u{1cd0}', to: '\u{1cf9}', }, - Range { from: '\u{1cfa}', to: '\u{1cff}', }, - Range { from: '\u{1d00}', to: '\u{1d2b}', }, - Range { from: '\u{1d2c}', to: '\u{1d6a}', }, - Range { from: '\u{1d6b}', to: '\u{1d77}', }, - Range { from: '\u{1d78}', to: '\u{1d78}', }, - Range { from: '\u{1d79}', to: '\u{1d9a}', }, - Range { from: '\u{1d9b}', to: '\u{1dbf}', }, - Range { from: '\u{1dc0}', to: '\u{1df9}', }, - Range { from: '\u{1dfa}', to: '\u{1dfa}', }, - Range { from: '\u{1dfb}', to: '\u{1dff}', }, - Range { from: '\u{1e00}', to: '\u{1e94}', }, - Range { from: '\u{1e95}', to: '\u{1e99}', }, - Range { from: '\u{1e9a}', to: '\u{1e9b}', }, - Range { from: '\u{1e9c}', to: '\u{1e9d}', }, - Range { from: '\u{1e9e}', to: '\u{1efe}', }, - Range { from: '\u{1eff}', to: '\u{1f07}', }, - Range { from: '\u{1f08}', to: '\u{1f0f}', }, - Range { from: '\u{1f10}', to: '\u{1f15}', }, - Range { from: '\u{1f16}', to: '\u{1f17}', }, - Range { from: '\u{1f18}', to: '\u{1f1d}', }, - Range { from: '\u{1f1e}', to: '\u{1f1f}', }, - Range { from: '\u{1f20}', to: '\u{1f27}', }, - Range { from: '\u{1f28}', to: '\u{1f2f}', }, - Range { from: '\u{1f30}', to: '\u{1f37}', }, - Range { from: '\u{1f38}', to: '\u{1f3f}', }, - Range { from: '\u{1f40}', to: '\u{1f45}', }, - Range { from: '\u{1f46}', to: '\u{1f47}', }, - Range { from: '\u{1f48}', to: '\u{1f4d}', }, - Range { from: '\u{1f4e}', to: '\u{1f4f}', }, - Range { from: '\u{1f50}', to: '\u{1f57}', }, - Range { from: '\u{1f58}', to: '\u{1f5f}', }, - Range { from: '\u{1f60}', to: '\u{1f67}', }, - Range { from: '\u{1f68}', to: '\u{1f7d}', }, - Range { from: '\u{1f7e}', to: '\u{1f7f}', }, - Range { from: '\u{1f80}', to: '\u{1faf}', }, - Range { from: '\u{1fb0}', to: '\u{1fb1}', }, - Range { from: '\u{1fb2}', to: '\u{1fcf}', }, - Range { from: '\u{1fd0}', to: '\u{1fd2}', }, - Range { from: '\u{1fd3}', to: '\u{1fd3}', }, - Range { from: '\u{1fd4}', to: '\u{1fd5}', }, - Range { from: '\u{1fd6}', to: '\u{1fd7}', }, - Range { from: '\u{1fd8}', to: '\u{1fdf}', }, - Range { from: '\u{1fe0}', to: '\u{1fe2}', }, - Range { from: '\u{1fe3}', to: '\u{1fe3}', }, - Range { from: '\u{1fe4}', to: '\u{1fe7}', }, - Range { from: '\u{1fe8}', to: '\u{1fef}', }, - Range { from: '\u{1ff0}', to: '\u{1ff1}', }, - Range { from: '\u{1ff2}', to: '\u{1fff}', }, - Range { from: '\u{2000}', to: '\u{200a}', }, - Range { from: '\u{200b}', to: '\u{200b}', }, - Range { from: '\u{200c}', to: '\u{200d}', }, - Range { from: '\u{200e}', to: '\u{200f}', }, - Range { from: '\u{2010}', to: '\u{2011}', }, - Range { from: '\u{2012}', to: '\u{2016}', }, - Range { from: '\u{2017}', to: '\u{2017}', }, - Range { from: '\u{2018}', to: '\u{2023}', }, - Range { from: '\u{2024}', to: '\u{2026}', }, - Range { from: '\u{2027}', to: '\u{2027}', }, - Range { from: '\u{2028}', to: '\u{202e}', }, - Range { from: '\u{202f}', to: '\u{202f}', }, - Range { from: '\u{2030}', to: '\u{2032}', }, - Range { from: '\u{2033}', to: '\u{2037}', }, - Range { from: '\u{2038}', to: '\u{203b}', }, - Range { from: '\u{203c}', to: '\u{203e}', }, - Range { from: '\u{203f}', to: '\u{2046}', }, - Range { from: '\u{2047}', to: '\u{2049}', }, - Range { from: '\u{204a}', to: '\u{2056}', }, - Range { from: '\u{2057}', to: '\u{2057}', }, - Range { from: '\u{2058}', to: '\u{205e}', }, - Range { from: '\u{205f}', to: '\u{2060}', }, - Range { from: '\u{2061}', to: '\u{2063}', }, - Range { from: '\u{2064}', to: '\u{2064}', }, - Range { from: '\u{2065}', to: '\u{206f}', }, - Range { from: '\u{2070}', to: '\u{2071}', }, - Range { from: '\u{2072}', to: '\u{2073}', }, - Range { from: '\u{2074}', to: '\u{209c}', }, - Range { from: '\u{209d}', to: '\u{209f}', }, - Range { from: '\u{20a0}', to: '\u{20a7}', }, - Range { from: '\u{20a8}', to: '\u{20a8}', }, - Range { from: '\u{20a9}', to: '\u{20bf}', }, - Range { from: '\u{20c0}', to: '\u{20cf}', }, - Range { from: '\u{20d0}', to: '\u{20f0}', }, - Range { from: '\u{20f1}', to: '\u{20ff}', }, - Range { from: '\u{2100}', to: '\u{210a}', }, - Range { from: '\u{210b}', to: '\u{210e}', }, - Range { from: '\u{210f}', to: '\u{210f}', }, - Range { from: '\u{2110}', to: '\u{2111}', }, - Range { from: '\u{2112}', to: '\u{2113}', }, - Range { from: '\u{2114}', to: '\u{2116}', }, - Range { from: '\u{2117}', to: '\u{2118}', }, - Range { from: '\u{2119}', to: '\u{211a}', }, - Range { from: '\u{211b}', to: '\u{211d}', }, - Range { from: '\u{211e}', to: '\u{211f}', }, - Range { from: '\u{2120}', to: '\u{212e}', }, - Range { from: '\u{212f}', to: '\u{2130}', }, - Range { from: '\u{2131}', to: '\u{213c}', }, - Range { from: '\u{213d}', to: '\u{213e}', }, - Range { from: '\u{213f}', to: '\u{2140}', }, - Range { from: '\u{2141}', to: '\u{2144}', }, - Range { from: '\u{2145}', to: '\u{2146}', }, - Range { from: '\u{2147}', to: '\u{2149}', }, - Range { from: '\u{214a}', to: '\u{214f}', }, - Range { from: '\u{2150}', to: '\u{217f}', }, - Range { from: '\u{2180}', to: '\u{2182}', }, - Range { from: '\u{2183}', to: '\u{2183}', }, - Range { from: '\u{2184}', to: '\u{2188}', }, - Range { from: '\u{2189}', to: '\u{2189}', }, - Range { from: '\u{218a}', to: '\u{218b}', }, - Range { from: '\u{218c}', to: '\u{218f}', }, - Range { from: '\u{2190}', to: '\u{222b}', }, - Range { from: '\u{222c}', to: '\u{2230}', }, - Range { from: '\u{2231}', to: '\u{225f}', }, - Range { from: '\u{2260}', to: '\u{2260}', }, - Range { from: '\u{2261}', to: '\u{226d}', }, - Range { from: '\u{226e}', to: '\u{226f}', }, - Range { from: '\u{2270}', to: '\u{2328}', }, - Range { from: '\u{2329}', to: '\u{232a}', }, - Range { from: '\u{232b}', to: '\u{2426}', }, - Range { from: '\u{2427}', to: '\u{243f}', }, - Range { from: '\u{2440}', to: '\u{244a}', }, - Range { from: '\u{244b}', to: '\u{245f}', }, - Range { from: '\u{2460}', to: '\u{2487}', }, - Range { from: '\u{2488}', to: '\u{249b}', }, - Range { from: '\u{249c}', to: '\u{24ea}', }, - Range { from: '\u{24eb}', to: '\u{2a0b}', }, - Range { from: '\u{2a0c}', to: '\u{2a0c}', }, - Range { from: '\u{2a0d}', to: '\u{2a73}', }, - Range { from: '\u{2a74}', to: '\u{2a76}', }, - Range { from: '\u{2a77}', to: '\u{2adb}', }, - Range { from: '\u{2adc}', to: '\u{2adc}', }, - Range { from: '\u{2add}', to: '\u{2b73}', }, - Range { from: '\u{2b74}', to: '\u{2b75}', }, - Range { from: '\u{2b76}', to: '\u{2b95}', }, - Range { from: '\u{2b96}', to: '\u{2b97}', }, - Range { from: '\u{2b98}', to: '\u{2bb9}', }, - Range { from: '\u{2bba}', to: '\u{2bbc}', }, - Range { from: '\u{2bbd}', to: '\u{2bc8}', }, - Range { from: '\u{2bc9}', to: '\u{2bc9}', }, - Range { from: '\u{2bca}', to: '\u{2bd2}', }, - Range { from: '\u{2bd3}', to: '\u{2beb}', }, - Range { from: '\u{2bec}', to: '\u{2bef}', }, - Range { from: '\u{2bf0}', to: '\u{2bff}', }, - Range { from: '\u{2c00}', to: '\u{2c2f}', }, - Range { from: '\u{2c30}', to: '\u{2c5e}', }, - Range { from: '\u{2c5f}', to: '\u{2c64}', }, - Range { from: '\u{2c65}', to: '\u{2c66}', }, - Range { from: '\u{2c67}', to: '\u{2c72}', }, - Range { from: '\u{2c73}', to: '\u{2c74}', }, - Range { from: '\u{2c75}', to: '\u{2c75}', }, - Range { from: '\u{2c76}', to: '\u{2c7b}', }, - Range { from: '\u{2c7c}', to: '\u{2ce2}', }, - Range { from: '\u{2ce3}', to: '\u{2cea}', }, - Range { from: '\u{2ceb}', to: '\u{2ced}', }, - Range { from: '\u{2cee}', to: '\u{2cf1}', }, - Range { from: '\u{2cf2}', to: '\u{2cf3}', }, - Range { from: '\u{2cf4}', to: '\u{2cf8}', }, - Range { from: '\u{2cf9}', to: '\u{2d25}', }, - Range { from: '\u{2d26}', to: '\u{2d27}', }, - Range { from: '\u{2d28}', to: '\u{2d2c}', }, - Range { from: '\u{2d2d}', to: '\u{2d2d}', }, - Range { from: '\u{2d2e}', to: '\u{2d2f}', }, - Range { from: '\u{2d30}', to: '\u{2d67}', }, - Range { from: '\u{2d68}', to: '\u{2d6e}', }, - Range { from: '\u{2d6f}', to: '\u{2d70}', }, - Range { from: '\u{2d71}', to: '\u{2d7e}', }, - Range { from: '\u{2d7f}', to: '\u{2d96}', }, - Range { from: '\u{2d97}', to: '\u{2d9f}', }, - Range { from: '\u{2da0}', to: '\u{2da6}', }, - Range { from: '\u{2da7}', to: '\u{2da7}', }, - Range { from: '\u{2da8}', to: '\u{2dae}', }, - Range { from: '\u{2daf}', to: '\u{2daf}', }, - Range { from: '\u{2db0}', to: '\u{2db6}', }, - Range { from: '\u{2db7}', to: '\u{2db7}', }, - Range { from: '\u{2db8}', to: '\u{2dbe}', }, - Range { from: '\u{2dbf}', to: '\u{2dbf}', }, - Range { from: '\u{2dc0}', to: '\u{2dc6}', }, - Range { from: '\u{2dc7}', to: '\u{2dc7}', }, - Range { from: '\u{2dc8}', to: '\u{2dce}', }, - Range { from: '\u{2dcf}', to: '\u{2dcf}', }, - Range { from: '\u{2dd0}', to: '\u{2dd6}', }, - Range { from: '\u{2dd7}', to: '\u{2dd7}', }, - Range { from: '\u{2dd8}', to: '\u{2dde}', }, - Range { from: '\u{2ddf}', to: '\u{2ddf}', }, - Range { from: '\u{2de0}', to: '\u{2e49}', }, - Range { from: '\u{2e4a}', to: '\u{2e7f}', }, - Range { from: '\u{2e80}', to: '\u{2e99}', }, - Range { from: '\u{2e9a}', to: '\u{2e9a}', }, - Range { from: '\u{2e9b}', to: '\u{2e9e}', }, - Range { from: '\u{2e9f}', to: '\u{2e9f}', }, - Range { from: '\u{2ea0}', to: '\u{2ef2}', }, - Range { from: '\u{2ef3}', to: '\u{2ef3}', }, - Range { from: '\u{2ef4}', to: '\u{2eff}', }, - Range { from: '\u{2f00}', to: '\u{2fd5}', }, - Range { from: '\u{2fd6}', to: '\u{2fff}', }, - Range { from: '\u{3000}', to: '\u{3002}', }, - Range { from: '\u{3003}', to: '\u{3035}', }, - Range { from: '\u{3036}', to: '\u{303a}', }, - Range { from: '\u{303b}', to: '\u{303f}', }, - Range { from: '\u{3040}', to: '\u{3040}', }, - Range { from: '\u{3041}', to: '\u{3096}', }, - Range { from: '\u{3097}', to: '\u{3098}', }, - Range { from: '\u{3099}', to: '\u{309a}', }, - Range { from: '\u{309b}', to: '\u{309c}', }, - Range { from: '\u{309d}', to: '\u{309e}', }, - Range { from: '\u{309f}', to: '\u{309f}', }, - Range { from: '\u{30a0}', to: '\u{30fe}', }, - Range { from: '\u{30ff}', to: '\u{30ff}', }, - Range { from: '\u{3100}', to: '\u{3104}', }, - Range { from: '\u{3105}', to: '\u{312e}', }, - Range { from: '\u{312f}', to: '\u{3130}', }, - Range { from: '\u{3131}', to: '\u{318f}', }, - Range { from: '\u{3190}', to: '\u{3191}', }, - Range { from: '\u{3192}', to: '\u{319f}', }, - Range { from: '\u{31a0}', to: '\u{31ba}', }, - Range { from: '\u{31bb}', to: '\u{31bf}', }, - Range { from: '\u{31c0}', to: '\u{31e3}', }, - Range { from: '\u{31e4}', to: '\u{31ef}', }, - Range { from: '\u{31f0}', to: '\u{31ff}', }, - Range { from: '\u{3200}', to: '\u{3247}', }, - Range { from: '\u{3248}', to: '\u{324f}', }, - Range { from: '\u{3250}', to: '\u{33ff}', }, - Range { from: '\u{3400}', to: '\u{4db5}', }, - Range { from: '\u{4db6}', to: '\u{4dbf}', }, - Range { from: '\u{4dc0}', to: '\u{9fea}', }, - Range { from: '\u{9feb}', to: '\u{9fff}', }, - Range { from: '\u{a000}', to: '\u{a48c}', }, - Range { from: '\u{a48d}', to: '\u{a48f}', }, - Range { from: '\u{a490}', to: '\u{a4c6}', }, - Range { from: '\u{a4c7}', to: '\u{a4cf}', }, - Range { from: '\u{a4d0}', to: '\u{a62b}', }, - Range { from: '\u{a62c}', to: '\u{a63f}', }, - Range { from: '\u{a640}', to: '\u{a66c}', }, - Range { from: '\u{a66d}', to: '\u{a67f}', }, - Range { from: '\u{a680}', to: '\u{a69d}', }, - Range { from: '\u{a69e}', to: '\u{a6f7}', }, - Range { from: '\u{a6f8}', to: '\u{a6ff}', }, - Range { from: '\u{a700}', to: '\u{a721}', }, - Range { from: '\u{a722}', to: '\u{a72e}', }, - Range { from: '\u{a72f}', to: '\u{a731}', }, - Range { from: '\u{a732}', to: '\u{a770}', }, - Range { from: '\u{a771}', to: '\u{a778}', }, - Range { from: '\u{a779}', to: '\u{a786}', }, - Range { from: '\u{a787}', to: '\u{a78a}', }, - Range { from: '\u{a78b}', to: '\u{a78d}', }, - Range { from: '\u{a78e}', to: '\u{a78f}', }, - Range { from: '\u{a790}', to: '\u{a792}', }, - Range { from: '\u{a793}', to: '\u{a795}', }, - Range { from: '\u{a796}', to: '\u{a7b7}', }, - Range { from: '\u{a7b8}', to: '\u{a7f6}', }, - Range { from: '\u{a7f7}', to: '\u{a7f9}', }, - Range { from: '\u{a7fa}', to: '\u{a82b}', }, - Range { from: '\u{a82c}', to: '\u{a82f}', }, - Range { from: '\u{a830}', to: '\u{a839}', }, - Range { from: '\u{a83a}', to: '\u{a83f}', }, - Range { from: '\u{a840}', to: '\u{a877}', }, - Range { from: '\u{a878}', to: '\u{a87f}', }, - Range { from: '\u{a880}', to: '\u{a8c5}', }, - Range { from: '\u{a8c6}', to: '\u{a8cd}', }, - Range { from: '\u{a8ce}', to: '\u{a8d9}', }, - Range { from: '\u{a8da}', to: '\u{a8df}', }, - Range { from: '\u{a8e0}', to: '\u{a8fd}', }, - Range { from: '\u{a8fe}', to: '\u{a8ff}', }, - Range { from: '\u{a900}', to: '\u{a953}', }, - Range { from: '\u{a954}', to: '\u{a95e}', }, - Range { from: '\u{a95f}', to: '\u{a97c}', }, - Range { from: '\u{a97d}', to: '\u{a97f}', }, - Range { from: '\u{a980}', to: '\u{a9cd}', }, - Range { from: '\u{a9ce}', to: '\u{a9ce}', }, - Range { from: '\u{a9cf}', to: '\u{a9d9}', }, - Range { from: '\u{a9da}', to: '\u{a9dd}', }, - Range { from: '\u{a9de}', to: '\u{a9fe}', }, - Range { from: '\u{a9ff}', to: '\u{a9ff}', }, - Range { from: '\u{aa00}', to: '\u{aa36}', }, - Range { from: '\u{aa37}', to: '\u{aa3f}', }, - Range { from: '\u{aa40}', to: '\u{aa4d}', }, - Range { from: '\u{aa4e}', to: '\u{aa4f}', }, - Range { from: '\u{aa50}', to: '\u{aa59}', }, - Range { from: '\u{aa5a}', to: '\u{aa5b}', }, - Range { from: '\u{aa5c}', to: '\u{aac2}', }, - Range { from: '\u{aac3}', to: '\u{aada}', }, - Range { from: '\u{aadb}', to: '\u{aaf6}', }, - Range { from: '\u{aaf7}', to: '\u{ab00}', }, - Range { from: '\u{ab01}', to: '\u{ab06}', }, - Range { from: '\u{ab07}', to: '\u{ab08}', }, - Range { from: '\u{ab09}', to: '\u{ab0e}', }, - Range { from: '\u{ab0f}', to: '\u{ab10}', }, - Range { from: '\u{ab11}', to: '\u{ab16}', }, - Range { from: '\u{ab17}', to: '\u{ab1f}', }, - Range { from: '\u{ab20}', to: '\u{ab26}', }, - Range { from: '\u{ab27}', to: '\u{ab27}', }, - Range { from: '\u{ab28}', to: '\u{ab2e}', }, - Range { from: '\u{ab2f}', to: '\u{ab2f}', }, - Range { from: '\u{ab30}', to: '\u{ab5b}', }, - Range { from: '\u{ab5c}', to: '\u{ab5f}', }, - Range { from: '\u{ab60}', to: '\u{ab65}', }, - Range { from: '\u{ab66}', to: '\u{ab6f}', }, - Range { from: '\u{ab70}', to: '\u{abbf}', }, - Range { from: '\u{abc0}', to: '\u{abed}', }, - Range { from: '\u{abee}', to: '\u{abef}', }, - Range { from: '\u{abf0}', to: '\u{abf9}', }, - Range { from: '\u{abfa}', to: '\u{abff}', }, - Range { from: '\u{ac00}', to: '\u{d7a3}', }, - Range { from: '\u{d7a4}', to: '\u{d7af}', }, - Range { from: '\u{d7b0}', to: '\u{d7c6}', }, - Range { from: '\u{d7c7}', to: '\u{d7ca}', }, - Range { from: '\u{d7cb}', to: '\u{d7fb}', }, - Range { from: '\u{d7fc}', to: '\u{f8ff}', }, - Range { from: '\u{f900}', to: '\u{f906}', }, - Range { from: '\u{f907}', to: '\u{f908}', }, - Range { from: '\u{f909}', to: '\u{fa0d}', }, - Range { from: '\u{fa0e}', to: '\u{fa0f}', }, - Range { from: '\u{fa10}', to: '\u{fa12}', }, - Range { from: '\u{fa13}', to: '\u{fa14}', }, - Range { from: '\u{fa15}', to: '\u{fa22}', }, - Range { from: '\u{fa23}', to: '\u{fa24}', }, - Range { from: '\u{fa25}', to: '\u{fa26}', }, - Range { from: '\u{fa27}', to: '\u{fa29}', }, - Range { from: '\u{fa2a}', to: '\u{fa5c}', }, - Range { from: '\u{fa5d}', to: '\u{fa5e}', }, - Range { from: '\u{fa5f}', to: '\u{fa6d}', }, - Range { from: '\u{fa6e}', to: '\u{fa6f}', }, - Range { from: '\u{fa70}', to: '\u{fad9}', }, - Range { from: '\u{fada}', to: '\u{faff}', }, - Range { from: '\u{fb00}', to: '\u{fb04}', }, - Range { from: '\u{fb05}', to: '\u{fb06}', }, - Range { from: '\u{fb07}', to: '\u{fb12}', }, - Range { from: '\u{fb13}', to: '\u{fb17}', }, - Range { from: '\u{fb18}', to: '\u{fb1c}', }, - Range { from: '\u{fb1d}', to: '\u{fb4f}', }, - Range { from: '\u{fb50}', to: '\u{fb51}', }, - Range { from: '\u{fb52}', to: '\u{fb55}', }, - Range { from: '\u{fb56}', to: '\u{fb59}', }, - Range { from: '\u{fb5a}', to: '\u{fb5d}', }, - Range { from: '\u{fb5e}', to: '\u{fb61}', }, - Range { from: '\u{fb62}', to: '\u{fb65}', }, - Range { from: '\u{fb66}', to: '\u{fb69}', }, - Range { from: '\u{fb6a}', to: '\u{fb6d}', }, - Range { from: '\u{fb6e}', to: '\u{fb71}', }, - Range { from: '\u{fb72}', to: '\u{fb75}', }, - Range { from: '\u{fb76}', to: '\u{fb79}', }, - Range { from: '\u{fb7a}', to: '\u{fb7d}', }, - Range { from: '\u{fb7e}', to: '\u{fb81}', }, - Range { from: '\u{fb82}', to: '\u{fb83}', }, - Range { from: '\u{fb84}', to: '\u{fb85}', }, - Range { from: '\u{fb86}', to: '\u{fb87}', }, - Range { from: '\u{fb88}', to: '\u{fb89}', }, - Range { from: '\u{fb8a}', to: '\u{fb8b}', }, - Range { from: '\u{fb8c}', to: '\u{fb8d}', }, - Range { from: '\u{fb8e}', to: '\u{fb91}', }, - Range { from: '\u{fb92}', to: '\u{fb95}', }, - Range { from: '\u{fb96}', to: '\u{fb99}', }, - Range { from: '\u{fb9a}', to: '\u{fb9d}', }, - Range { from: '\u{fb9e}', to: '\u{fb9f}', }, - Range { from: '\u{fba0}', to: '\u{fba3}', }, - Range { from: '\u{fba4}', to: '\u{fba5}', }, - Range { from: '\u{fba6}', to: '\u{fba9}', }, - Range { from: '\u{fbaa}', to: '\u{fbad}', }, - Range { from: '\u{fbae}', to: '\u{fbaf}', }, - Range { from: '\u{fbb0}', to: '\u{fbb1}', }, - Range { from: '\u{fbb2}', to: '\u{fbc1}', }, - Range { from: '\u{fbc2}', to: '\u{fbd2}', }, - Range { from: '\u{fbd3}', to: '\u{fbd6}', }, - Range { from: '\u{fbd7}', to: '\u{fbd8}', }, - Range { from: '\u{fbd9}', to: '\u{fbda}', }, - Range { from: '\u{fbdb}', to: '\u{fbdc}', }, - Range { from: '\u{fbdd}', to: '\u{fbdd}', }, - Range { from: '\u{fbde}', to: '\u{fbdf}', }, - Range { from: '\u{fbe0}', to: '\u{fbe1}', }, - Range { from: '\u{fbe2}', to: '\u{fbe3}', }, - Range { from: '\u{fbe4}', to: '\u{fbe7}', }, - Range { from: '\u{fbe8}', to: '\u{fbe9}', }, - Range { from: '\u{fbea}', to: '\u{fbeb}', }, - Range { from: '\u{fbec}', to: '\u{fbed}', }, - Range { from: '\u{fbee}', to: '\u{fbef}', }, - Range { from: '\u{fbf0}', to: '\u{fbf1}', }, - Range { from: '\u{fbf2}', to: '\u{fbf3}', }, - Range { from: '\u{fbf4}', to: '\u{fbf5}', }, - Range { from: '\u{fbf6}', to: '\u{fbf8}', }, - Range { from: '\u{fbf9}', to: '\u{fbfb}', }, - Range { from: '\u{fbfc}', to: '\u{fbff}', }, - Range { from: '\u{fc00}', to: '\u{fd3b}', }, - Range { from: '\u{fd3c}', to: '\u{fd3d}', }, - Range { from: '\u{fd3e}', to: '\u{fd3f}', }, - Range { from: '\u{fd40}', to: '\u{fd4f}', }, - Range { from: '\u{fd50}', to: '\u{fd50}', }, - Range { from: '\u{fd51}', to: '\u{fd52}', }, - Range { from: '\u{fd53}', to: '\u{fd57}', }, - Range { from: '\u{fd58}', to: '\u{fd59}', }, - Range { from: '\u{fd5a}', to: '\u{fd5e}', }, - Range { from: '\u{fd5f}', to: '\u{fd60}', }, - Range { from: '\u{fd61}', to: '\u{fd61}', }, - Range { from: '\u{fd62}', to: '\u{fd63}', }, - Range { from: '\u{fd64}', to: '\u{fd65}', }, - Range { from: '\u{fd66}', to: '\u{fd66}', }, - Range { from: '\u{fd67}', to: '\u{fd68}', }, - Range { from: '\u{fd69}', to: '\u{fd69}', }, - Range { from: '\u{fd6a}', to: '\u{fd6b}', }, - Range { from: '\u{fd6c}', to: '\u{fd6d}', }, - Range { from: '\u{fd6e}', to: '\u{fd6e}', }, - Range { from: '\u{fd6f}', to: '\u{fd70}', }, - Range { from: '\u{fd71}', to: '\u{fd72}', }, - Range { from: '\u{fd73}', to: '\u{fd75}', }, - Range { from: '\u{fd76}', to: '\u{fd77}', }, - Range { from: '\u{fd78}', to: '\u{fd7b}', }, - Range { from: '\u{fd7c}', to: '\u{fd7d}', }, - Range { from: '\u{fd7e}', to: '\u{fd82}', }, - Range { from: '\u{fd83}', to: '\u{fd84}', }, - Range { from: '\u{fd85}', to: '\u{fd86}', }, - Range { from: '\u{fd87}', to: '\u{fd88}', }, - Range { from: '\u{fd89}', to: '\u{fd8f}', }, - Range { from: '\u{fd90}', to: '\u{fd91}', }, - Range { from: '\u{fd92}', to: '\u{fd96}', }, - Range { from: '\u{fd97}', to: '\u{fd98}', }, - Range { from: '\u{fd99}', to: '\u{fd9b}', }, - Range { from: '\u{fd9c}', to: '\u{fd9d}', }, - Range { from: '\u{fd9e}', to: '\u{fdc7}', }, - Range { from: '\u{fdc8}', to: '\u{fdef}', }, - Range { from: '\u{fdf0}', to: '\u{fdfd}', }, - Range { from: '\u{fdfe}', to: '\u{fdff}', }, - Range { from: '\u{fe00}', to: '\u{fe0f}', }, - Range { from: '\u{fe10}', to: '\u{fe18}', }, - Range { from: '\u{fe19}', to: '\u{fe1f}', }, - Range { from: '\u{fe20}', to: '\u{fe2f}', }, - Range { from: '\u{fe30}', to: '\u{fe32}', }, - Range { from: '\u{fe33}', to: '\u{fe34}', }, - Range { from: '\u{fe35}', to: '\u{fe44}', }, - Range { from: '\u{fe45}', to: '\u{fe46}', }, - Range { from: '\u{fe47}', to: '\u{fe48}', }, - Range { from: '\u{fe49}', to: '\u{fe4c}', }, - Range { from: '\u{fe4d}', to: '\u{fe4f}', }, - Range { from: '\u{fe50}', to: '\u{fe51}', }, - Range { from: '\u{fe52}', to: '\u{fe53}', }, - Range { from: '\u{fe54}', to: '\u{fe6b}', }, - Range { from: '\u{fe6c}', to: '\u{fe6f}', }, - Range { from: '\u{fe70}', to: '\u{fe80}', }, - Range { from: '\u{fe81}', to: '\u{fe82}', }, - Range { from: '\u{fe83}', to: '\u{fe84}', }, - Range { from: '\u{fe85}', to: '\u{fe86}', }, - Range { from: '\u{fe87}', to: '\u{fe88}', }, - Range { from: '\u{fe89}', to: '\u{fe8c}', }, - Range { from: '\u{fe8d}', to: '\u{fe8e}', }, - Range { from: '\u{fe8f}', to: '\u{fe92}', }, - Range { from: '\u{fe93}', to: '\u{fe94}', }, - Range { from: '\u{fe95}', to: '\u{fe98}', }, - Range { from: '\u{fe99}', to: '\u{fe9c}', }, - Range { from: '\u{fe9d}', to: '\u{fea0}', }, - Range { from: '\u{fea1}', to: '\u{fea4}', }, - Range { from: '\u{fea5}', to: '\u{fea8}', }, - Range { from: '\u{fea9}', to: '\u{feaa}', }, - Range { from: '\u{feab}', to: '\u{feac}', }, - Range { from: '\u{fead}', to: '\u{feae}', }, - Range { from: '\u{feaf}', to: '\u{feb0}', }, - Range { from: '\u{feb1}', to: '\u{feb4}', }, - Range { from: '\u{feb5}', to: '\u{feb8}', }, - Range { from: '\u{feb9}', to: '\u{febc}', }, - Range { from: '\u{febd}', to: '\u{fec0}', }, - Range { from: '\u{fec1}', to: '\u{fec4}', }, - Range { from: '\u{fec5}', to: '\u{fec8}', }, - Range { from: '\u{fec9}', to: '\u{fecc}', }, - Range { from: '\u{fecd}', to: '\u{fed0}', }, - Range { from: '\u{fed1}', to: '\u{fed4}', }, - Range { from: '\u{fed5}', to: '\u{fed8}', }, - Range { from: '\u{fed9}', to: '\u{fedc}', }, - Range { from: '\u{fedd}', to: '\u{fee0}', }, - Range { from: '\u{fee1}', to: '\u{fee4}', }, - Range { from: '\u{fee5}', to: '\u{fee8}', }, - Range { from: '\u{fee9}', to: '\u{feec}', }, - Range { from: '\u{feed}', to: '\u{feee}', }, - Range { from: '\u{feef}', to: '\u{fef0}', }, - Range { from: '\u{fef1}', to: '\u{fef4}', }, - Range { from: '\u{fef5}', to: '\u{fef6}', }, - Range { from: '\u{fef7}', to: '\u{fef8}', }, - Range { from: '\u{fef9}', to: '\u{fefa}', }, - Range { from: '\u{fefb}', to: '\u{fefc}', }, - Range { from: '\u{fefd}', to: '\u{fefe}', }, - Range { from: '\u{feff}', to: '\u{ffbe}', }, - Range { from: '\u{ffbf}', to: '\u{ffc1}', }, - Range { from: '\u{ffc2}', to: '\u{ffc7}', }, - Range { from: '\u{ffc8}', to: '\u{ffc9}', }, - Range { from: '\u{ffca}', to: '\u{ffcf}', }, - Range { from: '\u{ffd0}', to: '\u{ffd1}', }, - Range { from: '\u{ffd2}', to: '\u{ffd7}', }, - Range { from: '\u{ffd8}', to: '\u{ffd9}', }, - Range { from: '\u{ffda}', to: '\u{ffdc}', }, - Range { from: '\u{ffdd}', to: '\u{ffdf}', }, - Range { from: '\u{ffe0}', to: '\u{ffee}', }, - Range { from: '\u{ffef}', to: '\u{ffff}', }, - Range { from: '\u{10000}', to: '\u{1000b}', }, - Range { from: '\u{1000c}', to: '\u{1000c}', }, - Range { from: '\u{1000d}', to: '\u{10026}', }, - Range { from: '\u{10027}', to: '\u{10027}', }, - Range { from: '\u{10028}', to: '\u{1003a}', }, - Range { from: '\u{1003b}', to: '\u{1003b}', }, - Range { from: '\u{1003c}', to: '\u{1003d}', }, - Range { from: '\u{1003e}', to: '\u{1003e}', }, - Range { from: '\u{1003f}', to: '\u{1004d}', }, - Range { from: '\u{1004e}', to: '\u{1004f}', }, - Range { from: '\u{10050}', to: '\u{1005d}', }, - Range { from: '\u{1005e}', to: '\u{1007f}', }, - Range { from: '\u{10080}', to: '\u{100fa}', }, - Range { from: '\u{100fb}', to: '\u{100ff}', }, - Range { from: '\u{10100}', to: '\u{10102}', }, - Range { from: '\u{10103}', to: '\u{10106}', }, - Range { from: '\u{10107}', to: '\u{10133}', }, - Range { from: '\u{10134}', to: '\u{10136}', }, - Range { from: '\u{10137}', to: '\u{1018e}', }, - Range { from: '\u{1018f}', to: '\u{1018f}', }, - Range { from: '\u{10190}', to: '\u{1019b}', }, - Range { from: '\u{1019c}', to: '\u{1019f}', }, - Range { from: '\u{101a0}', to: '\u{101a0}', }, - Range { from: '\u{101a1}', to: '\u{101cf}', }, - Range { from: '\u{101d0}', to: '\u{101fd}', }, - Range { from: '\u{101fe}', to: '\u{1027f}', }, - Range { from: '\u{10280}', to: '\u{1029c}', }, - Range { from: '\u{1029d}', to: '\u{1029f}', }, - Range { from: '\u{102a0}', to: '\u{102d0}', }, - Range { from: '\u{102d1}', to: '\u{102df}', }, - Range { from: '\u{102e0}', to: '\u{102fb}', }, - Range { from: '\u{102fc}', to: '\u{102ff}', }, - Range { from: '\u{10300}', to: '\u{10323}', }, - Range { from: '\u{10324}', to: '\u{1032c}', }, - Range { from: '\u{1032d}', to: '\u{1034a}', }, - Range { from: '\u{1034b}', to: '\u{1034f}', }, - Range { from: '\u{10350}', to: '\u{1037a}', }, - Range { from: '\u{1037b}', to: '\u{1037f}', }, - Range { from: '\u{10380}', to: '\u{1039d}', }, - Range { from: '\u{1039e}', to: '\u{1039e}', }, - Range { from: '\u{1039f}', to: '\u{103c3}', }, - Range { from: '\u{103c4}', to: '\u{103c7}', }, - Range { from: '\u{103c8}', to: '\u{103d5}', }, - Range { from: '\u{103d6}', to: '\u{103ff}', }, - Range { from: '\u{10400}', to: '\u{10427}', }, - Range { from: '\u{10428}', to: '\u{1049d}', }, - Range { from: '\u{1049e}', to: '\u{1049f}', }, - Range { from: '\u{104a0}', to: '\u{104a9}', }, - Range { from: '\u{104aa}', to: '\u{104af}', }, - Range { from: '\u{104b0}', to: '\u{104d3}', }, - Range { from: '\u{104d4}', to: '\u{104d7}', }, - Range { from: '\u{104d8}', to: '\u{104fb}', }, - Range { from: '\u{104fc}', to: '\u{104ff}', }, - Range { from: '\u{10500}', to: '\u{10527}', }, - Range { from: '\u{10528}', to: '\u{1052f}', }, - Range { from: '\u{10530}', to: '\u{10563}', }, - Range { from: '\u{10564}', to: '\u{1056e}', }, - Range { from: '\u{1056f}', to: '\u{1056f}', }, - Range { from: '\u{10570}', to: '\u{105ff}', }, - Range { from: '\u{10600}', to: '\u{10736}', }, - Range { from: '\u{10737}', to: '\u{1073f}', }, - Range { from: '\u{10740}', to: '\u{10755}', }, - Range { from: '\u{10756}', to: '\u{1075f}', }, - Range { from: '\u{10760}', to: '\u{10767}', }, - Range { from: '\u{10768}', to: '\u{107ff}', }, - Range { from: '\u{10800}', to: '\u{10805}', }, - Range { from: '\u{10806}', to: '\u{10807}', }, - Range { from: '\u{10808}', to: '\u{10809}', }, - Range { from: '\u{1080a}', to: '\u{10835}', }, - Range { from: '\u{10836}', to: '\u{10836}', }, - Range { from: '\u{10837}', to: '\u{10838}', }, - Range { from: '\u{10839}', to: '\u{1083b}', }, - Range { from: '\u{1083c}', to: '\u{1083c}', }, - Range { from: '\u{1083d}', to: '\u{1083e}', }, - Range { from: '\u{1083f}', to: '\u{10855}', }, - Range { from: '\u{10856}', to: '\u{10856}', }, - Range { from: '\u{10857}', to: '\u{1089e}', }, - Range { from: '\u{1089f}', to: '\u{108a6}', }, - Range { from: '\u{108a7}', to: '\u{108af}', }, - Range { from: '\u{108b0}', to: '\u{108df}', }, - Range { from: '\u{108e0}', to: '\u{108f2}', }, - Range { from: '\u{108f3}', to: '\u{108f3}', }, - Range { from: '\u{108f4}', to: '\u{108f5}', }, - Range { from: '\u{108f6}', to: '\u{108fa}', }, - Range { from: '\u{108fb}', to: '\u{1091b}', }, - Range { from: '\u{1091c}', to: '\u{1091e}', }, - Range { from: '\u{1091f}', to: '\u{10939}', }, - Range { from: '\u{1093a}', to: '\u{1093e}', }, - Range { from: '\u{1093f}', to: '\u{1093f}', }, - Range { from: '\u{10940}', to: '\u{1097f}', }, - Range { from: '\u{10980}', to: '\u{109b7}', }, - Range { from: '\u{109b8}', to: '\u{109bb}', }, - Range { from: '\u{109bc}', to: '\u{109cf}', }, - Range { from: '\u{109d0}', to: '\u{109d1}', }, - Range { from: '\u{109d2}', to: '\u{10a03}', }, - Range { from: '\u{10a04}', to: '\u{10a04}', }, - Range { from: '\u{10a05}', to: '\u{10a06}', }, - Range { from: '\u{10a07}', to: '\u{10a0b}', }, - Range { from: '\u{10a0c}', to: '\u{10a13}', }, - Range { from: '\u{10a14}', to: '\u{10a14}', }, - Range { from: '\u{10a15}', to: '\u{10a17}', }, - Range { from: '\u{10a18}', to: '\u{10a18}', }, - Range { from: '\u{10a19}', to: '\u{10a33}', }, - Range { from: '\u{10a34}', to: '\u{10a37}', }, - Range { from: '\u{10a38}', to: '\u{10a3a}', }, - Range { from: '\u{10a3b}', to: '\u{10a3e}', }, - Range { from: '\u{10a3f}', to: '\u{10a47}', }, - Range { from: '\u{10a48}', to: '\u{10a4f}', }, - Range { from: '\u{10a50}', to: '\u{10a58}', }, - Range { from: '\u{10a59}', to: '\u{10a5f}', }, - Range { from: '\u{10a60}', to: '\u{10a9f}', }, - Range { from: '\u{10aa0}', to: '\u{10abf}', }, - Range { from: '\u{10ac0}', to: '\u{10ae6}', }, - Range { from: '\u{10ae7}', to: '\u{10aea}', }, - Range { from: '\u{10aeb}', to: '\u{10af6}', }, - Range { from: '\u{10af7}', to: '\u{10aff}', }, - Range { from: '\u{10b00}', to: '\u{10b35}', }, - Range { from: '\u{10b36}', to: '\u{10b38}', }, - Range { from: '\u{10b39}', to: '\u{10b55}', }, - Range { from: '\u{10b56}', to: '\u{10b57}', }, - Range { from: '\u{10b58}', to: '\u{10b72}', }, - Range { from: '\u{10b73}', to: '\u{10b77}', }, - Range { from: '\u{10b78}', to: '\u{10b91}', }, - Range { from: '\u{10b92}', to: '\u{10b98}', }, - Range { from: '\u{10b99}', to: '\u{10b9c}', }, - Range { from: '\u{10b9d}', to: '\u{10ba8}', }, - Range { from: '\u{10ba9}', to: '\u{10baf}', }, - Range { from: '\u{10bb0}', to: '\u{10bff}', }, - Range { from: '\u{10c00}', to: '\u{10c48}', }, - Range { from: '\u{10c49}', to: '\u{10c7f}', }, - Range { from: '\u{10c80}', to: '\u{10cb2}', }, - Range { from: '\u{10cb3}', to: '\u{10cbf}', }, - Range { from: '\u{10cc0}', to: '\u{10cf2}', }, - Range { from: '\u{10cf3}', to: '\u{10cf9}', }, - Range { from: '\u{10cfa}', to: '\u{10cff}', }, - Range { from: '\u{10d00}', to: '\u{10e5f}', }, - Range { from: '\u{10e60}', to: '\u{10e7e}', }, - Range { from: '\u{10e7f}', to: '\u{10fff}', }, - Range { from: '\u{11000}', to: '\u{1104d}', }, - Range { from: '\u{1104e}', to: '\u{11051}', }, - Range { from: '\u{11052}', to: '\u{1106f}', }, - Range { from: '\u{11070}', to: '\u{1107e}', }, - Range { from: '\u{1107f}', to: '\u{110bc}', }, - Range { from: '\u{110bd}', to: '\u{110bd}', }, - Range { from: '\u{110be}', to: '\u{110c1}', }, - Range { from: '\u{110c2}', to: '\u{110cf}', }, - Range { from: '\u{110d0}', to: '\u{110e8}', }, - Range { from: '\u{110e9}', to: '\u{110ef}', }, - Range { from: '\u{110f0}', to: '\u{110f9}', }, - Range { from: '\u{110fa}', to: '\u{110ff}', }, - Range { from: '\u{11100}', to: '\u{11134}', }, - Range { from: '\u{11135}', to: '\u{11135}', }, - Range { from: '\u{11136}', to: '\u{11143}', }, - Range { from: '\u{11144}', to: '\u{1114f}', }, - Range { from: '\u{11150}', to: '\u{11176}', }, - Range { from: '\u{11177}', to: '\u{1117f}', }, - Range { from: '\u{11180}', to: '\u{111cd}', }, - Range { from: '\u{111ce}', to: '\u{111cf}', }, - Range { from: '\u{111d0}', to: '\u{111df}', }, - Range { from: '\u{111e0}', to: '\u{111e0}', }, - Range { from: '\u{111e1}', to: '\u{111f4}', }, - Range { from: '\u{111f5}', to: '\u{111ff}', }, - Range { from: '\u{11200}', to: '\u{11211}', }, - Range { from: '\u{11212}', to: '\u{11212}', }, - Range { from: '\u{11213}', to: '\u{1123e}', }, - Range { from: '\u{1123f}', to: '\u{1127f}', }, - Range { from: '\u{11280}', to: '\u{11286}', }, - Range { from: '\u{11287}', to: '\u{11289}', }, - Range { from: '\u{1128a}', to: '\u{1128d}', }, - Range { from: '\u{1128e}', to: '\u{1128e}', }, - Range { from: '\u{1128f}', to: '\u{1129d}', }, - Range { from: '\u{1129e}', to: '\u{1129e}', }, - Range { from: '\u{1129f}', to: '\u{112a9}', }, - Range { from: '\u{112aa}', to: '\u{112af}', }, - Range { from: '\u{112b0}', to: '\u{112ea}', }, - Range { from: '\u{112eb}', to: '\u{112ef}', }, - Range { from: '\u{112f0}', to: '\u{112f9}', }, - Range { from: '\u{112fa}', to: '\u{112ff}', }, - Range { from: '\u{11300}', to: '\u{11303}', }, - Range { from: '\u{11304}', to: '\u{11304}', }, - Range { from: '\u{11305}', to: '\u{1130c}', }, - Range { from: '\u{1130d}', to: '\u{1130e}', }, - Range { from: '\u{1130f}', to: '\u{11310}', }, - Range { from: '\u{11311}', to: '\u{11312}', }, - Range { from: '\u{11313}', to: '\u{11328}', }, - Range { from: '\u{11329}', to: '\u{11329}', }, - Range { from: '\u{1132a}', to: '\u{11330}', }, - Range { from: '\u{11331}', to: '\u{11331}', }, - Range { from: '\u{11332}', to: '\u{11333}', }, - Range { from: '\u{11334}', to: '\u{11334}', }, - Range { from: '\u{11335}', to: '\u{11339}', }, - Range { from: '\u{1133a}', to: '\u{1133b}', }, - Range { from: '\u{1133c}', to: '\u{11344}', }, - Range { from: '\u{11345}', to: '\u{11346}', }, - Range { from: '\u{11347}', to: '\u{11348}', }, - Range { from: '\u{11349}', to: '\u{1134a}', }, - Range { from: '\u{1134b}', to: '\u{1134d}', }, - Range { from: '\u{1134e}', to: '\u{1134f}', }, - Range { from: '\u{11350}', to: '\u{11350}', }, - Range { from: '\u{11351}', to: '\u{11356}', }, - Range { from: '\u{11357}', to: '\u{11357}', }, - Range { from: '\u{11358}', to: '\u{1135c}', }, - Range { from: '\u{1135d}', to: '\u{11363}', }, - Range { from: '\u{11364}', to: '\u{11365}', }, - Range { from: '\u{11366}', to: '\u{1136c}', }, - Range { from: '\u{1136d}', to: '\u{1136f}', }, - Range { from: '\u{11370}', to: '\u{11374}', }, - Range { from: '\u{11375}', to: '\u{113ff}', }, - Range { from: '\u{11400}', to: '\u{11459}', }, - Range { from: '\u{1145a}', to: '\u{1145d}', }, - Range { from: '\u{1145e}', to: '\u{1147f}', }, - Range { from: '\u{11480}', to: '\u{114c7}', }, - Range { from: '\u{114c8}', to: '\u{114cf}', }, - Range { from: '\u{114d0}', to: '\u{114d9}', }, - Range { from: '\u{114da}', to: '\u{1157f}', }, - Range { from: '\u{11580}', to: '\u{115b5}', }, - Range { from: '\u{115b6}', to: '\u{115b7}', }, - Range { from: '\u{115b8}', to: '\u{115dd}', }, - Range { from: '\u{115de}', to: '\u{115ff}', }, - Range { from: '\u{11600}', to: '\u{11644}', }, - Range { from: '\u{11645}', to: '\u{1164f}', }, - Range { from: '\u{11650}', to: '\u{11659}', }, - Range { from: '\u{1165a}', to: '\u{1165f}', }, - Range { from: '\u{11660}', to: '\u{1166c}', }, - Range { from: '\u{1166d}', to: '\u{1167f}', }, - Range { from: '\u{11680}', to: '\u{116b7}', }, - Range { from: '\u{116b8}', to: '\u{116bf}', }, - Range { from: '\u{116c0}', to: '\u{116c9}', }, - Range { from: '\u{116ca}', to: '\u{116ff}', }, - Range { from: '\u{11700}', to: '\u{11719}', }, - Range { from: '\u{1171a}', to: '\u{1171c}', }, - Range { from: '\u{1171d}', to: '\u{1172b}', }, - Range { from: '\u{1172c}', to: '\u{1172f}', }, - Range { from: '\u{11730}', to: '\u{1173f}', }, - Range { from: '\u{11740}', to: '\u{1189f}', }, - Range { from: '\u{118a0}', to: '\u{118bf}', }, - Range { from: '\u{118c0}', to: '\u{118f2}', }, - Range { from: '\u{118f3}', to: '\u{118fe}', }, - Range { from: '\u{118ff}', to: '\u{118ff}', }, - Range { from: '\u{11900}', to: '\u{119ff}', }, - Range { from: '\u{11a00}', to: '\u{11a47}', }, - Range { from: '\u{11a48}', to: '\u{11a4f}', }, - Range { from: '\u{11a50}', to: '\u{11a83}', }, - Range { from: '\u{11a84}', to: '\u{11a85}', }, - Range { from: '\u{11a86}', to: '\u{11a9c}', }, - Range { from: '\u{11a9d}', to: '\u{11a9d}', }, - Range { from: '\u{11a9e}', to: '\u{11aa2}', }, - Range { from: '\u{11aa3}', to: '\u{11abf}', }, - Range { from: '\u{11ac0}', to: '\u{11af8}', }, - Range { from: '\u{11af9}', to: '\u{11bff}', }, - Range { from: '\u{11c00}', to: '\u{11c08}', }, - Range { from: '\u{11c09}', to: '\u{11c09}', }, - Range { from: '\u{11c0a}', to: '\u{11c36}', }, - Range { from: '\u{11c37}', to: '\u{11c37}', }, - Range { from: '\u{11c38}', to: '\u{11c45}', }, - Range { from: '\u{11c46}', to: '\u{11c4f}', }, - Range { from: '\u{11c50}', to: '\u{11c6c}', }, - Range { from: '\u{11c6d}', to: '\u{11c6f}', }, - Range { from: '\u{11c70}', to: '\u{11c8f}', }, - Range { from: '\u{11c90}', to: '\u{11c91}', }, - Range { from: '\u{11c92}', to: '\u{11ca7}', }, - Range { from: '\u{11ca8}', to: '\u{11ca8}', }, - Range { from: '\u{11ca9}', to: '\u{11cb6}', }, - Range { from: '\u{11cb7}', to: '\u{11cff}', }, - Range { from: '\u{11d00}', to: '\u{11d06}', }, - Range { from: '\u{11d07}', to: '\u{11d07}', }, - Range { from: '\u{11d08}', to: '\u{11d09}', }, - Range { from: '\u{11d0a}', to: '\u{11d0a}', }, - Range { from: '\u{11d0b}', to: '\u{11d36}', }, - Range { from: '\u{11d37}', to: '\u{11d39}', }, - Range { from: '\u{11d3a}', to: '\u{11d3b}', }, - Range { from: '\u{11d3c}', to: '\u{11d3d}', }, - Range { from: '\u{11d3e}', to: '\u{11d3e}', }, - Range { from: '\u{11d3f}', to: '\u{11d47}', }, - Range { from: '\u{11d48}', to: '\u{11d4f}', }, - Range { from: '\u{11d50}', to: '\u{11d59}', }, - Range { from: '\u{11d5a}', to: '\u{11fff}', }, - Range { from: '\u{12000}', to: '\u{12399}', }, - Range { from: '\u{1239a}', to: '\u{123ff}', }, - Range { from: '\u{12400}', to: '\u{1246e}', }, - Range { from: '\u{1246f}', to: '\u{1246f}', }, - Range { from: '\u{12470}', to: '\u{12474}', }, - Range { from: '\u{12475}', to: '\u{1247f}', }, - Range { from: '\u{12480}', to: '\u{12543}', }, - Range { from: '\u{12544}', to: '\u{12fff}', }, - Range { from: '\u{13000}', to: '\u{1342e}', }, - Range { from: '\u{1342f}', to: '\u{143ff}', }, - Range { from: '\u{14400}', to: '\u{14646}', }, - Range { from: '\u{14647}', to: '\u{167ff}', }, - Range { from: '\u{16800}', to: '\u{16a38}', }, - Range { from: '\u{16a39}', to: '\u{16a3f}', }, - Range { from: '\u{16a40}', to: '\u{16a5e}', }, - Range { from: '\u{16a5f}', to: '\u{16a5f}', }, - Range { from: '\u{16a60}', to: '\u{16a69}', }, - Range { from: '\u{16a6a}', to: '\u{16a6d}', }, - Range { from: '\u{16a6e}', to: '\u{16a6f}', }, - Range { from: '\u{16a70}', to: '\u{16acf}', }, - Range { from: '\u{16ad0}', to: '\u{16aed}', }, - Range { from: '\u{16aee}', to: '\u{16aef}', }, - Range { from: '\u{16af0}', to: '\u{16af5}', }, - Range { from: '\u{16af6}', to: '\u{16aff}', }, - Range { from: '\u{16b00}', to: '\u{16b45}', }, - Range { from: '\u{16b46}', to: '\u{16b4f}', }, - Range { from: '\u{16b50}', to: '\u{16b59}', }, - Range { from: '\u{16b5a}', to: '\u{16b5a}', }, - Range { from: '\u{16b5b}', to: '\u{16b61}', }, - Range { from: '\u{16b62}', to: '\u{16b62}', }, - Range { from: '\u{16b63}', to: '\u{16b77}', }, - Range { from: '\u{16b78}', to: '\u{16b7c}', }, - Range { from: '\u{16b7d}', to: '\u{16b8f}', }, - Range { from: '\u{16b90}', to: '\u{16eff}', }, - Range { from: '\u{16f00}', to: '\u{16f44}', }, - Range { from: '\u{16f45}', to: '\u{16f4f}', }, - Range { from: '\u{16f50}', to: '\u{16f7e}', }, - Range { from: '\u{16f7f}', to: '\u{16f8e}', }, - Range { from: '\u{16f8f}', to: '\u{16f9f}', }, - Range { from: '\u{16fa0}', to: '\u{16fdf}', }, - Range { from: '\u{16fe0}', to: '\u{16fe1}', }, - Range { from: '\u{16fe2}', to: '\u{16fff}', }, - Range { from: '\u{17000}', to: '\u{187ec}', }, - Range { from: '\u{187ed}', to: '\u{187ff}', }, - Range { from: '\u{18800}', to: '\u{18af2}', }, - Range { from: '\u{18af3}', to: '\u{1afff}', }, - Range { from: '\u{1b000}', to: '\u{1b11e}', }, - Range { from: '\u{1b11f}', to: '\u{1b16f}', }, - Range { from: '\u{1b170}', to: '\u{1b2fb}', }, - Range { from: '\u{1b2fc}', to: '\u{1bbff}', }, - Range { from: '\u{1bc00}', to: '\u{1bc6a}', }, - Range { from: '\u{1bc6b}', to: '\u{1bc6f}', }, - Range { from: '\u{1bc70}', to: '\u{1bc7c}', }, - Range { from: '\u{1bc7d}', to: '\u{1bc7f}', }, - Range { from: '\u{1bc80}', to: '\u{1bc88}', }, - Range { from: '\u{1bc89}', to: '\u{1bc8f}', }, - Range { from: '\u{1bc90}', to: '\u{1bc99}', }, - Range { from: '\u{1bc9a}', to: '\u{1bc9b}', }, - Range { from: '\u{1bc9c}', to: '\u{1bc9f}', }, - Range { from: '\u{1bca0}', to: '\u{1bca3}', }, - Range { from: '\u{1bca4}', to: '\u{1cfff}', }, - Range { from: '\u{1d000}', to: '\u{1d0f5}', }, - Range { from: '\u{1d0f6}', to: '\u{1d0ff}', }, - Range { from: '\u{1d100}', to: '\u{1d126}', }, - Range { from: '\u{1d127}', to: '\u{1d128}', }, - Range { from: '\u{1d129}', to: '\u{1d15d}', }, - Range { from: '\u{1d15e}', to: '\u{1d164}', }, - Range { from: '\u{1d165}', to: '\u{1d172}', }, - Range { from: '\u{1d173}', to: '\u{1d17a}', }, - Range { from: '\u{1d17b}', to: '\u{1d1ba}', }, - Range { from: '\u{1d1bb}', to: '\u{1d1c0}', }, - Range { from: '\u{1d1c1}', to: '\u{1d1e8}', }, - Range { from: '\u{1d1e9}', to: '\u{1d1ff}', }, - Range { from: '\u{1d200}', to: '\u{1d245}', }, - Range { from: '\u{1d246}', to: '\u{1d2ff}', }, - Range { from: '\u{1d300}', to: '\u{1d356}', }, - Range { from: '\u{1d357}', to: '\u{1d35f}', }, - Range { from: '\u{1d360}', to: '\u{1d371}', }, - Range { from: '\u{1d372}', to: '\u{1d3ff}', }, - Range { from: '\u{1d400}', to: '\u{1d49f}', }, - Range { from: '\u{1d4a0}', to: '\u{1d4a1}', }, - Range { from: '\u{1d4a2}', to: '\u{1d4a2}', }, - Range { from: '\u{1d4a3}', to: '\u{1d4a4}', }, - Range { from: '\u{1d4a5}', to: '\u{1d4a6}', }, - Range { from: '\u{1d4a7}', to: '\u{1d4a8}', }, - Range { from: '\u{1d4a9}', to: '\u{1d50a}', }, - Range { from: '\u{1d50b}', to: '\u{1d50c}', }, - Range { from: '\u{1d50d}', to: '\u{1d546}', }, - Range { from: '\u{1d547}', to: '\u{1d549}', }, - Range { from: '\u{1d54a}', to: '\u{1d6a5}', }, - Range { from: '\u{1d6a6}', to: '\u{1d6a7}', }, - Range { from: '\u{1d6a8}', to: '\u{1d6d2}', }, - Range { from: '\u{1d6d3}', to: '\u{1d6d4}', }, - Range { from: '\u{1d6d5}', to: '\u{1d70c}', }, - Range { from: '\u{1d70d}', to: '\u{1d70e}', }, - Range { from: '\u{1d70f}', to: '\u{1d746}', }, - Range { from: '\u{1d747}', to: '\u{1d748}', }, - Range { from: '\u{1d749}', to: '\u{1d780}', }, - Range { from: '\u{1d781}', to: '\u{1d782}', }, - Range { from: '\u{1d783}', to: '\u{1d7ba}', }, - Range { from: '\u{1d7bb}', to: '\u{1d7bc}', }, - Range { from: '\u{1d7bd}', to: '\u{1d7c9}', }, - Range { from: '\u{1d7ca}', to: '\u{1d7cb}', }, - Range { from: '\u{1d7cc}', to: '\u{1d7cd}', }, - Range { from: '\u{1d7ce}', to: '\u{1d7ff}', }, - Range { from: '\u{1d800}', to: '\u{1da8b}', }, - Range { from: '\u{1da8c}', to: '\u{1da9a}', }, - Range { from: '\u{1da9b}', to: '\u{1da9f}', }, - Range { from: '\u{1daa0}', to: '\u{1daa0}', }, - Range { from: '\u{1daa1}', to: '\u{1daaf}', }, - Range { from: '\u{1dab0}', to: '\u{1dfff}', }, - Range { from: '\u{1e000}', to: '\u{1e006}', }, - Range { from: '\u{1e007}', to: '\u{1e007}', }, - Range { from: '\u{1e008}', to: '\u{1e018}', }, - Range { from: '\u{1e019}', to: '\u{1e01a}', }, - Range { from: '\u{1e01b}', to: '\u{1e021}', }, - Range { from: '\u{1e022}', to: '\u{1e022}', }, - Range { from: '\u{1e023}', to: '\u{1e024}', }, - Range { from: '\u{1e025}', to: '\u{1e025}', }, - Range { from: '\u{1e026}', to: '\u{1e02a}', }, - Range { from: '\u{1e02b}', to: '\u{1e7ff}', }, - Range { from: '\u{1e800}', to: '\u{1e8c4}', }, - Range { from: '\u{1e8c5}', to: '\u{1e8c6}', }, - Range { from: '\u{1e8c7}', to: '\u{1e8d6}', }, - Range { from: '\u{1e8d7}', to: '\u{1e8ff}', }, - Range { from: '\u{1e900}', to: '\u{1e921}', }, - Range { from: '\u{1e922}', to: '\u{1e94a}', }, - Range { from: '\u{1e94b}', to: '\u{1e94f}', }, - Range { from: '\u{1e950}', to: '\u{1e959}', }, - Range { from: '\u{1e95a}', to: '\u{1e95d}', }, - Range { from: '\u{1e95e}', to: '\u{1e95f}', }, - Range { from: '\u{1e960}', to: '\u{1edff}', }, - Range { from: '\u{1ee00}', to: '\u{1ee24}', }, - Range { from: '\u{1ee25}', to: '\u{1ee26}', }, - Range { from: '\u{1ee27}', to: '\u{1ee3b}', }, - Range { from: '\u{1ee3c}', to: '\u{1ee41}', }, - Range { from: '\u{1ee42}', to: '\u{1ee42}', }, - Range { from: '\u{1ee43}', to: '\u{1ee46}', }, - Range { from: '\u{1ee47}', to: '\u{1ee54}', }, - Range { from: '\u{1ee55}', to: '\u{1ee56}', }, - Range { from: '\u{1ee57}', to: '\u{1ee64}', }, - Range { from: '\u{1ee65}', to: '\u{1ee66}', }, - Range { from: '\u{1ee67}', to: '\u{1ee9b}', }, - Range { from: '\u{1ee9c}', to: '\u{1eea0}', }, - Range { from: '\u{1eea1}', to: '\u{1eebb}', }, - Range { from: '\u{1eebc}', to: '\u{1eeef}', }, - Range { from: '\u{1eef0}', to: '\u{1eef1}', }, - Range { from: '\u{1eef2}', to: '\u{1efff}', }, - Range { from: '\u{1f000}', to: '\u{1f02b}', }, - Range { from: '\u{1f02c}', to: '\u{1f02f}', }, - Range { from: '\u{1f030}', to: '\u{1f093}', }, - Range { from: '\u{1f094}', to: '\u{1f09f}', }, - Range { from: '\u{1f0a0}', to: '\u{1f0ae}', }, - Range { from: '\u{1f0af}', to: '\u{1f0b0}', }, - Range { from: '\u{1f0b1}', to: '\u{1f0bf}', }, - Range { from: '\u{1f0c0}', to: '\u{1f0c0}', }, - Range { from: '\u{1f0c1}', to: '\u{1f0cf}', }, - Range { from: '\u{1f0d0}', to: '\u{1f0d0}', }, - Range { from: '\u{1f0d1}', to: '\u{1f0f5}', }, - Range { from: '\u{1f0f6}', to: '\u{1f100}', }, - Range { from: '\u{1f101}', to: '\u{1f10a}', }, - Range { from: '\u{1f10b}', to: '\u{1f10c}', }, - Range { from: '\u{1f10d}', to: '\u{1f10f}', }, - Range { from: '\u{1f110}', to: '\u{1f14f}', }, - Range { from: '\u{1f150}', to: '\u{1f169}', }, - Range { from: '\u{1f16a}', to: '\u{1f16b}', }, - Range { from: '\u{1f16c}', to: '\u{1f16f}', }, - Range { from: '\u{1f170}', to: '\u{1f18f}', }, - Range { from: '\u{1f190}', to: '\u{1f190}', }, - Range { from: '\u{1f191}', to: '\u{1f1ac}', }, - Range { from: '\u{1f1ad}', to: '\u{1f1e5}', }, - Range { from: '\u{1f1e6}', to: '\u{1f1ff}', }, - Range { from: '\u{1f200}', to: '\u{1f202}', }, - Range { from: '\u{1f203}', to: '\u{1f20f}', }, - Range { from: '\u{1f210}', to: '\u{1f23b}', }, - Range { from: '\u{1f23c}', to: '\u{1f23f}', }, - Range { from: '\u{1f240}', to: '\u{1f248}', }, - Range { from: '\u{1f249}', to: '\u{1f24f}', }, - Range { from: '\u{1f250}', to: '\u{1f251}', }, - Range { from: '\u{1f252}', to: '\u{1f25f}', }, - Range { from: '\u{1f260}', to: '\u{1f265}', }, - Range { from: '\u{1f266}', to: '\u{1f2ff}', }, - Range { from: '\u{1f300}', to: '\u{1f6d4}', }, - Range { from: '\u{1f6d5}', to: '\u{1f6df}', }, - Range { from: '\u{1f6e0}', to: '\u{1f6ec}', }, - Range { from: '\u{1f6ed}', to: '\u{1f6ef}', }, - Range { from: '\u{1f6f0}', to: '\u{1f6f8}', }, - Range { from: '\u{1f6f9}', to: '\u{1f6ff}', }, - Range { from: '\u{1f700}', to: '\u{1f773}', }, - Range { from: '\u{1f774}', to: '\u{1f77f}', }, - Range { from: '\u{1f780}', to: '\u{1f7d4}', }, - Range { from: '\u{1f7d5}', to: '\u{1f7ff}', }, - Range { from: '\u{1f800}', to: '\u{1f80b}', }, - Range { from: '\u{1f80c}', to: '\u{1f80f}', }, - Range { from: '\u{1f810}', to: '\u{1f847}', }, - Range { from: '\u{1f848}', to: '\u{1f84f}', }, - Range { from: '\u{1f850}', to: '\u{1f859}', }, - Range { from: '\u{1f85a}', to: '\u{1f85f}', }, - Range { from: '\u{1f860}', to: '\u{1f887}', }, - Range { from: '\u{1f888}', to: '\u{1f88f}', }, - Range { from: '\u{1f890}', to: '\u{1f8ad}', }, - Range { from: '\u{1f8ae}', to: '\u{1f8ff}', }, - Range { from: '\u{1f900}', to: '\u{1f90b}', }, - Range { from: '\u{1f90c}', to: '\u{1f90f}', }, - Range { from: '\u{1f910}', to: '\u{1f93e}', }, - Range { from: '\u{1f93f}', to: '\u{1f93f}', }, - Range { from: '\u{1f940}', to: '\u{1f94c}', }, - Range { from: '\u{1f94d}', to: '\u{1f94f}', }, - Range { from: '\u{1f950}', to: '\u{1f96b}', }, - Range { from: '\u{1f96c}', to: '\u{1f97f}', }, - Range { from: '\u{1f980}', to: '\u{1f997}', }, - Range { from: '\u{1f998}', to: '\u{1f9bf}', }, - Range { from: '\u{1f9c0}', to: '\u{1f9c0}', }, - Range { from: '\u{1f9c1}', to: '\u{1f9cf}', }, - Range { from: '\u{1f9d0}', to: '\u{1f9e6}', }, - Range { from: '\u{1f9e7}', to: '\u{1ffff}', }, - Range { from: '\u{20000}', to: '\u{2a6d6}', }, - Range { from: '\u{2a6d7}', to: '\u{2a6ff}', }, - Range { from: '\u{2a700}', to: '\u{2b734}', }, - Range { from: '\u{2b735}', to: '\u{2b73f}', }, - Range { from: '\u{2b740}', to: '\u{2b81d}', }, - Range { from: '\u{2b81e}', to: '\u{2b81f}', }, - Range { from: '\u{2b820}', to: '\u{2cea1}', }, - Range { from: '\u{2cea2}', to: '\u{2ceaf}', }, - Range { from: '\u{2ceb0}', to: '\u{2ebe0}', }, - Range { from: '\u{2ebe1}', to: '\u{2f7ff}', }, - Range { from: '\u{2f800}', to: '\u{2f830}', }, - Range { from: '\u{2f831}', to: '\u{2f833}', }, - Range { from: '\u{2f834}', to: '\u{2f844}', }, - Range { from: '\u{2f845}', to: '\u{2f846}', }, - Range { from: '\u{2f847}', to: '\u{2f869}', }, - Range { from: '\u{2f86a}', to: '\u{2f86b}', }, - Range { from: '\u{2f86c}', to: '\u{2f890}', }, - Range { from: '\u{2f891}', to: '\u{2f892}', }, - Range { from: '\u{2f893}', to: '\u{2f893}', }, - Range { from: '\u{2f894}', to: '\u{2f895}', }, - Range { from: '\u{2f896}', to: '\u{2f92b}', }, - Range { from: '\u{2f92c}', to: '\u{2f92d}', }, - Range { from: '\u{2f92e}', to: '\u{2f945}', }, - Range { from: '\u{2f946}', to: '\u{2f947}', }, - Range { from: '\u{2f948}', to: '\u{2f95c}', }, - Range { from: '\u{2f95d}', to: '\u{2f95e}', }, - Range { from: '\u{2f95f}', to: '\u{2f9fd}', }, - Range { from: '\u{2f9fe}', to: '\u{2f9ff}', }, - Range { from: '\u{2fa00}', to: '\u{2fa1d}', }, - Range { from: '\u{2fa1e}', to: '\u{e00ff}', }, - Range { from: '\u{e0100}', to: '\u{e01ef}', }, - Range { from: '\u{e01f0}', to: '\u{10ffff}', }, -]; - -static INDEX_TABLE: &'static [u16] = &[ - 32768, - 32769, - 32770, - 32771, - 32772, - 5, - 32799, - 32800, - 32801, - 32802, - 32803, - 32804, - 37, - 32808, - 41, - 32812, - 45, - 32817, - 50, - 32858, - 91, - 32909, - 142, - 32913, - 146, - 32920, - 153, - 32996, - 229, - 33008, - 241, - 33023, - 256, - 33037, - 33038, - 33039, - 33040, - 33041, - 33042, - 275, - 33058, - 291, - 33076, - 33077, - 310, - 33141, - 374, - 33147, - 380, - 33162, - 395, - 33172, - 405, - 33179, - 412, - 33185, - 418, - 33192, - 33193, - 33194, - 427, - 33203, - 33204, - 33205, - 438, - 33208, - 441, - 33249, - 33250, - 33251, - 484, - 33296, - 529, - 33348, - 581, - 33382, - 615, - 33451, - 684, - 33587, - 33588, - 33589, - 33590, - 823, - 33593, - 33594, - 33595, - 33596, - 33597, - 33598, - 33599, - 33600, - 33601, - 33602, - 33603, - 33604, - 33605, - 838, - 33610, - 33611, - 33612, - 33613, - 33614, - 33615, - 33616, - 33617, - 33618, - 33619, - 33620, - 33621, - 33622, - 33623, - 33624, - 33625, - 858, - 33628, - 33629, - 33630, - 33631, - 33632, - 33633, - 33634, - 33635, - 33636, - 869, - 33645, - 33646, - 33647, - 33648, - 33649, - 33650, - 33651, - 33652, - 33653, - 886, - 33656, - 33657, - 33658, - 33659, - 33660, - 33661, - 33662, - 33663, - 33664, - 33665, - 33666, - 899, - 33671, - 33672, - 33673, - 33674, - 33675, - 33676, - 33677, - 33678, - 33679, - 33680, - 33681, - 33682, - 33683, - 916, - 33691, - 33692, - 925, - 33695, - 33696, - 33697, - 33698, - 33699, - 33700, - 33701, - 33702, - 935, - 33709, - 33710, - 33711, - 33712, - 33713, - 33714, - 33715, - 33716, - 33717, - 33718, - 33719, - 33720, - 33721, - 33722, - 33723, - 33724, - 33725, - 33726, - 33727, - 33728, - 33729, - 33730, - 33731, - 33732, - 33733, - 33734, - 33735, - 33736, - 33737, - 33738, - 33739, - 33740, - 33741, - 33742, - 33743, - 33744, - 33745, - 33746, - 33747, - 33748, - 33749, - 33750, - 33751, - 33752, - 33753, - 33754, - 33755, - 33756, - 33757, - 33758, - 33759, - 33760, - 33761, - 994, - 33765, - 33766, - 33767, - 33768, - 33769, - 33770, - 33771, - 33772, - 33773, - 33774, - 33775, - 33776, - 33777, - 1010, - 33781, - 33782, - 33783, - 33784, - 33785, - 33786, - 33787, - 33788, - 33789, - 33790, - 33791, - 33792, - 33793, - 33794, - 33795, - 33796, - 33797, - 33798, - 33799, - 33800, - 33801, - 33802, - 33803, - 33804, - 33805, - 33806, - 33807, - 33808, - 33809, - 33810, - 33811, - 33812, - 33813, - 33814, - 33815, - 33816, - 33817, - 33818, - 33819, - 33820, - 33821, - 33822, - 33823, - 33824, - 33825, - 33826, - 33827, - 33828, - 33829, - 33830, - 33831, - 33832, - 33833, - 33834, - 33835, - 33836, - 33837, - 33838, - 33839, - 33840, - 33841, - 33842, - 33843, - 33844, - 1077, - 33847, - 33848, - 33849, - 33850, - 33851, - 33852, - 33853, - 33854, - 33855, - 33856, - 33857, - 33858, - 33859, - 33860, - 33861, - 33862, - 33863, - 33864, - 33865, - 33866, - 33867, - 33868, - 33869, - 33870, - 33871, - 33872, - 33873, - 33874, - 33875, - 1108, - 33878, - 33879, - 33880, - 33881, - 33882, - 33883, - 1116, - 33887, - 33888, - 33889, - 33890, - 33891, - 33892, - 33893, - 33894, - 33895, - 33896, - 33897, - 33898, - 33899, - 1132, - 33902, - 33903, - 1136, - 33906, - 33907, - 33908, - 33909, - 33910, - 33911, - 33912, - 33913, - 1146, - 33918, - 33919, - 33920, - 33921, - 33922, - 33923, - 33924, - 33925, - 33926, - 33927, - 1160, - 33931, - 33932, - 33933, - 33934, - 1167, - 33937, - 33938, - 33939, - 33940, - 33941, - 33942, - 33943, - 33944, - 33945, - 33946, - 33947, - 33948, - 33949, - 33950, - 33951, - 33952, - 33953, - 33954, - 33955, - 33956, - 33957, - 1190, - 33965, - 33966, - 33967, - 33968, - 33969, - 33970, - 33971, - 33972, - 33973, - 33974, - 33975, - 33976, - 33977, - 33978, - 33979, - 33980, - 33981, - 33982, - 33983, - 33984, - 33985, - 33986, - 33987, - 33988, - 33989, - 33990, - 33991, - 33992, - 33993, - 33994, - 33995, - 33996, - 33997, - 33998, - 33999, - 34000, - 34001, - 1234, - 34005, - 34006, - 34007, - 34008, - 34009, - 34010, - 34011, - 34012, - 34013, - 34014, - 34015, - 1248, - 34019, - 34020, - 34021, - 34022, - 34023, - 34024, - 34025, - 34026, - 34027, - 34028, - 34029, - 34030, - 34031, - 34032, - 34033, - 34034, - 1267, - 34041, - 34042, - 34043, - 34044, - 34045, - 34046, - 34047, - 34048, - 34049, - 34050, - 34051, - 34052, - 34053, - 34054, - 34055, - 34056, - 34057, - 34058, - 34059, - 34060, - 34061, - 34062, - 34063, - 34064, - 34065, - 34066, - 34067, - 34068, - 34069, - 34070, - 34071, - 34072, - 34073, - 34074, - 34075, - 34076, - 34077, - 34078, - 34079, - 34080, - 34081, - 34082, - 34083, - 34084, - 34085, - 34086, - 34087, - 34088, - 34089, - 34090, - 34091, - 34092, - 34093, - 34094, - 34095, - 34096, - 34097, - 34098, - 34099, - 34100, - 34101, - 34102, - 34103, - 34104, - 34105, - 34106, - 34107, - 34108, - 34109, - 34110, - 34111, - 34112, - 34113, - 34114, - 34115, - 34116, - 34117, - 34118, - 34119, - 34120, - 34121, - 34122, - 34123, - 34124, - 34125, - 1358, - 34130, - 1363, - 34134, - 34135, - 34136, - 34137, - 34138, - 34139, - 1372, - 34203, - 34204, - 34205, - 1438, - 34243, - 34244, - 34245, - 1478, - 34395, - 1628, - 34398, - 1631, - 34496, - 1729, - 34505, - 34506, - 1739, - 34513, - 34514, - 1747, - 34523, - 1756, - 34532, - 34533, - 1766, - 34540, - 34541, - 1774, - 34550, - 1783, - 34573, - 1806, - 34622, - 1855, - 34653, - 34654, - 34655, - 34656, - 1889, - 34665, - 34666, - 34667, - 1900, - 34676, - 1909, - 34691, - 34692, - 34693, - 34694, - 1927, - 34697, - 34698, - 34699, - 34700, - 34701, - 34702, - 34703, - 34704, - 1937, - 34710, - 1943, - 34714, - 1947, - 34718, - 34719, - 34720, - 1953, - 34723, - 34724, - 34725, - 1958, - 34728, - 1961, - 34770, - 34771, - 34772, - 34773, - 34774, - 34775, - 34776, - 2009, - 34788, - 34789, - 34790, - 34791, - 2024, - 34795, - 2028, - 34798, - 34799, - 2032, - 34815, - 2048, - 34828, - 2061, - 34831, - 34832, - 2065, - 34836, - 2069, - 34885, - 34886, - 34887, - 34888, - 34889, - 34890, - 34891, - 2124, - 34897, - 34898, - 34899, - 34900, - 34901, - 2134, - 34904, - 34905, - 34906, - 34907, - 2140, - 34948, - 2181, - 35028, - 35029, - 35030, - 2263, - 35034, - 35035, - 35036, - 35037, - 35038, - 35039, - 35040, - 35041, - 35042, - 35043, - 35044, - 35045, - 35046, - 35047, - 2280, - 35096, - 2329, - 35103, - 2336, - 35116, - 35117, - 35118, - 2351, - 35222, - 2455, - 35226, - 2459, - 35229, - 35230, - 2463, - 35233, - 35234, - 35235, - 35236, - 35237, - 2470, - 35240, - 35241, - 35242, - 35243, - 35244, - 35245, - 35246, - 35247, - 35248, - 35249, - 35250, - 35251, - 35252, - 35253, - 35254, - 35255, - 35256, - 35257, - 35258, - 35259, - 35260, - 35261, - 35262, - 35263, - 35264, - 35265, - 35266, - 35267, - 2500, - 35482, - 2715, - 35486, - 2719, - 35492, - 35493, - 35494, - 35495, - 35496, - 2729, - 35499, - 35500, - 35501, - 35502, - 35503, - 35504, - 35505, - 2738, - 35601, - 2834, - 35616, - 35617, - 35618, - 35619, - 35620, - 2853, - 35693, - 2926, - 36126, - 36127, - 36128, - 36129, - 36130, - 36131, - 36132, - 36133, - 36134, - 36135, - 3368, - 36181, - 3414, - 36212, - 36213, - 36214, - 3447, - 36228, - 3461, - 36292, - 3525, - 36307, - 3540, - 36311, - 3544, - 36315, - 3548, - 36350, - 3583, - 36354, - 36355, - 36356, - 36357, - 36358, - 36359, - 36360, - 36361, - 36362, - 36363, - 36364, - 36365, - 36366, - 36367, - 36368, - 36369, - 36370, - 36371, - 36372, - 36373, - 36374, - 36375, - 36376, - 36377, - 36378, - 36379, - 36380, - 36381, - 36382, - 36383, - 36384, - 36385, - 36386, - 36387, - 36388, - 36389, - 36390, - 36391, - 36392, - 36393, - 36394, - 36395, - 36396, - 3629, - 36401, - 36402, - 3635, - 36483, - 36484, - 36485, - 36486, - 36487, - 36488, - 36489, - 36490, - 36491, - 36492, - 3725, - 36500, - 3733, - 36762, - 3995, - 36766, - 3999, - 36781, - 4014, - 36784, - 4017, - 36836, - 4069, - 36852, - 4085, - 36959, - 4192, - 36965, - 36966, - 4199, - 36972, - 4205, - 37024, - 37025, - 37026, - 37027, - 37028, - 37029, - 37030, - 37031, - 37032, - 37033, - 37034, - 37035, - 37036, - 37037, - 37038, - 37039, - 37040, - 37041, - 37042, - 37043, - 37044, - 37045, - 37046, - 37047, - 37048, - 37049, - 37050, - 37051, - 37052, - 37053, - 37054, - 37055, - 37056, - 37057, - 37058, - 37059, - 37060, - 37061, - 37062, - 37063, - 37064, - 37065, - 37066, - 37067, - 37068, - 37069, - 37070, - 37071, - 37072, - 37073, - 37074, - 4307, - 37391, - 37392, - 37393, - 37394, - 37395, - 4628, - 37401, - 4634, - 37407, - 37408, - 37409, - 37410, - 37411, - 37412, - 37413, - 37414, - 37415, - 37416, - 37417, - 37418, - 4651, - 37422, - 4655, - 37427, - 4660, - 37433, - 37434, - 37435, - 4668, - 37443, - 4676, - 37449, - 4682, - 37453, - 4686, - 37496, - 4729, - 37511, - 37512, - 4745, - 37522, - 37523, - 4756, - 37527, - 4760, - 37544, - 4777, - 37547, - 37548, - 4781, - 37551, - 4784, - 37576, - 4809, - 37594, - 37595, - 37596, - 37597, - 37598, - 37599, - 37600, - 37601, - 37602, - 37603, - 37604, - 37605, - 37606, - 37607, - 37608, - 37609, - 37610, - 37611, - 37612, - 37613, - 37614, - 37615, - 37616, - 37617, - 37618, - 37619, - 37620, - 37621, - 37622, - 37623, - 37624, - 37625, - 37626, - 37627, - 37628, - 37629, - 37630, - 37631, - 37632, - 37633, - 4866, - 37826, - 5059, - 37833, - 5066, - 37840, - 5073, - 37847, - 5080, - 37851, - 5084, - 37867, - 37868, - 37869, - 37870, - 37871, - 37872, - 37873, - 37874, - 37875, - 37876, - 37877, - 37878, - 37879, - 37880, - 37881, - 37882, - 37883, - 37884, - 37885, - 37886, - 37887, - 37888, - 37889, - 37890, - 37891, - 37892, - 37893, - 37894, - 37895, - 37896, - 37897, - 37898, - 37899, - 37900, - 37901, - 37902, - 37903, - 37904, - 37905, - 37906, - 37907, - 37908, - 37909, - 37910, - 37911, - 5144, - 37952, - 37953, - 37954, - 37955, - 5188, - 37992, - 37993, - 37994, - 37995, - 37996, - 37997, - 37998, - 37999, - 38000, - 38001, - 38002, - 38003, - 38004, - 38005, - 38006, - 38007, - 38008, - 5241, - 38011, - 38012, - 38013, - 38014, - 38015, - 38016, - 38017, - 38018, - 38019, - 38020, - 38021, - 38022, - 38023, - 38024, - 38025, - 38026, - 38027, - 38028, - 38029, - 38030, - 38031, - 38032, - 38033, - 38034, - 38035, - 38036, - 38037, - 38038, - 38039, - 38040, - 38041, - 38042, - 38043, - 38044, - 38045, - 38046, - 38047, - 38048, - 38049, - 38050, - 38051, - 38052, - 38053, - 38054, - 38055, - 38056, - 38057, - 38058, - 38059, - 38060, - 38061, - 38062, - 38063, - 38064, - 38065, - 38066, - 38067, - 38068, - 38069, - 38070, - 38071, - 38072, - 5305, - 38124, - 38125, - 38126, - 38127, - 38128, - 38129, - 38130, - 38131, - 38132, - 38133, - 38134, - 38135, - 38136, - 38137, - 38138, - 38139, - 38140, - 38141, - 38142, - 38143, - 38144, - 38145, - 38146, - 38147, - 38148, - 38149, - 38150, - 38151, - 38152, - 38153, - 38154, - 38155, - 38156, - 38157, - 38158, - 38159, - 5392, - 38163, - 38164, - 38165, - 38166, - 38167, - 38168, - 38169, - 38170, - 38171, - 38172, - 38173, - 38174, - 38175, - 38176, - 38177, - 38178, - 38179, - 38180, - 38181, - 38182, - 38183, - 38184, - 38185, - 38186, - 38187, - 38188, - 38189, - 38190, - 38191, - 38192, - 38193, - 38194, - 38195, - 38196, - 38197, - 38198, - 38199, - 38200, - 38201, - 38202, - 38203, - 5436, - 38208, - 38209, - 38210, - 38211, - 38212, - 38213, - 38214, - 38215, - 38216, - 38217, - 38218, - 38219, - 38220, - 38221, - 38222, - 38223, - 38224, - 38225, - 38226, - 38227, - 38228, - 38229, - 38230, - 38231, - 38232, - 5465, - 38265, - 38266, - 38267, - 38268, - 38269, - 38270, - 38271, - 38272, - 38273, - 38274, - 38275, - 38276, - 38277, - 38278, - 38279, - 38280, - 38281, - 38282, - 38283, - 38284, - 38285, - 38286, - 38287, - 38288, - 38289, - 38290, - 38291, - 38292, - 38293, - 38294, - 38295, - 38296, - 38297, - 38298, - 5531, - 38301, - 38302, - 38303, - 38304, - 38305, - 38306, - 38307, - 38308, - 38309, - 38310, - 38311, - 38312, - 38313, - 38314, - 38315, - 38316, - 38317, - 38318, - 38319, - 38320, - 38321, - 38322, - 38323, - 38324, - 38325, - 38326, - 38327, - 38328, - 38329, - 38330, - 38331, - 38332, - 38333, - 38334, - 38335, - 38336, - 38337, - 38338, - 38339, - 38340, - 38341, - 38342, - 38343, - 38344, - 38345, - 38346, - 38347, - 38348, - 38349, - 38350, - 38351, - 38352, - 38353, - 38354, - 38355, - 38356, - 38357, - 38358, - 38359, - 38360, - 38361, - 38362, - 38363, - 38364, - 38365, - 38366, - 38367, - 38368, - 38369, - 38370, - 38371, - 38372, - 5605, - 38380, - 38381, - 38382, - 5615, - 38389, - 38390, - 38391, - 38392, - 38393, - 38394, - 38395, - 38396, - 5629, - 38557, - 38558, - 38559, - 5792, - 38562, - 5795, - 38661, - 5894, - 38720, - 5953, - 39069, - 6302, - 39113, - 6346, - 39170, - 6403, - 39227, - 6460, - 39284, - 6517, - 39341, - 6574, - 39355, - 39356, - 6589, - 39407, - 39408, - 39409, - 39410, - 39411, - 39412, - 39413, - 39414, - 39415, - 39416, - 39417, - 39418, - 39419, - 39420, - 39421, - 39422, - 39423, - 39424, - 39425, - 39426, - 6659, - 39461, - 39462, - 39463, - 39464, - 39465, - 39466, - 6699, - 39504, - 6737, - 39526, - 39527, - 39528, - 6761, - 39543, - 6776, - 39558, - 6791, - 39612, - 6845, - 39640, - 39641, - 39642, - 39643, - 39644, - 39645, - 39646, - 39647, - 39648, - 39649, - 39650, - 39651, - 39652, - 39653, - 39654, - 6887, - 39665, - 39666, - 6899, - 39731, - 6964, - 39734, - 39735, - 39736, - 39737, - 39738, - 39739, - 6972, - 39743, - 6976, - 39788, - 7021, - 39798, - 7031, - 39801, - 39802, - 39803, - 39804, - 39805, - 39806, - 39807, - 39808, - 39809, - 39810, - 39811, - 39812, - 39813, - 39814, - 39815, - 39816, - 39817, - 39818, - 39819, - 39820, - 39821, - 39822, - 39823, - 39824, - 39825, - 39826, - 39827, - 39828, - 39829, - 39830, - 39831, - 39832, - 39833, - 39834, - 39835, - 39836, - 39837, - 39838, - 39839, - 39840, - 39841, - 39842, - 39843, - 39844, - 39845, - 39846, - 39847, - 7080, - 39897, - 7130, - 39915, - 7148, - 39951, - 7184, - 39989, - 39990, - 39991, - 7224, - 40142, - 7375, - 40167, - 7400, - 40189, - 7422, - 40349, - 7582, - 40380, - 40381, - 40382, -]; - -static MAPPING_TABLE: &'static [Mapping] = &[ - DisallowedStd3Valid, - Valid, - DisallowedStd3Valid, - Valid, - DisallowedStd3Valid, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - DisallowedStd3Valid, - Valid, - DisallowedStd3Valid, - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 0, byte_len: 1 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 0, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Valid, - Ignored, - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 0, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 0, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 0, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 0, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 0, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 0, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 0, byte_len: 5 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 0, byte_len: 2 }), - Deviation(StringTableSlice { byte_start_lo: 119, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 0, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 0, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 0, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 1, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 1, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 1, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 1, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 1, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 1, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 1, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 1, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 1, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 1, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Valid, - Ignored, - Valid, - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 1, byte_len: 2 }), - Valid, - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 1, byte_len: 3 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 2, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 2, byte_len: 2 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 0, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 2, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 2, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 2, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 2, byte_len: 2 }), - Valid, - Deviation(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 3, byte_len: 2 }), - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 3, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 3, byte_len: 2 }), - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 3, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 3, byte_len: 2 }), - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 3, byte_len: 4 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 3, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 3, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 3, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 3, byte_len: 4 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 3, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 3, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 3, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 4, byte_len: 6 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 4, byte_len: 6 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 4, byte_len: 6 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 4, byte_len: 6 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 4, byte_len: 6 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 4, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 4, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 4, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 4, byte_len: 9 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 4, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 4, byte_len: 6 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 4, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 4, byte_len: 3 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 4, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 5, byte_len: 3 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Ignored, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 5, byte_len: 3 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 5, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 0, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 6, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 6, byte_len: 3 }), - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 6, byte_len: 3 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 6, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 7, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 7, byte_len: 3 }), - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 7, byte_len: 3 }), - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 7, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 7, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 7, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 7, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 7, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 2, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 7, byte_len: 5 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 7, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 7, byte_len: 4 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 7, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 7, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 7, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 7, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 7, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 7, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 8, byte_len: 4 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 8, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 7, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 8, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 8, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 8, byte_len: 5 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 8, byte_len: 2 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 2, byte_len: 2 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 8, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 8, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 8, byte_len: 5 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 8, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 8, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 8, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 2, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 8, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 8, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 8, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 8, byte_len: 4 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 8, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 8, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 0, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 8, byte_len: 3 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 0, byte_len: 1 }), - Ignored, - Deviation(StringTableSlice { byte_start_lo: 105, byte_start_hi: 8, byte_len: 0 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 8, byte_len: 3 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 8, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 8, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 8, byte_len: 9 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 8, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 8, byte_len: 9 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 8, byte_len: 2 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 8, byte_len: 3 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 8, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 8, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 8, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 8, byte_len: 12 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 0, byte_len: 1 }), - Ignored, - Disallowed, - Ignored, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 8, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 8, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 8, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 8, byte_len: 2 }), - Valid, - Disallowed, - Valid, - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 8, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 8, byte_len: 3 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 8, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 1, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 8, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 8, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 8, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 8, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 8, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 8, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 8, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 8, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 8, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 8, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 8, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 8, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 8, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 8, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 8, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 8, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 9, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 9, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 9, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 9, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 9, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 9, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 9, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 9, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 9, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 9, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 9, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 9, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 9, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 9, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 9, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 9, byte_len: 5 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 9, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 9, byte_len: 9 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 9, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 9, byte_len: 9 }), - Valid, - DisallowedStd3Valid, - Valid, - DisallowedStd3Valid, - Valid, - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 9, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 9, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 9, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 9, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 9, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 9, byte_len: 4 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 8, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 10, byte_len: 12 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 10, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 10, byte_len: 5 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 10, byte_len: 3 }), - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 10, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 10, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 5, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 10, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 10, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 10, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 11, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 11, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 11, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 11, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 14, byte_len: 3 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 0, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 14, byte_len: 1 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 14, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 14, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 14, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 14, byte_len: 4 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 14, byte_len: 6 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 14, byte_len: 6 }), - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 14, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 15, byte_len: 3 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 11, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 15, byte_len: 8 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 15, byte_len: 8 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 15, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 16, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 16, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 16, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 16, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 16, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 17, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 17, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 17, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 17, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 17, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 17, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 17, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 17, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 17, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 17, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 17, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 17, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 17, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 17, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 17, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 17, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 18, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 18, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 18, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 18, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 18, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 18, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 18, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 18, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 18, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 18, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 18, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 18, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 18, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 18, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 18, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 18, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 18, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 19, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 19, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 19, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 19, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 19, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 19, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 19, byte_len: 18 }), - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 19, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 19, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 19, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 19, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 19, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 19, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 19, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 19, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 19, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 19, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 19, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 19, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 19, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 19, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 19, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 19, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 19, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 20, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 20, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 20, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 20, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 20, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 20, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 20, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 20, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 20, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 20, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 20, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 20, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 20, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 20, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 21, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 21, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 21, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 21, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 21, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 21, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 21, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 21, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 21, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 21, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 21, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 21, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 21, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 21, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 21, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 21, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 21, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 21, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 21, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 21, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 21, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 21, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 21, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 21, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 21, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 21, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 21, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 21, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 21, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 21, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 22, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 22, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 22, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 22, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 22, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 22, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 22, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 22, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 22, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 22, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 22, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 23, byte_len: 7 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 23, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 23, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 23, byte_len: 6 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 22, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 23, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 23, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 23, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 23, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 23, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 23, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 23, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 23, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 23, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 23, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 23, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 23, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 24, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 24, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 24, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 5, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 2, byte_len: 2 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 24, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 24, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 5, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 25, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 5, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 25, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 25, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 5, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 25, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 25, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 0, byte_len: 2 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 24, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 10, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 25, byte_len: 3 }), - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 25, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 26, byte_len: 3 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 29, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 29, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 29, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 12, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 29, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 29, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 29, byte_len: 3 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 30, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 30, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 30, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 30, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 30, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 30, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 30, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 30, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 30, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 30, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 30, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 31, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 31, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 31, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 31, byte_len: 4 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 31, byte_len: 4 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 8, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 8, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 31, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 31, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 31, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 31, byte_len: 4 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 31, byte_len: 4 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 31, byte_len: 4 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 31, byte_len: 4 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 31, byte_len: 4 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 31, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 31, byte_len: 2 }), - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 3, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 32, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 32, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 32, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 32, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 32, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 32, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 33, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 33, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 33, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 33, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 33, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 33, byte_len: 5 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 33, byte_len: 5 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 33, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 34, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 32, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 34, byte_len: 4 }), - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 34, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 35, byte_len: 6 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 35, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 36, byte_len: 6 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 36, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 37, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 37, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 37, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 37, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 37, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 37, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 37, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 37, byte_len: 6 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 37, byte_len: 33 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 37, byte_len: 15 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 37, byte_len: 8 }), - Valid, - Disallowed, - Ignored, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 37, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 37, byte_len: 3 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 2, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 37, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 37, byte_len: 3 }), - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 37, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 37, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 9, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 9, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 37, byte_len: 3 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 8, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 37, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 37, byte_len: 3 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 2, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 37, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 37, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 37, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 37, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 8, byte_len: 1 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 37, byte_len: 1 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 37, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 37, byte_len: 3 }), - Valid, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 37, byte_len: 3 }), - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 37, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 37, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 37, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 37, byte_len: 4 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 37, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 32, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 38, byte_len: 4 }), - Disallowed, - Ignored, - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 38, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 38, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 37, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 37, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 14, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 38, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 2, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 8, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 37, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 38, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 38, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 37, byte_len: 1 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 38, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 14, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 37, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 18, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 38, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 14, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 14, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 14, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 14, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 14, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 14, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 38, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 0, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 38, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 38, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 38, byte_len: 3 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 38, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 39, byte_len: 4 }), - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 39, byte_len: 4 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 39, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 40, byte_len: 4 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 40, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 41, byte_len: 4 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Ignored, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 41, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 41, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 41, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 41, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 41, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 41, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 41, byte_len: 12 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 41, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 41, byte_len: 8 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 41, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 41, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 41, byte_len: 12 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 41, byte_len: 12 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 41, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 41, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 1, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 41, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 2, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 2, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 8, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 8, byte_len: 1 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 41, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 42, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 42, byte_len: 4 }), - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 42, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 31, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 42, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 42, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 37, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 37, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 37, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 37, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 31, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 42, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 37, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 42, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 42, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 37, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 38, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 38, byte_len: 2 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 42, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 42, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 42, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 42, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 42, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 42, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 42, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 42, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 42, byte_len: 2 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 42, byte_len: 2 }), - Valid, - Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 9, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 10, byte_len: 3 }), - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 10, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 42, byte_len: 7 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 42, byte_len: 2 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 42, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 23, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 42, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 0, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 42, byte_len: 2 }), - Valid, - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 42, byte_len: 2 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 42, byte_len: 2 }), - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 42, byte_len: 2 }), - Valid, - Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 42, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 42, byte_len: 6 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 17, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 15, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 17, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 42, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 42, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 42, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 42, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 42, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 42, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 42, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 42, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 43, byte_len: 9 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 43, byte_len: 9 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 43, byte_len: 3 }), - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Valid, - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 43, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 43, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 43, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 43, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 43, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 11, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 43, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 43, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 43, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 43, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 42, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 44, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 44, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 12, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 44, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 28, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 45, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 45, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 46, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 46, byte_len: 4 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 46, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 46, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 44, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 27, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 29, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 26, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 47, byte_len: 3 }), - Disallowed, - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 47, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 47, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 30, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 48, byte_len: 4 }), - Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 48, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 13, byte_len: 3 }), - Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 48, byte_len: 4 }), - Disallowed, - Ignored, - Disallowed, -]; - -static STRING_TABLE: &'static str = "\u{61}\ - \u{62}\ - \u{63}\ - \u{64}\ - \u{65}\ - \u{66}\ - \u{67}\ - \u{68}\ - \u{69}\ - \u{6a}\ - \u{6b}\ - \u{6c}\ - \u{6d}\ - \u{6e}\ - \u{6f}\ - \u{70}\ - \u{71}\ - \u{72}\ - \u{73}\ - \u{74}\ - \u{75}\ - \u{76}\ - \u{77}\ - \u{78}\ - \u{79}\ - \u{7a}\ - \u{20}\ - \u{20}\ - \u{308}\ - \u{20}\ - \u{304}\ - \u{32}\ - \u{33}\ - \u{20}\ - \u{301}\ - \u{3bc}\ - \u{20}\ - \u{327}\ - \u{31}\ - \u{31}\ - \u{2044}\ - \u{34}\ - \u{31}\ - \u{2044}\ - \u{32}\ - \u{33}\ - \u{2044}\ - \u{34}\ - \u{e0}\ - \u{e1}\ - \u{e2}\ - \u{e3}\ - \u{e4}\ - \u{e5}\ - \u{e6}\ - \u{e7}\ - \u{e8}\ - \u{e9}\ - \u{ea}\ - \u{eb}\ - \u{ec}\ - \u{ed}\ - \u{ee}\ - \u{ef}\ - \u{f0}\ - \u{f1}\ - \u{f2}\ - \u{f3}\ - \u{f4}\ - \u{f5}\ - \u{f6}\ - \u{f8}\ - \u{f9}\ - \u{fa}\ - \u{fb}\ - \u{fc}\ - \u{fd}\ - \u{fe}\ - \u{73}\ - \u{73}\ - \u{101}\ - \u{103}\ - \u{105}\ - \u{107}\ - \u{109}\ - \u{10b}\ - \u{10d}\ - \u{10f}\ - \u{111}\ - \u{113}\ - \u{115}\ - \u{117}\ - \u{119}\ - \u{11b}\ - \u{11d}\ - \u{11f}\ - \u{121}\ - \u{123}\ - \u{125}\ - \u{127}\ - \u{129}\ - \u{12b}\ - \u{12d}\ - \u{12f}\ - \u{69}\ - \u{307}\ - \u{69}\ - \u{6a}\ - \u{135}\ - \u{137}\ - \u{13a}\ - \u{13c}\ - \u{13e}\ - \u{6c}\ - \u{b7}\ - \u{142}\ - \u{144}\ - \u{146}\ - \u{148}\ - \u{2bc}\ - \u{6e}\ - \u{14b}\ - \u{14d}\ - \u{14f}\ - \u{151}\ - \u{153}\ - \u{155}\ - \u{157}\ - \u{159}\ - \u{15b}\ - \u{15d}\ - \u{15f}\ - \u{161}\ - \u{163}\ - \u{165}\ - \u{167}\ - \u{169}\ - \u{16b}\ - \u{16d}\ - \u{16f}\ - \u{171}\ - \u{173}\ - \u{175}\ - \u{177}\ - \u{ff}\ - \u{17a}\ - \u{17c}\ - \u{17e}\ - \u{253}\ - \u{183}\ - \u{185}\ - \u{254}\ - \u{188}\ - \u{256}\ - \u{257}\ - \u{18c}\ - \u{1dd}\ - \u{259}\ - \u{25b}\ - \u{192}\ - \u{260}\ - \u{263}\ - \u{269}\ - \u{268}\ - \u{199}\ - \u{26f}\ - \u{272}\ - \u{275}\ - \u{1a1}\ - \u{1a3}\ - \u{1a5}\ - \u{280}\ - \u{1a8}\ - \u{283}\ - \u{1ad}\ - \u{288}\ - \u{1b0}\ - \u{28a}\ - \u{28b}\ - \u{1b4}\ - \u{1b6}\ - \u{292}\ - \u{1b9}\ - \u{1bd}\ - \u{64}\ - \u{17e}\ - \u{6c}\ - \u{6a}\ - \u{6e}\ - \u{6a}\ - \u{1ce}\ - \u{1d0}\ - \u{1d2}\ - \u{1d4}\ - \u{1d6}\ - \u{1d8}\ - \u{1da}\ - \u{1dc}\ - \u{1df}\ - \u{1e1}\ - \u{1e3}\ - \u{1e5}\ - \u{1e7}\ - \u{1e9}\ - \u{1eb}\ - \u{1ed}\ - \u{1ef}\ - \u{64}\ - \u{7a}\ - \u{1f5}\ - \u{195}\ - \u{1bf}\ - \u{1f9}\ - \u{1fb}\ - \u{1fd}\ - \u{1ff}\ - \u{201}\ - \u{203}\ - \u{205}\ - \u{207}\ - \u{209}\ - \u{20b}\ - \u{20d}\ - \u{20f}\ - \u{211}\ - \u{213}\ - \u{215}\ - \u{217}\ - \u{219}\ - \u{21b}\ - \u{21d}\ - \u{21f}\ - \u{19e}\ - \u{223}\ - \u{225}\ - \u{227}\ - \u{229}\ - \u{22b}\ - \u{22d}\ - \u{22f}\ - \u{231}\ - \u{233}\ - \u{2c65}\ - \u{23c}\ - \u{19a}\ - \u{2c66}\ - \u{242}\ - \u{180}\ - \u{289}\ - \u{28c}\ - \u{247}\ - \u{249}\ - \u{24b}\ - \u{24d}\ - \u{24f}\ - \u{266}\ - \u{279}\ - \u{27b}\ - \u{281}\ - \u{20}\ - \u{306}\ - \u{20}\ - \u{307}\ - \u{20}\ - \u{30a}\ - \u{20}\ - \u{328}\ - \u{20}\ - \u{303}\ - \u{20}\ - \u{30b}\ - \u{295}\ - \u{300}\ - \u{301}\ - \u{313}\ - \u{308}\ - \u{301}\ - \u{3b9}\ - \u{371}\ - \u{373}\ - \u{2b9}\ - \u{377}\ - \u{20}\ - \u{3b9}\ - \u{3b}\ - \u{3f3}\ - \u{20}\ - \u{308}\ - \u{301}\ - \u{3ac}\ - \u{b7}\ - \u{3ad}\ - \u{3ae}\ - \u{3af}\ - \u{3cc}\ - \u{3cd}\ - \u{3ce}\ - \u{3b1}\ - \u{3b2}\ - \u{3b3}\ - \u{3b4}\ - \u{3b5}\ - \u{3b6}\ - \u{3b7}\ - \u{3b8}\ - \u{3ba}\ - \u{3bb}\ - \u{3bd}\ - \u{3be}\ - \u{3bf}\ - \u{3c0}\ - \u{3c1}\ - \u{3c3}\ - \u{3c4}\ - \u{3c5}\ - \u{3c6}\ - \u{3c7}\ - \u{3c8}\ - \u{3c9}\ - \u{3ca}\ - \u{3cb}\ - \u{3d7}\ - \u{3d9}\ - \u{3db}\ - \u{3dd}\ - \u{3df}\ - \u{3e1}\ - \u{3e3}\ - \u{3e5}\ - \u{3e7}\ - \u{3e9}\ - \u{3eb}\ - \u{3ed}\ - \u{3ef}\ - \u{3f8}\ - \u{3fb}\ - \u{37b}\ - \u{37c}\ - \u{37d}\ - \u{450}\ - \u{451}\ - \u{452}\ - \u{453}\ - \u{454}\ - \u{455}\ - \u{456}\ - \u{457}\ - \u{458}\ - \u{459}\ - \u{45a}\ - \u{45b}\ - \u{45c}\ - \u{45d}\ - \u{45e}\ - \u{45f}\ - \u{430}\ - \u{431}\ - \u{432}\ - \u{433}\ - \u{434}\ - \u{435}\ - \u{436}\ - \u{437}\ - \u{438}\ - \u{439}\ - \u{43a}\ - \u{43b}\ - \u{43c}\ - \u{43d}\ - \u{43e}\ - \u{43f}\ - \u{440}\ - \u{441}\ - \u{442}\ - \u{443}\ - \u{444}\ - \u{445}\ - \u{446}\ - \u{447}\ - \u{448}\ - \u{449}\ - \u{44a}\ - \u{44b}\ - \u{44c}\ - \u{44d}\ - \u{44e}\ - \u{44f}\ - \u{461}\ - \u{463}\ - \u{465}\ - \u{467}\ - \u{469}\ - \u{46b}\ - \u{46d}\ - \u{46f}\ - \u{471}\ - \u{473}\ - \u{475}\ - \u{477}\ - \u{479}\ - \u{47b}\ - \u{47d}\ - \u{47f}\ - \u{481}\ - \u{48b}\ - \u{48d}\ - \u{48f}\ - \u{491}\ - \u{493}\ - \u{495}\ - \u{497}\ - \u{499}\ - \u{49b}\ - \u{49d}\ - \u{49f}\ - \u{4a1}\ - \u{4a3}\ - \u{4a5}\ - \u{4a7}\ - \u{4a9}\ - \u{4ab}\ - \u{4ad}\ - \u{4af}\ - \u{4b1}\ - \u{4b3}\ - \u{4b5}\ - \u{4b7}\ - \u{4b9}\ - \u{4bb}\ - \u{4bd}\ - \u{4bf}\ - \u{4c2}\ - \u{4c4}\ - \u{4c6}\ - \u{4c8}\ - \u{4ca}\ - \u{4cc}\ - \u{4ce}\ - \u{4d1}\ - \u{4d3}\ - \u{4d5}\ - \u{4d7}\ - \u{4d9}\ - \u{4db}\ - \u{4dd}\ - \u{4df}\ - \u{4e1}\ - \u{4e3}\ - \u{4e5}\ - \u{4e7}\ - \u{4e9}\ - \u{4eb}\ - \u{4ed}\ - \u{4ef}\ - \u{4f1}\ - \u{4f3}\ - \u{4f5}\ - \u{4f7}\ - \u{4f9}\ - \u{4fb}\ - \u{4fd}\ - \u{4ff}\ - \u{501}\ - \u{503}\ - \u{505}\ - \u{507}\ - \u{509}\ - \u{50b}\ - \u{50d}\ - \u{50f}\ - \u{511}\ - \u{513}\ - \u{515}\ - \u{517}\ - \u{519}\ - \u{51b}\ - \u{51d}\ - \u{51f}\ - \u{521}\ - \u{523}\ - \u{525}\ - \u{527}\ - \u{529}\ - \u{52b}\ - \u{52d}\ - \u{52f}\ - \u{561}\ - \u{562}\ - \u{563}\ - \u{564}\ - \u{565}\ - \u{566}\ - \u{567}\ - \u{568}\ - \u{569}\ - \u{56a}\ - \u{56b}\ - \u{56c}\ - \u{56d}\ - \u{56e}\ - \u{56f}\ - \u{570}\ - \u{571}\ - \u{572}\ - \u{573}\ - \u{574}\ - \u{575}\ - \u{576}\ - \u{577}\ - \u{578}\ - \u{579}\ - \u{57a}\ - \u{57b}\ - \u{57c}\ - \u{57d}\ - \u{57e}\ - \u{57f}\ - \u{580}\ - \u{581}\ - \u{582}\ - \u{583}\ - \u{584}\ - \u{585}\ - \u{586}\ - \u{565}\ - \u{582}\ - \u{627}\ - \u{674}\ - \u{648}\ - \u{674}\ - \u{6c7}\ - \u{674}\ - \u{64a}\ - \u{674}\ - \u{915}\ - \u{93c}\ - \u{916}\ - \u{93c}\ - \u{917}\ - \u{93c}\ - \u{91c}\ - \u{93c}\ - \u{921}\ - \u{93c}\ - \u{922}\ - \u{93c}\ - \u{92b}\ - \u{93c}\ - \u{92f}\ - \u{93c}\ - \u{9a1}\ - \u{9bc}\ - \u{9a2}\ - \u{9bc}\ - \u{9af}\ - \u{9bc}\ - \u{a32}\ - \u{a3c}\ - \u{a38}\ - \u{a3c}\ - \u{a16}\ - \u{a3c}\ - \u{a17}\ - \u{a3c}\ - \u{a1c}\ - \u{a3c}\ - \u{a2b}\ - \u{a3c}\ - \u{b21}\ - \u{b3c}\ - \u{b22}\ - \u{b3c}\ - \u{e4d}\ - \u{e32}\ - \u{ecd}\ - \u{eb2}\ - \u{eab}\ - \u{e99}\ - \u{eab}\ - \u{ea1}\ - \u{f0b}\ - \u{f42}\ - \u{fb7}\ - \u{f4c}\ - \u{fb7}\ - \u{f51}\ - \u{fb7}\ - \u{f56}\ - \u{fb7}\ - \u{f5b}\ - \u{fb7}\ - \u{f40}\ - \u{fb5}\ - \u{f71}\ - \u{f72}\ - \u{f71}\ - \u{f74}\ - \u{fb2}\ - \u{f80}\ - \u{fb2}\ - \u{f71}\ - \u{f80}\ - \u{fb3}\ - \u{f80}\ - \u{fb3}\ - \u{f71}\ - \u{f80}\ - \u{f71}\ - \u{f80}\ - \u{f92}\ - \u{fb7}\ - \u{f9c}\ - \u{fb7}\ - \u{fa1}\ - \u{fb7}\ - \u{fa6}\ - \u{fb7}\ - \u{fab}\ - \u{fb7}\ - \u{f90}\ - \u{fb5}\ - \u{2d27}\ - \u{2d2d}\ - \u{10dc}\ - \u{13f0}\ - \u{13f1}\ - \u{13f2}\ - \u{13f3}\ - \u{13f4}\ - \u{13f5}\ - \u{a64b}\ - \u{250}\ - \u{251}\ - \u{1d02}\ - \u{25c}\ - \u{1d16}\ - \u{1d17}\ - \u{1d1d}\ - \u{1d25}\ - \u{252}\ - \u{255}\ - \u{25f}\ - \u{261}\ - \u{265}\ - \u{26a}\ - \u{1d7b}\ - \u{29d}\ - \u{26d}\ - \u{1d85}\ - \u{29f}\ - \u{271}\ - \u{270}\ - \u{273}\ - \u{274}\ - \u{278}\ - \u{282}\ - \u{1ab}\ - \u{1d1c}\ - \u{290}\ - \u{291}\ - \u{1e01}\ - \u{1e03}\ - \u{1e05}\ - \u{1e07}\ - \u{1e09}\ - \u{1e0b}\ - \u{1e0d}\ - \u{1e0f}\ - \u{1e11}\ - \u{1e13}\ - \u{1e15}\ - \u{1e17}\ - \u{1e19}\ - \u{1e1b}\ - \u{1e1d}\ - \u{1e1f}\ - \u{1e21}\ - \u{1e23}\ - \u{1e25}\ - \u{1e27}\ - \u{1e29}\ - \u{1e2b}\ - \u{1e2d}\ - \u{1e2f}\ - \u{1e31}\ - \u{1e33}\ - \u{1e35}\ - \u{1e37}\ - \u{1e39}\ - \u{1e3b}\ - \u{1e3d}\ - \u{1e3f}\ - \u{1e41}\ - \u{1e43}\ - \u{1e45}\ - \u{1e47}\ - \u{1e49}\ - \u{1e4b}\ - \u{1e4d}\ - \u{1e4f}\ - \u{1e51}\ - \u{1e53}\ - \u{1e55}\ - \u{1e57}\ - \u{1e59}\ - \u{1e5b}\ - \u{1e5d}\ - \u{1e5f}\ - \u{1e61}\ - \u{1e63}\ - \u{1e65}\ - \u{1e67}\ - \u{1e69}\ - \u{1e6b}\ - \u{1e6d}\ - \u{1e6f}\ - \u{1e71}\ - \u{1e73}\ - \u{1e75}\ - \u{1e77}\ - \u{1e79}\ - \u{1e7b}\ - \u{1e7d}\ - \u{1e7f}\ - \u{1e81}\ - \u{1e83}\ - \u{1e85}\ - \u{1e87}\ - \u{1e89}\ - \u{1e8b}\ - \u{1e8d}\ - \u{1e8f}\ - \u{1e91}\ - \u{1e93}\ - \u{1e95}\ - \u{61}\ - \u{2be}\ - \u{1ea1}\ - \u{1ea3}\ - \u{1ea5}\ - \u{1ea7}\ - \u{1ea9}\ - \u{1eab}\ - \u{1ead}\ - \u{1eaf}\ - \u{1eb1}\ - \u{1eb3}\ - \u{1eb5}\ - \u{1eb7}\ - \u{1eb9}\ - \u{1ebb}\ - \u{1ebd}\ - \u{1ebf}\ - \u{1ec1}\ - \u{1ec3}\ - \u{1ec5}\ - \u{1ec7}\ - \u{1ec9}\ - \u{1ecb}\ - \u{1ecd}\ - \u{1ecf}\ - \u{1ed1}\ - \u{1ed3}\ - \u{1ed5}\ - \u{1ed7}\ - \u{1ed9}\ - \u{1edb}\ - \u{1edd}\ - \u{1edf}\ - \u{1ee1}\ - \u{1ee3}\ - \u{1ee5}\ - \u{1ee7}\ - \u{1ee9}\ - \u{1eeb}\ - \u{1eed}\ - \u{1eef}\ - \u{1ef1}\ - \u{1ef3}\ - \u{1ef5}\ - \u{1ef7}\ - \u{1ef9}\ - \u{1efb}\ - \u{1efd}\ - \u{1eff}\ - \u{1f00}\ - \u{1f01}\ - \u{1f02}\ - \u{1f03}\ - \u{1f04}\ - \u{1f05}\ - \u{1f06}\ - \u{1f07}\ - \u{1f10}\ - \u{1f11}\ - \u{1f12}\ - \u{1f13}\ - \u{1f14}\ - \u{1f15}\ - \u{1f20}\ - \u{1f21}\ - \u{1f22}\ - \u{1f23}\ - \u{1f24}\ - \u{1f25}\ - \u{1f26}\ - \u{1f27}\ - \u{1f30}\ - \u{1f31}\ - \u{1f32}\ - \u{1f33}\ - \u{1f34}\ - \u{1f35}\ - \u{1f36}\ - \u{1f37}\ - \u{1f40}\ - \u{1f41}\ - \u{1f42}\ - \u{1f43}\ - \u{1f44}\ - \u{1f45}\ - \u{1f51}\ - \u{1f53}\ - \u{1f55}\ - \u{1f57}\ - \u{1f60}\ - \u{1f61}\ - \u{1f62}\ - \u{1f63}\ - \u{1f64}\ - \u{1f65}\ - \u{1f66}\ - \u{1f67}\ - \u{1f00}\ - \u{3b9}\ - \u{1f01}\ - \u{3b9}\ - \u{1f02}\ - \u{3b9}\ - \u{1f03}\ - \u{3b9}\ - \u{1f04}\ - \u{3b9}\ - \u{1f05}\ - \u{3b9}\ - \u{1f06}\ - \u{3b9}\ - \u{1f07}\ - \u{3b9}\ - \u{1f20}\ - \u{3b9}\ - \u{1f21}\ - \u{3b9}\ - \u{1f22}\ - \u{3b9}\ - \u{1f23}\ - \u{3b9}\ - \u{1f24}\ - \u{3b9}\ - \u{1f25}\ - \u{3b9}\ - \u{1f26}\ - \u{3b9}\ - \u{1f27}\ - \u{3b9}\ - \u{1f60}\ - \u{3b9}\ - \u{1f61}\ - \u{3b9}\ - \u{1f62}\ - \u{3b9}\ - \u{1f63}\ - \u{3b9}\ - \u{1f64}\ - \u{3b9}\ - \u{1f65}\ - \u{3b9}\ - \u{1f66}\ - \u{3b9}\ - \u{1f67}\ - \u{3b9}\ - \u{1f70}\ - \u{3b9}\ - \u{3b1}\ - \u{3b9}\ - \u{3ac}\ - \u{3b9}\ - \u{1fb6}\ - \u{3b9}\ - \u{1fb0}\ - \u{1fb1}\ - \u{1f70}\ - \u{20}\ - \u{313}\ - \u{20}\ - \u{342}\ - \u{20}\ - \u{308}\ - \u{342}\ - \u{1f74}\ - \u{3b9}\ - \u{3b7}\ - \u{3b9}\ - \u{3ae}\ - \u{3b9}\ - \u{1fc6}\ - \u{3b9}\ - \u{1f72}\ - \u{1f74}\ - \u{20}\ - \u{313}\ - \u{300}\ - \u{20}\ - \u{313}\ - \u{301}\ - \u{20}\ - \u{313}\ - \u{342}\ - \u{390}\ - \u{1fd0}\ - \u{1fd1}\ - \u{1f76}\ - \u{20}\ - \u{314}\ - \u{300}\ - \u{20}\ - \u{314}\ - \u{301}\ - \u{20}\ - \u{314}\ - \u{342}\ - \u{3b0}\ - \u{1fe0}\ - \u{1fe1}\ - \u{1f7a}\ - \u{1fe5}\ - \u{20}\ - \u{308}\ - \u{300}\ - \u{60}\ - \u{1f7c}\ - \u{3b9}\ - \u{3c9}\ - \u{3b9}\ - \u{3ce}\ - \u{3b9}\ - \u{1ff6}\ - \u{3b9}\ - \u{1f78}\ - \u{1f7c}\ - \u{20}\ - \u{314}\ - \u{2010}\ - \u{20}\ - \u{333}\ - \u{2032}\ - \u{2032}\ - \u{2032}\ - \u{2032}\ - \u{2032}\ - \u{2035}\ - \u{2035}\ - \u{2035}\ - \u{2035}\ - \u{2035}\ - \u{21}\ - \u{21}\ - \u{20}\ - \u{305}\ - \u{3f}\ - \u{3f}\ - \u{3f}\ - \u{21}\ - \u{21}\ - \u{3f}\ - \u{2032}\ - \u{2032}\ - \u{2032}\ - \u{2032}\ - \u{30}\ - \u{34}\ - \u{35}\ - \u{36}\ - \u{37}\ - \u{38}\ - \u{39}\ - \u{2b}\ - \u{2212}\ - \u{3d}\ - \u{28}\ - \u{29}\ - \u{72}\ - \u{73}\ - \u{61}\ - \u{2f}\ - \u{63}\ - \u{61}\ - \u{2f}\ - \u{73}\ - \u{b0}\ - \u{63}\ - \u{63}\ - \u{2f}\ - \u{6f}\ - \u{63}\ - \u{2f}\ - \u{75}\ - \u{b0}\ - \u{66}\ - \u{6e}\ - \u{6f}\ - \u{73}\ - \u{6d}\ - \u{74}\ - \u{65}\ - \u{6c}\ - \u{74}\ - \u{6d}\ - \u{5d0}\ - \u{5d1}\ - \u{5d2}\ - \u{5d3}\ - \u{66}\ - \u{61}\ - \u{78}\ - \u{2211}\ - \u{31}\ - \u{2044}\ - \u{37}\ - \u{31}\ - \u{2044}\ - \u{39}\ - \u{31}\ - \u{2044}\ - \u{31}\ - \u{30}\ - \u{31}\ - \u{2044}\ - \u{33}\ - \u{32}\ - \u{2044}\ - \u{33}\ - \u{31}\ - \u{2044}\ - \u{35}\ - \u{32}\ - \u{2044}\ - \u{35}\ - \u{33}\ - \u{2044}\ - \u{35}\ - \u{34}\ - \u{2044}\ - \u{35}\ - \u{31}\ - \u{2044}\ - \u{36}\ - \u{35}\ - \u{2044}\ - \u{36}\ - \u{31}\ - \u{2044}\ - \u{38}\ - \u{33}\ - \u{2044}\ - \u{38}\ - \u{35}\ - \u{2044}\ - \u{38}\ - \u{37}\ - \u{2044}\ - \u{38}\ - \u{31}\ - \u{2044}\ - \u{69}\ - \u{69}\ - \u{69}\ - \u{69}\ - \u{69}\ - \u{69}\ - \u{76}\ - \u{76}\ - \u{69}\ - \u{76}\ - \u{69}\ - \u{69}\ - \u{76}\ - \u{69}\ - \u{69}\ - \u{69}\ - \u{69}\ - \u{78}\ - \u{78}\ - \u{69}\ - \u{78}\ - \u{69}\ - \u{69}\ - \u{30}\ - \u{2044}\ - \u{33}\ - \u{222b}\ - \u{222b}\ - \u{222b}\ - \u{222b}\ - \u{222b}\ - \u{222e}\ - \u{222e}\ - \u{222e}\ - \u{222e}\ - \u{222e}\ - \u{3008}\ - \u{3009}\ - \u{31}\ - \u{30}\ - \u{31}\ - \u{31}\ - \u{31}\ - \u{32}\ - \u{31}\ - \u{33}\ - \u{31}\ - \u{34}\ - \u{31}\ - \u{35}\ - \u{31}\ - \u{36}\ - \u{31}\ - \u{37}\ - \u{31}\ - \u{38}\ - \u{31}\ - \u{39}\ - \u{32}\ - \u{30}\ - \u{28}\ - \u{31}\ - \u{29}\ - \u{28}\ - \u{32}\ - \u{29}\ - \u{28}\ - \u{33}\ - \u{29}\ - \u{28}\ - \u{34}\ - \u{29}\ - \u{28}\ - \u{35}\ - \u{29}\ - \u{28}\ - \u{36}\ - \u{29}\ - \u{28}\ - \u{37}\ - \u{29}\ - \u{28}\ - \u{38}\ - \u{29}\ - \u{28}\ - \u{39}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{30}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{31}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{32}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{33}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{34}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{35}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{36}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{37}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{38}\ - \u{29}\ - \u{28}\ - \u{31}\ - \u{39}\ - \u{29}\ - \u{28}\ - \u{32}\ - \u{30}\ - \u{29}\ - \u{28}\ - \u{61}\ - \u{29}\ - \u{28}\ - \u{62}\ - \u{29}\ - \u{28}\ - \u{63}\ - \u{29}\ - \u{28}\ - \u{64}\ - \u{29}\ - \u{28}\ - \u{65}\ - \u{29}\ - \u{28}\ - \u{66}\ - \u{29}\ - \u{28}\ - \u{67}\ - \u{29}\ - \u{28}\ - \u{68}\ - \u{29}\ - \u{28}\ - \u{69}\ - \u{29}\ - \u{28}\ - \u{6a}\ - \u{29}\ - \u{28}\ - \u{6b}\ - \u{29}\ - \u{28}\ - \u{6c}\ - \u{29}\ - \u{28}\ - \u{6d}\ - \u{29}\ - \u{28}\ - \u{6e}\ - \u{29}\ - \u{28}\ - \u{6f}\ - \u{29}\ - \u{28}\ - \u{70}\ - \u{29}\ - \u{28}\ - \u{71}\ - \u{29}\ - \u{28}\ - \u{72}\ - \u{29}\ - \u{28}\ - \u{73}\ - \u{29}\ - \u{28}\ - \u{74}\ - \u{29}\ - \u{28}\ - \u{75}\ - \u{29}\ - \u{28}\ - \u{76}\ - \u{29}\ - \u{28}\ - \u{77}\ - \u{29}\ - \u{28}\ - \u{78}\ - \u{29}\ - \u{28}\ - \u{79}\ - \u{29}\ - \u{28}\ - \u{7a}\ - \u{29}\ - \u{222b}\ - \u{222b}\ - \u{222b}\ - \u{222b}\ - \u{3a}\ - \u{3a}\ - \u{3d}\ - \u{3d}\ - \u{3d}\ - \u{3d}\ - \u{3d}\ - \u{3d}\ - \u{2add}\ - \u{338}\ - \u{2c30}\ - \u{2c31}\ - \u{2c32}\ - \u{2c33}\ - \u{2c34}\ - \u{2c35}\ - \u{2c36}\ - \u{2c37}\ - \u{2c38}\ - \u{2c39}\ - \u{2c3a}\ - \u{2c3b}\ - \u{2c3c}\ - \u{2c3d}\ - \u{2c3e}\ - \u{2c3f}\ - \u{2c40}\ - \u{2c41}\ - \u{2c42}\ - \u{2c43}\ - \u{2c44}\ - \u{2c45}\ - \u{2c46}\ - \u{2c47}\ - \u{2c48}\ - \u{2c49}\ - \u{2c4a}\ - \u{2c4b}\ - \u{2c4c}\ - \u{2c4d}\ - \u{2c4e}\ - \u{2c4f}\ - \u{2c50}\ - \u{2c51}\ - \u{2c52}\ - \u{2c53}\ - \u{2c54}\ - \u{2c55}\ - \u{2c56}\ - \u{2c57}\ - \u{2c58}\ - \u{2c59}\ - \u{2c5a}\ - \u{2c5b}\ - \u{2c5c}\ - \u{2c5d}\ - \u{2c5e}\ - \u{2c61}\ - \u{26b}\ - \u{1d7d}\ - \u{27d}\ - \u{2c68}\ - \u{2c6a}\ - \u{2c6c}\ - \u{2c73}\ - \u{2c76}\ - \u{23f}\ - \u{240}\ - \u{2c81}\ - \u{2c83}\ - \u{2c85}\ - \u{2c87}\ - \u{2c89}\ - \u{2c8b}\ - \u{2c8d}\ - \u{2c8f}\ - \u{2c91}\ - \u{2c93}\ - \u{2c95}\ - \u{2c97}\ - \u{2c99}\ - \u{2c9b}\ - \u{2c9d}\ - \u{2c9f}\ - \u{2ca1}\ - \u{2ca3}\ - \u{2ca5}\ - \u{2ca7}\ - \u{2ca9}\ - \u{2cab}\ - \u{2cad}\ - \u{2caf}\ - \u{2cb1}\ - \u{2cb3}\ - \u{2cb5}\ - \u{2cb7}\ - \u{2cb9}\ - \u{2cbb}\ - \u{2cbd}\ - \u{2cbf}\ - \u{2cc1}\ - \u{2cc3}\ - \u{2cc5}\ - \u{2cc7}\ - \u{2cc9}\ - \u{2ccb}\ - \u{2ccd}\ - \u{2ccf}\ - \u{2cd1}\ - \u{2cd3}\ - \u{2cd5}\ - \u{2cd7}\ - \u{2cd9}\ - \u{2cdb}\ - \u{2cdd}\ - \u{2cdf}\ - \u{2ce1}\ - \u{2ce3}\ - \u{2cec}\ - \u{2cee}\ - \u{2cf3}\ - \u{2d61}\ - \u{6bcd}\ - \u{9f9f}\ - \u{4e00}\ - \u{4e28}\ - \u{4e36}\ - \u{4e3f}\ - \u{4e59}\ - \u{4e85}\ - \u{4e8c}\ - \u{4ea0}\ - \u{4eba}\ - \u{513f}\ - \u{5165}\ - \u{516b}\ - \u{5182}\ - \u{5196}\ - \u{51ab}\ - \u{51e0}\ - \u{51f5}\ - \u{5200}\ - \u{529b}\ - \u{52f9}\ - \u{5315}\ - \u{531a}\ - \u{5338}\ - \u{5341}\ - \u{535c}\ - \u{5369}\ - \u{5382}\ - \u{53b6}\ - \u{53c8}\ - \u{53e3}\ - \u{56d7}\ - \u{571f}\ - \u{58eb}\ - \u{5902}\ - \u{590a}\ - \u{5915}\ - \u{5927}\ - \u{5973}\ - \u{5b50}\ - \u{5b80}\ - \u{5bf8}\ - \u{5c0f}\ - \u{5c22}\ - \u{5c38}\ - \u{5c6e}\ - \u{5c71}\ - \u{5ddb}\ - \u{5de5}\ - \u{5df1}\ - \u{5dfe}\ - \u{5e72}\ - \u{5e7a}\ - \u{5e7f}\ - \u{5ef4}\ - \u{5efe}\ - \u{5f0b}\ - \u{5f13}\ - \u{5f50}\ - \u{5f61}\ - \u{5f73}\ - \u{5fc3}\ - \u{6208}\ - \u{6236}\ - \u{624b}\ - \u{652f}\ - \u{6534}\ - \u{6587}\ - \u{6597}\ - \u{65a4}\ - \u{65b9}\ - \u{65e0}\ - \u{65e5}\ - \u{66f0}\ - \u{6708}\ - \u{6728}\ - \u{6b20}\ - \u{6b62}\ - \u{6b79}\ - \u{6bb3}\ - \u{6bcb}\ - \u{6bd4}\ - \u{6bdb}\ - \u{6c0f}\ - \u{6c14}\ - \u{6c34}\ - \u{706b}\ - \u{722a}\ - \u{7236}\ - \u{723b}\ - \u{723f}\ - \u{7247}\ - \u{7259}\ - \u{725b}\ - \u{72ac}\ - \u{7384}\ - \u{7389}\ - \u{74dc}\ - \u{74e6}\ - \u{7518}\ - \u{751f}\ - \u{7528}\ - \u{7530}\ - \u{758b}\ - \u{7592}\ - \u{7676}\ - \u{767d}\ - \u{76ae}\ - \u{76bf}\ - \u{76ee}\ - \u{77db}\ - \u{77e2}\ - \u{77f3}\ - \u{793a}\ - \u{79b8}\ - \u{79be}\ - \u{7a74}\ - \u{7acb}\ - \u{7af9}\ - \u{7c73}\ - \u{7cf8}\ - \u{7f36}\ - \u{7f51}\ - \u{7f8a}\ - \u{7fbd}\ - \u{8001}\ - \u{800c}\ - \u{8012}\ - \u{8033}\ - \u{807f}\ - \u{8089}\ - \u{81e3}\ - \u{81ea}\ - \u{81f3}\ - \u{81fc}\ - \u{820c}\ - \u{821b}\ - \u{821f}\ - \u{826e}\ - \u{8272}\ - \u{8278}\ - \u{864d}\ - \u{866b}\ - \u{8840}\ - \u{884c}\ - \u{8863}\ - \u{897e}\ - \u{898b}\ - \u{89d2}\ - \u{8a00}\ - \u{8c37}\ - \u{8c46}\ - \u{8c55}\ - \u{8c78}\ - \u{8c9d}\ - \u{8d64}\ - \u{8d70}\ - \u{8db3}\ - \u{8eab}\ - \u{8eca}\ - \u{8f9b}\ - \u{8fb0}\ - \u{8fb5}\ - \u{9091}\ - \u{9149}\ - \u{91c6}\ - \u{91cc}\ - \u{91d1}\ - \u{9577}\ - \u{9580}\ - \u{961c}\ - \u{96b6}\ - \u{96b9}\ - \u{96e8}\ - \u{9751}\ - \u{975e}\ - \u{9762}\ - \u{9769}\ - \u{97cb}\ - \u{97ed}\ - \u{97f3}\ - \u{9801}\ - \u{98a8}\ - \u{98db}\ - \u{98df}\ - \u{9996}\ - \u{9999}\ - \u{99ac}\ - \u{9aa8}\ - \u{9ad8}\ - \u{9adf}\ - \u{9b25}\ - \u{9b2f}\ - \u{9b32}\ - \u{9b3c}\ - \u{9b5a}\ - \u{9ce5}\ - \u{9e75}\ - \u{9e7f}\ - \u{9ea5}\ - \u{9ebb}\ - \u{9ec3}\ - \u{9ecd}\ - \u{9ed1}\ - \u{9ef9}\ - \u{9efd}\ - \u{9f0e}\ - \u{9f13}\ - \u{9f20}\ - \u{9f3b}\ - \u{9f4a}\ - \u{9f52}\ - \u{9f8d}\ - \u{9f9c}\ - \u{9fa0}\ - \u{2e}\ - \u{3012}\ - \u{5344}\ - \u{5345}\ - \u{20}\ - \u{3099}\ - \u{20}\ - \u{309a}\ - \u{3088}\ - \u{308a}\ - \u{30b3}\ - \u{30c8}\ - \u{1100}\ - \u{1101}\ - \u{11aa}\ - \u{1102}\ - \u{11ac}\ - \u{11ad}\ - \u{1103}\ - \u{1104}\ - \u{1105}\ - \u{11b0}\ - \u{11b1}\ - \u{11b2}\ - \u{11b3}\ - \u{11b4}\ - \u{11b5}\ - \u{111a}\ - \u{1106}\ - \u{1107}\ - \u{1108}\ - \u{1121}\ - \u{1109}\ - \u{110a}\ - \u{110b}\ - \u{110c}\ - \u{110d}\ - \u{110e}\ - \u{110f}\ - \u{1110}\ - \u{1111}\ - \u{1112}\ - \u{1161}\ - \u{1162}\ - \u{1163}\ - \u{1164}\ - \u{1165}\ - \u{1166}\ - \u{1167}\ - \u{1168}\ - \u{1169}\ - \u{116a}\ - \u{116b}\ - \u{116c}\ - \u{116d}\ - \u{116e}\ - \u{116f}\ - \u{1170}\ - \u{1171}\ - \u{1172}\ - \u{1173}\ - \u{1174}\ - \u{1175}\ - \u{1114}\ - \u{1115}\ - \u{11c7}\ - \u{11c8}\ - \u{11cc}\ - \u{11ce}\ - \u{11d3}\ - \u{11d7}\ - \u{11d9}\ - \u{111c}\ - \u{11dd}\ - \u{11df}\ - \u{111d}\ - \u{111e}\ - \u{1120}\ - \u{1122}\ - \u{1123}\ - \u{1127}\ - \u{1129}\ - \u{112b}\ - \u{112c}\ - \u{112d}\ - \u{112e}\ - \u{112f}\ - \u{1132}\ - \u{1136}\ - \u{1140}\ - \u{1147}\ - \u{114c}\ - \u{11f1}\ - \u{11f2}\ - \u{1157}\ - \u{1158}\ - \u{1159}\ - \u{1184}\ - \u{1185}\ - \u{1188}\ - \u{1191}\ - \u{1192}\ - \u{1194}\ - \u{119e}\ - \u{11a1}\ - \u{4e09}\ - \u{56db}\ - \u{4e0a}\ - \u{4e2d}\ - \u{4e0b}\ - \u{7532}\ - \u{4e19}\ - \u{4e01}\ - \u{5929}\ - \u{5730}\ - \u{28}\ - \u{1100}\ - \u{29}\ - \u{28}\ - \u{1102}\ - \u{29}\ - \u{28}\ - \u{1103}\ - \u{29}\ - \u{28}\ - \u{1105}\ - \u{29}\ - \u{28}\ - \u{1106}\ - \u{29}\ - \u{28}\ - \u{1107}\ - \u{29}\ - \u{28}\ - \u{1109}\ - \u{29}\ - \u{28}\ - \u{110b}\ - \u{29}\ - \u{28}\ - \u{110c}\ - \u{29}\ - \u{28}\ - \u{110e}\ - \u{29}\ - \u{28}\ - \u{110f}\ - \u{29}\ - \u{28}\ - \u{1110}\ - \u{29}\ - \u{28}\ - \u{1111}\ - \u{29}\ - \u{28}\ - \u{1112}\ - \u{29}\ - \u{28}\ - \u{ac00}\ - \u{29}\ - \u{28}\ - \u{b098}\ - \u{29}\ - \u{28}\ - \u{b2e4}\ - \u{29}\ - \u{28}\ - \u{b77c}\ - \u{29}\ - \u{28}\ - \u{b9c8}\ - \u{29}\ - \u{28}\ - \u{bc14}\ - \u{29}\ - \u{28}\ - \u{c0ac}\ - \u{29}\ - \u{28}\ - \u{c544}\ - \u{29}\ - \u{28}\ - \u{c790}\ - \u{29}\ - \u{28}\ - \u{cc28}\ - \u{29}\ - \u{28}\ - \u{ce74}\ - \u{29}\ - \u{28}\ - \u{d0c0}\ - \u{29}\ - \u{28}\ - \u{d30c}\ - \u{29}\ - \u{28}\ - \u{d558}\ - \u{29}\ - \u{28}\ - \u{c8fc}\ - \u{29}\ - \u{28}\ - \u{c624}\ - \u{c804}\ - \u{29}\ - \u{28}\ - \u{c624}\ - \u{d6c4}\ - \u{29}\ - \u{28}\ - \u{4e00}\ - \u{29}\ - \u{28}\ - \u{4e8c}\ - \u{29}\ - \u{28}\ - \u{4e09}\ - \u{29}\ - \u{28}\ - \u{56db}\ - \u{29}\ - \u{28}\ - \u{4e94}\ - \u{29}\ - \u{28}\ - \u{516d}\ - \u{29}\ - \u{28}\ - \u{4e03}\ - \u{29}\ - \u{28}\ - \u{516b}\ - \u{29}\ - \u{28}\ - \u{4e5d}\ - \u{29}\ - \u{28}\ - \u{5341}\ - \u{29}\ - \u{28}\ - \u{6708}\ - \u{29}\ - \u{28}\ - \u{706b}\ - \u{29}\ - \u{28}\ - \u{6c34}\ - \u{29}\ - \u{28}\ - \u{6728}\ - \u{29}\ - \u{28}\ - \u{91d1}\ - \u{29}\ - \u{28}\ - \u{571f}\ - \u{29}\ - \u{28}\ - \u{65e5}\ - \u{29}\ - \u{28}\ - \u{682a}\ - \u{29}\ - \u{28}\ - \u{6709}\ - \u{29}\ - \u{28}\ - \u{793e}\ - \u{29}\ - \u{28}\ - \u{540d}\ - \u{29}\ - \u{28}\ - \u{7279}\ - \u{29}\ - \u{28}\ - \u{8ca1}\ - \u{29}\ - \u{28}\ - \u{795d}\ - \u{29}\ - \u{28}\ - \u{52b4}\ - \u{29}\ - \u{28}\ - \u{4ee3}\ - \u{29}\ - \u{28}\ - \u{547c}\ - \u{29}\ - \u{28}\ - \u{5b66}\ - \u{29}\ - \u{28}\ - \u{76e3}\ - \u{29}\ - \u{28}\ - \u{4f01}\ - \u{29}\ - \u{28}\ - \u{8cc7}\ - \u{29}\ - \u{28}\ - \u{5354}\ - \u{29}\ - \u{28}\ - \u{796d}\ - \u{29}\ - \u{28}\ - \u{4f11}\ - \u{29}\ - \u{28}\ - \u{81ea}\ - \u{29}\ - \u{28}\ - \u{81f3}\ - \u{29}\ - \u{554f}\ - \u{5e7c}\ - \u{7b8f}\ - \u{70}\ - \u{74}\ - \u{65}\ - \u{32}\ - \u{31}\ - \u{32}\ - \u{32}\ - \u{32}\ - \u{33}\ - \u{32}\ - \u{34}\ - \u{32}\ - \u{35}\ - \u{32}\ - \u{36}\ - \u{32}\ - \u{37}\ - \u{32}\ - \u{38}\ - \u{32}\ - \u{39}\ - \u{33}\ - \u{30}\ - \u{33}\ - \u{31}\ - \u{33}\ - \u{32}\ - \u{33}\ - \u{33}\ - \u{33}\ - \u{34}\ - \u{33}\ - \u{35}\ - \u{ac00}\ - \u{b098}\ - \u{b2e4}\ - \u{b77c}\ - \u{b9c8}\ - \u{bc14}\ - \u{c0ac}\ - \u{c544}\ - \u{c790}\ - \u{cc28}\ - \u{ce74}\ - \u{d0c0}\ - \u{d30c}\ - \u{d558}\ - \u{cc38}\ - \u{ace0}\ - \u{c8fc}\ - \u{c758}\ - \u{c6b0}\ - \u{4e94}\ - \u{516d}\ - \u{4e03}\ - \u{4e5d}\ - \u{682a}\ - \u{6709}\ - \u{793e}\ - \u{540d}\ - \u{7279}\ - \u{8ca1}\ - \u{795d}\ - \u{52b4}\ - \u{79d8}\ - \u{7537}\ - \u{9069}\ - \u{512a}\ - \u{5370}\ - \u{6ce8}\ - \u{9805}\ - \u{4f11}\ - \u{5199}\ - \u{6b63}\ - \u{5de6}\ - \u{53f3}\ - \u{533b}\ - \u{5b97}\ - \u{5b66}\ - \u{76e3}\ - \u{4f01}\ - \u{8cc7}\ - \u{5354}\ - \u{591c}\ - \u{33}\ - \u{36}\ - \u{33}\ - \u{37}\ - \u{33}\ - \u{38}\ - \u{33}\ - \u{39}\ - \u{34}\ - \u{30}\ - \u{34}\ - \u{31}\ - \u{34}\ - \u{32}\ - \u{34}\ - \u{33}\ - \u{34}\ - \u{34}\ - \u{34}\ - \u{35}\ - \u{34}\ - \u{36}\ - \u{34}\ - \u{37}\ - \u{34}\ - \u{38}\ - \u{34}\ - \u{39}\ - \u{35}\ - \u{30}\ - \u{31}\ - \u{6708}\ - \u{32}\ - \u{6708}\ - \u{33}\ - \u{6708}\ - \u{34}\ - \u{6708}\ - \u{35}\ - \u{6708}\ - \u{36}\ - \u{6708}\ - \u{37}\ - \u{6708}\ - \u{38}\ - \u{6708}\ - \u{39}\ - \u{6708}\ - \u{31}\ - \u{30}\ - \u{6708}\ - \u{31}\ - \u{31}\ - \u{6708}\ - \u{31}\ - \u{32}\ - \u{6708}\ - \u{68}\ - \u{67}\ - \u{65}\ - \u{72}\ - \u{67}\ - \u{65}\ - \u{76}\ - \u{6c}\ - \u{74}\ - \u{64}\ - \u{30a2}\ - \u{30a4}\ - \u{30a6}\ - \u{30a8}\ - \u{30aa}\ - \u{30ab}\ - \u{30ad}\ - \u{30af}\ - \u{30b1}\ - \u{30b3}\ - \u{30b5}\ - \u{30b7}\ - \u{30b9}\ - \u{30bb}\ - \u{30bd}\ - \u{30bf}\ - \u{30c1}\ - \u{30c4}\ - \u{30c6}\ - \u{30c8}\ - \u{30ca}\ - \u{30cb}\ - \u{30cc}\ - \u{30cd}\ - \u{30ce}\ - \u{30cf}\ - \u{30d2}\ - \u{30d5}\ - \u{30d8}\ - \u{30db}\ - \u{30de}\ - \u{30df}\ - \u{30e0}\ - \u{30e1}\ - \u{30e2}\ - \u{30e4}\ - \u{30e6}\ - \u{30e8}\ - \u{30e9}\ - \u{30ea}\ - \u{30eb}\ - \u{30ec}\ - \u{30ed}\ - \u{30ef}\ - \u{30f0}\ - \u{30f1}\ - \u{30f2}\ - \u{30a2}\ - \u{30d1}\ - \u{30fc}\ - \u{30c8}\ - \u{30a2}\ - \u{30eb}\ - \u{30d5}\ - \u{30a1}\ - \u{30a2}\ - \u{30f3}\ - \u{30da}\ - \u{30a2}\ - \u{30a2}\ - \u{30fc}\ - \u{30eb}\ - \u{30a4}\ - \u{30cb}\ - \u{30f3}\ - \u{30b0}\ - \u{30a4}\ - \u{30f3}\ - \u{30c1}\ - \u{30a6}\ - \u{30a9}\ - \u{30f3}\ - \u{30a8}\ - \u{30b9}\ - \u{30af}\ - \u{30fc}\ - \u{30c9}\ - \u{30a8}\ - \u{30fc}\ - \u{30ab}\ - \u{30fc}\ - \u{30aa}\ - \u{30f3}\ - \u{30b9}\ - \u{30aa}\ - \u{30fc}\ - \u{30e0}\ - \u{30ab}\ - \u{30a4}\ - \u{30ea}\ - \u{30ab}\ - \u{30e9}\ - \u{30c3}\ - \u{30c8}\ - \u{30ab}\ - \u{30ed}\ - \u{30ea}\ - \u{30fc}\ - \u{30ac}\ - \u{30ed}\ - \u{30f3}\ - \u{30ac}\ - \u{30f3}\ - \u{30de}\ - \u{30ae}\ - \u{30ac}\ - \u{30ae}\ - \u{30cb}\ - \u{30fc}\ - \u{30ad}\ - \u{30e5}\ - \u{30ea}\ - \u{30fc}\ - \u{30ae}\ - \u{30eb}\ - \u{30c0}\ - \u{30fc}\ - \u{30ad}\ - \u{30ed}\ - \u{30ad}\ - \u{30ed}\ - \u{30b0}\ - \u{30e9}\ - \u{30e0}\ - \u{30ad}\ - \u{30ed}\ - \u{30e1}\ - \u{30fc}\ - \u{30c8}\ - \u{30eb}\ - \u{30ad}\ - \u{30ed}\ - \u{30ef}\ - \u{30c3}\ - \u{30c8}\ - \u{30b0}\ - \u{30e9}\ - \u{30e0}\ - \u{30b0}\ - \u{30e9}\ - \u{30e0}\ - \u{30c8}\ - \u{30f3}\ - \u{30af}\ - \u{30eb}\ - \u{30bc}\ - \u{30a4}\ - \u{30ed}\ - \u{30af}\ - \u{30ed}\ - \u{30fc}\ - \u{30cd}\ - \u{30b1}\ - \u{30fc}\ - \u{30b9}\ - \u{30b3}\ - \u{30eb}\ - \u{30ca}\ - \u{30b3}\ - \u{30fc}\ - \u{30dd}\ - \u{30b5}\ - \u{30a4}\ - \u{30af}\ - \u{30eb}\ - \u{30b5}\ - \u{30f3}\ - \u{30c1}\ - \u{30fc}\ - \u{30e0}\ - \u{30b7}\ - \u{30ea}\ - \u{30f3}\ - \u{30b0}\ - \u{30bb}\ - \u{30f3}\ - \u{30c1}\ - \u{30bb}\ - \u{30f3}\ - \u{30c8}\ - \u{30c0}\ - \u{30fc}\ - \u{30b9}\ - \u{30c7}\ - \u{30b7}\ - \u{30c9}\ - \u{30eb}\ - \u{30c8}\ - \u{30f3}\ - \u{30ca}\ - \u{30ce}\ - \u{30ce}\ - \u{30c3}\ - \u{30c8}\ - \u{30cf}\ - \u{30a4}\ - \u{30c4}\ - \u{30d1}\ - \u{30fc}\ - \u{30bb}\ - \u{30f3}\ - \u{30c8}\ - \u{30d1}\ - \u{30fc}\ - \u{30c4}\ - \u{30d0}\ - \u{30fc}\ - \u{30ec}\ - \u{30eb}\ - \u{30d4}\ - \u{30a2}\ - \u{30b9}\ - \u{30c8}\ - \u{30eb}\ - \u{30d4}\ - \u{30af}\ - \u{30eb}\ - \u{30d4}\ - \u{30b3}\ - \u{30d3}\ - \u{30eb}\ - \u{30d5}\ - \u{30a1}\ - \u{30e9}\ - \u{30c3}\ - \u{30c9}\ - \u{30d5}\ - \u{30a3}\ - \u{30fc}\ - \u{30c8}\ - \u{30d6}\ - \u{30c3}\ - \u{30b7}\ - \u{30a7}\ - \u{30eb}\ - \u{30d5}\ - \u{30e9}\ - \u{30f3}\ - \u{30d8}\ - \u{30af}\ - \u{30bf}\ - \u{30fc}\ - \u{30eb}\ - \u{30da}\ - \u{30bd}\ - \u{30da}\ - \u{30cb}\ - \u{30d2}\ - \u{30d8}\ - \u{30eb}\ - \u{30c4}\ - \u{30da}\ - \u{30f3}\ - \u{30b9}\ - \u{30da}\ - \u{30fc}\ - \u{30b8}\ - \u{30d9}\ - \u{30fc}\ - \u{30bf}\ - \u{30dd}\ - \u{30a4}\ - \u{30f3}\ - \u{30c8}\ - \u{30dc}\ - \u{30eb}\ - \u{30c8}\ - \u{30db}\ - \u{30f3}\ - \u{30dd}\ - \u{30f3}\ - \u{30c9}\ - \u{30db}\ - \u{30fc}\ - \u{30eb}\ - \u{30db}\ - \u{30fc}\ - \u{30f3}\ - \u{30de}\ - \u{30a4}\ - \u{30af}\ - \u{30ed}\ - \u{30de}\ - \u{30a4}\ - \u{30eb}\ - \u{30de}\ - \u{30c3}\ - \u{30cf}\ - \u{30de}\ - \u{30eb}\ - \u{30af}\ - \u{30de}\ - \u{30f3}\ - \u{30b7}\ - \u{30e7}\ - \u{30f3}\ - \u{30df}\ - \u{30af}\ - \u{30ed}\ - \u{30f3}\ - \u{30df}\ - \u{30ea}\ - \u{30df}\ - \u{30ea}\ - \u{30d0}\ - \u{30fc}\ - \u{30eb}\ - \u{30e1}\ - \u{30ac}\ - \u{30e1}\ - \u{30ac}\ - \u{30c8}\ - \u{30f3}\ - \u{30e1}\ - \u{30fc}\ - \u{30c8}\ - \u{30eb}\ - \u{30e4}\ - \u{30fc}\ - \u{30c9}\ - \u{30e4}\ - \u{30fc}\ - \u{30eb}\ - \u{30e6}\ - \u{30a2}\ - \u{30f3}\ - \u{30ea}\ - \u{30c3}\ - \u{30c8}\ - \u{30eb}\ - \u{30ea}\ - \u{30e9}\ - \u{30eb}\ - \u{30d4}\ - \u{30fc}\ - \u{30eb}\ - \u{30fc}\ - \u{30d6}\ - \u{30eb}\ - \u{30ec}\ - \u{30e0}\ - \u{30ec}\ - \u{30f3}\ - \u{30c8}\ - \u{30b2}\ - \u{30f3}\ - \u{30ef}\ - \u{30c3}\ - \u{30c8}\ - \u{30}\ - \u{70b9}\ - \u{31}\ - \u{70b9}\ - \u{32}\ - \u{70b9}\ - \u{33}\ - \u{70b9}\ - \u{34}\ - \u{70b9}\ - \u{35}\ - \u{70b9}\ - \u{36}\ - \u{70b9}\ - \u{37}\ - \u{70b9}\ - \u{38}\ - \u{70b9}\ - \u{39}\ - \u{70b9}\ - \u{31}\ - \u{30}\ - \u{70b9}\ - \u{31}\ - \u{31}\ - \u{70b9}\ - \u{31}\ - \u{32}\ - \u{70b9}\ - \u{31}\ - \u{33}\ - \u{70b9}\ - \u{31}\ - \u{34}\ - \u{70b9}\ - \u{31}\ - \u{35}\ - \u{70b9}\ - \u{31}\ - \u{36}\ - \u{70b9}\ - \u{31}\ - \u{37}\ - \u{70b9}\ - \u{31}\ - \u{38}\ - \u{70b9}\ - \u{31}\ - \u{39}\ - \u{70b9}\ - \u{32}\ - \u{30}\ - \u{70b9}\ - \u{32}\ - \u{31}\ - \u{70b9}\ - \u{32}\ - \u{32}\ - \u{70b9}\ - \u{32}\ - \u{33}\ - \u{70b9}\ - \u{32}\ - \u{34}\ - \u{70b9}\ - \u{68}\ - \u{70}\ - \u{61}\ - \u{64}\ - \u{61}\ - \u{61}\ - \u{75}\ - \u{62}\ - \u{61}\ - \u{72}\ - \u{6f}\ - \u{76}\ - \u{70}\ - \u{63}\ - \u{64}\ - \u{6d}\ - \u{64}\ - \u{6d}\ - \u{32}\ - \u{64}\ - \u{6d}\ - \u{33}\ - \u{69}\ - \u{75}\ - \u{5e73}\ - \u{6210}\ - \u{662d}\ - \u{548c}\ - \u{5927}\ - \u{6b63}\ - \u{660e}\ - \u{6cbb}\ - \u{682a}\ - \u{5f0f}\ - \u{4f1a}\ - \u{793e}\ - \u{70}\ - \u{61}\ - \u{6e}\ - \u{61}\ - \u{3bc}\ - \u{61}\ - \u{6d}\ - \u{61}\ - \u{6b}\ - \u{61}\ - \u{6b}\ - \u{62}\ - \u{6d}\ - \u{62}\ - \u{67}\ - \u{62}\ - \u{63}\ - \u{61}\ - \u{6c}\ - \u{6b}\ - \u{63}\ - \u{61}\ - \u{6c}\ - \u{70}\ - \u{66}\ - \u{6e}\ - \u{66}\ - \u{3bc}\ - \u{66}\ - \u{3bc}\ - \u{67}\ - \u{6d}\ - \u{67}\ - \u{6b}\ - \u{67}\ - \u{68}\ - \u{7a}\ - \u{6b}\ - \u{68}\ - \u{7a}\ - \u{6d}\ - \u{68}\ - \u{7a}\ - \u{67}\ - \u{68}\ - \u{7a}\ - \u{74}\ - \u{68}\ - \u{7a}\ - \u{3bc}\ - \u{6c}\ - \u{6d}\ - \u{6c}\ - \u{64}\ - \u{6c}\ - \u{6b}\ - \u{6c}\ - \u{66}\ - \u{6d}\ - \u{6e}\ - \u{6d}\ - \u{3bc}\ - \u{6d}\ - \u{6d}\ - \u{6d}\ - \u{63}\ - \u{6d}\ - \u{6b}\ - \u{6d}\ - \u{6d}\ - \u{6d}\ - \u{32}\ - \u{63}\ - \u{6d}\ - \u{32}\ - \u{6d}\ - \u{32}\ - \u{6b}\ - \u{6d}\ - \u{32}\ - \u{6d}\ - \u{6d}\ - \u{33}\ - \u{63}\ - \u{6d}\ - \u{33}\ - \u{6d}\ - \u{33}\ - \u{6b}\ - \u{6d}\ - \u{33}\ - \u{6d}\ - \u{2215}\ - \u{73}\ - \u{6d}\ - \u{2215}\ - \u{73}\ - \u{32}\ - \u{6b}\ - \u{70}\ - \u{61}\ - \u{6d}\ - \u{70}\ - \u{61}\ - \u{67}\ - \u{70}\ - \u{61}\ - \u{72}\ - \u{61}\ - \u{64}\ - \u{72}\ - \u{61}\ - \u{64}\ - \u{2215}\ - \u{73}\ - \u{72}\ - \u{61}\ - \u{64}\ - \u{2215}\ - \u{73}\ - \u{32}\ - \u{70}\ - \u{73}\ - \u{6e}\ - \u{73}\ - \u{3bc}\ - \u{73}\ - \u{6d}\ - \u{73}\ - \u{70}\ - \u{76}\ - \u{6e}\ - \u{76}\ - \u{3bc}\ - \u{76}\ - \u{6d}\ - \u{76}\ - \u{6b}\ - \u{76}\ - \u{70}\ - \u{77}\ - \u{6e}\ - \u{77}\ - \u{3bc}\ - \u{77}\ - \u{6d}\ - \u{77}\ - \u{6b}\ - \u{77}\ - \u{6b}\ - \u{3c9}\ - \u{6d}\ - \u{3c9}\ - \u{62}\ - \u{71}\ - \u{63}\ - \u{63}\ - \u{63}\ - \u{64}\ - \u{63}\ - \u{2215}\ - \u{6b}\ - \u{67}\ - \u{64}\ - \u{62}\ - \u{67}\ - \u{79}\ - \u{68}\ - \u{61}\ - \u{68}\ - \u{70}\ - \u{69}\ - \u{6e}\ - \u{6b}\ - \u{6b}\ - \u{6b}\ - \u{74}\ - \u{6c}\ - \u{6d}\ - \u{6c}\ - \u{6e}\ - \u{6c}\ - \u{6f}\ - \u{67}\ - \u{6c}\ - \u{78}\ - \u{6d}\ - \u{69}\ - \u{6c}\ - \u{6d}\ - \u{6f}\ - \u{6c}\ - \u{70}\ - \u{68}\ - \u{70}\ - \u{70}\ - \u{6d}\ - \u{70}\ - \u{72}\ - \u{73}\ - \u{72}\ - \u{73}\ - \u{76}\ - \u{77}\ - \u{62}\ - \u{76}\ - \u{2215}\ - \u{6d}\ - \u{61}\ - \u{2215}\ - \u{6d}\ - \u{31}\ - \u{65e5}\ - \u{32}\ - \u{65e5}\ - \u{33}\ - \u{65e5}\ - \u{34}\ - \u{65e5}\ - \u{35}\ - \u{65e5}\ - \u{36}\ - \u{65e5}\ - \u{37}\ - \u{65e5}\ - \u{38}\ - \u{65e5}\ - \u{39}\ - \u{65e5}\ - \u{31}\ - \u{30}\ - \u{65e5}\ - \u{31}\ - \u{31}\ - \u{65e5}\ - \u{31}\ - \u{32}\ - \u{65e5}\ - \u{31}\ - \u{33}\ - \u{65e5}\ - \u{31}\ - \u{34}\ - \u{65e5}\ - \u{31}\ - \u{35}\ - \u{65e5}\ - \u{31}\ - \u{36}\ - \u{65e5}\ - \u{31}\ - \u{37}\ - \u{65e5}\ - \u{31}\ - \u{38}\ - \u{65e5}\ - \u{31}\ - \u{39}\ - \u{65e5}\ - \u{32}\ - \u{30}\ - \u{65e5}\ - \u{32}\ - \u{31}\ - \u{65e5}\ - \u{32}\ - \u{32}\ - \u{65e5}\ - \u{32}\ - \u{33}\ - \u{65e5}\ - \u{32}\ - \u{34}\ - \u{65e5}\ - \u{32}\ - \u{35}\ - \u{65e5}\ - \u{32}\ - \u{36}\ - \u{65e5}\ - \u{32}\ - \u{37}\ - \u{65e5}\ - \u{32}\ - \u{38}\ - \u{65e5}\ - \u{32}\ - \u{39}\ - \u{65e5}\ - \u{33}\ - \u{30}\ - \u{65e5}\ - \u{33}\ - \u{31}\ - \u{65e5}\ - \u{67}\ - \u{61}\ - \u{6c}\ - \u{a641}\ - \u{a643}\ - \u{a645}\ - \u{a647}\ - \u{a649}\ - \u{a64d}\ - \u{a64f}\ - \u{a651}\ - \u{a653}\ - \u{a655}\ - \u{a657}\ - \u{a659}\ - \u{a65b}\ - \u{a65d}\ - \u{a65f}\ - \u{a661}\ - \u{a663}\ - \u{a665}\ - \u{a667}\ - \u{a669}\ - \u{a66b}\ - \u{a66d}\ - \u{a681}\ - \u{a683}\ - \u{a685}\ - \u{a687}\ - \u{a689}\ - \u{a68b}\ - \u{a68d}\ - \u{a68f}\ - \u{a691}\ - \u{a693}\ - \u{a695}\ - \u{a697}\ - \u{a699}\ - \u{a69b}\ - \u{a723}\ - \u{a725}\ - \u{a727}\ - \u{a729}\ - \u{a72b}\ - \u{a72d}\ - \u{a72f}\ - \u{a733}\ - \u{a735}\ - \u{a737}\ - \u{a739}\ - \u{a73b}\ - \u{a73d}\ - \u{a73f}\ - \u{a741}\ - \u{a743}\ - \u{a745}\ - \u{a747}\ - \u{a749}\ - \u{a74b}\ - \u{a74d}\ - \u{a74f}\ - \u{a751}\ - \u{a753}\ - \u{a755}\ - \u{a757}\ - \u{a759}\ - \u{a75b}\ - \u{a75d}\ - \u{a75f}\ - \u{a761}\ - \u{a763}\ - \u{a765}\ - \u{a767}\ - \u{a769}\ - \u{a76b}\ - \u{a76d}\ - \u{a76f}\ - \u{a77a}\ - \u{a77c}\ - \u{1d79}\ - \u{a77f}\ - \u{a781}\ - \u{a783}\ - \u{a785}\ - \u{a787}\ - \u{a78c}\ - \u{a791}\ - \u{a793}\ - \u{a797}\ - \u{a799}\ - \u{a79b}\ - \u{a79d}\ - \u{a79f}\ - \u{a7a1}\ - \u{a7a3}\ - \u{a7a5}\ - \u{a7a7}\ - \u{a7a9}\ - \u{26c}\ - \u{29e}\ - \u{287}\ - \u{ab53}\ - \u{a7b5}\ - \u{a7b7}\ - \u{ab37}\ - \u{ab52}\ - \u{13a0}\ - \u{13a1}\ - \u{13a2}\ - \u{13a3}\ - \u{13a4}\ - \u{13a5}\ - \u{13a6}\ - \u{13a7}\ - \u{13a8}\ - \u{13a9}\ - \u{13aa}\ - \u{13ab}\ - \u{13ac}\ - \u{13ad}\ - \u{13ae}\ - \u{13af}\ - \u{13b0}\ - \u{13b1}\ - \u{13b2}\ - \u{13b3}\ - \u{13b4}\ - \u{13b5}\ - \u{13b6}\ - \u{13b7}\ - \u{13b8}\ - \u{13b9}\ - \u{13ba}\ - \u{13bb}\ - \u{13bc}\ - \u{13bd}\ - \u{13be}\ - \u{13bf}\ - \u{13c0}\ - \u{13c1}\ - \u{13c2}\ - \u{13c3}\ - \u{13c4}\ - \u{13c5}\ - \u{13c6}\ - \u{13c7}\ - \u{13c8}\ - \u{13c9}\ - \u{13ca}\ - \u{13cb}\ - \u{13cc}\ - \u{13cd}\ - \u{13ce}\ - \u{13cf}\ - \u{13d0}\ - \u{13d1}\ - \u{13d2}\ - \u{13d3}\ - \u{13d4}\ - \u{13d5}\ - \u{13d6}\ - \u{13d7}\ - \u{13d8}\ - \u{13d9}\ - \u{13da}\ - \u{13db}\ - \u{13dc}\ - \u{13dd}\ - \u{13de}\ - \u{13df}\ - \u{13e0}\ - \u{13e1}\ - \u{13e2}\ - \u{13e3}\ - \u{13e4}\ - \u{13e5}\ - \u{13e6}\ - \u{13e7}\ - \u{13e8}\ - \u{13e9}\ - \u{13ea}\ - \u{13eb}\ - \u{13ec}\ - \u{13ed}\ - \u{13ee}\ - \u{13ef}\ - \u{8c48}\ - \u{66f4}\ - \u{8cc8}\ - \u{6ed1}\ - \u{4e32}\ - \u{53e5}\ - \u{5951}\ - \u{5587}\ - \u{5948}\ - \u{61f6}\ - \u{7669}\ - \u{7f85}\ - \u{863f}\ - \u{87ba}\ - \u{88f8}\ - \u{908f}\ - \u{6a02}\ - \u{6d1b}\ - \u{70d9}\ - \u{73de}\ - \u{843d}\ - \u{916a}\ - \u{99f1}\ - \u{4e82}\ - \u{5375}\ - \u{6b04}\ - \u{721b}\ - \u{862d}\ - \u{9e1e}\ - \u{5d50}\ - \u{6feb}\ - \u{85cd}\ - \u{8964}\ - \u{62c9}\ - \u{81d8}\ - \u{881f}\ - \u{5eca}\ - \u{6717}\ - \u{6d6a}\ - \u{72fc}\ - \u{90ce}\ - \u{4f86}\ - \u{51b7}\ - \u{52de}\ - \u{64c4}\ - \u{6ad3}\ - \u{7210}\ - \u{76e7}\ - \u{8606}\ - \u{865c}\ - \u{8def}\ - \u{9732}\ - \u{9b6f}\ - \u{9dfa}\ - \u{788c}\ - \u{797f}\ - \u{7da0}\ - \u{83c9}\ - \u{9304}\ - \u{8ad6}\ - \u{58df}\ - \u{5f04}\ - \u{7c60}\ - \u{807e}\ - \u{7262}\ - \u{78ca}\ - \u{8cc2}\ - \u{96f7}\ - \u{58d8}\ - \u{5c62}\ - \u{6a13}\ - \u{6dda}\ - \u{6f0f}\ - \u{7d2f}\ - \u{7e37}\ - \u{964b}\ - \u{52d2}\ - \u{808b}\ - \u{51dc}\ - \u{51cc}\ - \u{7a1c}\ - \u{7dbe}\ - \u{83f1}\ - \u{9675}\ - \u{8b80}\ - \u{62cf}\ - \u{8afe}\ - \u{4e39}\ - \u{5be7}\ - \u{6012}\ - \u{7387}\ - \u{7570}\ - \u{5317}\ - \u{78fb}\ - \u{4fbf}\ - \u{5fa9}\ - \u{4e0d}\ - \u{6ccc}\ - \u{6578}\ - \u{7d22}\ - \u{53c3}\ - \u{585e}\ - \u{7701}\ - \u{8449}\ - \u{8aaa}\ - \u{6bba}\ - \u{6c88}\ - \u{62fe}\ - \u{82e5}\ - \u{63a0}\ - \u{7565}\ - \u{4eae}\ - \u{5169}\ - \u{51c9}\ - \u{6881}\ - \u{7ce7}\ - \u{826f}\ - \u{8ad2}\ - \u{91cf}\ - \u{52f5}\ - \u{5442}\ - \u{5eec}\ - \u{65c5}\ - \u{6ffe}\ - \u{792a}\ - \u{95ad}\ - \u{9a6a}\ - \u{9e97}\ - \u{9ece}\ - \u{66c6}\ - \u{6b77}\ - \u{8f62}\ - \u{5e74}\ - \u{6190}\ - \u{6200}\ - \u{649a}\ - \u{6f23}\ - \u{7149}\ - \u{7489}\ - \u{79ca}\ - \u{7df4}\ - \u{806f}\ - \u{8f26}\ - \u{84ee}\ - \u{9023}\ - \u{934a}\ - \u{5217}\ - \u{52a3}\ - \u{54bd}\ - \u{70c8}\ - \u{88c2}\ - \u{5ec9}\ - \u{5ff5}\ - \u{637b}\ - \u{6bae}\ - \u{7c3e}\ - \u{7375}\ - \u{4ee4}\ - \u{56f9}\ - \u{5dba}\ - \u{601c}\ - \u{73b2}\ - \u{7469}\ - \u{7f9a}\ - \u{8046}\ - \u{9234}\ - \u{96f6}\ - \u{9748}\ - \u{9818}\ - \u{4f8b}\ - \u{79ae}\ - \u{91b4}\ - \u{96b8}\ - \u{60e1}\ - \u{4e86}\ - \u{50da}\ - \u{5bee}\ - \u{5c3f}\ - \u{6599}\ - \u{71ce}\ - \u{7642}\ - \u{84fc}\ - \u{907c}\ - \u{6688}\ - \u{962e}\ - \u{5289}\ - \u{677b}\ - \u{67f3}\ - \u{6d41}\ - \u{6e9c}\ - \u{7409}\ - \u{7559}\ - \u{786b}\ - \u{7d10}\ - \u{985e}\ - \u{622e}\ - \u{9678}\ - \u{502b}\ - \u{5d19}\ - \u{6dea}\ - \u{8f2a}\ - \u{5f8b}\ - \u{6144}\ - \u{6817}\ - \u{9686}\ - \u{5229}\ - \u{540f}\ - \u{5c65}\ - \u{6613}\ - \u{674e}\ - \u{68a8}\ - \u{6ce5}\ - \u{7406}\ - \u{75e2}\ - \u{7f79}\ - \u{88cf}\ - \u{88e1}\ - \u{96e2}\ - \u{533f}\ - \u{6eba}\ - \u{541d}\ - \u{71d0}\ - \u{7498}\ - \u{85fa}\ - \u{96a3}\ - \u{9c57}\ - \u{9e9f}\ - \u{6797}\ - \u{6dcb}\ - \u{81e8}\ - \u{7b20}\ - \u{7c92}\ - \u{72c0}\ - \u{7099}\ - \u{8b58}\ - \u{4ec0}\ - \u{8336}\ - \u{523a}\ - \u{5207}\ - \u{5ea6}\ - \u{62d3}\ - \u{7cd6}\ - \u{5b85}\ - \u{6d1e}\ - \u{66b4}\ - \u{8f3b}\ - \u{964d}\ - \u{5ed3}\ - \u{5140}\ - \u{55c0}\ - \u{585a}\ - \u{6674}\ - \u{51de}\ - \u{732a}\ - \u{76ca}\ - \u{793c}\ - \u{795e}\ - \u{7965}\ - \u{798f}\ - \u{9756}\ - \u{7cbe}\ - \u{8612}\ - \u{8af8}\ - \u{9038}\ - \u{90fd}\ - \u{98ef}\ - \u{98fc}\ - \u{9928}\ - \u{9db4}\ - \u{90de}\ - \u{96b7}\ - \u{4fae}\ - \u{50e7}\ - \u{514d}\ - \u{52c9}\ - \u{52e4}\ - \u{5351}\ - \u{559d}\ - \u{5606}\ - \u{5668}\ - \u{5840}\ - \u{58a8}\ - \u{5c64}\ - \u{6094}\ - \u{6168}\ - \u{618e}\ - \u{61f2}\ - \u{654f}\ - \u{65e2}\ - \u{6691}\ - \u{6885}\ - \u{6d77}\ - \u{6e1a}\ - \u{6f22}\ - \u{716e}\ - \u{722b}\ - \u{7422}\ - \u{7891}\ - \u{7949}\ - \u{7948}\ - \u{7950}\ - \u{7956}\ - \u{798d}\ - \u{798e}\ - \u{7a40}\ - \u{7a81}\ - \u{7bc0}\ - \u{7e09}\ - \u{7e41}\ - \u{7f72}\ - \u{8005}\ - \u{81ed}\ - \u{8279}\ - \u{8457}\ - \u{8910}\ - \u{8996}\ - \u{8b01}\ - \u{8b39}\ - \u{8cd3}\ - \u{8d08}\ - \u{8fb6}\ - \u{96e3}\ - \u{97ff}\ - \u{983b}\ - \u{6075}\ - \u{242ee}\ - \u{8218}\ - \u{4e26}\ - \u{51b5}\ - \u{5168}\ - \u{4f80}\ - \u{5145}\ - \u{5180}\ - \u{52c7}\ - \u{52fa}\ - \u{5555}\ - \u{5599}\ - \u{55e2}\ - \u{58b3}\ - \u{5944}\ - \u{5954}\ - \u{5a62}\ - \u{5b28}\ - \u{5ed2}\ - \u{5ed9}\ - \u{5f69}\ - \u{5fad}\ - \u{60d8}\ - \u{614e}\ - \u{6108}\ - \u{6160}\ - \u{6234}\ - \u{63c4}\ - \u{641c}\ - \u{6452}\ - \u{6556}\ - \u{671b}\ - \u{6756}\ - \u{6edb}\ - \u{6ecb}\ - \u{701e}\ - \u{77a7}\ - \u{7235}\ - \u{72af}\ - \u{7471}\ - \u{7506}\ - \u{753b}\ - \u{761d}\ - \u{761f}\ - \u{76db}\ - \u{76f4}\ - \u{774a}\ - \u{7740}\ - \u{78cc}\ - \u{7ab1}\ - \u{7c7b}\ - \u{7d5b}\ - \u{7f3e}\ - \u{8352}\ - \u{83ef}\ - \u{8779}\ - \u{8941}\ - \u{8986}\ - \u{8abf}\ - \u{8acb}\ - \u{8aed}\ - \u{8b8a}\ - \u{8f38}\ - \u{9072}\ - \u{9199}\ - \u{9276}\ - \u{967c}\ - \u{97db}\ - \u{980b}\ - \u{9b12}\ - \u{2284a}\ - \u{22844}\ - \u{233d5}\ - \u{3b9d}\ - \u{4018}\ - \u{4039}\ - \u{25249}\ - \u{25cd0}\ - \u{27ed3}\ - \u{9f43}\ - \u{9f8e}\ - \u{66}\ - \u{66}\ - \u{66}\ - \u{69}\ - \u{66}\ - \u{6c}\ - \u{66}\ - \u{66}\ - \u{69}\ - \u{66}\ - \u{66}\ - \u{6c}\ - \u{73}\ - \u{74}\ - \u{574}\ - \u{576}\ - \u{574}\ - \u{565}\ - \u{574}\ - \u{56b}\ - \u{57e}\ - \u{576}\ - \u{574}\ - \u{56d}\ - \u{5d9}\ - \u{5b4}\ - \u{5f2}\ - \u{5b7}\ - \u{5e2}\ - \u{5d4}\ - \u{5db}\ - \u{5dc}\ - \u{5dd}\ - \u{5e8}\ - \u{5ea}\ - \u{5e9}\ - \u{5c1}\ - \u{5e9}\ - \u{5c2}\ - \u{5e9}\ - \u{5bc}\ - \u{5c1}\ - \u{5e9}\ - \u{5bc}\ - \u{5c2}\ - \u{5d0}\ - \u{5b7}\ - \u{5d0}\ - \u{5b8}\ - \u{5d0}\ - \u{5bc}\ - \u{5d1}\ - \u{5bc}\ - \u{5d2}\ - \u{5bc}\ - \u{5d3}\ - \u{5bc}\ - \u{5d4}\ - \u{5bc}\ - \u{5d5}\ - \u{5bc}\ - \u{5d6}\ - \u{5bc}\ - \u{5d8}\ - \u{5bc}\ - \u{5d9}\ - \u{5bc}\ - \u{5da}\ - \u{5bc}\ - \u{5db}\ - \u{5bc}\ - \u{5dc}\ - \u{5bc}\ - \u{5de}\ - \u{5bc}\ - \u{5e0}\ - \u{5bc}\ - \u{5e1}\ - \u{5bc}\ - \u{5e3}\ - \u{5bc}\ - \u{5e4}\ - \u{5bc}\ - \u{5e6}\ - \u{5bc}\ - \u{5e7}\ - \u{5bc}\ - \u{5e8}\ - \u{5bc}\ - \u{5e9}\ - \u{5bc}\ - \u{5ea}\ - \u{5bc}\ - \u{5d5}\ - \u{5b9}\ - \u{5d1}\ - \u{5bf}\ - \u{5db}\ - \u{5bf}\ - \u{5e4}\ - \u{5bf}\ - \u{5d0}\ - \u{5dc}\ - \u{671}\ - \u{67b}\ - \u{67e}\ - \u{680}\ - \u{67a}\ - \u{67f}\ - \u{679}\ - \u{6a4}\ - \u{6a6}\ - \u{684}\ - \u{683}\ - \u{686}\ - \u{687}\ - \u{68d}\ - \u{68c}\ - \u{68e}\ - \u{688}\ - \u{698}\ - \u{691}\ - \u{6a9}\ - \u{6af}\ - \u{6b3}\ - \u{6b1}\ - \u{6ba}\ - \u{6bb}\ - \u{6c0}\ - \u{6c1}\ - \u{6be}\ - \u{6d2}\ - \u{6d3}\ - \u{6ad}\ - \u{6c7}\ - \u{6c6}\ - \u{6c8}\ - \u{6cb}\ - \u{6c5}\ - \u{6c9}\ - \u{6d0}\ - \u{649}\ - \u{626}\ - \u{627}\ - \u{626}\ - \u{6d5}\ - \u{626}\ - \u{648}\ - \u{626}\ - \u{6c7}\ - \u{626}\ - \u{6c6}\ - \u{626}\ - \u{6c8}\ - \u{626}\ - \u{6d0}\ - \u{626}\ - \u{649}\ - \u{6cc}\ - \u{626}\ - \u{62c}\ - \u{626}\ - \u{62d}\ - \u{626}\ - \u{645}\ - \u{626}\ - \u{64a}\ - \u{628}\ - \u{62c}\ - \u{628}\ - \u{62d}\ - \u{628}\ - \u{62e}\ - \u{628}\ - \u{645}\ - \u{628}\ - \u{649}\ - \u{628}\ - \u{64a}\ - \u{62a}\ - \u{62c}\ - \u{62a}\ - \u{62d}\ - \u{62a}\ - \u{62e}\ - \u{62a}\ - \u{645}\ - \u{62a}\ - \u{649}\ - \u{62a}\ - \u{64a}\ - \u{62b}\ - \u{62c}\ - \u{62b}\ - \u{645}\ - \u{62b}\ - \u{649}\ - \u{62b}\ - \u{64a}\ - \u{62c}\ - \u{62d}\ - \u{62c}\ - \u{645}\ - \u{62d}\ - \u{62c}\ - \u{62d}\ - \u{645}\ - \u{62e}\ - \u{62c}\ - \u{62e}\ - \u{62d}\ - \u{62e}\ - \u{645}\ - \u{633}\ - \u{62c}\ - \u{633}\ - \u{62d}\ - \u{633}\ - \u{62e}\ - \u{633}\ - \u{645}\ - \u{635}\ - \u{62d}\ - \u{635}\ - \u{645}\ - \u{636}\ - \u{62c}\ - \u{636}\ - \u{62d}\ - \u{636}\ - \u{62e}\ - \u{636}\ - \u{645}\ - \u{637}\ - \u{62d}\ - \u{637}\ - \u{645}\ - \u{638}\ - \u{645}\ - \u{639}\ - \u{62c}\ - \u{639}\ - \u{645}\ - \u{63a}\ - \u{62c}\ - \u{63a}\ - \u{645}\ - \u{641}\ - \u{62c}\ - \u{641}\ - \u{62d}\ - \u{641}\ - \u{62e}\ - \u{641}\ - \u{645}\ - \u{641}\ - \u{649}\ - \u{641}\ - \u{64a}\ - \u{642}\ - \u{62d}\ - \u{642}\ - \u{645}\ - \u{642}\ - \u{649}\ - \u{642}\ - \u{64a}\ - \u{643}\ - \u{627}\ - \u{643}\ - \u{62c}\ - \u{643}\ - \u{62d}\ - \u{643}\ - \u{62e}\ - \u{643}\ - \u{644}\ - \u{643}\ - \u{645}\ - \u{643}\ - \u{649}\ - \u{643}\ - \u{64a}\ - \u{644}\ - \u{62c}\ - \u{644}\ - \u{62d}\ - \u{644}\ - \u{62e}\ - \u{644}\ - \u{645}\ - \u{644}\ - \u{649}\ - \u{644}\ - \u{64a}\ - \u{645}\ - \u{62c}\ - \u{645}\ - \u{62d}\ - \u{645}\ - \u{62e}\ - \u{645}\ - \u{645}\ - \u{645}\ - \u{649}\ - \u{645}\ - \u{64a}\ - \u{646}\ - \u{62c}\ - \u{646}\ - \u{62d}\ - \u{646}\ - \u{62e}\ - \u{646}\ - \u{645}\ - \u{646}\ - \u{649}\ - \u{646}\ - \u{64a}\ - \u{647}\ - \u{62c}\ - \u{647}\ - \u{645}\ - \u{647}\ - \u{649}\ - \u{647}\ - \u{64a}\ - \u{64a}\ - \u{62c}\ - \u{64a}\ - \u{62d}\ - \u{64a}\ - \u{62e}\ - \u{64a}\ - \u{645}\ - \u{64a}\ - \u{649}\ - \u{64a}\ - \u{64a}\ - \u{630}\ - \u{670}\ - \u{631}\ - \u{670}\ - \u{649}\ - \u{670}\ - \u{20}\ - \u{64c}\ - \u{651}\ - \u{20}\ - \u{64d}\ - \u{651}\ - \u{20}\ - \u{64e}\ - \u{651}\ - \u{20}\ - \u{64f}\ - \u{651}\ - \u{20}\ - \u{650}\ - \u{651}\ - \u{20}\ - \u{651}\ - \u{670}\ - \u{626}\ - \u{631}\ - \u{626}\ - \u{632}\ - \u{626}\ - \u{646}\ - \u{628}\ - \u{631}\ - \u{628}\ - \u{632}\ - \u{628}\ - \u{646}\ - \u{62a}\ - \u{631}\ - \u{62a}\ - \u{632}\ - \u{62a}\ - \u{646}\ - \u{62b}\ - \u{631}\ - \u{62b}\ - \u{632}\ - \u{62b}\ - \u{646}\ - \u{645}\ - \u{627}\ - \u{646}\ - \u{631}\ - \u{646}\ - \u{632}\ - \u{646}\ - \u{646}\ - \u{64a}\ - \u{631}\ - \u{64a}\ - \u{632}\ - \u{64a}\ - \u{646}\ - \u{626}\ - \u{62e}\ - \u{626}\ - \u{647}\ - \u{628}\ - \u{647}\ - \u{62a}\ - \u{647}\ - \u{635}\ - \u{62e}\ - \u{644}\ - \u{647}\ - \u{646}\ - \u{647}\ - \u{647}\ - \u{670}\ - \u{64a}\ - \u{647}\ - \u{62b}\ - \u{647}\ - \u{633}\ - \u{647}\ - \u{634}\ - \u{645}\ - \u{634}\ - \u{647}\ - \u{640}\ - \u{64e}\ - \u{651}\ - \u{640}\ - \u{64f}\ - \u{651}\ - \u{640}\ - \u{650}\ - \u{651}\ - \u{637}\ - \u{649}\ - \u{637}\ - \u{64a}\ - \u{639}\ - \u{649}\ - \u{639}\ - \u{64a}\ - \u{63a}\ - \u{649}\ - \u{63a}\ - \u{64a}\ - \u{633}\ - \u{649}\ - \u{633}\ - \u{64a}\ - \u{634}\ - \u{649}\ - \u{634}\ - \u{64a}\ - \u{62d}\ - \u{649}\ - \u{62d}\ - \u{64a}\ - \u{62c}\ - \u{649}\ - \u{62c}\ - \u{64a}\ - \u{62e}\ - \u{649}\ - \u{62e}\ - \u{64a}\ - \u{635}\ - \u{649}\ - \u{635}\ - \u{64a}\ - \u{636}\ - \u{649}\ - \u{636}\ - \u{64a}\ - \u{634}\ - \u{62c}\ - \u{634}\ - \u{62d}\ - \u{634}\ - \u{62e}\ - \u{634}\ - \u{631}\ - \u{633}\ - \u{631}\ - \u{635}\ - \u{631}\ - \u{636}\ - \u{631}\ - \u{627}\ - \u{64b}\ - \u{62a}\ - \u{62c}\ - \u{645}\ - \u{62a}\ - \u{62d}\ - \u{62c}\ - \u{62a}\ - \u{62d}\ - \u{645}\ - \u{62a}\ - \u{62e}\ - \u{645}\ - \u{62a}\ - \u{645}\ - \u{62c}\ - \u{62a}\ - \u{645}\ - \u{62d}\ - \u{62a}\ - \u{645}\ - \u{62e}\ - \u{62c}\ - \u{645}\ - \u{62d}\ - \u{62d}\ - \u{645}\ - \u{64a}\ - \u{62d}\ - \u{645}\ - \u{649}\ - \u{633}\ - \u{62d}\ - \u{62c}\ - \u{633}\ - \u{62c}\ - \u{62d}\ - \u{633}\ - \u{62c}\ - \u{649}\ - \u{633}\ - \u{645}\ - \u{62d}\ - \u{633}\ - \u{645}\ - \u{62c}\ - \u{633}\ - \u{645}\ - \u{645}\ - \u{635}\ - \u{62d}\ - \u{62d}\ - \u{635}\ - \u{645}\ - \u{645}\ - \u{634}\ - \u{62d}\ - \u{645}\ - \u{634}\ - \u{62c}\ - \u{64a}\ - \u{634}\ - \u{645}\ - \u{62e}\ - \u{634}\ - \u{645}\ - \u{645}\ - \u{636}\ - \u{62d}\ - \u{649}\ - \u{636}\ - \u{62e}\ - \u{645}\ - \u{637}\ - \u{645}\ - \u{62d}\ - \u{637}\ - \u{645}\ - \u{645}\ - \u{637}\ - \u{645}\ - \u{64a}\ - \u{639}\ - \u{62c}\ - \u{645}\ - \u{639}\ - \u{645}\ - \u{645}\ - \u{639}\ - \u{645}\ - \u{649}\ - \u{63a}\ - \u{645}\ - \u{645}\ - \u{63a}\ - \u{645}\ - \u{64a}\ - \u{63a}\ - \u{645}\ - \u{649}\ - \u{641}\ - \u{62e}\ - \u{645}\ - \u{642}\ - \u{645}\ - \u{62d}\ - \u{642}\ - \u{645}\ - \u{645}\ - \u{644}\ - \u{62d}\ - \u{645}\ - \u{644}\ - \u{62d}\ - \u{64a}\ - \u{644}\ - \u{62d}\ - \u{649}\ - \u{644}\ - \u{62c}\ - \u{62c}\ - \u{644}\ - \u{62e}\ - \u{645}\ - \u{644}\ - \u{645}\ - \u{62d}\ - \u{645}\ - \u{62d}\ - \u{62c}\ - \u{645}\ - \u{62d}\ - \u{645}\ - \u{645}\ - \u{62d}\ - \u{64a}\ - \u{645}\ - \u{62c}\ - \u{62d}\ - \u{645}\ - \u{62c}\ - \u{645}\ - \u{645}\ - \u{62e}\ - \u{62c}\ - \u{645}\ - \u{62e}\ - \u{645}\ - \u{645}\ - \u{62c}\ - \u{62e}\ - \u{647}\ - \u{645}\ - \u{62c}\ - \u{647}\ - \u{645}\ - \u{645}\ - \u{646}\ - \u{62d}\ - \u{645}\ - \u{646}\ - \u{62d}\ - \u{649}\ - \u{646}\ - \u{62c}\ - \u{645}\ - \u{646}\ - \u{62c}\ - \u{649}\ - \u{646}\ - \u{645}\ - \u{64a}\ - \u{646}\ - \u{645}\ - \u{649}\ - \u{64a}\ - \u{645}\ - \u{645}\ - \u{628}\ - \u{62e}\ - \u{64a}\ - \u{62a}\ - \u{62c}\ - \u{64a}\ - \u{62a}\ - \u{62c}\ - \u{649}\ - \u{62a}\ - \u{62e}\ - \u{64a}\ - \u{62a}\ - \u{62e}\ - \u{649}\ - \u{62a}\ - \u{645}\ - \u{64a}\ - \u{62a}\ - \u{645}\ - \u{649}\ - \u{62c}\ - \u{645}\ - \u{64a}\ - \u{62c}\ - \u{62d}\ - \u{649}\ - \u{62c}\ - \u{645}\ - \u{649}\ - \u{633}\ - \u{62e}\ - \u{649}\ - \u{635}\ - \u{62d}\ - \u{64a}\ - \u{634}\ - \u{62d}\ - \u{64a}\ - \u{636}\ - \u{62d}\ - \u{64a}\ - \u{644}\ - \u{62c}\ - \u{64a}\ - \u{644}\ - \u{645}\ - \u{64a}\ - \u{64a}\ - \u{62d}\ - \u{64a}\ - \u{64a}\ - \u{62c}\ - \u{64a}\ - \u{64a}\ - \u{645}\ - \u{64a}\ - \u{645}\ - \u{645}\ - \u{64a}\ - \u{642}\ - \u{645}\ - \u{64a}\ - \u{646}\ - \u{62d}\ - \u{64a}\ - \u{639}\ - \u{645}\ - \u{64a}\ - \u{643}\ - \u{645}\ - \u{64a}\ - \u{646}\ - \u{62c}\ - \u{62d}\ - \u{645}\ - \u{62e}\ - \u{64a}\ - \u{644}\ - \u{62c}\ - \u{645}\ - \u{643}\ - \u{645}\ - \u{645}\ - \u{62c}\ - \u{62d}\ - \u{64a}\ - \u{62d}\ - \u{62c}\ - \u{64a}\ - \u{645}\ - \u{62c}\ - \u{64a}\ - \u{641}\ - \u{645}\ - \u{64a}\ - \u{628}\ - \u{62d}\ - \u{64a}\ - \u{633}\ - \u{62e}\ - \u{64a}\ - \u{646}\ - \u{62c}\ - \u{64a}\ - \u{635}\ - \u{644}\ - \u{6d2}\ - \u{642}\ - \u{644}\ - \u{6d2}\ - \u{627}\ - \u{644}\ - \u{644}\ - \u{647}\ - \u{627}\ - \u{643}\ - \u{628}\ - \u{631}\ - \u{645}\ - \u{62d}\ - \u{645}\ - \u{62f}\ - \u{635}\ - \u{644}\ - \u{639}\ - \u{645}\ - \u{631}\ - \u{633}\ - \u{648}\ - \u{644}\ - \u{639}\ - \u{644}\ - \u{64a}\ - \u{647}\ - \u{648}\ - \u{633}\ - \u{644}\ - \u{645}\ - \u{635}\ - \u{644}\ - \u{649}\ - \u{635}\ - \u{644}\ - \u{649}\ - \u{20}\ - \u{627}\ - \u{644}\ - \u{644}\ - \u{647}\ - \u{20}\ - \u{639}\ - \u{644}\ - \u{64a}\ - \u{647}\ - \u{20}\ - \u{648}\ - \u{633}\ - \u{644}\ - \u{645}\ - \u{62c}\ - \u{644}\ - \u{20}\ - \u{62c}\ - \u{644}\ - \u{627}\ - \u{644}\ - \u{647}\ - \u{631}\ - \u{6cc}\ - \u{627}\ - \u{644}\ - \u{2c}\ - \u{3001}\ - \u{3a}\ - \u{21}\ - \u{3f}\ - \u{3016}\ - \u{3017}\ - \u{2014}\ - \u{2013}\ - \u{5f}\ - \u{7b}\ - \u{7d}\ - \u{3014}\ - \u{3015}\ - \u{3010}\ - \u{3011}\ - \u{300a}\ - \u{300b}\ - \u{300c}\ - \u{300d}\ - \u{300e}\ - \u{300f}\ - \u{5b}\ - \u{5d}\ - \u{23}\ - \u{26}\ - \u{2a}\ - \u{2d}\ - \u{3c}\ - \u{3e}\ - \u{5c}\ - \u{24}\ - \u{25}\ - \u{40}\ - \u{20}\ - \u{64b}\ - \u{640}\ - \u{64b}\ - \u{20}\ - \u{64c}\ - \u{20}\ - \u{64d}\ - \u{20}\ - \u{64e}\ - \u{640}\ - \u{64e}\ - \u{20}\ - \u{64f}\ - \u{640}\ - \u{64f}\ - \u{20}\ - \u{650}\ - \u{640}\ - \u{650}\ - \u{20}\ - \u{651}\ - \u{640}\ - \u{651}\ - \u{20}\ - \u{652}\ - \u{640}\ - \u{652}\ - \u{621}\ - \u{622}\ - \u{623}\ - \u{624}\ - \u{625}\ - \u{626}\ - \u{627}\ - \u{628}\ - \u{629}\ - \u{62a}\ - \u{62b}\ - \u{62c}\ - \u{62d}\ - \u{62e}\ - \u{62f}\ - \u{630}\ - \u{631}\ - \u{632}\ - \u{633}\ - \u{634}\ - \u{635}\ - \u{636}\ - \u{637}\ - \u{638}\ - \u{639}\ - \u{63a}\ - \u{641}\ - \u{642}\ - \u{643}\ - \u{644}\ - \u{645}\ - \u{646}\ - \u{647}\ - \u{648}\ - \u{64a}\ - \u{644}\ - \u{622}\ - \u{644}\ - \u{623}\ - \u{644}\ - \u{625}\ - \u{644}\ - \u{627}\ - \u{22}\ - \u{27}\ - \u{2f}\ - \u{5e}\ - \u{7c}\ - \u{7e}\ - \u{2985}\ - \u{2986}\ - \u{30fb}\ - \u{30a1}\ - \u{30a3}\ - \u{30a5}\ - \u{30a7}\ - \u{30a9}\ - \u{30e3}\ - \u{30e5}\ - \u{30e7}\ - \u{30c3}\ - \u{30fc}\ - \u{30f3}\ - \u{3099}\ - \u{309a}\ - \u{a2}\ - \u{a3}\ - \u{ac}\ - \u{a6}\ - \u{a5}\ - \u{20a9}\ - \u{2502}\ - \u{2190}\ - \u{2191}\ - \u{2192}\ - \u{2193}\ - \u{25a0}\ - \u{25cb}\ - \u{10428}\ - \u{10429}\ - \u{1042a}\ - \u{1042b}\ - \u{1042c}\ - \u{1042d}\ - \u{1042e}\ - \u{1042f}\ - \u{10430}\ - \u{10431}\ - \u{10432}\ - \u{10433}\ - \u{10434}\ - \u{10435}\ - \u{10436}\ - \u{10437}\ - \u{10438}\ - \u{10439}\ - \u{1043a}\ - \u{1043b}\ - \u{1043c}\ - \u{1043d}\ - \u{1043e}\ - \u{1043f}\ - \u{10440}\ - \u{10441}\ - \u{10442}\ - \u{10443}\ - \u{10444}\ - \u{10445}\ - \u{10446}\ - \u{10447}\ - \u{10448}\ - \u{10449}\ - \u{1044a}\ - \u{1044b}\ - \u{1044c}\ - \u{1044d}\ - \u{1044e}\ - \u{1044f}\ - \u{104d8}\ - \u{104d9}\ - \u{104da}\ - \u{104db}\ - \u{104dc}\ - \u{104dd}\ - \u{104de}\ - \u{104df}\ - \u{104e0}\ - \u{104e1}\ - \u{104e2}\ - \u{104e3}\ - \u{104e4}\ - \u{104e5}\ - \u{104e6}\ - \u{104e7}\ - \u{104e8}\ - \u{104e9}\ - \u{104ea}\ - \u{104eb}\ - \u{104ec}\ - \u{104ed}\ - \u{104ee}\ - \u{104ef}\ - \u{104f0}\ - \u{104f1}\ - \u{104f2}\ - \u{104f3}\ - \u{104f4}\ - \u{104f5}\ - \u{104f6}\ - \u{104f7}\ - \u{104f8}\ - \u{104f9}\ - \u{104fa}\ - \u{104fb}\ - \u{10cc0}\ - \u{10cc1}\ - \u{10cc2}\ - \u{10cc3}\ - \u{10cc4}\ - \u{10cc5}\ - \u{10cc6}\ - \u{10cc7}\ - \u{10cc8}\ - \u{10cc9}\ - \u{10cca}\ - \u{10ccb}\ - \u{10ccc}\ - \u{10ccd}\ - \u{10cce}\ - \u{10ccf}\ - \u{10cd0}\ - \u{10cd1}\ - \u{10cd2}\ - \u{10cd3}\ - \u{10cd4}\ - \u{10cd5}\ - \u{10cd6}\ - \u{10cd7}\ - \u{10cd8}\ - \u{10cd9}\ - \u{10cda}\ - \u{10cdb}\ - \u{10cdc}\ - \u{10cdd}\ - \u{10cde}\ - \u{10cdf}\ - \u{10ce0}\ - \u{10ce1}\ - \u{10ce2}\ - \u{10ce3}\ - \u{10ce4}\ - \u{10ce5}\ - \u{10ce6}\ - \u{10ce7}\ - \u{10ce8}\ - \u{10ce9}\ - \u{10cea}\ - \u{10ceb}\ - \u{10cec}\ - \u{10ced}\ - \u{10cee}\ - \u{10cef}\ - \u{10cf0}\ - \u{10cf1}\ - \u{10cf2}\ - \u{118c0}\ - \u{118c1}\ - \u{118c2}\ - \u{118c3}\ - \u{118c4}\ - \u{118c5}\ - \u{118c6}\ - \u{118c7}\ - \u{118c8}\ - \u{118c9}\ - \u{118ca}\ - \u{118cb}\ - \u{118cc}\ - \u{118cd}\ - \u{118ce}\ - \u{118cf}\ - \u{118d0}\ - \u{118d1}\ - \u{118d2}\ - \u{118d3}\ - \u{118d4}\ - \u{118d5}\ - \u{118d6}\ - \u{118d7}\ - \u{118d8}\ - \u{118d9}\ - \u{118da}\ - \u{118db}\ - \u{118dc}\ - \u{118dd}\ - \u{118de}\ - \u{118df}\ - \u{1d157}\ - \u{1d165}\ - \u{1d158}\ - \u{1d165}\ - \u{1d158}\ - \u{1d165}\ - \u{1d16e}\ - \u{1d158}\ - \u{1d165}\ - \u{1d16f}\ - \u{1d158}\ - \u{1d165}\ - \u{1d170}\ - \u{1d158}\ - \u{1d165}\ - \u{1d171}\ - \u{1d158}\ - \u{1d165}\ - \u{1d172}\ - \u{1d1b9}\ - \u{1d165}\ - \u{1d1ba}\ - \u{1d165}\ - \u{1d1b9}\ - \u{1d165}\ - \u{1d16e}\ - \u{1d1ba}\ - \u{1d165}\ - \u{1d16e}\ - \u{1d1b9}\ - \u{1d165}\ - \u{1d16f}\ - \u{1d1ba}\ - \u{1d165}\ - \u{1d16f}\ - \u{131}\ - \u{237}\ - \u{2207}\ - \u{2202}\ - \u{1e922}\ - \u{1e923}\ - \u{1e924}\ - \u{1e925}\ - \u{1e926}\ - \u{1e927}\ - \u{1e928}\ - \u{1e929}\ - \u{1e92a}\ - \u{1e92b}\ - \u{1e92c}\ - \u{1e92d}\ - \u{1e92e}\ - \u{1e92f}\ - \u{1e930}\ - \u{1e931}\ - \u{1e932}\ - \u{1e933}\ - \u{1e934}\ - \u{1e935}\ - \u{1e936}\ - \u{1e937}\ - \u{1e938}\ - \u{1e939}\ - \u{1e93a}\ - \u{1e93b}\ - \u{1e93c}\ - \u{1e93d}\ - \u{1e93e}\ - \u{1e93f}\ - \u{1e940}\ - \u{1e941}\ - \u{1e942}\ - \u{1e943}\ - \u{66e}\ - \u{6a1}\ - \u{66f}\ - \u{30}\ - \u{2c}\ - \u{31}\ - \u{2c}\ - \u{32}\ - \u{2c}\ - \u{33}\ - \u{2c}\ - \u{34}\ - \u{2c}\ - \u{35}\ - \u{2c}\ - \u{36}\ - \u{2c}\ - \u{37}\ - \u{2c}\ - \u{38}\ - \u{2c}\ - \u{39}\ - \u{2c}\ - \u{3014}\ - \u{73}\ - \u{3015}\ - \u{77}\ - \u{7a}\ - \u{68}\ - \u{76}\ - \u{73}\ - \u{64}\ - \u{70}\ - \u{70}\ - \u{76}\ - \u{77}\ - \u{63}\ - \u{6d}\ - \u{63}\ - \u{6d}\ - \u{64}\ - \u{64}\ - \u{6a}\ - \u{307b}\ - \u{304b}\ - \u{30b3}\ - \u{30b3}\ - \u{5b57}\ - \u{53cc}\ - \u{30c7}\ - \u{591a}\ - \u{89e3}\ - \u{4ea4}\ - \u{6620}\ - \u{7121}\ - \u{524d}\ - \u{5f8c}\ - \u{518d}\ - \u{65b0}\ - \u{521d}\ - \u{7d42}\ - \u{8ca9}\ - \u{58f0}\ - \u{5439}\ - \u{6f14}\ - \u{6295}\ - \u{6355}\ - \u{904a}\ - \u{6307}\ - \u{6253}\ - \u{7981}\ - \u{7a7a}\ - \u{5408}\ - \u{6e80}\ - \u{7533}\ - \u{5272}\ - \u{55b6}\ - \u{914d}\ - \u{3014}\ - \u{672c}\ - \u{3015}\ - \u{3014}\ - \u{4e09}\ - \u{3015}\ - \u{3014}\ - \u{4e8c}\ - \u{3015}\ - \u{3014}\ - \u{5b89}\ - \u{3015}\ - \u{3014}\ - \u{70b9}\ - \u{3015}\ - \u{3014}\ - \u{6253}\ - \u{3015}\ - \u{3014}\ - \u{76d7}\ - \u{3015}\ - \u{3014}\ - \u{52dd}\ - \u{3015}\ - \u{3014}\ - \u{6557}\ - \u{3015}\ - \u{5f97}\ - \u{53ef}\ - \u{4e3d}\ - \u{4e38}\ - \u{4e41}\ - \u{20122}\ - \u{4f60}\ - \u{4fbb}\ - \u{5002}\ - \u{507a}\ - \u{5099}\ - \u{50cf}\ - \u{349e}\ - \u{2063a}\ - \u{5154}\ - \u{5164}\ - \u{5177}\ - \u{2051c}\ - \u{34b9}\ - \u{5167}\ - \u{2054b}\ - \u{5197}\ - \u{51a4}\ - \u{4ecc}\ - \u{51ac}\ - \u{291df}\ - \u{5203}\ - \u{34df}\ - \u{523b}\ - \u{5246}\ - \u{5277}\ - \u{3515}\ - \u{5305}\ - \u{5306}\ - \u{5349}\ - \u{535a}\ - \u{5373}\ - \u{537d}\ - \u{537f}\ - \u{20a2c}\ - \u{7070}\ - \u{53ca}\ - \u{53df}\ - \u{20b63}\ - \u{53eb}\ - \u{53f1}\ - \u{5406}\ - \u{549e}\ - \u{5438}\ - \u{5448}\ - \u{5468}\ - \u{54a2}\ - \u{54f6}\ - \u{5510}\ - \u{5553}\ - \u{5563}\ - \u{5584}\ - \u{55ab}\ - \u{55b3}\ - \u{55c2}\ - \u{5716}\ - \u{5717}\ - \u{5651}\ - \u{5674}\ - \u{58ee}\ - \u{57ce}\ - \u{57f4}\ - \u{580d}\ - \u{578b}\ - \u{5832}\ - \u{5831}\ - \u{58ac}\ - \u{214e4}\ - \u{58f2}\ - \u{58f7}\ - \u{5906}\ - \u{5922}\ - \u{5962}\ - \u{216a8}\ - \u{216ea}\ - \u{59ec}\ - \u{5a1b}\ - \u{5a27}\ - \u{59d8}\ - \u{5a66}\ - \u{36ee}\ - \u{5b08}\ - \u{5b3e}\ - \u{219c8}\ - \u{5bc3}\ - \u{5bd8}\ - \u{5bf3}\ - \u{21b18}\ - \u{5bff}\ - \u{5c06}\ - \u{3781}\ - \u{5c60}\ - \u{5cc0}\ - \u{5c8d}\ - \u{21de4}\ - \u{5d43}\ - \u{21de6}\ - \u{5d6e}\ - \u{5d6b}\ - \u{5d7c}\ - \u{5de1}\ - \u{5de2}\ - \u{382f}\ - \u{5dfd}\ - \u{5e28}\ - \u{5e3d}\ - \u{5e69}\ - \u{3862}\ - \u{22183}\ - \u{387c}\ - \u{5eb0}\ - \u{5eb3}\ - \u{5eb6}\ - \u{2a392}\ - \u{22331}\ - \u{8201}\ - \u{5f22}\ - \u{38c7}\ - \u{232b8}\ - \u{261da}\ - \u{5f62}\ - \u{5f6b}\ - \u{38e3}\ - \u{5f9a}\ - \u{5fcd}\ - \u{5fd7}\ - \u{5ff9}\ - \u{6081}\ - \u{393a}\ - \u{391c}\ - \u{226d4}\ - \u{60c7}\ - \u{6148}\ - \u{614c}\ - \u{617a}\ - \u{61b2}\ - \u{61a4}\ - \u{61af}\ - \u{61de}\ - \u{6210}\ - \u{621b}\ - \u{625d}\ - \u{62b1}\ - \u{62d4}\ - \u{6350}\ - \u{22b0c}\ - \u{633d}\ - \u{62fc}\ - \u{6368}\ - \u{6383}\ - \u{63e4}\ - \u{22bf1}\ - \u{6422}\ - \u{63c5}\ - \u{63a9}\ - \u{3a2e}\ - \u{6469}\ - \u{647e}\ - \u{649d}\ - \u{6477}\ - \u{3a6c}\ - \u{656c}\ - \u{2300a}\ - \u{65e3}\ - \u{66f8}\ - \u{6649}\ - \u{3b19}\ - \u{3b08}\ - \u{3ae4}\ - \u{5192}\ - \u{5195}\ - \u{6700}\ - \u{669c}\ - \u{80ad}\ - \u{43d9}\ - \u{6721}\ - \u{675e}\ - \u{6753}\ - \u{233c3}\ - \u{3b49}\ - \u{67fa}\ - \u{6785}\ - \u{6852}\ - \u{2346d}\ - \u{688e}\ - \u{681f}\ - \u{6914}\ - \u{6942}\ - \u{69a3}\ - \u{69ea}\ - \u{6aa8}\ - \u{236a3}\ - \u{6adb}\ - \u{3c18}\ - \u{6b21}\ - \u{238a7}\ - \u{6b54}\ - \u{3c4e}\ - \u{6b72}\ - \u{6b9f}\ - \u{6bbb}\ - \u{23a8d}\ - \u{21d0b}\ - \u{23afa}\ - \u{6c4e}\ - \u{23cbc}\ - \u{6cbf}\ - \u{6ccd}\ - \u{6c67}\ - \u{6d16}\ - \u{6d3e}\ - \u{6d69}\ - \u{6d78}\ - \u{6d85}\ - \u{23d1e}\ - \u{6d34}\ - \u{6e2f}\ - \u{6e6e}\ - \u{3d33}\ - \u{6ec7}\ - \u{23ed1}\ - \u{6df9}\ - \u{6f6e}\ - \u{23f5e}\ - \u{23f8e}\ - \u{6fc6}\ - \u{7039}\ - \u{701b}\ - \u{3d96}\ - \u{704a}\ - \u{707d}\ - \u{7077}\ - \u{70ad}\ - \u{20525}\ - \u{7145}\ - \u{24263}\ - \u{719c}\ - \u{7228}\ - \u{7250}\ - \u{24608}\ - \u{7280}\ - \u{7295}\ - \u{24735}\ - \u{24814}\ - \u{737a}\ - \u{738b}\ - \u{3eac}\ - \u{73a5}\ - \u{3eb8}\ - \u{7447}\ - \u{745c}\ - \u{7485}\ - \u{74ca}\ - \u{3f1b}\ - \u{7524}\ - \u{24c36}\ - \u{753e}\ - \u{24c92}\ - \u{2219f}\ - \u{7610}\ - \u{24fa1}\ - \u{24fb8}\ - \u{25044}\ - \u{3ffc}\ - \u{4008}\ - \u{250f3}\ - \u{250f2}\ - \u{25119}\ - \u{25133}\ - \u{771e}\ - \u{771f}\ - \u{778b}\ - \u{4046}\ - \u{4096}\ - \u{2541d}\ - \u{784e}\ - \u{40e3}\ - \u{25626}\ - \u{2569a}\ - \u{256c5}\ - \u{79eb}\ - \u{412f}\ - \u{7a4a}\ - \u{7a4f}\ - \u{2597c}\ - \u{25aa7}\ - \u{4202}\ - \u{25bab}\ - \u{7bc6}\ - \u{7bc9}\ - \u{4227}\ - \u{25c80}\ - \u{7cd2}\ - \u{42a0}\ - \u{7ce8}\ - \u{7ce3}\ - \u{7d00}\ - \u{25f86}\ - \u{7d63}\ - \u{4301}\ - \u{7dc7}\ - \u{7e02}\ - \u{7e45}\ - \u{4334}\ - \u{26228}\ - \u{26247}\ - \u{4359}\ - \u{262d9}\ - \u{7f7a}\ - \u{2633e}\ - \u{7f95}\ - \u{7ffa}\ - \u{264da}\ - \u{26523}\ - \u{8060}\ - \u{265a8}\ - \u{8070}\ - \u{2335f}\ - \u{43d5}\ - \u{80b2}\ - \u{8103}\ - \u{440b}\ - \u{813e}\ - \u{5ab5}\ - \u{267a7}\ - \u{267b5}\ - \u{23393}\ - \u{2339c}\ - \u{8204}\ - \u{8f9e}\ - \u{446b}\ - \u{8291}\ - \u{828b}\ - \u{829d}\ - \u{52b3}\ - \u{82b1}\ - \u{82b3}\ - \u{82bd}\ - \u{82e6}\ - \u{26b3c}\ - \u{831d}\ - \u{8363}\ - \u{83ad}\ - \u{8323}\ - \u{83bd}\ - \u{83e7}\ - \u{8353}\ - \u{83ca}\ - \u{83cc}\ - \u{83dc}\ - \u{26c36}\ - \u{26d6b}\ - \u{26cd5}\ - \u{452b}\ - \u{84f1}\ - \u{84f3}\ - \u{8516}\ - \u{273ca}\ - \u{8564}\ - \u{26f2c}\ - \u{455d}\ - \u{4561}\ - \u{26fb1}\ - \u{270d2}\ - \u{456b}\ - \u{8650}\ - \u{8667}\ - \u{8669}\ - \u{86a9}\ - \u{8688}\ - \u{870e}\ - \u{86e2}\ - \u{8728}\ - \u{876b}\ - \u{8786}\ - \u{87e1}\ - \u{8801}\ - \u{45f9}\ - \u{8860}\ - \u{27667}\ - \u{88d7}\ - \u{88de}\ - \u{4635}\ - \u{88fa}\ - \u{34bb}\ - \u{278ae}\ - \u{27966}\ - \u{46be}\ - \u{46c7}\ - \u{8aa0}\ - \u{27ca8}\ - \u{8cab}\ - \u{8cc1}\ - \u{8d1b}\ - \u{8d77}\ - \u{27f2f}\ - \u{20804}\ - \u{8dcb}\ - \u{8dbc}\ - \u{8df0}\ - \u{208de}\ - \u{8ed4}\ - \u{285d2}\ - \u{285ed}\ - \u{9094}\ - \u{90f1}\ - \u{9111}\ - \u{2872e}\ - \u{911b}\ - \u{9238}\ - \u{92d7}\ - \u{92d8}\ - \u{927c}\ - \u{93f9}\ - \u{9415}\ - \u{28bfa}\ - \u{958b}\ - \u{4995}\ - \u{95b7}\ - \u{28d77}\ - \u{49e6}\ - \u{96c3}\ - \u{5db2}\ - \u{9723}\ - \u{29145}\ - \u{2921a}\ - \u{4a6e}\ - \u{4a76}\ - \u{97e0}\ - \u{2940a}\ - \u{4ab2}\ - \u{29496}\ - \u{9829}\ - \u{295b6}\ - \u{98e2}\ - \u{4b33}\ - \u{9929}\ - \u{99a7}\ - \u{99c2}\ - \u{99fe}\ - \u{4bce}\ - \u{29b30}\ - \u{9c40}\ - \u{9cfd}\ - \u{4cce}\ - \u{4ced}\ - \u{9d67}\ - \u{2a0ce}\ - \u{4cf8}\ - \u{2a105}\ - \u{2a20e}\ - \u{2a291}\ - \u{4d56}\ - \u{9efe}\ - \u{9f05}\ - \u{9f0f}\ - \u{9f16}\ - \u{2a600}"; diff --git a/vendor/idna-0.1.5/tests/IdnaTest.txt b/vendor/idna-0.1.5/tests/IdnaTest.txt deleted file mode 100644 index 123a1f0617..0000000000 --- a/vendor/idna-0.1.5/tests/IdnaTest.txt +++ /dev/null @@ -1,7848 +0,0 @@ -# IdnaTest.txt -# Date: 2017-06-02, 14:19:52 GMT -# © 2017 Unicode®, Inc. -# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# -# Contains test cases for verifying UTS46 conformance. For more information, -# see http://www.unicode.org/reports/tr46/ -# -# FORMAT: -# -# This file is in UTF8, with certain characters escaped using the \uXXXX or \x{XXXX} -# convention where they could otherwise have a confusing display. -# These characters include: -# -# - General Categories C, Z, and M -# - Default ignorable characters -# - Bidi categories R, AL, AN -# -# Columns (c1, c2,...) are separated by semicolons. -# Leading and trailing spaces and tabs in each column are ignored. -# Comments are indicated with hash marks. -# -# Column 1: type - T for transitional, N for nontransitional, B for both -# Column 2: source - The source string to be tested -# Column 3: toUnicode - The result of applying toUnicode to the source, using nontransitional. -# A blank value means the same as the source value; a value in [...] is a set of error codes. -# Column 4: toASCII - The result of applying toASCII to the source, using the specified type: T, N, or B. -# A blank value means the same as the toUnicode value; a value in [...] is a set of error codes. -# Column 5: idna2008 - NV8 is only present if the status is valid but the character is excluded by IDNA2008 -# from all domain names for all versions of Unicode. -# XV8 is present when the character is excluded by IDNA2008 for the current version of Unicode. -# These are informative values only. -# -# If the value of toUnicode is the same as source, the column will be blank. -# The line comments currently show visible characters that have been escaped -# (after removing default-ignorables and controls, except for whitespace) -# -# The test is performed with the following flag settings: -# -# VerifyDnsLength: true -# CheckHyphens: true -# CheckBidi: true -# CheckJoiners: true -# UseSTD3ASCIIRules: true -# -# An error in toUnicode or toASCII is indicated by a value in square brackets, such as "[B5 B6]". -# In such a case, the contents is a list of error codes based on the step numbers in UTS46 and IDNA2008, -# with the following formats: -# -# Pn for Section 4 Processing step n -# Vn for 4.1 Validity Criteria step n -# An for 4.2 ToASCII step n -# Bn for Bidi (in IDNA2008) -# Cn for ContextJ (in IDNA2008) -# -# However, these particular error codes are only informative; -# the important feature is whether or not there is an error. -# -# CONFORMANCE: -# -# To test for conformance to UTS46, an implementation must first perform the toUnicode operation -# on the source string, then the toASCII operation (with the indicated type) on the source string. -# Implementations may be more strict than UTS46; thus they may have errors where the file indicates results. -# In particular, an implementation conformant to IDNA2008 would disallow the input for lines marked with NV8. -# -# Moreover, the error codes in the file are informative; implementations need only record that there is an error: -# they need not reproduce those codes. Thus to then verify conformance for the toASCII and toUnicode columns: -# -# - If the file indicates an error, the implementation must also have an error. -# - If the file does not indicate an error, then the implementation must either have an error, -# or must have a matching result. -# -# ==================================================================================================== -B; fass.de; ; -T; faß.de; ; fass.de -N; faß.de; ; xn--fa-hia.de -T; Faß.de; faß.de; fass.de -N; Faß.de; faß.de; xn--fa-hia.de -B; xn--fa-hia.de; faß.de; xn--fa-hia.de - -# BIDI TESTS - -B; à\u05D0; [B5 B6]; [B5 B6] # àא -B; a\u0300\u05D0; [B5 B6]; [B5 B6] # àא -B; A\u0300\u05D0; [B5 B6]; [B5 B6] # àא -B; À\u05D0; [B5 B6]; [B5 B6] # àא -B; xn--0ca24w; [B5 B6]; [B5 B6] # àא -B; 0à.\u05D0; [B1]; [B1] # 0à.א -B; 0a\u0300.\u05D0; [B1]; [B1] # 0à.א -B; 0A\u0300.\u05D0; [B1]; [B1] # 0à.א -B; 0À.\u05D0; [B1]; [B1] # 0à.א -B; xn--0-sfa.xn--4db; [B1]; [B1] # 0à.א -B; à.\u05D0\u0308; ; xn--0ca.xn--ssa73l # à.א̈ -B; a\u0300.\u05D0\u0308; à.\u05D0\u0308; xn--0ca.xn--ssa73l # à.א̈ -B; A\u0300.\u05D0\u0308; à.\u05D0\u0308; xn--0ca.xn--ssa73l # à.א̈ -B; À.\u05D0\u0308; à.\u05D0\u0308; xn--0ca.xn--ssa73l # à.א̈ -B; xn--0ca.xn--ssa73l; à.\u05D0\u0308; xn--0ca.xn--ssa73l # à.א̈ -B; à.\u05D00\u0660\u05D0; [B4]; [B4] # à.א0٠א -B; a\u0300.\u05D00\u0660\u05D0; [B4]; [B4] # à.א0٠א -B; A\u0300.\u05D00\u0660\u05D0; [B4]; [B4] # à.א0٠א -B; À.\u05D00\u0660\u05D0; [B4]; [B4] # à.א0٠א -B; xn--0ca.xn--0-zhcb98c; [B4]; [B4] # à.א0٠א -B; \u0308.\u05D0; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ̈.א -B; xn--ssa.xn--4db; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ̈.א -B; à.\u05D00\u0660; [B4]; [B4] # à.א0٠ -B; a\u0300.\u05D00\u0660; [B4]; [B4] # à.א0٠ -B; A\u0300.\u05D00\u0660; [B4]; [B4] # à.א0٠ -B; À.\u05D00\u0660; [B4]; [B4] # à.א0٠ -B; xn--0ca.xn--0-zhc74b; [B4]; [B4] # à.א0٠ -B; àˇ.\u05D0; [B6]; [B6] # àˇ.א -B; a\u0300ˇ.\u05D0; [B6]; [B6] # àˇ.א -B; A\u0300ˇ.\u05D0; [B6]; [B6] # àˇ.א -B; Àˇ.\u05D0; [B6]; [B6] # àˇ.א -B; xn--0ca88g.xn--4db; [B6]; [B6] # àˇ.א -B; à\u0308.\u05D0; ; xn--0ca81i.xn--4db # à̈.א -B; a\u0300\u0308.\u05D0; à\u0308.\u05D0; xn--0ca81i.xn--4db # à̈.א -B; A\u0300\u0308.\u05D0; à\u0308.\u05D0; xn--0ca81i.xn--4db # à̈.א -B; À\u0308.\u05D0; à\u0308.\u05D0; xn--0ca81i.xn--4db # à̈.א -B; xn--0ca81i.xn--4db; à\u0308.\u05D0; xn--0ca81i.xn--4db # à̈.א - -# CONTEXT TESTS - -T; a\u200Cb; [C1]; ab # ab -N; a\u200Cb; [C1]; [C1] # ab -T; A\u200CB; [C1]; ab # ab -N; A\u200CB; [C1]; [C1] # ab -T; A\u200Cb; [C1]; ab # ab -N; A\u200Cb; [C1]; [C1] # ab -B; ab; ; -B; xn--ab-j1t; [C1]; [C1] # ab -T; a\u094D\u200Cb; ; xn--ab-fsf # a्b -N; a\u094D\u200Cb; ; xn--ab-fsf604u # a्b -T; A\u094D\u200CB; a\u094D\u200Cb; xn--ab-fsf # a्b -N; A\u094D\u200CB; a\u094D\u200Cb; xn--ab-fsf604u # a्b -T; A\u094D\u200Cb; a\u094D\u200Cb; xn--ab-fsf # a्b -N; A\u094D\u200Cb; a\u094D\u200Cb; xn--ab-fsf604u # a्b -B; xn--ab-fsf; a\u094Db; xn--ab-fsf # a्b -B; a\u094Db; ; xn--ab-fsf # a्b -B; A\u094DB; a\u094Db; xn--ab-fsf # a्b -B; A\u094Db; a\u094Db; xn--ab-fsf # a्b -B; xn--ab-fsf604u; a\u094D\u200Cb; xn--ab-fsf604u # a्b -T; \u0308\u200C\u0308\u0628b; [B1 C1 V5]; [B1 V5] # ̈̈بb -N; \u0308\u200C\u0308\u0628b; [B1 C1 V5]; [B1 C1 V5] # ̈̈بb -T; \u0308\u200C\u0308\u0628B; [B1 C1 V5]; [B1 V5] # ̈̈بb -N; \u0308\u200C\u0308\u0628B; [B1 C1 V5]; [B1 C1 V5] # ̈̈بb -B; xn--b-bcba413a; [B1 V5]; [B1 V5] # ̈̈بb -B; xn--b-bcba413a2w8b; [B1 C1 V5]; [B1 C1 V5] # ̈̈بb -T; a\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6] # aب̈̈ -N; a\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6 C1] # aب̈̈ -T; A\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6] # aب̈̈ -N; A\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6 C1] # aب̈̈ -B; xn--a-ccba213a; [B5 B6]; [B5 B6] # aب̈̈ -B; xn--a-ccba213a5w8b; [B5 B6 C1]; [B5 B6 C1] # aب̈̈ -T; a\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] # aب̈̈بb -N; a\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] # aب̈̈بb -T; A\u0628\u0308\u200C\u0308\u0628B; [B5]; [B5] # aب̈̈بb -N; A\u0628\u0308\u200C\u0308\u0628B; [B5]; [B5] # aب̈̈بb -T; A\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] # aب̈̈بb -N; A\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] # aب̈̈بb -B; xn--ab-uuba211bca; [B5]; [B5] # aب̈̈بb -B; xn--ab-uuba211bca8057b; [B5]; [B5] # aب̈̈بb -T; a\u200Db; [C2]; ab # ab -N; a\u200Db; [C2]; [C2] # ab -T; A\u200DB; [C2]; ab # ab -N; A\u200DB; [C2]; [C2] # ab -T; A\u200Db; [C2]; ab # ab -N; A\u200Db; [C2]; [C2] # ab -B; xn--ab-m1t; [C2]; [C2] # ab -T; a\u094D\u200Db; ; xn--ab-fsf # a्b -N; a\u094D\u200Db; ; xn--ab-fsf014u # a्b -T; A\u094D\u200DB; a\u094D\u200Db; xn--ab-fsf # a्b -N; A\u094D\u200DB; a\u094D\u200Db; xn--ab-fsf014u # a्b -T; A\u094D\u200Db; a\u094D\u200Db; xn--ab-fsf # a्b -N; A\u094D\u200Db; a\u094D\u200Db; xn--ab-fsf014u # a्b -B; xn--ab-fsf014u; a\u094D\u200Db; xn--ab-fsf014u # a्b -T; \u0308\u200D\u0308\u0628b; [B1 C2 V5]; [B1 V5] # ̈̈بb -N; \u0308\u200D\u0308\u0628b; [B1 C2 V5]; [B1 C2 V5] # ̈̈بb -T; \u0308\u200D\u0308\u0628B; [B1 C2 V5]; [B1 V5] # ̈̈بb -N; \u0308\u200D\u0308\u0628B; [B1 C2 V5]; [B1 C2 V5] # ̈̈بb -B; xn--b-bcba413a7w8b; [B1 C2 V5]; [B1 C2 V5] # ̈̈بb -T; a\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6] # aب̈̈ -N; a\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6 C2] # aب̈̈ -T; A\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6] # aب̈̈ -N; A\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6 C2] # aب̈̈ -B; xn--a-ccba213abx8b; [B5 B6 C2]; [B5 B6 C2] # aب̈̈ -T; a\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5] # aب̈̈بb -N; a\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5 C2] # aب̈̈بb -T; A\u0628\u0308\u200D\u0308\u0628B; [B5 C2]; [B5] # aب̈̈بb -N; A\u0628\u0308\u200D\u0308\u0628B; [B5 C2]; [B5 C2] # aب̈̈بb -T; A\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5] # aب̈̈بb -N; A\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5 C2] # aب̈̈بb -B; xn--ab-uuba211bca5157b; [B5 C2]; [B5 C2] # aب̈̈بb - -# SELECTED TESTS - -B; ¡; ; xn--7a; NV8 -B; xn--7a; ¡; xn--7a; NV8 -B; ᧚; ; xn--pkf; XV8 -B; xn--pkf; ᧚; xn--pkf; XV8 -B; 。; [A4_2]; [A4_2] -B; .; [A4_2]; [A4_2] -B; ꭠ; ; xn--3y9a -B; xn--3y9a; ꭠ; xn--3y9a -B; 1234567890ä1234567890123456789012345678901234567890123456; ; [A4_2] -B; 1234567890a\u03081234567890123456789012345678901234567890123456; 1234567890ä1234567890123456789012345678901234567890123456; [A4_2] -B; 1234567890A\u03081234567890123456789012345678901234567890123456; 1234567890ä1234567890123456789012345678901234567890123456; [A4_2] -B; 1234567890Ä1234567890123456789012345678901234567890123456; 1234567890ä1234567890123456789012345678901234567890123456; [A4_2] -B; xn--12345678901234567890123456789012345678901234567890123456-fxe; 1234567890ä1234567890123456789012345678901234567890123456; [A4_2] -B; www.eXample.cOm; www.example.com; -B; Bücher.de; bücher.de; xn--bcher-kva.de -B; Bu\u0308cher.de; bücher.de; xn--bcher-kva.de -B; bu\u0308cher.de; bücher.de; xn--bcher-kva.de -B; bücher.de; ; xn--bcher-kva.de -B; BÜCHER.DE; bücher.de; xn--bcher-kva.de -B; BU\u0308CHER.DE; bücher.de; xn--bcher-kva.de -B; xn--bcher-kva.de; bücher.de; xn--bcher-kva.de -B; ÖBB; öbb; xn--bb-eka -B; O\u0308BB; öbb; xn--bb-eka -B; o\u0308bb; öbb; xn--bb-eka -B; öbb; ; xn--bb-eka -B; Öbb; öbb; xn--bb-eka -B; O\u0308bb; öbb; xn--bb-eka -B; xn--bb-eka; öbb; xn--bb-eka -T; βόλος.com; ; xn--nxasmq6b.com -N; βόλος.com; ; xn--nxasmm1c.com -T; βο\u0301λος.com; βόλος.com; xn--nxasmq6b.com -N; βο\u0301λος.com; βόλος.com; xn--nxasmm1c.com -B; ΒΟ\u0301ΛΟΣ.COM; βόλοσ.com; xn--nxasmq6b.com -B; ΒΌΛΟΣ.COM; βόλοσ.com; xn--nxasmq6b.com -B; βόλοσ.com; ; xn--nxasmq6b.com -B; βο\u0301λοσ.com; βόλοσ.com; xn--nxasmq6b.com -B; Βο\u0301λοσ.com; βόλοσ.com; xn--nxasmq6b.com -B; Βόλοσ.com; βόλοσ.com; xn--nxasmq6b.com -B; xn--nxasmq6b.com; βόλοσ.com; xn--nxasmq6b.com -T; Βο\u0301λος.com; βόλος.com; xn--nxasmq6b.com -N; Βο\u0301λος.com; βόλος.com; xn--nxasmm1c.com -T; Βόλος.com; βόλος.com; xn--nxasmq6b.com -N; Βόλος.com; βόλος.com; xn--nxasmm1c.com -B; xn--nxasmm1c.com; βόλος.com; xn--nxasmm1c.com -B; xn--nxasmm1c; βόλος; xn--nxasmm1c -T; βόλος; ; xn--nxasmq6b -N; βόλος; ; xn--nxasmm1c -T; βο\u0301λος; βόλος; xn--nxasmq6b -N; βο\u0301λος; βόλος; xn--nxasmm1c -B; ΒΟ\u0301ΛΟΣ; βόλοσ; xn--nxasmq6b -B; ΒΌΛΟΣ; βόλοσ; xn--nxasmq6b -B; βόλοσ; ; xn--nxasmq6b -B; βο\u0301λοσ; βόλοσ; xn--nxasmq6b -B; Βο\u0301λοσ; βόλοσ; xn--nxasmq6b -B; Βόλοσ; βόλοσ; xn--nxasmq6b -B; xn--nxasmq6b; βόλοσ; xn--nxasmq6b -T; Βόλος; βόλος; xn--nxasmq6b -N; Βόλος; βόλος; xn--nxasmm1c -T; Βο\u0301λος; βόλος; xn--nxasmq6b -N; Βο\u0301λος; βόλος; xn--nxasmm1c -T; www.ශ\u0DCA\u200Dර\u0DD3.com; ; www.xn--10cl1a0b.com # www.ශ්රී.com -N; www.ශ\u0DCA\u200Dර\u0DD3.com; ; www.xn--10cl1a0b660p.com # www.ශ්රී.com -T; WWW.ශ\u0DCA\u200Dර\u0DD3.COM; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b.com # www.ශ්රී.com -N; WWW.ශ\u0DCA\u200Dර\u0DD3.COM; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com # www.ශ්රී.com -T; Www.ශ\u0DCA\u200Dර\u0DD3.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b.com # www.ශ්රී.com -N; Www.ශ\u0DCA\u200Dර\u0DD3.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com # www.ශ්රී.com -B; www.xn--10cl1a0b.com; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com # www.ශ්රී.com -B; www.ශ\u0DCAර\u0DD3.com; ; www.xn--10cl1a0b.com # www.ශ්රී.com -B; WWW.ශ\u0DCAර\u0DD3.COM; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com # www.ශ්රී.com -B; Www.ශ\u0DCAර\u0DD3.com; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com # www.ශ්රී.com -B; www.xn--10cl1a0b660p.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com # www.ශ්රී.com -T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; ; xn--mgba3gch31f # نامهای -N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; ; xn--mgba3gch31f060k # نامهای -B; xn--mgba3gch31f; \u0646\u0627\u0645\u0647\u0627\u06CC; xn--mgba3gch31f # نامهای -B; \u0646\u0627\u0645\u0647\u0627\u06CC; ; xn--mgba3gch31f # نامهای -B; xn--mgba3gch31f060k; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; xn--mgba3gch31f060k # نامهای -B; xn--mgba3gch31f060k.com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com # نامهای.com -T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; ; xn--mgba3gch31f.com # نامهای.com -N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; ; xn--mgba3gch31f060k.com # نامهای.com -T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.COM; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f.com # نامهای.com -N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.COM; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com # نامهای.com -T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.Com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f.com # نامهای.com -N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.Com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com # نامهای.com -B; xn--mgba3gch31f.com; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com # نامهای.com -B; \u0646\u0627\u0645\u0647\u0627\u06CC.com; ; xn--mgba3gch31f.com # نامهای.com -B; \u0646\u0627\u0645\u0647\u0627\u06CC.COM; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com # نامهای.com -B; \u0646\u0627\u0645\u0647\u0627\u06CC.Com; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com # نامهای.com -B; a.b.c。d。; a.b.c.d.; -B; a.b.c。d。; a.b.c.d.; -B; A.B.C。D。; a.b.c.d.; -B; A.b.c。D。; a.b.c.d.; -B; a.b.c.d.; ; -B; A.B.C。D。; a.b.c.d.; -B; A.b.c。D。; a.b.c.d.; -B; U\u0308.xn--tda; ü.ü; xn--tda.xn--tda -B; Ü.xn--tda; ü.ü; xn--tda.xn--tda -B; ü.xn--tda; ü.ü; xn--tda.xn--tda -B; u\u0308.xn--tda; ü.ü; xn--tda.xn--tda -B; U\u0308.XN--TDA; ü.ü; xn--tda.xn--tda -B; Ü.XN--TDA; ü.ü; xn--tda.xn--tda -B; Ü.xn--Tda; ü.ü; xn--tda.xn--tda -B; U\u0308.xn--Tda; ü.ü; xn--tda.xn--tda -B; xn--tda.xn--tda; ü.ü; xn--tda.xn--tda -B; ü.ü; ; xn--tda.xn--tda -B; u\u0308.u\u0308; ü.ü; xn--tda.xn--tda -B; U\u0308.U\u0308; ü.ü; xn--tda.xn--tda -B; Ü.Ü; ü.ü; xn--tda.xn--tda -B; Ü.ü; ü.ü; xn--tda.xn--tda -B; U\u0308.u\u0308; ü.ü; xn--tda.xn--tda -B; xn--u-ccb; [V1]; [V1] # ü -B; a⒈com; [P1 V6]; [P1 V6] -B; a1.com; ; -B; A⒈COM; [P1 V6]; [P1 V6] -B; A⒈Com; [P1 V6]; [P1 V6] -B; xn--acom-0w1b; [V6]; [V6] -B; xn--a-ecp.ru; [V6]; [V6] -B; xn--0.pt; [A3]; [A3] -B; xn--a.pt; [V6]; [V6] # .pt -B; xn--a-Ä.pt; [A3]; [A3] -B; xn--a-A\u0308.pt; [A3]; [A3] -B; xn--a-a\u0308.pt; [A3]; [A3] -B; xn--a-ä.pt; [A3]; [A3] -B; XN--A-Ä.PT; [A3]; [A3] -B; XN--A-A\u0308.PT; [A3]; [A3] -B; Xn--A-A\u0308.pt; [A3]; [A3] -B; Xn--A-Ä.pt; [A3]; [A3] -B; xn--xn--a--gua.pt; [V2]; [V2] -B; 日本語。JP; 日本語.jp; xn--wgv71a119e.jp -B; 日本語。JP; 日本語.jp; xn--wgv71a119e.jp -B; 日本語。jp; 日本語.jp; xn--wgv71a119e.jp -B; 日本語。Jp; 日本語.jp; xn--wgv71a119e.jp -B; xn--wgv71a119e.jp; 日本語.jp; xn--wgv71a119e.jp -B; 日本語.jp; ; xn--wgv71a119e.jp -B; 日本語.JP; 日本語.jp; xn--wgv71a119e.jp -B; 日本語.Jp; 日本語.jp; xn--wgv71a119e.jp -B; 日本語。jp; 日本語.jp; xn--wgv71a119e.jp -B; 日本語。Jp; 日本語.jp; xn--wgv71a119e.jp -B; ☕; ; xn--53h; NV8 -B; xn--53h; ☕; xn--53h; NV8 -T; 1.aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [A4_2] # 1.aßbcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz -N; 1.aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [C1 C2 A4_2] # 1.aßbcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz -T; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSS\u0302SSZ; [C1 C2]; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -N; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSS\u0302SSZ; [C1 C2]; [C1 C2 A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -T; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; [C1 C2]; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -N; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; [C1 C2]; [C1 C2 A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -T; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -N; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [C1 C2 A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -T; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -N; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [C1 C2 A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -T; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -N; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [C1 C2 A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -T; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -N; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [C1 C2 A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -B; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [A4_2] -B; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; ; [A4_2] -B; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [A4_2] -B; 1.ASSBCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSS\u0302SSZ; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [A4_2] -B; 1.ASSBCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [A4_2] -B; 1.Assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [A4_2] -B; 1.Assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [A4_2] -B; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc; [C1 C2]; [C1 C2 A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz -T; 1.Aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [A4_2] # 1.aßbcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz -N; 1.Aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [C1 C2 A4_2] # 1.aßbcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz -B; 1.xn--abcdexyz-qyacaaabaaaaaaabaaaaaaaaabaaaaaaaaabaaaaaaaa010ze2isb1140zba8cc; [C1 C2]; [C1 C2 A4_2] # 1.aßbcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz -T; \u200Cx\u200Dn\u200C-\u200D-bß; [C1 C2]; xn--bss # xn--bß -N; \u200Cx\u200Dn\u200C-\u200D-bß; [C1 C2]; [C1 C2] # xn--bß -T; \u200CX\u200DN\u200C-\u200D-BSS; [C1 C2]; xn--bss # xn--bss -N; \u200CX\u200DN\u200C-\u200D-BSS; [C1 C2]; [C1 C2] # xn--bss -T; \u200Cx\u200Dn\u200C-\u200D-bss; [C1 C2]; xn--bss # xn--bss -N; \u200Cx\u200Dn\u200C-\u200D-bss; [C1 C2]; [C1 C2] # xn--bss -T; \u200CX\u200Dn\u200C-\u200D-Bss; [C1 C2]; xn--bss # xn--bss -N; \u200CX\u200Dn\u200C-\u200D-Bss; [C1 C2]; [C1 C2] # xn--bss -B; xn--bss; 夙; xn--bss -B; 夙; ; xn--bss -B; xn--xn--bss-7z6ccid; [C1 C2]; [C1 C2] # xn--bss -T; \u200CX\u200Dn\u200C-\u200D-Bß; [C1 C2]; xn--bss # xn--bß -N; \u200CX\u200Dn\u200C-\u200D-Bß; [C1 C2]; [C1 C2] # xn--bß -B; xn--xn--b-pqa5796ccahd; [C1 C2]; [C1 C2] # xn--bß -B; ˣ\u034Fℕ\u200B﹣\u00AD-\u180Cℬ\uFE00ſ\u2064𝔰󠇯ffl; 夡夞夜夙; xn--bssffl -B; x\u034FN\u200B-\u00AD-\u180CB\uFE00s\u2064s󠇯ffl; 夡夞夜夙; xn--bssffl -B; x\u034Fn\u200B-\u00AD-\u180Cb\uFE00s\u2064s󠇯ffl; 夡夞夜夙; xn--bssffl -B; X\u034FN\u200B-\u00AD-\u180CB\uFE00S\u2064S󠇯FFL; 夡夞夜夙; xn--bssffl -B; X\u034Fn\u200B-\u00AD-\u180CB\uFE00s\u2064s󠇯ffl; 夡夞夜夙; xn--bssffl -B; xn--bssffl; 夡夞夜夙; xn--bssffl -B; 夡夞夜夙; ; xn--bssffl -B; ˣ\u034Fℕ\u200B﹣\u00AD-\u180Cℬ\uFE00S\u2064𝔰󠇯FFL; 夡夞夜夙; xn--bssffl -B; x\u034FN\u200B-\u00AD-\u180CB\uFE00S\u2064s󠇯FFL; 夡夞夜夙; xn--bssffl -B; ˣ\u034Fℕ\u200B﹣\u00AD-\u180Cℬ\uFE00s\u2064𝔰󠇯ffl; 夡夞夜夙; xn--bssffl -B; 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; -B; 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; -B; 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; [A4_1] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; [A4_1 A4_2] -B; ä1234567890123456789012345678901234567890123456789012345; ; xn--1234567890123456789012345678901234567890123456789012345-9te -B; a\u03081234567890123456789012345678901234567890123456789012345; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te -B; A\u03081234567890123456789012345678901234567890123456789012345; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te -B; Ä1234567890123456789012345678901234567890123456789012345; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te -B; xn--1234567890123456789012345678901234567890123456789012345-9te; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890a\u0308123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890A\u0308123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 -B; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890a\u0308123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890A\u0308123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. -B; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; [A4_1] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890a\u0308123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890A\u0308123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1] -B; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890a\u03081234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890A\u03081234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890a\u03081234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890A\u03081234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; [A4_1 A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890a\u03081234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_1 A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890A\u03081234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_1 A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_1 A4_2] -B; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_1 A4_2] -B; a.b..-q--a-.e; [V2 V3 A4_2]; [V2 V3 A4_2] -B; a.b..-q--ä-.e; [V2 V3 A4_2]; [V2 V3 A4_2] -B; a.b..-q--a\u0308-.e; [V2 V3 A4_2]; [V2 V3 A4_2] -B; A.B..-Q--A\u0308-.E; [V2 V3 A4_2]; [V2 V3 A4_2] -B; A.B..-Q--Ä-.E; [V2 V3 A4_2]; [V2 V3 A4_2] -B; A.b..-Q--Ä-.E; [V2 V3 A4_2]; [V2 V3 A4_2] -B; A.b..-Q--A\u0308-.E; [V2 V3 A4_2]; [V2 V3 A4_2] -B; a.b..xn---q----jra.e; [V2 V3 A4_2]; [V2 V3 A4_2] -B; a..c; [A4_2]; [A4_2] -B; a.-b.; [V3]; [V3] -B; a.b-.c; [V3]; [V3] -B; a.-.c; [V3]; [V3] -B; a.bc--de.f; [V2]; [V2] -B; ä.\u00AD.c; [A4_2]; [A4_2] -B; a\u0308.\u00AD.c; [A4_2]; [A4_2] -B; A\u0308.\u00AD.C; [A4_2]; [A4_2] -B; Ä.\u00AD.C; [A4_2]; [A4_2] -B; xn--4ca..c; [A4_2]; [A4_2] -B; ä.-b.; [V3]; [V3] -B; a\u0308.-b.; [V3]; [V3] -B; A\u0308.-B.; [V3]; [V3] -B; Ä.-B.; [V3]; [V3] -B; xn--4ca.-b.; [V3]; [V3] -B; ä.b-.c; [V3]; [V3] -B; a\u0308.b-.c; [V3]; [V3] -B; A\u0308.B-.C; [V3]; [V3] -B; Ä.B-.C; [V3]; [V3] -B; Ä.b-.C; [V3]; [V3] -B; A\u0308.b-.C; [V3]; [V3] -B; xn--4ca.b-.c; [V3]; [V3] -B; ä.-.c; [V3]; [V3] -B; a\u0308.-.c; [V3]; [V3] -B; A\u0308.-.C; [V3]; [V3] -B; Ä.-.C; [V3]; [V3] -B; xn--4ca.-.c; [V3]; [V3] -B; ä.bc--de.f; [V2]; [V2] -B; a\u0308.bc--de.f; [V2]; [V2] -B; A\u0308.BC--DE.F; [V2]; [V2] -B; Ä.BC--DE.F; [V2]; [V2] -B; Ä.bc--De.f; [V2]; [V2] -B; A\u0308.bc--De.f; [V2]; [V2] -B; xn--4ca.bc--de.f; [V2]; [V2] -B; a.b.\u0308c.d; [V5]; [V5] # a.b.̈c.d -B; A.B.\u0308C.D; [V5]; [V5] # a.b.̈c.d -B; A.b.\u0308c.d; [V5]; [V5] # a.b.̈c.d -B; a.b.xn--c-bcb.d; [V5]; [V5] # a.b.̈c.d -B; A0; a0; -B; 0A; 0a; -B; 0A.\u05D0; [B1]; [B1] # 0a.א -B; 0a.\u05D0; [B1]; [B1] # 0a.א -B; 0a.xn--4db; [B1]; [B1] # 0a.א -B; c.xn--0-eha.xn--4db; [B1]; [B1] # c.0ü.א -B; b-.\u05D0; [B6 V3]; [B6 V3] # b-.א -B; B-.\u05D0; [B6 V3]; [B6 V3] # b-.א -B; b-.xn--4db; [B6 V3]; [B6 V3] # b-.א -B; d.xn----dha.xn--4db; [B6 V3]; [B6 V3] # d.ü-.א -B; a\u05D0; [B5 B6]; [B5 B6] # aא -B; A\u05D0; [B5 B6]; [B5 B6] # aא -B; xn--a-0hc; [B5 B6]; [B5 B6] # aא -B; \u05D0\u05C7; ; xn--vdbr # אׇ -B; xn--vdbr; \u05D0\u05C7; xn--vdbr # אׇ -B; \u05D09\u05C7; ; xn--9-ihcz # א9ׇ -B; xn--9-ihcz; \u05D09\u05C7; xn--9-ihcz # א9ׇ -B; \u05D0a\u05C7; [B2 B3]; [B2 B3] # אaׇ -B; \u05D0A\u05C7; [B2 B3]; [B2 B3] # אaׇ -B; xn--a-ihcz; [B2 B3]; [B2 B3] # אaׇ -B; \u05D0\u05EA; ; xn--4db6c # את -B; xn--4db6c; \u05D0\u05EA; xn--4db6c # את -B; \u05D0\u05F3\u05EA; ; xn--4db6c0a # א׳ת -B; xn--4db6c0a; \u05D0\u05F3\u05EA; xn--4db6c0a # א׳ת -B; a\u05D0Tz; [B5]; [B5] # aאtz -B; a\u05D0tz; [B5]; [B5] # aאtz -B; A\u05D0TZ; [B5]; [B5] # aאtz -B; A\u05D0tz; [B5]; [B5] # aאtz -B; xn--atz-qpe; [B5]; [B5] # aאtz -B; \u05D0T\u05EA; [B2]; [B2] # אtת -B; \u05D0t\u05EA; [B2]; [B2] # אtת -B; xn--t-zhc3f; [B2]; [B2] # אtת -B; \u05D07\u05EA; ; xn--7-zhc3f # א7ת -B; xn--7-zhc3f; \u05D07\u05EA; xn--7-zhc3f # א7ת -B; \u05D0\u0667\u05EA; ; xn--4db6c6t # א٧ת -B; xn--4db6c6t; \u05D0\u0667\u05EA; xn--4db6c6t # א٧ת -B; a7\u0667z; [B5]; [B5] # a7٧z -B; A7\u0667Z; [B5]; [B5] # a7٧z -B; A7\u0667z; [B5]; [B5] # a7٧z -B; xn--a7z-06e; [B5]; [B5] # a7٧z -B; \u05D07\u0667\u05EA; [B4]; [B4] # א7٧ת -B; xn--7-zhc3fty; [B4]; [B4] # א7٧ת -T; ஹ\u0BCD\u200D; ; xn--dmc4b # ஹ் -N; ஹ\u0BCD\u200D; ; xn--dmc4b194h # ஹ் -B; xn--dmc4b; ஹ\u0BCD; xn--dmc4b # ஹ் -B; ஹ\u0BCD; ; xn--dmc4b # ஹ் -B; xn--dmc4b194h; ஹ\u0BCD\u200D; xn--dmc4b194h # ஹ் -T; ஹ\u200D; [C2]; xn--dmc # ஹ -N; ஹ\u200D; [C2]; [C2] # ஹ -B; xn--dmc; ஹ; xn--dmc -B; ஹ; ; xn--dmc -B; xn--dmc225h; [C2]; [C2] # ஹ -T; \u200D; [C2]; [A4_2] # -N; \u200D; [C2]; [C2] # -B; ; [A4_2]; [A4_2] -B; xn--1ug; [C2]; [C2] # -T; ஹ\u0BCD\u200C; ; xn--dmc4b # ஹ் -N; ஹ\u0BCD\u200C; ; xn--dmc4by94h # ஹ் -B; xn--dmc4by94h; ஹ\u0BCD\u200C; xn--dmc4by94h # ஹ் -T; ஹ\u200C; [C1]; xn--dmc # ஹ -N; ஹ\u200C; [C1]; [C1] # ஹ -B; xn--dmc025h; [C1]; [C1] # ஹ -T; \u200C; [C1]; [A4_2] # -N; \u200C; [C1]; [C1] # -B; xn--0ug; [C1]; [C1] # -T; \u0644\u0670\u200C\u06ED\u06EF; ; xn--ghb2gxqia # لٰۭۯ -N; \u0644\u0670\u200C\u06ED\u06EF; ; xn--ghb2gxqia7523a # لٰۭۯ -B; xn--ghb2gxqia; \u0644\u0670\u06ED\u06EF; xn--ghb2gxqia # لٰۭۯ -B; \u0644\u0670\u06ED\u06EF; ; xn--ghb2gxqia # لٰۭۯ -B; xn--ghb2gxqia7523a; \u0644\u0670\u200C\u06ED\u06EF; xn--ghb2gxqia7523a # لٰۭۯ -T; \u0644\u0670\u200C\u06EF; ; xn--ghb2g3q # لٰۯ -N; \u0644\u0670\u200C\u06EF; ; xn--ghb2g3qq34f # لٰۯ -B; xn--ghb2g3q; \u0644\u0670\u06EF; xn--ghb2g3q # لٰۯ -B; \u0644\u0670\u06EF; ; xn--ghb2g3q # لٰۯ -B; xn--ghb2g3qq34f; \u0644\u0670\u200C\u06EF; xn--ghb2g3qq34f # لٰۯ -T; \u0644\u200C\u06ED\u06EF; ; xn--ghb25aga # لۭۯ -N; \u0644\u200C\u06ED\u06EF; ; xn--ghb25aga828w # لۭۯ -B; xn--ghb25aga; \u0644\u06ED\u06EF; xn--ghb25aga # لۭۯ -B; \u0644\u06ED\u06EF; ; xn--ghb25aga # لۭۯ -B; xn--ghb25aga828w; \u0644\u200C\u06ED\u06EF; xn--ghb25aga828w # لۭۯ -T; \u0644\u200C\u06EF; ; xn--ghb65a # لۯ -N; \u0644\u200C\u06EF; ; xn--ghb65a953d # لۯ -B; xn--ghb65a; \u0644\u06EF; xn--ghb65a # لۯ -B; \u0644\u06EF; ; xn--ghb65a # لۯ -B; xn--ghb65a953d; \u0644\u200C\u06EF; xn--ghb65a953d # لۯ -T; \u0644\u0670\u200C\u06ED; [B3 C1]; xn--ghb2gxq # لٰۭ -N; \u0644\u0670\u200C\u06ED; [B3 C1]; [B3 C1] # لٰۭ -B; xn--ghb2gxq; \u0644\u0670\u06ED; xn--ghb2gxq # لٰۭ -B; \u0644\u0670\u06ED; ; xn--ghb2gxq # لٰۭ -B; xn--ghb2gxqy34f; [B3 C1]; [B3 C1] # لٰۭ -T; \u06EF\u200C\u06EF; [C1]; xn--cmba # ۯۯ -N; \u06EF\u200C\u06EF; [C1]; [C1] # ۯۯ -B; xn--cmba; \u06EF\u06EF; xn--cmba # ۯۯ -B; \u06EF\u06EF; ; xn--cmba # ۯۯ -B; xn--cmba004q; [C1]; [C1] # ۯۯ -T; \u0644\u200C; [B3 C1]; xn--ghb # ل -N; \u0644\u200C; [B3 C1]; [B3 C1] # ل -B; xn--ghb; \u0644; xn--ghb # ل -B; \u0644; ; xn--ghb # ل -B; xn--ghb413k; [B3 C1]; [B3 C1] # ل -B; a。。b; [A4_2]; [A4_2] -B; A。。B; [A4_2]; [A4_2] -B; a..b; [A4_2]; [A4_2] -T; \u200D。。\u06B9\u200C; [B1 B3 C1 C2 A4_2]; [A4_2] # ..ڹ -N; \u200D。。\u06B9\u200C; [B1 B3 C1 C2 A4_2]; [B1 B3 C1 C2 A4_2] # ..ڹ -B; ..xn--skb; [A4_2]; [A4_2] # ..ڹ -B; xn--1ug..xn--skb080k; [B1 B3 C1 C2 A4_2]; [B1 B3 C1 C2 A4_2] # ..ڹ -B; \u05D00\u0660; [B4]; [B4] # א0٠ -B; xn--0-zhc74b; [B4]; [B4] # א0٠ -B; $; [P1 V6]; [P1 V6] - -# RANDOMIZED TESTS - -B; c.0ü.\u05D0; [B1]; [B1] # c.0ü.א -B; c.0u\u0308.\u05D0; [B1]; [B1] # c.0ü.א -B; C.0U\u0308.\u05D0; [B1]; [B1] # c.0ü.א -B; C.0Ü.\u05D0; [B1]; [B1] # c.0ü.א -B; ⒕∝\u065F򓤦.-󠄯; [P1 V3 V6]; [P1 V3 V6] # ⒕∝ٟ.- -B; 14.∝\u065F򓤦.-󠄯; [P1 V3 V6]; [P1 V3 V6] # 14.∝ٟ.- -B; 14.xn--7hb713l3v90n.-; [V3 V6]; [V3 V6] # 14.∝ٟ.- -B; xn--7hb713lfwbi1311b.-; [V3 V6]; [V3 V6] # ⒕∝ٟ.- -B; ꡣ.\u07CF; ; xn--8c9a.xn--qsb # ꡣ.ߏ -B; xn--8c9a.xn--qsb; ꡣ.\u07CF; xn--8c9a.xn--qsb # ꡣ.ߏ -B; ≯\u0603。-; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ≯.- -B; >\u0338\u0603。-; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ≯.- -B; ≯\u0603。-; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ≯.- -B; >\u0338\u0603。-; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ≯.- -B; xn--lfb566l.-; [B1 V3 V6]; [B1 V3 V6] # ≯.- -T; ⾛𐹧⾕.\u115F󠗰ςႭ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.ςႭ -N; ⾛𐹧⾕.\u115F󠗰ςႭ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.ςႭ -T; 走𐹧谷.\u115F󠗰ςႭ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.ςႭ -N; 走𐹧谷.\u115F󠗰ςႭ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.ςႭ -T; 走𐹧谷.\u115F󠗰ςⴍ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.ςⴍ -N; 走𐹧谷.\u115F󠗰ςⴍ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.ςⴍ -B; 走𐹧谷.\u115F󠗰ΣႭ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.σႭ -B; 走𐹧谷.\u115F󠗰σⴍ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.σⴍ -B; 走𐹧谷.\u115F󠗰Σⴍ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.σⴍ -B; xn--6g3a1x434z.xn--4xa180eotvh7453a; [B5 V6]; [B5 V6] # 走𐹧谷.σⴍ -B; xn--6g3a1x434z.xn--4xa627dhpae6345i; [B5 V6]; [B5 V6] # 走𐹧谷.σႭ -B; xn--6g3a1x434z.xn--3xa380eotvh7453a; [B5 V6]; [B5 V6] # 走𐹧谷.ςⴍ -B; xn--6g3a1x434z.xn--3xa827dhpae6345i; [B5 V6]; [B5 V6] # 走𐹧谷.ςႭ -T; ⾛𐹧⾕.\u115F󠗰ςⴍ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.ςⴍ -N; ⾛𐹧⾕.\u115F󠗰ςⴍ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.ςⴍ -B; ⾛𐹧⾕.\u115F󠗰ΣႭ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.σႭ -B; ⾛𐹧⾕.\u115F󠗰σⴍ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.σⴍ -B; ⾛𐹧⾕.\u115F󠗰Σⴍ; [B5 P1 V6]; [B5 P1 V6] # 走𐹧谷.σⴍ -T; \u200D≠ᢙ≯.솣-ᡴႠ; [C2 P1 V6]; [P1 V6] # ≠ᢙ≯.솣-ᡴႠ -N; \u200D≠ᢙ≯.솣-ᡴႠ; [C2 P1 V6]; [C2 P1 V6] # ≠ᢙ≯.솣-ᡴႠ -T; \u200D=\u0338ᢙ>\u0338.솣-ᡴႠ; [C2 P1 V6]; [P1 V6] # ≠ᢙ≯.솣-ᡴႠ -N; \u200D=\u0338ᢙ>\u0338.솣-ᡴႠ; [C2 P1 V6]; [C2 P1 V6] # ≠ᢙ≯.솣-ᡴႠ -T; \u200D=\u0338ᢙ>\u0338.솣-ᡴⴀ; [C2 P1 V6]; [P1 V6] # ≠ᢙ≯.솣-ᡴⴀ -N; \u200D=\u0338ᢙ>\u0338.솣-ᡴⴀ; [C2 P1 V6]; [C2 P1 V6] # ≠ᢙ≯.솣-ᡴⴀ -T; \u200D≠ᢙ≯.솣-ᡴⴀ; [C2 P1 V6]; [P1 V6] # ≠ᢙ≯.솣-ᡴⴀ -N; \u200D≠ᢙ≯.솣-ᡴⴀ; [C2 P1 V6]; [C2 P1 V6] # ≠ᢙ≯.솣-ᡴⴀ -B; xn--jbf911clb.xn----p9j493ivi4l; [V6]; [V6] -B; xn--jbf929a90b0b.xn----p9j493ivi4l; [C2 V6]; [C2 V6] # ≠ᢙ≯.솣-ᡴⴀ -B; xn--jbf911clb.xn----6zg521d196p; [V6]; [V6] -B; xn--jbf929a90b0b.xn----6zg521d196p; [C2 V6]; [C2 V6] # ≠ᢙ≯.솣-ᡴႠ -B; 񯞜.𐿇\u0FA2\u077D\u0600; [P1 V6]; [P1 V6] # .ྡྷݽ -B; 񯞜.𐿇\u0FA1\u0FB7\u077D\u0600; [P1 V6]; [P1 V6] # .ྡྷݽ -B; 񯞜.𐿇\u0FA1\u0FB7\u077D\u0600; [P1 V6]; [P1 V6] # .ྡྷݽ -B; xn--gw68a.xn--ifb57ev2psc6027m; [V6]; [V6] # .ྡྷݽ -B; 𣳔\u0303.𑓂; [V5]; [V5] # 𣳔̃.𑓂 -B; xn--nsa95820a.xn--wz1d; [V5]; [V5] # 𣳔̃.𑓂 -B; 𞤀𞥅񘐱。󠄌Ⴣꡥ; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 𞤢𞥅񘐱。󠄌ⴣꡥ; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; xn--9d6hgcy3556a.xn--rlju750b; [B2 B3 V6]; [B2 B3 V6] -B; xn--9d6hgcy3556a.xn--7nd0578e; [B2 B3 V6]; [B2 B3 V6] -B; 𞤀𞥅񘐱。󠄌ⴣꡥ; [B2 B3 P1 V6]; [B2 B3 P1 V6] -T; \u08E2𑁿ς𖬱。󠅡렧; [B1 P1 V6]; [B1 P1 V6] # 𑁿ς𖬱.렧 -N; \u08E2𑁿ς𖬱。󠅡렧; [B1 P1 V6]; [B1 P1 V6] # 𑁿ς𖬱.렧 -T; \u08E2𑁿ς𖬱。󠅡렧; [B1 P1 V6]; [B1 P1 V6] # 𑁿ς𖬱.렧 -N; \u08E2𑁿ς𖬱。󠅡렧; [B1 P1 V6]; [B1 P1 V6] # 𑁿ς𖬱.렧 -B; \u08E2𑁿Σ𖬱。󠅡렧; [B1 P1 V6]; [B1 P1 V6] # 𑁿σ𖬱.렧 -B; \u08E2𑁿Σ𖬱。󠅡렧; [B1 P1 V6]; [B1 P1 V6] # 𑁿σ𖬱.렧 -B; \u08E2𑁿σ𖬱。󠅡렧; [B1 P1 V6]; [B1 P1 V6] # 𑁿σ𖬱.렧 -B; \u08E2𑁿σ𖬱。󠅡렧; [B1 P1 V6]; [B1 P1 V6] # 𑁿σ𖬱.렧 -B; xn--4xa53xp48ys2xc.xn--kn2b; [B1 V6]; [B1 V6] # 𑁿σ𖬱.렧 -B; xn--3xa73xp48ys2xc.xn--kn2b; [B1 V6]; [B1 V6] # 𑁿ς𖬱.렧 -T; -\u200D。𞤍\u200C\u200D⒈; [B1 C1 C2 P1 V3 V6]; [B1 P1 V3 V6] # -.𞤯⒈ -N; -\u200D。𞤍\u200C\u200D⒈; [B1 C1 C2 P1 V3 V6]; [B1 C1 C2 P1 V3 V6] # -.𞤯⒈ -T; -\u200D。𞤍\u200C\u200D1.; [B1 C1 C2 V3]; [B1 V3] # -.𞤯1. -N; -\u200D。𞤍\u200C\u200D1.; [B1 C1 C2 V3]; [B1 C1 C2 V3] # -.𞤯1. -T; -\u200D。𞤯\u200C\u200D1.; [B1 C1 C2 V3]; [B1 V3] # -.𞤯1. -N; -\u200D。𞤯\u200C\u200D1.; [B1 C1 C2 V3]; [B1 C1 C2 V3] # -.𞤯1. -B; -.xn--1-0i8r.; [B1 V3]; [B1 V3] -B; xn----ugn.xn--1-rgnd61297b.; [B1 C1 C2 V3]; [B1 C1 C2 V3] # -.𞤯1. -T; -\u200D。𞤯\u200C\u200D⒈; [B1 C1 C2 P1 V3 V6]; [B1 P1 V3 V6] # -.𞤯⒈ -N; -\u200D。𞤯\u200C\u200D⒈; [B1 C1 C2 P1 V3 V6]; [B1 C1 C2 P1 V3 V6] # -.𞤯⒈ -B; -.xn--tsh3666n; [B1 V3 V6]; [B1 V3 V6] -B; xn----ugn.xn--0ugc555aiv51d; [B1 C1 C2 V3 V6]; [B1 C1 C2 V3 V6] # -.𞤯⒈ -T; \u200C򅎭.Ⴒ𑇀; [C1 P1 V6]; [P1 V6] # .Ⴒ𑇀 -N; \u200C򅎭.Ⴒ𑇀; [C1 P1 V6]; [C1 P1 V6] # .Ⴒ𑇀 -T; \u200C򅎭.ⴒ𑇀; [C1 P1 V6]; [P1 V6] # .ⴒ𑇀 -N; \u200C򅎭.ⴒ𑇀; [C1 P1 V6]; [C1 P1 V6] # .ⴒ𑇀 -B; xn--bn95b.xn--9kj2034e; [V6]; [V6] -B; xn--0ug15083f.xn--9kj2034e; [C1 V6]; [C1 V6] # .ⴒ𑇀 -B; xn--bn95b.xn--qnd6272k; [V6]; [V6] -B; xn--0ug15083f.xn--qnd6272k; [C1 V6]; [C1 V6] # .Ⴒ𑇀 -T; 繱𑖿\u200D.8︒; [P1 V6]; [P1 V6] # 繱𑖿.8︒ -N; 繱𑖿\u200D.8︒; [P1 V6]; [P1 V6] # 繱𑖿.8︒ -T; 繱𑖿\u200D.8。; 繱𑖿\u200D.8.; xn--gl0as212a.8. # 繱𑖿.8. -N; 繱𑖿\u200D.8。; 繱𑖿\u200D.8.; xn--1ug6928ac48e.8. # 繱𑖿.8. -B; xn--gl0as212a.8.; 繱𑖿.8.; xn--gl0as212a.8. -B; 繱𑖿.8.; ; xn--gl0as212a.8. -B; xn--1ug6928ac48e.8.; 繱𑖿\u200D.8.; xn--1ug6928ac48e.8. # 繱𑖿.8. -T; 繱𑖿\u200D.8.; ; xn--gl0as212a.8. # 繱𑖿.8. -N; 繱𑖿\u200D.8.; ; xn--1ug6928ac48e.8. # 繱𑖿.8. -B; xn--gl0as212a.xn--8-o89h; [V6]; [V6] -B; xn--1ug6928ac48e.xn--8-o89h; [V6]; [V6] # 繱𑖿.8︒ -B; 󠆾.𞀈; [V5 A4_2]; [V5 A4_2] -B; 󠆾.𞀈; [V5 A4_2]; [V5 A4_2] -B; .xn--ph4h; [V5 A4_2]; [V5 A4_2] -T; ß\u06EB。\u200D; [C2]; xn--ss-59d. # ß۫. -N; ß\u06EB。\u200D; [C2]; [C2] # ß۫. -T; SS\u06EB。\u200D; [C2]; xn--ss-59d. # ss۫. -N; SS\u06EB。\u200D; [C2]; [C2] # ss۫. -T; ss\u06EB。\u200D; [C2]; xn--ss-59d. # ss۫. -N; ss\u06EB。\u200D; [C2]; [C2] # ss۫. -T; Ss\u06EB。\u200D; [C2]; xn--ss-59d. # ss۫. -N; Ss\u06EB。\u200D; [C2]; [C2] # ss۫. -B; xn--ss-59d.; ss\u06EB.; xn--ss-59d. # ss۫. -B; ss\u06EB.; ; xn--ss-59d. # ss۫. -B; SS\u06EB.; ss\u06EB.; xn--ss-59d. # ss۫. -B; Ss\u06EB.; ss\u06EB.; xn--ss-59d. # ss۫. -B; xn--ss-59d.xn--1ug; [C2]; [C2] # ss۫. -B; xn--zca012a.xn--1ug; [C2]; [C2] # ß۫. -T; 󠐵\u200C⒈.󠎇; [C1 P1 V6]; [P1 V6] # ⒈. -N; 󠐵\u200C⒈.󠎇; [C1 P1 V6]; [C1 P1 V6] # ⒈. -T; 󠐵\u200C1..󠎇; [C1 P1 V6 A4_2]; [P1 V6 A4_2] # 1.. -N; 󠐵\u200C1..󠎇; [C1 P1 V6 A4_2]; [C1 P1 V6 A4_2] # 1.. -B; xn--1-bs31m..xn--tv36e; [V6 A4_2]; [V6 A4_2] -B; xn--1-rgn37671n..xn--tv36e; [C1 V6 A4_2]; [C1 V6 A4_2] # 1.. -B; xn--tshz2001k.xn--tv36e; [V6]; [V6] -B; xn--0ug88o47900b.xn--tv36e; [C1 V6]; [C1 V6] # ⒈. -T; 󟈣\u065F\uAAB2ß。󌓧; [P1 V6]; [P1 V6] # ٟꪲß. -N; 󟈣\u065F\uAAB2ß。󌓧; [P1 V6]; [P1 V6] # ٟꪲß. -B; 󟈣\u065F\uAAB2SS。󌓧; [P1 V6]; [P1 V6] # ٟꪲss. -B; 󟈣\u065F\uAAB2ss。󌓧; [P1 V6]; [P1 V6] # ٟꪲss. -B; 󟈣\u065F\uAAB2Ss。󌓧; [P1 V6]; [P1 V6] # ٟꪲss. -B; xn--ss-3xd2839nncy1m.xn--bb79d; [V6]; [V6] # ٟꪲss. -B; xn--zca92z0t7n5w96j.xn--bb79d; [V6]; [V6] # ٟꪲß. -T; \u0774\u200C𞤿。𽘐䉜\u200D񿤼; [C1 C2 P1 V6]; [P1 V6] # ݴ𞤿.䉜 -N; \u0774\u200C𞤿。𽘐䉜\u200D񿤼; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ݴ𞤿.䉜 -T; \u0774\u200C𞤝。𽘐䉜\u200D񿤼; [C1 C2 P1 V6]; [P1 V6] # ݴ𞤿.䉜 -N; \u0774\u200C𞤝。𽘐䉜\u200D񿤼; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ݴ𞤿.䉜 -B; xn--4pb2977v.xn--z0nt555ukbnv; [V6]; [V6] # ݴ𞤿.䉜 -B; xn--4pb607jjt73a.xn--1ug236ke314donv1a; [C1 C2 V6]; [C1 C2 V6] # ݴ𞤿.䉜 -T; 򔭜ςᡱ⒈.≮𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # ςᡱ⒈.≮𑄳𐮍 -N; 򔭜ςᡱ⒈.≮𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # ςᡱ⒈.≮𑄳𐮍 -T; 򔭜ςᡱ⒈.<\u0338𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # ςᡱ⒈.≮𑄳𐮍 -N; 򔭜ςᡱ⒈.<\u0338𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # ςᡱ⒈.≮𑄳𐮍 -T; 򔭜ςᡱ1..≮𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ςᡱ1..≮𑄳𐮍 -N; 򔭜ςᡱ1..≮𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ςᡱ1..≮𑄳𐮍 -T; 򔭜ςᡱ1..<\u0338𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ςᡱ1..≮𑄳𐮍 -N; 򔭜ςᡱ1..<\u0338𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ςᡱ1..≮𑄳𐮍 -T; 򔭜Σᡱ1..<\u0338𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # σᡱ1..≮𑄳𐮍 -N; 򔭜Σᡱ1..<\u0338𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # σᡱ1..≮𑄳𐮍 -T; 򔭜Σᡱ1..≮𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # σᡱ1..≮𑄳𐮍 -N; 򔭜Σᡱ1..≮𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # σᡱ1..≮𑄳𐮍 -T; 򔭜σᡱ1..≮𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # σᡱ1..≮𑄳𐮍 -N; 򔭜σᡱ1..≮𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # σᡱ1..≮𑄳𐮍 -T; 򔭜σᡱ1..<\u0338𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # σᡱ1..≮𑄳𐮍 -N; 򔭜σᡱ1..<\u0338𑄳\u200D𐮍; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # σᡱ1..≮𑄳𐮍 -B; xn--1-zmb699meq63t..xn--gdh5392g6sd; [B1 V6 A4_2]; [B1 V6 A4_2] -B; xn--1-zmb699meq63t..xn--1ug85gn777ahze; [B1 V6 A4_2]; [B1 V6 A4_2] # σᡱ1..≮𑄳𐮍 -B; xn--1-xmb999meq63t..xn--1ug85gn777ahze; [B1 V6 A4_2]; [B1 V6 A4_2] # ςᡱ1..≮𑄳𐮍 -T; 򔭜Σᡱ⒈.<\u0338𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # σᡱ⒈.≮𑄳𐮍 -N; 򔭜Σᡱ⒈.<\u0338𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # σᡱ⒈.≮𑄳𐮍 -T; 򔭜Σᡱ⒈.≮𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # σᡱ⒈.≮𑄳𐮍 -N; 򔭜Σᡱ⒈.≮𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # σᡱ⒈.≮𑄳𐮍 -T; 򔭜σᡱ⒈.≮𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # σᡱ⒈.≮𑄳𐮍 -N; 򔭜σᡱ⒈.≮𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # σᡱ⒈.≮𑄳𐮍 -T; 򔭜σᡱ⒈.<\u0338𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # σᡱ⒈.≮𑄳𐮍 -N; 򔭜σᡱ⒈.<\u0338𑄳\u200D𐮍; [B1 P1 V6]; [B1 P1 V6] # σᡱ⒈.≮𑄳𐮍 -B; xn--4xa207hkzinr77u.xn--gdh5392g6sd; [B1 V6]; [B1 V6] -B; xn--4xa207hkzinr77u.xn--1ug85gn777ahze; [B1 V6]; [B1 V6] # σᡱ⒈.≮𑄳𐮍 -B; xn--3xa407hkzinr77u.xn--1ug85gn777ahze; [B1 V6]; [B1 V6] # ςᡱ⒈.≮𑄳𐮍 -B; \u3164\u094DႠ\u17D0.\u180B; [P1 V6]; [P1 V6] # ्Ⴀ័. -B; \u1160\u094DႠ\u17D0.\u180B; [P1 V6]; [P1 V6] # ्Ⴀ័. -B; \u1160\u094Dⴀ\u17D0.\u180B; [P1 V6]; [P1 V6] # ्ⴀ័. -B; xn--n3b742bkqf4ty.; [V6]; [V6] # ्ⴀ័. -B; xn--n3b468aoqa89r.; [V6]; [V6] # ्Ⴀ័. -B; \u3164\u094Dⴀ\u17D0.\u180B; [P1 V6]; [P1 V6] # ्ⴀ័. -B; xn--n3b445e53po6d.; [V6]; [V6] # ्ⴀ័. -B; xn--n3b468azngju2a.; [V6]; [V6] # ्Ⴀ័. -T; ❣\u200D.\u09CD𑰽\u0612\uA929; [C2 V5]; [V5] # ❣.্𑰽ؒꤩ -N; ❣\u200D.\u09CD𑰽\u0612\uA929; [C2 V5]; [C2 V5] # ❣.্𑰽ؒꤩ -T; ❣\u200D.\u09CD𑰽\u0612\uA929; [C2 V5]; [V5] # ❣.্𑰽ؒꤩ -N; ❣\u200D.\u09CD𑰽\u0612\uA929; [C2 V5]; [C2 V5] # ❣.্𑰽ؒꤩ -B; xn--pei.xn--0fb32q3w7q2g4d; [V5]; [V5] # ❣.্𑰽ؒꤩ -B; xn--1ugy10a.xn--0fb32q3w7q2g4d; [C2 V5]; [C2 V5] # ❣.্𑰽ؒꤩ -B; ≮𐳺𐹄.≯񪮸ꡅ; [B1 P1 V6]; [B1 P1 V6] -B; <\u0338𐳺𐹄.>\u0338񪮸ꡅ; [B1 P1 V6]; [B1 P1 V6] -B; xn--gdh7943gk2a.xn--hdh1383c5e36c; [B1 V6]; [B1 V6] -B; \u0CCC𐧅𐳏󠲺。\u0CCDᠦ; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ೌ𐧅𐳏.್ᠦ -B; \u0CCC𐧅𐳏󠲺。\u0CCDᠦ; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ೌ𐧅𐳏.್ᠦ -B; \u0CCC𐧅𐲏󠲺。\u0CCDᠦ; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ೌ𐧅𐳏.್ᠦ -B; xn--7tc6360ky5bn2732c.xn--8tc429c; [B1 V5 V6]; [B1 V5 V6] # ೌ𐧅𐳏.್ᠦ -B; \u0CCC𐧅𐲏󠲺。\u0CCDᠦ; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ೌ𐧅𐳏.್ᠦ -B; \u0349。𧡫; [V5]; [V5] # ͉.𧡫 -B; xn--nua.xn--bc6k; [V5]; [V5] # ͉.𧡫 -B; 𑰿󠅦.\u1160; [P1 V5 V6]; [P1 V5 V6] # 𑰿. -B; 𑰿󠅦.\u1160; [P1 V5 V6]; [P1 V5 V6] # 𑰿. -B; xn--ok3d.xn--psd; [V5 V6]; [V5 V6] # 𑰿. -T; -𞤆\u200D。󸼄𞳒; [B1 B5 B6 C2 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # -𞤨. -N; -𞤆\u200D。󸼄𞳒; [B1 B5 B6 C2 P1 V3 V6]; [B1 B5 B6 C2 P1 V3 V6] # -𞤨. -T; -𞤨\u200D。󸼄𞳒; [B1 B5 B6 C2 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # -𞤨. -N; -𞤨\u200D。󸼄𞳒; [B1 B5 B6 C2 P1 V3 V6]; [B1 B5 B6 C2 P1 V3 V6] # -𞤨. -B; xn----ni8r.xn--846h96596c; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] -B; xn----ugnx367r.xn--846h96596c; [B1 B5 B6 C2 V3 V6]; [B1 B5 B6 C2 V3 V6] # -𞤨. -B; ꡏ󠇶≯𳾽。\u1DFD⾇滸𐹰; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ꡏ≯.᷽舛滸𐹰 -B; ꡏ󠇶>\u0338𳾽。\u1DFD⾇滸𐹰; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ꡏ≯.᷽舛滸𐹰 -B; ꡏ󠇶≯𳾽。\u1DFD舛滸𐹰; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ꡏ≯.᷽舛滸𐹰 -B; ꡏ󠇶>\u0338𳾽。\u1DFD舛滸𐹰; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ꡏ≯.᷽舛滸𐹰 -B; xn--hdh7483cu6twwki8e.xn--yfg0765a58l0n6k; [B1 V5 V6]; [B1 V5 V6] # ꡏ≯.᷽舛滸𐹰 -B; 蔏。𑰺; [V5]; [V5] -B; 蔏。𑰺; [V5]; [V5] -B; xn--uy1a.xn--jk3d; [V5]; [V5] -B; 𝟿𐮋。󠄊; [B1]; [B1] -B; 9𐮋。󠄊; [B1]; [B1] -B; xn--9-rv5i.; [B1]; [B1] -B; 󟇇-䟖F。\u07CB⒈\u0662; [B4 P1 V6]; [B4 P1 V6] # -䟖f.ߋ⒈٢ -B; 󟇇-䟖F。\u07CB1.\u0662; [B1 P1 V6]; [B1 P1 V6] # -䟖f.ߋ1.٢ -B; 󟇇-䟖f。\u07CB1.\u0662; [B1 P1 V6]; [B1 P1 V6] # -䟖f.ߋ1.٢ -B; xn---f-mz8b08788k.xn--1-ybd.xn--bib; [B1 V6]; [B1 V6] # -䟖f.ߋ1.٢ -B; 󟇇-䟖f。\u07CB⒈\u0662; [B4 P1 V6]; [B4 P1 V6] # -䟖f.ߋ⒈٢ -B; xn---f-mz8b08788k.xn--bib53ev44d; [B4 V6]; [B4 V6] # -䟖f.ߋ⒈٢ -T; \u200C。𐹺; [B1 C1]; [B1 A4_2] # .𐹺 -N; \u200C。𐹺; [B1 C1]; [B1 C1] # .𐹺 -T; \u200C。𐹺; [B1 C1]; [B1 A4_2] # .𐹺 -N; \u200C。𐹺; [B1 C1]; [B1 C1] # .𐹺 -B; .xn--yo0d; [B1 A4_2]; [B1 A4_2] -B; xn--0ug.xn--yo0d; [B1 C1]; [B1 C1] # .𐹺 -T; 𐡆.≯\u200C-𞥀; [B1 C1 P1 V6]; [B1 P1 V6] # 𐡆.≯-𞥀 -N; 𐡆.≯\u200C-𞥀; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐡆.≯-𞥀 -T; 𐡆.>\u0338\u200C-𞥀; [B1 C1 P1 V6]; [B1 P1 V6] # 𐡆.≯-𞥀 -N; 𐡆.>\u0338\u200C-𞥀; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐡆.≯-𞥀 -T; 𐡆.>\u0338\u200C-𞤞; [B1 C1 P1 V6]; [B1 P1 V6] # 𐡆.≯-𞥀 -N; 𐡆.>\u0338\u200C-𞤞; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐡆.≯-𞥀 -T; 𐡆.≯\u200C-𞤞; [B1 C1 P1 V6]; [B1 P1 V6] # 𐡆.≯-𞥀 -N; 𐡆.≯\u200C-𞤞; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐡆.≯-𞥀 -B; xn--le9c.xn----ogo9956r; [B1 V6]; [B1 V6] -B; xn--le9c.xn----rgn40iy359e; [B1 C1 V6]; [B1 C1 V6] # 𐡆.≯-𞥀 -B; 󠁀-。≠\uFCD7; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.≠هج -B; 󠁀-。=\u0338\uFCD7; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.≠هج -B; 󠁀-。≠\u0647\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.≠هج -B; 󠁀-。=\u0338\u0647\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.≠هج -B; xn----f411m.xn--rgb7c611j; [B1 V3 V6]; [B1 V3 V6] # -.≠هج -T; 񻬹𑈵。\u200D𞨶; [B1 C2 P1 V6]; [P1 V6] # 𑈵. -N; 񻬹𑈵。\u200D𞨶; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𑈵. -B; xn--8g1d12120a.xn--5l6h; [V6]; [V6] -B; xn--8g1d12120a.xn--1ug6651p; [B1 C2 V6]; [B1 C2 V6] # 𑈵. -B; 𑋧\uA9C02。㧉򒖄; [P1 V5 V6]; [P1 V5 V6] # 𑋧꧀2.㧉 -B; 𑋧\uA9C02。㧉򒖄; [P1 V5 V6]; [P1 V5 V6] # 𑋧꧀2.㧉 -B; xn--2-5z4eu89y.xn--97l02706d; [V5 V6]; [V5 V6] # 𑋧꧀2.㧉 -T; \u200C𽬄𐹴𞩥。≯6; [B1 C1 P1 V6]; [B1 B5 B6 P1 V6] # 𐹴.≯6 -N; \u200C𽬄𐹴𞩥。≯6; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹴.≯6 -T; \u200C𽬄𐹴𞩥。>\u03386; [B1 C1 P1 V6]; [B1 B5 B6 P1 V6] # 𐹴.≯6 -N; \u200C𽬄𐹴𞩥。>\u03386; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹴.≯6 -B; xn--so0du768aim9m.xn--6-ogo; [B1 B5 B6 V6]; [B1 B5 B6 V6] -B; xn--0ug7105gf5wfxepq.xn--6-ogo; [B1 C1 V6]; [B1 C1 V6] # 𐹴.≯6 -T; 𑁿.𐹦𻞵-\u200D; [B1 B3 B6 C2 P1 V5 V6]; [B1 B3 B6 P1 V3 V5 V6] # 𑁿.𐹦- -N; 𑁿.𐹦𻞵-\u200D; [B1 B3 B6 C2 P1 V5 V6]; [B1 B3 B6 C2 P1 V5 V6] # 𑁿.𐹦- -T; 𑁿.𐹦𻞵-\u200D; [B1 B3 B6 C2 P1 V5 V6]; [B1 B3 B6 P1 V3 V5 V6] # 𑁿.𐹦- -N; 𑁿.𐹦𻞵-\u200D; [B1 B3 B6 C2 P1 V5 V6]; [B1 B3 B6 C2 P1 V5 V6] # 𑁿.𐹦- -B; xn--q30d.xn----i26i1299n; [B1 B3 B6 V3 V5 V6]; [B1 B3 B6 V3 V5 V6] -B; xn--q30d.xn----ugn1088hfsxv; [B1 B3 B6 C2 V5 V6]; [B1 B3 B6 C2 V5 V6] # 𑁿.𐹦- -T; ⤸ς𺱀。\uFFA0; [P1 V6]; [P1 V6] # ⤸ς. -N; ⤸ς𺱀。\uFFA0; [P1 V6]; [P1 V6] # ⤸ς. -T; ⤸ς𺱀。\u1160; [P1 V6]; [P1 V6] # ⤸ς. -N; ⤸ς𺱀。\u1160; [P1 V6]; [P1 V6] # ⤸ς. -B; ⤸Σ𺱀。\u1160; [P1 V6]; [P1 V6] # ⤸σ. -B; ⤸σ𺱀。\u1160; [P1 V6]; [P1 V6] # ⤸σ. -B; xn--4xa192qmp03d.xn--psd; [V6]; [V6] # ⤸σ. -B; xn--3xa392qmp03d.xn--psd; [V6]; [V6] # ⤸ς. -B; ⤸Σ𺱀。\uFFA0; [P1 V6]; [P1 V6] # ⤸σ. -B; ⤸σ𺱀。\uFFA0; [P1 V6]; [P1 V6] # ⤸σ. -B; xn--4xa192qmp03d.xn--cl7c; [V6]; [V6] # ⤸σ. -B; xn--3xa392qmp03d.xn--cl7c; [V6]; [V6] # ⤸ς. -B; \u0765\u1035𐫔\u06D5.𐦬𑋪Ⴃ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ݥဵ𐫔ە.𐦬𑋪Ⴃ -B; \u0765\u1035𐫔\u06D5.𐦬𑋪ⴃ; [B2 B3]; [B2 B3] # ݥဵ𐫔ە.𐦬𑋪ⴃ -B; xn--llb10as9tqp5y.xn--ukj7371e21f; [B2 B3]; [B2 B3] # ݥဵ𐫔ە.𐦬𑋪ⴃ -B; xn--llb10as9tqp5y.xn--bnd9168j21f; [B2 B3 V6]; [B2 B3 V6] # ݥဵ𐫔ە.𐦬𑋪Ⴃ -B; \u0661\u1B44-킼.\u1BAA\u0616\u066C≯; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ١᭄-킼.᮪ؖ٬≯ -B; \u0661\u1B44-킼.\u1BAA\u0616\u066C>\u0338; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ١᭄-킼.᮪ؖ٬≯ -B; xn----9pc551nk39n.xn--4fb6o571degg; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ١᭄-킼.᮪ؖ٬≯ -B; -。\u06C2\u0604򅖡𑓂; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -.ۂ𑓂 -B; -。\u06C1\u0654\u0604򅖡𑓂; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -.ۂ𑓂 -B; -.xn--mfb39a7208dzgs3d; [B1 B2 B3 V3 V6]; [B1 B2 B3 V3 V6] # -.ۂ𑓂 -T; \u200D󯑖󠁐.\u05BD𙮰ꡝ𐋡; [C2 P1 V5 V6]; [P1 V5 V6] # .ֽꡝ𐋡 -N; \u200D󯑖󠁐.\u05BD𙮰ꡝ𐋡; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .ֽꡝ𐋡 -T; \u200D󯑖󠁐.\u05BD𙮰ꡝ𐋡; [C2 P1 V5 V6]; [P1 V5 V6] # .ֽꡝ𐋡 -N; \u200D󯑖󠁐.\u05BD𙮰ꡝ𐋡; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .ֽꡝ𐋡 -B; xn--b726ey18m.xn--ldb8734fg0qcyzzg; [V5 V6]; [V5 V6] # .ֽꡝ𐋡 -B; xn--1ug66101lt8me.xn--ldb8734fg0qcyzzg; [C2 V5 V6]; [C2 V5 V6] # .ֽꡝ𐋡 -T; ︒􃈵ς񀠇。𐮈; [B1 P1 V6]; [B1 P1 V6] -N; ︒􃈵ς񀠇。𐮈; [B1 P1 V6]; [B1 P1 V6] -T; 。􃈵ς񀠇。𐮈; [P1 V6 A4_2]; [P1 V6 A4_2] -N; 。􃈵ς񀠇。𐮈; [P1 V6 A4_2]; [P1 V6 A4_2] -B; 。􃈵Σ񀠇。𐮈; [P1 V6 A4_2]; [P1 V6 A4_2] -B; 。􃈵σ񀠇。𐮈; [P1 V6 A4_2]; [P1 V6 A4_2] -B; .xn--4xa68573c7n64d.xn--f29c; [V6 A4_2]; [V6 A4_2] -B; .xn--3xa88573c7n64d.xn--f29c; [V6 A4_2]; [V6 A4_2] -B; ︒􃈵Σ񀠇。𐮈; [B1 P1 V6]; [B1 P1 V6] -B; ︒􃈵σ񀠇。𐮈; [B1 P1 V6]; [B1 P1 V6] -B; xn--4xa1729jwz5t7gl5f.xn--f29c; [B1 V6]; [B1 V6] -B; xn--3xa3729jwz5t7gl5f.xn--f29c; [B1 V6]; [B1 V6] -B; \u07D9.\u06EE󆾃≯󠅲; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ߙ.ۮ≯ -B; \u07D9.\u06EE󆾃>\u0338󠅲; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ߙ.ۮ≯ -B; \u07D9.\u06EE󆾃≯󠅲; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ߙ.ۮ≯ -B; \u07D9.\u06EE󆾃>\u0338󠅲; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ߙ.ۮ≯ -B; xn--0sb.xn--bmb691l0524t; [B2 B3 V6]; [B2 B3 V6] # ߙ.ۮ≯ -B; \u1A73󚙸.𐭍; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ᩳ.𐭍 -B; xn--2of22352n.xn--q09c; [B1 V5 V6]; [B1 V5 V6] # ᩳ.𐭍 -B; ⒉󠊓≠。Ⴟ⬣Ⴈ; [P1 V6]; [P1 V6] -B; ⒉󠊓=\u0338。Ⴟ⬣Ⴈ; [P1 V6]; [P1 V6] -B; 2.󠊓≠。Ⴟ⬣Ⴈ; [P1 V6]; [P1 V6] -B; 2.󠊓=\u0338。Ⴟ⬣Ⴈ; [P1 V6]; [P1 V6] -B; 2.󠊓=\u0338。ⴟ⬣ⴈ; [P1 V6]; [P1 V6] -B; 2.󠊓≠。ⴟ⬣ⴈ; [P1 V6]; [P1 V6] -B; 2.xn--1chz4101l.xn--45iz7d6b; [V6]; [V6] -B; 2.xn--1chz4101l.xn--gnd9b297j; [V6]; [V6] -B; ⒉󠊓=\u0338。ⴟ⬣ⴈ; [P1 V6]; [P1 V6] -B; ⒉󠊓≠。ⴟ⬣ⴈ; [P1 V6]; [P1 V6] -B; xn--1ch07f91401d.xn--45iz7d6b; [V6]; [V6] -B; xn--1ch07f91401d.xn--gnd9b297j; [V6]; [V6] -B; -󠉱\u0FB8Ⴥ。-𐹽\u0774𞣑; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ྸჅ.-𐹽ݴ𞣑 -B; -󠉱\u0FB8ⴥ。-𐹽\u0774𞣑; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ྸⴥ.-𐹽ݴ𞣑 -B; xn----xmg317tgv352a.xn----05c4213ryr0g; [B1 V3 V6]; [B1 V3 V6] # -ྸⴥ.-𐹽ݴ𞣑 -B; xn----xmg12fm2555h.xn----05c4213ryr0g; [B1 V3 V6]; [B1 V3 V6] # -ྸჅ.-𐹽ݴ𞣑 -B; \u0659。𑄴︒\u0627\u07DD; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ٙ.𑄴︒اߝ -B; \u0659。𑄴。\u0627\u07DD; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ٙ.𑄴.اߝ -B; xn--1hb.xn--w80d.xn--mgb09f; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ٙ.𑄴.اߝ -B; xn--1hb.xn--mgb09fp820c08pa; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # ٙ.𑄴︒اߝ -T; Ⴙ\u0638.󠆓\u200D; [B1 B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # Ⴙظ. -N; Ⴙ\u0638.󠆓\u200D; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 C2 P1 V6] # Ⴙظ. -T; ⴙ\u0638.󠆓\u200D; [B1 B5 B6 C2]; [B5 B6] # ⴙظ. -N; ⴙ\u0638.󠆓\u200D; [B1 B5 B6 C2]; [B1 B5 B6 C2] # ⴙظ. -B; xn--3gb910r.; [B5 B6]; [B5 B6] # ⴙظ. -B; xn--3gb910r.xn--1ug; [B1 B5 B6 C2]; [B1 B5 B6 C2] # ⴙظ. -B; xn--3gb194c.; [B5 B6 V6]; [B5 B6 V6] # Ⴙظ. -B; xn--3gb194c.xn--1ug; [B1 B5 B6 C2 V6]; [B1 B5 B6 C2 V6] # Ⴙظ. -B; 󠆸。₆0𐺧\u0756; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # .60ݖ -B; 󠆸。60𐺧\u0756; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # .60ݖ -B; .xn--60-cke9470y; [B1 V6 A4_2]; [B1 V6 A4_2] # .60ݖ -B; 6\u084F。-𑈴; [B1 V3]; [B1 V3] # 6ࡏ.-𑈴 -B; 6\u084F。-𑈴; [B1 V3]; [B1 V3] # 6ࡏ.-𑈴 -B; xn--6-jjd.xn----6n8i; [B1 V3]; [B1 V3] # 6ࡏ.-𑈴 -T; \u200D񋌿𐹰。\u0ACDς𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𐹰.્ςࣖ -N; \u200D񋌿𐹰。\u0ACDς𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹰.્ςࣖ -T; \u200D񋌿𐹰。\u0ACDς𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𐹰.્ςࣖ -N; \u200D񋌿𐹰。\u0ACDς𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹰.્ςࣖ -T; \u200D񋌿𐹰。\u0ACDΣ𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𐹰.્σࣖ -N; \u200D񋌿𐹰。\u0ACDΣ𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹰.્σࣖ -T; \u200D񋌿𐹰。\u0ACDσ𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𐹰.્σࣖ -N; \u200D񋌿𐹰。\u0ACDσ𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹰.્σࣖ -B; xn--oo0d1330n.xn--4xa21xcwbfz15g; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # 𐹰.્σࣖ -B; xn--1ugx105gq26y.xn--4xa21xcwbfz15g; [B1 C2 V5 V6]; [B1 C2 V5 V6] # 𐹰.્σࣖ -B; xn--1ugx105gq26y.xn--3xa41xcwbfz15g; [B1 C2 V5 V6]; [B1 C2 V5 V6] # 𐹰.્ςࣖ -T; \u200D񋌿𐹰。\u0ACDΣ𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𐹰.્σࣖ -N; \u200D񋌿𐹰。\u0ACDΣ𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹰.્σࣖ -T; \u200D񋌿𐹰。\u0ACDσ𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𐹰.્σࣖ -N; \u200D񋌿𐹰。\u0ACDσ𞰎\u08D6; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹰.્σࣖ -B; ⒈񟄜Ⴓ⒪.\u0DCA򘘶\u088B𐹢; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ⒈Ⴓ⒪.්𐹢 -B; 1.񟄜Ⴓ(o).\u0DCA򘘶\u088B𐹢; [B1 B6 P1 V5 V6]; [B1 B6 P1 V5 V6] # 1.Ⴓ(o).්𐹢 -B; 1.񟄜ⴓ(o).\u0DCA򘘶\u088B𐹢; [B1 B6 P1 V5 V6]; [B1 B6 P1 V5 V6] # 1.ⴓ(o).්𐹢 -B; 1.񟄜Ⴓ(O).\u0DCA򘘶\u088B𐹢; [B1 B6 P1 V5 V6]; [B1 B6 P1 V5 V6] # 1.Ⴓ(o).්𐹢 -B; 1.xn--(o)-7sn88849j.xn--3xb99xpx1yoes3e; [B1 B6 P1 V5 V6]; [B1 B6 P1 V5 V6] # 1.Ⴓ(o).්𐹢 -B; 1.xn--(o)-ej1bu5389e.xn--3xb99xpx1yoes3e; [B1 B6 P1 V5 V6]; [B1 B6 P1 V5 V6] # 1.ⴓ(o).්𐹢 -B; ⒈񟄜ⴓ⒪.\u0DCA򘘶\u088B𐹢; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ⒈ⴓ⒪.්𐹢 -B; xn--tsh0ds63atl31n.xn--3xb99xpx1yoes3e; [B1 V5 V6]; [B1 V5 V6] # ⒈ⴓ⒪.්𐹢 -B; xn--rnd762h7cx3027d.xn--3xb99xpx1yoes3e; [B1 V5 V6]; [B1 V5 V6] # ⒈Ⴓ⒪.්𐹢 -B; 𞤷.𐮐𞢁𐹠\u0624; ; xn--ve6h.xn--jgb1694kz0b2176a; NV8 # 𞤷.𐮐𞢁𐹠ؤ -B; 𞤷.𐮐𞢁𐹠\u0648\u0654; 𞤷.𐮐𞢁𐹠\u0624; xn--ve6h.xn--jgb1694kz0b2176a; NV8 # 𞤷.𐮐𞢁𐹠ؤ -B; 𞤕.𐮐𞢁𐹠\u0648\u0654; 𞤷.𐮐𞢁𐹠\u0624; xn--ve6h.xn--jgb1694kz0b2176a; NV8 # 𞤷.𐮐𞢁𐹠ؤ -B; 𞤕.𐮐𞢁𐹠\u0624; 𞤷.𐮐𞢁𐹠\u0624; xn--ve6h.xn--jgb1694kz0b2176a; NV8 # 𞤷.𐮐𞢁𐹠ؤ -B; xn--ve6h.xn--jgb1694kz0b2176a; 𞤷.𐮐𞢁𐹠\u0624; xn--ve6h.xn--jgb1694kz0b2176a; NV8 # 𞤷.𐮐𞢁𐹠ؤ -B; 𐲈-。𑄳񢌻; [B1 B3 P1 V3 V5 V6]; [B1 B3 P1 V3 V5 V6] -B; 𐲈-。𑄳񢌻; [B1 B3 P1 V3 V5 V6]; [B1 B3 P1 V3 V5 V6] -B; 𐳈-。𑄳񢌻; [B1 B3 P1 V3 V5 V6]; [B1 B3 P1 V3 V5 V6] -B; xn----ue6i.xn--v80d6662t; [B1 B3 V3 V5 V6]; [B1 B3 V3 V5 V6] -B; 𐳈-。𑄳񢌻; [B1 B3 P1 V3 V5 V6]; [B1 B3 P1 V3 V5 V6] -B; -󠉖ꡧ.󠊂񇆃🄉; [P1 V3 V6]; [P1 V3 V6] -B; -󠉖ꡧ.󠊂񇆃8,; [P1 V3 V6]; [P1 V3 V6] -B; xn----hg4ei0361g.xn--8,-k362evu488a; [P1 V3 V6]; [P1 V3 V6] -B; xn----hg4ei0361g.xn--207ht163h7m94c; [V3 V6]; [V3 V6] -B; 󠾛󠈴臯𧔤.\u0768𝟝; [B1 P1 V6]; [B1 P1 V6] # 臯𧔤.ݨ5 -B; 󠾛󠈴臯𧔤.\u07685; [B1 P1 V6]; [B1 P1 V6] # 臯𧔤.ݨ5 -B; xn--zb1at733hm579ddhla.xn--5-b5c; [B1 V6]; [B1 V6] # 臯𧔤.ݨ5 -B; ≮𐹣.𝨿; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] -B; <\u0338𐹣.𝨿; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] -B; ≮𐹣.𝨿; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] -B; <\u0338𐹣.𝨿; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] -B; xn--gdh1504g.xn--e92h; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] -B; 𐹯ᯛ\u0A4D。脥; [B1]; [B1] # 𐹯ᯛ੍.脥 -B; 𐹯ᯛ\u0A4D。脥; [B1]; [B1] # 𐹯ᯛ੍.脥 -B; xn--ybc101g3m1p.xn--740a; [B1]; [B1] # 𐹯ᯛ੍.脥 -B; \u1B44\u115F𞷿򃀍.-; [B1 B5 P1 V3 V5 V6]; [B1 B5 P1 V3 V5 V6] # ᭄.- -B; xn--osd971cpx70btgt8b.-; [B1 B5 V3 V5 V6]; [B1 B5 V3 V5 V6] # ᭄.- -T; \u200C。\u0354; [C1 V5]; [V5 A4_2] # .͔ -N; \u200C。\u0354; [C1 V5]; [C1 V5] # .͔ -T; \u200C。\u0354; [C1 V5]; [V5 A4_2] # .͔ -N; \u200C。\u0354; [C1 V5]; [C1 V5] # .͔ -B; .xn--yua; [V5 A4_2]; [V5 A4_2] # .͔ -B; xn--0ug.xn--yua; [C1 V5]; [C1 V5] # .͔ -B; 𞤥󠅮.ᡄႮ; [P1 V6]; [P1 V6] -B; 𞤥󠅮.ᡄႮ; [P1 V6]; [P1 V6] -B; 𞤥󠅮.ᡄⴎ; 𞤥.ᡄⴎ; xn--de6h.xn--37e857h -B; 𞤃󠅮.ᡄႮ; [P1 V6]; [P1 V6] -B; 𞤃󠅮.ᡄⴎ; 𞤥.ᡄⴎ; xn--de6h.xn--37e857h -B; xn--de6h.xn--37e857h; 𞤥.ᡄⴎ; xn--de6h.xn--37e857h -B; 𞤥.ᡄⴎ; ; xn--de6h.xn--37e857h -B; 𞤃.ᡄႮ; [P1 V6]; [P1 V6] -B; 𞤃.ᡄⴎ; 𞤥.ᡄⴎ; xn--de6h.xn--37e857h -B; xn--de6h.xn--mnd799a; [V6]; [V6] -B; 𞤥󠅮.ᡄⴎ; 𞤥.ᡄⴎ; xn--de6h.xn--37e857h -B; 𞤃󠅮.ᡄႮ; [P1 V6]; [P1 V6] -B; 𞤃󠅮.ᡄⴎ; 𞤥.ᡄⴎ; xn--de6h.xn--37e857h -B; 𞤥.ᡄႮ; [P1 V6]; [P1 V6] -B; 𞤧𝨨Ξ.𪺏㛨❸; [B2 B3 B6]; [B2 B3 B6] -B; 𞤧𝨨Ξ.𪺏㛨❸; [B2 B3 B6]; [B2 B3 B6] -B; 𞤧𝨨ξ.𪺏㛨❸; [B2 B3 B6]; [B2 B3 B6] -B; 𞤅𝨨Ξ.𪺏㛨❸; [B2 B3 B6]; [B2 B3 B6] -B; 𞤅𝨨ξ.𪺏㛨❸; [B2 B3 B6]; [B2 B3 B6] -B; xn--zxa5691vboja.xn--bfi293ci119b; [B2 B3 B6]; [B2 B3 B6] -B; 𞤧𝨨ξ.𪺏㛨❸; [B2 B3 B6]; [B2 B3 B6] -B; 𞤅𝨨Ξ.𪺏㛨❸; [B2 B3 B6]; [B2 B3 B6] -B; 𞤅𝨨ξ.𪺏㛨❸; [B2 B3 B6]; [B2 B3 B6] -T; ᠆몆\u200C-。Ⴛ𐦅︒; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # ᠆몆-.Ⴛ𐦅︒ -N; ᠆몆\u200C-。Ⴛ𐦅︒; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 C1 P1 V3 V6] # ᠆몆-.Ⴛ𐦅︒ -T; ᠆몆\u200C-。Ⴛ𐦅︒; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # ᠆몆-.Ⴛ𐦅︒ -N; ᠆몆\u200C-。Ⴛ𐦅︒; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 C1 P1 V3 V6] # ᠆몆-.Ⴛ𐦅︒ -T; ᠆몆\u200C-。Ⴛ𐦅。; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # ᠆몆-.Ⴛ𐦅. -N; ᠆몆\u200C-。Ⴛ𐦅。; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 C1 P1 V3 V6] # ᠆몆-.Ⴛ𐦅. -T; ᠆몆\u200C-。Ⴛ𐦅。; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # ᠆몆-.Ⴛ𐦅. -N; ᠆몆\u200C-。Ⴛ𐦅。; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 C1 P1 V3 V6] # ᠆몆-.Ⴛ𐦅. -T; ᠆몆\u200C-。ⴛ𐦅。; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # ᠆몆-.ⴛ𐦅. -N; ᠆몆\u200C-。ⴛ𐦅。; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 C1 P1 V3 V6] # ᠆몆-.ⴛ𐦅. -T; ᠆몆\u200C-。ⴛ𐦅。; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # ᠆몆-.ⴛ𐦅. -N; ᠆몆\u200C-。ⴛ𐦅。; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 C1 P1 V3 V6] # ᠆몆-.ⴛ𐦅. -B; xn----e3j6620g.xn--jlju661e.; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] -B; xn----e3j425bsk1o.xn--jlju661e.; [B1 B5 B6 C1 V3 V6]; [B1 B5 B6 C1 V3 V6] # ᠆몆-.ⴛ𐦅. -B; xn----e3j6620g.xn--znd4948j.; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] -B; xn----e3j425bsk1o.xn--znd4948j.; [B1 B5 B6 C1 V3 V6]; [B1 B5 B6 C1 V3 V6] # ᠆몆-.Ⴛ𐦅. -T; ᠆몆\u200C-。ⴛ𐦅︒; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # ᠆몆-.ⴛ𐦅︒ -N; ᠆몆\u200C-。ⴛ𐦅︒; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 C1 P1 V3 V6] # ᠆몆-.ⴛ𐦅︒ -T; ᠆몆\u200C-。ⴛ𐦅︒; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # ᠆몆-.ⴛ𐦅︒ -N; ᠆몆\u200C-。ⴛ𐦅︒; [B1 B5 B6 C1 P1 V3 V6]; [B1 B5 B6 C1 P1 V3 V6] # ᠆몆-.ⴛ𐦅︒ -B; xn----e3j6620g.xn--jlj4997dhgh; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] -B; xn----e3j425bsk1o.xn--jlj4997dhgh; [B1 B5 B6 C1 V3 V6]; [B1 B5 B6 C1 V3 V6] # ᠆몆-.ⴛ𐦅︒ -B; xn----e3j6620g.xn--znd2362jhgh; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] -B; xn----e3j425bsk1o.xn--znd2362jhgh; [B1 B5 B6 C1 V3 V6]; [B1 B5 B6 C1 V3 V6] # ᠆몆-.Ⴛ𐦅︒ -T; 󠾳.︒⥱\u200C𐹬; [B1 C1 P1 V6]; [B1 P1 V6] # .︒⥱𐹬 -N; 󠾳.︒⥱\u200C𐹬; [B1 C1 P1 V6]; [B1 C1 P1 V6] # .︒⥱𐹬 -T; 󠾳.。⥱\u200C𐹬; [B1 C1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ..⥱𐹬 -N; 󠾳.。⥱\u200C𐹬; [B1 C1 P1 V6 A4_2]; [B1 C1 P1 V6 A4_2] # ..⥱𐹬 -B; xn--uf66e..xn--qti2829e; [B1 V6 A4_2]; [B1 V6 A4_2] -B; xn--uf66e..xn--0ugz28as66q; [B1 C1 V6 A4_2]; [B1 C1 V6 A4_2] # ..⥱𐹬 -B; xn--uf66e.xn--qtiz073e3ik; [B1 V6]; [B1 V6] -B; xn--uf66e.xn--0ugz28axl3pqxna; [B1 C1 V6]; [B1 C1 V6] # .︒⥱𐹬 -B; 𐯖.𐹠Ⴑ񚇜𐫊; [B1 P1 V6]; [B1 P1 V6] -B; 𐯖.𐹠ⴑ񚇜𐫊; [B1 P1 V6]; [B1 P1 V6] -B; xn--n49c.xn--8kj8702ewicl862o; [B1 V6]; [B1 V6] -B; xn--n49c.xn--pnd4619jwicl862o; [B1 V6]; [B1 V6] -B; \u0FA4񱤯.𝟭Ⴛ; [P1 V5 V6]; [P1 V5 V6] # ྤ.1Ⴛ -B; \u0FA4񱤯.1Ⴛ; [P1 V5 V6]; [P1 V5 V6] # ྤ.1Ⴛ -B; \u0FA4񱤯.1ⴛ; [P1 V5 V6]; [P1 V5 V6] # ྤ.1ⴛ -B; xn--0fd40533g.xn--1-tws; [V5 V6]; [V5 V6] # ྤ.1ⴛ -B; xn--0fd40533g.xn--1-q1g; [V5 V6]; [V5 V6] # ྤ.1Ⴛ -B; \u0FA4񱤯.𝟭ⴛ; [P1 V5 V6]; [P1 V5 V6] # ྤ.1ⴛ -B; -\u0826齀。릿𐸋; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # -ࠦ齀.릿 -B; -\u0826齀。릿𐸋; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # -ࠦ齀.릿 -B; xn----6gd0617i.xn--7y2bm55m; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] # -ࠦ齀.릿 -T; 󠔊\u071C鹝꾗。񾵐\u200D\u200D⏃; [B1 B6 C2 P1 V6]; [B1 B6 P1 V6] # ܜ鹝꾗.⏃ -N; 󠔊\u071C鹝꾗。񾵐\u200D\u200D⏃; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ܜ鹝꾗.⏃ -T; 󠔊\u071C鹝꾗。񾵐\u200D\u200D⏃; [B1 B6 C2 P1 V6]; [B1 B6 P1 V6] # ܜ鹝꾗.⏃ -N; 󠔊\u071C鹝꾗。񾵐\u200D\u200D⏃; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ܜ鹝꾗.⏃ -B; xn--mnb6558e91kyq533a.xn--6mh27269e; [B1 B6 V6]; [B1 B6 V6] # ܜ鹝꾗.⏃ -B; xn--mnb6558e91kyq533a.xn--1uga46zs309y; [B1 B6 C2 V6]; [B1 B6 C2 V6] # ܜ鹝꾗.⏃ -B; ≮.-\u0708--; [B1 P1 V2 V3 V6]; [B1 P1 V2 V3 V6] # ≮.-܈-- -B; <\u0338.-\u0708--; [B1 P1 V2 V3 V6]; [B1 P1 V2 V3 V6] # ≮.-܈-- -B; ≮.-\u0708--; [B1 P1 V2 V3 V6]; [B1 P1 V2 V3 V6] # ≮.-܈-- -B; <\u0338.-\u0708--; [B1 P1 V2 V3 V6]; [B1 P1 V2 V3 V6] # ≮.-܈-- -B; xn--gdh.xn------eqf; [B1 V2 V3 V6]; [B1 V2 V3 V6] # ≮.-܈-- -T; 𐹸󠋳。\u200Dς𝟩; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹸.ς7 -N; 𐹸󠋳。\u200Dς𝟩; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹸.ς7 -T; 𐹸󠋳。\u200Dς7; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹸.ς7 -N; 𐹸󠋳。\u200Dς7; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹸.ς7 -T; 𐹸󠋳。\u200DΣ7; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹸.σ7 -N; 𐹸󠋳。\u200DΣ7; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹸.σ7 -T; 𐹸󠋳。\u200Dσ7; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹸.σ7 -N; 𐹸󠋳。\u200Dσ7; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹸.σ7 -B; xn--wo0di5177c.xn--7-zmb; [B1 V6]; [B1 V6] -B; xn--wo0di5177c.xn--7-zmb938s; [B1 C2 V6]; [B1 C2 V6] # 𐹸.σ7 -B; xn--wo0di5177c.xn--7-xmb248s; [B1 C2 V6]; [B1 C2 V6] # 𐹸.ς7 -T; 𐹸󠋳。\u200DΣ𝟩; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹸.σ7 -N; 𐹸󠋳。\u200DΣ𝟩; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹸.σ7 -T; 𐹸󠋳。\u200Dσ𝟩; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹸.σ7 -N; 𐹸󠋳。\u200Dσ𝟩; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹸.σ7 -T; ς򅜌8.𞭤; [P1 V6]; [P1 V6] -N; ς򅜌8.𞭤; [P1 V6]; [P1 V6] -T; ς򅜌8.𞭤; [P1 V6]; [P1 V6] -N; ς򅜌8.𞭤; [P1 V6]; [P1 V6] -B; Σ򅜌8.𞭤; [P1 V6]; [P1 V6] -B; σ򅜌8.𞭤; [P1 V6]; [P1 V6] -B; xn--8-zmb14974n.xn--su6h; [V6]; [V6] -B; xn--8-xmb44974n.xn--su6h; [V6]; [V6] -B; Σ򅜌8.𞭤; [P1 V6]; [P1 V6] -B; σ򅜌8.𞭤; [P1 V6]; [P1 V6] -T; \u200Cᡑ🄀\u0684.-𐫄𑲤; [B1 C1 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # ᡑ🄀ڄ.-𐫄𑲤 -N; \u200Cᡑ🄀\u0684.-𐫄𑲤; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # ᡑ🄀ڄ.-𐫄𑲤 -T; \u200Cᡑ0.\u0684.-𐫄𑲤; [B1 C1 V3]; [B1 V3] # ᡑ0.ڄ.-𐫄𑲤 -N; \u200Cᡑ0.\u0684.-𐫄𑲤; [B1 C1 V3]; [B1 C1 V3] # ᡑ0.ڄ.-𐫄𑲤 -B; xn--0-o7j.xn--9ib.xn----ek5i065b; [B1 V3]; [B1 V3] # ᡑ0.ڄ.-𐫄𑲤 -B; xn--0-o7j263b.xn--9ib.xn----ek5i065b; [B1 C1 V3]; [B1 C1 V3] # ᡑ0.ڄ.-𐫄𑲤 -B; xn--9ib722gbw95a.xn----ek5i065b; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] # ᡑ🄀ڄ.-𐫄𑲤 -B; xn--9ib722gvtfi563c.xn----ek5i065b; [B1 C1 V3 V6]; [B1 C1 V3 V6] # ᡑ🄀ڄ.-𐫄𑲤 -B; 𖠍。𐪿넯򞵲; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 𖠍。𐪿넯򞵲; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; xn--4e9e.xn--l60bj21opd57g; [B2 B3 V6]; [B2 B3 V6] -B; ᠇Ⴘ。\u0603Ⴈ𝆊; [B1 P1 V6]; [B1 P1 V6] # ᠇Ⴘ.Ⴈ𝆊 -B; ᠇ⴘ。\u0603ⴈ𝆊; [B1 P1 V6]; [B1 P1 V6] # ᠇ⴘ.ⴈ𝆊 -B; xn--d6e009h.xn--lfb290rfu3z; [B1 V6]; [B1 V6] # ᠇ⴘ.ⴈ𝆊 -B; xn--wnd558a.xn--lfb465c1v87a; [B1 V6]; [B1 V6] # ᠇Ⴘ.Ⴈ𝆊 -B; ⒚󠋑𞤰。牣\u0667Ⴜᣥ; [B1 B5 P1 V6]; [B1 B5 P1 V6] # ⒚𞤰.牣٧Ⴜᣥ -B; 19.󠋑𞤰。牣\u0667Ⴜᣥ; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 19.𞤰.牣٧Ⴜᣥ -B; 19.󠋑𞤰。牣\u0667ⴜᣥ; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 19.𞤰.牣٧ⴜᣥ -B; 19.󠋑𞤎。牣\u0667Ⴜᣥ; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 19.𞤰.牣٧Ⴜᣥ -B; 19.xn--oe6h75760c.xn--gib404ccxgh00h; [B1 B5 V6]; [B1 B5 V6] # 19.𞤰.牣٧Ⴜᣥ -B; 19.xn--oe6h75760c.xn--gib285gtxo2l9d; [B1 B5 V6]; [B1 B5 V6] # 19.𞤰.牣٧ⴜᣥ -B; ⒚󠋑𞤰。牣\u0667ⴜᣥ; [B1 B5 P1 V6]; [B1 B5 P1 V6] # ⒚𞤰.牣٧ⴜᣥ -B; ⒚󠋑𞤎。牣\u0667Ⴜᣥ; [B1 B5 P1 V6]; [B1 B5 P1 V6] # ⒚𞤰.牣٧Ⴜᣥ -B; xn--cthy466n29j3e.xn--gib404ccxgh00h; [B1 B5 V6]; [B1 B5 V6] # ⒚𞤰.牣٧Ⴜᣥ -B; xn--cthy466n29j3e.xn--gib285gtxo2l9d; [B1 B5 V6]; [B1 B5 V6] # ⒚𞤰.牣٧ⴜᣥ -B; -𐋱𐰽⒈.Ⴓ; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; -𐋱𐰽1..Ⴓ; [B1 P1 V3 V6 A4_2]; [B1 P1 V3 V6 A4_2] -B; -𐋱𐰽1..ⴓ; [B1 V3 A4_2]; [B1 V3 A4_2] -B; xn---1-895nq11a..xn--blj; [B1 V3 A4_2]; [B1 V3 A4_2] -B; xn---1-895nq11a..xn--rnd; [B1 V3 V6 A4_2]; [B1 V3 V6 A4_2] -B; -𐋱𐰽⒈.ⴓ; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; xn----ecp0206g90h.xn--blj; [B1 V3 V6]; [B1 V3 V6] -B; xn----ecp0206g90h.xn--rnd; [B1 V3 V6]; [B1 V3 V6] -T; \u200C긃.榶-; [C1 V3]; [V3] # 긃.榶- -N; \u200C긃.榶-; [C1 V3]; [C1 V3] # 긃.榶- -T; \u200C긃.榶-; [C1 V3]; [V3] # 긃.榶- -N; \u200C긃.榶-; [C1 V3]; [C1 V3] # 긃.榶- -B; xn--ej0b.xn----d87b; [V3]; [V3] -B; xn--0ug3307c.xn----d87b; [C1 V3]; [C1 V3] # 긃.榶- -T; 뉓泓𜵽.\u09CD\u200D; [P1 V5 V6]; [P1 V5 V6] # 뉓泓.্ -N; 뉓泓𜵽.\u09CD\u200D; [P1 V5 V6]; [P1 V5 V6] # 뉓泓.্ -T; 뉓泓𜵽.\u09CD\u200D; [P1 V5 V6]; [P1 V5 V6] # 뉓泓.্ -N; 뉓泓𜵽.\u09CD\u200D; [P1 V5 V6]; [P1 V5 V6] # 뉓泓.্ -B; xn--lwwp69lqs7m.xn--b7b; [V5 V6]; [V5 V6] # 뉓泓.্ -B; xn--lwwp69lqs7m.xn--b7b605i; [V5 V6]; [V5 V6] # 뉓泓.্ -T; \u200D𐹴ß。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # 𐹴ß.ິ -N; \u200D𐹴ß。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹴ß.ິ -T; \u200D𐹴ß。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # 𐹴ß.ິ -N; \u200D𐹴ß。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹴ß.ິ -T; \u200D𐹴SS。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # 𐹴ss.ິ -N; \u200D𐹴SS。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹴ss.ິ -T; \u200D𐹴ss。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # 𐹴ss.ິ -N; \u200D𐹴ss。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹴ss.ິ -T; \u200D𐹴Ss。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # 𐹴ss.ິ -N; \u200D𐹴Ss。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹴ss.ິ -B; xn--ss-ti3o.xn--57c638l8774i; [B1 V5 V6]; [B1 V5 V6] # 𐹴ss.ິ -B; xn--ss-l1t5169j.xn--57c638l8774i; [B1 C2 V5 V6]; [B1 C2 V5 V6] # 𐹴ss.ິ -B; xn--zca770nip7n.xn--57c638l8774i; [B1 C2 V5 V6]; [B1 C2 V5 V6] # 𐹴ß.ິ -T; \u200D𐹴SS。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # 𐹴ss.ິ -N; \u200D𐹴SS。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹴ss.ິ -T; \u200D𐹴ss。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # 𐹴ss.ິ -N; \u200D𐹴ss。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹴ss.ິ -T; \u200D𐹴Ss。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # 𐹴ss.ິ -N; \u200D𐹴Ss。\u0EB4\u2B75񪅌; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𐹴ss.ິ -B; \u1B44.\u1BAA-≮≠; [P1 V5 V6]; [P1 V5 V6] # ᭄.᮪-≮≠ -B; \u1B44.\u1BAA-<\u0338=\u0338; [P1 V5 V6]; [P1 V5 V6] # ᭄.᮪-≮≠ -B; \u1B44.\u1BAA-≮≠; [P1 V5 V6]; [P1 V5 V6] # ᭄.᮪-≮≠ -B; \u1B44.\u1BAA-<\u0338=\u0338; [P1 V5 V6]; [P1 V5 V6] # ᭄.᮪-≮≠ -B; xn--1uf.xn----nmlz65aub; [V5 V6]; [V5 V6] # ᭄.᮪-≮≠ -B; \u1BF3Ⴑ\u115F.𑄴Ⅎ; [P1 V5 V6]; [P1 V5 V6] # ᯳Ⴑ.𑄴Ⅎ -B; \u1BF3Ⴑ\u115F.𑄴Ⅎ; [P1 V5 V6]; [P1 V5 V6] # ᯳Ⴑ.𑄴Ⅎ -B; \u1BF3ⴑ\u115F.𑄴ⅎ; [P1 V5 V6]; [P1 V5 V6] # ᯳ⴑ.𑄴ⅎ -B; \u1BF3Ⴑ\u115F.𑄴ⅎ; [P1 V5 V6]; [P1 V5 V6] # ᯳Ⴑ.𑄴ⅎ -B; xn--pnd26a55x.xn--73g3065g; [V5 V6]; [V5 V6] # ᯳Ⴑ.𑄴ⅎ -B; xn--osd925cvyn.xn--73g3065g; [V5 V6]; [V5 V6] # ᯳ⴑ.𑄴ⅎ -B; xn--pnd26a55x.xn--f3g7465g; [V5 V6]; [V5 V6] # ᯳Ⴑ.𑄴Ⅎ -B; \u1BF3ⴑ\u115F.𑄴ⅎ; [P1 V5 V6]; [P1 V5 V6] # ᯳ⴑ.𑄴ⅎ -B; \u1BF3Ⴑ\u115F.𑄴ⅎ; [P1 V5 V6]; [P1 V5 V6] # ᯳Ⴑ.𑄴ⅎ -B; 𜉆。Ⴃ𐴣𐹹똯; [B5 P1 V6]; [B5 P1 V6] -B; 𜉆。Ⴃ𐴣𐹹똯; [B5 P1 V6]; [B5 P1 V6] -B; 𜉆。ⴃ𐴣𐹹똯; [B5 P1 V6]; [B5 P1 V6] -B; 𜉆。ⴃ𐴣𐹹똯; [B5 P1 V6]; [B5 P1 V6] -B; xn--187g.xn--ukjy205b8rscdeb; [B5 V6]; [B5 V6] -B; xn--187g.xn--bnd4785f8r8bdeb; [B5 V6]; [B5 V6] -B; 𐫀。⳻󠙾󠄷\u3164; [B1 P1 V6]; [B1 P1 V6] # 𐫀.⳻ -B; 𐫀。⳻󠙾󠄷\u1160; [B1 P1 V6]; [B1 P1 V6] # 𐫀.⳻ -B; xn--pw9c.xn--psd742lxt32w; [B1 V6]; [B1 V6] # 𐫀.⳻ -B; xn--pw9c.xn--mkj83l4v899a; [B1 V6]; [B1 V6] # 𐫀.⳻ -B; \u079A⾇.\u071E-𐋰; [B2 B3]; [B2 B3] # ޚ舛.ܞ-𐋰 -B; \u079A舛.\u071E-𐋰; [B2 B3]; [B2 B3] # ޚ舛.ܞ-𐋰 -B; xn--7qb6383d.xn----20c3154q; [B2 B3]; [B2 B3] # ޚ舛.ܞ-𐋰 -B; Ⴉ猕󹛫≮.︒; [P1 V6]; [P1 V6] -B; Ⴉ猕󹛫<\u0338.︒; [P1 V6]; [P1 V6] -B; Ⴉ猕󹛫≮.。; [P1 V6 A4_2]; [P1 V6 A4_2] -B; Ⴉ猕󹛫<\u0338.。; [P1 V6 A4_2]; [P1 V6 A4_2] -B; ⴉ猕󹛫<\u0338.。; [P1 V6 A4_2]; [P1 V6 A4_2] -B; ⴉ猕󹛫≮.。; [P1 V6 A4_2]; [P1 V6 A4_2] -B; xn--gdh892bbz0d5438s..; [V6 A4_2]; [V6 A4_2] -B; xn--hnd212gz32d54x5r..; [V6 A4_2]; [V6 A4_2] -B; ⴉ猕󹛫<\u0338.︒; [P1 V6]; [P1 V6] -B; ⴉ猕󹛫≮.︒; [P1 V6]; [P1 V6] -B; xn--gdh892bbz0d5438s.xn--y86c; [V6]; [V6] -B; xn--hnd212gz32d54x5r.xn--y86c; [V6]; [V6] -B; 🏮。\u062B鳳\u07E2󠅉; [B1 B2]; [B1 B2] # 🏮.ث鳳ߢ -B; 🏮。\u062B鳳\u07E2󠅉; [B1 B2]; [B1 B2] # 🏮.ث鳳ߢ -B; xn--8m8h.xn--qgb29f6z90a; [B1 B2]; [B1 B2] # 🏮.ث鳳ߢ -T; \u200D𐹶。ß; [B1 C2]; [B1] # 𐹶.ß -N; \u200D𐹶。ß; [B1 C2]; [B1 C2] # 𐹶.ß -T; \u200D𐹶。SS; [B1 C2]; [B1] # 𐹶.ss -N; \u200D𐹶。SS; [B1 C2]; [B1 C2] # 𐹶.ss -T; \u200D𐹶。ss; [B1 C2]; [B1] # 𐹶.ss -N; \u200D𐹶。ss; [B1 C2]; [B1 C2] # 𐹶.ss -T; \u200D𐹶。Ss; [B1 C2]; [B1] # 𐹶.ss -N; \u200D𐹶。Ss; [B1 C2]; [B1 C2] # 𐹶.ss -B; xn--uo0d.ss; [B1]; [B1] -B; xn--1ug9105g.ss; [B1 C2]; [B1 C2] # 𐹶.ss -B; xn--1ug9105g.xn--zca; [B1 C2]; [B1 C2] # 𐹶.ß -T; Å둄-.\u200C; [C1 V3]; [V3] # å둄-. -N; Å둄-.\u200C; [C1 V3]; [C1 V3] # å둄-. -T; A\u030A둄-.\u200C; [C1 V3]; [V3] # å둄-. -N; A\u030A둄-.\u200C; [C1 V3]; [C1 V3] # å둄-. -T; Å둄-.\u200C; [C1 V3]; [V3] # å둄-. -N; Å둄-.\u200C; [C1 V3]; [C1 V3] # å둄-. -T; A\u030A둄-.\u200C; [C1 V3]; [V3] # å둄-. -N; A\u030A둄-.\u200C; [C1 V3]; [C1 V3] # å둄-. -T; a\u030A둄-.\u200C; [C1 V3]; [V3] # å둄-. -N; a\u030A둄-.\u200C; [C1 V3]; [C1 V3] # å둄-. -T; å둄-.\u200C; [C1 V3]; [V3] # å둄-. -N; å둄-.\u200C; [C1 V3]; [C1 V3] # å둄-. -B; xn----1fa1788k.; [V3]; [V3] -B; xn----1fa1788k.xn--0ug; [C1 V3]; [C1 V3] # å둄-. -T; a\u030A둄-.\u200C; [C1 V3]; [V3] # å둄-. -N; a\u030A둄-.\u200C; [C1 V3]; [C1 V3] # å둄-. -T; å둄-.\u200C; [C1 V3]; [V3] # å둄-. -N; å둄-.\u200C; [C1 V3]; [C1 V3] # å둄-. -B; \u3099򬎑\u1DD7𞤀.򱲢-\u0953; [B1 B6 P1 V5 V6]; [B1 B6 P1 V5 V6] # ゙ᷗ𞤢.-॓ -B; \u3099򬎑\u1DD7𞤢.򱲢-\u0953; [B1 B6 P1 V5 V6]; [B1 B6 P1 V5 V6] # ゙ᷗ𞤢.-॓ -B; xn--veg121fwg63altj9d.xn----eyd92688s; [B1 B6 V5 V6]; [B1 B6 V5 V6] # ゙ᷗ𞤢.-॓ -T; ς.ß񴱄\u06DD\u2D7F; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ς.ß⵿ -N; ς.ß񴱄\u06DD\u2D7F; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ς.ß⵿ -B; Σ.SS񴱄\u06DD\u2D7F; [B5 B6 P1 V6]; [B5 B6 P1 V6] # σ.ss⵿ -B; σ.ss񴱄\u06DD\u2D7F; [B5 B6 P1 V6]; [B5 B6 P1 V6] # σ.ss⵿ -B; Σ.ss񴱄\u06DD\u2D7F; [B5 B6 P1 V6]; [B5 B6 P1 V6] # σ.ss⵿ -B; xn--4xa.xn--ss-y8d4760biv60n; [B5 B6 V6]; [B5 B6 V6] # σ.ss⵿ -T; Σ.ß񴱄\u06DD\u2D7F; [B5 B6 P1 V6]; [B5 B6 P1 V6] # σ.ß⵿ -N; Σ.ß񴱄\u06DD\u2D7F; [B5 B6 P1 V6]; [B5 B6 P1 V6] # σ.ß⵿ -T; σ.ß񴱄\u06DD\u2D7F; [B5 B6 P1 V6]; [B5 B6 P1 V6] # σ.ß⵿ -N; σ.ß񴱄\u06DD\u2D7F; [B5 B6 P1 V6]; [B5 B6 P1 V6] # σ.ß⵿ -B; xn--4xa.xn--zca281az71b8x73m; [B5 B6 V6]; [B5 B6 V6] # σ.ß⵿ -B; xn--3xa.xn--zca281az71b8x73m; [B5 B6 V6]; [B5 B6 V6] # ς.ß⵿ -B; ꡀ𞀟。\u066B\u0599; [B1]; [B1] # ꡀ𞀟.٫֙ -B; ꡀ𞀟。\u066B\u0599; [B1]; [B1] # ꡀ𞀟.٫֙ -B; xn--8b9a1720d.xn--kcb33b; [B1]; [B1] # ꡀ𞀟.٫֙ -T; 򈛉\u200C\u08A9。⧅񘘡-𐭡; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # ࢩ.⧅-𐭡 -N; 򈛉\u200C\u08A9。⧅񘘡-𐭡; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # ࢩ.⧅-𐭡 -T; 򈛉\u200C\u08A9。⧅񘘡-𐭡; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # ࢩ.⧅-𐭡 -N; 򈛉\u200C\u08A9。⧅񘘡-𐭡; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # ࢩ.⧅-𐭡 -B; xn--yyb56242i.xn----zir1232guu71b; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ࢩ.⧅-𐭡 -B; xn--yyb780jll63m.xn----zir1232guu71b; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # ࢩ.⧅-𐭡 -T; 룱\u200D𰍨\u200C。𝨖︒; [C1 C2 P1 V5 V6]; [P1 V5 V6] # 룱.𝨖︒ -N; 룱\u200D𰍨\u200C。𝨖︒; [C1 C2 P1 V5 V6]; [C1 C2 P1 V5 V6] # 룱.𝨖︒ -T; 룱\u200D𰍨\u200C。𝨖︒; [C1 C2 P1 V5 V6]; [P1 V5 V6] # 룱.𝨖︒ -N; 룱\u200D𰍨\u200C。𝨖︒; [C1 C2 P1 V5 V6]; [C1 C2 P1 V5 V6] # 룱.𝨖︒ -T; 룱\u200D𰍨\u200C。𝨖。; [C1 C2 P1 V5 V6]; [P1 V5 V6] # 룱.𝨖. -N; 룱\u200D𰍨\u200C。𝨖。; [C1 C2 P1 V5 V6]; [C1 C2 P1 V5 V6] # 룱.𝨖. -T; 룱\u200D𰍨\u200C。𝨖。; [C1 C2 P1 V5 V6]; [P1 V5 V6] # 룱.𝨖. -N; 룱\u200D𰍨\u200C。𝨖。; [C1 C2 P1 V5 V6]; [C1 C2 P1 V5 V6] # 룱.𝨖. -B; xn--ct2b0738h.xn--772h.; [V5 V6]; [V5 V6] -B; xn--0ugb3358ili2v.xn--772h.; [C1 C2 V5 V6]; [C1 C2 V5 V6] # 룱.𝨖. -B; xn--ct2b0738h.xn--y86cl899a; [V5 V6]; [V5 V6] -B; xn--0ugb3358ili2v.xn--y86cl899a; [C1 C2 V5 V6]; [C1 C2 V5 V6] # 룱.𝨖︒ -T; 🄄.\u1CDC⒈ß; [P1 V5 V6]; [P1 V5 V6] # 🄄.᳜⒈ß -N; 🄄.\u1CDC⒈ß; [P1 V5 V6]; [P1 V5 V6] # 🄄.᳜⒈ß -T; 3,.\u1CDC1.ß; [P1 V5 V6]; [P1 V5 V6] # 3,.᳜1.ß -N; 3,.\u1CDC1.ß; [P1 V5 V6]; [P1 V5 V6] # 3,.᳜1.ß -B; 3,.\u1CDC1.SS; [P1 V5 V6]; [P1 V5 V6] # 3,.᳜1.ss -B; 3,.\u1CDC1.ss; [P1 V5 V6]; [P1 V5 V6] # 3,.᳜1.ss -B; 3,.\u1CDC1.Ss; [P1 V5 V6]; [P1 V5 V6] # 3,.᳜1.ss -B; 3,.xn--1-43l.ss; [P1 V5 V6]; [P1 V5 V6] # 3,.᳜1.ss -B; 3,.xn--1-43l.xn--zca; [P1 V5 V6]; [P1 V5 V6] # 3,.᳜1.ß -B; 🄄.\u1CDC⒈SS; [P1 V5 V6]; [P1 V5 V6] # 🄄.᳜⒈ss -B; 🄄.\u1CDC⒈ss; [P1 V5 V6]; [P1 V5 V6] # 🄄.᳜⒈ss -B; 🄄.\u1CDC⒈Ss; [P1 V5 V6]; [P1 V5 V6] # 🄄.᳜⒈ss -B; xn--x07h.xn--ss-k1r094b; [V5 V6]; [V5 V6] # 🄄.᳜⒈ss -B; xn--x07h.xn--zca344lmif; [V5 V6]; [V5 V6] # 🄄.᳜⒈ß -B; 񇌍\u2D7F。𞼓򡄨𑐺; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ⵿.𑐺 -B; 񇌍\u2D7F。𞼓򡄨𑐺; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ⵿.𑐺 -B; xn--eoj16016a.xn--0v1d3848a3lr0d; [B2 B3 V6]; [B2 B3 V6] # ⵿.𑐺 -T; \u1DFD\u103A\u094D.≠\u200D㇛; [C2 P1 V5 V6]; [P1 V5 V6] # ်्᷽.≠㇛ -N; \u1DFD\u103A\u094D.≠\u200D㇛; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ်्᷽.≠㇛ -T; \u103A\u094D\u1DFD.≠\u200D㇛; [C2 P1 V5 V6]; [P1 V5 V6] # ်्᷽.≠㇛ -N; \u103A\u094D\u1DFD.≠\u200D㇛; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ်्᷽.≠㇛ -T; \u103A\u094D\u1DFD.=\u0338\u200D㇛; [C2 P1 V5 V6]; [P1 V5 V6] # ်्᷽.≠㇛ -N; \u103A\u094D\u1DFD.=\u0338\u200D㇛; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ်्᷽.≠㇛ -T; \u103A\u094D\u1DFD.≠\u200D㇛; [C2 P1 V5 V6]; [P1 V5 V6] # ်्᷽.≠㇛ -N; \u103A\u094D\u1DFD.≠\u200D㇛; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ်्᷽.≠㇛ -T; \u103A\u094D\u1DFD.=\u0338\u200D㇛; [C2 P1 V5 V6]; [P1 V5 V6] # ်्᷽.≠㇛ -N; \u103A\u094D\u1DFD.=\u0338\u200D㇛; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ်्᷽.≠㇛ -B; xn--n3b956a9zm.xn--1ch912d; [V5 V6]; [V5 V6] # ်्᷽.≠㇛ -B; xn--n3b956a9zm.xn--1ug63gz5w; [C2 V5 V6]; [C2 V5 V6] # ်्᷽.≠㇛ -T; Ⴁ𐋨娤.\u200D\u033C\u0662𑖿; [B1 C2 P1 V6]; [B1 P1 V5 V6] # Ⴁ𐋨娤.̼٢𑖿 -N; Ⴁ𐋨娤.\u200D\u033C\u0662𑖿; [B1 C2 P1 V6]; [B1 C2 P1 V6] # Ⴁ𐋨娤.̼٢𑖿 -T; ⴁ𐋨娤.\u200D\u033C\u0662𑖿; [B1 C2]; [B1 V5] # ⴁ𐋨娤.̼٢𑖿 -N; ⴁ𐋨娤.\u200D\u033C\u0662𑖿; [B1 C2]; [B1 C2] # ⴁ𐋨娤.̼٢𑖿 -B; xn--skjw75lg29h.xn--9ta62nrv36a; [B1 V5]; [B1 V5] # ⴁ𐋨娤.̼٢𑖿 -B; xn--skjw75lg29h.xn--9ta62ngt6aou8t; [B1 C2]; [B1 C2] # ⴁ𐋨娤.̼٢𑖿 -B; xn--8md2578ag21g.xn--9ta62nrv36a; [B1 V5 V6]; [B1 V5 V6] # Ⴁ𐋨娤.̼٢𑖿 -B; xn--8md2578ag21g.xn--9ta62ngt6aou8t; [B1 C2 V6]; [B1 C2 V6] # Ⴁ𐋨娤.̼٢𑖿 -T; 🄀Ⴄ\u0669\u0820。⒈\u0FB6ß; [B1 P1 V6]; [B1 P1 V6] # 🄀Ⴄ٩ࠠ.⒈ྶß -N; 🄀Ⴄ\u0669\u0820。⒈\u0FB6ß; [B1 P1 V6]; [B1 P1 V6] # 🄀Ⴄ٩ࠠ.⒈ྶß -T; 0.Ⴄ\u0669\u0820。1.\u0FB6ß; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 0.Ⴄ٩ࠠ.1.ྶß -N; 0.Ⴄ\u0669\u0820。1.\u0FB6ß; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 0.Ⴄ٩ࠠ.1.ྶß -T; 0.ⴄ\u0669\u0820。1.\u0FB6ß; [B1 B5 B6 V5]; [B1 B5 B6 V5] # 0.ⴄ٩ࠠ.1.ྶß -N; 0.ⴄ\u0669\u0820。1.\u0FB6ß; [B1 B5 B6 V5]; [B1 B5 B6 V5] # 0.ⴄ٩ࠠ.1.ྶß -B; 0.Ⴄ\u0669\u0820。1.\u0FB6SS; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 0.Ⴄ٩ࠠ.1.ྶss -B; 0.ⴄ\u0669\u0820。1.\u0FB6ss; [B1 B5 B6 V5]; [B1 B5 B6 V5] # 0.ⴄ٩ࠠ.1.ྶss -B; 0.Ⴄ\u0669\u0820。1.\u0FB6Ss; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 0.Ⴄ٩ࠠ.1.ྶss -B; 0.xn--iib29f26o.1.xn--ss-1sj; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # 0.Ⴄ٩ࠠ.1.ྶss -B; 0.xn--iib29fp25e.1.xn--ss-1sj; [B1 B5 B6 V5]; [B1 B5 B6 V5] # 0.ⴄ٩ࠠ.1.ྶss -B; 0.xn--iib29fp25e.1.xn--zca117e; [B1 B5 B6 V5]; [B1 B5 B6 V5] # 0.ⴄ٩ࠠ.1.ྶß -B; 0.xn--iib29f26o.1.xn--zca117e; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # 0.Ⴄ٩ࠠ.1.ྶß -T; 🄀ⴄ\u0669\u0820。⒈\u0FB6ß; [B1 P1 V6]; [B1 P1 V6] # 🄀ⴄ٩ࠠ.⒈ྶß -N; 🄀ⴄ\u0669\u0820。⒈\u0FB6ß; [B1 P1 V6]; [B1 P1 V6] # 🄀ⴄ٩ࠠ.⒈ྶß -B; 🄀Ⴄ\u0669\u0820。⒈\u0FB6SS; [B1 P1 V6]; [B1 P1 V6] # 🄀Ⴄ٩ࠠ.⒈ྶss -B; 🄀ⴄ\u0669\u0820。⒈\u0FB6ss; [B1 P1 V6]; [B1 P1 V6] # 🄀ⴄ٩ࠠ.⒈ྶss -B; 🄀Ⴄ\u0669\u0820。⒈\u0FB6Ss; [B1 P1 V6]; [B1 P1 V6] # 🄀Ⴄ٩ࠠ.⒈ྶss -B; xn--iib29f26o6n43c.xn--ss-1sj588o; [B1 V6]; [B1 V6] # 🄀Ⴄ٩ࠠ.⒈ྶss -B; xn--iib29fp25e0219a.xn--ss-1sj588o; [B1 V6]; [B1 V6] # 🄀ⴄ٩ࠠ.⒈ྶss -B; xn--iib29fp25e0219a.xn--zca117e3vp; [B1 V6]; [B1 V6] # 🄀ⴄ٩ࠠ.⒈ྶß -B; xn--iib29f26o6n43c.xn--zca117e3vp; [B1 V6]; [B1 V6] # 🄀Ⴄ٩ࠠ.⒈ྶß -T; ≠.\u200C-\u066B; [B1 C1 P1 V6]; [B1 P1 V3 V6] # ≠.-٫ -N; ≠.\u200C-\u066B; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ≠.-٫ -T; =\u0338.\u200C-\u066B; [B1 C1 P1 V6]; [B1 P1 V3 V6] # ≠.-٫ -N; =\u0338.\u200C-\u066B; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ≠.-٫ -B; xn--1ch.xn----vqc; [B1 V3 V6]; [B1 V3 V6] # ≠.-٫ -B; xn--1ch.xn----vqc597q; [B1 C1 V6]; [B1 C1 V6] # ≠.-٫ -B; \u0660۱。󠳶𞠁\u0665; [B1 P1 V6]; [B1 P1 V6] # ٠۱.𞠁٥ -B; \u0660۱。󠳶𞠁\u0665; [B1 P1 V6]; [B1 P1 V6] # ٠۱.𞠁٥ -B; xn--8hb40a.xn--eib7967vner3e; [B1 V6]; [B1 V6] # ٠۱.𞠁٥ -T; \u200C\u0663⒖。󱅉𽷛\u1BF3; [B1 C1 P1 V6]; [B1 P1 V6] # ٣⒖.᯳ -N; \u200C\u0663⒖。󱅉𽷛\u1BF3; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ٣⒖.᯳ -T; \u200C\u066315.。󱅉𽷛\u1BF3; [B1 C1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ٣15..᯳ -N; \u200C\u066315.。󱅉𽷛\u1BF3; [B1 C1 P1 V6 A4_2]; [B1 C1 P1 V6 A4_2] # ٣15..᯳ -B; xn--15-gyd..xn--1zf13512buy41d; [B1 V6 A4_2]; [B1 V6 A4_2] # ٣15..᯳ -B; xn--15-gyd983x..xn--1zf13512buy41d; [B1 C1 V6 A4_2]; [B1 C1 V6 A4_2] # ٣15..᯳ -B; xn--cib675m.xn--1zf13512buy41d; [B1 V6]; [B1 V6] # ٣⒖.᯳ -B; xn--cib152kwgd.xn--1zf13512buy41d; [B1 C1 V6]; [B1 C1 V6] # ٣⒖.᯳ -B; \u1BF3.-逋񳦭󙙮; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ᯳.-逋 -B; xn--1zf.xn----483d46987byr50b; [V3 V5 V6]; [V3 V5 V6] # ᯳.-逋 -T; \u0756。\u3164\u200Dς; [C2 P1 V6]; [P1 V6] # ݖ.ς -N; \u0756。\u3164\u200Dς; [C2 P1 V6]; [C2 P1 V6] # ݖ.ς -T; \u0756。\u1160\u200Dς; [C2 P1 V6]; [P1 V6] # ݖ.ς -N; \u0756。\u1160\u200Dς; [C2 P1 V6]; [C2 P1 V6] # ݖ.ς -T; \u0756。\u1160\u200DΣ; [C2 P1 V6]; [P1 V6] # ݖ.σ -N; \u0756。\u1160\u200DΣ; [C2 P1 V6]; [C2 P1 V6] # ݖ.σ -T; \u0756。\u1160\u200Dσ; [C2 P1 V6]; [P1 V6] # ݖ.σ -N; \u0756。\u1160\u200Dσ; [C2 P1 V6]; [C2 P1 V6] # ݖ.σ -B; xn--9ob.xn--4xa380e; [V6]; [V6] # ݖ.σ -B; xn--9ob.xn--4xa380ebol; [C2 V6]; [C2 V6] # ݖ.σ -B; xn--9ob.xn--3xa580ebol; [C2 V6]; [C2 V6] # ݖ.ς -T; \u0756。\u3164\u200DΣ; [C2 P1 V6]; [P1 V6] # ݖ.σ -N; \u0756。\u3164\u200DΣ; [C2 P1 V6]; [C2 P1 V6] # ݖ.σ -T; \u0756。\u3164\u200Dσ; [C2 P1 V6]; [P1 V6] # ݖ.σ -N; \u0756。\u3164\u200Dσ; [C2 P1 V6]; [C2 P1 V6] # ݖ.σ -B; xn--9ob.xn--4xa574u; [V6]; [V6] # ݖ.σ -B; xn--9ob.xn--4xa795lq2l; [C2 V6]; [C2 V6] # ݖ.σ -B; xn--9ob.xn--3xa995lq2l; [C2 V6]; [C2 V6] # ݖ.ς -T; ᡆႣ。󞢧\u0315\u200D\u200D; [C2 P1 V6]; [P1 V6] # ᡆႣ.̕ -N; ᡆႣ。󞢧\u0315\u200D\u200D; [C2 P1 V6]; [C2 P1 V6] # ᡆႣ.̕ -T; ᡆႣ。󞢧\u0315\u200D\u200D; [C2 P1 V6]; [P1 V6] # ᡆႣ.̕ -N; ᡆႣ。󞢧\u0315\u200D\u200D; [C2 P1 V6]; [C2 P1 V6] # ᡆႣ.̕ -T; ᡆⴃ。󞢧\u0315\u200D\u200D; [C2 P1 V6]; [P1 V6] # ᡆⴃ.̕ -N; ᡆⴃ。󞢧\u0315\u200D\u200D; [C2 P1 V6]; [C2 P1 V6] # ᡆⴃ.̕ -B; xn--57e237h.xn--5sa98523p; [V6]; [V6] # ᡆⴃ.̕ -B; xn--57e237h.xn--5sa649la993427a; [C2 V6]; [C2 V6] # ᡆⴃ.̕ -B; xn--bnd320b.xn--5sa98523p; [V6]; [V6] # ᡆႣ.̕ -B; xn--bnd320b.xn--5sa649la993427a; [C2 V6]; [C2 V6] # ᡆႣ.̕ -T; ᡆⴃ。󞢧\u0315\u200D\u200D; [C2 P1 V6]; [P1 V6] # ᡆⴃ.̕ -N; ᡆⴃ。󞢧\u0315\u200D\u200D; [C2 P1 V6]; [C2 P1 V6] # ᡆⴃ.̕ -T; 㭄\u200D\u084F𑚵.ς𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6] # 㭄ࡏ𑚵.ς𐮮 -N; 㭄\u200D\u084F𑚵.ς𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6 C1 C2] # 㭄ࡏ𑚵.ς𐮮 -T; 㭄\u200D\u084F𑚵.ς𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6] # 㭄ࡏ𑚵.ς𐮮 -N; 㭄\u200D\u084F𑚵.ς𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6 C1 C2] # 㭄ࡏ𑚵.ς𐮮 -T; 㭄\u200D\u084F𑚵.Σ𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6] # 㭄ࡏ𑚵.σ𐮮 -N; 㭄\u200D\u084F𑚵.Σ𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6 C1 C2] # 㭄ࡏ𑚵.σ𐮮 -T; 㭄\u200D\u084F𑚵.σ𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6] # 㭄ࡏ𑚵.σ𐮮 -N; 㭄\u200D\u084F𑚵.σ𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6 C1 C2] # 㭄ࡏ𑚵.σ𐮮 -B; xn--ewb302xhu1l.xn--4xa0426k; [B5 B6]; [B5 B6] # 㭄ࡏ𑚵.σ𐮮 -B; xn--ewb962jfitku4r.xn--4xa695lda6932v; [B5 B6 C1 C2]; [B5 B6 C1 C2] # 㭄ࡏ𑚵.σ𐮮 -B; xn--ewb962jfitku4r.xn--3xa895lda6932v; [B5 B6 C1 C2]; [B5 B6 C1 C2] # 㭄ࡏ𑚵.ς𐮮 -T; 㭄\u200D\u084F𑚵.Σ𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6] # 㭄ࡏ𑚵.σ𐮮 -N; 㭄\u200D\u084F𑚵.Σ𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6 C1 C2] # 㭄ࡏ𑚵.σ𐮮 -T; 㭄\u200D\u084F𑚵.σ𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6] # 㭄ࡏ𑚵.σ𐮮 -N; 㭄\u200D\u084F𑚵.σ𐮮\u200C\u200D; [B5 B6 C1 C2]; [B5 B6 C1 C2] # 㭄ࡏ𑚵.σ𐮮 -B; \u17B5。𞯸ꡀ🄋; [B1 B2 B3 B6 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # .ꡀ🄋 -B; xn--03e.xn--8b9ar252dngd; [B1 B2 B3 B6 V5 V6]; [B1 B2 B3 B6 V5 V6] # .ꡀ🄋 -B; 󐪺暑.⾑\u0668; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 暑.襾٨ -B; 󐪺暑.襾\u0668; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 暑.襾٨ -B; xn--tlvq3513e.xn--hib9228d; [B5 B6 V6]; [B5 B6 V6] # 暑.襾٨ -B; 󠄚≯ꡢ。\u0891\u1DFF; [B1 P1 V6]; [B1 P1 V6] # ≯ꡢ.᷿ -B; 󠄚>\u0338ꡢ。\u0891\u1DFF; [B1 P1 V6]; [B1 P1 V6] # ≯ꡢ.᷿ -B; xn--hdh7783c.xn--9xb680i; [B1 V6]; [B1 V6] # ≯ꡢ.᷿ -B; \uFDC3𮁱\u0B4D𐨿.󐧤Ⴗ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # كمم𮁱୍𐨿.Ⴗ -B; \u0643\u0645\u0645𮁱\u0B4D𐨿.󐧤Ⴗ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # كمم𮁱୍𐨿.Ⴗ -B; \u0643\u0645\u0645𮁱\u0B4D𐨿.󐧤ⴗ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # كمم𮁱୍𐨿.ⴗ -B; xn--fhbea662czx68a2tju.xn--fljz2846h; [B2 B3 V6]; [B2 B3 V6] # كمم𮁱୍𐨿.ⴗ -B; xn--fhbea662czx68a2tju.xn--vnd55511o; [B2 B3 V6]; [B2 B3 V6] # كمم𮁱୍𐨿.Ⴗ -B; \uFDC3𮁱\u0B4D𐨿.󐧤ⴗ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # كمم𮁱୍𐨿.ⴗ -B; 𞀨。\u1B44򡛨𞎇; [P1 V5 V6]; [P1 V5 V6] # 𞀨.᭄ -B; 𞀨。\u1B44򡛨𞎇; [P1 V5 V6]; [P1 V5 V6] # 𞀨.᭄ -B; xn--mi4h.xn--1uf6843smg20c; [V5 V6]; [V5 V6] # 𞀨.᭄ -T; 󠣼\u200C.𐺰\u200Cᡟ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # .ᡟ -N; 󠣼\u200C.𐺰\u200Cᡟ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .ᡟ -T; 󠣼\u200C.𐺰\u200Cᡟ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # .ᡟ -N; 󠣼\u200C.𐺰\u200Cᡟ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .ᡟ -B; xn--q046e.xn--v8e7227j; [B1 B2 B3 V6]; [B1 B2 B3 V6] -B; xn--0ug18531l.xn--v8e340bp21t; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # .ᡟ -T; ᢛ󨅟ß.ጧ; [P1 V6]; [P1 V6] -N; ᢛ󨅟ß.ጧ; [P1 V6]; [P1 V6] -B; ᢛ󨅟SS.ጧ; [P1 V6]; [P1 V6] -B; ᢛ󨅟ss.ጧ; [P1 V6]; [P1 V6] -B; ᢛ󨅟Ss.ጧ; [P1 V6]; [P1 V6] -B; xn--ss-7dp66033t.xn--p5d; [V6]; [V6] -B; xn--zca562jc642x.xn--p5d; [V6]; [V6] -T; ⮒\u200C.񒚗\u200C; [C1 P1 V6]; [P1 V6] # ⮒. -N; ⮒\u200C.񒚗\u200C; [C1 P1 V6]; [C1 P1 V6] # ⮒. -B; xn--b9i.xn--5p9y; [V6]; [V6] -B; xn--0ugx66b.xn--0ugz2871c; [C1 V6]; [C1 V6] # ⮒. -B; 𞤂񹞁𐹯。Ⴜ; [B2 P1 V6]; [B2 P1 V6] -B; 𞤤񹞁𐹯。ⴜ; [B2 P1 V6]; [B2 P1 V6] -B; xn--no0dr648a51o3b.xn--klj; [B2 V6]; [B2 V6] -B; xn--no0dr648a51o3b.xn--0nd; [B2 V6]; [B2 V6] -B; 𞤂񹞁𐹯。ⴜ; [B2 P1 V6]; [B2 P1 V6] -T; 𐹵⮣\u200C𑄰。񷴿\uFCB7; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # 𐹵⮣𑄰.ضم -N; 𐹵⮣\u200C𑄰。񷴿\uFCB7; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # 𐹵⮣𑄰.ضم -T; 𐹵⮣\u200C𑄰。񷴿\u0636\u0645; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # 𐹵⮣𑄰.ضم -N; 𐹵⮣\u200C𑄰。񷴿\u0636\u0645; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # 𐹵⮣𑄰.ضم -B; xn--s9i5458e7yb.xn--1gb4a66004i; [B1 B5 B6 V6]; [B1 B5 B6 V6] # 𐹵⮣𑄰.ضم -B; xn--0ug586bcj8p7jc.xn--1gb4a66004i; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # 𐹵⮣𑄰.ضم -T; Ⴒ。デß𞤵\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デß𞤵్ -N; Ⴒ。デß𞤵\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デß𞤵్ -T; Ⴒ。テ\u3099ß𞤵\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デß𞤵్ -N; Ⴒ。テ\u3099ß𞤵\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デß𞤵్ -T; ⴒ。テ\u3099ß𞤵\u0C4D; [B5 B6]; [B5 B6] # ⴒ.デß𞤵్ -N; ⴒ。テ\u3099ß𞤵\u0C4D; [B5 B6]; [B5 B6] # ⴒ.デß𞤵్ -T; ⴒ。デß𞤵\u0C4D; [B5 B6]; [B5 B6] # ⴒ.デß𞤵్ -N; ⴒ。デß𞤵\u0C4D; [B5 B6]; [B5 B6] # ⴒ.デß𞤵్ -B; Ⴒ。デSS𞤓\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デss𞤵్ -B; Ⴒ。テ\u3099SS𞤓\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デss𞤵్ -B; ⴒ。テ\u3099ss𞤵\u0C4D; [B5 B6]; [B5 B6] # ⴒ.デss𞤵్ -B; ⴒ。デss𞤵\u0C4D; [B5 B6]; [B5 B6] # ⴒ.デss𞤵్ -B; Ⴒ。デSs𞤵\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デss𞤵్ -B; Ⴒ。テ\u3099Ss𞤵\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デss𞤵్ -B; xn--qnd.xn--ss-9nh3648ahh20b; [B5 B6 V6]; [B5 B6 V6] # Ⴒ.デss𞤵్ -B; xn--9kj.xn--ss-9nh3648ahh20b; [B5 B6]; [B5 B6] # ⴒ.デss𞤵్ -B; xn--9kj.xn--zca669cmr3a0f28a; [B5 B6]; [B5 B6] # ⴒ.デß𞤵్ -B; xn--qnd.xn--zca669cmr3a0f28a; [B5 B6 V6]; [B5 B6 V6] # Ⴒ.デß𞤵్ -B; Ⴒ。デSS𞤵\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デss𞤵్ -B; Ⴒ。テ\u3099SS𞤵\u0C4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴒ.デss𞤵్ -B; 𑁿\u0D4D.7-\u07D2; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𑁿്.7-ߒ -B; 𑁿\u0D4D.7-\u07D2; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𑁿്.7-ߒ -B; xn--wxc1283k.xn--7--yue; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𑁿്.7-ߒ -B; ≯𑜫󠭇.\u1734񒞤𑍬ᢧ; [P1 V5 V6]; [P1 V5 V6] # ≯𑜫.᜴𑍬ᢧ -B; >\u0338𑜫󠭇.\u1734񒞤𑍬ᢧ; [P1 V5 V6]; [P1 V5 V6] # ≯𑜫.᜴𑍬ᢧ -B; xn--hdhx157g68o0g.xn--c0e65eu616c34o7a; [V5 V6]; [V5 V6] # ≯𑜫.᜴𑍬ᢧ -B; \u1DDB򎐙Ⴗ쏔。\u0781; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ᷛႷ쏔.ށ -B; \u1DDB򎐙Ⴗ쏔。\u0781; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ᷛႷ쏔.ށ -B; \u1DDB򎐙ⴗ쏔。\u0781; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ᷛⴗ쏔.ށ -B; \u1DDB򎐙ⴗ쏔。\u0781; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ᷛⴗ쏔.ށ -B; xn--zegy26dw47iy6w2f.xn--iqb; [B1 V5 V6]; [B1 V5 V6] # ᷛⴗ쏔.ށ -B; xn--vnd148d733ky6n9e.xn--iqb; [B1 V5 V6]; [B1 V5 V6] # ᷛႷ쏔.ށ -T; ß。𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ß.𐋳Ⴌྸ -N; ß。𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ß.𐋳Ⴌྸ -T; ß。𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ß.𐋳Ⴌྸ -N; ß。𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ß.𐋳Ⴌྸ -T; ß。𐋳ⴌ\u0FB8; ß.𐋳ⴌ\u0FB8; ss.xn--lgd921mvv0m; NV8 # ß.𐋳ⴌྸ -N; ß。𐋳ⴌ\u0FB8; ß.𐋳ⴌ\u0FB8; xn--zca.xn--lgd921mvv0m; NV8 # ß.𐋳ⴌྸ -B; SS。𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ss.𐋳Ⴌྸ -B; ss。𐋳ⴌ\u0FB8; ss.𐋳ⴌ\u0FB8; ss.xn--lgd921mvv0m; NV8 # ss.𐋳ⴌྸ -B; Ss。𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ss.𐋳Ⴌྸ -B; ss.xn--lgd10cu829c; [V6]; [V6] # ss.𐋳Ⴌྸ -B; ss.xn--lgd921mvv0m; ss.𐋳ⴌ\u0FB8; ss.xn--lgd921mvv0m; NV8 # ss.𐋳ⴌྸ -B; ss.𐋳ⴌ\u0FB8; ; ss.xn--lgd921mvv0m; NV8 # ss.𐋳ⴌྸ -B; SS.𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ss.𐋳Ⴌྸ -B; Ss.𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ss.𐋳Ⴌྸ -B; xn--zca.xn--lgd921mvv0m; ß.𐋳ⴌ\u0FB8; xn--zca.xn--lgd921mvv0m; NV8 # ß.𐋳ⴌྸ -T; ß.𐋳ⴌ\u0FB8; ; ss.xn--lgd921mvv0m; NV8 # ß.𐋳ⴌྸ -N; ß.𐋳ⴌ\u0FB8; ; xn--zca.xn--lgd921mvv0m; NV8 # ß.𐋳ⴌྸ -B; xn--zca.xn--lgd10cu829c; [V6]; [V6] # ß.𐋳Ⴌྸ -T; ß。𐋳ⴌ\u0FB8; ß.𐋳ⴌ\u0FB8; ss.xn--lgd921mvv0m; NV8 # ß.𐋳ⴌྸ -N; ß。𐋳ⴌ\u0FB8; ß.𐋳ⴌ\u0FB8; xn--zca.xn--lgd921mvv0m; NV8 # ß.𐋳ⴌྸ -B; SS。𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ss.𐋳Ⴌྸ -B; ss。𐋳ⴌ\u0FB8; ss.𐋳ⴌ\u0FB8; ss.xn--lgd921mvv0m; NV8 # ss.𐋳ⴌྸ -B; Ss。𐋳Ⴌ\u0FB8; [P1 V6]; [P1 V6] # ss.𐋳Ⴌྸ -T; -\u069E𐶡.\u200C⾝\u09CD; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # -ڞ.身্ -N; -\u069E𐶡.\u200C⾝\u09CD; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # -ڞ.身্ -T; -\u069E𐶡.\u200C身\u09CD; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # -ڞ.身্ -N; -\u069E𐶡.\u200C身\u09CD; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # -ڞ.身্ -B; xn----stc7013r.xn--b7b1419d; [B1 V3 V6]; [B1 V3 V6] # -ڞ.身্ -B; xn----stc7013r.xn--b7b305imj2f; [B1 C1 V3 V6]; [B1 C1 V3 V6] # -ڞ.身্ -T; 😮\u0764𑈵𞀖.💅\u200D; [B1 C2]; [B1] # 😮ݤ𑈵𞀖.💅 -N; 😮\u0764𑈵𞀖.💅\u200D; [B1 C2]; [B1 C2] # 😮ݤ𑈵𞀖.💅 -T; 😮\u0764𑈵𞀖.💅\u200D; [B1 C2]; [B1] # 😮ݤ𑈵𞀖.💅 -N; 😮\u0764𑈵𞀖.💅\u200D; [B1 C2]; [B1 C2] # 😮ݤ𑈵𞀖.💅 -B; xn--opb4277kuc7elqsa.xn--kr8h; [B1]; [B1] # 😮ݤ𑈵𞀖.💅 -B; xn--opb4277kuc7elqsa.xn--1ug5265p; [B1 C2]; [B1 C2] # 😮ݤ𑈵𞀖.💅 -T; \u08F2\u200D꙳\u0712.ᢏ\u200C󠍄; [B1 B6 C1 C2 P1 V5 V6]; [B1 B6 P1 V5 V6] # ࣲ꙳ܒ.ᢏ -N; \u08F2\u200D꙳\u0712.ᢏ\u200C󠍄; [B1 B6 C1 C2 P1 V5 V6]; [B1 B6 C1 C2 P1 V5 V6] # ࣲ꙳ܒ.ᢏ -B; xn--cnb37gdy00a.xn--89e02253p; [B1 B6 V5 V6]; [B1 B6 V5 V6] # ࣲ꙳ܒ.ᢏ -B; xn--cnb37g904be26j.xn--89e849ax9363a; [B1 B6 C1 C2 V5 V6]; [B1 B6 C1 C2 V5 V6] # ࣲ꙳ܒ.ᢏ -B; Ⴑ.\u06BF𞯓ᠲ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # Ⴑ.ڿᠲ -B; Ⴑ.\u06BF𞯓ᠲ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # Ⴑ.ڿᠲ -B; ⴑ.\u06BF𞯓ᠲ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ⴑ.ڿᠲ -B; xn--8kj.xn--ykb840gd555a; [B2 B3 V6]; [B2 B3 V6] # ⴑ.ڿᠲ -B; xn--pnd.xn--ykb840gd555a; [B2 B3 V6]; [B2 B3 V6] # Ⴑ.ڿᠲ -B; ⴑ.\u06BF𞯓ᠲ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ⴑ.ڿᠲ -B; \u1A5A𛦝\u0C4D。𚝬𝟵; [P1 V5 V6]; [P1 V5 V6] # ᩚ్.9 -B; \u1A5A𛦝\u0C4D。𚝬9; [P1 V5 V6]; [P1 V5 V6] # ᩚ్.9 -B; xn--lqc703ebm93a.xn--9-000p; [V5 V6]; [V5 V6] # ᩚ్.9 -T; \u200C\u06A0𿺆𝟗。Ⴣ꒘\uFCD0񐘖; [B1 B5 C1 P1 V6]; [B2 B5 P1 V6] # ڠ9.Ⴣ꒘مخ -N; \u200C\u06A0𿺆𝟗。Ⴣ꒘\uFCD0񐘖; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # ڠ9.Ⴣ꒘مخ -T; \u200C\u06A0𿺆9。Ⴣ꒘\u0645\u062E񐘖; [B1 B5 C1 P1 V6]; [B2 B5 P1 V6] # ڠ9.Ⴣ꒘مخ -N; \u200C\u06A0𿺆9。Ⴣ꒘\u0645\u062E񐘖; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # ڠ9.Ⴣ꒘مخ -T; \u200C\u06A0𿺆9。ⴣ꒘\u0645\u062E񐘖; [B1 B5 C1 P1 V6]; [B2 B5 P1 V6] # ڠ9.ⴣ꒘مخ -N; \u200C\u06A0𿺆9。ⴣ꒘\u0645\u062E񐘖; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # ڠ9.ⴣ꒘مخ -B; xn--9-vtc42319e.xn--tgb9bz87p833hw316c; [B2 B5 V6]; [B2 B5 V6] # ڠ9.ⴣ꒘مخ -B; xn--9-vtc736qts91g.xn--tgb9bz87p833hw316c; [B1 B5 C1 V6]; [B1 B5 C1 V6] # ڠ9.ⴣ꒘مخ -B; xn--9-vtc42319e.xn--tgb9bz61cfn8mw3t2c; [B2 B5 V6]; [B2 B5 V6] # ڠ9.Ⴣ꒘مخ -B; xn--9-vtc736qts91g.xn--tgb9bz61cfn8mw3t2c; [B1 B5 C1 V6]; [B1 B5 C1 V6] # ڠ9.Ⴣ꒘مخ -T; \u200C\u06A0𿺆𝟗。ⴣ꒘\uFCD0񐘖; [B1 B5 C1 P1 V6]; [B2 B5 P1 V6] # ڠ9.ⴣ꒘مخ -N; \u200C\u06A0𿺆𝟗。ⴣ꒘\uFCD0񐘖; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # ڠ9.ⴣ꒘مخ -B; ᡖ。\u031F񗛨\u0B82-; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ᡖ.̟ஂ- -B; ᡖ。\u031F񗛨\u0B82-; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ᡖ.̟ஂ- -B; xn--m8e.xn----mdb555dkk71m; [V3 V5 V6]; [V3 V5 V6] # ᡖ.̟ஂ- -B; 𞠠浘。絧𞀀; [B2 B3]; [B2 B3] -B; xn--e0wp491f.xn--ud0a3573e; [B2 B3]; [B2 B3] -B; \u0596Ⴋ.𝟳≯︒\uFE0A; [P1 V5 V6]; [P1 V5 V6] # ֖Ⴋ.7≯︒ -B; \u0596Ⴋ.𝟳>\u0338︒\uFE0A; [P1 V5 V6]; [P1 V5 V6] # ֖Ⴋ.7≯︒ -B; \u0596Ⴋ.7≯。\uFE0A; [P1 V5 V6]; [P1 V5 V6] # ֖Ⴋ.7≯. -B; \u0596Ⴋ.7>\u0338。\uFE0A; [P1 V5 V6]; [P1 V5 V6] # ֖Ⴋ.7≯. -B; \u0596ⴋ.7>\u0338。\uFE0A; [P1 V5 V6]; [P1 V5 V6] # ֖ⴋ.7≯. -B; \u0596ⴋ.7≯。\uFE0A; [P1 V5 V6]; [P1 V5 V6] # ֖ⴋ.7≯. -B; xn--hcb613r.xn--7-pgo.; [V5 V6]; [V5 V6] # ֖ⴋ.7≯. -B; xn--hcb887c.xn--7-pgo.; [V5 V6]; [V5 V6] # ֖Ⴋ.7≯. -B; \u0596ⴋ.𝟳>\u0338︒\uFE0A; [P1 V5 V6]; [P1 V5 V6] # ֖ⴋ.7≯︒ -B; \u0596ⴋ.𝟳≯︒\uFE0A; [P1 V5 V6]; [P1 V5 V6] # ֖ⴋ.7≯︒ -B; xn--hcb613r.xn--7-pgoy530h; [V5 V6]; [V5 V6] # ֖ⴋ.7≯︒ -B; xn--hcb887c.xn--7-pgoy530h; [V5 V6]; [V5 V6] # ֖Ⴋ.7≯︒ -T; \u200DF𑓂。󠺨︒\u077E𐹢; [B1 C2 P1 V6]; [B1 P1 V6] # f𑓂.︒ݾ𐹢 -N; \u200DF𑓂。󠺨︒\u077E𐹢; [B1 C2 P1 V6]; [B1 C2 P1 V6] # f𑓂.︒ݾ𐹢 -T; \u200DF𑓂。󠺨。\u077E𐹢; [B1 C2 P1 V6]; [B1 P1 V6] # f𑓂..ݾ𐹢 -N; \u200DF𑓂。󠺨。\u077E𐹢; [B1 C2 P1 V6]; [B1 C2 P1 V6] # f𑓂..ݾ𐹢 -T; \u200Df𑓂。󠺨。\u077E𐹢; [B1 C2 P1 V6]; [B1 P1 V6] # f𑓂..ݾ𐹢 -N; \u200Df𑓂。󠺨。\u077E𐹢; [B1 C2 P1 V6]; [B1 C2 P1 V6] # f𑓂..ݾ𐹢 -B; xn--f-kq9i.xn--7656e.xn--fqb4175k; [B1 V6]; [B1 V6] # f𑓂..ݾ𐹢 -B; xn--f-tgn9761i.xn--7656e.xn--fqb4175k; [B1 C2 V6]; [B1 C2 V6] # f𑓂..ݾ𐹢 -T; \u200Df𑓂。󠺨︒\u077E𐹢; [B1 C2 P1 V6]; [B1 P1 V6] # f𑓂.︒ݾ𐹢 -N; \u200Df𑓂。󠺨︒\u077E𐹢; [B1 C2 P1 V6]; [B1 C2 P1 V6] # f𑓂.︒ݾ𐹢 -B; xn--f-kq9i.xn--fqb1637j8hky9452a; [B1 V6]; [B1 V6] # f𑓂.︒ݾ𐹢 -B; xn--f-tgn9761i.xn--fqb1637j8hky9452a; [B1 C2 V6]; [B1 C2 V6] # f𑓂.︒ݾ𐹢 -B; \u0845🄇𐼗︒。𐹻𑜫; [B1 B3 P1 V6]; [B1 B3 P1 V6] # ࡅ🄇︒.𐹻𑜫 -B; \u08456,𐼗。。𐹻𑜫; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ࡅ6,..𐹻𑜫 -B; xn--6,-r4e4420y..xn--zo0di2m; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ࡅ6,..𐹻𑜫 -B; xn--3vb4696jpxkjh7s.xn--zo0di2m; [B1 B3 V6]; [B1 B3 V6] # ࡅ🄇︒.𐹻𑜫 -B; 𐹈.\u1DC0𑈱𐦭; [B1 P1 V5 V6]; [B1 P1 V5 V6] # .᷀𑈱𐦭 -B; xn--jn0d.xn--7dg0871h3lf; [B1 V5 V6]; [B1 V5 V6] # .᷀𑈱𐦭 -B; Ⴂ䠺。𞤃񅏎󙮦\u0693; [B2 P1 V6]; [B2 P1 V6] # Ⴂ䠺.𞤥ړ -B; ⴂ䠺。𞤥񅏎󙮦\u0693; [B2 P1 V6]; [B2 P1 V6] # ⴂ䠺.𞤥ړ -B; xn--tkj638f.xn--pjb9818vg4xno967d; [B2 V6]; [B2 V6] # ⴂ䠺.𞤥ړ -B; xn--9md875z.xn--pjb9818vg4xno967d; [B2 V6]; [B2 V6] # Ⴂ䠺.𞤥ړ -B; ⴂ䠺。𞤃񅏎󙮦\u0693; [B2 P1 V6]; [B2 P1 V6] # ⴂ䠺.𞤥ړ -B; 🄇伐︒.𜙚\uA8C4; [P1 V6]; [P1 V6] # 🄇伐︒.꣄ -B; 6,伐。.𜙚\uA8C4; [P1 V6 A4_2]; [P1 V6 A4_2] # 6,伐..꣄ -B; xn--6,-7i3c..xn--0f9ao925c; [P1 V6 A4_2]; [P1 V6 A4_2] # 6,伐..꣄ -B; xn--woqs083bel0g.xn--0f9ao925c; [V6]; [V6] # 🄇伐︒.꣄ -T; \u200D𐹠\uABED\uFFFB。\u200D𐫓Ⴚ𑂹; [B1 C2 P1 V6]; [B1 B2 B3 P1 V6] # 𐹠꯭.𐫓Ⴚ𑂹 -N; \u200D𐹠\uABED\uFFFB。\u200D𐫓Ⴚ𑂹; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹠꯭.𐫓Ⴚ𑂹 -T; \u200D𐹠\uABED\uFFFB。\u200D𐫓ⴚ𑂹; [B1 C2 P1 V6]; [B1 B2 B3 P1 V6] # 𐹠꯭.𐫓ⴚ𑂹 -N; \u200D𐹠\uABED\uFFFB。\u200D𐫓ⴚ𑂹; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹠꯭.𐫓ⴚ𑂹 -B; xn--429az70n29i.xn--ilj7702eqyd; [B1 B2 B3 V6]; [B1 B2 B3 V6] # 𐹠꯭.𐫓ⴚ𑂹 -B; xn--1ugz126coy7bdbm.xn--1ug062chv7ov6e; [B1 C2 V6]; [B1 C2 V6] # 𐹠꯭.𐫓ⴚ𑂹 -B; xn--429az70n29i.xn--ynd3619jqyd; [B1 B2 B3 V6]; [B1 B2 B3 V6] # 𐹠꯭.𐫓Ⴚ𑂹 -B; xn--1ugz126coy7bdbm.xn--ynd959evs1pv6e; [B1 C2 V6]; [B1 C2 V6] # 𐹠꯭.𐫓Ⴚ𑂹 -B; 󠆠.񷐴󌟈; [P1 V6 A4_2]; [P1 V6 A4_2] -B; 󠆠.񷐴󌟈; [P1 V6 A4_2]; [P1 V6 A4_2] -B; .xn--rx21bhv12i; [V6 A4_2]; [V6 A4_2] -T; 𐫃\u200CႦ.≠𞷙; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # 𐫃Ⴆ.≠ -N; 𐫃\u200CႦ.≠𞷙; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # 𐫃Ⴆ.≠ -T; 𐫃\u200CႦ.=\u0338𞷙; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # 𐫃Ⴆ.≠ -N; 𐫃\u200CႦ.=\u0338𞷙; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # 𐫃Ⴆ.≠ -T; 𐫃\u200Cⴆ.=\u0338𞷙; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # 𐫃ⴆ.≠ -N; 𐫃\u200Cⴆ.=\u0338𞷙; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # 𐫃ⴆ.≠ -T; 𐫃\u200Cⴆ.≠𞷙; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # 𐫃ⴆ.≠ -N; 𐫃\u200Cⴆ.≠𞷙; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # 𐫃ⴆ.≠ -B; xn--xkjz802e.xn--1ch2802p; [B1 B2 B3 V6]; [B1 B2 B3 V6] -B; xn--0ug132csv7o.xn--1ch2802p; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # 𐫃ⴆ.≠ -B; xn--end1719j.xn--1ch2802p; [B1 B2 B3 V6]; [B1 B2 B3 V6] -B; xn--end799ekr1p.xn--1ch2802p; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # 𐫃Ⴆ.≠ -B; 󠁲𙩢𝟥ꘌ.\u0841; [B1 P1 V6]; [B1 P1 V6] # 3ꘌ.ࡁ -B; 󠁲𙩢3ꘌ.\u0841; [B1 P1 V6]; [B1 P1 V6] # 3ꘌ.ࡁ -B; xn--3-0g3es485d8i15h.xn--zvb; [B1 V6]; [B1 V6] # 3ꘌ.ࡁ -B; -.\u1886󡲣-; [P1 V3 V5 V6]; [P1 V3 V5 V6] # -.ᢆ- -B; -.xn----pbkx6497q; [V3 V5 V6]; [V3 V5 V6] # -.ᢆ- -T; 󲚗\u200C。\u200C𞰆ς; [B1 B6 C1 P1 V6]; [B2 B3 P1 V6] # .ς -N; 󲚗\u200C。\u200C𞰆ς; [B1 B6 C1 P1 V6]; [B1 B6 C1 P1 V6] # .ς -T; 󲚗\u200C。\u200C𞰆ς; [B1 B6 C1 P1 V6]; [B2 B3 P1 V6] # .ς -N; 󲚗\u200C。\u200C𞰆ς; [B1 B6 C1 P1 V6]; [B1 B6 C1 P1 V6] # .ς -T; 󲚗\u200C。\u200C𞰆Σ; [B1 B6 C1 P1 V6]; [B2 B3 P1 V6] # .σ -N; 󲚗\u200C。\u200C𞰆Σ; [B1 B6 C1 P1 V6]; [B1 B6 C1 P1 V6] # .σ -T; 󲚗\u200C。\u200C𞰆σ; [B1 B6 C1 P1 V6]; [B2 B3 P1 V6] # .σ -N; 󲚗\u200C。\u200C𞰆σ; [B1 B6 C1 P1 V6]; [B1 B6 C1 P1 V6] # .σ -B; xn--qp42f.xn--4xa3011w; [B2 B3 V6]; [B2 B3 V6] -B; xn--0ug76062m.xn--4xa595lhn92a; [B1 B6 C1 V6]; [B1 B6 C1 V6] # .σ -B; xn--0ug76062m.xn--3xa795lhn92a; [B1 B6 C1 V6]; [B1 B6 C1 V6] # .ς -T; 󲚗\u200C。\u200C𞰆Σ; [B1 B6 C1 P1 V6]; [B2 B3 P1 V6] # .σ -N; 󲚗\u200C。\u200C𞰆Σ; [B1 B6 C1 P1 V6]; [B1 B6 C1 P1 V6] # .σ -T; 󲚗\u200C。\u200C𞰆σ; [B1 B6 C1 P1 V6]; [B2 B3 P1 V6] # .σ -N; 󲚗\u200C。\u200C𞰆σ; [B1 B6 C1 P1 V6]; [B1 B6 C1 P1 V6] # .σ -T; 堕𑓂\u1B02。𐮇𞤽\u200C-; [B3 C1 V3]; [B3 V3] # 堕𑓂ᬂ.𐮇𞤽- -N; 堕𑓂\u1B02。𐮇𞤽\u200C-; [B3 C1 V3]; [B3 C1 V3] # 堕𑓂ᬂ.𐮇𞤽- -T; 堕𑓂\u1B02。𐮇𞤛\u200C-; [B3 C1 V3]; [B3 V3] # 堕𑓂ᬂ.𐮇𞤽- -N; 堕𑓂\u1B02。𐮇𞤛\u200C-; [B3 C1 V3]; [B3 C1 V3] # 堕𑓂ᬂ.𐮇𞤽- -B; xn--5sf345zdk8h.xn----iv5iw606c; [B3 V3]; [B3 V3] # 堕𑓂ᬂ.𐮇𞤽- -B; xn--5sf345zdk8h.xn----rgnt157hwl9g; [B3 C1 V3]; [B3 C1 V3] # 堕𑓂ᬂ.𐮇𞤽- -T; 𐹶𑁆ᡕ𞤢。ᡥς\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥςتς -N; 𐹶𑁆ᡕ𞤢。ᡥς\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥςتς -T; 𐹶𑁆ᡕ𞤢。ᡥς\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥςتς -N; 𐹶𑁆ᡕ𞤢。ᡥς\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥςتς -B; 𐹶𑁆ᡕ𞤀。ᡥΣ\u062AΣ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -B; 𐹶𑁆ᡕ𞤢。ᡥσ\u062Aσ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -B; 𐹶𑁆ᡕ𞤀。ᡥΣ\u062Aσ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -B; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -T; 𐹶𑁆ᡕ𞤀。ᡥΣ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -N; 𐹶𑁆ᡕ𞤀。ᡥΣ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -T; 𐹶𑁆ᡕ𞤢。ᡥσ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -N; 𐹶𑁆ᡕ𞤢。ᡥσ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -B; xn--l8e1317j1ebz456b.xn--3xab95plx4a; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -B; xn--l8e1317j1ebz456b.xn--3xaa16plx4a; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥςتς -B; 𐹶𑁆ᡕ𞤀。ᡥΣ\u062AΣ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -B; 𐹶𑁆ᡕ𞤢。ᡥσ\u062Aσ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -B; 𐹶𑁆ᡕ𞤀。ᡥΣ\u062Aσ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -T; 𐹶𑁆ᡕ𞤀。ᡥΣ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -N; 𐹶𑁆ᡕ𞤀。ᡥΣ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -T; 𐹶𑁆ᡕ𞤢。ᡥσ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -N; 𐹶𑁆ᡕ𞤢。ᡥσ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -B; 𐹶𑁆ᡕ𞤢。ᡥΣ\u062AΣ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -B; 𐹶𑁆ᡕ𞤢。ᡥΣ\u062Aσ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -T; 𐹶𑁆ᡕ𞤢。ᡥΣ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -N; 𐹶𑁆ᡕ𞤢。ᡥΣ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -B; 𐹶𑁆ᡕ𞤢。ᡥΣ\u062AΣ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -B; 𐹶𑁆ᡕ𞤢。ᡥΣ\u062Aσ; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتσ -T; 𐹶𑁆ᡕ𞤢。ᡥΣ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -N; 𐹶𑁆ᡕ𞤢。ᡥΣ\u062Aς; [B1 B5]; [B1 B5] # 𐹶𑁆ᡕ𞤢.ᡥσتς -T; 󏒰.-𝟻ß; [P1 V3 V6]; [P1 V3 V6] -N; 󏒰.-𝟻ß; [P1 V3 V6]; [P1 V3 V6] -T; 󏒰.-5ß; [P1 V3 V6]; [P1 V3 V6] -N; 󏒰.-5ß; [P1 V3 V6]; [P1 V3 V6] -B; 󏒰.-5SS; [P1 V3 V6]; [P1 V3 V6] -B; 󏒰.-5ss; [P1 V3 V6]; [P1 V3 V6] -B; 󏒰.-5Ss; [P1 V3 V6]; [P1 V3 V6] -B; xn--t960e.-5ss; [V3 V6]; [V3 V6] -B; xn--t960e.xn---5-hia; [V3 V6]; [V3 V6] -B; 󏒰.-𝟻SS; [P1 V3 V6]; [P1 V3 V6] -B; 󏒰.-𝟻ss; [P1 V3 V6]; [P1 V3 V6] -B; 󏒰.-𝟻Ss; [P1 V3 V6]; [P1 V3 V6] -T; \u200D𐨿.🤒Ⴥ򑮶; [C2 P1 V6]; [P1 V5 V6] # 𐨿.🤒Ⴥ -N; \u200D𐨿.🤒Ⴥ򑮶; [C2 P1 V6]; [C2 P1 V6] # 𐨿.🤒Ⴥ -T; \u200D𐨿.🤒ⴥ򑮶; [C2 P1 V6]; [P1 V5 V6] # 𐨿.🤒ⴥ -N; \u200D𐨿.🤒ⴥ򑮶; [C2 P1 V6]; [C2 P1 V6] # 𐨿.🤒ⴥ -B; xn--0s9c.xn--tljz038l0gz4b; [V5 V6]; [V5 V6] -B; xn--1ug9533g.xn--tljz038l0gz4b; [C2 V6]; [C2 V6] # 𐨿.🤒ⴥ -B; xn--0s9c.xn--9nd3211w0gz4b; [V5 V6]; [V5 V6] -B; xn--1ug9533g.xn--9nd3211w0gz4b; [C2 V6]; [C2 V6] # 𐨿.🤒Ⴥ -T; 𵋅。ß𬵩\u200D; [C2 P1 V6]; [P1 V6] # .ß𬵩 -N; 𵋅。ß𬵩\u200D; [C2 P1 V6]; [C2 P1 V6] # .ß𬵩 -T; 𵋅。SS𬵩\u200D; [C2 P1 V6]; [P1 V6] # .ss𬵩 -N; 𵋅。SS𬵩\u200D; [C2 P1 V6]; [C2 P1 V6] # .ss𬵩 -T; 𵋅。ss𬵩\u200D; [C2 P1 V6]; [P1 V6] # .ss𬵩 -N; 𵋅。ss𬵩\u200D; [C2 P1 V6]; [C2 P1 V6] # .ss𬵩 -T; 𵋅。Ss𬵩\u200D; [C2 P1 V6]; [P1 V6] # .ss𬵩 -N; 𵋅。Ss𬵩\u200D; [C2 P1 V6]; [C2 P1 V6] # .ss𬵩 -B; xn--ey1p.xn--ss-eq36b; [V6]; [V6] -B; xn--ey1p.xn--ss-n1tx0508a; [C2 V6]; [C2 V6] # .ss𬵩 -B; xn--ey1p.xn--zca870nz438b; [C2 V6]; [C2 V6] # .ß𬵩 -T; \u200C𭉝。\u07F1\u0301𞹻; [B1 C1 V5]; [B1 V5] # 𭉝.߱́غ -N; \u200C𭉝。\u07F1\u0301𞹻; [B1 C1 V5]; [B1 C1 V5] # 𭉝.߱́غ -T; \u200C𭉝。\u07F1\u0301\u063A; [B1 C1 V5]; [B1 V5] # 𭉝.߱́غ -N; \u200C𭉝。\u07F1\u0301\u063A; [B1 C1 V5]; [B1 C1 V5] # 𭉝.߱́غ -B; xn--634m.xn--lsa46nuub; [B1 V5]; [B1 V5] # 𭉝.߱́غ -B; xn--0ugy003y.xn--lsa46nuub; [B1 C1 V5]; [B1 C1 V5] # 𭉝.߱́غ -T; 𞼌\u200C𑈶。𐹡; [B1 B3 C1 P1 V6]; [B1 P1 V6] # 𑈶.𐹡 -N; 𞼌\u200C𑈶。𐹡; [B1 B3 C1 P1 V6]; [B1 B3 C1 P1 V6] # 𑈶.𐹡 -B; xn--9g1d1288a.xn--8n0d; [B1 V6]; [B1 V6] -B; xn--0ug7946gzpxf.xn--8n0d; [B1 B3 C1 V6]; [B1 B3 C1 V6] # 𑈶.𐹡 -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBς≠; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻ς≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBς≠; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻ς≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBς=\u0338; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻ς≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBς=\u0338; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻ς≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBς≠; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻ς≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBς≠; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻ς≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBς=\u0338; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻ς≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBς=\u0338; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻ς≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBΣ=\u0338; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻σ≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBΣ=\u0338; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻σ≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBΣ≠; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻σ≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBΣ≠; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻σ≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBσ≠; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻σ≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBσ≠; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻σ≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBσ=\u0338; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻σ≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBσ=\u0338; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻σ≠ -B; xn--zb9h5968x.xn--4xa378i1mfjw7y; [V5 V6]; [V5 V6] # 🜭.𑖿᪻σ≠ -B; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; [C1 V5 V6]; [C1 V5 V6] # 🜭.𑖿᪻σ≠ -B; xn--0ug3766p5nm1b.xn--3xa578i1mfjw7y; [C1 V5 V6]; [C1 V5 V6] # 🜭.𑖿᪻ς≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBΣ=\u0338; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻σ≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBΣ=\u0338; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻σ≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBΣ≠; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻σ≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBΣ≠; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻σ≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBσ≠; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻σ≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBσ≠; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻σ≠ -T; 󠅯򇽭\u200C🜭。𑖿\u1ABBσ=\u0338; [C1 P1 V5 V6]; [P1 V5 V6] # 🜭.𑖿᪻σ≠ -N; 󠅯򇽭\u200C🜭。𑖿\u1ABBσ=\u0338; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 🜭.𑖿᪻σ≠ -T; ⒋。⒈\u200D򳴢; [C2 P1 V6]; [P1 V6] # ⒋.⒈ -N; ⒋。⒈\u200D򳴢; [C2 P1 V6]; [C2 P1 V6] # ⒋.⒈ -T; 4.。1.\u200D򳴢; [C2 P1 V6 A4_2]; [P1 V6 A4_2] # 4..1. -N; 4.。1.\u200D򳴢; [C2 P1 V6 A4_2]; [C2 P1 V6 A4_2] # 4..1. -B; 4..1.xn--sf51d; [V6 A4_2]; [V6 A4_2] -B; 4..1.xn--1ug64613i; [C2 V6 A4_2]; [C2 V6 A4_2] # 4..1. -B; xn--wsh.xn--tsh07994h; [V6]; [V6] -B; xn--wsh.xn--1ug58o74922a; [C2 V6]; [C2 V6] # ⒋.⒈ -T; \u0644ß。𐇽\u1A60򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لß.᩠𐇽𞤾 -N; \u0644ß。𐇽\u1A60򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لß.᩠𐇽𞤾 -T; \u0644ß。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لß.᩠𐇽𞤾 -N; \u0644ß。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لß.᩠𐇽𞤾 -T; \u0644ß。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لß.᩠𐇽𞤾 -N; \u0644ß。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لß.᩠𐇽𞤾 -B; \u0644SS。\u1A60𐇽򾅢𞤜; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644ss。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644Ss。\u1A60𐇽򾅢𞤜; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; xn--ss-svd.xn--jof2298hn83fln78f; [B1 B2 B3 V5 V6]; [B1 B2 B3 V5 V6] # لss.᩠𐇽𞤾 -B; xn--zca57y.xn--jof2298hn83fln78f; [B1 B2 B3 V5 V6]; [B1 B2 B3 V5 V6] # لß.᩠𐇽𞤾 -B; \u0644SS。\u1A60𐇽򾅢𞤜; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644ss。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644Ss。\u1A60𐇽򾅢𞤜; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644SS。𐇽\u1A60򾅢𞤜; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644ss。𐇽\u1A60򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644Ss。𐇽\u1A60򾅢𞤜; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644SS。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644Ss。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644SS。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644Ss。\u1A60𐇽򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644SS。𐇽\u1A60򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; \u0644Ss。𐇽\u1A60򾅢𞤾; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # لss.᩠𐇽𞤾 -B; 𐹽𑄳񼜲.\u1DDF\u17B8\uA806𑜫; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𐹽𑄳.ᷟី꠆𑜫 -B; xn--1o0di0c0652w.xn--33e362arr1l153d; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # 𐹽𑄳.ᷟី꠆𑜫 -T; Ⴓ𑜫\u200D򗭓.\u06A7𑰶; [P1 V6]; [P1 V6] # Ⴓ𑜫.ڧ𑰶 -N; Ⴓ𑜫\u200D򗭓.\u06A7𑰶; [P1 V6]; [P1 V6] # Ⴓ𑜫.ڧ𑰶 -T; Ⴓ𑜫\u200D򗭓.\u06A7𑰶; [P1 V6]; [P1 V6] # Ⴓ𑜫.ڧ𑰶 -N; Ⴓ𑜫\u200D򗭓.\u06A7𑰶; [P1 V6]; [P1 V6] # Ⴓ𑜫.ڧ𑰶 -T; ⴓ𑜫\u200D򗭓.\u06A7𑰶; [P1 V6]; [P1 V6] # ⴓ𑜫.ڧ𑰶 -N; ⴓ𑜫\u200D򗭓.\u06A7𑰶; [P1 V6]; [P1 V6] # ⴓ𑜫.ڧ𑰶 -B; xn--blj6306ey091d.xn--9jb4223l; [V6]; [V6] # ⴓ𑜫.ڧ𑰶 -B; xn--1ugy52cym7p7xu5e.xn--9jb4223l; [V6]; [V6] # ⴓ𑜫.ڧ𑰶 -B; xn--rnd8945ky009c.xn--9jb4223l; [V6]; [V6] # Ⴓ𑜫.ڧ𑰶 -B; xn--rnd479ep20q7x12e.xn--9jb4223l; [V6]; [V6] # Ⴓ𑜫.ڧ𑰶 -T; ⴓ𑜫\u200D򗭓.\u06A7𑰶; [P1 V6]; [P1 V6] # ⴓ𑜫.ڧ𑰶 -N; ⴓ𑜫\u200D򗭓.\u06A7𑰶; [P1 V6]; [P1 V6] # ⴓ𑜫.ڧ𑰶 -B; 𐨿.🄆—; [P1 V5 V6]; [P1 V5 V6] -B; 𐨿.5,—; [P1 V5 V6]; [P1 V5 V6] -B; xn--0s9c.xn--5,-81t; [P1 V5 V6]; [P1 V5 V6] -B; xn--0s9c.xn--8ug8324p; [V5 V6]; [V5 V6] -B; 򔊱񁦮۸。󠾭-; [P1 V3 V6]; [P1 V3 V6] -B; xn--lmb18944c0g2z.xn----2k81m; [V3 V6]; [V3 V6] -B; 𼗸\u07CD𐹮。\u06DDᡎᠴ; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ߍ𐹮.ᡎᠴ -B; xn--osb0855kcc2r.xn--tlb299fhc; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ߍ𐹮.ᡎᠴ -T; \u200DᠮႾ🄂.🚗\u0841𮹌\u200C; [B1 C1 C2 P1 V6]; [B1 P1 V6] # ᠮႾ🄂.🚗ࡁ -N; \u200DᠮႾ🄂.🚗\u0841𮹌\u200C; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ᠮႾ🄂.🚗ࡁ -T; \u200DᠮႾ1,.🚗\u0841𮹌\u200C; [B1 C1 C2 P1 V6]; [B1 B6 P1 V6] # ᠮႾ1,.🚗ࡁ -N; \u200DᠮႾ1,.🚗\u0841𮹌\u200C; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ᠮႾ1,.🚗ࡁ -T; \u200Dᠮⴞ1,.🚗\u0841𮹌\u200C; [B1 C1 C2 P1 V6]; [B1 B6 P1 V6] # ᠮⴞ1,.🚗ࡁ -N; \u200Dᠮⴞ1,.🚗\u0841𮹌\u200C; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ᠮⴞ1,.🚗ࡁ -B; xn--1,-v3o625k.xn--zvb3124wpkpf; [B1 B6 P1 V6]; [B1 B6 P1 V6] # ᠮⴞ1,.🚗ࡁ -B; xn--1,-v3o161c53q.xn--zvb692j9664aic1g; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ᠮⴞ1,.🚗ࡁ -B; xn--1,-ogkx89c.xn--zvb3124wpkpf; [B1 B6 P1 V6]; [B1 B6 P1 V6] # ᠮႾ1,.🚗ࡁ -B; xn--1,-ogkx89c39j.xn--zvb692j9664aic1g; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ᠮႾ1,.🚗ࡁ -T; \u200Dᠮⴞ🄂.🚗\u0841𮹌\u200C; [B1 C1 C2 P1 V6]; [B1 P1 V6] # ᠮⴞ🄂.🚗ࡁ -N; \u200Dᠮⴞ🄂.🚗\u0841𮹌\u200C; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ᠮⴞ🄂.🚗ࡁ -B; xn--h7e438h1p44a.xn--zvb3124wpkpf; [B1 V6]; [B1 V6] # ᠮⴞ🄂.🚗ࡁ -B; xn--h7e341b0wlbv45b.xn--zvb692j9664aic1g; [B1 C1 C2 V6]; [B1 C1 C2 V6] # ᠮⴞ🄂.🚗ࡁ -B; xn--2nd129ai554b.xn--zvb3124wpkpf; [B1 V6]; [B1 V6] # ᠮႾ🄂.🚗ࡁ -B; xn--2nd129ay2gnw71c.xn--zvb692j9664aic1g; [B1 C1 C2 V6]; [B1 C1 C2 V6] # ᠮႾ🄂.🚗ࡁ -B; \u0601\u0697.𑚶񼡷⾆; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ڗ.𑚶舌 -B; \u0601\u0697.𑚶񼡷舌; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ڗ.𑚶舌 -B; xn--jfb41a.xn--tc1ap851axo39c; [B1 V5 V6]; [B1 V5 V6] # ڗ.𑚶舌 -B; 🞅󠳡󜍙.񲖷; [P1 V6]; [P1 V6] -B; xn--ie9hi1349bqdlb.xn--oj69a; [V6]; [V6] -T; \u20E7񯡎-򫣝.4Ⴄ\u200C; [C1 P1 V5 V6]; [P1 V5 V6] # ⃧-.4Ⴄ -N; \u20E7񯡎-򫣝.4Ⴄ\u200C; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ⃧-.4Ⴄ -T; \u20E7񯡎-򫣝.4ⴄ\u200C; [C1 P1 V5 V6]; [P1 V5 V6] # ⃧-.4ⴄ -N; \u20E7񯡎-򫣝.4ⴄ\u200C; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ⃧-.4ⴄ -B; xn----9snu5320fi76w.xn--4-ivs; [V5 V6]; [V5 V6] # ⃧-.4ⴄ -B; xn----9snu5320fi76w.xn--4-sgn589c; [C1 V5 V6]; [C1 V5 V6] # ⃧-.4ⴄ -B; xn----9snu5320fi76w.xn--4-f0g; [V5 V6]; [V5 V6] # ⃧-.4Ⴄ -B; xn----9snu5320fi76w.xn--4-f0g649i; [C1 V5 V6]; [C1 V5 V6] # ⃧-.4Ⴄ -T; ᚭ。𝌠ß𖫱; ᚭ.𝌠ß𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -N; ᚭ。𝌠ß𖫱; ᚭ.𝌠ß𖫱; xn--hwe.xn--zca4946pblnc; NV8 -T; ᚭ。𝌠ß𖫱; ᚭ.𝌠ß𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -N; ᚭ。𝌠ß𖫱; ᚭ.𝌠ß𖫱; xn--hwe.xn--zca4946pblnc; NV8 -B; ᚭ。𝌠SS𖫱; ᚭ.𝌠ss𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -B; ᚭ。𝌠ss𖫱; ᚭ.𝌠ss𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -B; ᚭ。𝌠Ss𖫱; ᚭ.𝌠ss𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -B; xn--hwe.xn--ss-ci1ub261a; ᚭ.𝌠ss𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -B; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; NV8 -B; ᚭ.𝌠SS𖫱; ᚭ.𝌠ss𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -B; ᚭ.𝌠Ss𖫱; ᚭ.𝌠ss𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -B; xn--hwe.xn--zca4946pblnc; ᚭ.𝌠ß𖫱; xn--hwe.xn--zca4946pblnc; NV8 -T; ᚭ.𝌠ß𖫱; ; xn--hwe.xn--ss-ci1ub261a; NV8 -N; ᚭ.𝌠ß𖫱; ; xn--hwe.xn--zca4946pblnc; NV8 -B; ᚭ。𝌠SS𖫱; ᚭ.𝌠ss𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -B; ᚭ。𝌠ss𖫱; ᚭ.𝌠ss𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -B; ᚭ。𝌠Ss𖫱; ᚭ.𝌠ss𖫱; xn--hwe.xn--ss-ci1ub261a; NV8 -B; ₁。𞤫ꡪ; [B1 B2 B3]; [B1 B2 B3] -B; 1。𞤫ꡪ; [B1 B2 B3]; [B1 B2 B3] -B; 1。𞤉ꡪ; [B1 B2 B3]; [B1 B2 B3] -B; 1.xn--gd9al691d; [B1 B2 B3]; [B1 B2 B3] -B; ₁。𞤉ꡪ; [B1 B2 B3]; [B1 B2 B3] -T; 𯻼\u200C.𞶞򻙤񥘇; [B2 B3 B6 C1 P1 V6]; [B2 B3 P1 V6] # . -N; 𯻼\u200C.𞶞򻙤񥘇; [B2 B3 B6 C1 P1 V6]; [B2 B3 B6 C1 P1 V6] # . -B; xn--kg4n.xn--2b7hs861pl540a; [B2 B3 V6]; [B2 B3 V6] -B; xn--0ug27500a.xn--2b7hs861pl540a; [B2 B3 B6 C1 V6]; [B2 B3 B6 C1 V6] # . -B; 𑑄≯。𑜤; [P1 V5 V6]; [P1 V5 V6] -B; 𑑄>\u0338。𑜤; [P1 V5 V6]; [P1 V5 V6] -B; 𑑄≯。𑜤; [P1 V5 V6]; [P1 V5 V6] -B; 𑑄>\u0338。𑜤; [P1 V5 V6]; [P1 V5 V6] -B; xn--hdh5636g.xn--ci2d; [V5 V6]; [V5 V6] -T; Ⴋ≮𱲆。\u200D\u07A7𐋣; [C2 P1 V6]; [P1 V5 V6] # Ⴋ≮.ާ𐋣 -N; Ⴋ≮𱲆。\u200D\u07A7𐋣; [C2 P1 V6]; [C2 P1 V6] # Ⴋ≮.ާ𐋣 -T; Ⴋ<\u0338𱲆。\u200D\u07A7𐋣; [C2 P1 V6]; [P1 V5 V6] # Ⴋ≮.ާ𐋣 -N; Ⴋ<\u0338𱲆。\u200D\u07A7𐋣; [C2 P1 V6]; [C2 P1 V6] # Ⴋ≮.ާ𐋣 -T; ⴋ<\u0338𱲆。\u200D\u07A7𐋣; [C2 P1 V6]; [P1 V5 V6] # ⴋ≮.ާ𐋣 -N; ⴋ<\u0338𱲆。\u200D\u07A7𐋣; [C2 P1 V6]; [C2 P1 V6] # ⴋ≮.ާ𐋣 -T; ⴋ≮𱲆。\u200D\u07A7𐋣; [C2 P1 V6]; [P1 V5 V6] # ⴋ≮.ާ𐋣 -N; ⴋ≮𱲆。\u200D\u07A7𐋣; [C2 P1 V6]; [C2 P1 V6] # ⴋ≮.ާ𐋣 -B; xn--gdhz03bxt42d.xn--lrb6479j; [V5 V6]; [V5 V6] # ⴋ≮.ާ𐋣 -B; xn--gdhz03bxt42d.xn--lrb506jqr4n; [C2 V6]; [C2 V6] # ⴋ≮.ާ𐋣 -B; xn--jnd802gsm17c.xn--lrb6479j; [V5 V6]; [V5 V6] # Ⴋ≮.ާ𐋣 -B; xn--jnd802gsm17c.xn--lrb506jqr4n; [C2 V6]; [C2 V6] # Ⴋ≮.ާ𐋣 -B; \u17D2.򆽒≯; [P1 V5 V6]; [P1 V5 V6] # ្.≯ -B; \u17D2.򆽒>\u0338; [P1 V5 V6]; [P1 V5 V6] # ្.≯ -B; xn--u4e.xn--hdhx0084f; [V5 V6]; [V5 V6] # ្.≯ -B; 񏁇\u1734.𐨺É⬓𑄴; [P1 V5 V6]; [P1 V5 V6] # ᜴.𐨺é⬓𑄴 -B; 񏁇\u1734.𐨺E\u0301⬓𑄴; [P1 V5 V6]; [P1 V5 V6] # ᜴.𐨺é⬓𑄴 -B; 񏁇\u1734.𐨺É⬓𑄴; [P1 V5 V6]; [P1 V5 V6] # ᜴.𐨺é⬓𑄴 -B; 񏁇\u1734.𐨺E\u0301⬓𑄴; [P1 V5 V6]; [P1 V5 V6] # ᜴.𐨺é⬓𑄴 -B; 񏁇\u1734.𐨺e\u0301⬓𑄴; [P1 V5 V6]; [P1 V5 V6] # ᜴.𐨺é⬓𑄴 -B; 񏁇\u1734.𐨺é⬓𑄴; [P1 V5 V6]; [P1 V5 V6] # ᜴.𐨺é⬓𑄴 -B; xn--c0e34564d.xn--9ca207st53lg3f; [V5 V6]; [V5 V6] # ᜴.𐨺é⬓𑄴 -B; 񏁇\u1734.𐨺e\u0301⬓𑄴; [P1 V5 V6]; [P1 V5 V6] # ᜴.𐨺é⬓𑄴 -B; 񏁇\u1734.𐨺é⬓𑄴; [P1 V5 V6]; [P1 V5 V6] # ᜴.𐨺é⬓𑄴 -T; ᢇ\u200D\uA8C4。︒𞤺; [B1 B6 C2 P1 V6]; [B1 P1 V6] # ᢇ꣄.︒𞤺 -N; ᢇ\u200D\uA8C4。︒𞤺; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ᢇ꣄.︒𞤺 -T; ᢇ\u200D\uA8C4。。𞤺; [B6 C2 A4_2]; [A4_2] # ᢇ꣄..𞤺 -N; ᢇ\u200D\uA8C4。。𞤺; [B6 C2 A4_2]; [B6 C2 A4_2] # ᢇ꣄..𞤺 -T; ᢇ\u200D\uA8C4。。𞤘; [B6 C2 A4_2]; [A4_2] # ᢇ꣄..𞤺 -N; ᢇ\u200D\uA8C4。。𞤘; [B6 C2 A4_2]; [B6 C2 A4_2] # ᢇ꣄..𞤺 -B; xn--09e4694e..xn--ye6h; [A4_2]; [A4_2] # ᢇ꣄..𞤺 -B; xn--09e669a6x8j..xn--ye6h; [B6 C2 A4_2]; [B6 C2 A4_2] # ᢇ꣄..𞤺 -T; ᢇ\u200D\uA8C4。︒𞤘; [B1 B6 C2 P1 V6]; [B1 P1 V6] # ᢇ꣄.︒𞤺 -N; ᢇ\u200D\uA8C4。︒𞤘; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ᢇ꣄.︒𞤺 -B; xn--09e4694e.xn--y86cv562b; [B1 V6]; [B1 V6] # ᢇ꣄.︒𞤺 -B; xn--09e669a6x8j.xn--y86cv562b; [B1 B6 C2 V6]; [B1 B6 C2 V6] # ᢇ꣄.︒𞤺 -T; 𞩬򖙱\u1714\u200C。\u0631\u07AA≮; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ᜔.رު≮ -N; 𞩬򖙱\u1714\u200C。\u0631\u07AA≮; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ᜔.رު≮ -T; 𞩬򖙱\u1714\u200C。\u0631\u07AA<\u0338; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ᜔.رު≮ -N; 𞩬򖙱\u1714\u200C。\u0631\u07AA<\u0338; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ᜔.رު≮ -T; 𞩬򖙱\u1714\u200C。\u0631\u07AA≮; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ᜔.رު≮ -N; 𞩬򖙱\u1714\u200C。\u0631\u07AA≮; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ᜔.رު≮ -T; 𞩬򖙱\u1714\u200C。\u0631\u07AA<\u0338; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ᜔.رު≮ -N; 𞩬򖙱\u1714\u200C。\u0631\u07AA<\u0338; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ᜔.رު≮ -B; xn--fze3930v7hz6b.xn--wgb86el10d; [B2 B3 V6]; [B2 B3 V6] # ᜔.رު≮ -B; xn--fze607b9651bjwl7c.xn--wgb86el10d; [B2 B3 V6]; [B2 B3 V6] # ᜔.رު≮ -B; Ⴣ.\u0653ᢤ; [P1 V5 V6]; [P1 V5 V6] # Ⴣ.ٓᢤ -B; Ⴣ.\u0653ᢤ; [P1 V5 V6]; [P1 V5 V6] # Ⴣ.ٓᢤ -B; ⴣ.\u0653ᢤ; [V5]; [V5] # ⴣ.ٓᢤ -B; xn--rlj.xn--vhb294g; [V5]; [V5] # ⴣ.ٓᢤ -B; xn--7nd.xn--vhb294g; [V5 V6]; [V5 V6] # Ⴣ.ٓᢤ -B; ⴣ.\u0653ᢤ; [V5]; [V5] # ⴣ.ٓᢤ -B; 󠄈\u0813.싉򄆻Ⴤ򂡐; [P1 V6]; [P1 V6] # ࠓ.싉Ⴤ -B; 󠄈\u0813.싉򄆻Ⴤ򂡐; [P1 V6]; [P1 V6] # ࠓ.싉Ⴤ -B; 󠄈\u0813.싉򄆻Ⴤ򂡐; [P1 V6]; [P1 V6] # ࠓ.싉Ⴤ -B; 󠄈\u0813.싉򄆻Ⴤ򂡐; [P1 V6]; [P1 V6] # ࠓ.싉Ⴤ -B; 󠄈\u0813.싉򄆻ⴤ򂡐; [P1 V6]; [P1 V6] # ࠓ.싉ⴤ -B; 󠄈\u0813.싉򄆻ⴤ򂡐; [P1 V6]; [P1 V6] # ࠓ.싉ⴤ -B; xn--oub.xn--sljz109bpe25dviva; [V6]; [V6] # ࠓ.싉ⴤ -B; xn--oub.xn--8nd9522gpe69cviva; [V6]; [V6] # ࠓ.싉Ⴤ -B; 󠄈\u0813.싉򄆻ⴤ򂡐; [P1 V6]; [P1 V6] # ࠓ.싉ⴤ -B; 󠄈\u0813.싉򄆻ⴤ򂡐; [P1 V6]; [P1 V6] # ࠓ.싉ⴤ -B; \uAA2C𑲫≮.⤂; [P1 V5 V6]; [P1 V5 V6] # ꨬ𑲫≮.⤂ -B; \uAA2C𑲫<\u0338.⤂; [P1 V5 V6]; [P1 V5 V6] # ꨬ𑲫≮.⤂ -B; \uAA2C𑲫≮.⤂; [P1 V5 V6]; [P1 V5 V6] # ꨬ𑲫≮.⤂ -B; \uAA2C𑲫<\u0338.⤂; [P1 V5 V6]; [P1 V5 V6] # ꨬ𑲫≮.⤂ -B; xn--gdh1854cn19c.xn--kqi; [V5 V6]; [V5 V6] # ꨬ𑲫≮.⤂ -B; \u0604𐩔≮Ⴢ.Ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮Ⴢ.Ⴃ -B; \u0604𐩔<\u0338Ⴢ.Ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮Ⴢ.Ⴃ -B; \u0604𐩔≮Ⴢ.Ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮Ⴢ.Ⴃ -B; \u0604𐩔<\u0338Ⴢ.Ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮Ⴢ.Ⴃ -B; \u0604𐩔<\u0338ⴢ.ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮ⴢ.ⴃ -B; \u0604𐩔≮ⴢ.ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮ⴢ.ⴃ -B; \u0604𐩔≮Ⴢ.ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮Ⴢ.ⴃ -B; \u0604𐩔<\u0338Ⴢ.ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮Ⴢ.ⴃ -B; xn--mfb416c0jox02t.xn--ukj; [B1 V6]; [B1 V6] # 𐩔≮Ⴢ.ⴃ -B; xn--mfb266l4khr54u.xn--ukj; [B1 V6]; [B1 V6] # 𐩔≮ⴢ.ⴃ -B; xn--mfb416c0jox02t.xn--bnd; [B1 V6]; [B1 V6] # 𐩔≮Ⴢ.Ⴃ -B; \u0604𐩔<\u0338ⴢ.ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮ⴢ.ⴃ -B; \u0604𐩔≮ⴢ.ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮ⴢ.ⴃ -B; \u0604𐩔≮Ⴢ.ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮Ⴢ.ⴃ -B; \u0604𐩔<\u0338Ⴢ.ⴃ; [B1 P1 V6]; [B1 P1 V6] # 𐩔≮Ⴢ.ⴃ -B; 𑁅。-; [V3 V5]; [V3 V5] -B; xn--210d.-; [V3 V5]; [V3 V5] -B; \u0DCA򕸽󠧱。饈≠\u0664; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ්.饈≠٤ -B; \u0DCA򕸽󠧱。饈=\u0338\u0664; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ්.饈≠٤ -B; \u0DCA򕸽󠧱。饈≠\u0664; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ්.饈≠٤ -B; \u0DCA򕸽󠧱。饈=\u0338\u0664; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ්.饈≠٤ -B; xn--h1c25913jfwov.xn--dib144ler5f; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ්.饈≠٤ -B; 𞥃ᠠ⁷。≯邅⬻4; [B1 B2 P1 V6]; [B1 B2 P1 V6] -B; 𞥃ᠠ⁷。>\u0338邅⬻4; [B1 B2 P1 V6]; [B1 B2 P1 V6] -B; 𞥃ᠠ7。≯邅⬻4; [B1 B2 P1 V6]; [B1 B2 P1 V6] -B; 𞥃ᠠ7。>\u0338邅⬻4; [B1 B2 P1 V6]; [B1 B2 P1 V6] -B; 𞤡ᠠ7。>\u0338邅⬻4; [B1 B2 P1 V6]; [B1 B2 P1 V6] -B; 𞤡ᠠ7。≯邅⬻4; [B1 B2 P1 V6]; [B1 B2 P1 V6] -B; xn--7-v4j2826w.xn--4-ogoy01bou3i; [B1 B2 V6]; [B1 B2 V6] -B; 𞤡ᠠ⁷。>\u0338邅⬻4; [B1 B2 P1 V6]; [B1 B2 P1 V6] -B; 𞤡ᠠ⁷。≯邅⬻4; [B1 B2 P1 V6]; [B1 B2 P1 V6] -B; 򠿯ᡳ-𑐻.𐹴𐋫\u0605󑎳; [B1 B6 P1 V6]; [B1 B6 P1 V6] # ᡳ-𑐻.𐹴𐋫 -B; xn----m9j3429kxmy7e.xn--nfb7950kdihrp812a; [B1 B6 V6]; [B1 B6 V6] # ᡳ-𑐻.𐹴𐋫 -B; 򠶆\u0845\u0A51.넨-󶧈; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ࡅੑ.넨- -B; 򠶆\u0845\u0A51.넨-󶧈; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ࡅੑ.넨- -B; xn--3vb26hb6834b.xn----i37ez0957g; [B5 B6 V6]; [B5 B6 V6] # ࡅੑ.넨- -T; ꡦᡑ\u200D⒈。𐋣-; [C2 P1 V3 V6]; [P1 V3 V6] # ꡦᡑ⒈.𐋣- -N; ꡦᡑ\u200D⒈。𐋣-; [C2 P1 V3 V6]; [C2 P1 V3 V6] # ꡦᡑ⒈.𐋣- -T; ꡦᡑ\u200D1.。𐋣-; [C2 V3 A4_2]; [V3 A4_2] # ꡦᡑ1..𐋣- -N; ꡦᡑ\u200D1.。𐋣-; [C2 V3 A4_2]; [C2 V3 A4_2] # ꡦᡑ1..𐋣- -B; xn--1-o7j0610f..xn----381i; [V3 A4_2]; [V3 A4_2] -B; xn--1-o7j663bdl7m..xn----381i; [C2 V3 A4_2]; [C2 V3 A4_2] # ꡦᡑ1..𐋣- -B; xn--h8e863drj7h.xn----381i; [V3 V6]; [V3 V6] -B; xn--h8e470bl0d838o.xn----381i; [C2 V3 V6]; [C2 V3 V6] # ꡦᡑ⒈.𐋣- -B; Ⴌ。􍼠\uFB69; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴌ.ٹ -B; Ⴌ。􍼠\u0679; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴌ.ٹ -B; ⴌ。􍼠\u0679; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ⴌ.ٹ -B; xn--3kj.xn--yib19191t; [B5 B6 V6]; [B5 B6 V6] # ⴌ.ٹ -B; xn--knd.xn--yib19191t; [B5 B6 V6]; [B5 B6 V6] # Ⴌ.ٹ -B; ⴌ。􍼠\uFB69; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ⴌ.ٹ -B; 𐮁𐭱.\u0F84\u135E-\u1CFA; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𐮁𐭱.྄፞- -B; xn--r19c5a.xn----xjg270ag3m; [B1 V5 V6]; [B1 V5 V6] # 𐮁𐭱.྄፞- -T; ⒈䰹\u200D-。웈; [C2 P1 V3 V6]; [P1 V3 V6] # ⒈䰹-.웈 -N; ⒈䰹\u200D-。웈; [C2 P1 V3 V6]; [C2 P1 V3 V6] # ⒈䰹-.웈 -T; ⒈䰹\u200D-。웈; [C2 P1 V3 V6]; [P1 V3 V6] # ⒈䰹-.웈 -N; ⒈䰹\u200D-。웈; [C2 P1 V3 V6]; [C2 P1 V3 V6] # ⒈䰹-.웈 -T; 1.䰹\u200D-。웈; [C2 V3]; [V3] # 1.䰹-.웈 -N; 1.䰹\u200D-。웈; [C2 V3]; [C2 V3] # 1.䰹-.웈 -T; 1.䰹\u200D-。웈; [C2 V3]; [V3] # 1.䰹-.웈 -N; 1.䰹\u200D-。웈; [C2 V3]; [C2 V3] # 1.䰹-.웈 -B; 1.xn----zw5a.xn--kp5b; [V3]; [V3] -B; 1.xn----tgnz80r.xn--kp5b; [C2 V3]; [C2 V3] # 1.䰹-.웈 -B; xn----dcp160o.xn--kp5b; [V3 V6]; [V3 V6] -B; xn----tgnx5rjr6c.xn--kp5b; [C2 V3 V6]; [C2 V3 V6] # ⒈䰹-.웈 -T; て。\u200C󠳽\u07F3; [C1 P1 V6]; [P1 V6] # て.߳ -N; て。\u200C󠳽\u07F3; [C1 P1 V6]; [C1 P1 V6] # て.߳ -B; xn--m9j.xn--rtb10784p; [V6]; [V6] # て.߳ -B; xn--m9j.xn--rtb154j9l73w; [C1 V6]; [C1 V6] # て.߳ -T; ς。\uA9C0\u06E7; [V5]; [V5] # ς.꧀ۧ -N; ς。\uA9C0\u06E7; [V5]; [V5] # ς.꧀ۧ -T; ς。\uA9C0\u06E7; [V5]; [V5] # ς.꧀ۧ -N; ς。\uA9C0\u06E7; [V5]; [V5] # ς.꧀ۧ -B; Σ。\uA9C0\u06E7; [V5]; [V5] # σ.꧀ۧ -B; σ。\uA9C0\u06E7; [V5]; [V5] # σ.꧀ۧ -B; xn--4xa.xn--3lb1944f; [V5]; [V5] # σ.꧀ۧ -B; xn--3xa.xn--3lb1944f; [V5]; [V5] # ς.꧀ۧ -B; Σ。\uA9C0\u06E7; [V5]; [V5] # σ.꧀ۧ -B; σ。\uA9C0\u06E7; [V5]; [V5] # σ.꧀ۧ -B; \u0BCD󥫅򌉑.ႢႵ; [P1 V5 V6]; [P1 V5 V6] # ்.ႢႵ -B; \u0BCD󥫅򌉑.ⴂⴕ; [P1 V5 V6]; [P1 V5 V6] # ்.ⴂⴕ -B; \u0BCD󥫅򌉑.Ⴂⴕ; [P1 V5 V6]; [P1 V5 V6] # ்.Ⴂⴕ -B; xn--xmc83135idcxza.xn--9md086l; [V5 V6]; [V5 V6] # ்.Ⴂⴕ -B; xn--xmc83135idcxza.xn--tkjwb; [V5 V6]; [V5 V6] # ்.ⴂⴕ -B; xn--xmc83135idcxza.xn--9md2b; [V5 V6]; [V5 V6] # ்.ႢႵ -T; \u1C32🄈⾛\u05A6.\u200D򯥤\u07FD; [B1 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ᰲ🄈走֦. -N; \u1C32🄈⾛\u05A6.\u200D򯥤\u07FD; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ᰲ🄈走֦. -T; \u1C327,走\u05A6.\u200D򯥤\u07FD; [B1 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ᰲ7,走֦. -N; \u1C327,走\u05A6.\u200D򯥤\u07FD; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ᰲ7,走֦. -B; xn--7,-bid991urn3k.xn--1tb13454l; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ᰲ7,走֦. -B; xn--7,-bid991urn3k.xn--1tb334j1197q; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ᰲ7,走֦. -B; xn--xcb756i493fwi5o.xn--1tb13454l; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ᰲ🄈走֦. -B; xn--xcb756i493fwi5o.xn--1tb334j1197q; [B1 C2 V5 V6]; [B1 C2 V5 V6] # ᰲ🄈走֦. -B; ᢗ。Ӏ񝄻; [P1 V6]; [P1 V6] -B; ᢗ。Ӏ񝄻; [P1 V6]; [P1 V6] -B; ᢗ。ӏ񝄻; [P1 V6]; [P1 V6] -B; xn--hbf.xn--s5a83117e; [V6]; [V6] -B; xn--hbf.xn--d5a86117e; [V6]; [V6] -B; ᢗ。ӏ񝄻; [P1 V6]; [P1 V6] -B; \u0668-。񠏇🝆ᄾ; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ٨-.🝆ᄾ -B; xn----oqc.xn--qrd1699v327w; [B1 V3 V6]; [B1 V3 V6] # ٨-.🝆ᄾ -B; -𐋷𖾑。󠆬; [V3]; [V3] -B; xn----991iq40y.; [V3]; [V3] -T; \u200C𐹳🐴멈.\uABED񐡼; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𐹳🐴멈.꯭ -N; \u200C𐹳🐴멈.\uABED񐡼; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𐹳🐴멈.꯭ -T; \u200C𐹳🐴멈.\uABED񐡼; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𐹳🐴멈.꯭ -N; \u200C𐹳🐴멈.\uABED񐡼; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𐹳🐴멈.꯭ -B; xn--422b325mqb6i.xn--429a8682s; [B1 V5 V6]; [B1 V5 V6] # 𐹳🐴멈.꯭ -B; xn--0ug6681d406b7bwk.xn--429a8682s; [B1 C1 V5 V6]; [B1 C1 V5 V6] # 𐹳🐴멈.꯭ -B; ≮.\u0769\u0603; [B1 P1 V6]; [B1 P1 V6] # ≮.ݩ -B; <\u0338.\u0769\u0603; [B1 P1 V6]; [B1 P1 V6] # ≮.ݩ -B; xn--gdh.xn--lfb92e; [B1 V6]; [B1 V6] # ≮.ݩ -T; 𐶭⾆。\u200C𑚶򟱃𞰘; [B1 B2 B3 C1 P1 V6]; [B2 B3 B5 B6 P1 V5 V6] # 舌.𑚶 -N; 𐶭⾆。\u200C𑚶򟱃𞰘; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # 舌.𑚶 -T; 𐶭舌。\u200C𑚶򟱃𞰘; [B1 B2 B3 C1 P1 V6]; [B2 B3 B5 B6 P1 V5 V6] # 舌.𑚶 -N; 𐶭舌。\u200C𑚶򟱃𞰘; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # 舌.𑚶 -B; xn--tc1ao37z.xn--6e2dw557azds2d; [B2 B3 B5 B6 V5 V6]; [B2 B3 B5 B6 V5 V6] -B; xn--tc1ao37z.xn--0ugx728gi1nfwqz2e; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # 舌.𑚶 -T; \u200CჀ-.𝟷ς𞴺ς; [B1 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # Ⴠ-.1ςς -N; \u200CჀ-.𝟷ς𞴺ς; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # Ⴠ-.1ςς -T; \u200CჀ-.1ς𞴺ς; [B1 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # Ⴠ-.1ςς -N; \u200CჀ-.1ς𞴺ς; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # Ⴠ-.1ςς -T; \u200Cⴠ-.1ς𞴺ς; [B1 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # ⴠ-.1ςς -N; \u200Cⴠ-.1ς𞴺ς; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # ⴠ-.1ςς -T; \u200CჀ-.1Σ𞴺Σ; [B1 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # Ⴠ-.1σσ -N; \u200CჀ-.1Σ𞴺Σ; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # Ⴠ-.1σσ -T; \u200Cⴠ-.1σ𞴺σ; [B1 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # ⴠ-.1σσ -N; \u200Cⴠ-.1σ𞴺σ; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # ⴠ-.1σσ -B; xn----2ws.xn--1-0mba52321c; [B1 B6 V3 V6]; [B1 B6 V3 V6] -B; xn----rgn530d.xn--1-0mba52321c; [B1 C1 V3 V6]; [B1 C1 V3 V6] # ⴠ-.1σσ -B; xn----z1g.xn--1-0mba52321c; [B1 B6 V3 V6]; [B1 B6 V3 V6] -B; xn----z1g168i.xn--1-0mba52321c; [B1 C1 V3 V6]; [B1 C1 V3 V6] # Ⴠ-.1σσ -B; xn----rgn530d.xn--1-ymba92321c; [B1 C1 V3 V6]; [B1 C1 V3 V6] # ⴠ-.1ςς -B; xn----z1g168i.xn--1-ymba92321c; [B1 C1 V3 V6]; [B1 C1 V3 V6] # Ⴠ-.1ςς -T; \u200Cⴠ-.𝟷ς𞴺ς; [B1 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # ⴠ-.1ςς -N; \u200Cⴠ-.𝟷ς𞴺ς; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # ⴠ-.1ςς -T; \u200CჀ-.𝟷Σ𞴺Σ; [B1 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # Ⴠ-.1σσ -N; \u200CჀ-.𝟷Σ𞴺Σ; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # Ⴠ-.1σσ -T; \u200Cⴠ-.𝟷σ𞴺σ; [B1 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # ⴠ-.1σσ -N; \u200Cⴠ-.𝟷σ𞴺σ; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # ⴠ-.1σσ -B; 𑲘󠄒𓑡。𝟪Ⴜ; [P1 V5 V6]; [P1 V5 V6] -B; 𑲘󠄒𓑡。8Ⴜ; [P1 V5 V6]; [P1 V5 V6] -B; 𑲘󠄒𓑡。8ⴜ; [P1 V5 V6]; [P1 V5 V6] -B; xn--7m3d291b.xn--8-vws; [V5 V6]; [V5 V6] -B; xn--7m3d291b.xn--8-s1g; [V5 V6]; [V5 V6] -B; 𑲘󠄒𓑡。𝟪ⴜ; [P1 V5 V6]; [P1 V5 V6] -B; 䪏\u06AB\u07E0\u0941。뭕ᢝ\u17B9; [B5 B6]; [B5 B6] # 䪏ګߠु.뭕ᢝឹ -B; 䪏\u06AB\u07E0\u0941。뭕ᢝ\u17B9; [B5 B6]; [B5 B6] # 䪏ګߠु.뭕ᢝឹ -B; 䪏\u06AB\u07E0\u0941。뭕ᢝ\u17B9; [B5 B6]; [B5 B6] # 䪏ګߠु.뭕ᢝឹ -B; 䪏\u06AB\u07E0\u0941。뭕ᢝ\u17B9; [B5 B6]; [B5 B6] # 䪏ګߠु.뭕ᢝឹ -B; xn--ekb23dj4at01n.xn--43e96bh910b; [B5 B6]; [B5 B6] # 䪏ګߠु.뭕ᢝឹ -B; \u1BAB。🂉󠁰; [P1 V5 V6]; [P1 V5 V6] # ᮫.🂉 -B; \u1BAB。🂉󠁰; [P1 V5 V6]; [P1 V5 V6] # ᮫.🂉 -B; xn--zxf.xn--fx7ho0250c; [V5 V6]; [V5 V6] # ᮫.🂉 -T; 󩎃\u0AC4。ς\u200D𐹮𑈵; [B5 C2 P1 V6]; [B5 P1 V6] # ૄ.ς𐹮𑈵 -N; 󩎃\u0AC4。ς\u200D𐹮𑈵; [B5 C2 P1 V6]; [B5 C2 P1 V6] # ૄ.ς𐹮𑈵 -T; 󩎃\u0AC4。Σ\u200D𐹮𑈵; [B5 C2 P1 V6]; [B5 P1 V6] # ૄ.σ𐹮𑈵 -N; 󩎃\u0AC4。Σ\u200D𐹮𑈵; [B5 C2 P1 V6]; [B5 C2 P1 V6] # ૄ.σ𐹮𑈵 -T; 󩎃\u0AC4。σ\u200D𐹮𑈵; [B5 C2 P1 V6]; [B5 P1 V6] # ૄ.σ𐹮𑈵 -N; 󩎃\u0AC4。σ\u200D𐹮𑈵; [B5 C2 P1 V6]; [B5 C2 P1 V6] # ૄ.σ𐹮𑈵 -B; xn--dfc53161q.xn--4xa8467k5mc; [B5 V6]; [B5 V6] # ૄ.σ𐹮𑈵 -B; xn--dfc53161q.xn--4xa895lzo7nsfd; [B5 C2 V6]; [B5 C2 V6] # ૄ.σ𐹮𑈵 -B; xn--dfc53161q.xn--3xa006lzo7nsfd; [B5 C2 V6]; [B5 C2 V6] # ૄ.ς𐹮𑈵 -B; 𐫀ᡂ𑜫.𑘿; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] -B; 𐫀ᡂ𑜫.𑘿; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] -B; xn--17e9625js1h.xn--sb2d; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] -T; 󬚶󸋖򖩰-。\u200C; [C1 P1 V3 V6]; [P1 V3 V6] # -. -N; 󬚶󸋖򖩰-。\u200C; [C1 P1 V3 V6]; [C1 P1 V3 V6] # -. -B; xn----7i12hu122k9ire.; [V3 V6]; [V3 V6] -B; xn----7i12hu122k9ire.xn--0ug; [C1 V3 V6]; [C1 V3 V6] # -. -B; 𐹣.\u07C2; [B1]; [B1] # 𐹣.߂ -B; 𐹣.\u07C2; [B1]; [B1] # 𐹣.߂ -B; xn--bo0d.xn--dsb; [B1]; [B1] # 𐹣.߂ -B; -\u07E1。Ↄ; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ߡ.Ↄ -B; -\u07E1。Ↄ; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ߡ.Ↄ -B; -\u07E1。ↄ; [B1 V3]; [B1 V3] # -ߡ.ↄ -B; xn----8cd.xn--r5g; [B1 V3]; [B1 V3] # -ߡ.ↄ -B; xn----8cd.xn--q5g; [B1 V3 V6]; [B1 V3 V6] # -ߡ.Ↄ -B; -\u07E1。ↄ; [B1 V3]; [B1 V3] # -ߡ.ↄ -T; \u200D-︒󠄄。ß哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 P1 V3 V6] # -︒.ß哑 -N; \u200D-︒󠄄。ß哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 C1 C2 P1 V6] # -︒.ß哑 -T; \u200D-。󠄄。ß哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2]; [B1 B5 B6 P1 V3 V6 A4_2] # -..ß哑 -N; \u200D-。󠄄。ß哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2]; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2] # -..ß哑 -T; \u200D-。󠄄。SS哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2]; [B1 B5 B6 P1 V3 V6 A4_2] # -..ss哑 -N; \u200D-。󠄄。SS哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2]; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2] # -..ss哑 -T; \u200D-。󠄄。ss哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2]; [B1 B5 B6 P1 V3 V6 A4_2] # -..ss哑 -N; \u200D-。󠄄。ss哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2]; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2] # -..ss哑 -T; \u200D-。󠄄。Ss哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2]; [B1 B5 B6 P1 V3 V6 A4_2] # -..ss哑 -N; \u200D-。󠄄。Ss哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2]; [B1 B5 B6 C1 C2 P1 V3 V6 A4_2] # -..ss哑 -B; -..xn--ss-h46c5711e; [B1 B5 B6 V3 V6 A4_2]; [B1 B5 B6 V3 V6 A4_2] -B; xn----tgn..xn--ss-k1ts75zb8ym; [B1 B5 B6 C1 C2 V3 V6 A4_2]; [B1 B5 B6 C1 C2 V3 V6 A4_2] # -..ss哑 -B; xn----tgn..xn--zca670n5f0binyk; [B1 B5 B6 C1 C2 V3 V6 A4_2]; [B1 B5 B6 C1 C2 V3 V6 A4_2] # -..ß哑 -T; \u200D-︒󠄄。SS哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 P1 V3 V6] # -︒.ss哑 -N; \u200D-︒󠄄。SS哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 C1 C2 P1 V6] # -︒.ss哑 -T; \u200D-︒󠄄。ss哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 P1 V3 V6] # -︒.ss哑 -N; \u200D-︒󠄄。ss哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 C1 C2 P1 V6] # -︒.ss哑 -T; \u200D-︒󠄄。Ss哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 P1 V3 V6] # -︒.ss哑 -N; \u200D-︒󠄄。Ss哑\u200C𐵿; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 C1 C2 P1 V6] # -︒.ss哑 -B; xn----o89h.xn--ss-h46c5711e; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] -B; xn----tgnt341h.xn--ss-k1ts75zb8ym; [B1 B5 B6 C1 C2 V6]; [B1 B5 B6 C1 C2 V6] # -︒.ss哑 -B; xn----tgnt341h.xn--zca670n5f0binyk; [B1 B5 B6 C1 C2 V6]; [B1 B5 B6 C1 C2 V6] # -︒.ß哑 -B; ︒.\uFE2F𑑂; [P1 V5 V6]; [P1 V5 V6] # ︒.𑑂︯ -B; ︒.𑑂\uFE2F; [P1 V5 V6]; [P1 V5 V6] # ︒.𑑂︯ -B; 。.𑑂\uFE2F; [V5 A4_2]; [V5 A4_2] # ..𑑂︯ -B; ..xn--s96cu30b; [V5 A4_2]; [V5 A4_2] # ..𑑂︯ -B; xn--y86c.xn--s96cu30b; [V5 V6]; [V5 V6] # ︒.𑑂︯ -T; \uA92C。\u200D; [C2 V5]; [V5] # ꤬. -N; \uA92C。\u200D; [C2 V5]; [C2 V5] # ꤬. -B; xn--zi9a.; [V5]; [V5] # ꤬. -B; xn--zi9a.xn--1ug; [C2 V5]; [C2 V5] # ꤬. -T; \u200D󠸡。\uFCD7; [B1 C2 P1 V6]; [B1 P1 V6] # .هج -N; \u200D󠸡。\uFCD7; [B1 C2 P1 V6]; [B1 C2 P1 V6] # .هج -T; \u200D󠸡。\u0647\u062C; [B1 C2 P1 V6]; [B1 P1 V6] # .هج -N; \u200D󠸡。\u0647\u062C; [B1 C2 P1 V6]; [B1 C2 P1 V6] # .هج -B; xn--d356e.xn--rgb7c; [B1 V6]; [B1 V6] # .هج -B; xn--1ug80651l.xn--rgb7c; [B1 C2 V6]; [B1 C2 V6] # .هج -T; -Ⴄ𝟢\u0663.𑍴ς; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -Ⴄ0٣.𑍴ς -N; -Ⴄ𝟢\u0663.𑍴ς; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -Ⴄ0٣.𑍴ς -T; -Ⴄ0\u0663.𑍴ς; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -Ⴄ0٣.𑍴ς -N; -Ⴄ0\u0663.𑍴ς; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -Ⴄ0٣.𑍴ς -T; -ⴄ0\u0663.𑍴ς; [B1 V3 V5]; [B1 V3 V5] # -ⴄ0٣.𑍴ς -N; -ⴄ0\u0663.𑍴ς; [B1 V3 V5]; [B1 V3 V5] # -ⴄ0٣.𑍴ς -B; -Ⴄ0\u0663.𑍴Σ; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -Ⴄ0٣.𑍴σ -B; -ⴄ0\u0663.𑍴σ; [B1 V3 V5]; [B1 V3 V5] # -ⴄ0٣.𑍴σ -B; xn---0-iyd8660b.xn--4xa9120l; [B1 V3 V5]; [B1 V3 V5] # -ⴄ0٣.𑍴σ -B; xn---0-iyd216h.xn--4xa9120l; [B1 V3 V5 V6]; [B1 V3 V5 V6] # -Ⴄ0٣.𑍴σ -B; xn---0-iyd8660b.xn--3xa1220l; [B1 V3 V5]; [B1 V3 V5] # -ⴄ0٣.𑍴ς -B; xn---0-iyd216h.xn--3xa1220l; [B1 V3 V5 V6]; [B1 V3 V5 V6] # -Ⴄ0٣.𑍴ς -T; -ⴄ𝟢\u0663.𑍴ς; [B1 V3 V5]; [B1 V3 V5] # -ⴄ0٣.𑍴ς -N; -ⴄ𝟢\u0663.𑍴ς; [B1 V3 V5]; [B1 V3 V5] # -ⴄ0٣.𑍴ς -B; -Ⴄ𝟢\u0663.𑍴Σ; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -Ⴄ0٣.𑍴σ -B; -ⴄ𝟢\u0663.𑍴σ; [B1 V3 V5]; [B1 V3 V5] # -ⴄ0٣.𑍴σ -B; 󦈄。-; [P1 V3 V6]; [P1 V3 V6] -B; xn--xm38e.-; [V3 V6]; [V3 V6] -T; ⋠𐋮.򶈮\u0F18ß≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ß≯ -N; ⋠𐋮.򶈮\u0F18ß≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ß≯ -T; ≼\u0338𐋮.򶈮\u0F18ß>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ß≯ -N; ≼\u0338𐋮.򶈮\u0F18ß>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ß≯ -T; ⋠𐋮.򶈮\u0F18ß≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ß≯ -N; ⋠𐋮.򶈮\u0F18ß≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ß≯ -T; ≼\u0338𐋮.򶈮\u0F18ß>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ß≯ -N; ≼\u0338𐋮.򶈮\u0F18ß>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ß≯ -B; ≼\u0338𐋮.򶈮\u0F18SS>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ⋠𐋮.򶈮\u0F18SS≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ⋠𐋮.򶈮\u0F18ss≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ≼\u0338𐋮.򶈮\u0F18ss>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ≼\u0338𐋮.򶈮\u0F18Ss>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ⋠𐋮.򶈮\u0F18Ss≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; xn--pgh4639f.xn--ss-ifj426nle504a; [V6]; [V6] # ⋠𐋮.༘ss≯ -B; xn--pgh4639f.xn--zca593eo6oc013y; [V6]; [V6] # ⋠𐋮.༘ß≯ -B; ≼\u0338𐋮.򶈮\u0F18SS>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ⋠𐋮.򶈮\u0F18SS≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ⋠𐋮.򶈮\u0F18ss≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ≼\u0338𐋮.򶈮\u0F18ss>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ≼\u0338𐋮.򶈮\u0F18Ss>\u0338; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; ⋠𐋮.򶈮\u0F18Ss≯; [P1 V6]; [P1 V6] # ⋠𐋮.༘ss≯ -B; 1𐋸\u0664。󠢮\uFBA4񷝊; [B1 P1 V6]; [B1 P1 V6] # 1𐋸٤.ۀ -B; 1𐋸\u0664。󠢮\u06C0񷝊; [B1 P1 V6]; [B1 P1 V6] # 1𐋸٤.ۀ -B; 1𐋸\u0664。󠢮\u06D5\u0654񷝊; [B1 P1 V6]; [B1 P1 V6] # 1𐋸٤.ۀ -B; xn--1-hqc3905q.xn--zkb83268gqee4a; [B1 V6]; [B1 V6] # 1𐋸٤.ۀ -T; 儭-。𐹴Ⴢ񥳠\u200C; [B1 B6 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # 儭-.𐹴Ⴢ -N; 儭-。𐹴Ⴢ񥳠\u200C; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # 儭-.𐹴Ⴢ -T; 儭-。𐹴Ⴢ񥳠\u200C; [B1 B6 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # 儭-.𐹴Ⴢ -N; 儭-。𐹴Ⴢ񥳠\u200C; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # 儭-.𐹴Ⴢ -T; 儭-。𐹴ⴢ񥳠\u200C; [B1 B6 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # 儭-.𐹴ⴢ -N; 儭-。𐹴ⴢ񥳠\u200C; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # 儭-.𐹴ⴢ -B; xn----gz7a.xn--qlj9223eywx0b; [B1 B6 V3 V6]; [B1 B6 V3 V6] -B; xn----gz7a.xn--0ug472cfq0pus98b; [B1 B6 C1 V3 V6]; [B1 B6 C1 V3 V6] # 儭-.𐹴ⴢ -B; xn----gz7a.xn--6nd5001kyw98a; [B1 B6 V3 V6]; [B1 B6 V3 V6] -B; xn----gz7a.xn--6nd249ejl4pusr7b; [B1 B6 C1 V3 V6]; [B1 B6 C1 V3 V6] # 儭-.𐹴Ⴢ -T; 儭-。𐹴ⴢ񥳠\u200C; [B1 B6 C1 P1 V3 V6]; [B1 B6 P1 V3 V6] # 儭-.𐹴ⴢ -N; 儭-。𐹴ⴢ񥳠\u200C; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # 儭-.𐹴ⴢ -B; 𝟺𐋷\u06B9.𞤭򿍡; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # 4𐋷ڹ.𞤭 -B; 4𐋷\u06B9.𞤭򿍡; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # 4𐋷ڹ.𞤭 -B; 4𐋷\u06B9.𞤋򿍡; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # 4𐋷ڹ.𞤭 -B; xn--4-cvc5384q.xn--le6hi7322b; [B1 B2 B3 V6]; [B1 B2 B3 V6] # 4𐋷ڹ.𞤭 -B; 𝟺𐋷\u06B9.𞤋򿍡; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # 4𐋷ڹ.𞤭 -B; ≯-ꡋ𑲣.⒈𐹭; [B1 P1 V6]; [B1 P1 V6] -B; >\u0338-ꡋ𑲣.⒈𐹭; [B1 P1 V6]; [B1 P1 V6] -B; ≯-ꡋ𑲣.1.𐹭; [B1 P1 V6]; [B1 P1 V6] -B; >\u0338-ꡋ𑲣.1.𐹭; [B1 P1 V6]; [B1 P1 V6] -B; xn----ogox061d5i8d.1.xn--lo0d; [B1 V6]; [B1 V6] -B; xn----ogox061d5i8d.xn--tsh0666f; [B1 V6]; [B1 V6] -B; \u0330.󰜱蚀; [P1 V5 V6]; [P1 V5 V6] # ̰.蚀 -B; \u0330.󰜱蚀; [P1 V5 V6]; [P1 V5 V6] # ̰.蚀 -B; xn--xta.xn--e91aw9417e; [V5 V6]; [V5 V6] # ̰.蚀 -T; \uFB39Ⴘ.𞡼𑇀ß\u20D7; [B2 B3 P1 V6]; [B2 B3 P1 V6] # יּႸ.𞡼𑇀ß⃗ -N; \uFB39Ⴘ.𞡼𑇀ß\u20D7; [B2 B3 P1 V6]; [B2 B3 P1 V6] # יּႸ.𞡼𑇀ß⃗ -T; \u05D9\u05BCႸ.𞡼𑇀ß\u20D7; [B2 B3 P1 V6]; [B2 B3 P1 V6] # יּႸ.𞡼𑇀ß⃗ -N; \u05D9\u05BCႸ.𞡼𑇀ß\u20D7; [B2 B3 P1 V6]; [B2 B3 P1 V6] # יּႸ.𞡼𑇀ß⃗ -T; \u05D9\u05BCⴘ.𞡼𑇀ß\u20D7; [B2 B3]; [B2 B3] # יּⴘ.𞡼𑇀ß⃗ -N; \u05D9\u05BCⴘ.𞡼𑇀ß\u20D7; [B2 B3]; [B2 B3] # יּⴘ.𞡼𑇀ß⃗ -B; \u05D9\u05BCႸ.𞡼𑇀SS\u20D7; [B2 B3 P1 V6]; [B2 B3 P1 V6] # יּႸ.𞡼𑇀ss⃗ -B; \u05D9\u05BCⴘ.𞡼𑇀ss\u20D7; [B2 B3]; [B2 B3] # יּⴘ.𞡼𑇀ss⃗ -B; \u05D9\u05BCႸ.𞡼𑇀ss\u20D7; [B2 B3 P1 V6]; [B2 B3 P1 V6] # יּႸ.𞡼𑇀ss⃗ -B; xn--kdb1d867b.xn--ss-yju5690ken9h; [B2 B3 V6]; [B2 B3 V6] # יּႸ.𞡼𑇀ss⃗ -B; xn--kdb1d278n.xn--ss-yju5690ken9h; [B2 B3]; [B2 B3] # יּⴘ.𞡼𑇀ss⃗ -B; xn--kdb1d278n.xn--zca284nhg9nrrxg; [B2 B3]; [B2 B3] # יּⴘ.𞡼𑇀ß⃗ -B; xn--kdb1d867b.xn--zca284nhg9nrrxg; [B2 B3 V6]; [B2 B3 V6] # יּႸ.𞡼𑇀ß⃗ -T; \uFB39ⴘ.𞡼𑇀ß\u20D7; [B2 B3]; [B2 B3] # יּⴘ.𞡼𑇀ß⃗ -N; \uFB39ⴘ.𞡼𑇀ß\u20D7; [B2 B3]; [B2 B3] # יּⴘ.𞡼𑇀ß⃗ -B; \uFB39Ⴘ.𞡼𑇀SS\u20D7; [B2 B3 P1 V6]; [B2 B3 P1 V6] # יּႸ.𞡼𑇀ss⃗ -B; \uFB39ⴘ.𞡼𑇀ss\u20D7; [B2 B3]; [B2 B3] # יּⴘ.𞡼𑇀ss⃗ -B; \uFB39Ⴘ.𞡼𑇀ss\u20D7; [B2 B3 P1 V6]; [B2 B3 P1 V6] # יּႸ.𞡼𑇀ss⃗ -B; \u1BA3𐹰򁱓。凬; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ᮣ𐹰.凬 -B; \u1BA3𐹰򁱓。凬; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ᮣ𐹰.凬 -B; xn--rxfz314ilg20c.xn--t9q; [B1 V5 V6]; [B1 V5 V6] # ᮣ𐹰.凬 -T; 🢟🄈\u200Dꡎ。\u0F84; [C2 P1 V5 V6]; [P1 V5 V6] # 🢟🄈ꡎ.྄ -N; 🢟🄈\u200Dꡎ。\u0F84; [C2 P1 V5 V6]; [C2 P1 V5 V6] # 🢟🄈ꡎ.྄ -T; 🢟7,\u200Dꡎ。\u0F84; [C2 P1 V5 V6]; [P1 V5 V6] # 🢟7,ꡎ.྄ -N; 🢟7,\u200Dꡎ。\u0F84; [C2 P1 V5 V6]; [C2 P1 V5 V6] # 🢟7,ꡎ.྄ -B; xn--7,-gh9hg322i.xn--3ed; [P1 V5 V6]; [P1 V5 V6] # 🢟7,ꡎ.྄ -B; xn--7,-n1t0654eqo3o.xn--3ed; [C2 P1 V5 V6]; [C2 P1 V5 V6] # 🢟7,ꡎ.྄ -B; xn--nc9aq743ds0e.xn--3ed; [V5 V6]; [V5 V6] # 🢟🄈ꡎ.྄ -B; xn--1ug4874cfd0kbmg.xn--3ed; [C2 V5 V6]; [C2 V5 V6] # 🢟🄈ꡎ.྄ -B; ꡔ。\u1039ᢇ; [V5]; [V5] # ꡔ.္ᢇ -B; xn--tc9a.xn--9jd663b; [V5]; [V5] # ꡔ.္ᢇ -B; \u20EB≮.𝨖; [P1 V5 V6]; [P1 V5 V6] # ⃫≮.𝨖 -B; \u20EB<\u0338.𝨖; [P1 V5 V6]; [P1 V5 V6] # ⃫≮.𝨖 -B; xn--e1g71d.xn--772h; [V5 V6]; [V5 V6] # ⃫≮.𝨖 -B; Ⴢ≯褦.ᠪ\u07EAႾ\u0767; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴢ≯褦.ᠪߪႾݧ -B; Ⴢ>\u0338褦.ᠪ\u07EAႾ\u0767; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴢ≯褦.ᠪߪႾݧ -B; Ⴢ≯褦.ᠪ\u07EAႾ\u0767; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴢ≯褦.ᠪߪႾݧ -B; Ⴢ>\u0338褦.ᠪ\u07EAႾ\u0767; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴢ≯褦.ᠪߪႾݧ -B; ⴢ>\u0338褦.ᠪ\u07EAⴞ\u0767; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ⴢ≯褦.ᠪߪⴞݧ -B; ⴢ≯褦.ᠪ\u07EAⴞ\u0767; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ⴢ≯褦.ᠪߪⴞݧ -B; xn--hdh433bev8e.xn--rpb5x392bcyt; [B5 B6 V6]; [B5 B6 V6] # ⴢ≯褦.ᠪߪⴞݧ -B; xn--6nd461g478e.xn--rpb5x49td2h; [B5 B6 V6]; [B5 B6 V6] # Ⴢ≯褦.ᠪߪႾݧ -B; ⴢ>\u0338褦.ᠪ\u07EAⴞ\u0767; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ⴢ≯褦.ᠪߪⴞݧ -B; ⴢ≯褦.ᠪ\u07EAⴞ\u0767; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ⴢ≯褦.ᠪߪⴞݧ -T; 򊉆󠆒\u200C\uA953。𞤙\u067Bꡘ; [B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # ꥓.𞤻ٻꡘ -N; 򊉆󠆒\u200C\uA953。𞤙\u067Bꡘ; [B2 B3 C1 P1 V6]; [B2 B3 C1 P1 V6] # ꥓.𞤻ٻꡘ -T; 򊉆󠆒\u200C\uA953。𞤻\u067Bꡘ; [B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # ꥓.𞤻ٻꡘ -N; 򊉆󠆒\u200C\uA953。𞤻\u067Bꡘ; [B2 B3 C1 P1 V6]; [B2 B3 C1 P1 V6] # ꥓.𞤻ٻꡘ -B; xn--3j9al6189a.xn--0ib8893fegvj; [B2 B3 V6]; [B2 B3 V6] # ꥓.𞤻ٻꡘ -B; xn--0ug8815chtz0e.xn--0ib8893fegvj; [B2 B3 C1 V6]; [B2 B3 C1 V6] # ꥓.𞤻ٻꡘ -T; \u200C.≯; [C1 P1 V6]; [P1 V6 A4_2] # .≯ -N; \u200C.≯; [C1 P1 V6]; [C1 P1 V6] # .≯ -T; \u200C.>\u0338; [C1 P1 V6]; [P1 V6 A4_2] # .≯ -N; \u200C.>\u0338; [C1 P1 V6]; [C1 P1 V6] # .≯ -B; .xn--hdh; [V6 A4_2]; [V6 A4_2] -B; xn--0ug.xn--hdh; [C1 V6]; [C1 V6] # .≯ -B; 𰅧񣩠-.\uABED-悜; [P1 V3 V5 V6]; [P1 V3 V5 V6] # -.꯭-悜 -B; 𰅧񣩠-.\uABED-悜; [P1 V3 V5 V6]; [P1 V3 V5 V6] # -.꯭-悜 -B; xn----7m53aj640l.xn----8f4br83t; [V3 V5 V6]; [V3 V5 V6] # -.꯭-悜 -T; ᡉ𶓧⬞ᢜ.-\u200D𞣑\u202E; [C2 P1 V3 V6]; [P1 V3 V6] # ᡉ⬞ᢜ.-𞣑 -N; ᡉ𶓧⬞ᢜ.-\u200D𞣑\u202E; [C2 P1 V3 V6]; [C2 P1 V3 V6] # ᡉ⬞ᢜ.-𞣑 -B; xn--87e0ol04cdl39e.xn----qinu247r; [V3 V6]; [V3 V6] # ᡉ⬞ᢜ.-𞣑 -B; xn--87e0ol04cdl39e.xn----ugn5e3763s; [C2 V3 V6]; [C2 V3 V6] # ᡉ⬞ᢜ.-𞣑 -T; ⒐\u200C衃Ⴝ.\u0682Ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # ⒐衃Ⴝ.ڂႴ -N; ⒐\u200C衃Ⴝ.\u0682Ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # ⒐衃Ⴝ.ڂႴ -T; 9.\u200C衃Ⴝ.\u0682Ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # 9.衃Ⴝ.ڂႴ -N; 9.\u200C衃Ⴝ.\u0682Ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # 9.衃Ⴝ.ڂႴ -T; 9.\u200C衃ⴝ.\u0682ⴔ; [B1 B2 B3 C1]; [B1 B2 B3] # 9.衃ⴝ.ڂⴔ -N; 9.\u200C衃ⴝ.\u0682ⴔ; [B1 B2 B3 C1]; [B1 B2 B3 C1] # 9.衃ⴝ.ڂⴔ -T; 9.\u200C衃Ⴝ.\u0682ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # 9.衃Ⴝ.ڂⴔ -N; 9.\u200C衃Ⴝ.\u0682ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # 9.衃Ⴝ.ڂⴔ -B; 9.xn--1nd9032d.xn--7ib268q; [B1 B2 B3 V6]; [B1 B2 B3 V6] # 9.衃Ⴝ.ڂⴔ -B; 9.xn--1nd159e1y2f.xn--7ib268q; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # 9.衃Ⴝ.ڂⴔ -B; 9.xn--llj1920a.xn--7ib268q; [B1 B2 B3]; [B1 B2 B3] # 9.衃ⴝ.ڂⴔ -B; 9.xn--0ug862cbm5e.xn--7ib268q; [B1 B2 B3 C1]; [B1 B2 B3 C1] # 9.衃ⴝ.ڂⴔ -B; 9.xn--1nd9032d.xn--7ib433c; [B1 B2 B3 V6]; [B1 B2 B3 V6] # 9.衃Ⴝ.ڂႴ -B; 9.xn--1nd159e1y2f.xn--7ib433c; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # 9.衃Ⴝ.ڂႴ -T; ⒐\u200C衃ⴝ.\u0682ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # ⒐衃ⴝ.ڂⴔ -N; ⒐\u200C衃ⴝ.\u0682ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # ⒐衃ⴝ.ڂⴔ -T; ⒐\u200C衃Ⴝ.\u0682ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 P1 V6] # ⒐衃Ⴝ.ڂⴔ -N; ⒐\u200C衃Ⴝ.\u0682ⴔ; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # ⒐衃Ⴝ.ڂⴔ -B; xn--1nd362hy16e.xn--7ib268q; [B1 B2 B3 V6]; [B1 B2 B3 V6] # ⒐衃Ⴝ.ڂⴔ -B; xn--1nd159ecmd785k.xn--7ib268q; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # ⒐衃Ⴝ.ڂⴔ -B; xn--1shy52abz3f.xn--7ib268q; [B1 B2 B3 V6]; [B1 B2 B3 V6] # ⒐衃ⴝ.ڂⴔ -B; xn--0ugx0px1izu2h.xn--7ib268q; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # ⒐衃ⴝ.ڂⴔ -B; xn--1nd362hy16e.xn--7ib433c; [B1 B2 B3 V6]; [B1 B2 B3 V6] # ⒐衃Ⴝ.ڂႴ -B; xn--1nd159ecmd785k.xn--7ib433c; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # ⒐衃Ⴝ.ڂႴ -T; \u07E1\u200C。--⸬; [B1 B3 C1 V3]; [B1 V3] # ߡ.--⸬ -N; \u07E1\u200C。--⸬; [B1 B3 C1 V3]; [B1 B3 C1 V3] # ߡ.--⸬ -B; xn--8sb.xn-----iw2a; [B1 V3]; [B1 V3] # ߡ.--⸬ -B; xn--8sb884j.xn-----iw2a; [B1 B3 C1 V3]; [B1 B3 C1 V3] # ߡ.--⸬ -B; 𞥓.\u0718; 𞥓.\u0718; xn--of6h.xn--inb # 𞥓.ܘ -B; 𞥓.\u0718; ; xn--of6h.xn--inb # 𞥓.ܘ -B; xn--of6h.xn--inb; 𞥓.\u0718; xn--of6h.xn--inb # 𞥓.ܘ -B; 󠄽-.-\u0DCA; [V3]; [V3] # -.-් -B; 󠄽-.-\u0DCA; [V3]; [V3] # -.-් -B; -.xn----ptf; [V3]; [V3] # -.-් -B; 󠇝\u075B-.\u1927; [B1 B3 B6 V3 V5]; [B1 B3 B6 V3 V5] # ݛ-.ᤧ -B; xn----k4c.xn--lff; [B1 B3 B6 V3 V5]; [B1 B3 B6 V3 V5] # ݛ-.ᤧ -B; 𞤴󠆹⦉𐹺.\uA806⒌󘤸; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤴⦉𐹺.꠆⒌ -B; 𞤴󠆹⦉𐹺.\uA8065.󘤸; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤴⦉𐹺.꠆5. -B; 𞤒󠆹⦉𐹺.\uA8065.󘤸; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤴⦉𐹺.꠆5. -B; xn--fuix729epewf.xn--5-w93e.xn--7b83e; [B1 V5 V6]; [B1 V5 V6] # 𞤴⦉𐹺.꠆5. -B; 𞤒󠆹⦉𐹺.\uA806⒌󘤸; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤴⦉𐹺.꠆⒌ -B; xn--fuix729epewf.xn--xsh5029b6e77i; [B1 V5 V6]; [B1 V5 V6] # 𞤴⦉𐹺.꠆⒌ -T; 󠄸₀。𑖿\u200C𐦂\u200D; [B1 C2 V5]; [B1 V5] # 0.𑖿𐦂 -N; 󠄸₀。𑖿\u200C𐦂\u200D; [B1 C2 V5]; [B1 C2 V5] # 0.𑖿𐦂 -T; 󠄸0。𑖿\u200C𐦂\u200D; [B1 C2 V5]; [B1 V5] # 0.𑖿𐦂 -N; 󠄸0。𑖿\u200C𐦂\u200D; [B1 C2 V5]; [B1 C2 V5] # 0.𑖿𐦂 -B; 0.xn--mn9cz2s; [B1 V5]; [B1 V5] -B; 0.xn--0ugc8040p9hk; [B1 C2 V5]; [B1 C2 V5] # 0.𑖿𐦂 -B; Ⴚ𐋸󠄄。𝟝ퟶ\u103A; [P1 V6]; [P1 V6] # Ⴚ𐋸.5ퟶ် -B; Ⴚ𐋸󠄄。5ퟶ\u103A; [P1 V6]; [P1 V6] # Ⴚ𐋸.5ퟶ် -B; ⴚ𐋸󠄄。5ퟶ\u103A; ⴚ𐋸.5ퟶ\u103A; xn--ilj2659d.xn--5-dug9054m; NV8 # ⴚ𐋸.5ퟶ် -B; xn--ilj2659d.xn--5-dug9054m; ⴚ𐋸.5ퟶ\u103A; xn--ilj2659d.xn--5-dug9054m; NV8 # ⴚ𐋸.5ퟶ် -B; ⴚ𐋸.5ퟶ\u103A; ; xn--ilj2659d.xn--5-dug9054m; NV8 # ⴚ𐋸.5ퟶ် -B; Ⴚ𐋸.5ퟶ\u103A; [P1 V6]; [P1 V6] # Ⴚ𐋸.5ퟶ် -B; xn--ynd2415j.xn--5-dug9054m; [V6]; [V6] # Ⴚ𐋸.5ퟶ် -B; ⴚ𐋸󠄄。𝟝ퟶ\u103A; ⴚ𐋸.5ퟶ\u103A; xn--ilj2659d.xn--5-dug9054m; NV8 # ⴚ𐋸.5ퟶ် -T; \u200D-ᠹ﹪.\u1DE1\u1922; [C2 P1 V5 V6]; [P1 V3 V5 V6] # -ᠹ﹪.ᷡᤢ -N; \u200D-ᠹ﹪.\u1DE1\u1922; [C2 P1 V5 V6]; [C2 P1 V5 V6] # -ᠹ﹪.ᷡᤢ -T; \u200D-ᠹ%.\u1DE1\u1922; [C2 P1 V5 V6]; [P1 V3 V5 V6] # -ᠹ%.ᷡᤢ -N; \u200D-ᠹ%.\u1DE1\u1922; [C2 P1 V5 V6]; [C2 P1 V5 V6] # -ᠹ%.ᷡᤢ -B; xn---%-u4o.xn--gff52t; [P1 V3 V5 V6]; [P1 V3 V5 V6] # -ᠹ%.ᷡᤢ -B; xn---%-u4oy48b.xn--gff52t; [C2 P1 V5 V6]; [C2 P1 V5 V6] # -ᠹ%.ᷡᤢ -B; xn----c6jx047j.xn--gff52t; [V3 V5 V6]; [V3 V5 V6] # -ᠹ﹪.ᷡᤢ -B; xn----c6j614b1z4v.xn--gff52t; [C2 V5 V6]; [C2 V5 V6] # -ᠹ﹪.ᷡᤢ -B; ≠.ᠿ; [P1 V6]; [P1 V6] -B; =\u0338.ᠿ; [P1 V6]; [P1 V6] -B; xn--1ch.xn--y7e; [V6]; [V6] -B; \u0723\u05A3。㌪; \u0723\u05A3.ハイツ; xn--ucb18e.xn--eck4c5a # ܣ֣.ハイツ -B; \u0723\u05A3。ハイツ; \u0723\u05A3.ハイツ; xn--ucb18e.xn--eck4c5a # ܣ֣.ハイツ -B; xn--ucb18e.xn--eck4c5a; \u0723\u05A3.ハイツ; xn--ucb18e.xn--eck4c5a # ܣ֣.ハイツ -B; \u0723\u05A3.ハイツ; ; xn--ucb18e.xn--eck4c5a # ܣ֣.ハイツ -B; 𞷥󠆀≮.\u2D7F-; [B1 B3 P1 V3 V5 V6]; [B1 B3 P1 V3 V5 V6] # ≮.⵿- -B; 𞷥󠆀<\u0338.\u2D7F-; [B1 B3 P1 V3 V5 V6]; [B1 B3 P1 V3 V5 V6] # ≮.⵿- -B; xn--gdhx802p.xn----i2s; [B1 B3 V3 V5 V6]; [B1 B3 V3 V5 V6] # ≮.⵿- -B; ₆榎򦖎\u0D4D。𞤅\u06ED\uFC5A󠮨; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 6榎്.𞤧ۭيي -B; 6榎򦖎\u0D4D。𞤅\u06ED\u064A\u064A󠮨; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 6榎്.𞤧ۭيي -B; 6榎򦖎\u0D4D。𞤧\u06ED\u064A\u064A󠮨; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 6榎്.𞤧ۭيي -B; xn--6-kmf4691ejv41j.xn--mhba10ch545mn8v8h; [B1 B3 V6]; [B1 B3 V6] # 6榎്.𞤧ۭيي -B; ₆榎򦖎\u0D4D。𞤧\u06ED\uFC5A󠮨; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 6榎്.𞤧ۭيي -B; 𣩫.򌑲; [P1 V6]; [P1 V6] -B; 𣩫.򌑲; [P1 V6]; [P1 V6] -B; xn--td3j.xn--4628b; [V6]; [V6] -T; \u200D︒。\u06B9\u200C; [B1 B3 C1 C2 P1 V6]; [B1 P1 V6] # ︒.ڹ -N; \u200D︒。\u06B9\u200C; [B1 B3 C1 C2 P1 V6]; [B1 B3 C1 C2 P1 V6] # ︒.ڹ -B; xn--y86c.xn--skb; [B1 V6]; [B1 V6] # ︒.ڹ -B; xn--1ug2658f.xn--skb080k; [B1 B3 C1 C2 V6]; [B1 B3 C1 C2 V6] # ︒.ڹ -B; xn--skb; \u06B9; xn--skb # ڹ -B; \u06B9; ; xn--skb # ڹ -T; 𐹦\u200C𐹶。\u206D; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹦𐹶. -N; 𐹦\u200C𐹶。\u206D; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹦𐹶. -B; xn--eo0d6a.xn--sxg; [B1 V6]; [B1 V6] # 𐹦𐹶. -B; xn--0ug4994goba.xn--sxg; [B1 C1 V6]; [B1 C1 V6] # 𐹦𐹶. -B; \u0C4D𝨾\u05A9𝟭。-𑜨; [V3 V5]; [V3 V5] # ్𝨾֩1.-𑜨 -B; \u0C4D𝨾\u05A91。-𑜨; [V3 V5]; [V3 V5] # ్𝨾֩1.-𑜨 -B; xn--1-rfc312cdp45c.xn----nq0j; [V3 V5]; [V3 V5] # ్𝨾֩1.-𑜨 -B; 򣿈。뙏; [P1 V6]; [P1 V6] -B; 򣿈。뙏; [P1 V6]; [P1 V6] -B; xn--ph26c.xn--281b; [V6]; [V6] -B; 񕨚󠄌󑽀ᡀ.\u08B6; [P1 V6]; [P1 V6] # ᡀ.ࢶ -B; xn--z7e98100evc01b.xn--czb; [V6]; [V6] # ᡀ.ࢶ -T; \u200D。񅁛; [C2 P1 V6]; [P1 V6 A4_2] # . -N; \u200D。񅁛; [C2 P1 V6]; [C2 P1 V6] # . -T; \u200D。񅁛; [C2 P1 V6]; [P1 V6 A4_2] # . -N; \u200D。񅁛; [C2 P1 V6]; [C2 P1 V6] # . -B; .xn--6x4u; [V6 A4_2]; [V6 A4_2] -B; xn--1ug.xn--6x4u; [C2 V6]; [C2 V6] # . -B; \u084B皥.-; [B1 B2 B3 V3]; [B1 B2 B3 V3] # ࡋ皥.- -B; \u084B皥.-; [B1 B2 B3 V3]; [B1 B2 B3 V3] # ࡋ皥.- -B; xn--9vb4167c.-; [B1 B2 B3 V3]; [B1 B2 B3 V3] # ࡋ皥.- -B; 𐣸\u0315𐮇.⒈ꡦ; [B1 P1 V6]; [B1 P1 V6] # ̕𐮇.⒈ꡦ -B; 𐣸\u0315𐮇.1.ꡦ; [B1 P1 V6]; [B1 P1 V6] # ̕𐮇.1.ꡦ -B; xn--5sa9915kgvb.1.xn--cd9a; [B1 V6]; [B1 V6] # ̕𐮇.1.ꡦ -B; xn--5sa9915kgvb.xn--tshw539b; [B1 V6]; [B1 V6] # ̕𐮇.⒈ꡦ -T; Ⴛ\u200C\u05A2\u200D。\uFFA0ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # Ⴛ֢.ā𐹦 -N; Ⴛ\u200C\u05A2\u200D。\uFFA0ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # Ⴛ֢.ā𐹦 -T; Ⴛ\u200C\u05A2\u200D。\uFFA0a\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # Ⴛ֢.ā𐹦 -N; Ⴛ\u200C\u05A2\u200D。\uFFA0a\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # Ⴛ֢.ā𐹦 -T; Ⴛ\u200C\u05A2\u200D。\u1160ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # Ⴛ֢.ā𐹦 -N; Ⴛ\u200C\u05A2\u200D。\u1160ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # Ⴛ֢.ā𐹦 -T; Ⴛ\u200C\u05A2\u200D。\u1160a\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # Ⴛ֢.ā𐹦 -N; Ⴛ\u200C\u05A2\u200D。\u1160a\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # Ⴛ֢.ā𐹦 -T; ⴛ\u200C\u05A2\u200D。\u1160a\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # ⴛ֢.ā𐹦 -N; ⴛ\u200C\u05A2\u200D。\u1160a\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # ⴛ֢.ā𐹦 -T; ⴛ\u200C\u05A2\u200D。\u1160ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # ⴛ֢.ā𐹦 -N; ⴛ\u200C\u05A2\u200D。\u1160ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # ⴛ֢.ā𐹦 -T; Ⴛ\u200C\u05A2\u200D。\u1160Ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # Ⴛ֢.ā𐹦 -N; Ⴛ\u200C\u05A2\u200D。\u1160Ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # Ⴛ֢.ā𐹦 -T; Ⴛ\u200C\u05A2\u200D。\u1160A\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # Ⴛ֢.ā𐹦 -N; Ⴛ\u200C\u05A2\u200D。\u1160A\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # Ⴛ֢.ā𐹦 -B; xn--tcb597c.xn--yda594fdn5q; [B5 B6 V6]; [B5 B6 V6] # Ⴛ֢.ā𐹦 -B; xn--tcb597cdmmfa.xn--yda594fdn5q; [B5 B6 C1 C2 V6]; [B5 B6 C1 C2 V6] # Ⴛ֢.ā𐹦 -B; xn--tcb323r.xn--yda594fdn5q; [B5 B6 V6]; [B5 B6 V6] # ⴛ֢.ā𐹦 -B; xn--tcb736kea974k.xn--yda594fdn5q; [B5 B6 C1 C2 V6]; [B5 B6 C1 C2 V6] # ⴛ֢.ā𐹦 -T; ⴛ\u200C\u05A2\u200D。\uFFA0a\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # ⴛ֢.ā𐹦 -N; ⴛ\u200C\u05A2\u200D。\uFFA0a\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # ⴛ֢.ā𐹦 -T; ⴛ\u200C\u05A2\u200D。\uFFA0ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # ⴛ֢.ā𐹦 -N; ⴛ\u200C\u05A2\u200D。\uFFA0ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # ⴛ֢.ā𐹦 -T; Ⴛ\u200C\u05A2\u200D。\uFFA0Ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # Ⴛ֢.ā𐹦 -N; Ⴛ\u200C\u05A2\u200D。\uFFA0Ā𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # Ⴛ֢.ā𐹦 -T; Ⴛ\u200C\u05A2\u200D。\uFFA0A\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # Ⴛ֢.ā𐹦 -N; Ⴛ\u200C\u05A2\u200D。\uFFA0A\u0304𐹦; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # Ⴛ֢.ā𐹦 -B; xn--tcb597c.xn--yda9741khjj; [B5 B6 V6]; [B5 B6 V6] # Ⴛ֢.ā𐹦 -B; xn--tcb597cdmmfa.xn--yda9741khjj; [B5 B6 C1 C2 V6]; [B5 B6 C1 C2 V6] # Ⴛ֢.ā𐹦 -B; xn--tcb323r.xn--yda9741khjj; [B5 B6 V6]; [B5 B6 V6] # ⴛ֢.ā𐹦 -B; xn--tcb736kea974k.xn--yda9741khjj; [B5 B6 C1 C2 V6]; [B5 B6 C1 C2 V6] # ⴛ֢.ā𐹦 -T; \uFFF9\u200C。曳⾑𐋰≯; [C1 P1 V6]; [P1 V6] # .曳襾𐋰≯ -N; \uFFF9\u200C。曳⾑𐋰≯; [C1 P1 V6]; [C1 P1 V6] # .曳襾𐋰≯ -T; \uFFF9\u200C。曳⾑𐋰>\u0338; [C1 P1 V6]; [P1 V6] # .曳襾𐋰≯ -N; \uFFF9\u200C。曳⾑𐋰>\u0338; [C1 P1 V6]; [C1 P1 V6] # .曳襾𐋰≯ -T; \uFFF9\u200C。曳襾𐋰≯; [C1 P1 V6]; [P1 V6] # .曳襾𐋰≯ -N; \uFFF9\u200C。曳襾𐋰≯; [C1 P1 V6]; [C1 P1 V6] # .曳襾𐋰≯ -T; \uFFF9\u200C。曳襾𐋰>\u0338; [C1 P1 V6]; [P1 V6] # .曳襾𐋰≯ -N; \uFFF9\u200C。曳襾𐋰>\u0338; [C1 P1 V6]; [C1 P1 V6] # .曳襾𐋰≯ -B; xn--vn7c.xn--hdh501y8wvfs5h; [V6]; [V6] # .曳襾𐋰≯ -B; xn--0ug2139f.xn--hdh501y8wvfs5h; [C1 V6]; [C1 V6] # .曳襾𐋰≯ -T; ≯⒈。ß; [P1 V6]; [P1 V6] -N; ≯⒈。ß; [P1 V6]; [P1 V6] -T; >\u0338⒈。ß; [P1 V6]; [P1 V6] -N; >\u0338⒈。ß; [P1 V6]; [P1 V6] -T; ≯1.。ß; [P1 V6 A4_2]; [P1 V6 A4_2] -N; ≯1.。ß; [P1 V6 A4_2]; [P1 V6 A4_2] -T; >\u03381.。ß; [P1 V6 A4_2]; [P1 V6 A4_2] -N; >\u03381.。ß; [P1 V6 A4_2]; [P1 V6 A4_2] -B; >\u03381.。SS; [P1 V6 A4_2]; [P1 V6 A4_2] -B; ≯1.。SS; [P1 V6 A4_2]; [P1 V6 A4_2] -B; ≯1.。ss; [P1 V6 A4_2]; [P1 V6 A4_2] -B; >\u03381.。ss; [P1 V6 A4_2]; [P1 V6 A4_2] -B; >\u03381.。Ss; [P1 V6 A4_2]; [P1 V6 A4_2] -B; ≯1.。Ss; [P1 V6 A4_2]; [P1 V6 A4_2] -B; xn--1-ogo..ss; [V6 A4_2]; [V6 A4_2] -B; xn--1-ogo..xn--zca; [V6 A4_2]; [V6 A4_2] -B; >\u0338⒈。SS; [P1 V6]; [P1 V6] -B; ≯⒈。SS; [P1 V6]; [P1 V6] -B; ≯⒈。ss; [P1 V6]; [P1 V6] -B; >\u0338⒈。ss; [P1 V6]; [P1 V6] -B; >\u0338⒈。Ss; [P1 V6]; [P1 V6] -B; ≯⒈。Ss; [P1 V6]; [P1 V6] -B; xn--hdh84f.ss; [V6]; [V6] -B; xn--hdh84f.xn--zca; [V6]; [V6] -T; \u0667\u200D\uFB96。\u07DA-₆Ⴙ; [B1 B2 B3 C2 P1 V6]; [B1 B2 B3 P1 V6] # ٧ڳ.ߚ-6Ⴙ -N; \u0667\u200D\uFB96。\u07DA-₆Ⴙ; [B1 B2 B3 C2 P1 V6]; [B1 B2 B3 C2 P1 V6] # ٧ڳ.ߚ-6Ⴙ -T; \u0667\u200D\u06B3。\u07DA-6Ⴙ; [B1 B2 B3 C2 P1 V6]; [B1 B2 B3 P1 V6] # ٧ڳ.ߚ-6Ⴙ -N; \u0667\u200D\u06B3。\u07DA-6Ⴙ; [B1 B2 B3 C2 P1 V6]; [B1 B2 B3 C2 P1 V6] # ٧ڳ.ߚ-6Ⴙ -T; \u0667\u200D\u06B3。\u07DA-6ⴙ; [B1 B2 B3 C2]; [B1 B2 B3] # ٧ڳ.ߚ-6ⴙ -N; \u0667\u200D\u06B3。\u07DA-6ⴙ; [B1 B2 B3 C2]; [B1 B2 B3 C2] # ٧ڳ.ߚ-6ⴙ -B; xn--gib6m.xn---6-lve6529a; [B1 B2 B3]; [B1 B2 B3] # ٧ڳ.ߚ-6ⴙ -B; xn--gib6m343e.xn---6-lve6529a; [B1 B2 B3 C2]; [B1 B2 B3 C2] # ٧ڳ.ߚ-6ⴙ -B; xn--gib6m.xn---6-lve002g; [B1 B2 B3 V6]; [B1 B2 B3 V6] # ٧ڳ.ߚ-6Ⴙ -B; xn--gib6m343e.xn---6-lve002g; [B1 B2 B3 C2 V6]; [B1 B2 B3 C2 V6] # ٧ڳ.ߚ-6Ⴙ -T; \u0667\u200D\uFB96。\u07DA-₆ⴙ; [B1 B2 B3 C2]; [B1 B2 B3] # ٧ڳ.ߚ-6ⴙ -N; \u0667\u200D\uFB96。\u07DA-₆ⴙ; [B1 B2 B3 C2]; [B1 B2 B3 C2] # ٧ڳ.ߚ-6ⴙ -T; \u200C。≠; [C1 P1 V6]; [P1 V6 A4_2] # .≠ -N; \u200C。≠; [C1 P1 V6]; [C1 P1 V6] # .≠ -T; \u200C。=\u0338; [C1 P1 V6]; [P1 V6 A4_2] # .≠ -N; \u200C。=\u0338; [C1 P1 V6]; [C1 P1 V6] # .≠ -T; \u200C。≠; [C1 P1 V6]; [P1 V6 A4_2] # .≠ -N; \u200C。≠; [C1 P1 V6]; [C1 P1 V6] # .≠ -T; \u200C。=\u0338; [C1 P1 V6]; [P1 V6 A4_2] # .≠ -N; \u200C。=\u0338; [C1 P1 V6]; [C1 P1 V6] # .≠ -B; .xn--1ch; [V6 A4_2]; [V6 A4_2] -B; xn--0ug.xn--1ch; [C1 V6]; [C1 V6] # .≠ -T; 𑖿𝨔.ᡟ𑖿\u1B42\u200C; [C1 V5]; [V5] # 𑖿𝨔.ᡟ𑖿ᭂ -N; 𑖿𝨔.ᡟ𑖿\u1B42\u200C; [C1 V5]; [C1 V5] # 𑖿𝨔.ᡟ𑖿ᭂ -B; xn--461dw464a.xn--v8e29loy65a; [V5]; [V5] # 𑖿𝨔.ᡟ𑖿ᭂ -B; xn--461dw464a.xn--v8e29ldzfo952a; [C1 V5]; [C1 V5] # 𑖿𝨔.ᡟ𑖿ᭂ -T; 򔣳\u200D򑝱.𖬴Ↄ≠-; [C2 P1 V3 V5 V6]; [P1 V3 V5 V6] # .𖬴Ↄ≠- -N; 򔣳\u200D򑝱.𖬴Ↄ≠-; [C2 P1 V3 V5 V6]; [C2 P1 V3 V5 V6] # .𖬴Ↄ≠- -T; 򔣳\u200D򑝱.𖬴Ↄ=\u0338-; [C2 P1 V3 V5 V6]; [P1 V3 V5 V6] # .𖬴Ↄ≠- -N; 򔣳\u200D򑝱.𖬴Ↄ=\u0338-; [C2 P1 V3 V5 V6]; [C2 P1 V3 V5 V6] # .𖬴Ↄ≠- -T; 򔣳\u200D򑝱.𖬴ↄ=\u0338-; [C2 P1 V3 V5 V6]; [P1 V3 V5 V6] # .𖬴ↄ≠- -N; 򔣳\u200D򑝱.𖬴ↄ=\u0338-; [C2 P1 V3 V5 V6]; [C2 P1 V3 V5 V6] # .𖬴ↄ≠- -T; 򔣳\u200D򑝱.𖬴ↄ≠-; [C2 P1 V3 V5 V6]; [P1 V3 V5 V6] # .𖬴ↄ≠- -N; 򔣳\u200D򑝱.𖬴ↄ≠-; [C2 P1 V3 V5 V6]; [C2 P1 V3 V5 V6] # .𖬴ↄ≠- -B; xn--6j00chy9a.xn----81n51bt713h; [V3 V5 V6]; [V3 V5 V6] -B; xn--1ug15151gkb5a.xn----81n51bt713h; [C2 V3 V5 V6]; [C2 V3 V5 V6] # .𖬴ↄ≠- -B; xn--6j00chy9a.xn----61n81bt713h; [V3 V5 V6]; [V3 V5 V6] -B; xn--1ug15151gkb5a.xn----61n81bt713h; [C2 V3 V5 V6]; [C2 V3 V5 V6] # .𖬴Ↄ≠- -T; \u07E2ς\u200D𝟳。蔑򛖢; [B2 C2 P1 V6]; [B2 P1 V6] # ߢς7.蔑 -N; \u07E2ς\u200D𝟳。蔑򛖢; [B2 C2 P1 V6]; [B2 C2 P1 V6] # ߢς7.蔑 -T; \u07E2ς\u200D7。蔑򛖢; [B2 C2 P1 V6]; [B2 P1 V6] # ߢς7.蔑 -N; \u07E2ς\u200D7。蔑򛖢; [B2 C2 P1 V6]; [B2 C2 P1 V6] # ߢς7.蔑 -T; \u07E2Σ\u200D7。蔑򛖢; [B2 C2 P1 V6]; [B2 P1 V6] # ߢσ7.蔑 -N; \u07E2Σ\u200D7。蔑򛖢; [B2 C2 P1 V6]; [B2 C2 P1 V6] # ߢσ7.蔑 -T; \u07E2σ\u200D7。蔑򛖢; [B2 C2 P1 V6]; [B2 P1 V6] # ߢσ7.蔑 -N; \u07E2σ\u200D7。蔑򛖢; [B2 C2 P1 V6]; [B2 C2 P1 V6] # ߢσ7.蔑 -B; xn--7-zmb872a.xn--wy1ao4929b; [B2 V6]; [B2 V6] # ߢσ7.蔑 -B; xn--7-zmb872aez5a.xn--wy1ao4929b; [B2 C2 V6]; [B2 C2 V6] # ߢσ7.蔑 -B; xn--7-xmb182aez5a.xn--wy1ao4929b; [B2 C2 V6]; [B2 C2 V6] # ߢς7.蔑 -T; \u07E2Σ\u200D𝟳。蔑򛖢; [B2 C2 P1 V6]; [B2 P1 V6] # ߢσ7.蔑 -N; \u07E2Σ\u200D𝟳。蔑򛖢; [B2 C2 P1 V6]; [B2 C2 P1 V6] # ߢσ7.蔑 -T; \u07E2σ\u200D𝟳。蔑򛖢; [B2 C2 P1 V6]; [B2 P1 V6] # ߢσ7.蔑 -N; \u07E2σ\u200D𝟳。蔑򛖢; [B2 C2 P1 V6]; [B2 C2 P1 V6] # ߢσ7.蔑 -B; 𐹰.\u0600; [B1 P1 V6]; [B1 P1 V6] # 𐹰. -B; xn--oo0d.xn--ifb; [B1 V6]; [B1 V6] # 𐹰. -B; -\u08A8.𱠖; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ࢨ. -B; xn----mod.xn--5o9n; [B1 V3 V6]; [B1 V3 V6] # -ࢨ. -B; ≯𞱸󠇀。誆⒈; [B1 P1 V6]; [B1 P1 V6] -B; >\u0338𞱸󠇀。誆⒈; [B1 P1 V6]; [B1 P1 V6] -B; ≯𞱸󠇀。誆1.; [B1 P1 V6]; [B1 P1 V6] -B; >\u0338𞱸󠇀。誆1.; [B1 P1 V6]; [B1 P1 V6] -B; xn--hdh7151p.xn--1-dy1d.; [B1 V6]; [B1 V6] -B; xn--hdh7151p.xn--tsh1248a; [B1 V6]; [B1 V6] -B; \u0616𞥙䐊\u0650.︒\u0645↺\u069C; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ؖ𞥙䐊ِ.︒م↺ڜ -B; \u0616𞥙䐊\u0650.。\u0645↺\u069C; [B1 V5 A4_2]; [B1 V5 A4_2] # ؖ𞥙䐊ِ..م↺ڜ -B; xn--4fb0j490qjg4x..xn--hhb8o948e; [B1 V5 A4_2]; [B1 V5 A4_2] # ؖ𞥙䐊ِ..م↺ڜ -B; xn--4fb0j490qjg4x.xn--hhb8o948euo5r; [B1 V5 V6]; [B1 V5 V6] # ؖ𞥙䐊ِ.︒م↺ڜ -T; 퀬-\uDF7E񶳒.\u200C\u0AC5󩸤۴; [C1 P1 V6]; [P1 V5 V6 A3] # 퀬-.ૅ۴ -N; 퀬-\uDF7E񶳒.\u200C\u0AC5󩸤۴; [C1 P1 V6]; [C1 P1 V6 A3] # 퀬-.ૅ۴ -T; 퀬-\uDF7E񶳒.\u200C\u0AC5󩸤۴; [C1 P1 V6]; [P1 V5 V6 A3] # 퀬-.ૅ۴ -N; 퀬-\uDF7E񶳒.\u200C\u0AC5󩸤۴; [C1 P1 V6]; [C1 P1 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.xn--hmb76q74166b; [P1 V5 V6]; [P1 V5 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.xn--hmb76q74166b; [P1 V5 V6]; [P1 V5 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.XN--HMB76Q74166B; [P1 V5 V6]; [P1 V5 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.XN--HMB76Q74166B; [P1 V5 V6]; [P1 V5 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.Xn--Hmb76q74166b; [P1 V5 V6]; [P1 V5 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.Xn--Hmb76q74166b; [P1 V5 V6]; [P1 V5 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.xn--hmb76q48y18505a; [C1 P1 V6]; [C1 P1 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.xn--hmb76q48y18505a; [C1 P1 V6]; [C1 P1 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.XN--HMB76Q48Y18505A; [C1 P1 V6]; [C1 P1 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.XN--HMB76Q48Y18505A; [C1 P1 V6]; [C1 P1 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.Xn--Hmb76q48y18505a; [C1 P1 V6]; [C1 P1 V6 A3] # 퀬-.ૅ۴ -B; 퀬-\uDF7E񶳒.Xn--Hmb76q48y18505a; [C1 P1 V6]; [C1 P1 V6 A3] # 퀬-.ૅ۴ -B; Ⴌ.𐹾︒𑁿𞾄; [B1 P1 V6]; [B1 P1 V6] -B; Ⴌ.𐹾。𑁿𞾄; [B1 P1 V5 V6]; [B1 P1 V5 V6] -B; ⴌ.𐹾。𑁿𞾄; [B1 P1 V5 V6]; [B1 P1 V5 V6] -B; xn--3kj.xn--2o0d.xn--q30dg029a; [B1 V5 V6]; [B1 V5 V6] -B; xn--knd.xn--2o0d.xn--q30dg029a; [B1 V5 V6]; [B1 V5 V6] -B; ⴌ.𐹾︒𑁿𞾄; [B1 P1 V6]; [B1 P1 V6] -B; xn--3kj.xn--y86c030a9ob6374b; [B1 V6]; [B1 V6] -B; xn--knd.xn--y86c030a9ob6374b; [B1 V6]; [B1 V6] -B; 񧞿╏。𞩕󠁾; [B3 B6 P1 V6]; [B3 B6 P1 V6] -B; xn--iyh90030d.xn--1m6hs0260c; [B3 B6 V6]; [B3 B6 V6] -T; \u200D┮󠇐.\u0C00\u0C4D\u1734\u200D; [C2 V5]; [V5] # ┮.ఀ్᜴ -N; \u200D┮󠇐.\u0C00\u0C4D\u1734\u200D; [C2 V5]; [C2 V5] # ┮.ఀ్᜴ -T; \u200D┮󠇐.\u0C00\u0C4D\u1734\u200D; [C2 V5]; [V5] # ┮.ఀ్᜴ -N; \u200D┮󠇐.\u0C00\u0C4D\u1734\u200D; [C2 V5]; [C2 V5] # ┮.ఀ్᜴ -B; xn--kxh.xn--eoc8m432a; [V5]; [V5] # ┮.ఀ్᜴ -B; xn--1ug04r.xn--eoc8m432a40i; [C2 V5]; [C2 V5] # ┮.ఀ్᜴ -B; 򹚪。🄂; [P1 V6]; [P1 V6] -B; 򹚪。1,; [P1 V6]; [P1 V6] -B; xn--n433d.1,; [P1 V6]; [P1 V6] -B; xn--n433d.xn--v07h; [V6]; [V6] -B; 𑍨刍.🛦; [V5]; [V5] -B; xn--rbry728b.xn--y88h; [V5]; [V5] -B; 󠌏3。\u1BF1𝟒; [P1 V5 V6]; [P1 V5 V6] # 3.ᯱ4 -B; 󠌏3。\u1BF14; [P1 V5 V6]; [P1 V5 V6] # 3.ᯱ4 -B; xn--3-ib31m.xn--4-pql; [V5 V6]; [V5 V6] # 3.ᯱ4 -T; \u06876Ⴔ辘.\uFD22\u0687\u200C; [B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # ڇ6Ⴔ辘.صيڇ -N; \u06876Ⴔ辘.\uFD22\u0687\u200C; [B2 B3 C1 P1 V6]; [B2 B3 C1 P1 V6] # ڇ6Ⴔ辘.صيڇ -T; \u06876Ⴔ辘.\u0635\u064A\u0687\u200C; [B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # ڇ6Ⴔ辘.صيڇ -N; \u06876Ⴔ辘.\u0635\u064A\u0687\u200C; [B2 B3 C1 P1 V6]; [B2 B3 C1 P1 V6] # ڇ6Ⴔ辘.صيڇ -T; \u06876ⴔ辘.\u0635\u064A\u0687\u200C; [B2 B3 C1]; [B2 B3] # ڇ6ⴔ辘.صيڇ -N; \u06876ⴔ辘.\u0635\u064A\u0687\u200C; [B2 B3 C1]; [B2 B3 C1] # ڇ6ⴔ辘.صيڇ -B; xn--6-gsc2270akm6f.xn--0gb6bxk; [B2 B3]; [B2 B3] # ڇ6ⴔ辘.صيڇ -B; xn--6-gsc2270akm6f.xn--0gb6bxkx18g; [B2 B3 C1]; [B2 B3 C1] # ڇ6ⴔ辘.صيڇ -B; xn--6-gsc039eqq6k.xn--0gb6bxk; [B2 B3 V6]; [B2 B3 V6] # ڇ6Ⴔ辘.صيڇ -B; xn--6-gsc039eqq6k.xn--0gb6bxkx18g; [B2 B3 C1 V6]; [B2 B3 C1 V6] # ڇ6Ⴔ辘.صيڇ -T; \u06876ⴔ辘.\uFD22\u0687\u200C; [B2 B3 C1]; [B2 B3] # ڇ6ⴔ辘.صيڇ -N; \u06876ⴔ辘.\uFD22\u0687\u200C; [B2 B3 C1]; [B2 B3 C1] # ڇ6ⴔ辘.صيڇ -B; 󠄍.𐮭𞰬򻫞۹; [B2 P1 V6 A4_2]; [B2 P1 V6 A4_2] -B; .xn--mmb3954kd0uf1zx7f; [B2 V6 A4_2]; [B2 V6 A4_2] -B; \uA87D≯.򻲀򒳄; [P1 V6]; [P1 V6] # ≯. -B; \uA87D>\u0338.򻲀򒳄; [P1 V6]; [P1 V6] # ≯. -B; \uA87D≯.򻲀򒳄; [P1 V6]; [P1 V6] # ≯. -B; \uA87D>\u0338.򻲀򒳄; [P1 V6]; [P1 V6] # ≯. -B; xn--hdh8193c.xn--5z40cp629b; [V6]; [V6] # ≯. -T; ςო\u067B.ς\u0714; [B5 B6]; [B5 B6] # ςოٻ.ςܔ -N; ςო\u067B.ς\u0714; [B5 B6]; [B5 B6] # ςოٻ.ςܔ -B; Σო\u067B.Σ\u0714; [B5 B6]; [B5 B6] # σოٻ.σܔ -B; σო\u067B.σ\u0714; [B5 B6]; [B5 B6] # σოٻ.σܔ -B; Σო\u067B.σ\u0714; [B5 B6]; [B5 B6] # σოٻ.σܔ -B; xn--4xa60l26n.xn--4xa21o; [B5 B6]; [B5 B6] # σოٻ.σܔ -T; Σო\u067B.ς\u0714; [B5 B6]; [B5 B6] # σოٻ.ςܔ -N; Σო\u067B.ς\u0714; [B5 B6]; [B5 B6] # σოٻ.ςܔ -T; σო\u067B.ς\u0714; [B5 B6]; [B5 B6] # σოٻ.ςܔ -N; σო\u067B.ς\u0714; [B5 B6]; [B5 B6] # σოٻ.ςܔ -B; xn--4xa60l26n.xn--3xa41o; [B5 B6]; [B5 B6] # σოٻ.ςܔ -B; xn--3xa80l26n.xn--3xa41o; [B5 B6]; [B5 B6] # ςოٻ.ςܔ -B; 򄖚\u0748𠄯\u075F。󠛩; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ݈𠄯ݟ. -B; 򄖚\u0748𠄯\u075F。󠛩; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ݈𠄯ݟ. -B; xn--vob0c4369twfv8b.xn--kl46e; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ݈𠄯ݟ. -T; 󠳛.\u200D䤫≠Ⴞ; [C2 P1 V6]; [P1 V6] # .䤫≠Ⴞ -N; 󠳛.\u200D䤫≠Ⴞ; [C2 P1 V6]; [C2 P1 V6] # .䤫≠Ⴞ -T; 󠳛.\u200D䤫=\u0338Ⴞ; [C2 P1 V6]; [P1 V6] # .䤫≠Ⴞ -N; 󠳛.\u200D䤫=\u0338Ⴞ; [C2 P1 V6]; [C2 P1 V6] # .䤫≠Ⴞ -T; 󠳛.\u200D䤫≠Ⴞ; [C2 P1 V6]; [P1 V6] # .䤫≠Ⴞ -N; 󠳛.\u200D䤫≠Ⴞ; [C2 P1 V6]; [C2 P1 V6] # .䤫≠Ⴞ -T; 󠳛.\u200D䤫=\u0338Ⴞ; [C2 P1 V6]; [P1 V6] # .䤫≠Ⴞ -N; 󠳛.\u200D䤫=\u0338Ⴞ; [C2 P1 V6]; [C2 P1 V6] # .䤫≠Ⴞ -T; 󠳛.\u200D䤫=\u0338ⴞ; [C2 P1 V6]; [P1 V6] # .䤫≠ⴞ -N; 󠳛.\u200D䤫=\u0338ⴞ; [C2 P1 V6]; [C2 P1 V6] # .䤫≠ⴞ -T; 󠳛.\u200D䤫≠ⴞ; [C2 P1 V6]; [P1 V6] # .䤫≠ⴞ -N; 󠳛.\u200D䤫≠ⴞ; [C2 P1 V6]; [C2 P1 V6] # .䤫≠ⴞ -B; xn--1t56e.xn--1ch153bqvw; [V6]; [V6] -B; xn--1t56e.xn--1ug73gzzpwi3a; [C2 V6]; [C2 V6] # .䤫≠ⴞ -B; xn--1t56e.xn--2nd141ghl2a; [V6]; [V6] -B; xn--1t56e.xn--2nd159e9vb743e; [C2 V6]; [C2 V6] # .䤫≠Ⴞ -T; 󠳛.\u200D䤫=\u0338ⴞ; [C2 P1 V6]; [P1 V6] # .䤫≠ⴞ -N; 󠳛.\u200D䤫=\u0338ⴞ; [C2 P1 V6]; [C2 P1 V6] # .䤫≠ⴞ -T; 󠳛.\u200D䤫≠ⴞ; [C2 P1 V6]; [P1 V6] # .䤫≠ⴞ -N; 󠳛.\u200D䤫≠ⴞ; [C2 P1 V6]; [C2 P1 V6] # .䤫≠ⴞ -B; 𐽘𑈵.𐹣🕥; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] -B; 𐽘𑈵.𐹣🕥; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] -B; xn--bv0d02c.xn--bo0dq650b; [B1 B2 B3 V6]; [B1 B2 B3 V6] -B; ⒊⒈𑁄。9; [P1 V6]; [P1 V6] -B; 3.1.𑁄。9; [V5]; [V5] -B; 3.1.xn--110d.9; [V5]; [V5] -B; xn--tshd3512p.9; [V6]; [V6] -T; -\u200C\u2DF1≮.𐹱򭏴4₉; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # -ⷱ≮.𐹱49 -N; -\u200C\u2DF1≮.𐹱򭏴4₉; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # -ⷱ≮.𐹱49 -T; -\u200C\u2DF1<\u0338.𐹱򭏴4₉; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # -ⷱ≮.𐹱49 -N; -\u200C\u2DF1<\u0338.𐹱򭏴4₉; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # -ⷱ≮.𐹱49 -T; -\u200C\u2DF1≮.𐹱򭏴49; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # -ⷱ≮.𐹱49 -N; -\u200C\u2DF1≮.𐹱򭏴49; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # -ⷱ≮.𐹱49 -T; -\u200C\u2DF1<\u0338.𐹱򭏴49; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # -ⷱ≮.𐹱49 -N; -\u200C\u2DF1<\u0338.𐹱򭏴49; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # -ⷱ≮.𐹱49 -B; xn----ngo823c.xn--49-ki3om2611f; [B1 V3 V6]; [B1 V3 V6] # -ⷱ≮.𐹱49 -B; xn----sgn20i14s.xn--49-ki3om2611f; [B1 C1 V3 V6]; [B1 C1 V3 V6] # -ⷱ≮.𐹱49 -B; -≯딾。\u0847; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -≯딾.ࡇ -B; ->\u0338딾。\u0847; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -≯딾.ࡇ -B; -≯딾。\u0847; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -≯딾.ࡇ -B; ->\u0338딾。\u0847; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -≯딾.ࡇ -B; xn----pgow547d.xn--5vb; [B1 V3 V6]; [B1 V3 V6] # -≯딾.ࡇ -T; 𑙢⒈𐹠-。󠗐\u200C; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𑙢⒈𐹠-. -N; 𑙢⒈𐹠-。󠗐\u200C; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𑙢⒈𐹠-. -T; 𑙢1.𐹠-。󠗐\u200C; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𑙢1.𐹠-. -N; 𑙢1.𐹠-。󠗐\u200C; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𑙢1.𐹠-. -B; xn--1-bf0j.xn----516i.xn--jd46e; [B1 V3 V6]; [B1 V3 V6] -B; xn--1-bf0j.xn----516i.xn--0ug23321l; [B1 C1 V3 V6]; [B1 C1 V3 V6] # 𑙢1.𐹠-. -B; xn----dcpy090hiyg.xn--jd46e; [B1 V3 V6]; [B1 V3 V6] -B; xn----dcpy090hiyg.xn--0ug23321l; [B1 C1 V3 V6]; [B1 C1 V3 V6] # 𑙢⒈𐹠-. -B; \u034A.𐨎; [V5]; [V5] # ͊.𐨎 -B; \u034A.𐨎; [V5]; [V5] # ͊.𐨎 -B; xn--oua.xn--mr9c; [V5]; [V5] # ͊.𐨎 -B; 훉≮。\u0E34; [P1 V5 V6]; [P1 V5 V6] # 훉≮.ิ -B; 훉<\u0338。\u0E34; [P1 V5 V6]; [P1 V5 V6] # 훉≮.ิ -B; 훉≮。\u0E34; [P1 V5 V6]; [P1 V5 V6] # 훉≮.ิ -B; 훉<\u0338。\u0E34; [P1 V5 V6]; [P1 V5 V6] # 훉≮.ิ -B; xn--gdh2512e.xn--i4c; [V5 V6]; [V5 V6] # 훉≮.ิ -B; \u2DF7򞣉🃘.𴈇𝟸\u0659𞤯; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ⷷ🃘.2ٙ𞤯 -B; \u2DF7򞣉🃘.𴈇2\u0659𞤯; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ⷷ🃘.2ٙ𞤯 -B; \u2DF7򞣉🃘.𴈇2\u0659𞤍; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ⷷ🃘.2ٙ𞤯 -B; xn--trj8045le6s9b.xn--2-upc23918acjsj; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ⷷ🃘.2ٙ𞤯 -B; \u2DF7򞣉🃘.𴈇𝟸\u0659𞤍; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ⷷ🃘.2ٙ𞤯 -T; 󗇩ßᢞ\u200C。\u0660𞷻\uFCD4-; [B1 B6 C1 P1 V3 V6]; [B1 P1 V3 V6] # ßᢞ.٠نخ- -N; 󗇩ßᢞ\u200C。\u0660𞷻\uFCD4-; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # ßᢞ.٠نخ- -T; 󗇩ßᢞ\u200C。\u0660𞷻\u0646\u062E-; [B1 B6 C1 P1 V3 V6]; [B1 P1 V3 V6] # ßᢞ.٠نخ- -N; 󗇩ßᢞ\u200C。\u0660𞷻\u0646\u062E-; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # ßᢞ.٠نخ- -T; 󗇩SSᢞ\u200C。\u0660𞷻\u0646\u062E-; [B1 B6 C1 P1 V3 V6]; [B1 P1 V3 V6] # ssᢞ.٠نخ- -N; 󗇩SSᢞ\u200C。\u0660𞷻\u0646\u062E-; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # ssᢞ.٠نخ- -T; 󗇩ssᢞ\u200C。\u0660𞷻\u0646\u062E-; [B1 B6 C1 P1 V3 V6]; [B1 P1 V3 V6] # ssᢞ.٠نخ- -N; 󗇩ssᢞ\u200C。\u0660𞷻\u0646\u062E-; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # ssᢞ.٠نخ- -T; 󗇩Ssᢞ\u200C。\u0660𞷻\u0646\u062E-; [B1 B6 C1 P1 V3 V6]; [B1 P1 V3 V6] # ssᢞ.٠نخ- -N; 󗇩Ssᢞ\u200C。\u0660𞷻\u0646\u062E-; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # ssᢞ.٠نخ- -B; xn--ss-jepz4596r.xn----dnc5e1er384z; [B1 V3 V6]; [B1 V3 V6] # ssᢞ.٠نخ- -B; xn--ss-jep006bqt765b.xn----dnc5e1er384z; [B1 B6 C1 V3 V6]; [B1 B6 C1 V3 V6] # ssᢞ.٠نخ- -B; xn--zca272jbif10059a.xn----dnc5e1er384z; [B1 B6 C1 V3 V6]; [B1 B6 C1 V3 V6] # ßᢞ.٠نخ- -T; 󗇩SSᢞ\u200C。\u0660𞷻\uFCD4-; [B1 B6 C1 P1 V3 V6]; [B1 P1 V3 V6] # ssᢞ.٠نخ- -N; 󗇩SSᢞ\u200C。\u0660𞷻\uFCD4-; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # ssᢞ.٠نخ- -T; 󗇩ssᢞ\u200C。\u0660𞷻\uFCD4-; [B1 B6 C1 P1 V3 V6]; [B1 P1 V3 V6] # ssᢞ.٠نخ- -N; 󗇩ssᢞ\u200C。\u0660𞷻\uFCD4-; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # ssᢞ.٠نخ- -T; 󗇩Ssᢞ\u200C。\u0660𞷻\uFCD4-; [B1 B6 C1 P1 V3 V6]; [B1 P1 V3 V6] # ssᢞ.٠نخ- -N; 󗇩Ssᢞ\u200C。\u0660𞷻\uFCD4-; [B1 B6 C1 P1 V3 V6]; [B1 B6 C1 P1 V3 V6] # ssᢞ.٠نخ- -B; ꡆ。Ↄ\u0FB5놮-; [P1 V3 V6]; [P1 V3 V6] # ꡆ.Ↄྵ놮- -B; ꡆ。Ↄ\u0FB5놮-; [P1 V3 V6]; [P1 V3 V6] # ꡆ.Ↄྵ놮- -B; ꡆ。ↄ\u0FB5놮-; [V3]; [V3] # ꡆ.ↄྵ놮- -B; ꡆ。ↄ\u0FB5놮-; [V3]; [V3] # ꡆ.ↄྵ놮- -B; xn--fc9a.xn----qmg097k469k; [V3]; [V3] # ꡆ.ↄྵ놮- -B; xn--fc9a.xn----qmg787k869k; [V3 V6]; [V3 V6] # ꡆ.Ↄྵ놮- -T; \uFDAD\u200D.񥰌\u06A9; [B3 B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # لمي.ک -N; \uFDAD\u200D.񥰌\u06A9; [B3 B5 B6 C2 P1 V6]; [B3 B5 B6 C2 P1 V6] # لمي.ک -T; \u0644\u0645\u064A\u200D.񥰌\u06A9; [B3 B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # لمي.ک -N; \u0644\u0645\u064A\u200D.񥰌\u06A9; [B3 B5 B6 C2 P1 V6]; [B3 B5 B6 C2 P1 V6] # لمي.ک -B; xn--ghbcp.xn--ckb36214f; [B5 B6 V6]; [B5 B6 V6] # لمي.ک -B; xn--ghbcp494x.xn--ckb36214f; [B3 B5 B6 C2 V6]; [B3 B5 B6 C2 V6] # لمي.ک -B; Ⴜ\u1C2F𐳒≯。\u06E0\u1732\u0FBA; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # Ⴜᰯ𐳒≯.۠ᜲྺ -B; Ⴜ\u1C2F𐳒>\u0338。\u06E0\u1732\u0FBA; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # Ⴜᰯ𐳒≯.۠ᜲྺ -B; ⴜ\u1C2F𐳒>\u0338。\u06E0\u1732\u0FBA; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ⴜᰯ𐳒≯.۠ᜲྺ -B; ⴜ\u1C2F𐳒≯。\u06E0\u1732\u0FBA; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ⴜᰯ𐳒≯.۠ᜲྺ -B; Ⴜ\u1C2F𐲒≯。\u06E0\u1732\u0FBA; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # Ⴜᰯ𐳒≯.۠ᜲྺ -B; Ⴜ\u1C2F𐲒>\u0338。\u06E0\u1732\u0FBA; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # Ⴜᰯ𐳒≯.۠ᜲྺ -B; xn--0nd679cf3eq67y.xn--wlb646b4ng; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # Ⴜᰯ𐳒≯.۠ᜲྺ -B; xn--r1f68xh1jgv7u.xn--wlb646b4ng; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # ⴜᰯ𐳒≯.۠ᜲྺ -B; 𐋵。\uFCEC; [B1]; [B1] # 𐋵.كم -B; 𐋵。\u0643\u0645; [B1]; [B1] # 𐋵.كم -B; xn--p97c.xn--fhbe; [B1]; [B1] # 𐋵.كم -B; 𐋵.\u0643\u0645; [B1]; [B1] # 𐋵.كم -B; ≮𝅶.񱲁\uAAEC⹈󰥭; [P1 V6]; [P1 V6] # ≮.ꫬ⹈ -B; <\u0338𝅶.񱲁\uAAEC⹈󰥭; [P1 V6]; [P1 V6] # ≮.ꫬ⹈ -B; ≮𝅶.񱲁\uAAEC⹈󰥭; [P1 V6]; [P1 V6] # ≮.ꫬ⹈ -B; <\u0338𝅶.񱲁\uAAEC⹈󰥭; [P1 V6]; [P1 V6] # ≮.ꫬ⹈ -B; xn--gdh0880o.xn--4tjx101bsg00ds9pyc; [V6]; [V6] # ≮.ꫬ⹈ -B; \u2DF0\u0358ᢕ.\u0361𐹷󠴍; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ⷰ͘ᢕ.͡𐹷 -B; \u2DF0\u0358ᢕ.\u0361𐹷󠴍; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ⷰ͘ᢕ.͡𐹷 -B; xn--2ua889htsp.xn--cva2687k2tv0g; [B1 V5 V6]; [B1 V5 V6] # ⷰ͘ᢕ.͡𐹷 -T; \uFD79ᡐ\u200C\u06AD.𑋪\u05C7; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] # غممᡐڭ.𑋪ׇ -N; \uFD79ᡐ\u200C\u06AD.𑋪\u05C7; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] # غممᡐڭ.𑋪ׇ -T; \u063A\u0645\u0645ᡐ\u200C\u06AD.𑋪\u05C7; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] # غممᡐڭ.𑋪ׇ -N; \u063A\u0645\u0645ᡐ\u200C\u06AD.𑋪\u05C7; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] # غممᡐڭ.𑋪ׇ -B; xn--5gbwa03bg24e.xn--vdb1198k; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] # غممᡐڭ.𑋪ׇ -B; xn--5gbwa03bg24eptk.xn--vdb1198k; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] # غممᡐڭ.𑋪ׇ -T; 𑑂。\u200D󥞀🞕򥁔; [C2 P1 V5 V6]; [P1 V5 V6] # 𑑂.🞕 -N; 𑑂。\u200D󥞀🞕򥁔; [C2 P1 V5 V6]; [C2 P1 V5 V6] # 𑑂.🞕 -T; 𑑂。\u200D󥞀🞕򥁔; [C2 P1 V5 V6]; [P1 V5 V6] # 𑑂.🞕 -N; 𑑂。\u200D󥞀🞕򥁔; [C2 P1 V5 V6]; [C2 P1 V5 V6] # 𑑂.🞕 -B; xn--8v1d.xn--ye9h41035a2qqs; [V5 V6]; [V5 V6] -B; xn--8v1d.xn--1ug1386plvx1cd8vya; [C2 V5 V6]; [C2 V5 V6] # 𑑂.🞕 -B; -\u05E9。⒚; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ש.⒚ -B; -\u05E9。19.; [B1 V3]; [B1 V3] # -ש.19. -B; xn----gjc.19.; [B1 V3]; [B1 V3] # -ש.19. -B; xn----gjc.xn--cth; [B1 V3 V6]; [B1 V3 V6] # -ש.⒚ -T; 􊾻\u0845\u200C。ᢎ\u200D; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # ࡅ.ᢎ -N; 􊾻\u0845\u200C。ᢎ\u200D; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # ࡅ.ᢎ -T; 􊾻\u0845\u200C。ᢎ\u200D; [B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # ࡅ.ᢎ -N; 􊾻\u0845\u200C。ᢎ\u200D; [B5 B6 C1 C2 P1 V6]; [B5 B6 C1 C2 P1 V6] # ࡅ.ᢎ -B; xn--3vb50049s.xn--79e; [B5 B6 V6]; [B5 B6 V6] # ࡅ.ᢎ -B; xn--3vb882jz4411a.xn--79e259a; [B5 B6 C1 C2 V6]; [B5 B6 C1 C2 V6] # ࡅ.ᢎ -T; ß\u09C1\u1DED。\u06208₅; ß\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ßুᷭ.ؠ85 -N; ß\u09C1\u1DED。\u06208₅; ß\u09C1\u1DED.\u062085; xn--zca266bwrr.xn--85-psd # ßুᷭ.ؠ85 -T; ß\u09C1\u1DED。\u062085; ß\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ßুᷭ.ؠ85 -N; ß\u09C1\u1DED。\u062085; ß\u09C1\u1DED.\u062085; xn--zca266bwrr.xn--85-psd # ßুᷭ.ؠ85 -B; SS\u09C1\u1DED。\u062085; ss\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -B; ss\u09C1\u1DED。\u062085; ss\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -B; Ss\u09C1\u1DED。\u062085; ss\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -B; xn--ss-e2f077r.xn--85-psd; ss\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -B; ss\u09C1\u1DED.\u062085; ; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -B; SS\u09C1\u1DED.\u062085; ss\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -B; Ss\u09C1\u1DED.\u062085; ss\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -B; xn--zca266bwrr.xn--85-psd; ß\u09C1\u1DED.\u062085; xn--zca266bwrr.xn--85-psd # ßুᷭ.ؠ85 -T; ß\u09C1\u1DED.\u062085; ; xn--ss-e2f077r.xn--85-psd # ßুᷭ.ؠ85 -N; ß\u09C1\u1DED.\u062085; ; xn--zca266bwrr.xn--85-psd # ßুᷭ.ؠ85 -B; SS\u09C1\u1DED。\u06208₅; ss\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -B; ss\u09C1\u1DED。\u06208₅; ss\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -B; Ss\u09C1\u1DED。\u06208₅; ss\u09C1\u1DED.\u062085; xn--ss-e2f077r.xn--85-psd # ssুᷭ.ؠ85 -T; \u0ACD\u0484魅𝟣.₃𐹥ß; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ß -N; \u0ACD\u0484魅𝟣.₃𐹥ß; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ß -T; \u0ACD\u0484魅1.3𐹥ß; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ß -N; \u0ACD\u0484魅1.3𐹥ß; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ß -B; \u0ACD\u0484魅1.3𐹥SS; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ss -B; \u0ACD\u0484魅1.3𐹥ss; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ss -B; \u0ACD\u0484魅1.3𐹥Ss; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ss -B; xn--1-0xb049b102o.xn--3ss-nv9t; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ss -B; xn--1-0xb049b102o.xn--3-qfa7018r; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ß -B; \u0ACD\u0484魅𝟣.₃𐹥SS; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ss -B; \u0ACD\u0484魅𝟣.₃𐹥ss; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ss -B; \u0ACD\u0484魅𝟣.₃𐹥Ss; [B1 V5]; [B1 V5] # ્҄魅1.3𐹥ss -B; \u072B。𑓂⒈𑜫󠿻; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ܫ.𑓂⒈𑜫 -B; \u072B。𑓂1.𑜫󠿻; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ܫ.𑓂1.𑜫 -B; xn--1nb.xn--1-jq9i.xn--ji2dg9877c; [B1 V5 V6]; [B1 V5 V6] # ܫ.𑓂1.𑜫 -B; xn--1nb.xn--tsh7798f6rbrt828c; [B1 V5 V6]; [B1 V5 V6] # ܫ.𑓂⒈𑜫 -B; \uFE0Dછ。嵨; છ.嵨; xn--6dc.xn--tot -B; xn--6dc.xn--tot; છ.嵨; xn--6dc.xn--tot -B; છ.嵨; ; xn--6dc.xn--tot -B; Ⴔ≠Ⴀ.𐹥𐹰; [B1 P1 V6]; [B1 P1 V6] -B; Ⴔ=\u0338Ⴀ.𐹥𐹰; [B1 P1 V6]; [B1 P1 V6] -B; ⴔ=\u0338ⴀ.𐹥𐹰; [B1 P1 V6]; [B1 P1 V6] -B; ⴔ≠ⴀ.𐹥𐹰; [B1 P1 V6]; [B1 P1 V6] -B; xn--1ch603bxb.xn--do0dwa; [B1 V6]; [B1 V6] -B; xn--7md3b171g.xn--do0dwa; [B1 V6]; [B1 V6] -T; -\u200C⒙𐫥。𝨵; [C1 P1 V3 V5 V6]; [P1 V3 V5 V6] # -⒙𐫥.𝨵 -N; -\u200C⒙𐫥。𝨵; [C1 P1 V3 V5 V6]; [C1 P1 V3 V5 V6] # -⒙𐫥.𝨵 -T; -\u200C18.𐫥。𝨵; [C1 V3 V5]; [V3 V5] # -18.𐫥.𝨵 -N; -\u200C18.𐫥。𝨵; [C1 V3 V5]; [C1 V3 V5] # -18.𐫥.𝨵 -B; -18.xn--rx9c.xn--382h; [V3 V5]; [V3 V5] -B; xn---18-9m0a.xn--rx9c.xn--382h; [C1 V3 V5]; [C1 V3 V5] # -18.𐫥.𝨵 -B; xn----ddps939g.xn--382h; [V3 V5 V6]; [V3 V5 V6] -B; xn----sgn18r3191a.xn--382h; [C1 V3 V5 V6]; [C1 V3 V5 V6] # -⒙𐫥.𝨵 -B; ︒.ʌᠣ-𐹽; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] -B; 。.ʌᠣ-𐹽; [B5 B6 A4_2]; [B5 B6 A4_2] -B; 。.Ʌᠣ-𐹽; [B5 B6 A4_2]; [B5 B6 A4_2] -B; ..xn----73a596nuh9t; [B5 B6 A4_2]; [B5 B6 A4_2] -B; ︒.Ʌᠣ-𐹽; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] -B; xn--y86c.xn----73a596nuh9t; [B1 B5 B6 V6]; [B1 B5 B6 V6] -B; \uFE05︒。𦀾\u1CE0; [P1 V6]; [P1 V6] # ︒.𦀾᳠ -B; \uFE05。。𦀾\u1CE0; [A4_2]; [A4_2] # ..𦀾᳠ -B; ..xn--t6f5138v; [A4_2]; [A4_2] # ..𦀾᳠ -B; xn--y86c.xn--t6f5138v; [V6]; [V6] # ︒.𦀾᳠ -B; xn--t6f5138v; 𦀾\u1CE0; xn--t6f5138v # 𦀾᳠ -B; 𦀾\u1CE0; ; xn--t6f5138v # 𦀾᳠ -T; 𞮑ß􏞞。ᡁ; [B2 B3 P1 V6]; [B2 B3 P1 V6] -N; 𞮑ß􏞞。ᡁ; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 𞮑SS􏞞。ᡁ; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 𞮑ss􏞞。ᡁ; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 𞮑Ss􏞞。ᡁ; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; xn--ss-o412ac6305g.xn--07e; [B2 B3 V6]; [B2 B3 V6] -B; xn--zca9432wb989f.xn--07e; [B2 B3 V6]; [B2 B3 V6] -T; \uA953\u200D\u062C\u066C。𱆎󻡟\u200C󠅆; [B5 B6 C1 P1 V5 V6]; [B5 B6 P1 V5 V6] # ꥓ج٬. -N; \uA953\u200D\u062C\u066C。𱆎󻡟\u200C󠅆; [B5 B6 C1 P1 V5 V6]; [B5 B6 C1 P1 V5 V6] # ꥓ج٬. -B; xn--rgb2k6711c.xn--ec8nj3948b; [B5 B6 V5 V6]; [B5 B6 V5 V6] # ꥓ج٬. -B; xn--rgb2k500fhq9j.xn--0ug78870a5sp9d; [B5 B6 C1 V5 V6]; [B5 B6 C1 V5 V6] # ꥓ج٬. -T; 󠕏.-ß\u200C≠; [C1 P1 V3 V6]; [P1 V3 V6] # .-ß≠ -N; 󠕏.-ß\u200C≠; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ß≠ -T; 󠕏.-ß\u200C=\u0338; [C1 P1 V3 V6]; [P1 V3 V6] # .-ß≠ -N; 󠕏.-ß\u200C=\u0338; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ß≠ -T; 󠕏.-ß\u200C≠; [C1 P1 V3 V6]; [P1 V3 V6] # .-ß≠ -N; 󠕏.-ß\u200C≠; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ß≠ -T; 󠕏.-ß\u200C=\u0338; [C1 P1 V3 V6]; [P1 V3 V6] # .-ß≠ -N; 󠕏.-ß\u200C=\u0338; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ß≠ -T; 󠕏.-SS\u200C=\u0338; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-SS\u200C=\u0338; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-SS\u200C≠; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-SS\u200C≠; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-ss\u200C≠; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-ss\u200C≠; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-ss\u200C=\u0338; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-ss\u200C=\u0338; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-Ss\u200C=\u0338; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-Ss\u200C=\u0338; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-Ss\u200C≠; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-Ss\u200C≠; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -B; xn--u836e.xn---ss-gl2a; [V3 V6]; [V3 V6] -B; xn--u836e.xn---ss-cn0at5l; [C1 V3 V6]; [C1 V3 V6] # .-ss≠ -B; xn--u836e.xn----qfa750ve7b; [C1 V3 V6]; [C1 V3 V6] # .-ß≠ -T; 󠕏.-SS\u200C=\u0338; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-SS\u200C=\u0338; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-SS\u200C≠; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-SS\u200C≠; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-ss\u200C≠; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-ss\u200C≠; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-ss\u200C=\u0338; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-ss\u200C=\u0338; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-Ss\u200C=\u0338; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-Ss\u200C=\u0338; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; 󠕏.-Ss\u200C≠; [C1 P1 V3 V6]; [P1 V3 V6] # .-ss≠ -N; 󠕏.-Ss\u200C≠; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .-ss≠ -T; ᡙ\u200C。≯𐋲≠; [C1 P1 V6]; [P1 V6] # ᡙ.≯𐋲≠ -N; ᡙ\u200C。≯𐋲≠; [C1 P1 V6]; [C1 P1 V6] # ᡙ.≯𐋲≠ -T; ᡙ\u200C。>\u0338𐋲=\u0338; [C1 P1 V6]; [P1 V6] # ᡙ.≯𐋲≠ -N; ᡙ\u200C。>\u0338𐋲=\u0338; [C1 P1 V6]; [C1 P1 V6] # ᡙ.≯𐋲≠ -T; ᡙ\u200C。≯𐋲≠; [C1 P1 V6]; [P1 V6] # ᡙ.≯𐋲≠ -N; ᡙ\u200C。≯𐋲≠; [C1 P1 V6]; [C1 P1 V6] # ᡙ.≯𐋲≠ -T; ᡙ\u200C。>\u0338𐋲=\u0338; [C1 P1 V6]; [P1 V6] # ᡙ.≯𐋲≠ -N; ᡙ\u200C。>\u0338𐋲=\u0338; [C1 P1 V6]; [C1 P1 V6] # ᡙ.≯𐋲≠ -B; xn--p8e.xn--1ch3a7084l; [V6]; [V6] -B; xn--p8e650b.xn--1ch3a7084l; [C1 V6]; [C1 V6] # ᡙ.≯𐋲≠ -B; 𐹧𞲄󠁭񆼩。\u034E🄀; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𐹧.͎🄀 -B; 𐹧𞲄󠁭񆼩。\u034E0.; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𐹧.͎0. -B; xn--fo0dw409aq58qrn69d.xn--0-bgb.; [B1 V5 V6]; [B1 V5 V6] # 𐹧.͎0. -B; xn--fo0dw409aq58qrn69d.xn--sua6883w; [B1 V5 V6]; [B1 V5 V6] # 𐹧.͎🄀 -T; Ⴄ.\u200D\u0721󻣋ς; [B1 C2 P1 V6]; [B2 B3 P1 V6] # Ⴄ.ܡς -N; Ⴄ.\u200D\u0721󻣋ς; [B1 C2 P1 V6]; [B1 C2 P1 V6] # Ⴄ.ܡς -T; Ⴄ.\u200D\u0721󻣋ς; [B1 C2 P1 V6]; [B2 B3 P1 V6] # Ⴄ.ܡς -N; Ⴄ.\u200D\u0721󻣋ς; [B1 C2 P1 V6]; [B1 C2 P1 V6] # Ⴄ.ܡς -T; ⴄ.\u200D\u0721󻣋ς; [B1 C2 P1 V6]; [B2 B3 P1 V6] # ⴄ.ܡς -N; ⴄ.\u200D\u0721󻣋ς; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ⴄ.ܡς -T; Ⴄ.\u200D\u0721󻣋Σ; [B1 C2 P1 V6]; [B2 B3 P1 V6] # Ⴄ.ܡσ -N; Ⴄ.\u200D\u0721󻣋Σ; [B1 C2 P1 V6]; [B1 C2 P1 V6] # Ⴄ.ܡσ -T; ⴄ.\u200D\u0721󻣋σ; [B1 C2 P1 V6]; [B2 B3 P1 V6] # ⴄ.ܡσ -N; ⴄ.\u200D\u0721󻣋σ; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ⴄ.ܡσ -B; xn--vkj.xn--4xa73ob5892c; [B2 B3 V6]; [B2 B3 V6] # ⴄ.ܡσ -B; xn--vkj.xn--4xa73o3t5ajq467a; [B1 C2 V6]; [B1 C2 V6] # ⴄ.ܡσ -B; xn--cnd.xn--4xa73ob5892c; [B2 B3 V6]; [B2 B3 V6] # Ⴄ.ܡσ -B; xn--cnd.xn--4xa73o3t5ajq467a; [B1 C2 V6]; [B1 C2 V6] # Ⴄ.ܡσ -B; xn--vkj.xn--3xa93o3t5ajq467a; [B1 C2 V6]; [B1 C2 V6] # ⴄ.ܡς -B; xn--cnd.xn--3xa93o3t5ajq467a; [B1 C2 V6]; [B1 C2 V6] # Ⴄ.ܡς -T; ⴄ.\u200D\u0721󻣋ς; [B1 C2 P1 V6]; [B2 B3 P1 V6] # ⴄ.ܡς -N; ⴄ.\u200D\u0721󻣋ς; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ⴄ.ܡς -T; Ⴄ.\u200D\u0721󻣋Σ; [B1 C2 P1 V6]; [B2 B3 P1 V6] # Ⴄ.ܡσ -N; Ⴄ.\u200D\u0721󻣋Σ; [B1 C2 P1 V6]; [B1 C2 P1 V6] # Ⴄ.ܡσ -T; ⴄ.\u200D\u0721󻣋σ; [B1 C2 P1 V6]; [B2 B3 P1 V6] # ⴄ.ܡσ -N; ⴄ.\u200D\u0721󻣋σ; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ⴄ.ܡσ -B; 򮵛\u0613.Ⴕ; [P1 V6]; [P1 V6] # ؓ.Ⴕ -B; 򮵛\u0613.ⴕ; [P1 V6]; [P1 V6] # ؓ.ⴕ -B; xn--1fb94204l.xn--dlj; [V6]; [V6] # ؓ.ⴕ -B; xn--1fb94204l.xn--tnd; [V6]; [V6] # ؓ.Ⴕ -T; ≯\u1DF3𞤥。\u200C\uA8C4󠪉\u200D; [B1 C1 C2 P1 V6]; [B1 P1 V5 V6] # ≯ᷳ𞤥.꣄ -N; ≯\u1DF3𞤥。\u200C\uA8C4󠪉\u200D; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ≯ᷳ𞤥.꣄ -T; >\u0338\u1DF3𞤥。\u200C\uA8C4󠪉\u200D; [B1 C1 C2 P1 V6]; [B1 P1 V5 V6] # ≯ᷳ𞤥.꣄ -N; >\u0338\u1DF3𞤥。\u200C\uA8C4󠪉\u200D; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ≯ᷳ𞤥.꣄ -T; >\u0338\u1DF3𞤃。\u200C\uA8C4󠪉\u200D; [B1 C1 C2 P1 V6]; [B1 P1 V5 V6] # ≯ᷳ𞤥.꣄ -N; >\u0338\u1DF3𞤃。\u200C\uA8C4󠪉\u200D; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ≯ᷳ𞤥.꣄ -T; ≯\u1DF3𞤃。\u200C\uA8C4󠪉\u200D; [B1 C1 C2 P1 V6]; [B1 P1 V5 V6] # ≯ᷳ𞤥.꣄ -N; ≯\u1DF3𞤃。\u200C\uA8C4󠪉\u200D; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # ≯ᷳ𞤥.꣄ -B; xn--ofg13qyr21c.xn--0f9au6706d; [B1 V5 V6]; [B1 V5 V6] # ≯ᷳ𞤥.꣄ -B; xn--ofg13qyr21c.xn--0ugc0116hix29k; [B1 C1 C2 V6]; [B1 C1 C2 V6] # ≯ᷳ𞤥.꣄ -T; \u200C󠄷。򒑁; [C1 P1 V6]; [P1 V6 A4_2] # . -N; \u200C󠄷。򒑁; [C1 P1 V6]; [C1 P1 V6] # . -T; \u200C󠄷。򒑁; [C1 P1 V6]; [P1 V6 A4_2] # . -N; \u200C󠄷。򒑁; [C1 P1 V6]; [C1 P1 V6] # . -B; .xn--w720c; [V6 A4_2]; [V6 A4_2] -B; xn--0ug.xn--w720c; [C1 V6]; [C1 V6] # . -T; ⒈\u0DD6焅.󗡙\u200Dꡟ; [C2 P1 V6]; [P1 V6] # ⒈ූ焅.ꡟ -N; ⒈\u0DD6焅.󗡙\u200Dꡟ; [C2 P1 V6]; [C2 P1 V6] # ⒈ූ焅.ꡟ -T; 1.\u0DD6焅.󗡙\u200Dꡟ; [C2 P1 V5 V6]; [P1 V5 V6] # 1.ූ焅.ꡟ -N; 1.\u0DD6焅.󗡙\u200Dꡟ; [C2 P1 V5 V6]; [C2 P1 V5 V6] # 1.ූ焅.ꡟ -B; 1.xn--t1c6981c.xn--4c9a21133d; [V5 V6]; [V5 V6] # 1.ූ焅.ꡟ -B; 1.xn--t1c6981c.xn--1ugz184c9lw7i; [C2 V5 V6]; [C2 V5 V6] # 1.ූ焅.ꡟ -B; xn--t1c337io97c.xn--4c9a21133d; [V6]; [V6] # ⒈ූ焅.ꡟ -B; xn--t1c337io97c.xn--1ugz184c9lw7i; [C2 V6]; [C2 V6] # ⒈ූ焅.ꡟ -T; \u1DCDς≮.ς𝪦𞤕0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍ς≮.ς𝪦𞤷0 -N; \u1DCDς≮.ς𝪦𞤕0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍ς≮.ς𝪦𞤷0 -T; \u1DCDς<\u0338.ς𝪦𞤕0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍ς≮.ς𝪦𞤷0 -N; \u1DCDς<\u0338.ς𝪦𞤕0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍ς≮.ς𝪦𞤷0 -T; \u1DCDς<\u0338.ς𝪦𞤷0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍ς≮.ς𝪦𞤷0 -N; \u1DCDς<\u0338.ς𝪦𞤷0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍ς≮.ς𝪦𞤷0 -T; \u1DCDς≮.ς𝪦𞤷0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍ς≮.ς𝪦𞤷0 -N; \u1DCDς≮.ς𝪦𞤷0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍ς≮.ς𝪦𞤷0 -B; \u1DCDΣ≮.Σ𝪦𞤕0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍σ≮.σ𝪦𞤷0 -B; \u1DCDΣ<\u0338.Σ𝪦𞤕0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍σ≮.σ𝪦𞤷0 -B; \u1DCDσ<\u0338.σ𝪦𞤷0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍σ≮.σ𝪦𞤷0 -B; \u1DCDσ≮.σ𝪦𞤷0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍σ≮.σ𝪦𞤷0 -B; \u1DCDΣ≮.Σ𝪦𞤷0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍σ≮.σ𝪦𞤷0 -B; \u1DCDΣ<\u0338.Σ𝪦𞤷0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍σ≮.σ𝪦𞤷0 -B; xn--4xa544kvid.xn--0-zmb55727aggma; [B1 B5 V5 V6]; [B1 B5 V5 V6] # ᷍σ≮.σ𝪦𞤷0 -B; xn--3xa744kvid.xn--0-xmb85727aggma; [B1 B5 V5 V6]; [B1 B5 V5 V6] # ᷍ς≮.ς𝪦𞤷0 -B; \u1DCDσ≮.σ𝪦𞤕0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍σ≮.σ𝪦𞤷0 -B; \u1DCDσ<\u0338.σ𝪦𞤕0; [B1 B5 P1 V5 V6]; [B1 B5 P1 V5 V6] # ᷍σ≮.σ𝪦𞤷0 -T; 򢦾ß\u05B9𐫙.\u05AD\u08A1; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ßֹ𐫙.֭ࢡ -N; 򢦾ß\u05B9𐫙.\u05AD\u08A1; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ßֹ𐫙.֭ࢡ -B; 򢦾SS\u05B9𐫙.\u05AD\u08A1; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ssֹ𐫙.֭ࢡ -B; 򢦾ss\u05B9𐫙.\u05AD\u08A1; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ssֹ𐫙.֭ࢡ -B; 򢦾Ss\u05B9𐫙.\u05AD\u08A1; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ssֹ𐫙.֭ࢡ -B; xn--ss-xjd6058xlz50g.xn--4cb62m; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ssֹ𐫙.֭ࢡ -B; xn--zca89v339zj118e.xn--4cb62m; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ßֹ𐫙.֭ࢡ -B; -𞣄。⒈; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; -𞣄。1.; [B1 V3]; [B1 V3] -B; xn----xc8r.1.; [B1 V3]; [B1 V3] -B; xn----xc8r.xn--tsh; [B1 V3 V6]; [B1 V3 V6] -B; 񈠢𐫖𝟡。\u063E𑘿; [B5 P1 V6]; [B5 P1 V6] # 𐫖9.ؾ𑘿 -B; 񈠢𐫖9。\u063E𑘿; [B5 P1 V6]; [B5 P1 V6] # 𐫖9.ؾ𑘿 -B; xn--9-el5iv442t.xn--9gb0830l; [B5 V6]; [B5 V6] # 𐫖9.ؾ𑘿 -T; \u0668\uFC8C\u0668\u1A5D.\u200D; [B1 C2]; [B1] # ٨نم٨ᩝ. -N; \u0668\uFC8C\u0668\u1A5D.\u200D; [B1 C2]; [B1 C2] # ٨نم٨ᩝ. -T; \u0668\u0646\u0645\u0668\u1A5D.\u200D; [B1 C2]; [B1] # ٨نم٨ᩝ. -N; \u0668\u0646\u0645\u0668\u1A5D.\u200D; [B1 C2]; [B1 C2] # ٨نم٨ᩝ. -B; xn--hhbb5hc956w.; [B1]; [B1] # ٨نم٨ᩝ. -B; xn--hhbb5hc956w.xn--1ug; [B1 C2]; [B1 C2] # ٨نم٨ᩝ. -B; 𝟘.Ⴇ󀳑\uFD50񫃱; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 0.Ⴇتجم -B; 0.Ⴇ󀳑\u062A\u062C\u0645񫃱; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 0.Ⴇتجم -B; 0.ⴇ󀳑\u062A\u062C\u0645񫃱; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 0.ⴇتجم -B; 0.xn--pgbe9ez79qd207lvff8b; [B1 B5 V6]; [B1 B5 V6] # 0.ⴇتجم -B; 0.xn--pgbe9e344c2725svff8b; [B1 B5 V6]; [B1 B5 V6] # 0.Ⴇتجم -B; 𝟘.ⴇ󀳑\uFD50񫃱; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 0.ⴇتجم -B; 𑇀▍.⁞ᠰ; [V5]; [V5] -B; xn--9zh3057f.xn--j7e103b; [V5]; [V5] -T; \u200D-\u067A.򏯩; [B1 C2 P1 V6]; [B1 P1 V3 V6] # -ٺ. -N; \u200D-\u067A.򏯩; [B1 C2 P1 V6]; [B1 C2 P1 V6] # -ٺ. -B; xn----qrc.xn--ts49b; [B1 V3 V6]; [B1 V3 V6] # -ٺ. -B; xn----qrc357q.xn--ts49b; [B1 C2 V6]; [B1 C2 V6] # -ٺ. -T; ᠢ𐮂𐫘寐。\u200C≯✳; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6] # ᠢ𐮂𐫘寐.≯✳ -N; ᠢ𐮂𐫘寐。\u200C≯✳; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # ᠢ𐮂𐫘寐.≯✳ -T; ᠢ𐮂𐫘寐。\u200C>\u0338✳; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6] # ᠢ𐮂𐫘寐.≯✳ -N; ᠢ𐮂𐫘寐。\u200C>\u0338✳; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # ᠢ𐮂𐫘寐.≯✳ -T; ᠢ𐮂𐫘寐。\u200C≯✳; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6] # ᠢ𐮂𐫘寐.≯✳ -N; ᠢ𐮂𐫘寐。\u200C≯✳; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # ᠢ𐮂𐫘寐.≯✳ -T; ᠢ𐮂𐫘寐。\u200C>\u0338✳; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6] # ᠢ𐮂𐫘寐.≯✳ -N; ᠢ𐮂𐫘寐。\u200C>\u0338✳; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # ᠢ𐮂𐫘寐.≯✳ -B; xn--46e6675axzzhota.xn--hdh99p; [B1 B5 V6]; [B1 B5 V6] -B; xn--46e6675axzzhota.xn--0ug06gu8f; [B1 B5 C1 V6]; [B1 B5 C1 V6] # ᠢ𐮂𐫘寐.≯✳ -T; \u200D。󸲜ႺႴ𞨇; [B1 B5 B6 C2 P1 V6]; [B5 B6 P1 V6 A4_2] # .ႺႴ -N; \u200D。󸲜ႺႴ𞨇; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 C2 P1 V6] # .ႺႴ -T; \u200D。󸲜ႺႴ𞨇; [B1 B5 B6 C2 P1 V6]; [B5 B6 P1 V6 A4_2] # .ႺႴ -N; \u200D。󸲜ႺႴ𞨇; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 C2 P1 V6] # .ႺႴ -T; \u200D。󸲜ⴚⴔ𞨇; [B1 B5 B6 C2 P1 V6]; [B5 B6 P1 V6 A4_2] # .ⴚⴔ -N; \u200D。󸲜ⴚⴔ𞨇; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 C2 P1 V6] # .ⴚⴔ -T; \u200D。󸲜Ⴚⴔ𞨇; [B1 B5 B6 C2 P1 V6]; [B5 B6 P1 V6 A4_2] # .Ⴚⴔ -N; \u200D。󸲜Ⴚⴔ𞨇; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 C2 P1 V6] # .Ⴚⴔ -B; .xn--ynd036lq981an3r4h; [B5 B6 V6 A4_2]; [B5 B6 V6 A4_2] -B; xn--1ug.xn--ynd036lq981an3r4h; [B1 B5 B6 C2 V6]; [B1 B5 B6 C2 V6] # .Ⴚⴔ -B; .xn--cljl81825an3r4h; [B5 B6 V6 A4_2]; [B5 B6 V6 A4_2] -B; xn--1ug.xn--cljl81825an3r4h; [B1 B5 B6 C2 V6]; [B1 B5 B6 C2 V6] # .ⴚⴔ -B; .xn--sndl01647an3h1h; [B5 B6 V6 A4_2]; [B5 B6 V6 A4_2] -B; xn--1ug.xn--sndl01647an3h1h; [B1 B5 B6 C2 V6]; [B1 B5 B6 C2 V6] # .ႺႴ -T; \u200D。󸲜ⴚⴔ𞨇; [B1 B5 B6 C2 P1 V6]; [B5 B6 P1 V6 A4_2] # .ⴚⴔ -N; \u200D。󸲜ⴚⴔ𞨇; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 C2 P1 V6] # .ⴚⴔ -T; \u200D。󸲜Ⴚⴔ𞨇; [B1 B5 B6 C2 P1 V6]; [B5 B6 P1 V6 A4_2] # .Ⴚⴔ -N; \u200D。󸲜Ⴚⴔ𞨇; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 C2 P1 V6] # .Ⴚⴔ -T; -3.\u200Dヌᢕ; [C2 V3]; [V3] # -3.ヌᢕ -N; -3.\u200Dヌᢕ; [C2 V3]; [C2 V3] # -3.ヌᢕ -B; -3.xn--fbf115j; [V3]; [V3] -B; -3.xn--fbf739aq5o; [C2 V3]; [C2 V3] # -3.ヌᢕ -T; 🂃\u0666ß\u200D。󠠂򭰍𞩒-; [B1 C2 P1 V3 V6]; [B1 P1 V3 V6] # 🂃٦ß.- -N; 🂃\u0666ß\u200D。󠠂򭰍𞩒-; [B1 C2 P1 V3 V6]; [B1 C2 P1 V3 V6] # 🂃٦ß.- -T; 🂃\u0666SS\u200D。󠠂򭰍𞩒-; [B1 C2 P1 V3 V6]; [B1 P1 V3 V6] # 🂃٦ss.- -N; 🂃\u0666SS\u200D。󠠂򭰍𞩒-; [B1 C2 P1 V3 V6]; [B1 C2 P1 V3 V6] # 🂃٦ss.- -T; 🂃\u0666ss\u200D。󠠂򭰍𞩒-; [B1 C2 P1 V3 V6]; [B1 P1 V3 V6] # 🂃٦ss.- -N; 🂃\u0666ss\u200D。󠠂򭰍𞩒-; [B1 C2 P1 V3 V6]; [B1 C2 P1 V3 V6] # 🂃٦ss.- -T; 🂃\u0666Ss\u200D。󠠂򭰍𞩒-; [B1 C2 P1 V3 V6]; [B1 P1 V3 V6] # 🂃٦ss.- -N; 🂃\u0666Ss\u200D。󠠂򭰍𞩒-; [B1 C2 P1 V3 V6]; [B1 C2 P1 V3 V6] # 🂃٦ss.- -B; xn--ss-pyd98921c.xn----nz8rh7531csznt; [B1 V3 V6]; [B1 V3 V6] # 🂃٦ss.- -B; xn--ss-pyd483x5k99b.xn----nz8rh7531csznt; [B1 C2 V3 V6]; [B1 C2 V3 V6] # 🂃٦ss.- -B; xn--zca34z68yzu83b.xn----nz8rh7531csznt; [B1 C2 V3 V6]; [B1 C2 V3 V6] # 🂃٦ß.- -T; ꇟ-𐾺\u069F。򰀺\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ꇟ-ڟ. -N; ꇟ-𐾺\u069F。򰀺\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ꇟ-ڟ. -B; xn----utc4430jd3zd.xn--bp20d; [B5 B6 V6]; [B5 B6 V6] # ꇟ-ڟ. -B; xn----utc4430jd3zd.xn--0ugx6670i; [B5 B6 C1 V6]; [B5 B6 C1 V6] # ꇟ-ڟ. -B; \u0665.\u0484𐨗𝩋𴤃; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ٥.҄𐨗𝩋 -B; xn--eib.xn--n3a0405kus8eft5l; [B1 V5 V6]; [B1 V5 V6] # ٥.҄𐨗𝩋 -B; -.񱼓\u0649𐨿; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # -.ى𐨿 -B; -.xn--lhb4124khbq4b; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] # -.ى𐨿 -T; 󾬨ς.𞶙녫ß; [B2 B3 P1 V6]; [B2 B3 P1 V6] -N; 󾬨ς.𞶙녫ß; [B2 B3 P1 V6]; [B2 B3 P1 V6] -T; 󾬨ς.𞶙녫ß; [B2 B3 P1 V6]; [B2 B3 P1 V6] -N; 󾬨ς.𞶙녫ß; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 󾬨Σ.𞶙녫SS; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 󾬨Σ.𞶙녫SS; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 󾬨σ.𞶙녫ss; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 󾬨σ.𞶙녫ss; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 󾬨Σ.𞶙녫Ss; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 󾬨Σ.𞶙녫Ss; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; xn--4xa76659r.xn--ss-d64i8755h; [B2 B3 V6]; [B2 B3 V6] -B; xn--3xa96659r.xn--zca5051g4h4i; [B2 B3 V6]; [B2 B3 V6] -T; Ⅎ\u17D2\u200D。≠\u200D\u200C; [C1 C2 P1 V6]; [P1 V6] # Ⅎ្.≠ -N; Ⅎ\u17D2\u200D。≠\u200D\u200C; [C1 C2 P1 V6]; [C1 C2 P1 V6] # Ⅎ្.≠ -T; Ⅎ\u17D2\u200D。=\u0338\u200D\u200C; [C1 C2 P1 V6]; [P1 V6] # Ⅎ្.≠ -N; Ⅎ\u17D2\u200D。=\u0338\u200D\u200C; [C1 C2 P1 V6]; [C1 C2 P1 V6] # Ⅎ្.≠ -T; Ⅎ\u17D2\u200D。≠\u200D\u200C; [C1 C2 P1 V6]; [P1 V6] # Ⅎ្.≠ -N; Ⅎ\u17D2\u200D。≠\u200D\u200C; [C1 C2 P1 V6]; [C1 C2 P1 V6] # Ⅎ្.≠ -T; Ⅎ\u17D2\u200D。=\u0338\u200D\u200C; [C1 C2 P1 V6]; [P1 V6] # Ⅎ្.≠ -N; Ⅎ\u17D2\u200D。=\u0338\u200D\u200C; [C1 C2 P1 V6]; [C1 C2 P1 V6] # Ⅎ្.≠ -T; ⅎ\u17D2\u200D。=\u0338\u200D\u200C; [C1 C2 P1 V6]; [P1 V6] # ⅎ្.≠ -N; ⅎ\u17D2\u200D。=\u0338\u200D\u200C; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ⅎ្.≠ -T; ⅎ\u17D2\u200D。≠\u200D\u200C; [C1 C2 P1 V6]; [P1 V6] # ⅎ្.≠ -N; ⅎ\u17D2\u200D。≠\u200D\u200C; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ⅎ្.≠ -B; xn--u4e969b.xn--1ch; [V6]; [V6] # ⅎ្.≠ -B; xn--u4e823bq1a.xn--0ugb89o; [C1 C2 V6]; [C1 C2 V6] # ⅎ្.≠ -B; xn--u4e319b.xn--1ch; [V6]; [V6] # Ⅎ្.≠ -B; xn--u4e823bcza.xn--0ugb89o; [C1 C2 V6]; [C1 C2 V6] # Ⅎ្.≠ -T; ⅎ\u17D2\u200D。=\u0338\u200D\u200C; [C1 C2 P1 V6]; [P1 V6] # ⅎ្.≠ -N; ⅎ\u17D2\u200D。=\u0338\u200D\u200C; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ⅎ្.≠ -T; ⅎ\u17D2\u200D。≠\u200D\u200C; [C1 C2 P1 V6]; [P1 V6] # ⅎ្.≠ -N; ⅎ\u17D2\u200D。≠\u200D\u200C; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ⅎ្.≠ -T; 𐋺\uAAF6\uA953󧦉.\u200C\u1714\u068F; [B1 C1 P1 V6]; [B1 P1 V5 V6] # 𐋺꫶꥓.᜔ڏ -N; 𐋺\uAAF6\uA953󧦉.\u200C\u1714\u068F; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐋺꫶꥓.᜔ڏ -T; 𐋺\uAAF6\uA953󧦉.\u200C\u1714\u068F; [B1 C1 P1 V6]; [B1 P1 V5 V6] # 𐋺꫶꥓.᜔ڏ -N; 𐋺\uAAF6\uA953󧦉.\u200C\u1714\u068F; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐋺꫶꥓.᜔ڏ -B; xn--3j9a14ak27osbz2o.xn--ljb175f; [B1 V5 V6]; [B1 V5 V6] # 𐋺꫶꥓.᜔ڏ -B; xn--3j9a14ak27osbz2o.xn--ljb175f1wg; [B1 C1 V6]; [B1 C1 V6] # 𐋺꫶꥓.᜔ڏ -B; 񺔯\u0FA8.≯; [P1 V6]; [P1 V6] # ྨ.≯ -B; 񺔯\u0FA8.>\u0338; [P1 V6]; [P1 V6] # ྨ.≯ -B; 񺔯\u0FA8.≯; [P1 V6]; [P1 V6] # ྨ.≯ -B; 񺔯\u0FA8.>\u0338; [P1 V6]; [P1 V6] # ྨ.≯ -B; xn--4fd57150h.xn--hdh; [V6]; [V6] # ྨ.≯ -T; \u200D𞡄Ⴓ.𐇽; [B1 B3 B6 C2 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # 𞡄Ⴓ.𐇽 -N; \u200D𞡄Ⴓ.𐇽; [B1 B3 B6 C2 P1 V5 V6]; [B1 B3 B6 C2 P1 V5 V6] # 𞡄Ⴓ.𐇽 -T; \u200D𞡄Ⴓ.𐇽; [B1 B3 B6 C2 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # 𞡄Ⴓ.𐇽 -N; \u200D𞡄Ⴓ.𐇽; [B1 B3 B6 C2 P1 V5 V6]; [B1 B3 B6 C2 P1 V5 V6] # 𞡄Ⴓ.𐇽 -T; \u200D𞡄ⴓ.𐇽; [B1 B3 B6 C2 V5]; [B1 B2 B3 B6 V5] # 𞡄ⴓ.𐇽 -N; \u200D𞡄ⴓ.𐇽; [B1 B3 B6 C2 V5]; [B1 B3 B6 C2 V5] # 𞡄ⴓ.𐇽 -B; xn--blj7492l.xn--m27c; [B1 B2 B3 B6 V5]; [B1 B2 B3 B6 V5] -B; xn--1ugz52c4i16a.xn--m27c; [B1 B3 B6 C2 V5]; [B1 B3 B6 C2 V5] # 𞡄ⴓ.𐇽 -B; xn--rnd5552v.xn--m27c; [B1 B2 B3 B6 V5 V6]; [B1 B2 B3 B6 V5 V6] -B; xn--rnd379ex885a.xn--m27c; [B1 B3 B6 C2 V5 V6]; [B1 B3 B6 C2 V5 V6] # 𞡄Ⴓ.𐇽 -T; \u200D𞡄ⴓ.𐇽; [B1 B3 B6 C2 V5]; [B1 B2 B3 B6 V5] # 𞡄ⴓ.𐇽 -N; \u200D𞡄ⴓ.𐇽; [B1 B3 B6 C2 V5]; [B1 B3 B6 C2 V5] # 𞡄ⴓ.𐇽 -T; 𐪒ß\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ß꣪.ᡤ -N; 𐪒ß\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ß꣪.ᡤ -T; 𐪒ß\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ß꣪.ᡤ -N; 𐪒ß\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ß꣪.ᡤ -B; 𐪒SS\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ss꣪.ᡤ -B; 𐪒ss\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ss꣪.ᡤ -B; 𐪒Ss\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ss꣪.ᡤ -B; xn--ss-tu9hw933a.xn--08e; [B2 B3]; [B2 B3] # 𐪒ss꣪.ᡤ -B; xn--zca2517f2hvc.xn--08e; [B2 B3]; [B2 B3] # 𐪒ß꣪.ᡤ -B; 𐪒SS\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ss꣪.ᡤ -B; 𐪒ss\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ss꣪.ᡤ -B; 𐪒Ss\uA8EA.ᡤ; [B2 B3]; [B2 B3] # 𐪒ss꣪.ᡤ -T; 𐨿󠆌鸮𑚶.ς; [V5]; [V5] -N; 𐨿󠆌鸮𑚶.ς; [V5]; [V5] -B; 𐨿󠆌鸮𑚶.Σ; [V5]; [V5] -B; 𐨿󠆌鸮𑚶.σ; [V5]; [V5] -B; xn--l76a726rt2h.xn--4xa; [V5]; [V5] -B; xn--l76a726rt2h.xn--3xa; [V5]; [V5] -B; ⒗𞤬。-𑚶; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; 16.𞤬。-𑚶; [B1 V3]; [B1 V3] -B; 16.𞤊。-𑚶; [B1 V3]; [B1 V3] -B; 16.xn--ke6h.xn----4j0j; [B1 V3]; [B1 V3] -B; ⒗𞤊。-𑚶; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; xn--8shw466n.xn----4j0j; [B1 V3 V6]; [B1 V3 V6] -B; \u08B3𞤿⾫。𐹣\u068F⒈; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # ࢳ𞤿隹.𐹣ڏ⒈ -B; \u08B3𞤿隹。𐹣\u068F1.; [B1 B2 B3]; [B1 B2 B3] # ࢳ𞤿隹.𐹣ڏ1. -B; \u08B3𞤝隹。𐹣\u068F1.; [B1 B2 B3]; [B1 B2 B3] # ࢳ𞤿隹.𐹣ڏ1. -B; xn--8yb0383efiwk.xn--1-wsc3373r.; [B1 B2 B3]; [B1 B2 B3] # ࢳ𞤿隹.𐹣ڏ1. -B; \u08B3𞤝⾫。𐹣\u068F⒈; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # ࢳ𞤿隹.𐹣ڏ⒈ -B; xn--8yb0383efiwk.xn--ljb064mol4n; [B1 B2 B3 V6]; [B1 B2 B3 V6] # ࢳ𞤿隹.𐹣ڏ⒈ -B; \u2433𚎛𝟧\u0661.ᡢ8\u0F72\u0600; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 5١.ᡢ8ི -B; \u2433𚎛5\u0661.ᡢ8\u0F72\u0600; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 5١.ᡢ8ི -B; xn--5-bqc410un435a.xn--8-rkc763epjj; [B5 B6 V6]; [B5 B6 V6] # 5١.ᡢ8ི -B; 𐹠.🄀⒒-󨰈; [B1 P1 V6]; [B1 P1 V6] -B; 𐹠.0.11.-󨰈; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; xn--7n0d.0.11.xn----8j07m; [B1 V3 V6]; [B1 V3 V6] -B; xn--7n0d.xn----xcp9757q1s13g; [B1 V6]; [B1 V6] -T; ς-。\u200C𝟭-; [C1 V3]; [V3] # ς-.1- -N; ς-。\u200C𝟭-; [C1 V3]; [C1 V3] # ς-.1- -T; ς-。\u200C1-; [C1 V3]; [V3] # ς-.1- -N; ς-。\u200C1-; [C1 V3]; [C1 V3] # ς-.1- -T; Σ-。\u200C1-; [C1 V3]; [V3] # σ-.1- -N; Σ-。\u200C1-; [C1 V3]; [C1 V3] # σ-.1- -T; σ-。\u200C1-; [C1 V3]; [V3] # σ-.1- -N; σ-。\u200C1-; [C1 V3]; [C1 V3] # σ-.1- -B; xn----zmb.1-; [V3]; [V3] -B; xn----zmb.xn--1--i1t; [C1 V3]; [C1 V3] # σ-.1- -B; xn----xmb.xn--1--i1t; [C1 V3]; [C1 V3] # ς-.1- -T; Σ-。\u200C𝟭-; [C1 V3]; [V3] # σ-.1- -N; Σ-。\u200C𝟭-; [C1 V3]; [C1 V3] # σ-.1- -T; σ-。\u200C𝟭-; [C1 V3]; [V3] # σ-.1- -N; σ-。\u200C𝟭-; [C1 V3]; [C1 V3] # σ-.1- -B; \u1734-\u0CE2.󠄩Ⴄ; [P1 V5 V6]; [P1 V5 V6] # ᜴-ೢ.Ⴄ -B; \u1734-\u0CE2.󠄩Ⴄ; [P1 V5 V6]; [P1 V5 V6] # ᜴-ೢ.Ⴄ -B; \u1734-\u0CE2.󠄩ⴄ; [V5]; [V5] # ᜴-ೢ.ⴄ -B; xn----ggf830f.xn--vkj; [V5]; [V5] # ᜴-ೢ.ⴄ -B; xn----ggf830f.xn--cnd; [V5 V6]; [V5 V6] # ᜴-ೢ.Ⴄ -B; \u1734-\u0CE2.󠄩ⴄ; [V5]; [V5] # ᜴-ೢ.ⴄ -B; 򭈗♋\u06BB𐦥。\u0954⒈; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ♋ڻ𐦥.॔⒈ -B; 򭈗♋\u06BB𐦥。\u09541.; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ♋ڻ𐦥.॔1. -B; xn--ukb372n129m3rs7f.xn--1-fyd.; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ♋ڻ𐦥.॔1. -B; xn--ukb372n129m3rs7f.xn--u3b240l; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ♋ڻ𐦥.॔⒈ -T; \u05A4.\u06C1\u1AB3\u200C; [B1 B3 B6 C1 V5]; [B1 B3 B6 V5] # ֤.ہ᪳ -N; \u05A4.\u06C1\u1AB3\u200C; [B1 B3 B6 C1 V5]; [B1 B3 B6 C1 V5] # ֤.ہ᪳ -T; \u05A4.\u06C1\u1AB3\u200C; [B1 B3 B6 C1 V5]; [B1 B3 B6 V5] # ֤.ہ᪳ -N; \u05A4.\u06C1\u1AB3\u200C; [B1 B3 B6 C1 V5]; [B1 B3 B6 C1 V5] # ֤.ہ᪳ -B; xn--vcb.xn--0kb623h; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ֤.ہ᪳ -B; xn--vcb.xn--0kb623hm1d; [B1 B3 B6 C1 V5]; [B1 B3 B6 C1 V5] # ֤.ہ᪳ -B; 񢭏\u0846≮\u0ACD.𞦊; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ࡆ≮્. -B; 񢭏\u0846<\u0338\u0ACD.𞦊; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ࡆ≮્. -B; 񢭏\u0846≮\u0ACD.𞦊; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ࡆ≮્. -B; 񢭏\u0846<\u0338\u0ACD.𞦊; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ࡆ≮્. -B; xn--4vb80kq29ayo62l.xn--8g6h; [B5 B6 V6]; [B5 B6 V6] # ࡆ≮્. -T; \u200D。𞀘⒈ꡍ擉; [C2 P1 V5 V6]; [P1 V5 V6 A4_2] # .𞀘⒈ꡍ擉 -N; \u200D。𞀘⒈ꡍ擉; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .𞀘⒈ꡍ擉 -T; \u200D。𞀘1.ꡍ擉; [C2 V5]; [V5 A4_2] # .𞀘1.ꡍ擉 -N; \u200D。𞀘1.ꡍ擉; [C2 V5]; [C2 V5] # .𞀘1.ꡍ擉 -B; .xn--1-1p4r.xn--s7uv61m; [V5 A4_2]; [V5 A4_2] -B; xn--1ug.xn--1-1p4r.xn--s7uv61m; [C2 V5]; [C2 V5] # .𞀘1.ꡍ擉 -B; .xn--tsh026uql4bew9p; [V5 V6 A4_2]; [V5 V6 A4_2] -B; xn--1ug.xn--tsh026uql4bew9p; [C2 V5 V6]; [C2 V5 V6] # .𞀘⒈ꡍ擉 -B; ₈\u07CB.\uFB64≠; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 8ߋ.ٿ≠ -B; ₈\u07CB.\uFB64=\u0338; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 8ߋ.ٿ≠ -B; 8\u07CB.\u067F≠; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 8ߋ.ٿ≠ -B; 8\u07CB.\u067F=\u0338; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 8ߋ.ٿ≠ -B; xn--8-zbd.xn--4ib883l; [B1 B3 V6]; [B1 B3 V6] # 8ߋ.ٿ≠ -B; ᢡ\u07DE򹐣.⒒\u0642𑍦; [B1 B5 P1 V6]; [B1 B5 P1 V6] # ᢡߞ.⒒ق𑍦 -B; ᢡ\u07DE򹐣.11.\u0642𑍦; [B1 B5 P1 V6]; [B1 B5 P1 V6] # ᢡߞ.11.ق𑍦 -B; xn--5sb596fi873t.11.xn--ehb4198k; [B1 B5 V6]; [B1 B5 V6] # ᢡߞ.11.ق𑍦 -B; xn--5sb596fi873t.xn--ehb336mvy7n; [B1 B5 V6]; [B1 B5 V6] # ᢡߞ.⒒ق𑍦 -B; \u0E48-𐹺𝟜.\u0363\u06E1⒏; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ่-𐹺4.ͣۡ⒏ -B; \u0E48-𐹺4.\u0363\u06E18.; [B1 V5]; [B1 V5] # ่-𐹺4.ͣۡ8. -B; xn---4-owiz479s.xn--8-ihb69x.; [B1 V5]; [B1 V5] # ่-𐹺4.ͣۡ8. -B; xn---4-owiz479s.xn--eva20pjv9a; [B1 V5 V6]; [B1 V5 V6] # ่-𐹺4.ͣۡ⒏ -B; ⫐。Ⴠ-󃐢; [P1 V6]; [P1 V6] -B; ⫐。Ⴠ-󃐢; [P1 V6]; [P1 V6] -B; ⫐。ⴠ-󃐢; [P1 V6]; [P1 V6] -B; xn--r3i.xn----2wst7439i; [V6]; [V6] -B; xn--r3i.xn----z1g58579u; [V6]; [V6] -B; ⫐。ⴠ-󃐢; [P1 V6]; [P1 V6] -B; 𑑂◊.⦟∠; [V5]; [V5] -B; 𑑂◊.⦟∠; [V5]; [V5] -B; xn--01h3338f.xn--79g270a; [V5]; [V5] -B; 𿌰-\u0662。󋸛ꡂ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -٢.ꡂ -B; xn----dqc20828e.xn--bc9an2879c; [B5 B6 V6]; [B5 B6 V6] # -٢.ꡂ -B; \u0678。󠏬\u0741𞪭𐹪; [B1 P1 V6]; [B1 P1 V6] # يٴ.݁𐹪 -B; \u064A\u0674。󠏬\u0741𞪭𐹪; [B1 P1 V6]; [B1 P1 V6] # يٴ.݁𐹪 -B; xn--mhb8f.xn--oob2585kfdsfsbo7h; [B1 V6]; [B1 V6] # يٴ.݁𐹪 -T; 𐫆ꌄ。\u200Dᣬ; [B1 B2 B3 C2]; [B2 B3] # 𐫆ꌄ.ᣬ -N; 𐫆ꌄ。\u200Dᣬ; [B1 B2 B3 C2]; [B1 B2 B3 C2] # 𐫆ꌄ.ᣬ -T; 𐫆ꌄ。\u200Dᣬ; [B1 B2 B3 C2]; [B2 B3] # 𐫆ꌄ.ᣬ -N; 𐫆ꌄ。\u200Dᣬ; [B1 B2 B3 C2]; [B1 B2 B3 C2] # 𐫆ꌄ.ᣬ -B; xn--y77ao18q.xn--wdf; [B2 B3]; [B2 B3] -B; xn--y77ao18q.xn--wdf367a; [B1 B2 B3 C2]; [B1 B2 B3 C2] # 𐫆ꌄ.ᣬ -B; ₀\u0662。󅪞≯-; [B1 B6 P1 V3 V6]; [B1 B6 P1 V3 V6] # 0٢.≯- -B; ₀\u0662。󅪞>\u0338-; [B1 B6 P1 V3 V6]; [B1 B6 P1 V3 V6] # 0٢.≯- -B; 0\u0662。󅪞≯-; [B1 B6 P1 V3 V6]; [B1 B6 P1 V3 V6] # 0٢.≯- -B; 0\u0662。󅪞>\u0338-; [B1 B6 P1 V3 V6]; [B1 B6 P1 V3 V6] # 0٢.≯- -B; xn--0-dqc.xn----ogov3342l; [B1 B6 V3 V6]; [B1 B6 V3 V6] # 0٢.≯- -B; \u031C𐹫-𞯃.𐋤\u0845; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ̜𐹫-.𐋤ࡅ -B; xn----gdb7046r692g.xn--3vb1349j; [B1 V5 V6]; [B1 V5 V6] # ̜𐹫-.𐋤ࡅ -B; ≠。𝩑𐹩Ⴡ\u0594; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≠.𝩑𐹩Ⴡ֔ -B; =\u0338。𝩑𐹩Ⴡ\u0594; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≠.𝩑𐹩Ⴡ֔ -B; ≠。𝩑𐹩Ⴡ\u0594; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≠.𝩑𐹩Ⴡ֔ -B; =\u0338。𝩑𐹩Ⴡ\u0594; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≠.𝩑𐹩Ⴡ֔ -B; =\u0338。𝩑𐹩ⴡ\u0594; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≠.𝩑𐹩ⴡ֔ -B; ≠。𝩑𐹩ⴡ\u0594; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≠.𝩑𐹩ⴡ֔ -B; xn--1ch.xn--fcb363rk03mypug; [B1 V5 V6]; [B1 V5 V6] # ≠.𝩑𐹩ⴡ֔ -B; xn--1ch.xn--fcb538c649rypog; [B1 V5 V6]; [B1 V5 V6] # ≠.𝩑𐹩Ⴡ֔ -B; =\u0338。𝩑𐹩ⴡ\u0594; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≠.𝩑𐹩ⴡ֔ -B; ≠。𝩑𐹩ⴡ\u0594; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≠.𝩑𐹩ⴡ֔ -B; 𖫳≠.Ⴀ𐮀; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] -B; 𖫳=\u0338.Ⴀ𐮀; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] -B; 𖫳=\u0338.ⴀ𐮀; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] -B; 𖫳≠.ⴀ𐮀; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] -B; xn--1ch9250k.xn--rkj6232e; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] -B; xn--1ch9250k.xn--7md2659j; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] -B; 󠅾\u0736\u0726.ᢚ閪\u08E2𝩟; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ܶܦ.ᢚ閪𝩟 -B; 󠅾\u0736\u0726.ᢚ閪\u08E2𝩟; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ܶܦ.ᢚ閪𝩟 -B; xn--wnb5a.xn--l0b161fis8gbp5m; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ܶܦ.ᢚ閪𝩟 -T; \u200D󠇜\u06CB\uA8E9。\u20DD\u0FB0-ᛟ; [B1 C2 V5]; [B1 V5] # ۋ꣩.⃝ྰ-ᛟ -N; \u200D󠇜\u06CB\uA8E9。\u20DD\u0FB0-ᛟ; [B1 C2 V5]; [B1 C2 V5] # ۋ꣩.⃝ྰ-ᛟ -T; \u200D󠇜\u06CB\uA8E9。\u20DD\u0FB0-ᛟ; [B1 C2 V5]; [B1 V5] # ۋ꣩.⃝ྰ-ᛟ -N; \u200D󠇜\u06CB\uA8E9。\u20DD\u0FB0-ᛟ; [B1 C2 V5]; [B1 C2 V5] # ۋ꣩.⃝ྰ-ᛟ -B; xn--blb8114f.xn----gmg236cj6k; [B1 V5]; [B1 V5] # ۋ꣩.⃝ྰ-ᛟ -B; xn--blb540ke10h.xn----gmg236cj6k; [B1 C2 V5]; [B1 C2 V5] # ۋ꣩.⃝ྰ-ᛟ -B; 헁󘖙\u0E3A󚍚。\u06BA𝟜; [P1 V6]; [P1 V6] # 헁ฺ.ں4 -B; 헁󘖙\u0E3A󚍚。\u06BA𝟜; [P1 V6]; [P1 V6] # 헁ฺ.ں4 -B; 헁󘖙\u0E3A󚍚。\u06BA4; [P1 V6]; [P1 V6] # 헁ฺ.ں4 -B; 헁󘖙\u0E3A󚍚。\u06BA4; [P1 V6]; [P1 V6] # 헁ฺ.ں4 -B; xn--o4c1723h8g85gt4ya.xn--4-dvc; [V6]; [V6] # 헁ฺ.ں4 -T; 𐹭。󃱂\u200CႾ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹭.Ⴞ -N; 𐹭。󃱂\u200CႾ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹭.Ⴞ -T; 𐹭。󃱂\u200CႾ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹭.Ⴞ -N; 𐹭。󃱂\u200CႾ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹭.Ⴞ -T; 𐹭。󃱂\u200Cⴞ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹭.ⴞ -N; 𐹭。󃱂\u200Cⴞ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹭.ⴞ -B; xn--lo0d.xn--mljx1099g; [B1 V6]; [B1 V6] -B; xn--lo0d.xn--0ugx72cwi33v; [B1 C1 V6]; [B1 C1 V6] # 𐹭.ⴞ -B; xn--lo0d.xn--2nd75260n; [B1 V6]; [B1 V6] -B; xn--lo0d.xn--2nd949eqw95u; [B1 C1 V6]; [B1 C1 V6] # 𐹭.Ⴞ -T; 𐹭。󃱂\u200Cⴞ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹭.ⴞ -N; 𐹭。󃱂\u200Cⴞ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹭.ⴞ -B; \uA953.\u033D𑂽馋; [P1 V5 V6]; [P1 V5 V6] # ꥓.̽馋 -B; xn--3j9a.xn--bua0708eqzrd; [V5 V6]; [V5 V6] # ꥓.̽馋 -T; 󈫝򪛸\u200D。䜖; [C2 P1 V6]; [P1 V6] # .䜖 -N; 󈫝򪛸\u200D。䜖; [C2 P1 V6]; [C2 P1 V6] # .䜖 -T; 󈫝򪛸\u200D。䜖; [C2 P1 V6]; [P1 V6] # .䜖 -N; 󈫝򪛸\u200D。䜖; [C2 P1 V6]; [C2 P1 V6] # .䜖 -B; xn--g138cxw05a.xn--k0o; [V6]; [V6] -B; xn--1ug30527h9mxi.xn--k0o; [C2 V6]; [C2 V6] # .䜖 -T; ᡯ⚉姶🄉.۷\u200D🎪\u200D; [C2 P1 V6]; [P1 V6] # ᡯ⚉姶🄉.۷🎪 -N; ᡯ⚉姶🄉.۷\u200D🎪\u200D; [C2 P1 V6]; [C2 P1 V6] # ᡯ⚉姶🄉.۷🎪 -T; ᡯ⚉姶8,.۷\u200D🎪\u200D; [C2 P1 V6]; [P1 V6] # ᡯ⚉姶8,.۷🎪 -N; ᡯ⚉姶8,.۷\u200D🎪\u200D; [C2 P1 V6]; [C2 P1 V6] # ᡯ⚉姶8,.۷🎪 -B; xn--8,-g9oy26fzu4d.xn--kmb6733w; [P1 V6]; [P1 V6] -B; xn--8,-g9oy26fzu4d.xn--kmb859ja94998b; [C2 P1 V6]; [C2 P1 V6] # ᡯ⚉姶8,.۷🎪 -B; xn--c9e433epi4b3j20a.xn--kmb6733w; [V6]; [V6] -B; xn--c9e433epi4b3j20a.xn--kmb859ja94998b; [C2 V6]; [C2 V6] # ᡯ⚉姶🄉.۷🎪 -B; 𞽀.𐹸🚖\u0E3A; [B1 P1 V6]; [B1 P1 V6] # .𐹸🚖ฺ -B; xn--0n7h.xn--o4c9032klszf; [B1 V6]; [B1 V6] # .𐹸🚖ฺ -B; Ⴔᠵ。𐹧\u0747۹; [B1 P1 V6]; [B1 P1 V6] # Ⴔᠵ.𐹧݇۹ -B; Ⴔᠵ。𐹧\u0747۹; [B1 P1 V6]; [B1 P1 V6] # Ⴔᠵ.𐹧݇۹ -B; ⴔᠵ。𐹧\u0747۹; [B1]; [B1] # ⴔᠵ.𐹧݇۹ -B; xn--o7e997h.xn--mmb9ml895e; [B1]; [B1] # ⴔᠵ.𐹧݇۹ -B; xn--snd659a.xn--mmb9ml895e; [B1 V6]; [B1 V6] # Ⴔᠵ.𐹧݇۹ -B; ⴔᠵ。𐹧\u0747۹; [B1]; [B1] # ⴔᠵ.𐹧݇۹ -T; \u135Fᡈ\u200C.︒-𖾐-; [C1 P1 V3 V5 V6]; [P1 V3 V5 V6] # ፟ᡈ.︒-𖾐- -N; \u135Fᡈ\u200C.︒-𖾐-; [C1 P1 V3 V5 V6]; [C1 P1 V3 V5 V6] # ፟ᡈ.︒-𖾐- -T; \u135Fᡈ\u200C.。-𖾐-; [C1 V3 V5 A4_2]; [V3 V5 A4_2] # ፟ᡈ..-𖾐- -N; \u135Fᡈ\u200C.。-𖾐-; [C1 V3 V5 A4_2]; [C1 V3 V5 A4_2] # ፟ᡈ..-𖾐- -B; xn--b7d82w..xn-----pe4u; [V3 V5 A4_2]; [V3 V5 A4_2] # ፟ᡈ..-𖾐- -B; xn--b7d82wo4h..xn-----pe4u; [C1 V3 V5 A4_2]; [C1 V3 V5 A4_2] # ፟ᡈ..-𖾐- -B; xn--b7d82w.xn-----c82nz547a; [V3 V5 V6]; [V3 V5 V6] # ፟ᡈ.︒-𖾐- -B; xn--b7d82wo4h.xn-----c82nz547a; [C1 V3 V5 V6]; [C1 V3 V5 V6] # ፟ᡈ.︒-𖾐- -T; ⒈\u0601⒖\u200C.\u1DF0\u07DB; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # ⒈⒖.ᷰߛ -N; ⒈\u0601⒖\u200C.\u1DF0\u07DB; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # ⒈⒖.ᷰߛ -T; 1.\u060115.\u200C.\u1DF0\u07DB; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6 A4_2] # 1.15..ᷰߛ -N; 1.\u060115.\u200C.\u1DF0\u07DB; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 1.15..ᷰߛ -B; 1.xn--15-1pd..xn--2sb914i; [B1 V5 V6 A4_2]; [B1 V5 V6 A4_2] # 1.15..ᷰߛ -B; 1.xn--15-1pd.xn--0ug.xn--2sb914i; [B1 C1 V5 V6]; [B1 C1 V5 V6] # 1.15..ᷰߛ -B; xn--jfb347mib.xn--2sb914i; [B1 V5 V6]; [B1 V5 V6] # ⒈⒖.ᷰߛ -B; xn--jfb844kmfdwb.xn--2sb914i; [B1 C1 V5 V6]; [B1 C1 V5 V6] # ⒈⒖.ᷰߛ -B; 𝩜。-\u0B4DႫ; [P1 V3 V5 V6]; [P1 V3 V5 V6] # 𝩜.-୍Ⴋ -B; 𝩜。-\u0B4Dⴋ; [V3 V5]; [V3 V5] # 𝩜.-୍ⴋ -B; xn--792h.xn----bse820x; [V3 V5]; [V3 V5] # 𝩜.-୍ⴋ -B; xn--792h.xn----bse632b; [V3 V5 V6]; [V3 V5 V6] # 𝩜.-୍Ⴋ -T; ßჀ.\u0620刯Ⴝ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ßჀ.ؠ刯Ⴝ -N; ßჀ.\u0620刯Ⴝ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ßჀ.ؠ刯Ⴝ -T; ßⴠ.\u0620刯ⴝ; [B2 B3]; [B2 B3] # ßⴠ.ؠ刯ⴝ -N; ßⴠ.\u0620刯ⴝ; [B2 B3]; [B2 B3] # ßⴠ.ؠ刯ⴝ -B; SSჀ.\u0620刯Ⴝ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ssჀ.ؠ刯Ⴝ -B; ssⴠ.\u0620刯ⴝ; [B2 B3]; [B2 B3] # ssⴠ.ؠ刯ⴝ -B; Ssⴠ.\u0620刯Ⴝ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ssⴠ.ؠ刯Ⴝ -B; xn--ss-j81a.xn--fgb845cb66c; [B2 B3 V6]; [B2 B3 V6] # ssⴠ.ؠ刯Ⴝ -B; xn--ss-j81a.xn--fgb670rovy; [B2 B3]; [B2 B3] # ssⴠ.ؠ刯ⴝ -B; xn--ss-wgk.xn--fgb845cb66c; [B2 B3 V6]; [B2 B3 V6] # ssჀ.ؠ刯Ⴝ -B; xn--zca277t.xn--fgb670rovy; [B2 B3]; [B2 B3] # ßⴠ.ؠ刯ⴝ -B; xn--zca442f.xn--fgb845cb66c; [B2 B3 V6]; [B2 B3 V6] # ßჀ.ؠ刯Ⴝ -B; \u1BAAႣℲ。ᠳ툻\u0673; [B5 B6 P1 V5 V6]; [B5 B6 P1 V5 V6] # ᮪ႣℲ.ᠳ툻ٳ -B; \u1BAAႣℲ。ᠳ툻\u0673; [B5 B6 P1 V5 V6]; [B5 B6 P1 V5 V6] # ᮪ႣℲ.ᠳ툻ٳ -B; \u1BAAႣℲ。ᠳ툻\u0673; [B5 B6 P1 V5 V6]; [B5 B6 P1 V5 V6] # ᮪ႣℲ.ᠳ툻ٳ -B; \u1BAAႣℲ。ᠳ툻\u0673; [B5 B6 P1 V5 V6]; [B5 B6 P1 V5 V6] # ᮪ႣℲ.ᠳ툻ٳ -B; \u1BAAⴃⅎ。ᠳ툻\u0673; [B5 B6 V5]; [B5 B6 V5] # ᮪ⴃⅎ.ᠳ툻ٳ -B; \u1BAAⴃⅎ。ᠳ툻\u0673; [B5 B6 V5]; [B5 B6 V5] # ᮪ⴃⅎ.ᠳ툻ٳ -B; \u1BAAႣⅎ。ᠳ툻\u0673; [B5 B6 P1 V5 V6]; [B5 B6 P1 V5 V6] # ᮪Ⴃⅎ.ᠳ툻ٳ -B; \u1BAAႣⅎ。ᠳ툻\u0673; [B5 B6 P1 V5 V6]; [B5 B6 P1 V5 V6] # ᮪Ⴃⅎ.ᠳ툻ٳ -B; xn--bnd957c2pe.xn--sib102gc69k; [B5 B6 V5 V6]; [B5 B6 V5 V6] # ᮪Ⴃⅎ.ᠳ툻ٳ -B; xn--yxf24x4ol.xn--sib102gc69k; [B5 B6 V5]; [B5 B6 V5] # ᮪ⴃⅎ.ᠳ툻ٳ -B; xn--bnd957cone.xn--sib102gc69k; [B5 B6 V5 V6]; [B5 B6 V5 V6] # ᮪ႣℲ.ᠳ툻ٳ -B; \u1BAAⴃⅎ。ᠳ툻\u0673; [B5 B6 V5]; [B5 B6 V5] # ᮪ⴃⅎ.ᠳ툻ٳ -B; \u1BAAⴃⅎ。ᠳ툻\u0673; [B5 B6 V5]; [B5 B6 V5] # ᮪ⴃⅎ.ᠳ툻ٳ -B; \u1BAAႣⅎ。ᠳ툻\u0673; [B5 B6 P1 V5 V6]; [B5 B6 P1 V5 V6] # ᮪Ⴃⅎ.ᠳ툻ٳ -B; \u1BAAႣⅎ。ᠳ툻\u0673; [B5 B6 P1 V5 V6]; [B5 B6 P1 V5 V6] # ᮪Ⴃⅎ.ᠳ툻ٳ -B; \u06EC.\u08A2𐹫\u067C; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ۬.ࢢ𐹫ټ -B; xn--8lb.xn--1ib31ily45b; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ۬.ࢢ𐹫ټ -B; \u06B6\u06DF。₇\uA806; [B1]; [B1] # ڶ۟.7꠆ -B; \u06B6\u06DF。7\uA806; [B1]; [B1] # ڶ۟.7꠆ -B; xn--pkb6f.xn--7-x93e; [B1]; [B1] # ڶ۟.7꠆ -B; \u06B6\u06DF.7\uA806; [B1]; [B1] # ڶ۟.7꠆ -T; Ⴣ𐹻.\u200C𝪣≮󠩉; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V5 V6] # Ⴣ𐹻.𝪣≮ -N; Ⴣ𐹻.\u200C𝪣≮󠩉; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # Ⴣ𐹻.𝪣≮ -T; Ⴣ𐹻.\u200C𝪣<\u0338󠩉; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V5 V6] # Ⴣ𐹻.𝪣≮ -N; Ⴣ𐹻.\u200C𝪣<\u0338󠩉; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # Ⴣ𐹻.𝪣≮ -T; ⴣ𐹻.\u200C𝪣<\u0338󠩉; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V5 V6] # ⴣ𐹻.𝪣≮ -N; ⴣ𐹻.\u200C𝪣<\u0338󠩉; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # ⴣ𐹻.𝪣≮ -T; ⴣ𐹻.\u200C𝪣≮󠩉; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V5 V6] # ⴣ𐹻.𝪣≮ -N; ⴣ𐹻.\u200C𝪣≮󠩉; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # ⴣ𐹻.𝪣≮ -B; xn--rlj6323e.xn--gdh4944ob3x3e; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] -B; xn--rlj6323e.xn--0ugy6gn120eb103g; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # ⴣ𐹻.𝪣≮ -B; xn--7nd8101k.xn--gdh4944ob3x3e; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] -B; xn--7nd8101k.xn--0ugy6gn120eb103g; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # Ⴣ𐹻.𝪣≮ -T; 𝟵隁⯮.\u180D\u200C; [C1]; xn--9-mfs8024b. # 9隁⯮. -N; 𝟵隁⯮.\u180D\u200C; [C1]; [C1] # 9隁⯮. -T; 9隁⯮.\u180D\u200C; [C1]; xn--9-mfs8024b. # 9隁⯮. -N; 9隁⯮.\u180D\u200C; [C1]; [C1] # 9隁⯮. -B; xn--9-mfs8024b.; 9隁⯮.; xn--9-mfs8024b.; NV8 -B; 9隁⯮.; ; xn--9-mfs8024b.; NV8 -B; xn--9-mfs8024b.xn--0ug; [C1]; [C1] # 9隁⯮. -B; ⒏𐹧。Ⴣ\u0F84彦; [B1 P1 V6]; [B1 P1 V6] # ⒏𐹧.Ⴣ྄彦 -B; 8.𐹧。Ⴣ\u0F84彦; [B1 P1 V6]; [B1 P1 V6] # 8.𐹧.Ⴣ྄彦 -B; 8.𐹧。ⴣ\u0F84彦; [B1]; [B1] # 8.𐹧.ⴣ྄彦 -B; 8.xn--fo0d.xn--3ed972m6o8a; [B1]; [B1] # 8.𐹧.ⴣ྄彦 -B; 8.xn--fo0d.xn--3ed15dt93o; [B1 V6]; [B1 V6] # 8.𐹧.Ⴣ྄彦 -B; ⒏𐹧。ⴣ\u0F84彦; [B1 P1 V6]; [B1 P1 V6] # ⒏𐹧.ⴣ྄彦 -B; xn--0sh2466f.xn--3ed972m6o8a; [B1 V6]; [B1 V6] # ⒏𐹧.ⴣ྄彦 -B; xn--0sh2466f.xn--3ed15dt93o; [B1 V6]; [B1 V6] # ⒏𐹧.Ⴣ྄彦 -B; -问񬰔⒛。\u0604-񜗉橬; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -问⒛.-橬 -B; -问񬰔20.。\u0604-񜗉橬; [B1 P1 V3 V6 A4_2]; [B1 P1 V3 V6 A4_2] # -问20..-橬 -B; xn---20-658jx1776d..xn----ykc7228efm46d; [B1 V3 V6 A4_2]; [B1 V3 V6 A4_2] # -问20..-橬 -B; xn----hdpu849bhis3e.xn----ykc7228efm46d; [B1 V3 V6]; [B1 V3 V6] # -问⒛.-橬 -T; \u1BACႬ\u200C\u0325。𝟸; [C1 P1 V5 V6]; [P1 V5 V6] # ᮬႬ̥.2 -N; \u1BACႬ\u200C\u0325。𝟸; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ᮬႬ̥.2 -T; \u1BACႬ\u200C\u0325。2; [C1 P1 V5 V6]; [P1 V5 V6] # ᮬႬ̥.2 -N; \u1BACႬ\u200C\u0325。2; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ᮬႬ̥.2 -T; \u1BACⴌ\u200C\u0325。2; [C1 V5]; [V5] # ᮬⴌ̥.2 -N; \u1BACⴌ\u200C\u0325。2; [C1 V5]; [C1 V5] # ᮬⴌ̥.2 -B; xn--mta176jjjm.2; [V5]; [V5] # ᮬⴌ̥.2 -B; xn--mta176j97cl2q.2; [C1 V5]; [C1 V5] # ᮬⴌ̥.2 -B; xn--mta930emri.2; [V5 V6]; [V5 V6] # ᮬႬ̥.2 -B; xn--mta930emribme.2; [C1 V5 V6]; [C1 V5 V6] # ᮬႬ̥.2 -T; \u1BACⴌ\u200C\u0325。𝟸; [C1 V5]; [V5] # ᮬⴌ̥.2 -N; \u1BACⴌ\u200C\u0325。𝟸; [C1 V5]; [C1 V5] # ᮬⴌ̥.2 -B; \uDC5F。\uA806\u0669󠒩; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # .꠆٩ -B; \uDC5F.xn--iib9583fusy0i; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # .꠆٩ -B; \uDC5F.XN--IIB9583FUSY0I; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # .꠆٩ -B; \uDC5F.Xn--Iib9583fusy0i; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # .꠆٩ -B; 󠄁\u035F⾶。₇︒눇≮; [P1 V5 V6]; [P1 V5 V6] # ͟飛.7︒눇≮ -B; 󠄁\u035F⾶。₇︒눇<\u0338; [P1 V5 V6]; [P1 V5 V6] # ͟飛.7︒눇≮ -B; 󠄁\u035F飛。7。눇≮; [P1 V5 V6]; [P1 V5 V6] # ͟飛.7.눇≮ -B; 󠄁\u035F飛。7。눇<\u0338; [P1 V5 V6]; [P1 V5 V6] # ͟飛.7.눇≮ -B; xn--9ua0567e.7.xn--gdh6767c; [V5 V6]; [V5 V6] # ͟飛.7.눇≮ -B; xn--9ua0567e.xn--7-ngou006d1ttc; [V5 V6]; [V5 V6] # ͟飛.7︒눇≮ -T; \u200C\uFE09𐹴\u200D.\u200C⿃; [B1 C1 C2]; [B1] # 𐹴.鳥 -N; \u200C\uFE09𐹴\u200D.\u200C⿃; [B1 C1 C2]; [B1 C1 C2] # 𐹴.鳥 -T; \u200C\uFE09𐹴\u200D.\u200C鳥; [B1 C1 C2]; [B1] # 𐹴.鳥 -N; \u200C\uFE09𐹴\u200D.\u200C鳥; [B1 C1 C2]; [B1 C1 C2] # 𐹴.鳥 -B; xn--so0d.xn--6x6a; [B1]; [B1] -B; xn--0ugc6024p.xn--0ug1920c; [B1 C1 C2]; [B1 C1 C2] # 𐹴.鳥 -T; 🍮.\u200D󠗒𐦁𝨝; [B1 C2 P1 V6]; [B1 P1 V6] # 🍮.𐦁𝨝 -N; 🍮.\u200D󠗒𐦁𝨝; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 🍮.𐦁𝨝 -T; 🍮.\u200D󠗒𐦁𝨝; [B1 C2 P1 V6]; [B1 P1 V6] # 🍮.𐦁𝨝 -N; 🍮.\u200D󠗒𐦁𝨝; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 🍮.𐦁𝨝 -B; xn--lj8h.xn--ln9ci476aqmr2g; [B1 V6]; [B1 V6] -B; xn--lj8h.xn--1ug6603gr1pfwq37h; [B1 C2 V6]; [B1 C2 V6] # 🍮.𐦁𝨝 -T; \u067D\u0943.𞤓\u200D; [B3 C2]; xn--2ib43l.xn--te6h # ٽृ.𞤵 -N; \u067D\u0943.𞤓\u200D; [B3 C2]; [B3 C2] # ٽृ.𞤵 -T; \u067D\u0943.𞤵\u200D; [B3 C2]; xn--2ib43l.xn--te6h # ٽृ.𞤵 -N; \u067D\u0943.𞤵\u200D; [B3 C2]; [B3 C2] # ٽृ.𞤵 -B; xn--2ib43l.xn--te6h; \u067D\u0943.𞤵; xn--2ib43l.xn--te6h # ٽृ.𞤵 -B; \u067D\u0943.𞤵; ; xn--2ib43l.xn--te6h # ٽृ.𞤵 -B; \u067D\u0943.𞤓; \u067D\u0943.𞤵; xn--2ib43l.xn--te6h # ٽृ.𞤵 -B; xn--2ib43l.xn--1ugy711p; [B3 C2]; [B3 C2] # ٽृ.𞤵 -B; \u0664\u0A4D-.󥜽\u1039񦦐; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ٤੍-.္ -B; \u0664\u0A4D-.󥜽\u1039񦦐; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ٤੍-.္ -B; xn----gqc711a.xn--9jd88234f3qm0b; [B1 V3 V6]; [B1 V3 V6] # ٤੍-.္ -T; 4\u103A-𐹸。\uAA29\u200C𐹴≮; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -N; 4\u103A-𐹸。\uAA29\u200C𐹴≮; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -T; 4\u103A-𐹸。\uAA29\u200C𐹴<\u0338; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -N; 4\u103A-𐹸。\uAA29\u200C𐹴<\u0338; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -T; 4\u103A-𐹸。\uAA29\u200C𐹴≮; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -N; 4\u103A-𐹸。\uAA29\u200C𐹴≮; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -T; 4\u103A-𐹸。\uAA29\u200C𐹴<\u0338; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -N; 4\u103A-𐹸。\uAA29\u200C𐹴<\u0338; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -B; xn--4--e4j7831r.xn--gdh8754cz40c; [B1 V5 V6]; [B1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -B; xn--4--e4j7831r.xn--0ugy6gjy5sl3ud; [B1 C1 V5 V6]; [B1 C1 V5 V6] # 4်-𐹸.ꨩ𐹴≮ -T; \u200C。\uFFA0\u0F84\u0F96; [C1 P1 V6]; [P1 V6 A4_2] # .྄ྖ -N; \u200C。\uFFA0\u0F84\u0F96; [C1 P1 V6]; [C1 P1 V6] # .྄ྖ -T; \u200C。\u1160\u0F84\u0F96; [C1 P1 V6]; [P1 V6 A4_2] # .྄ྖ -N; \u200C。\u1160\u0F84\u0F96; [C1 P1 V6]; [C1 P1 V6] # .྄ྖ -B; .xn--3ed0b20h; [V6 A4_2]; [V6 A4_2] # .྄ྖ -B; xn--0ug.xn--3ed0b20h; [C1 V6]; [C1 V6] # .྄ྖ -B; .xn--3ed0by082k; [V6 A4_2]; [V6 A4_2] # .྄ྖ -B; xn--0ug.xn--3ed0by082k; [C1 V6]; [C1 V6] # .྄ྖ -T; ≯򍘅.\u200D𐅼򲇛; [C2 P1 V6]; [P1 V6] # ≯.𐅼 -N; ≯򍘅.\u200D𐅼򲇛; [C2 P1 V6]; [C2 P1 V6] # ≯.𐅼 -T; >\u0338򍘅.\u200D𐅼򲇛; [C2 P1 V6]; [P1 V6] # ≯.𐅼 -N; >\u0338򍘅.\u200D𐅼򲇛; [C2 P1 V6]; [C2 P1 V6] # ≯.𐅼 -T; ≯򍘅.\u200D𐅼򲇛; [C2 P1 V6]; [P1 V6] # ≯.𐅼 -N; ≯򍘅.\u200D𐅼򲇛; [C2 P1 V6]; [C2 P1 V6] # ≯.𐅼 -T; >\u0338򍘅.\u200D𐅼򲇛; [C2 P1 V6]; [P1 V6] # ≯.𐅼 -N; >\u0338򍘅.\u200D𐅼򲇛; [C2 P1 V6]; [C2 P1 V6] # ≯.𐅼 -B; xn--hdh84488f.xn--xy7cw2886b; [V6]; [V6] -B; xn--hdh84488f.xn--1ug8099fbjp4e; [C2 V6]; [C2 V6] # ≯.𐅼 -T; \u0641ß𐰯。𝟕𐫫; [B1 B2]; [B1 B2] # فß𐰯.7𐫫 -N; \u0641ß𐰯。𝟕𐫫; [B1 B2]; [B1 B2] # فß𐰯.7𐫫 -T; \u0641ß𐰯。7𐫫; [B1 B2]; [B1 B2] # فß𐰯.7𐫫 -N; \u0641ß𐰯。7𐫫; [B1 B2]; [B1 B2] # فß𐰯.7𐫫 -B; \u0641SS𐰯。7𐫫; [B1 B2]; [B1 B2] # فss𐰯.7𐫫 -B; \u0641ss𐰯。7𐫫; [B1 B2]; [B1 B2] # فss𐰯.7𐫫 -B; \u0641Ss𐰯。7𐫫; [B1 B2]; [B1 B2] # فss𐰯.7𐫫 -B; xn--ss-jvd2339x.xn--7-mm5i; [B1 B2]; [B1 B2] # فss𐰯.7𐫫 -B; xn--zca96ys96y.xn--7-mm5i; [B1 B2]; [B1 B2] # فß𐰯.7𐫫 -B; \u0641SS𐰯。𝟕𐫫; [B1 B2]; [B1 B2] # فss𐰯.7𐫫 -B; \u0641ss𐰯。𝟕𐫫; [B1 B2]; [B1 B2] # فss𐰯.7𐫫 -B; \u0641Ss𐰯。𝟕𐫫; [B1 B2]; [B1 B2] # فss𐰯.7𐫫 -T; ß\u07AC\u07A7\u08B1。𐭁􅮙𐹲; [B2 B5 B6 P1 V6]; [B2 B5 B6 P1 V6] # ßެާࢱ.𐭁𐹲 -N; ß\u07AC\u07A7\u08B1。𐭁􅮙𐹲; [B2 B5 B6 P1 V6]; [B2 B5 B6 P1 V6] # ßެާࢱ.𐭁𐹲 -B; SS\u07AC\u07A7\u08B1。𐭁􅮙𐹲; [B2 B5 B6 P1 V6]; [B2 B5 B6 P1 V6] # ssެާࢱ.𐭁𐹲 -B; ss\u07AC\u07A7\u08B1。𐭁􅮙𐹲; [B2 B5 B6 P1 V6]; [B2 B5 B6 P1 V6] # ssެާࢱ.𐭁𐹲 -B; Ss\u07AC\u07A7\u08B1。𐭁􅮙𐹲; [B2 B5 B6 P1 V6]; [B2 B5 B6 P1 V6] # ssެާࢱ.𐭁𐹲 -B; xn--ss-9qet02k.xn--e09co8cr9861c; [B2 B5 B6 V6]; [B2 B5 B6 V6] # ssެާࢱ.𐭁𐹲 -B; xn--zca685aoa95h.xn--e09co8cr9861c; [B2 B5 B6 V6]; [B2 B5 B6 V6] # ßެާࢱ.𐭁𐹲 -B; -。󠉗⒌𞯛; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; -。󠉗5.𞯛; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; -.xn--5-zz21m.xn--6x6h; [B1 V3 V6]; [B1 V3 V6] -B; -.xn--xsh6367n1bi3e; [B1 V3 V6]; [B1 V3 V6] -T; 𼎏ς.-≮\uFCAB; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ς.-≮خج -N; 𼎏ς.-≮\uFCAB; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ς.-≮خج -T; 𼎏ς.-<\u0338\uFCAB; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ς.-≮خج -N; 𼎏ς.-<\u0338\uFCAB; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ς.-≮خج -T; 𼎏ς.-≮\u062E\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ς.-≮خج -N; 𼎏ς.-≮\u062E\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ς.-≮خج -T; 𼎏ς.-<\u0338\u062E\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ς.-≮خج -N; 𼎏ς.-<\u0338\u062E\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ς.-≮خج -B; 𼎏Σ.-<\u0338\u062E\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # σ.-≮خج -B; 𼎏Σ.-≮\u062E\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # σ.-≮خج -B; 𼎏σ.-≮\u062E\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # σ.-≮خج -B; 𼎏σ.-<\u0338\u062E\u062C; [B1 P1 V3 V6]; [B1 P1 V3 V6] # σ.-≮خج -B; xn--4xa92520c.xn----9mcf1400a; [B1 V3 V6]; [B1 V3 V6] # σ.-≮خج -B; xn--3xa13520c.xn----9mcf1400a; [B1 V3 V6]; [B1 V3 V6] # ς.-≮خج -B; 𼎏Σ.-<\u0338\uFCAB; [B1 P1 V3 V6]; [B1 P1 V3 V6] # σ.-≮خج -B; 𼎏Σ.-≮\uFCAB; [B1 P1 V3 V6]; [B1 P1 V3 V6] # σ.-≮خج -B; 𼎏σ.-≮\uFCAB; [B1 P1 V3 V6]; [B1 P1 V3 V6] # σ.-≮خج -B; 𼎏σ.-<\u0338\uFCAB; [B1 P1 V3 V6]; [B1 P1 V3 V6] # σ.-≮خج -B; ꡗ\u08B8\u0719.񔤔󠛙\u0C4D\uFC3E; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ꡗࢸܙ.్كي -B; ꡗ\u08B8\u0719.񔤔󠛙\u0C4D\u0643\u064A; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ꡗࢸܙ.్كي -B; xn--jnb34fs003a.xn--fhbo927bk128mpi24d; [B5 B6 V6]; [B5 B6 V6] # ꡗࢸܙ.్كي -B; 𐠰\u08B7𞤌𐫭。𐋦\u17CD𝩃; [B1]; [B1] # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 -B; 𐠰\u08B7𞤮𐫭。𐋦\u17CD𝩃; [B1]; [B1] # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 -B; xn--dzb5191kezbrw47a.xn--p4e3841jz9tf; [B1]; [B1] # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 -B; 𐠰\u08B7𞤮𐫭.𐋦\u17CD𝩃; [B1]; [B1] # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 -B; 𐠰\u08B7𞤌𐫭.𐋦\u17CD𝩃; [B1]; [B1] # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 -T; ₂㘷--。\u06D3\u200C𐫆𑖿; [B1 C1 V2 V3]; [B1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -N; ₂㘷--。\u06D3\u200C𐫆𑖿; [B1 C1 V2 V3]; [B1 C1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -T; ₂㘷--。\u06D2\u0654\u200C𐫆𑖿; [B1 C1 V2 V3]; [B1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -N; ₂㘷--。\u06D2\u0654\u200C𐫆𑖿; [B1 C1 V2 V3]; [B1 C1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -T; 2㘷--。\u06D3\u200C𐫆𑖿; [B1 C1 V2 V3]; [B1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -N; 2㘷--。\u06D3\u200C𐫆𑖿; [B1 C1 V2 V3]; [B1 C1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -T; 2㘷--。\u06D2\u0654\u200C𐫆𑖿; [B1 C1 V2 V3]; [B1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -N; 2㘷--。\u06D2\u0654\u200C𐫆𑖿; [B1 C1 V2 V3]; [B1 C1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -B; xn--2---u58b.xn--jlb8024k14g; [B1 V2 V3]; [B1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -B; xn--2---u58b.xn--jlb820ku99nbgj; [B1 C1 V2 V3]; [B1 C1 V2 V3] # 2㘷--.ۓ𐫆𑖿 -B; -𘊻.ᡮ\u062D-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # -𘊻.ᡮح- -B; -𘊻.ᡮ\u062D-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # -𘊻.ᡮح- -B; xn----bp5n.xn----bnc231l; [B1 B5 B6 V3]; [B1 B5 B6 V3] # -𘊻.ᡮح- -T; \u200C-ß。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 V3] # -ß.ᢣ𐹭ؿ -N; \u200C-ß。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ß.ᢣ𐹭ؿ -T; \u200C-ß。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 V3] # -ß.ᢣ𐹭ؿ -N; \u200C-ß。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ß.ᢣ𐹭ؿ -T; \u200C-SS。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 V3] # -ss.ᢣ𐹭ؿ -N; \u200C-SS。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ss.ᢣ𐹭ؿ -T; \u200C-ss。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 V3] # -ss.ᢣ𐹭ؿ -N; \u200C-ss。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ss.ᢣ𐹭ؿ -T; \u200C-Ss。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 V3] # -ss.ᢣ𐹭ؿ -N; \u200C-Ss。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ss.ᢣ𐹭ؿ -B; -ss.xn--bhb925glx3p; [B1 B5 B6 V3]; [B1 B5 B6 V3] # -ss.ᢣ𐹭ؿ -B; xn---ss-8m0a.xn--bhb925glx3p; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ss.ᢣ𐹭ؿ -B; xn----qfa550v.xn--bhb925glx3p; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ß.ᢣ𐹭ؿ -T; \u200C-SS。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 V3] # -ss.ᢣ𐹭ؿ -N; \u200C-SS。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ss.ᢣ𐹭ؿ -T; \u200C-ss。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 V3] # -ss.ᢣ𐹭ؿ -N; \u200C-ss。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ss.ᢣ𐹭ؿ -T; \u200C-Ss。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 V3] # -ss.ᢣ𐹭ؿ -N; \u200C-Ss。ᢣ𐹭\u063F; [B1 B5 B6 C1]; [B1 B5 B6 C1] # -ss.ᢣ𐹭ؿ -B; ꧐Ӏ\u1BAA\u08F6.눵; [P1 V6]; [P1 V6] # ꧐Ӏ᮪ࣶ.눵 -B; ꧐Ӏ\u1BAA\u08F6.눵; [P1 V6]; [P1 V6] # ꧐Ӏ᮪ࣶ.눵 -B; ꧐Ӏ\u1BAA\u08F6.눵; [P1 V6]; [P1 V6] # ꧐Ӏ᮪ࣶ.눵 -B; ꧐Ӏ\u1BAA\u08F6.눵; [P1 V6]; [P1 V6] # ꧐Ӏ᮪ࣶ.눵 -B; ꧐ӏ\u1BAA\u08F6.눵; ꧐ӏ\u1BAA\u08F6.눵; xn--s5a04sn4u297k.xn--2e1b # ꧐ӏ᮪ࣶ.눵 -B; ꧐ӏ\u1BAA\u08F6.눵; ; xn--s5a04sn4u297k.xn--2e1b # ꧐ӏ᮪ࣶ.눵 -B; xn--s5a04sn4u297k.xn--2e1b; ꧐ӏ\u1BAA\u08F6.눵; xn--s5a04sn4u297k.xn--2e1b # ꧐ӏ᮪ࣶ.눵 -B; xn--d5a07sn4u297k.xn--2e1b; [V6]; [V6] # ꧐Ӏ᮪ࣶ.눵 -B; ꧐ӏ\u1BAA\u08F6.눵; ꧐ӏ\u1BAA\u08F6.눵; xn--s5a04sn4u297k.xn--2e1b # ꧐ӏ᮪ࣶ.눵 -B; ꧐ӏ\u1BAA\u08F6.눵; ꧐ӏ\u1BAA\u08F6.눵; xn--s5a04sn4u297k.xn--2e1b # ꧐ӏ᮪ࣶ.눵 -B; \uA8EA。𖄿𑆾󠇗; [P1 V5 V6]; [P1 V5 V6] # ꣪.𑆾 -B; \uA8EA。𖄿𑆾󠇗; [P1 V5 V6]; [P1 V5 V6] # ꣪.𑆾 -B; xn--3g9a.xn--ud1dz07k; [V5 V6]; [V5 V6] # ꣪.𑆾 -B; 󇓓𑚳。񐷿≯⾇; [P1 V6]; [P1 V6] -B; 󇓓𑚳。񐷿>\u0338⾇; [P1 V6]; [P1 V6] -B; 󇓓𑚳。񐷿≯舛; [P1 V6]; [P1 V6] -B; 󇓓𑚳。񐷿>\u0338舛; [P1 V6]; [P1 V6] -B; xn--3e2d79770c.xn--hdh0088abyy1c; [V6]; [V6] -T; 𐫇\u0661\u200C.\u200D\u200C; [B1 B3 C1 C2]; xn--9hb7344k. # 𐫇١. -N; 𐫇\u0661\u200C.\u200D\u200C; [B1 B3 C1 C2]; [B1 B3 C1 C2] # 𐫇١. -T; 𐫇\u0661\u200C.\u200D\u200C; [B1 B3 C1 C2]; xn--9hb7344k. # 𐫇١. -N; 𐫇\u0661\u200C.\u200D\u200C; [B1 B3 C1 C2]; [B1 B3 C1 C2] # 𐫇١. -B; xn--9hb7344k.; 𐫇\u0661.; xn--9hb7344k. # 𐫇١. -B; 𐫇\u0661.; ; xn--9hb7344k. # 𐫇١. -B; xn--9hb652kv99n.xn--0ugb; [B1 B3 C1 C2]; [B1 B3 C1 C2] # 𐫇١. -T; 񡅈砪≯ᢑ。≯𝩚򓴔\u200C; [C1 P1 V6]; [P1 V6] # 砪≯ᢑ.≯𝩚 -N; 񡅈砪≯ᢑ。≯𝩚򓴔\u200C; [C1 P1 V6]; [C1 P1 V6] # 砪≯ᢑ.≯𝩚 -T; 񡅈砪>\u0338ᢑ。>\u0338𝩚򓴔\u200C; [C1 P1 V6]; [P1 V6] # 砪≯ᢑ.≯𝩚 -N; 񡅈砪>\u0338ᢑ。>\u0338𝩚򓴔\u200C; [C1 P1 V6]; [C1 P1 V6] # 砪≯ᢑ.≯𝩚 -T; 񡅈砪≯ᢑ。≯𝩚򓴔\u200C; [C1 P1 V6]; [P1 V6] # 砪≯ᢑ.≯𝩚 -N; 񡅈砪≯ᢑ。≯𝩚򓴔\u200C; [C1 P1 V6]; [C1 P1 V6] # 砪≯ᢑ.≯𝩚 -T; 񡅈砪>\u0338ᢑ。>\u0338𝩚򓴔\u200C; [C1 P1 V6]; [P1 V6] # 砪≯ᢑ.≯𝩚 -N; 񡅈砪>\u0338ᢑ。>\u0338𝩚򓴔\u200C; [C1 P1 V6]; [C1 P1 V6] # 砪≯ᢑ.≯𝩚 -B; xn--bbf561cf95e57y3e.xn--hdh0834o7mj6b; [V6]; [V6] -B; xn--bbf561cf95e57y3e.xn--0ugz6gc910ejro8c; [C1 V6]; [C1 V6] # 砪≯ᢑ.≯𝩚 -B; Ⴥ.𑄳㊸; [P1 V5 V6]; [P1 V5 V6] -B; Ⴥ.𑄳43; [P1 V5 V6]; [P1 V5 V6] -B; ⴥ.𑄳43; [V5]; [V5] -B; xn--tlj.xn--43-274o; [V5]; [V5] -B; xn--9nd.xn--43-274o; [V5 V6]; [V5 V6] -B; ⴥ.𑄳㊸; [V5]; [V5] -B; 𝟎\u0663。Ⴒᡇ\u08F2𐹠; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # 0٣.Ⴒᡇࣲ𐹠 -B; 0\u0663。Ⴒᡇ\u08F2𐹠; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # 0٣.Ⴒᡇࣲ𐹠 -B; 0\u0663。ⴒᡇ\u08F2𐹠; [B1 B5 B6]; [B1 B5 B6] # 0٣.ⴒᡇࣲ𐹠 -B; xn--0-fqc.xn--10b369eivp359r; [B1 B5 B6]; [B1 B5 B6] # 0٣.ⴒᡇࣲ𐹠 -B; xn--0-fqc.xn--10b180bnwgfy0z; [B1 B5 B6 V6]; [B1 B5 B6 V6] # 0٣.Ⴒᡇࣲ𐹠 -B; 𝟎\u0663。ⴒᡇ\u08F2𐹠; [B1 B5 B6]; [B1 B5 B6] # 0٣.ⴒᡇࣲ𐹠 -B; 񗪨󠄉\uFFA0\u0FB7.񸞰\uA953; [P1 V6]; [P1 V6] # ྷ.꥓ -B; 񗪨󠄉\u1160\u0FB7.񸞰\uA953; [P1 V6]; [P1 V6] # ྷ.꥓ -B; xn--kgd36f9z57y.xn--3j9au7544a; [V6]; [V6] # ྷ.꥓ -B; xn--kgd7493jee34a.xn--3j9au7544a; [V6]; [V6] # ྷ.꥓ -T; \u0618.۳\u200C\uA953; [C1 V5]; [V5] # ؘ.۳꥓ -N; \u0618.۳\u200C\uA953; [C1 V5]; [C1 V5] # ؘ.۳꥓ -B; xn--6fb.xn--gmb0524f; [V5]; [V5] # ؘ.۳꥓ -B; xn--6fb.xn--gmb469jjf1h; [C1 V5]; [C1 V5] # ؘ.۳꥓ -B; ᡌ.︒ᢑ; [P1 V6]; [P1 V6] -B; ᡌ.。ᢑ; [A4_2]; [A4_2] -B; xn--c8e..xn--bbf; [A4_2]; [A4_2] -B; xn--c8e.xn--bbf9168i; [V6]; [V6] -B; 𑋪\u1073。𞽧; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑋪ၳ. -B; 𑋪\u1073。𞽧; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑋪ၳ. -B; xn--xld7443k.xn--4o7h; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # 𑋪ၳ. -B; 𞷏。ᠢ򓘆; [P1 V6]; [P1 V6] -B; xn--hd7h.xn--46e66060j; [V6]; [V6] -T; 𑄳㴼.\u200C𐹡\u20EB񫺦; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𑄳㴼.𐹡⃫ -N; 𑄳㴼.\u200C𐹡\u20EB񫺦; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𑄳㴼.𐹡⃫ -T; 𑄳㴼.\u200C𐹡\u20EB񫺦; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𑄳㴼.𐹡⃫ -N; 𑄳㴼.\u200C𐹡\u20EB񫺦; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𑄳㴼.𐹡⃫ -B; xn--iym9428c.xn--e1g3464g08p3b; [B1 V5 V6]; [B1 V5 V6] # 𑄳㴼.𐹡⃫ -B; xn--iym9428c.xn--0ug46a7218cllv0c; [B1 C1 V5 V6]; [B1 C1 V5 V6] # 𑄳㴼.𐹡⃫ -B; 񠻟𐹳𑈯。\u031D; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # 𐹳𑈯.̝ -B; 񠻟𐹳𑈯。\u031D; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # 𐹳𑈯.̝ -B; xn--ro0dw7dey96m.xn--eta; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # 𐹳𑈯.̝ -B; ᢊ뾜󠱴𑚶。\u089D𐹥; [P1 V6]; [P1 V6] # ᢊ뾜𑚶.𐹥 -B; ᢊ뾜󠱴𑚶。\u089D𐹥; [P1 V6]; [P1 V6] # ᢊ뾜𑚶.𐹥 -B; xn--39e4566fjv8bwmt6n.xn--myb6415k; [V6]; [V6] # ᢊ뾜𑚶.𐹥 -T; 𐹥≠。𐋲󠧠\u200C; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹥≠.𐋲 -N; 𐹥≠。𐋲󠧠\u200C; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹥≠.𐋲 -T; 𐹥=\u0338。𐋲󠧠\u200C; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹥≠.𐋲 -N; 𐹥=\u0338。𐋲󠧠\u200C; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹥≠.𐋲 -T; 𐹥≠。𐋲󠧠\u200C; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹥≠.𐋲 -N; 𐹥≠。𐋲󠧠\u200C; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹥≠.𐋲 -T; 𐹥=\u0338。𐋲󠧠\u200C; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹥≠.𐋲 -N; 𐹥=\u0338。𐋲󠧠\u200C; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹥≠.𐋲 -B; xn--1ch6704g.xn--m97cw2999c; [B1 V6]; [B1 V6] -B; xn--1ch6704g.xn--0ug3840g51u4g; [B1 C1 V6]; [B1 C1 V6] # 𐹥≠.𐋲 -T; \u115F񙯠\u094D.\u200D\uA953𐪤; [B1 C2 P1 V6]; [B5 B6 P1 V5 V6] # ्.꥓ -N; \u115F񙯠\u094D.\u200D\uA953𐪤; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ्.꥓ -T; \u115F񙯠\u094D.\u200D\uA953𐪤; [B1 C2 P1 V6]; [B5 B6 P1 V5 V6] # ्.꥓ -N; \u115F񙯠\u094D.\u200D\uA953𐪤; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ्.꥓ -B; xn--n3b542bb085j.xn--3j9al95p; [B5 B6 V5 V6]; [B5 B6 V5 V6] # ्.꥓ -B; xn--n3b542bb085j.xn--1ug6815co9wc; [B1 C2 V6]; [B1 C2 V6] # ्.꥓ -B; 򌋔󠆎󠆗𑲕。≮; [P1 V6]; [P1 V6] -B; 򌋔󠆎󠆗𑲕。<\u0338; [P1 V6]; [P1 V6] -B; xn--4m3dv4354a.xn--gdh; [V6]; [V6] -B; 󠆦.\u08E3暀≠; [P1 V5 V6 A4_2]; [P1 V5 V6 A4_2] # .ࣣ暀≠ -B; 󠆦.\u08E3暀=\u0338; [P1 V5 V6 A4_2]; [P1 V5 V6 A4_2] # .ࣣ暀≠ -B; .xn--m0b461k3g2c; [V5 V6 A4_2]; [V5 V6 A4_2] # .ࣣ暀≠ -B; 𐡤\uABED。\uFD30򜖅\u1DF0; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐡤꯭.شمᷰ -B; 𐡤\uABED。\u0634\u0645򜖅\u1DF0; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐡤꯭.شمᷰ -B; xn--429ak76o.xn--zgb8a701kox37t; [B2 B3 V6]; [B2 B3 V6] # 𐡤꯭.شمᷰ -T; 𝉃\u200D⒈。Ⴌ𞱓; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𝉃⒈.Ⴌ -N; 𝉃\u200D⒈。Ⴌ𞱓; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 C2 P1 V5 V6] # 𝉃⒈.Ⴌ -T; 𝉃\u200D1.。Ⴌ𞱓; [B1 B5 B6 C2 P1 V5 V6 A4_2]; [B1 B5 B6 P1 V5 V6 A4_2] # 𝉃1..Ⴌ -N; 𝉃\u200D1.。Ⴌ𞱓; [B1 B5 B6 C2 P1 V5 V6 A4_2]; [B1 B5 B6 C2 P1 V5 V6 A4_2] # 𝉃1..Ⴌ -T; 𝉃\u200D1.。ⴌ𞱓; [B1 B5 B6 C2 P1 V5 V6 A4_2]; [B1 B5 B6 P1 V5 V6 A4_2] # 𝉃1..ⴌ -N; 𝉃\u200D1.。ⴌ𞱓; [B1 B5 B6 C2 P1 V5 V6 A4_2]; [B1 B5 B6 C2 P1 V5 V6 A4_2] # 𝉃1..ⴌ -B; xn--1-px8q..xn--3kj4524l; [B1 B5 B6 V5 V6 A4_2]; [B1 B5 B6 V5 V6 A4_2] -B; xn--1-tgn9827q..xn--3kj4524l; [B1 B5 B6 C2 V5 V6 A4_2]; [B1 B5 B6 C2 V5 V6 A4_2] # 𝉃1..ⴌ -B; xn--1-px8q..xn--knd8464v; [B1 B5 B6 V5 V6 A4_2]; [B1 B5 B6 V5 V6 A4_2] -B; xn--1-tgn9827q..xn--knd8464v; [B1 B5 B6 C2 V5 V6 A4_2]; [B1 B5 B6 C2 V5 V6 A4_2] # 𝉃1..Ⴌ -T; 𝉃\u200D⒈。ⴌ𞱓; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𝉃⒈.ⴌ -N; 𝉃\u200D⒈。ⴌ𞱓; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 C2 P1 V5 V6] # 𝉃⒈.ⴌ -B; xn--tshz828m.xn--3kj4524l; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] -B; xn--1ug68oq348b.xn--3kj4524l; [B1 B5 B6 C2 V5 V6]; [B1 B5 B6 C2 V5 V6] # 𝉃⒈.ⴌ -B; xn--tshz828m.xn--knd8464v; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] -B; xn--1ug68oq348b.xn--knd8464v; [B1 B5 B6 C2 V5 V6]; [B1 B5 B6 C2 V5 V6] # 𝉃⒈.Ⴌ -T; 󠣙\u0A4D𱫘𞤸.ς񵯞􈰔; [B1 P1 V6]; [B1 P1 V6] # ੍𞤸.ς -N; 󠣙\u0A4D𱫘𞤸.ς񵯞􈰔; [B1 P1 V6]; [B1 P1 V6] # ੍𞤸.ς -B; 󠣙\u0A4D𱫘𞤖.Σ񵯞􈰔; [B1 P1 V6]; [B1 P1 V6] # ੍𞤸.σ -B; 󠣙\u0A4D𱫘𞤸.σ񵯞􈰔; [B1 P1 V6]; [B1 P1 V6] # ੍𞤸.σ -B; 󠣙\u0A4D𱫘𞤖.σ񵯞􈰔; [B1 P1 V6]; [B1 P1 V6] # ੍𞤸.σ -B; xn--ybc0236vjvxgt5q0g.xn--4xa82737giye6b; [B1 V6]; [B1 V6] # ੍𞤸.σ -T; 󠣙\u0A4D𱫘𞤖.ς񵯞􈰔; [B1 P1 V6]; [B1 P1 V6] # ੍𞤸.ς -N; 󠣙\u0A4D𱫘𞤖.ς񵯞􈰔; [B1 P1 V6]; [B1 P1 V6] # ੍𞤸.ς -B; xn--ybc0236vjvxgt5q0g.xn--3xa03737giye6b; [B1 V6]; [B1 V6] # ੍𞤸.ς -B; 󠣙\u0A4D𱫘𞤸.Σ񵯞􈰔; [B1 P1 V6]; [B1 P1 V6] # ੍𞤸.σ -T; \u07D3。\u200C𐫀򞭱; [B1 C1 P1 V6]; [B2 B3 P1 V6] # ߓ.𐫀 -N; \u07D3。\u200C𐫀򞭱; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ߓ.𐫀 -B; xn--usb.xn--pw9ci1099a; [B2 B3 V6]; [B2 B3 V6] # ߓ.𐫀 -B; xn--usb.xn--0ug9553gm3v5d; [B1 C1 V6]; [B1 C1 V6] # ߓ.𐫀 -B; \u1C2E𞀝.\u05A6ꡟ𞤕󠆖; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ᰮ𞀝.֦ꡟ𞤷 -B; \u1C2E𞀝.\u05A6ꡟ𞤷󠆖; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ᰮ𞀝.֦ꡟ𞤷 -B; xn--q1f4493q.xn--xcb8244fifvj; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ᰮ𞀝.֦ꡟ𞤷 -T; 䂹󾖅𐋦.\u200D; [C2 P1 V6]; [P1 V6] # 䂹𐋦. -N; 䂹󾖅𐋦.\u200D; [C2 P1 V6]; [C2 P1 V6] # 䂹𐋦. -T; 䂹󾖅𐋦.\u200D; [C2 P1 V6]; [P1 V6] # 䂹𐋦. -N; 䂹󾖅𐋦.\u200D; [C2 P1 V6]; [C2 P1 V6] # 䂹𐋦. -B; xn--0on3543c5981i.; [V6]; [V6] -B; xn--0on3543c5981i.xn--1ug; [C2 V6]; [C2 V6] # 䂹𐋦. -T; \uA9C0\u200C𐹲\u200C。\u0767🄉; [B5 B6 C1 P1 V5 V6]; [B5 B6 P1 V5 V6] # ꧀𐹲.ݧ🄉 -N; \uA9C0\u200C𐹲\u200C。\u0767🄉; [B5 B6 C1 P1 V5 V6]; [B5 B6 C1 P1 V5 V6] # ꧀𐹲.ݧ🄉 -T; \uA9C0\u200C𐹲\u200C。\u07678,; [B3 B5 B6 C1 P1 V5 V6]; [B3 B5 B6 P1 V5 V6] # ꧀𐹲.ݧ8, -N; \uA9C0\u200C𐹲\u200C。\u07678,; [B3 B5 B6 C1 P1 V5 V6]; [B3 B5 B6 C1 P1 V5 V6] # ꧀𐹲.ݧ8, -B; xn--7m9an32q.xn--8,-qle; [B3 B5 B6 P1 V5 V6]; [B3 B5 B6 P1 V5 V6] # ꧀𐹲.ݧ8, -B; xn--0uga8686hdgvd.xn--8,-qle; [B3 B5 B6 C1 P1 V5 V6]; [B3 B5 B6 C1 P1 V5 V6] # ꧀𐹲.ݧ8, -B; xn--7m9an32q.xn--rpb6081w; [B5 B6 V5 V6]; [B5 B6 V5 V6] # ꧀𐹲.ݧ🄉 -B; xn--0uga8686hdgvd.xn--rpb6081w; [B5 B6 C1 V5 V6]; [B5 B6 C1 V5 V6] # ꧀𐹲.ݧ🄉 -B; ︒。Ⴃ≯; [P1 V6]; [P1 V6] -B; ︒。Ⴃ>\u0338; [P1 V6]; [P1 V6] -B; 。。Ⴃ≯; [P1 V6 A4_2]; [P1 V6 A4_2] -B; 。。Ⴃ>\u0338; [P1 V6 A4_2]; [P1 V6 A4_2] -B; 。。ⴃ>\u0338; [P1 V6 A4_2]; [P1 V6 A4_2] -B; 。。ⴃ≯; [P1 V6 A4_2]; [P1 V6 A4_2] -B; ..xn--hdh782b; [V6 A4_2]; [V6 A4_2] -B; ..xn--bnd622g; [V6 A4_2]; [V6 A4_2] -B; ︒。ⴃ>\u0338; [P1 V6]; [P1 V6] -B; ︒。ⴃ≯; [P1 V6]; [P1 V6] -B; xn--y86c.xn--hdh782b; [V6]; [V6] -B; xn--y86c.xn--bnd622g; [V6]; [V6] -T; 𐹮。󠢼\u200D; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹮. -N; 𐹮。󠢼\u200D; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹮. -T; 𐹮。󠢼\u200D; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹮. -N; 𐹮。󠢼\u200D; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹮. -B; xn--mo0d.xn--wy46e; [B1 V6]; [B1 V6] -B; xn--mo0d.xn--1ug18431l; [B1 C2 V6]; [B1 C2 V6] # 𐹮. -T; Ⴞ𐹨。︒\u077D\u200DႯ; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 P1 V6] # Ⴞ𐹨.︒ݽႯ -N; Ⴞ𐹨。︒\u077D\u200DႯ; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 C2 P1 V6] # Ⴞ𐹨.︒ݽႯ -T; Ⴞ𐹨。。\u077D\u200DႯ; [B2 B3 B5 B6 C2 P1 V6 A4_2]; [B2 B3 B5 B6 P1 V6 A4_2] # Ⴞ𐹨..ݽႯ -N; Ⴞ𐹨。。\u077D\u200DႯ; [B2 B3 B5 B6 C2 P1 V6 A4_2]; [B2 B3 B5 B6 C2 P1 V6 A4_2] # Ⴞ𐹨..ݽႯ -T; ⴞ𐹨。。\u077D\u200Dⴏ; [B2 B3 B5 B6 C2 A4_2]; [B2 B3 B5 B6 A4_2] # ⴞ𐹨..ݽⴏ -N; ⴞ𐹨。。\u077D\u200Dⴏ; [B2 B3 B5 B6 C2 A4_2]; [B2 B3 B5 B6 C2 A4_2] # ⴞ𐹨..ݽⴏ -B; xn--mlju223e..xn--eqb053q; [B2 B3 B5 B6 A4_2]; [B2 B3 B5 B6 A4_2] # ⴞ𐹨..ݽⴏ -B; xn--mlju223e..xn--eqb096jpgj; [B2 B3 B5 B6 C2 A4_2]; [B2 B3 B5 B6 C2 A4_2] # ⴞ𐹨..ݽⴏ -B; xn--2nd0990k..xn--eqb228b; [B2 B3 B5 B6 V6 A4_2]; [B2 B3 B5 B6 V6 A4_2] # Ⴞ𐹨..ݽႯ -B; xn--2nd0990k..xn--eqb228bgzm; [B2 B3 B5 B6 C2 V6 A4_2]; [B2 B3 B5 B6 C2 V6 A4_2] # Ⴞ𐹨..ݽႯ -T; ⴞ𐹨。︒\u077D\u200Dⴏ; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 P1 V6] # ⴞ𐹨.︒ݽⴏ -N; ⴞ𐹨。︒\u077D\u200Dⴏ; [B1 B5 B6 C2 P1 V6]; [B1 B5 B6 C2 P1 V6] # ⴞ𐹨.︒ݽⴏ -B; xn--mlju223e.xn--eqb053qjk7l; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ⴞ𐹨.︒ݽⴏ -B; xn--mlju223e.xn--eqb096jpgj9y7r; [B1 B5 B6 C2 V6]; [B1 B5 B6 C2 V6] # ⴞ𐹨.︒ݽⴏ -B; xn--2nd0990k.xn--eqb228b583r; [B1 B5 B6 V6]; [B1 B5 B6 V6] # Ⴞ𐹨.︒ݽႯ -B; xn--2nd0990k.xn--eqb228bgzmvp0t; [B1 B5 B6 C2 V6]; [B1 B5 B6 C2 V6] # Ⴞ𐹨.︒ݽႯ -T; \u200CႦ𝟹。-\u20D2-\u07D1; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # Ⴆ3.-⃒-ߑ -N; \u200CႦ𝟹。-\u20D2-\u07D1; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # Ⴆ3.-⃒-ߑ -T; \u200CႦ3。-\u20D2-\u07D1; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # Ⴆ3.-⃒-ߑ -N; \u200CႦ3。-\u20D2-\u07D1; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # Ⴆ3.-⃒-ߑ -T; \u200Cⴆ3。-\u20D2-\u07D1; [B1 C1 V3]; [B1 V3] # ⴆ3.-⃒-ߑ -N; \u200Cⴆ3。-\u20D2-\u07D1; [B1 C1 V3]; [B1 C1 V3] # ⴆ3.-⃒-ߑ -B; xn--3-lvs.xn-----vue617w; [B1 V3]; [B1 V3] # ⴆ3.-⃒-ߑ -B; xn--3-rgnv99c.xn-----vue617w; [B1 C1 V3]; [B1 C1 V3] # ⴆ3.-⃒-ߑ -B; xn--3-i0g.xn-----vue617w; [B1 V3 V6]; [B1 V3 V6] # Ⴆ3.-⃒-ߑ -B; xn--3-i0g939i.xn-----vue617w; [B1 C1 V3 V6]; [B1 C1 V3 V6] # Ⴆ3.-⃒-ߑ -T; \u200Cⴆ𝟹。-\u20D2-\u07D1; [B1 C1 V3]; [B1 V3] # ⴆ3.-⃒-ߑ -N; \u200Cⴆ𝟹。-\u20D2-\u07D1; [B1 C1 V3]; [B1 C1 V3] # ⴆ3.-⃒-ߑ -B; 箃Ⴡ-󠁝。≠-🤖; [P1 V6]; [P1 V6] -B; 箃Ⴡ-󠁝。=\u0338-🤖; [P1 V6]; [P1 V6] -B; 箃Ⴡ-󠁝。≠-🤖; [P1 V6]; [P1 V6] -B; 箃Ⴡ-󠁝。=\u0338-🤖; [P1 V6]; [P1 V6] -B; 箃ⴡ-󠁝。=\u0338-🤖; [P1 V6]; [P1 V6] -B; 箃ⴡ-󠁝。≠-🤖; [P1 V6]; [P1 V6] -B; xn----4wsr321ay823p.xn----tfot873s; [V6]; [V6] -B; xn----11g3013fy8x5m.xn----tfot873s; [V6]; [V6] -B; 箃ⴡ-󠁝。=\u0338-🤖; [P1 V6]; [P1 V6] -B; 箃ⴡ-󠁝。≠-🤖; [P1 V6]; [P1 V6] -B; \u07E5.\u06B5; ; xn--dtb.xn--okb # ߥ.ڵ -B; xn--dtb.xn--okb; \u07E5.\u06B5; xn--dtb.xn--okb # ߥ.ڵ -T; \u200C\u200D.𞤿; [B1 C1 C2]; [A4_2] # .𞤿 -N; \u200C\u200D.𞤿; [B1 C1 C2]; [B1 C1 C2] # .𞤿 -T; \u200C\u200D.𞤝; [B1 C1 C2]; [A4_2] # .𞤿 -N; \u200C\u200D.𞤝; [B1 C1 C2]; [B1 C1 C2] # .𞤿 -B; .xn--3e6h; [A4_2]; [A4_2] -B; xn--0ugc.xn--3e6h; [B1 C1 C2]; [B1 C1 C2] # .𞤿 -B; xn--3e6h; 𞤿; xn--3e6h -B; 𞤿; ; xn--3e6h -B; 𞤝; 𞤿; xn--3e6h -T; 🜑𐹧\u0639.ς𑍍蜹; [B1]; [B1] # 🜑𐹧ع.ς𑍍蜹 -N; 🜑𐹧\u0639.ς𑍍蜹; [B1]; [B1] # 🜑𐹧ع.ς𑍍蜹 -B; 🜑𐹧\u0639.Σ𑍍蜹; [B1]; [B1] # 🜑𐹧ع.σ𑍍蜹 -B; 🜑𐹧\u0639.σ𑍍蜹; [B1]; [B1] # 🜑𐹧ع.σ𑍍蜹 -B; xn--4gb3736kk4zf.xn--4xa2248dy27d; [B1]; [B1] # 🜑𐹧ع.σ𑍍蜹 -B; xn--4gb3736kk4zf.xn--3xa4248dy27d; [B1]; [B1] # 🜑𐹧ع.ς𑍍蜹 -B; 򫠐ス􆟤\u0669.󚃟; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ス٩. -B; 򫠐ス􆟤\u0669.󚃟; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ス٩. -B; xn--iib777sp230oo708a.xn--7824e; [B5 B6 V6]; [B5 B6 V6] # ス٩. -B; 𝪣򕡝.\u059A\uD850\u06C2; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -B; 𝪣򕡝.\u059A\uD850\u06C1\u0654; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -B; 𝪣򕡝.\u059A\uD850\u06C2; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -B; 𝪣򕡝.\u059A\uD850\u06C1\u0654; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -B; xn--8c3hu7971a.\u059A\uD850\u06C2; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -B; xn--8c3hu7971a.\u059A\uD850\u06C1\u0654; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -B; XN--8C3HU7971A.\u059A\uD850\u06C1\u0654; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -B; XN--8C3HU7971A.\u059A\uD850\u06C2; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -B; Xn--8C3hu7971a.\u059A\uD850\u06C2; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -B; Xn--8C3hu7971a.\u059A\uD850\u06C1\u0654; [B1 P1 V5 V6]; [B1 P1 V5 V6 A3] # 𝪣.֚ۂ -T; \u0660򪓵\u200C。\u0757; [B1 C1 P1 V6]; [B1 P1 V6] # ٠.ݗ -N; \u0660򪓵\u200C。\u0757; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ٠.ݗ -B; xn--8hb82030l.xn--bpb; [B1 V6]; [B1 V6] # ٠.ݗ -B; xn--8hb852ke991q.xn--bpb; [B1 C1 V6]; [B1 C1 V6] # ٠.ݗ -T; \u103A\u200D\u200C。-\u200C; [C1 V3 V5]; [V3 V5] # ်.- -N; \u103A\u200D\u200C。-\u200C; [C1 V3 V5]; [C1 V3 V5] # ်.- -B; xn--bkd.-; [V3 V5]; [V3 V5] # ်.- -B; xn--bkd412fca.xn----sgn; [C1 V3 V5]; [C1 V3 V5] # ်.- -B; ︒。\u1B44ᡉ; [P1 V5 V6]; [P1 V5 V6] # ︒.᭄ᡉ -B; 。。\u1B44ᡉ; [V5 A4_2]; [V5 A4_2] # ..᭄ᡉ -B; ..xn--87e93m; [V5 A4_2]; [V5 A4_2] # ..᭄ᡉ -B; xn--y86c.xn--87e93m; [V5 V6]; [V5 V6] # ︒.᭄ᡉ -T; \u0758ß。ጫᢊ\u0768𝟐; [B2 B3 B5]; [B2 B3 B5] # ݘß.ጫᢊݨ2 -N; \u0758ß。ጫᢊ\u0768𝟐; [B2 B3 B5]; [B2 B3 B5] # ݘß.ጫᢊݨ2 -T; \u0758ß。ጫᢊ\u07682; [B2 B3 B5]; [B2 B3 B5] # ݘß.ጫᢊݨ2 -N; \u0758ß。ጫᢊ\u07682; [B2 B3 B5]; [B2 B3 B5] # ݘß.ጫᢊݨ2 -B; \u0758SS。ጫᢊ\u07682; [B2 B3 B5]; [B2 B3 B5] # ݘss.ጫᢊݨ2 -B; \u0758ss。ጫᢊ\u07682; [B2 B3 B5]; [B2 B3 B5] # ݘss.ጫᢊݨ2 -B; \u0758Ss。ጫᢊ\u07682; [B2 B3 B5]; [B2 B3 B5] # ݘss.ጫᢊݨ2 -B; xn--ss-gke.xn--2-b5c641gfmf; [B2 B3 B5]; [B2 B3 B5] # ݘss.ጫᢊݨ2 -B; xn--zca724a.xn--2-b5c641gfmf; [B2 B3 B5]; [B2 B3 B5] # ݘß.ጫᢊݨ2 -B; \u0758SS。ጫᢊ\u0768𝟐; [B2 B3 B5]; [B2 B3 B5] # ݘss.ጫᢊݨ2 -B; \u0758ss。ጫᢊ\u0768𝟐; [B2 B3 B5]; [B2 B3 B5] # ݘss.ጫᢊݨ2 -B; \u0758Ss。ጫᢊ\u0768𝟐; [B2 B3 B5]; [B2 B3 B5] # ݘss.ጫᢊݨ2 -B; \u07C3𞶇ᚲ.\u0902\u0353𝟚\u09CD; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ߃ᚲ.ं͓2্ -B; \u07C3𞶇ᚲ.\u0902\u03532\u09CD; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ߃ᚲ.ं͓2্ -B; xn--esb067enh07a.xn--2-lgb874bjxa; [B1 B2 B3 V5 V6]; [B1 B2 B3 V5 V6] # ߃ᚲ.ं͓2্ -T; -\u1BAB︒\u200D.񒶈񥹓; [C2 P1 V3 V6]; [P1 V3 V6] # -᮫︒. -N; -\u1BAB︒\u200D.񒶈񥹓; [C2 P1 V3 V6]; [C2 P1 V3 V6] # -᮫︒. -T; -\u1BAB。\u200D.񒶈񥹓; [C2 P1 V3 V6]; [P1 V3 V6 A4_2] # -᮫.. -N; -\u1BAB。\u200D.񒶈񥹓; [C2 P1 V3 V6]; [C2 P1 V3 V6] # -᮫.. -B; xn----qml..xn--x50zy803a; [V3 V6 A4_2]; [V3 V6 A4_2] # -᮫.. -B; xn----qml.xn--1ug.xn--x50zy803a; [C2 V3 V6]; [C2 V3 V6] # -᮫.. -B; xn----qml1407i.xn--x50zy803a; [V3 V6]; [V3 V6] # -᮫︒. -B; xn----qmlv7tw180a.xn--x50zy803a; [C2 V3 V6]; [C2 V3 V6] # -᮫︒. -B; 󠦮.≯𞀆; [P1 V6]; [P1 V6] -B; 󠦮.>\u0338𞀆; [P1 V6]; [P1 V6] -B; xn--t546e.xn--hdh5166o; [V6]; [V6] -B; -𑄳󠊗𐹩。𞮱; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; xn----p26i72em2894c.xn--zw6h; [B1 V3 V6]; [B1 V3 V6] -B; \u06B9.ᡳ\u115F; [P1 V6]; [P1 V6] # ڹ.ᡳ -B; \u06B9.ᡳ\u115F; [P1 V6]; [P1 V6] # ڹ.ᡳ -B; xn--skb.xn--osd737a; [V6]; [V6] # ڹ.ᡳ -B; 㨛𘱎.︒𝟕\u0D01; [P1 V6]; [P1 V6] # 㨛.︒7ഁ -B; 㨛𘱎.。7\u0D01; [P1 V6 A4_2]; [P1 V6 A4_2] # 㨛..7ഁ -B; xn--mbm8237g..xn--7-7hf; [V6 A4_2]; [V6 A4_2] # 㨛..7ഁ -B; xn--mbm8237g.xn--7-7hf1526p; [V6]; [V6] # 㨛.︒7ഁ -B; \u06DD𻱧-。𞷁\u2064𞤣≮; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # -.𞤣≮ -B; \u06DD𻱧-。𞷁\u2064𞤣<\u0338; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # -.𞤣≮ -B; \u06DD𻱧-。𞷁\u2064𞤣≮; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # -.𞤣≮ -B; \u06DD𻱧-。𞷁\u2064𞤣<\u0338; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # -.𞤣≮ -B; \u06DD𻱧-。𞷁\u2064𞤁<\u0338; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # -.𞤣≮ -B; \u06DD𻱧-。𞷁\u2064𞤁≮; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # -.𞤣≮ -B; xn----dxc06304e.xn--gdh5020pk5c; [B1 B3 V3 V6]; [B1 B3 V3 V6] # -.𞤣≮ -B; \u06DD𻱧-。𞷁\u2064𞤁<\u0338; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # -.𞤣≮ -B; \u06DD𻱧-。𞷁\u2064𞤁≮; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # -.𞤣≮ -T; ß\u200C\uAAF6ᢥ.⊶ჁႶ; [C1 P1 V6]; [P1 V6] # ß꫶ᢥ.⊶ჁႶ -N; ß\u200C\uAAF6ᢥ.⊶ჁႶ; [C1 P1 V6]; [C1 P1 V6] # ß꫶ᢥ.⊶ჁႶ -T; ß\u200C\uAAF6ᢥ.⊶ჁႶ; [C1 P1 V6]; [P1 V6] # ß꫶ᢥ.⊶ჁႶ -N; ß\u200C\uAAF6ᢥ.⊶ჁႶ; [C1 P1 V6]; [C1 P1 V6] # ß꫶ᢥ.⊶ჁႶ -T; ß\u200C\uAAF6ᢥ.⊶ⴡⴖ; [C1]; xn--ss-4epx629f.xn--ifh802b6a # ß꫶ᢥ.⊶ⴡⴖ -N; ß\u200C\uAAF6ᢥ.⊶ⴡⴖ; [C1]; [C1] # ß꫶ᢥ.⊶ⴡⴖ -T; SS\u200C\uAAF6ᢥ.⊶ჁႶ; [C1 P1 V6]; [P1 V6] # ss꫶ᢥ.⊶ჁႶ -N; SS\u200C\uAAF6ᢥ.⊶ჁႶ; [C1 P1 V6]; [C1 P1 V6] # ss꫶ᢥ.⊶ჁႶ -T; ss\u200C\uAAF6ᢥ.⊶ⴡⴖ; [C1]; xn--ss-4epx629f.xn--ifh802b6a # ss꫶ᢥ.⊶ⴡⴖ -N; ss\u200C\uAAF6ᢥ.⊶ⴡⴖ; [C1]; [C1] # ss꫶ᢥ.⊶ⴡⴖ -T; Ss\u200C\uAAF6ᢥ.⊶Ⴡⴖ; [C1 P1 V6]; [P1 V6] # ss꫶ᢥ.⊶Ⴡⴖ -N; Ss\u200C\uAAF6ᢥ.⊶Ⴡⴖ; [C1 P1 V6]; [C1 P1 V6] # ss꫶ᢥ.⊶Ⴡⴖ -B; xn--ss-4epx629f.xn--5nd703gyrh; [V6]; [V6] # ss꫶ᢥ.⊶Ⴡⴖ -B; xn--ss-4ep585bkm5p.xn--5nd703gyrh; [C1 V6]; [C1 V6] # ss꫶ᢥ.⊶Ⴡⴖ -B; xn--ss-4epx629f.xn--ifh802b6a; ss\uAAF6ᢥ.⊶ⴡⴖ; xn--ss-4epx629f.xn--ifh802b6a; NV8 # ss꫶ᢥ.⊶ⴡⴖ -B; ss\uAAF6ᢥ.⊶ⴡⴖ; ; xn--ss-4epx629f.xn--ifh802b6a; NV8 # ss꫶ᢥ.⊶ⴡⴖ -B; SS\uAAF6ᢥ.⊶ჁႶ; [P1 V6]; [P1 V6] # ss꫶ᢥ.⊶ჁႶ -B; Ss\uAAF6ᢥ.⊶Ⴡⴖ; [P1 V6]; [P1 V6] # ss꫶ᢥ.⊶Ⴡⴖ -B; xn--ss-4epx629f.xn--undv409k; [V6]; [V6] # ss꫶ᢥ.⊶ჁႶ -B; xn--ss-4ep585bkm5p.xn--ifh802b6a; [C1]; [C1] # ss꫶ᢥ.⊶ⴡⴖ -B; xn--ss-4ep585bkm5p.xn--undv409k; [C1 V6]; [C1 V6] # ss꫶ᢥ.⊶ჁႶ -B; xn--zca682johfi89m.xn--ifh802b6a; [C1]; [C1] # ß꫶ᢥ.⊶ⴡⴖ -B; xn--zca682johfi89m.xn--undv409k; [C1 V6]; [C1 V6] # ß꫶ᢥ.⊶ჁႶ -T; ß\u200C\uAAF6ᢥ.⊶ⴡⴖ; [C1]; xn--ss-4epx629f.xn--ifh802b6a # ß꫶ᢥ.⊶ⴡⴖ -N; ß\u200C\uAAF6ᢥ.⊶ⴡⴖ; [C1]; [C1] # ß꫶ᢥ.⊶ⴡⴖ -T; SS\u200C\uAAF6ᢥ.⊶ჁႶ; [C1 P1 V6]; [P1 V6] # ss꫶ᢥ.⊶ჁႶ -N; SS\u200C\uAAF6ᢥ.⊶ჁႶ; [C1 P1 V6]; [C1 P1 V6] # ss꫶ᢥ.⊶ჁႶ -T; ss\u200C\uAAF6ᢥ.⊶ⴡⴖ; [C1]; xn--ss-4epx629f.xn--ifh802b6a # ss꫶ᢥ.⊶ⴡⴖ -N; ss\u200C\uAAF6ᢥ.⊶ⴡⴖ; [C1]; [C1] # ss꫶ᢥ.⊶ⴡⴖ -T; Ss\u200C\uAAF6ᢥ.⊶Ⴡⴖ; [C1 P1 V6]; [P1 V6] # ss꫶ᢥ.⊶Ⴡⴖ -N; Ss\u200C\uAAF6ᢥ.⊶Ⴡⴖ; [C1 P1 V6]; [C1 P1 V6] # ss꫶ᢥ.⊶Ⴡⴖ -T; \u200D。ς󠁉; [C2 P1 V6]; [P1 V6 A4_2] # .ς -N; \u200D。ς󠁉; [C2 P1 V6]; [C2 P1 V6] # .ς -T; \u200D。Σ󠁉; [C2 P1 V6]; [P1 V6 A4_2] # .σ -N; \u200D。Σ󠁉; [C2 P1 V6]; [C2 P1 V6] # .σ -T; \u200D。σ󠁉; [C2 P1 V6]; [P1 V6 A4_2] # .σ -N; \u200D。σ󠁉; [C2 P1 V6]; [C2 P1 V6] # .σ -B; .xn--4xa24344p; [V6 A4_2]; [V6 A4_2] -B; xn--1ug.xn--4xa24344p; [C2 V6]; [C2 V6] # .σ -B; xn--1ug.xn--3xa44344p; [C2 V6]; [C2 V6] # .ς -T; 𞵑ß.\u0751\u200D𞤛-; [B2 B3 C2 P1 V3 V6]; [B2 B3 P1 V3 V6] # ß.ݑ𞤽- -N; 𞵑ß.\u0751\u200D𞤛-; [B2 B3 C2 P1 V3 V6]; [B2 B3 C2 P1 V3 V6] # ß.ݑ𞤽- -T; 𞵑ß.\u0751\u200D𞤽-; [B2 B3 C2 P1 V3 V6]; [B2 B3 P1 V3 V6] # ß.ݑ𞤽- -N; 𞵑ß.\u0751\u200D𞤽-; [B2 B3 C2 P1 V3 V6]; [B2 B3 C2 P1 V3 V6] # ß.ݑ𞤽- -T; 𞵑SS.\u0751\u200D𞤛-; [B2 B3 C2 P1 V3 V6]; [B2 B3 P1 V3 V6] # ss.ݑ𞤽- -N; 𞵑SS.\u0751\u200D𞤛-; [B2 B3 C2 P1 V3 V6]; [B2 B3 C2 P1 V3 V6] # ss.ݑ𞤽- -T; 𞵑ss.\u0751\u200D𞤽-; [B2 B3 C2 P1 V3 V6]; [B2 B3 P1 V3 V6] # ss.ݑ𞤽- -N; 𞵑ss.\u0751\u200D𞤽-; [B2 B3 C2 P1 V3 V6]; [B2 B3 C2 P1 V3 V6] # ss.ݑ𞤽- -T; 𞵑Ss.\u0751\u200D𞤽-; [B2 B3 C2 P1 V3 V6]; [B2 B3 P1 V3 V6] # ss.ݑ𞤽- -N; 𞵑Ss.\u0751\u200D𞤽-; [B2 B3 C2 P1 V3 V6]; [B2 B3 C2 P1 V3 V6] # ss.ݑ𞤽- -B; xn--ss-2722a.xn----z3c03218a; [B2 B3 V3 V6]; [B2 B3 V3 V6] # ss.ݑ𞤽- -B; xn--ss-2722a.xn----z3c011q9513b; [B2 B3 C2 V3 V6]; [B2 B3 C2 V3 V6] # ss.ݑ𞤽- -B; xn--zca5423w.xn----z3c011q9513b; [B2 B3 C2 V3 V6]; [B2 B3 C2 V3 V6] # ß.ݑ𞤽- -T; 𞵑ss.\u0751\u200D𞤛-; [B2 B3 C2 P1 V3 V6]; [B2 B3 P1 V3 V6] # ss.ݑ𞤽- -N; 𞵑ss.\u0751\u200D𞤛-; [B2 B3 C2 P1 V3 V6]; [B2 B3 C2 P1 V3 V6] # ss.ݑ𞤽- -T; 𞵑Ss.\u0751\u200D𞤛-; [B2 B3 C2 P1 V3 V6]; [B2 B3 P1 V3 V6] # ss.ݑ𞤽- -N; 𞵑Ss.\u0751\u200D𞤛-; [B2 B3 C2 P1 V3 V6]; [B2 B3 C2 P1 V3 V6] # ss.ݑ𞤽- -T; 𑘽\u200D𞤧.𐹧󡦪-; [B1 C2 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # 𑘽𞤧.𐹧- -N; 𑘽\u200D𞤧.𐹧󡦪-; [B1 C2 P1 V3 V5 V6]; [B1 C2 P1 V3 V5 V6] # 𑘽𞤧.𐹧- -T; 𑘽\u200D𞤧.𐹧󡦪-; [B1 C2 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # 𑘽𞤧.𐹧- -N; 𑘽\u200D𞤧.𐹧󡦪-; [B1 C2 P1 V3 V5 V6]; [B1 C2 P1 V3 V5 V6] # 𑘽𞤧.𐹧- -T; 𑘽\u200D𞤅.𐹧󡦪-; [B1 C2 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # 𑘽𞤧.𐹧- -N; 𑘽\u200D𞤅.𐹧󡦪-; [B1 C2 P1 V3 V5 V6]; [B1 C2 P1 V3 V5 V6] # 𑘽𞤧.𐹧- -B; xn--qb2ds317a.xn----k26iq1483f; [B1 V3 V5 V6]; [B1 V3 V5 V6] -B; xn--1ugz808gdimf.xn----k26iq1483f; [B1 C2 V3 V5 V6]; [B1 C2 V3 V5 V6] # 𑘽𞤧.𐹧- -T; 𑘽\u200D𞤅.𐹧󡦪-; [B1 C2 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # 𑘽𞤧.𐹧- -N; 𑘽\u200D𞤅.𐹧󡦪-; [B1 C2 P1 V3 V5 V6]; [B1 C2 P1 V3 V5 V6] # 𑘽𞤧.𐹧- -B; ⒒򨘙򳳠𑓀.-󞡊; [P1 V3 V6]; [P1 V3 V6] -B; 11.򨘙򳳠𑓀.-󞡊; [P1 V3 V6]; [P1 V3 V6] -B; 11.xn--uz1d59632bxujd.xn----x310m; [V3 V6]; [V3 V6] -B; xn--3shy698frsu9dt1me.xn----x310m; [V3 V6]; [V3 V6] -T; -。\u200D; [C2 V3]; [V3] # -. -N; -。\u200D; [C2 V3]; [C2 V3] # -. -T; -。\u200D; [C2 V3]; [V3] # -. -N; -。\u200D; [C2 V3]; [C2 V3] # -. -B; -.; [V3]; [V3] -B; -.xn--1ug; [C2 V3]; [C2 V3] # -. -T; ≮ᡬ.ς¹-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -N; ≮ᡬ.ς¹-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -T; <\u0338ᡬ.ς¹-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -N; <\u0338ᡬ.ς¹-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -T; ≮ᡬ.ς1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -N; ≮ᡬ.ς1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -T; <\u0338ᡬ.ς1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -N; <\u0338ᡬ.ς1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -B; <\u0338ᡬ.Σ1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; ≮ᡬ.Σ1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; ≮ᡬ.σ1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; <\u0338ᡬ.σ1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; xn--88e732c.σ1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; XN--88E732C.Σ1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -T; xn--88e732c.ς1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -N; xn--88e732c.ς1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -T; Xn--88E732c.ς1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -N; Xn--88E732c.ς1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.ς1- -B; Xn--88E732c.σ1-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; <\u0338ᡬ.Σ¹-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; ≮ᡬ.Σ¹-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; ≮ᡬ.σ¹-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; <\u0338ᡬ.σ¹-\uDB09; [P1 V6]; [P1 V6 A3] # ≮ᡬ.σ1- -B; ቬ򔠼񁗶。𐨬𝟠; [P1 V6]; [P1 V6] -B; ቬ򔠼񁗶。𐨬8; [P1 V6]; [P1 V6] -B; xn--d0d41273c887z.xn--8-ob5i; [V6]; [V6] -B; 𐱲。蔫\u0766; [B5 B6 P1 V6]; [B5 B6 P1 V6] # .蔫ݦ -B; xn--389c.xn--qpb7055d; [B5 B6 V6]; [B5 B6 V6] # .蔫ݦ -B; 򒲧₃。ꡚ𛇑󠄳\u0647; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 3.ꡚ𛇑ه -B; 򒲧3。ꡚ𛇑󠄳\u0647; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 3.ꡚ𛇑ه -B; xn--3-ep59g.xn--jhb5904fcp0h; [B5 B6 V6]; [B5 B6 V6] # 3.ꡚ𛇑ه -T; 蓸\u0642≠.ß; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ß -N; 蓸\u0642≠.ß; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ß -T; 蓸\u0642=\u0338.ß; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ß -N; 蓸\u0642=\u0338.ß; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ß -B; 蓸\u0642=\u0338.SS; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ss -B; 蓸\u0642≠.SS; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ss -B; 蓸\u0642≠.ss; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ss -B; 蓸\u0642=\u0338.ss; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ss -B; 蓸\u0642=\u0338.Ss; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ss -B; 蓸\u0642≠.Ss; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 蓸ق≠.ss -B; xn--ehb015lnt1e.ss; [B5 B6 V6]; [B5 B6 V6] # 蓸ق≠.ss -B; xn--ehb015lnt1e.xn--zca; [B5 B6 V6]; [B5 B6 V6] # 蓸ق≠.ß -T; \u084E\u067A\u0DD3⒊.𐹹𞱩󠃪\u200C; [B1 C1 P1 V6]; [B1 P1 V6] # ࡎٺී⒊.𐹹 -N; \u084E\u067A\u0DD3⒊.𐹹𞱩󠃪\u200C; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ࡎٺී⒊.𐹹 -T; \u084E\u067A\u0DD33..𐹹𞱩󠃪\u200C; [B1 C1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ࡎٺී3..𐹹 -N; \u084E\u067A\u0DD33..𐹹𞱩󠃪\u200C; [B1 C1 P1 V6 A4_2]; [B1 C1 P1 V6 A4_2] # ࡎٺී3..𐹹 -B; xn--3-prc71ls9j..xn--xo0dw109an237f; [B1 V6 A4_2]; [B1 V6 A4_2] # ࡎٺී3..𐹹 -B; xn--3-prc71ls9j..xn--0ug3205g7eyf3c96h; [B1 C1 V6 A4_2]; [B1 C1 V6 A4_2] # ࡎٺී3..𐹹 -B; xn--zib94gfziuq1a.xn--xo0dw109an237f; [B1 V6]; [B1 V6] # ࡎٺී⒊.𐹹 -B; xn--zib94gfziuq1a.xn--0ug3205g7eyf3c96h; [B1 C1 V6]; [B1 C1 V6] # ࡎٺී⒊.𐹹 -T; ς\u200D-.Ⴣ𦟙; [C2 P1 V3 V6]; [P1 V3 V6] # ς-.Ⴣ𦟙 -N; ς\u200D-.Ⴣ𦟙; [C2 P1 V3 V6]; [C2 P1 V3 V6] # ς-.Ⴣ𦟙 -T; ς\u200D-.ⴣ𦟙; [C2 V3]; [V3] # ς-.ⴣ𦟙 -N; ς\u200D-.ⴣ𦟙; [C2 V3]; [C2 V3] # ς-.ⴣ𦟙 -T; Σ\u200D-.Ⴣ𦟙; [C2 P1 V3 V6]; [P1 V3 V6] # σ-.Ⴣ𦟙 -N; Σ\u200D-.Ⴣ𦟙; [C2 P1 V3 V6]; [C2 P1 V3 V6] # σ-.Ⴣ𦟙 -T; σ\u200D-.ⴣ𦟙; [C2 V3]; [V3] # σ-.ⴣ𦟙 -N; σ\u200D-.ⴣ𦟙; [C2 V3]; [C2 V3] # σ-.ⴣ𦟙 -B; xn----zmb.xn--rlj2573p; [V3]; [V3] -B; xn----zmb048s.xn--rlj2573p; [C2 V3]; [C2 V3] # σ-.ⴣ𦟙 -B; xn----zmb.xn--7nd64871a; [V3 V6]; [V3 V6] -B; xn----zmb048s.xn--7nd64871a; [C2 V3 V6]; [C2 V3 V6] # σ-.Ⴣ𦟙 -B; xn----xmb348s.xn--rlj2573p; [C2 V3]; [C2 V3] # ς-.ⴣ𦟙 -B; xn----xmb348s.xn--7nd64871a; [C2 V3 V6]; [C2 V3 V6] # ς-.Ⴣ𦟙 -B; ≠。🞳𝟲; [P1 V6]; [P1 V6] -B; =\u0338。🞳𝟲; [P1 V6]; [P1 V6] -B; ≠。🞳6; [P1 V6]; [P1 V6] -B; =\u0338。🞳6; [P1 V6]; [P1 V6] -B; xn--1ch.xn--6-dl4s; [V6]; [V6] -B; 󅬽.蠔; [P1 V6]; [P1 V6] -B; xn--g747d.xn--xl2a; [V6]; [V6] -T; \u08E6\u200D.뼽; [C2 V5]; [V5] # ࣦ.뼽 -N; \u08E6\u200D.뼽; [C2 V5]; [C2 V5] # ࣦ.뼽 -T; \u08E6\u200D.뼽; [C2 V5]; [V5] # ࣦ.뼽 -N; \u08E6\u200D.뼽; [C2 V5]; [C2 V5] # ࣦ.뼽 -T; \u08E6\u200D.뼽; [C2 V5]; [V5] # ࣦ.뼽 -N; \u08E6\u200D.뼽; [C2 V5]; [C2 V5] # ࣦ.뼽 -T; \u08E6\u200D.뼽; [C2 V5]; [V5] # ࣦ.뼽 -N; \u08E6\u200D.뼽; [C2 V5]; [C2 V5] # ࣦ.뼽 -B; xn--p0b.xn--e43b; [V5]; [V5] # ࣦ.뼽 -B; xn--p0b869i.xn--e43b; [C2 V5]; [C2 V5] # ࣦ.뼽 -B; ₇\u0BCD􃂷\u06D2。👖\u0675-𞪑; [B1 P1 V6]; [B1 P1 V6] # 7்ے.👖اٴ- -B; 7\u0BCD􃂷\u06D2。👖\u0627\u0674-𞪑; [B1 P1 V6]; [B1 P1 V6] # 7்ے.👖اٴ- -B; xn--7-rwc839aj3073c.xn----ymc5uv818oghka; [B1 V6]; [B1 V6] # 7்ے.👖اٴ- -B; -。\u077B; [B1 V3]; [B1 V3] # -.ݻ -B; -。\u077B; [B1 V3]; [B1 V3] # -.ݻ -B; -.xn--cqb; [B1 V3]; [B1 V3] # -.ݻ -B; 𑇌𵛓。-⒈ꡏ\u072B; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # 𑇌.-⒈ꡏܫ -B; 𑇌𵛓。-1.ꡏ\u072B; [B1 B5 B6 P1 V3 V5 V6]; [B1 B5 B6 P1 V3 V5 V6] # 𑇌.-1.ꡏܫ -B; xn--8d1dg030h.-1.xn--1nb7163f; [B1 B5 B6 V3 V5 V6]; [B1 B5 B6 V3 V5 V6] # 𑇌.-1.ꡏܫ -B; xn--8d1dg030h.xn----u1c466tp10j; [B1 V3 V5 V6]; [B1 V3 V5 V6] # 𑇌.-⒈ꡏܫ -B; 璛\u1734\u06AF.-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # 璛᜴گ.- -B; xn--ikb175frt4e.-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # 璛᜴گ.- -B; 󠆰\u08A1\u0A4D샕.𐹲휁; [B1 B2 B3]; [B1 B2 B3] # ࢡ੍샕.𐹲휁 -B; 󠆰\u08A1\u0A4D샕.𐹲휁; [B1 B2 B3]; [B1 B2 B3] # ࢡ੍샕.𐹲휁 -B; 󠆰\u08A1\u0A4D샕.𐹲휁; [B1 B2 B3]; [B1 B2 B3] # ࢡ੍샕.𐹲휁 -B; 󠆰\u08A1\u0A4D샕.𐹲휁; [B1 B2 B3]; [B1 B2 B3] # ࢡ੍샕.𐹲휁 -B; xn--qyb07fj857a.xn--728bv72h; [B1 B2 B3]; [B1 B2 B3] # ࢡ੍샕.𐹲휁 -B; 񍨽.񋸕; [P1 V6]; [P1 V6] -B; 񍨽.񋸕; [P1 V6]; [P1 V6] -B; xn--pr3x.xn--rv7w; [V6]; [V6] -B; \u067D𞥕。𑑂𞤶Ⴍ-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ٽ𞥕.𑑂𞤶Ⴍ- -B; \u067D𞥕。𑑂𞤶Ⴍ-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ٽ𞥕.𑑂𞤶Ⴍ- -B; \u067D𞥕。𑑂𞤶ⴍ-; [B1 V3 V5]; [B1 V3 V5] # ٽ𞥕.𑑂𞤶ⴍ- -B; \u067D𞥕。𑑂𞤔Ⴍ-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ٽ𞥕.𑑂𞤶Ⴍ- -B; \u067D𞥕。𑑂𞤔ⴍ-; [B1 V3 V5]; [B1 V3 V5] # ٽ𞥕.𑑂𞤶ⴍ- -B; xn--2ib0338v.xn----zvs0199fo91g; [B1 V3 V5]; [B1 V3 V5] # ٽ𞥕.𑑂𞤶ⴍ- -B; xn--2ib0338v.xn----w0g2740ro9vg; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ٽ𞥕.𑑂𞤶Ⴍ- -B; \u067D𞥕。𑑂𞤶ⴍ-; [B1 V3 V5]; [B1 V3 V5] # ٽ𞥕.𑑂𞤶ⴍ- -B; \u067D𞥕。𑑂𞤔Ⴍ-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ٽ𞥕.𑑂𞤶Ⴍ- -B; \u067D𞥕。𑑂𞤔ⴍ-; [B1 V3 V5]; [B1 V3 V5] # ٽ𞥕.𑑂𞤶ⴍ- -B; 𐯀𐸉𞧏。񢚧₄Ⴋ񂹫; [P1 V6]; [P1 V6] -B; 𐯀𐸉𞧏。񢚧4Ⴋ񂹫; [P1 V6]; [P1 V6] -B; 𐯀𐸉𞧏。񢚧4ⴋ񂹫; [P1 V6]; [P1 V6] -B; xn--039c42bq865a.xn--4-wvs27840bnrzm; [V6]; [V6] -B; xn--039c42bq865a.xn--4-t0g49302fnrzm; [V6]; [V6] -B; 𐯀𐸉𞧏。񢚧₄ⴋ񂹫; [P1 V6]; [P1 V6] -B; 4\u06BD︒󠑥.≠; [B1 P1 V6]; [B1 P1 V6] # 4ڽ︒.≠ -B; 4\u06BD︒󠑥.=\u0338; [B1 P1 V6]; [B1 P1 V6] # 4ڽ︒.≠ -B; 4\u06BD。󠑥.≠; [B1 P1 V6]; [B1 P1 V6] # 4ڽ..≠ -B; 4\u06BD。󠑥.=\u0338; [B1 P1 V6]; [B1 P1 V6] # 4ڽ..≠ -B; xn--4-kvc.xn--5136e.xn--1ch; [B1 V6]; [B1 V6] # 4ڽ..≠ -B; xn--4-kvc5601q2h50i.xn--1ch; [B1 V6]; [B1 V6] # 4ڽ︒.≠ -B; 𝟓。\u06D7; [V5]; [V5] # 5.ۗ -B; 5。\u06D7; [V5]; [V5] # 5.ۗ -B; 5.xn--nlb; [V5]; [V5] # 5.ۗ -T; \u200C򺸩.⾕; [C1 P1 V6]; [P1 V6] # .谷 -N; \u200C򺸩.⾕; [C1 P1 V6]; [C1 P1 V6] # .谷 -T; \u200C򺸩.谷; [C1 P1 V6]; [P1 V6] # .谷 -N; \u200C򺸩.谷; [C1 P1 V6]; [C1 P1 V6] # .谷 -B; xn--i183d.xn--6g3a; [V6]; [V6] -B; xn--0ug26167i.xn--6g3a; [C1 V6]; [C1 V6] # .谷 -T; ︒󎰇\u200D.-\u073C\u200C; [C1 C2 P1 V3 V6]; [P1 V3 V6] # ︒.-ܼ -N; ︒󎰇\u200D.-\u073C\u200C; [C1 C2 P1 V3 V6]; [C1 C2 P1 V3 V6] # ︒.-ܼ -T; 。󎰇\u200D.-\u073C\u200C; [C1 C2 P1 V3 V6 A4_2]; [P1 V3 V6 A4_2] # ..-ܼ -N; 。󎰇\u200D.-\u073C\u200C; [C1 C2 P1 V3 V6 A4_2]; [C1 C2 P1 V3 V6 A4_2] # ..-ܼ -B; .xn--hh50e.xn----t2c; [V3 V6 A4_2]; [V3 V6 A4_2] # ..-ܼ -B; .xn--1ug05310k.xn----t2c071q; [C1 C2 V3 V6 A4_2]; [C1 C2 V3 V6 A4_2] # ..-ܼ -B; xn--y86c71305c.xn----t2c; [V3 V6]; [V3 V6] # ︒.-ܼ -B; xn--1ug1658ftw26f.xn----t2c071q; [C1 C2 V3 V6]; [C1 C2 V3 V6] # ︒.-ܼ -B; ≯𞤟。ᡨ; [B1 P1 V6]; [B1 P1 V6] -B; >\u0338𞤟。ᡨ; [B1 P1 V6]; [B1 P1 V6] -B; >\u0338𞥁。ᡨ; [B1 P1 V6]; [B1 P1 V6] -B; ≯𞥁。ᡨ; [B1 P1 V6]; [B1 P1 V6] -B; xn--hdhz520p.xn--48e; [B1 V6]; [B1 V6] -B; \u0F74𫫰𝨄。\u0713𐹦; [B1 V5]; [B1 V5] # ུ𫫰𝨄.ܓ𐹦 -B; xn--ned8985uo92e.xn--dnb6395k; [B1 V5]; [B1 V5] # ུ𫫰𝨄.ܓ𐹦 -B; \u033C\u07DB⁷𝟹。𝟬; [B1 V5]; [B1 V5] # ̼ߛ73.0 -B; \u033C\u07DB73。0; [B1 V5]; [B1 V5] # ̼ߛ73.0 -B; xn--73-9yb648b.0; [B1 V5]; [B1 V5] # ̼ߛ73.0 -T; \u200D.𝟗; [C2]; [A4_2] # .9 -N; \u200D.𝟗; [C2]; [C2] # .9 -T; \u200D.9; [C2]; [A4_2] # .9 -N; \u200D.9; [C2]; [C2] # .9 -B; .9; [A4_2]; [A4_2] -B; xn--1ug.9; [C2]; [C2] # .9 -B; 9; ; -B; \u0779ᡭ𪕈。\u06B6\u08D9; [B2 B3]; [B2 B3] # ݹᡭ𪕈.ڶࣙ -B; xn--9pb497fs270c.xn--pkb80i; [B2 B3]; [B2 B3] # ݹᡭ𪕈.ڶࣙ -B; \u07265\u07E2겙。\u1CF4𐷚; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ܦ5ߢ겙.᳴ -B; \u07265\u07E2겙。\u1CF4𐷚; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ܦ5ߢ겙.᳴ -B; \u07265\u07E2겙。\u1CF4𐷚; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ܦ5ߢ겙.᳴ -B; \u07265\u07E2겙。\u1CF4𐷚; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ܦ5ߢ겙.᳴ -B; xn--5-j1c97c2483c.xn--e7f2093h; [B1 B2 B3 V5 V6]; [B1 B2 B3 V5 V6] # ܦ5ߢ겙.᳴ -T; Ⴍ𿣍ꡨ\u05AE。Ⴞ\u200C\u200C; [C1 P1 V6]; [P1 V6] # Ⴍꡨ֮.Ⴞ -N; Ⴍ𿣍ꡨ\u05AE。Ⴞ\u200C\u200C; [C1 P1 V6]; [C1 P1 V6] # Ⴍꡨ֮.Ⴞ -T; ⴍ𿣍ꡨ\u05AE。ⴞ\u200C\u200C; [C1 P1 V6]; [P1 V6] # ⴍꡨ֮.ⴞ -N; ⴍ𿣍ꡨ\u05AE。ⴞ\u200C\u200C; [C1 P1 V6]; [C1 P1 V6] # ⴍꡨ֮.ⴞ -B; xn--5cb172r175fug38a.xn--mlj; [V6]; [V6] # ⴍꡨ֮.ⴞ -B; xn--5cb172r175fug38a.xn--0uga051h; [C1 V6]; [C1 V6] # ⴍꡨ֮.ⴞ -B; xn--5cb347co96jug15a.xn--2nd; [V6]; [V6] # Ⴍꡨ֮.Ⴞ -B; xn--5cb347co96jug15a.xn--2nd059ea; [C1 V6]; [C1 V6] # Ⴍꡨ֮.Ⴞ -B; 𐋰。󑓱; [P1 V6]; [P1 V6] -B; xn--k97c.xn--q031e; [V6]; [V6] -B; 󡎦\u17B4\u0B4D.𐹾; [B1 P1 V6]; [B1 P1 V6] # ୍.𐹾 -B; xn--9ic364dho91z.xn--2o0d; [B1 V6]; [B1 V6] # ୍.𐹾 -B; \u08DFႫ𶿸귤.򠅼𝟢휪\u0AE3; [P1 V5 V6]; [P1 V5 V6] # ࣟႫ귤.0휪ૣ -B; \u08DFႫ𶿸귤.򠅼𝟢휪\u0AE3; [P1 V5 V6]; [P1 V5 V6] # ࣟႫ귤.0휪ૣ -B; \u08DFႫ𶿸귤.򠅼0휪\u0AE3; [P1 V5 V6]; [P1 V5 V6] # ࣟႫ귤.0휪ૣ -B; \u08DFႫ𶿸귤.򠅼0휪\u0AE3; [P1 V5 V6]; [P1 V5 V6] # ࣟႫ귤.0휪ૣ -B; \u08DFⴋ𶿸귤.򠅼0휪\u0AE3; [P1 V5 V6]; [P1 V5 V6] # ࣟⴋ귤.0휪ૣ -B; \u08DFⴋ𶿸귤.򠅼0휪\u0AE3; [P1 V5 V6]; [P1 V5 V6] # ࣟⴋ귤.0휪ૣ -B; xn--i0b436pkl2g2h42a.xn--0-8le8997mulr5f; [V5 V6]; [V5 V6] # ࣟⴋ귤.0휪ૣ -B; xn--i0b601b6r7l2hs0a.xn--0-8le8997mulr5f; [V5 V6]; [V5 V6] # ࣟႫ귤.0휪ૣ -B; \u08DFⴋ𶿸귤.򠅼𝟢휪\u0AE3; [P1 V5 V6]; [P1 V5 V6] # ࣟⴋ귤.0휪ૣ -B; \u08DFⴋ𶿸귤.򠅼𝟢휪\u0AE3; [P1 V5 V6]; [P1 V5 V6] # ࣟⴋ귤.0휪ૣ -B; \u0784.𞡝\u0601; [P1 V6]; [P1 V6] # ބ.𞡝 -B; \u0784.𞡝\u0601; [P1 V6]; [P1 V6] # ބ.𞡝 -B; xn--lqb.xn--jfb1808v; [V6]; [V6] # ބ.𞡝 -T; \u0ACD₃.8\uA8C4\u200D🃤; [V5]; [V5] # ્3.8꣄🃤 -N; \u0ACD₃.8\uA8C4\u200D🃤; [V5]; [V5] # ્3.8꣄🃤 -T; \u0ACD3.8\uA8C4\u200D🃤; [V5]; [V5] # ્3.8꣄🃤 -N; \u0ACD3.8\uA8C4\u200D🃤; [V5]; [V5] # ્3.8꣄🃤 -B; xn--3-yke.xn--8-sl4et308f; [V5]; [V5] # ્3.8꣄🃤 -B; xn--3-yke.xn--8-ugnv982dbkwm; [V5]; [V5] # ્3.8꣄🃤 -B; ℻⩷𝆆。𞤠󠆁\u180C; [B6]; [B6] -B; FAX⩷𝆆。𞤠󠆁\u180C; [B6]; [B6] -B; fax⩷𝆆。𞥂󠆁\u180C; [B6]; [B6] -B; Fax⩷𝆆。𞤠󠆁\u180C; [B6]; [B6] -B; xn--fax-4c9a1676t.xn--6e6h; [B6]; [B6] -B; ℻⩷𝆆。𞥂󠆁\u180C; [B6]; [B6] -B; FAX⩷𝆆。𞥂󠆁\u180C; [B6]; [B6] -B; fax⩷𝆆。𞤠󠆁\u180C; [B6]; [B6] -B; fax⩷𝆆.𞥂; [B6]; [B6] -B; FAX⩷𝆆.𞤠; [B6]; [B6] -B; Fax⩷𝆆.𞤠; [B6]; [B6] -B; FAX⩷𝆆.𞥂; [B6]; [B6] -B; Fax⩷𝆆.𞥂; [B6]; [B6] -B; ꡕ≠\u105E󮿱。𐵧󠄫\uFFA0; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ꡕ≠ၞ. -B; ꡕ=\u0338\u105E󮿱。𐵧󠄫\uFFA0; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ꡕ≠ၞ. -B; ꡕ≠\u105E󮿱。𐵧󠄫\u1160; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ꡕ≠ၞ. -B; ꡕ=\u0338\u105E󮿱。𐵧󠄫\u1160; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ꡕ≠ၞ. -B; xn--cld333gn31h0158l.xn--psd1510k; [B2 B3 V6]; [B2 B3 V6] # ꡕ≠ၞ. -B; xn--cld333gn31h0158l.xn--cl7c96v; [B2 B3 V6]; [B2 B3 V6] # ꡕ≠ၞ. -T; 鱊。\u200C; [C1]; xn--rt6a. # 鱊. -N; 鱊。\u200C; [C1]; [C1] # 鱊. -B; xn--rt6a.; 鱊.; xn--rt6a. -B; 鱊.; ; xn--rt6a. -B; xn--rt6a.xn--0ug; [C1]; [C1] # 鱊. -B; 8𐹣.𑍨; [B1 B3 B6 V5]; [B1 B3 B6 V5] -B; 8𐹣.𑍨; [B1 B3 B6 V5]; [B1 B3 B6 V5] -B; xn--8-d26i.xn--0p1d; [B1 B3 B6 V5]; [B1 B3 B6 V5] -B; ⏹𐧀.𐫯; [B1]; [B1] -B; ⏹𐧀.𐫯; [B1]; [B1] -B; xn--qoh9161g.xn--1x9c; [B1]; [B1] -T; 𞤺\u07CC4.\u200D; [B1 C2]; xn--4-0bd15808a. # 𞤺ߌ4. -N; 𞤺\u07CC4.\u200D; [B1 C2]; [B1 C2] # 𞤺ߌ4. -T; 𞤺\u07CC4.\u200D; [B1 C2]; xn--4-0bd15808a. # 𞤺ߌ4. -N; 𞤺\u07CC4.\u200D; [B1 C2]; [B1 C2] # 𞤺ߌ4. -T; 𞤘\u07CC4.\u200D; [B1 C2]; xn--4-0bd15808a. # 𞤺ߌ4. -N; 𞤘\u07CC4.\u200D; [B1 C2]; [B1 C2] # 𞤺ߌ4. -B; xn--4-0bd15808a.; 𞤺\u07CC4.; xn--4-0bd15808a. # 𞤺ߌ4. -B; 𞤺\u07CC4.; ; xn--4-0bd15808a. # 𞤺ߌ4. -B; 𞤘\u07CC4.; 𞤺\u07CC4.; xn--4-0bd15808a. # 𞤺ߌ4. -B; xn--4-0bd15808a.xn--1ug; [B1 C2]; [B1 C2] # 𞤺ߌ4. -T; 𞤘\u07CC4.\u200D; [B1 C2]; xn--4-0bd15808a. # 𞤺ߌ4. -N; 𞤘\u07CC4.\u200D; [B1 C2]; [B1 C2] # 𞤺ߌ4. -B; ⒗\u0981\u20EF-.\u08E2•; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ⒗ঁ⃯-.• -B; 16.\u0981\u20EF-.\u08E2•; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # 16.ঁ⃯-.• -B; 16.xn----z0d801p.xn--l0b810j; [B1 V3 V5 V6]; [B1 V3 V5 V6] # 16.ঁ⃯-.• -B; xn----z0d801p6kd.xn--l0b810j; [B1 V3 V6]; [B1 V3 V6] # ⒗ঁ⃯-.• -B; -。䏛; [V3]; [V3] -B; -。䏛; [V3]; [V3] -B; -.xn--xco; [V3]; [V3] -T; \u200C񒃠.\u200D; [C1 C2 P1 V6]; [P1 V6] # . -N; \u200C񒃠.\u200D; [C1 C2 P1 V6]; [C1 C2 P1 V6] # . -T; \u200C񒃠.\u200D; [C1 C2 P1 V6]; [P1 V6] # . -N; \u200C񒃠.\u200D; [C1 C2 P1 V6]; [C1 C2 P1 V6] # . -B; xn--dj8y.; [V6]; [V6] -B; xn--0ugz7551c.xn--1ug; [C1 C2 V6]; [C1 C2 V6] # . -T; ⒈⓰󥣇。𐹠\u200D򗷦Ⴕ; [B1 C2 P1 V6]; [B1 P1 V6] # ⒈⓰.𐹠Ⴕ -N; ⒈⓰󥣇。𐹠\u200D򗷦Ⴕ; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ⒈⓰.𐹠Ⴕ -T; 1.⓰󥣇。𐹠\u200D򗷦Ⴕ; [B1 C2 P1 V6]; [B1 P1 V6] # 1.⓰.𐹠Ⴕ -N; 1.⓰󥣇。𐹠\u200D򗷦Ⴕ; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 1.⓰.𐹠Ⴕ -T; 1.⓰󥣇。𐹠\u200D򗷦ⴕ; [B1 C2 P1 V6]; [B1 P1 V6] # 1.⓰.𐹠ⴕ -N; 1.⓰󥣇。𐹠\u200D򗷦ⴕ; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 1.⓰.𐹠ⴕ -B; 1.xn--svh00804k.xn--dljv223ee5t2d; [B1 V6]; [B1 V6] -B; 1.xn--svh00804k.xn--1ug352csp0psg45e; [B1 C2 V6]; [B1 C2 V6] # 1.⓰.𐹠ⴕ -B; 1.xn--svh00804k.xn--tnd1990ke579c; [B1 V6]; [B1 V6] -B; 1.xn--svh00804k.xn--tnd969erj4psgl3e; [B1 C2 V6]; [B1 C2 V6] # 1.⓰.𐹠Ⴕ -T; ⒈⓰󥣇。𐹠\u200D򗷦ⴕ; [B1 C2 P1 V6]; [B1 P1 V6] # ⒈⓰.𐹠ⴕ -N; ⒈⓰󥣇。𐹠\u200D򗷦ⴕ; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ⒈⓰.𐹠ⴕ -B; xn--tsh0nz9380h.xn--dljv223ee5t2d; [B1 V6]; [B1 V6] -B; xn--tsh0nz9380h.xn--1ug352csp0psg45e; [B1 C2 V6]; [B1 C2 V6] # ⒈⓰.𐹠ⴕ -B; xn--tsh0nz9380h.xn--tnd1990ke579c; [B1 V6]; [B1 V6] -B; xn--tsh0nz9380h.xn--tnd969erj4psgl3e; [B1 C2 V6]; [B1 C2 V6] # ⒈⓰.𐹠Ⴕ -T; 𞠊ᠮ-ß。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ß.᳐効 -N; 𞠊ᠮ-ß。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ß.᳐効 -T; 𞠊ᠮ-ß。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ß.᳐効 -N; 𞠊ᠮ-ß。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ß.᳐効 -B; 𞠊ᠮ-SS。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ss.᳐効 -B; 𞠊ᠮ-ss。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ss.᳐効 -B; 𞠊ᠮ-Ss。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ss.᳐効 -B; xn---ss-21t18904a.xn--jfb197i791bi6x4c; [B1 B2 B3 V5 V6]; [B1 B2 B3 V5 V6] # 𞠊ᠮ-ss.᳐効 -B; xn----qfa310pg973b.xn--jfb197i791bi6x4c; [B1 B2 B3 V5 V6]; [B1 B2 B3 V5 V6] # 𞠊ᠮ-ß.᳐効 -B; 𞠊ᠮ-SS。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ss.᳐効 -B; 𞠊ᠮ-ss。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ss.᳐効 -B; 𞠊ᠮ-Ss。\u1CD0効\u0601𷣭; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # 𞠊ᠮ-ss.᳐効 -B; 𑇀.󠨱; [P1 V5 V6]; [P1 V5 V6] -B; xn--wd1d.xn--k946e; [V5 V6]; [V5 V6] -B; ␒3\uFB88。𝟘𐨿𐹆; [B1 P1 V6]; [B1 P1 V6] # ␒3ڈ.0𐨿 -B; ␒3\u0688。0𐨿𐹆; [B1 P1 V6]; [B1 P1 V6] # ␒3ڈ.0𐨿 -B; xn--3-jsc897t.xn--0-sc5iy3h; [B1 V6]; [B1 V6] # ␒3ڈ.0𐨿 -B; \u076B6\u0A81\u08A6。\u1DE3; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ݫ6ઁࢦ.ᷣ -B; \u076B6\u0A81\u08A6。\u1DE3; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ݫ6ઁࢦ.ᷣ -B; xn--6-h5c06gj6c.xn--7eg; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ݫ6ઁࢦ.ᷣ -T; \u0605-𽤞Ⴂ。򅤶\u200D; [B1 B6 C2 P1 V6]; [B1 P1 V6] # -Ⴂ. -N; \u0605-𽤞Ⴂ。򅤶\u200D; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # -Ⴂ. -T; \u0605-𽤞ⴂ。򅤶\u200D; [B1 B6 C2 P1 V6]; [B1 P1 V6] # -ⴂ. -N; \u0605-𽤞ⴂ。򅤶\u200D; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # -ⴂ. -B; xn----0kc8501a5399e.xn--ss06b; [B1 V6]; [B1 V6] # -ⴂ. -B; xn----0kc8501a5399e.xn--1ugy3204f; [B1 B6 C2 V6]; [B1 B6 C2 V6] # -ⴂ. -B; xn----0kc662fc152h.xn--ss06b; [B1 V6]; [B1 V6] # -Ⴂ. -B; xn----0kc662fc152h.xn--1ugy3204f; [B1 B6 C2 V6]; [B1 B6 C2 V6] # -Ⴂ. -T; ⾆.ꡈ5≯ß; [P1 V6]; [P1 V6] -N; ⾆.ꡈ5≯ß; [P1 V6]; [P1 V6] -T; ⾆.ꡈ5>\u0338ß; [P1 V6]; [P1 V6] -N; ⾆.ꡈ5>\u0338ß; [P1 V6]; [P1 V6] -T; 舌.ꡈ5≯ß; [P1 V6]; [P1 V6] -N; 舌.ꡈ5≯ß; [P1 V6]; [P1 V6] -T; 舌.ꡈ5>\u0338ß; [P1 V6]; [P1 V6] -N; 舌.ꡈ5>\u0338ß; [P1 V6]; [P1 V6] -B; 舌.ꡈ5>\u0338SS; [P1 V6]; [P1 V6] -B; 舌.ꡈ5≯SS; [P1 V6]; [P1 V6] -B; 舌.ꡈ5≯ss; [P1 V6]; [P1 V6] -B; 舌.ꡈ5>\u0338ss; [P1 V6]; [P1 V6] -B; 舌.ꡈ5>\u0338Ss; [P1 V6]; [P1 V6] -B; 舌.ꡈ5≯Ss; [P1 V6]; [P1 V6] -B; xn--tc1a.xn--5ss-3m2a5009e; [V6]; [V6] -B; xn--tc1a.xn--5-qfa988w745i; [V6]; [V6] -B; ⾆.ꡈ5>\u0338SS; [P1 V6]; [P1 V6] -B; ⾆.ꡈ5≯SS; [P1 V6]; [P1 V6] -B; ⾆.ꡈ5≯ss; [P1 V6]; [P1 V6] -B; ⾆.ꡈ5>\u0338ss; [P1 V6]; [P1 V6] -B; ⾆.ꡈ5>\u0338Ss; [P1 V6]; [P1 V6] -B; ⾆.ꡈ5≯Ss; [P1 V6]; [P1 V6] -T; \u0ACD8\u200D.򾂈\u075C; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ્8.ݜ -N; \u0ACD8\u200D.򾂈\u075C; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 C2 P1 V5 V6] # ્8.ݜ -T; \u0ACD8\u200D.򾂈\u075C; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ્8.ݜ -N; \u0ACD8\u200D.򾂈\u075C; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 C2 P1 V5 V6] # ્8.ݜ -B; xn--8-yke.xn--gpb79046m; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ્8.ݜ -B; xn--8-yke534n.xn--gpb79046m; [B1 B5 B6 C2 V5 V6]; [B1 B5 B6 C2 V5 V6] # ્8.ݜ -B; 򸷆\u0A70≮򹓙.񞎧⁷󠯙\u06B6; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ੰ≮.7ڶ -B; 򸷆\u0A70<\u0338򹓙.񞎧⁷󠯙\u06B6; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ੰ≮.7ڶ -B; 򸷆\u0A70≮򹓙.񞎧7󠯙\u06B6; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ੰ≮.7ڶ -B; 򸷆\u0A70<\u0338򹓙.񞎧7󠯙\u06B6; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ੰ≮.7ڶ -B; xn--ycc893jqh38rb6fa.xn--7-5uc53836ixt41c; [B5 B6 V6]; [B5 B6 V6] # ੰ≮.7ڶ -T; 𞤪.ς; ; xn--ie6h.xn--4xa -N; 𞤪.ς; ; xn--ie6h.xn--3xa -B; 𞤈.Σ; 𞤪.σ; xn--ie6h.xn--4xa -B; 𞤪.σ; ; xn--ie6h.xn--4xa -B; 𞤈.σ; 𞤪.σ; xn--ie6h.xn--4xa -B; xn--ie6h.xn--4xa; 𞤪.σ; xn--ie6h.xn--4xa -T; 𞤈.ς; 𞤪.ς; xn--ie6h.xn--4xa -N; 𞤈.ς; 𞤪.ς; xn--ie6h.xn--3xa -B; xn--ie6h.xn--3xa; 𞤪.ς; xn--ie6h.xn--3xa -B; 𞤪.Σ; 𞤪.σ; xn--ie6h.xn--4xa -T; \u200CႺ。ς; [C1 P1 V6]; [P1 V6] # Ⴚ.ς -N; \u200CႺ。ς; [C1 P1 V6]; [C1 P1 V6] # Ⴚ.ς -T; \u200CႺ。ς; [C1 P1 V6]; [P1 V6] # Ⴚ.ς -N; \u200CႺ。ς; [C1 P1 V6]; [C1 P1 V6] # Ⴚ.ς -T; \u200Cⴚ。ς; [C1]; xn--ilj.xn--4xa # ⴚ.ς -N; \u200Cⴚ。ς; [C1]; [C1] # ⴚ.ς -T; \u200CႺ。Σ; [C1 P1 V6]; [P1 V6] # Ⴚ.σ -N; \u200CႺ。Σ; [C1 P1 V6]; [C1 P1 V6] # Ⴚ.σ -T; \u200Cⴚ。σ; [C1]; xn--ilj.xn--4xa # ⴚ.σ -N; \u200Cⴚ。σ; [C1]; [C1] # ⴚ.σ -B; xn--ilj.xn--4xa; ⴚ.σ; xn--ilj.xn--4xa -B; ⴚ.σ; ; xn--ilj.xn--4xa -B; Ⴚ.Σ; [P1 V6]; [P1 V6] -T; ⴚ.ς; ; xn--ilj.xn--4xa -N; ⴚ.ς; ; xn--ilj.xn--3xa -T; Ⴚ.ς; [P1 V6]; [P1 V6] -N; Ⴚ.ς; [P1 V6]; [P1 V6] -B; xn--ynd.xn--4xa; [V6]; [V6] -B; xn--ynd.xn--3xa; [V6]; [V6] -B; xn--ilj.xn--3xa; ⴚ.ς; xn--ilj.xn--3xa -B; Ⴚ.σ; [P1 V6]; [P1 V6] -B; xn--0ug262c.xn--4xa; [C1]; [C1] # ⴚ.σ -B; xn--ynd759e.xn--4xa; [C1 V6]; [C1 V6] # Ⴚ.σ -B; xn--0ug262c.xn--3xa; [C1]; [C1] # ⴚ.ς -B; xn--ynd759e.xn--3xa; [C1 V6]; [C1 V6] # Ⴚ.ς -T; \u200Cⴚ。ς; [C1]; xn--ilj.xn--4xa # ⴚ.ς -N; \u200Cⴚ。ς; [C1]; [C1] # ⴚ.ς -T; \u200CႺ。Σ; [C1 P1 V6]; [P1 V6] # Ⴚ.σ -N; \u200CႺ。Σ; [C1 P1 V6]; [C1 P1 V6] # Ⴚ.σ -T; \u200Cⴚ。σ; [C1]; xn--ilj.xn--4xa # ⴚ.σ -N; \u200Cⴚ。σ; [C1]; [C1] # ⴚ.σ -B; 𞤃.𐹦; [B1]; [B1] -B; 𞤃.𐹦; [B1]; [B1] -B; 𞤥.𐹦; [B1]; [B1] -B; xn--de6h.xn--eo0d; [B1]; [B1] -B; 𞤥.𐹦; [B1]; [B1] -T; \u200D⾕。\u200C\u0310\uA953ꡎ; [C1 C2]; [V5] # 谷.꥓̐ꡎ -N; \u200D⾕。\u200C\u0310\uA953ꡎ; [C1 C2]; [C1 C2] # 谷.꥓̐ꡎ -T; \u200D⾕。\u200C\uA953\u0310ꡎ; [C1 C2]; [V5] # 谷.꥓̐ꡎ -N; \u200D⾕。\u200C\uA953\u0310ꡎ; [C1 C2]; [C1 C2] # 谷.꥓̐ꡎ -T; \u200D谷。\u200C\uA953\u0310ꡎ; [C1 C2]; [V5] # 谷.꥓̐ꡎ -N; \u200D谷。\u200C\uA953\u0310ꡎ; [C1 C2]; [C1 C2] # 谷.꥓̐ꡎ -B; xn--6g3a.xn--0sa8175flwa; [V5]; [V5] # 谷.꥓̐ꡎ -B; xn--1ug0273b.xn--0sa359l6n7g13a; [C1 C2]; [C1 C2] # 谷.꥓̐ꡎ -T; \u06AA-뉔.𞤐\u200C; [B2 B3 C1]; [B2 B3] # ڪ-뉔.𞤲 -N; \u06AA-뉔.𞤐\u200C; [B2 B3 C1]; [B2 B3 C1] # ڪ-뉔.𞤲 -T; \u06AA-뉔.𞤐\u200C; [B2 B3 C1]; [B2 B3] # ڪ-뉔.𞤲 -N; \u06AA-뉔.𞤐\u200C; [B2 B3 C1]; [B2 B3 C1] # ڪ-뉔.𞤲 -T; \u06AA-뉔.𞤐\u200C; [B2 B3 C1]; [B2 B3] # ڪ-뉔.𞤲 -N; \u06AA-뉔.𞤐\u200C; [B2 B3 C1]; [B2 B3 C1] # ڪ-뉔.𞤲 -T; \u06AA-뉔.𞤐\u200C; [B2 B3 C1]; [B2 B3] # ڪ-뉔.𞤲 -N; \u06AA-뉔.𞤐\u200C; [B2 B3 C1]; [B2 B3 C1] # ڪ-뉔.𞤲 -T; \u06AA-뉔.𞤲\u200C; [B2 B3 C1]; [B2 B3] # ڪ-뉔.𞤲 -N; \u06AA-뉔.𞤲\u200C; [B2 B3 C1]; [B2 B3 C1] # ڪ-뉔.𞤲 -T; \u06AA-뉔.𞤲\u200C; [B2 B3 C1]; [B2 B3] # ڪ-뉔.𞤲 -N; \u06AA-뉔.𞤲\u200C; [B2 B3 C1]; [B2 B3 C1] # ڪ-뉔.𞤲 -B; xn----guc3592k.xn--qe6h; [B2 B3]; [B2 B3] # ڪ-뉔.𞤲 -B; xn----guc3592k.xn--0ug7611p; [B2 B3 C1]; [B2 B3 C1] # ڪ-뉔.𞤲 -T; \u06AA-뉔.𞤲\u200C; [B2 B3 C1]; [B2 B3] # ڪ-뉔.𞤲 -N; \u06AA-뉔.𞤲\u200C; [B2 B3 C1]; [B2 B3 C1] # ڪ-뉔.𞤲 -T; \u06AA-뉔.𞤲\u200C; [B2 B3 C1]; [B2 B3] # ڪ-뉔.𞤲 -N; \u06AA-뉔.𞤲\u200C; [B2 B3 C1]; [B2 B3 C1] # ڪ-뉔.𞤲 -T; 񔲵5ᦛς.\uA8C4\u077B\u1CD2\u0738; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛς.꣄ݻܸ᳒ -N; 񔲵5ᦛς.\uA8C4\u077B\u1CD2\u0738; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛς.꣄ݻܸ᳒ -T; 񔲵5ᦛς.\uA8C4\u077B\u0738\u1CD2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛς.꣄ݻܸ᳒ -N; 񔲵5ᦛς.\uA8C4\u077B\u0738\u1CD2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛς.꣄ݻܸ᳒ -T; 񔲵5ᦛς.\uA8C4\u077B\u0738\u1CD2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛς.꣄ݻܸ᳒ -N; 񔲵5ᦛς.\uA8C4\u077B\u0738\u1CD2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛς.꣄ݻܸ᳒ -B; 񔲵5ᦛΣ.\uA8C4\u077B\u0738\u1CD2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛσ.꣄ݻܸ᳒ -B; 񔲵5ᦛσ.\uA8C4\u077B\u0738\u1CD2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛσ.꣄ݻܸ᳒ -B; xn--5-0mb988ng603j.xn--fob7kk44dl41k; [B1 V5 V6]; [B1 V5 V6] # 5ᦛσ.꣄ݻܸ᳒ -B; xn--5-ymb298ng603j.xn--fob7kk44dl41k; [B1 V5 V6]; [B1 V5 V6] # 5ᦛς.꣄ݻܸ᳒ -B; 񔲵5ᦛΣ.\uA8C4\u077B\u0738\u1CD2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛσ.꣄ݻܸ᳒ -B; 񔲵5ᦛσ.\uA8C4\u077B\u0738\u1CD2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛσ.꣄ݻܸ᳒ -B; 񔲵5ᦛΣ.\uA8C4\u077B\u1CD2\u0738; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛσ.꣄ݻܸ᳒ -B; 񔲵5ᦛσ.\uA8C4\u077B\u1CD2\u0738; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 5ᦛσ.꣄ݻܸ᳒ -B; 淽。ᠾ; 淽.ᠾ; xn--34w.xn--x7e -B; xn--34w.xn--x7e; 淽.ᠾ; xn--34w.xn--x7e -B; 淽.ᠾ; ; xn--34w.xn--x7e -B; 𐹴𑘷。-; [B1 V3]; [B1 V3] -B; xn--so0do6k.-; [B1 V3]; [B1 V3] -B; 򬨩Ⴓ❓。𑄨; [P1 V5 V6]; [P1 V5 V6] -B; 򬨩Ⴓ❓。𑄨; [P1 V5 V6]; [P1 V5 V6] -B; 򬨩ⴓ❓。𑄨; [P1 V5 V6]; [P1 V5 V6] -B; xn--8di78qvw32y.xn--k80d; [V5 V6]; [V5 V6] -B; xn--rnd896i0j14q.xn--k80d; [V5 V6]; [V5 V6] -B; 򬨩ⴓ❓。𑄨; [P1 V5 V6]; [P1 V5 V6] -T; \u200C𐹡𞤌Ⴇ。ßႣ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹡𞤮Ⴇ.ßႣ -N; \u200C𐹡𞤌Ⴇ。ßႣ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹡𞤮Ⴇ.ßႣ -T; \u200C𐹡𞤌Ⴇ。ßႣ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹡𞤮Ⴇ.ßႣ -N; \u200C𐹡𞤌Ⴇ。ßႣ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹡𞤮Ⴇ.ßႣ -T; \u200C𐹡𞤮ⴇ。ßⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ßⴃ -N; \u200C𐹡𞤮ⴇ。ßⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ßⴃ -T; \u200C𐹡𞤌Ⴇ。SSႣ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹡𞤮Ⴇ.ssႣ -N; \u200C𐹡𞤌Ⴇ。SSႣ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹡𞤮Ⴇ.ssႣ -T; \u200C𐹡𞤮ⴇ。ssⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ssⴃ -N; \u200C𐹡𞤮ⴇ。ssⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ssⴃ -T; \u200C𐹡𞤌ⴇ。Ssⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ssⴃ -N; \u200C𐹡𞤌ⴇ。Ssⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ssⴃ -B; xn--ykj9323eegwf.xn--ss-151a; [B1]; [B1] -B; xn--0ug332c3q0pr56g.xn--ss-151a; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ssⴃ -B; xn--fnd1201kegrf.xn--ss-fek; [B1 V6]; [B1 V6] -B; xn--fnd599eyj4pr50g.xn--ss-fek; [B1 C1 V6]; [B1 C1 V6] # 𐹡𞤮Ⴇ.ssႣ -B; xn--0ug332c3q0pr56g.xn--zca417t; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ßⴃ -B; xn--fnd599eyj4pr50g.xn--zca681f; [B1 C1 V6]; [B1 C1 V6] # 𐹡𞤮Ⴇ.ßႣ -T; \u200C𐹡𞤮ⴇ。ßⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ßⴃ -N; \u200C𐹡𞤮ⴇ。ßⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ßⴃ -T; \u200C𐹡𞤌Ⴇ。SSႣ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹡𞤮Ⴇ.ssႣ -N; \u200C𐹡𞤌Ⴇ。SSႣ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹡𞤮Ⴇ.ssႣ -T; \u200C𐹡𞤮ⴇ。ssⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ssⴃ -N; \u200C𐹡𞤮ⴇ。ssⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ssⴃ -T; \u200C𐹡𞤌ⴇ。Ssⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ssⴃ -N; \u200C𐹡𞤌ⴇ。Ssⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ssⴃ -T; \u200C𐹡𞤌ⴇ。ßⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ßⴃ -N; \u200C𐹡𞤌ⴇ。ßⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ßⴃ -T; \u200C𐹡𞤌ⴇ。ssⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ssⴃ -N; \u200C𐹡𞤌ⴇ。ssⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ssⴃ -T; \u200C𐹡𞤌Ⴇ。Ssⴃ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹡𞤮Ⴇ.ssⴃ -N; \u200C𐹡𞤌Ⴇ。Ssⴃ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹡𞤮Ⴇ.ssⴃ -B; xn--fnd1201kegrf.xn--ss-151a; [B1 V6]; [B1 V6] -B; xn--fnd599eyj4pr50g.xn--ss-151a; [B1 C1 V6]; [B1 C1 V6] # 𐹡𞤮Ⴇ.ssⴃ -T; \u200C𐹡𞤌ⴇ。ßⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ßⴃ -N; \u200C𐹡𞤌ⴇ。ßⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ßⴃ -T; \u200C𐹡𞤌ⴇ。ssⴃ; [B1 C1]; [B1] # 𐹡𞤮ⴇ.ssⴃ -N; \u200C𐹡𞤌ⴇ。ssⴃ; [B1 C1]; [B1 C1] # 𐹡𞤮ⴇ.ssⴃ -T; \u200C𐹡𞤌Ⴇ。Ssⴃ; [B1 C1 P1 V6]; [B1 P1 V6] # 𐹡𞤮Ⴇ.ssⴃ -N; \u200C𐹡𞤌Ⴇ。Ssⴃ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹡𞤮Ⴇ.ssⴃ -B; \u17FF。𞬳; [P1 V6]; [P1 V6] # . -B; \u17FF。𞬳; [P1 V6]; [P1 V6] # . -B; xn--45e.xn--et6h; [V6]; [V6] # . -T; \u0652\u200D。\u0CCD𑚳; [C2 V5]; [V5] # ْ.್𑚳 -N; \u0652\u200D。\u0CCD𑚳; [C2 V5]; [C2 V5] # ْ.್𑚳 -T; \u0652\u200D。\u0CCD𑚳; [C2 V5]; [V5] # ْ.್𑚳 -N; \u0652\u200D。\u0CCD𑚳; [C2 V5]; [C2 V5] # ْ.್𑚳 -B; xn--uhb.xn--8tc4527k; [V5]; [V5] # ْ.್𑚳 -B; xn--uhb882k.xn--8tc4527k; [C2 V5]; [C2 V5] # ْ.್𑚳 -B; -≠ᠻ.\u076D𞥃≮󟷺; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -≠ᠻ.ݭ𞥃≮ -B; -=\u0338ᠻ.\u076D𞥃<\u0338󟷺; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -≠ᠻ.ݭ𞥃≮ -B; -≠ᠻ.\u076D𞥃≮󟷺; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -≠ᠻ.ݭ𞥃≮ -B; -=\u0338ᠻ.\u076D𞥃<\u0338󟷺; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -≠ᠻ.ݭ𞥃≮ -B; -=\u0338ᠻ.\u076D𞤡<\u0338󟷺; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -≠ᠻ.ݭ𞥃≮ -B; -≠ᠻ.\u076D𞤡≮󟷺; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -≠ᠻ.ݭ𞥃≮ -B; xn----g6j886c.xn--xpb049kk353abj99f; [B1 B2 B3 V3 V6]; [B1 B2 B3 V3 V6] # -≠ᠻ.ݭ𞥃≮ -B; -=\u0338ᠻ.\u076D𞤡<\u0338󟷺; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -≠ᠻ.ݭ𞥃≮ -B; -≠ᠻ.\u076D𞤡≮󟷺; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # -≠ᠻ.ݭ𞥃≮ -B; 󠰆≯\u07B5𐻪.򊥕≮𑁆\u084C; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ≯.≮𑁆ࡌ -B; 󠰆>\u0338\u07B5𐻪.򊥕<\u0338𑁆\u084C; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ≯.≮𑁆ࡌ -B; 󠰆≯\u07B5𐻪.򊥕≮𑁆\u084C; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ≯.≮𑁆ࡌ -B; 󠰆>\u0338\u07B5𐻪.򊥕<\u0338𑁆\u084C; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ≯.≮𑁆ࡌ -B; xn--zrb797kdm1oes34i.xn--bwb394k8k2o25n6d; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ≯.≮𑁆ࡌ -B; ≠󦋂.\u0600\u0BCD-\u06B9; [B1 P1 V6]; [B1 P1 V6] # ≠.்-ڹ -B; =\u0338󦋂.\u0600\u0BCD-\u06B9; [B1 P1 V6]; [B1 P1 V6] # ≠.்-ڹ -B; xn--1ch22084l.xn----qkc07co6n; [B1 V6]; [B1 V6] # ≠.்-ڹ -B; \u17DD󠁣≠。𐹼𐋤; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ៝≠.𐹼𐋤 -B; \u17DD󠁣=\u0338。𐹼𐋤; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ៝≠.𐹼𐋤 -B; \u17DD󠁣≠。𐹼𐋤; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ៝≠.𐹼𐋤 -B; \u17DD󠁣=\u0338。𐹼𐋤; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ៝≠.𐹼𐋤 -B; xn--54e694cn389z.xn--787ct8r; [B1 V5 V6]; [B1 V5 V6] # ៝≠.𐹼𐋤 -T; ß𰀻񆬗。𝩨🕮ß; [P1 V5 V6]; [P1 V5 V6] -N; ß𰀻񆬗。𝩨🕮ß; [P1 V5 V6]; [P1 V5 V6] -T; ß𰀻񆬗。𝩨🕮ß; [P1 V5 V6]; [P1 V5 V6] -N; ß𰀻񆬗。𝩨🕮ß; [P1 V5 V6]; [P1 V5 V6] -B; SS𰀻񆬗。𝩨🕮SS; [P1 V5 V6]; [P1 V5 V6] -B; ss𰀻񆬗。𝩨🕮ss; [P1 V5 V6]; [P1 V5 V6] -B; Ss𰀻񆬗。𝩨🕮Ss; [P1 V5 V6]; [P1 V5 V6] -B; xn--ss-jl59biy67d.xn--ss-4d11aw87d; [V5 V6]; [V5 V6] -B; xn--zca20040bgrkh.xn--zca3653v86qa; [V5 V6]; [V5 V6] -B; SS𰀻񆬗。𝩨🕮SS; [P1 V5 V6]; [P1 V5 V6] -B; ss𰀻񆬗。𝩨🕮ss; [P1 V5 V6]; [P1 V5 V6] -B; Ss𰀻񆬗。𝩨🕮Ss; [P1 V5 V6]; [P1 V5 V6] -T; \u200D。\u200C; [C1 C2]; [A4_2] # . -N; \u200D。\u200C; [C1 C2]; [C1 C2] # . -B; xn--1ug.xn--0ug; [C1 C2]; [C1 C2] # . -T; \u0483𐭞\u200D.\u17B9𞯌򟩚; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ҃𐭞.ឹ -N; \u0483𐭞\u200D.\u17B9𞯌򟩚; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ҃𐭞.ឹ -B; xn--m3a6965k.xn--43e8670vmd79b; [B1 V5 V6]; [B1 V5 V6] # ҃𐭞.ឹ -B; xn--m3a412lrr0o.xn--43e8670vmd79b; [B1 C2 V5 V6]; [B1 C2 V5 V6] # ҃𐭞.ឹ -T; \u200C𐠨\u200C临。ꡢ򄷞ⶏ𐹣; [B1 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 P1 V6] # 𐠨临.ꡢⶏ𐹣 -N; \u200C𐠨\u200C临。ꡢ򄷞ⶏ𐹣; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # 𐠨临.ꡢⶏ𐹣 -B; xn--miq9646b.xn--uojv340bk71c99u9f; [B2 B3 B5 B6 V6]; [B2 B3 B5 B6 V6] -B; xn--0uga2656aop9k.xn--uojv340bk71c99u9f; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # 𐠨临.ꡢⶏ𐹣 -B; 󠑘.󠄮; [P1 V6]; [P1 V6] -B; 󠑘.󠄮; [P1 V6]; [P1 V6] -B; xn--s136e.; [V6]; [V6] -B; 𐫄\u0D4D.\uAAF6; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𐫄്.꫶ -B; 𐫄\u0D4D.\uAAF6; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𐫄്.꫶ -B; xn--wxc7880k.xn--2v9a; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𐫄്.꫶ -B; \uA9B7󝵙멹。⒛󠨇; [P1 V5 V6]; [P1 V5 V6] # ꦷ멹.⒛ -B; \uA9B7󝵙멹。⒛󠨇; [P1 V5 V6]; [P1 V5 V6] # ꦷ멹.⒛ -B; \uA9B7󝵙멹。20.󠨇; [P1 V5 V6]; [P1 V5 V6] # ꦷ멹.20. -B; \uA9B7󝵙멹。20.󠨇; [P1 V5 V6]; [P1 V5 V6] # ꦷ멹.20. -B; xn--ym9av13acp85w.20.xn--d846e; [V5 V6]; [V5 V6] # ꦷ멹.20. -B; xn--ym9av13acp85w.xn--dth22121k; [V5 V6]; [V5 V6] # ꦷ멹.⒛ -B; Ⴅ󲬹릖󠶚.\u0777𐹳⒊; [B4 B6 P1 V6]; [B4 B6 P1 V6] # Ⴅ릖.ݷ𐹳⒊ -B; Ⴅ󲬹릖󠶚.\u0777𐹳⒊; [B4 B6 P1 V6]; [B4 B6 P1 V6] # Ⴅ릖.ݷ𐹳⒊ -B; Ⴅ󲬹릖󠶚.\u0777𐹳3.; [B4 B6 P1 V6]; [B4 B6 P1 V6] # Ⴅ릖.ݷ𐹳3. -B; Ⴅ󲬹릖󠶚.\u0777𐹳3.; [B4 B6 P1 V6]; [B4 B6 P1 V6] # Ⴅ릖.ݷ𐹳3. -B; ⴅ󲬹릖󠶚.\u0777𐹳3.; [B4 B6 P1 V6]; [B4 B6 P1 V6] # ⴅ릖.ݷ𐹳3. -B; ⴅ󲬹릖󠶚.\u0777𐹳3.; [B4 B6 P1 V6]; [B4 B6 P1 V6] # ⴅ릖.ݷ𐹳3. -B; xn--wkj8016bne45io02g.xn--3-55c6803r.; [B4 B6 V6]; [B4 B6 V6] # ⴅ릖.ݷ𐹳3. -B; xn--dnd2167fnet0io02g.xn--3-55c6803r.; [B4 B6 V6]; [B4 B6 V6] # Ⴅ릖.ݷ𐹳3. -B; ⴅ󲬹릖󠶚.\u0777𐹳⒊; [B4 B6 P1 V6]; [B4 B6 P1 V6] # ⴅ릖.ݷ𐹳⒊ -B; ⴅ󲬹릖󠶚.\u0777𐹳⒊; [B4 B6 P1 V6]; [B4 B6 P1 V6] # ⴅ릖.ݷ𐹳⒊ -B; xn--wkj8016bne45io02g.xn--7pb000mwm4n; [B4 B6 V6]; [B4 B6 V6] # ⴅ릖.ݷ𐹳⒊ -B; xn--dnd2167fnet0io02g.xn--7pb000mwm4n; [B4 B6 V6]; [B4 B6 V6] # Ⴅ릖.ݷ𐹳⒊ -T; \u200C。︒; [C1 P1 V6]; [P1 V6 A4_2] # .︒ -N; \u200C。︒; [C1 P1 V6]; [C1 P1 V6] # .︒ -T; \u200C。。; [C1 A4_2]; [A4_2] # .. -N; \u200C。。; [C1 A4_2]; [C1 A4_2] # .. -B; ..; [A4_2]; [A4_2] -B; xn--0ug..; [C1 A4_2]; [C1 A4_2] # .. -B; .xn--y86c; [V6 A4_2]; [V6 A4_2] -B; xn--0ug.xn--y86c; [C1 V6]; [C1 V6] # .︒ -B; ≯\u076D.₄; [B1 P1 V6]; [B1 P1 V6] # ≯ݭ.4 -B; >\u0338\u076D.₄; [B1 P1 V6]; [B1 P1 V6] # ≯ݭ.4 -B; ≯\u076D.4; [B1 P1 V6]; [B1 P1 V6] # ≯ݭ.4 -B; >\u0338\u076D.4; [B1 P1 V6]; [B1 P1 V6] # ≯ݭ.4 -B; xn--xpb149k.4; [B1 V6]; [B1 V6] # ≯ݭ.4 -T; ᡲ-𝟹.ß-\u200C-; [C1 V3]; [V2 V3] # ᡲ-3.ß-- -N; ᡲ-𝟹.ß-\u200C-; [C1 V3]; [C1 V3] # ᡲ-3.ß-- -T; ᡲ-3.ß-\u200C-; [C1 V3]; [V2 V3] # ᡲ-3.ß-- -N; ᡲ-3.ß-\u200C-; [C1 V3]; [C1 V3] # ᡲ-3.ß-- -T; ᡲ-3.SS-\u200C-; [C1 V3]; [V2 V3] # ᡲ-3.ss-- -N; ᡲ-3.SS-\u200C-; [C1 V3]; [C1 V3] # ᡲ-3.ss-- -T; ᡲ-3.ss-\u200C-; [C1 V3]; [V2 V3] # ᡲ-3.ss-- -N; ᡲ-3.ss-\u200C-; [C1 V3]; [C1 V3] # ᡲ-3.ss-- -T; ᡲ-3.Ss-\u200C-; [C1 V3]; [V2 V3] # ᡲ-3.ss-- -N; ᡲ-3.Ss-\u200C-; [C1 V3]; [C1 V3] # ᡲ-3.ss-- -B; xn---3-p9o.ss--; [V2 V3]; [V2 V3] -B; xn---3-p9o.xn--ss---276a; [C1 V3]; [C1 V3] # ᡲ-3.ss-- -B; xn---3-p9o.xn-----fia9303a; [C1 V3]; [C1 V3] # ᡲ-3.ß-- -T; ᡲ-𝟹.SS-\u200C-; [C1 V3]; [V2 V3] # ᡲ-3.ss-- -N; ᡲ-𝟹.SS-\u200C-; [C1 V3]; [C1 V3] # ᡲ-3.ss-- -T; ᡲ-𝟹.ss-\u200C-; [C1 V3]; [V2 V3] # ᡲ-3.ss-- -N; ᡲ-𝟹.ss-\u200C-; [C1 V3]; [C1 V3] # ᡲ-3.ss-- -T; ᡲ-𝟹.Ss-\u200C-; [C1 V3]; [V2 V3] # ᡲ-3.ss-- -N; ᡲ-𝟹.Ss-\u200C-; [C1 V3]; [C1 V3] # ᡲ-3.ss-- -B; \uFD08𝟦\u0647󎊯。Ӏ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ضي4ه.Ӏ -B; \u0636\u064A4\u0647󎊯。Ӏ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ضي4ه.Ӏ -B; \u0636\u064A4\u0647󎊯。ӏ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ضي4ه.ӏ -B; xn--4-tnc6ck183523b.xn--s5a; [B2 B3 V6]; [B2 B3 V6] # ضي4ه.ӏ -B; xn--4-tnc6ck183523b.xn--d5a; [B2 B3 V6]; [B2 B3 V6] # ضي4ه.Ӏ -B; \uFD08𝟦\u0647󎊯。ӏ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ضي4ه.ӏ -B; -.\u0602\u0622𑆾🐹; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.آ𑆾🐹 -B; -.\u0602\u0627\u0653𑆾🐹; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.آ𑆾🐹 -B; -.xn--kfb8dy983hgl7g; [B1 V3 V6]; [B1 V3 V6] # -.آ𑆾🐹 -B; 󙶜ᢘ。\u1A7F⺢; [P1 V5 V6]; [P1 V5 V6] # ᢘ.᩿⺢ -B; xn--ibf35138o.xn--fpfz94g; [V5 V6]; [V5 V6] # ᢘ.᩿⺢ -B; ≠ႷᠤႫ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ႷᠤႫ.͌س觴 -B; =\u0338ႷᠤႫ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ႷᠤႫ.͌س觴 -B; ≠ႷᠤႫ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ႷᠤႫ.͌س觴 -B; =\u0338ႷᠤႫ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ႷᠤႫ.͌س觴 -B; =\u0338ⴗᠤⴋ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ⴗᠤⴋ.͌س觴 -B; ≠ⴗᠤⴋ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ⴗᠤⴋ.͌س觴 -B; ≠Ⴗᠤⴋ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠Ⴗᠤⴋ.͌س觴 -B; =\u0338Ⴗᠤⴋ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠Ⴗᠤⴋ.͌س觴 -B; xn--vnd619as6ig6k.\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠Ⴗᠤⴋ.͌س觴 -B; XN--VND619AS6IG6K.\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠Ⴗᠤⴋ.͌س觴 -B; Xn--Vnd619as6ig6k.\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠Ⴗᠤⴋ.͌س觴 -B; xn--66e353ce0ilb.\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ⴗᠤⴋ.͌س觴 -B; XN--66E353CE0ILB.\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ⴗᠤⴋ.͌س觴 -B; Xn--66E353ce0ilb.\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ⴗᠤⴋ.͌س觴 -B; xn--jndx718cnnl.\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ႷᠤႫ.͌س觴 -B; XN--JNDX718CNNL.\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ႷᠤႫ.͌س觴 -B; Xn--Jndx718cnnl.\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ႷᠤႫ.͌س觴 -B; =\u0338ⴗᠤⴋ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ⴗᠤⴋ.͌س觴 -B; ≠ⴗᠤⴋ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠ⴗᠤⴋ.͌س觴 -B; ≠Ⴗᠤⴋ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠Ⴗᠤⴋ.͌س觴 -B; =\u0338Ⴗᠤⴋ。\uD907\u034C\u0633觴; [B1 B5 P1 V6]; [B1 B5 P1 V6 A3] # ≠Ⴗᠤⴋ.͌س觴 -B; \u0667.𐥨; [B1 P1 V6]; [B1 P1 V6] # ٧. -B; xn--gib.xn--vm9c; [B1 V6]; [B1 V6] # ٧. -T; \uA9C0𝟯。\u200D񼑥𐹪\u1BF3; [B1 C2 P1 V5 V6]; [B5 P1 V5 V6] # ꧀3.𐹪᯳ -N; \uA9C0𝟯。\u200D񼑥𐹪\u1BF3; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ꧀3.𐹪᯳ -T; \uA9C03。\u200D񼑥𐹪\u1BF3; [B1 C2 P1 V5 V6]; [B5 P1 V5 V6] # ꧀3.𐹪᯳ -N; \uA9C03。\u200D񼑥𐹪\u1BF3; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ꧀3.𐹪᯳ -B; xn--3-5z4e.xn--1zfz754hncv8b; [B5 V5 V6]; [B5 V5 V6] # ꧀3.𐹪᯳ -B; xn--3-5z4e.xn--1zf96ony8ygd68c; [B1 C2 V5 V6]; [B1 C2 V5 V6] # ꧀3.𐹪᯳ -B; 򣕄4񠖽.≯\u0664𑀾󠸌; [B1 P1 V6]; [B1 P1 V6] # 4.≯٤𑀾 -B; 򣕄4񠖽.>\u0338\u0664𑀾󠸌; [B1 P1 V6]; [B1 P1 V6] # 4.≯٤𑀾 -B; xn--4-fg85dl688i.xn--dib174li86ntdy0i; [B1 V6]; [B1 V6] # 4.≯٤𑀾 -B; 򗆧𝟯。⒈\u1A76𝟚򠘌; [P1 V6]; [P1 V6] # 3.⒈᩶2 -B; 򗆧3。1.\u1A762򠘌; [P1 V5 V6]; [P1 V5 V6] # 3.1.᩶2 -B; xn--3-rj42h.1.xn--2-13k96240l; [V5 V6]; [V5 V6] # 3.1.᩶2 -B; xn--3-rj42h.xn--2-13k746cq465x; [V6]; [V6] # 3.⒈᩶2 -T; \u200D₅⒈。≯𝟴\u200D; [C2 P1 V6]; [P1 V6] # 5⒈.≯8 -N; \u200D₅⒈。≯𝟴\u200D; [C2 P1 V6]; [C2 P1 V6] # 5⒈.≯8 -T; \u200D₅⒈。>\u0338𝟴\u200D; [C2 P1 V6]; [P1 V6] # 5⒈.≯8 -N; \u200D₅⒈。>\u0338𝟴\u200D; [C2 P1 V6]; [C2 P1 V6] # 5⒈.≯8 -T; \u200D51.。≯8\u200D; [C2 P1 V6 A4_2]; [P1 V6 A4_2] # 51..≯8 -N; \u200D51.。≯8\u200D; [C2 P1 V6 A4_2]; [C2 P1 V6 A4_2] # 51..≯8 -T; \u200D51.。>\u03388\u200D; [C2 P1 V6 A4_2]; [P1 V6 A4_2] # 51..≯8 -N; \u200D51.。>\u03388\u200D; [C2 P1 V6 A4_2]; [C2 P1 V6 A4_2] # 51..≯8 -B; 51..xn--8-ogo; [V6 A4_2]; [V6 A4_2] -B; xn--51-l1t..xn--8-ugn00i; [C2 V6 A4_2]; [C2 V6 A4_2] # 51..≯8 -B; xn--5-ecp.xn--8-ogo; [V6]; [V6] -B; xn--5-tgnz5r.xn--8-ugn00i; [C2 V6]; [C2 V6] # 5⒈.≯8 -T; ꡰ\u0697\u1086.򪘙\u072F≠\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ꡰڗႆ.ܯ≠ -N; ꡰ\u0697\u1086.򪘙\u072F≠\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ꡰڗႆ.ܯ≠ -T; ꡰ\u0697\u1086.򪘙\u072F=\u0338\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ꡰڗႆ.ܯ≠ -N; ꡰ\u0697\u1086.򪘙\u072F=\u0338\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ꡰڗႆ.ܯ≠ -T; ꡰ\u0697\u1086.򪘙\u072F≠\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ꡰڗႆ.ܯ≠ -N; ꡰ\u0697\u1086.򪘙\u072F≠\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ꡰڗႆ.ܯ≠ -T; ꡰ\u0697\u1086.򪘙\u072F=\u0338\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ꡰڗႆ.ܯ≠ -N; ꡰ\u0697\u1086.򪘙\u072F=\u0338\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ꡰڗႆ.ܯ≠ -B; xn--tjb002cn51k.xn--5nb630lbj91q; [B5 B6 V6]; [B5 B6 V6] # ꡰڗႆ.ܯ≠ -B; xn--tjb002cn51k.xn--5nb448jcubcz547b; [B5 B6 C1 V6]; [B5 B6 C1 V6] # ꡰڗႆ.ܯ≠ -B; 𑄱。򪌿𐹵; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] -B; 𑄱。򪌿𐹵; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] -B; xn--t80d.xn--to0d14792b; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] -B; 𝟥\u0600。\u073D; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 3.ܽ -B; 3\u0600。\u073D; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 3.ܽ -B; xn--3-rkc.xn--kob; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # 3.ܽ -B; \u0637𐹣\u0666.\u076D긷; [B2 B3]; [B2 B3] # ط𐹣٦.ݭ긷 -B; \u0637𐹣\u0666.\u076D긷; [B2 B3]; [B2 B3] # ط𐹣٦.ݭ긷 -B; xn--2gb8gu829f.xn--xpb0156f; [B2 B3]; [B2 B3] # ط𐹣٦.ݭ긷 -B; ︒Ↄ\u2DE7򾀃.Ⴗ𐣞; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ︒Ↄⷧ.Ⴗ -B; 。Ↄ\u2DE7򾀃.Ⴗ𐣞; [B5 B6 P1 V6 A4_2]; [B5 B6 P1 V6 A4_2] # .Ↄⷧ.Ⴗ -B; 。ↄ\u2DE7򾀃.ⴗ𐣞; [B5 B6 P1 V6 A4_2]; [B5 B6 P1 V6 A4_2] # .ↄⷧ.ⴗ -B; .xn--r5gy00cll06u.xn--flj4541e; [B5 B6 V6 A4_2]; [B5 B6 V6 A4_2] # .ↄⷧ.ⴗ -B; .xn--q5g000cll06u.xn--vnd8618j; [B5 B6 V6 A4_2]; [B5 B6 V6 A4_2] # .Ↄⷧ.Ⴗ -B; ︒ↄ\u2DE7򾀃.ⴗ𐣞; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ︒ↄⷧ.ⴗ -B; xn--r5gy00c056n0226g.xn--flj4541e; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ︒ↄⷧ.ⴗ -B; xn--q5g000c056n0226g.xn--vnd8618j; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ︒Ↄⷧ.Ⴗ -B; \u0600.\u05B1; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # .ֱ -B; xn--ifb.xn--8cb; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # .ֱ -T; ς≯。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -N; ς≯。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -T; ς>\u0338。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -N; ς>\u0338。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -T; ς≯。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -N; ς≯。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -T; ς>\u0338。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -N; ς>\u0338。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; Σ>\u0338。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; Σ≯。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; σ≯。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; σ>\u0338。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; xn--4xa818m.xn--1o0d; [B1 B6 V6]; [B1 B6 V6] -B; xn--3xa028m.xn--1o0d; [B1 B6 V6]; [B1 B6 V6] -B; Σ>\u0338。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; Σ≯。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; σ≯。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; σ>\u0338。𐹽; [B1 B6 P1 V6]; [B1 B6 P1 V6] -T; \u17D2\u200D\u075F。𐹶; [B1 V5]; [B1 V5] # ្ݟ.𐹶 -N; \u17D2\u200D\u075F。𐹶; [B1 V5]; [B1 V5] # ្ݟ.𐹶 -B; xn--jpb535f.xn--uo0d; [B1 V5]; [B1 V5] # ្ݟ.𐹶 -B; xn--jpb535fv9f.xn--uo0d; [B1 V5]; [B1 V5] # ្ݟ.𐹶 -B; 𾷂\u0A42Ⴊ񂂟.≮; [P1 V6]; [P1 V6] # ੂႪ.≮ -B; 𾷂\u0A42Ⴊ񂂟.<\u0338; [P1 V6]; [P1 V6] # ੂႪ.≮ -B; 𾷂\u0A42ⴊ񂂟.<\u0338; [P1 V6]; [P1 V6] # ੂⴊ.≮ -B; 𾷂\u0A42ⴊ񂂟.≮; [P1 V6]; [P1 V6] # ੂⴊ.≮ -B; xn--nbc229o4y27dgskb.xn--gdh; [V6]; [V6] # ੂⴊ.≮ -B; xn--nbc493aro75ggskb.xn--gdh; [V6]; [V6] # ੂႪ.≮ -B; ꡠ.۲; ꡠ.۲; xn--5c9a.xn--fmb -B; ꡠ.۲; ; xn--5c9a.xn--fmb -B; xn--5c9a.xn--fmb; ꡠ.۲; xn--5c9a.xn--fmb -B; 𐹣񄷄。ꡬ🄄; [B1 P1 V6]; [B1 P1 V6] -B; 𐹣񄷄。ꡬ3,; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; xn--bo0d0203l.xn--3,-yj9h; [B1 B6 P1 V6]; [B1 B6 P1 V6] -B; xn--bo0d0203l.xn--id9a4443d; [B1 V6]; [B1 V6] -T; -\u0C4D𞾀𑲓。\u200D\u0D4D; [B1 C2 P1 V3 V6]; [B1 B3 B6 P1 V3 V5 V6] # -్𑲓.് -N; -\u0C4D𞾀𑲓。\u200D\u0D4D; [B1 C2 P1 V3 V6]; [B1 C2 P1 V3 V6] # -్𑲓.് -T; -\u0C4D𞾀𑲓。\u200D\u0D4D; [B1 C2 P1 V3 V6]; [B1 B3 B6 P1 V3 V5 V6] # -్𑲓.് -N; -\u0C4D𞾀𑲓。\u200D\u0D4D; [B1 C2 P1 V3 V6]; [B1 C2 P1 V3 V6] # -్𑲓.് -B; xn----x6e0220sclug.xn--wxc; [B1 B3 B6 V3 V5 V6]; [B1 B3 B6 V3 V5 V6] # -్𑲓.് -B; xn----x6e0220sclug.xn--wxc317g; [B1 C2 V3 V6]; [B1 C2 V3 V6] # -్𑲓.് -T; \uA67D\u200C霣🄆。\u200C𑁂\u1B01; [C1 P1 V5 V6]; [P1 V5 V6] # ꙽霣🄆.𑁂ᬁ -N; \uA67D\u200C霣🄆。\u200C𑁂\u1B01; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ꙽霣🄆.𑁂ᬁ -T; \uA67D\u200C霣🄆。\u200C𑁂\u1B01; [C1 P1 V5 V6]; [P1 V5 V6] # ꙽霣🄆.𑁂ᬁ -N; \uA67D\u200C霣🄆。\u200C𑁂\u1B01; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ꙽霣🄆.𑁂ᬁ -T; \uA67D\u200C霣5,。\u200C𑁂\u1B01; [C1 P1 V5 V6]; [P1 V5 V6] # ꙽霣5,.𑁂ᬁ -N; \uA67D\u200C霣5,。\u200C𑁂\u1B01; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ꙽霣5,.𑁂ᬁ -B; xn--5,-op8g373c.xn--4sf0725i; [P1 V5 V6]; [P1 V5 V6] # ꙽霣5,.𑁂ᬁ -B; xn--5,-i1tz135dnbqa.xn--4sf36u6u4w; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ꙽霣5,.𑁂ᬁ -B; xn--2q5a751a653w.xn--4sf0725i; [V5 V6]; [V5 V6] # ꙽霣🄆.𑁂ᬁ -B; xn--0ug4208b2vjuk63a.xn--4sf36u6u4w; [C1 V5 V6]; [C1 V5 V6] # ꙽霣🄆.𑁂ᬁ -B; 兎。ᠼ󠴜𑚶𑰿; [P1 V6]; [P1 V6] -B; 兎。ᠼ󠴜𑚶𑰿; [P1 V6]; [P1 V6] -B; xn--b5q.xn--v7e6041kqqd4m251b; [V6]; [V6] -T; 𝟙。\u200D𝟸\u200D⁷; [C2]; 1.27 # 1.27 -N; 𝟙。\u200D𝟸\u200D⁷; [C2]; [C2] # 1.27 -T; 1。\u200D2\u200D7; [C2]; 1.27 # 1.27 -N; 1。\u200D2\u200D7; [C2]; [C2] # 1.27 -B; 1.27; ; -B; 1.xn--27-l1tb; [C2]; [C2] # 1.27 -B; ᡨ-。󠻋𝟷; [P1 V3 V6]; [P1 V3 V6] -B; ᡨ-。󠻋1; [P1 V3 V6]; [P1 V3 V6] -B; xn----z8j.xn--1-5671m; [V3 V6]; [V3 V6] -B; 𑰻񵀐𐫚.\u0668⁹; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𑰻𐫚.٨9 -B; 𑰻񵀐𐫚.\u06689; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𑰻𐫚.٨9 -B; xn--gx9cr01aul57i.xn--9-oqc; [B1 V5 V6]; [B1 V5 V6] # 𑰻𐫚.٨9 -T; Ⴜ򈷭\u0F80⾇。Ⴏ♀\u200C\u200C; [C1 P1 V6]; [P1 V6] # Ⴜྀ舛.Ⴏ♀ -N; Ⴜ򈷭\u0F80⾇。Ⴏ♀\u200C\u200C; [C1 P1 V6]; [C1 P1 V6] # Ⴜྀ舛.Ⴏ♀ -T; Ⴜ򈷭\u0F80舛。Ⴏ♀\u200C\u200C; [C1 P1 V6]; [P1 V6] # Ⴜྀ舛.Ⴏ♀ -N; Ⴜ򈷭\u0F80舛。Ⴏ♀\u200C\u200C; [C1 P1 V6]; [C1 P1 V6] # Ⴜྀ舛.Ⴏ♀ -T; ⴜ򈷭\u0F80舛。ⴏ♀\u200C\u200C; [C1 P1 V6]; [P1 V6] # ⴜྀ舛.ⴏ♀ -N; ⴜ򈷭\u0F80舛。ⴏ♀\u200C\u200C; [C1 P1 V6]; [C1 P1 V6] # ⴜྀ舛.ⴏ♀ -B; xn--zed372mdj2do3v4h.xn--e5h11w; [V6]; [V6] # ⴜྀ舛.ⴏ♀ -B; xn--zed372mdj2do3v4h.xn--0uga678bgyh; [C1 V6]; [C1 V6] # ⴜྀ舛.ⴏ♀ -B; xn--zed54dz10wo343g.xn--nnd651i; [V6]; [V6] # Ⴜྀ舛.Ⴏ♀ -B; xn--zed54dz10wo343g.xn--nnd089ea464d; [C1 V6]; [C1 V6] # Ⴜྀ舛.Ⴏ♀ -T; ⴜ򈷭\u0F80⾇。ⴏ♀\u200C\u200C; [C1 P1 V6]; [P1 V6] # ⴜྀ舛.ⴏ♀ -N; ⴜ򈷭\u0F80⾇。ⴏ♀\u200C\u200C; [C1 P1 V6]; [C1 P1 V6] # ⴜྀ舛.ⴏ♀ -T; 𑁆𝟰.\u200D; [C2 V5]; [V5] # 𑁆4. -N; 𑁆𝟰.\u200D; [C2 V5]; [C2 V5] # 𑁆4. -T; 𑁆4.\u200D; [C2 V5]; [V5] # 𑁆4. -N; 𑁆4.\u200D; [C2 V5]; [C2 V5] # 𑁆4. -B; xn--4-xu7i.; [V5]; [V5] -B; xn--4-xu7i.xn--1ug; [C2 V5]; [C2 V5] # 𑁆4. -T; 񮴘Ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [P1 V5 V6] # Ⴞ癀.𑘿붼 -N; 񮴘Ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [C1 P1 V5 V6] # Ⴞ癀.𑘿붼 -T; 񮴘Ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [P1 V5 V6] # Ⴞ癀.𑘿붼 -N; 񮴘Ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [C1 P1 V5 V6] # Ⴞ癀.𑘿붼 -T; 񮴘Ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [P1 V5 V6] # Ⴞ癀.𑘿붼 -N; 񮴘Ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [C1 P1 V5 V6] # Ⴞ癀.𑘿붼 -T; 񮴘Ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [P1 V5 V6] # Ⴞ癀.𑘿붼 -N; 񮴘Ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [C1 P1 V5 V6] # Ⴞ癀.𑘿붼 -T; 񮴘ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [P1 V5 V6] # ⴞ癀.𑘿붼 -N; 񮴘ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ⴞ癀.𑘿붼 -T; 񮴘ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [P1 V5 V6] # ⴞ癀.𑘿붼 -N; 񮴘ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ⴞ癀.𑘿붼 -B; xn--mlju35u7qx2f.xn--et3bn23n; [V5 V6]; [V5 V6] -B; xn--mlju35u7qx2f.xn--0ugb6122js83c; [C1 V5 V6]; [C1 V5 V6] # ⴞ癀.𑘿붼 -B; xn--2nd6803c7q37d.xn--et3bn23n; [V5 V6]; [V5 V6] -B; xn--2nd6803c7q37d.xn--0ugb6122js83c; [C1 V5 V6]; [C1 V5 V6] # Ⴞ癀.𑘿붼 -T; 񮴘ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [P1 V5 V6] # ⴞ癀.𑘿붼 -N; 񮴘ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ⴞ癀.𑘿붼 -T; 񮴘ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [P1 V5 V6] # ⴞ癀.𑘿붼 -N; 񮴘ⴞ癀。𑘿\u200D\u200C붼; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ⴞ癀.𑘿붼 -B; 󚀅-\u0BCD。\u06B9; [B6 P1 V6]; [B6 P1 V6] # -்.ڹ -B; xn----mze84808x.xn--skb; [B6 V6]; [B6 V6] # -்.ڹ -B; ᡃ𝟧≯ᠣ.氁񨏱ꁫ; [P1 V6]; [P1 V6] -B; ᡃ𝟧>\u0338ᠣ.氁񨏱ꁫ; [P1 V6]; [P1 V6] -B; ᡃ5≯ᠣ.氁񨏱ꁫ; [P1 V6]; [P1 V6] -B; ᡃ5>\u0338ᠣ.氁񨏱ꁫ; [P1 V6]; [P1 V6] -B; xn--5-24jyf768b.xn--lqw213ime95g; [V6]; [V6] -B; 𐹬𝩇.\u0F76; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𐹬𝩇.ྲྀ -B; 𐹬𝩇.\u0FB2\u0F80; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𐹬𝩇.ྲྀ -B; 𐹬𝩇.\u0FB2\u0F80; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𐹬𝩇.ྲྀ -B; xn--ko0d8295a.xn--zed3h; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𐹬𝩇.ྲྀ -B; -𑈶⒏.⒎𰛢󠎭; [P1 V3 V6]; [P1 V3 V6] -B; -𑈶8..7.𰛢󠎭; [P1 V3 V6 A4_2]; [P1 V3 V6 A4_2] -B; xn---8-bv5o..7.xn--c35nf1622b; [V3 V6 A4_2]; [V3 V6 A4_2] -B; xn----scp6252h.xn--zshy411yzpx2d; [V3 V6]; [V3 V6] -T; \u200CႡ畝\u200D.≮; [C1 C2 P1 V6]; [P1 V6] # Ⴁ畝.≮ -N; \u200CႡ畝\u200D.≮; [C1 C2 P1 V6]; [C1 C2 P1 V6] # Ⴁ畝.≮ -T; \u200CႡ畝\u200D.<\u0338; [C1 C2 P1 V6]; [P1 V6] # Ⴁ畝.≮ -N; \u200CႡ畝\u200D.<\u0338; [C1 C2 P1 V6]; [C1 C2 P1 V6] # Ⴁ畝.≮ -T; \u200CႡ畝\u200D.≮; [C1 C2 P1 V6]; [P1 V6] # Ⴁ畝.≮ -N; \u200CႡ畝\u200D.≮; [C1 C2 P1 V6]; [C1 C2 P1 V6] # Ⴁ畝.≮ -T; \u200CႡ畝\u200D.<\u0338; [C1 C2 P1 V6]; [P1 V6] # Ⴁ畝.≮ -N; \u200CႡ畝\u200D.<\u0338; [C1 C2 P1 V6]; [C1 C2 P1 V6] # Ⴁ畝.≮ -T; \u200Cⴁ畝\u200D.<\u0338; [C1 C2 P1 V6]; [P1 V6] # ⴁ畝.≮ -N; \u200Cⴁ畝\u200D.<\u0338; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ⴁ畝.≮ -T; \u200Cⴁ畝\u200D.≮; [C1 C2 P1 V6]; [P1 V6] # ⴁ畝.≮ -N; \u200Cⴁ畝\u200D.≮; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ⴁ畝.≮ -B; xn--skjy82u.xn--gdh; [V6]; [V6] -B; xn--0ugc160hb36e.xn--gdh; [C1 C2 V6]; [C1 C2 V6] # ⴁ畝.≮ -B; xn--8md0962c.xn--gdh; [V6]; [V6] -B; xn--8md700fea3748f.xn--gdh; [C1 C2 V6]; [C1 C2 V6] # Ⴁ畝.≮ -T; \u200Cⴁ畝\u200D.<\u0338; [C1 C2 P1 V6]; [P1 V6] # ⴁ畝.≮ -N; \u200Cⴁ畝\u200D.<\u0338; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ⴁ畝.≮ -T; \u200Cⴁ畝\u200D.≮; [C1 C2 P1 V6]; [P1 V6] # ⴁ畝.≮ -N; \u200Cⴁ畝\u200D.≮; [C1 C2 P1 V6]; [C1 C2 P1 V6] # ⴁ畝.≮ -T; 歷。𐹻≯󳛽\u200D; [B1 C2 P1 V6]; [B1 P1 V6] # 歷.𐹻≯ -N; 歷。𐹻≯󳛽\u200D; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 歷.𐹻≯ -T; 歷。𐹻>\u0338󳛽\u200D; [B1 C2 P1 V6]; [B1 P1 V6] # 歷.𐹻≯ -N; 歷。𐹻>\u0338󳛽\u200D; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 歷.𐹻≯ -T; 歷。𐹻≯󳛽\u200D; [B1 C2 P1 V6]; [B1 P1 V6] # 歷.𐹻≯ -N; 歷。𐹻≯󳛽\u200D; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 歷.𐹻≯ -T; 歷。𐹻>\u0338󳛽\u200D; [B1 C2 P1 V6]; [B1 P1 V6] # 歷.𐹻≯ -N; 歷。𐹻>\u0338󳛽\u200D; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 歷.𐹻≯ -B; xn--nmw.xn--hdh7804gdms2h; [B1 V6]; [B1 V6] -B; xn--nmw.xn--1ugx6gs128a1134j; [B1 C2 V6]; [B1 C2 V6] # 歷.𐹻≯ -T; \u0ECB\u200D.鎁󠰑; [C2 P1 V5 V6]; [P1 V5 V6] # ໋.鎁 -N; \u0ECB\u200D.鎁󠰑; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ໋.鎁 -T; \u0ECB\u200D.鎁󠰑; [C2 P1 V5 V6]; [P1 V5 V6] # ໋.鎁 -N; \u0ECB\u200D.鎁󠰑; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ໋.鎁 -B; xn--t8c.xn--iz4a43209d; [V5 V6]; [V5 V6] # ໋.鎁 -B; xn--t8c059f.xn--iz4a43209d; [C2 V5 V6]; [C2 V5 V6] # ໋.鎁 -T; \u200D\u200C𞤀。𱘅𐶃; [B1 B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # 𞤢. -N; \u200D\u200C𞤀。𱘅𐶃; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 C1 C2 P1 V6] # 𞤢. -T; \u200D\u200C𞤀。𱘅𐶃; [B1 B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # 𞤢. -N; \u200D\u200C𞤀。𱘅𐶃; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 C1 C2 P1 V6] # 𞤢. -T; \u200D\u200C𞤢。𱘅𐶃; [B1 B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # 𞤢. -N; \u200D\u200C𞤢。𱘅𐶃; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 C1 C2 P1 V6] # 𞤢. -B; xn--9d6h.xn--wh0dj799f; [B5 B6 V6]; [B5 B6 V6] -B; xn--0ugb45126a.xn--wh0dj799f; [B1 B5 B6 C1 C2 V6]; [B1 B5 B6 C1 C2 V6] # 𞤢. -T; \u200D\u200C𞤢。𱘅𐶃; [B1 B5 B6 C1 C2 P1 V6]; [B5 B6 P1 V6] # 𞤢. -N; \u200D\u200C𞤢。𱘅𐶃; [B1 B5 B6 C1 C2 P1 V6]; [B1 B5 B6 C1 C2 P1 V6] # 𞤢. -T; \u0628≠𝟫-.ς⒍𐹦≠; [B3 B5 B6 P1 V3 V6]; [B3 B5 B6 P1 V3 V6] # ب≠9-.ς⒍𐹦≠ -N; \u0628≠𝟫-.ς⒍𐹦≠; [B3 B5 B6 P1 V3 V6]; [B3 B5 B6 P1 V3 V6] # ب≠9-.ς⒍𐹦≠ -T; \u0628=\u0338𝟫-.ς⒍𐹦=\u0338; [B3 B5 B6 P1 V3 V6]; [B3 B5 B6 P1 V3 V6] # ب≠9-.ς⒍𐹦≠ -N; \u0628=\u0338𝟫-.ς⒍𐹦=\u0338; [B3 B5 B6 P1 V3 V6]; [B3 B5 B6 P1 V3 V6] # ب≠9-.ς⒍𐹦≠ -T; \u0628≠9-.ς6.𐹦≠; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # ب≠9-.ς6.𐹦≠ -N; \u0628≠9-.ς6.𐹦≠; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # ب≠9-.ς6.𐹦≠ -T; \u0628=\u03389-.ς6.𐹦=\u0338; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # ب≠9-.ς6.𐹦≠ -N; \u0628=\u03389-.ς6.𐹦=\u0338; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # ب≠9-.ς6.𐹦≠ -B; \u0628=\u03389-.Σ6.𐹦=\u0338; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # ب≠9-.σ6.𐹦≠ -B; \u0628≠9-.Σ6.𐹦≠; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # ب≠9-.σ6.𐹦≠ -B; \u0628≠9-.σ6.𐹦≠; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # ب≠9-.σ6.𐹦≠ -B; \u0628=\u03389-.σ6.𐹦=\u0338; [B1 B3 P1 V3 V6]; [B1 B3 P1 V3 V6] # ب≠9-.σ6.𐹦≠ -B; xn--9--etd0100a.xn--6-zmb.xn--1ch8704g; [B1 B3 V3 V6]; [B1 B3 V3 V6] # ب≠9-.σ6.𐹦≠ -B; xn--9--etd0100a.xn--6-xmb.xn--1ch8704g; [B1 B3 V3 V6]; [B1 B3 V3 V6] # ب≠9-.ς6.𐹦≠ -B; \u0628=\u0338𝟫-.Σ⒍𐹦=\u0338; [B3 B5 B6 P1 V3 V6]; [B3 B5 B6 P1 V3 V6] # ب≠9-.σ⒍𐹦≠ -B; \u0628≠𝟫-.Σ⒍𐹦≠; [B3 B5 B6 P1 V3 V6]; [B3 B5 B6 P1 V3 V6] # ب≠9-.σ⒍𐹦≠ -B; \u0628≠𝟫-.σ⒍𐹦≠; [B3 B5 B6 P1 V3 V6]; [B3 B5 B6 P1 V3 V6] # ب≠9-.σ⒍𐹦≠ -B; \u0628=\u0338𝟫-.σ⒍𐹦=\u0338; [B3 B5 B6 P1 V3 V6]; [B3 B5 B6 P1 V3 V6] # ب≠9-.σ⒍𐹦≠ -B; xn--9--etd0100a.xn--4xa887mzpbzz04b; [B3 B5 B6 V3 V6]; [B3 B5 B6 V3 V6] # ب≠9-.σ⒍𐹦≠ -B; xn--9--etd0100a.xn--3xa097mzpbzz04b; [B3 B5 B6 V3 V6]; [B3 B5 B6 V3 V6] # ب≠9-.ς⒍𐹦≠ -B; 򉛴.-ᡢ\u0592𝨠; [P1 V3 V6]; [P1 V3 V6] # .-ᡢ֒𝨠 -B; xn--ep37b.xn----hec165lho83b; [V3 V6]; [V3 V6] # .-ᡢ֒𝨠 -T; \u06CB⒈ß󠄽。񷋍-; [B2 B3 B6 P1 V3 V6]; [B2 B3 B6 P1 V3 V6] # ۋ⒈ß.- -N; \u06CB⒈ß󠄽。񷋍-; [B2 B3 B6 P1 V3 V6]; [B2 B3 B6 P1 V3 V6] # ۋ⒈ß.- -T; \u06CB1.ß󠄽。񷋍-; [B6 P1 V3 V6]; [B6 P1 V3 V6] # ۋ1.ß.- -N; \u06CB1.ß󠄽。񷋍-; [B6 P1 V3 V6]; [B6 P1 V3 V6] # ۋ1.ß.- -B; \u06CB1.SS󠄽。񷋍-; [B6 P1 V3 V6]; [B6 P1 V3 V6] # ۋ1.ss.- -B; \u06CB1.ss󠄽。񷋍-; [B6 P1 V3 V6]; [B6 P1 V3 V6] # ۋ1.ss.- -B; \u06CB1.Ss󠄽。񷋍-; [B6 P1 V3 V6]; [B6 P1 V3 V6] # ۋ1.ss.- -B; xn--1-cwc.ss.xn----q001f; [B6 V3 V6]; [B6 V3 V6] # ۋ1.ss.- -B; xn--1-cwc.xn--zca.xn----q001f; [B6 V3 V6]; [B6 V3 V6] # ۋ1.ß.- -B; \u06CB⒈SS󠄽。񷋍-; [B2 B3 B6 P1 V3 V6]; [B2 B3 B6 P1 V3 V6] # ۋ⒈ss.- -B; \u06CB⒈ss󠄽。񷋍-; [B2 B3 B6 P1 V3 V6]; [B2 B3 B6 P1 V3 V6] # ۋ⒈ss.- -B; \u06CB⒈Ss󠄽。񷋍-; [B2 B3 B6 P1 V3 V6]; [B2 B3 B6 P1 V3 V6] # ۋ⒈ss.- -B; xn--ss-d7d6651a.xn----q001f; [B2 B3 B6 V3 V6]; [B2 B3 B6 V3 V6] # ۋ⒈ss.- -B; xn--zca541ato3a.xn----q001f; [B2 B3 B6 V3 V6]; [B2 B3 B6 V3 V6] # ۋ⒈ß.- -T; 𿀫.\u1BAAςႦ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪ςႦ -N; 𿀫.\u1BAAςႦ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪ςႦ -T; 𿀫.\u1BAAςႦ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪ςႦ -N; 𿀫.\u1BAAςႦ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪ςႦ -T; 𿀫.\u1BAAςⴆ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪ςⴆ -N; 𿀫.\u1BAAςⴆ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪ςⴆ -T; 𿀫.\u1BAAΣႦ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪σႦ -N; 𿀫.\u1BAAΣႦ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪σႦ -T; 𿀫.\u1BAAσⴆ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪σⴆ -N; 𿀫.\u1BAAσⴆ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪σⴆ -T; 𿀫.\u1BAAΣⴆ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪σⴆ -N; 𿀫.\u1BAAΣⴆ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪σⴆ -B; xn--nu4s.xn--4xa153j7im; [V5 V6]; [V5 V6] # .᮪σⴆ -B; xn--nu4s.xn--4xa153jk8cs1q; [C2 V5 V6]; [C2 V5 V6] # .᮪σⴆ -B; xn--nu4s.xn--4xa217dxri; [V5 V6]; [V5 V6] # .᮪σႦ -B; xn--nu4s.xn--4xa217dxriome; [C2 V5 V6]; [C2 V5 V6] # .᮪σႦ -B; xn--nu4s.xn--3xa353jk8cs1q; [C2 V5 V6]; [C2 V5 V6] # .᮪ςⴆ -B; xn--nu4s.xn--3xa417dxriome; [C2 V5 V6]; [C2 V5 V6] # .᮪ςႦ -T; 𿀫.\u1BAAςⴆ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪ςⴆ -N; 𿀫.\u1BAAςⴆ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪ςⴆ -T; 𿀫.\u1BAAΣႦ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪σႦ -N; 𿀫.\u1BAAΣႦ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪σႦ -T; 𿀫.\u1BAAσⴆ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪σⴆ -N; 𿀫.\u1BAAσⴆ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪σⴆ -T; 𿀫.\u1BAAΣⴆ\u200D; [C2 P1 V5 V6]; [P1 V5 V6] # .᮪σⴆ -N; 𿀫.\u1BAAΣⴆ\u200D; [C2 P1 V5 V6]; [C2 P1 V5 V6] # .᮪σⴆ -B; ⾆\u08E2.𝈴; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # 舌.𝈴 -B; 舌\u08E2.𝈴; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # 舌.𝈴 -B; xn--l0b9413d.xn--kl1h; [B1 B5 B6 V6]; [B1 B5 B6 V6] # 舌.𝈴 -B; ⫞𐹶𖫴。⭠⒈; [B1 P1 V6]; [B1 P1 V6] -B; ⫞𐹶𖫴。⭠1.; [B1]; [B1] -B; xn--53ix188et88b.xn--1-h6r.; [B1]; [B1] -B; xn--53ix188et88b.xn--tsh52w; [B1 V6]; [B1 V6] -T; ⒈\u200C\uAAEC︒.\u0ACD; [C1 P1 V5 V6]; [P1 V5 V6] # ⒈ꫬ︒.્ -N; ⒈\u200C\uAAEC︒.\u0ACD; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ⒈ꫬ︒.્ -T; 1.\u200C\uAAEC。.\u0ACD; [C1 V5 A4_2]; [V5 A4_2] # 1.ꫬ..્ -N; 1.\u200C\uAAEC。.\u0ACD; [C1 V5 A4_2]; [C1 V5 A4_2] # 1.ꫬ..્ -B; 1.xn--sv9a..xn--mfc; [V5 A4_2]; [V5 A4_2] # 1.ꫬ..્ -B; 1.xn--0ug7185c..xn--mfc; [C1 V5 A4_2]; [C1 V5 A4_2] # 1.ꫬ..્ -B; xn--tsh0720cse8b.xn--mfc; [V5 V6]; [V5 V6] # ⒈ꫬ︒.્ -B; xn--0ug78o720myr1c.xn--mfc; [C1 V5 V6]; [C1 V5 V6] # ⒈ꫬ︒.્ -B; \u0C46。䰀\u0668𞭅󠅼; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ె.䰀٨ -B; xn--eqc.xn--hib5476aim6t; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # ె.䰀٨ -T; ß\u200D.\u1BF2񄾼; [C2 P1 V5 V6]; [P1 V5 V6] # ß.᯲ -N; ß\u200D.\u1BF2񄾼; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ß.᯲ -T; SS\u200D.\u1BF2񄾼; [C2 P1 V5 V6]; [P1 V5 V6] # ss.᯲ -N; SS\u200D.\u1BF2񄾼; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ss.᯲ -T; ss\u200D.\u1BF2񄾼; [C2 P1 V5 V6]; [P1 V5 V6] # ss.᯲ -N; ss\u200D.\u1BF2񄾼; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ss.᯲ -T; Ss\u200D.\u1BF2񄾼; [C2 P1 V5 V6]; [P1 V5 V6] # ss.᯲ -N; Ss\u200D.\u1BF2񄾼; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ss.᯲ -B; ss.xn--0zf22107b; [V5 V6]; [V5 V6] # ss.᯲ -B; xn--ss-n1t.xn--0zf22107b; [C2 V5 V6]; [C2 V5 V6] # ss.᯲ -B; xn--zca870n.xn--0zf22107b; [C2 V5 V6]; [C2 V5 V6] # ß.᯲ -T; 𑓂\u200C≮.≮; [P1 V5 V6]; [P1 V5 V6] # 𑓂≮.≮ -N; 𑓂\u200C≮.≮; [P1 V5 V6]; [P1 V5 V6] # 𑓂≮.≮ -T; 𑓂\u200C<\u0338.<\u0338; [P1 V5 V6]; [P1 V5 V6] # 𑓂≮.≮ -N; 𑓂\u200C<\u0338.<\u0338; [P1 V5 V6]; [P1 V5 V6] # 𑓂≮.≮ -B; xn--gdhz656g.xn--gdh; [V5 V6]; [V5 V6] -B; xn--0ugy6glz29a.xn--gdh; [V5 V6]; [V5 V6] # 𑓂≮.≮ -B; 🕼.\uFFA0; [P1 V6]; [P1 V6] # 🕼. -B; 🕼.\u1160; [P1 V6]; [P1 V6] # 🕼. -B; xn--my8h.xn--psd; [V6]; [V6] # 🕼. -B; xn--my8h.xn--cl7c; [V6]; [V6] # 🕼. -B; ᡔ\uFD82。񷘎; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ᡔلحى. -B; ᡔ\u0644\u062D\u0649。񷘎; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ᡔلحى. -B; xn--sgb9bq785p.xn--bc31b; [B5 B6 V6]; [B5 B6 V6] # ᡔلحى. -B; 爕򳙑.𝟰気; [P1 V6]; [P1 V6] -B; 爕򳙑.4気; [P1 V6]; [P1 V6] -B; xn--1zxq3199c.xn--4-678b; [V6]; [V6] -B; ⒋𑍍Ⴝ-.𞬪\u0DCA\u05B5; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ⒋𑍍Ⴝ-.්ֵ -B; 4.𑍍Ⴝ-.𞬪\u0DCA\u05B5; [B1 B6 P1 V3 V5 V6]; [B1 B6 P1 V3 V5 V6] # 4.𑍍Ⴝ-.්ֵ -B; 4.𑍍ⴝ-.𞬪\u0DCA\u05B5; [B1 B6 P1 V3 V5 V6]; [B1 B6 P1 V3 V5 V6] # 4.𑍍ⴝ-.්ֵ -B; 4.xn----wwsx259f.xn--ddb152b7y23b; [B1 B6 V3 V5 V6]; [B1 B6 V3 V5 V6] # 4.𑍍ⴝ-.්ֵ -B; 4.xn----t1g9869q.xn--ddb152b7y23b; [B1 B6 V3 V5 V6]; [B1 B6 V3 V5 V6] # 4.𑍍Ⴝ-.්ֵ -B; ⒋𑍍ⴝ-.𞬪\u0DCA\u05B5; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ⒋𑍍ⴝ-.්ֵ -B; xn----jcp487avl3w.xn--ddb152b7y23b; [B1 V3 V6]; [B1 V3 V6] # ⒋𑍍ⴝ-.්ֵ -B; xn----t1g323mnk9t.xn--ddb152b7y23b; [B1 V3 V6]; [B1 V3 V6] # ⒋𑍍Ⴝ-.්ֵ -B; 󞝃。򑆃񉢗--; [P1 V2 V3 V6]; [P1 V2 V3 V6] -B; xn--2y75e.xn-----1l15eer88n; [V2 V3 V6]; [V2 V3 V6] -T; \u200D\u07DF。\u200C\uABED; [B1 C1 C2]; [B1 B3 B6 V5] # ߟ.꯭ -N; \u200D\u07DF。\u200C\uABED; [B1 C1 C2]; [B1 C1 C2] # ߟ.꯭ -T; \u200D\u07DF。\u200C\uABED; [B1 C1 C2]; [B1 B3 B6 V5] # ߟ.꯭ -N; \u200D\u07DF。\u200C\uABED; [B1 C1 C2]; [B1 C1 C2] # ߟ.꯭ -B; xn--6sb.xn--429a; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ߟ.꯭ -B; xn--6sb394j.xn--0ug1126c; [B1 C1 C2]; [B1 C1 C2] # ߟ.꯭ -B; 𞮽\u07FF\u084E。ᢍ򝹁𐫘; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ࡎ.ᢍ𐫘 -B; 𞮽\u07FF\u084E。ᢍ򝹁𐫘; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ࡎ.ᢍ𐫘 -B; xn--3tb2nz468k.xn--69e8615j5rn5d; [B5 B6 V6]; [B5 B6 V6] # ࡎ.ᢍ𐫘 -B; \u06ED𞺌𑄚\u1714.ꡞ\u08B7; [B1 B5 B6 V5]; [B1 B5 B6 V5] # ۭم𑄚᜔.ꡞࢷ -B; \u06ED\u0645𑄚\u1714.ꡞ\u08B7; [B1 B5 B6 V5]; [B1 B5 B6 V5] # ۭم𑄚᜔.ꡞࢷ -B; xn--hhb94ag41b739u.xn--dzb5582f; [B1 B5 B6 V5]; [B1 B5 B6 V5] # ۭم𑄚᜔.ꡞࢷ -T; 񻂵킃𑘶\u07DC。ς\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.ςؼς -N; 񻂵킃𑘶\u07DC。ς\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.ςؼς -T; 񻂵킃𑘶\u07DC。ς\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.ςؼς -N; 񻂵킃𑘶\u07DC。ς\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.ςؼς -T; 񻂵킃𑘶\u07DC。ς\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.ςؼς -N; 񻂵킃𑘶\u07DC。ς\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.ςؼς -T; 񻂵킃𑘶\u07DC。ς\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.ςؼς -N; 񻂵킃𑘶\u07DC。ς\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.ςؼς -B; 񻂵킃𑘶\u07DC。Σ\u063CΣ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。Σ\u063CΣ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。σ\u063Cσ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。σ\u063Cσ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。Σ\u063Cσ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。Σ\u063Cσ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; xn--3sb7483hoyvbbe76g.xn--4xaa21q; [B5 B6 V6]; [B5 B6 V6] # 킃𑘶ߜ.σؼσ -T; 񻂵킃𑘶\u07DC。Σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -N; 񻂵킃𑘶\u07DC。Σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -T; 񻂵킃𑘶\u07DC。Σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -N; 񻂵킃𑘶\u07DC。Σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -T; 񻂵킃𑘶\u07DC。σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -N; 񻂵킃𑘶\u07DC。σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -T; 񻂵킃𑘶\u07DC。σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -N; 񻂵킃𑘶\u07DC。σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -B; xn--3sb7483hoyvbbe76g.xn--3xab31q; [B5 B6 V6]; [B5 B6 V6] # 킃𑘶ߜ.σؼς -B; xn--3sb7483hoyvbbe76g.xn--3xaa51q; [B5 B6 V6]; [B5 B6 V6] # 킃𑘶ߜ.ςؼς -B; 񻂵킃𑘶\u07DC。Σ\u063CΣ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。Σ\u063CΣ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。σ\u063Cσ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。σ\u063Cσ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。Σ\u063Cσ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -B; 񻂵킃𑘶\u07DC。Σ\u063Cσ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼσ -T; 񻂵킃𑘶\u07DC。Σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -N; 񻂵킃𑘶\u07DC。Σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -T; 񻂵킃𑘶\u07DC。Σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -N; 񻂵킃𑘶\u07DC。Σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -T; 񻂵킃𑘶\u07DC。σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -N; 񻂵킃𑘶\u07DC。σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -T; 񻂵킃𑘶\u07DC。σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -N; 񻂵킃𑘶\u07DC。σ\u063Cς; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 킃𑘶ߜ.σؼς -B; 蔰。󠁹\u08DD-𑈵; [P1 V6]; [P1 V6] # 蔰.ࣝ-𑈵 -B; xn--sz1a.xn----mrd9984r3dl0i; [V6]; [V6] # 蔰.ࣝ-𑈵 -T; ςჅ。\u075A; [P1 V6]; [P1 V6] # ςჅ.ݚ -N; ςჅ。\u075A; [P1 V6]; [P1 V6] # ςჅ.ݚ -T; ςⴥ。\u075A; ςⴥ.\u075A; xn--4xa203s.xn--epb # ςⴥ.ݚ -N; ςⴥ。\u075A; ςⴥ.\u075A; xn--3xa403s.xn--epb # ςⴥ.ݚ -B; ΣჅ。\u075A; [P1 V6]; [P1 V6] # σჅ.ݚ -B; σⴥ。\u075A; σⴥ.\u075A; xn--4xa203s.xn--epb # σⴥ.ݚ -B; Σⴥ。\u075A; σⴥ.\u075A; xn--4xa203s.xn--epb # σⴥ.ݚ -B; xn--4xa203s.xn--epb; σⴥ.\u075A; xn--4xa203s.xn--epb # σⴥ.ݚ -B; σⴥ.\u075A; ; xn--4xa203s.xn--epb # σⴥ.ݚ -B; ΣჅ.\u075A; [P1 V6]; [P1 V6] # σჅ.ݚ -B; Σⴥ.\u075A; σⴥ.\u075A; xn--4xa203s.xn--epb # σⴥ.ݚ -B; xn--4xa477d.xn--epb; [V6]; [V6] # σჅ.ݚ -B; xn--3xa403s.xn--epb; ςⴥ.\u075A; xn--3xa403s.xn--epb # ςⴥ.ݚ -T; ςⴥ.\u075A; ; xn--4xa203s.xn--epb # ςⴥ.ݚ -N; ςⴥ.\u075A; ; xn--3xa403s.xn--epb # ςⴥ.ݚ -B; xn--3xa677d.xn--epb; [V6]; [V6] # ςჅ.ݚ -B; \u0C4DႩ𞰓.\u1B72; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ్Ⴉ.᭲ -B; \u0C4DႩ𞰓.\u1B72; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ్Ⴉ.᭲ -B; \u0C4Dⴉ𞰓.\u1B72; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ్ⴉ.᭲ -B; xn--lqc478nlr02a.xn--dwf; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # ్ⴉ.᭲ -B; xn--lqc64t7t26c.xn--dwf; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # ్Ⴉ.᭲ -B; \u0C4Dⴉ𞰓.\u1B72; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ్ⴉ.᭲ -B; ⮷≮񎈴󠄟。𐠄; [B1 P1 V6]; [B1 P1 V6] -B; ⮷<\u0338񎈴󠄟。𐠄; [B1 P1 V6]; [B1 P1 V6] -B; xn--gdh877a3513h.xn--pc9c; [B1 V6]; [B1 V6] -T; \u06BC。\u200Dẏ\u200Cᡤ; [B1 C1 C2]; xn--vkb.xn--08e172a # ڼ.ẏᡤ -N; \u06BC。\u200Dẏ\u200Cᡤ; [B1 C1 C2]; [B1 C1 C2] # ڼ.ẏᡤ -T; \u06BC。\u200Dy\u0307\u200Cᡤ; [B1 C1 C2]; xn--vkb.xn--08e172a # ڼ.ẏᡤ -N; \u06BC。\u200Dy\u0307\u200Cᡤ; [B1 C1 C2]; [B1 C1 C2] # ڼ.ẏᡤ -T; \u06BC。\u200Dẏ\u200Cᡤ; [B1 C1 C2]; xn--vkb.xn--08e172a # ڼ.ẏᡤ -N; \u06BC。\u200Dẏ\u200Cᡤ; [B1 C1 C2]; [B1 C1 C2] # ڼ.ẏᡤ -T; \u06BC。\u200Dy\u0307\u200Cᡤ; [B1 C1 C2]; xn--vkb.xn--08e172a # ڼ.ẏᡤ -N; \u06BC。\u200Dy\u0307\u200Cᡤ; [B1 C1 C2]; [B1 C1 C2] # ڼ.ẏᡤ -T; \u06BC。\u200DY\u0307\u200Cᡤ; [B1 C1 C2]; xn--vkb.xn--08e172a # ڼ.ẏᡤ -N; \u06BC。\u200DY\u0307\u200Cᡤ; [B1 C1 C2]; [B1 C1 C2] # ڼ.ẏᡤ -T; \u06BC。\u200DẎ\u200Cᡤ; [B1 C1 C2]; xn--vkb.xn--08e172a # ڼ.ẏᡤ -N; \u06BC。\u200DẎ\u200Cᡤ; [B1 C1 C2]; [B1 C1 C2] # ڼ.ẏᡤ -B; xn--vkb.xn--08e172a; \u06BC.ẏᡤ; xn--vkb.xn--08e172a # ڼ.ẏᡤ -B; \u06BC.ẏᡤ; ; xn--vkb.xn--08e172a # ڼ.ẏᡤ -B; \u06BC.y\u0307ᡤ; \u06BC.ẏᡤ; xn--vkb.xn--08e172a # ڼ.ẏᡤ -B; \u06BC.Y\u0307ᡤ; \u06BC.ẏᡤ; xn--vkb.xn--08e172a # ڼ.ẏᡤ -B; \u06BC.Ẏᡤ; \u06BC.ẏᡤ; xn--vkb.xn--08e172a # ڼ.ẏᡤ -B; xn--vkb.xn--08e172ax6aca; [B1 C1 C2]; [B1 C1 C2] # ڼ.ẏᡤ -T; \u06BC。\u200DY\u0307\u200Cᡤ; [B1 C1 C2]; xn--vkb.xn--08e172a # ڼ.ẏᡤ -N; \u06BC。\u200DY\u0307\u200Cᡤ; [B1 C1 C2]; [B1 C1 C2] # ڼ.ẏᡤ -T; \u06BC。\u200DẎ\u200Cᡤ; [B1 C1 C2]; xn--vkb.xn--08e172a # ڼ.ẏᡤ -N; \u06BC。\u200DẎ\u200Cᡤ; [B1 C1 C2]; [B1 C1 C2] # ڼ.ẏᡤ -B; 𐹹𑲛。񑂐\u0DCA; [B1 P1 V6]; [B1 P1 V6] # 𐹹𑲛.් -B; xn--xo0dg5v.xn--h1c39876d; [B1 V6]; [B1 V6] # 𐹹𑲛.් -B; -≠𑈵。嵕\uFEF1۴\uA953; [B1 B5 P1 V3 V6]; [B1 B5 P1 V3 V6] # -≠𑈵.嵕ي۴꥓ -B; -=\u0338𑈵。嵕\uFEF1۴\uA953; [B1 B5 P1 V3 V6]; [B1 B5 P1 V3 V6] # -≠𑈵.嵕ي۴꥓ -B; -≠𑈵。嵕\u064A۴\uA953; [B1 B5 P1 V3 V6]; [B1 B5 P1 V3 V6] # -≠𑈵.嵕ي۴꥓ -B; -=\u0338𑈵。嵕\u064A۴\uA953; [B1 B5 P1 V3 V6]; [B1 B5 P1 V3 V6] # -≠𑈵.嵕ي۴꥓ -B; xn----ufo4749h.xn--mhb45a235sns3c; [B1 B5 V3 V6]; [B1 B5 V3 V6] # -≠𑈵.嵕ي۴꥓ -T; \u200C񍸰𐹶\u076E.\u06C1\u200D≯\u200D; [B1 B3 C1 C2 P1 V6]; [B3 B5 B6 P1 V6] # 𐹶ݮ.ہ≯ -N; \u200C񍸰𐹶\u076E.\u06C1\u200D≯\u200D; [B1 B3 C1 C2 P1 V6]; [B1 B3 C1 C2 P1 V6] # 𐹶ݮ.ہ≯ -T; \u200C񍸰𐹶\u076E.\u06C1\u200D>\u0338\u200D; [B1 B3 C1 C2 P1 V6]; [B3 B5 B6 P1 V6] # 𐹶ݮ.ہ≯ -N; \u200C񍸰𐹶\u076E.\u06C1\u200D>\u0338\u200D; [B1 B3 C1 C2 P1 V6]; [B1 B3 C1 C2 P1 V6] # 𐹶ݮ.ہ≯ -T; \u200C񍸰𐹶\u076E.\u06C1\u200D≯\u200D; [B1 B3 C1 C2 P1 V6]; [B3 B5 B6 P1 V6] # 𐹶ݮ.ہ≯ -N; \u200C񍸰𐹶\u076E.\u06C1\u200D≯\u200D; [B1 B3 C1 C2 P1 V6]; [B1 B3 C1 C2 P1 V6] # 𐹶ݮ.ہ≯ -T; \u200C񍸰𐹶\u076E.\u06C1\u200D>\u0338\u200D; [B1 B3 C1 C2 P1 V6]; [B3 B5 B6 P1 V6] # 𐹶ݮ.ہ≯ -N; \u200C񍸰𐹶\u076E.\u06C1\u200D>\u0338\u200D; [B1 B3 C1 C2 P1 V6]; [B1 B3 C1 C2 P1 V6] # 𐹶ݮ.ہ≯ -B; xn--ypb5875khz9y.xn--0kb682l; [B3 B5 B6 V6]; [B3 B5 B6 V6] # 𐹶ݮ.ہ≯ -B; xn--ypb717jrx2o7v94a.xn--0kb660ka35v; [B1 B3 C1 C2 V6]; [B1 B3 C1 C2 V6] # 𐹶ݮ.ہ≯ -B; ≮.\u17B5\u0855𐫔; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≮.ࡕ𐫔 -B; <\u0338.\u17B5\u0855𐫔; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≮.ࡕ𐫔 -B; ≮.\u17B5\u0855𐫔; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≮.ࡕ𐫔 -B; <\u0338.\u17B5\u0855𐫔; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≮.ࡕ𐫔 -B; xn--gdh.xn--kwb589e217p; [B1 V5 V6]; [B1 V5 V6] # ≮.ࡕ𐫔 -T; 𐩗\u200D。ႩႵ; [B3 C2 P1 V6]; [P1 V6] # 𐩗.ႩႵ -N; 𐩗\u200D。ႩႵ; [B3 C2 P1 V6]; [B3 C2 P1 V6] # 𐩗.ႩႵ -T; 𐩗\u200D。ႩႵ; [B3 C2 P1 V6]; [P1 V6] # 𐩗.ႩႵ -N; 𐩗\u200D。ႩႵ; [B3 C2 P1 V6]; [B3 C2 P1 V6] # 𐩗.ႩႵ -T; 𐩗\u200D。ⴉⴕ; [B3 C2]; xn--pt9c.xn--0kjya # 𐩗.ⴉⴕ -N; 𐩗\u200D。ⴉⴕ; [B3 C2]; [B3 C2] # 𐩗.ⴉⴕ -T; 𐩗\u200D。Ⴉⴕ; [B3 C2 P1 V6]; [P1 V6] # 𐩗.Ⴉⴕ -N; 𐩗\u200D。Ⴉⴕ; [B3 C2 P1 V6]; [B3 C2 P1 V6] # 𐩗.Ⴉⴕ -B; xn--pt9c.xn--hnd666l; [V6]; [V6] -B; xn--1ug4933g.xn--hnd666l; [B3 C2 V6]; [B3 C2 V6] # 𐩗.Ⴉⴕ -B; xn--pt9c.xn--0kjya; 𐩗.ⴉⴕ; xn--pt9c.xn--0kjya; NV8 -B; 𐩗.ⴉⴕ; ; xn--pt9c.xn--0kjya; NV8 -B; 𐩗.ႩႵ; [P1 V6]; [P1 V6] -B; 𐩗.Ⴉⴕ; [P1 V6]; [P1 V6] -B; xn--pt9c.xn--hndy; [V6]; [V6] -B; xn--1ug4933g.xn--0kjya; [B3 C2]; [B3 C2] # 𐩗.ⴉⴕ -B; xn--1ug4933g.xn--hndy; [B3 C2 V6]; [B3 C2 V6] # 𐩗.ႩႵ -T; 𐩗\u200D。ⴉⴕ; [B3 C2]; xn--pt9c.xn--0kjya # 𐩗.ⴉⴕ -N; 𐩗\u200D。ⴉⴕ; [B3 C2]; [B3 C2] # 𐩗.ⴉⴕ -T; 𐩗\u200D。Ⴉⴕ; [B3 C2 P1 V6]; [P1 V6] # 𐩗.Ⴉⴕ -N; 𐩗\u200D。Ⴉⴕ; [B3 C2 P1 V6]; [B3 C2 P1 V6] # 𐩗.Ⴉⴕ -T; \u200C\u200Cㄤ.\u032E󕨑\u09C2; [C1 P1 V5 V6]; [P1 V5 V6] # ㄤ.̮ূ -N; \u200C\u200Cㄤ.\u032E󕨑\u09C2; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ㄤ.̮ূ -T; \u200C\u200Cㄤ.\u032E󕨑\u09C2; [C1 P1 V5 V6]; [P1 V5 V6] # ㄤ.̮ূ -N; \u200C\u200Cㄤ.\u032E󕨑\u09C2; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ㄤ.̮ূ -B; xn--1fk.xn--vta284a9o563a; [V5 V6]; [V5 V6] # ㄤ.̮ূ -B; xn--0uga242k.xn--vta284a9o563a; [C1 V5 V6]; [C1 V5 V6] # ㄤ.̮ূ -T; 𐋻。-\u200C𐫄Ⴗ; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𐋻.-𐫄Ⴗ -N; 𐋻。-\u200C𐫄Ⴗ; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𐋻.-𐫄Ⴗ -T; 𐋻。-\u200C𐫄Ⴗ; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𐋻.-𐫄Ⴗ -N; 𐋻。-\u200C𐫄Ⴗ; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𐋻.-𐫄Ⴗ -T; 𐋻。-\u200C𐫄ⴗ; [B1 C1 V3]; [B1 V3] # 𐋻.-𐫄ⴗ -N; 𐋻。-\u200C𐫄ⴗ; [B1 C1 V3]; [B1 C1 V3] # 𐋻.-𐫄ⴗ -B; xn--v97c.xn----lws0526f; [B1 V3]; [B1 V3] -B; xn--v97c.xn----sgnv20du99s; [B1 C1 V3]; [B1 C1 V3] # 𐋻.-𐫄ⴗ -B; xn--v97c.xn----i1g2513q; [B1 V3 V6]; [B1 V3 V6] -B; xn--v97c.xn----i1g888ih12u; [B1 C1 V3 V6]; [B1 C1 V3 V6] # 𐋻.-𐫄Ⴗ -T; 𐋻。-\u200C𐫄ⴗ; [B1 C1 V3]; [B1 V3] # 𐋻.-𐫄ⴗ -N; 𐋻。-\u200C𐫄ⴗ; [B1 C1 V3]; [B1 C1 V3] # 𐋻.-𐫄ⴗ -T; 🙑𐷺.≠\u200C; [B1 C1 P1 V6]; [B1 P1 V6] # 🙑.≠ -N; 🙑𐷺.≠\u200C; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 🙑.≠ -T; 🙑𐷺.=\u0338\u200C; [B1 C1 P1 V6]; [B1 P1 V6] # 🙑.≠ -N; 🙑𐷺.=\u0338\u200C; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 🙑.≠ -T; 🙑𐷺.≠\u200C; [B1 C1 P1 V6]; [B1 P1 V6] # 🙑.≠ -N; 🙑𐷺.≠\u200C; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 🙑.≠ -T; 🙑𐷺.=\u0338\u200C; [B1 C1 P1 V6]; [B1 P1 V6] # 🙑.≠ -N; 🙑𐷺.=\u0338\u200C; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 🙑.≠ -B; xn--bl0dh970b.xn--1ch; [B1 V6]; [B1 V6] -B; xn--bl0dh970b.xn--0ug83g; [B1 C1 V6]; [B1 C1 V6] # 🙑.≠ -B; \u064C\u1CD2。𞮞\u2D7F⧎; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ٌ᳒.⵿⧎ -B; \u064C\u1CD2。𞮞\u2D7F⧎; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ٌ᳒.⵿⧎ -B; xn--ohb646i.xn--ewi38jf765c; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # ٌ᳒.⵿⧎ -B; Ⴔ𝨨₃󠁦.𝟳𑂹\u0B82; [P1 V6]; [P1 V6] # Ⴔ𝨨3.7𑂹ஂ -B; Ⴔ𝨨3󠁦.7𑂹\u0B82; [P1 V6]; [P1 V6] # Ⴔ𝨨3.7𑂹ஂ -B; ⴔ𝨨3󠁦.7𑂹\u0B82; [P1 V6]; [P1 V6] # ⴔ𝨨3.7𑂹ஂ -B; xn--3-ews6985n35s3g.xn--7-cve6271r; [V6]; [V6] # ⴔ𝨨3.7𑂹ஂ -B; xn--3-b1g83426a35t0g.xn--7-cve6271r; [V6]; [V6] # Ⴔ𝨨3.7𑂹ஂ -B; ⴔ𝨨₃󠁦.𝟳𑂹\u0B82; [P1 V6]; [P1 V6] # ⴔ𝨨3.7𑂹ஂ -T; 䏈\u200C。\u200C⒈񱢕; [C1 P1 V6]; [P1 V6] # 䏈.⒈ -N; 䏈\u200C。\u200C⒈񱢕; [C1 P1 V6]; [C1 P1 V6] # 䏈.⒈ -T; 䏈\u200C。\u200C1.񱢕; [C1 P1 V6]; [P1 V6] # 䏈.1. -N; 䏈\u200C。\u200C1.񱢕; [C1 P1 V6]; [C1 P1 V6] # 䏈.1. -B; xn--eco.1.xn--ms39a; [V6]; [V6] -B; xn--0ug491l.xn--1-rgn.xn--ms39a; [C1 V6]; [C1 V6] # 䏈.1. -B; xn--eco.xn--tsh21126d; [V6]; [V6] -B; xn--0ug491l.xn--0ug88oot66q; [C1 V6]; [C1 V6] # 䏈.⒈ -T; 1\uAAF6ß𑲥。\u1DD8; [V5]; [V5] # 1꫶ß𑲥.ᷘ -N; 1\uAAF6ß𑲥。\u1DD8; [V5]; [V5] # 1꫶ß𑲥.ᷘ -T; 1\uAAF6ß𑲥。\u1DD8; [V5]; [V5] # 1꫶ß𑲥.ᷘ -N; 1\uAAF6ß𑲥。\u1DD8; [V5]; [V5] # 1꫶ß𑲥.ᷘ -B; 1\uAAF6SS𑲥。\u1DD8; [V5]; [V5] # 1꫶ss𑲥.ᷘ -B; 1\uAAF6ss𑲥。\u1DD8; [V5]; [V5] # 1꫶ss𑲥.ᷘ -B; 1\uAAF6Ss𑲥。\u1DD8; [V5]; [V5] # 1꫶ss𑲥.ᷘ -B; xn--1ss-ir6ln166b.xn--weg; [V5]; [V5] # 1꫶ss𑲥.ᷘ -B; xn--1-qfa2471kdb0d.xn--weg; [V5]; [V5] # 1꫶ß𑲥.ᷘ -B; 1\uAAF6SS𑲥。\u1DD8; [V5]; [V5] # 1꫶ss𑲥.ᷘ -B; 1\uAAF6ss𑲥。\u1DD8; [V5]; [V5] # 1꫶ss𑲥.ᷘ -B; 1\uAAF6Ss𑲥。\u1DD8; [V5]; [V5] # 1꫶ss𑲥.ᷘ -T; \u200D񫶩𞪯\u0CCD。\u077C⒈; [B1 C2 P1 V6]; [B5 B6 P1 V6] # ್.ݼ⒈ -N; \u200D񫶩𞪯\u0CCD。\u077C⒈; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ್.ݼ⒈ -T; \u200D񫶩𞪯\u0CCD。\u077C1.; [B1 C2 P1 V6]; [B5 B6 P1 V6] # ್.ݼ1. -N; \u200D񫶩𞪯\u0CCD。\u077C1.; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ್.ݼ1. -B; xn--8tc9875v5is1a.xn--1-g6c.; [B5 B6 V6]; [B5 B6 V6] # ್.ݼ1. -B; xn--8tc969gzn94a4lm8a.xn--1-g6c.; [B1 C2 V6]; [B1 C2 V6] # ್.ݼ1. -B; xn--8tc9875v5is1a.xn--dqb689l; [B5 B6 V6]; [B5 B6 V6] # ್.ݼ⒈ -B; xn--8tc969gzn94a4lm8a.xn--dqb689l; [B1 C2 V6]; [B1 C2 V6] # ್.ݼ⒈ -B; \u1AB6.𞤳򓢖򻉒\u07D7; [B1 B2 B3 B6 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # ᪶.𞤳ߗ -B; \u1AB6.𞤳򓢖򻉒\u07D7; [B1 B2 B3 B6 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # ᪶.𞤳ߗ -B; \u1AB6.𞤑򓢖򻉒\u07D7; [B1 B2 B3 B6 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # ᪶.𞤳ߗ -B; xn--zqf.xn--ysb9657vuiz5bj0ep; [B1 B2 B3 B6 V5 V6]; [B1 B2 B3 B6 V5 V6] # ᪶.𞤳ߗ -B; \u1AB6.𞤑򓢖򻉒\u07D7; [B1 B2 B3 B6 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # ᪶.𞤳ߗ -B; \u0842𞩚⒈.󠬌8򏳏\u0770; [B1 P1 V6]; [B1 P1 V6] # ࡂ⒈.8ݰ -B; \u0842𞩚1..󠬌8򏳏\u0770; [B1 P1 V6 A4_2]; [B1 P1 V6 A4_2] # ࡂ1..8ݰ -B; xn--1-rid26318a..xn--8-s5c22427ox454a; [B1 V6 A4_2]; [B1 V6 A4_2] # ࡂ1..8ݰ -B; xn--0vb095ldg52a.xn--8-s5c22427ox454a; [B1 V6]; [B1 V6] # ࡂ⒈.8ݰ -B; \u0361𐫫\u0369ᡷ。-󠰛鞰; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ͡𐫫ͩᡷ.-鞰 -B; xn--cvaq482npv5t.xn----yg7dt1332g; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ͡𐫫ͩᡷ.-鞰 -T; -.\u0ACD剘ß𐫃; [B1 V3 V5]; [B1 V3 V5] # -.્剘ß𐫃 -N; -.\u0ACD剘ß𐫃; [B1 V3 V5]; [B1 V3 V5] # -.્剘ß𐫃 -B; -.\u0ACD剘SS𐫃; [B1 V3 V5]; [B1 V3 V5] # -.્剘ss𐫃 -B; -.\u0ACD剘ss𐫃; [B1 V3 V5]; [B1 V3 V5] # -.્剘ss𐫃 -B; -.\u0ACD剘Ss𐫃; [B1 V3 V5]; [B1 V3 V5] # -.્剘ss𐫃 -B; -.xn--ss-bqg4734erywk; [B1 V3 V5]; [B1 V3 V5] # -.્剘ss𐫃 -B; -.xn--zca791c493duf8i; [B1 V3 V5]; [B1 V3 V5] # -.્剘ß𐫃 -B; \u08FB𞵸。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ࣻ.- -B; \u08FB𞵸。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ࣻ.- -B; xn--b1b2719v.-; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ࣻ.- -B; ⒈󠈻𐹲。≠\u0603𐹽; [B1 P1 V6]; [B1 P1 V6] # ⒈𐹲.≠𐹽 -B; ⒈󠈻𐹲。=\u0338\u0603𐹽; [B1 P1 V6]; [B1 P1 V6] # ⒈𐹲.≠𐹽 -B; 1.󠈻𐹲。≠\u0603𐹽; [B1 P1 V6]; [B1 P1 V6] # 1.𐹲.≠𐹽 -B; 1.󠈻𐹲。=\u0338\u0603𐹽; [B1 P1 V6]; [B1 P1 V6] # 1.𐹲.≠𐹽 -B; 1.xn--qo0dl3077c.xn--lfb536lb35n; [B1 V6]; [B1 V6] # 1.𐹲.≠𐹽 -B; xn--tshw766f1153g.xn--lfb536lb35n; [B1 V6]; [B1 V6] # ⒈𐹲.≠𐹽 -T; 𐹢󠈚Ⴎ\u200C.㖾𐹡; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # 𐹢Ⴎ.㖾𐹡 -N; 𐹢󠈚Ⴎ\u200C.㖾𐹡; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # 𐹢Ⴎ.㖾𐹡 -T; 𐹢󠈚ⴎ\u200C.㖾𐹡; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # 𐹢ⴎ.㖾𐹡 -N; 𐹢󠈚ⴎ\u200C.㖾𐹡; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # 𐹢ⴎ.㖾𐹡 -B; xn--5kjx323em053g.xn--pelu572d; [B1 B5 B6 V6]; [B1 B5 B6 V6] -B; xn--0ug342clq0pqxv4i.xn--pelu572d; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # 𐹢ⴎ.㖾𐹡 -B; xn--mnd9001km0o0g.xn--pelu572d; [B1 B5 B6 V6]; [B1 B5 B6 V6] -B; xn--mnd289ezj4pqxp0i.xn--pelu572d; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # 𐹢Ⴎ.㖾𐹡 -B; 򩼗.\u07C7ᡖႳႧ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # .߇ᡖႳႧ -B; 򩼗.\u07C7ᡖႳႧ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # .߇ᡖႳႧ -B; 򩼗.\u07C7ᡖⴓⴇ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # .߇ᡖⴓⴇ -B; 򩼗.\u07C7ᡖႳⴇ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # .߇ᡖႳⴇ -B; xn--te28c.xn--isb286btrgo7w; [B2 B3 V6]; [B2 B3 V6] # .߇ᡖႳⴇ -B; xn--te28c.xn--isb295fbtpmb; [B2 B3 V6]; [B2 B3 V6] # .߇ᡖⴓⴇ -B; xn--te28c.xn--isb856b9a631d; [B2 B3 V6]; [B2 B3 V6] # .߇ᡖႳႧ -B; 򩼗.\u07C7ᡖⴓⴇ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # .߇ᡖⴓⴇ -B; 򩼗.\u07C7ᡖႳⴇ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # .߇ᡖႳⴇ -T; \u200D􅍉.\u06B3\u0775; [B1 C2 P1 V6]; [P1 V6] # .ڳݵ -N; \u200D􅍉.\u06B3\u0775; [B1 C2 P1 V6]; [B1 C2 P1 V6] # .ڳݵ -B; xn--3j78f.xn--mkb20b; [V6]; [V6] # .ڳݵ -B; xn--1ug39444n.xn--mkb20b; [B1 C2 V6]; [B1 C2 V6] # .ڳݵ -B; 𲤱⒛⾳.ꡦ⒈; [P1 V6]; [P1 V6] -B; 𲤱20.音.ꡦ1.; [P1 V6]; [P1 V6] -B; xn--20-9802c.xn--0w5a.xn--1-eg4e.; [V6]; [V6] -B; xn--dth6033bzbvx.xn--tsh9439b; [V6]; [V6] -B; \u07DC8񳦓-。򞲙𑁿𐩥\u09CD; [B2 B3 B5 B6 P1 V3 V6]; [B2 B3 B5 B6 P1 V3 V6] # ߜ8-.𑁿𐩥্ -B; \u07DC8񳦓-。򞲙𑁿𐩥\u09CD; [B2 B3 B5 B6 P1 V3 V6]; [B2 B3 B5 B6 P1 V3 V6] # ߜ8-.𑁿𐩥্ -B; xn--8--rve13079p.xn--b7b9842k42df776x; [B2 B3 B5 B6 V3 V6]; [B2 B3 B5 B6 V3 V6] # ߜ8-.𑁿𐩥্ -T; Ⴕ。۰≮ß\u0745; [P1 V6]; [P1 V6] # Ⴕ.۰≮ß݅ -N; Ⴕ。۰≮ß\u0745; [P1 V6]; [P1 V6] # Ⴕ.۰≮ß݅ -T; Ⴕ。۰<\u0338ß\u0745; [P1 V6]; [P1 V6] # Ⴕ.۰≮ß݅ -N; Ⴕ。۰<\u0338ß\u0745; [P1 V6]; [P1 V6] # Ⴕ.۰≮ß݅ -T; ⴕ。۰<\u0338ß\u0745; [P1 V6]; [P1 V6] # ⴕ.۰≮ß݅ -N; ⴕ。۰<\u0338ß\u0745; [P1 V6]; [P1 V6] # ⴕ.۰≮ß݅ -T; ⴕ。۰≮ß\u0745; [P1 V6]; [P1 V6] # ⴕ.۰≮ß݅ -N; ⴕ。۰≮ß\u0745; [P1 V6]; [P1 V6] # ⴕ.۰≮ß݅ -B; Ⴕ。۰≮SS\u0745; [P1 V6]; [P1 V6] # Ⴕ.۰≮ss݅ -B; Ⴕ。۰<\u0338SS\u0745; [P1 V6]; [P1 V6] # Ⴕ.۰≮ss݅ -B; ⴕ。۰<\u0338ss\u0745; [P1 V6]; [P1 V6] # ⴕ.۰≮ss݅ -B; ⴕ。۰≮ss\u0745; [P1 V6]; [P1 V6] # ⴕ.۰≮ss݅ -B; Ⴕ。۰≮Ss\u0745; [P1 V6]; [P1 V6] # Ⴕ.۰≮ss݅ -B; Ⴕ。۰<\u0338Ss\u0745; [P1 V6]; [P1 V6] # Ⴕ.۰≮ss݅ -B; xn--tnd.xn--ss-jbe65aw27i; [V6]; [V6] # Ⴕ.۰≮ss݅ -B; xn--dlj.xn--ss-jbe65aw27i; [V6]; [V6] # ⴕ.۰≮ss݅ -B; xn--dlj.xn--zca912alh227g; [V6]; [V6] # ⴕ.۰≮ß݅ -B; xn--tnd.xn--zca912alh227g; [V6]; [V6] # Ⴕ.۰≮ß݅ -B; \u07E9-.𝨗꒱\u1B72; [B1 B3 V3 V5]; [B1 B3 V3 V5] # ߩ-.𝨗꒱᭲ -B; xn----odd.xn--dwf8994dc8wj; [B1 B3 V3 V5]; [B1 B3 V3 V5] # ߩ-.𝨗꒱᭲ -T; 𞼸\u200C.≯䕵⫧; [B1 B3 C1 P1 V6]; [B1 P1 V6] # .≯䕵⫧ -N; 𞼸\u200C.≯䕵⫧; [B1 B3 C1 P1 V6]; [B1 B3 C1 P1 V6] # .≯䕵⫧ -T; 𞼸\u200C.>\u0338䕵⫧; [B1 B3 C1 P1 V6]; [B1 P1 V6] # .≯䕵⫧ -N; 𞼸\u200C.>\u0338䕵⫧; [B1 B3 C1 P1 V6]; [B1 B3 C1 P1 V6] # .≯䕵⫧ -B; xn--sn7h.xn--hdh754ax6w; [B1 V6]; [B1 V6] -B; xn--0ugx453p.xn--hdh754ax6w; [B1 B3 C1 V6]; [B1 B3 C1 V6] # .≯䕵⫧ -T; 𐨅ß\uFC57.\u06AC۳︒; [B1 B3 P1 V5 V6]; [B1 B3 P1 V5 V6] # 𐨅ßيخ.ڬ۳︒ -N; 𐨅ß\uFC57.\u06AC۳︒; [B1 B3 P1 V5 V6]; [B1 B3 P1 V5 V6] # 𐨅ßيخ.ڬ۳︒ -T; 𐨅ß\u064A\u062E.\u06AC۳。; [B1 V5]; [B1 V5] # 𐨅ßيخ.ڬ۳. -N; 𐨅ß\u064A\u062E.\u06AC۳。; [B1 V5]; [B1 V5] # 𐨅ßيخ.ڬ۳. -B; 𐨅SS\u064A\u062E.\u06AC۳。; [B1 V5]; [B1 V5] # 𐨅ssيخ.ڬ۳. -B; 𐨅ss\u064A\u062E.\u06AC۳。; [B1 V5]; [B1 V5] # 𐨅ssيخ.ڬ۳. -B; 𐨅Ss\u064A\u062E.\u06AC۳。; [B1 V5]; [B1 V5] # 𐨅ssيخ.ڬ۳. -B; xn--ss-ytd5i7765l.xn--fkb6l.; [B1 V5]; [B1 V5] # 𐨅ssيخ.ڬ۳. -B; xn--zca23yncs877j.xn--fkb6l.; [B1 V5]; [B1 V5] # 𐨅ßيخ.ڬ۳. -B; 𐨅SS\uFC57.\u06AC۳︒; [B1 B3 P1 V5 V6]; [B1 B3 P1 V5 V6] # 𐨅ssيخ.ڬ۳︒ -B; 𐨅ss\uFC57.\u06AC۳︒; [B1 B3 P1 V5 V6]; [B1 B3 P1 V5 V6] # 𐨅ssيخ.ڬ۳︒ -B; 𐨅Ss\uFC57.\u06AC۳︒; [B1 B3 P1 V5 V6]; [B1 B3 P1 V5 V6] # 𐨅ssيخ.ڬ۳︒ -B; xn--ss-ytd5i7765l.xn--fkb6lp314e; [B1 B3 V5 V6]; [B1 B3 V5 V6] # 𐨅ssيخ.ڬ۳︒ -B; xn--zca23yncs877j.xn--fkb6lp314e; [B1 B3 V5 V6]; [B1 B3 V5 V6] # 𐨅ßيخ.ڬ۳︒ -B; -≮🡒\u1CED.񏿾Ⴁ\u0714; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -≮🡒᳭.Ⴁܔ -B; -<\u0338🡒\u1CED.񏿾Ⴁ\u0714; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -≮🡒᳭.Ⴁܔ -B; -<\u0338🡒\u1CED.񏿾ⴁ\u0714; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -≮🡒᳭.ⴁܔ -B; -≮🡒\u1CED.񏿾ⴁ\u0714; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -≮🡒᳭.ⴁܔ -B; xn----44l04zxt68c.xn--enb135qf106f; [B1 V3 V6]; [B1 V3 V6] # -≮🡒᳭.ⴁܔ -B; xn----44l04zxt68c.xn--enb300c1597h; [B1 V3 V6]; [B1 V3 V6] # -≮🡒᳭.Ⴁܔ -T; 𞤨。ꡏ\u200D\u200C; [B6 C1 C2]; xn--ge6h.xn--oc9a # 𞤨.ꡏ -N; 𞤨。ꡏ\u200D\u200C; [B6 C1 C2]; [B6 C1 C2] # 𞤨.ꡏ -T; 𞤨。ꡏ\u200D\u200C; [B6 C1 C2]; xn--ge6h.xn--oc9a # 𞤨.ꡏ -N; 𞤨。ꡏ\u200D\u200C; [B6 C1 C2]; [B6 C1 C2] # 𞤨.ꡏ -T; 𞤆。ꡏ\u200D\u200C; [B6 C1 C2]; xn--ge6h.xn--oc9a # 𞤨.ꡏ -N; 𞤆。ꡏ\u200D\u200C; [B6 C1 C2]; [B6 C1 C2] # 𞤨.ꡏ -B; xn--ge6h.xn--oc9a; 𞤨.ꡏ; xn--ge6h.xn--oc9a -B; 𞤨.ꡏ; ; xn--ge6h.xn--oc9a -B; 𞤆.ꡏ; 𞤨.ꡏ; xn--ge6h.xn--oc9a -B; xn--ge6h.xn--0ugb9575h; [B6 C1 C2]; [B6 C1 C2] # 𞤨.ꡏ -T; 𞤆。ꡏ\u200D\u200C; [B6 C1 C2]; xn--ge6h.xn--oc9a # 𞤨.ꡏ -N; 𞤆。ꡏ\u200D\u200C; [B6 C1 C2]; [B6 C1 C2] # 𞤨.ꡏ -B; 󠅹𑂶.ᢌ𑂹\u0669; [B1 B3 B5 B6 V5]; [B1 B3 B5 B6 V5] # 𑂶.ᢌ𑂹٩ -B; 󠅹𑂶.ᢌ𑂹\u0669; [B1 B3 B5 B6 V5]; [B1 B3 B5 B6 V5] # 𑂶.ᢌ𑂹٩ -B; xn--b50d.xn--iib993gyp5p; [B1 B3 B5 B6 V5]; [B1 B3 B5 B6 V5] # 𑂶.ᢌ𑂹٩ -B; Ⅎ󠅺񝵒。≯⾑; [P1 V6]; [P1 V6] -B; Ⅎ󠅺񝵒。>\u0338⾑; [P1 V6]; [P1 V6] -B; Ⅎ󠅺񝵒。≯襾; [P1 V6]; [P1 V6] -B; Ⅎ󠅺񝵒。>\u0338襾; [P1 V6]; [P1 V6] -B; ⅎ󠅺񝵒。>\u0338襾; [P1 V6]; [P1 V6] -B; ⅎ󠅺񝵒。≯襾; [P1 V6]; [P1 V6] -B; xn--73g39298c.xn--hdhz171b; [V6]; [V6] -B; xn--f3g73398c.xn--hdhz171b; [V6]; [V6] -B; ⅎ󠅺񝵒。>\u0338⾑; [P1 V6]; [P1 V6] -B; ⅎ󠅺񝵒。≯⾑; [P1 V6]; [P1 V6] -T; ς\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 V3] # ςු٠.- -N; ς\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 C2 V3] # ςු٠.- -T; ς\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 V3] # ςු٠.- -N; ς\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 C2 V3] # ςු٠.- -T; Σ\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 V3] # σු٠.- -N; Σ\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 C2 V3] # σු٠.- -T; σ\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 V3] # σු٠.- -N; σ\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 C2 V3] # σු٠.- -B; xn--4xa25ks2j.-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # σු٠.- -B; xn--4xa25ks2jenu.-; [B1 B5 B6 C2 V3]; [B1 B5 B6 C2 V3] # σු٠.- -B; xn--3xa45ks2jenu.-; [B1 B5 B6 C2 V3]; [B1 B5 B6 C2 V3] # ςු٠.- -T; Σ\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 V3] # σු٠.- -N; Σ\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 C2 V3] # σු٠.- -T; σ\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 V3] # σු٠.- -N; σ\u200D\u0DD4\u0660。-; [B1 B5 B6 C2 V3]; [B1 B5 B6 C2 V3] # σු٠.- -T; \u200C.ßႩ-; [C1 P1 V3 V6]; [P1 V3 V6 A4_2] # .ßႩ- -N; \u200C.ßႩ-; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .ßႩ- -T; \u200C.ßⴉ-; [C1 V3]; [V3 A4_2] # .ßⴉ- -N; \u200C.ßⴉ-; [C1 V3]; [C1 V3] # .ßⴉ- -T; \u200C.SSႩ-; [C1 P1 V3 V6]; [P1 V3 V6 A4_2] # .ssႩ- -N; \u200C.SSႩ-; [C1 P1 V3 V6]; [C1 P1 V3 V6] # .ssႩ- -T; \u200C.ssⴉ-; [C1 V3]; [V3 A4_2] # .ssⴉ- -N; \u200C.ssⴉ-; [C1 V3]; [C1 V3] # .ssⴉ- -T; \u200C.Ssⴉ-; [C1 V3]; [V3 A4_2] # .ssⴉ- -N; \u200C.Ssⴉ-; [C1 V3]; [C1 V3] # .ssⴉ- -B; .xn--ss--bi1b; [V3 A4_2]; [V3 A4_2] -B; xn--0ug.xn--ss--bi1b; [C1 V3]; [C1 V3] # .ssⴉ- -B; .xn--ss--4rn; [V3 V6 A4_2]; [V3 V6 A4_2] -B; xn--0ug.xn--ss--4rn; [C1 V3 V6]; [C1 V3 V6] # .ssႩ- -B; xn--0ug.xn----pfa2305a; [C1 V3]; [C1 V3] # .ßⴉ- -B; xn--0ug.xn----pfa042j; [C1 V3 V6]; [C1 V3 V6] # .ßႩ- -B; 󍭲𐫍㓱。⾑; [B5 P1 V6]; [B5 P1 V6] -B; 󍭲𐫍㓱。襾; [B5 P1 V6]; [B5 P1 V6] -B; xn--u7kt691dlj09f.xn--9v2a; [B5 V6]; [B5 V6] -T; \u06A0𐮋𐹰≮。≯󠦗\u200D; [B1 B3 C2 P1 V6]; [B1 B3 P1 V6] # ڠ𐮋𐹰≮.≯ -N; \u06A0𐮋𐹰≮。≯󠦗\u200D; [B1 B3 C2 P1 V6]; [B1 B3 C2 P1 V6] # ڠ𐮋𐹰≮.≯ -T; \u06A0𐮋𐹰<\u0338。>\u0338󠦗\u200D; [B1 B3 C2 P1 V6]; [B1 B3 P1 V6] # ڠ𐮋𐹰≮.≯ -N; \u06A0𐮋𐹰<\u0338。>\u0338󠦗\u200D; [B1 B3 C2 P1 V6]; [B1 B3 C2 P1 V6] # ڠ𐮋𐹰≮.≯ -B; xn--2jb053lf13nyoc.xn--hdh08821l; [B1 B3 V6]; [B1 B3 V6] # ڠ𐮋𐹰≮.≯ -B; xn--2jb053lf13nyoc.xn--1ugx6gc8096c; [B1 B3 C2 V6]; [B1 B3 C2 V6] # ڠ𐮋𐹰≮.≯ -B; 𝟞。񃰶\u0777\u08B0⩋; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # 6.ݷࢰ⩋ -B; 6。񃰶\u0777\u08B0⩋; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # 6.ݷࢰ⩋ -B; 6.xn--7pb04do15eq748f; [B1 B5 B6 V6]; [B1 B5 B6 V6] # 6.ݷࢰ⩋ -B; -\uFCFD。𑇀𑍴; [B1 V3 V5]; [B1 V3 V5] # -شى.𑇀𑍴 -B; -\uFCFD。𑇀𑍴; [B1 V3 V5]; [B1 V3 V5] # -شى.𑇀𑍴 -B; -\u0634\u0649。𑇀𑍴; [B1 V3 V5]; [B1 V3 V5] # -شى.𑇀𑍴 -B; xn----qnc7d.xn--wd1d62a; [B1 V3 V5]; [B1 V3 V5] # -شى.𑇀𑍴 -T; \u200C󠊶𝟏.\u0D43򪥐𐹬󊓶; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 1.ൃ𐹬 -N; \u200C󠊶𝟏.\u0D43򪥐𐹬󊓶; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 1.ൃ𐹬 -T; \u200C󠊶1.\u0D43򪥐𐹬󊓶; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 1.ൃ𐹬 -N; \u200C󠊶1.\u0D43򪥐𐹬󊓶; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 1.ൃ𐹬 -B; xn--1-f521m.xn--mxc0872kcu37dnmem; [B1 V5 V6]; [B1 V5 V6] # 1.ൃ𐹬 -B; xn--1-rgnu0071n.xn--mxc0872kcu37dnmem; [B1 C1 V5 V6]; [B1 C1 V5 V6] # 1.ൃ𐹬 -T; 齙--𝟰.ß; 齙--4.ß; xn----4-p16k.ss -N; 齙--𝟰.ß; 齙--4.ß; xn----4-p16k.xn--zca -T; 齙--4.ß; ; xn----4-p16k.ss -N; 齙--4.ß; ; xn----4-p16k.xn--zca -B; 齙--4.SS; 齙--4.ss; xn----4-p16k.ss -B; 齙--4.ss; ; xn----4-p16k.ss -B; 齙--4.Ss; 齙--4.ss; xn----4-p16k.ss -B; xn----4-p16k.ss; 齙--4.ss; xn----4-p16k.ss -B; xn----4-p16k.xn--zca; 齙--4.ß; xn----4-p16k.xn--zca -B; 齙--𝟰.SS; 齙--4.ss; xn----4-p16k.ss -B; 齙--𝟰.ss; 齙--4.ss; xn----4-p16k.ss -B; 齙--𝟰.Ss; 齙--4.ss; xn----4-p16k.ss -T; \u1BF2.𐹢𞀖\u200C; [B1 C1 V5]; [B1 V5] # ᯲.𐹢𞀖 -N; \u1BF2.𐹢𞀖\u200C; [B1 C1 V5]; [B1 C1 V5] # ᯲.𐹢𞀖 -B; xn--0zf.xn--9n0d2296a; [B1 V5]; [B1 V5] # ᯲.𐹢𞀖 -B; xn--0zf.xn--0ug9894grqqf; [B1 C1 V5]; [B1 C1 V5] # ᯲.𐹢𞀖 -T; 󃲙󠋘。\uDEDE-\u200D; [C2 P1 V6]; [P1 V3 V6 A3] # .- -N; 󃲙󠋘。\uDEDE-\u200D; [C2 P1 V6]; [C2 P1 V6 A3] # .- -T; 󃲙󠋘。\uDEDE-\u200D; [C2 P1 V6]; [P1 V3 V6 A3] # .- -N; 󃲙󠋘。\uDEDE-\u200D; [C2 P1 V6]; [C2 P1 V6 A3] # .- -B; xn--ct86d8w51a.\uDEDE-; [P1 V3 V6]; [P1 V3 V6 A3] # .- -B; XN--CT86D8W51A.\uDEDE-; [P1 V3 V6]; [P1 V3 V6 A3] # .- -B; Xn--Ct86d8w51a.\uDEDE-; [P1 V3 V6]; [P1 V3 V6 A3] # .- -T; xn--ct86d8w51a.\uDEDE-\u200D; [C2 P1 V6]; [P1 V3 V6 A3] # .- -N; xn--ct86d8w51a.\uDEDE-\u200D; [C2 P1 V6]; [C2 P1 V6 A3] # .- -T; XN--CT86D8W51A.\uDEDE-\u200D; [C2 P1 V6]; [P1 V3 V6 A3] # .- -N; XN--CT86D8W51A.\uDEDE-\u200D; [C2 P1 V6]; [C2 P1 V6 A3] # .- -T; Xn--Ct86d8w51a.\uDEDE-\u200D; [C2 P1 V6]; [P1 V3 V6 A3] # .- -N; Xn--Ct86d8w51a.\uDEDE-\u200D; [C2 P1 V6]; [C2 P1 V6 A3] # .- -B; \u1A60.𞵷-𝪩悎; [B1 B2 B3 B6 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # ᩠.-𝪩悎 -B; \u1A60.𞵷-𝪩悎; [B1 B2 B3 B6 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # ᩠.-𝪩悎 -B; xn--jof.xn----gf4bq282iezpa; [B1 B2 B3 B6 V5 V6]; [B1 B2 B3 B6 V5 V6] # ᩠.-𝪩悎 -B; 𛜯󠊛.𞤳񏥾; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] -B; 𛜯󠊛.𞤳񏥾; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] -B; 𛜯󠊛.𞤑񏥾; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] -B; xn--xx5gy2741c.xn--re6hw266j; [B2 B3 B6 V6]; [B2 B3 B6 V6] -B; 𛜯󠊛.𞤑񏥾; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] -B; \u071C𐫒\u062E.𐋲; [B1]; [B1] # ܜ𐫒خ.𐋲 -B; xn--tgb98b8643d.xn--m97c; [B1]; [B1] # ܜ𐫒خ.𐋲 -B; 𐼑𞤓\u0637\u08E2.\uDF56; [P1 V6]; [P1 V6 A3] # 𞤵ط. -B; 𐼑𞤵\u0637\u08E2.\uDF56; [P1 V6]; [P1 V6 A3] # 𞤵ط. -B; xn--2gb08k9w69agm0g.\uDF56; [P1 V6]; [P1 V6 A3] # 𞤵ط. -B; XN--2GB08K9W69AGM0G.\uDF56; [P1 V6]; [P1 V6 A3] # 𞤵ط. -B; Xn--2Gb08k9w69agm0g.\uDF56; [P1 V6]; [P1 V6 A3] # 𞤵ط. -B; Ↄ。\u0A4D\u1CD4𞷣; [B1 P1 V5 V6]; [B1 P1 V5 V6] # Ↄ.᳔੍ -B; Ↄ。\u1CD4\u0A4D𞷣; [B1 P1 V5 V6]; [B1 P1 V5 V6] # Ↄ.᳔੍ -B; ↄ。\u1CD4\u0A4D𞷣; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ↄ.᳔੍ -B; xn--r5g.xn--ybc995g0835a; [B1 V5 V6]; [B1 V5 V6] # ↄ.᳔੍ -B; xn--q5g.xn--ybc995g0835a; [B1 V5 V6]; [B1 V5 V6] # Ↄ.᳔੍ -B; ↄ。\u0A4D\u1CD4𞷣; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ↄ.᳔੍ -B; 󠪢-。򛂏≮𑜫; [P1 V3 V6]; [P1 V3 V6] -B; 󠪢-。򛂏<\u0338𑜫; [P1 V3 V6]; [P1 V3 V6] -B; xn----bh61m.xn--gdhz157g0em1d; [V3 V6]; [V3 V6] -T; \u200C󠉹\u200D。򌿧≮Ⴉ; [C1 C2 P1 V6]; [P1 V6] # .≮Ⴉ -N; \u200C󠉹\u200D。򌿧≮Ⴉ; [C1 C2 P1 V6]; [C1 C2 P1 V6] # .≮Ⴉ -T; \u200C󠉹\u200D。򌿧<\u0338Ⴉ; [C1 C2 P1 V6]; [P1 V6] # .≮Ⴉ -N; \u200C󠉹\u200D。򌿧<\u0338Ⴉ; [C1 C2 P1 V6]; [C1 C2 P1 V6] # .≮Ⴉ -T; \u200C󠉹\u200D。򌿧<\u0338ⴉ; [C1 C2 P1 V6]; [P1 V6] # .≮ⴉ -N; \u200C󠉹\u200D。򌿧<\u0338ⴉ; [C1 C2 P1 V6]; [C1 C2 P1 V6] # .≮ⴉ -T; \u200C󠉹\u200D。򌿧≮ⴉ; [C1 C2 P1 V6]; [P1 V6] # .≮ⴉ -N; \u200C󠉹\u200D。򌿧≮ⴉ; [C1 C2 P1 V6]; [C1 C2 P1 V6] # .≮ⴉ -B; xn--3n36e.xn--gdh992byu01p; [V6]; [V6] -B; xn--0ugc90904y.xn--gdh992byu01p; [C1 C2 V6]; [C1 C2 V6] # .≮ⴉ -B; xn--3n36e.xn--hnd112gpz83n; [V6]; [V6] -B; xn--0ugc90904y.xn--hnd112gpz83n; [C1 C2 V6]; [C1 C2 V6] # .≮Ⴉ -B; 𐹯-𑄴\u08BC。︒䖐⾆; [B1 P1 V6]; [B1 P1 V6] # 𐹯-𑄴ࢼ.︒䖐舌 -B; 𐹯-𑄴\u08BC。。䖐舌; [B1 A4_2]; [B1 A4_2] # 𐹯-𑄴ࢼ..䖐舌 -B; xn----rpd7902rclc..xn--fpo216m; [B1 A4_2]; [B1 A4_2] # 𐹯-𑄴ࢼ..䖐舌 -B; xn----rpd7902rclc.xn--fpo216mn07e; [B1 V6]; [B1 V6] # 𐹯-𑄴ࢼ.︒䖐舌 -B; 𝪞Ⴐ。쪡; [P1 V5 V6]; [P1 V5 V6] -B; 𝪞Ⴐ。쪡; [P1 V5 V6]; [P1 V5 V6] -B; 𝪞Ⴐ。쪡; [P1 V5 V6]; [P1 V5 V6] -B; 𝪞Ⴐ。쪡; [P1 V5 V6]; [P1 V5 V6] -B; 𝪞ⴐ。쪡; [V5]; [V5] -B; 𝪞ⴐ。쪡; [V5]; [V5] -B; xn--7kj1858k.xn--pi6b; [V5]; [V5] -B; xn--ond3755u.xn--pi6b; [V5 V6]; [V5 V6] -B; 𝪞ⴐ。쪡; [V5]; [V5] -B; 𝪞ⴐ。쪡; [V5]; [V5] -B; \u0E3A쩁𐹬.􋉳; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ฺ쩁𐹬. -B; \u0E3A쩁𐹬.􋉳; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ฺ쩁𐹬. -B; xn--o4c4837g2zvb.xn--5f70g; [B1 V5 V6]; [B1 V5 V6] # ฺ쩁𐹬. -T; ᡅ0\u200C。⎢󤨄; [C1 P1 V6]; [P1 V6] # ᡅ0.⎢ -N; ᡅ0\u200C。⎢󤨄; [C1 P1 V6]; [C1 P1 V6] # ᡅ0.⎢ -T; ᡅ0\u200C。⎢󤨄; [C1 P1 V6]; [P1 V6] # ᡅ0.⎢ -N; ᡅ0\u200C。⎢󤨄; [C1 P1 V6]; [C1 P1 V6] # ᡅ0.⎢ -B; xn--0-z6j.xn--8lh28773l; [V6]; [V6] -B; xn--0-z6jy93b.xn--8lh28773l; [C1 V6]; [C1 V6] # ᡅ0.⎢ -T; 𲮚9ꍩ\u17D3.\u200Dß; [C2 P1 V6]; [P1 V6] # 9ꍩ៓.ß -N; 𲮚9ꍩ\u17D3.\u200Dß; [C2 P1 V6]; [C2 P1 V6] # 9ꍩ៓.ß -T; 𲮚9ꍩ\u17D3.\u200Dß; [C2 P1 V6]; [P1 V6] # 9ꍩ៓.ß -N; 𲮚9ꍩ\u17D3.\u200Dß; [C2 P1 V6]; [C2 P1 V6] # 9ꍩ៓.ß -T; 𲮚9ꍩ\u17D3.\u200DSS; [C2 P1 V6]; [P1 V6] # 9ꍩ៓.ss -N; 𲮚9ꍩ\u17D3.\u200DSS; [C2 P1 V6]; [C2 P1 V6] # 9ꍩ៓.ss -T; 𲮚9ꍩ\u17D3.\u200Dss; [C2 P1 V6]; [P1 V6] # 9ꍩ៓.ss -N; 𲮚9ꍩ\u17D3.\u200Dss; [C2 P1 V6]; [C2 P1 V6] # 9ꍩ៓.ss -T; 𲮚9ꍩ\u17D3.\u200DSs; [C2 P1 V6]; [P1 V6] # 9ꍩ៓.ss -N; 𲮚9ꍩ\u17D3.\u200DSs; [C2 P1 V6]; [C2 P1 V6] # 9ꍩ៓.ss -B; xn--9-i0j5967eg3qz.ss; [V6]; [V6] # 9ꍩ៓.ss -B; xn--9-i0j5967eg3qz.xn--ss-l1t; [C2 V6]; [C2 V6] # 9ꍩ៓.ss -B; xn--9-i0j5967eg3qz.xn--zca770n; [C2 V6]; [C2 V6] # 9ꍩ៓.ß -T; 𲮚9ꍩ\u17D3.\u200DSS; [C2 P1 V6]; [P1 V6] # 9ꍩ៓.ss -N; 𲮚9ꍩ\u17D3.\u200DSS; [C2 P1 V6]; [C2 P1 V6] # 9ꍩ៓.ss -T; 𲮚9ꍩ\u17D3.\u200Dss; [C2 P1 V6]; [P1 V6] # 9ꍩ៓.ss -N; 𲮚9ꍩ\u17D3.\u200Dss; [C2 P1 V6]; [C2 P1 V6] # 9ꍩ៓.ss -T; 𲮚9ꍩ\u17D3.\u200DSs; [C2 P1 V6]; [P1 V6] # 9ꍩ៓.ss -N; 𲮚9ꍩ\u17D3.\u200DSs; [C2 P1 V6]; [C2 P1 V6] # 9ꍩ៓.ss -B; ꗷ𑆀.\u075D𐩒; ; xn--ju8a625r.xn--hpb0073k; NV8 # ꗷ𑆀.ݝ𐩒 -B; xn--ju8a625r.xn--hpb0073k; ꗷ𑆀.\u075D𐩒; xn--ju8a625r.xn--hpb0073k; NV8 # ꗷ𑆀.ݝ𐩒 -B; ⒐≯-。︒򩑣-񞛠; [P1 V3 V6]; [P1 V3 V6] -B; ⒐>\u0338-。︒򩑣-񞛠; [P1 V3 V6]; [P1 V3 V6] -B; 9.≯-。。򩑣-񞛠; [P1 V3 V6 A4_2]; [P1 V3 V6 A4_2] -B; 9.>\u0338-。。򩑣-񞛠; [P1 V3 V6 A4_2]; [P1 V3 V6 A4_2] -B; 9.xn----ogo..xn----xj54d1s69k; [V3 V6 A4_2]; [V3 V6 A4_2] -B; xn----ogot9g.xn----n89hl0522az9u2a; [V3 V6]; [V3 V6] -B; 򈪚\u0CE3Ⴡ󠢏.\u061D; [B6 P1 V6]; [B6 P1 V6] # ೣჁ. -B; 򈪚\u0CE3Ⴡ󠢏.\u061D; [B6 P1 V6]; [B6 P1 V6] # ೣჁ. -B; 򈪚\u0CE3ⴡ󠢏.\u061D; [B6 P1 V6]; [B6 P1 V6] # ೣⴡ. -B; xn--vuc226n8n28lmju7a.xn--cgb; [B6 V6]; [B6 V6] # ೣⴡ. -B; xn--vuc49qvu85xmju7a.xn--cgb; [B6 V6]; [B6 V6] # ೣჁ. -B; 򈪚\u0CE3ⴡ󠢏.\u061D; [B6 P1 V6]; [B6 P1 V6] # ೣⴡ. -B; \u1DEB。𐋩\u0638-𐫮; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ᷫ.𐋩ظ-𐫮 -B; xn--gfg.xn----xnc0815qyyg; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ᷫ.𐋩ظ-𐫮 -B; 싇。⾇𐳋Ⴝ; [B5 P1 V6]; [B5 P1 V6] -B; 싇。⾇𐳋Ⴝ; [B5 P1 V6]; [B5 P1 V6] -B; 싇。舛𐳋Ⴝ; [B5 P1 V6]; [B5 P1 V6] -B; 싇。舛𐳋Ⴝ; [B5 P1 V6]; [B5 P1 V6] -B; 싇。舛𐳋ⴝ; [B5]; [B5] -B; 싇。舛𐳋ⴝ; [B5]; [B5] -B; 싇。舛𐲋Ⴝ; [B5 P1 V6]; [B5 P1 V6] -B; 싇。舛𐲋Ⴝ; [B5 P1 V6]; [B5 P1 V6] -B; 싇。舛𐲋ⴝ; [B5]; [B5] -B; 싇。舛𐲋ⴝ; [B5]; [B5] -B; xn--9u4b.xn--llj123yh74e; [B5]; [B5] -B; xn--9u4b.xn--1nd7519ch79d; [B5 V6]; [B5 V6] -B; 싇。⾇𐳋ⴝ; [B5]; [B5] -B; 싇。⾇𐳋ⴝ; [B5]; [B5] -B; 싇。⾇𐲋Ⴝ; [B5 P1 V6]; [B5 P1 V6] -B; 싇。⾇𐲋Ⴝ; [B5 P1 V6]; [B5 P1 V6] -B; 싇。⾇𐲋ⴝ; [B5]; [B5] -B; 싇。⾇𐲋ⴝ; [B5]; [B5] -T; 𐹠ς。\u200C\u06BFჀ; [B1 C1 P1 V6]; [B1 B2 B3 P1 V6] # 𐹠ς.ڿჀ -N; 𐹠ς。\u200C\u06BFჀ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹠ς.ڿჀ -T; 𐹠ς。\u200C\u06BFⴠ; [B1 C1]; [B1 B2 B3] # 𐹠ς.ڿⴠ -N; 𐹠ς。\u200C\u06BFⴠ; [B1 C1]; [B1 C1] # 𐹠ς.ڿⴠ -T; 𐹠Σ。\u200C\u06BFჀ; [B1 C1 P1 V6]; [B1 B2 B3 P1 V6] # 𐹠σ.ڿჀ -N; 𐹠Σ。\u200C\u06BFჀ; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 𐹠σ.ڿჀ -T; 𐹠σ。\u200C\u06BFⴠ; [B1 C1]; [B1 B2 B3] # 𐹠σ.ڿⴠ -N; 𐹠σ。\u200C\u06BFⴠ; [B1 C1]; [B1 C1] # 𐹠σ.ڿⴠ -B; xn--4xa9167k.xn--ykb467q; [B1 B2 B3]; [B1 B2 B3] # 𐹠σ.ڿⴠ -B; xn--4xa9167k.xn--ykb760k9hj; [B1 C1]; [B1 C1] # 𐹠σ.ڿⴠ -B; xn--4xa9167k.xn--ykb632c; [B1 B2 B3 V6]; [B1 B2 B3 V6] # 𐹠σ.ڿჀ -B; xn--4xa9167k.xn--ykb632cvxm; [B1 C1 V6]; [B1 C1 V6] # 𐹠σ.ڿჀ -B; xn--3xa1267k.xn--ykb760k9hj; [B1 C1]; [B1 C1] # 𐹠ς.ڿⴠ -B; xn--3xa1267k.xn--ykb632cvxm; [B1 C1 V6]; [B1 C1 V6] # 𐹠ς.ڿჀ -T; 򇒐\u200C\u0604.\u069A-ß; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 P1 V6] # .ښ-ß -N; 򇒐\u200C\u0604.\u069A-ß; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 C1 P1 V6] # .ښ-ß -T; 򇒐\u200C\u0604.\u069A-SS; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 P1 V6] # .ښ-ss -N; 򇒐\u200C\u0604.\u069A-SS; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 C1 P1 V6] # .ښ-ss -T; 򇒐\u200C\u0604.\u069A-ss; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 P1 V6] # .ښ-ss -N; 򇒐\u200C\u0604.\u069A-ss; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 C1 P1 V6] # .ښ-ss -T; 򇒐\u200C\u0604.\u069A-Ss; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 P1 V6] # .ښ-ss -N; 򇒐\u200C\u0604.\u069A-Ss; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 C1 P1 V6] # .ښ-ss -B; xn--mfb98261i.xn---ss-sdf; [B2 B3 B5 B6 V6]; [B2 B3 B5 B6 V6] # .ښ-ss -B; xn--mfb144kqo32m.xn---ss-sdf; [B2 B3 B5 B6 C1 V6]; [B2 B3 B5 B6 C1 V6] # .ښ-ss -B; xn--mfb144kqo32m.xn----qfa315b; [B2 B3 B5 B6 C1 V6]; [B2 B3 B5 B6 C1 V6] # .ښ-ß -T; \u200C\u200D\u17B5\u067A.-\uFBB0󅄞𐸚; [B1 C1 C2 P1 V3 V6]; [B1 P1 V3 V5 V6] # ٺ.-ۓ -N; \u200C\u200D\u17B5\u067A.-\uFBB0󅄞𐸚; [B1 C1 C2 P1 V3 V6]; [B1 C1 C2 P1 V3 V6] # ٺ.-ۓ -T; \u200C\u200D\u17B5\u067A.-\u06D3󅄞𐸚; [B1 C1 C2 P1 V3 V6]; [B1 P1 V3 V5 V6] # ٺ.-ۓ -N; \u200C\u200D\u17B5\u067A.-\u06D3󅄞𐸚; [B1 C1 C2 P1 V3 V6]; [B1 C1 C2 P1 V3 V6] # ٺ.-ۓ -T; \u200C\u200D\u17B5\u067A.-\u06D2\u0654󅄞𐸚; [B1 C1 C2 P1 V3 V6]; [B1 P1 V3 V5 V6] # ٺ.-ۓ -N; \u200C\u200D\u17B5\u067A.-\u06D2\u0654󅄞𐸚; [B1 C1 C2 P1 V3 V6]; [B1 C1 C2 P1 V3 V6] # ٺ.-ۓ -B; xn--zib539f.xn----twc1133r17r6g; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ٺ.-ۓ -B; xn--zib539f8igea.xn----twc1133r17r6g; [B1 C1 C2 V3 V6]; [B1 C1 C2 V3 V6] # ٺ.-ۓ -B; 򡶱。𐮬≠; [B3 P1 V6]; [B3 P1 V6] -B; 򡶱。𐮬=\u0338; [B3 P1 V6]; [B3 P1 V6] -B; 򡶱。𐮬≠; [B3 P1 V6]; [B3 P1 V6] -B; 򡶱。𐮬=\u0338; [B3 P1 V6]; [B3 P1 V6] -B; xn--dd55c.xn--1ch3003g; [B3 V6]; [B3 V6] -B; \u0FB2𞶅。𐹮𐹷덝۵; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ྲ.𐹮𐹷덝۵ -B; \u0FB2𞶅。𐹮𐹷덝۵; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ྲ.𐹮𐹷덝۵ -B; \u0FB2𞶅。𐹮𐹷덝۵; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ྲ.𐹮𐹷덝۵ -B; \u0FB2𞶅。𐹮𐹷덝۵; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ྲ.𐹮𐹷덝۵ -B; xn--fgd0675v.xn--imb5839fidpcbba; [B1 V5 V6]; [B1 V5 V6] # ྲ.𐹮𐹷덝۵ -T; Ⴏ󠅋-.\u200DႩ; [C2 P1 V3 V6]; [P1 V3 V6] # Ⴏ-.Ⴉ -N; Ⴏ󠅋-.\u200DႩ; [C2 P1 V3 V6]; [C2 P1 V3 V6] # Ⴏ-.Ⴉ -T; Ⴏ󠅋-.\u200DႩ; [C2 P1 V3 V6]; [P1 V3 V6] # Ⴏ-.Ⴉ -N; Ⴏ󠅋-.\u200DႩ; [C2 P1 V3 V6]; [C2 P1 V3 V6] # Ⴏ-.Ⴉ -T; ⴏ󠅋-.\u200Dⴉ; [C2 V3]; [V3] # ⴏ-.ⴉ -N; ⴏ󠅋-.\u200Dⴉ; [C2 V3]; [C2 V3] # ⴏ-.ⴉ -B; xn----3vs.xn--0kj; [V3]; [V3] -B; xn----3vs.xn--1ug532c; [C2 V3]; [C2 V3] # ⴏ-.ⴉ -B; xn----00g.xn--hnd; [V3 V6]; [V3 V6] -B; xn----00g.xn--hnd399e; [C2 V3 V6]; [C2 V3 V6] # Ⴏ-.Ⴉ -T; ⴏ󠅋-.\u200Dⴉ; [C2 V3]; [V3] # ⴏ-.ⴉ -N; ⴏ󠅋-.\u200Dⴉ; [C2 V3]; [C2 V3] # ⴏ-.ⴉ -B; ⇧𐨏󠾈󯶅。\u0600󠈵󠆉; [B1 P1 V6]; [B1 P1 V6] # ⇧𐨏. -B; xn--l8g5552g64t4g46xf.xn--ifb08144p; [B1 V6]; [B1 V6] # ⇧𐨏. -B; ≠𐮂.↑🄇⒈; [B1 P1 V6]; [B1 P1 V6] -B; =\u0338𐮂.↑🄇⒈; [B1 P1 V6]; [B1 P1 V6] -B; ≠𐮂.↑6,1.; [B1 P1 V6]; [B1 P1 V6] -B; =\u0338𐮂.↑6,1.; [B1 P1 V6]; [B1 P1 V6] -B; xn--1chy492g.xn--6,1-pw1a.; [B1 P1 V6]; [B1 P1 V6] -B; xn--1chy492g.xn--45gx9iuy44d; [B1 V6]; [B1 V6] -T; 𝩏󠲉ß.ᢤ򄦌\u200C𐹫; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𝩏ß.ᢤ𐹫 -N; 𝩏󠲉ß.ᢤ򄦌\u200C𐹫; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 C1 P1 V5 V6] # 𝩏ß.ᢤ𐹫 -T; 𝩏󠲉SS.ᢤ򄦌\u200C𐹫; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𝩏ss.ᢤ𐹫 -N; 𝩏󠲉SS.ᢤ򄦌\u200C𐹫; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 C1 P1 V5 V6] # 𝩏ss.ᢤ𐹫 -T; 𝩏󠲉ss.ᢤ򄦌\u200C𐹫; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𝩏ss.ᢤ𐹫 -N; 𝩏󠲉ss.ᢤ򄦌\u200C𐹫; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 C1 P1 V5 V6] # 𝩏ss.ᢤ𐹫 -T; 𝩏󠲉Ss.ᢤ򄦌\u200C𐹫; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𝩏ss.ᢤ𐹫 -N; 𝩏󠲉Ss.ᢤ򄦌\u200C𐹫; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 C1 P1 V5 V6] # 𝩏ss.ᢤ𐹫 -B; xn--ss-zb11ap1427e.xn--ubf2596jbt61c; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] -B; xn--ss-zb11ap1427e.xn--ubf609atw1tynn3d; [B1 B5 B6 C1 V5 V6]; [B1 B5 B6 C1 V5 V6] # 𝩏ss.ᢤ𐹫 -B; xn--zca3153vupz3e.xn--ubf609atw1tynn3d; [B1 B5 B6 C1 V5 V6]; [B1 B5 B6 C1 V5 V6] # 𝩏ß.ᢤ𐹫 -T; ß𐵳񗘁Ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ßႧ.ꙺ -N; ß𐵳񗘁Ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ßႧ.ꙺ -T; ß𐵳񗘁Ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ßႧ.ꙺ -N; ß𐵳񗘁Ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ßႧ.ꙺ -T; ß𐵳񗘁ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ßⴇ.ꙺ -N; ß𐵳񗘁ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ßⴇ.ꙺ -B; SS𐵳񗘁Ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ssႧ.ꙺ -B; ss𐵳񗘁ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ssⴇ.ꙺ -B; Ss𐵳񗘁Ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ssႧ.ꙺ -B; xn--ss-rek7420r4hs7b.xn--9x8a; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # ssႧ.ꙺ -B; xn--ss-e61ar955h4hs7b.xn--9x8a; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # ssⴇ.ꙺ -B; xn--zca227tpy4lkns1b.xn--9x8a; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # ßⴇ.ꙺ -B; xn--zca491fci5qkn79a.xn--9x8a; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # ßႧ.ꙺ -T; ß𐵳񗘁ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ßⴇ.ꙺ -N; ß𐵳񗘁ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ßⴇ.ꙺ -B; SS𐵳񗘁Ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ssႧ.ꙺ -B; ss𐵳񗘁ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ssⴇ.ꙺ -B; Ss𐵳񗘁Ⴇ。\uA67A; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # ssႧ.ꙺ -B; \u1714。󠆣-𑋪; [V3 V5]; [V3 V5] # ᜔.-𑋪 -B; xn--fze.xn----ly8i; [V3 V5]; [V3 V5] # ᜔.-𑋪 -T; \uABE8-.򨏜\u05BDß; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽß -N; \uABE8-.򨏜\u05BDß; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽß -T; \uABE8-.򨏜\u05BDß; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽß -N; \uABE8-.򨏜\u05BDß; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽß -B; \uABE8-.򨏜\u05BDSS; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽss -B; \uABE8-.򨏜\u05BDss; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽss -B; \uABE8-.򨏜\u05BDSs; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽss -B; xn----pw5e.xn--ss-7jd10716y; [V3 V5 V6]; [V3 V5 V6] # ꯨ-.ֽss -B; xn----pw5e.xn--zca50wfv060a; [V3 V5 V6]; [V3 V5 V6] # ꯨ-.ֽß -B; \uABE8-.򨏜\u05BDSS; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽss -B; \uABE8-.򨏜\u05BDss; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽss -B; \uABE8-.򨏜\u05BDSs; [P1 V3 V5 V6]; [P1 V3 V5 V6] # ꯨ-.ֽss -B; ᡓ-≮。\u066B󠅱ᡄ; [B1 B6 P1 V6]; [B1 B6 P1 V6] # ᡓ-≮.٫ᡄ -B; ᡓ-<\u0338。\u066B󠅱ᡄ; [B1 B6 P1 V6]; [B1 B6 P1 V6] # ᡓ-≮.٫ᡄ -B; xn----s7j866c.xn--kib252g; [B1 B6 V6]; [B1 B6 V6] # ᡓ-≮.٫ᡄ -B; 𝟥♮𑜫\u08ED.\u17D2𑜫8󠆏; [V5]; [V5] # 3♮𑜫࣭.្𑜫8 -B; 3♮𑜫\u08ED.\u17D2𑜫8󠆏; [V5]; [V5] # 3♮𑜫࣭.្𑜫8 -B; xn--3-ksd277tlo7s.xn--8-f0jx021l; [V5]; [V5] # 3♮𑜫࣭.្𑜫8 -T; -。򕌀\u200D❡; [C2 P1 V3 V6]; [P1 V3 V6] # -.❡ -N; -。򕌀\u200D❡; [C2 P1 V3 V6]; [C2 P1 V3 V6] # -.❡ -T; -。򕌀\u200D❡; [C2 P1 V3 V6]; [P1 V3 V6] # -.❡ -N; -。򕌀\u200D❡; [C2 P1 V3 V6]; [C2 P1 V3 V6] # -.❡ -B; -.xn--nei54421f; [V3 V6]; [V3 V6] -B; -.xn--1ug800aq795s; [C2 V3 V6]; [C2 V3 V6] # -.❡ -B; 𝟓☱𝟐򥰵。𝪮񐡳; [P1 V5 V6]; [P1 V5 V6] -B; 5☱2򥰵。𝪮񐡳; [P1 V5 V6]; [P1 V5 V6] -B; xn--52-dwx47758j.xn--kd3hk431k; [V5 V6]; [V5 V6] -B; -.-├򖦣; [P1 V3 V6]; [P1 V3 V6] -B; -.xn----ukp70432h; [V3 V6]; [V3 V6] -T; \u05A5\u076D。\u200D󠀘; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ֥ݭ. -N; \u05A5\u076D。\u200D󠀘; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ֥ݭ. -T; \u05A5\u076D。\u200D󠀘; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ֥ݭ. -N; \u05A5\u076D。\u200D󠀘; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ֥ݭ. -B; xn--wcb62g.xn--p526e; [B1 V5 V6]; [B1 V5 V6] # ֥ݭ. -B; xn--wcb62g.xn--1ugy8001l; [B1 C2 V5 V6]; [B1 C2 V5 V6] # ֥ݭ. -T; 쥥󔏉Ⴎ.\u200C⒈⒈𐫒; [B1 C1 P1 V6]; [B1 P1 V6] # 쥥Ⴎ.⒈⒈𐫒 -N; 쥥󔏉Ⴎ.\u200C⒈⒈𐫒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 쥥Ⴎ.⒈⒈𐫒 -T; 쥥󔏉Ⴎ.\u200C⒈⒈𐫒; [B1 C1 P1 V6]; [B1 P1 V6] # 쥥Ⴎ.⒈⒈𐫒 -N; 쥥󔏉Ⴎ.\u200C⒈⒈𐫒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 쥥Ⴎ.⒈⒈𐫒 -T; 쥥󔏉Ⴎ.\u200C1.1.𐫒; [B1 C1 P1 V6]; [B1 P1 V6] # 쥥Ⴎ.1.1.𐫒 -N; 쥥󔏉Ⴎ.\u200C1.1.𐫒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 쥥Ⴎ.1.1.𐫒 -T; 쥥󔏉Ⴎ.\u200C1.1.𐫒; [B1 C1 P1 V6]; [B1 P1 V6] # 쥥Ⴎ.1.1.𐫒 -N; 쥥󔏉Ⴎ.\u200C1.1.𐫒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 쥥Ⴎ.1.1.𐫒 -T; 쥥󔏉ⴎ.\u200C1.1.𐫒; [B1 C1 P1 V6]; [B1 P1 V6] # 쥥ⴎ.1.1.𐫒 -N; 쥥󔏉ⴎ.\u200C1.1.𐫒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 쥥ⴎ.1.1.𐫒 -T; 쥥󔏉ⴎ.\u200C1.1.𐫒; [B1 C1 P1 V6]; [B1 P1 V6] # 쥥ⴎ.1.1.𐫒 -N; 쥥󔏉ⴎ.\u200C1.1.𐫒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 쥥ⴎ.1.1.𐫒 -B; xn--5kj3511ccyw3h.1.1.xn--7w9c; [B1 V6]; [B1 V6] -B; xn--5kj3511ccyw3h.xn--1-rgn.1.xn--7w9c; [B1 C1 V6]; [B1 C1 V6] # 쥥ⴎ.1.1.𐫒 -B; xn--mnd7865gcy28g.1.1.xn--7w9c; [B1 V6]; [B1 V6] -B; xn--mnd7865gcy28g.xn--1-rgn.1.xn--7w9c; [B1 C1 V6]; [B1 C1 V6] # 쥥Ⴎ.1.1.𐫒 -T; 쥥󔏉ⴎ.\u200C⒈⒈𐫒; [B1 C1 P1 V6]; [B1 P1 V6] # 쥥ⴎ.⒈⒈𐫒 -N; 쥥󔏉ⴎ.\u200C⒈⒈𐫒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 쥥ⴎ.⒈⒈𐫒 -T; 쥥󔏉ⴎ.\u200C⒈⒈𐫒; [B1 C1 P1 V6]; [B1 P1 V6] # 쥥ⴎ.⒈⒈𐫒 -N; 쥥󔏉ⴎ.\u200C⒈⒈𐫒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # 쥥ⴎ.⒈⒈𐫒 -B; xn--5kj3511ccyw3h.xn--tsha6797o; [B1 V6]; [B1 V6] -B; xn--5kj3511ccyw3h.xn--0ug88oa0396u; [B1 C1 V6]; [B1 C1 V6] # 쥥ⴎ.⒈⒈𐫒 -B; xn--mnd7865gcy28g.xn--tsha6797o; [B1 V6]; [B1 V6] -B; xn--mnd7865gcy28g.xn--0ug88oa0396u; [B1 C1 V6]; [B1 C1 V6] # 쥥Ⴎ.⒈⒈𐫒 -B; \u0827𝟶\u06A0-。𑄳; [B1 B3 B6 V3 V5]; [B1 B3 B6 V3 V5] # ࠧ0ڠ-.𑄳 -B; \u08270\u06A0-。𑄳; [B1 B3 B6 V3 V5]; [B1 B3 B6 V3 V5] # ࠧ0ڠ-.𑄳 -B; xn--0--p3d67m.xn--v80d; [B1 B3 B6 V3 V5]; [B1 B3 B6 V3 V5] # ࠧ0ڠ-.𑄳 -T; ς.\uFDC1🞛⒈; [P1 V6]; [P1 V6] # ς.فمي🞛⒈ -N; ς.\uFDC1🞛⒈; [P1 V6]; [P1 V6] # ς.فمي🞛⒈ -T; ς.\u0641\u0645\u064A🞛1.; ; xn--4xa.xn--1-gocmu97674d.; NV8 # ς.فمي🞛1. -N; ς.\u0641\u0645\u064A🞛1.; ; xn--3xa.xn--1-gocmu97674d.; NV8 # ς.فمي🞛1. -B; Σ.\u0641\u0645\u064A🞛1.; σ.\u0641\u0645\u064A🞛1.; xn--4xa.xn--1-gocmu97674d.; NV8 # σ.فمي🞛1. -B; σ.\u0641\u0645\u064A🞛1.; ; xn--4xa.xn--1-gocmu97674d.; NV8 # σ.فمي🞛1. -B; xn--4xa.xn--1-gocmu97674d.; σ.\u0641\u0645\u064A🞛1.; xn--4xa.xn--1-gocmu97674d.; NV8 # σ.فمي🞛1. -B; xn--3xa.xn--1-gocmu97674d.; ς.\u0641\u0645\u064A🞛1.; xn--3xa.xn--1-gocmu97674d.; NV8 # ς.فمي🞛1. -B; Σ.\uFDC1🞛⒈; [P1 V6]; [P1 V6] # σ.فمي🞛⒈ -B; σ.\uFDC1🞛⒈; [P1 V6]; [P1 V6] # σ.فمي🞛⒈ -B; xn--4xa.xn--dhbip2802atb20c; [V6]; [V6] # σ.فمي🞛⒈ -B; xn--3xa.xn--dhbip2802atb20c; [V6]; [V6] # ς.فمي🞛⒈ -B; 🗩-。𐹻󐞆񥉮; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; 🗩-。𐹻󐞆񥉮; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; xn----6t3s.xn--zo0d4811u6ru6a; [B1 V3 V6]; [B1 V3 V6] -T; 𐡜-🔪。𝟻\u200C𐿀; [B1 B3 C1 P1 V6]; [B1 B3 P1 V6] # 𐡜-🔪.5 -N; 𐡜-🔪。𝟻\u200C𐿀; [B1 B3 C1 P1 V6]; [B1 B3 C1 P1 V6] # 𐡜-🔪.5 -T; 𐡜-🔪。5\u200C𐿀; [B1 B3 C1 P1 V6]; [B1 B3 P1 V6] # 𐡜-🔪.5 -N; 𐡜-🔪。5\u200C𐿀; [B1 B3 C1 P1 V6]; [B1 B3 C1 P1 V6] # 𐡜-🔪.5 -B; xn----5j4iv089c.xn--5-bn7i; [B1 B3 V6]; [B1 B3 V6] -B; xn----5j4iv089c.xn--5-sgn7149h; [B1 B3 C1 V6]; [B1 B3 C1 V6] # 𐡜-🔪.5 -T; 𐹣늿\u200Dß.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ß.ߏ0ּ -N; 𐹣늿\u200Dß.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ß.ߏ0ּ -T; 𐹣늿\u200Dß.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ß.ߏ0ּ -N; 𐹣늿\u200Dß.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ß.ߏ0ּ -T; 𐹣늿\u200Dß.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ß.ߏ0ּ -N; 𐹣늿\u200Dß.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ß.ߏ0ּ -T; 𐹣늿\u200Dß.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ß.ߏ0ּ -N; 𐹣늿\u200Dß.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ß.ߏ0ּ -T; 𐹣늿\u200DSS.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200DSS.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200DSS.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200DSS.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200Dss.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200Dss.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200Dss.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200Dss.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200DSs.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200DSs.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200DSs.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200DSs.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -B; xn--ss-i05i7041a.xn--0-vgc50n; [B1]; [B1] # 𐹣늿ss.ߏ0ּ -B; xn--ss-l1tu910fo0xd.xn--0-vgc50n; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -B; xn--zca770n5s4hev6c.xn--0-vgc50n; [B1 C2]; [B1 C2] # 𐹣늿ß.ߏ0ּ -T; 𐹣늿\u200DSS.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200DSS.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200DSS.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200DSS.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200Dss.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200Dss.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200Dss.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200Dss.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200DSs.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200DSs.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -T; 𐹣늿\u200DSs.\u07CF0\u05BC; [B1 C2]; [B1] # 𐹣늿ss.ߏ0ּ -N; 𐹣늿\u200DSs.\u07CF0\u05BC; [B1 C2]; [B1 C2] # 𐹣늿ss.ߏ0ּ -B; 9󠇥.󪴴ᢓ; [P1 V6]; [P1 V6] -B; 9󠇥.󪴴ᢓ; [P1 V6]; [P1 V6] -B; 9.xn--dbf91222q; [V6]; [V6] -T; \u200C\uFFA0.𐫭🠗ß⽟; [B1 B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # .𐫭🠗ß玉 -N; \u200C\uFFA0.𐫭🠗ß⽟; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .𐫭🠗ß玉 -T; \u200C\u1160.𐫭🠗ß玉; [B1 B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # .𐫭🠗ß玉 -N; \u200C\u1160.𐫭🠗ß玉; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .𐫭🠗ß玉 -T; \u200C\u1160.𐫭🠗SS玉; [B1 B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # .𐫭🠗ss玉 -N; \u200C\u1160.𐫭🠗SS玉; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .𐫭🠗ss玉 -T; \u200C\u1160.𐫭🠗ss玉; [B1 B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # .𐫭🠗ss玉 -N; \u200C\u1160.𐫭🠗ss玉; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .𐫭🠗ss玉 -T; \u200C\u1160.𐫭🠗Ss玉; [B1 B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # .𐫭🠗ss玉 -N; \u200C\u1160.𐫭🠗Ss玉; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .𐫭🠗ss玉 -B; xn--psd.xn--ss-je6eq954cp25j; [B2 B3 V6]; [B2 B3 V6] # .𐫭🠗ss玉 -B; xn--psd526e.xn--ss-je6eq954cp25j; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # .𐫭🠗ss玉 -B; xn--psd526e.xn--zca2289c550e0iwi; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # .𐫭🠗ß玉 -T; \u200C\uFFA0.𐫭🠗SS⽟; [B1 B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # .𐫭🠗ss玉 -N; \u200C\uFFA0.𐫭🠗SS⽟; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .𐫭🠗ss玉 -T; \u200C\uFFA0.𐫭🠗ss⽟; [B1 B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # .𐫭🠗ss玉 -N; \u200C\uFFA0.𐫭🠗ss⽟; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .𐫭🠗ss玉 -T; \u200C\uFFA0.𐫭🠗Ss⽟; [B1 B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # .𐫭🠗ss玉 -N; \u200C\uFFA0.𐫭🠗Ss⽟; [B1 B2 B3 C1 P1 V6]; [B1 B2 B3 C1 P1 V6] # .𐫭🠗ss玉 -B; xn--cl7c.xn--ss-je6eq954cp25j; [B2 B3 V6]; [B2 B3 V6] # .𐫭🠗ss玉 -B; xn--0ug7719f.xn--ss-je6eq954cp25j; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # .𐫭🠗ss玉 -B; xn--0ug7719f.xn--zca2289c550e0iwi; [B1 B2 B3 C1 V6]; [B1 B2 B3 C1 V6] # .𐫭🠗ß玉 -T; ︒Ⴖ\u0366.\u200C; [C1 P1 V6]; [P1 V6] # ︒Ⴖͦ. -N; ︒Ⴖ\u0366.\u200C; [C1 P1 V6]; [C1 P1 V6] # ︒Ⴖͦ. -T; 。Ⴖ\u0366.\u200C; [C1 P1 V6 A4_2]; [P1 V6 A4_2] # .Ⴖͦ. -N; 。Ⴖ\u0366.\u200C; [C1 P1 V6 A4_2]; [C1 P1 V6 A4_2] # .Ⴖͦ. -T; 。ⴖ\u0366.\u200C; [C1 A4_2]; [A4_2] # .ⴖͦ. -N; 。ⴖ\u0366.\u200C; [C1 A4_2]; [C1 A4_2] # .ⴖͦ. -B; .xn--hva754s.; [A4_2]; [A4_2] # .ⴖͦ. -B; .xn--hva754s.xn--0ug; [C1 A4_2]; [C1 A4_2] # .ⴖͦ. -B; .xn--hva929d.; [V6 A4_2]; [V6 A4_2] # .Ⴖͦ. -B; .xn--hva929d.xn--0ug; [C1 V6 A4_2]; [C1 V6 A4_2] # .Ⴖͦ. -T; ︒ⴖ\u0366.\u200C; [C1 P1 V6]; [P1 V6] # ︒ⴖͦ. -N; ︒ⴖ\u0366.\u200C; [C1 P1 V6]; [C1 P1 V6] # ︒ⴖͦ. -B; xn--hva754sy94k.; [V6]; [V6] # ︒ⴖͦ. -B; xn--hva754sy94k.xn--0ug; [C1 V6]; [C1 V6] # ︒ⴖͦ. -B; xn--hva929dl29p.; [V6]; [V6] # ︒Ⴖͦ. -B; xn--hva929dl29p.xn--0ug; [C1 V6]; [C1 V6] # ︒Ⴖͦ. -B; xn--hva754s.; ⴖ\u0366.; xn--hva754s. # ⴖͦ. -B; ⴖ\u0366.; ; xn--hva754s. # ⴖͦ. -B; Ⴖ\u0366.; [P1 V6]; [P1 V6] # Ⴖͦ. -B; xn--hva929d.; [V6]; [V6] # Ⴖͦ. -T; \u08BB.\u200CႣ𞀒; [B1 C1 P1 V6]; [P1 V6] # ࢻ.Ⴃ𞀒 -N; \u08BB.\u200CႣ𞀒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ࢻ.Ⴃ𞀒 -T; \u08BB.\u200CႣ𞀒; [B1 C1 P1 V6]; [P1 V6] # ࢻ.Ⴃ𞀒 -N; \u08BB.\u200CႣ𞀒; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ࢻ.Ⴃ𞀒 -T; \u08BB.\u200Cⴃ𞀒; [B1 C1]; xn--hzb.xn--ukj4430l # ࢻ.ⴃ𞀒 -N; \u08BB.\u200Cⴃ𞀒; [B1 C1]; [B1 C1] # ࢻ.ⴃ𞀒 -B; xn--hzb.xn--ukj4430l; \u08BB.ⴃ𞀒; xn--hzb.xn--ukj4430l # ࢻ.ⴃ𞀒 -B; \u08BB.ⴃ𞀒; ; xn--hzb.xn--ukj4430l # ࢻ.ⴃ𞀒 -B; \u08BB.Ⴃ𞀒; [P1 V6]; [P1 V6] # ࢻ.Ⴃ𞀒 -B; xn--hzb.xn--bnd2938u; [V6]; [V6] # ࢻ.Ⴃ𞀒 -B; xn--hzb.xn--0ug822cp045a; [B1 C1]; [B1 C1] # ࢻ.ⴃ𞀒 -B; xn--hzb.xn--bnd300f7225a; [B1 C1 V6]; [B1 C1 V6] # ࢻ.Ⴃ𞀒 -T; \u08BB.\u200Cⴃ𞀒; [B1 C1]; xn--hzb.xn--ukj4430l # ࢻ.ⴃ𞀒 -N; \u08BB.\u200Cⴃ𞀒; [B1 C1]; [B1 C1] # ࢻ.ⴃ𞀒 -T; \u200D\u200C。2䫷󠧷; [C1 C2 P1 V6]; [P1 V6 A4_2] # .2䫷 -N; \u200D\u200C。2䫷󠧷; [C1 C2 P1 V6]; [C1 C2 P1 V6] # .2䫷 -T; \u200D\u200C。2䫷󠧷; [C1 C2 P1 V6]; [P1 V6 A4_2] # .2䫷 -N; \u200D\u200C。2䫷󠧷; [C1 C2 P1 V6]; [C1 C2 P1 V6] # .2䫷 -B; .xn--2-me5ay1273i; [V6 A4_2]; [V6 A4_2] -B; xn--0ugb.xn--2-me5ay1273i; [C1 C2 V6]; [C1 C2 V6] # .2䫷 -B; -𞀤󜠐。򈬖; [P1 V3 V6]; [P1 V3 V6] -B; xn----rq4re4997d.xn--l707b; [V3 V6]; [V3 V6] -T; 󳛂︒\u200C㟀.\u0624⒈; [C1 P1 V6]; [P1 V6] # ︒㟀.ؤ⒈ -N; 󳛂︒\u200C㟀.\u0624⒈; [C1 P1 V6]; [C1 P1 V6] # ︒㟀.ؤ⒈ -T; 󳛂︒\u200C㟀.\u0648\u0654⒈; [C1 P1 V6]; [P1 V6] # ︒㟀.ؤ⒈ -N; 󳛂︒\u200C㟀.\u0648\u0654⒈; [C1 P1 V6]; [C1 P1 V6] # ︒㟀.ؤ⒈ -T; 󳛂。\u200C㟀.\u06241.; [B1 C1 P1 V6]; [P1 V6] # .㟀.ؤ1. -N; 󳛂。\u200C㟀.\u06241.; [B1 C1 P1 V6]; [B1 C1 P1 V6] # .㟀.ؤ1. -T; 󳛂。\u200C㟀.\u0648\u06541.; [B1 C1 P1 V6]; [P1 V6] # .㟀.ؤ1. -N; 󳛂。\u200C㟀.\u0648\u06541.; [B1 C1 P1 V6]; [B1 C1 P1 V6] # .㟀.ؤ1. -B; xn--z272f.xn--etl.xn--1-smc.; [V6]; [V6] # .㟀.ؤ1. -B; xn--z272f.xn--0ug754g.xn--1-smc.; [B1 C1 V6]; [B1 C1 V6] # .㟀.ؤ1. -B; xn--etlt457ccrq7h.xn--jgb476m; [V6]; [V6] # ︒㟀.ؤ⒈ -B; xn--0ug754gxl4ldlt0k.xn--jgb476m; [C1 V6]; [C1 V6] # ︒㟀.ؤ⒈ -T; 𑲜\u07CA𝅼。-\u200D; [B1 C2 V3 V5]; [B1 V3 V5] # 𑲜ߊ𝅼.- -N; 𑲜\u07CA𝅼。-\u200D; [B1 C2 V3 V5]; [B1 C2 V3 V5] # 𑲜ߊ𝅼.- -B; xn--lsb5482l7nre.-; [B1 V3 V5]; [B1 V3 V5] # 𑲜ߊ𝅼.- -B; xn--lsb5482l7nre.xn----ugn; [B1 C2 V3 V5]; [B1 C2 V3 V5] # 𑲜ߊ𝅼.- -T; \u200C.Ⴉ≠𐫶; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .Ⴉ≠𐫶 -N; \u200C.Ⴉ≠𐫶; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .Ⴉ≠𐫶 -T; \u200C.Ⴉ=\u0338𐫶; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .Ⴉ≠𐫶 -N; \u200C.Ⴉ=\u0338𐫶; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .Ⴉ≠𐫶 -T; \u200C.Ⴉ≠𐫶; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .Ⴉ≠𐫶 -N; \u200C.Ⴉ≠𐫶; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .Ⴉ≠𐫶 -T; \u200C.Ⴉ=\u0338𐫶; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .Ⴉ≠𐫶 -N; \u200C.Ⴉ=\u0338𐫶; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .Ⴉ≠𐫶 -T; \u200C.ⴉ=\u0338𐫶; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ⴉ≠𐫶 -N; \u200C.ⴉ=\u0338𐫶; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ⴉ≠𐫶 -T; \u200C.ⴉ≠𐫶; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ⴉ≠𐫶 -N; \u200C.ⴉ≠𐫶; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ⴉ≠𐫶 -B; .xn--1chx23bzj4p; [B5 B6 V6 A4_2]; [B5 B6 V6 A4_2] -B; xn--0ug.xn--1chx23bzj4p; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # .ⴉ≠𐫶 -B; .xn--hnd481gv73o; [B5 B6 V6 A4_2]; [B5 B6 V6 A4_2] -B; xn--0ug.xn--hnd481gv73o; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # .Ⴉ≠𐫶 -T; \u200C.ⴉ=\u0338𐫶; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ⴉ≠𐫶 -N; \u200C.ⴉ=\u0338𐫶; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ⴉ≠𐫶 -T; \u200C.ⴉ≠𐫶; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ⴉ≠𐫶 -N; \u200C.ⴉ≠𐫶; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ⴉ≠𐫶 -T; \u0750。≯ς; [B1 P1 V6]; [B1 P1 V6] # ݐ.≯ς -N; \u0750。≯ς; [B1 P1 V6]; [B1 P1 V6] # ݐ.≯ς -T; \u0750。>\u0338ς; [B1 P1 V6]; [B1 P1 V6] # ݐ.≯ς -N; \u0750。>\u0338ς; [B1 P1 V6]; [B1 P1 V6] # ݐ.≯ς -B; \u0750。>\u0338Σ; [B1 P1 V6]; [B1 P1 V6] # ݐ.≯σ -B; \u0750。≯Σ; [B1 P1 V6]; [B1 P1 V6] # ݐ.≯σ -B; \u0750。≯σ; [B1 P1 V6]; [B1 P1 V6] # ݐ.≯σ -B; \u0750。>\u0338σ; [B1 P1 V6]; [B1 P1 V6] # ݐ.≯σ -B; xn--3ob.xn--4xa718m; [B1 V6]; [B1 V6] # ݐ.≯σ -B; xn--3ob.xn--3xa918m; [B1 V6]; [B1 V6] # ݐ.≯ς -B; \u07FC𐸆.𓖏︒񊨩Ⴐ; [P1 V6]; [P1 V6] # .︒Ⴐ -B; \u07FC𐸆.𓖏。񊨩Ⴐ; [P1 V6]; [P1 V6] # ..Ⴐ -B; \u07FC𐸆.𓖏。񊨩ⴐ; [P1 V6]; [P1 V6] # ..ⴐ -B; xn--0tb8725k.xn--tu8d.xn--7kj73887a; [V6]; [V6] # ..ⴐ -B; xn--0tb8725k.xn--tu8d.xn--ond97931d; [V6]; [V6] # ..Ⴐ -B; \u07FC𐸆.𓖏︒񊨩ⴐ; [P1 V6]; [P1 V6] # .︒ⴐ -B; xn--0tb8725k.xn--7kj9008dt18a7py9c; [V6]; [V6] # .︒ⴐ -B; xn--0tb8725k.xn--ond3562jt18a7py9c; [V6]; [V6] # .︒Ⴐ -B; Ⴥ⚭󠖫⋃。𑌼; [P1 V5 V6]; [P1 V5 V6] -B; Ⴥ⚭󠖫⋃。𑌼; [P1 V5 V6]; [P1 V5 V6] -B; ⴥ⚭󠖫⋃。𑌼; [P1 V5 V6]; [P1 V5 V6] -B; xn--vfh16m67gx1162b.xn--ro1d; [V5 V6]; [V5 V6] -B; xn--9nd623g4zc5z060c.xn--ro1d; [V5 V6]; [V5 V6] -B; ⴥ⚭󠖫⋃。𑌼; [P1 V5 V6]; [P1 V5 V6] -B; 🄈。󠷳\u0844; [B1 P1 V6]; [B1 P1 V6] # 🄈.ࡄ -B; 7,。󠷳\u0844; [B1 P1 V6]; [B1 P1 V6] # 7,.ࡄ -B; 7,.xn--2vb13094p; [B1 P1 V6]; [B1 P1 V6] # 7,.ࡄ -B; xn--107h.xn--2vb13094p; [B1 V6]; [B1 V6] # 🄈.ࡄ -T; ≮\u0846。섖쮖ß; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ß -N; ≮\u0846。섖쮖ß; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ß -T; <\u0338\u0846。섖쮖ß; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ß -N; <\u0338\u0846。섖쮖ß; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ß -B; <\u0338\u0846。섖쮖SS; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ss -B; ≮\u0846。섖쮖SS; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ss -B; ≮\u0846。섖쮖ss; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ss -B; <\u0338\u0846。섖쮖ss; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ss -B; <\u0338\u0846。섖쮖Ss; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ss -B; ≮\u0846。섖쮖Ss; [B1 P1 V6]; [B1 P1 V6] # ≮ࡆ.섖쮖ss -B; xn--4vb505k.xn--ss-5z4j006a; [B1 V6]; [B1 V6] # ≮ࡆ.섖쮖ss -B; xn--4vb505k.xn--zca7259goug; [B1 V6]; [B1 V6] # ≮ࡆ.섖쮖ß -B; 󠆓⛏-。ꡒ; [V3]; [V3] -B; xn----o9p.xn--rc9a; [V3]; [V3] -T; \u07BB𐹳\u0626𑁆。\u08A7\u06B0\u200Cᢒ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐹳ئ𑁆.ࢧڰᢒ -N; \u07BB𐹳\u0626𑁆。\u08A7\u06B0\u200Cᢒ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐹳ئ𑁆.ࢧڰᢒ -T; \u07BB𐹳\u064A𑁆\u0654。\u08A7\u06B0\u200Cᢒ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐹳ئ𑁆.ࢧڰᢒ -N; \u07BB𐹳\u064A𑁆\u0654。\u08A7\u06B0\u200Cᢒ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐹳ئ𑁆.ࢧڰᢒ -B; xn--lgb32f2753cosb.xn--jkb91hlz1a; [B2 B3 V6]; [B2 B3 V6] # 𐹳ئ𑁆.ࢧڰᢒ -B; xn--lgb32f2753cosb.xn--jkb91hlz1azih; [B2 B3 V6]; [B2 B3 V6] # 𐹳ئ𑁆.ࢧڰᢒ -B; \u0816.𐨕𚚕; [B1 B2 B3 B6 P1 V5 V6]; [B1 B2 B3 B6 P1 V5 V6] # ࠖ.𐨕 -B; xn--rub.xn--tr9c248x; [B1 B2 B3 B6 V5 V6]; [B1 B2 B3 B6 V5 V6] # ࠖ.𐨕 -B; --。𽊆\u0767𐽋𞠬; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # --.ݧ𞠬 -B; --.xn--rpb6226k77pfh58p; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] # --.ݧ𞠬 -B; 򛭦𐋥𹸐.≯\u08B0\u08A6󔛣; [B1 P1 V6]; [B1 P1 V6] # 𐋥.≯ࢰࢦ -B; 򛭦𐋥𹸐.>\u0338\u08B0\u08A6󔛣; [B1 P1 V6]; [B1 P1 V6] # 𐋥.≯ࢰࢦ -B; xn--887c2298i5mv6a.xn--vybt688qm8981a; [B1 V6]; [B1 V6] # 𐋥.≯ࢰࢦ -B; 䔛󠇒򤸞𐹧.-䤷; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] -B; 䔛󠇒򤸞𐹧.-䤷; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] -B; xn--2loy662coo60e.xn----0n4a; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] -T; 𐹩.\u200D-; [B1 C2 V3]; [B1 V3] # 𐹩.- -N; 𐹩.\u200D-; [B1 C2 V3]; [B1 C2 V3] # 𐹩.- -T; 𐹩.\u200D-; [B1 C2 V3]; [B1 V3] # 𐹩.- -N; 𐹩.\u200D-; [B1 C2 V3]; [B1 C2 V3] # 𐹩.- -B; xn--ho0d.-; [B1 V3]; [B1 V3] -B; xn--ho0d.xn----tgn; [B1 C2 V3]; [B1 C2 V3] # 𐹩.- -B; 񂈦帷。≯萺\u1DC8-; [P1 V3 V6]; [P1 V3 V6] # 帷.≯萺᷈- -B; 񂈦帷。>\u0338萺\u1DC8-; [P1 V3 V6]; [P1 V3 V6] # 帷.≯萺᷈- -B; 񂈦帷。≯萺\u1DC8-; [P1 V3 V6]; [P1 V3 V6] # 帷.≯萺᷈- -B; 񂈦帷。>\u0338萺\u1DC8-; [P1 V3 V6]; [P1 V3 V6] # 帷.≯萺᷈- -B; xn--qutw175s.xn----mimu6tf67j; [V3 V6]; [V3 V6] # 帷.≯萺᷈- -T; \u200D攌\uABED。ᢖ-Ⴘ; [C2 P1 V6]; [P1 V6] # 攌꯭.ᢖ-Ⴘ -N; \u200D攌\uABED。ᢖ-Ⴘ; [C2 P1 V6]; [C2 P1 V6] # 攌꯭.ᢖ-Ⴘ -T; \u200D攌\uABED。ᢖ-ⴘ; [C2]; xn--p9ut19m.xn----mck373i # 攌꯭.ᢖ-ⴘ -N; \u200D攌\uABED。ᢖ-ⴘ; [C2]; [C2] # 攌꯭.ᢖ-ⴘ -B; xn--p9ut19m.xn----mck373i; 攌\uABED.ᢖ-ⴘ; xn--p9ut19m.xn----mck373i # 攌꯭.ᢖ-ⴘ -B; 攌\uABED.ᢖ-ⴘ; ; xn--p9ut19m.xn----mck373i # 攌꯭.ᢖ-ⴘ -B; 攌\uABED.ᢖ-Ⴘ; [P1 V6]; [P1 V6] # 攌꯭.ᢖ-Ⴘ -B; xn--p9ut19m.xn----k1g451d; [V6]; [V6] # 攌꯭.ᢖ-Ⴘ -B; xn--1ug592ykp6b.xn----mck373i; [C2]; [C2] # 攌꯭.ᢖ-ⴘ -B; xn--1ug592ykp6b.xn----k1g451d; [C2 V6]; [C2 V6] # 攌꯭.ᢖ-Ⴘ -T; \u200Cꖨ.⒗3툒۳; [C1 P1 V6]; [P1 V6] # ꖨ.⒗3툒۳ -N; \u200Cꖨ.⒗3툒۳; [C1 P1 V6]; [C1 P1 V6] # ꖨ.⒗3툒۳ -T; \u200Cꖨ.⒗3툒۳; [C1 P1 V6]; [P1 V6] # ꖨ.⒗3툒۳ -N; \u200Cꖨ.⒗3툒۳; [C1 P1 V6]; [C1 P1 V6] # ꖨ.⒗3툒۳ -T; \u200Cꖨ.16.3툒۳; [C1]; xn--9r8a.16.xn--3-nyc0117m # ꖨ.16.3툒۳ -N; \u200Cꖨ.16.3툒۳; [C1]; [C1] # ꖨ.16.3툒۳ -T; \u200Cꖨ.16.3툒۳; [C1]; xn--9r8a.16.xn--3-nyc0117m # ꖨ.16.3툒۳ -N; \u200Cꖨ.16.3툒۳; [C1]; [C1] # ꖨ.16.3툒۳ -B; xn--9r8a.16.xn--3-nyc0117m; ꖨ.16.3툒۳; xn--9r8a.16.xn--3-nyc0117m -B; ꖨ.16.3툒۳; ; xn--9r8a.16.xn--3-nyc0117m -B; ꖨ.16.3툒۳; ꖨ.16.3툒۳; xn--9r8a.16.xn--3-nyc0117m -B; xn--0ug2473c.16.xn--3-nyc0117m; [C1]; [C1] # ꖨ.16.3툒۳ -B; xn--9r8a.xn--3-nyc678tu07m; [V6]; [V6] -B; xn--0ug2473c.xn--3-nyc678tu07m; [C1 V6]; [C1 V6] # ꖨ.⒗3툒۳ -B; ⒈걾6.𐱁\u06D0; [B1 P1 V6]; [B1 P1 V6] # ⒈걾6.𐱁ې -B; ⒈걾6.𐱁\u06D0; [B1 P1 V6]; [B1 P1 V6] # ⒈걾6.𐱁ې -B; 1.걾6.𐱁\u06D0; [B1]; [B1] # 1.걾6.𐱁ې -B; 1.걾6.𐱁\u06D0; [B1]; [B1] # 1.걾6.𐱁ې -B; 1.xn--6-945e.xn--glb1794k; [B1]; [B1] # 1.걾6.𐱁ې -B; xn--6-dcps419c.xn--glb1794k; [B1 V6]; [B1 V6] # ⒈걾6.𐱁ې -B; 𐲞𝟶≮≮.󠀧\u0639; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 𐳞0≮≮.ع -B; 𐲞𝟶<\u0338<\u0338.󠀧\u0639; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 𐳞0≮≮.ع -B; 𐲞0≮≮.󠀧\u0639; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 𐳞0≮≮.ع -B; 𐲞0<\u0338<\u0338.󠀧\u0639; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 𐳞0≮≮.ع -B; 𐳞0<\u0338<\u0338.󠀧\u0639; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 𐳞0≮≮.ع -B; 𐳞0≮≮.󠀧\u0639; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 𐳞0≮≮.ع -B; xn--0-ngoa5711v.xn--4gb31034p; [B1 B3 V6]; [B1 B3 V6] # 𐳞0≮≮.ع -B; 𐳞𝟶<\u0338<\u0338.󠀧\u0639; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 𐳞0≮≮.ع -B; 𐳞𝟶≮≮.󠀧\u0639; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 𐳞0≮≮.ع -B; \u0AE3.𐹺\u115F; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ૣ.𐹺 -B; xn--8fc.xn--osd3070k; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # ૣ.𐹺 -T; 𝟏𝨙⸖.\u200D; [C2]; xn--1-5bt6845n. # 1𝨙⸖. -N; 𝟏𝨙⸖.\u200D; [C2]; [C2] # 1𝨙⸖. -T; 1𝨙⸖.\u200D; [C2]; xn--1-5bt6845n. # 1𝨙⸖. -N; 1𝨙⸖.\u200D; [C2]; [C2] # 1𝨙⸖. -B; xn--1-5bt6845n.; 1𝨙⸖.; xn--1-5bt6845n.; NV8 -B; 1𝨙⸖.; ; xn--1-5bt6845n.; NV8 -B; xn--1-5bt6845n.xn--1ug; [C2]; [C2] # 1𝨙⸖. -T; 𞤐≠\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -N; 𞤐≠\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -T; 𞤐=\u0338\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -N; 𞤐=\u0338\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -T; 𞤐≠\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -N; 𞤐≠\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -T; 𞤐=\u0338\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -N; 𞤐=\u0338\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -T; 𞤲=\u0338\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -N; 𞤲=\u0338\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -T; 𞤲≠\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -N; 𞤲≠\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -B; xn--wnb859grzfzw60c.xn----kcd; [B1 V3 V6]; [B1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -B; xn--wnb859grzfzw60c.xn----kcd017p; [B1 C1 V3 V6]; [B1 C1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -T; 𞤲=\u0338\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -N; 𞤲=\u0338\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -T; 𞤲≠\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -N; 𞤲≠\u0726\u1A60。-\u200C\u07D5; [B1 C1 P1 V3 V6]; [B1 C1 P1 V3 V6] # 𞤲≠ܦ᩠.-ߕ -B; 𐹰\u0368-ꡧ。\u0675; [B1]; [B1] # 𐹰ͨ-ꡧ.اٴ -B; 𐹰\u0368-ꡧ。\u0627\u0674; [B1]; [B1] # 𐹰ͨ-ꡧ.اٴ -B; xn----shb2387jgkqd.xn--mgb8m; [B1]; [B1] # 𐹰ͨ-ꡧ.اٴ -B; F󠅟。򏗅♚; [P1 V6]; [P1 V6] -B; F󠅟。򏗅♚; [P1 V6]; [P1 V6] -B; f󠅟。򏗅♚; [P1 V6]; [P1 V6] -B; f.xn--45hz6953f; [V6]; [V6] -B; f󠅟。򏗅♚; [P1 V6]; [P1 V6] -B; \u0B4D𑄴\u1DE9。𝟮Ⴘ𞀨񃥇; [P1 V5 V6]; [P1 V5 V6] # ୍𑄴ᷩ.2Ⴘ𞀨 -B; \u0B4D𑄴\u1DE9。2Ⴘ𞀨񃥇; [P1 V5 V6]; [P1 V5 V6] # ୍𑄴ᷩ.2Ⴘ𞀨 -B; \u0B4D𑄴\u1DE9。2ⴘ𞀨񃥇; [P1 V5 V6]; [P1 V5 V6] # ୍𑄴ᷩ.2ⴘ𞀨 -B; xn--9ic246gs21p.xn--2-nws2918ndrjr; [V5 V6]; [V5 V6] # ୍𑄴ᷩ.2ⴘ𞀨 -B; xn--9ic246gs21p.xn--2-k1g43076adrwq; [V5 V6]; [V5 V6] # ୍𑄴ᷩ.2Ⴘ𞀨 -B; \u0B4D𑄴\u1DE9。𝟮ⴘ𞀨񃥇; [P1 V5 V6]; [P1 V5 V6] # ୍𑄴ᷩ.2ⴘ𞀨 -T; 򓠭\u200C\u200C⒈。勉𑁅; [C1 P1 V6]; [P1 V6] # ⒈.勉𑁅 -N; 򓠭\u200C\u200C⒈。勉𑁅; [C1 P1 V6]; [C1 P1 V6] # ⒈.勉𑁅 -T; 򓠭\u200C\u200C1.。勉𑁅; [C1 P1 V6 A4_2]; [P1 V6 A4_2] # 1..勉𑁅 -N; 򓠭\u200C\u200C1.。勉𑁅; [C1 P1 V6 A4_2]; [C1 P1 V6 A4_2] # 1..勉𑁅 -B; xn--1-yi00h..xn--4grs325b; [V6 A4_2]; [V6 A4_2] -B; xn--1-rgna61159u..xn--4grs325b; [C1 V6 A4_2]; [C1 V6 A4_2] # 1..勉𑁅 -B; xn--tsh11906f.xn--4grs325b; [V6]; [V6] -B; xn--0uga855aez302a.xn--4grs325b; [C1 V6]; [C1 V6] # ⒈.勉𑁅 -B; ᡃ.玿񫈜󕞐; [P1 V6]; [P1 V6] -B; xn--27e.xn--7cy81125a0yq4a; [V6]; [V6] -T; \u200C\u200C。⒈≯𝟵; [C1 P1 V6]; [P1 V6 A4_2] # .⒈≯9 -N; \u200C\u200C。⒈≯𝟵; [C1 P1 V6]; [C1 P1 V6] # .⒈≯9 -T; \u200C\u200C。⒈>\u0338𝟵; [C1 P1 V6]; [P1 V6 A4_2] # .⒈≯9 -N; \u200C\u200C。⒈>\u0338𝟵; [C1 P1 V6]; [C1 P1 V6] # .⒈≯9 -T; \u200C\u200C。1.≯9; [C1 P1 V6]; [P1 V6 A4_2] # .1.≯9 -N; \u200C\u200C。1.≯9; [C1 P1 V6]; [C1 P1 V6] # .1.≯9 -T; \u200C\u200C。1.>\u03389; [C1 P1 V6]; [P1 V6 A4_2] # .1.≯9 -N; \u200C\u200C。1.>\u03389; [C1 P1 V6]; [C1 P1 V6] # .1.≯9 -B; .1.xn--9-ogo; [V6 A4_2]; [V6 A4_2] -B; xn--0uga.1.xn--9-ogo; [C1 V6]; [C1 V6] # .1.≯9 -B; .xn--9-ogo37g; [V6 A4_2]; [V6 A4_2] -B; xn--0uga.xn--9-ogo37g; [C1 V6]; [C1 V6] # .⒈≯9 -B; \u115F\u1DE0򐀁.𺻆≯𐮁; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ᷠ.≯𐮁 -B; \u115F\u1DE0򐀁.𺻆>\u0338𐮁; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ᷠ.≯𐮁 -B; xn--osd615d5659o.xn--hdh5192gkm6r; [B5 B6 V6]; [B5 B6 V6] # ᷠ.≯𐮁 -T; 󠄫𝩤\u200D\u063E.𝩩-\u081E󑼩; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # 𝩤ؾ.𝩩-ࠞ -N; 󠄫𝩤\u200D\u063E.𝩩-\u081E󑼩; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # 𝩤ؾ.𝩩-ࠞ -B; xn--9gb5080v.xn----qgd52296avol4f; [B1 V5 V6]; [B1 V5 V6] # 𝩤ؾ.𝩩-ࠞ -B; xn--9gb723kg862a.xn----qgd52296avol4f; [B1 C2 V5 V6]; [B1 C2 V5 V6] # 𝩤ؾ.𝩩-ࠞ -B; \u20DA.𑘿-; [V3 V5]; [V3 V5] # ⃚.𑘿- -B; \u20DA.𑘿-; [V3 V5]; [V3 V5] # ⃚.𑘿- -B; xn--w0g.xn----bd0j; [V3 V5]; [V3 V5] # ⃚.𑘿- -T; 䮸ß.󠵟󠭎紙\u08A8; [B1 P1 V6]; [B1 P1 V6] # 䮸ß.紙ࢨ -N; 䮸ß.󠵟󠭎紙\u08A8; [B1 P1 V6]; [B1 P1 V6] # 䮸ß.紙ࢨ -B; 䮸SS.󠵟󠭎紙\u08A8; [B1 P1 V6]; [B1 P1 V6] # 䮸ss.紙ࢨ -B; 䮸ss.󠵟󠭎紙\u08A8; [B1 P1 V6]; [B1 P1 V6] # 䮸ss.紙ࢨ -B; 䮸Ss.󠵟󠭎紙\u08A8; [B1 P1 V6]; [B1 P1 V6] # 䮸ss.紙ࢨ -B; xn--ss-sf1c.xn--xyb1370div70kpzba; [B1 V6]; [B1 V6] # 䮸ss.紙ࢨ -B; xn--zca5349a.xn--xyb1370div70kpzba; [B1 V6]; [B1 V6] # 䮸ß.紙ࢨ -B; -Ⴞ.-𝩨⅔𐦕; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; -Ⴞ.-𝩨2⁄3𐦕; [B1 P1 V3 V6]; [B1 P1 V3 V6] -B; -ⴞ.-𝩨2⁄3𐦕; [B1 V3]; [B1 V3] -B; xn----zws.xn---23-pt0a0433lk3jj; [B1 V3]; [B1 V3] -B; xn----w1g.xn---23-pt0a0433lk3jj; [B1 V3 V6]; [B1 V3 V6] -B; -ⴞ.-𝩨⅔𐦕; [B1 V3]; [B1 V3] -B; 󧈯𐹯\u0AC2。򖢨𐮁񇼖ᡂ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 𐹯ૂ.𐮁ᡂ -B; 󧈯𐹯\u0AC2。򖢨𐮁񇼖ᡂ; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 𐹯ૂ.𐮁ᡂ -B; xn--bfc7604kv8m3g.xn--17e5565jl7zw4h16a; [B5 B6 V6]; [B5 B6 V6] # 𐹯ૂ.𐮁ᡂ -T; \u1082-\u200D\uA8EA.ꡊ\u200D񼸳; [C2 P1 V5 V6]; [P1 V5 V6] # ႂ-꣪.ꡊ -N; \u1082-\u200D\uA8EA.ꡊ\u200D񼸳; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ႂ-꣪.ꡊ -T; \u1082-\u200D\uA8EA.ꡊ\u200D񼸳; [C2 P1 V5 V6]; [P1 V5 V6] # ႂ-꣪.ꡊ -N; \u1082-\u200D\uA8EA.ꡊ\u200D񼸳; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ႂ-꣪.ꡊ -B; xn----gyg3618i.xn--jc9ao4185a; [V5 V6]; [V5 V6] # ႂ-꣪.ꡊ -B; xn----gyg250jio7k.xn--1ug8774cri56d; [C2 V5 V6]; [C2 V5 V6] # ႂ-꣪.ꡊ -B; ۱。≠\u0668; [B1 P1 V6]; [B1 P1 V6] # ۱.≠٨ -B; ۱。=\u0338\u0668; [B1 P1 V6]; [B1 P1 V6] # ۱.≠٨ -B; xn--emb.xn--hib334l; [B1 V6]; [B1 V6] # ۱.≠٨ -B; 𑈵廊.𐠍; [V5]; [V5] -B; xn--xytw701b.xn--yc9c; [V5]; [V5] -T; \u200D\u0356-.-Ⴐ\u0661; [B1 C2 P1 V3 V6]; [B1 P1 V3 V5 V6] # ͖-.-Ⴐ١ -N; \u200D\u0356-.-Ⴐ\u0661; [B1 C2 P1 V3 V6]; [B1 C2 P1 V3 V6] # ͖-.-Ⴐ١ -T; \u200D\u0356-.-Ⴐ\u0661; [B1 C2 P1 V3 V6]; [B1 P1 V3 V5 V6] # ͖-.-Ⴐ١ -N; \u200D\u0356-.-Ⴐ\u0661; [B1 C2 P1 V3 V6]; [B1 C2 P1 V3 V6] # ͖-.-Ⴐ١ -T; \u200D\u0356-.-ⴐ\u0661; [B1 C2 V3]; [B1 V3 V5] # ͖-.-ⴐ١ -N; \u200D\u0356-.-ⴐ\u0661; [B1 C2 V3]; [B1 C2 V3] # ͖-.-ⴐ١ -B; xn----rgb.xn----bqc2280a; [B1 V3 V5]; [B1 V3 V5] # ͖-.-ⴐ١ -B; xn----rgb661t.xn----bqc2280a; [B1 C2 V3]; [B1 C2 V3] # ͖-.-ⴐ١ -B; xn----rgb.xn----bqc030f; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ͖-.-Ⴐ١ -B; xn----rgb661t.xn----bqc030f; [B1 C2 V3 V6]; [B1 C2 V3 V6] # ͖-.-Ⴐ١ -T; \u200D\u0356-.-ⴐ\u0661; [B1 C2 V3]; [B1 V3 V5] # ͖-.-ⴐ١ -N; \u200D\u0356-.-ⴐ\u0661; [B1 C2 V3]; [B1 C2 V3] # ͖-.-ⴐ١ -B; \u063A\u0661挏󾯐.-; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # غ١挏.- -B; xn--5gb2f4205aqi47p.-; [B1 B2 B3 V3 V6]; [B1 B2 B3 V3 V6] # غ١挏.- -B; \u06EF。𐹧𞤽; [B1]; [B1] # ۯ.𐹧𞤽 -B; \u06EF。𐹧𞤽; [B1]; [B1] # ۯ.𐹧𞤽 -B; \u06EF。𐹧𞤛; [B1]; [B1] # ۯ.𐹧𞤽 -B; xn--cmb.xn--fo0dy848a; [B1]; [B1] # ۯ.𐹧𞤽 -B; \u06EF。𐹧𞤛; [B1]; [B1] # ۯ.𐹧𞤽 -B; Ⴞ𶛀𛗻.ᢗ릫; [P1 V6]; [P1 V6] -B; Ⴞ𶛀𛗻.ᢗ릫; [P1 V6]; [P1 V6] -B; Ⴞ𶛀𛗻.ᢗ릫; [P1 V6]; [P1 V6] -B; Ⴞ𶛀𛗻.ᢗ릫; [P1 V6]; [P1 V6] -B; ⴞ𶛀𛗻.ᢗ릫; [P1 V6]; [P1 V6] -B; ⴞ𶛀𛗻.ᢗ릫; [P1 V6]; [P1 V6] -B; xn--mlj0486jgl2j.xn--hbf6853f; [V6]; [V6] -B; xn--2nd8876sgl2j.xn--hbf6853f; [V6]; [V6] -B; ⴞ𶛀𛗻.ᢗ릫; [P1 V6]; [P1 V6] -B; ⴞ𶛀𛗻.ᢗ릫; [P1 V6]; [P1 V6] -T; 󠎃󗭞\u06B7𐹷。≯\u200C\u1DFE; [B1 C1 P1 V6]; [B1 P1 V6] # ڷ𐹷.≯᷾ -N; 󠎃󗭞\u06B7𐹷。≯\u200C\u1DFE; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ڷ𐹷.≯᷾ -T; 󠎃󗭞\u06B7𐹷。>\u0338\u200C\u1DFE; [B1 C1 P1 V6]; [B1 P1 V6] # ڷ𐹷.≯᷾ -N; 󠎃󗭞\u06B7𐹷。>\u0338\u200C\u1DFE; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ڷ𐹷.≯᷾ -T; 󠎃󗭞\u06B7𐹷。≯\u200C\u1DFE; [B1 C1 P1 V6]; [B1 P1 V6] # ڷ𐹷.≯᷾ -N; 󠎃󗭞\u06B7𐹷。≯\u200C\u1DFE; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ڷ𐹷.≯᷾ -T; 󠎃󗭞\u06B7𐹷。>\u0338\u200C\u1DFE; [B1 C1 P1 V6]; [B1 P1 V6] # ڷ𐹷.≯᷾ -N; 󠎃󗭞\u06B7𐹷。>\u0338\u200C\u1DFE; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ڷ𐹷.≯᷾ -B; xn--qkb4516kbi06fg2id.xn--zfg31q; [B1 V6]; [B1 V6] # ڷ𐹷.≯᷾ -B; xn--qkb4516kbi06fg2id.xn--zfg59fm0c; [B1 C1 V6]; [B1 C1 V6] # ڷ𐹷.≯᷾ -T; ᛎ󠅍󠐕\u200D。𐹾𐹪𐻝-; [B1 B6 C2 P1 V3 V6]; [B1 B6 P1 V3 V6] # ᛎ.𐹾𐹪- -N; ᛎ󠅍󠐕\u200D。𐹾𐹪𐻝-; [B1 B6 C2 P1 V3 V6]; [B1 B6 C2 P1 V3 V6] # ᛎ.𐹾𐹪- -T; ᛎ󠅍󠐕\u200D。𐹾𐹪𐻝-; [B1 B6 C2 P1 V3 V6]; [B1 B6 P1 V3 V6] # ᛎ.𐹾𐹪- -N; ᛎ󠅍󠐕\u200D。𐹾𐹪𐻝-; [B1 B6 C2 P1 V3 V6]; [B1 B6 C2 P1 V3 V6] # ᛎ.𐹾𐹪- -B; xn--fxe63563p.xn----q26i2bvu; [B1 B6 V3 V6]; [B1 B6 V3 V6] -B; xn--fxe848bq3411a.xn----q26i2bvu; [B1 B6 C2 V3 V6]; [B1 B6 C2 V3 V6] # ᛎ.𐹾𐹪- -B; 𐹶.𐫂; [B1]; [B1] -B; xn--uo0d.xn--rw9c; [B1]; [B1] -T; ß\u200D\u103A。⒈; [C2 P1 V6]; [P1 V6] # ß်.⒈ -N; ß\u200D\u103A。⒈; [C2 P1 V6]; [C2 P1 V6] # ß်.⒈ -T; ß\u200D\u103A。1.; [C2]; xn--ss-f4j.1. # ß်.1. -N; ß\u200D\u103A。1.; [C2]; [C2] # ß်.1. -T; SS\u200D\u103A。1.; [C2]; xn--ss-f4j.1. # ss်.1. -N; SS\u200D\u103A。1.; [C2]; [C2] # ss်.1. -T; ss\u200D\u103A。1.; [C2]; xn--ss-f4j.1. # ss်.1. -N; ss\u200D\u103A。1.; [C2]; [C2] # ss်.1. -T; Ss\u200D\u103A。1.; [C2]; xn--ss-f4j.1. # ss်.1. -N; Ss\u200D\u103A。1.; [C2]; [C2] # ss်.1. -B; xn--ss-f4j.1.; ss\u103A.1.; xn--ss-f4j.1. # ss်.1. -B; ss\u103A.1.; ; xn--ss-f4j.1. # ss်.1. -B; SS\u103A.1.; ss\u103A.1.; xn--ss-f4j.1. # ss်.1. -B; Ss\u103A.1.; ss\u103A.1.; xn--ss-f4j.1. # ss်.1. -B; xn--ss-f4j585j.1.; [C2]; [C2] # ss်.1. -B; xn--zca679eh2l.1.; [C2]; [C2] # ß်.1. -T; SS\u200D\u103A。⒈; [C2 P1 V6]; [P1 V6] # ss်.⒈ -N; SS\u200D\u103A。⒈; [C2 P1 V6]; [C2 P1 V6] # ss်.⒈ -T; ss\u200D\u103A。⒈; [C2 P1 V6]; [P1 V6] # ss်.⒈ -N; ss\u200D\u103A。⒈; [C2 P1 V6]; [C2 P1 V6] # ss်.⒈ -T; Ss\u200D\u103A。⒈; [C2 P1 V6]; [P1 V6] # ss်.⒈ -N; Ss\u200D\u103A。⒈; [C2 P1 V6]; [C2 P1 V6] # ss်.⒈ -B; xn--ss-f4j.xn--tsh; [V6]; [V6] # ss်.⒈ -B; xn--ss-f4j585j.xn--tsh; [C2 V6]; [C2 V6] # ss်.⒈ -B; xn--zca679eh2l.xn--tsh; [C2 V6]; [C2 V6] # ß်.⒈ -T; \u0B4D\u200C𙶵𞻘。\u200D; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ୍. -N; \u0B4D\u200C𙶵𞻘。\u200D; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ୍. -B; xn--9ic6417rn4xb.; [B1 V5 V6]; [B1 V5 V6] # ୍. -B; xn--9ic637hz82z32jc.xn--1ug; [B1 C2 V5 V6]; [B1 C2 V5 V6] # ୍. -B; 𐮅。\u06BC🁕; [B3]; [B3] # 𐮅.ڼ🁕 -B; 𐮅。\u06BC🁕; [B3]; [B3] # 𐮅.ڼ🁕 -B; xn--c29c.xn--vkb8871w; [B3]; [B3] # 𐮅.ڼ🁕 -T; \u0620\u17D2。𐫔󠀧\u200C𑈵; [B2 B3 C1 P1 V6]; [B2 B3 P1 V6] # ؠ្.𐫔𑈵 -N; \u0620\u17D2。𐫔󠀧\u200C𑈵; [B2 B3 C1 P1 V6]; [B2 B3 C1 P1 V6] # ؠ្.𐫔𑈵 -B; xn--fgb471g.xn--9w9c29jw3931a; [B2 B3 V6]; [B2 B3 V6] # ؠ្.𐫔𑈵 -B; xn--fgb471g.xn--0ug9853g7verp838a; [B2 B3 C1 V6]; [B2 B3 C1 V6] # ؠ្.𐫔𑈵 -B; 񋉕.𞣕𞤊; [B1 P1 V5 V6]; [B1 P1 V5 V6] -B; 񋉕.𞣕𞤬; [B1 P1 V5 V6]; [B1 P1 V5 V6] -B; xn--tf5w.xn--2b6hof; [B1 V5 V6]; [B1 V5 V6] -T; \u06CC𐨿.ß\u0F84𑍬; \u06CC𐨿.ß\u0F84𑍬; xn--clb2593k.xn--ss-toj6092t # ی𐨿.ß྄𑍬 -N; \u06CC𐨿.ß\u0F84𑍬; \u06CC𐨿.ß\u0F84𑍬; xn--clb2593k.xn--zca216edt0r # ی𐨿.ß྄𑍬 -T; \u06CC𐨿.ß\u0F84𑍬; ; xn--clb2593k.xn--ss-toj6092t # ی𐨿.ß྄𑍬 -N; \u06CC𐨿.ß\u0F84𑍬; ; xn--clb2593k.xn--zca216edt0r # ی𐨿.ß྄𑍬 -B; \u06CC𐨿.SS\u0F84𑍬; \u06CC𐨿.ss\u0F84𑍬; xn--clb2593k.xn--ss-toj6092t # ی𐨿.ss྄𑍬 -B; \u06CC𐨿.ss\u0F84𑍬; ; xn--clb2593k.xn--ss-toj6092t # ی𐨿.ss྄𑍬 -B; \u06CC𐨿.Ss\u0F84𑍬; \u06CC𐨿.ss\u0F84𑍬; xn--clb2593k.xn--ss-toj6092t # ی𐨿.ss྄𑍬 -B; xn--clb2593k.xn--ss-toj6092t; \u06CC𐨿.ss\u0F84𑍬; xn--clb2593k.xn--ss-toj6092t # ی𐨿.ss྄𑍬 -B; xn--clb2593k.xn--zca216edt0r; \u06CC𐨿.ß\u0F84𑍬; xn--clb2593k.xn--zca216edt0r # ی𐨿.ß྄𑍬 -B; \u06CC𐨿.SS\u0F84𑍬; \u06CC𐨿.ss\u0F84𑍬; xn--clb2593k.xn--ss-toj6092t # ی𐨿.ss྄𑍬 -B; \u06CC𐨿.ss\u0F84𑍬; \u06CC𐨿.ss\u0F84𑍬; xn--clb2593k.xn--ss-toj6092t # ی𐨿.ss྄𑍬 -B; \u06CC𐨿.Ss\u0F84𑍬; \u06CC𐨿.ss\u0F84𑍬; xn--clb2593k.xn--ss-toj6092t # ی𐨿.ss྄𑍬 -T; 𝟠≮\u200C。󠅱\u17B4; [C1 P1 V5 V6]; [P1 V5 V6] # 8≮. -N; 𝟠≮\u200C。󠅱\u17B4; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 8≮. -T; 𝟠<\u0338\u200C。󠅱\u17B4; [C1 P1 V5 V6]; [P1 V5 V6] # 8≮. -N; 𝟠<\u0338\u200C。󠅱\u17B4; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 8≮. -T; 8≮\u200C。󠅱\u17B4; [C1 P1 V5 V6]; [P1 V5 V6] # 8≮. -N; 8≮\u200C。󠅱\u17B4; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 8≮. -T; 8<\u0338\u200C。󠅱\u17B4; [C1 P1 V5 V6]; [P1 V5 V6] # 8≮. -N; 8<\u0338\u200C。󠅱\u17B4; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 8≮. -B; xn--8-ngo.xn--z3e; [V5 V6]; [V5 V6] # 8≮. -B; xn--8-sgn10i.xn--z3e; [C1 V5 V6]; [C1 V5 V6] # 8≮. -B; ᢕ≯︒񄂯.Ⴀ; [P1 V6]; [P1 V6] -B; ᢕ>\u0338︒񄂯.Ⴀ; [P1 V6]; [P1 V6] -B; ᢕ≯。񄂯.Ⴀ; [P1 V6]; [P1 V6] -B; ᢕ>\u0338。񄂯.Ⴀ; [P1 V6]; [P1 V6] -B; ᢕ>\u0338。񄂯.ⴀ; [P1 V6]; [P1 V6] -B; ᢕ≯。񄂯.ⴀ; [P1 V6]; [P1 V6] -B; xn--fbf851c.xn--ko1u.xn--rkj; [V6]; [V6] -B; xn--fbf851c.xn--ko1u.xn--7md; [V6]; [V6] -B; ᢕ>\u0338︒񄂯.ⴀ; [P1 V6]; [P1 V6] -B; ᢕ≯︒񄂯.ⴀ; [P1 V6]; [P1 V6] -B; xn--fbf851cq98poxw1a.xn--rkj; [V6]; [V6] -B; xn--fbf851cq98poxw1a.xn--7md; [V6]; [V6] -B; \u0F9F.-\u082A; [V3 V5]; [V3 V5] # ྟ.-ࠪ -B; \u0F9F.-\u082A; [V3 V5]; [V3 V5] # ྟ.-ࠪ -B; xn--vfd.xn----fhd; [V3 V5]; [V3 V5] # ྟ.-ࠪ -B; ᵬ󠆠.핒⒒⒈􈄦; [P1 V6]; [P1 V6] -B; ᵬ󠆠.핒⒒⒈􈄦; [P1 V6]; [P1 V6] -B; ᵬ󠆠.핒11.1.􈄦; [P1 V6]; [P1 V6] -B; ᵬ󠆠.핒11.1.􈄦; [P1 V6]; [P1 V6] -B; xn--tbg.xn--11-5o7k.1.xn--k469f; [V6]; [V6] -B; xn--tbg.xn--tsht7586kyts9l; [V6]; [V6] -T; ς𑓂𐋢.\u0668; [B1]; [B1] # ς𑓂𐋢.٨ -N; ς𑓂𐋢.\u0668; [B1]; [B1] # ς𑓂𐋢.٨ -T; ς𑓂𐋢.\u0668; [B1]; [B1] # ς𑓂𐋢.٨ -N; ς𑓂𐋢.\u0668; [B1]; [B1] # ς𑓂𐋢.٨ -B; Σ𑓂𐋢.\u0668; [B1]; [B1] # σ𑓂𐋢.٨ -B; σ𑓂𐋢.\u0668; [B1]; [B1] # σ𑓂𐋢.٨ -B; xn--4xa6371khhl.xn--hib; [B1]; [B1] # σ𑓂𐋢.٨ -B; xn--3xa8371khhl.xn--hib; [B1]; [B1] # ς𑓂𐋢.٨ -B; Σ𑓂𐋢.\u0668; [B1]; [B1] # σ𑓂𐋢.٨ -B; σ𑓂𐋢.\u0668; [B1]; [B1] # σ𑓂𐋢.٨ -T; \uA953\u200C𐋻\u200D.\u2DF8𞿄𐹲; [B1 B6 C2 P1 V5 V6]; [B1 P1 V5 V6] # ꥓𐋻.ⷸ𐹲 -N; \uA953\u200C𐋻\u200D.\u2DF8𞿄𐹲; [B1 B6 C2 P1 V5 V6]; [B1 B6 C2 P1 V5 V6] # ꥓𐋻.ⷸ𐹲 -B; xn--3j9a531o.xn--urju692efj0f; [B1 V5 V6]; [B1 V5 V6] # ꥓𐋻.ⷸ𐹲 -B; xn--0ugc8356he76c.xn--urju692efj0f; [B1 B6 C2 V5 V6]; [B1 B6 C2 V5 V6] # ꥓𐋻.ⷸ𐹲 -B; ⊼。񪧖\u0695; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ⊼.ڕ -B; xn--ofh.xn--rjb13118f; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ⊼.ڕ -B; 𐯬񖋔。󜳥; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; xn--949co370q.xn--7g25e; [B2 B3 V6]; [B2 B3 V6] -T; \u0601𑍧\u07DD。ς򬍘🀞\u17B5; [B1 B6 P1 V6]; [B1 B6 P1 V6] # 𑍧ߝ.ς🀞 -N; \u0601𑍧\u07DD。ς򬍘🀞\u17B5; [B1 B6 P1 V6]; [B1 B6 P1 V6] # 𑍧ߝ.ς🀞 -B; \u0601𑍧\u07DD。Σ򬍘🀞\u17B5; [B1 B6 P1 V6]; [B1 B6 P1 V6] # 𑍧ߝ.σ🀞 -B; \u0601𑍧\u07DD。σ򬍘🀞\u17B5; [B1 B6 P1 V6]; [B1 B6 P1 V6] # 𑍧ߝ.σ🀞 -B; xn--jfb66gt010c.xn--4xa623h9p95ars26d; [B1 B6 V6]; [B1 B6 V6] # 𑍧ߝ.σ🀞 -B; xn--jfb66gt010c.xn--3xa823h9p95ars26d; [B1 B6 V6]; [B1 B6 V6] # 𑍧ߝ.ς🀞 -B; -𐳲\u0646󠺐。\uABED𝟥; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -𐳲ن.꯭3 -B; -𐳲\u0646󠺐。\uABED3; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -𐳲ن.꯭3 -B; -𐲲\u0646󠺐。\uABED3; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -𐳲ن.꯭3 -B; xn----roc5482rek10i.xn--3-zw5e; [B1 V3 V5 V6]; [B1 V3 V5 V6] # -𐳲ن.꯭3 -B; -𐲲\u0646󠺐。\uABED𝟥; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # -𐳲ن.꯭3 -T; \u200C󠴦。񲨕≮𐦜; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # .≮𐦜 -N; \u200C󠴦。񲨕≮𐦜; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .≮𐦜 -T; \u200C󠴦。񲨕<\u0338𐦜; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # .≮𐦜 -N; \u200C󠴦。񲨕<\u0338𐦜; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .≮𐦜 -T; \u200C󠴦。񲨕≮𐦜; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # .≮𐦜 -N; \u200C󠴦。񲨕≮𐦜; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .≮𐦜 -T; \u200C󠴦。񲨕<\u0338𐦜; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 P1 V6] # .≮𐦜 -N; \u200C󠴦。񲨕<\u0338𐦜; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .≮𐦜 -B; xn--6v56e.xn--gdhz712gzlr6b; [B1 B5 B6 V6]; [B1 B5 B6 V6] -B; xn--0ug22251l.xn--gdhz712gzlr6b; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # .≮𐦜 -B; ⒈✌򟬟.𝟡񠱣; [P1 V6]; [P1 V6] -B; 1.✌򟬟.9񠱣; [P1 V6]; [P1 V6] -B; 1.xn--7bi44996f.xn--9-o706d; [V6]; [V6] -B; xn--tsh24g49550b.xn--9-o706d; [V6]; [V6] -B; 𑆾𞤬𐮆.\u0666\u1DD4; [B1 V5]; [B1 V5] # 𑆾𞤬𐮆.٦ᷔ -B; 𑆾𞤊𐮆.\u0666\u1DD4; [B1 V5]; [B1 V5] # 𑆾𞤬𐮆.٦ᷔ -B; xn--d29c79hf98r.xn--fib011j; [B1 V5]; [B1 V5] # 𑆾𞤬𐮆.٦ᷔ -T; ς.\uA9C0\uA8C4; [V5]; [V5] # ς.꧀꣄ -N; ς.\uA9C0\uA8C4; [V5]; [V5] # ς.꧀꣄ -T; ς.\uA9C0\uA8C4; [V5]; [V5] # ς.꧀꣄ -N; ς.\uA9C0\uA8C4; [V5]; [V5] # ς.꧀꣄ -B; Σ.\uA9C0\uA8C4; [V5]; [V5] # σ.꧀꣄ -B; σ.\uA9C0\uA8C4; [V5]; [V5] # σ.꧀꣄ -B; xn--4xa.xn--0f9ars; [V5]; [V5] # σ.꧀꣄ -B; xn--3xa.xn--0f9ars; [V5]; [V5] # ς.꧀꣄ -B; Σ.\uA9C0\uA8C4; [V5]; [V5] # σ.꧀꣄ -B; σ.\uA9C0\uA8C4; [V5]; [V5] # σ.꧀꣄ -T; 𑰶\u200C≯𐳐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑰶≯𐳐.࡛ -N; 𑰶\u200C≯𐳐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 C1 P1 V5 V6] # 𑰶≯𐳐.࡛ -T; 𑰶\u200C>\u0338𐳐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑰶≯𐳐.࡛ -N; 𑰶\u200C>\u0338𐳐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 C1 P1 V5 V6] # 𑰶≯𐳐.࡛ -T; 𑰶\u200C≯𐳐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑰶≯𐳐.࡛ -N; 𑰶\u200C≯𐳐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 C1 P1 V5 V6] # 𑰶≯𐳐.࡛ -T; 𑰶\u200C>\u0338𐳐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑰶≯𐳐.࡛ -N; 𑰶\u200C>\u0338𐳐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 C1 P1 V5 V6] # 𑰶≯𐳐.࡛ -T; 𑰶\u200C>\u0338𐲐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑰶≯𐳐.࡛ -N; 𑰶\u200C>\u0338𐲐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 C1 P1 V5 V6] # 𑰶≯𐳐.࡛ -T; 𑰶\u200C≯𐲐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑰶≯𐳐.࡛ -N; 𑰶\u200C≯𐲐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 C1 P1 V5 V6] # 𑰶≯𐳐.࡛ -B; xn--hdhz343g3wj.xn--qwb; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # 𑰶≯𐳐.࡛ -B; xn--0ug06g7697ap4ma.xn--qwb; [B1 B3 B6 C1 V5 V6]; [B1 B3 B6 C1 V5 V6] # 𑰶≯𐳐.࡛ -T; 𑰶\u200C>\u0338𐲐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑰶≯𐳐.࡛ -N; 𑰶\u200C>\u0338𐲐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 C1 P1 V5 V6] # 𑰶≯𐳐.࡛ -T; 𑰶\u200C≯𐲐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𑰶≯𐳐.࡛ -N; 𑰶\u200C≯𐲐.\u085B; [B1 B3 B6 C1 P1 V5 V6]; [B1 B3 B6 C1 P1 V5 V6] # 𑰶≯𐳐.࡛ -B; 羚。≯; [P1 V6]; [P1 V6] -B; 羚。>\u0338; [P1 V6]; [P1 V6] -B; 羚。≯; [P1 V6]; [P1 V6] -B; 羚。>\u0338; [P1 V6]; [P1 V6] -B; xn--xt0a.xn--hdh; [V6]; [V6] -B; 𑓂\u1759.\u08A8; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𑓂.ࢨ -B; 𑓂\u1759.\u08A8; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𑓂.ࢨ -B; xn--e1e9580k.xn--xyb; [B1 V5 V6]; [B1 V5 V6] # 𑓂.ࢨ -T; 󨣿󠇀\u200D。\u0663ҠჀ𝟑; [B1 B6 C2 P1 V6]; [B1 P1 V6] # .٣ҡჀ3 -N; 󨣿󠇀\u200D。\u0663ҠჀ𝟑; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # .٣ҡჀ3 -T; 󨣿󠇀\u200D。\u0663ҠჀ3; [B1 B6 C2 P1 V6]; [B1 P1 V6] # .٣ҡჀ3 -N; 󨣿󠇀\u200D。\u0663ҠჀ3; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # .٣ҡჀ3 -T; 󨣿󠇀\u200D。\u0663ҡⴠ3; [B1 B6 C2 P1 V6]; [B1 P1 V6] # .٣ҡⴠ3 -N; 󨣿󠇀\u200D。\u0663ҡⴠ3; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # .٣ҡⴠ3 -T; 󨣿󠇀\u200D。\u0663Ҡⴠ3; [B1 B6 C2 P1 V6]; [B1 P1 V6] # .٣ҡⴠ3 -N; 󨣿󠇀\u200D。\u0663Ҡⴠ3; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # .٣ҡⴠ3 -B; xn--1r19e.xn--3-ozb36ko13f; [B1 V6]; [B1 V6] # .٣ҡⴠ3 -B; xn--1ug89936l.xn--3-ozb36ko13f; [B1 B6 C2 V6]; [B1 B6 C2 V6] # .٣ҡⴠ3 -B; xn--1r19e.xn--3-ozb36kixu; [B1 V6]; [B1 V6] # .٣ҡჀ3 -B; xn--1ug89936l.xn--3-ozb36kixu; [B1 B6 C2 V6]; [B1 B6 C2 V6] # .٣ҡჀ3 -T; 󨣿󠇀\u200D。\u0663ҡⴠ𝟑; [B1 B6 C2 P1 V6]; [B1 P1 V6] # .٣ҡⴠ3 -N; 󨣿󠇀\u200D。\u0663ҡⴠ𝟑; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # .٣ҡⴠ3 -T; 󨣿󠇀\u200D。\u0663Ҡⴠ𝟑; [B1 B6 C2 P1 V6]; [B1 P1 V6] # .٣ҡⴠ3 -N; 󨣿󠇀\u200D。\u0663Ҡⴠ𝟑; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # .٣ҡⴠ3 -B; ᡷ。𐹢\u08E0; [B1]; [B1] # ᡷ.𐹢࣠ -B; xn--k9e.xn--j0b5005k; [B1]; [B1] # ᡷ.𐹢࣠ -T; 򕮇\u1BF3。\u0666񗜼\u17D2ß; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ß -N; 򕮇\u1BF3。\u0666񗜼\u17D2ß; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ß -T; 򕮇\u1BF3。\u0666񗜼\u17D2ß; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ß -N; 򕮇\u1BF3。\u0666񗜼\u17D2ß; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ß -B; 򕮇\u1BF3。\u0666񗜼\u17D2SS; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ss -B; 򕮇\u1BF3。\u0666񗜼\u17D2ss; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ss -B; 򕮇\u1BF3。\u0666񗜼\u17D2Ss; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ss -B; xn--1zf58212h.xn--ss-pyd459o3258m; [B1 V6]; [B1 V6] # ᯳.٦្ss -B; xn--1zf58212h.xn--zca34zk4qx711k; [B1 V6]; [B1 V6] # ᯳.٦្ß -B; 򕮇\u1BF3。\u0666񗜼\u17D2SS; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ss -B; 򕮇\u1BF3。\u0666񗜼\u17D2ss; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ss -B; 򕮇\u1BF3。\u0666񗜼\u17D2Ss; [B1 P1 V6]; [B1 P1 V6] # ᯳.٦្ss -B; \u0664򤽎𑲛.󠔢︒≠; [B1 P1 V6]; [B1 P1 V6] # ٤𑲛.︒≠ -B; \u0664򤽎𑲛.󠔢︒=\u0338; [B1 P1 V6]; [B1 P1 V6] # ٤𑲛.︒≠ -B; \u0664򤽎𑲛.󠔢。≠; [B1 P1 V6]; [B1 P1 V6] # ٤𑲛..≠ -B; \u0664򤽎𑲛.󠔢。=\u0338; [B1 P1 V6]; [B1 P1 V6] # ٤𑲛..≠ -B; xn--dib0653l2i02d.xn--k736e.xn--1ch; [B1 V6]; [B1 V6] # ٤𑲛..≠ -B; xn--dib0653l2i02d.xn--1ch7467f14u4g; [B1 V6]; [B1 V6] # ٤𑲛.︒≠ -B; ➆񷧕ỗ⒈.򑬒񡘮\u085B𝟫; [P1 V6]; [P1 V6] # ➆ỗ⒈.࡛9 -B; ➆񷧕o\u0302\u0303⒈.򑬒񡘮\u085B𝟫; [P1 V6]; [P1 V6] # ➆ỗ⒈.࡛9 -B; ➆񷧕ỗ1..򑬒񡘮\u085B9; [P1 V6 A4_2]; [P1 V6 A4_2] # ➆ỗ1..࡛9 -B; ➆񷧕o\u0302\u03031..򑬒񡘮\u085B9; [P1 V6 A4_2]; [P1 V6 A4_2] # ➆ỗ1..࡛9 -B; ➆񷧕O\u0302\u03031..򑬒񡘮\u085B9; [P1 V6 A4_2]; [P1 V6 A4_2] # ➆ỗ1..࡛9 -B; ➆񷧕Ỗ1..򑬒񡘮\u085B9; [P1 V6 A4_2]; [P1 V6 A4_2] # ➆ỗ1..࡛9 -B; xn--1-3xm292b6044r..xn--9-6jd87310jtcqs; [V6 A4_2]; [V6 A4_2] # ➆ỗ1..࡛9 -B; ➆񷧕O\u0302\u0303⒈.򑬒񡘮\u085B𝟫; [P1 V6]; [P1 V6] # ➆ỗ⒈.࡛9 -B; ➆񷧕Ỗ⒈.򑬒񡘮\u085B𝟫; [P1 V6]; [P1 V6] # ➆ỗ⒈.࡛9 -B; xn--6lg26tvvc6v99z.xn--9-6jd87310jtcqs; [V6]; [V6] # ➆ỗ⒈.࡛9 -T; \u200D。𞤘; [B1 C2]; [A4_2] # .𞤺 -N; \u200D。𞤘; [B1 C2]; [B1 C2] # .𞤺 -T; \u200D。𞤘; [B1 C2]; [A4_2] # .𞤺 -N; \u200D。𞤘; [B1 C2]; [B1 C2] # .𞤺 -T; \u200D。𞤺; [B1 C2]; [A4_2] # .𞤺 -N; \u200D。𞤺; [B1 C2]; [B1 C2] # .𞤺 -B; .xn--ye6h; [A4_2]; [A4_2] -B; xn--1ug.xn--ye6h; [B1 C2]; [B1 C2] # .𞤺 -T; \u200D。𞤺; [B1 C2]; [A4_2] # .𞤺 -N; \u200D。𞤺; [B1 C2]; [B1 C2] # .𞤺 -B; xn--ye6h; 𞤺; xn--ye6h -B; 𞤺; ; xn--ye6h -B; 𞤘; 𞤺; xn--ye6h -B; \u0829\u0724.ᢣ; [B1 V5]; [B1 V5] # ࠩܤ.ᢣ -B; xn--unb53c.xn--tbf; [B1 V5]; [B1 V5] # ࠩܤ.ᢣ -T; \u073C\u200C-。𓐾ß; [C1 P1 V3 V5 V6]; [P1 V3 V5 V6] # ܼ-.ß -N; \u073C\u200C-。𓐾ß; [C1 P1 V3 V5 V6]; [C1 P1 V3 V5 V6] # ܼ-.ß -T; \u073C\u200C-。𓐾SS; [C1 P1 V3 V5 V6]; [P1 V3 V5 V6] # ܼ-.ss -N; \u073C\u200C-。𓐾SS; [C1 P1 V3 V5 V6]; [C1 P1 V3 V5 V6] # ܼ-.ss -T; \u073C\u200C-。𓐾ss; [C1 P1 V3 V5 V6]; [P1 V3 V5 V6] # ܼ-.ss -N; \u073C\u200C-。𓐾ss; [C1 P1 V3 V5 V6]; [C1 P1 V3 V5 V6] # ܼ-.ss -T; \u073C\u200C-。𓐾Ss; [C1 P1 V3 V5 V6]; [P1 V3 V5 V6] # ܼ-.ss -N; \u073C\u200C-。𓐾Ss; [C1 P1 V3 V5 V6]; [C1 P1 V3 V5 V6] # ܼ-.ss -B; xn----s2c.xn--ss-066q; [V3 V5 V6]; [V3 V5 V6] # ܼ-.ss -B; xn----s2c071q.xn--ss-066q; [C1 V3 V5 V6]; [C1 V3 V5 V6] # ܼ-.ss -B; xn----s2c071q.xn--zca7848m; [C1 V3 V5 V6]; [C1 V3 V5 V6] # ܼ-.ß -T; \u200Cς🃡⒗.\u0CC6仧\u0756; [B1 B5 B6 C1 P1 V5 V6]; [B5 B6 P1 V5 V6] # ς🃡⒗.ೆ仧ݖ -N; \u200Cς🃡⒗.\u0CC6仧\u0756; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 C1 P1 V5 V6] # ς🃡⒗.ೆ仧ݖ -T; \u200Cς🃡16..\u0CC6仧\u0756; [B1 B5 B6 C1 V5 A4_2]; [B5 B6 V5 A4_2] # ς🃡16..ೆ仧ݖ -N; \u200Cς🃡16..\u0CC6仧\u0756; [B1 B5 B6 C1 V5 A4_2]; [B1 B5 B6 C1 V5 A4_2] # ς🃡16..ೆ仧ݖ -T; \u200CΣ🃡16..\u0CC6仧\u0756; [B1 B5 B6 C1 V5 A4_2]; [B5 B6 V5 A4_2] # σ🃡16..ೆ仧ݖ -N; \u200CΣ🃡16..\u0CC6仧\u0756; [B1 B5 B6 C1 V5 A4_2]; [B1 B5 B6 C1 V5 A4_2] # σ🃡16..ೆ仧ݖ -T; \u200Cσ🃡16..\u0CC6仧\u0756; [B1 B5 B6 C1 V5 A4_2]; [B5 B6 V5 A4_2] # σ🃡16..ೆ仧ݖ -N; \u200Cσ🃡16..\u0CC6仧\u0756; [B1 B5 B6 C1 V5 A4_2]; [B1 B5 B6 C1 V5 A4_2] # σ🃡16..ೆ仧ݖ -B; xn--16-ubc66061c..xn--9ob79ycx2e; [B5 B6 V5 A4_2]; [B5 B6 V5 A4_2] # σ🃡16..ೆ仧ݖ -B; xn--16-ubc7700avy99b..xn--9ob79ycx2e; [B1 B5 B6 C1 V5 A4_2]; [B1 B5 B6 C1 V5 A4_2] # σ🃡16..ೆ仧ݖ -B; xn--16-rbc1800avy99b..xn--9ob79ycx2e; [B1 B5 B6 C1 V5 A4_2]; [B1 B5 B6 C1 V5 A4_2] # ς🃡16..ೆ仧ݖ -T; \u200CΣ🃡⒗.\u0CC6仧\u0756; [B1 B5 B6 C1 P1 V5 V6]; [B5 B6 P1 V5 V6] # σ🃡⒗.ೆ仧ݖ -N; \u200CΣ🃡⒗.\u0CC6仧\u0756; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 C1 P1 V5 V6] # σ🃡⒗.ೆ仧ݖ -T; \u200Cσ🃡⒗.\u0CC6仧\u0756; [B1 B5 B6 C1 P1 V5 V6]; [B5 B6 P1 V5 V6] # σ🃡⒗.ೆ仧ݖ -N; \u200Cσ🃡⒗.\u0CC6仧\u0756; [B1 B5 B6 C1 P1 V5 V6]; [B1 B5 B6 C1 P1 V5 V6] # σ🃡⒗.ೆ仧ݖ -B; xn--4xa229nbu92a.xn--9ob79ycx2e; [B5 B6 V5 V6]; [B5 B6 V5 V6] # σ🃡⒗.ೆ仧ݖ -B; xn--4xa595lz9czy52d.xn--9ob79ycx2e; [B1 B5 B6 C1 V5 V6]; [B1 B5 B6 C1 V5 V6] # σ🃡⒗.ೆ仧ݖ -B; xn--3xa795lz9czy52d.xn--9ob79ycx2e; [B1 B5 B6 C1 V5 V6]; [B1 B5 B6 C1 V5 V6] # ς🃡⒗.ೆ仧ݖ -B; -.𞸚; [B1 V3]; [B1 V3] # -.ظ -B; -.\u0638; [B1 V3]; [B1 V3] # -.ظ -B; -.xn--3gb; [B1 V3]; [B1 V3] # -.ظ -B; 򏛓\u0683.\u0F7E\u0634; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ڃ.ཾش -B; xn--8ib92728i.xn--zgb968b; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ڃ.ཾش -B; \u0FE6\u0843񽶬.𐮏; [B5 P1 V6]; [B5 P1 V6] # ࡃ.𐮏 -B; xn--1vb320b5m04p.xn--m29c; [B5 V6]; [B5 V6] # ࡃ.𐮏 -T; 2񎨠\u07CBß。ᠽ; [B1 P1 V6]; [B1 P1 V6] # 2ߋß.ᠽ -N; 2񎨠\u07CBß。ᠽ; [B1 P1 V6]; [B1 P1 V6] # 2ߋß.ᠽ -B; 2񎨠\u07CBSS。ᠽ; [B1 P1 V6]; [B1 P1 V6] # 2ߋss.ᠽ -B; 2񎨠\u07CBss。ᠽ; [B1 P1 V6]; [B1 P1 V6] # 2ߋss.ᠽ -B; 2񎨠\u07CBSs。ᠽ; [B1 P1 V6]; [B1 P1 V6] # 2ߋss.ᠽ -B; xn--2ss-odg83511n.xn--w7e; [B1 V6]; [B1 V6] # 2ߋss.ᠽ -B; xn--2-qfa924cez02l.xn--w7e; [B1 V6]; [B1 V6] # 2ߋß.ᠽ -T; 㸳\u07CA≮.\u06CEß-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێß- -N; 㸳\u07CA≮.\u06CEß-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێß- -T; 㸳\u07CA<\u0338.\u06CEß-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێß- -N; 㸳\u07CA<\u0338.\u06CEß-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێß- -T; 㸳\u07CA≮.\u06CEß-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێß- -N; 㸳\u07CA≮.\u06CEß-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێß- -T; 㸳\u07CA<\u0338.\u06CEß-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێß- -N; 㸳\u07CA<\u0338.\u06CEß-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێß- -T; 㸳\u07CA<\u0338.\u06CESS-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA<\u0338.\u06CESS-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA≮.\u06CESS-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA≮.\u06CESS-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA≮.\u06CEss-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA≮.\u06CEss-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA<\u0338.\u06CEss-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA<\u0338.\u06CEss-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA<\u0338.\u06CESs-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA<\u0338.\u06CESs-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA≮.\u06CESs-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA≮.\u06CESs-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -B; xn--lsb457kkut.xn--ss--qjf; [B2 B3 B5 B6 V3 V6]; [B2 B3 B5 B6 V3 V6] # 㸳ߊ≮.ێss- -B; xn--lsb457kkut.xn--ss--qjf2343a; [B2 B3 B5 B6 C2 V6]; [B2 B3 B5 B6 C2 V6] # 㸳ߊ≮.ێss- -B; xn--lsb457kkut.xn----pfa076bys4a; [B2 B3 B5 B6 C2 V6]; [B2 B3 B5 B6 C2 V6] # 㸳ߊ≮.ێß- -T; 㸳\u07CA<\u0338.\u06CESS-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA<\u0338.\u06CESS-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA≮.\u06CESS-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA≮.\u06CESS-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA≮.\u06CEss-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA≮.\u06CEss-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA<\u0338.\u06CEss-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA<\u0338.\u06CEss-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA<\u0338.\u06CESs-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA<\u0338.\u06CESs-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -T; 㸳\u07CA≮.\u06CESs-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V3 V6] # 㸳ߊ≮.ێss- -N; 㸳\u07CA≮.\u06CESs-\u200D; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # 㸳ߊ≮.ێss- -B; -򷝬\u135E𑜧.\u1DEB-︒; [P1 V3 V5 V6]; [P1 V3 V5 V6] # -፞𑜧.ᷫ-︒ -B; -򷝬\u135E𑜧.\u1DEB-。; [P1 V3 V5 V6]; [P1 V3 V5 V6] # -፞𑜧.ᷫ-. -B; xn----b5h1837n2ok9f.xn----mkm.; [V3 V5 V6]; [V3 V5 V6] # -፞𑜧.ᷫ-. -B; xn----b5h1837n2ok9f.xn----mkmw278h; [V3 V5 V6]; [V3 V5 V6] # -፞𑜧.ᷫ-︒ -B; ︒.򚠡\u1A59; [P1 V6]; [P1 V6] # ︒.ᩙ -B; 。.򚠡\u1A59; [P1 V6 A4_2]; [P1 V6 A4_2] # ..ᩙ -B; ..xn--cof61594i; [V6 A4_2]; [V6 A4_2] # ..ᩙ -B; xn--y86c.xn--cof61594i; [V6]; [V6] # ︒.ᩙ -T; \u0323\u2DE1。\u200C⓾\u200C\u06B9; [B1 B3 B6 C1 V5]; [B1 B3 B6 V5] # ̣ⷡ.⓾ڹ -N; \u0323\u2DE1。\u200C⓾\u200C\u06B9; [B1 B3 B6 C1 V5]; [B1 B3 B6 C1 V5] # ̣ⷡ.⓾ڹ -B; xn--kta899s.xn--skb116m; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ̣ⷡ.⓾ڹ -B; xn--kta899s.xn--skb970ka771c; [B1 B3 B6 C1 V5]; [B1 B3 B6 C1 V5] # ̣ⷡ.⓾ڹ -B; 𞠶ᠴ\u06DD。\u1074𞤵󠅦; [B1 B2 P1 V5 V6]; [B1 B2 P1 V5 V6] # 𞠶ᠴ.ၴ𞤵 -B; 𞠶ᠴ\u06DD。\u1074𞤵󠅦; [B1 B2 P1 V5 V6]; [B1 B2 P1 V5 V6] # 𞠶ᠴ.ၴ𞤵 -B; 𞠶ᠴ\u06DD。\u1074𞤓󠅦; [B1 B2 P1 V5 V6]; [B1 B2 P1 V5 V6] # 𞠶ᠴ.ၴ𞤵 -B; xn--tlb199fwl35a.xn--yld4613v; [B1 B2 V5 V6]; [B1 B2 V5 V6] # 𞠶ᠴ.ၴ𞤵 -B; 𞠶ᠴ\u06DD。\u1074𞤓󠅦; [B1 B2 P1 V5 V6]; [B1 B2 P1 V5 V6] # 𞠶ᠴ.ၴ𞤵 -B; 𑰺.-򑟏; [P1 V3 V5 V6]; [P1 V3 V5 V6] -B; xn--jk3d.xn----iz68g; [V3 V5 V6]; [V3 V5 V6] -B; 󠻩.赏; [P1 V6]; [P1 V6] -B; 󠻩.赏; [P1 V6]; [P1 V6] -B; xn--2856e.xn--6o3a; [V6]; [V6] -B; \u06B0ᠡ。Ⴁ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ڰᠡ.Ⴁ -B; \u06B0ᠡ。Ⴁ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # ڰᠡ.Ⴁ -B; \u06B0ᠡ。ⴁ; [B2 B3]; [B2 B3] # ڰᠡ.ⴁ -B; xn--jkb440g.xn--skj; [B2 B3]; [B2 B3] # ڰᠡ.ⴁ -B; xn--jkb440g.xn--8md; [B2 B3 V6]; [B2 B3 V6] # ڰᠡ.Ⴁ -B; \u06B0ᠡ。ⴁ; [B2 B3]; [B2 B3] # ڰᠡ.ⴁ -T; \u20DEႪ\u06BBς。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ⃞Ⴊڻς.- -N; \u20DEႪ\u06BBς。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ⃞Ⴊڻς.- -T; \u20DEႪ\u06BBς。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ⃞Ⴊڻς.- -N; \u20DEႪ\u06BBς。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ⃞Ⴊڻς.- -T; \u20DEⴊ\u06BBς。-; [B1 V3 V5]; [B1 V3 V5] # ⃞ⴊڻς.- -N; \u20DEⴊ\u06BBς。-; [B1 V3 V5]; [B1 V3 V5] # ⃞ⴊڻς.- -B; \u20DEႪ\u06BBΣ。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ⃞Ⴊڻσ.- -B; \u20DEⴊ\u06BBσ。-; [B1 V3 V5]; [B1 V3 V5] # ⃞ⴊڻσ.- -B; \u20DEႪ\u06BBσ。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ⃞Ⴊڻσ.- -B; xn--4xa33m7zmb0q.-; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ⃞Ⴊڻσ.- -B; xn--4xa33mr38aeel.-; [B1 V3 V5]; [B1 V3 V5] # ⃞ⴊڻσ.- -B; xn--3xa53mr38aeel.-; [B1 V3 V5]; [B1 V3 V5] # ⃞ⴊڻς.- -B; xn--3xa53m7zmb0q.-; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ⃞Ⴊڻς.- -T; \u20DEⴊ\u06BBς。-; [B1 V3 V5]; [B1 V3 V5] # ⃞ⴊڻς.- -N; \u20DEⴊ\u06BBς。-; [B1 V3 V5]; [B1 V3 V5] # ⃞ⴊڻς.- -B; \u20DEႪ\u06BBΣ。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ⃞Ⴊڻσ.- -B; \u20DEⴊ\u06BBσ。-; [B1 V3 V5]; [B1 V3 V5] # ⃞ⴊڻσ.- -B; \u20DEႪ\u06BBσ。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ⃞Ⴊڻσ.- -T; Ⴍ.񍇦\u200C; [C1 P1 V6]; [P1 V6] # Ⴍ. -N; Ⴍ.񍇦\u200C; [C1 P1 V6]; [C1 P1 V6] # Ⴍ. -T; Ⴍ.񍇦\u200C; [C1 P1 V6]; [P1 V6] # Ⴍ. -N; Ⴍ.񍇦\u200C; [C1 P1 V6]; [C1 P1 V6] # Ⴍ. -T; ⴍ.񍇦\u200C; [C1 P1 V6]; [P1 V6] # ⴍ. -N; ⴍ.񍇦\u200C; [C1 P1 V6]; [C1 P1 V6] # ⴍ. -B; xn--4kj.xn--p01x; [V6]; [V6] -B; xn--4kj.xn--0ug56448b; [C1 V6]; [C1 V6] # ⴍ. -B; xn--lnd.xn--p01x; [V6]; [V6] -B; xn--lnd.xn--0ug56448b; [C1 V6]; [C1 V6] # Ⴍ. -T; ⴍ.񍇦\u200C; [C1 P1 V6]; [P1 V6] # ⴍ. -N; ⴍ.񍇦\u200C; [C1 P1 V6]; [C1 P1 V6] # ⴍ. -B; 򉟂󠵣.𐫫\u1A60󴺖\u1B44; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # .𐫫᩠᭄ -B; xn--9u37blu98h.xn--jof13bt568cork1j; [B2 B3 B6 V6]; [B2 B3 B6 V6] # .𐫫᩠᭄ -B; ≯❊ᠯ。𐹱⺨; [B1 P1 V6]; [B1 P1 V6] -B; >\u0338❊ᠯ。𐹱⺨; [B1 P1 V6]; [B1 P1 V6] -B; ≯❊ᠯ。𐹱⺨; [B1 P1 V6]; [B1 P1 V6] -B; >\u0338❊ᠯ。𐹱⺨; [B1 P1 V6]; [B1 P1 V6] -B; xn--i7e163ct2d.xn--vwj7372e; [B1 V6]; [B1 V6] -B; 􁕜𐹧𞭁𐹩。Ⴈ𐫮Ⴏ; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; 􁕜𐹧𞭁𐹩。ⴈ𐫮ⴏ; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; xn--fo0de1270ope54j.xn--zkjo0151o; [B5 B6 V6]; [B5 B6 V6] -B; xn--fo0de1270ope54j.xn--gndo2033q; [B5 B6 V6]; [B5 B6 V6] -B; 𞠂。\uA926; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𞠂.ꤦ -B; xn--145h.xn--ti9a; [B1 B3 B6 V5]; [B1 B3 B6 V5] # 𞠂.ꤦ -B; 𝟔𐹫.\u0733\u10379ꡇ; [B1 V5]; [B1 V5] # 6𐹫.့ܳ9ꡇ -B; 𝟔𐹫.\u1037\u07339ꡇ; [B1 V5]; [B1 V5] # 6𐹫.့ܳ9ꡇ -B; 6𐹫.\u1037\u07339ꡇ; [B1 V5]; [B1 V5] # 6𐹫.့ܳ9ꡇ -B; xn--6-t26i.xn--9-91c730e8u8n; [B1 V5]; [B1 V5] # 6𐹫.့ܳ9ꡇ -B; \u0724\u0603𞲶.\u06D8; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ܤ.ۘ -B; \u0724\u0603𞲶.\u06D8; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # ܤ.ۘ -B; xn--lfb19ct414i.xn--olb; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # ܤ.ۘ -T; ✆񱔩ꡋ.\u0632\u200D𞣴; [B1 C2 P1 V6]; [B1 P1 V6] # ✆ꡋ.ز -N; ✆񱔩ꡋ.\u0632\u200D𞣴; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ✆ꡋ.ز -T; ✆񱔩ꡋ.\u0632\u200D𞣴; [B1 C2 P1 V6]; [B1 P1 V6] # ✆ꡋ.ز -N; ✆񱔩ꡋ.\u0632\u200D𞣴; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ✆ꡋ.ز -B; xn--1biv525bcix0d.xn--xgb6828v; [B1 V6]; [B1 V6] # ✆ꡋ.ز -B; xn--1biv525bcix0d.xn--xgb253k0m73a; [B1 C2 V6]; [B1 C2 V6] # ✆ꡋ.ز -B; \u0845񃾰𞸍-.≠򃁟𑋪; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # ࡅن-.≠𑋪 -B; \u0845񃾰𞸍-.=\u0338򃁟𑋪; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # ࡅن-.≠𑋪 -B; \u0845񃾰\u0646-.≠򃁟𑋪; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # ࡅن-.≠𑋪 -B; \u0845񃾰\u0646-.=\u0338򃁟𑋪; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # ࡅن-.≠𑋪 -B; xn----qoc64my971s.xn--1ch7585g76o3c; [B1 B2 B3 V3 V6]; [B1 B2 B3 V3 V6] # ࡅن-.≠𑋪 -B; 𝟛.笠; 3.笠; 3.xn--6vz -B; 𝟛.笠; 3.笠; 3.xn--6vz -B; 3.笠; ; 3.xn--6vz -B; 3.xn--6vz; 3.笠; 3.xn--6vz -T; -\u200D.Ⴞ𐋷; [C2 P1 V3 V6]; [P1 V3 V6] # -.Ⴞ𐋷 -N; -\u200D.Ⴞ𐋷; [C2 P1 V3 V6]; [C2 P1 V3 V6] # -.Ⴞ𐋷 -T; -\u200D.ⴞ𐋷; [C2 V3]; [V3] # -.ⴞ𐋷 -N; -\u200D.ⴞ𐋷; [C2 V3]; [C2 V3] # -.ⴞ𐋷 -B; -.xn--mlj8559d; [V3]; [V3] -B; xn----ugn.xn--mlj8559d; [C2 V3]; [C2 V3] # -.ⴞ𐋷 -B; -.xn--2nd2315j; [V3 V6]; [V3 V6] -B; xn----ugn.xn--2nd2315j; [C2 V3 V6]; [C2 V3 V6] # -.Ⴞ𐋷 -T; \u200Dςß\u0731.\u0BCD; [C2 V5]; [V5] # ςßܱ.் -N; \u200Dςß\u0731.\u0BCD; [C2 V5]; [C2 V5] # ςßܱ.் -T; \u200Dςß\u0731.\u0BCD; [C2 V5]; [V5] # ςßܱ.் -N; \u200Dςß\u0731.\u0BCD; [C2 V5]; [C2 V5] # ςßܱ.் -T; \u200DΣSS\u0731.\u0BCD; [C2 V5]; [V5] # σssܱ.் -N; \u200DΣSS\u0731.\u0BCD; [C2 V5]; [C2 V5] # σssܱ.் -T; \u200Dσss\u0731.\u0BCD; [C2 V5]; [V5] # σssܱ.் -N; \u200Dσss\u0731.\u0BCD; [C2 V5]; [C2 V5] # σssܱ.் -T; \u200DΣss\u0731.\u0BCD; [C2 V5]; [V5] # σssܱ.் -N; \u200DΣss\u0731.\u0BCD; [C2 V5]; [C2 V5] # σssܱ.் -B; xn--ss-ubc826a.xn--xmc; [V5]; [V5] # σssܱ.் -B; xn--ss-ubc826ab34b.xn--xmc; [C2 V5]; [C2 V5] # σssܱ.் -T; \u200DΣß\u0731.\u0BCD; [C2 V5]; [V5] # σßܱ.் -N; \u200DΣß\u0731.\u0BCD; [C2 V5]; [C2 V5] # σßܱ.் -T; \u200Dσß\u0731.\u0BCD; [C2 V5]; [V5] # σßܱ.் -N; \u200Dσß\u0731.\u0BCD; [C2 V5]; [C2 V5] # σßܱ.் -B; xn--zca39lk1di19a.xn--xmc; [C2 V5]; [C2 V5] # σßܱ.் -B; xn--zca19ln1di19a.xn--xmc; [C2 V5]; [C2 V5] # ςßܱ.் -T; \u200DΣSS\u0731.\u0BCD; [C2 V5]; [V5] # σssܱ.் -N; \u200DΣSS\u0731.\u0BCD; [C2 V5]; [C2 V5] # σssܱ.் -T; \u200Dσss\u0731.\u0BCD; [C2 V5]; [V5] # σssܱ.் -N; \u200Dσss\u0731.\u0BCD; [C2 V5]; [C2 V5] # σssܱ.் -T; \u200DΣss\u0731.\u0BCD; [C2 V5]; [V5] # σssܱ.் -N; \u200DΣss\u0731.\u0BCD; [C2 V5]; [C2 V5] # σssܱ.் -T; \u200DΣß\u0731.\u0BCD; [C2 V5]; [V5] # σßܱ.் -N; \u200DΣß\u0731.\u0BCD; [C2 V5]; [C2 V5] # σßܱ.் -T; \u200Dσß\u0731.\u0BCD; [C2 V5]; [V5] # σßܱ.் -N; \u200Dσß\u0731.\u0BCD; [C2 V5]; [C2 V5] # σßܱ.் -T; ≠.\u200D; [C2 P1 V6]; [P1 V6] # ≠. -N; ≠.\u200D; [C2 P1 V6]; [C2 P1 V6] # ≠. -T; =\u0338.\u200D; [C2 P1 V6]; [P1 V6] # ≠. -N; =\u0338.\u200D; [C2 P1 V6]; [C2 P1 V6] # ≠. -T; ≠.\u200D; [C2 P1 V6]; [P1 V6] # ≠. -N; ≠.\u200D; [C2 P1 V6]; [C2 P1 V6] # ≠. -T; =\u0338.\u200D; [C2 P1 V6]; [P1 V6] # ≠. -N; =\u0338.\u200D; [C2 P1 V6]; [C2 P1 V6] # ≠. -B; xn--1ch.; [V6]; [V6] -B; xn--1ch.xn--1ug; [C2 V6]; [C2 V6] # ≠. -B; \uFC01。\u0C81ᠼ▗򒁋; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ئح.ಁᠼ▗ -B; \u0626\u062D。\u0C81ᠼ▗򒁋; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ئح.ಁᠼ▗ -B; \u064A\u0654\u062D。\u0C81ᠼ▗򒁋; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ئح.ಁᠼ▗ -B; xn--lgbo.xn--2rc021dcxkrx55t; [B1 V5 V6]; [B1 V5 V6] # ئح.ಁᠼ▗ -T; 󧋵\u09CDς.ς𐨿; [P1 V6]; [P1 V6] # ্ς.ς𐨿 -N; 󧋵\u09CDς.ς𐨿; [P1 V6]; [P1 V6] # ্ς.ς𐨿 -T; 󧋵\u09CDς.ς𐨿; [P1 V6]; [P1 V6] # ্ς.ς𐨿 -N; 󧋵\u09CDς.ς𐨿; [P1 V6]; [P1 V6] # ্ς.ς𐨿 -B; 󧋵\u09CDΣ.Σ𐨿; [P1 V6]; [P1 V6] # ্σ.σ𐨿 -T; 󧋵\u09CDσ.ς𐨿; [P1 V6]; [P1 V6] # ্σ.ς𐨿 -N; 󧋵\u09CDσ.ς𐨿; [P1 V6]; [P1 V6] # ্σ.ς𐨿 -B; 󧋵\u09CDσ.σ𐨿; [P1 V6]; [P1 V6] # ্σ.σ𐨿 -B; 󧋵\u09CDΣ.σ𐨿; [P1 V6]; [P1 V6] # ্σ.σ𐨿 -B; xn--4xa502av8297a.xn--4xa6055k; [V6]; [V6] # ্σ.σ𐨿 -T; 󧋵\u09CDΣ.ς𐨿; [P1 V6]; [P1 V6] # ্σ.ς𐨿 -N; 󧋵\u09CDΣ.ς𐨿; [P1 V6]; [P1 V6] # ্σ.ς𐨿 -B; xn--4xa502av8297a.xn--3xa8055k; [V6]; [V6] # ্σ.ς𐨿 -B; xn--3xa702av8297a.xn--3xa8055k; [V6]; [V6] # ্ς.ς𐨿 -B; 󧋵\u09CDΣ.Σ𐨿; [P1 V6]; [P1 V6] # ্σ.σ𐨿 -T; 󧋵\u09CDσ.ς𐨿; [P1 V6]; [P1 V6] # ্σ.ς𐨿 -N; 󧋵\u09CDσ.ς𐨿; [P1 V6]; [P1 V6] # ্σ.ς𐨿 -B; 󧋵\u09CDσ.σ𐨿; [P1 V6]; [P1 V6] # ্σ.σ𐨿 -B; 󧋵\u09CDΣ.σ𐨿; [P1 V6]; [P1 V6] # ্σ.σ𐨿 -T; 󧋵\u09CDΣ.ς𐨿; [P1 V6]; [P1 V6] # ্σ.ς𐨿 -N; 󧋵\u09CDΣ.ς𐨿; [P1 V6]; [P1 V6] # ্σ.ς𐨿 -B; 𐫓\u07D8牅\u08F8。𞦤\u1A17򱍰Ⴙ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐫓ߘ牅ࣸ.ᨗႹ -B; 𐫓\u07D8牅\u08F8。𞦤\u1A17򱍰Ⴙ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐫓ߘ牅ࣸ.ᨗႹ -B; 𐫓\u07D8牅\u08F8。𞦤\u1A17򱍰ⴙ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐫓ߘ牅ࣸ.ᨗⴙ -B; xn--zsb09cu46vjs6f.xn--gmf469fr883am5r1e; [B2 B3 V6]; [B2 B3 V6] # 𐫓ߘ牅ࣸ.ᨗⴙ -B; xn--zsb09cu46vjs6f.xn--xnd909bv540bm5k9d; [B2 B3 V6]; [B2 B3 V6] # 𐫓ߘ牅ࣸ.ᨗႹ -B; 𐫓\u07D8牅\u08F8。𞦤\u1A17򱍰ⴙ; [B2 B3 P1 V6]; [B2 B3 P1 V6] # 𐫓ߘ牅ࣸ.ᨗⴙ -B; 񣤒。륧; [P1 V6]; [P1 V6] -B; 񣤒。륧; [P1 V6]; [P1 V6] -B; 񣤒。륧; [P1 V6]; [P1 V6] -B; 񣤒。륧; [P1 V6]; [P1 V6] -B; xn--s264a.xn--pw2b; [V6]; [V6] -T; 𐹷\u200D。󉵢; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹷. -N; 𐹷\u200D。󉵢; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹷. -B; xn--vo0d.xn--8088d; [B1 V6]; [B1 V6] -B; xn--1ugx205g.xn--8088d; [B1 C2 V6]; [B1 C2 V6] # 𐹷. -B; Ⴘ\u06C2𑲭。-; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # Ⴘۂ𑲭.- -B; Ⴘ\u06C1\u0654𑲭。-; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # Ⴘۂ𑲭.- -B; Ⴘ\u06C2𑲭。-; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # Ⴘۂ𑲭.- -B; Ⴘ\u06C1\u0654𑲭。-; [B1 B5 B6 P1 V3 V6]; [B1 B5 B6 P1 V3 V6] # Ⴘۂ𑲭.- -B; ⴘ\u06C1\u0654𑲭。-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # ⴘۂ𑲭.- -B; ⴘ\u06C2𑲭。-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # ⴘۂ𑲭.- -B; xn--1kb147qfk3n.-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # ⴘۂ𑲭.- -B; xn--1kb312c139t.-; [B1 B5 B6 V3 V6]; [B1 B5 B6 V3 V6] # Ⴘۂ𑲭.- -B; ⴘ\u06C1\u0654𑲭。-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # ⴘۂ𑲭.- -B; ⴘ\u06C2𑲭。-; [B1 B5 B6 V3]; [B1 B5 B6 V3] # ⴘۂ𑲭.- -B; \uA806\u067B₆ᡐ。🛇\uFCDD; [B1 V5]; [B1 V5] # ꠆ٻ6ᡐ.🛇يم -B; \uA806\u067B6ᡐ。🛇\u064A\u0645; [B1 V5]; [B1 V5] # ꠆ٻ6ᡐ.🛇يم -B; xn--6-rrc018krt9k.xn--hhbj61429a; [B1 V5]; [B1 V5] # ꠆ٻ6ᡐ.🛇يم -B; 򸍂.㇄ᡟ𐫂\u0622; [B1 P1 V6]; [B1 P1 V6] # .㇄ᡟ𐫂آ -B; 򸍂.㇄ᡟ𐫂\u0627\u0653; [B1 P1 V6]; [B1 P1 V6] # .㇄ᡟ𐫂آ -B; xn--p292d.xn--hgb154ghrsvm2r; [B1 V6]; [B1 V6] # .㇄ᡟ𐫂آ -B; \u07DF򵚌。-\u07E9; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # ߟ.-ߩ -B; xn--6sb88139l.xn----pdd; [B1 B2 B3 V3 V6]; [B1 B2 B3 V3 V6] # ߟ.-ߩ -T; ς\u0643⾑.\u200Cᢟ\u200C⒈; [B1 B5 C1 P1 V6]; [B5 P1 V6] # ςك襾.ᢟ⒈ -N; ς\u0643⾑.\u200Cᢟ\u200C⒈; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # ςك襾.ᢟ⒈ -T; ς\u0643襾.\u200Cᢟ\u200C1.; [B1 B5 C1]; [B5] # ςك襾.ᢟ1. -N; ς\u0643襾.\u200Cᢟ\u200C1.; [B1 B5 C1]; [B1 B5 C1] # ςك襾.ᢟ1. -T; Σ\u0643襾.\u200Cᢟ\u200C1.; [B1 B5 C1]; [B5] # σك襾.ᢟ1. -N; Σ\u0643襾.\u200Cᢟ\u200C1.; [B1 B5 C1]; [B1 B5 C1] # σك襾.ᢟ1. -T; σ\u0643襾.\u200Cᢟ\u200C1.; [B1 B5 C1]; [B5] # σك襾.ᢟ1. -N; σ\u0643襾.\u200Cᢟ\u200C1.; [B1 B5 C1]; [B1 B5 C1] # σك襾.ᢟ1. -B; xn--4xa49jux8r.xn--1-4ck.; [B5]; [B5] # σك襾.ᢟ1. -B; xn--4xa49jux8r.xn--1-4ck691bba.; [B1 B5 C1]; [B1 B5 C1] # σك襾.ᢟ1. -B; xn--3xa69jux8r.xn--1-4ck691bba.; [B1 B5 C1]; [B1 B5 C1] # ςك襾.ᢟ1. -T; Σ\u0643⾑.\u200Cᢟ\u200C⒈; [B1 B5 C1 P1 V6]; [B5 P1 V6] # σك襾.ᢟ⒈ -N; Σ\u0643⾑.\u200Cᢟ\u200C⒈; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # σك襾.ᢟ⒈ -T; σ\u0643⾑.\u200Cᢟ\u200C⒈; [B1 B5 C1 P1 V6]; [B5 P1 V6] # σك襾.ᢟ⒈ -N; σ\u0643⾑.\u200Cᢟ\u200C⒈; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # σك襾.ᢟ⒈ -B; xn--4xa49jux8r.xn--pbf212d; [B5 V6]; [B5 V6] # σك襾.ᢟ⒈ -B; xn--4xa49jux8r.xn--pbf519aba607b; [B1 B5 C1 V6]; [B1 B5 C1 V6] # σك襾.ᢟ⒈ -B; xn--3xa69jux8r.xn--pbf519aba607b; [B1 B5 C1 V6]; [B1 B5 C1 V6] # ςك襾.ᢟ⒈ -B; ᡆ𑓝.𞵆; [P1 V6]; [P1 V6] -B; ᡆ𑓝.𞵆; [P1 V6]; [P1 V6] -B; xn--57e0440k.xn--k86h; [V6]; [V6] -T; \u0A4D𦍓\u1DEE。\u200C\u08BD񝹲; [B1 C1 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ੍𦍓ᷮ.ࢽ -N; \u0A4D𦍓\u1DEE。\u200C\u08BD񝹲; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # ੍𦍓ᷮ.ࢽ -T; \u0A4D𦍓\u1DEE。\u200C\u08BD񝹲; [B1 C1 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ੍𦍓ᷮ.ࢽ -N; \u0A4D𦍓\u1DEE。\u200C\u08BD񝹲; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # ੍𦍓ᷮ.ࢽ -B; xn--ybc461hph93b.xn--jzb29857e; [B1 B2 B3 V5 V6]; [B1 B2 B3 V5 V6] # ੍𦍓ᷮ.ࢽ -B; xn--ybc461hph93b.xn--jzb740j1y45h; [B1 C1 V5 V6]; [B1 C1 V5 V6] # ੍𦍓ᷮ.ࢽ -T; \u062E\u0748񅪪-.\u200C먿; [B1 B2 B3 C1 P1 V3 V6]; [B2 B3 P1 V3 V6] # خ݈-.먿 -N; \u062E\u0748񅪪-.\u200C먿; [B1 B2 B3 C1 P1 V3 V6]; [B1 B2 B3 C1 P1 V3 V6] # خ݈-.먿 -T; \u062E\u0748񅪪-.\u200C먿; [B1 B2 B3 C1 P1 V3 V6]; [B2 B3 P1 V3 V6] # خ݈-.먿 -N; \u062E\u0748񅪪-.\u200C먿; [B1 B2 B3 C1 P1 V3 V6]; [B1 B2 B3 C1 P1 V3 V6] # خ݈-.먿 -T; \u062E\u0748񅪪-.\u200C먿; [B1 B2 B3 C1 P1 V3 V6]; [B2 B3 P1 V3 V6] # خ݈-.먿 -N; \u062E\u0748񅪪-.\u200C먿; [B1 B2 B3 C1 P1 V3 V6]; [B1 B2 B3 C1 P1 V3 V6] # خ݈-.먿 -T; \u062E\u0748񅪪-.\u200C먿; [B1 B2 B3 C1 P1 V3 V6]; [B2 B3 P1 V3 V6] # خ݈-.먿 -N; \u062E\u0748񅪪-.\u200C먿; [B1 B2 B3 C1 P1 V3 V6]; [B1 B2 B3 C1 P1 V3 V6] # خ݈-.먿 -B; xn----dnc06f42153a.xn--v22b; [B2 B3 V3 V6]; [B2 B3 V3 V6] # خ݈-.먿 -B; xn----dnc06f42153a.xn--0ug1581d; [B1 B2 B3 C1 V3 V6]; [B1 B2 B3 C1 V3 V6] # خ݈-.먿 -B; 􋿦。ᠽ; [P1 V6]; [P1 V6] -B; 􋿦。ᠽ; [P1 V6]; [P1 V6] -B; xn--j890g.xn--w7e; [V6]; [V6] -T; 嬃𝍌.\u200D\u0B44; [C2]; [V5] # 嬃𝍌.ୄ -N; 嬃𝍌.\u200D\u0B44; [C2]; [C2] # 嬃𝍌.ୄ -T; 嬃𝍌.\u200D\u0B44; [C2]; [V5] # 嬃𝍌.ୄ -N; 嬃𝍌.\u200D\u0B44; [C2]; [C2] # 嬃𝍌.ୄ -B; xn--b6s0078f.xn--0ic; [V5]; [V5] # 嬃𝍌.ୄ -B; xn--b6s0078f.xn--0ic557h; [C2]; [C2] # 嬃𝍌.ୄ -B; \u0602𝌪≯.𚋲򵁨; [B1 P1 V6]; [B1 P1 V6] # 𝌪≯. -B; \u0602𝌪>\u0338.𚋲򵁨; [B1 P1 V6]; [B1 P1 V6] # 𝌪≯. -B; \u0602𝌪≯.𚋲򵁨; [B1 P1 V6]; [B1 P1 V6] # 𝌪≯. -B; \u0602𝌪>\u0338.𚋲򵁨; [B1 P1 V6]; [B1 P1 V6] # 𝌪≯. -B; xn--kfb866llx01a.xn--wp1gm3570b; [B1 V6]; [B1 V6] # 𝌪≯. -B; 򫾥\u08B7\u17CC\uA9C0.𞼠; [B5 P1 V6]; [B5 P1 V6] # ࢷ៌꧀. -B; xn--dzb638ewm4i1iy1h.xn--3m7h; [B5 V6]; [B5 V6] # ࢷ៌꧀. -T; \u200C.񟛤; [C1 P1 V6]; [P1 V6 A4_2] # . -N; \u200C.񟛤; [C1 P1 V6]; [C1 P1 V6] # . -B; .xn--q823a; [V6 A4_2]; [V6 A4_2] -B; xn--0ug.xn--q823a; [C1 V6]; [C1 V6] # . -B; 򺛕Ⴃ䠅.𐸑; [P1 V6]; [P1 V6] -B; 򺛕Ⴃ䠅.𐸑; [P1 V6]; [P1 V6] -B; 򺛕ⴃ䠅.𐸑; [P1 V6]; [P1 V6] -B; xn--ukju77frl47r.xn--yl0d; [V6]; [V6] -B; xn--bnd074zr557n.xn--yl0d; [V6]; [V6] -B; 򺛕ⴃ䠅.𐸑; [P1 V6]; [P1 V6] -B; \u1BF1𐹳𐹵𞤚。𝟨Ⴅ; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ᯱ𐹳𐹵𞤼.6Ⴅ -B; \u1BF1𐹳𐹵𞤚。6Ⴅ; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ᯱ𐹳𐹵𞤼.6Ⴅ -B; \u1BF1𐹳𐹵𞤼。6ⴅ; [B1 V5]; [B1 V5] # ᯱ𐹳𐹵𞤼.6ⴅ -B; xn--zzfy954hga2415t.xn--6-kvs; [B1 V5]; [B1 V5] # ᯱ𐹳𐹵𞤼.6ⴅ -B; xn--zzfy954hga2415t.xn--6-h0g; [B1 V5 V6]; [B1 V5 V6] # ᯱ𐹳𐹵𞤼.6Ⴅ -B; \u1BF1𐹳𐹵𞤼。𝟨ⴅ; [B1 V5]; [B1 V5] # ᯱ𐹳𐹵𞤼.6ⴅ -B; \u1BF1𐹳𐹵𞤚。6ⴅ; [B1 V5]; [B1 V5] # ᯱ𐹳𐹵𞤼.6ⴅ -B; \u1BF1𐹳𐹵𞤚。𝟨ⴅ; [B1 V5]; [B1 V5] # ᯱ𐹳𐹵𞤼.6ⴅ -B; -。︒; [P1 V3 V6]; [P1 V3 V6] -B; -。。; [V3 A4_2]; [V3 A4_2] -B; -..; [V3 A4_2]; [V3 A4_2] -B; -.xn--y86c; [V3 V6]; [V3 V6] -B; \u07DBჀ。-⁵--; [B1 B2 B3 P1 V2 V3 V6]; [B1 B2 B3 P1 V2 V3 V6] # ߛჀ.-5-- -B; \u07DBჀ。-5--; [B1 B2 B3 P1 V2 V3 V6]; [B1 B2 B3 P1 V2 V3 V6] # ߛჀ.-5-- -B; \u07DBⴠ。-5--; [B1 B2 B3 V2 V3]; [B1 B2 B3 V2 V3] # ߛⴠ.-5-- -B; xn--2sb691q.-5--; [B1 B2 B3 V2 V3]; [B1 B2 B3 V2 V3] # ߛⴠ.-5-- -B; xn--2sb866b.-5--; [B1 B2 B3 V2 V3 V6]; [B1 B2 B3 V2 V3 V6] # ߛჀ.-5-- -B; \u07DBⴠ。-⁵--; [B1 B2 B3 V2 V3]; [B1 B2 B3 V2 V3] # ߛⴠ.-5-- -B; ≯\uD8DD󠑕。𐹷𐹻≯𐷒; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -B; >\u0338\uD8DD󠑕。𐹷𐹻>\u0338𐷒; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -B; ≯\uD8DD󠑕。𐹷𐹻≯𐷒; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -B; >\u0338\uD8DD󠑕。𐹷𐹻>\u0338𐷒; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -B; ≯\uD8DD󠑕.xn--hdh8283gdoaqa; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -B; >\u0338\uD8DD󠑕.xn--hdh8283gdoaqa; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -B; >\u0338\uD8DD󠑕.XN--HDH8283GDOAQA; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -B; ≯\uD8DD󠑕.XN--HDH8283GDOAQA; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -B; ≯\uD8DD󠑕.Xn--Hdh8283gdoaqa; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -B; >\u0338\uD8DD󠑕.Xn--Hdh8283gdoaqa; [B1 P1 V6]; [B1 P1 V6 A3] # ≯.𐹷𐹻≯ -T; ㍔\u08E6\u077C\u200D。\u0346򁳊𝅶\u0604; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ルーブルࣦݼ.͆ -N; ㍔\u08E6\u077C\u200D。\u0346򁳊𝅶\u0604; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 C2 P1 V5 V6] # ルーブルࣦݼ.͆ -T; ルーブル\u08E6\u077C\u200D。\u0346򁳊𝅶\u0604; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ルーブルࣦݼ.͆ -N; ルーブル\u08E6\u077C\u200D。\u0346򁳊𝅶\u0604; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 C2 P1 V5 V6] # ルーブルࣦݼ.͆ -T; ルーフ\u3099ル\u08E6\u077C\u200D。\u0346򁳊𝅶\u0604; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ルーブルࣦݼ.͆ -N; ルーフ\u3099ル\u08E6\u077C\u200D。\u0346򁳊𝅶\u0604; [B1 B5 B6 C2 P1 V5 V6]; [B1 B5 B6 C2 P1 V5 V6] # ルーブルࣦݼ.͆ -B; xn--dqb73el09fncab4h.xn--kua81ls548d3608b; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ルーブルࣦݼ.͆ -B; xn--dqb73ec22c9kp8cb1j.xn--kua81ls548d3608b; [B1 B5 B6 C2 V5 V6]; [B1 B5 B6 C2 V5 V6] # ルーブルࣦݼ.͆ -T; \u200D.F; [C2]; [A4_2] # .f -N; \u200D.F; [C2]; [C2] # .f -T; \u200D.f; [C2]; [A4_2] # .f -N; \u200D.f; [C2]; [C2] # .f -B; .f; [A4_2]; [A4_2] -B; xn--1ug.f; [C2]; [C2] # .f -B; f; ; -T; \u200D㨲。ß; [C2]; xn--9bm.ss # 㨲.ß -N; \u200D㨲。ß; [C2]; [C2] # 㨲.ß -T; \u200D㨲。ß; [C2]; xn--9bm.ss # 㨲.ß -N; \u200D㨲。ß; [C2]; [C2] # 㨲.ß -T; \u200D㨲。SS; [C2]; xn--9bm.ss # 㨲.ss -N; \u200D㨲。SS; [C2]; [C2] # 㨲.ss -T; \u200D㨲。ss; [C2]; xn--9bm.ss # 㨲.ss -N; \u200D㨲。ss; [C2]; [C2] # 㨲.ss -T; \u200D㨲。Ss; [C2]; xn--9bm.ss # 㨲.ss -N; \u200D㨲。Ss; [C2]; [C2] # 㨲.ss -B; xn--9bm.ss; 㨲.ss; xn--9bm.ss -B; 㨲.ss; ; xn--9bm.ss -B; 㨲.SS; 㨲.ss; xn--9bm.ss -B; 㨲.Ss; 㨲.ss; xn--9bm.ss -B; xn--1ug914h.ss; [C2]; [C2] # 㨲.ss -B; xn--1ug914h.xn--zca; [C2]; [C2] # 㨲.ß -T; \u200D㨲。SS; [C2]; xn--9bm.ss # 㨲.ss -N; \u200D㨲。SS; [C2]; [C2] # 㨲.ss -T; \u200D㨲。ss; [C2]; xn--9bm.ss # 㨲.ss -N; \u200D㨲。ss; [C2]; [C2] # 㨲.ss -T; \u200D㨲。Ss; [C2]; xn--9bm.ss # 㨲.ss -N; \u200D㨲。Ss; [C2]; [C2] # 㨲.ss -B; \u0605\u067E。\u08A8; [B1 P1 V6]; [B1 P1 V6] # پ.ࢨ -B; \u0605\u067E。\u08A8; [B1 P1 V6]; [B1 P1 V6] # پ.ࢨ -B; xn--nfb6v.xn--xyb; [B1 V6]; [B1 V6] # پ.ࢨ -B; ⾑\u0753𞤁。𐹵\u0682; [B1 B5 B6]; [B1 B5 B6] # 襾ݓ𞤣.𐹵ڂ -B; 襾\u0753𞤁。𐹵\u0682; [B1 B5 B6]; [B1 B5 B6] # 襾ݓ𞤣.𐹵ڂ -B; 襾\u0753𞤣。𐹵\u0682; [B1 B5 B6]; [B1 B5 B6] # 襾ݓ𞤣.𐹵ڂ -B; xn--6ob9577deqwl.xn--7ib5526k; [B1 B5 B6]; [B1 B5 B6] # 襾ݓ𞤣.𐹵ڂ -B; ⾑\u0753𞤣。𐹵\u0682; [B1 B5 B6]; [B1 B5 B6] # 襾ݓ𞤣.𐹵ڂ -T; 񦴻ς-\u20EB。\u0754-ꡛ; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # ς-⃫.ݔ-ꡛ -N; 񦴻ς-\u20EB。\u0754-ꡛ; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # ς-⃫.ݔ-ꡛ -T; 񦴻ς-\u20EB。\u0754-ꡛ; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # ς-⃫.ݔ-ꡛ -N; 񦴻ς-\u20EB。\u0754-ꡛ; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # ς-⃫.ݔ-ꡛ -B; 񦴻Σ-\u20EB。\u0754-ꡛ; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # σ-⃫.ݔ-ꡛ -B; 񦴻σ-\u20EB。\u0754-ꡛ; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # σ-⃫.ݔ-ꡛ -B; xn----zmb705tuo34l.xn----53c4874j; [B2 B3 B6 V6]; [B2 B3 B6 V6] # σ-⃫.ݔ-ꡛ -B; xn----xmb015tuo34l.xn----53c4874j; [B2 B3 B6 V6]; [B2 B3 B6 V6] # ς-⃫.ݔ-ꡛ -B; 񦴻Σ-\u20EB。\u0754-ꡛ; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # σ-⃫.ݔ-ꡛ -B; 񦴻σ-\u20EB。\u0754-ꡛ; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # σ-⃫.ݔ-ꡛ -T; \u200D.􀸨; [C2 P1 V6]; [P1 V6 A4_2] # . -N; \u200D.􀸨; [C2 P1 V6]; [C2 P1 V6] # . -T; \u200D.􀸨; [C2 P1 V6]; [P1 V6 A4_2] # . -N; \u200D.􀸨; [C2 P1 V6]; [C2 P1 V6] # . -B; .xn--h327f; [V6 A4_2]; [V6 A4_2] -B; xn--1ug.xn--h327f; [C2 V6]; [C2 V6] # . -B; 񣭻񌥁。≠𝟲; [P1 V6]; [P1 V6] -B; 񣭻񌥁。=\u0338𝟲; [P1 V6]; [P1 V6] -B; 񣭻񌥁。≠6; [P1 V6]; [P1 V6] -B; 񣭻񌥁。=\u03386; [P1 V6]; [P1 V6] -B; xn--h79w4z99a.xn--6-tfo; [V6]; [V6] -T; 󠅊ᡭ\u200D.𐥡; [B6 C2 P1 V6]; [P1 V6] # ᡭ. -N; 󠅊ᡭ\u200D.𐥡; [B6 C2 P1 V6]; [B6 C2 P1 V6] # ᡭ. -B; xn--98e.xn--om9c; [V6]; [V6] -B; xn--98e810b.xn--om9c; [B6 C2 V6]; [B6 C2 V6] # ᡭ. -B; \u0C40\u0855𐥛𑄴.󭰵; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ీࡕ𑄴. -B; \u0C40\u0855𐥛𑄴.󭰵; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ీࡕ𑄴. -B; xn--kwb91r5112avtg.xn--o580f; [B1 V5 V6]; [B1 V5 V6] # ీࡕ𑄴. -T; 𞤮。𑇊\u200C≯\u1CE6; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤮.𑇊≯᳦ -N; 𞤮。𑇊\u200C≯\u1CE6; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𞤮.𑇊≯᳦ -T; 𞤮。𑇊\u200C>\u0338\u1CE6; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤮.𑇊≯᳦ -N; 𞤮。𑇊\u200C>\u0338\u1CE6; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𞤮.𑇊≯᳦ -T; 𞤌。𑇊\u200C>\u0338\u1CE6; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤮.𑇊≯᳦ -N; 𞤌。𑇊\u200C>\u0338\u1CE6; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𞤮.𑇊≯᳦ -T; 𞤌。𑇊\u200C≯\u1CE6; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤮.𑇊≯᳦ -N; 𞤌。𑇊\u200C≯\u1CE6; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𞤮.𑇊≯᳦ -B; xn--me6h.xn--z6fz8ueq2v; [B1 V5 V6]; [B1 V5 V6] # 𞤮.𑇊≯᳦ -B; xn--me6h.xn--z6f16kn9b2642b; [B1 C1 V5 V6]; [B1 C1 V5 V6] # 𞤮.𑇊≯᳦ -B; 󠄀𝟕.𞤌񛗓Ⴉ; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] -B; 󠄀7.𞤌񛗓Ⴉ; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] -B; 󠄀7.𞤮񛗓ⴉ; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] -B; 7.xn--0kjz523lv1vv; [B1 B2 B3 V6]; [B1 B2 B3 V6] -B; 7.xn--hnd3403vv1vv; [B1 B2 B3 V6]; [B1 B2 B3 V6] -B; 󠄀𝟕.𞤮񛗓ⴉ; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] -B; 󠄀7.𞤌񛗓ⴉ; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] -B; 󠄀𝟕.𞤌񛗓ⴉ; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] -B; 閃9𝩍。Ↄ\u0669\u08B1\u0B4D; [B5 B6 P1 V6]; [B5 B6 P1 V6] # 閃9𝩍.Ↄ٩ࢱ୍ -B; 閃9𝩍。ↄ\u0669\u08B1\u0B4D; [B5 B6]; [B5 B6] # 閃9𝩍.ↄ٩ࢱ୍ -B; xn--9-3j6dk517f.xn--iib28ij3c4t9a; [B5 B6]; [B5 B6] # 閃9𝩍.ↄ٩ࢱ୍ -B; xn--9-3j6dk517f.xn--iib28ij3c0t9a; [B5 B6 V6]; [B5 B6 V6] # 閃9𝩍.Ↄ٩ࢱ୍ -B; \uAAF6ᢏ\u0E3A2.𐋢\u0745\u0F9F︒; [P1 V5 V6]; [P1 V5 V6] # ꫶ᢏฺ2.𐋢݅ྟ︒ -B; \uAAF6ᢏ\u0E3A2.𐋢\u0745\u0F9F。; [V5]; [V5] # ꫶ᢏฺ2.𐋢݅ྟ. -B; xn--2-2zf840fk16m.xn--sob093b2m7s.; [V5]; [V5] # ꫶ᢏฺ2.𐋢݅ྟ. -B; xn--2-2zf840fk16m.xn--sob093bj62sz9d; [V5 V6]; [V5 V6] # ꫶ᢏฺ2.𐋢݅ྟ︒ -B; 󅴧。≠-󠙄⾛; [P1 V6]; [P1 V6] -B; 󅴧。=\u0338-󠙄⾛; [P1 V6]; [P1 V6] -B; 󅴧。≠-󠙄走; [P1 V6]; [P1 V6] -B; 󅴧。=\u0338-󠙄走; [P1 V6]; [P1 V6] -B; xn--gm57d.xn----tfo4949b3664m; [V6]; [V6] -B; \u076E\u0604Ⴊ。-≠\u1160; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # ݮႪ.-≠ -B; \u076E\u0604Ⴊ。-=\u0338\u1160; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # ݮႪ.-≠ -B; \u076E\u0604ⴊ。-=\u0338\u1160; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # ݮⴊ.-≠ -B; \u076E\u0604ⴊ。-≠\u1160; [B1 B2 B3 P1 V3 V6]; [B1 B2 B3 P1 V3 V6] # ݮⴊ.-≠ -B; xn--mfb73ek93f.xn----5bh589i; [B1 B2 B3 V3 V6]; [B1 B2 B3 V3 V6] # ݮⴊ.-≠ -B; xn--mfb73ex6r.xn----5bh589i; [B1 B2 B3 V3 V6]; [B1 B2 B3 V3 V6] # ݮႪ.-≠ -T; \uFB4F𐹧𝟒≯。\u200C; [B1 B3 B4 C1 P1 V6]; [B3 B4 P1 V6] # אל𐹧4≯. -N; \uFB4F𐹧𝟒≯。\u200C; [B1 B3 B4 C1 P1 V6]; [B1 B3 B4 C1 P1 V6] # אל𐹧4≯. -T; \uFB4F𐹧𝟒>\u0338。\u200C; [B1 B3 B4 C1 P1 V6]; [B3 B4 P1 V6] # אל𐹧4≯. -N; \uFB4F𐹧𝟒>\u0338。\u200C; [B1 B3 B4 C1 P1 V6]; [B1 B3 B4 C1 P1 V6] # אל𐹧4≯. -T; \u05D0\u05DC𐹧4≯。\u200C; [B1 B3 B4 C1 P1 V6]; [B3 B4 P1 V6] # אל𐹧4≯. -N; \u05D0\u05DC𐹧4≯。\u200C; [B1 B3 B4 C1 P1 V6]; [B1 B3 B4 C1 P1 V6] # אל𐹧4≯. -T; \u05D0\u05DC𐹧4>\u0338。\u200C; [B1 B3 B4 C1 P1 V6]; [B3 B4 P1 V6] # אל𐹧4≯. -N; \u05D0\u05DC𐹧4>\u0338。\u200C; [B1 B3 B4 C1 P1 V6]; [B1 B3 B4 C1 P1 V6] # אל𐹧4≯. -B; xn--4-zhc0by36txt0w.; [B3 B4 V6]; [B3 B4 V6] # אל𐹧4≯. -B; xn--4-zhc0by36txt0w.xn--0ug; [B1 B3 B4 C1 V6]; [B1 B3 B4 C1 V6] # אל𐹧4≯. -B; 𝟎。甯; 0.甯; 0.xn--qny -B; 0。甯; 0.甯; 0.xn--qny -B; 0.xn--qny; 0.甯; 0.xn--qny -B; 0.甯; ; 0.xn--qny -B; -⾆.\uAAF6; [V3 V5]; [V3 V5] # -舌.꫶ -B; -舌.\uAAF6; [V3 V5]; [V3 V5] # -舌.꫶ -B; xn----ef8c.xn--2v9a; [V3 V5]; [V3 V5] # -舌.꫶ -B; -。ᢘ; [V3]; [V3] -B; -。ᢘ; [V3]; [V3] -B; -.xn--ibf; [V3]; [V3] -B; 🂴Ⴋ.≮; [P1 V6]; [P1 V6] -B; 🂴Ⴋ.<\u0338; [P1 V6]; [P1 V6] -B; 🂴ⴋ.<\u0338; [P1 V6]; [P1 V6] -B; 🂴ⴋ.≮; [P1 V6]; [P1 V6] -B; xn--2kj7565l.xn--gdh; [V6]; [V6] -B; xn--jnd1986v.xn--gdh; [V6]; [V6] -T; 璼𝨭。\u200C󠇟; [C1]; xn--gky8837e. # 璼𝨭. -N; 璼𝨭。\u200C󠇟; [C1]; [C1] # 璼𝨭. -T; 璼𝨭。\u200C󠇟; [C1]; xn--gky8837e. # 璼𝨭. -N; 璼𝨭。\u200C󠇟; [C1]; [C1] # 璼𝨭. -B; xn--gky8837e.; 璼𝨭.; xn--gky8837e. -B; 璼𝨭.; ; xn--gky8837e. -B; xn--gky8837e.xn--0ug; [C1]; [C1] # 璼𝨭. -B; \u06698񂍽。-5🞥; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ٩8.-5🞥 -B; \u06698񂍽。-5🞥; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ٩8.-5🞥 -B; xn--8-qqc97891f.xn---5-rp92a; [B1 V3 V6]; [B1 V3 V6] # ٩8.-5🞥 -T; \u200C.\u200C; [C1]; [A4_2] # . -N; \u200C.\u200C; [C1]; [C1] # . -B; xn--0ug.xn--0ug; [C1]; [C1] # . -T; \u200D튛.\u0716; [B1 C2]; xn--157b.xn--gnb # 튛.ܖ -N; \u200D튛.\u0716; [B1 C2]; [B1 C2] # 튛.ܖ -T; \u200D튛.\u0716; [B1 C2]; xn--157b.xn--gnb # 튛.ܖ -N; \u200D튛.\u0716; [B1 C2]; [B1 C2] # 튛.ܖ -B; xn--157b.xn--gnb; 튛.\u0716; xn--157b.xn--gnb # 튛.ܖ -B; 튛.\u0716; ; xn--157b.xn--gnb # 튛.ܖ -B; 튛.\u0716; 튛.\u0716; xn--157b.xn--gnb # 튛.ܖ -B; xn--1ug4441e.xn--gnb; [B1 C2]; [B1 C2] # 튛.ܖ -B; ᡋ𐹰𞽳.\u0779ⴞ; [B2 B3 B5 B6 P1 V6]; [B2 B3 B5 B6 P1 V6] # ᡋ𐹰.ݹⴞ -B; ᡋ𐹰𞽳.\u0779Ⴞ; [B2 B3 B5 B6 P1 V6]; [B2 B3 B5 B6 P1 V6] # ᡋ𐹰.ݹႾ -B; xn--b8e0417jocvf.xn--9pb068b; [B2 B3 B5 B6 V6]; [B2 B3 B5 B6 V6] # ᡋ𐹰.ݹႾ -B; xn--b8e0417jocvf.xn--9pb883q; [B2 B3 B5 B6 V6]; [B2 B3 B5 B6 V6] # ᡋ𐹰.ݹⴞ -B; 𐷃\u0662𝅻𝟧.𐹮𐹬Ⴇ; [B1 B4 P1 V6]; [B1 B4 P1 V6] # ٢𝅻5.𐹮𐹬Ⴇ -B; 𐷃\u0662𝅻5.𐹮𐹬Ⴇ; [B1 B4 P1 V6]; [B1 B4 P1 V6] # ٢𝅻5.𐹮𐹬Ⴇ -B; 𐷃\u0662𝅻5.𐹮𐹬ⴇ; [B1 B4 P1 V6]; [B1 B4 P1 V6] # ٢𝅻5.𐹮𐹬ⴇ -B; xn--5-cqc8833rhv7f.xn--ykjz523efa; [B1 B4 V6]; [B1 B4 V6] # ٢𝅻5.𐹮𐹬ⴇ -B; xn--5-cqc8833rhv7f.xn--fnd3401kfa; [B1 B4 V6]; [B1 B4 V6] # ٢𝅻5.𐹮𐹬Ⴇ -B; 𐷃\u0662𝅻𝟧.𐹮𐹬ⴇ; [B1 B4 P1 V6]; [B1 B4 P1 V6] # ٢𝅻5.𐹮𐹬ⴇ -B; Ⴗ.\u05C2𑄴\uA9B7񘃨; [P1 V5 V6]; [P1 V5 V6] # Ⴗ.𑄴ׂꦷ -B; Ⴗ.𑄴\u05C2\uA9B7񘃨; [P1 V5 V6]; [P1 V5 V6] # Ⴗ.𑄴ׂꦷ -B; Ⴗ.𑄴\u05C2\uA9B7񘃨; [P1 V5 V6]; [P1 V5 V6] # Ⴗ.𑄴ׂꦷ -B; ⴗ.𑄴\u05C2\uA9B7񘃨; [P1 V5 V6]; [P1 V5 V6] # ⴗ.𑄴ׂꦷ -B; xn--flj.xn--qdb0605f14ycrms3c; [V5 V6]; [V5 V6] # ⴗ.𑄴ׂꦷ -B; xn--vnd.xn--qdb0605f14ycrms3c; [V5 V6]; [V5 V6] # Ⴗ.𑄴ׂꦷ -B; ⴗ.𑄴\u05C2\uA9B7񘃨; [P1 V5 V6]; [P1 V5 V6] # ⴗ.𑄴ׂꦷ -B; ⴗ.\u05C2𑄴\uA9B7񘃨; [P1 V5 V6]; [P1 V5 V6] # ⴗ.𑄴ׂꦷ -B; 𝟾𾤘.򇕛\u066C; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # 8.٬ -B; 8𾤘.򇕛\u066C; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # 8.٬ -B; xn--8-kh23b.xn--lib78461i; [B1 B5 B6 V6]; [B1 B5 B6 V6] # 8.٬ -B; ⒈酫︒。\u08D6; [P1 V5 V6]; [P1 V5 V6] # ⒈酫︒.ࣖ -B; 1.酫。。\u08D6; [V5 A4_2]; [V5 A4_2] # 1.酫..ࣖ -B; 1.xn--8j4a..xn--8zb; [V5 A4_2]; [V5 A4_2] # 1.酫..ࣖ -B; xn--tsh4490bfe8c.xn--8zb; [V5 V6]; [V5 V6] # ⒈酫︒.ࣖ -T; \u2DE3\u200C≮\u1A6B.\u200C\u0E3A; [C1 P1 V5 V6]; [P1 V5 V6] # ⷣ≮ᩫ.ฺ -N; \u2DE3\u200C≮\u1A6B.\u200C\u0E3A; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ⷣ≮ᩫ.ฺ -T; \u2DE3\u200C<\u0338\u1A6B.\u200C\u0E3A; [C1 P1 V5 V6]; [P1 V5 V6] # ⷣ≮ᩫ.ฺ -N; \u2DE3\u200C<\u0338\u1A6B.\u200C\u0E3A; [C1 P1 V5 V6]; [C1 P1 V5 V6] # ⷣ≮ᩫ.ฺ -B; xn--uof548an0j.xn--o4c; [V5 V6]; [V5 V6] # ⷣ≮ᩫ.ฺ -B; xn--uof63xk4bf3s.xn--o4c732g; [C1 V5 V6]; [C1 V5 V6] # ⷣ≮ᩫ.ฺ -T; 𞪂。ႷႽ¹\u200D; [B6 C2 P1 V6]; [P1 V6] # .ႷႽ1 -N; 𞪂。ႷႽ¹\u200D; [B6 C2 P1 V6]; [B6 C2 P1 V6] # .ႷႽ1 -T; 𞪂。ႷႽ1\u200D; [B6 C2 P1 V6]; [P1 V6] # .ႷႽ1 -N; 𞪂。ႷႽ1\u200D; [B6 C2 P1 V6]; [B6 C2 P1 V6] # .ႷႽ1 -T; 𞪂。ⴗⴝ1\u200D; [B6 C2 P1 V6]; [P1 V6] # .ⴗⴝ1 -N; 𞪂。ⴗⴝ1\u200D; [B6 C2 P1 V6]; [B6 C2 P1 V6] # .ⴗⴝ1 -T; 𞪂。Ⴗⴝ1\u200D; [B6 C2 P1 V6]; [P1 V6] # .Ⴗⴝ1 -N; 𞪂。Ⴗⴝ1\u200D; [B6 C2 P1 V6]; [B6 C2 P1 V6] # .Ⴗⴝ1 -B; xn--co6h.xn--1-h1g429s; [V6]; [V6] -B; xn--co6h.xn--1-h1g398iewm; [B6 C2 V6]; [B6 C2 V6] # .Ⴗⴝ1 -B; xn--co6h.xn--1-kwssa; [V6]; [V6] -B; xn--co6h.xn--1-ugn710dya; [B6 C2 V6]; [B6 C2 V6] # .ⴗⴝ1 -B; xn--co6h.xn--1-h1gs; [V6]; [V6] -B; xn--co6h.xn--1-h1gs597m; [B6 C2 V6]; [B6 C2 V6] # .ႷႽ1 -T; 𞪂。ⴗⴝ¹\u200D; [B6 C2 P1 V6]; [P1 V6] # .ⴗⴝ1 -N; 𞪂。ⴗⴝ¹\u200D; [B6 C2 P1 V6]; [B6 C2 P1 V6] # .ⴗⴝ1 -T; 𞪂。Ⴗⴝ¹\u200D; [B6 C2 P1 V6]; [P1 V6] # .Ⴗⴝ1 -N; 𞪂。Ⴗⴝ¹\u200D; [B6 C2 P1 V6]; [B6 C2 P1 V6] # .Ⴗⴝ1 -B; 𑄴𑄳2.𞳿󠀳-; [B1 B3 P1 V3 V5 V6]; [B1 B3 P1 V3 V5 V6] -B; xn--2-h87ic.xn----s39r33498d; [B1 B3 V3 V5 V6]; [B1 B3 V3 V5 V6] -B; 󠕲󟶶\u0665。񀁁𑄳𞤃\u0710; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ٥.𑄳𞤥ܐ -B; 󠕲󟶶\u0665。񀁁𑄳𞤃\u0710; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ٥.𑄳𞤥ܐ -B; 󠕲󟶶\u0665。񀁁𑄳𞤥\u0710; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ٥.𑄳𞤥ܐ -B; xn--eib57614py3ea.xn--9mb5737kqnpfzkwr; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ٥.𑄳𞤥ܐ -B; 󠕲󟶶\u0665。񀁁𑄳𞤥\u0710; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ٥.𑄳𞤥ܐ -T; \u0720򲠽𐹢\u17BB。ςᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 P1 V6] # ܠ𐹢ុ.ςᢈ🝭 -N; \u0720򲠽𐹢\u17BB。ςᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 C1 P1 V6] # ܠ𐹢ុ.ςᢈ🝭 -T; \u0720򲠽𐹢\u17BB。ςᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 P1 V6] # ܠ𐹢ុ.ςᢈ🝭 -N; \u0720򲠽𐹢\u17BB。ςᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 C1 P1 V6] # ܠ𐹢ុ.ςᢈ🝭 -T; \u0720򲠽𐹢\u17BB。Σᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 P1 V6] # ܠ𐹢ុ.σᢈ🝭 -N; \u0720򲠽𐹢\u17BB。Σᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 C1 P1 V6] # ܠ𐹢ុ.σᢈ🝭 -T; \u0720򲠽𐹢\u17BB。σᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 P1 V6] # ܠ𐹢ុ.σᢈ🝭 -N; \u0720򲠽𐹢\u17BB。σᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 C1 P1 V6] # ܠ𐹢ុ.σᢈ🝭 -B; xn--qnb616fis0qzt36f.xn--4xa847hli46a; [B2 B6 V6]; [B2 B6 V6] # ܠ𐹢ុ.σᢈ🝭 -B; xn--qnb616fis0qzt36f.xn--4xa847h6ofgl44c; [B2 B6 C1 V6]; [B2 B6 C1 V6] # ܠ𐹢ុ.σᢈ🝭 -B; xn--qnb616fis0qzt36f.xn--3xa057h6ofgl44c; [B2 B6 C1 V6]; [B2 B6 C1 V6] # ܠ𐹢ុ.ςᢈ🝭 -T; \u0720򲠽𐹢\u17BB。Σᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 P1 V6] # ܠ𐹢ុ.σᢈ🝭 -N; \u0720򲠽𐹢\u17BB。Σᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 C1 P1 V6] # ܠ𐹢ុ.σᢈ🝭 -T; \u0720򲠽𐹢\u17BB。σᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 P1 V6] # ܠ𐹢ុ.σᢈ🝭 -N; \u0720򲠽𐹢\u17BB。σᢈ🝭\u200C; [B2 B6 C1 P1 V6]; [B2 B6 C1 P1 V6] # ܠ𐹢ុ.σᢈ🝭 -T; \u200D--≮。𐹧; [B1 C2 P1 V6]; [B1 P1 V3 V6] # --≮.𐹧 -N; \u200D--≮。𐹧; [B1 C2 P1 V6]; [B1 C2 P1 V6] # --≮.𐹧 -T; \u200D--<\u0338。𐹧; [B1 C2 P1 V6]; [B1 P1 V3 V6] # --≮.𐹧 -N; \u200D--<\u0338。𐹧; [B1 C2 P1 V6]; [B1 C2 P1 V6] # --≮.𐹧 -B; xn-----ujv.xn--fo0d; [B1 V3 V6]; [B1 V3 V6] -B; xn-----l1tz1k.xn--fo0d; [B1 C2 V6]; [B1 C2 V6] # --≮.𐹧 -B; \uA806。𻚏\u0FB0⒕; [P1 V5 V6]; [P1 V5 V6] # ꠆.ྰ⒕ -B; \uA806。𻚏\u0FB014.; [P1 V5 V6]; [P1 V5 V6] # ꠆.ྰ14. -B; xn--l98a.xn--14-jsj57880f.; [V5 V6]; [V5 V6] # ꠆.ྰ14. -B; xn--l98a.xn--dgd218hhp28d; [V5 V6]; [V5 V6] # ꠆.ྰ⒕ -B; 򮉂\u06BC.𑆺\u0669; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ڼ.𑆺٩ -B; 򮉂\u06BC.𑆺\u0669; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # ڼ.𑆺٩ -B; xn--vkb92243l.xn--iib9797k; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # ڼ.𑆺٩ -B; 󠁎\u06D0-。𞤴; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ې-.𞤴 -B; 󠁎\u06D0-。𞤒; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ې-.𞤴 -B; xn----mwc72685y.xn--se6h; [B1 V3 V6]; [B1 V3 V6] # ې-.𞤴 -T; 𝟠4󠇗𝈻.\u200D𐋵⛧\u200D; [C2]; xn--84-s850a.xn--59h6326e # 84𝈻.𐋵⛧ -N; 𝟠4󠇗𝈻.\u200D𐋵⛧\u200D; [C2]; [C2] # 84𝈻.𐋵⛧ -T; 84󠇗𝈻.\u200D𐋵⛧\u200D; [C2]; xn--84-s850a.xn--59h6326e # 84𝈻.𐋵⛧ -N; 84󠇗𝈻.\u200D𐋵⛧\u200D; [C2]; [C2] # 84𝈻.𐋵⛧ -B; xn--84-s850a.xn--59h6326e; 84𝈻.𐋵⛧; xn--84-s850a.xn--59h6326e; NV8 -B; 84𝈻.𐋵⛧; ; xn--84-s850a.xn--59h6326e; NV8 -B; xn--84-s850a.xn--1uga573cfq1w; [C2]; [C2] # 84𝈻.𐋵⛧ -B; -\u0601。ᡪ; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.ᡪ -B; -\u0601。ᡪ; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.ᡪ -B; xn----tkc.xn--68e; [B1 V3 V6]; [B1 V3 V6] # -.ᡪ -T; ≮𝟕.謖ß≯; [P1 V6]; [P1 V6] -N; ≮𝟕.謖ß≯; [P1 V6]; [P1 V6] -T; <\u0338𝟕.謖ß>\u0338; [P1 V6]; [P1 V6] -N; <\u0338𝟕.謖ß>\u0338; [P1 V6]; [P1 V6] -T; ≮7.謖ß≯; [P1 V6]; [P1 V6] -N; ≮7.謖ß≯; [P1 V6]; [P1 V6] -T; <\u03387.謖ß>\u0338; [P1 V6]; [P1 V6] -N; <\u03387.謖ß>\u0338; [P1 V6]; [P1 V6] -B; <\u03387.謖SS>\u0338; [P1 V6]; [P1 V6] -B; ≮7.謖SS≯; [P1 V6]; [P1 V6] -B; ≮7.謖ss≯; [P1 V6]; [P1 V6] -B; <\u03387.謖ss>\u0338; [P1 V6]; [P1 V6] -B; <\u03387.謖Ss>\u0338; [P1 V6]; [P1 V6] -B; ≮7.謖Ss≯; [P1 V6]; [P1 V6] -B; xn--7-mgo.xn--ss-xjvv174c; [V6]; [V6] -B; xn--7-mgo.xn--zca892oly5e; [V6]; [V6] -B; <\u0338𝟕.謖SS>\u0338; [P1 V6]; [P1 V6] -B; ≮𝟕.謖SS≯; [P1 V6]; [P1 V6] -B; ≮𝟕.謖ss≯; [P1 V6]; [P1 V6] -B; <\u0338𝟕.謖ss>\u0338; [P1 V6]; [P1 V6] -B; <\u0338𝟕.謖Ss>\u0338; [P1 V6]; [P1 V6] -B; ≮𝟕.謖Ss≯; [P1 V6]; [P1 V6] -B; 朶Ⴉ𞪡.𝨽\u0825📻-; [B1 B5 B6 P1 V3 V5 V6]; [B1 B5 B6 P1 V3 V5 V6] # 朶Ⴉ.𝨽ࠥ📻- -B; 朶ⴉ𞪡.𝨽\u0825📻-; [B1 B5 B6 P1 V3 V5 V6]; [B1 B5 B6 P1 V3 V5 V6] # 朶ⴉ.𝨽ࠥ📻- -B; xn--0kjz47pd57t.xn----3gd37096apmwa; [B1 B5 B6 V3 V5 V6]; [B1 B5 B6 V3 V5 V6] # 朶ⴉ.𝨽ࠥ📻- -B; xn--hnd7245bd56p.xn----3gd37096apmwa; [B1 B5 B6 V3 V5 V6]; [B1 B5 B6 V3 V5 V6] # 朶Ⴉ.𝨽ࠥ📻- -T; 𐤎。󑿰\u200C≮\u200D; [B6 C1 C2 P1 V6]; [B6 P1 V6] # 𐤎.≮ -N; 𐤎。󑿰\u200C≮\u200D; [B6 C1 C2 P1 V6]; [B6 C1 C2 P1 V6] # 𐤎.≮ -T; 𐤎。󑿰\u200C<\u0338\u200D; [B6 C1 C2 P1 V6]; [B6 P1 V6] # 𐤎.≮ -N; 𐤎。󑿰\u200C<\u0338\u200D; [B6 C1 C2 P1 V6]; [B6 C1 C2 P1 V6] # 𐤎.≮ -B; xn--bk9c.xn--gdhx6802k; [B6 V6]; [B6 V6] -B; xn--bk9c.xn--0ugc04p2u638c; [B6 C1 C2 V6]; [B6 C1 C2 V6] # 𐤎.≮ -T; 񭜎⒈。\u200C𝟤; [C1 P1 V6]; [P1 V6] # ⒈.2 -N; 񭜎⒈。\u200C𝟤; [C1 P1 V6]; [C1 P1 V6] # ⒈.2 -T; 񭜎1.。\u200C2; [C1 P1 V6 A4_2]; [P1 V6 A4_2] # 1..2 -N; 񭜎1.。\u200C2; [C1 P1 V6 A4_2]; [C1 P1 V6 A4_2] # 1..2 -B; xn--1-ex54e..2; [V6 A4_2]; [V6 A4_2] -B; xn--1-ex54e..xn--2-rgn; [C1 V6 A4_2]; [C1 V6 A4_2] # 1..2 -B; xn--tsh94183d.2; [V6]; [V6] -B; xn--tsh94183d.xn--2-rgn; [C1 V6]; [C1 V6] # ⒈.2 -T; 󠟊𐹤\u200D.𐹳󙄵𐹶; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹤.𐹳𐹶 -N; 󠟊𐹤\u200D.𐹳󙄵𐹶; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹤.𐹳𐹶 -T; 󠟊𐹤\u200D.𐹳󙄵𐹶; [B1 C2 P1 V6]; [B1 P1 V6] # 𐹤.𐹳𐹶 -N; 󠟊𐹤\u200D.𐹳󙄵𐹶; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 𐹤.𐹳𐹶 -B; xn--co0d98977c.xn--ro0dga22807v; [B1 V6]; [B1 V6] -B; xn--1ugy994g7k93g.xn--ro0dga22807v; [B1 C2 V6]; [B1 C2 V6] # 𐹤.𐹳𐹶 -B; 𞤴𐹻𑓂𐭝.\u094D\uFE07􉛯; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤴𐹻𑓂𐭝.् -B; 𞤴𐹻𑓂𐭝.\u094D\uFE07􉛯; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤴𐹻𑓂𐭝.् -B; 𞤒𐹻𑓂𐭝.\u094D\uFE07􉛯; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤴𐹻𑓂𐭝.् -B; xn--609c96c09grp2w.xn--n3b28708s; [B1 V5 V6]; [B1 V5 V6] # 𞤴𐹻𑓂𐭝.् -B; 𞤒𐹻𑓂𐭝.\u094D\uFE07􉛯; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𞤴𐹻𑓂𐭝.् -B; \u0668。𐹠𐹽񗮶; [B1 P1 V6]; [B1 P1 V6] # ٨.𐹠𐹽 -B; \u0668。𐹠𐹽񗮶; [B1 P1 V6]; [B1 P1 V6] # ٨.𐹠𐹽 -B; xn--hib.xn--7n0d2bu9196b; [B1 V6]; [B1 V6] # ٨.𐹠𐹽 -B; \u1160񍀜.8򶾵\u069C; [B1 P1 V6]; [B1 P1 V6] # .8ڜ -B; xn--psd85033d.xn--8-otc61545t; [B1 V6]; [B1 V6] # .8ڜ -T; \u200D\u200C󠆪。ß𑓃; [C1 C2]; [A4_2] # .ß𑓃 -N; \u200D\u200C󠆪。ß𑓃; [C1 C2]; [C1 C2] # .ß𑓃 -T; \u200D\u200C󠆪。ß𑓃; [C1 C2]; [A4_2] # .ß𑓃 -N; \u200D\u200C󠆪。ß𑓃; [C1 C2]; [C1 C2] # .ß𑓃 -T; \u200D\u200C󠆪。SS𑓃; [C1 C2]; [A4_2] # .ss𑓃 -N; \u200D\u200C󠆪。SS𑓃; [C1 C2]; [C1 C2] # .ss𑓃 -T; \u200D\u200C󠆪。ss𑓃; [C1 C2]; [A4_2] # .ss𑓃 -N; \u200D\u200C󠆪。ss𑓃; [C1 C2]; [C1 C2] # .ss𑓃 -T; \u200D\u200C󠆪。Ss𑓃; [C1 C2]; [A4_2] # .ss𑓃 -N; \u200D\u200C󠆪。Ss𑓃; [C1 C2]; [C1 C2] # .ss𑓃 -B; .xn--ss-bh7o; [A4_2]; [A4_2] -B; xn--0ugb.xn--ss-bh7o; [C1 C2]; [C1 C2] # .ss𑓃 -B; xn--0ugb.xn--zca0732l; [C1 C2]; [C1 C2] # .ß𑓃 -T; \u200D\u200C󠆪。SS𑓃; [C1 C2]; [A4_2] # .ss𑓃 -N; \u200D\u200C󠆪。SS𑓃; [C1 C2]; [C1 C2] # .ss𑓃 -T; \u200D\u200C󠆪。ss𑓃; [C1 C2]; [A4_2] # .ss𑓃 -N; \u200D\u200C󠆪。ss𑓃; [C1 C2]; [C1 C2] # .ss𑓃 -T; \u200D\u200C󠆪。Ss𑓃; [C1 C2]; [A4_2] # .ss𑓃 -N; \u200D\u200C󠆪。Ss𑓃; [C1 C2]; [C1 C2] # .ss𑓃 -B; xn--ss-bh7o; ss𑓃; xn--ss-bh7o -B; ss𑓃; ; xn--ss-bh7o -B; SS𑓃; ss𑓃; xn--ss-bh7o -B; Ss𑓃; ss𑓃; xn--ss-bh7o -T; ︒\u200Cヶ䒩.ꡪ; [C1 P1 V6]; [P1 V6] # ︒ヶ䒩.ꡪ -N; ︒\u200Cヶ䒩.ꡪ; [C1 P1 V6]; [C1 P1 V6] # ︒ヶ䒩.ꡪ -T; 。\u200Cヶ䒩.ꡪ; [C1 A4_2]; [A4_2] # .ヶ䒩.ꡪ -N; 。\u200Cヶ䒩.ꡪ; [C1 A4_2]; [C1 A4_2] # .ヶ䒩.ꡪ -B; .xn--qekw60d.xn--gd9a; [A4_2]; [A4_2] -B; .xn--0ug287dj0o.xn--gd9a; [C1 A4_2]; [C1 A4_2] # .ヶ䒩.ꡪ -B; xn--qekw60dns9k.xn--gd9a; [V6]; [V6] -B; xn--0ug287dj0or48o.xn--gd9a; [C1 V6]; [C1 V6] # ︒ヶ䒩.ꡪ -B; xn--qekw60d.xn--gd9a; ヶ䒩.ꡪ; xn--qekw60d.xn--gd9a -B; ヶ䒩.ꡪ; ; xn--qekw60d.xn--gd9a -T; \u200C⒈𤮍.󢓋\u1A60; [C1 P1 V6]; [P1 V6] # ⒈𤮍.᩠ -N; \u200C⒈𤮍.󢓋\u1A60; [C1 P1 V6]; [C1 P1 V6] # ⒈𤮍.᩠ -T; \u200C1.𤮍.󢓋\u1A60; [C1 P1 V6]; [P1 V6] # 1.𤮍.᩠ -N; \u200C1.𤮍.󢓋\u1A60; [C1 P1 V6]; [C1 P1 V6] # 1.𤮍.᩠ -B; 1.xn--4x6j.xn--jof45148n; [V6]; [V6] # 1.𤮍.᩠ -B; xn--1-rgn.xn--4x6j.xn--jof45148n; [C1 V6]; [C1 V6] # 1.𤮍.᩠ -B; xn--tshw462r.xn--jof45148n; [V6]; [V6] # ⒈𤮍.᩠ -B; xn--0ug88o7471d.xn--jof45148n; [C1 V6]; [C1 V6] # ⒈𤮍.᩠ -T; ⒈\u200C𐫓󠀺。\u1A60񤰵\u200D; [B1 C1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ⒈𐫓.᩠ -N; ⒈\u200C𐫓󠀺。\u1A60񤰵\u200D; [B1 C1 C2 P1 V5 V6]; [B1 C1 C2 P1 V5 V6] # ⒈𐫓.᩠ -T; 1.\u200C𐫓󠀺。\u1A60񤰵\u200D; [B1 C1 C2 P1 V5 V6]; [B1 B3 P1 V5 V6] # 1.𐫓.᩠ -N; 1.\u200C𐫓󠀺。\u1A60񤰵\u200D; [B1 C1 C2 P1 V5 V6]; [B1 C1 C2 P1 V5 V6] # 1.𐫓.᩠ -B; 1.xn--8w9c40377c.xn--jofz5294e; [B1 B3 V5 V6]; [B1 B3 V5 V6] # 1.𐫓.᩠ -B; 1.xn--0ug8853gk263g.xn--jof95xex98m; [B1 C1 C2 V5 V6]; [B1 C1 C2 V5 V6] # 1.𐫓.᩠ -B; xn--tsh4435fk263g.xn--jofz5294e; [B1 V5 V6]; [B1 V5 V6] # ⒈𐫓.᩠ -B; xn--0ug78ol75wzcx4i.xn--jof95xex98m; [B1 C1 C2 V5 V6]; [B1 C1 C2 V5 V6] # ⒈𐫓.᩠ -B; 𝅵。𝟫𞀈䬺⒈; [P1 V6]; [P1 V6] -B; 𝅵。9𞀈䬺1.; [P1 V6]; [P1 V6] -B; xn--3f1h.xn--91-030c1650n.; [V6]; [V6] -B; xn--3f1h.xn--9-ecp936non25a; [V6]; [V6] -B; 򡼺≯。盚\u0635; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ≯.盚ص -B; 򡼺>\u0338。盚\u0635; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ≯.盚ص -B; xn--hdh30181h.xn--0gb7878c; [B5 B6 V6]; [B5 B6 V6] # ≯.盚ص -B; -񿰭\u05B4。-󠁊𐢸≯; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ִ.-≯ -B; -񿰭\u05B4。-󠁊𐢸>\u0338; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ִ.-≯ -B; xn----fgc06667m.xn----pgoy615he5y4i; [B1 V3 V6]; [B1 V3 V6] # -ִ.-≯ -T; 󿭓\u1B44\u200C\u0A4D.𐭛񳋔; [B2 B3 B6 P1 V6]; [B2 B3 P1 V6] # ᭄੍.𐭛 -N; 󿭓\u1B44\u200C\u0A4D.𐭛񳋔; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # ᭄੍.𐭛 -T; 󿭓\u1B44\u200C\u0A4D.𐭛񳋔; [B2 B3 B6 P1 V6]; [B2 B3 P1 V6] # ᭄੍.𐭛 -N; 󿭓\u1B44\u200C\u0A4D.𐭛񳋔; [B2 B3 B6 P1 V6]; [B2 B3 B6 P1 V6] # ᭄੍.𐭛 -B; xn--ybc997fb5881a.xn--409c6100y; [B2 B3 V6]; [B2 B3 V6] # ᭄੍.𐭛 -B; xn--ybc997f6rd2n772c.xn--409c6100y; [B2 B3 B6 V6]; [B2 B3 B6 V6] # ᭄੍.𐭛 -T; ⾇.\u067D𞤴\u06BB\u200D; [B3 C2]; xn--8c1a.xn--2ib8jn539l # 舛.ٽ𞤴ڻ -N; ⾇.\u067D𞤴\u06BB\u200D; [B3 C2]; [B3 C2] # 舛.ٽ𞤴ڻ -T; 舛.\u067D𞤴\u06BB\u200D; [B3 C2]; xn--8c1a.xn--2ib8jn539l # 舛.ٽ𞤴ڻ -N; 舛.\u067D𞤴\u06BB\u200D; [B3 C2]; [B3 C2] # 舛.ٽ𞤴ڻ -T; 舛.\u067D𞤒\u06BB\u200D; [B3 C2]; xn--8c1a.xn--2ib8jn539l # 舛.ٽ𞤴ڻ -N; 舛.\u067D𞤒\u06BB\u200D; [B3 C2]; [B3 C2] # 舛.ٽ𞤴ڻ -B; xn--8c1a.xn--2ib8jn539l; 舛.\u067D𞤴\u06BB; xn--8c1a.xn--2ib8jn539l # 舛.ٽ𞤴ڻ -B; 舛.\u067D𞤴\u06BB; ; xn--8c1a.xn--2ib8jn539l # 舛.ٽ𞤴ڻ -B; 舛.\u067D𞤒\u06BB; 舛.\u067D𞤴\u06BB; xn--8c1a.xn--2ib8jn539l # 舛.ٽ𞤴ڻ -B; xn--8c1a.xn--2ib8jv19e6413b; [B3 C2]; [B3 C2] # 舛.ٽ𞤴ڻ -T; ⾇.\u067D𞤒\u06BB\u200D; [B3 C2]; xn--8c1a.xn--2ib8jn539l # 舛.ٽ𞤴ڻ -N; ⾇.\u067D𞤒\u06BB\u200D; [B3 C2]; [B3 C2] # 舛.ٽ𞤴ڻ -B; 4򭆥。\u0767≯; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 4.ݧ≯ -B; 4򭆥。\u0767>\u0338; [B1 B3 P1 V6]; [B1 B3 P1 V6] # 4.ݧ≯ -B; xn--4-xn17i.xn--rpb459k; [B1 B3 V6]; [B1 B3 V6] # 4.ݧ≯ -B; 𲔏𞫨񺿂硲.\u06AD; [B5 P1 V6]; [B5 P1 V6] # 硲.ڭ -B; 𲔏𞫨񺿂硲.\u06AD; [B5 P1 V6]; [B5 P1 V6] # 硲.ڭ -B; xn--lcz1610fn78gk609a.xn--gkb; [B5 V6]; [B5 V6] # 硲.ڭ -T; \u200C.\uFE08\u0666Ⴆ℮; [B1 C1 P1 V6]; [B1 P1 V6 A4_2] # .٦Ⴆ℮ -N; \u200C.\uFE08\u0666Ⴆ℮; [B1 C1 P1 V6]; [B1 C1 P1 V6] # .٦Ⴆ℮ -T; \u200C.\uFE08\u0666ⴆ℮; [B1 C1]; [B1 A4_2] # .٦ⴆ℮ -N; \u200C.\uFE08\u0666ⴆ℮; [B1 C1]; [B1 C1] # .٦ⴆ℮ -B; .xn--fib628k4li; [B1 A4_2]; [B1 A4_2] # .٦ⴆ℮ -B; xn--0ug.xn--fib628k4li; [B1 C1]; [B1 C1] # .٦ⴆ℮ -B; .xn--fib263c0yn; [B1 V6 A4_2]; [B1 V6 A4_2] # .٦Ⴆ℮ -B; xn--0ug.xn--fib263c0yn; [B1 C1 V6]; [B1 C1 V6] # .٦Ⴆ℮ -T; \u06A3.\u0D4D\u200DϞ; [B1 V5]; [B1 V5] # ڣ.്ϟ -N; \u06A3.\u0D4D\u200DϞ; [B1 V5]; [B1 V5] # ڣ.്ϟ -T; \u06A3.\u0D4D\u200DϞ; [B1 V5]; [B1 V5] # ڣ.്ϟ -N; \u06A3.\u0D4D\u200DϞ; [B1 V5]; [B1 V5] # ڣ.്ϟ -T; \u06A3.\u0D4D\u200Dϟ; [B1 V5]; [B1 V5] # ڣ.്ϟ -N; \u06A3.\u0D4D\u200Dϟ; [B1 V5]; [B1 V5] # ڣ.്ϟ -B; xn--5jb.xn--xya149b; [B1 V5]; [B1 V5] # ڣ.്ϟ -B; xn--5jb.xn--xya149bpvp; [B1 V5]; [B1 V5] # ڣ.്ϟ -T; \u06A3.\u0D4D\u200Dϟ; [B1 V5]; [B1 V5] # ڣ.്ϟ -N; \u06A3.\u0D4D\u200Dϟ; [B1 V5]; [B1 V5] # ڣ.്ϟ -T; \u200C𞸇𑘿。\u0623𐮂-腍; [B1 B2 B3 C1]; [B2 B3] # ح𑘿.أ𐮂-腍 -N; \u200C𞸇𑘿。\u0623𐮂-腍; [B1 B2 B3 C1]; [B1 B2 B3 C1] # ح𑘿.أ𐮂-腍 -T; \u200C𞸇𑘿。\u0627\u0654𐮂-腍; [B1 B2 B3 C1]; [B2 B3] # ح𑘿.أ𐮂-腍 -N; \u200C𞸇𑘿。\u0627\u0654𐮂-腍; [B1 B2 B3 C1]; [B1 B2 B3 C1] # ح𑘿.أ𐮂-腍 -T; \u200C\u062D𑘿。\u0623𐮂-腍; [B1 B2 B3 C1]; [B2 B3] # ح𑘿.أ𐮂-腍 -N; \u200C\u062D𑘿。\u0623𐮂-腍; [B1 B2 B3 C1]; [B1 B2 B3 C1] # ح𑘿.أ𐮂-腍 -T; \u200C\u062D𑘿。\u0627\u0654𐮂-腍; [B1 B2 B3 C1]; [B2 B3] # ح𑘿.أ𐮂-腍 -N; \u200C\u062D𑘿。\u0627\u0654𐮂-腍; [B1 B2 B3 C1]; [B1 B2 B3 C1] # ح𑘿.أ𐮂-腍 -B; xn--sgb4140l.xn----qmc5075grs9e; [B2 B3]; [B2 B3] # ح𑘿.أ𐮂-腍 -B; xn--sgb953kmi8o.xn----qmc5075grs9e; [B1 B2 B3 C1]; [B1 B2 B3 C1] # ح𑘿.أ𐮂-腍 -B; -򭷙\u066B纛。𝟛񭤇🄅; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -٫纛.3🄅 -B; -򭷙\u066B纛。3񭤇4,; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -٫纛.34, -B; xn----vqc8143g0tt4i.xn--34,-8787l; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -٫纛.34, -B; xn----vqc8143g0tt4i.xn--3-os1sn476y; [B1 V3 V6]; [B1 V3 V6] # -٫纛.3🄅 -B; 🔔.Ⴂ\u07CC\u0BCD𐋮; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 🔔.Ⴂߌ்𐋮 -B; 🔔.Ⴂ\u07CC\u0BCD𐋮; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 🔔.Ⴂߌ்𐋮 -B; 🔔.ⴂ\u07CC\u0BCD𐋮; [B1 B5]; [B1 B5] # 🔔.ⴂߌ்𐋮 -B; xn--nv8h.xn--nsb46rvz1b222p; [B1 B5]; [B1 B5] # 🔔.ⴂߌ்𐋮 -B; xn--nv8h.xn--nsb46r83e8112a; [B1 B5 V6]; [B1 B5 V6] # 🔔.Ⴂߌ்𐋮 -B; 🔔.ⴂ\u07CC\u0BCD𐋮; [B1 B5]; [B1 B5] # 🔔.ⴂߌ்𐋮 -B; 軥\u06B3.-𖬵; [B1 B5 B6 V3]; [B1 B5 B6 V3] # 軥ڳ.-𖬵 -B; xn--mkb5480e.xn----6u5m; [B1 B5 B6 V3]; [B1 B5 B6 V3] # 軥ڳ.-𖬵 -B; 𐹤\u07CA\u06B6.𐨂-; [B1 V3 V5]; [B1 V3 V5] # 𐹤ߊڶ.𐨂- -B; xn--pkb56cn614d.xn----974i; [B1 V3 V5]; [B1 V3 V5] # 𐹤ߊڶ.𐨂- -B; -󠅱0。\u17CF\u1DFD톇십; [V3 V5]; [V3 V5] # -0.៏᷽톇십 -B; -󠅱0。\u17CF\u1DFD톇십; [V3 V5]; [V3 V5] # -0.៏᷽톇십 -B; -󠅱0。\u17CF\u1DFD톇십; [V3 V5]; [V3 V5] # -0.៏᷽톇십 -B; -󠅱0。\u17CF\u1DFD톇십; [V3 V5]; [V3 V5] # -0.៏᷽톇십 -B; -0.xn--r4e872ah77nghm; [V3 V5]; [V3 V5] # -0.៏᷽톇십 -B; ꡰ︒--。\u17CC靈𐹢񘳮; [B1 B6 P1 V2 V3 V5 V6]; [B1 B6 P1 V2 V3 V5 V6] # ꡰ︒--.៌靈𐹢 -B; ꡰ。--。\u17CC靈𐹢񘳮; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ꡰ.--.៌靈𐹢 -B; xn--md9a.--.xn--o4e6836dpxudz0v1c; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ꡰ.--.៌靈𐹢 -B; xn-----bk9hu24z.xn--o4e6836dpxudz0v1c; [B1 B6 V2 V3 V5 V6]; [B1 B6 V2 V3 V5 V6] # ꡰ︒--.៌靈𐹢 -B; \u115FႿႵრ。\u0B4D; [P1 V5 V6]; [P1 V5 V6] # ႿႵრ.୍ -B; \u115FႿႵრ。\u0B4D; [P1 V5 V6]; [P1 V5 V6] # ႿႵრ.୍ -B; \u115Fⴟⴕრ。\u0B4D; [P1 V5 V6]; [P1 V5 V6] # ⴟⴕრ.୍ -B; \u115FႿⴕრ。\u0B4D; [P1 V5 V6]; [P1 V5 V6] # Ⴟⴕრ.୍ -B; xn--3nd0etsm92g.xn--9ic; [V5 V6]; [V5 V6] # Ⴟⴕრ.୍ -B; xn--1od7wz74eeb.xn--9ic; [V5 V6]; [V5 V6] # ⴟⴕრ.୍ -B; xn--tndt4hvw.xn--9ic; [V5 V6]; [V5 V6] # ႿႵრ.୍ -B; \u115Fⴟⴕრ。\u0B4D; [P1 V5 V6]; [P1 V5 V6] # ⴟⴕრ.୍ -B; \u115FႿⴕრ。\u0B4D; [P1 V5 V6]; [P1 V5 V6] # Ⴟⴕრ.୍ -B; 🄃𐹠.\u0664󠅇; [B1 P1 V6]; [B1 P1 V6] # 🄃𐹠.٤ -B; 2,𐹠.\u0664󠅇; [B1 P1 V6]; [B1 P1 V6] # 2,𐹠.٤ -B; xn--2,-5g3o.xn--dib; [B1 P1 V6]; [B1 P1 V6] # 2,𐹠.٤ -B; xn--7n0d1189a.xn--dib; [B1 V6]; [B1 V6] # 🄃𐹠.٤ -T; 򻲼\u200C\uFC5B.\u07D2\u0848\u1BF3; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 P1 V6] # ذٰ.ߒࡈ᯳ -N; 򻲼\u200C\uFC5B.\u07D2\u0848\u1BF3; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 C1 P1 V6] # ذٰ.ߒࡈ᯳ -T; 򻲼\u200C\u0630\u0670.\u07D2\u0848\u1BF3; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 P1 V6] # ذٰ.ߒࡈ᯳ -N; 򻲼\u200C\u0630\u0670.\u07D2\u0848\u1BF3; [B2 B3 B5 B6 C1 P1 V6]; [B2 B3 B5 B6 C1 P1 V6] # ذٰ.ߒࡈ᯳ -B; xn--vgb2kp1223g.xn--tsb0vz43c; [B2 B3 B5 B6 V6]; [B2 B3 B5 B6 V6] # ذٰ.ߒࡈ᯳ -B; xn--vgb2kq00fl213y.xn--tsb0vz43c; [B2 B3 B5 B6 C1 V6]; [B2 B3 B5 B6 C1 V6] # ذٰ.ߒࡈ᯳ -T; \u200D\u200D𞵪\u200C。ᡘ𑲭\u17B5; [B1 C1 C2 P1 V6]; [P1 V6] # .ᡘ𑲭 -N; \u200D\u200D𞵪\u200C。ᡘ𑲭\u17B5; [B1 C1 C2 P1 V6]; [B1 C1 C2 P1 V6] # .ᡘ𑲭 -B; xn--l96h.xn--03e93aq365d; [V6]; [V6] # .ᡘ𑲭 -B; xn--0ugba05538b.xn--03e93aq365d; [B1 C1 C2 V6]; [B1 C1 C2 V6] # .ᡘ𑲭 -B; 𞷻。⚄񗑇𑁿; [B1 P1 V6]; [B1 P1 V6] -B; xn--qe7h.xn--c7h2966f7so4a; [B1 V6]; [B1 V6] -B; \uA8C4≠.𞠨\u0667; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ꣄≠.𞠨٧ -B; \uA8C4=\u0338.𞠨\u0667; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ꣄≠.𞠨٧ -B; \uA8C4≠.𞠨\u0667; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ꣄≠.𞠨٧ -B; \uA8C4=\u0338.𞠨\u0667; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ꣄≠.𞠨٧ -B; xn--1chy504c.xn--gib1777v; [B1 V5 V6]; [B1 V5 V6] # ꣄≠.𞠨٧ -B; 𝟛𝆪\uA8C4。\uA8EA-; [V3 V5]; [V3 V5] # 3꣄𝆪.꣪- -B; 𝟛\uA8C4𝆪。\uA8EA-; [V3 V5]; [V3 V5] # 3꣄𝆪.꣪- -B; 3\uA8C4𝆪。\uA8EA-; [V3 V5]; [V3 V5] # 3꣄𝆪.꣪- -B; xn--3-sl4eu679e.xn----xn4e; [V3 V5]; [V3 V5] # 3꣄𝆪.꣪- -B; \u075F\u1BA2\u103AႧ.4; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # ݟᮢ်Ⴇ.4 -B; \u075F\u1BA2\u103Aⴇ.4; [B1 B2 B3]; [B1 B2 B3] # ݟᮢ်ⴇ.4 -B; xn--jpb846bjzj7pr.4; [B1 B2 B3]; [B1 B2 B3] # ݟᮢ်ⴇ.4 -B; xn--jpb846bmjw88a.4; [B1 B2 B3 V6]; [B1 B2 B3 V6] # ݟᮢ်Ⴇ.4 -B; ᄹ。\u0ECA򠯤󠄞; [P1 V5 V6]; [P1 V5 V6] # ᄹ.໊ -B; ᄹ。\u0ECA򠯤󠄞; [P1 V5 V6]; [P1 V5 V6] # ᄹ.໊ -B; xn--lrd.xn--s8c05302k; [V5 V6]; [V5 V6] # ᄹ.໊ -B; Ⴆ򻢩.󠆡\uFE09𞤍; [P1 V6]; [P1 V6] -B; Ⴆ򻢩.󠆡\uFE09𞤍; [P1 V6]; [P1 V6] -B; ⴆ򻢩.󠆡\uFE09𞤯; [P1 V6]; [P1 V6] -B; xn--xkjw3965g.xn--ne6h; [V6]; [V6] -B; xn--end82983m.xn--ne6h; [V6]; [V6] -B; ⴆ򻢩.󠆡\uFE09𞤯; [P1 V6]; [P1 V6] -B; ⴆ򻢩.󠆡\uFE09𞤍; [P1 V6]; [P1 V6] -B; ⴆ򻢩.󠆡\uFE09𞤍; [P1 V6]; [P1 V6] -T; ß\u080B︒\u067B.帼F∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ßࠋ︒ٻ.帼f∫∫ -N; ß\u080B︒\u067B.帼F∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ßࠋ︒ٻ.帼f∫∫ -T; ß\u080B。\u067B.帼F∫∫\u200C; [B5 B6 C1]; [B5 B6] # ßࠋ.ٻ.帼f∫∫ -N; ß\u080B。\u067B.帼F∫∫\u200C; [B5 B6 C1]; [B5 B6 C1] # ßࠋ.ٻ.帼f∫∫ -T; ß\u080B。\u067B.帼f∫∫\u200C; [B5 B6 C1]; [B5 B6] # ßࠋ.ٻ.帼f∫∫ -N; ß\u080B。\u067B.帼f∫∫\u200C; [B5 B6 C1]; [B5 B6 C1] # ßࠋ.ٻ.帼f∫∫ -T; SS\u080B。\u067B.帼F∫∫\u200C; [B5 B6 C1]; [B5 B6] # ssࠋ.ٻ.帼f∫∫ -N; SS\u080B。\u067B.帼F∫∫\u200C; [B5 B6 C1]; [B5 B6 C1] # ssࠋ.ٻ.帼f∫∫ -T; ss\u080B。\u067B.帼f∫∫\u200C; [B5 B6 C1]; [B5 B6] # ssࠋ.ٻ.帼f∫∫ -N; ss\u080B。\u067B.帼f∫∫\u200C; [B5 B6 C1]; [B5 B6 C1] # ssࠋ.ٻ.帼f∫∫ -T; Ss\u080B。\u067B.帼F∫∫\u200C; [B5 B6 C1]; [B5 B6] # ssࠋ.ٻ.帼f∫∫ -N; Ss\u080B。\u067B.帼F∫∫\u200C; [B5 B6 C1]; [B5 B6 C1] # ssࠋ.ٻ.帼f∫∫ -B; xn--ss-uze.xn--0ib.xn--f-tcoa9162d; [B5 B6]; [B5 B6] # ssࠋ.ٻ.帼f∫∫ -B; xn--ss-uze.xn--0ib.xn--f-sgn48ga6997e; [B5 B6 C1]; [B5 B6 C1] # ssࠋ.ٻ.帼f∫∫ -B; xn--zca687a.xn--0ib.xn--f-sgn48ga6997e; [B5 B6 C1]; [B5 B6 C1] # ßࠋ.ٻ.帼f∫∫ -T; ß\u080B︒\u067B.帼f∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ßࠋ︒ٻ.帼f∫∫ -N; ß\u080B︒\u067B.帼f∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ßࠋ︒ٻ.帼f∫∫ -T; SS\u080B︒\u067B.帼F∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ssࠋ︒ٻ.帼f∫∫ -N; SS\u080B︒\u067B.帼F∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ssࠋ︒ٻ.帼f∫∫ -T; ss\u080B︒\u067B.帼f∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ssࠋ︒ٻ.帼f∫∫ -N; ss\u080B︒\u067B.帼f∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ssࠋ︒ٻ.帼f∫∫ -T; Ss\u080B︒\u067B.帼F∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # ssࠋ︒ٻ.帼f∫∫ -N; Ss\u080B︒\u067B.帼F∬\u200C; [B5 B6 C1 P1 V6]; [B5 B6 C1 P1 V6] # ssࠋ︒ٻ.帼f∫∫ -B; xn--ss-k0d31nu121d.xn--f-tcoa9162d; [B5 B6 V6]; [B5 B6 V6] # ssࠋ︒ٻ.帼f∫∫ -B; xn--ss-k0d31nu121d.xn--f-sgn48ga6997e; [B5 B6 C1 V6]; [B5 B6 C1 V6] # ssࠋ︒ٻ.帼f∫∫ -B; xn--zca68zj8ac956c.xn--f-sgn48ga6997e; [B5 B6 C1 V6]; [B5 B6 C1 V6] # ßࠋ︒ٻ.帼f∫∫ -T; 󘪗。𐹴𞨌\u200D; [B1 C2 P1 V6]; [B1 P1 V6] # .𐹴 -N; 󘪗。𐹴𞨌\u200D; [B1 C2 P1 V6]; [B1 C2 P1 V6] # .𐹴 -T; 󘪗。𐹴𞨌\u200D; [B1 C2 P1 V6]; [B1 P1 V6] # .𐹴 -N; 󘪗。𐹴𞨌\u200D; [B1 C2 P1 V6]; [B1 C2 P1 V6] # .𐹴 -B; xn--8l83e.xn--so0dw168a; [B1 V6]; [B1 V6] -B; xn--8l83e.xn--1ug4105gsxwf; [B1 C2 V6]; [B1 C2 V6] # .𐹴 -B; 񗛨.򅟢𝟨\uA8C4; [P1 V6]; [P1 V6] # .6꣄ -B; 񗛨.򅟢6\uA8C4; [P1 V6]; [P1 V6] # .6꣄ -B; xn--mi60a.xn--6-sl4es8023c; [V6]; [V6] # .6꣄ -B; \u1AB2\uFD8E。-۹ႱႨ; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ᪲مخج.-۹ႱႨ -B; \u1AB2\u0645\u062E\u062C。-۹ႱႨ; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ᪲مخج.-۹ႱႨ -B; \u1AB2\u0645\u062E\u062C。-۹ⴑⴈ; [B1 V3 V5]; [B1 V3 V5] # ᪲مخج.-۹ⴑⴈ -B; \u1AB2\u0645\u062E\u062C。-۹Ⴑⴈ; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ᪲مخج.-۹Ⴑⴈ -B; xn--rgbd2e831i.xn----zyc875efr3a; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ᪲مخج.-۹Ⴑⴈ -B; xn--rgbd2e831i.xn----zyc3430a9a; [B1 V3 V5]; [B1 V3 V5] # ᪲مخج.-۹ⴑⴈ -B; xn--rgbd2e831i.xn----zyc155e9a; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ᪲مخج.-۹ႱႨ -B; \u1AB2\uFD8E。-۹ⴑⴈ; [B1 V3 V5]; [B1 V3 V5] # ᪲مخج.-۹ⴑⴈ -B; \u1AB2\uFD8E。-۹Ⴑⴈ; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ᪲مخج.-۹Ⴑⴈ -B; 𞤤.-\u08A3︒; [B1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤤.-ࢣ︒ -B; 𞤤.-\u08A3。; [B1 V3]; [B1 V3] # 𞤤.-ࢣ. -B; 𞤂.-\u08A3。; [B1 V3]; [B1 V3] # 𞤤.-ࢣ. -B; xn--ce6h.xn----cod.; [B1 V3]; [B1 V3] # 𞤤.-ࢣ. -B; 𞤂.-\u08A3︒; [B1 P1 V3 V6]; [B1 P1 V3 V6] # 𞤤.-ࢣ︒ -B; xn--ce6h.xn----cod7069p; [B1 V3 V6]; [B1 V3 V6] # 𞤤.-ࢣ︒ -T; \u200C𐺨.\u0859--; [B1 C1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # .࡙-- -N; \u200C𐺨.\u0859--; [B1 C1 P1 V3 V5 V6]; [B1 C1 P1 V3 V5 V6] # .࡙-- -B; xn--9p0d.xn-----h6e; [B1 V3 V5 V6]; [B1 V3 V5 V6] # .࡙-- -B; xn--0ug7905g.xn-----h6e; [B1 C1 V3 V5 V6]; [B1 C1 V3 V5 V6] # .࡙-- -B; 𐋸󮘋Ⴢ.Ⴁ; [P1 V6]; [P1 V6] -B; 𐋸󮘋ⴢ.ⴁ; [P1 V6]; [P1 V6] -B; 𐋸󮘋Ⴢ.ⴁ; [P1 V6]; [P1 V6] -B; xn--6nd5215jr2u0h.xn--skj; [V6]; [V6] -B; xn--qlj1559dr224h.xn--skj; [V6]; [V6] -B; xn--6nd5215jr2u0h.xn--8md; [V6]; [V6] -T; 񗑿\uA806₄򩞆。𲩧󠒹ς; [P1 V6]; [P1 V6] # ꠆4.ς -N; 񗑿\uA806₄򩞆。𲩧󠒹ς; [P1 V6]; [P1 V6] # ꠆4.ς -T; 񗑿\uA8064򩞆。𲩧󠒹ς; [P1 V6]; [P1 V6] # ꠆4.ς -N; 񗑿\uA8064򩞆。𲩧󠒹ς; [P1 V6]; [P1 V6] # ꠆4.ς -B; 񗑿\uA8064򩞆。𲩧󠒹Σ; [P1 V6]; [P1 V6] # ꠆4.σ -B; 񗑿\uA8064򩞆。𲩧󠒹σ; [P1 V6]; [P1 V6] # ꠆4.σ -B; xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d; [V6]; [V6] # ꠆4.σ -B; xn--4-w93ej7463a9io5a.xn--3xa51142bk3f0d; [V6]; [V6] # ꠆4.ς -B; 񗑿\uA806₄򩞆。𲩧󠒹Σ; [P1 V6]; [P1 V6] # ꠆4.σ -B; 񗑿\uA806₄򩞆。𲩧󠒹σ; [P1 V6]; [P1 V6] # ꠆4.σ -B; 󠆀\u0723。\u1DF4\u0775; [B1 V5]; [B1 V5] # ܣ.ᷴݵ -B; xn--tnb.xn--5pb136i; [B1 V5]; [B1 V5] # ܣ.ᷴݵ -T; 𐹱\u0842𝪨。𬼖Ⴑ\u200D; [B1 B6 C2 P1 V6]; [B1 P1 V6] # 𐹱ࡂ𝪨.𬼖Ⴑ -N; 𐹱\u0842𝪨。𬼖Ⴑ\u200D; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # 𐹱ࡂ𝪨.𬼖Ⴑ -T; 𐹱\u0842𝪨。𬼖Ⴑ\u200D; [B1 B6 C2 P1 V6]; [B1 P1 V6] # 𐹱ࡂ𝪨.𬼖Ⴑ -N; 𐹱\u0842𝪨。𬼖Ⴑ\u200D; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # 𐹱ࡂ𝪨.𬼖Ⴑ -T; 𐹱\u0842𝪨。𬼖ⴑ\u200D; [B1 B6 C2]; [B1] # 𐹱ࡂ𝪨.𬼖ⴑ -N; 𐹱\u0842𝪨。𬼖ⴑ\u200D; [B1 B6 C2]; [B1 B6 C2] # 𐹱ࡂ𝪨.𬼖ⴑ -B; xn--0vb1535kdb6e.xn--8kjz186s; [B1]; [B1] # 𐹱ࡂ𝪨.𬼖ⴑ -B; xn--0vb1535kdb6e.xn--1ug742c5714c; [B1 B6 C2]; [B1 B6 C2] # 𐹱ࡂ𝪨.𬼖ⴑ -B; xn--0vb1535kdb6e.xn--pnd93707a; [B1 V6]; [B1 V6] # 𐹱ࡂ𝪨.𬼖Ⴑ -B; xn--0vb1535kdb6e.xn--pnd879eqy33c; [B1 B6 C2 V6]; [B1 B6 C2 V6] # 𐹱ࡂ𝪨.𬼖Ⴑ -T; 𐹱\u0842𝪨。𬼖ⴑ\u200D; [B1 B6 C2]; [B1] # 𐹱ࡂ𝪨.𬼖ⴑ -N; 𐹱\u0842𝪨。𬼖ⴑ\u200D; [B1 B6 C2]; [B1 B6 C2] # 𐹱ࡂ𝪨.𬼖ⴑ -T; \u1714𐭪󠙘\u200D。-𐹴; [B1 C2 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ᜔𐭪.-𐹴 -N; \u1714𐭪󠙘\u200D。-𐹴; [B1 C2 P1 V3 V5 V6]; [B1 C2 P1 V3 V5 V6] # ᜔𐭪.-𐹴 -T; \u1714𐭪󠙘\u200D。-𐹴; [B1 C2 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ᜔𐭪.-𐹴 -N; \u1714𐭪󠙘\u200D。-𐹴; [B1 C2 P1 V3 V5 V6]; [B1 C2 P1 V3 V5 V6] # ᜔𐭪.-𐹴 -B; xn--fze4126jujt0g.xn----c36i; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ᜔𐭪.-𐹴 -B; xn--fze807bso0spy14i.xn----c36i; [B1 C2 V3 V5 V6]; [B1 C2 V3 V5 V6] # ᜔𐭪.-𐹴 -B; 𾢬。\u0729︒쯙𝟧; [B2 P1 V6]; [B2 P1 V6] # .ܩ︒쯙5 -B; 𾢬。\u0729︒쯙𝟧; [B2 P1 V6]; [B2 P1 V6] # .ܩ︒쯙5 -B; 𾢬。\u0729。쯙5; [P1 V6]; [P1 V6] # .ܩ.쯙5 -B; 𾢬。\u0729。쯙5; [P1 V6]; [P1 V6] # .ܩ.쯙5 -B; xn--t92s.xn--znb.xn--5-y88f; [V6]; [V6] # .ܩ.쯙5 -B; xn--t92s.xn--5-p1c0712mm8rb; [B2 V6]; [B2 V6] # .ܩ︒쯙5 -B; 𞤟-。\u0762≮뻐; [B2 B3 P1 V3 V6]; [B2 B3 P1 V3 V6] # 𞥁-.ݢ≮뻐 -B; 𞤟-。\u0762<\u0338뻐; [B2 B3 P1 V3 V6]; [B2 B3 P1 V3 V6] # 𞥁-.ݢ≮뻐 -B; 𞥁-。\u0762<\u0338뻐; [B2 B3 P1 V3 V6]; [B2 B3 P1 V3 V6] # 𞥁-.ݢ≮뻐 -B; 𞥁-。\u0762≮뻐; [B2 B3 P1 V3 V6]; [B2 B3 P1 V3 V6] # 𞥁-.ݢ≮뻐 -B; xn----1j8r.xn--mpb269krv4i; [B2 B3 V3 V6]; [B2 B3 V3 V6] # 𞥁-.ݢ≮뻐 -B; 𞥩-򊫠.\u08B4≠; [B2 B3 P1 V6]; [B2 B3 P1 V6] # -.ࢴ≠ -B; 𞥩-򊫠.\u08B4=\u0338; [B2 B3 P1 V6]; [B2 B3 P1 V6] # -.ࢴ≠ -B; 𞥩-򊫠.\u08B4≠; [B2 B3 P1 V6]; [B2 B3 P1 V6] # -.ࢴ≠ -B; 𞥩-򊫠.\u08B4=\u0338; [B2 B3 P1 V6]; [B2 B3 P1 V6] # -.ࢴ≠ -B; xn----cm8rp3609a.xn--9yb852k; [B2 B3 V6]; [B2 B3 V6] # -.ࢴ≠ -T; -񅂏ςႼ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ςႼ.١ -N; -񅂏ςႼ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ςႼ.١ -T; -񅂏ςႼ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ςႼ.١ -N; -񅂏ςႼ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ςႼ.١ -T; -񅂏ςⴜ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ςⴜ.١ -N; -񅂏ςⴜ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ςⴜ.١ -B; -񅂏ΣႼ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -σႼ.١ -B; -񅂏σⴜ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -σⴜ.١ -B; -񅂏Σⴜ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -σⴜ.١ -B; xn----0mb9682aov12f.xn--9hb; [B1 V3 V6]; [B1 V3 V6] # -σⴜ.١ -B; xn----0mb770hun11i.xn--9hb; [B1 V3 V6]; [B1 V3 V6] # -σႼ.١ -B; xn----ymb2782aov12f.xn--9hb; [B1 V3 V6]; [B1 V3 V6] # -ςⴜ.١ -B; xn----ymb080hun11i.xn--9hb; [B1 V3 V6]; [B1 V3 V6] # -ςႼ.١ -T; -񅂏ςⴜ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ςⴜ.١ -N; -񅂏ςⴜ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ςⴜ.١ -B; -񅂏ΣႼ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -σႼ.١ -B; -񅂏σⴜ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -σⴜ.١ -B; -񅂏Σⴜ.\u0661; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -σⴜ.١ -T; \u17CA.\u200D𝟮𑀿; [C2 V5]; [V5] # ៊.2𑀿 -N; \u17CA.\u200D𝟮𑀿; [C2 V5]; [C2 V5] # ៊.2𑀿 -T; \u17CA.\u200D2𑀿; [C2 V5]; [V5] # ៊.2𑀿 -N; \u17CA.\u200D2𑀿; [C2 V5]; [C2 V5] # ៊.2𑀿 -B; xn--m4e.xn--2-ku7i; [V5]; [V5] # ៊.2𑀿 -B; xn--m4e.xn--2-tgnv469h; [C2 V5]; [C2 V5] # ៊.2𑀿 -B; ≯𝟖。\u1A60𐫓򟇑; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≯8.᩠𐫓 -B; >\u0338𝟖。\u1A60𐫓򟇑; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≯8.᩠𐫓 -B; ≯8。\u1A60𐫓򟇑; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≯8.᩠𐫓 -B; >\u03388。\u1A60𐫓򟇑; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≯8.᩠𐫓 -B; xn--8-ogo.xn--jof5303iv1z5d; [B1 V5 V6]; [B1 V5 V6] # ≯8.᩠𐫓 -T; 𑲫Ↄ\u0664。\u200C; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𑲫Ↄ٤. -N; 𑲫Ↄ\u0664。\u200C; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𑲫Ↄ٤. -T; 𑲫Ↄ\u0664。\u200C; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # 𑲫Ↄ٤. -N; 𑲫Ↄ\u0664。\u200C; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # 𑲫Ↄ٤. -T; 𑲫ↄ\u0664。\u200C; [B1 C1 V5]; [B1 V5] # 𑲫ↄ٤. -N; 𑲫ↄ\u0664。\u200C; [B1 C1 V5]; [B1 C1 V5] # 𑲫ↄ٤. -B; xn--dib100l8x1p.; [B1 V5]; [B1 V5] # 𑲫ↄ٤. -B; xn--dib100l8x1p.xn--0ug; [B1 C1 V5]; [B1 C1 V5] # 𑲫ↄ٤. -B; xn--dib999kcy1p.; [B1 V5 V6]; [B1 V5 V6] # 𑲫Ↄ٤. -B; xn--dib999kcy1p.xn--0ug; [B1 C1 V5 V6]; [B1 C1 V5 V6] # 𑲫Ↄ٤. -T; 𑲫ↄ\u0664。\u200C; [B1 C1 V5]; [B1 V5] # 𑲫ↄ٤. -N; 𑲫ↄ\u0664。\u200C; [B1 C1 V5]; [B1 C1 V5] # 𑲫ↄ٤. -T; \u0C00𝟵\u200D\uFC9D.\u200D\u0750⒈; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ఀ9بح.ݐ⒈ -N; \u0C00𝟵\u200D\uFC9D.\u200D\u0750⒈; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ఀ9بح.ݐ⒈ -T; \u0C009\u200D\u0628\u062D.\u200D\u07501.; [B1 C2 V5]; [B1 V5] # ఀ9بح.ݐ1. -N; \u0C009\u200D\u0628\u062D.\u200D\u07501.; [B1 C2 V5]; [B1 C2 V5] # ఀ9بح.ݐ1. -B; xn--9-1mcp570d.xn--1-x3c.; [B1 V5]; [B1 V5] # ఀ9بح.ݐ1. -B; xn--9-1mcp570dl51a.xn--1-x3c211q.; [B1 C2 V5]; [B1 C2 V5] # ఀ9بح.ݐ1. -B; xn--9-1mcp570d.xn--3ob470m; [B1 V5 V6]; [B1 V5 V6] # ఀ9بح.ݐ⒈ -B; xn--9-1mcp570dl51a.xn--3ob977jmfd; [B1 C2 V5 V6]; [B1 C2 V5 V6] # ఀ9بح.ݐ⒈ -T; \uAAF6。嬶ß葽; [V5]; [V5] # ꫶.嬶ß葽 -N; \uAAF6。嬶ß葽; [V5]; [V5] # ꫶.嬶ß葽 -B; \uAAF6。嬶SS葽; [V5]; [V5] # ꫶.嬶ss葽 -B; \uAAF6。嬶ss葽; [V5]; [V5] # ꫶.嬶ss葽 -B; \uAAF6。嬶Ss葽; [V5]; [V5] # ꫶.嬶ss葽 -B; xn--2v9a.xn--ss-q40dp97m; [V5]; [V5] # ꫶.嬶ss葽 -B; xn--2v9a.xn--zca7637b14za; [V5]; [V5] # ꫶.嬶ß葽 -B; 𑚶⒈。񞻡𐹺; [B5 B6 P1 V5 V6]; [B5 B6 P1 V5 V6] -B; 𑚶1.。񞻡𐹺; [B5 B6 P1 V5 V6 A4_2]; [B5 B6 P1 V5 V6 A4_2] -B; xn--1-3j0j..xn--yo0d5914s; [B5 B6 V5 V6 A4_2]; [B5 B6 V5 V6 A4_2] -B; xn--tshz969f.xn--yo0d5914s; [B5 B6 V5 V6]; [B5 B6 V5 V6] -B; 𑜤︒≮.񚕽\u05D8𞾩; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𑜤︒≮.ט -B; 𑜤︒<\u0338.񚕽\u05D8𞾩; [B1 B5 B6 P1 V5 V6]; [B1 B5 B6 P1 V5 V6] # 𑜤︒≮.ט -B; 𑜤。≮.񚕽\u05D8𞾩; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # 𑜤.≮.ט -B; 𑜤。<\u0338.񚕽\u05D8𞾩; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # 𑜤.≮.ט -B; xn--ci2d.xn--gdh.xn--deb0091w5q9u; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # 𑜤.≮.ט -B; xn--gdh5267fdzpa.xn--deb0091w5q9u; [B1 B5 B6 V5 V6]; [B1 B5 B6 V5 V6] # 𑜤︒≮.ט -T; 󠆋\u0603񏦤.⇁ς򏋈򺇥; [B1 P1 V6]; [B1 P1 V6] # .⇁ς -N; 󠆋\u0603񏦤.⇁ς򏋈򺇥; [B1 P1 V6]; [B1 P1 V6] # .⇁ς -B; 󠆋\u0603񏦤.⇁Σ򏋈򺇥; [B1 P1 V6]; [B1 P1 V6] # .⇁σ -B; 󠆋\u0603񏦤.⇁σ򏋈򺇥; [B1 P1 V6]; [B1 P1 V6] # .⇁σ -B; xn--lfb04106d.xn--4xa964mxv16m8moq; [B1 V6]; [B1 V6] # .⇁σ -B; xn--lfb04106d.xn--3xa174mxv16m8moq; [B1 V6]; [B1 V6] # .⇁ς -T; ς𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [P1 V6] # ς𑐽𑜫.𐫄 -N; ς𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [C1 P1 V6] # ς𑐽𑜫.𐫄 -T; ς𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [P1 V6] # ς𑐽𑜫.𐫄 -N; ς𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [C1 P1 V6] # ς𑐽𑜫.𐫄 -T; Σ𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [P1 V6] # σ𑐽𑜫.𐫄 -N; Σ𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [C1 P1 V6] # σ𑐽𑜫.𐫄 -T; σ𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [P1 V6] # σ𑐽𑜫.𐫄 -N; σ𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [C1 P1 V6] # σ𑐽𑜫.𐫄 -B; xn--4xa2260lk3b8z15g.xn--tw9ct349a; [V6]; [V6] -B; xn--4xa2260lk3b8z15g.xn--0ug4653g2xzf; [C1 V6]; [C1 V6] # σ𑐽𑜫.𐫄 -B; xn--3xa4260lk3b8z15g.xn--0ug4653g2xzf; [C1 V6]; [C1 V6] # ς𑐽𑜫.𐫄 -T; Σ𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [P1 V6] # σ𑐽𑜫.𐫄 -N; Σ𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [C1 P1 V6] # σ𑐽𑜫.𐫄 -T; σ𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [P1 V6] # σ𑐽𑜫.𐫄 -N; σ𑐽𵢈𑜫。𞬩\u200C𐫄; [C1 P1 V6]; [C1 P1 V6] # σ𑐽𑜫.𐫄 -B; -򵏽。-\uFC4C\u075B; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.-نحݛ -B; -򵏽。-\u0646\u062D\u075B; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -.-نحݛ -B; xn----o452j.xn----cnc8e38c; [B1 V3 V6]; [B1 V3 V6] # -.-نحݛ -T; ⺢򇺅𝟤。\u200D🚷; [C2 P1 V6]; [P1 V6] # ⺢2.🚷 -N; ⺢򇺅𝟤。\u200D🚷; [C2 P1 V6]; [C2 P1 V6] # ⺢2.🚷 -T; ⺢򇺅2。\u200D🚷; [C2 P1 V6]; [P1 V6] # ⺢2.🚷 -N; ⺢򇺅2。\u200D🚷; [C2 P1 V6]; [C2 P1 V6] # ⺢2.🚷 -B; xn--2-4jtr4282f.xn--m78h; [V6]; [V6] -B; xn--2-4jtr4282f.xn--1ugz946p; [C2 V6]; [C2 V6] # ⺢2.🚷 -T; \u0CF8\u200D\u2DFE𐹲。򤐶; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # ⷾ𐹲. -N; \u0CF8\u200D\u2DFE𐹲。򤐶; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # ⷾ𐹲. -T; \u0CF8\u200D\u2DFE𐹲。򤐶; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # ⷾ𐹲. -N; \u0CF8\u200D\u2DFE𐹲。򤐶; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # ⷾ𐹲. -B; xn--hvc220of37m.xn--3e36c; [B5 B6 V6]; [B5 B6 V6] # ⷾ𐹲. -B; xn--hvc488g69j402t.xn--3e36c; [B5 B6 C2 V6]; [B5 B6 C2 V6] # ⷾ𐹲. -B; 𐹢.Ⴍ₉⁸; [B1 P1 V6]; [B1 P1 V6] -B; 𐹢.Ⴍ98; [B1 P1 V6]; [B1 P1 V6] -B; 𐹢.ⴍ98; [B1]; [B1] -B; xn--9n0d.xn--98-u61a; [B1]; [B1] -B; xn--9n0d.xn--98-7ek; [B1 V6]; [B1 V6] -B; 𐹢.ⴍ₉⁸; [B1]; [B1] -T; \u200C\u034F。ß\u08E2⒚≯; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ß⒚≯ -N; \u200C\u034F。ß\u08E2⒚≯; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ß⒚≯ -T; \u200C\u034F。ß\u08E2⒚>\u0338; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ß⒚≯ -N; \u200C\u034F。ß\u08E2⒚>\u0338; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ß⒚≯ -T; \u200C\u034F。ß\u08E219.≯; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6 A4_2] # .ß19.≯ -N; \u200C\u034F。ß\u08E219.≯; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # .ß19.≯ -T; \u200C\u034F。ß\u08E219.>\u0338; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6 A4_2] # .ß19.≯ -N; \u200C\u034F。ß\u08E219.>\u0338; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # .ß19.≯ -T; \u200C\u034F。SS\u08E219.>\u0338; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6 A4_2] # .ss19.≯ -N; \u200C\u034F。SS\u08E219.>\u0338; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # .ss19.≯ -T; \u200C\u034F。SS\u08E219.≯; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6 A4_2] # .ss19.≯ -N; \u200C\u034F。SS\u08E219.≯; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # .ss19.≯ -T; \u200C\u034F。ss\u08E219.≯; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6 A4_2] # .ss19.≯ -N; \u200C\u034F。ss\u08E219.≯; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # .ss19.≯ -T; \u200C\u034F。ss\u08E219.>\u0338; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6 A4_2] # .ss19.≯ -N; \u200C\u034F。ss\u08E219.>\u0338; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # .ss19.≯ -T; \u200C\u034F。Ss\u08E219.>\u0338; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6 A4_2] # .ss19.≯ -N; \u200C\u034F。Ss\u08E219.>\u0338; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # .ss19.≯ -T; \u200C\u034F。Ss\u08E219.≯; [B1 B5 C1 P1 V6]; [B1 B5 P1 V6 A4_2] # .ss19.≯ -N; \u200C\u034F。Ss\u08E219.≯; [B1 B5 C1 P1 V6]; [B1 B5 C1 P1 V6] # .ss19.≯ -B; .xn--ss19-w0i.xn--hdh; [B1 B5 V6 A4_2]; [B1 B5 V6 A4_2] # .ss19.≯ -B; xn--0ug.xn--ss19-w0i.xn--hdh; [B1 B5 C1 V6]; [B1 B5 C1 V6] # .ss19.≯ -B; xn--0ug.xn--19-fia813f.xn--hdh; [B1 B5 C1 V6]; [B1 B5 C1 V6] # .ß19.≯ -T; \u200C\u034F。SS\u08E2⒚>\u0338; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ss⒚≯ -N; \u200C\u034F。SS\u08E2⒚>\u0338; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ss⒚≯ -T; \u200C\u034F。SS\u08E2⒚≯; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ss⒚≯ -N; \u200C\u034F。SS\u08E2⒚≯; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ss⒚≯ -T; \u200C\u034F。ss\u08E2⒚≯; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ss⒚≯ -N; \u200C\u034F。ss\u08E2⒚≯; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ss⒚≯ -T; \u200C\u034F。ss\u08E2⒚>\u0338; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ss⒚≯ -N; \u200C\u034F。ss\u08E2⒚>\u0338; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ss⒚≯ -T; \u200C\u034F。Ss\u08E2⒚>\u0338; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ss⒚≯ -N; \u200C\u034F。Ss\u08E2⒚>\u0338; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ss⒚≯ -T; \u200C\u034F。Ss\u08E2⒚≯; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6 A4_2] # .ss⒚≯ -N; \u200C\u034F。Ss\u08E2⒚≯; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # .ss⒚≯ -B; .xn--ss-9if872xjjc; [B5 B6 V6 A4_2]; [B5 B6 V6 A4_2] # .ss⒚≯ -B; xn--0ug.xn--ss-9if872xjjc; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # .ss⒚≯ -B; xn--0ug.xn--zca612bx9vo5b; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # .ß⒚≯ -T; \u200C𞥍ᡌ.𣃔; [B1 C1 P1 V6]; [B2 B3 P1 V6] # ᡌ.𣃔 -N; \u200C𞥍ᡌ.𣃔; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ᡌ.𣃔 -T; \u200C𞥍ᡌ.𣃔; [B1 C1 P1 V6]; [B2 B3 P1 V6] # ᡌ.𣃔 -N; \u200C𞥍ᡌ.𣃔; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ᡌ.𣃔 -B; xn--c8e5919u.xn--od1j; [B2 B3 V6]; [B2 B3 V6] -B; xn--c8e180bqz13b.xn--od1j; [B1 C1 V6]; [B1 C1 V6] # ᡌ.𣃔 -B; \u07D0򜬝-񡢬。\u0FA0Ⴛ𞷏𝆬; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ߐ-.ྠႻ𝆬 -B; \u07D0򜬝-񡢬。\u0FA0ⴛ𞷏𝆬; [B1 B2 B3 P1 V5 V6]; [B1 B2 B3 P1 V5 V6] # ߐ-.ྠⴛ𝆬 -B; xn----8bd11730jefvw.xn--wfd802mpm20agsxa; [B1 B2 B3 V5 V6]; [B1 B2 B3 V5 V6] # ߐ-.ྠⴛ𝆬 -B; xn----8bd11730jefvw.xn--wfd08cd265hgsxa; [B1 B2 B3 V5 V6]; [B1 B2 B3 V5 V6] # ߐ-.ྠႻ𝆬 -B; 𝨥。⫟𑈾; [V5]; [V5] -B; xn--n82h.xn--63iw010f; [V5]; [V5] -T; ⾛\u0753.Ⴕ𞠬\u0604\u200D; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # 走ݓ.Ⴕ𞠬 -N; ⾛\u0753.Ⴕ𞠬\u0604\u200D; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # 走ݓ.Ⴕ𞠬 -T; 走\u0753.Ⴕ𞠬\u0604\u200D; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # 走ݓ.Ⴕ𞠬 -N; 走\u0753.Ⴕ𞠬\u0604\u200D; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # 走ݓ.Ⴕ𞠬 -T; 走\u0753.ⴕ𞠬\u0604\u200D; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # 走ݓ.ⴕ𞠬 -N; 走\u0753.ⴕ𞠬\u0604\u200D; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # 走ݓ.ⴕ𞠬 -B; xn--6ob9779d.xn--mfb511rxu80a; [B5 B6 V6]; [B5 B6 V6] # 走ݓ.ⴕ𞠬 -B; xn--6ob9779d.xn--mfb444k5gjt754b; [B5 B6 C2 V6]; [B5 B6 C2 V6] # 走ݓ.ⴕ𞠬 -B; xn--6ob9779d.xn--mfb785ck569a; [B5 B6 V6]; [B5 B6 V6] # 走ݓ.Ⴕ𞠬 -B; xn--6ob9779d.xn--mfb785czmm0y85b; [B5 B6 C2 V6]; [B5 B6 C2 V6] # 走ݓ.Ⴕ𞠬 -T; ⾛\u0753.ⴕ𞠬\u0604\u200D; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # 走ݓ.ⴕ𞠬 -N; ⾛\u0753.ⴕ𞠬\u0604\u200D; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # 走ݓ.ⴕ𞠬 -T; -ᢗ\u200C🄄.𑜢; [C1 P1 V3 V5 V6]; [P1 V3 V5 V6] # -ᢗ🄄.𑜢 -N; -ᢗ\u200C🄄.𑜢; [C1 P1 V3 V5 V6]; [C1 P1 V3 V5 V6] # -ᢗ🄄.𑜢 -T; -ᢗ\u200C3,.𑜢; [C1 P1 V3 V5 V6]; [P1 V3 V5 V6] # -ᢗ3,.𑜢 -N; -ᢗ\u200C3,.𑜢; [C1 P1 V3 V5 V6]; [C1 P1 V3 V5 V6] # -ᢗ3,.𑜢 -B; xn---3,-3eu.xn--9h2d; [P1 V3 V5 V6]; [P1 V3 V5 V6] -B; xn---3,-3eu051c.xn--9h2d; [C1 P1 V3 V5 V6]; [C1 P1 V3 V5 V6] # -ᢗ3,.𑜢 -B; xn----pck1820x.xn--9h2d; [V3 V5 V6]; [V3 V5 V6] -B; xn----pck312bx563c.xn--9h2d; [C1 V3 V5 V6]; [C1 V3 V5 V6] # -ᢗ🄄.𑜢 -T; ≠𐸁𹏁\u200C.Ⴚ򳄠; [B1 C1 P1 V6]; [B1 P1 V6] # ≠.Ⴚ -N; ≠𐸁𹏁\u200C.Ⴚ򳄠; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ≠.Ⴚ -T; =\u0338𐸁𹏁\u200C.Ⴚ򳄠; [B1 C1 P1 V6]; [B1 P1 V6] # ≠.Ⴚ -N; =\u0338𐸁𹏁\u200C.Ⴚ򳄠; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ≠.Ⴚ -T; =\u0338𐸁𹏁\u200C.ⴚ򳄠; [B1 C1 P1 V6]; [B1 P1 V6] # ≠.ⴚ -N; =\u0338𐸁𹏁\u200C.ⴚ򳄠; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ≠.ⴚ -T; ≠𐸁𹏁\u200C.ⴚ򳄠; [B1 C1 P1 V6]; [B1 P1 V6] # ≠.ⴚ -N; ≠𐸁𹏁\u200C.ⴚ򳄠; [B1 C1 P1 V6]; [B1 C1 P1 V6] # ≠.ⴚ -B; xn--1ch2293gv3nr.xn--ilj23531g; [B1 V6]; [B1 V6] -B; xn--0ug83gn618a21ov.xn--ilj23531g; [B1 C1 V6]; [B1 C1 V6] # ≠.ⴚ -B; xn--1ch2293gv3nr.xn--ynd49496l; [B1 V6]; [B1 V6] -B; xn--0ug83gn618a21ov.xn--ynd49496l; [B1 C1 V6]; [B1 C1 V6] # ≠.Ⴚ -B; \u0669。󠇀𑇊; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ٩.𑇊 -B; \u0669。󠇀𑇊; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ٩.𑇊 -B; xn--iib.xn--6d1d; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ٩.𑇊 -B; \u1086𞶀≯⒍。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ႆ≯⒍.- -B; \u1086𞶀>\u0338⒍。-; [B1 P1 V3 V5 V6]; [B1 P1 V3 V5 V6] # ႆ≯⒍.- -B; \u1086𞶀≯6.。-; [B1 P1 V3 V5 V6 A4_2]; [B1 P1 V3 V5 V6 A4_2] # ႆ≯6..- -B; \u1086𞶀>\u03386.。-; [B1 P1 V3 V5 V6 A4_2]; [B1 P1 V3 V5 V6 A4_2] # ႆ≯6..- -B; xn--6-oyg968k7h74b..-; [B1 V3 V5 V6 A4_2]; [B1 V3 V5 V6 A4_2] # ႆ≯6..- -B; xn--hmd482gqqb8730g.-; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ႆ≯⒍.- -B; \u17B4.쮇-; [P1 V3 V5 V6]; [P1 V3 V5 V6] # .쮇- -B; \u17B4.쮇-; [P1 V3 V5 V6]; [P1 V3 V5 V6] # .쮇- -B; xn--z3e.xn----938f; [V3 V5 V6]; [V3 V5 V6] # .쮇- -T; \u200C𑓂。⒈-􀪛; [C1 P1 V6]; [P1 V5 V6] # 𑓂.⒈- -N; \u200C𑓂。⒈-􀪛; [C1 P1 V6]; [C1 P1 V6] # 𑓂.⒈- -T; \u200C𑓂。1.-􀪛; [C1 P1 V3 V6]; [P1 V3 V5 V6] # 𑓂.1.- -N; \u200C𑓂。1.-􀪛; [C1 P1 V3 V6]; [C1 P1 V3 V6] # 𑓂.1.- -B; xn--wz1d.1.xn----rg03o; [V3 V5 V6]; [V3 V5 V6] -B; xn--0ugy057g.1.xn----rg03o; [C1 V3 V6]; [C1 V3 V6] # 𑓂.1.- -B; xn--wz1d.xn----dcp29674o; [V5 V6]; [V5 V6] -B; xn--0ugy057g.xn----dcp29674o; [C1 V6]; [C1 V6] # 𑓂.⒈- -T; ⒈\uFEAE\u200C。\u20E9🖞\u200C𖬴; [B1 C1 P1 V5 V6]; [B1 P1 V5 V6] # ⒈ر.⃩🖞𖬴 -N; ⒈\uFEAE\u200C。\u20E9🖞\u200C𖬴; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # ⒈ر.⃩🖞𖬴 -T; 1.\u0631\u200C。\u20E9🖞\u200C𖬴; [B1 B3 C1 V5]; [B1 V5] # 1.ر.⃩🖞𖬴 -N; 1.\u0631\u200C。\u20E9🖞\u200C𖬴; [B1 B3 C1 V5]; [B1 B3 C1 V5] # 1.ر.⃩🖞𖬴 -B; 1.xn--wgb.xn--c1g6021kg18c; [B1 V5]; [B1 V5] # 1.ر.⃩🖞𖬴 -B; 1.xn--wgb253k.xn--0ugz6a8040fty5d; [B1 B3 C1 V5]; [B1 B3 C1 V5] # 1.ر.⃩🖞𖬴 -B; xn--wgb746m.xn--c1g6021kg18c; [B1 V5 V6]; [B1 V5 V6] # ⒈ر.⃩🖞𖬴 -B; xn--wgb253kmfd.xn--0ugz6a8040fty5d; [B1 C1 V5 V6]; [B1 C1 V5 V6] # ⒈ر.⃩🖞𖬴 -B; 󌭇。𝟐\u1BA8\u07D4; [B1 P1 V6]; [B1 P1 V6] # .2ᮨߔ -B; 󌭇。2\u1BA8\u07D4; [B1 P1 V6]; [B1 P1 V6] # .2ᮨߔ -B; xn--xm89d.xn--2-icd143m; [B1 V6]; [B1 V6] # .2ᮨߔ -T; \uFD8F򫳺.ς\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V6] # مخم.ς𐹷 -N; \uFD8F򫳺.ς\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # مخم.ς𐹷 -T; \u0645\u062E\u0645򫳺.ς\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V6] # مخم.ς𐹷 -N; \u0645\u062E\u0645򫳺.ς\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # مخم.ς𐹷 -T; \u0645\u062E\u0645򫳺.Σ\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V6] # مخم.σ𐹷 -N; \u0645\u062E\u0645򫳺.Σ\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # مخم.σ𐹷 -T; \u0645\u062E\u0645򫳺.σ\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V6] # مخم.σ𐹷 -N; \u0645\u062E\u0645򫳺.σ\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # مخم.σ𐹷 -B; xn--tgb9bb64691z.xn--4xa6667k; [B2 B3 B5 B6 V6]; [B2 B3 B5 B6 V6] # مخم.σ𐹷 -B; xn--tgb9bb64691z.xn--4xa895lrp7n; [B2 B3 B5 B6 C2 V6]; [B2 B3 B5 B6 C2 V6] # مخم.σ𐹷 -B; xn--tgb9bb64691z.xn--3xa006lrp7n; [B2 B3 B5 B6 C2 V6]; [B2 B3 B5 B6 C2 V6] # مخم.ς𐹷 -T; \uFD8F򫳺.Σ\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V6] # مخم.σ𐹷 -N; \uFD8F򫳺.Σ\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # مخم.σ𐹷 -T; \uFD8F򫳺.σ\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V6] # مخم.σ𐹷 -N; \uFD8F򫳺.σ\u200D𐹷; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # مخم.σ𐹷 -B; ⒎\u06C1\u0605。\uAAF6۵𐇽; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ⒎ہ.꫶۵𐇽 -B; 7.\u06C1\u0605。\uAAF6۵𐇽; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 7.ہ.꫶۵𐇽 -B; 7.xn--nfb98a.xn--imb3805fxt8b; [B1 V5 V6]; [B1 V5 V6] # 7.ہ.꫶۵𐇽 -B; xn--nfb98ai25e.xn--imb3805fxt8b; [B1 V5 V6]; [B1 V5 V6] # ⒎ہ.꫶۵𐇽 -B; -ᡥ᠆󍲭。\u0605\u1A5D𐹡; [B1 P1 V3 V6]; [B1 P1 V3 V6] # -ᡥ᠆.ᩝ𐹡 -B; xn----f3j6s87156i.xn--nfb035hoo2p; [B1 V3 V6]; [B1 V3 V6] # -ᡥ᠆.ᩝ𐹡 -T; \u200D.\u06BD\u0663\u0596; [B1 C2]; [A4_2] # .ڽ٣֖ -N; \u200D.\u06BD\u0663\u0596; [B1 C2]; [B1 C2] # .ڽ٣֖ -B; .xn--hcb32bni; [A4_2]; [A4_2] # .ڽ٣֖ -B; xn--1ug.xn--hcb32bni; [B1 C2]; [B1 C2] # .ڽ٣֖ -B; xn--hcb32bni; \u06BD\u0663\u0596; xn--hcb32bni # ڽ٣֖ -B; \u06BD\u0663\u0596; ; xn--hcb32bni # ڽ٣֖ -T; 㒧۱.Ⴚ\u0678\u200D; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # 㒧۱.Ⴚيٴ -N; 㒧۱.Ⴚ\u0678\u200D; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # 㒧۱.Ⴚيٴ -T; 㒧۱.Ⴚ\u064A\u0674\u200D; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # 㒧۱.Ⴚيٴ -N; 㒧۱.Ⴚ\u064A\u0674\u200D; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # 㒧۱.Ⴚيٴ -T; 㒧۱.ⴚ\u064A\u0674\u200D; [B5 B6 C2]; [B5 B6] # 㒧۱.ⴚيٴ -N; 㒧۱.ⴚ\u064A\u0674\u200D; [B5 B6 C2]; [B5 B6 C2] # 㒧۱.ⴚيٴ -B; xn--emb715u.xn--mhb8fy26k; [B5 B6]; [B5 B6] # 㒧۱.ⴚيٴ -B; xn--emb715u.xn--mhb8f960g03l; [B5 B6 C2]; [B5 B6 C2] # 㒧۱.ⴚيٴ -B; xn--emb715u.xn--mhb8f817a; [B5 B6 V6]; [B5 B6 V6] # 㒧۱.Ⴚيٴ -B; xn--emb715u.xn--mhb8f817ao2p; [B5 B6 C2 V6]; [B5 B6 C2 V6] # 㒧۱.Ⴚيٴ -T; 㒧۱.ⴚ\u0678\u200D; [B5 B6 C2]; [B5 B6] # 㒧۱.ⴚيٴ -N; 㒧۱.ⴚ\u0678\u200D; [B5 B6 C2]; [B5 B6 C2] # 㒧۱.ⴚيٴ -B; \u0F94ꡋ-.-𖬴; [V3 V5]; [V3 V5] # ྔꡋ-.-𖬴 -B; \u0F94ꡋ-.-𖬴; [V3 V5]; [V3 V5] # ྔꡋ-.-𖬴 -B; xn----ukg9938i.xn----4u5m; [V3 V5]; [V3 V5] # ྔꡋ-.-𖬴 -T; 񿒳-⋢\u200C.标-; [C1 P1 V3 V6]; [P1 V3 V6] # -⋢.标- -N; 񿒳-⋢\u200C.标-; [C1 P1 V3 V6]; [C1 P1 V3 V6] # -⋢.标- -T; 񿒳-⊑\u0338\u200C.标-; [C1 P1 V3 V6]; [P1 V3 V6] # -⋢.标- -N; 񿒳-⊑\u0338\u200C.标-; [C1 P1 V3 V6]; [C1 P1 V3 V6] # -⋢.标- -T; 񿒳-⋢\u200C.标-; [C1 P1 V3 V6]; [P1 V3 V6] # -⋢.标- -N; 񿒳-⋢\u200C.标-; [C1 P1 V3 V6]; [C1 P1 V3 V6] # -⋢.标- -T; 񿒳-⊑\u0338\u200C.标-; [C1 P1 V3 V6]; [P1 V3 V6] # -⋢.标- -N; 񿒳-⊑\u0338\u200C.标-; [C1 P1 V3 V6]; [C1 P1 V3 V6] # -⋢.标- -B; xn----9mo67451g.xn----qj7b; [V3 V6]; [V3 V6] -B; xn----sgn90kn5663a.xn----qj7b; [C1 V3 V6]; [C1 V3 V6] # -⋢.标- -T; \u0671.ς\u07DC; [B5 B6]; [B5 B6] # ٱ.ςߜ -N; \u0671.ς\u07DC; [B5 B6]; [B5 B6] # ٱ.ςߜ -T; \u0671.ς\u07DC; [B5 B6]; [B5 B6] # ٱ.ςߜ -N; \u0671.ς\u07DC; [B5 B6]; [B5 B6] # ٱ.ςߜ -B; \u0671.Σ\u07DC; [B5 B6]; [B5 B6] # ٱ.σߜ -B; \u0671.σ\u07DC; [B5 B6]; [B5 B6] # ٱ.σߜ -B; xn--qib.xn--4xa21s; [B5 B6]; [B5 B6] # ٱ.σߜ -B; xn--qib.xn--3xa41s; [B5 B6]; [B5 B6] # ٱ.ςߜ -B; \u0671.Σ\u07DC; [B5 B6]; [B5 B6] # ٱ.σߜ -B; \u0671.σ\u07DC; [B5 B6]; [B5 B6] # ٱ.σߜ -T; 񼈶\u0605.\u08C1\u200D𑑂𱼱; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V6] # .𑑂 -N; 񼈶\u0605.\u08C1\u200D𑑂𱼱; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # .𑑂 -T; 񼈶\u0605.\u08C1\u200D𑑂𱼱; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 P1 V6] # .𑑂 -N; 񼈶\u0605.\u08C1\u200D𑑂𱼱; [B2 B3 B5 B6 C2 P1 V6]; [B2 B3 B5 B6 C2 P1 V6] # .𑑂 -B; xn--nfb17942h.xn--nzb6708kx3pn; [B2 B3 B5 B6 V6]; [B2 B3 B5 B6 V6] # .𑑂 -B; xn--nfb17942h.xn--nzb240jv06otevq; [B2 B3 B5 B6 C2 V6]; [B2 B3 B5 B6 C2 V6] # .𑑂 -B; 𐹾𐋩𞵜。\u1BF2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𐹾𐋩.᯲ -B; 𐹾𐋩𞵜。\u1BF2; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𐹾𐋩.᯲ -B; xn--d97cn8rn44p.xn--0zf; [B1 V5 V6]; [B1 V5 V6] # 𐹾𐋩.᯲ -T; 6\u1160\u1C33󠸧.򟜊锰\u072Cς; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 6ᰳ.锰ܬς -N; 6\u1160\u1C33󠸧.򟜊锰\u072Cς; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 6ᰳ.锰ܬς -B; 6\u1160\u1C33󠸧.򟜊锰\u072CΣ; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 6ᰳ.锰ܬσ -B; 6\u1160\u1C33󠸧.򟜊锰\u072Cσ; [B1 B5 P1 V6]; [B1 B5 P1 V6] # 6ᰳ.锰ܬσ -B; xn--6-5bh476ewr517a.xn--4xa95ohw6pk078g; [B1 B5 V6]; [B1 B5 V6] # 6ᰳ.锰ܬσ -B; xn--6-5bh476ewr517a.xn--3xa16ohw6pk078g; [B1 B5 V6]; [B1 B5 V6] # 6ᰳ.锰ܬς -B; \u06B3\uFE04񅎦𝟽。𐹽; [B1 B2 P1 V6]; [B1 B2 P1 V6] # ڳ7.𐹽 -B; \u06B3\uFE04񅎦7。𐹽; [B1 B2 P1 V6]; [B1 B2 P1 V6] # ڳ7.𐹽 -B; xn--7-yuc34665f.xn--1o0d; [B1 B2 V6]; [B1 B2 V6] # ڳ7.𐹽 -T; 𞮧.\u200C⫞; [B1 C1 P1 V6]; [B1 P1 V6] # .⫞ -N; 𞮧.\u200C⫞; [B1 C1 P1 V6]; [B1 C1 P1 V6] # .⫞ -T; 𞮧.\u200C⫞; [B1 C1 P1 V6]; [B1 P1 V6] # .⫞ -N; 𞮧.\u200C⫞; [B1 C1 P1 V6]; [B1 C1 P1 V6] # .⫞ -B; xn--pw6h.xn--53i; [B1 V6]; [B1 V6] -B; xn--pw6h.xn--0ug283b; [B1 C1 V6]; [B1 C1 V6] # .⫞ -B; -񕉴.\u06E0ᢚ-; [P1 V3 V5 V6]; [P1 V3 V5 V6] # -.۠ᢚ- -B; xn----qi38c.xn----jxc827k; [V3 V5 V6]; [V3 V5 V6] # -.۠ᢚ- -T; ⌁\u200D𑄴.\u200C𝟩\u066C; [B1 C1 C2]; [B1] # ⌁𑄴.7٬ -N; ⌁\u200D𑄴.\u200C𝟩\u066C; [B1 C1 C2]; [B1 C1 C2] # ⌁𑄴.7٬ -T; ⌁\u200D𑄴.\u200C7\u066C; [B1 C1 C2]; [B1] # ⌁𑄴.7٬ -N; ⌁\u200D𑄴.\u200C7\u066C; [B1 C1 C2]; [B1 C1 C2] # ⌁𑄴.7٬ -B; xn--nhh5394g.xn--7-xqc; [B1]; [B1] # ⌁𑄴.7٬ -B; xn--1ug38i2093a.xn--7-xqc297q; [B1 C1 C2]; [B1 C1 C2] # ⌁𑄴.7٬ -B; ︒\uFD05\u0E37\uFEFC。岓\u1BF2󠾃ᡂ; [B1 P1 V6]; [B1 P1 V6] # ︒صىืلا.岓᯲ᡂ -B; 。\u0635\u0649\u0E37\u0644\u0627。岓\u1BF2󠾃ᡂ; [P1 V6 A4_2]; [P1 V6 A4_2] # .صىืلا.岓᯲ᡂ -B; .xn--mgb1a7bt462h.xn--17e10qe61f9r71s; [V6 A4_2]; [V6 A4_2] # .صىืلا.岓᯲ᡂ -B; xn--mgb1a7bt462hf267a.xn--17e10qe61f9r71s; [B1 V6]; [B1 V6] # ︒صىืلا.岓᯲ᡂ -B; 𐹨。8𑁆; [B1]; [B1] -B; xn--go0d.xn--8-yu7i; [B1]; [B1] -B; 𞀕\u0D43.ꡚ\u08FA𐹰\u0D44; [B1 B3 B5 B6 V5]; [B1 B3 B5 B6 V5] # 𞀕ൃ.ꡚࣺ𐹰ൄ -B; 𞀕\u0D43.ꡚ\u08FA𐹰\u0D44; [B1 B3 B5 B6 V5]; [B1 B3 B5 B6 V5] # 𞀕ൃ.ꡚࣺ𐹰ൄ -B; xn--mxc5210v.xn--90b01t8u2p1ltd; [B1 B3 B5 B6 V5]; [B1 B3 B5 B6 V5] # 𞀕ൃ.ꡚࣺ𐹰ൄ -B; 󆩏𐦹\u0303。󠍅; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ̃. -B; 󆩏𐦹\u0303。󠍅; [B1 B5 B6 P1 V6]; [B1 B5 B6 P1 V6] # ̃. -B; xn--nsa1265kp9z9e.xn--xt36e; [B1 B5 B6 V6]; [B1 B5 B6 V6] # ̃. -B; ᢌ.-\u085A; [V3]; [V3] # ᢌ.-࡚ -B; ᢌ.-\u085A; [V3]; [V3] # ᢌ.-࡚ -B; xn--59e.xn----5jd; [V3]; [V3] # ᢌ.-࡚ -B; 𥛛𑘶。𐹬𐲸\u0BCD; [B1 P1 V6]; [B1 P1 V6] # 𥛛𑘶.𐹬் -B; 𥛛𑘶。𐹬𐲸\u0BCD; [B1 P1 V6]; [B1 P1 V6] # 𥛛𑘶.𐹬் -B; xn--jb2dj685c.xn--xmc5562kmcb; [B1 V6]; [B1 V6] # 𥛛𑘶.𐹬் -T; Ⴐ\u077F.\u200C; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # Ⴐݿ. -N; Ⴐ\u077F.\u200C; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # Ⴐݿ. -T; Ⴐ\u077F.\u200C; [B1 B5 B6 C1 P1 V6]; [B5 B6 P1 V6] # Ⴐݿ. -N; Ⴐ\u077F.\u200C; [B1 B5 B6 C1 P1 V6]; [B1 B5 B6 C1 P1 V6] # Ⴐݿ. -T; ⴐ\u077F.\u200C; [B1 B5 B6 C1]; [B5 B6] # ⴐݿ. -N; ⴐ\u077F.\u200C; [B1 B5 B6 C1]; [B1 B5 B6 C1] # ⴐݿ. -B; xn--gqb743q.; [B5 B6]; [B5 B6] # ⴐݿ. -B; xn--gqb743q.xn--0ug; [B1 B5 B6 C1]; [B1 B5 B6 C1] # ⴐݿ. -B; xn--gqb918b.; [B5 B6 V6]; [B5 B6 V6] # Ⴐݿ. -B; xn--gqb918b.xn--0ug; [B1 B5 B6 C1 V6]; [B1 B5 B6 C1 V6] # Ⴐݿ. -T; ⴐ\u077F.\u200C; [B1 B5 B6 C1]; [B5 B6] # ⴐݿ. -N; ⴐ\u077F.\u200C; [B1 B5 B6 C1]; [B1 B5 B6 C1] # ⴐݿ. -T; 🄅𑲞-⒈。\u200Dᠩ\u06A5; [B1 C2 P1 V6]; [B1 B5 B6 P1 V6] # 🄅𑲞-⒈.ᠩڥ -N; 🄅𑲞-⒈。\u200Dᠩ\u06A5; [B1 C2 P1 V6]; [B1 C2 P1 V6] # 🄅𑲞-⒈.ᠩڥ -T; 4,𑲞-1.。\u200Dᠩ\u06A5; [B1 C2 P1 V6 A4_2]; [B1 B5 B6 P1 V6 A4_2] # 4,𑲞-1..ᠩڥ -N; 4,𑲞-1.。\u200Dᠩ\u06A5; [B1 C2 P1 V6 A4_2]; [B1 C2 P1 V6 A4_2] # 4,𑲞-1..ᠩڥ -B; xn--4,-1-w401a..xn--7jb180g; [B1 B5 B6 P1 V6 A4_2]; [B1 B5 B6 P1 V6 A4_2] # 4,𑲞-1..ᠩڥ -B; xn--4,-1-w401a..xn--7jb180gexf; [B1 C2 P1 V6 A4_2]; [B1 C2 P1 V6 A4_2] # 4,𑲞-1..ᠩڥ -B; xn----ecp8796hjtvg.xn--7jb180g; [B1 B5 B6 V6]; [B1 B5 B6 V6] # 🄅𑲞-⒈.ᠩڥ -B; xn----ecp8796hjtvg.xn--7jb180gexf; [B1 C2 V6]; [B1 C2 V6] # 🄅𑲞-⒈.ᠩڥ -B; 񗀤。𞤪򮿋; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; 񗀤。𞤈򮿋; [B2 B3 P1 V6]; [B2 B3 P1 V6] -B; xn--4240a.xn--ie6h83808a; [B2 B3 V6]; [B2 B3 V6] -B; \u05C1۲。𐮊\u066C𝨊鄨; [B1 B2 B3 V5]; [B1 B2 B3 V5] # ׁ۲.𐮊٬𝨊鄨 -B; \u05C1۲。𐮊\u066C𝨊鄨; [B1 B2 B3 V5]; [B1 B2 B3 V5] # ׁ۲.𐮊٬𝨊鄨 -B; xn--pdb42d.xn--lib6412enztdwv6h; [B1 B2 B3 V5]; [B1 B2 B3 V5] # ׁ۲.𐮊٬𝨊鄨 -B; 𞭳-ꡁ。\u1A69\u0BCD-; [B1 B2 B3 P1 V3 V5 V6]; [B1 B2 B3 P1 V3 V5 V6] # -ꡁ.ᩩ்- -B; xn----be4e4276f.xn----lze333i; [B1 B2 B3 V3 V5 V6]; [B1 B2 B3 V3 V5 V6] # -ꡁ.ᩩ்- -T; \u1039-𚮭🞢.ß; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ß -N; \u1039-𚮭🞢.ß; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ß -T; \u1039-𚮭🞢.ß; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ß -N; \u1039-𚮭🞢.ß; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ß -B; \u1039-𚮭🞢.SS; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ss -B; \u1039-𚮭🞢.ss; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ss -B; \u1039-𚮭🞢.Ss; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ss -B; xn----9tg11172akr8b.ss; [V5 V6]; [V5 V6] # ္-🞢.ss -B; xn----9tg11172akr8b.xn--zca; [V5 V6]; [V5 V6] # ္-🞢.ß -B; \u1039-𚮭🞢.SS; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ss -B; \u1039-𚮭🞢.ss; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ss -B; \u1039-𚮭🞢.Ss; [P1 V5 V6]; [P1 V5 V6] # ္-🞢.ss -T; \uFCF2-\u200C。Ⴟ\u200C␣; [B3 B6 C1 P1 V6]; [B3 B6 P1 V3 V6] # ـَّ-.Ⴟ␣ -N; \uFCF2-\u200C。Ⴟ\u200C␣; [B3 B6 C1 P1 V6]; [B3 B6 C1 P1 V6] # ـَّ-.Ⴟ␣ -T; \u0640\u064E\u0651-\u200C。Ⴟ\u200C␣; [B3 B6 C1 P1 V6]; [B3 B6 P1 V3 V6] # ـَّ-.Ⴟ␣ -N; \u0640\u064E\u0651-\u200C。Ⴟ\u200C␣; [B3 B6 C1 P1 V6]; [B3 B6 C1 P1 V6] # ـَّ-.Ⴟ␣ -T; \u0640\u064E\u0651-\u200C。ⴟ\u200C␣; [B3 B6 C1]; [B3 B6 V3] # ـَّ-.ⴟ␣ -N; \u0640\u064E\u0651-\u200C。ⴟ\u200C␣; [B3 B6 C1]; [B3 B6 C1] # ـَّ-.ⴟ␣ -B; xn----eoc6bm.xn--xph904a; [B3 B6 V3]; [B3 B6 V3] # ـَّ-.ⴟ␣ -B; xn----eoc6bm0504a.xn--0ug13nd0j; [B3 B6 C1]; [B3 B6 C1] # ـَّ-.ⴟ␣ -B; xn----eoc6bm.xn--3nd240h; [B3 B6 V3 V6]; [B3 B6 V3 V6] # ـَّ-.Ⴟ␣ -B; xn----eoc6bm0504a.xn--3nd849e05c; [B3 B6 C1 V6]; [B3 B6 C1 V6] # ـَّ-.Ⴟ␣ -T; \uFCF2-\u200C。ⴟ\u200C␣; [B3 B6 C1]; [B3 B6 V3] # ـَّ-.ⴟ␣ -N; \uFCF2-\u200C。ⴟ\u200C␣; [B3 B6 C1]; [B3 B6 C1] # ـَّ-.ⴟ␣ -T; \u0D4D-\u200D\u200C。񥞧₅≠; [C1 C2 P1 V5 V6]; [P1 V3 V5 V6] # ്-.5≠ -N; \u0D4D-\u200D\u200C。񥞧₅≠; [C1 C2 P1 V5 V6]; [C1 C2 P1 V5 V6] # ്-.5≠ -T; \u0D4D-\u200D\u200C。񥞧₅=\u0338; [C1 C2 P1 V5 V6]; [P1 V3 V5 V6] # ്-.5≠ -N; \u0D4D-\u200D\u200C。񥞧₅=\u0338; [C1 C2 P1 V5 V6]; [C1 C2 P1 V5 V6] # ്-.5≠ -T; \u0D4D-\u200D\u200C。񥞧5≠; [C1 C2 P1 V5 V6]; [P1 V3 V5 V6] # ്-.5≠ -N; \u0D4D-\u200D\u200C。񥞧5≠; [C1 C2 P1 V5 V6]; [C1 C2 P1 V5 V6] # ്-.5≠ -T; \u0D4D-\u200D\u200C。񥞧5=\u0338; [C1 C2 P1 V5 V6]; [P1 V3 V5 V6] # ്-.5≠ -N; \u0D4D-\u200D\u200C。񥞧5=\u0338; [C1 C2 P1 V5 V6]; [C1 C2 P1 V5 V6] # ്-.5≠ -B; xn----jmf.xn--5-ufo50192e; [V3 V5 V6]; [V3 V5 V6] # ്-.5≠ -B; xn----jmf215lda.xn--5-ufo50192e; [C1 C2 V5 V6]; [C1 C2 V5 V6] # ്-.5≠ -B; 锣。\u0A4D󠘻󠚆; [P1 V5 V6]; [P1 V5 V6] # 锣.੍ -B; xn--gc5a.xn--ybc83044ppga; [V5 V6]; [V5 V6] # 锣.੍ -T; \u063D𑈾.\u0649\u200D\uA92B; [B3 C2]; xn--8gb2338k.xn--lhb0154f # ؽ𑈾.ى꤫ -N; \u063D𑈾.\u0649\u200D\uA92B; [B3 C2]; [B3 C2] # ؽ𑈾.ى꤫ -T; \u063D𑈾.\u0649\u200D\uA92B; [B3 C2]; xn--8gb2338k.xn--lhb0154f # ؽ𑈾.ى꤫ -N; \u063D𑈾.\u0649\u200D\uA92B; [B3 C2]; [B3 C2] # ؽ𑈾.ى꤫ -B; xn--8gb2338k.xn--lhb0154f; \u063D𑈾.\u0649\uA92B; xn--8gb2338k.xn--lhb0154f # ؽ𑈾.ى꤫ -B; \u063D𑈾.\u0649\uA92B; ; xn--8gb2338k.xn--lhb0154f # ؽ𑈾.ى꤫ -B; xn--8gb2338k.xn--lhb603k060h; [B3 C2]; [B3 C2] # ؽ𑈾.ى꤫ -T; \u0666⁴Ⴅ.\u08BD\u200C; [B1 B3 C1 P1 V6]; [B1 P1 V6] # ٦4Ⴅ.ࢽ -N; \u0666⁴Ⴅ.\u08BD\u200C; [B1 B3 C1 P1 V6]; [B1 B3 C1 P1 V6] # ٦4Ⴅ.ࢽ -T; \u06664Ⴅ.\u08BD\u200C; [B1 B3 C1 P1 V6]; [B1 P1 V6] # ٦4Ⴅ.ࢽ -N; \u06664Ⴅ.\u08BD\u200C; [B1 B3 C1 P1 V6]; [B1 B3 C1 P1 V6] # ٦4Ⴅ.ࢽ -T; \u06664ⴅ.\u08BD\u200C; [B1 B3 C1]; [B1] # ٦4ⴅ.ࢽ -N; \u06664ⴅ.\u08BD\u200C; [B1 B3 C1]; [B1 B3 C1] # ٦4ⴅ.ࢽ -B; xn--4-kqc6770a.xn--jzb; [B1]; [B1] # ٦4ⴅ.ࢽ -B; xn--4-kqc6770a.xn--jzb840j; [B1 B3 C1]; [B1 B3 C1] # ٦4ⴅ.ࢽ -B; xn--4-kqc489e.xn--jzb; [B1 V6]; [B1 V6] # ٦4Ⴅ.ࢽ -B; xn--4-kqc489e.xn--jzb840j; [B1 B3 C1 V6]; [B1 B3 C1 V6] # ٦4Ⴅ.ࢽ -T; \u0666⁴ⴅ.\u08BD\u200C; [B1 B3 C1]; [B1] # ٦4ⴅ.ࢽ -N; \u0666⁴ⴅ.\u08BD\u200C; [B1 B3 C1]; [B1 B3 C1] # ٦4ⴅ.ࢽ -T; ჁႱ6\u0318。ß\u1B03; [P1 V6]; [P1 V6] # ჁႱ6̘.ßᬃ -N; ჁႱ6\u0318。ß\u1B03; [P1 V6]; [P1 V6] # ჁႱ6̘.ßᬃ -T; ⴡⴑ6\u0318。ß\u1B03; ⴡⴑ6\u0318.ß\u1B03; xn--6-8cb7433a2ba.xn--ss-2vq # ⴡⴑ6̘.ßᬃ -N; ⴡⴑ6\u0318。ß\u1B03; ⴡⴑ6\u0318.ß\u1B03; xn--6-8cb7433a2ba.xn--zca894k # ⴡⴑ6̘.ßᬃ -B; ჁႱ6\u0318。SS\u1B03; [P1 V6]; [P1 V6] # ჁႱ6̘.ssᬃ -B; ⴡⴑ6\u0318。ss\u1B03; ⴡⴑ6\u0318.ss\u1B03; xn--6-8cb7433a2ba.xn--ss-2vq # ⴡⴑ6̘.ssᬃ -B; Ⴡⴑ6\u0318。Ss\u1B03; [P1 V6]; [P1 V6] # Ⴡⴑ6̘.ssᬃ -B; xn--6-8cb306hms1a.xn--ss-2vq; [V6]; [V6] # Ⴡⴑ6̘.ssᬃ -B; xn--6-8cb7433a2ba.xn--ss-2vq; ⴡⴑ6\u0318.ss\u1B03; xn--6-8cb7433a2ba.xn--ss-2vq # ⴡⴑ6̘.ssᬃ -B; ⴡⴑ6\u0318.ss\u1B03; ; xn--6-8cb7433a2ba.xn--ss-2vq # ⴡⴑ6̘.ssᬃ -B; ჁႱ6\u0318.SS\u1B03; [P1 V6]; [P1 V6] # ჁႱ6̘.ssᬃ -B; Ⴡⴑ6\u0318.Ss\u1B03; [P1 V6]; [P1 V6] # Ⴡⴑ6̘.ssᬃ -B; xn--6-8cb555h2b.xn--ss-2vq; [V6]; [V6] # ჁႱ6̘.ssᬃ -B; xn--6-8cb7433a2ba.xn--zca894k; ⴡⴑ6\u0318.ß\u1B03; xn--6-8cb7433a2ba.xn--zca894k # ⴡⴑ6̘.ßᬃ -T; ⴡⴑ6\u0318.ß\u1B03; ; xn--6-8cb7433a2ba.xn--ss-2vq # ⴡⴑ6̘.ßᬃ -N; ⴡⴑ6\u0318.ß\u1B03; ; xn--6-8cb7433a2ba.xn--zca894k # ⴡⴑ6̘.ßᬃ -B; xn--6-8cb555h2b.xn--zca894k; [V6]; [V6] # ჁႱ6̘.ßᬃ -B; 򋡐。≯𑋪; [P1 V6]; [P1 V6] -B; 򋡐。>\u0338𑋪; [P1 V6]; [P1 V6] -B; 򋡐。≯𑋪; [P1 V6]; [P1 V6] -B; 򋡐。>\u0338𑋪; [P1 V6]; [P1 V6] -B; xn--eo08b.xn--hdh3385g; [V6]; [V6] -T; \u065A۲。\u200C-\u1BF3\u08E2; [B1 C1 P1 V5 V6]; [B1 P1 V3 V5 V6] # ٚ۲.-᯳ -N; \u065A۲。\u200C-\u1BF3\u08E2; [B1 C1 P1 V5 V6]; [B1 C1 P1 V5 V6] # ٚ۲.-᯳ -B; xn--2hb81a.xn----xrd657l; [B1 V3 V5 V6]; [B1 V3 V5 V6] # ٚ۲.-᯳ -B; xn--2hb81a.xn----xrd657l30d; [B1 C1 V5 V6]; [B1 C1 V5 V6] # ٚ۲.-᯳ -B; 󠄏𖬴󠲽。\uFFA0; [P1 V5 V6]; [P1 V5 V6] # 𖬴. -B; 󠄏𖬴󠲽。\u1160; [P1 V5 V6]; [P1 V5 V6] # 𖬴. -B; xn--619ep9154c.xn--psd; [V5 V6]; [V5 V6] # 𖬴. -B; xn--619ep9154c.xn--cl7c; [V5 V6]; [V5 V6] # 𖬴. -T; ß⒈\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B5 P1 V6]; [B5 P1 V6] # ß⒈ݠ. -N; ß⒈\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B5 P1 V6]; [B5 P1 V6] # ß⒈ݠ. -T; ß1.\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B2 B3 B5 P1 V6]; [B2 B3 B5 P1 V6] # ß1.ݠ. -N; ß1.\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B2 B3 B5 P1 V6]; [B2 B3 B5 P1 V6] # ß1.ݠ. -B; SS1.\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B2 B3 B5 P1 V6]; [B2 B3 B5 P1 V6] # ss1.ݠ. -B; ss1.\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B2 B3 B5 P1 V6]; [B2 B3 B5 P1 V6] # ss1.ݠ. -B; Ss1.\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B2 B3 B5 P1 V6]; [B2 B3 B5 P1 V6] # ss1.ݠ. -B; ss1.xn--kpb6677h.xn--nfb09923ifkyyb; [B2 B3 B5 V6]; [B2 B3 B5 V6] # ss1.ݠ. -B; xn--1-pfa.xn--kpb6677h.xn--nfb09923ifkyyb; [B2 B3 B5 V6]; [B2 B3 B5 V6] # ß1.ݠ. -B; SS⒈\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B5 P1 V6]; [B5 P1 V6] # ss⒈ݠ. -B; ss⒈\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B5 P1 V6]; [B5 P1 V6] # ss⒈ݠ. -B; Ss⒈\u0760\uD7AE.􉖲󠅄\u0605򉔯; [B5 P1 V6]; [B5 P1 V6] # ss⒈ݠ. -B; xn--ss-6ke9690a0g1q.xn--nfb09923ifkyyb; [B5 V6]; [B5 V6] # ss⒈ݠ. -B; xn--zca444a0s1ao12n.xn--nfb09923ifkyyb; [B5 V6]; [B5 V6] # ß⒈ݠ. -B; 󠭔.𐋱₂; [P1 V6]; [P1 V6] -B; 󠭔.𐋱2; [P1 V6]; [P1 V6] -B; xn--vi56e.xn--2-w91i; [V6]; [V6] -T; \u0716\u0947。-ß\u06A5\u200C; [B1 C1 V3]; [B1 V3] # ܖे.-ßڥ -N; \u0716\u0947。-ß\u06A5\u200C; [B1 C1 V3]; [B1 C1 V3] # ܖे.-ßڥ -T; \u0716\u0947。-SS\u06A5\u200C; [B1 C1 V3]; [B1 V3] # ܖे.-ssڥ -N; \u0716\u0947。-SS\u06A5\u200C; [B1 C1 V3]; [B1 C1 V3] # ܖे.-ssڥ -T; \u0716\u0947。-ss\u06A5\u200C; [B1 C1 V3]; [B1 V3] # ܖे.-ssڥ -N; \u0716\u0947。-ss\u06A5\u200C; [B1 C1 V3]; [B1 C1 V3] # ܖे.-ssڥ -T; \u0716\u0947。-Ss\u06A5\u200C; [B1 C1 V3]; [B1 V3] # ܖे.-ssڥ -N; \u0716\u0947。-Ss\u06A5\u200C; [B1 C1 V3]; [B1 C1 V3] # ܖे.-ssڥ -B; xn--gnb63i.xn---ss-4ef; [B1 V3]; [B1 V3] # ܖे.-ssڥ -B; xn--gnb63i.xn---ss-4ef9263a; [B1 C1 V3]; [B1 C1 V3] # ܖे.-ssڥ -B; xn--gnb63i.xn----qfa845bhx4a; [B1 C1 V3]; [B1 C1 V3] # ܖे.-ßڥ -T; \u1BA9\u200D\u062A񡚈.\u1CD5䷉Ⴡ; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ᮩت.᳕䷉Ⴡ -N; \u1BA9\u200D\u062A񡚈.\u1CD5䷉Ⴡ; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ᮩت.᳕䷉Ⴡ -T; \u1BA9\u200D\u062A񡚈.\u1CD5䷉Ⴡ; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ᮩت.᳕䷉Ⴡ -N; \u1BA9\u200D\u062A񡚈.\u1CD5䷉Ⴡ; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ᮩت.᳕䷉Ⴡ -T; \u1BA9\u200D\u062A񡚈.\u1CD5䷉ⴡ; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ᮩت.᳕䷉ⴡ -N; \u1BA9\u200D\u062A񡚈.\u1CD5䷉ⴡ; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ᮩت.᳕䷉ⴡ -B; xn--pgb911izv33i.xn--i6f270etuy; [B1 V5 V6]; [B1 V5 V6] # ᮩت.᳕䷉ⴡ -B; xn--pgb911imgdrw34r.xn--i6f270etuy; [B1 C2 V5 V6]; [B1 C2 V5 V6] # ᮩت.᳕䷉ⴡ -B; xn--pgb911izv33i.xn--5nd792dgv3b; [B1 V5 V6]; [B1 V5 V6] # ᮩت.᳕䷉Ⴡ -B; xn--pgb911imgdrw34r.xn--5nd792dgv3b; [B1 C2 V5 V6]; [B1 C2 V5 V6] # ᮩت.᳕䷉Ⴡ -T; \u1BA9\u200D\u062A񡚈.\u1CD5䷉ⴡ; [B1 C2 P1 V5 V6]; [B1 P1 V5 V6] # ᮩت.᳕䷉ⴡ -N; \u1BA9\u200D\u062A񡚈.\u1CD5䷉ⴡ; [B1 C2 P1 V5 V6]; [B1 C2 P1 V5 V6] # ᮩت.᳕䷉ⴡ -T; \u2DBF.ß\u200D; [C2 P1 V6]; [P1 V6] # .ß -N; \u2DBF.ß\u200D; [C2 P1 V6]; [C2 P1 V6] # .ß -T; \u2DBF.SS\u200D; [C2 P1 V6]; [P1 V6] # .ss -N; \u2DBF.SS\u200D; [C2 P1 V6]; [C2 P1 V6] # .ss -T; \u2DBF.ss\u200D; [C2 P1 V6]; [P1 V6] # .ss -N; \u2DBF.ss\u200D; [C2 P1 V6]; [C2 P1 V6] # .ss -T; \u2DBF.Ss\u200D; [C2 P1 V6]; [P1 V6] # .ss -N; \u2DBF.Ss\u200D; [C2 P1 V6]; [C2 P1 V6] # .ss -B; xn--7pj.ss; [V6]; [V6] # .ss -B; xn--7pj.xn--ss-n1t; [C2 V6]; [C2 V6] # .ss -B; xn--7pj.xn--zca870n; [C2 V6]; [C2 V6] # .ß -B; \u1BF3︒.\u062A≯ꡂ; [B2 B3 B6 P1 V5 V6]; [B2 B3 B6 P1 V5 V6] # ᯳︒.ت≯ꡂ -B; \u1BF3︒.\u062A>\u0338ꡂ; [B2 B3 B6 P1 V5 V6]; [B2 B3 B6 P1 V5 V6] # ᯳︒.ت≯ꡂ -B; \u1BF3。.\u062A≯ꡂ; [B2 B3 P1 V5 V6 A4_2]; [B2 B3 P1 V5 V6 A4_2] # ᯳..ت≯ꡂ -B; \u1BF3。.\u062A>\u0338ꡂ; [B2 B3 P1 V5 V6 A4_2]; [B2 B3 P1 V5 V6 A4_2] # ᯳..ت≯ꡂ -B; xn--1zf..xn--pgb885lry5g; [B2 B3 V5 V6 A4_2]; [B2 B3 V5 V6 A4_2] # ᯳..ت≯ꡂ -B; xn--1zf8957g.xn--pgb885lry5g; [B2 B3 B6 V5 V6]; [B2 B3 B6 V5 V6] # ᯳︒.ت≯ꡂ -B; ≮≠񏻃。-𫠆\u06B7𐹪; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ≮≠.-𫠆ڷ𐹪 -B; <\u0338=\u0338񏻃。-𫠆\u06B7𐹪; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ≮≠.-𫠆ڷ𐹪 -B; ≮≠񏻃。-𫠆\u06B7𐹪; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ≮≠.-𫠆ڷ𐹪 -B; <\u0338=\u0338񏻃。-𫠆\u06B7𐹪; [B1 P1 V3 V6]; [B1 P1 V3 V6] # ≮≠.-𫠆ڷ𐹪 -B; xn--1ch1a29470f.xn----7uc5363rc1rn; [B1 V3 V6]; [B1 V3 V6] # ≮≠.-𫠆ڷ𐹪 -B; 𐹡\u0777。ꡂ; [B1]; [B1] # 𐹡ݷ.ꡂ -B; xn--7pb5275k.xn--bc9a; [B1]; [B1] # 𐹡ݷ.ꡂ -T; Ⴉ𝆅񔻅\u0619.ß𐧦𐹳\u0775; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴉؙ𝆅.ß𐧦𐹳ݵ -N; Ⴉ𝆅񔻅\u0619.ß𐧦𐹳\u0775; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴉؙ𝆅.ß𐧦𐹳ݵ -T; ⴉ𝆅񔻅\u0619.ß𐧦𐹳\u0775; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ⴉؙ𝆅.ß𐧦𐹳ݵ -N; ⴉ𝆅񔻅\u0619.ß𐧦𐹳\u0775; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ⴉؙ𝆅.ß𐧦𐹳ݵ -B; Ⴉ𝆅񔻅\u0619.SS𐧦𐹳\u0775; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴉؙ𝆅.ss𐧦𐹳ݵ -B; ⴉ𝆅񔻅\u0619.ss𐧦𐹳\u0775; [B5 B6 P1 V6]; [B5 B6 P1 V6] # ⴉؙ𝆅.ss𐧦𐹳ݵ -B; Ⴉ𝆅񔻅\u0619.Ss𐧦𐹳\u0775; [B5 B6 P1 V6]; [B5 B6 P1 V6] # Ⴉؙ𝆅.ss𐧦𐹳ݵ -B; xn--7fb125cjv87a7xvz.xn--ss-zme7575xp0e; [B5 B6 V6]; [B5 B6 V6] # Ⴉؙ𝆅.ss𐧦𐹳ݵ -B; xn--7fb940rwt3z7xvz.xn--ss-zme7575xp0e; [B5 B6 V6]; [B5 B6 V6] # ⴉؙ𝆅.ss𐧦𐹳ݵ -B; xn--7fb940rwt3z7xvz.xn--zca684a699vf2d; [B5 B6 V6]; [B5 B6 V6] # ⴉؙ𝆅.ß𐧦𐹳ݵ -B; xn--7fb125cjv87a7xvz.xn--zca684a699vf2d; [B5 B6 V6]; [B5 B6 V6] # Ⴉؙ𝆅.ß𐧦𐹳ݵ -T; \u200D\u0643𐧾↙.񊽡; [B1 C2 P1 V6]; [B3 P1 V6] # ك𐧾↙. -N; \u200D\u0643𐧾↙.񊽡; [B1 C2 P1 V6]; [B1 C2 P1 V6] # ك𐧾↙. -B; xn--fhb011lnp8n.xn--7s4w; [B3 V6]; [B3 V6] # ك𐧾↙. -B; xn--fhb713k87ag053c.xn--7s4w; [B1 C2 V6]; [B1 C2 V6] # ك𐧾↙. -T; 梉。\u200C; [C1]; xn--7zv. # 梉. -N; 梉。\u200C; [C1]; [C1] # 梉. -B; xn--7zv.; 梉.; xn--7zv. -B; 梉.; ; xn--7zv. -B; xn--7zv.xn--0ug; [C1]; [C1] # 梉. -T; ꡣ-≠.\u200D𞤗𐅢Ↄ; [B1 B6 C2 P1 V6]; [B2 B3 B6 P1 V6] # ꡣ-≠.𞤹𐅢Ↄ -N; ꡣ-≠.\u200D𞤗𐅢Ↄ; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ꡣ-≠.𞤹𐅢Ↄ -T; ꡣ-=\u0338.\u200D𞤗𐅢Ↄ; [B1 B6 C2 P1 V6]; [B2 B3 B6 P1 V6] # ꡣ-≠.𞤹𐅢Ↄ -N; ꡣ-=\u0338.\u200D𞤗𐅢Ↄ; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ꡣ-≠.𞤹𐅢Ↄ -T; ꡣ-=\u0338.\u200D𞤹𐅢ↄ; [B1 B6 C2 P1 V6]; [B2 B3 B6 P1 V6] # ꡣ-≠.𞤹𐅢ↄ -N; ꡣ-=\u0338.\u200D𞤹𐅢ↄ; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ꡣ-≠.𞤹𐅢ↄ -T; ꡣ-≠.\u200D𞤹𐅢ↄ; [B1 B6 C2 P1 V6]; [B2 B3 B6 P1 V6] # ꡣ-≠.𞤹𐅢ↄ -N; ꡣ-≠.\u200D𞤹𐅢ↄ; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ꡣ-≠.𞤹𐅢ↄ -T; ꡣ-≠.\u200D𞤗𐅢ↄ; [B1 B6 C2 P1 V6]; [B2 B3 B6 P1 V6] # ꡣ-≠.𞤹𐅢ↄ -N; ꡣ-≠.\u200D𞤗𐅢ↄ; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ꡣ-≠.𞤹𐅢ↄ -T; ꡣ-=\u0338.\u200D𞤗𐅢ↄ; [B1 B6 C2 P1 V6]; [B2 B3 B6 P1 V6] # ꡣ-≠.𞤹𐅢ↄ -N; ꡣ-=\u0338.\u200D𞤗𐅢ↄ; [B1 B6 C2 P1 V6]; [B1 B6 C2 P1 V6] # ꡣ-≠.𞤹𐅢ↄ -B; xn----ufo9661d.xn--r5gy929fhm4f; [B2 B3 B6 V6]; [B2 B3 B6 V6] -B; xn----ufo9661d.xn--1ug99cj620c71sh; [B1 B6 C2 V6]; [B1 B6 C2 V6] # ꡣ-≠.𞤹𐅢ↄ -B; xn----ufo9661d.xn--q5g0929fhm4f; [B2 B3 B6 V6]; [B2 B3 B6 V6] -B; xn----ufo9661d.xn--1ug79cm620c71sh; [B1 B6 C2 V6]; [B1 B6 C2 V6] # ꡣ-≠.𞤹𐅢Ↄ -T; ς⒐𝆫⸵。𐱢🄊𝟳; [B6 P1 V6]; [B6 P1 V6] -N; ς⒐𝆫⸵。𐱢🄊𝟳; [B6 P1 V6]; [B6 P1 V6] -T; ς9.𝆫⸵。𐱢9,7; [B1 P1 V5 V6]; [B1 P1 V5 V6] -N; ς9.𝆫⸵。𐱢9,7; [B1 P1 V5 V6]; [B1 P1 V5 V6] -B; Σ9.𝆫⸵。𐱢9,7; [B1 P1 V5 V6]; [B1 P1 V5 V6] -B; σ9.𝆫⸵。𐱢9,7; [B1 P1 V5 V6]; [B1 P1 V5 V6] -B; xn--9-zmb.xn--ltj1535k.xn--9,7-r67t; [B1 P1 V5 V6]; [B1 P1 V5 V6] -B; xn--9-xmb.xn--ltj1535k.xn--9,7-r67t; [B1 P1 V5 V6]; [B1 P1 V5 V6] -B; Σ⒐𝆫⸵。𐱢🄊𝟳; [B6 P1 V6]; [B6 P1 V6] -B; σ⒐𝆫⸵。𐱢🄊𝟳; [B6 P1 V6]; [B6 P1 V6] -B; xn--4xa809nwtghi25b.xn--7-075iy877c; [B6 V6]; [B6 V6] -B; xn--3xa019nwtghi25b.xn--7-075iy877c; [B6 V6]; [B6 V6] -T; \u0853.\u200Cß; [B1 C1]; xn--iwb.ss # ࡓ.ß -N; \u0853.\u200Cß; [B1 C1]; [B1 C1] # ࡓ.ß -T; \u0853.\u200Cß; [B1 C1]; xn--iwb.ss # ࡓ.ß -N; \u0853.\u200Cß; [B1 C1]; [B1 C1] # ࡓ.ß -T; \u0853.\u200CSS; [B1 C1]; xn--iwb.ss # ࡓ.ss -N; \u0853.\u200CSS; [B1 C1]; [B1 C1] # ࡓ.ss -T; \u0853.\u200Css; [B1 C1]; xn--iwb.ss # ࡓ.ss -N; \u0853.\u200Css; [B1 C1]; [B1 C1] # ࡓ.ss -T; \u0853.\u200CSs; [B1 C1]; xn--iwb.ss # ࡓ.ss -N; \u0853.\u200CSs; [B1 C1]; [B1 C1] # ࡓ.ss -B; xn--iwb.ss; \u0853.ss; xn--iwb.ss # ࡓ.ss -B; \u0853.ss; ; xn--iwb.ss # ࡓ.ss -B; \u0853.SS; \u0853.ss; xn--iwb.ss # ࡓ.ss -B; \u0853.Ss; \u0853.ss; xn--iwb.ss # ࡓ.ss -B; xn--iwb.xn--ss-i1t; [B1 C1]; [B1 C1] # ࡓ.ss -B; xn--iwb.xn--zca570n; [B1 C1]; [B1 C1] # ࡓ.ß -T; \u0853.\u200CSS; [B1 C1]; xn--iwb.ss # ࡓ.ss -N; \u0853.\u200CSS; [B1 C1]; [B1 C1] # ࡓ.ss -T; \u0853.\u200Css; [B1 C1]; xn--iwb.ss # ࡓ.ss -N; \u0853.\u200Css; [B1 C1]; [B1 C1] # ࡓ.ss -T; \u0853.\u200CSs; [B1 C1]; xn--iwb.ss # ࡓ.ss -N; \u0853.\u200CSs; [B1 C1]; [B1 C1] # ࡓ.ss -T; 񯶣-.\u200D\u074E\uA94D󠻨; [B1 B6 C2 P1 V3 V6]; [B3 B6 P1 V3 V6] # -.ݎꥍ -N; 񯶣-.\u200D\u074E\uA94D󠻨; [B1 B6 C2 P1 V3 V6]; [B1 B6 C2 P1 V3 V6] # -.ݎꥍ -B; xn----s116e.xn--1ob6504fmf40i; [B3 B6 V3 V6]; [B3 B6 V3 V6] # -.ݎꥍ -B; xn----s116e.xn--1ob387jy90hq459k; [B1 B6 C2 V3 V6]; [B1 B6 C2 V3 V6] # -.ݎꥍ -B; 䃚蟥-。-񽒘⒈; [P1 V3 V6]; [P1 V3 V6] -B; 䃚蟥-。-񽒘1.; [P1 V3 V6]; [P1 V3 V6] -B; xn----n50a258u.xn---1-up07j.; [V3 V6]; [V3 V6] -B; xn----n50a258u.xn----ecp33805f; [V3 V6]; [V3 V6] -B; 𐹸䚵-ꡡ。⺇; [B1]; [B1] -B; xn----bm3an932a1l5d.xn--xvj; [B1]; [B1] -B; 𑄳。\u1ADC𐹻; [B1 B3 B5 B6 P1 V5 V6]; [B1 B3 B5 B6 P1 V5 V6] # 𑄳.𐹻 -B; xn--v80d.xn--2rf1154i; [B1 B3 B5 B6 V5 V6]; [B1 B3 B5 B6 V5 V6] # 𑄳.𐹻 -B; ≮𐹻.⒎𑂵\u06BA\u0602; [B1 P1 V6]; [B1 P1 V6] # ≮𐹻.⒎𑂵ں -B; <\u0338𐹻.⒎𑂵\u06BA\u0602; [B1 P1 V6]; [B1 P1 V6] # ≮𐹻.⒎𑂵ں -B; ≮𐹻.7.𑂵\u06BA\u0602; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≮𐹻.7.𑂵ں -B; <\u0338𐹻.7.𑂵\u06BA\u0602; [B1 P1 V5 V6]; [B1 P1 V5 V6] # ≮𐹻.7.𑂵ں -B; xn--gdhx904g.7.xn--kfb18an307d; [B1 V5 V6]; [B1 V5 V6] # ≮𐹻.7.𑂵ں -B; xn--gdhx904g.xn--kfb18a325efm3s; [B1 V6]; [B1 V6] # ≮𐹻.⒎𑂵ں -T; ᢔ≠􋉂.\u200D𐋢; [C2 P1 V6]; [P1 V6] # ᢔ≠.𐋢 -N; ᢔ≠􋉂.\u200D𐋢; [C2 P1 V6]; [C2 P1 V6] # ᢔ≠.𐋢 -T; ᢔ=\u0338􋉂.\u200D𐋢; [C2 P1 V6]; [P1 V6] # ᢔ≠.𐋢 -N; ᢔ=\u0338􋉂.\u200D𐋢; [C2 P1 V6]; [C2 P1 V6] # ᢔ≠.𐋢 -B; xn--ebf031cf7196a.xn--587c; [V6]; [V6] -B; xn--ebf031cf7196a.xn--1ug9540g; [C2 V6]; [C2 V6] # ᢔ≠.𐋢 -B; 𐩁≮񣊛≯.\u066C𞵕⳿; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # 𐩁≮≯.٬⳿ -B; 𐩁<\u0338񣊛>\u0338.\u066C𞵕⳿; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # 𐩁≮≯.٬⳿ -B; 𐩁≮񣊛≯.\u066C𞵕⳿; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # 𐩁≮≯.٬⳿ -B; 𐩁<\u0338񣊛>\u0338.\u066C𞵕⳿; [B1 B2 B3 P1 V6]; [B1 B2 B3 P1 V6] # 𐩁≮≯.٬⳿ -B; xn--gdhc0519o0y27b.xn--lib468q0d21a; [B1 B2 B3 V6]; [B1 B2 B3 V6] # 𐩁≮≯.٬⳿ -B; -。⺐; [V3]; [V3] -B; -。⺐; [V3]; [V3] -B; -.xn--6vj; [V3]; [V3] -B; 󠰩𑲬.\u065C; [P1 V5 V6]; [P1 V5 V6] # 𑲬.ٜ -B; 󠰩𑲬.\u065C; [P1 V5 V6]; [P1 V5 V6] # 𑲬.ٜ -B; xn--sn3d59267c.xn--4hb; [V5 V6]; [V5 V6] # 𑲬.ٜ -T; 𐍺.񚇃\u200C; [C1 P1 V5 V6]; [P1 V5 V6] # 𐍺. -N; 𐍺.񚇃\u200C; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 𐍺. -B; xn--ie8c.xn--2g51a; [V5 V6]; [V5 V6] -B; xn--ie8c.xn--0ug03366c; [C1 V5 V6]; [C1 V5 V6] # 𐍺. -B; \u063D\u06E3.𐨎; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ؽۣ.𐨎 -B; xn--8gb64a.xn--mr9c; [B1 B3 B6 V5]; [B1 B3 B6 V5] # ؽۣ.𐨎 -T; 漦Ⴙς.񡻀𐴄; [B5 B6 P1 V6]; [B5 B6 P1 V6] -N; 漦Ⴙς.񡻀𐴄; [B5 B6 P1 V6]; [B5 B6 P1 V6] -T; 漦ⴙς.񡻀𐴄; [B5 B6 P1 V6]; [B5 B6 P1 V6] -N; 漦ⴙς.񡻀𐴄; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; 漦ႹΣ.񡻀𐴄; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; 漦ⴙσ.񡻀𐴄; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; 漦Ⴙσ.񡻀𐴄; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; xn--4xa947d717e.xn--9d0d3162t; [B5 B6 V6]; [B5 B6 V6] -B; xn--4xa772sl47b.xn--9d0d3162t; [B5 B6 V6]; [B5 B6 V6] -B; xn--3xa972sl47b.xn--9d0d3162t; [B5 B6 V6]; [B5 B6 V6] -B; xn--3xa157d717e.xn--9d0d3162t; [B5 B6 V6]; [B5 B6 V6] -B; 𐹫踧\u0CCD򫚇.󜀃⒈𝨤; [B1 P1 V6]; [B1 P1 V6] # 𐹫踧್.⒈𝨤 -B; 𐹫踧\u0CCD򫚇.󜀃1.𝨤; [B1 B3 B6 P1 V5 V6]; [B1 B3 B6 P1 V5 V6] # 𐹫踧್.1.𝨤 -B; xn--8tc1437dro0d6q06h.xn--1-p948l.xn--m82h; [B1 B3 B6 V5 V6]; [B1 B3 B6 V5 V6] # 𐹫踧್.1.𝨤 -B; xn--8tc1437dro0d6q06h.xn--tsh2611ncu71e; [B1 V6]; [B1 V6] # 𐹫踧್.⒈𝨤 -T; \u200D≮.󠟪𹫏-; [C2 P1 V3 V6]; [P1 V3 V6] # ≮.- -N; \u200D≮.󠟪𹫏-; [C2 P1 V3 V6]; [C2 P1 V3 V6] # ≮.- -T; \u200D<\u0338.󠟪𹫏-; [C2 P1 V3 V6]; [P1 V3 V6] # ≮.- -N; \u200D<\u0338.󠟪𹫏-; [C2 P1 V3 V6]; [C2 P1 V3 V6] # ≮.- -T; \u200D≮.󠟪𹫏-; [C2 P1 V3 V6]; [P1 V3 V6] # ≮.- -N; \u200D≮.󠟪𹫏-; [C2 P1 V3 V6]; [C2 P1 V3 V6] # ≮.- -T; \u200D<\u0338.󠟪𹫏-; [C2 P1 V3 V6]; [P1 V3 V6] # ≮.- -N; \u200D<\u0338.󠟪𹫏-; [C2 P1 V3 V6]; [C2 P1 V3 V6] # ≮.- -B; xn--gdh.xn----cr99a1w710b; [V3 V6]; [V3 V6] -B; xn--1ug95g.xn----cr99a1w710b; [C2 V3 V6]; [C2 V3 V6] # ≮.- -T; \u200D\u200D襔。Ⴜ5ꡮ񵝏; [C2 P1 V6]; [P1 V6] # 襔.Ⴜ5ꡮ -N; \u200D\u200D襔。Ⴜ5ꡮ񵝏; [C2 P1 V6]; [C2 P1 V6] # 襔.Ⴜ5ꡮ -T; \u200D\u200D襔。ⴜ5ꡮ񵝏; [C2 P1 V6]; [P1 V6] # 襔.ⴜ5ꡮ -N; \u200D\u200D襔。ⴜ5ꡮ񵝏; [C2 P1 V6]; [C2 P1 V6] # 襔.ⴜ5ꡮ -B; xn--2u2a.xn--5-uws5848bpf44e; [V6]; [V6] -B; xn--1uga7691f.xn--5-uws5848bpf44e; [C2 V6]; [C2 V6] # 襔.ⴜ5ꡮ -B; xn--2u2a.xn--5-r1g7167ipfw8d; [V6]; [V6] -B; xn--1uga7691f.xn--5-r1g7167ipfw8d; [C2 V6]; [C2 V6] # 襔.Ⴜ5ꡮ -T; 𐫜𑌼\u200D.婀; [B3 C2]; xn--ix9c26l.xn--q0s # 𐫜𑌼.婀 -N; 𐫜𑌼\u200D.婀; [B3 C2]; [B3 C2] # 𐫜𑌼.婀 -T; 𐫜𑌼\u200D.婀; [B3 C2]; xn--ix9c26l.xn--q0s # 𐫜𑌼.婀 -N; 𐫜𑌼\u200D.婀; [B3 C2]; [B3 C2] # 𐫜𑌼.婀 -B; xn--ix9c26l.xn--q0s; 𐫜𑌼.婀; xn--ix9c26l.xn--q0s -B; 𐫜𑌼.婀; ; xn--ix9c26l.xn--q0s -B; xn--1ugx063g1if.xn--q0s; [B3 C2]; [B3 C2] # 𐫜𑌼.婀 -B; 󠅽︒︒𐹯。⬳\u1A78; [B1 P1 V6]; [B1 P1 V6] # ︒︒𐹯.⬳᩸ -B; 󠅽。。𐹯。⬳\u1A78; [B1 A4_2]; [B1 A4_2] # ..𐹯.⬳᩸ -B; ..xn--no0d.xn--7of309e; [B1 A4_2]; [B1 A4_2] # ..𐹯.⬳᩸ -B; xn--y86ca186j.xn--7of309e; [B1 V6]; [B1 V6] # ︒︒𐹯.⬳᩸ -T; 𝟖ß.󠄐-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-Ⴏ -N; 𝟖ß.󠄐-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-Ⴏ -T; 8ß.󠄐-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-Ⴏ -N; 8ß.󠄐-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-Ⴏ -T; 8ß.󠄐-\uDBDAⴏ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-ⴏ -N; 8ß.󠄐-\uDBDAⴏ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-ⴏ -B; 8SS.󠄐-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-Ⴏ -B; 8ss.󠄐-\uDBDAⴏ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-ⴏ -B; 8Ss.󠄐-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-Ⴏ -B; 8ss.-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-Ⴏ -B; 8ss.-\uDBDAⴏ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-ⴏ -B; 8SS.-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-Ⴏ -B; 8Ss.-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-Ⴏ -B; xn--8-qfa.-\uDBDAⴏ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-ⴏ -B; XN--8-QFA.-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-Ⴏ -B; Xn--8-Qfa.-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-Ⴏ -B; xn--8-qfa.-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-Ⴏ -T; 𝟖ß.󠄐-\uDBDAⴏ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-ⴏ -N; 𝟖ß.󠄐-\uDBDAⴏ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ß.-ⴏ -B; 𝟖SS.󠄐-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-Ⴏ -B; 𝟖ss.󠄐-\uDBDAⴏ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-ⴏ -B; 𝟖Ss.󠄐-\uDBDAႯ; [P1 V3 V6]; [P1 V3 V6 A3] # 8ss.-Ⴏ -T; -\u200D󠋟.\u200C𐹣Ⴅ; [B1 C1 C2 P1 V3 V6]; [B1 P1 V3 V6] # -.𐹣Ⴅ -N; -\u200D󠋟.\u200C𐹣Ⴅ; [B1 C1 C2 P1 V3 V6]; [B1 C1 C2 P1 V3 V6] # -.𐹣Ⴅ -T; -\u200D󠋟.\u200C𐹣ⴅ; [B1 C1 C2 P1 V3 V6]; [B1 P1 V3 V6] # -.𐹣ⴅ -N; -\u200D󠋟.\u200C𐹣ⴅ; [B1 C1 C2 P1 V3 V6]; [B1 C1 C2 P1 V3 V6] # -.𐹣ⴅ -B; xn----s721m.xn--wkj1423e; [B1 V3 V6]; [B1 V3 V6] -B; xn----ugnv7071n.xn--0ugz32cgr0p; [B1 C1 C2 V3 V6]; [B1 C1 C2 V3 V6] # -.𐹣ⴅ -B; xn----s721m.xn--dnd9201k; [B1 V3 V6]; [B1 V3 V6] -B; xn----ugnv7071n.xn--dnd999e4j4p; [B1 C1 C2 V3 V6]; [B1 C1 C2 V3 V6] # -.𐹣Ⴅ -T; \uA9B9\u200D큷𻶡。₂; [C2 P1 V5 V6]; [P1 V5 V6] # ꦹ큷.2 -N; \uA9B9\u200D큷𻶡。₂; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ꦹ큷.2 -T; \uA9B9\u200D큷𻶡。₂; [C2 P1 V5 V6]; [P1 V5 V6] # ꦹ큷.2 -N; \uA9B9\u200D큷𻶡。₂; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ꦹ큷.2 -T; \uA9B9\u200D큷𻶡。2; [C2 P1 V5 V6]; [P1 V5 V6] # ꦹ큷.2 -N; \uA9B9\u200D큷𻶡。2; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ꦹ큷.2 -T; \uA9B9\u200D큷𻶡。2; [C2 P1 V5 V6]; [P1 V5 V6] # ꦹ큷.2 -N; \uA9B9\u200D큷𻶡。2; [C2 P1 V5 V6]; [C2 P1 V5 V6] # ꦹ큷.2 -B; xn--0m9as84e2e21c.2; [V5 V6]; [V5 V6] # ꦹ큷.2 -B; xn--1ug1435cfkyaoi04d.2; [C2 V5 V6]; [C2 V5 V6] # ꦹ큷.2 -B; \uDF4D.🄄𞯘; [B1 P1 V6]; [B1 P1 V6 A3] # .🄄 -B; \uDF4D.3,𞯘; [B1 P1 V6]; [B1 P1 V6 A3] # .3, -B; \uDF4D.xn--3,-tb22a; [B1 P1 V6]; [B1 P1 V6 A3] # .3, -B; \uDF4D.XN--3,-TB22A; [B1 P1 V6]; [B1 P1 V6 A3] # .3, -B; \uDF4D.Xn--3,-Tb22a; [B1 P1 V6]; [B1 P1 V6 A3] # .3, -B; \uDF4D.xn--3x6hx6f; [B1 P1 V6]; [B1 P1 V6 A3] # .🄄 -B; \uDF4D.XN--3X6HX6F; [B1 P1 V6]; [B1 P1 V6 A3] # .🄄 -B; \uDF4D.Xn--3X6hx6f; [B1 P1 V6]; [B1 P1 V6 A3] # .🄄 -B; 𝨖𐩙。\u06DD󀡶\uA8C5⒈; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𝨖.ꣅ⒈ -B; 𝨖𐩙。\u06DD󀡶\uA8C51.; [B1 P1 V5 V6]; [B1 P1 V5 V6] # 𝨖.ꣅ1. -B; xn--rt9cl956a.xn--1-dxc8545j0693i.; [B1 V5 V6]; [B1 V5 V6] # 𝨖.ꣅ1. -B; xn--rt9cl956a.xn--tlb403mxv4g06s9i; [B1 V5 V6]; [B1 V5 V6] # 𝨖.ꣅ⒈ -T; 򒈣\u05E1\u06B8。Ⴈ\u200D; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # סڸ.Ⴈ -N; 򒈣\u05E1\u06B8。Ⴈ\u200D; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # סڸ.Ⴈ -T; 򒈣\u05E1\u06B8。ⴈ\u200D; [B5 B6 C2 P1 V6]; [B5 B6 P1 V6] # סڸ.ⴈ -N; 򒈣\u05E1\u06B8。ⴈ\u200D; [B5 B6 C2 P1 V6]; [B5 B6 C2 P1 V6] # סڸ.ⴈ -B; xn--meb44b57607c.xn--zkj; [B5 B6 V6]; [B5 B6 V6] # סڸ.ⴈ -B; xn--meb44b57607c.xn--1ug232c; [B5 B6 C2 V6]; [B5 B6 C2 V6] # סڸ.ⴈ -B; xn--meb44b57607c.xn--gnd; [B5 B6 V6]; [B5 B6 V6] # סڸ.Ⴈ -B; xn--meb44b57607c.xn--gnd699e; [B5 B6 C2 V6]; [B5 B6 C2 V6] # סڸ.Ⴈ -T; 󀚶𝨱\u07E6⒈.𑗝髯\u200C; [B1 B5 C1 P1 V5 V6]; [B1 B5 P1 V5 V6] # 𝨱ߦ⒈.𑗝髯 -N; 󀚶𝨱\u07E6⒈.𑗝髯\u200C; [B1 B5 C1 P1 V5 V6]; [B1 B5 C1 P1 V5 V6] # 𝨱ߦ⒈.𑗝髯 -T; 󀚶𝨱\u07E61..𑗝髯\u200C; [B1 B5 C1 P1 V5 V6 A4_2]; [B1 B5 P1 V5 V6 A4_2] # 𝨱ߦ1..𑗝髯 -N; 󀚶𝨱\u07E61..𑗝髯\u200C; [B1 B5 C1 P1 V5 V6 A4_2]; [B1 B5 C1 P1 V5 V6 A4_2] # 𝨱ߦ1..𑗝髯 -B; xn--1-idd62296a1fr6e..xn--uj6at43v; [B1 B5 V5 V6 A4_2]; [B1 B5 V5 V6 A4_2] # 𝨱ߦ1..𑗝髯 -B; xn--1-idd62296a1fr6e..xn--0ugx259bocxd; [B1 B5 C1 V5 V6 A4_2]; [B1 B5 C1 V5 V6 A4_2] # 𝨱ߦ1..𑗝髯 -B; xn--etb477lq931a1f58e.xn--uj6at43v; [B1 B5 V5 V6]; [B1 B5 V5 V6] # 𝨱ߦ⒈.𑗝髯 -B; xn--etb477lq931a1f58e.xn--0ugx259bocxd; [B1 B5 C1 V5 V6]; [B1 B5 C1 V5 V6] # 𝨱ߦ⒈.𑗝髯 -B; 𐫀.\u0689𑌀; 𐫀.\u0689𑌀; xn--pw9c.xn--fjb8658k # 𐫀.ډ𑌀 -B; 𐫀.\u0689𑌀; ; xn--pw9c.xn--fjb8658k # 𐫀.ډ𑌀 -B; xn--pw9c.xn--fjb8658k; 𐫀.\u0689𑌀; xn--pw9c.xn--fjb8658k # 𐫀.ډ𑌀 -B; 𑋪.𐳝; [B1 B3 B6 V5]; [B1 B3 B6 V5] -B; 𑋪.𐳝; [B1 B3 B6 V5]; [B1 B3 B6 V5] -B; 𑋪.𐲝; [B1 B3 B6 V5]; [B1 B3 B6 V5] -B; xn--fm1d.xn--5c0d; [B1 B3 B6 V5]; [B1 B3 B6 V5] -B; 𑋪.𐲝; [B1 B3 B6 V5]; [B1 B3 B6 V5] -B; ≠膣。\u0F83; [P1 V5 V6]; [P1 V5 V6] # ≠膣.ྃ -B; =\u0338膣。\u0F83; [P1 V5 V6]; [P1 V5 V6] # ≠膣.ྃ -B; xn--1chy468a.xn--2ed; [V5 V6]; [V5 V6] # ≠膣.ྃ -T; 񰀎-\u077D。ß; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ß -N; 񰀎-\u077D。ß; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ß -T; 񰀎-\u077D。ß; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ß -N; 񰀎-\u077D。ß; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ß -B; 񰀎-\u077D。SS; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ss -B; 񰀎-\u077D。ss; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ss -B; 񰀎-\u077D。Ss; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ss -B; xn----j6c95618k.ss; [B5 B6 V6]; [B5 B6 V6] # -ݽ.ss -B; xn----j6c95618k.xn--zca; [B5 B6 V6]; [B5 B6 V6] # -ݽ.ß -B; 񰀎-\u077D。SS; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ss -B; 񰀎-\u077D。ss; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ss -B; 񰀎-\u077D。Ss; [B5 B6 P1 V6]; [B5 B6 P1 V6] # -ݽ.ss -T; ς𐹠ᡚ𑄳.⾭𐹽𽐖𐫜; [B5 B6 P1 V6]; [B5 B6 P1 V6] -N; ς𐹠ᡚ𑄳.⾭𐹽𽐖𐫜; [B5 B6 P1 V6]; [B5 B6 P1 V6] -T; ς𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5 B6 P1 V6]; [B5 B6 P1 V6] -N; ς𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; Σ𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; σ𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; xn--4xa656hp23pxmc.xn--es5a888tvjc2u15h; [B5 B6 V6]; [B5 B6 V6] -B; xn--3xa856hp23pxmc.xn--es5a888tvjc2u15h; [B5 B6 V6]; [B5 B6 V6] -B; Σ𐹠ᡚ𑄳.⾭𐹽𽐖𐫜; [B5 B6 P1 V6]; [B5 B6 P1 V6] -B; σ𐹠ᡚ𑄳.⾭𐹽𽐖𐫜; [B5 B6 P1 V6]; [B5 B6 P1 V6] -T; 𐋷。\u200D; [C2]; xn--r97c. # 𐋷. -N; 𐋷。\u200D; [C2]; [C2] # 𐋷. -B; xn--r97c.; 𐋷.; xn--r97c.; NV8 -B; 𐋷.; ; xn--r97c.; NV8 -B; xn--r97c.xn--1ug; [C2]; [C2] # 𐋷. -B; 𑰳𑈯。⥪; [V5]; [V5] -B; xn--2g1d14o.xn--jti; [V5]; [V5] -T; 𑆀䁴񤧣.Ⴕ𝟜\u200C\u0348; [C1 P1 V5 V6]; [P1 V5 V6] # 𑆀䁴.Ⴕ4͈ -N; 𑆀䁴񤧣.Ⴕ𝟜\u200C\u0348; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 𑆀䁴.Ⴕ4͈ -T; 𑆀䁴񤧣.Ⴕ4\u200C\u0348; [C1 P1 V5 V6]; [P1 V5 V6] # 𑆀䁴.Ⴕ4͈ -N; 𑆀䁴񤧣.Ⴕ4\u200C\u0348; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 𑆀䁴.Ⴕ4͈ -T; 𑆀䁴񤧣.ⴕ4\u200C\u0348; [C1 P1 V5 V6]; [P1 V5 V6] # 𑆀䁴.ⴕ4͈ -N; 𑆀䁴񤧣.ⴕ4\u200C\u0348; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 𑆀䁴.ⴕ4͈ -B; xn--1mnx647cg3x1b.xn--4-zfb5123a; [V5 V6]; [V5 V6] # 𑆀䁴.ⴕ4͈ -B; xn--1mnx647cg3x1b.xn--4-zfb502tlsl; [C1 V5 V6]; [C1 V5 V6] # 𑆀䁴.ⴕ4͈ -B; xn--1mnx647cg3x1b.xn--4-zfb324h; [V5 V6]; [V5 V6] # 𑆀䁴.Ⴕ4͈ -B; xn--1mnx647cg3x1b.xn--4-zfb324h32o; [C1 V5 V6]; [C1 V5 V6] # 𑆀䁴.Ⴕ4͈ -T; 𑆀䁴񤧣.ⴕ𝟜\u200C\u0348; [C1 P1 V5 V6]; [P1 V5 V6] # 𑆀䁴.ⴕ4͈ -N; 𑆀䁴񤧣.ⴕ𝟜\u200C\u0348; [C1 P1 V5 V6]; [C1 P1 V5 V6] # 𑆀䁴.ⴕ4͈ -T; 憡\uDF1F\u200CႴ.𐋮\u200D≠; [C1 C2 P1 V6]; [P1 V6 A3] # 憡Ⴔ.𐋮≠ -N; 憡\uDF1F\u200CႴ.𐋮\u200D≠; [C1 C2 P1 V6]; [C1 C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -T; 憡\uDF1F\u200CႴ.𐋮\u200D=\u0338; [C1 C2 P1 V6]; [P1 V6 A3] # 憡Ⴔ.𐋮≠ -N; 憡\uDF1F\u200CႴ.𐋮\u200D=\u0338; [C1 C2 P1 V6]; [C1 C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -T; 憡\uDF1F\u200Cⴔ.𐋮\u200D=\u0338; [C1 C2 P1 V6]; [P1 V6 A3] # 憡ⴔ.𐋮≠ -N; 憡\uDF1F\u200Cⴔ.𐋮\u200D=\u0338; [C1 C2 P1 V6]; [C1 C2 P1 V6 A3] # 憡ⴔ.𐋮≠ -T; 憡\uDF1F\u200Cⴔ.𐋮\u200D≠; [C1 C2 P1 V6]; [P1 V6 A3] # 憡ⴔ.𐋮≠ -N; 憡\uDF1F\u200Cⴔ.𐋮\u200D≠; [C1 C2 P1 V6]; [C1 C2 P1 V6 A3] # 憡ⴔ.𐋮≠ -B; 憡\uDF1Fⴔ.xn--1chz659f; [P1 V6]; [P1 V6 A3] # 憡ⴔ.𐋮≠ -B; 憡\uDF1FႴ.XN--1CHZ659F; [P1 V6]; [P1 V6 A3] # 憡Ⴔ.𐋮≠ -B; 憡\uDF1FႴ.xn--1Chz659f; [P1 V6]; [P1 V6 A3] # 憡Ⴔ.𐋮≠ -B; 憡\uDF1FႴ.xn--1chz659f; [P1 V6]; [P1 V6 A3] # 憡Ⴔ.𐋮≠ -T; 憡\uDF1F\u200Cⴔ.xn--1ug73gl146a; [C1 C2 P1 V6]; [C2 P1 V6 A3] # 憡ⴔ.𐋮≠ -N; 憡\uDF1F\u200Cⴔ.xn--1ug73gl146a; [C1 C2 P1 V6]; [C1 C2 P1 V6 A3] # 憡ⴔ.𐋮≠ -T; 憡\uDF1F\u200CႴ.XN--1UG73GL146A; [C1 C2 P1 V6]; [C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -N; 憡\uDF1F\u200CႴ.XN--1UG73GL146A; [C1 C2 P1 V6]; [C1 C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -T; 憡\uDF1F\u200CႴ.xn--1Ug73gl146a; [C1 C2 P1 V6]; [C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -N; 憡\uDF1F\u200CႴ.xn--1Ug73gl146a; [C1 C2 P1 V6]; [C1 C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -B; 憡\uDF1FႴ.xn--1ug73gl146a; [C2 P1 V6]; [C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -B; 憡\uDF1Fⴔ.xn--1ug73gl146a; [C2 P1 V6]; [C2 P1 V6 A3] # 憡ⴔ.𐋮≠ -B; 憡\uDF1FႴ.XN--1UG73GL146A; [C2 P1 V6]; [C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -B; 憡\uDF1FႴ.xn--1Ug73gl146a; [C2 P1 V6]; [C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -T; 憡\uDF1F\u200CႴ.xn--1ug73gl146a; [C1 C2 P1 V6]; [C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ -N; 憡\uDF1F\u200CႴ.xn--1ug73gl146a; [C1 C2 P1 V6]; [C1 C2 P1 V6 A3] # 憡Ⴔ.𐋮≠ diff --git a/vendor/idna-0.1.5/tests/punycode.rs b/vendor/idna-0.1.5/tests/punycode.rs deleted file mode 100644 index 67988e80c3..0000000000 --- a/vendor/idna-0.1.5/tests/punycode.rs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2013 The rust-url developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use idna::punycode::{decode, encode_str}; -use rustc_serialize::json::{Json, Object}; -use test::TestFn; - -fn one_test(decoded: &str, encoded: &str) { - match decode(encoded) { - None => panic!("Decoding {} failed.", encoded), - Some(result) => { - let result = result.into_iter().collect::(); - assert!(result == decoded, - format!("Incorrect decoding of \"{}\":\n \"{}\"\n!= \"{}\"\n", - encoded, result, decoded)) - } - } - - match encode_str(decoded) { - None => panic!("Encoding {} failed.", decoded), - Some(result) => { - assert!(result == encoded, - format!("Incorrect encoding of \"{}\":\n \"{}\"\n!= \"{}\"\n", - decoded, result, encoded)) - } - } -} - -fn get_string<'a>(map: &'a Object, key: &str) -> &'a str { - match map.get(&key.to_string()) { - Some(&Json::String(ref s)) => s, - None => "", - _ => panic!(), - } -} - -pub fn collect_tests(add_test: &mut F) { - match Json::from_str(include_str!("punycode_tests.json")) { - Ok(Json::Array(tests)) => for (i, test) in tests.into_iter().enumerate() { - match test { - Json::Object(o) => { - let test_name = { - let desc = get_string(&o, "description"); - if desc.is_empty() { - format!("Punycode {}", i + 1) - } else { - format!("Punycode {}: {}", i + 1, desc) - } - }; - add_test(test_name, TestFn::dyn_test_fn(move || one_test( - get_string(&o, "decoded"), - get_string(&o, "encoded"), - ))) - } - _ => panic!(), - } - }, - other => panic!("{:?}", other) - } -} diff --git a/vendor/idna-0.1.5/tests/punycode_tests.json b/vendor/idna-0.1.5/tests/punycode_tests.json deleted file mode 100644 index 86785b1243..0000000000 --- a/vendor/idna-0.1.5/tests/punycode_tests.json +++ /dev/null @@ -1,120 +0,0 @@ -[ -{ - "description": "These tests are copied from https://github.com/bestiejs/punycode.js/blob/master/tests/tests.js , used under the MIT license.", - "decoded": "", - "encoded": "" -}, -{ - "description": "a single basic code point", - "decoded": "Bach", - "encoded": "Bach-" -}, -{ - "description": "a single non-ASCII character", - "decoded": "\u00FC", - "encoded": "tda" -}, -{ - "description": "multiple non-ASCII characters", - "decoded": "\u00FC\u00EB\u00E4\u00F6\u2665", - "encoded": "4can8av2009b" -}, -{ - "description": "mix of ASCII and non-ASCII characters", - "decoded": "b\u00FCcher", - "encoded": "bcher-kva" -}, -{ - "description": "long string with both ASCII and non-ASCII characters", - "decoded": "Willst du die Bl\u00FCthe des fr\u00FChen, die Fr\u00FCchte des sp\u00E4teren Jahres", - "encoded": "Willst du die Blthe des frhen, die Frchte des spteren Jahres-x9e96lkal" -}, -{ - "description": "Arabic (Egyptian)", - "decoded": "\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F", - "encoded": "egbpdaj6bu4bxfgehfvwxn" -}, -{ - "description": "Chinese (simplified)", - "decoded": "\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2d\u6587", - "encoded": "ihqwcrb4cv8a8dqg056pqjye" -}, -{ - "description": "Chinese (traditional)", - "decoded": "\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587", - "encoded": "ihqwctvzc91f659drss3x8bo0yb" -}, -{ - "description": "Czech", - "decoded": "Pro\u010Dprost\u011Bnemluv\u00ED\u010Desky", - "encoded": "Proprostnemluvesky-uyb24dma41a" -}, -{ - "description": "Hebrew", - "decoded": "\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2\u05D1\u05E8\u05D9\u05EA", - "encoded": "4dbcagdahymbxekheh6e0a7fei0b" -}, -{ - "description": "Hindi (Devanagari)", - "decoded": "\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947\u0939\u0948\u0902", - "encoded": "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd" -}, -{ - "description": "Japanese (kanji and hiragana)", - "decoded": "\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B", - "encoded": "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa" -}, -{ - "description": "Korean (Hangul syllables)", - "decoded": "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C", - "encoded": "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c" -}, -{ - "description": "Russian (Cyrillic)", - "decoded": "\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A\u0438", - "encoded": "b1abfaaepdrnnbgefbadotcwatmq2g4l" -}, -{ - "description": "Spanish", - "decoded": "Porqu\u00E9nopuedensimplementehablarenEspa\u00F1ol", - "encoded": "PorqunopuedensimplementehablarenEspaol-fmd56a" -}, -{ - "description": "Vietnamese", - "decoded": "T\u1EA1isaoh\u1ECDkh\u00F4ngth\u1EC3ch\u1EC9n\u00F3iti\u1EBFngVi\u1EC7t", - "encoded": "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g" -}, -{ - "decoded": "3\u5E74B\u7D44\u91D1\u516B\u5148\u751F", - "encoded": "3B-ww4c5e180e575a65lsy2b" -}, -{ - "decoded": "\u5B89\u5BA4\u5948\u7F8E\u6075-with-SUPER-MONKEYS", - "encoded": "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n" -}, -{ - "decoded": "Hello-Another-Way-\u305D\u308C\u305E\u308C\u306E\u5834\u6240", - "encoded": "Hello-Another-Way--fc4qua05auwb3674vfr0b" -}, -{ - "decoded": "\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B2", - "encoded": "2-u9tlzr9756bt3uc0v" -}, -{ - "decoded": "Maji\u3067Koi\u3059\u308B5\u79D2\u524D", - "encoded": "MajiKoi5-783gue6qz075azm5e" -}, -{ - "decoded": "\u30D1\u30D5\u30A3\u30FCde\u30EB\u30F3\u30D0", - "encoded": "de-jg4avhby1noc0d" -}, -{ - "decoded": "\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067", - "encoded": "d9juau41awczczp" -}, -{ - "description": "ASCII string that breaks the existing rules for host-name labels (It's not a realistic example for IDNA, because IDNA never encodes pure ASCII labels.)", - "decoded": "-> $1.00 <-", - "encoded": "-> $1.00 <--" -} -] diff --git a/vendor/idna-0.1.5/tests/tests.rs b/vendor/idna-0.1.5/tests/tests.rs deleted file mode 100644 index 808ad6ba84..0000000000 --- a/vendor/idna-0.1.5/tests/tests.rs +++ /dev/null @@ -1,21 +0,0 @@ -extern crate idna; -extern crate rustc_serialize; -extern crate rustc_test as test; - -mod punycode; -mod uts46; - -fn main() { - let mut tests = Vec::new(); - { - let mut add_test = |name, run| { - tests.push(test::TestDescAndFn { - desc: test::TestDesc::new(test::DynTestName(name)), - testfn: run, - }) - }; - punycode::collect_tests(&mut add_test); - uts46::collect_tests(&mut add_test); - } - test::test_main(&std::env::args().collect::>(), tests) -} diff --git a/vendor/idna-0.1.5/tests/unit.rs b/vendor/idna-0.1.5/tests/unit.rs deleted file mode 100644 index a7d158d5c4..0000000000 --- a/vendor/idna-0.1.5/tests/unit.rs +++ /dev/null @@ -1,40 +0,0 @@ -extern crate idna; -extern crate unicode_normalization; - -use idna::uts46; -use unicode_normalization::char::is_combining_mark; - - -fn _to_ascii(domain: &str) -> Result { - uts46::to_ascii(domain, uts46::Flags { - transitional_processing: false, - use_std3_ascii_rules: true, - verify_dns_length: true, - }) -} - -#[test] -fn test_v5() { - // IdnaTest:784 蔏。𑰺 - assert!(is_combining_mark('\u{11C3A}')); - assert!(_to_ascii("\u{11C3A}").is_err()); - assert!(_to_ascii("\u{850f}.\u{11C3A}").is_err()); - assert!(_to_ascii("\u{850f}\u{ff61}\u{11C3A}").is_err()); -} - -#[test] -fn test_v8_bidi_rules() { - assert_eq!(_to_ascii("abc").unwrap(), "abc"); - assert_eq!(_to_ascii("123").unwrap(), "123"); - assert_eq!(_to_ascii("אבּג").unwrap(), "xn--kdb3bdf"); - assert_eq!(_to_ascii("ابج").unwrap(), "xn--mgbcm"); - assert_eq!(_to_ascii("abc.ابج").unwrap(), "abc.xn--mgbcm"); - assert_eq!(_to_ascii("אבּג.ابج").unwrap(), "xn--kdb3bdf.xn--mgbcm"); - - // Bidi domain names cannot start with digits - assert!(_to_ascii("0a.\u{05D0}").is_err()); - assert!(_to_ascii("0à.\u{05D0}").is_err()); - - // Bidi chars may be punycode-encoded - assert!(_to_ascii("xn--0ca24w").is_err()); -} diff --git a/vendor/idna-0.1.5/tests/uts46.rs b/vendor/idna-0.1.5/tests/uts46.rs deleted file mode 100644 index 59ec1cd767..0000000000 --- a/vendor/idna-0.1.5/tests/uts46.rs +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2013-2014 The rust-url developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::char; -use idna::uts46; -use test::TestFn; - -pub fn collect_tests(add_test: &mut F) { - // http://www.unicode.org/Public/idna/latest/IdnaTest.txt - for (i, line) in include_str!("IdnaTest.txt").lines().enumerate() { - if line == "" || line.starts_with("#") { - continue - } - // Remove comments - let mut line = match line.find("#") { - Some(index) => &line[0..index], - None => line - }; - - let mut expected_failure = false; - if line.starts_with("XFAIL") { - expected_failure = true; - line = &line[5..line.len()]; - }; - - let mut pieces = line.split(';').map(|x| x.trim()).collect::>(); - - let test_type = pieces.remove(0); - let original = pieces.remove(0); - let source = unescape(original); - let to_unicode = pieces.remove(0); - let to_ascii = pieces.remove(0); - let nv8 = if pieces.len() > 0 { pieces.remove(0) } else { "" }; - - if expected_failure { - continue; - } - - let test_name = format!("UTS #46 line {}", i + 1); - add_test(test_name, TestFn::dyn_test_fn(move || { - let result = uts46::to_ascii(&source, uts46::Flags { - use_std3_ascii_rules: true, - transitional_processing: test_type == "T", - verify_dns_length: true, - }); - - if to_ascii.starts_with("[") { - if to_ascii.starts_with("[C") { - // http://unicode.org/reports/tr46/#Deviations - // applications that perform IDNA2008 lookup are not required to check - // for these contexts - return; - } - if to_ascii == "[V2]" { - // Everybody ignores V2 - // https://github.com/servo/rust-url/pull/240 - // https://github.com/whatwg/url/issues/53#issuecomment-181528158 - // http://www.unicode.org/review/pri317/ - return; - } - let res = result.ok(); - assert!(res == None, "Expected error. result: {} | original: {} | source: {}", - res.unwrap(), original, source); - return; - } - - let to_ascii = if to_ascii.len() > 0 { - to_ascii.to_string() - } else { - if to_unicode.len() > 0 { - to_unicode.to_string() - } else { - source.clone() - } - }; - - if nv8 == "NV8" { - // This result isn't valid under IDNA2008. Skip it - return; - } - - assert!(result.is_ok(), "Couldn't parse {} | original: {} | error: {:?}", - source, original, result.err()); - let output = result.ok().unwrap(); - assert!(output == to_ascii, "result: {} | expected: {} | original: {} | source: {}", - output, to_ascii, original, source); - })) - } -} - -fn unescape(input: &str) -> String { - let mut output = String::new(); - let mut chars = input.chars(); - loop { - match chars.next() { - None => return output, - Some(c) => - if c == '\\' { - match chars.next().unwrap() { - '\\' => output.push('\\'), - 'u' => { - let c1 = chars.next().unwrap().to_digit(16).unwrap(); - let c2 = chars.next().unwrap().to_digit(16).unwrap(); - let c3 = chars.next().unwrap().to_digit(16).unwrap(); - let c4 = chars.next().unwrap().to_digit(16).unwrap(); - match char::from_u32(((c1 * 16 + c2) * 16 + c3) * 16 + c4) - { - Some(c) => output.push(c), - None => { output.push_str(&format!("\\u{:X}{:X}{:X}{:X}",c1,c2,c3,c4)); } - }; - } - _ => panic!("Invalid test data input"), - } - } else { - output.push(c); - } - } - } -} diff --git a/vendor/ignore/.cargo-checksum.json b/vendor/ignore/.cargo-checksum.json new file mode 100644 index 0000000000..d24053ced4 --- /dev/null +++ b/vendor/ignore/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.lock":"25c22e0685537d911315e4c2a1a50fd1d1853bb65b5f6f0613ff1b520e48f22e","Cargo.toml":"40ecb88b28bdd94507f39da3aca81d132a7016c8974cafacd9573c23d704025f","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"c0af54e110652d9519a0bbb92cebdab956cac1b6638fee313a38c346022f292f","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","examples/walk.rs":"d93675825e3ef9dd45e1a514c69e73aaad6b3803514b074a0b34f22776bed7f7","src/dir.rs":"824e6542acff61b6074eb0bd27245c1e2356646975734acf5eda440c5a70b3de","src/gitignore.rs":"9399e1fc1323db8cfb81fbcd24f3d4eebf0ad25a0cc70937a9a592f4e6305e7c","src/lib.rs":"9144c502e1ea862c7676e49adbe0898f501e15b2dc1b9048b9de380baf4070b1","src/overrides.rs":"b70832b34bc8a63d43ba78ff246a8a56da9d3b7ca0874684d0dd00d89b1170df","src/pathutil.rs":"8d216f7274f150a6f6dde1b607cbbcd943860216b7e10f4c81b29cf5aa744f67","src/types.rs":"3d3d29bfdd2d47e9125e2a89a594893ef14d818c244e31dfb065e183ddd6b6d6","src/walk.rs":"6516708d91e6bd07a5a337a0a3e6731d28e787831a664d59db50b39fa82d12fe","tests/gitignore_matched_path_or_any_parents_tests.gitignore":"3895c935f76a57928cc12284dfff406693b7666c0ffce9b8676c6c1976debe2d","tests/gitignore_matched_path_or_any_parents_tests.rs":"e44a7cc7b5a9fedee6d4d17fdcfb40ffb6f8fb7a8b8ca450d2fecd4612afc692"},"package":"0ec16832258409d571aaef8273f3c3cc5b060d784e159d1a0f3b0017308f84a7"} \ No newline at end of file diff --git a/vendor/ignore/COPYING b/vendor/ignore/COPYING new file mode 100644 index 0000000000..bb9c20a094 --- /dev/null +++ b/vendor/ignore/COPYING @@ -0,0 +1,3 @@ +This project is dual-licensed under the Unlicense and MIT licenses. + +You may use this code under the terms of either license. diff --git a/vendor/ignore/Cargo.lock b/vendor/ignore/Cargo.lock new file mode 100644 index 0000000000..7e13fb2bc8 --- /dev/null +++ b/vendor/ignore/Cargo.lock @@ -0,0 +1,180 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bstr" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cfg-if" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam-channel" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-utils" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fnv" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "globset" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ignore" +version = "0.4.10" +dependencies = [ + "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lazy_static" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "memchr" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "regex" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "same-file" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thread_local" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "walkdir" +version = "2.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" +"checksum bstr 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e0a692f1c740e7e821ca71a22cf99b9b2322dfa94d10f71443befb1797b3946a" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" +"checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" +"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" +"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" +"checksum globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" +"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" +"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" +"checksum regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88c3d9193984285d544df4a30c23a4e62ead42edf70a4452ceb76dac1ce05c26" +"checksum regex-syntax 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b143cceb2ca5e56d5671988ef8b15615733e7ee16cd348e064333b251b89343f" +"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" +"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" +"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/vendor/ignore/Cargo.toml b/vendor/ignore/Cargo.toml new file mode 100644 index 0000000000..17f925e1db --- /dev/null +++ b/vendor/ignore/Cargo.toml @@ -0,0 +1,58 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +name = "ignore" +version = "0.4.10" +authors = ["Andrew Gallant "] +description = "A fast library for efficiently matching ignore files such as `.gitignore`\nagainst file paths.\n" +homepage = "https://github.com/BurntSushi/ripgrep/tree/master/ignore" +documentation = "https://docs.rs/ignore" +readme = "README.md" +keywords = ["glob", "ignore", "gitignore", "pattern", "file"] +license = "Unlicense/MIT" +repository = "https://github.com/BurntSushi/ripgrep/tree/master/ignore" + +[lib] +name = "ignore" +bench = false +[dependencies.crossbeam-channel] +version = "0.3.6" + +[dependencies.globset] +version = "0.4.3" + +[dependencies.lazy_static] +version = "1.1" + +[dependencies.log] +version = "0.4.5" + +[dependencies.memchr] +version = "2.1" + +[dependencies.regex] +version = "1.1" + +[dependencies.same-file] +version = "1.0.4" + +[dependencies.thread_local] +version = "0.3.6" + +[dependencies.walkdir] +version = "2.2.7" + +[features] +simd-accel = ["globset/simd-accel"] +[target."cfg(windows)".dependencies.winapi-util] +version = "0.1.2" diff --git a/vendor/ignore/LICENSE-MIT b/vendor/ignore/LICENSE-MIT new file mode 100644 index 0000000000..3b0a5dc09c --- /dev/null +++ b/vendor/ignore/LICENSE-MIT @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Andrew Gallant + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/ignore/README.md b/vendor/ignore/README.md new file mode 100644 index 0000000000..b0e659a9c3 --- /dev/null +++ b/vendor/ignore/README.md @@ -0,0 +1,66 @@ +ignore +====== +The ignore crate provides a fast recursive directory iterator that respects +various filters such as globs, file types and `.gitignore` files. This crate +also provides lower level direct access to gitignore and file type matchers. + +[![Linux build status](https://api.travis-ci.org/BurntSushi/ripgrep.svg)](https://travis-ci.org/BurntSushi/ripgrep) +[![Windows build status](https://ci.appveyor.com/api/projects/status/github/BurntSushi/ripgrep?svg=true)](https://ci.appveyor.com/project/BurntSushi/ripgrep) +[![](https://img.shields.io/crates/v/ignore.svg)](https://crates.io/crates/ignore) + +Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org). + +### Documentation + +[https://docs.rs/ignore](https://docs.rs/ignore) + +### Usage + +Add this to your `Cargo.toml`: + +```toml +[dependencies] +ignore = "0.4" +``` + +and this to your crate root: + +```rust +extern crate ignore; +``` + +### Example + +This example shows the most basic usage of this crate. This code will +recursively traverse the current directory while automatically filtering out +files and directories according to ignore globs found in files like +`.ignore` and `.gitignore`: + + +```rust,no_run +use ignore::Walk; + +for result in Walk::new("./") { + // Each item yielded by the iterator is either a directory entry or an + // error, so either print the path or the error. + match result { + Ok(entry) => println!("{}", entry.path().display()), + Err(err) => println!("ERROR: {}", err), + } +} +``` + +### Example: advanced + +By default, the recursive directory iterator will ignore hidden files and +directories. This can be disabled by building the iterator with `WalkBuilder`: + +```rust,no_run +use ignore::WalkBuilder; + +for result in WalkBuilder::new("./").hidden(false).build() { + println!("{:?}", result); +} +``` + +See the documentation for `WalkBuilder` for many other options. diff --git a/vendor/ignore/UNLICENSE b/vendor/ignore/UNLICENSE new file mode 100644 index 0000000000..68a49daad8 --- /dev/null +++ b/vendor/ignore/UNLICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/vendor/ignore/examples/walk.rs b/vendor/ignore/examples/walk.rs new file mode 100644 index 0000000000..1f2a3cea9a --- /dev/null +++ b/vendor/ignore/examples/walk.rs @@ -0,0 +1,84 @@ +extern crate crossbeam_channel as channel; +extern crate ignore; +extern crate walkdir; + +use std::env; +use std::io::{self, Write}; +use std::path::Path; +use std::thread; + +use ignore::WalkBuilder; +use walkdir::WalkDir; + +fn main() { + let mut path = env::args().nth(1).unwrap(); + let mut parallel = false; + let mut simple = false; + let (tx, rx) = channel::bounded::(100); + if path == "parallel" { + path = env::args().nth(2).unwrap(); + parallel = true; + } else if path == "walkdir" { + path = env::args().nth(2).unwrap(); + simple = true; + } + + let stdout_thread = thread::spawn(move || { + let mut stdout = io::BufWriter::new(io::stdout()); + for dent in rx { + write_path(&mut stdout, dent.path()); + } + }); + + if parallel { + let walker = WalkBuilder::new(path).threads(6).build_parallel(); + walker.run(|| { + let tx = tx.clone(); + Box::new(move |result| { + use ignore::WalkState::*; + + tx.send(DirEntry::Y(result.unwrap())).unwrap(); + Continue + }) + }); + } else if simple { + let walker = WalkDir::new(path); + for result in walker { + tx.send(DirEntry::X(result.unwrap())).unwrap(); + } + } else { + let walker = WalkBuilder::new(path).build(); + for result in walker { + tx.send(DirEntry::Y(result.unwrap())).unwrap(); + } + } + drop(tx); + stdout_thread.join().unwrap(); +} + +enum DirEntry { + X(walkdir::DirEntry), + Y(ignore::DirEntry), +} + +impl DirEntry { + fn path(&self) -> &Path { + match *self { + DirEntry::X(ref x) => x.path(), + DirEntry::Y(ref y) => y.path(), + } + } +} + +#[cfg(unix)] +fn write_path(mut wtr: W, path: &Path) { + use std::os::unix::ffi::OsStrExt; + wtr.write(path.as_os_str().as_bytes()).unwrap(); + wtr.write(b"\n").unwrap(); +} + +#[cfg(not(unix))] +fn write_path(mut wtr: W, path: &Path) { + wtr.write(path.to_string_lossy().as_bytes()).unwrap(); + wtr.write(b"\n").unwrap(); +} diff --git a/vendor/ignore/src/dir.rs b/vendor/ignore/src/dir.rs new file mode 100644 index 0000000000..12201f2260 --- /dev/null +++ b/vendor/ignore/src/dir.rs @@ -0,0 +1,1003 @@ +// This module provides a data structure, `Ignore`, that connects "directory +// traversal" with "ignore matchers." Specifically, it knows about gitignore +// semantics and precedence, and is organized based on directory hierarchy. +// Namely, every matcher logically corresponds to ignore rules from a single +// directory, and points to the matcher for its corresponding parent directory. +// In this sense, `Ignore` is a *persistent* data structure. +// +// This design was specifically chosen to make it possible to use this data +// structure in a parallel directory iterator. +// +// My initial intention was to expose this module as part of this crate's +// public API, but I think the data structure's public API is too complicated +// with non-obvious failure modes. Alas, such things haven't been documented +// well. + +use std::collections::HashMap; +use std::ffi::{OsString, OsStr}; +use std::path::{Path, PathBuf}; +use std::sync::{Arc, RwLock}; + +use gitignore::{self, Gitignore, GitignoreBuilder}; +use pathutil::{is_hidden, strip_prefix}; +use overrides::{self, Override}; +use types::{self, Types}; +use walk::DirEntry; +use {Error, Match, PartialErrorBuilder}; + +/// IgnoreMatch represents information about where a match came from when using +/// the `Ignore` matcher. +#[derive(Clone, Debug)] +pub struct IgnoreMatch<'a>(IgnoreMatchInner<'a>); + +/// IgnoreMatchInner describes precisely where the match information came from. +/// This is private to allow expansion to more matchers in the future. +#[derive(Clone, Debug)] +enum IgnoreMatchInner<'a> { + Override(overrides::Glob<'a>), + Gitignore(&'a gitignore::Glob), + Types(types::Glob<'a>), + Hidden, +} + +impl<'a> IgnoreMatch<'a> { + fn overrides(x: overrides::Glob<'a>) -> IgnoreMatch<'a> { + IgnoreMatch(IgnoreMatchInner::Override(x)) + } + + fn gitignore(x: &'a gitignore::Glob) -> IgnoreMatch<'a> { + IgnoreMatch(IgnoreMatchInner::Gitignore(x)) + } + + fn types(x: types::Glob<'a>) -> IgnoreMatch<'a> { + IgnoreMatch(IgnoreMatchInner::Types(x)) + } + + fn hidden() -> IgnoreMatch<'static> { + IgnoreMatch(IgnoreMatchInner::Hidden) + } +} + +/// Options for the ignore matcher, shared between the matcher itself and the +/// builder. +#[derive(Clone, Copy, Debug)] +struct IgnoreOptions { + /// Whether to ignore hidden file paths or not. + hidden: bool, + /// Whether to read .ignore files. + ignore: bool, + /// Whether to respect any ignore files in parent directories. + parents: bool, + /// Whether to read git's global gitignore file. + git_global: bool, + /// Whether to read .gitignore files. + git_ignore: bool, + /// Whether to read .git/info/exclude files. + git_exclude: bool, + /// Whether to ignore files case insensitively + ignore_case_insensitive: bool, +} + +/// Ignore is a matcher useful for recursively walking one or more directories. +#[derive(Clone, Debug)] +pub struct Ignore(Arc); + +#[derive(Clone, Debug)] +struct IgnoreInner { + /// A map of all existing directories that have already been + /// compiled into matchers. + /// + /// Note that this is never used during matching, only when adding new + /// parent directory matchers. This avoids needing to rebuild glob sets for + /// parent directories if many paths are being searched. + compiled: Arc>>, + /// The path to the directory that this matcher was built from. + dir: PathBuf, + /// An override matcher (default is empty). + overrides: Arc, + /// A file type matcher. + types: Arc, + /// The parent directory to match next. + /// + /// If this is the root directory or there are otherwise no more + /// directories to match, then `parent` is `None`. + parent: Option, + /// Whether this is an absolute parent matcher, as added by add_parent. + is_absolute_parent: bool, + /// The absolute base path of this matcher. Populated only if parent + /// directories are added. + absolute_base: Option>, + /// Explicit global ignore matchers specified by the caller. + explicit_ignores: Arc>, + /// Ignore files used in addition to `.ignore` + custom_ignore_filenames: Arc>, + /// The matcher for custom ignore files + custom_ignore_matcher: Gitignore, + /// The matcher for .ignore files. + ignore_matcher: Gitignore, + /// A global gitignore matcher, usually from $XDG_CONFIG_HOME/git/ignore. + git_global_matcher: Arc, + /// The matcher for .gitignore files. + git_ignore_matcher: Gitignore, + /// Special matcher for `.git/info/exclude` files. + git_exclude_matcher: Gitignore, + /// Whether this directory contains a .git sub-directory. + has_git: bool, + /// Ignore config. + opts: IgnoreOptions, +} + +impl Ignore { + /// Return the directory path of this matcher. + pub fn path(&self) -> &Path { + &self.0.dir + } + + /// Return true if this matcher has no parent. + pub fn is_root(&self) -> bool { + self.0.parent.is_none() + } + + /// Returns true if this matcher was added via the `add_parents` method. + pub fn is_absolute_parent(&self) -> bool { + self.0.is_absolute_parent + } + + /// Return this matcher's parent, if one exists. + pub fn parent(&self) -> Option { + self.0.parent.clone() + } + + /// Create a new `Ignore` matcher with the parent directories of `dir`. + /// + /// Note that this can only be called on an `Ignore` matcher with no + /// parents (i.e., `is_root` returns `true`). This will panic otherwise. + pub fn add_parents>( + &self, + path: P, + ) -> (Ignore, Option) { + if !self.0.opts.parents + && !self.0.opts.git_ignore + && !self.0.opts.git_exclude + && !self.0.opts.git_global + { + // If we never need info from parent directories, then don't do + // anything. + return (self.clone(), None); + } + if !self.is_root() { + panic!("Ignore::add_parents called on non-root matcher"); + } + let absolute_base = match path.as_ref().canonicalize() { + Ok(path) => Arc::new(path), + Err(_) => { + // There's not much we can do here, so just return our + // existing matcher. We drop the error to be consistent + // with our general pattern of ignoring I/O errors when + // processing ignore files. + return (self.clone(), None); + } + }; + // List of parents, from child to root. + let mut parents = vec![]; + let mut path = &**absolute_base; + while let Some(parent) = path.parent() { + parents.push(parent); + path = parent; + } + let mut errs = PartialErrorBuilder::default(); + let mut ig = self.clone(); + for parent in parents.into_iter().rev() { + let mut compiled = self.0.compiled.write().unwrap(); + if let Some(prebuilt) = compiled.get(parent.as_os_str()) { + ig = prebuilt.clone(); + continue; + } + let (mut igtmp, err) = ig.add_child_path(parent); + errs.maybe_push(err); + igtmp.is_absolute_parent = true; + igtmp.absolute_base = Some(absolute_base.clone()); + igtmp.has_git = + if self.0.opts.git_ignore { + parent.join(".git").exists() + } else { + false + }; + ig = Ignore(Arc::new(igtmp)); + compiled.insert(parent.as_os_str().to_os_string(), ig.clone()); + } + (ig, errs.into_error_option()) + } + + /// Create a new `Ignore` matcher for the given child directory. + /// + /// Since building the matcher may require reading from multiple + /// files, it's possible that this method partially succeeds. Therefore, + /// a matcher is always returned (which may match nothing) and an error is + /// returned if it exists. + /// + /// Note that all I/O errors are completely ignored. + pub fn add_child>( + &self, + dir: P, + ) -> (Ignore, Option) { + let (ig, err) = self.add_child_path(dir.as_ref()); + (Ignore(Arc::new(ig)), err) + } + + /// Like add_child, but takes a full path and returns an IgnoreInner. + fn add_child_path(&self, dir: &Path) -> (IgnoreInner, Option) { + let mut errs = PartialErrorBuilder::default(); + let custom_ig_matcher = + if self.0.custom_ignore_filenames.is_empty() { + Gitignore::empty() + } else { + let (m, err) = + create_gitignore( + &dir, + &self.0.custom_ignore_filenames, + self.0.opts.ignore_case_insensitive, + ); + errs.maybe_push(err); + m + }; + let ig_matcher = + if !self.0.opts.ignore { + Gitignore::empty() + } else { + let (m, err) = + create_gitignore( + &dir, + &[".ignore"], + self.0.opts.ignore_case_insensitive, + ); + errs.maybe_push(err); + m + }; + let gi_matcher = + if !self.0.opts.git_ignore { + Gitignore::empty() + } else { + let (m, err) = + create_gitignore( + &dir, + &[".gitignore"], + self.0.opts.ignore_case_insensitive, + ); + errs.maybe_push(err); + m + }; + let gi_exclude_matcher = + if !self.0.opts.git_exclude { + Gitignore::empty() + } else { + let (m, err) = + create_gitignore( + &dir, + &[".git/info/exclude"], + self.0.opts.ignore_case_insensitive, + ); + errs.maybe_push(err); + m + }; + let has_git = + if self.0.opts.git_ignore { + dir.join(".git").exists() + } else { + false + }; + let ig = IgnoreInner { + compiled: self.0.compiled.clone(), + dir: dir.to_path_buf(), + overrides: self.0.overrides.clone(), + types: self.0.types.clone(), + parent: Some(self.clone()), + is_absolute_parent: false, + absolute_base: self.0.absolute_base.clone(), + explicit_ignores: self.0.explicit_ignores.clone(), + custom_ignore_filenames: self.0.custom_ignore_filenames.clone(), + custom_ignore_matcher: custom_ig_matcher, + ignore_matcher: ig_matcher, + git_global_matcher: self.0.git_global_matcher.clone(), + git_ignore_matcher: gi_matcher, + git_exclude_matcher: gi_exclude_matcher, + has_git: has_git, + opts: self.0.opts, + }; + (ig, errs.into_error_option()) + } + + /// Returns true if at least one type of ignore rule should be matched. + fn has_any_ignore_rules(&self) -> bool { + let opts = self.0.opts; + let has_custom_ignore_files = !self.0.custom_ignore_filenames.is_empty(); + let has_explicit_ignores = !self.0.explicit_ignores.is_empty(); + + opts.ignore || opts.git_global || opts.git_ignore + || opts.git_exclude || has_custom_ignore_files + || has_explicit_ignores + } + + /// Like `matched`, but works with a directory entry instead. + pub fn matched_dir_entry<'a>( + &'a self, + dent: &DirEntry, + ) -> Match> { + let m = self.matched(dent.path(), dent.is_dir()); + if m.is_none() && self.0.opts.hidden && is_hidden(dent) { + return Match::Ignore(IgnoreMatch::hidden()); + } + m + } + + /// Returns a match indicating whether the given file path should be + /// ignored or not. + /// + /// The match contains information about its origin. + fn matched<'a, P: AsRef>( + &'a self, + path: P, + is_dir: bool, + ) -> Match> { + // We need to be careful with our path. If it has a leading ./, then + // strip it because it causes nothing but trouble. + let mut path = path.as_ref(); + if let Some(p) = strip_prefix("./", path) { + path = p; + } + // Match against the override patterns. If an override matches + // regardless of whether it's whitelist/ignore, then we quit and + // return that result immediately. Overrides have the highest + // precedence. + if !self.0.overrides.is_empty() { + let mat = + self.0.overrides.matched(path, is_dir) + .map(IgnoreMatch::overrides); + if !mat.is_none() { + return mat; + } + } + let mut whitelisted = Match::None; + if self.has_any_ignore_rules() { + let mat = self.matched_ignore(path, is_dir); + if mat.is_ignore() { + return mat; + } else if mat.is_whitelist() { + whitelisted = mat; + } + } + if !self.0.types.is_empty() { + let mat = + self.0.types.matched(path, is_dir).map(IgnoreMatch::types); + if mat.is_ignore() { + return mat; + } else if mat.is_whitelist() { + whitelisted = mat; + } + } + whitelisted + } + + /// Performs matching only on the ignore files for this directory and + /// all parent directories. + fn matched_ignore<'a>( + &'a self, + path: &Path, + is_dir: bool, + ) -> Match> { + let (mut m_custom_ignore, mut m_ignore, mut m_gi, mut m_gi_exclude, mut m_explicit) = + (Match::None, Match::None, Match::None, Match::None, Match::None); + let any_git = self.parents().any(|ig| ig.0.has_git); + let mut saw_git = false; + for ig in self.parents().take_while(|ig| !ig.0.is_absolute_parent) { + if m_custom_ignore.is_none() { + m_custom_ignore = + ig.0.custom_ignore_matcher.matched(path, is_dir) + .map(IgnoreMatch::gitignore); + } + if m_ignore.is_none() { + m_ignore = + ig.0.ignore_matcher.matched(path, is_dir) + .map(IgnoreMatch::gitignore); + } + if any_git && !saw_git && m_gi.is_none() { + m_gi = + ig.0.git_ignore_matcher.matched(path, is_dir) + .map(IgnoreMatch::gitignore); + } + if any_git && !saw_git && m_gi_exclude.is_none() { + m_gi_exclude = + ig.0.git_exclude_matcher.matched(path, is_dir) + .map(IgnoreMatch::gitignore); + } + saw_git = saw_git || ig.0.has_git; + } + if self.0.opts.parents { + if let Some(abs_parent_path) = self.absolute_base() { + let path = abs_parent_path.join(path); + for ig in self.parents().skip_while(|ig|!ig.0.is_absolute_parent) { + if m_custom_ignore.is_none() { + m_custom_ignore = + ig.0.custom_ignore_matcher.matched(&path, is_dir) + .map(IgnoreMatch::gitignore); + } + if m_ignore.is_none() { + m_ignore = + ig.0.ignore_matcher.matched(&path, is_dir) + .map(IgnoreMatch::gitignore); + } + if any_git && !saw_git && m_gi.is_none() { + m_gi = + ig.0.git_ignore_matcher.matched(&path, is_dir) + .map(IgnoreMatch::gitignore); + } + if any_git && !saw_git && m_gi_exclude.is_none() { + m_gi_exclude = + ig.0.git_exclude_matcher.matched(&path, is_dir) + .map(IgnoreMatch::gitignore); + } + saw_git = saw_git || ig.0.has_git; + } + } + } + for gi in self.0.explicit_ignores.iter().rev() { + if !m_explicit.is_none() { + break; + } + m_explicit = gi.matched(&path, is_dir).map(IgnoreMatch::gitignore); + } + let m_global = + if any_git { + self.0.git_global_matcher + .matched(&path, is_dir) + .map(IgnoreMatch::gitignore) + } else { + Match::None + }; + + m_custom_ignore.or(m_ignore).or(m_gi).or(m_gi_exclude).or(m_global).or(m_explicit) + } + + /// Returns an iterator over parent ignore matchers, including this one. + pub fn parents(&self) -> Parents { + Parents(Some(self)) + } + + /// Returns the first absolute path of the first absolute parent, if + /// one exists. + fn absolute_base(&self) -> Option<&Path> { + self.0.absolute_base.as_ref().map(|p| &***p) + } +} + +/// An iterator over all parents of an ignore matcher, including itself. +/// +/// The lifetime `'a` refers to the lifetime of the initial `Ignore` matcher. +pub struct Parents<'a>(Option<&'a Ignore>); + +impl<'a> Iterator for Parents<'a> { + type Item = &'a Ignore; + + fn next(&mut self) -> Option<&'a Ignore> { + match self.0.take() { + None => None, + Some(ig) => { + self.0 = ig.0.parent.as_ref(); + Some(ig) + } + } + } +} + +/// A builder for creating an Ignore matcher. +#[derive(Clone, Debug)] +pub struct IgnoreBuilder { + /// The root directory path for this ignore matcher. + dir: PathBuf, + /// An override matcher (default is empty). + overrides: Arc, + /// A type matcher (default is empty). + types: Arc, + /// Explicit global ignore matchers. + explicit_ignores: Vec, + /// Ignore files in addition to .ignore. + custom_ignore_filenames: Vec, + /// Ignore config. + opts: IgnoreOptions, +} + +impl IgnoreBuilder { + /// Create a new builder for an `Ignore` matcher. + /// + /// All relative file paths are resolved with respect to the current + /// working directory. + pub fn new() -> IgnoreBuilder { + IgnoreBuilder { + dir: Path::new("").to_path_buf(), + overrides: Arc::new(Override::empty()), + types: Arc::new(Types::empty()), + explicit_ignores: vec![], + custom_ignore_filenames: vec![], + opts: IgnoreOptions { + hidden: true, + ignore: true, + parents: true, + git_global: true, + git_ignore: true, + git_exclude: true, + ignore_case_insensitive: false, + }, + } + } + + /// Builds a new `Ignore` matcher. + /// + /// The matcher returned won't match anything until ignore rules from + /// directories are added to it. + pub fn build(&self) -> Ignore { + let git_global_matcher = + if !self.opts.git_global { + Gitignore::empty() + } else { + let mut builder = GitignoreBuilder::new(""); + builder + .case_insensitive(self.opts.ignore_case_insensitive) + .unwrap(); + let (gi, err) = builder.build_global(); + if let Some(err) = err { + debug!("{}", err); + } + gi + }; + + Ignore(Arc::new(IgnoreInner { + compiled: Arc::new(RwLock::new(HashMap::new())), + dir: self.dir.clone(), + overrides: self.overrides.clone(), + types: self.types.clone(), + parent: None, + is_absolute_parent: true, + absolute_base: None, + explicit_ignores: Arc::new(self.explicit_ignores.clone()), + custom_ignore_filenames: Arc::new(self.custom_ignore_filenames.clone()), + custom_ignore_matcher: Gitignore::empty(), + ignore_matcher: Gitignore::empty(), + git_global_matcher: Arc::new(git_global_matcher), + git_ignore_matcher: Gitignore::empty(), + git_exclude_matcher: Gitignore::empty(), + has_git: false, + opts: self.opts, + })) + } + + /// Add an override matcher. + /// + /// By default, no override matcher is used. + /// + /// This overrides any previous setting. + pub fn overrides(&mut self, overrides: Override) -> &mut IgnoreBuilder { + self.overrides = Arc::new(overrides); + self + } + + /// Add a file type matcher. + /// + /// By default, no file type matcher is used. + /// + /// This overrides any previous setting. + pub fn types(&mut self, types: Types) -> &mut IgnoreBuilder { + self.types = Arc::new(types); + self + } + + /// Adds a new global ignore matcher from the ignore file path given. + pub fn add_ignore(&mut self, ig: Gitignore) -> &mut IgnoreBuilder { + self.explicit_ignores.push(ig); + self + } + + /// Add a custom ignore file name + /// + /// These ignore files have higher precedence than all other ignore files. + /// + /// When specifying multiple names, earlier names have lower precedence than + /// later names. + pub fn add_custom_ignore_filename>( + &mut self, + file_name: S + ) -> &mut IgnoreBuilder { + self.custom_ignore_filenames.push(file_name.as_ref().to_os_string()); + self + } + + /// Enables ignoring hidden files. + /// + /// This is enabled by default. + pub fn hidden(&mut self, yes: bool) -> &mut IgnoreBuilder { + self.opts.hidden = yes; + self + } + + /// Enables reading `.ignore` files. + /// + /// `.ignore` files have the same semantics as `gitignore` files and are + /// supported by search tools such as ripgrep and The Silver Searcher. + /// + /// This is enabled by default. + pub fn ignore(&mut self, yes: bool) -> &mut IgnoreBuilder { + self.opts.ignore = yes; + self + } + + /// Enables reading ignore files from parent directories. + /// + /// If this is enabled, then .gitignore files in parent directories of each + /// file path given are respected. Otherwise, they are ignored. + /// + /// This is enabled by default. + pub fn parents(&mut self, yes: bool) -> &mut IgnoreBuilder { + self.opts.parents = yes; + self + } + + /// Add a global gitignore matcher. + /// + /// Its precedence is lower than both normal `.gitignore` files and + /// `.git/info/exclude` files. + /// + /// This overwrites any previous global gitignore setting. + /// + /// This is enabled by default. + pub fn git_global(&mut self, yes: bool) -> &mut IgnoreBuilder { + self.opts.git_global = yes; + self + } + + /// Enables reading `.gitignore` files. + /// + /// `.gitignore` files have match semantics as described in the `gitignore` + /// man page. + /// + /// This is enabled by default. + pub fn git_ignore(&mut self, yes: bool) -> &mut IgnoreBuilder { + self.opts.git_ignore = yes; + self + } + + /// Enables reading `.git/info/exclude` files. + /// + /// `.git/info/exclude` files have match semantics as described in the + /// `gitignore` man page. + /// + /// This is enabled by default. + pub fn git_exclude(&mut self, yes: bool) -> &mut IgnoreBuilder { + self.opts.git_exclude = yes; + self + } + + /// Process ignore files case insensitively + /// + /// This is disabled by default. + pub fn ignore_case_insensitive( + &mut self, + yes: bool, + ) -> &mut IgnoreBuilder { + self.opts.ignore_case_insensitive = yes; + self + } +} + +/// Creates a new gitignore matcher for the directory given. +/// +/// Ignore globs are extracted from each of the file names in `dir` in the +/// order given (earlier names have lower precedence than later names). +/// +/// I/O errors are ignored. +pub fn create_gitignore>( + dir: &Path, + names: &[T], + case_insensitive: bool, +) -> (Gitignore, Option) { + let mut builder = GitignoreBuilder::new(dir); + let mut errs = PartialErrorBuilder::default(); + builder.case_insensitive(case_insensitive).unwrap(); + for name in names { + let gipath = dir.join(name.as_ref()); + errs.maybe_push_ignore_io(builder.add(gipath)); + } + let gi = match builder.build() { + Ok(gi) => gi, + Err(err) => { + errs.push(err); + GitignoreBuilder::new(dir).build().unwrap() + } + }; + (gi, errs.into_error_option()) +} + +#[cfg(test)] +mod tests { + use std::fs::{self, File}; + use std::io::Write; + use std::path::Path; + + use dir::IgnoreBuilder; + use gitignore::Gitignore; + use tests::TempDir; + use Error; + + fn wfile>(path: P, contents: &str) { + let mut file = File::create(path).unwrap(); + file.write_all(contents.as_bytes()).unwrap(); + } + + fn mkdirp>(path: P) { + fs::create_dir_all(path).unwrap(); + } + + fn partial(err: Error) -> Vec { + match err { + Error::Partial(errs) => errs, + _ => panic!("expected partial error but got {:?}", err), + } + } + + fn tmpdir(prefix: &str) -> TempDir { + TempDir::new().unwrap() + } + + #[test] + fn explicit_ignore() { + let td = tmpdir("ignore-test-"); + wfile(td.path().join("not-an-ignore"), "foo\n!bar"); + + let (gi, err) = Gitignore::new(td.path().join("not-an-ignore")); + assert!(err.is_none()); + let (ig, err) = IgnoreBuilder::new() + .add_ignore(gi).build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("foo", false).is_ignore()); + assert!(ig.matched("bar", false).is_whitelist()); + assert!(ig.matched("baz", false).is_none()); + } + + #[test] + fn git_exclude() { + let td = tmpdir("ignore-test-"); + mkdirp(td.path().join(".git/info")); + wfile(td.path().join(".git/info/exclude"), "foo\n!bar"); + + let (ig, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("foo", false).is_ignore()); + assert!(ig.matched("bar", false).is_whitelist()); + assert!(ig.matched("baz", false).is_none()); + } + + #[test] + fn gitignore() { + let td = tmpdir("ignore-test-"); + mkdirp(td.path().join(".git")); + wfile(td.path().join(".gitignore"), "foo\n!bar"); + + let (ig, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("foo", false).is_ignore()); + assert!(ig.matched("bar", false).is_whitelist()); + assert!(ig.matched("baz", false).is_none()); + } + + #[test] + fn gitignore_no_git() { + let td = tmpdir("ignore-test-"); + wfile(td.path().join(".gitignore"), "foo\n!bar"); + + let (ig, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("foo", false).is_none()); + assert!(ig.matched("bar", false).is_none()); + assert!(ig.matched("baz", false).is_none()); + } + + #[test] + fn ignore() { + let td = tmpdir("ignore-test-"); + wfile(td.path().join(".ignore"), "foo\n!bar"); + + let (ig, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("foo", false).is_ignore()); + assert!(ig.matched("bar", false).is_whitelist()); + assert!(ig.matched("baz", false).is_none()); + } + + #[test] + fn custom_ignore() { + let td = tmpdir("ignore-test-"); + let custom_ignore = ".customignore"; + wfile(td.path().join(custom_ignore), "foo\n!bar"); + + let (ig, err) = IgnoreBuilder::new() + .add_custom_ignore_filename(custom_ignore) + .build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("foo", false).is_ignore()); + assert!(ig.matched("bar", false).is_whitelist()); + assert!(ig.matched("baz", false).is_none()); + } + + // Tests that a custom ignore file will override an .ignore. + #[test] + fn custom_ignore_over_ignore() { + let td = tmpdir("ignore-test-"); + let custom_ignore = ".customignore"; + wfile(td.path().join(".ignore"), "foo"); + wfile(td.path().join(custom_ignore), "!foo"); + + let (ig, err) = IgnoreBuilder::new() + .add_custom_ignore_filename(custom_ignore) + .build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("foo", false).is_whitelist()); + } + + // Tests that earlier custom ignore files have lower precedence than later. + #[test] + fn custom_ignore_precedence() { + let td = tmpdir("ignore-test-"); + let custom_ignore1 = ".customignore1"; + let custom_ignore2 = ".customignore2"; + wfile(td.path().join(custom_ignore1), "foo"); + wfile(td.path().join(custom_ignore2), "!foo"); + + let (ig, err) = IgnoreBuilder::new() + .add_custom_ignore_filename(custom_ignore1) + .add_custom_ignore_filename(custom_ignore2) + .build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("foo", false).is_whitelist()); + } + + // Tests that an .ignore will override a .gitignore. + #[test] + fn ignore_over_gitignore() { + let td = tmpdir("ignore-test-"); + wfile(td.path().join(".gitignore"), "foo"); + wfile(td.path().join(".ignore"), "!foo"); + + let (ig, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("foo", false).is_whitelist()); + } + + // Tests that exclude has lower precedent than both .ignore and .gitignore. + #[test] + fn exclude_lowest() { + let td = tmpdir("ignore-test-"); + wfile(td.path().join(".gitignore"), "!foo"); + wfile(td.path().join(".ignore"), "!bar"); + mkdirp(td.path().join(".git/info")); + wfile(td.path().join(".git/info/exclude"), "foo\nbar\nbaz"); + + let (ig, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_none()); + assert!(ig.matched("baz", false).is_ignore()); + assert!(ig.matched("foo", false).is_whitelist()); + assert!(ig.matched("bar", false).is_whitelist()); + } + + #[test] + fn errored() { + let td = tmpdir("ignore-test-"); + wfile(td.path().join(".gitignore"), "{foo"); + + let (_, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_some()); + } + + #[test] + fn errored_both() { + let td = tmpdir("ignore-test-"); + wfile(td.path().join(".gitignore"), "{foo"); + wfile(td.path().join(".ignore"), "{bar"); + + let (_, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert_eq!(2, partial(err.expect("an error")).len()); + } + + #[test] + fn errored_partial() { + let td = tmpdir("ignore-test-"); + mkdirp(td.path().join(".git")); + wfile(td.path().join(".gitignore"), "{foo\nbar"); + + let (ig, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_some()); + assert!(ig.matched("bar", false).is_ignore()); + } + + #[test] + fn errored_partial_and_ignore() { + let td = tmpdir("ignore-test-"); + wfile(td.path().join(".gitignore"), "{foo\nbar"); + wfile(td.path().join(".ignore"), "!bar"); + + let (ig, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_some()); + assert!(ig.matched("bar", false).is_whitelist()); + } + + #[test] + fn not_present_empty() { + let td = tmpdir("ignore-test-"); + + let (_, err) = IgnoreBuilder::new().build().add_child(td.path()); + assert!(err.is_none()); + } + + #[test] + fn stops_at_git_dir() { + // This tests that .gitignore files beyond a .git barrier aren't + // matched, but .ignore files are. + let td = tmpdir("ignore-test-"); + mkdirp(td.path().join(".git")); + mkdirp(td.path().join("foo/.git")); + wfile(td.path().join(".gitignore"), "foo"); + wfile(td.path().join(".ignore"), "bar"); + + let ig0 = IgnoreBuilder::new().build(); + let (ig1, err) = ig0.add_child(td.path()); + assert!(err.is_none()); + let (ig2, err) = ig1.add_child(ig1.path().join("foo")); + assert!(err.is_none()); + + assert!(ig1.matched("foo", false).is_ignore()); + assert!(ig2.matched("foo", false).is_none()); + + assert!(ig1.matched("bar", false).is_ignore()); + assert!(ig2.matched("bar", false).is_ignore()); + } + + #[test] + fn absolute_parent() { + let td = tmpdir("ignore-test-"); + mkdirp(td.path().join(".git")); + mkdirp(td.path().join("foo")); + wfile(td.path().join(".gitignore"), "bar"); + + // First, check that the parent gitignore file isn't detected if the + // parent isn't added. This establishes a baseline. + let ig0 = IgnoreBuilder::new().build(); + let (ig1, err) = ig0.add_child(td.path().join("foo")); + assert!(err.is_none()); + assert!(ig1.matched("bar", false).is_none()); + + // Second, check that adding a parent directory actually works. + let ig0 = IgnoreBuilder::new().build(); + let (ig1, err) = ig0.add_parents(td.path().join("foo")); + assert!(err.is_none()); + let (ig2, err) = ig1.add_child(td.path().join("foo")); + assert!(err.is_none()); + assert!(ig2.matched("bar", false).is_ignore()); + } + + #[test] + fn absolute_parent_anchored() { + let td = tmpdir("ignore-test-"); + mkdirp(td.path().join(".git")); + mkdirp(td.path().join("src/llvm")); + wfile(td.path().join(".gitignore"), "/llvm/\nfoo"); + + let ig0 = IgnoreBuilder::new().build(); + let (ig1, err) = ig0.add_parents(td.path().join("src")); + assert!(err.is_none()); + let (ig2, err) = ig1.add_child("src"); + assert!(err.is_none()); + + assert!(ig1.matched("llvm", true).is_none()); + assert!(ig2.matched("llvm", true).is_none()); + assert!(ig2.matched("src/llvm", true).is_none()); + assert!(ig2.matched("foo", false).is_ignore()); + assert!(ig2.matched("src/foo", false).is_ignore()); + } +} diff --git a/vendor/ignore/src/gitignore.rs b/vendor/ignore/src/gitignore.rs new file mode 100644 index 0000000000..b8db42ba2c --- /dev/null +++ b/vendor/ignore/src/gitignore.rs @@ -0,0 +1,787 @@ +/*! +The gitignore module provides a way to match globs from a gitignore file +against file paths. + +Note that this module implements the specification as described in the +`gitignore` man page from scratch. That is, this module does *not* shell out to +the `git` command line tool. +*/ + +use std::cell::RefCell; +use std::env; +use std::fs::File; +use std::io::{self, BufRead, Read}; +use std::path::{Path, PathBuf}; +use std::str; +use std::sync::Arc; + +use globset::{Candidate, GlobBuilder, GlobSet, GlobSetBuilder}; +use regex::bytes::Regex; +use thread_local::ThreadLocal; + +use pathutil::{is_file_name, strip_prefix}; +use {Error, Match, PartialErrorBuilder}; + +/// Glob represents a single glob in a gitignore file. +/// +/// This is used to report information about the highest precedent glob that +/// matched in one or more gitignore files. +#[derive(Clone, Debug)] +pub struct Glob { + /// The file path that this glob was extracted from. + from: Option, + /// The original glob string. + original: String, + /// The actual glob string used to convert to a regex. + actual: String, + /// Whether this is a whitelisted glob or not. + is_whitelist: bool, + /// Whether this glob should only match directories or not. + is_only_dir: bool, +} + +impl Glob { + /// Returns the file path that defined this glob. + pub fn from(&self) -> Option<&Path> { + self.from.as_ref().map(|p| &**p) + } + + /// The original glob as it was defined in a gitignore file. + pub fn original(&self) -> &str { + &self.original + } + + /// The actual glob that was compiled to respect gitignore + /// semantics. + pub fn actual(&self) -> &str { + &self.actual + } + + /// Whether this was a whitelisted glob or not. + pub fn is_whitelist(&self) -> bool { + self.is_whitelist + } + + /// Whether this glob must match a directory or not. + pub fn is_only_dir(&self) -> bool { + self.is_only_dir + } + + /// Returns true if and only if this glob has a `**/` prefix. + fn has_doublestar_prefix(&self) -> bool { + self.actual.starts_with("**/") || self.actual == "**" + } +} + +/// Gitignore is a matcher for the globs in one or more gitignore files +/// in the same directory. +#[derive(Clone, Debug)] +pub struct Gitignore { + set: GlobSet, + root: PathBuf, + globs: Vec, + num_ignores: u64, + num_whitelists: u64, + matches: Option>>>>, +} + +impl Gitignore { + /// Creates a new gitignore matcher from the gitignore file path given. + /// + /// If it's desirable to include multiple gitignore files in a single + /// matcher, or read gitignore globs from a different source, then + /// use `GitignoreBuilder`. + /// + /// This always returns a valid matcher, even if it's empty. In particular, + /// a Gitignore file can be partially valid, e.g., when one glob is invalid + /// but the rest aren't. + /// + /// Note that I/O errors are ignored. For more granular control over + /// errors, use `GitignoreBuilder`. + pub fn new>( + gitignore_path: P, + ) -> (Gitignore, Option) { + let path = gitignore_path.as_ref(); + let parent = path.parent().unwrap_or(Path::new("/")); + let mut builder = GitignoreBuilder::new(parent); + let mut errs = PartialErrorBuilder::default(); + errs.maybe_push_ignore_io(builder.add(path)); + match builder.build() { + Ok(gi) => (gi, errs.into_error_option()), + Err(err) => { + errs.push(err); + (Gitignore::empty(), errs.into_error_option()) + } + } + } + + /// Creates a new gitignore matcher from the global ignore file, if one + /// exists. + /// + /// The global config file path is specified by git's `core.excludesFile` + /// config option. + /// + /// Git's config file location is `$HOME/.gitconfig`. If `$HOME/.gitconfig` + /// does not exist or does not specify `core.excludesFile`, then + /// `$XDG_CONFIG_HOME/git/ignore` is read. If `$XDG_CONFIG_HOME` is not + /// set or is empty, then `$HOME/.config/git/ignore` is used instead. + pub fn global() -> (Gitignore, Option) { + GitignoreBuilder::new("").build_global() + } + + /// Creates a new empty gitignore matcher that never matches anything. + /// + /// Its path is empty. + pub fn empty() -> Gitignore { + Gitignore { + set: GlobSet::empty(), + root: PathBuf::from(""), + globs: vec![], + num_ignores: 0, + num_whitelists: 0, + matches: None, + } + } + + /// Returns the directory containing this gitignore matcher. + /// + /// All matches are done relative to this path. + pub fn path(&self) -> &Path { + &*self.root + } + + /// Returns true if and only if this gitignore has zero globs, and + /// therefore never matches any file path. + pub fn is_empty(&self) -> bool { + self.set.is_empty() + } + + /// Returns the total number of globs, which should be equivalent to + /// `num_ignores + num_whitelists`. + pub fn len(&self) -> usize { + self.set.len() + } + + /// Returns the total number of ignore globs. + pub fn num_ignores(&self) -> u64 { + self.num_ignores + } + + /// Returns the total number of whitelisted globs. + pub fn num_whitelists(&self) -> u64 { + self.num_whitelists + } + + /// Returns whether the given path (file or directory) matched a pattern in + /// this gitignore matcher. + /// + /// `is_dir` should be true if the path refers to a directory and false + /// otherwise. + /// + /// The given path is matched relative to the path given when building + /// the matcher. Specifically, before matching `path`, its prefix (as + /// determined by a common suffix of the directory containing this + /// gitignore) is stripped. If there is no common suffix/prefix overlap, + /// then `path` is assumed to be relative to this matcher. + pub fn matched>( + &self, + path: P, + is_dir: bool, + ) -> Match<&Glob> { + if self.is_empty() { + return Match::None; + } + self.matched_stripped(self.strip(path.as_ref()), is_dir) + } + + /// Returns whether the given path (file or directory, and expected to be + /// under the root) or any of its parent directories (up to the root) + /// matched a pattern in this gitignore matcher. + /// + /// NOTE: This method is more expensive than walking the directory hierarchy + /// top-to-bottom and matching the entries. But, is easier to use in cases + /// when a list of paths are available without a hierarchy. + /// + /// `is_dir` should be true if the path refers to a directory and false + /// otherwise. + /// + /// The given path is matched relative to the path given when building + /// the matcher. Specifically, before matching `path`, its prefix (as + /// determined by a common suffix of the directory containing this + /// gitignore) is stripped. If there is no common suffix/prefix overlap, + /// then `path` is assumed to be relative to this matcher. + /// + /// # Panics + /// + /// This method panics if the given file path is not under the root path + /// of this matcher. + pub fn matched_path_or_any_parents>( + &self, + path: P, + is_dir: bool, + ) -> Match<&Glob> { + if self.is_empty() { + return Match::None; + } + let mut path = self.strip(path.as_ref()); + assert!(!path.has_root(), "path is expected to be under the root"); + + match self.matched_stripped(path, is_dir) { + Match::None => (), // walk up + a_match => return a_match, + } + while let Some(parent) = path.parent() { + match self.matched_stripped(parent, /* is_dir */ true) { + Match::None => path = parent, // walk up + a_match => return a_match, + } + } + Match::None + } + + /// Like matched, but takes a path that has already been stripped. + fn matched_stripped>( + &self, + path: P, + is_dir: bool, + ) -> Match<&Glob> { + if self.is_empty() { + return Match::None; + } + let path = path.as_ref(); + let _matches = self.matches.as_ref().unwrap().get_default(); + let mut matches = _matches.borrow_mut(); + let candidate = Candidate::new(path); + self.set.matches_candidate_into(&candidate, &mut *matches); + for &i in matches.iter().rev() { + let glob = &self.globs[i]; + if !glob.is_only_dir() || is_dir { + return if glob.is_whitelist() { + Match::Whitelist(glob) + } else { + Match::Ignore(glob) + }; + } + } + Match::None + } + + /// Strips the given path such that it's suitable for matching with this + /// gitignore matcher. + fn strip<'a, P: 'a + AsRef + ?Sized>( + &'a self, + path: &'a P, + ) -> &'a Path { + let mut path = path.as_ref(); + // A leading ./ is completely superfluous. We also strip it from + // our gitignore root path, so we need to strip it from our candidate + // path too. + if let Some(p) = strip_prefix("./", path) { + path = p; + } + // Strip any common prefix between the candidate path and the root + // of the gitignore, to make sure we get relative matching right. + // BUT, a file name might not have any directory components to it, + // in which case, we don't want to accidentally strip any part of the + // file name. + // + // As an additional special case, if the root is just `.`, then we + // shouldn't try to strip anything, e.g., when path begins with a `.`. + if self.root != Path::new(".") && !is_file_name(path) { + if let Some(p) = strip_prefix(&self.root, path) { + path = p; + // If we're left with a leading slash, get rid of it. + if let Some(p) = strip_prefix("/", path) { + path = p; + } + } + } + path + } +} + +/// Builds a matcher for a single set of globs from a .gitignore file. +#[derive(Clone, Debug)] +pub struct GitignoreBuilder { + builder: GlobSetBuilder, + root: PathBuf, + globs: Vec, + case_insensitive: bool, +} + +impl GitignoreBuilder { + /// Create a new builder for a gitignore file. + /// + /// The path given should be the path at which the globs for this gitignore + /// file should be matched. Note that paths are always matched relative + /// to the root path given here. Generally, the root path should correspond + /// to the *directory* containing a `.gitignore` file. + pub fn new>(root: P) -> GitignoreBuilder { + let root = root.as_ref(); + GitignoreBuilder { + builder: GlobSetBuilder::new(), + root: strip_prefix("./", root).unwrap_or(root).to_path_buf(), + globs: vec![], + case_insensitive: false, + } + } + + /// Builds a new matcher from the globs added so far. + /// + /// Once a matcher is built, no new globs can be added to it. + pub fn build(&self) -> Result { + let nignore = self.globs.iter().filter(|g| !g.is_whitelist()).count(); + let nwhite = self.globs.iter().filter(|g| g.is_whitelist()).count(); + let set = + self.builder.build().map_err(|err| { + Error::Glob { + glob: None, + err: err.to_string(), + } + })?; + Ok(Gitignore { + set: set, + root: self.root.clone(), + globs: self.globs.clone(), + num_ignores: nignore as u64, + num_whitelists: nwhite as u64, + matches: Some(Arc::new(ThreadLocal::default())), + }) + } + + /// Build a global gitignore matcher using the configuration in this + /// builder. + /// + /// This consumes ownership of the builder unlike `build` because it + /// must mutate the builder to add the global gitignore globs. + /// + /// Note that this ignores the path given to this builder's constructor + /// and instead derives the path automatically from git's global + /// configuration. + pub fn build_global(mut self) -> (Gitignore, Option) { + match gitconfig_excludes_path() { + None => (Gitignore::empty(), None), + Some(path) => { + if !path.is_file() { + (Gitignore::empty(), None) + } else { + let mut errs = PartialErrorBuilder::default(); + errs.maybe_push_ignore_io(self.add(path)); + match self.build() { + Ok(gi) => (gi, errs.into_error_option()), + Err(err) => { + errs.push(err); + (Gitignore::empty(), errs.into_error_option()) + } + } + } + } + } + } + + /// Add each glob from the file path given. + /// + /// The file given should be formatted as a `gitignore` file. + /// + /// Note that partial errors can be returned. For example, if there was + /// a problem adding one glob, an error for that will be returned, but + /// all other valid globs will still be added. + pub fn add>(&mut self, path: P) -> Option { + let path = path.as_ref(); + let file = match File::open(path) { + Err(err) => return Some(Error::Io(err).with_path(path)), + Ok(file) => file, + }; + let rdr = io::BufReader::new(file); + let mut errs = PartialErrorBuilder::default(); + for (i, line) in rdr.lines().enumerate() { + let lineno = (i + 1) as u64; + let line = match line { + Ok(line) => line, + Err(err) => { + errs.push(Error::Io(err).tagged(path, lineno)); + break; + } + }; + if let Err(err) = self.add_line(Some(path.to_path_buf()), &line) { + errs.push(err.tagged(path, lineno)); + } + } + errs.into_error_option() + } + + /// Add each glob line from the string given. + /// + /// If this string came from a particular `gitignore` file, then its path + /// should be provided here. + /// + /// The string given should be formatted as a `gitignore` file. + #[cfg(test)] + fn add_str( + &mut self, + from: Option, + gitignore: &str, + ) -> Result<&mut GitignoreBuilder, Error> { + for line in gitignore.lines() { + self.add_line(from.clone(), line)?; + } + Ok(self) + } + + /// Add a line from a gitignore file to this builder. + /// + /// If this line came from a particular `gitignore` file, then its path + /// should be provided here. + /// + /// If the line could not be parsed as a glob, then an error is returned. + pub fn add_line( + &mut self, + from: Option, + mut line: &str, + ) -> Result<&mut GitignoreBuilder, Error> { + #![allow(deprecated)] + + if line.starts_with("#") { + return Ok(self); + } + if !line.ends_with("\\ ") { + line = line.trim_right(); + } + if line.is_empty() { + return Ok(self); + } + let mut glob = Glob { + from: from, + original: line.to_string(), + actual: String::new(), + is_whitelist: false, + is_only_dir: false, + }; + let mut is_absolute = false; + if line.starts_with("\\!") || line.starts_with("\\#") { + line = &line[1..]; + is_absolute = line.chars().nth(0) == Some('/'); + } else { + if line.starts_with("!") { + glob.is_whitelist = true; + line = &line[1..]; + } + if line.starts_with("/") { + // `man gitignore` says that if a glob starts with a slash, + // then the glob can only match the beginning of a path + // (relative to the location of gitignore). We achieve this by + // simply banning wildcards from matching /. + line = &line[1..]; + is_absolute = true; + } + } + // If it ends with a slash, then this should only match directories, + // but the slash should otherwise not be used while globbing. + if let Some((i, c)) = line.char_indices().rev().nth(0) { + if c == '/' { + glob.is_only_dir = true; + line = &line[..i]; + } + } + glob.actual = line.to_string(); + // If there is a literal slash, then this is a glob that must match the + // entire path name. Otherwise, we should let it match anywhere, so use + // a **/ prefix. + if !is_absolute && !line.chars().any(|c| c == '/') { + // ... but only if we don't already have a **/ prefix. + if !glob.has_doublestar_prefix() { + glob.actual = format!("**/{}", glob.actual); + } + } + // If the glob ends with `/**`, then we should only match everything + // inside a directory, but not the directory itself. Standard globs + // will match the directory. So we add `/*` to force the issue. + if glob.actual.ends_with("/**") { + glob.actual = format!("{}/*", glob.actual); + } + let parsed = + GlobBuilder::new(&glob.actual) + .literal_separator(true) + .case_insensitive(self.case_insensitive) + .backslash_escape(true) + .build() + .map_err(|err| { + Error::Glob { + glob: Some(glob.original.clone()), + err: err.kind().to_string(), + } + })?; + self.builder.add(parsed); + self.globs.push(glob); + Ok(self) + } + + /// Toggle whether the globs should be matched case insensitively or not. + /// + /// When this option is changed, only globs added after the change will be + /// affected. + /// + /// This is disabled by default. + pub fn case_insensitive( + &mut self, + yes: bool, + ) -> Result<&mut GitignoreBuilder, Error> { + // TODO: This should not return a `Result`. Fix this in the next semver + // release. + self.case_insensitive = yes; + Ok(self) + } +} + +/// Return the file path of the current environment's global gitignore file. +/// +/// Note that the file path returned may not exist. +fn gitconfig_excludes_path() -> Option { + // git supports $HOME/.gitconfig and $XDG_CONFIG_DIR/git/config. Notably, + // both can be active at the same time, where $HOME/.gitconfig takes + // precedent. So if $HOME/.gitconfig defines a `core.excludesFile`, then + // we're done. + match gitconfig_home_contents().and_then(|x| parse_excludes_file(&x)) { + Some(path) => return Some(path), + None => {} + } + match gitconfig_xdg_contents().and_then(|x| parse_excludes_file(&x)) { + Some(path) => return Some(path), + None => {} + } + excludes_file_default() +} + +/// Returns the file contents of git's global config file, if one exists, in +/// the user's home directory. +fn gitconfig_home_contents() -> Option> { + let home = match home_dir() { + None => return None, + Some(home) => home, + }; + let mut file = match File::open(home.join(".gitconfig")) { + Err(_) => return None, + Ok(file) => io::BufReader::new(file), + }; + let mut contents = vec![]; + file.read_to_end(&mut contents).ok().map(|_| contents) +} + +/// Returns the file contents of git's global config file, if one exists, in +/// the user's XDG_CONFIG_DIR directory. +fn gitconfig_xdg_contents() -> Option> { + let path = env::var_os("XDG_CONFIG_HOME") + .and_then(|x| if x.is_empty() { None } else { Some(PathBuf::from(x)) }) + .or_else(|| home_dir().map(|p| p.join(".config"))) + .map(|x| x.join("git/config")); + let mut file = match path.and_then(|p| File::open(p).ok()) { + None => return None, + Some(file) => io::BufReader::new(file), + }; + let mut contents = vec![]; + file.read_to_end(&mut contents).ok().map(|_| contents) +} + +/// Returns the default file path for a global .gitignore file. +/// +/// Specifically, this respects XDG_CONFIG_HOME. +fn excludes_file_default() -> Option { + env::var_os("XDG_CONFIG_HOME") + .and_then(|x| if x.is_empty() { None } else { Some(PathBuf::from(x)) }) + .or_else(|| home_dir().map(|p| p.join(".config"))) + .map(|x| x.join("git/ignore")) +} + +/// Extract git's `core.excludesfile` config setting from the raw file contents +/// given. +fn parse_excludes_file(data: &[u8]) -> Option { + // N.B. This is the lazy approach, and isn't technically correct, but + // probably works in more circumstances. I guess we would ideally have + // a full INI parser. Yuck. + lazy_static! { + static ref RE: Regex = Regex::new( + r"(?im)^\s*excludesfile\s*=\s*(.+)\s*$" + ).unwrap(); + }; + let caps = match RE.captures(data) { + None => return None, + Some(caps) => caps, + }; + str::from_utf8(&caps[1]).ok().map(|s| PathBuf::from(expand_tilde(s))) +} + +/// Expands ~ in file paths to the value of $HOME. +fn expand_tilde(path: &str) -> String { + let home = match home_dir() { + None => return path.to_string(), + Some(home) => home.to_string_lossy().into_owned(), + }; + path.replace("~", &home) +} + +/// Returns the location of the user's home directory. +fn home_dir() -> Option { + // We're fine with using env::home_dir for now. Its bugs are, IMO, pretty + // minor corner cases. We should still probably eventually migrate to + // the `dirs` crate to get a proper implementation. + #![allow(deprecated)] + env::home_dir() +} + +#[cfg(test)] +mod tests { + use std::path::Path; + use super::{Gitignore, GitignoreBuilder}; + + fn gi_from_str>(root: P, s: &str) -> Gitignore { + let mut builder = GitignoreBuilder::new(root); + builder.add_str(None, s).unwrap(); + builder.build().unwrap() + } + + macro_rules! ignored { + ($name:ident, $root:expr, $gi:expr, $path:expr) => { + ignored!($name, $root, $gi, $path, false); + }; + ($name:ident, $root:expr, $gi:expr, $path:expr, $is_dir:expr) => { + #[test] + fn $name() { + let gi = gi_from_str($root, $gi); + assert!(gi.matched($path, $is_dir).is_ignore()); + } + }; + } + + macro_rules! not_ignored { + ($name:ident, $root:expr, $gi:expr, $path:expr) => { + not_ignored!($name, $root, $gi, $path, false); + }; + ($name:ident, $root:expr, $gi:expr, $path:expr, $is_dir:expr) => { + #[test] + fn $name() { + let gi = gi_from_str($root, $gi); + assert!(!gi.matched($path, $is_dir).is_ignore()); + } + }; + } + + const ROOT: &'static str = "/home/foobar/rust/rg"; + + ignored!(ig1, ROOT, "months", "months"); + ignored!(ig2, ROOT, "*.lock", "Cargo.lock"); + ignored!(ig3, ROOT, "*.rs", "src/main.rs"); + ignored!(ig4, ROOT, "src/*.rs", "src/main.rs"); + ignored!(ig5, ROOT, "/*.c", "cat-file.c"); + ignored!(ig6, ROOT, "/src/*.rs", "src/main.rs"); + ignored!(ig7, ROOT, "!src/main.rs\n*.rs", "src/main.rs"); + ignored!(ig8, ROOT, "foo/", "foo", true); + ignored!(ig9, ROOT, "**/foo", "foo"); + ignored!(ig10, ROOT, "**/foo", "src/foo"); + ignored!(ig11, ROOT, "**/foo/**", "src/foo/bar"); + ignored!(ig12, ROOT, "**/foo/**", "wat/src/foo/bar/baz"); + ignored!(ig13, ROOT, "**/foo/bar", "foo/bar"); + ignored!(ig14, ROOT, "**/foo/bar", "src/foo/bar"); + ignored!(ig15, ROOT, "abc/**", "abc/x"); + ignored!(ig16, ROOT, "abc/**", "abc/x/y"); + ignored!(ig17, ROOT, "abc/**", "abc/x/y/z"); + ignored!(ig18, ROOT, "a/**/b", "a/b"); + ignored!(ig19, ROOT, "a/**/b", "a/x/b"); + ignored!(ig20, ROOT, "a/**/b", "a/x/y/b"); + ignored!(ig21, ROOT, r"\!xy", "!xy"); + ignored!(ig22, ROOT, r"\#foo", "#foo"); + ignored!(ig23, ROOT, "foo", "./foo"); + ignored!(ig24, ROOT, "target", "grep/target"); + ignored!(ig25, ROOT, "Cargo.lock", "./tabwriter-bin/Cargo.lock"); + ignored!(ig26, ROOT, "/foo/bar/baz", "./foo/bar/baz"); + ignored!(ig27, ROOT, "foo/", "xyz/foo", true); + ignored!(ig28, "./src", "/llvm/", "./src/llvm", true); + ignored!(ig29, ROOT, "node_modules/ ", "node_modules", true); + ignored!(ig30, ROOT, "**/", "foo/bar", true); + ignored!(ig31, ROOT, "path1/*", "path1/foo"); + ignored!(ig32, ROOT, ".a/b", ".a/b"); + ignored!(ig33, "./", ".a/b", ".a/b"); + ignored!(ig34, ".", ".a/b", ".a/b"); + ignored!(ig35, "./.", ".a/b", ".a/b"); + ignored!(ig36, "././", ".a/b", ".a/b"); + ignored!(ig37, "././.", ".a/b", ".a/b"); + ignored!(ig38, ROOT, "\\[", "["); + ignored!(ig39, ROOT, "\\?", "?"); + ignored!(ig40, ROOT, "\\*", "*"); + ignored!(ig41, ROOT, "\\a", "a"); + ignored!(ig42, ROOT, "s*.rs", "sfoo.rs"); + ignored!(ig43, ROOT, "**", "foo.rs"); + ignored!(ig44, ROOT, "**/**/*", "a/foo.rs"); + + not_ignored!(ignot1, ROOT, "amonths", "months"); + not_ignored!(ignot2, ROOT, "monthsa", "months"); + not_ignored!(ignot3, ROOT, "/src/*.rs", "src/grep/src/main.rs"); + not_ignored!(ignot4, ROOT, "/*.c", "mozilla-sha1/sha1.c"); + not_ignored!(ignot5, ROOT, "/src/*.rs", "src/grep/src/main.rs"); + not_ignored!(ignot6, ROOT, "*.rs\n!src/main.rs", "src/main.rs"); + not_ignored!(ignot7, ROOT, "foo/", "foo", false); + not_ignored!(ignot8, ROOT, "**/foo/**", "wat/src/afoo/bar/baz"); + not_ignored!(ignot9, ROOT, "**/foo/**", "wat/src/fooa/bar/baz"); + not_ignored!(ignot10, ROOT, "**/foo/bar", "foo/src/bar"); + not_ignored!(ignot11, ROOT, "#foo", "#foo"); + not_ignored!(ignot12, ROOT, "\n\n\n", "foo"); + not_ignored!(ignot13, ROOT, "foo/**", "foo", true); + not_ignored!( + ignot14, "./third_party/protobuf", "m4/ltoptions.m4", + "./third_party/protobuf/csharp/src/packages/repositories.config"); + not_ignored!(ignot15, ROOT, "!/bar", "foo/bar"); + not_ignored!(ignot16, ROOT, "*\n!**/", "foo", true); + not_ignored!(ignot17, ROOT, "src/*.rs", "src/grep/src/main.rs"); + not_ignored!(ignot18, ROOT, "path1/*", "path2/path1/foo"); + not_ignored!(ignot19, ROOT, "s*.rs", "src/foo.rs"); + + fn bytes(s: &str) -> Vec { + s.to_string().into_bytes() + } + + fn path_string>(path: P) -> String { + path.as_ref().to_str().unwrap().to_string() + } + + #[test] + fn parse_excludes_file1() { + let data = bytes("[core]\nexcludesFile = /foo/bar"); + let got = super::parse_excludes_file(&data).unwrap(); + assert_eq!(path_string(got), "/foo/bar"); + } + + #[test] + fn parse_excludes_file2() { + let data = bytes("[core]\nexcludesFile = ~/foo/bar"); + let got = super::parse_excludes_file(&data).unwrap(); + assert_eq!(path_string(got), super::expand_tilde("~/foo/bar")); + } + + #[test] + fn parse_excludes_file3() { + let data = bytes("[core]\nexcludeFile = /foo/bar"); + assert!(super::parse_excludes_file(&data).is_none()); + } + + // See: https://github.com/BurntSushi/ripgrep/issues/106 + #[test] + fn regression_106() { + gi_from_str("/", " "); + } + + #[test] + fn case_insensitive() { + let gi = GitignoreBuilder::new(ROOT) + .case_insensitive(true).unwrap() + .add_str(None, "*.html").unwrap() + .build().unwrap(); + assert!(gi.matched("foo.html", false).is_ignore()); + assert!(gi.matched("foo.HTML", false).is_ignore()); + assert!(!gi.matched("foo.htm", false).is_ignore()); + assert!(!gi.matched("foo.HTM", false).is_ignore()); + } + + ignored!(cs1, ROOT, "*.html", "foo.html"); + not_ignored!(cs2, ROOT, "*.html", "foo.HTML"); + not_ignored!(cs3, ROOT, "*.html", "foo.htm"); + not_ignored!(cs4, ROOT, "*.html", "foo.HTM"); +} diff --git a/vendor/ignore/src/lib.rs b/vendor/ignore/src/lib.rs new file mode 100644 index 0000000000..61768abd84 --- /dev/null +++ b/vendor/ignore/src/lib.rs @@ -0,0 +1,505 @@ +/*! +The ignore crate provides a fast recursive directory iterator that respects +various filters such as globs, file types and `.gitignore` files. The precise +matching rules and precedence is explained in the documentation for +`WalkBuilder`. + +Secondarily, this crate exposes gitignore and file type matchers for use cases +that demand more fine-grained control. + +# Example + +This example shows the most basic usage of this crate. This code will +recursively traverse the current directory while automatically filtering out +files and directories according to ignore globs found in files like +`.ignore` and `.gitignore`: + + +```rust,no_run +use ignore::Walk; + +for result in Walk::new("./") { + // Each item yielded by the iterator is either a directory entry or an + // error, so either print the path or the error. + match result { + Ok(entry) => println!("{}", entry.path().display()), + Err(err) => println!("ERROR: {}", err), + } +} +``` + +# Example: advanced + +By default, the recursive directory iterator will ignore hidden files and +directories. This can be disabled by building the iterator with `WalkBuilder`: + +```rust,no_run +use ignore::WalkBuilder; + +for result in WalkBuilder::new("./").hidden(false).build() { + println!("{:?}", result); +} +``` + +See the documentation for `WalkBuilder` for many other options. +*/ + +#![deny(missing_docs)] + +extern crate crossbeam_channel as channel; +extern crate globset; +#[macro_use] +extern crate lazy_static; +#[macro_use] +extern crate log; +extern crate memchr; +extern crate regex; +extern crate same_file; +extern crate thread_local; +extern crate walkdir; +#[cfg(windows)] +extern crate winapi_util; + +use std::error; +use std::fmt; +use std::io; +use std::path::{Path, PathBuf}; + +pub use walk::{DirEntry, Walk, WalkBuilder, WalkParallel, WalkState}; + +mod dir; +pub mod gitignore; +mod pathutil; +pub mod overrides; +pub mod types; +mod walk; + +/// Represents an error that can occur when parsing a gitignore file. +#[derive(Debug)] +pub enum Error { + /// A collection of "soft" errors. These occur when adding an ignore + /// file partially succeeded. + Partial(Vec), + /// An error associated with a specific line number. + WithLineNumber { + /// The line number. + line: u64, + /// The underlying error. + err: Box, + }, + /// An error associated with a particular file path. + WithPath { + /// The file path. + path: PathBuf, + /// The underlying error. + err: Box, + }, + /// An error associated with a particular directory depth when recursively + /// walking a directory. + WithDepth { + /// The directory depth. + depth: usize, + /// The underlying error. + err: Box, + }, + /// An error that occurs when a file loop is detected when traversing + /// symbolic links. + Loop { + /// The ancestor file path in the loop. + ancestor: PathBuf, + /// The child file path in the loop. + child: PathBuf, + }, + /// An error that occurs when doing I/O, such as reading an ignore file. + Io(io::Error), + /// An error that occurs when trying to parse a glob. + Glob { + /// The original glob that caused this error. This glob, when + /// available, always corresponds to the glob provided by an end user. + /// e.g., It is the glob as written in a `.gitignore` file. + /// + /// (This glob may be distinct from the glob that is actually + /// compiled, after accounting for `gitignore` semantics.) + glob: Option, + /// The underlying glob error as a string. + err: String, + }, + /// A type selection for a file type that is not defined. + UnrecognizedFileType(String), + /// A user specified file type definition could not be parsed. + InvalidDefinition, +} + +impl Clone for Error { + fn clone(&self) -> Error { + match *self { + Error::Partial(ref errs) => Error::Partial(errs.clone()), + Error::WithLineNumber { line, ref err } => { + Error::WithLineNumber { line: line, err: err.clone() } + } + Error::WithPath { ref path, ref err } => { + Error::WithPath { path: path.clone(), err: err.clone() } + } + Error::WithDepth { depth, ref err } => { + Error::WithDepth { depth: depth, err: err.clone() } + } + Error::Loop { ref ancestor, ref child } => { + Error::Loop { + ancestor: ancestor.clone(), + child: child.clone() + } + } + Error::Io(ref err) => { + match err.raw_os_error() { + Some(e) => Error::Io(io::Error::from_raw_os_error(e)), + None => { + Error::Io(io::Error::new(err.kind(), err.to_string())) + } + } + } + Error::Glob { ref glob, ref err } => { + Error::Glob { glob: glob.clone(), err: err.clone() } + } + Error::UnrecognizedFileType(ref err) => { + Error::UnrecognizedFileType(err.clone()) + } + Error::InvalidDefinition => Error::InvalidDefinition, + } + } +} + +impl Error { + /// Returns true if this is a partial error. + /// + /// A partial error occurs when only some operations failed while others + /// may have succeeded. For example, an ignore file may contain an invalid + /// glob among otherwise valid globs. + pub fn is_partial(&self) -> bool { + match *self { + Error::Partial(_) => true, + Error::WithLineNumber { ref err, .. } => err.is_partial(), + Error::WithPath { ref err, .. } => err.is_partial(), + Error::WithDepth { ref err, .. } => err.is_partial(), + _ => false, + } + } + + /// Returns true if this error is exclusively an I/O error. + pub fn is_io(&self) -> bool { + match *self { + Error::Partial(ref errs) => errs.len() == 1 && errs[0].is_io(), + Error::WithLineNumber { ref err, .. } => err.is_io(), + Error::WithPath { ref err, .. } => err.is_io(), + Error::WithDepth { ref err, .. } => err.is_io(), + Error::Loop { .. } => false, + Error::Io(_) => true, + Error::Glob { .. } => false, + Error::UnrecognizedFileType(_) => false, + Error::InvalidDefinition => false, + } + } + + /// Returns a depth associated with recursively walking a directory (if + /// this error was generated from a recursive directory iterator). + pub fn depth(&self) -> Option { + match *self { + Error::WithPath { ref err, .. } => err.depth(), + Error::WithDepth { depth, .. } => Some(depth), + _ => None, + } + } + + /// Turn an error into a tagged error with the given file path. + fn with_path>(self, path: P) -> Error { + Error::WithPath { + path: path.as_ref().to_path_buf(), + err: Box::new(self), + } + } + + /// Turn an error into a tagged error with the given depth. + fn with_depth(self, depth: usize) -> Error { + Error::WithDepth { + depth: depth, + err: Box::new(self), + } + } + + /// Turn an error into a tagged error with the given file path and line + /// number. If path is empty, then it is omitted from the error. + fn tagged>(self, path: P, lineno: u64) -> Error { + let errline = Error::WithLineNumber { + line: lineno, + err: Box::new(self), + }; + if path.as_ref().as_os_str().is_empty() { + return errline; + } + errline.with_path(path) + } + + /// Build an error from a walkdir error. + fn from_walkdir(err: walkdir::Error) -> Error { + let depth = err.depth(); + if let (Some(anc), Some(child)) = (err.loop_ancestor(), err.path()) { + return Error::WithDepth { + depth: depth, + err: Box::new(Error::Loop { + ancestor: anc.to_path_buf(), + child: child.to_path_buf(), + }), + }; + } + let path = err.path().map(|p| p.to_path_buf()); + let mut ig_err = Error::Io(io::Error::from(err)); + if let Some(path) = path { + ig_err = Error::WithPath { + path: path, + err: Box::new(ig_err), + }; + } + ig_err + } +} + +impl error::Error for Error { + fn description(&self) -> &str { + match *self { + Error::Partial(_) => "partial error", + Error::WithLineNumber { ref err, .. } => err.description(), + Error::WithPath { ref err, .. } => err.description(), + Error::WithDepth { ref err, .. } => err.description(), + Error::Loop { .. } => "file system loop found", + Error::Io(ref err) => err.description(), + Error::Glob { ref err, .. } => err, + Error::UnrecognizedFileType(_) => "unrecognized file type", + Error::InvalidDefinition => "invalid definition", + } + } +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + Error::Partial(ref errs) => { + let msgs: Vec = + errs.iter().map(|err| err.to_string()).collect(); + write!(f, "{}", msgs.join("\n")) + } + Error::WithLineNumber { line, ref err } => { + write!(f, "line {}: {}", line, err) + } + Error::WithPath { ref path, ref err } => { + write!(f, "{}: {}", path.display(), err) + } + Error::WithDepth { ref err, .. } => err.fmt(f), + Error::Loop { ref ancestor, ref child } => { + write!(f, "File system loop found: \ + {} points to an ancestor {}", + child.display(), ancestor.display()) + } + Error::Io(ref err) => err.fmt(f), + Error::Glob { glob: None, ref err } => write!(f, "{}", err), + Error::Glob { glob: Some(ref glob), ref err } => { + write!(f, "error parsing glob '{}': {}", glob, err) + } + Error::UnrecognizedFileType(ref ty) => { + write!(f, "unrecognized file type: {}", ty) + } + Error::InvalidDefinition => { + write!(f, "invalid definition (format is type:glob, e.g., \ + html:*.html)") + } + } + } +} + +impl From for Error { + fn from(err: io::Error) -> Error { + Error::Io(err) + } +} + +#[derive(Debug, Default)] +struct PartialErrorBuilder(Vec); + +impl PartialErrorBuilder { + fn push(&mut self, err: Error) { + self.0.push(err); + } + + fn push_ignore_io(&mut self, err: Error) { + if !err.is_io() { + self.push(err); + } + } + + fn maybe_push(&mut self, err: Option) { + if let Some(err) = err { + self.push(err); + } + } + + fn maybe_push_ignore_io(&mut self, err: Option) { + if let Some(err) = err { + self.push_ignore_io(err); + } + } + + fn into_error_option(mut self) -> Option { + if self.0.is_empty() { + None + } else if self.0.len() == 1 { + Some(self.0.pop().unwrap()) + } else { + Some(Error::Partial(self.0)) + } + } +} + +/// The result of a glob match. +/// +/// The type parameter `T` typically refers to a type that provides more +/// information about a particular match. For example, it might identify +/// the specific gitignore file and the specific glob pattern that caused +/// the match. +#[derive(Clone, Debug)] +pub enum Match { + /// The path didn't match any glob. + None, + /// The highest precedent glob matched indicates the path should be + /// ignored. + Ignore(T), + /// The highest precedent glob matched indicates the path should be + /// whitelisted. + Whitelist(T), +} + +impl Match { + /// Returns true if the match result didn't match any globs. + pub fn is_none(&self) -> bool { + match *self { + Match::None => true, + Match::Ignore(_) | Match::Whitelist(_) => false, + } + } + + /// Returns true if the match result implies the path should be ignored. + pub fn is_ignore(&self) -> bool { + match *self { + Match::Ignore(_) => true, + Match::None | Match::Whitelist(_) => false, + } + } + + /// Returns true if the match result implies the path should be + /// whitelisted. + pub fn is_whitelist(&self) -> bool { + match *self { + Match::Whitelist(_) => true, + Match::None | Match::Ignore(_) => false, + } + } + + /// Inverts the match so that `Ignore` becomes `Whitelist` and + /// `Whitelist` becomes `Ignore`. A non-match remains the same. + pub fn invert(self) -> Match { + match self { + Match::None => Match::None, + Match::Ignore(t) => Match::Whitelist(t), + Match::Whitelist(t) => Match::Ignore(t), + } + } + + /// Return the value inside this match if it exists. + pub fn inner(&self) -> Option<&T> { + match *self { + Match::None => None, + Match::Ignore(ref t) => Some(t), + Match::Whitelist(ref t) => Some(t), + } + } + + /// Apply the given function to the value inside this match. + /// + /// If the match has no value, then return the match unchanged. + pub fn map U>(self, f: F) -> Match { + match self { + Match::None => Match::None, + Match::Ignore(t) => Match::Ignore(f(t)), + Match::Whitelist(t) => Match::Whitelist(f(t)), + } + } + + /// Return the match if it is not none. Otherwise, return other. + pub fn or(self, other: Self) -> Self { + if self.is_none() { + other + } else { + self + } + } +} + +#[cfg(test)] +mod tests { + use std::env; + use std::error; + use std::fs; + use std::path::{Path, PathBuf}; + use std::result; + + /// A convenient result type alias. + pub type Result = + result::Result>; + + macro_rules! err { + ($($tt:tt)*) => { + Box::::from(format!($($tt)*)) + } + } + + /// A simple wrapper for creating a temporary directory that is + /// automatically deleted when it's dropped. + /// + /// We use this in lieu of tempfile because tempfile brings in too many + /// dependencies. + #[derive(Debug)] + pub struct TempDir(PathBuf); + + impl Drop for TempDir { + fn drop(&mut self) { + fs::remove_dir_all(&self.0).unwrap(); + } + } + + impl TempDir { + /// Create a new empty temporary directory under the system's configured + /// temporary directory. + pub fn new() -> Result { + use std::sync::atomic::{AtomicUsize, Ordering}; + + static TRIES: usize = 100; + static COUNTER: AtomicUsize = AtomicUsize::new(0); + + let tmpdir = env::temp_dir(); + for _ in 0..TRIES { + let count = COUNTER.fetch_add(1, Ordering::SeqCst); + let path = tmpdir.join("rust-ignore").join(count.to_string()); + if path.is_dir() { + continue; + } + fs::create_dir_all(&path).map_err(|e| { + err!("failed to create {}: {}", path.display(), e) + })?; + return Ok(TempDir(path)); + } + Err(err!("failed to create temp dir after {} tries", TRIES)) + } + + /// Return the underlying path to this temporary directory. + pub fn path(&self) -> &Path { + &self.0 + } + } +} diff --git a/vendor/ignore/src/overrides.rs b/vendor/ignore/src/overrides.rs new file mode 100644 index 0000000000..08dbdac240 --- /dev/null +++ b/vendor/ignore/src/overrides.rs @@ -0,0 +1,262 @@ +/*! +The overrides module provides a way to specify a set of override globs. +This provides functionality similar to `--include` or `--exclude` in command +line tools. +*/ + +use std::path::Path; + +use gitignore::{self, Gitignore, GitignoreBuilder}; +use {Error, Match}; + +/// Glob represents a single glob in an override matcher. +/// +/// This is used to report information about the highest precedent glob +/// that matched. +/// +/// Note that not all matches necessarily correspond to a specific glob. For +/// example, if there are one or more whitelist globs and a file path doesn't +/// match any glob in the set, then the file path is considered to be ignored. +/// +/// The lifetime `'a` refers to the lifetime of the matcher that produced +/// this glob. +#[derive(Clone, Debug)] +pub struct Glob<'a>(GlobInner<'a>); + +#[derive(Clone, Debug)] +enum GlobInner<'a> { + /// No glob matched, but the file path should still be ignored. + UnmatchedIgnore, + /// A glob matched. + Matched(&'a gitignore::Glob), +} + +impl<'a> Glob<'a> { + fn unmatched() -> Glob<'a> { + Glob(GlobInner::UnmatchedIgnore) + } +} + +/// Manages a set of overrides provided explicitly by the end user. +#[derive(Clone, Debug)] +pub struct Override(Gitignore); + +impl Override { + /// Returns an empty matcher that never matches any file path. + pub fn empty() -> Override { + Override(Gitignore::empty()) + } + + /// Returns the directory of this override set. + /// + /// All matches are done relative to this path. + pub fn path(&self) -> &Path { + self.0.path() + } + + /// Returns true if and only if this matcher is empty. + /// + /// When a matcher is empty, it will never match any file path. + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + /// Returns the total number of ignore globs. + pub fn num_ignores(&self) -> u64 { + self.0.num_whitelists() + } + + /// Returns the total number of whitelisted globs. + pub fn num_whitelists(&self) -> u64 { + self.0.num_ignores() + } + + /// Returns whether the given file path matched a pattern in this override + /// matcher. + /// + /// `is_dir` should be true if the path refers to a directory and false + /// otherwise. + /// + /// If there are no overrides, then this always returns `Match::None`. + /// + /// If there is at least one whitelist override and `is_dir` is false, then + /// this never returns `Match::None`, since non-matches are interpreted as + /// ignored. + /// + /// The given path is matched to the globs relative to the path given + /// when building the override matcher. Specifically, before matching + /// `path`, its prefix (as determined by a common suffix of the directory + /// given) is stripped. If there is no common suffix/prefix overlap, then + /// `path` is assumed to reside in the same directory as the root path for + /// this set of overrides. + pub fn matched<'a, P: AsRef>( + &'a self, + path: P, + is_dir: bool, + ) -> Match> { + if self.is_empty() { + return Match::None; + } + let mat = self.0.matched(path, is_dir).invert(); + if mat.is_none() && self.num_whitelists() > 0 && !is_dir { + return Match::Ignore(Glob::unmatched()); + } + mat.map(move |giglob| Glob(GlobInner::Matched(giglob))) + } +} + +/// Builds a matcher for a set of glob overrides. +pub struct OverrideBuilder { + builder: GitignoreBuilder, +} + +impl OverrideBuilder { + /// Create a new override builder. + /// + /// Matching is done relative to the directory path provided. + pub fn new>(path: P) -> OverrideBuilder { + OverrideBuilder { + builder: GitignoreBuilder::new(path), + } + } + + /// Builds a new override matcher from the globs added so far. + /// + /// Once a matcher is built, no new globs can be added to it. + pub fn build(&self) -> Result { + Ok(Override(self.builder.build()?)) + } + + /// Add a glob to the set of overrides. + /// + /// Globs provided here have precisely the same semantics as a single + /// line in a `gitignore` file, where the meaning of `!` is inverted: + /// namely, `!` at the beginning of a glob will ignore a file. Without `!`, + /// all matches of the glob provided are treated as whitelist matches. + pub fn add(&mut self, glob: &str) -> Result<&mut OverrideBuilder, Error> { + self.builder.add_line(None, glob)?; + Ok(self) + } + + /// Toggle whether the globs should be matched case insensitively or not. + /// + /// When this option is changed, only globs added after the change will be affected. + /// + /// This is disabled by default. + pub fn case_insensitive( + &mut self, + yes: bool, + ) -> Result<&mut OverrideBuilder, Error> { + // TODO: This should not return a `Result`. Fix this in the next semver + // release. + self.builder.case_insensitive(yes)?; + Ok(self) + } +} + +#[cfg(test)] +mod tests { + use super::{Override, OverrideBuilder}; + + const ROOT: &'static str = "/home/andrew/foo"; + + fn ov(globs: &[&str]) -> Override { + let mut builder = OverrideBuilder::new(ROOT); + for glob in globs { + builder.add(glob).unwrap(); + } + builder.build().unwrap() + } + + #[test] + fn empty() { + let ov = ov(&[]); + assert!(ov.matched("a.foo", false).is_none()); + assert!(ov.matched("a", false).is_none()); + assert!(ov.matched("", false).is_none()); + } + + #[test] + fn simple() { + let ov = ov(&["*.foo", "!*.bar"]); + assert!(ov.matched("a.foo", false).is_whitelist()); + assert!(ov.matched("a.foo", true).is_whitelist()); + assert!(ov.matched("a.rs", false).is_ignore()); + assert!(ov.matched("a.rs", true).is_none()); + assert!(ov.matched("a.bar", false).is_ignore()); + assert!(ov.matched("a.bar", true).is_ignore()); + } + + #[test] + fn only_ignores() { + let ov = ov(&["!*.bar"]); + assert!(ov.matched("a.rs", false).is_none()); + assert!(ov.matched("a.rs", true).is_none()); + assert!(ov.matched("a.bar", false).is_ignore()); + assert!(ov.matched("a.bar", true).is_ignore()); + } + + #[test] + fn precedence() { + let ov = ov(&["*.foo", "!*.bar.foo"]); + assert!(ov.matched("a.foo", false).is_whitelist()); + assert!(ov.matched("a.baz", false).is_ignore()); + assert!(ov.matched("a.bar.foo", false).is_ignore()); + } + + #[test] + fn gitignore() { + let ov = ov(&["/foo", "bar/*.rs", "baz/**"]); + assert!(ov.matched("bar/lib.rs", false).is_whitelist()); + assert!(ov.matched("bar/wat/lib.rs", false).is_ignore()); + assert!(ov.matched("wat/bar/lib.rs", false).is_ignore()); + assert!(ov.matched("foo", false).is_whitelist()); + assert!(ov.matched("wat/foo", false).is_ignore()); + assert!(ov.matched("baz", false).is_ignore()); + assert!(ov.matched("baz/a", false).is_whitelist()); + assert!(ov.matched("baz/a/b", false).is_whitelist()); + } + + #[test] + fn allow_directories() { + // This tests that directories are NOT ignored when they are unmatched. + let ov = ov(&["*.rs"]); + assert!(ov.matched("foo.rs", false).is_whitelist()); + assert!(ov.matched("foo.c", false).is_ignore()); + assert!(ov.matched("foo", false).is_ignore()); + assert!(ov.matched("foo", true).is_none()); + assert!(ov.matched("src/foo.rs", false).is_whitelist()); + assert!(ov.matched("src/foo.c", false).is_ignore()); + assert!(ov.matched("src/foo", false).is_ignore()); + assert!(ov.matched("src/foo", true).is_none()); + } + + #[test] + fn absolute_path() { + let ov = ov(&["!/bar"]); + assert!(ov.matched("./foo/bar", false).is_none()); + } + + #[test] + fn case_insensitive() { + let ov = OverrideBuilder::new(ROOT) + .case_insensitive(true).unwrap() + .add("*.html").unwrap() + .build().unwrap(); + assert!(ov.matched("foo.html", false).is_whitelist()); + assert!(ov.matched("foo.HTML", false).is_whitelist()); + assert!(ov.matched("foo.htm", false).is_ignore()); + assert!(ov.matched("foo.HTM", false).is_ignore()); + } + + #[test] + fn default_case_sensitive() { + let ov = OverrideBuilder::new(ROOT) + .add("*.html").unwrap() + .build().unwrap(); + assert!(ov.matched("foo.html", false).is_whitelist()); + assert!(ov.matched("foo.HTML", false).is_ignore()); + assert!(ov.matched("foo.htm", false).is_ignore()); + assert!(ov.matched("foo.HTM", false).is_ignore()); + } +} diff --git a/vendor/ignore/src/pathutil.rs b/vendor/ignore/src/pathutil.rs new file mode 100644 index 0000000000..fbbc0f89b6 --- /dev/null +++ b/vendor/ignore/src/pathutil.rs @@ -0,0 +1,142 @@ +use std::ffi::OsStr; +use std::path::Path; + +use walk::DirEntry; + +/// Returns true if and only if this entry is considered to be hidden. +/// +/// This only returns true if the base name of the path starts with a `.`. +/// +/// On Unix, this implements a more optimized check. +#[cfg(unix)] +pub fn is_hidden(dent: &DirEntry) -> bool { + use std::os::unix::ffi::OsStrExt; + + if let Some(name) = file_name(dent.path()) { + name.as_bytes().get(0) == Some(&b'.') + } else { + false + } +} + +/// Returns true if and only if this entry is considered to be hidden. +/// +/// On Windows, this returns true if one of the following is true: +/// +/// * The base name of the path starts with a `.`. +/// * The file attributes have the `HIDDEN` property set. +#[cfg(windows)] +pub fn is_hidden(dent: &DirEntry) -> bool { + use std::os::windows::fs::MetadataExt; + use winapi_util::file; + + // This looks like we're doing an extra stat call, but on Windows, the + // directory traverser reuses the metadata retrieved from each directory + // entry and stores it on the DirEntry itself. So this is "free." + if let Ok(md) = dent.metadata() { + if file::is_hidden(md.file_attributes() as u64) { + return true; + } + } + if let Some(name) = file_name(dent.path()) { + name.to_str().map(|s| s.starts_with(".")).unwrap_or(false) + } else { + false + } +} + +/// Returns true if and only if this entry is considered to be hidden. +/// +/// This only returns true if the base name of the path starts with a `.`. +#[cfg(not(any(unix, windows)))] +pub fn is_hidden(dent: &DirEntry) -> bool { + if let Some(name) = file_name(dent.path()) { + name.to_str().map(|s| s.starts_with(".")).unwrap_or(false) + } else { + false + } +} + +/// Strip `prefix` from the `path` and return the remainder. +/// +/// If `path` doesn't have a prefix `prefix`, then return `None`. +#[cfg(unix)] +pub fn strip_prefix<'a, P: AsRef + ?Sized>( + prefix: &'a P, + path: &'a Path, +) -> Option<&'a Path> { + use std::os::unix::ffi::OsStrExt; + + let prefix = prefix.as_ref().as_os_str().as_bytes(); + let path = path.as_os_str().as_bytes(); + if prefix.len() > path.len() || prefix != &path[0..prefix.len()] { + None + } else { + Some(&Path::new(OsStr::from_bytes(&path[prefix.len()..]))) + } +} + +/// Strip `prefix` from the `path` and return the remainder. +/// +/// If `path` doesn't have a prefix `prefix`, then return `None`. +#[cfg(not(unix))] +pub fn strip_prefix<'a, P: AsRef + ?Sized>( + prefix: &'a P, + path: &'a Path, +) -> Option<&'a Path> { + path.strip_prefix(prefix).ok() +} + +/// Returns true if this file path is just a file name. i.e., Its parent is +/// the empty string. +#[cfg(unix)] +pub fn is_file_name>(path: P) -> bool { + use std::os::unix::ffi::OsStrExt; + use memchr::memchr; + + let path = path.as_ref().as_os_str().as_bytes(); + memchr(b'/', path).is_none() +} + +/// Returns true if this file path is just a file name. i.e., Its parent is +/// the empty string. +#[cfg(not(unix))] +pub fn is_file_name>(path: P) -> bool { + path.as_ref().parent().map(|p| p.as_os_str().is_empty()).unwrap_or(false) +} + +/// The final component of the path, if it is a normal file. +/// +/// If the path terminates in ., .., or consists solely of a root of prefix, +/// file_name will return None. +#[cfg(unix)] +pub fn file_name<'a, P: AsRef + ?Sized>( + path: &'a P, +) -> Option<&'a OsStr> { + use std::os::unix::ffi::OsStrExt; + use memchr::memrchr; + + let path = path.as_ref().as_os_str().as_bytes(); + if path.is_empty() { + return None; + } else if path.len() == 1 && path[0] == b'.' { + return None; + } else if path.last() == Some(&b'.') { + return None; + } else if path.len() >= 2 && &path[path.len() - 2..] == &b".."[..] { + return None; + } + let last_slash = memrchr(b'/', path).map(|i| i + 1).unwrap_or(0); + Some(OsStr::from_bytes(&path[last_slash..])) +} + +/// The final component of the path, if it is a normal file. +/// +/// If the path terminates in ., .., or consists solely of a root of prefix, +/// file_name will return None. +#[cfg(not(unix))] +pub fn file_name<'a, P: AsRef + ?Sized>( + path: &'a P, +) -> Option<&'a OsStr> { + path.as_ref().file_name() +} diff --git a/vendor/ignore/src/types.rs b/vendor/ignore/src/types.rs new file mode 100644 index 0000000000..07d68e152b --- /dev/null +++ b/vendor/ignore/src/types.rs @@ -0,0 +1,814 @@ +/*! +The types module provides a way of associating globs on file names to file +types. + +This can be used to match specific types of files. For example, among +the default file types provided, the Rust file type is defined to be `*.rs` +with name `rust`. Similarly, the C file type is defined to be `*.{c,h}` with +name `c`. + +Note that the set of default types may change over time. + +# Example + +This shows how to create and use a simple file type matcher using the default +file types defined in this crate. + +``` +use ignore::types::TypesBuilder; + +let mut builder = TypesBuilder::new(); +builder.add_defaults(); +builder.select("rust"); +let matcher = builder.build().unwrap(); + +assert!(matcher.matched("foo.rs", false).is_whitelist()); +assert!(matcher.matched("foo.c", false).is_ignore()); +``` + +# Example: negation + +This is like the previous example, but shows how negating a file type works. +That is, this will let us match file paths that *don't* correspond to a +particular file type. + +``` +use ignore::types::TypesBuilder; + +let mut builder = TypesBuilder::new(); +builder.add_defaults(); +builder.negate("c"); +let matcher = builder.build().unwrap(); + +assert!(matcher.matched("foo.rs", false).is_none()); +assert!(matcher.matched("foo.c", false).is_ignore()); +``` + +# Example: custom file type definitions + +This shows how to extend this library default file type definitions with +your own. + +``` +use ignore::types::TypesBuilder; + +let mut builder = TypesBuilder::new(); +builder.add_defaults(); +builder.add("foo", "*.foo"); +// Another way of adding a file type definition. +// This is useful when accepting input from an end user. +builder.add_def("bar:*.bar"); +// Note: we only select `foo`, not `bar`. +builder.select("foo"); +let matcher = builder.build().unwrap(); + +assert!(matcher.matched("x.foo", false).is_whitelist()); +// This is ignored because we only selected the `foo` file type. +assert!(matcher.matched("x.bar", false).is_ignore()); +``` + +We can also add file type definitions based on other definitions. + +``` +use ignore::types::TypesBuilder; + +let mut builder = TypesBuilder::new(); +builder.add_defaults(); +builder.add("foo", "*.foo"); +builder.add_def("bar:include:foo,cpp"); +builder.select("bar"); +let matcher = builder.build().unwrap(); + +assert!(matcher.matched("x.foo", false).is_whitelist()); +assert!(matcher.matched("y.cpp", false).is_whitelist()); +``` +*/ + +use std::cell::RefCell; +use std::collections::HashMap; +use std::path::Path; +use std::sync::Arc; + +use globset::{GlobBuilder, GlobSet, GlobSetBuilder}; +use regex::Regex; +use thread_local::ThreadLocal; + +use pathutil::file_name; +use {Error, Match}; + +const DEFAULT_TYPES: &'static [(&'static str, &'static [&'static str])] = &[ + ("agda", &["*.agda", "*.lagda"]), + ("ats", &["*.ats", "*.dats", "*.sats", "*.hats"]), + ("aidl", &["*.aidl"]), + ("amake", &["*.mk", "*.bp"]), + ("asciidoc", &["*.adoc", "*.asc", "*.asciidoc"]), + ("asm", &["*.asm", "*.s", "*.S"]), + ("asp", &["*.aspx", "*.aspx.cs", "*.aspx.cs", "*.ascx", "*.ascx.cs", "*.ascx.vb"]), + ("avro", &["*.avdl", "*.avpr", "*.avsc"]), + ("awk", &["*.awk"]), + ("bazel", &["*.bzl", "WORKSPACE", "BUILD", "BUILD.bazel"]), + ("bitbake", &["*.bb", "*.bbappend", "*.bbclass", "*.conf", "*.inc"]), + ("brotli", &["*.br"]), + ("buildstream", &["*.bst"]), + ("bzip2", &["*.bz2", "*.tbz2"]), + ("c", &["*.[chH]", "*.[chH].in", "*.cats"]), + ("cabal", &["*.cabal"]), + ("cbor", &["*.cbor"]), + ("ceylon", &["*.ceylon"]), + ("clojure", &["*.clj", "*.cljc", "*.cljs", "*.cljx"]), + ("cmake", &["*.cmake", "CMakeLists.txt"]), + ("coffeescript", &["*.coffee"]), + ("creole", &["*.creole"]), + ("config", &["*.cfg", "*.conf", "*.config", "*.ini"]), + ("cpp", &[ + "*.[ChH]", "*.cc", "*.[ch]pp", "*.[ch]xx", "*.hh", "*.inl", + "*.[ChH].in", "*.cc.in", "*.[ch]pp.in", "*.[ch]xx.in", "*.hh.in", + ]), + ("crystal", &["Projectfile", "*.cr"]), + ("cs", &["*.cs"]), + ("csharp", &["*.cs"]), + ("cshtml", &["*.cshtml"]), + ("css", &["*.css", "*.scss"]), + ("csv", &["*.csv"]), + ("cython", &["*.pyx", "*.pxi", "*.pxd"]), + ("dart", &["*.dart"]), + ("d", &["*.d"]), + ("dhall", &["*.dhall"]), + ("docker", &["*Dockerfile*"]), + ("edn", &["*.edn"]), + ("elisp", &["*.el"]), + ("elixir", &["*.ex", "*.eex", "*.exs"]), + ("elm", &["*.elm"]), + ("erlang", &["*.erl", "*.hrl"]), + ("fidl", &["*.fidl"]), + ("fish", &["*.fish"]), + ("fortran", &[ + "*.f", "*.F", "*.f77", "*.F77", "*.pfo", + "*.f90", "*.F90", "*.f95", "*.F95", + ]), + ("fsharp", &["*.fs", "*.fsx", "*.fsi"]), + ("gap", &["*.g", "*.gap", "*.gi", "*.gd", "*.tst"]), + ("gn", &["*.gn", "*.gni"]), + ("go", &["*.go"]), + ("gzip", &["*.gz", "*.tgz"]), + ("groovy", &["*.groovy", "*.gradle"]), + ("h", &["*.h", "*.hpp"]), + ("hbs", &["*.hbs"]), + ("haskell", &["*.hs", "*.lhs", "*.cpphs", "*.c2hs", "*.hsc"]), + ("hs", &["*.hs", "*.lhs"]), + ("html", &["*.htm", "*.html", "*.ejs"]), + ("idris", &["*.idr", "*.lidr"]), + ("java", &["*.java", "*.jsp", "*.jspx", "*.properties"]), + ("jinja", &["*.j2", "*.jinja", "*.jinja2"]), + ("js", &[ + "*.js", "*.jsx", "*.vue", + ]), + ("json", &["*.json", "composer.lock"]), + ("jsonl", &["*.jsonl"]), + ("julia", &["*.jl"]), + ("jupyter", &["*.ipynb", "*.jpynb"]), + ("jl", &["*.jl"]), + ("kotlin", &["*.kt", "*.kts"]), + ("less", &["*.less"]), + ("license", &[ + // General + "COPYING", "COPYING[.-]*", + "COPYRIGHT", "COPYRIGHT[.-]*", + "EULA", "EULA[.-]*", + "licen[cs]e", "licen[cs]e.*", + "LICEN[CS]E", "LICEN[CS]E[.-]*", "*[.-]LICEN[CS]E*", + "NOTICE", "NOTICE[.-]*", + "PATENTS", "PATENTS[.-]*", + "UNLICEN[CS]E", "UNLICEN[CS]E[.-]*", + // GPL (gpl.txt, etc.) + "agpl[.-]*", + "gpl[.-]*", + "lgpl[.-]*", + // Other license-specific (APACHE-2.0.txt, etc.) + "AGPL-*[0-9]*", + "APACHE-*[0-9]*", + "BSD-*[0-9]*", + "CC-BY-*", + "GFDL-*[0-9]*", + "GNU-*[0-9]*", + "GPL-*[0-9]*", + "LGPL-*[0-9]*", + "MIT-*[0-9]*", + "MPL-*[0-9]*", + "OFL-*[0-9]*", + ]), + ("lisp", &["*.el", "*.jl", "*.lisp", "*.lsp", "*.sc", "*.scm"]), + ("lock", &["*.lock", "package-lock.json"]), + ("log", &["*.log"]), + ("lua", &["*.lua"]), + ("lzma", &["*.lzma"]), + ("lz4", &["*.lz4"]), + ("m4", &["*.ac", "*.m4"]), + ("make", &[ + "[Gg][Nn][Uu]makefile", "[Mm]akefile", + "[Gg][Nn][Uu]makefile.am", "[Mm]akefile.am", + "[Gg][Nn][Uu]makefile.in", "[Mm]akefile.in", + "*.mk", "*.mak" + ]), + ("mako", &["*.mako", "*.mao"]), + ("markdown", &["*.markdown", "*.md", "*.mdown", "*.mkdn"]), + ("md", &["*.markdown", "*.md", "*.mdown", "*.mkdn"]), + ("man", &["*.[0-9lnpx]", "*.[0-9][cEFMmpSx]"]), + ("matlab", &["*.m"]), + ("mk", &["mkfile"]), + ("ml", &["*.ml"]), + ("msbuild", &[ + "*.csproj", "*.fsproj", "*.vcxproj", "*.proj", "*.props", "*.targets" + ]), + ("nim", &["*.nim", "*.nimf", "*.nimble", "*.nims"]), + ("nix", &["*.nix"]), + ("objc", &["*.h", "*.m"]), + ("objcpp", &["*.h", "*.mm"]), + ("ocaml", &["*.ml", "*.mli", "*.mll", "*.mly"]), + ("org", &["*.org"]), + ("pascal", &["*.pas", "*.dpr", "*.lpr", "*.pp", "*.inc"]), + ("perl", &["*.perl", "*.pl", "*.PL", "*.plh", "*.plx", "*.pm", "*.t"]), + ("pdf", &["*.pdf"]), + ("php", &["*.php", "*.php3", "*.php4", "*.php5", "*.phtml"]), + ("pod", &["*.pod"]), + ("postscript", &[".eps", ".ps"]), + ("protobuf", &["*.proto"]), + ("ps", &["*.cdxml", "*.ps1", "*.ps1xml", "*.psd1", "*.psm1"]), + ("puppet", &["*.erb", "*.pp", "*.rb"]), + ("purs", &["*.purs"]), + ("py", &["*.py"]), + ("qmake", &["*.pro", "*.pri", "*.prf"]), + ("qml", &["*.qml"]), + ("readme", &["README*", "*README"]), + ("r", &["*.R", "*.r", "*.Rmd", "*.Rnw"]), + ("rdoc", &["*.rdoc"]), + ("robot", &["*.robot"]), + ("rst", &["*.rst"]), + ("ruby", &["Gemfile", "*.gemspec", ".irbrc", "Rakefile", "*.rb"]), + ("rust", &["*.rs"]), + ("sass", &["*.sass", "*.scss"]), + ("scala", &["*.scala", "*.sbt"]), + ("sh", &[ + // Portable/misc. init files + ".login", ".logout", ".profile", "profile", + // bash-specific init files + ".bash_login", "bash_login", + ".bash_logout", "bash_logout", + ".bash_profile", "bash_profile", + ".bashrc", "bashrc", "*.bashrc", + // csh-specific init files + ".cshrc", "*.cshrc", + // ksh-specific init files + ".kshrc", "*.kshrc", + // tcsh-specific init files + ".tcshrc", + // zsh-specific init files + ".zshenv", "zshenv", + ".zlogin", "zlogin", + ".zlogout", "zlogout", + ".zprofile", "zprofile", + ".zshrc", "zshrc", + // Extensions + "*.bash", "*.csh", "*.ksh", "*.sh", "*.tcsh", "*.zsh", + ]), + ("smarty", &["*.tpl"]), + ("sml", &["*.sml", "*.sig"]), + ("soy", &["*.soy"]), + ("spark", &["*.spark"]), + ("sql", &["*.sql", "*.psql"]), + ("stylus", &["*.styl"]), + ("sv", &["*.v", "*.vg", "*.sv", "*.svh", "*.h"]), + ("svg", &["*.svg"]), + ("swift", &["*.swift"]), + ("swig", &["*.def", "*.i"]), + ("systemd", &[ + "*.automount", "*.conf", "*.device", "*.link", "*.mount", "*.path", + "*.scope", "*.service", "*.slice", "*.socket", "*.swap", "*.target", + "*.timer", + ]), + ("taskpaper", &["*.taskpaper"]), + ("tcl", &["*.tcl"]), + ("tex", &["*.tex", "*.ltx", "*.cls", "*.sty", "*.bib", "*.dtx", "*.ins"]), + ("textile", &["*.textile"]), + ("thrift", &["*.thrift"]), + ("tf", &["*.tf"]), + ("ts", &["*.ts", "*.tsx"]), + ("txt", &["*.txt"]), + ("toml", &["*.toml", "Cargo.lock"]), + ("twig", &["*.twig"]), + ("vala", &["*.vala"]), + ("vb", &["*.vb"]), + ("verilog", &["*.v", "*.vh", "*.sv", "*.svh"]), + ("vhdl", &["*.vhd", "*.vhdl"]), + ("vim", &["*.vim"]), + ("vimscript", &["*.vim"]), + ("wiki", &["*.mediawiki", "*.wiki"]), + ("webidl", &["*.idl", "*.webidl", "*.widl"]), + ("xml", &[ + "*.xml", "*.xml.dist", "*.dtd", "*.xsl", "*.xslt", "*.xsd", "*.xjb", + "*.rng", "*.sch", + ]), + ("xz", &["*.xz", "*.txz"]), + ("yacc", &["*.y"]), + ("yaml", &["*.yaml", "*.yml"]), + ("zig", &["*.zig"]), + ("zsh", &[ + ".zshenv", "zshenv", + ".zlogin", "zlogin", + ".zlogout", "zlogout", + ".zprofile", "zprofile", + ".zshrc", "zshrc", + "*.zsh", + ]), + ("zstd", &["*.zst", "*.zstd"]), +]; + +/// Glob represents a single glob in a set of file type definitions. +/// +/// There may be more than one glob for a particular file type. +/// +/// This is used to report information about the highest precedent glob +/// that matched. +/// +/// Note that not all matches necessarily correspond to a specific glob. +/// For example, if there are one or more selections and a file path doesn't +/// match any of those selections, then the file path is considered to be +/// ignored. +/// +/// The lifetime `'a` refers to the lifetime of the underlying file type +/// definition, which corresponds to the lifetime of the file type matcher. +#[derive(Clone, Debug)] +pub struct Glob<'a>(GlobInner<'a>); + +#[derive(Clone, Debug)] +enum GlobInner<'a> { + /// No glob matched, but the file path should still be ignored. + UnmatchedIgnore, + /// A glob matched. + Matched { + /// The file type definition which provided the glob. + def: &'a FileTypeDef, + /// The index of the glob that matched inside the file type definition. + which: usize, + /// Whether the selection was negated or not. + negated: bool, + } +} + +impl<'a> Glob<'a> { + fn unmatched() -> Glob<'a> { + Glob(GlobInner::UnmatchedIgnore) + } + + /// Return the file type defintion that matched, if one exists. A file type + /// definition always exists when a specific definition matches a file + /// path. + pub fn file_type_def(&self) -> Option<&FileTypeDef> { + match self { + Glob(GlobInner::UnmatchedIgnore) => None, + Glob(GlobInner::Matched { def, .. }) => { + Some(def) + }, + } + } +} + +/// A single file type definition. +/// +/// File type definitions can be retrieved in aggregate from a file type +/// matcher. File type definitions are also reported when its responsible +/// for a match. +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct FileTypeDef { + name: String, + globs: Vec, +} + +impl FileTypeDef { + /// Return the name of this file type. + pub fn name(&self) -> &str { + &self.name + } + + /// Return the globs used to recognize this file type. + pub fn globs(&self) -> &[String] { + &self.globs + } +} + +/// Types is a file type matcher. +#[derive(Clone, Debug)] +pub struct Types { + /// All of the file type definitions, sorted lexicographically by name. + defs: Vec, + /// All of the selections made by the user. + selections: Vec>, + /// Whether there is at least one Selection::Select in our selections. + /// When this is true, a Match::None is converted to Match::Ignore. + has_selected: bool, + /// A mapping from glob index in the set to two indices. The first is an + /// index into `selections` and the second is an index into the + /// corresponding file type definition's list of globs. + glob_to_selection: Vec<(usize, usize)>, + /// The set of all glob selections, used for actual matching. + set: GlobSet, + /// Temporary storage for globs that match. + matches: Arc>>>, +} + +/// Indicates the type of a selection for a particular file type. +#[derive(Clone, Debug)] +enum Selection { + Select(String, T), + Negate(String, T), +} + +impl Selection { + fn is_negated(&self) -> bool { + match *self { + Selection::Select(..) => false, + Selection::Negate(..) => true, + } + } + + fn name(&self) -> &str { + match *self { + Selection::Select(ref name, _) => name, + Selection::Negate(ref name, _) => name, + } + } + + fn map U>(self, f: F) -> Selection { + match self { + Selection::Select(name, inner) => { + Selection::Select(name, f(inner)) + } + Selection::Negate(name, inner) => { + Selection::Negate(name, f(inner)) + } + } + } + + fn inner(&self) -> &T { + match *self { + Selection::Select(_, ref inner) => inner, + Selection::Negate(_, ref inner) => inner, + } + } +} + +impl Types { + /// Creates a new file type matcher that never matches any path and + /// contains no file type definitions. + pub fn empty() -> Types { + Types { + defs: vec![], + selections: vec![], + has_selected: false, + glob_to_selection: vec![], + set: GlobSetBuilder::new().build().unwrap(), + matches: Arc::new(ThreadLocal::default()), + } + } + + /// Returns true if and only if this matcher has zero selections. + pub fn is_empty(&self) -> bool { + self.selections.is_empty() + } + + /// Returns the number of selections used in this matcher. + pub fn len(&self) -> usize { + self.selections.len() + } + + /// Return the set of current file type definitions. + /// + /// Definitions and globs are sorted. + pub fn definitions(&self) -> &[FileTypeDef] { + &self.defs + } + + /// Returns a match for the given path against this file type matcher. + /// + /// The path is considered whitelisted if it matches a selected file type. + /// The path is considered ignored if it matches a negated file type. + /// If at least one file type is selected and `path` doesn't match, then + /// the path is also considered ignored. + pub fn matched<'a, P: AsRef>( + &'a self, + path: P, + is_dir: bool, + ) -> Match> { + // File types don't apply to directories, and we can't do anything + // if our glob set is empty. + if is_dir || self.set.is_empty() { + return Match::None; + } + // We only want to match against the file name, so extract it. + // If one doesn't exist, then we can't match it. + let name = match file_name(path.as_ref()) { + Some(name) => name, + None if self.has_selected => { + return Match::Ignore(Glob::unmatched()); + } + None => { + return Match::None; + } + }; + let mut matches = self.matches.get_default().borrow_mut(); + self.set.matches_into(name, &mut *matches); + // The highest precedent match is the last one. + if let Some(&i) = matches.last() { + let (isel, iglob) = self.glob_to_selection[i]; + let sel = &self.selections[isel]; + let glob = Glob(GlobInner::Matched { + def: sel.inner(), + which: iglob, + negated: sel.is_negated(), + }); + return if sel.is_negated() { + Match::Ignore(glob) + } else { + Match::Whitelist(glob) + }; + } + if self.has_selected { + Match::Ignore(Glob::unmatched()) + } else { + Match::None + } + } +} + +/// TypesBuilder builds a type matcher from a set of file type definitions and +/// a set of file type selections. +pub struct TypesBuilder { + types: HashMap, + selections: Vec>, +} + +impl TypesBuilder { + /// Create a new builder for a file type matcher. + /// + /// The builder contains *no* type definitions to start with. A set + /// of default type definitions can be added with `add_defaults`, and + /// additional type definitions can be added with `select` and `negate`. + pub fn new() -> TypesBuilder { + TypesBuilder { + types: HashMap::new(), + selections: vec![], + } + } + + /// Build the current set of file type definitions *and* selections into + /// a file type matcher. + pub fn build(&self) -> Result { + let defs = self.definitions(); + let has_selected = self.selections.iter().any(|s| !s.is_negated()); + + let mut selections = vec![]; + let mut glob_to_selection = vec![]; + let mut build_set = GlobSetBuilder::new(); + for (isel, selection) in self.selections.iter().enumerate() { + let def = match self.types.get(selection.name()) { + Some(def) => def.clone(), + None => { + let name = selection.name().to_string(); + return Err(Error::UnrecognizedFileType(name)); + } + }; + for (iglob, glob) in def.globs.iter().enumerate() { + build_set.add( + GlobBuilder::new(glob) + .literal_separator(true) + .build() + .map_err(|err| { + Error::Glob { + glob: Some(glob.to_string()), + err: err.kind().to_string(), + } + })?); + glob_to_selection.push((isel, iglob)); + } + selections.push(selection.clone().map(move |_| def)); + } + let set = build_set.build().map_err(|err| { + Error::Glob { glob: None, err: err.to_string() } + })?; + Ok(Types { + defs: defs, + selections: selections, + has_selected: has_selected, + glob_to_selection: glob_to_selection, + set: set, + matches: Arc::new(ThreadLocal::default()), + }) + } + + /// Return the set of current file type definitions. + /// + /// Definitions and globs are sorted. + pub fn definitions(&self) -> Vec { + let mut defs = vec![]; + for def in self.types.values() { + let mut def = def.clone(); + def.globs.sort(); + defs.push(def); + } + defs.sort_by(|def1, def2| def1.name().cmp(def2.name())); + defs + } + + /// Select the file type given by `name`. + /// + /// If `name` is `all`, then all file types currently defined are selected. + pub fn select(&mut self, name: &str) -> &mut TypesBuilder { + if name == "all" { + for name in self.types.keys() { + self.selections.push(Selection::Select(name.to_string(), ())); + } + } else { + self.selections.push(Selection::Select(name.to_string(), ())); + } + self + } + + /// Ignore the file type given by `name`. + /// + /// If `name` is `all`, then all file types currently defined are negated. + pub fn negate(&mut self, name: &str) -> &mut TypesBuilder { + if name == "all" { + for name in self.types.keys() { + self.selections.push(Selection::Negate(name.to_string(), ())); + } + } else { + self.selections.push(Selection::Negate(name.to_string(), ())); + } + self + } + + /// Clear any file type definitions for the type name given. + pub fn clear(&mut self, name: &str) -> &mut TypesBuilder { + self.types.remove(name); + self + } + + /// Add a new file type definition. `name` can be arbitrary and `pat` + /// should be a glob recognizing file paths belonging to the `name` type. + /// + /// If `name` is `all` or otherwise contains any character that is not a + /// Unicode letter or number, then an error is returned. + pub fn add(&mut self, name: &str, glob: &str) -> Result<(), Error> { + lazy_static! { + static ref RE: Regex = Regex::new(r"^[\pL\pN]+$").unwrap(); + }; + if name == "all" || !RE.is_match(name) { + return Err(Error::InvalidDefinition); + } + let (key, glob) = (name.to_string(), glob.to_string()); + self.types.entry(key).or_insert_with(|| { + FileTypeDef { name: name.to_string(), globs: vec![] } + }).globs.push(glob); + Ok(()) + } + + /// Add a new file type definition specified in string form. There are two + /// valid formats: + /// 1. `{name}:{glob}`. This defines a 'root' definition that associates the + /// given name with the given glob. + /// 2. `{name}:include:{comma-separated list of already defined names}. + /// This defines an 'include' definition that associates the given name + /// with the definitions of the given existing types. + /// Names may not include any characters that are not + /// Unicode letters or numbers. + pub fn add_def(&mut self, def: &str) -> Result<(), Error> { + let parts: Vec<&str> = def.split(':').collect(); + match parts.len() { + 2 => { + let name = parts[0]; + let glob = parts[1]; + if name.is_empty() || glob.is_empty() { + return Err(Error::InvalidDefinition); + } + self.add(name, glob) + } + 3 => { + let name = parts[0]; + let types_string = parts[2]; + if name.is_empty() || parts[1] != "include" || types_string.is_empty() { + return Err(Error::InvalidDefinition); + } + let types = types_string.split(','); + // Check ahead of time to ensure that all types specified are + // present and fail fast if not. + if types.clone().any(|t| !self.types.contains_key(t)) { + return Err(Error::InvalidDefinition); + } + for type_name in types { + let globs = self.types.get(type_name).unwrap().globs.clone(); + for glob in globs { + self.add(name, &glob)?; + } + } + Ok(()) + } + _ => Err(Error::InvalidDefinition) + } + } + + /// Add a set of default file type definitions. + pub fn add_defaults(&mut self) -> &mut TypesBuilder { + static MSG: &'static str = "adding a default type should never fail"; + for &(name, exts) in DEFAULT_TYPES { + for ext in exts { + self.add(name, ext).expect(MSG); + } + } + self + } +} + +#[cfg(test)] +mod tests { + use super::TypesBuilder; + + macro_rules! matched { + ($name:ident, $types:expr, $sel:expr, $selnot:expr, + $path:expr) => { + matched!($name, $types, $sel, $selnot, $path, true); + }; + (not, $name:ident, $types:expr, $sel:expr, $selnot:expr, + $path:expr) => { + matched!($name, $types, $sel, $selnot, $path, false); + }; + ($name:ident, $types:expr, $sel:expr, $selnot:expr, + $path:expr, $matched:expr) => { + #[test] + fn $name() { + let mut btypes = TypesBuilder::new(); + for tydef in $types { + btypes.add_def(tydef).unwrap(); + } + for sel in $sel { + btypes.select(sel); + } + for selnot in $selnot { + btypes.negate(selnot); + } + let types = btypes.build().unwrap(); + let mat = types.matched($path, false); + assert_eq!($matched, !mat.is_ignore()); + } + }; + } + + fn types() -> Vec<&'static str> { + vec![ + "html:*.html", + "html:*.htm", + "rust:*.rs", + "js:*.js", + "foo:*.{rs,foo}", + "combo:include:html,rust" + ] + } + + matched!(match1, types(), vec!["rust"], vec![], "lib.rs"); + matched!(match2, types(), vec!["html"], vec![], "index.html"); + matched!(match3, types(), vec!["html"], vec![], "index.htm"); + matched!(match4, types(), vec!["html", "rust"], vec![], "main.rs"); + matched!(match5, types(), vec![], vec![], "index.html"); + matched!(match6, types(), vec![], vec!["rust"], "index.html"); + matched!(match7, types(), vec!["foo"], vec!["rust"], "main.foo"); + matched!(match8, types(), vec!["combo"], vec![], "index.html"); + matched!(match9, types(), vec!["combo"], vec![], "lib.rs"); + + matched!(not, matchnot1, types(), vec!["rust"], vec![], "index.html"); + matched!(not, matchnot2, types(), vec![], vec!["rust"], "main.rs"); + matched!(not, matchnot3, types(), vec!["foo"], vec!["rust"], "main.rs"); + matched!(not, matchnot4, types(), vec!["rust"], vec!["foo"], "main.rs"); + matched!(not, matchnot5, types(), vec!["rust"], vec!["foo"], "main.foo"); + matched!(not, matchnot6, types(), vec!["combo"], vec![], "leftpad.js"); + + #[test] + fn test_invalid_defs() { + let mut btypes = TypesBuilder::new(); + for tydef in types() { + btypes.add_def(tydef).unwrap(); + } + // Preserve the original definitions for later comparison. + let original_defs = btypes.definitions(); + let bad_defs = vec![ + // Reference to type that does not exist + "combo:include:html,python", + // Bad format + "combo:foobar:html,rust", + "" + ]; + for def in bad_defs { + assert!(btypes.add_def(def).is_err()); + // Ensure that nothing changed, even if some of the includes were valid. + assert_eq!(btypes.definitions(), original_defs); + } + } +} diff --git a/vendor/ignore/src/walk.rs b/vendor/ignore/src/walk.rs new file mode 100644 index 0000000000..b3e05f0864 --- /dev/null +++ b/vendor/ignore/src/walk.rs @@ -0,0 +1,2081 @@ +use std::cmp; +use std::ffi::OsStr; +use std::fmt; +use std::fs::{self, FileType, Metadata}; +use std::io; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; +use std::thread; +use std::time::Duration; +use std::vec; + +use channel; +use same_file::Handle; +use walkdir::{self, WalkDir}; + +use dir::{Ignore, IgnoreBuilder}; +use gitignore::GitignoreBuilder; +use overrides::Override; +use types::Types; +use {Error, PartialErrorBuilder}; + +/// A directory entry with a possible error attached. +/// +/// The error typically refers to a problem parsing ignore files in a +/// particular directory. +#[derive(Clone, Debug)] +pub struct DirEntry { + dent: DirEntryInner, + err: Option, +} + +impl DirEntry { + /// The full path that this entry represents. + pub fn path(&self) -> &Path { + self.dent.path() + } + + /// The full path that this entry represents. + /// Analogous to [`path`], but moves ownership of the path. + /// + /// [`path`]: struct.DirEntry.html#method.path + pub fn into_path(self) -> PathBuf { + self.dent.into_path() + } + + /// Whether this entry corresponds to a symbolic link or not. + pub fn path_is_symlink(&self) -> bool { + self.dent.path_is_symlink() + } + + /// Returns true if and only if this entry corresponds to stdin. + /// + /// i.e., The entry has depth 0 and its file name is `-`. + pub fn is_stdin(&self) -> bool { + self.dent.is_stdin() + } + + /// Return the metadata for the file that this entry points to. + pub fn metadata(&self) -> Result { + self.dent.metadata() + } + + /// Return the file type for the file that this entry points to. + /// + /// This entry doesn't have a file type if it corresponds to stdin. + pub fn file_type(&self) -> Option { + self.dent.file_type() + } + + /// Return the file name of this entry. + /// + /// If this entry has no file name (e.g., `/`), then the full path is + /// returned. + pub fn file_name(&self) -> &OsStr { + self.dent.file_name() + } + + /// Returns the depth at which this entry was created relative to the root. + pub fn depth(&self) -> usize { + self.dent.depth() + } + + /// Returns the underlying inode number if one exists. + /// + /// If this entry doesn't have an inode number, then `None` is returned. + #[cfg(unix)] + pub fn ino(&self) -> Option { + self.dent.ino() + } + + /// Returns an error, if one exists, associated with processing this entry. + /// + /// An example of an error is one that occurred while parsing an ignore + /// file. Errors related to traversing a directory tree itself are reported + /// as part of yielding the directory entry, and not with this method. + pub fn error(&self) -> Option<&Error> { + self.err.as_ref() + } + + /// Returns true if and only if this entry points to a directory. + pub(crate) fn is_dir(&self) -> bool { + self.dent.is_dir() + } + + fn new_stdin() -> DirEntry { + DirEntry { + dent: DirEntryInner::Stdin, + err: None, + } + } + + fn new_walkdir(dent: walkdir::DirEntry, err: Option) -> DirEntry { + DirEntry { + dent: DirEntryInner::Walkdir(dent), + err: err, + } + } + + fn new_raw(dent: DirEntryRaw, err: Option) -> DirEntry { + DirEntry { + dent: DirEntryInner::Raw(dent), + err: err, + } + } +} + +/// DirEntryInner is the implementation of DirEntry. +/// +/// It specifically represents three distinct sources of directory entries: +/// +/// 1. From the walkdir crate. +/// 2. Special entries that represent things like stdin. +/// 3. From a path. +/// +/// Specifically, (3) has to essentially re-create the DirEntry implementation +/// from WalkDir. +#[derive(Clone, Debug)] +enum DirEntryInner { + Stdin, + Walkdir(walkdir::DirEntry), + Raw(DirEntryRaw), +} + +impl DirEntryInner { + fn path(&self) -> &Path { + use self::DirEntryInner::*; + match *self { + Stdin => Path::new(""), + Walkdir(ref x) => x.path(), + Raw(ref x) => x.path(), + } + } + + fn into_path(self) -> PathBuf { + use self::DirEntryInner::*; + match self { + Stdin => PathBuf::from(""), + Walkdir(x) => x.into_path(), + Raw(x) => x.into_path(), + } + } + + fn path_is_symlink(&self) -> bool { + use self::DirEntryInner::*; + match *self { + Stdin => false, + Walkdir(ref x) => x.path_is_symlink(), + Raw(ref x) => x.path_is_symlink(), + } + } + + fn is_stdin(&self) -> bool { + match *self { + DirEntryInner::Stdin => true, + _ => false, + } + } + + fn metadata(&self) -> Result { + use self::DirEntryInner::*; + match *self { + Stdin => { + let err = Error::Io(io::Error::new( + io::ErrorKind::Other, " has no metadata")); + Err(err.with_path("")) + } + Walkdir(ref x) => { + x.metadata().map_err(|err| { + Error::Io(io::Error::from(err)).with_path(x.path()) + }) + } + Raw(ref x) => x.metadata(), + } + } + + fn file_type(&self) -> Option { + use self::DirEntryInner::*; + match *self { + Stdin => None, + Walkdir(ref x) => Some(x.file_type()), + Raw(ref x) => Some(x.file_type()), + } + } + + fn file_name(&self) -> &OsStr { + use self::DirEntryInner::*; + match *self { + Stdin => OsStr::new(""), + Walkdir(ref x) => x.file_name(), + Raw(ref x) => x.file_name(), + } + } + + fn depth(&self) -> usize { + use self::DirEntryInner::*; + match *self { + Stdin => 0, + Walkdir(ref x) => x.depth(), + Raw(ref x) => x.depth(), + } + } + + #[cfg(unix)] + fn ino(&self) -> Option { + use walkdir::DirEntryExt; + use self::DirEntryInner::*; + match *self { + Stdin => None, + Walkdir(ref x) => Some(x.ino()), + Raw(ref x) => Some(x.ino()), + } + } + + /// Returns true if and only if this entry points to a directory. + fn is_dir(&self) -> bool { + self.file_type().map(|ft| ft.is_dir()).unwrap_or(false) + } +} + +/// DirEntryRaw is essentially copied from the walkdir crate so that we can +/// build `DirEntry`s from whole cloth in the parallel iterator. +#[derive(Clone)] +struct DirEntryRaw { + /// The path as reported by the `fs::ReadDir` iterator (even if it's a + /// symbolic link). + path: PathBuf, + /// The file type. Necessary for recursive iteration, so store it. + ty: FileType, + /// Is set when this entry was created from a symbolic link and the user + /// expects the iterator to follow symbolic links. + follow_link: bool, + /// The depth at which this entry was generated relative to the root. + depth: usize, + /// The underlying inode number (Unix only). + #[cfg(unix)] + ino: u64, + /// The underlying metadata (Windows only). We store this on Windows + /// because this comes for free while reading a directory. + #[cfg(windows)] + metadata: fs::Metadata, +} + +impl fmt::Debug for DirEntryRaw { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // Leaving out FileType because it doesn't have a debug impl + // in Rust 1.9. We could add it if we really wanted to by manually + // querying each possibly file type. Meh. ---AG + f.debug_struct("DirEntryRaw") + .field("path", &self.path) + .field("follow_link", &self.follow_link) + .field("depth", &self.depth) + .finish() + } +} + +impl DirEntryRaw { + fn path(&self) -> &Path { + &self.path + } + + fn into_path(self) -> PathBuf { + self.path + } + + fn path_is_symlink(&self) -> bool { + self.ty.is_symlink() || self.follow_link + } + + fn metadata(&self) -> Result { + self.metadata_internal() + } + + #[cfg(windows)] + fn metadata_internal(&self) -> Result { + if self.follow_link { + fs::metadata(&self.path) + } else { + Ok(self.metadata.clone()) + }.map_err(|err| Error::Io(io::Error::from(err)).with_path(&self.path)) + } + + #[cfg(not(windows))] + fn metadata_internal(&self) -> Result { + if self.follow_link { + fs::metadata(&self.path) + } else { + fs::symlink_metadata(&self.path) + }.map_err(|err| Error::Io(io::Error::from(err)).with_path(&self.path)) + } + + fn file_type(&self) -> FileType { + self.ty + } + + fn file_name(&self) -> &OsStr { + self.path.file_name().unwrap_or_else(|| self.path.as_os_str()) + } + + fn depth(&self) -> usize { + self.depth + } + + #[cfg(unix)] + fn ino(&self) -> u64 { + self.ino + } + + fn from_entry( + depth: usize, + ent: &fs::DirEntry, + ) -> Result { + let ty = ent.file_type().map_err(|err| { + let err = Error::Io(io::Error::from(err)).with_path(ent.path()); + Error::WithDepth { + depth: depth, + err: Box::new(err), + } + })?; + DirEntryRaw::from_entry_os(depth, ent, ty) + } + + #[cfg(windows)] + fn from_entry_os( + depth: usize, + ent: &fs::DirEntry, + ty: fs::FileType, + ) -> Result { + let md = ent.metadata().map_err(|err| { + let err = Error::Io(io::Error::from(err)).with_path(ent.path()); + Error::WithDepth { + depth: depth, + err: Box::new(err), + } + })?; + Ok(DirEntryRaw { + path: ent.path(), + ty: ty, + follow_link: false, + depth: depth, + metadata: md, + }) + } + + #[cfg(unix)] + fn from_entry_os( + depth: usize, + ent: &fs::DirEntry, + ty: fs::FileType, + ) -> Result { + use std::os::unix::fs::DirEntryExt; + + Ok(DirEntryRaw { + path: ent.path(), + ty: ty, + follow_link: false, + depth: depth, + ino: ent.ino(), + }) + } + + // Placeholder implementation to allow compiling on non-standard platforms (e.g. wasm32). + #[cfg(not(any(windows, unix)))] + fn from_entry_os( + depth: usize, + ent: &fs::DirEntry, + ty: fs::FileType, + ) -> Result { + Err(Error::Io(io::Error::new( + io::ErrorKind::Other, "unsupported platform"))) + } + + #[cfg(windows)] + fn from_path( + depth: usize, + pb: PathBuf, + link: bool, + ) -> Result { + let md = fs::metadata(&pb).map_err(|err| { + Error::Io(err).with_path(&pb) + })?; + Ok(DirEntryRaw { + path: pb, + ty: md.file_type(), + follow_link: link, + depth: depth, + metadata: md, + }) + } + + #[cfg(unix)] + fn from_path( + depth: usize, + pb: PathBuf, + link: bool, + ) -> Result { + use std::os::unix::fs::MetadataExt; + + let md = fs::metadata(&pb).map_err(|err| { + Error::Io(err).with_path(&pb) + })?; + Ok(DirEntryRaw { + path: pb, + ty: md.file_type(), + follow_link: link, + depth: depth, + ino: md.ino(), + }) + } + + // Placeholder implementation to allow compiling on non-standard platforms (e.g. wasm32). + #[cfg(not(any(windows, unix)))] + fn from_path( + depth: usize, + pb: PathBuf, + link: bool, + ) -> Result { + Err(Error::Io(io::Error::new( + io::ErrorKind::Other, "unsupported platform"))) + } +} + +/// WalkBuilder builds a recursive directory iterator. +/// +/// The builder supports a large number of configurable options. This includes +/// specific glob overrides, file type matching, toggling whether hidden +/// files are ignored or not, and of course, support for respecting gitignore +/// files. +/// +/// By default, all ignore files found are respected. This includes `.ignore`, +/// `.gitignore`, `.git/info/exclude` and even your global gitignore +/// globs, usually found in `$XDG_CONFIG_HOME/git/ignore`. +/// +/// Some standard recursive directory options are also supported, such as +/// limiting the recursive depth or whether to follow symbolic links (disabled +/// by default). +/// +/// # Ignore rules +/// +/// There are many rules that influence whether a particular file or directory +/// is skipped by this iterator. Those rules are documented here. Note that +/// the rules assume a default configuration. +/// +/// * First, glob overrides are checked. If a path matches a glob override, +/// then matching stops. The path is then only skipped if the glob that matched +/// the path is an ignore glob. (An override glob is a whitelist glob unless it +/// starts with a `!`, in which case it is an ignore glob.) +/// * Second, ignore files are checked. Ignore files currently only come from +/// git ignore files (`.gitignore`, `.git/info/exclude` and the configured +/// global gitignore file), plain `.ignore` files, which have the same format +/// as gitignore files, or explicitly added ignore files. The precedence order +/// is: `.ignore`, `.gitignore`, `.git/info/exclude`, global gitignore and +/// finally explicitly added ignore files. Note that precedence between +/// different types of ignore files is not impacted by the directory hierarchy; +/// any `.ignore` file overrides all `.gitignore` files. Within each precedence +/// level, more nested ignore files have a higher precedence than less nested +/// ignore files. +/// * Third, if the previous step yields an ignore match, then all matching +/// is stopped and the path is skipped. If it yields a whitelist match, then +/// matching continues. A whitelist match can be overridden by a later matcher. +/// * Fourth, unless the path is a directory, the file type matcher is run on +/// the path. As above, if it yields an ignore match, then all matching is +/// stopped and the path is skipped. If it yields a whitelist match, then +/// matching continues. +/// * Fifth, if the path hasn't been whitelisted and it is hidden, then the +/// path is skipped. +/// * Sixth, unless the path is a directory, the size of the file is compared +/// against the max filesize limit. If it exceeds the limit, it is skipped. +/// * Seventh, if the path has made it this far then it is yielded in the +/// iterator. +#[derive(Clone)] +pub struct WalkBuilder { + paths: Vec, + ig_builder: IgnoreBuilder, + max_depth: Option, + max_filesize: Option, + follow_links: bool, + same_file_system: bool, + sorter: Option, + threads: usize, + skip: Option>, +} + +#[derive(Clone)] +enum Sorter { + ByName(Arc cmp::Ordering + Send + Sync + 'static>), + ByPath(Arc cmp::Ordering + Send + Sync + 'static>), +} + +impl fmt::Debug for WalkBuilder { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("WalkBuilder") + .field("paths", &self.paths) + .field("ig_builder", &self.ig_builder) + .field("max_depth", &self.max_depth) + .field("max_filesize", &self.max_filesize) + .field("follow_links", &self.follow_links) + .field("threads", &self.threads) + .field("skip", &self.skip) + .finish() + } +} + +impl WalkBuilder { + /// Create a new builder for a recursive directory iterator for the + /// directory given. + /// + /// Note that if you want to traverse multiple different directories, it + /// is better to call `add` on this builder than to create multiple + /// `Walk` values. + pub fn new>(path: P) -> WalkBuilder { + WalkBuilder { + paths: vec![path.as_ref().to_path_buf()], + ig_builder: IgnoreBuilder::new(), + max_depth: None, + max_filesize: None, + follow_links: false, + same_file_system: false, + sorter: None, + threads: 0, + skip: None, + } + } + + /// Build a new `Walk` iterator. + pub fn build(&self) -> Walk { + let follow_links = self.follow_links; + let max_depth = self.max_depth; + let sorter = self.sorter.clone(); + let its = self.paths.iter().map(move |p| { + if p == Path::new("-") { + (p.to_path_buf(), None) + } else { + let mut wd = WalkDir::new(p); + wd = wd.follow_links(follow_links || p.is_file()); + wd = wd.same_file_system(self.same_file_system); + if let Some(max_depth) = max_depth { + wd = wd.max_depth(max_depth); + } + if let Some(ref sorter) = sorter { + match sorter.clone() { + Sorter::ByName(cmp) => { + wd = wd.sort_by(move |a, b| { + cmp(a.file_name(), b.file_name()) + }); + } + Sorter::ByPath(cmp) => { + wd = wd.sort_by(move |a, b| { + cmp(a.path(), b.path()) + }); + } + } + } + (p.to_path_buf(), Some(WalkEventIter::from(wd))) + } + }).collect::>().into_iter(); + let ig_root = self.ig_builder.build(); + Walk { + its: its, + it: None, + ig_root: ig_root.clone(), + ig: ig_root.clone(), + max_filesize: self.max_filesize, + skip: self.skip.clone(), + } + } + + /// Build a new `WalkParallel` iterator. + /// + /// Note that this *doesn't* return something that implements `Iterator`. + /// Instead, the returned value must be run with a closure. e.g., + /// `builder.build_parallel().run(|| |path| println!("{:?}", path))`. + pub fn build_parallel(&self) -> WalkParallel { + WalkParallel { + paths: self.paths.clone().into_iter(), + ig_root: self.ig_builder.build(), + max_depth: self.max_depth, + max_filesize: self.max_filesize, + follow_links: self.follow_links, + same_file_system: self.same_file_system, + threads: self.threads, + skip: self.skip.clone(), + } + } + + /// Add a file path to the iterator. + /// + /// Each additional file path added is traversed recursively. This should + /// be preferred over building multiple `Walk` iterators since this + /// enables reusing resources across iteration. + pub fn add>(&mut self, path: P) -> &mut WalkBuilder { + self.paths.push(path.as_ref().to_path_buf()); + self + } + + /// The maximum depth to recurse. + /// + /// The default, `None`, imposes no depth restriction. + pub fn max_depth(&mut self, depth: Option) -> &mut WalkBuilder { + self.max_depth = depth; + self + } + + /// Whether to follow symbolic links or not. + pub fn follow_links(&mut self, yes: bool) -> &mut WalkBuilder { + self.follow_links = yes; + self + } + + /// Whether to ignore files above the specified limit. + pub fn max_filesize(&mut self, filesize: Option) -> &mut WalkBuilder { + self.max_filesize = filesize; + self + } + + /// The number of threads to use for traversal. + /// + /// Note that this only has an effect when using `build_parallel`. + /// + /// The default setting is `0`, which chooses the number of threads + /// automatically using heuristics. + pub fn threads(&mut self, n: usize) -> &mut WalkBuilder { + self.threads = n; + self + } + + /// Add a global ignore file to the matcher. + /// + /// This has lower precedence than all other sources of ignore rules. + /// + /// If there was a problem adding the ignore file, then an error is + /// returned. Note that the error may indicate *partial* failure. For + /// example, if an ignore file contains an invalid glob, all other globs + /// are still applied. + pub fn add_ignore>(&mut self, path: P) -> Option { + let mut builder = GitignoreBuilder::new(""); + let mut errs = PartialErrorBuilder::default(); + errs.maybe_push(builder.add(path)); + match builder.build() { + Ok(gi) => { self.ig_builder.add_ignore(gi); } + Err(err) => { errs.push(err); } + } + errs.into_error_option() + } + + /// Add a custom ignore file name + /// + /// These ignore files have higher precedence than all other ignore files. + /// + /// When specifying multiple names, earlier names have lower precedence than + /// later names. + pub fn add_custom_ignore_filename>( + &mut self, + file_name: S + ) -> &mut WalkBuilder { + self.ig_builder.add_custom_ignore_filename(file_name); + self + } + + /// Add an override matcher. + /// + /// By default, no override matcher is used. + /// + /// This overrides any previous setting. + pub fn overrides(&mut self, overrides: Override) -> &mut WalkBuilder { + self.ig_builder.overrides(overrides); + self + } + + /// Add a file type matcher. + /// + /// By default, no file type matcher is used. + /// + /// This overrides any previous setting. + pub fn types(&mut self, types: Types) -> &mut WalkBuilder { + self.ig_builder.types(types); + self + } + + /// Enables all the standard ignore filters. + /// + /// This toggles, as a group, all the filters that are enabled by default: + /// + /// - [hidden()](#method.hidden) + /// - [parents()](#method.parents) + /// - [ignore()](#method.ignore) + /// - [git_ignore()](#method.git_ignore) + /// - [git_global()](#method.git_global) + /// - [git_exclude()](#method.git_exclude) + /// + /// They may still be toggled individually after calling this function. + /// + /// This is (by definition) enabled by default. + pub fn standard_filters(&mut self, yes: bool) -> &mut WalkBuilder { + self.hidden(yes) + .parents(yes) + .ignore(yes) + .git_ignore(yes) + .git_global(yes) + .git_exclude(yes) + } + + /// Enables ignoring hidden files. + /// + /// This is enabled by default. + pub fn hidden(&mut self, yes: bool) -> &mut WalkBuilder { + self.ig_builder.hidden(yes); + self + } + + /// Enables reading ignore files from parent directories. + /// + /// If this is enabled, then .gitignore files in parent directories of each + /// file path given are respected. Otherwise, they are ignored. + /// + /// This is enabled by default. + pub fn parents(&mut self, yes: bool) -> &mut WalkBuilder { + self.ig_builder.parents(yes); + self + } + + /// Enables reading `.ignore` files. + /// + /// `.ignore` files have the same semantics as `gitignore` files and are + /// supported by search tools such as ripgrep and The Silver Searcher. + /// + /// This is enabled by default. + pub fn ignore(&mut self, yes: bool) -> &mut WalkBuilder { + self.ig_builder.ignore(yes); + self + } + + /// Enables reading a global gitignore file, whose path is specified in + /// git's `core.excludesFile` config option. + /// + /// Git's config file location is `$HOME/.gitconfig`. If `$HOME/.gitconfig` + /// does not exist or does not specify `core.excludesFile`, then + /// `$XDG_CONFIG_HOME/git/ignore` is read. If `$XDG_CONFIG_HOME` is not + /// set or is empty, then `$HOME/.config/git/ignore` is used instead. + /// + /// This is enabled by default. + pub fn git_global(&mut self, yes: bool) -> &mut WalkBuilder { + self.ig_builder.git_global(yes); + self + } + + /// Enables reading `.gitignore` files. + /// + /// `.gitignore` files have match semantics as described in the `gitignore` + /// man page. + /// + /// This is enabled by default. + pub fn git_ignore(&mut self, yes: bool) -> &mut WalkBuilder { + self.ig_builder.git_ignore(yes); + self + } + + /// Enables reading `.git/info/exclude` files. + /// + /// `.git/info/exclude` files have match semantics as described in the + /// `gitignore` man page. + /// + /// This is enabled by default. + pub fn git_exclude(&mut self, yes: bool) -> &mut WalkBuilder { + self.ig_builder.git_exclude(yes); + self + } + + /// Process ignore files case insensitively + /// + /// This is disabled by default. + pub fn ignore_case_insensitive(&mut self, yes: bool) -> &mut WalkBuilder { + self.ig_builder.ignore_case_insensitive(yes); + self + } + + /// Set a function for sorting directory entries by their path. + /// + /// If a compare function is set, the resulting iterator will return all + /// paths in sorted order. The compare function will be called to compare + /// entries from the same directory. + /// + /// This is like `sort_by_file_name`, except the comparator accepts + /// a `&Path` instead of the base file name, which permits it to sort by + /// more criteria. + /// + /// This method will override any previous sorter set by this method or + /// by `sort_by_file_name`. + /// + /// Note that this is not used in the parallel iterator. + pub fn sort_by_file_path( + &mut self, + cmp: F, + ) -> &mut WalkBuilder + where F: Fn(&Path, &Path) -> cmp::Ordering + Send + Sync + 'static + { + self.sorter = Some(Sorter::ByPath(Arc::new(cmp))); + self + } + + /// Set a function for sorting directory entries by file name. + /// + /// If a compare function is set, the resulting iterator will return all + /// paths in sorted order. The compare function will be called to compare + /// names from entries from the same directory using only the name of the + /// entry. + /// + /// This method will override any previous sorter set by this method or + /// by `sort_by_file_path`. + /// + /// Note that this is not used in the parallel iterator. + pub fn sort_by_file_name(&mut self, cmp: F) -> &mut WalkBuilder + where F: Fn(&OsStr, &OsStr) -> cmp::Ordering + Send + Sync + 'static + { + self.sorter = Some(Sorter::ByName(Arc::new(cmp))); + self + } + + /// Do not cross file system boundaries. + /// + /// When this option is enabled, directory traversal will not descend into + /// directories that are on a different file system from the root path. + /// + /// Currently, this option is only supported on Unix and Windows. If this + /// option is used on an unsupported platform, then directory traversal + /// will immediately return an error and will not yield any entries. + pub fn same_file_system(&mut self, yes: bool) -> &mut WalkBuilder { + self.same_file_system = yes; + self + } + + /// Do not yield directory entries that are believed to correspond to + /// stdout. + /// + /// This is useful when a command is invoked via shell redirection to a + /// file that is also being read. For example, `grep -r foo ./ > results` + /// might end up trying to search `results` even though it is also writing + /// to it, which could cause an unbounded feedback loop. Setting this + /// option prevents this from happening by skipping over the `results` + /// file. + /// + /// This is disabled by default. + pub fn skip_stdout(&mut self, yes: bool) -> &mut WalkBuilder { + if yes { + self.skip = stdout_handle().map(Arc::new); + } else { + self.skip = None; + } + self + } +} + +/// Walk is a recursive directory iterator over file paths in one or more +/// directories. +/// +/// Only file and directory paths matching the rules are returned. By default, +/// ignore files like `.gitignore` are respected. The precise matching rules +/// and precedence is explained in the documentation for `WalkBuilder`. +pub struct Walk { + its: vec::IntoIter<(PathBuf, Option)>, + it: Option, + ig_root: Ignore, + ig: Ignore, + max_filesize: Option, + skip: Option>, +} + +impl Walk { + /// Creates a new recursive directory iterator for the file path given. + /// + /// Note that this uses default settings, which include respecting + /// `.gitignore` files. To configure the iterator, use `WalkBuilder` + /// instead. + pub fn new>(path: P) -> Walk { + WalkBuilder::new(path).build() + } + + fn skip_entry(&self, ent: &DirEntry) -> Result { + if ent.depth() == 0 { + return Ok(false); + } + + if let Some(ref stdout) = self.skip { + if path_equals(ent, stdout)? { + return Ok(true); + } + } + if should_skip_entry(&self.ig, ent) { + return Ok(true); + } + if self.max_filesize.is_some() && !ent.is_dir() { + return Ok(skip_filesize( + self.max_filesize.unwrap(), + ent.path(), + &ent.metadata().ok(), + )); + } + Ok(false) + } +} + +impl Iterator for Walk { + type Item = Result; + + #[inline(always)] + fn next(&mut self) -> Option> { + loop { + let ev = match self.it.as_mut().and_then(|it| it.next()) { + Some(ev) => ev, + None => { + match self.its.next() { + None => return None, + Some((_, None)) => { + return Some(Ok(DirEntry::new_stdin())); + } + Some((path, Some(it))) => { + self.it = Some(it); + if path.is_dir() { + let (ig, err) = self.ig_root.add_parents(path); + self.ig = ig; + if let Some(err) = err { + return Some(Err(err)); + } + } else { + self.ig = self.ig_root.clone(); + } + } + } + continue; + } + }; + match ev { + Err(err) => { + return Some(Err(Error::from_walkdir(err))); + } + Ok(WalkEvent::Exit) => { + self.ig = self.ig.parent().unwrap(); + } + Ok(WalkEvent::Dir(ent)) => { + let mut ent = DirEntry::new_walkdir(ent, None); + let should_skip = match self.skip_entry(&ent) { + Err(err) => return Some(Err(err)), + Ok(should_skip) => should_skip, + }; + if should_skip { + self.it.as_mut().unwrap().it.skip_current_dir(); + // Still need to push this on the stack because + // we'll get a WalkEvent::Exit event for this dir. + // We don't care if it errors though. + let (igtmp, _) = self.ig.add_child(ent.path()); + self.ig = igtmp; + continue; + } + let (igtmp, err) = self.ig.add_child(ent.path()); + self.ig = igtmp; + ent.err = err; + return Some(Ok(ent)); + } + Ok(WalkEvent::File(ent)) => { + let ent = DirEntry::new_walkdir(ent, None); + let should_skip = match self.skip_entry(&ent) { + Err(err) => return Some(Err(err)), + Ok(should_skip) => should_skip, + }; + if should_skip { + continue; + } + return Some(Ok(ent)); + } + } + } + } +} + +/// WalkEventIter transforms a WalkDir iterator into an iterator that more +/// accurately describes the directory tree. Namely, it emits events that are +/// one of three types: directory, file or "exit." An "exit" event means that +/// the entire contents of a directory have been enumerated. +struct WalkEventIter { + depth: usize, + it: walkdir::IntoIter, + next: Option>, +} + +#[derive(Debug)] +enum WalkEvent { + Dir(walkdir::DirEntry), + File(walkdir::DirEntry), + Exit, +} + +impl From for WalkEventIter { + fn from(it: WalkDir) -> WalkEventIter { + WalkEventIter { depth: 0, it: it.into_iter(), next: None } + } +} + +impl Iterator for WalkEventIter { + type Item = walkdir::Result; + + #[inline(always)] + fn next(&mut self) -> Option> { + let dent = self.next.take().or_else(|| self.it.next()); + let depth = match dent { + None => 0, + Some(Ok(ref dent)) => dent.depth(), + Some(Err(ref err)) => err.depth(), + }; + if depth < self.depth { + self.depth -= 1; + self.next = dent; + return Some(Ok(WalkEvent::Exit)); + } + self.depth = depth; + match dent { + None => None, + Some(Err(err)) => Some(Err(err)), + Some(Ok(dent)) => { + if dent.file_type().is_dir() { + self.depth += 1; + Some(Ok(WalkEvent::Dir(dent))) + } else { + Some(Ok(WalkEvent::File(dent))) + } + } + } + } +} + +/// WalkState is used in the parallel recursive directory iterator to indicate +/// whether walking should continue as normal, skip descending into a +/// particular directory or quit the walk entirely. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum WalkState { + /// Continue walking as normal. + Continue, + /// If the directory entry given is a directory, don't descend into it. + /// In all other cases, this has no effect. + Skip, + /// Quit the entire iterator as soon as possible. + /// + /// Note that this is an inherently asynchronous action. It is possible + /// for more entries to be yielded even after instructing the iterator + /// to quit. + Quit, +} + +impl WalkState { + fn is_quit(&self) -> bool { + *self == WalkState::Quit + } +} + +/// WalkParallel is a parallel recursive directory iterator over files paths +/// in one or more directories. +/// +/// Only file and directory paths matching the rules are returned. By default, +/// ignore files like `.gitignore` are respected. The precise matching rules +/// and precedence is explained in the documentation for `WalkBuilder`. +/// +/// Unlike `Walk`, this uses multiple threads for traversing a directory. +pub struct WalkParallel { + paths: vec::IntoIter, + ig_root: Ignore, + max_filesize: Option, + max_depth: Option, + follow_links: bool, + same_file_system: bool, + threads: usize, + skip: Option>, +} + +impl WalkParallel { + /// Execute the parallel recursive directory iterator. `mkf` is called + /// for each thread used for iteration. The function produced by `mkf` + /// is then in turn called for each visited file path. + pub fn run( + self, + mut mkf: F, + ) where F: FnMut() -> Box) -> WalkState + Send + 'static> { + let mut f = mkf(); + let threads = self.threads(); + // TODO: Figure out how to use a bounded channel here. With an + // unbounded channel, the workers can run away and fill up memory + // with all of the file paths. But a bounded channel doesn't work since + // our producers are also are consumers, so they end up getting stuck. + // + // We probably need to rethink parallel traversal completely to fix + // this. The best case scenario would be finding a way to use rayon + // to do this. + let (tx, rx) = channel::unbounded(); + let mut any_work = false; + // Send the initial set of root paths to the pool of workers. + // Note that we only send directories. For files, we send to them the + // callback directly. + for path in self.paths { + let (dent, root_device) = + if path == Path::new("-") { + (DirEntry::new_stdin(), None) + } else { + let root_device = + if !self.same_file_system { + None + } else { + match device_num(&path) { + Ok(root_device) => Some(root_device), + Err(err) => { + let err = Error::Io(err).with_path(path); + if f(Err(err)).is_quit() { + return; + } + continue; + } + } + }; + match DirEntryRaw::from_path(0, path, false) { + Ok(dent) => { + (DirEntry::new_raw(dent, None), root_device) + } + Err(err) => { + if f(Err(err)).is_quit() { + return; + } + continue; + } + } + }; + tx.send(Message::Work(Work { + dent: dent, + ignore: self.ig_root.clone(), + root_device: root_device, + })).unwrap(); + any_work = true; + } + // ... but there's no need to start workers if we don't need them. + if !any_work { + return; + } + // Create the workers and then wait for them to finish. + let num_waiting = Arc::new(AtomicUsize::new(0)); + let num_quitting = Arc::new(AtomicUsize::new(0)); + let quit_now = Arc::new(AtomicBool::new(false)); + let mut handles = vec![]; + for _ in 0..threads { + let worker = Worker { + f: mkf(), + tx: tx.clone(), + rx: rx.clone(), + quit_now: quit_now.clone(), + is_waiting: false, + is_quitting: false, + num_waiting: num_waiting.clone(), + num_quitting: num_quitting.clone(), + threads: threads, + max_depth: self.max_depth, + max_filesize: self.max_filesize, + follow_links: self.follow_links, + skip: self.skip.clone(), + }; + handles.push(thread::spawn(|| worker.run())); + } + drop(tx); + drop(rx); + for handle in handles { + handle.join().unwrap(); + } + } + + fn threads(&self) -> usize { + if self.threads == 0 { + 2 + } else { + self.threads + } + } +} + +/// Message is the set of instructions that a worker knows how to process. +enum Message { + /// A work item corresponds to a directory that should be descended into. + /// Work items for entries that should be skipped or ignored should not + /// be produced. + Work(Work), + /// This instruction indicates that the worker should start quitting. + Quit, +} + +/// A unit of work for each worker to process. +/// +/// Each unit of work corresponds to a directory that should be descended +/// into. +struct Work { + /// The directory entry. + dent: DirEntry, + /// Any ignore matchers that have been built for this directory's parents. + ignore: Ignore, + /// The root device number. When present, only files with the same device + /// number should be considered. + root_device: Option, +} + +impl Work { + /// Returns true if and only if this work item is a directory. + fn is_dir(&self) -> bool { + self.dent.is_dir() + } + + /// Returns true if and only if this work item is a symlink. + fn is_symlink(&self) -> bool { + self.dent.file_type().map_or(false, |ft| ft.is_symlink()) + } + + /// Adds ignore rules for parent directories. + /// + /// Note that this only applies to entries at depth 0. On all other + /// entries, this is a no-op. + fn add_parents(&mut self) -> Option { + if self.dent.depth() > 0 { + return None; + } + // At depth 0, the path of this entry is a root path, so we can + // use it directly to add parent ignore rules. + let (ig, err) = self.ignore.add_parents(self.dent.path()); + self.ignore = ig; + err + } + + /// Reads the directory contents of this work item and adds ignore + /// rules for this directory. + /// + /// If there was a problem with reading the directory contents, then + /// an error is returned. If there was a problem reading the ignore + /// rules for this directory, then the error is attached to this + /// work item's directory entry. + fn read_dir(&mut self) -> Result { + let readdir = match fs::read_dir(self.dent.path()) { + Ok(readdir) => readdir, + Err(err) => { + let err = Error::from(err) + .with_path(self.dent.path()) + .with_depth(self.dent.depth()); + return Err(err); + } + }; + let (ig, err) = self.ignore.add_child(self.dent.path()); + self.ignore = ig; + self.dent.err = err; + Ok(readdir) + } +} + +/// A worker is responsible for descending into directories, updating the +/// ignore matchers, producing new work and invoking the caller's callback. +/// +/// Note that a worker is *both* a producer and a consumer. +struct Worker { + /// The caller's callback. + f: Box) -> WalkState + Send + 'static>, + /// The push side of our mpmc queue. + tx: channel::Sender, + /// The receive side of our mpmc queue. + rx: channel::Receiver, + /// Whether all workers should quit at the next opportunity. Note that + /// this is distinct from quitting because of exhausting the contents of + /// a directory. Instead, this is used when the caller's callback indicates + /// that the iterator should quit immediately. + quit_now: Arc, + /// Whether this worker is waiting for more work. + is_waiting: bool, + /// Whether this worker has started to quit. + is_quitting: bool, + /// The number of workers waiting for more work. + num_waiting: Arc, + /// The number of workers waiting to quit. + num_quitting: Arc, + /// The total number of workers. + threads: usize, + /// The maximum depth of directories to descend. A value of `0` means no + /// descension at all. + max_depth: Option, + /// The maximum size a searched file can be (in bytes). If a file exceeds + /// this size it will be skipped. + max_filesize: Option, + /// Whether to follow symbolic links or not. When this is enabled, loop + /// detection is performed. + follow_links: bool, + /// A file handle to skip, currently is either `None` or stdout, if it's + /// a file and it has been requested to skip files identical to stdout. + skip: Option>, +} + +impl Worker { + /// Runs this worker until there is no more work left to do. + /// + /// The worker will call the caller's callback for all entries that aren't + /// skipped by the ignore matcher. + fn run(mut self) { + while let Some(mut work) = self.get_work() { + // If the work is not a directory, then we can just execute the + // caller's callback immediately and move on. + if work.is_symlink() || !work.is_dir() { + if (self.f)(Ok(work.dent)).is_quit() { + self.quit_now(); + return; + } + continue; + } + if let Some(err) = work.add_parents() { + if (self.f)(Err(err)).is_quit() { + self.quit_now(); + return; + } + } + let readdir = match work.read_dir() { + Ok(readdir) => readdir, + Err(err) => { + if (self.f)(Err(err)).is_quit() { + self.quit_now(); + return; + } + continue; + } + }; + let descend = + if let Some(root_device) = work.root_device { + match is_same_file_system(root_device, work.dent.path()) { + Ok(true) => true, + Ok(false) => false, + Err(err) => { + if (self.f)(Err(err)).is_quit() { + self.quit_now(); + return; + } + false + } + } + } else { + true + }; + + let depth = work.dent.depth(); + match (self.f)(Ok(work.dent)) { + WalkState::Continue => {} + WalkState::Skip => continue, + WalkState::Quit => { + self.quit_now(); + return; + } + } + if !descend { + continue; + } + if self.max_depth.map_or(false, |max| depth >= max) { + continue; + } + for result in readdir { + let state = self.run_one( + &work.ignore, + depth + 1, + work.root_device, + result, + ); + if state.is_quit() { + self.quit_now(); + return; + } + } + } + } + + /// Runs the worker on a single entry from a directory iterator. + /// + /// If the entry is a path that should be ignored, then this is a no-op. + /// Otherwise, the entry is pushed on to the queue. (The actual execution + /// of the callback happens in `run`.) + /// + /// If an error occurs while reading the entry, then it is sent to the + /// caller's callback. + /// + /// `ig` is the `Ignore` matcher for the parent directory. `depth` should + /// be the depth of this entry. `result` should be the item yielded by + /// a directory iterator. + fn run_one( + &mut self, + ig: &Ignore, + depth: usize, + root_device: Option, + result: Result, + ) -> WalkState { + let fs_dent = match result { + Ok(fs_dent) => fs_dent, + Err(err) => { + return (self.f)(Err(Error::from(err).with_depth(depth))); + } + }; + let mut dent = match DirEntryRaw::from_entry(depth, &fs_dent) { + Ok(dent) => DirEntry::new_raw(dent, None), + Err(err) => { + return (self.f)(Err(err)); + } + }; + let is_symlink = dent.file_type().map_or(false, |ft| ft.is_symlink()); + if self.follow_links && is_symlink { + let path = dent.path().to_path_buf(); + dent = match DirEntryRaw::from_path(depth, path, true) { + Ok(dent) => DirEntry::new_raw(dent, None), + Err(err) => { + return (self.f)(Err(err)); + } + }; + if dent.is_dir() { + if let Err(err) = check_symlink_loop(ig, dent.path(), depth) { + return (self.f)(Err(err)); + } + } + } + if let Some(ref stdout) = self.skip { + let is_stdout = match path_equals(&dent, stdout) { + Ok(is_stdout) => is_stdout, + Err(err) => return (self.f)(Err(err)), + }; + if is_stdout { + return WalkState::Continue; + } + } + let should_skip_path = should_skip_entry(ig, &dent); + let should_skip_filesize = + if self.max_filesize.is_some() && !dent.is_dir() { + skip_filesize( + self.max_filesize.unwrap(), + dent.path(), + &dent.metadata().ok(), + ) + } else { + false + }; + + if !should_skip_path && !should_skip_filesize { + self.tx.send(Message::Work(Work { + dent: dent, + ignore: ig.clone(), + root_device: root_device, + })).unwrap(); + } + WalkState::Continue + } + + /// Returns the next directory to descend into. + /// + /// If all work has been exhausted, then this returns None. The worker + /// should then subsequently quit. + fn get_work(&mut self) -> Option { + loop { + if self.is_quit_now() { + return None; + } + match self.rx.try_recv() { + Ok(Message::Work(work)) => { + self.waiting(false); + self.quitting(false); + return Some(work); + } + Ok(Message::Quit) => { + // We can't just quit because a Message::Quit could be + // spurious. For example, it's possible to observe that + // all workers are waiting even if there's more work to + // be done. + // + // Therefore, we do a bit of a dance to wait until all + // workers have signaled that they're ready to quit before + // actually quitting. + // + // If the Quit message turns out to be spurious, then the + // loop below will break and we'll go back to looking for + // more work. + self.waiting(true); + self.quitting(true); + while !self.is_quit_now() { + let nwait = self.num_waiting(); + let nquit = self.num_quitting(); + // If the number of waiting workers dropped, then + // abort our attempt to quit. + if nwait < self.threads { + break; + } + // If all workers are in this quit loop, then we + // can stop. + if nquit == self.threads { + return None; + } + // Otherwise, spin. + } + } + Err(_) => { + self.waiting(true); + self.quitting(false); + if self.num_waiting() == self.threads { + for _ in 0..self.threads { + self.tx.send(Message::Quit).unwrap(); + } + } else { + // You're right to consider this suspicious, but it's + // a useful heuristic to permit producers to catch up + // to consumers without burning the CPU. It is also + // useful as a means to prevent burning the CPU if only + // one worker is left doing actual work. It's not + // perfect and it doesn't leave the CPU completely + // idle, but it's not clear what else we can do. :-/ + thread::sleep(Duration::from_millis(1)); + } + } + } + } + } + + /// Indicates that all workers should quit immediately. + fn quit_now(&self) { + self.quit_now.store(true, Ordering::SeqCst); + } + + /// Returns true if this worker should quit immediately. + fn is_quit_now(&self) -> bool { + self.quit_now.load(Ordering::SeqCst) + } + + /// Returns the total number of workers waiting for work. + fn num_waiting(&self) -> usize { + self.num_waiting.load(Ordering::SeqCst) + } + + /// Returns the total number of workers ready to quit. + fn num_quitting(&self) -> usize { + self.num_quitting.load(Ordering::SeqCst) + } + + /// Sets this worker's "quitting" state to the value of `yes`. + fn quitting(&mut self, yes: bool) { + if yes { + if !self.is_quitting { + self.is_quitting = true; + self.num_quitting.fetch_add(1, Ordering::SeqCst); + } + } else { + if self.is_quitting { + self.is_quitting = false; + self.num_quitting.fetch_sub(1, Ordering::SeqCst); + } + } + } + + /// Sets this worker's "waiting" state to the value of `yes`. + fn waiting(&mut self, yes: bool) { + if yes { + if !self.is_waiting { + self.is_waiting = true; + self.num_waiting.fetch_add(1, Ordering::SeqCst); + } + } else { + if self.is_waiting { + self.is_waiting = false; + self.num_waiting.fetch_sub(1, Ordering::SeqCst); + } + } + } +} + +fn check_symlink_loop( + ig_parent: &Ignore, + child_path: &Path, + child_depth: usize, +) -> Result<(), Error> { + let hchild = Handle::from_path(child_path).map_err(|err| { + Error::from(err).with_path(child_path).with_depth(child_depth) + })?; + for ig in ig_parent.parents().take_while(|ig| !ig.is_absolute_parent()) { + let h = Handle::from_path(ig.path()).map_err(|err| { + Error::from(err).with_path(child_path).with_depth(child_depth) + })?; + if hchild == h { + return Err(Error::Loop { + ancestor: ig.path().to_path_buf(), + child: child_path.to_path_buf(), + }.with_depth(child_depth)); + } + } + Ok(()) +} + +// Before calling this function, make sure that you ensure that is really +// necessary as the arguments imply a file stat. +fn skip_filesize( + max_filesize: u64, + path: &Path, + ent: &Option +) -> bool { + let filesize = match *ent { + Some(ref md) => Some(md.len()), + None => None + }; + + if let Some(fs) = filesize { + if fs > max_filesize { + debug!("ignoring {}: {} bytes", path.display(), fs); + true + } else { + false + } + } else { + false + } +} + +fn should_skip_entry( + ig: &Ignore, + dent: &DirEntry, +) -> bool { + let m = ig.matched_dir_entry(dent); + if m.is_ignore() { + debug!("ignoring {}: {:?}", dent.path().display(), m); + true + } else if m.is_whitelist() { + debug!("whitelisting {}: {:?}", dent.path().display(), m); + false + } else { + false + } +} + +/// Returns a handle to stdout for filtering search. +/// +/// A handle is returned if and only if stdout is being redirected to a file. +/// The handle returned corresponds to that file. +/// +/// This can be used to ensure that we do not attempt to search a file that we +/// may also be writing to. +fn stdout_handle() -> Option { + let h = match Handle::stdout() { + Err(_) => return None, + Ok(h) => h, + }; + let md = match h.as_file().metadata() { + Err(_) => return None, + Ok(md) => md, + }; + if !md.is_file() { + return None; + } + Some(h) +} + +/// Returns true if and only if the given directory entry is believed to be +/// equivalent to the given handle. If there was a problem querying the path +/// for information to determine equality, then that error is returned. +fn path_equals(dent: &DirEntry, handle: &Handle) -> Result { + #[cfg(unix)] + fn never_equal(dent: &DirEntry, handle: &Handle) -> bool { + dent.ino() != Some(handle.ino()) + } + + #[cfg(not(unix))] + fn never_equal(_: &DirEntry, _: &Handle) -> bool { + false + } + + // If we know for sure that these two things aren't equal, then avoid + // the costly extra stat call to determine equality. + if dent.is_stdin() || never_equal(dent, handle) { + return Ok(false); + } + Handle::from_path(dent.path()) + .map(|h| &h == handle) + .map_err(|err| Error::Io(err).with_path(dent.path())) +} + +/// Returns true if and only if the given path is on the same device as the +/// given root device. +fn is_same_file_system(root_device: u64, path: &Path) -> Result { + let dent_device = device_num(path) + .map_err(|err| Error::Io(err).with_path(path))?; + Ok(root_device == dent_device) +} + +#[cfg(unix)] +fn device_num>(path: P)-> io::Result { + use std::os::unix::fs::MetadataExt; + + path.as_ref().metadata().map(|md| md.dev()) +} + + #[cfg(windows)] +fn device_num>(path: P) -> io::Result { + use winapi_util::{Handle, file}; + + let h = Handle::from_path_any(path)?; + file::information(h).map(|info| info.volume_serial_number()) +} + +#[cfg(not(any(unix, windows)))] +fn device_num>(_: P)-> io::Result { + Err(io::Error::new( + io::ErrorKind::Other, + "walkdir: same_file_system option not supported on this platform", + )) +} + +#[cfg(test)] +mod tests { + use std::fs::{self, File}; + use std::io::Write; + use std::path::Path; + use std::sync::{Arc, Mutex}; + + use tests::TempDir; + use super::{DirEntry, WalkBuilder, WalkState}; + + fn wfile>(path: P, contents: &str) { + let mut file = File::create(path).unwrap(); + file.write_all(contents.as_bytes()).unwrap(); + } + + fn wfile_size>(path: P, size: u64) { + let file = File::create(path).unwrap(); + file.set_len(size).unwrap(); + } + + #[cfg(unix)] + fn symlink, Q: AsRef>(src: P, dst: Q) { + use std::os::unix::fs::symlink; + symlink(src, dst).unwrap(); + } + + fn mkdirp>(path: P) { + fs::create_dir_all(path).unwrap(); + } + + fn normal_path(unix: &str) -> String { + if cfg!(windows) { + unix.replace("\\", "/") + } else { + unix.to_string() + } + } + + fn walk_collect(prefix: &Path, builder: &WalkBuilder) -> Vec { + let mut paths = vec![]; + for result in builder.build() { + let dent = match result { + Err(_) => continue, + Ok(dent) => dent, + }; + let path = dent.path().strip_prefix(prefix).unwrap(); + if path.as_os_str().is_empty() { + continue; + } + paths.push(normal_path(path.to_str().unwrap())); + } + paths.sort(); + paths + } + + fn walk_collect_parallel( + prefix: &Path, + builder: &WalkBuilder, + ) -> Vec { + let mut paths = vec![]; + for dent in walk_collect_entries_parallel(builder) { + let path = dent.path().strip_prefix(prefix).unwrap(); + if path.as_os_str().is_empty() { + continue; + } + paths.push(normal_path(path.to_str().unwrap())); + } + paths.sort(); + paths + } + + fn walk_collect_entries_parallel(builder: &WalkBuilder) -> Vec { + let dents = Arc::new(Mutex::new(vec![])); + builder.build_parallel().run(|| { + let dents = dents.clone(); + Box::new(move |result| { + if let Ok(dent) = result { + dents.lock().unwrap().push(dent); + } + WalkState::Continue + }) + }); + + let dents = dents.lock().unwrap(); + dents.to_vec() + } + + fn mkpaths(paths: &[&str]) -> Vec { + let mut paths: Vec<_> = paths.iter().map(|s| s.to_string()).collect(); + paths.sort(); + paths + } + + fn tmpdir(prefix: &str) -> TempDir { + TempDir::new().unwrap() + } + + fn assert_paths( + prefix: &Path, + builder: &WalkBuilder, + expected: &[&str], + ) { + let got = walk_collect(prefix, builder); + assert_eq!(got, mkpaths(expected), "single threaded"); + let got = walk_collect_parallel(prefix, builder); + assert_eq!(got, mkpaths(expected), "parallel"); + } + + #[test] + fn no_ignores() { + let td = tmpdir("walk-test-"); + mkdirp(td.path().join("a/b/c")); + mkdirp(td.path().join("x/y")); + wfile(td.path().join("a/b/foo"), ""); + wfile(td.path().join("x/y/foo"), ""); + + assert_paths(td.path(), &WalkBuilder::new(td.path()), &[ + "x", "x/y", "x/y/foo", "a", "a/b", "a/b/foo", "a/b/c", + ]); + } + + #[test] + fn custom_ignore() { + let td = tmpdir("walk-test-"); + let custom_ignore = ".customignore"; + mkdirp(td.path().join("a")); + wfile(td.path().join(custom_ignore), "foo"); + wfile(td.path().join("foo"), ""); + wfile(td.path().join("a/foo"), ""); + wfile(td.path().join("bar"), ""); + wfile(td.path().join("a/bar"), ""); + + let mut builder = WalkBuilder::new(td.path()); + builder.add_custom_ignore_filename(&custom_ignore); + assert_paths(td.path(), &builder, &["bar", "a", "a/bar"]); + } + + #[test] + fn custom_ignore_exclusive_use() { + let td = tmpdir("walk-test-"); + let custom_ignore = ".customignore"; + mkdirp(td.path().join("a")); + wfile(td.path().join(custom_ignore), "foo"); + wfile(td.path().join("foo"), ""); + wfile(td.path().join("a/foo"), ""); + wfile(td.path().join("bar"), ""); + wfile(td.path().join("a/bar"), ""); + + let mut builder = WalkBuilder::new(td.path()); + builder.ignore(false); + builder.git_ignore(false); + builder.git_global(false); + builder.git_exclude(false); + builder.add_custom_ignore_filename(&custom_ignore); + assert_paths(td.path(), &builder, &["bar", "a", "a/bar"]); + } + + #[test] + fn gitignore() { + let td = tmpdir("walk-test-"); + mkdirp(td.path().join(".git")); + mkdirp(td.path().join("a")); + wfile(td.path().join(".gitignore"), "foo"); + wfile(td.path().join("foo"), ""); + wfile(td.path().join("a/foo"), ""); + wfile(td.path().join("bar"), ""); + wfile(td.path().join("a/bar"), ""); + + assert_paths(td.path(), &WalkBuilder::new(td.path()), &[ + "bar", "a", "a/bar", + ]); + } + + #[test] + fn explicit_ignore() { + let td = tmpdir("walk-test-"); + let igpath = td.path().join(".not-an-ignore"); + mkdirp(td.path().join("a")); + wfile(&igpath, "foo"); + wfile(td.path().join("foo"), ""); + wfile(td.path().join("a/foo"), ""); + wfile(td.path().join("bar"), ""); + wfile(td.path().join("a/bar"), ""); + + let mut builder = WalkBuilder::new(td.path()); + assert!(builder.add_ignore(&igpath).is_none()); + assert_paths(td.path(), &builder, &["bar", "a", "a/bar"]); + } + + #[test] + fn explicit_ignore_exclusive_use() { + let td = tmpdir("walk-test-"); + let igpath = td.path().join(".not-an-ignore"); + mkdirp(td.path().join("a")); + wfile(&igpath, "foo"); + wfile(td.path().join("foo"), ""); + wfile(td.path().join("a/foo"), ""); + wfile(td.path().join("bar"), ""); + wfile(td.path().join("a/bar"), ""); + + let mut builder = WalkBuilder::new(td.path()); + builder.standard_filters(false); + assert!(builder.add_ignore(&igpath).is_none()); + assert_paths(td.path(), &builder, + &[".not-an-ignore", "bar", "a", "a/bar"]); + } + + #[test] + fn gitignore_parent() { + let td = tmpdir("walk-test-"); + mkdirp(td.path().join(".git")); + mkdirp(td.path().join("a")); + wfile(td.path().join(".gitignore"), "foo"); + wfile(td.path().join("a/foo"), ""); + wfile(td.path().join("a/bar"), ""); + + let root = td.path().join("a"); + assert_paths(&root, &WalkBuilder::new(&root), &["bar"]); + } + + #[test] + fn max_depth() { + let td = tmpdir("walk-test-"); + mkdirp(td.path().join("a/b/c")); + wfile(td.path().join("foo"), ""); + wfile(td.path().join("a/foo"), ""); + wfile(td.path().join("a/b/foo"), ""); + wfile(td.path().join("a/b/c/foo"), ""); + + let mut builder = WalkBuilder::new(td.path()); + assert_paths(td.path(), &builder, &[ + "a", "a/b", "a/b/c", "foo", "a/foo", "a/b/foo", "a/b/c/foo", + ]); + assert_paths(td.path(), builder.max_depth(Some(0)), &[]); + assert_paths(td.path(), builder.max_depth(Some(1)), &["a", "foo"]); + assert_paths(td.path(), builder.max_depth(Some(2)), &[ + "a", "a/b", "foo", "a/foo", + ]); + } + + #[test] + fn max_filesize() { + let td = tmpdir("walk-test-"); + mkdirp(td.path().join("a/b")); + wfile_size(td.path().join("foo"), 0); + wfile_size(td.path().join("bar"), 400); + wfile_size(td.path().join("baz"), 600); + wfile_size(td.path().join("a/foo"), 600); + wfile_size(td.path().join("a/bar"), 500); + wfile_size(td.path().join("a/baz"), 200); + + let mut builder = WalkBuilder::new(td.path()); + assert_paths(td.path(), &builder, &[ + "a", "a/b", "foo", "bar", "baz", "a/foo", "a/bar", "a/baz", + ]); + assert_paths(td.path(), builder.max_filesize(Some(0)), &[ + "a", "a/b", "foo" + ]); + assert_paths(td.path(), builder.max_filesize(Some(500)), &[ + "a", "a/b", "foo", "bar", "a/bar", "a/baz" + ]); + assert_paths(td.path(), builder.max_filesize(Some(50000)), &[ + "a", "a/b", "foo", "bar", "baz", "a/foo", "a/bar", "a/baz", + ]); + } + + #[cfg(unix)] // because symlinks on windows are weird + #[test] + fn symlinks() { + let td = tmpdir("walk-test-"); + mkdirp(td.path().join("a/b")); + symlink(td.path().join("a/b"), td.path().join("z")); + wfile(td.path().join("a/b/foo"), ""); + + let mut builder = WalkBuilder::new(td.path()); + assert_paths(td.path(), &builder, &[ + "a", "a/b", "a/b/foo", "z", + ]); + assert_paths(td.path(), &builder.follow_links(true), &[ + "a", "a/b", "a/b/foo", "z", "z/foo", + ]); + } + + #[cfg(unix)] // because symlinks on windows are weird + #[test] + fn first_path_not_symlink() { + let td = tmpdir("walk-test-"); + mkdirp(td.path().join("foo")); + + let dents = WalkBuilder::new(td.path().join("foo")) + .build() + .into_iter() + .collect::, _>>() + .unwrap(); + assert_eq!(1, dents.len()); + assert!(!dents[0].path_is_symlink()); + + let dents = walk_collect_entries_parallel( + &WalkBuilder::new(td.path().join("foo")), + ); + assert_eq!(1, dents.len()); + assert!(!dents[0].path_is_symlink()); + } + + #[cfg(unix)] // because symlinks on windows are weird + #[test] + fn symlink_loop() { + let td = tmpdir("walk-test-"); + mkdirp(td.path().join("a/b")); + symlink(td.path().join("a"), td.path().join("a/b/c")); + + let mut builder = WalkBuilder::new(td.path()); + assert_paths(td.path(), &builder, &[ + "a", "a/b", "a/b/c", + ]); + assert_paths(td.path(), &builder.follow_links(true), &[ + "a", "a/b", + ]); + } + + // It's a little tricky to test the 'same_file_system' option since + // we need an environment with more than one file system. We adopt a + // heuristic where /sys is typically a distinct volume on Linux and roll + // with that. + #[test] + #[cfg(target_os = "linux")] + fn same_file_system() { + use super::device_num; + + // If for some reason /sys doesn't exist or isn't a directory, just + // skip this test. + if !Path::new("/sys").is_dir() { + return; + } + + // If our test directory actually isn't a different volume from /sys, + // then this test is meaningless and we shouldn't run it. + let td = tmpdir("walk-test-"); + if device_num(td.path()).unwrap() == device_num("/sys").unwrap() { + return; + } + + mkdirp(td.path().join("same_file")); + symlink("/sys", td.path().join("same_file").join("alink")); + + // Create a symlink to sys and enable following symlinks. If the + // same_file_system option doesn't work, then this probably will hit a + // permission error. Otherwise, it should just skip over the symlink + // completely. + let mut builder = WalkBuilder::new(td.path()); + builder.follow_links(true).same_file_system(true); + assert_paths(td.path(), &builder, &[ + "same_file", "same_file/alink", + ]); + } +} diff --git a/vendor/ignore/tests/gitignore_matched_path_or_any_parents_tests.gitignore b/vendor/ignore/tests/gitignore_matched_path_or_any_parents_tests.gitignore new file mode 100644 index 0000000000..ac09e12f7a --- /dev/null +++ b/vendor/ignore/tests/gitignore_matched_path_or_any_parents_tests.gitignore @@ -0,0 +1,216 @@ +# Based on https://github.com/behnam/gitignore-test/blob/master/.gitignore + +### file in root + +# MATCH /file_root_1 +file_root_00 + +# NO_MATCH +file_root_01/ + +# NO_MATCH +file_root_02/* + +# NO_MATCH +file_root_03/** + + +# MATCH /file_root_10 +/file_root_10 + +# NO_MATCH +/file_root_11/ + +# NO_MATCH +/file_root_12/* + +# NO_MATCH +/file_root_13/** + + +# NO_MATCH +*/file_root_20 + +# NO_MATCH +*/file_root_21/ + +# NO_MATCH +*/file_root_22/* + +# NO_MATCH +*/file_root_23/** + + +# MATCH /file_root_30 +**/file_root_30 + +# NO_MATCH +**/file_root_31/ + +# NO_MATCH +**/file_root_32/* + +# NO_MATCH +**/file_root_33/** + + +### file in sub-dir + +# MATCH /parent_dir/file_deep_1 +file_deep_00 + +# NO_MATCH +file_deep_01/ + +# NO_MATCH +file_deep_02/* + +# NO_MATCH +file_deep_03/** + + +# NO_MATCH +/file_deep_10 + +# NO_MATCH +/file_deep_11/ + +# NO_MATCH +/file_deep_12/* + +# NO_MATCH +/file_deep_13/** + + +# MATCH /parent_dir/file_deep_20 +*/file_deep_20 + +# NO_MATCH +*/file_deep_21/ + +# NO_MATCH +*/file_deep_22/* + +# NO_MATCH +*/file_deep_23/** + + +# MATCH /parent_dir/file_deep_30 +**/file_deep_30 + +# NO_MATCH +**/file_deep_31/ + +# NO_MATCH +**/file_deep_32/* + +# NO_MATCH +**/file_deep_33/** + + +### dir in root + +# MATCH /dir_root_00 +dir_root_00 + +# MATCH /dir_root_01 +dir_root_01/ + +# MATCH /dir_root_02 +dir_root_02/* + +# MATCH /dir_root_03 +dir_root_03/** + + +# MATCH /dir_root_10 +/dir_root_10 + +# MATCH /dir_root_11 +/dir_root_11/ + +# MATCH /dir_root_12 +/dir_root_12/* + +# MATCH /dir_root_13 +/dir_root_13/** + + +# NO_MATCH +*/dir_root_20 + +# NO_MATCH +*/dir_root_21/ + +# NO_MATCH +*/dir_root_22/* + +# NO_MATCH +*/dir_root_23/** + + +# MATCH /dir_root_30 +**/dir_root_30 + +# MATCH /dir_root_31 +**/dir_root_31/ + +# MATCH /dir_root_32 +**/dir_root_32/* + +# MATCH /dir_root_33 +**/dir_root_33/** + + +### dir in sub-dir + +# MATCH /parent_dir/dir_deep_00 +dir_deep_00 + +# MATCH /parent_dir/dir_deep_01 +dir_deep_01/ + +# NO_MATCH +dir_deep_02/* + +# NO_MATCH +dir_deep_03/** + + +# NO_MATCH +/dir_deep_10 + +# NO_MATCH +/dir_deep_11/ + +# NO_MATCH +/dir_deep_12/* + +# NO_MATCH +/dir_deep_13/** + + +# MATCH /parent_dir/dir_deep_20 +*/dir_deep_20 + +# MATCH /parent_dir/dir_deep_21 +*/dir_deep_21/ + +# MATCH /parent_dir/dir_deep_22 +*/dir_deep_22/* + +# MATCH /parent_dir/dir_deep_23 +*/dir_deep_23/** + + +# MATCH /parent_dir/dir_deep_30 +**/dir_deep_30 + +# MATCH /parent_dir/dir_deep_31 +**/dir_deep_31/ + +# MATCH /parent_dir/dir_deep_32 +**/dir_deep_32/* + +# MATCH /parent_dir/dir_deep_33 +**/dir_deep_33/** diff --git a/vendor/ignore/tests/gitignore_matched_path_or_any_parents_tests.rs b/vendor/ignore/tests/gitignore_matched_path_or_any_parents_tests.rs new file mode 100644 index 0000000000..28d8e2f840 --- /dev/null +++ b/vendor/ignore/tests/gitignore_matched_path_or_any_parents_tests.rs @@ -0,0 +1,323 @@ +extern crate ignore; + +use std::path::Path; + +use ignore::gitignore::{Gitignore, GitignoreBuilder}; + +const IGNORE_FILE: &'static str = + "tests/gitignore_matched_path_or_any_parents_tests.gitignore"; + +fn get_gitignore() -> Gitignore { + let mut builder = GitignoreBuilder::new("ROOT"); + let error = builder.add(IGNORE_FILE); + assert!(error.is_none(), "failed to open gitignore file"); + builder.build().unwrap() +} + +#[test] +#[should_panic(expected = "path is expected to be under the root")] +fn test_path_should_be_under_root() { + let gitignore = get_gitignore(); + let path = "/tmp/some_file"; + gitignore.matched_path_or_any_parents(Path::new(path), false); + assert!(false); +} + +#[test] +fn test_files_in_root() { + let gitignore = get_gitignore(); + let m = |path: &str| { + gitignore.matched_path_or_any_parents(Path::new(path), false) + }; + + // 0x + assert!(m("ROOT/file_root_00").is_ignore()); + assert!(m("ROOT/file_root_01").is_none()); + assert!(m("ROOT/file_root_02").is_none()); + assert!(m("ROOT/file_root_03").is_none()); + + // 1x + assert!(m("ROOT/file_root_10").is_ignore()); + assert!(m("ROOT/file_root_11").is_none()); + assert!(m("ROOT/file_root_12").is_none()); + assert!(m("ROOT/file_root_13").is_none()); + + // 2x + assert!(m("ROOT/file_root_20").is_none()); + assert!(m("ROOT/file_root_21").is_none()); + assert!(m("ROOT/file_root_22").is_none()); + assert!(m("ROOT/file_root_23").is_none()); + + // 3x + assert!(m("ROOT/file_root_30").is_ignore()); + assert!(m("ROOT/file_root_31").is_none()); + assert!(m("ROOT/file_root_32").is_none()); + assert!(m("ROOT/file_root_33").is_none()); +} + + +#[test] +fn test_files_in_deep() { + let gitignore = get_gitignore(); + let m = |path: &str| { + gitignore.matched_path_or_any_parents(Path::new(path), false) + }; + + // 0x + assert!(m("ROOT/parent_dir/file_deep_00").is_ignore()); + assert!(m("ROOT/parent_dir/file_deep_01").is_none()); + assert!(m("ROOT/parent_dir/file_deep_02").is_none()); + assert!(m("ROOT/parent_dir/file_deep_03").is_none()); + + // 1x + assert!(m("ROOT/parent_dir/file_deep_10").is_none()); + assert!(m("ROOT/parent_dir/file_deep_11").is_none()); + assert!(m("ROOT/parent_dir/file_deep_12").is_none()); + assert!(m("ROOT/parent_dir/file_deep_13").is_none()); + + // 2x + assert!(m("ROOT/parent_dir/file_deep_20").is_ignore()); + assert!(m("ROOT/parent_dir/file_deep_21").is_none()); + assert!(m("ROOT/parent_dir/file_deep_22").is_none()); + assert!(m("ROOT/parent_dir/file_deep_23").is_none()); + + // 3x + assert!(m("ROOT/parent_dir/file_deep_30").is_ignore()); + assert!(m("ROOT/parent_dir/file_deep_31").is_none()); + assert!(m("ROOT/parent_dir/file_deep_32").is_none()); + assert!(m("ROOT/parent_dir/file_deep_33").is_none()); +} + + +#[test] +fn test_dirs_in_root() { + let gitignore = get_gitignore(); + let m = |path: &str, is_dir: bool| { + gitignore.matched_path_or_any_parents(Path::new(path), is_dir) + }; + + // 00 + assert!(m("ROOT/dir_root_00", true).is_ignore()); + assert!(m("ROOT/dir_root_00/file", false).is_ignore()); + assert!(m("ROOT/dir_root_00/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_00/child_dir/file", false).is_ignore()); + + // 01 + assert!(m("ROOT/dir_root_01", true).is_ignore()); + assert!(m("ROOT/dir_root_01/file", false).is_ignore()); + assert!(m("ROOT/dir_root_01/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_01/child_dir/file", false).is_ignore()); + + // 02 + assert!(m("ROOT/dir_root_02", true).is_none()); // dir itself doesn't match + assert!(m("ROOT/dir_root_02/file", false).is_ignore()); + assert!(m("ROOT/dir_root_02/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_02/child_dir/file", false).is_ignore()); + + // 03 + assert!(m("ROOT/dir_root_03", true).is_none()); // dir itself doesn't match + assert!(m("ROOT/dir_root_03/file", false).is_ignore()); + assert!(m("ROOT/dir_root_03/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_03/child_dir/file", false).is_ignore()); + + // 10 + assert!(m("ROOT/dir_root_10", true).is_ignore()); + assert!(m("ROOT/dir_root_10/file", false).is_ignore()); + assert!(m("ROOT/dir_root_10/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_10/child_dir/file", false).is_ignore()); + + // 11 + assert!(m("ROOT/dir_root_11", true).is_ignore()); + assert!(m("ROOT/dir_root_11/file", false).is_ignore()); + assert!(m("ROOT/dir_root_11/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_11/child_dir/file", false).is_ignore()); + + // 12 + assert!(m("ROOT/dir_root_12", true).is_none()); // dir itself doesn't match + assert!(m("ROOT/dir_root_12/file", false).is_ignore()); + assert!(m("ROOT/dir_root_12/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_12/child_dir/file", false).is_ignore()); + + // 13 + assert!(m("ROOT/dir_root_13", true).is_none()); + assert!(m("ROOT/dir_root_13/file", false).is_ignore()); + assert!(m("ROOT/dir_root_13/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_13/child_dir/file", false).is_ignore()); + + // 20 + assert!(m("ROOT/dir_root_20", true).is_none()); + assert!(m("ROOT/dir_root_20/file", false).is_none()); + assert!(m("ROOT/dir_root_20/child_dir", true).is_none()); + assert!(m("ROOT/dir_root_20/child_dir/file", false).is_none()); + + // 21 + assert!(m("ROOT/dir_root_21", true).is_none()); + assert!(m("ROOT/dir_root_21/file", false).is_none()); + assert!(m("ROOT/dir_root_21/child_dir", true).is_none()); + assert!(m("ROOT/dir_root_21/child_dir/file", false).is_none()); + + // 22 + assert!(m("ROOT/dir_root_22", true).is_none()); + assert!(m("ROOT/dir_root_22/file", false).is_none()); + assert!(m("ROOT/dir_root_22/child_dir", true).is_none()); + assert!(m("ROOT/dir_root_22/child_dir/file", false).is_none()); + + // 23 + assert!(m("ROOT/dir_root_23", true).is_none()); + assert!(m("ROOT/dir_root_23/file", false).is_none()); + assert!(m("ROOT/dir_root_23/child_dir", true).is_none()); + assert!(m("ROOT/dir_root_23/child_dir/file", false).is_none()); + + // 30 + assert!(m("ROOT/dir_root_30", true).is_ignore()); + assert!(m("ROOT/dir_root_30/file", false).is_ignore()); + assert!(m("ROOT/dir_root_30/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_30/child_dir/file", false).is_ignore()); + + // 31 + assert!(m("ROOT/dir_root_31", true).is_ignore()); + assert!(m("ROOT/dir_root_31/file", false).is_ignore()); + assert!(m("ROOT/dir_root_31/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_31/child_dir/file", false).is_ignore()); + + // 32 + assert!(m("ROOT/dir_root_32", true).is_none()); // dir itself doesn't match + assert!(m("ROOT/dir_root_32/file", false).is_ignore()); + assert!(m("ROOT/dir_root_32/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_32/child_dir/file", false).is_ignore()); + + // 33 + assert!(m("ROOT/dir_root_33", true).is_none()); // dir itself doesn't match + assert!(m("ROOT/dir_root_33/file", false).is_ignore()); + assert!(m("ROOT/dir_root_33/child_dir", true).is_ignore()); + assert!(m("ROOT/dir_root_33/child_dir/file", false).is_ignore()); +} + + +#[test] +fn test_dirs_in_deep() { + let gitignore = get_gitignore(); + let m = |path: &str, is_dir: bool| { + gitignore.matched_path_or_any_parents(Path::new(path), is_dir) + }; + + // 00 + assert!(m("ROOT/parent_dir/dir_deep_00", true).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_00/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_00/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_00/child_dir/file", false).is_ignore() + ); + + // 01 + assert!(m("ROOT/parent_dir/dir_deep_01", true).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_01/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_01/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_01/child_dir/file", false).is_ignore() + ); + + // 02 + assert!(m("ROOT/parent_dir/dir_deep_02", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_02/file", false).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_02/child_dir", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_02/child_dir/file", false).is_none()); + + // 03 + assert!(m("ROOT/parent_dir/dir_deep_03", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_03/file", false).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_03/child_dir", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_03/child_dir/file", false).is_none()); + + // 10 + assert!(m("ROOT/parent_dir/dir_deep_10", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_10/file", false).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_10/child_dir", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_10/child_dir/file", false).is_none()); + + // 11 + assert!(m("ROOT/parent_dir/dir_deep_11", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_11/file", false).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_11/child_dir", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_11/child_dir/file", false).is_none()); + + // 12 + assert!(m("ROOT/parent_dir/dir_deep_12", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_12/file", false).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_12/child_dir", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_12/child_dir/file", false).is_none()); + + // 13 + assert!(m("ROOT/parent_dir/dir_deep_13", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_13/file", false).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_13/child_dir", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_13/child_dir/file", false).is_none()); + + // 20 + assert!(m("ROOT/parent_dir/dir_deep_20", true).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_20/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_20/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_20/child_dir/file", false).is_ignore() + ); + + // 21 + assert!(m("ROOT/parent_dir/dir_deep_21", true).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_21/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_21/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_21/child_dir/file", false).is_ignore() + ); + + // 22 + // dir itself doesn't match + assert!(m("ROOT/parent_dir/dir_deep_22", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_22/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_22/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_22/child_dir/file", false).is_ignore() + ); + + // 23 + // dir itself doesn't match + assert!(m("ROOT/parent_dir/dir_deep_23", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_23/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_23/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_23/child_dir/file", false).is_ignore() + ); + + // 30 + assert!(m("ROOT/parent_dir/dir_deep_30", true).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_30/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_30/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_30/child_dir/file", false).is_ignore() + ); + + // 31 + assert!(m("ROOT/parent_dir/dir_deep_31", true).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_31/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_31/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_31/child_dir/file", false).is_ignore() + ); + + // 32 + // dir itself doesn't match + assert!(m("ROOT/parent_dir/dir_deep_32", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_32/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_32/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_32/child_dir/file", false).is_ignore() + ); + + // 33 + // dir itself doesn't match + assert!(m("ROOT/parent_dir/dir_deep_33", true).is_none()); + assert!(m("ROOT/parent_dir/dir_deep_33/file", false).is_ignore()); + assert!(m("ROOT/parent_dir/dir_deep_33/child_dir", true).is_ignore()); + assert!( + m("ROOT/parent_dir/dir_deep_33/child_dir/file", false).is_ignore() + ); +} diff --git a/vendor/itertools-0.7.8/.cargo-checksum.json b/vendor/itertools-0.7.8/.cargo-checksum.json deleted file mode 100644 index 62356fd10b..0000000000 --- a/vendor/itertools-0.7.8/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"aeaa15ad23357fa2c222b01f8cbb4f6efc61dc1f0e8687beee211d0eeb3b1d1e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","Makefile":"13f1c5b88a7b946b5813f7231df2933b6b19b223e9e2d3fa63ad681192f984b5","README.rst":"711bd98258ffea2d19fe96e4c766aca622fbf395bc5a7c8f6cad52ac65121464","benches/bench1.rs":"695e4b00addf2e8e44a09d85a588cb333c97109829e59739bdab01e7342d47b5","benches/extra/mod.rs":"4c5b03e74fc5b02383500c9da9fd6550262706ee569d70d085700f6d0b5749ba","benches/extra/zipslices.rs":"108dd488de366b2d83fb6bcc603ecbf9a017e165ac19d03440074fa244af3fb2","benches/tree_fold1.rs":"84cddbabb1a681f3196430a8e27b060103366143a3ee4c42c3b0628fc00a7543","benches/tuple_combinations.rs":"8c14e9341d92e5cfd5f9a067d11088b37b003e82635d1ab3a8e5290e3ef83eed","benches/tuples.rs":"412a952f08bb03695952d5cfd57949dcf28be8b99e3c6653994bdb8af9654653","bors.toml":"eed8564cdc475f30ff4147781c5e50176b3048b5d24b272d1354dad952fd00be","custom.css":"03d2316d325a09f03f0fae54d24b64f784518a8249432edbd60e01436be900d5","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"3996ca0a62762aec2b102f0f4244fe90d4b4354286d68d80cdc40e35f4352ba3","src/adaptors/mod.rs":"ba6f96d594461c82d67e6c60770ebcb82e80948d28827b5eb613a7072ad8a0eb","src/adaptors/multi_product.rs":"bb239555be38cde1f419bacfd09728f6ccaf51b6b4811c266b5677705175e685","src/combinations.rs":"a9a3fc78eb5c9f3933ff60275a635d0c81f4864a73515dc052aeb2add4ad4909","src/concat_impl.rs":"276339b00588f54c25f8ffbe0ae3c0031f7e52fb53c6578554a0bde1681b58a5","src/cons_tuples_impl.rs":"87c620d2ffdd3475218f5f493dbef601491be9f6cdfe57c44929449b32e6709f","src/diff.rs":"921e2b867d7b32ffedc72a5eb780811322d14d1e0883a608b9028a2afcad0df2","src/either_or_both.rs":"4739b8644fa932b7992e565be6a6bc64dff9f93e345c52f90b3e1f8a67e6d18e","src/format.rs":"412fbe02f12311c6fbcec1044f57ad6991783f5a3f323b9c391accfe4915106f","src/free.rs":"ced78d79c0c78398ac53bf628e77ae84f214972d0dad0507b6687c2f88873aaa","src/group_map.rs":"872d6e243e649ad30c94973c034596cc3377b10018e361bca07e11c612006de6","src/groupbylazy.rs":"a067a12671be9ae05a9152518103f39f7286fde09f758de8af75a1064a3b5567","src/impl_macros.rs":"eb0bb3f70ec1bcaffa6110ae4134c777951ed1e5f48d8c811dbf0a597dc48faa","src/intersperse.rs":"9c18f239654ebfcce1d68a0256d2df6d79a2b8c4fb5df87d67e2ebe04a07e1a9","src/kmerge_impl.rs":"51e71d3e76670a8efb16597a9224d2c9b40cee6bc6270d06b66aadafea6dc26b","src/lib.rs":"d641c89cbe827bf88902dda7af20f1de7b3325a5e857f95181737cbb9afc0692","src/merge_join.rs":"98e6fcc761a558ad21789efe041c3f90e62f6c75e05840670df45ad4f9b07e1f","src/minmax.rs":"4668a7f824fbc133599f43ffb6f7283e5bd603e07df2d8176abc6f25d6af9db0","src/multipeek_impl.rs":"ebe9544d94d0bf7200f7625241a3b5a291b7b564091a08cad40ff08b51f1b1bf","src/pad_tail.rs":"078615a2892f8c6db665074cf6f1be1bef4cf5ee418bc174edcfd4dc703e163f","src/peeking_take_while.rs":"6aea3bb40fb480e9f3695ce2a7a3a2e2346d437ca846d20e6bb3c09beb0934f4","src/process_results_impl.rs":"5f454cf62ceb82cab7c08c0c190de3ae083e219a8acc7a1a22f17eec9cfcd65c","src/put_back_n_impl.rs":"d35858184c525372b22d14d42cdf63726cf0fd50f5bd42ec7a82d55a8e180e9f","src/rciter_impl.rs":"8f51abc7e1ae3320cc5d56fadd66f880a7a06773be656bd8c4712357f01ae1d9","src/repeatn.rs":"4bd1782364b16105fbef3f3de7bf62780710e5c996db44a00e4b5f16c2625d86","src/size_hint.rs":"c1d35b422a696cf3d63e7c90d8f9fdf01a304cf8156e914287c4ef48fea62dd3","src/sources.rs":"9d7eb4dbd87f659d04b4980238c5fc72b71472e16861d17a32cab9b77a3df06a","src/tee.rs":"59cf9ef0b41882307ea1e3503a2ff351f401f4c43d95acf423a990b0bf0e29ae","src/tuple_impl.rs":"0c7f907e85d2ef0661583b36c7b8a7341b8feadafe28d10539a211dff5c028ea","src/unique_impl.rs":"63db2d720ff5e3d9c0d6c2b245ffff25d4040e4fcbcb2a6524b0f912826f86af","src/with_position.rs":"d922f045f6fa090a431be928f3221c6dc37ac6f9bb54461b3b84f99a7e91244a","src/zip_eq_impl.rs":"f857c69120255db16ad6ddec628c79cb573b1d5179fcebab1906bf5b762c02e3","src/zip_longest.rs":"375325ef069970e6fb83c6097c2824877bb0f06e4f1e664e4fe681804abe003c","src/ziptuple.rs":"d7ae7d3c33185ad74ab2bba750ac337b5c236750cc8341dd9883faf6465712a1","tests/merge_join.rs":"546eaffae40010f15a7bcf95bc53f5e9b67424c5b93df6ffb0aaa1e48e8b90c0","tests/peeking_take_while.rs":"a2ae6474e09620a47bb8a6e3c62929261e72c52881370adb2d22e89aa9e9aec8","tests/quick.rs":"24b1ecc7522353d9fb278cb4fa4810437c717ff8a5a2a95e08909511420fc514","tests/test_core.rs":"ec9b8b8227170060a7828e907d6750c7123b4a1618073ac10e2b3fca72bd50d7","tests/test_std.rs":"63a5e52953e7209f72bdfd157047ee7b93a696786d1b39931a3f8a1053a67128","tests/tuples.rs":"5323d15a7abf6545b2655167d3206b6cf6a947e9409a244ea6a8cf4ad8ceac64","tests/zip.rs":"fe213d70c4fa114cb4d1930a6b971f4af617a239041ddb87e6b5a9bbe62261b8"},"package":"f58856976b776fedd95533137617a02fb25719f40e7d9b01c7043cd65474f450"} \ No newline at end of file diff --git a/vendor/itertools-0.7.8/Cargo.toml b/vendor/itertools-0.7.8/Cargo.toml deleted file mode 100644 index fc2b0cb51d..0000000000 --- a/vendor/itertools-0.7.8/Cargo.toml +++ /dev/null @@ -1,43 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies -# -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -name = "itertools" -version = "0.7.8" -authors = ["bluss"] -description = "Extra iterator adaptors, iterator methods, free functions, and macros." -documentation = "https://docs.rs/itertools/" -keywords = ["iterator", "data-structure", "zip", "product", "group-by"] -categories = ["algorithms", "rust-patterns"] -license = "MIT/Apache-2.0" -repository = "https://github.com/bluss/rust-itertools" -[package.metadata.release] -no-dev-version = true -[profile.bench] -debug = true - -[lib] -test = false -bench = false -[dependencies.either] -version = "1.0" -default-features = false -[dev-dependencies.permutohedron] -version = "0.2" - -[dev-dependencies.quickcheck] -version = "0.5" -default-features = false - -[features] -default = ["use_std"] -use_std = [] diff --git a/vendor/itertools-0.7.8/Makefile b/vendor/itertools-0.7.8/Makefile deleted file mode 100644 index bb03984248..0000000000 --- a/vendor/itertools-0.7.8/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -DOCCRATES = itertools - -# deps to delete the generated docs -RMDOCS = - -FEATURES = - -VERSIONS = $(patsubst %,target/VERS/%,$(DOCCRATES)) - -docs: mkdocs subst $(RMDOCS) - -# https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html -$(VERSIONS): Cargo.toml - mkdir -p $(@D) - cargo pkgid $(@F) | sed -e "s/.*#\(\|.*:\)//" > "$@" - -$(DOCCRATES): %: target/VERS/% - # Put in the crate version into the docs - find ./doc/$@ -name "*.html" -exec sed -i -e "s/\(.*\) - Rust/<title>$@ $(shell cat $<) - \1 - Rust/g" {} \; - -subst: $(DOCCRATES) - -mkdocs: Cargo.toml - cargo doc --features=$(FEATURES) --no-deps - rm -rf ./doc - cp -r ./target/doc ./doc - - cat ./custom.css >> doc/main.css - -$(RMDOCS): mkdocs - rm -r ./doc/$@ - sed -i "/searchIndex\['$@'\]/d" doc/search-index.js - - -.PHONY: docs mkdocs subst $(DOCCRATES) $(RMDOCS) diff --git a/vendor/itertools-0.7.8/README.rst b/vendor/itertools-0.7.8/README.rst deleted file mode 100644 index b2a549ee73..0000000000 --- a/vendor/itertools-0.7.8/README.rst +++ /dev/null @@ -1,490 +0,0 @@ - -Itertools -========= - -Extra iterator adaptors, functions and macros. - -Please read the `API documentation here`__ - -__ https://docs.rs/itertools/ - -|build_status|_ |crates|_ - -.. |build_status| image:: https://travis-ci.org/bluss/rust-itertools.svg?branch=master -.. _build_status: https://travis-ci.org/bluss/rust-itertools - -.. |crates| image:: http://meritbadge.herokuapp.com/itertools -.. _crates: https://crates.io/crates/itertools - -How to use with cargo: - -.. code:: toml - - [dependencies] - itertools = "0.7.3" - -How to use in your crate: - -.. code:: rust - - #[macro_use] extern crate itertools; - - use itertools::Itertools; - -How to contribute: - -- Fix a bug or implement a new thing -- Include tests for your new feature, preferably a quickcheck test -- Make a Pull Request - - -Recent Changes --------------- - -- 0.7.8 - - - Add new iterator method ``.tree_fold1()`` which is like ``.fold1()`` - except items are combined in a tree structure (see its docs). - By @scottmcm - - Add more ``Debug`` impls by @phimuemue: KMerge, KMergeBy, MergeJoinBy, - ConsTuples, Intersperse, ProcessResults, RcIter, Tee, TupleWindows, Tee, - ZipLongest, ZipEq, Zip. - -- 0.7.7 - - - Add new iterator method ``.into_group_map() -> HashMap<K, Vec<V>>`` - which turns an iterator of ``(K, V)`` elements into such a hash table, - where values are grouped by key. By @tobz1000 - - Add new free function ``flatten`` for the ``.flatten()`` adaptor. - **NOTE:** recent Rust nightlies have ``Iterator::flatten`` and thus a clash - with our flatten adaptor. One workaround is to use the itertools ``flatten`` - free function. - -- 0.7.6 - - - Add new adaptor ``.multi_cartesian_product()`` which is an n-ary product - iterator by @tobz1000 - - Add new method ``.sorted_by_key()`` by @Xion - - Provide simpler and faster ``.count()`` for ``.unique()`` and ``.unique_by()`` - -- 0.7.5 - - - ``.multipeek()`` now implements ``PeekingNext``, by @nicopap. - -- 0.7.4 - - - Add new adaptor ``.update()`` by @lucasem; this adaptor is used - to modify an element before passing it on in an iterator chain. - -- 0.7.3 - - - Add new method ``.collect_tuple()`` by @matklad; it makes a tuple out of - the iterator's elements if the number of them matches **exactly**. - - Implement ``fold`` and ``collect`` for ``.map_results()`` which means - it reuses the code of the standard ``.map()`` for these methods. - -- 0.7.2 - - - Add new adaptor ``.merge_join_by`` by @srijs; a heterogeneous merge join - for two ordered sequences. - -- 0.7.1 - - - Iterator adaptors and iterators in itertools now use the same ``must_use`` - reminder that the standard library adaptors do, by @matematikaedit and @bluss - *“iterator adaptors are lazy and do nothing unless consumed”*. - -- 0.7.0 - - - Faster ``izip!()`` by @krdln - - - ``izip!()`` is now a wrapper for repeated regular ``.zip()`` and - a single ``.map()``. This means it optimizes as well as the standard - library ``.zip()`` it uses. - **Note:** ``multizip`` and ``izip!()`` are now different! The former - has a named type but the latter optimizes better. - - - Faster ``.unique()`` - - - ``no_std`` support, which is opt-in! - - - Many lovable features are still there without std, like ``izip!()`` - or ``.format()`` or ``.merge()``, but not those that use collections. - - - Trait bounds were required up front instead of just on the type: - ``group_by``'s ``PartialEq`` by @Phlosioneer and ``repeat_call``'s - ``FnMut``. - - Removed deprecated constructor ``Zip::new`` — use ``izip!()`` or ``multizip()`` - -- 0.6.5 - - - Fix bug in ``.cartesian_product()``'s fold (which only was visible for - unfused iterators). - -- 0.6.4 - - - Add specific ``fold`` implementations for ``.cartesian_product()`` and - ``cons_tuples()``, which improves their performance in fold, foreach, and - iterator consumers derived from them. - -- 0.6.3 - - - Add iterator adaptor ``.positions(predicate)`` by @tmccombs - -- 0.6.2 - - - Add function ``process_results`` which can “lift” a function of the regular - values of an iterator so that it can process the ``Ok`` values from an - iterator of ``Results`` instead, by @shepmaster - - Add iterator method ``.concat()`` which combines all iterator elements - into a single collection using the ``Extend`` trait, by @srijs - -- 0.6.1 - - - Better size hint testing and subsequent size hint bugfixes by @rkarp. - Fixes bugs in product, interleave_shortest size hints. - - New iterator method ``.all_equal()`` by @phimuemue - -- 0.6.0 - - - Deprecated names were removed in favour of their replacements - - ``.flatten()`` does not implement double ended iteration anymore - - ``.fold_while()`` uses ``&mut self`` and returns ``FoldWhile<T>``, for - composability (#168) - - ``.foreach()`` and ``.fold1()`` use ``self``, like ``.fold()`` does. - - ``.combinations(0)`` now produces a single empty vector. (#174) - -- 0.5.10 - - - Add itertools method ``.kmerge_by()`` (and corresponding free function) - - Relaxed trait requirement of ``.kmerge()`` and ``.minmax()`` to PartialOrd. - -- 0.5.9 - - - Add multipeek method ``.reset_peek()`` - - Add categories - -- 0.5.8 - - - Add iterator adaptor ``.peeking_take_while()`` and its trait ``PeekingNext``. - -- 0.5.7 - - - Add iterator adaptor ``.with_position()`` - - Fix multipeek's performance for long peeks by using ``VecDeque``. - -- 0.5.6 - - - Add ``.map_results()`` - -- 0.5.5 - - - Many more adaptors now implement ``Debug`` - - Add free function constructor ``repeat_n``. ``RepeatN::new`` is now - deprecated. - -- 0.5.4 - - - Add infinite generator function ``iterate``, that takes a seed and a - closure. - -- 0.5.3 - - - Special-cased ``.fold()`` for flatten and put back. ``.foreach()`` - now uses fold on the iterator, to pick up any iterator specific loop - implementation. - - ``.combinations(n)`` asserts up front that ``n != 0``, instead of - running into an error on the second iterator element. - -- 0.5.2 - - - Add ``.tuples::<T>()`` that iterates by two, three or four elements at - a time (where ``T`` is a tuple type). - - Add ``.tuple_windows::<T>()`` that iterates using a window of the - two, three or four most recent elements. - - Add ``.next_tuple::<T>()`` method, that picks the next two, three or four - elements in one go. - - ``.interleave()`` now has an accurate size hint. - -- 0.5.1 - - - Workaround module/function name clash that made racer crash on completing - itertools. Only internal changes needed. - -- 0.5.0 - - - `Release announcement <http://bluss.github.io/rust/2016/09/26/itertools-0.5.0/>`_ - - Renamed: - - - combinations is now tuple_combinations - - combinations_n to combinations - - group_by_lazy, chunks_lazy to group_by, chunks - - Unfold::new to unfold() - - RepeatCall::new to repeat_call() - - Zip::new to multizip - - PutBack::new, PutBackN::new to put_back, put_back_n - - PutBack::with_value is now a builder setter, not a constructor - - MultiPeek::new, .multipeek() to multipeek() - - format to format_with and format_default to format - - .into_rc() to rciter - - ``Partition`` enum is now ``Either`` - - - Module reorganization: - - - All iterator structs are under ``itertools::structs`` but also - reexported to the top level, for backwards compatibility - - All free functions are reexported at the root, ``itertools::free`` will - be removed in the next version - - - Removed: - - - ZipSlices, use .zip() instead - - .enumerate_from(), ZipTrusted, due to being unstable - - .mend_slices(), moved to crate odds - - Stride, StrideMut, moved to crate odds - - linspace(), moved to crate itertools-num - - .sort_by(), use .sorted_by() - - .is_empty_hint(), use .size_hint() - - .dropn(), use .dropping() - - .map_fn(), use .map() - - .slice(), use .take() / .skip() - - helper traits in misc - - ``new`` constructors on iterator structs, use Itertools trait or free - functions instead - - ``itertools::size_hint`` is now private - - - Behaviour changes: - - - format and format_with helpers now panic if you try to format them more - than once. - - ``repeat_call`` is not double ended anymore - - - New features: - - - tuple flattening iterator is constructible with ``cons_tuples`` - - itertools reexports ``Either`` from the ``either`` crate. ``Either<L, R>`` - is an iterator when ``L, R`` are. - - ``MinMaxResult`` now implements Copy and Clone - - tuple_combinations supports 1-4 tuples of combinations (previously just 2) - -- 0.4.19 - - - Add ``.minmax_by()`` - - Add ``itertools::free::cloned`` - - Add ``itertools::free::rciter`` - - Improve ``.step(n)`` slightly to take advantage of specialized Fuse better. - -- 0.4.18 - - - Only changes related to the "unstable" crate feature. This feature is more - or less deprecated. - - - Use deprecated warnings when unstable is enabled. .enumerate_from() will - be removed imminently since it's using a deprecated libstd trait. - -- 0.4.17 - - - Fix bug in .kmerge() that caused it to often produce the wrong order (#134) - -- 0.4.16 - - - Improve precision of the interleave_shortest adaptor's size hint (it is - now computed exactly when possible). - -- 0.4.15 - - - Fixup on top of the workaround in 0.4.14. A function in itertools::free was - removed by mistake and now it is added back again. - -- 0.4.14 - - - Workaround an upstream regression in a rust nightly build that broke - compilation of of itertools::free::{interleave, merge} - -- 0.4.13 - - - Add .minmax() and .minmax_by_key(), iterator methods for finding both minimum - and maximum in one scan. - - Add .format_default(), a simpler version of .format() (lazy formatting - for iterators). - -- 0.4.12 - - - Add .zip_eq(), an adaptor like .zip() except it ensures iterators - of inequal length don't pass silently (instead it panics). - - Add .fold_while(), an iterator method that is a fold that - can short-circuit. - - Add .partition_map(), an iterator method that can separate elements - into two collections. - -- 0.4.11 - - - Add .get() for Stride{,Mut} and .get_mut() for StrideMut - -- 0.4.10 - - - Improve performance of .kmerge() - -- 0.4.9 - - - Add k-ary merge adaptor .kmerge() - - Fix a bug in .islice() with ranges a..b where a > b. - -- 0.4.8 - - - Implement Clone, Debug for Linspace - -- 0.4.7 - - - Add function diff_with() that compares two iterators - - Add .combinations_n(), an n-ary combinations iterator - - Add methods PutBack::with_value and PutBack::into_parts. - -- 0.4.6 - - - Add method .sorted() - - Add module ``itertools::free`` with free function variants of common - iterator adaptors and methods. - For example ``enumerate(iterable)``, ``rev(iterable)``, and so on. - -- 0.4.5 - - - Add .flatten() - -- 0.4.4 - - - Allow composing ZipSlices with itself - -- 0.4.3 - - - Write iproduct!() as a single expression; this allows temporary values - in its arguments. - -- 0.4.2 - - - Add .fold_options() - - Require Rust 1.1 or later - -- 0.4.1 - - - Update .dropping() to take advantage of .nth() - -- 0.4.0 - - - .merge(), .unique() and .dedup() now perform better due to not using - function pointers - - Add free functions enumerate() and rev() - - Breaking changes: - - - Return types of .merge() and .merge_by() renamed and changed - - Method Merge::new removed - - .merge_by() now takes a closure that returns bool. - - Return type of .dedup() changed - - Return type of .mend_slices() changed - - Return type of .unique() changed - - Removed function times(), struct Times: use a range instead - - Removed deprecated macro icompr!() - - Removed deprecated FnMap and method .fn_map(): use .map_fn() - - .interleave_shortest() is no longer guaranteed to act like fused - -- 0.3.25 - - - Rename .sort_by() to .sorted_by(). Old name is deprecated. - - Fix well-formedness warnings from RFC 1214, no user visible impact - -- 0.3.24 - - - Improve performance of .merge()'s ordering function slightly - -- 0.3.23 - - - Added .chunks(), similar to (and based on) .group_by_lazy(). - - Tweak linspace to match numpy.linspace and make it double ended. - -- 0.3.22 - - - Added ZipSlices, a fast zip for slices - -- 0.3.21 - - - Remove `Debug` impl for `Format`, it will have different use later - -- 0.3.20 - - - Optimize .group_by_lazy() - -- 0.3.19 - - - Added .group_by_lazy(), a possibly nonallocating group by - - Added .format(), a nonallocating formatting helper for iterators - - Remove uses of RandomAccessIterator since it has been deprecated in rust. - -- 0.3.17 - - - Added (adopted) Unfold from rust - -- 0.3.16 - - - Added adaptors .unique(), .unique_by() - -- 0.3.15 - - - Added method .sort_by() - -- 0.3.14 - - - Added adaptor .while_some() - -- 0.3.13 - - - Added adaptor .interleave_shortest() - - Added adaptor .pad_using() - -- 0.3.11 - - - Added assert_equal function - -- 0.3.10 - - - Bugfix .combinations() size_hint. - -- 0.3.8 - - - Added source RepeatCall - -- 0.3.7 - - - Added adaptor PutBackN - - Added adaptor .combinations() - -- 0.3.6 - - - Added itertools::partition, partition a sequence in place based on a predicate. - - Deprecate icompr!() with no replacement. - -- 0.3.5 - - - .map_fn() replaces deprecated .fn_map(). - -- 0.3.4 - - - .take_while_ref() *by-ref adaptor* - - .coalesce() *adaptor* - - .mend_slices() *adaptor* - -- 0.3.3 - - - .dropping_back() *method* - - .fold1() *method* - - .is_empty_hint() *method* - -License -------- - -Dual-licensed to be compatible with the Rust project. - -Licensed under the Apache License, Version 2.0 -http://www.apache.org/licenses/LICENSE-2.0 or the MIT license -http://opensource.org/licenses/MIT, at your -option. This file may not be copied, modified, or distributed -except according to those terms. diff --git a/vendor/itertools-0.7.8/benches/bench1.rs b/vendor/itertools-0.7.8/benches/bench1.rs deleted file mode 100644 index d4342f93f2..0000000000 --- a/vendor/itertools-0.7.8/benches/bench1.rs +++ /dev/null @@ -1,735 +0,0 @@ -#![feature(test)] - -extern crate test; -#[macro_use] extern crate itertools; - -use test::{black_box}; -use itertools::Itertools; - -use itertools::free::cloned; - -use std::iter::repeat; -use std::cmp; -use std::ops::Add; - -mod extra; - -use extra::ZipSlices; - -#[bench] -fn slice_iter(b: &mut test::Bencher) -{ - let xs: Vec<_> = repeat(1i32).take(20).collect(); - b.iter(|| for elt in xs.iter() { - test::black_box(elt); - }) -} - -#[bench] -fn slice_iter_rev(b: &mut test::Bencher) -{ - let xs: Vec<_> = repeat(1i32).take(20).collect(); - b.iter(|| for elt in xs.iter().rev() { - test::black_box(elt); - }) -} - -#[bench] -fn zip_default_zip(b: &mut test::Bencher) -{ - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - for (&x, &y) in xs.iter().zip(&ys) { - test::black_box(x); - test::black_box(y); - } - }) -} - -#[bench] -fn zipdot_i32_default_zip(b: &mut test::Bencher) -{ - let xs = vec![2; 1024]; - let ys = vec![2; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - let mut s = 0; - for (&x, &y) in xs.iter().zip(&ys) { - s += x * y; - } - s - }) -} - -#[bench] -fn zipdot_f32_default_zip(b: &mut test::Bencher) -{ - let xs = vec![2f32; 1024]; - let ys = vec![2f32; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - let mut s = 0.; - for (&x, &y) in xs.iter().zip(&ys) { - s += x * y; - } - s - }) -} - -#[bench] -fn zip_default_zip3(b: &mut test::Bencher) -{ - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let zs = vec![0; 766]; - let xs = black_box(xs); - let ys = black_box(ys); - let zs = black_box(zs); - - b.iter(|| { - for ((&x, &y), &z) in xs.iter().zip(&ys).zip(&zs) { - test::black_box(x); - test::black_box(y); - test::black_box(z); - } - }) -} - -/* -#[bench] -fn zip_slices_ziptuple(b: &mut test::Bencher) -{ - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - - b.iter(|| { - let xs = black_box(&xs); - let ys = black_box(&ys); - for (&x, &y) in Zip::new((xs, ys)) { - test::black_box(x); - test::black_box(y); - } - }) -} -*/ - -#[bench] -fn zipslices(b: &mut test::Bencher) -{ - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - for (&x, &y) in ZipSlices::new(&xs, &ys) { - test::black_box(x); - test::black_box(y); - } - }) -} - -#[bench] -fn zipslices_mut(b: &mut test::Bencher) -{ - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let xs = black_box(xs); - let mut ys = black_box(ys); - - b.iter(|| { - for (&x, &mut y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) { - test::black_box(x); - test::black_box(y); - } - }) -} - -#[bench] -fn zipdot_i32_zipslices(b: &mut test::Bencher) -{ - let xs = vec![2; 1024]; - let ys = vec![2; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - let mut s = 0i32; - for (&x, &y) in ZipSlices::new(&xs, &ys) { - s += x * y; - } - s - }) -} - -#[bench] -fn zipdot_f32_zipslices(b: &mut test::Bencher) -{ - let xs = vec![2f32; 1024]; - let ys = vec![2f32; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - let mut s = 0.; - for (&x, &y) in ZipSlices::new(&xs, &ys) { - s += x * y; - } - s - }) -} - - -#[bench] -fn zip_checked_counted_loop(b: &mut test::Bencher) -{ - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - // Must slice to equal lengths, and then bounds checks are eliminated! - let len = cmp::min(xs.len(), ys.len()); - let xs = &xs[..len]; - let ys = &ys[..len]; - - for i in 0..len { - let x = xs[i]; - let y = ys[i]; - test::black_box(x); - test::black_box(y); - } - }) -} - -#[bench] -fn zipdot_i32_checked_counted_loop(b: &mut test::Bencher) -{ - let xs = vec![2; 1024]; - let ys = vec![2; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - // Must slice to equal lengths, and then bounds checks are eliminated! - let len = cmp::min(xs.len(), ys.len()); - let xs = &xs[..len]; - let ys = &ys[..len]; - - let mut s = 0i32; - - for i in 0..len { - s += xs[i] * ys[i]; - } - s - }) -} - -#[bench] -fn zipdot_f32_checked_counted_loop(b: &mut test::Bencher) -{ - let xs = vec![2f32; 1024]; - let ys = vec![2f32; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - // Must slice to equal lengths, and then bounds checks are eliminated! - let len = cmp::min(xs.len(), ys.len()); - let xs = &xs[..len]; - let ys = &ys[..len]; - - let mut s = 0.; - - for i in 0..len { - s += xs[i] * ys[i]; - } - s - }) -} - -#[bench] -fn zipdot_f32_checked_counted_unrolled_loop(b: &mut test::Bencher) -{ - let xs = vec![2f32; 1024]; - let ys = vec![2f32; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - // Must slice to equal lengths, and then bounds checks are eliminated! - let len = cmp::min(xs.len(), ys.len()); - let mut xs = &xs[..len]; - let mut ys = &ys[..len]; - - let mut s = 0.; - let (mut p0, mut p1, mut p2, mut p3, mut p4, mut p5, mut p6, mut p7) = - (0., 0., 0., 0., 0., 0., 0., 0.); - - // how to unroll and have bounds checks eliminated (by cristicbz) - // split sum into eight parts to enable vectorization (by bluss) - while xs.len() >= 8 { - p0 += xs[0] * ys[0]; - p1 += xs[1] * ys[1]; - p2 += xs[2] * ys[2]; - p3 += xs[3] * ys[3]; - p4 += xs[4] * ys[4]; - p5 += xs[5] * ys[5]; - p6 += xs[6] * ys[6]; - p7 += xs[7] * ys[7]; - - xs = &xs[8..]; - ys = &ys[8..]; - } - s += p0 + p4; - s += p1 + p5; - s += p2 + p6; - s += p3 + p7; - - for i in 0..xs.len() { - s += xs[i] * ys[i]; - } - s - }) -} - -#[bench] -fn zip_unchecked_counted_loop(b: &mut test::Bencher) -{ - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - let len = cmp::min(xs.len(), ys.len()); - for i in 0..len { - unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - test::black_box(x); - test::black_box(y); - } - } - }) -} - -#[bench] -fn zipdot_i32_unchecked_counted_loop(b: &mut test::Bencher) -{ - let xs = vec![2; 1024]; - let ys = vec![2; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - let len = cmp::min(xs.len(), ys.len()); - let mut s = 0i32; - for i in 0..len { - unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - s += x * y; - } - } - s - }) -} - -#[bench] -fn zipdot_f32_unchecked_counted_loop(b: &mut test::Bencher) -{ - let xs = vec![2.; 1024]; - let ys = vec![2.; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - b.iter(|| { - let len = cmp::min(xs.len(), ys.len()); - let mut s = 0f32; - for i in 0..len { - unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - s += x * y; - } - } - s - }) -} - -#[bench] -fn zip_unchecked_counted_loop3(b: &mut test::Bencher) -{ - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let zs = vec![0; 766]; - let xs = black_box(xs); - let ys = black_box(ys); - let zs = black_box(zs); - - b.iter(|| { - let len = cmp::min(xs.len(), cmp::min(ys.len(), zs.len())); - for i in 0..len { - unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - let z = *zs.get_unchecked(i); - test::black_box(x); - test::black_box(y); - test::black_box(z); - } - } - }) -} - -#[bench] -fn group_by_lazy_1(b: &mut test::Bencher) { - let mut data = vec![0; 1024]; - for (index, elt) in data.iter_mut().enumerate() { - *elt = index / 10; - } - - let data = test::black_box(data); - - b.iter(|| { - for (_key, group) in &data.iter().group_by(|elt| **elt) { - for elt in group { - test::black_box(elt); - } - } - }) -} - -#[bench] -fn group_by_lazy_2(b: &mut test::Bencher) { - let mut data = vec![0; 1024]; - for (index, elt) in data.iter_mut().enumerate() { - *elt = index / 2; - } - - let data = test::black_box(data); - - b.iter(|| { - for (_key, group) in &data.iter().group_by(|elt| **elt) { - for elt in group { - test::black_box(elt); - } - } - }) -} - -#[bench] -fn slice_chunks(b: &mut test::Bencher) { - let data = vec![0; 1024]; - - let data = test::black_box(data); - let sz = test::black_box(10); - - b.iter(|| { - for group in data.chunks(sz) { - for elt in group { - test::black_box(elt); - } - } - }) -} - -#[bench] -fn chunks_lazy_1(b: &mut test::Bencher) { - let data = vec![0; 1024]; - - let data = test::black_box(data); - let sz = test::black_box(10); - - b.iter(|| { - for group in &data.iter().chunks(sz) { - for elt in group { - test::black_box(elt); - } - } - }) -} - -#[bench] -fn equal(b: &mut test::Bencher) { - let data = vec![7; 1024]; - let l = data.len(); - let alpha = test::black_box(&data[1..]); - let beta = test::black_box(&data[..l - 1]); - b.iter(|| { - itertools::equal(alpha, beta) - }) -} - -#[bench] -fn merge_default(b: &mut test::Bencher) { - let mut data1 = vec![0; 1024]; - let mut data2 = vec![0; 800]; - let mut x = 0; - for (_, elt) in data1.iter_mut().enumerate() { - *elt = x; - x += 1; - } - - let mut y = 0; - for (i, elt) in data2.iter_mut().enumerate() { - *elt += y; - if i % 3 == 0 { - y += 3; - } else { - y += 0; - } - } - let data1 = test::black_box(data1); - let data2 = test::black_box(data2); - b.iter(|| { - data1.iter().merge(&data2).count() - }) -} - -#[bench] -fn merge_by_cmp(b: &mut test::Bencher) { - let mut data1 = vec![0; 1024]; - let mut data2 = vec![0; 800]; - let mut x = 0; - for (_, elt) in data1.iter_mut().enumerate() { - *elt = x; - x += 1; - } - - let mut y = 0; - for (i, elt) in data2.iter_mut().enumerate() { - *elt += y; - if i % 3 == 0 { - y += 3; - } else { - y += 0; - } - } - let data1 = test::black_box(data1); - let data2 = test::black_box(data2); - b.iter(|| { - data1.iter().merge_by(&data2, PartialOrd::le).count() - }) -} - -#[bench] -fn merge_by_lt(b: &mut test::Bencher) { - let mut data1 = vec![0; 1024]; - let mut data2 = vec![0; 800]; - let mut x = 0; - for (_, elt) in data1.iter_mut().enumerate() { - *elt = x; - x += 1; - } - - let mut y = 0; - for (i, elt) in data2.iter_mut().enumerate() { - *elt += y; - if i % 3 == 0 { - y += 3; - } else { - y += 0; - } - } - let data1 = test::black_box(data1); - let data2 = test::black_box(data2); - b.iter(|| { - data1.iter().merge_by(&data2, |a, b| a <= b).count() - }) -} - -#[bench] -fn kmerge_default(b: &mut test::Bencher) { - let mut data1 = vec![0; 1024]; - let mut data2 = vec![0; 800]; - let mut x = 0; - for (_, elt) in data1.iter_mut().enumerate() { - *elt = x; - x += 1; - } - - let mut y = 0; - for (i, elt) in data2.iter_mut().enumerate() { - *elt += y; - if i % 3 == 0 { - y += 3; - } else { - y += 0; - } - } - let data1 = test::black_box(data1); - let data2 = test::black_box(data2); - let its = &[data1.iter(), data2.iter()]; - b.iter(|| { - its.iter().cloned().kmerge().count() - }) -} - -#[bench] -fn kmerge_tenway(b: &mut test::Bencher) { - let mut data = vec![0; 10240]; - - let mut state = 1729u16; - fn rng(state: &mut u16) -> u16 { - let new = state.wrapping_mul(31421) + 6927; - *state = new; - new - } - - for elt in &mut data { - *elt = rng(&mut state); - } - - let mut chunks = Vec::new(); - let mut rest = &mut data[..]; - while rest.len() > 0 { - let chunk_len = 1 + rng(&mut state) % 512; - let chunk_len = cmp::min(rest.len(), chunk_len as usize); - let (fst, tail) = {rest}.split_at_mut(chunk_len); - fst.sort(); - chunks.push(fst.iter().cloned()); - rest = tail; - } - - // println!("Chunk lengths: {}", chunks.iter().format_with(", ", |elt, f| f(&elt.len()))); - - b.iter(|| { - chunks.iter().cloned().kmerge().count() - }) -} - - -fn fast_integer_sum<I>(iter: I) -> I::Item - where I: IntoIterator, - I::Item: Default + Add<Output=I::Item> -{ - iter.into_iter().fold(<_>::default(), |x, y| x + y) -} - - -#[bench] -fn step_vec_2(b: &mut test::Bencher) { - let v = vec![0; 1024]; - b.iter(|| { - fast_integer_sum(cloned(v.iter().step(2))) - }); -} - -#[bench] -fn step_vec_10(b: &mut test::Bencher) { - let v = vec![0; 1024]; - b.iter(|| { - fast_integer_sum(cloned(v.iter().step(10))) - }); -} - -#[bench] -fn step_range_2(b: &mut test::Bencher) { - let v = black_box(0..1024); - b.iter(|| { - fast_integer_sum(v.clone().step(2)) - }); -} - -#[bench] -fn step_range_10(b: &mut test::Bencher) { - let v = black_box(0..1024); - b.iter(|| { - fast_integer_sum(v.clone().step(10)) - }); -} - -#[bench] -fn cartesian_product_iterator(b: &mut test::Bencher) -{ - let xs = vec![0; 16]; - - b.iter(|| { - let mut sum = 0; - for (&x, &y, &z) in iproduct!(&xs, &xs, &xs) { - sum += x; - sum += y; - sum += z; - } - sum - }) -} - -#[bench] -fn cartesian_product_fold(b: &mut test::Bencher) -{ - let xs = vec![0; 16]; - - b.iter(|| { - let mut sum = 0; - iproduct!(&xs, &xs, &xs).fold((), |(), (&x, &y, &z)| { - sum += x; - sum += y; - sum += z; - }); - sum - }) -} - -#[bench] -fn multi_cartesian_product_iterator(b: &mut test::Bencher) -{ - let xs = [vec![0; 16], vec![0; 16], vec![0; 16]]; - - b.iter(|| { - let mut sum = 0; - for x in xs.into_iter().multi_cartesian_product() { - sum += x[0]; - sum += x[1]; - sum += x[2]; - } - sum - }) -} - -#[bench] -fn multi_cartesian_product_fold(b: &mut test::Bencher) -{ - let xs = [vec![0; 16], vec![0; 16], vec![0; 16]]; - - b.iter(|| { - let mut sum = 0; - xs.into_iter().multi_cartesian_product().fold((), |(), x| { - sum += x[0]; - sum += x[1]; - sum += x[2]; - }); - sum - }) -} - -#[bench] -fn cartesian_product_nested_for(b: &mut test::Bencher) -{ - let xs = vec![0; 16]; - - b.iter(|| { - let mut sum = 0; - for &x in &xs { - for &y in &xs { - for &z in &xs { - sum += x; - sum += y; - sum += z; - } - } - } - sum - }) -} diff --git a/vendor/itertools-0.7.8/benches/extra/mod.rs b/vendor/itertools-0.7.8/benches/extra/mod.rs deleted file mode 100644 index 5ddb5772f4..0000000000 --- a/vendor/itertools-0.7.8/benches/extra/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ - - -pub use self::zipslices::ZipSlices; -mod zipslices; diff --git a/vendor/itertools-0.7.8/benches/extra/zipslices.rs b/vendor/itertools-0.7.8/benches/extra/zipslices.rs deleted file mode 100644 index 493a539fd6..0000000000 --- a/vendor/itertools-0.7.8/benches/extra/zipslices.rs +++ /dev/null @@ -1,189 +0,0 @@ -use std::cmp; - -// Note: There are different ways to implement ZipSlices. -// This version performed the best in benchmarks. -// -// I also implemented a version with three pointes (tptr, tend, uptr), -// that mimiced slice::Iter and only checked bounds by using tptr == tend, -// but that was inferior to this solution. - -/// An iterator which iterates two slices simultaneously. -/// -/// `ZipSlices` acts like a double-ended `.zip()` iterator. -/// -/// It was intended to be more efficient than `.zip()`, and it was, then -/// rustc changed how it optimizes so it can not promise improved performance -/// at this time. -/// -/// Note that elements past the end of the shortest of the two slices are ignored. -/// -/// Iterator element type for `ZipSlices<T, U>` is `(T::Item, U::Item)`. For example, -/// for a `ZipSlices<&'a [A], &'b mut [B]>`, the element type is `(&'a A, &'b mut B)`. -#[derive(Clone)] -pub struct ZipSlices<T, U> { - t: T, - u: U, - len: usize, - index: usize, -} - -impl<'a, 'b, A, B> ZipSlices<&'a [A], &'b [B]> { - /// Create a new `ZipSlices` from slices `a` and `b`. - /// - /// Act like a double-ended `.zip()` iterator, but more efficiently. - /// - /// Note that elements past the end of the shortest of the two slices are ignored. - #[inline(always)] - pub fn new(a: &'a [A], b: &'b [B]) -> Self { - let minl = cmp::min(a.len(), b.len()); - ZipSlices { - t: a, - u: b, - len: minl, - index: 0, - } - } -} - -impl<T, U> ZipSlices<T, U> - where T: Slice, - U: Slice -{ - /// Create a new `ZipSlices` from slices `a` and `b`. - /// - /// Act like a double-ended `.zip()` iterator, but more efficiently. - /// - /// Note that elements past the end of the shortest of the two slices are ignored. - #[inline(always)] - pub fn from_slices(a: T, b: U) -> Self { - let minl = cmp::min(a.len(), b.len()); - ZipSlices { - t: a, - u: b, - len: minl, - index: 0, - } - } -} - -impl<T, U> Iterator for ZipSlices<T, U> - where T: Slice, - U: Slice -{ - type Item = (T::Item, U::Item); - - #[inline(always)] - fn next(&mut self) -> Option<Self::Item> { - unsafe { - if self.index >= self.len { - None - } else { - let i = self.index; - self.index += 1; - Some(( - self.t.get_unchecked(i), - self.u.get_unchecked(i))) - } - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - let len = self.len - self.index; - (len, Some(len)) - } -} - -impl<T, U> DoubleEndedIterator for ZipSlices<T, U> - where T: Slice, - U: Slice -{ - #[inline(always)] - fn next_back(&mut self) -> Option<Self::Item> { - unsafe { - if self.index >= self.len { - None - } else { - self.len -= 1; - let i = self.len; - Some(( - self.t.get_unchecked(i), - self.u.get_unchecked(i))) - } - } - } -} - -impl<T, U> ExactSizeIterator for ZipSlices<T, U> - where T: Slice, - U: Slice -{} - -unsafe impl<T, U> Slice for ZipSlices<T, U> - where T: Slice, - U: Slice -{ - type Item = (T::Item, U::Item); - - fn len(&self) -> usize { - self.len - self.index - } - - unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item { - (self.t.get_unchecked(i), - self.u.get_unchecked(i)) - } -} - -/// A helper trait to let `ZipSlices` accept both `&[T]` and `&mut [T]`. -/// -/// Unsafe trait because: -/// -/// - Implementors must guarantee that `get_unchecked` is valid for all indices `0..len()`. -pub unsafe trait Slice { - /// The type of a reference to the slice's elements - type Item; - #[doc(hidden)] - fn len(&self) -> usize; - #[doc(hidden)] - unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item; -} - -unsafe impl<'a, T> Slice for &'a [T] { - type Item = &'a T; - #[inline(always)] - fn len(&self) -> usize { (**self).len() } - #[inline(always)] - unsafe fn get_unchecked(&mut self, i: usize) -> &'a T { - debug_assert!(i < self.len()); - (**self).get_unchecked(i) - } -} - -unsafe impl<'a, T> Slice for &'a mut [T] { - type Item = &'a mut T; - #[inline(always)] - fn len(&self) -> usize { (**self).len() } - #[inline(always)] - unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut T { - debug_assert!(i < self.len()); - // override the lifetime constraints of &mut &'a mut [T] - (*(*self as *mut [T])).get_unchecked_mut(i) - } -} - -#[test] -fn zipslices() { - - let xs = [1, 2, 3, 4, 5, 6]; - let ys = [1, 2, 3, 7]; - ::itertools::assert_equal(ZipSlices::new(&xs, &ys), xs.iter().zip(&ys)); - - let xs = [1, 2, 3, 4, 5, 6]; - let mut ys = [0; 6]; - for (x, y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) { - *y = *x; - } - ::itertools::assert_equal(&xs, &ys); -} - diff --git a/vendor/itertools-0.7.8/benches/tree_fold1.rs b/vendor/itertools-0.7.8/benches/tree_fold1.rs deleted file mode 100644 index b71589f3fe..0000000000 --- a/vendor/itertools-0.7.8/benches/tree_fold1.rs +++ /dev/null @@ -1,126 +0,0 @@ -#![feature(test)] - -extern crate test; -extern crate itertools; - -use itertools::Itertools; -use itertools::cloned; -use test::Bencher; - -trait IterEx : Iterator { - // Another efficient implementation against which to compare, - // but needs `std` so is less desirable. - fn tree_fold1_vec<F>(self, mut f: F) -> Option<Self::Item> - where F: FnMut(Self::Item, Self::Item) -> Self::Item, - Self: Sized, - { - let hint = self.size_hint().0; - let cap = std::mem::size_of::<usize>() * 8 - hint.leading_zeros() as usize; - let mut stack = Vec::with_capacity(cap); - self.enumerate().foreach(|(mut i, mut x)| { - while (i & 1) != 0 { - x = f(stack.pop().unwrap(), x); - i >>= 1; - } - stack.push(x); - }); - stack.into_iter().fold1(f) - } -} -impl<T:Iterator> IterEx for T {} - -macro_rules! def_benchs { - ($N:expr, - $FUN:ident, - $BENCH_NAME:ident, - ) => ( - mod $BENCH_NAME { - use super::*; - - #[bench] - fn sum(b: &mut Bencher) { - let v: Vec<u32> = (0.. $N).collect(); - b.iter(|| { - cloned(&v).$FUN(|x, y| x + y) - }); - } - - #[bench] - fn complex_iter(b: &mut Bencher) { - let u = (3..).take($N / 2); - let v = (5..).take($N / 2); - let it = u.chain(v); - - b.iter(|| { - it.clone().map(|x| x as f32).$FUN(f32::atan2) - }); - } - - #[bench] - fn string_format(b: &mut Bencher) { - // This goes quadratic with linear `fold1`, so use a smaller - // size to not waste too much time in travis. The allocations - // in here are so expensive anyway that it'll still take - // way longer per iteration than the other two benchmarks. - let v: Vec<u32> = (0.. ($N/4)).collect(); - b.iter(|| { - cloned(&v).map(|x| x.to_string()).$FUN(|x, y| format!("{} + {}", x, y)) - }); - } - } - ) -} - -def_benchs!{ - 10_000, - fold1, - fold1_10k, -} - -def_benchs!{ - 10_000, - tree_fold1, - tree_fold1_stack_10k, -} - -def_benchs!{ - 10_000, - tree_fold1_vec, - tree_fold1_vec_10k, -} - -def_benchs!{ - 100, - fold1, - fold1_100, -} - -def_benchs!{ - 100, - tree_fold1, - tree_fold1_stack_100, -} - -def_benchs!{ - 100, - tree_fold1_vec, - tree_fold1_vec_100, -} - -def_benchs!{ - 8, - fold1, - fold1_08, -} - -def_benchs!{ - 8, - tree_fold1, - tree_fold1_stack_08, -} - -def_benchs!{ - 8, - tree_fold1_vec, - tree_fold1_vec_08, -} diff --git a/vendor/itertools-0.7.8/benches/tuple_combinations.rs b/vendor/itertools-0.7.8/benches/tuple_combinations.rs deleted file mode 100644 index 1f9075dad3..0000000000 --- a/vendor/itertools-0.7.8/benches/tuple_combinations.rs +++ /dev/null @@ -1,97 +0,0 @@ -#![feature(test)] - -extern crate test; -extern crate itertools; - -use test::{black_box, Bencher}; -use itertools::Itertools; - -// aproximate 100_000 iterations for each combination -const N1: usize = 100_000; -const N2: usize = 448; -const N3: usize = 86; -const N4: usize = 41; - -#[bench] -fn comb_for1(b: &mut Bencher) { - b.iter(|| { - for i in 0..N1 { - black_box(i); - } - }); -} - -#[bench] -fn comb_for2(b: &mut Bencher) { - b.iter(|| { - for i in 0..N2 { - for j in (i + 1)..N2 { - black_box(i + j); - } - } - }); -} - -#[bench] -fn comb_for3(b: &mut Bencher) { - b.iter(|| { - for i in 0..N3 { - for j in (i + 1)..N3 { - for k in (j + 1)..N3 { - black_box(i + j + k); - } - } - } - }); -} - -#[bench] -fn comb_for4(b: &mut Bencher) { - b.iter(|| { - for i in 0..N4 { - for j in (i + 1)..N4 { - for k in (j + 1)..N4 { - for l in (k + 1)..N4 { - black_box(i + j + k + l); - } - } - } - } - }); -} - -#[bench] -fn comb_c1(b: &mut Bencher) { - b.iter(|| { - for (i,) in (0..N1).tuple_combinations() { - black_box(i); - } - }); -} - -#[bench] -fn comb_c2(b: &mut Bencher) { - b.iter(|| { - for (i, j) in (0..N2).tuple_combinations() { - black_box(i + j); - } - }); -} - -#[bench] -fn comb_c3(b: &mut Bencher) { - b.iter(|| { - for (i, j, k) in (0..N3).tuple_combinations() { - black_box(i + j + k); - } - }); -} - -#[bench] -fn comb_c4(b: &mut Bencher) { - b.iter(|| { - for (i, j, k, l) in (0..N4).tuple_combinations() { - black_box(i + j + k + l); - } - }); -} diff --git a/vendor/itertools-0.7.8/benches/tuples.rs b/vendor/itertools-0.7.8/benches/tuples.rs deleted file mode 100644 index b0f2990fdf..0000000000 --- a/vendor/itertools-0.7.8/benches/tuples.rs +++ /dev/null @@ -1,190 +0,0 @@ -#![feature(test)] - -extern crate test; -extern crate itertools; - -use test::Bencher; -use itertools::Itertools; - -fn s1(a: u32) -> u32 { - a -} - -fn s2(a: u32, b: u32) -> u32 { - a + b -} - -fn s3(a: u32, b: u32, c: u32) -> u32 { - a + b + c -} - -fn s4(a: u32, b: u32, c: u32, d: u32) -> u32 { - a + b + c + d -} - -fn sum_s1(s: &[u32]) -> u32 { - s1(s[0]) -} - -fn sum_s2(s: &[u32]) -> u32 { - s2(s[0], s[1]) -} - -fn sum_s3(s: &[u32]) -> u32 { - s3(s[0], s[1], s[2]) -} - -fn sum_s4(s: &[u32]) -> u32 { - s4(s[0], s[1], s[2], s[3]) -} - -fn sum_t1(s: &(&u32, )) -> u32 { - s1(*s.0) -} - -fn sum_t2(s: &(&u32, &u32)) -> u32 { - s2(*s.0, *s.1) -} - -fn sum_t3(s: &(&u32, &u32, &u32)) -> u32 { - s3(*s.0, *s.1, *s.2) -} - -fn sum_t4(s: &(&u32, &u32, &u32, &u32)) -> u32 { - s4(*s.0, *s.1, *s.2, *s.3) -} - -macro_rules! def_benchs { - ($N:expr; - $TUPLE_FUN:ident, - $TUPLES:ident, - $TUPLE_WINDOWS:ident; - $SLICE_FUN:ident, - $CHUNKS:ident, - $WINDOWS:ident; - $FOR_CHUNKS:ident, - $FOR_WINDOWS:ident - ) => ( - #[bench] - fn $FOR_CHUNKS(b: &mut Bencher) { - let v: Vec<u32> = (0.. $N * 1_000).collect(); - let mut s = 0; - b.iter(|| { - let mut j = 0; - for _ in 0..1_000 { - s += $SLICE_FUN(&v[j..(j + $N)]); - j += $N; - } - s - }); - } - - #[bench] - fn $FOR_WINDOWS(b: &mut Bencher) { - let v: Vec<u32> = (0..1_000).collect(); - let mut s = 0; - b.iter(|| { - for i in 0..(1_000 - $N) { - s += $SLICE_FUN(&v[i..(i + $N)]); - } - s - }); - } - - #[bench] - fn $TUPLES(b: &mut Bencher) { - let v: Vec<u32> = (0.. $N * 1_000).collect(); - let mut s = 0; - b.iter(|| { - for x in v.iter().tuples() { - s += $TUPLE_FUN(&x); - } - s - }); - } - - #[bench] - fn $CHUNKS(b: &mut Bencher) { - let v: Vec<u32> = (0.. $N * 1_000).collect(); - let mut s = 0; - b.iter(|| { - for x in v.chunks($N) { - s += $SLICE_FUN(x); - } - s - }); - } - - #[bench] - fn $TUPLE_WINDOWS(b: &mut Bencher) { - let v: Vec<u32> = (0..1_000).collect(); - let mut s = 0; - b.iter(|| { - for x in v.iter().tuple_windows() { - s += $TUPLE_FUN(&x); - } - s - }); - } - - #[bench] - fn $WINDOWS(b: &mut Bencher) { - let v: Vec<u32> = (0..1_000).collect(); - let mut s = 0; - b.iter(|| { - for x in v.windows($N) { - s += $SLICE_FUN(x); - } - s - }); - } - ) -} - -def_benchs!{ - 1; - sum_t1, - tuple_chunks_1, - tuple_windows_1; - sum_s1, - slice_chunks_1, - slice_windows_1; - for_chunks_1, - for_windows_1 -} - -def_benchs!{ - 2; - sum_t2, - tuple_chunks_2, - tuple_windows_2; - sum_s2, - slice_chunks_2, - slice_windows_2; - for_chunks_2, - for_windows_2 -} - -def_benchs!{ - 3; - sum_t3, - tuple_chunks_3, - tuple_windows_3; - sum_s3, - slice_chunks_3, - slice_windows_3; - for_chunks_3, - for_windows_3 -} - -def_benchs!{ - 4; - sum_t4, - tuple_chunks_4, - tuple_windows_4; - sum_s4, - slice_chunks_4, - slice_windows_4; - for_chunks_4, - for_windows_4 -} diff --git a/vendor/itertools-0.7.8/bors.toml b/vendor/itertools-0.7.8/bors.toml deleted file mode 100644 index 2523b2d82f..0000000000 --- a/vendor/itertools-0.7.8/bors.toml +++ /dev/null @@ -1,3 +0,0 @@ -status = [ -"continuous-integration/travis-ci/push" -] diff --git a/vendor/itertools-0.7.8/custom.css b/vendor/itertools-0.7.8/custom.css deleted file mode 100644 index bd4b11e92e..0000000000 --- a/vendor/itertools-0.7.8/custom.css +++ /dev/null @@ -1,29 +0,0 @@ - -.docblock pre.rust { background: #eeeeff; } -pre.trait, pre.fn, pre.struct, pre.enum, pre.typedef { background: #fcfefc; } - -/* Small “example” label for doc examples */ -.docblock pre.rust::before { - content: "example"; - float: right; - font-style: italic; - font-size: 0.8em; - margin-top: -10px; - margin-right: -5px; -} - - -/* Fixup where display in trait listing */ -pre.trait .where::before { -content: '\a '; -} - -.docblock code { - background-color: inherit; - font-weight: bold; - padding: 0 0.1em; -} - -a.test-arrow { - display: none; -} diff --git a/vendor/itertools-0.7.8/examples/iris.data b/vendor/itertools-0.7.8/examples/iris.data deleted file mode 100644 index a3490e0e07..0000000000 --- a/vendor/itertools-0.7.8/examples/iris.data +++ /dev/null @@ -1,150 +0,0 @@ -5.1,3.5,1.4,0.2,Iris-setosa -4.9,3.0,1.4,0.2,Iris-setosa -4.7,3.2,1.3,0.2,Iris-setosa -4.6,3.1,1.5,0.2,Iris-setosa -5.0,3.6,1.4,0.2,Iris-setosa -5.4,3.9,1.7,0.4,Iris-setosa -4.6,3.4,1.4,0.3,Iris-setosa -5.0,3.4,1.5,0.2,Iris-setosa -4.4,2.9,1.4,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -5.4,3.7,1.5,0.2,Iris-setosa -4.8,3.4,1.6,0.2,Iris-setosa -4.8,3.0,1.4,0.1,Iris-setosa -4.3,3.0,1.1,0.1,Iris-setosa -5.8,4.0,1.2,0.2,Iris-setosa -5.7,4.4,1.5,0.4,Iris-setosa -5.4,3.9,1.3,0.4,Iris-setosa -5.1,3.5,1.4,0.3,Iris-setosa -5.7,3.8,1.7,0.3,Iris-setosa -5.1,3.8,1.5,0.3,Iris-setosa -5.4,3.4,1.7,0.2,Iris-setosa -5.1,3.7,1.5,0.4,Iris-setosa -4.6,3.6,1.0,0.2,Iris-setosa -5.1,3.3,1.7,0.5,Iris-setosa -4.8,3.4,1.9,0.2,Iris-setosa -5.0,3.0,1.6,0.2,Iris-setosa -5.0,3.4,1.6,0.4,Iris-setosa -5.2,3.5,1.5,0.2,Iris-setosa -5.2,3.4,1.4,0.2,Iris-setosa -4.7,3.2,1.6,0.2,Iris-setosa -4.8,3.1,1.6,0.2,Iris-setosa -5.4,3.4,1.5,0.4,Iris-setosa -5.2,4.1,1.5,0.1,Iris-setosa -5.5,4.2,1.4,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -5.0,3.2,1.2,0.2,Iris-setosa -5.5,3.5,1.3,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -4.4,3.0,1.3,0.2,Iris-setosa -5.1,3.4,1.5,0.2,Iris-setosa -5.0,3.5,1.3,0.3,Iris-setosa -4.5,2.3,1.3,0.3,Iris-setosa -4.4,3.2,1.3,0.2,Iris-setosa -5.0,3.5,1.6,0.6,Iris-setosa -5.1,3.8,1.9,0.4,Iris-setosa -4.8,3.0,1.4,0.3,Iris-setosa -5.1,3.8,1.6,0.2,Iris-setosa -4.6,3.2,1.4,0.2,Iris-setosa -5.3,3.7,1.5,0.2,Iris-setosa -5.0,3.3,1.4,0.2,Iris-setosa -7.0,3.2,4.7,1.4,Iris-versicolor -6.4,3.2,4.5,1.5,Iris-versicolor -6.9,3.1,4.9,1.5,Iris-versicolor -5.5,2.3,4.0,1.3,Iris-versicolor -6.5,2.8,4.6,1.5,Iris-versicolor -5.7,2.8,4.5,1.3,Iris-versicolor -6.3,3.3,4.7,1.6,Iris-versicolor -4.9,2.4,3.3,1.0,Iris-versicolor -6.6,2.9,4.6,1.3,Iris-versicolor -5.2,2.7,3.9,1.4,Iris-versicolor -5.0,2.0,3.5,1.0,Iris-versicolor -5.9,3.0,4.2,1.5,Iris-versicolor -6.0,2.2,4.0,1.0,Iris-versicolor -6.1,2.9,4.7,1.4,Iris-versicolor -5.6,2.9,3.6,1.3,Iris-versicolor -6.7,3.1,4.4,1.4,Iris-versicolor -5.6,3.0,4.5,1.5,Iris-versicolor -5.8,2.7,4.1,1.0,Iris-versicolor -6.2,2.2,4.5,1.5,Iris-versicolor -5.6,2.5,3.9,1.1,Iris-versicolor -5.9,3.2,4.8,1.8,Iris-versicolor -6.1,2.8,4.0,1.3,Iris-versicolor -6.3,2.5,4.9,1.5,Iris-versicolor -6.1,2.8,4.7,1.2,Iris-versicolor -6.4,2.9,4.3,1.3,Iris-versicolor -6.6,3.0,4.4,1.4,Iris-versicolor -6.8,2.8,4.8,1.4,Iris-versicolor -6.7,3.0,5.0,1.7,Iris-versicolor -6.0,2.9,4.5,1.5,Iris-versicolor -5.7,2.6,3.5,1.0,Iris-versicolor -5.5,2.4,3.8,1.1,Iris-versicolor -5.5,2.4,3.7,1.0,Iris-versicolor -5.8,2.7,3.9,1.2,Iris-versicolor -6.0,2.7,5.1,1.6,Iris-versicolor -5.4,3.0,4.5,1.5,Iris-versicolor -6.0,3.4,4.5,1.6,Iris-versicolor -6.7,3.1,4.7,1.5,Iris-versicolor -6.3,2.3,4.4,1.3,Iris-versicolor -5.6,3.0,4.1,1.3,Iris-versicolor -5.5,2.5,4.0,1.3,Iris-versicolor -5.5,2.6,4.4,1.2,Iris-versicolor -6.1,3.0,4.6,1.4,Iris-versicolor -5.8,2.6,4.0,1.2,Iris-versicolor -5.0,2.3,3.3,1.0,Iris-versicolor -5.6,2.7,4.2,1.3,Iris-versicolor -5.7,3.0,4.2,1.2,Iris-versicolor -5.7,2.9,4.2,1.3,Iris-versicolor -6.2,2.9,4.3,1.3,Iris-versicolor -5.1,2.5,3.0,1.1,Iris-versicolor -5.7,2.8,4.1,1.3,Iris-versicolor -6.3,3.3,6.0,2.5,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -7.1,3.0,5.9,2.1,Iris-virginica -6.3,2.9,5.6,1.8,Iris-virginica -6.5,3.0,5.8,2.2,Iris-virginica -7.6,3.0,6.6,2.1,Iris-virginica -4.9,2.5,4.5,1.7,Iris-virginica -7.3,2.9,6.3,1.8,Iris-virginica -6.7,2.5,5.8,1.8,Iris-virginica -7.2,3.6,6.1,2.5,Iris-virginica -6.5,3.2,5.1,2.0,Iris-virginica -6.4,2.7,5.3,1.9,Iris-virginica -6.8,3.0,5.5,2.1,Iris-virginica -5.7,2.5,5.0,2.0,Iris-virginica -5.8,2.8,5.1,2.4,Iris-virginica -6.4,3.2,5.3,2.3,Iris-virginica -6.5,3.0,5.5,1.8,Iris-virginica -7.7,3.8,6.7,2.2,Iris-virginica -7.7,2.6,6.9,2.3,Iris-virginica -6.0,2.2,5.0,1.5,Iris-virginica -6.9,3.2,5.7,2.3,Iris-virginica -5.6,2.8,4.9,2.0,Iris-virginica -7.7,2.8,6.7,2.0,Iris-virginica -6.3,2.7,4.9,1.8,Iris-virginica -6.7,3.3,5.7,2.1,Iris-virginica -7.2,3.2,6.0,1.8,Iris-virginica -6.2,2.8,4.8,1.8,Iris-virginica -6.1,3.0,4.9,1.8,Iris-virginica -6.4,2.8,5.6,2.1,Iris-virginica -7.2,3.0,5.8,1.6,Iris-virginica -7.4,2.8,6.1,1.9,Iris-virginica -7.9,3.8,6.4,2.0,Iris-virginica -6.4,2.8,5.6,2.2,Iris-virginica -6.3,2.8,5.1,1.5,Iris-virginica -6.1,2.6,5.6,1.4,Iris-virginica -7.7,3.0,6.1,2.3,Iris-virginica -6.3,3.4,5.6,2.4,Iris-virginica -6.4,3.1,5.5,1.8,Iris-virginica -6.0,3.0,4.8,1.8,Iris-virginica -6.9,3.1,5.4,2.1,Iris-virginica -6.7,3.1,5.6,2.4,Iris-virginica -6.9,3.1,5.1,2.3,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -6.8,3.2,5.9,2.3,Iris-virginica -6.7,3.3,5.7,2.5,Iris-virginica -6.7,3.0,5.2,2.3,Iris-virginica -6.3,2.5,5.0,1.9,Iris-virginica -6.5,3.0,5.2,2.0,Iris-virginica -6.2,3.4,5.4,2.3,Iris-virginica -5.9,3.0,5.1,1.8,Iris-virginica diff --git a/vendor/itertools-0.7.8/examples/iris.rs b/vendor/itertools-0.7.8/examples/iris.rs deleted file mode 100644 index c09afbea0d..0000000000 --- a/vendor/itertools-0.7.8/examples/iris.rs +++ /dev/null @@ -1,141 +0,0 @@ -/// -/// This example parses, sorts and groups the iris dataset -/// and does some simple manipulations. -/// -/// Iterators and itertools functionality are used throughout. -/// -/// - -extern crate itertools; - -use itertools::Itertools; -use std::collections::HashMap; -use std::iter::repeat; -use std::num::ParseFloatError; -use std::str::FromStr; - -static DATA: &'static str = include_str!("iris.data"); - -#[derive(Clone, Debug)] -struct Iris { - name: String, - data: [f32; 4], -} - -#[derive(Clone, Debug)] -enum ParseError { - Numeric(ParseFloatError), - Other(&'static str), -} - -impl From<ParseFloatError> for ParseError { - fn from(err: ParseFloatError) -> Self { - ParseError::Numeric(err) - } -} - -/// Parse an Iris from a comma-separated line -impl FromStr for Iris { - type Err = ParseError; - - fn from_str(s: &str) -> Result<Self, Self::Err> { - let mut iris = Iris { name: "".into(), data: [0.; 4] }; - let mut parts = s.split(",").map(str::trim); - - // using Iterator::by_ref() - for (index, part) in parts.by_ref().take(4).enumerate() { - iris.data[index] = try!(part.parse::<f32>()); - } - if let Some(name) = parts.next() { - iris.name = name.into(); - } else { - return Err(ParseError::Other("Missing name")) - } - Ok(iris) - } -} - -fn main() { - // using Itertools::fold_results to create the result of parsing - let irises = DATA.lines() - .map(str::parse) - .fold_results(Vec::new(), |mut v, iris: Iris| { - v.push(iris); - v - }); - let mut irises = match irises { - Err(e) => { - println!("Error parsing: {:?}", e); - std::process::exit(1); - } - Ok(data) => data, - }; - - // Sort them and group them - irises.sort_by(|a, b| Ord::cmp(&a.name, &b.name)); - - // using Iterator::cycle() - let mut plot_symbols = "+ox".chars().cycle(); - let mut symbolmap = HashMap::new(); - - // using Itertools::group_by - for (species, species_group) in &irises.iter().group_by(|iris| &iris.name) { - // assign a plot symbol - symbolmap.entry(species).or_insert_with(|| { - plot_symbols.next().unwrap() - }); - println!("{} (symbol={})", species, symbolmap[species]); - - for iris in species_group { - // using Itertools::format for lazy formatting - println!("{:>3.1}", iris.data.iter().format(", ")); - } - - } - - // Look at all combinations of the four columns - // - // See https://en.wikipedia.org/wiki/Iris_flower_data_set - // - let n = 30; // plot size - let mut plot = vec![' '; n * n]; - - // using Itertools::tuple_combinations - for (a, b) in (0..4).tuple_combinations() { - println!("Column {} vs {}:", a, b); - - // Clear plot - // - // using std::iter::repeat; - // using Itertools::set_from - plot.iter_mut().set_from(repeat(' ')); - - // using Itertools::minmax - let min_max = |data: &[Iris], col| { - data.iter() - .map(|iris| iris.data[col]) - .minmax() - .into_option() - .expect("Can't find min/max of empty iterator") - }; - let (min_x, max_x) = min_max(&irises, a); - let (min_y, max_y) = min_max(&irises, b); - - // Plot the data points - let round_to_grid = |x, min, max| ((x - min) / (max - min) * ((n - 1) as f32)) as usize; - let flip = |ix| n - 1 - ix; // reverse axis direction - - for iris in &irises { - let ix = round_to_grid(iris.data[a], min_x, max_x); - let iy = flip(round_to_grid(iris.data[b], min_y, max_y)); - plot[n * iy + ix] = symbolmap[&iris.name]; - } - - // render plot - // - // using Itertools::join - for line in plot.chunks(n) { - println!("{}", line.iter().join(" ")) - } - } -} diff --git a/vendor/itertools-0.7.8/src/adaptors/mod.rs b/vendor/itertools-0.7.8/src/adaptors/mod.rs deleted file mode 100644 index 127edaa56c..0000000000 --- a/vendor/itertools-0.7.8/src/adaptors/mod.rs +++ /dev/null @@ -1,1293 +0,0 @@ -//! Licensed under the Apache License, Version 2.0 -//! http://www.apache.org/licenses/LICENSE-2.0 or the MIT license -//! http://opensource.org/licenses/MIT, at your -//! option. This file may not be copied, modified, or distributed -//! except according to those terms. - -mod multi_product; -#[cfg(feature = "use_std")] -pub use self::multi_product::*; - -use std::fmt; -use std::mem::replace; -use std::iter::{Fuse, Peekable, FromIterator}; -use std::marker::PhantomData; -use size_hint; -use fold; - -macro_rules! clone_fields { - ($name:ident, $base:expr, $($field:ident),+) => ( - $name { - $( - $field : $base . $field .clone() - ),* - } - ); -} - -/// An iterator adaptor that alternates elements from two iterators until both -/// run out. -/// -/// This iterator is *fused*. -/// -/// See [`.interleave()`](../trait.Itertools.html#method.interleave) for more information. -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Interleave<I, J> { - a: Fuse<I>, - b: Fuse<J>, - flag: bool, -} - -/// Create an iterator that interleaves elements in `i` and `j`. -/// -/// `IntoIterator` enabled version of `i.interleave(j)`. -/// -/// ``` -/// use itertools::interleave; -/// -/// for elt in interleave(&[1, 2, 3], &[2, 3, 4]) { -/// /* loop body */ -/// } -/// ``` -pub fn interleave<I, J>(i: I, j: J) -> Interleave<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter> - where I: IntoIterator, - J: IntoIterator<Item = I::Item> -{ - Interleave { - a: i.into_iter().fuse(), - b: j.into_iter().fuse(), - flag: false, - } -} - -impl<I, J> Iterator for Interleave<I, J> - where I: Iterator, - J: Iterator<Item = I::Item> -{ - type Item = I::Item; - #[inline] - fn next(&mut self) -> Option<I::Item> { - self.flag = !self.flag; - if self.flag { - match self.a.next() { - None => self.b.next(), - r => r, - } - } else { - match self.b.next() { - None => self.a.next(), - r => r, - } - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - size_hint::add(self.a.size_hint(), self.b.size_hint()) - } -} - -/// An iterator adaptor that alternates elements from the two iterators until -/// one of them runs out. -/// -/// This iterator is *fused*. -/// -/// See [`.interleave_shortest()`](../trait.Itertools.html#method.interleave_shortest) -/// for more information. -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct InterleaveShortest<I, J> - where I: Iterator, - J: Iterator<Item = I::Item> -{ - it0: I, - it1: J, - phase: bool, // false ==> it0, true ==> it1 -} - -/// Create a new `InterleaveShortest` iterator. -pub fn interleave_shortest<I, J>(a: I, b: J) -> InterleaveShortest<I, J> - where I: Iterator, - J: Iterator<Item = I::Item> -{ - InterleaveShortest { - it0: a, - it1: b, - phase: false, - } -} - -impl<I, J> Iterator for InterleaveShortest<I, J> - where I: Iterator, - J: Iterator<Item = I::Item> -{ - type Item = I::Item; - - #[inline] - fn next(&mut self) -> Option<I::Item> { - match self.phase { - false => match self.it0.next() { - None => None, - e => { - self.phase = true; - e - } - }, - true => match self.it1.next() { - None => None, - e => { - self.phase = false; - e - } - }, - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - let (curr_hint, next_hint) = { - let it0_hint = self.it0.size_hint(); - let it1_hint = self.it1.size_hint(); - if self.phase { - (it1_hint, it0_hint) - } else { - (it0_hint, it1_hint) - } - }; - let (curr_lower, curr_upper) = curr_hint; - let (next_lower, next_upper) = next_hint; - let (combined_lower, combined_upper) = - size_hint::mul_scalar(size_hint::min(curr_hint, next_hint), 2); - let lower = - if curr_lower > next_lower { - combined_lower + 1 - } else { - combined_lower - }; - let upper = { - let extra_elem = match (curr_upper, next_upper) { - (_, None) => false, - (None, Some(_)) => true, - (Some(curr_max), Some(next_max)) => curr_max > next_max, - }; - if extra_elem { - combined_upper.and_then(|x| x.checked_add(1)) - } else { - combined_upper - } - }; - (lower, upper) - } -} - -#[derive(Clone, Debug)] -/// An iterator adaptor that allows putting back a single -/// item to the front of the iterator. -/// -/// Iterator element type is `I::Item`. -pub struct PutBack<I> - where I: Iterator -{ - top: Option<I::Item>, - iter: I, -} - -/// Create an iterator where you can put back a single item -pub fn put_back<I>(iterable: I) -> PutBack<I::IntoIter> - where I: IntoIterator -{ - PutBack { - top: None, - iter: iterable.into_iter(), - } -} - -impl<I> PutBack<I> - where I: Iterator -{ - /// put back value `value` (builder method) - pub fn with_value(mut self, value: I::Item) -> Self { - self.put_back(value); - self - } - - /// Split the `PutBack` into its parts. - #[inline] - pub fn into_parts(self) -> (Option<I::Item>, I) { - let PutBack{top, iter} = self; - (top, iter) - } - - /// Put back a single value to the front of the iterator. - /// - /// If a value is already in the put back slot, it is overwritten. - #[inline] - pub fn put_back(&mut self, x: I::Item) { - self.top = Some(x) - } -} - -impl<I> Iterator for PutBack<I> - where I: Iterator -{ - type Item = I::Item; - #[inline] - fn next(&mut self) -> Option<I::Item> { - match self.top { - None => self.iter.next(), - ref mut some => some.take(), - } - } - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - // Not ExactSizeIterator because size may be larger than usize - size_hint::add_scalar(self.iter.size_hint(), self.top.is_some() as usize) - } - - fn all<G>(&mut self, mut f: G) -> bool - where G: FnMut(Self::Item) -> bool - { - if let Some(elt) = self.top.take() { - if !f(elt) { - return false; - } - } - self.iter.all(f) - } - - fn fold<Acc, G>(mut self, init: Acc, mut f: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, - { - let mut accum = init; - if let Some(elt) = self.top.take() { - accum = f(accum, elt); - } - self.iter.fold(accum, f) - } -} - -#[derive(Debug, Clone)] -/// An iterator adaptor that iterates over the cartesian product of -/// the element sets of two iterators `I` and `J`. -/// -/// Iterator element type is `(I::Item, J::Item)`. -/// -/// See [`.cartesian_product()`](../trait.Itertools.html#method.cartesian_product) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Product<I, J> - where I: Iterator -{ - a: I, - a_cur: Option<I::Item>, - b: J, - b_orig: J, -} - -/// Create a new cartesian product iterator -/// -/// Iterator element type is `(I::Item, J::Item)`. -pub fn cartesian_product<I, J>(mut i: I, j: J) -> Product<I, J> - where I: Iterator, - J: Clone + Iterator, - I::Item: Clone -{ - Product { - a_cur: i.next(), - a: i, - b: j.clone(), - b_orig: j, - } -} - - -impl<I, J> Iterator for Product<I, J> - where I: Iterator, - J: Clone + Iterator, - I::Item: Clone -{ - type Item = (I::Item, J::Item); - fn next(&mut self) -> Option<(I::Item, J::Item)> { - let elt_b = match self.b.next() { - None => { - self.b = self.b_orig.clone(); - match self.b.next() { - None => return None, - Some(x) => { - self.a_cur = self.a.next(); - x - } - } - } - Some(x) => x - }; - match self.a_cur { - None => None, - Some(ref a) => { - Some((a.clone(), elt_b)) - } - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let has_cur = self.a_cur.is_some() as usize; - // Not ExactSizeIterator because size may be larger than usize - let (b_min, b_max) = self.b.size_hint(); - - // Compute a * b_orig + b for both lower and upper bound - size_hint::add( - size_hint::mul(self.a.size_hint(), self.b_orig.size_hint()), - (b_min * has_cur, b_max.map(move |x| x * has_cur))) - } - - fn fold<Acc, G>(mut self, mut accum: Acc, mut f: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, - { - // use a split loop to handle the loose a_cur as well as avoiding to - // clone b_orig at the end. - if let Some(mut a) = self.a_cur.take() { - let mut b = self.b; - loop { - accum = b.fold(accum, |acc, elt| f(acc, (a.clone(), elt))); - - // we can only continue iterating a if we had a first element; - if let Some(next_a) = self.a.next() { - b = self.b_orig.clone(); - a = next_a; - } else { - break; - } - } - } - accum - } -} - -/// A “meta iterator adaptor”. Its closure recives a reference to the iterator -/// and may pick off as many elements as it likes, to produce the next iterator element. -/// -/// Iterator element type is *X*, if the return type of `F` is *Option\<X\>*. -/// -/// See [`.batching()`](../trait.Itertools.html#method.batching) for more information. -#[derive(Clone)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Batching<I, F> { - f: F, - iter: I, -} - -impl<I, F> fmt::Debug for Batching<I, F> where I: fmt::Debug { - debug_fmt_fields!(Batching, iter); -} - -/// Create a new Batching iterator. -pub fn batching<I, F>(iter: I, f: F) -> Batching<I, F> { - Batching { f: f, iter: iter } -} - -impl<B, F, I> Iterator for Batching<I, F> - where I: Iterator, - F: FnMut(&mut I) -> Option<B> -{ - type Item = B; - #[inline] - fn next(&mut self) -> Option<B> { - (self.f)(&mut self.iter) - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - // No information about closue behavior - (0, None) - } -} - -/// An iterator adaptor that steps a number elements in the base iterator -/// for each iteration. -/// -/// The iterator steps by yielding the next element from the base iterator, -/// then skipping forward *n-1* elements. -/// -/// See [`.step()`](../trait.Itertools.html#method.step) for more information. -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Step<I> { - iter: Fuse<I>, - skip: usize, -} - -/// Create a `Step` iterator. -/// -/// **Panics** if the step is 0. -pub fn step<I>(iter: I, step: usize) -> Step<I> - where I: Iterator -{ - assert!(step != 0); - Step { - iter: iter.fuse(), - skip: step - 1, - } -} - -impl<I> Iterator for Step<I> - where I: Iterator -{ - type Item = I::Item; - #[inline] - fn next(&mut self) -> Option<I::Item> { - let elt = self.iter.next(); - if self.skip > 0 { - self.iter.nth(self.skip - 1); - } - elt - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let (low, high) = self.iter.size_hint(); - let div = |x: usize| { - if x == 0 { - 0 - } else { - 1 + (x - 1) / (self.skip + 1) - } - }; - (div(low), high.map(div)) - } -} - -// known size -impl<I> ExactSizeIterator for Step<I> - where I: ExactSizeIterator -{} - - -struct MergeCore<I, J> - where I: Iterator, - J: Iterator<Item = I::Item> -{ - a: Peekable<I>, - b: Peekable<J>, - fused: Option<bool>, -} - - -impl<I, J> Clone for MergeCore<I, J> - where I: Iterator, - J: Iterator<Item = I::Item>, - Peekable<I>: Clone, - Peekable<J>: Clone -{ - fn clone(&self) -> Self { - clone_fields!(MergeCore, self, a, b, fused) - } -} - -impl<I, J> MergeCore<I, J> - where I: Iterator, - J: Iterator<Item = I::Item> -{ - fn next_with<F>(&mut self, mut less_than: F) -> Option<I::Item> - where F: FnMut(&I::Item, &I::Item) -> bool - { - let less_than = match self.fused { - Some(lt) => lt, - None => match (self.a.peek(), self.b.peek()) { - (Some(a), Some(b)) => less_than(a, b), - (Some(_), None) => { - self.fused = Some(true); - true - } - (None, Some(_)) => { - self.fused = Some(false); - false - } - (None, None) => return None, - } - }; - - if less_than { - self.a.next() - } else { - self.b.next() - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - // Not ExactSizeIterator because size may be larger than usize - size_hint::add(self.a.size_hint(), self.b.size_hint()) - } -} - -/// An iterator adaptor that merges the two base iterators in ascending order. -/// If both base iterators are sorted (ascending), the result is sorted. -/// -/// Iterator element type is `I::Item`. -/// -/// See [`.merge()`](../trait.Itertools.html#method.merge_by) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Merge<I, J> - where I: Iterator, - J: Iterator<Item = I::Item> -{ - merge: MergeCore<I, J>, -} - -impl<I, J> Clone for Merge<I, J> - where I: Iterator, - J: Iterator<Item = I::Item>, - Peekable<I>: Clone, - Peekable<J>: Clone -{ - fn clone(&self) -> Self { - clone_fields!(Merge, self, merge) - } -} - -impl<I, J> fmt::Debug for Merge<I, J> - where I: Iterator + fmt::Debug, J: Iterator<Item = I::Item> + fmt::Debug, - I::Item: fmt::Debug, -{ - debug_fmt_fields!(Merge, merge.a, merge.b); -} - -/// Create an iterator that merges elements in `i` and `j`. -/// -/// `IntoIterator` enabled version of `i.merge(j)`. -/// -/// ``` -/// use itertools::merge; -/// -/// for elt in merge(&[1, 2, 3], &[2, 3, 4]) { -/// /* loop body */ -/// } -/// ``` -pub fn merge<I, J>(i: I, j: J) -> Merge<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter> - where I: IntoIterator, - J: IntoIterator<Item = I::Item>, - I::Item: PartialOrd -{ - Merge { - merge: MergeCore { - a: i.into_iter().peekable(), - b: j.into_iter().peekable(), - fused: None, - }, - } -} - -impl<I, J> Iterator for Merge<I, J> - where I: Iterator, - J: Iterator<Item = I::Item>, - I::Item: PartialOrd -{ - type Item = I::Item; - - fn next(&mut self) -> Option<I::Item> { - self.merge.next_with(|a, b| a <= b) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.merge.size_hint() - } -} - -/// An iterator adaptor that merges the two base iterators in ascending order. -/// If both base iterators are sorted (ascending), the result is sorted. -/// -/// Iterator element type is `I::Item`. -/// -/// See [`.merge_by()`](../trait.Itertools.html#method.merge_by) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MergeBy<I, J, F> - where I: Iterator, - J: Iterator<Item = I::Item> -{ - merge: MergeCore<I, J>, - cmp: F, -} - -impl<I, J, F> fmt::Debug for MergeBy<I, J, F> - where I: Iterator + fmt::Debug, J: Iterator<Item = I::Item> + fmt::Debug, - I::Item: fmt::Debug, -{ - debug_fmt_fields!(MergeBy, merge.a, merge.b); -} - -/// Create a `MergeBy` iterator. -pub fn merge_by_new<I, J, F>(a: I, b: J, cmp: F) -> MergeBy<I, J, F> - where I: Iterator, - J: Iterator<Item = I::Item> -{ - MergeBy { - merge: MergeCore { - a: a.peekable(), - b: b.peekable(), - fused: None, - }, - cmp: cmp, - } -} - -impl<I, J, F> Clone for MergeBy<I, J, F> - where I: Iterator, - J: Iterator<Item = I::Item>, - Peekable<I>: Clone, - Peekable<J>: Clone, - F: Clone -{ - fn clone(&self) -> Self { - clone_fields!(MergeBy, self, merge, cmp) - } -} - -impl<I, J, F> Iterator for MergeBy<I, J, F> - where I: Iterator, - J: Iterator<Item = I::Item>, - F: FnMut(&I::Item, &I::Item) -> bool -{ - type Item = I::Item; - - fn next(&mut self) -> Option<I::Item> { - self.merge.next_with(&mut self.cmp) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.merge.size_hint() - } -} - -#[derive(Clone, Debug)] -pub struct CoalesceCore<I> - where I: Iterator -{ - iter: I, - last: Option<I::Item>, -} - -impl<I> CoalesceCore<I> - where I: Iterator -{ - fn next_with<F>(&mut self, mut f: F) -> Option<I::Item> - where F: FnMut(I::Item, I::Item) -> Result<I::Item, (I::Item, I::Item)> - { - // this fuses the iterator - let mut last = match self.last.take() { - None => return None, - Some(x) => x, - }; - for next in &mut self.iter { - match f(last, next) { - Ok(joined) => last = joined, - Err((last_, next_)) => { - self.last = Some(next_); - return Some(last_); - } - } - } - - Some(last) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let (low, hi) = size_hint::add_scalar(self.iter.size_hint(), - self.last.is_some() as usize); - ((low > 0) as usize, hi) - } -} - -/// An iterator adaptor that may join together adjacent elements. -/// -/// See [`.coalesce()`](../trait.Itertools.html#method.coalesce) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Coalesce<I, F> - where I: Iterator -{ - iter: CoalesceCore<I>, - f: F, -} - -impl<I: Clone, F: Clone> Clone for Coalesce<I, F> - where I: Iterator, - I::Item: Clone -{ - fn clone(&self) -> Self { - clone_fields!(Coalesce, self, iter, f) - } -} - -impl<I, F> fmt::Debug for Coalesce<I, F> - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, -{ - debug_fmt_fields!(Coalesce, iter); -} - -/// Create a new `Coalesce`. -pub fn coalesce<I, F>(mut iter: I, f: F) -> Coalesce<I, F> - where I: Iterator -{ - Coalesce { - iter: CoalesceCore { - last: iter.next(), - iter: iter, - }, - f: f, - } -} - -impl<I, F> Iterator for Coalesce<I, F> - where I: Iterator, - F: FnMut(I::Item, I::Item) -> Result<I::Item, (I::Item, I::Item)> -{ - type Item = I::Item; - - fn next(&mut self) -> Option<I::Item> { - self.iter.next_with(&mut self.f) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } -} - -/// An iterator adaptor that removes repeated duplicates. -/// -/// See [`.dedup()`](../trait.Itertools.html#method.dedup) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Dedup<I> - where I: Iterator -{ - iter: CoalesceCore<I>, -} - -impl<I: Clone> Clone for Dedup<I> - where I: Iterator, - I::Item: Clone -{ - fn clone(&self) -> Self { - clone_fields!(Dedup, self, iter) - } -} - -/// Create a new `Dedup`. -pub fn dedup<I>(mut iter: I) -> Dedup<I> - where I: Iterator -{ - Dedup { - iter: CoalesceCore { - last: iter.next(), - iter: iter, - }, - } -} - -impl<I> fmt::Debug for Dedup<I> - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, -{ - debug_fmt_fields!(Dedup, iter); -} - -impl<I> Iterator for Dedup<I> - where I: Iterator, - I::Item: PartialEq -{ - type Item = I::Item; - - fn next(&mut self) -> Option<I::Item> { - self.iter.next_with(|x, y| { - if x == y { Ok(x) } else { Err((x, y)) } - }) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } - - fn fold<Acc, G>(self, mut accum: Acc, mut f: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, - { - if let Some(mut last) = self.iter.last { - accum = self.iter.iter.fold(accum, |acc, elt| { - if elt == last { - acc - } else { - f(acc, replace(&mut last, elt)) - } - }); - f(accum, last) - } else { - accum - } - } -} - -/// An iterator adaptor that borrows from a `Clone`-able iterator -/// to only pick off elements while the predicate returns `true`. -/// -/// See [`.take_while_ref()`](../trait.Itertools.html#method.take_while_ref) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct TakeWhileRef<'a, I: 'a, F> { - iter: &'a mut I, - f: F, -} - -impl<'a, I, F> fmt::Debug for TakeWhileRef<'a, I, F> - where I: Iterator + fmt::Debug, -{ - debug_fmt_fields!(TakeWhileRef, iter); -} - -/// Create a new `TakeWhileRef` from a reference to clonable iterator. -pub fn take_while_ref<I, F>(iter: &mut I, f: F) -> TakeWhileRef<I, F> - where I: Iterator + Clone -{ - TakeWhileRef { iter: iter, f: f } -} - -impl<'a, I, F> Iterator for TakeWhileRef<'a, I, F> - where I: Iterator + Clone, - F: FnMut(&I::Item) -> bool -{ - type Item = I::Item; - - fn next(&mut self) -> Option<I::Item> { - let old = self.iter.clone(); - match self.iter.next() { - None => None, - Some(elt) => { - if (self.f)(&elt) { - Some(elt) - } else { - *self.iter = old; - None - } - } - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let (_, hi) = self.iter.size_hint(); - (0, hi) - } -} - -/// An iterator adaptor that filters `Option<A>` iterator elements -/// and produces `A`. Stops on the first `None` encountered. -/// -/// See [`.while_some()`](../trait.Itertools.html#method.while_some) for more information. -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct WhileSome<I> { - iter: I, -} - -/// Create a new `WhileSome<I>`. -pub fn while_some<I>(iter: I) -> WhileSome<I> { - WhileSome { iter: iter } -} - -impl<I, A> Iterator for WhileSome<I> - where I: Iterator<Item = Option<A>> -{ - type Item = A; - - fn next(&mut self) -> Option<A> { - match self.iter.next() { - None | Some(None) => None, - Some(elt) => elt, - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let sh = self.iter.size_hint(); - (0, sh.1) - } -} - -/// An iterator to iterate through all combinations in a `Clone`-able iterator that produces tuples -/// of a specific size. -/// -/// See [`.tuple_combinations()`](../trait.Itertools.html#method.tuple_combinations) for more -/// information. -#[derive(Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct TupleCombinations<I, T> - where I: Iterator, - T: HasCombination<I> -{ - iter: T::Combination, - _mi: PhantomData<I>, - _mt: PhantomData<T> -} - -pub trait HasCombination<I>: Sized { - type Combination: From<I> + Iterator<Item = Self>; -} - -/// Create a new `TupleCombinations` from a clonable iterator. -pub fn tuple_combinations<T, I>(iter: I) -> TupleCombinations<I, T> - where I: Iterator + Clone, - I::Item: Clone, - T: HasCombination<I>, -{ - TupleCombinations { - iter: T::Combination::from(iter), - _mi: PhantomData, - _mt: PhantomData, - } -} - -impl<I, T> Iterator for TupleCombinations<I, T> - where I: Iterator, - T: HasCombination<I>, -{ - type Item = T; - - fn next(&mut self) -> Option<Self::Item> { - self.iter.next() - } -} - -#[derive(Debug)] -pub struct Tuple1Combination<I> { - iter: I, -} - -impl<I> From<I> for Tuple1Combination<I> { - fn from(iter: I) -> Self { - Tuple1Combination { iter: iter } - } -} - -impl<I: Iterator> Iterator for Tuple1Combination<I> { - type Item = (I::Item,); - - fn next(&mut self) -> Option<Self::Item> { - self.iter.next().map(|x| (x,)) - } -} - -impl<I: Iterator> HasCombination<I> for (I::Item,) { - type Combination = Tuple1Combination<I>; -} - -macro_rules! impl_tuple_combination { - ($C:ident $P:ident ; $A:ident, $($I:ident),* ; $($X:ident)*) => ( - #[derive(Debug)] - pub struct $C<I: Iterator> { - item: Option<I::Item>, - iter: I, - c: $P<I>, - } - - impl<I: Iterator + Clone> From<I> for $C<I> { - fn from(mut iter: I) -> Self { - $C { - item: iter.next(), - iter: iter.clone(), - c: $P::from(iter), - } - } - } - - impl<I: Iterator + Clone> From<I> for $C<Fuse<I>> { - fn from(iter: I) -> Self { - let mut iter = iter.fuse(); - $C { - item: iter.next(), - iter: iter.clone(), - c: $P::from(iter), - } - } - } - - impl<I, $A> Iterator for $C<I> - where I: Iterator<Item = $A> + Clone, - I::Item: Clone - { - type Item = ($($I),*); - - fn next(&mut self) -> Option<Self::Item> { - if let Some(($($X),*,)) = self.c.next() { - let z = self.item.clone().unwrap(); - Some((z, $($X),*)) - } else { - self.item = self.iter.next(); - self.item.clone().and_then(|z| { - self.c = $P::from(self.iter.clone()); - self.c.next().map(|($($X),*,)| (z, $($X),*)) - }) - } - } - } - - impl<I, $A> HasCombination<I> for ($($I),*) - where I: Iterator<Item = $A> + Clone, - I::Item: Clone - { - type Combination = $C<Fuse<I>>; - } - ) -} - -impl_tuple_combination!(Tuple2Combination Tuple1Combination ; A, A, A ; a); -impl_tuple_combination!(Tuple3Combination Tuple2Combination ; A, A, A, A ; a b); -impl_tuple_combination!(Tuple4Combination Tuple3Combination ; A, A, A, A, A; a b c); - - -/// An iterator adapter to simply flatten a structure. -/// -/// See [`.flatten()`](../trait.Itertools.html#method.flatten) for more information. -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Flatten<I, J> { - iter: I, - front: Option<J>, -} - -/// Flatten an iterable of iterables into a single combined sequence of all -/// the elements in the iterables. -/// -/// This is more or less equivalent to `.flat_map` with an identity -/// function. -/// -/// This is an `IntoIterator`-enabled version of the [`.flatten()`][1] adaptor. -/// -/// [1]: trait.Itertools.html#method.flatten -/// -/// ``` -/// use itertools::flatten; -/// -/// let data = vec![vec![1, 2, 3], vec![4, 5, 6]]; -/// -/// itertools::assert_equal(flatten(&data), -/// &[1, 2, 3, 4, 5, 6]); -/// ``` -pub fn flatten<I, J>(iterable: I) -> Flatten<I::IntoIter, J> - where I: IntoIterator, - I::Item: IntoIterator<IntoIter=J, Item=J::Item>, - J: Iterator, -{ - Flatten { - iter: iterable.into_iter(), - front: None, - } -} - -impl<I, J> Iterator for Flatten<I, J> - where I: Iterator, - I::Item: IntoIterator<IntoIter=J, Item=J::Item>, - J: Iterator, -{ - type Item = J::Item; - fn next(&mut self) -> Option<Self::Item> { - loop { - if let Some(ref mut f) = self.front { - match f.next() { - elt @ Some(_) => return elt, - None => { } - } - } - if let Some(next_front) = self.iter.next() { - self.front = Some(next_front.into_iter()); - } else { - break; - } - } - None - } - - // special case to convert segmented iterator into consecutive loops - fn fold<Acc, G>(self, init: Acc, mut f: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, - { - let mut accum = init; - if let Some(iter) = self.front { - accum = fold(iter, accum, &mut f); - } - self.iter.fold(accum, move |accum, iter| fold(iter, accum, &mut f)) - } - -} - -/// An iterator adapter to apply a transformation within a nested `Result`. -/// -/// See [`.map_results()`](../trait.Itertools.html#method.map_results) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MapResults<I, F> { - iter: I, - f: F -} - -/// Create a new `MapResults` iterator. -pub fn map_results<I, F, T, U, E>(iter: I, f: F) -> MapResults<I, F> - where I: Iterator<Item = Result<T, E>>, - F: FnMut(T) -> U, -{ - MapResults { - iter: iter, - f: f, - } -} - -impl<I, F, T, U, E> Iterator for MapResults<I, F> - where I: Iterator<Item = Result<T, E>>, - F: FnMut(T) -> U, -{ - type Item = Result<U, E>; - - fn next(&mut self) -> Option<Self::Item> { - self.iter.next().map(|v| v.map(&mut self.f)) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } - - fn fold<Acc, Fold>(self, init: Acc, mut fold_f: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, - { - let mut f = self.f; - self.iter.fold(init, move |acc, v| fold_f(acc, v.map(&mut f))) - } - - fn collect<C>(self) -> C - where C: FromIterator<Self::Item> - { - let mut f = self.f; - self.iter.map(move |v| v.map(&mut f)).collect() - } -} - -/// An iterator adapter to get the positions of each element that matches a predicate. -/// -/// See [`.positions()`](../trait.Itertools.html#method.positions) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Positions<I, F> { - iter: I, - f: F, - count: usize, -} - -/// Create a new `Positions` iterator. -pub fn positions<I, F>(iter: I, f: F) -> Positions<I, F> - where I: Iterator, - F: FnMut(I::Item) -> bool, -{ - Positions { - iter: iter, - f: f, - count: 0 - } -} - -impl<I, F> Iterator for Positions<I, F> - where I: Iterator, - F: FnMut(I::Item) -> bool, -{ - type Item = usize; - - fn next(&mut self) -> Option<Self::Item> { - while let Some(v) = self.iter.next() { - let i = self.count; - self.count = i + 1; - if (self.f)(v) { - return Some(i); - } - } - None - } - - fn size_hint(&self) -> (usize, Option<usize>) { - (0, self.iter.size_hint().1) - } -} - -impl<I, F> DoubleEndedIterator for Positions<I, F> - where I: DoubleEndedIterator + ExactSizeIterator, - F: FnMut(I::Item) -> bool, -{ - fn next_back(&mut self) -> Option<Self::Item> { - while let Some(v) = self.iter.next_back() { - if (self.f)(v) { - return Some(self.count + self.iter.len()) - } - } - None - } -} - -/// An iterator adapter to apply a mutating function to each element before yielding it. -/// -/// See [`.update()`](../trait.Itertools.html#method.update) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Update<I, F> { - iter: I, - f: F, -} - -/// Create a new `Update` iterator. -pub fn update<I, F>(iter: I, f: F) -> Update<I, F> -where - I: Iterator, - F: FnMut(&mut I::Item), -{ - Update { iter: iter, f: f } -} - -impl<I, F> Iterator for Update<I, F> -where - I: Iterator, - F: FnMut(&mut I::Item), -{ - type Item = I::Item; - - fn next(&mut self) -> Option<Self::Item> { - if let Some(mut v) = self.iter.next() { - (self.f)(&mut v); - Some(v) - } else { - None - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } - - fn fold<Acc, G>(self, init: Acc, mut g: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, - { - let mut f = self.f; - self.iter.fold(init, move |acc, mut v| { f(&mut v); g(acc, v) }) - } - - // if possible, re-use inner iterator specializations in collect - fn collect<C>(self) -> C - where C: FromIterator<Self::Item> - { - let mut f = self.f; - self.iter.map(move |mut v| { f(&mut v); v }).collect() - } -} - -impl<I, F> ExactSizeIterator for Update<I, F> -where - I: ExactSizeIterator, - F: FnMut(&mut I::Item), -{} - -impl<I, F> DoubleEndedIterator for Update<I, F> -where - I: DoubleEndedIterator, - F: FnMut(&mut I::Item), -{ - fn next_back(&mut self) -> Option<Self::Item> { - if let Some(mut v) = self.iter.next_back() { - (self.f)(&mut v); - Some(v) - } else { - None - } - } -} diff --git a/vendor/itertools-0.7.8/src/adaptors/multi_product.rs b/vendor/itertools-0.7.8/src/adaptors/multi_product.rs deleted file mode 100644 index a6796386ed..0000000000 --- a/vendor/itertools-0.7.8/src/adaptors/multi_product.rs +++ /dev/null @@ -1,220 +0,0 @@ -#![cfg(feature = "use_std")] - -use size_hint; -use Itertools; - -#[derive(Clone)] -/// An iterator adaptor that iterates over the cartesian product of -/// multiple iterators of type `I`. -/// -/// An iterator element type is `Vec<I>`. -/// -/// See [`.multi_cartesian_product()`](../trait.Itertools.html#method.multi_cartesian_product) -/// for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MultiProduct<I>(Vec<MultiProductIter<I>>) - where I: Iterator + Clone, - I::Item: Clone; - -/// Create a new cartesian product iterator over an arbitrary number -/// of iterators of the same type. -/// -/// Iterator element is of type `Vec<H::Item::Item>`. -pub fn multi_cartesian_product<H>(iters: H) -> MultiProduct<<H::Item as IntoIterator>::IntoIter> - where H: Iterator, - H::Item: IntoIterator, - <H::Item as IntoIterator>::IntoIter: Clone, - <H::Item as IntoIterator>::Item: Clone -{ - MultiProduct(iters.map(|i| MultiProductIter::new(i.into_iter())).collect()) -} - -#[derive(Clone, Debug)] -/// Holds the state of a single iterator within a MultiProduct. -struct MultiProductIter<I> - where I: Iterator + Clone, - I::Item: Clone -{ - cur: Option<I::Item>, - iter: I, - iter_orig: I, -} - -/// Holds the current state during an iteration of a MultiProduct. -#[derive(Debug)] -enum MultiProductIterState { - StartOfIter, - MidIter { on_first_iter: bool }, -} - -impl<I> MultiProduct<I> - where I: Iterator + Clone, - I::Item: Clone -{ - /// Iterates the rightmost iterator, then recursively iterates iterators - /// to the left if necessary. - /// - /// Returns true if the iteration succeeded, else false. - fn iterate_last( - multi_iters: &mut [MultiProductIter<I>], - mut state: MultiProductIterState - ) -> bool { - use self::MultiProductIterState::*; - - if let Some((last, rest)) = multi_iters.split_last_mut() { - let on_first_iter = match state { - StartOfIter => { - let on_first_iter = !last.in_progress(); - state = MidIter { on_first_iter: on_first_iter }; - on_first_iter - }, - MidIter { on_first_iter } => on_first_iter - }; - - if !on_first_iter { - last.iterate(); - } - - if last.in_progress() { - true - } else if MultiProduct::iterate_last(rest, state) { - last.reset(); - last.iterate(); - // If iterator is None twice consecutively, then iterator is - // empty; whole product is empty. - last.in_progress() - } else { - false - } - } else { - // Reached end of iterator list. On initialisation, return true. - // At end of iteration (final iterator finishes), finish. - match state { - StartOfIter => false, - MidIter { on_first_iter } => on_first_iter - } - } - } - - /// Returns the unwrapped value of the next iteration. - fn curr_iterator(&self) -> Vec<I::Item> { - self.0.iter().map(|multi_iter| { - multi_iter.cur.clone().unwrap() - }).collect() - } - - /// Returns true if iteration has started and has not yet finished; false - /// otherwise. - fn in_progress(&self) -> bool { - if let Some(last) = self.0.last() { - last.in_progress() - } else { - false - } - } -} - -impl<I> MultiProductIter<I> - where I: Iterator + Clone, - I::Item: Clone -{ - fn new(iter: I) -> Self { - MultiProductIter { - cur: None, - iter: iter.clone(), - iter_orig: iter - } - } - - /// Iterate the managed iterator. - fn iterate(&mut self) { - self.cur = self.iter.next(); - } - - /// Reset the managed iterator. - fn reset(&mut self) { - self.iter = self.iter_orig.clone(); - } - - /// Returns true if the current iterator has been started and has not yet - /// finished; false otherwise. - fn in_progress(&self) -> bool { - self.cur.is_some() - } -} - -impl<I> Iterator for MultiProduct<I> - where I: Iterator + Clone, - I::Item: Clone -{ - type Item = Vec<I::Item>; - - fn next(&mut self) -> Option<Self::Item> { - if MultiProduct::iterate_last( - &mut self.0, - MultiProductIterState::StartOfIter - ) { - Some(self.curr_iterator()) - } else { - None - } - } - - fn count(self) -> usize { - if self.0.len() == 0 { - return 0; - } - - if !self.in_progress() { - return self.0.into_iter().fold(1, |acc, multi_iter| { - acc * multi_iter.iter.count() - }); - } - - self.0.into_iter().fold( - 0, - |acc, MultiProductIter { iter, iter_orig, cur: _ }| { - let total_count = iter_orig.count(); - let cur_count = iter.count(); - acc * total_count + cur_count - } - ) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - // Not ExactSizeIterator because size may be larger than usize - if self.0.len() == 0 { - return (0, Some(0)); - } - - if !self.in_progress() { - return self.0.iter().fold((1, Some(1)), |acc, multi_iter| { - size_hint::mul(acc, multi_iter.iter.size_hint()) - }); - } - - self.0.iter().fold( - (0, Some(0)), - |acc, &MultiProductIter { ref iter, ref iter_orig, cur: _ }| { - let cur_size = iter.size_hint(); - let total_size = iter_orig.size_hint(); - size_hint::add(size_hint::mul(acc, total_size), cur_size) - } - ) - } - - fn last(self) -> Option<Self::Item> { - let iter_count = self.0.len(); - - let lasts: Self::Item = self.0.into_iter() - .map(|multi_iter| multi_iter.iter.last()) - .while_some() - .collect(); - - if lasts.len() == iter_count { - Some(lasts) - } else { - None - } - } -} diff --git a/vendor/itertools-0.7.8/src/combinations.rs b/vendor/itertools-0.7.8/src/combinations.rs deleted file mode 100644 index a7744151c9..0000000000 --- a/vendor/itertools-0.7.8/src/combinations.rs +++ /dev/null @@ -1,165 +0,0 @@ - -use std::ops::Index; -use std::fmt; - -/// An iterator to iterate through all the `n`-length combinations in an iterator. -/// -/// See [`.combinations()`](../trait.Itertools.html#method.combinations) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Combinations<I: Iterator> { - n: usize, - indices: Vec<usize>, - pool: LazyBuffer<I>, - first: bool, -} - -impl<I> fmt::Debug for Combinations<I> - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, -{ - debug_fmt_fields!(Combinations, n, indices, pool, first); -} - -/// Create a new `Combinations` from a clonable iterator. -pub fn combinations<I>(iter: I, n: usize) -> Combinations<I> - where I: Iterator -{ - let mut indices: Vec<usize> = Vec::with_capacity(n); - for i in 0..n { - indices.push(i); - } - let mut pool: LazyBuffer<I> = LazyBuffer::new(iter); - - for _ in 0..n { - if !pool.get_next() { - break; - } - } - - Combinations { - n: n, - indices: indices, - pool: pool, - first: true, - } -} - -impl<I> Iterator for Combinations<I> - where I: Iterator, - I::Item: Clone -{ - type Item = Vec<I::Item>; - fn next(&mut self) -> Option<Self::Item> { - let mut pool_len = self.pool.len(); - if self.pool.is_done() { - if pool_len == 0 || self.n > pool_len { - return None; - } - } - - if self.first { - self.first = false; - } else if self.n == 0 { - return None; - } else { - // Scan from the end, looking for an index to increment - let mut i: usize = self.n - 1; - - // Check if we need to consume more from the iterator - if self.indices[i] == pool_len - 1 && !self.pool.is_done() { - if self.pool.get_next() { - pool_len += 1; - } - } - - while self.indices[i] == i + pool_len - self.n { - if i > 0 { - i -= 1; - } else { - // Reached the last combination - return None; - } - } - - // Increment index, and reset the ones to its right - self.indices[i] += 1; - let mut j = i + 1; - while j < self.n { - self.indices[j] = self.indices[j - 1] + 1; - j += 1; - } - } - - // Create result vector based on the indices - let mut result = Vec::with_capacity(self.n); - for i in self.indices.iter() { - result.push(self.pool[*i].clone()); - } - Some(result) - } -} - -#[derive(Debug)] -struct LazyBuffer<I: Iterator> { - it: I, - done: bool, - buffer: Vec<I::Item>, -} - -impl<I> LazyBuffer<I> - where I: Iterator -{ - pub fn new(it: I) -> LazyBuffer<I> { - let mut it = it; - let mut buffer = Vec::new(); - let done; - if let Some(first) = it.next() { - buffer.push(first); - done = false; - } else { - done = true; - } - LazyBuffer { - it: it, - done: done, - buffer: buffer, - } - } - - pub fn len(&self) -> usize { - self.buffer.len() - } - - pub fn is_done(&self) -> bool { - self.done - } - - pub fn get_next(&mut self) -> bool { - if self.done { - return false; - } - let next_item = self.it.next(); - match next_item { - Some(x) => { - self.buffer.push(x); - true - } - None => { - self.done = true; - false - } - } - } -} - -impl<I> Index<usize> for LazyBuffer<I> - where I: Iterator, - I::Item: Sized -{ - type Output = I::Item; - - fn index<'b>(&'b self, _index: usize) -> &'b I::Item { - self.buffer.index(_index) - } -} - diff --git a/vendor/itertools-0.7.8/src/concat_impl.rs b/vendor/itertools-0.7.8/src/concat_impl.rs deleted file mode 100644 index 05b370e1c6..0000000000 --- a/vendor/itertools-0.7.8/src/concat_impl.rs +++ /dev/null @@ -1,22 +0,0 @@ -use Itertools; - -/// Combine all an iterator's elements into one element by using `Extend`. -/// -/// `IntoIterator`-enabled version of `.concat()` -/// -/// This combinator will extend the first item with each of the rest of the -/// items of the iterator. If the iterator is empty, the default value of -/// `I::Item` is returned. -/// -/// ```rust -/// use itertools::concat; -/// -/// let input = vec![vec![1], vec![2, 3], vec![4, 5, 6]]; -/// assert_eq!(concat(input), vec![1, 2, 3, 4, 5, 6]); -/// ``` -pub fn concat<I>(iterable: I) -> I::Item - where I: IntoIterator, - I::Item: Extend<<<I as IntoIterator>::Item as IntoIterator>::Item> + IntoIterator + Default -{ - iterable.into_iter().fold1(|mut a, b| { a.extend(b); a }).unwrap_or_else(|| <_>::default()) -} diff --git a/vendor/itertools-0.7.8/src/cons_tuples_impl.rs b/vendor/itertools-0.7.8/src/cons_tuples_impl.rs deleted file mode 100644 index 9b27e7580f..0000000000 --- a/vendor/itertools-0.7.8/src/cons_tuples_impl.rs +++ /dev/null @@ -1,68 +0,0 @@ - -macro_rules! impl_cons_iter( - ($_A:ident, $_B:ident, ) => (); // stop - - ($A:ident, $($B:ident,)*) => ( - impl_cons_iter!($($B,)*); - #[allow(non_snake_case)] - impl<X, Iter, $($B),*> Iterator for ConsTuples<Iter, (($($B,)*), X)> - where Iter: Iterator<Item = (($($B,)*), X)>, - { - type Item = ($($B,)* X, ); - fn next(&mut self) -> Option<Self::Item> { - self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, )) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } - fn fold<Acc, Fold>(self, accum: Acc, mut f: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, - { - self.iter.fold(accum, move |acc, (($($B,)*), x)| f(acc, ($($B,)* x, ))) - } - } - - #[allow(non_snake_case)] - impl<X, Iter, $($B),*> DoubleEndedIterator for ConsTuples<Iter, (($($B,)*), X)> - where Iter: DoubleEndedIterator<Item = (($($B,)*), X)>, - { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, )) - } - } - - ); -); - -impl_cons_iter!(A, B, C, D, E, F, G, H,); - -/// An iterator that maps an iterator of tuples like -/// `((A, B), C)` to an iterator of `(A, B, C)`. -/// -/// Used by the `iproduct!()` macro. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct ConsTuples<I, J> - where I: Iterator<Item=J>, -{ - iter: I, -} - -impl<I, J> Clone for ConsTuples<I, J> - where I: Clone + Iterator<Item=J>, -{ - fn clone(&self) -> Self { - ConsTuples { - iter: self.iter.clone(), - } - } -} - -/// Create an iterator that maps for example iterators of -/// `((A, B), C)` to `(A, B, C)`. -pub fn cons_tuples<I, J>(iterable: I) -> ConsTuples<I, J> - where I: Iterator<Item=J> -{ - ConsTuples { iter: iterable.into_iter() } -} diff --git a/vendor/itertools-0.7.8/src/diff.rs b/vendor/itertools-0.7.8/src/diff.rs deleted file mode 100644 index 2951bc422e..0000000000 --- a/vendor/itertools-0.7.8/src/diff.rs +++ /dev/null @@ -1,61 +0,0 @@ -//! "Diff"ing iterators for caching elements to sequential collections without requiring the new -//! elements' iterator to be `Clone`. -//! -//! - [**Diff**](./enum.Diff.html) (produced by the [**diff_with**](./fn.diff_with.html) function) -//! describes the difference between two non-`Clone` iterators `I` and `J` after breaking ASAP from -//! a lock-step comparison. - -use free::put_back; -use structs::PutBack; - -/// A type returned by the [`diff_with`](./fn.diff_with.html) function. -/// -/// `Diff` represents the way in which the elements yielded by the iterator `I` differ to some -/// iterator `J`. -pub enum Diff<I, J> - where I: Iterator, - J: Iterator -{ - /// The index of the first non-matching element along with both iterator's remaining elements - /// starting with the first mis-match. - FirstMismatch(usize, PutBack<I>, PutBack<J>), - /// The total number of elements that were in `J` along with the remaining elements of `I`. - Shorter(usize, PutBack<I>), - /// The total number of elements that were in `I` along with the remaining elements of `J`. - Longer(usize, PutBack<J>), -} - -/// Compares every element yielded by both `i` and `j` with the given function in lock-step and -/// returns a `Diff` which describes how `j` differs from `i`. -/// -/// If the number of elements yielded by `j` is less than the number of elements yielded by `i`, -/// the number of `j` elements yielded will be returned along with `i`'s remaining elements as -/// `Diff::Shorter`. -/// -/// If the two elements of a step differ, the index of those elements along with the remaining -/// elements of both `i` and `j` are returned as `Diff::FirstMismatch`. -/// -/// If `i` becomes exhausted before `j` becomes exhausted, the number of elements in `i` along with -/// the remaining `j` elements will be returned as `Diff::Longer`. -pub fn diff_with<I, J, F>(i: I, j: J, is_equal: F) - -> Option<Diff<I::IntoIter, J::IntoIter>> - where I: IntoIterator, - J: IntoIterator, - F: Fn(&I::Item, &J::Item) -> bool -{ - let mut i = i.into_iter(); - let mut j = j.into_iter(); - let mut idx = 0; - while let Some(i_elem) = i.next() { - match j.next() { - None => return Some(Diff::Shorter(idx, put_back(i).with_value(i_elem))), - Some(j_elem) => if !is_equal(&i_elem, &j_elem) { - let remaining_i = put_back(i).with_value(i_elem); - let remaining_j = put_back(j).with_value(j_elem); - return Some(Diff::FirstMismatch(idx, remaining_i, remaining_j)); - }, - } - idx += 1; - } - j.next().map(|j_elem| Diff::Longer(idx, put_back(j).with_value(j_elem))) -} diff --git a/vendor/itertools-0.7.8/src/either_or_both.rs b/vendor/itertools-0.7.8/src/either_or_both.rs deleted file mode 100644 index 9f0f3133e7..0000000000 --- a/vendor/itertools-0.7.8/src/either_or_both.rs +++ /dev/null @@ -1,10 +0,0 @@ -/// Value that either holds a single A or B, or both. -#[derive(Clone, PartialEq, Eq, Debug)] -pub enum EitherOrBoth<A, B> { - /// Both values are present. - Both(A, B), - /// Only the left value of type `A` is present. - Left(A), - /// Only the right value of type `B` is present. - Right(B), -} diff --git a/vendor/itertools-0.7.8/src/format.rs b/vendor/itertools-0.7.8/src/format.rs deleted file mode 100644 index c42806b01c..0000000000 --- a/vendor/itertools-0.7.8/src/format.rs +++ /dev/null @@ -1,113 +0,0 @@ -use std::fmt; -use std::cell::RefCell; - -/// Format all iterator elements lazily, separated by `sep`. -/// -/// The format value can only be formatted once, after that the iterator is -/// exhausted. -/// -/// See [`.format_with()`](../trait.Itertools.html#method.format_with) for more information. -pub struct FormatWith<'a, I, F> { - sep: &'a str, - /// FormatWith uses interior mutability because Display::fmt takes &self. - inner: RefCell<Option<(I, F)>>, -} - -/// Format all iterator elements lazily, separated by `sep`. -/// -/// The format value can only be formatted once, after that the iterator is -/// exhausted. -/// -/// See [`.format()`](../trait.Itertools.html#method.format) -/// for more information. -#[derive(Clone)] -pub struct Format<'a, I> { - sep: &'a str, - /// Format uses interior mutability because Display::fmt takes &self. - inner: RefCell<Option<I>>, -} - -pub fn new_format<'a, I, F>(iter: I, separator: &'a str, f: F) -> FormatWith<'a, I, F> - where I: Iterator, - F: FnMut(I::Item, &mut FnMut(&fmt::Display) -> fmt::Result) -> fmt::Result -{ - FormatWith { - sep: separator, - inner: RefCell::new(Some((iter, f))), - } -} - -pub fn new_format_default<'a, I>(iter: I, separator: &'a str) -> Format<'a, I> - where I: Iterator, -{ - Format { - sep: separator, - inner: RefCell::new(Some(iter)), - } -} - -impl<'a, I, F> fmt::Display for FormatWith<'a, I, F> - where I: Iterator, - F: FnMut(I::Item, &mut FnMut(&fmt::Display) -> fmt::Result) -> fmt::Result -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let (mut iter, mut format) = match self.inner.borrow_mut().take() { - Some(t) => t, - None => panic!("FormatWith: was already formatted once"), - }; - - if let Some(fst) = iter.next() { - try!(format(fst, &mut |disp: &fmt::Display| disp.fmt(f))); - for elt in iter { - if self.sep.len() > 0 { - - try!(f.write_str(self.sep)); - } - try!(format(elt, &mut |disp: &fmt::Display| disp.fmt(f))); - } - } - Ok(()) - } -} - -impl<'a, I> Format<'a, I> - where I: Iterator, -{ - fn format<F>(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result - where F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result, - { - let mut iter = match self.inner.borrow_mut().take() { - Some(t) => t, - None => panic!("Format: was already formatted once"), - }; - - if let Some(fst) = iter.next() { - try!(cb(&fst, f)); - for elt in iter { - if self.sep.len() > 0 { - try!(f.write_str(self.sep)); - } - try!(cb(&elt, f)); - } - } - Ok(()) - } -} - -macro_rules! impl_format { - ($($fmt_trait:ident)*) => { - $( - impl<'a, I> fmt::$fmt_trait for Format<'a, I> - where I: Iterator, - I::Item: fmt::$fmt_trait, - { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.format(f, fmt::$fmt_trait::fmt) - } - } - )* - } -} - -impl_format!{Display Debug - UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer} diff --git a/vendor/itertools-0.7.8/src/free.rs b/vendor/itertools-0.7.8/src/free.rs deleted file mode 100644 index 1563679f9d..0000000000 --- a/vendor/itertools-0.7.8/src/free.rs +++ /dev/null @@ -1,231 +0,0 @@ -//! Free functions that create iterator adaptors or call iterator methods. -//! -//! The benefit of free functions is that they accept any `IntoIterator` as -//! argument, so the resulting code may be easier to read. - -#[cfg(feature = "use_std")] -use std::fmt::Display; -use std::iter::{self, Zip}; -#[cfg(feature = "use_std")] -use Itertools; - -pub use adaptors::{ - interleave, - merge, - put_back, -}; -#[cfg(feature = "use_std")] -pub use put_back_n_impl::put_back_n; -#[cfg(feature = "use_std")] -pub use multipeek_impl::multipeek; -#[cfg(feature = "use_std")] -pub use kmerge_impl::kmerge; -pub use zip_eq_impl::zip_eq; -pub use merge_join::merge_join_by; -#[cfg(feature = "use_std")] -pub use rciter_impl::rciter; - -/// Iterate `iterable` with a running index. -/// -/// `IntoIterator` enabled version of `.enumerate()`. -/// -/// ``` -/// use itertools::enumerate; -/// -/// for (i, elt) in enumerate(&[1, 2, 3]) { -/// /* loop body */ -/// } -/// ``` -pub fn enumerate<I>(iterable: I) -> iter::Enumerate<I::IntoIter> - where I: IntoIterator -{ - iterable.into_iter().enumerate() -} - -/// Iterate `iterable` in reverse. -/// -/// `IntoIterator` enabled version of `.rev()`. -/// -/// ``` -/// use itertools::rev; -/// -/// for elt in rev(&[1, 2, 3]) { -/// /* loop body */ -/// } -/// ``` -pub fn rev<I>(iterable: I) -> iter::Rev<I::IntoIter> - where I: IntoIterator, - I::IntoIter: DoubleEndedIterator -{ - iterable.into_iter().rev() -} - -/// Iterate `i` and `j` in lock step. -/// -/// `IntoIterator` enabled version of `i.zip(j)`. -/// -/// ``` -/// use itertools::zip; -/// -/// let data = [1, 2, 3, 4, 5]; -/// for (a, b) in zip(&data, &data[1..]) { -/// /* loop body */ -/// } -/// ``` -pub fn zip<I, J>(i: I, j: J) -> Zip<I::IntoIter, J::IntoIter> - where I: IntoIterator, - J: IntoIterator -{ - i.into_iter().zip(j) -} - -/// Create an iterator that first iterates `i` and then `j`. -/// -/// `IntoIterator` enabled version of `i.chain(j)`. -/// -/// ``` -/// use itertools::chain; -/// -/// for elt in chain(&[1, 2, 3], &[4]) { -/// /* loop body */ -/// } -/// ``` -pub fn chain<I, J>(i: I, j: J) -> iter::Chain<<I as IntoIterator>::IntoIter, <J as IntoIterator>::IntoIter> - where I: IntoIterator, - J: IntoIterator<Item = I::Item> -{ - i.into_iter().chain(j) -} - -/// Create an iterator that clones each element from &T to T -/// -/// `IntoIterator` enabled version of `i.cloned()`. -/// -/// ``` -/// use itertools::cloned; -/// -/// assert_eq!(cloned(b"abc").next(), Some(b'a')); -/// ``` -pub fn cloned<'a, I, T: 'a>(iterable: I) -> iter::Cloned<I::IntoIter> - where I: IntoIterator<Item=&'a T>, - T: Clone, -{ - iterable.into_iter().cloned() -} - -/// Perform a fold operation over the iterable. -/// -/// `IntoIterator` enabled version of `i.fold(init, f)` -/// -/// ``` -/// use itertools::fold; -/// -/// assert_eq!(fold(&[1., 2., 3.], 0., |a, &b| f32::max(a, b)), 3.); -/// ``` -pub fn fold<I, B, F>(iterable: I, init: B, f: F) -> B - where I: IntoIterator, - F: FnMut(B, I::Item) -> B -{ - iterable.into_iter().fold(init, f) -} - -/// Test whether the predicate holds for all elements in the iterable. -/// -/// `IntoIterator` enabled version of `i.all(f)` -/// -/// ``` -/// use itertools::all; -/// -/// assert!(all(&[1, 2, 3], |elt| *elt > 0)); -/// ``` -pub fn all<I, F>(iterable: I, f: F) -> bool - where I: IntoIterator, - F: FnMut(I::Item) -> bool -{ - iterable.into_iter().all(f) -} - -/// Test whether the predicate holds for any elements in the iterable. -/// -/// `IntoIterator` enabled version of `i.any(f)` -/// -/// ``` -/// use itertools::any; -/// -/// assert!(any(&[0, -1, 2], |elt| *elt > 0)); -/// ``` -pub fn any<I, F>(iterable: I, f: F) -> bool - where I: IntoIterator, - F: FnMut(I::Item) -> bool -{ - iterable.into_iter().any(f) -} - -/// Return the maximum value of the iterable. -/// -/// `IntoIterator` enabled version of `i.max()`. -/// -/// ``` -/// use itertools::max; -/// -/// assert_eq!(max(0..10), Some(9)); -/// ``` -pub fn max<I>(iterable: I) -> Option<I::Item> - where I: IntoIterator, - I::Item: Ord -{ - iterable.into_iter().max() -} - -/// Return the minimum value of the iterable. -/// -/// `IntoIterator` enabled version of `i.min()`. -/// -/// ``` -/// use itertools::min; -/// -/// assert_eq!(min(0..10), Some(0)); -/// ``` -pub fn min<I>(iterable: I) -> Option<I::Item> - where I: IntoIterator, - I::Item: Ord -{ - iterable.into_iter().min() -} - - -/// Combine all iterator elements into one String, seperated by `sep`. -/// -/// `IntoIterator` enabled version of `iterable.join(sep)`. -/// -/// ``` -/// use itertools::join; -/// -/// assert_eq!(join(&[1, 2, 3], ", "), "1, 2, 3"); -/// ``` -#[cfg(feature = "use_std")] -pub fn join<I>(iterable: I, sep: &str) -> String - where I: IntoIterator, - I::Item: Display -{ - iterable.into_iter().join(sep) -} - -/// Collect all the iterable's elements into a sorted vector in ascending order. -/// -/// `IntoIterator` enabled version of `iterable.sorted()`. -/// -/// ``` -/// use itertools::sorted; -/// use itertools::assert_equal; -/// -/// assert_equal(sorted("rust".chars()), "rstu".chars()); -/// ``` -#[cfg(feature = "use_std")] -pub fn sorted<I>(iterable: I) -> Vec<I::Item> - where I: IntoIterator, - I::Item: Ord -{ - iterable.into_iter().sorted() -} - diff --git a/vendor/itertools-0.7.8/src/group_map.rs b/vendor/itertools-0.7.8/src/group_map.rs deleted file mode 100644 index be9f8420d8..0000000000 --- a/vendor/itertools-0.7.8/src/group_map.rs +++ /dev/null @@ -1,22 +0,0 @@ -#![cfg(feature = "use_std")] - -use std::collections::HashMap; -use std::hash::Hash; -use std::iter::Iterator; - -/// Return a `HashMap` of keys mapped to a list of their corresponding values. -/// -/// See [`.into_group_map()`](../trait.Itertools.html#method.into_group_map) -/// for more information. -pub fn into_group_map<I, K, V>(iter: I) -> HashMap<K, Vec<V>> - where I: Iterator<Item=(K, V)>, - K: Hash + Eq, -{ - let mut lookup = HashMap::new(); - - for (key, val) in iter { - lookup.entry(key).or_insert(Vec::new()).push(val); - } - - lookup -} \ No newline at end of file diff --git a/vendor/itertools-0.7.8/src/groupbylazy.rs b/vendor/itertools-0.7.8/src/groupbylazy.rs deleted file mode 100644 index ff253e845d..0000000000 --- a/vendor/itertools-0.7.8/src/groupbylazy.rs +++ /dev/null @@ -1,571 +0,0 @@ -use std::cell::{Cell, RefCell}; -use std::vec; - -/// A trait to unify FnMut for GroupBy with the chunk key in IntoChunks -trait KeyFunction<A> { - type Key; - fn call_mut(&mut self, arg: A) -> Self::Key; -} - -impl<'a, A, K, F: ?Sized> KeyFunction<A> for F - where F: FnMut(A) -> K -{ - type Key = K; - #[inline] - fn call_mut(&mut self, arg: A) -> Self::Key { - (*self)(arg) - } -} - - -/// ChunkIndex acts like the grouping key function for IntoChunks -#[derive(Debug)] -struct ChunkIndex { - size: usize, - index: usize, - key: usize, -} - -impl ChunkIndex { - #[inline(always)] - fn new(size: usize) -> Self { - ChunkIndex { - size: size, - index: 0, - key: 0, - } - } -} - -impl<'a, A> KeyFunction<A> for ChunkIndex { - type Key = usize; - #[inline(always)] - fn call_mut(&mut self, _arg: A) -> Self::Key { - if self.index == self.size { - self.key += 1; - self.index = 0; - } - self.index += 1; - self.key - } -} - - -struct GroupInner<K, I, F> - where I: Iterator -{ - key: F, - iter: I, - current_key: Option<K>, - current_elt: Option<I::Item>, - /// flag set if iterator is exhausted - done: bool, - /// Index of group we are currently buffering or visiting - top_group: usize, - /// Least index for which we still have elements buffered - oldest_buffered_group: usize, - /// Group index for `buffer[0]` -- the slots - /// bottom_group..oldest_buffered_group are unused and will be erased when - /// that range is large enough. - bottom_group: usize, - /// Buffered groups, from `bottom_group` (index 0) to `top_group`. - buffer: Vec<vec::IntoIter<I::Item>>, - /// index of last group iter that was dropped, usize::MAX == none - dropped_group: usize, -} - -impl<K, I, F> GroupInner<K, I, F> - where I: Iterator, - F: for<'a> KeyFunction<&'a I::Item, Key=K>, - K: PartialEq, -{ - /// `client`: Index of group that requests next element - #[inline(always)] - fn step(&mut self, client: usize) -> Option<I::Item> { - /* - println!("client={}, bottom_group={}, oldest_buffered_group={}, top_group={}, buffers=[{}]", - client, self.bottom_group, self.oldest_buffered_group, - self.top_group, - self.buffer.iter().map(|elt| elt.len()).format(", ")); - */ - if client < self.oldest_buffered_group { - None - } else if client < self.top_group || - (client == self.top_group && - self.buffer.len() > self.top_group - self.bottom_group) - { - self.lookup_buffer(client) - } else if self.done { - None - } else if self.top_group == client { - self.step_current() - } else { - self.step_buffering(client) - } - } - - #[inline(never)] - fn lookup_buffer(&mut self, client: usize) -> Option<I::Item> { - // if `bufidx` doesn't exist in self.buffer, it might be empty - let bufidx = client - self.bottom_group; - if client < self.oldest_buffered_group { - return None; - } - let elt = self.buffer.get_mut(bufidx).and_then(|queue| queue.next()); - if elt.is_none() && client == self.oldest_buffered_group { - // FIXME: VecDeque is unfortunately not zero allocation when empty, - // so we do this job manually. - // `bottom_group..oldest_buffered_group` is unused, and if it's large enough, erase it. - self.oldest_buffered_group += 1; - // skip forward further empty queues too - while self.buffer.get(self.oldest_buffered_group - self.bottom_group) - .map_or(false, |buf| buf.len() == 0) - { - self.oldest_buffered_group += 1; - } - - let nclear = self.oldest_buffered_group - self.bottom_group; - if nclear > 0 && nclear >= self.buffer.len() / 2 { - let mut i = 0; - self.buffer.retain(|buf| { - i += 1; - debug_assert!(buf.len() == 0 || i > nclear); - i > nclear - }); - self.bottom_group = self.oldest_buffered_group; - } - } - elt - } - - /// Take the next element from the iterator, and set the done - /// flag if exhausted. Must not be called after done. - #[inline(always)] - fn next_element(&mut self) -> Option<I::Item> { - debug_assert!(!self.done); - match self.iter.next() { - None => { self.done = true; None } - otherwise => otherwise, - } - } - - - #[inline(never)] - fn step_buffering(&mut self, client: usize) -> Option<I::Item> { - // requested a later group -- walk through the current group up to - // the requested group index, and buffer the elements (unless - // the group is marked as dropped). - // Because the `Groups` iterator is always the first to request - // each group index, client is the next index efter top_group. - debug_assert!(self.top_group + 1 == client); - let mut group = Vec::new(); - - if let Some(elt) = self.current_elt.take() { - if self.top_group != self.dropped_group { - group.push(elt); - } - } - let mut first_elt = None; // first element of the next group - - while let Some(elt) = self.next_element() { - let key = self.key.call_mut(&elt); - match self.current_key.take() { - None => {} - Some(old_key) => if old_key != key { - self.current_key = Some(key); - first_elt = Some(elt); - break; - }, - } - self.current_key = Some(key); - if self.top_group != self.dropped_group { - group.push(elt); - } - } - - if self.top_group != self.dropped_group { - self.push_next_group(group); - } - if first_elt.is_some() { - self.top_group += 1; - debug_assert!(self.top_group == client); - } - first_elt - } - - fn push_next_group(&mut self, group: Vec<I::Item>) { - // When we add a new buffered group, fill up slots between oldest_buffered_group and top_group - while self.top_group - self.bottom_group > self.buffer.len() { - if self.buffer.is_empty() { - self.bottom_group += 1; - self.oldest_buffered_group += 1; - } else { - self.buffer.push(Vec::new().into_iter()); - } - } - self.buffer.push(group.into_iter()); - debug_assert!(self.top_group + 1 - self.bottom_group == self.buffer.len()); - } - - /// This is the immediate case, where we use no buffering - #[inline] - fn step_current(&mut self) -> Option<I::Item> { - debug_assert!(!self.done); - if let elt @ Some(..) = self.current_elt.take() { - return elt; - } - match self.next_element() { - None => None, - Some(elt) => { - let key = self.key.call_mut(&elt); - match self.current_key.take() { - None => {} - Some(old_key) => if old_key != key { - self.current_key = Some(key); - self.current_elt = Some(elt); - self.top_group += 1; - return None; - }, - } - self.current_key = Some(key); - Some(elt) - } - } - } - - /// Request the just started groups' key. - /// - /// `client`: Index of group - /// - /// **Panics** if no group key is available. - fn group_key(&mut self, client: usize) -> K { - // This can only be called after we have just returned the first - // element of a group. - // Perform this by simply buffering one more element, grabbing the - // next key. - debug_assert!(!self.done); - debug_assert!(client == self.top_group); - debug_assert!(self.current_key.is_some()); - debug_assert!(self.current_elt.is_none()); - let old_key = self.current_key.take().unwrap(); - if let Some(elt) = self.next_element() { - let key = self.key.call_mut(&elt); - if old_key != key { - self.top_group += 1; - } - self.current_key = Some(key); - self.current_elt = Some(elt); - } - old_key - } -} - -impl<K, I, F> GroupInner<K, I, F> - where I: Iterator, -{ - /// Called when a group is dropped - fn drop_group(&mut self, client: usize) { - // It's only useful to track the maximal index - if self.dropped_group == !0 || client > self.dropped_group { - self.dropped_group = client; - } - } -} - -/// `GroupBy` is the storage for the lazy grouping operation. -/// -/// If the groups are consumed in their original order, or if each -/// group is dropped without keeping it around, then `GroupBy` uses -/// no allocations. It needs allocations only if several group iterators -/// are alive at the same time. -/// -/// This type implements `IntoIterator` (it is **not** an iterator -/// itself), because the group iterators need to borrow from this -/// value. It should be stored in a local variable or temporary and -/// iterated. -/// -/// See [`.group_by()`](../trait.Itertools.html#method.group_by) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct GroupBy<K, I, F> - where I: Iterator, -{ - inner: RefCell<GroupInner<K, I, F>>, - // the group iterator's current index. Keep this in the main value - // so that simultaneous iterators all use the same state. - index: Cell<usize>, -} - -/// Create a new -pub fn new<K, J, F>(iter: J, f: F) -> GroupBy<K, J::IntoIter, F> - where J: IntoIterator, - F: FnMut(&J::Item) -> K, -{ - GroupBy { - inner: RefCell::new(GroupInner { - key: f, - iter: iter.into_iter(), - current_key: None, - current_elt: None, - done: false, - top_group: 0, - oldest_buffered_group: 0, - bottom_group: 0, - buffer: Vec::new(), - dropped_group: !0, - }), - index: Cell::new(0), - } -} - -impl<K, I, F> GroupBy<K, I, F> - where I: Iterator, -{ - /// `client`: Index of group that requests next element - fn step(&self, client: usize) -> Option<I::Item> - where F: FnMut(&I::Item) -> K, - K: PartialEq, - { - self.inner.borrow_mut().step(client) - } - - /// `client`: Index of group - fn drop_group(&self, client: usize) { - self.inner.borrow_mut().drop_group(client) - } -} - -impl<'a, K, I, F> IntoIterator for &'a GroupBy<K, I, F> - where I: Iterator, - I::Item: 'a, - F: FnMut(&I::Item) -> K, - K: PartialEq -{ - type Item = (K, Group<'a, K, I, F>); - type IntoIter = Groups<'a, K, I, F>; - - fn into_iter(self) -> Self::IntoIter { - Groups { parent: self } - } -} - - -/// An iterator that yields the Group iterators. -/// -/// Iterator element type is `(K, Group)`: -/// the group's key `K` and the group's iterator. -/// -/// See [`.group_by()`](../trait.Itertools.html#method.group_by) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Groups<'a, K: 'a, I: 'a, F: 'a> - where I: Iterator, - I::Item: 'a -{ - parent: &'a GroupBy<K, I, F>, -} - -impl<'a, K, I, F> Iterator for Groups<'a, K, I, F> - where I: Iterator, - I::Item: 'a, - F: FnMut(&I::Item) -> K, - K: PartialEq -{ - type Item = (K, Group<'a, K, I, F>); - - #[inline] - fn next(&mut self) -> Option<Self::Item> { - let index = self.parent.index.get(); - self.parent.index.set(index + 1); - let inner = &mut *self.parent.inner.borrow_mut(); - inner.step(index).map(|elt| { - let key = inner.group_key(index); - (key, Group { - parent: self.parent, - index: index, - first: Some(elt), - }) - }) - } -} - -/// An iterator for the elements in a single group. -/// -/// Iterator element type is `I::Item`. -pub struct Group<'a, K: 'a, I: 'a, F: 'a> - where I: Iterator, - I::Item: 'a, -{ - parent: &'a GroupBy<K, I, F>, - index: usize, - first: Option<I::Item>, -} - -impl<'a, K, I, F> Drop for Group<'a, K, I, F> - where I: Iterator, - I::Item: 'a, -{ - fn drop(&mut self) { - self.parent.drop_group(self.index); - } -} - -impl<'a, K, I, F> Iterator for Group<'a, K, I, F> - where I: Iterator, - I::Item: 'a, - F: FnMut(&I::Item) -> K, - K: PartialEq, -{ - type Item = I::Item; - #[inline] - fn next(&mut self) -> Option<Self::Item> { - if let elt @ Some(..) = self.first.take() { - return elt; - } - self.parent.step(self.index) - } -} - -///// IntoChunks ///// - -/// Create a new -pub fn new_chunks<J>(iter: J, size: usize) -> IntoChunks<J::IntoIter> - where J: IntoIterator, -{ - IntoChunks { - inner: RefCell::new(GroupInner { - key: ChunkIndex::new(size), - iter: iter.into_iter(), - current_key: None, - current_elt: None, - done: false, - top_group: 0, - oldest_buffered_group: 0, - bottom_group: 0, - buffer: Vec::new(), - dropped_group: !0, - }), - index: Cell::new(0), - } -} - - -/// `ChunkLazy` is the storage for a lazy chunking operation. -/// -/// `IntoChunks` behaves just like `GroupBy`: it is iterable, and -/// it only buffers if several chunk iterators are alive at the same time. -/// -/// This type implements `IntoIterator` (it is **not** an iterator -/// itself), because the chunk iterators need to borrow from this -/// value. It should be stored in a local variable or temporary and -/// iterated. -/// -/// Iterator element type is `Chunk`, each chunk's iterator. -/// -/// See [`.chunks()`](../trait.Itertools.html#method.chunks) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct IntoChunks<I> - where I: Iterator, -{ - inner: RefCell<GroupInner<usize, I, ChunkIndex>>, - // the chunk iterator's current index. Keep this in the main value - // so that simultaneous iterators all use the same state. - index: Cell<usize>, -} - - -impl<I> IntoChunks<I> - where I: Iterator, -{ - /// `client`: Index of chunk that requests next element - fn step(&self, client: usize) -> Option<I::Item> { - self.inner.borrow_mut().step(client) - } - - /// `client`: Index of chunk - fn drop_group(&self, client: usize) { - self.inner.borrow_mut().drop_group(client) - } -} - -impl<'a, I> IntoIterator for &'a IntoChunks<I> - where I: Iterator, - I::Item: 'a, -{ - type Item = Chunk<'a, I>; - type IntoIter = Chunks<'a, I>; - - fn into_iter(self) -> Self::IntoIter { - Chunks { - parent: self, - } - } -} - - -/// An iterator that yields the Chunk iterators. -/// -/// Iterator element type is `Chunk`. -/// -/// See [`.chunks()`](../trait.Itertools.html#method.chunks) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Chunks<'a, I: 'a> - where I: Iterator, - I::Item: 'a, -{ - parent: &'a IntoChunks<I>, -} - -impl<'a, I> Iterator for Chunks<'a, I> - where I: Iterator, - I::Item: 'a, -{ - type Item = Chunk<'a, I>; - - #[inline] - fn next(&mut self) -> Option<Self::Item> { - let index = self.parent.index.get(); - self.parent.index.set(index + 1); - let inner = &mut *self.parent.inner.borrow_mut(); - inner.step(index).map(|elt| { - Chunk { - parent: self.parent, - index: index, - first: Some(elt), - } - }) - } -} - -/// An iterator for the elements in a single chunk. -/// -/// Iterator element type is `I::Item`. -pub struct Chunk<'a, I: 'a> - where I: Iterator, - I::Item: 'a, -{ - parent: &'a IntoChunks<I>, - index: usize, - first: Option<I::Item>, -} - -impl<'a, I> Drop for Chunk<'a, I> - where I: Iterator, - I::Item: 'a, -{ - fn drop(&mut self) { - self.parent.drop_group(self.index); - } -} - -impl<'a, I> Iterator for Chunk<'a, I> - where I: Iterator, - I::Item: 'a, -{ - type Item = I::Item; - #[inline] - fn next(&mut self) -> Option<Self::Item> { - if let elt @ Some(..) = self.first.take() { - return elt; - } - self.parent.step(self.index) - } -} diff --git a/vendor/itertools-0.7.8/src/impl_macros.rs b/vendor/itertools-0.7.8/src/impl_macros.rs deleted file mode 100644 index b41760aee8..0000000000 --- a/vendor/itertools-0.7.8/src/impl_macros.rs +++ /dev/null @@ -1,14 +0,0 @@ -//! -//! Implementation's internal macros - -macro_rules! debug_fmt_fields { - ($tyname:ident, $($($field:ident).+),*) => { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - f.debug_struct(stringify!($tyname)) - $( - .field(stringify!($($field).+), &self.$($field).+) - )* - .finish() - } - } -} diff --git a/vendor/itertools-0.7.8/src/intersperse.rs b/vendor/itertools-0.7.8/src/intersperse.rs deleted file mode 100644 index b1dc732117..0000000000 --- a/vendor/itertools-0.7.8/src/intersperse.rs +++ /dev/null @@ -1,60 +0,0 @@ -use std::iter::Fuse; -use super::size_hint; - -#[derive(Clone)] -/// An iterator adaptor to insert a particular value -/// between each element of the adapted iterator. -/// -/// Iterator element type is `I::Item` -/// -/// This iterator is *fused*. -/// -/// See [`.intersperse()`](../trait.Itertools.html#method.intersperse) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct Intersperse<I> - where I: Iterator -{ - element: I::Item, - iter: Fuse<I>, - peek: Option<I::Item>, -} - -/// Create a new Intersperse iterator -pub fn intersperse<I>(iter: I, elt: I::Item) -> Intersperse<I> - where I: Iterator -{ - let mut iter = iter.fuse(); - Intersperse { - peek: iter.next(), - iter: iter, - element: elt, - } -} - -impl<I> Iterator for Intersperse<I> - where I: Iterator, - I::Item: Clone -{ - type Item = I::Item; - #[inline] - fn next(&mut self) -> Option<I::Item> { - if self.peek.is_some() { - self.peek.take() - } else { - self.peek = self.iter.next(); - if self.peek.is_some() { - Some(self.element.clone()) - } else { - None - } - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - // 2 * SH + { 1 or 0 } - let has_peek = self.peek.is_some() as usize; - let sh = self.iter.size_hint(); - size_hint::add_scalar(size_hint::add(sh, sh), has_peek) - } -} diff --git a/vendor/itertools-0.7.8/src/kmerge_impl.rs b/vendor/itertools-0.7.8/src/kmerge_impl.rs deleted file mode 100644 index 0720899e37..0000000000 --- a/vendor/itertools-0.7.8/src/kmerge_impl.rs +++ /dev/null @@ -1,256 +0,0 @@ - -use size_hint; -use Itertools; - -use std::mem::replace; -use std::fmt; - -macro_rules! clone_fields { - ($name:ident, $base:expr, $($field:ident),+) => ( - $name { - $( - $field : $base . $field .clone() - ),* - } - ); -} - -/// Head element and Tail iterator pair -/// -/// `PartialEq`, `Eq`, `PartialOrd` and `Ord` are implemented by comparing sequences based on -/// first items (which are guaranteed to exist). -/// -/// The meanings of `PartialOrd` and `Ord` are reversed so as to turn the heap used in -/// `KMerge` into a min-heap. -#[derive(Debug)] -struct HeadTail<I> - where I: Iterator -{ - head: I::Item, - tail: I, -} - -impl<I> HeadTail<I> - where I: Iterator -{ - /// Constructs a `HeadTail` from an `Iterator`. Returns `None` if the `Iterator` is empty. - fn new(mut it: I) -> Option<HeadTail<I>> { - let head = it.next(); - head.map(|h| { - HeadTail { - head: h, - tail: it, - } - }) - } - - /// Get the next element and update `head`, returning the old head in `Some`. - /// - /// Returns `None` when the tail is exhausted (only `head` then remains). - fn next(&mut self) -> Option<I::Item> { - if let Some(next) = self.tail.next() { - Some(replace(&mut self.head, next)) - } else { - None - } - } - - /// Hints at the size of the sequence, same as the `Iterator` method. - fn size_hint(&self) -> (usize, Option<usize>) { - size_hint::add_scalar(self.tail.size_hint(), 1) - } -} - -impl<I> Clone for HeadTail<I> - where I: Iterator + Clone, - I::Item: Clone -{ - fn clone(&self) -> Self { - clone_fields!(HeadTail, self, head, tail) - } -} - -/// Make `data` a heap (min-heap w.r.t the sorting). -fn heapify<T, S>(data: &mut [T], mut less_than: S) - where S: FnMut(&T, &T) -> bool -{ - for i in (0..data.len() / 2).rev() { - sift_down(data, i, &mut less_than); - } -} - -/// Sift down element at `index` (`heap` is a min-heap wrt the ordering) -fn sift_down<T, S>(heap: &mut [T], index: usize, mut less_than: S) - where S: FnMut(&T, &T) -> bool -{ - debug_assert!(index <= heap.len()); - let mut pos = index; - let mut child = 2 * pos + 1; - // the `pos` conditional is to avoid a bounds check - while pos < heap.len() && child < heap.len() { - let right = child + 1; - - // pick the smaller of the two children - if right < heap.len() && less_than(&heap[right], &heap[child]) { - child = right; - } - - // sift down is done if we are already in order - if !less_than(&heap[child], &heap[pos]) { - return; - } - heap.swap(pos, child); - pos = child; - child = 2 * pos + 1; - } -} - -/// An iterator adaptor that merges an abitrary number of base iterators in ascending order. -/// If all base iterators are sorted (ascending), the result is sorted. -/// -/// Iterator element type is `I::Item`. -/// -/// See [`.kmerge()`](../trait.Itertools.html#method.kmerge) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct KMerge<I> - where I: Iterator -{ - heap: Vec<HeadTail<I>>, -} - -impl<I> fmt::Debug for KMerge<I> - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, -{ - debug_fmt_fields!(KMerge, heap); -} - -/// Create an iterator that merges elements of the contained iterators using -/// the ordering function. -/// -/// Equivalent to `iterable.into_iter().kmerge()`. -/// -/// ``` -/// use itertools::kmerge; -/// -/// for elt in kmerge(vec![vec![0, 2, 4], vec![1, 3, 5], vec![6, 7]]) { -/// /* loop body */ -/// } -/// ``` -pub fn kmerge<I>(iterable: I) -> KMerge<<I::Item as IntoIterator>::IntoIter> - where I: IntoIterator, - I::Item: IntoIterator, - <<I as IntoIterator>::Item as IntoIterator>::Item: PartialOrd -{ - let iter = iterable.into_iter(); - let (lower, _) = iter.size_hint(); - let mut heap = Vec::with_capacity(lower); - heap.extend(iter.filter_map(|it| HeadTail::new(it.into_iter()))); - heapify(&mut heap, |a, b| a.head < b.head); - KMerge { heap: heap } -} - -impl<I> Clone for KMerge<I> - where I: Iterator + Clone, - I::Item: Clone -{ - fn clone(&self) -> KMerge<I> { - clone_fields!(KMerge, self, heap) - } -} - -impl<I> Iterator for KMerge<I> - where I: Iterator, - I::Item: PartialOrd -{ - type Item = I::Item; - - fn next(&mut self) -> Option<Self::Item> { - if self.heap.is_empty() { - return None; - } - let result = if let Some(next) = self.heap[0].next() { - next - } else { - self.heap.swap_remove(0).head - }; - sift_down(&mut self.heap, 0, |a, b| a.head < b.head); - Some(result) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.heap.iter() - .map(|i| i.size_hint()) - .fold1(size_hint::add) - .unwrap_or((0, Some(0))) - } -} - -/// An iterator adaptor that merges an abitrary number of base iterators -/// according to an ordering function. -/// -/// Iterator element type is `I::Item`. -/// -/// See [`.kmerge_by()`](../trait.Itertools.html#method.kmerge_by) for more -/// information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct KMergeBy<I, F> - where I: Iterator, -{ - heap: Vec<HeadTail<I>>, - less_than: F, -} - -impl<I, F> fmt::Debug for KMergeBy<I, F> - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, -{ - debug_fmt_fields!(KMergeBy, heap); -} - -/// Create an iterator that merges elements of the contained iterators. -/// -/// Equivalent to `iterable.into_iter().kmerge_by(less_than)`. -pub fn kmerge_by<I, F>(iterable: I, mut less_than: F) - -> KMergeBy<<I::Item as IntoIterator>::IntoIter, F> - where I: IntoIterator, - I::Item: IntoIterator, - F: FnMut(&<<I as IntoIterator>::Item as IntoIterator>::Item, - &<<I as IntoIterator>::Item as IntoIterator>::Item) -> bool -{ - let iter = iterable.into_iter(); - let (lower, _) = iter.size_hint(); - let mut heap: Vec<_> = Vec::with_capacity(lower); - heap.extend(iter.filter_map(|it| HeadTail::new(it.into_iter()))); - heapify(&mut heap, |a, b| less_than(&a.head, &b.head)); - KMergeBy { heap: heap, less_than: less_than } -} - - -impl<I, F> Iterator for KMergeBy<I, F> - where I: Iterator, - F: FnMut(&I::Item, &I::Item) -> bool -{ - type Item = I::Item; - - fn next(&mut self) -> Option<Self::Item> { - if self.heap.is_empty() { - return None; - } - let result = if let Some(next) = self.heap[0].next() { - next - } else { - self.heap.swap_remove(0).head - }; - let less_than = &mut self.less_than; - sift_down(&mut self.heap, 0, |a, b| less_than(&a.head, &b.head)); - Some(result) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.heap.iter() - .map(|i| i.size_hint()) - .fold1(size_hint::add) - .unwrap_or((0, Some(0))) - } -} diff --git a/vendor/itertools-0.7.8/src/lib.rs b/vendor/itertools-0.7.8/src/lib.rs deleted file mode 100644 index 32b5f7156b..0000000000 --- a/vendor/itertools-0.7.8/src/lib.rs +++ /dev/null @@ -1,2121 +0,0 @@ -#![warn(missing_docs)] -#![crate_name="itertools"] -#![cfg_attr(not(feature = "use_std"), no_std)] - -//! Itertools — extra iterator adaptors, functions and macros. -//! -//! To use the iterator methods in this crate, import the [`Itertools` trait](./trait.Itertools.html): -//! -//! ``` -//! use itertools::Itertools; -//! ``` -//! -//! ## Crate Features -//! -//! - `use_std` -//! - Enabled by default. -//! - Disable to compile itertools using `#![no_std]`. This disables -//! any items that depend on collections (like `group_by`, `unique`, -//! `kmerge`, `join` and many more). -//! -//! ## Rust Version -//! -//! This version of itertools requires Rust 1.12 or later. -//! -#![doc(html_root_url="https://docs.rs/itertools/0.7/")] - -extern crate either; - -#[cfg(not(feature = "use_std"))] -extern crate core as std; - -pub use either::Either; - -#[cfg(feature = "use_std")] -use std::collections::HashMap; -use std::iter::{IntoIterator}; -use std::cmp::Ordering; -use std::fmt; -#[cfg(feature = "use_std")] -use std::hash::Hash; -#[cfg(feature = "use_std")] -use std::fmt::Write; - -#[macro_use] -mod impl_macros; - -// for compatibility with no std and macros -#[doc(hidden)] -pub use std::iter as __std_iter; - -/// The concrete iterator types. -pub mod structs { - pub use adaptors::{ - Dedup, - Interleave, - InterleaveShortest, - Product, - PutBack, - Batching, - Step, - MapResults, - Merge, - MergeBy, - TakeWhileRef, - WhileSome, - Coalesce, - TupleCombinations, - Flatten, - Positions, - Update, - }; - #[cfg(feature = "use_std")] - pub use adaptors::MultiProduct; - #[cfg(feature = "use_std")] - pub use combinations::Combinations; - pub use cons_tuples_impl::ConsTuples; - pub use format::{Format, FormatWith}; - #[cfg(feature = "use_std")] - pub use groupbylazy::{IntoChunks, Chunk, Chunks, GroupBy, Group, Groups}; - pub use intersperse::Intersperse; - #[cfg(feature = "use_std")] - pub use kmerge_impl::{KMerge, KMergeBy}; - pub use merge_join::MergeJoinBy; - #[cfg(feature = "use_std")] - pub use multipeek_impl::MultiPeek; - pub use pad_tail::PadUsing; - pub use peeking_take_while::PeekingTakeWhile; - pub use process_results_impl::ProcessResults; - #[cfg(feature = "use_std")] - pub use put_back_n_impl::PutBackN; - #[cfg(feature = "use_std")] - pub use rciter_impl::RcIter; - pub use repeatn::RepeatN; - pub use sources::{RepeatCall, Unfold, Iterate}; - #[cfg(feature = "use_std")] - pub use tee::Tee; - pub use tuple_impl::{TupleBuffer, TupleWindows, Tuples}; - #[cfg(feature = "use_std")] - pub use unique_impl::{Unique, UniqueBy}; - pub use with_position::WithPosition; - pub use zip_eq_impl::ZipEq; - pub use zip_longest::ZipLongest; - pub use ziptuple::Zip; -} -pub use structs::*; -pub use adaptors::flatten; -pub use concat_impl::concat; -pub use cons_tuples_impl::cons_tuples; -pub use diff::diff_with; -pub use diff::Diff; -#[cfg(feature = "use_std")] -pub use kmerge_impl::{kmerge_by}; -pub use minmax::MinMaxResult; -pub use peeking_take_while::PeekingNext; -pub use process_results_impl::process_results; -pub use repeatn::repeat_n; -pub use sources::{repeat_call, unfold, iterate}; -pub use with_position::Position; -pub use ziptuple::multizip; -mod adaptors; -mod either_or_both; -pub use either_or_both::EitherOrBoth; -#[doc(hidden)] -pub mod free; -#[doc(inline)] -pub use free::*; -mod concat_impl; -mod cons_tuples_impl; -#[cfg(feature = "use_std")] -mod combinations; -mod diff; -mod format; -#[cfg(feature = "use_std")] -mod group_map; -#[cfg(feature = "use_std")] -mod groupbylazy; -mod intersperse; -#[cfg(feature = "use_std")] -mod kmerge_impl; -mod merge_join; -mod minmax; -#[cfg(feature = "use_std")] -mod multipeek_impl; -mod pad_tail; -mod peeking_take_while; -mod process_results_impl; -#[cfg(feature = "use_std")] -mod put_back_n_impl; -#[cfg(feature = "use_std")] -mod rciter_impl; -mod repeatn; -mod size_hint; -mod sources; -#[cfg(feature = "use_std")] -mod tee; -mod tuple_impl; -#[cfg(feature = "use_std")] -mod unique_impl; -mod with_position; -mod zip_eq_impl; -mod zip_longest; -mod ziptuple; - -#[macro_export] -/// Create an iterator over the “cartesian product” of iterators. -/// -/// Iterator element type is like `(A, B, ..., E)` if formed -/// from iterators `(I, J, ..., M)` with element types `I::Item = A`, `J::Item = B`, etc. -/// -/// ``` -/// #[macro_use] extern crate itertools; -/// # fn main() { -/// // Iterate over the coordinates of a 4 x 4 x 4 grid -/// // from (0, 0, 0), (0, 0, 1), .., (0, 1, 0), (0, 1, 1), .. etc until (3, 3, 3) -/// for (i, j, k) in iproduct!(0..4, 0..4, 0..4) { -/// // .. -/// } -/// # } -/// ``` -/// -/// **Note:** To enable the macros in this crate, use the `#[macro_use]` -/// attribute when importing the crate: -/// -/// ``` -/// #[macro_use] extern crate itertools; -/// # fn main() { } -/// ``` -macro_rules! iproduct { - (@flatten $I:expr,) => ( - $I - ); - (@flatten $I:expr, $J:expr, $($K:expr,)*) => ( - iproduct!(@flatten $crate::cons_tuples(iproduct!($I, $J)), $($K,)*) - ); - ($I:expr) => ( - $crate::__std_iter::IntoIterator::into_iter($I) - ); - ($I:expr, $J:expr) => ( - $crate::Itertools::cartesian_product(iproduct!($I), iproduct!($J)) - ); - ($I:expr, $J:expr, $($K:expr),+) => ( - iproduct!(@flatten iproduct!($I, $J), $($K,)+) - ); -} - -#[macro_export] -/// Create an iterator running multiple iterators in lockstep. -/// -/// The `izip!` iterator yields elements until any subiterator -/// returns `None`. -/// -/// This is a version of the standard ``.zip()`` that's supporting more than -/// two iterators. The iterator elment type is a tuple with one element -/// from each of the input iterators. Just like ``.zip()``, the iteration stops -/// when the shortest of the inputs reaches its end. -/// -/// **Note:** The result of this macro is an iterator composed of -/// repeated `.zip()` and a `.map()`; it has an anonymous type. -/// Prefer this macro `izip!()` over [`multizip`] for the performance benefits -/// of using the standard library `.zip()`. -/// -/// [`multizip`]: fn.multizip.html -/// -/// ``` -/// #[macro_use] extern crate itertools; -/// # fn main() { -/// -/// // iterate over three sequences side-by-side -/// let mut results = [0, 0, 0, 0]; -/// let inputs = [3, 7, 9, 6]; -/// -/// for (r, index, input) in izip!(&mut results, 0..10, &inputs) { -/// *r = index * 10 + input; -/// } -/// -/// assert_eq!(results, [0 + 3, 10 + 7, 29, 36]); -/// # } -/// ``` -/// -/// **Note:** To enable the macros in this crate, use the `#[macro_use]` -/// attribute when importing the crate: -/// -/// ``` -/// #[macro_use] extern crate itertools; -/// # fn main() { } -/// ``` -macro_rules! izip { - // @closure creates a tuple-flattening closure for .map() call. usage: - // @closure partial_pattern => partial_tuple , rest , of , iterators - // eg. izip!( @closure ((a, b), c) => (a, b, c) , dd , ee ) - ( @closure $p:pat => $tup:expr ) => { - |$p| $tup - }; - - // The "b" identifier is a different identifier on each recursion level thanks to hygiene. - ( @closure $p:pat => ( $($tup:tt)* ) , $_iter:expr $( , $tail:expr )* ) => { - izip!(@closure ($p, b) => ( $($tup)*, b ) $( , $tail )*) - }; - - ( $first:expr $( , $rest:expr )* $(,)* ) => { - $crate::__std_iter::IntoIterator::into_iter($first) - $( - .zip($rest) - )* - .map( - izip!(@closure a => (a) $( , $rest )*) - ) - }; -} - -/// The trait `Itertools`: extra iterator adaptors and methods for iterators. -/// -/// This trait defines a number of methods. They are divided into two groups: -/// -/// * *Adaptors* take an iterator and parameter as input, and return -/// a new iterator value. These are listed first in the trait. An example -/// of an adaptor is [`.interleave()`](#method.interleave) -/// -/// * *Regular methods* are those that don't return iterators and instead -/// return a regular value of some other kind. -/// [`.next_tuple()`](#method.next_tuple) is an example and the first regular -/// method in the list. -pub trait Itertools : Iterator { - // adaptors - - /// Alternate elements from two iterators until both have run out. - /// - /// Iterator element type is `Self::Item`. - /// - /// This iterator is *fused*. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let it = (1..7).interleave(vec![-1, -2]); - /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3, 4, 5, 6]); - /// ``` - fn interleave<J>(self, other: J) -> Interleave<Self, J::IntoIter> - where J: IntoIterator<Item = Self::Item>, - Self: Sized - { - interleave(self, other) - } - - /// Alternate elements from two iterators until at least one of them has run - /// out. - /// - /// Iterator element type is `Self::Item`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let it = (1..7).interleave_shortest(vec![-1, -2]); - /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3]); - /// ``` - fn interleave_shortest<J>(self, other: J) -> InterleaveShortest<Self, J::IntoIter> - where J: IntoIterator<Item = Self::Item>, - Self: Sized - { - adaptors::interleave_shortest(self, other.into_iter()) - } - - /// An iterator adaptor to insert a particular value - /// between each element of the adapted iterator. - /// - /// Iterator element type is `Self::Item`. - /// - /// This iterator is *fused*. - /// - /// ``` - /// use itertools::Itertools; - /// - /// itertools::assert_equal((0..3).intersperse(8), vec![0, 8, 1, 8, 2]); - /// ``` - fn intersperse(self, element: Self::Item) -> Intersperse<Self> - where Self: Sized, - Self::Item: Clone - { - intersperse::intersperse(self, element) - } - - /// Create an iterator which iterates over both this and the specified - /// iterator simultaneously, yielding pairs of two optional elements. - /// - /// This iterator is *fused*. - /// - /// As long as neither input iterator is exhausted yet, it yields two values - /// via `EitherOrBoth::Both`. - /// - /// When the parameter iterator is exhausted, it only yields a value from the - /// `self` iterator via `EitherOrBoth::Left`. - /// - /// When the `self` iterator is exhausted, it only yields a value from the - /// parameter iterator via `EitherOrBoth::Right`. - /// - /// When both iterators return `None`, all further invocations of `.next()` - /// will return `None`. - /// - /// Iterator element type is - /// [`EitherOrBoth<Self::Item, J::Item>`](enum.EitherOrBoth.html). - /// - /// ```rust - /// use itertools::EitherOrBoth::{Both, Right}; - /// use itertools::Itertools; - /// let it = (0..1).zip_longest(1..3); - /// itertools::assert_equal(it, vec![Both(0, 1), Right(2)]); - /// ``` - #[inline] - fn zip_longest<J>(self, other: J) -> ZipLongest<Self, J::IntoIter> - where J: IntoIterator, - Self: Sized - { - zip_longest::zip_longest(self, other.into_iter()) - } - - /// Create an iterator which iterates over both this and the specified - /// iterator simultaneously, yielding pairs of elements. - /// - /// **Panics** if the iterators reach an end and they are not of equal - /// lengths. - #[inline] - fn zip_eq<J>(self, other: J) -> ZipEq<Self, J::IntoIter> - where J: IntoIterator, - Self: Sized - { - zip_eq(self, other) - } - - /// A “meta iterator adaptor”. Its closure recives a reference to the - /// iterator and may pick off as many elements as it likes, to produce the - /// next iterator element. - /// - /// Iterator element type is `B`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// // An adaptor that gathers elements in pairs - /// let pit = (0..4).batching(|it| { - /// match it.next() { - /// None => None, - /// Some(x) => match it.next() { - /// None => None, - /// Some(y) => Some((x, y)), - /// } - /// } - /// }); - /// - /// itertools::assert_equal(pit, vec![(0, 1), (2, 3)]); - /// ``` - /// - fn batching<B, F>(self, f: F) -> Batching<Self, F> - where F: FnMut(&mut Self) -> Option<B>, - Self: Sized - { - adaptors::batching(self, f) - } - - /// Return an *iterable* that can group iterator elements. - /// Consecutive elements that map to the same key (“runs”), are assigned - /// to the same group. - /// - /// `GroupBy` is the storage for the lazy grouping operation. - /// - /// If the groups are consumed in order, or if each group's iterator is - /// dropped without keeping it around, then `GroupBy` uses no - /// allocations. It needs allocations only if several group iterators - /// are alive at the same time. - /// - /// This type implements `IntoIterator` (it is **not** an iterator - /// itself), because the group iterators need to borrow from this - /// value. It should be stored in a local variable or temporary and - /// iterated. - /// - /// Iterator element type is `(K, Group)`: the group's key and the - /// group iterator. - /// - /// ``` - /// use itertools::Itertools; - /// - /// // group data into runs of larger than zero or not. - /// let data = vec![1, 3, -2, -2, 1, 0, 1, 2]; - /// // groups: |---->|------>|--------->| - /// - /// // Note: The `&` is significant here, `GroupBy` is iterable - /// // only by reference. You can also call `.into_iter()` explicitly. - /// for (key, group) in &data.into_iter().group_by(|elt| *elt >= 0) { - /// // Check that the sum of each group is +/- 4. - /// assert_eq!(4, group.sum::<i32>().abs()); - /// } - /// ``` - #[cfg(feature = "use_std")] - fn group_by<K, F>(self, key: F) -> GroupBy<K, Self, F> - where Self: Sized, - F: FnMut(&Self::Item) -> K, - K: PartialEq, - { - groupbylazy::new(self, key) - } - - /// Return an *iterable* that can chunk the iterator. - /// - /// Yield subiterators (chunks) that each yield a fixed number elements, - /// determined by `size`. The last chunk will be shorter if there aren't - /// enough elements. - /// - /// `IntoChunks` is based on `GroupBy`: it is iterable (implements - /// `IntoIterator`, **not** `Iterator`), and it only buffers if several - /// chunk iterators are alive at the same time. - /// - /// Iterator element type is `Chunk`, each chunk's iterator. - /// - /// **Panics** if `size` is 0. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let data = vec![1, 1, 2, -2, 6, 0, 3, 1]; - /// //chunk size=3 |------->|-------->|--->| - /// - /// // Note: The `&` is significant here, `IntoChunks` is iterable - /// // only by reference. You can also call `.into_iter()` explicitly. - /// for chunk in &data.into_iter().chunks(3) { - /// // Check that the sum of each chunk is 4. - /// assert_eq!(4, chunk.sum()); - /// } - /// ``` - #[cfg(feature = "use_std")] - fn chunks(self, size: usize) -> IntoChunks<Self> - where Self: Sized, - { - assert!(size != 0); - groupbylazy::new_chunks(self, size) - } - - /// Return an iterator over all contiguous windows producing tuples of - /// a specific size (up to 4). - /// - /// `tuple_windows` clones the iterator elements so that they can be - /// part of successive windows, this makes it most suited for iterators - /// of references and other values that are cheap to copy. - /// - /// ``` - /// use itertools::Itertools; - /// let mut v = Vec::new(); - /// for (a, b) in (1..5).tuple_windows() { - /// v.push((a, b)); - /// } - /// assert_eq!(v, vec![(1, 2), (2, 3), (3, 4)]); - /// - /// let mut it = (1..5).tuple_windows(); - /// assert_eq!(Some((1, 2, 3)), it.next()); - /// assert_eq!(Some((2, 3, 4)), it.next()); - /// assert_eq!(None, it.next()); - /// - /// // this requires a type hint - /// let it = (1..5).tuple_windows::<(_, _, _)>(); - /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4)]); - /// - /// // you can also specify the complete type - /// use itertools::TupleWindows; - /// use std::ops::Range; - /// - /// let it: TupleWindows<Range<u32>, (u32, u32, u32)> = (1..5).tuple_windows(); - /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4)]); - /// ``` - fn tuple_windows<T>(self) -> TupleWindows<Self, T> - where Self: Sized + Iterator<Item = T::Item>, - T: tuple_impl::TupleCollect, - T::Item: Clone - { - tuple_impl::tuple_windows(self) - } - - /// Return an iterator that groups the items in tuples of a specific size - /// (up to 4). - /// - /// See also the method [`.next_tuple()`](#method.next_tuple). - /// - /// ``` - /// use itertools::Itertools; - /// let mut v = Vec::new(); - /// for (a, b) in (1..5).tuples() { - /// v.push((a, b)); - /// } - /// assert_eq!(v, vec![(1, 2), (3, 4)]); - /// - /// let mut it = (1..7).tuples(); - /// assert_eq!(Some((1, 2, 3)), it.next()); - /// assert_eq!(Some((4, 5, 6)), it.next()); - /// assert_eq!(None, it.next()); - /// - /// // this requires a type hint - /// let it = (1..7).tuples::<(_, _, _)>(); - /// itertools::assert_equal(it, vec![(1, 2, 3), (4, 5, 6)]); - /// - /// // you can also specify the complete type - /// use itertools::Tuples; - /// use std::ops::Range; - /// - /// let it: Tuples<Range<u32>, (u32, u32, u32)> = (1..7).tuples(); - /// itertools::assert_equal(it, vec![(1, 2, 3), (4, 5, 6)]); - /// ``` - /// - /// See also [`Tuples::into_buffer`](structs/struct.Tuples.html#method.into_buffer). - fn tuples<T>(self) -> Tuples<Self, T> - where Self: Sized + Iterator<Item = T::Item>, - T: tuple_impl::TupleCollect - { - tuple_impl::tuples(self) - } - - /// Split into an iterator pair that both yield all elements from - /// the original iterator. - /// - /// **Note:** If the iterator is clonable, prefer using that instead - /// of using this method. It is likely to be more efficient. - /// - /// Iterator element type is `Self::Item`. - /// - /// ``` - /// use itertools::Itertools; - /// let xs = vec![0, 1, 2, 3]; - /// - /// let (mut t1, t2) = xs.into_iter().tee(); - /// itertools::assert_equal(t1.next(), Some(0)); - /// itertools::assert_equal(t2, 0..4); - /// itertools::assert_equal(t1, 1..4); - /// ``` - #[cfg(feature = "use_std")] - fn tee(self) -> (Tee<Self>, Tee<Self>) - where Self: Sized, - Self::Item: Clone - { - tee::new(self) - } - - /// Return an iterator adaptor that steps `n` elements in the base iterator - /// for each iteration. - /// - /// The iterator steps by yielding the next element from the base iterator, - /// then skipping forward `n - 1` elements. - /// - /// Iterator element type is `Self::Item`. - /// - /// **Panics** if the step is 0. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let it = (0..8).step(3); - /// itertools::assert_equal(it, vec![0, 3, 6]); - /// ``` - fn step(self, n: usize) -> Step<Self> - where Self: Sized - { - adaptors::step(self, n) - } - - /// Return an iterator adaptor that applies the provided closure - /// to every `Result::Ok` value. `Result::Err` values are - /// unchanged. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let input = vec![Ok(41), Err(false), Ok(11)]; - /// let it = input.into_iter().map_results(|i| i + 1); - /// itertools::assert_equal(it, vec![Ok(42), Err(false), Ok(12)]); - /// ``` - fn map_results<F, T, U, E>(self, f: F) -> MapResults<Self, F> - where Self: Iterator<Item = Result<T, E>> + Sized, - F: FnMut(T) -> U, - { - adaptors::map_results(self, f) - } - - /// Return an iterator adaptor that merges the two base iterators in - /// ascending order. If both base iterators are sorted (ascending), the - /// result is sorted. - /// - /// Iterator element type is `Self::Item`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let a = (0..11).step(3); - /// let b = (0..11).step(5); - /// let it = a.merge(b); - /// itertools::assert_equal(it, vec![0, 0, 3, 5, 6, 9, 10]); - /// ``` - fn merge<J>(self, other: J) -> Merge<Self, J::IntoIter> - where Self: Sized, - Self::Item: PartialOrd, - J: IntoIterator<Item = Self::Item> - { - merge(self, other) - } - - /// Return an iterator adaptor that merges the two base iterators in order. - /// This is much like `.merge()` but allows for a custom ordering. - /// - /// This can be especially useful for sequences of tuples. - /// - /// Iterator element type is `Self::Item`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let a = (0..).zip("bc".chars()); - /// let b = (0..).zip("ad".chars()); - /// let it = a.merge_by(b, |x, y| x.1 <= y.1); - /// itertools::assert_equal(it, vec![(0, 'a'), (0, 'b'), (1, 'c'), (1, 'd')]); - /// ``` - - fn merge_by<J, F>(self, other: J, is_first: F) -> MergeBy<Self, J::IntoIter, F> - where Self: Sized, - J: IntoIterator<Item = Self::Item>, - F: FnMut(&Self::Item, &Self::Item) -> bool - { - adaptors::merge_by_new(self, other.into_iter(), is_first) - } - - /// Create an iterator that merges items from both this and the specified - /// iterator in ascending order. - /// - /// It chooses whether to pair elements based on the `Ordering` returned by the - /// specified compare function. At any point, inspecting the tip of the - /// iterators `I` and `J` as items `i` of type `I::Item` and `j` of type - /// `J::Item` respectively, the resulting iterator will: - /// - /// - Emit `EitherOrBoth::Left(i)` when `i < j`, - /// and remove `i` from its source iterator - /// - Emit `EitherOrBoth::Right(j)` when `i > j`, - /// and remove `j` from its source iterator - /// - Emit `EitherOrBoth::Both(i, j)` when `i == j`, - /// and remove both `i` and `j` from their respective source iterators - /// - /// ``` - /// use itertools::Itertools; - /// use itertools::EitherOrBoth::{Left, Right, Both}; - /// - /// let ki = (0..10).step(3); - /// let ku = (0..10).step(5); - /// let ki_ku = ki.merge_join_by(ku, |i, j| i.cmp(j)).map(|either| { - /// match either { - /// Left(_) => "Ki", - /// Right(_) => "Ku", - /// Both(_, _) => "KiKu" - /// } - /// }); - /// - /// itertools::assert_equal(ki_ku, vec!["KiKu", "Ki", "Ku", "Ki", "Ki"]); - /// ``` - #[inline] - fn merge_join_by<J, F>(self, other: J, cmp_fn: F) -> MergeJoinBy<Self, J::IntoIter, F> - where J: IntoIterator, - F: FnMut(&Self::Item, &J::Item) -> std::cmp::Ordering, - Self: Sized - { - merge_join_by(self, other, cmp_fn) - } - - - /// Return an iterator adaptor that flattens an iterator of iterators by - /// merging them in ascending order. - /// - /// If all base iterators are sorted (ascending), the result is sorted. - /// - /// Iterator element type is `Self::Item`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let a = (0..6).step(3); - /// let b = (1..6).step(3); - /// let c = (2..6).step(3); - /// let it = vec![a, b, c].into_iter().kmerge(); - /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5]); - /// ``` - #[cfg(feature = "use_std")] - fn kmerge(self) -> KMerge<<Self::Item as IntoIterator>::IntoIter> - where Self: Sized, - Self::Item: IntoIterator, - <Self::Item as IntoIterator>::Item: PartialOrd, - { - kmerge(self) - } - - /// Return an iterator adaptor that flattens an iterator of iterators by - /// merging them according to the given closure. - /// - /// The closure `first` is called with two elements *a*, *b* and should - /// return `true` if *a* is ordered before *b*. - /// - /// If all base iterators are sorted according to `first`, the result is - /// sorted. - /// - /// Iterator element type is `Self::Item`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let a = vec![-1f64, 2., 3., -5., 6., -7.]; - /// let b = vec![0., 2., -4.]; - /// let mut it = vec![a, b].into_iter().kmerge_by(|a, b| a.abs() < b.abs()); - /// assert_eq!(it.next(), Some(0.)); - /// assert_eq!(it.last(), Some(-7.)); - /// ``` - #[cfg(feature = "use_std")] - fn kmerge_by<F>(self, first: F) - -> KMergeBy<<Self::Item as IntoIterator>::IntoIter, F> - where Self: Sized, - Self::Item: IntoIterator, - F: FnMut(&<Self::Item as IntoIterator>::Item, - &<Self::Item as IntoIterator>::Item) -> bool - { - kmerge_by(self, first) - } - - /// Return an iterator adaptor that iterates over the cartesian product of - /// the element sets of two iterators `self` and `J`. - /// - /// Iterator element type is `(Self::Item, J::Item)`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let it = (0..2).cartesian_product("αβ".chars()); - /// itertools::assert_equal(it, vec![(0, 'α'), (0, 'β'), (1, 'α'), (1, 'β')]); - /// ``` - fn cartesian_product<J>(self, other: J) -> Product<Self, J::IntoIter> - where Self: Sized, - Self::Item: Clone, - J: IntoIterator, - J::IntoIter: Clone - { - adaptors::cartesian_product(self, other.into_iter()) - } - - /// Return an iterator adaptor that iterates over the cartesian product of - /// all subiterators returned by meta-iterator `self`. - /// - /// All provided iterators must yield the same `Item` type. To generate - /// the product of iterators yielding multiple types, use the - /// [`iproduct`](macro.iproduct.html) macro instead. - /// - /// - /// The iterator element type is `Vec<T>`, where `T` is the iterator element - /// of the subiterators. - /// - /// ``` - /// use itertools::Itertools; - /// let mut multi_prod = (0..3).map(|i| (i * 2)..(i * 2 + 2)) - /// .multi_cartesian_product(); - /// assert_eq!(multi_prod.next(), Some(vec![0, 2, 4])); - /// assert_eq!(multi_prod.next(), Some(vec![0, 2, 5])); - /// assert_eq!(multi_prod.next(), Some(vec![0, 3, 4])); - /// assert_eq!(multi_prod.next(), Some(vec![0, 3, 5])); - /// assert_eq!(multi_prod.next(), Some(vec![1, 2, 4])); - /// assert_eq!(multi_prod.next(), Some(vec![1, 2, 5])); - /// assert_eq!(multi_prod.next(), Some(vec![1, 3, 4])); - /// assert_eq!(multi_prod.next(), Some(vec![1, 3, 5])); - /// assert_eq!(multi_prod.next(), None); - /// ``` - #[cfg(feature = "use_std")] - fn multi_cartesian_product(self) -> MultiProduct<<Self::Item as IntoIterator>::IntoIter> - where Self: Iterator + Sized, - Self::Item: IntoIterator, - <Self::Item as IntoIterator>::IntoIter: Clone, - <Self::Item as IntoIterator>::Item: Clone - { - adaptors::multi_cartesian_product(self) - } - - /// Return an iterator adaptor that uses the passed-in closure to - /// optionally merge together consecutive elements. - /// - /// The closure `f` is passed two elements, `previous` and `current` and may - /// return either (1) `Ok(combined)` to merge the two values or - /// (2) `Err((previous', current'))` to indicate they can't be merged. - /// In (2), the value `previous'` is emitted by the iterator. - /// Either (1) `combined` or (2) `current'` becomes the previous value - /// when coalesce continues with the next pair of elements to merge. The - /// value that remains at the end is also emitted by the iterator. - /// - /// Iterator element type is `Self::Item`. - /// - /// This iterator is *fused*. - /// - /// ``` - /// use itertools::Itertools; - /// - /// // sum same-sign runs together - /// let data = vec![-1., -2., -3., 3., 1., 0., -1.]; - /// itertools::assert_equal(data.into_iter().coalesce(|x, y| - /// if (x >= 0.) == (y >= 0.) { - /// Ok(x + y) - /// } else { - /// Err((x, y)) - /// }), - /// vec![-6., 4., -1.]); - /// ``` - fn coalesce<F>(self, f: F) -> Coalesce<Self, F> - where Self: Sized, - F: FnMut(Self::Item, Self::Item) - -> Result<Self::Item, (Self::Item, Self::Item)> - { - adaptors::coalesce(self, f) - } - - /// Remove duplicates from sections of consecutive identical elements. - /// If the iterator is sorted, all elements will be unique. - /// - /// Iterator element type is `Self::Item`. - /// - /// This iterator is *fused*. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let data = vec![1., 1., 2., 3., 3., 2., 2.]; - /// itertools::assert_equal(data.into_iter().dedup(), - /// vec![1., 2., 3., 2.]); - /// ``` - fn dedup(self) -> Dedup<Self> - where Self: Sized, - Self::Item: PartialEq, - { - adaptors::dedup(self) - } - - /// Return an iterator adaptor that filters out elements that have - /// already been produced once during the iteration. Duplicates - /// are detected using hash and equality. - /// - /// Clones of visited elements are stored in a hash set in the - /// iterator. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let data = vec![10, 20, 30, 20, 40, 10, 50]; - /// itertools::assert_equal(data.into_iter().unique(), - /// vec![10, 20, 30, 40, 50]); - /// ``` - #[cfg(feature = "use_std")] - fn unique(self) -> Unique<Self> - where Self: Sized, - Self::Item: Clone + Eq + Hash - { - unique_impl::unique(self) - } - - /// Return an iterator adaptor that filters out elements that have - /// already been produced once during the iteration. - /// - /// Duplicates are detected by comparing the key they map to - /// with the keying function `f` by hash and equality. - /// The keys are stored in a hash set in the iterator. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let data = vec!["a", "bb", "aa", "c", "ccc"]; - /// itertools::assert_equal(data.into_iter().unique_by(|s| s.len()), - /// vec!["a", "bb", "ccc"]); - /// ``` - #[cfg(feature = "use_std")] - fn unique_by<V, F>(self, f: F) -> UniqueBy<Self, V, F> - where Self: Sized, - V: Eq + Hash, - F: FnMut(&Self::Item) -> V - { - unique_impl::unique_by(self, f) - } - - /// Return an iterator adaptor that borrows from this iterator and - /// takes items while the closure `accept` returns `true`. - /// - /// This adaptor can only be used on iterators that implement `PeekingNext` - /// like `.peekable()`, `put_back` and a few other collection iterators. - /// - /// The last and rejected element (first `false`) is still available when - /// `peeking_take_while` is done. - /// - /// - /// See also [`.take_while_ref()`](#method.take_while_ref) - /// which is a similar adaptor. - fn peeking_take_while<F>(&mut self, accept: F) -> PeekingTakeWhile<Self, F> - where Self: Sized + PeekingNext, - F: FnMut(&Self::Item) -> bool, - { - peeking_take_while::peeking_take_while(self, accept) - } - - /// Return an iterator adaptor that borrows from a `Clone`-able iterator - /// to only pick off elements while the predicate `accept` returns `true`. - /// - /// It uses the `Clone` trait to restore the original iterator so that the - /// last and rejected element (first `false`) is still available when - /// `take_while_ref` is done. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let mut hexadecimals = "0123456789abcdef".chars(); - /// - /// let decimals = hexadecimals.take_while_ref(|c| c.is_numeric()) - /// .collect::<String>(); - /// assert_eq!(decimals, "0123456789"); - /// assert_eq!(hexadecimals.next(), Some('a')); - /// - /// ``` - fn take_while_ref<F>(&mut self, accept: F) -> TakeWhileRef<Self, F> - where Self: Clone, - F: FnMut(&Self::Item) -> bool - { - adaptors::take_while_ref(self, accept) - } - - /// Return an iterator adaptor that filters `Option<A>` iterator elements - /// and produces `A`. Stops on the first `None` encountered. - /// - /// Iterator element type is `A`, the unwrapped element. - /// - /// ``` - /// use itertools::Itertools; - /// - /// // List all hexadecimal digits - /// itertools::assert_equal( - /// (0..).map(|i| std::char::from_digit(i, 16)).while_some(), - /// "0123456789abcdef".chars()); - /// - /// ``` - fn while_some<A>(self) -> WhileSome<Self> - where Self: Sized + Iterator<Item = Option<A>> - { - adaptors::while_some(self) - } - - /// Return an iterator adaptor that iterates over the combinations of the - /// elements from an iterator. - /// - /// Iterator element can be any homogeneous tuple of type `Self::Item` with - /// size up to 4. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let mut v = Vec::new(); - /// for (a, b) in (1..5).tuple_combinations() { - /// v.push((a, b)); - /// } - /// assert_eq!(v, vec![(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]); - /// - /// let mut it = (1..5).tuple_combinations(); - /// assert_eq!(Some((1, 2, 3)), it.next()); - /// assert_eq!(Some((1, 2, 4)), it.next()); - /// assert_eq!(Some((1, 3, 4)), it.next()); - /// assert_eq!(Some((2, 3, 4)), it.next()); - /// assert_eq!(None, it.next()); - /// - /// // this requires a type hint - /// let it = (1..5).tuple_combinations::<(_, _, _)>(); - /// itertools::assert_equal(it, vec![(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]); - /// - /// // you can also specify the complete type - /// use itertools::TupleCombinations; - /// use std::ops::Range; - /// - /// let it: TupleCombinations<Range<u32>, (u32, u32, u32)> = (1..5).tuple_combinations(); - /// itertools::assert_equal(it, vec![(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]); - /// ``` - fn tuple_combinations<T>(self) -> TupleCombinations<Self, T> - where Self: Sized + Clone, - Self::Item: Clone, - T: adaptors::HasCombination<Self>, - { - adaptors::tuple_combinations(self) - } - - /// Return an iterator adaptor that iterates over the `n`-length combinations of - /// the elements from an iterator. - /// - /// Iterator element type is `Vec<Self::Item>`. The iterator produces a new Vec per iteration, - /// and clones the iterator elements. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let it = (1..5).combinations(3); - /// itertools::assert_equal(it, vec![ - /// vec![1, 2, 3], - /// vec![1, 2, 4], - /// vec![1, 3, 4], - /// vec![2, 3, 4], - /// ]); - /// ``` - #[cfg(feature = "use_std")] - fn combinations(self, n: usize) -> Combinations<Self> - where Self: Sized, - Self::Item: Clone - { - combinations::combinations(self, n) - } - - /// Return an iterator adaptor that pads the sequence to a minimum length of - /// `min` by filling missing elements using a closure `f`. - /// - /// Iterator element type is `Self::Item`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let it = (0..5).pad_using(10, |i| 2*i); - /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 10, 12, 14, 16, 18]); - /// - /// let it = (0..10).pad_using(5, |i| 2*i); - /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); - /// - /// let it = (0..5).pad_using(10, |i| 2*i).rev(); - /// itertools::assert_equal(it, vec![18, 16, 14, 12, 10, 4, 3, 2, 1, 0]); - /// ``` - fn pad_using<F>(self, min: usize, f: F) -> PadUsing<Self, F> - where Self: Sized, - F: FnMut(usize) -> Self::Item - { - pad_tail::pad_using(self, min, f) - } - - /// Flatten an iterator of iterables into a single combined sequence of all - /// the elements in the iterables. - /// - /// This is more or less equivalent to `.flat_map` with an identity - /// function. - /// - /// See also the [`flatten`](fn.flatten.html) function. - /// - /// ```ignore - /// use itertools::Itertools; - /// - /// let data = vec![vec![1, 2, 3], vec![4, 5, 6]]; - /// let flattened = data.iter().flatten(); - /// - /// itertools::assert_equal(flattened, &[1, 2, 3, 4, 5, 6]); - /// ``` - fn flatten(self) -> Flatten<Self, <Self::Item as IntoIterator>::IntoIter> - where Self: Sized, - Self::Item: IntoIterator - { - adaptors::flatten(self) - } - - /// Return an iterator adaptor that wraps each element in a `Position` to - /// ease special-case handling of the first or last elements. - /// - /// Iterator element type is - /// [`Position<Self::Item>`](enum.Position.html) - /// - /// ``` - /// use itertools::{Itertools, Position}; - /// - /// let it = (0..4).with_position(); - /// itertools::assert_equal(it, - /// vec![Position::First(0), - /// Position::Middle(1), - /// Position::Middle(2), - /// Position::Last(3)]); - /// - /// let it = (0..1).with_position(); - /// itertools::assert_equal(it, vec![Position::Only(0)]); - /// ``` - fn with_position(self) -> WithPosition<Self> - where Self: Sized, - { - with_position::with_position(self) - } - - /// Return an iterator adaptor that yields the indices of all elements - /// satisfying a predicate, counted from the start of the iterator. - /// - /// Equivalent to `iter.enumerate().filter(|(_, v)| predicate(v)).map(|(i, _)| i)`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let data = vec![1, 2, 3, 3, 4, 6, 7, 9]; - /// itertools::assert_equal(data.iter().positions(|v| v % 2 == 0), vec![1, 4, 5]); - /// - /// itertools::assert_equal(data.iter().positions(|v| v % 2 == 1).rev(), vec![7, 6, 3, 2, 0]); - /// ``` - fn positions<P>(self, predicate: P) -> Positions<Self, P> - where Self: Sized, - P: FnMut(Self::Item) -> bool, - { - adaptors::positions(self, predicate) - } - - /// Return an iterator adaptor that applies a mutating function - /// to each element before yielding it. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let input = vec![vec![1], vec![3, 2, 1]]; - /// let it = input.into_iter().update(|mut v| v.push(0)); - /// itertools::assert_equal(it, vec![vec![1, 0], vec![3, 2, 1, 0]]); - /// ``` - fn update<F>(self, updater: F) -> Update<Self, F> - where Self: Sized, - F: FnMut(&mut Self::Item), - { - adaptors::update(self, updater) - } - - // non-adaptor methods - /// Advances the iterator and returns the next items grouped in a tuple of - /// a specific size (up to 4). - /// - /// If there are enough elements to be grouped in a tuple, then the tuple is - /// returned inside `Some`, otherwise `None` is returned. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let mut iter = 1..5; - /// - /// assert_eq!(Some((1, 2)), iter.next_tuple()); - /// ``` - fn next_tuple<T>(&mut self) -> Option<T> - where Self: Sized + Iterator<Item = T::Item>, - T: tuple_impl::TupleCollect - { - T::collect_from_iter_no_buf(self) - } - - /// Collects all items from the iterator into a tuple of a specific size - /// (up to 4). - /// - /// If the number of elements inside the iterator is **exactly** equal to - /// the tuple size, then the tuple is returned inside `Some`, otherwise - /// `None` is returned. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let iter = 1..3; - /// - /// if let Some((x, y)) = iter.collect_tuple() { - /// assert_eq!((x, y), (1, 2)) - /// } else { - /// panic!("Expected two elements") - /// } - /// ``` - fn collect_tuple<T>(mut self) -> Option<T> - where Self: Sized + Iterator<Item = T::Item>, - T: tuple_impl::TupleCollect - { - match self.next_tuple() { - elt @ Some(_) => match self.next() { - Some(_) => None, - None => elt, - }, - _ => None - } - } - - - /// Find the position and value of the first element satisfying a predicate. - /// - /// The iterator is not advanced past the first element found. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let text = "Hα"; - /// assert_eq!(text.chars().find_position(|ch| ch.is_lowercase()), Some((1, 'α'))); - /// ``` - fn find_position<P>(&mut self, mut pred: P) -> Option<(usize, Self::Item)> - where P: FnMut(&Self::Item) -> bool - { - let mut index = 0usize; - for elt in self { - if pred(&elt) { - return Some((index, elt)); - } - index += 1; - } - None - } - - /// Check whether all elements compare equal. - /// - /// Empty iterators are considered to have equal elements: - /// - /// ``` - /// use itertools::Itertools; - /// - /// let data = vec![1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5]; - /// assert!(!data.iter().all_equal()); - /// assert!(data[0..3].iter().all_equal()); - /// assert!(data[3..5].iter().all_equal()); - /// assert!(data[5..8].iter().all_equal()); - /// - /// let data : Option<usize> = None; - /// assert!(data.into_iter().all_equal()); - /// ``` - fn all_equal(&mut self) -> bool - where Self::Item: PartialEq, - { - self.dedup().nth(1).is_none() - } - - /// Consume the first `n` elements from the iterator eagerly, - /// and return the same iterator again. - /// - /// It works similarly to *.skip(* `n` *)* except it is eager and - /// preserves the iterator type. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let mut iter = "αβγ".chars().dropping(2); - /// itertools::assert_equal(iter, "γ".chars()); - /// ``` - /// - /// *Fusing notes: if the iterator is exhausted by dropping, - /// the result of calling `.next()` again depends on the iterator implementation.* - fn dropping(mut self, n: usize) -> Self - where Self: Sized - { - if n > 0 { - self.nth(n - 1); - } - self - } - - /// Consume the last `n` elements from the iterator eagerly, - /// and return the same iterator again. - /// - /// This is only possible on double ended iterators. `n` may be - /// larger than the number of elements. - /// - /// Note: This method is eager, dropping the back elements immediately and - /// preserves the iterator type. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let init = vec![0, 3, 6, 9].into_iter().dropping_back(1); - /// itertools::assert_equal(init, vec![0, 3, 6]); - /// ``` - fn dropping_back(mut self, n: usize) -> Self - where Self: Sized, - Self: DoubleEndedIterator - { - if n > 0 { - (&mut self).rev().nth(n - 1); - } - self - } - - /// Run the closure `f` eagerly on each element of the iterator. - /// - /// Consumes the iterator until its end. - /// - /// ``` - /// use std::sync::mpsc::channel; - /// use itertools::Itertools; - /// - /// let (tx, rx) = channel(); - /// - /// // use .foreach() to apply a function to each value -- sending it - /// (0..5).map(|x| x * 2 + 1).foreach(|x| { tx.send(x).unwrap(); } ); - /// - /// drop(tx); - /// - /// itertools::assert_equal(rx.iter(), vec![1, 3, 5, 7, 9]); - /// ``` - fn foreach<F>(self, mut f: F) - where F: FnMut(Self::Item), - Self: Sized, - { - self.fold((), move |(), element| f(element)) - } - - /// Combine all an iterator's elements into one element by using `Extend`. - /// - /// This combinator will extend the first item with each of the rest of the - /// items of the iterator. If the iterator is empty, the default value of - /// `I::Item` is returned. - /// - /// ```rust - /// use itertools::Itertools; - /// - /// let input = vec![vec![1], vec![2, 3], vec![4, 5, 6]]; - /// assert_eq!(input.into_iter().concat(), - /// vec![1, 2, 3, 4, 5, 6]); - /// ``` - fn concat(self) -> Self::Item - where Self: Sized, - Self::Item: Extend<<<Self as Iterator>::Item as IntoIterator>::Item> + IntoIterator + Default - { - concat(self) - } - - /// `.collect_vec()` is simply a type specialization of `.collect()`, - /// for convenience. - #[cfg(feature = "use_std")] - fn collect_vec(self) -> Vec<Self::Item> - where Self: Sized - { - self.collect() - } - - /// Assign to each reference in `self` from the `from` iterator, - /// stopping at the shortest of the two iterators. - /// - /// The `from` iterator is queried for its next element before the `self` - /// iterator, and if either is exhausted the method is done. - /// - /// Return the number of elements written. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let mut xs = [0; 4]; - /// xs.iter_mut().set_from(1..); - /// assert_eq!(xs, [1, 2, 3, 4]); - /// ``` - #[inline] - fn set_from<'a, A: 'a, J>(&mut self, from: J) -> usize - where Self: Iterator<Item = &'a mut A>, - J: IntoIterator<Item = A> - { - let mut count = 0; - for elt in from { - match self.next() { - None => break, - Some(ptr) => *ptr = elt, - } - count += 1; - } - count - } - - /// Combine all iterator elements into one String, seperated by `sep`. - /// - /// Use the `Display` implementation of each element. - /// - /// ``` - /// use itertools::Itertools; - /// - /// assert_eq!(["a", "b", "c"].iter().join(", "), "a, b, c"); - /// assert_eq!([1, 2, 3].iter().join(", "), "1, 2, 3"); - /// ``` - #[cfg(feature = "use_std")] - fn join(&mut self, sep: &str) -> String - where Self::Item: std::fmt::Display - { - match self.next() { - None => String::new(), - Some(first_elt) => { - // estimate lower bound of capacity needed - let (lower, _) = self.size_hint(); - let mut result = String::with_capacity(sep.len() * lower); - write!(&mut result, "{}", first_elt).unwrap(); - for elt in self { - result.push_str(sep); - write!(&mut result, "{}", elt).unwrap(); - } - result - } - } - } - - /// Format all iterator elements, separated by `sep`. - /// - /// All elements are formatted (any formatting trait) - /// with `sep` inserted between each element. - /// - /// **Panics** if the formatter helper is formatted more than once. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let data = [1.1, 2.71828, -3.]; - /// assert_eq!( - /// format!("{:.2}", data.iter().format(", ")), - /// "1.10, 2.72, -3.00"); - /// ``` - fn format(self, sep: &str) -> Format<Self> - where Self: Sized, - { - format::new_format_default(self, sep) - } - - /// Format all iterator elements, separated by `sep`. - /// - /// This is a customizable version of `.format()`. - /// - /// The supplied closure `format` is called once per iterator element, - /// with two arguments: the element and a callback that takes a - /// `&Display` value, i.e. any reference to type that implements `Display`. - /// - /// Using `&format_args!(...)` is the most versatile way to apply custom - /// element formatting. The callback can be called multiple times if needed. - /// - /// **Panics** if the formatter helper is formatted more than once. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let data = [1.1, 2.71828, -3.]; - /// let data_formatter = data.iter().format_with(", ", |elt, f| f(&format_args!("{:.2}", elt))); - /// assert_eq!(format!("{}", data_formatter), - /// "1.10, 2.72, -3.00"); - /// - /// // .format_with() is recursively composable - /// let matrix = [[1., 2., 3.], - /// [4., 5., 6.]]; - /// let matrix_formatter = matrix.iter().format_with("\n", |row, f| { - /// f(&row.iter().format_with(", ", |elt, g| g(&elt))) - /// }); - /// assert_eq!(format!("{}", matrix_formatter), - /// "1, 2, 3\n4, 5, 6"); - /// - /// - /// ``` - fn format_with<F>(self, sep: &str, format: F) -> FormatWith<Self, F> - where Self: Sized, - F: FnMut(Self::Item, &mut FnMut(&fmt::Display) -> fmt::Result) -> fmt::Result, - { - format::new_format(self, sep, format) - } - - /// Fold `Result` values from an iterator. - /// - /// Only `Ok` values are folded. If no error is encountered, the folded - /// value is returned inside `Ok`. Otherwise, the operation terminates - /// and returns the first `Err` value it encounters. No iterator elements are - /// consumed after the first error. - /// - /// The first accumulator value is the `start` parameter. - /// Each iteration passes the accumulator value and the next value inside `Ok` - /// to the fold function `f` and its return value becomes the new accumulator value. - /// - /// For example the sequence *Ok(1), Ok(2), Ok(3)* will result in a - /// computation like this: - /// - /// ```ignore - /// let mut accum = start; - /// accum = f(accum, 1); - /// accum = f(accum, 2); - /// accum = f(accum, 3); - /// ``` - /// - /// With a `start` value of 0 and an addition as folding function, - /// this effetively results in *((0 + 1) + 2) + 3* - /// - /// ``` - /// use std::ops::Add; - /// use itertools::Itertools; - /// - /// let values = [1, 2, -2, -1, 2, 1]; - /// assert_eq!( - /// values.iter() - /// .map(Ok::<_, ()>) - /// .fold_results(0, Add::add), - /// Ok(3) - /// ); - /// assert!( - /// values.iter() - /// .map(|&x| if x >= 0 { Ok(x) } else { Err("Negative number") }) - /// .fold_results(0, Add::add) - /// .is_err() - /// ); - /// ``` - fn fold_results<A, E, B, F>(&mut self, mut start: B, mut f: F) -> Result<B, E> - where Self: Iterator<Item = Result<A, E>>, - F: FnMut(B, A) -> B - { - for elt in self { - match elt { - Ok(v) => start = f(start, v), - Err(u) => return Err(u), - } - } - Ok(start) - } - - /// Fold `Option` values from an iterator. - /// - /// Only `Some` values are folded. If no `None` is encountered, the folded - /// value is returned inside `Some`. Otherwise, the operation terminates - /// and returns `None`. No iterator elements are consumed after the `None`. - /// - /// This is the `Option` equivalent to `fold_results`. - /// - /// ``` - /// use std::ops::Add; - /// use itertools::Itertools; - /// - /// let mut values = vec![Some(1), Some(2), Some(-2)].into_iter(); - /// assert_eq!(values.fold_options(5, Add::add), Some(5 + 1 + 2 - 2)); - /// - /// let mut more_values = vec![Some(2), None, Some(0)].into_iter(); - /// assert!(more_values.fold_options(0, Add::add).is_none()); - /// assert_eq!(more_values.next().unwrap(), Some(0)); - /// ``` - fn fold_options<A, B, F>(&mut self, mut start: B, mut f: F) -> Option<B> - where Self: Iterator<Item = Option<A>>, - F: FnMut(B, A) -> B - { - for elt in self { - match elt { - Some(v) => start = f(start, v), - None => return None, - } - } - Some(start) - } - - /// Accumulator of the elements in the iterator. - /// - /// Like `.fold()`, without a base case. If the iterator is - /// empty, return `None`. With just one element, return it. - /// Otherwise elements are accumulated in sequence using the closure `f`. - /// - /// ``` - /// use itertools::Itertools; - /// - /// assert_eq!((0..10).fold1(|x, y| x + y).unwrap_or(0), 45); - /// assert_eq!((0..0).fold1(|x, y| x * y), None); - /// ``` - fn fold1<F>(mut self, f: F) -> Option<Self::Item> - where F: FnMut(Self::Item, Self::Item) -> Self::Item, - Self: Sized, - { - self.next().map(move |x| self.fold(x, f)) - } - - /// Accumulate the elements in the iterator in a tree-like manner. - /// - /// You can think of it as, while there's more than one item, repeatedly - /// combining adjacent items. It does so in bottom-up-merge-sort order, - /// however, so that it needs only logarithmic stack space. - /// - /// This produces a call tree like the following (where the calls under - /// an item are done after reading that item): - /// - /// ```text - /// 1 2 3 4 5 6 7 - /// │ │ │ │ │ │ │ - /// └─f └─f └─f │ - /// │ │ │ │ - /// └───f └─f - /// │ │ - /// └─────f - /// ``` - /// - /// Which, for non-associative functions, will typically produce a different - /// result than the linear call tree used by `fold1`: - /// - /// ```text - /// 1 2 3 4 5 6 7 - /// │ │ │ │ │ │ │ - /// └─f─f─f─f─f─f - /// ``` - /// - /// If `f` is associative, prefer the normal `fold1` instead. - /// - /// ``` - /// use itertools::Itertools; - /// - /// // The same tree as above - /// let num_strings = (1..8).map(|x| x.to_string()); - /// assert_eq!(num_strings.tree_fold1(|x, y| format!("f({}, {})", x, y)), - /// Some(String::from("f(f(f(1, 2), f(3, 4)), f(f(5, 6), 7))"))); - /// - /// // Like fold1, an empty iterator produces None - /// assert_eq!((0..0).tree_fold1(|x, y| x * y), None); - /// - /// // tree_fold1 matches fold1 for associative operations... - /// assert_eq!((0..10).tree_fold1(|x, y| x + y), - /// (0..10).fold1(|x, y| x + y)); - /// // ...but not for non-associative ones - /// assert!((0..10).tree_fold1(|x, y| x - y) - /// != (0..10).fold1(|x, y| x - y)); - /// ``` - // FIXME: If minver changes to >= 1.13, use `assert_ne!` in the doctest. - fn tree_fold1<F>(mut self, mut f: F) -> Option<Self::Item> - where F: FnMut(Self::Item, Self::Item) -> Self::Item, - Self: Sized, - { - type State<T> = Result<T, Option<T>>; - - fn inner0<T, II, FF>(it: &mut II, f: &mut FF) -> State<T> - where - II: Iterator<Item = T>, - FF: FnMut(T, T) -> T - { - // This function could be replaced with `it.next().ok_or(None)`, - // but half the useful tree_fold1 work is combining adjacent items, - // so put that in a form that LLVM is more likely to optimize well. - - let a = - if let Some(v) = it.next() { v } - else { return Err(None) }; - let b = - if let Some(v) = it.next() { v } - else { return Err(Some(a)) }; - Ok(f(a, b)) - } - - fn inner<T, II, FF>(stop: usize, it: &mut II, f: &mut FF) -> State<T> - where - II: Iterator<Item = T>, - FF: FnMut(T, T) -> T - { - let mut x = try!(inner0(it, f)); - for height in 0..stop { - // Try to get another tree the same size with which to combine it, - // creating a new tree that's twice as big for next time around. - let next = - if height == 0 { - inner0(it, f) - } else { - inner(height, it, f) - }; - match next { - Ok(y) => x = f(x, y), - - // If we ran out of items, combine whatever we did manage - // to get. It's better combined with the current value - // than something in a parent frame, because the tree in - // the parent is always as least as big as this one. - Err(None) => return Err(Some(x)), - Err(Some(y)) => return Err(Some(f(x, y))), - } - } - Ok(x) - } - - match inner(usize::max_value(), &mut self, &mut f) { - Err(x) => x, - _ => unreachable!(), - } - } - - /// An iterator method that applies a function, producing a single, final value. - /// - /// `fold_while()` is basically equivalent to `fold()` but with additional support for - /// early exit via short-circuiting. - /// - /// ``` - /// use itertools::Itertools; - /// use itertools::FoldWhile::{Continue, Done}; - /// - /// let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - /// - /// let mut result = 0; - /// - /// // for loop: - /// for i in &numbers { - /// if *i > 5 { - /// break; - /// } - /// result = result + i; - /// } - /// - /// // fold: - /// let result2 = numbers.iter().fold(0, |acc, x| { - /// if *x > 5 { acc } else { acc + x } - /// }); - /// - /// // fold_while: - /// let result3 = numbers.iter().fold_while(0, |acc, x| { - /// if *x > 5 { Done(acc) } else { Continue(acc + x) } - /// }).into_inner(); - /// - /// // they're the same - /// assert_eq!(result, result2); - /// assert_eq!(result2, result3); - /// ``` - /// - /// The big difference between the computations of `result2` and `result3` is that while - /// `fold()` called the provided closure for every item of the callee iterator, - /// `fold_while()` actually stopped iterating as soon as it encountered `Fold::Done(_)`. - fn fold_while<B, F>(&mut self, init: B, mut f: F) -> FoldWhile<B> - where Self: Sized, - F: FnMut(B, Self::Item) -> FoldWhile<B> - { - let mut acc = init; - while let Some(item) = self.next() { - match f(acc, item) { - FoldWhile::Continue(res) => acc = res, - res @ FoldWhile::Done(_) => return res, - } - } - FoldWhile::Continue(acc) - } - - /// Collect all iterator elements into a sorted vector in ascending order. - /// - /// **Note:** This consumes the entire iterator, uses the - /// `slice::sort_by()` method and returns the sorted vector. - /// - /// ``` - /// use itertools::Itertools; - /// - /// // sort the letters of the text in ascending order - /// let text = "bdacfe"; - /// itertools::assert_equal(text.chars().sorted(), - /// "abcdef".chars()); - /// ``` - #[cfg(feature = "use_std")] - fn sorted(self) -> Vec<Self::Item> - where Self: Sized, - Self::Item: Ord - { - self.sorted_by(Ord::cmp) - } - - /// Collect all iterator elements into a sorted vector. - /// - /// **Note:** This consumes the entire iterator, uses the - /// `slice::sort_by()` method and returns the sorted vector. - /// - /// ``` - /// use itertools::Itertools; - /// - /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; - /// - /// let oldest_people_first = people - /// .into_iter() - /// .sorted_by(|a, b| Ord::cmp(&b.1, &a.1)) - /// .into_iter() - /// .map(|(person, _age)| person); - /// - /// itertools::assert_equal(oldest_people_first, - /// vec!["Jill", "Jack", "Jane", "John"]); - /// ``` - #[cfg(feature = "use_std")] - fn sorted_by<F>(self, cmp: F) -> Vec<Self::Item> - where Self: Sized, - F: FnMut(&Self::Item, &Self::Item) -> Ordering, - { - let mut v: Vec<Self::Item> = self.collect(); - - v.sort_by(cmp); - v - } - - /// Collect all iterator elements into a sorted vector. - /// - /// **Note:** This consumes the entire iterator, uses the - /// `slice::sort_by_key()` method and returns the sorted vector. - /// - /// ``` - /// use itertools::Itertools; - /// - /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; - /// - /// let oldest_people_first = people - /// .into_iter() - /// .sorted_by_key(|x| -x.1) - /// .into_iter() - /// .map(|(person, _age)| person); - /// - /// itertools::assert_equal(oldest_people_first, - /// vec!["Jill", "Jack", "Jane", "John"]); - /// ``` - #[cfg(feature = "use_std")] - fn sorted_by_key<K, F>(self, f: F) -> Vec<Self::Item> - where Self: Sized, - K: Ord, - F: FnMut(&Self::Item) -> K, - { - let mut v: Vec<Self::Item> = self.collect(); - - v.sort_by_key(f); - v - } - - /// Collect all iterator elements into one of two - /// partitions. Unlike `Iterator::partition`, each partition may - /// have a distinct type. - /// - /// ``` - /// use itertools::{Itertools, Either}; - /// - /// let successes_and_failures = vec![Ok(1), Err(false), Err(true), Ok(2)]; - /// - /// let (successes, failures): (Vec<_>, Vec<_>) = successes_and_failures - /// .into_iter() - /// .partition_map(|r| { - /// match r { - /// Ok(v) => Either::Left(v), - /// Err(v) => Either::Right(v), - /// } - /// }); - /// - /// assert_eq!(successes, [1, 2]); - /// assert_eq!(failures, [false, true]); - /// ``` - fn partition_map<A, B, F, L, R>(self, predicate: F) -> (A, B) - where Self: Sized, - F: Fn(Self::Item) -> Either<L, R>, - A: Default + Extend<L>, - B: Default + Extend<R>, - { - let mut left = A::default(); - let mut right = B::default(); - - for val in self { - match predicate(val) { - Either::Left(v) => left.extend(Some(v)), - Either::Right(v) => right.extend(Some(v)), - } - } - - (left, right) - } - - /// Return a `HashMap` of keys mapped to `Vec`s of values. Keys and values - /// are taken from `(Key, Value)` tuple pairs yielded by the input iterator. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let data = vec![(0, 10), (2, 12), (3, 13), (0, 20), (3, 33), (2, 42)]; - /// let lookup = data.into_iter().into_group_map(); - /// - /// assert_eq!(lookup[&0], vec![10, 20]); - /// assert_eq!(lookup.get(&1), None); - /// assert_eq!(lookup[&2], vec![12, 42]); - /// assert_eq!(lookup[&3], vec![13, 33]); - /// ``` - #[cfg(feature = "use_std")] - fn into_group_map<K, V>(self) -> HashMap<K, Vec<V>> - where Self: Iterator<Item=(K, V)> + Sized, - K: Hash + Eq, - { - group_map::into_group_map(self) - } - - /// Return the minimum and maximum elements in the iterator. - /// - /// The return type `MinMaxResult` is an enum of three variants: - /// - /// - `NoElements` if the iterator is empty. - /// - `OneElement(x)` if the iterator has exactly one element. - /// - `MinMax(x, y)` is returned otherwise, where `x <= y`. Two - /// values are equal if and only if there is more than one - /// element in the iterator and all elements are equal. - /// - /// On an iterator of length `n`, `minmax` does `1.5 * n` comparisons, - /// and so is faster than calling `min` and `max` separately which does - /// `2 * n` comparisons. - /// - /// # Examples - /// - /// ``` - /// use itertools::Itertools; - /// use itertools::MinMaxResult::{NoElements, OneElement, MinMax}; - /// - /// let a: [i32; 0] = []; - /// assert_eq!(a.iter().minmax(), NoElements); - /// - /// let a = [1]; - /// assert_eq!(a.iter().minmax(), OneElement(&1)); - /// - /// let a = [1, 2, 3, 4, 5]; - /// assert_eq!(a.iter().minmax(), MinMax(&1, &5)); - /// - /// let a = [1, 1, 1, 1]; - /// assert_eq!(a.iter().minmax(), MinMax(&1, &1)); - /// ``` - /// - /// The elements can be floats but no particular result is guaranteed - /// if an element is NaN. - fn minmax(self) -> MinMaxResult<Self::Item> - where Self: Sized, Self::Item: PartialOrd - { - minmax::minmax_impl(self, |_| (), |x, y, _, _| x < y) - } - - /// Return the minimum and maximum element of an iterator, as determined by - /// the specified function. - /// - /// The return value is a variant of `MinMaxResult` like for `minmax()`. - /// - /// For the minimum, the first minimal element is returned. For the maximum, - /// the last maximal element wins. This matches the behavior of the standard - /// `Iterator::min()` and `Iterator::max()` methods. - /// - /// The keys can be floats but no particular result is guaranteed - /// if a key is NaN. - fn minmax_by_key<K, F>(self, key: F) -> MinMaxResult<Self::Item> - where Self: Sized, K: PartialOrd, F: FnMut(&Self::Item) -> K - { - minmax::minmax_impl(self, key, |_, _, xk, yk| xk < yk) - } - - /// Return the minimum and maximum element of an iterator, as determined by - /// the specified comparison function. - /// - /// The return value is a variant of `MinMaxResult` like for `minmax()`. - /// - /// For the minimum, the first minimal element is returned. For the maximum, - /// the last maximal element wins. This matches the behavior of the standard - /// `Iterator::min()` and `Iterator::max()` methods. - fn minmax_by<F>(self, mut compare: F) -> MinMaxResult<Self::Item> - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering - { - minmax::minmax_impl( - self, - |_| (), - |x, y, _, _| Ordering::Less == compare(x, y) - ) - } -} - -impl<T: ?Sized> Itertools for T where T: Iterator { } - -/// Return `true` if both iterables produce equal sequences -/// (elements pairwise equal and sequences of the same length), -/// `false` otherwise. -/// -/// This is an `IntoIterator` enabled function that is similar to the standard -/// library method `Iterator::eq`. -/// -/// ``` -/// assert!(itertools::equal(vec![1, 2, 3], 1..4)); -/// assert!(!itertools::equal(&[0, 0], &[0, 0, 0])); -/// ``` -pub fn equal<I, J>(a: I, b: J) -> bool - where I: IntoIterator, - J: IntoIterator, - I::Item: PartialEq<J::Item> -{ - let mut ia = a.into_iter(); - let mut ib = b.into_iter(); - loop { - match ia.next() { - Some(x) => match ib.next() { - Some(y) => if x != y { return false; }, - None => return false, - }, - None => return ib.next().is_none() - } - } -} - -/// Assert that two iterables produce equal sequences, with the same -/// semantics as *equal(a, b)*. -/// -/// **Panics** on assertion failure with a message that shows the -/// two iteration elements. -/// -/// ```ignore -/// assert_equal("exceed".split('c'), "excess".split('c')); -/// // ^PANIC: panicked at 'Failed assertion Some("eed") == Some("ess") for iteration 1', -/// ``` -pub fn assert_equal<I, J>(a: I, b: J) - where I: IntoIterator, - J: IntoIterator, - I::Item: fmt::Debug + PartialEq<J::Item>, - J::Item: fmt::Debug, -{ - let mut ia = a.into_iter(); - let mut ib = b.into_iter(); - let mut i = 0; - loop { - match (ia.next(), ib.next()) { - (None, None) => return, - (a, b) => { - let equal = match (&a, &b) { - (&Some(ref a), &Some(ref b)) => a == b, - _ => false, - }; - assert!(equal, "Failed assertion {a:?} == {b:?} for iteration {i}", - i=i, a=a, b=b); - i += 1; - } - } - } -} - -/// Partition a sequence using predicate `pred` so that elements -/// that map to `true` are placed before elements which map to `false`. -/// -/// The order within the partitions is arbitrary. -/// -/// Return the index of the split point. -/// -/// ``` -/// use itertools::partition; -/// -/// # // use repeated numbers to not promise any ordering -/// let mut data = [7, 1, 1, 7, 1, 1, 7]; -/// let split_index = partition(&mut data, |elt| *elt >= 3); -/// -/// assert_eq!(data, [7, 7, 7, 1, 1, 1, 1]); -/// assert_eq!(split_index, 3); -/// ``` -pub fn partition<'a, A: 'a, I, F>(iter: I, mut pred: F) -> usize - where I: IntoIterator<Item = &'a mut A>, - I::IntoIter: DoubleEndedIterator, - F: FnMut(&A) -> bool -{ - let mut split_index = 0; - let mut iter = iter.into_iter(); - 'main: while let Some(front) = iter.next() { - if !pred(front) { - loop { - match iter.next_back() { - Some(back) => if pred(back) { - std::mem::swap(front, back); - break; - }, - None => break 'main, - } - } - } - split_index += 1; - } - split_index -} - -/// An enum used for controlling the execution of `.fold_while()`. -/// -/// See [`.fold_while()`](trait.Itertools.html#method.fold_while) for more information. -#[derive(Copy, Clone, Debug)] -pub enum FoldWhile<T> { - /// Continue folding with this value - Continue(T), - /// Fold is complete and will return this value - Done(T), -} - -impl<T> FoldWhile<T> { - /// Return the value in the continue or done. - pub fn into_inner(self) -> T { - match self { - FoldWhile::Continue(x) | FoldWhile::Done(x) => x, - } - } - - /// Return true if `self` is `Done`, false if it is `Continue`. - pub fn is_done(&self) -> bool { - match *self { - FoldWhile::Continue(_) => false, - FoldWhile::Done(_) => true, - } - } -} diff --git a/vendor/itertools-0.7.8/src/merge_join.rs b/vendor/itertools-0.7.8/src/merge_join.rs deleted file mode 100644 index 5f9a0f4013..0000000000 --- a/vendor/itertools-0.7.8/src/merge_join.rs +++ /dev/null @@ -1,87 +0,0 @@ -use std::cmp::Ordering; -use std::iter::Fuse; -use std::fmt; - -use super::adaptors::{PutBack, put_back}; -use either_or_both::EitherOrBoth; - -/// Return an iterator adaptor that merge-joins items from the two base iterators in ascending order. -/// -/// See [`.merge_join_by()`](trait.Itertools.html#method.merge_join_by) for more information. -pub fn merge_join_by<I, J, F>(left: I, right: J, cmp_fn: F) - -> MergeJoinBy<I::IntoIter, J::IntoIter, F> - where I: IntoIterator, - J: IntoIterator, - F: FnMut(&I::Item, &J::Item) -> Ordering -{ - MergeJoinBy { - left: put_back(left.into_iter().fuse()), - right: put_back(right.into_iter().fuse()), - cmp_fn: cmp_fn - } -} - -/// An iterator adaptor that merge-joins items from the two base iterators in ascending order. -/// -/// See [`.merge_join_by()`](../trait.Itertools.html#method.merge_join_by) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MergeJoinBy<I: Iterator, J: Iterator, F> { - left: PutBack<Fuse<I>>, - right: PutBack<Fuse<J>>, - cmp_fn: F -} - -impl<I, J, F> fmt::Debug for MergeJoinBy<I, J, F> - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, - J: Iterator + fmt::Debug, - J::Item: fmt::Debug, -{ - debug_fmt_fields!(MergeJoinBy, left, right); -} - -impl<I, J, F> Iterator for MergeJoinBy<I, J, F> - where I: Iterator, - J: Iterator, - F: FnMut(&I::Item, &J::Item) -> Ordering -{ - type Item = EitherOrBoth<I::Item, J::Item>; - - fn next(&mut self) -> Option<Self::Item> { - match (self.left.next(), self.right.next()) { - (None, None) => None, - (Some(left), None) => - Some(EitherOrBoth::Left(left)), - (None, Some(right)) => - Some(EitherOrBoth::Right(right)), - (Some(left), Some(right)) => { - match (self.cmp_fn)(&left, &right) { - Ordering::Equal => - Some(EitherOrBoth::Both(left, right)), - Ordering::Less => { - self.right.put_back(right); - Some(EitherOrBoth::Left(left)) - }, - Ordering::Greater => { - self.left.put_back(left); - Some(EitherOrBoth::Right(right)) - } - } - } - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let (a_lower, a_upper) = self.left.size_hint(); - let (b_lower, b_upper) = self.right.size_hint(); - - let lower = ::std::cmp::max(a_lower, b_lower); - - let upper = match (a_upper, b_upper) { - (Some(x), Some(y)) => Some(x + y), - _ => None, - }; - - (lower, upper) - } -} diff --git a/vendor/itertools-0.7.8/src/minmax.rs b/vendor/itertools-0.7.8/src/minmax.rs deleted file mode 100644 index 38180ef6d0..0000000000 --- a/vendor/itertools-0.7.8/src/minmax.rs +++ /dev/null @@ -1,114 +0,0 @@ - -/// `MinMaxResult` is an enum returned by `minmax`. See `Itertools::minmax()` for -/// more detail. -#[derive(Copy, Clone, PartialEq, Debug)] -pub enum MinMaxResult<T> { - /// Empty iterator - NoElements, - - /// Iterator with one element, so the minimum and maximum are the same - OneElement(T), - - /// More than one element in the iterator, the first element is not larger - /// than the second - MinMax(T, T) -} - -impl<T: Clone> MinMaxResult<T> { - /// `into_option` creates an `Option` of type `(T, T)`. The returned `Option` - /// has variant `None` if and only if the `MinMaxResult` has variant - /// `NoElements`. Otherwise `Some((x, y))` is returned where `x <= y`. - /// If the `MinMaxResult` has variant `OneElement(x)`, performing this - /// operation will make one clone of `x`. - /// - /// # Examples - /// - /// ``` - /// use itertools::MinMaxResult::{self, NoElements, OneElement, MinMax}; - /// - /// let r: MinMaxResult<i32> = NoElements; - /// assert_eq!(r.into_option(), None); - /// - /// let r = OneElement(1); - /// assert_eq!(r.into_option(), Some((1, 1))); - /// - /// let r = MinMax(1, 2); - /// assert_eq!(r.into_option(), Some((1, 2))); - /// ``` - pub fn into_option(self) -> Option<(T,T)> { - match self { - MinMaxResult::NoElements => None, - MinMaxResult::OneElement(x) => Some((x.clone(), x)), - MinMaxResult::MinMax(x, y) => Some((x, y)) - } - } -} - -/// Implementation guts for `minmax` and `minmax_by_key`. -pub fn minmax_impl<I, K, F, L>(mut it: I, mut key_for: F, - mut lt: L) -> MinMaxResult<I::Item> - where I: Iterator, - F: FnMut(&I::Item) -> K, - L: FnMut(&I::Item, &I::Item, &K, &K) -> bool, -{ - let (mut min, mut max, mut min_key, mut max_key) = match it.next() { - None => return MinMaxResult::NoElements, - Some(x) => { - match it.next() { - None => return MinMaxResult::OneElement(x), - Some(y) => { - let xk = key_for(&x); - let yk = key_for(&y); - if !lt(&y, &x, &yk, &xk) {(x, y, xk, yk)} else {(y, x, yk, xk)} - } - } - } - }; - - loop { - // `first` and `second` are the two next elements we want to look - // at. We first compare `first` and `second` (#1). The smaller one - // is then compared to current minimum (#2). The larger one is - // compared to current maximum (#3). This way we do 3 comparisons - // for 2 elements. - let first = match it.next() { - None => break, - Some(x) => x - }; - let second = match it.next() { - None => { - let first_key = key_for(&first); - if lt(&first, &min, &first_key, &min_key) { - min = first; - } else if !lt(&first, &max, &first_key, &max_key) { - max = first; - } - break; - } - Some(x) => x - }; - let first_key = key_for(&first); - let second_key = key_for(&second); - if !lt(&second, &first, &second_key, &first_key) { - if lt(&first, &min, &first_key, &min_key) { - min = first; - min_key = first_key; - } - if !lt(&second, &max, &second_key, &max_key) { - max = second; - max_key = second_key; - } - } else { - if lt(&second, &min, &second_key, &min_key) { - min = second; - min_key = second_key; - } - if !lt(&first, &max, &first_key, &max_key) { - max = first; - max_key = first_key; - } - } - } - - MinMaxResult::MinMax(min, max) -} diff --git a/vendor/itertools-0.7.8/src/multipeek_impl.rs b/vendor/itertools-0.7.8/src/multipeek_impl.rs deleted file mode 100644 index a6a2fb33eb..0000000000 --- a/vendor/itertools-0.7.8/src/multipeek_impl.rs +++ /dev/null @@ -1,104 +0,0 @@ - - -use std::iter::Fuse; -use std::collections::VecDeque; -use size_hint; -use PeekingNext; - -/// See [`multipeek()`](../fn.multipeek.html) for more information. -#[derive(Clone, Debug)] -pub struct MultiPeek<I> - where I: Iterator -{ - iter: Fuse<I>, - buf: VecDeque<I::Item>, - index: usize, -} - -/// An iterator adaptor that allows the user to peek at multiple `.next()` -/// values without advancing the base iterator. -pub fn multipeek<I>(iterable: I) -> MultiPeek<I::IntoIter> - where I: IntoIterator -{ - MultiPeek { - iter: iterable.into_iter().fuse(), - buf: VecDeque::new(), - index: 0, - } -} - -impl<I> MultiPeek<I> - where I: Iterator -{ - /// Reset the peeking “cursor” - pub fn reset_peek(&mut self) { - self.index = 0; - } -} - -impl<I: Iterator> MultiPeek<I> { - /// Works exactly like `.next()` with the only difference that it doesn't - /// advance itself. `.peek()` can be called multiple times, to peek - /// further ahead. - pub fn peek(&mut self) -> Option<&I::Item> { - let ret = if self.index < self.buf.len() { - Some(&self.buf[self.index]) - } else { - match self.iter.next() { - Some(x) => { - self.buf.push_back(x); - Some(&self.buf[self.index]) - } - None => return None, - } - }; - - self.index += 1; - ret - } -} - -impl<I> PeekingNext for MultiPeek<I> - where I: Iterator, -{ - fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item> - where F: FnOnce(&Self::Item) -> bool - { - if self.buf.is_empty() { - if let Some(r) = self.peek() { - if !accept(r) { return None } - } - } else { - if let Some(r) = self.buf.get(0) { - if !accept(r) { return None } - } - } - self.next() - } -} - -impl<I> Iterator for MultiPeek<I> - where I: Iterator -{ - type Item = I::Item; - - fn next(&mut self) -> Option<I::Item> { - self.index = 0; - if self.buf.is_empty() { - self.iter.next() - } else { - self.buf.pop_front() - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - size_hint::add_scalar(self.iter.size_hint(), self.buf.len()) - } -} - -// Same size -impl<I> ExactSizeIterator for MultiPeek<I> - where I: ExactSizeIterator -{} - - diff --git a/vendor/itertools-0.7.8/src/pad_tail.rs b/vendor/itertools-0.7.8/src/pad_tail.rs deleted file mode 100644 index c9cfe6af30..0000000000 --- a/vendor/itertools-0.7.8/src/pad_tail.rs +++ /dev/null @@ -1,83 +0,0 @@ -use std::iter::Fuse; -use size_hint; - -/// An iterator adaptor that pads a sequence to a minimum length by filling -/// missing elements using a closure. -/// -/// Iterator element type is `I::Item`. -/// -/// See [`.pad_using()`](../trait.Itertools.html#method.pad_using) for more information. -#[derive(Clone)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct PadUsing<I, F> { - iter: Fuse<I>, - min: usize, - pos: usize, - filler: F, -} - -/// Create a new **PadUsing** iterator. -pub fn pad_using<I, F>(iter: I, min: usize, filler: F) -> PadUsing<I, F> - where I: Iterator, - F: FnMut(usize) -> I::Item -{ - PadUsing { - iter: iter.fuse(), - min: min, - pos: 0, - filler: filler, - } -} - -impl<I, F> Iterator for PadUsing<I, F> - where I: Iterator, - F: FnMut(usize) -> I::Item -{ - type Item = I::Item; - - #[inline] - fn next(&mut self) -> Option<I::Item> { - match self.iter.next() { - None => { - if self.pos < self.min { - let e = Some((self.filler)(self.pos)); - self.pos += 1; - e - } else { - None - } - }, - e => { - self.pos += 1; - e - } - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let tail = self.min.saturating_sub(self.pos); - size_hint::max(self.iter.size_hint(), (tail, Some(tail))) - } -} - -impl<I, F> DoubleEndedIterator for PadUsing<I, F> - where I: DoubleEndedIterator + ExactSizeIterator, - F: FnMut(usize) -> I::Item -{ - fn next_back(&mut self) -> Option<I::Item> { - if self.min == 0 { - self.iter.next_back() - } else if self.iter.len() >= self.min { - self.min -= 1; - self.iter.next_back() - } else { - self.min -= 1; - Some((self.filler)(self.min)) - } - } -} - -impl<I, F> ExactSizeIterator for PadUsing<I, F> - where I: ExactSizeIterator, - F: FnMut(usize) -> I::Item -{} diff --git a/vendor/itertools-0.7.8/src/peeking_take_while.rs b/vendor/itertools-0.7.8/src/peeking_take_while.rs deleted file mode 100644 index 0b2291dfdd..0000000000 --- a/vendor/itertools-0.7.8/src/peeking_take_while.rs +++ /dev/null @@ -1,149 +0,0 @@ - -use std::iter::Peekable; -use PutBack; -#[cfg(feature = "use_std")] -use PutBackN; - -/// An iterator that allows peeking at an element before deciding to accept it. -/// -/// See [`.peeking_take_while()`](trait.Itertools.html#method.peeking_take_while) -/// for more information. -/// -/// This is implemented by peeking adaptors like peekable and put back, -/// but also by a few iterators that can be peeked natively, like the slice’s -/// by reference iterator (`std::slice::Iter`). -pub trait PeekingNext : Iterator { - /// Pass a reference to the next iterator element to the closure `accept`; - /// if `accept` returns true, return it as the next element, - /// else None. - fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item> - where F: FnOnce(&Self::Item) -> bool; -} - -impl<I> PeekingNext for Peekable<I> - where I: Iterator, -{ - fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item> - where F: FnOnce(&Self::Item) -> bool - { - if let Some(r) = self.peek() { - if !accept(r) { - return None; - } - } - self.next() - } -} - -impl<I> PeekingNext for PutBack<I> - where I: Iterator, -{ - fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item> - where F: FnOnce(&Self::Item) -> bool - { - if let Some(r) = self.next() { - if !accept(&r) { - self.put_back(r); - return None; - } - Some(r) - } else { - None - } - } -} - -#[cfg(feature = "use_std")] -impl<I> PeekingNext for PutBackN<I> - where I: Iterator, -{ - fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item> - where F: FnOnce(&Self::Item) -> bool - { - if let Some(r) = self.next() { - if !accept(&r) { - self.put_back(r); - return None; - } - Some(r) - } else { - None - } - } -} - -/// An iterator adaptor that takes items while a closure returns `true`. -/// -/// See [`.peeking_take_while()`](../trait.Itertools.html#method.peeking_take_while) -/// for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct PeekingTakeWhile<'a, I: 'a, F> - where I: Iterator, -{ - iter: &'a mut I, - f: F, -} - -/// Create a PeekingTakeWhile -pub fn peeking_take_while<I, F>(iter: &mut I, f: F) -> PeekingTakeWhile<I, F> - where I: Iterator, -{ - PeekingTakeWhile { - iter: iter, - f: f, - } -} - -impl<'a, I, F> Iterator for PeekingTakeWhile<'a, I, F> - where I: PeekingNext, - F: FnMut(&I::Item) -> bool, - -{ - type Item = I::Item; - fn next(&mut self) -> Option<Self::Item> { - self.iter.peeking_next(&mut self.f) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let (_, hi) = self.iter.size_hint(); - (0, hi) - } -} - -// Some iterators are so lightweight we can simply clone them to save their -// state and use that for peeking. -macro_rules! peeking_next_by_clone { - ([$($typarm:tt)*] $type_:ty) => { - impl<$($typarm)*> PeekingNext for $type_ { - fn peeking_next<F>(&mut self, accept: F) -> Option<Self::Item> - where F: FnOnce(&Self::Item) -> bool - { - let saved_state = self.clone(); - if let Some(r) = self.next() { - if !accept(&r) { - *self = saved_state; - } else { - return Some(r) - } - } - None - } - } - } -} - -peeking_next_by_clone! { ['a, T] ::std::slice::Iter<'a, T> } -peeking_next_by_clone! { ['a] ::std::str::Chars<'a> } -peeking_next_by_clone! { ['a] ::std::str::CharIndices<'a> } -peeking_next_by_clone! { ['a] ::std::str::Bytes<'a> } -peeking_next_by_clone! { ['a, T] ::std::option::Iter<'a, T> } -peeking_next_by_clone! { ['a, T] ::std::result::Iter<'a, T> } -peeking_next_by_clone! { [T] ::std::iter::Empty<T> } -#[cfg(feature = "use_std")] -peeking_next_by_clone! { ['a, T] ::std::collections::linked_list::Iter<'a, T> } -#[cfg(feature = "use_std")] -peeking_next_by_clone! { ['a, T] ::std::collections::vec_deque::Iter<'a, T> } - -// cloning a Rev has no extra overhead; peekable and put backs are never DEI. -peeking_next_by_clone! { [I: Clone + PeekingNext + DoubleEndedIterator] - ::std::iter::Rev<I> } diff --git a/vendor/itertools-0.7.8/src/process_results_impl.rs b/vendor/itertools-0.7.8/src/process_results_impl.rs deleted file mode 100644 index f78515d77f..0000000000 --- a/vendor/itertools-0.7.8/src/process_results_impl.rs +++ /dev/null @@ -1,81 +0,0 @@ - -/// An iterator that produces only the `T` values as long as the -/// inner iterator produces `Ok(T)`. -/// -/// Used by [`process_results`](../fn.process_results.html), see its docs -/// for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct ProcessResults<'a, I, E: 'a> { - error: &'a mut Result<(), E>, - iter: I, -} - -impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E> - where I: Iterator<Item = Result<T, E>> -{ - type Item = T; - - fn next(&mut self) -> Option<Self::Item> { - match self.iter.next() { - Some(Ok(x)) => Some(x), - Some(Err(e)) => { - *self.error = Err(e); - None - } - None => None, - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let (_, hi) = self.iter.size_hint(); - (0, hi) - } -} - -/// “Lift” a function of the values of an iterator so that it can process -/// an iterator of `Result` values instead. -/// -/// `iterable` is an iterator or iterable with `Result<T, E>` elements, where -/// `T` is the value type and `E` the error type. -/// -/// `processor` is a closure that receives an adapted version of the iterable -/// as the only argument — the adapted iterator produces elements of type `T`, -/// as long as the original iterator produces `Ok` values. -/// -/// If the original iterable produces an error at any point, the adapted -/// iterator ends and the `process_results` function will return the -/// error iself. -/// -/// Otherwise, the return value from the closure is returned wrapped -/// inside `Ok`. -/// -/// # Example -/// -/// ``` -/// use itertools::process_results; -/// -/// type R = Result<i32, &'static str>; -/// -/// let first_values: Vec<R> = vec![Ok(1), Ok(0), Ok(3)]; -/// let second_values: Vec<R> = vec![Ok(2), Ok(1), Err("overflow")]; -/// -/// // “Lift” the iterator .max() method to work on the values in Results using process_results -/// -/// let first_max = process_results(first_values, |iter| iter.max().unwrap_or(0)); -/// let second_max = process_results(second_values, |iter| iter.max().unwrap_or(0)); -/// -/// assert_eq!(first_max, Ok(3)); -/// assert!(second_max.is_err()); -/// ``` -pub fn process_results<I, F, T, E, R>(iterable: I, processor: F) -> Result<R, E> - where I: IntoIterator<Item = Result<T, E>>, - F: FnOnce(ProcessResults<I::IntoIter, E>) -> R -{ - let iter = iterable.into_iter(); - let mut error = Ok(()); - - let result = processor(ProcessResults { error: &mut error, iter: iter }); - - error.map(|_| result) -} diff --git a/vendor/itertools-0.7.8/src/put_back_n_impl.rs b/vendor/itertools-0.7.8/src/put_back_n_impl.rs deleted file mode 100644 index cc08320714..0000000000 --- a/vendor/itertools-0.7.8/src/put_back_n_impl.rs +++ /dev/null @@ -1,63 +0,0 @@ -use size_hint; - -/// An iterator adaptor that allows putting multiple -/// items in front of the iterator. -/// -/// Iterator element type is `I::Item`. -#[derive(Debug, Clone)] -pub struct PutBackN<I: Iterator> { - top: Vec<I::Item>, - iter: I, -} - -/// Create an iterator where you can put back multiple values to the front -/// of the iteration. -/// -/// Iterator element type is `I::Item`. -pub fn put_back_n<I>(iterable: I) -> PutBackN<I::IntoIter> - where I: IntoIterator -{ - PutBackN { - top: Vec::new(), - iter: iterable.into_iter(), - } -} - -impl<I: Iterator> PutBackN<I> { - /// Puts x in front of the iterator. - /// The values are yielded in order of the most recently put back - /// values first. - /// - /// ```rust - /// use itertools::put_back_n; - /// - /// let mut it = put_back_n(1..5); - /// it.next(); - /// it.put_back(1); - /// it.put_back(0); - /// - /// assert!(itertools::equal(it, 0..5)); - /// ``` - #[inline] - pub fn put_back(&mut self, x: I::Item) { - self.top.push(x); - } -} - -impl<I: Iterator> Iterator for PutBackN<I> { - type Item = I::Item; - #[inline] - fn next(&mut self) -> Option<I::Item> { - if self.top.is_empty() { - self.iter.next() - } else { - self.top.pop() - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - size_hint::add_scalar(self.iter.size_hint(), self.top.len()) - } -} - diff --git a/vendor/itertools-0.7.8/src/rciter_impl.rs b/vendor/itertools-0.7.8/src/rciter_impl.rs deleted file mode 100644 index 1c3b03b5bc..0000000000 --- a/vendor/itertools-0.7.8/src/rciter_impl.rs +++ /dev/null @@ -1,98 +0,0 @@ - -use std::iter::IntoIterator; -use std::rc::Rc; -use std::cell::RefCell; - -/// A wrapper for `Rc<RefCell<I>>`, that implements the `Iterator` trait. -#[derive(Debug)] -pub struct RcIter<I> { - /// The boxed iterator. - pub rciter: Rc<RefCell<I>>, -} - -/// Return an iterator inside a `Rc<RefCell<_>>` wrapper. -/// -/// The returned `RcIter` can be cloned, and each clone will refer back to the -/// same original iterator. -/// -/// `RcIter` allows doing interesting things like using `.zip()` on an iterator with -/// itself, at the cost of runtime borrow checking which may have a performance -/// penalty. -/// -/// Iterator element type is `Self::Item`. -/// -/// ``` -/// use itertools::rciter; -/// use itertools::zip; -/// -/// // In this example a range iterator is created and we iterate it using -/// // three separate handles (two of them given to zip). -/// // We also use the IntoIterator implementation for `&RcIter`. -/// -/// let mut iter = rciter(0..9); -/// let mut z = zip(&iter, &iter); -/// -/// assert_eq!(z.next(), Some((0, 1))); -/// assert_eq!(z.next(), Some((2, 3))); -/// assert_eq!(z.next(), Some((4, 5))); -/// assert_eq!(iter.next(), Some(6)); -/// assert_eq!(z.next(), Some((7, 8))); -/// assert_eq!(z.next(), None); -/// ``` -/// -/// **Panics** in iterator methods if a borrow error is encountered in the -/// iterator methods. It can only happen if the `RcIter` is reentered in -/// `.next()`, i.e. if it somehow participates in an “iterator knot” -/// where it is an adaptor of itself. -pub fn rciter<I>(iterable: I) -> RcIter<I::IntoIter> - where I: IntoIterator -{ - RcIter { rciter: Rc::new(RefCell::new(iterable.into_iter())) } -} - -impl<I> Clone for RcIter<I> { - #[inline] - fn clone(&self) -> RcIter<I> { - RcIter { rciter: self.rciter.clone() } - } -} - -impl<A, I> Iterator for RcIter<I> - where I: Iterator<Item = A> -{ - type Item = A; - #[inline] - fn next(&mut self) -> Option<A> { - self.rciter.borrow_mut().next() - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - // To work sanely with other API that assume they own an iterator, - // so it can't change in other places, we can't guarantee as much - // in our size_hint. Other clones may drain values under our feet. - let (_, hi) = self.rciter.borrow().size_hint(); - (0, hi) - } -} - -impl<I> DoubleEndedIterator for RcIter<I> - where I: DoubleEndedIterator -{ - #[inline] - fn next_back(&mut self) -> Option<I::Item> { - self.rciter.borrow_mut().next_back() - } -} - -/// Return an iterator from `&RcIter<I>` (by simply cloning it). -impl<'a, I> IntoIterator for &'a RcIter<I> - where I: Iterator -{ - type Item = I::Item; - type IntoIter = RcIter<I>; - - fn into_iter(self) -> RcIter<I> { - self.clone() - } -} diff --git a/vendor/itertools-0.7.8/src/repeatn.rs b/vendor/itertools-0.7.8/src/repeatn.rs deleted file mode 100644 index 1c7c310014..0000000000 --- a/vendor/itertools-0.7.8/src/repeatn.rs +++ /dev/null @@ -1,54 +0,0 @@ - -/// An iterator that produces *n* repetitions of an element. -/// -/// See [`repeat_n()`](../fn.repeat_n.html) for more information. -#[must_use = "iterators are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct RepeatN<A> { - elt: Option<A>, - n: usize, -} - -/// Create an iterator that produces `n` repetitions of `element`. -pub fn repeat_n<A>(element: A, n: usize) -> RepeatN<A> - where A: Clone, -{ - if n == 0 { - RepeatN { elt: None, n: n, } - } else { - RepeatN { elt: Some(element), n: n, } - } -} - -impl<A> Iterator for RepeatN<A> - where A: Clone -{ - type Item = A; - - fn next(&mut self) -> Option<Self::Item> { - if self.n > 1 { - self.n -= 1; - self.elt.as_ref().cloned() - } else { - self.n = 0; - self.elt.take() - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - (self.n, Some(self.n)) - } -} - -impl<A> DoubleEndedIterator for RepeatN<A> - where A: Clone -{ - #[inline] - fn next_back(&mut self) -> Option<Self::Item> { - self.next() - } -} - -impl<A> ExactSizeIterator for RepeatN<A> - where A: Clone -{} diff --git a/vendor/itertools-0.7.8/src/size_hint.rs b/vendor/itertools-0.7.8/src/size_hint.rs deleted file mode 100644 index be54443f29..0000000000 --- a/vendor/itertools-0.7.8/src/size_hint.rs +++ /dev/null @@ -1,104 +0,0 @@ -//! Arithmetic on **Iterator** *.size_hint()* values. -//! - -use std::usize; -use std::cmp; - -/// **SizeHint** is the return type of **Iterator::size_hint()**. -pub type SizeHint = (usize, Option<usize>); - -/// Add **SizeHint** correctly. -#[inline] -pub fn add(a: SizeHint, b: SizeHint) -> SizeHint { - let min = a.0.checked_add(b.0).unwrap_or(usize::MAX); - let max = match (a.1, b.1) { - (Some(x), Some(y)) => x.checked_add(y), - _ => None, - }; - - (min, max) -} - -/// Add **x** correctly to a **SizeHint**. -#[inline] -pub fn add_scalar(sh: SizeHint, x: usize) -> SizeHint { - let (mut low, mut hi) = sh; - low = low.saturating_add(x); - hi = hi.and_then(|elt| elt.checked_add(x)); - (low, hi) -} - -/// Sbb **x** correctly to a **SizeHint**. -#[inline] -#[allow(dead_code)] -pub fn sub_scalar(sh: SizeHint, x: usize) -> SizeHint { - let (mut low, mut hi) = sh; - low = low.saturating_sub(x); - hi = hi.map(|elt| elt.saturating_sub(x)); - (low, hi) -} - - -/// Multiply **SizeHint** correctly -/// -/// ```ignore -/// use std::usize; -/// use itertools::size_hint; -/// -/// assert_eq!(size_hint::mul((3, Some(4)), (3, Some(4))), -/// (9, Some(16))); -/// -/// assert_eq!(size_hint::mul((3, Some(4)), (usize::MAX, None)), -/// (usize::MAX, None)); -/// -/// assert_eq!(size_hint::mul((3, None), (0, Some(0))), -/// (0, Some(0))); -/// ``` -#[inline] -pub fn mul(a: SizeHint, b: SizeHint) -> SizeHint { - let low = a.0.checked_mul(b.0).unwrap_or(usize::MAX); - let hi = match (a.1, b.1) { - (Some(x), Some(y)) => x.checked_mul(y), - (Some(0), None) | (None, Some(0)) => Some(0), - _ => None, - }; - (low, hi) -} - -/// Multiply **x** correctly with a **SizeHint**. -#[inline] -pub fn mul_scalar(sh: SizeHint, x: usize) -> SizeHint { - let (mut low, mut hi) = sh; - low = low.saturating_mul(x); - hi = hi.and_then(|elt| elt.checked_mul(x)); - (low, hi) -} - -/// Return the maximum -#[inline] -pub fn max(a: SizeHint, b: SizeHint) -> SizeHint { - let (a_lower, a_upper) = a; - let (b_lower, b_upper) = b; - - let lower = cmp::max(a_lower, b_lower); - - let upper = match (a_upper, b_upper) { - (Some(x), Some(y)) => Some(cmp::max(x, y)), - _ => None, - }; - - (lower, upper) -} - -/// Return the minimum -#[inline] -pub fn min(a: SizeHint, b: SizeHint) -> SizeHint { - let (a_lower, a_upper) = a; - let (b_lower, b_upper) = b; - let lower = cmp::min(a_lower, b_lower); - let upper = match (a_upper, b_upper) { - (Some(u1), Some(u2)) => Some(cmp::min(u1, u2)), - _ => a_upper.or(b_upper), - }; - (lower, upper) -} diff --git a/vendor/itertools-0.7.8/src/sources.rs b/vendor/itertools-0.7.8/src/sources.rs deleted file mode 100644 index 562801bf00..0000000000 --- a/vendor/itertools-0.7.8/src/sources.rs +++ /dev/null @@ -1,187 +0,0 @@ -//! Iterators that are sources (produce elements from parameters, -//! not from another iterator). - -use std::fmt; -use std::mem; - -/// See [`repeat_call`](../fn.repeat_call.html) for more information. -pub struct RepeatCall<F> { - f: F, -} - -impl<F> fmt::Debug for RepeatCall<F> -{ - debug_fmt_fields!(RepeatCall, ); -} - -/// An iterator source that produces elements indefinitely by calling -/// a given closure. -/// -/// Iterator element type is the return type of the closure. -/// -/// ``` -/// use itertools::repeat_call; -/// use itertools::Itertools; -/// use std::collections::BinaryHeap; -/// -/// let mut heap = BinaryHeap::from(vec![2, 5, 3, 7, 8]); -/// -/// // extract each element in sorted order -/// for element in repeat_call(|| heap.pop()).while_some() { -/// print!("{}", element); -/// } -/// -/// itertools::assert_equal( -/// repeat_call(|| 1).take(5), -/// vec![1, 1, 1, 1, 1] -/// ); -/// ``` -pub fn repeat_call<F, A>(function: F) -> RepeatCall<F> - where F: FnMut() -> A -{ - RepeatCall { f: function } -} - -impl<A, F> Iterator for RepeatCall<F> - where F: FnMut() -> A -{ - type Item = A; - - #[inline] - fn next(&mut self) -> Option<A> { - Some((self.f)()) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - (usize::max_value(), None) - } -} - -/// Creates a new unfold source with the specified closure as the "iterator -/// function" and an initial state to eventually pass to the closure -/// -/// `unfold` is a general iterator builder: it has a mutable state value, -/// and a closure with access to the state that produces the next value. -/// -/// This more or less equivalent to a regular struct with an `Iterator` -/// implementation, and is useful for one-off iterators. -/// -/// ``` -/// // an iterator that yields sequential Fibonacci numbers, -/// // and stops at the maximum representable value. -/// -/// use itertools::unfold; -/// -/// let (mut x1, mut x2) = (1u32, 1u32); -/// let mut fibonacci = unfold((), move |_| { -/// // Attempt to get the next Fibonacci number -/// let next = x1.saturating_add(x2); -/// -/// // Shift left: ret <- x1 <- x2 <- next -/// let ret = x1; -/// x1 = x2; -/// x2 = next; -/// -/// // If addition has saturated at the maximum, we are finished -/// if ret == x1 && ret > 1 { -/// return None; -/// } -/// -/// Some(ret) -/// }); -/// -/// itertools::assert_equal(fibonacci.by_ref().take(8), -/// vec![1, 1, 2, 3, 5, 8, 13, 21]); -/// assert_eq!(fibonacci.last(), Some(2_971_215_073)) -/// ``` -pub fn unfold<A, St, F>(initial_state: St, f: F) -> Unfold<St, F> - where F: FnMut(&mut St) -> Option<A> -{ - Unfold { - f: f, - state: initial_state, - } -} - -impl<St, F> fmt::Debug for Unfold<St, F> - where St: fmt::Debug, -{ - debug_fmt_fields!(Unfold, state); -} - -/// See [`unfold`](../fn.unfold.html) for more information. -#[derive(Clone)] -#[must_use = "iterators are lazy and do nothing unless consumed"] -pub struct Unfold<St, F> { - f: F, - /// Internal state that will be passed to the closure on the next iteration - pub state: St, -} - -impl<A, St, F> Iterator for Unfold<St, F> - where F: FnMut(&mut St) -> Option<A> -{ - type Item = A; - - #[inline] - fn next(&mut self) -> Option<A> { - (self.f)(&mut self.state) - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - // no possible known bounds at this point - (0, None) - } -} - -/// An iterator that infinitely applies function to value and yields results. -/// -/// This `struct` is created by the [`iterate()`] function. See its documentation for more. -/// -/// [`iterate()`]: ../fn.iterate.html -#[derive(Clone)] -#[must_use = "iterators are lazy and do nothing unless consumed"] -pub struct Iterate<St, F> { - state: St, - f: F, -} - -impl<St, F> fmt::Debug for Iterate<St, F> - where St: fmt::Debug, -{ - debug_fmt_fields!(Iterate, state); -} - -impl<St, F> Iterator for Iterate<St, F> - where F: FnMut(&St) -> St -{ - type Item = St; - - #[inline] - fn next(&mut self) -> Option<Self::Item> { - let next_state = (self.f)(&self.state); - Some(mem::replace(&mut self.state, next_state)) - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - (usize::max_value(), None) - } -} - -/// Creates a new iterator that infinitely applies function to value and yields results. -/// -/// ``` -/// use itertools::iterate; -/// -/// itertools::assert_equal(iterate(1, |&i| i * 3).take(5), vec![1, 3, 9, 27, 81]); -/// ``` -pub fn iterate<St, F>(initial_value: St, f: F) -> Iterate<St, F> - where F: FnMut(&St) -> St -{ - Iterate { - state: initial_value, - f: f, - } -} diff --git a/vendor/itertools-0.7.8/src/tee.rs b/vendor/itertools-0.7.8/src/tee.rs deleted file mode 100644 index 77d261759d..0000000000 --- a/vendor/itertools-0.7.8/src/tee.rs +++ /dev/null @@ -1,78 +0,0 @@ -use super::size_hint; - -use std::cell::RefCell; -use std::collections::VecDeque; -use std::rc::Rc; - -/// Common buffer object for the two tee halves -#[derive(Debug)] -struct TeeBuffer<A, I> { - backlog: VecDeque<A>, - iter: I, - /// The owner field indicates which id should read from the backlog - owner: bool, -} - -/// One half of an iterator pair where both return the same elements. -/// -/// See [`.tee()`](../trait.Itertools.html#method.tee) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct Tee<I> - where I: Iterator -{ - rcbuffer: Rc<RefCell<TeeBuffer<I::Item, I>>>, - id: bool, -} - -pub fn new<I>(iter: I) -> (Tee<I>, Tee<I>) - where I: Iterator -{ - let buffer = TeeBuffer{backlog: VecDeque::new(), iter: iter, owner: false}; - let t1 = Tee{rcbuffer: Rc::new(RefCell::new(buffer)), id: true}; - let t2 = Tee{rcbuffer: t1.rcbuffer.clone(), id: false}; - (t1, t2) -} - -impl<I> Iterator for Tee<I> - where I: Iterator, - I::Item: Clone -{ - type Item = I::Item; - fn next(&mut self) -> Option<I::Item> { - // .borrow_mut may fail here -- but only if the user has tied some kind of weird - // knot where the iterator refers back to itself. - let mut buffer = self.rcbuffer.borrow_mut(); - if buffer.owner == self.id { - match buffer.backlog.pop_front() { - None => {} - some_elt => return some_elt, - } - } - match buffer.iter.next() { - None => None, - Some(elt) => { - buffer.backlog.push_back(elt.clone()); - buffer.owner = !self.id; - Some(elt) - } - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let buffer = self.rcbuffer.borrow(); - let sh = buffer.iter.size_hint(); - - if buffer.owner == self.id { - let log_len = buffer.backlog.len(); - size_hint::add_scalar(sh, log_len) - } else { - sh - } - } -} - -impl<I> ExactSizeIterator for Tee<I> - where I: ExactSizeIterator, - I::Item: Clone -{} diff --git a/vendor/itertools-0.7.8/src/tuple_impl.rs b/vendor/itertools-0.7.8/src/tuple_impl.rs deleted file mode 100644 index 0daa7800c1..0000000000 --- a/vendor/itertools-0.7.8/src/tuple_impl.rs +++ /dev/null @@ -1,266 +0,0 @@ -//! Some iterator that produces tuples - -use std::iter::Fuse; - -/// An iterator over a incomplete tuple. -/// -/// See [`.tuples()`](../trait.Itertools.html#method.tuples) and -/// [`Tuples::into_buffer()`](struct.Tuples.html#method.into_buffer). -#[derive(Debug)] -pub struct TupleBuffer<T> - where T: TupleCollect -{ - cur: usize, - buf: T::Buffer, -} - -impl<T> TupleBuffer<T> - where T: TupleCollect -{ - fn new(buf: T::Buffer) -> Self { - TupleBuffer { - cur: 0, - buf: buf, - } - } -} - -impl<T> Iterator for TupleBuffer<T> - where T: TupleCollect -{ - type Item = T::Item; - - fn next(&mut self) -> Option<Self::Item> { - let s = self.buf.as_mut(); - if let Some(ref mut item) = s.get_mut(self.cur) { - self.cur += 1; - item.take() - } else { - None - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let buffer = &self.buf.as_ref()[self.cur..]; - let len = if buffer.len() == 0 { - 0 - } else { - buffer.iter() - .position(|x| x.is_none()) - .unwrap_or(buffer.len()) - }; - (len, Some(len)) - } -} - -impl<T> ExactSizeIterator for TupleBuffer<T> - where T: TupleCollect -{ -} - -/// An iterator that groups the items in tuples of a specific size. -/// -/// See [`.tuples()`](../trait.Itertools.html#method.tuples) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Tuples<I, T> - where I: Iterator<Item = T::Item>, - T: TupleCollect -{ - iter: Fuse<I>, - buf: T::Buffer, -} - -/// Create a new tuples iterator. -pub fn tuples<I, T>(iter: I) -> Tuples<I, T> - where I: Iterator<Item = T::Item>, - T: TupleCollect -{ - Tuples { - iter: iter.fuse(), - buf: Default::default(), - } -} - -impl<I, T> Iterator for Tuples<I, T> - where I: Iterator<Item = T::Item>, - T: TupleCollect -{ - type Item = T; - - fn next(&mut self) -> Option<T> { - T::collect_from_iter(&mut self.iter, &mut self.buf) - } -} - -impl<I, T> Tuples<I, T> - where I: Iterator<Item = T::Item>, - T: TupleCollect -{ - /// Return a buffer with the produced items that was not enough to be grouped in a tuple. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let mut iter = (0..5).tuples(); - /// assert_eq!(Some((0, 1, 2)), iter.next()); - /// assert_eq!(None, iter.next()); - /// itertools::assert_equal(vec![3, 4], iter.into_buffer()); - /// ``` - pub fn into_buffer(self) -> TupleBuffer<T> { - TupleBuffer::new(self.buf) - } -} - - -/// An iterator over all contiguous windows that produces tuples of a specific size. -/// -/// See [`.tuple_windows()`](../trait.Itertools.html#method.tuple_windows) for more -/// information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct TupleWindows<I, T> - where I: Iterator<Item = T::Item>, - T: TupleCollect -{ - iter: I, - last: Option<T>, -} - -/// Create a new tuple windows iterator. -pub fn tuple_windows<I, T>(mut iter: I) -> TupleWindows<I, T> - where I: Iterator<Item = T::Item>, - T: TupleCollect, - T::Item: Clone -{ - use std::iter::once; - - let mut last = None; - if T::num_items() != 1 { - // put in a duplicate item in front of the tuple; this simplifies - // .next() function. - if let Some(item) = iter.next() { - let iter = once(item.clone()).chain(once(item)).chain(&mut iter); - last = T::collect_from_iter_no_buf(iter); - } - } - - TupleWindows { - last: last, - iter: iter, - } -} - -impl<I, T> Iterator for TupleWindows<I, T> - where I: Iterator<Item = T::Item>, - T: TupleCollect + Clone, - T::Item: Clone -{ - type Item = T; - - fn next(&mut self) -> Option<T> { - if T::num_items() == 1 { - return T::collect_from_iter_no_buf(&mut self.iter) - } - if let Some(ref mut last) = self.last { - if let Some(new) = self.iter.next() { - last.left_shift_push(new); - return Some(last.clone()); - } - } - None - } -} - -pub trait TupleCollect: Sized { - type Item; - type Buffer: Default + AsRef<[Option<Self::Item>]> + AsMut<[Option<Self::Item>]>; - - fn collect_from_iter<I>(iter: I, buf: &mut Self::Buffer) -> Option<Self> - where I: IntoIterator<Item = Self::Item>; - - fn collect_from_iter_no_buf<I>(iter: I) -> Option<Self> - where I: IntoIterator<Item = Self::Item>; - - fn num_items() -> usize; - - fn left_shift_push(&mut self, item: Self::Item); -} - -macro_rules! impl_tuple_collect { - () => (); - ($N:expr; $A:ident ; $($X:ident),* ; $($Y:ident),* ; $($Y_rev:ident),*) => ( - impl<$A> TupleCollect for ($($X),*,) { - type Item = $A; - type Buffer = [Option<$A>; $N - 1]; - - #[allow(unused_assignments, unused_mut)] - fn collect_from_iter<I>(iter: I, buf: &mut Self::Buffer) -> Option<Self> - where I: IntoIterator<Item = $A> - { - let mut iter = iter.into_iter(); - $( - let mut $Y = None; - )* - - loop { - $( - $Y = iter.next(); - if $Y.is_none() { - break - } - )* - return Some(($($Y.unwrap()),*,)) - } - - let mut i = 0; - let mut s = buf.as_mut(); - $( - if i < s.len() { - s[i] = $Y; - i += 1; - } - )* - return None; - } - - #[allow(unused_assignments)] - fn collect_from_iter_no_buf<I>(iter: I) -> Option<Self> - where I: IntoIterator<Item = $A> - { - let mut iter = iter.into_iter(); - loop { - $( - let $Y = if let Some($Y) = iter.next() { - $Y - } else { - break; - }; - )* - return Some(($($Y),*,)) - } - - return None; - } - - fn num_items() -> usize { - $N - } - - fn left_shift_push(&mut self, item: $A) { - use std::mem::replace; - - let &mut ($(ref mut $Y),*,) = self; - let tmp = item; - $( - let tmp = replace($Y_rev, tmp); - )* - drop(tmp); - } - } - ) -} - -impl_tuple_collect!(1; A; A; a; a); -impl_tuple_collect!(2; A; A, A; a, b; b, a); -impl_tuple_collect!(3; A; A, A, A; a, b, c; c, b, a); -impl_tuple_collect!(4; A; A, A, A, A; a, b, c, d; d, c, b, a); diff --git a/vendor/itertools-0.7.8/src/unique_impl.rs b/vendor/itertools-0.7.8/src/unique_impl.rs deleted file mode 100644 index d9e7fd3dc8..0000000000 --- a/vendor/itertools-0.7.8/src/unique_impl.rs +++ /dev/null @@ -1,134 +0,0 @@ - -use std::collections::HashMap; -use std::collections::hash_map::{Entry}; -use std::hash::Hash; -use std::fmt; - -/// An iterator adapter to filter out duplicate elements. -/// -/// See [`.unique_by()`](../trait.Itertools.html#method.unique) for more information. -#[derive(Clone)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct UniqueBy<I: Iterator, V, F> { - iter: I, - // Use a hashmap for the entry API - used: HashMap<V, ()>, - f: F, -} - -impl<I, V, F> fmt::Debug for UniqueBy<I, V, F> - where I: Iterator + fmt::Debug, - V: fmt::Debug + Hash + Eq, -{ - debug_fmt_fields!(UniqueBy, iter, used); -} - -/// Create a new `UniqueBy` iterator. -pub fn unique_by<I, V, F>(iter: I, f: F) -> UniqueBy<I, V, F> - where V: Eq + Hash, - F: FnMut(&I::Item) -> V, - I: Iterator, -{ - UniqueBy { - iter: iter, - used: HashMap::new(), - f: f, - } -} - -// count the number of new unique keys in iterable (`used` is the set already seen) -fn count_new_keys<I, K>(mut used: HashMap<K, ()>, iterable: I) -> usize - where I: IntoIterator<Item=K>, - K: Hash + Eq, -{ - let iter = iterable.into_iter(); - let current_used = used.len(); - used.extend(iter.map(|key| (key, ()))); - used.len() - current_used -} - -impl<I, V, F> Iterator for UniqueBy<I, V, F> - where I: Iterator, - V: Eq + Hash, - F: FnMut(&I::Item) -> V -{ - type Item = I::Item; - - fn next(&mut self) -> Option<I::Item> { - while let Some(v) = self.iter.next() { - let key = (self.f)(&v); - if self.used.insert(key, ()).is_none() { - return Some(v); - } - } - None - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - let (low, hi) = self.iter.size_hint(); - ((low > 0 && self.used.is_empty()) as usize, hi) - } - - fn count(self) -> usize { - let mut key_f = self.f; - count_new_keys(self.used, self.iter.map(move |elt| key_f(&elt))) - } -} - -impl<I> Iterator for Unique<I> - where I: Iterator, - I::Item: Eq + Hash + Clone -{ - type Item = I::Item; - - fn next(&mut self) -> Option<I::Item> { - while let Some(v) = self.iter.iter.next() { - if let Entry::Vacant(entry) = self.iter.used.entry(v) { - let elt = entry.key().clone(); - entry.insert(()); - return Some(elt); - } - } - None - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - let (low, hi) = self.iter.iter.size_hint(); - ((low > 0 && self.iter.used.is_empty()) as usize, hi) - } - - fn count(self) -> usize { - count_new_keys(self.iter.used, self.iter.iter) - } -} - -/// An iterator adapter to filter out duplicate elements. -/// -/// See [`.unique()`](../trait.Itertools.html#method.unique) for more information. -#[derive(Clone)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Unique<I: Iterator> { - iter: UniqueBy<I, I::Item, ()>, -} - -impl<I> fmt::Debug for Unique<I> - where I: Iterator + fmt::Debug, - I::Item: Hash + Eq + fmt::Debug, -{ - debug_fmt_fields!(Unique, iter); -} - -pub fn unique<I>(iter: I) -> Unique<I> - where I: Iterator, - I::Item: Eq + Hash, -{ - Unique { - iter: UniqueBy { - iter: iter, - used: HashMap::new(), - f: (), - } - } -} diff --git a/vendor/itertools-0.7.8/src/with_position.rs b/vendor/itertools-0.7.8/src/with_position.rs deleted file mode 100644 index 2a7c2b8ad6..0000000000 --- a/vendor/itertools-0.7.8/src/with_position.rs +++ /dev/null @@ -1,90 +0,0 @@ -use std::iter::{Fuse,Peekable}; - -/// An iterator adaptor that wraps each element in an [`Position`](../enum.Position.html). -/// -/// Iterator element type is `Position<I::Item>`. -/// -/// See [`.with_position()`](../trait.Itertools.html#method.with_position) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct WithPosition<I> - where I: Iterator, -{ - handled_first: bool, - peekable: Peekable<Fuse<I>>, -} - -/// Create a new `WithPosition` iterator. -pub fn with_position<I>(iter: I) -> WithPosition<I> - where I: Iterator, -{ - WithPosition { - handled_first: false, - peekable: iter.fuse().peekable(), - } -} - -/// A value yielded by `WithPosition`. -/// Indicates the position of this element in the iterator results. -/// -/// See [`.with_position()`](trait.Itertools.html#method.with_position) for more information. -#[derive(Copy, Clone, Debug, PartialEq)] -pub enum Position<T> { - /// This is the first element. - First(T), - /// This is neither the first nor the last element. - Middle(T), - /// This is the last element. - Last(T), - /// This is the only element. - Only(T), -} - -impl<T> Position<T> { - /// Return the inner value. - pub fn into_inner(self) -> T { - match self { - Position::First(x) | - Position::Middle(x) | - Position::Last(x) | - Position::Only(x) => x, - } - } -} - -impl<I: Iterator> Iterator for WithPosition<I> { - type Item = Position<I::Item>; - - fn next(&mut self) -> Option<Self::Item> { - match self.peekable.next() { - Some(item) => { - if !self.handled_first { - // Haven't seen the first item yet, and there is one to give. - self.handled_first = true; - // Peek to see if this is also the last item, - // in which case tag it as `Only`. - match self.peekable.peek() { - Some(_) => Some(Position::First(item)), - None => Some(Position::Only(item)), - } - } else { - // Have seen the first item, and there's something left. - // Peek to see if this is the last item. - match self.peekable.peek() { - Some(_) => Some(Position::Middle(item)), - None => Some(Position::Last(item)), - } - } - } - // Iterator is finished. - None => None, - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.peekable.size_hint() - } -} - -impl<I> ExactSizeIterator for WithPosition<I> - where I: ExactSizeIterator, -{ } diff --git a/vendor/itertools-0.7.8/src/zip_eq_impl.rs b/vendor/itertools-0.7.8/src/zip_eq_impl.rs deleted file mode 100644 index 857465da41..0000000000 --- a/vendor/itertools-0.7.8/src/zip_eq_impl.rs +++ /dev/null @@ -1,60 +0,0 @@ -use super::size_hint; - -/// An iterator which iterates two other iterators simultaneously -/// -/// See [`.zip_eq()`](../trait.Itertools.html#method.zip_eq) for more information. -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct ZipEq<I, J> { - a: I, - b: J, -} - -/// Iterate `i` and `j` in lock step. -/// -/// **Panics** if the iterators are not of the same length. -/// -/// `IntoIterator` enabled version of `i.zip_eq(j)`. -/// -/// ``` -/// use itertools::zip_eq; -/// -/// let data = [1, 2, 3, 4, 5]; -/// for (a, b) in zip_eq(&data[..data.len() - 1], &data[1..]) { -/// /* loop body */ -/// } -/// ``` -pub fn zip_eq<I, J>(i: I, j: J) -> ZipEq<I::IntoIter, J::IntoIter> - where I: IntoIterator, - J: IntoIterator -{ - ZipEq { - a: i.into_iter(), - b: j.into_iter(), - } -} - -impl<I, J> Iterator for ZipEq<I, J> - where I: Iterator, - J: Iterator -{ - type Item = (I::Item, J::Item); - - fn next(&mut self) -> Option<Self::Item> { - match (self.a.next(), self.b.next()) { - (None, None) => None, - (Some(a), Some(b)) => Some((a, b)), - (None, Some(_)) | (Some(_), None) => - panic!("itertools: .zip_eq() reached end of one iterator before the other") - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - size_hint::min(self.a.size_hint(), self.b.size_hint()) - } -} - -impl<I, J> ExactSizeIterator for ZipEq<I, J> - where I: ExactSizeIterator, - J: ExactSizeIterator -{} diff --git a/vendor/itertools-0.7.8/src/zip_longest.rs b/vendor/itertools-0.7.8/src/zip_longest.rs deleted file mode 100644 index 68a381acee..0000000000 --- a/vendor/itertools-0.7.8/src/zip_longest.rs +++ /dev/null @@ -1,78 +0,0 @@ -use std::cmp::Ordering::{Equal, Greater, Less}; -use super::size_hint; -use std::iter::Fuse; - -use either_or_both::EitherOrBoth; - -// ZipLongest originally written by SimonSapin, -// and dedicated to itertools https://github.com/rust-lang/rust/pull/19283 - -/// An iterator which iterates two other iterators simultaneously -/// -/// This iterator is *fused*. -/// -/// See [`.zip_longest()`](../trait.Itertools.html#method.zip_longest) for more information. -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct ZipLongest<T, U> { - a: Fuse<T>, - b: Fuse<U>, -} - -/// Create a new `ZipLongest` iterator. -pub fn zip_longest<T, U>(a: T, b: U) -> ZipLongest<T, U> - where T: Iterator, - U: Iterator -{ - ZipLongest { - a: a.fuse(), - b: b.fuse(), - } -} - -impl<T, U> Iterator for ZipLongest<T, U> - where T: Iterator, - U: Iterator -{ - type Item = EitherOrBoth<T::Item, U::Item>; - - #[inline] - fn next(&mut self) -> Option<Self::Item> { - match (self.a.next(), self.b.next()) { - (None, None) => None, - (Some(a), None) => Some(EitherOrBoth::Left(a)), - (None, Some(b)) => Some(EitherOrBoth::Right(b)), - (Some(a), Some(b)) => Some(EitherOrBoth::Both(a, b)), - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - size_hint::max(self.a.size_hint(), self.b.size_hint()) - } -} - -impl<T, U> DoubleEndedIterator for ZipLongest<T, U> - where T: DoubleEndedIterator + ExactSizeIterator, - U: DoubleEndedIterator + ExactSizeIterator -{ - #[inline] - fn next_back(&mut self) -> Option<Self::Item> { - match self.a.len().cmp(&self.b.len()) { - Equal => match (self.a.next_back(), self.b.next_back()) { - (None, None) => None, - (Some(a), Some(b)) => Some(EitherOrBoth::Both(a, b)), - // These can only happen if .len() is inconsistent with .next_back() - (Some(a), None) => Some(EitherOrBoth::Left(a)), - (None, Some(b)) => Some(EitherOrBoth::Right(b)), - }, - Greater => self.a.next_back().map(EitherOrBoth::Left), - Less => self.b.next_back().map(EitherOrBoth::Right), - } - } -} - -impl<T, U> ExactSizeIterator for ZipLongest<T, U> - where T: ExactSizeIterator, - U: ExactSizeIterator -{} diff --git a/vendor/itertools-0.7.8/src/ziptuple.rs b/vendor/itertools-0.7.8/src/ziptuple.rs deleted file mode 100644 index 2dc3ea5e0b..0000000000 --- a/vendor/itertools-0.7.8/src/ziptuple.rs +++ /dev/null @@ -1,111 +0,0 @@ -use super::size_hint; - -/// See [`multizip`](../fn.multizip.html) for more information. -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Zip<T> { - t: T, -} - -/// An iterator that generalizes *.zip()* and allows running multiple iterators in lockstep. -/// -/// The iterator `Zip<(I, J, ..., M)>` is formed from a tuple of iterators (or values that -/// implement `IntoIterator`) and yields elements -/// until any of the subiterators yields `None`. -/// -/// The iterator element type is a tuple like like `(A, B, ..., E)` where `A` to `E` are the -/// element types of the subiterator. -/// -/// **Note:** The result of this macro is a value of a named type (`Zip<(I, J, -/// ..)>` of each component iterator `I, J, ...`) if each component iterator is -/// nameable. -/// -/// Prefer [`izip!()`] over `multizip` for the performance benefits of using the -/// standard library `.zip()`. Prefer `multizip` if a nameable type is needed. -/// -/// [`izip!()`]: macro.izip.html -/// -/// ``` -/// use itertools::multizip; -/// -/// // iterate over three sequences side-by-side -/// let mut results = [0, 0, 0, 0]; -/// let inputs = [3, 7, 9, 6]; -/// -/// for (r, index, input) in multizip((&mut results, 0..10, &inputs)) { -/// *r = index * 10 + input; -/// } -/// -/// assert_eq!(results, [0 + 3, 10 + 7, 29, 36]); -/// ``` -pub fn multizip<T, U>(t: U) -> Zip<T> - where Zip<T>: From<U>, - Zip<T>: Iterator, -{ - Zip::from(t) -} - -macro_rules! impl_zip_iter { - ($($B:ident),*) => ( - #[allow(non_snake_case)] - impl<$($B: IntoIterator),*> From<($($B,)*)> for Zip<($($B::IntoIter,)*)> { - fn from(t: ($($B,)*)) -> Self { - let ($($B,)*) = t; - Zip { t: ($($B.into_iter(),)*) } - } - } - - #[allow(non_snake_case)] - #[allow(unused_assignments)] - impl<$($B),*> Iterator for Zip<($($B,)*)> - where - $( - $B: Iterator, - )* - { - type Item = ($($B::Item,)*); - - fn next(&mut self) -> Option<Self::Item> - { - let ($(ref mut $B,)*) = self.t; - - // NOTE: Just like iter::Zip, we check the iterators - // for None in order. We may finish unevenly (some - // iterators gave n + 1 elements, some only n). - $( - let $B = match $B.next() { - None => return None, - Some(elt) => elt - }; - )* - Some(($($B,)*)) - } - - fn size_hint(&self) -> (usize, Option<usize>) - { - let sh = (::std::usize::MAX, None); - let ($(ref $B,)*) = self.t; - $( - let sh = size_hint::min($B.size_hint(), sh); - )* - sh - } - } - - #[allow(non_snake_case)] - impl<$($B),*> ExactSizeIterator for Zip<($($B,)*)> where - $( - $B: ExactSizeIterator, - )* - { } - ); -} - -impl_zip_iter!(A); -impl_zip_iter!(A, B); -impl_zip_iter!(A, B, C); -impl_zip_iter!(A, B, C, D); -impl_zip_iter!(A, B, C, D, E); -impl_zip_iter!(A, B, C, D, E, F); -impl_zip_iter!(A, B, C, D, E, F, G); -impl_zip_iter!(A, B, C, D, E, F, G, H); diff --git a/vendor/itertools-0.7.8/tests/merge_join.rs b/vendor/itertools-0.7.8/tests/merge_join.rs deleted file mode 100644 index 41829202b8..0000000000 --- a/vendor/itertools-0.7.8/tests/merge_join.rs +++ /dev/null @@ -1,110 +0,0 @@ -extern crate itertools; - -use itertools::EitherOrBoth; -use itertools::free::merge_join_by; - -#[test] -fn empty() { - let left: Vec<u32> = vec![]; - let right: Vec<u32> = vec![]; - let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::<Vec<_>>(); - assert_eq!(expected_result, actual_result); -} - -#[test] -fn left_only() { - let left: Vec<u32> = vec![1,2,3]; - let right: Vec<u32> = vec![]; - let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![ - EitherOrBoth::Left(1), - EitherOrBoth::Left(2), - EitherOrBoth::Left(3) - ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::<Vec<_>>(); - assert_eq!(expected_result, actual_result); -} - -#[test] -fn right_only() { - let left: Vec<u32> = vec![]; - let right: Vec<u32> = vec![1,2,3]; - let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![ - EitherOrBoth::Right(1), - EitherOrBoth::Right(2), - EitherOrBoth::Right(3) - ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::<Vec<_>>(); - assert_eq!(expected_result, actual_result); -} - -#[test] -fn first_left_then_right() { - let left: Vec<u32> = vec![1,2,3]; - let right: Vec<u32> = vec![4,5,6]; - let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![ - EitherOrBoth::Left(1), - EitherOrBoth::Left(2), - EitherOrBoth::Left(3), - EitherOrBoth::Right(4), - EitherOrBoth::Right(5), - EitherOrBoth::Right(6) - ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::<Vec<_>>(); - assert_eq!(expected_result, actual_result); -} - -#[test] -fn first_right_then_left() { - let left: Vec<u32> = vec![4,5,6]; - let right: Vec<u32> = vec![1,2,3]; - let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![ - EitherOrBoth::Right(1), - EitherOrBoth::Right(2), - EitherOrBoth::Right(3), - EitherOrBoth::Left(4), - EitherOrBoth::Left(5), - EitherOrBoth::Left(6) - ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::<Vec<_>>(); - assert_eq!(expected_result, actual_result); -} - -#[test] -fn interspersed_left_and_right() { - let left: Vec<u32> = vec![1,3,5]; - let right: Vec<u32> = vec![2,4,6]; - let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![ - EitherOrBoth::Left(1), - EitherOrBoth::Right(2), - EitherOrBoth::Left(3), - EitherOrBoth::Right(4), - EitherOrBoth::Left(5), - EitherOrBoth::Right(6) - ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::<Vec<_>>(); - assert_eq!(expected_result, actual_result); -} - -#[test] -fn overlapping_left_and_right() { - let left: Vec<u32> = vec![1,3,4,6]; - let right: Vec<u32> = vec![2,3,4,5]; - let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![ - EitherOrBoth::Left(1), - EitherOrBoth::Right(2), - EitherOrBoth::Both(3, 3), - EitherOrBoth::Both(4, 4), - EitherOrBoth::Right(5), - EitherOrBoth::Left(6) - ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::<Vec<_>>(); - assert_eq!(expected_result, actual_result); -} diff --git a/vendor/itertools-0.7.8/tests/peeking_take_while.rs b/vendor/itertools-0.7.8/tests/peeking_take_while.rs deleted file mode 100644 index 45c76c2d5c..0000000000 --- a/vendor/itertools-0.7.8/tests/peeking_take_while.rs +++ /dev/null @@ -1,53 +0,0 @@ - -extern crate itertools; - -use itertools::Itertools; -use itertools::{put_back, put_back_n}; - -#[test] -fn peeking_take_while_peekable() { - let mut r = (0..10).peekable(); - r.peeking_take_while(|x| *x <= 3).count(); - assert_eq!(r.next(), Some(4)); -} - -#[test] -fn peeking_take_while_put_back() { - let mut r = put_back(0..10); - r.peeking_take_while(|x| *x <= 3).count(); - assert_eq!(r.next(), Some(4)); - r.peeking_take_while(|_| true).count(); - assert_eq!(r.next(), None); -} - -#[test] -fn peeking_take_while_put_back_n() { - let mut r = put_back_n(6..10); - for elt in (0..6).rev() { - r.put_back(elt); - } - r.peeking_take_while(|x| *x <= 3).count(); - assert_eq!(r.next(), Some(4)); - r.peeking_take_while(|_| true).count(); - assert_eq!(r.next(), None); -} - -#[test] -fn peeking_take_while_slice_iter() { - let v = [1, 2, 3, 4, 5, 6]; - let mut r = v.iter(); - r.peeking_take_while(|x| **x <= 3).count(); - assert_eq!(r.next(), Some(&4)); - r.peeking_take_while(|_| true).count(); - assert_eq!(r.next(), None); -} - -#[test] -fn peeking_take_while_slice_iter_rev() { - let v = [1, 2, 3, 4, 5, 6]; - let mut r = v.iter().rev(); - r.peeking_take_while(|x| **x >= 3).count(); - assert_eq!(r.next(), Some(&2)); - r.peeking_take_while(|_| true).count(); - assert_eq!(r.next(), None); -} diff --git a/vendor/itertools-0.7.8/tests/quick.rs b/vendor/itertools-0.7.8/tests/quick.rs deleted file mode 100644 index 6859758077..0000000000 --- a/vendor/itertools-0.7.8/tests/quick.rs +++ /dev/null @@ -1,1019 +0,0 @@ -//! The purpose of these tests is to cover corner cases of iterators -//! and adaptors. -//! -//! In particular we test the tedious size_hint and exact size correctness. - -#[macro_use] extern crate itertools; - -extern crate quickcheck; - -use std::default::Default; - -use quickcheck as qc; -use std::ops::Range; -use std::cmp::Ordering; -use itertools::Itertools; -use itertools::{ - multizip, - EitherOrBoth, -}; -use itertools::flatten; -use itertools::free::{ - cloned, - enumerate, - multipeek, - put_back, - put_back_n, - rciter, - zip, - zip_eq, -}; - -use quickcheck::TestResult; - -/// Trait for size hint modifier types -trait HintKind: Copy + Send + qc::Arbitrary { - fn loosen_bounds(&self, org_hint: (usize, Option<usize>)) -> (usize, Option<usize>); -} - -/// Exact size hint variant that leaves hints unchanged -#[derive(Clone, Copy, Debug)] -struct Exact {} - -impl HintKind for Exact { - fn loosen_bounds(&self, org_hint: (usize, Option<usize>)) -> (usize, Option<usize>) { - org_hint - } -} - -impl qc::Arbitrary for Exact { - fn arbitrary<G: qc::Gen>(_: &mut G) -> Self { - Exact {} - } -} - -/// Inexact size hint variant to simulate imprecise (but valid) size hints -/// -/// Will always decrease the lower bound and increase the upper bound -/// of the size hint by set amounts. -#[derive(Clone, Copy, Debug)] -struct Inexact { - underestimate: usize, - overestimate: usize, -} - -impl HintKind for Inexact { - fn loosen_bounds(&self, org_hint: (usize, Option<usize>)) -> (usize, Option<usize>) { - let (org_lower, org_upper) = org_hint; - (org_lower.saturating_sub(self.underestimate), - org_upper.and_then(move |x| x.checked_add(self.overestimate))) - } -} - -impl qc::Arbitrary for Inexact { - fn arbitrary<G: qc::Gen>(g: &mut G) -> Self { - let ue_value = usize::arbitrary(g); - let oe_value = usize::arbitrary(g); - // Compensate for quickcheck using extreme values too rarely - let ue_choices = &[0, ue_value, usize::max_value()]; - let oe_choices = &[0, oe_value, usize::max_value()]; - Inexact { - underestimate: *g.choose(ue_choices).unwrap(), - overestimate: *g.choose(oe_choices).unwrap(), - } - } - - fn shrink(&self) -> Box<Iterator<Item=Self>> { - let underestimate_value = self.underestimate; - let overestimate_value = self.overestimate; - Box::new( - underestimate_value.shrink().flat_map(move |ue_value| - overestimate_value.shrink().map(move |oe_value| - Inexact { - underestimate: ue_value, - overestimate: oe_value, - } - ) - ) - ) - } -} - -/// Our base iterator that we can impl Arbitrary for -/// -/// By default we'll return inexact bounds estimates for size_hint -/// to make tests harder to pass. -/// -/// NOTE: Iter is tricky and is not fused, to help catch bugs. -/// At the end it will return None once, then return Some(0), -/// then return None again. -#[derive(Clone, Debug)] -struct Iter<T, SK: HintKind = Inexact> { - iterator: Range<T>, - // fuse/done flag - fuse_flag: i32, - hint_kind: SK, -} - -impl<T, HK> Iter<T, HK> where HK: HintKind -{ - fn new(it: Range<T>, hint_kind: HK) -> Self { - Iter { - iterator: it, - fuse_flag: 0, - hint_kind: hint_kind - } - } -} - -impl<T, HK> Iterator for Iter<T, HK> - where Range<T>: Iterator, - <Range<T> as Iterator>::Item: Default, - HK: HintKind, -{ - type Item = <Range<T> as Iterator>::Item; - - fn next(&mut self) -> Option<Self::Item> - { - let elt = self.iterator.next(); - if elt.is_none() { - self.fuse_flag += 1; - // check fuse flag - if self.fuse_flag == 2 { - return Some(Default::default()) - } - } - elt - } - - fn size_hint(&self) -> (usize, Option<usize>) - { - let org_hint = self.iterator.size_hint(); - self.hint_kind.loosen_bounds(org_hint) - } -} - -impl<T, HK> DoubleEndedIterator for Iter<T, HK> - where Range<T>: DoubleEndedIterator, - <Range<T> as Iterator>::Item: Default, - HK: HintKind -{ - fn next_back(&mut self) -> Option<Self::Item> { self.iterator.next_back() } -} - -impl<T> ExactSizeIterator for Iter<T, Exact> where Range<T>: ExactSizeIterator, - <Range<T> as Iterator>::Item: Default, -{ } - -impl<T, HK> qc::Arbitrary for Iter<T, HK> - where T: qc::Arbitrary, - HK: HintKind, -{ - fn arbitrary<G: qc::Gen>(g: &mut G) -> Self - { - Iter::new(T::arbitrary(g)..T::arbitrary(g), HK::arbitrary(g)) - } - - fn shrink(&self) -> Box<Iterator<Item=Iter<T, HK>>> - { - let r = self.iterator.clone(); - let hint_kind = self.hint_kind; - Box::new( - r.start.shrink().flat_map(move |a| - r.end.shrink().map(move |b| - Iter::new(a.clone()..b, hint_kind) - ) - ) - ) - } -} - -/// A meta-iterator which yields `Iter<i32>`s whose start/endpoints are -/// increased or decreased linearly on each iteration. -#[derive(Clone, Debug)] -struct ShiftRange<HK = Inexact> { - range_start: i32, - range_end: i32, - start_step: i32, - end_step: i32, - iter_count: u32, - hint_kind: HK, -} - -impl<HK> Iterator for ShiftRange<HK> where HK: HintKind { - type Item = Iter<i32, HK>; - - fn next(&mut self) -> Option<Self::Item> { - if self.iter_count == 0 { - return None; - } - - let iter = Iter::new(self.range_start..self.range_end, self.hint_kind); - - self.range_start += self.start_step; - self.range_end += self.end_step; - self.iter_count -= 1; - - Some(iter) - } -} - -impl ExactSizeIterator for ShiftRange<Exact> { } - -impl<HK> qc::Arbitrary for ShiftRange<HK> - where HK: HintKind -{ - fn arbitrary<G: qc::Gen>(g: &mut G) -> Self { - const MAX_STARTING_RANGE_DIFF: i32 = 32; - const MAX_STEP_MODULO: i32 = 8; - const MAX_ITER_COUNT: u32 = 3; - - let range_start = qc::Arbitrary::arbitrary(g); - let range_end = range_start + g.gen_range(0, MAX_STARTING_RANGE_DIFF + 1); - let start_step = g.gen_range(-MAX_STEP_MODULO, MAX_STEP_MODULO + 1); - let end_step = g.gen_range(-MAX_STEP_MODULO, MAX_STEP_MODULO + 1); - let iter_count = g.gen_range(0, MAX_ITER_COUNT + 1); - let hint_kind = qc::Arbitrary::arbitrary(g); - - ShiftRange { - range_start: range_start, - range_end: range_end, - start_step: start_step, - end_step: end_step, - iter_count: iter_count, - hint_kind: hint_kind - } - } -} - -fn correct_size_hint<I: Iterator>(mut it: I) -> bool { - // record size hint at each iteration - let initial_hint = it.size_hint(); - let mut hints = Vec::with_capacity(initial_hint.0 + 1); - hints.push(initial_hint); - while let Some(_) = it.next() { - hints.push(it.size_hint()) - } - - let mut true_count = hints.len(); // start off +1 too much - - // check all the size hints - for &(low, hi) in &hints { - true_count -= 1; - if low > true_count || - (hi.is_some() && hi.unwrap() < true_count) - { - println!("True size: {:?}, size hint: {:?}", true_count, (low, hi)); - //println!("All hints: {:?}", hints); - return false - } - } - true -} - -fn exact_size<I: ExactSizeIterator>(mut it: I) -> bool { - // check every iteration - let (mut low, mut hi) = it.size_hint(); - if Some(low) != hi { return false; } - while let Some(_) = it.next() { - let (xlow, xhi) = it.size_hint(); - if low != xlow + 1 { return false; } - low = xlow; - hi = xhi; - if Some(low) != hi { return false; } - } - let (low, hi) = it.size_hint(); - low == 0 && hi == Some(0) -} - -// Exact size for this case, without ExactSizeIterator -fn exact_size_for_this<I: Iterator>(mut it: I) -> bool { - // check every iteration - let (mut low, mut hi) = it.size_hint(); - if Some(low) != hi { return false; } - while let Some(_) = it.next() { - let (xlow, xhi) = it.size_hint(); - if low != xlow + 1 { return false; } - low = xlow; - hi = xhi; - if Some(low) != hi { return false; } - } - let (low, hi) = it.size_hint(); - low == 0 && hi == Some(0) -} - -/* - * NOTE: Range<i8> is broken! - * (all signed ranges are) -#[quickcheck] -fn size_range_i8(a: Iter<i8>) -> bool { - exact_size(a) -} - -#[quickcheck] -fn size_range_i16(a: Iter<i16>) -> bool { - exact_size(a) -} - -#[quickcheck] -fn size_range_u8(a: Iter<u8>) -> bool { - exact_size(a) -} - */ - -macro_rules! quickcheck { - // accept several property function definitions - // The property functions can use pattern matching and `mut` as usual - // in the function arguments, but the functions can not be generic. - {$($(#$attr:tt)* fn $fn_name:ident($($arg:tt)*) -> $ret:ty { $($code:tt)* })*} => ( - $( - #[test] - $(#$attr)* - fn $fn_name() { - fn prop($($arg)*) -> $ret { - $($code)* - } - ::quickcheck::quickcheck(quickcheck!(@fn prop [] $($arg)*)); - } - )* - ); - // parse argument list (with patterns allowed) into prop as fn(_, _) -> _ - (@fn $f:ident [$($t:tt)*]) => { - $f as fn($($t),*) -> _ - }; - (@fn $f:ident [$($p:tt)*] : $($tail:tt)*) => { - quickcheck!(@fn $f [$($p)* _] $($tail)*) - }; - (@fn $f:ident [$($p:tt)*] $t:tt $($tail:tt)*) => { - quickcheck!(@fn $f [$($p)*] $($tail)*) - }; -} - -quickcheck! { - - fn size_product(a: Iter<u16>, b: Iter<u16>) -> bool { - correct_size_hint(a.cartesian_product(b)) - } - fn size_product3(a: Iter<u16>, b: Iter<u16>, c: Iter<u16>) -> bool { - correct_size_hint(iproduct!(a, b, c)) - } - - fn correct_cartesian_product3(a: Iter<u16>, b: Iter<u16>, c: Iter<u16>, - take_manual: usize) -> () - { - // test correctness of iproduct through regular iteration (take) - // and through fold. - let ac = a.clone(); - let br = &b.clone(); - let cr = &c.clone(); - let answer: Vec<_> = ac.flat_map(move |ea| br.clone().flat_map(move |eb| cr.clone().map(move |ec| (ea, eb, ec)))).collect(); - let mut product_iter = iproduct!(a, b, c); - let mut actual = Vec::new(); - - actual.extend((&mut product_iter).take(take_manual)); - if actual.len() == take_manual { - product_iter.fold((), |(), elt| actual.push(elt)); - } - assert_eq!(answer, actual); - } - - fn size_multi_product(a: ShiftRange) -> bool { - correct_size_hint(a.multi_cartesian_product()) - } - fn correct_multi_product3(a: ShiftRange, take_manual: usize) -> () { - // Fix no. of iterators at 3 - let a = ShiftRange { iter_count: 3, ..a }; - - // test correctness of MultiProduct through regular iteration (take) - // and through fold. - let mut iters = a.clone(); - let i0 = iters.next().unwrap(); - let i1r = &iters.next().unwrap(); - let i2r = &iters.next().unwrap(); - let answer: Vec<_> = i0.flat_map(move |ei0| i1r.clone().flat_map(move |ei1| i2r.clone().map(move |ei2| vec![ei0, ei1, ei2]))).collect(); - let mut multi_product = a.clone().multi_cartesian_product(); - let mut actual = Vec::new(); - - actual.extend((&mut multi_product).take(take_manual)); - if actual.len() == take_manual { - multi_product.fold((), |(), elt| actual.push(elt)); - } - assert_eq!(answer, actual); - - assert_eq!(answer.into_iter().last(), a.clone().multi_cartesian_product().last()); - } - - fn size_step(a: Iter<i16, Exact>, s: usize) -> bool { - let mut s = s; - if s == 0 { - s += 1; // never zero - } - let filt = a.clone().dedup(); - correct_size_hint(filt.step(s)) && - exact_size(a.step(s)) - } - fn equal_step(a: Iter<i16>, s: usize) -> bool { - let mut s = s; - if s == 0 { - s += 1; // never zero - } - let mut i = 0; - itertools::equal(a.clone().step(s), a.filter(|_| { - let keep = i % s == 0; - i += 1; - keep - })) - } - fn equal_step_vec(a: Vec<i16>, s: usize) -> bool { - let mut s = s; - if s == 0 { - s += 1; // never zero - } - let mut i = 0; - itertools::equal(a.iter().step(s), a.iter().filter(|_| { - let keep = i % s == 0; - i += 1; - keep - })) - } - - fn size_multipeek(a: Iter<u16, Exact>, s: u8) -> bool { - let mut it = multipeek(a); - // peek a few times - for _ in 0..s { - it.peek(); - } - exact_size(it) - } - - fn equal_merge(a: Vec<i16>, b: Vec<i16>) -> bool { - let mut sa = a.clone(); - let mut sb = b.clone(); - sa.sort(); - sb.sort(); - let mut merged = sa.clone(); - merged.extend(sb.iter().cloned()); - merged.sort(); - itertools::equal(&merged, sa.iter().merge(&sb)) - } - fn size_merge(a: Iter<u16>, b: Iter<u16>) -> bool { - correct_size_hint(a.merge(b)) - } - fn size_zip(a: Iter<i16, Exact>, b: Iter<i16, Exact>, c: Iter<i16, Exact>) -> bool { - let filt = a.clone().dedup(); - correct_size_hint(multizip((filt, b.clone(), c.clone()))) && - exact_size(multizip((a, b, c))) - } - fn size_zip_rc(a: Iter<i16>, b: Iter<i16>) -> bool { - let rc = rciter(a.clone()); - correct_size_hint(multizip((&rc, &rc, b))) - } - - fn size_zip_macro(a: Iter<i16, Exact>, b: Iter<i16, Exact>, c: Iter<i16, Exact>) -> bool { - let filt = a.clone().dedup(); - correct_size_hint(izip!(filt, b.clone(), c.clone())) && - exact_size(izip!(a, b, c)) - } - fn equal_kmerge(a: Vec<i16>, b: Vec<i16>, c: Vec<i16>) -> bool { - use itertools::free::kmerge; - let mut sa = a.clone(); - let mut sb = b.clone(); - let mut sc = c.clone(); - sa.sort(); - sb.sort(); - sc.sort(); - let mut merged = sa.clone(); - merged.extend(sb.iter().cloned()); - merged.extend(sc.iter().cloned()); - merged.sort(); - itertools::equal(merged.into_iter(), kmerge(vec![sa, sb, sc])) - } - - // Any number of input iterators - fn equal_kmerge_2(mut inputs: Vec<Vec<i16>>) -> bool { - use itertools::free::kmerge; - // sort the inputs - for input in &mut inputs { - input.sort(); - } - let mut merged = inputs.concat(); - merged.sort(); - itertools::equal(merged.into_iter(), kmerge(inputs)) - } - - // Any number of input iterators - fn equal_kmerge_by_ge(mut inputs: Vec<Vec<i16>>) -> bool { - // sort the inputs - for input in &mut inputs { - input.sort(); - input.reverse(); - } - let mut merged = inputs.concat(); - merged.sort(); - merged.reverse(); - itertools::equal(merged.into_iter(), - inputs.into_iter().kmerge_by(|x, y| x >= y)) - } - - // Any number of input iterators - fn equal_kmerge_by_lt(mut inputs: Vec<Vec<i16>>) -> bool { - // sort the inputs - for input in &mut inputs { - input.sort(); - } - let mut merged = inputs.concat(); - merged.sort(); - itertools::equal(merged.into_iter(), - inputs.into_iter().kmerge_by(|x, y| x < y)) - } - - // Any number of input iterators - fn equal_kmerge_by_le(mut inputs: Vec<Vec<i16>>) -> bool { - // sort the inputs - for input in &mut inputs { - input.sort(); - } - let mut merged = inputs.concat(); - merged.sort(); - itertools::equal(merged.into_iter(), - inputs.into_iter().kmerge_by(|x, y| x <= y)) - } - fn size_kmerge(a: Iter<i16>, b: Iter<i16>, c: Iter<i16>) -> bool { - use itertools::free::kmerge; - correct_size_hint(kmerge(vec![a, b, c])) - } - fn equal_zip_eq(a: Vec<i32>, b: Vec<i32>) -> bool { - let len = std::cmp::min(a.len(), b.len()); - let a = &a[..len]; - let b = &b[..len]; - itertools::equal(zip_eq(a, b), zip(a, b)) - } - fn size_zip_longest(a: Iter<i16, Exact>, b: Iter<i16, Exact>) -> bool { - let filt = a.clone().dedup(); - let filt2 = b.clone().dedup(); - correct_size_hint(filt.zip_longest(b.clone())) && - correct_size_hint(a.clone().zip_longest(filt2)) && - exact_size(a.zip_longest(b)) - } - fn size_2_zip_longest(a: Iter<i16>, b: Iter<i16>) -> bool { - let it = a.clone().zip_longest(b.clone()); - let jt = a.clone().zip_longest(b.clone()); - itertools::equal(a.clone(), - it.filter_map(|elt| match elt { - EitherOrBoth::Both(x, _) => Some(x), - EitherOrBoth::Left(x) => Some(x), - _ => None, - } - )) - && - itertools::equal(b.clone(), - jt.filter_map(|elt| match elt { - EitherOrBoth::Both(_, y) => Some(y), - EitherOrBoth::Right(y) => Some(y), - _ => None, - } - )) - } - fn size_interleave(a: Iter<i16>, b: Iter<i16>) -> bool { - correct_size_hint(a.interleave(b)) - } - fn exact_interleave(a: Iter<i16, Exact>, b: Iter<i16, Exact>) -> bool { - exact_size_for_this(a.interleave(b)) - } - fn size_interleave_shortest(a: Iter<i16>, b: Iter<i16>) -> bool { - correct_size_hint(a.interleave_shortest(b)) - } - fn exact_interleave_shortest(a: Vec<()>, b: Vec<()>) -> bool { - exact_size_for_this(a.iter().interleave_shortest(&b)) - } - fn size_intersperse(a: Iter<i16>, x: i16) -> bool { - correct_size_hint(a.intersperse(x)) - } - fn equal_intersperse(a: Vec<i32>, x: i32) -> bool { - let mut inter = false; - let mut i = 0; - for elt in a.iter().cloned().intersperse(x) { - if inter { - if elt != x { return false } - } else { - if elt != a[i] { return false } - i += 1; - } - inter = !inter; - } - true - } - - fn equal_flatten(a: Vec<Option<i32>>) -> bool { - itertools::equal(flatten(&a), - a.iter().filter_map(|x| x.as_ref())) - } - - fn equal_flatten_vec(a: Vec<Vec<u8>>) -> bool { - itertools::equal(flatten(&a), - a.iter().flat_map(|x| x)) - } - - fn equal_combinations_2(a: Vec<u8>) -> bool { - let mut v = Vec::new(); - for (i, x) in enumerate(&a) { - for y in &a[i + 1..] { - v.push((x, y)); - } - } - itertools::equal(a.iter().tuple_combinations::<(_, _)>(), v) - } - - fn collect_tuple_matches_size(a: Iter<i16>) -> bool { - let size = a.clone().count(); - a.collect_tuple::<(_, _, _)>().is_some() == (size == 3) - } -} - -quickcheck! { - fn equal_dedup(a: Vec<i32>) -> bool { - let mut b = a.clone(); - b.dedup(); - itertools::equal(&b, a.iter().dedup()) - } -} - -quickcheck! { - fn size_dedup(a: Vec<i32>) -> bool { - correct_size_hint(a.iter().dedup()) - } -} - -quickcheck! { - fn exact_repeatn((n, x): (usize, i32)) -> bool { - let it = itertools::repeat_n(x, n); - exact_size(it) - } -} - -quickcheck! { - fn size_put_back(a: Vec<u8>, x: Option<u8>) -> bool { - let mut it = put_back(a.into_iter()); - match x { - Some(t) => it.put_back(t), - None => {} - } - correct_size_hint(it) - } -} - -quickcheck! { - fn size_put_backn(a: Vec<u8>, b: Vec<u8>) -> bool { - let mut it = put_back_n(a.into_iter()); - for elt in b { - it.put_back(elt) - } - correct_size_hint(it) - } -} - -quickcheck! { - fn size_tee(a: Vec<u8>) -> bool { - let (mut t1, mut t2) = a.iter().tee(); - t1.next(); - t1.next(); - t2.next(); - exact_size(t1) && exact_size(t2) - } -} - -quickcheck! { - fn size_tee_2(a: Vec<u8>) -> bool { - let (mut t1, mut t2) = a.iter().dedup().tee(); - t1.next(); - t1.next(); - t2.next(); - correct_size_hint(t1) && correct_size_hint(t2) - } -} - -quickcheck! { - fn size_take_while_ref(a: Vec<u8>, stop: u8) -> bool { - correct_size_hint(a.iter().take_while_ref(|x| **x != stop)) - } -} - -quickcheck! { - fn equal_partition(a: Vec<i32>) -> bool { - let mut a = a; - let mut ap = a.clone(); - let split_index = itertools::partition(&mut ap, |x| *x >= 0); - let parted = (0..split_index).all(|i| ap[i] >= 0) && - (split_index..a.len()).all(|i| ap[i] < 0); - - a.sort(); - ap.sort(); - parted && (a == ap) - } -} - -quickcheck! { - fn size_combinations(it: Iter<i16>) -> bool { - correct_size_hint(it.tuple_combinations::<(_, _)>()) - } -} - -quickcheck! { - fn equal_combinations(it: Iter<i16>) -> bool { - let values = it.clone().collect_vec(); - let mut cmb = it.tuple_combinations(); - for i in 0..values.len() { - for j in i+1..values.len() { - let pair = (values[i], values[j]); - if pair != cmb.next().unwrap() { - return false; - } - } - } - cmb.next() == None - } -} - -quickcheck! { - fn size_pad_tail(it: Iter<i8>, pad: u8) -> bool { - correct_size_hint(it.clone().pad_using(pad as usize, |_| 0)) && - correct_size_hint(it.dropping(1).rev().pad_using(pad as usize, |_| 0)) - } -} - -quickcheck! { - fn size_pad_tail2(it: Iter<i8, Exact>, pad: u8) -> bool { - exact_size(it.pad_using(pad as usize, |_| 0)) - } -} - -quickcheck! { - fn size_unique(it: Iter<i8>) -> bool { - correct_size_hint(it.unique()) - } - - fn count_unique(it: Vec<i8>, take_first: u8) -> () { - let answer = { - let mut v = it.clone(); - v.sort(); v.dedup(); - v.len() - }; - let mut iter = cloned(&it).unique(); - let first_count = (&mut iter).take(take_first as usize).count(); - let rest_count = iter.count(); - assert_eq!(answer, first_count + rest_count); - } -} - -quickcheck! { - fn fuzz_group_by_lazy_1(it: Iter<u8>) -> bool { - let jt = it.clone(); - let groups = it.group_by(|k| *k); - let res = itertools::equal(jt, groups.into_iter().flat_map(|(_, x)| x)); - res - } -} - -quickcheck! { - fn fuzz_group_by_lazy_2(data: Vec<u8>) -> bool { - let groups = data.iter().group_by(|k| *k / 10); - let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x)); - res - } -} - -quickcheck! { - fn fuzz_group_by_lazy_3(data: Vec<u8>) -> bool { - let grouper = data.iter().group_by(|k| *k / 10); - let groups = grouper.into_iter().collect_vec(); - let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x)); - res - } -} - -quickcheck! { - fn fuzz_group_by_lazy_duo(data: Vec<u8>, order: Vec<(bool, bool)>) -> bool { - let grouper = data.iter().group_by(|k| *k / 3); - let mut groups1 = grouper.into_iter(); - let mut groups2 = grouper.into_iter(); - let mut elts = Vec::<&u8>::new(); - let mut old_groups = Vec::new(); - - let tup1 = |(_, b)| b; - for &(ord, consume_now) in &order { - let iter = &mut [&mut groups1, &mut groups2][ord as usize]; - match iter.next() { - Some((_, gr)) => if consume_now { - for og in old_groups.drain(..) { - elts.extend(og); - } - elts.extend(gr); - } else { - old_groups.push(gr); - }, - None => break, - } - } - for og in old_groups.drain(..) { - elts.extend(og); - } - for gr in groups1.map(&tup1) { elts.extend(gr); } - for gr in groups2.map(&tup1) { elts.extend(gr); } - itertools::assert_equal(&data, elts); - true - } -} - -quickcheck! { - fn equal_chunks_lazy(a: Vec<u8>, size: u8) -> bool { - let mut size = size; - if size == 0 { - size += 1; - } - let chunks = a.iter().chunks(size as usize); - let it = a.chunks(size as usize); - for (a, b) in chunks.into_iter().zip(it) { - if !itertools::equal(a, b) { - return false; - } - } - true - } -} - -quickcheck! { - fn equal_tuple_windows_1(a: Vec<u8>) -> bool { - let x = a.windows(1).map(|s| (&s[0], )); - let y = a.iter().tuple_windows::<(_,)>(); - itertools::equal(x, y) - } - - fn equal_tuple_windows_2(a: Vec<u8>) -> bool { - let x = a.windows(2).map(|s| (&s[0], &s[1])); - let y = a.iter().tuple_windows::<(_, _)>(); - itertools::equal(x, y) - } - - fn equal_tuple_windows_3(a: Vec<u8>) -> bool { - let x = a.windows(3).map(|s| (&s[0], &s[1], &s[2])); - let y = a.iter().tuple_windows::<(_, _, _)>(); - itertools::equal(x, y) - } - - fn equal_tuple_windows_4(a: Vec<u8>) -> bool { - let x = a.windows(4).map(|s| (&s[0], &s[1], &s[2], &s[3])); - let y = a.iter().tuple_windows::<(_, _, _, _)>(); - itertools::equal(x, y) - } - - fn equal_tuples_1(a: Vec<u8>) -> bool { - let x = a.chunks(1).map(|s| (&s[0], )); - let y = a.iter().tuples::<(_,)>(); - itertools::equal(x, y) - } - - fn equal_tuples_2(a: Vec<u8>) -> bool { - let x = a.chunks(2).filter(|s| s.len() == 2).map(|s| (&s[0], &s[1])); - let y = a.iter().tuples::<(_, _)>(); - itertools::equal(x, y) - } - - fn equal_tuples_3(a: Vec<u8>) -> bool { - let x = a.chunks(3).filter(|s| s.len() == 3).map(|s| (&s[0], &s[1], &s[2])); - let y = a.iter().tuples::<(_, _, _)>(); - itertools::equal(x, y) - } - - fn equal_tuples_4(a: Vec<u8>) -> bool { - let x = a.chunks(4).filter(|s| s.len() == 4).map(|s| (&s[0], &s[1], &s[2], &s[3])); - let y = a.iter().tuples::<(_, _, _, _)>(); - itertools::equal(x, y) - } - - fn exact_tuple_buffer(a: Vec<u8>) -> bool { - let mut iter = a.iter().tuples::<(_, _, _, _)>(); - (&mut iter).last(); - let buffer = iter.into_buffer(); - assert_eq!(buffer.len(), a.len() % 4); - exact_size(buffer) - } -} - -// with_position -quickcheck! { - fn with_position_exact_size_1(a: Vec<u8>) -> bool { - exact_size_for_this(a.iter().with_position()) - } - fn with_position_exact_size_2(a: Iter<u8, Exact>) -> bool { - exact_size_for_this(a.with_position()) - } -} - -quickcheck! { - fn correct_group_map_modulo_key(a: Vec<u8>, modulo: u8) -> () { - let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` - let count = a.len(); - let lookup = a.into_iter().map(|i| (i % modulo, i)).into_group_map(); - - assert_eq!(lookup.values().flat_map(|vals| vals.iter()).count(), count); - - for (&key, vals) in lookup.iter() { - assert!(vals.iter().all(|&val| val % modulo == key)); - } - } -} - -/// A peculiar type: Equality compares both tuple items, but ordering only the -/// first item. This is so we can check the stability property easily. -#[derive(Clone, Debug, PartialEq, Eq)] -struct Val(u32, u32); - -impl PartialOrd<Val> for Val { - fn partial_cmp(&self, other: &Val) -> Option<Ordering> { - self.0.partial_cmp(&other.0) - } -} - -impl Ord for Val { - fn cmp(&self, other: &Val) -> Ordering { - self.0.cmp(&other.0) - } -} - -impl qc::Arbitrary for Val { - fn arbitrary<G: qc::Gen>(g: &mut G) -> Self { - let (x, y) = <(u32, u32)>::arbitrary(g); - Val(x, y) - } - fn shrink(&self) -> Box<Iterator<Item = Self>> { - Box::new((self.0, self.1).shrink().map(|(x, y)| Val(x, y))) - } -} - -quickcheck! { - fn minmax(a: Vec<Val>) -> bool { - use itertools::MinMaxResult; - - - let minmax = a.iter().minmax(); - let expected = match a.len() { - 0 => MinMaxResult::NoElements, - 1 => MinMaxResult::OneElement(&a[0]), - _ => MinMaxResult::MinMax(a.iter().min().unwrap(), - a.iter().max().unwrap()), - }; - minmax == expected - } -} - -quickcheck! { - fn minmax_f64(a: Vec<f64>) -> TestResult { - use itertools::MinMaxResult; - - if a.iter().any(|x| x.is_nan()) { - return TestResult::discard(); - } - - let min = cloned(&a).fold1(f64::min); - let max = cloned(&a).fold1(f64::max); - - let minmax = cloned(&a).minmax(); - let expected = match a.len() { - 0 => MinMaxResult::NoElements, - 1 => MinMaxResult::OneElement(min.unwrap()), - _ => MinMaxResult::MinMax(min.unwrap(), max.unwrap()), - }; - TestResult::from_bool(minmax == expected) - } -} - -quickcheck! { - fn tree_fold1_f64(mut a: Vec<f64>) -> TestResult { - fn collapse_adjacent<F>(x: Vec<f64>, mut f: F) -> Vec<f64> - where F: FnMut(f64, f64) -> f64 - { - let mut out = Vec::new(); - for i in (0..x.len()).step(2) { - if i == x.len()-1 { - out.push(x[i]) - } else { - out.push(f(x[i], x[i+1])); - } - } - out - } - - if a.iter().any(|x| x.is_nan()) { - return TestResult::discard(); - } - - let actual = a.iter().cloned().tree_fold1(f64::atan2); - - while a.len() > 1 { - a = collapse_adjacent(a, f64::atan2); - } - let expected = a.pop(); - - TestResult::from_bool(actual == expected) - } -} diff --git a/vendor/itertools-0.7.8/tests/test_core.rs b/vendor/itertools-0.7.8/tests/test_core.rs deleted file mode 100644 index e215255011..0000000000 --- a/vendor/itertools-0.7.8/tests/test_core.rs +++ /dev/null @@ -1,240 +0,0 @@ -//! Licensed under the Apache License, Version 2.0 -//! http://www.apache.org/licenses/LICENSE-2.0 or the MIT license -//! http://opensource.org/licenses/MIT, at your -//! option. This file may not be copied, modified, or distributed -//! except according to those terms. -#![no_std] - -#[macro_use] extern crate itertools as it; - -use it::flatten; -use it::Itertools; -use it::interleave; -use it::multizip; -use it::free::put_back; - -#[test] -fn product2() { - let s = "αβ"; - - let mut prod = iproduct!(s.chars(), 0..2); - assert!(prod.next() == Some(('α', 0))); - assert!(prod.next() == Some(('α', 1))); - assert!(prod.next() == Some(('β', 0))); - assert!(prod.next() == Some(('β', 1))); - assert!(prod.next() == None); -} - -#[test] -fn product_temporary() { - for (_x, _y, _z) in iproduct!( - [0, 1, 2].iter().cloned(), - [0, 1, 2].iter().cloned(), - [0, 1, 2].iter().cloned()) - { - // ok - } -} - - -#[test] -fn izip_macro() { - let mut zip = izip!(2..3); - assert!(zip.next() == Some(2)); - assert!(zip.next().is_none()); - - let mut zip = izip!(0..3, 0..2, 0..2i8); - for i in 0..2 { - assert!((i as usize, i, i as i8) == zip.next().unwrap()); - } - assert!(zip.next().is_none()); - - let xs: [isize; 0] = []; - let mut zip = izip!(0..3, 0..2, 0..2i8, &xs); - assert!(zip.next().is_none()); -} - -#[test] -fn izip3() { - let mut zip = multizip((0..3, 0..2, 0..2i8)); - for i in 0..2 { - assert!((i as usize, i, i as i8) == zip.next().unwrap()); - } - assert!(zip.next().is_none()); - - let xs: [isize; 0] = []; - let mut zip = multizip((0..3, 0..2, 0..2i8, xs.iter())); - assert!(zip.next().is_none()); - - for (_, _, _, _, _) in multizip((0..3, 0..2, xs.iter(), &xs, xs.to_vec())) { - /* test compiles */ - } -} - -#[test] -fn write_to() { - let xs = [7, 9, 8]; - let mut ys = [0; 5]; - let cnt = ys.iter_mut().set_from(xs.iter().map(|x| *x)); - assert!(cnt == xs.len()); - assert!(ys == [7, 9, 8, 0, 0]); - - let cnt = ys.iter_mut().set_from(0..10); - assert!(cnt == ys.len()); - assert!(ys == [0, 1, 2, 3, 4]); -} - -#[test] -fn test_interleave() { - let xs: [u8; 0] = []; - let ys = [7u8, 9, 8, 10]; - let zs = [2u8, 77]; - let it = interleave(xs.iter(), ys.iter()); - it::assert_equal(it, ys.iter()); - - let rs = [7u8, 2, 9, 77, 8, 10]; - let it = interleave(ys.iter(), zs.iter()); - it::assert_equal(it, rs.iter()); -} - -#[test] -fn foreach() { - let xs = [1i32, 2, 3]; - let mut sum = 0; - xs.iter().foreach(|elt| sum += *elt); - assert!(sum == 6); -} - -#[test] -fn dropping() { - let xs = [1, 2, 3]; - let mut it = xs.iter().dropping(2); - assert_eq!(it.next(), Some(&3)); - assert!(it.next().is_none()); - let mut it = xs.iter().dropping(5); - assert!(it.next().is_none()); -} - -#[test] -fn batching() { - let xs = [0, 1, 2, 1, 3]; - let ys = [(0, 1), (2, 1)]; - - // An iterator that gathers elements up in pairs - let pit = xs.iter().cloned().batching(|it| { - match it.next() { - None => None, - Some(x) => match it.next() { - None => None, - Some(y) => Some((x, y)), - } - } - }); - it::assert_equal(pit, ys.iter().cloned()); -} - -#[test] -fn test_put_back() { - let xs = [0, 1, 1, 1, 2, 1, 3, 3]; - let mut pb = put_back(xs.iter().cloned()); - pb.next(); - pb.put_back(1); - pb.put_back(0); - it::assert_equal(pb, xs.iter().cloned()); -} - -#[test] -fn step() { - it::assert_equal((0..10).step(1), 0..10); - it::assert_equal((0..10).step(2), (0..10).filter(|x: &i32| *x % 2 == 0)); - it::assert_equal((0..10).step(10), 0..1); -} - -#[test] -fn merge() { - it::assert_equal((0..10).step(2).merge((1..10).step(2)), 0..10); -} - - -#[test] -fn repeatn() { - let s = "α"; - let mut it = it::repeat_n(s, 3); - assert_eq!(it.len(), 3); - assert_eq!(it.next(), Some(s)); - assert_eq!(it.next(), Some(s)); - assert_eq!(it.next(), Some(s)); - assert_eq!(it.next(), None); - assert_eq!(it.next(), None); -} - -#[test] -fn count_clones() { - // Check that RepeatN only clones N - 1 times. - - use core::cell::Cell; - #[derive(PartialEq, Debug)] - struct Foo { - n: Cell<usize> - } - - impl Clone for Foo - { - fn clone(&self) -> Self - { - let n = self.n.get(); - self.n.set(n + 1); - Foo { n: Cell::new(n + 1) } - } - } - - - for n in 0..10 { - let f = Foo{n: Cell::new(0)}; - let it = it::repeat_n(f, n); - // drain it - let last = it.last(); - if n == 0 { - assert_eq!(last, None); - } else { - assert_eq!(last, Some(Foo{n: Cell::new(n - 1)})); - } - } -} - -#[test] -fn part() { - let mut data = [7, 1, 1, 9, 1, 1, 3]; - let i = it::partition(&mut data, |elt| *elt >= 3); - assert_eq!(i, 3); - assert_eq!(data, [7, 3, 9, 1, 1, 1, 1]); - - let i = it::partition(&mut data, |elt| *elt == 1); - assert_eq!(i, 4); - assert_eq!(data, [1, 1, 1, 1, 9, 3, 7]); - - let mut data = [1, 2, 3, 4, 5, 6, 7, 8, 9]; - let i = it::partition(&mut data, |elt| *elt % 3 == 0); - assert_eq!(i, 3); - assert_eq!(data, [9, 6, 3, 4, 5, 2, 7, 8, 1]); -} - -#[test] -fn flatten_clone() { - let data = &[ - &[1,2,3], - &[4,5,6] - ]; - let flattened1 = flatten(data.into_iter().cloned()); - let flattened2 = flattened1.clone(); - - it::assert_equal(flattened1, &[1,2,3,4,5,6]); - it::assert_equal(flattened2, &[1,2,3,4,5,6]); -} - -#[test] -fn tree_fold1() { - for i in 0..100 { - assert_eq!((0..i).tree_fold1(|x, y| x + y), (0..i).fold1(|x, y| x + y)); - } -} diff --git a/vendor/itertools-0.7.8/tests/test_std.rs b/vendor/itertools-0.7.8/tests/test_std.rs deleted file mode 100644 index 35e0529fa8..0000000000 --- a/vendor/itertools-0.7.8/tests/test_std.rs +++ /dev/null @@ -1,749 +0,0 @@ - -#[macro_use] extern crate itertools as it; -extern crate permutohedron; - -use it::flatten; -use it::Itertools; -use it::multizip; -use it::multipeek; -use it::free::rciter; -use it::free::put_back_n; -use it::FoldWhile; -use it::cloned; - -#[test] -fn product3() { - let prod = iproduct!(0..3, 0..2, 0..2); - assert_eq!(prod.size_hint(), (12, Some(12))); - let v = prod.collect_vec(); - for i in 0..3 { - for j in 0..2 { - for k in 0..2 { - assert!((i, j, k) == v[(i * 2 * 2 + j * 2 + k) as usize]); - } - } - } - for (_, _, _, _) in iproduct!(0..3, 0..2, 0..2, 0..3) { - /* test compiles */ - } -} - -#[test] -fn interleave_shortest() { - let v0: Vec<i32> = vec![0, 2, 4]; - let v1: Vec<i32> = vec![1, 3, 5, 7]; - let it = v0.into_iter().interleave_shortest(v1.into_iter()); - assert_eq!(it.size_hint(), (6, Some(6))); - assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5]); - - let v0: Vec<i32> = vec![0, 2, 4, 6, 8]; - let v1: Vec<i32> = vec![1, 3, 5]; - let it = v0.into_iter().interleave_shortest(v1.into_iter()); - assert_eq!(it.size_hint(), (7, Some(7))); - assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5, 6]); - - let i0 = ::std::iter::repeat(0); - let v1: Vec<_> = vec![1, 3, 5]; - let it = i0.interleave_shortest(v1.into_iter()); - assert_eq!(it.size_hint(), (7, Some(7))); - - let v0: Vec<_> = vec![0, 2, 4]; - let i1 = ::std::iter::repeat(1); - let it = v0.into_iter().interleave_shortest(i1); - assert_eq!(it.size_hint(), (6, Some(6))); -} - - -#[test] -fn unique_by() { - let xs = ["aaa", "bbbbb", "aa", "ccc", "bbbb", "aaaaa", "cccc"]; - let ys = ["aaa", "bbbbb", "ccc"]; - it::assert_equal(ys.iter(), xs.iter().unique_by(|x| x[..2].to_string())); -} - -#[test] -fn unique() { - let xs = [0, 1, 2, 3, 2, 1, 3]; - let ys = [0, 1, 2, 3]; - it::assert_equal(ys.iter(), xs.iter().unique()); - let xs = [0, 1]; - let ys = [0, 1]; - it::assert_equal(ys.iter(), xs.iter().unique()); -} - -#[test] -fn intersperse() { - let xs = ["a", "", "b", "c"]; - let v: Vec<&str> = xs.iter().map(|x| x.clone()).intersperse(", ").collect(); - let text: String = v.concat(); - assert_eq!(text, "a, , b, c".to_string()); - - let ys = [0, 1, 2, 3]; - let mut it = ys[..0].iter().map(|x| *x).intersperse(1); - assert!(it.next() == None); -} - -#[test] -fn dedup() { - let xs = [0, 1, 1, 1, 2, 1, 3, 3]; - let ys = [0, 1, 2, 1, 3]; - it::assert_equal(ys.iter(), xs.iter().dedup()); - let xs = [0, 0, 0, 0, 0]; - let ys = [0]; - it::assert_equal(ys.iter(), xs.iter().dedup()); - - let xs = [0, 1, 1, 1, 2, 1, 3, 3]; - let ys = [0, 1, 2, 1, 3]; - let mut xs_d = Vec::new(); - xs.iter().dedup().fold((), |(), &elt| xs_d.push(elt)); - assert_eq!(&xs_d, &ys); -} - -#[test] -fn all_equal() { - assert!(!"AABBCCC".chars().all_equal()); - assert!("AAAAAAA".chars().all_equal()); - for (_key, mut sub) in &"AABBCCC".chars().group_by(|&x| x) { - assert!(sub.all_equal()); - } -} - -#[test] -fn test_put_back_n() { - let xs = [0, 1, 1, 1, 2, 1, 3, 3]; - let mut pb = put_back_n(xs.iter().cloned()); - pb.next(); - pb.next(); - pb.put_back(1); - pb.put_back(0); - it::assert_equal(pb, xs.iter().cloned()); -} - -#[test] -fn tee() { - let xs = [0, 1, 2, 3]; - let (mut t1, mut t2) = xs.iter().cloned().tee(); - assert_eq!(t1.next(), Some(0)); - assert_eq!(t2.next(), Some(0)); - assert_eq!(t1.next(), Some(1)); - assert_eq!(t1.next(), Some(2)); - assert_eq!(t1.next(), Some(3)); - assert_eq!(t1.next(), None); - assert_eq!(t2.next(), Some(1)); - assert_eq!(t2.next(), Some(2)); - assert_eq!(t1.next(), None); - assert_eq!(t2.next(), Some(3)); - assert_eq!(t2.next(), None); - assert_eq!(t1.next(), None); - assert_eq!(t2.next(), None); - - let (t1, t2) = xs.iter().cloned().tee(); - it::assert_equal(t1, xs.iter().cloned()); - it::assert_equal(t2, xs.iter().cloned()); - - let (t1, t2) = xs.iter().cloned().tee(); - it::assert_equal(t1.zip(t2), xs.iter().cloned().zip(xs.iter().cloned())); -} - - -#[test] -fn test_rciter() { - let xs = [0, 1, 1, 1, 2, 1, 3, 5, 6]; - - let mut r1 = rciter(xs.iter().cloned()); - let mut r2 = r1.clone(); - assert_eq!(r1.next(), Some(0)); - assert_eq!(r2.next(), Some(1)); - let mut z = r1.zip(r2); - assert_eq!(z.next(), Some((1, 1))); - assert_eq!(z.next(), Some((2, 1))); - assert_eq!(z.next(), Some((3, 5))); - assert_eq!(z.next(), None); - - // test intoiterator - let r1 = rciter(0..5); - let mut z = izip!(&r1, r1); - assert_eq!(z.next(), Some((0, 1))); -} - -#[test] -fn trait_pointers() { - struct ByRef<'r, I: ?Sized>(&'r mut I) where I: 'r; - - impl<'r, X, I: ?Sized> Iterator for ByRef<'r, I> where - I: 'r + Iterator<Item=X> - { - type Item = X; - fn next(&mut self) -> Option<X> - { - self.0.next() - } - } - - let mut it = Box::new(0..10) as Box<Iterator<Item=i32>>; - assert_eq!(it.next(), Some(0)); - - { - /* make sure foreach works on non-Sized */ - let jt: &mut Iterator<Item = i32> = &mut *it; - assert_eq!(jt.next(), Some(1)); - - { - let mut r = ByRef(jt); - assert_eq!(r.next(), Some(2)); - } - - assert_eq!(jt.find_position(|x| *x == 4), Some((1, 4))); - jt.foreach(|_| ()); - } -} - -#[test] -fn merge_by() { - let odd : Vec<(u32, &str)> = vec![(1, "hello"), (3, "world"), (5, "!")]; - let even = vec![(2, "foo"), (4, "bar"), (6, "baz")]; - let expected = vec![(1, "hello"), (2, "foo"), (3, "world"), (4, "bar"), (5, "!"), (6, "baz")]; - let results = odd.iter().merge_by(even.iter(), |a, b| a.0 <= b.0); - it::assert_equal(results, expected.iter()); -} - -#[test] -fn merge_by_btree() { - use std::collections::BTreeMap; - let mut bt1 = BTreeMap::new(); - bt1.insert("hello", 1); - bt1.insert("world", 3); - let mut bt2 = BTreeMap::new(); - bt2.insert("foo", 2); - bt2.insert("bar", 4); - let results = bt1.into_iter().merge_by(bt2.into_iter(), |a, b| a.0 <= b.0 ); - let expected = vec![("bar", 4), ("foo", 2), ("hello", 1), ("world", 3)]; - it::assert_equal(results, expected.into_iter()); -} - -#[test] -fn kmerge() { - let its = (0..4).map(|s| (s..10).step(4)); - - it::assert_equal(its.kmerge(), 0..10); -} - -#[test] -fn kmerge_2() { - let its = vec![3, 2, 1, 0].into_iter().map(|s| (s..10).step(4)); - - it::assert_equal(its.kmerge(), 0..10); -} - -#[test] -fn kmerge_empty() { - let its = (0..4).map(|_| 0..0); - assert_eq!(its.kmerge().next(), None); -} - -#[test] -fn kmerge_size_hint() { - let its = (0..5).map(|_| (0..10)); - assert_eq!(its.kmerge().size_hint(), (50, Some(50))); -} - -#[test] -fn kmerge_empty_size_hint() { - let its = (0..5).map(|_| (0..0)); - assert_eq!(its.kmerge().size_hint(), (0, Some(0))); -} - -#[test] -fn join() { - let many = [1, 2, 3]; - let one = [1]; - let none: Vec<i32> = vec![]; - - assert_eq!(many.iter().join(", "), "1, 2, 3"); - assert_eq!( one.iter().join(", "), "1"); - assert_eq!(none.iter().join(", "), ""); -} - -#[test] -fn sorted_by() { - let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| { - a.cmp(&b) - }); - assert_eq!(sc, vec![1, 2, 3, 4]); - - let v = (0..5).sorted_by(|&a, &b| a.cmp(&b).reverse()); - assert_eq!(v, vec![4, 3, 2, 1, 0]); -} - -#[test] -fn sorted_by_key() { - let sc = [3, 4, 1, 2].iter().cloned().sorted_by_key(|&x| x); - assert_eq!(sc, vec![1, 2, 3, 4]); - - let v = (0..5).sorted_by_key(|&x| -x); - assert_eq!(v, vec![4, 3, 2, 1, 0]); -} - -#[test] -fn test_multipeek() { - let nums = vec![1u8,2,3,4,5]; - - let mp = multipeek(nums.iter().map(|&x| x)); - assert_eq!(nums, mp.collect::<Vec<_>>()); - - let mut mp = multipeek(nums.iter().map(|&x| x)); - assert_eq!(mp.peek(), Some(&1)); - assert_eq!(mp.next(), Some(1)); - assert_eq!(mp.peek(), Some(&2)); - assert_eq!(mp.peek(), Some(&3)); - assert_eq!(mp.next(), Some(2)); - assert_eq!(mp.peek(), Some(&3)); - assert_eq!(mp.peek(), Some(&4)); - assert_eq!(mp.peek(), Some(&5)); - assert_eq!(mp.peek(), None); - assert_eq!(mp.next(), Some(3)); - assert_eq!(mp.next(), Some(4)); - assert_eq!(mp.peek(), Some(&5)); - assert_eq!(mp.peek(), None); - assert_eq!(mp.next(), Some(5)); - assert_eq!(mp.next(), None); - assert_eq!(mp.peek(), None); - -} - -#[test] -fn test_multipeek_reset() { - let data = [1, 2, 3, 4]; - - let mut mp = multipeek(cloned(&data)); - assert_eq!(mp.peek(), Some(&1)); - assert_eq!(mp.next(), Some(1)); - assert_eq!(mp.peek(), Some(&2)); - assert_eq!(mp.peek(), Some(&3)); - mp.reset_peek(); - assert_eq!(mp.peek(), Some(&2)); - assert_eq!(mp.next(), Some(2)); -} - -#[test] -fn test_multipeek_peeking_next() { - use it::PeekingNext; - let nums = vec![1u8,2,3,4,5,6,7]; - - let mut mp = multipeek(nums.iter().map(|&x| x)); - assert_eq!(mp.peeking_next(|&x| x != 0), Some(1)); - assert_eq!(mp.next(), Some(2)); - assert_eq!(mp.peek(), Some(&3)); - assert_eq!(mp.peek(), Some(&4)); - assert_eq!(mp.peeking_next(|&x| x == 3), Some(3)); - assert_eq!(mp.peek(), Some(&4)); - assert_eq!(mp.peeking_next(|&x| x != 4), None); - assert_eq!(mp.peeking_next(|&x| x == 4), Some(4)); - assert_eq!(mp.peek(), Some(&5)); - assert_eq!(mp.peek(), Some(&6)); - assert_eq!(mp.peeking_next(|&x| x != 5), None); - assert_eq!(mp.peek(), Some(&7)); - assert_eq!(mp.peeking_next(|&x| x == 5), Some(5)); - assert_eq!(mp.peeking_next(|&x| x == 6), Some(6)); - assert_eq!(mp.peek(), Some(&7)); - assert_eq!(mp.peek(), None); - assert_eq!(mp.next(), Some(7)); - assert_eq!(mp.peek(), None); -} - -#[test] -fn pad_using() { - it::assert_equal((0..0).pad_using(1, |_| 1), 1..2); - - let v: Vec<usize> = vec![0, 1, 2]; - let r = v.into_iter().pad_using(5, |n| n); - it::assert_equal(r, vec![0, 1, 2, 3, 4]); - - let v: Vec<usize> = vec![0, 1, 2]; - let r = v.into_iter().pad_using(1, |_| panic!()); - it::assert_equal(r, vec![0, 1, 2]); -} - -#[test] -fn group_by() { - for (ch1, sub) in &"AABBCCC".chars().group_by(|&x| x) { - for ch2 in sub { - assert_eq!(ch1, ch2); - } - } - - for (ch1, sub) in &"AAABBBCCCCDDDD".chars().group_by(|&x| x) { - for ch2 in sub { - assert_eq!(ch1, ch2); - if ch1 == 'C' { - break; - } - } - } - - let toupper = |ch: &char| ch.to_uppercase().nth(0).unwrap(); - - // try all possible orderings - for indices in permutohedron::Heap::new(&mut [0, 1, 2, 3]) { - let groups = "AaaBbbccCcDDDD".chars().group_by(&toupper); - let mut subs = groups.into_iter().collect_vec(); - - for &idx in &indices[..] { - let (key, text) = match idx { - 0 => ('A', "Aaa".chars()), - 1 => ('B', "Bbb".chars()), - 2 => ('C', "ccCc".chars()), - 3 => ('D', "DDDD".chars()), - _ => unreachable!(), - }; - assert_eq!(key, subs[idx].0); - it::assert_equal(&mut subs[idx].1, text); - } - } - - let groups = "AAABBBCCCCDDDD".chars().group_by(|&x| x); - let mut subs = groups.into_iter().map(|(_, g)| g).collect_vec(); - - let sd = subs.pop().unwrap(); - let sc = subs.pop().unwrap(); - let sb = subs.pop().unwrap(); - let sa = subs.pop().unwrap(); - for (a, b, c, d) in multizip((sa, sb, sc, sd)) { - assert_eq!(a, 'A'); - assert_eq!(b, 'B'); - assert_eq!(c, 'C'); - assert_eq!(d, 'D'); - } - - // check that the key closure is called exactly n times - { - let mut ntimes = 0; - let text = "AABCCC"; - for (_, sub) in &text.chars().group_by(|&x| { ntimes += 1; x}) { - for _ in sub { - } - } - assert_eq!(ntimes, text.len()); - } - - { - let mut ntimes = 0; - let text = "AABCCC"; - for _ in &text.chars().group_by(|&x| { ntimes += 1; x}) { - } - assert_eq!(ntimes, text.len()); - } - - { - let text = "ABCCCDEEFGHIJJKK"; - let gr = text.chars().group_by(|&x| x); - it::assert_equal(gr.into_iter().flat_map(|(_, sub)| sub), text.chars()); - } -} - -#[test] -fn group_by_lazy_2() { - let data = vec![0, 1]; - let groups = data.iter().group_by(|k| *k); - let gs = groups.into_iter().collect_vec(); - it::assert_equal(data.iter(), gs.into_iter().flat_map(|(_k, g)| g)); - - let data = vec![0, 1, 1, 0, 0]; - let groups = data.iter().group_by(|k| *k); - let mut gs = groups.into_iter().collect_vec(); - gs[1..].reverse(); - it::assert_equal(&[0, 0, 0, 1, 1], gs.into_iter().flat_map(|(_, g)| g)); - - let grouper = data.iter().group_by(|k| *k); - let mut groups = Vec::new(); - for (k, group) in &grouper { - if *k == 1 { - groups.push(group); - } - } - it::assert_equal(&mut groups[0], &[1, 1]); - - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; - let grouper = data.iter().group_by(|k| *k); - let mut groups = Vec::new(); - for (i, (_, group)) in grouper.into_iter().enumerate() { - if i < 2 { - groups.push(group); - } else if i < 4 { - for _ in group { - } - } else { - groups.push(group); - } - } - it::assert_equal(&mut groups[0], &[0, 0, 0]); - it::assert_equal(&mut groups[1], &[1, 1]); - it::assert_equal(&mut groups[2], &[3, 3]); - - // use groups as chunks - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; - let mut i = 0; - let grouper = data.iter().group_by(move |_| { let k = i / 3; i += 1; k }); - for (i, group) in &grouper { - match i { - 0 => it::assert_equal(group, &[0, 0, 0]), - 1 => it::assert_equal(group, &[1, 1, 0]), - 2 => it::assert_equal(group, &[0, 2, 2]), - 3 => it::assert_equal(group, &[3, 3]), - _ => unreachable!(), - } - } -} - -#[test] -fn group_by_lazy_3() { - // test consuming each group on the lap after it was produced - let data = vec![0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2]; - let grouper = data.iter().group_by(|elt| *elt); - let mut last = None; - for (key, group) in &grouper { - if let Some(gr) = last.take() { - for elt in gr { - assert!(elt != key && i32::abs(elt - key) == 1); - } - } - last = Some(group); - } -} - -#[test] -fn chunks() { - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; - let grouper = data.iter().chunks(3); - for (i, chunk) in grouper.into_iter().enumerate() { - match i { - 0 => it::assert_equal(chunk, &[0, 0, 0]), - 1 => it::assert_equal(chunk, &[1, 1, 0]), - 2 => it::assert_equal(chunk, &[0, 2, 2]), - 3 => it::assert_equal(chunk, &[3, 3]), - _ => unreachable!(), - } - } -} - -#[test] -fn concat_empty() { - let data: Vec<Vec<()>> = Vec::new(); - assert_eq!(data.into_iter().concat(), Vec::new()) -} - -#[test] -fn concat_non_empty() { - let data = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9]]; - assert_eq!(data.into_iter().concat(), vec![1,2,3,4,5,6,7,8,9]) -} - -#[test] -fn flatten_iter() { - let data = vec![vec![1,2,3], vec![4,5], vec![], vec![6]]; - it::assert_equal(flatten(data), vec![1,2,3,4,5,6]); -} - -#[test] -fn flatten_fold() { - let xs = [0, 1, 1, 1, 2, 1, 3, 3]; - let ch = xs.iter().chunks(3); - let mut iter = flatten(&ch); - iter.next(); - let mut xs_d = Vec::new(); - iter.fold((), |(), &elt| xs_d.push(elt)); - assert_eq!(&xs_d[..], &xs[1..]); -} - -#[test] -fn combinations() { - assert!((1..3).combinations(5).next().is_none()); - - let it = (1..3).combinations(2); - it::assert_equal(it, vec![ - vec![1, 2], - ]); - - let it = (1..5).combinations(2); - it::assert_equal(it, vec![ - vec![1, 2], - vec![1, 3], - vec![1, 4], - vec![2, 3], - vec![2, 4], - vec![3, 4], - ]); - - it::assert_equal((0..0).tuple_combinations::<(_, _)>(), <Vec<_>>::new()); - it::assert_equal((0..1).tuple_combinations::<(_, _)>(), <Vec<_>>::new()); - it::assert_equal((0..2).tuple_combinations::<(_, _)>(), vec![(0, 1)]); - - it::assert_equal((0..0).combinations(2), <Vec<Vec<_>>>::new()); - it::assert_equal((0..1).combinations(1), vec![vec![0]]); - it::assert_equal((0..2).combinations(1), vec![vec![0], vec![1]]); - it::assert_equal((0..2).combinations(2), vec![vec![0, 1]]); -} - -#[test] -fn combinations_of_too_short() { - for i in 1..10 { - assert!((0..0).combinations(i).next().is_none()); - assert!((0..i - 1).combinations(i).next().is_none()); - } -} - - -#[test] -fn combinations_zero() { - it::assert_equal((1..3).combinations(0), vec![vec![]]); -} - -#[test] -fn diff_mismatch() { - let a = vec![1, 2, 3, 4]; - let b = vec![1.0, 5.0, 3.0, 4.0]; - let b_map = b.into_iter().map(|f| f as i32); - let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); - - assert!(match diff { - Some(it::Diff::FirstMismatch(1, _, from_diff)) => - from_diff.collect::<Vec<_>>() == vec![5, 3, 4], - _ => false, - }); -} - -#[test] -fn diff_longer() { - let a = vec![1, 2, 3, 4]; - let b = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]; - let b_map = b.into_iter().map(|f| f as i32); - let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); - - assert!(match diff { - Some(it::Diff::Longer(_, remaining)) => - remaining.collect::<Vec<_>>() == vec![5, 6], - _ => false, - }); -} - -#[test] -fn diff_shorter() { - let a = vec![1, 2, 3, 4]; - let b = vec![1.0, 2.0]; - let b_map = b.into_iter().map(|f| f as i32); - let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); - - assert!(match diff { - Some(it::Diff::Shorter(len, _)) => len == 2, - _ => false, - }); -} - -#[test] -fn minmax() { - use std::cmp::Ordering; - use it::MinMaxResult; - - // A peculiar type: Equality compares both tuple items, but ordering only the - // first item. This is so we can check the stability property easily. - #[derive(Clone, Debug, PartialEq, Eq)] - struct Val(u32, u32); - - impl PartialOrd<Val> for Val { - fn partial_cmp(&self, other: &Val) -> Option<Ordering> { - self.0.partial_cmp(&other.0) - } - } - - impl Ord for Val { - fn cmp(&self, other: &Val) -> Ordering { - self.0.cmp(&other.0) - } - } - - assert_eq!(None::<Option<u32>>.iter().minmax(), MinMaxResult::NoElements); - - assert_eq!(Some(1u32).iter().minmax(), MinMaxResult::OneElement(&1)); - - let data = vec![Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; - - let minmax = data.iter().minmax(); - assert_eq!(minmax, MinMaxResult::MinMax(&Val(0, 1), &Val(2, 1))); - - let (min, max) = data.iter().minmax_by_key(|v| v.1).into_option().unwrap(); - assert_eq!(min, &Val(2, 0)); - assert_eq!(max, &Val(0, 2)); - - let (min, max) = data.iter().minmax_by(|x, y| x.1.cmp(&y.1)).into_option().unwrap(); - assert_eq!(min, &Val(2, 0)); - assert_eq!(max, &Val(0, 2)); -} - -#[test] -fn format() { - let data = [0, 1, 2, 3]; - let ans1 = "0, 1, 2, 3"; - let ans2 = "0--1--2--3"; - - let t1 = format!("{}", data.iter().format(", ")); - assert_eq!(t1, ans1); - let t2 = format!("{:?}", data.iter().format("--")); - assert_eq!(t2, ans2); - - let dataf = [1.1, 2.71828, -22.]; - let t3 = format!("{:.2e}", dataf.iter().format(", ")); - assert_eq!(t3, "1.10e0, 2.72e0, -2.20e1"); -} - -#[test] -fn while_some() { - let ns = (1..10).map(|x| if x % 5 != 0 { Some(x) } else { None }) - .while_some(); - it::assert_equal(ns, vec![1, 2, 3, 4]); -} - -#[test] -fn fold_while() { - let mut iterations = 0; - let vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - let sum = vec.into_iter().fold_while(0, |acc, item| { - iterations += 1; - let new_sum = acc.clone() + item; - if new_sum <= 20 { - FoldWhile::Continue(new_sum) - } else { - FoldWhile::Done(acc) - } - }).into_inner(); - assert_eq!(iterations, 6); - assert_eq!(sum, 15); -} - -#[test] -fn tree_fold1() { - let x = [ - "", - "0", - "0 1 x", - "0 1 x 2 x", - "0 1 x 2 3 x x", - "0 1 x 2 3 x x 4 x", - "0 1 x 2 3 x x 4 5 x x", - "0 1 x 2 3 x x 4 5 x 6 x x", - "0 1 x 2 3 x x 4 5 x 6 7 x x x", - "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 x", - "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x x", - "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 x x", - "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x x", - "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 x x", - "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x x x", - "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x 14 x x x", - "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x 14 15 x x x x", - ]; - for (i, &s) in x.iter().enumerate() { - let expected = if s == "" { None } else { Some(s.to_string()) }; - let num_strings = (0..i).map(|x| x.to_string()); - let actual = num_strings.tree_fold1(|a, b| format!("{} {} x", a, b)); - assert_eq!(actual, expected); - } -} diff --git a/vendor/itertools-0.7.8/tests/tuples.rs b/vendor/itertools-0.7.8/tests/tuples.rs deleted file mode 100644 index 07dba57fe6..0000000000 --- a/vendor/itertools-0.7.8/tests/tuples.rs +++ /dev/null @@ -1,88 +0,0 @@ -extern crate itertools; - -use itertools::Itertools; - -#[test] -fn tuples() { - let v = [1, 2, 3, 4, 5]; - let mut iter = v.iter().cloned().tuples(); - assert_eq!(Some((1,)), iter.next()); - assert_eq!(Some((2,)), iter.next()); - assert_eq!(Some((3,)), iter.next()); - assert_eq!(Some((4,)), iter.next()); - assert_eq!(Some((5,)), iter.next()); - assert_eq!(None, iter.next()); - assert_eq!(None, iter.into_buffer().next()); - - let mut iter = v.iter().cloned().tuples(); - assert_eq!(Some((1, 2)), iter.next()); - assert_eq!(Some((3, 4)), iter.next()); - assert_eq!(None, iter.next()); - itertools::assert_equal(vec![5], iter.into_buffer()); - - let mut iter = v.iter().cloned().tuples(); - assert_eq!(Some((1, 2, 3)), iter.next()); - assert_eq!(None, iter.next()); - itertools::assert_equal(vec![4, 5], iter.into_buffer()); - - let mut iter = v.iter().cloned().tuples(); - assert_eq!(Some((1, 2, 3, 4)), iter.next()); - assert_eq!(None, iter.next()); - itertools::assert_equal(vec![5], iter.into_buffer()); -} - -#[test] -fn tuple_windows() { - let v = [1, 2, 3, 4, 5]; - - let mut iter = v.iter().cloned().tuple_windows(); - assert_eq!(Some((1,)), iter.next()); - assert_eq!(Some((2,)), iter.next()); - assert_eq!(Some((3,)), iter.next()); - - let mut iter = v.iter().cloned().tuple_windows(); - assert_eq!(Some((1, 2)), iter.next()); - assert_eq!(Some((2, 3)), iter.next()); - assert_eq!(Some((3, 4)), iter.next()); - assert_eq!(Some((4, 5)), iter.next()); - assert_eq!(None, iter.next()); - - let mut iter = v.iter().cloned().tuple_windows(); - assert_eq!(Some((1, 2, 3)), iter.next()); - assert_eq!(Some((2, 3, 4)), iter.next()); - assert_eq!(Some((3, 4, 5)), iter.next()); - assert_eq!(None, iter.next()); - - let mut iter = v.iter().cloned().tuple_windows(); - assert_eq!(Some((1, 2, 3, 4)), iter.next()); - assert_eq!(Some((2, 3, 4, 5)), iter.next()); - assert_eq!(None, iter.next()); - - let v = [1, 2, 3]; - let mut iter = v.iter().cloned().tuple_windows::<(_, _, _, _)>(); - assert_eq!(None, iter.next()); -} - -#[test] -fn next_tuple() { - let v = [1, 2, 3, 4, 5]; - let mut iter = v.iter(); - assert_eq!(iter.next_tuple().map(|(&x, &y)| (x, y)), Some((1, 2))); - assert_eq!(iter.next_tuple().map(|(&x, &y)| (x, y)), Some((3, 4))); - assert_eq!(iter.next_tuple::<(_, _)>(), None); -} - -#[test] -fn collect_tuple() { - let v = [1, 2]; - let iter = v.iter().cloned(); - assert_eq!(iter.collect_tuple(), Some((1, 2))); - - let v = [1]; - let iter = v.iter().cloned(); - assert_eq!(iter.collect_tuple::<(_, _)>(), None); - - let v = [1, 2, 3]; - let iter = v.iter().cloned(); - assert_eq!(iter.collect_tuple::<(_, _)>(), None); -} diff --git a/vendor/itertools-0.7.8/tests/zip.rs b/vendor/itertools-0.7.8/tests/zip.rs deleted file mode 100644 index c5c51899b8..0000000000 --- a/vendor/itertools-0.7.8/tests/zip.rs +++ /dev/null @@ -1,65 +0,0 @@ -extern crate itertools; - -use itertools::Itertools; -use itertools::EitherOrBoth::{Both, Left, Right}; -use itertools::free::zip_eq; - -#[test] -fn zip_longest_fused() { - let a = [Some(1), None, Some(3), Some(4)]; - let b = [1, 2, 3]; - - let unfused = a.iter().batching(|it| *it.next().unwrap()) - .zip_longest(b.iter().cloned()); - itertools::assert_equal(unfused, - vec![Both(1, 1), Right(2), Right(3)]); -} - -#[test] -fn test_zip_longest_size_hint() { - let c = (1..10).cycle(); - let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; - let v2 = &[10, 11, 12]; - - assert_eq!(c.zip_longest(v.iter()).size_hint(), (std::usize::MAX, None)); - - assert_eq!(v.iter().zip_longest(v2.iter()).size_hint(), (10, Some(10))); -} - -#[test] -fn test_double_ended_zip_longest() { - let xs = [1, 2, 3, 4, 5, 6]; - let ys = [1, 2, 3, 7]; - let a = xs.iter().map(|&x| x); - let b = ys.iter().map(|&x| x); - let mut it = a.zip_longest(b); - assert_eq!(it.next(), Some(Both(1, 1))); - assert_eq!(it.next(), Some(Both(2, 2))); - assert_eq!(it.next_back(), Some(Left(6))); - assert_eq!(it.next_back(), Some(Left(5))); - assert_eq!(it.next_back(), Some(Both(4, 7))); - assert_eq!(it.next(), Some(Both(3, 3))); - assert_eq!(it.next(), None); -} - - -#[should_panic] -#[test] -fn zip_eq_panic1() -{ - let a = [1, 2]; - let b = [1, 2, 3]; - - zip_eq(&a, &b).count(); -} - -#[should_panic] -#[test] -fn zip_eq_panic2() -{ - let a: [i32; 0] = []; - let b = [1, 2, 3]; - - zip_eq(&a, &b).count(); -} - diff --git a/vendor/jobserver/.cargo-checksum.json b/vendor/jobserver/.cargo-checksum.json index d3fb0452b7..42f01c1be1 100644 --- a/vendor/jobserver/.cargo-checksum.json +++ b/vendor/jobserver/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"9ca53e76c8189aa7e6e8da9b2a009a844f07729592d7b5d2d22a644b39aa7f51","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"16689a055987cd93b19990e678c1e98a7169dfb851a641dbb45600ab079059c8","src/lib.rs":"e6c81da933a58471fa8b84f543cb2ab402f92600b696222598f51a48acde1208","tests/client-of-myself.rs":"9ba7aba16b276050d791931c9610eec6f33c713fa80d514fa9223a33372e6f71","tests/client.rs":"30a68828dfaad0d7294dc01feedfebd9a9853704df4bf985d5763e473f2c0ad8","tests/helper.rs":"583e4013e2033bd6cba56219998a86651c3cc24429b2ca27f55152b75de75bdb","tests/make-as-a-client.rs":"d833c1a57900af7c0560ce53948eddd79b492357be35f506e473e87af1a476f1","tests/server.rs":"197c5366cb47925fb05598fdc466d4c7512058a66ac0fdbb16df517d8812954f"},"package":"f74e73053eaf95399bf926e48fc7a2a3ce50bd0eaaa2357d391e95b2dcdd4f10"} \ No newline at end of file +{"files":{"Cargo.toml":"649c3364426ce43e5e3984b5d7ad1d162ab570d4f0933693b732fc8bed4ed996","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"a9adb9dd4cfca03543232305d4ffab615795e7c04e82c67880fc3802eb1531d5","src/lib.rs":"a11a35e242a379fa1bad686dbe329cbc0cf003d38976c5c3cc999a5ff1478229","src/unix.rs":"aba4305675501da5f14231d836c065c4b2102ba27919fd9eeda6623fddc07ff3","src/wasm.rs":"bb67f97bccd0b0c1762917de342d721e319a3a204604ab1517285c59b5e2a369","src/windows.rs":"f886175abbf75ff45ea3fc09396bbcc3048e7daf732ed78149377f7b8e9148b2","tests/client-of-myself.rs":"09aa82b78b33c09c98fa4eb011af58455972b6a32fa40a2c6631af53e08a1d99","tests/client.rs":"8b0e2cd7ec0cf0de3e7f06342d8cdbd482a29351e8bf3181030e03e76a4c175d","tests/helper.rs":"802ae3eb69c3d787acef2930f9eebe16ad4fc5a2a67b39bb4482d84e2315287a","tests/make-as-a-client.rs":"d8358590a86e6b725a86d0f1b8917f0b051839630a9557d820e4fdcbf99985ec","tests/server.rs":"8f08fe8ed6b3a260de9bf8ee1a7820fadfce8e54ff4fb7bec18e628d092adafb"},"package":"5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"} \ No newline at end of file diff --git a/vendor/jobserver/Cargo.toml b/vendor/jobserver/Cargo.toml index 7d83633739..16455b0461 100644 --- a/vendor/jobserver/Cargo.toml +++ b/vendor/jobserver/Cargo.toml @@ -11,8 +11,9 @@ # will likely look very different (and much more reasonable) [package] +edition = "2018" name = "jobserver" -version = "0.1.16" +version = "0.1.21" authors = ["Alex Crichton <alex@alexcrichton.com>"] description = "An implementation of the GNU make jobserver for Rust\n" homepage = "https://github.com/alexcrichton/jobserver-rs" @@ -42,8 +43,6 @@ harness = false [[test]] name = "helper" path = "tests/helper.rs" -[dependencies.log] -version = "0.4.6" [dev-dependencies.futures] version = "0.1" @@ -60,5 +59,3 @@ version = "0.1" version = "0.2" [target."cfg(unix)".dependencies.libc] version = "0.2.50" -[target."cfg(windows)".dependencies.rand] -version = "0.7.0" diff --git a/vendor/jobserver/README.md b/vendor/jobserver/README.md index 91b5a3ade3..06a6a5450f 100644 --- a/vendor/jobserver/README.md +++ b/vendor/jobserver/README.md @@ -2,8 +2,6 @@ An implementation of the GNU make jobserver for Rust -[![Build Status](https://travis-ci.com/alexcrichton/jobserver-rs.svg?branch=master)](https://travis-ci.com/alexcrichton/jobserver-rs) -[![Build status](https://ci.appveyor.com/api/projects/status/h5jc30hohp7ejd9c/branch/master?svg=true)](https://ci.appveyor.com/project/alexcrichton/jobserver-rs/branch/master) [![Crates.io](https://img.shields.io/crates/v/jobserver.svg?maxAge=2592000)](https://crates.io/crates/jobserver) [Documentation](https://docs.rs/jobserver) diff --git a/vendor/jobserver/src/lib.rs b/vendor/jobserver/src/lib.rs index ed0f75aa6a..d61c70c594 100644 --- a/vendor/jobserver/src/lib.rs +++ b/vendor/jobserver/src/lib.rs @@ -13,7 +13,7 @@ //! implemented with the `pipe` syscall and read/write ends of a pipe and on //! Windows this is implemented literally with IPC semaphores. //! -//! The jobserver protocol in `make` also dictates when tokens are acquire to +//! The jobserver protocol in `make` also dictates when tokens are acquired to //! run child work, and clients using this crate should take care to implement //! such details to ensure correct interoperation with `make` itself. //! @@ -78,14 +78,20 @@ #![deny(missing_docs, missing_debug_implementations)] #![doc(html_root_url = "https://docs.rs/jobserver/0.1")] -#[macro_use] -extern crate log; - use std::env; use std::io; use std::process::Command; -use std::sync::mpsc::{self, Sender}; -use std::sync::Arc; +use std::sync::{Arc, Condvar, Mutex, MutexGuard}; + +#[cfg(unix)] +#[path = "unix.rs"] +mod imp; +#[cfg(windows)] +#[path = "windows.rs"] +mod imp; +#[cfg(not(any(unix, windows)))] +#[path = "wasm.rs"] +mod imp; /// A client of a jobserver /// @@ -113,6 +119,33 @@ pub struct Client { pub struct Acquired { client: Arc<imp::Client>, data: imp::Acquired, + disabled: bool, +} + +impl Acquired { + /// This drops the `Acquired` token without releasing the associated token. + /// + /// This is not generally useful, but can be helpful if you do not have the + /// ability to store an Acquired token but need to not yet release it. + /// + /// You'll typically want to follow this up with a call to `release_raw` or + /// similar to actually release the token later on. + pub fn drop_without_releasing(mut self) { + self.disabled = true; + } +} + +#[derive(Default, Debug)] +struct HelperState { + lock: Mutex<HelperInner>, + cvar: Condvar, +} + +#[derive(Default, Debug)] +struct HelperInner { + requests: usize, + producer_done: bool, + consumer_done: bool, } impl Client { @@ -232,10 +265,11 @@ impl Client { /// return immediately with the error. If an error is returned then a token /// was not acquired. pub fn acquire(&self) -> io::Result<Acquired> { - let data = try!(self.inner.acquire()); + let data = self.inner.acquire()?; Ok(Acquired { client: self.inner.clone(), data: data, + disabled: false, }) } @@ -347,10 +381,10 @@ impl Client { where F: FnMut(io::Result<Acquired>) + Send + 'static, { - let (tx, rx) = mpsc::channel(); + let state = Arc::new(HelperState::default()); Ok(HelperThread { - inner: Some(imp::spawn_helper(self, rx, Box::new(f))?), - tx: Some(tx), + inner: Some(imp::spawn_helper(self, state.clone(), Box::new(f))?), + state, }) } @@ -377,7 +411,9 @@ impl Client { impl Drop for Acquired { fn drop(&mut self) { - drop(self.client.release(Some(&self.data))); + if !self.disabled { + drop(self.client.release(Some(&self.data))); + } } } @@ -386,7 +422,7 @@ impl Drop for Acquired { #[derive(Debug)] pub struct HelperThread { inner: Option<imp::Helper>, - tx: Option<Sender<()>>, + state: Arc<HelperState>, } impl HelperThread { @@ -395,651 +431,64 @@ impl HelperThread { /// /// For more information, see the docs on that function. pub fn request_token(&self) { - self.tx.as_ref().unwrap().send(()).unwrap(); + // Indicate that there's one more request for a token and then wake up + // the helper thread if it's sleeping. + self.state.lock().requests += 1; + self.state.cvar.notify_one(); } } impl Drop for HelperThread { fn drop(&mut self) { - drop(self.tx.take()); - self.inner.take().unwrap().join(); - } -} - -#[cfg(unix)] -mod imp { - extern crate libc; - - use std::fs::File; - use std::io::{self, Read, Write}; - use std::mem; - use std::os::unix::prelude::*; - use std::process::Command; - use std::ptr; - use std::sync::atomic::{AtomicBool, Ordering}; - use std::sync::mpsc::{self, Receiver, RecvTimeoutError}; - use std::sync::{Arc, Once, ONCE_INIT}; - use std::thread::{self, Builder, JoinHandle}; - use std::time::Duration; - - use self::libc::c_int; - - #[derive(Debug)] - pub struct Client { - read: File, - write: File, - } - - #[derive(Debug)] - pub struct Acquired { - byte: u8, - } - - impl Client { - pub fn new(limit: usize) -> io::Result<Client> { - let client = unsafe { Client::mk()? }; - // I don't think the character written here matters, but I could be - // wrong! - for _ in 0..limit { - (&client.write).write(&[b'|'])?; - } - info!("created a jobserver: {:?}", client); - Ok(client) - } - - unsafe fn mk() -> io::Result<Client> { - let mut pipes = [0; 2]; - - // Attempt atomically-create-with-cloexec if we can on Linux, - // detected by using the `syscall` function in `libc` to try to work - // with as many kernels/glibc implementations as possible. - #[cfg(target_os = "linux")] - { - static PIPE2_AVAILABLE: AtomicBool = AtomicBool::new(true); - if PIPE2_AVAILABLE.load(Ordering::SeqCst) { - match libc::syscall(libc::SYS_pipe2, pipes.as_mut_ptr(), libc::O_CLOEXEC) { - -1 => { - let err = io::Error::last_os_error(); - if err.raw_os_error() == Some(libc::ENOSYS) { - PIPE2_AVAILABLE.store(false, Ordering::SeqCst); - } else { - return Err(err); - } - } - _ => return Ok(Client::from_fds(pipes[0], pipes[1])), - } - } - } - - cvt(libc::pipe(pipes.as_mut_ptr()))?; - drop(set_cloexec(pipes[0], true)); - drop(set_cloexec(pipes[1], true)); - Ok(Client::from_fds(pipes[0], pipes[1])) - } - - pub unsafe fn open(s: &str) -> Option<Client> { - let mut parts = s.splitn(2, ','); - let read = parts.next().unwrap(); - let write = match parts.next() { - Some(s) => s, - None => return None, - }; - - let read = match read.parse() { - Ok(n) => n, - Err(_) => return None, - }; - let write = match write.parse() { - Ok(n) => n, - Err(_) => return None, - }; - - // Ok so we've got two integers that look like file descriptors, but - // for extra sanity checking let's see if they actually look like - // instances of a pipe before we return the client. - // - // If we're called from `make` *without* the leading + on our rule - // then we'll have `MAKEFLAGS` env vars but won't actually have - // access to the file descriptors. - if is_valid_fd(read) && is_valid_fd(write) { - info!("using env fds {} and {}", read, write); - drop(set_cloexec(read, true)); - drop(set_cloexec(write, true)); - Some(Client::from_fds(read, write)) - } else { - info!("one of {} or {} isn't a pipe", read, write); - None - } - } - - unsafe fn from_fds(read: c_int, write: c_int) -> Client { - Client { - read: File::from_raw_fd(read), - write: File::from_raw_fd(write), - } - } - - pub fn acquire(&self) -> io::Result<Acquired> { - // We don't actually know if the file descriptor here is set in - // blocking or nonblocking mode. AFAIK all released versions of - // `make` use blocking fds for the jobserver, but the unreleased - // version of `make` doesn't. In the unreleased version jobserver - // fds are set to nonblocking and combined with `pselect` - // internally. - // - // Here we try to be compatible with both strategies. We - // unconditionally expect the file descriptor to be in nonblocking - // mode and if it happens to be in blocking mode then most of this - // won't end up actually being necessary! - // - // We use `poll` here to block this thread waiting for read - // readiness, and then afterwards we perform the `read` itself. If - // the `read` returns that it would block then we start over and try - // again. - // - // Also note that we explicitly don't handle EINTR here. That's used - // to shut us down, so we otherwise punt all errors upwards. - unsafe { - let mut fd: libc::pollfd = mem::zeroed(); - fd.fd = self.read.as_raw_fd(); - fd.events = libc::POLLIN; - loop { - fd.revents = 0; - if libc::poll(&mut fd, 1, -1) == -1 { - return Err(io::Error::last_os_error()); - } - if fd.revents == 0 { - continue; - } - let mut buf = [0]; - match (&self.read).read(&mut buf) { - Ok(1) => return Ok(Acquired { byte: buf[0] }), - Ok(_) => { - return Err(io::Error::new( - io::ErrorKind::Other, - "early EOF on jobserver pipe", - )) - } - Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {} - Err(e) => return Err(e), - } - } - } - } - - pub fn release(&self, data: Option<&Acquired>) -> io::Result<()> { - // Note that the fd may be nonblocking but we're going to go ahead - // and assume that the writes here are always nonblocking (we can - // always quickly release a token). If that turns out to not be the - // case we'll get an error anyway! - let byte = data.map(|d| d.byte).unwrap_or(b'+'); - match (&self.write).write(&[byte])? { - 1 => Ok(()), - _ => Err(io::Error::new( - io::ErrorKind::Other, - "failed to write token back to jobserver", - )), - } - } - - pub fn string_arg(&self) -> String { - format!("{},{} -j", self.read.as_raw_fd(), self.write.as_raw_fd()) - } - - pub fn configure(&self, cmd: &mut Command) { - // Here we basically just want to say that in the child process - // we'll configure the read/write file descriptors to *not* be - // cloexec, so they're inherited across the exec and specified as - // integers through `string_arg` above. - let read = self.read.as_raw_fd(); - let write = self.write.as_raw_fd(); - cmd.before_exec(move || { - set_cloexec(read, false)?; - set_cloexec(write, false)?; - Ok(()) - }); - } - } - - #[derive(Debug)] - pub struct Helper { - thread: JoinHandle<()>, - quitting: Arc<AtomicBool>, - rx_done: Receiver<()>, - } - - pub fn spawn_helper( - client: ::Client, - rx: Receiver<()>, - mut f: Box<FnMut(io::Result<::Acquired>) + Send>, - ) -> io::Result<Helper> { - static USR1_INIT: Once = ONCE_INIT; - let mut err = None; - USR1_INIT.call_once(|| unsafe { - let mut new: libc::sigaction = mem::zeroed(); - new.sa_sigaction = sigusr1_handler as usize; - new.sa_flags = libc::SA_SIGINFO as _; - if libc::sigaction(libc::SIGUSR1, &new, ptr::null_mut()) != 0 { - err = Some(io::Error::last_os_error()); - } - }); - - if let Some(e) = err.take() { - return Err(e); - } - - let quitting = Arc::new(AtomicBool::new(false)); - let quitting2 = quitting.clone(); - let (tx_done, rx_done) = mpsc::channel(); - let thread = Builder::new().spawn(move || { - 'outer: for () in rx { - loop { - let res = client.acquire(); - if let Err(ref e) = res { - if e.kind() == io::ErrorKind::Interrupted { - if quitting2.load(Ordering::SeqCst) { - break 'outer; - } else { - continue; - } - } - } - f(res); - break; - } - } - tx_done.send(()).unwrap(); - })?; - - Ok(Helper { - thread: thread, - quitting: quitting, - rx_done: rx_done, - }) - } - - impl Helper { - pub fn join(self) { - self.quitting.store(true, Ordering::SeqCst); - let dur = Duration::from_millis(10); - let mut done = false; - for _ in 0..100 { - unsafe { - // Ignore the return value here of `pthread_kill`, - // apparently on OSX if you kill a dead thread it will - // return an error, but on other platforms it may not. In - // that sense we don't actually know if this will succeed or - // not! - libc::pthread_kill(self.thread.as_pthread_t() as _, libc::SIGUSR1); - match self.rx_done.recv_timeout(dur) { - Ok(()) | Err(RecvTimeoutError::Disconnected) => { - done = true; - break; - } - Err(RecvTimeoutError::Timeout) => {} - } - } - thread::yield_now(); - } - if done { - drop(self.thread.join()); - } - } - } - - fn is_valid_fd(fd: c_int) -> bool { - unsafe { - return libc::fcntl(fd, libc::F_GETFD) != -1; - } - } - - fn set_cloexec(fd: c_int, set: bool) -> io::Result<()> { - unsafe { - let previous = cvt(libc::fcntl(fd, libc::F_GETFD))?; - let new = if set { - previous | libc::FD_CLOEXEC - } else { - previous & !libc::FD_CLOEXEC - }; - if new != previous { - cvt(libc::fcntl(fd, libc::F_SETFD, new))?; - } - Ok(()) - } - } - - fn cvt(t: c_int) -> io::Result<c_int> { - if t == -1 { - Err(io::Error::last_os_error()) - } else { - Ok(t) - } - } - - extern "C" fn sigusr1_handler( - _signum: c_int, - _info: *mut libc::siginfo_t, - _ptr: *mut libc::c_void, - ) { - // nothing to do - } -} - -#[cfg(windows)] -mod imp { - extern crate rand; - - use std::ffi::CString; - use std::io; - use std::process::Command; - use std::ptr; - use std::sync::mpsc::Receiver; - use std::sync::Arc; - use std::thread::{Builder, JoinHandle}; - - #[derive(Debug)] - pub struct Client { - sem: Handle, - name: String, - } - - #[derive(Debug)] - pub struct Acquired; - - type BOOL = i32; - type DWORD = u32; - type HANDLE = *mut u8; - type LONG = i32; - - const ERROR_ALREADY_EXISTS: DWORD = 183; - const FALSE: BOOL = 0; - const INFINITE: DWORD = 0xffffffff; - const SEMAPHORE_MODIFY_STATE: DWORD = 0x2; - const SYNCHRONIZE: DWORD = 0x00100000; - const TRUE: BOOL = 1; - const WAIT_OBJECT_0: DWORD = 0; - - extern "system" { - fn CloseHandle(handle: HANDLE) -> BOOL; - fn SetEvent(hEvent: HANDLE) -> BOOL; - fn WaitForMultipleObjects( - ncount: DWORD, - lpHandles: *const HANDLE, - bWaitAll: BOOL, - dwMilliseconds: DWORD, - ) -> DWORD; - fn CreateEventA( - lpEventAttributes: *mut u8, - bManualReset: BOOL, - bInitialState: BOOL, - lpName: *const i8, - ) -> HANDLE; - fn ReleaseSemaphore( - hSemaphore: HANDLE, - lReleaseCount: LONG, - lpPreviousCount: *mut LONG, - ) -> BOOL; - fn CreateSemaphoreA( - lpEventAttributes: *mut u8, - lInitialCount: LONG, - lMaximumCount: LONG, - lpName: *const i8, - ) -> HANDLE; - fn OpenSemaphoreA( - dwDesiredAccess: DWORD, - bInheritHandle: BOOL, - lpName: *const i8, - ) -> HANDLE; - fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD; - } - - impl Client { - pub fn new(limit: usize) -> io::Result<Client> { - // Try a bunch of random semaphore names until we get a unique one, - // but don't try for too long. - // - // Note that `limit == 0` is a valid argument above but Windows - // won't let us create a semaphore with 0 slots available to it. Get - // `limit == 0` working by creating a semaphore instead with one - // slot and then immediately acquire it (without ever releaseing it - // back). - for _ in 0..100 { - let mut name = format!("__rust_jobserver_semaphore_{}\0", rand::random::<u32>()); - unsafe { - let create_limit = if limit == 0 { 1 } else { limit }; - let r = CreateSemaphoreA( - ptr::null_mut(), - create_limit as LONG, - create_limit as LONG, - name.as_ptr() as *const _, - ); - if r.is_null() { - return Err(io::Error::last_os_error()); - } - let handle = Handle(r); - - let err = io::Error::last_os_error(); - if err.raw_os_error() == Some(ERROR_ALREADY_EXISTS as i32) { - continue; - } - name.pop(); // chop off the trailing nul - let client = Client { - sem: handle, - name: name, - }; - if create_limit != limit { - client.acquire()?; - } - info!("created jobserver {:?}", client); - return Ok(client); - } - } - - Err(io::Error::new( - io::ErrorKind::Other, - "failed to find a unique name for a semaphore", - )) - } - - pub unsafe fn open(s: &str) -> Option<Client> { - let name = match CString::new(s) { - Ok(s) => s, - Err(_) => return None, - }; - - let sem = OpenSemaphoreA(SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, FALSE, name.as_ptr()); - if sem.is_null() { - info!("failed to open environment semaphore {}", s); - None - } else { - info!("opened environment semaphore {}", s); - Some(Client { - sem: Handle(sem), - name: s.to_string(), - }) - } - } - - pub fn acquire(&self) -> io::Result<Acquired> { - unsafe { - let r = WaitForSingleObject(self.sem.0, INFINITE); - if r == WAIT_OBJECT_0 { - Ok(Acquired) - } else { - Err(io::Error::last_os_error()) - } - } - } - - pub fn release(&self, _data: Option<&Acquired>) -> io::Result<()> { - unsafe { - let r = ReleaseSemaphore(self.sem.0, 1, ptr::null_mut()); - if r != 0 { - Ok(()) - } else { - Err(io::Error::last_os_error()) - } - } - } - - pub fn string_arg(&self) -> String { - self.name.clone() - } - - pub fn configure(&self, _cmd: &mut Command) { - // nothing to do here, we gave the name of our semaphore to the - // child above - } - } + // Flag that the producer half is done so the helper thread should exit + // quickly if it's waiting. Wake it up if it's actually waiting + self.state.lock().producer_done = true; + self.state.cvar.notify_one(); - #[derive(Debug)] - struct Handle(HANDLE); - // HANDLE is a raw ptr, but we're send/sync - unsafe impl Sync for Handle {} - unsafe impl Send for Handle {} - - impl Drop for Handle { - fn drop(&mut self) { - unsafe { - CloseHandle(self.0); - } - } - } - - #[derive(Debug)] - pub struct Helper { - event: Arc<Handle>, - thread: JoinHandle<()>, - } - - pub fn spawn_helper( - client: ::Client, - rx: Receiver<()>, - mut f: Box<FnMut(io::Result<::Acquired>) + Send>, - ) -> io::Result<Helper> { - let event = unsafe { - let r = CreateEventA(ptr::null_mut(), TRUE, FALSE, ptr::null()); - if r.is_null() { - return Err(io::Error::last_os_error()); - } else { - Handle(r) - } - }; - let event = Arc::new(event); - let event2 = event.clone(); - let thread = Builder::new().spawn(move || { - let objects = [event2.0, client.inner.sem.0]; - for () in rx { - let r = unsafe { WaitForMultipleObjects(2, objects.as_ptr(), FALSE, INFINITE) }; - if r == WAIT_OBJECT_0 { - break; - } - if r == WAIT_OBJECT_0 + 1 { - f(Ok(::Acquired { - client: client.inner.clone(), - data: Acquired, - })) - } else { - f(Err(io::Error::last_os_error())) - } - } - })?; - Ok(Helper { - thread: thread, - event: event, - }) - } - - impl Helper { - pub fn join(self) { - let r = unsafe { SetEvent(self.event.0) }; - if r == 0 { - panic!("failed to set event: {}", io::Error::last_os_error()); - } - drop(self.thread.join()); - } + // ... and afterwards perform any thread cleanup logic + self.inner.take().unwrap().join(); } } -#[cfg(not(any(unix, windows)))] -mod imp { - use std::io; - use std::process::Command; - use std::sync::mpsc::{self, Receiver, SyncSender}; - use std::sync::Mutex; - use std::thread::{Builder, JoinHandle}; - - #[derive(Debug)] - pub struct Client { - tx: SyncSender<()>, - rx: Mutex<Receiver<()>>, +impl HelperState { + fn lock(&self) -> MutexGuard<'_, HelperInner> { + self.lock.lock().unwrap_or_else(|e| e.into_inner()) } - #[derive(Debug)] - pub struct Acquired(()); - - impl Client { - pub fn new(limit: usize) -> io::Result<Client> { - let (tx, rx) = mpsc::sync_channel(limit); - for _ in 0..limit { - tx.send(()).unwrap(); + /// Executes `f` for each request for a token, where `f` is expected to + /// block and then provide the original closure with a token once it's + /// acquired. + /// + /// This is an infinite loop until the helper thread is dropped, at which + /// point everything should get interrupted. + fn for_each_request(&self, mut f: impl FnMut(&HelperState)) { + let mut lock = self.lock(); + + // We only execute while we could receive requests, but as soon as + // that's `false` we're out of here. + while !lock.producer_done { + // If no one's requested a token then we wait for someone to + // request a token. + if lock.requests == 0 { + lock = self.cvar.wait(lock).unwrap_or_else(|e| e.into_inner()); + continue; } - Ok(Client { - tx, - rx: Mutex::new(rx), - }) - } - - pub unsafe fn open(_s: &str) -> Option<Client> { - None - } - - pub fn acquire(&self) -> io::Result<Acquired> { - self.rx.lock().unwrap().recv().unwrap(); - Ok(Acquired(())) - } - - pub fn release(&self, _data: Option<&Acquired>) -> io::Result<()> { - self.tx.send(()).unwrap(); - Ok(()) - } - pub fn string_arg(&self) -> String { - panic!( - "On this platform there is no cross process jobserver support, - so Client::configure is not supported." - ); - } - - pub fn configure(&self, _cmd: &mut Command) { - unreachable!(); + // Consume the request for a token, and then actually acquire a + // token after unlocking our lock (not that acquisition happens in + // `f`). This ensures that we don't actually hold the lock if we + // wait for a long time for a token. + lock.requests -= 1; + drop(lock); + f(self); + lock = self.lock(); } + lock.consumer_done = true; + self.cvar.notify_one(); } - #[derive(Debug)] - pub struct Helper { - thread: JoinHandle<()>, - } - - pub fn spawn_helper( - client: ::Client, - rx: Receiver<()>, - mut f: Box<FnMut(io::Result<::Acquired>) + Send>, - ) -> io::Result<Helper> { - let thread = Builder::new().spawn(move || { - for () in rx { - let res = client.acquire(); - f(res); - } - })?; - - Ok(Helper { thread: thread }) - } - - impl Helper { - pub fn join(self) { - drop(self.thread.join()); - } + fn producer_done(&self) -> bool { + self.lock().producer_done } } diff --git a/vendor/jobserver/src/unix.rs b/vendor/jobserver/src/unix.rs new file mode 100644 index 0000000000..7b969ee0ea --- /dev/null +++ b/vendor/jobserver/src/unix.rs @@ -0,0 +1,336 @@ +use libc::c_int; +use std::fs::File; +use std::io::{self, Read, Write}; +use std::mem; +use std::os::unix::prelude::*; +use std::process::Command; +use std::ptr; +use std::sync::{Arc, Once}; +use std::thread::{self, Builder, JoinHandle}; +use std::time::Duration; + +#[derive(Debug)] +pub struct Client { + read: File, + write: File, +} + +#[derive(Debug)] +pub struct Acquired { + byte: u8, +} + +impl Client { + pub fn new(limit: usize) -> io::Result<Client> { + let client = unsafe { Client::mk()? }; + // I don't think the character written here matters, but I could be + // wrong! + for _ in 0..limit { + (&client.write).write(&[b'|'])?; + } + Ok(client) + } + + unsafe fn mk() -> io::Result<Client> { + let mut pipes = [0; 2]; + + // Attempt atomically-create-with-cloexec if we can on Linux, + // detected by using the `syscall` function in `libc` to try to work + // with as many kernels/glibc implementations as possible. + #[cfg(target_os = "linux")] + { + use std::sync::atomic::{AtomicBool, Ordering}; + + static PIPE2_AVAILABLE: AtomicBool = AtomicBool::new(true); + if PIPE2_AVAILABLE.load(Ordering::SeqCst) { + match libc::syscall(libc::SYS_pipe2, pipes.as_mut_ptr(), libc::O_CLOEXEC) { + -1 => { + let err = io::Error::last_os_error(); + if err.raw_os_error() == Some(libc::ENOSYS) { + PIPE2_AVAILABLE.store(false, Ordering::SeqCst); + } else { + return Err(err); + } + } + _ => return Ok(Client::from_fds(pipes[0], pipes[1])), + } + } + } + + cvt(libc::pipe(pipes.as_mut_ptr()))?; + drop(set_cloexec(pipes[0], true)); + drop(set_cloexec(pipes[1], true)); + Ok(Client::from_fds(pipes[0], pipes[1])) + } + + pub unsafe fn open(s: &str) -> Option<Client> { + let mut parts = s.splitn(2, ','); + let read = parts.next().unwrap(); + let write = match parts.next() { + Some(s) => s, + None => return None, + }; + + let read = match read.parse() { + Ok(n) => n, + Err(_) => return None, + }; + let write = match write.parse() { + Ok(n) => n, + Err(_) => return None, + }; + + // Ok so we've got two integers that look like file descriptors, but + // for extra sanity checking let's see if they actually look like + // instances of a pipe before we return the client. + // + // If we're called from `make` *without* the leading + on our rule + // then we'll have `MAKEFLAGS` env vars but won't actually have + // access to the file descriptors. + if is_valid_fd(read) && is_valid_fd(write) { + drop(set_cloexec(read, true)); + drop(set_cloexec(write, true)); + Some(Client::from_fds(read, write)) + } else { + None + } + } + + unsafe fn from_fds(read: c_int, write: c_int) -> Client { + Client { + read: File::from_raw_fd(read), + write: File::from_raw_fd(write), + } + } + + pub fn acquire(&self) -> io::Result<Acquired> { + // Ignore interrupts and keep trying if that happens + loop { + if let Some(token) = self.acquire_allow_interrupts()? { + return Ok(token); + } + } + } + + /// Block waiting for a token, returning `None` if we're interrupted with + /// EINTR. + fn acquire_allow_interrupts(&self) -> io::Result<Option<Acquired>> { + // We don't actually know if the file descriptor here is set in + // blocking or nonblocking mode. AFAIK all released versions of + // `make` use blocking fds for the jobserver, but the unreleased + // version of `make` doesn't. In the unreleased version jobserver + // fds are set to nonblocking and combined with `pselect` + // internally. + // + // Here we try to be compatible with both strategies. We + // unconditionally expect the file descriptor to be in nonblocking + // mode and if it happens to be in blocking mode then most of this + // won't end up actually being necessary! + // + // We use `poll` here to block this thread waiting for read + // readiness, and then afterwards we perform the `read` itself. If + // the `read` returns that it would block then we start over and try + // again. + // + // Also note that we explicitly don't handle EINTR here. That's used + // to shut us down, so we otherwise punt all errors upwards. + unsafe { + let mut fd: libc::pollfd = mem::zeroed(); + fd.fd = self.read.as_raw_fd(); + fd.events = libc::POLLIN; + loop { + fd.revents = 0; + if libc::poll(&mut fd, 1, -1) == -1 { + let e = io::Error::last_os_error(); + match e.kind() { + io::ErrorKind::Interrupted => return Ok(None), + _ => return Err(e), + } + } + if fd.revents == 0 { + continue; + } + let mut buf = [0]; + match (&self.read).read(&mut buf) { + Ok(1) => return Ok(Some(Acquired { byte: buf[0] })), + Ok(_) => { + return Err(io::Error::new( + io::ErrorKind::Other, + "early EOF on jobserver pipe", + )) + } + Err(e) => match e.kind() { + io::ErrorKind::WouldBlock | io::ErrorKind::Interrupted => return Ok(None), + _ => return Err(e), + }, + } + } + } + } + + pub fn release(&self, data: Option<&Acquired>) -> io::Result<()> { + // Note that the fd may be nonblocking but we're going to go ahead + // and assume that the writes here are always nonblocking (we can + // always quickly release a token). If that turns out to not be the + // case we'll get an error anyway! + let byte = data.map(|d| d.byte).unwrap_or(b'+'); + match (&self.write).write(&[byte])? { + 1 => Ok(()), + _ => Err(io::Error::new( + io::ErrorKind::Other, + "failed to write token back to jobserver", + )), + } + } + + pub fn string_arg(&self) -> String { + format!("{},{} -j", self.read.as_raw_fd(), self.write.as_raw_fd()) + } + + pub fn configure(&self, cmd: &mut Command) { + // Here we basically just want to say that in the child process + // we'll configure the read/write file descriptors to *not* be + // cloexec, so they're inherited across the exec and specified as + // integers through `string_arg` above. + let read = self.read.as_raw_fd(); + let write = self.write.as_raw_fd(); + unsafe { + cmd.pre_exec(move || { + set_cloexec(read, false)?; + set_cloexec(write, false)?; + Ok(()) + }); + } + } +} + +#[derive(Debug)] +pub struct Helper { + thread: JoinHandle<()>, + state: Arc<super::HelperState>, +} + +pub(crate) fn spawn_helper( + client: crate::Client, + state: Arc<super::HelperState>, + mut f: Box<dyn FnMut(io::Result<crate::Acquired>) + Send>, +) -> io::Result<Helper> { + static USR1_INIT: Once = Once::new(); + let mut err = None; + USR1_INIT.call_once(|| unsafe { + let mut new: libc::sigaction = mem::zeroed(); + new.sa_sigaction = sigusr1_handler as usize; + new.sa_flags = libc::SA_SIGINFO as _; + if libc::sigaction(libc::SIGUSR1, &new, ptr::null_mut()) != 0 { + err = Some(io::Error::last_os_error()); + } + }); + + if let Some(e) = err.take() { + return Err(e); + } + + let state2 = state.clone(); + let thread = Builder::new().spawn(move || { + state2.for_each_request(|helper| loop { + match client.inner.acquire_allow_interrupts() { + Ok(Some(data)) => { + break f(Ok(crate::Acquired { + client: client.inner.clone(), + data, + disabled: false, + })) + } + Err(e) => break f(Err(e)), + Ok(None) if helper.producer_done() => break, + Ok(None) => {} + } + }); + })?; + + Ok(Helper { thread, state }) +} + +impl Helper { + pub fn join(self) { + let dur = Duration::from_millis(10); + let mut state = self.state.lock(); + debug_assert!(state.producer_done); + + // We need to join our helper thread, and it could be blocked in one + // of two locations. First is the wait for a request, but the + // initial drop of `HelperState` will take care of that. Otherwise + // it may be blocked in `client.acquire()`. We actually have no way + // of interrupting that, so resort to `pthread_kill` as a fallback. + // This signal should interrupt any blocking `read` call with + // `io::ErrorKind::Interrupt` and cause the thread to cleanly exit. + // + // Note that we don't do this forever though since there's a chance + // of bugs, so only do this opportunistically to make a best effort + // at clearing ourselves up. + for _ in 0..100 { + if state.consumer_done { + break; + } + unsafe { + // Ignore the return value here of `pthread_kill`, + // apparently on OSX if you kill a dead thread it will + // return an error, but on other platforms it may not. In + // that sense we don't actually know if this will succeed or + // not! + libc::pthread_kill(self.thread.as_pthread_t() as _, libc::SIGUSR1); + } + state = self + .state + .cvar + .wait_timeout(state, dur) + .unwrap_or_else(|e| e.into_inner()) + .0; + thread::yield_now(); // we really want the other thread to run + } + + // If we managed to actually see the consumer get done, then we can + // definitely wait for the thread. Otherwise it's... off in the ether + // I guess? + if state.consumer_done { + drop(self.thread.join()); + } + } +} + +fn is_valid_fd(fd: c_int) -> bool { + unsafe { + return libc::fcntl(fd, libc::F_GETFD) != -1; + } +} + +fn set_cloexec(fd: c_int, set: bool) -> io::Result<()> { + unsafe { + let previous = cvt(libc::fcntl(fd, libc::F_GETFD))?; + let new = if set { + previous | libc::FD_CLOEXEC + } else { + previous & !libc::FD_CLOEXEC + }; + if new != previous { + cvt(libc::fcntl(fd, libc::F_SETFD, new))?; + } + Ok(()) + } +} + +fn cvt(t: c_int) -> io::Result<c_int> { + if t == -1 { + Err(io::Error::last_os_error()) + } else { + Ok(t) + } +} + +extern "C" fn sigusr1_handler( + _signum: c_int, + _info: *mut libc::siginfo_t, + _ptr: *mut libc::c_void, +) { + // nothing to do +} diff --git a/vendor/jobserver/src/wasm.rs b/vendor/jobserver/src/wasm.rs new file mode 100644 index 0000000000..b88a9d9520 --- /dev/null +++ b/vendor/jobserver/src/wasm.rs @@ -0,0 +1,90 @@ +use std::io; +use std::process::Command; +use std::sync::{Arc, Condvar, Mutex}; +use std::thread::{Builder, JoinHandle}; + +#[derive(Debug)] +pub struct Client { + inner: Arc<Inner>, +} + +#[derive(Debug)] +struct Inner { + count: Mutex<usize>, + cvar: Condvar, +} + +#[derive(Debug)] +pub struct Acquired(()); + +impl Client { + pub fn new(limit: usize) -> io::Result<Client> { + Ok(Client { + inner: Arc::new(Inner { + count: Mutex::new(limit), + cvar: Condvar::new(), + }), + }) + } + + pub unsafe fn open(_s: &str) -> Option<Client> { + None + } + + pub fn acquire(&self) -> io::Result<Acquired> { + let mut lock = self.inner.count.lock().unwrap_or_else(|e| e.into_inner()); + while *lock == 0 { + lock = self + .inner + .cvar + .wait(lock) + .unwrap_or_else(|e| e.into_inner()); + } + *lock -= 1; + Ok(Acquired(())) + } + + pub fn release(&self, _data: Option<&Acquired>) -> io::Result<()> { + let mut lock = self.inner.count.lock().unwrap_or_else(|e| e.into_inner()); + *lock += 1; + drop(lock); + self.inner.cvar.notify_one(); + Ok(()) + } + + pub fn string_arg(&self) -> String { + panic!( + "On this platform there is no cross process jobserver support, + so Client::configure is not supported." + ); + } + + pub fn configure(&self, _cmd: &mut Command) { + unreachable!(); + } +} + +#[derive(Debug)] +pub struct Helper { + thread: JoinHandle<()>, +} + +pub(crate) fn spawn_helper( + client: crate::Client, + state: Arc<super::HelperState>, + mut f: Box<dyn FnMut(io::Result<crate::Acquired>) + Send>, +) -> io::Result<Helper> { + let thread = Builder::new().spawn(move || { + state.for_each_request(|_| f(client.acquire())); + })?; + + Ok(Helper { thread: thread }) +} + +impl Helper { + pub fn join(self) { + // TODO: this is not correct if the thread is blocked in + // `client.acquire()`. + drop(self.thread.join()); + } +} diff --git a/vendor/jobserver/src/windows.rs b/vendor/jobserver/src/windows.rs new file mode 100644 index 0000000000..d795c1cee0 --- /dev/null +++ b/vendor/jobserver/src/windows.rs @@ -0,0 +1,246 @@ +use std::ffi::CString; +use std::io; +use std::process::Command; +use std::ptr; +use std::sync::Arc; +use std::thread::{Builder, JoinHandle}; + +#[derive(Debug)] +pub struct Client { + sem: Handle, + name: String, +} + +#[derive(Debug)] +pub struct Acquired; + +type BOOL = i32; +type DWORD = u32; +type HANDLE = *mut u8; +type LONG = i32; + +const ERROR_ALREADY_EXISTS: DWORD = 183; +const FALSE: BOOL = 0; +const INFINITE: DWORD = 0xffffffff; +const SEMAPHORE_MODIFY_STATE: DWORD = 0x2; +const SYNCHRONIZE: DWORD = 0x00100000; +const TRUE: BOOL = 1; +const WAIT_OBJECT_0: DWORD = 0; + +extern "system" { + fn CloseHandle(handle: HANDLE) -> BOOL; + fn SetEvent(hEvent: HANDLE) -> BOOL; + fn WaitForMultipleObjects( + ncount: DWORD, + lpHandles: *const HANDLE, + bWaitAll: BOOL, + dwMilliseconds: DWORD, + ) -> DWORD; + fn CreateEventA( + lpEventAttributes: *mut u8, + bManualReset: BOOL, + bInitialState: BOOL, + lpName: *const i8, + ) -> HANDLE; + fn ReleaseSemaphore( + hSemaphore: HANDLE, + lReleaseCount: LONG, + lpPreviousCount: *mut LONG, + ) -> BOOL; + fn CreateSemaphoreA( + lpEventAttributes: *mut u8, + lInitialCount: LONG, + lMaximumCount: LONG, + lpName: *const i8, + ) -> HANDLE; + fn OpenSemaphoreA(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: *const i8) -> HANDLE; + fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD; + #[link_name = "SystemFunction036"] + fn RtlGenRandom(RandomBuffer: *mut u8, RandomBufferLength: u32) -> u8; +} + +// Note that we ideally would use the `getrandom` crate, but unfortunately +// that causes build issues when this crate is used in rust-lang/rust (see +// rust-lang/rust#65014 for more information). As a result we just inline +// the pretty simple Windows-specific implementation of generating +// randomness. +fn getrandom(dest: &mut [u8]) -> io::Result<()> { + // Prevent overflow of u32 + for chunk in dest.chunks_mut(u32::max_value() as usize) { + let ret = unsafe { RtlGenRandom(chunk.as_mut_ptr(), chunk.len() as u32) }; + if ret == 0 { + return Err(io::Error::new( + io::ErrorKind::Other, + "failed to generate random bytes", + )); + } + } + Ok(()) +} + +impl Client { + pub fn new(limit: usize) -> io::Result<Client> { + // Try a bunch of random semaphore names until we get a unique one, + // but don't try for too long. + // + // Note that `limit == 0` is a valid argument above but Windows + // won't let us create a semaphore with 0 slots available to it. Get + // `limit == 0` working by creating a semaphore instead with one + // slot and then immediately acquire it (without ever releaseing it + // back). + for _ in 0..100 { + let mut bytes = [0; 4]; + getrandom(&mut bytes)?; + let mut name = format!("__rust_jobserver_semaphore_{}\0", u32::from_ne_bytes(bytes)); + unsafe { + let create_limit = if limit == 0 { 1 } else { limit }; + let r = CreateSemaphoreA( + ptr::null_mut(), + create_limit as LONG, + create_limit as LONG, + name.as_ptr() as *const _, + ); + if r.is_null() { + return Err(io::Error::last_os_error()); + } + let handle = Handle(r); + + let err = io::Error::last_os_error(); + if err.raw_os_error() == Some(ERROR_ALREADY_EXISTS as i32) { + continue; + } + name.pop(); // chop off the trailing nul + let client = Client { + sem: handle, + name: name, + }; + if create_limit != limit { + client.acquire()?; + } + return Ok(client); + } + } + + Err(io::Error::new( + io::ErrorKind::Other, + "failed to find a unique name for a semaphore", + )) + } + + pub unsafe fn open(s: &str) -> Option<Client> { + let name = match CString::new(s) { + Ok(s) => s, + Err(_) => return None, + }; + + let sem = OpenSemaphoreA(SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, FALSE, name.as_ptr()); + if sem.is_null() { + None + } else { + Some(Client { + sem: Handle(sem), + name: s.to_string(), + }) + } + } + + pub fn acquire(&self) -> io::Result<Acquired> { + unsafe { + let r = WaitForSingleObject(self.sem.0, INFINITE); + if r == WAIT_OBJECT_0 { + Ok(Acquired) + } else { + Err(io::Error::last_os_error()) + } + } + } + + pub fn release(&self, _data: Option<&Acquired>) -> io::Result<()> { + unsafe { + let r = ReleaseSemaphore(self.sem.0, 1, ptr::null_mut()); + if r != 0 { + Ok(()) + } else { + Err(io::Error::last_os_error()) + } + } + } + + pub fn string_arg(&self) -> String { + self.name.clone() + } + + pub fn configure(&self, _cmd: &mut Command) { + // nothing to do here, we gave the name of our semaphore to the + // child above + } +} + +#[derive(Debug)] +struct Handle(HANDLE); +// HANDLE is a raw ptr, but we're send/sync +unsafe impl Sync for Handle {} +unsafe impl Send for Handle {} + +impl Drop for Handle { + fn drop(&mut self) { + unsafe { + CloseHandle(self.0); + } + } +} + +#[derive(Debug)] +pub struct Helper { + event: Arc<Handle>, + thread: JoinHandle<()>, +} + +pub(crate) fn spawn_helper( + client: crate::Client, + state: Arc<super::HelperState>, + mut f: Box<dyn FnMut(io::Result<crate::Acquired>) + Send>, +) -> io::Result<Helper> { + let event = unsafe { + let r = CreateEventA(ptr::null_mut(), TRUE, FALSE, ptr::null()); + if r.is_null() { + return Err(io::Error::last_os_error()); + } else { + Handle(r) + } + }; + let event = Arc::new(event); + let event2 = event.clone(); + let thread = Builder::new().spawn(move || { + let objects = [event2.0, client.inner.sem.0]; + state.for_each_request(|_| { + const WAIT_OBJECT_1: u32 = WAIT_OBJECT_0 + 1; + match unsafe { WaitForMultipleObjects(2, objects.as_ptr(), FALSE, INFINITE) } { + WAIT_OBJECT_0 => return, + WAIT_OBJECT_1 => f(Ok(crate::Acquired { + client: client.inner.clone(), + data: Acquired, + disabled: false, + })), + _ => f(Err(io::Error::last_os_error())), + } + }); + })?; + Ok(Helper { thread, event }) +} + +impl Helper { + pub fn join(self) { + // Unlike unix this logic is much easier. If our thread was blocked + // in waiting for requests it should already be woken up and + // exiting. Otherwise it's waiting for a token, so we wake it up + // with a different event that it's also waiting on here. After + // these two we should be guaranteed the thread is on its way out, + // so we can safely `join`. + let r = unsafe { SetEvent(self.event.0) }; + if r == 0 { + panic!("failed to set event: {}", io::Error::last_os_error()); + } + drop(self.thread.join()); + } +} diff --git a/vendor/jobserver/tests/client-of-myself.rs b/vendor/jobserver/tests/client-of-myself.rs index 1063689499..b89a2f7b54 100644 --- a/vendor/jobserver/tests/client-of-myself.rs +++ b/vendor/jobserver/tests/client-of-myself.rs @@ -1,8 +1,8 @@ extern crate jobserver; use std::env; -use std::io::BufReader; use std::io::prelude::*; +use std::io::BufReader; use std::process::{Command, Stdio}; use std::sync::mpsc; use std::thread; @@ -10,10 +10,12 @@ use std::thread; use jobserver::Client; macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; } fn main() { @@ -28,8 +30,7 @@ fn server() { let me = t!(env::current_exe()); let client = t!(Client::new(1)); let mut cmd = Command::new(me); - cmd.env("I_AM_THE_CLIENT", "1") - .stdout(Stdio::piped()); + cmd.env("I_AM_THE_CLIENT", "1").stdout(Stdio::piped()); client.configure(&mut cmd); let acq = client.acquire().unwrap(); let mut child = t!(cmd.spawn()); diff --git a/vendor/jobserver/tests/client.rs b/vendor/jobserver/tests/client.rs index 4bf608c037..042afaa818 100644 --- a/vendor/jobserver/tests/client.rs +++ b/vendor/jobserver/tests/client.rs @@ -9,9 +9,9 @@ use std::env; use std::fs::File; use std::io::Write; use std::process::Command; -use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc; +use std::sync::Arc; use std::thread; use futures::future::{self, Future}; @@ -22,17 +22,19 @@ use tokio_core::reactor::Core; use tokio_process::CommandExt; macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; } struct Test { name: &'static str, - f: &'static Fn(), + f: &'static dyn Fn(), make_args: &'static [&'static str], - rule: &'static Fn(&str) -> String, + rule: &'static dyn Fn(&str) -> String, } const TESTS: &[Test] = &[ @@ -117,7 +119,7 @@ const TESTS: &[Test] = &[ fn main() { if let Ok(test) = env::var("TEST_TO_RUN") { - return (TESTS.iter().find(|t| t.name == test).unwrap().f)() + return (TESTS.iter().find(|t| t.name == test).unwrap().f)(); } let me = t!(env::current_exe()); @@ -126,36 +128,40 @@ fn main() { let mut core = t!(Core::new()); - let futures = TESTS.iter().filter(|test| { - match filter { + let futures = TESTS + .iter() + .filter(|test| match filter { Some(ref s) => test.name.contains(s), None => true, - } - }).map(|test| { - let td = t!(TempDir::new("foo")); - let makefile = format!("\ + }) + .map(|test| { + let td = t!(TempDir::new("foo")); + let makefile = format!( + "\ all: export TEST_TO_RUN={} all: \t{} -", test.name, (test.rule)(me)); - t!(t!(File::create(td.path().join("Makefile"))) - .write_all(makefile.as_bytes())); - let prog = env::var("MAKE").unwrap_or("make".to_string()); - let mut cmd = Command::new(prog); - cmd.args(test.make_args); - cmd.current_dir(td.path()); - future::lazy(move || { - cmd.output_async().map(move |e| { - drop(td); - (test, e) +", + test.name, + (test.rule)(me) + ); + t!(t!(File::create(td.path().join("Makefile"))).write_all(makefile.as_bytes())); + let prog = env::var("MAKE").unwrap_or("make".to_string()); + let mut cmd = Command::new(prog); + cmd.args(test.make_args); + cmd.current_dir(td.path()); + future::lazy(move || { + cmd.output_async().map(move |e| { + drop(td); + (test, e) + }) }) }) - }).collect::<Vec<_>>(); + .collect::<Vec<_>>(); println!("\nrunning {} tests\n", futures.len()); - let stream = stream::iter(futures.into_iter().map(Ok)) - .buffer_unordered(num_cpus::get()); + let stream = stream::iter(futures.into_iter().map(Ok)).buffer_unordered(num_cpus::get()); let mut failures = Vec::new(); t!(core.run(stream.for_each(|(test, output)| { @@ -170,7 +176,7 @@ all: if failures.len() == 0 { println!("\ntest result: ok\n"); - return + return; } println!("\n----------- failures"); diff --git a/vendor/jobserver/tests/helper.rs b/vendor/jobserver/tests/helper.rs index ed046ae59d..093a504ebe 100644 --- a/vendor/jobserver/tests/helper.rs +++ b/vendor/jobserver/tests/helper.rs @@ -1,14 +1,15 @@ -extern crate jobserver; - -use std::sync::mpsc; - use jobserver::Client; +use std::sync::atomic::*; +use std::sync::mpsc; +use std::sync::*; macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; } #[test] @@ -26,7 +27,9 @@ fn helper_smoke() { fn acquire() { let (tx, rx) = mpsc::channel(); let client = t!(Client::new(1)); - let helper = client.into_helper_thread(move |a| drop(tx.send(a))).unwrap(); + let helper = client + .into_helper_thread(move |a| drop(tx.send(a))) + .unwrap(); assert!(rx.try_recv().is_err()); helper.request_token(); rx.recv().unwrap().unwrap(); @@ -42,3 +45,33 @@ fn acquire() { helper.request_token(); drop(helper); } + +#[test] +fn prompt_shutdown() { + for _ in 0..100 { + let client = jobserver::Client::new(4).unwrap(); + let count = Arc::new(AtomicU32::new(0)); + let count2 = count.clone(); + let tokens = Arc::new(Mutex::new(Vec::new())); + let helper = client + .into_helper_thread(move |token| { + tokens.lock().unwrap().push(token); + count2.fetch_add(1, Ordering::SeqCst); + }) + .unwrap(); + + // Request more tokens than what are available. + for _ in 0..5 { + helper.request_token(); + } + // Wait for at least some of the requests to finish. + while count.load(Ordering::SeqCst) < 3 { + std::thread::yield_now(); + } + // Drop helper + let t = std::time::Instant::now(); + drop(helper); + let d = t.elapsed(); + assert!(d.as_secs_f64() < 0.5); + } +} diff --git a/vendor/jobserver/tests/make-as-a-client.rs b/vendor/jobserver/tests/make-as-a-client.rs index 1f029555f7..070d3464fc 100644 --- a/vendor/jobserver/tests/make-as-a-client.rs +++ b/vendor/jobserver/tests/make-as-a-client.rs @@ -4,17 +4,19 @@ extern crate tempdir; use std::env; use std::fs::File; use std::io::prelude::*; -use std::net::{TcpStream, TcpListener}; +use std::net::{TcpListener, TcpStream}; use std::process::Command; use jobserver::Client; use tempdir::TempDir; macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; } fn main() { @@ -27,14 +29,14 @@ fn main() { .status() .unwrap() .code() - .unwrap_or(1) + .unwrap_or(1), ); } if let Ok(s) = env::var("TEST_ADDR") { let mut contents = Vec::new(); t!(t!(TcpStream::connect(&s)).read_to_end(&mut contents)); - return + return; } let c = t!(Client::new(1)); @@ -50,13 +52,19 @@ fn main() { cmd.env("MAKE", prog); cmd.env("_DO_THE_TEST", "1"); - t!(t!(File::create(td.path().join("Makefile"))).write_all(format!("\ + t!(t!(File::create(td.path().join("Makefile"))).write_all( + format!( + "\ all: foo bar foo: \t{0} bar: \t{0} -", me).as_bytes())); +", + me + ) + .as_bytes() + )); // We're leaking one extra token to `make` sort of violating the makefile // jobserver protocol. It has the desired effect though. diff --git a/vendor/jobserver/tests/server.rs b/vendor/jobserver/tests/server.rs index 94cd71c9c4..efdda013ba 100644 --- a/vendor/jobserver/tests/server.rs +++ b/vendor/jobserver/tests/server.rs @@ -5,19 +5,21 @@ use std::env; use std::fs::File; use std::io::prelude::*; use std::process::Command; -use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc; +use std::sync::Arc; use std::thread; use jobserver::Client; use tempdir::TempDir; macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - }) + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; } #[test] @@ -63,13 +65,15 @@ fn make_as_a_single_thread_client() { let mut cmd = Command::new(prog); cmd.current_dir(td.path()); - t!(t!(File::create(td.path().join("Makefile"))).write_all(b" + t!(t!(File::create(td.path().join("Makefile"))).write_all( + b" all: foo bar foo: \techo foo bar: \techo bar -")); +" + )); // The jobserver protocol means that the `make` process itself "runs with a // token", so we acquire our one token to drain the jobserver, and this @@ -77,10 +81,14 @@ bar: let _a = c.acquire(); c.configure(&mut cmd); let output = t!(cmd.output()); - println!("\n\t=== stderr\n\t\t{}", - String::from_utf8_lossy(&output.stderr).replace("\n", "\n\t\t")); - println!("\t=== stdout\n\t\t{}", - String::from_utf8_lossy(&output.stdout).replace("\n", "\n\t\t")); + println!( + "\n\t=== stderr\n\t\t{}", + String::from_utf8_lossy(&output.stderr).replace("\n", "\n\t\t") + ); + println!( + "\t=== stdout\n\t\t{}", + String::from_utf8_lossy(&output.stdout).replace("\n", "\n\t\t") + ); assert!(output.status.success()); assert!(output.stderr.is_empty()); @@ -111,22 +119,28 @@ fn make_as_a_multi_thread_client() { let mut cmd = Command::new(prog); cmd.current_dir(td.path()); - t!(t!(File::create(td.path().join("Makefile"))).write_all(b" + t!(t!(File::create(td.path().join("Makefile"))).write_all( + b" all: foo bar foo: \techo foo bar: \techo bar -")); +" + )); // We're leaking one extra token to `make` sort of violating the makefile // jobserver protocol. It has the desired effect though. c.configure(&mut cmd); let output = t!(cmd.output()); - println!("\n\t=== stderr\n\t\t{}", - String::from_utf8_lossy(&output.stderr).replace("\n", "\n\t\t")); - println!("\t=== stdout\n\t\t{}", - String::from_utf8_lossy(&output.stdout).replace("\n", "\n\t\t")); + println!( + "\n\t=== stderr\n\t\t{}", + String::from_utf8_lossy(&output.stderr).replace("\n", "\n\t\t") + ); + println!( + "\t=== stdout\n\t\t{}", + String::from_utf8_lossy(&output.stdout).replace("\n", "\n\t\t") + ); assert!(output.status.success()); } @@ -135,7 +149,9 @@ bar: fn zero_client() { let client = t!(Client::new(0)); let (tx, rx) = mpsc::channel(); - let helper = client.into_helper_thread(move |a| drop(tx.send(a))).unwrap(); + let helper = client + .into_helper_thread(move |a| drop(tx.send(a))) + .unwrap(); helper.request_token(); helper.request_token(); diff --git a/vendor/lazy_static/.cargo-checksum.json b/vendor/lazy_static/.cargo-checksum.json index ef9d842644..fa241ed8f5 100644 --- a/vendor/lazy_static/.cargo-checksum.json +++ b/vendor/lazy_static/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"374d6623eea9b51155daf6f722062e3729ec2947191ed5a8efdc8df72eedb09a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"66e5ee88a690ca68496367bfe3d3ad01ad3234ee2bf1a3e847caf2676e04e75d","src/core_lazy.rs":"6b9fb6a4f553058e240756125b6b9ca43a83ed1fb72964343038ea0ea2e1af10","src/inline_lazy.rs":"2ae9a04c5bff40e80194f65b01012f0b42efa527bf717e176c68b4ca5212043c","src/lib.rs":"395f82f90fb563b30d379ee7d582b1741a94654e965e8a8915eeb672645812bc","tests/no_std.rs":"d68b149ee51ef5ae2b2906c0c94f5a9812d3b02811b13365c5a35e2ef90d25cf","tests/test.rs":"8e809c0f0332a3a60fca0113128cdab2cdbee92f03db523cdc4e82f4cd4b9f22"},"package":"bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14"} \ No newline at end of file +{"files":{"Cargo.toml":"05e37a4e63dc4a495998bb5133252a51d671c4e99061a6342089ed6eab43978a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"e2effacb5bbd7c01523f9a9e4a6a59c0f9b8698753b210fec5742408498197df","src/core_lazy.rs":"6b9fb6a4f553058e240756125b6b9ca43a83ed1fb72964343038ea0ea2e1af10","src/inline_lazy.rs":"f6184afbca4b477616f270790edc180263be806aa92ef0a9de681b4aac9e88c4","src/lib.rs":"99096a5d3089c0d86646f0805d1455befe2cb09683704af29c5c9d99ecab2683","tests/no_std.rs":"d68b149ee51ef5ae2b2906c0c94f5a9812d3b02811b13365c5a35e2ef90d25cf","tests/test.rs":"b3f7d805375dc5af7a2aa4b869944ad2ab4fc982b35ad718ea58f6914dc0a698"},"package":"e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"} \ No newline at end of file diff --git a/vendor/lazy_static/Cargo.toml b/vendor/lazy_static/Cargo.toml index c6779f9432..7f930c5e3d 100644 --- a/vendor/lazy_static/Cargo.toml +++ b/vendor/lazy_static/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "lazy_static" -version = "1.3.0" +version = "1.4.0" authors = ["Marvin Löbel <loebel.marvin@gmail.com>"] exclude = ["/.travis.yml", "/appveyor.yml"] description = "A macro for declaring lazily evaluated statics in Rust." @@ -25,6 +25,8 @@ repository = "https://github.com/rust-lang-nursery/lazy-static.rs" [dependencies.spin] version = "0.5.0" optional = true +[dev-dependencies.doc-comment] +version = "0.3.1" [features] spin_no_std = ["spin"] diff --git a/vendor/lazy_static/README.md b/vendor/lazy_static/README.md index c91337566f..aa9f828324 100644 --- a/vendor/lazy_static/README.md +++ b/vendor/lazy_static/README.md @@ -15,7 +15,7 @@ as well as anything that requires non-const function calls to be computed. ## Minimum supported `rustc` -`1.24.1+` +`1.27.2+` This version is explicitly tested in CI and may only be bumped in new minor versions. Any changes to the supported minimum version will be called out in the release notes. @@ -31,7 +31,7 @@ Add the following dependency to your Cargo manifest... ```toml [dependencies] -lazy_static = "1.3.0" +lazy_static = "1.4.0" ``` ...and see the [docs](https://docs.rs/lazy_static) for how to use it. diff --git a/vendor/lazy_static/src/inline_lazy.rs b/vendor/lazy_static/src/inline_lazy.rs index 268dd45fd7..219ce9c60c 100644 --- a/vendor/lazy_static/src/inline_lazy.rs +++ b/vendor/lazy_static/src/inline_lazy.rs @@ -10,13 +10,16 @@ extern crate std; use self::std::prelude::v1::*; use self::std::cell::Cell; +use self::std::hint::unreachable_unchecked; use self::std::sync::Once; +#[allow(deprecated)] pub use self::std::sync::ONCE_INIT; -// FIXME: Replace Option<T> with MaybeInitialized<T> +// FIXME: Replace Option<T> with MaybeUninit<T> (stable since 1.36.0) pub struct Lazy<T: Sync>(Cell<Option<T>>, Once); impl<T: Sync> Lazy<T> { + #[allow(deprecated)] pub const INIT: Self = Lazy(Cell::new(None), ONCE_INIT); #[inline(always)] @@ -29,7 +32,7 @@ impl<T: Sync> Lazy<T> { }); // `self.0` is guaranteed to be `Some` by this point - // The `Once` will catch and propegate panics + // The `Once` will catch and propagate panics unsafe { match *self.0.as_ptr() { Some(ref x) => x, @@ -52,14 +55,3 @@ macro_rules! __lazy_static_create { static $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy::INIT; }; } - -/// Polyfill for std::hint::unreachable_unchecked. There currently exists a -/// [crate](https://docs.rs/unreachable) for an equivalent to std::hint::unreachable_unchecked, but -/// lazy_static currently doesn't include any runtime dependencies and we've chosen to include this -/// short polyfill rather than include a new crate in every consumer's build. -/// -/// This should be replaced by std's version when lazy_static starts to require at least Rust 1.27. -unsafe fn unreachable_unchecked() -> ! { - enum Void {} - match std::mem::uninitialized::<Void>() {} -} diff --git a/vendor/lazy_static/src/lib.rs b/vendor/lazy_static/src/lib.rs index ac0cf8a368..cada0dc681 100644 --- a/vendor/lazy_static/src/lib.rs +++ b/vendor/lazy_static/src/lib.rs @@ -90,16 +90,13 @@ The `Deref` implementation uses a hidden static variable that is guarded by an a # Cargo features -This crate provides two cargo features: +This crate provides one cargo feature: - `spin_no_std`: This allows using this crate in a no-std environment, by depending on the standalone `spin` crate. -Both features depend on unstable language features, which means -no guarantees can be made about them in regard to SemVer stability. - */ -#![doc(html_root_url = "https://docs.rs/lazy_static/1.3.0")] +#![doc(html_root_url = "https://docs.rs/lazy_static/1.4.0")] #![no_std] #[cfg(not(feature = "spin_no_std"))] @@ -107,6 +104,13 @@ no guarantees can be made about them in regard to SemVer stability. #[doc(hidden)] pub mod lazy; +#[cfg(test)] +#[macro_use] +extern crate doc_comment; + +#[cfg(test)] +doctest!("../README.md"); + #[cfg(feature = "spin_no_std")] #[path="core_lazy.rs"] #[doc(hidden)] diff --git a/vendor/lazy_static/tests/test.rs b/vendor/lazy_static/tests/test.rs index 654abc5418..03d0ab683a 100644 --- a/vendor/lazy_static/tests/test.rs +++ b/vendor/lazy_static/tests/test.rs @@ -133,9 +133,11 @@ fn item_name_shadowing() { } use std::sync::atomic::AtomicBool; +#[allow(deprecated)] use std::sync::atomic::ATOMIC_BOOL_INIT; use std::sync::atomic::Ordering::SeqCst; +#[allow(deprecated)] static PRE_INIT_FLAG: AtomicBool = ATOMIC_BOOL_INIT; lazy_static! { diff --git a/vendor/libc/.cargo-checksum.json b/vendor/libc/.cargo-checksum.json index 3edee12653..d9cfd8dd90 100644 --- a/vendor/libc/.cargo-checksum.json +++ b/vendor/libc/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CONTRIBUTING.md":"cc340197d05fd8f069dfda6347b97d3da92c8f260c75ac78fb6970f08dba7638","Cargo.toml":"ac4add0965345f7a46ff6e2b40c7fca321ce974e4835c0449cfc640cdfe300f2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"bf27f2aafc020fc8ca130f736fc94f6a76c3a029d68a03476a875623fc048986","build.rs":"35089efa83f5d58c90cf03c43c65012646ecb2e63ad33e5e1f0e193e298c3427","rustfmt.toml":"8a654d5787585ca8f2c20580737336fc327f411a07b0dbd4870adf6e9bdf624f","src/cloudabi/aarch64.rs":"b8550bf1fd7344972aa4db29441486f39f31482d0327534981dbb75959c29114","src/cloudabi/arm.rs":"c197e2781c2839808bd6fcef219a29705b27b992d3ef920e9cf6ac96e2022bbf","src/cloudabi/mod.rs":"7b36bc7429863346f11a395dbbc200a38b789066ee9aefeac808ecefda9a1a88","src/cloudabi/x86.rs":"33eb97f272d2201f3838ae74d444583c7de8f67856852ca375293b20bbd05636","src/cloudabi/x86_64.rs":"400d85d4fe39e26cf2e6ece9ee31c75fe9e88c4bcf4d836ca9f765c05c9c5be3","src/fixed_width_ints.rs":"34c60f12ec5eeb90f13ec3b954427532111c2446e69617616a97aefc1086a9f1","src/fuchsia/aarch64.rs":"378776a9e40766154a54c94c2a7b4675b5c302a38e6e42da99e67bfbaee60e56","src/fuchsia/align.rs":"ae1cf8f011a99737eabeb14ffff768e60f13b13363d7646744dbb0f443dab3d6","src/fuchsia/mod.rs":"8ab46872899b06f46b54bfa39cce3bd7e8a43abe871d9ea821dba1c16a3348d7","src/fuchsia/no_align.rs":"303f3f1b255e0088b5715094353cf00476131d8e94e6aebb3f469557771c8b8a","src/fuchsia/x86_64.rs":"93a3632b5cf67d2a6bcb7dc0a558605252d5fe689e0f38d8aa2ec5852255ac87","src/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/hermit/mod.rs":"aeda183662787a44c4bd26645cea76f31bf5f7c63d4d59118118c360705fb9eb","src/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/lib.rs":"9e980a80aa55661f39a406174f61784b775048c1012389ddf931e5f0de3572e7","src/macros.rs":"2407f3a2d5e3ae6224457bc793378aa35fc8d57bdc6c3d8024ace0ecbd9782f4","src/sgx.rs":"16a95cdefc81c5ee00d8353a60db363c4cc3e0f75abcd5d0144723f2a306ed1b","src/switch.rs":"9da3dd39b3de45a7928789926e8572d00e1e11a39e6f7289a1349aadce90edba","src/unix/align.rs":"2cdc7c826ef7ae61f5171c5ae8c445a743d86f1a7f2d9d7e4ceeec56d6874f65","src/unix/bsd/apple/b32/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b32/mod.rs":"6a4ce300da0d2b0db04b18548286603ffe4b47d679a41cf60f1902895894aa1f","src/unix/bsd/apple/b64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/mod.rs":"76e172191d70e7ea7ca194aaa2d002e50db5724bf24526c3be5028cfd2085897","src/unix/bsd/apple/mod.rs":"90dbe1b5a55719f1f8e4251a9fbc4cf783a2b71e6955f3984e602fdb0790e0df","src/unix/bsd/freebsdlike/dragonfly/errno.rs":"ae5e8e6b0f610ec015dfcc2928609037d7ea7b94570c72bcc5bdd588424c6259","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"dbf5e940cae86f38e103134746c5b865342f04fb3009afbc88fb06dbeb41340e","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"e528191e42977fa4c226d8850c47d3e526e951cca46ea9a4a87af40221f79d63","src/unix/bsd/freebsdlike/freebsd/arm.rs":"10fe01bc6269b47da72d1e9f8bdae2fcc7d4f332540e8ce1756e1f58d506bf8c","src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs":"3d96c3bbd507688099ace8650ea2934cd7d85650d2e3a0981c6f916597edd09d","src/unix/bsd/freebsdlike/freebsd/freebsd11/x86_64.rs":"9808d152c1196aa647f1b0f0cf84dac8c930da7d7f897a44975545e3d9d17681","src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs":"ceb4d5bd386f13bbf11499e12b5d4c377bd78ecca06fd65b0d08a6b25fba5ca4","src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/mod.rs":"82f01098b820ef0f0450ddadfd2c3009182a4c2427df0150900fad0f2e96429b","src/unix/bsd/freebsdlike/freebsd/powerpc64.rs":"125457305b14309cbad4c46fd2fbd54e2f96d37adfec6c89ae9ed8cedfa015bc","src/unix/bsd/freebsdlike/freebsd/x86.rs":"4e0813f01a017dc148262d7c40dfadb964eb7eb6138dc2b0b83d0b51dbe4d467","src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs":"fcf38f59ac1e8f90d5a26c6a434b6874972955404cb8cc33c17b1a583e3b3014","src/unix/bsd/freebsdlike/mod.rs":"2e0f5a0f768748a48caf05552956158c066db64ef59b935439f3a9e51ed1b93c","src/unix/bsd/mod.rs":"d8cf315174e6d97d87b44253fc4e4ef2570a495df8eec71f7571359c756ad039","src/unix/bsd/netbsdlike/mod.rs":"d03d0250aee67f23ff2951cb91305fcb30777f2953de878227a645ab87da6e08","src/unix/bsd/netbsdlike/netbsd/aarch64.rs":"b38fc046f9a40fea28bd26328b96629f4d5d63d7524936bd6af1865d401a8716","src/unix/bsd/netbsdlike/netbsd/arm.rs":"58cdbb70b0d6f536551f0f3bb3725d2d75c4690db12c26c034e7d6ec4a924452","src/unix/bsd/netbsdlike/netbsd/mod.rs":"b07d598043751be487622430c258d3516b8c4625f7b6e6bf634ed2cd317421a0","src/unix/bsd/netbsdlike/netbsd/powerpc.rs":"ee7ff5d89d0ed22f531237b5059aa669df93a3b5c489fa641465ace8d405bf41","src/unix/bsd/netbsdlike/netbsd/sparc64.rs":"9489f4b3e4566f43bb12dfb92238960613dac7f6a45cc13068a8d152b902d7d9","src/unix/bsd/netbsdlike/netbsd/x86.rs":"20692320e36bfe028d1a34d16fe12ca77aa909cb02bda167376f98f1a09aefe7","src/unix/bsd/netbsdlike/netbsd/x86_64.rs":"135509edeaf3fb3f102d89d51ff1a8f82323497336a8dc7e1f0f23b5c2434b73","src/unix/bsd/netbsdlike/openbsd/aarch64.rs":"1dd5449dd1fd3d51e30ffdeeaece91d0aaf05c710e0ac699fecc5461cfa2c28e","src/unix/bsd/netbsdlike/openbsd/mod.rs":"1c07d05a13db9dd7a829454ce477f255b9339272be7695aefa0a8a513918a548","src/unix/bsd/netbsdlike/openbsd/sparc64.rs":"d04fd287afbaa2c5df9d48c94e8374a532a3ba491b424ddf018270c7312f4085","src/unix/bsd/netbsdlike/openbsd/x86.rs":"6f7f5c4fde2a2259eb547890cbd86570cea04ef85347d7569e94e679448bec87","src/unix/bsd/netbsdlike/openbsd/x86_64.rs":"e59b7fd65f68f8e857eec39e0c03bac1d3af6ddc26c9ba58494336b83659bb9b","src/unix/haiku/b32.rs":"69ae47fc52c6880e85416b4744500d5655c9ec6131cb737f3b649fceaadce15a","src/unix/haiku/b64.rs":"73e64db09275a8da8d50a13cce2cfa2b136036ddf3a930d2939f337fc995900b","src/unix/haiku/mod.rs":"acd18f665908abcddc7e0a217708238d602f3ca827a3a46cd3bd8c7cd8a8d8b5","src/unix/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/unix/hermit/mod.rs":"878e02b4b3ceafdfce3746efadb621ec1baacfe93e385556c6e505bae5c3eaaf","src/unix/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/unix/linux_like/android/b32/arm.rs":"3625a32c7e58cfe683a53486fbe3d42d4e28f00bea31e19cb46ed2bb0b6a140b","src/unix/linux_like/android/b32/mod.rs":"c997e59bc7a5abe0f37dd87fcc206651dcb2c9837c3f4c2437f9d7944a30717c","src/unix/linux_like/android/b32/x86/align.rs":"812914e4241df82e32b12375ca3374615dc3a4bdd4cf31f0423c5815320c0dab","src/unix/linux_like/android/b32/x86/mod.rs":"edc810399ce9db38c1042c653f05d7f3571f711fa2c16917e8b543df01f065a5","src/unix/linux_like/android/b64/aarch64/align.rs":"0bf138f84e5327d8339bcd4adf071a6832b516445e597552c82bbd881095e3a8","src/unix/linux_like/android/b64/aarch64/mod.rs":"d832328045ed4d65e06ecd072cbe32336a5023664ad85e3961cb1bde8e9d69ba","src/unix/linux_like/android/b64/mod.rs":"2577fa47de16e819569b4d02aeb5f30e8367d85b169fdcc1789f0b404ad6b957","src/unix/linux_like/android/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/android/b64/x86_64/mod.rs":"c6eff774c053f7c8e7a895906ad23e7f835e7349260b40f0ee1689e4d1139ec8","src/unix/linux_like/android/mod.rs":"41e1784a3df650c4ea34fb2b8bfcc3c01362b83cb3f76c8b84f13fa738109c0f","src/unix/linux_like/emscripten/align.rs":"3f40c9cd6ba8b49b4129b53ae43ae8590dfdf21ecc7d20c306d35faf1b470872","src/unix/linux_like/emscripten/mod.rs":"0ad98f13d1aa37f36c8fef212bc9ccd67ba02133ad0c09553119e2d3567da6cb","src/unix/linux_like/emscripten/no_align.rs":"0128e4aa721a9902754828b61b5ec7d8a86619983ed1e0544a85d35b1051fad6","src/unix/linux_like/linux/align.rs":"a32633e7095b777a51628e95285133668a67b19cc34b1b56ecf12822f9dfad3d","src/unix/linux_like/linux/gnu/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/gnu/b32/arm/align.rs":"3fed009dc9af3cc81be7087da9d2d7d1f39845e4497e290259c5cdbae25f039d","src/unix/linux_like/linux/gnu/b32/arm/mod.rs":"0fb279661888fe2087eda3d42350193db1610c97ade944ea5c609c9e485eb55f","src/unix/linux_like/linux/gnu/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/gnu/b32/mips/mod.rs":"0b265237a1e636c1edaaf9e5f4e893fc9d7399ed98c0165ba99de71ad1bd8a5e","src/unix/linux_like/linux/gnu/b32/mod.rs":"05324cc3347a9639a8d5bd10436ef2ba4011abbc41d0a7e37f1575de077b30f9","src/unix/linux_like/linux/gnu/b32/powerpc.rs":"693b6454b486a50a31bfdfd58184cf759dc8603770fb40b311e22af7e4d5e27f","src/unix/linux_like/linux/gnu/b32/x86/align.rs":"e4bafdc4a519a7922a81b37a62bbfd1177a2f620890eef8f1fbc47162e9eb413","src/unix/linux_like/linux/gnu/b32/x86/mod.rs":"7c60f9e59ade6407d1304d9940747200f5a3660b36a8faf38aaad0b00662e65a","src/unix/linux_like/linux/gnu/b64/aarch64/align.rs":"0bf138f84e5327d8339bcd4adf071a6832b516445e597552c82bbd881095e3a8","src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs":"bbd728f51eea0f34243660f7bb7477e8c24bd310645c472f926d703c14848c93","src/unix/linux_like/linux/gnu/b64/mips64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/mips64/mod.rs":"fd5ae37a53a33b4a8c84b6ed80aa60c1318816f69b704451746b5c8419876f24","src/unix/linux_like/linux/gnu/b64/mod.rs":"71d893473ade2c7d6336d735c573430dc53d0f855970504ca5db7b3db203be8d","src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs":"d92801fa66561bd79e1d9eb2e2bb35badb8a075fc378c393d53b3e848ce4dbdc","src/unix/linux_like/linux/gnu/b64/s390x.rs":"4b5a9402fff674ad0822a4d48c32627443466aff640797dc9dc3a15f1694f69a","src/unix/linux_like/linux/gnu/b64/sparc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs":"b17276d3b6e54de21c25cf50e0eacdf1923ddcc655281cb54f9637377fcac0e9","src/unix/linux_like/linux/gnu/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs":"7fd01e36adc657b93c0128e74f521871457f01b185a755fa6b7708878e279e30","src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs":"c1862036556262f076eda2008470b8a351b9c371d70664f54387c46890e8cd18","src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs":"30f88d0fa9e7807ee4cbe89fd274061f810099567d5e68fa829277d7d27ba708","src/unix/linux_like/linux/gnu/mod.rs":"f213d0ff67e26576786b49f281e9449398c393ea8234a9528034b73f39966ca2","src/unix/linux_like/linux/gnu/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/mod.rs":"519b69f2a1b9bb4287a310a37f50900c511c83fb1d19684fa6908f6d9d17fc21","src/unix/linux_like/linux/musl/b32/arm/align.rs":"3e8ac052c1043764776b54c93ba4260e061df998631737a897d9d47d54f7b80c","src/unix/linux_like/linux/musl/b32/arm/mod.rs":"a3f0f397df160be28aab8563e55a35a2ef459414a84c49fad7503cf1e2766af2","src/unix/linux_like/linux/musl/b32/hexagon.rs":"4fb8946619f6b467893a8c2cccb558cd51071b36c8019cfb0584363dbec98664","src/unix/linux_like/linux/musl/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/musl/b32/mips/mod.rs":"f182b124a4beb02650499f0af4bf713df808a0616e1997e263c52d3003053d2b","src/unix/linux_like/linux/musl/b32/mod.rs":"011c23053388aaacf9aaa17c92b2a918d0fa054410bb1640e61cc4e6d00b0b75","src/unix/linux_like/linux/musl/b32/powerpc.rs":"e3bb421df570b8b154d89969c5a045573c369c2b043ebd93b1d1d2211684dca5","src/unix/linux_like/linux/musl/b32/x86/align.rs":"08e77fbd7435d7dec2ff56932433bece3f02e47ce810f89004a275a86d39cbe1","src/unix/linux_like/linux/musl/b32/x86/mod.rs":"8dcf592c67475d2021099e4893d6f44f9c1df09dcbed1904352bd5bbd70d8463","src/unix/linux_like/linux/musl/b64/aarch64/align.rs":"0bf138f84e5327d8339bcd4adf071a6832b516445e597552c82bbd881095e3a8","src/unix/linux_like/linux/musl/b64/aarch64/mod.rs":"27a7c6241f6a6fceebcb1a0a737a9500a5c0c40f109824bfd0e7bdd0e076c67f","src/unix/linux_like/linux/musl/b64/mips64.rs":"8c1c976d4b31122b6495c6e43dc90fb51a3a4e51d020022e8ed9ff87783c4b6f","src/unix/linux_like/linux/musl/b64/mod.rs":"317d1cb47ccc87cb7f8ed677bab799fa6eb1b8fd7fbd57d1896005644e02a010","src/unix/linux_like/linux/musl/b64/powerpc64.rs":"f132e5a1efbc2e39329256b81931d2cd3d12b3a5ceeab7d4813ebb925f35e6f0","src/unix/linux_like/linux/musl/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/musl/b64/x86_64/mod.rs":"e98c94e7807d7a01f54505dfa026121cf5c06387a25de8740adac0f5c308f1f6","src/unix/linux_like/linux/musl/mod.rs":"26c78f9624c211269609a5efb45596ac23a52ad83e11c51bc32ff2b56d0d1af5","src/unix/linux_like/linux/no_align.rs":"4edac17dab24fa61ac33eae1b88d99af6e736838600547d4073cbfb16c5fecfd","src/unix/linux_like/mod.rs":"95dae6e83e09e21725c897593b8aacea0d67841c4842b3c6d4e1dad8264d6613","src/unix/mod.rs":"a9f4dbf822ff2ed420a0ecddee9f531b528bf97fc7896011e63d191d18039ec2","src/unix/newlib/aarch64/mod.rs":"934754e14de392703fd380e0a443fd19a85a405d6c9310d9f855288dd8e76343","src/unix/newlib/align.rs":"28aaf87fafbc6b312622719d472d8cf65f9e5467d15339df5f73e66d8502b28a","src/unix/newlib/arm/mod.rs":"69756a6ba4b75d8cdeae1843bd6d079c42c94e3e61e6e09f169bd20cebec8b0e","src/unix/newlib/mod.rs":"fc2a6cef4ab8f19f16d5ef5d18e206a5514c5ae39091b8d69c7cc1229a3c1f7f","src/unix/newlib/no_align.rs":"7123dcec13604a11b7765c380ff3a4d0da19c39f4b03919de7857723c0cf1502","src/unix/no_align.rs":"c06e95373b9088266e0b14bba0954eef95f93fb2b01d951855e382d22de78e53","src/unix/redox/mod.rs":"4ae29abc41e72723171d434a034374b499dfb6b6fd32e910e7ade88dfecc7601","src/unix/solarish/compat.rs":"cf4ee4cf0d7d45b253b01d1cf823d7f007e3e71aeb5cd8ffe77ef3d722255e68","src/unix/solarish/mod.rs":"8e5369ed1e86c5be92831d290b9eeb77c537a2de728950a5086e77438a4f0f3a","src/unix/uclibc/align.rs":"a8540e1cce5913a45bc8d7422b79e86c0b12740e8a679478e0e4d863a31f8cc1","src/unix/uclibc/arm/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/uclibc/arm/mod.rs":"5ef8de00d77ff8e28b4af7e0378478b934a3480bf7bf0502d1f3a1b63cbc29ad","src/unix/uclibc/arm/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/uclibc/mips/mips32/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/uclibc/mips/mips32/mod.rs":"a045ebc6619f540adf670b88a987abd2d6e42e440a552e8cfe9f8c77f397e873","src/unix/uclibc/mips/mips32/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/uclibc/mips/mips64/align.rs":"a7bdcb18a37a2d91e64d5fad83ea3edc78f5412adb28f77ab077dbb26dd08b2d","src/unix/uclibc/mips/mips64/mod.rs":"e3085ba56cfbc528d7c3c55065880603238c333b6047ef51c58177508a487fcd","src/unix/uclibc/mips/mips64/no_align.rs":"4a18e3875698c85229599225ac3401a2a40da87e77b2ad4ef47c6fcd5a24ed30","src/unix/uclibc/mips/mod.rs":"1054d0bfeb506b3346b9a4148564beced8a22da0d9c9a612101f6237756795fb","src/unix/uclibc/mod.rs":"84aac722864806c2a0857cfed29cf35dc8b7714ed7d2a19f3b8c10c98d30ddb6","src/unix/uclibc/no_align.rs":"3f28637046524618adaa1012e26cb7ffe94b9396e6b518cccdc69d59f274d709","src/unix/uclibc/x86_64/align.rs":"c44ee7782b74733bee5659dfd7eb32d5901c17c99cb540b1a08291859f6238c6","src/unix/uclibc/x86_64/l4re.rs":"bb31053d6403091e11f95ac2203982f279f8b984a19adf30796878c45fdd8c25","src/unix/uclibc/x86_64/mod.rs":"df78de7e0234192c0559b9820c0034a24d72a0820d361f9aad05a9eac36e80ff","src/unix/uclibc/x86_64/no_align.rs":"b308f7b110caf7405b57186882cfc4804caae49a8287f8ab612ec8548467f2f4","src/unix/uclibc/x86_64/other.rs":"42c3f71e58cabba373f6a55a623f3c31b85049eb64824c09c2b082b3b2d6a0a8","src/vxworks/aarch64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/arm.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/mod.rs":"ac427f6ff0099806a257b94b6f5ff3045ee2f7f7053697c69a281d9116cd28b7","src/vxworks/powerpc.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/powerpc64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/x86.rs":"552f007f38317620b23889cb7c49d1d115841252439060122f52f434fbc6e5ba","src/vxworks/x86_64.rs":"018d92be3ad628a129eff9f2f5dfbc0883d8b8e5f2fa917b900a7f98ed6b514a","src/wasi.rs":"f1995eee58f872de81197983b5683fe83dc396e16344db0fe52b3d63d061a5e4","src/windows/gnu/align.rs":"b2c13ec1b9f3b39a75c452c80c951dff9d0215e31d77e883b4502afb31794647","src/windows/gnu/mod.rs":"dc8e2f8d32280394d2bc386f804ce1c71f751590cfeed7db9220e231acc766e3","src/windows/mod.rs":"4c235f4afe08cdf6a5b30733cfe12e98e31adb4ebc66a00c99c1e8fe9d720c38","src/windows/msvc.rs":"6d373b1079e116623a0805d0ffb48a3e2781d709df9480d9b612379dfe768726"},"package":"74dfca3d9957906e8d1e6a0b641dc9a59848e793f1da2165889fd4f62d10d79c"} \ No newline at end of file +{"files":{"CONTRIBUTING.md":"cc340197d05fd8f069dfda6347b97d3da92c8f260c75ac78fb6970f08dba7638","Cargo.toml":"ed3453ae907b85221c1c628d3bb3edd72719be5874a2373ead3f57564f938d18","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"3d4ffed8a5f477b249d4e9684937b9b01b78994ded690d9712c1dbf13a8a1b31","build.rs":"ab351d7171b14f8032948e843841ebe8518ed95eb1abf0b1e689700c7cef4bf5","rustfmt.toml":"8a654d5787585ca8f2c20580737336fc327f411a07b0dbd4870adf6e9bdf624f","src/cloudabi/aarch64.rs":"b8550bf1fd7344972aa4db29441486f39f31482d0327534981dbb75959c29114","src/cloudabi/arm.rs":"c197e2781c2839808bd6fcef219a29705b27b992d3ef920e9cf6ac96e2022bbf","src/cloudabi/mod.rs":"7b36bc7429863346f11a395dbbc200a38b789066ee9aefeac808ecefda9a1a88","src/cloudabi/x86.rs":"33eb97f272d2201f3838ae74d444583c7de8f67856852ca375293b20bbd05636","src/cloudabi/x86_64.rs":"400d85d4fe39e26cf2e6ece9ee31c75fe9e88c4bcf4d836ca9f765c05c9c5be3","src/fixed_width_ints.rs":"34c60f12ec5eeb90f13ec3b954427532111c2446e69617616a97aefc1086a9f1","src/fuchsia/aarch64.rs":"378776a9e40766154a54c94c2a7b4675b5c302a38e6e42da99e67bfbaee60e56","src/fuchsia/align.rs":"ae1cf8f011a99737eabeb14ffff768e60f13b13363d7646744dbb0f443dab3d6","src/fuchsia/mod.rs":"8ab46872899b06f46b54bfa39cce3bd7e8a43abe871d9ea821dba1c16a3348d7","src/fuchsia/no_align.rs":"303f3f1b255e0088b5715094353cf00476131d8e94e6aebb3f469557771c8b8a","src/fuchsia/x86_64.rs":"93a3632b5cf67d2a6bcb7dc0a558605252d5fe689e0f38d8aa2ec5852255ac87","src/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/hermit/mod.rs":"aeda183662787a44c4bd26645cea76f31bf5f7c63d4d59118118c360705fb9eb","src/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/lib.rs":"1397a0db2d265c5777d4a405b4a92e875bc308449be8daae341c3eeabe82d72e","src/macros.rs":"f75e6eb90c38c35292ee3664f8e0c65723703cf36cb04ebb88ac509006ac872a","src/sgx.rs":"16a95cdefc81c5ee00d8353a60db363c4cc3e0f75abcd5d0144723f2a306ed1b","src/switch.rs":"9da3dd39b3de45a7928789926e8572d00e1e11a39e6f7289a1349aadce90edba","src/unix/align.rs":"2cdc7c826ef7ae61f5171c5ae8c445a743d86f1a7f2d9d7e4ceeec56d6874f65","src/unix/bsd/apple/b32/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b32/mod.rs":"6a4ce300da0d2b0db04b18548286603ffe4b47d679a41cf60f1902895894aa1f","src/unix/bsd/apple/b64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/mod.rs":"76e172191d70e7ea7ca194aaa2d002e50db5724bf24526c3be5028cfd2085897","src/unix/bsd/apple/mod.rs":"665972cfeb4a71da514c86718e3075d15d13d181be45d4ec5de2b45c1ab73f0c","src/unix/bsd/freebsdlike/dragonfly/errno.rs":"ae5e8e6b0f610ec015dfcc2928609037d7ea7b94570c72bcc5bdd588424c6259","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"dbf5e940cae86f38e103134746c5b865342f04fb3009afbc88fb06dbeb41340e","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"e528191e42977fa4c226d8850c47d3e526e951cca46ea9a4a87af40221f79d63","src/unix/bsd/freebsdlike/freebsd/arm.rs":"10fe01bc6269b47da72d1e9f8bdae2fcc7d4f332540e8ce1756e1f58d506bf8c","src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs":"3d96c3bbd507688099ace8650ea2934cd7d85650d2e3a0981c6f916597edd09d","src/unix/bsd/freebsdlike/freebsd/freebsd11/x86_64.rs":"9808d152c1196aa647f1b0f0cf84dac8c930da7d7f897a44975545e3d9d17681","src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs":"ceb4d5bd386f13bbf11499e12b5d4c377bd78ecca06fd65b0d08a6b25fba5ca4","src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/mod.rs":"82f01098b820ef0f0450ddadfd2c3009182a4c2427df0150900fad0f2e96429b","src/unix/bsd/freebsdlike/freebsd/powerpc64.rs":"125457305b14309cbad4c46fd2fbd54e2f96d37adfec6c89ae9ed8cedfa015bc","src/unix/bsd/freebsdlike/freebsd/x86.rs":"4e0813f01a017dc148262d7c40dfadb964eb7eb6138dc2b0b83d0b51dbe4d467","src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs":"fcf38f59ac1e8f90d5a26c6a434b6874972955404cb8cc33c17b1a583e3b3014","src/unix/bsd/freebsdlike/mod.rs":"2e0f5a0f768748a48caf05552956158c066db64ef59b935439f3a9e51ed1b93c","src/unix/bsd/mod.rs":"d8cf315174e6d97d87b44253fc4e4ef2570a495df8eec71f7571359c756ad039","src/unix/bsd/netbsdlike/mod.rs":"100b5fac3769b32be3cc7ea686cfd2a85fb2a55f154781a7ce44d65b163e0959","src/unix/bsd/netbsdlike/netbsd/aarch64.rs":"b38fc046f9a40fea28bd26328b96629f4d5d63d7524936bd6af1865d401a8716","src/unix/bsd/netbsdlike/netbsd/arm.rs":"58cdbb70b0d6f536551f0f3bb3725d2d75c4690db12c26c034e7d6ec4a924452","src/unix/bsd/netbsdlike/netbsd/mod.rs":"a50f20e60eb24e13c10425876771d3d6537c755fca558980e4ad45eab70d23f9","src/unix/bsd/netbsdlike/netbsd/powerpc.rs":"ee7ff5d89d0ed22f531237b5059aa669df93a3b5c489fa641465ace8d405bf41","src/unix/bsd/netbsdlike/netbsd/sparc64.rs":"9489f4b3e4566f43bb12dfb92238960613dac7f6a45cc13068a8d152b902d7d9","src/unix/bsd/netbsdlike/netbsd/x86.rs":"20692320e36bfe028d1a34d16fe12ca77aa909cb02bda167376f98f1a09aefe7","src/unix/bsd/netbsdlike/netbsd/x86_64.rs":"135509edeaf3fb3f102d89d51ff1a8f82323497336a8dc7e1f0f23b5c2434b73","src/unix/bsd/netbsdlike/openbsd/aarch64.rs":"1dd5449dd1fd3d51e30ffdeeaece91d0aaf05c710e0ac699fecc5461cfa2c28e","src/unix/bsd/netbsdlike/openbsd/mod.rs":"9b90e73d4f6139436dd93e76ce584c48698c97d892ea7ff57b8b3aad354609d3","src/unix/bsd/netbsdlike/openbsd/sparc64.rs":"d04fd287afbaa2c5df9d48c94e8374a532a3ba491b424ddf018270c7312f4085","src/unix/bsd/netbsdlike/openbsd/x86.rs":"6f7f5c4fde2a2259eb547890cbd86570cea04ef85347d7569e94e679448bec87","src/unix/bsd/netbsdlike/openbsd/x86_64.rs":"e59b7fd65f68f8e857eec39e0c03bac1d3af6ddc26c9ba58494336b83659bb9b","src/unix/haiku/b32.rs":"69ae47fc52c6880e85416b4744500d5655c9ec6131cb737f3b649fceaadce15a","src/unix/haiku/b64.rs":"73e64db09275a8da8d50a13cce2cfa2b136036ddf3a930d2939f337fc995900b","src/unix/haiku/mod.rs":"acd18f665908abcddc7e0a217708238d602f3ca827a3a46cd3bd8c7cd8a8d8b5","src/unix/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/unix/hermit/mod.rs":"878e02b4b3ceafdfce3746efadb621ec1baacfe93e385556c6e505bae5c3eaaf","src/unix/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/unix/linux_like/android/b32/arm.rs":"3625a32c7e58cfe683a53486fbe3d42d4e28f00bea31e19cb46ed2bb0b6a140b","src/unix/linux_like/android/b32/mod.rs":"c997e59bc7a5abe0f37dd87fcc206651dcb2c9837c3f4c2437f9d7944a30717c","src/unix/linux_like/android/b32/x86/align.rs":"812914e4241df82e32b12375ca3374615dc3a4bdd4cf31f0423c5815320c0dab","src/unix/linux_like/android/b32/x86/mod.rs":"edc810399ce9db38c1042c653f05d7f3571f711fa2c16917e8b543df01f065a5","src/unix/linux_like/android/b64/aarch64/align.rs":"0bf138f84e5327d8339bcd4adf071a6832b516445e597552c82bbd881095e3a8","src/unix/linux_like/android/b64/aarch64/mod.rs":"d832328045ed4d65e06ecd072cbe32336a5023664ad85e3961cb1bde8e9d69ba","src/unix/linux_like/android/b64/mod.rs":"2577fa47de16e819569b4d02aeb5f30e8367d85b169fdcc1789f0b404ad6b957","src/unix/linux_like/android/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/android/b64/x86_64/mod.rs":"c6eff774c053f7c8e7a895906ad23e7f835e7349260b40f0ee1689e4d1139ec8","src/unix/linux_like/android/mod.rs":"36866cd3766d899e7557b80f6049af632f7fe7cdcbd62d9edf267b0234acd584","src/unix/linux_like/emscripten/align.rs":"3f40c9cd6ba8b49b4129b53ae43ae8590dfdf21ecc7d20c306d35faf1b470872","src/unix/linux_like/emscripten/mod.rs":"62037212af196240b6469d5cd41ddc81b18d379e346e78e77d6e467f4a4ca47e","src/unix/linux_like/emscripten/no_align.rs":"0128e4aa721a9902754828b61b5ec7d8a86619983ed1e0544a85d35b1051fad6","src/unix/linux_like/linux/align.rs":"15957efd9b772280eb28447849f3aad38fff0c5d65a02566a7ebfba2e7107437","src/unix/linux_like/linux/gnu/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/gnu/b32/arm/align.rs":"3fed009dc9af3cc81be7087da9d2d7d1f39845e4497e290259c5cdbae25f039d","src/unix/linux_like/linux/gnu/b32/arm/mod.rs":"48bea857c59cd3f45c78fb737e048c37174d58d06d20b21c91928f373510ba19","src/unix/linux_like/linux/gnu/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/gnu/b32/mips/mod.rs":"e2d2e51fea73210d9705b7eaa37de8baa7152b71ae3a10a316c277345c529b5c","src/unix/linux_like/linux/gnu/b32/mod.rs":"c65adabb73b2b145a9311e0c2abd4075bf1b763b7bea5b26fbd938199e462f37","src/unix/linux_like/linux/gnu/b32/powerpc.rs":"ba9f549679f66ba15e007a5ded4fe9d10d2e9283a5ce95e6bdfb110089bf15f6","src/unix/linux_like/linux/gnu/b32/sparc/align.rs":"21adbed27df73e2d1ed934aaf733a643003d7baf2bde9c48ea440895bcca6d41","src/unix/linux_like/linux/gnu/b32/sparc/mod.rs":"690357fa2a9a9bf895c59d44d73842e7ee2e5de4decb803b61ec1c9491f32fc0","src/unix/linux_like/linux/gnu/b32/x86/align.rs":"e4bafdc4a519a7922a81b37a62bbfd1177a2f620890eef8f1fbc47162e9eb413","src/unix/linux_like/linux/gnu/b32/x86/mod.rs":"403dc6de6fb22d1eefdbe5e3e4977fd972c15335c3d9d5a394f17c5c1b35a205","src/unix/linux_like/linux/gnu/b64/aarch64/align.rs":"0bf138f84e5327d8339bcd4adf071a6832b516445e597552c82bbd881095e3a8","src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs":"72779fa53260d2e72d01a8cf387da0948cd93072b8b31937d51d3b6c25a44f03","src/unix/linux_like/linux/gnu/b64/mips64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/mips64/mod.rs":"44261e37fd6b3ff5cb091a5c973faa75b157bac91a9eac9d9cb78bf34f6c2a2f","src/unix/linux_like/linux/gnu/b64/mod.rs":"b90d87f76bff37707a1725551fe45d70d0c106e01b1dbbcd5f60460e0a19b4c3","src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs":"fc4d6613805fdedfff9455d736819a146f5403354a26c902b8c82003b2452629","src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs":"4a5dada65294246696b8114accb38d003e66b1b1c165a49abb41073bab504d82","src/unix/linux_like/linux/gnu/b64/s390x.rs":"f796526968527985a0bbb89eb4f7347a193eb515932504aa32712ca2f07fa4a1","src/unix/linux_like/linux/gnu/b64/sparc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs":"239dd7dfa45c078adc0d188dca8e54a9cef1814f1c331bed4eacb87fd7578615","src/unix/linux_like/linux/gnu/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs":"33d9c3c191591d50df619c1bd8913ba06559cf924023d626fdc71c4ba893c299","src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs":"c1862036556262f076eda2008470b8a351b9c371d70664f54387c46890e8cd18","src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs":"30f88d0fa9e7807ee4cbe89fd274061f810099567d5e68fa829277d7d27ba708","src/unix/linux_like/linux/gnu/mod.rs":"220fcb634cf7653344e4202d131bd86477c5d357b30b28ae85f5663e7ab32896","src/unix/linux_like/linux/gnu/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/mod.rs":"e3b0b9d48b0290283a9f45bffbcfdfc4221c6541eee7893d84dc429b60c41b36","src/unix/linux_like/linux/musl/b32/arm/align.rs":"3e8ac052c1043764776b54c93ba4260e061df998631737a897d9d47d54f7b80c","src/unix/linux_like/linux/musl/b32/arm/mod.rs":"2a57708c5c2976896697ea497be32e0d03573fe44e940df8ddcd4cb06350212c","src/unix/linux_like/linux/musl/b32/hexagon.rs":"e945250ac42713836cae8e4820fc395d374535fce332dbd3ef68109c392290a0","src/unix/linux_like/linux/musl/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/musl/b32/mips/mod.rs":"eb65de7aeefed797129c9521785eaa99cdac0644efd826fc6efbab5afc760bf2","src/unix/linux_like/linux/musl/b32/mod.rs":"011c23053388aaacf9aaa17c92b2a918d0fa054410bb1640e61cc4e6d00b0b75","src/unix/linux_like/linux/musl/b32/powerpc.rs":"e3bb421df570b8b154d89969c5a045573c369c2b043ebd93b1d1d2211684dca5","src/unix/linux_like/linux/musl/b32/x86/align.rs":"08e77fbd7435d7dec2ff56932433bece3f02e47ce810f89004a275a86d39cbe1","src/unix/linux_like/linux/musl/b32/x86/mod.rs":"4698f7c107451e7db247e75ade30095b634cb0bfec9605e273975e75c1907420","src/unix/linux_like/linux/musl/b64/aarch64/align.rs":"0bf138f84e5327d8339bcd4adf071a6832b516445e597552c82bbd881095e3a8","src/unix/linux_like/linux/musl/b64/aarch64/mod.rs":"81c4be3f230a60263b57e1d1766420d620e50d8cca04d5a75f48a2a5fe30622e","src/unix/linux_like/linux/musl/b64/mips64.rs":"e8206d97833a50b980aa36a42b02e6197d903a1db4f4314a53b7289308c28bdd","src/unix/linux_like/linux/musl/b64/mod.rs":"317d1cb47ccc87cb7f8ed677bab799fa6eb1b8fd7fbd57d1896005644e02a010","src/unix/linux_like/linux/musl/b64/powerpc64.rs":"9b3faba7fa4f3a660e744ec7bdb71a759ac7d4d78a51b3374d004d5494f8332a","src/unix/linux_like/linux/musl/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/musl/b64/x86_64/mod.rs":"f317c46a2fe4e91e0aaabcaad9bd7535e9d286f0d41caa77bc1d706e37e6a762","src/unix/linux_like/linux/musl/mod.rs":"786c8b5bd7eaabc072351bf83063a4449c7a6bde563962bde800d3eb5c4f6f0f","src/unix/linux_like/linux/no_align.rs":"b94d6612cb8cb1eea947afc825cf8acaddc7f14835a15d2a6e691765de975fcd","src/unix/linux_like/mod.rs":"2dec8d58e9f7afc9b1f81515b05b6799def02e677cdbc08bea283c83e6cbddc7","src/unix/mod.rs":"a9f4dbf822ff2ed420a0ecddee9f531b528bf97fc7896011e63d191d18039ec2","src/unix/newlib/aarch64/mod.rs":"934754e14de392703fd380e0a443fd19a85a405d6c9310d9f855288dd8e76343","src/unix/newlib/align.rs":"28aaf87fafbc6b312622719d472d8cf65f9e5467d15339df5f73e66d8502b28a","src/unix/newlib/arm/mod.rs":"69756a6ba4b75d8cdeae1843bd6d079c42c94e3e61e6e09f169bd20cebec8b0e","src/unix/newlib/mod.rs":"fc2a6cef4ab8f19f16d5ef5d18e206a5514c5ae39091b8d69c7cc1229a3c1f7f","src/unix/newlib/no_align.rs":"7123dcec13604a11b7765c380ff3a4d0da19c39f4b03919de7857723c0cf1502","src/unix/no_align.rs":"c06e95373b9088266e0b14bba0954eef95f93fb2b01d951855e382d22de78e53","src/unix/redox/mod.rs":"4ae29abc41e72723171d434a034374b499dfb6b6fd32e910e7ade88dfecc7601","src/unix/solarish/compat.rs":"cf4ee4cf0d7d45b253b01d1cf823d7f007e3e71aeb5cd8ffe77ef3d722255e68","src/unix/solarish/mod.rs":"cd266cee38f25fe9ed896ba88ddd3530eca352c4d260671fb63d315890bc49e6","src/unix/uclibc/align.rs":"a8540e1cce5913a45bc8d7422b79e86c0b12740e8a679478e0e4d863a31f8cc1","src/unix/uclibc/arm/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/uclibc/arm/mod.rs":"d67dd46bc6f417169fc6a23832bde7ccdafc5d1bcb08b10debdd82edaf75d529","src/unix/uclibc/arm/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/uclibc/mips/mips32/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/uclibc/mips/mips32/mod.rs":"a045ebc6619f540adf670b88a987abd2d6e42e440a552e8cfe9f8c77f397e873","src/unix/uclibc/mips/mips32/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/uclibc/mips/mips64/align.rs":"a7bdcb18a37a2d91e64d5fad83ea3edc78f5412adb28f77ab077dbb26dd08b2d","src/unix/uclibc/mips/mips64/mod.rs":"e3085ba56cfbc528d7c3c55065880603238c333b6047ef51c58177508a487fcd","src/unix/uclibc/mips/mips64/no_align.rs":"4a18e3875698c85229599225ac3401a2a40da87e77b2ad4ef47c6fcd5a24ed30","src/unix/uclibc/mips/mod.rs":"1054d0bfeb506b3346b9a4148564beced8a22da0d9c9a612101f6237756795fb","src/unix/uclibc/mod.rs":"4c20de4d16a0a3efd67a9fd742f5146b77cfb7c24a18fac8728085ad5f52618e","src/unix/uclibc/no_align.rs":"3f28637046524618adaa1012e26cb7ffe94b9396e6b518cccdc69d59f274d709","src/unix/uclibc/x86_64/align.rs":"c44ee7782b74733bee5659dfd7eb32d5901c17c99cb540b1a08291859f6238c6","src/unix/uclibc/x86_64/l4re.rs":"bb31053d6403091e11f95ac2203982f279f8b984a19adf30796878c45fdd8c25","src/unix/uclibc/x86_64/mod.rs":"df78de7e0234192c0559b9820c0034a24d72a0820d361f9aad05a9eac36e80ff","src/unix/uclibc/x86_64/no_align.rs":"b308f7b110caf7405b57186882cfc4804caae49a8287f8ab612ec8548467f2f4","src/unix/uclibc/x86_64/other.rs":"42c3f71e58cabba373f6a55a623f3c31b85049eb64824c09c2b082b3b2d6a0a8","src/vxworks/aarch64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/arm.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/mod.rs":"b62f34937aa6943a7348ec69cb338fa04cddba200f108f2a5a61e4b0a6fae252","src/vxworks/powerpc.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/powerpc64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/x86.rs":"552f007f38317620b23889cb7c49d1d115841252439060122f52f434fbc6e5ba","src/vxworks/x86_64.rs":"018d92be3ad628a129eff9f2f5dfbc0883d8b8e5f2fa917b900a7f98ed6b514a","src/wasi.rs":"f1995eee58f872de81197983b5683fe83dc396e16344db0fe52b3d63d061a5e4","src/windows/gnu/align.rs":"b2c13ec1b9f3b39a75c452c80c951dff9d0215e31d77e883b4502afb31794647","src/windows/gnu/mod.rs":"dc8e2f8d32280394d2bc386f804ce1c71f751590cfeed7db9220e231acc766e3","src/windows/mod.rs":"591ab70bf20a8871b33f27c1975acc7304cb11018d84355002dc6463c5a91cbf","src/windows/msvc.rs":"2c2bfce66027d88021e7289139ebf5b0db258a7b6443f18872c84dbd4ef57131","tests/const_fn.rs":"cb75a1f0864f926aebe79118fc34d51a0d1ade2c20a394e7774c7e545f21f1f4"},"package":"d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"} \ No newline at end of file diff --git a/vendor/libc/Cargo.toml b/vendor/libc/Cargo.toml index e2d7077dc7..41c07ff49c 100644 --- a/vendor/libc/Cargo.toml +++ b/vendor/libc/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "libc" -version = "0.2.64" +version = "0.2.66" authors = ["The Rust Project Developers"] build = "build.rs" exclude = ["/ci/*", "/azure-pipelines.yml"] @@ -30,6 +30,7 @@ optional = true [features] align = [] +const-extern-fn = [] default = ["std"] extra_traits = [] rustc-dep-of-std = ["align", "rustc-std-workspace-core"] diff --git a/vendor/libc/README.md b/vendor/libc/README.md index 4b860238bc..8a36881ec7 100644 --- a/vendor/libc/README.md +++ b/vendor/libc/README.md @@ -1,4 +1,4 @@ -[![Azure Status]][Azure] [![Cirrus-CI Status]][Cirrus-CI] [![Latest Version]][crates.io] [![Documentation]][docs.rs] ![License] +[![Azure Status]][Azure] [![Cirrus CI Status]][Cirrus CI] [![Latest Version]][crates.io] [![Documentation]][docs.rs] ![License] libc - Raw FFI bindings to platforms' system libraries ==== @@ -35,6 +35,9 @@ libc = "0.2" * `extra_traits`: all `struct`s implemented in `libc` are `Copy` and `Clone`. This feature derives `Debug`, `Eq`, `Hash`, and `PartialEq`. +* `const-extern-fn`: Changes some `extern fn`s into `const extern fn`s. + This features requires a nightly rustc + * **deprecated**: `use_std` is deprecated, and is equivalent to `std`. ## Rust version support @@ -47,9 +50,9 @@ newer Rust features are only available on newer Rust toolchains: | `union` | 1.19.0 | | `const mem::size_of` | 1.24.0 | | `repr(align)` | 1.25.0 | -| `extra_traits` | 1.25.0 | +| `extra_traits` | 1.25.0 | | `core::ffi::c_void` | 1.30.0 | -| `repr(packed(N))` | 1.33.0 | +| `repr(packed(N))` | 1.33.0 | ## Platform support @@ -58,7 +61,7 @@ newer Rust features are only available on newer Rust toolchains: See [`ci/build.sh`](https://github.com/rust-lang/libc/blob/master/ci/build.sh) for the platforms on which `libc` is guaranteed to build for each Rust -toolchain. The test-matrix at [Travis-CI], [Appveyor], and [Cirrus-CI] show the +toolchain. The test-matrix at [Azure] and [Cirrus CI] show the platforms in which `libc` tests are run. <div class="platform_docs"></div> @@ -67,10 +70,10 @@ platforms in which `libc` tests are run. This project is licensed under either of -* [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) +* [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) ([LICENSE-APACHE](LICENSE-APACHE)) -* [MIT License](http://opensource.org/licenses/MIT) +* [MIT License](https://opensource.org/licenses/MIT) ([LICENSE-MIT](LICENSE-MIT)) at your option. @@ -85,7 +88,7 @@ instructions] for more information. Contributions in any form (issues, pull requests, etc.) to this project must adhere to Rust's [Code of Conduct]. -[Code of Conduct]: https://www.rust-lang.org/en-US/conduct.html +[Code of Conduct]: https://www.rust-lang.org/policies/code-of-conduct Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in `libc` by you, as defined in the Apache-2.0 license, shall be @@ -93,8 +96,8 @@ dual licensed as above, without any additional terms or conditions. [Azure Status]: https://dev.azure.com/rust-lang2/libc/_apis/build/status/rust-lang.libc?branchName=master [Azure]: https://dev.azure.com/rust-lang2/libc/_build/latest?definitionId=1&branchName=master -[Cirrus-CI]: https://cirrus-ci.com/github/rust-lang/libc -[Cirrus-CI Status]: https://api.cirrus-ci.com/github/rust-lang/libc.svg +[Cirrus CI]: https://cirrus-ci.com/github/rust-lang/libc +[Cirrus CI Status]: https://api.cirrus-ci.com/github/rust-lang/libc.svg [crates.io]: https://crates.io/crates/libc [Latest Version]: https://img.shields.io/crates/v/libc.svg [Documentation]: https://docs.rs/libc/badge.svg diff --git a/vendor/libc/build.rs b/vendor/libc/build.rs index d5bcb5253a..f447c0ef9c 100644 --- a/vendor/libc/build.rs +++ b/vendor/libc/build.rs @@ -3,10 +3,12 @@ use std::process::Command; use std::str; fn main() { - let rustc_minor_ver = - rustc_minor_version().expect("Failed to get rustc version"); + let (rustc_minor_ver, is_nightly) = + rustc_minor_nightly().expect("Failed to get rustc version"); let rustc_dep_of_std = env::var("CARGO_FEATURE_RUSTC_DEP_OF_STD").is_ok(); let align_cargo_feature = env::var("CARGO_FEATURE_ALIGN").is_ok(); + let const_extern_fn_cargo_feature = + env::var("CARGO_FEATURE_CONST_EXTERN_FN").is_ok(); let libc_ci = env::var("LIBC_CI").is_ok(); if env::var("CARGO_FEATURE_USE_STD").is_ok() { @@ -72,9 +74,16 @@ fn main() { if rustc_dep_of_std { println!("cargo:rustc-cfg=libc_thread_local"); } + + if const_extern_fn_cargo_feature { + if !is_nightly || rustc_minor_ver < 40 { + panic!("const-extern-fn requires a nightly compiler >= 1.40") + } + println!("cargo:rustc-cfg=libc_const_extern_fn"); + } } -fn rustc_minor_version() -> Option<u32> { +fn rustc_minor_nightly() -> Option<(u32, bool)> { macro_rules! otry { ($e:expr) => { match $e { @@ -93,7 +102,20 @@ fn rustc_minor_version() -> Option<u32> { return None; } - otry!(pieces.next()).parse().ok() + let minor = pieces.next(); + + // If `rustc` was built from a tarball, its version string + // will have neither a git hash nor a commit date + // (e.g. "rustc 1.39.0"). Treat this case as non-nightly, + // since a nightly build should either come from CI + // or a git checkout + let nightly_raw = otry!(pieces.next()).split('-').nth(1); + let nightly = nightly_raw + .map(|raw| raw.starts_with("dev") || raw.starts_with("nightly")) + .unwrap_or(false); + let minor = otry!(otry!(minor).parse().ok()); + + Some((minor, nightly)) } fn which_freebsd() -> Option<i32> { diff --git a/vendor/libc/src/lib.rs b/vendor/libc/src/lib.rs index 3255303e5a..0b1496af1d 100644 --- a/vendor/libc/src/lib.rs +++ b/vendor/libc/src/lib.rs @@ -34,6 +34,7 @@ #![no_std] #![cfg_attr(feature = "rustc-dep-of-std", no_core)] #![cfg_attr(target_os = "redox", feature(static_nobundle))] +#![cfg_attr(libc_const_extern_fn, feature(const_extern_fn))] #[macro_use] mod macros; diff --git a/vendor/libc/src/macros.rs b/vendor/libc/src/macros.rs index 14a2804664..f14bbf5522 100644 --- a/vendor/libc/src/macros.rs +++ b/vendor/libc/src/macros.rs @@ -121,16 +121,96 @@ macro_rules! s_no_extra_traits { ); } -#[allow(unused_macros)] -macro_rules! f { - ($(pub fn $i:ident($($arg:ident: $argty:ty),*) -> $ret:ty { - $($body:stmt);* - })*) => ($( - #[inline] - pub unsafe extern fn $i($($arg: $argty),*) -> $ret { - $($body);* +// This is a pretty horrible hack to allow us to conditionally mark +// some functions as 'const', without requiring users of this macro +// to care about the "const-extern-fn" feature. +// +// When 'const-extern-fn' is enabled, we emit the captured 'const' keyword +// in the expanded function. +// +// When 'const-extern-fn' is disabled, we always emit a plain 'pub unsafe extern fn'. +// Note that the expression matched by the macro is exactly the same - this allows +// users of this macro to work whether or not 'const-extern-fn' is enabled +// +// Unfortunately, we need to duplicate most of this macro between the 'cfg_if' blocks. +// This is because 'const unsafe extern fn' won't even parse on older compilers, +// so we need to avoid emitting it at all of 'const-extern-fn'. +// +// Specifically, moving the 'cfg_if' into the macro body will *not* work. +// Doing so would cause the '#[cfg(feature = "const-extern-fn")]' to be emiited +// into user code. The 'cfg' gate will not stop Rust from trying to parse the +// 'pub const unsafe extern fn', so users would get a compiler error even when +// the 'const-extern-fn' feature is disabled +// +// Note that users of this macro need to place 'const' in a weird position +// (after the closing ')' for the arguments, but before the return type). +// This was the only way I could satisfy the following two requirements: +// 1. Avoid ambuguity errors from 'macro_rules!' (which happen when writing '$foo:ident fn' +// 2. Allow users of this macro to mix 'pub fn foo' and 'pub const fn bar' within the same +// 'f!' block +cfg_if! { + if #[cfg(libc_const_extern_fn)] { + #[allow(unused_macros)] + macro_rules! f { + ($(pub $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + pub $($constness)* unsafe extern fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) } - )*) + + #[allow(unused_macros)] + macro_rules! const_fn { + ($($({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + $($constness)* fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + + } else { + #[allow(unused_macros)] + macro_rules! f { + ($(pub $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + pub unsafe extern fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + + #[allow(unused_macros)] + macro_rules! const_fn { + ($($({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + } } #[allow(unused_macros)] diff --git a/vendor/libc/src/unix/bsd/apple/mod.rs b/vendor/libc/src/unix/bsd/apple/mod.rs index fa3ba81b0b..aa3cc1ca1c 100644 --- a/vendor/libc/src/unix/bsd/apple/mod.rs +++ b/vendor/libc/src/unix/bsd/apple/mod.rs @@ -3237,6 +3237,11 @@ extern "C" { #[allow(deprecated)] pub fn mach_timebase_info(info: *mut ::mach_timebase_info) -> ::c_int; pub fn pthread_setname_np(name: *const ::c_char) -> ::c_int; + pub fn pthread_getname_np( + thread: ::pthread_t, + name: *mut ::c_char, + len: ::size_t, + ) -> ::c_int; pub fn pthread_get_stackaddr_np(thread: ::pthread_t) -> *mut ::c_void; pub fn pthread_get_stacksize_np(thread: ::pthread_t) -> ::size_t; pub fn pthread_condattr_setpshared( diff --git a/vendor/libc/src/unix/bsd/netbsdlike/mod.rs b/vendor/libc/src/unix/bsd/netbsdlike/mod.rs index 5ce68e2c17..970cb233a1 100644 --- a/vendor/libc/src/unix/bsd/netbsdlike/mod.rs +++ b/vendor/libc/src/unix/bsd/netbsdlike/mod.rs @@ -10,6 +10,7 @@ pub type nl_item = c_long; pub type clockid_t = ::c_int; pub type id_t = u32; pub type sem_t = *mut sem; +pub type key_t = c_long; #[cfg_attr(feature = "extra_traits", derive(Debug))] pub enum timezone {} @@ -63,6 +64,16 @@ s! { pub l_type: ::c_short, pub l_whence: ::c_short, } + + pub struct ipc_perm { + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub mode: ::mode_t, + pub seq: ::c_ushort, + pub key: ::key_t, + } } pub const D_T_FMT: ::nl_item = 0; @@ -199,9 +210,20 @@ pub const MAP_SHARED: ::c_int = 0x0001; pub const MAP_PRIVATE: ::c_int = 0x0002; pub const MAP_FIXED: ::c_int = 0x0010; pub const MAP_ANON: ::c_int = 0x1000; +pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; +pub const IPC_CREAT: ::c_int = 0o001000; +pub const IPC_EXCL: ::c_int = 0o002000; +pub const IPC_NOWAIT: ::c_int = 0o004000; + +pub const IPC_PRIVATE: ::key_t = 0; + +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; + pub const MCL_CURRENT: ::c_int = 0x0001; pub const MCL_FUTURE: ::c_int = 0x0002; @@ -715,6 +737,19 @@ extern "C" { pub fn getdomainname(name: *mut ::c_char, len: ::size_t) -> ::c_int; pub fn setdomainname(name: *const ::c_char, len: ::size_t) -> ::c_int; pub fn uname(buf: *mut ::utsname) -> ::c_int; + + pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shmat( + shmid: ::c_int, + shmaddr: *const ::c_void, + shmflg: ::c_int, + ) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + pub fn shmctl( + shmid: ::c_int, + cmd: ::c_int, + buf: *mut ::shmid_ds, + ) -> ::c_int; } cfg_if! { diff --git a/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs b/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs index 97e2634ad8..422539af60 100644 --- a/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs +++ b/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs @@ -9,6 +9,7 @@ pub type mqd_t = ::c_int; type __pthread_spin_t = __cpu_simple_lock_nv_t; pub type vm_size_t = ::uintptr_t; pub type lwpid_t = ::c_uint; +pub type shmatt_t = ::c_uint; impl siginfo_t { pub unsafe fn si_value(&self) -> ::sigval { @@ -281,9 +282,61 @@ s! { pub msg_hdr: ::msghdr, pub msg_len: ::c_uint, } + + pub struct __exit_status { + pub e_termination: u16, + pub e_exit: u16, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + _shm_internal: *mut ::c_void, + } + + pub struct utmp { + pub ut_line: [::c_char; UT_LINESIZE], + pub ut_name: [::c_char; UT_NAMESIZE], + pub ut_host: [::c_char; UT_HOSTSIZE], + pub ut_time: ::time_t + } + + pub struct lastlog { + pub ll_line: [::c_char; UT_LINESIZE], + pub ll_host: [::c_char; UT_HOSTSIZE], + pub ll_time: ::time_t + } } s_no_extra_traits! { + + pub struct utmpx { + pub ut_name: [::c_char; _UTX_USERSIZE], + pub ut_id: [::c_char; _UTX_IDSIZE], + pub ut_line: [::c_char; _UTX_LINESIZE], + pub ut_host: [::c_char; _UTX_HOSTSIZE], + pub ut_session: u16, + pub ut_type: u16, + pub ut_pid: ::pid_t, + pub ut_exit: __exit_status, + pub ut_ss: sockaddr_storage, + pub ut_tv: ::timeval, + pub ut_pad: [u8; _UTX_PADSIZE], + } + + pub struct lastlogx { + pub ll_tv: ::timeval, + pub ll_line: [::c_char; _UTX_LINESIZE], + pub ll_host: [::c_char; _UTX_HOSTSIZE], + pub ll_ss: sockaddr_storage, + } + pub struct in_pktinfo { pub ipi_addr: ::in_addr, pub ipi_ifindex: ::c_uint, @@ -377,6 +430,101 @@ s_no_extra_traits! { cfg_if! { if #[cfg(feature = "extra_traits")] { + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_type == other.ut_type + && self.ut_pid == other.ut_pid + && self.ut_name == other.ut_name + && self.ut_line == other.ut_line + && self.ut_id == other.ut_id + && self.ut_exit == other.ut_exit + && self.ut_session == other.ut_session + && self.ut_tv == other.ut_tv + && self.ut_ss == other.ut_ss + && self + .ut_pad + .iter() + .zip(other.ut_pad.iter()) + .all(|(a,b)| a == b) + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for utmpx {} + + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_name", &self.ut_name) + .field("ut_id", &self.ut_id) + .field("ut_line", &self.ut_line) + // FIXME .field("ut_host", &self.ut_host) + .field("ut_session", &self.ut_session) + .field("ut_type", &self.ut_type) + .field("ut_pid", &self.ut_pid) + .field("ut_exit", &self.ut_exit) + .field("ut_ss", &self.ut_ss) + .field("ut_tv", &self.ut_tv) + // FIXME .field("ut_pad", &self.ut_pad) + .finish() + } + } + + impl ::hash::Hash for utmpx { + fn hash<H: ::hash::Hasher>(&self, state: &mut H) { + self.ut_name.hash(state); + self.ut_type.hash(state); + self.ut_pid.hash(state); + self.ut_line.hash(state); + self.ut_id.hash(state); + self.ut_host.hash(state); + self.ut_exit.hash(state); + self.ut_session.hash(state); + self.ut_tv.hash(state); + self.ut_ss.hash(state); + self.ut_pad.hash(state); + } + } + + impl PartialEq for lastlogx { + fn eq(&self, other: &lastlogx) -> bool { + self.ll_tv == other.ll_tv + && self.ll_line == other.ll_line + && self.ll_ss == other.ll_ss + && self + .ll_host + .iter() + .zip(other.ll_host.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for lastlogx {} + + impl ::fmt::Debug for lastlogx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("lastlogx") + .field("ll_tv", &self.ll_tv) + .field("ll_line", &self.ll_line) + // FIXME.field("ll_host", &self.ll_host) + .field("ll_ss", &self.ll_ss) + .finish() + } + } + + impl ::hash::Hash for lastlogx { + fn hash<H: ::hash::Hasher>(&self, state: &mut H) { + self.ll_tv.hash(state); + self.ll_line.hash(state); + self.ll_host.hash(state); + self.ll_ss.hash(state); + } + } + impl PartialEq for in_pktinfo { fn eq(&self, other: &in_pktinfo) -> bool { self.ipi_addr == other.ipi_addr @@ -1378,6 +1526,31 @@ pub const ONLRET: ::tcflag_t = 0x40; pub const CDTRCTS: ::tcflag_t = 0x00020000; pub const CHWFLOW: ::tcflag_t = ::MDMBUF | ::CRTSCTS | ::CDTRCTS; +// pub const _PATH_UTMPX: &[::c_char; 14] = b"/var/run/utmpx"; +// pub const _PATH_WTMPX: &[::c_char; 14] = b"/var/log/wtmpx"; +// pub const _PATH_LASTLOGX: &[::c_char; 17] = b"/var/log/lastlogx"; +// pub const _PATH_UTMP_UPDATE: &[::c_char; 24] = b"/usr/libexec/utmp_update"; +pub const UT_NAMESIZE: usize = 8; +pub const UT_LINESIZE: usize = 8; +pub const UT_HOSTSIZE: usize = 16; +pub const _UTX_USERSIZE: usize = 32; +pub const _UTX_LINESIZE: usize = 32; +pub const _UTX_PADSIZE: usize = 40; +pub const _UTX_IDSIZE: usize = 4; +pub const _UTX_HOSTSIZE: usize = 256; +pub const EMPTY: u16 = 0; +pub const RUN_LVL: u16 = 1; +pub const BOOT_TIME: u16 = 2; +pub const OLD_TIME: u16 = 3; +pub const NEW_TIME: u16 = 4; +pub const INIT_PROCESS: u16 = 5; +pub const LOGIN_PROCESS: u16 = 6; +pub const USER_PROCESS: u16 = 7; +pub const DEAD_PROCESS: u16 = 8; +pub const ACCOUNTING: u16 = 9; +pub const SIGNATURE: u16 = 10; +pub const DOWN_TIME: u16 = 11; + pub const SOCK_CLOEXEC: ::c_int = 0x10000000; pub const SOCK_NONBLOCK: ::c_int = 0x20000000; @@ -1667,7 +1840,11 @@ extern "C" { pub fn pthread_setname_np( t: ::pthread_t, name: *const ::c_char, - arg: *mut ::c_void, + arg: *const ::c_void, + ) -> ::c_int; + pub fn pthread_attr_get_np( + thread: ::pthread_t, + attr: *mut ::pthread_attr_t, ) -> ::c_int; pub fn pthread_getattr_np( native: ::pthread_t, @@ -1734,6 +1911,33 @@ extern "C" { buflen: ::size_t, result: *mut *mut ::group, ) -> ::c_int; + + pub fn updwtmpx(file: *const ::c_char, ut: *const utmpx) -> ::c_int; + pub fn getlastlogx( + fname: *const ::c_char, + uid: ::uid_t, + ll: *mut lastlogx, + ) -> *mut lastlogx; + pub fn updlastlogx( + fname: *const ::c_char, + uid: ::uid_t, + ll: *mut lastlogx, + ) -> ::c_int; + pub fn utmpxname(file: *const ::c_char) -> ::c_int; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); + pub fn endutxent(); + + pub fn getutmp(ux: *const utmpx, u: *mut utmp); + pub fn getutmpx(u: *const utmp, ux: *mut utmpx); + + pub fn utpname(file: *const ::c_char) -> ::c_int; + pub fn setutent(); + pub fn endutent(); + pub fn getutent() -> *mut utmp; } cfg_if! { diff --git a/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs b/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs index d82c3273e6..89a3354a31 100644 --- a/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs +++ b/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs @@ -306,6 +306,21 @@ s! { pub ar_pln: u8, pub ar_op: u16, } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::c_int, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::c_short, + pub shm_atime: ::time_t, + __shm_atimensec: c_long, + pub shm_dtime: ::time_t, + __shm_dtimensec: c_long, + pub shm_ctime: ::time_t, + __shm_ctimensec: c_long, + pub shm_internal: *mut ::c_void, + } } impl siginfo_t { @@ -1374,6 +1389,10 @@ f! { extern "C" { pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; + pub fn settimeofday( + tp: *const ::timeval, + tz: *const ::timezone, + ) -> ::c_int; pub fn accept4( s: ::c_int, addr: *mut ::sockaddr, @@ -1427,6 +1446,15 @@ extern "C" { len: ::size_t, prot: ::c_int, ) -> ::c_int; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; pub fn pthread_main_np() -> ::c_int; pub fn pthread_set_name_np(tid: ::pthread_t, name: *const ::c_char); pub fn pthread_stackseg_np( diff --git a/vendor/libc/src/unix/linux_like/android/mod.rs b/vendor/libc/src/unix/linux_like/android/mod.rs index 74c64e5ec7..a40b77e82d 100644 --- a/vendor/libc/src/unix/linux_like/android/mod.rs +++ b/vendor/libc/src/unix/linux_like/android/mod.rs @@ -22,6 +22,8 @@ pub type ino_t = ::c_ulong; pub type __CPU_BITTYPE = ::c_ulong; pub type idtype_t = ::c_int; pub type loff_t = ::c_longlong; +pub type __kernel_loff_t = ::c_longlong; +pub type __kernel_pid_t = ::c_int; s! { pub struct stack_t { @@ -78,6 +80,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::__kernel_loff_t, + pub l_len: ::__kernel_loff_t, + pub l_pid: ::__kernel_pid_t, + } + pub struct cpu_set_t { #[cfg(target_pointer_width = "64")] __bits: [__CPU_BITTYPE; 16], @@ -1099,6 +1109,8 @@ pub const RLIMIT_MSGQUEUE: ::c_int = 12; pub const RLIMIT_NICE: ::c_int = 13; pub const RLIMIT_RTPRIO: ::c_int = 14; +pub const RLIM_INFINITY: ::rlim_t = !0; + pub const TCGETS: ::c_int = 0x5401; pub const TCSETS: ::c_int = 0x5402; pub const TCSETSW: ::c_int = 0x5403; @@ -1307,6 +1319,83 @@ pub const NLMSG_DONE: ::c_int = 0x3; pub const NLMSG_OVERRUN: ::c_int = 0x4; pub const NLMSG_MIN_TYPE: ::c_int = 0x10; +// linux/netfilter/nfnetlink.h +pub const NFNLGRP_NONE: ::c_int = 0; +pub const NFNLGRP_CONNTRACK_NEW: ::c_int = 1; +pub const NFNLGRP_CONNTRACK_UPDATE: ::c_int = 2; +pub const NFNLGRP_CONNTRACK_DESTROY: ::c_int = 3; +pub const NFNLGRP_CONNTRACK_EXP_NEW: ::c_int = 4; +pub const NFNLGRP_CONNTRACK_EXP_UPDATE: ::c_int = 5; +pub const NFNLGRP_CONNTRACK_EXP_DESTROY: ::c_int = 6; +pub const NFNLGRP_NFTABLES: ::c_int = 7; +pub const NFNLGRP_ACCT_QUOTA: ::c_int = 8; + +pub const NFNETLINK_V0: ::c_int = 0; + +pub const NFNL_SUBSYS_NONE: ::c_int = 0; +pub const NFNL_SUBSYS_CTNETLINK: ::c_int = 1; +pub const NFNL_SUBSYS_CTNETLINK_EXP: ::c_int = 2; +pub const NFNL_SUBSYS_QUEUE: ::c_int = 3; +pub const NFNL_SUBSYS_ULOG: ::c_int = 4; +pub const NFNL_SUBSYS_OSF: ::c_int = 5; +pub const NFNL_SUBSYS_IPSET: ::c_int = 6; +pub const NFNL_SUBSYS_ACCT: ::c_int = 7; +pub const NFNL_SUBSYS_CTNETLINK_TIMEOUT: ::c_int = 8; +pub const NFNL_SUBSYS_CTHELPER: ::c_int = 9; +pub const NFNL_SUBSYS_NFTABLES: ::c_int = 10; +pub const NFNL_SUBSYS_NFT_COMPAT: ::c_int = 11; +pub const NFNL_SUBSYS_COUNT: ::c_int = 12; + +pub const NFNL_MSG_BATCH_BEGIN: ::c_int = NLMSG_MIN_TYPE; +pub const NFNL_MSG_BATCH_END: ::c_int = NLMSG_MIN_TYPE + 1; + +// linux/netfilter/nfnetlink_log.h +pub const NFULNL_MSG_PACKET: ::c_int = 0; +pub const NFULNL_MSG_CONFIG: ::c_int = 1; + +pub const NFULA_UNSPEC: ::c_int = 0; +pub const NFULA_PACKET_HDR: ::c_int = 1; +pub const NFULA_MARK: ::c_int = 2; +pub const NFULA_TIMESTAMP: ::c_int = 3; +pub const NFULA_IFINDEX_INDEV: ::c_int = 4; +pub const NFULA_IFINDEX_OUTDEV: ::c_int = 5; +pub const NFULA_IFINDEX_PHYSINDEV: ::c_int = 6; +pub const NFULA_IFINDEX_PHYSOUTDEV: ::c_int = 7; +pub const NFULA_HWADDR: ::c_int = 8; +pub const NFULA_PAYLOAD: ::c_int = 9; +pub const NFULA_PREFIX: ::c_int = 10; +pub const NFULA_UID: ::c_int = 11; +pub const NFULA_SEQ: ::c_int = 12; +pub const NFULA_SEQ_GLOBAL: ::c_int = 13; +pub const NFULA_GID: ::c_int = 14; +pub const NFULA_HWTYPE: ::c_int = 15; +pub const NFULA_HWHEADER: ::c_int = 16; +pub const NFULA_HWLEN: ::c_int = 17; +pub const NFULA_CT: ::c_int = 18; +pub const NFULA_CT_INFO: ::c_int = 19; + +pub const NFULNL_CFG_CMD_NONE: ::c_int = 0; +pub const NFULNL_CFG_CMD_BIND: ::c_int = 1; +pub const NFULNL_CFG_CMD_UNBIND: ::c_int = 2; +pub const NFULNL_CFG_CMD_PF_BIND: ::c_int = 3; +pub const NFULNL_CFG_CMD_PF_UNBIND: ::c_int = 4; + +pub const NFULA_CFG_UNSPEC: ::c_int = 0; +pub const NFULA_CFG_CMD: ::c_int = 1; +pub const NFULA_CFG_MODE: ::c_int = 2; +pub const NFULA_CFG_NLBUFSIZ: ::c_int = 3; +pub const NFULA_CFG_TIMEOUT: ::c_int = 4; +pub const NFULA_CFG_QTHRESH: ::c_int = 5; +pub const NFULA_CFG_FLAGS: ::c_int = 6; + +pub const NFULNL_COPY_NONE: ::c_int = 0x00; +pub const NFULNL_COPY_META: ::c_int = 0x01; +pub const NFULNL_COPY_PACKET: ::c_int = 0x02; + +pub const NFULNL_CFG_F_SEQ: ::c_int = 0x0001; +pub const NFULNL_CFG_F_SEQ_GLOBAL: ::c_int = 0x0002; +pub const NFULNL_CFG_F_CONNTRACK: ::c_int = 0x0004; + pub const GENL_NAMSIZ: ::c_int = 16; pub const GENL_MIN_ID: ::c_int = NLMSG_MIN_TYPE; @@ -1401,11 +1490,11 @@ pub const IP_ORIGDSTADDR: ::c_int = 20; pub const IP_RECVORIGDSTADDR: ::c_int = IP_ORIGDSTADDR; pub const IPV6_ORIGDSTADDR: ::c_int = 74; pub const IPV6_RECVORIGDSTADDR: ::c_int = IPV6_ORIGDSTADDR; -pub const IPV6_FLOWINFO: ::c_int = 11; pub const IPV6_FLOWLABEL_MGR: ::c_int = 32; pub const IPV6_FLOWINFO_SEND: ::c_int = 33; pub const IPV6_FLOWINFO_FLOWLABEL: ::c_int = 0x000fffff; pub const IPV6_FLOWINFO_PRIORITY: ::c_int = 0x0ff00000; + pub const IUTF8: ::tcflag_t = 0x00004000; pub const CMSPAR: ::tcflag_t = 0o10000000000; pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; diff --git a/vendor/libc/src/unix/linux_like/emscripten/mod.rs b/vendor/libc/src/unix/linux_like/emscripten/mod.rs index d062b98f41..3fc47bb5eb 100644 --- a/vendor/libc/src/unix/linux_like/emscripten/mod.rs +++ b/vendor/libc/src/unix/linux_like/emscripten/mod.rs @@ -223,6 +223,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct pthread_attr_t { __size: [u32; 11] } diff --git a/vendor/libc/src/unix/linux_like/linux/align.rs b/vendor/libc/src/unix/linux_like/linux/align.rs index 440a8415fb..6000b416e0 100644 --- a/vendor/libc/src/unix/linux_like/linux/align.rs +++ b/vendor/libc/src/unix/linux_like/linux/align.rs @@ -62,6 +62,7 @@ macro_rules! expand_align { target_arch = "arm", target_arch = "hexagon", target_arch = "powerpc", + target_arch = "sparc", target_arch = "x86_64", target_arch = "x86")), repr(align(4)))] @@ -70,6 +71,7 @@ macro_rules! expand_align { target_arch = "arm", target_arch = "hexagon", target_arch = "powerpc", + target_arch = "sparc", target_arch = "x86_64", target_arch = "x86"))), repr(align(8)))] @@ -83,6 +85,7 @@ macro_rules! expand_align { target_arch = "arm", target_arch = "hexagon", target_arch = "powerpc", + target_arch = "sparc", target_arch = "x86_64", target_arch = "x86")), repr(align(4)))] @@ -91,6 +94,7 @@ macro_rules! expand_align { target_arch = "arm", target_arch = "hexagon", target_arch = "powerpc", + target_arch = "sparc", target_arch = "x86_64", target_arch = "x86"))), repr(align(8)))] diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/mod.rs index f74b41e315..0a5fc8567b 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/mod.rs @@ -33,6 +33,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct ipc_perm { pub __key: ::key_t, pub uid: ::uid_t, diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/mod.rs index 23b0160bff..4a3b600aaf 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/mod.rs @@ -526,6 +526,7 @@ pub const SYS_pwritev2: ::c_long = 4000 + 362; pub const SYS_pkey_mprotect: ::c_long = 4000 + 363; pub const SYS_pkey_alloc: ::c_long = 4000 + 364; pub const SYS_pkey_free: ::c_long = 4000 + 365; +pub const SYS_statx: ::c_long = 4000 + 366; pub const O_DIRECT: ::c_int = 0x8000; pub const O_DIRECTORY: ::c_int = 0x10000; diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs index 6f39c208c3..cc6b6367fe 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs @@ -262,6 +262,9 @@ cfg_if! { } else if #[cfg(target_arch = "powerpc")] { mod powerpc; pub use self::powerpc::*; + } else if #[cfg(target_arch = "sparc")] { + mod sparc; + pub use self::sparc::*; } else { // Unknown target_arch } diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b32/powerpc.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b32/powerpc.rs index 92e52333ca..7644428014 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b32/powerpc.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b32/powerpc.rs @@ -33,6 +33,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct ipc_perm { __key: ::key_t, pub uid: ::uid_t, diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/align.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/align.rs new file mode 100644 index 0000000000..98fda883cd --- /dev/null +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct max_align_t { + priv_: [i64; 3] + } +} diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs new file mode 100644 index 0000000000..f670b3422b --- /dev/null +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs @@ -0,0 +1,978 @@ +//! SPARC-specific definitions for 32-bit linux-like values + +pub type c_char = u8; +pub type wchar_t = i32; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option<extern fn()>, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + f_spare: [::__fsword_t; 5], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + __reserved: ::c_short, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_ushort, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_ushort, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 2], + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + __pad1: ::c_ushort, + pub mode: ::c_ushort, + __pad2: ::c_ushort, + pub __seq: ::c_ushort, + __unused1: ::c_ulonglong, + __unused2: ::c_ulonglong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + __pad1: ::c_uint, + pub shm_atime: ::time_t, + __pad2: ::c_uint, + pub shm_dtime: ::time_t, + __pad3: ::c_uint, + pub shm_ctime: ::time_t, + pub shm_segsz: ::size_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __reserved1: ::c_ulong, + __reserved2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + __pad1: ::c_uint, + pub msg_stime: ::time_t, + __pad2: ::c_uint, + pub msg_rtime: ::time_t, + __pad3: ::c_uint, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ushort, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved1: ::c_ulong, + __glibc_reserved2: ::c_ulong, + } + + pub struct termios2 { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; 19], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } +} + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const RLIM_INFINITY: ::rlim_t = !0; +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const TIOCGSOFTCAR: ::c_ulong = 0x40047464; +pub const TIOCSSOFTCAR: ::c_ulong = 0x80047465; + +pub const RLIMIT_RSS: ::__rlimit_resource_t = 5; +pub const RLIMIT_AS: ::__rlimit_resource_t = 9; +pub const RLIMIT_MEMLOCK: ::__rlimit_resource_t = 8; +pub const RLIMIT_NOFILE: ::__rlimit_resource_t = 6; +pub const RLIMIT_NPROC: ::__rlimit_resource_t = 7; + +pub const O_APPEND: ::c_int = 0x8; +pub const O_CREAT: ::c_int = 0x200; +pub const O_EXCL: ::c_int = 0x800; +pub const O_NOCTTY: ::c_int = 0x8000; +pub const O_NONBLOCK: ::c_int = 0x4000; +pub const O_SYNC: ::c_int = 0x802000; +pub const O_RSYNC: ::c_int = 0x802000; +pub const O_DSYNC: ::c_int = 0x2000; +pub const O_FSYNC: ::c_int = 0x802000; +pub const O_NOATIME: ::c_int = 0x200000; +pub const O_PATH: ::c_int = 0x1000000; +pub const O_TMPFILE: ::c_int = 0x2000000 | O_DIRECTORY; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 0x0200; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const EDEADLK: ::c_int = 78; +pub const ENAMETOOLONG: ::c_int = 63; +pub const ENOLCK: ::c_int = 79; +pub const ENOSYS: ::c_int = 90; +pub const ENOTEMPTY: ::c_int = 66; +pub const ELOOP: ::c_int = 62; +pub const ENOMSG: ::c_int = 75; +pub const EIDRM: ::c_int = 77; +pub const ECHRNG: ::c_int = 94; +pub const EL2NSYNC: ::c_int = 95; +pub const EL3HLT: ::c_int = 96; +pub const EL3RST: ::c_int = 97; +pub const ELNRNG: ::c_int = 98; +pub const EUNATCH: ::c_int = 99; +pub const ENOCSI: ::c_int = 100; +pub const EL2HLT: ::c_int = 101; +pub const EBADE: ::c_int = 102; +pub const EBADR: ::c_int = 103; +pub const EXFULL: ::c_int = 104; +pub const ENOANO: ::c_int = 105; +pub const EBADRQC: ::c_int = 106; +pub const EBADSLT: ::c_int = 107; +pub const EMULTIHOP: ::c_int = 87; +pub const EOVERFLOW: ::c_int = 92; +pub const ENOTUNIQ: ::c_int = 115; +pub const EBADFD: ::c_int = 93; +pub const EBADMSG: ::c_int = 76; +pub const EREMCHG: ::c_int = 89; +pub const ELIBACC: ::c_int = 114; +pub const ELIBBAD: ::c_int = 112; +pub const ELIBSCN: ::c_int = 124; +pub const ELIBMAX: ::c_int = 123; +pub const ELIBEXEC: ::c_int = 110; +pub const EILSEQ: ::c_int = 122; +pub const ERESTART: ::c_int = 116; +pub const ESTRPIPE: ::c_int = 91; +pub const EUSERS: ::c_int = 68; +pub const ENOTSOCK: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 39; +pub const EMSGSIZE: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const EOPNOTSUPP: ::c_int = 45; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENETDOWN: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const EHOSTDOWN: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const EALREADY: ::c_int = 37; +pub const EINPROGRESS: ::c_int = 36; +pub const ESTALE: ::c_int = 70; +pub const EDQUOT: ::c_int = 69; +pub const ENOMEDIUM: ::c_int = 125; +pub const EMEDIUMTYPE: ::c_int = 126; +pub const ECANCELED: ::c_int = 127; +pub const ENOKEY: ::c_int = 128; +pub const EKEYEXPIRED: ::c_int = 129; +pub const EKEYREVOKED: ::c_int = 130; +pub const EKEYREJECTED: ::c_int = 131; +pub const EOWNERDEAD: ::c_int = 132; +pub const ENOTRECOVERABLE: ::c_int = 133; +pub const EHWPOISON: ::c_int = 135; +pub const ERFKILL: ::c_int = 134; + +pub const SOL_SOCKET: ::c_int = 0xffff; + +pub const SO_PASSCRED: ::c_int = 2; +pub const SO_REUSEADDR: ::c_int = 4; +pub const SO_BINDTODEVICE: ::c_int = 0x000d; +pub const SO_TIMESTAMP: ::c_int = 0x001d; +pub const SO_MARK: ::c_int = 0x0022; +pub const SO_RXQ_OVFL: ::c_int = 0x0024; +pub const SO_PEEK_OFF: ::c_int = 0x0026; +pub const SO_BUSY_POLL: ::c_int = 0x0030; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_DONTROUTE: ::c_int = 16; +pub const SO_BROADCAST: ::c_int = 32; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDBUFFORCE: ::c_int = 0x100a; +pub const SO_RCVBUFFORCE: ::c_int = 0x100b; +pub const SO_DOMAIN: ::c_int = 0x1029; +pub const SO_KEEPALIVE: ::c_int = 8; +pub const SO_OOBINLINE: ::c_int = 0x100; +pub const SO_LINGER: ::c_int = 128; +pub const SO_REUSEPORT: ::c_int = 0x200; +pub const SO_ACCEPTCONN: ::c_int = 0x8000; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SA_ONSTACK: ::c_int = 1; +pub const SA_SIGINFO: ::c_int = 0x200; +pub const SA_NOCLDWAIT: ::c_int = 0x100; + +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 20; +pub const SIGBUS: ::c_int = 10; +pub const SIGUSR1: ::c_int = 30; +pub const SIGUSR2: ::c_int = 31; +pub const SIGCONT: ::c_int = 19; +pub const SIGSTOP: ::c_int = 17; +pub const SIGTSTP: ::c_int = 18; +pub const SIGURG: ::c_int = 16; +pub const SIGIO: ::c_int = 23; +pub const SIGSYS: ::c_int = 12; +pub const SIGPOLL: ::c_int = 23; +pub const SIGPWR: ::c_int = 29; +pub const SIG_SETMASK: ::c_int = 4; +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; + +pub const POLLWRNORM: ::c_short = 4; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const O_ASYNC: ::c_int = 0x40; +pub const O_NDELAY: ::c_int = 0x4004; + +pub const PTRACE_DETACH: ::c_uint = 11; + +pub const EFD_NONBLOCK: ::c_int = 0x4000; + +pub const F_GETLK: ::c_int = 7; +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; + +pub const F_RDLCK: ::c_int = 1; +pub const F_WRLCK: ::c_int = 2; +pub const F_UNLCK: ::c_int = 3; + +pub const SFD_NONBLOCK: ::c_int = 0x4000; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const TIOCLINUX: ::c_ulong = 0x541C; +pub const TIOCGSERIAL: ::c_ulong = 0x541E; +pub const TIOCEXCL: ::c_ulong = 0x2000740d; +pub const TIOCNXCL: ::c_ulong = 0x2000740e; +pub const TIOCSCTTY: ::c_ulong = 0x20007484; +pub const TIOCSTI: ::c_ulong = 0x80017472; +pub const TIOCMGET: ::c_ulong = 0x4004746a; +pub const TIOCMBIS: ::c_ulong = 0x8004746c; +pub const TIOCMBIC: ::c_ulong = 0x8004746b; +pub const TIOCMSET: ::c_ulong = 0x8004746d; +pub const TIOCCONS: ::c_ulong = 0x20007424; + +pub const TIOCM_ST: ::c_int = 0x008; +pub const TIOCM_SR: ::c_int = 0x010; +pub const TIOCM_CTS: ::c_int = 0x020; +pub const TIOCM_CAR: ::c_int = 0x040; +pub const TIOCM_RNG: ::c_int = 0x080; +pub const TIOCM_DSR: ::c_int = 0x100; + +pub const SFD_CLOEXEC: ::c_int = 0x400000; + +pub const NCCS: usize = 17; +pub const O_TRUNC: ::c_int = 0x400; + +pub const O_CLOEXEC: ::c_int = 0x400000; + +pub const EBFONT: ::c_int = 109; +pub const ENOSTR: ::c_int = 72; +pub const ENODATA: ::c_int = 111; +pub const ETIME: ::c_int = 73; +pub const ENOSR: ::c_int = 74; +pub const ENONET: ::c_int = 80; +pub const ENOPKG: ::c_int = 113; +pub const EREMOTE: ::c_int = 71; +pub const ENOLINK: ::c_int = 82; +pub const EADV: ::c_int = 83; +pub const ESRMNT: ::c_int = 84; +pub const ECOMM: ::c_int = 85; +pub const EPROTO: ::c_int = 86; +pub const EDOTDOT: ::c_int = 88; + +pub const SA_NODEFER: ::c_int = 0x20; +pub const SA_RESETHAND: ::c_int = 0x4; +pub const SA_RESTART: ::c_int = 0x2; +pub const SA_NOCLDSTOP: ::c_int = 0x00000008; + +pub const EPOLL_CLOEXEC: ::c_int = 0x400000; + +pub const EFD_CLOEXEC: ::c_int = 0x400000; + +pub const O_DIRECTORY: ::c_int = 0o200000; +pub const O_NOFOLLOW: ::c_int = 0o400000; +pub const O_LARGEFILE: ::c_int = 0x40000; +pub const O_DIRECT: ::c_int = 0x100000; + +pub const MAP_LOCKED: ::c_int = 0x0100; +pub const MAP_NORESERVE: ::c_int = 0x00040; + +pub const EDEADLOCK: ::c_int = 108; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; + +pub const SO_PEERCRED: ::c_int = 0x40; +pub const SO_RCVLOWAT: ::c_int = 0x800; +pub const SO_SNDLOWAT: ::c_int = 0x1000; +pub const SO_RCVTIMEO: ::c_int = 0x2000; +pub const SO_SNDTIMEO: ::c_int = 0x4000; + +pub const FIOCLEX: ::c_ulong = 0x20006601; +pub const FIONCLEX: ::c_ulong = 0x20006602; +pub const FIONBIO: ::c_ulong = 0x8004667e; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; + +pub const SIGSTKSZ: ::size_t = 16384; +pub const MINSIGSTKSZ: ::size_t = 4096; +pub const CBAUD: ::tcflag_t = 0x0000100f; +pub const TAB1: ::tcflag_t = 0x800; +pub const TAB2: ::tcflag_t = 0x1000; +pub const TAB3: ::tcflag_t = 0x1800; +pub const CR1: ::tcflag_t = 0x200; +pub const CR2: ::tcflag_t = 0x400; +pub const CR3: ::tcflag_t = 0x600; +pub const FF1: ::tcflag_t = 0x8000; +pub const BS1: ::tcflag_t = 0x2000; +pub const VT1: ::tcflag_t = 0x4000; +pub const VWERASE: usize = 0xe; +pub const VREPRINT: usize = 0xc; +pub const VSUSP: usize = 0xa; +pub const VSTART: usize = 0x8; +pub const VSTOP: usize = 0x9; +pub const VDISCARD: usize = 0xd; +pub const VTIME: usize = 0x5; +pub const IXON: ::tcflag_t = 0x400; +pub const IXOFF: ::tcflag_t = 0x1000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x30; +pub const CS6: ::tcflag_t = 0x10; +pub const CS7: ::tcflag_t = 0x20; +pub const CS8: ::tcflag_t = 0x30; +pub const CSTOPB: ::tcflag_t = 0x40; +pub const CREAD: ::tcflag_t = 0x80; +pub const PARENB: ::tcflag_t = 0x100; +pub const PARODD: ::tcflag_t = 0x200; +pub const HUPCL: ::tcflag_t = 0x400; +pub const CLOCAL: ::tcflag_t = 0x800; +pub const ECHOKE: ::tcflag_t = 0x800; +pub const ECHOE: ::tcflag_t = 0x10; +pub const ECHOK: ::tcflag_t = 0x20; +pub const ECHONL: ::tcflag_t = 0x40; +pub const ECHOPRT: ::tcflag_t = 0x400; +pub const ECHOCTL: ::tcflag_t = 0x200; +pub const ISIG: ::tcflag_t = 0x1; +pub const ICANON: ::tcflag_t = 0x2; +pub const PENDIN: ::tcflag_t = 0x4000; +pub const NOFLSH: ::tcflag_t = 0x80; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0x00001000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const BOTHER: ::speed_t = 0x1000; +pub const B57600: ::speed_t = 0x1001; +pub const B115200: ::speed_t = 0x1002; +pub const B230400: ::speed_t = 0x1003; +pub const B460800: ::speed_t = 0x1004; +pub const B76800: ::speed_t = 0x1005; +pub const B153600: ::speed_t = 0x1006; +pub const B307200: ::speed_t = 0x1007; +pub const B614400: ::speed_t = 0x1008; +pub const B921600: ::speed_t = 0x1009; +pub const B500000: ::speed_t = 0x100a; +pub const B576000: ::speed_t = 0x100b; +pub const B1000000: ::speed_t = 0x100c; +pub const B1152000: ::speed_t = 0x100d; +pub const B1500000: ::speed_t = 0x100e; +pub const B2000000: ::speed_t = 0x100f; + +pub const VEOL: usize = 5; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0x8000; +pub const TOSTOP: ::tcflag_t = 0x100; +pub const FLUSHO: ::tcflag_t = 0x1000; +pub const EXTPROC: ::tcflag_t = 0x10000; +pub const TCGETS: ::c_ulong = 0x40245408; +pub const TCSETS: ::c_ulong = 0x80245409; +pub const TCSETSW: ::c_ulong = 0x8024540a; +pub const TCSETSF: ::c_ulong = 0x8024540b; +pub const TCGETA: ::c_ulong = 0x40125401; +pub const TCSETA: ::c_ulong = 0x80125402; +pub const TCSETAW: ::c_ulong = 0x80125403; +pub const TCSETAF: ::c_ulong = 0x80125404; +pub const TCSBRK: ::c_ulong = 0x20005405; +pub const TCXONC: ::c_ulong = 0x20005406; +pub const TCFLSH: ::c_ulong = 0x20005407; +pub const TIOCINQ: ::c_ulong = 0x4004667f; +pub const TIOCGPGRP: ::c_ulong = 0x40047483; +pub const TIOCSPGRP: ::c_ulong = 0x80047482; +pub const TIOCOUTQ: ::c_ulong = 0x40047473; +pub const TIOCGWINSZ: ::c_ulong = 0x40087468; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const FIONREAD: ::c_ulong = 0x4004667f; + +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_wait4: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execv: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_chown: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_brk: ::c_long = 17; +pub const SYS_perfctr: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_capget: ::c_long = 21; +pub const SYS_capset: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_vmsplice: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_sigaltstack: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_lchown32: ::c_long = 31; +pub const SYS_fchown32: ::c_long = 32; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_chown32: ::c_long = 35; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_stat: ::c_long = 38; +pub const SYS_sendfile: ::c_long = 39; +pub const SYS_lstat: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_getuid32: ::c_long = 44; +pub const SYS_umount2: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_getgid32: ::c_long = 53; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_reboot: ::c_long = 55; +pub const SYS_mmap2: ::c_long = 56; +pub const SYS_symlink: ::c_long = 57; +pub const SYS_readlink: ::c_long = 58; +pub const SYS_execve: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_fstat: ::c_long = 62; +pub const SYS_fstat64: ::c_long = 63; +pub const SYS_getpagesize: ::c_long = 64; +pub const SYS_msync: ::c_long = 65; +pub const SYS_vfork: ::c_long = 66; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_geteuid32: ::c_long = 69; +pub const SYS_getegid32: ::c_long = 70; +pub const SYS_mmap: ::c_long = 71; +pub const SYS_setreuid32: ::c_long = 72; +pub const SYS_munmap: ::c_long = 73; +pub const SYS_mprotect: ::c_long = 74; +pub const SYS_madvise: ::c_long = 75; +pub const SYS_vhangup: ::c_long = 76; +pub const SYS_truncate64: ::c_long = 77; +pub const SYS_mincore: ::c_long = 78; +pub const SYS_getgroups: ::c_long = 79; +pub const SYS_setgroups: ::c_long = 80; +pub const SYS_getpgrp: ::c_long = 81; +pub const SYS_setgroups32: ::c_long = 82; +pub const SYS_setitimer: ::c_long = 83; +pub const SYS_ftruncate64: ::c_long = 84; +pub const SYS_swapon: ::c_long = 85; +pub const SYS_getitimer: ::c_long = 86; +pub const SYS_setuid32: ::c_long = 87; +pub const SYS_sethostname: ::c_long = 88; +pub const SYS_setgid32: ::c_long = 89; +pub const SYS_dup2: ::c_long = 90; +pub const SYS_setfsuid32: ::c_long = 91; +pub const SYS_fcntl: ::c_long = 92; +pub const SYS_select: ::c_long = 93; +pub const SYS_setfsgid32: ::c_long = 94; +pub const SYS_fsync: ::c_long = 95; +pub const SYS_setpriority: ::c_long = 96; +pub const SYS_socket: ::c_long = 97; +pub const SYS_connect: ::c_long = 98; +pub const SYS_accept: ::c_long = 99; +pub const SYS_getpriority: ::c_long = 100; +pub const SYS_rt_sigreturn: ::c_long = 101; +pub const SYS_rt_sigaction: ::c_long = 102; +pub const SYS_rt_sigprocmask: ::c_long = 103; +pub const SYS_rt_sigpending: ::c_long = 104; +pub const SYS_rt_sigtimedwait: ::c_long = 105; +pub const SYS_rt_sigqueueinfo: ::c_long = 106; +pub const SYS_rt_sigsuspend: ::c_long = 107; +pub const SYS_setresuid32: ::c_long = 108; +pub const SYS_getresuid32: ::c_long = 109; +pub const SYS_setresgid32: ::c_long = 110; +pub const SYS_getresgid32: ::c_long = 111; +pub const SYS_setregid32: ::c_long = 112; +pub const SYS_recvmsg: ::c_long = 113; +pub const SYS_sendmsg: ::c_long = 114; +pub const SYS_getgroups32: ::c_long = 115; +pub const SYS_gettimeofday: ::c_long = 116; +pub const SYS_getrusage: ::c_long = 117; +pub const SYS_getsockopt: ::c_long = 118; +pub const SYS_getcwd: ::c_long = 119; +pub const SYS_readv: ::c_long = 120; +pub const SYS_writev: ::c_long = 121; +pub const SYS_settimeofday: ::c_long = 122; +pub const SYS_fchown: ::c_long = 123; +pub const SYS_fchmod: ::c_long = 124; +pub const SYS_recvfrom: ::c_long = 125; +pub const SYS_setreuid: ::c_long = 126; +pub const SYS_setregid: ::c_long = 127; +pub const SYS_rename: ::c_long = 128; +pub const SYS_truncate: ::c_long = 129; +pub const SYS_ftruncate: ::c_long = 130; +pub const SYS_flock: ::c_long = 131; +pub const SYS_lstat64: ::c_long = 132; +pub const SYS_sendto: ::c_long = 133; +pub const SYS_shutdown: ::c_long = 134; +pub const SYS_socketpair: ::c_long = 135; +pub const SYS_mkdir: ::c_long = 136; +pub const SYS_rmdir: ::c_long = 137; +pub const SYS_utimes: ::c_long = 138; +pub const SYS_stat64: ::c_long = 139; +pub const SYS_sendfile64: ::c_long = 140; +pub const SYS_getpeername: ::c_long = 141; +pub const SYS_futex: ::c_long = 142; +pub const SYS_gettid: ::c_long = 143; +pub const SYS_getrlimit: ::c_long = 144; +pub const SYS_setrlimit: ::c_long = 145; +pub const SYS_pivot_root: ::c_long = 146; +pub const SYS_prctl: ::c_long = 147; +pub const SYS_pciconfig_read: ::c_long = 148; +pub const SYS_pciconfig_write: ::c_long = 149; +pub const SYS_getsockname: ::c_long = 150; +pub const SYS_inotify_init: ::c_long = 151; +pub const SYS_inotify_add_watch: ::c_long = 152; +pub const SYS_poll: ::c_long = 153; +pub const SYS_getdents64: ::c_long = 154; +pub const SYS_fcntl64: ::c_long = 155; +pub const SYS_inotify_rm_watch: ::c_long = 156; +pub const SYS_statfs: ::c_long = 157; +pub const SYS_fstatfs: ::c_long = 158; +pub const SYS_umount: ::c_long = 159; +pub const SYS_sched_set_affinity: ::c_long = 160; +pub const SYS_sched_get_affinity: ::c_long = 161; +pub const SYS_getdomainname: ::c_long = 162; +pub const SYS_setdomainname: ::c_long = 163; +pub const SYS_quotactl: ::c_long = 165; +pub const SYS_set_tid_address: ::c_long = 166; +pub const SYS_mount: ::c_long = 167; +pub const SYS_ustat: ::c_long = 168; +pub const SYS_setxattr: ::c_long = 169; +pub const SYS_lsetxattr: ::c_long = 170; +pub const SYS_fsetxattr: ::c_long = 171; +pub const SYS_getxattr: ::c_long = 172; +pub const SYS_lgetxattr: ::c_long = 173; +pub const SYS_getdents: ::c_long = 174; +pub const SYS_setsid: ::c_long = 175; +pub const SYS_fchdir: ::c_long = 176; +pub const SYS_fgetxattr: ::c_long = 177; +pub const SYS_listxattr: ::c_long = 178; +pub const SYS_llistxattr: ::c_long = 179; +pub const SYS_flistxattr: ::c_long = 180; +pub const SYS_removexattr: ::c_long = 181; +pub const SYS_lremovexattr: ::c_long = 182; +pub const SYS_sigpending: ::c_long = 183; +pub const SYS_query_module: ::c_long = 184; +pub const SYS_setpgid: ::c_long = 185; +pub const SYS_fremovexattr: ::c_long = 186; +pub const SYS_tkill: ::c_long = 187; +pub const SYS_exit_group: ::c_long = 188; +pub const SYS_uname: ::c_long = 189; +pub const SYS_init_module: ::c_long = 190; +pub const SYS_personality: ::c_long = 191; +pub const SYS_remap_file_pages: ::c_long = 192; +pub const SYS_epoll_create: ::c_long = 193; +pub const SYS_epoll_ctl: ::c_long = 194; +pub const SYS_epoll_wait: ::c_long = 195; +pub const SYS_ioprio_set: ::c_long = 196; +pub const SYS_getppid: ::c_long = 197; +pub const SYS_sigaction: ::c_long = 198; +pub const SYS_sgetmask: ::c_long = 199; +pub const SYS_ssetmask: ::c_long = 200; +pub const SYS_sigsuspend: ::c_long = 201; +pub const SYS_oldlstat: ::c_long = 202; +pub const SYS_uselib: ::c_long = 203; +pub const SYS_readdir: ::c_long = 204; +pub const SYS_readahead: ::c_long = 205; +pub const SYS_socketcall: ::c_long = 206; +pub const SYS_syslog: ::c_long = 207; +pub const SYS_lookup_dcookie: ::c_long = 208; +pub const SYS_fadvise64: ::c_long = 209; +pub const SYS_fadvise64_64: ::c_long = 210; +pub const SYS_tgkill: ::c_long = 211; +pub const SYS_waitpid: ::c_long = 212; +pub const SYS_swapoff: ::c_long = 213; +pub const SYS_sysinfo: ::c_long = 214; +pub const SYS_ipc: ::c_long = 215; +pub const SYS_sigreturn: ::c_long = 216; +pub const SYS_clone: ::c_long = 217; +pub const SYS_ioprio_get: ::c_long = 218; +pub const SYS_adjtimex: ::c_long = 219; +pub const SYS_sigprocmask: ::c_long = 220; +pub const SYS_create_module: ::c_long = 221; +pub const SYS_delete_module: ::c_long = 222; +pub const SYS_get_kernel_syms: ::c_long = 223; +pub const SYS_getpgid: ::c_long = 224; +pub const SYS_bdflush: ::c_long = 225; +pub const SYS_sysfs: ::c_long = 226; +pub const SYS_afs_syscall: ::c_long = 227; +pub const SYS_setfsuid: ::c_long = 228; +pub const SYS_setfsgid: ::c_long = 229; +pub const SYS__newselect: ::c_long = 230; +pub const SYS_time: ::c_long = 231; +pub const SYS_splice: ::c_long = 232; +pub const SYS_stime: ::c_long = 233; +pub const SYS_statfs64: ::c_long = 234; +pub const SYS_fstatfs64: ::c_long = 235; +pub const SYS__llseek: ::c_long = 236; +pub const SYS_mlock: ::c_long = 237; +pub const SYS_munlock: ::c_long = 238; +pub const SYS_mlockall: ::c_long = 239; +pub const SYS_munlockall: ::c_long = 240; +pub const SYS_sched_setparam: ::c_long = 241; +pub const SYS_sched_getparam: ::c_long = 242; +pub const SYS_sched_setscheduler: ::c_long = 243; +pub const SYS_sched_getscheduler: ::c_long = 244; +pub const SYS_sched_yield: ::c_long = 245; +pub const SYS_sched_get_priority_max: ::c_long = 246; +pub const SYS_sched_get_priority_min: ::c_long = 247; +pub const SYS_sched_rr_get_interval: ::c_long = 248; +pub const SYS_nanosleep: ::c_long = 249; +pub const SYS_mremap: ::c_long = 250; +pub const SYS__sysctl: ::c_long = 251; +pub const SYS_getsid: ::c_long = 252; +pub const SYS_fdatasync: ::c_long = 253; +pub const SYS_nfsservctl: ::c_long = 254; +pub const SYS_sync_file_range: ::c_long = 255; +pub const SYS_clock_settime: ::c_long = 256; +pub const SYS_clock_gettime: ::c_long = 257; +pub const SYS_clock_getres: ::c_long = 258; +pub const SYS_clock_nanosleep: ::c_long = 259; +pub const SYS_sched_getaffinity: ::c_long = 260; +pub const SYS_sched_setaffinity: ::c_long = 261; +pub const SYS_timer_settime: ::c_long = 262; +pub const SYS_timer_gettime: ::c_long = 263; +pub const SYS_timer_getoverrun: ::c_long = 264; +pub const SYS_timer_delete: ::c_long = 265; +pub const SYS_timer_create: ::c_long = 266; +pub const SYS_io_setup: ::c_long = 268; +pub const SYS_io_destroy: ::c_long = 269; +pub const SYS_io_submit: ::c_long = 270; +pub const SYS_io_cancel: ::c_long = 271; +pub const SYS_io_getevents: ::c_long = 272; +pub const SYS_mq_open: ::c_long = 273; +pub const SYS_mq_unlink: ::c_long = 274; +pub const SYS_mq_timedsend: ::c_long = 275; +pub const SYS_mq_timedreceive: ::c_long = 276; +pub const SYS_mq_notify: ::c_long = 277; +pub const SYS_mq_getsetattr: ::c_long = 278; +pub const SYS_waitid: ::c_long = 279; +pub const SYS_tee: ::c_long = 280; +pub const SYS_add_key: ::c_long = 281; +pub const SYS_request_key: ::c_long = 282; +pub const SYS_keyctl: ::c_long = 283; +pub const SYS_openat: ::c_long = 284; +pub const SYS_mkdirat: ::c_long = 285; +pub const SYS_mknodat: ::c_long = 286; +pub const SYS_fchownat: ::c_long = 287; +pub const SYS_futimesat: ::c_long = 288; +pub const SYS_fstatat64: ::c_long = 289; +pub const SYS_unlinkat: ::c_long = 290; +pub const SYS_renameat: ::c_long = 291; +pub const SYS_linkat: ::c_long = 292; +pub const SYS_symlinkat: ::c_long = 293; +pub const SYS_readlinkat: ::c_long = 294; +pub const SYS_fchmodat: ::c_long = 295; +pub const SYS_faccessat: ::c_long = 296; +pub const SYS_pselect6: ::c_long = 297; +pub const SYS_ppoll: ::c_long = 298; +pub const SYS_unshare: ::c_long = 299; +pub const SYS_set_robust_list: ::c_long = 300; +pub const SYS_get_robust_list: ::c_long = 301; +pub const SYS_migrate_pages: ::c_long = 302; +pub const SYS_mbind: ::c_long = 303; +pub const SYS_get_mempolicy: ::c_long = 304; +pub const SYS_set_mempolicy: ::c_long = 305; +pub const SYS_kexec_load: ::c_long = 306; +pub const SYS_move_pages: ::c_long = 307; +pub const SYS_getcpu: ::c_long = 308; +pub const SYS_epoll_pwait: ::c_long = 309; +pub const SYS_utimensat: ::c_long = 310; +pub const SYS_signalfd: ::c_long = 311; +pub const SYS_timerfd_create: ::c_long = 312; +pub const SYS_eventfd: ::c_long = 313; +pub const SYS_fallocate: ::c_long = 314; +pub const SYS_timerfd_settime: ::c_long = 315; +pub const SYS_timerfd_gettime: ::c_long = 316; +pub const SYS_signalfd4: ::c_long = 317; +pub const SYS_eventfd2: ::c_long = 318; +pub const SYS_epoll_create1: ::c_long = 319; +pub const SYS_dup3: ::c_long = 320; +pub const SYS_pipe2: ::c_long = 321; +pub const SYS_inotify_init1: ::c_long = 322; +pub const SYS_accept4: ::c_long = 323; +pub const SYS_preadv: ::c_long = 324; +pub const SYS_pwritev: ::c_long = 325; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 326; +pub const SYS_perf_event_open: ::c_long = 327; +pub const SYS_recvmmsg: ::c_long = 328; +pub const SYS_fanotify_init: ::c_long = 329; +pub const SYS_fanotify_mark: ::c_long = 330; +pub const SYS_prlimit64: ::c_long = 331; +pub const SYS_name_to_handle_at: ::c_long = 332; +pub const SYS_open_by_handle_at: ::c_long = 333; +pub const SYS_clock_adjtime: ::c_long = 334; +pub const SYS_syncfs: ::c_long = 335; +pub const SYS_sendmmsg: ::c_long = 336; +pub const SYS_setns: ::c_long = 337; +pub const SYS_process_vm_readv: ::c_long = 338; +pub const SYS_process_vm_writev: ::c_long = 339; +pub const SYS_kern_features: ::c_long = 340; +pub const SYS_kcmp: ::c_long = 341; +pub const SYS_finit_module: ::c_long = 342; +pub const SYS_sched_setattr: ::c_long = 343; +pub const SYS_sched_getattr: ::c_long = 344; +pub const SYS_renameat2: ::c_long = 345; +pub const SYS_seccomp: ::c_long = 346; +pub const SYS_getrandom: ::c_long = 347; +pub const SYS_memfd_create: ::c_long = 348; +pub const SYS_bpf: ::c_long = 349; +pub const SYS_execveat: ::c_long = 350; +pub const SYS_membarrier: ::c_long = 351; +pub const SYS_userfaultfd: ::c_long = 352; +pub const SYS_bind: ::c_long = 353; +pub const SYS_listen: ::c_long = 354; +pub const SYS_setsockopt: ::c_long = 355; +pub const SYS_mlock2: ::c_long = 356; +pub const SYS_copy_file_range: ::c_long = 357; +pub const SYS_preadv2: ::c_long = 358; +pub const SYS_pwritev2: ::c_long = 359; +pub const SYS_statx: ::c_long = 360; + +#[link(name = "util")] +extern "C" { + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/mod.rs index 05e876067d..f5f7cac4c5 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/mod.rs @@ -34,6 +34,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct _libc_fpreg { pub significand: [u16; 4], pub exponent: u16, diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs index b980a11b19..93f0f2bc1b 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs @@ -45,6 +45,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct stat { pub st_dev: ::dev_t, pub st_ino: ::ino_t, @@ -924,6 +932,7 @@ pub const SYS_pwritev2: ::c_long = 287; pub const SYS_pkey_mprotect: ::c_long = 288; pub const SYS_pkey_alloc: ::c_long = 289; pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; #[link(name = "util")] extern "C" { diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs index 5b3da3cb2d..a59554b844 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs @@ -57,6 +57,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct stat64 { pub st_dev: ::c_ulong, st_pad1: [::c_long; 2], @@ -568,6 +576,7 @@ pub const SYS_pwritev2: ::c_long = 5000 + 322; pub const SYS_pkey_mprotect: ::c_long = 5000 + 323; pub const SYS_pkey_alloc: ::c_long = 5000 + 324; pub const SYS_pkey_free: ::c_long = 5000 + 325; +pub const SYS_statx: ::c_long = 5000 + 326; pub const SFD_CLOEXEC: ::c_int = 0x080000; diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs index c91da0d98d..40ce8441a9 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs @@ -78,6 +78,9 @@ cfg_if! { } else if #[cfg(any(target_arch = "x86_64"))] { mod x86_64; pub use self::x86_64::*; + } else if #[cfg(any(target_arch = "riscv64"))] { + mod riscv64; + pub use self::riscv64::*; } else { // Unknown target_arch } diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs index bd9089543a..22507d72f3 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs @@ -45,6 +45,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct stat { pub st_dev: ::dev_t, pub st_ino: ::ino_t, diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs new file mode 100644 index 0000000000..c45c5b230b --- /dev/null +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs @@ -0,0 +1,861 @@ +//! RISC-V-specific definitions for 64-bit linux-like values + +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type wchar_t = ::c_int; +pub type time_t = ::c_long; + +pub type dev_t = ::c_ulong; +pub type uid_t = ::c_uint; +pub type gid_t = ::c_uint; +pub type ino_t = ::c_ulong; +pub type ino64_t = ::c_ulong; +pub type mode_t = ::c_uint; +pub type nlink_t = ::c_uint; +pub type off_t = ::c_long; +pub type off64_t = ::c_long; +pub type pid_t = ::c_int; +pub type blksize_t = ::c_int; +pub type blkcnt_t = ::c_long; +pub type fsblkcnt_t = ::c_ulong; +pub type fsblkcnt64_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type fsfilcnt64_t = ::c_ulong; +pub type suseconds_t = i64; +pub type __u64 = ::c_ulonglong; + +s! { + pub struct pthread_attr_t { + __size: [::c_ulong; 7], + } + + pub struct timespec { + pub tv_sec: time_t, + pub tv_nsec: ::c_long, + } + + pub struct stat { + pub st_dev: dev_t, + pub st_ino: ino_t, + pub st_mode: mode_t, + pub st_nlink: nlink_t, + pub st_uid: uid_t, + pub st_gid: gid_t, + pub st_rdev: dev_t, + pub __pad1: dev_t, + pub st_size: off_t, + pub st_blksize: blksize_t, + pub __pad2: ::c_int, + pub st_blocks: blkcnt_t, + pub st_atime: time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: time_t, + pub st_ctime_nsec: ::c_long, + pub __unused: [::c_int; 2usize], + } + + pub struct stat64 { + pub st_dev: dev_t, + pub st_ino: ino64_t, + pub st_mode: mode_t, + pub st_nlink: nlink_t, + pub st_uid: uid_t, + pub st_gid: gid_t, + pub st_rdev: dev_t, + pub __pad1: dev_t, + pub st_size: off64_t, + pub st_blksize: blksize_t, + pub __pad2: ::c_int, + pub st_blocks: blkcnt_t, + pub st_atime: time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: time_t, + pub st_ctime_nsec: ::c_long, + pub __unused: [::c_int; 2], + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_blocks: fsblkcnt_t, + pub f_bfree: fsblkcnt_t, + pub f_bavail: fsblkcnt_t, + pub f_files: fsfilcnt_t, + pub f_ffree: fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_frsize: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 4], + } + + pub struct statfs64 { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_blocks: fsblkcnt64_t, + pub f_bfree: fsblkcnt64_t, + pub f_bavail: fsblkcnt64_t, + pub f_files: fsfilcnt64_t, + pub f_ffree: fsfilcnt64_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_frsize: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: fsblkcnt_t, + pub f_bfree: fsblkcnt_t, + pub f_bavail: fsblkcnt_t, + pub f_files: fsfilcnt_t, + pub f_ffree: fsfilcnt_t, + pub f_favail: fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: fsblkcnt64_t, + pub f_bfree: fsblkcnt64_t, + pub f_bavail: fsblkcnt64_t, + pub f_files: fsfilcnt64_t, + pub f_ffree: fsfilcnt64_t, + pub f_favail: fsfilcnt64_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [u64; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t, + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option<unsafe extern "C" fn()>, + } + + pub struct sigset_t { + pub __val: [::c_ulong; 16], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: uid_t, + pub gid: gid_t, + pub cuid: uid_t, + pub cgid: gid_t, + pub mode: ::c_ushort, + pub __pad1: ::c_ushort, + pub __seq: ::c_ushort, + pub __pad2: ::c_ushort, + pub __unused1: ::c_ulong, + pub __unused2: ::c_ulong, + } + + pub struct shmid_ds { + pub shm_perm: ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: time_t, + pub shm_dtime: time_t, + pub shm_ctime: time_t, + pub shm_cpid: pid_t, + pub shm_lpid: pid_t, + pub shm_nattch: ::shmatt_t, + pub __unused5: ::c_ulong, + pub __unused6: ::c_ulong, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } +} + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; +pub const VEOF: usize = 4; +pub const TIOCGSOFTCAR: ::c_ulong = 21529; +pub const TIOCSSOFTCAR: ::c_ulong = 21530; +pub const TIOCGRS485: ::c_int = 21550; +pub const TIOCSRS485: ::c_int = 21551; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 1052672; +pub const O_NOATIME: ::c_int = 262144; +pub const O_PATH: ::c_int = 2097152; +pub const O_TMPFILE: ::c_int = 4259840; +pub const MAP_GROWSDOWN: ::c_int = 256; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; +pub const SOL_SOCKET: ::c_int = 1; +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; +pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; +pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_ATTACH_FILTER: ::c_int = 26; +pub const SO_DETACH_FILTER: ::c_int = 27; +pub const SO_GET_FILTER: ::c_int = 26; +pub const SO_PEERNAME: ::c_int = 28; +pub const SO_TIMESTAMP: ::c_int = 29; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_PEERSEC: ::c_int = 31; +pub const SO_PASSSEC: ::c_int = 34; +pub const SO_TIMESTAMPNS: ::c_int = 35; +pub const SCM_TIMESTAMPNS: ::c_int = 35; +pub const SO_MARK: ::c_int = 36; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_WIFI_STATUS: ::c_int = 41; +pub const SCM_WIFI_STATUS: ::c_int = 41; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_NOFCS: ::c_int = 43; +pub const SO_LOCK_FILTER: ::c_int = 44; +pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; +pub const SO_BUSY_POLL: ::c_int = 46; +pub const SO_MAX_PACING_RATE: ::c_int = 47; +pub const SO_BPF_EXTENSIONS: ::c_int = 48; +pub const SO_INCOMING_CPU: ::c_int = 49; +pub const SO_ATTACH_BPF: ::c_int = 50; +pub const SO_DETACH_BPF: ::c_int = 27; +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SA_ONSTACK: ::c_int = 134217728; +pub const SA_SIGINFO: ::c_int = 4; +pub const SA_NOCLDWAIT: ::c_int = 2; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0; +pub const SIG_UNBLOCK: ::c_int = 1; +pub const POLLWRNORM: ::c_short = 256; +pub const POLLWRBAND: ::c_short = 512; +pub const O_ASYNC: ::c_int = 8192; +pub const O_NDELAY: ::c_int = 2048; +pub const PTRACE_DETACH: ::c_uint = 17; +pub const EFD_NONBLOCK: ::c_int = 2048; +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; +pub const SFD_NONBLOCK: ::c_int = 2048; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; +pub const TIOCLINUX: ::c_ulong = 21532; +pub const TIOCGSERIAL: ::c_ulong = 21534; +pub const TIOCEXCL: ::c_ulong = 21516; +pub const TIOCNXCL: ::c_ulong = 21517; +pub const TIOCSCTTY: ::c_ulong = 21518; +pub const TIOCSTI: ::c_ulong = 21522; +pub const TIOCMGET: ::c_ulong = 21525; +pub const TIOCMBIS: ::c_ulong = 21526; +pub const TIOCMBIC: ::c_ulong = 21527; +pub const TIOCMSET: ::c_ulong = 21528; +pub const TIOCCONS: ::c_ulong = 21533; +pub const TIOCM_ST: ::c_int = 8; +pub const TIOCM_SR: ::c_int = 16; +pub const TIOCM_CTS: ::c_int = 32; +pub const TIOCM_CAR: ::c_int = 64; +pub const TIOCM_RNG: ::c_int = 128; +pub const TIOCM_DSR: ::c_int = 256; +pub const SFD_CLOEXEC: ::c_int = 524288; +pub const NCCS: usize = 32; +pub const O_TRUNC: ::c_int = 512; +pub const O_CLOEXEC: ::c_int = 524288; +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; +pub const SA_NODEFER: ::c_int = 1073741824; +pub const SA_RESETHAND: ::c_int = -2147483648; +pub const SA_RESTART: ::c_int = 268435456; +pub const SA_NOCLDSTOP: ::c_int = 1; +pub const EPOLL_CLOEXEC: ::c_int = 524288; +pub const EFD_CLOEXEC: ::c_int = 524288; +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const O_DIRECT: ::c_int = 16384; +pub const O_DIRECTORY: ::c_int = 65536; +pub const O_NOFOLLOW: ::c_int = 131072; +pub const MAP_HUGETLB: ::c_int = 262144; +pub const MAP_LOCKED: ::c_int = 8192; +pub const MAP_NORESERVE: ::c_int = 16384; +pub const MAP_ANON: ::c_int = 32; +pub const MAP_ANONYMOUS: ::c_int = 32; +pub const MAP_DENYWRITE: ::c_int = 2048; +pub const MAP_EXECUTABLE: ::c_int = 4096; +pub const MAP_POPULATE: ::c_int = 32768; +pub const MAP_NONBLOCK: ::c_int = 65536; +pub const MAP_STACK: ::c_int = 131072; +pub const EDEADLOCK: ::c_int = 35; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const FIOCLEX: ::c_ulong = 21585; +pub const FIONCLEX: ::c_ulong = 21584; +pub const FIONBIO: ::c_ulong = 21537; +pub const MCL_CURRENT: ::c_int = 1; +pub const MCL_FUTURE: ::c_int = 2; +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 4111; +pub const TAB1: ::tcflag_t = 2048; +pub const TAB2: ::tcflag_t = 4096; +pub const TAB3: ::tcflag_t = 6144; +pub const CR1: ::tcflag_t = 512; +pub const CR2: ::tcflag_t = 1024; +pub const CR3: ::tcflag_t = 1536; +pub const FF1: ::tcflag_t = 32768; +pub const BS1: ::tcflag_t = 8192; +pub const VT1: ::tcflag_t = 16384; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 1024; +pub const IXOFF: ::tcflag_t = 4096; +pub const ONLCR: ::tcflag_t = 4; +pub const CSIZE: ::tcflag_t = 48; +pub const CS6: ::tcflag_t = 16; +pub const CS7: ::tcflag_t = 32; +pub const CS8: ::tcflag_t = 48; +pub const CSTOPB: ::tcflag_t = 64; +pub const CREAD: ::tcflag_t = 128; +pub const PARENB: ::tcflag_t = 256; +pub const PARODD: ::tcflag_t = 512; +pub const HUPCL: ::tcflag_t = 1024; +pub const CLOCAL: ::tcflag_t = 2048; +pub const ECHOKE: ::tcflag_t = 2048; +pub const ECHOE: ::tcflag_t = 16; +pub const ECHOK: ::tcflag_t = 32; +pub const ECHONL: ::tcflag_t = 64; +pub const ECHOPRT: ::tcflag_t = 1024; +pub const ECHOCTL: ::tcflag_t = 512; +pub const ISIG: ::tcflag_t = 1; +pub const ICANON: ::tcflag_t = 2; +pub const PENDIN: ::tcflag_t = 16384; +pub const NOFLSH: ::tcflag_t = 128; +pub const CIBAUD: ::tcflag_t = 269418496; +pub const CBAUDEX: ::tcflag_t = 4096; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 2; +pub const NLDLY: ::tcflag_t = 256; +pub const CRDLY: ::tcflag_t = 1536; +pub const TABDLY: ::tcflag_t = 6144; +pub const BSDLY: ::tcflag_t = 8192; +pub const FFDLY: ::tcflag_t = 32768; +pub const VTDLY: ::tcflag_t = 16384; +pub const XTABS: ::tcflag_t = 6144; +pub const B0: ::speed_t = 0; +pub const B50: ::speed_t = 1; +pub const B75: ::speed_t = 2; +pub const B110: ::speed_t = 3; +pub const B134: ::speed_t = 4; +pub const B150: ::speed_t = 5; +pub const B200: ::speed_t = 6; +pub const B300: ::speed_t = 7; +pub const B600: ::speed_t = 8; +pub const B1200: ::speed_t = 9; +pub const B1800: ::speed_t = 10; +pub const B2400: ::speed_t = 11; +pub const B4800: ::speed_t = 12; +pub const B9600: ::speed_t = 13; +pub const B19200: ::speed_t = 14; +pub const B38400: ::speed_t = 15; +pub const EXTA: ::speed_t = 14; +pub const EXTB: ::speed_t = 15; +pub const B57600: ::speed_t = 4097; +pub const B115200: ::speed_t = 4098; +pub const B230400: ::speed_t = 4099; +pub const B460800: ::speed_t = 4100; +pub const B500000: ::speed_t = 4101; +pub const B576000: ::speed_t = 4102; +pub const B921600: ::speed_t = 4103; +pub const B1000000: ::speed_t = 4104; +pub const B1152000: ::speed_t = 4105; +pub const B1500000: ::speed_t = 4106; +pub const B2000000: ::speed_t = 4107; +pub const B2500000: ::speed_t = 4108; +pub const B3000000: ::speed_t = 4109; +pub const B3500000: ::speed_t = 4110; +pub const B4000000: ::speed_t = 4111; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 32768; +pub const TOSTOP: ::tcflag_t = 256; +pub const FLUSHO: ::tcflag_t = 4096; +pub const EXTPROC: ::tcflag_t = 65536; +pub const TCGETS: ::c_ulong = 21505; +pub const TCSETS: ::c_ulong = 21506; +pub const TCSETSW: ::c_ulong = 21507; +pub const TCSETSF: ::c_ulong = 21508; +pub const TCGETA: ::c_ulong = 21509; +pub const TCSETA: ::c_ulong = 21510; +pub const TCSETAW: ::c_ulong = 21511; +pub const TCSETAF: ::c_ulong = 21512; +pub const TCSBRK: ::c_ulong = 21513; +pub const TCXONC: ::c_ulong = 21514; +pub const TCFLSH: ::c_ulong = 21515; +pub const TIOCINQ: ::c_ulong = 21531; +pub const TIOCGPGRP: ::c_ulong = 21519; +pub const TIOCSPGRP: ::c_ulong = 21520; +pub const TIOCOUTQ: ::c_ulong = 21521; +pub const TIOCGWINSZ: ::c_ulong = 21523; +pub const TIOCSWINSZ: ::c_ulong = 21524; +pub const FIONREAD: ::c_ulong = 21531; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_close: ::c_long = 57; +pub const SYS_fstat: ::c_long = 80; +pub const SYS_lseek: ::c_long = 62; +pub const SYS_mmap: ::c_long = 222; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_brk: ::c_long = 214; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_dup: ::c_long = 23; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_sendfile: ::c_long = 71; +pub const SYS_socket: ::c_long = 198; +pub const SYS_connect: ::c_long = 203; +pub const SYS_accept: ::c_long = 202; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_exit: ::c_long = 93; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_kill: ::c_long = 129; +pub const SYS_uname: ::c_long = 160; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semop: ::c_long = 193; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_fcntl: ::c_long = 25; +pub const SYS_flock: ::c_long = 32; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +pub const SYS_truncate: ::c_long = 45; +pub const SYS_ftruncate: ::c_long = 46; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_umask: ::c_long = 166; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_getrlimit: ::c_long = 163; +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_times: ::c_long = 153; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_personality: ::c_long = 92; +pub const SYS_statfs: ::c_long = 43; +pub const SYS_fstatfs: ::c_long = 44; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_setrlimit: ::c_long = 164; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_sync: ::c_long = 81; +pub const SYS_acct: ::c_long = 89; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_mount: ::c_long = 40; +pub const SYS_umount2: ::c_long = 39; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_futex: ::c_long = 98; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_fadvise64: ::c_long = 223; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_openat: ::c_long = 56; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_newfstatat: ::c_long = 79; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_linkat: ::c_long = 37; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_recvmmsg: ::c_long = 243; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_setns: ::c_long = 268; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b64/s390x.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b64/s390x.rs index ac31704160..cf0612a8ff 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b64/s390x.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b64/s390x.rs @@ -44,6 +44,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct siginfo_t { pub si_signo: ::c_int, pub si_errno: ::c_int, @@ -993,6 +1001,7 @@ pub const SYS_chown: ::c_long = 212; pub const SYS_setfsuid: ::c_long = 215; pub const SYS_setfsgid: ::c_long = 216; pub const SYS_newfstatat: ::c_long = 293; +pub const SYS_statx: ::c_long = 379; #[link(name = "util")] extern "C" { diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs index 93b1fa5349..651ada376e 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs @@ -60,6 +60,15 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + __reserved: ::c_short, + } + pub struct stack_t { pub ss_sp: *mut ::c_void, pub ss_flags: ::c_int, diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs index d1a2294380..34e4da8bcb 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs @@ -42,6 +42,14 @@ s! { pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct siginfo_t { pub si_signo: ::c_int, pub si_errno: ::c_int, @@ -261,6 +269,12 @@ s! { pub c_ispeed: ::speed_t, pub c_ospeed: ::speed_t, } + + pub struct ip_mreqn { + pub imr_multiaddr: ::in_addr, + pub imr_address: ::in_addr, + pub imr_ifindex: ::c_int, + } } s_no_extra_traits! { diff --git a/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs b/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs index 6473a041ee..1d3e0ab416 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs @@ -98,11 +98,13 @@ s! { pub c_line: ::cc_t, pub c_cc: [::cc_t; ::NCCS], #[cfg(not(any( + target_arch = "sparc", target_arch = "sparc64", target_arch = "mips", target_arch = "mips64")))] pub c_ispeed: ::speed_t, #[cfg(not(any( + target_arch = "sparc", target_arch = "sparc64", target_arch = "mips", target_arch = "mips64")))] @@ -864,7 +866,10 @@ cfg_if! { target_arch = "s390x" ))] { pub const PTHREAD_STACK_MIN: ::size_t = 16384; - } else if #[cfg(target_arch = "sparc64")] { + } else if #[cfg(any( + target_arch = "sparc", + target_arch = "sparc64" + ))] { pub const PTHREAD_STACK_MIN: ::size_t = 0x6000; } else { pub const PTHREAD_STACK_MIN: ::size_t = 131072; @@ -1023,7 +1028,8 @@ cfg_if! { if #[cfg(any(target_arch = "x86", target_arch = "arm", target_arch = "mips", - target_arch = "powerpc"))] { + target_arch = "powerpc", + target_arch = "sparc"))] { mod b32; pub use self::b32::*; } else if #[cfg(any(target_arch = "x86_64", @@ -1031,7 +1037,8 @@ cfg_if! { target_arch = "powerpc64", target_arch = "mips64", target_arch = "s390x", - target_arch = "sparc64"))] { + target_arch = "sparc64", + target_arch = "riscv64"))] { mod b64; pub use self::b64::*; } else { diff --git a/vendor/libc/src/unix/linux_like/linux/mod.rs b/vendor/libc/src/unix/linux_like/linux/mod.rs index 8e8223cda2..80505ff842 100644 --- a/vendor/libc/src/unix/linux_like/linux/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/mod.rs @@ -1127,6 +1127,45 @@ pub const IFLA_MTU: ::c_ushort = 4; pub const IFLA_LINK: ::c_ushort = 5; pub const IFLA_QDISC: ::c_ushort = 6; pub const IFLA_STATS: ::c_ushort = 7; +pub const IFLA_COST: ::c_ushort = 8; +pub const IFLA_PRIORITY: ::c_ushort = 9; +pub const IFLA_MASTER: ::c_ushort = 10; +pub const IFLA_WIRELESS: ::c_ushort = 11; +pub const IFLA_PROTINFO: ::c_ushort = 12; +pub const IFLA_TXQLEN: ::c_ushort = 13; +pub const IFLA_MAP: ::c_ushort = 14; +pub const IFLA_WEIGHT: ::c_ushort = 15; +pub const IFLA_OPERSTATE: ::c_ushort = 16; +pub const IFLA_LINKMODE: ::c_ushort = 17; +pub const IFLA_LINKINFO: ::c_ushort = 18; +pub const IFLA_NET_NS_PID: ::c_ushort = 19; +pub const IFLA_IFALIAS: ::c_ushort = 20; +pub const IFLA_NUM_VF: ::c_ushort = 21; +pub const IFLA_VFINFO_LIST: ::c_ushort = 22; +pub const IFLA_STATS64: ::c_ushort = 23; +pub const IFLA_VF_PORTS: ::c_ushort = 24; +pub const IFLA_PORT_SELF: ::c_ushort = 25; +pub const IFLA_AF_SPEC: ::c_ushort = 26; +pub const IFLA_GROUP: ::c_ushort = 27; +pub const IFLA_NET_NS_FD: ::c_ushort = 28; +pub const IFLA_EXT_MASK: ::c_ushort = 29; +pub const IFLA_PROMISCUITY: ::c_ushort = 30; +pub const IFLA_NUM_TX_QUEUES: ::c_ushort = 31; +pub const IFLA_NUM_RX_QUEUES: ::c_ushort = 32; +pub const IFLA_CARRIER: ::c_ushort = 33; +pub const IFLA_PHYS_PORT_ID: ::c_ushort = 34; +pub const IFLA_CARRIER_CHANGES: ::c_ushort = 35; +pub const IFLA_PHYS_SWITCH_ID: ::c_ushort = 36; +pub const IFLA_LINK_NETNSID: ::c_ushort = 37; +pub const IFLA_PHYS_PORT_NAME: ::c_ushort = 38; +pub const IFLA_PROTO_DOWN: ::c_ushort = 39; + +pub const IFLA_INFO_UNSPEC: ::c_ushort = 0; +pub const IFLA_INFO_KIND: ::c_ushort = 1; +pub const IFLA_INFO_DATA: ::c_ushort = 2; +pub const IFLA_INFO_XSTATS: ::c_ushort = 3; +pub const IFLA_INFO_SLAVE_KIND: ::c_ushort = 4; +pub const IFLA_INFO_SLAVE_DATA: ::c_ushort = 5; // linux/if_tun.h pub const IFF_TUN: ::c_int = 0x0001; @@ -1523,11 +1562,11 @@ pub const IP_ORIGDSTADDR: ::c_int = 20; pub const IP_RECVORIGDSTADDR: ::c_int = IP_ORIGDSTADDR; pub const IPV6_ORIGDSTADDR: ::c_int = 74; pub const IPV6_RECVORIGDSTADDR: ::c_int = IPV6_ORIGDSTADDR; -pub const IPV6_FLOWINFO: ::c_int = 11; pub const IPV6_FLOWLABEL_MGR: ::c_int = 32; pub const IPV6_FLOWINFO_SEND: ::c_int = 33; pub const IPV6_FLOWINFO_FLOWLABEL: ::c_int = 0x000fffff; pub const IPV6_FLOWINFO_PRIORITY: ::c_int = 0x0ff00000; + pub const IUTF8: ::tcflag_t = 0x00004000; pub const CMSPAR: ::tcflag_t = 0o10000000000; @@ -1657,6 +1696,83 @@ pub const NLMSG_DONE: ::c_int = 0x3; pub const NLMSG_OVERRUN: ::c_int = 0x4; pub const NLMSG_MIN_TYPE: ::c_int = 0x10; +// linux/netfilter/nfnetlink.h +pub const NFNLGRP_NONE: ::c_int = 0; +pub const NFNLGRP_CONNTRACK_NEW: ::c_int = 1; +pub const NFNLGRP_CONNTRACK_UPDATE: ::c_int = 2; +pub const NFNLGRP_CONNTRACK_DESTROY: ::c_int = 3; +pub const NFNLGRP_CONNTRACK_EXP_NEW: ::c_int = 4; +pub const NFNLGRP_CONNTRACK_EXP_UPDATE: ::c_int = 5; +pub const NFNLGRP_CONNTRACK_EXP_DESTROY: ::c_int = 6; +pub const NFNLGRP_NFTABLES: ::c_int = 7; +pub const NFNLGRP_ACCT_QUOTA: ::c_int = 8; + +pub const NFNETLINK_V0: ::c_int = 0; + +pub const NFNL_SUBSYS_NONE: ::c_int = 0; +pub const NFNL_SUBSYS_CTNETLINK: ::c_int = 1; +pub const NFNL_SUBSYS_CTNETLINK_EXP: ::c_int = 2; +pub const NFNL_SUBSYS_QUEUE: ::c_int = 3; +pub const NFNL_SUBSYS_ULOG: ::c_int = 4; +pub const NFNL_SUBSYS_OSF: ::c_int = 5; +pub const NFNL_SUBSYS_IPSET: ::c_int = 6; +pub const NFNL_SUBSYS_ACCT: ::c_int = 7; +pub const NFNL_SUBSYS_CTNETLINK_TIMEOUT: ::c_int = 8; +pub const NFNL_SUBSYS_CTHELPER: ::c_int = 9; +pub const NFNL_SUBSYS_NFTABLES: ::c_int = 10; +pub const NFNL_SUBSYS_NFT_COMPAT: ::c_int = 11; +pub const NFNL_SUBSYS_COUNT: ::c_int = 12; + +pub const NFNL_MSG_BATCH_BEGIN: ::c_int = NLMSG_MIN_TYPE; +pub const NFNL_MSG_BATCH_END: ::c_int = NLMSG_MIN_TYPE + 1; + +// linux/netfilter/nfnetlink_log.h +pub const NFULNL_MSG_PACKET: ::c_int = 0; +pub const NFULNL_MSG_CONFIG: ::c_int = 1; + +pub const NFULA_UNSPEC: ::c_int = 0; +pub const NFULA_PACKET_HDR: ::c_int = 1; +pub const NFULA_MARK: ::c_int = 2; +pub const NFULA_TIMESTAMP: ::c_int = 3; +pub const NFULA_IFINDEX_INDEV: ::c_int = 4; +pub const NFULA_IFINDEX_OUTDEV: ::c_int = 5; +pub const NFULA_IFINDEX_PHYSINDEV: ::c_int = 6; +pub const NFULA_IFINDEX_PHYSOUTDEV: ::c_int = 7; +pub const NFULA_HWADDR: ::c_int = 8; +pub const NFULA_PAYLOAD: ::c_int = 9; +pub const NFULA_PREFIX: ::c_int = 10; +pub const NFULA_UID: ::c_int = 11; +pub const NFULA_SEQ: ::c_int = 12; +pub const NFULA_SEQ_GLOBAL: ::c_int = 13; +pub const NFULA_GID: ::c_int = 14; +pub const NFULA_HWTYPE: ::c_int = 15; +pub const NFULA_HWHEADER: ::c_int = 16; +pub const NFULA_HWLEN: ::c_int = 17; +pub const NFULA_CT: ::c_int = 18; +pub const NFULA_CT_INFO: ::c_int = 19; + +pub const NFULNL_CFG_CMD_NONE: ::c_int = 0; +pub const NFULNL_CFG_CMD_BIND: ::c_int = 1; +pub const NFULNL_CFG_CMD_UNBIND: ::c_int = 2; +pub const NFULNL_CFG_CMD_PF_BIND: ::c_int = 3; +pub const NFULNL_CFG_CMD_PF_UNBIND: ::c_int = 4; + +pub const NFULA_CFG_UNSPEC: ::c_int = 0; +pub const NFULA_CFG_CMD: ::c_int = 1; +pub const NFULA_CFG_MODE: ::c_int = 2; +pub const NFULA_CFG_NLBUFSIZ: ::c_int = 3; +pub const NFULA_CFG_TIMEOUT: ::c_int = 4; +pub const NFULA_CFG_QTHRESH: ::c_int = 5; +pub const NFULA_CFG_FLAGS: ::c_int = 6; + +pub const NFULNL_COPY_NONE: ::c_int = 0x00; +pub const NFULNL_COPY_META: ::c_int = 0x01; +pub const NFULNL_COPY_PACKET: ::c_int = 0x02; + +pub const NFULNL_CFG_F_SEQ: ::c_int = 0x0001; +pub const NFULNL_CFG_F_SEQ_GLOBAL: ::c_int = 0x0002; +pub const NFULNL_CFG_F_CONNTRACK: ::c_int = 0x0004; + pub const GENL_NAMSIZ: ::c_int = 16; pub const GENL_MIN_ID: ::c_int = NLMSG_MIN_TYPE; diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/mod.rs b/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/mod.rs index fd1e259fc3..ff23688734 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/mod.rs @@ -827,6 +827,7 @@ pub const SYS_pwritev2: ::c_long = 393; pub const SYS_pkey_mprotect: ::c_long = 394; pub const SYS_pkey_alloc: ::c_long = 395; pub const SYS_pkey_free: ::c_long = 396; +pub const SYS_statx: ::c_long = 397; extern "C" { pub fn getrandom( diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs b/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs index 0e6cc148fa..2340695572 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs @@ -710,6 +710,7 @@ pub const SYS_wait4: ::c_int = 260; pub const SYS_waitid: ::c_int = 95; pub const SYS_write: ::c_int = 64; pub const SYS_writev: ::c_int = 66; +pub const SYS_statx: ::c_int = 291; pub const TCFLSH: ::c_int = 21515; pub const TCGETA: ::c_int = 21509; pub const TCGETS: ::c_int = 21505; diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/mod.rs b/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/mod.rs index 7fdd121a7a..be11341683 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/mod.rs @@ -836,6 +836,10 @@ pub const SYS_mlock2: ::c_long = 4000 + 359; pub const SYS_copy_file_range: ::c_long = 4000 + 360; pub const SYS_preadv2: ::c_long = 4000 + 361; pub const SYS_pwritev2: ::c_long = 4000 + 362; +pub const SYS_pkey_mprotect: ::c_long = 4000 + 363; +pub const SYS_pkey_alloc: ::c_long = 4000 + 364; +pub const SYS_pkey_free: ::c_long = 4000 + 365; +pub const SYS_statx: ::c_long = 4000 + 366; cfg_if! { if #[cfg(libc_align)] { diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/mod.rs b/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/mod.rs index fb5569200c..fcd8ae4117 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/mod.rs @@ -914,8 +914,10 @@ pub const SYS_mlock2: ::c_long = 376; pub const SYS_copy_file_range: ::c_long = 377; pub const SYS_preadv2: ::c_long = 378; pub const SYS_pwritev2: ::c_long = 379; -// FIXME syscalls 380-382 have been added in musl 1.16 -// See discussion https://github.com/rust-lang/libc/pull/699 +pub const SYS_pkey_mprotect: ::c_long = 380; +pub const SYS_pkey_alloc: ::c_long = 381; +pub const SYS_pkey_free: ::c_long = 382; +pub const SYS_statx: ::c_long = 383; // offsets in user_regs_structs, from sys/reg.h pub const EBX: ::c_int = 0; diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs b/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs index 8c286d83cc..876ff3c8d7 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs @@ -506,6 +506,7 @@ pub const SYS_pwritev2: ::c_long = 287; pub const SYS_pkey_mprotect: ::c_long = 288; pub const SYS_pkey_alloc: ::c_long = 289; pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; pub const RLIMIT_NLIMITS: ::c_int = 15; pub const TIOCINQ: ::c_int = ::FIONREAD; diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b64/mips64.rs b/vendor/libc/src/unix/linux_like/linux/musl/b64/mips64.rs index bbdc0105fb..2c410509fa 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/b64/mips64.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/b64/mips64.rs @@ -424,6 +424,7 @@ pub const SYS_pwritev2: ::c_long = 5000 + 322; pub const SYS_pkey_mprotect: ::c_long = 5000 + 323; pub const SYS_pkey_alloc: ::c_long = 5000 + 324; pub const SYS_pkey_free: ::c_long = 5000 + 325; +pub const SYS_statx: ::c_long = 5000 + 326; pub const O_DIRECT: ::c_int = 0x8000; pub const O_DIRECTORY: ::c_int = 0x10000; diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b64/powerpc64.rs b/vendor/libc/src/unix/linux_like/linux/musl/b64/powerpc64.rs index 5c068feae8..d27d703ad9 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/b64/powerpc64.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/b64/powerpc64.rs @@ -596,6 +596,7 @@ pub const SYS_copy_file_range: ::c_long = 379; pub const SYS_preadv2: ::c_long = 380; pub const SYS_pwritev2: ::c_long = 381; pub const SYS_kexec_file_load: ::c_long = 382; +pub const SYS_statx: ::c_long = 383; pub const FIOCLEX: ::c_int = 0x20006601; pub const FIONCLEX: ::c_int = 0x20006602; diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs b/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs index e4741a3a19..ff9300c85f 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs @@ -3,6 +3,7 @@ pub type wchar_t = i32; pub type nlink_t = u64; pub type blksize_t = ::c_long; pub type __u64 = ::c_ulonglong; +pub type greg_t = i64; s! { pub struct stat { @@ -99,8 +100,12 @@ s! { pub u_debugreg: [::c_ulong; 8], } + // GitHub repo: ifduyue/musl/ + // commit: b4b1e10364c8737a632be61582e05a8d3acf5690 + // file: arch/x86_64/bits/signal.h#L80-L84 pub struct mcontext_t { - __private: [u64; 32], + pub gregs: [greg_t; 23], + __private: [u64; 9], } pub struct ipc_perm { @@ -571,8 +576,10 @@ pub const SYS_mlock2: ::c_long = 325; pub const SYS_copy_file_range: ::c_long = 326; pub const SYS_preadv2: ::c_long = 327; pub const SYS_pwritev2: ::c_long = 328; -// FIXME syscalls 329-331 have been added in musl 1.16 -// See discussion https://github.com/rust-lang/libc/pull/699 +pub const SYS_pkey_mprotect: ::c_long = 329; +pub const SYS_pkey_alloc: ::c_long = 330; +pub const SYS_pkey_free: ::c_long = 331; +pub const SYS_statx: ::c_long = 332; // offsets in user_regs_structs, from sys/reg.h pub const R15: ::c_int = 0; @@ -603,6 +610,34 @@ pub const ES: ::c_int = 24; pub const FS: ::c_int = 25; pub const GS: ::c_int = 26; +// offsets in mcontext_t.gregs from bits/signal.h +// GitHub repo: ifduyue/musl/ +// commit: b4b1e10364c8737a632be61582e05a8d3acf5690 +// file: arch/x86_64/bits/signal.h#L9-L56 +pub const REG_R8: ::c_int = 0; +pub const REG_R9: ::c_int = 1; +pub const REG_R10: ::c_int = 2; +pub const REG_R11: ::c_int = 3; +pub const REG_R12: ::c_int = 4; +pub const REG_R13: ::c_int = 5; +pub const REG_R14: ::c_int = 6; +pub const REG_R15: ::c_int = 7; +pub const REG_RDI: ::c_int = 8; +pub const REG_RSI: ::c_int = 9; +pub const REG_RBP: ::c_int = 10; +pub const REG_RBX: ::c_int = 11; +pub const REG_RDX: ::c_int = 12; +pub const REG_RAX: ::c_int = 13; +pub const REG_RCX: ::c_int = 14; +pub const REG_RSP: ::c_int = 15; +pub const REG_RIP: ::c_int = 16; +pub const REG_EFL: ::c_int = 17; +pub const REG_CSGSFS: ::c_int = 18; +pub const REG_ERR: ::c_int = 19; +pub const REG_TRAPNO: ::c_int = 20; +pub const REG_OLDMASK: ::c_int = 21; +pub const REG_CR2: ::c_int = 22; + pub const MADV_SOFT_OFFLINE: ::c_int = 101; pub const MAP_32BIT: ::c_int = 0x0040; pub const O_APPEND: ::c_int = 1024; diff --git a/vendor/libc/src/unix/linux_like/linux/musl/mod.rs b/vendor/libc/src/unix/linux_like/linux/musl/mod.rs index 7f10a0b39f..2c5d375a1a 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/mod.rs @@ -13,6 +13,8 @@ pub type fsblkcnt_t = ::c_ulonglong; pub type fsfilcnt_t = ::c_ulonglong; pub type rlim_t = ::c_ulonglong; +pub type flock64 = flock; + impl siginfo_t { pub unsafe fn si_addr(&self) -> *mut ::c_void { #[repr(C)] diff --git a/vendor/libc/src/unix/linux_like/linux/no_align.rs b/vendor/libc/src/unix/linux_like/linux/no_align.rs index 016712a932..13c2b71c98 100644 --- a/vendor/libc/src/unix/linux_like/linux/no_align.rs +++ b/vendor/libc/src/unix/linux_like/linux/no_align.rs @@ -48,12 +48,14 @@ macro_rules! expand_align { #[cfg(any(target_arch = "mips", target_arch = "arm", target_arch = "powerpc", + target_arch = "sparc", all(target_arch = "x86_64", target_pointer_width = "32")))] __align: [::c_long; 0], #[cfg(not(any(target_arch = "mips", target_arch = "arm", target_arch = "powerpc", + target_arch = "sparc", all(target_arch = "x86_64", target_pointer_width = "32"))))] __align: [::c_longlong; 0], @@ -64,12 +66,14 @@ macro_rules! expand_align { #[cfg(any(target_arch = "mips", target_arch = "arm", target_arch = "powerpc", + target_arch = "sparc", all(target_arch = "x86_64", target_pointer_width = "32")))] __align: [::c_long; 0], #[cfg(not(any(target_arch = "mips", target_arch = "arm", target_arch = "powerpc", + target_arch = "sparc", all(target_arch = "x86_64", target_pointer_width = "32"))))] __align: [::c_longlong; 0], diff --git a/vendor/libc/src/unix/linux_like/mod.rs b/vendor/libc/src/unix/linux_like/mod.rs index 1568e4f836..792548f981 100644 --- a/vendor/libc/src/unix/linux_like/mod.rs +++ b/vendor/libc/src/unix/linux_like/mod.rs @@ -24,6 +24,12 @@ s! { pub imr_interface: in_addr, } + pub struct ip_mreq_source { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + pub imr_sourceaddr: in_addr, + } + pub struct sockaddr { pub sa_family: sa_family_t, pub sa_data: [::c_char; 14], @@ -810,14 +816,32 @@ pub const IP_RECVTOS: ::c_int = 13; pub const IP_RECVERR: ::c_int = 11; pub const IP_ADD_MEMBERSHIP: ::c_int = 35; pub const IP_DROP_MEMBERSHIP: ::c_int = 36; +pub const IP_ADD_SOURCE_MEMBERSHIP: ::c_int = 39; +pub const IP_DROP_SOURCE_MEMBERSHIP: ::c_int = 40; pub const IP_TRANSPARENT: ::c_int = 19; +pub const IPV6_ADDRFORM: ::c_int = 1; +pub const IPV6_2292PKTINFO: ::c_int = 2; +pub const IPV6_2292HOPOPTS: ::c_int = 3; +pub const IPV6_2292DSTOPTS: ::c_int = 4; +pub const IPV6_2292RTHDR: ::c_int = 5; +pub const IPV6_2292PKTOPTIONS: ::c_int = 6; +pub const IPV6_CHECKSUM: ::c_int = 7; +pub const IPV6_2292HOPLIMIT: ::c_int = 8; +pub const IPV6_NEXTHOP: ::c_int = 9; +pub const IPV6_FLOWINFO: ::c_int = 11; pub const IPV6_UNICAST_HOPS: ::c_int = 16; pub const IPV6_MULTICAST_IF: ::c_int = 17; pub const IPV6_MULTICAST_HOPS: ::c_int = 18; pub const IPV6_MULTICAST_LOOP: ::c_int = 19; pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20; pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21; +pub const IPV6_ROUTER_ALERT: ::c_int = 22; +pub const IPV6_MTU_DISCOVER: ::c_int = 23; +pub const IPV6_MTU: ::c_int = 24; +pub const IPV6_RECVERR: ::c_int = 25; pub const IPV6_V6ONLY: ::c_int = 26; +pub const IPV6_JOIN_ANYCAST: ::c_int = 27; +pub const IPV6_LEAVE_ANYCAST: ::c_int = 28; pub const IPV6_RECVPKTINFO: ::c_int = 49; pub const IPV6_PKTINFO: ::c_int = 50; pub const IPV6_RECVTCLASS: ::c_int = 66; @@ -1165,8 +1189,10 @@ pub const ARPHRD_IEEE802154: u16 = 804; pub const ARPHRD_VOID: u16 = 0xFFFF; pub const ARPHRD_NONE: u16 = 0xFFFE; -fn CMSG_ALIGN(len: usize) -> usize { - len + ::mem::size_of::<usize>() - 1 & !(::mem::size_of::<usize>() - 1) +const_fn! { + {const} fn CMSG_ALIGN(len: usize) -> usize { + len + ::mem::size_of::<usize>() - 1 & !(::mem::size_of::<usize>() - 1) + } } f! { @@ -1182,7 +1208,7 @@ f! { cmsg.offset(1) as *mut ::c_uchar } - pub fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { (CMSG_ALIGN(length as usize) + CMSG_ALIGN(::mem::size_of::<cmsghdr>())) as ::c_uint } @@ -1458,6 +1484,10 @@ extern "C" { pub fn acct(filename: *const ::c_char) -> ::c_int; pub fn brk(addr: *mut ::c_void) -> ::c_int; pub fn sbrk(increment: ::intptr_t) -> *mut ::c_void; + #[deprecated( + since = "0.2.66", + note = "causes memory corruption, see rust-lang/libc#1596" + )] pub fn vfork() -> ::pid_t; pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int; pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int; diff --git a/vendor/libc/src/unix/solarish/mod.rs b/vendor/libc/src/unix/solarish/mod.rs index eaa43fe900..06c1a20cf7 100644 --- a/vendor/libc/src/unix/solarish/mod.rs +++ b/vendor/libc/src/unix/solarish/mod.rs @@ -34,6 +34,7 @@ pub type nl_item = ::c_int; pub type mqd_t = *mut ::c_void; pub type id_t = ::c_int; pub type idtype_t = ::c_uint; +pub type shmatt_t = ::c_ulong; pub type door_attr_t = ::c_uint; pub type door_id_t = ::c_ulonglong; @@ -57,6 +58,16 @@ s! { pub imr_interface: in_addr, } + pub struct ipc_perm { + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub seq: ::c_uint, + pub key: ::key_t, + } + pub struct sockaddr { pub sa_family: sa_family_t, pub sa_data: [::c_char; 14], @@ -206,6 +217,33 @@ s! { pub ai_next: *mut addrinfo, } + pub struct shmid_ds { + pub shm_perm: ipc_perm, + pub shm_segsz: ::size_t, + #[cfg(target_os = "illumos")] + pub shm_amp: *mut ::c_void, + #[cfg(target_os = "solaris")] + pub shm_flags: ::uintptr_t, + pub shm_lkcnt: ::c_ushort, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_cnattch: ::c_ulong, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + #[cfg(target_os = "illumos")] + pub shm_pad4: [i64; 4], + #[cfg(target_os = "solaris")] + pub shm_amp: *mut ::c_void, + #[cfg(target_os = "solaris")] + pub shm_gransize: u64, + #[cfg(target_os = "solaris")] + pub shm_allocated: u64, + #[cfg(target_os = "solaris")] + pub shm_pad4: [i64; 1], + } + pub struct sigset_t { bits: [u32; 4], } @@ -348,6 +386,21 @@ s! { pub d_descriptor: ::c_int, pub d_id: ::door_id_t } + + pub struct exit_status { + e_termination: ::c_short, + e_exit: ::c_short, + } + + pub struct utmp { + pub ut_user: [::c_char; 8], + pub ut_id: [::c_char; 4], + pub ut_line: [::c_char; 12], + pub ut_pid: ::c_short, + pub ut_type: ::c_short, + pub ut_exit: exit_status, + pub ut_time: ::time_t, + } } s_no_extra_traits! { @@ -357,6 +410,20 @@ s_no_extra_traits! { pub u64: u64, } + pub struct utmpx { + pub ut_user: [::c_char; _UTX_USERSIZE], + pub ut_id: [::c_char; _UTX_IDSIZE], + pub ut_line: [::c_char; _UTX_LINESIZE], + pub ut_pid: ::pid_t, + pub ut_type: ::c_short, + pub ut_exit: exit_status, + pub ut_tv: ::timeval, + pub ut_session: ::c_int, + pub ut_pad: [::c_int; _UTX_PADSIZE], + pub ut_syslen: ::c_short, + pub ut_host: [::c_char; _UTX_HOSTSIZE], + } + pub struct sockaddr_un { pub sun_family: sa_family_t, pub sun_path: [c_char; 108] @@ -434,6 +501,62 @@ s_no_extra_traits! { cfg_if! { if #[cfg(feature = "extra_traits")] { + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_type == other.ut_type + && self.ut_pid == other.ut_pid + && self.ut_user == other.ut_user + && self.ut_line == other.ut_line + && self.ut_id == other.ut_id + && self.ut_exit == other.ut_exit + && self.ut_session == other.ut_session + && self.ut_tv == other.ut_tv + && self.ut_syslen == other.ut_syslen + && self.ut_pad == other.ut_pad + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for utmpx {} + + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_user", &self.ut_user) + .field("ut_id", &self.ut_id) + .field("ut_line", &self.ut_line) + .field("ut_pid", &self.ut_pid) + .field("ut_type", &self.ut_type) + .field("ut_exit", &self.ut_exit) + .field("ut_tv", &self.ut_tv) + .field("ut_session", &self.ut_session) + .field("ut_pad", &self.ut_pad) + .field("ut_syslen", &self.ut_syslen) + .field("ut_host", &self.ut_host) + .finish() + } + } + + impl ::hash::Hash for utmpx { + fn hash<H: ::hash::Hasher>(&self, state: &mut H) { + self.ut_user.hash(state); + self.ut_type.hash(state); + self.ut_pid.hash(state); + self.ut_line.hash(state); + self.ut_id.hash(state); + self.ut_host.hash(state); + self.ut_exit.hash(state); + self.ut_session.hash(state); + self.ut_tv.hash(state); + self.ut_syslen.hash(state); + self.ut_pad.hash(state); + } + } + impl PartialEq for epoll_event { fn eq(&self, other: &epoll_event) -> bool { self.events == other.events @@ -981,6 +1104,7 @@ pub const MAP_PRIVATE: ::c_int = 0x0002; pub const MAP_FIXED: ::c_int = 0x0010; pub const MAP_NORESERVE: ::c_int = 0x40; pub const MAP_ANON: ::c_int = 0x0100; +pub const MAP_ANONYMOUS: ::c_int = 0x0100; pub const MAP_RENAME: ::c_int = 0x20; pub const MAP_ALIGN: ::c_int = 0x200; pub const MAP_TEXT: ::c_int = 0x400; @@ -1352,6 +1476,16 @@ pub const IFF_VIRTUAL: ::c_longlong = 0x2000000000; // Cannot send/receive pkts pub const IFF_DUPLICATE: ::c_longlong = 0x4000000000; // Local address in use pub const IFF_IPMP: ::c_longlong = 0x8000000000; // IPMP IP interface +// sys/ipc.h: +pub const IPC_ALLOC: ::c_int = 0x8000; +pub const IPC_CREAT: ::c_int = 0x200; +pub const IPC_EXCL: ::c_int = 0x400; +pub const IPC_NOWAIT: ::c_int = 0x800; +pub const IPC_PRIVATE: key_t = 0; +pub const IPC_RMID: ::c_int = 10; +pub const IPC_SET: ::c_int = 11; +pub const IPC_SEAT: ::c_int = 12; + pub const SHUT_RD: ::c_int = 0; pub const SHUT_WR: ::c_int = 1; pub const SHUT_RDWR: ::c_int = 2; @@ -1615,6 +1749,24 @@ pub const PORT_SOURCE_FILE: ::c_int = 7; pub const PORT_SOURCE_POSTWAIT: ::c_int = 8; pub const PORT_SOURCE_SIGNAL: ::c_int = 9; +pub const NONROOT_USR: ::c_short = 2; +pub const _UTX_USERSIZE: usize = 32; +pub const _UTX_LINESIZE: usize = 32; +pub const _UTX_PADSIZE: usize = 5; +pub const _UTX_IDSIZE: usize = 4; +pub const _UTX_HOSTSIZE: usize = 257; +pub const EMPTY: ::c_short = 0; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const OLD_TIME: ::c_short = 3; +pub const NEW_TIME: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; +pub const ACCOUNTING: ::c_short = 9; +pub const DOWN_TIME: ::c_short = 10; + const _TIOC: ::c_int = ('T' as i32) << 8; const tIOC: ::c_int = ('t' as i32) << 8; pub const TCGETA: ::c_int = (_TIOC | 1); @@ -1803,6 +1955,11 @@ pub const VLNEXT: usize = 15; pub const VSTATUS: usize = 16; pub const VERASE2: usize = 17; +// 3SOCKET flags +pub const SOCK_CLOEXEC: ::c_int = 0x080000; +pub const SOCK_NONBLOCK: ::c_int = 0x100000; +pub const SOCK_NDELAY: ::c_int = 0x200000; + f! { pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; @@ -1889,6 +2046,7 @@ extern "C" { pub fn srand(seed: ::c_uint); pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn settimeofday(tp: *const ::timeval, tz: *const ::c_void) -> ::c_int; pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; pub fn freeifaddrs(ifa: *mut ::ifaddrs); @@ -2010,6 +2168,22 @@ extern "C" { advice: ::c_int, ) -> ::c_int; + pub fn shmat( + shmid: ::c_int, + shmaddr: *const ::c_void, + shmflg: ::c_int, + ) -> *mut ::c_void; + + pub fn shmctl( + shmid: ::c_int, + cmd: ::c_int, + buf: *mut ::shmid_ds, + ) -> ::c_int; + + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + + pub fn shmget(key: key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shm_open( name: *const ::c_char, oflag: ::c_int, @@ -2048,6 +2222,7 @@ extern "C" { path: *const ::c_char, times: *const ::timeval, ) -> ::c_int; + pub fn futimens(dirfd: ::c_int, times: *const ::timespec) -> ::c_int; pub fn utimensat( dirfd: ::c_int, path: *const ::c_char, @@ -2295,6 +2470,29 @@ extern "C" { attributes: door_attr_t, ) -> ::c_int; pub fn fattach(fildes: ::c_int, path: *const ::c_char) -> ::c_int; + + pub fn makeutx(ux: *const utmpx) -> *mut utmpx; + pub fn modutx(ux: *const utmpx) -> *mut utmpx; + pub fn updwtmpx(file: *const ::c_char, ut: *const utmpx) -> ::c_int; + pub fn utmpxname(file: *const ::c_char) -> ::c_int; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); + pub fn endutxent(); + + pub fn endutent(); + pub fn getutent() -> *mut utmp; + pub fn getutid(u: *const utmp) -> *mut utmp; + pub fn getutline(u: *const utmp) -> *mut utmp; + pub fn pututline(u: *const utmp) -> *mut utmp; + pub fn setutent(); + pub fn utmpname(file: *const ::c_char) -> ::c_int; + + pub fn getutmp(ux: *const utmpx, u: *mut utmp); + pub fn getutmpx(u: *const utmp, ux: *mut utmpx); + pub fn updwtmp(file: *const ::c_char, u: *mut utmp); } mod compat; diff --git a/vendor/libc/src/unix/uclibc/arm/mod.rs b/vendor/libc/src/unix/uclibc/arm/mod.rs index 41dd7100df..613a11fbab 100644 --- a/vendor/libc/src/unix/uclibc/arm/mod.rs +++ b/vendor/libc/src/unix/uclibc/arm/mod.rs @@ -408,10 +408,6 @@ pub const F_SETLKW: ::c_int = 0x7; pub const HUPCL: ::tcflag_t = 0x400; pub const ICANON: ::tcflag_t = 0x2; pub const IEXTEN: ::tcflag_t = 0x8000; -pub const IPV6_MULTICAST_HOPS: ::c_int = 0x12; -pub const IPV6_MULTICAST_IF: ::c_int = 0x11; -pub const IPV6_UNICAST_HOPS: ::c_int = 0x10; -pub const IP_MULTICAST_IF: ::c_int = 0x20; pub const ISIG: ::tcflag_t = 0x1; pub const IUTF8: ::tcflag_t = 0x4000; pub const IXOFF: ::tcflag_t = 0x1000; diff --git a/vendor/libc/src/unix/uclibc/mod.rs b/vendor/libc/src/unix/uclibc/mod.rs index 986b05ca0b..b4fe036880 100644 --- a/vendor/libc/src/unix/uclibc/mod.rs +++ b/vendor/libc/src/unix/uclibc/mod.rs @@ -288,6 +288,12 @@ s! { pub msgtql: ::c_int, pub msgseg: ::c_ushort, } + + pub struct ucred { + pub pid: ::pid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + } } s_no_extra_traits! { @@ -891,6 +897,22 @@ pub const TCP_INFO: ::c_int = 11; pub const TCP_QUICKACK: ::c_int = 12; pub const TCP_CONGESTION: ::c_int = 13; +// Source: +// https://github.com/kraj/uClibc/blob/ca1c74d67dd115d059a875150e10b8560a9c35a8 +// /libc/sysdeps/linux/common/bits/in.h +// Same for all architectures +pub const IPV6_MULTICAST_HOPS: ::c_int = 18; +pub const IP_MULTICAST_IF: ::c_int = 32; +pub const IPV6_MULTICAST_IF: ::c_int = 17; +pub const IPV6_UNICAST_HOPS: ::c_int = 16; + +// Source: +// https://github.com/kraj/uClibc/tree/ca1c74d67dd115d059a875150e10b8560a9c35a8 +// Same for all architectures +pub const FUTEX_WAIT: ::c_int = 0; +pub const FUTEX_PRIVATE_FLAG: ::c_int = 128; +pub const FUTEX_WAKE: ::c_int = 1; + pub const IPV6_MULTICAST_LOOP: ::c_int = 19; pub const IPV6_V6ONLY: ::c_int = 26; diff --git a/vendor/libc/src/vxworks/mod.rs b/vendor/libc/src/vxworks/mod.rs index cbf93b3ccd..a086dedf72 100755 --- a/vendor/libc/src/vxworks/mod.rs +++ b/vendor/libc/src/vxworks/mod.rs @@ -550,6 +550,8 @@ pub const EAI_SERVICE: ::c_int = 9; pub const EAI_SOCKTYPE: ::c_int = 10; pub const EAI_SYSTEM: ::c_int = 11; +// This is not defined in vxWorks, but we have to define it here +// to make the building pass for getrandom and libstd, FIXME pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; //Clock Lib Stuff @@ -558,7 +560,7 @@ pub const CLOCK_MONOTONIC: ::c_int = 0x1; pub const CLOCK_PROCESS_CPUTIME_ID: ::c_int = 0x2; pub const CLOCK_THREAD_CPUTIME_ID: ::c_int = 0x3; pub const TIMER_ABSTIME: ::c_int = 0x1; -pub const TIME_RELTIME: ::c_int = 0xFFFFFFFE; +pub const TIMER_RELTIME: ::c_int = 0x0; // PTHREAD STUFF pub const PTHREAD_INITIALIZED_OBJ: ::c_int = 0xF70990EF; @@ -578,33 +580,36 @@ pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; pub const PTHREAD_STACK_MIN: usize = 4096; pub const _PTHREAD_SHARED_SEM_NAME_MAX: usize = 30; -pub const EFAULT: ::c_int = 14; -pub const EBUSY: ::c_int = 16; -pub const EEXIST: ::c_int = 17; -pub const ENODEV: ::c_int = 19; -pub const EINVAL: ::c_int = 22; -pub const EPIPE: ::c_int = 32; -pub const ERANGE: ::c_int = 38; - // ERRNO STUFF +pub const OK: ::c_int = 0; pub const EPERM: ::c_int = 1; /* Not owner */ pub const ENOENT: ::c_int = 2; /* No such file or directory */ pub const ESRCH: ::c_int = 3; /* No such process */ pub const EINTR: ::c_int = 4; /* Interrupted system call */ -pub const EIOA: ::c_int = 5; /* I/O error */ +pub const EIO: ::c_int = 5; /* I/O error */ pub const ENXIO: ::c_int = 6; /* No such device or address */ pub const E2BIG: ::c_int = 7; /* Arg list too long */ pub const ENOEXEC: ::c_int = 8; /* Exec format error */ pub const EBADF: ::c_int = 9; /* Bad file number */ -pub const CHILD: ::c_int = 10; /* No children */ +pub const ECHILD: ::c_int = 10; /* No children */ pub const EAGAIN: ::c_int = 11; /* No more processes */ pub const ENOMEM: ::c_int = 12; /* Not enough core */ pub const EACCES: ::c_int = 13; /* Permission denied */ +pub const EFAULT: ::c_int = 14; +pub const ENOTEMPTY: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENAMETOOLONG: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const EROFS: ::c_int = 30; +pub const EPIPE: ::c_int = 32; pub const EDEADLK: ::c_int = 33; -pub const EINPROGRESS: ::c_int = 68; -pub const EALREADY: ::c_int = 69; -pub const EWOULDBLOCK: ::c_int = 70; -pub const ENOSYS: ::c_int = 71; +pub const ERANGE: ::c_int = 38; pub const EDESTADDRREQ: ::c_int = 40; pub const EPROTOTYPE: ::c_int = 41; pub const ENOPROTOOPT: ::c_int = 42; @@ -627,66 +632,44 @@ pub const ESHUTDOWN: ::c_int = 58; pub const ETOOMANYREFS: ::c_int = 59; pub const ETIMEDOUT: ::c_int = 60; pub const ECONNREFUSED: ::c_int = 61; +pub const EINPROGRESS: ::c_int = 68; +pub const EALREADY: ::c_int = 69; +pub const EWOULDBLOCK: ::c_int = 70; +pub const ENOSYS: ::c_int = 71; +pub const EDQUOT: ::c_int = 83; +pub const ESTALE: ::c_int = 88; // NFS errnos: Refer to pkgs_v2/storage/fs/nfs/h/nfs/nfsCommon.h const M_nfsStat: ::c_int = 48 << 16; enum nfsstat { - NFS_OK = 0, - NFSERR_PERM = 1, - NFSERR_NOENT = 2, - NFSERR_IO = 5, - NFSERR_NXIO = 6, - NFSERR_ACCESS = 13, - NFSERR_EXIST = 17, - NFSERR_XDEV = 18, - NFSERR_NODEV = 19, - NFSERR_NOTDIR = 20, - NFSERR_ISDIR = 21, - NFSERR_INVAL = 22, - NFSERR_FBIG = 27, - NFSERR_NOSPC = 28, - NFSERR_ROFS = 30, - NFSERR_MLINK = 31, - NFSERR_NAMETOOLONG = 26, - NFSERR_NOTEMPTY = 15, - NFSERR_DQUOT = 83, - NFSERR_STALE = 88, NFSERR_REMOTE = 71, NFSERR_WFLUSH = 99, NFSERR_BADHANDLE = 10001, NFSERR_NOT_SYNC = 10002, NFSERR_BAD_COOKIE = 10003, - NFSERR_NOTSUPP = 45, NFSERR_TOOSMALL = 10005, NFSERR_BADTYPE = 10007, NFSERR_JUKEBOX = 10008, } -pub const S_nfsLib_NFS_OK: ::c_int = nfsstat::NFS_OK as ::c_int; -pub const S_nfsLib_NFSERR_PERM: ::c_int = nfsstat::NFSERR_PERM as ::c_int; -pub const S_nfsLib_NFSERR_NOENT: ::c_int = nfsstat::NFSERR_NOENT as ::c_int; -pub const S_nfsLib_NFSERR_IO: ::c_int = nfsstat::NFSERR_IO as ::c_int; -pub const S_nfsLib_NFSERR_NXIO: ::c_int = nfsstat::NFSERR_NXIO as ::c_int; -pub const S_nfsLib_NFSERR_ACCESS: ::c_int = nfsstat::NFSERR_ACCESS as ::c_int; -pub const S_nfsLib_NFSERR_EXIST: ::c_int = nfsstat::NFSERR_EXIST as ::c_int; -pub const S_nfsLib_NFSERR_XDEV: ::c_int = - M_nfsStat | nfsstat::NFSERR_XDEV as ::c_int; -pub const S_nfsLib_NFSERR_NODEV: ::c_int = - M_nfsStat | nfsstat::NFSERR_NODEV as ::c_int; -pub const S_nfsLib_NFSERR_NOTDIR: ::c_int = nfsstat::NFSERR_NOTDIR as ::c_int; -pub const S_nfsLib_NFSERR_ISDIR: ::c_int = nfsstat::NFSERR_ISDIR as ::c_int; -pub const S_nfsLib_NFSERR_INVAL: ::c_int = nfsstat::NFSERR_INVAL as ::c_int; -pub const S_nfsLib_NFSERR_FBIG: ::c_int = nfsstat::NFSERR_FBIG as ::c_int; -pub const S_nfsLib_NFSERR_NOSPC: ::c_int = nfsstat::NFSERR_NOSPC as ::c_int; -pub const S_nfsLib_NFSERR_ROFS: ::c_int = nfsstat::NFSERR_ROFS as ::c_int; -pub const S_nfsLib_NFSERR_MLINK: ::c_int = - M_nfsStat | nfsstat::NFSERR_MLINK as ::c_int; -pub const S_nfsLib_NFSERR_NAMETOOLONG: ::c_int = - nfsstat::NFSERR_NAMETOOLONG as ::c_int; -pub const S_nfsLib_NFSERR_NOTEMPTY: ::c_int = - nfsstat::NFSERR_NOTEMPTY as ::c_int; -pub const S_nfsLib_NFSERR_DQUOT: ::c_int = nfsstat::NFSERR_DQUOT as ::c_int; -pub const S_nfsLib_NFSERR_STALE: ::c_int = nfsstat::NFSERR_STALE as ::c_int; +pub const S_nfsLib_NFS_OK: ::c_int = OK; +pub const S_nfsLib_NFSERR_PERM: ::c_int = EPERM; +pub const S_nfsLib_NFSERR_NOENT: ::c_int = ENOENT; +pub const S_nfsLib_NFSERR_IO: ::c_int = EIO; +pub const S_nfsLib_NFSERR_NXIO: ::c_int = ENXIO; +pub const S_nfsLib_NFSERR_ACCESS: ::c_int = EACCES; +pub const S_nfsLib_NFSERR_EXIST: ::c_int = EEXIST; +pub const S_nfsLib_NFSERR_ENODEV: ::c_int = ENODEV; +pub const S_nfsLib_NFSERR_NOTDIR: ::c_int = ENOTDIR; +pub const S_nfsLib_NFSERR_ISDIR: ::c_int = EISDIR; +pub const S_nfsLib_NFSERR_INVAL: ::c_int = EINVAL; +pub const S_nfsLib_NFSERR_FBIG: ::c_int = EFBIG; +pub const S_nfsLib_NFSERR_NOSPC: ::c_int = ENOSPC; +pub const S_nfsLib_NFSERR_ROFS: ::c_int = EROFS; +pub const S_nfsLib_NFSERR_NAMETOOLONG: ::c_int = ENAMETOOLONG; +pub const S_nfsLib_NFSERR_NOTEMPTY: ::c_int = ENOTEMPTY; +pub const S_nfsLib_NFSERR_DQUOT: ::c_int = EDQUOT; +pub const S_nfsLib_NFSERR_STALE: ::c_int = ESTALE; pub const S_nfsLib_NFSERR_WFLUSH: ::c_int = M_nfsStat | nfsstat::NFSERR_WFLUSH as ::c_int; pub const S_nfsLib_NFSERR_REMOTE: ::c_int = @@ -697,11 +680,10 @@ pub const S_nfsLib_NFSERR_NOT_SYNC: ::c_int = M_nfsStat | nfsstat::NFSERR_NOT_SYNC as ::c_int; pub const S_nfsLib_NFSERR_BAD_COOKIE: ::c_int = M_nfsStat | nfsstat::NFSERR_BAD_COOKIE as ::c_int; -pub const S_nfsLib_NFSERR_NOTSUPP: ::c_int = - nfsstat::NFSERR_NOTSUPP as ::c_int; +pub const S_nfsLib_NFSERR_NOTSUPP: ::c_int = EOPNOTSUPP; pub const S_nfsLib_NFSERR_TOOSMALL: ::c_int = M_nfsStat | nfsstat::NFSERR_TOOSMALL as ::c_int; -pub const S_nfsLib_NFSERR_SERVERFAULT: ::c_int = nfsstat::NFSERR_IO as ::c_int; +pub const S_nfsLib_NFSERR_SERVERFAULT: ::c_int = EIO; pub const S_nfsLib_NFSERR_BADTYPE: ::c_int = M_nfsStat | nfsstat::NFSERR_BADTYPE as ::c_int; pub const S_nfsLib_NFSERR_JUKEBOX: ::c_int = @@ -736,7 +718,6 @@ pub const S_IFBLK: ::c_int = 0x6000; pub const S_IFREG: ::c_int = 0x8000; pub const S_IFLNK: ::c_int = 0xa000; pub const S_IFSHM: ::c_int = 0xb000; -pub const S_IFDEVMEM: ::c_int = 0xd000; pub const S_IFSOCK: ::c_int = 0xc000; pub const S_ISUID: ::c_int = 0x0800; pub const S_ISGID: ::c_int = 0x0400; @@ -1231,91 +1212,15 @@ extern "C" { pub fn getchar_unlocked() -> ::c_int; pub fn putchar_unlocked(c: ::c_int) -> ::c_int; pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; - pub fn pclose(stream: *mut ::FILE) -> ::c_int; pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; pub fn fileno(stream: *mut ::FILE) -> ::c_int; pub fn creat(path: *const c_char, mode: mode_t) -> ::c_int; - pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; pub fn rewinddir(dirp: *mut ::DIR); - - pub fn openat( - dirfd: ::c_int, - pathname: *const ::c_char, - flags: ::c_int, - ... - ) -> ::c_int; - pub fn fchmodat( - dirfd: ::c_int, - pathname: *const ::c_char, - mode: ::mode_t, - flags: ::c_int, - ) -> ::c_int; pub fn fchown(fd: ::c_int, owner: ::uid_t, group: ::gid_t) -> ::c_int; - pub fn fchownat( - dirfd: ::c_int, - pathname: *const ::c_char, - owner: ::uid_t, - group: ::gid_t, - flags: ::c_int, - ) -> ::c_int; - pub fn fstatat( - dirfd: ::c_int, - pathname: *const ::c_char, - buf: *mut stat, - flags: ::c_int, - ) -> ::c_int; - pub fn linkat( - olddirfd: ::c_int, - oldpath: *const ::c_char, - newdirfd: ::c_int, - newpath: *const ::c_char, - flags: ::c_int, - ) -> ::c_int; - pub fn mkdirat( - dirfd: ::c_int, - pathname: *const ::c_char, - mode: ::mode_t, - ) -> ::c_int; - pub fn readlinkat( - dirfd: ::c_int, - pathname: *const ::c_char, - buf: *mut ::c_char, - bufsiz: ::size_t, - ) -> ::ssize_t; - pub fn renameat( - olddirfd: ::c_int, - oldpath: *const ::c_char, - newdirfd: ::c_int, - newpath: *const ::c_char, - ) -> ::c_int; - pub fn symlinkat( - target: *const ::c_char, - newdirfd: ::c_int, - linkpath: *const ::c_char, - ) -> ::c_int; - pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; pub fn alarm(seconds: ::c_uint) -> ::c_uint; pub fn fchdir(dirfd: ::c_int) -> ::c_int; pub fn chown(path: *const c_char, uid: uid_t, gid: gid_t) -> ::c_int; - pub fn lchown(path: *const c_char, uid: uid_t, gid: gid_t) -> ::c_int; - pub fn execl(path: *const c_char, arg0: *const c_char, ...) -> ::c_int; - pub fn execle( - path: *const ::c_char, - arg0: *const ::c_char, - ... - ) -> ::c_int; - pub fn execlp( - file: *const ::c_char, - arg0: *const ::c_char, - ... - ) -> ::c_int; - pub fn execv(prog: *const c_char, argv: *const *const c_char) -> ::c_int; - pub fn execve( - prog: *const c_char, - argv: *const *const c_char, - envp: *const *const c_char, - ) -> ::c_int; pub fn fpathconf(filedes: ::c_int, name: ::c_int) -> c_long; pub fn getegid() -> gid_t; pub fn geteuid() -> uid_t; @@ -1330,17 +1235,11 @@ extern "C" { pub fn pause() -> ::c_int; pub fn seteuid(uid: uid_t) -> ::c_int; pub fn setegid(gid: gid_t) -> ::c_int; - pub fn setpgid(pid: pid_t, pgid: pid_t) -> ::c_int; - pub fn setsid() -> pid_t; pub fn sleep(secs: ::c_uint) -> ::c_uint; - pub fn tcgetpgrp(fd: ::c_int) -> pid_t; - pub fn tcsetpgrp(fd: ::c_int, pgrp: ::pid_t) -> ::c_int; pub fn ttyname(fd: ::c_int) -> *mut c_char; pub fn wait(status: *mut ::c_int) -> pid_t; pub fn umask(mask: mode_t) -> mode_t; - pub fn killpg(pgrp: pid_t, sig: ::c_int) -> ::c_int; pub fn mlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; - pub fn munlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; pub fn mlockall(flags: ::c_int) -> ::c_int; pub fn munlockall() -> ::c_int; @@ -1353,17 +1252,8 @@ extern "C" { offset: off_t, ) -> *mut ::c_void; pub fn munmap(addr: *mut ::c_void, len: ::size_t) -> ::c_int; - - pub fn if_nametoindex(ifname: *const c_char) -> ::c_uint; - pub fn if_indextoname( - ifindex: ::c_uint, - ifname: *mut ::c_char, - ) -> *mut ::c_char; - pub fn truncate(path: *const c_char, length: off_t) -> ::c_int; - pub fn flock(fd: ::c_int, operation: ::c_int) -> ::c_int; - pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; pub fn pthread_exit(value: *mut ::c_void) -> !; pub fn pthread_attr_setdetachstate( @@ -1406,8 +1296,6 @@ extern "C" { #[link_name = "_rtld_dladdr"] pub fn dladdr(addr: *mut ::c_void, info: *mut Dl_info) -> ::c_int; - pub fn res_init() -> ::c_int; - // time.h pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; @@ -1417,14 +1305,7 @@ extern "C" { pub fn localtime(time_p: *const time_t) -> *mut tm; pub fn timegm(tm: *mut tm) -> time_t; pub fn difftime(time1: time_t, time0: time_t) -> ::c_double; - - pub fn mknod( - pathname: *const ::c_char, - mode: ::mode_t, - dev: ::dev_t, - ) -> ::c_int; pub fn gethostname(name: *mut ::c_char, len: ::size_t) -> ::c_int; - pub fn chroot(name: *const ::c_char) -> ::c_int; pub fn usleep(secs: ::useconds_t) -> ::c_int; pub fn putenv(string: *mut c_char) -> ::c_int; pub fn setlocale( @@ -1439,8 +1320,6 @@ extern "C" { ) -> ::c_int; pub fn sigpending(set: *mut sigset_t) -> ::c_int; - pub fn getsid(pid: pid_t) -> pid_t; - pub fn mkfifo(path: *const c_char, mode: mode_t) -> ::c_int; pub fn fseeko( @@ -1449,13 +1328,7 @@ extern "C" { whence: ::c_int, ) -> ::c_int; pub fn ftello(stream: *mut ::FILE) -> ::off_t; - pub fn tcdrain(fd: ::c_int) -> ::c_int; - pub fn tcflow(fd: ::c_int, action: ::c_int) -> ::c_int; - pub fn tcflush(fd: ::c_int, action: ::c_int) -> ::c_int; - pub fn tcgetsid(fd: ::c_int) -> ::pid_t; - pub fn tcsendbreak(fd: ::c_int, duration: ::c_int) -> ::c_int; pub fn mkstemp(template: *mut ::c_char) -> ::c_int; - pub fn mkdtemp(template: *mut ::c_char) -> *mut ::c_char; pub fn tmpnam(ptr: *mut ::c_char) -> *mut ::c_char; @@ -1463,14 +1336,6 @@ extern "C" { pub fn closelog(); pub fn setlogmask(maskpri: ::c_int) -> ::c_int; pub fn syslog(priority: ::c_int, message: *const ::c_char, ...); - pub fn nice(incr: ::c_int) -> ::c_int; - - pub fn grantpt(fd: ::c_int) -> ::c_int; - pub fn posix_openpt(flags: ::c_int) -> ::c_int; - pub fn ptsname(fd: ::c_int) -> *mut ::c_char; - pub fn unlockpt(fd: ::c_int) -> ::c_int; - - pub fn strcasestr(cs: *const c_char, ct: *const c_char) -> *mut c_char; pub fn getline( lineptr: *mut *mut c_char, n: *mut size_t, @@ -1871,14 +1736,6 @@ extern "C" { protocol: ::c_int, ) -> ::c_int; - pub fn socketpair( - // Doesn't exist - domain: ::c_int, - type_: ::c_int, - protocol: ::c_int, - socket_vector: *mut ::c_int, - ) -> ::c_int; - // icotl.h pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; @@ -2095,8 +1952,8 @@ extern "C" { // pathLib.h pub fn _pathIsAbsolute( filepath: *const ::c_char, - pNameTail: *const *const ::c_char, - ) -> bool; + pNameTail: *mut *const ::c_char, + ) -> BOOL; pub fn writev( fd: ::c_int, diff --git a/vendor/libc/src/windows/mod.rs b/vendor/libc/src/windows/mod.rs index ba80e0ca0f..a83babaed6 100644 --- a/vendor/libc/src/windows/mod.rs +++ b/vendor/libc/src/windows/mod.rs @@ -183,6 +183,48 @@ pub const ENOTEMPTY: ::c_int = 41; pub const EILSEQ: ::c_int = 42; pub const STRUNCATE: ::c_int = 80; +// POSIX Supplement (from errno.h) +pub const EADDRINUSE: ::c_int = 100; +pub const EADDRNOTAVAIL: ::c_int = 101; +pub const EAFNOSUPPORT: ::c_int = 102; +pub const EALREADY: ::c_int = 103; +pub const EBADMSG: ::c_int = 104; +pub const ECANCELED: ::c_int = 105; +pub const ECONNABORTED: ::c_int = 106; +pub const ECONNREFUSED: ::c_int = 107; +pub const ECONNRESET: ::c_int = 108; +pub const EDESTADDRREQ: ::c_int = 109; +pub const EHOSTUNREACH: ::c_int = 110; +pub const EIDRM: ::c_int = 111; +pub const EINPROGRESS: ::c_int = 112; +pub const EISCONN: ::c_int = 113; +pub const ELOOP: ::c_int = 114; +pub const EMSGSIZE: ::c_int = 115; +pub const ENETDOWN: ::c_int = 116; +pub const ENETRESET: ::c_int = 117; +pub const ENETUNREACH: ::c_int = 118; +pub const ENOBUFS: ::c_int = 119; +pub const ENODATA: ::c_int = 120; +pub const ENOLINK: ::c_int = 121; +pub const ENOMSG: ::c_int = 122; +pub const ENOPROTOOPT: ::c_int = 123; +pub const ENOSR: ::c_int = 124; +pub const ENOSTR: ::c_int = 125; +pub const ENOTCONN: ::c_int = 126; +pub const ENOTRECOVERABLE: ::c_int = 127; +pub const ENOTSOCK: ::c_int = 128; +pub const ENOTSUP: ::c_int = 129; +pub const EOPNOTSUPP: ::c_int = 130; +pub const EOVERFLOW: ::c_int = 132; +pub const EOWNERDEAD: ::c_int = 133; +pub const EPROTO: ::c_int = 134; +pub const EPROTONOSUPPORT: ::c_int = 135; +pub const EPROTOTYPE: ::c_int = 136; +pub const ETIME: ::c_int = 137; +pub const ETIMEDOUT: ::c_int = 138; +pub const ETXTBSY: ::c_int = 139; +pub const EWOULDBLOCK: ::c_int = 140; + // signal codes pub const SIGINT: ::c_int = 2; pub const SIGILL: ::c_int = 4; @@ -358,6 +400,8 @@ extern "C" { pub fn signal(signum: c_int, handler: sighandler_t) -> sighandler_t; pub fn raise(signum: c_int) -> c_int; + #[link_name = "_time64"] + pub fn time(destTime: *mut time_t) -> time_t; #[link_name = "_chmod"] pub fn chmod(path: *const c_char, mode: ::c_int) -> ::c_int; #[link_name = "_wchmod"] @@ -425,6 +469,12 @@ extern "C" { pub fn isatty(fd: ::c_int) -> ::c_int; #[link_name = "_lseek"] pub fn lseek(fd: ::c_int, offset: c_long, origin: ::c_int) -> c_long; + #[link_name = "_lseeki64"] + pub fn lseek64( + fd: ::c_int, + offset: c_longlong, + origin: ::c_int, + ) -> c_longlong; #[link_name = "_pipe"] pub fn pipe( fds: *mut ::c_int, diff --git a/vendor/libc/src/windows/msvc.rs b/vendor/libc/src/windows/msvc.rs index 27333ae2ec..8f20deb5df 100644 --- a/vendor/libc/src/windows/msvc.rs +++ b/vendor/libc/src/windows/msvc.rs @@ -1,6 +1,10 @@ pub const L_tmpnam: ::c_uint = 260; pub const TMP_MAX: ::c_uint = 0x7fff_ffff; +// POSIX Supplement (from errno.h) +// This particular error code is only currently available in msvc toolchain +pub const EOTHER: ::c_int = 131; + extern "C" { #[link_name = "_stricmp"] pub fn stricmp(s1: *const ::c_char, s2: *const ::c_char) -> ::c_int; diff --git a/vendor/libc/tests/const_fn.rs b/vendor/libc/tests/const_fn.rs new file mode 100644 index 0000000000..0e7e1864b9 --- /dev/null +++ b/vendor/libc/tests/const_fn.rs @@ -0,0 +1,5 @@ +#![cfg(libc_const_extern_fn)] // If this does not hold, the file is empty + +#[cfg(target_os = "linux")] +const _FOO: libc::c_uint = unsafe { libc::CMSG_SPACE(1) }; +//^ if CMSG_SPACE is not const, this will fail to compile diff --git a/vendor/lock_api-0.1.3/.cargo-checksum.json b/vendor/lock_api-0.1.3/.cargo-checksum.json deleted file mode 100644 index dde064c5b8..0000000000 --- a/vendor/lock_api-0.1.3/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"9a369b3ff1ef121205879d10ba966bbccb81d6461843a75460f4cfcb82c3c849","src/lib.rs":"62142edfbe7e6cc04473aef25ab42553f02e4455ce567cb4303f0bbfee94d87d","src/mutex.rs":"d7ea4e06ae1a2d470e23bdfe73f52272f7c8b4231fe62fd9846e2a3773dcface","src/remutex.rs":"2fc11fec14af2886e507104e501caf6fddcf199ee7db38eabcd35ab9cf430d89","src/rwlock.rs":"45b940a9d046c7ee0c295237abac45f694c32a247724d93e3879a79f6e60b399"},"package":"949826a5ccf18c1b3a7c3d57692778d21768b79e46eb9dd07bfc4c2160036c54"} \ No newline at end of file diff --git a/vendor/lock_api-0.1.3/Cargo.toml b/vendor/lock_api-0.1.3/Cargo.toml deleted file mode 100644 index ae2dc215ab..0000000000 --- a/vendor/lock_api-0.1.3/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies -# -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -name = "lock_api" -version = "0.1.3" -authors = ["Amanieu d'Antras <amanieu@gmail.com>"] -description = "Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std." -keywords = ["mutex", "rwlock", "lock", "no_std"] -categories = ["concurrency", "no-std"] -license = "Apache-2.0/MIT" -repository = "https://github.com/Amanieu/parking_lot" -[dependencies.owning_ref] -version = "0.3" -optional = true - -[dependencies.scopeguard] -version = "0.3" -default-features = false - -[features] -nightly = [] diff --git a/vendor/lock_api-0.1.3/src/lib.rs b/vendor/lock_api-0.1.3/src/lib.rs deleted file mode 100644 index cb031b705a..0000000000 --- a/vendor/lock_api-0.1.3/src/lib.rs +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2018 Amanieu d'Antras -// -// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or -// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or -// http://opensource.org/licenses/MIT>, at your option. This file may not be -// copied, modified, or distributed except according to those terms. - -//! This library provides type-safe and fully-featured `Mutex` and `RwLock` -//! types which wrap a simple raw mutex or rwlock type. This has several -//! benefits: not only does it eliminate a large portion of the work in -//! implementing custom lock types, it also allows users to write code which is -//! generic with regards to different lock implementations. -//! -//! Basic usage of this crate is very straightfoward: -//! -//! 1. Create a raw lock type. This should only contain the lock state, not any -//! data protected by the lock. -//! 2. Implement the `RawMutex` trait for your custom lock type. -//! 3. Export your mutex as a type alias for `lock_api::Mutex`, and -//! your mutex guard as a type alias for `lock_api::MutexGuard`. -//! See the [example](#example) below for details. -//! -//! This process is similar for RwLocks, except that two guards need to be -//! exported instead of one. (Or 3 guards if your type supports upgradable read -//! locks, see [extension traits](#extension-traits) below for details) -//! -//! # Example -//! -//! ``` -//! use lock_api::{RawMutex, Mutex}; -//! use std::sync::atomic::{AtomicBool, Ordering, ATOMIC_BOOL_INIT}; -//! -//! // 1. Define our raw lock type -//! pub struct RawSpinlock(AtomicBool); -//! -//! // 2. Implement RawMutex for this type -//! unsafe impl RawMutex for RawSpinlock { -//! const INIT: RawSpinlock = RawSpinlock(ATOMIC_BOOL_INIT); -//! -//! fn lock(&self) { -//! // Note: This isn't the best way of implementing a spinlock, but it -//! // suffices for the sake of this example. -//! while !self.try_lock() {} -//! } -//! -//! fn try_lock(&self) -> bool { -//! self.0.swap(true, Ordering::Acquire) -//! } -//! -//! fn unlock(&self) { -//! self.0.store(false, Ordering::Release); -//! } -//! } -//! -//! // 3. Export the wrappers. This are the types that your users will actually use. -//! pub type Spinlock<T> = lock_api::Mutex<RawSpinlock, T>; -//! pub type SpinlockGuard<'a, T> = lock_api::MutexGuard<'a, RawSpinlock, T>; -//! ``` -//! -//! # Extension traits -//! -//! In addition to basic locking & unlocking functionality, you have the option -//! of exposing additional functionality in your lock types by implementing -//! additional traits for it. Examples of extension features include: -//! -//! - Fair unlocking (`RawMutexFair`, `RawRwLockFair`) -//! - Lock timeouts (`RawMutexTimed`, `RawRwLockTimed`) -//! - Downgradable write locks (`RawRwLockDowngradable`) -//! - Recursive read locks (`RawRwLockRecursive`) -//! - Upgradable read locks (`RawRwLockUpgrade`) -//! -//! The `Mutex` and `RwLock` wrappers will automatically expose this additional -//! functionality if the raw lock type implements these extension traits. -//! -//! # Cargo features -//! -//! This crate supports two cargo features: -//! -//! - `owning_ref`: Allows your lock types to be used with the `owning_ref` crate. -//! - `nightly`: Enables nightly-only features. At the moment the only such -//! feature is `const fn` constructors for lock types. - -#![no_std] -#![warn(missing_docs)] -#![cfg_attr(feature = "nightly", feature(const_fn))] - -#[macro_use] -extern crate scopeguard; - -#[cfg(feature = "owning_ref")] -extern crate owning_ref; - -/// Marker type which indicates that the Guard type for a lock is `Send`. -pub struct GuardSend(()); - -/// Marker type which indicates that the Guard type for a lock is not `Send`. -pub struct GuardNoSend(*mut ()); - -mod mutex; -pub use mutex::*; - -mod remutex; -pub use remutex::*; - -mod rwlock; -pub use rwlock::*; diff --git a/vendor/lock_api-0.1.3/src/mutex.rs b/vendor/lock_api-0.1.3/src/mutex.rs deleted file mode 100644 index f2b838986f..0000000000 --- a/vendor/lock_api-0.1.3/src/mutex.rs +++ /dev/null @@ -1,496 +0,0 @@ -// Copyright 2018 Amanieu d'Antras -// -// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or -// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or -// http://opensource.org/licenses/MIT>, at your option. This file may not be -// copied, modified, or distributed except according to those terms. - -use core::cell::UnsafeCell; -use core::fmt; -use core::marker::PhantomData; -use core::mem; -use core::ops::{Deref, DerefMut}; - -#[cfg(feature = "owning_ref")] -use owning_ref::StableAddress; - -/// Basic operations for a mutex. -/// -/// Types implementing this trait can be used by `Mutex` to form a safe and -/// fully-functioning mutex type. -/// -/// # Safety -/// -/// Implementations of this trait must ensure that the mutex is actually -/// exclusive: a lock can't be acquired while the mutex is already locked. -pub unsafe trait RawMutex { - /// Initial value for an unlocked mutex. - const INIT: Self; - - /// Marker type which determines whether a lock guard should be `Send`. Use - /// one of the `GuardSend` or `GuardNoSend` helper types here. - type GuardMarker; - - /// Acquires this mutex, blocking the current thread until it is able to do so. - fn lock(&self); - - /// Attempts to acquire this mutex without blocking. - fn try_lock(&self) -> bool; - - /// Unlocks this mutex. - fn unlock(&self); -} - -/// Additional methods for mutexes which support fair unlocking. -/// -/// Fair unlocking means that a lock is handed directly over to the next waiting -/// thread if there is one, without giving other threads the opportunity to -/// "steal" the lock in the meantime. This is typically slower than unfair -/// unlocking, but may be necessary in certain circumstances. -pub unsafe trait RawMutexFair: RawMutex { - /// Unlocks this mutex using a fair unlock protocol. - fn unlock_fair(&self); - - /// Temporarily yields the mutex to a waiting thread if there is one. - /// - /// This method is functionally equivalent to calling `unlock_fair` followed - /// by `lock`, however it can be much more efficient in the case where there - /// are no waiting threads. - fn bump(&self) { - self.unlock_fair(); - self.lock(); - } -} - -/// Additional methods for mutexes which support locking with timeouts. -/// -/// The `Duration` and `Instant` types are specified as associated types so that -/// this trait is usable even in `no_std` environments. -pub unsafe trait RawMutexTimed: RawMutex { - /// Duration type used for `try_lock_for`. - type Duration; - - /// Instant type used for `try_lock_until`. - type Instant; - - /// Attempts to acquire this lock until a timeout is reached. - fn try_lock_for(&self, timeout: Self::Duration) -> bool; - - /// Attempts to acquire this lock until a timeout is reached. - fn try_lock_until(&self, timeout: Self::Instant) -> bool; -} - -/// A mutual exclusion primitive useful for protecting shared data -/// -/// This mutex will block threads waiting for the lock to become available. The -/// mutex can also be statically initialized or created via a `new` -/// constructor. Each mutex has a type parameter which represents the data that -/// it is protecting. The data can only be accessed through the RAII guards -/// returned from `lock` and `try_lock`, which guarantees that the data is only -/// ever accessed when the mutex is locked. -pub struct Mutex<R: RawMutex, T: ?Sized> { - raw: R, - data: UnsafeCell<T>, -} - -unsafe impl<R: RawMutex + Send, T: ?Sized + Send> Send for Mutex<R, T> {} -unsafe impl<R: RawMutex + Sync, T: ?Sized + Send> Sync for Mutex<R, T> {} - -impl<R: RawMutex, T> Mutex<R, T> { - /// Creates a new mutex in an unlocked state ready for use. - #[cfg(feature = "nightly")] - #[inline] - pub const fn new(val: T) -> Mutex<R, T> { - Mutex { - data: UnsafeCell::new(val), - raw: R::INIT, - } - } - - /// Creates a new mutex in an unlocked state ready for use. - #[cfg(not(feature = "nightly"))] - #[inline] - pub fn new(val: T) -> Mutex<R, T> { - Mutex { - data: UnsafeCell::new(val), - raw: R::INIT, - } - } - - /// Consumes this mutex, returning the underlying data. - #[inline] - #[allow(unused_unsafe)] - pub fn into_inner(self) -> T { - unsafe { self.data.into_inner() } - } -} - -impl<R: RawMutex, T: ?Sized> Mutex<R, T> { - #[inline] - fn guard(&self) -> MutexGuard<R, T> { - MutexGuard { - mutex: self, - marker: PhantomData, - } - } - - /// Acquires a mutex, blocking the current thread until it is able to do so. - /// - /// This function will block the local thread until it is available to acquire - /// the mutex. Upon returning, the thread is the only thread with the mutex - /// held. An RAII guard is returned to allow scoped unlock of the lock. When - /// the guard goes out of scope, the mutex will be unlocked. - /// - /// Attempts to lock a mutex in the thread which already holds the lock will - /// result in a deadlock. - #[inline] - pub fn lock(&self) -> MutexGuard<R, T> { - self.raw.lock(); - self.guard() - } - - /// Attempts to acquire this lock. - /// - /// If the lock could not be acquired at this time, then `None` is returned. - /// Otherwise, an RAII guard is returned. The lock will be unlocked when the - /// guard is dropped. - /// - /// This function does not block. - #[inline] - pub fn try_lock(&self) -> Option<MutexGuard<R, T>> { - if self.raw.try_lock() { - Some(self.guard()) - } else { - None - } - } - - /// Returns a mutable reference to the underlying data. - /// - /// Since this call borrows the `Mutex` mutably, no actual locking needs to - /// take place---the mutable borrow statically guarantees no locks exist. - #[inline] - pub fn get_mut(&mut self) -> &mut T { - unsafe { &mut *self.data.get() } - } - - /// Forcibly unlocks the mutex. - /// - /// This is useful when combined with `mem::forget` to hold a lock without - /// the need to maintain a `MutexGuard` object alive, for example when - /// dealing with FFI. - /// - /// # Safety - /// - /// This method must only be called if the current thread logically owns a - /// `MutexGuard` but that guard has be discarded using `mem::forget`. - /// Behavior is undefined if a mutex is unlocked when not locked. - #[inline] - pub unsafe fn force_unlock(&self) { - self.raw.unlock(); - } - - /// Returns the underlying raw mutex object. - /// - /// Note that you will most likely need to import the `RawMutex` trait from - /// `lock_api` to be able to call functions on the raw mutex. - /// - /// # Safety - /// - /// This method is unsafe because it allows unlocking a mutex while - /// still holding a reference to a `MutexGuard`. - #[inline] - pub unsafe fn raw(&self) -> &R { - &self.raw - } -} - -impl<R: RawMutexFair, T: ?Sized> Mutex<R, T> { - /// Forcibly unlocks the mutex using a fair unlock procotol. - /// - /// This is useful when combined with `mem::forget` to hold a lock without - /// the need to maintain a `MutexGuard` object alive, for example when - /// dealing with FFI. - /// - /// # Safety - /// - /// This method must only be called if the current thread logically owns a - /// `MutexGuard` but that guard has be discarded using `mem::forget`. - /// Behavior is undefined if a mutex is unlocked when not locked. - #[inline] - pub unsafe fn force_unlock_fair(&self) { - self.raw.unlock_fair(); - } -} - -impl<R: RawMutexTimed, T: ?Sized> Mutex<R, T> { - /// Attempts to acquire this lock until a timeout is reached. - /// - /// If the lock could not be acquired before the timeout expired, then - /// `None` is returned. Otherwise, an RAII guard is returned. The lock will - /// be unlocked when the guard is dropped. - #[inline] - pub fn try_lock_for(&self, timeout: R::Duration) -> Option<MutexGuard<R, T>> { - if self.raw.try_lock_for(timeout) { - Some(self.guard()) - } else { - None - } - } - - /// Attempts to acquire this lock until a timeout is reached. - /// - /// If the lock could not be acquired before the timeout expired, then - /// `None` is returned. Otherwise, an RAII guard is returned. The lock will - /// be unlocked when the guard is dropped. - #[inline] - pub fn try_lock_until(&self, timeout: R::Instant) -> Option<MutexGuard<R, T>> { - if self.raw.try_lock_until(timeout) { - Some(self.guard()) - } else { - None - } - } -} - -impl<R: RawMutex, T: ?Sized + Default> Default for Mutex<R, T> { - #[inline] - fn default() -> Mutex<R, T> { - Mutex::new(Default::default()) - } -} - -impl<R: RawMutex, T> From<T> for Mutex<R, T> { - #[inline] - fn from(t: T) -> Mutex<R, T> { - Mutex::new(t) - } -} - -impl<R: RawMutex, T: ?Sized + fmt::Debug> fmt::Debug for Mutex<R, T> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.try_lock() { - Some(guard) => f.debug_struct("Mutex").field("data", &&*guard).finish(), - None => f.pad("Mutex { <locked> }"), - } - } -} - -/// An RAII implementation of a "scoped lock" of a mutex. When this structure is -/// dropped (falls out of scope), the lock will be unlocked. -/// -/// The data protected by the mutex can be accessed through this guard via its -/// `Deref` and `DerefMut` implementations. -#[must_use] -pub struct MutexGuard<'a, R: RawMutex + 'a, T: ?Sized + 'a> { - mutex: &'a Mutex<R, T>, - marker: PhantomData<(&'a mut T, R::GuardMarker)>, -} - -unsafe impl<'a, R: RawMutex + Sync + 'a, T: ?Sized + Sync + 'a> Sync for MutexGuard<'a, R, T> {} - -impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> MutexGuard<'a, R, T> { - /// Returns a reference to the original `Mutex` object. - pub fn mutex(s: &Self) -> &'a Mutex<R, T> { - s.mutex - } - - /// Makes a new `MappedMutexGuard` for a component of the locked data. - /// - /// This operation cannot fail as the `MutexGuard` passed - /// in already locked the mutex. - /// - /// This is an associated function that needs to be - /// used as `MutexGuard::map(...)`. A method would interfere with methods of - /// the same name on the contents of the locked data. - #[inline] - pub fn map<U: ?Sized, F>(s: Self, f: F) -> MappedMutexGuard<'a, R, U> - where - F: FnOnce(&mut T) -> &mut U, - { - let raw = &s.mutex.raw; - let data = f(unsafe { &mut *s.mutex.data.get() }); - mem::forget(s); - MappedMutexGuard { - raw, - data, - marker: PhantomData, - } - } - - /// Temporarily unlocks the mutex to execute the given function. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the mutex. - #[inline] - pub fn unlocked<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.mutex.raw.unlock(); - defer!(s.mutex.raw.lock()); - f() - } -} - -impl<'a, R: RawMutexFair + 'a, T: ?Sized + 'a> MutexGuard<'a, R, T> { - /// Unlocks the mutex using a fair unlock protocol. - /// - /// By default, mutexes are unfair and allow the current thread to re-lock - /// the mutex before another has the chance to acquire the lock, even if - /// that thread has been blocked on the mutex for a long time. This is the - /// default because it allows much higher throughput as it avoids forcing a - /// context switch on every mutex unlock. This can result in one thread - /// acquiring a mutex many more times than other threads. - /// - /// However in some cases it can be beneficial to ensure fairness by forcing - /// the lock to pass on to a waiting thread if there is one. This is done by - /// using this method instead of dropping the `MutexGuard` normally. - #[inline] - pub fn unlock_fair(s: Self) { - s.mutex.raw.unlock_fair(); - mem::forget(s); - } - - /// Temporarily unlocks the mutex to execute the given function. - /// - /// The mutex is unlocked a fair unlock protocol. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the mutex. - #[inline] - pub fn unlocked_fair<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.mutex.raw.unlock_fair(); - defer!(s.mutex.raw.lock()); - f() - } - - /// Temporarily yields the mutex to a waiting thread if there is one. - /// - /// This method is functionally equivalent to calling `unlock_fair` followed - /// by `lock`, however it can be much more efficient in the case where there - /// are no waiting threads. - #[inline] - pub fn bump(s: &mut Self) { - s.mutex.raw.bump(); - } -} - -impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> Deref for MutexGuard<'a, R, T> { - type Target = T; - #[inline] - fn deref(&self) -> &T { - unsafe { &*self.mutex.data.get() } - } -} - -impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> DerefMut for MutexGuard<'a, R, T> { - #[inline] - fn deref_mut(&mut self) -> &mut T { - unsafe { &mut *self.mutex.data.get() } - } -} - -impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> Drop for MutexGuard<'a, R, T> { - #[inline] - fn drop(&mut self) { - self.mutex.raw.unlock(); - } -} - -#[cfg(feature = "owning_ref")] -unsafe impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> StableAddress for MutexGuard<'a, R, T> {} - -/// An RAII mutex guard returned by `MutexGuard::map`, which can point to a -/// subfield of the protected data. -/// -/// The main difference between `MappedMutexGuard` and `MutexGuard` is that the -/// former doesn't support temporarily unlocking and re-locking, since that -/// could introduce soundness issues if the locked object is modified by another -/// thread. -#[must_use] -pub struct MappedMutexGuard<'a, R: RawMutex + 'a, T: ?Sized + 'a> { - raw: &'a R, - data: *mut T, - marker: PhantomData<&'a mut T>, -} - -unsafe impl<'a, R: RawMutex + Sync + 'a, T: ?Sized + Sync + 'a> Sync - for MappedMutexGuard<'a, R, T> -{} -unsafe impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> Send for MappedMutexGuard<'a, R, T> where - R::GuardMarker: Send -{} - -impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> MappedMutexGuard<'a, R, T> { - /// Makes a new `MappedMutexGuard` for a component of the locked data. - /// - /// This operation cannot fail as the `MutexGuard` passed - /// in already locked the mutex. - /// - /// This is an associated function that needs to be - /// used as `MutexGuard::map(...)`. A method would interfere with methods of - /// the same name on the contents of the locked data. - #[inline] - pub fn map<U: ?Sized, F>(s: Self, f: F) -> MappedMutexGuard<'a, R, U> - where - F: FnOnce(&mut T) -> &mut U, - { - let raw = s.raw; - let data = f(unsafe { &mut *s.data }); - mem::forget(s); - MappedMutexGuard { - raw, - data, - marker: PhantomData, - } - } -} - -impl<'a, R: RawMutexFair + 'a, T: ?Sized + 'a> MappedMutexGuard<'a, R, T> { - /// Unlocks the mutex using a fair unlock protocol. - /// - /// By default, mutexes are unfair and allow the current thread to re-lock - /// the mutex before another has the chance to acquire the lock, even if - /// that thread has been blocked on the mutex for a long time. This is the - /// default because it allows much higher throughput as it avoids forcing a - /// context switch on every mutex unlock. This can result in one thread - /// acquiring a mutex many more times than other threads. - /// - /// However in some cases it can be beneficial to ensure fairness by forcing - /// the lock to pass on to a waiting thread if there is one. This is done by - /// using this method instead of dropping the `MutexGuard` normally. - #[inline] - pub fn unlock_fair(s: Self) { - s.raw.unlock_fair(); - mem::forget(s); - } -} - -impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> Deref for MappedMutexGuard<'a, R, T> { - type Target = T; - #[inline] - fn deref(&self) -> &T { - unsafe { &*self.data } - } -} - -impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> DerefMut for MappedMutexGuard<'a, R, T> { - #[inline] - fn deref_mut(&mut self) -> &mut T { - unsafe { &mut *self.data } - } -} - -impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> Drop for MappedMutexGuard<'a, R, T> { - #[inline] - fn drop(&mut self) { - self.raw.unlock(); - } -} - -#[cfg(feature = "owning_ref")] -unsafe impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> StableAddress for MappedMutexGuard<'a, R, T> {} diff --git a/vendor/lock_api-0.1.3/src/remutex.rs b/vendor/lock_api-0.1.3/src/remutex.rs deleted file mode 100644 index 3bede403e1..0000000000 --- a/vendor/lock_api-0.1.3/src/remutex.rs +++ /dev/null @@ -1,564 +0,0 @@ -// Copyright 2018 Amanieu d'Antras -// -// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or -// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or -// http://opensource.org/licenses/MIT>, at your option. This file may not be -// copied, modified, or distributed except according to those terms. - -use core::cell::{Cell, UnsafeCell}; -use core::fmt; -use core::marker::PhantomData; -use core::mem; -use core::ops::Deref; -use core::sync::atomic::{AtomicUsize, Ordering}; -use mutex::{RawMutex, RawMutexFair, RawMutexTimed}; -use GuardNoSend; - -#[cfg(feature = "owning_ref")] -use owning_ref::StableAddress; - -/// Helper trait which returns a non-zero thread ID. -/// -/// The simplest way to implement this trait is to return the address of a -/// thread-local variable. -/// -/// # Safety -/// -/// Implementations of this trait must ensure that no two active threads share -/// the same thread ID. However the ID of a thread that has exited can be -/// re-used since that thread is no longer active. -pub unsafe trait GetThreadId { - /// Initial value. - const INIT: Self; - - /// Returns a non-zero thread ID which identifies the current thread of - /// execution. - fn nonzero_thread_id(&self) -> usize; -} - -struct RawReentrantMutex<R: RawMutex, G: GetThreadId> { - owner: AtomicUsize, - lock_count: Cell<usize>, - mutex: R, - get_thread_id: G, -} - -impl<R: RawMutex, G: GetThreadId> RawReentrantMutex<R, G> { - #[inline] - fn lock_internal<F: FnOnce() -> bool>(&self, try_lock: F) -> bool { - let id = self.get_thread_id.nonzero_thread_id(); - if self.owner.load(Ordering::Relaxed) == id { - self.lock_count.set( - self.lock_count - .get() - .checked_add(1) - .expect("ReentrantMutex lock count overflow"), - ); - } else { - if !try_lock() { - return false; - } - self.owner.store(id, Ordering::Relaxed); - self.lock_count.set(1); - } - true - } - - #[inline] - fn lock(&self) { - self.lock_internal(|| { - self.mutex.lock(); - true - }); - } - - #[inline] - fn try_lock(&self) -> bool { - self.lock_internal(|| self.mutex.try_lock()) - } - - #[inline] - fn unlock(&self) { - let lock_count = self.lock_count.get() - 1; - if lock_count == 0 { - self.owner.store(0, Ordering::Relaxed); - self.mutex.unlock(); - } else { - self.lock_count.set(lock_count); - } - } -} - -impl<R: RawMutexFair, G: GetThreadId> RawReentrantMutex<R, G> { - #[inline] - fn unlock_fair(&self) { - let lock_count = self.lock_count.get() - 1; - if lock_count == 0 { - self.owner.store(0, Ordering::Relaxed); - self.mutex.unlock_fair(); - } else { - self.lock_count.set(lock_count); - } - } - - #[inline] - fn bump(&self) { - if self.lock_count.get() == 1 { - let id = self.owner.load(Ordering::Relaxed); - self.owner.store(0, Ordering::Relaxed); - self.mutex.bump(); - self.owner.store(id, Ordering::Relaxed); - } - } -} - -impl<R: RawMutexTimed, G: GetThreadId> RawReentrantMutex<R, G> { - #[inline] - fn try_lock_until(&self, timeout: R::Instant) -> bool { - self.lock_internal(|| self.mutex.try_lock_until(timeout)) - } - - #[inline] - fn try_lock_for(&self, timeout: R::Duration) -> bool { - self.lock_internal(|| self.mutex.try_lock_for(timeout)) - } -} - -/// A mutex which can be recursively locked by a single thread. -/// -/// This type is identical to `Mutex` except for the following points: -/// -/// - Locking multiple times from the same thread will work correctly instead of -/// deadlocking. -/// - `ReentrantMutexGuard` does not give mutable references to the locked data. -/// Use a `RefCell` if you need this. -/// -/// See [`Mutex`](struct.Mutex.html) for more details about the underlying mutex -/// primitive. -pub struct ReentrantMutex<R: RawMutex, G: GetThreadId, T: ?Sized> { - raw: RawReentrantMutex<R, G>, - data: UnsafeCell<T>, -} - -unsafe impl<R: RawMutex + Send, G: GetThreadId + Send, T: ?Sized + Send> Send - for ReentrantMutex<R, G, T> -{} -unsafe impl<R: RawMutex + Sync, G: GetThreadId + Sync, T: ?Sized + Send> Sync - for ReentrantMutex<R, G, T> -{} - -impl<R: RawMutex, G: GetThreadId, T> ReentrantMutex<R, G, T> { - /// Creates a new reentrant mutex in an unlocked state ready for use. - #[cfg(feature = "nightly")] - #[inline] - pub const fn new(val: T) -> ReentrantMutex<R, G, T> { - ReentrantMutex { - data: UnsafeCell::new(val), - raw: RawReentrantMutex { - owner: AtomicUsize::new(0), - lock_count: Cell::new(0), - mutex: R::INIT, - get_thread_id: G::INIT, - }, - } - } - - /// Creates a new reentrant mutex in an unlocked state ready for use. - #[cfg(not(feature = "nightly"))] - #[inline] - pub fn new(val: T) -> ReentrantMutex<R, G, T> { - ReentrantMutex { - data: UnsafeCell::new(val), - raw: RawReentrantMutex { - owner: AtomicUsize::new(0), - lock_count: Cell::new(0), - mutex: R::INIT, - get_thread_id: G::INIT, - }, - } - } - - /// Consumes this mutex, returning the underlying data. - #[inline] - #[allow(unused_unsafe)] - pub fn into_inner(self) -> T { - unsafe { self.data.into_inner() } - } -} - -impl<R: RawMutex, G: GetThreadId, T: ?Sized> ReentrantMutex<R, G, T> { - #[inline] - fn guard(&self) -> ReentrantMutexGuard<R, G, T> { - ReentrantMutexGuard { - remutex: &self, - marker: PhantomData, - } - } - - /// Acquires a reentrant mutex, blocking the current thread until it is able - /// to do so. - /// - /// If the mutex is held by another thread then this function will block the - /// local thread until it is available to acquire the mutex. If the mutex is - /// already held by the current thread then this function will increment the - /// lock reference count and return immediately. Upon returning, - /// the thread is the only thread with the mutex held. An RAII guard is - /// returned to allow scoped unlock of the lock. When the guard goes out of - /// scope, the mutex will be unlocked. - #[inline] - pub fn lock(&self) -> ReentrantMutexGuard<R, G, T> { - self.raw.lock(); - self.guard() - } - - /// Attempts to acquire this lock. - /// - /// If the lock could not be acquired at this time, then `None` is returned. - /// Otherwise, an RAII guard is returned. The lock will be unlocked when the - /// guard is dropped. - /// - /// This function does not block. - #[inline] - pub fn try_lock(&self) -> Option<ReentrantMutexGuard<R, G, T>> { - if self.raw.try_lock() { - Some(self.guard()) - } else { - None - } - } - - /// Returns a mutable reference to the underlying data. - /// - /// Since this call borrows the `ReentrantMutex` mutably, no actual locking needs to - /// take place---the mutable borrow statically guarantees no locks exist. - #[inline] - pub fn get_mut(&mut self) -> &mut T { - unsafe { &mut *self.data.get() } - } - - /// Forcibly unlocks the mutex. - /// - /// This is useful when combined with `mem::forget` to hold a lock without - /// the need to maintain a `ReentrantMutexGuard` object alive, for example when - /// dealing with FFI. - /// - /// # Safety - /// - /// This method must only be called if the current thread logically owns a - /// `ReentrantMutexGuard` but that guard has be discarded using `mem::forget`. - /// Behavior is undefined if a mutex is unlocked when not locked. - #[inline] - pub unsafe fn force_unlock(&self) { - self.raw.unlock(); - } - - /// Returns the underlying raw mutex object. - /// - /// Note that you will most likely need to import the `RawMutex` trait from - /// `lock_api` to be able to call functions on the raw mutex. - /// - /// # Safety - /// - /// This method is unsafe because it allows unlocking a mutex while - /// still holding a reference to a `ReentrantMutexGuard`. - #[inline] - pub unsafe fn raw(&self) -> &R { - &self.raw.mutex - } -} - -impl<R: RawMutexFair, G: GetThreadId, T: ?Sized> ReentrantMutex<R, G, T> { - /// Forcibly unlocks the mutex using a fair unlock procotol. - /// - /// This is useful when combined with `mem::forget` to hold a lock without - /// the need to maintain a `ReentrantMutexGuard` object alive, for example when - /// dealing with FFI. - /// - /// # Safety - /// - /// This method must only be called if the current thread logically owns a - /// `ReentrantMutexGuard` but that guard has be discarded using `mem::forget`. - /// Behavior is undefined if a mutex is unlocked when not locked. - #[inline] - pub unsafe fn force_unlock_fair(&self) { - self.raw.unlock_fair(); - } -} - -impl<R: RawMutexTimed, G: GetThreadId, T: ?Sized> ReentrantMutex<R, G, T> { - /// Attempts to acquire this lock until a timeout is reached. - /// - /// If the lock could not be acquired before the timeout expired, then - /// `None` is returned. Otherwise, an RAII guard is returned. The lock will - /// be unlocked when the guard is dropped. - #[inline] - pub fn try_lock_for(&self, timeout: R::Duration) -> Option<ReentrantMutexGuard<R, G, T>> { - if self.raw.try_lock_for(timeout) { - Some(self.guard()) - } else { - None - } - } - - /// Attempts to acquire this lock until a timeout is reached. - /// - /// If the lock could not be acquired before the timeout expired, then - /// `None` is returned. Otherwise, an RAII guard is returned. The lock will - /// be unlocked when the guard is dropped. - #[inline] - pub fn try_lock_until(&self, timeout: R::Instant) -> Option<ReentrantMutexGuard<R, G, T>> { - if self.raw.try_lock_until(timeout) { - Some(self.guard()) - } else { - None - } - } -} - -impl<R: RawMutex, G: GetThreadId, T: ?Sized + Default> Default for ReentrantMutex<R, G, T> { - #[inline] - fn default() -> ReentrantMutex<R, G, T> { - ReentrantMutex::new(Default::default()) - } -} - -impl<R: RawMutex, G: GetThreadId, T> From<T> for ReentrantMutex<R, G, T> { - #[inline] - fn from(t: T) -> ReentrantMutex<R, G, T> { - ReentrantMutex::new(t) - } -} - -impl<R: RawMutex, G: GetThreadId, T: ?Sized + fmt::Debug> fmt::Debug for ReentrantMutex<R, G, T> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.try_lock() { - Some(guard) => f - .debug_struct("ReentrantMutex") - .field("data", &&*guard) - .finish(), - None => f.pad("ReentrantMutex { <locked> }"), - } - } -} - -/// An RAII implementation of a "scoped lock" of a reentrant mutex. When this structure -/// is dropped (falls out of scope), the lock will be unlocked. -/// -/// The data protected by the mutex can be accessed through this guard via its -/// `Deref` implementation. -#[must_use] -pub struct ReentrantMutexGuard<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> { - remutex: &'a ReentrantMutex<R, G, T>, - marker: PhantomData<(&'a T, GuardNoSend)>, -} - -unsafe impl<'a, R: RawMutex + Sync + 'a, G: GetThreadId + Sync + 'a, T: ?Sized + Sync + 'a> Sync - for ReentrantMutexGuard<'a, R, G, T> -{} - -impl<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> ReentrantMutexGuard<'a, R, G, T> { - /// Returns a reference to the original `ReentrantMutex` object. - pub fn remutex(s: &Self) -> &'a ReentrantMutex<R, G, T> { - s.remutex - } - - /// Makes a new `MappedReentrantMutexGuard` for a component of the locked data. - /// - /// This operation cannot fail as the `ReentrantMutexGuard` passed - /// in already locked the mutex. - /// - /// This is an associated function that needs to be - /// used as `ReentrantMutexGuard::map(...)`. A method would interfere with methods of - /// the same name on the contents of the locked data. - #[inline] - pub fn map<U: ?Sized, F>(s: Self, f: F) -> MappedReentrantMutexGuard<'a, R, G, U> - where - F: FnOnce(&T) -> &U, - { - let raw = &s.remutex.raw; - let data = f(unsafe { &*s.remutex.data.get() }); - mem::forget(s); - MappedReentrantMutexGuard { - raw, - data, - marker: PhantomData, - } - } - - /// Temporarily unlocks the mutex to execute the given function. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the mutex. - #[inline] - pub fn unlocked<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.remutex.raw.unlock(); - defer!(s.remutex.raw.lock()); - f() - } -} - -impl<'a, R: RawMutexFair + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> - ReentrantMutexGuard<'a, R, G, T> -{ - /// Unlocks the mutex using a fair unlock protocol. - /// - /// By default, mutexes are unfair and allow the current thread to re-lock - /// the mutex before another has the chance to acquire the lock, even if - /// that thread has been blocked on the mutex for a long time. This is the - /// default because it allows much higher throughput as it avoids forcing a - /// context switch on every mutex unlock. This can result in one thread - /// acquiring a mutex many more times than other threads. - /// - /// However in some cases it can be beneficial to ensure fairness by forcing - /// the lock to pass on to a waiting thread if there is one. This is done by - /// using this method instead of dropping the `ReentrantMutexGuard` normally. - #[inline] - pub fn unlock_fair(s: Self) { - s.remutex.raw.unlock_fair(); - mem::forget(s); - } - - /// Temporarily unlocks the mutex to execute the given function. - /// - /// The mutex is unlocked a fair unlock protocol. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the mutex. - #[inline] - pub fn unlocked_fair<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.remutex.raw.unlock_fair(); - defer!(s.remutex.raw.lock()); - f() - } - - /// Temporarily yields the mutex to a waiting thread if there is one. - /// - /// This method is functionally equivalent to calling `unlock_fair` followed - /// by `lock`, however it can be much more efficient in the case where there - /// are no waiting threads. - #[inline] - pub fn bump(s: &mut Self) { - s.remutex.raw.bump(); - } -} - -impl<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> Deref - for ReentrantMutexGuard<'a, R, G, T> -{ - type Target = T; - #[inline] - fn deref(&self) -> &T { - unsafe { &*self.remutex.data.get() } - } -} - -impl<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> Drop - for ReentrantMutexGuard<'a, R, G, T> -{ - #[inline] - fn drop(&mut self) { - self.remutex.raw.unlock(); - } -} - -#[cfg(feature = "owning_ref")] -unsafe impl<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> StableAddress - for ReentrantMutexGuard<'a, R, G, T> -{} - -/// An RAII mutex guard returned by `ReentrantMutexGuard::map`, which can point to a -/// subfield of the protected data. -/// -/// The main difference between `MappedReentrantMutexGuard` and `ReentrantMutexGuard` is that the -/// former doesn't support temporarily unlocking and re-locking, since that -/// could introduce soundness issues if the locked object is modified by another -/// thread. -#[must_use] -pub struct MappedReentrantMutexGuard<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> { - raw: &'a RawReentrantMutex<R, G>, - data: *const T, - marker: PhantomData<&'a T>, -} - -unsafe impl<'a, R: RawMutex + Sync + 'a, G: GetThreadId + Sync + 'a, T: ?Sized + Sync + 'a> Sync - for MappedReentrantMutexGuard<'a, R, G, T> -{} - -impl<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> - MappedReentrantMutexGuard<'a, R, G, T> -{ - /// Makes a new `MappedReentrantMutexGuard` for a component of the locked data. - /// - /// This operation cannot fail as the `ReentrantMutexGuard` passed - /// in already locked the mutex. - /// - /// This is an associated function that needs to be - /// used as `ReentrantMutexGuard::map(...)`. A method would interfere with methods of - /// the same name on the contents of the locked data. - #[inline] - pub fn map<U: ?Sized, F>(s: Self, f: F) -> MappedReentrantMutexGuard<'a, R, G, U> - where - F: FnOnce(&T) -> &U, - { - let raw = s.raw; - let data = f(unsafe { &*s.data }); - mem::forget(s); - MappedReentrantMutexGuard { - raw, - data, - marker: PhantomData, - } - } -} - -impl<'a, R: RawMutexFair + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> - MappedReentrantMutexGuard<'a, R, G, T> -{ - /// Unlocks the mutex using a fair unlock protocol. - /// - /// By default, mutexes are unfair and allow the current thread to re-lock - /// the mutex before another has the chance to acquire the lock, even if - /// that thread has been blocked on the mutex for a long time. This is the - /// default because it allows much higher throughput as it avoids forcing a - /// context switch on every mutex unlock. This can result in one thread - /// acquiring a mutex many more times than other threads. - /// - /// However in some cases it can be beneficial to ensure fairness by forcing - /// the lock to pass on to a waiting thread if there is one. This is done by - /// using this method instead of dropping the `ReentrantMutexGuard` normally. - #[inline] - pub fn unlock_fair(s: Self) { - s.raw.unlock_fair(); - mem::forget(s); - } -} - -impl<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> Deref - for MappedReentrantMutexGuard<'a, R, G, T> -{ - type Target = T; - #[inline] - fn deref(&self) -> &T { - unsafe { &*self.data } - } -} - -impl<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> Drop - for MappedReentrantMutexGuard<'a, R, G, T> -{ - #[inline] - fn drop(&mut self) { - self.raw.unlock(); - } -} - -#[cfg(feature = "owning_ref")] -unsafe impl<'a, R: RawMutex + 'a, G: GetThreadId + 'a, T: ?Sized + 'a> StableAddress - for MappedReentrantMutexGuard<'a, R, G, T> -{} diff --git a/vendor/lock_api-0.1.3/src/rwlock.rs b/vendor/lock_api-0.1.3/src/rwlock.rs deleted file mode 100644 index 904ff95791..0000000000 --- a/vendor/lock_api-0.1.3/src/rwlock.rs +++ /dev/null @@ -1,1345 +0,0 @@ -// Copyright 2016 Amanieu d'Antras -// -// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or -// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or -// http://opensource.org/licenses/MIT>, at your option. This file may not be -// copied, modified, or distributed except according to those terms. - -use core::cell::UnsafeCell; -use core::fmt; -use core::marker::PhantomData; -use core::mem; -use core::ops::{Deref, DerefMut}; - -#[cfg(feature = "owning_ref")] -use owning_ref::StableAddress; - -/// Basic operations for a reader-writer lock. -/// -/// Types implementing this trait can be used by `RwLock` to form a safe and -/// fully-functioning `RwLock` type. -/// -/// # Safety -/// -/// Implementations of this trait must ensure that the `RwLock` is actually -/// exclusive: an exclusive lock can't be acquired while an exclusive or shared -/// lock exists, and a shared lock can't be acquire while an exclusive lock -/// exists. -pub unsafe trait RawRwLock { - /// Initial value for an unlocked `RwLock`. - const INIT: Self; - - /// Marker type which determines whether a lock guard should be `Send`. Use - /// one of the `GuardSend` or `GuardNoSend` helper types here. - type GuardMarker; - - /// Acquires a shared lock, blocking the current thread until it is able to do so. - fn lock_shared(&self); - - /// Attempts to acquire a shared lock without blocking. - fn try_lock_shared(&self) -> bool; - - /// Releases a shared lock. - fn unlock_shared(&self); - - /// Acquires an exclusive lock, blocking the current thread until it is able to do so. - fn lock_exclusive(&self); - - /// Attempts to acquire an exclusive lock without blocking. - fn try_lock_exclusive(&self) -> bool; - - /// Releases an exclusive lock. - fn unlock_exclusive(&self); -} - -/// Additional methods for RwLocks which support fair unlocking. -/// -/// Fair unlocking means that a lock is handed directly over to the next waiting -/// thread if there is one, without giving other threads the opportunity to -/// "steal" the lock in the meantime. This is typically slower than unfair -/// unlocking, but may be necessary in certain circumstances. -pub unsafe trait RawRwLockFair: RawRwLock { - /// Releases a shared lock using a fair unlock protocol. - fn unlock_shared_fair(&self); - - /// Releases an exclusive lock using a fair unlock protocol. - fn unlock_exclusive_fair(&self); - - /// Temporarily yields a shared lock to a waiting thread if there is one. - /// - /// This method is functionally equivalent to calling `unlock_shared_fair` followed - /// by `lock_shared`, however it can be much more efficient in the case where there - /// are no waiting threads. - fn bump_shared(&self) { - self.unlock_shared_fair(); - self.lock_shared(); - } - - /// Temporarily yields an exclusive lock to a waiting thread if there is one. - /// - /// This method is functionally equivalent to calling `unlock_exclusive_fair` followed - /// by `lock_exclusive`, however it can be much more efficient in the case where there - /// are no waiting threads. - fn bump_exclusive(&self) { - self.unlock_exclusive_fair(); - self.lock_exclusive(); - } -} - -/// Additional methods for RwLocks which support atomically downgrading an -/// exclusive lock to a shared lock. -pub unsafe trait RawRwLockDowngrade: RawRwLock { - /// Atomically downgrades an exclusive lock into a shared lock without - /// allowing any thread to take an exclusive lock in the meantime. - fn downgrade(&self); -} - -/// Additional methods for RwLocks which support locking with timeouts. -/// -/// The `Duration` and `Instant` types are specified as associated types so that -/// this trait is usable even in `no_std` environments. -pub unsafe trait RawRwLockTimed: RawRwLock { - /// Duration type used for `try_lock_for`. - type Duration; - - /// Instant type used for `try_lock_until`. - type Instant; - - /// Attempts to acquire a shared lock until a timeout is reached. - fn try_lock_shared_for(&self, timeout: Self::Duration) -> bool; - - /// Attempts to acquire a shared lock until a timeout is reached. - fn try_lock_shared_until(&self, timeout: Self::Instant) -> bool; - - /// Attempts to acquire an exclusive lock until a timeout is reached. - fn try_lock_exclusive_for(&self, timeout: Self::Duration) -> bool; - - /// Attempts to acquire an exclusive lock until a timeout is reached. - fn try_lock_exclusive_until(&self, timeout: Self::Instant) -> bool; -} - -/// Additional methods for RwLocks which support recursive read locks. -/// -/// These are guaranteed to succeed without blocking if -/// another read lock is held at the time of the call. This allows a thread -/// to recursively lock a `RwLock`. However using this method can cause -/// writers to starve since readers no longer block if a writer is waiting -/// for the lock. -pub unsafe trait RawRwLockRecursive: RawRwLock { - /// Acquires a shared lock without deadlocking in case of a recursive lock. - fn lock_shared_recursive(&self); - - /// Attempts to acquire a shared lock without deadlocking in case of a recursive lock. - fn try_lock_shared_recursive(&self) -> bool; -} - -/// Additional methods for RwLocks which support recursive read locks and timeouts. -pub unsafe trait RawRwLockRecursiveTimed: RawRwLockRecursive + RawRwLockTimed { - /// Attempts to acquire a shared lock until a timeout is reached, without - /// deadlocking in case of a recursive lock. - fn try_lock_shared_recursive_for(&self, timeout: Self::Duration) -> bool; - - /// Attempts to acquire a shared lock until a timeout is reached, without - /// deadlocking in case of a recursive lock. - fn try_lock_shared_recursive_until(&self, timeout: Self::Instant) -> bool; -} - -/// Additional methods for RwLocks which support atomically upgrading a shared -/// lock to an exclusive lock. -/// -/// This requires acquiring a special "upgradable read lock" instead of a -/// normal shared lock. There may only be one upgradable lock at any time, -/// otherwise deadlocks could occur when upgrading. -pub unsafe trait RawRwLockUpgrade: RawRwLock { - /// Acquires an upgradable lock, blocking the current thread until it is able to do so. - fn lock_upgradable(&self); - - /// Attempts to acquire an upgradable lock without blocking. - fn try_lock_upgradable(&self) -> bool; - - /// Releases an upgradable lock. - fn unlock_upgradable(&self); - - /// Upgrades an upgradable lock to an exclusive lock. - fn upgrade(&self); - - /// Attempts to upgrade an upgradable lock to an exclusive lock without - /// blocking. - fn try_upgrade(&self) -> bool; -} - -/// Additional methods for RwLocks which support upgradable locks and fair -/// unlocking. -pub unsafe trait RawRwLockUpgradeFair: RawRwLockUpgrade + RawRwLockFair { - /// Releases an upgradable lock using a fair unlock protocol. - fn unlock_upgradable_fair(&self); - - /// Temporarily yields an upgradable lock to a waiting thread if there is one. - /// - /// This method is functionally equivalent to calling `unlock_upgradable_fair` followed - /// by `lock_upgradable`, however it can be much more efficient in the case where there - /// are no waiting threads. - fn bump_upgradable(&self) { - self.unlock_upgradable_fair(); - self.lock_upgradable(); - } -} - -/// Additional methods for RwLocks which support upgradable locks and lock -/// downgrading. -pub unsafe trait RawRwLockUpgradeDowngrade: RawRwLockUpgrade + RawRwLockDowngrade { - /// Downgrades an upgradable lock to a shared lock. - fn downgrade_upgradable(&self); - - /// Downgrades an exclusive lock to an upgradable lock. - fn downgrade_to_upgradable(&self); -} - -/// Additional methods for RwLocks which support upgradable locks and locking -/// with timeouts. -pub unsafe trait RawRwLockUpgradeTimed: RawRwLockUpgrade + RawRwLockTimed { - /// Attempts to acquire an upgradable lock until a timeout is reached. - fn try_lock_upgradable_for(&self, timeout: Self::Duration) -> bool; - - /// Attempts to acquire an upgradable lock until a timeout is reached. - fn try_lock_upgradable_until(&self, timeout: Self::Instant) -> bool; - - /// Attempts to upgrade an upgradable lock to an exclusive lock until a - /// timeout is reached. - fn try_upgrade_for(&self, timeout: Self::Duration) -> bool; - - /// Attempts to upgrade an upgradable lock to an exclusive lock until a - /// timeout is reached. - fn try_upgrade_until(&self, timeout: Self::Instant) -> bool; -} - -/// A reader-writer lock -/// -/// This type of lock allows a number of readers or at most one writer at any -/// point in time. The write portion of this lock typically allows modification -/// of the underlying data (exclusive access) and the read portion of this lock -/// typically allows for read-only access (shared access). -/// -/// The type parameter `T` represents the data that this lock protects. It is -/// required that `T` satisfies `Send` to be shared across threads and `Sync` to -/// allow concurrent access through readers. The RAII guards returned from the -/// locking methods implement `Deref` (and `DerefMut` for the `write` methods) -/// to allow access to the contained of the lock. -pub struct RwLock<R: RawRwLock, T: ?Sized> { - raw: R, - data: UnsafeCell<T>, -} - -unsafe impl<R: RawRwLock + Send, T: ?Sized + Send> Send for RwLock<R, T> {} -unsafe impl<R: RawRwLock + Sync, T: ?Sized + Send + Sync> Sync for RwLock<R, T> {} - -impl<R: RawRwLock, T> RwLock<R, T> { - /// Creates a new instance of an `RwLock<T>` which is unlocked. - #[cfg(feature = "nightly")] - #[inline] - pub const fn new(val: T) -> RwLock<R, T> { - RwLock { - data: UnsafeCell::new(val), - raw: R::INIT, - } - } - - /// Creates a new instance of an `RwLock<T>` which is unlocked. - #[cfg(not(feature = "nightly"))] - #[inline] - pub fn new(val: T) -> RwLock<R, T> { - RwLock { - data: UnsafeCell::new(val), - raw: R::INIT, - } - } - - /// Consumes this `RwLock`, returning the underlying data. - #[inline] - #[allow(unused_unsafe)] - pub fn into_inner(self) -> T { - unsafe { self.data.into_inner() } - } -} - -impl<R: RawRwLock, T: ?Sized> RwLock<R, T> { - #[inline] - fn read_guard(&self) -> RwLockReadGuard<R, T> { - RwLockReadGuard { - rwlock: self, - marker: PhantomData, - } - } - - #[inline] - fn write_guard(&self) -> RwLockWriteGuard<R, T> { - RwLockWriteGuard { - rwlock: self, - marker: PhantomData, - } - } - - /// Locks this `RwLock` with shared read access, blocking the current thread - /// until it can be acquired. - /// - /// The calling thread will be blocked until there are no more writers which - /// hold the lock. There may be other readers currently inside the lock when - /// this method returns. - /// - /// Note that attempts to recursively acquire a read lock on a `RwLock` when - /// the current thread already holds one may result in a deadlock. - /// - /// Returns an RAII guard which will release this thread's shared access - /// once it is dropped. - #[inline] - pub fn read(&self) -> RwLockReadGuard<R, T> { - self.raw.lock_shared(); - self.read_guard() - } - - /// Attempts to acquire this `RwLock` with shared read access. - /// - /// If the access could not be granted at this time, then `None` is returned. - /// Otherwise, an RAII guard is returned which will release the shared access - /// when it is dropped. - /// - /// This function does not block. - #[inline] - pub fn try_read(&self) -> Option<RwLockReadGuard<R, T>> { - if self.raw.try_lock_shared() { - Some(self.read_guard()) - } else { - None - } - } - - /// Locks this `RwLock` with exclusive write access, blocking the current - /// thread until it can be acquired. - /// - /// This function will not return while other writers or other readers - /// currently have access to the lock. - /// - /// Returns an RAII guard which will drop the write access of this `RwLock` - /// when dropped. - #[inline] - pub fn write(&self) -> RwLockWriteGuard<R, T> { - self.raw.lock_exclusive(); - self.write_guard() - } - - /// Attempts to lock this `RwLock` with exclusive write access. - /// - /// If the lock could not be acquired at this time, then `None` is returned. - /// Otherwise, an RAII guard is returned which will release the lock when - /// it is dropped. - /// - /// This function does not block. - #[inline] - pub fn try_write(&self) -> Option<RwLockWriteGuard<R, T>> { - if self.raw.try_lock_exclusive() { - Some(self.write_guard()) - } else { - None - } - } - - /// Returns a mutable reference to the underlying data. - /// - /// Since this call borrows the `RwLock` mutably, no actual locking needs to - /// take place---the mutable borrow statically guarantees no locks exist. - #[inline] - pub fn get_mut(&mut self) -> &mut T { - unsafe { &mut *self.data.get() } - } - - /// Forcibly unlocks a read lock. - /// - /// This is useful when combined with `mem::forget` to hold a lock without - /// the need to maintain a `RwLockReadGuard` object alive, for example when - /// dealing with FFI. - /// - /// # Safety - /// - /// This method must only be called if the current thread logically owns a - /// `RwLockReadGuard` but that guard has be discarded using `mem::forget`. - /// Behavior is undefined if a rwlock is read-unlocked when not read-locked. - #[inline] - pub unsafe fn force_unlock_read(&self) { - self.raw.unlock_shared(); - } - - /// Forcibly unlocks a write lock. - /// - /// This is useful when combined with `mem::forget` to hold a lock without - /// the need to maintain a `RwLockWriteGuard` object alive, for example when - /// dealing with FFI. - /// - /// # Safety - /// - /// This method must only be called if the current thread logically owns a - /// `RwLockWriteGuard` but that guard has be discarded using `mem::forget`. - /// Behavior is undefined if a rwlock is write-unlocked when not write-locked. - #[inline] - pub unsafe fn force_unlock_write(&self) { - self.raw.unlock_exclusive(); - } - - /// Returns the underlying raw reader-writer lock object. - /// - /// Note that you will most likely need to import the `RawRwLock` trait from - /// `lock_api` to be able to call functions on the raw - /// reader-writer lock. - /// - /// # Safety - /// - /// This method is unsafe because it allows unlocking a mutex while - /// still holding a reference to a lock guard. - pub unsafe fn raw(&self) -> &R { - &self.raw - } -} - -impl<R: RawRwLockFair, T: ?Sized> RwLock<R, T> { - /// Forcibly unlocks a read lock using a fair unlock procotol. - /// - /// This is useful when combined with `mem::forget` to hold a lock without - /// the need to maintain a `RwLockReadGuard` object alive, for example when - /// dealing with FFI. - /// - /// # Safety - /// - /// This method must only be called if the current thread logically owns a - /// `RwLockReadGuard` but that guard has be discarded using `mem::forget`. - /// Behavior is undefined if a rwlock is read-unlocked when not read-locked. - #[inline] - pub unsafe fn force_unlock_read_fair(&self) { - self.raw.unlock_shared_fair(); - } - - /// Forcibly unlocks a write lock using a fair unlock procotol. - /// - /// This is useful when combined with `mem::forget` to hold a lock without - /// the need to maintain a `RwLockWriteGuard` object alive, for example when - /// dealing with FFI. - /// - /// # Safety - /// - /// This method must only be called if the current thread logically owns a - /// `RwLockWriteGuard` but that guard has be discarded using `mem::forget`. - /// Behavior is undefined if a rwlock is write-unlocked when not write-locked. - #[inline] - pub unsafe fn force_unlock_write_fair(&self) { - self.raw.unlock_exclusive_fair(); - } -} - -impl<R: RawRwLockTimed, T: ?Sized> RwLock<R, T> { - /// Attempts to acquire this `RwLock` with shared read access until a timeout - /// is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// `None` is returned. Otherwise, an RAII guard is returned which will - /// release the shared access when it is dropped. - #[inline] - pub fn try_read_for(&self, timeout: R::Duration) -> Option<RwLockReadGuard<R, T>> { - if self.raw.try_lock_shared_for(timeout) { - Some(self.read_guard()) - } else { - None - } - } - - /// Attempts to acquire this `RwLock` with shared read access until a timeout - /// is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// `None` is returned. Otherwise, an RAII guard is returned which will - /// release the shared access when it is dropped. - #[inline] - pub fn try_read_until(&self, timeout: R::Instant) -> Option<RwLockReadGuard<R, T>> { - if self.raw.try_lock_shared_until(timeout) { - Some(self.read_guard()) - } else { - None - } - } - - /// Attempts to acquire this `RwLock` with exclusive write access until a - /// timeout is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// `None` is returned. Otherwise, an RAII guard is returned which will - /// release the exclusive access when it is dropped. - #[inline] - pub fn try_write_for(&self, timeout: R::Duration) -> Option<RwLockWriteGuard<R, T>> { - if self.raw.try_lock_exclusive_for(timeout) { - Some(self.write_guard()) - } else { - None - } - } - - /// Attempts to acquire this `RwLock` with exclusive write access until a - /// timeout is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// `None` is returned. Otherwise, an RAII guard is returned which will - /// release the exclusive access when it is dropped. - #[inline] - pub fn try_write_until(&self, timeout: R::Instant) -> Option<RwLockWriteGuard<R, T>> { - if self.raw.try_lock_exclusive_until(timeout) { - Some(self.write_guard()) - } else { - None - } - } -} - -impl<R: RawRwLockRecursive, T: ?Sized> RwLock<R, T> { - /// Locks this `RwLock` with shared read access, blocking the current thread - /// until it can be acquired. - /// - /// The calling thread will be blocked until there are no more writers which - /// hold the lock. There may be other readers currently inside the lock when - /// this method returns. - /// - /// Unlike `read`, this method is guaranteed to succeed without blocking if - /// another read lock is held at the time of the call. This allows a thread - /// to recursively lock a `RwLock`. However using this method can cause - /// writers to starve since readers no longer block if a writer is waiting - /// for the lock. - /// - /// Returns an RAII guard which will release this thread's shared access - /// once it is dropped. - #[inline] - pub fn read_recursive(&self) -> RwLockReadGuard<R, T> { - self.raw.lock_shared_recursive(); - self.read_guard() - } - - /// Attempts to acquire this `RwLock` with shared read access. - /// - /// If the access could not be granted at this time, then `None` is returned. - /// Otherwise, an RAII guard is returned which will release the shared access - /// when it is dropped. - /// - /// This method is guaranteed to succeed if another read lock is held at the - /// time of the call. See the documentation for `read_recursive` for details. - /// - /// This function does not block. - #[inline] - pub fn try_read_recursive(&self) -> Option<RwLockReadGuard<R, T>> { - if self.raw.try_lock_shared_recursive() { - Some(self.read_guard()) - } else { - None - } - } -} - -impl<R: RawRwLockRecursiveTimed, T: ?Sized> RwLock<R, T> { - /// Attempts to acquire this `RwLock` with shared read access until a timeout - /// is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// `None` is returned. Otherwise, an RAII guard is returned which will - /// release the shared access when it is dropped. - /// - /// This method is guaranteed to succeed without blocking if another read - /// lock is held at the time of the call. See the documentation for - /// `read_recursive` for details. - #[inline] - pub fn try_read_recursive_for(&self, timeout: R::Duration) -> Option<RwLockReadGuard<R, T>> { - if self.raw.try_lock_shared_recursive_for(timeout) { - Some(self.read_guard()) - } else { - None - } - } - - /// Attempts to acquire this `RwLock` with shared read access until a timeout - /// is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// `None` is returned. Otherwise, an RAII guard is returned which will - /// release the shared access when it is dropped. - #[inline] - pub fn try_read_recursive_until(&self, timeout: R::Instant) -> Option<RwLockReadGuard<R, T>> { - if self.raw.try_lock_shared_recursive_until(timeout) { - Some(self.read_guard()) - } else { - None - } - } -} - -impl<R: RawRwLockUpgrade, T: ?Sized> RwLock<R, T> { - #[inline] - fn upgradable_guard(&self) -> RwLockUpgradableReadGuard<R, T> { - RwLockUpgradableReadGuard { - rwlock: self, - marker: PhantomData, - } - } - - /// Locks this `RwLock` with upgradable read access, blocking the current thread - /// until it can be acquired. - /// - /// The calling thread will be blocked until there are no more writers or other - /// upgradable reads which hold the lock. There may be other readers currently - /// inside the lock when this method returns. - /// - /// Returns an RAII guard which will release this thread's shared access - /// once it is dropped. - #[inline] - pub fn upgradable_read(&self) -> RwLockUpgradableReadGuard<R, T> { - self.raw.lock_upgradable(); - self.upgradable_guard() - } - - /// Attempts to acquire this `RwLock` with upgradable read access. - /// - /// If the access could not be granted at this time, then `None` is returned. - /// Otherwise, an RAII guard is returned which will release the shared access - /// when it is dropped. - /// - /// This function does not block. - #[inline] - pub fn try_upgradable_read(&self) -> Option<RwLockUpgradableReadGuard<R, T>> { - if self.raw.try_lock_upgradable() { - Some(self.upgradable_guard()) - } else { - None - } - } -} - -impl<R: RawRwLockUpgradeTimed, T: ?Sized> RwLock<R, T> { - /// Attempts to acquire this `RwLock` with upgradable read access until a timeout - /// is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// `None` is returned. Otherwise, an RAII guard is returned which will - /// release the shared access when it is dropped. - #[inline] - pub fn try_upgradable_read_for( - &self, - timeout: R::Duration, - ) -> Option<RwLockUpgradableReadGuard<R, T>> { - if self.raw.try_lock_upgradable_for(timeout) { - Some(self.upgradable_guard()) - } else { - None - } - } - - /// Attempts to acquire this `RwLock` with upgradable read access until a timeout - /// is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// `None` is returned. Otherwise, an RAII guard is returned which will - /// release the shared access when it is dropped. - #[inline] - pub fn try_upgradable_read_until( - &self, - timeout: R::Instant, - ) -> Option<RwLockUpgradableReadGuard<R, T>> { - if self.raw.try_lock_upgradable_until(timeout) { - Some(self.upgradable_guard()) - } else { - None - } - } -} - -impl<R: RawRwLock, T: ?Sized + Default> Default for RwLock<R, T> { - #[inline] - fn default() -> RwLock<R, T> { - RwLock::new(Default::default()) - } -} - -impl<R: RawRwLock, T> From<T> for RwLock<R, T> { - #[inline] - fn from(t: T) -> RwLock<R, T> { - RwLock::new(t) - } -} - -impl<R: RawRwLock, T: ?Sized + fmt::Debug> fmt::Debug for RwLock<R, T> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.try_read() { - Some(guard) => f.debug_struct("RwLock").field("data", &&*guard).finish(), - None => f.pad("RwLock { <locked> }"), - } - } -} - -/// RAII structure used to release the shared read access of a lock when -/// dropped. -#[must_use] -pub struct RwLockReadGuard<'a, R: RawRwLock + 'a, T: ?Sized + 'a> { - rwlock: &'a RwLock<R, T>, - marker: PhantomData<(&'a T, R::GuardMarker)>, -} - -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + Sync + 'a> Sync for RwLockReadGuard<'a, R, T> {} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> RwLockReadGuard<'a, R, T> { - /// Returns a reference to the original reader-writer lock object. - pub fn rwlock(s: &Self) -> &'a RwLock<R, T> { - s.rwlock - } - - /// Make a new `MappedRwLockReadGuard` for a component of the locked data. - /// - /// This operation cannot fail as the `RwLockReadGuard` passed - /// in already locked the data. - /// - /// This is an associated function that needs to be - /// used as `RwLockReadGuard::map(...)`. A method would interfere with methods of - /// the same name on the contents of the locked data. - #[inline] - pub fn map<U: ?Sized, F>(s: Self, f: F) -> MappedRwLockReadGuard<'a, R, U> - where - F: FnOnce(&T) -> &U, - { - let raw = &s.rwlock.raw; - let data = f(unsafe { &*s.rwlock.data.get() }); - mem::forget(s); - MappedRwLockReadGuard { - raw, - data, - marker: PhantomData, - } - } - - /// Temporarily unlocks the `RwLock` to execute the given function. - /// - /// The `RwLock` is unlocked a fair unlock protocol. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the `RwLock`. - #[inline] - pub fn unlocked<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.rwlock.raw.unlock_shared(); - defer!(s.rwlock.raw.lock_shared()); - f() - } -} - -impl<'a, R: RawRwLockFair + 'a, T: ?Sized + 'a> RwLockReadGuard<'a, R, T> { - /// Unlocks the `RwLock` using a fair unlock protocol. - /// - /// By default, `RwLock` is unfair and allow the current thread to re-lock - /// the `RwLock` before another has the chance to acquire the lock, even if - /// that thread has been blocked on the `RwLock` for a long time. This is - /// the default because it allows much higher throughput as it avoids - /// forcing a context switch on every `RwLock` unlock. This can result in one - /// thread acquiring a `RwLock` many more times than other threads. - /// - /// However in some cases it can be beneficial to ensure fairness by forcing - /// the lock to pass on to a waiting thread if there is one. This is done by - /// using this method instead of dropping the `RwLockReadGuard` normally. - #[inline] - pub fn unlock_fair(s: Self) { - s.rwlock.raw.unlock_shared_fair(); - mem::forget(s); - } - - /// Temporarily unlocks the `RwLock` to execute the given function. - /// - /// The `RwLock` is unlocked a fair unlock protocol. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the `RwLock`. - #[inline] - pub fn unlocked_fair<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.rwlock.raw.unlock_shared_fair(); - defer!(s.rwlock.raw.lock_shared()); - f() - } - - /// Temporarily yields the `RwLock` to a waiting thread if there is one. - /// - /// This method is functionally equivalent to calling `unlock_fair` followed - /// by `read`, however it can be much more efficient in the case where there - /// are no waiting threads. - #[inline] - pub fn bump(s: &mut Self) { - s.rwlock.raw.bump_shared(); - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Deref for RwLockReadGuard<'a, R, T> { - type Target = T; - #[inline] - fn deref(&self) -> &T { - unsafe { &*self.rwlock.data.get() } - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Drop for RwLockReadGuard<'a, R, T> { - #[inline] - fn drop(&mut self) { - self.rwlock.raw.unlock_shared(); - } -} - -#[cfg(feature = "owning_ref")] -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> StableAddress for RwLockReadGuard<'a, R, T> {} - -/// RAII structure used to release the exclusive write access of a lock when -/// dropped. -#[must_use] -pub struct RwLockWriteGuard<'a, R: RawRwLock + 'a, T: ?Sized + 'a> { - rwlock: &'a RwLock<R, T>, - marker: PhantomData<(&'a mut T, R::GuardMarker)>, -} - -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + Sync + 'a> Sync for RwLockWriteGuard<'a, R, T> {} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> RwLockWriteGuard<'a, R, T> { - /// Returns a reference to the original reader-writer lock object. - pub fn rwlock(s: &Self) -> &'a RwLock<R, T> { - s.rwlock - } - - /// Make a new `MappedRwLockWriteGuard` for a component of the locked data. - /// - /// This operation cannot fail as the `RwLockWriteGuard` passed - /// in already locked the data. - /// - /// This is an associated function that needs to be - /// used as `RwLockWriteGuard::map(...)`. A method would interfere with methods of - /// the same name on the contents of the locked data. - #[inline] - pub fn map<U: ?Sized, F>(orig: Self, f: F) -> MappedRwLockWriteGuard<'a, R, U> - where - F: FnOnce(&mut T) -> &mut U, - { - let raw = &orig.rwlock.raw; - let data = f(unsafe { &mut *orig.rwlock.data.get() }); - mem::forget(orig); - MappedRwLockWriteGuard { - raw, - data, - marker: PhantomData, - } - } - - /// Temporarily unlocks the `RwLock` to execute the given function. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the `RwLock`. - #[inline] - pub fn unlocked<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.rwlock.raw.unlock_exclusive(); - defer!(s.rwlock.raw.lock_exclusive()); - f() - } -} - -impl<'a, R: RawRwLockDowngrade + 'a, T: ?Sized + 'a> RwLockWriteGuard<'a, R, T> { - /// Atomically downgrades a write lock into a read lock without allowing any - /// writers to take exclusive access of the lock in the meantime. - /// - /// Note that if there are any writers currently waiting to take the lock - /// then other readers may not be able to acquire the lock even if it was - /// downgraded. - pub fn downgrade(s: Self) -> RwLockReadGuard<'a, R, T> { - s.rwlock.raw.downgrade(); - let rwlock = s.rwlock; - mem::forget(s); - RwLockReadGuard { - rwlock, - marker: PhantomData, - } - } -} - -impl<'a, R: RawRwLockUpgradeDowngrade + 'a, T: ?Sized + 'a> RwLockWriteGuard<'a, R, T> { - /// Atomically downgrades a write lock into an upgradable read lock without allowing any - /// writers to take exclusive access of the lock in the meantime. - /// - /// Note that if there are any writers currently waiting to take the lock - /// then other readers may not be able to acquire the lock even if it was - /// downgraded. - pub fn downgrade_to_upgradable(s: Self) -> RwLockUpgradableReadGuard<'a, R, T> { - s.rwlock.raw.downgrade_to_upgradable(); - let rwlock = s.rwlock; - mem::forget(s); - RwLockUpgradableReadGuard { - rwlock, - marker: PhantomData, - } - } -} - -impl<'a, R: RawRwLockFair + 'a, T: ?Sized + 'a> RwLockWriteGuard<'a, R, T> { - /// Unlocks the `RwLock` using a fair unlock protocol. - /// - /// By default, `RwLock` is unfair and allow the current thread to re-lock - /// the `RwLock` before another has the chance to acquire the lock, even if - /// that thread has been blocked on the `RwLock` for a long time. This is - /// the default because it allows much higher throughput as it avoids - /// forcing a context switch on every `RwLock` unlock. This can result in one - /// thread acquiring a `RwLock` many more times than other threads. - /// - /// However in some cases it can be beneficial to ensure fairness by forcing - /// the lock to pass on to a waiting thread if there is one. This is done by - /// using this method instead of dropping the `RwLockWriteGuard` normally. - #[inline] - pub fn unlock_fair(s: Self) { - s.rwlock.raw.unlock_exclusive_fair(); - mem::forget(s); - } - - /// Temporarily unlocks the `RwLock` to execute the given function. - /// - /// The `RwLock` is unlocked a fair unlock protocol. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the `RwLock`. - #[inline] - pub fn unlocked_fair<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.rwlock.raw.unlock_exclusive_fair(); - defer!(s.rwlock.raw.lock_exclusive()); - f() - } - - /// Temporarily yields the `RwLock` to a waiting thread if there is one. - /// - /// This method is functionally equivalent to calling `unlock_fair` followed - /// by `write`, however it can be much more efficient in the case where there - /// are no waiting threads. - #[inline] - pub fn bump(s: &mut Self) { - s.rwlock.raw.bump_exclusive(); - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Deref for RwLockWriteGuard<'a, R, T> { - type Target = T; - #[inline] - fn deref(&self) -> &T { - unsafe { &*self.rwlock.data.get() } - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> DerefMut for RwLockWriteGuard<'a, R, T> { - #[inline] - fn deref_mut(&mut self) -> &mut T { - unsafe { &mut *self.rwlock.data.get() } - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Drop for RwLockWriteGuard<'a, R, T> { - #[inline] - fn drop(&mut self) { - self.rwlock.raw.unlock_exclusive(); - } -} - -#[cfg(feature = "owning_ref")] -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> StableAddress for RwLockWriteGuard<'a, R, T> {} - -/// RAII structure used to release the upgradable read access of a lock when -/// dropped. -#[must_use] -pub struct RwLockUpgradableReadGuard<'a, R: RawRwLockUpgrade + 'a, T: ?Sized + 'a> { - rwlock: &'a RwLock<R, T>, - marker: PhantomData<(&'a T, R::GuardMarker)>, -} - -unsafe impl<'a, R: RawRwLockUpgrade + 'a, T: ?Sized + Sync + 'a> Sync - for RwLockUpgradableReadGuard<'a, R, T> -{} - -impl<'a, R: RawRwLockUpgrade + 'a, T: ?Sized + 'a> RwLockUpgradableReadGuard<'a, R, T> { - /// Returns a reference to the original reader-writer lock object. - pub fn rwlock(s: &Self) -> &'a RwLock<R, T> { - s.rwlock - } - - /// Temporarily unlocks the `RwLock` to execute the given function. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the `RwLock`. - #[inline] - pub fn unlocked<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.rwlock.raw.unlock_upgradable(); - defer!(s.rwlock.raw.lock_upgradable()); - f() - } - - /// Atomically upgrades an upgradable read lock lock into a exclusive write lock, - /// blocking the current thread until it can be aquired. - pub fn upgrade(s: Self) -> RwLockWriteGuard<'a, R, T> { - s.rwlock.raw.upgrade(); - let rwlock = s.rwlock; - mem::forget(s); - RwLockWriteGuard { - rwlock, - marker: PhantomData, - } - } - - /// Tries to atomically upgrade an upgradable read lock into a exclusive write lock. - /// - /// If the access could not be granted at this time, then the current guard is returned. - pub fn try_upgrade(s: Self) -> Result<RwLockWriteGuard<'a, R, T>, Self> { - if s.rwlock.raw.try_upgrade() { - let rwlock = s.rwlock; - mem::forget(s); - Ok(RwLockWriteGuard { - rwlock, - marker: PhantomData, - }) - } else { - Err(s) - } - } -} - -impl<'a, R: RawRwLockUpgradeFair + 'a, T: ?Sized + 'a> RwLockUpgradableReadGuard<'a, R, T> { - /// Unlocks the `RwLock` using a fair unlock protocol. - /// - /// By default, `RwLock` is unfair and allow the current thread to re-lock - /// the `RwLock` before another has the chance to acquire the lock, even if - /// that thread has been blocked on the `RwLock` for a long time. This is - /// the default because it allows much higher throughput as it avoids - /// forcing a context switch on every `RwLock` unlock. This can result in one - /// thread acquiring a `RwLock` many more times than other threads. - /// - /// However in some cases it can be beneficial to ensure fairness by forcing - /// the lock to pass on to a waiting thread if there is one. This is done by - /// using this method instead of dropping the `RwLockUpgradableReadGuard` normally. - #[inline] - pub fn unlock_fair(s: Self) { - s.rwlock.raw.unlock_upgradable_fair(); - mem::forget(s); - } - - /// Temporarily unlocks the `RwLock` to execute the given function. - /// - /// The `RwLock` is unlocked a fair unlock protocol. - /// - /// This is safe because `&mut` guarantees that there exist no other - /// references to the data protected by the `RwLock`. - #[inline] - pub fn unlocked_fair<F, U>(s: &mut Self, f: F) -> U - where - F: FnOnce() -> U, - { - s.rwlock.raw.unlock_upgradable_fair(); - defer!(s.rwlock.raw.lock_upgradable()); - f() - } - - /// Temporarily yields the `RwLock` to a waiting thread if there is one. - /// - /// This method is functionally equivalent to calling `unlock_fair` followed - /// by `upgradable_read`, however it can be much more efficient in the case where there - /// are no waiting threads. - #[inline] - pub fn bump(s: &mut Self) { - s.rwlock.raw.bump_upgradable(); - } -} - -impl<'a, R: RawRwLockUpgradeDowngrade + 'a, T: ?Sized + 'a> RwLockUpgradableReadGuard<'a, R, T> { - /// Atomically downgrades an upgradable read lock lock into a shared read lock - /// without allowing any writers to take exclusive access of the lock in the - /// meantime. - /// - /// Note that if there are any writers currently waiting to take the lock - /// then other readers may not be able to acquire the lock even if it was - /// downgraded. - pub fn downgrade(s: Self) -> RwLockReadGuard<'a, R, T> { - s.rwlock.raw.downgrade_upgradable(); - let rwlock = s.rwlock; - mem::forget(s); - RwLockReadGuard { - rwlock, - marker: PhantomData, - } - } -} - -impl<'a, R: RawRwLockUpgradeTimed + 'a, T: ?Sized + 'a> RwLockUpgradableReadGuard<'a, R, T> { - /// Tries to atomically upgrade an upgradable read lock into a exclusive - /// write lock, until a timeout is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// the current guard is returned. - pub fn try_upgrade_for( - s: Self, - timeout: R::Duration, - ) -> Result<RwLockWriteGuard<'a, R, T>, Self> { - if s.rwlock.raw.try_upgrade_for(timeout) { - let rwlock = s.rwlock; - mem::forget(s); - Ok(RwLockWriteGuard { - rwlock, - marker: PhantomData, - }) - } else { - Err(s) - } - } - - /// Tries to atomically upgrade an upgradable read lock into a exclusive - /// write lock, until a timeout is reached. - /// - /// If the access could not be granted before the timeout expires, then - /// the current guard is returned. - #[inline] - pub fn try_upgrade_until( - s: Self, - timeout: R::Instant, - ) -> Result<RwLockWriteGuard<'a, R, T>, Self> { - if s.rwlock.raw.try_upgrade_until(timeout) { - let rwlock = s.rwlock; - mem::forget(s); - Ok(RwLockWriteGuard { - rwlock, - marker: PhantomData, - }) - } else { - Err(s) - } - } -} - -impl<'a, R: RawRwLockUpgrade + 'a, T: ?Sized + 'a> Deref for RwLockUpgradableReadGuard<'a, R, T> { - type Target = T; - #[inline] - fn deref(&self) -> &T { - unsafe { &*self.rwlock.data.get() } - } -} - -impl<'a, R: RawRwLockUpgrade + 'a, T: ?Sized + 'a> Drop for RwLockUpgradableReadGuard<'a, R, T> { - #[inline] - fn drop(&mut self) { - self.rwlock.raw.unlock_upgradable(); - } -} - -#[cfg(feature = "owning_ref")] -unsafe impl<'a, R: RawRwLockUpgrade + 'a, T: ?Sized + 'a> StableAddress - for RwLockUpgradableReadGuard<'a, R, T> -{} - -/// An RAII read lock guard returned by `RwLockReadGuard::map`, which can point to a -/// subfield of the protected data. -/// -/// The main difference between `MappedRwLockReadGuard` and `RwLockReadGuard` is that the -/// former doesn't support temporarily unlocking and re-locking, since that -/// could introduce soundness issues if the locked object is modified by another -/// thread. -#[must_use] -pub struct MappedRwLockReadGuard<'a, R: RawRwLock + 'a, T: ?Sized + 'a> { - raw: &'a R, - data: *const T, - marker: PhantomData<&'a T>, -} - -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + Sync + 'a> Sync for MappedRwLockReadGuard<'a, R, T> {} -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Send for MappedRwLockReadGuard<'a, R, T> where - R::GuardMarker: Send -{} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> MappedRwLockReadGuard<'a, R, T> { - /// Make a new `MappedRwLockReadGuard` for a component of the locked data. - /// - /// This operation cannot fail as the `MappedRwLockReadGuard` passed - /// in already locked the data. - /// - /// This is an associated function that needs to be - /// used as `MappedRwLockReadGuard::map(...)`. A method would interfere with methods of - /// the same name on the contents of the locked data. - #[inline] - pub fn map<U: ?Sized, F>(s: Self, f: F) -> MappedRwLockReadGuard<'a, R, U> - where - F: FnOnce(&T) -> &U, - { - let raw = s.raw; - let data = f(unsafe { &*s.data }); - mem::forget(s); - MappedRwLockReadGuard { - raw, - data, - marker: PhantomData, - } - } -} - -impl<'a, R: RawRwLockFair + 'a, T: ?Sized + 'a> MappedRwLockReadGuard<'a, R, T> { - /// Unlocks the `RwLock` using a fair unlock protocol. - /// - /// By default, `RwLock` is unfair and allow the current thread to re-lock - /// the `RwLock` before another has the chance to acquire the lock, even if - /// that thread has been blocked on the `RwLock` for a long time. This is - /// the default because it allows much higher throughput as it avoids - /// forcing a context switch on every `RwLock` unlock. This can result in one - /// thread acquiring a `RwLock` many more times than other threads. - /// - /// However in some cases it can be beneficial to ensure fairness by forcing - /// the lock to pass on to a waiting thread if there is one. This is done by - /// using this method instead of dropping the `MappedRwLockReadGuard` normally. - #[inline] - pub fn unlock_fair(s: Self) { - s.raw.unlock_shared_fair(); - mem::forget(s); - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Deref for MappedRwLockReadGuard<'a, R, T> { - type Target = T; - #[inline] - fn deref(&self) -> &T { - unsafe { &*self.data } - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Drop for MappedRwLockReadGuard<'a, R, T> { - #[inline] - fn drop(&mut self) { - self.raw.unlock_shared(); - } -} - -#[cfg(feature = "owning_ref")] -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> StableAddress - for MappedRwLockReadGuard<'a, R, T> -{} - -/// An RAII write lock guard returned by `RwLockWriteGuard::map`, which can point to a -/// subfield of the protected data. -/// -/// The main difference between `MappedRwLockWriteGuard` and `RwLockWriteGuard` is that the -/// former doesn't support temporarily unlocking and re-locking, since that -/// could introduce soundness issues if the locked object is modified by another -/// thread. -#[must_use] -pub struct MappedRwLockWriteGuard<'a, R: RawRwLock + 'a, T: ?Sized + 'a> { - raw: &'a R, - data: *mut T, - marker: PhantomData<&'a mut T>, -} - -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + Sync + 'a> Sync - for MappedRwLockWriteGuard<'a, R, T> -{} -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Send for MappedRwLockWriteGuard<'a, R, T> where - R::GuardMarker: Send -{} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> MappedRwLockWriteGuard<'a, R, T> { - /// Make a new `MappedRwLockWriteGuard` for a component of the locked data. - /// - /// This operation cannot fail as the `MappedRwLockWriteGuard` passed - /// in already locked the data. - /// - /// This is an associated function that needs to be - /// used as `MappedRwLockWriteGuard::map(...)`. A method would interfere with methods of - /// the same name on the contents of the locked data. - #[inline] - pub fn map<U: ?Sized, F>(orig: Self, f: F) -> MappedRwLockWriteGuard<'a, R, U> - where - F: FnOnce(&mut T) -> &mut U, - { - let raw = orig.raw; - let data = f(unsafe { &mut *orig.data }); - mem::forget(orig); - MappedRwLockWriteGuard { - raw, - data, - marker: PhantomData, - } - } -} - -impl<'a, R: RawRwLockDowngrade + 'a, T: ?Sized + 'a> MappedRwLockWriteGuard<'a, R, T> { - /// Atomically downgrades a write lock into a read lock without allowing any - /// writers to take exclusive access of the lock in the meantime. - /// - /// Note that if there are any writers currently waiting to take the lock - /// then other readers may not be able to acquire the lock even if it was - /// downgraded. - pub fn downgrade(s: Self) -> MappedRwLockReadGuard<'a, R, T> { - s.raw.downgrade(); - let raw = s.raw; - let data = s.data; - mem::forget(s); - MappedRwLockReadGuard { - raw, - data, - marker: PhantomData, - } - } -} - -impl<'a, R: RawRwLockFair + 'a, T: ?Sized + 'a> MappedRwLockWriteGuard<'a, R, T> { - /// Unlocks the `RwLock` using a fair unlock protocol. - /// - /// By default, `RwLock` is unfair and allow the current thread to re-lock - /// the `RwLock` before another has the chance to acquire the lock, even if - /// that thread has been blocked on the `RwLock` for a long time. This is - /// the default because it allows much higher throughput as it avoids - /// forcing a context switch on every `RwLock` unlock. This can result in one - /// thread acquiring a `RwLock` many more times than other threads. - /// - /// However in some cases it can be beneficial to ensure fairness by forcing - /// the lock to pass on to a waiting thread if there is one. This is done by - /// using this method instead of dropping the `MappedRwLockWriteGuard` normally. - #[inline] - pub fn unlock_fair(s: Self) { - s.raw.unlock_exclusive_fair(); - mem::forget(s); - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Deref for MappedRwLockWriteGuard<'a, R, T> { - type Target = T; - #[inline] - fn deref(&self) -> &T { - unsafe { &*self.data } - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> DerefMut for MappedRwLockWriteGuard<'a, R, T> { - #[inline] - fn deref_mut(&mut self) -> &mut T { - unsafe { &mut *self.data } - } -} - -impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> Drop for MappedRwLockWriteGuard<'a, R, T> { - #[inline] - fn drop(&mut self) { - self.raw.unlock_exclusive(); - } -} - -#[cfg(feature = "owning_ref")] -unsafe impl<'a, R: RawRwLock + 'a, T: ?Sized + 'a> StableAddress - for MappedRwLockWriteGuard<'a, R, T> -{} diff --git a/vendor/measureme/.cargo-checksum.json b/vendor/measureme/.cargo-checksum.json index 5b872c5004..60a6dd51b9 100644 --- a/vendor/measureme/.cargo-checksum.json +++ b/vendor/measureme/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"11d09086ac2ef45cf2e4a5e4797c886b8266c4cce2f85d9905d495392ac1ed0c","src/file_header.rs":"ebfe76d52f6c39bf1d98cf6c9ea5474fe1c9cc20f9ccbc8fefac7ed9dacabf85","src/file_serialization_sink.rs":"2f7639e4ce2e92b1d6e570afd42eb8cbf8cf2c1fd02be2a7d26e0942c9a92029","src/lib.rs":"617a2b6d48ce242c73f30ed954cc019f65f2d2e6beb688f036b058442d3f39f0","src/mmap_serialization_sink.rs":"33fa6a20fe27004e7545cb04fc871a67abc9bd274c7b328261964becbf37e973","src/profiler.rs":"b0cc2333ca66681c1105e9c55688fff2e804801055f9334352ffae5203fd6d8f","src/raw_event.rs":"cc3e253646e4ddb6bbe12558c2dd3c9ed6971e5f833ef47d5ed3d086958812c7","src/rustc.rs":"1a101e8b9038bb1cc3d5745779e30736b5e2e1f1debef6a1fbe402c836ca1ede","src/serialization.rs":"b928e7d0ffa0ab87f322129fcca151789de3d26fb353048f819ce85bcf163fec","src/stringtable.rs":"cbc4c8032924384dc6f729ccf42d313e1c21362079a7d542d2499fb789155426"},"package":"c420bbc064623934620b5ab2dc0cf96451b34163329e82f95e7fa1b7b99a6ac8"} \ No newline at end of file +{"files":{"Cargo.toml":"5f286566196608ec5fc6cddc8759f621540722397debbd62edf404d256b347df","src/event_id.rs":"0d8d3efce981b1ceb9d5ff316b10568d37a479d513aa9272161b1b3941eac755","src/file_header.rs":"02b4545ab1b998ac3bb0ea7153aa39e3521a5fa8c341e264b6c54fe5235c7f5d","src/file_serialization_sink.rs":"279df7d3da2a6f3edaf610f2baea920fcc215bd7ab3d932300d5257674043205","src/lib.rs":"ce00befed84ccaf22b3cb5a2f845a1fc2648715b902aa6e49f5e0d9ba020d7b7","src/mmap_serialization_sink.rs":"33fa6a20fe27004e7545cb04fc871a67abc9bd274c7b328261964becbf37e973","src/profiler.rs":"a63d117c58b0d28622e79ecb8098d022c5be180078652e0a629021f7bf0d7134","src/raw_event.rs":"b9d502f5bae7c151244d9e909e6d5681a1137066891af35aa0e4fd63ff461918","src/rustc.rs":"1a101e8b9038bb1cc3d5745779e30736b5e2e1f1debef6a1fbe402c836ca1ede","src/serialization.rs":"276066395515ec851b1426c225d600a738ced89a76b82eef1cc197e851168291","src/stringtable.rs":"9c28acce3dfcdd80869e6ad41f4a4fd6c717ba43524fc38461d1d4ad49c0c11a"},"package":"fef709d3257013bba7cff14fc504e07e80631d3fe0f6d38ce63b8f6510ccb932"} \ No newline at end of file diff --git a/vendor/measureme/Cargo.toml b/vendor/measureme/Cargo.toml index 417f882fba..4c99255850 100644 --- a/vendor/measureme/Cargo.toml +++ b/vendor/measureme/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "measureme" -version = "0.5.0" +version = "0.7.1" authors = ["Wesley Wiser <wwiser@gmail.com>", "Michael Woerister <michaelwoerister@posteo>"] description = "Support crate for rustc's self-profiling feature" homepage = "https://github.com/rust-lang/measureme" diff --git a/vendor/measureme/src/event_id.rs b/vendor/measureme/src/event_id.rs new file mode 100644 index 0000000000..affbbf6e6a --- /dev/null +++ b/vendor/measureme/src/event_id.rs @@ -0,0 +1,81 @@ +use crate::{Profiler, SerializationSink, StringComponent, StringId}; + +/// Event IDs are strings conforming to the following grammar: +/// +/// ```ignore +/// <event_id> = <label> {<argument>} +/// <label> = <text> +/// <argument> = '\x1E' <text> +/// <text> = regex([^[[:cntrl:]]]+) // Anything but ASCII control characters +/// ``` +/// +/// This means there's always a "label", followed by an optional list of +/// arguments. Future versions my support other optional suffixes (with a tag +/// other than '\x11' after the '\x1E' separator), such as a "category". + +/// The byte used to separate arguments from the label and each other. +pub const SEPARATOR_BYTE: &str = "\x1E"; + +/// An `EventId` is a `StringId` with the additional guarantee that the +/// corresponding string conforms to the event_id grammar. +#[derive(Clone, Copy, Eq, PartialEq, Hash, Debug)] +#[repr(C)] +pub struct EventId(StringId); + +impl EventId { + pub const INVALID: EventId = EventId(StringId::INVALID); + + #[inline] + pub fn to_string_id(self) -> StringId { + self.0 + } + + #[inline] + pub fn as_u32(self) -> u32 { + self.0.as_u32() + } + + #[inline] + pub fn from_label(label: StringId) -> EventId { + EventId(label) + } + + #[inline] + pub fn from_virtual(virtual_id: StringId) -> EventId { + EventId(virtual_id) + } + + /// Create an EventId from a raw u32 value. Only used internally for + /// deserialization. + #[inline] + pub fn from_u32(raw_id: u32) -> EventId { + EventId(StringId::new(raw_id)) + } +} + +pub struct EventIdBuilder<'p, S: SerializationSink> { + profiler: &'p Profiler<S>, +} + +impl<'p, S: SerializationSink> EventIdBuilder<'p, S> { + pub fn new(profiler: &Profiler<S>) -> EventIdBuilder<'_, S> { + EventIdBuilder { profiler } + } + + #[inline] + pub fn from_label(&self, label: StringId) -> EventId { + // Just forward the string ID, a single identifier is a valid event_id + EventId::from_label(label) + } + + pub fn from_label_and_arg(&self, label: StringId, arg: StringId) -> EventId { + EventId(self.profiler.alloc_string(&[ + // Label + StringComponent::Ref(label), + // Seperator and start tag for arg + StringComponent::Value(SEPARATOR_BYTE), + // Arg string id + StringComponent::Ref(arg), + ])) + } +} diff --git a/vendor/measureme/src/file_header.rs b/vendor/measureme/src/file_header.rs index e32ef5945b..6fd63f3741 100644 --- a/vendor/measureme/src/file_header.rs +++ b/vendor/measureme/src/file_header.rs @@ -6,7 +6,7 @@ use crate::serialization::SerializationSink; use byteorder::{ByteOrder, LittleEndian}; use std::error::Error; -pub const CURRENT_FILE_FORMAT_VERSION: u32 = 3; +pub const CURRENT_FILE_FORMAT_VERSION: u32 = 5; pub const FILE_MAGIC_EVENT_STREAM: &[u8; 4] = b"MMES"; pub const FILE_MAGIC_STRINGTABLE_DATA: &[u8; 4] = b"MMSD"; pub const FILE_MAGIC_STRINGTABLE_INDEX: &[u8; 4] = b"MMSI"; diff --git a/vendor/measureme/src/file_serialization_sink.rs b/vendor/measureme/src/file_serialization_sink.rs index 8410129ccc..8cf8a889ef 100644 --- a/vendor/measureme/src/file_serialization_sink.rs +++ b/vendor/measureme/src/file_serialization_sink.rs @@ -1,9 +1,9 @@ use crate::serialization::{Addr, SerializationSink}; +use parking_lot::Mutex; use std::error::Error; use std::fs; -use std::io::{Write}; +use std::io::Write; use std::path::Path; -use parking_lot::Mutex; pub struct FileSerializationSink { data: Mutex<Inner>, @@ -25,9 +25,9 @@ impl SerializationSink for FileSerializationSink { Ok(FileSerializationSink { data: Mutex::new(Inner { file, - buffer: vec![0; 1024*512], + buffer: vec![0; 1024 * 512], buf_pos: 0, - addr: 0 + addr: 0, }), }) } @@ -42,7 +42,7 @@ impl SerializationSink for FileSerializationSink { ref mut file, ref mut buffer, ref mut buf_pos, - ref mut addr + ref mut addr, } = *data; let curr_addr = *addr; @@ -53,7 +53,7 @@ impl SerializationSink for FileSerializationSink { if buf_end <= buffer.len() { // We have enough space in the buffer, just write the data to it. - write(&mut buffer[buf_start .. buf_end]); + write(&mut buffer[buf_start..buf_end]); *buf_pos = buf_end; } else { // We don't have enough space in the buffer, so flush to disk @@ -61,7 +61,7 @@ impl SerializationSink for FileSerializationSink { if num_bytes <= buffer.len() { // There's enough space in the buffer, after flushing - write(&mut buffer[0 .. num_bytes]); + write(&mut buffer[0..num_bytes]); *buf_pos = num_bytes; } else { // Even after flushing the buffer there isn't enough space, so @@ -75,6 +75,36 @@ impl SerializationSink for FileSerializationSink { Addr(curr_addr) } + + fn write_bytes_atomic(&self, bytes: &[u8]) -> Addr { + if bytes.len() < 128 { + // For "small" pieces of data, use the regular implementation so we + // don't repeatedly flush an almost empty buffer to disk. + return self.write_atomic(bytes.len(), |sink| sink.copy_from_slice(bytes)); + } + + let mut data = self.data.lock(); + let Inner { + ref mut file, + ref mut buffer, + ref mut buf_pos, + ref mut addr, + } = *data; + + let curr_addr = *addr; + *addr += bytes.len() as u32; + + if *buf_pos > 0 { + // There's something in the buffer, flush it to disk + file.write_all(&buffer[..*buf_pos]).unwrap(); + *buf_pos = 0; + } + + // Now write the whole input to disk, skipping the write buffer + file.write_all(bytes).unwrap(); + + Addr(curr_addr) + } } impl Drop for FileSerializationSink { diff --git a/vendor/measureme/src/lib.rs b/vendor/measureme/src/lib.rs index e26456bc38..1258bb3f2d 100644 --- a/vendor/measureme/src/lib.rs +++ b/vendor/measureme/src/lib.rs @@ -37,6 +37,7 @@ #![deny(warnings)] +pub mod event_id; pub mod file_header; #[cfg(any(not(target_arch = "wasm32"), target_os = "wasi"))] mod file_serialization_sink; @@ -49,6 +50,7 @@ pub mod stringtable; pub mod rustc; +pub use crate::event_id::{EventId, EventIdBuilder}; #[cfg(any(not(target_arch = "wasm32"), target_os = "wasi"))] pub use crate::file_serialization_sink::FileSerializationSink; #[cfg(not(target_arch = "wasm32"))] diff --git a/vendor/measureme/src/profiler.rs b/vendor/measureme/src/profiler.rs index 58a6b7db4b..c63c04d5ad 100644 --- a/vendor/measureme/src/profiler.rs +++ b/vendor/measureme/src/profiler.rs @@ -1,3 +1,4 @@ +use crate::event_id::EventId; use crate::file_header::{write_file_header, FILE_MAGIC_EVENT_STREAM}; use crate::raw_event::RawEvent; use crate::serialization::SerializationSink; @@ -68,12 +69,21 @@ impl<S: SerializationSink> Profiler<S> { } #[inline(always)] - pub fn alloc_string_with_reserved_id<STR: SerializableString + ?Sized>( + pub fn map_virtual_to_concrete_string(&self, virtual_id: StringId, concrete_id: StringId) { + self.string_table + .map_virtual_to_concrete_string(virtual_id, concrete_id); + } + + #[inline(always)] + pub fn bulk_map_virtual_to_single_concrete_string<I>( &self, - id: StringId, - s: &STR, - ) -> StringId { - self.string_table.alloc_with_reserved_id(id, s) + virtual_ids: I, + concrete_id: StringId, + ) where + I: Iterator<Item = StringId> + ExactSizeIterator, + { + self.string_table + .bulk_map_virtual_to_single_concrete_string(virtual_ids, concrete_id); } #[inline(always)] @@ -83,7 +93,7 @@ impl<S: SerializationSink> Profiler<S> { /// Records an event with the given parameters. The event time is computed /// automatically. - pub fn record_instant_event(&self, event_kind: StringId, event_id: StringId, thread_id: u32) { + pub fn record_instant_event(&self, event_kind: StringId, event_id: EventId, thread_id: u32) { let raw_event = RawEvent::new_instant(event_kind, event_id, thread_id, self.nanos_since_start()); @@ -92,10 +102,11 @@ impl<S: SerializationSink> Profiler<S> { /// Creates a "start" event and returns a `TimingGuard` that will create /// the corresponding "end" event when it is dropped. + #[inline] pub fn start_recording_interval_event<'a>( &'a self, event_kind: StringId, - event_id: StringId, + event_id: EventId, thread_id: u32, ) -> TimingGuard<'a, S> { TimingGuard { @@ -125,7 +136,7 @@ impl<S: SerializationSink> Profiler<S> { #[must_use] pub struct TimingGuard<'a, S: SerializationSink> { profiler: &'a Profiler<S>, - event_id: StringId, + event_id: EventId, event_kind: StringId, thread_id: u32, start_ns: u64, @@ -145,3 +156,14 @@ impl<'a, S: SerializationSink> Drop for TimingGuard<'a, S> { self.profiler.record_raw_event(&raw_event); } } + +impl<'a, S: SerializationSink> TimingGuard<'a, S> { + /// This method set a new `event_id` right before actually recording the + /// event. + #[inline] + pub fn finish_with_override_event_id(mut self, event_id: EventId) { + self.event_id = event_id; + // Let's be explicit about it: Dropping the guard will record the event. + drop(self) + } +} diff --git a/vendor/measureme/src/raw_event.rs b/vendor/measureme/src/raw_event.rs index db7c28def5..68ec2ba730 100644 --- a/vendor/measureme/src/raw_event.rs +++ b/vendor/measureme/src/raw_event.rs @@ -1,3 +1,4 @@ +use crate::event_id::EventId; use crate::stringtable::StringId; /// `RawEvent` is how events are stored on-disk. If you change this struct, @@ -6,7 +7,7 @@ use crate::stringtable::StringId; #[repr(C)] pub struct RawEvent { pub event_kind: StringId, - pub event_id: StringId, + pub event_id: EventId, pub thread_id: u32, // The following 96 bits store the start and the end timestamp, using @@ -30,7 +31,7 @@ impl RawEvent { #[inline] pub fn new_interval( event_kind: StringId, - event_id: StringId, + event_id: EventId, thread_id: u32, start_nanos: u64, end_nanos: u64, @@ -59,7 +60,7 @@ impl RawEvent { #[inline] pub fn new_instant( event_kind: StringId, - event_id: StringId, + event_id: EventId, thread_id: u32, timestamp_ns: u64, ) -> RawEvent { @@ -116,7 +117,7 @@ impl RawEvent { { // We always emit data as little endian, which we have to do // manually on big endian targets. - use byteorder::{LittleEndian, ByteOrder}; + use byteorder::{ByteOrder, LittleEndian}; LittleEndian::write_u32(&mut bytes[0..], self.event_kind.as_u32()); LittleEndian::write_u32(&mut bytes[4..], self.event_id.as_u32()); @@ -146,10 +147,10 @@ impl RawEvent { #[cfg(target_endian = "big")] { - use byteorder::{LittleEndian, ByteOrder}; + use byteorder::{ByteOrder, LittleEndian}; RawEvent { - event_kind: StringId::reserved(LittleEndian::read_u32(&bytes[0..])), - event_id: StringId::reserved(LittleEndian::read_u32(&bytes[4..])), + event_kind: StringId::new(LittleEndian::read_u32(&bytes[0..])), + event_id: EventId::from_u32(LittleEndian::read_u32(&bytes[4..])), thread_id: LittleEndian::read_u32(&bytes[8..]), start_time_lower: LittleEndian::read_u32(&bytes[12..]), end_time_lower: LittleEndian::read_u32(&bytes[16..]), @@ -162,8 +163,8 @@ impl RawEvent { impl Default for RawEvent { fn default() -> Self { RawEvent { - event_kind: StringId::reserved(0), - event_id: StringId::reserved(0), + event_kind: StringId::INVALID, + event_id: EventId::INVALID, thread_id: 0, start_time_lower: 0, end_time_lower: 0, @@ -184,22 +185,19 @@ mod tests { #[test] fn is_instant() { - assert!( - RawEvent::new_instant(StringId::reserved(0), StringId::reserved(0), 987, 0,) - .is_instant() - ); + assert!(RawEvent::new_instant(StringId::INVALID, EventId::INVALID, 987, 0,).is_instant()); assert!(RawEvent::new_instant( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 987, MAX_INSTANT_TIMESTAMP, ) .is_instant()); assert!(!RawEvent::new_interval( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 987, 0, MAX_INTERVAL_TIMESTAMP, @@ -211,8 +209,8 @@ mod tests { #[should_panic] fn invalid_instant_timestamp() { let _ = RawEvent::new_instant( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 123, // timestamp too large MAX_INSTANT_TIMESTAMP + 1, @@ -223,8 +221,8 @@ mod tests { #[should_panic] fn invalid_start_timestamp() { let _ = RawEvent::new_interval( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 123, // start timestamp too large MAX_INTERVAL_TIMESTAMP + 1, @@ -236,8 +234,8 @@ mod tests { #[should_panic] fn invalid_end_timestamp() { let _ = RawEvent::new_interval( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 123, 0, // end timestamp too large @@ -249,8 +247,8 @@ mod tests { #[should_panic] fn invalid_end_timestamp2() { let _ = RawEvent::new_interval( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 123, 0, INSTANT_TIMESTAMP_MARKER, @@ -261,8 +259,8 @@ mod tests { #[should_panic] fn start_greater_than_end_timestamp() { let _ = RawEvent::new_interval( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 123, // start timestamp greater than end timestamp 1, @@ -273,15 +271,15 @@ mod tests { #[test] fn start_equal_to_end_timestamp() { // This is allowed, make sure we don't panic - let _ = RawEvent::new_interval(StringId::reserved(0), StringId::reserved(0), 123, 1, 1); + let _ = RawEvent::new_interval(StringId::INVALID, EventId::INVALID, 123, 1, 1); } #[test] fn interval_timestamp_decoding() { // Check the upper limits let e = RawEvent::new_interval( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 1234, MAX_INTERVAL_TIMESTAMP, MAX_INTERVAL_TIMESTAMP, @@ -291,15 +289,15 @@ mod tests { assert_eq!(e.end_nanos(), MAX_INTERVAL_TIMESTAMP); // Check the lower limits - let e = RawEvent::new_interval(StringId::reserved(0), StringId::reserved(0), 1234, 0, 0); + let e = RawEvent::new_interval(StringId::INVALID, EventId::INVALID, 1234, 0, 0); assert_eq!(e.start_nanos(), 0); assert_eq!(e.end_nanos(), 0); // Check that end does not bleed into start let e = RawEvent::new_interval( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 1234, 0, MAX_INTERVAL_TIMESTAMP, @@ -310,8 +308,8 @@ mod tests { // Test some random values let e = RawEvent::new_interval( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 1234, 0x1234567890, 0x1234567890A, @@ -324,15 +322,14 @@ mod tests { #[test] fn instant_timestamp_decoding() { assert_eq!( - RawEvent::new_instant(StringId::reserved(0), StringId::reserved(0), 987, 0,) - .start_nanos(), + RawEvent::new_instant(StringId::INVALID, EventId::INVALID, 987, 0,).start_nanos(), 0 ); assert_eq!( RawEvent::new_instant( - StringId::reserved(0), - StringId::reserved(0), + StringId::INVALID, + EventId::INVALID, 987, MAX_INSTANT_TIMESTAMP, ) diff --git a/vendor/measureme/src/serialization.rs b/vendor/measureme/src/serialization.rs index fe071196c5..b5622c748f 100644 --- a/vendor/measureme/src/serialization.rs +++ b/vendor/measureme/src/serialization.rs @@ -1,6 +1,6 @@ +use parking_lot::Mutex; use std::error::Error; use std::path::Path; -use parking_lot::Mutex; #[derive(Clone, Copy, Eq, PartialEq, Debug)] pub struct Addr(pub u32); @@ -14,9 +14,23 @@ impl Addr { pub trait SerializationSink: Sized + Send + Sync + 'static { fn from_path(path: &Path) -> Result<Self, Box<dyn Error>>; + /// Atomically write `num_bytes` to the sink. The implementation must ensure + /// that concurrent invocations of `write_atomic` do not conflict with each + /// other. + /// + /// The `write` argument is a function that must fill the output buffer + /// passed to it. The output buffer is guaranteed to be exactly `num_bytes` + /// large. fn write_atomic<W>(&self, num_bytes: usize, write: W) -> Addr where W: FnOnce(&mut [u8]); + + /// Same as write_atomic() but might be faster in cases where bytes to be + /// written are already present in a buffer (as opposed to when it is + /// benefical to directly serialize into the output buffer). + fn write_bytes_atomic(&self, bytes: &[u8]) -> Addr { + self.write_atomic(bytes.len(), |sink| sink.copy_from_slice(bytes)) + } } /// A `SerializationSink` that writes to an internal `Vec<u8>` and can be diff --git a/vendor/measureme/src/stringtable.rs b/vendor/measureme/src/stringtable.rs index e4efab8ab6..fa513e40cc 100644 --- a/vendor/measureme/src/stringtable.rs +++ b/vendor/measureme/src/stringtable.rs @@ -42,9 +42,11 @@ //! Each string in the table is referred to via a `StringId`. `StringId`s may //! be generated in two ways: //! -//! 1. Calling `StringTable::alloc()` which returns the `StringId` for the -//! allocated string. -//! 2. Calling `StringTable::alloc_with_reserved_id()` and `StringId::reserved()`. +//! 1. Calling `StringTableBuilder::alloc()` which returns the `StringId` for +//! the allocated string. +//! 2. Calling `StringId::new_virtual()` to create a "virtual" `StringId` that +//! later can be mapped to an actual string via +//! `StringTableBuilder::map_virtual_to_concrete_string()`. //! //! String IDs allow you to deduplicate strings by allocating a string //! once and then referring to it by id over and over. This is a useful trick @@ -53,10 +55,10 @@ //! //! `StringId`s are partitioned according to type: //! -//! > [0 .. MAX_PRE_RESERVED_STRING_ID, METADATA_STRING_ID, .. ] +//! > [0 .. MAX_VIRTUAL_STRING_ID, METADATA_STRING_ID, .. ] //! -//! From `0` to `MAX_PRE_RESERVED_STRING_ID` are the allowed values for reserved strings. -//! After `MAX_PRE_RESERVED_STRING_ID`, there is one string id (`METADATA_STRING_ID`) which is used +//! From `0` to `MAX_VIRTUAL_STRING_ID` are the allowed values for virtual strings. +//! After `MAX_VIRTUAL_STRING_ID`, there is one string id (`METADATA_STRING_ID`) which is used //! internally by `measureme` to record additional metadata about the profiling session. //! After `METADATA_STRING_ID` are all other `StringId` values. //! @@ -66,25 +68,53 @@ use crate::file_header::{ }; use crate::serialization::{Addr, SerializationSink}; use byteorder::{BigEndian, ByteOrder, LittleEndian}; -use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; -/// A `StringId` is used to identify a string in the `StringTable`. +/// A `StringId` is used to identify a string in the `StringTable`. It is +/// either a regular `StringId`, meaning that it contains the absolute address +/// of a string within the string table data. Or it is "virtual", which means +/// that the address it points to is resolved via the string table index data, +/// that maps virtual `StringId`s to addresses. #[derive(Clone, Copy, Eq, PartialEq, Debug, Hash)] #[repr(C)] pub struct StringId(u32); impl StringId { + pub const INVALID: StringId = StringId(INVALID_STRING_ID); + #[inline] - pub fn reserved(id: u32) -> StringId { - assert!(id == id & STRING_ID_MASK); + pub fn new(id: u32) -> StringId { + assert!(id <= MAX_STRING_ID); StringId(id) } + #[inline] + pub fn new_virtual(id: u32) -> StringId { + assert!(id <= MAX_USER_VIRTUAL_STRING_ID); + StringId(id) + } + + #[inline] + pub fn is_virtual(self) -> bool { + self.0 <= METADATA_STRING_ID + } + #[inline] pub fn as_u32(self) -> u32 { self.0 } + + #[inline] + pub fn from_addr(addr: Addr) -> StringId { + let id = addr.0 + FIRST_REGULAR_STRING_ID; + StringId::new(id) + } + + #[inline] + pub fn to_addr(self) -> Addr { + assert!(self.0 >= FIRST_REGULAR_STRING_ID); + Addr(self.0 - FIRST_REGULAR_STRING_ID) + } } // See module-level documentation for more information on the encoding. @@ -94,17 +124,21 @@ pub const TERMINATOR: u8 = 0xFF; pub const MAX_STRING_ID: u32 = 0x3FFF_FFFF; pub const STRING_ID_MASK: u32 = 0x3FFF_FFFF; -/// The maximum id value a prereserved string may be. -const MAX_PRE_RESERVED_STRING_ID: u32 = MAX_STRING_ID / 2; +/// The maximum id value a virtual string may be. +const MAX_USER_VIRTUAL_STRING_ID: u32 = 100_000_000; /// The id of the profile metadata string entry. -pub const METADATA_STRING_ID: u32 = MAX_PRE_RESERVED_STRING_ID + 1; +pub const METADATA_STRING_ID: u32 = MAX_USER_VIRTUAL_STRING_ID + 1; + +/// Some random string ID that we make sure cannot be generated or assigned to. +const INVALID_STRING_ID: u32 = METADATA_STRING_ID + 1; + +pub const FIRST_REGULAR_STRING_ID: u32 = INVALID_STRING_ID + 1; /// Write-only version of the string table pub struct StringTableBuilder<S: SerializationSink> { data_sink: Arc<S>, index_sink: Arc<S>, - id_counter: AtomicU32, // initialized to METADATA_STRING_ID + 1 } /// Anything that implements `SerializableString` can be written to a @@ -233,41 +267,63 @@ impl<S: SerializationSink> StringTableBuilder<S> { StringTableBuilder { data_sink, index_sink, - id_counter: AtomicU32::new(METADATA_STRING_ID + 1), } } - pub fn alloc_with_reserved_id<STR: SerializableString + ?Sized>( - &self, - id: StringId, - s: &STR, - ) -> StringId { - assert!(id.0 <= MAX_PRE_RESERVED_STRING_ID); - self.alloc_unchecked(id, s); - id + /// Creates a mapping so that `virtual_id` will resolve to the contents of + /// `concrete_id` when reading the string table. + pub fn map_virtual_to_concrete_string(&self, virtual_id: StringId, concrete_id: StringId) { + // This assertion does not use `is_virtual` on purpose because that + // would also allow to overwrite `METADATA_STRING_ID`. + assert!(virtual_id.0 <= MAX_USER_VIRTUAL_STRING_ID); + serialize_index_entry(&*self.index_sink, virtual_id, concrete_id.to_addr()); } - pub(crate) fn alloc_metadata<STR: SerializableString + ?Sized>(&self, s: &STR) -> StringId { - let id = StringId(METADATA_STRING_ID); - self.alloc_unchecked(id, s); - id + pub fn bulk_map_virtual_to_single_concrete_string<I>( + &self, + virtual_ids: I, + concrete_id: StringId, + ) where + I: Iterator<Item = StringId> + ExactSizeIterator, + { + // TODO: Index data encoding could have special bulk mode that assigns + // multiple StringIds to the same addr, so we don't have to repeat + // the `concrete_id` over and over. + + type MappingEntry = [u32; 2]; + assert!(std::mem::size_of::<MappingEntry>() == 8); + + let to_addr_le = concrete_id.to_addr().0.to_le(); + + let serialized: Vec<MappingEntry> = virtual_ids + .map(|from| { + let id = from.0; + assert!(id <= MAX_USER_VIRTUAL_STRING_ID); + [id.to_le(), to_addr_le] + }) + .collect(); + + let num_bytes = serialized.len() * std::mem::size_of::<MappingEntry>(); + let byte_ptr = serialized.as_ptr() as *const u8; + + let bytes = unsafe { std::slice::from_raw_parts(byte_ptr, num_bytes) }; + + self.index_sink.write_bytes_atomic(bytes); } - pub fn alloc<STR: SerializableString + ?Sized>(&self, s: &STR) -> StringId { - let id = StringId(self.id_counter.fetch_add(1, Ordering::SeqCst)); - assert!(id.0 > METADATA_STRING_ID); - assert!(id.0 <= MAX_STRING_ID); - self.alloc_unchecked(id, s); - id + pub(crate) fn alloc_metadata<STR: SerializableString + ?Sized>(&self, s: &STR) { + let concrete_id = self.alloc(s); + let virtual_id = StringId(METADATA_STRING_ID); + assert!(virtual_id.is_virtual()); + serialize_index_entry(&*self.index_sink, virtual_id, concrete_id.to_addr()); } - #[inline] - fn alloc_unchecked<STR: SerializableString + ?Sized>(&self, id: StringId, s: &STR) { + pub fn alloc<STR: SerializableString + ?Sized>(&self, s: &STR) -> StringId { let size_in_bytes = s.serialized_size(); let addr = self.data_sink.write_atomic(size_in_bytes, |mem| { s.serialize(mem); }); - serialize_index_entry(&*self.index_sink, id, addr); + StringId::from_addr(addr) } } diff --git a/vendor/ordermap/.cargo-checksum.json b/vendor/ordermap/.cargo-checksum.json deleted file mode 100644 index a2c70ab117..0000000000 --- a/vendor/ordermap/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"0635c91ee09336945616a8cbf2a96d7d7f39aed78ec42c7d8008a60f1e6bbac7","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055","README.rst":"d7208219bafe64ad6bb4b1ffee5b43bb14002b84d0a0b41c9fce7db3352c83fe","benches/bench.rs":"9540fa56aa5ac2cf16ff78b7f9614ca1f4e231d857f7e05b994f90d5feaf9e95","benches/faststring.rs":"e230bb2d39f1de301fc82a6fd458078f7a3fdf80ead9b8db8af2831383201320","src/equivalent.rs":"4d07c0ae8c8ff405fdbb45e6c891158d3fdcfedd47001e4cec090c79b5c56564","src/lib.rs":"0112d05df2a0ea9071e4313f1c3a8ec043cad133d3377946da2f5bf66eb7e201","src/macros.rs":"0ff93b574d8d441d3235cc76d9d142a13b2e9a9e4ce8313b7eaa0476380a4379","src/mutable_keys.rs":"29d372733ab270eb2da22c2702d12ec603c66430cb809adbeddb8ec7110749fc","src/serde.rs":"bc1f91dab9edf627c98815896b1be76e3ebc4360be0684d8f5e4ac21090b3b7a","src/set.rs":"21607e53e6aafa8fd3e34166fe034f7a76c02708fe5a2ce8c7f2c2100e60d215","src/util.rs":"331f80b48387878caa01ab9cfd43927ea0c15129c6beb755d6b40abc6ada900f","tests/equivalent_trait.rs":"3f48a3e1e0df163db99249ce1d4b7654904371e4cac996a71e36b74569df11f9","tests/quick.rs":"1b18d947ffa731417c808fe1cd469fd0d1df65b0c5f28936d6c9347772f52d3a","tests/serde.rs":"b67153585905357ea190a4f2692aef93479f501a00501521335d91cbcbe35a04","tests/tests.rs":"bc72e84efc79f47bbb17c1cb594c5290290691051ee298942a1911a55d3b94f1"},"package":"a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063"} \ No newline at end of file diff --git a/vendor/ordermap/Cargo.toml b/vendor/ordermap/Cargo.toml deleted file mode 100644 index dffd195e4e..0000000000 --- a/vendor/ordermap/Cargo.toml +++ /dev/null @@ -1,58 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies -# -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -name = "ordermap" -version = "0.3.5" -authors = ["bluss"] -description = "A hash table with consistent order and fast iteration." -documentation = "https://docs.rs/ordermap/" -keywords = ["hashmap"] -categories = ["data-structures"] -license = "Apache-2.0/MIT" -repository = "https://github.com/bluss/ordermap" -[package.metadata.docs.rs] -features = ["serde-1"] - -[package.metadata.release] -no-dev-version = true -[profile.bench] -debug = true - -[lib] -bench = false -[dependencies.serde] -version = "1.0" -optional = true -[dev-dependencies.fnv] -version = "1.0" - -[dev-dependencies.itertools] -version = "0.7.0" - -[dev-dependencies.lazy_static] -version = "1" - -[dev-dependencies.quickcheck] -version = "0.6" -default-features = false - -[dev-dependencies.rand] -version = "0.4" - -[dev-dependencies.serde_test] -version = "1.0.5" - -[features] -serde-1 = ["serde"] -test_debug = [] -test_low_transition_point = [] diff --git a/vendor/ordermap/README.rst b/vendor/ordermap/README.rst deleted file mode 100644 index 8784b997dc..0000000000 --- a/vendor/ordermap/README.rst +++ /dev/null @@ -1,226 +0,0 @@ - -Awesome hash table implementation in just Rust (stable, no unsafe code). - -Please read the `API documentation here`__ - -__ https://docs.rs/ordermap/ - -|build_status|_ |crates|_ - -.. |crates| image:: https://img.shields.io/crates/v/ordermap.svg -.. _crates: https://crates.io/crates/ordermap - -.. |build_status| image:: https://travis-ci.org/bluss/ordermap.svg -.. _build_status: https://travis-ci.org/bluss/ordermap - - -Background -========== - -This was inspired by Python 3.6's new dict implementation (which remembers -the insertion order and is fast to iterate, and is compact in memory). - -Some of those features were translated to Rust, and some were not. The result -was ordermap, a hash table that has following properties: - -- Order is **independent of hash function** and hash values of keys. -- Fast to iterate. -- Indexed in compact space. -- Preserves insertion order **as long** as you don't call ``.remove()``. -- Uses robin hood hashing just like Rust's libstd ``HashMap``. - - - It's the usual backwards shift deletion, but only on the index vector, so - it's cheaper because it's moving less memory around. - -Does not implement (Yet) ------------------------- - -- ``.reserve()`` exists but does not have a complete implementation - -Performance ------------ - -``OrderMap`` derives a couple of performance facts directly from how it is constructed, -which is roughly: - - Two vectors, the first, sparse, with hashes and key-value indices, and the - second, dense, the key-value pairs. - -- Iteration is very fast since it is on the dense key-values. -- Removal is fast since it moves memory areas only in the first vector, - and uses a single swap in the second vector. -- Lookup is fast-ish because the hashes and indices are densely stored. - Lookup also is slow-ish since hashes and key-value pairs are stored in - separate places. (Visible when cpu caches size is limiting.) - -- In practice, ``OrderMap`` has been tested out as the hashmap in rustc in PR45282_ and - the performance was roughly on par across the whole workload. -- If you want the properties of ``OrderMap``, or its strongest performance points - fits your workload, it might be the best hash table implementation. - -.. _PR45282: https://github.com/rust-lang/rust/pull/45282 - -Interesting Features --------------------- - -- Insertion order is preserved (``.swap_remove()`` perturbs the order, like the method name says). -- Implements ``.pop() -> Option<(K, V)>`` in O(1) time. -- ``OrderMap::new()`` is empty and uses no allocation until you insert something. -- Lookup key-value pairs by index and vice versa. -- No ``unsafe``. -- Supports ``IndexMut``. - - -Where to go from here? ----------------------- - -- Ideas and PRs for how to implement insertion-order preserving remove (for example tombstones) - are welcome. The plan is to split the crate into two hash table implementations - a) the current compact index space version and b) the full insertion order version. - - -Ideas that we already did -------------------------- - -- It can be an *indexable* ordered map in the current fashion - (This was implemented in 0.2.0, for potential use as a graph datastructure). - -- Idea for more cache efficient lookup (This was implemented in 0.1.2). - - Current ``indices: Vec<Pos>``. ``Pos`` is interpreted as ``(u32, u32)`` more - or less when ``.raw_capacity()`` fits in 32 bits. ``Pos`` then stores both the lower - half of the hash and the entry index. - This means that the hash values in ``Bucket`` don't need to be accessed - while scanning for an entry. - - -Recent Changes -============== - -- 0.3.5 - - - Documentation improvements - -- 0.3.4 - - - The ``.retain()`` methods for ``OrderMap`` and ``OrderSet`` now - traverse the elements in order, and the retained elements **keep their order** - - Added new methods ``.sort_by()``, ``.sort_keys()`` to ``OrderMap`` and - ``.sort_by()``, ``.sort()`` to ``OrderSet``. These methods allow you to - sort the maps in place efficiently. - -- 0.3.3 - - - Document insertion behaviour better by @lucab - - Updated dependences (no feature changes) by @ignatenkobrain - -- 0.3.2 - - - Add ``OrderSet`` by @cuviper! - - ``OrderMap::drain`` is now (too) a double ended iterator. - -- 0.3.1 - - - In all ordermap iterators, forward the ``collect`` method to the underlying - iterator as well. - - Add crates.io categories. - -- 0.3.0 - - - The methods ``get_pair``, ``get_pair_index`` were both replaced by - ``get_full`` (and the same for the mutable case). - - Method ``swap_remove_pair`` replaced by ``swap_remove_full``. - - Add trait ``MutableKeys`` for opt-in mutable key access. Mutable key access - is only possible through the methods of this extension trait. - - Add new trait ``Equivalent`` for key equivalence. This extends the - ``Borrow`` trait mechanism for ``OrderMap::get`` in a backwards compatible - way, just some minor type inference related issues may become apparent. - See `#10`__ for more information. - - Implement ``Extend<(&K, &V)>`` by @xfix. - -__ https://github.com/bluss/ordermap/pull/10 - -- 0.2.13 - - - Fix deserialization to support custom hashers by @Techcable. - - Add methods ``.index()`` on the entry types by @garro95. - -- 0.2.12 - - - Add methods ``.with_hasher()``, ``.hasher()``. - -- 0.2.11 - - - Support ``ExactSizeIterator`` for the iterators. By @Binero. - - Use ``Box<[Pos]>`` internally, saving a word in the ``OrderMap`` struct. - - Serde support, with crate feature ``"serde-1"``. By @xfix. - -- 0.2.10 - - - Add iterator ``.drain(..)`` by @stevej. - -- 0.2.9 - - - Add method ``.is_empty()`` by @overvenus. - - Implement ``PartialEq, Eq`` by @overvenus. - - Add method ``.sorted_by()``. - -- 0.2.8 - - - Add iterators ``.values()`` and ``.values_mut()``. - - Fix compatibility with 32-bit platforms. - -- 0.2.7 - - - Add ``.retain()``. - -- 0.2.6 - - - Add ``OccupiedEntry::remove_entry`` and other minor entry methods, - so that it now has all the features of ``HashMap``'s entries. - -- 0.2.5 - - - Improved ``.pop()`` slightly. - -- 0.2.4 - - - Improved performance of ``.insert()`` (`#3`__) by @pczarn. - -__ https://github.com/bluss/ordermap/pull/3 - -- 0.2.3 - - - Generalize ``Entry`` for now, so that it works on hashmaps with non-default - hasher. However, there's a lingering compat issue since libstd ``HashMap`` - does not parameterize its entries by the hasher (``S`` typarm). - - Special case some iterator methods like ``.nth()``. - -- 0.2.2 - - - Disable the verbose ``Debug`` impl by default. - -- 0.2.1 - - - Fix doc links and clarify docs. - -- 0.2.0 - - - Add more ``HashMap`` methods & compat with its API. - - Experimental support for ``.entry()`` (the simplest parts of the API). - - Add ``.reserve()`` (placeholder impl). - - Add ``.remove()`` as synonym for ``.swap_remove()``. - - Changed ``.insert()`` to swap value if the entry already exists, and - return ``Option``. - - Experimental support as an *indexed* hash map! Added methods - ``.get_index()``, ``.get_index_mut()``, ``.swap_remove_index()``, - ``.get_pair_index()``, ``.get_pair_index_mut()``. - -- 0.1.2 - - - Implement the 32/32 split idea for ``Pos`` which improves cache utilization - and lookup performance. - -- 0.1.1 - - - Initial release. diff --git a/vendor/ordermap/benches/bench.rs b/vendor/ordermap/benches/bench.rs deleted file mode 100644 index a2f3a60b95..0000000000 --- a/vendor/ordermap/benches/bench.rs +++ /dev/null @@ -1,745 +0,0 @@ -#![feature(test)] -extern crate test; -extern crate rand; -extern crate fnv; -#[macro_use] -extern crate lazy_static; - -use std::hash::Hash; -use fnv::FnvHasher; -use std::hash::BuildHasherDefault; -type FnvBuilder = BuildHasherDefault<FnvHasher>; - -use test::Bencher; -use test::black_box; - -extern crate ordermap; - -use ordermap::OrderMap; - -use std::collections::HashMap; -use std::iter::FromIterator; - -use rand::{weak_rng, Rng}; - -#[bench] -fn new_hashmap(b: &mut Bencher) { - b.iter(|| { - HashMap::<String, String>::new() - }); -} - -#[bench] -fn new_orderedmap(b: &mut Bencher) { - b.iter(|| { - OrderMap::<String, String>::new() - }); -} - -#[bench] -fn with_capacity_10e5_hashmap(b: &mut Bencher) { - b.iter(|| { - HashMap::<String, String>::with_capacity(10_000) - }); -} - -#[bench] -fn with_capacity_10e5_orderedmap(b: &mut Bencher) { - b.iter(|| { - OrderMap::<String, String>::with_capacity(10_000) - }); -} - -#[bench] -fn insert_hashmap_10_000(b: &mut Bencher) { - let c = 10_000; - b.iter(|| { - let mut map = HashMap::with_capacity(c); - for x in 0..c { - map.insert(x, ()); - } - map - }); -} - -#[bench] -fn insert_orderedmap_10_000(b: &mut Bencher) { - let c = 10_000; - b.iter(|| { - let mut map = OrderMap::with_capacity(c); - for x in 0..c { - map.insert(x, ()); - } - map - }); -} - -#[bench] -fn insert_hashmap_string_10_000(b: &mut Bencher) { - let c = 10_000; - b.iter(|| { - let mut map = HashMap::with_capacity(c); - for x in 0..c { - map.insert(x.to_string(), ()); - } - map - }); -} - -#[bench] -fn insert_orderedmap_string_10_000(b: &mut Bencher) { - let c = 10_000; - b.iter(|| { - let mut map = OrderMap::with_capacity(c); - for x in 0..c { - map.insert(x.to_string(), ()); - } - map - }); -} - -#[bench] -fn insert_hashmap_str_10_000(b: &mut Bencher) { - let c = 10_000; - let ss = Vec::from_iter((0..c).map(|x| x.to_string())); - b.iter(|| { - let mut map = HashMap::with_capacity(c); - for key in &ss { - map.insert(&key[..], ()); - } - map - }); -} - -#[bench] -fn insert_orderedmap_str_10_000(b: &mut Bencher) { - let c = 10_000; - let ss = Vec::from_iter((0..c).map(|x| x.to_string())); - b.iter(|| { - let mut map = OrderMap::with_capacity(c); - for key in &ss { - map.insert(&key[..], ()); - } - map - }); -} - -#[bench] -fn insert_hashmap_int_bigvalue_10_000(b: &mut Bencher) { - let c = 10_000; - let value = [0u64; 10]; - b.iter(|| { - let mut map = HashMap::with_capacity(c); - for i in 0..c { - map.insert(i, value); - } - map - }); -} - -#[bench] -fn insert_orderedmap_int_bigvalue_10_000(b: &mut Bencher) { - let c = 10_000; - let value = [0u64; 10]; - b.iter(|| { - let mut map = OrderMap::with_capacity(c); - for i in 0..c { - map.insert(i, value); - } - map - }); -} - -#[bench] -fn insert_hashmap_100_000(b: &mut Bencher) { - let c = 100_000; - b.iter(|| { - let mut map = HashMap::with_capacity(c); - for x in 0..c { - map.insert(x, ()); - } - map - }); -} - -#[bench] -fn insert_orderedmap_100_000(b: &mut Bencher) { - let c = 100_000; - b.iter(|| { - let mut map = OrderMap::with_capacity(c); - for x in 0..c { - map.insert(x, ()); - } - map - }); -} - -#[bench] -fn insert_hashmap_150(b: &mut Bencher) { - let c = 150; - b.iter(|| { - let mut map = HashMap::with_capacity(c); - for x in 0..c { - map.insert(x, ()); - } - map - }); -} - -#[bench] -fn insert_orderedmap_150(b: &mut Bencher) { - let c = 150; - b.iter(|| { - let mut map = OrderMap::with_capacity(c); - for x in 0..c { - map.insert(x, ()); - } - map - }); -} - -#[bench] -fn entry_hashmap_150(b: &mut Bencher) { - let c = 150; - b.iter(|| { - let mut map = HashMap::with_capacity(c); - for x in 0..c { - map.entry(x).or_insert(()); - } - map - }); -} - -#[bench] -fn entry_orderedmap_150(b: &mut Bencher) { - let c = 150; - b.iter(|| { - let mut map = OrderMap::with_capacity(c); - for x in 0..c { - map.entry(x).or_insert(()); - } - map - }); -} - -#[bench] -fn iter_sum_hashmap_10_000(b: &mut Bencher) { - let c = 10_000; - let mut map = HashMap::with_capacity(c); - let len = c - c/10; - for x in 0..len { - map.insert(x, ()); - } - assert_eq!(map.len(), len); - b.iter(|| { - map.keys().sum::<usize>() - }); -} - -#[bench] -fn iter_sum_orderedmap_10_000(b: &mut Bencher) { - let c = 10_000; - let mut map = OrderMap::with_capacity(c); - let len = c - c/10; - for x in 0..len { - map.insert(x, ()); - } - assert_eq!(map.len(), len); - b.iter(|| { - map.keys().sum::<usize>() - }); -} - -#[bench] -fn iter_black_box_hashmap_10_000(b: &mut Bencher) { - let c = 10_000; - let mut map = HashMap::with_capacity(c); - let len = c - c/10; - for x in 0..len { - map.insert(x, ()); - } - assert_eq!(map.len(), len); - b.iter(|| { - for &key in map.keys() { - black_box(key); - } - }); -} - -#[bench] -fn iter_black_box_orderedmap_10_000(b: &mut Bencher) { - let c = 10_000; - let mut map = OrderMap::with_capacity(c); - let len = c - c/10; - for x in 0..len { - map.insert(x, ()); - } - assert_eq!(map.len(), len); - b.iter(|| { - for &key in map.keys() { - black_box(key); - } - }); -} - -fn shuffled_keys<I>(iter: I) -> Vec<I::Item> - where I: IntoIterator -{ - let mut v = Vec::from_iter(iter); - let mut rng = weak_rng(); - rng.shuffle(&mut v); - v -} - -#[bench] -fn lookup_hashmap_10_000_exist(b: &mut Bencher) { - let c = 10_000; - let mut map = HashMap::with_capacity(c); - let keys = shuffled_keys(0..c); - for &key in &keys { - map.insert(key, 1); - } - b.iter(|| { - let mut found = 0; - for key in 5000..c { - found += map.get(&key).is_some() as i32; - } - found - }); -} - -#[bench] -fn lookup_hashmap_10_000_noexist(b: &mut Bencher) { - let c = 10_000; - let mut map = HashMap::with_capacity(c); - let keys = shuffled_keys(0..c); - for &key in &keys { - map.insert(key, 1); - } - b.iter(|| { - let mut found = 0; - for key in c..15000 { - found += map.get(&key).is_some() as i32; - } - found - }); -} - -#[bench] -fn lookup_orderedmap_10_000_exist(b: &mut Bencher) { - let c = 10_000; - let mut map = OrderMap::with_capacity(c); - let keys = shuffled_keys(0..c); - for &key in &keys { - map.insert(key, 1); - } - b.iter(|| { - let mut found = 0; - for key in 5000..c { - found += map.get(&key).is_some() as i32; - } - found - }); -} - -#[bench] -fn lookup_orderedmap_10_000_noexist(b: &mut Bencher) { - let c = 10_000; - let mut map = OrderMap::with_capacity(c); - let keys = shuffled_keys(0..c); - for &key in &keys { - map.insert(key, 1); - } - b.iter(|| { - let mut found = 0; - for key in c..15000 { - found += map.get(&key).is_some() as i32; - } - found - }); -} - -// number of items to look up -const LOOKUP_MAP_SIZE: u32 = 100_000_u32; -const LOOKUP_SAMPLE_SIZE: u32 = 5000; -const SORT_MAP_SIZE: usize = 10_000; - - -// use lazy_static so that comparison benchmarks use the exact same inputs -lazy_static! { - static ref KEYS: Vec<u32> = { - shuffled_keys(0..LOOKUP_MAP_SIZE) - }; -} - -lazy_static! { - static ref HMAP_100K: HashMap<u32, u32> = { - let c = LOOKUP_MAP_SIZE; - let mut map = HashMap::with_capacity(c as usize); - let keys = &*KEYS; - for &key in keys { - map.insert(key, key); - } - map - }; -} - -lazy_static! { - static ref OMAP_100K: OrderMap<u32, u32> = { - let c = LOOKUP_MAP_SIZE; - let mut map = OrderMap::with_capacity(c as usize); - let keys = &*KEYS; - for &key in keys { - map.insert(key, key); - } - map - }; -} - -lazy_static! { - static ref OMAP_SORT_U32: OrderMap<u32, u32> = { - let mut map = OrderMap::with_capacity(SORT_MAP_SIZE); - for &key in &KEYS[..SORT_MAP_SIZE] { - map.insert(key, key); - } - map - }; -} -lazy_static! { - static ref OMAP_SORT_S: OrderMap<String, String> = { - let mut map = OrderMap::with_capacity(SORT_MAP_SIZE); - for &key in &KEYS[..SORT_MAP_SIZE] { - map.insert(format!("{:^16x}", &key), String::new()); - } - map - }; -} - -#[bench] -fn lookup_hashmap_100_000_multi(b: &mut Bencher) { - let map = &*HMAP_100K; - b.iter(|| { - let mut found = 0; - for key in 0..LOOKUP_SAMPLE_SIZE { - found += map.get(&key).is_some() as u32; - } - found - }); -} - - -#[bench] -fn lookup_ordermap_100_000_multi(b: &mut Bencher) { - let map = &*OMAP_100K; - b.iter(|| { - let mut found = 0; - for key in 0..LOOKUP_SAMPLE_SIZE { - found += map.get(&key).is_some() as u32; - } - found - }); -} - -// inorder: Test looking up keys in the same order as they were inserted -#[bench] -fn lookup_hashmap_100_000_inorder_multi(b: &mut Bencher) { - let map = &*HMAP_100K; - let keys = &*KEYS; - b.iter(|| { - let mut found = 0; - for key in &keys[0..LOOKUP_SAMPLE_SIZE as usize] { - found += map.get(key).is_some() as u32; - } - found - }); -} - - -#[bench] -fn lookup_ordermap_100_000_inorder_multi(b: &mut Bencher) { - let map = &*OMAP_100K; - let keys = &*KEYS; - b.iter(|| { - let mut found = 0; - for key in &keys[0..LOOKUP_SAMPLE_SIZE as usize] { - found += map.get(key).is_some() as u32; - } - found - }); -} - -#[bench] -fn lookup_hashmap_100_000_single(b: &mut Bencher) { - let map = &*HMAP_100K; - let mut iter = (0..LOOKUP_MAP_SIZE + LOOKUP_SAMPLE_SIZE).cycle(); - b.iter(|| { - let key = iter.next().unwrap(); - map.get(&key).is_some() - }); -} - - -#[bench] -fn lookup_ordermap_100_000_single(b: &mut Bencher) { - let map = &*OMAP_100K; - let mut iter = (0..LOOKUP_MAP_SIZE + LOOKUP_SAMPLE_SIZE).cycle(); - b.iter(|| { - let key = iter.next().unwrap(); - map.get(&key).is_some() - }); -} - -const GROW_SIZE: usize = 100_000; -type GrowKey = u32; - -// Test grow/resize without preallocation -#[bench] -fn grow_fnv_hashmap_100_000(b: &mut Bencher) { - b.iter(|| { - let mut map: HashMap<_, _, FnvBuilder> = HashMap::default(); - for x in 0..GROW_SIZE { - map.insert(x as GrowKey, x as GrowKey); - } - map - }); -} - -#[bench] -fn grow_fnv_ordermap_100_000(b: &mut Bencher) { - b.iter(|| { - let mut map: OrderMap<_, _, FnvBuilder> = OrderMap::default(); - for x in 0..GROW_SIZE { - map.insert(x as GrowKey, x as GrowKey); - } - map - }); -} - - -const MERGE: u64 = 10_000; -#[bench] -fn hashmap_merge_simple(b: &mut Bencher) { - let first_map: HashMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect(); - let second_map: HashMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect(); - b.iter(|| { - let mut merged = first_map.clone(); - merged.extend(second_map.iter().map(|(&k, &v)| (k, v))); - merged - }); -} - -#[bench] -fn hashmap_merge_shuffle(b: &mut Bencher) { - let first_map: HashMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect(); - let second_map: HashMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect(); - let mut v = Vec::new(); - let mut rng = weak_rng(); - b.iter(|| { - let mut merged = first_map.clone(); - v.extend(second_map.iter().map(|(&k, &v)| (k, v))); - rng.shuffle(&mut v); - merged.extend(v.drain(..)); - - merged - }); -} - -#[bench] -fn ordermap_merge_simple(b: &mut Bencher) { - let first_map: OrderMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect(); - let second_map: OrderMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect(); - b.iter(|| { - let mut merged = first_map.clone(); - merged.extend(second_map.iter().map(|(&k, &v)| (k, v))); - merged - }); -} - -#[bench] -fn ordermap_merge_shuffle(b: &mut Bencher) { - let first_map: OrderMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect(); - let second_map: OrderMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect(); - let mut v = Vec::new(); - let mut rng = weak_rng(); - b.iter(|| { - let mut merged = first_map.clone(); - v.extend(second_map.iter().map(|(&k, &v)| (k, v))); - rng.shuffle(&mut v); - merged.extend(v.drain(..)); - - merged - }); -} - -#[bench] -fn remove_ordermap_100_000(b: &mut Bencher) { - let map = OMAP_100K.clone(); - let mut keys = Vec::from_iter(map.keys().cloned()); - weak_rng().shuffle(&mut keys); - - b.iter(|| { - let mut map = map.clone(); - for key in &keys { - map.remove(key).is_some(); - } - assert_eq!(map.len(), 0); - map - }); -} - -#[bench] -fn pop_ordermap_100_000(b: &mut Bencher) { - let map = OMAP_100K.clone(); - - b.iter(|| { - let mut map = map.clone(); - while map.len() > 0 { - map.pop(); - } - assert_eq!(map.len(), 0); - map - }); -} - -#[bench] -fn few_retain_ordermap_100_000(b: &mut Bencher) { - let map = OMAP_100K.clone(); - - b.iter(|| { - let mut map = map.clone(); - map.retain(|k, _| *k % 7 == 0); - map - }); -} - -#[bench] -fn few_retain_hashmap_100_000(b: &mut Bencher) { - let map = HMAP_100K.clone(); - - b.iter(|| { - let mut map = map.clone(); - map.retain(|k, _| *k % 7 == 0); - map - }); -} - -#[bench] -fn half_retain_ordermap_100_000(b: &mut Bencher) { - let map = OMAP_100K.clone(); - - b.iter(|| { - let mut map = map.clone(); - map.retain(|k, _| *k % 2 == 0); - map - }); -} - -#[bench] -fn half_retain_hashmap_100_000(b: &mut Bencher) { - let map = HMAP_100K.clone(); - - b.iter(|| { - let mut map = map.clone(); - map.retain(|k, _| *k % 2 == 0); - map - }); -} - -#[bench] -fn many_retain_ordermap_100_000(b: &mut Bencher) { - let map = OMAP_100K.clone(); - - b.iter(|| { - let mut map = map.clone(); - map.retain(|k, _| *k % 100 != 0); - map - }); -} - -#[bench] -fn many_retain_hashmap_100_000(b: &mut Bencher) { - let map = HMAP_100K.clone(); - - b.iter(|| { - let mut map = map.clone(); - map.retain(|k, _| *k % 100 != 0); - map - }); -} - - -// simple sort impl for comparison -pub fn simple_sort<K: Ord + Hash, V>(m: &mut OrderMap<K, V>) { - let mut ordered: Vec<_> = m.drain(..).collect(); - ordered.sort_by(|left, right| left.0.cmp(&right.0)); - m.extend(ordered); -} - - -#[bench] -fn ordermap_sort_s(b: &mut Bencher) { - let map = OMAP_SORT_S.clone(); - - // there's a map clone there, but it's still useful to profile this - b.iter(|| { - let mut map = map.clone(); - map.sort_keys(); - map - }); -} - -#[bench] -fn ordermap_simple_sort_s(b: &mut Bencher) { - let map = OMAP_SORT_S.clone(); - - // there's a map clone there, but it's still useful to profile this - b.iter(|| { - let mut map = map.clone(); - simple_sort(&mut map); - map - }); -} - -#[bench] -fn ordermap_sort_u32(b: &mut Bencher) { - let map = OMAP_SORT_U32.clone(); - - // there's a map clone there, but it's still useful to profile this - b.iter(|| { - let mut map = map.clone(); - map.sort_keys(); - map - }); -} - -#[bench] -fn ordermap_simple_sort_u32(b: &mut Bencher) { - let map = OMAP_SORT_U32.clone(); - - // there's a map clone there, but it's still useful to profile this - b.iter(|| { - let mut map = map.clone(); - simple_sort(&mut map); - map - }); -} - -// measure the fixed overhead of cloning in sort benchmarks -#[bench] -fn ordermap_clone_for_sort_s(b: &mut Bencher) { - let map = OMAP_SORT_S.clone(); - - b.iter(|| { - map.clone() - }); -} - -#[bench] -fn ordermap_clone_for_sort_u32(b: &mut Bencher) { - let map = OMAP_SORT_U32.clone(); - - b.iter(|| { - map.clone() - }); -} - diff --git a/vendor/ordermap/benches/faststring.rs b/vendor/ordermap/benches/faststring.rs deleted file mode 100644 index b388f45af2..0000000000 --- a/vendor/ordermap/benches/faststring.rs +++ /dev/null @@ -1,183 +0,0 @@ -#![feature(test)] -extern crate test; -extern crate rand; -extern crate lazy_static; - -use test::Bencher; - -extern crate ordermap; - -use ordermap::OrderMap; - -use std::collections::HashMap; -use std::iter::FromIterator; - -use rand::{weak_rng, Rng}; - -use std::hash::{Hash, Hasher}; - -use std::borrow::Borrow; -use std::ops::Deref; -use std::mem; - -#[derive(PartialEq, Eq, Copy, Clone)] -pub struct OneShot<T: ?Sized>(pub T); - -impl Hash for OneShot<str> -{ - fn hash<H: Hasher>(&self, h: &mut H) { - h.write(self.0.as_bytes()) - } -} - -impl<'a, S> From<&'a S> for &'a OneShot<str> - where S: AsRef<str> -{ - fn from(s: &'a S) -> Self { - let s: &str = s.as_ref(); - unsafe { - mem::transmute(s) - } - } -} - -impl Hash for OneShot<String> -{ - fn hash<H: Hasher>(&self, h: &mut H) { - h.write(self.0.as_bytes()) - } -} - -impl Borrow<OneShot<str>> for OneShot<String> -{ - fn borrow(&self) -> &OneShot<str> { - <&OneShot<str>>::from(&self.0) - } -} - -impl<T> Deref for OneShot<T> -{ - type Target = T; - fn deref(&self) -> &T { - &self.0 - } -} - - -fn shuffled_keys<I>(iter: I) -> Vec<I::Item> - where I: IntoIterator -{ - let mut v = Vec::from_iter(iter); - let mut rng = weak_rng(); - rng.shuffle(&mut v); - v -} - - -#[bench] -fn insert_hashmap_string_10_000(b: &mut Bencher) { - let c = 10_000; - b.iter(|| { - let mut map = HashMap::with_capacity(c); - for x in 0..c { - map.insert(x.to_string(), ()); - } - map - }); -} - -#[bench] -fn insert_hashmap_string_oneshot_10_000(b: &mut Bencher) { - let c = 10_000; - b.iter(|| { - let mut map = HashMap::with_capacity(c); - for x in 0..c { - map.insert(OneShot(x.to_string()), ()); - } - map - }); -} - -#[bench] -fn insert_orderedmap_string_10_000(b: &mut Bencher) { - let c = 10_000; - b.iter(|| { - let mut map = OrderMap::with_capacity(c); - for x in 0..c { - map.insert(x.to_string(), ()); - } - map - }); -} - -#[bench] -fn lookup_hashmap_10_000_exist_string(b: &mut Bencher) { - let c = 10_000; - let mut map = HashMap::with_capacity(c); - let keys = shuffled_keys(0..c); - for &key in &keys { - map.insert(key.to_string(), 1); - } - let lookups = (5000..c).map(|x| x.to_string()).collect::<Vec<_>>(); - b.iter(|| { - let mut found = 0; - for key in &lookups { - found += map.get(key).is_some() as i32; - } - found - }); -} - -#[bench] -fn lookup_hashmap_10_000_exist_string_oneshot(b: &mut Bencher) { - let c = 10_000; - let mut map = HashMap::with_capacity(c); - let keys = shuffled_keys(0..c); - for &key in &keys { - map.insert(OneShot(key.to_string()), 1); - } - let lookups = (5000..c).map(|x| OneShot(x.to_string())).collect::<Vec<_>>(); - b.iter(|| { - let mut found = 0; - for key in &lookups { - found += map.get(key).is_some() as i32; - } - found - }); -} - -#[bench] -fn lookup_ordermap_10_000_exist_string(b: &mut Bencher) { - let c = 10_000; - let mut map = OrderMap::with_capacity(c); - let keys = shuffled_keys(0..c); - for &key in &keys { - map.insert(key.to_string(), 1); - } - let lookups = (5000..c).map(|x| x.to_string()).collect::<Vec<_>>(); - b.iter(|| { - let mut found = 0; - for key in &lookups { - found += map.get(key).is_some() as i32; - } - found - }); -} - -#[bench] -fn lookup_ordermap_10_000_exist_string_oneshot(b: &mut Bencher) { - let c = 10_000; - let mut map = OrderMap::with_capacity(c); - let keys = shuffled_keys(0..c); - for &key in &keys { - map.insert(OneShot(key.to_string()), 1); - } - let lookups = (5000..c).map(|x| OneShot(x.to_string())).collect::<Vec<_>>(); - b.iter(|| { - let mut found = 0; - for key in &lookups { - found += map.get(key).is_some() as i32; - } - found - }); -} diff --git a/vendor/ordermap/src/equivalent.rs b/vendor/ordermap/src/equivalent.rs deleted file mode 100644 index d72b2ef3a2..0000000000 --- a/vendor/ordermap/src/equivalent.rs +++ /dev/null @@ -1,27 +0,0 @@ - -use std::borrow::Borrow; - -/// Key equivalence trait. -/// -/// This trait allows hash table lookup to be customized. -/// It has one blanket implementation that uses the regular `Borrow` solution, -/// just like `HashMap` and `BTreeMap` do, so that you can pass `&str` to lookup -/// into a map with `String` keys and so on. -/// -/// # Contract -/// -/// The implementor **must** hash like `K`, if it is hashable. -pub trait Equivalent<K: ?Sized> { - /// Compare self to `key` and return `true` if they are equal. - fn equivalent(&self, key: &K) -> bool; -} - -impl<Q: ?Sized, K: ?Sized> Equivalent<K> for Q - where Q: Eq, - K: Borrow<Q>, -{ - #[inline] - fn equivalent(&self, key: &K) -> bool { - *self == *key.borrow() - } -} diff --git a/vendor/ordermap/src/lib.rs b/vendor/ordermap/src/lib.rs deleted file mode 100644 index ba389e475a..0000000000 --- a/vendor/ordermap/src/lib.rs +++ /dev/null @@ -1,1877 +0,0 @@ - -#![deny(unsafe_code)] -#![doc(html_root_url = "https://docs.rs/ordermap/0.3/")] - -//! [`OrderMap`] is a hash table where the iteration order of the key-value -//! pairs is independent of the hash values of the keys. -//! -//! [`OrderMap`]: struct.OrderMap.html - -#[macro_use] -mod macros; -#[cfg(feature = "serde-1")] -mod serde; -mod util; -mod equivalent; -mod mutable_keys; - -pub mod set; - -use std::hash::Hash; -use std::hash::BuildHasher; -use std::hash::Hasher; -use std::iter::FromIterator; -use std::collections::hash_map::RandomState; -use std::ops::RangeFull; - -use std::cmp::{max, Ordering}; -use std::fmt; -use std::mem::{replace}; -use std::marker::PhantomData; - -use util::{third, ptrdistance, enumerate}; -pub use equivalent::Equivalent; -pub use mutable_keys::MutableKeys; -pub use set::OrderSet; - -fn hash_elem_using<B: BuildHasher, K: ?Sized + Hash>(build: &B, k: &K) -> HashValue { - let mut h = build.build_hasher(); - k.hash(&mut h); - HashValue(h.finish() as usize) -} - -/// Hash value newtype. Not larger than usize, since anything larger -/// isn't used for selecting position anyway. -#[derive(Copy, Debug)] -struct HashValue(usize); - -impl HashValue { - #[inline(always)] - fn get(self) -> usize { self.0 } -} - -impl Clone for HashValue { - #[inline] - fn clone(&self) -> Self { *self } -} -impl PartialEq for HashValue { - #[inline] - fn eq(&self, rhs: &Self) -> bool { - self.0 == rhs.0 - } -} - -/// A possibly truncated hash value. -/// -#[derive(Debug)] -struct ShortHash<Sz>(usize, PhantomData<Sz>); - -impl<Sz> ShortHash<Sz> { - /// Pretend this is a full HashValue, which - /// is completely ok w.r.t determining bucket index - /// - /// - Sz = u32: 32-bit hash is enough to select bucket index - /// - Sz = u64: hash is not truncated - fn into_hash(self) -> HashValue { - HashValue(self.0) - } -} - -impl<Sz> Copy for ShortHash<Sz> { } -impl<Sz> Clone for ShortHash<Sz> { - #[inline] - fn clone(&self) -> Self { *self } -} - -impl<Sz> PartialEq for ShortHash<Sz> { - #[inline] - fn eq(&self, rhs: &Self) -> bool { - self.0 == rhs.0 - } -} - -// Compare ShortHash == HashValue by truncating appropriately -// if applicable before the comparison -impl<Sz> PartialEq<HashValue> for ShortHash<Sz> where Sz: Size { - #[inline] - fn eq(&self, rhs: &HashValue) -> bool { - if Sz::is_64_bit() { - self.0 == rhs.0 - } else { - lo32(self.0 as u64) == lo32(rhs.0 as u64) - } - } -} -impl<Sz> From<ShortHash<Sz>> for HashValue { - fn from(x: ShortHash<Sz>) -> Self { HashValue(x.0) } -} - -/// `Pos` is stored in the `indices` array and it points to the index of a -/// `Bucket` in self.entries. -/// -/// Pos can be interpreted either as a 64-bit index, or as a 32-bit index and -/// a 32-bit hash. -/// -/// Storing the truncated hash next to the index saves loading the hash from the -/// entry, increasing the cache efficiency. -/// -/// Note that the lower 32 bits of the hash is enough to compute desired -/// position and probe distance in a hash map with less than 2**32 buckets. -/// -/// The OrderMap will simply query its **current raw capacity** to see what its -/// current size class is, and dispatch to the 32-bit or 64-bit lookup code as -/// appropriate. Only the growth code needs some extra logic to handle the -/// transition from one class to another -#[derive(Copy)] -struct Pos { - index: u64, -} - -impl Clone for Pos { - #[inline(always)] - fn clone(&self) -> Self { *self } -} - -impl fmt::Debug for Pos { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.pos() { - Some(i) => write!(f, "Pos({} / {:x})", i, self.index), - None => write!(f, "Pos(None)"), - } - } -} - -impl Pos { - #[inline] - fn none() -> Self { Pos { index: !0 } } - - #[inline] - fn is_none(&self) -> bool { self.index == !0 } - - /// Return the index part of the Pos value inside `Some(_)` if the position - /// is not none, otherwise return `None`. - #[inline] - fn pos(&self) -> Option<usize> { - if self.index == !0 { None } else { Some(lo32(self.index as u64)) } - } - - /// Set the index part of the Pos value to `i` - #[inline] - fn set_pos<Sz>(&mut self, i: usize) - where Sz: Size, - { - debug_assert!(!self.is_none()); - if Sz::is_64_bit() { - self.index = i as u64; - } else { - self.index = i as u64 | ((self.index >> 32) << 32) - } - } - - #[inline] - fn with_hash<Sz>(i: usize, hash: HashValue) -> Self - where Sz: Size - { - if Sz::is_64_bit() { - Pos { - index: i as u64, - } - } else { - Pos { - index: i as u64 | ((hash.0 as u64) << 32) - } - } - } - - /// “Resolve” the Pos into a combination of its index value and - /// a proxy value to the hash (whether it contains the hash or not - /// depends on the size class of the hash map). - #[inline] - fn resolve<Sz>(&self) -> Option<(usize, ShortHashProxy<Sz>)> - where Sz: Size - { - if Sz::is_64_bit() { - if !self.is_none() { - Some((self.index as usize, ShortHashProxy::new(0))) - } else { - None - } - } else { - if !self.is_none() { - let (i, hash) = split_lo_hi(self.index); - Some((i as usize, ShortHashProxy::new(hash as usize))) - } else { - None - } - } - } - - /// Like resolve, but the Pos **must** be non-none. Return its index. - #[inline] - fn resolve_existing_index<Sz>(&self) -> usize - where Sz: Size - { - debug_assert!(!self.is_none(), "datastructure inconsistent: none where valid Pos expected"); - if Sz::is_64_bit() { - self.index as usize - } else { - let (i, _) = split_lo_hi(self.index); - i as usize - } - } - -} - -#[inline] -fn lo32(x: u64) -> usize { (x & 0xFFFF_FFFF) as usize } - -// split into low, hi parts -#[inline] -fn split_lo_hi(x: u64) -> (u32, u32) { (x as u32, (x >> 32) as u32) } - -// Possibly contains the truncated hash value for an entry, depending on -// the size class. -struct ShortHashProxy<Sz>(usize, PhantomData<Sz>); - -impl<Sz> ShortHashProxy<Sz> - where Sz: Size -{ - fn new(x: usize) -> Self { - ShortHashProxy(x, PhantomData) - } - - /// Get the hash from either `self` or from a lookup into `entries`, - /// depending on `Sz`. - fn get_short_hash<K, V>(&self, entries: &[Bucket<K, V>], index: usize) -> ShortHash<Sz> { - if Sz::is_64_bit() { - ShortHash(entries[index].hash.0, PhantomData) - } else { - ShortHash(self.0, PhantomData) - } - } -} - -/// A hash table where the iteration order of the key-value pairs is independent -/// of the hash values of the keys. -/// -/// The interface is closely compatible with the standard `HashMap`, but also -/// has additional features. -/// -/// # Order -/// -/// The key-value pairs have a consistent order that is determined by -/// the sequence of insertion and removal calls on the map. The order does -/// not depend on the keys or the hash function at all. -/// -/// All iterators traverse the map in *the order*. -/// -/// # Indices -/// -/// The key-value pairs are indexed in a compact range without holes in the -/// range `0..self.len()`. For example, the method `.get_full` looks up the -/// index for a key, and the method `.get_index` looks up the key-value pair by -/// index. -/// -/// # Examples -/// -/// ``` -/// use ordermap::OrderMap; -/// -/// // count the frequency of each letter in a sentence. -/// let mut letters = OrderMap::new(); -/// for ch in "a short treatise on fungi".chars() { -/// *letters.entry(ch).or_insert(0) += 1; -/// } -/// -/// assert_eq!(letters[&'s'], 2); -/// assert_eq!(letters[&'t'], 3); -/// assert_eq!(letters[&'u'], 1); -/// assert_eq!(letters.get(&'y'), None); -/// ``` -#[derive(Clone)] -pub struct OrderMap<K, V, S = RandomState> { - mask: usize, - /// indices are the buckets. indices.len() == raw capacity - indices: Box<[Pos]>, - /// entries is a dense vec of entries in their order. entries.len() == len - entries: Vec<Bucket<K, V>>, - hash_builder: S, -} - -#[derive(Copy, Clone, Debug)] -struct Bucket<K, V> { - hash: HashValue, - key: K, - value: V, -} - -#[inline(always)] -fn desired_pos(mask: usize, hash: HashValue) -> usize { - hash.0 & mask -} - -/// The number of steps that `current` is forward of the desired position for hash -#[inline(always)] -fn probe_distance(mask: usize, hash: HashValue, current: usize) -> usize { - current.wrapping_sub(desired_pos(mask, hash)) & mask -} - -enum Inserted<V> { - Done, - Swapped { prev_value: V }, - RobinHood { - probe: usize, - old_pos: Pos, - } -} - -impl<K, V, S> fmt::Debug for OrderMap<K, V, S> - where K: fmt::Debug + Hash + Eq, - V: fmt::Debug, - S: BuildHasher, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - try!(f.debug_map().entries(self.iter()).finish()); - if cfg!(not(feature = "test_debug")) { - return Ok(()); - } - try!(writeln!(f, "")); - for (i, index) in enumerate(&*self.indices) { - try!(write!(f, "{}: {:?}", i, index)); - if let Some(pos) = index.pos() { - let hash = self.entries[pos].hash; - let key = &self.entries[pos].key; - let desire = desired_pos(self.mask, hash); - try!(write!(f, ", desired={}, probe_distance={}, key={:?}", - desire, - probe_distance(self.mask, hash, i), - key)); - } - try!(writeln!(f, "")); - } - try!(writeln!(f, "cap={}, raw_cap={}, entries.cap={}", - self.capacity(), - self.raw_capacity(), - self.entries.capacity())); - Ok(()) - } -} - -#[inline] -fn usable_capacity(cap: usize) -> usize { - cap - cap / 4 -} - -#[inline] -fn to_raw_capacity(n: usize) -> usize { - n + n / 3 -} - -// this could not be captured in an efficient iterator -macro_rules! probe_loop { - ($probe_var: ident < $len: expr, $body: expr) => { - loop { - if $probe_var < $len { - $body - $probe_var += 1; - } else { - $probe_var = 0; - } - } - } -} - -impl<K, V> OrderMap<K, V> { - /// Create a new map. (Does not allocate.) - pub fn new() -> Self { - Self::with_capacity(0) - } - - /// Create a new map with capacity for `n` key-value pairs. (Does not - /// allocate if `n` is zero.) - /// - /// Computes in **O(n)** time. - pub fn with_capacity(n: usize) -> Self { - Self::with_capacity_and_hasher(n, <_>::default()) - } -} - -impl<K, V, S> OrderMap<K, V, S> -{ - /// Create a new map with capacity for `n` key-value pairs. (Does not - /// allocate if `n` is zero.) - /// - /// Computes in **O(n)** time. - pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Self - where S: BuildHasher - { - if n == 0 { - OrderMap { - mask: 0, - indices: Box::new([]), - entries: Vec::new(), - hash_builder: hash_builder, - } - } else { - let raw = to_raw_capacity(n); - let raw_cap = max(raw.next_power_of_two(), 8); - OrderMap { - mask: raw_cap.wrapping_sub(1), - indices: vec![Pos::none(); raw_cap].into_boxed_slice(), - entries: Vec::with_capacity(usable_capacity(raw_cap)), - hash_builder: hash_builder, - } - } - } - - /// Return the number of key-value pairs in the map. - /// - /// Computes in **O(1)** time. - pub fn len(&self) -> usize { self.entries.len() } - - /// Returns true if the map contains no elements. - /// - /// Computes in **O(1)** time. - pub fn is_empty(&self) -> bool { self.len() == 0 } - - /// Create a new map with `hash_builder` - pub fn with_hasher(hash_builder: S) -> Self - where S: BuildHasher - { - Self::with_capacity_and_hasher(0, hash_builder) - } - - /// Return a reference to the map's `BuildHasher`. - pub fn hasher(&self) -> &S - where S: BuildHasher - { - &self.hash_builder - } - - // Return whether we need 32 or 64 bits to specify a bucket or entry index - #[cfg(not(feature = "test_low_transition_point"))] - fn size_class_is_64bit(&self) -> bool { - usize::max_value() > u32::max_value() as usize && - self.raw_capacity() >= u32::max_value() as usize - } - - // for testing - #[cfg(feature = "test_low_transition_point")] - fn size_class_is_64bit(&self) -> bool { - self.raw_capacity() >= 64 - } - - #[inline(always)] - fn raw_capacity(&self) -> usize { - self.indices.len() - } - - /// Computes in **O(1)** time. - pub fn capacity(&self) -> usize { - usable_capacity(self.raw_capacity()) - } -} - -/// Trait for the "size class". Either u32 or u64 depending on the index -/// size needed to address an entry's indes in self.entries. -trait Size { - fn is_64_bit() -> bool; - fn is_same_size<T: Size>() -> bool { - Self::is_64_bit() == T::is_64_bit() - } -} - -impl Size for u32 { - #[inline] - fn is_64_bit() -> bool { false } -} - -impl Size for u64 { - #[inline] - fn is_64_bit() -> bool { true } -} - -/// Call self.method(args) with `::<u32>` or `::<u64>` depending on `self` -/// size class. -/// -/// The u32 or u64 is *prepended* to the type parameter list! -macro_rules! dispatch_32_vs_64 { - ($self_:ident . $method:ident::<$($t:ty),*>($($arg:expr),*)) => { - if $self_.size_class_is_64bit() { - $self_.$method::<u64, $($t),*>($($arg),*) - } else { - $self_.$method::<u32, $($t),*>($($arg),*) - } - }; - ($self_:ident . $method:ident ($($arg:expr),*)) => { - if $self_.size_class_is_64bit() { - $self_.$method::<u64>($($arg),*) - } else { - $self_.$method::<u32>($($arg),*) - } - }; -} - -/// Entry for an existing key-value pair or a vacant location to -/// insert one. -/// -/// FIXME: Remove dependence on the `S` parameter -/// (to match HashMap). -pub enum Entry<'a, K: 'a, V: 'a, S: 'a = RandomState> { - /// Existing slot with equivalent key. - Occupied(OccupiedEntry<'a, K, V, S>), - /// Vacant slot (no equivalent key in the map). - Vacant(VacantEntry<'a, K, V, S>), -} - -impl<'a, K, V, S> Entry<'a, K, V, S> { - /// Computes in **O(1)** time (amortized average). - pub fn or_insert(self, default: V) -> &'a mut V { - match self { - Entry::Occupied(entry) => entry.into_mut(), - Entry::Vacant(entry) => entry.insert(default), - } - } - - /// Computes in **O(1)** time (amortized average). - pub fn or_insert_with<F>(self, call: F) -> &'a mut V - where F: FnOnce() -> V, - { - match self { - Entry::Occupied(entry) => entry.into_mut(), - Entry::Vacant(entry) => entry.insert(call()), - } - } - - pub fn key(&self) -> &K { - match *self { - Entry::Occupied(ref entry) => entry.key(), - Entry::Vacant(ref entry) => entry.key(), - } - } - - /// Return the index where the key-value pair exists or will be inserted. - pub fn index(&self) -> usize { - match *self { - Entry::Occupied(ref entry) => entry.index(), - Entry::Vacant(ref entry) => entry.index(), - } - } -} - -pub struct OccupiedEntry<'a, K: 'a, V: 'a, S: 'a = RandomState> { - map: &'a mut OrderMap<K, V, S>, - key: K, - probe: usize, - index: usize, -} - -impl<'a, K, V, S> OccupiedEntry<'a, K, V, S> { - pub fn key(&self) -> &K { &self.key } - pub fn get(&self) -> &V { - &self.map.entries[self.index].value - } - pub fn get_mut(&mut self) -> &mut V { - &mut self.map.entries[self.index].value - } - - /// Return the index of the key-value pair - pub fn index(&self) -> usize { - self.index - } - pub fn into_mut(self) -> &'a mut V { - &mut self.map.entries[self.index].value - } - - pub fn insert(self, value: V) -> V { - replace(&mut self.into_mut(), value) - } - - pub fn remove(self) -> V { - self.remove_entry().1 - } - - /// Remove and return the key, value pair stored in the map for this entry - pub fn remove_entry(self) -> (K, V) { - self.map.remove_found(self.probe, self.index) - } -} - - -pub struct VacantEntry<'a, K: 'a, V: 'a, S: 'a = RandomState> { - map: &'a mut OrderMap<K, V, S>, - key: K, - hash: HashValue, - probe: usize, -} - -impl<'a, K, V, S> VacantEntry<'a, K, V, S> { - pub fn key(&self) -> &K { &self.key } - pub fn into_key(self) -> K { self.key } - /// Return the index where the key-value pair will be inserted. - pub fn index(&self) -> usize { self.map.len() } - pub fn insert(self, value: V) -> &'a mut V { - if self.map.size_class_is_64bit() { - self.insert_impl::<u64>(value) - } else { - self.insert_impl::<u32>(value) - } - } - - fn insert_impl<Sz>(self, value: V) -> &'a mut V - where Sz: Size - { - let index = self.map.entries.len(); - self.map.entries.push(Bucket { hash: self.hash, key: self.key, value: value }); - let old_pos = Pos::with_hash::<Sz>(index, self.hash); - self.map.insert_phase_2::<Sz>(self.probe, old_pos); - &mut {self.map}.entries[index].value - } -} - -impl<K, V, S> OrderMap<K, V, S> - where K: Hash + Eq, - S: BuildHasher, -{ - // Warning, this is a code duplication zone Entry is not yet finished - fn entry_phase_1<Sz>(&mut self, key: K) -> Entry<K, V, S> - where Sz: Size - { - let hash = hash_elem_using(&self.hash_builder, &key); - let mut probe = desired_pos(self.mask, hash); - let mut dist = 0; - debug_assert!(self.len() < self.raw_capacity()); - probe_loop!(probe < self.indices.len(), { - if let Some((i, hash_proxy)) = self.indices[probe].resolve::<Sz>() { - let entry_hash = hash_proxy.get_short_hash(&self.entries, i); - // if existing element probed less than us, swap - let their_dist = probe_distance(self.mask, entry_hash.into_hash(), probe); - if their_dist < dist { - // robin hood: steal the spot if it's better for us - return Entry::Vacant(VacantEntry { - map: self, - hash: hash, - key: key, - probe: probe, - }); - } else if entry_hash == hash && self.entries[i].key == key { - return Entry::Occupied(OccupiedEntry { - map: self, - key: key, - probe: probe, - index: i, - }); - } - } else { - // empty bucket, insert here - return Entry::Vacant(VacantEntry { - map: self, - hash: hash, - key: key, - probe: probe, - }); - } - dist += 1; - }); - } - - /// Remove all key-value pairs in the map, while preserving its capacity. - /// - /// Computes in **O(n)** time. - pub fn clear(&mut self) { - self.entries.clear(); - self.clear_indices(); - } - - // clear self.indices to the same state as "no elements" - fn clear_indices(&mut self) { - for pos in self.indices.iter_mut() { - *pos = Pos::none(); - } - } - - /// Reserve capacity for `additional` more key-value pairs. - /// - /// FIXME Not implemented fully yet. - pub fn reserve(&mut self, additional: usize) { - if additional > 0 { - self.reserve_one(); - } - } - - // First phase: Look for the preferred location for key. - // - // We will know if `key` is already in the map, before we need to insert it. - // When we insert they key, it might be that we need to continue displacing - // entries (robin hood hashing), in which case Inserted::RobinHood is returned - fn insert_phase_1<Sz>(&mut self, key: K, value: V) -> Inserted<V> - where Sz: Size - { - let hash = hash_elem_using(&self.hash_builder, &key); - let mut probe = desired_pos(self.mask, hash); - let mut dist = 0; - let insert_kind; - debug_assert!(self.len() < self.raw_capacity()); - probe_loop!(probe < self.indices.len(), { - let pos = &mut self.indices[probe]; - if let Some((i, hash_proxy)) = pos.resolve::<Sz>() { - let entry_hash = hash_proxy.get_short_hash(&self.entries, i); - // if existing element probed less than us, swap - let their_dist = probe_distance(self.mask, entry_hash.into_hash(), probe); - if their_dist < dist { - // robin hood: steal the spot if it's better for us - let index = self.entries.len(); - insert_kind = Inserted::RobinHood { - probe: probe, - old_pos: Pos::with_hash::<Sz>(index, hash), - }; - break; - } else if entry_hash == hash && self.entries[i].key == key { - return Inserted::Swapped { - prev_value: replace(&mut self.entries[i].value, value), - }; - } - } else { - // empty bucket, insert here - let index = self.entries.len(); - *pos = Pos::with_hash::<Sz>(index, hash); - insert_kind = Inserted::Done; - break; - } - dist += 1; - }); - self.entries.push(Bucket { hash: hash, key: key, value: value }); - insert_kind - } - - fn first_allocation(&mut self) { - debug_assert_eq!(self.len(), 0); - let raw_cap = 8usize; - self.mask = raw_cap.wrapping_sub(1); - self.indices = vec![Pos::none(); raw_cap].into_boxed_slice(); - self.entries = Vec::with_capacity(usable_capacity(raw_cap)); - } - - #[inline(never)] - // `Sz` is *current* Size class, before grow - fn double_capacity<Sz>(&mut self) - where Sz: Size - { - debug_assert!(self.raw_capacity() == 0 || self.len() > 0); - if self.raw_capacity() == 0 { - return self.first_allocation(); - } - - // find first ideally placed element -- start of cluster - let mut first_ideal = 0; - for (i, index) in enumerate(&*self.indices) { - if let Some(pos) = index.pos() { - if 0 == probe_distance(self.mask, self.entries[pos].hash, i) { - first_ideal = i; - break; - } - } - } - - // visit the entries in an order where we can simply reinsert them - // into self.indices without any bucket stealing. - let new_raw_cap = self.indices.len() * 2; - let old_indices = replace(&mut self.indices, vec![Pos::none(); new_raw_cap].into_boxed_slice()); - self.mask = new_raw_cap.wrapping_sub(1); - - // `Sz` is the old size class, and either u32 or u64 is the new - for &pos in &old_indices[first_ideal..] { - dispatch_32_vs_64!(self.reinsert_entry_in_order::<Sz>(pos)); - } - - for &pos in &old_indices[..first_ideal] { - dispatch_32_vs_64!(self.reinsert_entry_in_order::<Sz>(pos)); - } - let more = self.capacity() - self.len(); - self.entries.reserve_exact(more); - } - - // write to self.indices - // read from self.entries at `pos` - // - // reinserting rewrites all `Pos` entries anyway. This handles transitioning - // from u32 to u64 size class if needed by using the two type parameters. - fn reinsert_entry_in_order<SzNew, SzOld>(&mut self, pos: Pos) - where SzNew: Size, - SzOld: Size, - { - if let Some((i, hash_proxy)) = pos.resolve::<SzOld>() { - // only if the size class is conserved can we use the short hash - let entry_hash = if SzOld::is_same_size::<SzNew>() { - hash_proxy.get_short_hash(&self.entries, i).into_hash() - } else { - self.entries[i].hash - }; - // find first empty bucket and insert there - let mut probe = desired_pos(self.mask, entry_hash); - probe_loop!(probe < self.indices.len(), { - if let Some(_) = self.indices[probe].resolve::<SzNew>() { - /* nothing */ - } else { - // empty bucket, insert here - self.indices[probe] = Pos::with_hash::<SzNew>(i, entry_hash); - return; - } - }); - } - } - - fn reserve_one(&mut self) { - if self.len() == self.capacity() { - dispatch_32_vs_64!(self.double_capacity()); - } - } - - /// Insert a key-value pair in the map. - /// - /// If an equivalent key already exists in the map: the key remains and - /// retains in its place in the order, its corresponding value is updated - /// with `value` and the older value is returned inside `Some(_)`. - /// - /// If no equivalent key existed in the map: the new key-value pair is - /// inserted, last in order, and `None` is returned. - /// - /// Computes in **O(1)** time (amortized average). - /// - /// See also [`entry`](#method.entry) if you you want to insert *or* modify - /// or if you need to get the `index` of the corresponding key-value pair. - pub fn insert(&mut self, key: K, value: V) -> Option<V> { - self.reserve_one(); - if self.size_class_is_64bit() { - match self.insert_phase_1::<u64>(key, value) { - Inserted::Swapped { prev_value } => Some(prev_value), - Inserted::Done => None, - Inserted::RobinHood { probe, old_pos } => { - self.insert_phase_2::<u64>(probe, old_pos); - None - } - } - } else { - match self.insert_phase_1::<u32>(key, value) { - Inserted::Swapped { prev_value } => Some(prev_value), - Inserted::Done => None, - Inserted::RobinHood { probe, old_pos } => { - self.insert_phase_2::<u32>(probe, old_pos); - None - } - } - } - } - - /// Get the given key’s corresponding entry in the map for insertion and/or - /// in-place manipulation. - /// - /// Computes in **O(1)** time (amortized average). - pub fn entry(&mut self, key: K) -> Entry<K, V, S> { - self.reserve_one(); - dispatch_32_vs_64!(self.entry_phase_1(key)) - } - - - /// Return an iterator over the key-value pairs of the map, in their order - pub fn iter(&self) -> Iter<K, V> { - Iter { - iter: self.entries.iter() - } - } - - /// Return an iterator over the key-value pairs of the map, in their order - pub fn iter_mut(&mut self) -> IterMut<K, V> { - IterMut { - iter: self.entries.iter_mut() - } - } - - /// Return an iterator over the keys of the map, in their order - pub fn keys(&self) -> Keys<K, V> { - Keys { - iter: self.entries.iter() - } - } - - /// Return an iterator over the values of the map, in their order - pub fn values(&self) -> Values<K, V> { - Values { - iter: self.entries.iter() - } - } - - /// Return an iterator over mutable references to the the values of the map, - /// in their order - pub fn values_mut(&mut self) -> ValuesMut<K, V> { - ValuesMut { - iter: self.entries.iter_mut() - } - } - - /// Return `true` if and equivalent to `key` exists in the map. - /// - /// Computes in **O(1)** time (average). - pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool - where Q: Hash + Equivalent<K>, - { - self.find(key).is_some() - } - - /// Return a reference to the value stored for `key`, if it is present, - /// else `None`. - /// - /// Computes in **O(1)** time (average). - pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V> - where Q: Hash + Equivalent<K>, - { - self.get_full(key).map(third) - } - - /// Return item index, key and value - pub fn get_full<Q: ?Sized>(&self, key: &Q) -> Option<(usize, &K, &V)> - where Q: Hash + Equivalent<K>, - { - if let Some((_, found)) = self.find(key) { - let entry = &self.entries[found]; - Some((found, &entry.key, &entry.value)) - } else { - None - } - } - - pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V> - where Q: Hash + Equivalent<K>, - { - self.get_full_mut(key).map(third) - } - - pub fn get_full_mut<Q: ?Sized>(&mut self, key: &Q) - -> Option<(usize, &K, &mut V)> - where Q: Hash + Equivalent<K>, - { - self.get_full_mut2(key).map(|(i, k, v)| (i, &*k, v)) - } - - /// Return probe (indices) and position (entries) - fn find<Q: ?Sized>(&self, key: &Q) -> Option<(usize, usize)> - where Q: Hash + Equivalent<K>, - { - if self.len() == 0 { return None; } - let h = hash_elem_using(&self.hash_builder, key); - self.find_using(h, move |entry| { Q::equivalent(key, &entry.key) }) - } - - /// NOTE: Same as .swap_remove - /// - /// Computes in **O(1)** time (average). - pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> - where Q: Hash + Equivalent<K>, - { - self.swap_remove(key) - } - - /// Remove the key-value pair equivalent to `key` and return - /// its value. - /// - /// Like `Vec::swap_remove`, the pair is removed by swapping it with the - /// last element of the map and popping it off. **This perturbs - /// the postion of what used to be the last element!** - /// - /// Return `None` if `key` is not in map. - /// - /// Computes in **O(1)** time (average). - pub fn swap_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> - where Q: Hash + Equivalent<K>, - { - self.swap_remove_full(key).map(third) - } - - /// Remove the key-value pair equivalent to `key` and return it and - /// the index it had. - /// - /// Like `Vec::swap_remove`, the pair is removed by swapping it with the - /// last element of the map and popping it off. **This perturbs - /// the postion of what used to be the last element!** - /// - /// Return `None` if `key` is not in map. - pub fn swap_remove_full<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, K, V)> - where Q: Hash + Equivalent<K>, - { - let (probe, found) = match self.find(key) { - None => return None, - Some(t) => t, - }; - let (k, v) = self.remove_found(probe, found); - Some((found, k, v)) - } - - /// Remove the last key-value pair - /// - /// Computes in **O(1)** time (average). - pub fn pop(&mut self) -> Option<(K, V)> { - self.pop_impl() - } - - /// Scan through each key-value pair in the map and keep those where the - /// closure `keep` returns `true`. - /// - /// The elements are visited in order, and remaining elements keep their - /// order. - /// - /// Computes in **O(n)** time (average). - pub fn retain<F>(&mut self, mut keep: F) - where F: FnMut(&K, &mut V) -> bool, - { - self.retain_mut(move |k, v| keep(k, v)); - } - - fn retain_mut<F>(&mut self, keep: F) - where F: FnMut(&mut K, &mut V) -> bool, - { - dispatch_32_vs_64!(self.retain_in_order_impl::<F>(keep)); - } - - fn retain_in_order_impl<Sz, F>(&mut self, mut keep: F) - where F: FnMut(&mut K, &mut V) -> bool, - Sz: Size, - { - // Like Vec::retain in self.entries; for each removed key-value pair, - // we clear its corresponding spot in self.indices, and run the - // usual backward shift in self.indices. - let len = self.entries.len(); - let mut n_deleted = 0; - for i in 0..len { - let will_keep; - let hash; - { - let ent = &mut self.entries[i]; - hash = ent.hash; - will_keep = keep(&mut ent.key, &mut ent.value); - }; - let probe = find_existing_entry_at::<Sz>(&self.indices, hash, self.mask, i); - if !will_keep { - n_deleted += 1; - self.indices[probe] = Pos::none(); - self.backward_shift_after_removal::<Sz>(probe); - } else if n_deleted > 0 { - self.indices[probe].set_pos::<Sz>(i - n_deleted); - self.entries.swap(i - n_deleted, i); - } - } - self.entries.truncate(len - n_deleted); - } - - /// Sort the map’s key-value pairs by the default ordering of the keys. - /// - /// See `sort_by` for details. - pub fn sort_keys(&mut self) - where K: Ord, - { - self.sort_by(|k1, _, k2, _| Ord::cmp(k1, k2)) - } - - /// Sort the map’s key-value pairs in place using the comparison - /// function `compare`. - /// - /// The comparison function receives two key and value pairs to compare (you - /// can sort by keys or values or their combination as needed). - /// - /// Computes in **O(n log n + c)** time and **O(n)** space where *n* is - /// the length of the map and *c* the capacity. The sort is stable. - pub fn sort_by<F>(&mut self, mut compare: F) - where F: FnMut(&K, &V, &K, &V) -> Ordering, - { - // here we temporarily use the hash field in a bucket to store the old - // index instead. - // - // Save the old hash values in `side_index`. - // Then we can sort `self.entries` in place. - let mut side_index = Vec::from_iter(enumerate(&mut self.entries).map(|(i, elt)| { - replace(&mut elt.hash, HashValue(i)).get() - })); - - self.entries.sort_by(move |ei, ej| compare(&ei.key, &ei.value, &ej.key, &ej.value)); - - // Here we write back the hash values from side_index and fill - // in side_index with a mapping from the old to the new index instead. - for (i, ent) in enumerate(&mut self.entries) { - let old_index = ent.hash.get(); - ent.hash = HashValue(replace(&mut side_index[old_index], i)); - } - - // Apply new index to self.indices - dispatch_32_vs_64!(self.apply_new_index(&side_index)); - } - - fn apply_new_index<Sz>(&mut self, new_index: &[usize]) - where Sz: Size - { - for pos in self.indices.iter_mut() { - if let Some((i, _)) = pos.resolve::<Sz>() { - pos.set_pos::<Sz>(new_index[i]); - } - } - } - - /// Sort the key-value pairs of the map and return a by value iterator of - /// the key-value pairs with the result. - /// - /// The sort is stable. - pub fn sorted_by<F>(mut self, mut cmp: F) -> IntoIter<K, V> - where F: FnMut(&K, &V, &K, &V) -> Ordering - { - self.entries.sort_by(move |a, b| cmp(&a.key, &a.value, &b.key, &b.value)); - self.into_iter() - } - - /// Clears the `OrderMap`, returning all key-value pairs as a drain iterator. - /// Keeps the allocated memory for reuse. - pub fn drain(&mut self, range: RangeFull) -> Drain<K, V> { - self.clear_indices(); - - Drain { - iter: self.entries.drain(range), - } - } -} - -impl<K, V, S> OrderMap<K, V, S> { - /// Get a key-value pair by index - /// - /// Valid indices are *0 <= index < self.len()* - /// - /// Computes in **O(1)** time. - pub fn get_index(&self, index: usize) -> Option<(&K, &V)> { - self.entries.get(index).map(|ent| (&ent.key, &ent.value)) - } - - /// Get a key-value pair by index - /// - /// Valid indices are *0 <= index < self.len()* - /// - /// Computes in **O(1)** time. - pub fn get_index_mut(&mut self, index: usize) -> Option<(&mut K, &mut V)> { - self.entries.get_mut(index).map(|ent| (&mut ent.key, &mut ent.value)) - } - - /// Remove the key-value pair by index - /// - /// Valid indices are *0 <= index < self.len()* - /// - /// Computes in **O(1)** time (average). - pub fn swap_remove_index(&mut self, index: usize) -> Option<(K, V)> { - let (probe, found) = match self.entries.get(index) - .map(|e| self.find_existing_entry(e)) - { - None => return None, - Some(t) => t, - }; - Some(self.remove_found(probe, found)) - } -} - -// Methods that don't use any properties (Hash / Eq) of K. -// -// It's cleaner to separate them out, then the compiler checks that we are not -// using Hash + Eq at all in these methods. -// -// However, we should probably not let this show in the public API or docs. -impl<K, V, S> OrderMap<K, V, S> { - fn pop_impl(&mut self) -> Option<(K, V)> { - let (probe, found) = match self.entries.last() - .map(|e| self.find_existing_entry(e)) - { - None => return None, - Some(t) => t, - }; - debug_assert_eq!(found, self.entries.len() - 1); - Some(self.remove_found(probe, found)) - } - - /// phase 2 is post-insert where we forward-shift `Pos` in the indices. - fn insert_phase_2<Sz>(&mut self, mut probe: usize, mut old_pos: Pos) - where Sz: Size - { - probe_loop!(probe < self.indices.len(), { - let pos = &mut self.indices[probe]; - if pos.is_none() { - *pos = old_pos; - break; - } else { - old_pos = replace(pos, old_pos); - } - }); - } - - - /// Return probe (indices) and position (entries) - fn find_using<F>(&self, hash: HashValue, key_eq: F) -> Option<(usize, usize)> - where F: Fn(&Bucket<K, V>) -> bool, - { - dispatch_32_vs_64!(self.find_using_impl::<_>(hash, key_eq)) - } - - fn find_using_impl<Sz, F>(&self, hash: HashValue, key_eq: F) -> Option<(usize, usize)> - where F: Fn(&Bucket<K, V>) -> bool, - Sz: Size, - { - debug_assert!(self.len() > 0); - let mut probe = desired_pos(self.mask, hash); - let mut dist = 0; - probe_loop!(probe < self.indices.len(), { - if let Some((i, hash_proxy)) = self.indices[probe].resolve::<Sz>() { - let entry_hash = hash_proxy.get_short_hash(&self.entries, i); - if dist > probe_distance(self.mask, entry_hash.into_hash(), probe) { - // give up when probe distance is too long - return None; - } else if entry_hash == hash && key_eq(&self.entries[i]) { - return Some((probe, i)); - } - } else { - return None; - } - dist += 1; - }); - } - - /// Find `entry` which is already placed inside self.entries; - /// return its probe and entry index. - fn find_existing_entry(&self, entry: &Bucket<K, V>) -> (usize, usize) - { - debug_assert!(self.len() > 0); - dispatch_32_vs_64!(self.find_existing_entry_impl(entry)) - } - - fn find_existing_entry_impl<Sz>(&self, entry: &Bucket<K, V>) -> (usize, usize) - where Sz: Size, - { - let hash = entry.hash; - let actual_pos = ptrdistance(&self.entries[0], entry); - let probe = find_existing_entry_at::<Sz>(&self.indices, hash, self.mask, actual_pos); - (probe, actual_pos) - } - - fn remove_found(&mut self, probe: usize, found: usize) -> (K, V) { - dispatch_32_vs_64!(self.remove_found_impl(probe, found)) - } - - fn remove_found_impl<Sz>(&mut self, probe: usize, found: usize) -> (K, V) - where Sz: Size - { - // index `probe` and entry `found` is to be removed - // use swap_remove, but then we need to update the index that points - // to the other entry that has to move - self.indices[probe] = Pos::none(); - let entry = self.entries.swap_remove(found); - - // correct index that points to the entry that had to swap places - if let Some(entry) = self.entries.get(found) { - // was not last element - // examine new element in `found` and find it in indices - let mut probe = desired_pos(self.mask, entry.hash); - probe_loop!(probe < self.indices.len(), { - if let Some((i, _)) = self.indices[probe].resolve::<Sz>() { - if i >= self.entries.len() { - // found it - self.indices[probe] = Pos::with_hash::<Sz>(found, entry.hash); - break; - } - } - }); - } - - self.backward_shift_after_removal::<Sz>(probe); - - (entry.key, entry.value) - } - - fn backward_shift_after_removal<Sz>(&mut self, probe_at_remove: usize) - where Sz: Size - { - // backward shift deletion in self.indices - // after probe, shift all non-ideally placed indices backward - let mut last_probe = probe_at_remove; - let mut probe = probe_at_remove + 1; - probe_loop!(probe < self.indices.len(), { - if let Some((i, hash_proxy)) = self.indices[probe].resolve::<Sz>() { - let entry_hash = hash_proxy.get_short_hash(&self.entries, i); - if probe_distance(self.mask, entry_hash.into_hash(), probe) > 0 { - self.indices[last_probe] = self.indices[probe]; - self.indices[probe] = Pos::none(); - } else { - break; - } - } else { - break; - } - last_probe = probe; - }); - } - -} - -/// Find, in the indices, an entry that already exists at a known position -/// inside self.entries in the OrderMap. -/// -/// This is effectively reverse lookup, from the entries into the hash buckets. -/// -/// Return the probe index (into self.indices) -/// -/// + indices: The self.indices of the map, -/// + hash: The full hash value from the bucket -/// + mask: self.mask. -/// + entry_index: The index of the entry in self.entries -fn find_existing_entry_at<Sz>(indices: &[Pos], hash: HashValue, - mask: usize, entry_index: usize) -> usize - where Sz: Size, -{ - let mut probe = desired_pos(mask, hash); - probe_loop!(probe < indices.len(), { - // the entry *must* be present; if we hit a Pos::none this was not true - // and there is a debug assertion in resolve_existing_index for that. - let i = indices[probe].resolve_existing_index::<Sz>(); - if i == entry_index { return probe; } - }); -} - -use std::slice::Iter as SliceIter; -use std::slice::IterMut as SliceIterMut; -use std::vec::IntoIter as VecIntoIter; - -pub struct Keys<'a, K: 'a, V: 'a> { - iter: SliceIter<'a, Bucket<K, V>>, -} - -impl<'a, K, V> Iterator for Keys<'a, K, V> { - type Item = &'a K; - - iterator_methods!(|entry| &entry.key); -} - -impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> { - fn next_back(&mut self) -> Option<&'a K> { - self.iter.next_back().map(|ent| &ent.key) - } -} - -impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> { - fn len(&self) -> usize { - self.iter.len() - } -} - -pub struct Values<'a, K: 'a, V: 'a> { - iter: SliceIter<'a, Bucket<K, V>>, -} - -impl<'a, K, V> Iterator for Values<'a, K, V> { - type Item = &'a V; - - iterator_methods!(|ent| &ent.value); -} - -impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map(|ent| &ent.value) - } -} - -impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> { - fn len(&self) -> usize { - self.iter.len() - } -} - -pub struct ValuesMut<'a, K: 'a, V: 'a> { - iter: SliceIterMut<'a, Bucket<K, V>>, -} - -impl<'a, K, V> Iterator for ValuesMut<'a, K, V> { - type Item = &'a mut V; - - iterator_methods!(|ent| &mut ent.value); -} - -impl<'a, K, V> DoubleEndedIterator for ValuesMut<'a, K, V> { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map(|ent| &mut ent.value) - } -} - -impl<'a, K, V> ExactSizeIterator for ValuesMut<'a, K, V> { - fn len(&self) -> usize { - self.iter.len() - } -} - -pub struct Iter<'a, K: 'a, V: 'a> { - iter: SliceIter<'a, Bucket<K, V>>, -} - -impl<'a, K, V> Iterator for Iter<'a, K, V> { - type Item = (&'a K, &'a V); - - iterator_methods!(|e| (&e.key, &e.value)); -} - -impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map(|e| (&e.key, &e.value)) - } -} - -impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> { - fn len(&self) -> usize { - self.iter.len() - } -} - -pub struct IterMut<'a, K: 'a, V: 'a> { - iter: SliceIterMut<'a, Bucket<K, V>>, -} - -impl<'a, K, V> Iterator for IterMut<'a, K, V> { - type Item = (&'a K, &'a mut V); - - iterator_methods!(|e| (&e.key, &mut e.value)); -} - -impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map(|e| (&e.key, &mut e.value)) - } -} - -impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> { - fn len(&self) -> usize { - self.iter.len() - } -} - -pub struct IntoIter<K, V> { - iter: VecIntoIter<Bucket<K, V>>, -} - -impl<K, V> Iterator for IntoIter<K, V> { - type Item = (K, V); - - iterator_methods!(|entry| (entry.key, entry.value)); -} - -impl<'a, K, V> DoubleEndedIterator for IntoIter<K, V> { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map(|entry| (entry.key, entry.value)) - } -} - -impl<K, V> ExactSizeIterator for IntoIter<K, V> { - fn len(&self) -> usize { - self.iter.len() - } -} - -pub struct Drain<'a, K, V> where K: 'a, V: 'a { - iter: ::std::vec::Drain<'a, Bucket<K, V>> -} - -impl<'a, K, V> Iterator for Drain<'a, K, V> { - type Item = (K, V); - - iterator_methods!(|bucket| (bucket.key, bucket.value)); -} - -impl<'a, K, V> DoubleEndedIterator for Drain<'a, K, V> { - double_ended_iterator_methods!(|bucket| (bucket.key, bucket.value)); -} - - -impl<'a, K, V, S> IntoIterator for &'a OrderMap<K, V, S> - where K: Hash + Eq, - S: BuildHasher, -{ - type Item = (&'a K, &'a V); - type IntoIter = Iter<'a, K, V>; - fn into_iter(self) -> Self::IntoIter { - self.iter() - } -} - -impl<'a, K, V, S> IntoIterator for &'a mut OrderMap<K, V, S> - where K: Hash + Eq, - S: BuildHasher, -{ - type Item = (&'a K, &'a mut V); - type IntoIter = IterMut<'a, K, V>; - fn into_iter(self) -> Self::IntoIter { - self.iter_mut() - } -} - -impl<K, V, S> IntoIterator for OrderMap<K, V, S> - where K: Hash + Eq, - S: BuildHasher, -{ - type Item = (K, V); - type IntoIter = IntoIter<K, V>; - fn into_iter(self) -> Self::IntoIter { - IntoIter { - iter: self.entries.into_iter(), - } - } -} - -use std::ops::{Index, IndexMut}; - -impl<'a, K, V, Q: ?Sized, S> Index<&'a Q> for OrderMap<K, V, S> - where Q: Hash + Equivalent<K>, - K: Hash + Eq, - S: BuildHasher, -{ - type Output = V; - - /// ***Panics*** if `key` is not present in the map. - fn index(&self, key: &'a Q) -> &V { - if let Some(v) = self.get(key) { - v - } else { - panic!("OrderMap: key not found") - } - } -} - -/// Mutable indexing allows changing / updating values of key-value -/// pairs that are already present. -/// -/// You can **not** insert new pairs with index syntax, use `.insert()`. -impl<'a, K, V, Q: ?Sized, S> IndexMut<&'a Q> for OrderMap<K, V, S> - where Q: Hash + Equivalent<K>, - K: Hash + Eq, - S: BuildHasher, -{ - /// ***Panics*** if `key` is not present in the map. - fn index_mut(&mut self, key: &'a Q) -> &mut V { - if let Some(v) = self.get_mut(key) { - v - } else { - panic!("OrderMap: key not found") - } - } -} - -impl<K, V, S> FromIterator<(K, V)> for OrderMap<K, V, S> - where K: Hash + Eq, - S: BuildHasher + Default, -{ - /// Create an `OrderMap` from the sequence of key-value pairs in the - /// iterable. - /// - /// `from_iter` uses the same logic as `extend`. See - /// [`extend`](#method.extend) for more details. - fn from_iter<I: IntoIterator<Item=(K, V)>>(iterable: I) -> Self { - let iter = iterable.into_iter(); - let (low, _) = iter.size_hint(); - let mut map = Self::with_capacity_and_hasher(low, <_>::default()); - map.extend(iter); - map - } -} - -impl<K, V, S> Extend<(K, V)> for OrderMap<K, V, S> - where K: Hash + Eq, - S: BuildHasher, -{ - /// Extend the map with all key-value pairs in the iterable. - /// - /// This is equivalent to calling [`insert`](#method.insert) for each of - /// them in order, which means that for keys that already existed - /// in the map, their value is updated but it keeps the existing order. - /// - /// New keys are inserted inserted in the order in the sequence. If - /// equivalents of a key occur more than once, the last corresponding value - /// prevails. - fn extend<I: IntoIterator<Item=(K, V)>>(&mut self, iterable: I) { - for (k, v) in iterable { self.insert(k, v); } - } -} - -impl<'a, K, V, S> Extend<(&'a K, &'a V)> for OrderMap<K, V, S> - where K: Hash + Eq + Copy, - V: Copy, - S: BuildHasher, -{ - /// Extend the map with all key-value pairs in the iterable. - /// - /// See the first extend method for more details. - fn extend<I: IntoIterator<Item=(&'a K, &'a V)>>(&mut self, iterable: I) { - self.extend(iterable.into_iter().map(|(&key, &value)| (key, value))); - } -} - -impl<K, V, S> Default for OrderMap<K, V, S> - where S: BuildHasher + Default, -{ - /// Return an empty `OrderMap` - fn default() -> Self { - Self::with_capacity_and_hasher(0, S::default()) - } -} - -impl<K, V1, S1, V2, S2> PartialEq<OrderMap<K, V2, S2>> for OrderMap<K, V1, S1> - where K: Hash + Eq, - V1: PartialEq<V2>, - S1: BuildHasher, - S2: BuildHasher -{ - fn eq(&self, other: &OrderMap<K, V2, S2>) -> bool { - if self.len() != other.len() { - return false; - } - - self.iter().all(|(key, value)| other.get(key).map_or(false, |v| *value == *v)) - } -} - -impl<K, V, S> Eq for OrderMap<K, V, S> - where K: Eq + Hash, - V: Eq, - S: BuildHasher -{ -} - -#[cfg(test)] -mod tests { - use super::*; - use util::enumerate; - - #[test] - fn it_works() { - let mut map = OrderMap::new(); - assert_eq!(map.is_empty(), true); - map.insert(1, ()); - map.insert(1, ()); - assert_eq!(map.len(), 1); - assert!(map.get(&1).is_some()); - assert_eq!(map.is_empty(), false); - } - - #[test] - fn new() { - let map = OrderMap::<String, String>::new(); - println!("{:?}", map); - assert_eq!(map.capacity(), 0); - assert_eq!(map.len(), 0); - assert_eq!(map.is_empty(), true); - } - - #[test] - fn insert() { - let insert = [0, 4, 2, 12, 8, 7, 11, 5]; - let not_present = [1, 3, 6, 9, 10]; - let mut map = OrderMap::with_capacity(insert.len()); - - for (i, &elt) in enumerate(&insert) { - assert_eq!(map.len(), i); - map.insert(elt, elt); - assert_eq!(map.len(), i + 1); - assert_eq!(map.get(&elt), Some(&elt)); - assert_eq!(map[&elt], elt); - } - println!("{:?}", map); - - for &elt in ¬_present { - assert!(map.get(&elt).is_none()); - } - } - - #[test] - fn insert_2() { - let mut map = OrderMap::with_capacity(16); - - let mut keys = vec![]; - keys.extend(0..16); - keys.extend(128..267); - - for &i in &keys { - let old_map = map.clone(); - map.insert(i, ()); - for key in old_map.keys() { - if !map.get(key).is_some() { - println!("old_map: {:?}", old_map); - println!("map: {:?}", map); - panic!("did not find {} in map", key); - } - } - } - - for &i in &keys { - assert!(map.get(&i).is_some(), "did not find {}", i); - } - } - - #[test] - fn insert_order() { - let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23]; - let mut map = OrderMap::new(); - - for &elt in &insert { - map.insert(elt, ()); - } - - assert_eq!(map.keys().count(), map.len()); - assert_eq!(map.keys().count(), insert.len()); - for (a, b) in insert.iter().zip(map.keys()) { - assert_eq!(a, b); - } - for (i, k) in (0..insert.len()).zip(map.keys()) { - assert_eq!(map.get_index(i).unwrap().0, k); - } - } - - #[test] - fn grow() { - let insert = [0, 4, 2, 12, 8, 7, 11]; - let not_present = [1, 3, 6, 9, 10]; - let mut map = OrderMap::with_capacity(insert.len()); - - - for (i, &elt) in enumerate(&insert) { - assert_eq!(map.len(), i); - map.insert(elt, elt); - assert_eq!(map.len(), i + 1); - assert_eq!(map.get(&elt), Some(&elt)); - assert_eq!(map[&elt], elt); - } - - println!("{:?}", map); - for &elt in &insert { - map.insert(elt * 10, elt); - } - for &elt in &insert { - map.insert(elt * 100, elt); - } - for (i, &elt) in insert.iter().cycle().enumerate().take(100) { - map.insert(elt * 100 + i as i32, elt); - } - println!("{:?}", map); - for &elt in ¬_present { - assert!(map.get(&elt).is_none()); - } - } - - #[test] - fn remove() { - let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23]; - let mut map = OrderMap::new(); - - for &elt in &insert { - map.insert(elt, elt); - } - - assert_eq!(map.keys().count(), map.len()); - assert_eq!(map.keys().count(), insert.len()); - for (a, b) in insert.iter().zip(map.keys()) { - assert_eq!(a, b); - } - - let remove_fail = [99, 77]; - let remove = [4, 12, 8, 7]; - - for &key in &remove_fail { - assert!(map.swap_remove_full(&key).is_none()); - } - println!("{:?}", map); - for &key in &remove { - //println!("{:?}", map); - let index = map.get_full(&key).unwrap().0; - assert_eq!(map.swap_remove_full(&key), Some((index, key, key))); - } - println!("{:?}", map); - - for key in &insert { - assert_eq!(map.get(key).is_some(), !remove.contains(key)); - } - assert_eq!(map.len(), insert.len() - remove.len()); - assert_eq!(map.keys().count(), insert.len() - remove.len()); - } - - #[test] - fn remove_to_empty() { - let mut map = ordermap! { 0 => 0, 4 => 4, 5 => 5 }; - map.swap_remove(&5).unwrap(); - map.swap_remove(&4).unwrap(); - map.swap_remove(&0).unwrap(); - assert!(map.is_empty()); - } - - #[test] - fn swap_remove_index() { - let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23]; - let mut map = OrderMap::new(); - - for &elt in &insert { - map.insert(elt, elt * 2); - } - - let mut vector = insert.to_vec(); - let remove_sequence = &[3, 3, 10, 4, 5, 4, 3, 0, 1]; - - // check that the same swap remove sequence on vec and map - // have the same result. - for &rm in remove_sequence { - let out_vec = vector.swap_remove(rm); - let (out_map, _) = map.swap_remove_index(rm).unwrap(); - assert_eq!(out_vec, out_map); - } - assert_eq!(vector.len(), map.len()); - for (a, b) in vector.iter().zip(map.keys()) { - assert_eq!(a, b); - } - } - - #[test] - fn partial_eq_and_eq() { - let mut map_a = OrderMap::new(); - map_a.insert(1, "1"); - map_a.insert(2, "2"); - let mut map_b = map_a.clone(); - assert_eq!(map_a, map_b); - map_b.remove(&1); - assert_ne!(map_a, map_b); - - let map_c: OrderMap<_, String> = map_b.into_iter().map(|(k, v)| (k, v.to_owned())).collect(); - assert_ne!(map_a, map_c); - assert_ne!(map_c, map_a); - } - - #[test] - fn extend() { - let mut map = OrderMap::new(); - map.extend(vec![(&1, &2), (&3, &4)]); - map.extend(vec![(5, 6)]); - assert_eq!(map.into_iter().collect::<Vec<_>>(), vec![(1, 2), (3, 4), (5, 6)]); - } - - #[test] - fn entry() { - let mut map = OrderMap::new(); - - map.insert(1, "1"); - map.insert(2, "2"); - { - let e = map.entry(3); - assert_eq!(e.index(), 2); - let e = e.or_insert("3"); - assert_eq!(e, &"3"); - } - - let e = map.entry(2); - assert_eq!(e.index(), 1); - assert_eq!(e.key(), &2); - match e { - Entry::Occupied(ref e) => assert_eq!(e.get(), &"2"), - Entry::Vacant(_) => panic!() - } - assert_eq!(e.or_insert("4"), &"2"); - } -} diff --git a/vendor/ordermap/src/macros.rs b/vendor/ordermap/src/macros.rs deleted file mode 100644 index 27d7afec36..0000000000 --- a/vendor/ordermap/src/macros.rs +++ /dev/null @@ -1,122 +0,0 @@ - -#[macro_export] -/// Create an `OrderMap` from a list of key-value pairs -/// -/// ## Example -/// -/// ``` -/// #[macro_use] extern crate ordermap; -/// # fn main() { -/// -/// let map = ordermap!{ -/// "a" => 1, -/// "b" => 2, -/// }; -/// assert_eq!(map["a"], 1); -/// assert_eq!(map["b"], 2); -/// assert_eq!(map.get("c"), None); -/// -/// // "a" is the first key -/// assert_eq!(map.keys().next(), Some(&"a")); -/// # } -/// ``` -macro_rules! ordermap { - (@single $($x:tt)*) => (()); - (@count $($rest:expr),*) => (<[()]>::len(&[$(ordermap!(@single $rest)),*])); - - ($($key:expr => $value:expr,)+) => { ordermap!($($key => $value),+) }; - ($($key:expr => $value:expr),*) => { - { - let _cap = ordermap!(@count $($key),*); - let mut _map = $crate::OrderMap::with_capacity(_cap); - $( - _map.insert($key, $value); - )* - _map - } - }; -} - -#[macro_export] -/// Create an `OrderSet` from a list of values -/// -/// ## Example -/// -/// ``` -/// #[macro_use] extern crate ordermap; -/// # fn main() { -/// -/// let set = orderset!{ -/// "a", -/// "b", -/// }; -/// assert!(set.contains("a")); -/// assert!(set.contains("b")); -/// assert!(!set.contains("c")); -/// -/// // "a" is the first value -/// assert_eq!(set.iter().next(), Some(&"a")); -/// # } -/// ``` -macro_rules! orderset { - (@single $($x:tt)*) => (()); - (@count $($rest:expr),*) => (<[()]>::len(&[$(orderset!(@single $rest)),*])); - - ($($value:expr,)+) => { orderset!($($value),+) }; - ($($value:expr),*) => { - { - let _cap = orderset!(@count $($value),*); - let mut _set = $crate::OrderSet::with_capacity(_cap); - $( - _set.insert($value); - )* - _set - } - }; -} - -// generate all the Iterator methods by just forwarding to the underlying -// self.iter and mapping its element. -macro_rules! iterator_methods { - // $map_elt is the mapping function from the underlying iterator's element - // same mapping function for both options and iterators - ($map_elt:expr) => { - fn next(&mut self) -> Option<Self::Item> { - self.iter.next().map($map_elt) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } - - fn count(self) -> usize { - self.iter.len() - } - - fn nth(&mut self, n: usize) -> Option<Self::Item> { - self.iter.nth(n).map($map_elt) - } - - fn last(mut self) -> Option<Self::Item> { - self.next_back() - } - - fn collect<C>(self) -> C - where C: FromIterator<Self::Item> - { - // NB: forwarding this directly to standard iterators will - // allow it to leverage unstable traits like `TrustedLen`. - self.iter.map($map_elt).collect() - } - } -} - -macro_rules! double_ended_iterator_methods { - // $map_elt is the mapping function from the underlying iterator's element - // same mapping function for both options and iterators - ($map_elt:expr) => { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map($map_elt) - } - } -} diff --git a/vendor/ordermap/src/mutable_keys.rs b/vendor/ordermap/src/mutable_keys.rs deleted file mode 100644 index 32c8b2e581..0000000000 --- a/vendor/ordermap/src/mutable_keys.rs +++ /dev/null @@ -1,76 +0,0 @@ - -use std::hash::Hash; -use std::hash::BuildHasher; - -use super::{OrderMap, Equivalent}; - -pub struct PrivateMarker { } - -/// Opt-in mutable access to keys. -/// -/// These methods expose `&mut K`, mutable references to the key as it is stored -/// in the map. -/// You are allowed to modify the keys in the hashmap **if the modifcation -/// does not change the key’s hash and equality**. -/// -/// If keys are modified erronously, you can no longer look them up. -/// This is sound (memory safe) but a logical error hazard (just like -/// implementing PartialEq, Eq, or Hash incorrectly would be). -/// -/// `use` this trait to enable its methods for `OrderMap`. -pub trait MutableKeys { - type Key; - type Value; - - /// Return item index, mutable reference to key and value - fn get_full_mut2<Q: ?Sized>(&mut self, key: &Q) - -> Option<(usize, &mut Self::Key, &mut Self::Value)> - where Q: Hash + Equivalent<Self::Key>; - - /// Scan through each key-value pair in the map and keep those where the - /// closure `keep` returns `true`. - /// - /// The elements are visited in order, and remaining elements keep their - /// order. - /// - /// Computes in **O(n)** time (average). - fn retain2<F>(&mut self, keep: F) - where F: FnMut(&mut Self::Key, &mut Self::Value) -> bool; - - /// This method is not useful in itself – it is there to “seal” the trait - /// for external implementation, so that we can add methods without - /// causing breaking changes. - fn __private_marker(&self) -> PrivateMarker; -} - -/// Opt-in mutable access to keys. -/// -/// See [`MutableKeys`](trait.MutableKeys.html) for more information. -impl<K, V, S> MutableKeys for OrderMap<K, V, S> - where K: Eq + Hash, - S: BuildHasher, -{ - type Key = K; - type Value = V; - fn get_full_mut2<Q: ?Sized>(&mut self, key: &Q) - -> Option<(usize, &mut K, &mut V)> - where Q: Hash + Equivalent<K>, - { - if let Some((_, found)) = self.find(key) { - let entry = &mut self.entries[found]; - Some((found, &mut entry.key, &mut entry.value)) - } else { - None - } - } - - fn retain2<F>(&mut self, keep: F) - where F: FnMut(&mut K, &mut V) -> bool, - { - self.retain_mut(keep) - } - - fn __private_marker(&self) -> PrivateMarker { - PrivateMarker { } - } -} diff --git a/vendor/ordermap/src/serde.rs b/vendor/ordermap/src/serde.rs deleted file mode 100644 index ac428d9186..0000000000 --- a/vendor/ordermap/src/serde.rs +++ /dev/null @@ -1,123 +0,0 @@ - -extern crate serde; - -use self::serde::ser::{Serialize, Serializer, SerializeMap, SerializeSeq}; -use self::serde::de::{Deserialize, Deserializer, MapAccess, SeqAccess, Visitor}; - -use std::fmt::{self, Formatter}; -use std::hash::{BuildHasher, Hash}; -use std::marker::PhantomData; - -use OrderMap; - -/// Requires crate feature `"serde-1"` -impl<K, V, S> Serialize for OrderMap<K, V, S> - where K: Serialize + Hash + Eq, - V: Serialize, - S: BuildHasher -{ - fn serialize<T>(&self, serializer: T) -> Result<T::Ok, T::Error> - where T: Serializer - { - let mut map_serializer = try!(serializer.serialize_map(Some(self.len()))); - for (key, value) in self { - try!(map_serializer.serialize_entry(key, value)); - } - map_serializer.end() - } -} - -struct OrderMapVisitor<K, V, S>(PhantomData<(K, V, S)>); - -impl<'de, K, V, S> Visitor<'de> for OrderMapVisitor<K, V, S> - where K: Deserialize<'de> + Eq + Hash, - V: Deserialize<'de>, - S: Default + BuildHasher -{ - type Value = OrderMap<K, V, S>; - - fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { - write!(formatter, "a map") - } - - fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> - where A: MapAccess<'de> - { - let mut values = OrderMap::with_capacity_and_hasher(map.size_hint().unwrap_or(0), S::default()); - - while let Some((key, value)) = try!(map.next_entry()) { - values.insert(key, value); - } - - Ok(values) - } -} - -/// Requires crate feature `"serde-1"` -impl<'de, K, V, S> Deserialize<'de> for OrderMap<K, V, S> - where K: Deserialize<'de> + Eq + Hash, - V: Deserialize<'de>, - S: Default + BuildHasher -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where D: Deserializer<'de> - { - deserializer.deserialize_map(OrderMapVisitor(PhantomData)) - } -} - - -use OrderSet; - -/// Requires crate feature `"serde-1"` -impl<T, S> Serialize for OrderSet<T, S> - where T: Serialize + Hash + Eq, - S: BuildHasher -{ - fn serialize<Se>(&self, serializer: Se) -> Result<Se::Ok, Se::Error> - where Se: Serializer - { - let mut set_serializer = try!(serializer.serialize_seq(Some(self.len()))); - for value in self { - try!(set_serializer.serialize_element(value)); - } - set_serializer.end() - } -} - -struct OrderSetVisitor<T, S>(PhantomData<(T, S)>); - -impl<'de, T, S> Visitor<'de> for OrderSetVisitor<T, S> - where T: Deserialize<'de> + Eq + Hash, - S: Default + BuildHasher -{ - type Value = OrderSet<T, S>; - - fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { - write!(formatter, "a set") - } - - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where A: SeqAccess<'de> - { - let mut values = OrderSet::with_capacity_and_hasher(seq.size_hint().unwrap_or(0), S::default()); - - while let Some(value) = try!(seq.next_element()) { - values.insert(value); - } - - Ok(values) - } -} - -/// Requires crate feature `"serde-1"` -impl<'de, T, S> Deserialize<'de> for OrderSet<T, S> - where T: Deserialize<'de> + Eq + Hash, - S: Default + BuildHasher -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where D: Deserializer<'de> - { - deserializer.deserialize_seq(OrderSetVisitor(PhantomData)) - } -} diff --git a/vendor/ordermap/src/set.rs b/vendor/ordermap/src/set.rs deleted file mode 100644 index 6a7fd36c64..0000000000 --- a/vendor/ordermap/src/set.rs +++ /dev/null @@ -1,1136 +0,0 @@ -//! A hash set implemented using `OrderMap` - -use std::cmp::Ordering; -use std::collections::hash_map::RandomState; -use std::fmt; -use std::iter::{FromIterator, Chain}; -use std::hash::{Hash, BuildHasher}; -use std::mem::replace; -use std::ops::RangeFull; -use std::ops::{BitAnd, BitOr, BitXor, Sub}; -use std::slice; -use std::vec; - -use super::{OrderMap, Equivalent}; - -type Bucket<T> = super::Bucket<T, ()>; - -/// A hash set where the iteration order of the values is independent of their -/// hash values. -/// -/// The interface is closely compatible with the standard `HashSet`, but also -/// has additional features. -/// -/// # Order -/// -/// The values have a consistent order that is determined by the sequence of -/// insertion and removal calls on the set. The order does not depend on the -/// values or the hash function at all. Note that insertion order and value -/// are not affected if a re-insertion is attempted once an element is -/// already present. -/// -/// All iterators traverse the set *in order*. Set operation iterators like -/// `union` produce a concatenated order, as do their matching "bitwise" -/// operators. See their documentation for specifics. -/// -/// # Indices -/// -/// The values are indexed in a compact range without holes in the range -/// `0..self.len()`. For example, the method `.get_full` looks up the index for -/// a value, and the method `.get_index` looks up the value by index. -/// -/// # Examples -/// -/// ``` -/// use ordermap::OrderSet; -/// -/// // Collects which letters appear in a sentence. -/// let letters: OrderSet<_> = "a short treatise on fungi".chars().collect(); -/// -/// assert!(letters.contains(&'s')); -/// assert!(letters.contains(&'t')); -/// assert!(letters.contains(&'u')); -/// assert!(!letters.contains(&'y')); -/// ``` -#[derive(Clone)] -pub struct OrderSet<T, S = RandomState> { - map: OrderMap<T, (), S>, -} - -impl<T, S> fmt::Debug for OrderSet<T, S> - where T: fmt::Debug + Hash + Eq, - S: BuildHasher, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - if cfg!(not(feature = "test_debug")) { - f.debug_set().entries(self.iter()).finish() - } else { - // Let the inner `OrderMap` print all of its details - f.debug_struct("OrderSet").field("map", &self.map).finish() - } - } -} - -impl<T> OrderSet<T> { - /// Create a new set. (Does not allocate.) - pub fn new() -> Self { - OrderSet { map: OrderMap::new() } - } - - /// Create a new set with capacity for `n` elements. - /// (Does not allocate if `n` is zero.) - /// - /// Computes in **O(n)** time. - pub fn with_capacity(n: usize) -> Self { - OrderSet { map: OrderMap::with_capacity(n) } - } -} - -impl<T, S> OrderSet<T, S> { - /// Create a new set with capacity for `n` elements. - /// (Does not allocate if `n` is zero.) - /// - /// Computes in **O(n)** time. - pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Self - where S: BuildHasher - { - OrderSet { map: OrderMap::with_capacity_and_hasher(n, hash_builder) } - } - - /// Return the number of elements in the set. - /// - /// Computes in **O(1)** time. - pub fn len(&self) -> usize { - self.map.len() - } - - /// Returns true if the set contains no elements. - /// - /// Computes in **O(1)** time. - pub fn is_empty(&self) -> bool { - self.map.is_empty() - } - - /// Create a new set with `hash_builder` - pub fn with_hasher(hash_builder: S) -> Self - where S: BuildHasher - { - OrderSet { map: OrderMap::with_hasher(hash_builder) } - } - - /// Return a reference to the set's `BuildHasher`. - pub fn hasher(&self) -> &S - where S: BuildHasher - { - self.map.hasher() - } - - /// Computes in **O(1)** time. - pub fn capacity(&self) -> usize { - self.map.capacity() - } -} - -impl<T, S> OrderSet<T, S> - where T: Hash + Eq, - S: BuildHasher, -{ - /// Remove all elements in the set, while preserving its capacity. - /// - /// Computes in **O(n)** time. - pub fn clear(&mut self) { - self.map.clear(); - } - - /// FIXME Not implemented fully yet - pub fn reserve(&mut self, additional: usize) { - self.map.reserve(additional); - } - - /// Insert the value into the set. - /// - /// If an equivalent item already exists in the set, it returns - /// `false` leaving the original value in the set and without - /// altering its insertion order. Otherwise, it inserts the new - /// item and returns `true`. - /// - /// Computes in **O(1)** time (amortized average). - pub fn insert(&mut self, value: T) -> bool { - self.map.insert(value, ()).is_none() - } - - /// Return an iterator over the values of the set, in their order - pub fn iter(&self) -> Iter<T> { - Iter { - iter: self.map.keys().iter - } - } - - /// Return an iterator over the values that are in `self` but not `other`. - /// - /// Values are produced in the same order that they appear in `self`. - pub fn difference<'a, S2>(&'a self, other: &'a OrderSet<T, S2>) -> Difference<'a, T, S2> - where S2: BuildHasher - { - Difference { - iter: self.iter(), - other: other, - } - } - - /// Return an iterator over the values that are in `self` or `other`, - /// but not in both. - /// - /// Values from `self` are produced in their original order, followed by - /// values from `other` in their original order. - pub fn symmetric_difference<'a, S2>(&'a self, other: &'a OrderSet<T, S2>) - -> SymmetricDifference<'a, T, S, S2> - where S2: BuildHasher - { - SymmetricDifference { - iter: self.difference(other).chain(other.difference(self)), - } - } - - /// Return an iterator over the values that are in both `self` and `other`. - /// - /// Values are produced in the same order that they appear in `self`. - pub fn intersection<'a, S2>(&'a self, other: &'a OrderSet<T, S2>) -> Intersection<'a, T, S2> - where S2: BuildHasher - { - Intersection { - iter: self.iter(), - other: other, - } - } - - /// Return an iterator over all values that are in `self` or `other`. - /// - /// Values from `self` are produced in their original order, followed by - /// values that are unique to `other` in their original order. - pub fn union<'a, S2>(&'a self, other: &'a OrderSet<T, S2>) -> Union<'a, T, S> - where S2: BuildHasher - { - Union { - iter: self.iter().chain(other.difference(self)), - } - } - - /// Return `true` if an equivalent to `value` exists in the set. - /// - /// Computes in **O(1)** time (average). - pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool - where Q: Hash + Equivalent<T>, - { - self.map.contains_key(value) - } - - /// Return a reference to the value stored in the set, if it is present, - /// else `None`. - /// - /// Computes in **O(1)** time (average). - pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T> - where Q: Hash + Equivalent<T>, - { - self.map.get_full(value).map(|(_, x, &())| x) - } - - /// Return item index and value - pub fn get_full<Q: ?Sized>(&self, value: &Q) -> Option<(usize, &T)> - where Q: Hash + Equivalent<T>, - { - self.map.get_full(value).map(|(i, x, &())| (i, x)) - } - - /// Adds a value to the set, replacing the existing value, if any, that is - /// equal to the given one. Returns the replaced value. - /// - /// Computes in **O(1)** time (average). - pub fn replace(&mut self, value: T) -> Option<T> - { - use super::Entry::*; - - match self.map.entry(value) { - Vacant(e) => { e.insert(()); None }, - Occupied(e) => { - // FIXME uses private fields! - let old_key = &mut e.map.entries[e.index].key; - Some(replace(old_key, e.key)) - } - } - } - - /// FIXME Same as .swap_remove - /// - /// Computes in **O(1)** time (average). - pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool - where Q: Hash + Equivalent<T>, - { - self.swap_remove(value) - } - - /// Remove the value from the set, and return `true` if it was present. - /// - /// Like `Vec::swap_remove`, the value is removed by swapping it with the - /// last element of the set and popping it off. **This perturbs - /// the postion of what used to be the last element!** - /// - /// Return `false` if `value` was not in the set. - /// - /// Computes in **O(1)** time (average). - pub fn swap_remove<Q: ?Sized>(&mut self, value: &Q) -> bool - where Q: Hash + Equivalent<T>, - { - self.map.swap_remove(value).is_some() - } - - /// FIXME Same as .swap_take - /// - /// Computes in **O(1)** time (average). - pub fn take<Q: ?Sized>(&mut self, value: &Q) -> Option<T> - where Q: Hash + Equivalent<T>, - { - self.swap_take(value) - } - - /// Removes and returns the value in the set, if any, that is equal to the - /// given one. - /// - /// Like `Vec::swap_remove`, the value is removed by swapping it with the - /// last element of the set and popping it off. **This perturbs - /// the postion of what used to be the last element!** - /// - /// Return `None` if `value` was not in the set. - /// - /// Computes in **O(1)** time (average). - pub fn swap_take<Q: ?Sized>(&mut self, value: &Q) -> Option<T> - where Q: Hash + Equivalent<T>, - { - self.map.swap_remove_full(value).map(|(_, x, ())| x) - } - - /// Remove the value from the set return it and the index it had. - /// - /// Like `Vec::swap_remove`, the value is removed by swapping it with the - /// last element of the set and popping it off. **This perturbs - /// the postion of what used to be the last element!** - /// - /// Return `None` if `value` was not in the set. - pub fn swap_remove_full<Q: ?Sized>(&mut self, value: &Q) -> Option<(usize, T)> - where Q: Hash + Equivalent<T>, - { - self.map.swap_remove_full(value).map(|(i, x, ())| (i, x)) - } - - /// Remove the last value - /// - /// Computes in **O(1)** time (average). - pub fn pop(&mut self) -> Option<T> { - self.map.pop().map(|(x, ())| x) - } - - /// Scan through each value in the set and keep those where the - /// closure `keep` returns `true`. - /// - /// The elements are visited in order, and remaining elements keep their - /// order. - /// - /// Computes in **O(n)** time (average). - pub fn retain<F>(&mut self, mut keep: F) - where F: FnMut(&T) -> bool, - { - self.map.retain(move |x, &mut ()| keep(x)) - } - - /// Sort the set’s values by their default ordering. - /// - /// See `sort_by` for details. - pub fn sort(&mut self) - where T: Ord, - { - self.map.sort_keys() - } - - /// Sort the set’s values in place using the comparison function `compare`. - /// - /// Computes in **O(n log n)** time and **O(n)** space. The sort is stable. - pub fn sort_by<F>(&mut self, mut compare: F) - where F: FnMut(&T, &T) -> Ordering, - { - self.map.sort_by(move |a, _, b, _| compare(a, b)); - } - - /// Sort the values of the set and return a by value iterator of - /// the values with the result. - /// - /// The sort is stable. - pub fn sorted_by<F>(self, mut cmp: F) -> IntoIter<T> - where F: FnMut(&T, &T) -> Ordering - { - IntoIter { - iter: self.map.sorted_by(move |a, &(), b, &()| cmp(a, b)).iter, - } - } - - /// Clears the `OrderSet`, returning all values as a drain iterator. - /// Keeps the allocated memory for reuse. - pub fn drain(&mut self, range: RangeFull) -> Drain<T> { - Drain { - iter: self.map.drain(range).iter, - } - } -} - -impl<T, S> OrderSet<T, S> { - /// Get a value by index - /// - /// Valid indices are *0 <= index < self.len()* - /// - /// Computes in **O(1)** time. - pub fn get_index(&self, index: usize) -> Option<&T> { - self.map.get_index(index).map(|(x, &())| x) - } - - /// Remove the key-value pair by index - /// - /// Valid indices are *0 <= index < self.len()* - /// - /// Computes in **O(1)** time (average). - pub fn swap_remove_index(&mut self, index: usize) -> Option<T> { - self.map.swap_remove_index(index).map(|(x, ())| x) - } -} - - -pub struct IntoIter<T> { - iter: vec::IntoIter<Bucket<T>>, -} - -impl<T> Iterator for IntoIter<T> { - type Item = T; - - iterator_methods!(|entry| entry.key); -} - -impl<T> DoubleEndedIterator for IntoIter<T> { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map(|entry| entry.key) - } -} - -impl<T> ExactSizeIterator for IntoIter<T> { - fn len(&self) -> usize { - self.iter.len() - } -} - - -pub struct Iter<'a, T: 'a> { - iter: slice::Iter<'a, Bucket<T>>, -} - -impl<'a, T> Iterator for Iter<'a, T> { - type Item = &'a T; - - iterator_methods!(|entry| &entry.key); -} - -impl<'a, T> DoubleEndedIterator for Iter<'a, T> { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map(|entry| &entry.key) - } -} - -impl<'a, T> ExactSizeIterator for Iter<'a, T> { - fn len(&self) -> usize { - self.iter.len() - } -} - -pub struct Drain<'a, T: 'a> { - iter: vec::Drain<'a, Bucket<T>>, -} - -impl<'a, T> Iterator for Drain<'a, T> { - type Item = T; - - iterator_methods!(|bucket| bucket.key); -} - -impl<'a, T> DoubleEndedIterator for Drain<'a, T> { - double_ended_iterator_methods!(|bucket| bucket.key); -} - -impl<'a, T, S> IntoIterator for &'a OrderSet<T, S> - where T: Hash + Eq, - S: BuildHasher, -{ - type Item = &'a T; - type IntoIter = Iter<'a, T>; - - fn into_iter(self) -> Self::IntoIter { - self.iter() - } -} - -impl<T, S> IntoIterator for OrderSet<T, S> - where T: Hash + Eq, - S: BuildHasher, -{ - type Item = T; - type IntoIter = IntoIter<T>; - - fn into_iter(self) -> Self::IntoIter { - IntoIter { - iter: self.map.into_iter().iter, - } - } -} - -impl<T, S> FromIterator<T> for OrderSet<T, S> - where T: Hash + Eq, - S: BuildHasher + Default, -{ - fn from_iter<I: IntoIterator<Item=T>>(iterable: I) -> Self { - let iter = iterable.into_iter().map(|x| (x, ())); - OrderSet { map: OrderMap::from_iter(iter) } - } -} - -impl<T, S> Extend<T> for OrderSet<T, S> - where T: Hash + Eq, - S: BuildHasher, -{ - fn extend<I: IntoIterator<Item=T>>(&mut self, iterable: I) { - let iter = iterable.into_iter().map(|x| (x, ())); - self.map.extend(iter); - } -} - -impl<'a, T, S> Extend<&'a T> for OrderSet<T, S> - where T: Hash + Eq + Copy, - S: BuildHasher, -{ - fn extend<I: IntoIterator<Item=&'a T>>(&mut self, iterable: I) { - let iter = iterable.into_iter().map(|&x| x); - self.extend(iter); - } -} - - -impl<T, S> Default for OrderSet<T, S> - where S: BuildHasher + Default, -{ - /// Return an empty `OrderSet` - fn default() -> Self { - OrderSet { map: OrderMap::default() } - } -} - -impl<T, S1, S2> PartialEq<OrderSet<T, S2>> for OrderSet<T, S1> - where T: Hash + Eq, - S1: BuildHasher, - S2: BuildHasher -{ - fn eq(&self, other: &OrderSet<T, S2>) -> bool { - self.len() == other.len() && self.is_subset(other) - } -} - -impl<T, S> Eq for OrderSet<T, S> - where T: Eq + Hash, - S: BuildHasher -{ -} - -impl<T, S> OrderSet<T, S> - where T: Eq + Hash, - S: BuildHasher -{ - /// Returns `true` if `self` has no elements in common with `other`. - pub fn is_disjoint<S2>(&self, other: &OrderSet<T, S2>) -> bool - where S2: BuildHasher - { - if self.len() <= other.len() { - self.iter().all(move |value| !other.contains(value)) - } else { - other.iter().all(move |value| !self.contains(value)) - } - } - - /// Returns `true` if all elements of `self` are contained in `other`. - pub fn is_subset<S2>(&self, other: &OrderSet<T, S2>) -> bool - where S2: BuildHasher - { - self.len() <= other.len() && self.iter().all(move |value| other.contains(value)) - } - - /// Returns `true` if all elements of `other` are contained in `self`. - pub fn is_superset<S2>(&self, other: &OrderSet<T, S2>) -> bool - where S2: BuildHasher - { - other.is_subset(self) - } -} - - -pub struct Difference<'a, T: 'a, S: 'a> { - iter: Iter<'a, T>, - other: &'a OrderSet<T, S>, -} - -impl<'a, T, S> Iterator for Difference<'a, T, S> - where T: Eq + Hash, - S: BuildHasher -{ - type Item = &'a T; - - fn next(&mut self) -> Option<Self::Item> { - while let Some(item) = self.iter.next() { - if !self.other.contains(item) { - return Some(item); - } - } - None - } - - fn size_hint(&self) -> (usize, Option<usize>) { - (0, self.iter.size_hint().1) - } -} - -impl<'a, T, S> DoubleEndedIterator for Difference<'a, T, S> - where T: Eq + Hash, - S: BuildHasher -{ - fn next_back(&mut self) -> Option<Self::Item> { - while let Some(item) = self.iter.next_back() { - if !self.other.contains(item) { - return Some(item); - } - } - None - } -} - - -pub struct Intersection<'a, T: 'a, S: 'a> { - iter: Iter<'a, T>, - other: &'a OrderSet<T, S>, -} - -impl<'a, T, S> Iterator for Intersection<'a, T, S> - where T: Eq + Hash, - S: BuildHasher -{ - type Item = &'a T; - - fn next(&mut self) -> Option<Self::Item> { - while let Some(item) = self.iter.next() { - if self.other.contains(item) { - return Some(item); - } - } - None - } - - fn size_hint(&self) -> (usize, Option<usize>) { - (0, self.iter.size_hint().1) - } -} - -impl<'a, T, S> DoubleEndedIterator for Intersection<'a, T, S> - where T: Eq + Hash, - S: BuildHasher -{ - fn next_back(&mut self) -> Option<Self::Item> { - while let Some(item) = self.iter.next_back() { - if self.other.contains(item) { - return Some(item); - } - } - None - } -} - - -pub struct SymmetricDifference<'a, T: 'a, S1: 'a, S2: 'a> { - iter: Chain<Difference<'a, T, S2>, Difference<'a, T, S1>>, -} - -impl<'a, T, S1, S2> Iterator for SymmetricDifference<'a, T, S1, S2> - where T: Eq + Hash, - S1: BuildHasher, - S2: BuildHasher, -{ - type Item = &'a T; - - fn next(&mut self) -> Option<Self::Item> { - self.iter.next() - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } - - fn fold<B, F>(self, init: B, f: F) -> B - where F: FnMut(B, Self::Item) -> B - { - self.iter.fold(init, f) - } -} - -impl<'a, T, S1, S2> DoubleEndedIterator for SymmetricDifference<'a, T, S1, S2> - where T: Eq + Hash, - S1: BuildHasher, - S2: BuildHasher, -{ - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back() - } -} - - -pub struct Union<'a, T: 'a, S: 'a> { - iter: Chain<Iter<'a, T>, Difference<'a, T, S>>, -} - -impl<'a, T, S> Iterator for Union<'a, T, S> - where T: Eq + Hash, - S: BuildHasher, -{ - type Item = &'a T; - - fn next(&mut self) -> Option<Self::Item> { - self.iter.next() - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } - - fn fold<B, F>(self, init: B, f: F) -> B - where F: FnMut(B, Self::Item) -> B - { - self.iter.fold(init, f) - } -} - -impl<'a, T, S> DoubleEndedIterator for Union<'a, T, S> - where T: Eq + Hash, - S: BuildHasher, -{ - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back() - } -} - - -impl<'a, 'b, T, S1, S2> BitAnd<&'b OrderSet<T, S2>> for &'a OrderSet<T, S1> - where T: Eq + Hash + Clone, - S1: BuildHasher + Default, - S2: BuildHasher, -{ - type Output = OrderSet<T, S1>; - - /// Returns the set intersection, cloned into a new set. - /// - /// Values are collected in the same order that they appear in `self`. - fn bitand(self, other: &'b OrderSet<T, S2>) -> Self::Output { - self.intersection(other).cloned().collect() - } -} - -impl<'a, 'b, T, S1, S2> BitOr<&'b OrderSet<T, S2>> for &'a OrderSet<T, S1> - where T: Eq + Hash + Clone, - S1: BuildHasher + Default, - S2: BuildHasher, -{ - type Output = OrderSet<T, S1>; - - /// Returns the set union, cloned into a new set. - /// - /// Values from `self` are collected in their original order, followed by - /// values that are unique to `other` in their original order. - fn bitor(self, other: &'b OrderSet<T, S2>) -> Self::Output { - self.union(other).cloned().collect() - } -} - -impl<'a, 'b, T, S1, S2> BitXor<&'b OrderSet<T, S2>> for &'a OrderSet<T, S1> - where T: Eq + Hash + Clone, - S1: BuildHasher + Default, - S2: BuildHasher, -{ - type Output = OrderSet<T, S1>; - - /// Returns the set symmetric-difference, cloned into a new set. - /// - /// Values from `self` are collected in their original order, followed by - /// values from `other` in their original order. - fn bitxor(self, other: &'b OrderSet<T, S2>) -> Self::Output { - self.symmetric_difference(other).cloned().collect() - } -} - -impl<'a, 'b, T, S1, S2> Sub<&'b OrderSet<T, S2>> for &'a OrderSet<T, S1> - where T: Eq + Hash + Clone, - S1: BuildHasher + Default, - S2: BuildHasher, -{ - type Output = OrderSet<T, S1>; - - /// Returns the set difference, cloned into a new set. - /// - /// Values are collected in the same order that they appear in `self`. - fn sub(self, other: &'b OrderSet<T, S2>) -> Self::Output { - self.difference(other).cloned().collect() - } -} - - -#[cfg(test)] -mod tests { - use super::*; - use util::enumerate; - - #[test] - fn it_works() { - let mut set = OrderSet::new(); - assert_eq!(set.is_empty(), true); - set.insert(1); - set.insert(1); - assert_eq!(set.len(), 1); - assert!(set.get(&1).is_some()); - assert_eq!(set.is_empty(), false); - } - - #[test] - fn new() { - let set = OrderSet::<String>::new(); - println!("{:?}", set); - assert_eq!(set.capacity(), 0); - assert_eq!(set.len(), 0); - assert_eq!(set.is_empty(), true); - } - - #[test] - fn insert() { - let insert = [0, 4, 2, 12, 8, 7, 11, 5]; - let not_present = [1, 3, 6, 9, 10]; - let mut set = OrderSet::with_capacity(insert.len()); - - for (i, &elt) in enumerate(&insert) { - assert_eq!(set.len(), i); - set.insert(elt); - assert_eq!(set.len(), i + 1); - assert_eq!(set.get(&elt), Some(&elt)); - } - println!("{:?}", set); - - for &elt in ¬_present { - assert!(set.get(&elt).is_none()); - } - } - - #[test] - fn insert_2() { - let mut set = OrderSet::with_capacity(16); - - let mut values = vec![]; - values.extend(0..16); - values.extend(128..267); - - for &i in &values { - let old_set = set.clone(); - set.insert(i); - for value in old_set.iter() { - if !set.get(value).is_some() { - println!("old_set: {:?}", old_set); - println!("set: {:?}", set); - panic!("did not find {} in set", value); - } - } - } - - for &i in &values { - assert!(set.get(&i).is_some(), "did not find {}", i); - } - } - - #[test] - fn insert_dup() { - let mut elements = vec![0, 2, 4, 6, 8]; - let mut set: OrderSet<u8> = elements.drain(..).collect(); - { - let (i, v) = set.get_full(&0).unwrap(); - assert_eq!(set.len(), 5); - assert_eq!(i, 0); - assert_eq!(*v, 0); - } - { - let inserted = set.insert(0); - let (i, v) = set.get_full(&0).unwrap(); - assert_eq!(set.len(), 5); - assert_eq!(inserted, false); - assert_eq!(i, 0); - assert_eq!(*v, 0); - } - } - - #[test] - fn insert_order() { - let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23]; - let mut set = OrderSet::new(); - - for &elt in &insert { - set.insert(elt); - } - - assert_eq!(set.iter().count(), set.len()); - assert_eq!(set.iter().count(), insert.len()); - for (a, b) in insert.iter().zip(set.iter()) { - assert_eq!(a, b); - } - for (i, v) in (0..insert.len()).zip(set.iter()) { - assert_eq!(set.get_index(i).unwrap(), v); - } - } - - #[test] - fn grow() { - let insert = [0, 4, 2, 12, 8, 7, 11]; - let not_present = [1, 3, 6, 9, 10]; - let mut set = OrderSet::with_capacity(insert.len()); - - - for (i, &elt) in enumerate(&insert) { - assert_eq!(set.len(), i); - set.insert(elt); - assert_eq!(set.len(), i + 1); - assert_eq!(set.get(&elt), Some(&elt)); - } - - println!("{:?}", set); - for &elt in &insert { - set.insert(elt * 10); - } - for &elt in &insert { - set.insert(elt * 100); - } - for (i, &elt) in insert.iter().cycle().enumerate().take(100) { - set.insert(elt * 100 + i as i32); - } - println!("{:?}", set); - for &elt in ¬_present { - assert!(set.get(&elt).is_none()); - } - } - - #[test] - fn remove() { - let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23]; - let mut set = OrderSet::new(); - - for &elt in &insert { - set.insert(elt); - } - - assert_eq!(set.iter().count(), set.len()); - assert_eq!(set.iter().count(), insert.len()); - for (a, b) in insert.iter().zip(set.iter()) { - assert_eq!(a, b); - } - - let remove_fail = [99, 77]; - let remove = [4, 12, 8, 7]; - - for &value in &remove_fail { - assert!(set.swap_remove_full(&value).is_none()); - } - println!("{:?}", set); - for &value in &remove { - //println!("{:?}", set); - let index = set.get_full(&value).unwrap().0; - assert_eq!(set.swap_remove_full(&value), Some((index, value))); - } - println!("{:?}", set); - - for value in &insert { - assert_eq!(set.get(value).is_some(), !remove.contains(value)); - } - assert_eq!(set.len(), insert.len() - remove.len()); - assert_eq!(set.iter().count(), insert.len() - remove.len()); - } - - #[test] - fn swap_remove_index() { - let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23]; - let mut set = OrderSet::new(); - - for &elt in &insert { - set.insert(elt); - } - - let mut vector = insert.to_vec(); - let remove_sequence = &[3, 3, 10, 4, 5, 4, 3, 0, 1]; - - // check that the same swap remove sequence on vec and set - // have the same result. - for &rm in remove_sequence { - let out_vec = vector.swap_remove(rm); - let out_set = set.swap_remove_index(rm).unwrap(); - assert_eq!(out_vec, out_set); - } - assert_eq!(vector.len(), set.len()); - for (a, b) in vector.iter().zip(set.iter()) { - assert_eq!(a, b); - } - } - - #[test] - fn partial_eq_and_eq() { - let mut set_a = OrderSet::new(); - set_a.insert(1); - set_a.insert(2); - let mut set_b = set_a.clone(); - assert_eq!(set_a, set_b); - set_b.remove(&1); - assert_ne!(set_a, set_b); - - let set_c: OrderSet<_> = set_b.into_iter().collect(); - assert_ne!(set_a, set_c); - assert_ne!(set_c, set_a); - } - - #[test] - fn extend() { - let mut set = OrderSet::new(); - set.extend(vec![&1, &2, &3, &4]); - set.extend(vec![5, 6]); - assert_eq!(set.into_iter().collect::<Vec<_>>(), vec![1, 2, 3, 4, 5, 6]); - } - - #[test] - fn comparisons() { - let set_a: OrderSet<_> = (0..3).collect(); - let set_b: OrderSet<_> = (3..6).collect(); - let set_c: OrderSet<_> = (0..6).collect(); - let set_d: OrderSet<_> = (3..9).collect(); - - assert!(!set_a.is_disjoint(&set_a)); - assert!(set_a.is_subset(&set_a)); - assert!(set_a.is_superset(&set_a)); - - assert!(set_a.is_disjoint(&set_b)); - assert!(set_b.is_disjoint(&set_a)); - assert!(!set_a.is_subset(&set_b)); - assert!(!set_b.is_subset(&set_a)); - assert!(!set_a.is_superset(&set_b)); - assert!(!set_b.is_superset(&set_a)); - - assert!(!set_a.is_disjoint(&set_c)); - assert!(!set_c.is_disjoint(&set_a)); - assert!(set_a.is_subset(&set_c)); - assert!(!set_c.is_subset(&set_a)); - assert!(!set_a.is_superset(&set_c)); - assert!(set_c.is_superset(&set_a)); - - assert!(!set_c.is_disjoint(&set_d)); - assert!(!set_d.is_disjoint(&set_c)); - assert!(!set_c.is_subset(&set_d)); - assert!(!set_d.is_subset(&set_c)); - assert!(!set_c.is_superset(&set_d)); - assert!(!set_d.is_superset(&set_c)); - } - - #[test] - fn iter_comparisons() { - use std::iter::empty; - - fn check<'a, I1, I2>(iter1: I1, iter2: I2) - where I1: Iterator<Item = &'a i32>, - I2: Iterator<Item = i32>, - { - assert!(iter1.cloned().eq(iter2)); - } - - let set_a: OrderSet<_> = (0..3).collect(); - let set_b: OrderSet<_> = (3..6).collect(); - let set_c: OrderSet<_> = (0..6).collect(); - let set_d: OrderSet<_> = (3..9).rev().collect(); - - check(set_a.difference(&set_a), empty()); - check(set_a.symmetric_difference(&set_a), empty()); - check(set_a.intersection(&set_a), 0..3); - check(set_a.union(&set_a), 0..3); - - check(set_a.difference(&set_b), 0..3); - check(set_b.difference(&set_a), 3..6); - check(set_a.symmetric_difference(&set_b), 0..6); - check(set_b.symmetric_difference(&set_a), (3..6).chain(0..3)); - check(set_a.intersection(&set_b), empty()); - check(set_b.intersection(&set_a), empty()); - check(set_a.union(&set_b), 0..6); - check(set_b.union(&set_a), (3..6).chain(0..3)); - - check(set_a.difference(&set_c), empty()); - check(set_c.difference(&set_a), 3..6); - check(set_a.symmetric_difference(&set_c), 3..6); - check(set_c.symmetric_difference(&set_a), 3..6); - check(set_a.intersection(&set_c), 0..3); - check(set_c.intersection(&set_a), 0..3); - check(set_a.union(&set_c), 0..6); - check(set_c.union(&set_a), 0..6); - - check(set_c.difference(&set_d), 0..3); - check(set_d.difference(&set_c), (6..9).rev()); - check(set_c.symmetric_difference(&set_d), (0..3).chain((6..9).rev())); - check(set_d.symmetric_difference(&set_c), (6..9).rev().chain(0..3)); - check(set_c.intersection(&set_d), 3..6); - check(set_d.intersection(&set_c), (3..6).rev()); - check(set_c.union(&set_d), (0..6).chain((6..9).rev())); - check(set_d.union(&set_c), (3..9).rev().chain(0..3)); - } - - #[test] - fn ops() { - let empty = OrderSet::<i32>::new(); - let set_a: OrderSet<_> = (0..3).collect(); - let set_b: OrderSet<_> = (3..6).collect(); - let set_c: OrderSet<_> = (0..6).collect(); - let set_d: OrderSet<_> = (3..9).rev().collect(); - - assert_eq!(&set_a & &set_a, set_a); - assert_eq!(&set_a | &set_a, set_a); - assert_eq!(&set_a ^ &set_a, empty); - assert_eq!(&set_a - &set_a, empty); - - assert_eq!(&set_a & &set_b, empty); - assert_eq!(&set_b & &set_a, empty); - assert_eq!(&set_a | &set_b, set_c); - assert_eq!(&set_b | &set_a, set_c); - assert_eq!(&set_a ^ &set_b, set_c); - assert_eq!(&set_b ^ &set_a, set_c); - assert_eq!(&set_a - &set_b, set_a); - assert_eq!(&set_b - &set_a, set_b); - - assert_eq!(&set_a & &set_c, set_a); - assert_eq!(&set_c & &set_a, set_a); - assert_eq!(&set_a | &set_c, set_c); - assert_eq!(&set_c | &set_a, set_c); - assert_eq!(&set_a ^ &set_c, set_b); - assert_eq!(&set_c ^ &set_a, set_b); - assert_eq!(&set_a - &set_c, empty); - assert_eq!(&set_c - &set_a, set_b); - - assert_eq!(&set_c & &set_d, set_b); - assert_eq!(&set_d & &set_c, set_b); - assert_eq!(&set_c | &set_d, &set_a | &set_d); - assert_eq!(&set_d | &set_c, &set_a | &set_d); - assert_eq!(&set_c ^ &set_d, &set_a | &(&set_d - &set_b)); - assert_eq!(&set_d ^ &set_c, &set_a | &(&set_d - &set_b)); - assert_eq!(&set_c - &set_d, set_a); - assert_eq!(&set_d - &set_c, &set_d - &set_b); - } -} diff --git a/vendor/ordermap/src/util.rs b/vendor/ordermap/src/util.rs deleted file mode 100644 index 90d3e7e334..0000000000 --- a/vendor/ordermap/src/util.rs +++ /dev/null @@ -1,17 +0,0 @@ - -use std::iter::Enumerate; -use std::mem::size_of; - -pub fn third<A, B, C>(t: (A, B, C)) -> C { t.2 } - -pub fn enumerate<I>(iterable: I) -> Enumerate<I::IntoIter> - where I: IntoIterator -{ - iterable.into_iter().enumerate() -} - -/// return the number of steps from a to b -pub fn ptrdistance<T>(a: *const T, b: *const T) -> usize { - debug_assert!(a as usize <= b as usize); - (b as usize - a as usize) / size_of::<T>() -} diff --git a/vendor/ordermap/tests/equivalent_trait.rs b/vendor/ordermap/tests/equivalent_trait.rs deleted file mode 100644 index 6eef05bf88..0000000000 --- a/vendor/ordermap/tests/equivalent_trait.rs +++ /dev/null @@ -1,55 +0,0 @@ - -#[macro_use] extern crate ordermap; - -use ordermap::Equivalent; - -use std::hash::Hash; - -#[derive(Debug, Hash)] -pub struct Pair<A, B>(pub A, pub B); - -impl<A, B, C, D> PartialEq<(A, B)> for Pair<C, D> - where C: PartialEq<A>, - D: PartialEq<B>, -{ - fn eq(&self, rhs: &(A, B)) -> bool { - self.0 == rhs.0 && - self.1 == rhs.1 && - true - } -} - -impl<A, B, X> Equivalent<X> for Pair<A, B> - where Pair<A, B>: PartialEq<X>, - A: Hash + Eq, - B: Hash + Eq, -{ - fn equivalent(&self, other: &X) -> bool { - *self == *other - } -} - -#[test] -fn test_lookup() { - let s = String::from; - let map = ordermap! { - (s("a"), s("b")) => 1, - (s("a"), s("x")) => 2, - }; - - assert!(map.contains_key(&Pair("a", "b"))); - assert!(!map.contains_key(&Pair("b", "a"))); -} - -#[test] -fn test_string_str() { - let s = String::from; - let mut map = ordermap! { - s("a") => 1, s("b") => 2, - s("x") => 3, s("y") => 4, - }; - - assert!(map.contains_key("a")); - assert!(!map.contains_key("z")); - assert_eq!(map.remove("b"), Some(2)); -} diff --git a/vendor/ordermap/tests/quick.rs b/vendor/ordermap/tests/quick.rs deleted file mode 100644 index 8d2f826805..0000000000 --- a/vendor/ordermap/tests/quick.rs +++ /dev/null @@ -1,365 +0,0 @@ - -extern crate ordermap; -extern crate itertools; -#[macro_use] -extern crate quickcheck; - -extern crate fnv; - -use ordermap::OrderMap; -use itertools::Itertools; - -use quickcheck::Arbitrary; -use quickcheck::Gen; - -use fnv::FnvHasher; -use std::hash::{BuildHasher, BuildHasherDefault}; -type FnvBuilder = BuildHasherDefault<FnvHasher>; -type OrderMapFnv<K, V> = OrderMap<K, V, FnvBuilder>; - -use std::collections::HashSet; -use std::collections::HashMap; -use std::iter::FromIterator; -use std::hash::Hash; -use std::fmt::Debug; -use std::ops::Deref; -use std::cmp::min; - - -use ordermap::Entry as OEntry; -use std::collections::hash_map::Entry as HEntry; - - -fn set<'a, T: 'a, I>(iter: I) -> HashSet<T> - where I: IntoIterator<Item=&'a T>, - T: Copy + Hash + Eq -{ - iter.into_iter().cloned().collect() -} - -fn ordermap<'a, T: 'a, I>(iter: I) -> OrderMap<T, ()> - where I: IntoIterator<Item=&'a T>, - T: Copy + Hash + Eq, -{ - OrderMap::from_iter(iter.into_iter().cloned().map(|k| (k, ()))) -} - -quickcheck! { - fn contains(insert: Vec<u32>) -> bool { - let mut map = OrderMap::new(); - for &key in &insert { - map.insert(key, ()); - } - insert.iter().all(|&key| map.get(&key).is_some()) - } - - fn contains_not(insert: Vec<u8>, not: Vec<u8>) -> bool { - let mut map = OrderMap::new(); - for &key in &insert { - map.insert(key, ()); - } - let nots = &set(¬) - &set(&insert); - nots.iter().all(|&key| map.get(&key).is_none()) - } - - fn insert_remove(insert: Vec<u8>, remove: Vec<u8>) -> bool { - let mut map = OrderMap::new(); - for &key in &insert { - map.insert(key, ()); - } - for &key in &remove { - map.swap_remove(&key); - } - let elements = &set(&insert) - &set(&remove); - map.len() == elements.len() && map.iter().count() == elements.len() && - elements.iter().all(|k| map.get(k).is_some()) - } - - fn insertion_order(insert: Vec<u32>) -> bool { - let mut map = OrderMap::new(); - for &key in &insert { - map.insert(key, ()); - } - itertools::assert_equal(insert.iter().unique(), map.keys()); - true - } - - fn pop(insert: Vec<u8>) -> bool { - let mut map = OrderMap::new(); - for &key in &insert { - map.insert(key, ()); - } - let mut pops = Vec::new(); - while let Some((key, _v)) = map.pop() { - pops.push(key); - } - pops.reverse(); - - itertools::assert_equal(insert.iter().unique(), &pops); - true - } - - fn with_cap(cap: usize) -> bool { - let map: OrderMap<u8, u8> = OrderMap::with_capacity(cap); - println!("wish: {}, got: {} (diff: {})", cap, map.capacity(), map.capacity() as isize - cap as isize); - map.capacity() >= cap - } - - fn drain(insert: Vec<u8>) -> bool { - let mut map = OrderMap::new(); - for &key in &insert { - map.insert(key, ()); - } - let mut clone = map.clone(); - let drained = clone.drain(..); - for (key, _) in drained { - map.remove(&key); - } - map.is_empty() - } -} - -use Op::*; -#[derive(Copy, Clone, Debug)] -enum Op<K, V> { - Add(K, V), - Remove(K), - AddEntry(K, V), - RemoveEntry(K), -} - -impl<K, V> Arbitrary for Op<K, V> - where K: Arbitrary, - V: Arbitrary, -{ - fn arbitrary<G: Gen>(g: &mut G) -> Self { - match g.gen::<u32>() % 4 { - 0 => Add(K::arbitrary(g), V::arbitrary(g)), - 1 => AddEntry(K::arbitrary(g), V::arbitrary(g)), - 2 => Remove(K::arbitrary(g)), - _ => RemoveEntry(K::arbitrary(g)), - } - } -} - -fn do_ops<K, V, S>(ops: &[Op<K, V>], a: &mut OrderMap<K, V, S>, b: &mut HashMap<K, V>) - where K: Hash + Eq + Clone, - V: Clone, - S: BuildHasher, -{ - for op in ops { - match *op { - Add(ref k, ref v) => { - a.insert(k.clone(), v.clone()); - b.insert(k.clone(), v.clone()); - } - AddEntry(ref k, ref v) => { - a.entry(k.clone()).or_insert(v.clone()); - b.entry(k.clone()).or_insert(v.clone()); - } - Remove(ref k) => { - a.swap_remove(k); - b.remove(k); - } - RemoveEntry(ref k) => { - match a.entry(k.clone()) { - OEntry::Occupied(ent) => { ent.remove_entry(); }, - _ => { } - } - match b.entry(k.clone()) { - HEntry::Occupied(ent) => { ent.remove_entry(); }, - _ => { } - } - } - } - //println!("{:?}", a); - } -} - -fn assert_maps_equivalent<K, V>(a: &OrderMap<K, V>, b: &HashMap<K, V>) -> bool - where K: Hash + Eq + Debug, - V: Eq + Debug, -{ - assert_eq!(a.len(), b.len()); - assert_eq!(a.iter().next().is_some(), b.iter().next().is_some()); - for key in a.keys() { - assert!(b.contains_key(key), "b does not contain {:?}", key); - } - for key in b.keys() { - assert!(a.get(key).is_some(), "a does not contain {:?}", key); - } - for key in a.keys() { - assert_eq!(a[key], b[key]); - } - true -} - -quickcheck! { - fn operations_i8(ops: Large<Vec<Op<i8, i8>>>) -> bool { - let mut map = OrderMap::new(); - let mut reference = HashMap::new(); - do_ops(&ops, &mut map, &mut reference); - assert_maps_equivalent(&map, &reference) - } - - fn operations_string(ops: Vec<Op<Alpha, i8>>) -> bool { - let mut map = OrderMap::new(); - let mut reference = HashMap::new(); - do_ops(&ops, &mut map, &mut reference); - assert_maps_equivalent(&map, &reference) - } - - fn keys_values(ops: Large<Vec<Op<i8, i8>>>) -> bool { - let mut map = OrderMap::new(); - let mut reference = HashMap::new(); - do_ops(&ops, &mut map, &mut reference); - let mut visit = OrderMap::new(); - for (k, v) in map.keys().zip(map.values()) { - assert_eq!(&map[k], v); - assert!(!visit.contains_key(k)); - visit.insert(*k, *v); - } - assert_eq!(visit.len(), reference.len()); - true - } - - fn keys_values_mut(ops: Large<Vec<Op<i8, i8>>>) -> bool { - let mut map = OrderMap::new(); - let mut reference = HashMap::new(); - do_ops(&ops, &mut map, &mut reference); - let mut visit = OrderMap::new(); - let keys = Vec::from_iter(map.keys().cloned()); - for (k, v) in keys.iter().zip(map.values_mut()) { - assert_eq!(&reference[k], v); - assert!(!visit.contains_key(k)); - visit.insert(*k, *v); - } - assert_eq!(visit.len(), reference.len()); - true - } - - fn equality(ops1: Vec<Op<i8, i8>>, removes: Vec<usize>) -> bool { - let mut map = OrderMap::new(); - let mut reference = HashMap::new(); - do_ops(&ops1, &mut map, &mut reference); - let mut ops2 = ops1.clone(); - for &r in &removes { - if !ops2.is_empty() { - let i = r % ops2.len(); - ops2.remove(i); - } - } - let mut map2 = OrderMapFnv::default(); - let mut reference2 = HashMap::new(); - do_ops(&ops2, &mut map2, &mut reference2); - assert_eq!(map == map2, reference == reference2); - true - } - - fn retain_ordered(keys: Large<Vec<i8>>, remove: Large<Vec<i8>>) -> () { - let mut map = ordermap(keys.iter()); - let initial_map = map.clone(); // deduplicated in-order input - let remove_map = ordermap(remove.iter()); - let keys_s = set(keys.iter()); - let remove_s = set(remove.iter()); - let answer = &keys_s - &remove_s; - map.retain(|k, _| !remove_map.contains_key(k)); - - // check the values - assert_eq!(map.len(), answer.len()); - for key in &answer { - assert!(map.contains_key(key)); - } - // check the order - itertools::assert_equal(map.keys(), initial_map.keys().filter(|&k| !remove_map.contains_key(k))); - } - - fn sort_1(keyvals: Large<Vec<(i8, i8)>>) -> () { - let mut map: OrderMap<_, _> = OrderMap::from_iter(keyvals.to_vec()); - let mut answer = keyvals.0; - answer.sort_by_key(|t| t.0); - - // reverse dedup: Because OrderMap::from_iter keeps the last value for - // identical keys - answer.reverse(); - answer.dedup_by_key(|t| t.0); - answer.reverse(); - - map.sort_by(|k1, _, k2, _| Ord::cmp(k1, k2)); - - // check it contains all the values it should - for &(key, val) in &answer { - assert_eq!(map[&key], val); - } - - // check the order - - let mapv = Vec::from_iter(map); - assert_eq!(answer, mapv); - - } - - fn sort_2(keyvals: Large<Vec<(i8, i8)>>) -> () { - let mut map: OrderMap<_, _> = OrderMap::from_iter(keyvals.to_vec()); - map.sort_by(|_, v1, _, v2| Ord::cmp(v1, v2)); - assert_sorted_by_key(map, |t| t.1); - } -} - -fn assert_sorted_by_key<I, Key, X>(iterable: I, key: Key) - where I: IntoIterator, - I::Item: Ord + Clone + Debug, - Key: Fn(&I::Item) -> X, - X: Ord, -{ - let input = Vec::from_iter(iterable); - let mut sorted = input.clone(); - sorted.sort_by_key(key); - assert_eq!(input, sorted); -} - -#[derive(Clone, Debug, Hash, PartialEq, Eq)] -struct Alpha(String); - -impl Deref for Alpha { - type Target = String; - fn deref(&self) -> &String { &self.0 } -} - -const ALPHABET: &'static [u8] = b"abcdefghijklmnopqrstuvwxyz"; - -impl Arbitrary for Alpha { - fn arbitrary<G: Gen>(g: &mut G) -> Self { - let len = g.next_u32() % g.size() as u32; - let len = min(len, 16); - Alpha((0..len).map(|_| { - ALPHABET[g.next_u32() as usize % ALPHABET.len()] as char - }).collect()) - } - - fn shrink(&self) -> Box<Iterator<Item=Self>> { - Box::new((**self).shrink().map(Alpha)) - } -} - -/// quickcheck Arbitrary adaptor -- make a larger vec -#[derive(Clone, Debug)] -struct Large<T>(T); - -impl<T> Deref for Large<T> { - type Target = T; - fn deref(&self) -> &T { &self.0 } -} - -impl<T> Arbitrary for Large<Vec<T>> - where T: Arbitrary -{ - fn arbitrary<G: Gen>(g: &mut G) -> Self { - let len = g.next_u32() % (g.size() * 10) as u32; - Large((0..len).map(|_| T::arbitrary(g)).collect()) - } - - fn shrink(&self) -> Box<Iterator<Item=Self>> { - Box::new((**self).shrink().map(Large)) - } -} diff --git a/vendor/ordermap/tests/serde.rs b/vendor/ordermap/tests/serde.rs deleted file mode 100644 index bc01c68752..0000000000 --- a/vendor/ordermap/tests/serde.rs +++ /dev/null @@ -1,59 +0,0 @@ -#![cfg(feature = "serde-1")] - -#[macro_use] -extern crate ordermap; -extern crate serde_test; -extern crate fnv; - -use serde_test::{Token, assert_tokens}; - -#[test] -fn test_serde() { - let map = ordermap! { 1 => 2, 3 => 4 }; - assert_tokens(&map, - &[Token::Map { len: Some(2) }, - Token::I32(1), - Token::I32(2), - Token::I32(3), - Token::I32(4), - Token::MapEnd]); -} - -#[test] -fn test_serde_set() { - let set = orderset! { 1, 2, 3, 4 }; - assert_tokens(&set, - &[Token::Seq { len: Some(4) }, - Token::I32(1), - Token::I32(2), - Token::I32(3), - Token::I32(4), - Token::SeqEnd]); -} - -#[test] -fn test_serde_fnv_hasher() { - let mut map: ::ordermap::OrderMap<i32, i32, ::fnv::FnvBuildHasher> = Default::default(); - map.insert(1, 2); - map.insert(3, 4); - assert_tokens(&map, - &[Token::Map { len: Some(2) }, - Token::I32(1), - Token::I32(2), - Token::I32(3), - Token::I32(4), - Token::MapEnd]); -} - -#[test] -fn test_serde_map_fnv_hasher() { - let mut set: ::ordermap::OrderSet<i32, ::fnv::FnvBuildHasher> = Default::default(); - set.extend(1..5); - assert_tokens(&set, - &[Token::Seq { len: Some(4) }, - Token::I32(1), - Token::I32(2), - Token::I32(3), - Token::I32(4), - Token::SeqEnd]); -} diff --git a/vendor/ordermap/tests/tests.rs b/vendor/ordermap/tests/tests.rs deleted file mode 100644 index 20dac089e6..0000000000 --- a/vendor/ordermap/tests/tests.rs +++ /dev/null @@ -1,32 +0,0 @@ - -#[macro_use] -extern crate ordermap; -extern crate itertools; - - -#[test] -fn test_sort() { - let m = ordermap! { - 1 => 2, - 7 => 1, - 2 => 2, - 3 => 3, - }; - - itertools::assert_equal(m.sorted_by(|_k1, v1, _k2, v2| v1.cmp(v2)), - vec![(7, 1), (1, 2), (2, 2), (3, 3)]); -} - - -#[test] -fn test_sort_set() { - let s = orderset! { - 1, - 7, - 2, - 3, - }; - - itertools::assert_equal(s.sorted_by(|v1, v2| v1.cmp(v2)), - vec![1, 2, 3, 7]); -} diff --git a/vendor/petgraph/.cargo-checksum.json b/vendor/petgraph/.cargo-checksum.json deleted file mode 100644 index d290e2a980..0000000000 --- a/vendor/petgraph/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"CONTRIBUTING.rst":"3914abdde0831b7c5707081273b65ef858384e056fe9b49f97dd8c3356fb057d","Cargo.toml":"829bf74440a7dfa7e0d6597cc852560c0a90e751c42d1fb4a9cbc080d036db2b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","Makefile":"00085165f17f84dca52e95d3ef0890ce91004225938c39c5b20c237ba0265828","README.rst":"5f87d0bb9c347642b70f363ad17cd581e9be262e9840b8102d0af98f2d4172f7","benches/iso.rs":"fa2bb166e29936bb6956593fd814cb4851b450e9a9bf5a8cca5aacb97e36c517","benches/ograph.rs":"d16a926528360b30ceddfb33b2db545ff5c33ebb69ed8ed66de395f35fa8fc2d","benches/stable_graph.rs":"c1e98da2ee12f3dfb51d409d7ed58d29e78dce5a548084b3d438b817130db08e","custom.css":"e6f2cd299392337b4e2959c52f422e5b7be11920ea98d10db44d10ddef5ed47c","graph-example.dot":"9db00c096f61632bfba85a5a46b125cc5151583b6dbed89b75fa711ed4f649f2","src/algo/dominators.rs":"747b8b71aa498680392d1fb7f393270b0f2e3b30ee33f917b028f2e29d037c23","src/algo/mod.rs":"28b3e0b7c5f3c1a38135d2c283866f60c86e284400c4ebec0da679d1de0d6a65","src/astar.rs":"036380236c86f899f04e2b1244846940cde21707b330bf5db668c9b9acc9af81","src/csr.rs":"9e43473392d52237d094a742a8fbaa05b65f8a2fc5ab51dc448f2a4265fbe7c0","src/data.rs":"095cef6658eb66d7e5ae0e96174010ce6b718c9f8ebd94e862faca7bc51266b1","src/dijkstra.rs":"4385735dfa489ac8369adb45502d282242252164a8ed7e8abdb6b6f9126ab233","src/dot.rs":"49a0c7dfa0da25cbd1f580645a70c8c2187956469f6f9d5766e71d595e519112","src/generate.rs":"d4070d083c940021e67803f057270a03ecb6091c59e408fe6d4a44a356395725","src/graph_impl/frozen.rs":"5239aad49915f7d01f217634d3adf34c472d67734c8474c1bf54c43beb871f71","src/graph_impl/mod.rs":"ce29a9116998724ca4c168e4f66b4eb93d430419b298f12eb19762fbbe9e8f59","src/graph_impl/serialization.rs":"69171f8c0ab8a4ef0c90585241e112cfb22b45c2bd131b2186f8e32bad0b0287","src/graph_impl/stable_graph/mod.rs":"d5656206ba7f12b54275a89e2a7eb2bebca7bf5a2ef32a6b60657f7c5cf8379e","src/graph_impl/stable_graph/serialization.rs":"127d547644fdf209f513f4eb3f5d0707c4b780842e8eb3758f2148f1e8635a09","src/graphmap.rs":"5508c4bdec16cdf68ac2c1ded54844156c0b701154834f35bbb8ff066366a1e3","src/isomorphism.rs":"be6145a9ce6b9123cd8efe384ae23bede25deec00ff4b5d98a95cabc0637c136","src/iter_format.rs":"c9d24f5004db96e722ffe51fd13aed4983d271f8dc7199e6c83d0f696b3275bd","src/iter_utils.rs":"0bc16a03c4bacc6bdb978724c81cfcc3049771da17c409ff8dca6849f49acbdd","src/lib.rs":"e77c11445677da6474772114b1edb7279d58241e231ce4cf2519a14f6f0b5987","src/macros.rs":"04c1409ea1a7df8580cbfae834db700448b19f76d9640820919e0117ebe867b1","src/prelude.rs":"7675b4d37fab7ac506506e82cb3952d9912568f4a7a75e5504d085ca856d320a","src/quickcheck.rs":"e50f0d5fb9024832d7a68992f52d12cadabe0189da8ebce24524a2acba25aa6e","src/scored.rs":"5848275fe1ddbcec3cf324ef80f7356375082d9a4eb9ab69d0dc2be21f80a17d","src/serde_utils.rs":"abace257edfd72ae29af72e349e050d6a55f1e5dc62d3c72fb388393581d202e","src/traits_graph.rs":"074a0f6a68aed4ed23ba8a96111383eb905e0be0243b3c2162046bf89ee9875f","src/unionfind.rs":"3716ab724047b8ac574f822ce083952254274db6c6fbe69f61a00bcfd74ff65c","src/util.rs":"15a37dddb26dc65b866dbcfb01d95b8eb54a0f5d56adaf826ef0dd4203de4eec","src/visit/dfsvisit.rs":"f3e79a87230ab5f21e9e17cde7bacc8d373b06414192b53256b0be32c2200bab","src/visit/filter.rs":"3e8b444c975e8530f1e0b5b399ea4070069fff1a4601ba82f1ec95e98171cdb7","src/visit/macros.rs":"a8cea86e4e065c11fc975e7a3791399c44cc4fc92e5325723d09683ddf360d61","src/visit/mod.rs":"59d610c0b1c99189a78d9a00a294d2e08475e59b75de12ad3b9e324ec5371a39","src/visit/reversed.rs":"caa722a49c79466aa86730d8de08c2422ba10979ed23b26d9f8601a349020145","src/visit/traversal.rs":"6662b5fc80faba9bbcdce7b9dd2408b661a8d9e45316d9a1265bc6d0fdb68b9c","tests/graph.rs":"3a0b8c5da35b607bd79b1c268e09fde8d41a008b36d01fd78cc94db56842c90c","tests/graphmap.rs":"2e95ff80781513cb91fceea2041dc56401b2782c4882de1a6f41e6b617653d6b","tests/iso.rs":"4be4820947697bc531f9e0655a0b3a0f1b5240b9fede3cea433f0ae6431920cb","tests/quickcheck.rs":"3a4626c581d013ddbfcbe7a16bf00d5e04309fe7e91cbdd7c80220601ddd4887","tests/stable_graph.rs":"ee756cdf6dbea9c5405ad17e4e7e396bdf61799f833eea11e015d0aec34da75c","tests/unionfind.rs":"fb203dacf27d7d62503b6933dc73cd0e4da9d8b46a106ce3ee253c09781e2fe7","tests/utils/mod.rs":"2838784ba2fb2a01c901321a0680a030c99268e8b0afe197a4e8550556f0807d","tests/utils/qc.rs":"bb01df05da6f9d5aa61800f711176dcd22729fee8b1e0b6f3b708fa45194e9a4"},"package":"9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f"} \ No newline at end of file diff --git a/vendor/petgraph/CONTRIBUTING.rst b/vendor/petgraph/CONTRIBUTING.rst deleted file mode 100644 index 803c6bf875..0000000000 --- a/vendor/petgraph/CONTRIBUTING.rst +++ /dev/null @@ -1,127 +0,0 @@ -Contributing to ``petgraph`` -============================ - -Hi! We'd love to have your contributions! If you want help or mentorship, reach -out to us in a GitHub issue, or ping ``bluss`` in `#rust on irc.mozilla.org`_ -and introduce yourself. - -.. _`\#rust on irc.mozilla.org`: irc://irc.mozilla.org#rust - -* `Building`_ - -* `Testing`_ - -* `Pull Requests`_ - - * `Bug Fixes`_ - - * `Performance Improvements`_ - - * `Implementing New Algorithms`_ - -* `Where We Need Help`_ - -* `Team`_ - -Building --------- - -:: - - $ cargo build - -Testing -------- - -:: - - $ cargo test --features all - -Pull Requests -------------- - -All pull requests are reviewed by a team_ member before merging. - -Additionally, different kinds of pull requests have different requirements. - -Bug Fixes -......... - -We love getting bug fixes! - -Make sure to include a regression test, so that we can be sure that we never -accidentally re-introduce the bug again. - -Performance Improvements -........................ - -You made an algorithm faster? Awesome. - -When submitting performance improvement, include the following: - -* A new ``#[bench]`` function that exercises this code path, if one doesn't - already exist - -* Before and after ``cargo bench`` scores, optionally formatted using - `cargo-benchcmp`_ - -.. _`cargo-benchcmp`: https://github.com/BurntSushi/cargo-benchcmp - -Implementing New Algorithms -........................... - -Implementing new graph algorithms is encouraged! - -If you're going to implement a new algorithm, make sure that you do the -following: - -* Add a ``quickcheck`` property test for the new algorithm - -* Document what the algorithm does and in what situations it should be used - -* Document the big-O running time of the algorithm - -* Include links to relevant reading materials, such as a paper or Wikipedia - -* Make the algorithm work with generic graphs, constraining the generic graph - type parameter with our existing graph traits, like ``Visitable``, or with new - graph traits - -Any team_ member can review a pull request implementing a new algorithm, but the -final decision whether or not the algorithm is appropriate for inclusion in the -``petgraph`` crate is left to ``@bluss``. - -Additionally, assuming that the new algorithm is merged into ``petgraph``, you -are *strongly* encouraged to join the ``petgraph`` team_! *You* are the best -person to review any future bug fixes, performance improvements, and whatever -other changes that affect this new algorithm. - -Where We Need Help ------------------- - -* Issues labeled `"help wanted"`_ are issues where we could use a little help - from you. - -* Issues Labeled `"mentored"`_ are issues that don't really involve any more - investigation, just implementation. We've outlined what needs to be done, and - a team_ member has volunteered to help whoever claims the issue implement it, - and get the implementation merged. - -.. _`"help wanted"`: - https://github.com/bluss/petgraph/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22 - -.. _`"mentored"`: - https://github.com/bluss/petgraph/issues?q=is%3Aopen+is%3Aissue+label%3A%22mentored%22 - -Team ----- - -The ``petgraph`` team consists of: - -* ``@bluss`` -* ``@fitzgen`` - -We need more team members to help spread out reviewing and maintenance -responsibilities — want to join us? `Drop a comment in this issue!`_ - -.. _`Drop a comment in this issue!`: https://github.com/bluss/petgraph/issues/TODO diff --git a/vendor/petgraph/Cargo.toml b/vendor/petgraph/Cargo.toml deleted file mode 100644 index bffa6045db..0000000000 --- a/vendor/petgraph/Cargo.toml +++ /dev/null @@ -1,75 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies -# -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -name = "petgraph" -version = "0.4.13" -authors = ["bluss", "mitchmindtree"] -description = "Graph data structure library. Provides graph types and graph algorithms." -documentation = "https://docs.rs/petgraph/" -keywords = ["data-structure", "graph", "unionfind", "graph-algorithms"] -categories = ["data-structures"] -license = "MIT/Apache-2.0" -repository = "https://github.com/bluss/petgraph" -[package.metadata.docs.rs] -features = ["serde-1", "quickcheck"] - -[package.metadata.release] -no-dev-version = true -[profile.bench] -debug = true - -[profile.release] - -[lib] -name = "petgraph" -bench = false -[dependencies.fixedbitset] -version = "0.1.4" - -[dependencies.ordermap] -version = "0.3.0" -optional = true - -[dependencies.quickcheck] -version = "0.4" -optional = true -default-features = false - -[dependencies.serde] -version = "1.0" -optional = true - -[dependencies.serde_derive] -version = "1.0" -optional = true -[dev-dependencies.defmac] -version = "0.1" - -[dev-dependencies.itertools] -version = "0.7.0" -default-features = false - -[dev-dependencies.odds] -version = "0.2.19" - -[dev-dependencies.rand] -version = "0.3" - -[features] -all = ["unstable", "quickcheck", "stable_graph", "graphmap"] -default = ["graphmap", "stable_graph"] -generate = [] -graphmap = ["ordermap"] -serde-1 = ["serde", "serde_derive"] -stable_graph = [] -unstable = ["generate"] diff --git a/vendor/petgraph/LICENSE-MIT b/vendor/petgraph/LICENSE-MIT deleted file mode 100644 index 9203baa055..0000000000 --- a/vendor/petgraph/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2015 - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/vendor/petgraph/Makefile b/vendor/petgraph/Makefile deleted file mode 100644 index 7cd942c6f8..0000000000 --- a/vendor/petgraph/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -DOCCRATES = petgraph fixedbitset - -# deps to delete the generated docs -RMDOCS = - -FEATURES = unstable - -VERSIONS = $(patsubst %,target/VERS/%,$(DOCCRATES)) - -docs: mkdocs mksvgs subst $(RMDOCS) - -# https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html -$(VERSIONS): Cargo.toml - mkdir -p $(@D) - cargo pkgid $(@F) | sed -e "s/.*#\(\|.*:\)//" > "$@" - -$(DOCCRATES): %: target/VERS/% - # Put in the crate version into the docs - find ./doc/$@ -name "*.html" -exec sed -i -e "s/<title>\(.*\) - Rust/<title>$@ $(shell cat $<) - \1 - Rust/g" {} \; - -subst: $(DOCCRATES) - -mkdocs: Cargo.toml - cargo doc --features=$(FEATURES) - rm -rf ./doc - cp -r ./target/doc ./doc - - cat ./custom.css >> doc/main.css - -$(RMDOCS): mkdocs - rm -r ./doc/$@ - sed -i "/searchIndex\['$@'\]/d" doc/search-index.js - -mksvgs: mkdocs graph-example.dot - dot -Tsvg < ./graph-example.dot > graph-example.svg - mv graph-example.svg ./doc/petgraph/graph/ - - -.PHONY: docs mkdocs mksvgs subst $(DOCCRATES) $(RMDOCS) diff --git a/vendor/petgraph/README.rst b/vendor/petgraph/README.rst deleted file mode 100644 index a428db6d2c..0000000000 --- a/vendor/petgraph/README.rst +++ /dev/null @@ -1,383 +0,0 @@ - -petgraph -======== - -Graph data structure library. Requires Rust 1.12. - -Please read the `API documentation here`__ - -__ https://docs.rs/petgraph/ - -|build_status|_ |crates|_ - -.. |build_status| image:: https://travis-ci.org/bluss/petgraph.svg?branch=master -.. _build_status: https://travis-ci.org/bluss/petgraph - -.. |crates| image:: http://meritbadge.herokuapp.com/petgraph -.. _crates: https://crates.io/crates/petgraph - -Crate feature flags: - -- ``graphmap`` (default) enable ``GraphMap``. -- ``stable_graph`` (default) enable ``StableGraph``. -- ``serde-1`` (optional) enable serialization for ``Graph, StableGraph`` using - serde 1.0. Requires Rust version as required by serde. - -Recent Changes --------------- - -- 0.4.13 - - - Fix clippy warnings by @jonasbb - - Add docs for ``Csr`` by @ksadorf - - Fix conflict with new stable method ``find_map`` in new Rust - -- 0.4.12 - - - Newtype ``Time`` now also implements ``Hash`` - - Documentation updates for ``Frozen``. - -- 0.4.11 - - - Fix ``petgraph::graph::NodeReferences`` to be publically visible - - Small doc typo and code style files by @shepmaster and @waywardmonkeys - - Fix a future compat warning with pointer casts - -- 0.4.10 - - - Add graph trait ``IntoEdgesDirected`` - - Update dependencies - -- 0.4.9 - - - Fix ``bellman_ford`` to work correctly with undirected graphs (#152) by - @carrutstick - - Performance improvements for ``Graph, Stablegraph``'s ``.map()``. - -- 0.4.8 - - - ``StableGraph`` learned new methods nearing parity with ``Graph``. Note - that the ``StableGraph`` methods preserve index stability even in the batch - removal methods like ``filter_map`` and ``retain_edges``. - - + Added ``.filter_map()``, which maps associated node and edge data - + Added ``.retain_edges()``, ``.edge_indices()`` and ``.clear_edges()`` - - - Existing ``Graph`` iterators gained some trait impls: - - + ``.node_indices(), .edge_indices()`` are ``ExactSizeIterator`` - + ``.node_references()`` is now - ``DoubleEndedIterator + ExactSizeIterator``. - + ``.edge_references()`` is now ``ExactSizeIterator``. - - - Implemented ``From<StableGraph>`` for ``Graph``. - -- 0.4.7 - - - New algorithm by @jmcomets: A* search algorithm in ``petgraph::algo::astar`` - - One ``StableGraph`` bug fix whose patch was supposed to be in the previous - version: - - + ``add_edge(m, n, _)`` now properly always panics if nodes m or n don't - exist in the graph. - -- 0.4.6 - - - New optional crate feature: ``"serde-1"``, which enables serialization - for ``Graph`` and ``StableGraph`` using serde. - - Add methods ``new``, ``add_node`` to ``Csr`` by @jmcomets - - Add indexing with ``[]`` by node index, ``NodeCompactIndexable`` for - ``Csr`` by @jmcomets - - Amend doc for ``GraphMap::into_graph`` (it has a case where it can panic) - - Add implementation of ``From<Graph>`` for ``StableGraph``. - - Add implementation of ``IntoNodeReferences`` for ``&StableGraph``. - - Add method ``StableGraph::map`` that maps associated data - - Add method ``StableGraph::find_edge_undirected`` - - Many ``StableGraph`` bug fixes involving node vacancies (holes left by - deletions): - - + ``neighbors(n)`` and similar neighbor and edge iterator methods now - handle n being a vacancy properly. (This produces an empty iterator.) - + ``find_edge(m, n)`` now handles m being a vacancy correctly too - + ``StableGraph::node_bound`` was fixed for empty graphs and returns 0 - - - Add implementation of ``DoubleEndedIterator`` to ``Graph, StableGraph``'s - edge references iterators. - - Debug output for ``Graph`` now shows node and edge count. ``Graph, StableGraph`` - show nothing for the edges list if it's empty (no label). - - ``Arbitrary`` implementation for ``StableGraph`` now can produce graphs with - vacancies (used by quickcheck) - -- 0.4.5 - - - Fix ``max`` ambiguity error with current rust nightly by @daboross (#153) - -- 0.4.4 - - - Add ``GraphMap::all_edges_mut()`` iterator by @Binero - - Add ``StableGraph::retain_nodes`` by @Rupsbant - - Add ``StableGraph::index_twice_mut`` by @christolliday - -- 0.4.3 - - - Add crate categories - -- 0.4.2 - - - Move the ``visit.rs`` file due to changed rules for a module’s directory - ownership in Rust, resolving a future compat warning. - - The error types ``Cycle, NegativeCycle`` now implement ``PartialEq``. - -- 0.4.1 - - - Add new algorithm ``simple_fast`` for computing dominators in a control-flow - graph. - -- 0.4.0 - - - Breaking changes in ``Graph``: - - - ``Graph::edges`` and the other edges methods now return an iterator of - edge references - - - Other breaking changes: - - - ``toposort`` now returns an error if the graph had a cycle. - - ``is_cyclic_directed`` no longer takes a dfs space argument. It is - now recursive. - - ``scc`` was renamed to ``kosaraju_scc``. - - ``min_spanning_tree`` now returns an iterator that needs to be - made into a specific graph type deliberately. - - ``dijkstra`` now uses the ``IntoEdges`` trait. - - ``NodeIndexable`` changed its method signatures. - - ``IntoExternals`` was removed, and many other smaller adjustments - in graph traits. ``NodeId`` must now implement ``PartialEq``, for example. - - ``DfsIter, BfsIter`` were removed in favour of a more general approach - with the ``Walker`` trait and its iterator conversion. - - - New features: - - - New graph traits, for example ``IntoEdges`` which returns - an iterator of edge references. Everything implements the graph traits - much more consistently. - - Traits for associated data access and building graphs: ``DataMap``, - ``Build, Create, FromElements``. - - Graph adaptors: ``EdgeFiltered``. ``Filtered`` was renamed to ``NodeFiltered``. - - New algorithms: bellman-ford - - New graph: compressed sparse row (``Csr``). - - ``GraphMap`` implements ``NodeIndexable``. - - ``Dot`` was generalized - -- 0.3.2 - - - Add ``depth_first_search``, a recursive dfs visitor that emits discovery, - finishing and edge classification events. - - Add graph adaptor ``Filtered``. - - impl ``Debug, NodeIndexable`` for ``Reversed``. - -- 0.3.1 - - - Add ``.edges(), .edges_directed()`` to ``StableGraph``. Note that these - differ from ``Graph``, because this is the signature they will all use - in the future. - - Add ``.update_edge()`` to ``StableGraph``. - - Add reexports of common items in ``stable_graph`` module (for example - ``NodeIndex``). - - Minor performance improvements to graph iteration - - Improved docs for ``visit`` module. - -- 0.3.0 - - - Overhaul all graph visitor traits so that they use the ``IntoIterator`` - style. This makes them composable. - - - Multiple graph algorithms use new visitor traits. - - **Help is welcome to port more algorithms (and create new graph traits in - the process)!** - - - ``GraphMap`` can now have directed edges. ``GraphMap::new`` is now generic - in the edge type. ``DiGraphMap`` and ``UnGraphMap`` are new type aliases. - - Add type aliases ``DiGraph, UnGraph, StableDiGraph, StableUnGraph`` - - ``GraphMap`` is based on the ordermap crate. Deterministic iteration - order, faster iteration, no side tables needed to convert to ``Graph``. - - Improved docs for a lot of types and functions. - - Add graph visitor ``DfsPostOrder`` - - ``Dfs`` gained new methods ``from_parts`` and ``reset``. - - New algo ``has_path_connecting``. - - New algo ``tarjan_scc``, a second scc implementation. - - Document traversal order in ``Dfs, DfsPostOrder, scc, tarjan_scc``. - - Optional graph visitor workspace reuse in ``has_path_connecting``, - ``is_cyclic_directed, toposort``. - - Improved ``Debug`` formatting for ``Graph, StableGraph``. - - Add a prelude module - - ``GraphMap`` now has a method ``.into_graph()`` that makes a ``Graph``. - - ``Graph::retain_nodes, retain_edges`` now expose the self graph only - as wrapped in ``Frozen``, so that weights can be mutated but the - graph structure not. - - Enable ``StableGraph`` by default - - Add method ``Graph::contains_edge``. - - Renamed ``EdgeDirection`` → ``Direction``. - - Remove ``SubTopo``. - - Require Rust 1.12 or later - -- 0.2.10 - - - Fix compilation with rust nightly - -- 0.2.9 - - - Fix a bug in SubTopo (#81) - -- 0.2.8 - - - Add Graph methods reserve_nodes, reserve_edges, reserve_exact_nodes, - reserve_exact_edges, shrink_to_fit_edges, shrink_to_fit_nodes, shrink_to_fit - -- 0.2.7 - - - Update URLs - -- 0.2.6 - - - Fix warning about type parameter defaults (no functional change) - -- 0.2.5 - - - Add SubTopo, a topo walker for the subgraph reachable from a starting point. - - Add condensation, which forms the graph of a graph’s strongly connected - components. - -- 0.2.4 - - - Fix an algorithm error in scc (#61). This time we have a test that - crosschecks the result of the algorithm vs another implementation, for - greater confidence in its correctness. - -- 0.2.3 - - - Require Rust 1.6: Due to changes in how rust uses type parameter defaults. - - Implement Graph::clone_from. - -- 0.2.2 - - - Require Rust 1.5 - - ``Dot`` passes on the alternate flag to node and edge label formatting - - Add ``Clone`` impl for some iterators - - Document edge iteration order for ``Graph::neighbors`` - - Add *experimental feature* ``StableGraph``, using feature flag ``stable_graph`` - -- 0.2.1 - - - Add algorithm ``is_isomorphic_matching`` - -- 0.2.0 - - - New Features - - - Add Graph::neighbors().detach() to step edges without borrowing. - This is more general than, and replaces now deprecated - walk_edges_directed. (#39) - - Implement Default for Graph, GraphMap - - Add method EdgeDirection::opposite() - - - Breaking changes - - - Graph::neighbors() for undirected graphs and Graph::neighbors_undirected - for any graph now visit self loop edges once, not twice. (#31) - - Renamed Graph::without_edges to Graph::externals - - Removed Graph::edges_both - - GraphMap::add_edge now returns ``Option<E>`` - - Element type of ``GraphMap<N, E>::all_edges()`` changed to ``(N, N, &E)`` - - - Minor breaking changes - - - IntoWeightedEdge changed a type parameter to associated type - - IndexType is now an unsafe trait - - Removed IndexType::{one, zero}, use method new instead. - - Removed MinScored - - Ptr moved to the graphmap module. - - Directed, Undirected are now void enums. - - Fields of graphmap::Edges are now private (#19) - -- 0.1.18 - - - Fix bug on calling GraphMap::add_edge with existing edge (#35) - -- 0.1.17 - - - Add Graph::capacity(), GraphMap::capacity() - - Fix bug in Graph::reverse() - - Graph and GraphMap have `quickcheck::Arbitrary` implementations, - if optional feature `quickcheck` is enabled. - -- 0.1.16 - - - Add Graph::node_indices(), Graph::edge_indices() - - Add Graph::retain_nodes(), Graph::retain_edges() - - Add Graph::extend_with_edges(), Graph::from_edges() - - Add functions petgraph::graph::{edge_index, node_index}; - - Add GraphMap::extend(), GraphMap::from_edges() - - Add petgraph::dot::Dot for simple graphviz dot output - -- 0.1.15 - - - Add Graph::clear_edges() - - Add Graph::edge_endpoints() - - Add Graph::map() and Graph::filter_map() - -- 0.1.14 - - - Add new topological order visitor Topo - - New graph traits NeighborsDirected, Externals, Revisitable - -- 0.1.13 - - - Add iterator GraphMap::all_edges - -- 0.1.12 - - - Fix an algorithm error in scc (#14) - -- 0.1.11 - - - Update for well-formedness warnings (Rust RFC 1214), adding - new lifetime bounds on NeighborIter and Dfs, impact should be minimal. - -- 0.1.10 - - - Fix bug in WalkEdges::next_neighbor() - -- 0.1.9 - - - Fix Dfs/Bfs for a rustc bugfix that disallowed them - - Add method next_neighbor() to WalkEdges - -- 0.1.8 - - - Add Graph::walk_edges_directed() - - Add Graph::index_twice_mut() - -- 0.1.7 - - - Add Graph::edges_directed() - -- 0.1.6 - - - Add Graph::node_weights_mut and Graph::edge_weights_mut - -- 0.1.4 - - - Add back DfsIter, BfsIter - -License -------- - -Dual-licensed to be compatible with the Rust project. - -Licensed under the Apache License, Version 2.0 -http://www.apache.org/licenses/LICENSE-2.0 or the MIT license -http://opensource.org/licenses/MIT, at your -option. This file may not be copied, modified, or distributed -except according to those terms. - - diff --git a/vendor/petgraph/benches/iso.rs b/vendor/petgraph/benches/iso.rs deleted file mode 100644 index a142b9ee50..0000000000 --- a/vendor/petgraph/benches/iso.rs +++ /dev/null @@ -1,224 +0,0 @@ -#![feature(test)] - -extern crate test; -extern crate petgraph; - -use petgraph::prelude::*; -use petgraph::{ - EdgeType, -}; -use petgraph::graph::{ - node_index, -}; - -/// Petersen A and B are isomorphic -/// -/// http://www.dharwadker.org/tevet/isomorphism/ -const PETERSEN_A: &'static str = " - 0 1 0 0 1 0 1 0 0 0 - 1 0 1 0 0 0 0 1 0 0 - 0 1 0 1 0 0 0 0 1 0 - 0 0 1 0 1 0 0 0 0 1 - 1 0 0 1 0 1 0 0 0 0 - 0 0 0 0 1 0 0 1 1 0 - 1 0 0 0 0 0 0 0 1 1 - 0 1 0 0 0 1 0 0 0 1 - 0 0 1 0 0 1 1 0 0 0 - 0 0 0 1 0 0 1 1 0 0 -"; - -const PETERSEN_B: &'static str = " - 0 0 0 1 0 1 0 0 0 1 - 0 0 0 1 1 0 1 0 0 0 - 0 0 0 0 0 0 1 1 0 1 - 1 1 0 0 0 0 0 1 0 0 - 0 1 0 0 0 0 0 0 1 1 - 1 0 0 0 0 0 1 0 1 0 - 0 1 1 0 0 1 0 0 0 0 - 0 0 1 1 0 0 0 0 1 0 - 0 0 0 0 1 1 0 1 0 0 - 1 0 1 0 1 0 0 0 0 0 -"; - -/// An almost full set, isomorphic -const FULL_A: &'static str = " - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 0 1 1 1 0 1 - 1 1 1 1 1 1 1 1 1 1 -"; - -const FULL_B: &'static str = " - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 0 1 1 1 0 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 -"; - -/// Praust A and B are not isomorphic -const PRAUST_A: &'static str = " - 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 - 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 - 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 - 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 - 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 - 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 - 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 - 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 - 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 - 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 - 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 - 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 - 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 - 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 - 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 - 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 - 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 -"; - -const PRAUST_B: &'static str = " - 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 - 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 - 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 - 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 - 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 - 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 - 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 - 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 - 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 - 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 - 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 - 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 - 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 - 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 - 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 - 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 - 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 - 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 -"; - -/// Parse a text adjacency matrix format into a directed graph -fn parse_graph<Ty: EdgeType>(s: &str) -> Graph<(), (), Ty> -{ - let mut gr = Graph::with_capacity(0, 0); - let s = s.trim(); - let lines = s.lines().filter(|l| !l.is_empty()); - for (row, line) in lines.enumerate() { - for (col, word) in line.split(' ') - .filter(|s| s.len() > 0) - .enumerate() - { - let has_edge = word.parse::<i32>().unwrap(); - assert!(has_edge == 0 || has_edge == 1); - if has_edge == 0 { - continue; - } - while col >= gr.node_count() || row >= gr.node_count() { - gr.add_node(()); - } - gr.update_edge(node_index(row), node_index(col), ()); - } - } - gr -} - -fn str_to_graph(s: &str) -> Graph<(), (), Undirected> { - parse_graph(s) -} - -fn str_to_digraph(s: &str) -> Graph<(), (), Directed> { - parse_graph(s) -} - -/* -fn graph_to_ad_matrix<N, E, Ty: EdgeType>(g: &Graph<N,E,Ty>) -{ - let n = g.node_count(); - for i in (0..n) { - for j in (0..n) { - let ix = NodeIndex::new(i); - let jx = NodeIndex::new(j); - let out = match g.find_edge(ix, jx) { - None => "0", - Some(_) => "1", - }; - print!("{} ", out); - } - println!(""); - } -} -*/ - -#[bench] -fn petersen_iso_bench(bench: &mut test::Bencher) -{ - let a = str_to_digraph(PETERSEN_A); - let b = str_to_digraph(PETERSEN_B); - - bench.iter(|| petgraph::algo::is_isomorphic(&a, &b)); -} - -#[bench] -fn petersen_undir_iso_bench(bench: &mut test::Bencher) -{ - let a = str_to_graph(PETERSEN_A); - let b = str_to_graph(PETERSEN_B); - - bench.iter(|| petgraph::algo::is_isomorphic(&a, &b)); -} - -#[bench] -fn full_iso_bench(bench: &mut test::Bencher) -{ - let a = str_to_graph(FULL_A); - let b = str_to_graph(FULL_B); - - bench.iter(|| petgraph::algo::is_isomorphic(&a, &b)); -} - -#[bench] -fn praust_dir_no_iso_bench(bench: &mut test::Bencher) -{ - let a = str_to_digraph(PRAUST_A); - let b = str_to_digraph(PRAUST_B); - - bench.iter(|| petgraph::algo::is_isomorphic(&a, &b)); -} - -#[bench] -fn praust_undir_no_iso_bench(bench: &mut test::Bencher) -{ - let a = str_to_graph(PRAUST_A); - let b = str_to_graph(PRAUST_B); - - bench.iter(|| petgraph::algo::is_isomorphic(&a, &b)); -} - -#[bench] -fn bench_praust_mst(bb: &mut test::Bencher) -{ - let a = str_to_digraph(PRAUST_A); - let b = str_to_digraph(PRAUST_B); - - bb.iter(|| { - (petgraph::algo::min_spanning_tree(&a), - petgraph::algo::min_spanning_tree(&b)) - }); -} diff --git a/vendor/petgraph/benches/ograph.rs b/vendor/petgraph/benches/ograph.rs deleted file mode 100644 index 23ac271331..0000000000 --- a/vendor/petgraph/benches/ograph.rs +++ /dev/null @@ -1,54 +0,0 @@ -#![feature(test)] - -extern crate petgraph; -extern crate test; - -use petgraph::graph::Graph; - -#[bench] -fn bench_inser(b: &mut test::Bencher) { - let mut og = Graph::new(); - let fst = og.add_node(0i32); - for x in 1..125 { - let n = og.add_node(x); - og.add_edge(fst, n, ()); - } - b.iter(|| { - og.add_node(1) - }) -} - -#[bench] -fn bench_add_edge(b: &mut test::Bencher) { - let mut og = Graph::new(); - for _ in 0..100 { - og.add_node(()); - } - - b.iter(|| { - for (a, b) in og.node_indices().zip(og.node_indices().skip(1)) { - og.add_edge(a, b, ()); - } - og.clear_edges(); - }) -} - -#[bench] -fn bench_remove(b: &mut test::Bencher) { - // removal is very slow in a big graph. - // and this one doesn't even have many nodes. - let mut og = Graph::new(); - let fst = og.add_node(0i32); - let mut prev = fst; - for x in 1..1250 { - let n = og.add_node(x); - og.add_edge(prev, n, ()); - prev = n; - } - //println!("{}", og); - b.iter(|| { - for _ in 0 .. 100 { - og.remove_node(fst); - } - }) -} diff --git a/vendor/petgraph/benches/stable_graph.rs b/vendor/petgraph/benches/stable_graph.rs deleted file mode 100644 index 9bbda8face..0000000000 --- a/vendor/petgraph/benches/stable_graph.rs +++ /dev/null @@ -1,206 +0,0 @@ -#![feature(test)] - -extern crate petgraph; -extern crate test; - -use test::Bencher; -use petgraph::prelude::*; - -use petgraph::{EdgeType}; -use petgraph::stable_graph::{ - node_index, -}; - -/// An almost full set -const FULL_A: &'static str = " - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 0 1 1 1 0 1 - 1 1 1 1 1 1 1 1 1 1 -"; - -const BIGGER: &'static str = " - 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 - 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 - 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 - 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 - 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 - 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 - 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 - 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 - 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 - 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 - 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 - 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 - 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 - 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 - 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 - 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 - 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 - 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 - 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 - 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 - 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 -"; - -#[bench] -fn full_edges_default(bench: &mut Bencher) -{ - let a = parse_stable_graph::<Directed>(FULL_A); - - bench.iter(|| a.edges(node_index(1)).count()) -} - -#[bench] -fn full_edges_out(bench: &mut Bencher) -{ - let a = parse_stable_graph::<Directed>(FULL_A); - bench.iter(|| a.edges_directed(node_index(1), Outgoing).count()) -} -#[bench] -fn full_edges_in(bench: &mut Bencher) -{ - let a = parse_stable_graph::<Directed>(FULL_A); - - bench.iter(|| a.edges_directed(node_index(1), Incoming).count()) -} - -#[bench] -fn neighbors_default(bench: &mut Bencher) -{ - let a = parse_stable_graph::<Directed>(FULL_A); - - bench.iter(|| a.neighbors(node_index(1)).count()) -} - -#[bench] -fn neighbors_out(bench: &mut Bencher) -{ - let a = parse_stable_graph::<Directed>(FULL_A); - bench.iter(|| a.neighbors_directed(node_index(1), Outgoing).count()) -} -#[bench] -fn neighbors_in(bench: &mut Bencher) -{ - let a = parse_stable_graph::<Directed>(FULL_A); - - bench.iter(|| a.neighbors_directed(node_index(1), Incoming).count()) -} - -#[bench] -fn sccs_stable_graph(bench: &mut Bencher) -{ - let a = parse_stable_graph::<Directed>(BIGGER); - bench.iter(|| petgraph::algo::kosaraju_scc(&a)); -} - -#[bench] -fn sccs_graph(bench: &mut Bencher) -{ - let a = parse_graph::<Directed>(BIGGER); - bench.iter(|| petgraph::algo::kosaraju_scc(&a)); -} - -/// Parse a text adjacency matrix format into a directed graph -fn parse_stable_graph<Ty: EdgeType>(s: &str) -> StableGraph<(), (), Ty> -{ - let mut gr = StableGraph::default(); - let s = s.trim(); - let lines = s.lines().filter(|l| !l.is_empty()); - for (row, line) in lines.enumerate() { - for (col, word) in line.split(' ') - .filter(|s| s.len() > 0) - .enumerate() - { - let has_edge = word.parse::<i32>().unwrap(); - assert!(has_edge == 0 || has_edge == 1); - if has_edge == 0 { - continue; - } - while col >= gr.node_count() || row >= gr.node_count() { - gr.add_node(()); - } - gr.update_edge(node_index(row), node_index(col), ()); - } - } - gr -} - -/// Parse a text adjacency matrix format into a directed graph -fn parse_graph<Ty: EdgeType>(s: &str) -> Graph<(), (), Ty> -{ - let mut gr = Graph::with_capacity(0, 0); - let s = s.trim(); - let lines = s.lines().filter(|l| !l.is_empty()); - for (row, line) in lines.enumerate() { - for (col, word) in line.split(' ') - .filter(|s| s.len() > 0) - .enumerate() - { - let has_edge = word.parse::<i32>().unwrap(); - assert!(has_edge == 0 || has_edge == 1); - if has_edge == 0 { - continue; - } - while col >= gr.node_count() || row >= gr.node_count() { - gr.add_node(()); - } - gr.update_edge(node_index(row), node_index(col), ()); - } - } - gr -} - - -#[bench] -fn stable_graph_map(bench: &mut Bencher) -{ - let a = parse_stable_graph::<Directed>(BIGGER); - bench.iter(|| a.map(|i, _| i, |i, _| i)); -} - -#[bench] -fn graph_map(bench: &mut Bencher) -{ - let a = parse_graph::<Directed>(BIGGER); - bench.iter(|| a.map(|i, _| i, |i, _| i)); -} - -#[bench] -fn stable_graph_retain_nodes(bench: &mut Bencher) -{ - let mut a = parse_stable_graph::<Directed>(BIGGER); - bench.iter(|| a.retain_nodes(|gr, i| (i.index() + 1) % 3700 != 0)); -} - -#[bench] -fn stable_graph_retain_edges(bench: &mut Bencher) -{ - let mut a = parse_stable_graph::<Directed>(BIGGER); - bench.iter(|| a.retain_edges(|gr, i| (i.index() + 1) % 3700 != 0)); -} diff --git a/vendor/petgraph/custom.css b/vendor/petgraph/custom.css deleted file mode 100644 index 8e0b7053ea..0000000000 --- a/vendor/petgraph/custom.css +++ /dev/null @@ -1,25 +0,0 @@ - -.docblock pre.rust { background: #eeeeff; } -pre.trait, pre.fn, pre.struct, pre.enum, pre.typedef { background: #fcfefc; } - -/* Small “example” label for doc examples */ -.docblock pre.rust::before { - content: "example"; - float: right; - font-style: italic; - font-size: 0.8em; - margin-top: -10px; - margin-right: -5px; -} - - -/* Fixup where display in trait listing */ -pre.trait .where::before { -content: '\a '; -} - -.docblock code { - background-color: inherit; - font-weight: bold; - padding: 0 0.1em; -} diff --git a/vendor/petgraph/graph-example.dot b/vendor/petgraph/graph-example.dot deleted file mode 100644 index f78ce41f7f..0000000000 --- a/vendor/petgraph/graph-example.dot +++ /dev/null @@ -1,15 +0,0 @@ -digraph { -rankdir = "LR"; -splines = true; - - 0 [label="petgraph"] - 1 [label="fixedbitset"] - 2 [label="quickcheck"] - 3 [label="rand"] - 4 [label="libc"] - 0 -> 1 - 0 -> 2 - 2 -> 3 - 3 -> 4 - 2 -> 4 -} diff --git a/vendor/petgraph/src/algo/dominators.rs b/vendor/petgraph/src/algo/dominators.rs deleted file mode 100644 index 80380afd30..0000000000 --- a/vendor/petgraph/src/algo/dominators.rs +++ /dev/null @@ -1,267 +0,0 @@ -//! Compute dominators of a control-flow graph. -//! -//! # The Dominance Relation -//! -//! In a directed graph with a root node **R**, a node **A** is said to *dominate* a -//! node **B** iff every path from **R** to **B** contains **A**. -//! -//! The node **A** is said to *strictly dominate* the node **B** iff **A** dominates -//! **B** and **A ≠ B**. -//! -//! The node **A** is said to be the *immediate dominator* of a node **B** iff it -//! strictly dominates **B** and there does not exist any node **C** where **A** -//! dominates **C** and **C** dominates **B**. - -use std::collections::{HashMap, HashSet}; -use std::hash::Hash; - -use visit::{DfsPostOrder, GraphBase, IntoNeighbors, Visitable, Walker}; - -/// The dominance relation for some graph and root. -#[derive(Debug, Clone)] -pub struct Dominators<N> - where N: Copy + Eq + Hash -{ - root: N, - dominators: HashMap<N, N>, -} - -impl<N> Dominators<N> - where N: Copy + Eq + Hash -{ - /// Get the root node used to construct these dominance relations. - pub fn root(&self) -> N { - self.root - } - - /// Get the immediate dominator of the given node. - /// - /// Returns `None` for any node that is not reachable from the root, and for - /// the root itself. - pub fn immediate_dominator(&self, node: N) -> Option<N> { - if node == self.root { - None - } else { - self.dominators.get(&node).cloned() - } - } - - /// Iterate over the given node's that strict dominators. - /// - /// If the given node is not reachable from the root, then `None` is - /// returned. - pub fn strict_dominators(&self, node: N) -> Option<DominatorsIter<N>> { - if self.dominators.contains_key(&node) { - Some(DominatorsIter { - dominators: self, - node: self.immediate_dominator(node), - }) - } else { - None - } - } - - /// Iterate over all of the given node's dominators (including the given - /// node itself). - /// - /// If the given node is not reachable from the root, then `None` is - /// returned. - pub fn dominators(&self, node: N) -> Option<DominatorsIter<N>> { - if self.dominators.contains_key(&node) { - Some(DominatorsIter { - dominators: self, - node: Some(node), - }) - } else { - None - } - } -} - -/// Iterator for a node's dominators. -pub struct DominatorsIter<'a, N> - where N: 'a + Copy + Eq + Hash -{ - dominators: &'a Dominators<N>, - node: Option<N>, -} - -impl<'a, N> Iterator for DominatorsIter<'a, N> - where N: 'a + Copy + Eq + Hash -{ - type Item = N; - - fn next(&mut self) -> Option<Self::Item> { - let next = self.node.take(); - if let Some(next) = next { - self.node = self.dominators.immediate_dominator(next); - } - next - } -} - -/// The undefined dominator sentinel, for when we have not yet discovered a -/// node's dominator. -const UNDEFINED: usize = ::std::usize::MAX; - -/// This is an implementation of the engineered ["Simple, Fast Dominance -/// Algorithm"][0] discovered by Cooper et al. -/// -/// This algorithm is **O(|V|²)**, and therefore has slower theoretical running time -/// than the Lenguaer-Tarjan algorithm (which is **O(|E| log |V|)**. However, -/// Cooper et al found it to be faster in practice on control flow graphs of up -/// to ~30,000 vertices. -/// -/// [0]: http://www.cs.rice.edu/~keith/EMBED/dom.pdf -pub fn simple_fast<G>(graph: G, root: G::NodeId) -> Dominators<G::NodeId> - where G: IntoNeighbors + Visitable, - <G as GraphBase>::NodeId: Eq + Hash -{ - let (post_order, predecessor_sets) = simple_fast_post_order(graph, root); - let length = post_order.len(); - debug_assert!(length > 0); - debug_assert!(post_order.last() == Some(&root)); - - // From here on out we use indices into `post_order` instead of actual - // `NodeId`s wherever possible. This greatly improves the performance of - // this implementation, but we have to pay a little bit of upfront cost to - // convert our data structures to play along first. - - // Maps a node to its index into `post_order`. - let node_to_post_order_idx: HashMap<_, _> = post_order.iter() - .enumerate() - .map(|(idx, &node)| (node, idx)) - .collect(); - - // Maps a node's `post_order` index to its set of predecessors's indices - // into `post_order` (as a vec). - let idx_to_predecessor_vec = - predecessor_sets_to_idx_vecs(&post_order, &node_to_post_order_idx, predecessor_sets); - - let mut dominators = vec![UNDEFINED; length]; - dominators[length - 1] = length - 1; - - let mut changed = true; - while changed { - changed = false; - - // Iterate in reverse post order, skipping the root. - - for idx in (0..length - 1).rev() { - debug_assert!(post_order[idx] != root); - - // Take the intersection of every predecessor's dominator set; that - // is the current best guess at the immediate dominator for this - // node. - - let new_idom_idx = { - let mut predecessors = - idx_to_predecessor_vec[idx].iter().filter(|&&p| dominators[p] != UNDEFINED); - let new_idom_idx = predecessors.next() - .expect("Because the root is initialized to dominate itself, and is the \ - first node in every path, there must exist a predecessor to this \ - node that also has a dominator"); - predecessors.fold(*new_idom_idx, |new_idom_idx, &predecessor_idx| { - intersect(&dominators, new_idom_idx, predecessor_idx) - }) - }; - - debug_assert!(new_idom_idx < length); - - if new_idom_idx != dominators[idx] { - dominators[idx] = new_idom_idx; - changed = true; - } - } - } - - // All done! Translate the indices back into proper `G::NodeId`s. - - debug_assert!(!dominators.iter().any(|&dom| dom == UNDEFINED)); - - Dominators { - root: root, - dominators: dominators.into_iter() - .enumerate() - .map(|(idx, dom_idx)| (post_order[idx], post_order[dom_idx])) - .collect(), - } -} - -fn intersect(dominators: &[usize], mut finger1: usize, mut finger2: usize) -> usize { - while finger1 != finger2 { - if finger1 < finger2 { - finger1 = dominators[finger1]; - } else if finger2 < finger1 { - finger2 = dominators[finger2]; - } - } - finger1 -} - -fn predecessor_sets_to_idx_vecs<N>(post_order: &[N], - node_to_post_order_idx: &HashMap<N, usize>, - mut predecessor_sets: HashMap<N, HashSet<N>>) - -> Vec<Vec<usize>> - where N: Copy + Eq + Hash -{ - post_order.iter() - .map(|node| { - predecessor_sets.remove(node) - .map(|predecessors| { - predecessors.into_iter() - .map(|p| *node_to_post_order_idx.get(&p).unwrap()) - .collect() - }) - .unwrap_or_else(Vec::new) - }) - .collect() -} - -fn simple_fast_post_order<G>(graph: G, - root: G::NodeId) - -> (Vec<G::NodeId>, HashMap<G::NodeId, HashSet<G::NodeId>>) - where G: IntoNeighbors + Visitable, - <G as GraphBase>::NodeId: Eq + Hash -{ - let mut post_order = vec![]; - let mut predecessor_sets = HashMap::new(); - - for node in DfsPostOrder::new(graph, root).iter(graph) { - post_order.push(node); - - for successor in graph.neighbors(node) { - predecessor_sets.entry(successor) - .or_insert_with(HashSet::new) - .insert(node); - } - } - - (post_order, predecessor_sets) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_iter_dominators() { - let doms: Dominators<u32> = Dominators { - root: 0, - dominators: [(2, 1), (1, 0), (0, 0)] - .iter() - .cloned() - .collect(), - }; - - let all_doms: Vec<_> = doms.dominators(2).unwrap().collect(); - assert_eq!(vec![2, 1, 0], all_doms); - - assert_eq!(None::<()>, doms.dominators(99).map(|_| unreachable!())); - - let strict_doms: Vec<_> = doms.strict_dominators(2).unwrap().collect(); - assert_eq!(vec![1, 0], strict_doms); - - assert_eq!(None::<()>, doms.strict_dominators(99).map(|_| unreachable!())); - } -} diff --git a/vendor/petgraph/src/algo/mod.rs b/vendor/petgraph/src/algo/mod.rs deleted file mode 100644 index 4fc05c25f8..0000000000 --- a/vendor/petgraph/src/algo/mod.rs +++ /dev/null @@ -1,626 +0,0 @@ -//! Graph algorithms. -//! -//! It is a goal to gradually migrate the algorithms to be based on graph traits -//! so that they are generally applicable. For now, some of these still require -//! the `Graph` type. - -pub mod dominators; - -use std::collections::BinaryHeap; -use std::cmp::min; - -use prelude::*; - -use super::{ - EdgeType, -}; -use scored::MinScored; -use super::visit::{ - GraphRef, - GraphBase, - Visitable, - VisitMap, - IntoNeighbors, - IntoNeighborsDirected, - IntoNodeIdentifiers, - NodeCount, - NodeIndexable, - NodeCompactIndexable, - IntoEdgeReferences, - IntoEdges, - Reversed, -}; -use super::unionfind::UnionFind; -use super::graph::{ - IndexType, -}; -use visit::{Data, NodeRef, IntoNodeReferences}; -use data::{ - Element, -}; - -pub use super::isomorphism::{ - is_isomorphic, - is_isomorphic_matching, -}; -pub use super::dijkstra::dijkstra; -pub use super::astar::astar; - -/// [Generic] Return the number of connected components of the graph. -/// -/// For a directed graph, this is the *weakly* connected components. -pub fn connected_components<G>(g: G) -> usize - where G: NodeCompactIndexable + IntoEdgeReferences, -{ - let mut vertex_sets = UnionFind::new(g.node_bound()); - for edge in g.edge_references() { - let (a, b) = (edge.source(), edge.target()); - - // union the two vertices of the edge - vertex_sets.union(g.to_index(a), g.to_index(b)); - } - let mut labels = vertex_sets.into_labeling(); - labels.sort(); - labels.dedup(); - labels.len() -} - - -/// [Generic] Return `true` if the input graph contains a cycle. -/// -/// Always treats the input graph as if undirected. -pub fn is_cyclic_undirected<G>(g: G) -> bool - where G: NodeIndexable + IntoEdgeReferences -{ - let mut edge_sets = UnionFind::new(g.node_bound()); - for edge in g.edge_references() { - let (a, b) = (edge.source(), edge.target()); - - // union the two vertices of the edge - // -- if they were already the same, then we have a cycle - if !edge_sets.union(g.to_index(a), g.to_index(b)) { - return true - } - } - false -} - - -/// [Generic] Perform a topological sort of a directed graph. -/// -/// If the graph was acyclic, return a vector of nodes in topological order: -/// each node is ordered before its successors. -/// Otherwise, it will return a `Cycle` error. Self loops are also cycles. -/// -/// To handle graphs with cycles, use the scc algorithms or `DfsPostOrder` -/// instead of this function. -/// -/// If `space` is not `None`, it is used instead of creating a new workspace for -/// graph traversal. The implementation is iterative. -pub fn toposort<G>(g: G, space: Option<&mut DfsSpace<G::NodeId, G::Map>>) - -> Result<Vec<G::NodeId>, Cycle<G::NodeId>> - where G: IntoNeighborsDirected + IntoNodeIdentifiers + Visitable, -{ - // based on kosaraju scc - with_dfs(g, space, |dfs| { - dfs.reset(g); - let mut finished = g.visit_map(); - - let mut finish_stack = Vec::new(); - for i in g.node_identifiers() { - if dfs.discovered.is_visited(&i) { - continue; - } - dfs.stack.push(i); - while let Some(&nx) = dfs.stack.last() { - if dfs.discovered.visit(nx) { - // First time visiting `nx`: Push neighbors, don't pop `nx` - for succ in g.neighbors(nx) { - if succ == nx { - // self cycle - return Err(Cycle(nx)); - } - if !dfs.discovered.is_visited(&succ) { - dfs.stack.push(succ); - } - } - } else { - dfs.stack.pop(); - if finished.visit(nx) { - // Second time: All reachable nodes must have been finished - finish_stack.push(nx); - } - } - } - } - finish_stack.reverse(); - - dfs.reset(g); - for &i in &finish_stack { - dfs.move_to(i); - let mut cycle = false; - while let Some(j) = dfs.next(Reversed(g)) { - if cycle { - return Err(Cycle(j)); - } - cycle = true; - } - } - - Ok(finish_stack) - }) -} - -/// [Generic] Return `true` if the input directed graph contains a cycle. -/// -/// This implementation is recursive; use `toposort` if an alternative is -/// needed. -pub fn is_cyclic_directed<G>(g: G) -> bool - where G: IntoNodeIdentifiers + IntoNeighbors + Visitable, -{ - use visit::{depth_first_search, DfsEvent}; - - depth_first_search(g, g.node_identifiers(), |event| { - match event { - DfsEvent::BackEdge(_, _) => Err(()), - _ => Ok(()), - } - }).is_err() -} - -type DfsSpaceType<G> = DfsSpace<<G as GraphBase>::NodeId, <G as Visitable>::Map>; - -/// Workspace for a graph traversal. -#[derive(Clone, Debug)] -pub struct DfsSpace<N, VM> { - dfs: Dfs<N, VM>, -} - -impl<N, VM> DfsSpace<N, VM> - where N: Copy + PartialEq, - VM: VisitMap<N>, -{ - pub fn new<G>(g: G) -> Self - where G: GraphRef + Visitable<NodeId=N, Map=VM>, - { - DfsSpace { - dfs: Dfs::empty(g) - } - } -} - -impl<N, VM> Default for DfsSpace<N, VM> - where VM: VisitMap<N> + Default, -{ - fn default() -> Self { - DfsSpace { - dfs: Dfs { - stack: <_>::default(), - discovered: <_>::default(), - } - } - } -} - -/// Create a Dfs if it's needed -fn with_dfs<G, F, R>(g: G, space: Option<&mut DfsSpaceType<G>>, f: F) -> R - where G: GraphRef + Visitable, - F: FnOnce(&mut Dfs<G::NodeId, G::Map>) -> R -{ - let mut local_visitor; - let dfs = if let Some(v) = space { &mut v.dfs } else { - local_visitor = Dfs::empty(g); - &mut local_visitor - }; - f(dfs) -} - -/// [Generic] Check if there exists a path starting at `from` and reaching `to`. -/// -/// If `from` and `to` are equal, this function returns true. -/// -/// If `space` is not `None`, it is used instead of creating a new workspace for -/// graph traversal. -pub fn has_path_connecting<G>(g: G, from: G::NodeId, to: G::NodeId, - space: Option<&mut DfsSpace<G::NodeId, G::Map>>) - -> bool - where G: IntoNeighbors + Visitable, -{ - with_dfs(g, space, |dfs| { - dfs.reset(g); - dfs.move_to(from); - while let Some(x) = dfs.next(g) { - if x == to { - return true; - } - } - false - }) -} - -/// Renamed to `kosaraju_scc`. -#[deprecated(note = "renamed to kosaraju_scc")] -pub fn scc<G>(g: G) -> Vec<Vec<G::NodeId>> - where G: IntoNeighborsDirected + Visitable + IntoNodeIdentifiers, -{ - kosaraju_scc(g) -} - -/// [Generic] Compute the *strongly connected components* using [Kosaraju's algorithm][1]. -/// -/// [1]: https://en.wikipedia.org/wiki/Kosaraju%27s_algorithm -/// -/// Return a vector where each element is a strongly connected component (scc). -/// The order of node ids within each scc is arbitrary, but the order of -/// the sccs is their postorder (reverse topological sort). -/// -/// For an undirected graph, the sccs are simply the connected components. -/// -/// This implementation is iterative and does two passes over the nodes. -pub fn kosaraju_scc<G>(g: G) -> Vec<Vec<G::NodeId>> - where G: IntoNeighborsDirected + Visitable + IntoNodeIdentifiers, -{ - let mut dfs = DfsPostOrder::empty(g); - - // First phase, reverse dfs pass, compute finishing times. - // http://stackoverflow.com/a/26780899/161659 - let mut finish_order = Vec::with_capacity(0); - for i in g.node_identifiers() { - if dfs.discovered.is_visited(&i) { - continue - } - - dfs.move_to(i); - while let Some(nx) = dfs.next(Reversed(g)) { - finish_order.push(nx); - } - } - - let mut dfs = Dfs::from_parts(dfs.stack, dfs.discovered); - dfs.reset(g); - let mut sccs = Vec::new(); - - // Second phase - // Process in decreasing finishing time order - for i in finish_order.into_iter().rev() { - if dfs.discovered.is_visited(&i) { - continue; - } - // Move to the leader node `i`. - dfs.move_to(i); - let mut scc = Vec::new(); - while let Some(nx) = dfs.next(g) { - scc.push(nx); - } - sccs.push(scc); - } - sccs -} - -/// [Generic] Compute the *strongly connected components* using [Tarjan's algorithm][1]. -/// -/// [1]: https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm -/// -/// Return a vector where each element is a strongly connected component (scc). -/// The order of node ids within each scc is arbitrary, but the order of -/// the sccs is their postorder (reverse topological sort). -/// -/// For an undirected graph, the sccs are simply the connected components. -/// -/// This implementation is recursive and does one pass over the nodes. -pub fn tarjan_scc<G>(g: G) -> Vec<Vec<G::NodeId>> - where G: IntoNodeIdentifiers + IntoNeighbors + NodeIndexable -{ - #[derive(Copy, Clone)] - #[derive(Debug)] - struct NodeData { - index: Option<usize>, - lowlink: usize, - on_stack: bool, - } - - #[derive(Debug)] - struct Data<'a, G> - where G: NodeIndexable, - G::NodeId: 'a - { - index: usize, - nodes: Vec<NodeData>, - stack: Vec<G::NodeId>, - sccs: &'a mut Vec<Vec<G::NodeId>>, - } - - fn scc_visit<G>(v: G::NodeId, g: G, data: &mut Data<G>) - where G: IntoNeighbors + NodeIndexable - { - macro_rules! node { - ($node:expr) => (data.nodes[g.to_index($node)]) - } - - if node![v].index.is_some() { - // already visited - return; - } - - let v_index = data.index; - node![v].index = Some(v_index); - node![v].lowlink = v_index; - node![v].on_stack = true; - data.stack.push(v); - data.index += 1; - - for w in g.neighbors(v) { - match node![w].index { - None => { - scc_visit(w, g, data); - node![v].lowlink = min(node![v].lowlink, node![w].lowlink); - } - Some(w_index) => { - if node![w].on_stack { - // Successor w is in stack S and hence in the current SCC - let v_lowlink = &mut node![v].lowlink; - *v_lowlink = min(*v_lowlink, w_index); - } - } - } - } - - // If v is a root node, pop the stack and generate an SCC - if let Some(v_index) = node![v].index { - if node![v].lowlink == v_index { - let mut cur_scc = Vec::new(); - loop { - let w = data.stack.pop().unwrap(); - node![w].on_stack = false; - cur_scc.push(w); - if g.to_index(w) == g.to_index(v) { break; } - } - data.sccs.push(cur_scc); - } - } - } - - let mut sccs = Vec::new(); - { - let map = vec![NodeData { index: None, lowlink: !0, on_stack: false }; g.node_bound()]; - - let mut data = Data { - index: 0, - nodes: map, - stack: Vec::new(), - sccs: &mut sccs, - }; - - for n in g.node_identifiers() { - scc_visit(n, g, &mut data); - } - } - sccs -} - -/// [Graph] Condense every strongly connected component into a single node and return the result. -/// -/// If `make_acyclic` is true, self-loops and multi edges are ignored, guaranteeing that -/// the output is acyclic. -pub fn condensation<N, E, Ty, Ix>(g: Graph<N, E, Ty, Ix>, make_acyclic: bool) -> Graph<Vec<N>, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - let sccs = kosaraju_scc(&g); - let mut condensed: Graph<Vec<N>, E, Ty, Ix> = Graph::with_capacity(sccs.len(), g.edge_count()); - - // Build a map from old indices to new ones. - let mut node_map = vec![NodeIndex::end(); g.node_count()]; - for comp in sccs { - let new_nix = condensed.add_node(Vec::new()); - for nix in comp { - node_map[nix.index()] = new_nix; - } - } - - // Consume nodes and edges of the old graph and insert them into the new one. - let (nodes, edges) = g.into_nodes_edges(); - for (nix, node) in nodes.into_iter().enumerate() { - condensed[node_map[nix]].push(node.weight); - } - for edge in edges { - let source = node_map[edge.source().index()]; - let target = node_map[edge.target().index()]; - if make_acyclic { - if source != target { - condensed.update_edge(source, target, edge.weight); - } - } else { - condensed.add_edge(source, target, edge.weight); - } - } - condensed -} - -/// [Generic] Compute a *minimum spanning tree* of a graph. -/// -/// The input graph is treated as if undirected. -/// -/// Using Kruskal's algorithm with runtime **O(|E| log |E|)**. We actually -/// return a minimum spanning forest, i.e. a minimum spanning tree for each connected -/// component of the graph. -/// -/// The resulting graph has all the vertices of the input graph (with identical node indices), -/// and **|V| - c** edges, where **c** is the number of connected components in `g`. -/// -/// Use `from_elements` to create a graph from the resulting iterator. -pub fn min_spanning_tree<G>(g: G) -> MinSpanningTree<G> - where G::NodeWeight: Clone, - G::EdgeWeight: Clone + PartialOrd, - G: IntoNodeReferences + IntoEdgeReferences + NodeIndexable, -{ - - // Initially each vertex is its own disjoint subgraph, track the connectedness - // of the pre-MST with a union & find datastructure. - let subgraphs = UnionFind::new(g.node_bound()); - - let edges = g.edge_references(); - let mut sort_edges = BinaryHeap::with_capacity(edges.size_hint().0); - for edge in edges { - sort_edges.push(MinScored(edge.weight().clone(), (edge.source(), edge.target()))); - } - - MinSpanningTree { - graph: g, - node_ids: Some(g.node_references()), - subgraphs: subgraphs, - sort_edges: sort_edges, - } - -} - -/// An iterator producing a minimum spanning forest of a graph. -pub struct MinSpanningTree<G> - where G: Data + IntoNodeReferences, -{ - graph: G, - node_ids: Option<G::NodeReferences>, - subgraphs: UnionFind<usize>, - sort_edges: BinaryHeap<MinScored<G::EdgeWeight, (G::NodeId, G::NodeId)>>, -} - - -impl<G> Iterator for MinSpanningTree<G> - where G: IntoNodeReferences + NodeIndexable, - G::NodeWeight: Clone, - G::EdgeWeight: PartialOrd, -{ - type Item = Element<G::NodeWeight, G::EdgeWeight>; - - fn next(&mut self) -> Option<Self::Item> { - if let Some(ref mut iter) = self.node_ids { - if let Some(node) = iter.next() { - return Some(Element::Node { weight: node.weight().clone() }); - } - } - self.node_ids = None; - - // Kruskal's algorithm. - // Algorithm is this: - // - // 1. Create a pre-MST with all the vertices and no edges. - // 2. Repeat: - // - // a. Remove the shortest edge from the original graph. - // b. If the edge connects two disjoint trees in the pre-MST, - // add the edge. - while let Some(MinScored(score, (a, b))) = self.sort_edges.pop() { - let g = self.graph; - // check if the edge would connect two disjoint parts - if self.subgraphs.union(g.to_index(a), g.to_index(b)) { - return Some(Element::Edge { - source: g.to_index(a), - target: g.to_index(b), - weight: score, - }); - } - } - None - } -} - -/// An algorithm error: a cycle was found in the graph. -#[derive(Clone, Debug, PartialEq)] -pub struct Cycle<N>(N); - -impl<N> Cycle<N> { - /// Return a node id that participates in the cycle - pub fn node_id(&self) -> N - where N: Copy - { - self.0 - } -} -/// An algorithm error: a cycle of negative weights was found in the graph. -#[derive(Clone, Debug, PartialEq)] -pub struct NegativeCycle(()); - -/// [Generic] Compute shortest paths from node `source` to all other. -/// -/// Using the [Bellman–Ford algorithm][bf]; negative edge costs are -/// permitted, but the graph must not have a cycle of negative weights -/// (in that case it will return an error). -/// -/// On success, return one vec with path costs, and another one which points -/// out the predecessor of a node along a shortest path. The vectors -/// are indexed by the graph's node indices. -/// -/// [bf]: https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm -pub fn bellman_ford<G>(g: G, source: G::NodeId) - -> Result<(Vec<G::EdgeWeight>, Vec<Option<G::NodeId>>), NegativeCycle> - where G: NodeCount + IntoNodeIdentifiers + IntoEdges + NodeIndexable, - G::EdgeWeight: FloatMeasure, -{ - let mut predecessor = vec![None; g.node_bound()]; - let mut distance = vec![<_>::infinite(); g.node_bound()]; - - let ix = |i| g.to_index(i); - - distance[ix(source)] = <_>::zero(); - // scan up to |V| - 1 times. - for _ in 1..g.node_count() { - let mut did_update = false; - for i in g.node_identifiers() { - for edge in g.edges(i) { - let i = edge.source(); - let j = edge.target(); - let w = *edge.weight(); - if distance[ix(i)] + w < distance[ix(j)] { - distance[ix(j)] = distance[ix(i)] + w; - predecessor[ix(j)] = Some(i); - did_update = true; - } - } - } - if !did_update { - break; - } - } - - // check for negative weight cycle - for i in g.node_identifiers() { - for edge in g.edges(i) { - let j = edge.target(); - let w = *edge.weight(); - if distance[ix(i)] + w < distance[ix(j)] { - //println!("neg cycle, detected from {} to {}, weight={}", i, j, w); - return Err(NegativeCycle(())); - } - } - } - - Ok((distance, predecessor)) -} - -use std::ops::Add; -use std::fmt::Debug; - -/// Associated data that can be used for measures (such as length). -pub trait Measure : Debug + PartialOrd + Add<Self, Output=Self> + Default + Clone { -} - -impl<M> Measure for M - where M: Debug + PartialOrd + Add<M, Output=M> + Default + Clone, -{ } - -/// A floating-point measure. -pub trait FloatMeasure : Measure + Copy { - fn zero() -> Self; - fn infinite() -> Self; -} - -impl FloatMeasure for f32 { - fn zero() -> Self { 0. } - fn infinite() -> Self { 1./0. } -} - -impl FloatMeasure for f64 { - fn zero() -> Self { 0. } - fn infinite() -> Self { 1./0. } -} - diff --git a/vendor/petgraph/src/astar.rs b/vendor/petgraph/src/astar.rs deleted file mode 100644 index 794f1c09e7..0000000000 --- a/vendor/petgraph/src/astar.rs +++ /dev/null @@ -1,169 +0,0 @@ -use std::collections::{ - HashMap, - BinaryHeap, -}; -use std::collections::hash_map::Entry::{ - Occupied, - Vacant, -}; - -use std::hash::Hash; - -use scored::MinScored; -use super::visit::{ - EdgeRef, - GraphBase, - IntoEdges, - VisitMap, - Visitable, -}; - -use algo::Measure; - -/// [Generic] A* shortest path algorithm. -/// -/// Computes the shortest path from `start` to `finish`, including the total path cost. -/// -/// `finish` is implicitly given via the `is_goal` callback, which should return `true` if the -/// given node is the finish node. -/// -/// The function `edge_cost` should return the cost for a particular edge. Edge costs must be -/// non-negative. -/// -/// The function `estimate_cost` should return the estimated cost to the finish for a particular -/// node. For the algorithm to find the actual shortest path, it should be admissible, meaning that -/// it should never overestimate the actual cost to get to the nearest goal node. Estimate costs -/// must also be non-negative. -/// -/// The graph should be `Visitable` and implement `IntoEdges`. -/// -/// ``` -/// use petgraph::Graph; -/// use petgraph::algo::astar; -/// -/// let mut g = Graph::new(); -/// let a = g.add_node((0., 0.)); -/// let b = g.add_node((2., 0.)); -/// let c = g.add_node((1., 1.)); -/// let d = g.add_node((0., 2.)); -/// let e = g.add_node((3., 3.)); -/// let f = g.add_node((4., 2.)); -/// g.extend_with_edges(&[ -/// (a, b, 2), -/// (a, d, 4), -/// (b, c, 1), -/// (b, f, 7), -/// (c, e, 5), -/// (e, f, 1), -/// (d, e, 1), -/// ]); -/// -/// let path = astar(&g, a, |finish| finish == f, |e| *e.weight(), |_| 0); -/// assert_eq!(path, Some((6, vec![a, d, e, f]))); -/// ``` -/// -/// Returns the total cost + the path of subsequent `NodeId` from start to finish, if one was -/// found. -pub fn astar<G, F, H, K, IsGoal>(graph: G, start: G::NodeId, mut is_goal: IsGoal, - mut edge_cost: F, mut estimate_cost: H) - -> Option<(K, Vec<G::NodeId>)> - where G: IntoEdges + Visitable, - IsGoal: FnMut(G::NodeId) -> bool, - G::NodeId: Eq + Hash, - F: FnMut(G::EdgeRef) -> K, - H: FnMut(G::NodeId) -> K, - K: Measure + Copy, -{ - let mut visited = graph.visit_map(); - let mut visit_next = BinaryHeap::new(); - let mut scores = HashMap::new(); - let mut path_tracker = PathTracker::<G>::new(); - - let zero_score = K::default(); - scores.insert(start, zero_score); - visit_next.push(MinScored(estimate_cost(start), start)); - - while let Some(MinScored(_, node)) = visit_next.pop() { - if is_goal(node) { - let path = path_tracker.reconstruct_path_to(node); - let cost = scores[&node]; - return Some((cost, path)); - } - - // Don't visit the same node several times, as the first time it was visited it was using - // the shortest available path. - if !visited.visit(node) { - continue - } - - // This lookup can be unwrapped without fear of panic since the node was necessarily scored - // before adding him to `visit_next`. - let node_score = scores[&node]; - - for edge in graph.edges(node) { - let next = edge.target(); - if visited.is_visited(&next) { - continue - } - - let mut next_score = node_score + edge_cost(edge); - - match scores.entry(next) { - Occupied(ent) => { - let old_score = *ent.get(); - if next_score < old_score { - *ent.into_mut() = next_score; - path_tracker.set_predecessor(next, node); - } else { - next_score = old_score; - } - }, - Vacant(ent) => { - ent.insert(next_score); - path_tracker.set_predecessor(next, node); - } - } - - let next_estimate_score = next_score + estimate_cost(next); - visit_next.push(MinScored(next_estimate_score, next)); - } - } - - None -} - -struct PathTracker<G> - where G: GraphBase, - G::NodeId: Eq + Hash, -{ - came_from: HashMap<G::NodeId, G::NodeId>, -} - -impl<G> PathTracker<G> - where G: GraphBase, - G::NodeId: Eq + Hash, -{ - fn new() -> PathTracker<G> { - PathTracker { - came_from: HashMap::new(), - } - } - - fn set_predecessor(&mut self, node: G::NodeId, previous: G::NodeId) { - self.came_from.insert(node, previous); - } - - fn reconstruct_path_to(&self, last: G::NodeId) -> Vec<G::NodeId> { - let mut path = vec![last]; - - let mut current = last; - while let Some(&previous) = self.came_from.get(¤t) { - path.push(previous); - current = previous; - } - - path.reverse(); - - path - } -} diff --git a/vendor/petgraph/src/csr.rs b/vendor/petgraph/src/csr.rs deleted file mode 100644 index 1ce87ccf9b..0000000000 --- a/vendor/petgraph/src/csr.rs +++ /dev/null @@ -1,940 +0,0 @@ -//! Compressed Sparse Row (CSR) is a sparse adjacency matrix graph. - -use std::marker::PhantomData; -use std::cmp::max; -use std::ops::{Range, Index, IndexMut}; -use std::iter::{Enumerate, Zip}; -use std::slice::Windows; - -use visit::{EdgeRef, GraphBase, IntoNeighbors, NodeIndexable, IntoEdges}; -use visit::{NodeCompactIndexable, IntoNodeIdentifiers, Visitable}; -use visit::{Data, IntoEdgeReferences, NodeCount, GraphProp}; - -use util::zip; - -#[doc(no_inline)] -pub use graph::{IndexType, DefaultIx}; - -use { - EdgeType, - Directed, - IntoWeightedEdge, -}; - -/// Csr node index type, a plain integer. -pub type NodeIndex<Ix = DefaultIx> = Ix; -/// Csr edge index type, a plain integer. -pub type EdgeIndex = usize; - -const BINARY_SEARCH_CUTOFF: usize = 32; - -/// Compressed Sparse Row ([`CSR`]) is a sparse adjacency matrix graph. -/// -/// `CSR` is parameterized over: -/// -/// - Associated data `N` for nodes and `E` for edges, called *weights*. -/// The associated data can be of arbitrary type. -/// - Edge type `Ty` that determines whether the graph edges are directed or undirected. -/// - Index type `Ix`, which determines the maximum size of the graph. -/// -/// -/// Using **O(|E| + |V|)** space. -/// -/// Self loops are allowed, no parallel edges. -/// -/// Fast iteration of the outgoing edges of a vertex. -/// [`CSR`]: https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format) -#[derive(Debug)] -pub struct Csr<N = (), E = (), Ty = Directed, Ix = DefaultIx> { - /// Column of next edge - column: Vec<NodeIndex<Ix>>, - /// weight of each edge; lock step with column - edges: Vec<E>, - /// Index of start of row Always node_count + 1 long. - /// Last element is always equal to column.len() - row: Vec<usize>, - node_weights: Vec<N>, - edge_count: usize, - ty: PhantomData<Ty>, -} - -impl<N, E, Ty, Ix> Default for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn default() -> Self { - Self::new() - } -} - -impl<N: Clone, E: Clone, Ty, Ix: Clone> Clone for Csr<N, E, Ty, Ix> { - fn clone(&self) -> Self { - Csr { - column: self.column.clone(), - edges: self.edges.clone(), - row: self.row.clone(), - node_weights: self.node_weights.clone(), - edge_count: self.edge_count, - ty: self.ty, - } - } -} - -impl<N, E, Ty, Ix> Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - /// Create an empty `Csr`. - pub fn new() -> Self { - Csr { - column: vec![], - edges: vec![], - row: vec![0; 1], - node_weights: vec![], - edge_count: 0, - ty: PhantomData, - } - } - - /// Create a new [`Csr`] with `n` nodes. `N` must implement [`Default`] for the weight of each node. - /// - /// [`Default`]: https://doc.rust-lang.org/nightly/core/default/trait.Default.html - /// [`Csr`]: #struct.Csr.html - /// - /// # Example - /// ```rust - /// use petgraph::csr::Csr; - /// use petgraph::prelude::*; - /// - /// # fn main() { - /// - /// let graph = Csr::<u8,()>::with_nodes(5); - /// assert_eq!(graph.node_count(),5); - /// assert_eq!(graph.edge_count(),0); - /// - /// assert_eq!(graph[0],0); - /// assert_eq!(graph[4],0); - /// # } - /// ``` - pub fn with_nodes(n: usize) -> Self - where N: Default, - { - Csr { - column: Vec::new(), - edges: Vec::new(), - row: vec![0; n + 1], - node_weights: (0..n).map(|_| N::default()).collect(), - edge_count: 0, - ty: PhantomData, - } - } -} - -/// Csr creation error: edges were not in sorted order. -#[derive(Clone, Debug)] -pub struct EdgesNotSorted { - first_error: (usize, usize), -} - -impl<N, E, Ix> Csr<N, E, Directed, Ix> - where Ix: IndexType, -{ - - /// Create a new `Csr` from a sorted sequence of edges - /// - /// Edges **must** be sorted and unique, where the sort order is the default - /// order for the pair *(u, v)* in Rust (*u* has priority). - /// - /// Computes in **O(|E| + |V|)** time. - /// # Example - /// ```rust - /// use petgraph::csr::Csr; - /// use petgraph::prelude::*; - /// - /// # fn main() { - /// - /// let graph = Csr::<(),()>::from_sorted_edges(&[ - /// (0, 1), (0, 2), - /// (1, 0), (1, 2), (1, 3), - /// (2, 0), - /// (3, 1), - /// ]); - /// # } - /// ``` - pub fn from_sorted_edges<Edge>(edges: &[Edge]) -> Result<Self, EdgesNotSorted> - where Edge: Clone + IntoWeightedEdge<E, NodeId=NodeIndex<Ix>>, - N: Default, - { - let max_node_id = match edges.iter().map(|edge| - match edge.clone().into_weighted_edge() { - (x, y, _) => max(x.index(), y.index()) - }).max() { - None => return Ok(Self::with_nodes(0)), - Some(x) => x, - }; - let mut self_ = Self::with_nodes(max_node_id + 1); - let mut iter = edges.iter().cloned().peekable(); - { - let mut rows = self_.row.iter_mut(); - - let mut node = 0; - let mut rstart = 0; - let mut last_target; - 'outer: for r in &mut rows { - *r = rstart; - last_target = None; - 'inner: loop { - if let Some(edge) = iter.peek() { - let (n, m, weight) = edge.clone().into_weighted_edge(); - // check that the edges are in increasing sequence - if node > n.index() { - return Err(EdgesNotSorted { - first_error: (n.index(), m.index()), - }); - } - /* - debug_assert!(node <= n.index(), - concat!("edges are not sorted, ", - "failed assertion source {:?} <= {:?} ", - "for edge {:?}"), - node, n, (n, m)); - */ - if n.index() != node { - break 'inner; - } - // check that the edges are in increasing sequence - /* - debug_assert!(last_target.map_or(true, |x| m > x), - "edges are not sorted, failed assertion {:?} < {:?}", - last_target, m); - */ - if !last_target.map_or(true, |x| m > x) { - return Err(EdgesNotSorted { - first_error: (n.index(), m.index()), - }); - } - last_target = Some(m); - self_.column.push(m); - self_.edges.push(weight); - rstart += 1; - } else { - break 'outer; - } - iter.next(); - } - node += 1; - } - for r in rows { - *r = rstart; - } - } - - Ok(self_) - } -} - -impl<N, E, Ty, Ix> Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - - pub fn node_count(&self) -> usize { - self.row.len() - 1 - } - - pub fn edge_count(&self) -> usize { - if self.is_directed() { - self.column.len() - } else { - self.edge_count - } - } - - pub fn is_directed(&self) -> bool { - Ty::is_directed() - } - - /// Remove all edges - pub fn clear_edges(&mut self) { - self.column.clear(); - self.edges.clear(); - for r in &mut self.row { - *r = 0; - } - if !self.is_directed() { - self.edge_count = 0; - } - } - - /// Adds a new node with the given weight, returning the corresponding node index. - pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix> { - let i = self.row.len() - 1; - self.row.insert(i, 0); - self.node_weights.insert(i, weight); - Ix::new(i) - } - - /// Return `true` if the edge was added - /// - /// If you add all edges in row-major order, the time complexity - /// is **O(|V|·|E|)** for the whole operation. - /// - /// **Panics** if `a` or `b` are out of bounds. - pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> bool - where E: Clone, - { - let ret = self.add_edge_(a, b, weight.clone()); - if ret && !self.is_directed() { - self.edge_count += 1; - } - if ret && !self.is_directed() && a != b { - let _ret2 = self.add_edge_(b, a, weight); - debug_assert_eq!(ret, _ret2); - } - ret - } - - // Return false if the edge already exists - fn add_edge_(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> bool { - assert!(a.index() < self.node_count() && b.index() < self.node_count()); - // a x b is at (a, b) in the matrix - - // find current range of edges from a - let pos = match self.find_edge_pos(a, b) { - Ok(_) => return false, /* already exists */ - Err(i) => i, - }; - self.column.insert(pos, b); - self.edges.insert(pos, weight); - // update row vector - for r in &mut self.row[a.index() + 1..] { - *r += 1; - } - true - } - - fn find_edge_pos(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Result<usize, usize> { - let (index, neighbors) = self.neighbors_of(a); - if neighbors.len() < BINARY_SEARCH_CUTOFF { - for (i, elt) in neighbors.iter().enumerate() { - if b == *elt { - return Ok(i + index); - } else if *elt > b { - return Err(i + index); - } - } - Err(neighbors.len() + index) - } else { - match neighbors.binary_search(&b) { - Ok(i) => Ok(i + index), - Err(i) => Err(i + index), - } - } - } - - /// Computes in **O(log |V|)** time. - /// - /// **Panics** if the node `a` does not exist. - pub fn contains_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool { - self.find_edge_pos(a, b).is_ok() - } - - fn neighbors_range(&self, a: NodeIndex<Ix>) -> Range<usize> { - let index = self.row[a.index()]; - let end = self.row.get(a.index() + 1).cloned().unwrap_or_else(|| self.column.len()); - index..end - } - - fn neighbors_of(&self, a: NodeIndex<Ix>) -> (usize, &[Ix]) { - let r = self.neighbors_range(a); - (r.start, &self.column[r]) - } - - /// Computes in **O(1)** time. - /// - /// **Panics** if the node `a` does not exist. - pub fn out_degree(&self, a: NodeIndex<Ix>) -> usize { - let r = self.neighbors_range(a); - r.end - r.start - } - - /// Computes in **O(1)** time. - /// - /// **Panics** if the node `a` does not exist. - pub fn neighbors_slice(&self, a: NodeIndex<Ix>) -> &[NodeIndex<Ix>] { - self.neighbors_of(a).1 - } - - /// Computes in **O(1)** time. - /// - /// **Panics** if the node `a` does not exist. - pub fn edges_slice(&self, a: NodeIndex<Ix>) -> &[E] { - &self.edges[self.neighbors_range(a)] - } - - /// Return an iterator of all edges of `a`. - /// - /// - `Directed`: Outgoing edges from `a`. - /// - `Undirected`: All edges connected to `a`. - /// - /// **Panics** if the node `a` does not exist.<br> - /// Iterator element type is `EdgeReference<E, Ty, Ix>`. - pub fn edges(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> { - let r = self.neighbors_range(a); - Edges { - index: r.start, - source: a, - iter: zip(&self.column[r.clone()], &self.edges[r]), - ty: self.ty, - } - } -} - -#[derive(Clone, Debug)] -pub struct Edges<'a, E: 'a, Ty = Directed, Ix: 'a = DefaultIx> { - index: usize, - source: NodeIndex<Ix>, - iter: Zip<SliceIter<'a, NodeIndex<Ix>>, SliceIter<'a, E>>, - ty: PhantomData<Ty>, -} - -#[derive(Debug)] -pub struct EdgeReference<'a, E: 'a, Ty, Ix: 'a = DefaultIx> { - index: EdgeIndex, - source: NodeIndex<Ix>, - target: NodeIndex<Ix>, - weight: &'a E, - ty: PhantomData<Ty>, -} - -impl<'a, E, Ty, Ix: Copy> Clone for EdgeReference<'a, E, Ty, Ix> { - fn clone(&self) -> Self { - *self - } -} - -impl<'a, E, Ty, Ix: Copy> Copy for EdgeReference<'a, E, Ty, Ix> { } - -impl<'a, Ty, E, Ix> EdgeReference<'a, E, Ty, Ix> - where Ty: EdgeType, -{ - /// Access the edge’s weight. - /// - /// **NOTE** that this method offers a longer lifetime - /// than the trait (unfortunately they don't match yet). - pub fn weight(&self) -> &'a E { self.weight } -} - -impl<'a, E, Ty, Ix> EdgeRef for EdgeReference<'a, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NodeId = NodeIndex<Ix>; - type EdgeId = EdgeIndex; - type Weight = E; - - fn source(&self) -> Self::NodeId { self.source } - fn target(&self) -> Self::NodeId { self.target } - fn weight(&self) -> &E { self.weight } - fn id(&self) -> Self::EdgeId { self.index } -} - -impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Item = EdgeReference<'a, E, Ty, Ix>; - fn next(&mut self) -> Option<Self::Item> { - self.iter.next().map(move |(&j, w)| { - let index = self.index; - self.index += 1; - EdgeReference { - index: index, - source: self.source, - target: j, - weight: w, - ty: PhantomData, - } - }) - } -} - -impl<N, E, Ty, Ix> Data for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NodeWeight = N; - type EdgeWeight = E; -} - -impl<'a, N, E, Ty, Ix> IntoEdgeReferences for &'a Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type EdgeRef = EdgeReference<'a, E, Ty, Ix>; - type EdgeReferences = EdgeReferences<'a, E, Ty, Ix>; - fn edge_references(self) -> Self::EdgeReferences { - EdgeReferences { - index: 0, - source_index: Ix::new(0), - edge_ranges: self.row.windows(2).enumerate(), - column: &self.column, - edges: &self.edges, - iter: zip(&[], &[]), - ty: self.ty, - } - } -} - -pub struct EdgeReferences<'a, E: 'a, Ty, Ix: 'a> { - source_index: NodeIndex<Ix>, - index: usize, - edge_ranges: Enumerate<Windows<'a, usize>>, - column: &'a [NodeIndex<Ix>], - edges: &'a [E], - iter: Zip<SliceIter<'a, NodeIndex<Ix>>, SliceIter<'a, E>>, - ty: PhantomData<Ty>, -} - -impl<'a, E, Ty, Ix> Iterator for EdgeReferences<'a, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Item = EdgeReference<'a, E, Ty, Ix>; - fn next(&mut self) -> Option<Self::Item> { - loop { - if let Some((&j, w)) = self.iter.next() { - let index = self.index; - self.index += 1; - return Some(EdgeReference { - index: index, - source: self.source_index, - target: j, - weight: w, - ty: PhantomData, - }) - } - if let Some((i, w)) = self.edge_ranges.next() { - let a = w[0]; - let b = w[1]; - self.iter = zip(&self.column[a..b], &self.edges[a..b]); - self.source_index = Ix::new(i); - } else { - return None; - } - } - } -} - -impl<'a, N, E, Ty, Ix> IntoEdges for &'a Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Edges = Edges<'a, E, Ty, Ix>; - fn edges(self, a: Self::NodeId) -> Self::Edges { - self.edges(a) - } -} - -impl<N, E, Ty, Ix> GraphBase for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NodeId = NodeIndex<Ix>; - type EdgeId = EdgeIndex; // index into edges vector -} - -use fixedbitset::FixedBitSet; - -impl<N, E, Ty, Ix> Visitable for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Map = FixedBitSet; - fn visit_map(&self) -> FixedBitSet { - FixedBitSet::with_capacity(self.node_count()) - } - fn reset_map(&self, map: &mut Self::Map) { - map.clear(); - map.grow(self.node_count()); - } -} - -use std::slice::Iter as SliceIter; - -#[derive(Clone, Debug)] -pub struct Neighbors<'a, Ix: 'a = DefaultIx> { - iter: SliceIter<'a, NodeIndex<Ix>>, -} - -impl<'a, Ix> Iterator for Neighbors<'a, Ix> - where Ix: IndexType, -{ - type Item = NodeIndex<Ix>; - - fn next(&mut self) -> Option<Self::Item> { - self.iter.next().cloned() - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } -} - -impl<'a, N, E, Ty, Ix> IntoNeighbors for &'a Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Neighbors = Neighbors<'a, Ix>; - - /// Return an iterator of all neighbors of `a`. - /// - /// - `Directed`: Targets of outgoing edges from `a`. - /// - `Undirected`: Opposing endpoints of all edges connected to `a`. - /// - /// **Panics** if the node `a` does not exist.<br> - /// Iterator element type is `NodeIndex<Ix>`. - fn neighbors(self, a: Self::NodeId) -> Self::Neighbors { - Neighbors { - iter: self.neighbors_slice(a).iter(), - } - } -} - -impl<N, E, Ty, Ix> NodeIndexable for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn node_bound(&self) -> usize { self.node_count() } - fn to_index(&self, a: Self::NodeId) -> usize { a.index() } - fn from_index(&self, ix: usize) -> Self::NodeId { Ix::new(ix) } -} - -impl<N, E, Ty, Ix> NodeCompactIndexable for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ -} - -impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Output = N; - - fn index(&self, ix: NodeIndex<Ix>) -> &N { - &self.node_weights[ix.index()] - } -} - -impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn index_mut(&mut self, ix: NodeIndex<Ix>) -> &mut N { - &mut self.node_weights[ix.index()] - } -} - -pub struct NodeIdentifiers<Ix = DefaultIx> { - r: Range<usize>, - ty: PhantomData<Ix>, -} - -impl<Ix> Iterator for NodeIdentifiers<Ix> - where Ix: IndexType, -{ - type Item = NodeIndex<Ix>; - - fn next(&mut self) -> Option<Self::Item> { - self.r.next().map(Ix::new) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.r.size_hint() - } -} - -impl<'a, N, E, Ty, Ix> IntoNodeIdentifiers for &'a Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NodeIdentifiers = NodeIdentifiers<Ix>; - fn node_identifiers(self) -> Self::NodeIdentifiers { - NodeIdentifiers { - r: 0..self.node_count(), - ty: PhantomData, - } - } -} - -impl<N, E, Ty, Ix> NodeCount for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn node_count(&self) -> usize { - (*self).node_count() - } -} - -impl<N, E, Ty, Ix> GraphProp for Csr<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type EdgeType = Ty; -} - -/* - * -Example - -[ a 0 b - c d e - 0 0 f ] - -Values: [a, b, c, d, e, f] -Column: [0, 2, 0, 1, 2, 2] -Row : [0, 2, 5] <- value index of row start - - * */ - -#[cfg(test)] -mod tests { - use super::Csr; - use Undirected; - use visit::Dfs; - use visit::VisitMap; - use algo::tarjan_scc; - use algo::bellman_ford; - - #[test] - fn csr1() { - let mut m: Csr = Csr::with_nodes(3); - m.add_edge(0, 0, ()); - m.add_edge(1, 2, ()); - m.add_edge(2, 2, ()); - m.add_edge(0, 2, ()); - m.add_edge(1, 0, ()); - m.add_edge(1, 1, ()); - println!("{:?}", m); - assert_eq!(&m.column, &[0, 2, 0, 1, 2, 2]); - assert_eq!(&m.row, &[0, 2, 5, 6]); - - let added = m.add_edge(1, 2, ()); - assert!(!added); - assert_eq!(&m.column, &[0, 2, 0, 1, 2, 2]); - assert_eq!(&m.row, &[0, 2, 5, 6]); - - assert_eq!(m.neighbors_slice(1), &[0, 1, 2]); - assert_eq!(m.node_count(), 3); - assert_eq!(m.edge_count(), 6); - } - - #[test] - fn csr_undirected() { - /* - [ 1 . 1 - . . 1 - 1 1 1 ] - */ - - let mut m: Csr<(), (), Undirected> = Csr::with_nodes(3); - m.add_edge(0, 0, ()); - m.add_edge(0, 2, ()); - m.add_edge(1, 2, ()); - m.add_edge(2, 2, ()); - println!("{:?}", m); - assert_eq!(&m.column, &[0, 2, 2, 0, 1, 2]); - assert_eq!(&m.row, &[0, 2, 3, 6]); - assert_eq!(m.node_count(), 3); - assert_eq!(m.edge_count(), 4); - } - - #[should_panic] - #[test] - fn csr_from_error_1() { - // not sorted in source - let m: Csr = Csr::from_sorted_edges(&[ - (0, 1), - (1, 0), - (0, 2), - ]).unwrap(); - println!("{:?}", m); - } - - #[should_panic] - #[test] - fn csr_from_error_2() { - // not sorted in target - let m: Csr = Csr::from_sorted_edges(&[ - (0, 1), - (1, 0), - (1, 2), - (1, 1), - ]).unwrap(); - println!("{:?}", m); - } - - #[test] - fn csr_from() { - let m: Csr = Csr::from_sorted_edges(&[ - (0, 1), - (0, 2), - (1, 0), - (1, 1), - (2, 2), - (2, 4), - ]).unwrap(); - println!("{:?}", m); - assert_eq!(m.neighbors_slice(0), &[1, 2]); - assert_eq!(m.neighbors_slice(1), &[0, 1]); - assert_eq!(m.neighbors_slice(2), &[2, 4]); - assert_eq!(m.node_count(), 5); - assert_eq!(m.edge_count(), 6); - } - - #[test] - fn csr_dfs() { - let mut m: Csr = Csr::from_sorted_edges(&[ - (0, 1), - (0, 2), - (1, 0), - (1, 1), - (1, 3), - (2, 2), - - // disconnected subgraph - (4, 4), - (4, 5), - ]).unwrap(); - println!("{:?}", m); - let mut dfs = Dfs::new(&m, 0); - while let Some(_) = dfs.next(&m) { - } - for i in 0..m.node_count() - 2 { - assert!(dfs.discovered.is_visited(&i), "visited {}", i) - } - assert!(!dfs.discovered[4]); - assert!(!dfs.discovered[5]); - - m.add_edge(1, 4, ()); - println!("{:?}", m); - - dfs.reset(&m); - dfs.move_to(0); - while let Some(_) = dfs.next(&m) { - } - - for i in 0..m.node_count() { - assert!(dfs.discovered[i], "visited {}", i) - } - } - - #[test] - fn csr_tarjan() { - let m: Csr = Csr::from_sorted_edges(&[ - (0, 1), - (0, 2), - (1, 0), - (1, 1), - (1, 3), - (2, 2), - (2, 4), - (4, 4), - (4, 5), - (5, 2), - ]).unwrap(); - println!("{:?}", m); - println!("{:?}", tarjan_scc(&m)); - } - - #[test] - fn test_bellman_ford() { - let m: Csr<(), _> = Csr::from_sorted_edges(&[ - (0, 1, 0.5), - (0, 2, 2.), - (1, 0, 1.), - (1, 1, 1.), - (1, 2, 1.), - (1, 3, 1.), - (2, 3, 3.), - - (4, 5, 1.), - (5, 7, 2.), - (6, 7, 1.), - (7, 8, 3.), - ]).unwrap(); - println!("{:?}", m); - let result = bellman_ford(&m, 0).unwrap(); - println!("{:?}", result); - let answer = [0., 0.5, 1.5, 1.5]; - assert_eq!(&answer, &result.0[..4]); - assert!(answer[4..].iter().all(|&x| f64::is_infinite(x))); - } - - #[test] - fn test_bellman_ford_neg_cycle() { - let m: Csr<(), _> = Csr::from_sorted_edges(&[ - (0, 1, 0.5), - (0, 2, 2.), - (1, 0, 1.), - (1, 1, -1.), - (1, 2, 1.), - (1, 3, 1.), - (2, 3, 3.), - ]).unwrap(); - let result = bellman_ford(&m, 0); - assert!(result.is_err()); - } - - #[test] - fn test_edge_references() { - use visit::EdgeRef; - use visit::IntoEdgeReferences; - let m: Csr<(), _> = Csr::from_sorted_edges(&[ - (0, 1, 0.5), - (0, 2, 2.), - (1, 0, 1.), - (1, 1, 1.), - (1, 2, 1.), - (1, 3, 1.), - (2, 3, 3.), - - (4, 5, 1.), - (5, 7, 2.), - (6, 7, 1.), - (7, 8, 3.), - ]).unwrap(); - let mut copy = Vec::new(); - for e in m.edge_references() { - copy.push((e.source(), e.target(), *e.weight())); - println!("{:?}", e); - } - let m2: Csr<(), _> = Csr::from_sorted_edges(©).unwrap(); - assert_eq!(&m.row, &m2.row); - assert_eq!(&m.column, &m2.column); - assert_eq!(&m.edges, &m2.edges); - } - - #[test] - fn test_add_node() { - let mut g: Csr = Csr::new(); - let a = g.add_node(()); - let b = g.add_node(()); - let c = g.add_node(()); - - assert!(g.add_edge(a, b, ())); - assert!(g.add_edge(b, c, ())); - assert!(g.add_edge(c, a, ())); - - println!("{:?}", g); - - assert_eq!(g.node_count(), 3); - - assert_eq!(g.neighbors_slice(a), &[b]); - assert_eq!(g.neighbors_slice(b), &[c]); - assert_eq!(g.neighbors_slice(c), &[a]); - - assert_eq!(g.edge_count(), 3); - } -} diff --git a/vendor/petgraph/src/data.rs b/vendor/petgraph/src/data.rs deleted file mode 100644 index 150946198e..0000000000 --- a/vendor/petgraph/src/data.rs +++ /dev/null @@ -1,435 +0,0 @@ -//! Graph traits for associated data and graph construction. - - -use Graph; -#[cfg(feature = "stable_graph")] -use stable_graph::StableGraph; -use ::{ - EdgeType, -}; -use graph::IndexType; -#[cfg(feature = "graphmap")] -use graphmap::{GraphMap, NodeTrait}; -use visit::{ - Data, - NodeCount, - NodeIndexable, - Reversed, -}; - -trait_template!{ - /// Access node and edge weights (associated data). -pub trait DataMap : Data { - @section self - fn node_weight(self: &Self, id: Self::NodeId) -> Option<&Self::NodeWeight>; - fn edge_weight(self: &Self, id: Self::EdgeId) -> Option<&Self::EdgeWeight>; -} -} - -macro_rules! access0 { - ($e:expr) => ($e.0); -} - -DataMap!{delegate_impl []} -DataMap!{delegate_impl [['a, G], G, &'a mut G, deref_twice]} -DataMap!{delegate_impl [[G], G, Reversed<G>, access0]} - -trait_template! { - /// Access node and edge weights mutably. -pub trait DataMapMut : DataMap { - @section self - fn node_weight_mut(self: &mut Self, id: Self::NodeId) -> Option<&mut Self::NodeWeight>; - fn edge_weight_mut(self: &mut Self, id: Self::EdgeId) -> Option<&mut Self::EdgeWeight>; -} -} - -DataMapMut!{delegate_impl [['a, G], G, &'a mut G, deref_twice]} -DataMapMut!{delegate_impl [[G], G, Reversed<G>, access0]} - -/// A graph that can be extended with further nodes and edges -pub trait Build : Data + NodeCount { - fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId; - /// Add a new edge. If parallel edges (duplicate) are not allowed and - /// the edge already exists, return `None`. - fn add_edge(&mut self, - a: Self::NodeId, - b: Self::NodeId, - weight: Self::EdgeWeight) -> Option<Self::EdgeId> { - Some(self.update_edge(a, b, weight)) - } - /// Add or update the edge from `a` to `b`. Return the id of the affected - /// edge. - fn update_edge(&mut self, - a: Self::NodeId, - b: Self::NodeId, - weight: Self::EdgeWeight) -> Self::EdgeId; -} - -/// A graph that can be created -pub trait Create : Build + Default { - fn with_capacity(nodes: usize, edges: usize) -> Self; -} - -impl<N, E, Ty, Ix> Data for Graph<N, E, Ty, Ix> - where Ix: IndexType -{ - type NodeWeight = N; - type EdgeWeight = E; -} - -impl<N, E, Ty, Ix> DataMap for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType -{ - fn node_weight(&self, id: Self::NodeId) -> Option<&Self::NodeWeight> { - self.node_weight(id) - } - fn edge_weight(&self, id: Self::EdgeId) -> Option<&Self::EdgeWeight> { - self.edge_weight(id) - } -} - -impl<N, E, Ty, Ix> DataMapMut for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType -{ - fn node_weight_mut(&mut self, id: Self::NodeId) -> Option<&mut Self::NodeWeight> { - self.node_weight_mut(id) - } - fn edge_weight_mut(&mut self, id: Self::EdgeId) -> Option<&mut Self::EdgeWeight> { - self.edge_weight_mut(id) - } -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> DataMap for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType -{ - fn node_weight(&self, id: Self::NodeId) -> Option<&Self::NodeWeight> { - self.node_weight(id) - } - fn edge_weight(&self, id: Self::EdgeId) -> Option<&Self::EdgeWeight> { - self.edge_weight(id) - } -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> DataMapMut for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType -{ - fn node_weight_mut(&mut self, id: Self::NodeId) -> Option<&mut Self::NodeWeight> { - self.node_weight_mut(id) - } - fn edge_weight_mut(&mut self, id: Self::EdgeId) -> Option<&mut Self::EdgeWeight> { - self.edge_weight_mut(id) - } -} - -impl<N, E, Ty, Ix> Build for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId { - self.add_node(weight) - } - fn add_edge(&mut self, - a: Self::NodeId, - b: Self::NodeId, - weight: Self::EdgeWeight) -> Option<Self::EdgeId> - { - Some(self.add_edge(a, b, weight)) - } - fn update_edge(&mut self, - a: Self::NodeId, - b: Self::NodeId, - weight: Self::EdgeWeight) -> Self::EdgeId - { - self.update_edge(a, b, weight) - } -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> Build for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId { - self.add_node(weight) - } - fn add_edge(&mut self, - a: Self::NodeId, - b: Self::NodeId, - weight: Self::EdgeWeight) -> Option<Self::EdgeId> - { - Some(self.add_edge(a, b, weight)) - } - fn update_edge(&mut self, - a: Self::NodeId, - b: Self::NodeId, - weight: Self::EdgeWeight) -> Self::EdgeId - { - self.update_edge(a, b, weight) - } -} - -#[cfg(feature = "graphmap")] -impl<N, E, Ty> Build for GraphMap<N, E, Ty> - where Ty: EdgeType, - N: NodeTrait, -{ - fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId { - self.add_node(weight) - } - fn add_edge(&mut self, - a: Self::NodeId, - b: Self::NodeId, - weight: Self::EdgeWeight) -> Option<Self::EdgeId> - { - if self.contains_edge(a, b) { - None - } else { - let r = self.add_edge(a, b, weight); - debug_assert!(r.is_none()); - Some((a, b)) - } - } - fn update_edge(&mut self, - a: Self::NodeId, - b: Self::NodeId, - weight: Self::EdgeWeight) -> Self::EdgeId - { - self.add_edge(a, b, weight); - (a, b) - } -} - - -impl<N, E, Ty, Ix> Create for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn with_capacity(nodes: usize, edges: usize) -> Self { - Self::with_capacity(nodes, edges) - } -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> Create for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn with_capacity(nodes: usize, edges: usize) -> Self { - Self::with_capacity(nodes, edges) - } -} - -#[cfg(feature = "graphmap")] -impl<N, E, Ty> Create for GraphMap<N, E, Ty> - where Ty: EdgeType, - N: NodeTrait, -{ - fn with_capacity(nodes: usize, edges: usize) -> Self { - Self::with_capacity(nodes, edges) - } -} - -/// A graph element. -/// -/// A sequence of Elements, for example an iterator, is laid out as follows: -/// Nodes are implicitly given the index of their appearance in the sequence. -/// The edges’ source and target fields refer to these indices. -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum Element<N, E> { - /// A graph node. - Node { - weight: N, - }, - /// A graph edge. - Edge { - source: usize, - target: usize, - weight: E, - } -} - -/// Create a graph from an iterator of elements. -pub trait FromElements : Create { - fn from_elements<I>(iterable: I) -> Self - where Self: Sized, - I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>, - { - let mut gr = Self::with_capacity(0, 0); - // usize -> NodeId map - let mut map = Vec::new(); - for element in iterable { - match element { - Element::Node { weight } => { - map.push(gr.add_node(weight)); - } - Element::Edge { source, target, weight } => { - gr.add_edge(map[source], map[target], weight); - } - } - } - gr - } - -} - -fn from_elements_indexable<G, I>(iterable: I) -> G - where G: Create + NodeIndexable, - I: IntoIterator<Item=Element<G::NodeWeight, G::EdgeWeight>>, -{ - let mut gr = G::with_capacity(0, 0); - let map = |gr: &G, i| gr.from_index(i); - for element in iterable { - match element { - Element::Node { weight } => { - gr.add_node(weight); - } - Element::Edge { source, target, weight } => { - let from = map(&gr, source); - let to = map(&gr, target); - gr.add_edge(from, to, weight); - } - } - } - gr -} - -impl<N, E, Ty, Ix> FromElements for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn from_elements<I>(iterable: I) -> Self - where Self: Sized, - I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>, - { - from_elements_indexable(iterable) - } -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> FromElements for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn from_elements<I>(iterable: I) -> Self - where Self: Sized, - I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>, - { - from_elements_indexable(iterable) - } -} - -#[cfg(feature = "graphmap")] -impl<N, E, Ty> FromElements for GraphMap<N, E, Ty> - where Ty: EdgeType, - N: NodeTrait, -{ - fn from_elements<I>(iterable: I) -> Self - where Self: Sized, - I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>, - { - from_elements_indexable(iterable) - } -} - -/// Iterator adaptors for iterators of `Element`. -pub trait ElementIterator<N, E> : Iterator<Item=Element<N, E>> { - /// Create an iterator adaptor that filters graph elements. - /// - /// The function `f` is called with each element and if its return value - /// is `true` the element is accepted and if `false` it is removed. - /// `f` is called with mutable references to the node and edge weights, - /// so that they can be mutated (but the edge endpoints can not). - /// - /// This filter adapts the edge source and target indices in the - /// stream so that they are correct after the removals. - fn filter_elements<F>(self, f: F) -> FilterElements<Self, F> - where Self: Sized, - F: FnMut(Element<&mut N, &mut E>) -> bool, - { - FilterElements { - iter: self, - node_index: 0, - map: Vec::new(), - f: f, - } - } -} - -impl<N, E, I: ?Sized> ElementIterator<N, E> for I - where I: Iterator<Item=Element<N, E>> { } - -/// An iterator that filters graph elements. -/// -/// See [`.filter_elements()`][1] for more information. -/// -/// [1]: trait.ElementIterator.html#method.filter_elements -pub struct FilterElements<I, F> { - iter: I, - node_index: usize, - map: Vec<usize>, - f: F, -} - -impl<I, F, N, E> Iterator for FilterElements<I, F> - where I: Iterator<Item=Element<N, E>>, - F: FnMut(Element<&mut N, &mut E>) -> bool, -{ - type Item = Element<N, E>; - - fn next(&mut self) -> Option<Self::Item> { - loop { - let mut elt = match self.iter.next() { - None => return None, - Some(elt) => elt, - }; - let keep = (self.f)(match elt { - Element::Node { ref mut weight } => Element::Node { weight: weight }, - Element::Edge { source, target, ref mut weight } - => Element::Edge { source: source, target: target, weight: weight }, - }); - let is_node = if let Element::Node { .. } = elt { true } else { false }; - if !keep && is_node { - self.map.push(self.node_index); - } - if is_node { - self.node_index += 1; - } - if !keep { - continue; - } - - // map edge parts - match elt { - Element::Edge { - ref mut source, - ref mut target, - .. - } => { - // Find the node indices in the map of removed ones. - // If a node was removed, the edge is as well. - // Otherwise the counts are adjusted by the number of nodes - // removed. - // Example: map: [1, 3, 4, 6] - // binary search for 2, result is Err(1). One node has been - // removed before 2. - match self.map.binary_search(source) { - Ok(_) => continue, - Err(i) => *source -= i, - } - match self.map.binary_search(target) { - Ok(_) => continue, - Err(i) => *target -= i, - } - } - Element::Node { .. } => { } - } - return Some(elt); - } - } -} diff --git a/vendor/petgraph/src/dijkstra.rs b/vendor/petgraph/src/dijkstra.rs deleted file mode 100644 index fe9c4018e3..0000000000 --- a/vendor/petgraph/src/dijkstra.rs +++ /dev/null @@ -1,79 +0,0 @@ -use std::collections::{ - HashMap, - BinaryHeap, -}; -use std::collections::hash_map::Entry::{ - Occupied, - Vacant, -}; - -use std::hash::Hash; - -use scored::MinScored; -use super::visit::{ - Visitable, - VisitMap, - IntoEdges, - EdgeRef, -}; -use algo::Measure; - -/// [Generic] Dijkstra's shortest path algorithm. -/// -/// Compute the length of the shortest path from `start` to every reachable -/// node. -/// -/// The graph should be `Visitable` and implement `IntoEdges`. The function -/// `edge_cost` should return the cost for a particular edge, which is used -/// to compute path costs. Edge costs must be non-negative. -/// -/// If `goal` is not `None`, then the algorithm terminates once the `goal` node's -/// cost is calculated. -/// -/// Returns a `HashMap` that maps `NodeId` to path cost. -pub fn dijkstra<G, F, K>(graph: G, start: G::NodeId, goal: Option<G::NodeId>, - mut edge_cost: F) - -> HashMap<G::NodeId, K> - where G: IntoEdges + Visitable, - G::NodeId: Eq + Hash, - F: FnMut(G::EdgeRef) -> K, - K: Measure + Copy, -{ - let mut visited = graph.visit_map(); - let mut scores = HashMap::new(); - //let mut predecessor = HashMap::new(); - let mut visit_next = BinaryHeap::new(); - let zero_score = K::default(); - scores.insert(start, zero_score); - visit_next.push(MinScored(zero_score, start)); - while let Some(MinScored(node_score, node)) = visit_next.pop() { - if visited.is_visited(&node) { - continue - } - if goal.as_ref() == Some(&node) { - break - } - for edge in graph.edges(node) { - let next = edge.target(); - if visited.is_visited(&next) { - continue - } - let mut next_score = node_score + edge_cost(edge); - match scores.entry(next) { - Occupied(ent) => if next_score < *ent.get() { - *ent.into_mut() = next_score; - //predecessor.insert(next.clone(), node.clone()); - } else { - next_score = *ent.get(); - }, - Vacant(ent) => { - ent.insert(next_score); - //predecessor.insert(next.clone(), node.clone()); - } - } - visit_next.push(MinScored(next_score, next)); - } - visited.visit(node); - } - scores -} diff --git a/vendor/petgraph/src/dot.rs b/vendor/petgraph/src/dot.rs deleted file mode 100644 index fbd78fb73b..0000000000 --- a/vendor/petgraph/src/dot.rs +++ /dev/null @@ -1,207 +0,0 @@ -//! Simple graphviz dot file format output. - -use std::fmt::{self, Display, Write}; - -use visit::{GraphRef}; - -/// `Dot` implements output to graphviz .dot format for a graph. -/// -/// Formatting and options are rather simple, this is mostly intended -/// for debugging. Exact output may change. -/// -/// # Examples -/// -/// ``` -/// use petgraph::Graph; -/// use petgraph::dot::{Dot, Config}; -/// -/// let mut graph = Graph::<_, ()>::new(); -/// graph.add_node("A"); -/// graph.add_node("B"); -/// graph.add_node("C"); -/// graph.add_node("D"); -/// graph.extend_with_edges(&[ -/// (0, 1), (0, 2), (0, 3), -/// (1, 2), (1, 3), -/// (2, 3), -/// ]); -/// -/// println!("{:?}", Dot::with_config(&graph, &[Config::EdgeNoLabel])); -/// -/// // In this case the output looks like this: -/// // -/// // digraph { -/// // 0 [label="\"A\""] -/// // 1 [label="\"B\""] -/// // 2 [label="\"C\""] -/// // 3 [label="\"D\""] -/// // 0 -> 1 -/// // 0 -> 2 -/// // 0 -> 3 -/// // 1 -> 2 -/// // 1 -> 3 -/// // 2 -> 3 -/// // } -/// -/// // If you need multiple config options, just list them all in the slice. -/// ``` -pub struct Dot<'a, G> { - graph: G, - config: &'a [Config], -} - -static TYPE: [&'static str; 2] = ["graph", "digraph"]; -static EDGE: [&'static str; 2] = ["--", "->"]; -static INDENT: &'static str = " "; - -impl<'a, G> Dot<'a, G> where G: GraphRef { - /// Create a `Dot` formatting wrapper with default configuration. - pub fn new(graph: G) -> Self { - Self::with_config(graph, &[]) - } - - /// Create a `Dot` formatting wrapper with custom configuration. - pub fn with_config(graph: G, config: &'a [Config]) -> Self { - Dot { - graph: graph, - config: config, - } - } -} - -/// `Dot` configuration. -/// -/// This enum does not have an exhaustive definition (will be expanded) -#[derive(Debug, PartialEq, Eq)] -pub enum Config { - /// Use indices for node labels. - NodeIndexLabel, - /// Use indices for edge labels. - EdgeIndexLabel, - /// Use no edge labels. - EdgeNoLabel, - #[doc(hidden)] - _Incomplete(()), -} - -use visit::{ IntoNodeReferences, NodeIndexable, IntoEdgeReferences, EdgeRef}; -use visit::{ Data, NodeRef, GraphProp, }; - -impl<'a, G> Dot<'a, G> -{ - fn graph_fmt<NF, EF, NW, EW>(&self, g: G, f: &mut fmt::Formatter, - mut node_fmt: NF, mut edge_fmt: EF) -> fmt::Result - where G: NodeIndexable + IntoNodeReferences + IntoEdgeReferences, - G: GraphProp, - G: Data<NodeWeight=NW, EdgeWeight=EW>, - NF: FnMut(&NW, &mut FnMut(&Display) -> fmt::Result) -> fmt::Result, - EF: FnMut(&EW, &mut FnMut(&Display) -> fmt::Result) -> fmt::Result, - { - try!(writeln!(f, "{} {{", TYPE[g.is_directed() as usize])); - - // output all labels - for node in g.node_references() { - try!(write!(f, "{}{}", INDENT, g.to_index(node.id()))); - if self.config.contains(&Config::NodeIndexLabel) { - try!(writeln!(f, "")); - } else { - try!(write!(f, " [label=\"")); - try!(node_fmt(node.weight(), &mut |d| Escaped(d).fmt(f))); - try!(writeln!(f, "\"]")); - } - - } - // output all edges - for (i, edge) in g.edge_references().enumerate() { - try!(write!(f, "{}{} {} {}", - INDENT, - g.to_index(edge.source()), - EDGE[g.is_directed() as usize], - g.to_index(edge.target()))); - if self.config.contains(&Config::EdgeNoLabel) { - try!(writeln!(f, "")); - } else if self.config.contains(&Config::EdgeIndexLabel) { - try!(writeln!(f, " [label=\"{}\"]", i)); - } else { - try!(write!(f, " [label=\"")); - try!(edge_fmt(edge.weight(), &mut |d| Escaped(d).fmt(f))); - try!(writeln!(f, "\"]")); - } - } - - try!(writeln!(f, "}}")); - Ok(()) - } -} - -impl<'a, G> fmt::Display for Dot<'a, G> - where G: IntoEdgeReferences + IntoNodeReferences + NodeIndexable + GraphProp, - G::EdgeWeight: fmt::Display, - G::NodeWeight: fmt::Display, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.graph_fmt(self.graph, f, |n, cb| cb(n), |e, cb| cb(e)) - } -} - -impl<'a, G> fmt::Debug for Dot<'a, G> - where G: IntoEdgeReferences + IntoNodeReferences + NodeIndexable + GraphProp, - G::EdgeWeight: fmt::Debug, - G::NodeWeight: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.graph_fmt(self.graph, f, - |n, cb| cb(&DebugFmt(n)), - |e, cb| cb(&DebugFmt(e))) - } -} - -/// Escape for Graphviz -struct Escaper<W>(W); - -impl<W> fmt::Write for Escaper<W> - where W: fmt::Write -{ - fn write_str(&mut self, s: &str) -> fmt::Result { - for c in s.chars() { - try!(self.write_char(c)); - } - Ok(()) - } - - fn write_char(&mut self, c: char) -> fmt::Result { - match c { - '"' => try!(self.0.write_char('\\')), - // \l is for left justified linebreak - '\n' => return self.0.write_str(r#"\l"#), - _ => { } - } - self.0.write_char(c) - } -} - -/// Pass Display formatting through a simple escaping filter -struct Escaped<T>(T); - -impl<T> fmt::Display for Escaped<T> - where T: fmt::Display -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - if f.alternate() { - write!(&mut Escaper(f), "{:#}\\l", &self.0) - } else { - write!(&mut Escaper(f), "{}", &self.0) - } - } -} - -/// Pass Debug formatting to Display -struct DebugFmt<T>(T); - -impl<T> fmt::Display for DebugFmt<T> - where T: fmt::Debug -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.0.fmt(f) - } -} diff --git a/vendor/petgraph/src/generate.rs b/vendor/petgraph/src/generate.rs deleted file mode 100644 index 65b1c652ee..0000000000 --- a/vendor/petgraph/src/generate.rs +++ /dev/null @@ -1,129 +0,0 @@ -//! ***Unstable.*** Graph generation. -//! -//! ***Unstable: API may change at any time.*** Depends on `feature = "generate"`. -//! - -use {Graph, Directed, EdgeType}; -use graph::NodeIndex; - -// A DAG has the property that the adjacency matrix is lower triangular, -// diagonal zero. -// -// This means we only allow edges i → j where i < j. -// -// The set of all DAG of a particular size is simply the power set of all -// possible edges. -// -// For a graph of n=3 nodes we have (n - 1) * n / 2 = 3 possible edges. - -/// A graph generator of “all” graphs of a particular size. -/// -/// ***Unstable: API may change at any time.*** Depends on `feature = "generate"`. -pub struct Generator<Ty> { - acyclic: bool, - selfloops: bool, - nodes: usize, - /// number of possible edges - nedges: usize, - /// current edge bitmap - bits: u64, - g: Graph<(), (), Ty>, -} - -impl Generator<Directed> { - /// Generate all possible Directed acyclic graphs (DAGs) of a particular number of vertices. - /// - /// These are only generated with one per isomorphism, so they use - /// one canonical node labeling where node *i* can only have edges to node *j* if *i < j*. - /// - /// For a graph of *k* vertices there are *e = (k - 1) k / 2* possible edges and - /// *2<sup>e</sup>* DAGs. - pub fn directed_acyclic(nodes: usize) -> Self { - assert!(nodes != 0); - let nedges = (nodes - 1) * nodes / 2; - assert!(nedges < 64); - Generator { - acyclic: true, - selfloops: false, - nodes: nodes, - nedges:nedges, - bits: !0, - g: Graph::with_capacity(nodes, nedges), - } - } -} - -impl<Ty: EdgeType> Generator<Ty> { - /// Generate all possible graphs of a particular number of vertices. - /// - /// All permutations are generated, so the graphs are not unique down to isomorphim. - /// - /// For a graph of *k* vertices there are *e = k²* possible edges and - /// *2<sup>k<sup>2</sup></sup>* graphs. - pub fn all(nodes: usize, allow_selfloops: bool) -> Self { - let scale = if Ty::is_directed() { 1 } else { 2 }; - let nedges = if allow_selfloops { - (nodes * nodes - nodes) / scale + nodes - } else { - (nodes * nodes) / scale - nodes - }; - assert!(nedges < 64); - Generator { - acyclic: false, - selfloops: allow_selfloops, - nodes: nodes, - nedges: nedges, - bits: !0, - g: Graph::with_capacity(nodes, nedges), - } - } - - fn state_to_graph(&mut self) -> &Graph<(), (), Ty> { - self.g.clear(); - for _ in 0..self.nodes { - self.g.add_node(()); - } - // For a DAG: - // interpret the bits in order, it's a lower triangular matrix: - // a b c d - // a x x x x - // b 0 x x x - // c 1 2 x x - // d 3 4 5 x - let mut bit = 0; - for i in 0..self.nodes { - let start = if self.acyclic || !self.g.is_directed() { i } else { 0 }; - for j in start..self.nodes { - if i == j && !self.selfloops { - continue; - } - if self.bits & (1u64 << bit) != 0 { - self.g.add_edge(NodeIndex::new(i), NodeIndex::new(j), ()); - } - - bit += 1; - } - } - &self.g - } - - pub fn next_ref(&mut self) -> Option<&Graph<(), (), Ty>> { - if self.bits == !0 { - self.bits = 0; - } else { - self.bits += 1; - if self.bits >= 1u64 << self.nedges { - return None; - } - } - Some(self.state_to_graph()) - } -} - -impl<Ty: EdgeType> Iterator for Generator<Ty> { - type Item = Graph<(), (), Ty>; - - fn next(&mut self) -> Option<Self::Item> { - self.next_ref().cloned() - } -} diff --git a/vendor/petgraph/src/graph_impl/frozen.rs b/vendor/petgraph/src/graph_impl/frozen.rs deleted file mode 100644 index 488cc55b73..0000000000 --- a/vendor/petgraph/src/graph_impl/frozen.rs +++ /dev/null @@ -1,85 +0,0 @@ - -use std::ops::{Deref, Index, IndexMut}; - -use graph::Graph; -use super::Frozen; -use graph::{IndexType, GraphIndex}; -use { - Direction, - EdgeType, -}; -use visit::{Data, IntoNodeIdentifiers, GraphProp, NodeIndexable, IntoNeighborsDirected}; -use visit::{IntoNeighbors, IntoNodeReferences, IntoEdgeReferences, Visitable}; -use visit::{NodeCompactIndexable, GetAdjacencyMatrix, NodeCount, IntoEdges, IntoEdgesDirected}; -use data::{DataMap, DataMapMut}; - - -impl<'a, G> Frozen<'a, G> { - /// Create a new `Frozen` from a mutable reference to a graph. - pub fn new(gr: &'a mut G) -> Self { - Frozen(gr) - } -} - -/// Deref allows transparent access to all shared reference (read-only) -/// functionality in the underlying graph. -impl<'a, G> Deref for Frozen<'a, G> { - type Target = G; - fn deref(&self) -> &G { self.0 } -} - -impl<'a, G, I> Index<I> for Frozen<'a, G> - where G: Index<I> -{ - type Output = G::Output; - fn index(&self, i: I) -> &G::Output { self.0.index(i) } -} - -impl<'a, G, I> IndexMut<I> for Frozen<'a, G> - where G: IndexMut<I> -{ - fn index_mut(&mut self, i: I) -> &mut G::Output { self.0.index_mut(i) } -} - -impl<'a, N, E, Ty, Ix> Frozen<'a, Graph<N, E, Ty, Ix>> - where Ty: EdgeType, - Ix: IndexType, -{ - /// Index the `Graph` by two indices, any combination of - /// node or edge indices is fine. - /// - /// **Panics** if the indices are equal or if they are out of bounds. - pub fn index_twice_mut<T, U>(&mut self, i: T, j: U) - -> (&mut <Graph<N, E, Ty, Ix> as Index<T>>::Output, - &mut <Graph<N, E, Ty, Ix> as Index<U>>::Output) - where Graph<N, E, Ty, Ix>: IndexMut<T> + IndexMut<U>, - T: GraphIndex, - U: GraphIndex, - { - self.0.index_twice_mut(i, j) - } -} - -macro_rules! access0 { - ($e:expr) => ($e.0); -} - -Data!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} -DataMap!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} -DataMapMut!{delegate_impl [['a, G], G, Frozen<'a, G>, access0]} -GetAdjacencyMatrix!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} -IntoEdgeReferences!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} -IntoEdges!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} -IntoEdgesDirected!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} -IntoNeighbors!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} -IntoNeighborsDirected!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} -IntoNodeIdentifiers!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} -IntoNodeReferences!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]} -NodeCompactIndexable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} -NodeCount!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} -NodeIndexable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} -GraphProp!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} -Visitable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]} - - - diff --git a/vendor/petgraph/src/graph_impl/mod.rs b/vendor/petgraph/src/graph_impl/mod.rs deleted file mode 100644 index dbedd359a8..0000000000 --- a/vendor/petgraph/src/graph_impl/mod.rs +++ /dev/null @@ -1,2035 +0,0 @@ -use std::cmp; -use std::fmt; -use std::hash::Hash; -use std::iter; -use std::marker::PhantomData; -use std::mem::size_of; -use std::ops::{Index, IndexMut, Range}; -use std::slice; - -use { - Direction, Outgoing, Incoming, - Undirected, - Directed, - EdgeType, - IntoWeightedEdge, -}; - -use iter_format::{ - IterFormatExt, - NoPretty, - DebugMap, -}; - -use visit::EdgeRef; -use visit::{IntoNodeReferences, IntoEdges, IntoEdgesDirected}; -use util::enumerate; - -#[cfg(feature = "serde-1")] -mod serialization; - - -/// The default integer type for graph indices. -/// `u32` is the default to reduce the size of the graph's data and improve -/// performance in the common case. -/// -/// Used for node and edge indices in `Graph` and `StableGraph`, used -/// for node indices in `Csr`. -pub type DefaultIx = u32; - -/// Trait for the unsigned integer type used for node and edge indices. -/// -/// Marked `unsafe` because: the trait must faithfully preseve -/// and convert index values. -pub unsafe trait IndexType : Copy + Default + Hash + Ord + fmt::Debug + 'static -{ - fn new(x: usize) -> Self; - fn index(&self) -> usize; - fn max() -> Self; -} - -unsafe impl IndexType for usize { - #[inline(always)] - fn new(x: usize) -> Self { x } - #[inline(always)] - fn index(&self) -> Self { *self } - #[inline(always)] - fn max() -> Self { ::std::usize::MAX } -} - -unsafe impl IndexType for u32 { - #[inline(always)] - fn new(x: usize) -> Self { x as u32 } - #[inline(always)] - fn index(&self) -> usize { *self as usize } - #[inline(always)] - fn max() -> Self { ::std::u32::MAX } -} - -unsafe impl IndexType for u16 { - #[inline(always)] - fn new(x: usize) -> Self { x as u16 } - #[inline(always)] - fn index(&self) -> usize { *self as usize } - #[inline(always)] - fn max() -> Self { ::std::u16::MAX } -} - -unsafe impl IndexType for u8 { - #[inline(always)] - fn new(x: usize) -> Self { x as u8 } - #[inline(always)] - fn index(&self) -> usize { *self as usize } - #[inline(always)] - fn max() -> Self { ::std::u8::MAX } -} - -/// Node identifier. -#[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash)] -pub struct NodeIndex<Ix=DefaultIx>(Ix); - -impl<Ix: IndexType> NodeIndex<Ix> -{ - #[inline] - pub fn new(x: usize) -> Self { - NodeIndex(IndexType::new(x)) - } - - #[inline] - pub fn index(self) -> usize - { - self.0.index() - } - - #[inline] - pub fn end() -> Self - { - NodeIndex(IndexType::max()) - } - - fn _into_edge(self) -> EdgeIndex<Ix> { - EdgeIndex(self.0) - } -} - -impl<Ix: IndexType> From<Ix> for NodeIndex<Ix> { - fn from(ix: Ix) -> Self { NodeIndex(ix) } -} - -impl<Ix: fmt::Debug> fmt::Debug for NodeIndex<Ix> -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "NodeIndex({:?})", self.0) - } -} - -/// Short version of `NodeIndex::new` -pub fn node_index<Ix: IndexType>(index: usize) -> NodeIndex<Ix> { NodeIndex::new(index) } - -/// Short version of `EdgeIndex::new` -pub fn edge_index<Ix: IndexType>(index: usize) -> EdgeIndex<Ix> { EdgeIndex::new(index) } - -/// Edge identifier. -#[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash)] -pub struct EdgeIndex<Ix=DefaultIx>(Ix); - -impl<Ix: IndexType> EdgeIndex<Ix> -{ - #[inline] - pub fn new(x: usize) -> Self { - EdgeIndex(IndexType::new(x)) - } - - #[inline] - pub fn index(self) -> usize - { - self.0.index() - } - - /// An invalid `EdgeIndex` used to denote absence of an edge, for example - /// to end an adjacency list. - #[inline] - pub fn end() -> Self { - EdgeIndex(IndexType::max()) - } - - fn _into_node(self) -> NodeIndex<Ix> { - NodeIndex(self.0) - } -} - -impl<Ix: fmt::Debug> fmt::Debug for EdgeIndex<Ix> -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "EdgeIndex({:?})", self.0) - } -} -/* - * FIXME: Use this impl again, when we don't need to add so many bounds -impl<Ix: IndexType> fmt::Debug for EdgeIndex<Ix> -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - try!(write!(f, "EdgeIndex(")); - if *self == EdgeIndex::end() { - try!(write!(f, "End")); - } else { - try!(write!(f, "{}", self.index())); - } - write!(f, ")") - } -} -*/ - -const DIRECTIONS: [Direction; 2] = [Outgoing, Incoming]; - -/// The graph's node type. -#[derive(Debug)] -pub struct Node<N, Ix = DefaultIx> { - /// Associated node data. - pub weight: N, - /// Next edge in outgoing and incoming edge lists. - next: [EdgeIndex<Ix>; 2], -} - -impl<E, Ix> Clone for Node<E, Ix> where E: Clone, Ix: Copy { - clone_fields!(Node, - weight, - next, - ); -} - - -impl<N, Ix: IndexType> Node<N, Ix> -{ - /// Accessor for data structure internals: the first edge in the given direction. - pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix> - { - self.next[dir.index()] - } -} - - -/// The graph's edge type. -#[derive(Debug)] -pub struct Edge<E, Ix = DefaultIx> { - /// Associated edge data. - pub weight: E, - /// Next edge in outgoing and incoming edge lists. - next: [EdgeIndex<Ix>; 2], - /// Start and End node index - node: [NodeIndex<Ix>; 2], -} - -impl<E, Ix> Clone for Edge<E, Ix> where E: Clone, Ix: Copy { - clone_fields!(Edge, - weight, - next, - node, - ); -} - -impl<E, Ix: IndexType> Edge<E, Ix> -{ - /// Accessor for data structure internals: the next edge for the given direction. - pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix> - { - self.next[dir.index()] - } - - /// Return the source node index. - pub fn source(&self) -> NodeIndex<Ix> - { - self.node[0] - } - - /// Return the target node index. - pub fn target(&self) -> NodeIndex<Ix> - { - self.node[1] - } -} - -/// `Graph<N, E, Ty, Ix>` is a graph datastructure using an adjacency list representation. -/// -/// `Graph` is parameterized over: -/// -/// - Associated data `N` for nodes and `E` for edges, called *weights*. -/// The associated data can be of arbitrary type. -/// - Edge type `Ty` that determines whether the graph edges are directed or undirected. -/// - Index type `Ix`, which determines the maximum size of the graph. -/// -/// The graph uses **O(|V| + |E|)** space, and allows fast node and edge insert, -/// efficient graph search and graph algorithms. -/// It implements **O(e')** edge lookup and edge and node removals, where **e'** -/// is some local measure of edge count. -/// Based on the graph datastructure used in rustc. -/// -/// Here's an example of building a graph with directed edges, and below -/// an illustration of how it could be rendered with graphviz (see -/// [`Dot`](../dot/struct.Dot.html)): -/// -/// ``` -/// use petgraph::Graph; -/// -/// let mut deps = Graph::<&str, &str>::new(); -/// let pg = deps.add_node("petgraph"); -/// let fb = deps.add_node("fixedbitset"); -/// let qc = deps.add_node("quickcheck"); -/// let rand = deps.add_node("rand"); -/// let libc = deps.add_node("libc"); -/// deps.extend_with_edges(&[ -/// (pg, fb), (pg, qc), -/// (qc, rand), (rand, libc), (qc, libc), -/// ]); -/// ``` -/// -/// ![graph-example](https://bluss.github.io/ndarray/images/graph-example.svg) -/// -/// ### Graph Indices -/// -/// The graph maintains indices for nodes and edges, and node and edge -/// weights may be accessed mutably. Indices range in a compact interval, for -/// example for *n* nodes indices are 0 to *n* - 1 inclusive. -/// -/// `NodeIndex` and `EdgeIndex` are types that act as references to nodes and edges, -/// but these are only stable across certain operations. -/// **Adding nodes or edges keeps indices stable. -/// Removing nodes or edges may shift other indices.** -/// Removing a node will force the last node to shift its index to -/// take its place. Similarly, removing an edge shifts the index of the last edge. -/// -/// The `Ix` parameter is `u32` by default. The goal is that you can ignore this parameter -/// completely unless you need a very big graph -- then you can use `usize`. -/// -/// ### Pros and Cons of Indices -/// -/// * The fact that the node and edge indices in the graph each are numbered in compact -/// intervals (from 0 to *n* - 1 for *n* nodes) simplifies some graph algorithms. -/// -/// * You can select graph index integer type after the size of the graph. A smaller -/// size may have better performance. -/// -/// * Using indices allows mutation while traversing the graph, see `Dfs`, -/// and `.neighbors(a).detach()`. -/// -/// * You can create several graphs using the equal node indices but with -/// differing weights or differing edges. -/// -/// * The `Graph` is a regular rust collection and is `Send` and `Sync` (as long -/// as associated data `N` and `E` are). -/// -/// * Some indices shift during node or edge removal, so that is a drawback -/// of removing elements. Indices don't allow as much compile time checking as -/// references. -/// -pub struct Graph<N, E, Ty = Directed, Ix = DefaultIx> { - nodes: Vec<Node<N, Ix>>, - edges: Vec<Edge<E, Ix>>, - ty: PhantomData<Ty>, -} - -/// A `Graph` with directed edges. -/// -/// For example, an edge from *1* to *2* is distinct from an edge from *2* to -/// *1*. -pub type DiGraph<N, E, Ix = DefaultIx> = Graph<N, E, Directed, Ix>; - -/// A `Graph` with undirected edges. -/// -/// For example, an edge between *1* and *2* is equivalent to an edge between -/// *2* and *1*. -pub type UnGraph<N, E, Ix = DefaultIx> = Graph<N, E, Undirected, Ix>; - - -/// The resulting cloned graph has the same graph indices as `self`. -impl<N, E, Ty, Ix: IndexType> Clone for Graph<N, E, Ty, Ix> - where N: Clone, E: Clone, -{ - fn clone(&self) -> Self { - Graph { - nodes: self.nodes.clone(), - edges: self.edges.clone(), - ty: self.ty, - } - } - - fn clone_from(&mut self, rhs: &Self) { - self.nodes.clone_from(&rhs.nodes); - self.edges.clone_from(&rhs.edges); - self.ty = rhs.ty; - } -} - -impl<N, E, Ty, Ix> fmt::Debug for Graph<N, E, Ty, Ix> - where N: fmt::Debug, - E: fmt::Debug, - Ty: EdgeType, - Ix: IndexType, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let etype = if self.is_directed() { "Directed" } else { "Undirected" }; - let mut fmt_struct = f.debug_struct("Graph"); - fmt_struct.field("Ty", &etype); - fmt_struct.field("node_count", &self.node_count()); - fmt_struct.field("edge_count", &self.edge_count()); - if self.edge_count() > 0 { - fmt_struct.field("edges", - &self.edges - .iter() - .map(|e| NoPretty((e.source().index(), e.target().index()))) - .format(", ")); - } - // skip weights if they are ZST! - if size_of::<N>() != 0 { - fmt_struct.field("node weights", &DebugMap(|| self.nodes.iter() - .map(|n| &n.weight) - .enumerate())); - } - if size_of::<E>() != 0 { - fmt_struct.field("edge weights", &DebugMap(|| self.edges.iter() - .map(|n| &n.weight) - .enumerate())); - } - fmt_struct.finish() - } -} - -enum Pair<T> { - Both(T, T), - One(T), - None, -} - -use std::cmp::max; - -/// Get mutable references at index `a` and `b`. -fn index_twice<T>(slc: &mut [T], a: usize, b: usize) -> Pair<&mut T> { - if max(a, b) >= slc.len() { - Pair::None - } else if a == b { - Pair::One(&mut slc[max(a, b)]) - } else { - // safe because a, b are in bounds and distinct - unsafe { - let ar = &mut *(slc.get_unchecked_mut(a) as *mut _); - let br = &mut *(slc.get_unchecked_mut(b) as *mut _); - Pair::Both(ar, br) - } - } -} - -impl<N, E> Graph<N, E, Directed> -{ - /// Create a new `Graph` with directed edges. - /// - /// This is a convenience method. Use `Graph::with_capacity` or `Graph::default` for - /// a constructor that is generic in all the type parameters of `Graph`. - pub fn new() -> Self - { - Graph{nodes: Vec::new(), edges: Vec::new(), - ty: PhantomData} - } -} - -impl<N, E> Graph<N, E, Undirected> -{ - /// Create a new `Graph` with undirected edges. - /// - /// This is a convenience method. Use `Graph::with_capacity` or `Graph::default` for - /// a constructor that is generic in all the type parameters of `Graph`. - pub fn new_undirected() -> Self - { - Graph{nodes: Vec::new(), edges: Vec::new(), - ty: PhantomData} - } -} - -impl<N, E, Ty, Ix> Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - /// Create a new `Graph` with estimated capacity. - pub fn with_capacity(nodes: usize, edges: usize) -> Self - { - Graph{nodes: Vec::with_capacity(nodes), edges: Vec::with_capacity(edges), - ty: PhantomData} - } - - /// Return the number of nodes (vertices) in the graph. - /// - /// Computes in **O(1)** time. - pub fn node_count(&self) -> usize - { - self.nodes.len() - } - - /// Return the number of edges in the graph. - /// - /// Computes in **O(1)** time. - pub fn edge_count(&self) -> usize - { - self.edges.len() - } - - /// Whether the graph has directed edges or not. - #[inline] - pub fn is_directed(&self) -> bool - { - Ty::is_directed() - } - - /// Add a node (also called vertex) with associated data `weight` to the graph. - /// - /// Computes in **O(1)** time. - /// - /// Return the index of the new node. - /// - /// **Panics** if the Graph is at the maximum number of nodes for its index - /// type (N/A if usize). - pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix> - { - let node = Node{weight: weight, next: [EdgeIndex::end(), EdgeIndex::end()]}; - let node_idx = NodeIndex::new(self.nodes.len()); - // check for max capacity, except if we use usize - assert!(<Ix as IndexType>::max().index() == !0 || NodeIndex::end() != node_idx); - self.nodes.push(node); - node_idx - } - - /// Access the weight for node `a`. - /// - /// Also available with indexing syntax: `&graph[a]`. - pub fn node_weight(&self, a: NodeIndex<Ix>) -> Option<&N> - { - self.nodes.get(a.index()).map(|n| &n.weight) - } - - /// Access the weight for node `a`, mutably. - /// - /// Also available with indexing syntax: `&mut graph[a]`. - pub fn node_weight_mut(&mut self, a: NodeIndex<Ix>) -> Option<&mut N> - { - self.nodes.get_mut(a.index()).map(|n| &mut n.weight) - } - - /// Add an edge from `a` to `b` to the graph, with its associated - /// data `weight`. - /// - /// Return the index of the new edge. - /// - /// Computes in **O(1)** time. - /// - /// **Panics** if any of the nodes don't exist.<br> - /// **Panics** if the Graph is at the maximum number of edges for its index - /// type (N/A if usize). - /// - /// **Note:** `Graph` allows adding parallel (“duplicate”) edges. If you want - /// to avoid this, use [`.update_edge(a, b, weight)`](#method.update_edge) instead. - pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> - { - let edge_idx = EdgeIndex::new(self.edges.len()); - assert!(<Ix as IndexType>::max().index() == !0 || EdgeIndex::end() != edge_idx); - let mut edge = Edge { - weight: weight, - node: [a, b], - next: [EdgeIndex::end(); 2], - }; - match index_twice(&mut self.nodes, a.index(), b.index()) { - Pair::None => panic!("Graph::add_edge: node indices out of bounds"), - Pair::One(an) => { - edge.next = an.next; - an.next[0] = edge_idx; - an.next[1] = edge_idx; - } - Pair::Both(an, bn) => { - // a and b are different indices - edge.next = [an.next[0], bn.next[1]]; - an.next[0] = edge_idx; - bn.next[1] = edge_idx; - } - } - self.edges.push(edge); - edge_idx - } - - /// Add or update an edge from `a` to `b`. - /// If the edge already exists, its weight is updated. - /// - /// Return the index of the affected edge. - /// - /// Computes in **O(e')** time, where **e'** is the number of edges - /// connected to `a` (and `b`, if the graph edges are undirected). - /// - /// **Panics** if any of the nodes don't exist. - pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> - { - if let Some(ix) = self.find_edge(a, b) { - if let Some(ed) = self.edge_weight_mut(ix) { - *ed = weight; - return ix; - } - } - self.add_edge(a, b, weight) - } - - /// Access the weight for edge `e`. - /// - /// Also available with indexing syntax: `&graph[e]`. - pub fn edge_weight(&self, e: EdgeIndex<Ix>) -> Option<&E> - { - self.edges.get(e.index()).map(|ed| &ed.weight) - } - - /// Access the weight for edge `e`, mutably. - /// - /// Also available with indexing syntax: `&mut graph[e]`. - pub fn edge_weight_mut(&mut self, e: EdgeIndex<Ix>) -> Option<&mut E> - { - self.edges.get_mut(e.index()).map(|ed| &mut ed.weight) - } - - /// Access the source and target nodes for `e`. - pub fn edge_endpoints(&self, e: EdgeIndex<Ix>) - -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)> - { - self.edges.get(e.index()).map(|ed| (ed.source(), ed.target())) - } - - /// Remove `a` from the graph if it exists, and return its weight. - /// If it doesn't exist in the graph, return `None`. - /// - /// Apart from `a`, this invalidates the last node index in the graph - /// (that node will adopt the removed node index). Edge indices are - /// invalidated as they would be following the removal of each edge - /// with an endpoint in `a`. - /// - /// Computes in **O(e')** time, where **e'** is the number of affected - /// edges, including *n* calls to `.remove_edge()` where *n* is the number - /// of edges with an endpoint in `a`, and including the edges with an - /// endpoint in the displaced node. - pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N> - { - if self.nodes.get(a.index()).is_none() { - return None - } - for d in &DIRECTIONS { - let k = d.index(); - - // Remove all edges from and to this node. - loop { - let next = self.nodes[a.index()].next[k]; - if next == EdgeIndex::end() { - break - } - let ret = self.remove_edge(next); - debug_assert!(ret.is_some()); - let _ = ret; - } - } - - // Use swap_remove -- only the swapped-in node is going to change - // NodeIndex<Ix>, so we only have to walk its edges and update them. - - let node = self.nodes.swap_remove(a.index()); - - // Find the edge lists of the node that had to relocate. - // It may be that no node had to relocate, then we are done already. - let swap_edges = match self.nodes.get(a.index()) { - None => return Some(node.weight), - Some(ed) => ed.next, - }; - - // The swapped element's old index - let old_index = NodeIndex::new(self.nodes.len()); - let new_index = a; - - // Adjust the starts of the out edges, and ends of the in edges. - for &d in &DIRECTIONS { - let k = d.index(); - let mut edges = edges_walker_mut(&mut self.edges, swap_edges[k], d); - while let Some(curedge) = edges.next_edge() { - debug_assert!(curedge.node[k] == old_index); - curedge.node[k] = new_index; - } - } - Some(node.weight) - } - - /// For edge `e` with endpoints `edge_node`, replace links to it, - /// with links to `edge_next`. - fn change_edge_links(&mut self, edge_node: [NodeIndex<Ix>; 2], e: EdgeIndex<Ix>, - edge_next: [EdgeIndex<Ix>; 2]) - { - for &d in &DIRECTIONS { - let k = d.index(); - let node = match self.nodes.get_mut(edge_node[k].index()) { - Some(r) => r, - None => { - debug_assert!(false, "Edge's endpoint dir={:?} index={:?} not found", - d, edge_node[k]); - return - } - }; - let fst = node.next[k]; - if fst == e { - //println!("Updating first edge 0 for node {}, set to {}", edge_node[0], edge_next[0]); - node.next[k] = edge_next[k]; - } else { - let mut edges = edges_walker_mut(&mut self.edges, fst, d); - while let Some(curedge) = edges.next_edge() { - if curedge.next[k] == e { - curedge.next[k] = edge_next[k]; - break; // the edge can only be present once in the list. - } - } - } - } - } - - /// Remove an edge and return its edge weight, or `None` if it didn't exist. - /// - /// Apart from `e`, this invalidates the last edge index in the graph - /// (that edge will adopt the removed edge index). - /// - /// Computes in **O(e')** time, where **e'** is the size of four particular edge lists, for - /// the vertices of `e` and the vertices of another affected edge. - pub fn remove_edge(&mut self, e: EdgeIndex<Ix>) -> Option<E> - { - // every edge is part of two lists, - // outgoing and incoming edges. - // Remove it from both - let (edge_node, edge_next) = match self.edges.get(e.index()) { - None => return None, - Some(x) => (x.node, x.next), - }; - // Remove the edge from its in and out lists by replacing it with - // a link to the next in the list. - self.change_edge_links(edge_node, e, edge_next); - self.remove_edge_adjust_indices(e) - } - - fn remove_edge_adjust_indices(&mut self, e: EdgeIndex<Ix>) -> Option<E> - { - // swap_remove the edge -- only the removed edge - // and the edge swapped into place are affected and need updating - // indices. - let edge = self.edges.swap_remove(e.index()); - let swap = match self.edges.get(e.index()) { - // no elment needed to be swapped. - None => return Some(edge.weight), - Some(ed) => ed.node, - }; - let swapped_e = EdgeIndex::new(self.edges.len()); - - // Update the edge lists by replacing links to the old index by references to the new - // edge index. - self.change_edge_links(swap, swapped_e, [e, e]); - Some(edge.weight) - } - - /// Return an iterator of all nodes with an edge starting from `a`. - /// - /// - `Directed`: Outgoing edges from `a`. - /// - `Undirected`: All edges from or to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `NodeIndex<Ix>`. - /// - /// Use [`.neighbors(a).detach()`][1] to get a neighbor walker that does - /// not borrow from the graph. - /// - /// [1]: struct.Neighbors.html#method.detach - pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> - { - self.neighbors_directed(a, Outgoing) - } - - /// Return an iterator of all neighbors that have an edge between them and - /// `a`, in the specified direction. - /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*. - /// - /// - `Directed`, `Outgoing`: All edges from `a`. - /// - `Directed`, `Incoming`: All edges to `a`. - /// - `Undirected`: All edges from or to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `NodeIndex<Ix>`. - /// - /// For a `Directed` graph, neighbors are listed in reverse order of their - /// addition to the graph, so the most recently added edge's neighbor is - /// listed first. The order in an `Undirected` graph is arbitrary. - /// - /// Use [`.neighbors_directed(a, dir).detach()`][1] to get a neighbor walker that does - /// not borrow from the graph. - /// - /// [1]: struct.Neighbors.html#method.detach - pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Neighbors<E, Ix> - { - let mut iter = self.neighbors_undirected(a); - if self.is_directed() { - let k = dir.index(); - iter.next[1 - k] = EdgeIndex::end(); - iter.skip_start = NodeIndex::end(); - } - iter - } - - /// Return an iterator of all neighbors that have an edge between them and - /// `a`, in either direction. - /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*. - /// - /// - `Directed` and `Undirected`: All edges from or to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `NodeIndex<Ix>`. - /// - /// Use [`.neighbors_undirected(a).detach()`][1] to get a neighbor walker that does - /// not borrow from the graph. - /// - /// [1]: struct.Neighbors.html#method.detach - /// - pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> - { - Neighbors { - skip_start: a, - edges: &self.edges, - next: match self.nodes.get(a.index()) { - None => [EdgeIndex::end(), EdgeIndex::end()], - Some(n) => n.next, - } - } - } - - /// Return an iterator of all edges of `a`. - /// - /// - `Directed`: Outgoing edges from `a`. - /// - `Undirected`: All edges connected to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `EdgeReference<E, Ix>`. - pub fn edges(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> { - self.edges_directed(a, Outgoing) - } - - /// Return an iterator of all edges of `a`, in the specified direction. - /// - /// - `Directed`, `Outgoing`: All edges from `a`. - /// - `Directed`, `Incoming`: All edges to `a`. - /// - `Undirected`: All edges connected to `a`. - /// - /// Produces an empty iterator if the node `a` doesn't exist.<br> - /// Iterator element type is `EdgeReference<E, Ix>`. - pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix> - { - let mut iter = self.edges_undirected(a); - if self.is_directed() { - iter.direction = Some(dir); - } - if self.is_directed() && dir == Incoming { - iter.next.swap(0, 1); - } - iter - } - - /// Return an iterator over all edges connected to `a`. - /// - /// - `Directed` and `Undirected`: All edges connected to `a`. - /// - /// Produces an empty iterator if the node `a` doesn't exist.<br> - /// Iterator element type is `EdgeReference<E, Ix>`. - fn edges_undirected(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> { - Edges { - skip_start: a, - edges: &self.edges, - direction: None, - next: match self.nodes.get(a.index()) { - None => [EdgeIndex::end(), EdgeIndex::end()], - Some(n) => n.next, - }, - ty: PhantomData, - } - } - - /// Lookup if there is an edge from `a` to `b`. - /// - /// Computes in **O(e')** time, where **e'** is the number of edges - /// connected to `a` (and `b`, if the graph edges are undirected). - pub fn contains_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool { - self.find_edge(a, b).is_some() - } - - /// Lookup an edge from `a` to `b`. - /// - /// Computes in **O(e')** time, where **e'** is the number of edges - /// connected to `a` (and `b`, if the graph edges are undirected). - pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>> - { - if !self.is_directed() { - self.find_edge_undirected(a, b).map(|(ix, _)| ix) - } else { - match self.nodes.get(a.index()) { - None => None, - Some(node) => self.find_edge_directed_from_node(node, b) - } - } - } - - fn find_edge_directed_from_node(&self, node: &Node<N, Ix>, b: NodeIndex<Ix>) - -> Option<EdgeIndex<Ix>> - { - let mut edix = node.next[0]; - while let Some(edge) = self.edges.get(edix.index()) { - if edge.node[1] == b { - return Some(edix) - } - edix = edge.next[0]; - } - None - } - - /// Lookup an edge between `a` and `b`, in either direction. - /// - /// If the graph is undirected, then this is equivalent to `.find_edge()`. - /// - /// Return the edge index and its directionality, with `Outgoing` meaning - /// from `a` to `b` and `Incoming` the reverse, - /// or `None` if the edge does not exist. - pub fn find_edge_undirected(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<(EdgeIndex<Ix>, Direction)> - { - match self.nodes.get(a.index()) { - None => None, - Some(node) => self.find_edge_undirected_from_node(node, b), - } - } - - fn find_edge_undirected_from_node(&self, node: &Node<N, Ix>, b: NodeIndex<Ix>) - -> Option<(EdgeIndex<Ix>, Direction)> - { - for &d in &DIRECTIONS { - let k = d.index(); - let mut edix = node.next[k]; - while let Some(edge) = self.edges.get(edix.index()) { - if edge.node[1 - k] == b { - return Some((edix, d)) - } - edix = edge.next[k]; - } - } - None - } - - /// Return an iterator over either the nodes without edges to them - /// (`Incoming`) or from them (`Outgoing`). - /// - /// An *internal* node has both incoming and outgoing edges. - /// The nodes in `.externals(Incoming)` are the source nodes and - /// `.externals(Outgoing)` are the sinks of the graph. - /// - /// For a graph with undirected edges, both the sinks and the sources are - /// just the nodes without edges. - /// - /// The whole iteration computes in **O(|V|)** time. - pub fn externals(&self, dir: Direction) -> Externals<N, Ty, Ix> - { - Externals{iter: self.nodes.iter().enumerate(), dir: dir, ty: PhantomData} - } - - /// Return an iterator over the node indices of the graph - pub fn node_indices(&self) -> NodeIndices<Ix> { - NodeIndices { r: 0..self.node_count(), ty: PhantomData } - } - - /// Return an iterator yielding mutable access to all node weights. - /// - /// The order in which weights are yielded matches the order of their - /// node indices. - pub fn node_weights_mut(&mut self) -> NodeWeightsMut<N, Ix> - { - NodeWeightsMut { nodes: self.nodes.iter_mut() } - } - - /// Return an iterator over the edge indices of the graph - pub fn edge_indices(&self) -> EdgeIndices<Ix> { - EdgeIndices { r: 0..self.edge_count(), ty: PhantomData } - } - - /// Create an iterator over all edges, in indexed order. - /// - /// Iterator element type is `EdgeReference<E, Ix>`. - pub fn edge_references(&self) -> EdgeReferences<E, Ix> { - EdgeReferences { - iter: self.edges.iter().enumerate() - } - } - - /// Return an iterator yielding mutable access to all edge weights. - /// - /// The order in which weights are yielded matches the order of their - /// edge indices. - pub fn edge_weights_mut(&mut self) -> EdgeWeightsMut<E, Ix> - { - EdgeWeightsMut { edges: self.edges.iter_mut() } - } - - // Remaining methods are of the more internal flavour, read-only access to - // the data structure's internals. - - /// Access the internal node array. - pub fn raw_nodes(&self) -> &[Node<N, Ix>] - { - &self.nodes - } - - /// Access the internal edge array. - pub fn raw_edges(&self) -> &[Edge<E, Ix>] - { - &self.edges - } - - /// Convert the graph into a vector of Nodes and a vector of Edges - pub fn into_nodes_edges(self) -> (Vec<Node<N, Ix>>, Vec<Edge<E, Ix>>) { - (self.nodes, self.edges) - } - - /// Accessor for data structure internals: the first edge in the given direction. - pub fn first_edge(&self, a: NodeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>> - { - match self.nodes.get(a.index()) { - None => None, - Some(node) => { - let edix = node.next[dir.index()]; - if edix == EdgeIndex::end() { - None - } else { Some(edix) } - } - } - } - - /// Accessor for data structure internals: the next edge for the given direction. - pub fn next_edge(&self, e: EdgeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>> - { - match self.edges.get(e.index()) { - None => None, - Some(node) => { - let edix = node.next[dir.index()]; - if edix == EdgeIndex::end() { - None - } else { Some(edix) } - } - } - } - - /// Index the `Graph` by two indices, any combination of - /// node or edge indices is fine. - /// - /// **Panics** if the indices are equal or if they are out of bounds. - /// - /// ``` - /// use petgraph::{Graph, Incoming}; - /// use petgraph::visit::Dfs; - /// - /// let mut gr = Graph::new(); - /// let a = gr.add_node(0.); - /// let b = gr.add_node(0.); - /// let c = gr.add_node(0.); - /// gr.add_edge(a, b, 3.); - /// gr.add_edge(b, c, 2.); - /// gr.add_edge(c, b, 1.); - /// - /// // walk the graph and sum incoming edges into the node weight - /// let mut dfs = Dfs::new(&gr, a); - /// while let Some(node) = dfs.next(&gr) { - /// // use a walker -- a detached neighbors iterator - /// let mut edges = gr.neighbors_directed(node, Incoming).detach(); - /// while let Some(edge) = edges.next_edge(&gr) { - /// let (nw, ew) = gr.index_twice_mut(node, edge); - /// *nw += *ew; - /// } - /// } - /// - /// // check the result - /// assert_eq!(gr[a], 0.); - /// assert_eq!(gr[b], 4.); - /// assert_eq!(gr[c], 2.); - /// ``` - pub fn index_twice_mut<T, U>(&mut self, i: T, j: U) - -> (&mut <Self as Index<T>>::Output, - &mut <Self as Index<U>>::Output) - where Self: IndexMut<T> + IndexMut<U>, - T: GraphIndex, - U: GraphIndex, - { - assert!(T::is_node_index() != U::is_node_index() || - i.index() != j.index()); - - // Allow two mutable indexes here -- they are nonoverlapping - unsafe { - let self_mut = self as *mut _; - (<Self as IndexMut<T>>::index_mut(&mut *self_mut, i), - <Self as IndexMut<U>>::index_mut(&mut *self_mut, j)) - } - } - - /// Reverse the direction of all edges - pub fn reverse(&mut self) { - // swap edge endpoints, - // edge incoming / outgoing lists, - // node incoming / outgoing lists - for edge in &mut self.edges { - edge.node.swap(0, 1); - edge.next.swap(0, 1); - } - for node in &mut self.nodes { - node.next.swap(0, 1); - } - } - - /// Remove all nodes and edges - pub fn clear(&mut self) { - self.nodes.clear(); - self.edges.clear(); - } - - /// Remove all edges - pub fn clear_edges(&mut self) { - self.edges.clear(); - for node in &mut self.nodes { - node.next = [EdgeIndex::end(), EdgeIndex::end()]; - } - } - - /// Return the current node and edge capacity of the graph. - pub fn capacity(&self) -> (usize, usize) { - (self.nodes.capacity(), self.edges.capacity()) - } - - /// Reserves capacity for at least `additional` more nodes to be inserted in - /// the graph. Graph may reserve more space to avoid frequent reallocations. - /// - /// **Panics** if the new capacity overflows `usize`. - pub fn reserve_nodes(&mut self, additional: usize) { - self.nodes.reserve(additional); - } - - /// Reserves capacity for at least `additional` more edges to be inserted in - /// the graph. Graph may reserve more space to avoid frequent reallocations. - /// - /// **Panics** if the new capacity overflows `usize`. - pub fn reserve_edges(&mut self, additional: usize) { - self.edges.reserve(additional); - } - - /// Reserves the minimum capacity for exactly `additional` more nodes to be - /// inserted in the graph. Does nothing if the capacity is already - /// sufficient. - /// - /// Prefer `reserve_nodes` if future insertions are expected. - /// - /// **Panics** if the new capacity overflows `usize`. - pub fn reserve_exact_nodes(&mut self, additional: usize) { - self.nodes.reserve_exact(additional); - } - - /// Reserves the minimum capacity for exactly `additional` more edges to be - /// inserted in the graph. - /// Does nothing if the capacity is already sufficient. - /// - /// Prefer `reserve_edges` if future insertions are expected. - /// - /// **Panics** if the new capacity overflows `usize`. - pub fn reserve_exact_edges(&mut self, additional: usize) { - self.edges.reserve_exact(additional); - } - - /// Shrinks the capacity of the underlying nodes collection as much as possible. - pub fn shrink_to_fit_nodes(&mut self) { - self.nodes.shrink_to_fit(); - } - - /// Shrinks the capacity of the underlying edges collection as much as possible. - pub fn shrink_to_fit_edges(&mut self) { - self.edges.shrink_to_fit(); - } - - /// Shrinks the capacity of the graph as much as possible. - pub fn shrink_to_fit(&mut self) { - self.nodes.shrink_to_fit(); - self.edges.shrink_to_fit(); - } - - /// Keep all nodes that return `true` from the `visit` closure, - /// remove the others. - /// - /// `visit` is provided a proxy reference to the graph, so that - /// the graph can be walked and associated data modified. - /// - /// The order nodes are visited is not specified. - pub fn retain_nodes<F>(&mut self, mut visit: F) - where F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool - { - for index in self.node_indices().rev() { - if !visit(Frozen(self), index) { - let ret = self.remove_node(index); - debug_assert!(ret.is_some()); - let _ = ret; - } - } - } - - /// Keep all edges that return `true` from the `visit` closure, - /// remove the others. - /// - /// `visit` is provided a proxy reference to the graph, so that - /// the graph can be walked and associated data modified. - /// - /// The order edges are visited is not specified. - pub fn retain_edges<F>(&mut self, mut visit: F) - where F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool - { - for index in self.edge_indices().rev() { - if !visit(Frozen(self), index) { - let ret = self.remove_edge(index); - debug_assert!(ret.is_some()); - let _ = ret; - } - } - } - - - /// Create a new `Graph` from an iterable of edges. - /// - /// Node weights `N` are set to default values. - /// Edge weights `E` may either be specified in the list, - /// or they are filled with default values. - /// - /// Nodes are inserted automatically to match the edges. - /// - /// ``` - /// use petgraph::Graph; - /// - /// let gr = Graph::<(), i32>::from_edges(&[ - /// (0, 1), (0, 2), (0, 3), - /// (1, 2), (1, 3), - /// (2, 3), - /// ]); - /// ``` - pub fn from_edges<I>(iterable: I) -> Self - where I: IntoIterator, - I::Item: IntoWeightedEdge<E>, - <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>, - N: Default, - { - let mut g = Self::with_capacity(0, 0); - g.extend_with_edges(iterable); - g - } - - /// Extend the graph from an iterable of edges. - /// - /// Node weights `N` are set to default values. - /// Edge weights `E` may either be specified in the list, - /// or they are filled with default values. - /// - /// Nodes are inserted automatically to match the edges. - pub fn extend_with_edges<I>(&mut self, iterable: I) - where I: IntoIterator, - I::Item: IntoWeightedEdge<E>, - <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>, - N: Default, - { - let iter = iterable.into_iter(); - let (low, _) = iter.size_hint(); - self.edges.reserve(low); - - for elt in iter { - let (source, target, weight) = elt.into_weighted_edge(); - let (source, target) = (source.into(), target.into()); - let nx = cmp::max(source, target); - while nx.index() >= self.node_count() { - self.add_node(N::default()); - } - self.add_edge(source, target, weight); - } - } - - - /// Create a new `Graph` by mapping node and - /// edge weights to new values. - /// - /// The resulting graph has the same structure and the same - /// graph indices as `self`. - pub fn map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G) - -> Graph<N2, E2, Ty, Ix> - where F: FnMut(NodeIndex<Ix>, &'a N) -> N2, - G: FnMut(EdgeIndex<Ix>, &'a E) -> E2, - { - let mut g = Graph::with_capacity(self.node_count(), self.edge_count()); - g.nodes.extend(enumerate(&self.nodes).map(|(i, node)| - Node { - weight: node_map(NodeIndex::new(i), &node.weight), - next: node.next, - })); - g.edges.extend(enumerate(&self.edges).map(|(i, edge)| - Edge { - weight: edge_map(EdgeIndex::new(i), &edge.weight), - next: edge.next, - node: edge.node, - })); - g - } - - /// Create a new `Graph` by mapping nodes and edges. - /// A node or edge may be mapped to `None` to exclude it from - /// the resulting graph. - /// - /// Nodes are mapped first with the `node_map` closure, then - /// `edge_map` is called for the edges that have not had any endpoint - /// removed. - /// - /// The resulting graph has the structure of a subgraph of the original graph. - /// If no nodes are removed, the resulting graph has compatible node - /// indices; if neither nodes nor edges are removed, the result has - /// the same graph indices as `self`. - pub fn filter_map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G) - -> Graph<N2, E2, Ty, Ix> - where F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>, - G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>, - { - let mut g = Graph::with_capacity(0, 0); - // mapping from old node index to new node index, end represents removed. - let mut node_index_map = vec![NodeIndex::end(); self.node_count()]; - for (i, node) in enumerate(&self.nodes) { - if let Some(nw) = node_map(NodeIndex::new(i), &node.weight) { - node_index_map[i] = g.add_node(nw); - } - } - for (i, edge) in enumerate(&self.edges) { - // skip edge if any endpoint was removed - let source = node_index_map[edge.source().index()]; - let target = node_index_map[edge.target().index()]; - if source != NodeIndex::end() && target != NodeIndex::end() { - if let Some(ew) = edge_map(EdgeIndex::new(i), &edge.weight) { - g.add_edge(source, target, ew); - } - } - } - g - } - - /// Convert the graph into either undirected or directed. No edge adjustments - /// are done, so you may want to go over the result to remove or add edges. - /// - /// Computes in **O(1)** time. - pub fn into_edge_type<NewTy>(self) -> Graph<N, E, NewTy, Ix> where - NewTy: EdgeType - { - Graph{nodes: self.nodes, edges: self.edges, - ty: PhantomData} - } - - - // - // internal methods - // - #[cfg(feature = "serde-1")] - /// Fix up node and edge links after deserialization - fn link_edges(&mut self) -> Result<(), NodeIndex<Ix>> { - for (edge_index, edge) in enumerate(&mut self.edges) { - let a = edge.source(); - let b = edge.target(); - let edge_idx = EdgeIndex::new(edge_index); - match index_twice(&mut self.nodes, a.index(), b.index()) { - Pair::None => return Err(if a > b { a } else { b }), - Pair::One(an) => { - edge.next = an.next; - an.next[0] = edge_idx; - an.next[1] = edge_idx; - } - Pair::Both(an, bn) => { - // a and b are different indices - edge.next = [an.next[0], bn.next[1]]; - an.next[0] = edge_idx; - bn.next[1] = edge_idx; - } - } - } - Ok(()) - } -} - -/// An iterator over either the nodes without edges to them or from them. -pub struct Externals<'a, N: 'a, Ty, Ix: IndexType = DefaultIx> { - iter: iter::Enumerate<slice::Iter<'a, Node<N, Ix>>>, - dir: Direction, - ty: PhantomData<Ty>, -} - -impl<'a, N: 'a, Ty, Ix> Iterator for Externals<'a, N, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - type Item = NodeIndex<Ix>; - fn next(&mut self) -> Option<NodeIndex<Ix>> - { - let k = self.dir.index(); - loop { - match self.iter.next() { - None => return None, - Some((index, node)) => { - if node.next[k] == EdgeIndex::end() && - (Ty::is_directed() || - node.next[1-k] == EdgeIndex::end()) { - return Some(NodeIndex::new(index)) - } else { - continue - } - }, - } - } - } -} - -/// Iterator over the neighbors of a node. -/// -/// Iterator element type is `NodeIndex<Ix>`. -/// -/// Created with [`.neighbors()`][1], [`.neighbors_directed()`][2] or -/// [`.neighbors_undirected()`][3]. -/// -/// [1]: struct.Graph.html#method.neighbors -/// [2]: struct.Graph.html#method.neighbors_directed -/// [3]: struct.Graph.html#method.neighbors_undirected -pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx> -{ - /// starting node to skip over - skip_start: NodeIndex<Ix>, - edges: &'a [Edge<E, Ix>], - next: [EdgeIndex<Ix>; 2], -} - -impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix> where - Ix: IndexType, -{ - type Item = NodeIndex<Ix>; - - fn next(&mut self) -> Option<NodeIndex<Ix>> { - // First any outgoing edges - match self.edges.get(self.next[0].index()) { - None => {} - Some(edge) => { - self.next[0] = edge.next[0]; - return Some(edge.node[1]); - } - } - // Then incoming edges - // For an "undirected" iterator (traverse both incoming - // and outgoing edge lists), make sure we don't double - // count selfloops by skipping them in the incoming list. - while let Some(edge) = self.edges.get(self.next[1].index()) { - self.next[1] = edge.next[1]; - if edge.node[0] != self.skip_start { - return Some(edge.node[0]); - } - } - None - } -} - - -impl<'a, E, Ix> Clone for Neighbors<'a, E, Ix> - where Ix: IndexType, -{ - clone_fields!(Neighbors, - skip_start, - edges, - next, - ); -} - -impl<'a, E, Ix> Neighbors<'a, E, Ix> - where Ix: IndexType, -{ - /// Return a “walker” object that can be used to step through the - /// neighbors and edges from the origin node. - /// - /// Note: The walker does not borrow from the graph, this is to allow mixing - /// edge walking with mutating the graph's weights. - pub fn detach(&self) -> WalkNeighbors<Ix> { - WalkNeighbors { - skip_start: self.skip_start, - next: self.next - } - } -} - -struct EdgesWalkerMut<'a, E: 'a, Ix: IndexType = DefaultIx> { - edges: &'a mut [Edge<E, Ix>], - next: EdgeIndex<Ix>, - dir: Direction, -} - -fn edges_walker_mut<E, Ix>(edges: &mut [Edge<E, Ix>], next: EdgeIndex<Ix>, dir: Direction) - -> EdgesWalkerMut<E, Ix> - where Ix: IndexType, -{ - EdgesWalkerMut { - edges: edges, - next: next, - dir: dir - } -} - -impl<'a, E, Ix> EdgesWalkerMut<'a, E, Ix> where - Ix: IndexType, -{ - fn next_edge(&mut self) -> Option<&mut Edge<E, Ix>> { - self.next().map(|t| t.1) - } - - fn next(&mut self) -> Option<(EdgeIndex<Ix>, &mut Edge<E, Ix>)> { - let this_index = self.next; - let k = self.dir.index(); - match self.edges.get_mut(self.next.index()) { - None => None, - Some(edge) => { - self.next = edge.next[k]; - Some((this_index, edge)) - } - } - } -} - - -impl<'a, N, E, Ty, Ix> IntoEdges for &'a Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Edges = Edges<'a, E, Ty, Ix>; - fn edges(self, a: Self::NodeId) -> Self::Edges { - self.edges(a) - } -} - -impl<'a, N, E, Ty, Ix> IntoEdgesDirected for &'a Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type EdgesDirected = Edges<'a, E, Ty, Ix>; - fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected { - self.edges_directed(a, dir) - } -} - - -/// Iterator over the edges of from or to a node -pub struct Edges<'a, E: 'a, Ty, Ix: 'a = DefaultIx> - where Ty: EdgeType, - Ix: IndexType, -{ - /// starting node to skip over - skip_start: NodeIndex<Ix>, - edges: &'a [Edge<E, Ix>], - - /// Next edge to visit. - /// If we are only following one direction, we only use next[0] regardless. - next: [EdgeIndex<Ix>; 2], - - /// Which direction to follow - /// None: Both, - /// Some(d): d if Directed, Both if Undirected - direction: Option<Direction>, - ty: PhantomData<Ty>, -} - -impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Item = EdgeReference<'a, E, Ix>; - - fn next(&mut self) -> Option<Self::Item> { - // First the outgoing or incoming edges (directionality) - let k = self.direction.unwrap_or(Outgoing).index(); - let i = self.next[0].index(); - match self.edges.get(i) { - None => {} - Some(&Edge { ref node, ref weight, ref next }) => { - self.next[0] = next[k]; - return Some(EdgeReference { - index: edge_index(i), - node: *node, - weight: weight, - }); - } - } - // Stop here if we only follow one direction - if self.direction.is_some() { - return None; - } - // Then incoming edges - // For an "undirected" iterator (traverse both incoming - // and outgoing edge lists), make sure we don't double - // count selfloops by skipping them in the incoming list. - - // We reach here if self.direction was None or Outgoing. - debug_assert_eq!(k, 0); - while let Some(edge) = self.edges.get(self.next[1].index()) { - let i = self.next[1].index(); - self.next[1] = edge.next[1]; - if edge.node[0] != self.skip_start { - return Some(EdgeReference { - index: edge_index(i), - node: swap_pair(edge.node), - weight: &edge.weight, - }); - } - } - None - } -} - -fn swap_pair<T>(mut x: [T; 2]) -> [T; 2] { - x.swap(0, 1); - x -} - -impl<'a, E, Ty, Ix> Clone for Edges<'a, E, Ty, Ix> - where Ix: IndexType, - Ty: EdgeType, -{ - fn clone(&self) -> Self { - Edges { - skip_start: self.skip_start, - edges: self.edges, - next: self.next, - direction: self.direction, - ty: self.ty, - } - } -} - -/// Iterator yielding mutable access to all node weights. -pub struct NodeWeightsMut<'a, N: 'a, Ix: IndexType = DefaultIx> { - nodes: ::std::slice::IterMut<'a, Node<N, Ix>>, -} - -impl<'a, N, Ix> Iterator for NodeWeightsMut<'a, N, Ix> where - Ix: IndexType, -{ - type Item = &'a mut N; - - fn next(&mut self) -> Option<&'a mut N> { - self.nodes.next().map(|node| &mut node.weight) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.nodes.size_hint() - } -} - -/// Iterator yielding mutable access to all edge weights. -pub struct EdgeWeightsMut<'a, E: 'a, Ix: IndexType = DefaultIx> { - edges: ::std::slice::IterMut<'a, Edge<E, Ix>>, -} - -impl<'a, E, Ix> Iterator for EdgeWeightsMut<'a, E, Ix> where - Ix: IndexType, -{ - type Item = &'a mut E; - - fn next(&mut self) -> Option<&'a mut E> { - self.edges.next().map(|edge| &mut edge.weight) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.edges.size_hint() - } -} - -/// Index the `Graph` by `NodeIndex` to access node weights. -/// -/// **Panics** if the node doesn't exist. -impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for Graph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - type Output = N; - fn index(&self, index: NodeIndex<Ix>) -> &N { - &self.nodes[index.index()].weight - } -} - -/// Index the `Graph` by `NodeIndex` to access node weights. -/// -/// **Panics** if the node doesn't exist. -impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for Graph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - fn index_mut(&mut self, index: NodeIndex<Ix>) -> &mut N { - &mut self.nodes[index.index()].weight - } - -} - -/// Index the `Graph` by `EdgeIndex` to access edge weights. -/// -/// **Panics** if the edge doesn't exist. -impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - type Output = E; - fn index(&self, index: EdgeIndex<Ix>) -> &E { - &self.edges[index.index()].weight - } -} - -/// Index the `Graph` by `EdgeIndex` to access edge weights. -/// -/// **Panics** if the edge doesn't exist. -impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - fn index_mut(&mut self, index: EdgeIndex<Ix>) -> &mut E { - &mut self.edges[index.index()].weight - } -} - -/// Create a new empty `Graph`. -impl<N, E, Ty, Ix> Default for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn default() -> Self { Self::with_capacity(0, 0) } -} - -/// A `GraphIndex` is a node or edge index. -pub trait GraphIndex : Copy { - #[doc(hidden)] - fn index(&self) -> usize; - #[doc(hidden)] - fn is_node_index() -> bool; -} - -impl<Ix: IndexType> GraphIndex for NodeIndex<Ix> { - #[inline] - fn index(&self) -> usize { NodeIndex::index(*self) } - #[inline] - fn is_node_index() -> bool { true } -} - -impl<Ix: IndexType> GraphIndex for EdgeIndex<Ix> { - #[inline] - fn index(&self) -> usize { EdgeIndex::index(*self) } - #[inline] - fn is_node_index() -> bool { false } -} - -/// A “walker” object that can be used to step through the edge list of a node. -/// -/// Created with [`.detach()`](struct.Neighbors.html#method.detach). -/// -/// The walker does not borrow from the graph, so it lets you step through -/// neighbors or incident edges while also mutating graph weights, as -/// in the following example: -/// -/// ``` -/// use petgraph::{Graph, Incoming}; -/// use petgraph::visit::Dfs; -/// -/// let mut gr = Graph::new(); -/// let a = gr.add_node(0.); -/// let b = gr.add_node(0.); -/// let c = gr.add_node(0.); -/// gr.add_edge(a, b, 3.); -/// gr.add_edge(b, c, 2.); -/// gr.add_edge(c, b, 1.); -/// -/// // step through the graph and sum incoming edges into the node weight -/// let mut dfs = Dfs::new(&gr, a); -/// while let Some(node) = dfs.next(&gr) { -/// // use a detached neighbors walker -/// let mut edges = gr.neighbors_directed(node, Incoming).detach(); -/// while let Some(edge) = edges.next_edge(&gr) { -/// gr[node] += gr[edge]; -/// } -/// } -/// -/// // check the result -/// assert_eq!(gr[a], 0.); -/// assert_eq!(gr[b], 4.); -/// assert_eq!(gr[c], 2.); -/// ``` -pub struct WalkNeighbors<Ix> { - skip_start: NodeIndex<Ix>, - next: [EdgeIndex<Ix>; 2], -} - -impl<Ix> Clone for WalkNeighbors<Ix> - where Ix: IndexType, -{ - fn clone(&self) -> Self { - WalkNeighbors { - skip_start: self.skip_start, - next: self.next, - } - } -} - -impl<Ix: IndexType> WalkNeighbors<Ix> { - /// Step to the next edge and its endpoint node in the walk for graph `g`. - /// - /// The next node indices are always the others than the starting point - /// where the `WalkNeighbors` value was created. - /// For an `Outgoing` walk, the target nodes, - /// for an `Incoming` walk, the source nodes of the edge. - pub fn next<N, E, Ty: EdgeType>(&mut self, g: &Graph<N, E, Ty, Ix>) - -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> { - // First any outgoing edges - match g.edges.get(self.next[0].index()) { - None => {} - Some(edge) => { - let ed = self.next[0]; - self.next[0] = edge.next[0]; - return Some((ed, edge.node[1])); - } - } - // Then incoming edges - // For an "undirected" iterator (traverse both incoming - // and outgoing edge lists), make sure we don't double - // count selfloops by skipping them in the incoming list. - while let Some(edge) = g.edges.get(self.next[1].index()) { - let ed = self.next[1]; - self.next[1] = edge.next[1]; - if edge.node[0] != self.skip_start { - return Some((ed, edge.node[0])); - } - } - None - } - - pub fn next_node<N, E, Ty: EdgeType>(&mut self, g: &Graph<N, E, Ty, Ix>) - -> Option<NodeIndex<Ix>> - { - self.next(g).map(|t| t.1) - } - - pub fn next_edge<N, E, Ty: EdgeType>(&mut self, g: &Graph<N, E, Ty, Ix>) - -> Option<EdgeIndex<Ix>> - { - self.next(g).map(|t| t.0) - } -} - -/// Iterator over the node indices of a graph. -#[derive(Clone, Debug)] -pub struct NodeIndices<Ix = DefaultIx> { - r: Range<usize>, - ty: PhantomData<fn() -> Ix>, -} - -impl<Ix: IndexType> Iterator for NodeIndices<Ix> { - type Item = NodeIndex<Ix>; - - fn next(&mut self) -> Option<Self::Item> { - self.r.next().map(node_index) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.r.size_hint() - } -} - -impl<Ix: IndexType> DoubleEndedIterator for NodeIndices<Ix> { - fn next_back(&mut self) -> Option<Self::Item> { - self.r.next_back().map(node_index) - } -} - -impl<Ix: IndexType> ExactSizeIterator for NodeIndices<Ix> {} - -/// Iterator over the edge indices of a graph. -#[derive(Clone, Debug)] -pub struct EdgeIndices<Ix = DefaultIx> { - r: Range<usize>, - ty: PhantomData<fn() -> Ix>, -} - -impl<Ix: IndexType> Iterator for EdgeIndices<Ix> { - type Item = EdgeIndex<Ix>; - - fn next(&mut self) -> Option<Self::Item> { - self.r.next().map(edge_index) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.r.size_hint() - } -} - -impl<Ix: IndexType> DoubleEndedIterator for EdgeIndices<Ix> { - fn next_back(&mut self) -> Option<Self::Item> { - self.r.next_back().map(edge_index) - } -} - -impl<Ix: IndexType> ExactSizeIterator for EdgeIndices<Ix> {} - -/// Reference to a `Graph` edge. -#[derive(Debug)] -pub struct EdgeReference<'a, E: 'a, Ix = DefaultIx> { - index: EdgeIndex<Ix>, - node: [NodeIndex<Ix>; 2], - weight: &'a E, -} - -impl<'a, E, Ix: IndexType> Clone for EdgeReference<'a, E, Ix> { - fn clone(&self) -> Self { - *self - } -} - -impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> { } - -impl<'a, E, Ix: IndexType> PartialEq for EdgeReference<'a, E, Ix> - where E: PartialEq, -{ - fn eq(&self, rhs: &Self) -> bool { - self.index == rhs.index && self.weight == rhs.weight - } -} - -impl<'a, N, E, Ty, Ix> IntoNodeReferences for &'a Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NodeRef = (NodeIndex<Ix>, &'a N); - type NodeReferences = NodeReferences<'a, N, Ix>; - fn node_references(self) -> Self::NodeReferences { - NodeReferences { - iter: self.nodes.iter().enumerate() - } - } -} - -/// Iterator over all nodes of a graph. -pub struct NodeReferences<'a, N: 'a, Ix: IndexType = DefaultIx> { - iter: iter::Enumerate<slice::Iter<'a, Node<N, Ix>>>, -} - -impl<'a, N, Ix> Iterator for NodeReferences<'a, N, Ix> - where Ix: IndexType -{ - type Item = (NodeIndex<Ix>, &'a N); - - fn next(&mut self) -> Option<Self::Item> { - self.iter.next().map(|(i, node)| - (node_index(i), &node.weight) - ) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } -} - -impl<'a, N, Ix> DoubleEndedIterator for NodeReferences<'a, N, Ix> - where Ix: IndexType -{ - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map(|(i, node)| - (node_index(i), &node.weight) - ) - } -} - -impl<'a, N, Ix> ExactSizeIterator for NodeReferences<'a, N, Ix> - where Ix: IndexType -{ } - -impl<'a, Ix, E> EdgeReference<'a, E, Ix> - where Ix: IndexType, -{ - /// Access the edge’s weight. - /// - /// **NOTE** that this method offers a longer lifetime - /// than the trait (unfortunately they don't match yet). - pub fn weight(&self) -> &'a E { self.weight } -} - -impl<'a, Ix, E> EdgeRef for EdgeReference<'a, E, Ix> - where Ix: IndexType, -{ - type NodeId = NodeIndex<Ix>; - type EdgeId = EdgeIndex<Ix>; - type Weight = E; - - fn source(&self) -> Self::NodeId { self.node[0] } - fn target(&self) -> Self::NodeId { self.node[1] } - fn weight(&self) -> &E { self.weight } - fn id(&self) -> Self::EdgeId { self.index } -} - - -/// Iterator over all edges of a graph. -pub struct EdgeReferences<'a, E: 'a, Ix: IndexType = DefaultIx> { - iter: iter::Enumerate<slice::Iter<'a, Edge<E, Ix>>>, -} - -impl<'a, E, Ix> Iterator for EdgeReferences<'a, E, Ix> - where Ix: IndexType -{ - type Item = EdgeReference<'a, E, Ix>; - - fn next(&mut self) -> Option<Self::Item> { - self.iter.next().map(|(i, edge)| - EdgeReference { - index: edge_index(i), - node: edge.node, - weight: &edge.weight, - } - ) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } -} - -impl<'a, E, Ix> DoubleEndedIterator for EdgeReferences<'a, E, Ix> - where Ix: IndexType -{ - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.next_back().map(|(i, edge)| - EdgeReference { - index: edge_index(i), - node: edge.node, - weight: &edge.weight, - } - ) - } -} - -impl<'a, E, Ix> ExactSizeIterator for EdgeReferences<'a, E, Ix> - where Ix: IndexType -{} - -#[cfg(feature = "stable_graph")] -pub mod stable_graph; -mod frozen; - -/// `Frozen` is a graph wrapper. -/// -/// The `Frozen` only allows shared access (read-only) to the -/// underlying graph `G`, but it allows mutable access to its -/// node and edge weights. -/// -/// This is used to ensure immutability of the graph's structure -/// while permitting weights to be both read and written. -/// -/// See indexing implementations and the traits `Data` and `DataMap` -/// for read-write access to the graph's weights. -pub struct Frozen<'a, G: 'a>(&'a mut G); - diff --git a/vendor/petgraph/src/graph_impl/serialization.rs b/vendor/petgraph/src/graph_impl/serialization.rs deleted file mode 100644 index c400693954..0000000000 --- a/vendor/petgraph/src/graph_impl/serialization.rs +++ /dev/null @@ -1,308 +0,0 @@ - -use serde::de::Error; - -use std::marker::PhantomData; - -use prelude::*; - -use EdgeType; -use graph::Node; -use graph::{IndexType, Edge}; -use serde_utils::MappedSequenceVisitor; -use serde_utils::CollectSeqWithLength; -use serde_utils::{IntoSerializable, FromDeserialized}; - -use super::{NodeIndex, EdgeIndex}; -use serde::{Serialize, Serializer, Deserialize, Deserializer}; - -/// Serialization representation for Graph -/// Keep in sync with deserialization and StableGraph -/// -/// The serialization format is as follows, in Pseudorust: -/// -/// Graph { -/// nodes: [N], -/// node_holes: [NodeIndex<Ix>], -/// edge_property: EdgeProperty, -/// edges: [Option<(NodeIndex<Ix>, NodeIndex<Ix>, E)>] -/// } -/// -/// The same format is used by both Graph and StableGraph. -/// -/// For graph there are restrictions: -/// node_holes is always empty and edges are always Some -/// -/// A stable graph serialization that obeys these restrictions -/// (effectively, it has no interior vacancies) can de deserialized -/// as a graph. -/// -/// Node indices are serialized as integers and are fixed size for -/// binary formats, so the Ix parameter matters there. -#[derive(Serialize)] -#[serde(rename = "Graph")] -#[serde(bound(serialize = "N: Serialize, E: Serialize, Ix: IndexType + Serialize"))] -pub struct SerGraph<'a, N: 'a, E: 'a, Ix: 'a + IndexType> { - #[serde(serialize_with="ser_graph_nodes")] - nodes: &'a [Node<N, Ix>], - node_holes: &'a [NodeIndex<Ix>], - edge_property: EdgeProperty, - #[serde(serialize_with="ser_graph_edges")] - edges: &'a [Edge<E, Ix>], -} - -// Deserialization representation for Graph -// Keep in sync with serialization and StableGraph -#[derive(Deserialize)] -#[serde(rename = "Graph")] -#[serde(bound(deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"))] -pub struct DeserGraph<N, E, Ix> { - #[serde(deserialize_with="deser_graph_nodes")] - nodes: Vec<Node<N, Ix>>, - #[serde(deserialize_with="deser_graph_node_holes")] - #[allow(unused)] - #[serde(default="Vec::new")] - node_holes: Vec<NodeIndex<Ix>>, - edge_property: EdgeProperty, - #[serde(deserialize_with="deser_graph_edges")] - edges: Vec<Edge<E, Ix>>, -} - - -impl<Ix> Serialize for NodeIndex<Ix> - where Ix: IndexType + Serialize, -{ - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer - { - self.0.serialize(serializer) - } -} - -impl<'de, Ix> Deserialize<'de> for NodeIndex<Ix> - where Ix: IndexType + Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where D: Deserializer<'de> - { - Ok(NodeIndex(Ix::deserialize(deserializer)?)) - } -} - -impl<Ix> Serialize for EdgeIndex<Ix> - where Ix: IndexType + Serialize, -{ - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer - { - self.0.serialize(serializer) - } -} - -impl<'de, Ix> Deserialize<'de> for EdgeIndex<Ix> - where Ix: IndexType + Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where D: Deserializer<'de> - { - Ok(EdgeIndex(Ix::deserialize(deserializer)?)) - } -} - -#[derive(Serialize, Deserialize)] -#[serde(rename_all="lowercase")] -#[derive(Debug)] -pub enum EdgeProperty { - Undirected, - Directed, -} - -impl EdgeProperty { - pub fn is_directed(&self) -> bool { - match *self { - EdgeProperty::Directed => true, - EdgeProperty::Undirected => false, - } - } -} - -impl<Ty> From<PhantomData<Ty>> for EdgeProperty where Ty: EdgeType { - fn from(_: PhantomData<Ty>) -> Self { - if Ty::is_directed() { - EdgeProperty::Directed - } else { - EdgeProperty::Undirected - } - } -} - - -impl<Ty> FromDeserialized for PhantomData<Ty> where Ty: EdgeType -{ - type Input = EdgeProperty; - fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2> - where E2: Error - { - if input.is_directed() != Ty::is_directed() { - Err(E2::custom(format_args!("graph edge property mismatch, \ - expected {:?}, found {:?}", - EdgeProperty::from(PhantomData::<Ty>), - input))) - } else { - Ok(PhantomData) - } - } -} - -fn ser_graph_nodes<S, N, Ix>(nodes: &&[Node<N, Ix>], serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer, - N: Serialize, - Ix: Serialize + IndexType, -{ - serializer.collect_seq_exact( - nodes.iter() - .map(|node| &node.weight)) -} - -fn ser_graph_edges<S, E, Ix>(edges: &&[Edge<E, Ix>], serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer, - E: Serialize, - Ix: Serialize + IndexType, -{ - serializer.collect_seq_exact( - edges.iter() - .map(|edge| Some(( - edge.source(), - edge.target(), - &edge.weight, - )))) -} - - -fn deser_graph_nodes<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Node<N, Ix>>, D::Error> - where D: Deserializer<'de>, - N: Deserialize<'de>, - Ix: IndexType + Deserialize<'de>, -{ - deserializer.deserialize_seq(MappedSequenceVisitor::new(|n| - Ok(Node { - weight: n, - next: [EdgeIndex::end(); 2], - }) - )) -} - -fn deser_graph_node_holes<'de, D, Ix>(deserializer: D) -> Result<Vec<NodeIndex<Ix>>, D::Error> - where D: Deserializer<'de>, - Ix: IndexType + Deserialize<'de>, -{ - deserializer.deserialize_seq(MappedSequenceVisitor::<NodeIndex<Ix>, NodeIndex<Ix>, _>::new(|_| { - Err("Graph can not have holes in the node set, found non-empty node_holes") - })) -} - -fn deser_graph_edges<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Edge<N, Ix>>, D::Error> - where D: Deserializer<'de>, - N: Deserialize<'de>, - Ix: IndexType + Deserialize<'de>, -{ - deserializer.deserialize_seq(MappedSequenceVisitor::<Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>, _, _>::new(|x| - if let Some((i, j, w)) = x { - Ok(Edge { - weight: w, - node: [i, j], - next: [EdgeIndex::end(); 2], - }) - } else { - Err("Graph can not have holes in the edge set, found None, expected edge") - } - )) -} - -impl<'a, N, E, Ty, Ix> IntoSerializable for &'a Graph<N, E, Ty, Ix> - where Ix: IndexType, - Ty: EdgeType, -{ - type Output = SerGraph<'a, N, E, Ix>; - fn into_serializable(self) -> Self::Output { - SerGraph { - nodes: &self.nodes, - node_holes: &[], - edges: &self.edges, - edge_property: EdgeProperty::from(PhantomData::<Ty>), - } - } -} - -/// Requires crate feature `"serde-1"` -impl<N, E, Ty, Ix> Serialize for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType + Serialize, - N: Serialize, - E: Serialize, -{ - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer - { - self.into_serializable().serialize(serializer) - } -} - - -pub fn invalid_node_err<E>(node_index: usize, len: usize) -> E where E: Error { - E::custom(format_args!("invalid value: node index `{}` does not exist in graph \ - with node bound {}", - node_index, len)) -} - -pub fn invalid_length_err<Ix, E>(node_or_edge: &str, len: usize) -> E - where E: Error, Ix: IndexType -{ - E::custom(format_args!("invalid size: graph {} count {} exceeds index type maximum {}", - node_or_edge, len, <Ix as IndexType>::max().index())) -} - -impl<'a, N, E, Ty, Ix> FromDeserialized for Graph<N, E, Ty, Ix> - where Ix: IndexType, - Ty: EdgeType, -{ - type Input = DeserGraph<N, E, Ix>; - fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2> - where E2: Error - { - let ty = PhantomData::<Ty>::from_deserialized(input.edge_property)?; - let nodes = input.nodes; - let edges = input.edges; - if nodes.len() >= <Ix as IndexType>::max().index() { - Err(invalid_length_err::<Ix, _>("node", nodes.len()))? - } - - if edges.len() >= <Ix as IndexType>::max().index() { - Err(invalid_length_err::<Ix, _>("edge", edges.len()))? - } - - let mut gr = Graph { - nodes: nodes, - edges: edges, - ty: ty, - }; - let nc = gr.node_count(); - gr.link_edges().map_err(|i| invalid_node_err(i.index(), nc))?; - Ok(gr) - } -} - - -/// Requires crate feature `"serde-1"` -impl<'de, N, E, Ty, Ix> Deserialize<'de> for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType + Deserialize<'de>, - N: Deserialize<'de>, - E: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where D: Deserializer<'de> - { - Self::from_deserialized(DeserGraph::deserialize(deserializer)?) - } -} - diff --git a/vendor/petgraph/src/graph_impl/stable_graph/mod.rs b/vendor/petgraph/src/graph_impl/stable_graph/mod.rs deleted file mode 100644 index 827391e788..0000000000 --- a/vendor/petgraph/src/graph_impl/stable_graph/mod.rs +++ /dev/null @@ -1,1677 +0,0 @@ -//! `StableGraph` keeps indices stable across removals. -//! -//! Depends on `feature = "stable_graph"`. -//! - -use std::cmp; -use std::fmt; -use std::iter; -use std::marker::PhantomData; -use std::mem::replace; -use std::mem::size_of; -use std::ops::{Index, IndexMut}; -use std::slice; - -use { - Graph, - EdgeType, - Directed, - Undirected, - Direction, - Incoming, - Outgoing, -}; - -use iter_format::{ - IterFormatExt, - NoPretty, - DebugMap, -}; -use iter_utils::IterUtilsExt; - -use super::{ - Edge, - index_twice, - Node, - DIRECTIONS, - Pair, - Frozen, -}; -use IntoWeightedEdge; -use visit::{ - EdgeRef, - IntoNodeReferences, - IntoEdges, - IntoEdgesDirected, - IntoEdgeReferences, - NodeIndexable, -}; - -// reexport those things that are shared with Graph -#[doc(no_inline)] -pub use graph::{ - NodeIndex, - EdgeIndex, - GraphIndex, - IndexType, - DefaultIx, - node_index, - edge_index, -}; - -use util::enumerate; - -#[cfg(feature = "serde-1")] -mod serialization; - -/// `StableGraph<N, E, Ty, Ix>` is a graph datastructure using an adjacency -/// list representation. -/// -/// The graph **does not invalidate** any unrelated node or edge indices when -/// items are removed. -/// -/// `StableGraph` is parameterized over: -/// -/// - Associated data `N` for nodes and `E` for edges, also called *weights*. -/// The associated data can be of arbitrary type. -/// - Edge type `Ty` that determines whether the graph edges are directed or undirected. -/// - Index type `Ix`, which determines the maximum size of the graph. -/// -/// The graph uses **O(|V| + |E|)** space, and allows fast node and edge insert -/// and efficient graph search. -/// -/// It implements **O(e')** edge lookup and edge and node removals, where **e'** -/// is some local measure of edge count. -/// -/// - Nodes and edges are each numbered in an interval from *0* to some number -/// *m*, but *not all* indices in the range are valid, since gaps are formed -/// by deletions. -/// -/// - You can select graph index integer type after the size of the graph. A smaller -/// size may have better performance. -/// -/// - Using indices allows mutation while traversing the graph, see `Dfs`. -/// -/// - The `StableGraph` is a regular rust collection and is `Send` and `Sync` -/// (as long as associated data `N` and `E` are). -/// -/// - Indices don't allow as much compile time checking as references. -/// -/// Depends on crate feature `stable_graph` (default). *Stable Graph is still -/// missing a few methods compared to Graph. You can contribute to help it -/// achieve parity.* -pub struct StableGraph<N, E, Ty = Directed, Ix = DefaultIx> -{ - g: Graph<Option<N>, Option<E>, Ty, Ix>, - node_count: usize, - edge_count: usize, - - // node and edge free lists (both work the same way) - // - // free_node, if not NodeIndex::end(), points to a node index - // that is vacant (after a deletion). The next item in the list is kept in - // that Node's Node.next[0] field. For Node, it's a node index stored - // in an EdgeIndex location, and the _into_edge()/_into_node() methods - // convert. - free_node: NodeIndex<Ix>, - free_edge: EdgeIndex<Ix>, -} - -/// A `StableGraph` with directed edges. -/// -/// For example, an edge from *1* to *2* is distinct from an edge from *2* to -/// *1*. -pub type StableDiGraph<N, E, Ix = DefaultIx> = StableGraph<N, E, Directed, Ix>; - -/// A `StableGraph` with undirected edges. -/// -/// For example, an edge between *1* and *2* is equivalent to an edge between -/// *2* and *1*. -pub type StableUnGraph<N, E, Ix = DefaultIx> = StableGraph<N, E, Undirected, Ix>; - -impl<N, E, Ty, Ix> fmt::Debug for StableGraph<N, E, Ty, Ix> - where N: fmt::Debug, - E: fmt::Debug, - Ty: EdgeType, - Ix: IndexType, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let etype = if self.is_directed() { "Directed" } else { "Undirected" }; - let mut fmt_struct = f.debug_struct("StableGraph"); - fmt_struct.field("Ty", &etype); - fmt_struct.field("node_count", &self.node_count); - fmt_struct.field("edge_count", &self.edge_count); - if self.g.edges.iter().any(|e| e.weight.is_some()) { - fmt_struct.field("edges", &self.g.edges.iter() - .filter(|e| e.weight.is_some()) - .map(|e| NoPretty((e.source().index(), e.target().index()))) - .format(", ")); - } - // skip weights if they are ZST! - if size_of::<N>() != 0 { - fmt_struct.field("node weights", - &DebugMap(|| - self.g.nodes.iter() - .map(|n| n.weight.as_ref()) - .enumerate() - .filter_map(|(i, wo)| wo.map(move |w| (i, w))) - )); - } - if size_of::<E>() != 0 { - fmt_struct.field("edge weights", - &DebugMap(|| - self.g.edges.iter() - .map(|n| n.weight.as_ref()) - .enumerate() - .filter_map(|(i, wo)| wo.map(move |w| (i, w))) - )); - } - fmt_struct.field("free_node", &self.free_node); - fmt_struct.field("free_edge", &self.free_edge); - fmt_struct.finish() - } -} - - -impl<N, E> StableGraph<N, E, Directed> { - /// Create a new `StableGraph` with directed edges. - /// - /// This is a convenience method. See `StableGraph::with_capacity` - /// or `StableGraph::default` for a constructor that is generic in all the - /// type parameters of `StableGraph`. - pub fn new() -> Self { - Self::with_capacity(0, 0) - } -} - -impl<N, E, Ty, Ix> StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - /// Create a new `StableGraph` with estimated capacity. - pub fn with_capacity(nodes: usize, edges: usize) -> Self { - StableGraph { - g: Graph::with_capacity(nodes, edges), - node_count: 0, - edge_count: 0, - free_node: NodeIndex::end(), - free_edge: EdgeIndex::end(), - } - } - - /// Return the current node and edge capacity of the graph. - pub fn capacity(&self) -> (usize, usize) { - self.g.capacity() - } - - /// Remove all nodes and edges - pub fn clear(&mut self) { - self.node_count = 0; - self.edge_count = 0; - self.free_node = NodeIndex::end(); - self.free_edge = EdgeIndex::end(); - self.g.clear(); - } - - /// Remove all edges - pub fn clear_edges(&mut self) { - self.edge_count = 0; - self.free_edge = EdgeIndex::end(); - self.g.edges.clear(); - // clear edges without touching the free list - for node in &mut self.g.nodes { - if let Some(_) = node.weight { - node.next = [EdgeIndex::end(), EdgeIndex::end()]; - } - } - } - - /// Return the number of nodes (vertices) in the graph. - /// - /// Computes in **O(1)** time. - pub fn node_count(&self) -> usize { - self.node_count - } - - /// Return the number of edges in the graph. - /// - /// Computes in **O(1)** time. - pub fn edge_count(&self) -> usize { - self.edge_count - } - - /// Whether the graph has directed edges or not. - #[inline] - pub fn is_directed(&self) -> bool { - Ty::is_directed() - } - - /// Add a node (also called vertex) with associated data `weight` to the graph. - /// - /// Computes in **O(1)** time. - /// - /// Return the index of the new node. - /// - /// **Panics** if the `StableGraph` is at the maximum number of nodes for - /// its index type. - pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix> { - let index = if self.free_node != NodeIndex::end() { - let node_idx = self.free_node; - let node_slot = &mut self.g.nodes[node_idx.index()]; - let _old = replace(&mut node_slot.weight, Some(weight)); - debug_assert!(_old.is_none()); - self.free_node = node_slot.next[0]._into_node(); - node_slot.next[0] = EdgeIndex::end(); - node_idx - } else { - self.g.add_node(Some(weight)) - }; - self.node_count += 1; - index - } - - /// free_node: Which free list to update for the vacancy - fn add_vacant_node(&mut self, free_node: &mut NodeIndex<Ix>) { - let node_idx = self.g.add_node(None); - // link the free list - let node_slot = &mut self.g.nodes[node_idx.index()]; - node_slot.next[0] = free_node._into_edge(); - *free_node = node_idx; - } - - /// Remove `a` from the graph if it exists, and return its weight. - /// If it doesn't exist in the graph, return `None`. - /// - /// The node index `a` is invalidated, but none other. - /// Edge indices are invalidated as they would be following the removal of - /// each edge with an endpoint in `a`. - /// - /// Computes in **O(e')** time, where **e'** is the number of affected - /// edges, including *n* calls to `.remove_edge()` where *n* is the number - /// of edges with an endpoint in `a`. - pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N> { - let node_weight = match self.g.nodes.get_mut(a.index()) { - None => return None, - Some(n) => n.weight.take(), - }; - if let None = node_weight { - return None; - } - for d in &DIRECTIONS { - let k = d.index(); - - // Remove all edges from and to this node. - loop { - let next = self.g.nodes[a.index()].next[k]; - if next == EdgeIndex::end() { - break - } - let ret = self.remove_edge(next); - debug_assert!(ret.is_some()); - let _ = ret; - } - } - - let node_slot = &mut self.g.nodes[a.index()]; - //let node_weight = replace(&mut self.g.nodes[a.index()].weight, Entry::Empty(self.free_node)); - //self.g.nodes[a.index()].next = [EdgeIndex::end(), EdgeIndex::end()]; - node_slot.next = [self.free_node._into_edge(), EdgeIndex::end()]; - self.free_node = a; - self.node_count -= 1; - - node_weight - } - - pub fn contains_node(&self, a: NodeIndex<Ix>) -> bool { - self.get_node(a).is_some() - } - - // Return the Node if it is not vacant (non-None weight) - fn get_node(&self, a: NodeIndex<Ix>) -> Option<&Node<Option<N>, Ix>> { - self.g.nodes.get(a.index()) - .and_then(|node| node.weight.as_ref().map(move |_| node)) - } - - /// Add an edge from `a` to `b` to the graph, with its associated - /// data `weight`. - /// - /// Return the index of the new edge. - /// - /// Computes in **O(1)** time. - /// - /// **Panics** if any of the nodes don't exist.<br> - /// **Panics** if the `StableGraph` is at the maximum number of edges for - /// its index type. - /// - /// **Note:** `StableGraph` allows adding parallel (“duplicate”) edges. - pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) - -> EdgeIndex<Ix> - { - let edge_idx; - let mut new_edge = None::<Edge<_, _>>; - { - let edge: &mut Edge<_, _>; - - if self.free_edge != EdgeIndex::end() { - edge_idx = self.free_edge; - edge = &mut self.g.edges[edge_idx.index()]; - let _old = replace(&mut edge.weight, Some(weight)); - debug_assert!(_old.is_none()); - self.free_edge = edge.next[0]; - edge.node = [a, b]; - } else { - edge_idx = EdgeIndex::new(self.g.edges.len()); - assert!(<Ix as IndexType>::max().index() == !0 || EdgeIndex::end() != edge_idx); - new_edge = Some(Edge { - weight: Some(weight), - node: [a, b], - next: [EdgeIndex::end(); 2], - }); - edge = new_edge.as_mut().unwrap(); - } - - let wrong_index = match index_twice(&mut self.g.nodes, a.index(), b.index()) { - Pair::None => Some(cmp::max(a.index(), b.index())), - Pair::One(an) => { - if an.weight.is_none() { - Some(a.index()) - } else { - edge.next = an.next; - an.next[0] = edge_idx; - an.next[1] = edge_idx; - None - } - } - Pair::Both(an, bn) => { - // a and b are different indices - if an.weight.is_none() { - Some(a.index()) - } else if bn.weight.is_none() { - Some(b.index()) - } else { - edge.next = [an.next[0], bn.next[1]]; - an.next[0] = edge_idx; - bn.next[1] = edge_idx; - None - } - } - }; - if let Some(i) = wrong_index { - panic!("StableGraph::add_edge: node index {} is not a node in the graph", i); - } - self.edge_count += 1; - } - if let Some(edge) = new_edge { - self.g.edges.push(edge); - } - edge_idx - } - - /// free_edge: Which free list to update for the vacancy - fn add_vacant_edge(&mut self, free_edge: &mut EdgeIndex<Ix>) { - let edge_idx = EdgeIndex::new(self.g.edges.len()); - debug_assert!(edge_idx != EdgeIndex::end()); - let mut edge = Edge { - weight: None, - node: [NodeIndex::end(); 2], - next: [EdgeIndex::end(); 2], - }; - edge.next[0] = *free_edge; - *free_edge = edge_idx; - self.g.edges.push(edge); - } - - /// Add or update an edge from `a` to `b`. - /// If the edge already exists, its weight is updated. - /// - /// Return the index of the affected edge. - /// - /// Computes in **O(e')** time, where **e'** is the number of edges - /// connected to `a` (and `b`, if the graph edges are undirected). - /// - /// **Panics** if any of the nodes don't exist. - pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) - -> EdgeIndex<Ix> - { - if let Some(ix) = self.find_edge(a, b) { - self[ix] = weight; - return ix; - } - self.add_edge(a, b, weight) - } - - /// Remove an edge and return its edge weight, or `None` if it didn't exist. - /// - /// Invalidates the edge index `e` but no other. - /// - /// Computes in **O(e')** time, where **e'** is the number of edges - /// conneced to the same endpoints as `e`. - pub fn remove_edge(&mut self, e: EdgeIndex<Ix>) -> Option<E> { - // every edge is part of two lists, - // outgoing and incoming edges. - // Remove it from both - let (is_edge, edge_node, edge_next) = match self.g.edges.get(e.index()) { - None => return None, - Some(x) => (x.weight.is_some(), x.node, x.next), - }; - if !is_edge { - return None; - } - - // Remove the edge from its in and out lists by replacing it with - // a link to the next in the list. - self.g.change_edge_links(edge_node, e, edge_next); - - // Clear the edge and put it in the free list - let edge = &mut self.g.edges[e.index()]; - edge.next = [self.free_edge, EdgeIndex::end()]; - edge.node = [NodeIndex::end(), NodeIndex::end()]; - self.free_edge = e; - self.edge_count -= 1; - edge.weight.take() - } - - /// Access the weight for node `a`. - /// - /// Also available with indexing syntax: `&graph[a]`. - pub fn node_weight(&self, a: NodeIndex<Ix>) -> Option<&N> { - match self.g.nodes.get(a.index()) { - Some(no) => no.weight.as_ref(), - None => None, - } - } - - /// Access the weight for node `a`, mutably. - /// - /// Also available with indexing syntax: `&mut graph[a]`. - pub fn node_weight_mut(&mut self, a: NodeIndex<Ix>) -> Option<&mut N> { - match self.g.nodes.get_mut(a.index()) { - Some(no) => no.weight.as_mut(), - None => None, - } - } - - /// Return an iterator over the node indices of the graph - pub fn node_indices(&self) -> NodeIndices<N, Ix> { - NodeIndices { - iter: enumerate(self.raw_nodes()) - } - } - - /// Access the weight for edge `e`. - /// - /// Also available with indexing syntax: `&graph[e]`. - pub fn edge_weight(&self, e: EdgeIndex<Ix>) -> Option<&E> { - match self.g.edges.get(e.index()) { - Some(ed) => ed.weight.as_ref(), - None => None, - } - } - - /// Access the weight for edge `e`, mutably - /// - /// Also available with indexing syntax: `&mut graph[e]`. - pub fn edge_weight_mut(&mut self, e: EdgeIndex<Ix>) -> Option<&mut E> { - match self.g.edges.get_mut(e.index()) { - Some(ed) => ed.weight.as_mut(), - None => None, - } - } - - /// Access the source and target nodes for `e`. - pub fn edge_endpoints(&self, e: EdgeIndex<Ix>) - -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)> - { - match self.g.edges.get(e.index()) { - Some(ed) if ed.weight.is_some() => Some((ed.source(), ed.target())), - _otherwise => None, - } - } - - /// Return an iterator over the node indices of the graph - pub fn edge_indices(&self) -> EdgeIndices<E, Ix> { - EdgeIndices { - iter: enumerate(self.raw_edges()) - } - } - - /// Lookup an edge from `a` to `b`. - /// - /// Computes in **O(e')** time, where **e'** is the number of edges - /// connected to `a` (and `b`, if the graph edges are undirected). - pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>> - { - if !self.is_directed() { - self.find_edge_undirected(a, b).map(|(ix, _)| ix) - } else { - match self.get_node(a) { - None => None, - Some(node) => self.g.find_edge_directed_from_node(node, b) - } - } - } - - /// Lookup an edge between `a` and `b`, in either direction. - /// - /// If the graph is undirected, then this is equivalent to `.find_edge()`. - /// - /// Return the edge index and its directionality, with `Outgoing` meaning - /// from `a` to `b` and `Incoming` the reverse, - /// or `None` if the edge does not exist. - pub fn find_edge_undirected(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<(EdgeIndex<Ix>, Direction)> - { - match self.get_node(a) { - None => None, - Some(node) => self.g.find_edge_undirected_from_node(node, b), - } - } - - - /// Return an iterator of all nodes with an edge starting from `a`. - /// - /// - `Directed`: Outgoing edges from `a`. - /// - `Undirected`: All edges connected to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `NodeIndex<Ix>`. - /// - /// Use [`.neighbors(a).detach()`][1] to get a neighbor walker that does - /// not borrow from the graph. - /// - /// [1]: struct.Neighbors.html#method.detach - pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> { - self.neighbors_directed(a, Outgoing) - } - - /// Return an iterator of all neighbors that have an edge between them and `a`, - /// in the specified direction. - /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*. - /// - /// - `Directed`, `Outgoing`: All edges from `a`. - /// - `Directed`, `Incoming`: All edges to `a`. - /// - `Undirected`: All edges connected to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `NodeIndex<Ix>`. - /// - /// Use [`.neighbors_directed(a, dir).detach()`][1] to get a neighbor walker that does - /// not borrow from the graph. - /// - /// [1]: struct.Neighbors.html#method.detach - pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction) - -> Neighbors<E, Ix> - { - let mut iter = self.neighbors_undirected(a); - if self.is_directed() { - let k = dir.index(); - iter.next[1 - k] = EdgeIndex::end(); - iter.skip_start = NodeIndex::end(); - } - iter - } - - /// Return an iterator of all neighbors that have an edge between them and `a`, - /// in either direction. - /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*. - /// - /// - `Directed` and `Undirected`: All edges connected to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `NodeIndex<Ix>`. - /// - /// Use [`.neighbors_undirected(a).detach()`][1] to get a neighbor walker that does - /// not borrow from the graph. - /// - /// [1]: struct.Neighbors.html#method.detach - pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> - { - Neighbors { - skip_start: a, - edges: &self.g.edges, - next: match self.get_node(a) { - None => [EdgeIndex::end(), EdgeIndex::end()], - Some(n) => n.next, - } - } - } - - /// Return an iterator of all edges of `a`. - /// - /// - `Directed`: Outgoing edges from `a`. - /// - `Undirected`: All edges connected to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `EdgeReference<E, Ix>`. - pub fn edges(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> { - self.edges_directed(a, Outgoing) - } - - /// Return an iterator of all edges of `a`, in the specified direction. - /// - /// - `Directed`, `Outgoing`: All edges from `a`. - /// - `Directed`, `Incoming`: All edges to `a`. - /// - `Undirected`: All edges connected to `a`. - /// - /// Produces an empty iterator if the node `a` doesn't exist.<br> - /// Iterator element type is `EdgeReference<E, Ix>`. - pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix> - { - let mut iter = self.edges_undirected(a); - if self.is_directed() { - iter.direction = Some(dir); - } - if self.is_directed() && dir == Incoming { - iter.next.swap(0, 1); - } - iter - } - - /// Return an iterator over all edges connected to `a`. - /// - /// - `Directed` and `Undirected`: All edges connected to `a`. - /// - /// Produces an empty iterator if the node `a` doesn't exist.<br> - /// Iterator element type is `EdgeReference<E, Ix>`. - fn edges_undirected(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> { - Edges { - skip_start: a, - edges: &self.g.edges, - direction: None, - next: match self.get_node(a) { - None => [EdgeIndex::end(), EdgeIndex::end()], - Some(n) => n.next, - }, - ty: PhantomData, - } - } - - /// Index the `StableGraph` by two indices, any combination of - /// node or edge indices is fine. - /// - /// **Panics** if the indices are equal or if they are out of bounds. - pub fn index_twice_mut<T, U>(&mut self, i: T, j: U) - -> (&mut <Self as Index<T>>::Output, - &mut <Self as Index<U>>::Output) - where Self: IndexMut<T> + IndexMut<U>, - T: GraphIndex, - U: GraphIndex, - { - assert!(T::is_node_index() != U::is_node_index() || - i.index() != j.index()); - - // Allow two mutable indexes here -- they are nonoverlapping - unsafe { - let self_mut = self as *mut _; - (<Self as IndexMut<T>>::index_mut(&mut *self_mut, i), - <Self as IndexMut<U>>::index_mut(&mut *self_mut, j)) - } - } - - /// Keep all nodes that return `true` from the `visit` closure, - /// remove the others. - /// - /// `visit` is provided a proxy reference to the graph, so that - /// the graph can be walked and associated data modified. - /// - /// The order nodes are visited is not specified. - /// - /// The node indices of the removed nodes are invalidated, but none other. - /// Edge indices are invalidated as they would be following the removal of - /// each edge with an endpoint in a removed node. - /// - /// Computes in **O(n + e')** time, where **n** is the number of node indices and - /// **e'** is the number of affected edges, including *n* calls to `.remove_edge()` - /// where *n* is the number of edges with an endpoint in a removed node. - pub fn retain_nodes<F>(&mut self, mut visit: F) where F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool { - for i in 0..self.node_bound() { - let ix = node_index(i); - if self.contains_node(ix) && !visit(Frozen(self), ix) { - self.remove_node(ix); - } - } - self.check_free_lists(); - } - - /// Keep all edges that return `true` from the `visit` closure, - /// remove the others. - /// - /// `visit` is provided a proxy reference to the graph, so that - /// the graph can be walked and associated data modified. - /// - /// The order edges are visited is not specified. - /// - /// The edge indices of the removed edes are invalidated, but none other. - /// - /// Computes in **O(e'')** time, **e'** is the number of affected edges, - /// including the calls to `.remove_edge()` for each removed edge. - pub fn retain_edges<F>(&mut self, mut visit: F) - where F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool - { - for i in 0..self.edge_bound() { - let ix = edge_index(i); - if self.edge_weight(ix).is_some() && !visit(Frozen(self), ix) { - self.remove_edge(ix); - } - } - self.check_free_lists(); - } - - /// Create a new `StableGraph` from an iterable of edges. - /// - /// Node weights `N` are set to default values. - /// Edge weights `E` may either be specified in the list, - /// or they are filled with default values. - /// - /// Nodes are inserted automatically to match the edges. - /// - /// ``` - /// use petgraph::stable_graph::StableGraph; - /// - /// let gr = StableGraph::<(), i32>::from_edges(&[ - /// (0, 1), (0, 2), (0, 3), - /// (1, 2), (1, 3), - /// (2, 3), - /// ]); - /// ``` - pub fn from_edges<I>(iterable: I) -> Self - where I: IntoIterator, - I::Item: IntoWeightedEdge<E>, - <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>, - N: Default, - { - let mut g = Self::with_capacity(0, 0); - g.extend_with_edges(iterable); - g - } - - /// Create a new `StableGraph` by mapping node and - /// edge weights to new values. - /// - /// The resulting graph has the same structure and the same - /// graph indices as `self`. - pub fn map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G) - -> StableGraph<N2, E2, Ty, Ix> - where F: FnMut(NodeIndex<Ix>, &'a N) -> N2, - G: FnMut(EdgeIndex<Ix>, &'a E) -> E2, - { - let g = self.g.map( - move |i, w| w.as_ref().map(|w| node_map(i, w)), - move |i, w| w.as_ref().map(|w| edge_map(i, w))); - StableGraph { - g: g, - node_count: self.node_count, - edge_count: self.edge_count, - free_node: self.free_node, - free_edge: self.free_edge, - } - } - - /// Create a new `StableGraph` by mapping nodes and edges. - /// A node or edge may be mapped to `None` to exclude it from - /// the resulting graph. - /// - /// Nodes are mapped first with the `node_map` closure, then - /// `edge_map` is called for the edges that have not had any endpoint - /// removed. - /// - /// The resulting graph has the structure of a subgraph of the original graph. - /// Nodes and edges that are not removed maintain their old node or edge - /// indices. - pub fn filter_map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G) - -> StableGraph<N2, E2, Ty, Ix> - where F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>, - G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>, - { - let node_bound = self.node_bound(); - let edge_bound = self.edge_bound(); - let mut result_g = StableGraph::with_capacity(node_bound, edge_bound); - // use separate free lists so that - // add_node / add_edge below do not reuse the tombstones - let mut free_node = NodeIndex::end(); - let mut free_edge = EdgeIndex::end(); - - // the stable graph keeps the node map itself - - for (i, node) in enumerate(self.raw_nodes()) { - if i >= node_bound { break; } - if let Some(node_weight) = node.weight.as_ref() { - if let Some(new_weight) = node_map(NodeIndex::new(i), node_weight) { - result_g.add_node(new_weight); - continue; - } - } - result_g.add_vacant_node(&mut free_node); - } - for (i, edge) in enumerate(self.raw_edges()) { - if i >= edge_bound { break; } - let source = edge.source(); - let target = edge.target(); - if let Some(edge_weight) = edge.weight.as_ref() { - if result_g.contains_node(source) && result_g.contains_node(target) { - if let Some(new_weight) = edge_map(EdgeIndex::new(i), edge_weight) { - result_g.add_edge(source, target, new_weight); - continue; - } - } - } - result_g.add_vacant_edge(&mut free_edge); - } - result_g.free_node = free_node; - result_g.free_edge = free_edge; - result_g.check_free_lists(); - result_g - } - - /// Extend the graph from an iterable of edges. - /// - /// Node weights `N` are set to default values. - /// Edge weights `E` may either be specified in the list, - /// or they are filled with default values. - /// - /// Nodes are inserted automatically to match the edges. - pub fn extend_with_edges<I>(&mut self, iterable: I) - where I: IntoIterator, - I::Item: IntoWeightedEdge<E>, - <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>, - N: Default, - { - let iter = iterable.into_iter(); - - for elt in iter { - let (source, target, weight) = elt.into_weighted_edge(); - let (source, target) = (source.into(), target.into()); - let nx = cmp::max(source, target); - while nx.index() >= self.node_count() { - self.add_node(N::default()); - } - self.add_edge(source, target, weight); - } - } - - // - // internal methods - // - fn raw_nodes(&self) -> &[Node<Option<N>, Ix>] { - self.g.raw_nodes() - } - - fn raw_edges(&self) -> &[Edge<Option<E>, Ix>] { - self.g.raw_edges() - } - - fn edge_bound(&self) -> usize { - self.edge_references() - .next_back() - .map_or(0, |edge| edge.id().index() + 1) - } - - #[cfg(feature = "serde-1")] - /// Fix up node and edge links after deserialization - fn link_edges(&mut self) -> Result<(), NodeIndex<Ix>> { - // set up free node list - self.node_count = 0; - self.edge_count = 0; - let mut free_node = NodeIndex::end(); - for (node_index, node) in enumerate(&mut self.g.nodes) { - if node.weight.is_some() { - self.node_count += 1; - } else { - // free node - node.next = [free_node._into_edge(), EdgeIndex::end()]; - free_node = NodeIndex::new(node_index); - } - } - self.free_node = free_node; - - let mut free_edge = EdgeIndex::end(); - for (edge_index, edge) in enumerate(&mut self.g.edges) { - if edge.weight.is_none() { - // free edge - edge.next = [free_edge, EdgeIndex::end()]; - free_edge = EdgeIndex::new(edge_index); - continue; - } - let a = edge.source(); - let b = edge.target(); - let edge_idx = EdgeIndex::new(edge_index); - match index_twice(&mut self.g.nodes, a.index(), b.index()) { - Pair::None => return Err(if a > b { a } else { b }), - Pair::One(an) => { - edge.next = an.next; - an.next[0] = edge_idx; - an.next[1] = edge_idx; - } - Pair::Both(an, bn) => { - // a and b are different indices - edge.next = [an.next[0], bn.next[1]]; - an.next[0] = edge_idx; - bn.next[1] = edge_idx; - } - } - self.edge_count += 1; - } - self.free_edge = free_edge; - Ok(()) - } - - #[cfg(not(debug_assertions))] - fn check_free_lists(&self) { } - #[cfg(debug_assertions)] - // internal method to debug check the free lists (linked lists) - fn check_free_lists(&self) { - let mut free_node = self.free_node; - let mut free_node_len = 0; - while free_node != NodeIndex::end() { - if let Some(n) = self.g.nodes.get(free_node.index()) { - if let None = n.weight { - free_node = n.next[0]._into_node(); - free_node_len += 1; - continue; - } - debug_assert!(false, "Corrupt free list: pointing to existing {:?}", - free_node.index()); - } - debug_assert!(false, "Corrupt free list: missing {:?}", free_node.index()); - } - debug_assert_eq!(self.node_count(), self.raw_nodes().len() - free_node_len); - - let mut free_edge_len = 0; - let mut free_edge = self.free_edge; - while free_edge != EdgeIndex::end() { - if let Some(n) = self.g.edges.get(free_edge.index()) { - if let None = n.weight { - free_edge = n.next[0]; - free_edge_len += 1; - continue; - } - debug_assert!(false, "Corrupt free list: pointing to existing {:?}", - free_node.index()); - } - debug_assert!(false, "Corrupt free list: missing {:?}", free_edge.index()); - } - debug_assert_eq!(self.edge_count(), self.raw_edges().len() - free_edge_len); - } -} - -/// The resulting cloned graph has the same graph indices as `self`. -impl<N, E, Ty, Ix: IndexType> Clone for StableGraph<N, E, Ty, Ix> - where N: Clone, E: Clone, -{ - fn clone(&self) -> Self { - StableGraph { - g: self.g.clone(), - node_count: self.node_count, - edge_count: self.edge_count, - free_node: self.free_node, - free_edge: self.free_edge, - } - } - - fn clone_from(&mut self, rhs: &Self) { - self.g.clone_from(&rhs.g); - self.node_count = rhs.node_count; - self.edge_count = rhs.edge_count; - self.free_node = rhs.free_node; - self.free_edge = rhs.free_edge; - } -} - -/// Index the `StableGraph` by `NodeIndex` to access node weights. -/// -/// **Panics** if the node doesn't exist. -impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - type Output = N; - fn index(&self, index: NodeIndex<Ix>) -> &N { - self.node_weight(index).unwrap() - } -} - -/// Index the `StableGraph` by `NodeIndex` to access node weights. -/// -/// **Panics** if the node doesn't exist. -impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - fn index_mut(&mut self, index: NodeIndex<Ix>) -> &mut N { - self.node_weight_mut(index).unwrap() - } - -} - -/// Index the `StableGraph` by `EdgeIndex` to access edge weights. -/// -/// **Panics** if the edge doesn't exist. -impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - type Output = E; - fn index(&self, index: EdgeIndex<Ix>) -> &E { - self.edge_weight(index).unwrap() - } -} - -/// Index the `StableGraph` by `EdgeIndex` to access edge weights. -/// -/// **Panics** if the edge doesn't exist. -impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - fn index_mut(&mut self, index: EdgeIndex<Ix>) -> &mut E { - self.edge_weight_mut(index).unwrap() - } -} - -/// Create a new empty `StableGraph`. -impl<N, E, Ty, Ix> Default for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn default() -> Self { Self::with_capacity(0, 0) } -} - -/// Convert a `Graph` into a `StableGraph` -/// -/// Computes in **O(|V| + |E|)** time. -/// -/// The resulting graph has the same node and edge indices as -/// the original graph. -impl<N, E, Ty, Ix> From<Graph<N, E, Ty, Ix>> for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn from(g: Graph<N, E, Ty, Ix>) -> Self { - let nodes = g.nodes.into_iter().map(|e| Node { - weight: Some(e.weight), - next: e.next, - }); - let edges = g.edges.into_iter().map(|e| Edge { - weight: Some(e.weight), - node: e.node, - next: e.next, - }); - StableGraph { - node_count: nodes.len(), - edge_count: edges.len(), - g: Graph { edges: edges.collect(), nodes: nodes.collect(), ty: g.ty }, - free_node: NodeIndex::end(), - free_edge: EdgeIndex::end(), - } - } -} - -/// Convert a `StableGraph` into a `Graph` -/// -/// Computes in **O(|V| + |E|)** time. -/// -/// This translates the stable graph into a graph with node and edge indices in -/// a compact interval without holes (like `Graph`s always are). -/// -/// Only if the stable graph had no vacancies after deletions (if node bound was -/// equal to node count, and the same for edges), would the resulting graph have -/// the same node and edge indices as the input. -impl<N, E, Ty, Ix> From<StableGraph<N, E, Ty, Ix>> for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn from(graph: StableGraph<N, E, Ty, Ix>) -> Self { - let mut result_g = Graph::with_capacity(graph.node_count(), graph.edge_count()); - // mapping from old node index to new node index - let mut node_index_map = vec![NodeIndex::end(); graph.node_bound()]; - - for (i, node) in enumerate(graph.g.nodes) { - if let Some(nw) = node.weight { - node_index_map[i] = result_g.add_node(nw); - } - } - for edge in graph.g.edges { - let source_index = edge.source().index(); - let target_index = edge.target().index(); - if let Some(ew) = edge.weight { - let source = node_index_map[source_index]; - let target = node_index_map[target_index]; - debug_assert!(source != NodeIndex::end()); - debug_assert!(target != NodeIndex::end()); - result_g.add_edge(source, target, ew); - } - } - result_g - } -} - -impl<'a, N, E, Ty, Ix> IntoNodeReferences for &'a StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NodeRef = (NodeIndex<Ix>, &'a N); - type NodeReferences = NodeReferences<'a, N, Ix>; - fn node_references(self) -> Self::NodeReferences { - NodeReferences { - iter: enumerate(self.raw_nodes()) - } - } -} - -/// Iterator over all nodes of a graph. -pub struct NodeReferences<'a, N: 'a, Ix: IndexType = DefaultIx> { - iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>, -} - -impl<'a, N, Ix> Iterator for NodeReferences<'a, N, Ix> - where Ix: IndexType -{ - type Item = (NodeIndex<Ix>, &'a N); - - fn next(&mut self) -> Option<Self::Item> { - self.iter.ex_find_map(|(i, node)| { - node.weight.as_ref().map(move |w| (node_index(i), w)) - }) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let (_, hi) = self.iter.size_hint(); - (0, hi) - } -} - -impl<'a, N, Ix> DoubleEndedIterator for NodeReferences<'a, N, Ix> - where Ix: IndexType -{ - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.ex_rfind_map(|(i, node)| { - node.weight.as_ref().map(move |w| (node_index(i), w)) - }) - } -} - -/// Reference to a `StableGraph` edge. -#[derive(Debug)] -pub struct EdgeReference<'a, E: 'a, Ix = DefaultIx> { - index: EdgeIndex<Ix>, - node: [NodeIndex<Ix>; 2], - weight: &'a E, -} - -impl<'a, E, Ix: IndexType> Clone for EdgeReference<'a, E, Ix> { - fn clone(&self) -> Self { - *self - } -} - -impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> { } - -impl<'a, E, Ix: IndexType> PartialEq for EdgeReference<'a, E, Ix> - where E: PartialEq, -{ - fn eq(&self, rhs: &Self) -> bool { - self.index == rhs.index && self.weight == rhs.weight - } -} - -impl<'a, Ix, E> EdgeReference<'a, E, Ix> - where Ix: IndexType, -{ - /// Access the edge’s weight. - /// - /// **NOTE** that this method offers a longer lifetime - /// than the trait (unfortunately they don't match yet). - pub fn weight(&self) -> &'a E { self.weight } -} - -impl<'a, Ix, E> EdgeRef for EdgeReference<'a, E, Ix> - where Ix: IndexType, -{ - type NodeId = NodeIndex<Ix>; - type EdgeId = EdgeIndex<Ix>; - type Weight = E; - - fn source(&self) -> Self::NodeId { self.node[0] } - fn target(&self) -> Self::NodeId { self.node[1] } - fn weight(&self) -> &E { self.weight } - fn id(&self) -> Self::EdgeId { self.index } -} - -impl<'a, N, E, Ty, Ix> IntoEdges for &'a StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Edges = Edges<'a, E, Ty, Ix>; - fn edges(self, a: Self::NodeId) -> Self::Edges { - self.edges(a) - } -} - -impl<'a, N, E, Ty, Ix> IntoEdgesDirected for &'a StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type EdgesDirected = Edges<'a, E, Ty, Ix>; - fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected { - self.edges_directed(a, dir) - } -} - - -/// Iterator over the edges of from or to a node -pub struct Edges<'a, E: 'a, Ty, Ix: 'a = DefaultIx> - where Ty: EdgeType, - Ix: IndexType, -{ - /// starting node to skip over - skip_start: NodeIndex<Ix>, - edges: &'a [Edge<Option<E>, Ix>], - - /// Next edge to visit. - /// If we are only following one direction, we only use next[0] regardless. - next: [EdgeIndex<Ix>; 2], - - /// Which direction to follow - /// None: Both, - /// Some(d): d if Directed, Both if Undirected - direction: Option<Direction>, - ty: PhantomData<Ty>, -} - -impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Item = EdgeReference<'a, E, Ix>; - - fn next(&mut self) -> Option<Self::Item> { - // First the outgoing or incoming edges (directionality) - let k = self.direction.unwrap_or(Outgoing).index(); - let i = self.next[0].index(); - match self.edges.get(i) { - None => {} - Some(&Edge { ref node, weight: Some(ref weight), ref next }) => { - self.next[0] = next[k]; - return Some(EdgeReference { - index: edge_index(i), - node: *node, - weight: weight, - }); - } - Some(_otherwise) => unreachable!(), - } - // Stop here if we only follow one direction - if self.direction.is_some() { - return None; - } - // Then incoming edges - // For an "undirected" iterator (traverse both incoming - // and outgoing edge lists), make sure we don't double - // count selfloops by skipping them in the incoming list. - - // We reach here if self.direction was None or Outgoing. - debug_assert_eq!(k, 0); - while let Some(edge) = self.edges.get(self.next[1].index()) { - debug_assert!(edge.weight.is_some()); - let i = self.next[1].index(); - self.next[1] = edge.next[1]; - if edge.node[0] != self.skip_start { - return Some(EdgeReference { - index: edge_index(i), - node: swap_pair(edge.node), - weight: edge.weight.as_ref().unwrap(), - }); - } - } - None - } -} - -fn swap_pair<T>(mut x: [T; 2]) -> [T; 2] { - x.swap(0, 1); - x -} - -impl<'a, N: 'a, E: 'a, Ty, Ix> IntoEdgeReferences for &'a StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type EdgeRef = EdgeReference<'a, E, Ix>; - type EdgeReferences = EdgeReferences<'a, E, Ix>; - - /// Create an iterator over all edges in the graph, in indexed order. - /// - /// Iterator element type is `EdgeReference<E, Ix>`. - fn edge_references(self) -> Self::EdgeReferences { - EdgeReferences { - iter: self.g.edges.iter().enumerate() - } - } - -} - -/// Iterator over all edges of a graph. -pub struct EdgeReferences<'a, E: 'a, Ix: 'a = DefaultIx> { - iter: iter::Enumerate<slice::Iter<'a, Edge<Option<E>, Ix>>>, -} - -impl<'a, E, Ix> Iterator for EdgeReferences<'a, E, Ix> - where Ix: IndexType -{ - type Item = EdgeReference<'a, E, Ix>; - - fn next(&mut self) -> Option<Self::Item> { - self.iter.ex_find_map(|(i, edge)| - edge.weight.as_ref().map(move |weight| { - EdgeReference { - index: edge_index(i), - node: edge.node, - weight: weight, - } - })) - } -} - -impl<'a, E, Ix> DoubleEndedIterator for EdgeReferences<'a, E, Ix> - where Ix: IndexType -{ - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.ex_rfind_map(|(i, edge)| - edge.weight.as_ref().map(move |weight| { - EdgeReference { - index: edge_index(i), - node: edge.node, - weight: weight, - } - })) - } -} - - -/// Iterator over the neighbors of a node. -/// -/// Iterator element type is `NodeIndex`. -pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx> -{ - /// starting node to skip over - skip_start: NodeIndex<Ix>, - edges: &'a [Edge<Option<E>, Ix>], - next: [EdgeIndex<Ix>; 2], -} - -impl<'a, E, Ix> Neighbors<'a, E, Ix> - where Ix: IndexType, -{ - /// Return a “walker” object that can be used to step through the - /// neighbors and edges from the origin node. - /// - /// Note: The walker does not borrow from the graph, this is to allow mixing - /// edge walking with mutating the graph's weights. - pub fn detach(&self) -> WalkNeighbors<Ix> { - WalkNeighbors { - inner: super::WalkNeighbors { - skip_start: self.skip_start, - next: self.next - }, - } - } -} - -impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix> where - Ix: IndexType, -{ - type Item = NodeIndex<Ix>; - - fn next(&mut self) -> Option<NodeIndex<Ix>> { - // First any outgoing edges - match self.edges.get(self.next[0].index()) { - None => {} - Some(edge) => { - debug_assert!(edge.weight.is_some()); - self.next[0] = edge.next[0]; - return Some(edge.node[1]); - } - } - // Then incoming edges - // For an "undirected" iterator (traverse both incoming - // and outgoing edge lists), make sure we don't double - // count selfloops by skipping them in the incoming list. - while let Some(edge) = self.edges.get(self.next[1].index()) { - debug_assert!(edge.weight.is_some()); - self.next[1] = edge.next[1]; - if edge.node[0] != self.skip_start { - return Some(edge.node[0]); - } - } - None - } -} - -/// A “walker” object that can be used to step through the edge list of a node. -/// -/// See [*.detach()*](struct.Neighbors.html#method.detach) for more information. -/// -/// The walker does not borrow from the graph, so it lets you step through -/// neighbors or incident edges while also mutating graph weights, as -/// in the following example: -/// -/// ``` -/// use petgraph::visit::Dfs; -/// use petgraph::Incoming; -/// use petgraph::stable_graph::StableGraph; -/// -/// let mut gr = StableGraph::new(); -/// let a = gr.add_node(0.); -/// let b = gr.add_node(0.); -/// let c = gr.add_node(0.); -/// gr.add_edge(a, b, 3.); -/// gr.add_edge(b, c, 2.); -/// gr.add_edge(c, b, 1.); -/// -/// // step through the graph and sum incoming edges into the node weight -/// let mut dfs = Dfs::new(&gr, a); -/// while let Some(node) = dfs.next(&gr) { -/// // use a detached neighbors walker -/// let mut edges = gr.neighbors_directed(node, Incoming).detach(); -/// while let Some(edge) = edges.next_edge(&gr) { -/// gr[node] += gr[edge]; -/// } -/// } -/// -/// // check the result -/// assert_eq!(gr[a], 0.); -/// assert_eq!(gr[b], 4.); -/// assert_eq!(gr[c], 2.); -/// ``` -pub struct WalkNeighbors<Ix> { - inner: super::WalkNeighbors<Ix>, -} - -impl<Ix: IndexType> Clone for WalkNeighbors<Ix> { - clone_fields!(WalkNeighbors, inner); -} - -impl<Ix: IndexType> WalkNeighbors<Ix> { - /// Step to the next edge and its endpoint node in the walk for graph `g`. - /// - /// The next node indices are always the others than the starting point - /// where the `WalkNeighbors` value was created. - /// For an `Outgoing` walk, the target nodes, - /// for an `Incoming` walk, the source nodes of the edge. - pub fn next<N, E, Ty: EdgeType>(&mut self, g: &StableGraph<N, E, Ty, Ix>) - -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> { - self.inner.next(&g.g) - } - - pub fn next_node<N, E, Ty: EdgeType>(&mut self, g: &StableGraph<N, E, Ty, Ix>) - -> Option<NodeIndex<Ix>> - { - self.next(g).map(|t| t.1) - } - - pub fn next_edge<N, E, Ty: EdgeType>(&mut self, g: &StableGraph<N, E, Ty, Ix>) - -> Option<EdgeIndex<Ix>> - { - self.next(g).map(|t| t.0) - } -} - -/// Iterator over the node indices of a graph. -pub struct NodeIndices<'a, N: 'a, Ix: 'a = DefaultIx> { - iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>, -} - -impl<'a, N, Ix: IndexType> Iterator for NodeIndices<'a, N, Ix> { - type Item = NodeIndex<Ix>; - - fn next(&mut self) -> Option<Self::Item> { - self.iter.ex_find_map(|(i, node)| { - if node.weight.is_some() { - Some(node_index(i)) - } else { None } - }) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let (_, hi) = self.iter.size_hint(); - (0, hi) - } -} - -impl<'a, N, Ix: IndexType> DoubleEndedIterator for NodeIndices<'a, N, Ix> { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.ex_rfind_map(|(i, node)| { - if node.weight.is_some() { - Some(node_index(i)) - } else { None } - }) - } -} - -impl<N, E, Ty, Ix> NodeIndexable for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - /// Return an upper bound of the node indices in the graph - fn node_bound(&self) -> usize { - self.node_indices() - .next_back() - .map_or(0, |i| i.index() + 1) - } - fn to_index(&self, ix: NodeIndex<Ix>) -> usize { ix.index() } - fn from_index(&self, ix: usize) -> Self::NodeId { NodeIndex::new(ix) } -} - -/// Iterator over the edge indices of a graph. -pub struct EdgeIndices<'a, E: 'a, Ix: 'a = DefaultIx> { - iter: iter::Enumerate<slice::Iter<'a, Edge<Option<E>, Ix>>>, -} - -impl<'a, E, Ix: IndexType> Iterator for EdgeIndices<'a, E, Ix> { - type Item = EdgeIndex<Ix>; - - fn next(&mut self) -> Option<Self::Item> { - self.iter.ex_find_map(|(i, node)| { - if node.weight.is_some() { - Some(edge_index(i)) - } else { None } - }) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - let (_, hi) = self.iter.size_hint(); - (0, hi) - } -} - -impl<'a, E, Ix: IndexType> DoubleEndedIterator for EdgeIndices<'a, E, Ix> { - fn next_back(&mut self) -> Option<Self::Item> { - self.iter.ex_rfind_map(|(i, node)| { - if node.weight.is_some() { - Some(edge_index(i)) - } else { None } - }) - } -} - - -#[test] -fn stable_graph() { - let mut gr = StableGraph::<_, _>::with_capacity(0, 0); - let a = gr.add_node(0); - let b = gr.add_node(1); - let c = gr.add_node(2); - let _ed = gr.add_edge(a, b, 1); - println!("{:?}", gr); - gr.remove_node(b); - println!("{:?}", gr); - let d = gr.add_node(3); - println!("{:?}", gr); - gr.check_free_lists(); - gr.remove_node(a); - gr.check_free_lists(); - gr.remove_node(c); - gr.check_free_lists(); - println!("{:?}", gr); - gr.add_edge(d, d, 2); - println!("{:?}", gr); - - let e = gr.add_node(4); - gr.add_edge(d, e, 3); - println!("{:?}", gr); - for neigh in gr.neighbors(d) { - println!("edge {:?} -> {:?}", d, neigh); - } - gr.check_free_lists(); -} - -#[test] -fn dfs() { - use visit::Dfs; - - let mut gr = StableGraph::<_, _>::with_capacity(0, 0); - let a = gr.add_node("a"); - let b = gr.add_node("b"); - let c = gr.add_node("c"); - let d = gr.add_node("d"); - gr.add_edge(a, b, 1); - gr.add_edge(a, c, 2); - gr.add_edge(b, c, 3); - gr.add_edge(b, d, 4); - gr.add_edge(c, d, 5); - gr.add_edge(d, b, 6); - gr.add_edge(c, b, 7); - println!("{:?}", gr); - - let mut dfs = Dfs::new(&gr, a); - while let Some(next) = dfs.next(&gr) { - println!("dfs visit => {:?}, weight={:?}", next, &gr[next]); - } -} - -#[test] -fn test_retain_nodes() { - let mut gr = StableGraph::<_, _>::with_capacity(6, 6); - let a = gr.add_node("a"); - let f = gr.add_node("f"); - let b = gr.add_node("b"); - let c = gr.add_node("c"); - let d = gr.add_node("d"); - let e = gr.add_node("e"); - gr.add_edge(a, b, 1); - gr.add_edge(a, c, 2); - gr.add_edge(b, c, 3); - gr.add_edge(b, d, 4); - gr.add_edge(c, d, 5); - gr.add_edge(d, b, 6); - gr.add_edge(c, b, 7); - gr.add_edge(d, e, 8); - gr.remove_node(f); - - assert_eq!(gr.node_count(), 5); - assert_eq!(gr.edge_count(), 8); - gr.retain_nodes(|frozen_gr, ix| {frozen_gr[ix] >= "c"}); - assert_eq!(gr.node_count(), 3); - assert_eq!(gr.edge_count(), 2); - - gr.check_free_lists(); -} diff --git a/vendor/petgraph/src/graph_impl/stable_graph/serialization.rs b/vendor/petgraph/src/graph_impl/stable_graph/serialization.rs deleted file mode 100644 index e44aa21cfd..0000000000 --- a/vendor/petgraph/src/graph_impl/stable_graph/serialization.rs +++ /dev/null @@ -1,270 +0,0 @@ - - -use serde::de::Error; -use serde::{Serialize, Serializer, Deserialize, Deserializer}; - -use std::marker::PhantomData; - -use prelude::*; - -use EdgeType; -use graph::Node; -use graph::{IndexType, Edge}; -use stable_graph::StableGraph; -use util::rev; -use serde_utils::MappedSequenceVisitor; -use serde_utils::CollectSeqWithLength; -use serde_utils::{IntoSerializable, FromDeserialized}; -use visit::NodeIndexable; - -use super::super::serialization::{EdgeProperty, invalid_length_err, invalid_node_err}; - -// Serialization representation for StableGraph -// Keep in sync with deserialization and Graph -#[derive(Serialize)] -#[serde(rename = "Graph")] -#[serde(bound(serialize = "N: Serialize, E: Serialize, Ix: IndexType + Serialize"))] -pub struct SerStableGraph<'a, N: 'a, E: 'a, Ix: 'a + IndexType> { - nodes: Somes<&'a [Node<Option<N>, Ix>]>, - node_holes: Holes<&'a [Node<Option<N>, Ix>]>, - edge_property: EdgeProperty, - #[serde(serialize_with="ser_stable_graph_edges")] - edges: &'a [Edge<Option<E>, Ix>], -} - -// Deserialization representation for StableGraph -// Keep in sync with serialization and Graph -#[derive(Deserialize)] -#[serde(rename = "Graph")] -#[serde(bound(deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"))] -pub struct DeserStableGraph<N, E, Ix> { - #[serde(deserialize_with="deser_stable_graph_nodes")] - nodes: Vec<Node<Option<N>, Ix>>, - #[serde(default="Vec::new")] - node_holes: Vec<NodeIndex<Ix>>, - edge_property: EdgeProperty, - #[serde(deserialize_with="deser_stable_graph_edges")] - edges: Vec<Edge<Option<E>, Ix>>, -} - -/// Somes are the present node weights N, with known length. -struct Somes<T>(usize, T); - -impl<'a, N, Ix> Serialize for Somes<&'a [Node<Option<N>, Ix>]> - where N: Serialize, -{ - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer, - { - serializer.collect_seq_with_length(self.0, - self.1.iter().filter_map(|node| node.weight.as_ref())) - } -} - -/// Holes are the node indices of vacancies, with known length -struct Holes<T>(usize, T); - -impl<'a, N, Ix> Serialize for Holes<&'a [Node<Option<N>, Ix>]> - where Ix: Serialize + IndexType, -{ - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer, - { - serializer.collect_seq_with_length(self.0, - self.1.iter() - .enumerate() - .filter_map(|(i, node)| if node.weight.is_none() { - Some(NodeIndex::<Ix>::new(i)) - } else { - None - })) - } -} - -fn ser_stable_graph_edges<S, E, Ix>(edges: &&[Edge<Option<E>, Ix>], serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer, - E: Serialize, - Ix: Serialize + IndexType, -{ - serializer.collect_seq_exact( - edges.iter() - .map(|edge| edge.weight.as_ref().map(|w| ( - edge.source(), - edge.target(), - w - )))) -} - -fn deser_stable_graph_nodes<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Node<Option<N>, Ix>>, D::Error> - where D: Deserializer<'de>, - N: Deserialize<'de>, - Ix: IndexType + Deserialize<'de>, -{ - deserializer.deserialize_seq(MappedSequenceVisitor::new(|n| - Ok(Node { - weight: Some(n), - next: [EdgeIndex::end(); 2], - }) - )) -} - -fn deser_stable_graph_edges<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Edge<Option<N>, Ix>>, D::Error> - where D: Deserializer<'de>, - N: Deserialize<'de>, - Ix: IndexType + Deserialize<'de>, -{ - deserializer.deserialize_seq(MappedSequenceVisitor::<Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>, _, _>::new(|x| - if let Some((i, j, w)) = x { - Ok(Edge { - weight: Some(w), - node: [i, j], - next: [EdgeIndex::end(); 2], - }) - } else { - Ok(Edge { - weight: None, - node: [NodeIndex::end(); 2], - next: [EdgeIndex::end(); 2], - }) - } - )) -} - -impl<'a, N, E, Ty, Ix> IntoSerializable for &'a StableGraph<N, E, Ty, Ix> - where Ix: IndexType, - Ty: EdgeType, -{ - type Output = SerStableGraph<'a, N, E, Ix>; - fn into_serializable(self) -> Self::Output { - let nodes = &self.raw_nodes()[..self.node_bound()]; - let node_count = self.node_count(); - let hole_count = nodes.len() - node_count; - let edges = &self.raw_edges()[..self.edge_bound()]; - SerStableGraph { - nodes: Somes(node_count, nodes), - node_holes: Holes(hole_count, nodes), - edges: edges, - edge_property: EdgeProperty::from(PhantomData::<Ty>), - } - } -} - -/// Requires crate feature `"serde-1"` -impl<N, E, Ty, Ix> Serialize for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType + Serialize, - N: Serialize, - E: Serialize, -{ - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer - { - self.into_serializable().serialize(serializer) - } -} - -impl<'a, N, E, Ty, Ix> FromDeserialized for StableGraph<N, E, Ty, Ix> - where Ix: IndexType, - Ty: EdgeType, -{ - type Input = DeserStableGraph<N, E, Ix>; - fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2> - where E2: Error - { - let ty = PhantomData::<Ty>::from_deserialized(input.edge_property)?; - let mut nodes = input.nodes; - let node_holes = input.node_holes; - let edges = input.edges; - if edges.len() >= <Ix as IndexType>::max().index() { - Err(invalid_length_err::<Ix, _>("edge", edges.len()))? - } - - // insert Nones for each hole - let mut offset = node_holes.len(); - let node_bound = node_holes.len() + nodes.len(); - for hole_pos in rev(node_holes) { - offset -= 1; - if hole_pos.index() >= node_bound { - Err(invalid_node_err(hole_pos.index(), node_bound))?; - } - let insert_pos = hole_pos.index() - offset; - nodes.insert(insert_pos, Node { - weight: None, - next: [EdgeIndex::end(); 2], - }); - } - - if nodes.len() >= <Ix as IndexType>::max().index() { - Err(invalid_length_err::<Ix, _>("node", nodes.len()))? - } - - let node_bound = nodes.len(); - let mut sgr = StableGraph { - g: Graph { - nodes: nodes, - edges: edges, - ty: ty, - }, - node_count: 0, - edge_count: 0, - free_edge: EdgeIndex::end(), - free_node: NodeIndex::end(), - }; - sgr.link_edges().map_err(|i| invalid_node_err(i.index(), node_bound))?; - Ok(sgr) - } -} - -/// Requires crate feature `"serde-1"` -impl<'de, N, E, Ty, Ix> Deserialize<'de> for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType + Deserialize<'de>, - N: Deserialize<'de>, - E: Deserialize<'de>, -{ - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where D: Deserializer<'de> - { - Self::from_deserialized(DeserStableGraph::deserialize(deserializer)?) - } -} - -#[test] -fn test_from_deserialized_with_holes() { - use graph::node_index; - use stable_graph::StableUnGraph; - use serde::de::value::Error as SerdeError; - use itertools::assert_equal; - - let input = DeserStableGraph::<_, (), u32> { - nodes: vec![ - Node { - weight: Some(1), - next: [EdgeIndex::end(); 2], - }, - Node { - weight: Some(4), - next: [EdgeIndex::end(); 2], - }, - Node { - weight: Some(5), - next: [EdgeIndex::end(); 2], - }, - ], - node_holes: vec![ - node_index(0), - node_index(2), - node_index(3), - node_index(6), - ], - edges: vec![], - edge_property: EdgeProperty::Undirected, - }; - let graph = StableUnGraph::from_deserialized::<SerdeError>(input).unwrap(); - - assert_eq!(graph.node_count(), 3); - assert_equal( - graph.raw_nodes().iter().map(|n| n.weight.as_ref().cloned()), - vec![None, Some(1), None, None, Some(4), Some(5), None]); -} - diff --git a/vendor/petgraph/src/graphmap.rs b/vendor/petgraph/src/graphmap.rs deleted file mode 100644 index 945abe0940..0000000000 --- a/vendor/petgraph/src/graphmap.rs +++ /dev/null @@ -1,886 +0,0 @@ -//! `GraphMap<N, E, Ty>` is a graph datastructure where node values are mapping -//! keys. - -use std::cmp::Ordering; -use std::hash::{self, Hash}; -use std::iter::{ - Cloned, - DoubleEndedIterator, -}; -use std::slice::{ - Iter, -}; -use std::fmt; -use std::ops::{Index, IndexMut, Deref}; -use std::iter::FromIterator; -use std::marker::PhantomData; -use ordermap::OrderMap; -use ordermap::{ - Iter as OrderMapIter, IterMut as OrderMapIterMut -}; -use ordermap::Keys; - -use { - EdgeType, - Directed, - Undirected, - Direction, - Incoming, - Outgoing, -}; - -use IntoWeightedEdge; -use visit::{IntoNodeIdentifiers, NodeCount, IntoNodeReferences, NodeIndexable}; -use visit::{NodeCompactIndexable, IntoEdgeReferences, IntoEdges}; -use graph::Graph; -use graph::node_index; - -/// A `GraphMap` with undirected edges. -/// -/// For example, an edge between *1* and *2* is equivalent to an edge between -/// *2* and *1*. -pub type UnGraphMap<N, E> = GraphMap<N, E, Undirected>; -/// A `GraphMap` with directed edges. -/// -/// For example, an edge from *1* to *2* is distinct from an edge from *2* to -/// *1*. -pub type DiGraphMap<N, E> = GraphMap<N, E, Directed>; - -/// `GraphMap<N, E, Ty>` is a graph datastructure using an associative array -/// of its node weights `N`. -/// -/// It uses an combined adjacency list and sparse adjacency matrix -/// representation, using **O(|V| + |E|)** space, and allows testing for edge -/// existance in constant time. -/// -/// `GraphMap` is parameterized over: -/// -/// - Associated data `N` for nodes and `E` for edges, called *weights*. -/// - The node weight `N` must implement `Copy` and will be used as node -/// identifier, duplicated into several places in the data structure. -/// It must be suitable as a hash table key (implementing `Eq + Hash`). -/// The node type must also implement `Ord` so that the implementation can -/// order the pair (`a`, `b`) for an edge connecting any two nodes `a` and `b`. -/// - `E` can be of arbitrary type. -/// - Edge type `Ty` that determines whether the graph edges are directed or -/// undirected. -/// -/// You can use the type aliases `UnGraphMap` and `DiGraphMap` for convenience. -/// -/// `GraphMap` does not allow parallel edges, but self loops are allowed. -/// -/// Depends on crate feature `graphmap` (default). -#[derive(Clone)] -pub struct GraphMap<N, E, Ty> { - nodes: OrderMap<N, Vec<(N, CompactDirection)>>, - edges: OrderMap<(N, N), E>, - ty: PhantomData<Ty>, -} - -impl<N: Eq + Hash + fmt::Debug, E: fmt::Debug, Ty: EdgeType> fmt::Debug for GraphMap<N, E, Ty> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.nodes.fmt(f) - } -} - -/// A trait group for `GraphMap`'s node identifier. -pub trait NodeTrait : Copy + Ord + Hash {} -impl<N> NodeTrait for N where N: Copy + Ord + Hash {} - -// non-repr(usize) version of Direction -#[derive(Copy, Clone, Debug, PartialEq)] -enum CompactDirection { - Outgoing, - Incoming, -} - -impl From<Direction> for CompactDirection { - fn from(d: Direction) -> Self { - match d { - Outgoing => CompactDirection::Outgoing, - Incoming => CompactDirection::Incoming, - } - } -} - -impl PartialEq<Direction> for CompactDirection { - fn eq(&self, rhs: &Direction) -> bool { - (*self as usize) == (*rhs as usize) - } -} - -impl<N, E, Ty> GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - /// Create a new `GraphMap` - pub fn new() -> Self { - Self::default() - } - - /// Create a new `GraphMap` with estimated capacity. - pub fn with_capacity(nodes: usize, edges: usize) -> Self { - GraphMap { - nodes: OrderMap::with_capacity(nodes), - edges: OrderMap::with_capacity(edges), - ty: PhantomData, - } - } - - /// Return the current node and edge capacity of the graph. - pub fn capacity(&self) -> (usize, usize) { - (self.nodes.capacity(), self.edges.capacity()) - } - - /// Use their natual order to map the node pair (a, b) to a canonical edge id. - #[inline] - fn edge_key(a: N, b: N) -> (N, N) { - if Ty::is_directed() { - (a, b) - } else { - if a <= b { (a, b) } else { (b, a) } - } - } - - /// Whether the graph has directed edges. - pub fn is_directed(&self) -> bool { - Ty::is_directed() - } - - /// Create a new `GraphMap` from an iterable of edges. - /// - /// Node values are taken directly from the list. - /// Edge weights `E` may either be specified in the list, - /// or they are filled with default values. - /// - /// Nodes are inserted automatically to match the edges. - /// - /// ``` - /// use petgraph::graphmap::UnGraphMap; - /// - /// // Create a new undirected GraphMap. - /// // Use a type hint to have `()` be the edge weight type. - /// let gr = UnGraphMap::<_, ()>::from_edges(&[ - /// (0, 1), (0, 2), (0, 3), - /// (1, 2), (1, 3), - /// (2, 3), - /// ]); - /// ``` - pub fn from_edges<I>(iterable: I) -> Self - where I: IntoIterator, - I::Item: IntoWeightedEdge<E, NodeId=N> - { - Self::from_iter(iterable) - } - - /// Return the number of nodes in the graph. - pub fn node_count(&self) -> usize { - self.nodes.len() - } - - /// Return the number of edges in the graph. - pub fn edge_count(&self) -> usize { - self.edges.len() - } - - /// Remove all nodes and edges - pub fn clear(&mut self) { - self.nodes.clear(); - self.edges.clear(); - } - - /// Add node `n` to the graph. - pub fn add_node(&mut self, n: N) -> N { - self.nodes.entry(n).or_insert(Vec::new()); - n - } - - /// Return `true` if node `n` was removed. - pub fn remove_node(&mut self, n: N) -> bool { - let links = match self.nodes.swap_remove(&n) { - None => return false, - Some(sus) => sus, - }; - for (succ, _) in links { - // remove all successor links - self.remove_single_edge(&succ, &n, Incoming); - // Remove all edge values - self.edges.swap_remove(&Self::edge_key(n, succ)); - } - true - } - - /// Return `true` if the node is contained in the graph. - pub fn contains_node(&self, n: N) -> bool { - self.nodes.contains_key(&n) - } - - /// Add an edge connecting `a` and `b` to the graph, with associated - /// data `weight`. For a directed graph, the edge is directed from `a` - /// to `b`. - /// - /// Inserts nodes `a` and/or `b` if they aren't already part of the graph. - /// - /// Return `None` if the edge did not previously exist, otherwise, - /// the associated data is updated and the old value is returned - /// as `Some(old_weight)`. - /// - /// ``` - /// // Create a GraphMap with directed edges, and add one edge to it - /// use petgraph::graphmap::DiGraphMap; - /// - /// let mut g = DiGraphMap::new(); - /// g.add_edge("x", "y", -1); - /// assert_eq!(g.node_count(), 2); - /// assert_eq!(g.edge_count(), 1); - /// assert!(g.contains_edge("x", "y")); - /// assert!(!g.contains_edge("y", "x")); - /// ``` - pub fn add_edge(&mut self, a: N, b: N, weight: E) -> Option<E> { - if let old @ Some(_) = self.edges.insert(Self::edge_key(a, b), weight) { - old - } else { - // insert in the adjacency list if it's a new edge - self.nodes.entry(a) - .or_insert_with(|| Vec::with_capacity(1)) - .push((b, CompactDirection::Outgoing)); - if a != b { - // self loops don't have the Incoming entry - self.nodes.entry(b) - .or_insert_with(|| Vec::with_capacity(1)) - .push((a, CompactDirection::Incoming)); - } - None - } - } - - /// Remove edge relation from a to b - /// - /// Return `true` if it did exist. - fn remove_single_edge(&mut self, a: &N, b: &N, dir: Direction) -> bool { - match self.nodes.get_mut(a) { - None => false, - Some(sus) => { - if Ty::is_directed() { - match sus.iter().position(|elt| elt == &(*b, CompactDirection::from(dir))) { - Some(index) => { sus.swap_remove(index); true } - None => false, - } - } else { - match sus.iter().position(|elt| &elt.0 == b) { - Some(index) => { sus.swap_remove(index); true } - None => false, - } - } - } - } - } - - /// Remove edge from `a` to `b` from the graph and return the edge weight. - /// - /// Return `None` if the edge didn't exist. - /// - /// ``` - /// // Create a GraphMap with undirected edges, and add and remove an edge. - /// use petgraph::graphmap::UnGraphMap; - /// - /// let mut g = UnGraphMap::new(); - /// g.add_edge("x", "y", -1); - /// - /// let edge_data = g.remove_edge("y", "x"); - /// assert_eq!(edge_data, Some(-1)); - /// assert_eq!(g.edge_count(), 0); - /// ``` - pub fn remove_edge(&mut self, a: N, b: N) -> Option<E> { - let exist1 = self.remove_single_edge(&a, &b, Outgoing); - let exist2 = if a != b { - self.remove_single_edge(&b, &a, Incoming) - } else { exist1 }; - let weight = self.edges.remove(&Self::edge_key(a, b)); - debug_assert!(exist1 == exist2 && exist1 == weight.is_some()); - weight - } - - /// Return `true` if the edge connecting `a` with `b` is contained in the graph. - pub fn contains_edge(&self, a: N, b: N) -> bool { - self.edges.contains_key(&Self::edge_key(a, b)) - } - - /// Return an iterator over the nodes of the graph. - /// - /// Iterator element type is `N`. - pub fn nodes(&self) -> Nodes<N> { - Nodes{iter: self.nodes.keys().cloned()} - } - - /// Return an iterator of all nodes with an edge starting from `a`. - /// - /// - `Directed`: Outgoing edges from `a`. - /// - `Undirected`: All edges from or to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `N`. - pub fn neighbors(&self, a: N) -> Neighbors<N, Ty> { - Neighbors { - iter: match self.nodes.get(&a) { - Some(neigh) => neigh.iter(), - None => [].iter(), - }, - ty: self.ty, - } - } - - /// Return an iterator of all neighbors that have an edge between them and - /// `a`, in the specified direction. - /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*. - /// - /// - `Directed`, `Outgoing`: All edges from `a`. - /// - `Directed`, `Incoming`: All edges to `a`. - /// - `Undirected`: All edges from or to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `N`. - pub fn neighbors_directed(&self, a: N, dir: Direction) - -> NeighborsDirected<N, Ty> - { - NeighborsDirected { - iter: match self.nodes.get(&a) { - Some(neigh) => neigh.iter(), - None => [].iter(), - }, - dir: dir, - ty: self.ty, - } - } - - /// Return an iterator of target nodes with an edge starting from `a`, - /// paired with their respective edge weights. - /// - /// - `Directed`: Outgoing edges from `a`. - /// - `Undirected`: All edges from or to `a`. - /// - /// Produces an empty iterator if the node doesn't exist.<br> - /// Iterator element type is `(N, &E)`. - pub fn edges(&self, from: N) -> Edges<N, E, Ty> { - Edges { - from: from, - iter: self.neighbors(from), - edges: &self.edges, - } - } - - /// Return a reference to the edge weight connecting `a` with `b`, or - /// `None` if the edge does not exist in the graph. - pub fn edge_weight(&self, a: N, b: N) -> Option<&E> { - self.edges.get(&Self::edge_key(a, b)) - } - - /// Return a mutable reference to the edge weight connecting `a` with `b`, or - /// `None` if the edge does not exist in the graph. - pub fn edge_weight_mut(&mut self, a: N, b: N) -> Option<&mut E> { - self.edges.get_mut(&Self::edge_key(a, b)) - } - - /// Return an iterator over all edges of the graph with their weight in arbitrary order. - /// - /// Iterator element type is `(N, N, &E)` - pub fn all_edges(&self) -> AllEdges<N, E, Ty> { - AllEdges { - inner: self.edges.iter(), - ty: self.ty, - } - } - - /// Return an iterator over all edges of the graph in arbitrary order, with a mutable reference - /// to their weight. - /// - /// Iterator element type is `(N, N, &mut E)` - pub fn all_edges_mut(&mut self) -> AllEdgesMut<N, E, Ty> { - AllEdgesMut { - inner: self.edges.iter_mut(), - ty: self.ty, - } - } - - /// Return a `Graph` that corresponds to this `GraphMap`. - /// - /// 1. Note that node and edge indices in the `Graph` have nothing in common - /// with the `GraphMap`s node weights `N`. The node weights `N` are used as - /// node weights in the resulting `Graph`, too. - /// 2. Note that the index type is user-chosen. - /// - /// Computes in **O(|V| + |E|)** time (average). - /// - /// **Panics** if the number of nodes or edges does not fit with - /// the resulting graph's index type. - pub fn into_graph<Ix>(self) -> Graph<N, E, Ty, Ix> - where Ix: ::graph::IndexType, - { - // assuming two successive iterations of the same hashmap produce the same order - let mut gr = Graph::with_capacity(self.node_count(), self.edge_count()); - for (&node, _) in &self.nodes { - gr.add_node(node); - } - for ((a, b), edge_weight) in self.edges { - let (ai, _, _) = self.nodes.get_full(&a).unwrap(); - let (bi, _, _) = self.nodes.get_full(&b).unwrap(); - gr.add_edge(node_index(ai), node_index(bi), edge_weight); - } - gr - } -} - -/// Create a new `GraphMap` from an iterable of edges. -impl<N, E, Ty, Item> FromIterator<Item> for GraphMap<N, E, Ty> - where Item: IntoWeightedEdge<E, NodeId=N>, - N: NodeTrait, - Ty: EdgeType, -{ - fn from_iter<I>(iterable: I) -> Self - where I: IntoIterator<Item=Item>, - { - let iter = iterable.into_iter(); - let (low, _) = iter.size_hint(); - let mut g = Self::with_capacity(0, low); - g.extend(iter); - g - } -} - -/// Extend the graph from an iterable of edges. -/// -/// Nodes are inserted automatically to match the edges. -impl<N, E, Ty, Item> Extend<Item> for GraphMap<N, E, Ty> - where Item: IntoWeightedEdge<E, NodeId=N>, - N: NodeTrait, - Ty: EdgeType, -{ - fn extend<I>(&mut self, iterable: I) - where I: IntoIterator<Item=Item>, - { - let iter = iterable.into_iter(); - let (low, _) = iter.size_hint(); - self.edges.reserve(low); - - for elt in iter { - let (source, target, weight) = elt.into_weighted_edge(); - self.add_edge(source, target, weight); - } - } -} - -macro_rules! iterator_wrap { - ($name: ident <$($typarm:tt),*> where { $($bounds: tt)* } - item: $item: ty, - iter: $iter: ty, - ) => ( - pub struct $name <$($typarm),*> where $($bounds)* { - iter: $iter, - } - impl<$($typarm),*> Iterator for $name <$($typarm),*> - where $($bounds)* - { - type Item = $item; - #[inline] - fn next(&mut self) -> Option<Self::Item> { - self.iter.next() - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } - } - ); -} - -iterator_wrap! { - Nodes <'a, N> where { N: 'a + NodeTrait } - item: N, - iter: Cloned<Keys<'a, N, Vec<(N, CompactDirection)>>>, -} - -pub struct Neighbors<'a, N, Ty = Undirected> - where N: 'a, - Ty: EdgeType, -{ - iter: Iter<'a, (N, CompactDirection)>, - ty: PhantomData<Ty>, -} - -impl<'a, N, Ty> Iterator for Neighbors<'a, N, Ty> - where N: NodeTrait, - Ty: EdgeType -{ - type Item = N; - fn next(&mut self) -> Option<N> { - if Ty::is_directed() { - (&mut self.iter) - .filter_map(|&(n, dir)| if dir == Outgoing { - Some(n) - } else { None }) - .next() - } else { - self.iter.next().map(|&(n, _)| n) - } - } -} - -pub struct NeighborsDirected<'a, N, Ty> - where N: 'a, - Ty: EdgeType, -{ - iter: Iter<'a, (N, CompactDirection)>, - dir: Direction, - ty: PhantomData<Ty>, -} - -impl<'a, N, Ty> Iterator for NeighborsDirected<'a, N, Ty> - where N: NodeTrait, - Ty: EdgeType -{ - type Item = N; - fn next(&mut self) -> Option<N> { - if Ty::is_directed() { - let self_dir = self.dir; - (&mut self.iter) - .filter_map(move |&(n, dir)| if dir == self_dir { - Some(n) - } else { None }) - .next() - } else { - self.iter.next().map(|&(n, _)| n) - } - } -} - -pub struct Edges<'a, N, E: 'a, Ty> - where N: 'a + NodeTrait, - Ty: EdgeType -{ - from: N, - edges: &'a OrderMap<(N, N), E>, - iter: Neighbors<'a, N, Ty>, -} - -impl<'a, N, E, Ty> Iterator for Edges<'a, N, E, Ty> - where N: 'a + NodeTrait, E: 'a, - Ty: EdgeType, -{ - type Item = (N, N, &'a E); - fn next(&mut self) -> Option<Self::Item> { - match self.iter.next() { - None => None, - Some(b) => { - let a = self.from; - match self.edges.get(&GraphMap::<N, E, Ty>::edge_key(a, b)) { - None => unreachable!(), - Some(edge) => { - Some((a, b, edge)) - } - } - } - } - } -} - -impl<'a, N: 'a, E: 'a, Ty> IntoEdgeReferences for &'a GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - type EdgeRef = (N, N, &'a E); - type EdgeReferences = AllEdges<'a, N, E, Ty>; - fn edge_references(self) -> Self::EdgeReferences { - self.all_edges() - } -} - -pub struct AllEdges<'a, N, E: 'a, Ty> where N: 'a + NodeTrait { - inner: OrderMapIter<'a, (N, N), E>, - ty: PhantomData<Ty>, -} - -impl<'a, N, E, Ty> Iterator for AllEdges<'a, N, E, Ty> - where N: 'a + NodeTrait, E: 'a, - Ty: EdgeType, -{ - type Item = (N, N, &'a E); - fn next(&mut self) -> Option<Self::Item> - { - match self.inner.next() { - None => None, - Some((&(a, b), v)) => Some((a, b, v)) - } - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.inner.size_hint() - } - - fn count(self) -> usize { - self.inner.count() - } - - fn nth(&mut self, n: usize) -> Option<Self::Item> { - self.inner.nth(n).map(|(&(n1, n2), weight)| (n1, n2, weight)) - } - - fn last(self) -> Option<Self::Item> { - self.inner.last().map(|(&(n1, n2), weight)| (n1, n2, weight)) - } -} - -impl<'a, N, E, Ty> DoubleEndedIterator for AllEdges<'a, N, E, Ty> - where N: 'a + NodeTrait, E: 'a, - Ty: EdgeType, -{ - fn next_back(&mut self) -> Option<Self::Item> { - self.inner.next_back().map(|(&(n1, n2), weight)| (n1, n2, weight)) - } -} - -pub struct AllEdgesMut<'a, N, E: 'a, Ty> where N: 'a + NodeTrait { - inner: OrderMapIterMut<'a, (N, N), E>, - ty: PhantomData<Ty>, -} - -impl<'a, N, E, Ty> Iterator for AllEdgesMut<'a, N, E, Ty> - where N: 'a + NodeTrait, E: 'a, - Ty: EdgeType, -{ - type Item = (N, N, &'a mut E); - fn next(&mut self) -> Option<Self::Item> { - self.inner.next().map(|(&(n1, n2), weight)| (n1, n2, weight)) - } - - fn size_hint(&self) -> (usize, Option<usize>) { - self.inner.size_hint() - } - - fn count(self) -> usize { - self.inner.count() - } - - fn nth(&mut self, n: usize) -> Option<Self::Item> { - self.inner.nth(n).map(|(&(n1, n2), weight)| (n1, n2, weight)) - } - - fn last(self) -> Option<Self::Item> { - self.inner.last().map(|(&(n1, n2), weight)| (n1, n2, weight)) - } -} - -impl<'a, N, E, Ty> DoubleEndedIterator for AllEdgesMut<'a, N, E, Ty> - where N: 'a + NodeTrait, E: 'a, - Ty: EdgeType, -{ - fn next_back(&mut self) -> Option<Self::Item> { - self.inner.next_back().map(|(&(n1, n2), weight)| (n1, n2, weight)) - } -} - -impl<'a, N: 'a, E: 'a, Ty> IntoEdges for &'a GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - type Edges = Edges<'a, N, E, Ty>; - fn edges(self, a: Self::NodeId) -> Self::Edges { - self.edges(a) - } -} - - -/// Index `GraphMap` by node pairs to access edge weights. -impl<N, E, Ty> Index<(N, N)> for GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - type Output = E; - fn index(&self, index: (N, N)) -> &E - { - let index = Self::edge_key(index.0, index.1); - self.edge_weight(index.0, index.1).expect("GraphMap::index: no such edge") - } -} - -/// Index `GraphMap` by node pairs to access edge weights. -impl<N, E, Ty> IndexMut<(N, N)> for GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - fn index_mut(&mut self, index: (N, N)) -> &mut E { - let index = Self::edge_key(index.0, index.1); - self.edge_weight_mut(index.0, index.1).expect("GraphMap::index: no such edge") - } -} - -/// Create a new empty `GraphMap`. -impl<N, E, Ty> Default for GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - fn default() -> Self { GraphMap::with_capacity(0, 0) } -} - -/// A reference that is hashed and compared by its pointer value. -/// -/// `Ptr` is used for certain configurations of `GraphMap`, -/// in particular in the combination where the node type for -/// `GraphMap` is something of type for example `Ptr(&Cell<T>)`, -/// with the `Cell<T>` being `TypedArena` allocated. -pub struct Ptr<'b, T: 'b>(pub &'b T); - -impl<'b, T> Copy for Ptr<'b, T> {} -impl<'b, T> Clone for Ptr<'b, T> -{ - fn clone(&self) -> Self { *self } -} - - -fn ptr_eq<T>(a: *const T, b: *const T) -> bool { - a == b -} - -impl<'b, T> PartialEq for Ptr<'b, T> -{ - /// Ptr compares by pointer equality, i.e if they point to the same value - fn eq(&self, other: &Ptr<'b, T>) -> bool { - ptr_eq(self.0, other.0) - } -} - -impl<'b, T> PartialOrd for Ptr<'b, T> -{ - fn partial_cmp(&self, other: &Ptr<'b, T>) -> Option<Ordering> { - Some(self.cmp(other)) - } -} - -impl<'b, T> Ord for Ptr<'b, T> -{ - /// Ptr is ordered by pointer value, i.e. an arbitrary but stable and total order. - fn cmp(&self, other: &Ptr<'b, T>) -> Ordering { - let a: *const T = self.0; - let b: *const T = other.0; - a.cmp(&b) - } -} - -impl<'b, T> Deref for Ptr<'b, T> { - type Target = T; - fn deref(&self) -> &T { - self.0 - } -} - -impl<'b, T> Eq for Ptr<'b, T> {} - -impl<'b, T> Hash for Ptr<'b, T> -{ - fn hash<H: hash::Hasher>(&self, st: &mut H) - { - let ptr = (self.0) as *const T; - ptr.hash(st) - } -} - -impl<'b, T: fmt::Debug> fmt::Debug for Ptr<'b, T> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.0.fmt(f) - } -} - -impl<'a, N, E: 'a, Ty> IntoNodeIdentifiers for &'a GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - type NodeIdentifiers = NodeIdentifiers<'a, N, E, Ty>; - - fn node_identifiers(self) -> Self::NodeIdentifiers { - NodeIdentifiers { - iter: self.nodes.iter(), - ty: self.ty, - edge_ty: PhantomData, - } - } -} - -impl<N, E, Ty> NodeCount for GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - fn node_count(&self) -> usize { - (*self).node_count() - } -} - -pub struct NodeIdentifiers<'a, N, E: 'a, Ty> where N: 'a + NodeTrait { - iter: OrderMapIter<'a, N, Vec<(N, CompactDirection)>>, - ty: PhantomData<Ty>, - edge_ty: PhantomData<E>, -} - -impl<'a, N, E, Ty> Iterator for NodeIdentifiers<'a, N, E, Ty> - where N: 'a + NodeTrait, E: 'a, - Ty: EdgeType, -{ - type Item = N; - fn next(&mut self) -> Option<Self::Item> - { - self.iter.next().map(|(&n, _)| n) - } -} - -impl<'a, N, E, Ty> IntoNodeReferences for &'a GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - type NodeRef = (N, &'a N); - type NodeReferences = NodeReferences<'a, N, E, Ty>; - fn node_references(self) -> Self::NodeReferences { - NodeReferences { - iter: self.nodes.iter(), - ty: self.ty, - edge_ty: PhantomData, - } - } -} - -pub struct NodeReferences<'a, N, E: 'a, Ty> where N: 'a + NodeTrait { - iter: OrderMapIter<'a, N, Vec<(N, CompactDirection)>>, - ty: PhantomData<Ty>, - edge_ty: PhantomData<E>, -} - -impl<'a, N, E, Ty> Iterator for NodeReferences<'a, N, E, Ty> - where N: 'a + NodeTrait, E: 'a, - Ty: EdgeType, -{ - type Item = (N, &'a N); - fn next(&mut self) -> Option<Self::Item> - { - self.iter.next().map(|(n, _)| (*n, n)) - } -} - -impl<N, E, Ty> NodeIndexable for GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - fn node_bound(&self) -> usize { self.node_count() } - fn to_index(&self, ix: Self::NodeId) -> usize { - let (i, _, _) = self.nodes.get_full(&ix).unwrap(); - i - } - fn from_index(&self, ix: usize) -> Self::NodeId { - let (&key, _) = self.nodes.get_index(ix).unwrap(); - key - } -} - -impl<N, E, Ty> NodeCompactIndexable for GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ -} - diff --git a/vendor/petgraph/src/isomorphism.rs b/vendor/petgraph/src/isomorphism.rs deleted file mode 100644 index 7eecd851d6..0000000000 --- a/vendor/petgraph/src/isomorphism.rs +++ /dev/null @@ -1,456 +0,0 @@ -use std::marker; -use fixedbitset::FixedBitSet; - -use super::{ - EdgeType, - Incoming, -}; -use super::graph::{ - Graph, - IndexType, - NodeIndex, -}; - -use super::visit::GetAdjacencyMatrix; - -#[derive(Debug)] -struct Vf2State<Ty, Ix> { - /// The current mapping M(s) of nodes from G0 → G1 and G1 → G0, - /// NodeIndex::end() for no mapping. - mapping: Vec<NodeIndex<Ix>>, - /// out[i] is non-zero if i is in either M_0(s) or Tout_0(s) - /// These are all the next vertices that are not mapped yet, but - /// have an outgoing edge from the mapping. - out: Vec<usize>, - /// ins[i] is non-zero if i is in either M_0(s) or Tin_0(s) - /// These are all the incoming vertices, those not mapped yet, but - /// have an edge from them into the mapping. - /// Unused if graph is undirected -- it's identical with out in that case. - ins: Vec<usize>, - out_size: usize, - ins_size: usize, - adjacency_matrix: FixedBitSet, - generation: usize, - _etype: marker::PhantomData<Ty>, -} - -impl<Ty, Ix> Vf2State<Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - pub fn new<N, E>(g: &Graph<N, E, Ty, Ix>) -> Self { - let c0 = g.node_count(); - let mut state = Vf2State { - mapping: Vec::with_capacity(c0), - out: Vec::with_capacity(c0), - ins: Vec::with_capacity(c0 * (g.is_directed() as usize)), - out_size: 0, - ins_size: 0, - adjacency_matrix: g.adjacency_matrix(), - generation: 0, - _etype: marker::PhantomData, - }; - for _ in 0..c0 { - state.mapping.push(NodeIndex::end()); - state.out.push(0); - if Ty::is_directed() { - state.ins.push(0); - } - } - state - } - - /// Return **true** if we have a complete mapping - pub fn is_complete(&self) -> bool { - self.generation == self.mapping.len() - } - - /// Add mapping **from** <-> **to** to the state. - pub fn push_mapping<N, E>(&mut self, from: NodeIndex<Ix>, to: NodeIndex<Ix>, - g: &Graph<N, E, Ty, Ix>) - { - self.generation += 1; - let s = self.generation; - self.mapping[from.index()] = to; - // update T0 & T1 ins/outs - // T0out: Node in G0 not in M0 but successor of a node in M0. - // st.out[0]: Node either in M0 or successor of M0 - for ix in g.neighbors(from) { - if self.out[ix.index()] == 0 { - self.out[ix.index()] = s; - self.out_size += 1; - } - } - if g.is_directed() { - for ix in g.neighbors_directed(from, Incoming) { - if self.ins[ix.index()] == 0 { - self.ins[ix.index()] = s; - self.ins_size += 1; - } - } - } - } - - /// Restore the state to before the last added mapping - pub fn pop_mapping<N, E>(&mut self, from: NodeIndex<Ix>, - g: &Graph<N, E, Ty, Ix>) - { - let s = self.generation; - self.generation -= 1; - - // undo (n, m) mapping - self.mapping[from.index()] = NodeIndex::end(); - - // unmark in ins and outs - for ix in g.neighbors(from) { - if self.out[ix.index()] == s { - self.out[ix.index()] = 0; - self.out_size -= 1; - } - } - if g.is_directed() { - for ix in g.neighbors_directed(from, Incoming) { - if self.ins[ix.index()] == s { - self.ins[ix.index()] = 0; - self.ins_size -= 1; - } - } - } - } - - /// Find the next (least) node in the Tout set. - pub fn next_out_index(&self, from_index: usize) -> Option<usize> - { - self.out[from_index..].iter() - .enumerate() - .find(move |&(index, elt)| *elt > 0 && - self.mapping[from_index + index] == NodeIndex::end()) - .map(|(index, _)| index) - } - - /// Find the next (least) node in the Tin set. - pub fn next_in_index(&self, from_index: usize) -> Option<usize> - { - if !Ty::is_directed() { - return None - } - self.ins[from_index..].iter() - .enumerate() - .find(move |&(index, elt)| *elt > 0 - && self.mapping[from_index + index] == NodeIndex::end()) - .map(|(index, _)| index) - } - - /// Find the next (least) node in the N - M set. - pub fn next_rest_index(&self, from_index: usize) -> Option<usize> - { - self.mapping[from_index..].iter() - .enumerate() - .find(|&(_, elt)| *elt == NodeIndex::end()) - .map(|(index, _)| index) - } -} - - -/// [Graph] Return `true` if the graphs `g0` and `g1` are isomorphic. -/// -/// Using the VF2 algorithm, only matching graph syntactically (graph -/// structure). -/// -/// The graphs should not be multigraphs. -/// -/// **Reference** -/// -/// * Luigi P. Cordella, Pasquale Foggia, Carlo Sansone, Mario Vento; -/// *A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs* -pub fn is_isomorphic<N, E, Ty, Ix>(g0: &Graph<N, E, Ty, Ix>, - g1: &Graph<N, E, Ty, Ix>) -> bool - where Ty: EdgeType, - Ix: IndexType, -{ - if g0.node_count() != g1.node_count() || g0.edge_count() != g1.edge_count() { - return false - } - - let mut st = [Vf2State::new(g0), Vf2State::new(g1)]; - try_match(&mut st, g0, g1, &mut NoSemanticMatch, &mut NoSemanticMatch).unwrap_or(false) -} - -/// [Graph] Return `true` if the graphs `g0` and `g1` are isomorphic. -/// -/// Using the VF2 algorithm, examining both syntactic and semantic -/// graph isomorphism (graph structure and matching node and edge weights). -/// -/// The graphs should not be multigraphs. -pub fn is_isomorphic_matching<N, E, Ty, Ix, F, G>(g0: &Graph<N, E, Ty, Ix>, - g1: &Graph<N, E, Ty, Ix>, - mut node_match: F, - mut edge_match: G) -> bool - where Ty: EdgeType, - Ix: IndexType, - F: FnMut(&N, &N) -> bool, - G: FnMut(&E, &E) -> bool, -{ - if g0.node_count() != g1.node_count() || g0.edge_count() != g1.edge_count() { - return false - } - - let mut st = [Vf2State::new(g0), Vf2State::new(g1)]; - try_match(&mut st, g0, g1, &mut node_match, &mut edge_match).unwrap_or(false) -} - -trait SemanticMatcher<T> { - fn enabled() -> bool; - fn eq(&mut self, &T, &T) -> bool; -} - -struct NoSemanticMatch; - -impl<T> SemanticMatcher<T> for NoSemanticMatch { - #[inline] - fn enabled() -> bool { false } - #[inline] - fn eq(&mut self, _: &T, _: &T) -> bool { true } -} - -impl<T, F> SemanticMatcher<T> for F where F: FnMut(&T, &T) -> bool { - #[inline] - fn enabled() -> bool { true } - #[inline] - fn eq(&mut self, a: &T, b: &T) -> bool { self(a, b) } -} - -/// Return Some(bool) if isomorphism is decided, else None. -fn try_match<N, E, Ty, Ix, F, G>(st: &mut [Vf2State<Ty, Ix>; 2], - g0: &Graph<N, E, Ty, Ix>, - g1: &Graph<N, E, Ty, Ix>, - node_match: &mut F, - edge_match: &mut G) - -> Option<bool> - where Ty: EdgeType, - Ix: IndexType, - F: SemanticMatcher<N>, - G: SemanticMatcher<E>, -{ - let g = [g0, g1]; - let graph_indices = 0..2; - let end = NodeIndex::end(); - - // if all are mapped -- we are done and have an iso - if st[0].is_complete() { - return Some(true) - } - - // A "depth first" search of a valid mapping from graph 1 to graph 2 - - // F(s, n, m) -- evaluate state s and add mapping n <-> m - - // Find least T1out node (in st.out[1] but not in M[1]) - #[derive(Copy, Clone, PartialEq, Debug)] - enum OpenList { - Out, - In, - Other, - } - let mut open_list = OpenList::Out; - - let mut to_index; - let mut from_index = None; - // Try the out list - to_index = st[1].next_out_index(0); - - if to_index.is_some() { - from_index = st[0].next_out_index(0); - open_list = OpenList::Out; - } - - // Try the in list - if to_index.is_none() || from_index.is_none() { - to_index = st[1].next_in_index(0); - - if to_index.is_some() { - from_index = st[0].next_in_index(0); - open_list = OpenList::In; - } - } - - // Try the other list -- disconnected graph - if to_index.is_none() || from_index.is_none() { - to_index = st[1].next_rest_index(0); - if to_index.is_some() { - from_index = st[0].next_rest_index(0); - open_list = OpenList::Other; - } - } - - let (cand0, cand1) = match (from_index, to_index) { - (Some(n), Some(m)) => (n, m), - // No more candidates - _ => return None, - }; - - let mut nx = NodeIndex::new(cand0); - let mx = NodeIndex::new(cand1); - - let mut first = true; - - 'candidates: loop { - if !first { - // Find the next node index to try on the `from` side of the mapping - let start = nx.index() + 1; - let cand0 = match open_list { - OpenList::Out => st[0].next_out_index(start), - OpenList::In => st[0].next_in_index(start), - OpenList::Other => st[0].next_rest_index(start), - }.map(|c| c + start); // compensate for start offset. - nx = match cand0 { - None => break, // no more candidates - Some(ix) => NodeIndex::new(ix), - }; - debug_assert!(nx.index() >= start); - } - first = false; - - let nodes = [nx, mx]; - - // Check syntactic feasibility of mapping by ensuring adjacencies - // of nx map to adjacencies of mx. - // - // nx == map to => mx - // - // R_succ - // - // Check that every neighbor of nx is mapped to a neighbor of mx, - // then check the reverse, from mx to nx. Check that they have the same - // count of edges. - // - // Note: We want to check the lookahead measures here if we can, - // R_out: Equal for G0, G1: Card(Succ(G, n) ^ Tout); for both Succ and Pred - // R_in: Same with Tin - // R_new: Equal for G0, G1: Ñ n Pred(G, n); both Succ and Pred, - // Ñ is G0 - M - Tin - Tout - // last attempt to add these did not speed up any of the testcases - let mut succ_count = [0, 0]; - for j in graph_indices.clone() { - for n_neigh in g[j].neighbors(nodes[j]) { - succ_count[j] += 1; - // handle the self loop case; it's not in the mapping (yet) - let m_neigh = if nodes[j] != n_neigh { - st[j].mapping[n_neigh.index()] - } else { - nodes[1 - j] - }; - if m_neigh == end { - continue; - } - let has_edge = g[1-j].is_adjacent(&st[1-j].adjacency_matrix, nodes[1-j], m_neigh); - if !has_edge { - continue 'candidates; - } - } - } - if succ_count[0] != succ_count[1] { - continue 'candidates; - } - - // R_pred - if g[0].is_directed() { - let mut pred_count = [0, 0]; - for j in graph_indices.clone() { - for n_neigh in g[j].neighbors_directed(nodes[j], Incoming) { - pred_count[j] += 1; - // the self loop case is handled in outgoing - let m_neigh = st[j].mapping[n_neigh.index()]; - if m_neigh == end { - continue; - } - let has_edge = g[1-j].is_adjacent(&st[1-j].adjacency_matrix, m_neigh, nodes[1-j]); - if !has_edge { - continue 'candidates; - } - } - } - if pred_count[0] != pred_count[1] { - continue 'candidates; - } - } - - // semantic feasibility: compare associated data for nodes - if F::enabled() && !node_match.eq(&g[0][nodes[0]], &g[1][nodes[1]]) { - continue 'candidates; - } - - // semantic feasibility: compare associated data for edges - if G::enabled() { - // outgoing edges - for j in graph_indices.clone() { - let mut edges = g[j].neighbors(nodes[j]).detach(); - while let Some((n_edge, n_neigh)) = edges.next(g[j]) { - // handle the self loop case; it's not in the mapping (yet) - let m_neigh = if nodes[j] != n_neigh { - st[j].mapping[n_neigh.index()] - } else { - nodes[1 - j] - }; - if m_neigh == end { - continue; - } - match g[1-j].find_edge(nodes[1 - j], m_neigh) { - Some(m_edge) => { - if !edge_match.eq(&g[j][n_edge], &g[1-j][m_edge]) { - continue 'candidates; - } - } - None => unreachable!() // covered by syntactic check - } - } - } - - // incoming edges - if g[0].is_directed() { - for j in graph_indices.clone() { - let mut edges = g[j].neighbors_directed(nodes[j], Incoming).detach(); - while let Some((n_edge, n_neigh)) = edges.next(g[j]) { - // the self loop case is handled in outgoing - let m_neigh = st[j].mapping[n_neigh.index()]; - if m_neigh == end { - continue; - } - match g[1-j].find_edge(m_neigh, nodes[1-j]) { - Some(m_edge) => { - if !edge_match.eq(&g[j][n_edge], &g[1-j][m_edge]) { - continue 'candidates; - } - } - None => unreachable!() // covered by syntactic check - } - } - } - } - } - - // Add mapping nx <-> mx to the state - for j in graph_indices.clone() { - st[j].push_mapping(nodes[j], nodes[1-j], g[j]); - } - - // Check cardinalities of Tin, Tout sets - if st[0].out_size == st[1].out_size && - st[0].ins_size == st[1].ins_size - { - - // Recurse - match try_match(st, g0, g1, node_match, edge_match) { - None => {} - result => return result, - } - } - - // Restore state. - for j in graph_indices.clone() { - st[j].pop_mapping(nodes[j], g[j]); - } - } - None -} - diff --git a/vendor/petgraph/src/iter_format.rs b/vendor/petgraph/src/iter_format.rs deleted file mode 100644 index 3f1c9cfeea..0000000000 --- a/vendor/petgraph/src/iter_format.rs +++ /dev/null @@ -1,100 +0,0 @@ -//! Formatting utils - -use std::cell::RefCell; -use std::fmt; - -/// Format the iterator like a map -pub struct DebugMap<F>(pub F); - -impl<'a, F, I, K, V> fmt::Debug for DebugMap<F> - where F: Fn() -> I, - I: IntoIterator<Item=(K, V)>, - K: fmt::Debug, - V: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_map() - .entries((self.0)()) - .finish() - } -} - -/// Avoid "pretty" debug -pub struct NoPretty<T>(pub T); - -impl<T> fmt::Debug for NoPretty<T> - where T: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{:?}", self.0) - } -} - -/// Format all iterator elements lazily, separated by `sep`. -/// -/// The format value can only be formatted once, after that the iterator is -/// exhausted. -/// -/// See [`.format()`](../trait.Itertools.html#method.format) -/// for more information. -#[derive(Clone)] -pub struct Format<'a, I> { - sep: &'a str, - /// Format uses interior mutability because Display::fmt takes &self. - inner: RefCell<Option<I>>, -} - -pub trait IterFormatExt : Iterator { - fn format(self, separator: &str) -> Format<Self> - where Self: Sized - { - Format { - sep: separator, - inner: RefCell::new(Some(self)), - } - } -} - -impl<I> IterFormatExt for I where I: Iterator { } - - -impl<'a, I> Format<'a, I> - where I: Iterator, -{ - fn format<F>(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result - where F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result, - { - let mut iter = match self.inner.borrow_mut().take() { - Some(t) => t, - None => panic!("Format: was already formatted once"), - }; - - if let Some(fst) = iter.next() { - try!(cb(&fst, f)); - for elt in iter { - if !self.sep.is_empty() { - try!(f.write_str(self.sep)); - } - try!(cb(&elt, f)); - } - } - Ok(()) - } -} - -macro_rules! impl_format { - ($($fmt_trait:ident)*) => { - $( - impl<'a, I> fmt::$fmt_trait for Format<'a, I> - where I: Iterator, - I::Item: fmt::$fmt_trait, - { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.format(f, fmt::$fmt_trait::fmt) - } - } - )* - } -} - -impl_format!(Debug); diff --git a/vendor/petgraph/src/iter_utils.rs b/vendor/petgraph/src/iter_utils.rs deleted file mode 100644 index 30db2d567d..0000000000 --- a/vendor/petgraph/src/iter_utils.rs +++ /dev/null @@ -1,31 +0,0 @@ - -pub trait IterUtilsExt : Iterator { - /// Return the first element that maps to `Some(_)`, or None if the iterator - /// was exhausted. - fn ex_find_map<F, R>(&mut self, mut f: F) -> Option<R> - where F: FnMut(Self::Item) -> Option<R> - { - for elt in self { - if let result @ Some(_) = f(elt) { - return result; - } - } - None - } - - /// Return the last element from the back that maps to `Some(_)`, or - /// None if the iterator was exhausted. - fn ex_rfind_map<F, R>(&mut self, mut f: F) -> Option<R> - where F: FnMut(Self::Item) -> Option<R>, - Self: DoubleEndedIterator, - { - while let Some(elt) = self.next_back() { - if let result @ Some(_) = f(elt) { - return result; - } - } - None - } -} - -impl<I> IterUtilsExt for I where I: Iterator { } diff --git a/vendor/petgraph/src/lib.rs b/vendor/petgraph/src/lib.rs deleted file mode 100644 index 652389403d..0000000000 --- a/vendor/petgraph/src/lib.rs +++ /dev/null @@ -1,227 +0,0 @@ - -//! **petgraph** is a graph data structure library. -//! -//! - [`Graph`](./graph/struct.Graph.html) which is an adjacency list graph with -//! arbitrary associated data. -//! -//! - [`StableGraph`](./stable_graph/struct.StableGraph.html) is similar -//! to `Graph`, but it keeps indices stable across removals. -//! -//! - [`GraphMap`](./graphmap/struct.GraphMap.html) is an adjacency list graph -//! which is backed by a hash table and the node identifiers are the keys -//! into the table. -//! - [`CSR`](./csr/struct.Csr.html) is a sparse adjacency matrix graph with -//! arbitrary associated data. -//! -//! Optional crate feature: `"serde-1"`, see the Readme for more information. -//! -#![doc(html_root_url = "https://docs.rs/petgraph/0.4/")] - -extern crate fixedbitset; -#[cfg(feature = "graphmap")] -extern crate ordermap; - -#[cfg(feature = "serde-1")] -extern crate serde; -#[cfg(feature = "serde-1")] -#[macro_use] -extern crate serde_derive; - -#[cfg(all(feature = "serde-1", test))] -extern crate itertools; - -#[doc(no_inline)] -pub use graph::Graph; - -pub use Direction::{Outgoing, Incoming}; - -#[macro_use] -mod macros; -mod scored; - -// these modules define trait-implementing macros -#[macro_use] -pub mod visit; -#[macro_use] -pub mod data; - -pub mod algo; -#[cfg(feature = "generate")] -pub mod generate; -#[cfg(feature = "graphmap")] -pub mod graphmap; -mod graph_impl; -pub mod dot; -pub mod unionfind; -mod dijkstra; -mod astar; -pub mod csr; -mod iter_format; -mod iter_utils; -mod isomorphism; -mod traits_graph; -mod util; -#[cfg(feature = "quickcheck")] -mod quickcheck; -#[cfg(feature = "serde-1")] -mod serde_utils; - -pub mod prelude; - -/// `Graph<N, E, Ty, Ix>` is a graph datastructure using an adjacency list representation. -pub mod graph { - pub use graph_impl::{ - Edge, - EdgeIndex, - EdgeIndices, - EdgeReference, - EdgeReferences, - EdgeWeightsMut, - Edges, - Externals, - Frozen, - Graph, - Neighbors, - Node, - NodeIndex, - NodeIndices, - NodeWeightsMut, - NodeReferences, - WalkNeighbors, - GraphIndex, - IndexType, - edge_index, - node_index, - DefaultIx, - DiGraph, - UnGraph, - }; -} - -#[cfg(feature = "stable_graph")] -pub use graph_impl::stable_graph; - -macro_rules! copyclone { - ($name:ident) => { - impl Clone for $name { - #[inline] - fn clone(&self) -> Self { *self } - } - } -} - -// Index into the NodeIndex and EdgeIndex arrays -/// Edge direction. -#[derive(Copy, Debug, PartialEq, PartialOrd, Ord, Eq, Hash)] -#[repr(usize)] -pub enum Direction { - /// An `Outgoing` edge is an outward edge *from* the current node. - Outgoing = 0, - /// An `Incoming` edge is an inbound edge *to* the current node. - Incoming = 1 -} - -copyclone!(Direction); - -impl Direction { - /// Return the opposite `Direction`. - #[inline] - pub fn opposite(&self) -> Direction { - match *self { - Outgoing => Incoming, - Incoming => Outgoing, - } - } - - /// Return `0` for `Outgoing` and `1` for `Incoming`. - #[inline] - pub fn index(&self) -> usize { - (*self as usize) & 0x1 - } -} - -#[doc(hidden)] -pub use Direction as EdgeDirection; - -/// Marker type for a directed graph. -#[derive(Copy, Debug)] -pub enum Directed { } -copyclone!(Directed); - -/// Marker type for an undirected graph. -#[derive(Copy, Debug)] -pub enum Undirected { } -copyclone!(Undirected); - -/// A graph's edge type determines whether is has directed edges or not. -pub trait EdgeType { - fn is_directed() -> bool; -} - -impl EdgeType for Directed { - #[inline] - fn is_directed() -> bool { true } -} - -impl EdgeType for Undirected { - #[inline] - fn is_directed() -> bool { false } -} - - -/// Convert an element like `(i, j)` or `(i, j, w)` into -/// a triple of source, target, edge weight. -/// -/// For `Graph::from_edges` and `GraphMap::from_edges`. -pub trait IntoWeightedEdge<E> { - type NodeId; - fn into_weighted_edge(self) -> (Self::NodeId, Self::NodeId, E); -} - -impl<Ix, E> IntoWeightedEdge<E> for (Ix, Ix) - where E: Default -{ - type NodeId = Ix; - - fn into_weighted_edge(self) -> (Ix, Ix, E) { - let (s, t) = self; - (s, t, E::default()) - } -} - -impl<Ix, E> IntoWeightedEdge<E> for (Ix, Ix, E) -{ - type NodeId = Ix; - fn into_weighted_edge(self) -> (Ix, Ix, E) { - self - } -} - -impl<'a, Ix, E> IntoWeightedEdge<E> for (Ix, Ix, &'a E) - where E: Clone -{ - type NodeId = Ix; - fn into_weighted_edge(self) -> (Ix, Ix, E) { - let (a, b, c) = self; - (a, b, c.clone()) - } -} - -impl<'a, Ix, E> IntoWeightedEdge<E> for &'a (Ix, Ix) - where Ix: Copy, E: Default -{ - type NodeId = Ix; - fn into_weighted_edge(self) -> (Ix, Ix, E) { - let (s, t) = *self; - (s, t, E::default()) - } -} - -impl<'a, Ix, E> IntoWeightedEdge<E> for &'a (Ix, Ix, E) - where Ix: Copy, E: Clone -{ - type NodeId = Ix; - fn into_weighted_edge(self) -> (Ix, Ix, E) { - self.clone() - } -} diff --git a/vendor/petgraph/src/macros.rs b/vendor/petgraph/src/macros.rs deleted file mode 100644 index 964372f5a1..0000000000 --- a/vendor/petgraph/src/macros.rs +++ /dev/null @@ -1,13 +0,0 @@ - -macro_rules! clone_fields { - ($name:ident, $($field:ident),+ $(,)*) => ( - fn clone(&self) -> Self { - $name { - $( - $field : self . $field .clone() - ),* - } - } - ); -} - diff --git a/vendor/petgraph/src/prelude.rs b/vendor/petgraph/src/prelude.rs deleted file mode 100644 index 51602c9251..0000000000 --- a/vendor/petgraph/src/prelude.rs +++ /dev/null @@ -1,48 +0,0 @@ - -//! Commonly used items. -//! -//! ``` -//! use petgraph::prelude::*; -//! ``` - -#[doc(no_inline)] -pub use graph::{ - Graph, - NodeIndex, - EdgeIndex, - DiGraph, - UnGraph, -}; -#[cfg(feature = "graphmap")] -#[doc(no_inline)] -pub use graphmap::{ - GraphMap, - DiGraphMap, - UnGraphMap, -}; -#[doc(no_inline)] -#[cfg(feature = "stable_graph")] -pub use stable_graph::{ - StableGraph, - StableDiGraph, - StableUnGraph, -}; -#[doc(no_inline)] -pub use visit::{ - Bfs, - Dfs, - DfsPostOrder, -}; -#[doc(no_inline)] -pub use ::{ - Direction, - Incoming, - Outgoing, - Directed, - Undirected, -}; - -#[doc(no_inline)] -pub use visit::{ - EdgeRef, -}; diff --git a/vendor/petgraph/src/quickcheck.rs b/vendor/petgraph/src/quickcheck.rs deleted file mode 100644 index 18d40c7473..0000000000 --- a/vendor/petgraph/src/quickcheck.rs +++ /dev/null @@ -1,208 +0,0 @@ -extern crate quickcheck; - -use self::quickcheck::{Gen, Arbitrary}; - -use { - Graph, - EdgeType, -}; -use graph::{ - IndexType, - node_index, -}; -#[cfg(feature = "stable_graph")] -use stable_graph::StableGraph; - -#[cfg(feature = "graphmap")] -use graphmap::{ - GraphMap, - NodeTrait, -}; -use visit::NodeIndexable; - -/// `Arbitrary` for `Graph` creates a graph by selecting a node count -/// and a probability for each possible edge to exist. -/// -/// The result will be simple graph or digraph, self loops -/// possible, no parallel edges. -/// -/// The exact properties of the produced graph is subject to change. -/// -/// Requires crate feature `"quickcheck"` -impl<N, E, Ty, Ix> Arbitrary for Graph<N, E, Ty, Ix> - where N: Arbitrary, - E: Arbitrary, - Ty: EdgeType + Send + 'static, - Ix: IndexType + Send, -{ - fn arbitrary<G: Gen>(g: &mut G) -> Self { - let nodes = usize::arbitrary(g); - if nodes == 0 { - return Graph::with_capacity(0, 0); - } - // use X² for edge probability (bias towards lower) - let edge_prob = g.gen_range(0., 1.) * g.gen_range(0., 1.); - let edges = ((nodes as f64).powi(2) * edge_prob) as usize; - let mut gr = Graph::with_capacity(nodes, edges); - for _ in 0..nodes { - gr.add_node(N::arbitrary(g)); - } - for i in gr.node_indices() { - for j in gr.node_indices() { - if !gr.is_directed() && i > j { - continue; - } - let p: f64 = g.gen(); - if p <= edge_prob { - gr.add_edge(i, j, E::arbitrary(g)); - } - } - } - gr - } - - // shrink the graph by splitting it in two by a very - // simple algorithm, just even and odd node indices - fn shrink(&self) -> Box<Iterator<Item=Self>> { - let self_ = self.clone(); - Box::new((0..2).filter_map(move |x| { - let gr = self_.filter_map(|i, w| { - if i.index() % 2 == x { - Some(w.clone()) - } else { - None - } - }, - |_, w| Some(w.clone()) - ); - // make sure we shrink - if gr.node_count() < self_.node_count() { - Some(gr) - } else { - None - } - })) - } -} - -#[cfg(feature = "stable_graph")] -/// `Arbitrary` for `StableGraph` creates a graph by selecting a node count -/// and a probability for each possible edge to exist. -/// -/// The result will be simple graph or digraph, with possible -/// self loops, no parallel edges. -/// -/// The exact properties of the produced graph is subject to change. -/// -/// Requires crate features `"quickcheck"` and `"stable_graph"` -impl<N, E, Ty, Ix> Arbitrary for StableGraph<N, E, Ty, Ix> - where N: Arbitrary, - E: Arbitrary, - Ty: EdgeType + Send + 'static, - Ix: IndexType + Send, -{ - fn arbitrary<G: Gen>(g: &mut G) -> Self { - let nodes = usize::arbitrary(g); - if nodes == 0 { - return StableGraph::with_capacity(0, 0); - } - // use X² for edge probability (bias towards lower) - let edge_prob = g.gen_range(0., 1.) * g.gen_range(0., 1.); - let edges = ((nodes as f64).powi(2) * edge_prob) as usize; - let mut gr = StableGraph::with_capacity(nodes, edges); - for _ in 0..nodes { - gr.add_node(N::arbitrary(g)); - } - for i in 0..gr.node_count() { - for j in 0..gr.node_count() { - let i = node_index(i); - let j = node_index(j); - if !gr.is_directed() && i > j { - continue; - } - let p: f64 = g.gen(); - if p <= edge_prob { - gr.add_edge(i, j, E::arbitrary(g)); - } - } - } - if bool::arbitrary(g) { - // potentially remove nodes to make holes in nodes & edge sets - let n = u8::arbitrary(g) % (gr.node_count() as u8); - for _ in 0..n { - let ni = node_index(usize::arbitrary(g) % gr.node_bound()); - if gr.node_weight(ni).is_some() { - gr.remove_node(ni); - } - } - } - gr - } - - // shrink the graph by splitting it in two by a very - // simple algorithm, just even and odd node indices - fn shrink(&self) -> Box<Iterator<Item=Self>> { - let self_ = self.clone(); - Box::new((0..2).filter_map(move |x| { - let gr = self_.filter_map(|i, w| { - if i.index() % 2 == x { - Some(w.clone()) - } else { - None - } - }, - |_, w| Some(w.clone()) - ); - // make sure we shrink - if gr.node_count() < self_.node_count() { - Some(gr) - } else { - None - } - })) - } -} - -/// `Arbitrary` for `GraphMap` creates a graph by selecting a node count -/// and a probability for each possible edge to exist. -/// -/// The result will be simple graph or digraph, self loops -/// possible, no parallel edges. -/// -/// The exact properties of the produced graph is subject to change. -/// -/// Requires crate features `"quickcheck"` and `"graphmap"` -#[cfg(feature = "graphmap")] -impl<N, E, Ty> Arbitrary for GraphMap<N, E, Ty> - where N: NodeTrait + Arbitrary, - E: Arbitrary, - Ty: EdgeType + Clone + Send + 'static, -{ - fn arbitrary<G: Gen>(g: &mut G) -> Self { - let nodes = usize::arbitrary(g); - if nodes == 0 { - return GraphMap::with_capacity(0, 0); - } - let mut nodes = (0..nodes).map(|_| N::arbitrary(g)).collect::<Vec<_>>(); - nodes.sort(); - nodes.dedup(); - - // use X² for edge probability (bias towards lower) - let edge_prob = g.gen_range(0., 1.) * g.gen_range(0., 1.); - let edges = ((nodes.len() as f64).powi(2) * edge_prob) as usize; - let mut gr = GraphMap::with_capacity(nodes.len(), edges); - for &node in &nodes { - gr.add_node(node); - } - for (index, &i) in nodes.iter().enumerate() { - let js = if Ty::is_directed() { &nodes[..] } else { &nodes[index..] }; - for &j in js { - let p: f64 = g.gen(); - if p <= edge_prob { - gr.add_edge(i, j, E::arbitrary(g)); - } - } - } - gr - } -} diff --git a/vendor/petgraph/src/scored.rs b/vendor/petgraph/src/scored.rs deleted file mode 100644 index cb191474f2..0000000000 --- a/vendor/petgraph/src/scored.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::cmp::Ordering; - -/// `MinScored<K, T>` holds a score `K` and a scored object `T` in -/// a pair for use with a `BinaryHeap`. -/// -/// `MinScored` compares in reverse order by the score, so that we can -/// use `BinaryHeap` as a min-heap to extract the score-value pair with the -/// least score. -/// -/// **Note:** `MinScored` implements a total order (`Ord`), so that it is -/// possible to use float types as scores. -#[derive(Copy, Clone, Debug)] -pub struct MinScored<K, T>(pub K, pub T); - -impl<K: PartialOrd, T> PartialEq for MinScored<K, T> { - #[inline] - fn eq(&self, other: &MinScored<K, T>) -> bool { - self.cmp(other) == Ordering::Equal - } -} - -impl<K: PartialOrd, T> Eq for MinScored<K, T> {} - -impl<K: PartialOrd, T> PartialOrd for MinScored<K, T> { - #[inline] - fn partial_cmp(&self, other: &MinScored<K, T>) -> Option<Ordering> { - Some(self.cmp(other)) - } -} - -impl<K: PartialOrd, T> Ord for MinScored<K, T> { - #[inline] - fn cmp(&self, other: &MinScored<K, T>) -> Ordering { - let a = &self.0; - let b = &other.0; - if a == b { - Ordering::Equal - } else if a < b { - Ordering::Greater - } else if a > b { - Ordering::Less - } else if a != a && b != b { - // these are the NaN cases - Ordering::Equal - } else if a != a { - // Order NaN less, so that it is last in the MinScore order - Ordering::Less - } else { - Ordering::Greater - } - } -} - diff --git a/vendor/petgraph/src/serde_utils.rs b/vendor/petgraph/src/serde_utils.rs deleted file mode 100644 index fcda128e5f..0000000000 --- a/vendor/petgraph/src/serde_utils.rs +++ /dev/null @@ -1,92 +0,0 @@ -use std::fmt; -use std::marker::PhantomData; -use serde::de::{Error, Visitor, Deserialize, SeqAccess}; -use serde::ser::{Serializer, SerializeSeq, Serialize}; - -/// Map to serializeable representation -pub trait IntoSerializable { - type Output; - fn into_serializable(self) -> Self::Output; -} - -/// Map from deserialized representation -pub trait FromDeserialized : Sized { - type Input; - fn from_deserialized<E>(input: Self::Input) -> Result<Self, E> where E: Error; -} - - - -/// Serde combinator. A sequence visitor that maps deserialized elements -/// lazily; the visitor can also emit new errors if the elements have errors. -pub struct MappedSequenceVisitor<T, R, F> - where F: Fn(T) -> Result<R, &'static str> -{ - f: F, - marker: PhantomData<fn() -> T> -} - -impl<'de, F, T, R> MappedSequenceVisitor<T, R, F> - where T: Deserialize<'de>, - F: Fn(T) -> Result<R, &'static str>, -{ - pub fn new(f: F) -> Self { - MappedSequenceVisitor { - f: f, - marker: PhantomData, - } - } -} - -impl<'de, F, T, R> Visitor<'de> for MappedSequenceVisitor<T, R, F> - where T: Deserialize<'de>, - F: Fn(T) -> Result<R, &'static str>, -{ - type Value = Vec<R>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!(formatter, "a sequence") - } - fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> - where A: SeqAccess<'de>, - { - let mut v = Vec::new(); - while let Some(elem) = seq.next_element()? { - match (self.f)(elem) { - Err(s) => Err(<A::Error>::custom(s))?, - Ok(x) => v.push(x), - } - } - Ok(v) - } -} - - -pub trait CollectSeqWithLength : Serializer { - fn collect_seq_with_length<I>(self, length: usize, iterable: I) - -> Result<Self::Ok, Self::Error> - where I: IntoIterator, - I::Item: Serialize - { - let mut count = 0; - let mut seq = self.serialize_seq(Some(length))?; - for element in iterable { - seq.serialize_element(&element)?; - count += 1; - } - debug_assert_eq!(length, count, "collect_seq_with_length: length mismatch!"); - seq.end() - } - - fn collect_seq_exact<I>(self, iterable: I) - -> Result<Self::Ok, Self::Error> - where I: IntoIterator, - I::Item: Serialize, - I::IntoIter: ExactSizeIterator, - { - let iter = iterable.into_iter(); - self.collect_seq_with_length(iter.len(), iter) - } -} - -impl<S> CollectSeqWithLength for S where S: Serializer { } diff --git a/vendor/petgraph/src/traits_graph.rs b/vendor/petgraph/src/traits_graph.rs deleted file mode 100644 index 90e5fbad84..0000000000 --- a/vendor/petgraph/src/traits_graph.rs +++ /dev/null @@ -1,85 +0,0 @@ - -use fixedbitset::FixedBitSet; - -use super::{ - EdgeType, -}; - -use super::graph::{ - Graph, - IndexType, - NodeIndex, -}; -#[cfg(feature = "stable_graph")] -use stable_graph::StableGraph; -#[cfg(feature = "stable_graph")] -use visit::{NodeIndexable, IntoEdgeReferences}; -use visit::EdgeRef; - -use super::visit::GetAdjacencyMatrix; - -/// The adjacency matrix for **Graph** is a bitmap that's computed by -/// `.adjacency_matrix()`. -impl<N, E, Ty, Ix> GetAdjacencyMatrix for Graph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - type AdjMatrix = FixedBitSet; - - fn adjacency_matrix(&self) -> FixedBitSet - { - let n = self.node_count(); - let mut matrix = FixedBitSet::with_capacity(n * n); - for edge in self.edge_references() { - let i = edge.source().index() * n + edge.target().index(); - matrix.put(i); - if !self.is_directed() { - let j = edge.source().index() + n * edge.target().index(); - matrix.put(j); - } - } - matrix - } - - fn is_adjacent(&self, matrix: &FixedBitSet, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool - { - let n = self.node_count(); - let index = n * a.index() + b.index(); - matrix.contains(index) - } -} - - -#[cfg(feature = "stable_graph")] -/// The adjacency matrix for **Graph** is a bitmap that's computed by -/// `.adjacency_matrix()`. -impl<N, E, Ty, Ix> GetAdjacencyMatrix for StableGraph<N, E, Ty, Ix> where - Ty: EdgeType, - Ix: IndexType, -{ - type AdjMatrix = FixedBitSet; - - fn adjacency_matrix(&self) -> FixedBitSet - { - let n = self.node_bound(); - let mut matrix = FixedBitSet::with_capacity(n * n); - for edge in self.edge_references() { - let i = edge.source().index() * n + edge.target().index(); - matrix.put(i); - if !self.is_directed() { - let j = edge.source().index() + n * edge.target().index(); - matrix.put(j); - } - } - matrix - } - - fn is_adjacent(&self, matrix: &FixedBitSet, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool - { - let n = self.node_count(); - let index = n * a.index() + b.index(); - matrix.contains(index) - } -} - - diff --git a/vendor/petgraph/src/unionfind.rs b/vendor/petgraph/src/unionfind.rs deleted file mode 100644 index 6521468cc0..0000000000 --- a/vendor/petgraph/src/unionfind.rs +++ /dev/null @@ -1,145 +0,0 @@ -//! `UnionFind<K>` is a disjoint-set data structure. - -use super::graph::IndexType; - -/// `UnionFind<K>` is a disjoint-set data structure. It tracks set membership of *n* elements -/// indexed from *0* to *n - 1*. The scalar type is `K` which must be an unsigned integer type. -/// -/// <http://en.wikipedia.org/wiki/Disjoint-set_data_structure> -/// -/// Too awesome not to quote: -/// -/// “The amortized time per operation is **O(α(n))** where **α(n)** is the -/// inverse of **f(x) = A(x, x)** with **A** being the extremely fast-growing Ackermann function.” -#[derive(Debug, Clone)] -pub struct UnionFind<K> -{ - // For element at index *i*, store the index of its parent; the representative itself - // stores its own index. This forms equivalence classes which are the disjoint sets, each - // with a unique representative. - parent: Vec<K>, - // It is a balancing tree structure, - // so the ranks are logarithmic in the size of the container -- a byte is more than enough. - // - // Rank is separated out both to save space and to save cache in when searching in the parent - // vector. - rank: Vec<u8>, -} - -#[inline] -unsafe fn get_unchecked<K>(xs: &[K], index: usize) -> &K -{ - debug_assert!(index < xs.len()); - xs.get_unchecked(index) -} - -impl<K> UnionFind<K> - where K: IndexType -{ - /// Create a new `UnionFind` of `n` disjoint sets. - pub fn new(n: usize) -> Self - { - let rank = vec![0; n]; - let parent = (0..n).map(K::new).collect::<Vec<K>>(); - - UnionFind{parent: parent, rank: rank} - } - - /// Return the representative for `x`. - /// - /// **Panics** if `x` is out of bounds. - pub fn find(&self, x: K) -> K - { - assert!(x.index() < self.parent.len()); - unsafe { - let mut x = x; - loop { - // Use unchecked indexing because we can trust the internal set ids. - let xparent = *get_unchecked(&self.parent, x.index()); - if xparent == x { - break - } - x = xparent; - } - x - } - } - - /// Return the representative for `x`. - /// - /// Write back the found representative, flattening the internal - /// datastructure in the process and quicken future lookups. - /// - /// **Panics** if `x` is out of bounds. - pub fn find_mut(&mut self, x: K) -> K - { - assert!(x.index() < self.parent.len()); - unsafe { - self.find_mut_recursive(x) - } - } - - unsafe fn find_mut_recursive(&mut self, x: K) -> K - { - let xparent = *get_unchecked(&self.parent, x.index()); - if xparent != x { - let xrep = self.find_mut_recursive(xparent); - let xparent = self.parent.get_unchecked_mut(x.index()); - *xparent = xrep; - *xparent - } else { - xparent - } - } - - - /// Unify the two sets containing `x` and `y`. - /// - /// Return `false` if the sets were already the same, `true` if they were unified. - /// - /// **Panics** if `x` or `y` is out of bounds. - pub fn union(&mut self, x: K, y: K) -> bool - { - if x == y { - return false - } - let xrep = self.find_mut(x); - let yrep = self.find_mut(y); - - if xrep == yrep { - return false - } - - let xrepu = xrep.index(); - let yrepu = yrep.index(); - let xrank = self.rank[xrepu]; - let yrank = self.rank[yrepu]; - - // The rank corresponds roughly to the depth of the treeset, so put the - // smaller set below the larger - if xrank < yrank { - self.parent[xrepu] = yrep; - } else if xrank > yrank { - self.parent[yrepu] = xrep; - } else { - // put y below x when equal. - self.parent[yrepu] = xrep; - self.rank[xrepu] += 1; - } - true - } - - /// Return a vector mapping each element to its representative. - pub fn into_labeling(mut self) -> Vec<K> - { - // write in the labeling of each element - unsafe { - for ix in 0..self.parent.len() { - let k = *get_unchecked(&self.parent, ix); - let xrep = self.find_mut_recursive(k); - *self.parent.get_unchecked_mut(ix) = xrep; - } - } - self.parent - } -} diff --git a/vendor/petgraph/src/util.rs b/vendor/petgraph/src/util.rs deleted file mode 100644 index 7cc34453d4..0000000000 --- a/vendor/petgraph/src/util.rs +++ /dev/null @@ -1,23 +0,0 @@ - -use std::iter; - -pub fn enumerate<I>(iterable: I) -> iter::Enumerate<I::IntoIter> - where I: IntoIterator -{ - iterable.into_iter().enumerate() -} - -#[cfg(feature = "serde-1")] -pub fn rev<I>(iterable: I) -> iter::Rev<I::IntoIter> - where I: IntoIterator, - I::IntoIter: DoubleEndedIterator -{ - iterable.into_iter().rev() -} - -pub fn zip<I, J>(i: I, j: J) -> iter::Zip<I::IntoIter, J::IntoIter> - where I: IntoIterator, - J: IntoIterator -{ - i.into_iter().zip(j) -} diff --git a/vendor/petgraph/src/visit/dfsvisit.rs b/vendor/petgraph/src/visit/dfsvisit.rs deleted file mode 100644 index 4e8a57ba60..0000000000 --- a/vendor/petgraph/src/visit/dfsvisit.rs +++ /dev/null @@ -1,195 +0,0 @@ - - -use visit::IntoNeighbors; -use visit::{VisitMap, Visitable}; - -/// Strictly monotonically increasing event time for a depth first search. -#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Default, Hash)] -pub struct Time(pub usize); - -/// A depth first search (DFS) visitor event. -#[derive(Copy, Clone, Debug)] -pub enum DfsEvent<N> { - Discover(N, Time), - /// An edge of the tree formed by the traversal. - TreeEdge(N, N), - /// An edge to an already visited node. - BackEdge(N, N), - /// A cross or forward edge. - /// - /// For an edge *(u, v)*, if the discover time of *v* is greater than *u*, - /// then it is a forward edge, else a cross edge. - CrossForwardEdge(N, N), - Finish(N, Time), -} - -/// Return if the expression is a break value. -macro_rules! try_control { - ($e:expr) => { - match $e { - x => if x.should_break() { - return x; - } - } - } -} - -/// Control flow for callbacks. -/// -/// `Break` can carry a value. -#[derive(Copy, Clone, Debug)] -pub enum Control<B> { - Continue, - Break(B), -} - -impl<B> Control<B> { - pub fn breaking() -> Control<()> { Control::Break(()) } - /// Get the value in `Control::Break(_)`, if present. - pub fn break_value(self) -> Option<B> { - match self { - Control::Continue => None, - Control::Break(b) => Some(b), - } - } -} - -/// Control flow for callbacks. -/// -/// The empty return value `()` is equivalent to continue. -pub trait ControlFlow { - fn continuing() -> Self; - fn should_break(&self) -> bool; -} - -impl ControlFlow for () { - fn continuing() { } - #[inline] - fn should_break(&self) -> bool { false } -} - -impl<B> ControlFlow for Control<B> { - fn continuing() -> Self { Control::Continue } - fn should_break(&self) -> bool { - if let Control::Break(_) = *self { true } else { false } - } -} - -impl<E> ControlFlow for Result<(), E> { - fn continuing() -> Self { Ok(()) } - fn should_break(&self) -> bool { - self.is_err() - } -} - -/// The default is `Continue`. -impl<B> Default for Control<B> { - fn default() -> Self { Control::Continue } -} - -/// A recursive depth first search. -/// -/// Starting points are the nodes in the iterator `starts` (specify just one -/// start vertex *x* by using `Some(x)`). -/// -/// The traversal emits discovery and finish events for each reachable vertex, -/// and edge classification of each reachable edge. `visitor` is called for each -/// event, see [`DfsEvent`][de] for possible values. -/// -/// If the return value of the visitor is simply `()`, the visit runs until it -/// is finished. If the return value is a `Control<B>`, it can be used to -/// break the visit early, and the last control value is returned by the -/// function. -/// -/// [de]: enum.DfsEvent.html -/// -/// # Example -/// -/// Find a path from vertex 0 to 5, and exit the visit as soon as we reach -/// the goal vertex. -/// -/// ``` -/// use petgraph::prelude::*; -/// use petgraph::graph::node_index as n; -/// use petgraph::visit::depth_first_search; -/// use petgraph::visit::{DfsEvent, Control}; -/// -/// let gr: Graph<(), ()> = Graph::from_edges(&[ -/// (0, 1), (0, 2), (0, 3), -/// (1, 3), -/// (2, 3), (2, 4), -/// (4, 0), (4, 5), -/// ]); -/// -/// // record each predecessor, mapping node → node -/// let mut predecessor = vec![NodeIndex::end(); gr.node_count()]; -/// let start = n(0); -/// let goal = n(5); -/// depth_first_search(&gr, Some(start), |event| { -/// if let DfsEvent::TreeEdge(u, v) = event { -/// predecessor[v.index()] = u; -/// if v == goal { -/// return Control::Break(v); -/// } -/// } -/// Control::Continue -/// }); -/// -/// let mut next = goal; -/// let mut path = vec![next]; -/// while next != start { -/// let pred = predecessor[next.index()]; -/// path.push(pred); -/// next = pred; -/// } -/// path.reverse(); -/// assert_eq!(&path, &[n(0), n(2), n(4), n(5)]); -/// ``` -pub fn depth_first_search<G, I, F, C>(graph: G, starts: I, mut visitor: F) -> C - where G: IntoNeighbors + Visitable, - I: IntoIterator<Item=G::NodeId>, - F: FnMut(DfsEvent<G::NodeId>) -> C, - C: ControlFlow, -{ - let time = &mut Time(0); - let discovered = &mut graph.visit_map(); - let finished = &mut graph.visit_map(); - - for start in starts { - try_control!(dfs_visitor(graph, start, &mut visitor, discovered, finished, time)); - } - C::continuing() -} - -fn dfs_visitor<G, F, C>(graph: G, u: G::NodeId, visitor: &mut F, - discovered: &mut G::Map, finished: &mut G::Map, - time: &mut Time) -> C - where G: IntoNeighbors + Visitable, - F: FnMut(DfsEvent<G::NodeId>) -> C, - C: ControlFlow, -{ - if !discovered.visit(u) { - return C::continuing(); - } - try_control!(visitor(DfsEvent::Discover(u, time_post_inc(time)))); - for v in graph.neighbors(u) { - if !discovered.is_visited(&v) { - try_control!(visitor(DfsEvent::TreeEdge(u, v))); - try_control!(dfs_visitor(graph, v, visitor, discovered, finished, time)); - } else if !finished.is_visited(&v) { - try_control!(visitor(DfsEvent::BackEdge(u, v))); - } else { - try_control!(visitor(DfsEvent::CrossForwardEdge(u, v))); - } - } - let first_finish = finished.visit(u); - debug_assert!(first_finish); - try_control!(visitor(DfsEvent::Finish(u, time_post_inc(time)))); - C::continuing() -} - -fn time_post_inc(x: &mut Time) -> Time { - let v = *x; - x.0 += 1; - v -} diff --git a/vendor/petgraph/src/visit/filter.rs b/vendor/petgraph/src/visit/filter.rs deleted file mode 100644 index 07b3ae9c6a..0000000000 --- a/vendor/petgraph/src/visit/filter.rs +++ /dev/null @@ -1,419 +0,0 @@ - -use prelude::*; - -use fixedbitset::FixedBitSet; -use std::collections::HashSet; -use std::marker::PhantomData; - -use visit::{ - GraphBase, - GraphProp, - IntoEdgeReferences, - IntoEdges, - IntoNeighbors, - IntoNeighborsDirected, - IntoNodeIdentifiers, - IntoNodeReferences, - NodeIndexable, - NodeRef, - VisitMap, - Visitable, -}; -use visit::{Data, NodeCompactIndexable, NodeCount}; -use data::{DataMap}; - -/// A graph filter for nodes. -pub trait FilterNode<N> -{ - /// Return true to have the node be part of the graph - fn include_node(&self, node: N) -> bool; -} - -impl<F, N> FilterNode<N> for F - where F: Fn(N) -> bool, -{ - fn include_node(&self, n: N) -> bool { - (*self)(n) - } -} - -/// This filter includes the nodes that are contained in the set. -impl<N> FilterNode<N> for FixedBitSet - where FixedBitSet: VisitMap<N>, -{ - fn include_node(&self, n: N) -> bool { - self.is_visited(&n) - } -} - -/// This filter includes the nodes that are contained in the set. -impl<N, S> FilterNode<N> for HashSet<N, S> - where HashSet<N, S>: VisitMap<N>, -{ - fn include_node(&self, n: N) -> bool { - self.is_visited(&n) - } -} - -/// A node-filtering graph adaptor. -#[derive(Copy, Clone, Debug)] -pub struct NodeFiltered<G, F>(pub G, pub F); - -impl<F, G> NodeFiltered<G, F> - where G: GraphBase, - F: Fn(G::NodeId) -> bool, -{ - /// Create an `NodeFiltered` adaptor from the closure `filter`. - pub fn from_fn(graph: G, filter: F) -> Self { - NodeFiltered(graph, filter) - } -} - -impl<G, F> GraphBase for NodeFiltered<G, F> where G: GraphBase { - type NodeId = G::NodeId; - type EdgeId = G::EdgeId; -} - -impl<'a, G, F> IntoNeighbors for &'a NodeFiltered<G, F> - where G: IntoNeighbors, - F: FilterNode<G::NodeId>, -{ - type Neighbors = NodeFilteredNeighbors<'a, G::Neighbors, F>; - fn neighbors(self, n: G::NodeId) -> Self::Neighbors { - NodeFilteredNeighbors { - include_source: self.1.include_node(n), - iter: self.0.neighbors(n), - f: &self.1, - } - } -} - -/// A filtered neighbors iterator. -pub struct NodeFilteredNeighbors<'a, I, F: 'a> -{ - include_source: bool, - iter: I, - f: &'a F, -} - -impl<'a, I, F> Iterator for NodeFilteredNeighbors<'a, I, F> - where I: Iterator, - I::Item: Copy, - F: FilterNode<I::Item>, -{ - type Item = I::Item; - fn next(&mut self) -> Option<Self::Item> { - let f = self.f; - if !self.include_source { - None - } else { - self.iter.find(move |&target| f.include_node(target)) - } - } -} - -impl<'a, G, F> IntoNeighborsDirected for &'a NodeFiltered<G, F> - where G: IntoNeighborsDirected, - F: FilterNode<G::NodeId>, -{ - type NeighborsDirected = NodeFilteredNeighbors<'a, G::NeighborsDirected, F>; - fn neighbors_directed(self, n: G::NodeId, dir: Direction) - -> Self::NeighborsDirected { - NodeFilteredNeighbors { - include_source: self.1.include_node(n), - iter: self.0.neighbors_directed(n, dir), - f: &self.1, - } - } -} - -impl<'a, G, F> IntoNodeIdentifiers for &'a NodeFiltered<G, F> - where G: IntoNodeIdentifiers, - F: FilterNode<G::NodeId>, -{ - type NodeIdentifiers = NodeFilteredNeighbors<'a, G::NodeIdentifiers, F>; - fn node_identifiers(self) -> Self::NodeIdentifiers { - NodeFilteredNeighbors { - include_source: true, - iter: self.0.node_identifiers(), - f: &self.1, - } - } -} - -impl<'a, G, F> IntoNodeReferences for &'a NodeFiltered<G, F> - where G: IntoNodeReferences, - F: FilterNode<G::NodeId>, -{ - type NodeRef = G::NodeRef; - type NodeReferences = NodeFilteredNodes<'a, G::NodeReferences, F>; - fn node_references(self) -> Self::NodeReferences { - NodeFilteredNodes { - include_source: true, - iter: self.0.node_references(), - f: &self.1, - } - } -} - -/// A filtered node references iterator. -pub struct NodeFilteredNodes<'a, I, F: 'a> -{ - include_source: bool, - iter: I, - f: &'a F, -} - -impl<'a, I, F> Iterator for NodeFilteredNodes<'a, I, F> - where I: Iterator, - I::Item: Copy + NodeRef, - F: FilterNode<<I::Item as NodeRef>::NodeId>, -{ - type Item = I::Item; - fn next(&mut self) -> Option<Self::Item> { - let f = self.f; - if !self.include_source { - None - } else { - self.iter.find(move |&target| f.include_node(target.id())) - } - } -} - -impl<'a, G, F> IntoEdgeReferences for &'a NodeFiltered<G, F> - where G: IntoEdgeReferences, - F: FilterNode<G::NodeId>, -{ - type EdgeRef = G::EdgeRef; - type EdgeReferences = NodeFilteredEdgeReferences<'a, G, G::EdgeReferences, F>; - fn edge_references(self) -> Self::EdgeReferences { - NodeFilteredEdgeReferences { - graph: PhantomData, - iter: self.0.edge_references(), - f: &self.1, - } - } -} - -/// A filtered edges iterator. -pub struct NodeFilteredEdgeReferences<'a, G, I, F: 'a> -{ - graph: PhantomData<G>, - iter: I, - f: &'a F, -} - -impl<'a, G, I, F> Iterator for NodeFilteredEdgeReferences<'a, G, I, F> - where F: FilterNode<G::NodeId>, - G: IntoEdgeReferences, - I: Iterator<Item=G::EdgeRef>, -{ - type Item = I::Item; - fn next(&mut self) -> Option<Self::Item> { - let f = self.f; - self.iter.find(move |&edge| f.include_node(edge.source()) && - f.include_node(edge.target())) - } -} - -impl<'a, G, F> IntoEdges for &'a NodeFiltered<G, F> - where G: IntoEdges, - F: FilterNode<G::NodeId>, -{ - type Edges = NodeFilteredEdges<'a, G, G::Edges, F>; - fn edges(self, a: G::NodeId) -> Self::Edges { - NodeFilteredEdges { - graph: PhantomData, - include_source: self.1.include_node(a), - iter: self.0.edges(a), - f: &self.1, - } - } -} - - -/// A filtered edges iterator. -pub struct NodeFilteredEdges<'a, G, I, F: 'a> -{ - graph: PhantomData<G>, - include_source: bool, - iter: I, - f: &'a F, -} - - -impl<'a, G, I, F> Iterator for NodeFilteredEdges<'a, G, I, F> - where F: FilterNode<G::NodeId>, - G: IntoEdges, - I: Iterator<Item=G::EdgeRef>, -{ - type Item = I::Item; - fn next(&mut self) -> Option<Self::Item> { - if !self.include_source { - None - } else { - let f = self.f; - self.iter.find(move |&edge| f.include_node(edge.target())) - } - } -} - -impl<G, F> DataMap for NodeFiltered<G, F> - where G: DataMap, - F: FilterNode<G::NodeId>, -{ - fn node_weight(&self, id: Self::NodeId) -> Option<&Self::NodeWeight> { - if self.1.include_node(id) { - self.0.node_weight(id) - } else { - None - } - } - - fn edge_weight(&self, id: Self::EdgeId) -> Option<&Self::EdgeWeight> { - self.0.edge_weight(id) - } -} - -macro_rules! access0 { - ($e:expr) => ($e.0) -} - -Data!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]} -NodeIndexable!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]} -GraphProp!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]} -Visitable!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]} - -/// A graph filter for edges -pub trait FilterEdge<Edge> { - /// Return true to have the edge be part of the graph - fn include_edge(&self, edge: Edge) -> bool; -} - -impl<F, N> FilterEdge<N> for F - where F: Fn(N) -> bool, -{ - fn include_edge(&self, n: N) -> bool { - (*self)(n) - } -} - -/// An edge-filtering graph adaptor. -/// -/// The adaptor may filter out edges. The filter implements the trait -/// `FilterEdge`. Closures of type `Fn(G::EdgeRef) -> bool` already -/// implement this trait. -/// -/// The filter may use edge source, target, id, and weight to select whether to -/// include the edge or not. -#[derive(Copy, Clone, Debug)] -pub struct EdgeFiltered<G, F>(pub G, pub F); - -impl<F, G> EdgeFiltered<G, F> - where G: IntoEdgeReferences, - F: Fn(G::EdgeRef) -> bool, -{ - /// Create an `EdgeFiltered` adaptor from the closure `filter`. - pub fn from_fn(graph: G, filter: F) -> Self { - EdgeFiltered(graph, filter) - } -} - -impl<G, F> GraphBase for EdgeFiltered<G, F> where G: GraphBase { - type NodeId = G::NodeId; - type EdgeId = G::EdgeId; -} - -impl<'a, G, F> IntoNeighbors for &'a EdgeFiltered<G, F> - where G: IntoEdges, - F: FilterEdge<G::EdgeRef>, -{ - type Neighbors = EdgeFilteredNeighbors<'a, G, F>; - fn neighbors(self, n: G::NodeId) -> Self::Neighbors { - EdgeFilteredNeighbors { - iter: self.0.edges(n), - f: &self.1, - } - } -} - -/// A filtered neighbors iterator. -pub struct EdgeFilteredNeighbors<'a, G, F: 'a> - where G: IntoEdges, -{ - iter: G::Edges, - f: &'a F, -} - -impl<'a, G, F> Iterator for EdgeFilteredNeighbors<'a, G, F> - where F: FilterEdge<G::EdgeRef>, - G: IntoEdges, -{ - type Item = G::NodeId; - fn next(&mut self) -> Option<Self::Item> { - let f = self.f; - (&mut self.iter).filter_map(move |edge| { - if f.include_edge(edge) { - Some(edge.target()) - } else { None } - }).next() - } -} - -impl<'a, G, F> IntoEdgeReferences for &'a EdgeFiltered<G, F> - where G: IntoEdgeReferences, - F: FilterEdge<G::EdgeRef>, -{ - type EdgeRef = G::EdgeRef; - type EdgeReferences = EdgeFilteredEdges<'a, G, G::EdgeReferences, F>; - fn edge_references(self) -> Self::EdgeReferences { - EdgeFilteredEdges { - graph: PhantomData, - iter: self.0.edge_references(), - f: &self.1, - } - } -} - -impl<'a, G, F> IntoEdges for &'a EdgeFiltered<G, F> - where G: IntoEdges, - F: FilterEdge<G::EdgeRef>, -{ - type Edges = EdgeFilteredEdges<'a, G, G::Edges, F>; - fn edges(self, n: G::NodeId) -> Self::Edges { - EdgeFilteredEdges { - graph: PhantomData, - iter: self.0.edges(n), - f: &self.1, - } - } -} - -/// A filtered edges iterator. -pub struct EdgeFilteredEdges<'a, G, I, F: 'a> -{ - graph: PhantomData<G>, - iter: I, - f: &'a F, -} - -impl<'a, G, I, F> Iterator for EdgeFilteredEdges<'a, G, I, F> - where F: FilterEdge<G::EdgeRef>, - G: IntoEdgeReferences, - I: Iterator<Item=G::EdgeRef>, -{ - type Item = I::Item; - fn next(&mut self) -> Option<Self::Item> { - let f = self.f; - self.iter.find(move |&edge| f.include_edge(edge)) - } -} - -Data!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]} -GraphProp!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]} -IntoNodeIdentifiers!{delegate_impl [['a, G, F], G, &'a EdgeFiltered<G, F>, access0]} -IntoNodeReferences!{delegate_impl [['a, G, F], G, &'a EdgeFiltered<G, F>, access0]} -NodeCompactIndexable!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]} -NodeCount!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]} -NodeIndexable!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]} -Visitable!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]} diff --git a/vendor/petgraph/src/visit/macros.rs b/vendor/petgraph/src/visit/macros.rs deleted file mode 100644 index 7fa3245b70..0000000000 --- a/vendor/petgraph/src/visit/macros.rs +++ /dev/null @@ -1,133 +0,0 @@ - -/// Define a trait as usual, and a macro that can be used to instantiate -/// implementations of it. -/// -/// There *must* be section markers in the trait defition: -/// @section type for associated types -/// @section self for methods -/// @section nodelegate for arbitrary tail that is not forwarded. -macro_rules! trait_template { - ($(#[$doc:meta])* pub trait $name:ident $($methods:tt)*) => { - macro_rules! $name { - ($m:ident $extra:tt) => { - $m! { - $extra - pub trait $name $($methods)* - } - } - } - - remove_sections! { [] - $(#[$doc])* - pub trait $name $($methods)* - - // This is where the trait definition is reproduced by the macro. - // It makes the source links point to this place! - // - // I'm sorry, you'll have to find the source by looking at the - // source of the module the trait is defined in. - // - // We use this nifty macro so that we can automatically generate - // delegation trait impls and implement the graph traits for more - // types and combinators. - } - } -} - -macro_rules! remove_sections_inner { - ([$($stack:tt)*]) => { - $($stack)* - }; - // escape the following tt - ([$($stack:tt)*] @escape $_x:tt $($t:tt)*) => { - remove_sections_inner!([$($stack)*] $($t)*); - }; - ([$($stack:tt)*] @section $x:ident $($t:tt)*) => { - remove_sections_inner!([$($stack)*] $($t)*); - }; - ([$($stack:tt)*] $t:tt $($tail:tt)*) => { - remove_sections_inner!([$($stack)* $t] $($tail)*); - }; -} - -// This is the outer layer, just find the { } of the actual trait definition -// recurse once into { }, but not more. -macro_rules! remove_sections { - ([$($stack:tt)*]) => { - $($stack)* - }; - ([$($stack:tt)*] { $($tail:tt)* }) => { - $($stack)* { - remove_sections_inner!([] $($tail)*); - } - }; - ([$($stack:tt)*] $t:tt $($tail:tt)*) => { - remove_sections!([$($stack)* $t] $($tail)*); - }; -} - -macro_rules! deref { - ($e:expr) => (*$e); -} -macro_rules! deref_twice { - ($e:expr) => (**$e); -} - -/// Implement a trait by delegation. By default as if we are delegating -/// from &G to G. -macro_rules! delegate_impl { - ([] $($rest:tt)*) => { - delegate_impl! { [['a, G], G, &'a G, deref] $($rest)* } - }; - ([[$($param:tt)*], $self_type:ident, $self_wrap:ty, $self_map:ident] - pub trait $name:ident $(: $sup:ident)* $(+ $more_sup:ident)* { - - // "Escaped" associated types. Stripped before making the `trait` - // itself, but forwarded when delegating impls. - $( - @escape [type $assoc_name_ext:ident] - // Associated types. Forwarded. - )* - $( - @section type - $( - $(#[$_assoc_attr:meta])* - type $assoc_name:ident $(: $assoc_bound:ty)*; - )+ - )* - // Methods. Forwarded. Using $self_map!(self) around the self argument. - // Methods must use receiver `self` or explicit type like `self: &Self` - // &self and &mut self are _not_ supported. - $( - @section self - $( - $(#[$_method_attr:meta])* - fn $method_name:ident(self $(: $self_selftype:ty)* $(,$marg:ident : $marg_ty:ty)*) -> $mret:ty; - )+ - )* - // Arbitrary tail that is ignored when forwarding. - $( - @section nodelegate - $($tail:tt)* - )* - }) => { - impl<$($param)*> $name for $self_wrap where $self_type: $name { - $( - $( - type $assoc_name = $self_type::$assoc_name; - )* - )* - $( - type $assoc_name_ext = $self_type::$assoc_name_ext; - )* - $( - $( - fn $method_name(self $(: $self_selftype)* $(,$marg: $marg_ty)*) -> $mret { - $self_map!(self).$method_name($($marg),*) - } - )* - )* - } - } -} - diff --git a/vendor/petgraph/src/visit/mod.rs b/vendor/petgraph/src/visit/mod.rs deleted file mode 100644 index 7383497bd6..0000000000 --- a/vendor/petgraph/src/visit/mod.rs +++ /dev/null @@ -1,714 +0,0 @@ -//! Graph traits and graph traversals. -//! -//! ### The `Into-` Traits -//! -//! Graph traits like [`IntoNeighbors`][in] create iterators and use the same -//! pattern that `IntoIterator` does: the trait takes a reference to a graph, -//! and produces an iterator. These traits are quite composable, but with the -//! limitation that they only use shared references to graphs. -//! -//! ### Graph Traversal -//! -//! [`Dfs`](struct.Dfs.html), [`Bfs`][bfs], [`DfsPostOrder`][dfspo] and -//! [`Topo`][topo] are basic visitors and they use “walker” methods: the -//! visitors don't hold the graph as borrowed during traversal, only for the -//! `.next()` call on the walker. They can be converted to iterators -//! through the [`Walker`][w] trait. -//! -//! There is also the callback based traversal [`depth_first_search`][dfs]. -//! -//! [bfs]: struct.Bfs.html -//! [dfspo]: struct.DfsPostOrder.html -//! [topo]: struct.Topo.html -//! [dfs]: fn.depth_first_search.html -//! [w]: trait.Walker.html -//! -//! ### Other Graph Traits -//! -//! The traits are rather loosely coupled at the moment (which is intentional, -//! but will develop a bit), and there are traits missing that could be added. -//! -//! Not much is needed to be able to use the visitors on a graph. A graph -//! needs to define [`GraphBase`][gb], [`IntoNeighbors`][in] and -//! [`Visitable`][vis] as a minimum. -//! -//! [gb]: trait.GraphBase.html -//! [in]: trait.IntoNeighbors.html -//! [vis]: trait.Visitable.html -//! - -// filter, reversed have their `mod` lines at the end, -// so that they can use the trait template macros -pub use self::filter::*; -pub use self::reversed::*; - -#[macro_use] mod macros; - -mod dfsvisit; -mod traversal; -pub use self::dfsvisit::*; -pub use self::traversal::*; - -use fixedbitset::FixedBitSet; -use std::collections::{ - HashSet, -}; -use std::hash::{Hash, BuildHasher}; - -use prelude::{Graph, Direction}; -#[cfg(feature = "graphmap")] -use prelude::GraphMap; -#[cfg(feature = "stable_graph")] -use prelude::StableGraph; -use graph::{NodeIndex}; -use super::{ - graph, - EdgeType, -}; - -use graph::{ - IndexType, -}; -#[cfg(feature = "stable_graph")] -use stable_graph; -use graph::Frozen; - -#[cfg(feature = "graphmap")] -use graphmap::{ - self, - NodeTrait, -}; - -trait_template!{ -/// Base graph trait: defines the associated node identifier and -/// edge identifier types. -pub trait GraphBase { - // FIXME: We can drop this escape/nodelegate stuff in Rust 1.18 - @escape [type NodeId] - @escape [type EdgeId] - @section nodelegate - /// edge identifier - type EdgeId: Copy + PartialEq; - /// node identifier - type NodeId: Copy + PartialEq; -} -} - -GraphBase!{delegate_impl []} -GraphBase!{delegate_impl [['a, G], G, &'a mut G, deref]} - -/// A copyable reference to a graph. -pub trait GraphRef : Copy + GraphBase { } - -impl<'a, G> GraphRef for &'a G where G: GraphBase { } - -impl<'a, G> GraphBase for Frozen<'a, G> where G: GraphBase { - type NodeId = G::NodeId; - type EdgeId = G::EdgeId; -} - -#[cfg(feature = "stable_graph")] -impl<'a, N, E: 'a, Ty, Ix> IntoNeighbors for &'a StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Neighbors = stable_graph::Neighbors<'a, E, Ix>; - fn neighbors(self, n: Self::NodeId) -> Self::Neighbors { - (*self).neighbors(n) - } -} - - -#[cfg(feature = "graphmap")] -impl<'a, N: 'a, E, Ty> IntoNeighbors for &'a GraphMap<N, E, Ty> - where N: Copy + Ord + Hash, - Ty: EdgeType, -{ - type Neighbors = graphmap::Neighbors<'a, N, Ty>; - fn neighbors(self, n: Self::NodeId) -> Self::Neighbors { - self.neighbors(n) - } -} - - -trait_template! { -/// Access to the neighbors of each node -/// -/// The neighbors are, depending on the graph’s edge type: -/// -/// - `Directed`: All targets of edges from `a`. -/// - `Undirected`: All other endpoints of edges connected to `a`. -pub trait IntoNeighbors : GraphRef { - @section type - type Neighbors: Iterator<Item=Self::NodeId>; - @section self - /// Return an iterator of the neighbors of node `a`. - fn neighbors(self: Self, a: Self::NodeId) -> Self::Neighbors; -} -} - -IntoNeighbors!{delegate_impl []} - -trait_template! { -/// Access to the neighbors of each node, through incoming or outgoing edges. -/// -/// Depending on the graph’s edge type, the neighbors of a given directionality -/// are: -/// -/// - `Directed`, `Outgoing`: All targets of edges from `a`. -/// - `Directed`, `Incoming`: All sources of edges to `a`. -/// - `Undirected`: All other endpoints of edges connected to `a`. -pub trait IntoNeighborsDirected : IntoNeighbors { - @section type - type NeighborsDirected: Iterator<Item=Self::NodeId>; - @section self - fn neighbors_directed(self, n: Self::NodeId, d: Direction) - -> Self::NeighborsDirected; -} -} - -impl<'a, N, E: 'a, Ty, Ix> IntoNeighbors for &'a Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Neighbors = graph::Neighbors<'a, E, Ix>; - fn neighbors(self, n: graph::NodeIndex<Ix>) - -> graph::Neighbors<'a, E, Ix> - { - Graph::neighbors(self, n) - } -} - -impl<'a, N, E: 'a, Ty, Ix> IntoNeighborsDirected for &'a Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NeighborsDirected = graph::Neighbors<'a, E, Ix>; - fn neighbors_directed(self, n: graph::NodeIndex<Ix>, d: Direction) - -> graph::Neighbors<'a, E, Ix> - { - Graph::neighbors_directed(self, n, d) - } -} - -#[cfg(feature = "stable_graph")] -impl<'a, N, E: 'a, Ty, Ix> IntoNeighborsDirected for &'a StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NeighborsDirected = stable_graph::Neighbors<'a, E, Ix>; - fn neighbors_directed(self, n: graph::NodeIndex<Ix>, d: Direction) - -> Self::NeighborsDirected - { - StableGraph::neighbors_directed(self, n, d) - } -} - -#[cfg(feature = "graphmap")] -impl<'a, N: 'a, E, Ty> IntoNeighborsDirected for &'a GraphMap<N, E, Ty> - where N: Copy + Ord + Hash, - Ty: EdgeType, -{ - type NeighborsDirected = graphmap::NeighborsDirected<'a, N, Ty>; - fn neighbors_directed(self, n: N, dir: Direction) - -> Self::NeighborsDirected - { - self.neighbors_directed(n, dir) - } -} - -trait_template! { -/// Access to the edges of each node. -/// -/// The edges are, depending on the graph’s edge type: -/// -/// - `Directed`: All edges from `a`. -/// - `Undirected`: All edges connected to `a`. -/// -/// This is an extended version of the trait `IntoNeighbors`; the former -/// only iterates over the target node identifiers, while this trait -/// yields edge references (trait [`EdgeRef`][er]). -/// -/// [er]: trait.EdgeRef.html -pub trait IntoEdges : IntoEdgeReferences + IntoNeighbors { - @section type - type Edges: Iterator<Item=Self::EdgeRef>; - @section self - fn edges(self, a: Self::NodeId) -> Self::Edges; -} -} - -IntoEdges!{delegate_impl []} - -trait_template! { -/// Access to all edges of each node, in the specified direction. -/// -/// The edges are, depending on the direction and the graph’s edge type: -/// -/// -/// - `Directed`, `Outgoing`: All edges from `a`. -/// - `Directed`, `Incoming`: All edges to `a`. -/// - `Undirected`: All edges connected to `a`. -/// -/// This is an extended version of the trait `IntoNeighborsDirected`; the former -/// only iterates over the target node identifiers, while this trait -/// yields edge references (trait [`EdgeRef`][er]). -/// -/// [er]: trait.EdgeRef.html -pub trait IntoEdgesDirected : IntoEdges + IntoNeighborsDirected { - @section type - type EdgesDirected: Iterator<Item=Self::EdgeRef>; - @section self - fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected; -} -} - -IntoEdgesDirected!{delegate_impl []} - -trait_template! { -/// Access to the sequence of the graph’s `NodeId`s. -pub trait IntoNodeIdentifiers : GraphRef { - @section type - type NodeIdentifiers: Iterator<Item=Self::NodeId>; - @section self - fn node_identifiers(self) -> Self::NodeIdentifiers; -} -} - -IntoNodeIdentifiers!{delegate_impl []} - -impl<'a, N, E: 'a, Ty, Ix> IntoNodeIdentifiers for &'a Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NodeIdentifiers = graph::NodeIndices<Ix>; - fn node_identifiers(self) -> graph::NodeIndices<Ix> { - Graph::node_indices(self) - } -} - -impl<N, E, Ty, Ix> NodeCount for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn node_count(&self) -> usize { - self.node_count() - } -} - -#[cfg(feature = "stable_graph")] -impl<'a, N, E: 'a, Ty, Ix> IntoNodeIdentifiers for &'a StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NodeIdentifiers = stable_graph::NodeIndices<'a, N, Ix>; - fn node_identifiers(self) -> Self::NodeIdentifiers { - StableGraph::node_indices(self) - } -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> NodeCount for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn node_count(&self) -> usize { - self.node_count() - } -} - -IntoNeighborsDirected!{delegate_impl []} - -trait_template! { -/// Define associated data for nodes and edges -pub trait Data : GraphBase { - @section type - type NodeWeight; - type EdgeWeight; -} -} - -Data!{delegate_impl []} -Data!{delegate_impl [['a, G], G, &'a mut G, deref]} - -/// An edge reference. -/// -/// Edge references are used by traits `IntoEdges` and `IntoEdgeReferences`. -pub trait EdgeRef : Copy { - type NodeId; - type EdgeId; - type Weight; - /// The source node of the edge. - fn source(&self) -> Self::NodeId; - /// The target node of the edge. - fn target(&self) -> Self::NodeId; - /// A reference to the weight of the edge. - fn weight(&self) -> &Self::Weight; - /// The edge’s identifier. - fn id(&self) -> Self::EdgeId; -} - -impl<'a, N, E> EdgeRef for (N, N, &'a E) - where N: Copy -{ - type NodeId = N; - type EdgeId = (N, N); - type Weight = E; - - fn source(&self) -> N { self.0 } - fn target(&self) -> N { self.1 } - fn weight(&self) -> &E { self.2 } - fn id(&self) -> (N, N) { (self.0, self.1) } -} - -/// A node reference. -pub trait NodeRef : Copy { - type NodeId; - type Weight; - fn id(&self) -> Self::NodeId; - fn weight(&self) -> &Self::Weight; -} - -trait_template! { -/// Access to the sequence of the graph’s nodes -pub trait IntoNodeReferences : Data + IntoNodeIdentifiers { - @section type - type NodeRef: NodeRef<NodeId=Self::NodeId, Weight=Self::NodeWeight>; - type NodeReferences: Iterator<Item=Self::NodeRef>; - @section self - fn node_references(self) -> Self::NodeReferences; -} -} - -IntoNodeReferences!{delegate_impl []} - -impl<Id> NodeRef for (Id, ()) - where Id: Copy, -{ - type NodeId = Id; - type Weight = (); - fn id(&self) -> Self::NodeId { self.0 } - fn weight(&self) -> &Self::Weight { - static DUMMY: () = (); - &DUMMY - } -} - -impl<'a, Id, W> NodeRef for (Id, &'a W) - where Id: Copy, -{ - type NodeId = Id; - type Weight = W; - fn id(&self) -> Self::NodeId { self.0 } - fn weight(&self) -> &Self::Weight { self.1 } -} - - -trait_template! { -/// Access to the sequence of the graph’s edges -pub trait IntoEdgeReferences : Data + GraphRef { - @section type - type EdgeRef: EdgeRef<NodeId=Self::NodeId, EdgeId=Self::EdgeId, - Weight=Self::EdgeWeight>; - type EdgeReferences: Iterator<Item=Self::EdgeRef>; - @section self - fn edge_references(self) -> Self::EdgeReferences; -} -} - -IntoEdgeReferences!{delegate_impl [] } - -#[cfg(feature = "graphmap")] -impl<N, E, Ty> Data for GraphMap<N, E, Ty> - where N: Copy + PartialEq, - Ty: EdgeType, -{ - type NodeWeight = N; - type EdgeWeight = E; -} - -trait_template! { - /// Edge kind property (directed or undirected edges) -pub trait GraphProp : GraphBase { - @section type - /// The kind edges in the graph. - type EdgeType: EdgeType; - - @section nodelegate - fn is_directed(&self) -> bool { - <Self::EdgeType>::is_directed() - } -} -} - -GraphProp!{delegate_impl []} - -impl<N, E, Ty, Ix> GraphProp for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type EdgeType = Ty; -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> GraphProp for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type EdgeType = Ty; -} - -#[cfg(feature = "graphmap")] -impl<N, E, Ty> GraphProp for GraphMap<N, E, Ty> - where N: NodeTrait, - Ty: EdgeType, -{ - type EdgeType = Ty; -} - - -impl<'a, N: 'a, E: 'a, Ty, Ix> IntoEdgeReferences for &'a Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type EdgeRef = graph::EdgeReference<'a, E, Ix>; - type EdgeReferences = graph::EdgeReferences<'a, E, Ix>; - fn edge_references(self) -> Self::EdgeReferences { - (*self).edge_references() - } -} - - -trait_template!{ - /// The graph’s `NodeId`s map to indices - pub trait NodeIndexable : GraphBase { - @section self - /// Return an upper bound of the node indices in the graph - /// (suitable for the size of a bitmap). - fn node_bound(self: &Self) -> usize; - /// Convert `a` to an integer index. - fn to_index(self: &Self, a: Self::NodeId) -> usize; - /// Convert `i` to a node index - fn from_index(self: &Self, i: usize) -> Self::NodeId; - } -} - -NodeIndexable!{delegate_impl []} - -trait_template! { -/// A graph with a known node count. -pub trait NodeCount : GraphBase { - @section self - fn node_count(self: &Self) -> usize; -} -} - -NodeCount!{delegate_impl []} - -trait_template! { -/// The graph’s `NodeId`s map to indices, in a range without holes. -/// -/// The graph's node identifiers correspond to exactly the indices -/// `0..self.node_bound()`. -pub trait NodeCompactIndexable : NodeIndexable + NodeCount { } -} - -NodeCompactIndexable!{delegate_impl []} - -impl<N, E, Ty, Ix> NodeIndexable for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - fn node_bound(&self) -> usize { self.node_count() } - fn to_index(&self, ix: NodeIndex<Ix>) -> usize { ix.index() } - fn from_index(&self, ix: usize) -> Self::NodeId { NodeIndex::new(ix) } -} - -impl<N, E, Ty, Ix> NodeCompactIndexable for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ } - -/// A mapping for storing the visited status for NodeId `N`. -pub trait VisitMap<N> { - /// Mark `a` as visited. - /// - /// Return **true** if this is the first visit, false otherwise. - fn visit(&mut self, a: N) -> bool; - - /// Return whether `a` has been visited before. - fn is_visited(&self, a: &N) -> bool; -} - -impl<Ix> VisitMap<graph::NodeIndex<Ix>> for FixedBitSet - where Ix: IndexType, -{ - fn visit(&mut self, x: graph::NodeIndex<Ix>) -> bool { - !self.put(x.index()) - } - fn is_visited(&self, x: &graph::NodeIndex<Ix>) -> bool { - self.contains(x.index()) - } -} - -impl<Ix> VisitMap<graph::EdgeIndex<Ix>> for FixedBitSet - where Ix: IndexType, -{ - fn visit(&mut self, x: graph::EdgeIndex<Ix>) -> bool { - !self.put(x.index()) - } - fn is_visited(&self, x: &graph::EdgeIndex<Ix>) -> bool { - self.contains(x.index()) - } -} - -impl<Ix> VisitMap<Ix> for FixedBitSet - where Ix: IndexType, -{ - fn visit(&mut self, x: Ix) -> bool { - !self.put(x.index()) - } - fn is_visited(&self, x: &Ix) -> bool { - self.contains(x.index()) - } -} - -impl<N, S> VisitMap<N> for HashSet<N, S> - where N: Hash + Eq, - S: BuildHasher, -{ - fn visit(&mut self, x: N) -> bool { - self.insert(x) - } - fn is_visited(&self, x: &N) -> bool { - self.contains(x) - } -} - -trait_template!{ -/// A graph that can create a map that tracks the visited status of its nodes. -pub trait Visitable : GraphBase { - @section type - /// The associated map type - type Map: VisitMap<Self::NodeId>; - @section self - /// Create a new visitor map - fn visit_map(self: &Self) -> Self::Map; - /// Reset the visitor map (and resize to new size of graph if needed) - fn reset_map(self: &Self, map: &mut Self::Map) -> (); -} -} -Visitable!{delegate_impl []} - -impl<N, E, Ty, Ix> GraphBase for Graph<N, E, Ty, Ix> - where Ix: IndexType, -{ - type NodeId = graph::NodeIndex<Ix>; - type EdgeId = graph::EdgeIndex<Ix>; -} - -impl<N, E, Ty, Ix> Visitable for Graph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Map = FixedBitSet; - fn visit_map(&self) -> FixedBitSet { FixedBitSet::with_capacity(self.node_count()) } - - fn reset_map(&self, map: &mut Self::Map) { - map.clear(); - map.grow(self.node_count()); - } -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> GraphBase for StableGraph<N, E, Ty, Ix> - where Ix: IndexType, -{ - type NodeId = graph::NodeIndex<Ix>; - type EdgeId = graph::EdgeIndex<Ix>; -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> Visitable for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type Map = FixedBitSet; - fn visit_map(&self) -> FixedBitSet { - FixedBitSet::with_capacity(self.node_bound()) - } - fn reset_map(&self, map: &mut Self::Map) { - map.clear(); - map.grow(self.node_bound()); - } -} - -#[cfg(feature = "stable_graph")] -impl<N, E, Ty, Ix> Data for StableGraph<N, E, Ty, Ix> - where Ty: EdgeType, - Ix: IndexType, -{ - type NodeWeight = N; - type EdgeWeight = E; -} - - -#[cfg(feature = "graphmap")] -impl<N, E, Ty> GraphBase for GraphMap<N, E, Ty> - where N: Copy + PartialEq, -{ - type NodeId = N; - type EdgeId = (N, N); -} - -#[cfg(feature = "graphmap")] -impl<N, E, Ty> Visitable for GraphMap<N, E, Ty> - where N: Copy + Ord + Hash, - Ty: EdgeType, -{ - type Map = HashSet<N>; - fn visit_map(&self) -> HashSet<N> { HashSet::with_capacity(self.node_count()) } - fn reset_map(&self, map: &mut Self::Map) { - map.clear(); - } -} - -trait_template! { -/// Create or access the adjacency matrix of a graph. -/// -/// The implementor can either create an adjacency matrix, or it can return -/// a placeholder if it has the needed representation internally. -pub trait GetAdjacencyMatrix : GraphBase { - @section type - /// The associated adjacency matrix type - type AdjMatrix; - @section self - /// Create the adjacency matrix - fn adjacency_matrix(self: &Self) -> Self::AdjMatrix; - /// Return true if there is an edge from `a` to `b`, false otherwise. - /// - /// Computes in O(1) time. - fn is_adjacent(self: &Self, matrix: &Self::AdjMatrix, a: Self::NodeId, b: Self::NodeId) -> bool; -} -} - - -GetAdjacencyMatrix!{delegate_impl []} - -#[cfg(feature = "graphmap")] -/// The `GraphMap` keeps an adjacency matrix internally. -impl<N, E, Ty> GetAdjacencyMatrix for GraphMap<N, E, Ty> - where N: Copy + Ord + Hash, - Ty: EdgeType, -{ - type AdjMatrix = (); - #[inline] - fn adjacency_matrix(&self) { } - #[inline] - fn is_adjacent(&self, _: &(), a: N, b: N) -> bool { - self.contains_edge(a, b) - } -} - -mod filter; -mod reversed; diff --git a/vendor/petgraph/src/visit/reversed.rs b/vendor/petgraph/src/visit/reversed.rs deleted file mode 100644 index 9380aa3b0b..0000000000 --- a/vendor/petgraph/src/visit/reversed.rs +++ /dev/null @@ -1,135 +0,0 @@ - -use ::{ - Direction, - Incoming, -}; - -use visit::{ - GraphBase, - GraphRef, - IntoNodeIdentifiers, - IntoNodeReferences, - IntoNeighbors, - IntoNeighborsDirected, - IntoEdgeReferences, - NodeCompactIndexable, - NodeCount, - NodeIndexable, - Visitable, - EdgeRef, - Data, - GraphProp, -}; - -/// An edge-reversing graph adaptor. -/// -/// All edges have the opposite direction with `Reversed`. -#[derive(Copy, Clone, Debug)] -pub struct Reversed<G>(pub G); - -impl<G: GraphBase> GraphBase for Reversed<G> { - type NodeId = G::NodeId; - type EdgeId = G::EdgeId; -} - -impl<G: GraphRef> GraphRef for Reversed<G> { } - -Data!{delegate_impl [[G], G, Reversed<G>, access0]} - -impl<G> IntoNeighbors for Reversed<G> - where G: IntoNeighborsDirected -{ - type Neighbors = G::NeighborsDirected; - fn neighbors(self, n: G::NodeId) -> G::NeighborsDirected - { - self.0.neighbors_directed(n, Incoming) - } -} - -impl<G> IntoNeighborsDirected for Reversed<G> - where G: IntoNeighborsDirected -{ - type NeighborsDirected = G::NeighborsDirected; - fn neighbors_directed(self, n: G::NodeId, d: Direction) - -> G::NeighborsDirected - { - self.0.neighbors_directed(n, d.opposite()) - } -} - -impl<G: Visitable> Visitable for Reversed<G> -{ - type Map = G::Map; - fn visit_map(&self) -> G::Map { - self.0.visit_map() - } - fn reset_map(&self, map: &mut Self::Map) { - self.0.reset_map(map); - } -} - - -/// A reversed edge reference -#[derive(Copy, Clone, Debug)] -pub struct ReversedEdgeReference<R>(R); - -/// An edge reference -impl<R> EdgeRef for ReversedEdgeReference<R> - where R: EdgeRef, -{ - type NodeId = R::NodeId; - type EdgeId = R::EdgeId; - type Weight = R::Weight; - fn source(&self) -> Self::NodeId { - self.0.target() - } - fn target(&self) -> Self::NodeId { - self.0.source() - } - fn weight(&self) -> &Self::Weight { - self.0.weight() - } - fn id(&self) -> Self::EdgeId { - self.0.id() - } -} - -impl<G> IntoEdgeReferences for Reversed<G> - where G: IntoEdgeReferences -{ - type EdgeRef = ReversedEdgeReference<G::EdgeRef>; - type EdgeReferences = ReversedEdgeReferences<G::EdgeReferences>; - fn edge_references(self) -> Self::EdgeReferences { - ReversedEdgeReferences { - iter: self.0.edge_references(), - } - } -} - -/// A reversed edge references iterator. -pub struct ReversedEdgeReferences<I> { - iter: I, -} - -impl<I> Iterator for ReversedEdgeReferences<I> - where I: Iterator, - I::Item: EdgeRef, -{ - type Item = ReversedEdgeReference<I::Item>; - fn next(&mut self) -> Option<Self::Item> { - self.iter.next().map(ReversedEdgeReference) - } -} - -macro_rules! access0 { - ($e:expr) => ($e.0) -} - -NodeIndexable!{delegate_impl [[G], G, Reversed<G>, access0]} -NodeCompactIndexable!{delegate_impl [[G], G, Reversed<G>, access0]} -IntoNodeIdentifiers!{delegate_impl [[G], G, Reversed<G>, access0]} -IntoNodeReferences!{delegate_impl [[G], G, Reversed<G>, access0]} -GraphProp!{delegate_impl [[G], G, Reversed<G>, access0]} -NodeCount!{delegate_impl [[G], G, Reversed<G>, access0]} - - diff --git a/vendor/petgraph/src/visit/traversal.rs b/vendor/petgraph/src/visit/traversal.rs deleted file mode 100644 index cc17f82334..0000000000 --- a/vendor/petgraph/src/visit/traversal.rs +++ /dev/null @@ -1,440 +0,0 @@ - -use {Incoming}; -use super::{IntoNeighbors, IntoNeighborsDirected, Visitable, VisitMap}; -use super::{GraphRef, Reversed, IntoNodeIdentifiers}; -use std::collections::VecDeque; - -/// Visit nodes of a graph in a depth-first-search (DFS) emitting nodes in -/// preorder (when they are first discovered). -/// -/// The traversal starts at a given node and only traverses nodes reachable -/// from it. -/// -/// `Dfs` is not recursive. -/// -/// `Dfs` does not itself borrow the graph, and because of this you can run -/// a traversal over a graph while still retaining mutable access to it, if you -/// use it like the following example: -/// -/// ``` -/// use petgraph::Graph; -/// use petgraph::visit::Dfs; -/// -/// let mut graph = Graph::<_,()>::new(); -/// let a = graph.add_node(0); -/// -/// let mut dfs = Dfs::new(&graph, a); -/// while let Some(nx) = dfs.next(&graph) { -/// // we can access `graph` mutably here still -/// graph[nx] += 1; -/// } -/// -/// assert_eq!(graph[a], 1); -/// ``` -/// -/// **Note:** The algorithm may not behave correctly if nodes are removed -/// during iteration. It may not necessarily visit added nodes or edges. -#[derive(Clone, Debug)] -pub struct Dfs<N, VM> { - /// The stack of nodes to visit - pub stack: Vec<N>, - /// The map of discovered nodes - pub discovered: VM, -} - -impl<N, VM> Dfs<N, VM> - where N: Copy + PartialEq, - VM: VisitMap<N>, -{ - /// Create a new **Dfs**, using the graph's visitor map, and put **start** - /// in the stack of nodes to visit. - pub fn new<G>(graph: G, start: N) -> Self - where G: GraphRef + Visitable<NodeId=N, Map=VM> - { - let mut dfs = Dfs::empty(graph); - dfs.move_to(start); - dfs - } - - /// Create a `Dfs` from a vector and a visit map - pub fn from_parts(stack: Vec<N>, discovered: VM) -> Self { - Dfs { - stack: stack, - discovered: discovered, - } - } - - /// Clear the visit state - pub fn reset<G>(&mut self, graph: G) - where G: GraphRef + Visitable<NodeId=N, Map=VM> - { - graph.reset_map(&mut self.discovered); - self.stack.clear(); - } - - /// Create a new **Dfs** using the graph's visitor map, and no stack. - pub fn empty<G>(graph: G) -> Self - where G: GraphRef + Visitable<NodeId=N, Map=VM> - { - Dfs { - stack: Vec::new(), - discovered: graph.visit_map(), - } - } - - /// Keep the discovered map, but clear the visit stack and restart - /// the dfs from a particular node. - pub fn move_to(&mut self, start: N) - { - self.discovered.visit(start); - self.stack.clear(); - self.stack.push(start); - } - - /// Return the next node in the dfs, or **None** if the traversal is done. - pub fn next<G>(&mut self, graph: G) -> Option<N> - where G: IntoNeighbors<NodeId=N>, - { - if let Some(node) = self.stack.pop() { - for succ in graph.neighbors(node) { - if self.discovered.visit(succ) { - self.stack.push(succ); - } - } - - return Some(node); - } - None - } -} - -/// Visit nodes in a depth-first-search (DFS) emitting nodes in postorder -/// (each node after all its descendants have been emitted). -/// -/// `DfsPostOrder` is not recursive. -/// -/// The traversal starts at a given node and only traverses nodes reachable -/// from it. -#[derive(Clone, Debug)] -pub struct DfsPostOrder<N, VM> { - /// The stack of nodes to visit - pub stack: Vec<N>, - /// The map of discovered nodes - pub discovered: VM, - /// The map of finished nodes - pub finished: VM, -} - -impl<N, VM> DfsPostOrder<N, VM> - where N: Copy + PartialEq, - VM: VisitMap<N>, -{ - /// Create a new `DfsPostOrder` using the graph's visitor map, and put - /// `start` in the stack of nodes to visit. - pub fn new<G>(graph: G, start: N) -> Self - where G: GraphRef + Visitable<NodeId=N, Map=VM> - { - let mut dfs = Self::empty(graph); - dfs.move_to(start); - dfs - } - - /// Create a new `DfsPostOrder` using the graph's visitor map, and no stack. - pub fn empty<G>(graph: G) -> Self - where G: GraphRef + Visitable<NodeId=N, Map=VM> - { - DfsPostOrder { - stack: Vec::new(), - discovered: graph.visit_map(), - finished: graph.visit_map(), - } - } - - /// Clear the visit state - pub fn reset<G>(&mut self, graph: G) - where G: GraphRef + Visitable<NodeId=N, Map=VM> - { - graph.reset_map(&mut self.discovered); - graph.reset_map(&mut self.finished); - self.stack.clear(); - } - - /// Keep the discovered and finished map, but clear the visit stack and restart - /// the dfs from a particular node. - pub fn move_to(&mut self, start: N) - { - self.stack.clear(); - self.stack.push(start); - } - - /// Return the next node in the traversal, or `None` if the traversal is done. - pub fn next<G>(&mut self, graph: G) -> Option<N> - where G: IntoNeighbors<NodeId=N>, - { - while let Some(&nx) = self.stack.last() { - if self.discovered.visit(nx) { - // First time visiting `nx`: Push neighbors, don't pop `nx` - for succ in graph.neighbors(nx) { - if !self.discovered.is_visited(&succ) { - self.stack.push(succ); - } - } - } else { - self.stack.pop(); - if self.finished.visit(nx) { - // Second time: All reachable nodes must have been finished - return Some(nx); - } - } - } - None - } -} - -/// A breadth first search (BFS) of a graph. -/// -/// The traversal starts at a given node and only traverses nodes reachable -/// from it. -/// -/// `Bfs` is not recursive. -/// -/// `Bfs` does not itself borrow the graph, and because of this you can run -/// a traversal over a graph while still retaining mutable access to it, if you -/// use it like the following example: -/// -/// ``` -/// use petgraph::Graph; -/// use petgraph::visit::Bfs; -/// -/// let mut graph = Graph::<_,()>::new(); -/// let a = graph.add_node(0); -/// -/// let mut bfs = Bfs::new(&graph, a); -/// while let Some(nx) = bfs.next(&graph) { -/// // we can access `graph` mutably here still -/// graph[nx] += 1; -/// } -/// -/// assert_eq!(graph[a], 1); -/// ``` -/// -/// **Note:** The algorithm may not behave correctly if nodes are removed -/// during iteration. It may not necessarily visit added nodes or edges. -#[derive(Clone)] -pub struct Bfs<N, VM> { - /// The queue of nodes to visit - pub stack: VecDeque<N>, - /// The map of discovered nodes - pub discovered: VM, -} - -impl<N, VM> Bfs<N, VM> - where N: Copy + PartialEq, - VM: VisitMap<N>, -{ - /// Create a new **Bfs**, using the graph's visitor map, and put **start** - /// in the stack of nodes to visit. - pub fn new<G>(graph: G, start: N) -> Self - where G: GraphRef + Visitable<NodeId=N, Map=VM> - { - let mut discovered = graph.visit_map(); - discovered.visit(start); - let mut stack = VecDeque::new(); - stack.push_front(start); - Bfs { - stack: stack, - discovered: discovered, - } - } - - /// Return the next node in the bfs, or **None** if the traversal is done. - pub fn next<G>(&mut self, graph: G) -> Option<N> - where G: IntoNeighbors<NodeId=N> - { - if let Some(node) = self.stack.pop_front() { - for succ in graph.neighbors(node) { - if self.discovered.visit(succ) { - self.stack.push_back(succ); - } - } - - return Some(node); - } - None - } - -} - -/// A topological order traversal for a graph. -/// -/// **Note** that `Topo` only visits nodes that are not part of cycles, -/// i.e. nodes in a true DAG. Use other visitors like `DfsPostOrder` or -/// algorithms like kosaraju_scc to handle graphs with possible cycles. -#[derive(Clone)] -pub struct Topo<N, VM> { - tovisit: Vec<N>, - ordered: VM, -} - -impl<N, VM> Topo<N, VM> - where N: Copy + PartialEq, - VM: VisitMap<N>, -{ - /// Create a new `Topo`, using the graph's visitor map, and put all - /// initial nodes in the to visit list. - pub fn new<G>(graph: G) -> Self - where G: IntoNodeIdentifiers + IntoNeighborsDirected + Visitable<NodeId=N, Map=VM>, - { - let mut topo = Self::empty(graph); - topo.extend_with_initials(graph); - topo - } - - fn extend_with_initials<G>(&mut self, g: G) - where G: IntoNodeIdentifiers + IntoNeighborsDirected<NodeId=N>, - { - // find all initial nodes (nodes without incoming edges) - self.tovisit.extend(g.node_identifiers() - .filter(move |&a| g.neighbors_directed(a, Incoming).next().is_none())); - } - - /* Private until it has a use */ - /// Create a new `Topo`, using the graph's visitor map with *no* starting - /// index specified. - fn empty<G>(graph: G) -> Self - where G: GraphRef + Visitable<NodeId=N, Map=VM> - { - Topo { - ordered: graph.visit_map(), - tovisit: Vec::new(), - } - } - - /// Clear visited state, and put all initial nodes in the to visit list. - pub fn reset<G>(&mut self, graph: G) - where G: IntoNodeIdentifiers + IntoNeighborsDirected + Visitable<NodeId=N, Map=VM>, - { - graph.reset_map(&mut self.ordered); - self.tovisit.clear(); - self.extend_with_initials(graph); - } - - /// Return the next node in the current topological order traversal, or - /// `None` if the traversal is at the end. - /// - /// *Note:* The graph may not have a complete topological order, and the only - /// way to know is to run the whole traversal and make sure it visits every node. - pub fn next<G>(&mut self, g: G) -> Option<N> - where G: IntoNeighborsDirected + Visitable<NodeId=N, Map=VM>, - { - // Take an unvisited element and find which of its neighbors are next - while let Some(nix) = self.tovisit.pop() { - if self.ordered.is_visited(&nix) { - continue; - } - self.ordered.visit(nix); - for neigh in g.neighbors(nix) { - // Look at each neighbor, and those that only have incoming edges - // from the already ordered list, they are the next to visit. - if Reversed(g).neighbors(neigh).all(|b| self.ordered.is_visited(&b)) { - self.tovisit.push(neigh); - } - } - return Some(nix); - } - None - } -} - - -/// A walker is a traversal state, but where part of the traversal -/// information is supplied manually to each next call. -/// -/// This for example allows graph traversals that don't hold a borrow of the -/// graph they are traversing. -pub trait Walker<Context> { - type Item; - /// Advance to the next item - fn walk_next(&mut self, context: Context) -> Option<Self::Item>; - - /// Create an iterator out of the walker and given `context`. - fn iter(self, context: Context) -> WalkerIter<Self, Context> - where Self: Sized, - Context: Clone, - { - WalkerIter { - walker: self, - context: context, - } - } -} - -/// A walker and its context wrapped into an iterator. -#[derive(Clone, Debug)] -pub struct WalkerIter<W, C> { - walker: W, - context: C, -} - -impl<W, C> WalkerIter<W, C> - where W: Walker<C>, - C: Clone, -{ - pub fn context(&self) -> C { - self.context.clone() - } - - pub fn inner_ref(&self) -> &W { - &self.walker - } - - pub fn inner_mut(&mut self) -> &mut W { - &mut self.walker - } -} - -impl<W, C> Iterator for WalkerIter<W, C> - where W: Walker<C>, - C: Clone, -{ - type Item = W::Item; - fn next(&mut self) -> Option<Self::Item> { - self.walker.walk_next(self.context.clone()) - } -} - -impl<G> Walker<G> for Dfs<G::NodeId, G::Map> - where G: IntoNeighbors + Visitable -{ - type Item = G::NodeId; - fn walk_next(&mut self, context: G) -> Option<Self::Item> { - self.next(context) - } -} - -impl<G> Walker<G> for DfsPostOrder<G::NodeId, G::Map> - where G: IntoNeighbors + Visitable -{ - type Item = G::NodeId; - fn walk_next(&mut self, context: G) -> Option<Self::Item> { - self.next(context) - } -} - -impl<G> Walker<G> for Bfs<G::NodeId, G::Map> - where G: IntoNeighbors + Visitable -{ - type Item = G::NodeId; - fn walk_next(&mut self, context: G) -> Option<Self::Item> { - self.next(context) - } -} - -impl<G> Walker<G> for Topo<G::NodeId, G::Map> - where G: IntoNeighborsDirected + Visitable, -{ - type Item = G::NodeId; - fn walk_next(&mut self, context: G) -> Option<Self::Item> { - self.next(context) - } -} diff --git a/vendor/petgraph/tests/graph.rs b/vendor/petgraph/tests/graph.rs deleted file mode 100644 index 773a993efc..0000000000 --- a/vendor/petgraph/tests/graph.rs +++ /dev/null @@ -1,1787 +0,0 @@ -extern crate petgraph; - -use std::collections::HashSet; -use std::hash::Hash; - -use petgraph::prelude::*; -use petgraph::{ - EdgeType, -}; - -use petgraph as pg; - -use petgraph::algo::{ - dominators, - has_path_connecting, - is_cyclic_undirected, - min_spanning_tree, - is_isomorphic_matching, -}; - -use petgraph::graph::node_index as n; -use petgraph::graph::{ - IndexType, -}; - -use petgraph::visit::{ - IntoNodeIdentifiers, - NodeFiltered, - Reversed, - Topo, - IntoNeighbors, - VisitMap, - Walker, -}; -use petgraph::algo::{ - DfsSpace, - dijkstra, - astar, -}; - -use petgraph::dot::{ - Dot, -}; - -fn set<I>(iter: I) -> HashSet<I::Item> - where I: IntoIterator, - I::Item: Hash + Eq, -{ - iter.into_iter().collect() -} - -#[test] -fn undirected() -{ - let mut og = Graph::new_undirected(); - let a = og.add_node(0); - let b = og.add_node(1); - let c = og.add_node(2); - let d = og.add_node(3); - let _ = og.add_edge(a, b, 0); - let _ = og.add_edge(a, c, 1); - og.add_edge(c, a, 2); - og.add_edge(a, a, 3); - og.add_edge(b, c, 4); - og.add_edge(b, a, 5); - og.add_edge(a, d, 6); - assert_eq!(og.node_count(), 4); - assert_eq!(og.edge_count(), 7); - - assert!(og.find_edge(a, b).is_some()); - assert!(og.find_edge(d, a).is_some()); - assert!(og.find_edge(a, a).is_some()); - - for edge in og.raw_edges() { - assert!(og.find_edge(edge.source(), edge.target()).is_some()); - assert!(og.find_edge(edge.target(), edge.source()).is_some()); - } - - assert_eq!(og.neighbors(b).collect::<Vec<_>>(), vec![a, c, a]); - - og.remove_node(a); - assert_eq!(og.neighbors(b).collect::<Vec<_>>(), vec![c]); - assert_eq!(og.node_count(), 3); - assert_eq!(og.edge_count(), 1); - assert!(og.find_edge(a, b).is_none()); - assert!(og.find_edge(d, a).is_none()); - assert!(og.find_edge(a, a).is_none()); - assert!(og.find_edge(b, c).is_some()); - assert_graph_consistent(&og); - -} - -#[test] -fn dfs() { - let mut gr = Graph::new(); - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - let k = gr.add_node("K"); - // Z is disconnected. - let _ = gr.add_node("Z"); - gr.add_edge(h, i, 1.); - gr.add_edge(h, j, 3.); - gr.add_edge(i, j, 1.); - gr.add_edge(i, k, 2.); - - println!("{}", Dot::new(&gr)); - - assert_eq!(Dfs::new(&gr, h).iter(&gr).count(), 4); - assert_eq!(Dfs::new(&gr, h).iter(&gr).clone().count(), 4); - - assert_eq!(Dfs::new(&gr, h).iter(Reversed(&gr)).count(), 1); - - assert_eq!(Dfs::new(&gr, k).iter(Reversed(&gr)).count(), 3); - - assert_eq!(Dfs::new(&gr, i).iter(&gr).count(), 3); -} - - -#[test] -fn bfs() { - let mut gr = Graph::new(); - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - let k = gr.add_node("K"); - // Z is disconnected. - let _ = gr.add_node("Z"); - gr.add_edge(h, i, 1.); - gr.add_edge(h, j, 3.); - gr.add_edge(i, j, 1.); - gr.add_edge(i, k, 2.); - - assert_eq!(Bfs::new(&gr, h).iter(&gr).count(), 4); - assert_eq!(Bfs::new(&gr, h).iter(&gr).clone().count(), 4); - - assert_eq!(Bfs::new(&gr, h).iter(Reversed(&gr)).count(), 1); - - assert_eq!(Bfs::new(&gr, k).iter(Reversed(&gr)).count(), 3); - - assert_eq!(Bfs::new(&gr, i).iter(&gr).count(), 3); - - let mut bfs = Bfs::new(&gr, h); - let nx = bfs.next(&gr); - assert_eq!(nx, Some(h)); - - let nx1 = bfs.next(&gr); - assert!(nx1 == Some(i) || nx1 == Some(j)); - - let nx2 = bfs.next(&gr); - assert!(nx2 == Some(i) || nx2 == Some(j)); - assert!(nx1 != nx2); - - let nx = bfs.next(&gr); - assert_eq!(nx, Some(k)); - assert_eq!(bfs.next(&gr), None); -} - - - -#[test] -fn mst() { - use petgraph::data::FromElements; - - let mut gr = Graph::<_,_>::new(); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - let d = gr.add_node("D"); - let e = gr.add_node("E"); - let f = gr.add_node("F"); - let g = gr.add_node("G"); - gr.add_edge(a, b, 7.); - gr.add_edge(a, d, 5.); - gr.add_edge(d, b, 9.); - gr.add_edge(b, c, 8.); - gr.add_edge(b, e, 7.); - gr.add_edge(c, e, 5.); - gr.add_edge(d, e, 15.); - gr.add_edge(d, f, 6.); - gr.add_edge(f, e, 8.); - gr.add_edge(f, g, 11.); - gr.add_edge(e, g, 9.); - - // add a disjoint part - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - gr.add_edge(h, i, 1.); - gr.add_edge(h, j, 3.); - gr.add_edge(i, j, 1.); - - println!("{}", Dot::new(&gr)); - - let mst = UnGraph::from_elements(min_spanning_tree(&gr)); - - println!("{}", Dot::new(&mst)); - println!("{:?}", Dot::new(&mst)); - println!("MST is:\n{:#?}", mst); - assert!(mst.node_count() == gr.node_count()); - // |E| = |N| - 2 because there are two disconnected components. - assert!(mst.edge_count() == gr.node_count() - 2); - - // check the exact edges are there - assert!(mst.find_edge(a, b).is_some()); - assert!(mst.find_edge(a, d).is_some()); - assert!(mst.find_edge(b, e).is_some()); - assert!(mst.find_edge(e, c).is_some()); - assert!(mst.find_edge(e, g).is_some()); - assert!(mst.find_edge(d, f).is_some()); - - assert!(mst.find_edge(h, i).is_some()); - assert!(mst.find_edge(i, j).is_some()); - - assert!(mst.find_edge(d, b).is_none()); - assert!(mst.find_edge(b, c).is_none()); - -} - -#[test] -fn selfloop() { - let mut gr = Graph::new(); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - gr.add_edge(a, b, 7.); - gr.add_edge(c, a, 6.); - let sed = gr.add_edge(a, a, 2.); - - assert!(gr.find_edge(a, b).is_some()); - assert!(gr.find_edge(b, a).is_none()); - assert!(gr.find_edge_undirected(b, a).is_some()); - assert!(gr.find_edge(a, a).is_some()); - println!("{:?}", gr); - - gr.remove_edge(sed); - assert!(gr.find_edge(a, a).is_none()); - println!("{:?}", gr); -} - -#[test] -fn cyclic() { - let mut gr = Graph::new(); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - - assert!(!is_cyclic_undirected(&gr)); - gr.add_edge(a, b, 7.); - gr.add_edge(c, a, 6.); - assert!(!is_cyclic_undirected(&gr)); - { - let e = gr.add_edge(a, a, 0.); - assert!(is_cyclic_undirected(&gr)); - gr.remove_edge(e); - assert!(!is_cyclic_undirected(&gr)); - } - - { - let e = gr.add_edge(b, c, 0.); - assert!(is_cyclic_undirected(&gr)); - gr.remove_edge(e); - assert!(!is_cyclic_undirected(&gr)); - } - - let d = gr.add_node("D"); - let e = gr.add_node("E"); - gr.add_edge(b, d, 0.); - gr.add_edge(d, e, 0.); - assert!(!is_cyclic_undirected(&gr)); - gr.add_edge(c, e, 0.); - assert!(is_cyclic_undirected(&gr)); - assert_graph_consistent(&gr); -} - -#[test] -fn multi() { - let mut gr = Graph::new(); - let a = gr.add_node("a"); - let b = gr.add_node("b"); - gr.add_edge(a, b, ()); - gr.add_edge(a, b, ()); - assert_eq!(gr.edge_count(), 2); - -} -#[test] -fn update_edge() -{ - { - let mut gr = Graph::new(); - let a = gr.add_node("a"); - let b = gr.add_node("b"); - let e = gr.update_edge(a, b, 1); - let f = gr.update_edge(a, b, 2); - let _ = gr.update_edge(b, a, 3); - assert_eq!(gr.edge_count(), 2); - assert_eq!(e, f); - assert_eq!(*gr.edge_weight(f).unwrap(), 2); - } - - { - let mut gr = Graph::new_undirected(); - let a = gr.add_node("a"); - let b = gr.add_node("b"); - let e = gr.update_edge(a, b, 1); - let f = gr.update_edge(b, a, 2); - assert_eq!(gr.edge_count(), 1); - assert_eq!(e, f); - assert_eq!(*gr.edge_weight(f).unwrap(), 2); - } -} - -#[test] -fn dijk() { - let mut g = Graph::new_undirected(); - let a = g.add_node("A"); - let b = g.add_node("B"); - let c = g.add_node("C"); - let d = g.add_node("D"); - let e = g.add_node("E"); - let f = g.add_node("F"); - g.add_edge(a, b, 7); - g.add_edge(c, a, 9); - g.add_edge(a, d, 14); - g.add_edge(b, c, 10); - g.add_edge(d, c, 2); - g.add_edge(d, e, 9); - g.add_edge(b, f, 15); - g.add_edge(c, f, 11); - g.add_edge(e, f, 6); - println!("{:?}", g); - for no in Bfs::new(&g, a).iter(&g) { - println!("Visit {:?} = {:?}", no, g.node_weight(no)); - } - - let scores = dijkstra(&g, a, None, |e| *e.weight()); - let mut scores: Vec<_> = scores.into_iter().map(|(n, s)| (g[n], s)).collect(); - scores.sort(); - assert_eq!(scores, - vec![("A", 0), ("B", 7), ("C", 9), ("D", 11), ("E", 20), ("F", 20)]); - - let scores = dijkstra(&g, a, Some(c), |e| *e.weight()); - assert_eq!(scores[&c], 9); -} - -#[test] -fn test_astar_null_heuristic() { - let mut g = Graph::new(); - let a = g.add_node("A"); - let b = g.add_node("B"); - let c = g.add_node("C"); - let d = g.add_node("D"); - let e = g.add_node("E"); - let f = g.add_node("F"); - g.add_edge(a, b, 7); - g.add_edge(c, a, 9); - g.add_edge(a, d, 14); - g.add_edge(b, c, 10); - g.add_edge(d, c, 2); - g.add_edge(d, e, 9); - g.add_edge(b, f, 15); - g.add_edge(c, f, 11); - g.add_edge(e, f, 6); - - let path = astar(&g, a, |finish| finish == e, |e| *e.weight(), |_| 0); - assert_eq!(path, Some((23, vec![a, d, e]))); - - // check against dijkstra - let dijkstra_run = dijkstra(&g, a, Some(e), |e| *e.weight()); - assert_eq!(dijkstra_run[&e], 23); - - let path = astar(&g, e, |finish| finish == b, |e| *e.weight(), |_| 0); - assert_eq!(path, None); -} - -#[test] -fn test_astar_manhattan_heuristic() { - let mut g = Graph::new(); - let a = g.add_node((0., 0.)); - let b = g.add_node((2., 0.)); - let c = g.add_node((1., 1.)); - let d = g.add_node((0., 2.)); - let e = g.add_node((3., 3.)); - let f = g.add_node((4., 2.)); - let _ = g.add_node((5., 5.)); // no path to node - g.add_edge(a, b, 2.); - g.add_edge(a, d, 4.); - g.add_edge(b, c, 1.); - g.add_edge(b, f, 7.); - g.add_edge(c, e, 5.); - g.add_edge(e, f, 1.); - g.add_edge(d, e, 1.); - - let heuristic_for = |f: NodeIndex| { - let g = &g; - move |node: NodeIndex| -> f32 { - let (x1, y1): (f32, f32) = g[node]; - let (x2, y2): (f32, f32) = g[f]; - - (x2 - x1).abs() + (y2 - y1).abs() - } - }; - let path = astar(&g, a, |finish| finish == f, |e| *e.weight(), heuristic_for(f)); - - assert_eq!(path, Some((6., vec![a, d, e, f]))); - - // check against dijkstra - let dijkstra_run = dijkstra(&g, a, None, |e| *e.weight()); - - for end in g.node_indices() { - let astar_path = astar(&g, a, |finish| finish == end, |e| *e.weight(), - heuristic_for(end)); - assert_eq!(dijkstra_run.get(&end).cloned(), - astar_path.map(|t| t.0)); - } -} - -#[cfg(feature = "generate")] -#[test] -fn test_generate_undirected() { - for size in 0..4 { - let mut gen = pg::generate::Generator::<Undirected>::all(size, true); - let nedges = (size * size - size) / 2 + size; - let mut n = 0; - while let Some(g) = gen.next_ref() { - n += 1; - println!("{:?}", g); - } - - assert_eq!(n, 1 << nedges); - } -} - -#[cfg(feature = "generate")] -#[test] -fn test_generate_directed() { - // Number of DAG out of all graphs (all permutations) per node size - // 0, 1, 2, 3, 4, 5 .. - let n_dag = &[1, 1, 3, 25, 543, 29281, 3781503]; - for (size, &dags_exp) in (0..4).zip(n_dag) { - let mut gen = pg::generate::Generator::<Directed>::all(size, true); - let nedges = size * size; - let mut n = 0; - let mut dags = 0; - while let Some(g) = gen.next_ref() { - n += 1; - if !pg::algo::is_cyclic_directed(g) { - dags += 1; - } - } - - /* - // check that all generated graphs have unique adjacency matrices - let mut adjmats = graphs.iter().map(Graph::adjacency_matrix).collect::<Vec<_>>(); - adjmats.sort(); adjmats.dedup(); - assert_eq!(adjmats.len(), n); - */ - assert_eq!(dags_exp, dags); - assert_eq!(n, 1 << nedges); - } -} - -#[cfg(feature = "generate")] -#[test] -fn test_generate_dag() { - use petgraph::visit::GetAdjacencyMatrix; - for size in 1..5 { - let gen = pg::generate::Generator::directed_acyclic(size); - let nedges = (size - 1) * size / 2; - let graphs = gen.collect::<Vec<_>>(); - - assert_eq!(graphs.len(), 1 << nedges); - - // check that all generated graphs have unique adjacency matrices - let mut adjmats = graphs.iter().map(Graph::adjacency_matrix).collect::<Vec<_>>(); - adjmats.sort(); - adjmats.dedup(); - assert_eq!(adjmats.len(), graphs.len()); - for gr in &graphs { - assert!(!petgraph::algo::is_cyclic_directed(gr), - "Assertion failed: {:?} acyclic", gr); - } - } -} - -#[test] -fn without() -{ - let mut og = Graph::new_undirected(); - let a = og.add_node(0); - let b = og.add_node(1); - let c = og.add_node(2); - let d = og.add_node(3); - let _ = og.add_edge(a, b, 0); - let _ = og.add_edge(a, c, 1); - let v: Vec<NodeIndex> = og.externals(Outgoing).collect(); - assert_eq!(v, vec![d]); - - let mut og = Graph::new(); - let a = og.add_node(0); - let b = og.add_node(1); - let c = og.add_node(2); - let d = og.add_node(3); - let _ = og.add_edge(a, b, 0); - let _ = og.add_edge(a, c, 1); - let init: Vec<NodeIndex> = og.externals(Incoming).collect(); - let term: Vec<NodeIndex> = og.externals(Outgoing).collect(); - assert_eq!(init, vec![a, d]); - assert_eq!(term, vec![b, c, d]); -} - -fn assert_is_topo_order<N, E>(gr: &Graph<N, E, Directed>, order: &[NodeIndex]) -{ - assert_eq!(gr.node_count(), order.len()); - // check all the edges of the graph - for edge in gr.raw_edges() { - let a = edge.source(); - let b = edge.target(); - let ai = order.iter().position(|x| *x == a).unwrap(); - let bi = order.iter().position(|x| *x == b).unwrap(); - println!("Check that {:?} is before {:?}", a, b); - assert!(ai < bi, "Topo order: assertion that node {:?} is before {:?} failed", - a, b); - } -} - -#[test] -fn test_toposort() { - let mut gr = Graph::<_,_>::new(); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - let d = gr.add_node("D"); - let e = gr.add_node("E"); - let f = gr.add_node("F"); - let g = gr.add_node("G"); - gr.extend_with_edges(&[ - (a, b, 7.), - (a, d, 5.), - (d, b, 9.), - (b, c, 8.), - (b, e, 7.), - (c, e, 5.), - (d, e, 15.), - (d, f, 6.), - (f, e, 8.), - (f, g, 11.), - (e, g, 9.), - ]); - - // add a disjoint part - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - gr.add_edge(h, i, 1.); - gr.add_edge(h, j, 3.); - gr.add_edge(i, j, 1.); - - let order = petgraph::algo::toposort(&gr, None).unwrap(); - println!("{:?}", order); - assert_eq!(order.len(), gr.node_count()); - - assert_is_topo_order(&gr, &order); -} - -#[test] -fn test_toposort_eq() { - let mut g = Graph::<_,_>::new(); - let a = g.add_node("A"); - let b = g.add_node("B"); - g.add_edge(a, b, ()); - - assert_eq!(petgraph::algo::toposort(&g, None), Ok(vec![a, b])); -} - -#[test] -fn is_cyclic_directed() { - let mut gr = Graph::<_,_>::new(); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - let d = gr.add_node("D"); - let e = gr.add_node("E"); - let f = gr.add_node("F"); - let g = gr.add_node("G"); - gr.add_edge(a, b, 7.0); - gr.add_edge(a, d, 5.); - gr.add_edge(d, b, 9.); - gr.add_edge(b, c, 8.); - gr.add_edge(b, e, 7.); - gr.add_edge(c, e, 5.); - gr.add_edge(d, e, 15.); - gr.add_edge(d, f, 6.); - gr.add_edge(f, e, 8.); - gr.add_edge(f, g, 11.); - gr.add_edge(e, g, 9.); - - assert!(!petgraph::algo::is_cyclic_directed(&gr)); - - // add a disjoint part - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - gr.add_edge(h, i, 1.); - gr.add_edge(h, j, 3.); - gr.add_edge(i, j, 1.); - assert!(!petgraph::algo::is_cyclic_directed(&gr)); - - gr.add_edge(g, e, 0.); - assert!(petgraph::algo::is_cyclic_directed(&gr)); -} - -/// Compare two scc sets. Inside each scc, the order does not matter, -/// but the order of the sccs is significant. -fn assert_sccs_eq(mut res: Vec<Vec<NodeIndex>>, mut answer: Vec<Vec<NodeIndex>>, - scc_order_matters: bool) { - // normalize the result and compare with the answer. - for scc in &mut res { - scc.sort(); - } - for scc in &mut answer { - scc.sort(); - } - if !scc_order_matters { - res.sort(); - answer.sort(); - } - assert_eq!(res, answer); -} - -#[test] -fn scc() { - let gr: Graph<(), ()> = Graph::from_edges(&[ - (6, 0), - (0, 3), - (3, 6), - (8, 6), - (8, 2), - (2, 5), - (5, 8), - (7, 5), - (1, 7), - (7, 4), - (4, 1)]); - - assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![ - vec![n(0), n(3), n(6)], - vec![n(2), n(5), n(8)], - vec![n(1), n(4), n(7)], - ], true); - // Reversed edges gives the same sccs (when sorted) - assert_sccs_eq(petgraph::algo::kosaraju_scc(Reversed(&gr)), vec![ - vec![n(1), n(4), n(7)], - vec![n(2), n(5), n(8)], - vec![n(0), n(3), n(6)], - ], true); - - - // Test an undirected graph just for fun. - // Sccs are just connected components. - let mut hr = gr.into_edge_type::<Undirected>(); - // Delete an edge to disconnect it - let ed = hr.find_edge(n(6), n(8)).unwrap(); - assert!(hr.remove_edge(ed).is_some()); - - assert_sccs_eq(petgraph::algo::kosaraju_scc(&hr), vec![ - vec![n(0), n(3), n(6)], - vec![n(1), n(2), n(4), n(5), n(7), n(8)], - ], false); - - - // acyclic non-tree, #14 - let n = NodeIndex::new; - let mut gr = Graph::new(); - gr.add_node(0); - gr.add_node(1); - gr.add_node(2); - gr.add_node(3); - gr.add_edge(n(3), n(2), ()); - gr.add_edge(n(3), n(1), ()); - gr.add_edge(n(2), n(0), ()); - gr.add_edge(n(1), n(0), ()); - - assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![ - vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)], - ], true); - - // Kosaraju bug from PR #60 - let mut gr = Graph::<(), ()>::new(); - gr.extend_with_edges(&[ - (0, 0), - (1, 0), - (2, 0), - (2, 1), - (2, 2), - ]); - gr.add_node(()); - // no order for the disconnected one - assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![ - vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)], - ], false); -} - - -#[test] -fn tarjan_scc() { - let gr: Graph<(), ()> = Graph::from_edges(&[ - (6, 0), - (0, 3), - (3, 6), - (8, 6), - (8, 2), - (2, 5), - (5, 8), - (7, 5), - (1, 7), - (7, 4), - (4, 1)]); - - assert_sccs_eq(petgraph::algo::tarjan_scc(&gr), vec![ - vec![n(0), n(3), n(6)], - vec![n(2), n(5), n(8)], - vec![n(1), n(4), n(7)], - ], true); - - - // Test an undirected graph just for fun. - // Sccs are just connected components. - let mut hr = gr.into_edge_type::<Undirected>(); - // Delete an edge to disconnect it - let ed = hr.find_edge(n(6), n(8)).unwrap(); - assert!(hr.remove_edge(ed).is_some()); - - assert_sccs_eq(petgraph::algo::tarjan_scc(&hr), vec![ - vec![n(1), n(2), n(4), n(5), n(7), n(8)], - vec![n(0), n(3), n(6)], - ], false); - - - // acyclic non-tree, #14 - let n = NodeIndex::new; - let mut gr = Graph::new(); - gr.add_node(0); - gr.add_node(1); - gr.add_node(2); - gr.add_node(3); - gr.add_edge(n(3), n(2), ()); - gr.add_edge(n(3), n(1), ()); - gr.add_edge(n(2), n(0), ()); - gr.add_edge(n(1), n(0), ()); - - assert_sccs_eq(petgraph::algo::tarjan_scc(&gr), vec![ - vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)], - ], true); - - // Kosaraju bug from PR #60 - let mut gr = Graph::<(), ()>::new(); - gr.extend_with_edges(&[ - (0, 0), - (1, 0), - (2, 0), - (2, 1), - (2, 2), - ]); - gr.add_node(()); - // no order for the disconnected one - assert_sccs_eq(petgraph::algo::tarjan_scc(&gr), vec![ - vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)], - ], false); -} - - -#[test] -fn condensation() -{ - let gr: Graph<(), ()> = Graph::from_edges(&[ - (6, 0), - (0, 3), - (3, 6), - (8, 6), - (8, 2), - (2, 3), - (2, 5), - (5, 8), - (7, 5), - (1, 7), - (7, 4), - (4, 1)]); - - - // make_acyclic = true - - let cond = petgraph::algo::condensation(gr.clone(), true); - - assert!(cond.node_count() == 3); - assert!(cond.edge_count() == 2); - assert!(!petgraph::algo::is_cyclic_directed(&cond), - "Assertion failed: {:?} acyclic", cond); - - - // make_acyclic = false - - let cond = petgraph::algo::condensation(gr.clone(), false); - - assert!(cond.node_count() == 3); - assert!(cond.edge_count() == gr.edge_count()); -} - -#[test] -fn connected_comp() -{ - let n = NodeIndex::new; - let mut gr = Graph::new(); - gr.add_node(0); - gr.add_node(1); - gr.add_node(2); - gr.add_node(3); - gr.add_node(4); - gr.add_node(5); - gr.add_node(6); - gr.add_node(7); - gr.add_node(8); - gr.add_edge(n(6), n(0), ()); - gr.add_edge(n(0), n(3), ()); - gr.add_edge(n(3), n(6), ()); - gr.add_edge(n(8), n(6), ()); - gr.add_edge(n(8), n(2), ()); - gr.add_edge(n(2), n(5), ()); - gr.add_edge(n(5), n(8), ()); - gr.add_edge(n(7), n(5), ()); - gr.add_edge(n(1), n(7), ()); - gr.add_edge(n(7), n(4), ()); - gr.add_edge(n(4), n(1), ()); - assert_eq!(petgraph::algo::connected_components(&gr), 1); - - gr.add_node(9); - gr.add_node(10); - assert_eq!(petgraph::algo::connected_components(&gr), 3); - - gr.add_edge(n(9), n(10), ()); - assert_eq!(petgraph::algo::connected_components(&gr), 2); - - let gr = gr.into_edge_type::<Undirected>(); - assert_eq!(petgraph::algo::connected_components(&gr), 2); -} - -#[should_panic] -#[test] -fn oob_index() -{ - let mut gr = Graph::<_, ()>::new(); - let a = gr.add_node(0); - let b = gr.add_node(1); - gr.remove_node(a); - gr[b]; -} - -#[test] -fn usize_index() -{ - let mut gr = Graph::<_, _, Directed, usize>::with_capacity(0, 0); - let a = gr.add_node(0); - let b = gr.add_node(1); - let e = gr.add_edge(a, b, 1.2); - let mut dfs = Dfs::new(&gr, a); - while let Some(nx) = dfs.next(&gr) { - gr[nx] += 1; - } - assert_eq!(gr[a], 1); - assert_eq!(gr[b], 2); - assert_eq!(gr[e], 1.2); -} - -#[test] -fn u8_index() -{ - let mut gr = Graph::<_, (), Undirected, u8>::with_capacity(0, 0); - for _ in 0..255 { - gr.add_node(()); - } -} - -#[should_panic] -#[test] -fn u8_index_overflow() -{ - let mut gr = Graph::<_, (), Undirected, u8>::with_capacity(0, 0); - for _ in 0..256 { - gr.add_node(()); - } -} - -#[should_panic] -#[test] -fn u8_index_overflow_edges() -{ - let mut gr = Graph::<_, (), Undirected, u8>::with_capacity(0, 0); - let a = gr.add_node('a'); - let b = gr.add_node('b'); - for _ in 0..256 { - gr.add_edge(a, b, ()); - } -} - -#[test] -fn test_weight_iterators() { - let mut gr = Graph::<_,_>::new(); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - let d = gr.add_node("D"); - let e = gr.add_node("E"); - let f = gr.add_node("F"); - let g = gr.add_node("G"); - gr.add_edge(a, b, 7.0); - gr.add_edge(a, d, 5.); - gr.add_edge(d, b, 9.); - gr.add_edge(b, c, 8.); - gr.add_edge(b, e, 7.); - gr.add_edge(c, e, 5.); - gr.add_edge(d, e, 15.); - gr.add_edge(d, f, 6.); - gr.add_edge(f, e, 8.); - gr.add_edge(f, g, 11.); - gr.add_edge(e, g, 9.); - - assert_eq!(gr.node_weights_mut().count(), gr.node_count()); - assert_eq!(gr.edge_weights_mut().count(), gr.edge_count()); - - // add a disjoint part - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - gr.add_edge(h, i, 1.); - gr.add_edge(h, j, 3.); - gr.add_edge(i, j, 1.); - - assert_eq!(gr.node_weights_mut().count(), gr.node_count()); - assert_eq!(gr.edge_weights_mut().count(), gr.edge_count()); - - for nw in gr.node_weights_mut() { - *nw = "x"; - } - for node in gr.raw_nodes() { - assert_eq!(node.weight, "x"); - } - - let old = gr.clone(); - for (index, ew) in gr.edge_weights_mut().enumerate() { - assert_eq!(old[EdgeIndex::new(index)], *ew); - *ew = - *ew; - } - for (index, edge) in gr.raw_edges().iter().enumerate() { - assert_eq!(edge.weight, -1. * old[EdgeIndex::new(index)]); - } -} - -#[test] -fn walk_edges() { - let mut gr = Graph::<_,_>::new(); - let a = gr.add_node(0.); - let b = gr.add_node(1.); - let c = gr.add_node(2.); - let d = gr.add_node(3.); - let e0 = gr.add_edge(a, b, 0.); - let e1 = gr.add_edge(a, d, 0.); - let e2 = gr.add_edge(b, c, 0.); - let e3 = gr.add_edge(c, a, 0.); - - // Set edge weights to difference: target - source. - let mut dfs = Dfs::new(&gr, a); - while let Some(source) = dfs.next(&gr) { - let mut edges = gr.neighbors_directed(source, Outgoing).detach(); - while let Some((edge, target)) = edges.next(&gr) { - gr[edge] = gr[target] - gr[source]; - } - } - assert_eq!(gr[e0], 1.); - assert_eq!(gr[e1], 3.); - assert_eq!(gr[e2], 1.); - assert_eq!(gr[e3], -2.); - - let mut nedges = 0; - let mut dfs = Dfs::new(&gr, a); - while let Some(node) = dfs.next(&gr) { - let mut edges = gr.neighbors_directed(node, Incoming).detach(); - while let Some((edge, source)) = edges.next(&gr) { - assert_eq!(gr.find_edge(source, node), Some(edge)); - nedges += 1; - } - - let mut edges = gr.neighbors_directed(node, Outgoing).detach(); - while let Some((edge, target)) = edges.next(&gr) { - assert_eq!(gr.find_edge(node, target), Some(edge)); - nedges += 1; - } - } - assert_eq!(nedges, 8); -} - -#[test] -fn index_twice_mut() { - let mut gr = Graph::<_,_>::new(); - let a = gr.add_node(0.); - let b = gr.add_node(0.); - let c = gr.add_node(0.); - let d = gr.add_node(0.); - let e = gr.add_node(0.); - let f = gr.add_node(0.); - let g = gr.add_node(0.); - gr.add_edge(a, b, 7.0); - gr.add_edge(a, d, 5.); - gr.add_edge(d, b, 9.); - gr.add_edge(b, c, 8.); - gr.add_edge(b, e, 7.); - gr.add_edge(c, e, 5.); - gr.add_edge(d, e, 15.); - gr.add_edge(d, f, 6.); - gr.add_edge(f, e, 8.); - gr.add_edge(f, g, 11.); - gr.add_edge(e, g, 9.); - - for dir in &[Incoming, Outgoing] { - for nw in gr.node_weights_mut() { *nw = 0.; } - - // walk the graph and sum incoming edges - let mut dfs = Dfs::new(&gr, a); - while let Some(node) = dfs.next(&gr) { - let mut edges = gr.neighbors_directed(node, *dir).detach(); - while let Some(edge) = edges.next_edge(&gr) { - let (nw, ew) = gr.index_twice_mut(node, edge); - *nw += *ew; - } - } - - // check the sums - for i in 0..gr.node_count() { - let ni = NodeIndex::new(i); - let s = gr.edges_directed(ni, *dir).map(|e| *e.weight()).fold(0., |a, b| a + b); - assert_eq!(s, gr[ni]); - } - println!("Sum {:?}: {:?}", dir, gr); - } -} - -#[test] -fn toposort_generic() { - // This is a DAG, visit it in order - let mut gr = Graph::<_,_>::new(); - let b = gr.add_node(("B", 0.)); - let a = gr.add_node(("A", 0.)); - let c = gr.add_node(("C", 0.)); - let d = gr.add_node(("D", 0.)); - let e = gr.add_node(("E", 0.)); - let f = gr.add_node(("F", 0.)); - let g = gr.add_node(("G", 0.)); - gr.add_edge(a, b, 7.0); - gr.add_edge(a, d, 5.); - gr.add_edge(d, b, 9.); - gr.add_edge(b, c, 8.); - gr.add_edge(b, e, 7.); - gr.add_edge(c, e, 5.); - gr.add_edge(d, e, 15.); - gr.add_edge(d, f, 6.); - gr.add_edge(f, e, 8.); - gr.add_edge(f, g, 11.); - gr.add_edge(e, g, 9.); - - assert!(!pg::algo::is_cyclic_directed(&gr)); - let mut index = 0.; - let mut topo = Topo::new(&gr); - while let Some(nx) = topo.next(&gr) { - gr[nx].1 = index; - index += 1.; - } - - let mut order = Vec::new(); - index = 0.; - let mut topo = Topo::new(&gr); - while let Some(nx) = topo.next(&gr) { - order.push(nx); - assert_eq!(gr[nx].1, index); - index += 1.; - } - println!("{:?}", gr); - assert_is_topo_order(&gr, &order); - - { - order.clear(); - let mut topo = Topo::new(&gr); - while let Some(nx) = topo.next(&gr) { - order.push(nx); - } - println!("{:?}", gr); - assert_is_topo_order(&gr, &order); - } - let mut gr2 = gr.clone(); - gr.add_edge(e, d, -1.); - assert!(pg::algo::is_cyclic_directed(&gr)); - assert!(pg::algo::toposort(&gr, None).is_err()); - gr2.add_edge(d, d, 0.); - assert!(pg::algo::is_cyclic_directed(&gr2)); - assert!(pg::algo::toposort(&gr2, None).is_err()); -} - -#[test] -fn test_has_path() { - // This is a DAG, visit it in order - let mut gr = Graph::<_,_>::new(); - let b = gr.add_node(("B", 0.)); - let a = gr.add_node(("A", 0.)); - let c = gr.add_node(("C", 0.)); - let d = gr.add_node(("D", 0.)); - let e = gr.add_node(("E", 0.)); - let f = gr.add_node(("F", 0.)); - let g = gr.add_node(("G", 0.)); - gr.add_edge(a, b, 7.0); - gr.add_edge(a, d, 5.); - gr.add_edge(d, b, 9.); - gr.add_edge(b, c, 8.); - gr.add_edge(b, e, 7.); - gr.add_edge(c, e, 5.); - gr.add_edge(d, e, 15.); - gr.add_edge(d, f, 6.); - gr.add_edge(f, e, 8.); - gr.add_edge(f, g, 11.); - gr.add_edge(e, g, 9.); - // disconnected island - - let h = gr.add_node(("H", 0.)); - let i = gr.add_node(("I", 0.)); - gr.add_edge(h, i, 2.); - gr.add_edge(i, h, -2.); - - let mut state = DfsSpace::default(); - - gr.add_edge(b, a, 99.); - - assert!(has_path_connecting(&gr, c, c, None)); - - for edge in gr.edge_references() { - assert!(has_path_connecting(&gr, edge.source(), edge.target(), None)); - } - assert!(has_path_connecting(&gr, a, g, Some(&mut state))); - assert!(!has_path_connecting(&gr, a, h, Some(&mut state))); - assert!(has_path_connecting(&gr, a, c, None)); - assert!(has_path_connecting(&gr, a, c, Some(&mut state))); - assert!(!has_path_connecting(&gr, h, a, Some(&mut state))); -} - -#[test] -fn map_filter_map() { - let mut g = Graph::new_undirected(); - let a = g.add_node("A"); - let b = g.add_node("B"); - let c = g.add_node("C"); - let d = g.add_node("D"); - let e = g.add_node("E"); - let f = g.add_node("F"); - g.add_edge(a, b, 7); - g.add_edge(c, a, 9); - g.add_edge(a, d, 14); - g.add_edge(b, c, 10); - g.add_edge(d, c, 2); - g.add_edge(d, e, 9); - g.add_edge(b, f, 15); - g.add_edge(c, f, 11); - g.add_edge(e, f, 6); - println!("{:?}", g); - - let g2 = g.filter_map(|_, name| Some(*name), |_, &weight| if weight >= 10 { - Some(weight) - } else { None }); - assert_eq!(g2.edge_count(), 4); - for edge in g2.raw_edges() { - assert!(edge.weight >= 10); - } - - let g3 = g.filter_map(|i, &name| if i == a || i == e { None } else { Some(name) }, - |i, &weight| { - let (source, target) = g.edge_endpoints(i).unwrap(); - // don't map edges from a removed node - assert!(source != a); - assert!(target != a); - assert!(source != e); - assert!(target != e); - Some(weight) - }); - assert_eq!(g3.node_count(), g.node_count() - 2); - assert_eq!(g3.edge_count(), g.edge_count() - 5); - assert_graph_consistent(&g3); - - let mut g4 = g.clone(); - g4.retain_edges(|gr, i| { - let (s, t) = gr.edge_endpoints(i).unwrap(); - !(s == a || s == e || t == a || t == e) - }); - assert_eq!(g4.edge_count(), g.edge_count() - 5); - assert_graph_consistent(&g4); -} - -#[test] -fn from_edges() { - let n = NodeIndex::new; - let gr = Graph::<(), (), Undirected>::from_edges(&[ - (0, 1), (0, 2), (0, 3), - (1, 2), (1, 3), - (2, 3), - ]); - assert_eq!(gr.node_count(), 4); - assert_eq!(gr.edge_count(), 6); - assert_eq!(gr.neighbors(n(0)).count(), 3); - assert_eq!(gr.neighbors(n(1)).count(), 3); - assert_eq!(gr.neighbors(n(2)).count(), 3); - assert_eq!(gr.neighbors(n(3)).count(), 3); - assert_graph_consistent(&gr); -} - -#[test] -fn retain() { - let mut gr = Graph::<i32, i32, Undirected>::from_edges(&[ - (0, 1, 2), - (1, 1, 1), - (0, 2, 0), - (1, 2, 3), - (2, 3, 3), - ]); - gr.retain_edges(|mut gr, i| { - if gr[i] <= 0 { false } - else { - gr[i] -= 1; - let (s, t) = gr.edge_endpoints(i).unwrap(); - gr[s] += 1; - gr[t] += 1; - - gr[i] > 0 - } - }); - - assert_eq!(gr.edge_count(), 3); - assert_eq!(gr[n(0)], 1); - assert_eq!(gr[n(1)], 4); - assert_eq!(gr[n(2)], 2); - assert_eq!(gr[n(3)], 1); - assert!(gr.find_edge(n(1), n(1)).is_none()); - assert!(gr.find_edge(n(0), n(2)).is_none()); - assert_graph_consistent(&gr); -} - -fn assert_graph_consistent<N, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>) - where Ty: EdgeType, - Ix: IndexType, -{ - assert_eq!(g.node_count(), g.node_indices().count()); - assert_eq!(g.edge_count(), g.edge_indices().count()); - for edge in g.raw_edges() { - assert!(g.find_edge(edge.source(), edge.target()).is_some(), - "Edge not in graph! {:?} to {:?}", edge.source(), edge.target()); - } -} - -#[test] -fn neighbors_selfloops() { - // Directed graph - let mut gr = Graph::<_ ,()>::new(); - let a = gr.add_node("a"); - let b = gr.add_node("b"); - let c = gr.add_node("c"); - gr.extend_with_edges(&[ - (a, a), - (a, b), - (c, a), - (a, a), - ]); - - let out_edges = [a, a, b]; - let in_edges = [a, a, c]; - let undir_edges = [a, a, b, c]; - let mut seen_out = gr.neighbors(a).collect::<Vec<_>>(); - seen_out.sort(); - assert_eq!(&seen_out, &out_edges); - let mut seen_in = gr.neighbors_directed(a, Incoming).collect::<Vec<_>>(); - seen_in.sort(); - assert_eq!(&seen_in, &in_edges); - - let mut seen_undir = gr.neighbors_undirected(a).collect::<Vec<_>>(); - seen_undir.sort(); - assert_eq!(&seen_undir, &undir_edges); - - let mut seen_out = gr.edges(a).map(|e| e.target()).collect::<Vec<_>>(); - seen_out.sort(); - assert_eq!(&seen_out, &out_edges); - - let mut seen_walk = Vec::new(); - let mut walk = gr.neighbors(a).detach(); - while let Some(n) = walk.next_node(&gr) { seen_walk.push(n); } - seen_walk.sort(); - assert_eq!(&seen_walk, &out_edges); - - seen_walk.clear(); - let mut walk = gr.neighbors_directed(a, Incoming).detach(); - while let Some(n) = walk.next_node(&gr) { seen_walk.push(n); } - seen_walk.sort(); - assert_eq!(&seen_walk, &in_edges); - - seen_walk.clear(); - let mut walk = gr.neighbors_undirected(a).detach(); - while let Some(n) = walk.next_node(&gr) { seen_walk.push(n); } - seen_walk.sort(); - assert_eq!(&seen_walk, &undir_edges); - - // Undirected graph - let mut gr: Graph<_, (), _> = Graph::new_undirected(); - let a = gr.add_node("a"); - let b = gr.add_node("b"); - let c = gr.add_node("c"); - gr.extend_with_edges(&[ - (a, a), - (a, b), - (c, a), - ]); - - let out_edges = [a, b, c]; - let in_edges = [a, b, c]; - let undir_edges = [a, b, c]; - let mut seen_out = gr.neighbors(a).collect::<Vec<_>>(); - seen_out.sort(); - assert_eq!(&seen_out, &out_edges); - - let mut seen_out = gr.edges(a).map(|e| e.target()).collect::<Vec<_>>(); - seen_out.sort(); - assert_eq!(&seen_out, &out_edges); - - let mut seen_in = gr.neighbors_directed(a, Incoming).collect::<Vec<_>>(); - seen_in.sort(); - assert_eq!(&seen_in, &in_edges); - - let mut seen_undir = gr.neighbors_undirected(a).collect::<Vec<_>>(); - seen_undir.sort(); - assert_eq!(&seen_undir, &undir_edges); -} - - -fn degree<'a, G>(g: G, node: G::NodeId) -> usize - where G: IntoNeighbors, - G::NodeId: PartialEq, -{ - // self loops count twice - let original_node = node.clone(); - let mut degree = 0; - for v in g.neighbors(node) { - degree += if v == original_node { 2 } else { 1 }; - } - degree -} - -#[cfg(feature = "graphmap")] -#[test] -fn degree_sequence() { - let mut gr = Graph::<usize, (), Undirected>::from_edges(&[ - (0, 1), - (1, 2), (1, 3), - (2, 4), (3, 4), - (4, 4), - (4, 5), (3, 5), - ]); - gr.add_node(0); // add isolated node - let mut degree_sequence = gr.node_indices() - .map(|i| degree(&gr, i)) - .collect::<Vec<_>>(); - - degree_sequence.sort_by(|x, y| Ord::cmp(y, x)); - assert_eq!(°ree_sequence, &[5, 3, 3, 2, 2, 1, 0]); - - let mut gr = GraphMap::<_, (), Undirected>::from_edges(&[ - (0, 1), - (1, 2), (1, 3), - (2, 4), (3, 4), - (4, 4), - (4, 5), (3, 5), - ]); - gr.add_node(6); // add isolated node - let mut degree_sequence = gr.nodes() - .map(|i| degree(&gr, i)) - .collect::<Vec<_>>(); - - degree_sequence.sort_by(|x, y| Ord::cmp(y, x)); - assert_eq!(°ree_sequence, &[5, 3, 3, 2, 2, 1, 0]); -} - -#[test] -fn neighbor_order() { - let mut gr = Graph::new(); - let a = gr.add_node("a"); - let b = gr.add_node("b"); - let c = gr.add_node("c"); - gr.add_edge(a, b, 0); - gr.add_edge(a, a, 1); - - gr.add_edge(c, a, 2); - - gr.add_edge(a, c, 3); - - gr.add_edge(c, a, 4); - gr.add_edge(b, a, 5); - - // neighbors (edges) are in lifo order, if it's a directed graph - assert_eq!(gr.neighbors(a).collect::<Vec<_>>(), - vec![c, a, b]); - assert_eq!(gr.neighbors_directed(a, Incoming).collect::<Vec<_>>(), - vec![b, c, c, a]); -} - -#[test] -fn dot() { - // test alternate formatting - #[derive(Debug)] - struct Record { - a: i32, - b: &'static str, - }; - let mut gr = Graph::new(); - let a = gr.add_node(Record { a: 1, b: "abc" }); - gr.add_edge(a, a, (1, 2)); - let dot_output = format!("{:#?}", Dot::new(&gr)); - assert_eq!(dot_output, -r#"digraph { - 0 [label="Record {\l a: 1,\l b: \"abc\"\l}\l"] - 0 -> 0 [label="(\l 1,\l 2\l)\l"] -} -"#); -} - -#[test] -fn filtered() { - let mut g = Graph::new(); - let a = g.add_node("A"); - let b = g.add_node("B"); - let c = g.add_node("C"); - let d = g.add_node("D"); - let e = g.add_node("E"); - let f = g.add_node("F"); - g.add_edge(a, b, 7); - g.add_edge(c, a, 9); - g.add_edge(a, d, 14); - g.add_edge(b, c, 10); - g.add_edge(d, c, 2); - g.add_edge(d, e, 9); - g.add_edge(b, f, 15); - g.add_edge(c, f, 11); - g.add_edge(e, f, 6); - println!("{:?}", g); - - let filt = NodeFiltered(&g, |n: NodeIndex| n != c && n != e); - - let mut dfs = DfsPostOrder::new(&filt, a); - let mut po = Vec::new(); - while let Some(nx) = dfs.next(&filt) { - println!("Next: {:?}", nx); - po.push(nx); - } - assert_eq!(set(po), set(g.node_identifiers().filter(|n| (filt.1)(*n)))); -} - - - -#[test] -fn dfs_visit() { - use petgraph::visit::{Visitable, VisitMap}; - use petgraph::visit::DfsEvent::*; - use petgraph::visit::{Time, depth_first_search}; - use petgraph::visit::Control; - let gr: Graph<(), ()> = Graph::from_edges(&[ - (0, 5), (0, 2), (0, 3), (0, 1), - (1, 3), - (2, 3), (2, 4), - (4, 0), (4, 5), - ]); - - let invalid_time = Time(!0); - let mut discover_time = vec![invalid_time; gr.node_count()]; - let mut finish_time = vec![invalid_time; gr.node_count()]; - let mut has_tree_edge = gr.visit_map(); - let mut edges = HashSet::new(); - depth_first_search(&gr, Some(n(0)), |evt| { - println!("Event: {:?}", evt); - match evt { - Discover(n, t) => discover_time[n.index()] = t, - Finish(n, t) => finish_time[n.index()] = t, - TreeEdge(u, v) => { - // v is an ancestor of u - assert!(has_tree_edge.visit(v), "Two tree edges to {:?}!", v); - assert!(discover_time[v.index()] == invalid_time); - assert!(discover_time[u.index()] != invalid_time); - assert!(finish_time[u.index()] == invalid_time); - edges.insert((u, v)); - } - BackEdge(u, v) => { - // u is an ancestor of v - assert!(discover_time[v.index()] != invalid_time); - assert!(finish_time[v.index()] == invalid_time); - edges.insert((u, v)); - } - CrossForwardEdge(u, v) => { - edges.insert((u, v)); - } - } - }); - assert!(discover_time.iter().all(|x| *x != invalid_time)); - assert!(finish_time.iter().all(|x| *x != invalid_time)); - assert_eq!(edges.len(), gr.edge_count()); - assert_eq!(edges, set(gr.edge_references().map(|e| (e.source(), e.target())))); - println!("{:?}", discover_time); - println!("{:?}", finish_time); - - // find path from 0 to 4 - let mut predecessor = vec![NodeIndex::end(); gr.node_count()]; - let start = n(0); - let goal = n(4); - let ret = depth_first_search(&gr, Some(start), |event| { - if let TreeEdge(u, v) = event { - predecessor[v.index()] = u; - if v == goal { - return Control::Break(u); - } - } - Control::Continue - }); - // assert we did terminate early - assert!(ret.break_value().is_some()); - assert!(predecessor.iter().any(|x| *x == NodeIndex::end())); - - let mut next = goal; - let mut path = vec![next]; - while next != start { - let pred = predecessor[next.index()]; - path.push(pred); - next = pred; - } - path.reverse(); - assert_eq!(&path, &[n(0), n(2), n(4)]); -} - - -#[test] -fn filtered_post_order() { - use petgraph::visit::NodeFiltered; - - let mut gr: Graph<(), ()> = Graph::from_edges(&[ - (0, 2), - (1, 2), - (0, 3), - (1, 4), - (2, 4), - (4, 5), - (3, 5), - ]); - // map reachable nodes - let mut dfs = Dfs::new(&gr, n(0)); - while let Some(_) = dfs.next(&gr) { } - - let map = dfs.discovered; - gr.add_edge(n(0), n(1), ()); - let mut po = Vec::new(); - let mut dfs = DfsPostOrder::new(&gr, n(0)); - let f = NodeFiltered(&gr, map); - while let Some(n) = dfs.next(&f) { - po.push(n); - } - assert!(!po.contains(&n(1))); -} - -#[test] -fn filter_elements() { - use petgraph::data::Element::{Node, Edge}; - use petgraph::data::FromElements; - use petgraph::data::ElementIterator; - let elements = vec![ - Node { weight: "A"}, - Node { weight: "B"}, - Node { weight: "C"}, - Node { weight: "D"}, - Node { weight: "E"}, - Node { weight: "F"}, - - Edge { source: 0, target: 1, weight: 7 }, - Edge { source: 2, target: 0, weight: 9 }, - Edge { source: 0, target: 3, weight: 14 }, - Edge { source: 1, target: 2, weight: 10 }, - Edge { source: 3, target: 2, weight: 2 }, - Edge { source: 3, target: 4, weight: 9 }, - Edge { source: 1, target: 5, weight: 15 }, - Edge { source: 2, target: 5, weight: 11 }, - Edge { source: 4, target: 5, weight: 6 }, - ]; - let mut g = DiGraph::<_, _>::from_elements(elements.iter().cloned()); - println!("{:#?}", g); - assert!(g.contains_edge(n(1), n(5))); - let g2 = DiGraph::<_, _>::from_elements(elements.iter().cloned().filter_elements(|elt| { - match elt { - Node { ref weight } if **weight == "B" => false, - _ => true, - } - })); - println!("{:#?}", g2); - g.remove_node(n(1)); - assert!(is_isomorphic_matching(&g, &g2, PartialEq::eq, PartialEq::eq)); -} - -#[test] -fn test_edge_filtered() { - use petgraph::algo::connected_components; - use petgraph::visit::EdgeFiltered; - use petgraph::visit::IntoEdgeReferences; - - let gr = UnGraph::<(), _>::from_edges(&[ - // cycle - (0, 1, 7), - (1, 2, 9), - (2, 1, 14), - - // cycle - (3, 4, 10), - (4, 5, 2), - (5, 3, 9), - - // cross edges - (0, 3, -1), - (1, 4, -2), - (2, 5, -3), - ]); - assert_eq!(connected_components(&gr), 1); - let positive_edges = EdgeFiltered::from_fn(&gr, |edge| *edge.weight() >= 0); - assert_eq!(positive_edges.edge_references().count(), 6); - assert!(positive_edges.edge_references().all(|edge| *edge.weight() >= 0)); - assert_eq!(connected_components(&positive_edges), 2); - - let mut dfs = DfsPostOrder::new(&positive_edges, n(0)); - while let Some(_) = dfs.next(&positive_edges) { } - - let n = n::<u32>; - for node in &[n(0), n(1), n(2)] { - assert!(dfs.discovered.is_visited(node)); - } - for node in &[n(3), n(4), n(5)] { - assert!(!dfs.discovered.is_visited(node)); - } -} - -#[test] -fn test_dominators_simple_fast() { - // Construct the following graph: - // - // .-----. - // | <--------------------------------. - // .--------+--------------| r |--------------. | - // | | | | | | - // | | '-----' | | - // | .--V--. .--V--. | - // | | | | | | - // | | b | | c |--------. | - // | | | | | | | - // | '-----' '-----' | | - // .--V--. | | .--V--. | - // | | | | | | | - // | a <-----+ | .----| g | | - // | | | .----' | | | | - // '-----' | | | '-----' | - // | | | | | | - // .--V--. | .-----. .--V--. | | | - // | | | | | | | | | | - // | d <-----+----> e <----. | f | | | | - // | | | | | | | | | | - // '-----' '-----' | '-----' | | | - // | .-----. | | | | .--V--. | - // | | | | | | .-' | | | - // '-----> l | | | | | | j | | - // | | '--. | | | | | | - // '-----' | | | | '-----' | - // | .--V--. | | .--V--. | | - // | | | | | | | | | - // '-------> h |-' '---> i <------' | - // | | .---------> | | - // '-----' | '-----' | - // | .-----. | | - // | | | | | - // '----------> k <---------' | - // | | | - // '-----' | - // | | - // '----------------------------' - // - // This graph has the following dominator tree: - // - // r - // |-- a - // |-- b - // |-- c - // | |-- f - // | `-- g - // | `-- j - // |-- d - // | `-- l - // |-- e - // |-- i - // |-- k - // `-- h - // - // This graph and dominator tree are taken from figures 1 and 2 of "A Fast - // Algorithm for Finding Dominators in a Flowgraph" by Lengauer et al: - // http://www.cs.princeton.edu/courses/archive/spr03/cs423/download/dominators.pdf. - - let mut graph = DiGraph::<_, _>::new(); - - let r = graph.add_node("r"); - let a = graph.add_node("a"); - let b = graph.add_node("b"); - let c = graph.add_node("c"); - let d = graph.add_node("d"); - let e = graph.add_node("e"); - let f = graph.add_node("f"); - let g = graph.add_node("g"); - let h = graph.add_node("h"); - let i = graph.add_node("i"); - let j = graph.add_node("j"); - let k = graph.add_node("k"); - let l = graph.add_node("l"); - - graph.add_edge(r, a, ()); - graph.add_edge(r, b, ()); - graph.add_edge(r, c, ()); - graph.add_edge(a, d, ()); - graph.add_edge(b, a, ()); - graph.add_edge(b, d, ()); - graph.add_edge(b, e, ()); - graph.add_edge(c, f, ()); - graph.add_edge(c, g, ()); - graph.add_edge(d, l, ()); - graph.add_edge(e, h, ()); - graph.add_edge(f, i, ()); - graph.add_edge(g, i, ()); - graph.add_edge(g, j, ()); - graph.add_edge(h, e, ()); - graph.add_edge(h, k, ()); - graph.add_edge(i, k, ()); - graph.add_edge(j, i, ()); - graph.add_edge(k, r, ()); - graph.add_edge(k, i, ()); - graph.add_edge(l, h, ()); - - let doms = dominators::simple_fast(&graph, r); - - assert_eq!(doms.root(), r); - assert_eq!(doms.immediate_dominator(r), None, - "The root node has no idom"); - - assert_eq!(doms.immediate_dominator(a), Some(r), - "r is the immediate dominator of a"); - assert_eq!(doms.immediate_dominator(b), Some(r), - "r is the immediate dominator of b"); - assert_eq!(doms.immediate_dominator(c), Some(r), - "r is the immediate dominator of c"); - assert_eq!(doms.immediate_dominator(f), Some(c), - "c is the immediate dominator of f"); - assert_eq!(doms.immediate_dominator(g), Some(c), - "c is the immediate dominator of g"); - assert_eq!(doms.immediate_dominator(j), Some(g), - "g is the immediate dominator of j"); - assert_eq!(doms.immediate_dominator(d), Some(r), - "r is the immediate dominator of d"); - assert_eq!(doms.immediate_dominator(l), Some(d), - "d is the immediate dominator of l"); - assert_eq!(doms.immediate_dominator(e), Some(r), - "r is the immediate dominator of e"); - assert_eq!(doms.immediate_dominator(i), Some(r), - "r is the immediate dominator of i"); - assert_eq!(doms.immediate_dominator(k), Some(r), - "r is the immediate dominator of k"); - assert_eq!(doms.immediate_dominator(h), Some(r), - "r is the immediate dominator of h"); - - let mut graph = graph.clone(); - let z = graph.add_node("z"); - let doms = dominators::simple_fast(&graph, r); - assert_eq!(doms.immediate_dominator(z), None, - "nodes that aren't reachable from the root do not have an idom"); -} diff --git a/vendor/petgraph/tests/graphmap.rs b/vendor/petgraph/tests/graphmap.rs deleted file mode 100644 index 51b37e61a7..0000000000 --- a/vendor/petgraph/tests/graphmap.rs +++ /dev/null @@ -1,301 +0,0 @@ -#![cfg(feature = "graphmap")] -extern crate petgraph; - -use std::collections::HashSet; -use std::fmt; - -use petgraph::prelude::*; -use petgraph::visit::{ Walker, }; - -use petgraph::algo::{ dijkstra, }; - -use petgraph::dot::{Dot, Config}; - -#[test] -fn simple() { - //let root = TypedArena::<Node<_>>::new(); - let mut gr = UnGraphMap::new(); - //let node = |&: name: &'static str| Ptr(root.alloc(Node(name.to_string()))); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - let d = gr.add_node("D"); - let e = gr.add_node("E"); - let f = gr.add_node("F"); - gr.add_edge(a, b, 7); - gr.add_edge(a, c, 9); - gr.add_edge(a, d, 14); - gr.add_edge(b, c, 10); - gr.add_edge(c, d, 2); - gr.add_edge(d, e, 9); - gr.add_edge(b, f, 15); - gr.add_edge(c, f, 11); - - assert!(gr.add_edge(e, f, 5).is_none()); - - // duplicate edges - assert_eq!(gr.add_edge(f, b, 16), Some(15)); - assert_eq!(gr.add_edge(f, e, 6), Some(5)); - println!("{:?}", gr); - println!("{}", Dot::with_config(&gr, &[])); - - assert_eq!(gr.node_count(), 6); - assert_eq!(gr.edge_count(), 9); - - // check updated edge weight - assert_eq!(gr.edge_weight(e, f), Some(&6)); - let scores = dijkstra(&gr, a, None, |e| *e.weight()); - let mut scores: Vec<_> = scores.into_iter().collect(); - scores.sort(); - assert_eq!(scores, - vec![("A", 0), ("B", 7), ("C", 9), ("D", 11), ("E", 20), ("F", 20)]); -} - -#[test] -fn remov() -{ - let mut g = UnGraphMap::new(); - g.add_node(1); - g.add_node(2); - g.add_edge(1, 2, -1); - - assert_eq!(g.edge_weight(1, 2), Some(&-1)); - assert_eq!(g.edge_weight(2, 1), Some(&-1)); - assert_eq!(g.neighbors(1).count(), 1); - - let noexist = g.remove_edge(2, 3); - assert_eq!(noexist, None); - - let exist = g.remove_edge(2, 1); - assert_eq!(exist, Some(-1)); - assert_eq!(g.edge_count(), 0); - assert_eq!(g.edge_weight(1, 2), None); - assert_eq!(g.edge_weight(2, 1), None); - assert_eq!(g.neighbors(1).count(), 0); -} - -#[test] -fn remove_directed() -{ - let mut g = GraphMap::<_, _, Directed>::with_capacity(0, 0); - g.add_edge(1, 2, -1); - println!("{:?}", g); - - assert_eq!(g.edge_weight(1, 2), Some(&-1)); - assert_eq!(g.edge_weight(2, 1), None); - assert_eq!(g.neighbors(1).count(), 1); - - let noexist = g.remove_edge(2, 3); - assert_eq!(noexist, None); - - let exist = g.remove_edge(2, 1); - assert_eq!(exist, None); - let exist = g.remove_edge(1, 2); - assert_eq!(exist, Some(-1)); - println!("{:?}", g); - assert_eq!(g.edge_count(), 0); - assert_eq!(g.edge_weight(1, 2), None); - assert_eq!(g.edge_weight(2, 1), None); - assert_eq!(g.neighbors(1).count(), 0); -} - -#[test] -fn dfs() { - let mut gr = UnGraphMap::default(); - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - let k = gr.add_node("K"); - // Z is disconnected. - let z = gr.add_node("Z"); - gr.add_edge(h, i, 1.); - gr.add_edge(h, j, 3.); - gr.add_edge(i, j, 1.); - gr.add_edge(i, k, 2.); - - println!("{:?}", gr); - - { - let mut cnt = 0; - let mut dfs = Dfs::new(&gr, h); - while let Some(_) = dfs.next(&gr) { cnt += 1; } - assert_eq!(cnt, 4); - } - { - let mut cnt = 0; - let mut dfs = Dfs::new(&gr, z); - while let Some(_) = dfs.next(&gr) { cnt += 1; } - assert_eq!(cnt, 1); - } - - assert_eq!(Dfs::new(&gr, h).iter(&gr).count(), 4); - assert_eq!(Dfs::new(&gr, i).iter(&gr).count(), 4); - assert_eq!(Dfs::new(&gr, z).iter(&gr).count(), 1); -} - -#[test] -fn edge_iterator() { - let mut gr = UnGraphMap::new(); - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - let k = gr.add_node("K"); - gr.add_edge(h, i, 1); - gr.add_edge(h, j, 2); - gr.add_edge(i, j, 3); - gr.add_edge(i, k, 4); - - let real_edges: HashSet<_> = gr.all_edges().map(|(a, b, &w)| (a, b, w)).collect(); - let expected_edges: HashSet<_> = vec![ - ("H", "I", 1), - ("H", "J", 2), - ("I", "J", 3), - ("I", "K", 4) - ].into_iter().collect(); - - assert_eq!(real_edges, expected_edges); -} - -#[test] -fn from_edges() { - let gr = GraphMap::<_, _, Undirected>::from_edges(&[ - ("a", "b", 1), - ("a", "c", 2), - ("c", "d", 3), - ]); - assert_eq!(gr.node_count(), 4); - assert_eq!(gr.edge_count(), 3); - assert_eq!(gr[("a", "c")], 2); - - let gr = GraphMap::<_, (), Undirected>::from_edges(&[ - (0, 1), (0, 2), (0, 3), - (1, 2), (1, 3), - (2, 3), - ]); - assert_eq!(gr.node_count(), 4); - assert_eq!(gr.edge_count(), 6); - assert_eq!(gr.neighbors(0).count(), 3); - assert_eq!(gr.neighbors(1).count(), 3); - assert_eq!(gr.neighbors(2).count(), 3); - assert_eq!(gr.neighbors(3).count(), 3); - - println!("{:?}", Dot::with_config(&gr, &[Config::EdgeNoLabel])); -} - - -#[test] -fn graphmap_directed() { - //let root = TypedArena::<Node<_>>::new(); - let mut gr = DiGraphMap::<_, ()>::with_capacity(0, 0); - //let node = |&: name: &'static str| Ptr(root.alloc(Node(name.to_string()))); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - let d = gr.add_node("D"); - let e = gr.add_node("E"); - let edges = [ - (a, b), - (a, c), - (a, d), - (b, c), - (c, d), - (d, e), - (b, b), - ]; - gr.extend(&edges); - - // Add reverse edges -- ok! - assert!(gr.add_edge(e, d, ()).is_none()); - // duplicate edge - no - assert!(!gr.add_edge(a, b, ()).is_none()); - - // duplicate self loop - no - assert!(!gr.add_edge(b, b, ()).is_none()); - println!("{:#?}", gr); -} - -fn assert_sccs_eq<N>(mut res: Vec<Vec<N>>, mut answer: Vec<Vec<N>>) - where N: Ord + fmt::Debug, -{ - // normalize the result and compare with the answer. - for scc in &mut res { - scc.sort(); - } - res.sort(); - for scc in &mut answer { - scc.sort(); - } - answer.sort(); - assert_eq!(res, answer); -} - -#[test] -fn scc() { - let gr: GraphMap<_, u32, Directed> = GraphMap::from_edges(&[ - (6, 0, 0), - (0, 3, 1), - (3, 6, 2), - (8, 6, 3), - (8, 2, 4), - (2, 5, 5), - (5, 8, 6), - (7, 5, 7), - (1, 7, 8), - (7, 4, 9), - (4, 1, 10)]); - - assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![ - vec![0, 3, 6], - vec![1, 4, 7], - vec![2, 5, 8], - ]); -} - -#[test] -fn test_into_graph() { - let gr: GraphMap<_, u32, Directed> = GraphMap::from_edges(&[ - (6, 0, 0), - (0, 3, 1), - (3, 6, 2), - (8, 6, 3), - (8, 2, 4), - (2, 5, 5), - (5, 8, 6), - (7, 5, 7), - (1, 7, 8), - (7, 4, 9), - (4, 1, 10)]); - - let graph: Graph<_, _, _> = gr.clone().into_graph(); - println!("{}", Dot::new(&gr)); - println!("{}", Dot::new(&graph)); - - // node weigths in `graph` are node identifiers in `gr`. - for edge in graph.edge_references() { - let a = edge.source(); - let b = edge.target(); - let aw = graph[a]; - let bw = graph[b]; - assert_eq!(&gr[(aw, bw)], edge.weight()); - } -} - -#[test] -fn test_all_edges_mut() { - // graph with edge weights equal to in+out - let mut graph: GraphMap<_, u32, Directed> = GraphMap::from_edges(&[ - (0, 1, 1), - (1, 2, 3), - (2, 0, 2), - ]); - - // change it so edge weight is equal to 2 * (in+out) - for (start, end, weight) in graph.all_edges_mut() { - *weight = (start + end) * 2; - } - - // test it - for (start, end, weight) in graph.all_edges() { - assert_eq!((start + end) * 2, *weight); - } -} \ No newline at end of file diff --git a/vendor/petgraph/tests/iso.rs b/vendor/petgraph/tests/iso.rs deleted file mode 100644 index 2da12350af..0000000000 --- a/vendor/petgraph/tests/iso.rs +++ /dev/null @@ -1,565 +0,0 @@ -extern crate petgraph; - -use petgraph::prelude::*; -use petgraph::{ - EdgeType, -}; -use petgraph::graph::{ - node_index, - edge_index, -}; - -use petgraph::algo::{ - is_isomorphic, - is_isomorphic_matching, -}; - -/// Petersen A and B are isomorphic -/// -/// http://www.dharwadker.org/tevet/isomorphism/ -const PETERSEN_A: &'static str = " - 0 1 0 0 1 0 1 0 0 0 - 1 0 1 0 0 0 0 1 0 0 - 0 1 0 1 0 0 0 0 1 0 - 0 0 1 0 1 0 0 0 0 1 - 1 0 0 1 0 1 0 0 0 0 - 0 0 0 0 1 0 0 1 1 0 - 1 0 0 0 0 0 0 0 1 1 - 0 1 0 0 0 1 0 0 0 1 - 0 0 1 0 0 1 1 0 0 0 - 0 0 0 1 0 0 1 1 0 0 -"; - -const PETERSEN_B: &'static str = " - 0 0 0 1 0 1 0 0 0 1 - 0 0 0 1 1 0 1 0 0 0 - 0 0 0 0 0 0 1 1 0 1 - 1 1 0 0 0 0 0 1 0 0 - 0 1 0 0 0 0 0 0 1 1 - 1 0 0 0 0 0 1 0 1 0 - 0 1 1 0 0 1 0 0 0 0 - 0 0 1 1 0 0 0 0 1 0 - 0 0 0 0 1 1 0 1 0 0 - 1 0 1 0 1 0 0 0 0 0 -"; - -/// An almost full set, isomorphic -const FULL_A: &'static str = " - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 0 1 1 1 0 1 - 1 1 1 1 1 1 1 1 1 1 -"; - -const FULL_B: &'static str = " - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 0 1 1 1 0 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 -"; - -/// Praust A and B are not isomorphic -const PRAUST_A: &'static str = " - 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 - 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 - 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 - 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 - 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 - 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 - 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 - 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 - 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 - 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 - 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 - 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 - 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 - 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 - 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 - 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 - 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 -"; - -const PRAUST_B: &'static str = " - 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 - 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 - 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 - 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 - 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 - 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 - 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 - 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 - 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 - 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 - 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 - 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 - 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 - 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 - 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 - 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 - 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 - 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 -"; - -const G1U: &'static str = " -0 1 1 0 1 -1 0 1 0 0 -1 1 0 0 0 -0 0 0 0 0 -1 0 0 0 0 -"; - -const G2U: &'static str = " -0 1 0 1 0 -1 0 0 1 1 -0 0 0 0 0 -1 1 0 0 0 -0 1 0 0 0 -"; - -const G4U: &'static str = " -0 1 1 0 1 -1 0 0 1 0 -1 0 0 0 0 -0 1 0 0 0 -1 0 0 0 0 -"; - -const G1D: &'static str = " -0 1 1 0 1 -0 0 1 0 0 -0 0 0 0 0 -0 0 0 0 0 -0 0 0 0 0 -"; - -const G4D: &'static str = " -0 1 1 0 1 -0 0 0 1 0 -0 0 0 0 0 -0 0 0 0 0 -0 0 0 0 0 -"; - -// G8 1,2 are not iso -const G8_1: &'static str = " -0 1 1 0 0 1 1 1 -1 0 1 0 1 0 1 1 -1 1 0 1 0 0 1 1 -0 0 1 0 1 1 1 1 -0 1 0 1 0 1 1 1 -1 0 0 1 1 0 1 1 -1 1 1 1 1 1 0 1 -1 1 1 1 1 1 1 0 -"; - -const G8_2: &'static str = " -0 1 0 1 0 1 1 1 -1 0 1 0 1 0 1 1 -0 1 0 1 0 1 1 1 -1 0 1 0 1 0 1 1 -0 1 0 1 0 1 1 1 -1 0 1 0 1 0 1 1 -1 1 1 1 1 1 0 1 -1 1 1 1 1 1 1 0 -"; - -// G3 1,2 are not iso -const G3_1: &'static str = " -0 1 0 -1 0 1 -0 1 0 -"; -const G3_2: &'static str = " -0 1 1 -1 0 1 -1 1 0 -"; - -// Non-isomorphic due to selfloop difference -const S1: &'static str = " -1 1 1 -1 0 1 -1 0 0 -"; -const S2: &'static str = " -1 1 1 -0 1 1 -1 0 0 -"; - -/// Parse a text adjacency matrix format into a directed graph -fn parse_graph<Ty: EdgeType>(s: &str) -> Graph<(), (), Ty> -{ - let mut gr = Graph::with_capacity(0, 0); - let s = s.trim(); - let lines = s.lines().filter(|l| !l.is_empty()); - for (row, line) in lines.enumerate() { - for (col, word) in line.split(' ') - .filter(|s| s.len() > 0) - .enumerate() - { - let has_edge = word.parse::<i32>().unwrap(); - assert!(has_edge == 0 || has_edge == 1); - if has_edge == 0 { - continue; - } - while col >= gr.node_count() || row >= gr.node_count() { - gr.add_node(()); - } - gr.update_edge(node_index(row), node_index(col), ()); - } - } - gr -} - -fn str_to_graph(s: &str) -> Graph<(), (), Undirected> { - parse_graph(s) -} - -fn str_to_digraph(s: &str) -> Graph<(), (), Directed> { - parse_graph(s) -} - -/* -fn graph_to_ad_matrix<N, E, Ty: EdgeType>(g: &Graph<N,E,Ty>) -{ - let n = g.node_count(); - for i in (0..n) { - for j in (0..n) { - let ix = NodeIndex::new(i); - let jx = NodeIndex::new(j); - let out = match g.find_edge(ix, jx) { - None => "0", - Some(_) => "1", - }; - print!("{} ", out); - } - println!(""); - } -} -*/ - -#[test] -fn petersen_iso() -{ - // The correct isomorphism is - // 0 => 0, 1 => 3, 2 => 1, 3 => 4, 5 => 2, 6 => 5, 7 => 7, 8 => 6, 9 => 8, 4 => 9 - let peta = str_to_digraph(PETERSEN_A); - let petb = str_to_digraph(PETERSEN_B); - /* - println!("{:?}", peta); - graph_to_ad_matrix(&peta); - println!(""); - graph_to_ad_matrix(&petb); - */ - - assert!(petgraph::algo::is_isomorphic(&peta, &petb)); -} - -#[test] -fn petersen_undir_iso() -{ - // The correct isomorphism is - // 0 => 0, 1 => 3, 2 => 1, 3 => 4, 5 => 2, 6 => 5, 7 => 7, 8 => 6, 9 => 8, 4 => 9 - let peta = str_to_digraph(PETERSEN_A); - let petb = str_to_digraph(PETERSEN_B); - - assert!(petgraph::algo::is_isomorphic(&peta, &petb)); -} - -#[test] -fn full_iso() -{ - let a = str_to_graph(FULL_A); - let b = str_to_graph(FULL_B); - - assert!(petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn praust_dir_no_iso() -{ - let a = str_to_digraph(PRAUST_A); - let b = str_to_digraph(PRAUST_B); - - assert!(!petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn praust_undir_no_iso() -{ - let a = str_to_graph(PRAUST_A); - let b = str_to_graph(PRAUST_B); - - assert!(!petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn coxeter_di_iso() -{ - // The correct isomorphism is - let a = str_to_digraph(COXETER_A); - let b = str_to_digraph(COXETER_B); - assert!(petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn coxeter_undi_iso() -{ - // The correct isomorphism is - let a = str_to_graph(COXETER_A); - let b = str_to_graph(COXETER_B); - assert!(petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn g14_dir_not_iso() -{ - let a = str_to_digraph(G1D); - let b = str_to_digraph(G4D); - assert!(!petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn g14_undir_not_iso() -{ - let a = str_to_digraph(G1U); - let b = str_to_digraph(G4U); - assert!(!petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn g12_undir_iso() -{ - let a = str_to_digraph(G1U); - let b = str_to_digraph(G2U); - assert!(petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn g3_not_iso() -{ - let a = str_to_digraph(G3_1); - let b = str_to_digraph(G3_2); - assert!(!petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn g8_not_iso() -{ - let a = str_to_digraph(G8_1); - let b = str_to_digraph(G8_2); - assert_eq!(a.edge_count(), b.edge_count()); - assert_eq!(a.node_count(), b.node_count()); - assert!(!petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn s12_not_iso() -{ - let a = str_to_digraph(S1); - let b = str_to_digraph(S2); - assert_eq!(a.edge_count(), b.edge_count()); - assert_eq!(a.node_count(), b.node_count()); - assert!(!petgraph::algo::is_isomorphic(&a, &b)); -} - -#[test] -fn iso1() -{ - let mut g0 = Graph::<_, ()>::new(); - let mut g1 = Graph::<_, ()>::new(); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); - - // very simple cases - let a0 = g0.add_node(0); - let a1 = g1.add_node(0); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); - let b0 = g0.add_node(1); - let b1 = g1.add_node(1); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); - let _ = g0.add_node(2); - assert!(!petgraph::algo::is_isomorphic(&g0, &g1)); - let _ = g1.add_node(2); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); - g0.add_edge(a0, b0, ()); - assert!(!petgraph::algo::is_isomorphic(&g0, &g1)); - g1.add_edge(a1, b1, ()); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); -} - -#[test] -fn iso2() -{ - let mut g0 = Graph::<_, ()>::new(); - let mut g1 = Graph::<_, ()>::new(); - - let a0 = g0.add_node(0); - let a1 = g1.add_node(0); - let b0 = g0.add_node(1); - let b1 = g1.add_node(1); - let c0 = g0.add_node(2); - let c1 = g1.add_node(2); - g0.add_edge(a0, b0, ()); - g1.add_edge(c1, b1, ()); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); - // a -> b - // a -> c - // vs. - // c -> b - // c -> a - g0.add_edge(a0, c0, ()); - g1.add_edge(c1, a1, ()); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); - - // add - // b -> c - // vs - // b -> a - - let _ = g0.add_edge(b0, c0, ()); - let _ = g1.add_edge(b1, a1, ()); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); - let d0 = g0.add_node(3); - let d1 = g1.add_node(3); - let e0 = g0.add_node(4); - let e1 = g1.add_node(4); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); - // add - // b -> e -> d - // vs - // b -> d -> e - g0.add_edge(b0, e0, ()); - g0.add_edge(e0, d0, ()); - g1.add_edge(b1, d1, ()); - g1.add_edge(d1, e1, ()); - assert!(petgraph::algo::is_isomorphic(&g0, &g1)); -} - -#[test] -fn iso_matching() { - let g0 = Graph::<(), _>::from_edges(&[ - (0, 0, 1), - (0, 1, 2), - (0, 2, 3), - (1, 2, 4), - ]); - - let mut g1 = g0.clone(); - g1[edge_index(0)] = 0; - assert!(!is_isomorphic_matching(&g0, &g1, |x, y| x == y, |x, y| x == y)); - let mut g2 = g0.clone(); - g2[edge_index(1)] = 0; - assert!(!is_isomorphic_matching(&g0, &g2, |x, y| x == y, |x, y| x == y)); -} - -// isomorphism isn't correct for multigraphs. -// Keep this testcase to document how -#[should_panic] -#[test] -fn iso_multigraph_failure() { - let g0 = Graph::<(), ()>::from_edges(&[ - (0, 0), - (0, 0), - (0, 1), - (1, 1), - (1, 1), - (1, 0), - ]); - - let g1 = Graph::<(), ()>::from_edges(&[ - (0, 0), - (0, 1), - (0, 1), - (1, 1), - (1, 0), - (1, 0), - ]); - assert!(!is_isomorphic(&g0, &g1)); -} - - -/// Isomorphic pair -const COXETER_A: &'static str = " - 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 - 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 - 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 - 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 - 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 - 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 - 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 - 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 - 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 - 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 - 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 -"; - -const COXETER_B: &'static str = " - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 - 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 - 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 - 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 - 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 - 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 - 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 - 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 - 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 - 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 - 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 - 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 - 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 - 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 -"; - diff --git a/vendor/petgraph/tests/quickcheck.rs b/vendor/petgraph/tests/quickcheck.rs deleted file mode 100644 index c000c3cc35..0000000000 --- a/vendor/petgraph/tests/quickcheck.rs +++ /dev/null @@ -1,926 +0,0 @@ -#![cfg(feature="quickcheck")] -#[macro_use] extern crate quickcheck; -extern crate rand; -extern crate petgraph; -#[macro_use] extern crate defmac; - -extern crate odds; -extern crate itertools; - -mod utils; - -use utils::Small; - -use odds::prelude::*; -use std::collections::HashSet; -use std::hash::Hash; - -use rand::Rng; -use itertools::assert_equal; -use itertools::cloned; - -use petgraph::prelude::*; -use petgraph::{ - EdgeType, -}; -use petgraph::dot::{Dot, Config}; -use petgraph::algo::{ - condensation, - min_spanning_tree, - is_cyclic_undirected, - is_cyclic_directed, - is_isomorphic, - is_isomorphic_matching, - toposort, - kosaraju_scc, - tarjan_scc, - dijkstra, - bellman_ford, -}; -use petgraph::visit::{Topo, Reversed}; -use petgraph::visit::{ - IntoNodeReferences, - IntoEdgeReferences, - NodeIndexable, - EdgeRef, -}; -use petgraph::data::FromElements; -use petgraph::graph::{IndexType, node_index, edge_index}; -use petgraph::graphmap::{ - NodeTrait, -}; - -fn mst_graph<N, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>) -> Graph<N, E, Undirected, Ix> - where Ty: EdgeType, - Ix: IndexType, - N: Clone, E: Clone + PartialOrd, -{ - Graph::from_elements(min_spanning_tree(&g)) -} - -use std::fmt; - -quickcheck! { - fn mst_directed(g: Small<Graph<(), u32>>) -> bool { - // filter out isolated nodes - let no_singles = g.filter_map( - |nx, w| g.neighbors_undirected(nx).next().map(|_| w), - |_, w| Some(w)); - for i in no_singles.node_indices() { - assert!(no_singles.neighbors_undirected(i).count() > 0); - } - assert_eq!(no_singles.edge_count(), g.edge_count()); - let mst = mst_graph(&no_singles); - assert!(!is_cyclic_undirected(&mst)); - true - } -} - -quickcheck! { - fn mst_undirected(g: Graph<(), u32, Undirected>) -> bool { - // filter out isolated nodes - let no_singles = g.filter_map( - |nx, w| g.neighbors_undirected(nx).next().map(|_| w), - |_, w| Some(w)); - for i in no_singles.node_indices() { - assert!(no_singles.neighbors_undirected(i).count() > 0); - } - assert_eq!(no_singles.edge_count(), g.edge_count()); - let mst = mst_graph(&no_singles); - assert!(!is_cyclic_undirected(&mst)); - true - } -} - -quickcheck! { - fn reverse_undirected(g: Small<UnGraph<(), ()>>) -> bool { - let mut h = (*g).clone(); - h.reverse(); - is_isomorphic(&g, &h) - } -} - -fn assert_graph_consistent<N, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>) - where Ty: EdgeType, - Ix: IndexType, -{ - assert_eq!(g.node_count(), g.node_indices().count()); - assert_eq!(g.edge_count(), g.edge_indices().count()); - for edge in g.raw_edges() { - assert!(g.find_edge(edge.source(), edge.target()).is_some(), - "Edge not in graph! {:?} to {:?}", edge.source(), edge.target()); - } -} - -#[test] -fn reverse_directed() { - fn prop<Ty: EdgeType>(mut g: Graph<(), (), Ty>) -> bool { - let node_outdegrees = g.node_indices() - .map(|i| g.neighbors_directed(i, Outgoing).count()) - .collect::<Vec<_>>(); - let node_indegrees = g.node_indices() - .map(|i| g.neighbors_directed(i, Incoming).count()) - .collect::<Vec<_>>(); - - g.reverse(); - let new_outdegrees = g.node_indices() - .map(|i| g.neighbors_directed(i, Outgoing).count()) - .collect::<Vec<_>>(); - let new_indegrees = g.node_indices() - .map(|i| g.neighbors_directed(i, Incoming).count()) - .collect::<Vec<_>>(); - assert_eq!(node_outdegrees, new_indegrees); - assert_eq!(node_indegrees, new_outdegrees); - assert_graph_consistent(&g); - true - } - quickcheck::quickcheck(prop as fn(Graph<_, _, Directed>) -> bool); -} - -#[test] -fn graph_retain_nodes() { - fn prop<Ty: EdgeType>(mut g: Graph<i32, i32, Ty>) -> bool { - // Remove all negative nodes, these should be randomly spread - let og = g.clone(); - let nodes = g.node_count(); - let num_negs = g.raw_nodes().iter().filter(|n| n.weight < 0).count(); - let mut removed = 0; - g.retain_nodes(|g, i| { - let keep = g[i] >= 0; - if !keep { - removed += 1; - } - keep - }); - let num_negs_post = g.raw_nodes().iter().filter(|n| n.weight < 0).count(); - let num_pos_post = g.raw_nodes().iter().filter(|n| n.weight >= 0).count(); - assert_eq!(num_negs_post, 0); - assert_eq!(removed, num_negs); - assert_eq!(num_negs + g.node_count(), nodes); - assert_eq!(num_pos_post, g.node_count()); - - // check against filter_map - let filtered = og.filter_map(|_, w| if *w >= 0 { Some(*w) } else { None }, - |_, w| Some(*w)); - assert_eq!(g.node_count(), filtered.node_count()); - /* - println!("Iso of graph with nodes={}, edges={}", - g.node_count(), g.edge_count()); - */ - assert!(is_isomorphic_matching(&filtered, &g, PartialEq::eq, PartialEq::eq)); - - true - } - quickcheck::quickcheck(prop as fn(Graph<_, _, Directed>) -> bool); - quickcheck::quickcheck(prop as fn(Graph<_, _, Undirected>) -> bool); -} - -#[test] -fn graph_retain_edges() { - fn prop<Ty: EdgeType>(mut g: Graph<(), i32, Ty>) -> bool { - // Remove all negative edges, these should be randomly spread - let og = g.clone(); - let edges = g.edge_count(); - let num_negs = g.raw_edges().iter().filter(|n| n.weight < 0).count(); - let mut removed = 0; - g.retain_edges(|g, i| { - let keep = g[i] >= 0; - if !keep { - removed += 1; - } - keep - }); - let num_negs_post = g.raw_edges().iter().filter(|n| n.weight < 0).count(); - let num_pos_post = g.raw_edges().iter().filter(|n| n.weight >= 0).count(); - assert_eq!(num_negs_post, 0); - assert_eq!(removed, num_negs); - assert_eq!(num_negs + g.edge_count(), edges); - assert_eq!(num_pos_post, g.edge_count()); - if og.edge_count() < 30 { - // check against filter_map - let filtered = og.filter_map( - |_, w| Some(*w), - |_, w| if *w >= 0 { Some(*w) } else { None }); - assert_eq!(g.node_count(), filtered.node_count()); - assert!(is_isomorphic(&filtered, &g)); - } - true - } - quickcheck::quickcheck(prop as fn(Graph<_, _, Directed>) -> bool); - quickcheck::quickcheck(prop as fn(Graph<_, _, Undirected>) -> bool); -} - -#[test] -fn stable_graph_retain_edges() { - fn prop<Ty: EdgeType>(mut g: StableGraph<(), i32, Ty>) -> bool { - // Remove all negative edges, these should be randomly spread - let og = g.clone(); - let edges = g.edge_count(); - let num_negs = g.edge_references().filter(|n| *n.weight() < 0).count(); - let mut removed = 0; - g.retain_edges(|g, i| { - let keep = g[i] >= 0; - if !keep { - removed += 1; - } - keep - }); - let num_negs_post = g.edge_references().filter(|n| *n.weight() < 0).count(); - let num_pos_post = g.edge_references().filter(|n| *n.weight() >= 0).count(); - assert_eq!(num_negs_post, 0); - assert_eq!(removed, num_negs); - assert_eq!(num_negs + g.edge_count(), edges); - assert_eq!(num_pos_post, g.edge_count()); - if og.edge_count() < 30 { - // check against filter_map - let filtered = og.filter_map( - |_, w| Some(*w), - |_, w| if *w >= 0 { Some(*w) } else { None }); - assert_eq!(g.node_count(), filtered.node_count()); - } - true - } - quickcheck::quickcheck(prop as fn(StableGraph<_, _, Directed>) -> bool); - quickcheck::quickcheck(prop as fn(StableGraph<_, _, Undirected>) -> bool); -} - -#[test] -fn isomorphism_1() { - // using small weights so that duplicates are likely - fn prop<Ty: EdgeType>(g: Small<Graph<i8, i8, Ty>>) -> bool { - let mut rng = rand::thread_rng(); - // several trials of different isomorphisms of the same graph - // mapping of node indices - let mut map = g.node_indices().collect::<Vec<_>>(); - let mut ng = Graph::<_, _, Ty>::with_capacity(g.node_count(), g.edge_count()); - for _ in 0..1 { - rng.shuffle(&mut map); - ng.clear(); - - for _ in g.node_indices() { - ng.add_node(0); - } - // Assign node weights - for i in g.node_indices() { - ng[map[i.index()]] = g[i]; - } - // Add edges - for i in g.edge_indices() { - let (s, t) = g.edge_endpoints(i).unwrap(); - ng.add_edge(map[s.index()], - map[t.index()], - g[i]); - } - if g.node_count() < 20 && g.edge_count() < 50 { - assert!(is_isomorphic(&g, &ng)); - } - assert!(is_isomorphic_matching(&g, &ng, PartialEq::eq, PartialEq::eq)); - } - true - } - quickcheck::quickcheck(prop::<Undirected> as fn(_) -> bool); - quickcheck::quickcheck(prop::<Directed> as fn(_) -> bool); -} - -#[test] -fn isomorphism_modify() { - // using small weights so that duplicates are likely - fn prop<Ty: EdgeType>(g: Small<Graph<i16, i8, Ty>>, node: u8, edge: u8) -> bool { - println!("graph {:#?}", g); - let mut ng = (*g).clone(); - let i = node_index(node as usize); - let j = edge_index(edge as usize); - if i.index() < g.node_count() { - ng[i] = (g[i] == 0) as i16; - } - if j.index() < g.edge_count() { - ng[j] = (g[j] == 0) as i8; - } - if i.index() < g.node_count() || j.index() < g.edge_count() { - assert!(!is_isomorphic_matching(&g, &ng, PartialEq::eq, PartialEq::eq)); - } else { - assert!(is_isomorphic_matching(&g, &ng, PartialEq::eq, PartialEq::eq)); - } - true - } - quickcheck::quickcheck(prop::<Undirected> as fn(_, _, _) -> bool); - quickcheck::quickcheck(prop::<Directed> as fn(_, _, _) -> bool); -} - -#[test] -fn graph_remove_edge() { - fn prop<Ty: EdgeType>(mut g: Graph<(), (), Ty>, a: u8, b: u8) -> bool { - let a = node_index(a as usize); - let b = node_index(b as usize); - let edge = g.find_edge(a, b); - if !g.is_directed() { - assert_eq!(edge.is_some(), g.find_edge(b, a).is_some()); - } - if let Some(ex) = edge { - assert!(g.remove_edge(ex).is_some()); - } - assert_graph_consistent(&g); - assert!(g.find_edge(a, b).is_none()); - assert!(g.neighbors(a).find(|x| *x == b).is_none()); - if !g.is_directed() { - assert!(g.neighbors(b).find(|x| *x == a).is_none()); - } - true - } - quickcheck::quickcheck(prop as fn(Graph<_, _, Undirected>, _, _) -> bool); - quickcheck::quickcheck(prop as fn(Graph<_, _, Directed>, _, _) -> bool); -} - -#[cfg(feature = "stable_graph")] -#[test] -fn stable_graph_remove_edge() { - fn prop<Ty: EdgeType>(mut g: StableGraph<(), (), Ty>, a: u8, b: u8) -> bool { - let a = node_index(a as usize); - let b = node_index(b as usize); - let edge = g.find_edge(a, b); - if !g.is_directed() { - assert_eq!(edge.is_some(), g.find_edge(b, a).is_some()); - } - if let Some(ex) = edge { - assert!(g.remove_edge(ex).is_some()); - } - //assert_graph_consistent(&g); - assert!(g.find_edge(a, b).is_none()); - assert!(g.neighbors(a).find(|x| *x == b).is_none()); - if !g.is_directed() { - assert!(g.find_edge(b, a).is_none()); - assert!(g.neighbors(b).find(|x| *x == a).is_none()); - } - true - } - quickcheck::quickcheck(prop as fn(StableGraph<_, _, Undirected>, _, _) -> bool); - quickcheck::quickcheck(prop as fn(StableGraph<_, _, Directed>, _, _) -> bool); -} - -#[cfg(feature = "stable_graph")] -#[test] -fn stable_graph_add_remove_edges() { - fn prop<Ty: EdgeType>(mut g: StableGraph<(), (), Ty>, edges: Vec<(u8, u8)>) -> bool { - for &(a, b) in &edges { - let a = node_index(a as usize); - let b = node_index(b as usize); - let edge = g.find_edge(a, b); - - if edge.is_none() && g.contains_node(a) && g.contains_node(b) { - let _index = g.add_edge(a, b, ()); - continue; - } - - if !g.is_directed() { - assert_eq!(edge.is_some(), g.find_edge(b, a).is_some()); - } - if let Some(ex) = edge { - assert!(g.remove_edge(ex).is_some()); - } - //assert_graph_consistent(&g); - assert!(g.find_edge(a, b).is_none(), "failed to remove edge {:?} from graph {:?}", (a, b), g); - assert!(g.neighbors(a).find(|x| *x == b).is_none()); - if !g.is_directed() { - assert!(g.find_edge(b, a).is_none()); - assert!(g.neighbors(b).find(|x| *x == a).is_none()); - } - } - true - } - quickcheck::quickcheck(prop as fn(StableGraph<_, _, Undirected>, _) -> bool); - quickcheck::quickcheck(prop as fn(StableGraph<_, _, Directed>, _) -> bool); -} - -fn assert_graphmap_consistent<N, E, Ty>(g: &GraphMap<N, E, Ty>) - where Ty: EdgeType, - N: NodeTrait + fmt::Debug, -{ - for (a, b, _weight) in g.all_edges() { - assert!(g.contains_edge(a, b), - "Edge not in graph! {:?} to {:?}", a, b); - assert!(g.neighbors(a).find(|x| *x == b).is_some(), - "Edge {:?} not in neighbor list for {:?}", (a, b), a); - if !g.is_directed() { - assert!(g.neighbors(b).find(|x| *x == a).is_some(), - "Edge {:?} not in neighbor list for {:?}", (b, a), b); - } - } -} - -#[test] -fn graphmap_remove() { - fn prop<Ty: EdgeType>(mut g: GraphMap<i8, (), Ty>, a: i8, b: i8) -> bool { - //if g.edge_count() > 20 { return true; } - assert_graphmap_consistent(&g); - let contains = g.contains_edge(a, b); - if !g.is_directed() { - assert_eq!(contains, g.contains_edge(b, a)); - } - assert_eq!(g.remove_edge(a, b).is_some(), contains); - assert!(!g.contains_edge(a, b) && - g.neighbors(a).find(|x| *x == b).is_none()); - //(g.is_directed() || g.neighbors(b).find(|x| *x == a).is_none())); - assert!(g.remove_edge(a, b).is_none()); - assert_graphmap_consistent(&g); - true - } - quickcheck::quickcheck(prop as fn(DiGraphMap<_, _>, _, _) -> bool); - quickcheck::quickcheck(prop as fn(UnGraphMap<_, _>, _, _) -> bool); -} - -#[test] -fn graphmap_add_remove() { - fn prop(mut g: UnGraphMap<i8, ()>, a: i8, b: i8) -> bool { - assert_eq!(g.contains_edge(a, b), g.add_edge(a, b, ()).is_some()); - g.remove_edge(a, b); - !g.contains_edge(a, b) && - g.neighbors(a).find(|x| *x == b).is_none() && - g.neighbors(b).find(|x| *x == a).is_none() - } - quickcheck::quickcheck(prop as fn(_, _, _) -> bool); -} - -fn sort_sccs<T: Ord>(v: &mut [Vec<T>]) { - for scc in &mut *v { - scc.sort(); - } - v.sort(); -} - -quickcheck! { - fn graph_sccs(g: Graph<(), ()>) -> bool { - let mut sccs = kosaraju_scc(&g); - let mut tsccs = tarjan_scc(&g); - sort_sccs(&mut sccs); - sort_sccs(&mut tsccs); - if sccs != tsccs { - println!("{:?}", - Dot::with_config(&g, &[Config::EdgeNoLabel, - Config::NodeIndexLabel])); - println!("Sccs {:?}", sccs); - println!("Sccs (Tarjan) {:?}", tsccs); - return false; - } - true - } -} - -quickcheck! { - fn kosaraju_scc_is_topo_sort(g: Graph<(), ()>) -> bool { - let tsccs = kosaraju_scc(&g); - let firsts = vec(tsccs.iter().rev().map(|v| v[0])); - subset_is_topo_order(&g, &firsts) - } -} - -quickcheck! { - fn tarjan_scc_is_topo_sort(g: Graph<(), ()>) -> bool { - let tsccs = tarjan_scc(&g); - let firsts = vec(tsccs.iter().rev().map(|v| v[0])); - subset_is_topo_order(&g, &firsts) - } -} - - -quickcheck! { - // Reversed edges gives the same sccs (when sorted) - fn graph_reverse_sccs(g: Graph<(), ()>) -> bool { - let mut sccs = kosaraju_scc(&g); - let mut tsccs = kosaraju_scc(Reversed(&g)); - sort_sccs(&mut sccs); - sort_sccs(&mut tsccs); - if sccs != tsccs { - println!("{:?}", - Dot::with_config(&g, &[Config::EdgeNoLabel, - Config::NodeIndexLabel])); - println!("Sccs {:?}", sccs); - println!("Sccs (Reversed) {:?}", tsccs); - return false; - } - true - } -} - -quickcheck! { - // Reversed edges gives the same sccs (when sorted) - fn graphmap_reverse_sccs(g: DiGraphMap<u16, ()>) -> bool { - let mut sccs = kosaraju_scc(&g); - let mut tsccs = kosaraju_scc(Reversed(&g)); - sort_sccs(&mut sccs); - sort_sccs(&mut tsccs); - if sccs != tsccs { - println!("{:?}", - Dot::with_config(&g, &[Config::EdgeNoLabel, - Config::NodeIndexLabel])); - println!("Sccs {:?}", sccs); - println!("Sccs (Reversed) {:?}", tsccs); - return false; - } - true - } -} - -#[test] -fn graph_condensation_acyclic() { - fn prop(g: Graph<(), ()>) -> bool { - !is_cyclic_directed(&condensation(g, /* make_acyclic */ true)) - } - quickcheck::quickcheck(prop as fn(_) -> bool); -} - -#[derive(Debug, Clone)] -struct DAG<N: Default + Clone + Send + 'static>(Graph<N, ()>); - -impl<N: Default + Clone + Send + 'static> quickcheck::Arbitrary for DAG<N> { - fn arbitrary<G: quickcheck::Gen>(g: &mut G) -> Self { - let nodes = usize::arbitrary(g); - if nodes == 0 { - return DAG(Graph::with_capacity(0, 0)); - } - let split = g.gen_range(0., 1.); - let max_width = f64::sqrt(nodes as f64) as usize; - let tall = (max_width as f64 * split) as usize; - let fat = max_width - tall; - - let edge_prob = 1. - (1. - g.gen_range(0., 1.)) * (1. - g.gen_range(0., 1.)); - let edges = ((nodes as f64).powi(2) * edge_prob) as usize; - let mut gr = Graph::with_capacity(nodes, edges); - let mut nodes = 0; - for _ in 0..tall { - let cur_nodes = g.gen_range(0, fat); - for _ in 0..cur_nodes { - gr.add_node(N::default()); - } - for j in 0..nodes { - for k in 0..cur_nodes { - if g.gen_range(0., 1.) < edge_prob { - gr.add_edge(NodeIndex::new(j), NodeIndex::new(k + nodes), ()); - } - } - } - nodes += cur_nodes; - } - DAG(gr) - } - - // shrink the graph by splitting it in two by a very - // simple algorithm, just even and odd node indices - fn shrink(&self) -> Box<Iterator<Item=Self>> { - let self_ = self.clone(); - Box::new((0..2).filter_map(move |x| { - let gr = self_.0.filter_map(|i, w| { - if i.index() % 2 == x { - Some(w.clone()) - } else { - None - } - }, - |_, w| Some(w.clone()) - ); - // make sure we shrink - if gr.node_count() < self_.0.node_count() { - Some(DAG(gr)) - } else { - None - } - })) - } -} - -fn is_topo_order<N>(gr: &Graph<N, (), Directed>, order: &[NodeIndex]) -> bool { - if gr.node_count() != order.len() { - println!("Graph ({}) and count ({}) had different amount of nodes.", gr.node_count(), order.len()); - return false; - } - // check all the edges of the graph - for edge in gr.raw_edges() { - let a = edge.source(); - let b = edge.target(); - let ai = order.find(&a).unwrap(); - let bi = order.find(&b).unwrap(); - if ai >= bi { - println!("{:?} > {:?} ", a, b); - return false; - } - } - true -} - - -fn subset_is_topo_order<N>(gr: &Graph<N, (), Directed>, order: &[NodeIndex]) -> bool { - if gr.node_count() < order.len() { - println!("Graph (len={}) had less nodes than order (len={})", gr.node_count(), order.len()); - return false; - } - // check all the edges of the graph - for edge in gr.raw_edges() { - let a = edge.source(); - let b = edge.target(); - if a == b { - continue; - } - // skip those that are not in the subset - let ai = match order.find(&a) { - Some(i) => i, - None => continue, - }; - let bi = match order.find(&b) { - Some(i) => i, - None => continue, - }; - if ai >= bi { - println!("{:?} > {:?} ", a, b); - return false; - } - } - true -} - -#[test] -fn full_topo() { - fn prop(DAG(gr): DAG<()>) -> bool { - let order = toposort(&gr, None).unwrap(); - is_topo_order(&gr, &order) - } - quickcheck::quickcheck(prop as fn(_) -> bool); -} - -#[test] -fn full_topo_generic() { - fn prop_generic(DAG(mut gr): DAG<usize>) -> bool { - assert!(!is_cyclic_directed(&gr)); - let mut index = 0; - let mut topo = Topo::new(&gr); - while let Some(nx) = topo.next(&gr) { - gr[nx] = index; - index += 1; - } - - let mut order = Vec::new(); - index = 0; - let mut topo = Topo::new(&gr); - while let Some(nx) = topo.next(&gr) { - order.push(nx); - assert_eq!(gr[nx], index); - index += 1; - } - if !is_topo_order(&gr, &order) { - println!("{:?}", gr); - return false; - } - - { - order.clear(); - let mut topo = Topo::new(&gr); - while let Some(nx) = topo.next(&gr) { - order.push(nx); - } - if !is_topo_order(&gr, &order) { - println!("{:?}", gr); - return false; - } - } - true - } - quickcheck::quickcheck(prop_generic as fn(_) -> bool); -} - -quickcheck! { - // checks that the distances computed by dijkstra satisfy the triangle - // inequality. - fn dijkstra_triangle_ineq(g: Graph<u32, u32>, node: usize) -> bool { - if g.node_count() == 0 { - return true; - } - let v = node_index(node % g.node_count()); - let distances = dijkstra(&g, v, None, |e| *e.weight()); - for v2 in distances.keys() { - let dv2 = distances[v2]; - // triangle inequality: - // d(v,u) <= d(v,v2) + w(v2,u) - for edge in g.edges(*v2) { - let u = edge.target(); - let w = edge.weight(); - if distances.contains_key(&u) && distances[&u] > dv2 + w { - return false; - } - } - } - true - } -} - -fn set<I>(iter: I) -> HashSet<I::Item> - where I: IntoIterator, - I::Item: Hash + Eq, -{ - iter.into_iter().collect() -} - - -quickcheck! { - fn dfs_visit(gr: Graph<(), ()>, node: usize) -> bool { - use petgraph::visit::{Visitable, VisitMap}; - use petgraph::visit::DfsEvent::*; - use petgraph::visit::{Time, depth_first_search}; - if gr.node_count() == 0 { - return true; - } - let start_node = node_index(node % gr.node_count()); - - let invalid_time = Time(!0); - let mut discover_time = vec![invalid_time; gr.node_count()]; - let mut finish_time = vec![invalid_time; gr.node_count()]; - let mut has_tree_edge = gr.visit_map(); - let mut edges = HashSet::new(); - depth_first_search(&gr, Some(start_node).into_iter().chain(gr.node_indices()), - |evt| { - match evt { - Discover(n, t) => discover_time[n.index()] = t, - Finish(n, t) => finish_time[n.index()] = t, - TreeEdge(u, v) => { - // v is an ancestor of u - assert!(has_tree_edge.visit(v), "Two tree edges to {:?}!", v); - assert!(discover_time[v.index()] == invalid_time); - assert!(discover_time[u.index()] != invalid_time); - assert!(finish_time[u.index()] == invalid_time); - edges.insert((u, v)); - } - BackEdge(u, v) => { - // u is an ancestor of v - assert!(discover_time[v.index()] != invalid_time); - assert!(finish_time[v.index()] == invalid_time); - edges.insert((u, v)); - } - CrossForwardEdge(u, v) => { - edges.insert((u, v)); - } - } - }); - assert!(discover_time.iter().all(|x| *x != invalid_time)); - assert!(finish_time.iter().all(|x| *x != invalid_time)); - assert_eq!(edges.len(), gr.edge_count()); - assert_eq!(edges, set(gr.edge_references().map(|e| (e.source(), e.target())))); - true - } -} - -quickcheck! { - fn test_bellman_ford(gr: Graph<(), f32>) -> bool { - let mut gr = gr; - for elt in gr.edge_weights_mut() { - *elt = elt.abs(); - } - if gr.node_count() == 0 { - return true; - } - for (i, start) in gr.node_indices().enumerate() { - if i >= 10 { break; } // testing all is too slow - bellman_ford(&gr, start).unwrap(); - } - true - } -} - -quickcheck! { - fn test_bellman_ford_undir(gr: Graph<(), f32, Undirected>) -> bool { - let mut gr = gr; - for elt in gr.edge_weights_mut() { - *elt = elt.abs(); - } - if gr.node_count() == 0 { - return true; - } - for (i, start) in gr.node_indices().enumerate() { - if i >= 10 { break; } // testing all is too slow - bellman_ford(&gr, start).unwrap(); - } - true - } -} - -defmac!(iter_eq a, b => a.eq(b)); -defmac!(nodes_eq ref a, ref b => a.node_references().eq(b.node_references())); -defmac!(edgew_eq ref a, ref b => a.edge_references().eq(b.edge_references())); -defmac!(edges_eq ref a, ref b => - iter_eq!( - a.edge_references().map(|e| (e.source(), e.target())), - b.edge_references().map(|e| (e.source(), e.target())))); - -quickcheck! { - fn test_di_from(gr1: DiGraph<i32, i32>) -> () { - let sgr = StableGraph::from(gr1.clone()); - let gr2 = Graph::from(sgr); - - assert!(nodes_eq!(gr1, gr2)); - assert!(edgew_eq!(gr1, gr2)); - assert!(edges_eq!(gr1, gr2)); - } - fn test_un_from(gr1: UnGraph<i32, i32>) -> () { - let sgr = StableGraph::from(gr1.clone()); - let gr2 = Graph::from(sgr); - - assert!(nodes_eq!(gr1, gr2)); - assert!(edgew_eq!(gr1, gr2)); - assert!(edges_eq!(gr1, gr2)); - } - - fn test_graph_from_stable_graph(gr1: StableDiGraph<usize, usize>) -> () { - let mut gr1 = gr1; - let gr2 = Graph::from(gr1.clone()); - - // renumber the stablegraph nodes and put the new index in the - // associated data - let mut index = 0; - for i in 0..gr1.node_bound() { - let ni = node_index(i); - if gr1.contains_node(ni) { - gr1[ni] = index; - index += 1; - } - } - if let Some(edge_bound) = gr1.edge_references().next_back() - .map(|ed| ed.id().index() + 1) - { - index = 0; - for i in 0..edge_bound { - let ni = edge_index(i); - if gr1.edge_weight(ni).is_some() { - gr1[ni] = index; - index += 1; - } - } - } - - assert_equal( - // Remap the stablegraph to compact indices - gr1.edge_references().map(|ed| (edge_index(*ed.weight()), gr1[ed.source()], gr1[ed.target()])), - gr2.edge_references().map(|ed| (ed.id(), ed.source().index(), ed.target().index())) - ); - } - - fn stable_di_graph_map_id(gr1: StableDiGraph<usize, usize>) -> () { - let gr2 = gr1.map(|_, &nw| nw, |_, &ew| ew); - assert!(nodes_eq!(gr1, gr2)); - assert!(edgew_eq!(gr1, gr2)); - assert!(edges_eq!(gr1, gr2)); - } - - fn stable_un_graph_map_id(gr1: StableUnGraph<usize, usize>) -> () { - let gr2 = gr1.map(|_, &nw| nw, |_, &ew| ew); - assert!(nodes_eq!(gr1, gr2)); - assert!(edgew_eq!(gr1, gr2)); - assert!(edges_eq!(gr1, gr2)); - } - - fn stable_di_graph_filter_map_id(gr1: StableDiGraph<usize, usize>) -> () { - let gr2 = gr1.filter_map(|_, &nw| Some(nw), |_, &ew| Some(ew)); - assert!(nodes_eq!(gr1, gr2)); - assert!(edgew_eq!(gr1, gr2)); - assert!(edges_eq!(gr1, gr2)); - } - - fn test_stable_un_graph_filter_map_id(gr1: StableUnGraph<usize, usize>) -> () { - let gr2 = gr1.filter_map(|_, &nw| Some(nw), |_, &ew| Some(ew)); - assert!(nodes_eq!(gr1, gr2)); - assert!(edgew_eq!(gr1, gr2)); - assert!(edges_eq!(gr1, gr2)); - } - - fn stable_di_graph_filter_map_remove(gr1: Small<StableDiGraph<i32, i32>>, - nodes: Vec<usize>, - edges: Vec<usize>) -> () - { - let gr2 = gr1.filter_map(|ix, &nw| { - if !nodes.contains(&ix.index()) { Some(nw) } else { None } - }, - |ix, &ew| { - if !edges.contains(&ix.index()) { Some(ew) } else { None } - }); - let check_nodes = &set(gr1.node_indices()) - &set(cloned(&nodes).map(node_index)); - let mut check_edges = &set(gr1.edge_indices()) - &set(cloned(&edges).map(edge_index)); - // remove all edges with endpoint in removed nodes - for edge in gr1.edge_references() { - if nodes.contains(&edge.source().index()) || - nodes.contains(&edge.target().index()) { - check_edges.remove(&edge.id()); - } - } - // assert maintained - for i in check_nodes { - assert_eq!(gr1[i], gr2[i]); - } - for i in check_edges { - assert_eq!(gr1[i], gr2[i]); - assert_eq!(gr1.edge_endpoints(i), gr2.edge_endpoints(i)); - } - - // assert removals - for i in nodes { - assert!(gr2.node_weight(node_index(i)).is_none()); - } - for i in edges { - assert!(gr2.edge_weight(edge_index(i)).is_none()); - } - } -} diff --git a/vendor/petgraph/tests/stable_graph.rs b/vendor/petgraph/tests/stable_graph.rs deleted file mode 100644 index bc6b034e25..0000000000 --- a/vendor/petgraph/tests/stable_graph.rs +++ /dev/null @@ -1,345 +0,0 @@ -#![cfg(feature = "stable_graph")] - -extern crate petgraph; -extern crate itertools; -#[macro_use] extern crate defmac; - -use petgraph::prelude::*; -use petgraph::stable_graph::node_index as n; -use petgraph::EdgeType; -use petgraph::algo::{kosaraju_scc, tarjan_scc}; -use petgraph::visit::{ - NodeIndexable, - IntoNodeReferences, - IntoEdgeReferences, -}; -use petgraph::dot::Dot; - -use itertools::assert_equal; - -#[test] -fn node_indices() { - let mut g = StableGraph::<_, ()>::new(); - let a = g.add_node(0); - let b = g.add_node(1); - let c = g.add_node(2); - g.remove_node(b); - let mut iter = g.node_indices(); - assert_eq!(iter.next(), Some(a)); - assert_eq!(iter.next(), Some(c)); - assert_eq!(iter.next(), None); -} - -#[test] -fn node_bound() { - let mut g = StableGraph::<_, ()>::new(); - assert_eq!(g.node_bound(), g.node_count()); - for i in 0..10 { - g.add_node(i); - assert_eq!(g.node_bound(), g.node_count()); - } - let full_count = g.node_count(); - g.remove_node(n(0)); - g.remove_node(n(2)); - assert_eq!(g.node_bound(), full_count); - g.clear(); - assert_eq!(g.node_bound(), 0); -} - -#[test] -fn clear_edges() { - let mut gr = scc_graph(); - gr.remove_node(n(1)); - gr.clear_edges(); - // check that we use the free list for the vacancies - assert_eq!(gr.add_node(()), n(1)); - assert_eq!(gr.add_node(()), n(4)); - assert!(gr.edge_references().next().is_none()); - assert!(gr.node_indices().all(|i| gr.neighbors(i).next().is_none())); -} - -fn assert_sccs_eq(mut res: Vec<Vec<NodeIndex>>, normalized: Vec<Vec<NodeIndex>>) { - // normalize the result and compare with the answer. - for scc in &mut res { - scc.sort(); - } - // sort by minimum element - res.sort_by(|v, w| v[0].cmp(&w[0])); - assert_eq!(res, normalized); -} - -fn scc_graph() -> StableGraph<(), ()> { - let mut gr: StableGraph<(), ()> = StableGraph::from_edges(&[ - (6, 0), - (0, 3), - (3, 6), - (8, 6), (8, 2), - (2, 5), (5, 8), (7, 5), - (1, 7), - (7, 4), - (4, 1)]); - // make an identical replacement of n(4) and leave a hole - let x = gr.add_node(()); - gr.add_edge(n(7), x, ()); - gr.add_edge(x, n(1), ()); - gr.remove_node(n(4)); - gr -} - -#[test] -fn test_scc() { - let gr = scc_graph(); - println!("{:?}", gr); - - let x = n(gr.node_bound() - 1); - assert_sccs_eq(kosaraju_scc(&gr), vec![ - vec![n(0), n(3), n(6)], - vec![n(1), n(7), x ], - vec![n(2), n(5), n(8)], - ]); -} - - -#[test] -fn test_tarjan_scc() { - let gr = scc_graph(); - - let x = n(gr.node_bound() - 1); - assert_sccs_eq(tarjan_scc(&gr), vec![ - vec![n(0), n(3), n(6)], - vec![n(1), n(7), x ], - vec![n(2), n(5), n(8)], - ]); -} - -fn make_graph<Ty>() -> StableGraph<(), i32, Ty> - where Ty: EdgeType, -{ - let mut gr = StableGraph::default(); - let mut c = 0..; - let mut e = || -> i32 { c.next().unwrap() }; - gr.extend_with_edges(&[ - (6, 0, e()), - (0, 3, e()), - (3, 6, e()), - (8, 6, e()), - (8, 2, e()), - (2, 5, e()), - (5, 8, e()), - (7, 5, e()), - (1, 7, e()), - (7, 4, e()), - (8, 6, e()), // parallel edge - (4, 1, e())]); - // make an identical replacement of n(4) and leave a hole - let x = gr.add_node(()); - gr.add_edge(n(7), x, e()); - gr.add_edge(x, n(1), e()); - gr.add_edge(x, x, e()); // make two self loops - let rm_self_loop = gr.add_edge(x, x, e()); - gr.add_edge(x, x, e()); - gr.remove_node(n(4)); - gr.remove_node(n(6)); - gr.remove_edge(rm_self_loop); - gr -} - -defmac!(edges ref gr, x => gr.edges(x).map(|r| (r.target(), *r.weight()))); - -#[test] -fn test_edges_directed() { - let gr = make_graph::<Directed>(); - let x = n(9); - assert_equal(edges!(gr, x), vec![(x, 16), (x, 14), (n(1), 13)]); - assert_equal(edges!(gr, n(0)), vec![(n(3), 1)]); - assert_equal(edges!(gr, n(4)), vec![]); -} - -#[test] -fn test_edge_references() { - let gr = make_graph::<Directed>(); - assert_eq!(gr.edge_count(), gr.edge_references().count()); -} - -#[test] -fn test_edges_undirected() { - let gr = make_graph::<Undirected>(); - let x = n(9); - assert_equal(edges!(gr, x), vec![(x, 16), (x, 14), (n(1), 13), (n(7), 12)]); - assert_equal(edges!(gr, n(0)), vec![(n(3), 1)]); - assert_equal(edges!(gr, n(4)), vec![]); -} - -#[test] -fn test_edge_iterators_directed() { - let gr = make_graph::<Directed>(); - for i in gr.node_indices() { - itertools::assert_equal( - gr.edges_directed(i, Outgoing), - gr.edges(i)); - } - let mut incoming = vec![Vec::new(); gr.node_bound()]; - - for i in gr.node_indices() { - for j in gr.neighbors(i) { - incoming[j.index()].push(i); - } - } - - println!("{:#?}", gr); - for i in gr.node_indices() { - itertools::assert_equal( - gr.edges_directed(i, Incoming).map(|e| e.source()), - incoming[i.index()].iter().rev().cloned()); - } -} - -#[test] -fn test_edge_iterators_undir() { - let gr = make_graph::<Undirected>(); - for i in gr.node_indices() { - itertools::assert_equal( - gr.edges_directed(i, Outgoing), - gr.edges(i)); - } - for i in gr.node_indices() { - itertools::assert_equal( - gr.edges_directed(i, Incoming), - gr.edges(i)); - } -} - -#[test] -#[should_panic(expected="is not a node")] -fn add_edge_vacant() { - let mut g = StableGraph::<_, _>::new(); - let a = g.add_node(0); - let b = g.add_node(1); - let _ = g.add_node(2); - let _ = g.remove_node(b); - g.add_edge(a, b, 1); -} - -#[test] -#[should_panic(expected="is not a node")] -fn add_edge_oob() { - let mut g = StableGraph::<_, _>::new(); - let a = g.add_node(0); - let _ = g.add_node(1); - let _ = g.add_node(2); - g.add_edge(a, n(4), 1); -} - -#[test] -fn test_node_references() { - let gr = scc_graph(); - - itertools::assert_equal( - gr.node_references().map(|(i, _)| i), - gr.node_indices()); -} - -#[test] -fn iterators_undir() { - let mut g = StableUnGraph::<_, _>::default(); - let a = g.add_node(0); - let b = g.add_node(1); - let c = g.add_node(2); - let d = g.add_node(3); - g.extend_with_edges(&[ - (a, b, 1), - (a, c, 2), - (b, c, 3), - (c, c, 4), - (a, d, 5), - ]); - g.remove_node(b); - - itertools::assert_equal( - g.neighbors(a), - vec![d, c], - ); - itertools::assert_equal( - g.neighbors(c), - vec![c, a], - ); - itertools::assert_equal( - g.neighbors(d), - vec![a], - ); - - // the node that was removed - itertools::assert_equal( - g.neighbors(b), - vec![], - ); - - // remove one more - g.remove_node(c); - itertools::assert_equal( - g.neighbors(c), - vec![], - ); -} - -#[test] -fn dot() { - let mut gr = StableGraph::new(); - let a = gr.add_node("x"); - let b = gr.add_node("y"); - gr.add_edge(a, a, "10"); - gr.add_edge(a, b, "20"); - let dot_output = format!("{}", Dot::new(&gr)); - assert_eq!(dot_output, -r#"digraph { - 0 [label="x"] - 1 [label="y"] - 0 -> 0 [label="10"] - 0 -> 1 [label="20"] -} -"#); -} - -defmac!(iter_eq a, b => a.eq(b)); -defmac!(nodes_eq ref a, ref b => a.node_references().eq(b.node_references())); -defmac!(edgew_eq ref a, ref b => a.edge_references().eq(b.edge_references())); -defmac!(edges_eq ref a, ref b => - iter_eq!( - a.edge_references().map(|e| (e.source(), e.target())), - b.edge_references().map(|e| (e.source(), e.target())))); - -#[test] -fn from() { - let mut gr1 = StableGraph::new(); - let a = gr1.add_node(1); - let b = gr1.add_node(2); - let c = gr1.add_node(3); - gr1.add_edge(a, a, 10); - gr1.add_edge(a, b, 20); - gr1.add_edge(b, c, 30); - gr1.add_edge(a, c, 40); - - let gr2 = Graph::from(gr1.clone()); - let gr3 = StableGraph::from(gr2.clone()); - assert!(nodes_eq!(gr1, gr3)); - assert!(edgew_eq!(gr1, gr3)); - assert!(edges_eq!(gr1, gr3)); - - gr1.remove_node(b); - - let gr4 = Graph::from(gr1.clone()); - let gr5 = StableGraph::from(gr4.clone()); - - let mut ans = StableGraph::new(); - let a = ans.add_node(1); - let c = ans.add_node(3); - ans.add_edge(a, a, 10); - ans.add_edge(a, c, 40); - - assert!(nodes_eq!(gr4, ans)); - assert!(edges_eq!(gr4, ans)); - - assert!(nodes_eq!(gr5, ans)); - assert!(edgew_eq!(gr5, ans)); - assert!(edges_eq!(gr5, ans)); -} diff --git a/vendor/petgraph/tests/unionfind.rs b/vendor/petgraph/tests/unionfind.rs deleted file mode 100644 index f5e2bcfd09..0000000000 --- a/vendor/petgraph/tests/unionfind.rs +++ /dev/null @@ -1,78 +0,0 @@ -extern crate rand; -extern crate petgraph; - -use rand::{Rng, thread_rng, ChaChaRng}; -use std::collections::HashSet; -use petgraph::unionfind::UnionFind; - -#[test] -fn uf_test() { - let n = 8; - let mut u = UnionFind::new(n); - for i in 0..n { - assert_eq!(u.find(i), i); - assert_eq!(u.find_mut(i), i); - assert!(!u.union(i, i)); - } - - u.union(0, 1); - assert_eq!(u.find(0), u.find(1)); - u.union(1, 3); - u.union(1, 4); - u.union(4, 7); - assert_eq!(u.find(0), u.find(3)); - assert_eq!(u.find(1), u.find(3)); - assert!(u.find(0) != u.find(2)); - assert_eq!(u.find(7), u.find(0)); - u.union(5, 6); - assert_eq!(u.find(6), u.find(5)); - assert!(u.find(6) != u.find(7)); - - // check that there are now 3 disjoint sets - let set = (0..n).map(|i| u.find(i)).collect::<HashSet<_>>(); - assert_eq!(set.len(), 3); -} - -#[test] -fn uf_rand() { - let n = 1 << 14; - let mut rng: ChaChaRng = thread_rng().gen(); - let mut u = UnionFind::new(n); - for _ in 0..100 { - let a = rng.gen_range(0, n); - let b = rng.gen_range(0, n); - let ar = u.find(a); - let br = u.find(b); - assert_eq!(ar != br, u.union(a, b)); - } -} - -#[test] -fn uf_u8() { - let n = 256; - let mut rng: ChaChaRng = thread_rng().gen(); - let mut u = UnionFind::<u8>::new(n); - for _ in 0..(n * 8) { - let a = rng.gen(); - let b = rng.gen(); - let ar = u.find(a); - let br = u.find(b); - assert_eq!(ar != br, u.union(a, b)); - } -} - -#[test] -fn labeling() -{ - let mut u = UnionFind::<u32>::new(48); - for i in 0..24 { - u.union(i + 1, i); - } - for i in 25..47 { - u.union(i, i + 1); - } - u.union(23, 25); - u.union(24, 23); - let v = u.into_labeling(); - assert!(v.iter().all(|x| *x == v[0])); -} diff --git a/vendor/petgraph/tests/utils/mod.rs b/vendor/petgraph/tests/utils/mod.rs deleted file mode 100644 index 09de45403c..0000000000 --- a/vendor/petgraph/tests/utils/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ - - -mod qc; - -pub use self::qc::*; diff --git a/vendor/petgraph/tests/utils/qc.rs b/vendor/petgraph/tests/utils/qc.rs deleted file mode 100644 index a03568e310..0000000000 --- a/vendor/petgraph/tests/utils/qc.rs +++ /dev/null @@ -1,26 +0,0 @@ - -use quickcheck::{Arbitrary, Gen, StdGen}; -use std::ops::Deref; - -#[derive(Copy, Clone, Debug)] -/// quickcheck Arbitrary adaptor - half the size of `T` on average -pub struct Small<T>(pub T); - -impl<T> Deref for Small<T> { - type Target = T; - fn deref(&self) -> &T { &self.0 } -} - -impl<T> Arbitrary for Small<T> - where T: Arbitrary -{ - fn arbitrary<G: Gen>(g: &mut G) -> Self { - let sz = g.size() / 2; - Small(T::arbitrary(&mut StdGen::new(g, sz))) - } - - fn shrink(&self) -> Box<Iterator<Item=Self>> { - Box::new((**self).shrink().map(Small)) - } -} - diff --git a/vendor/pkg-config/.cargo-checksum.json b/vendor/pkg-config/.cargo-checksum.json index 539b7c399a..1c4514b259 100644 --- a/vendor/pkg-config/.cargo-checksum.json +++ b/vendor/pkg-config/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"f815043afec3567c3a9acfe5dc4447aea7caa27d34c450962a78bff2a006291f","Cargo.toml":"8da01bb8ffaa01b26e5a4adfee7e2e98fac8500efb9898895ae07aaffd3c80a8","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"14261707d3d887a7fef40e3b11d7361968c1026f5da0b473a9b841e11555f444","src/lib.rs":"940764550a50b8e0bca996c25a989510718f08521a2ce78e3a7bd1a6e56e4c0f","tests/escape.pc":"00caa4136799dbe5bd504239ba90d1156c12def365c8d761da319fe8a83b398e","tests/foo.pc":"f77712847e77ea81ac6362de5861dc0eddf14b9c07dce1853b3e3e587ffcac5e","tests/framework.pc":"304fdb6cea92973650e410ab1f70ce1ebeb7718af3f139e806efbf182acd565c","tests/test.rs":"5b42ed42b960b94b14b735b41b34f1251c4760d84e5fefe1103a93eecae2718f"},"package":"676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c"} \ No newline at end of file +{"files":{"CHANGELOG.md":"bf596de388b5e265a425d7add721853b70a4bd09118e67aa6d8efade7c0c3640","Cargo.toml":"679bfb4cbbd2d81a2292542c5f7b544e5ba3f3fdbf98ed4134929a955b361ff2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"9e5845fc0a7234b8902d97eea371c7964bc5cd60dca5bc0552f81f64f34e867f","src/lib.rs":"3af1d40127d03dbc7b05e28e464437977cf48be8768f03e11be4acbe36c7e37f","tests/escape.pc":"00caa4136799dbe5bd504239ba90d1156c12def365c8d761da319fe8a83b398e","tests/foo.pc":"f77712847e77ea81ac6362de5861dc0eddf14b9c07dce1853b3e3e587ffcac5e","tests/framework.pc":"304fdb6cea92973650e410ab1f70ce1ebeb7718af3f139e806efbf182acd565c","tests/test.rs":"3d51b8a273d365abcf986830e1c0be3aa4b7283739437039bc7633e864497eca"},"package":"05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"} \ No newline at end of file diff --git a/vendor/pkg-config/CHANGELOG.md b/vendor/pkg-config/CHANGELOG.md index 3f56db10d7..12d00729c7 100644 --- a/vendor/pkg-config/CHANGELOG.md +++ b/vendor/pkg-config/CHANGELOG.md @@ -5,6 +5,60 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [0.3.17] - 2019-11-02 + +### Fixed + +- Fix support for multiple version number constraints (#95) + +## [0.3.16] - 2019-09-09 + +### Changed +- Stop using deprecated functions and require Rust 1.30 (#84) + +### Fixed +- Fix repository URL in README.md +- Fix various clippy warnings + +### Added +- Run `cargo fmt` as part of the CI (#89) +- Derive `Clone` for `Library` and `Debug` for `Config (#91) +- Add support for `PKG_CONFIG_ALLOW_SYSTEM_CFLAGS` and enable by default (#93) + +## [0.3.15] - 2019-07-25 + +### Changed +- Changes minimum documented rust version to 1.28 (#76) + +### Fixed +- Fix Travis CI badge url (#78) +- Fix project name in README.md (#81) + +### Added +- Support specifying range of versions (#75) +- Allow cross-compilation if pkg-config is customized (#44, #86) + +## [0.3.14] - 2018-08-28 + +### Fixed +- Don't append .lib suffix on MSVC builds (#72) + +## [0.3.13] - 2018-08-06 + +### Fixed +- Fix MSVC support to actually work and consider library paths too (#71) + +## [0.3.12] - 2018-06-18 + +### Added +- Support for MSVC (#70) +- Document and test Rust 1.13 as minimally supported version (#66) + +## [0.3.11] - 2018-04-24 + +### Fixed +- Re-added AsciiExt import (#65) + ## [0.3.10] - 2018-04-23 ### Added diff --git a/vendor/pkg-config/Cargo.toml b/vendor/pkg-config/Cargo.toml index 78de2ff482..34113b18f4 100644 --- a/vendor/pkg-config/Cargo.toml +++ b/vendor/pkg-config/Cargo.toml @@ -3,7 +3,7 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies +# to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're @@ -12,14 +12,14 @@ [package] name = "pkg-config" -version = "0.3.14" +version = "0.3.17" authors = ["Alex Crichton <alex@alexcrichton.com>"] description = "A library to run the pkg-config system tool at build time in order to be used in\nCargo build scripts.\n" documentation = "https://docs.rs/pkg-config" keywords = ["build-dependencies"] license = "MIT/Apache-2.0" -repository = "https://github.com/alexcrichton/pkg-config-rs" +repository = "https://github.com/rust-lang/pkg-config-rs" [dev-dependencies.lazy_static] version = "1" [badges.travis-ci] -repository = "alexcrichton/pkg-config-rs" +repository = "rust-lang/pkg-config-rs" diff --git a/vendor/pkg-config/README.md b/vendor/pkg-config/README.md index cb9ebd5836..d7a825db51 100644 --- a/vendor/pkg-config/README.md +++ b/vendor/pkg-config/README.md @@ -1,7 +1,7 @@ # pkg-config-rs -[![Build Status](https://travis-ci.org/alexcrichton/pkg-config-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/pkg-config-rs) -[![Rust](https://img.shields.io/badge/rust-1.13%2B-blue.svg?maxAge=3600)](https://github.com/alexcrichton/pkg-config-rs/) +[![Build Status](https://travis-ci.com/rust-lang/pkg-config-rs.svg?branch=master)](https://travis-ci.com/rust-lang/pkg-config-rs) +[![Rust](https://img.shields.io/badge/rust-1.30%2B-blue.svg?maxAge=3600)](https://github.com/rust-lang/pkg-config-rs/) [Documentation](https://docs.rs/pkg-config) @@ -13,7 +13,7 @@ You can use this crate directly to probe for specific libraries, or use [metadeps](https://github.com/joshtriplett/metadeps) to declare all your `pkg-config` dependencies in `Cargo.toml`. -This library requires Rust 1.13+. +This library requires Rust 1.30+. # Example @@ -69,5 +69,5 @@ at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in Serde by you, as defined in the Apache-2.0 license, shall be +for inclusion in pkg-config-rs by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. diff --git a/vendor/pkg-config/src/lib.rs b/vendor/pkg-config/src/lib.rs index 88dd310082..0c78c0d418 100644 --- a/vendor/pkg-config/src/lib.rs +++ b/vendor/pkg-config/src/lib.rs @@ -63,38 +63,30 @@ #![doc(html_root_url = "https://docs.rs/pkg-config/0.3")] -#[allow(unused_imports)] // Required for Rust <1.23 -use std::ascii::AsciiExt; use std::collections::HashMap; use std::env; use std::error; use std::ffi::{OsStr, OsString}; use std::fmt; use std::io; -use std::path::{PathBuf, Path}; +use std::ops::{Bound, RangeBounds}; +use std::path::{Path, PathBuf}; use std::process::{Command, Output}; use std::str; -pub fn target_supported() -> bool { - let target = env::var("TARGET").unwrap_or_else(|_| String::new()); - let host = env::var("HOST").unwrap_or_else(|_| String::new()); - - // Only use pkg-config in host == target situations by default (allowing an - // override). - (host == target || env::var_os("PKG_CONFIG_ALLOW_CROSS").is_some()) -} - -#[derive(Clone, Default)] +#[derive(Clone, Debug)] pub struct Config { statik: Option<bool>, - atleast_version: Option<String>, + min_version: Bound<String>, + max_version: Bound<String>, extra_args: Vec<OsString>, cargo_metadata: bool, env_metadata: bool, print_system_libs: bool, + print_system_cflags: bool, } -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct Library { pub libs: Vec<String>, pub link_paths: Vec<PathBuf>, @@ -107,6 +99,7 @@ pub struct Library { } /// Represents all reasons `pkg-config` might not succeed or be run at all. +#[derive(Debug)] pub enum Error { /// Aborted because of `*_NO_PKG_CONFIG` environment variable. /// @@ -147,7 +140,7 @@ impl error::Error for Error { } } - fn cause(&self) -> Option<&error::Error> { + fn cause(&self) -> Option<&dyn error::Error> { match *self { Error::Command { ref cause, .. } => Some(cause), _ => None, @@ -155,76 +148,30 @@ impl error::Error for Error { } } -// Workaround for temporary lack of impl Debug for Output in stable std -struct OutputDebugger<'a>(&'a Output); - -// Lifted from 1.7 std -impl<'a> fmt::Debug for OutputDebugger<'a> { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - let stdout_utf8 = str::from_utf8(&self.0.stdout); - let stdout_debug: &fmt::Debug = match stdout_utf8 { - Ok(ref str) => str, - Err(_) => &self.0.stdout - }; - - let stderr_utf8 = str::from_utf8(&self.0.stderr); - let stderr_debug: &fmt::Debug = match stderr_utf8 { - Ok(ref str) => str, - Err(_) => &self.0.stderr - }; - - fmt.debug_struct("Output") - .field("status", &self.0.status) - .field("stdout", stdout_debug) - .field("stderr", stderr_debug) - .finish() - } -} - -// Workaround for temporary lack of impl Debug for Output in stable std, continued -impl fmt::Debug for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - match *self { - Error::EnvNoPkgConfig(ref name) => { - f.debug_tuple("EnvNoPkgConfig") - .field(name) - .finish() - } - Error::CrossCompilation => write!(f, "CrossCompilation"), - Error::Command { ref command, ref cause } => { - f.debug_struct("Command") - .field("command", command) - .field("cause", cause) - .finish() - } - Error::Failure { ref command, ref output } => { - f.debug_struct("Failure") - .field("command", command) - .field("output", &OutputDebugger(output)) - .finish() - } - Error::__Nonexhaustive => panic!(), - } - } -} - impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { match *self { - Error::EnvNoPkgConfig(ref name) => { - write!(f, "Aborted because {} is set", name) - } - Error::CrossCompilation => { - write!(f, "Cross compilation detected. \ - Use PKG_CONFIG_ALLOW_CROSS=1 to override") - } - Error::Command { ref command, ref cause } => { - write!(f, "Failed to run `{}`: {}", command, cause) - } - Error::Failure { ref command, ref output } => { + Error::EnvNoPkgConfig(ref name) => write!(f, "Aborted because {} is set", name), + Error::CrossCompilation => write!( + f, + "Cross compilation detected. \ + Use PKG_CONFIG_ALLOW_CROSS=1 to override" + ), + Error::Command { + ref command, + ref cause, + } => write!(f, "Failed to run `{}`: {}", command, cause), + Error::Failure { + ref command, + ref output, + } => { let stdout = str::from_utf8(&output.stdout).unwrap(); let stderr = str::from_utf8(&output.stderr).unwrap(); - write!(f, "`{}` did not exit successfully: {}", command, output.status)?; + write!( + f, + "`{}` did not exit successfully: {}", + command, output.status + )?; if !stdout.is_empty() { write!(f, "\n--- stdout\n{}", stdout)?; } @@ -255,7 +202,7 @@ pub fn get_variable(package: &str, variable: &str) -> Result<String, Error> { let arg = format!("--variable={}", variable); let cfg = Config::new(); let out = run(cfg.command(package, &[&arg]))?; - Ok(str::from_utf8(&out).unwrap().trim_right().to_owned()) + Ok(str::from_utf8(&out).unwrap().trim_end().to_owned()) } impl Config { @@ -264,8 +211,10 @@ impl Config { pub fn new() -> Config { Config { statik: None, - atleast_version: None, + min_version: Bound::Unbounded, + max_version: Bound::Unbounded, extra_args: vec![], + print_system_cflags: true, print_system_libs: true, cargo_metadata: true, env_metadata: false, @@ -283,7 +232,33 @@ impl Config { /// Indicate that the library must be at least version `vers`. pub fn atleast_version(&mut self, vers: &str) -> &mut Config { - self.atleast_version = Some(vers.to_string()); + self.min_version = Bound::Included(vers.to_string()); + self.max_version = Bound::Unbounded; + self + } + + /// Indicate that the library must be equal to version `vers`. + pub fn exactly_version(&mut self, vers: &str) -> &mut Config { + self.min_version = Bound::Included(vers.to_string()); + self.max_version = Bound::Included(vers.to_string()); + self + } + + /// Indicate that the library's version must be in `range`. + pub fn range_version<'a, R>(&mut self, range: R) -> &mut Config + where + R: RangeBounds<&'a str>, + { + self.min_version = match range.start_bound() { + Bound::Included(vers) => Bound::Included(vers.to_string()), + Bound::Excluded(vers) => Bound::Excluded(vers.to_string()), + Bound::Unbounded => Bound::Unbounded, + }; + self.max_version = match range.end_bound() { + Bound::Included(vers) => Bound::Included(vers.to_string()), + Bound::Excluded(vers) => Bound::Excluded(vers.to_string()), + Bound::Unbounded => Bound::Unbounded, + }; self } @@ -319,6 +294,15 @@ impl Config { self } + /// Enable or disable the `PKG_CONFIG_ALLOW_SYSTEM_CFLAGS` environment + /// variable. + /// + /// This env var is enabled by default. + pub fn print_system_cflags(&mut self, print: bool) -> &mut Config { + self.print_system_cflags = print; + self + } + /// Deprecated in favor fo the `probe` function #[doc(hidden)] pub fn find(&self, name: &str) -> Result<Library, String> { @@ -332,8 +316,8 @@ impl Config { pub fn probe(&self, name: &str) -> Result<Library, Error> { let abort_var_name = format!("{}_NO_PKG_CONFIG", envify(name)); if self.env_var_os(&abort_var_name).is_some() { - return Err(Error::EnvNoPkgConfig(abort_var_name)) - } else if !target_supported() { + return Err(Error::EnvNoPkgConfig(abort_var_name)); + } else if !self.target_supported() { return Err(Error::CrossCompilation); } @@ -348,6 +332,31 @@ impl Config { Ok(library) } + pub fn target_supported(&self) -> bool { + let target = env::var("TARGET").unwrap_or_default(); + let host = env::var("HOST").unwrap_or_default(); + + // Only use pkg-config in host == target situations by default (allowing an + // override). + if host == target { + return true; + } + + // pkg-config may not be aware of cross-compilation, and require + // a wrapper script that sets up platform-specific prefixes. + match self.targetted_env_var("PKG_CONFIG_ALLOW_CROSS") { + // don't use pkg-config if explicitly disabled + Ok(ref val) if val == "0" => false, + Ok(_) => true, + Err(_) => { + // if not disabled, and pkg-config is customized, + // then assume it's prepared for cross-compilation + self.targetted_env_var("PKG_CONFIG").is_ok() + || self.targetted_env_var("PKG_CONFIG_SYSROOT_DIR").is_ok() + } + } + } + /// Deprecated in favor of the top level `get_variable` function #[doc(hidden)] pub fn get_variable(package: &str, variable: &str) -> Result<String, String> { @@ -388,13 +397,14 @@ impl Config { } fn command(&self, name: &str, args: &[&str]) -> Command { - let exe = self.env_var("PKG_CONFIG").unwrap_or_else(|_| String::from("pkg-config")); + let exe = self + .env_var("PKG_CONFIG") + .unwrap_or_else(|_| String::from("pkg-config")); let mut cmd = Command::new(exe); if self.is_static(name) { cmd.arg("--static"); } - cmd.args(args) - .args(&self.extra_args); + cmd.args(args).args(&self.extra_args); if let Ok(value) = self.targetted_env_var("PKG_CONFIG_PATH") { cmd.env("PKG_CONFIG_PATH", value); @@ -408,10 +418,27 @@ impl Config { if self.print_system_libs { cmd.env("PKG_CONFIG_ALLOW_SYSTEM_LIBS", "1"); } - if let Some(ref version) = self.atleast_version { - cmd.arg(&format!("{} >= {}", name, version)); - } else { - cmd.arg(name); + if self.print_system_cflags { + cmd.env("PKG_CONFIG_ALLOW_SYSTEM_CFLAGS", "1"); + } + cmd.arg(name); + match self.min_version { + Bound::Included(ref version) => { + cmd.arg(&format!("{} >= {}", name, version)); + } + Bound::Excluded(ref version) => { + cmd.arg(&format!("{} > {}", name, version)); + } + _ => (), + } + match self.max_version { + Bound::Included(ref version) => { + cmd.arg(&format!("{} <= {}", name, version)); + } + Bound::Excluded(ref version) => { + cmd.arg(&format!("{} < {}", name, version)); + } + _ => (), } cmd } @@ -438,6 +465,22 @@ impl Config { } } +// Implement Default manualy since Bound does not implement Default. +impl Default for Config { + fn default() -> Config { + Config { + statik: None, + min_version: Bound::Unbounded, + max_version: Bound::Unbounded, + extra_args: vec![], + print_system_cflags: false, + print_system_libs: false, + cargo_metadata: false, + env_metadata: false, + } + } +} + impl Library { fn new() -> Library { Library { @@ -461,10 +504,11 @@ impl Library { } let words = split_flags(output); - let parts = words.iter() - .filter(|l| l.len() > 2) - .map(|arg| (&arg[0..2], &arg[2..])) - .collect::<Vec<_>>(); + let parts = words + .iter() + .filter(|l| l.len() > 2) + .map(|arg| (&arg[0..2], &arg[2..])) + .collect::<Vec<_>>(); let mut dirs = Vec::new(); let statik = config.is_static(name); @@ -501,22 +545,26 @@ impl Library { self.libs.push(val.to_string()); } "-D" => { - let mut iter = val.split("="); - self.defines.insert(iter.next().unwrap().to_owned(), iter.next().map(|s| s.to_owned())); + let mut iter = val.split('='); + self.defines.insert( + iter.next().unwrap().to_owned(), + iter.next().map(|s| s.to_owned()), + ); } _ => {} } } - let mut iter = words.iter() - .flat_map(|arg| if arg.starts_with("-Wl,") { - arg[4..].split(',').collect() - } else { - vec![arg.as_ref()] - }); + let mut iter = words.iter().flat_map(|arg| { + if arg.starts_with("-Wl,") { + arg[4..].split(',').collect() + } else { + vec![arg.as_ref()] + } + }); while let Some(part) = iter.next() { if part != "-framework" { - continue + continue; } if let Some(lib) = iter.next() { let meta = format!("rustc-link-lib=framework={}", lib); @@ -527,14 +575,15 @@ impl Library { } fn parse_modversion(&mut self, output: &str) { - self.version.push_str(output.trim()); + self.version.push_str(output.lines().nth(0).unwrap().trim()); } } fn envify(name: &str) -> String { - name.chars().map(|c| c.to_ascii_uppercase()).map(|c| { - if c == '-' {'_'} else {c} - }).collect() + name.chars() + .map(|c| c.to_ascii_uppercase()) + .map(|c| if c == '-' { '_' } else { c }) + .collect() } /// System libraries should only be linked dynamically @@ -547,8 +596,7 @@ fn is_static_available(name: &str, dirs: &[PathBuf]) -> bool { }; dirs.iter().any(|dir| { - !system_roots.iter().any(|sys| dir.starts_with(sys)) && - dir.join(&libname).exists() + !system_roots.iter().any(|sys| dir.starts_with(sys)) && dir.join(&libname).exists() }) } @@ -560,13 +608,13 @@ fn run(mut cmd: Command) -> Result<Vec<u8>, Error> { } else { Err(Error::Failure { command: format!("{:?}", cmd), - output: output, + output, }) } } Err(cause) => Err(Error::Command { command: format!("{:?}", cmd), - cause: cause, + cause, }), } } @@ -589,9 +637,7 @@ fn split_flags(output: &[u8]) -> Vec<String> { escaped = false; word.push(b); } - b'\\' => { - escaped = true - } + b'\\' => escaped = true, b'\t' | b'\n' | b'\r' | b' ' => { if !word.is_empty() { words.push(String::from_utf8(word).unwrap()); @@ -612,19 +658,44 @@ fn split_flags(output: &[u8]) -> Vec<String> { #[test] #[cfg(target_os = "macos")] fn system_library_mac_test() { - assert!(!is_static_available("PluginManager", &[PathBuf::from("/Library/Frameworks")])); - assert!(!is_static_available("python2.7", &[PathBuf::from("/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config")])); - assert!(!is_static_available("ffi_convenience", &[PathBuf::from("/Library/Ruby/Gems/2.0.0/gems/ffi-1.9.10/ext/ffi_c/libffi-x86_64/.libs")])); + assert!(!is_static_available( + "PluginManager", + &[PathBuf::from("/Library/Frameworks")] + )); + assert!(!is_static_available( + "python2.7", + &[PathBuf::from( + "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config" + )] + )); + assert!(!is_static_available( + "ffi_convenience", + &[PathBuf::from( + "/Library/Ruby/Gems/2.0.0/gems/ffi-1.9.10/ext/ffi_c/libffi-x86_64/.libs" + )] + )); // Homebrew is in /usr/local, and it's not a part of the OS if Path::new("/usr/local/lib/libpng16.a").exists() { - assert!(is_static_available("png16", &[PathBuf::from("/usr/local/lib")])); + assert!(is_static_available( + "png16", + &[PathBuf::from("/usr/local/lib")] + )); + + let libpng = Config::new() + .range_version("1".."99") + .probe("libpng16") + .unwrap(); + assert!(libpng.version.find('\n').is_none()); } } #[test] #[cfg(target_os = "linux")] fn system_library_linux_test() { - assert!(!is_static_available("util", &[PathBuf::from("/usr/lib/x86_64-linux-gnu")])); + assert!(!is_static_available( + "util", + &[PathBuf::from("/usr/lib/x86_64-linux-gnu")] + )); assert!(!is_static_available("dialog", &[PathBuf::from("/usr/lib")])); } diff --git a/vendor/pkg-config/tests/test.rs b/vendor/pkg-config/tests/test.rs index fad0fcfdf0..33a623c29a 100644 --- a/vendor/pkg-config/tests/test.rs +++ b/vendor/pkg-config/tests/test.rs @@ -4,8 +4,8 @@ extern crate lazy_static; use pkg_config::Error; use std::env; -use std::sync::Mutex; use std::path::PathBuf; +use std::sync::Mutex; lazy_static! { static ref LOCK: Mutex<()> = Mutex::new(()); @@ -13,16 +13,21 @@ lazy_static! { fn reset() { for (k, _) in env::vars() { - if k.contains("DYNAMIC") || - k.contains("STATIC") || - k.contains("PKG_CONFIG_ALLOW_CROSS") || - k.contains("FOO_NO_PKG_CONFIG") { + if k.contains("DYNAMIC") + || k.contains("STATIC") + || k.contains("PKG_CONFIG_ALLOW_CROSS") + || k.contains("PKG_CONFIG_SYSROOT_DIR") + || k.contains("FOO_NO_PKG_CONFIG") + { env::remove_var(&k); } } env::remove_var("TARGET"); env::remove_var("HOST"); - env::set_var("PKG_CONFIG_PATH", &env::current_dir().unwrap().join("tests")); + env::set_var( + "PKG_CONFIG_PATH", + &env::current_dir().unwrap().join("tests"), + ); } fn find(name: &str) -> Result<pkg_config::Library, Error> { @@ -36,7 +41,7 @@ fn cross_disabled() { env::set_var("TARGET", "foo"); env::set_var("HOST", "bar"); match find("foo") { - Err(Error::CrossCompilation) => {}, + Err(Error::CrossCompilation) => {} x => panic!("Error::CrossCompilation expected, found `{:?}`", x), } } @@ -51,15 +56,37 @@ fn cross_enabled() { find("foo").unwrap(); } +#[test] +fn cross_enabled_if_customized() { + let _g = LOCK.lock(); + reset(); + env::set_var("TARGET", "foo"); + env::set_var("HOST", "bar"); + env::set_var("PKG_CONFIG_SYSROOT_DIR", "/tmp/cross-test"); + find("foo").unwrap(); +} + +#[test] +fn cross_disabled_if_customized() { + let _g = LOCK.lock(); + reset(); + env::set_var("TARGET", "foo"); + env::set_var("HOST", "bar"); + env::set_var("PKG_CONFIG_ALLOW_CROSS", "0"); + env::set_var("PKG_CONFIG_SYSROOT_DIR", "/tmp/cross-test"); + match find("foo") { + Err(Error::CrossCompilation) => {} + _ => panic!("expected CrossCompilation failure"), + } +} + #[test] fn package_disabled() { let _g = LOCK.lock(); reset(); env::set_var("FOO_NO_PKG_CONFIG", "1"); match find("foo") { - Err(Error::EnvNoPkgConfig(name)) => { - assert_eq!(name, "FOO_NO_PKG_CONFIG") - } + Err(Error::EnvNoPkgConfig(name)) => assert_eq!(name, "FOO_NO_PKG_CONFIG"), x => panic!("Error::EnvNoPkgConfig expected, found `{:?}`", x), } } @@ -79,14 +106,21 @@ fn escapes() { let _g = LOCK.lock(); reset(); let lib = find("escape").unwrap(); - assert!(lib.include_paths.contains(&PathBuf::from("include path with spaces"))); - assert!(lib.link_paths.contains(&PathBuf::from("link path with spaces"))); - assert_eq!(lib.defines.get("A"), - Some(&Some("\"escaped string' literal\"".to_owned()))); - assert_eq!(lib.defines.get("B"), - Some(&Some("ESCAPED IDENTIFIER".to_owned()))); - assert_eq!(lib.defines.get("FOX"), - Some(&Some("🦊".to_owned()))); + assert!(lib + .include_paths + .contains(&PathBuf::from("include path with spaces"))); + assert!(lib + .link_paths + .contains(&PathBuf::from("link path with spaces"))); + assert_eq!( + lib.defines.get("A"), + Some(&Some("\"escaped string' literal\"".to_owned())) + ); + assert_eq!( + lib.defines.get("B"), + Some(&Some("ESCAPED IDENTIFIER".to_owned())) + ); + assert_eq!(lib.defines.get("FOX"), Some(&Some("🦊".to_owned()))); } #[test] @@ -116,3 +150,160 @@ fn version() { reset(); assert_eq!(&find("foo").unwrap().version[..], "3.10.0.SVN"); } + +#[test] +fn atleast_version_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .atleast_version("3.10") + .probe("foo") + .unwrap(); +} + +#[test] +#[should_panic] +fn atleast_version_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .atleast_version("3.11") + .probe("foo") + .unwrap(); +} + +#[test] +fn exactly_version_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .exactly_version("3.10.0.SVN") + .probe("foo") + .unwrap(); +} + +#[test] +#[should_panic] +fn exactly_version_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .exactly_version("3.10.0") + .probe("foo") + .unwrap(); +} + +#[test] +fn range_version_range_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version("4.2.0".."4.4.0") + .probe("escape") + .unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version("4.0.0".."4.2.0") + .probe("escape") + .unwrap(); +} + +#[test] +fn range_version_range_inclusive_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version("4.0.0"..="4.2.0") + .probe("escape") + .unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_inclusive_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version("3.8.0"..="4.0.0") + .probe("escape") + .unwrap(); +} + +#[test] +fn range_version_range_from_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version("4.0.0"..) + .probe("escape") + .unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_from_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version("4.4.0"..) + .probe("escape") + .unwrap(); +} + +#[test] +fn range_version_range_to_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version(.."4.4.0") + .probe("escape") + .unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_to_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version(.."4.2.0") + .probe("escape") + .unwrap(); +} + +#[test] +fn range_version_range_to_inclusive_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version(..="4.2.0") + .probe("escape") + .unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_to_inclusive_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version(..="4.0.0") + .probe("escape") + .unwrap(); +} + +#[test] +fn range_version_full() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new() + .range_version(..) + .probe("escape") + .unwrap(); +} diff --git a/vendor/ppv-lite86/.cargo-checksum.json b/vendor/ppv-lite86/.cargo-checksum.json index e63cbcdcd3..784cd4e54d 100644 --- a/vendor/ppv-lite86/.cargo-checksum.json +++ b/vendor/ppv-lite86/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"735c1259d324caa9f651006f79ae43c8da6fbac882fd42bdb567044117351ba1","LICENSE-APACHE":"0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a","LICENSE-MIT":"4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f","src/generic.rs":"6c19b3062aec77a92130be1ce55c90aeca0811bcb19951c25a50c8fbe89a26d0","src/lib.rs":"75beb27d89dcc7541c8e81ad1f4bec81908d8d5fa0e3adec47cb1a1f008dfd32","src/soft.rs":"6fb8aa428183ec09d63d45761507d8da6dffc45990f2d1fcfd387c4c856599cc","src/types.rs":"4890069359ed53575a6b9a8168037ccdd4b029c8d61d540e9770fe3c90359345","src/x86_64/mod.rs":"6f4bf220254c3d9892e86170648fbd10fdaafb86e33c6e17e471abf2c6502cdf","src/x86_64/sse2.rs":"da72424e9e3fabd6236d4de80edb1448dc0bac02797df8e15298d412cdaef10c"},"package":"e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b"} \ No newline at end of file +{"files":{"Cargo.toml":"3cf6fa0e4089c12be1d19ac9082aabed68d3f193dbd5024379c22a8a4db15abe","LICENSE-APACHE":"0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a","LICENSE-MIT":"4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f","src/generic.rs":"6c19b3062aec77a92130be1ce55c90aeca0811bcb19951c25a50c8fbe89a26d0","src/lib.rs":"75beb27d89dcc7541c8e81ad1f4bec81908d8d5fa0e3adec47cb1a1f008dfd32","src/soft.rs":"6fb8aa428183ec09d63d45761507d8da6dffc45990f2d1fcfd387c4c856599cc","src/types.rs":"4890069359ed53575a6b9a8168037ccdd4b029c8d61d540e9770fe3c90359345","src/x86_64/mod.rs":"e95910e8c9d23c212055598a437bfcdfaebf4f12e03a04e75f961bc3e9e257a1","src/x86_64/sse2.rs":"da72424e9e3fabd6236d4de80edb1448dc0bac02797df8e15298d412cdaef10c"},"package":"74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"} \ No newline at end of file diff --git a/vendor/ppv-lite86/Cargo.toml b/vendor/ppv-lite86/Cargo.toml index f42b47b8d4..012a7f4d75 100644 --- a/vendor/ppv-lite86/Cargo.toml +++ b/vendor/ppv-lite86/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "ppv-lite86" -version = "0.2.5" +version = "0.2.6" authors = ["The CryptoCorrosion Contributors"] description = "Implementation of the crypto-simd API for x86" keywords = ["crypto", "simd", "x86"] diff --git a/vendor/ppv-lite86/src/x86_64/mod.rs b/vendor/ppv-lite86/src/x86_64/mod.rs index cf8b2248ba..39d3b90064 100644 --- a/vendor/ppv-lite86/src/x86_64/mod.rs +++ b/vendor/ppv-lite86/src/x86_64/mod.rs @@ -1,7 +1,7 @@ // crate minimums: sse2, x86_64 -use crate::types::*; use core::arch::x86_64::{__m128i, __m256i}; +use crate::types::*; mod sse2; @@ -222,59 +222,52 @@ impl_into!(vec512_storage, [u128; 4], u128x4); macro_rules! dispatch { ($mach:ident, $MTy:ident, { $([$pub:tt$(($krate:tt))*])* fn $name:ident($($arg:ident: $argty:ty),* $(,)*) -> $ret:ty $body:block }) => { #[cfg(feature = "std")] - #[inline(always)] $($pub$(($krate))*)* fn $name($($arg: $argty),*) -> $ret { #[inline(always)] fn fn_impl<$MTy: $crate::Machine>($mach: $MTy, $($arg: $argty),*) -> $ret $body - type FnTy = unsafe fn($($arg: $argty),*) -> $ret; - lazy_static! { - static ref IMPL: FnTy = { dispatch_init() }; + use std::arch::x86_64::*; + #[target_feature(enable = "avx2")] + unsafe fn impl_avx2($($arg: $argty),*) -> $ret { + let ret = fn_impl($crate::x86_64::AVX2::instance(), $($arg),*); + _mm256_zeroupper(); + ret + } + #[target_feature(enable = "avx")] + #[target_feature(enable = "sse4.1")] + #[target_feature(enable = "ssse3")] + unsafe fn impl_avx($($arg: $argty),*) -> $ret { + let ret = fn_impl($crate::x86_64::AVX::instance(), $($arg),*); + _mm256_zeroupper(); + ret } - #[cold] - fn dispatch_init() -> FnTy { - use std::arch::x86_64::*; + #[target_feature(enable = "sse4.1")] + #[target_feature(enable = "ssse3")] + unsafe fn impl_sse41($($arg: $argty),*) -> $ret { + fn_impl($crate::x86_64::SSE41::instance(), $($arg),*) + } + #[target_feature(enable = "ssse3")] + unsafe fn impl_ssse3($($arg: $argty),*) -> $ret { + fn_impl($crate::x86_64::SSSE3::instance(), $($arg),*) + } + #[target_feature(enable = "sse2")] + unsafe fn impl_sse2($($arg: $argty),*) -> $ret { + fn_impl($crate::x86_64::SSE2::instance(), $($arg),*) + } + unsafe { if is_x86_feature_detected!("avx2") { - #[target_feature(enable = "avx2")] - unsafe fn impl_avx2($($arg: $argty),*) -> $ret { - let ret = fn_impl($crate::x86_64::AVX2::instance(), $($arg),*); - _mm256_zeroupper(); - ret - } - impl_avx2 + impl_avx2($($arg),*) } else if is_x86_feature_detected!("avx") { - #[target_feature(enable = "avx")] - #[target_feature(enable = "sse4.1")] - #[target_feature(enable = "ssse3")] - unsafe fn impl_avx($($arg: $argty),*) -> $ret { - let ret = fn_impl($crate::x86_64::AVX::instance(), $($arg),*); - _mm256_zeroupper(); - ret - } - impl_avx + impl_avx($($arg),*) } else if is_x86_feature_detected!("sse4.1") { - #[target_feature(enable = "sse4.1")] - #[target_feature(enable = "ssse3")] - unsafe fn impl_sse41($($arg: $argty),*) -> $ret { - fn_impl($crate::x86_64::SSE41::instance(), $($arg),*) - } - impl_sse41 + impl_sse41($($arg),*) } else if is_x86_feature_detected!("ssse3") { - #[target_feature(enable = "ssse3")] - unsafe fn impl_ssse3($($arg: $argty),*) -> $ret { - fn_impl($crate::x86_64::SSSE3::instance(), $($arg),*) - } - impl_ssse3 + impl_ssse3($($arg),*) } else if is_x86_feature_detected!("sse2") { - #[target_feature(enable = "sse2")] - unsafe fn impl_sse2($($arg: $argty),*) -> $ret { - fn_impl($crate::x86_64::SSE2::instance(), $($arg),*) - } - impl_sse2 + impl_sse2($($arg),*) } else { unimplemented!() } } - unsafe { IMPL($($arg),*) } } #[cfg(not(feature = "std"))] #[inline(always)] @@ -312,34 +305,27 @@ macro_rules! dispatch { macro_rules! dispatch_light128 { ($mach:ident, $MTy:ident, { $([$pub:tt$(($krate:tt))*])* fn $name:ident($($arg:ident: $argty:ty),* $(,)*) -> $ret:ty $body:block }) => { #[cfg(feature = "std")] - #[inline(always)] $($pub $(($krate))*)* fn $name($($arg: $argty),*) -> $ret { #[inline(always)] fn fn_impl<$MTy: $crate::Machine>($mach: $MTy, $($arg: $argty),*) -> $ret $body - type FnTy = unsafe fn($($arg: $argty),*) -> $ret; - lazy_static! { - static ref IMPL: FnTy = { dispatch_init() }; + use std::arch::x86_64::*; + #[target_feature(enable = "avx")] + unsafe fn impl_avx($($arg: $argty),*) -> $ret { + fn_impl($crate::x86_64::AVX::instance(), $($arg),*) + } + #[target_feature(enable = "sse2")] + unsafe fn impl_sse2($($arg: $argty),*) -> $ret { + fn_impl($crate::x86_64::SSE2::instance(), $($arg),*) } - #[cold] - fn dispatch_init() -> FnTy { - use std::arch::x86_64::*; + unsafe { if is_x86_feature_detected!("avx") { - #[target_feature(enable = "avx")] - unsafe fn impl_avx($($arg: $argty),*) -> $ret { - fn_impl($crate::x86_64::AVX::instance(), $($arg),*) - } - impl_avx + impl_avx($($arg),*) } else if is_x86_feature_detected!("sse2") { - #[target_feature(enable = "sse2")] - unsafe fn impl_sse2($($arg: $argty),*) -> $ret { - fn_impl($crate::x86_64::SSE2::instance(), $($arg),*) - } - impl_sse2 + impl_sse2($($arg),*) } else { unimplemented!() } } - unsafe { IMPL($($arg),*) } } #[cfg(not(feature = "std"))] #[inline(always)] @@ -377,34 +363,27 @@ macro_rules! dispatch_light128 { macro_rules! dispatch_light256 { ($mach:ident, $MTy:ident, { $([$pub:tt$(($krate:tt))*])* fn $name:ident($($arg:ident: $argty:ty),* $(,)*) -> $ret:ty $body:block }) => { #[cfg(feature = "std")] - #[inline(always)] $([$pub $(($krate))*])* fn $name($($arg: $argty),*) -> $ret { #[inline(always)] fn fn_impl<$MTy: $crate::Machine>($mach: $MTy, $($arg: $argty),*) -> $ret $body - type FnTy = unsafe fn($($arg: $argty),*) -> $ret; - lazy_static! { - static ref IMPL: FnTy = { dispatch_init() }; + use std::arch::x86_64::*; + #[target_feature(enable = "avx")] + unsafe fn impl_avx($($arg: $argty),*) -> $ret { + fn_impl($crate::x86_64::AVX::instance(), $($arg),*) } - #[cold] - fn dispatch_init() -> FnTy { - use std::arch::x86_64::*; + #[target_feature(enable = "sse2")] + unsafe fn impl_sse2($($arg: $argty),*) -> $ret { + fn_impl($crate::x86_64::SSE2::instance(), $($arg),*) + } + unsafe { if is_x86_feature_detected!("avx") { - #[target_feature(enable = "avx")] - unsafe fn impl_avx($($arg: $argty),*) -> $ret { - fn_impl($crate::x86_64::AVX::instance(), $($arg),*) - } - impl_avx + impl_avx($($arg),*) } else if is_x86_feature_detected!("sse2") { - #[target_feature(enable = "sse2")] - unsafe fn impl_sse2($($arg: $argty),*) -> $ret { - fn_impl($crate::x86_64::SSE2::instance(), $($arg),*) - } - impl_sse2 + impl_sse2($($arg),*) } else { unimplemented!() } } - unsafe { IMPL($($arg),*) } } #[cfg(not(feature = "std"))] #[inline(always)] @@ -426,7 +405,7 @@ macro_rules! dispatch_light256 { } }; ($mach:ident, $MTy:ident, { $([$pub:tt$(($krate:tt))*])* fn $name:ident($($arg:ident: $argty:ty),* $(,)*) $body:block }) => { - dispatch_light128!($mach, $MTy, { + dispatch_light256!($mach, $MTy, { $([$pub $(($krate))*])* fn $name($($arg: $argty),*) -> () $body }); } diff --git a/vendor/rand/.cargo-checksum.json b/vendor/rand/.cargo-checksum.json index 75b8cfcecd..2caa32ef09 100644 --- a/vendor/rand/.cargo-checksum.json +++ b/vendor/rand/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"267edffb6a11c05bd68359e25787a41dd5c714eeac81f8e9c26e9b26ec9123b3","COPYRIGHT":"90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5","Cargo.toml":"59999f74d99360d2170f23ecfa87cdd442e450242dcaaf3e4b37de5e78fb6297","LICENSE-APACHE":"aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf","LICENSE-MIT":"209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b","README.md":"e1e708de430a890a48fdd342cbee98b7911870522a100ccaf435c96ac306e589","benches/generators.rs":"f431e5c618b5d7ceedb4720d0b0f0d20b73a4f895129e01bc24a47461b158116","benches/misc.rs":"ef3180a16c469cfcda2cf5146d8ea0e77552316f9e0ad0de4690cf492d725dfe","benches/seq.rs":"dea8cfb68e944acdd488fe464fbb68298f07bb972f55d0a963c775b5b253eb57","examples/monte-carlo.rs":"5c01a47885a31445e78fab076f8328a7732bca41d84e0d4ba5670b80ca7a883f","examples/monty-hall.rs":"437d5150e8375f64e24d6bac63b5385114196698d5457c8a1b4f50defa427a37","rustfmt.toml":"f0f95df871dbc3b5e6619a6a652746ff50d6185e4d5198fc9b70de703047c660","src/distributions/bernoulli.rs":"1f009bdf335ab097e1ed09d2c3ce9db15d2ed4470935142e84952d9c8dad7dd9","src/distributions/binomial.rs":"b001fb614138593cd9e2c53d722adb389aa729ef3406e08cd18ba211e06286b7","src/distributions/cauchy.rs":"307c06a1555d72b408563f8ed57745741d05466064e8dd7d5ca25a57c2767177","src/distributions/dirichlet.rs":"5795c0529ed62856fcc30acfac9e5770c5434c0812bd1229717c2cb6169042cb","src/distributions/exponential.rs":"1a56996d982524373d88ed008a48e7fc9ada1d62b17bed706637739962d9a42f","src/distributions/float.rs":"2ac5ccf15414225beb29f61b1b84cd57eb8ba9fb545d5539c3281f6f5cbbb8f1","src/distributions/gamma.rs":"7853b91e322ad6dda2ecc944e5291e46524c32955d8e93d15eb22e68ecbadf55","src/distributions/integer.rs":"3a69f3055d8980a23b40c465fa268797103cc101ee751924cdf720d89f53ab5f","src/distributions/mod.rs":"7a338580eb29180c75017035bb134e529248d11eb0da4a342849a37ab20ed274","src/distributions/normal.rs":"afd5dfafc1ab4c6905ff823e5ece0a808731108c67bd9f7435454e1962018bba","src/distributions/other.rs":"3d4279aa021cce196166fb31c12a0c7c0e957b3db5b24a9346e141cc196e8397","src/distributions/pareto.rs":"3d8f9467daa0c6a831da90e14cf2600352da32a37c5483858ae718f4c888c936","src/distributions/poisson.rs":"b6d848616f07cc6387a69fe1e8fcb7718fc25e7c7c5db27fb7356e29446346f1","src/distributions/triangular.rs":"0b1584f874eeef21b55189c072e3ba6003014a9507f461a0ae0a3e9a95a6a536","src/distributions/uniform.rs":"3f5548c0c80b5a29a73fe07d1195429ad335f9750616c0070df7a12c433d8a4d","src/distributions/unit_circle.rs":"4e90c0dbb31d68aa1b9f21f3877875489137092d7cfea2e477417cb4627e8081","src/distributions/unit_sphere.rs":"0ca0250c23765368b0e2ef71b546bcb4955d149c10b2441b9fc5a05df23129fb","src/distributions/utils.rs":"9707792bac7d68478bf602af82cdaae876171d22d452a06e2135eec8cf4ec753","src/distributions/weibull.rs":"403a5c9e5b82ac252e27fd5d295769c557bb41d817cc98a3cbd6910d6221d2de","src/distributions/weighted/alias_method.rs":"4940d35b2a125de60dc685b4bc8b61df87308334fad738c07a8455c70502a247","src/distributions/weighted/mod.rs":"e03bf27b7a870d403b34e06a97b34724bef5696845e78c9c85a158a93a1cd85d","src/distributions/ziggurat_tables.rs":"6368acec20801c703ae76dd1e08983793732c5ac221c491f85d719ef75448b6d","src/lib.rs":"37898a8ab404dfb96377826066c0fc1c36958234b258c95ce7b12619bd389ace","src/prelude.rs":"331b6249754e89cf0c493e443b41455ffce4146c24de2bffdd596f355d86e5f8","src/rngs/adapter/mod.rs":"a625303a793b3f7ee2e25d210204493d1774e0cee8b39dc2cab0035e80c0ce24","src/rngs/adapter/read.rs":"243a388e91c9bb8a6172027969c4690b6b130bdf13bcb2759456b44b9a8fcef9","src/rngs/adapter/reseeding.rs":"62cc33d0a5dcef1b76cdc06b181104615c266638aeeca09ebfd4ea2416149283","src/rngs/entropy.rs":"ac350a6862af7f6bfde9e730b79da3955c94da2906e723b158cd5a33b90bafa6","src/rngs/mock.rs":"0b1210f9bec383d4afe6c3a0f6fd32437fd54d0f4b1c5865509a35ff79d045a8","src/rngs/mod.rs":"7dcfd83851c5a8e8ed999adedecf1be6b9005c465cdd5334020ab1a2fe55d5ff","src/rngs/os.rs":"d251a2d2c6a5b1bb348d776e466469b33152b830090fca5c72b71be694304abb","src/rngs/small.rs":"8783d45d1ceefea7c4dff7e3787bad621f64f8b1891d372333221d75c7be10b5","src/rngs/std.rs":"5212698b548b0581d4058df6eae1ea532aea01246f342b197096f429ab3b301b","src/rngs/thread.rs":"fe575428f4a1c9eeddefacf305b85ce645fa0b5d8caa4d1e41f9bbb63cc3ac0c","src/seq/index.rs":"29ae0815b2e5738c58228fcb7a9053987487310a6ded396a34bff330099af8b4","src/seq/mod.rs":"a5e41438cd83f2c7e086c2708b5f59a248c0098bad0ad9c3432667e75be4e8c9"},"package":"d47eab0e83d9693d40f825f86948aa16eff6750ead4bdffc4ab95b8b3a7f052c"} \ No newline at end of file +{"files":{"CHANGELOG.md":"28794454ddd6739a1c0cfc6df90a25af3a6a62827d7f7aaea3ee39440b9ab87b","COPYRIGHT":"90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5","Cargo.lock":"ee32a72318ee8c6986509e36ae276406b622897cb82324c3f0e39551f0edc2cb","Cargo.toml":"4bc436e4b01131f4809c2d3dbdd3ede6987135d3fb53f718cd4a85cafa240224","LICENSE-APACHE":"aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf","LICENSE-MIT":"209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b","README.md":"cc7af91db7807de40503b3033ea596aeb78a89c0997894ffd0e56c2fb06eab36","SECURITY.md":"b1c8e24e88bd81bb65bad212b1176d18a73f5191ae650a75784954a74acc31d4","benches/generators.rs":"361886b55d31449e7a649518e5a751eff4494cad8f3e247aee741dddd82d99a4","benches/misc.rs":"6fa587fb3bab8502b7dd88805a4255c5fc6b42b8b3f5d8eb727af1b80b0ebe29","benches/seq.rs":"bdc6c92a8cedb5ff41ac028618053eaf5bf4c7be8b16c83c79e9467039381302","benches/weighted.rs":"3649964f75cd6cb4e50134fbb14e09fb995ca6667cb34f99d0bd27a9429de3ea","examples/monte-carlo.rs":"e55087f1e1f48d723ffc49fb107f5846c163a5e0c97206cd43a261cbdf6bb1b4","examples/monty-hall.rs":"c079293ec0633717b4d903c63f9db166c2a0fe6c8ba9a98f084fb4975fccbc07","rustfmt.toml":"a582a93dc6492d36daae52df7800e369887ba0984d68d98f70b99ca870fed268","src/distributions/bernoulli.rs":"fa81935ea2091d43d373bb7f2f579522a5beae33c9aa9598fe8490298753eba7","src/distributions/binomial.rs":"667f4f2cddb7994aa68926dbdda4482c24ce28f9d392d2a439a9eb675bfe04be","src/distributions/cauchy.rs":"bf55d4535960136351938a92254d4429689c20ebba051808c171f818adbb1191","src/distributions/dirichlet.rs":"ef28a435d9fa6b2f8d953613135cf1be7905f3909edd86b65be4e77685dd9c47","src/distributions/exponential.rs":"0419f25e369b66226ecaaf500395bf3b0decc5f90aedba1151553085774129bf","src/distributions/float.rs":"8dc11e2e4ae743e19e7799da02862480f4499789d8c58c47fbeca5f7930d7cb9","src/distributions/gamma.rs":"bfa848d6165e653d6e461e5b92f49bb119c6f9e259ffe7d7b8fbb34234d611d1","src/distributions/integer.rs":"3eb86fe2a1aca9125463cc581245b498d8c23c0f80422e5496582d2763e605fc","src/distributions/mod.rs":"d2a2b3e36f2f8bdeb93ffc1f3032175b6a062f485e6bf78502401aa854c4fb24","src/distributions/normal.rs":"2ef7e174877f7ccb7c4ff5cbce5dc24eaad0cc700fad33a6d3c20b52ed8f4bcb","src/distributions/other.rs":"e0a6f5e2d6699e460267f463c95797781daf347bff9192b7af7630a18885290c","src/distributions/pareto.rs":"2c1fee43a4b408e9da32abec384542a243b96c5303371a63d0fc2f1baaa02c64","src/distributions/poisson.rs":"ec123c26b0029cb96325e2551e6c82c9b7f7a41c933cc3f40f6f6f6ac7990cef","src/distributions/triangular.rs":"4be8ba5eccdda8ab90319325381ff6952caf59261b59a7a6f79f8867ac426249","src/distributions/uniform.rs":"5a1af322eb2b6cca701bd0a14247b4387e78686318fd01f3213d0f3252cbea18","src/distributions/unit_circle.rs":"36d8640cb8b26fcdb1b7d4d6c0b349316117f9300f480304c8a15d9d148f5937","src/distributions/unit_sphere.rs":"4ecc4260d4e4cc3ebea679a29d2ec343a54d56016c37b2632d78e888a92cb584","src/distributions/utils.rs":"6478e01b2bd0de99e917373f3c86db1142ea10c67488691cbc10af29891ac6dc","src/distributions/weibull.rs":"9b5acc5981a44309820d3a1fd3fff17984590aeebb41a1cdf5098890ad1dec04","src/distributions/weighted/alias_method.rs":"6172aad0d461f6816a944dec00aac09e943fd13123ec518184995658538de7ed","src/distributions/weighted/mod.rs":"54386cf92d39c69b38208bc9b0e2f74949512784a43684d63523bee03c1cc8bc","src/distributions/ziggurat_tables.rs":"2994bb821a60681e0d7a2bb45fcdcbea1040aa775c9aab2c80a7161d753d1ad0","src/lib.rs":"588e35ffc5c859b588d99de6d331251939440383b09da92b1017ddced19a3f41","src/prelude.rs":"cb49fcfc4f0d3b6eaa43c00a667dd3456e6a321e98eee17320ec4a703d6faf4b","src/rngs/adapter/mod.rs":"851918de58eda79c0cb3f2c0756fb756a7769f35115a77a5ae2025e05b4c1d93","src/rngs/adapter/read.rs":"c162cd131c9ed4868415360f627aba17046d4acdae6b7cdc9c75a41e60757caa","src/rngs/adapter/reseeding.rs":"93d2fbf62d1a5765437c4360b94a2df69921fb9cd5b704c4c2023f53eb15ee03","src/rngs/entropy.rs":"a7a07e1f23c45332994eb0b76d250f68a2394048ab6fe3c6691fef719e30fb42","src/rngs/mock.rs":"d1ac752afa589bc3925067f98fe6c13223bda6c3e22b85abe22e4cd60e22bf90","src/rngs/mod.rs":"9ae5e9aa965d3393ef90983ab85834599432c9fc2c1d40de1b9237ab3fc91eb1","src/rngs/small.rs":"8cc5d1ae357554181b4c5fa978e95b667147c251f8431881da66b97ff584224c","src/rngs/std.rs":"82117975ada00199c8ca3677fc4e00bb8b574c50cd321e04b37d0c7542fa0b30","src/rngs/thread.rs":"ccb98ead28d49f6e35d6e50150cbd89579409fcfd792565aceb03e716447de9b","src/seq/index.rs":"4f2566bd9c189fc68a68fc1ad913c6efe3d3ea0699b1b1e110df9d51725c5b3d","src/seq/mod.rs":"26707ad8595093746852799c1d2eee159b69044abfedfcbfe26263a25f8035fa"},"package":"6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"} \ No newline at end of file diff --git a/vendor/rand/CHANGELOG.md b/vendor/rand/CHANGELOG.md index 3d21662b59..b519d4836d 100644 --- a/vendor/rand/CHANGELOG.md +++ b/vendor/rand/CHANGELOG.md @@ -8,6 +8,40 @@ A [separate changelog is kept for rand_core](rand_core/CHANGELOG.md). You may also find the [Upgrade Guide](https://rust-random.github.io/book/update.html) useful. +## [0.7.3] - 2020-01-10 +### Fixes +- The `Bernoulli` distribution constructors now reports an error on NaN and on + `denominator == 0`. (#925) +- Use `std::sync::Once` to register fork handler, avoiding possible atomicity violation (#928) +- Fix documentation on the precision of generated floating-point values + +### Changes +- Unix: make libc dependency optional; only use fork protection with std feature (#928) + +### Additions +- Implement `std::error::Error` for `BernoulliError` (#919) + +## [0.7.2] - 2019-09-16 +### Fixes +- Fix dependency on `rand_core` 0.5.1 (#890) + +### Additions +- Unit tests for value stability of distributions added (#888) + +## [0.7.1] - 2019-09-13 +### Yanked +This release was yanked since it depends on `rand_core::OsRng` added in 0.5.1 +but specifies a dependency on version 0.5.0 (#890), causing a broken builds +when updating from `rand 0.7.0` without also updating `rand_core`. + +### Fixes +- Fix `no_std` behaviour, appropriately enable c2-chacha's `std` feature (#844) +- `alloc` feature in `no_std` is available since Rust 1.36 (#856) +- Fix or squelch issues from Clippy lints (#840) + +### Additions +- Add a `no_std` target to CI to continously evaluate `no_std` status (#844) +- `WeightedIndex`: allow adjusting a sub-set of weights (#866) ## [0.7.0] - 2019-06-28 diff --git a/vendor/rand/Cargo.lock b/vendor/rand/Cargo.lock new file mode 100644 index 0000000000..a03987b586 --- /dev/null +++ b/vendor/rand/Cargo.lock @@ -0,0 +1,388 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "base-x" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bumpalo" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "c2-chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cfg-if" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "discard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "getrandom" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "stdweb 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "itoa" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libc" +version = "0.2.62" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "packed_simd" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "proc-macro2" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand" +version = "0.7.3" +dependencies = [ + "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "packed_simd 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_chacha" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ryu" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde_derive" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_json" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "stdweb" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", + "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "stdweb-internal-macros 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "stdweb-internal-runtime 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "stdweb-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "stdweb-internal-macros" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base-x 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "stdweb-internal-runtime" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syn" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "wasi" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "wasm-bindgen" +version = "0.2.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.50" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum base-x 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "76f4eae81729e69bb1819a26c6caac956cc429238388091f98cb6cd858f16443" +"checksum bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad807f2fc2bf185eeb98ff3a901bd46dc5ad58163d0fa4577ba0d25674d71708" +"checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" +"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" +"checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba" +"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +"checksum packed_simd 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a85ea9fc0d4ac0deb6fe7911d38786b32fc11119afd9e9d38b84ff691ce64220" +"checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e98a83a9f9b331f54b924e68a66acb1bb35cb01fb0a23645139967abefb697e8" +"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" +"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +"checksum rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)" = "f4473e8506b213730ff2061073b48fa51dcc66349219e2e7c5608f0296a1d95a" +"checksum serde_derive 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)" = "11e410fde43e157d789fc290d26bc940778ad0fdd47836426fbac36573710dbb" +"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704" +"checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +"checksum stdweb 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a68c0ce28cf7400ed022e18da3c4591e14e1df02c70e93573cc59921b3923aeb" +"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" +"checksum stdweb-internal-macros 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "e68f7d08b76979a43e93fe043b66d2626e35d41d68b0b85519202c6dd8ac59fa" +"checksum stdweb-internal-runtime 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d52317523542cc0af5b7e31017ad0f7d1e78da50455e38d5657cd17754f617da" +"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" +"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" +"checksum wasm-bindgen 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "dcddca308b16cd93c2b67b126c688e5467e4ef2e28200dc7dfe4ae284f2faefc" +"checksum wasm-bindgen-backend 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "f805d9328b5fc7e5c6399960fd1889271b9b58ae17bdb2417472156cc9fafdd0" +"checksum wasm-bindgen-macro 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "3ff88201a482abfc63921621f6cb18eb1efd74f136b05e5841e7f8ca434539e9" +"checksum wasm-bindgen-macro-support 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "6a433d89ecdb9f77d46fcf00c8cf9f3467b7de9954d8710c175f61e2e245bb0e" +"checksum wasm-bindgen-shared 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "d41fc1bc3570cdf8d108c15e014045fd45a95bb5eb36605f96a90461fc34027d" diff --git a/vendor/rand/Cargo.toml b/vendor/rand/Cargo.toml index cdaf8fb6f5..78a29b0e11 100644 --- a/vendor/rand/Cargo.toml +++ b/vendor/rand/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "rand" -version = "0.7.0" +version = "0.7.3" authors = ["The Rand Project Developers", "The Rust Project Developers"] exclude = ["/utils/*", "/.travis.yml", "/appveyor.yml", ".gitignore"] autobenches = true @@ -23,7 +23,7 @@ documentation = "https://rust-random.github.io/rand/" readme = "README.md" keywords = ["random", "rng"] categories = ["algorithms", "no-std"] -license = "MIT/Apache-2.0" +license = "MIT OR Apache-2.0" repository = "https://github.com/rust-random/rand" [package.metadata.docs.rs] all-features = true @@ -33,7 +33,7 @@ optional = true package = "getrandom" [dependencies.log] -version = "0.4" +version = "0.4.4" optional = true [dependencies.packed_simd] @@ -42,7 +42,7 @@ features = ["into_bits"] optional = true [dependencies.rand_core] -version = "0.5" +version = "0.5.1" [dependencies.rand_pcg] version = "0.2" @@ -50,18 +50,9 @@ optional = true [dev-dependencies.rand_hc] version = "0.2" -[dev-dependencies.rand_isaac] -version = "0.2" - [dev-dependencies.rand_pcg] version = "0.2" -[dev-dependencies.rand_xorshift] -version = "0.2" - -[dev-dependencies.rand_xoshiro] -version = "0.3" - [features] alloc = ["rand_core/alloc"] default = ["std"] @@ -70,15 +61,17 @@ nightly = ["simd_support"] serde1 = [] simd_support = ["packed_simd"] small_rng = ["rand_pcg"] -std = ["rand_core/std", "alloc", "getrandom"] +std = ["rand_core/std", "rand_chacha/std", "alloc", "getrandom", "libc"] stdweb = ["getrandom_package/stdweb"] wasm-bindgen = ["getrandom_package/wasm-bindgen"] [target."cfg(not(target_os = \"emscripten\"))".dependencies.rand_chacha] -version = "0.2" +version = "0.2.1" +default-features = false [target."cfg(target_os = \"emscripten\")".dependencies.rand_hc] version = "0.2" [target."cfg(unix)".dependencies.libc] version = "0.2.22" +optional = true default-features = false [badges.appveyor] repository = "rust-random/rand" diff --git a/vendor/rand/README.md b/vendor/rand/README.md index e3f229180c..c4bd676a98 100644 --- a/vendor/rand/README.md +++ b/vendor/rand/README.md @@ -67,6 +67,12 @@ A detailed [changelog](CHANGELOG.md) is available. When upgrading to the next minor series (especially 0.4 → 0.5), we recommend reading the [Upgrade Guide](https://rust-random.github.io/book/update.html). +### Yanked versions + +Some versions of Rand crates have been yanked ("unreleased"). Where this occurs, +the crate's CHANGELOG *should* be updated with a rationale, and a search on the +issue tracker with the keyword `yank` *should* uncover the motivation. + ### Rust version requirements Since version 0.7, Rand requires **Rustc version 1.32 or greater**. @@ -79,18 +85,12 @@ Travis CI always has a build with a pinned version of Rustc matching the oldest supported Rust release. The current policy is that this can be updated in any Rand release if required, but the change must be noted in the changelog. -To avoid bumping the required version unnecessarily, we use a `build.rs` script -to auto-detect the compiler version and enable certain features or change code -paths automatically. Since this makes it easy to unintentionally make use of -features requiring a more recent Rust version, we recommend testing with a -pinned version of Rustc if you require compatibility with a specific version. - ## Crate Features Rand is built with these features enabled by default: - `std` enables functionality dependent on the `std` lib -- `alloc` (implied by `std`) enables functionality requiring an allocator +- `alloc` (implied by `std`) enables functionality requiring an allocator (when using this feature in `no_std`, Rand requires Rustc version 1.36 or greater) - `getrandom` (implied by `std`) is an optional dependency providing the code behind `rngs::OsRng` @@ -99,8 +99,10 @@ Optionally, the following dependencies can be enabled: - `log` enables logging via the `log` crate - `stdweb` implies `getrandom/stdweb` to enable `getrandom` support on `wasm32-unknown-unknown` + (will be removed in rand 0.8; activate via `getrandom` crate instead) - `wasm-bindgen` implies `getrandom/wasm-bindgen` to enable `getrandom` support on `wasm32-unknown-unknown` + (will be removed in rand 0.8; activate via `getrandom` crate instead) Additionally, these features configure Rand: diff --git a/vendor/rand/SECURITY.md b/vendor/rand/SECURITY.md new file mode 100644 index 0000000000..daedb78f0d --- /dev/null +++ b/vendor/rand/SECURITY.md @@ -0,0 +1,69 @@ +# Security Policy + +## No guarantees + +Support is provided on a best-effort bases only. +No binding guarantees can be provided. + +## Security premises + +Rand provides the trait `rand_core::CryptoRng` aka `rand::CryptoRng` as a marker +trait. Generators implementating `RngCore` *and* `CryptoRng`, and given the +additional constraints that: + +- Instances of seedable RNGs (those implementing `SeedableRng`) are + constructed with cryptographically secure seed values +- The state (memory) of the RNG and its seed value are not be exposed + +are expected to provide the following: + +- An attacker can gain no advantage over chance (50% for each bit) in + predicting the RNG output, even with full knowledge of all prior outputs. + +For some RNGs, notably `OsRng`, `ThreadRng` and those wrapped by `ReseedingRng`, +we provide limited mitigations against side-channel attacks: + +- After a process fork on Unix, there is an upper-bound on the number of bits + output by the RNG before the processes diverge, after which outputs from + each process's RNG are uncorrelated +- After the state (memory) of an RNG is leaked, there is an upper-bound on the + number of bits of output by the RNG before prediction of output by an + observer again becomes computationally-infeasible + +Additionally, derivations from such an RNG (including the `Rng` trait, +implementations of the `Distribution` trait, and `seq` algorithms) should not +introduce signficant bias other than that expected from the operation in +question (e.g. bias from a weighted distribution). + +## Supported Versions + +We will attempt to uphold these premises in the following crate versions, +provided that only the latest patch version is used, and with potential +exceptions for theoretical issues without a known exploit: + +| Crate | Versions | Exceptions | +| ----- | -------- | ---------- | +| `rand` | 0.7 | | +| `rand` | 0.5, 0.6 | Jitter | +| `rand` | 0.4 | Jitter, ISAAC | +| `rand_core` | 0.2 - 0.5 | | +| `rand_chacha` | 0.1 - 0.2 | | +| `rand_hc` | 0.1 - 0.2 | | + +Explanation of exceptions: + +- Jitter: `JitterRng` is used as an entropy source when the primary source + fails; this source may not be secure against side-channel attacks, see #699. +- ISAAC: the [ISAAC](https://burtleburtle.net/bob/rand/isaacafa.html) RNG used + to implement `thread_rng` is difficult to analyse and thus cannot provide + strong assertions of security. + +## Known issues + +In `rand` version 0.3 (0.3.18 and later), if `OsRng` fails, `thread_rng` is +seeded from the system time in an insecure manner. + +## Reporting a Vulnerability + +To report a vulnerability, [open a new issue](https://github.com/rust-random/rand/issues/new). +Once the issue is resolved, the vulnerability should be [reported to RustSec](https://github.com/RustSec/advisory-db/blob/master/CONTRIBUTING.md). diff --git a/vendor/rand/benches/generators.rs b/vendor/rand/benches/generators.rs index 808bb67a4e..3e264083d7 100644 --- a/vendor/rand/benches/generators.rs +++ b/vendor/rand/benches/generators.rs @@ -19,15 +19,10 @@ use test::{black_box, Bencher}; use rand::prelude::*; use rand::rngs::adapter::ReseedingRng; -use rand::rngs::{OsRng, mock::StepRng}; -use rand_isaac::{IsaacRng, Isaac64Rng}; -use rand_chacha::{ChaCha20Core, ChaCha8Rng, ChaCha12Rng, ChaCha20Rng}; -use rand_hc::{Hc128Rng}; +use rand::rngs::{mock::StepRng, OsRng}; +use rand_chacha::{ChaCha12Rng, ChaCha20Core, ChaCha20Rng, ChaCha8Rng}; +use rand_hc::Hc128Rng; use rand_pcg::{Pcg32, Pcg64, Pcg64Mcg}; -use rand_xorshift::XorShiftRng; -use rand_xoshiro::{Xoshiro256StarStar, Xoshiro256Plus, Xoshiro128StarStar, - Xoshiro128Plus, Xoroshiro128StarStar, Xoroshiro128Plus, SplitMix64, - Xoroshiro64StarStar, Xoroshiro64Star}; macro_rules! gen_bytes { ($fnn:ident, $gen:expr) => { @@ -43,20 +38,10 @@ macro_rules! gen_bytes { }); b.bytes = BYTES_LEN as u64 * RAND_BENCH_N; } - } + }; } gen_bytes!(gen_bytes_step, StepRng::new(0, 1)); -gen_bytes!(gen_bytes_xorshift, XorShiftRng::from_entropy()); -gen_bytes!(gen_bytes_xoshiro256starstar, Xoshiro256StarStar::from_entropy()); -gen_bytes!(gen_bytes_xoshiro256plus, Xoshiro256Plus::from_entropy()); -gen_bytes!(gen_bytes_xoshiro128starstar, Xoshiro128StarStar::from_entropy()); -gen_bytes!(gen_bytes_xoshiro128plus, Xoshiro128Plus::from_entropy()); -gen_bytes!(gen_bytes_xoroshiro128starstar, Xoroshiro128StarStar::from_entropy()); -gen_bytes!(gen_bytes_xoroshiro128plus, Xoroshiro128Plus::from_entropy()); -gen_bytes!(gen_bytes_xoroshiro64starstar, Xoroshiro64StarStar::from_entropy()); -gen_bytes!(gen_bytes_xoroshiro64star, Xoroshiro64Star::from_entropy()); -gen_bytes!(gen_bytes_splitmix64, SplitMix64::from_entropy()); gen_bytes!(gen_bytes_pcg32, Pcg32::from_entropy()); gen_bytes!(gen_bytes_pcg64, Pcg64::from_entropy()); gen_bytes!(gen_bytes_pcg64mcg, Pcg64Mcg::from_entropy()); @@ -64,10 +49,8 @@ gen_bytes!(gen_bytes_chacha8, ChaCha8Rng::from_entropy()); gen_bytes!(gen_bytes_chacha12, ChaCha12Rng::from_entropy()); gen_bytes!(gen_bytes_chacha20, ChaCha20Rng::from_entropy()); gen_bytes!(gen_bytes_hc128, Hc128Rng::from_entropy()); -gen_bytes!(gen_bytes_isaac, IsaacRng::from_entropy()); -gen_bytes!(gen_bytes_isaac64, Isaac64Rng::from_entropy()); gen_bytes!(gen_bytes_std, StdRng::from_entropy()); -#[cfg(feature="small_rng")] +#[cfg(feature = "small_rng")] gen_bytes!(gen_bytes_small, SmallRng::from_entropy()); gen_bytes!(gen_bytes_os, OsRng); @@ -85,20 +68,10 @@ macro_rules! gen_uint { }); b.bytes = size_of::<$ty>() as u64 * RAND_BENCH_N; } - } + }; } gen_uint!(gen_u32_step, u32, StepRng::new(0, 1)); -gen_uint!(gen_u32_xorshift, u32, XorShiftRng::from_entropy()); -gen_uint!(gen_u32_xoshiro256starstar, u32, Xoshiro256StarStar::from_entropy()); -gen_uint!(gen_u32_xoshiro256plus, u32, Xoshiro256Plus::from_entropy()); -gen_uint!(gen_u32_xoshiro128starstar, u32, Xoshiro128StarStar::from_entropy()); -gen_uint!(gen_u32_xoshiro128plus, u32, Xoshiro128Plus::from_entropy()); -gen_uint!(gen_u32_xoroshiro128starstar, u32, Xoroshiro128StarStar::from_entropy()); -gen_uint!(gen_u32_xoroshiro128plus, u32, Xoroshiro128Plus::from_entropy()); -gen_uint!(gen_u32_xoroshiro64starstar, u32, Xoroshiro64StarStar::from_entropy()); -gen_uint!(gen_u32_xoroshiro64star, u32, Xoroshiro64Star::from_entropy()); -gen_uint!(gen_u32_splitmix64, u32, SplitMix64::from_entropy()); gen_uint!(gen_u32_pcg32, u32, Pcg32::from_entropy()); gen_uint!(gen_u32_pcg64, u32, Pcg64::from_entropy()); gen_uint!(gen_u32_pcg64mcg, u32, Pcg64Mcg::from_entropy()); @@ -106,24 +79,12 @@ gen_uint!(gen_u32_chacha8, u32, ChaCha8Rng::from_entropy()); gen_uint!(gen_u32_chacha12, u32, ChaCha12Rng::from_entropy()); gen_uint!(gen_u32_chacha20, u32, ChaCha20Rng::from_entropy()); gen_uint!(gen_u32_hc128, u32, Hc128Rng::from_entropy()); -gen_uint!(gen_u32_isaac, u32, IsaacRng::from_entropy()); -gen_uint!(gen_u32_isaac64, u32, Isaac64Rng::from_entropy()); gen_uint!(gen_u32_std, u32, StdRng::from_entropy()); -#[cfg(feature="small_rng")] +#[cfg(feature = "small_rng")] gen_uint!(gen_u32_small, u32, SmallRng::from_entropy()); gen_uint!(gen_u32_os, u32, OsRng); gen_uint!(gen_u64_step, u64, StepRng::new(0, 1)); -gen_uint!(gen_u64_xorshift, u64, XorShiftRng::from_entropy()); -gen_uint!(gen_u64_xoshiro256starstar, u64, Xoshiro256StarStar::from_entropy()); -gen_uint!(gen_u64_xoshiro256plus, u64, Xoshiro256Plus::from_entropy()); -gen_uint!(gen_u64_xoshiro128starstar, u64, Xoshiro128StarStar::from_entropy()); -gen_uint!(gen_u64_xoshiro128plus, u64, Xoshiro128Plus::from_entropy()); -gen_uint!(gen_u64_xoroshiro128starstar, u64, Xoroshiro128StarStar::from_entropy()); -gen_uint!(gen_u64_xoroshiro128plus, u64, Xoroshiro128Plus::from_entropy()); -gen_uint!(gen_u64_xoroshiro64starstar, u64, Xoroshiro64StarStar::from_entropy()); -gen_uint!(gen_u64_xoroshiro64star, u64, Xoroshiro64Star::from_entropy()); -gen_uint!(gen_u64_splitmix64, u64, SplitMix64::from_entropy()); gen_uint!(gen_u64_pcg32, u64, Pcg32::from_entropy()); gen_uint!(gen_u64_pcg64, u64, Pcg64::from_entropy()); gen_uint!(gen_u64_pcg64mcg, u64, Pcg64Mcg::from_entropy()); @@ -131,10 +92,8 @@ gen_uint!(gen_u64_chacha8, u64, ChaCha8Rng::from_entropy()); gen_uint!(gen_u64_chacha12, u64, ChaCha12Rng::from_entropy()); gen_uint!(gen_u64_chacha20, u64, ChaCha20Rng::from_entropy()); gen_uint!(gen_u64_hc128, u64, Hc128Rng::from_entropy()); -gen_uint!(gen_u64_isaac, u64, IsaacRng::from_entropy()); -gen_uint!(gen_u64_isaac64, u64, Isaac64Rng::from_entropy()); gen_uint!(gen_u64_std, u64, StdRng::from_entropy()); -#[cfg(feature="small_rng")] +#[cfg(feature = "small_rng")] gen_uint!(gen_u64_small, u64, SmallRng::from_entropy()); gen_uint!(gen_u64_os, u64, OsRng); @@ -142,31 +101,19 @@ macro_rules! init_gen { ($fnn:ident, $gen:ident) => { #[bench] fn $fnn(b: &mut Bencher) { - let mut rng = XorShiftRng::from_entropy(); + let mut rng = Pcg32::from_entropy(); b.iter(|| { let r2 = $gen::from_rng(&mut rng).unwrap(); r2 }); } - } + }; } -init_gen!(init_xorshift, XorShiftRng); -init_gen!(init_xoshiro256starstar, Xoshiro256StarStar); -init_gen!(init_xoshiro256plus, Xoshiro256Plus); -init_gen!(init_xoshiro128starstar, Xoshiro128StarStar); -init_gen!(init_xoshiro128plus, Xoshiro128Plus); -init_gen!(init_xoroshiro128starstar, Xoroshiro128StarStar); -init_gen!(init_xoroshiro128plus, Xoroshiro128Plus); -init_gen!(init_xoroshiro64starstar, Xoroshiro64StarStar); -init_gen!(init_xoroshiro64star, Xoroshiro64Star); -init_gen!(init_splitmix64, SplitMix64); init_gen!(init_pcg32, Pcg32); init_gen!(init_pcg64, Pcg64); init_gen!(init_pcg64mcg, Pcg64Mcg); init_gen!(init_hc128, Hc128Rng); -init_gen!(init_isaac, IsaacRng); -init_gen!(init_isaac64, Isaac64Rng); init_gen!(init_chacha, ChaCha20Rng); const RESEEDING_BYTES_LEN: usize = 1024 * 1024; @@ -176,9 +123,7 @@ macro_rules! reseeding_bytes { ($fnn:ident, $thresh:expr) => { #[bench] fn $fnn(b: &mut Bencher) { - let mut rng = ReseedingRng::new(ChaCha20Core::from_entropy(), - $thresh * 1024, - OsRng); + let mut rng = ReseedingRng::new(ChaCha20Core::from_entropy(), $thresh * 1024, OsRng); let mut buf = [0u8; RESEEDING_BYTES_LEN]; b.iter(|| { for _ in 0..RESEEDING_BENCH_N { @@ -188,7 +133,7 @@ macro_rules! reseeding_bytes { }); b.bytes = RESEEDING_BYTES_LEN as u64 * RESEEDING_BENCH_N; } - } + }; } reseeding_bytes!(reseeding_chacha20_4k, 4); @@ -213,7 +158,7 @@ macro_rules! threadrng_uint { }); b.bytes = size_of::<$ty>() as u64 * RAND_BENCH_N; } - } + }; } threadrng_uint!(thread_rng_u32, u32); diff --git a/vendor/rand/benches/misc.rs b/vendor/rand/benches/misc.rs index 4098686348..e46137f198 100644 --- a/vendor/rand/benches/misc.rs +++ b/vendor/rand/benches/misc.rs @@ -14,8 +14,8 @@ const RAND_BENCH_N: u64 = 1000; use test::Bencher; +use rand::distributions::{Bernoulli, Distribution, Standard}; use rand::prelude::*; -use rand::distributions::{Distribution, Standard, Bernoulli}; use rand_pcg::{Pcg32, Pcg64Mcg}; #[bench] diff --git a/vendor/rand/benches/seq.rs b/vendor/rand/benches/seq.rs index 4c671b8aad..7da2ff8a0f 100644 --- a/vendor/rand/benches/seq.rs +++ b/vendor/rand/benches/seq.rs @@ -26,7 +26,7 @@ const RAND_BENCH_N: u64 = 1000; #[bench] fn seq_shuffle_100(b: &mut Bencher) { let mut rng = SmallRng::from_rng(thread_rng()).unwrap(); - let x : &mut [usize] = &mut [1; 100]; + let x: &mut [usize] = &mut [1; 100]; b.iter(|| { x.shuffle(&mut rng); x[0] @@ -36,7 +36,7 @@ fn seq_shuffle_100(b: &mut Bencher) { #[bench] fn seq_slice_choose_1_of_1000(b: &mut Bencher) { let mut rng = SmallRng::from_rng(thread_rng()).unwrap(); - let x : &mut [usize] = &mut [1; 1000]; + let x: &mut [usize] = &mut [1; 1000]; for i in 0..1000 { x[i] = i; } @@ -55,19 +55,18 @@ macro_rules! seq_slice_choose_multiple { #[bench] fn $name(b: &mut Bencher) { let mut rng = SmallRng::from_rng(thread_rng()).unwrap(); - let x : &[i32] = &[$amount; $length]; + let x: &[i32] = &[$amount; $length]; let mut result = [0i32; $amount]; b.iter(|| { // Collect full result to prevent unwanted shortcuts getting // first element (in case sample_indices returns an iterator). - for (slot, sample) in result.iter_mut().zip( - x.choose_multiple(&mut rng, $amount)) { + for (slot, sample) in result.iter_mut().zip(x.choose_multiple(&mut rng, $amount)) { *slot = *sample; } - result[$amount-1] + result[$amount - 1] }) } - } + }; } seq_slice_choose_multiple!(seq_slice_choose_multiple_1_of_1000, 1, 1000); @@ -78,7 +77,7 @@ seq_slice_choose_multiple!(seq_slice_choose_multiple_90_of_100, 90, 100); #[bench] fn seq_iter_choose_from_1000(b: &mut Bencher) { let mut rng = SmallRng::from_rng(thread_rng()).unwrap(); - let x : &mut [usize] = &mut [1; 1000]; + let x: &mut [usize] = &mut [1; 1000]; for i in 0..1000 { x[i] = i; } @@ -98,6 +97,7 @@ struct UnhintedIterator<I: Iterator + Clone> { } impl<I: Iterator + Clone> Iterator for UnhintedIterator<I> { type Item = I::Item; + fn next(&mut self) -> Option<Self::Item> { self.iter.next() } @@ -110,9 +110,11 @@ struct WindowHintedIterator<I: ExactSizeIterator + Iterator + Clone> { } impl<I: ExactSizeIterator + Iterator + Clone> Iterator for WindowHintedIterator<I> { type Item = I::Item; + fn next(&mut self) -> Option<Self::Item> { self.iter.next() } + fn size_hint(&self) -> (usize, Option<usize>) { (std::cmp::min(self.iter.len(), self.window_size), None) } @@ -121,38 +123,40 @@ impl<I: ExactSizeIterator + Iterator + Clone> Iterator for WindowHintedIterator< #[bench] fn seq_iter_unhinted_choose_from_1000(b: &mut Bencher) { let mut rng = SmallRng::from_rng(thread_rng()).unwrap(); - let x : &[usize] = &[1; 1000]; + let x: &[usize] = &[1; 1000]; b.iter(|| { - UnhintedIterator { iter: x.iter() }.choose(&mut rng).unwrap() + UnhintedIterator { iter: x.iter() } + .choose(&mut rng) + .unwrap() }) } #[bench] fn seq_iter_window_hinted_choose_from_1000(b: &mut Bencher) { let mut rng = SmallRng::from_rng(thread_rng()).unwrap(); - let x : &[usize] = &[1; 1000]; + let x: &[usize] = &[1; 1000]; b.iter(|| { - WindowHintedIterator { iter: x.iter(), window_size: 7 }.choose(&mut rng) + WindowHintedIterator { + iter: x.iter(), + window_size: 7, + } + .choose(&mut rng) }) } #[bench] fn seq_iter_choose_multiple_10_of_100(b: &mut Bencher) { let mut rng = SmallRng::from_rng(thread_rng()).unwrap(); - let x : &[usize] = &[1; 100]; - b.iter(|| { - x.iter().cloned().choose_multiple(&mut rng, 10) - }) + let x: &[usize] = &[1; 100]; + b.iter(|| x.iter().cloned().choose_multiple(&mut rng, 10)) } #[bench] fn seq_iter_choose_multiple_fill_10_of_100(b: &mut Bencher) { let mut rng = SmallRng::from_rng(thread_rng()).unwrap(); - let x : &[usize] = &[1; 100]; + let x: &[usize] = &[1; 100]; let mut buf = [0; 10]; - b.iter(|| { - x.iter().cloned().choose_multiple_fill(&mut rng, &mut buf) - }) + b.iter(|| x.iter().cloned().choose_multiple_fill(&mut rng, &mut buf)) } macro_rules! sample_indices { @@ -160,11 +164,9 @@ macro_rules! sample_indices { #[bench] fn $name(b: &mut Bencher) { let mut rng = SmallRng::from_rng(thread_rng()).unwrap(); - b.iter(|| { - index::$fn(&mut rng, $length, $amount) - }) + b.iter(|| index::$fn(&mut rng, $length, $amount)) } - } + }; } sample_indices!(misc_sample_indices_1_of_1k, sample, 1, 1000); diff --git a/vendor/rand/benches/weighted.rs b/vendor/rand/benches/weighted.rs new file mode 100644 index 0000000000..68722908a9 --- /dev/null +++ b/vendor/rand/benches/weighted.rs @@ -0,0 +1,36 @@ +// Copyright 2019 Developers of the Rand project. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(test)] + +extern crate test; + +use rand::distributions::WeightedIndex; +use rand::Rng; +use test::Bencher; + +#[bench] +fn weighted_index_creation(b: &mut Bencher) { + let mut rng = rand::thread_rng(); + let weights = [1u32, 2, 4, 0, 5, 1, 7, 1, 2, 3, 4, 5, 6, 7]; + b.iter(|| { + let distr = WeightedIndex::new(weights.to_vec()).unwrap(); + rng.sample(distr) + }) +} + +#[bench] +fn weighted_index_modification(b: &mut Bencher) { + let mut rng = rand::thread_rng(); + let weights = [1u32, 2, 3, 0, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7]; + let mut distr = WeightedIndex::new(weights.to_vec()).unwrap(); + b.iter(|| { + distr.update_weights(&[(2, &4), (5, &1)]).unwrap(); + rng.sample(&distr) + }) +} diff --git a/vendor/rand/examples/monte-carlo.rs b/vendor/rand/examples/monte-carlo.rs index 39c779f40c..70560d0fab 100644 --- a/vendor/rand/examples/monte-carlo.rs +++ b/vendor/rand/examples/monte-carlo.rs @@ -38,11 +38,14 @@ fn main() { for _ in 0..total { let a = range.sample(&mut rng); let b = range.sample(&mut rng); - if a*a + b*b <= 1.0 { + if a * a + b * b <= 1.0 { in_circle += 1; } } // prints something close to 3.14159... - println!("π is approximately {}", 4. * (in_circle as f64) / (total as f64)); + println!( + "π is approximately {}", + 4. * (in_circle as f64) / (total as f64) + ); } diff --git a/vendor/rand/examples/monty-hall.rs b/vendor/rand/examples/monty-hall.rs index 9fe58394ae..30e2f44d15 100644 --- a/vendor/rand/examples/monty-hall.rs +++ b/vendor/rand/examples/monty-hall.rs @@ -52,7 +52,10 @@ fn simulate<R: Rng>(random_door: &Uniform<u32>, rng: &mut R) -> SimulationResult choice = switch_door(choice, open); } - SimulationResult { win: choice == car, switch } + SimulationResult { + win: choice == car, + switch, + } } // Returns the door the game host opens given our choice and knowledge of @@ -97,16 +100,24 @@ fn main() { let total_switches = switch_wins + switch_losses; let total_keeps = keep_wins + keep_losses; - println!("Switched door {} times with {} wins and {} losses", - total_switches, switch_wins, switch_losses); + println!( + "Switched door {} times with {} wins and {} losses", + total_switches, switch_wins, switch_losses + ); - println!("Kept our choice {} times with {} wins and {} losses", - total_keeps, keep_wins, keep_losses); + println!( + "Kept our choice {} times with {} wins and {} losses", + total_keeps, keep_wins, keep_losses + ); // With a large number of simulations, the values should converge to // 0.667 and 0.333 respectively. - println!("Estimated chance to win if we switch: {}", - switch_wins as f32 / total_switches as f32); - println!("Estimated chance to win if we don't: {}", - keep_wins as f32 / total_keeps as f32); + println!( + "Estimated chance to win if we switch: {}", + switch_wins as f32 / total_switches as f32 + ); + println!( + "Estimated chance to win if we don't: {}", + keep_wins as f32 / total_keeps as f32 + ); } diff --git a/vendor/rand/rustfmt.toml b/vendor/rand/rustfmt.toml index 6b2aba3517..6a2d9d4821 100644 --- a/vendor/rand/rustfmt.toml +++ b/vendor/rand/rustfmt.toml @@ -4,13 +4,14 @@ # Comments: normalize_comments = true wrap_comments = false -format_doc_comments = true comment_width = 90 # small excess is okay but prefer 80 # Arguments: -use_small_heuristics = "max" -fn_args_density = "compressed" +use_small_heuristics = "Default" +# TODO: single line functions only where short, please? +# https://github.com/rust-lang/rustfmt/issues/3358 fn_single_line = false +fn_args_layout = "Compressed" overflow_delimited_expr = true where_single_line = true @@ -21,6 +22,7 @@ where_single_line = true edition = "2018" # we require compatibility back to 1.32.0 # Misc: +inline_attribute_width = 80 blank_lines_upper_bound = 2 reorder_impl_items = true # report_todo = "Unnumbered" diff --git a/vendor/rand/src/distributions/bernoulli.rs b/vendor/rand/src/distributions/bernoulli.rs index f7bdae4694..a1fa86e14d 100644 --- a/vendor/rand/src/distributions/bernoulli.rs +++ b/vendor/rand/src/distributions/bernoulli.rs @@ -8,8 +8,9 @@ //! The Bernoulli distribution. -use crate::Rng; use crate::distributions::Distribution; +use crate::Rng; +use core::{fmt, u64}; /// The Bernoulli distribution. /// @@ -55,7 +56,7 @@ pub struct Bernoulli { // the RNG, and pay the performance price for all uses that *are* reasonable. // Luckily, if `new()` and `sample` are close, the compiler can optimize out the // extra check. -const ALWAYS_TRUE: u64 = ::core::u64::MAX; +const ALWAYS_TRUE: u64 = u64::MAX; // This is just `2.0.powi(64)`, but written this way because it is not available // in `no_std` mode. @@ -68,6 +69,17 @@ pub enum BernoulliError { InvalidProbability, } +impl fmt::Display for BernoulliError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self { + BernoulliError::InvalidProbability => "p is outside [0, 1] in Bernoulli distribution", + }) + } +} + +#[cfg(feature = "std")] +impl ::std::error::Error for BernoulliError {} + impl Bernoulli { /// Construct a new `Bernoulli` with the given probability of success `p`. /// @@ -81,28 +93,34 @@ impl Bernoulli { /// 2<sup>-64</sup> in `[0, 1]` can be represented as a `f64`.) #[inline] pub fn new(p: f64) -> Result<Bernoulli, BernoulliError> { - if p < 0.0 || p >= 1.0 { - if p == 1.0 { return Ok(Bernoulli { p_int: ALWAYS_TRUE }) } + if !(p >= 0.0 && p < 1.0) { + if p == 1.0 { + return Ok(Bernoulli { p_int: ALWAYS_TRUE }); + } return Err(BernoulliError::InvalidProbability); } - Ok(Bernoulli { p_int: (p * SCALE) as u64 }) + Ok(Bernoulli { + p_int: (p * SCALE) as u64, + }) } /// Construct a new `Bernoulli` with the probability of success of /// `numerator`-in-`denominator`. I.e. `new_ratio(2, 3)` will return /// a `Bernoulli` with a 2-in-3 chance, or about 67%, of returning `true`. /// - /// If `numerator == denominator` then the returned `Bernoulli` will always /// return `true`. If `numerator == 0` it will always return `false`. + /// For `numerator > denominator` and `denominator == 0`, this returns an + /// error. Otherwise, for `numerator == denominator`, samples are always + /// true; for `numerator == 0` samples are always false. #[inline] pub fn from_ratio(numerator: u32, denominator: u32) -> Result<Bernoulli, BernoulliError> { - if !(numerator <= denominator) { + if numerator > denominator || denominator == 0 { return Err(BernoulliError::InvalidProbability); } if numerator == denominator { - return Ok(Bernoulli { p_int: ALWAYS_TRUE }) + return Ok(Bernoulli { p_int: ALWAYS_TRUE }); } - let p_int = ((numerator as f64 / denominator as f64) * SCALE) as u64; + let p_int = ((f64::from(numerator) / f64::from(denominator)) * SCALE) as u64; Ok(Bernoulli { p_int }) } } @@ -111,7 +129,9 @@ impl Distribution<bool> for Bernoulli { #[inline] fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> bool { // Make sure to always return true for p = 1.0. - if self.p_int == ALWAYS_TRUE { return true; } + if self.p_int == ALWAYS_TRUE { + return true; + } let v: u64 = rng.gen(); v < self.p_int } @@ -119,9 +139,9 @@ impl Distribution<bool> for Bernoulli { #[cfg(test)] mod test { - use crate::Rng; - use crate::distributions::Distribution; use super::Bernoulli; + use crate::distributions::Distribution; + use crate::Rng; #[test] fn test_trivial() { @@ -137,7 +157,7 @@ mod test { } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_average() { const P: f64 = 0.3; const NUM: u32 = 3; @@ -161,6 +181,19 @@ mod test { assert!((avg1 - P).abs() < 5e-3); let avg2 = (sum2 as f64) / (N as f64); - assert!((avg2 - (NUM as f64)/(DENOM as f64)).abs() < 5e-3); + assert!((avg2 - (NUM as f64) / (DENOM as f64)).abs() < 5e-3); + } + + #[test] + fn value_stability() { + let mut rng = crate::test::rng(3); + let distr = Bernoulli::new(0.4532).unwrap(); + let mut buf = [false; 10]; + for x in &mut buf { + *x = rng.sample(&distr); + } + assert_eq!(buf, [ + true, false, false, true, false, false, true, true, true, true + ]); } } diff --git a/vendor/rand/src/distributions/binomial.rs b/vendor/rand/src/distributions/binomial.rs index 977e3ce026..c096e4a862 100644 --- a/vendor/rand/src/distributions/binomial.rs +++ b/vendor/rand/src/distributions/binomial.rs @@ -9,15 +9,16 @@ //! The binomial distribution. #![allow(deprecated)] +#![allow(clippy::all)] -use crate::Rng; use crate::distributions::{Distribution, Uniform}; +use crate::Rng; /// The binomial distribution `Binomial(n, p)`. /// /// This distribution has density function: /// `f(k) = n!/(k! (n-k)!) p^k (1-p)^(n-k)` for `k >= 0`. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Binomial { /// Number of trials. @@ -57,11 +58,7 @@ impl Distribution<u64> for Binomial { // The binomial distribution is symmetrical with respect to p -> 1-p, // k -> n-k switch p so that it is less than 0.5 - this allows for lower // expected values we will just invert the result at the end - let p = if self.p <= 0.5 { - self.p - } else { - 1.0 - self.p - }; + let p = if self.p <= 0.5 { self.p } else { 1.0 - self.p }; let result; let q = 1. - p; @@ -78,8 +75,7 @@ impl Distribution<u64> for Binomial { // Ranlib uses 30, and GSL uses 14. const BINV_THRESHOLD: f64 = 10.; - if (self.n as f64) * p < BINV_THRESHOLD && - self.n <= (::std::i32::MAX as u64) { + if (self.n as f64) * p < BINV_THRESHOLD && self.n <= (::std::i32::MAX as u64) { // Use the BINV algorithm. let s = p / q; let a = ((self.n + 1) as f64) * s; @@ -211,8 +207,8 @@ impl Distribution<u64> for Binomial { // Step 5.2: Squeezing. Check the value of ln(v) againts upper and // lower bound of ln(f(y)). let k = k as f64; - let rho = (k / npq) * ((k * (k / 3. + 0.625) + 1./6.) / npq + 0.5); - let t = -0.5 * k*k / npq; + let rho = (k / npq) * ((k * (k / 3. + 0.625) + 1. / 6.) / npq + 0.5); + let t = -0.5 * k * k / npq; let alpha = v.ln(); if alpha < t - rho { break; @@ -232,15 +228,19 @@ impl Distribution<u64> for Binomial { (13860. - (462. - (132. - (99. - 140. / a2) / a2) / a2) / a2) / a / 166320. } - if alpha > x_m * (f1 / x1).ln() - + (n - (m as f64) + 0.5) * (z / w).ln() - + ((y - m) as f64) * (w * p / (x1 * q)).ln() - // We use the signs from the GSL implementation, which are - // different than the ones in the reference. According to - // the GSL authors, the new signs were verified to be - // correct by one of the original designers of the - // algorithm. - + stirling(f1) + stirling(z) - stirling(x1) - stirling(w) + if alpha + > x_m * (f1 / x1).ln() + + (n - (m as f64) + 0.5) * (z / w).ln() + + ((y - m) as f64) * (w * p / (x1 * q)).ln() + // We use the signs from the GSL implementation, which are + // different than the ones in the reference. According to + // the GSL authors, the new signs were verified to be + // correct by one of the original designers of the + // algorithm. + + stirling(f1) + + stirling(z) + - stirling(x1) + - stirling(w) { continue; } @@ -262,9 +262,9 @@ impl Distribution<u64> for Binomial { #[cfg(test)] mod test { - use crate::Rng; - use crate::distributions::Distribution; use super::Binomial; + use crate::distributions::Distribution; + use crate::Rng; fn test_binomial_mean_and_variance<R: Rng>(n: u64, p: f64, rng: &mut R) { let binomial = Binomial::new(n, p); @@ -273,21 +273,30 @@ mod test { let expected_variance = n as f64 * p * (1.0 - p); let mut results = [0.0; 1000]; - for i in results.iter_mut() { *i = binomial.sample(rng) as f64; } + for i in results.iter_mut() { + *i = binomial.sample(rng) as f64; + } let mean = results.iter().sum::<f64>() / results.len() as f64; - assert!((mean as f64 - expected_mean).abs() < expected_mean / 50.0, - "mean: {}, expected_mean: {}", mean, expected_mean); + assert!( + (mean as f64 - expected_mean).abs() < expected_mean / 50.0, + "mean: {}, expected_mean: {}", + mean, + expected_mean + ); let variance = - results.iter().map(|x| (x - mean) * (x - mean)).sum::<f64>() - / results.len() as f64; - assert!((variance - expected_variance).abs() < expected_variance / 10.0, - "variance: {}, expected_variance: {}", variance, expected_variance); + results.iter().map(|x| (x - mean) * (x - mean)).sum::<f64>() / results.len() as f64; + assert!( + (variance - expected_variance).abs() < expected_variance / 10.0, + "variance: {}, expected_variance: {}", + variance, + expected_variance + ); } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_binomial() { let mut rng = crate::test::rng(351); test_binomial_mean_and_variance(150, 0.1, &mut rng); diff --git a/vendor/rand/src/distributions/cauchy.rs b/vendor/rand/src/distributions/cauchy.rs index 61ea95dd02..dc54c98a35 100644 --- a/vendor/rand/src/distributions/cauchy.rs +++ b/vendor/rand/src/distributions/cauchy.rs @@ -9,20 +9,21 @@ //! The Cauchy distribution. #![allow(deprecated)] +#![allow(clippy::all)] -use crate::Rng; use crate::distributions::Distribution; +use crate::Rng; use std::f64::consts::PI; /// The Cauchy distribution `Cauchy(median, scale)`. /// /// This distribution has a density function: /// `f(x) = 1 / (pi * scale * (1 + ((x - median) / scale)^2))` -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Cauchy { median: f64, - scale: f64 + scale: f64, } impl Cauchy { @@ -31,10 +32,7 @@ impl Cauchy { /// Panics if `scale <= 0`. pub fn new(median: f64, scale: f64) -> Cauchy { assert!(scale > 0.0, "Cauchy::new called with scale factor <= 0"); - Cauchy { - median, - scale - } + Cauchy { median, scale } } } @@ -53,8 +51,8 @@ impl Distribution<f64> for Cauchy { #[cfg(test)] mod test { - use crate::distributions::Distribution; use super::Cauchy; + use crate::distributions::Distribution; fn median(mut numbers: &mut [f64]) -> f64 { sort(&mut numbers); @@ -67,7 +65,6 @@ mod test { } #[test] - #[cfg(not(miri))] // Miri doesn't support transcendental functions fn test_cauchy_averages() { // NOTE: given that the variance and mean are undefined, // this test does not have any rigorous statistical meaning. diff --git a/vendor/rand/src/distributions/dirichlet.rs b/vendor/rand/src/distributions/dirichlet.rs index e935244612..a75678a850 100644 --- a/vendor/rand/src/distributions/dirichlet.rs +++ b/vendor/rand/src/distributions/dirichlet.rs @@ -9,17 +9,18 @@ //! The dirichlet distribution. #![allow(deprecated)] +#![allow(clippy::all)] -use crate::Rng; -use crate::distributions::Distribution; use crate::distributions::gamma::Gamma; +use crate::distributions::Distribution; +use crate::Rng; /// The dirichelet distribution `Dirichlet(alpha)`. /// /// The Dirichlet distribution is a family of continuous multivariate /// probability distributions parameterized by a vector alpha of positive reals. /// It is a multivariate generalization of the beta distribution. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Debug)] pub struct Dirichlet { /// Concentration parameters (alpha) @@ -31,7 +32,6 @@ impl Dirichlet { /// /// # Panics /// - if `alpha.len() < 2` - /// #[inline] pub fn new<V: Into<Vec<f64>>>(alpha: V) -> Dirichlet { let a = alpha.into(); @@ -48,7 +48,6 @@ impl Dirichlet { /// # Panics /// - if `alpha <= 0.0` /// - if `size < 2` - /// #[inline] pub fn new_with_param(alpha: f64, size: usize) -> Dirichlet { assert!(alpha > 0.0); diff --git a/vendor/rand/src/distributions/exponential.rs b/vendor/rand/src/distributions/exponential.rs index 3859af6556..5fdf7aa74f 100644 --- a/vendor/rand/src/distributions/exponential.rs +++ b/vendor/rand/src/distributions/exponential.rs @@ -10,9 +10,9 @@ //! The exponential distribution. #![allow(deprecated)] -use crate::{Rng}; -use crate::distributions::{ziggurat_tables, Distribution}; use crate::distributions::utils::ziggurat; +use crate::distributions::{ziggurat_tables, Distribution}; +use crate::Rng; /// Samples floating-point numbers according to the exponential distribution, /// with rate parameter `λ = 1`. This is equivalent to `Exp::new(1.0)` or @@ -28,7 +28,7 @@ use crate::distributions::utils::ziggurat; /// Generate Normal Random Samples*]( /// https://www.doornik.com/research/ziggurat.pdf). /// Nuffield College, Oxford -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Exp1; @@ -45,10 +45,14 @@ impl Distribution<f64> for Exp1 { ziggurat_tables::ZIG_EXP_R - rng.gen::<f64>().ln() } - ziggurat(rng, false, - &ziggurat_tables::ZIG_EXP_X, - &ziggurat_tables::ZIG_EXP_F, - pdf, zero_case) + ziggurat( + rng, + false, + &ziggurat_tables::ZIG_EXP_X, + &ziggurat_tables::ZIG_EXP_F, + pdf, + zero_case, + ) } } @@ -56,13 +60,13 @@ impl Distribution<f64> for Exp1 { /// /// This distribution has density function: `f(x) = lambda * exp(-lambda * x)` /// for `x > 0`. -/// -/// Note that [`Exp1`][crate::distributions::Exp1] is an optimised implementation for `lambda = 1`. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +/// +/// Note that [`Exp1`](crate::distributions::Exp1) is an optimised implementation for `lambda = 1`. +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Exp { /// `lambda` stored as `1/lambda`, since this is what we scale by. - lambda_inverse: f64 + lambda_inverse: f64, } impl Exp { @@ -71,7 +75,9 @@ impl Exp { #[inline] pub fn new(lambda: f64) -> Exp { assert!(lambda > 0.0, "Exp::new called with `lambda` <= 0"); - Exp { lambda_inverse: 1.0 / lambda } + Exp { + lambda_inverse: 1.0 / lambda, + } } } @@ -84,8 +90,8 @@ impl Distribution<f64> for Exp { #[cfg(test)] mod test { - use crate::distributions::Distribution; use super::Exp; + use crate::distributions::Distribution; #[test] fn test_exp() { diff --git a/vendor/rand/src/distributions/float.rs b/vendor/rand/src/distributions/float.rs index ca1e79d341..0a45f39774 100644 --- a/vendor/rand/src/distributions/float.rs +++ b/vendor/rand/src/distributions/float.rs @@ -8,18 +8,17 @@ //! Basic floating-point number distributions -use core::mem; -use crate::Rng; -use crate::distributions::{Distribution, Standard}; use crate::distributions::utils::FloatSIMDUtils; -#[cfg(feature="simd_support")] -use packed_simd::*; +use crate::distributions::{Distribution, Standard}; +use crate::Rng; +use core::mem; +#[cfg(feature = "simd_support")] use packed_simd::*; /// A distribution to sample floating point numbers uniformly in the half-open /// interval `(0, 1]`, i.e. including 1 but not 0. /// /// All values that can be generated are of the form `n * ε/2`. For `f32` -/// the 23 most significant random bits of a `u32` are used and for `f64` the +/// the 24 most significant random bits of a `u32` are used and for `f64` the /// 53 most significant bits of a `u64` are used. The conversion uses the /// multiplicative method. /// @@ -46,7 +45,7 @@ pub struct OpenClosed01; /// interval `(0, 1)`, i.e. not including either endpoint. /// /// All values that can be generated are of the form `n * ε + ε/2`. For `f32` -/// the 22 most significant random bits of an `u32` are used, for `f64` 52 from +/// the 23 most significant random bits of an `u32` are used, for `f64` 52 from /// an `u64`. The conversion uses a transmute-based method. /// /// See also: [`Standard`] which samples from `[0, 1)`, [`OpenClosed01`] @@ -95,9 +94,7 @@ macro_rules! float_impls { // The exponent is encoded using an offset-binary representation let exponent_bits: $u_scalar = (($exponent_bias + exponent) as $u_scalar) << $fraction_bits; - // TODO: use from_bits when min compiler > 1.25 (see #545) - // $ty::from_bits(self | exponent_bits) - unsafe{ mem::transmute(self | exponent_bits) } + $ty::from_bits(self | exponent_bits) } } @@ -151,30 +148,27 @@ macro_rules! float_impls { float_impls! { f32, u32, f32, u32, 23, 127 } float_impls! { f64, u64, f64, u64, 52, 1023 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] float_impls! { f32x2, u32x2, f32, u32, 23, 127 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] float_impls! { f32x4, u32x4, f32, u32, 23, 127 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] float_impls! { f32x8, u32x8, f32, u32, 23, 127 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] float_impls! { f32x16, u32x16, f32, u32, 23, 127 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] float_impls! { f64x2, u64x2, f64, u64, 52, 1023 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] float_impls! { f64x4, u64x4, f64, u64, 52, 1023 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] float_impls! { f64x8, u64x8, f64, u64, 52, 1023 } #[cfg(test)] mod tests { - use crate::Rng; - use crate::distributions::{Open01, OpenClosed01}; + use super::*; use crate::rngs::mock::StepRng; - #[cfg(feature="simd_support")] - use packed_simd::*; const EPSILON32: f32 = ::core::f32::EPSILON; const EPSILON64: f64 = ::core::f64::EPSILON; @@ -193,8 +187,7 @@ mod tests { // OpenClosed01 let mut zeros = StepRng::new(0, 0); - assert_eq!(zeros.sample::<$ty, _>(OpenClosed01), - 0.0 + $EPSILON / 2.0); + assert_eq!(zeros.sample::<$ty, _>(OpenClosed01), 0.0 + $EPSILON / 2.0); let mut one = StepRng::new(1 << 8 | 1 << (8 + 32), 0); assert_eq!(one.sample::<$ty, _>(OpenClosed01), $EPSILON); let mut max = StepRng::new(!0, 0); @@ -208,16 +201,16 @@ mod tests { let mut max = StepRng::new(!0, 0); assert_eq!(max.sample::<$ty, _>(Open01), 1.0 - $EPSILON / 2.0); } - } + }; } test_f32! { f32_edge_cases, f32, 0.0, EPSILON32 } - #[cfg(feature="simd_support")] + #[cfg(feature = "simd_support")] test_f32! { f32x2_edge_cases, f32x2, f32x2::splat(0.0), f32x2::splat(EPSILON32) } - #[cfg(feature="simd_support")] + #[cfg(feature = "simd_support")] test_f32! { f32x4_edge_cases, f32x4, f32x4::splat(0.0), f32x4::splat(EPSILON32) } - #[cfg(feature="simd_support")] + #[cfg(feature = "simd_support")] test_f32! { f32x8_edge_cases, f32x8, f32x8::splat(0.0), f32x8::splat(EPSILON32) } - #[cfg(feature="simd_support")] + #[cfg(feature = "simd_support")] test_f32! { f32x16_edge_cases, f32x16, f32x16::splat(0.0), f32x16::splat(EPSILON32) } macro_rules! test_f64 { @@ -234,8 +227,7 @@ mod tests { // OpenClosed01 let mut zeros = StepRng::new(0, 0); - assert_eq!(zeros.sample::<$ty, _>(OpenClosed01), - 0.0 + $EPSILON / 2.0); + assert_eq!(zeros.sample::<$ty, _>(OpenClosed01), 0.0 + $EPSILON / 2.0); let mut one = StepRng::new(1 << 11, 0); assert_eq!(one.sample::<$ty, _>(OpenClosed01), $EPSILON); let mut max = StepRng::new(!0, 0); @@ -249,13 +241,67 @@ mod tests { let mut max = StepRng::new(!0, 0); assert_eq!(max.sample::<$ty, _>(Open01), 1.0 - $EPSILON / 2.0); } - } + }; } test_f64! { f64_edge_cases, f64, 0.0, EPSILON64 } - #[cfg(feature="simd_support")] + #[cfg(feature = "simd_support")] test_f64! { f64x2_edge_cases, f64x2, f64x2::splat(0.0), f64x2::splat(EPSILON64) } - #[cfg(feature="simd_support")] + #[cfg(feature = "simd_support")] test_f64! { f64x4_edge_cases, f64x4, f64x4::splat(0.0), f64x4::splat(EPSILON64) } - #[cfg(feature="simd_support")] + #[cfg(feature = "simd_support")] test_f64! { f64x8_edge_cases, f64x8, f64x8::splat(0.0), f64x8::splat(EPSILON64) } + + #[test] + fn value_stability() { + fn test_samples<T: Copy + core::fmt::Debug + PartialEq, D: Distribution<T>>( + distr: &D, zero: T, expected: &[T], + ) { + let mut rng = crate::test::rng(0x6f44f5646c2a7334); + let mut buf = [zero; 3]; + for x in &mut buf { + *x = rng.sample(&distr); + } + assert_eq!(&buf, expected); + } + + test_samples(&Standard, 0f32, &[0.0035963655, 0.7346052, 0.09778172]); + test_samples(&Standard, 0f64, &[ + 0.7346051961657583, + 0.20298547462974248, + 0.8166436635290655, + ]); + + test_samples(&OpenClosed01, 0f32, &[0.003596425, 0.73460525, 0.09778178]); + test_samples(&OpenClosed01, 0f64, &[ + 0.7346051961657584, + 0.2029854746297426, + 0.8166436635290656, + ]); + + test_samples(&Open01, 0f32, &[0.0035963655, 0.73460525, 0.09778172]); + test_samples(&Open01, 0f64, &[ + 0.7346051961657584, + 0.20298547462974248, + 0.8166436635290656, + ]); + + #[cfg(feature = "simd_support")] + { + // We only test a sub-set of types here. Values are identical to + // non-SIMD types; we assume this pattern continues across all + // SIMD types. + + test_samples(&Standard, f32x2::new(0.0, 0.0), &[ + f32x2::new(0.0035963655, 0.7346052), + f32x2::new(0.09778172, 0.20298547), + f32x2::new(0.34296435, 0.81664366), + ]); + + test_samples(&Standard, f64x2::new(0.0, 0.0), &[ + f64x2::new(0.7346051961657583, 0.20298547462974248), + f64x2::new(0.8166436635290655, 0.7423708925400552), + f64x2::new(0.16387782224016323, 0.9087068770169618), + ]); + } + } } diff --git a/vendor/rand/src/distributions/gamma.rs b/vendor/rand/src/distributions/gamma.rs index b5a97f52fa..f19738dbe8 100644 --- a/vendor/rand/src/distributions/gamma.rs +++ b/vendor/rand/src/distributions/gamma.rs @@ -10,12 +10,12 @@ //! The Gamma and derived distributions. #![allow(deprecated)] -use self::GammaRepr::*; use self::ChiSquaredRepr::*; +use self::GammaRepr::*; -use crate::Rng; use crate::distributions::normal::StandardNormal; use crate::distributions::{Distribution, Exp, Open01}; +use crate::Rng; /// The Gamma distribution `Gamma(shape, scale)` distribution. /// @@ -37,7 +37,7 @@ use crate::distributions::{Distribution, Exp, Open01}; /// Generating Gamma Variables" *ACM Trans. Math. Softw.* 26, 3 /// (September 2000), 363-372. /// DOI:[10.1145/358407.358414](https://doi.acm.org/10.1145/358407.358414) -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Gamma { repr: GammaRepr, @@ -47,7 +47,7 @@ pub struct Gamma { enum GammaRepr { Large(GammaLargeShape), One(Exp), - Small(GammaSmallShape) + Small(GammaSmallShape), } // These two helpers could be made public, but saving the @@ -67,7 +67,7 @@ enum GammaRepr { #[derive(Clone, Copy, Debug)] struct GammaSmallShape { inv_shape: f64, - large_shape: GammaLargeShape + large_shape: GammaLargeShape, } /// Gamma distribution where the shape parameter is larger than 1. @@ -78,7 +78,7 @@ struct GammaSmallShape { struct GammaLargeShape { scale: f64, c: f64, - d: f64 + d: f64, } impl Gamma { @@ -106,7 +106,7 @@ impl GammaSmallShape { fn new_raw(shape: f64, scale: f64) -> GammaSmallShape { GammaSmallShape { inv_shape: 1. / shape, - large_shape: GammaLargeShape::new_raw(shape + 1.0, scale) + large_shape: GammaLargeShape::new_raw(shape + 1.0, scale), } } } @@ -117,7 +117,7 @@ impl GammaLargeShape { GammaLargeShape { scale, c: 1. / (9. * d).sqrt(), - d + d, } } } @@ -143,17 +143,19 @@ impl Distribution<f64> for GammaLargeShape { loop { let x = rng.sample(StandardNormal); let v_cbrt = 1.0 + self.c * x; - if v_cbrt <= 0.0 { // a^3 <= 0 iff a <= 0 - continue + if v_cbrt <= 0.0 { + // a^3 <= 0 iff a <= 0 + continue; } let v = v_cbrt * v_cbrt * v_cbrt; let u: f64 = rng.sample(Open01); let x_sqr = x * x; - if u < 1.0 - 0.0331 * x_sqr * x_sqr || - u.ln() < 0.5 * x_sqr + self.d * (1.0 - v + v.ln()) { - return self.d * v * self.scale + if u < 1.0 - 0.0331 * x_sqr * x_sqr + || u.ln() < 0.5 * x_sqr + self.d * (1.0 - v + v.ln()) + { + return self.d * v * self.scale; } } } @@ -166,7 +168,7 @@ impl Distribution<f64> for GammaLargeShape { /// of `k` independent standard normal random variables. For other /// `k`, this uses the equivalent characterisation /// `χ²(k) = Gamma(k/2, 2)`. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct ChiSquared { repr: ChiSquaredRepr, @@ -202,7 +204,7 @@ impl Distribution<f64> for ChiSquared { let norm = rng.sample(StandardNormal); norm * norm } - DoFAnythingElse(ref g) => g.sample(rng) + DoFAnythingElse(ref g) => g.sample(rng), } } } @@ -212,7 +214,7 @@ impl Distribution<f64> for ChiSquared { /// This distribution is equivalent to the ratio of two normalised /// chi-squared distributions, that is, `F(m,n) = (χ²(m)/m) / /// (χ²(n)/n)`. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct FisherF { numer: ChiSquared, @@ -232,7 +234,7 @@ impl FisherF { FisherF { numer: ChiSquared::new(m), denom: ChiSquared::new(n), - dof_ratio: n / m + dof_ratio: n / m, } } } @@ -244,11 +246,11 @@ impl Distribution<f64> for FisherF { /// The Student t distribution, `t(nu)`, where `nu` is the degrees of /// freedom. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct StudentT { chi: ChiSquared, - dof: f64 + dof: f64, } impl StudentT { @@ -258,7 +260,7 @@ impl StudentT { assert!(n > 0.0, "StudentT::new called with `n <= 0`"); StudentT { chi: ChiSquared::new(n), - dof: n + dof: n, } } } @@ -270,7 +272,7 @@ impl Distribution<f64> for StudentT { } /// The Beta distribution with shape parameters `alpha` and `beta`. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Beta { gamma_a: Gamma, @@ -301,8 +303,8 @@ impl Distribution<f64> for Beta { #[cfg(test)] mod test { + use super::{Beta, ChiSquared, FisherF, StudentT}; use crate::distributions::Distribution; - use super::{Beta, ChiSquared, StudentT, FisherF}; const N: u32 = 100; diff --git a/vendor/rand/src/distributions/integer.rs b/vendor/rand/src/distributions/integer.rs index 31eb237e9f..f2db1f1c62 100644 --- a/vendor/rand/src/distributions/integer.rs +++ b/vendor/rand/src/distributions/integer.rs @@ -8,16 +8,14 @@ //! The implementations of the `Standard` distribution for integer types. -use crate::{Rng}; use crate::distributions::{Distribution, Standard}; -use core::num::{NonZeroU8, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroUsize}; -#[cfg(not(target_os = "emscripten"))] use core::num::NonZeroU128; -#[cfg(feature="simd_support")] -use packed_simd::*; -#[cfg(all(target_arch = "x86", feature="nightly"))] -use core::arch::x86::*; -#[cfg(all(target_arch = "x86_64", feature="nightly"))] +use crate::Rng; +#[cfg(all(target_arch = "x86", feature = "nightly"))] use core::arch::x86::*; +#[cfg(all(target_arch = "x86_64", feature = "nightly"))] use core::arch::x86_64::*; +#[cfg(not(target_os = "emscripten"))] use core::num::NonZeroU128; +use core::num::{NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize}; +#[cfg(feature = "simd_support")] use packed_simd::*; impl Distribution<u8> for Standard { #[inline] @@ -52,8 +50,8 @@ impl Distribution<u128> for Standard { #[inline] fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> u128 { // Use LE; we explicitly generate one value before the next. - let x = rng.next_u64() as u128; - let y = rng.next_u64() as u128; + let x = u128::from(rng.next_u64()); + let y = u128::from(rng.next_u64()); (y << 64) | x } } @@ -80,14 +78,15 @@ macro_rules! impl_int_from_uint { rng.gen::<$uty>() as $ty } } - } + }; } impl_int_from_uint! { i8, u8 } impl_int_from_uint! { i16, u16 } impl_int_from_uint! { i32, u32 } impl_int_from_uint! { i64, u64 } -#[cfg(not(target_os = "emscripten"))] impl_int_from_uint! { i128, u128 } +#[cfg(not(target_os = "emscripten"))] +impl_int_from_uint! { i128, u128 } impl_int_from_uint! { isize, usize } macro_rules! impl_nzint { @@ -101,17 +100,18 @@ macro_rules! impl_nzint { } } } - } + }; } impl_nzint!(NonZeroU8, NonZeroU8::new); impl_nzint!(NonZeroU16, NonZeroU16::new); impl_nzint!(NonZeroU32, NonZeroU32::new); impl_nzint!(NonZeroU64, NonZeroU64::new); -#[cfg(not(target_os = "emscripten"))] impl_nzint!(NonZeroU128, NonZeroU128::new); +#[cfg(not(target_os = "emscripten"))] +impl_nzint!(NonZeroU128, NonZeroU128::new); impl_nzint!(NonZeroUsize, NonZeroUsize::new); -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] macro_rules! simd_impl { ($(($intrinsic:ident, $vec:ty),)+) => {$( impl Distribution<$intrinsic> for Standard { @@ -141,30 +141,33 @@ macro_rules! simd_impl { }; } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] simd_impl!(16, u8x2, i8x2,); -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] simd_impl!(32, u8x4, i8x4, u16x2, i16x2,); -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] simd_impl!(64, u8x8, i8x8, u16x4, i16x4, u32x2, i32x2,); -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] simd_impl!(128, u8x16, i8x16, u16x8, i16x8, u32x4, i32x4, u64x2, i64x2,); -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] simd_impl!(256, u8x32, i8x32, u16x16, i16x16, u32x8, i32x8, u64x4, i64x4,); -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] simd_impl!(512, u8x64, i8x64, u16x32, i16x32, u32x16, i32x16, u64x8, i64x8,); -#[cfg(all(feature="simd_support", feature="nightly", any(target_arch="x86", target_arch="x86_64")))] +#[cfg(all( + feature = "simd_support", + feature = "nightly", + any(target_arch = "x86", target_arch = "x86_64") +))] simd_impl!((__m64, u8x8), (__m128i, u8x16), (__m256i, u8x32),); #[cfg(test)] mod tests { - use crate::Rng; - use crate::distributions::{Standard}; - + use super::*; + #[test] fn test_integers() { let mut rng = crate::test::rng(806); - + rng.sample::<isize, _>(Standard); rng.sample::<i8, _>(Standard); rng.sample::<i16, _>(Standard); @@ -172,7 +175,7 @@ mod tests { rng.sample::<i64, _>(Standard); #[cfg(not(target_os = "emscripten"))] rng.sample::<i128, _>(Standard); - + rng.sample::<usize, _>(Standard); rng.sample::<u8, _>(Standard); rng.sample::<u16, _>(Standard); @@ -181,4 +184,96 @@ mod tests { #[cfg(not(target_os = "emscripten"))] rng.sample::<u128, _>(Standard); } + + #[test] + fn value_stability() { + fn test_samples<T: Copy + core::fmt::Debug + PartialEq>(zero: T, expected: &[T]) + where Standard: Distribution<T> { + let mut rng = crate::test::rng(807); + let mut buf = [zero; 3]; + for x in &mut buf { + *x = rng.sample(Standard); + } + assert_eq!(&buf, expected); + } + + test_samples(0u8, &[9, 247, 111]); + test_samples(0u16, &[32265, 42999, 38255]); + test_samples(0u32, &[2220326409, 2575017975, 2018088303]); + test_samples(0u64, &[ + 11059617991457472009, + 16096616328739788143, + 1487364411147516184, + ]); + test_samples(0u128, &[ + 296930161868957086625409848350820761097, + 145644820879247630242265036535529306392, + 111087889832015897993126088499035356354, + ]); + #[cfg(any(target_pointer_width = "32", target_pointer_width = "16"))] + test_samples(0usize, &[2220326409, 2575017975, 2018088303]); + #[cfg(target_pointer_width = "64")] + test_samples(0usize, &[ + 11059617991457472009, + 16096616328739788143, + 1487364411147516184, + ]); + + test_samples(0i8, &[9, -9, 111]); + // Skip further i* types: they are simple reinterpretation of u* samples + + #[cfg(feature = "simd_support")] + { + // We only test a sub-set of types here and make assumptions about the rest. + + test_samples(u8x2::default(), &[ + u8x2::new(9, 126), + u8x2::new(247, 167), + u8x2::new(111, 149), + ]); + test_samples(u8x4::default(), &[ + u8x4::new(9, 126, 87, 132), + u8x4::new(247, 167, 123, 153), + u8x4::new(111, 149, 73, 120), + ]); + test_samples(u8x8::default(), &[ + u8x8::new(9, 126, 87, 132, 247, 167, 123, 153), + u8x8::new(111, 149, 73, 120, 68, 171, 98, 223), + u8x8::new(24, 121, 1, 50, 13, 46, 164, 20), + ]); + + test_samples(i64x8::default(), &[ + i64x8::new( + -7387126082252079607, + -2350127744969763473, + 1487364411147516184, + 7895421560427121838, + 602190064936008898, + 6022086574635100741, + -5080089175222015595, + -4066367846667249123, + ), + i64x8::new( + 9180885022207963908, + 3095981199532211089, + 6586075293021332726, + 419343203796414657, + 3186951873057035255, + 5287129228749947252, + 444726432079249540, + -1587028029513790706, + ), + i64x8::new( + 6075236523189346388, + 1351763722368165432, + -6192309979959753740, + -7697775502176768592, + -4482022114172078123, + 7522501477800909500, + -1837258847956201231, + -586926753024886735, + ), + ]); + } + } } diff --git a/vendor/rand/src/distributions/mod.rs b/vendor/rand/src/distributions/mod.rs index 693e0f97fe..4e1b1a6e3a 100644 --- a/vendor/rand/src/distributions/mod.rs +++ b/vendor/rand/src/distributions/mod.rs @@ -31,17 +31,17 @@ //! # The `Standard` distribution //! //! The [`Standard`] distribution is important to mention. This is the -//! distribution used by [`Rng::gen()`] and represents the "default" way to +//! distribution used by [`Rng::gen`] and represents the "default" way to //! produce a random value for many different types, including most primitive //! types, tuples, arrays, and a few derived types. See the documentation of //! [`Standard`] for more details. //! //! Implementing `Distribution<T>` for [`Standard`] for user types `T` makes it -//! possible to generate type `T` with [`Rng::gen()`], and by extension also -//! with the [`random()`] function. +//! possible to generate type `T` with [`Rng::gen`], and by extension also +//! with the [`random`] function. //! //! ## Random characters -//! +//! //! [`Alphanumeric`] is a simple distribution to sample random letters and //! numbers of the `char` type; in contrast [`Standard`] may sample any valid //! `char`. @@ -89,78 +89,83 @@ //! [`rand_distr`]: https://crates.io/crates/rand_distr //! [`statrs`]: https://crates.io/crates/statrs -//! [`Alphanumeric`]: distributions::Alphanumeric -//! [`Bernoulli`]: distributions::Bernoulli -//! [`Open01`]: distributions::Open01 -//! [`OpenClosed01`]: distributions::OpenClosed01 -//! [`Standard`]: distributions::Standard -//! [`Uniform`]: distributions::Uniform -//! [`Uniform::new`]: distributions::Uniform::new -//! [`Uniform::new_inclusive`]: distributions::Uniform::new_inclusive -//! [`weighted`]: distributions::weighted +//! [`random`]: crate::random //! [`rand_distr`]: https://crates.io/crates/rand_distr //! [`statrs`]: https://crates.io/crates/statrs -use core::iter; use crate::Rng; +use core::iter; +pub use self::bernoulli::{Bernoulli, BernoulliError}; +pub use self::float::{Open01, OpenClosed01}; pub use self::other::Alphanumeric; #[doc(inline)] pub use self::uniform::Uniform; -pub use self::float::{OpenClosed01, Open01}; -pub use self::bernoulli::{Bernoulli, BernoulliError}; -#[cfg(feature="alloc")] pub use self::weighted::{WeightedIndex, WeightedError}; +#[cfg(feature = "alloc")] +pub use self::weighted::{WeightedError, WeightedIndex}; // The following are all deprecated after being moved to rand_distr #[allow(deprecated)] -#[cfg(feature="std")] pub use self::unit_sphere::UnitSphereSurface; +#[cfg(feature = "std")] +pub use self::binomial::Binomial; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::unit_circle::UnitCircle; +#[cfg(feature = "std")] +pub use self::cauchy::Cauchy; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::gamma::{Gamma, ChiSquared, FisherF, - StudentT, Beta}; +#[cfg(feature = "std")] +pub use self::dirichlet::Dirichlet; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::normal::{Normal, LogNormal, StandardNormal}; +#[cfg(feature = "std")] +pub use self::exponential::{Exp, Exp1}; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::exponential::{Exp, Exp1}; +#[cfg(feature = "std")] +pub use self::gamma::{Beta, ChiSquared, FisherF, Gamma, StudentT}; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::pareto::Pareto; +#[cfg(feature = "std")] +pub use self::normal::{LogNormal, Normal, StandardNormal}; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::poisson::Poisson; +#[cfg(feature = "std")] +pub use self::pareto::Pareto; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::binomial::Binomial; +#[cfg(feature = "std")] +pub use self::poisson::Poisson; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::cauchy::Cauchy; +#[cfg(feature = "std")] +pub use self::triangular::Triangular; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::dirichlet::Dirichlet; +#[cfg(feature = "std")] +pub use self::unit_circle::UnitCircle; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::triangular::Triangular; +#[cfg(feature = "std")] +pub use self::unit_sphere::UnitSphereSurface; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::weibull::Weibull; +#[cfg(feature = "std")] +pub use self::weibull::Weibull; -pub mod uniform; mod bernoulli; -#[cfg(feature="alloc")] pub mod weighted; -#[cfg(feature="std")] mod unit_sphere; -#[cfg(feature="std")] mod unit_circle; -#[cfg(feature="std")] mod gamma; -#[cfg(feature="std")] mod normal; -#[cfg(feature="std")] mod exponential; -#[cfg(feature="std")] mod pareto; -#[cfg(feature="std")] mod poisson; -#[cfg(feature="std")] mod binomial; -#[cfg(feature="std")] mod cauchy; -#[cfg(feature="std")] mod dirichlet; -#[cfg(feature="std")] mod triangular; -#[cfg(feature="std")] mod weibull; +#[cfg(feature = "std")] mod binomial; +#[cfg(feature = "std")] mod cauchy; +#[cfg(feature = "std")] mod dirichlet; +#[cfg(feature = "std")] mod exponential; +#[cfg(feature = "std")] mod gamma; +#[cfg(feature = "std")] mod normal; +#[cfg(feature = "std")] mod pareto; +#[cfg(feature = "std")] mod poisson; +#[cfg(feature = "std")] mod triangular; +pub mod uniform; +#[cfg(feature = "std")] mod unit_circle; +#[cfg(feature = "std")] mod unit_sphere; +#[cfg(feature = "std")] mod weibull; +#[cfg(feature = "alloc")] pub mod weighted; mod float; -#[doc(hidden)] pub mod hidden_export { - pub use super::float::IntoFloat; // used by rand_distr +#[doc(hidden)] +pub mod hidden_export { + pub use super::float::IntoFloat; // used by rand_distr } mod integer; mod other; mod utils; -#[cfg(feature="std")] mod ziggurat_tables; +#[cfg(feature = "std")] mod ziggurat_tables; /// Types (distributions) that can be used to create a random instance of `T`. /// @@ -173,6 +178,12 @@ mod utils; /// advantage of not needing to consider thread safety, and for most /// distributions efficient state-less sampling algorithms are available. /// +/// Implementations are typically expected to be portable with reproducible +/// results when used with a PRNG with fixed seed; see the +/// [portability chapter](https://rust-random.github.io/book/portability.html) +/// of The Rust Rand Book. In some cases this does not apply, e.g. the `usize` +/// type requires different sampling on 32-bit and 64-bit machines. +/// /// [`sample_iter`]: Distribution::method.sample_iter pub trait Distribution<T> { /// Generate a random value of `T`, using `rng` as the source of randomness. @@ -209,11 +220,13 @@ pub trait Distribution<T> { /// } /// ``` fn sample_iter<R>(self, rng: R) -> DistIter<Self, R, T> - where R: Rng, Self: Sized + where + R: Rng, + Self: Sized, { DistIter { distr: self, - rng: rng, + rng, phantom: ::core::marker::PhantomData, } } @@ -241,7 +254,9 @@ pub struct DistIter<D, R, T> { } impl<D, R, T> Iterator for DistIter<D, R, T> - where D: Distribution<T>, R: Rng +where + D: Distribution<T>, + R: Rng, { type Item = T; @@ -259,11 +274,19 @@ impl<D, R, T> Iterator for DistIter<D, R, T> } impl<D, R, T> iter::FusedIterator for DistIter<D, R, T> - where D: Distribution<T>, R: Rng {} +where + D: Distribution<T>, + R: Rng, +{ +} #[cfg(features = "nightly")] impl<D, R, T> iter::TrustedLen for DistIter<D, R, T> - where D: Distribution<T>, R: Rng {} +where + D: Distribution<T>, + R: Rng, +{ +} /// A generic random value distribution, implemented for many primitive types. @@ -331,7 +354,7 @@ impl<D, R, T> iter::TrustedLen for DistIter<D, R, T> /// the half-open interval `[0, 1)`, i.e. including 0 but not 1. /// /// All values that can be generated are of the form `n * ε/2`. For `f32` -/// the 23 most significant random bits of a `u32` are used and for `f64` the +/// the 24 most significant random bits of a `u32` are used and for `f64` the /// 53 most significant bits of a `u64` are used. The conversion uses the /// multiplicative method: `(rng.gen::<$uty>() >> N) as $ty * (ε/2)`. /// @@ -349,8 +372,8 @@ pub struct Standard; #[cfg(all(test, feature = "std"))] mod tests { - use crate::Rng; use super::{Distribution, Uniform}; + use crate::Rng; #[test] fn test_distributions_iter() { @@ -360,16 +383,18 @@ mod tests { let results: Vec<f32> = distr.sample_iter(&mut rng).take(100).collect(); println!("{:?}", results); } - + #[test] fn test_make_an_iter() { - fn ten_dice_rolls_other_than_five<'a, R: Rng>(rng: &'a mut R) -> impl Iterator<Item = i32> + 'a { + fn ten_dice_rolls_other_than_five<'a, R: Rng>( + rng: &'a mut R, + ) -> impl Iterator<Item = i32> + 'a { Uniform::new_inclusive(1, 6) .sample_iter(rng) .filter(|x| *x != 5) .take(10) } - + let mut rng = crate::test::rng(211); let mut count = 0; for val in ten_dice_rolls_other_than_five(&mut rng) { diff --git a/vendor/rand/src/distributions/normal.rs b/vendor/rand/src/distributions/normal.rs index 7808bafee8..ec62fa9abe 100644 --- a/vendor/rand/src/distributions/normal.rs +++ b/vendor/rand/src/distributions/normal.rs @@ -10,9 +10,9 @@ //! The normal and derived distributions. #![allow(deprecated)] -use crate::Rng; -use crate::distributions::{ziggurat_tables, Distribution, Open01}; use crate::distributions::utils::ziggurat; +use crate::distributions::{ziggurat_tables, Distribution, Open01}; +use crate::Rng; /// Samples floating-point numbers according to the normal distribution /// `N(0, 1)` (a.k.a. a standard normal, or Gaussian). This is equivalent to @@ -26,7 +26,7 @@ use crate::distributions::utils::ziggurat; /// Generate Normal Random Samples*]( /// https://www.doornik.com/research/ziggurat.pdf). /// Nuffield College, Oxford -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct StandardNormal; @@ -34,7 +34,7 @@ impl Distribution<f64> for StandardNormal { fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 { #[inline] fn pdf(x: f64) -> f64 { - (-x*x/2.0).exp() + (-x * x / 2.0).exp() } #[inline] fn zero_case<R: Rng + ?Sized>(rng: &mut R, u: f64) -> f64 { @@ -55,13 +55,21 @@ impl Distribution<f64> for StandardNormal { y = y_.ln(); } - if u < 0.0 { x - ziggurat_tables::ZIG_NORM_R } else { ziggurat_tables::ZIG_NORM_R - x } + if u < 0.0 { + x - ziggurat_tables::ZIG_NORM_R + } else { + ziggurat_tables::ZIG_NORM_R - x + } } - ziggurat(rng, true, // this is symmetric - &ziggurat_tables::ZIG_NORM_X, - &ziggurat_tables::ZIG_NORM_F, - pdf, zero_case) + ziggurat( + rng, + true, // this is symmetric + &ziggurat_tables::ZIG_NORM_X, + &ziggurat_tables::ZIG_NORM_F, + pdf, + zero_case, + ) } } @@ -69,12 +77,12 @@ impl Distribution<f64> for StandardNormal { /// /// This uses the ZIGNOR variant of the Ziggurat method, see [`StandardNormal`] /// for more details. -/// +/// /// Note that [`StandardNormal`] is an optimised implementation for mean 0, and /// standard deviation 1. /// /// [`StandardNormal`]: crate::distributions::StandardNormal -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Normal { mean: f64, @@ -91,10 +99,7 @@ impl Normal { #[inline] pub fn new(mean: f64, std_dev: f64) -> Normal { assert!(std_dev >= 0.0, "Normal::new called with `std_dev` < 0"); - Normal { - mean, - std_dev - } + Normal { mean, std_dev } } } impl Distribution<f64> for Normal { @@ -109,10 +114,10 @@ impl Distribution<f64> for Normal { /// /// If `X` is log-normal distributed, then `ln(X)` is `N(mean, std_dev**2)` /// distributed. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct LogNormal { - norm: Normal + norm: Normal, } impl LogNormal { @@ -125,7 +130,9 @@ impl LogNormal { #[inline] pub fn new(mean: f64, std_dev: f64) -> LogNormal { assert!(std_dev >= 0.0, "LogNormal::new called with `std_dev` < 0"); - LogNormal { norm: Normal::new(mean, std_dev) } + LogNormal { + norm: Normal::new(mean, std_dev), + } } } impl Distribution<f64> for LogNormal { @@ -136,8 +143,8 @@ impl Distribution<f64> for LogNormal { #[cfg(test)] mod tests { + use super::{LogNormal, Normal}; use crate::distributions::Distribution; - use super::{Normal, LogNormal}; #[test] fn test_normal() { diff --git a/vendor/rand/src/distributions/other.rs b/vendor/rand/src/distributions/other.rs index a3af1dc841..c95060e510 100644 --- a/vendor/rand/src/distributions/other.rs +++ b/vendor/rand/src/distributions/other.rs @@ -11,21 +11,21 @@ use core::char; use core::num::Wrapping; -use crate::{Rng}; use crate::distributions::{Distribution, Standard, Uniform}; +use crate::Rng; // ----- Sampling distributions ----- /// Sample a `char`, uniformly distributed over ASCII letters and numbers: /// a-z, A-Z and 0-9. -/// +/// /// # Example /// /// ``` /// use std::iter; /// use rand::{Rng, thread_rng}; /// use rand::distributions::Alphanumeric; -/// +/// /// let mut rng = thread_rng(); /// let chars: String = iter::repeat(()) /// .map(|()| rng.sample(Alphanumeric)) @@ -63,8 +63,7 @@ impl Distribution<char> for Standard { impl Distribution<char> for Alphanumeric { fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> char { const RANGE: u32 = 26 + 26 + 10; - const GEN_ASCII_STR_CHARSET: &[u8] = - b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\ + const GEN_ASCII_STR_CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\ abcdefghijklmnopqrstuvwxyz\ 0123456789"; // We can pick from 62 characters. This is so close to a power of 2, 64, @@ -74,7 +73,7 @@ impl Distribution<char> for Alphanumeric { loop { let var = rng.next_u32() >> (32 - 6); if var < RANGE { - return GEN_ASCII_STR_CHARSET[var as usize] as char + return GEN_ASCII_STR_CHARSET[var as usize] as char; } } } @@ -116,21 +115,24 @@ macro_rules! tuple_impl { } impl Distribution<()> for Standard { + #[allow(clippy::unused_unit)] #[inline] - fn sample<R: Rng + ?Sized>(&self, _: &mut R) -> () { () } + fn sample<R: Rng + ?Sized>(&self, _: &mut R) -> () { + () + } } -tuple_impl!{A} -tuple_impl!{A, B} -tuple_impl!{A, B, C} -tuple_impl!{A, B, C, D} -tuple_impl!{A, B, C, D, E} -tuple_impl!{A, B, C, D, E, F} -tuple_impl!{A, B, C, D, E, F, G} -tuple_impl!{A, B, C, D, E, F, G, H} -tuple_impl!{A, B, C, D, E, F, G, H, I} -tuple_impl!{A, B, C, D, E, F, G, H, I, J} -tuple_impl!{A, B, C, D, E, F, G, H, I, J, K} -tuple_impl!{A, B, C, D, E, F, G, H, I, J, K, L} +tuple_impl! {A} +tuple_impl! {A, B} +tuple_impl! {A, B, C} +tuple_impl! {A, B, C, D} +tuple_impl! {A, B, C, D, E} +tuple_impl! {A, B, C, D, E, F} +tuple_impl! {A, B, C, D, E, F, G} +tuple_impl! {A, B, C, D, E, F, G, H} +tuple_impl! {A, B, C, D, E, F, G, H, I} +tuple_impl! {A, B, C, D, E, F, G, H, I, J} +tuple_impl! {A, B, C, D, E, F, G, H, I, J, K} +tuple_impl! {A, B, C, D, E, F, G, H, I, J, K, L} macro_rules! array_impl { // recursive, given at least one type parameter: @@ -152,9 +154,11 @@ macro_rules! array_impl { }; } -array_impl!{32, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,} +array_impl! {32, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,} -impl<T> Distribution<Option<T>> for Standard where Standard: Distribution<T> { +impl<T> Distribution<Option<T>> for Standard +where Standard: Distribution<T> +{ #[inline] fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Option<T> { // UFCS is needed here: https://github.com/rust-lang/rust/issues/24066 @@ -166,7 +170,9 @@ impl<T> Distribution<Option<T>> for Standard where Standard: Distribution<T> { } } -impl<T> Distribution<Wrapping<T>> for Standard where Standard: Distribution<T> { +impl<T> Distribution<Wrapping<T>> for Standard +where Standard: Distribution<T> +{ #[inline] fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Wrapping<T> { Wrapping(rng.gen()) @@ -176,19 +182,19 @@ impl<T> Distribution<Wrapping<T>> for Standard where Standard: Distribution<T> { #[cfg(test)] mod tests { - use crate::{Rng, RngCore, Standard}; - use crate::distributions::Alphanumeric; - #[cfg(all(not(feature="std"), feature="alloc"))] use alloc::string::String; + use super::*; + use crate::RngCore; + #[cfg(all(not(feature = "std"), feature = "alloc"))] use alloc::string::String; #[test] fn test_misc() { let rng: &mut dyn RngCore = &mut crate::test::rng(820); - + rng.sample::<char, _>(Standard); rng.sample::<bool, _>(Standard); } - - #[cfg(feature="alloc")] + + #[cfg(feature = "alloc")] #[test] fn test_chars() { use core::iter; @@ -197,7 +203,9 @@ mod tests { // Test by generating a relatively large number of chars, so we also // take the rejection sampling path. let word: String = iter::repeat(()) - .map(|()| rng.gen::<char>()).take(1000).collect(); + .map(|()| rng.gen::<char>()) + .take(1000) + .collect(); assert!(word.len() != 0); } @@ -216,4 +224,68 @@ mod tests { } assert!(incorrect == false); } + + #[test] + fn value_stability() { + fn test_samples<T: Copy + core::fmt::Debug + PartialEq, D: Distribution<T>>( + distr: &D, zero: T, expected: &[T], + ) { + let mut rng = crate::test::rng(807); + let mut buf = [zero; 5]; + for x in &mut buf { + *x = rng.sample(&distr); + } + assert_eq!(&buf, expected); + } + + test_samples(&Standard, 'a', &[ + '\u{8cdac}', + '\u{a346a}', + '\u{80120}', + '\u{ed692}', + '\u{35888}', + ]); + test_samples(&Alphanumeric, 'a', &['h', 'm', 'e', '3', 'M']); + test_samples(&Standard, false, &[true, true, false, true, false]); + test_samples(&Standard, None as Option<bool>, &[ + Some(true), + None, + Some(false), + None, + Some(false), + ]); + test_samples(&Standard, Wrapping(0i32), &[ + Wrapping(-2074640887), + Wrapping(-1719949321), + Wrapping(2018088303), + Wrapping(-547181756), + Wrapping(838957336), + ]); + + // We test only sub-sets of tuple and array impls + test_samples(&Standard, (), &[(), (), (), (), ()]); + test_samples(&Standard, (false,), &[ + (true,), + (true,), + (false,), + (true,), + (false,), + ]); + test_samples(&Standard, (false, false), &[ + (true, true), + (false, true), + (false, false), + (true, false), + (false, false), + ]); + + test_samples(&Standard, [0u8; 0], &[[], [], [], [], []]); + test_samples(&Standard, [0u8; 3], &[ + [9, 247, 111], + [68, 24, 13], + [174, 19, 194], + [172, 69, 213], + [149, 207, 29], + ]); + } } diff --git a/vendor/rand/src/distributions/pareto.rs b/vendor/rand/src/distributions/pareto.rs index edc9122329..ac5473b8c8 100644 --- a/vendor/rand/src/distributions/pareto.rs +++ b/vendor/rand/src/distributions/pareto.rs @@ -9,11 +9,11 @@ //! The Pareto distribution. #![allow(deprecated)] -use crate::Rng; use crate::distributions::{Distribution, OpenClosed01}; +use crate::Rng; /// Samples floating-point numbers according to the Pareto distribution -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Pareto { scale: f64, @@ -31,7 +31,10 @@ impl Pareto { /// `scale` and `shape` have to be non-zero and positive. pub fn new(scale: f64, shape: f64) -> Pareto { assert!((scale > 0.) & (shape > 0.)); - Pareto { scale, inv_neg_shape: -1.0 / shape } + Pareto { + scale, + inv_neg_shape: -1.0 / shape, + } } } @@ -44,8 +47,8 @@ impl Distribution<f64> for Pareto { #[cfg(test)] mod tests { - use crate::distributions::Distribution; use super::Pareto; + use crate::distributions::Distribution; #[test] #[should_panic] diff --git a/vendor/rand/src/distributions/poisson.rs b/vendor/rand/src/distributions/poisson.rs index 9fd6e999ec..ce94d7542b 100644 --- a/vendor/rand/src/distributions/poisson.rs +++ b/vendor/rand/src/distributions/poisson.rs @@ -10,15 +10,15 @@ //! The Poisson distribution. #![allow(deprecated)] -use crate::Rng; -use crate::distributions::{Distribution, Cauchy}; use crate::distributions::utils::log_gamma; +use crate::distributions::{Cauchy, Distribution}; +use crate::Rng; /// The Poisson distribution `Poisson(lambda)`. /// /// This distribution has a density function: /// `f(k) = lambda^k * exp(-lambda) / k!` for `k >= 0`. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Poisson { lambda: f64, @@ -90,7 +90,8 @@ impl Distribution<u64> for Poisson { // the magic value scales the distribution function to a range of approximately 0-1 // since it is not exact, we multiply the ratio by 0.9 to avoid ratios greater than 1 // this doesn't change the resulting distribution, only increases the rate of failed drawings - let check = 0.9 * (1.0 + comp_dev * comp_dev) + let check = 0.9 + * (1.0 + comp_dev * comp_dev) * (result * self.log_lambda - log_gamma(1.0 + result) - self.magic_val).exp(); // check with uniform random value - if below the threshold, we are within the target distribution @@ -105,11 +106,11 @@ impl Distribution<u64> for Poisson { #[cfg(test)] mod test { - use crate::distributions::Distribution; use super::Poisson; + use crate::distributions::Distribution; #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_poisson_10() { let poisson = Poisson::new(10.0); let mut rng = crate::test::rng(123); @@ -123,7 +124,6 @@ mod test { } #[test] - #[cfg(not(miri))] // Miri doesn't support transcendental functions fn test_poisson_15() { // Take the 'high expected values' path let poisson = Poisson::new(15.0); diff --git a/vendor/rand/src/distributions/triangular.rs b/vendor/rand/src/distributions/triangular.rs index 3e8f8b03ef..37be19867e 100644 --- a/vendor/rand/src/distributions/triangular.rs +++ b/vendor/rand/src/distributions/triangular.rs @@ -9,11 +9,11 @@ //! The triangular distribution. #![allow(deprecated)] -use crate::Rng; use crate::distributions::{Distribution, Standard}; +use crate::Rng; /// The triangular distribution. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Triangular { min: f64, @@ -28,7 +28,6 @@ impl Triangular { /// # Panics /// /// If `max < mode`, `mode < max` or `max == min`. - /// #[inline] pub fn new(min: f64, max: f64, mode: f64) -> Triangular { assert!(max >= mode); @@ -54,14 +53,19 @@ impl Distribution<f64> for Triangular { #[cfg(test)] mod test { - use crate::distributions::Distribution; use super::Triangular; + use crate::distributions::Distribution; #[test] fn test_new() { for &(min, max, mode) in &[ - (-1., 1., 0.), (1., 2., 1.), (5., 25., 25.), (1e-5, 1e5, 1e-3), - (0., 1., 0.9), (-4., -0.5, -2.), (-13.039, 8.41, 1.17), + (-1., 1., 0.), + (1., 2., 1.), + (5., 25., 25.), + (1e-5, 1e5, 1e-3), + (0., 1., 0.9), + (-4., -0.5, -2.), + (-13.039, 8.41, 1.17), ] { println!("{} {} {}", min, max, mode); let _ = Triangular::new(min, max, mode); diff --git a/vendor/rand/src/distributions/uniform.rs b/vendor/rand/src/distributions/uniform.rs index f07fba9537..8584152f03 100644 --- a/vendor/rand/src/distributions/uniform.rs +++ b/vendor/rand/src/distributions/uniform.rs @@ -66,9 +66,7 @@ //! struct MyF32(f32); //! //! #[derive(Clone, Copy, Debug)] -//! struct UniformMyF32 { -//! inner: UniformFloat<f32>, -//! } +//! struct UniformMyF32(UniformFloat<f32>); //! //! impl UniformSampler for UniformMyF32 { //! type X = MyF32; @@ -76,9 +74,7 @@ //! where B1: SampleBorrow<Self::X> + Sized, //! B2: SampleBorrow<Self::X> + Sized //! { -//! UniformMyF32 { -//! inner: UniformFloat::<f32>::new(low.borrow().0, high.borrow().0), -//! } +//! UniformMyF32(UniformFloat::<f32>::new(low.borrow().0, high.borrow().0)) //! } //! fn new_inclusive<B1, B2>(low: B1, high: B2) -> Self //! where B1: SampleBorrow<Self::X> + Sized, @@ -87,7 +83,7 @@ //! UniformSampler::new(low, high) //! } //! fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X { -//! MyF32(self.inner.sample(rng)) +//! MyF32(self.0.sample(rng)) //! } //! } //! @@ -107,23 +103,20 @@ //! [`UniformDuration`]: crate::distributions::uniform::UniformDuration //! [`SampleBorrow::borrow`]: crate::distributions::uniform::SampleBorrow::borrow -#[cfg(feature = "std")] -use std::time::Duration; -#[cfg(not(feature = "std"))] -use core::time::Duration; +#[cfg(not(feature = "std"))] use core::time::Duration; +#[cfg(feature = "std")] use std::time::Duration; -use crate::Rng; -use crate::distributions::Distribution; use crate::distributions::float::IntoFloat; -use crate::distributions::utils::{WideningMultiply, FloatSIMDUtils, FloatAsSIMD, BoolAsSIMD}; +use crate::distributions::utils::{BoolAsSIMD, FloatAsSIMD, FloatSIMDUtils, WideningMultiply}; +use crate::distributions::Distribution; +use crate::Rng; #[cfg(not(feature = "std"))] #[allow(unused_imports)] // rustc doesn't detect that this is actually used use crate::distributions::utils::Float; -#[cfg(feature="simd_support")] -use packed_simd::*; +#[cfg(feature = "simd_support")] use packed_simd::*; /// Sample values uniformly between two bounds. /// @@ -166,33 +159,33 @@ use packed_simd::*; /// [`new`]: Uniform::new /// [`new_inclusive`]: Uniform::new_inclusive #[derive(Clone, Copy, Debug)] -pub struct Uniform<X: SampleUniform> { - inner: X::Sampler, -} +pub struct Uniform<X: SampleUniform>(X::Sampler); impl<X: SampleUniform> Uniform<X> { /// Create a new `Uniform` instance which samples uniformly from the half /// open range `[low, high)` (excluding `high`). Panics if `low >= high`. pub fn new<B1, B2>(low: B1, high: B2) -> Uniform<X> - where B1: SampleBorrow<X> + Sized, - B2: SampleBorrow<X> + Sized + where + B1: SampleBorrow<X> + Sized, + B2: SampleBorrow<X> + Sized, { - Uniform { inner: X::Sampler::new(low, high) } + Uniform(X::Sampler::new(low, high)) } /// Create a new `Uniform` instance which samples uniformly from the closed /// range `[low, high]` (inclusive). Panics if `low > high`. pub fn new_inclusive<B1, B2>(low: B1, high: B2) -> Uniform<X> - where B1: SampleBorrow<X> + Sized, - B2: SampleBorrow<X> + Sized + where + B1: SampleBorrow<X> + Sized, + B2: SampleBorrow<X> + Sized, { - Uniform { inner: X::Sampler::new_inclusive(low, high) } + Uniform(X::Sampler::new_inclusive(low, high)) } } impl<X: SampleUniform> Distribution<X> for Uniform<X> { fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> X { - self.inner.sample(rng) + self.0.sample(rng) } } @@ -228,8 +221,9 @@ pub trait UniformSampler: Sized { /// Usually users should not call this directly but instead use /// `Uniform::new`, which asserts that `low < high` before calling this. fn new<B1, B2>(low: B1, high: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized; + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized; /// Construct self, with inclusive bounds `[low, high]`. /// @@ -237,8 +231,9 @@ pub trait UniformSampler: Sized { /// `Uniform::new_inclusive`, which asserts that `low <= high` before /// calling this. fn new_inclusive<B1, B2>(low: B1, high: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized; + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized; /// Sample a value. fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X; @@ -251,10 +246,21 @@ pub trait UniformSampler: Sized { /// more optimal implementations for single usage may be provided via this /// method (which is the case for integers and floats). /// Results may not be identical. - fn sample_single<R: Rng + ?Sized, B1, B2>(low: B1, high: B2, rng: &mut R) - -> Self::X - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + /// + /// Note that to use this method in a generic context, the type needs to be + /// retrieved via `SampleUniform::Sampler` as follows: + /// ``` + /// use rand::{thread_rng, distributions::uniform::{SampleUniform, UniformSampler}}; + /// # #[allow(unused)] + /// fn sample_from_range<T: SampleUniform>(lb: T, ub: T) -> T { + /// let mut rng = thread_rng(); + /// <T as SampleUniform>::Sampler::sample_single(lb, ub, &mut rng) + /// } + /// ``` + fn sample_single<R: Rng + ?Sized, B1, B2>(low: B1, high: B2, rng: &mut R) -> Self::X + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { let uniform: Self = UniformSampler::new(low, high); uniform.sample(rng) @@ -284,13 +290,21 @@ pub trait SampleBorrow<Borrowed> { /// [`Borrow::borrow`]: std::borrow::Borrow::borrow fn borrow(&self) -> &Borrowed; } -impl<Borrowed> SampleBorrow<Borrowed> for Borrowed where Borrowed: SampleUniform { +impl<Borrowed> SampleBorrow<Borrowed> for Borrowed +where Borrowed: SampleUniform +{ #[inline(always)] - fn borrow(&self) -> &Borrowed { self } + fn borrow(&self) -> &Borrowed { + self + } } -impl<'a, Borrowed> SampleBorrow<Borrowed> for &'a Borrowed where Borrowed: SampleUniform { +impl<'a, Borrowed> SampleBorrow<Borrowed> for &'a Borrowed +where Borrowed: SampleUniform +{ #[inline(always)] - fn borrow(&self) -> &Borrowed { *self } + fn borrow(&self) -> &Borrowed { + *self + } } //////////////////////////////////////////////////////////////////////////////// @@ -336,7 +350,7 @@ impl<'a, Borrowed> SampleBorrow<Borrowed> for &'a Borrowed where Borrowed: Sampl pub struct UniformInt<X> { low: X, range: X, - z: X, // either ints_to_reject or zone depending on implementation + z: X, // either ints_to_reject or zone depending on implementation } macro_rules! uniform_int_impl { @@ -356,8 +370,9 @@ macro_rules! uniform_int_impl { #[inline] // if the range is constant, this helps LLVM to do the // calculations at compile-time. fn new<B1, B2>(low_b: B1, high_b: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { let low = *low_b.borrow(); let high = *high_b.borrow(); @@ -368,29 +383,31 @@ macro_rules! uniform_int_impl { #[inline] // if the range is constant, this helps LLVM to do the // calculations at compile-time. fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { let low = *low_b.borrow(); let high = *high_b.borrow(); - assert!(low <= high, - "Uniform::new_inclusive called with `low > high`"); + assert!( + low <= high, + "Uniform::new_inclusive called with `low > high`" + ); let unsigned_max = ::core::$u_large::MAX; let range = high.wrapping_sub(low).wrapping_add(1) as $unsigned; - let ints_to_reject = - if range > 0 { - let range = range as $u_large; - (unsigned_max - range + 1) % range - } else { - 0 - }; + let ints_to_reject = if range > 0 { + let range = $u_large::from(range); + (unsigned_max - range + 1) % range + } else { + 0 + }; UniformInt { low: low, // These are really $unsigned values, but store as $ty: range: range as $ty, - z: ints_to_reject as $unsigned as $ty + z: ints_to_reject as $unsigned as $ty, } } @@ -412,29 +429,27 @@ macro_rules! uniform_int_impl { } } - fn sample_single<R: Rng + ?Sized, B1, B2>(low_b: B1, high_b: B2, rng: &mut R) - -> Self::X - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + fn sample_single<R: Rng + ?Sized, B1, B2>(low_b: B1, high_b: B2, rng: &mut R) -> Self::X + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { let low = *low_b.borrow(); let high = *high_b.borrow(); - assert!(low < high, - "UniformSampler::sample_single: low >= high"); + assert!(low < high, "UniformSampler::sample_single: low >= high"); let range = high.wrapping_sub(low) as $unsigned as $u_large; - let zone = - if ::core::$unsigned::MAX <= ::core::u16::MAX as $unsigned { - // Using a modulus is faster than the approximation for - // i8 and i16. I suppose we trade the cost of one - // modulus for near-perfect branch prediction. - let unsigned_max: $u_large = ::core::$u_large::MAX; - let ints_to_reject = (unsigned_max - range + 1) % range; - unsigned_max - ints_to_reject - } else { - // conservative but fast approximation. `- 1` is necessary to allow the - // same comparison without bias. - (range << range.leading_zeros()).wrapping_sub(1) - }; + let zone = if ::core::$unsigned::MAX <= ::core::u16::MAX as $unsigned { + // Using a modulus is faster than the approximation for + // i8 and i16. I suppose we trade the cost of one + // modulus for near-perfect branch prediction. + let unsigned_max: $u_large = ::core::$u_large::MAX; + let ints_to_reject = (unsigned_max - range + 1) % range; + unsigned_max - ints_to_reject + } else { + // conservative but fast approximation. `- 1` is necessary to allow the + // same comparison without bias. + (range << range.leading_zeros()).wrapping_sub(1) + }; loop { let v: $u_large = rng.gen(); @@ -445,7 +460,7 @@ macro_rules! uniform_int_impl { } } } - } + }; } uniform_int_impl! { i8, u8, u32 } @@ -622,7 +637,7 @@ uniform_simd_int_impl! { /// /// The floats are first converted to a value in the `[1, 2)` interval using a /// transmute-based method, and then mapped to the expected range with a -/// multiply and addition. Values produced this way have what equals 22 bits of +/// multiply and addition. Values produced this way have what equals 23 bits of /// random digits for an `f32`, and 52 for an `f64`. /// /// [`new`]: UniformSampler::new @@ -644,17 +659,20 @@ macro_rules! uniform_float_impl { type X = $ty; fn new<B1, B2>(low_b: B1, high_b: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { let low = *low_b.borrow(); let high = *high_b.borrow(); - assert!(low.all_lt(high), - "Uniform::new called with `low >= high`"); - assert!(low.all_finite() && high.all_finite(), - "Uniform::new called with non-finite boundaries"); - let max_rand = <$ty>::splat((::core::$u_scalar::MAX >> $bits_to_discard) - .into_float_with_exponent(0) - 1.0); + assert!(low.all_lt(high), "Uniform::new called with `low >= high`"); + assert!( + low.all_finite() && high.all_finite(), + "Uniform::new called with non-finite boundaries" + ); + let max_rand = <$ty>::splat( + (::core::$u_scalar::MAX >> $bits_to_discard).into_float_with_exponent(0) - 1.0, + ); let mut scale = high - low; @@ -672,17 +690,23 @@ macro_rules! uniform_float_impl { } fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { let low = *low_b.borrow(); let high = *high_b.borrow(); - assert!(low.all_le(high), - "Uniform::new_inclusive called with `low > high`"); - assert!(low.all_finite() && high.all_finite(), - "Uniform::new_inclusive called with non-finite boundaries"); - let max_rand = <$ty>::splat((::core::$u_scalar::MAX >> $bits_to_discard) - .into_float_with_exponent(0) - 1.0); + assert!( + low.all_le(high), + "Uniform::new_inclusive called with `low > high`" + ); + assert!( + low.all_finite() && high.all_finite(), + "Uniform::new_inclusive called with non-finite boundaries" + ); + let max_rand = <$ty>::splat( + (::core::$u_scalar::MAX >> $bits_to_discard).into_float_with_exponent(0) - 1.0, + ); let mut scale = (high - low) / max_rand; @@ -701,8 +725,7 @@ macro_rules! uniform_float_impl { fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X { // Generate a value in the range [1, 2) - let value1_2 = (rng.gen::<$uty>() >> $bits_to_discard) - .into_float_with_exponent(0); + let value1_2 = (rng.gen::<$uty>() >> $bits_to_discard).into_float_with_exponent(0); // Get a value in the range [0, 1) in order to avoid // overflowing into infinity when multiplying with scale @@ -717,21 +740,23 @@ macro_rules! uniform_float_impl { } #[inline] - fn sample_single<R: Rng + ?Sized, B1, B2>(low_b: B1, high_b: B2, rng: &mut R) - -> Self::X - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + fn sample_single<R: Rng + ?Sized, B1, B2>(low_b: B1, high_b: B2, rng: &mut R) -> Self::X + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { let low = *low_b.borrow(); let high = *high_b.borrow(); - assert!(low.all_lt(high), - "UniformSampler::sample_single: low >= high"); + assert!( + low.all_lt(high), + "UniformSampler::sample_single: low >= high" + ); let mut scale = high - low; loop { // Generate a value in the range [1, 2) - let value1_2 = (rng.gen::<$uty>() >> $bits_to_discard) - .into_float_with_exponent(0); + let value1_2 = + (rng.gen::<$uty>() >> $bits_to_discard).into_float_with_exponent(0); // Get a value in the range [0, 1) in order to avoid // overflowing into infinity when multiplying with scale @@ -775,37 +800,38 @@ macro_rules! uniform_float_impl { // rare, so handle it here after the common case. let mask = !scale.finite_mask(); if mask.any() { - assert!(low.all_finite() && high.all_finite(), - "Uniform::sample_single: low and high must be finite"); + assert!( + low.all_finite() && high.all_finite(), + "Uniform::sample_single: low and high must be finite" + ); scale = scale.decrease_masked(mask); } } } } - } + }; } uniform_float_impl! { f32, u32, f32, u32, 32 - 23 } uniform_float_impl! { f64, u64, f64, u64, 64 - 52 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] uniform_float_impl! { f32x2, u32x2, f32, u32, 32 - 23 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] uniform_float_impl! { f32x4, u32x4, f32, u32, 32 - 23 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] uniform_float_impl! { f32x8, u32x8, f32, u32, 32 - 23 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] uniform_float_impl! { f32x16, u32x16, f32, u32, 32 - 23 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] uniform_float_impl! { f64x2, u64x2, f64, u64, 64 - 52 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] uniform_float_impl! { f64x4, u64x4, f64, u64, 64 - 52 } -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] uniform_float_impl! { f64x8, u64x8, f64, u64, 64 - 52 } - /// The back-end implementing [`UniformSampler`] for `Duration`. /// /// Unless you are implementing [`UniformSampler`] for your own types, this type @@ -829,7 +855,7 @@ enum UniformDurationMode { max_secs: u64, max_nanos: u32, secs: Uniform<u64>, - } + }, } impl SampleUniform for Duration { @@ -841,8 +867,9 @@ impl UniformSampler for UniformDuration { #[inline] fn new<B1, B2>(low_b: B1, high_b: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { let low = *low_b.borrow(); let high = *high_b.borrow(); @@ -852,12 +879,16 @@ impl UniformSampler for UniformDuration { #[inline] fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { let low = *low_b.borrow(); let high = *high_b.borrow(); - assert!(low <= high, "Uniform::new_inclusive called with `low > high`"); + assert!( + low <= high, + "Uniform::new_inclusive called with `low > high`" + ); let low_s = low.as_secs(); let low_n = low.subsec_nanos(); @@ -865,8 +896,8 @@ impl UniformSampler for UniformDuration { let mut high_n = high.subsec_nanos(); if high_n < low_n { - high_s = high_s - 1; - high_n = high_n + 1_000_000_000; + high_s -= 1; + high_n += 1_000_000_000; } let mode = if low_s == high_s { @@ -877,10 +908,10 @@ impl UniformSampler for UniformDuration { } else { let max = high_s .checked_mul(1_000_000_000) - .and_then(|n| n.checked_add(high_n as u64)); + .and_then(|n| n.checked_add(u64::from(high_n))); if let Some(higher_bound) = max { - let lower_bound = low_s * 1_000_000_000 + low_n as u64; + let lower_bound = low_s * 1_000_000_000 + u64::from(low_n); UniformDurationMode::Medium { nanos: Uniform::new_inclusive(lower_bound, higher_bound), } @@ -911,7 +942,11 @@ impl UniformSampler for UniformDuration { let nanos = nanos.sample(rng); Duration::new(nanos / 1_000_000_000, (nanos % 1_000_000_000) as u32) } - UniformDurationMode::Large { max_secs, max_nanos, secs } => { + UniformDurationMode::Large { + max_secs, + max_nanos, + secs, + } => { // constant folding means this is at least as fast as `gen_range` let nano_range = Uniform::new(0, 1_000_000_000); loop { @@ -929,11 +964,8 @@ impl UniformSampler for UniformDuration { #[cfg(test)] mod tests { - use crate::Rng; + use super::*; use crate::rngs::mock::StepRng; - use crate::distributions::uniform::Uniform; - use crate::distributions::utils::FloatAsSIMD; - #[cfg(feature="simd_support")] use packed_simd::*; #[should_panic] #[test] @@ -957,12 +989,11 @@ mod tests { } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_integers() { - use core::{i8, i16, i32, i64, isize}; - use core::{u8, u16, u32, u64, usize}; - #[cfg(not(target_os = "emscripten"))] - use core::{i128, u128}; + #[cfg(not(target_os = "emscripten"))] use core::{i128, u128}; + use core::{i16, i32, i64, i8, isize}; + use core::{u16, u32, u64, u8, usize}; let mut rng = crate::test::rng(251); macro_rules! t { @@ -1023,8 +1054,7 @@ mod tests { );)* }}; } - t!(i8, i16, i32, i64, isize, - u8, u16, u32, u64, usize); + t!(i8, i16, i32, i64, isize, u8, u16, u32, u64, usize); #[cfg(not(target_os = "emscripten"))] t!(i128, u128); @@ -1042,29 +1072,29 @@ mod tests { } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_floats() { let mut rng = crate::test::rng(252); let mut zero_rng = StepRng::new(0, 0); let mut max_rng = StepRng::new(0xffff_ffff_ffff_ffff, 0); macro_rules! t { ($ty:ty, $f_scalar:ident, $bits_shifted:expr) => {{ - let v: &[($f_scalar, $f_scalar)]= - &[(0.0, 100.0), - (-1e35, -1e25), - (1e-35, 1e-25), - (-1e35, 1e35), - (<$f_scalar>::from_bits(0), <$f_scalar>::from_bits(3)), - (-<$f_scalar>::from_bits(10), -<$f_scalar>::from_bits(1)), - (-<$f_scalar>::from_bits(5), 0.0), - (-<$f_scalar>::from_bits(7), -0.0), - (10.0, ::core::$f_scalar::MAX), - (-100.0, ::core::$f_scalar::MAX), - (-::core::$f_scalar::MAX / 5.0, ::core::$f_scalar::MAX), - (-::core::$f_scalar::MAX, ::core::$f_scalar::MAX / 5.0), - (-::core::$f_scalar::MAX * 0.8, ::core::$f_scalar::MAX * 0.7), - (-::core::$f_scalar::MAX, ::core::$f_scalar::MAX), - ]; + let v: &[($f_scalar, $f_scalar)] = &[ + (0.0, 100.0), + (-1e35, -1e25), + (1e-35, 1e-25), + (-1e35, 1e35), + (<$f_scalar>::from_bits(0), <$f_scalar>::from_bits(3)), + (-<$f_scalar>::from_bits(10), -<$f_scalar>::from_bits(1)), + (-<$f_scalar>::from_bits(5), 0.0), + (-<$f_scalar>::from_bits(7), -0.0), + (10.0, ::core::$f_scalar::MAX), + (-100.0, ::core::$f_scalar::MAX), + (-::core::$f_scalar::MAX / 5.0, ::core::$f_scalar::MAX), + (-::core::$f_scalar::MAX, ::core::$f_scalar::MAX / 5.0), + (-::core::$f_scalar::MAX * 0.8, ::core::$f_scalar::MAX * 0.7), + (-::core::$f_scalar::MAX, ::core::$f_scalar::MAX), + ]; for &(low_scalar, high_scalar) in v.iter() { for lane in 0..<$ty>::lanes() { let low = <$ty>::splat(0.0 as $f_scalar).replace(lane, low_scalar); @@ -1080,7 +1110,10 @@ mod tests { assert!(low_scalar <= v && v < high_scalar); } - assert_eq!(rng.sample(Uniform::new_inclusive(low, low)).extract(lane), low_scalar); + assert_eq!( + rng.sample(Uniform::new_inclusive(low, low)).extract(lane), + low_scalar + ); assert_eq!(zero_rng.sample(my_uniform).extract(lane), low_scalar); assert_eq!(zero_rng.sample(my_incl_uniform).extract(lane), low_scalar); @@ -1092,26 +1125,37 @@ mod tests { // since for those rounding might result in selecting high for a very // long time. if (high_scalar - low_scalar) > 0.0001 { - let mut lowering_max_rng = - StepRng::new(0xffff_ffff_ffff_ffff, - (-1i64 << $bits_shifted) as u64); - assert!(lowering_max_rng.gen_range(low, high).extract(lane) < high_scalar); + let mut lowering_max_rng = StepRng::new( + 0xffff_ffff_ffff_ffff, + (-1i64 << $bits_shifted) as u64, + ); + assert!( + lowering_max_rng.gen_range(low, high).extract(lane) < high_scalar + ); } } } - assert_eq!(rng.sample(Uniform::new_inclusive(::core::$f_scalar::MAX, - ::core::$f_scalar::MAX)), - ::core::$f_scalar::MAX); - assert_eq!(rng.sample(Uniform::new_inclusive(-::core::$f_scalar::MAX, - -::core::$f_scalar::MAX)), - -::core::$f_scalar::MAX); - }} + assert_eq!( + rng.sample(Uniform::new_inclusive( + ::core::$f_scalar::MAX, + ::core::$f_scalar::MAX + )), + ::core::$f_scalar::MAX + ); + assert_eq!( + rng.sample(Uniform::new_inclusive( + -::core::$f_scalar::MAX, + -::core::$f_scalar::MAX + )), + -::core::$f_scalar::MAX + ); + }}; } t!(f32, f32, 32 - 23); t!(f64, f64, 64 - 52); - #[cfg(feature="simd_support")] + #[cfg(feature = "simd_support")] { t!(f32x2, f32, 32 - 23); t!(f32x4, f32, 32 - 23); @@ -1124,13 +1168,14 @@ mod tests { } #[test] - #[cfg(all(feature="std", - not(target_arch = "wasm32"), - not(target_arch = "asmjs")))] - #[cfg(not(miri))] // Miri does not support catching panics + #[cfg(all( + feature = "std", + not(target_arch = "wasm32"), + not(target_arch = "asmjs") + ))] fn test_float_assertions() { - use std::panic::catch_unwind; use super::SampleUniform; + use std::panic::catch_unwind; fn range<T: SampleUniform>(low: T, high: T) { let mut rng = crate::test::rng(253); rng.gen_range(low, high); @@ -1138,20 +1183,23 @@ mod tests { macro_rules! t { ($ty:ident, $f_scalar:ident) => {{ - let v: &[($f_scalar, $f_scalar)] = - &[(::std::$f_scalar::NAN, 0.0), - (1.0, ::std::$f_scalar::NAN), - (::std::$f_scalar::NAN, ::std::$f_scalar::NAN), - (1.0, 0.5), - (::std::$f_scalar::MAX, -::std::$f_scalar::MAX), - (::std::$f_scalar::INFINITY, ::std::$f_scalar::INFINITY), - (::std::$f_scalar::NEG_INFINITY, ::std::$f_scalar::NEG_INFINITY), - (::std::$f_scalar::NEG_INFINITY, 5.0), - (5.0, ::std::$f_scalar::INFINITY), - (::std::$f_scalar::NAN, ::std::$f_scalar::INFINITY), - (::std::$f_scalar::NEG_INFINITY, ::std::$f_scalar::NAN), - (::std::$f_scalar::NEG_INFINITY, ::std::$f_scalar::INFINITY), - ]; + let v: &[($f_scalar, $f_scalar)] = &[ + (::std::$f_scalar::NAN, 0.0), + (1.0, ::std::$f_scalar::NAN), + (::std::$f_scalar::NAN, ::std::$f_scalar::NAN), + (1.0, 0.5), + (::std::$f_scalar::MAX, -::std::$f_scalar::MAX), + (::std::$f_scalar::INFINITY, ::std::$f_scalar::INFINITY), + ( + ::std::$f_scalar::NEG_INFINITY, + ::std::$f_scalar::NEG_INFINITY, + ), + (::std::$f_scalar::NEG_INFINITY, 5.0), + (5.0, ::std::$f_scalar::INFINITY), + (::std::$f_scalar::NAN, ::std::$f_scalar::INFINITY), + (::std::$f_scalar::NEG_INFINITY, ::std::$f_scalar::NAN), + (::std::$f_scalar::NEG_INFINITY, ::std::$f_scalar::INFINITY), + ]; for &(low_scalar, high_scalar) in v.iter() { for lane in 0..<$ty>::lanes() { let low = <$ty>::splat(0.0 as $f_scalar).replace(lane, low_scalar); @@ -1163,12 +1211,12 @@ mod tests { assert!(catch_unwind(|| Uniform::new(low, low)).is_err()); } } - }} + }}; } t!(f32, f32); t!(f64, f64); - #[cfg(feature="simd_support")] + #[cfg(feature = "simd_support")] { t!(f32x2, f32); t!(f32x4, f32); @@ -1182,18 +1230,21 @@ mod tests { #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_durations() { - #[cfg(feature = "std")] - use std::time::Duration; - #[cfg(not(feature = "std"))] - use core::time::Duration; + #[cfg(not(feature = "std"))] use core::time::Duration; + #[cfg(feature = "std")] use std::time::Duration; let mut rng = crate::test::rng(253); - let v = &[(Duration::new(10, 50000), Duration::new(100, 1234)), - (Duration::new(0, 100), Duration::new(1, 50)), - (Duration::new(0, 0), Duration::new(u64::max_value(), 999_999_999))]; + let v = &[ + (Duration::new(10, 50000), Duration::new(100, 1234)), + (Duration::new(0, 100), Duration::new(1, 50)), + ( + Duration::new(0, 0), + Duration::new(u64::max_value(), 999_999_999), + ), + ]; for &(low, high) in v.iter() { let my_uniform = Uniform::new(low, high); for _ in 0..1000 { @@ -1205,40 +1256,45 @@ mod tests { #[test] fn test_custom_uniform() { - use crate::distributions::uniform::{UniformSampler, UniformFloat, SampleUniform, SampleBorrow}; + use crate::distributions::uniform::{ + SampleBorrow, SampleUniform, UniformFloat, UniformSampler, + }; #[derive(Clone, Copy, PartialEq, PartialOrd)] struct MyF32 { x: f32, } #[derive(Clone, Copy, Debug)] - struct UniformMyF32 { - inner: UniformFloat<f32>, - } + struct UniformMyF32(UniformFloat<f32>); impl UniformSampler for UniformMyF32 { type X = MyF32; + fn new<B1, B2>(low: B1, high: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { - UniformMyF32 { - inner: UniformFloat::<f32>::new(low.borrow().x, high.borrow().x), - } + UniformMyF32(UniformFloat::<f32>::new(low.borrow().x, high.borrow().x)) } + fn new_inclusive<B1, B2>(low: B1, high: B2) -> Self - where B1: SampleBorrow<Self::X> + Sized, - B2: SampleBorrow<Self::X> + Sized + where + B1: SampleBorrow<Self::X> + Sized, + B2: SampleBorrow<Self::X> + Sized, { UniformSampler::new(low, high) } + fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X { - MyF32 { x: self.inner.sample(rng) } + MyF32 { + x: self.0.sample(rng), + } } } impl SampleUniform for MyF32 { type Sampler = UniformMyF32; } - let (low, high) = (MyF32{ x: 17.0f32 }, MyF32{ x: 22.0f32 }); + let (low, high) = (MyF32 { x: 17.0f32 }, MyF32 { x: 22.0f32 }); let uniform = Uniform::new(low, high); let mut rng = crate::test::rng(804); for _ in 0..100 { @@ -1250,21 +1306,75 @@ mod tests { #[test] fn test_uniform_from_std_range() { let r = Uniform::from(2u32..7); - assert_eq!(r.inner.low, 2); - assert_eq!(r.inner.range, 5); + assert_eq!(r.0.low, 2); + assert_eq!(r.0.range, 5); let r = Uniform::from(2.0f64..7.0); - assert_eq!(r.inner.low, 2.0); - assert_eq!(r.inner.scale, 5.0); + assert_eq!(r.0.low, 2.0); + assert_eq!(r.0.scale, 5.0); } #[test] fn test_uniform_from_std_range_inclusive() { let r = Uniform::from(2u32..=6); - assert_eq!(r.inner.low, 2); - assert_eq!(r.inner.range, 5); + assert_eq!(r.0.low, 2); + assert_eq!(r.0.range, 5); let r = Uniform::from(2.0f64..=7.0); - assert_eq!(r.inner.low, 2.0); - assert!(r.inner.scale > 5.0); - assert!(r.inner.scale < 5.0 + 1e-14); + assert_eq!(r.0.low, 2.0); + assert!(r.0.scale > 5.0); + assert!(r.0.scale < 5.0 + 1e-14); + } + + #[test] + fn value_stability() { + fn test_samples<T: SampleUniform + Copy + core::fmt::Debug + PartialEq>( + lb: T, ub: T, expected_single: &[T], expected_multiple: &[T], + ) where Uniform<T>: Distribution<T> { + let mut rng = crate::test::rng(897); + let mut buf = [lb; 3]; + + for x in &mut buf { + *x = T::Sampler::sample_single(lb, ub, &mut rng); + } + assert_eq!(&buf, expected_single); + + let distr = Uniform::new(lb, ub); + for x in &mut buf { + *x = rng.sample(&distr); + } + assert_eq!(&buf, expected_multiple); + } + + // We test on a sub-set of types; possibly we should do more. + // TODO: SIMD types + + test_samples(11u8, 219, &[17, 66, 214], &[181, 93, 165]); + test_samples(11u32, 219, &[17, 66, 214], &[181, 93, 165]); + + test_samples(0f32, 1e-2f32, &[0.0003070104, 0.0026630748, 0.00979833], &[ + 0.008194133, + 0.00398172, + 0.007428536, + ]); + test_samples( + -1e10f64, + 1e10f64, + &[-4673848682.871551, 6388267422.932352, 4857075081.198343], + &[1173375212.1808167, 1917642852.109581, 2365076174.3153973], + ); + + test_samples( + Duration::new(2, 0), + Duration::new(4, 0), + &[ + Duration::new(2, 532615131), + Duration::new(3, 638826742), + Duration::new(3, 485707508), + ], + &[ + Duration::new(3, 117337521), + Duration::new(3, 191764285), + Duration::new(3, 236507617), + ], + ); } } diff --git a/vendor/rand/src/distributions/unit_circle.rs b/vendor/rand/src/distributions/unit_circle.rs index 1f3cb77a20..37885d8eb8 100644 --- a/vendor/rand/src/distributions/unit_circle.rs +++ b/vendor/rand/src/distributions/unit_circle.rs @@ -7,9 +7,10 @@ // except according to those terms. #![allow(deprecated)] +#![allow(clippy::all)] -use crate::Rng; use crate::distributions::{Distribution, Uniform}; +use crate::Rng; /// Samples uniformly from the edge of the unit circle in two dimensions. /// @@ -19,7 +20,7 @@ use crate::distributions::{Distribution, Uniform}; /// Random Digits.*](https://mcnp.lanl.gov/pdf_files/nbs_vonneumann.pdf) /// NBS Appl. Math. Ser., No. 12. Washington, DC: U.S. Government Printing /// Office, pp. 36-38. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct UnitCircle; @@ -41,35 +42,36 @@ impl Distribution<[f64; 2]> for UnitCircle { loop { x1 = uniform.sample(rng); x2 = uniform.sample(rng); - sum = x1*x1 + x2*x2; + sum = x1 * x1 + x2 * x2; if sum < 1. { break; } } - let diff = x1*x1 - x2*x2; - [diff / sum, 2.*x1*x2 / sum] + let diff = x1 * x1 - x2 * x2; + [diff / sum, 2. * x1 * x2 / sum] } } #[cfg(test)] mod tests { - use crate::distributions::Distribution; use super::UnitCircle; + use crate::distributions::Distribution; /// Assert that two numbers are almost equal to each other. /// /// On panic, this macro will print the values of the expressions with their /// debug representations. macro_rules! assert_almost_eq { - ($a:expr, $b:expr, $prec:expr) => ( + ($a:expr, $b:expr, $prec:expr) => { let diff = ($a - $b).abs(); if diff > $prec { panic!(format!( "assertion failed: `abs(left - right) = {:.1e} < {:e}`, \ (left: `{}`, right: `{}`)", - diff, $prec, $a, $b)); + diff, $prec, $a, $b + )); } - ); + }; } #[test] @@ -78,7 +80,7 @@ mod tests { let dist = UnitCircle::new(); for _ in 0..1000 { let x = dist.sample(&mut rng); - assert_almost_eq!(x[0]*x[0] + x[1]*x[1], 1., 1e-15); + assert_almost_eq!(x[0] * x[0] + x[1] * x[1], 1., 1e-15); } } @@ -86,15 +88,15 @@ mod tests { fn value_stability() { let mut rng = crate::test::rng(2); let expected = [ - [-0.9965658683520504, -0.08280380447614634], - [-0.9790853270389644, -0.20345004884984505], - [-0.8449189758898707, 0.5348943112253227], - ]; + [-0.9965658683520504, -0.08280380447614634], + [-0.9790853270389644, -0.20345004884984505], + [-0.8449189758898707, 0.5348943112253227], + ]; let samples = [ - UnitCircle.sample(&mut rng), - UnitCircle.sample(&mut rng), - UnitCircle.sample(&mut rng), - ]; + UnitCircle.sample(&mut rng), + UnitCircle.sample(&mut rng), + UnitCircle.sample(&mut rng), + ]; assert_eq!(samples, expected); } } diff --git a/vendor/rand/src/distributions/unit_sphere.rs b/vendor/rand/src/distributions/unit_sphere.rs index 2a224cbe5e..5b8c8ad55f 100644 --- a/vendor/rand/src/distributions/unit_sphere.rs +++ b/vendor/rand/src/distributions/unit_sphere.rs @@ -7,9 +7,10 @@ // except according to those terms. #![allow(deprecated)] +#![allow(clippy::all)] -use crate::Rng; use crate::distributions::{Distribution, Uniform}; +use crate::Rng; /// Samples uniformly from the surface of the unit sphere in three dimensions. /// @@ -18,7 +19,7 @@ use crate::distributions::{Distribution, Uniform}; /// [^1]: Marsaglia, George (1972). [*Choosing a Point from the Surface of a /// Sphere.*](https://doi.org/10.1214/aoms/1177692644) /// Ann. Math. Statist. 43, no. 2, 645--646. -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct UnitSphereSurface; @@ -36,35 +37,36 @@ impl Distribution<[f64; 3]> for UnitSphereSurface { let uniform = Uniform::new(-1., 1.); loop { let (x1, x2) = (uniform.sample(rng), uniform.sample(rng)); - let sum = x1*x1 + x2*x2; + let sum = x1 * x1 + x2 * x2; if sum >= 1. { continue; } let factor = 2. * (1.0_f64 - sum).sqrt(); - return [x1 * factor, x2 * factor, 1. - 2.*sum]; + return [x1 * factor, x2 * factor, 1. - 2. * sum]; } } } #[cfg(test)] mod tests { - use crate::distributions::Distribution; use super::UnitSphereSurface; + use crate::distributions::Distribution; /// Assert that two numbers are almost equal to each other. /// /// On panic, this macro will print the values of the expressions with their /// debug representations. macro_rules! assert_almost_eq { - ($a:expr, $b:expr, $prec:expr) => ( + ($a:expr, $b:expr, $prec:expr) => { let diff = ($a - $b).abs(); if diff > $prec { panic!(format!( "assertion failed: `abs(left - right) = {:.1e} < {:e}`, \ (left: `{}`, right: `{}`)", - diff, $prec, $a, $b)); + diff, $prec, $a, $b + )); } - ); + }; } #[test] @@ -73,7 +75,7 @@ mod tests { let dist = UnitSphereSurface::new(); for _ in 0..1000 { let x = dist.sample(&mut rng); - assert_almost_eq!(x[0]*x[0] + x[1]*x[1] + x[2]*x[2], 1., 1e-15); + assert_almost_eq!(x[0] * x[0] + x[1] * x[1] + x[2] * x[2], 1., 1e-15); } } @@ -81,15 +83,15 @@ mod tests { fn value_stability() { let mut rng = crate::test::rng(2); let expected = [ - [0.03247542860231647, -0.7830477442152738, 0.6211131755296027], - [-0.09978440840914075, 0.9706650829833128, -0.21875184231323952], - [0.2735582468624679, 0.9435374242279655, -0.1868234852870203], - ]; + [0.03247542860231647, -0.7830477442152738, 0.6211131755296027], + [-0.09978440840914075, 0.9706650829833128, -0.21875184231323952], + [0.2735582468624679, 0.9435374242279655, -0.1868234852870203], + ]; let samples = [ - UnitSphereSurface.sample(&mut rng), - UnitSphereSurface.sample(&mut rng), - UnitSphereSurface.sample(&mut rng), - ]; + UnitSphereSurface.sample(&mut rng), + UnitSphereSurface.sample(&mut rng), + UnitSphereSurface.sample(&mut rng), + ]; assert_eq!(samples, expected); } } diff --git a/vendor/rand/src/distributions/utils.rs b/vendor/rand/src/distributions/utils.rs index fb482a86ca..2d36b02265 100644 --- a/vendor/rand/src/distributions/utils.rs +++ b/vendor/rand/src/distributions/utils.rs @@ -8,12 +8,9 @@ //! Math helper functions -#[cfg(feature="simd_support")] -use packed_simd::*; -#[cfg(feature="std")] -use crate::distributions::ziggurat_tables; -#[cfg(feature="std")] -use crate::Rng; +#[cfg(feature = "std")] use crate::distributions::ziggurat_tables; +#[cfg(feature = "std")] use crate::Rng; +#[cfg(feature = "simd_support")] use packed_simd::*; pub trait WideningMultiply<RHS = Self> { @@ -141,7 +138,7 @@ macro_rules! wmul_impl_usize { (high as usize, low as usize) } } - } + }; } #[cfg(target_pointer_width = "32")] wmul_impl_usize! { u32 } @@ -150,11 +147,9 @@ wmul_impl_usize! { u64 } #[cfg(all(feature = "simd_support", feature = "nightly"))] mod simd_wmul { - #[cfg(target_arch = "x86")] - use core::arch::x86::*; - #[cfg(target_arch = "x86_64")] - use core::arch::x86_64::*; use super::*; + #[cfg(target_arch = "x86")] use core::arch::x86::*; + #[cfg(target_arch = "x86_64")] use core::arch::x86_64::*; wmul_impl! { (u8x2, u16x2), @@ -248,29 +243,35 @@ pub(crate) trait FloatSIMDUtils { /// Implement functions available in std builds but missing from core primitives #[cfg(not(std))] -pub(crate) trait Float : Sized { - type Bits; - +pub(crate) trait Float: Sized { fn is_nan(self) -> bool; fn is_infinite(self) -> bool; fn is_finite(self) -> bool; - fn to_bits(self) -> Self::Bits; - fn from_bits(v: Self::Bits) -> Self; } /// Implement functions on f32/f64 to give them APIs similar to SIMD types -pub(crate) trait FloatAsSIMD : Sized { +pub(crate) trait FloatAsSIMD: Sized { #[inline(always)] - fn lanes() -> usize { 1 } + fn lanes() -> usize { + 1 + } #[inline(always)] - fn splat(scalar: Self) -> Self { scalar } + fn splat(scalar: Self) -> Self { + scalar + } #[inline(always)] - fn extract(self, index: usize) -> Self { debug_assert_eq!(index, 0); self } + fn extract(self, index: usize) -> Self { + debug_assert_eq!(index, 0); + self + } #[inline(always)] - fn replace(self, index: usize, new_value: Self) -> Self { debug_assert_eq!(index, 0); new_value } + fn replace(self, index: usize, new_value: Self) -> Self { + debug_assert_eq!(index, 0); + new_value + } } -pub(crate) trait BoolAsSIMD : Sized { +pub(crate) trait BoolAsSIMD: Sized { fn any(self) -> bool; fn all(self) -> bool; fn none(self) -> bool; @@ -278,19 +279,25 @@ pub(crate) trait BoolAsSIMD : Sized { impl BoolAsSIMD for bool { #[inline(always)] - fn any(self) -> bool { self } + fn any(self) -> bool { + self + } + #[inline(always)] - fn all(self) -> bool { self } + fn all(self) -> bool { + self + } + #[inline(always)] - fn none(self) -> bool { !self } + fn none(self) -> bool { + !self + } } macro_rules! scalar_float_impl { ($ty:ident, $uty:ident) => { #[cfg(not(std))] impl Float for $ty { - type Bits = $uty; - #[inline] fn is_nan(self) -> bool { self != self @@ -305,61 +312,84 @@ macro_rules! scalar_float_impl { fn is_finite(self) -> bool { !(self.is_nan() || self.is_infinite()) } - - #[inline] - fn to_bits(self) -> Self::Bits { - unsafe { ::core::mem::transmute(self) } - } - - #[inline] - fn from_bits(v: Self::Bits) -> Self { - // It turns out the safety issues with sNaN were overblown! Hooray! - unsafe { ::core::mem::transmute(v) } - } } impl FloatSIMDUtils for $ty { type Mask = bool; + type UInt = $uty; + #[inline(always)] - fn all_lt(self, other: Self) -> bool { self < other } + fn all_lt(self, other: Self) -> bool { + self < other + } + #[inline(always)] - fn all_le(self, other: Self) -> bool { self <= other } + fn all_le(self, other: Self) -> bool { + self <= other + } + #[inline(always)] - fn all_finite(self) -> bool { self.is_finite() } + fn all_finite(self) -> bool { + self.is_finite() + } + #[inline(always)] - fn finite_mask(self) -> Self::Mask { self.is_finite() } + fn finite_mask(self) -> Self::Mask { + self.is_finite() + } + #[inline(always)] - fn gt_mask(self, other: Self) -> Self::Mask { self > other } + fn gt_mask(self, other: Self) -> Self::Mask { + self > other + } + #[inline(always)] - fn ge_mask(self, other: Self) -> Self::Mask { self >= other } + fn ge_mask(self, other: Self) -> Self::Mask { + self >= other + } + #[inline(always)] fn decrease_masked(self, mask: Self::Mask) -> Self { debug_assert!(mask, "At least one lane must be set"); <$ty>::from_bits(self.to_bits() - 1) } - type UInt = $uty; - fn cast_from_int(i: Self::UInt) -> Self { i as $ty } + + #[inline] + fn cast_from_int(i: Self::UInt) -> Self { + i as $ty + } } impl FloatAsSIMD for $ty {} - } + }; } scalar_float_impl!(f32, u32); scalar_float_impl!(f64, u64); -#[cfg(feature="simd_support")] +#[cfg(feature = "simd_support")] macro_rules! simd_impl { ($ty:ident, $f_scalar:ident, $mty:ident, $uty:ident) => { impl FloatSIMDUtils for $ty { type Mask = $mty; + type UInt = $uty; + #[inline(always)] - fn all_lt(self, other: Self) -> bool { self.lt(other).all() } + fn all_lt(self, other: Self) -> bool { + self.lt(other).all() + } + #[inline(always)] - fn all_le(self, other: Self) -> bool { self.le(other).all() } + fn all_le(self, other: Self) -> bool { + self.le(other).all() + } + #[inline(always)] - fn all_finite(self) -> bool { self.finite_mask().all() } + fn all_finite(self) -> bool { + self.finite_mask().all() + } + #[inline(always)] fn finite_mask(self) -> Self::Mask { // This can possibly be done faster by checking bit patterns @@ -367,10 +397,17 @@ macro_rules! simd_impl { let pos_inf = $ty::splat(::core::$f_scalar::INFINITY); self.gt(neg_inf) & self.lt(pos_inf) } + #[inline(always)] - fn gt_mask(self, other: Self) -> Self::Mask { self.gt(other) } + fn gt_mask(self, other: Self) -> Self::Mask { + self.gt(other) + } + #[inline(always)] - fn ge_mask(self, other: Self) -> Self::Mask { self.ge(other) } + fn ge_mask(self, other: Self) -> Self::Mask { + self.ge(other) + } + #[inline(always)] fn decrease_masked(self, mask: Self::Mask) -> Self { // Casting a mask into ints will produce all bits set for @@ -382,11 +419,13 @@ macro_rules! simd_impl { debug_assert!(mask.any(), "At least one lane must be set"); <$ty>::from_bits(<$uty>::from_bits(self) + <$uty>::from_bits(mask)) } - type UInt = $uty; + #[inline] - fn cast_from_int(i: Self::UInt) -> Self { i.cast() } + fn cast_from_int(i: Self::UInt) -> Self { + i.cast() + } } - } + }; } #[cfg(feature="simd_support")] simd_impl! { f32x2, f32, m32x2, u32x2 } @@ -410,7 +449,7 @@ macro_rules! simd_impl { /// `Ag(z)` is an infinite series with coefficients that can be calculated /// ahead of time - we use just the first 6 terms, which is good enough /// for most purposes. -#[cfg(feature="std")] +#[cfg(feature = "std")] pub fn log_gamma(x: f64) -> f64 { // precalculated 6 coefficients for the first 6 terms of the series let coefficients: [f64; 6] = [ @@ -455,16 +494,20 @@ pub fn log_gamma(x: f64) -> f64 { // the perf improvement (25-50%) is definitely worth the extra code // size from force-inlining. -#[cfg(feature="std")] +#[cfg(feature = "std")] #[inline(always)] pub fn ziggurat<R: Rng + ?Sized, P, Z>( - rng: &mut R, - symmetric: bool, - x_tab: ziggurat_tables::ZigTable, - f_tab: ziggurat_tables::ZigTable, - mut pdf: P, - mut zero_case: Z) - -> f64 where P: FnMut(f64) -> f64, Z: FnMut(&mut R, f64) -> f64 { + rng: &mut R, + symmetric: bool, + x_tab: ziggurat_tables::ZigTable, + f_tab: ziggurat_tables::ZigTable, + mut pdf: P, + mut zero_case: Z +) -> f64 +where + P: FnMut(f64) -> f64, + Z: FnMut(&mut R, f64) -> f64, +{ use crate::distributions::float::IntoFloat; loop { // As an optimisation we re-implement the conversion to a f64. @@ -483,12 +526,11 @@ pub fn ziggurat<R: Rng + ?Sized, P, Z>( (bits >> 12).into_float_with_exponent(1) - 3.0 } else { // Convert to a value in the range [1,2) and substract to get (0,1) - (bits >> 12).into_float_with_exponent(0) - - (1.0 - ::core::f64::EPSILON / 2.0) + (bits >> 12).into_float_with_exponent(0) - (1.0 - ::core::f64::EPSILON / 2.0) }; let x = u * x_tab[i]; - let test_x = if symmetric { x.abs() } else {x}; + let test_x = if symmetric { x.abs() } else { x }; // algebraically equivalent to |u| < x_tab[i+1]/x_tab[i] (or u < x_tab[i+1]/x_tab[i]) if test_x < x_tab[i + 1] { diff --git a/vendor/rand/src/distributions/weibull.rs b/vendor/rand/src/distributions/weibull.rs index 483714f9bf..ffbc93b015 100644 --- a/vendor/rand/src/distributions/weibull.rs +++ b/vendor/rand/src/distributions/weibull.rs @@ -9,11 +9,11 @@ //! The Weibull distribution. #![allow(deprecated)] -use crate::Rng; use crate::distributions::{Distribution, OpenClosed01}; +use crate::Rng; /// Samples floating-point numbers according to the Weibull distribution -#[deprecated(since="0.7.0", note="moved to rand_distr crate")] +#[deprecated(since = "0.7.0", note = "moved to rand_distr crate")] #[derive(Clone, Copy, Debug)] pub struct Weibull { inv_shape: f64, @@ -28,7 +28,10 @@ impl Weibull { /// `scale` and `shape` have to be non-zero and positive. pub fn new(scale: f64, shape: f64) -> Weibull { assert!((scale > 0.) & (shape > 0.)); - Weibull { inv_shape: 1./shape, scale } + Weibull { + inv_shape: 1. / shape, + scale, + } } } @@ -41,8 +44,8 @@ impl Distribution<f64> for Weibull { #[cfg(test)] mod tests { - use crate::distributions::Distribution; use super::Weibull; + use crate::distributions::Distribution; #[test] #[should_panic] diff --git a/vendor/rand/src/distributions/weighted/alias_method.rs b/vendor/rand/src/distributions/weighted/alias_method.rs index bdd4ba0f3c..7d42a35267 100644 --- a/vendor/rand/src/distributions/weighted/alias_method.rs +++ b/vendor/rand/src/distributions/weighted/alias_method.rs @@ -2,17 +2,15 @@ //! indices with probabilities proportional to a collection of weights. use super::WeightedError; -#[cfg(not(feature = "std"))] -use crate::alloc::vec::Vec; -#[cfg(not(feature = "std"))] -use crate::alloc::vec; -use core::fmt; -use core::iter::Sum; -use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign}; +#[cfg(not(feature = "std"))] use crate::alloc::vec; +#[cfg(not(feature = "std"))] use crate::alloc::vec::Vec; use crate::distributions::uniform::SampleUniform; use crate::distributions::Distribution; use crate::distributions::Uniform; use crate::Rng; +use core::fmt; +use core::iter::Sum; +use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign}; /// A distribution using weighted sampling to pick a discretely selected item. /// @@ -192,9 +190,8 @@ impl<W: Weight> WeightedIndex<W> { let b = aliases.pop_big(); aliases.set_alias(s, b); - no_alias_odds[b as usize] = no_alias_odds[b as usize] - - weight_sum - + no_alias_odds[s as usize]; + no_alias_odds[b as usize] = + no_alias_odds[b as usize] - weight_sum + no_alias_odds[s as usize]; if no_alias_odds[b as usize] < weight_sum { aliases.push_small(b); @@ -253,8 +250,7 @@ where } impl<W: Weight> Clone for WeightedIndex<W> -where - Uniform<W>: Clone, +where Uniform<W>: Clone { fn clone(&self) -> Self { Self { @@ -370,7 +366,7 @@ mod test { use super::*; #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_weighted_index_f32() { test_weighted_index(f32::into); @@ -399,14 +395,14 @@ mod test { #[cfg(not(target_os = "emscripten"))] #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_weighted_index_u128() { test_weighted_index(|x: u128| x as f64); } #[cfg(all(rustc_1_26, not(target_os = "emscripten")))] #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_weighted_index_i128() { test_weighted_index(|x: i128| x as f64); @@ -422,13 +418,13 @@ mod test { } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_weighted_index_u8() { test_weighted_index(u8::into); } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_weighted_index_i8() { test_weighted_index(i8::into); @@ -444,9 +440,7 @@ mod test { } fn test_weighted_index<W: Weight, F: Fn(W) -> f64>(w_to_f64: F) - where - WeightedIndex<W>: fmt::Debug, - { + where WeightedIndex<W>: fmt::Debug { const NUM_WEIGHTS: u32 = 10; const ZERO_WEIGHT_INDEX: u32 = 3; const NUM_SAMPLES: u32 = 15000; @@ -496,4 +490,28 @@ mod test { WeightedError::InvalidWeight ); } + + #[test] + fn value_stability() { + fn test_samples<W: Weight>(weights: Vec<W>, buf: &mut [usize], expected: &[usize]) { + assert_eq!(buf.len(), expected.len()); + let distr = WeightedIndex::new(weights).unwrap(); + let mut rng = crate::test::rng(0x9c9fa0b0580a7031); + for r in buf.iter_mut() { + *r = rng.sample(&distr); + } + assert_eq!(buf, expected); + } + + let mut buf = [0; 10]; + test_samples(vec![1i32, 1, 1, 1, 1, 1, 1, 1, 1], &mut buf, &[ + 6, 5, 7, 5, 8, 7, 6, 2, 3, 7, + ]); + test_samples(vec![0.7f32, 0.1, 0.1, 0.1], &mut buf, &[ + 2, 0, 0, 0, 0, 0, 0, 0, 1, 3, + ]); + test_samples(vec![1.0f64, 0.999, 0.998, 0.997], &mut buf, &[ + 2, 1, 2, 3, 2, 1, 3, 2, 1, 1, + ]); + } } diff --git a/vendor/rand/src/distributions/weighted/mod.rs b/vendor/rand/src/distributions/weighted/mod.rs index 5c2cd97c21..357e3a9f02 100644 --- a/vendor/rand/src/distributions/weighted/mod.rs +++ b/vendor/rand/src/distributions/weighted/mod.rs @@ -7,9 +7,9 @@ // except according to those terms. //! Weighted index sampling -//! +//! //! This module provides two implementations for sampling indices: -//! +//! //! * [`WeightedIndex`] allows `O(log N)` sampling //! * [`alias_method::WeightedIndex`] allows `O(1)` sampling, but with //! much greater set-up cost @@ -18,14 +18,14 @@ pub mod alias_method; -use crate::Rng; +use crate::distributions::uniform::{SampleBorrow, SampleUniform, UniformSampler}; use crate::distributions::Distribution; -use crate::distributions::uniform::{UniformSampler, SampleUniform, SampleBorrow}; +use crate::Rng; use core::cmp::PartialOrd; use core::fmt; // Note that this whole module is only imported if feature="alloc" is enabled. -#[cfg(not(feature="std"))] use crate::alloc::vec::Vec; +#[cfg(not(feature = "std"))] use crate::alloc::vec::Vec; /// A distribution using weighted sampling to pick a discretely selected /// item. @@ -84,6 +84,7 @@ use core::fmt; #[derive(Debug, Clone)] pub struct WeightedIndex<X: SampleUniform + PartialOrd> { cumulative_weights: Vec<X>, + total_weight: X, weight_distribution: X::Sampler, } @@ -97,16 +98,13 @@ impl<X: SampleUniform + PartialOrd> WeightedIndex<X> { /// /// [`Uniform<X>`]: crate::distributions::uniform::Uniform pub fn new<I>(weights: I) -> Result<WeightedIndex<X>, WeightedError> - where I: IntoIterator, - I::Item: SampleBorrow<X>, - X: for<'a> ::core::ops::AddAssign<&'a X> + - Clone + - Default { + where + I: IntoIterator, + I::Item: SampleBorrow<X>, + X: for<'a> ::core::ops::AddAssign<&'a X> + Clone + Default, + { let mut iter = weights.into_iter(); - let mut total_weight: X = iter.next() - .ok_or(WeightedError::NoItem)? - .borrow() - .clone(); + let mut total_weight: X = iter.next().ok_or(WeightedError::NoItem)?.borrow().clone(); let zero = <X as Default>::default(); if total_weight < zero { @@ -125,20 +123,121 @@ impl<X: SampleUniform + PartialOrd> WeightedIndex<X> { if total_weight == zero { return Err(WeightedError::AllWeightsZero); } - let distr = X::Sampler::new(zero, total_weight); + let distr = X::Sampler::new(zero, total_weight.clone()); - Ok(WeightedIndex { cumulative_weights: weights, weight_distribution: distr }) + Ok(WeightedIndex { + cumulative_weights: weights, + total_weight, + weight_distribution: distr, + }) + } + + /// Update a subset of weights, without changing the number of weights. + /// + /// `new_weights` must be sorted by the index. + /// + /// Using this method instead of `new` might be more efficient if only a small number of + /// weights is modified. No allocations are performed, unless the weight type `X` uses + /// allocation internally. + /// + /// In case of error, `self` is not modified. + pub fn update_weights(&mut self, new_weights: &[(usize, &X)]) -> Result<(), WeightedError> + where X: for<'a> ::core::ops::AddAssign<&'a X> + + for<'a> ::core::ops::SubAssign<&'a X> + + Clone + + Default { + if new_weights.is_empty() { + return Ok(()); + } + + let zero = <X as Default>::default(); + + let mut total_weight = self.total_weight.clone(); + + // Check for errors first, so we don't modify `self` in case something + // goes wrong. + let mut prev_i = None; + for &(i, w) in new_weights { + if let Some(old_i) = prev_i { + if old_i >= i { + return Err(WeightedError::InvalidWeight); + } + } + if *w < zero { + return Err(WeightedError::InvalidWeight); + } + if i >= self.cumulative_weights.len() + 1 { + return Err(WeightedError::TooMany); + } + + let mut old_w = if i < self.cumulative_weights.len() { + self.cumulative_weights[i].clone() + } else { + self.total_weight.clone() + }; + if i > 0 { + old_w -= &self.cumulative_weights[i - 1]; + } + + total_weight -= &old_w; + total_weight += w; + prev_i = Some(i); + } + if total_weight == zero { + return Err(WeightedError::AllWeightsZero); + } + + // Update the weights. Because we checked all the preconditions in the + // previous loop, this should never panic. + let mut iter = new_weights.iter(); + + let mut prev_weight = zero.clone(); + let mut next_new_weight = iter.next(); + let &(first_new_index, _) = next_new_weight.unwrap(); + let mut cumulative_weight = if first_new_index > 0 { + self.cumulative_weights[first_new_index - 1].clone() + } else { + zero.clone() + }; + for i in first_new_index..self.cumulative_weights.len() { + match next_new_weight { + Some(&(j, w)) if i == j => { + cumulative_weight += w; + next_new_weight = iter.next(); + } + _ => { + let mut tmp = self.cumulative_weights[i].clone(); + tmp -= &prev_weight; // We know this is positive. + cumulative_weight += &tmp; + } + } + prev_weight = cumulative_weight.clone(); + core::mem::swap(&mut prev_weight, &mut self.cumulative_weights[i]); + } + + self.total_weight = total_weight; + self.weight_distribution = X::Sampler::new(zero, self.total_weight.clone()); + + Ok(()) } } -impl<X> Distribution<usize> for WeightedIndex<X> where - X: SampleUniform + PartialOrd { +impl<X> Distribution<usize> for WeightedIndex<X> +where X: SampleUniform + PartialOrd +{ fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> usize { use ::core::cmp::Ordering; let chosen_weight = self.weight_distribution.sample(rng); // Find the first item which has a weight *higher* than the chosen weight. - self.cumulative_weights.binary_search_by( - |w| if *w <= chosen_weight { Ordering::Less } else { Ordering::Greater }).unwrap_err() + self.cumulative_weights + .binary_search_by(|w| { + if *w <= chosen_weight { + Ordering::Less + } else { + Ordering::Greater + } + }) + .unwrap_err() } } @@ -147,7 +246,7 @@ mod test { use super::*; #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_weightedindex() { let mut r = crate::test::rng(700); const N_REPS: u32 = 5000; @@ -192,14 +291,93 @@ mod test { for _ in 0..5 { assert_eq!(WeightedIndex::new(&[0, 1]).unwrap().sample(&mut r), 1); assert_eq!(WeightedIndex::new(&[1, 0]).unwrap().sample(&mut r), 0); - assert_eq!(WeightedIndex::new(&[0, 0, 0, 0, 10, 0]).unwrap().sample(&mut r), 4); + assert_eq!( + WeightedIndex::new(&[0, 0, 0, 0, 10, 0]) + .unwrap() + .sample(&mut r), + 4 + ); + } + + assert_eq!( + WeightedIndex::new(&[10][0..0]).unwrap_err(), + WeightedError::NoItem + ); + assert_eq!( + WeightedIndex::new(&[0]).unwrap_err(), + WeightedError::AllWeightsZero + ); + assert_eq!( + WeightedIndex::new(&[10, 20, -1, 30]).unwrap_err(), + WeightedError::InvalidWeight + ); + assert_eq!( + WeightedIndex::new(&[-10, 20, 1, 30]).unwrap_err(), + WeightedError::InvalidWeight + ); + assert_eq!( + WeightedIndex::new(&[-10]).unwrap_err(), + WeightedError::InvalidWeight + ); + } + + #[test] + fn test_update_weights() { + let data = [ + ( + &[10u32, 2, 3, 4][..], + &[(1, &100), (2, &4)][..], // positive change + &[10, 100, 4, 4][..], + ), + ( + &[1u32, 2, 3, 0, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7][..], + &[(2, &1), (5, &1), (13, &100)][..], // negative change and last element + &[1u32, 2, 1, 0, 5, 1, 7, 1, 2, 3, 4, 5, 6, 100][..], + ), + ]; + + for (weights, update, expected_weights) in data.iter() { + let total_weight = weights.iter().sum::<u32>(); + let mut distr = WeightedIndex::new(weights.to_vec()).unwrap(); + assert_eq!(distr.total_weight, total_weight); + + distr.update_weights(update).unwrap(); + let expected_total_weight = expected_weights.iter().sum::<u32>(); + let expected_distr = WeightedIndex::new(expected_weights.to_vec()).unwrap(); + assert_eq!(distr.total_weight, expected_total_weight); + assert_eq!(distr.total_weight, expected_distr.total_weight); + assert_eq!(distr.cumulative_weights, expected_distr.cumulative_weights); + } + } + + #[test] + fn value_stability() { + fn test_samples<X: SampleUniform + PartialOrd, I>( + weights: I, buf: &mut [usize], expected: &[usize], + ) where + I: IntoIterator, + I::Item: SampleBorrow<X>, + X: for<'a> ::core::ops::AddAssign<&'a X> + Clone + Default, + { + assert_eq!(buf.len(), expected.len()); + let distr = WeightedIndex::new(weights).unwrap(); + let mut rng = crate::test::rng(701); + for r in buf.iter_mut() { + *r = rng.sample(&distr); + } + assert_eq!(buf, expected); } - assert_eq!(WeightedIndex::new(&[10][0..0]).unwrap_err(), WeightedError::NoItem); - assert_eq!(WeightedIndex::new(&[0]).unwrap_err(), WeightedError::AllWeightsZero); - assert_eq!(WeightedIndex::new(&[10, 20, -1, 30]).unwrap_err(), WeightedError::InvalidWeight); - assert_eq!(WeightedIndex::new(&[-10, 20, 1, 30]).unwrap_err(), WeightedError::InvalidWeight); - assert_eq!(WeightedIndex::new(&[-10]).unwrap_err(), WeightedError::InvalidWeight); + let mut buf = [0; 10]; + test_samples(&[1i32, 1, 1, 1, 1, 1, 1, 1, 1], &mut buf, &[ + 0, 6, 2, 6, 3, 4, 7, 8, 2, 5, + ]); + test_samples(&[0.7f32, 0.1, 0.1, 0.1], &mut buf, &[ + 0, 0, 0, 1, 0, 0, 2, 3, 0, 0, + ]); + test_samples(&[1.0f64, 0.999, 0.998, 0.997], &mut buf, &[ + 2, 2, 1, 3, 2, 1, 3, 3, 2, 1, + ]); } } @@ -215,34 +393,21 @@ pub enum WeightedError { /// All items in the provided weight collection are zero. AllWeightsZero, - + /// Too many weights are provided (length greater than `u32::MAX`) TooMany, } -impl WeightedError { - fn msg(&self) -> &str { - match *self { - WeightedError::NoItem => "No weights provided.", - WeightedError::InvalidWeight => "A weight is invalid.", - WeightedError::AllWeightsZero => "All weights are zero.", - WeightedError::TooMany => "Too many weights (hit u32::MAX)", - } - } -} - -#[cfg(feature="std")] -impl ::std::error::Error for WeightedError { - fn description(&self) -> &str { - self.msg() - } - fn cause(&self) -> Option<&dyn (::std::error::Error)> { - None - } -} +#[cfg(feature = "std")] +impl ::std::error::Error for WeightedError {} impl fmt::Display for WeightedError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.msg()) + match *self { + WeightedError::NoItem => write!(f, "No weights provided."), + WeightedError::InvalidWeight => write!(f, "A weight is invalid."), + WeightedError::AllWeightsZero => write!(f, "All weights are zero."), + WeightedError::TooMany => write!(f, "Too many weights (hit u32::MAX)"), + } } } diff --git a/vendor/rand/src/distributions/ziggurat_tables.rs b/vendor/rand/src/distributions/ziggurat_tables.rs index ca1ce30410..f830a601bd 100644 --- a/vendor/rand/src/distributions/ziggurat_tables.rs +++ b/vendor/rand/src/distributions/ziggurat_tables.rs @@ -12,6 +12,7 @@ pub type ZigTable = &'static [f64; 257]; pub const ZIG_NORM_R: f64 = 3.654152885361008796; +#[rustfmt::skip] pub static ZIG_NORM_X: [f64; 257] = [3.910757959537090045, 3.654152885361008796, 3.449278298560964462, 3.320244733839166074, 3.224575052047029100, 3.147889289517149969, 3.083526132001233044, 3.027837791768635434, @@ -78,6 +79,7 @@ pub static ZIG_NORM_X: [f64; 257] = 0.487443966121754335, 0.463634336771763245, 0.437518402186662658, 0.408389134588000746, 0.375121332850465727, 0.335737519180459465, 0.286174591747260509, 0.215241895913273806, 0.000000000000000000]; +#[rustfmt::skip] pub static ZIG_NORM_F: [f64; 257] = [0.000477467764586655, 0.001260285930498598, 0.002609072746106363, 0.004037972593371872, 0.005522403299264754, 0.007050875471392110, 0.008616582769422917, 0.010214971439731100, @@ -145,6 +147,7 @@ pub static ZIG_NORM_F: [f64; 257] = 0.932060075968990209, 0.945198953453078028, 0.959879091812415930, 0.977101701282731328, 1.000000000000000000]; pub const ZIG_EXP_R: f64 = 7.697117470131050077; +#[rustfmt::skip] pub static ZIG_EXP_X: [f64; 257] = [8.697117470131052741, 7.697117470131050077, 6.941033629377212577, 6.478378493832569696, 6.144164665772472667, 5.882144315795399869, 5.666410167454033697, 5.482890627526062488, @@ -211,6 +214,7 @@ pub static ZIG_EXP_X: [f64; 257] = 0.253658363385912022, 0.233790483059674731, 0.212671510630966620, 0.189958689622431842, 0.165127622564187282, 0.137304980940012589, 0.104838507565818778, 0.063852163815001570, 0.000000000000000000]; +#[rustfmt::skip] pub static ZIG_EXP_F: [f64; 257] = [0.000167066692307963, 0.000454134353841497, 0.000967269282327174, 0.001536299780301573, 0.002145967743718907, 0.002788798793574076, 0.003460264777836904, 0.004157295120833797, diff --git a/vendor/rand/src/lib.rs b/vendor/rand/src/lib.rs index 31f0169e1a..d42a79fb12 100644 --- a/vendor/rand/src/lib.rs +++ b/vendor/rand/src/lib.rs @@ -40,24 +40,23 @@ //! For the user guide and futher documentation, please read //! [The Rust Rand Book](https://rust-random.github.io/book). - -#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk.png", - html_favicon_url = "https://www.rust-lang.org/favicon.ico", - html_root_url = "https://rust-random.github.io/rand/")] - +#![doc( + html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk.png", + html_favicon_url = "https://www.rust-lang.org/favicon.ico", + html_root_url = "https://rust-random.github.io/rand/" +)] #![deny(missing_docs)] #![deny(missing_debug_implementations)] #![doc(test(attr(allow(unused_variables), deny(warnings))))] +#![cfg_attr(not(feature = "std"), no_std)] +#![cfg_attr(all(feature = "simd_support", feature = "nightly"), feature(stdsimd))] +#![allow( + clippy::excessive_precision, + clippy::unreadable_literal, + clippy::float_cmp +)] -#![cfg_attr(not(feature="std"), no_std)] -#![cfg_attr(all(feature="alloc", not(feature="std")), feature(alloc))] -#![cfg_attr(all(feature="simd_support", feature="nightly"), feature(stdsimd))] - -#[cfg(all(feature="alloc", not(feature="std")))] -extern crate alloc; - -#[cfg(feature = "getrandom")] -use getrandom_package as getrandom; +#[cfg(all(feature = "alloc", not(feature = "std")))] extern crate alloc; #[allow(unused)] macro_rules! trace { ($($x:tt)*) => ( @@ -91,10 +90,10 @@ macro_rules! error { ($($x:tt)*) => ( ) } // Re-exports from rand_core -pub use rand_core::{RngCore, CryptoRng, SeedableRng, Error}; +pub use rand_core::{CryptoRng, Error, RngCore, SeedableRng}; // Public exports -#[cfg(feature="std")] pub use crate::rngs::thread::thread_rng; +#[cfg(feature = "std")] pub use crate::rngs::thread::thread_rng; // Public modules pub mod distributions; @@ -103,10 +102,10 @@ pub mod rngs; pub mod seq; -use core::{mem, slice}; -use core::num::Wrapping; +use crate::distributions::uniform::{SampleBorrow, SampleUniform, UniformSampler}; use crate::distributions::{Distribution, Standard}; -use crate::distributions::uniform::{SampleUniform, UniformSampler, SampleBorrow}; +use core::num::Wrapping; +use core::{mem, slice}; /// An automatically-implemented extension trait on [`RngCore`] providing high-level /// generic methods for sampling values and other convenience methods. @@ -270,7 +269,10 @@ pub trait Rng: RngCore { /// } /// ``` fn sample_iter<T, D>(self, distr: D) -> distributions::DistIter<D, Self, T> - where D: Distribution<T>, Self: Sized { + where + D: Distribution<T>, + Self: Sized, + { distr.sample_iter(self) } @@ -436,7 +438,7 @@ macro_rules! impl_as_byte_slice { } } } - + impl AsByteSliceMut for [Wrapping<$t>] { fn as_byte_slice_mut(&mut self) -> &mut [u8] { if self.len() == 0 { @@ -470,9 +472,11 @@ macro_rules! impl_as_byte_slice { } impl_as_byte_slice!(u16, u32, u64, usize,); -#[cfg(not(target_os = "emscripten"))] impl_as_byte_slice!(u128); +#[cfg(not(target_os = "emscripten"))] +impl_as_byte_slice!(u128); impl_as_byte_slice!(i8, i16, i32, i64, isize,); -#[cfg(not(target_os = "emscripten"))] impl_as_byte_slice!(i128); +#[cfg(not(target_os = "emscripten"))] +impl_as_byte_slice!(i128); macro_rules! impl_as_byte_slice_arrays { ($n:expr,) => {}; @@ -497,6 +501,7 @@ macro_rules! impl_as_byte_slice_arrays { impl_as_byte_slice_arrays!(!div $n / 2, $($NN,)*); }; } +#[rustfmt::skip] impl_as_byte_slice_arrays!(32, N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,); impl_as_byte_slice_arrays!(!div 4096, N,N,N,N,N,N,N,); @@ -542,7 +547,7 @@ impl_as_byte_slice_arrays!(!div 4096, N,N,N,N,N,N,N,); /// ``` /// /// [`Standard`]: distributions::Standard -#[cfg(feature="std")] +#[cfg(feature = "std")] #[inline] pub fn random<T>() -> T where Standard: Distribution<T> { @@ -551,9 +556,9 @@ where Standard: Distribution<T> { #[cfg(test)] mod test { - use crate::rngs::mock::StepRng; use super::*; - #[cfg(all(not(feature="std"), feature="alloc"))] use alloc::boxed::Box; + use crate::rngs::mock::StepRng; + #[cfg(all(not(feature = "std"), feature = "alloc"))] use alloc::boxed::Box; /// Construct a deterministic RNG with the given seed pub fn rng(seed: u64) -> impl RngCore { @@ -568,8 +573,7 @@ mod test { let mut r = StepRng::new(0x11_22_33_44_55_66_77_88, 0); // check every remainder mod 8, both in small and big vectors. - let lengths = [0, 1, 2, 3, 4, 5, 6, 7, - 80, 81, 82, 83, 84, 85, 86, 87]; + let lengths = [0, 1, 2, 3, 4, 5, 6, 7, 80, 81, 82, 83, 84, 85, 86, 87]; for &n in lengths.iter() { let mut buffer = [0u8; 87]; let v = &mut buffer[0..n]; @@ -586,7 +590,7 @@ mod test { #[test] fn test_fill() { - let x = 9041086907909331047; // a random u64 + let x = 9041086907909331047; // a random u64 let mut rng = StepRng::new(x, 0); // Convert to byte sequence and back to u64; byte-swap twice if BE. @@ -600,7 +604,7 @@ mod test { rng.fill(&mut array[..]); assert_eq!(array, [x as u32, (x >> 32) as u32]); assert_eq!(rng.next_u32(), x as u32); - + // Check equivalence using wrapped arrays let mut warray = [Wrapping(0u32); 2]; rng.fill(&mut warray[..]); @@ -672,7 +676,7 @@ mod test { } #[test] - #[cfg(feature="alloc")] + #[cfg(feature = "alloc")] fn test_rng_boxed_trait() { use crate::distributions::{Distribution, Standard}; let rng = rng(110); @@ -684,22 +688,22 @@ mod test { } #[test] - #[cfg(feature="std")] + #[cfg(feature = "std")] fn test_random() { // not sure how to test this aside from just getting some values - let _n : usize = random(); - let _f : f32 = random(); - let _o : Option<Option<i8>> = random(); - let _many : ((), - (usize, - isize, - Option<(u32, (bool,))>), - (u8, i8, u16, i16, u32, i32, u64, i64), - (f32, (f64, (f64,)))) = random(); + let _n: usize = random(); + let _f: f32 = random(); + let _o: Option<Option<i8>> = random(); + let _many: ( + (), + (usize, isize, Option<(u32, (bool,))>), + (u8, i8, u16, i16, u32, i32, u64, i64), + (f32, (f64, (f64,))), + ) = random(); } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_gen_ratio_average() { const NUM: u32 = 3; const DENOM: u32 = 10; @@ -713,7 +717,7 @@ mod test { } } // Have Binomial(N, NUM/DENOM) distribution - let expected = (NUM * N) / DENOM; // exact integer + let expected = (NUM * N) / DENOM; // exact integer assert!(((sum - expected) as i32).abs() < 500); } } diff --git a/vendor/rand/src/prelude.rs b/vendor/rand/src/prelude.rs index 3c386e8629..98ae3bb431 100644 --- a/vendor/rand/src/prelude.rs +++ b/vendor/rand/src/prelude.rs @@ -19,10 +19,15 @@ //! ``` #[doc(no_inline)] pub use crate::distributions::Distribution; +#[cfg(feature = "small_rng")] +#[doc(no_inline)] +pub use crate::rngs::SmallRng; #[doc(no_inline)] pub use crate::rngs::StdRng; -#[cfg(feature="small_rng")] -#[doc(no_inline)] pub use crate::rngs::SmallRng; -#[doc(no_inline)] #[cfg(feature="std")] pub use crate::rngs::ThreadRng; -#[doc(no_inline)] pub use crate::{Rng, RngCore, CryptoRng, SeedableRng}; -#[doc(no_inline)] #[cfg(feature="std")] pub use crate::{random, thread_rng}; -#[doc(no_inline)] pub use crate::seq::{SliceRandom, IteratorRandom}; +#[doc(no_inline)] +#[cfg(feature = "std")] +pub use crate::rngs::ThreadRng; +#[doc(no_inline)] pub use crate::seq::{IteratorRandom, SliceRandom}; +#[doc(no_inline)] +#[cfg(feature = "std")] +pub use crate::{random, thread_rng}; +#[doc(no_inline)] pub use crate::{CryptoRng, Rng, RngCore, SeedableRng}; diff --git a/vendor/rand/src/rngs/adapter/mod.rs b/vendor/rand/src/rngs/adapter/mod.rs index 659ff26218..45e56af726 100644 --- a/vendor/rand/src/rngs/adapter/mod.rs +++ b/vendor/rand/src/rngs/adapter/mod.rs @@ -8,8 +8,8 @@ //! Wrappers / adapters forming RNGs -#[cfg(feature="std")] mod read; +#[cfg(feature = "std")] mod read; mod reseeding; -#[cfg(feature="std")] pub use self::read::{ReadRng, ReadError}; +#[cfg(feature = "std")] pub use self::read::{ReadError, ReadRng}; pub use self::reseeding::ReseedingRng; diff --git a/vendor/rand/src/rngs/adapter/read.rs b/vendor/rand/src/rngs/adapter/read.rs index c64230f305..9a4b55d4e7 100644 --- a/vendor/rand/src/rngs/adapter/read.rs +++ b/vendor/rand/src/rngs/adapter/read.rs @@ -9,10 +9,10 @@ //! A wrapper around any Read to treat it as an RNG. -use std::io::Read; use std::fmt; +use std::io::Read; -use rand_core::{RngCore, Error, impls}; +use rand_core::{impls, Error, RngCore}; /// An RNG that reads random bytes straight from any type supporting @@ -45,15 +45,13 @@ use rand_core::{RngCore, Error, impls}; /// [`try_fill_bytes`]: RngCore::try_fill_bytes #[derive(Debug)] pub struct ReadRng<R> { - reader: R + reader: R, } impl<R: Read> ReadRng<R> { /// Create a new `ReadRng` from a `Read`. pub fn new(r: R) -> ReadRng<R> { - ReadRng { - reader: r - } + ReadRng { reader: r } } } @@ -67,14 +65,22 @@ impl<R: Read> RngCore for ReadRng<R> { } fn fill_bytes(&mut self, dest: &mut [u8]) { - self.try_fill_bytes(dest).unwrap_or_else(|err| - panic!("reading random bytes from Read implementation failed; error: {}", err)); + self.try_fill_bytes(dest).unwrap_or_else(|err| { + panic!( + "reading random bytes from Read implementation failed; error: {}", + err + ) + }); } fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { - if dest.len() == 0 { return Ok(()); } + if dest.is_empty() { + return Ok(()); + } // Use `std::io::read_exact`, which retries on `ErrorKind::Interrupted`. - self.reader.read_exact(dest).map_err(|e| Error::new(ReadError(e))) + self.reader + .read_exact(dest) + .map_err(|e| Error::new(ReadError(e))) } } @@ -103,6 +109,7 @@ mod test { #[test] fn test_reader_rng_u64() { // transmute from the target to avoid endianness concerns. + #[rustfmt::skip] let v = vec![0u8, 0, 0, 0, 0, 0, 0, 1, 0 , 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3]; diff --git a/vendor/rand/src/rngs/adapter/reseeding.rs b/vendor/rand/src/rngs/adapter/reseeding.rs index b05c05247e..5460e3431f 100644 --- a/vendor/rand/src/rngs/adapter/reseeding.rs +++ b/vendor/rand/src/rngs/adapter/reseeding.rs @@ -12,8 +12,8 @@ use core::mem::size_of; -use rand_core::{RngCore, CryptoRng, SeedableRng, Error}; -use rand_core::block::{BlockRngCore, BlockRng}; +use rand_core::block::{BlockRng, BlockRngCore}; +use rand_core::{CryptoRng, Error, RngCore, SeedableRng}; /// A wrapper around any PRNG that implements [`BlockRngCore`], that adds the /// ability to reseed it. @@ -77,12 +77,14 @@ use rand_core::block::{BlockRngCore, BlockRng}; /// [`reseed()`]: ReseedingRng::reseed #[derive(Debug)] pub struct ReseedingRng<R, Rsdr>(BlockRng<ReseedingCore<R, Rsdr>>) -where R: BlockRngCore + SeedableRng, - Rsdr: RngCore; +where + R: BlockRngCore + SeedableRng, + Rsdr: RngCore; impl<R, Rsdr> ReseedingRng<R, Rsdr> -where R: BlockRngCore + SeedableRng, - Rsdr: RngCore +where + R: BlockRngCore + SeedableRng, + Rsdr: RngCore, { /// Create a new `ReseedingRng` from an existing PRNG, combined with a RNG /// to use as reseeder. @@ -103,8 +105,9 @@ where R: BlockRngCore + SeedableRng, // TODO: this should be implemented for any type where the inner type // implements RngCore, but we can't specify that because ReseedingCore is private impl<R, Rsdr: RngCore> RngCore for ReseedingRng<R, Rsdr> -where R: BlockRngCore<Item = u32> + SeedableRng, - <R as BlockRngCore>::Results: AsRef<[u32]> + AsMut<[u32]> +where + R: BlockRngCore<Item = u32> + SeedableRng, + <R as BlockRngCore>::Results: AsRef<[u32]> + AsMut<[u32]>, { #[inline(always)] fn next_u32(&mut self) -> u32 { @@ -126,8 +129,9 @@ where R: BlockRngCore<Item = u32> + SeedableRng, } impl<R, Rsdr> Clone for ReseedingRng<R, Rsdr> -where R: BlockRngCore + SeedableRng + Clone, - Rsdr: RngCore + Clone +where + R: BlockRngCore + SeedableRng + Clone, + Rsdr: RngCore + Clone, { fn clone(&self) -> ReseedingRng<R, Rsdr> { // Recreating `BlockRng` seems easier than cloning it and resetting @@ -137,8 +141,11 @@ where R: BlockRngCore + SeedableRng + Clone, } impl<R, Rsdr> CryptoRng for ReseedingRng<R, Rsdr> -where R: BlockRngCore + SeedableRng + CryptoRng, - Rsdr: RngCore + CryptoRng {} +where + R: BlockRngCore + SeedableRng + CryptoRng, + Rsdr: RngCore + CryptoRng, +{ +} #[derive(Debug)] struct ReseedingCore<R, Rsdr> { @@ -150,16 +157,16 @@ struct ReseedingCore<R, Rsdr> { } impl<R, Rsdr> BlockRngCore for ReseedingCore<R, Rsdr> -where R: BlockRngCore + SeedableRng, - Rsdr: RngCore +where + R: BlockRngCore + SeedableRng, + Rsdr: RngCore, { type Item = <R as BlockRngCore>::Item; type Results = <R as BlockRngCore>::Results; fn generate(&mut self, results: &mut Self::Results) { let global_fork_counter = fork::get_fork_counter(); - if self.bytes_until_reseed <= 0 || - self.is_forked(global_fork_counter) { + if self.bytes_until_reseed <= 0 || self.is_forked(global_fork_counter) { // We get better performance by not calling only `reseed` here // and continuing with the rest of the function, but by directly // returning from a non-inlined function. @@ -172,8 +179,9 @@ where R: BlockRngCore + SeedableRng, } impl<R, Rsdr> ReseedingCore<R, Rsdr> -where R: BlockRngCore + SeedableRng, - Rsdr: RngCore +where + R: BlockRngCore + SeedableRng, + Rsdr: RngCore, { /// Create a new `ReseedingCore`. fn new(rng: R, threshold: u64, reseeder: Rsdr) -> Self { @@ -184,10 +192,13 @@ where R: BlockRngCore + SeedableRng, // current hardware, we just clamp to that value. // Also we set a threshold of 0, which indicates no limit, to that // value. - let threshold = - if threshold == 0 { MAX } - else if threshold <= MAX as u64 { threshold as i64 } - else { MAX }; + let threshold = if threshold == 0 { + MAX + } else if threshold <= MAX as u64 { + threshold as i64 + } else { + MAX + }; ReseedingCore { inner: rng, @@ -221,18 +232,17 @@ where R: BlockRngCore + SeedableRng, } #[inline(never)] - fn reseed_and_generate(&mut self, - results: &mut <Self as BlockRngCore>::Results, - global_fork_counter: usize) - { + fn reseed_and_generate( + &mut self, results: &mut <Self as BlockRngCore>::Results, global_fork_counter: usize, + ) { + #![allow(clippy::if_same_then_else)] // false positive if self.is_forked(global_fork_counter) { info!("Fork detected, reseeding RNG"); } else { trace!("Reseeding RNG (periodic reseed)"); } - let num_bytes = - results.as_ref().len() * size_of::<<R as BlockRngCore>::Item>(); + let num_bytes = results.as_ref().len() * size_of::<<R as BlockRngCore>::Item>(); if let Err(e) = self.reseed() { warn!("Reseeding RNG failed: {}", e); @@ -246,8 +256,9 @@ where R: BlockRngCore + SeedableRng, } impl<R, Rsdr> Clone for ReseedingCore<R, Rsdr> -where R: BlockRngCore + SeedableRng + Clone, - Rsdr: RngCore + Clone +where + R: BlockRngCore + SeedableRng + Clone, + Rsdr: RngCore + Clone, { fn clone(&self) -> ReseedingCore<R, Rsdr> { ReseedingCore { @@ -261,15 +272,17 @@ where R: BlockRngCore + SeedableRng + Clone, } impl<R, Rsdr> CryptoRng for ReseedingCore<R, Rsdr> -where R: BlockRngCore + SeedableRng + CryptoRng, - Rsdr: RngCore + CryptoRng {} +where + R: BlockRngCore + SeedableRng + CryptoRng, + Rsdr: RngCore + CryptoRng, +{ +} -#[cfg(all(unix, not(target_os="emscripten")))] +#[cfg(all(unix, feature = "std", not(target_os = "emscripten")))] mod fork { - use core::sync::atomic::{AtomicUsize, AtomicBool, Ordering}; - #[allow(deprecated)] // Required for compatibility with Rust < 1.24. - use core::sync::atomic::{ATOMIC_USIZE_INIT, ATOMIC_BOOL_INIT}; + use core::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::Once; // Fork protection // @@ -283,43 +296,41 @@ mod fork { // don't update `fork_counter`, so a reseed is attempted as soon as // possible. - #[allow(deprecated)] - static RESEEDING_RNG_FORK_COUNTER: AtomicUsize = ATOMIC_USIZE_INIT; + static RESEEDING_RNG_FORK_COUNTER: AtomicUsize = AtomicUsize::new(0); pub fn get_fork_counter() -> usize { RESEEDING_RNG_FORK_COUNTER.load(Ordering::Relaxed) } - #[allow(deprecated)] - static FORK_HANDLER_REGISTERED: AtomicBool = ATOMIC_BOOL_INIT; - - extern fn fork_handler() { + extern "C" fn fork_handler() { // Note: fetch_add is defined to wrap on overflow // (which is what we want). RESEEDING_RNG_FORK_COUNTER.fetch_add(1, Ordering::Relaxed); } pub fn register_fork_handler() { - if FORK_HANDLER_REGISTERED.load(Ordering::Relaxed) == false { - unsafe { libc::pthread_atfork(None, None, Some(fork_handler)) }; - FORK_HANDLER_REGISTERED.store(true, Ordering::Relaxed); - } + static REGISTER: Once = Once::new(); + REGISTER.call_once(|| unsafe { + libc::pthread_atfork(None, None, Some(fork_handler)); + }); } } -#[cfg(not(all(unix, not(target_os="emscripten"))))] +#[cfg(not(all(unix, feature = "std", not(target_os = "emscripten"))))] mod fork { - pub fn get_fork_counter() -> usize { 0 } + pub fn get_fork_counter() -> usize { + 0 + } pub fn register_fork_handler() {} } #[cfg(test)] mod test { - use crate::{Rng, SeedableRng}; - use crate::rngs::std::Core; - use crate::rngs::mock::StepRng; use super::ReseedingRng; + use crate::rngs::mock::StepRng; + use crate::rngs::std::Core; + use crate::{Rng, SeedableRng}; #[test] fn test_reseeding() { @@ -345,10 +356,12 @@ mod test { fn test_clone_reseeding() { let mut zero = StepRng::new(0, 0); let rng = Core::from_rng(&mut zero).unwrap(); - let mut rng1 = ReseedingRng::new(rng, 32*4, zero); + let mut rng1 = ReseedingRng::new(rng, 32 * 4, zero); let first: u32 = rng1.gen(); - for _ in 0..10 { let _ = rng1.gen::<u32>(); } + for _ in 0..10 { + let _ = rng1.gen::<u32>(); + } let mut rng2 = rng1.clone(); assert_eq!(first, rng2.gen::<u32>()); diff --git a/vendor/rand/src/rngs/entropy.rs b/vendor/rand/src/rngs/entropy.rs index cfb6490fbf..9ad0d71e0c 100644 --- a/vendor/rand/src/rngs/entropy.rs +++ b/vendor/rand/src/rngs/entropy.rs @@ -8,20 +8,19 @@ //! Entropy generator, or wrapper around external generators -#![allow(deprecated)] // whole module is deprecated +#![allow(deprecated)] // whole module is deprecated -use rand_core::{RngCore, CryptoRng, Error}; -#[allow(unused)] use crate::rngs::OsRng; +use rand_core::{CryptoRng, Error, RngCore}; /// An interface returning random data from external source(s), provided /// specifically for securely seeding algorithmic generators (PRNGs). /// /// This is deprecated. It is suggested you use [`rngs::OsRng`] instead. -/// +/// /// [`rngs::OsRng`]: crate::rngs::OsRng #[derive(Debug)] -#[deprecated(since="0.7.0", note="use rngs::OsRng instead")] +#[deprecated(since = "0.7.0", note = "use rngs::OsRng instead")] pub struct EntropyRng { source: OsRng, } @@ -72,6 +71,6 @@ mod test { fn test_entropy() { let mut rng = EntropyRng::new(); let n = (rng.next_u32() ^ rng.next_u32()).count_ones(); - assert!(n >= 2); // p(failure) approx 1e-7 + assert!(n >= 2); // p(failure) approx 1e-7 } } diff --git a/vendor/rand/src/rngs/mock.rs b/vendor/rand/src/rngs/mock.rs index 4e8e74c278..9a47264a76 100644 --- a/vendor/rand/src/rngs/mock.rs +++ b/vendor/rand/src/rngs/mock.rs @@ -8,18 +8,18 @@ //! Mock random number generator -use rand_core::{RngCore, Error, impls}; +use rand_core::{impls, Error, RngCore}; /// A simple implementation of `RngCore` for testing purposes. -/// +/// /// This generates an arithmetic sequence (i.e. adds a constant each step) /// over a `u64` number, using wrapping arithmetic. If the increment is 0 /// the generator yields a constant. -/// +/// /// ``` /// use rand::Rng; /// use rand::rngs::mock::StepRng; -/// +/// /// let mut my_rng = StepRng::new(2, 1); /// let sample: [u64; 3] = my_rng.gen(); /// assert_eq!(sample, [2, 3, 4]); @@ -34,7 +34,10 @@ impl StepRng { /// Create a `StepRng`, yielding an arithmetic sequence starting with /// `initial` and incremented by `increment` each time. pub fn new(initial: u64, increment: u64) -> Self { - StepRng { v: initial, a: increment } + StepRng { + v: initial, + a: increment, + } } } @@ -58,6 +61,7 @@ impl RngCore for StepRng { #[inline] fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { - Ok(self.fill_bytes(dest)) + self.fill_bytes(dest); + Ok(()) } } diff --git a/vendor/rand/src/rngs/mod.rs b/vendor/rand/src/rngs/mod.rs index f9cfe8029c..1112196025 100644 --- a/vendor/rand/src/rngs/mod.rs +++ b/vendor/rand/src/rngs/mod.rs @@ -84,13 +84,11 @@ //! Some suggestions are: [`rand_chacha`], [`rand_pcg`], [`rand_xoshiro`]. //! A full list can be found by searching for crates with the [`rng` tag]. //! -//! [`SmallRng`]: rngs::SmallRng -//! [`StdRng`]: rngs::StdRng -//! [`OsRng`]: rngs::OsRng -//! [`ThreadRng`]: rngs::ThreadRng -//! [`mock::StepRng`]: rngs::mock::StepRng -//! [`adapter::ReadRng`]: rngs::adapter::ReadRng -//! [`adapter::ReseedingRng`]: rngs::adapter::ReseedingRng +//! [`Rng`]: crate::Rng +//! [`RngCore`]: crate::RngCore +//! [`CryptoRng`]: crate::CryptoRng +//! [`SeedableRng`]: crate::SeedableRng +//! [`thread_rng`]: crate::thread_rng //! [`rdrand`]: https://crates.io/crates/rdrand //! [`rand_jitter`]: https://crates.io/crates/rand_jitter //! [`rand_chacha`]: https://crates.io/crates/rand_chacha @@ -100,21 +98,19 @@ pub mod adapter; -#[cfg(feature="std")] mod entropy; -pub mod mock; // Public so we don't export `StepRng` directly, making it a bit - // more clear it is intended for testing. -#[cfg(feature="small_rng")] -mod small; +#[cfg(feature = "std")] mod entropy; +pub mod mock; // Public so we don't export `StepRng` directly, making it a bit + // more clear it is intended for testing. +#[cfg(feature = "small_rng")] mod small; mod std; -#[cfg(feature="std")] pub(crate) mod thread; +#[cfg(feature = "std")] pub(crate) mod thread; #[allow(deprecated)] -#[cfg(feature="std")] pub use self::entropy::EntropyRng; +#[cfg(feature = "std")] +pub use self::entropy::EntropyRng; -#[cfg(feature="small_rng")] -pub use self::small::SmallRng; +#[cfg(feature = "small_rng")] pub use self::small::SmallRng; pub use self::std::StdRng; -#[cfg(feature="std")] pub use self::thread::ThreadRng; +#[cfg(feature = "std")] pub use self::thread::ThreadRng; -#[cfg(feature="getrandom")] mod os; -#[cfg(feature="getrandom")] pub use self::os::OsRng; +#[cfg(feature = "getrandom")] pub use rand_core::OsRng; diff --git a/vendor/rand/src/rngs/os.rs b/vendor/rand/src/rngs/os.rs deleted file mode 100644 index 46c3483d94..0000000000 --- a/vendor/rand/src/rngs/os.rs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2019 Developers of the Rand project. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Interface to the random number generator of the operating system. -// Note: keep this code in sync with the rand_os crate! - -use crate::getrandom::getrandom; -use rand_core::{CryptoRng, RngCore, Error, impls}; - -/// A random number generator that retrieves randomness from from the -/// operating system. -/// -/// This is a zero-sized struct. It can be freely constructed with `OsRng`. -/// -/// The implementation is provided by the [getrandom] crate. Refer to -/// [getrandom] documentation for details. -/// -/// # Blocking and error handling -/// -/// It is possible that when used during early boot the first call to `OsRng` -/// will block until the system's RNG is initialised. It is also possible -/// (though highly unlikely) for `OsRng` to fail on some platforms, most -/// likely due to system mis-configuration. -/// -/// After the first successful call, it is highly unlikely that failures or -/// significant delays will occur (although performance should be expected to -/// be much slower than a user-space PRNG). -/// -/// # Usage example -/// ``` -/// use rand::rngs::{StdRng, OsRng}; -/// use rand::{RngCore, SeedableRng}; -/// -/// let mut key = [0u8; 16]; -/// OsRng.fill_bytes(&mut key); -/// let random_u64 = OsRng.next_u64(); -/// -/// // OsRng is especially useful for seeding other RNGs (see also from_entropy) -/// let mut rng = StdRng::from_rng(OsRng).unwrap(); -/// let _ = rng.next_u32(); -/// ``` -/// -/// [getrandom]: https://crates.io/crates/getrandom -#[derive(Clone, Copy, Debug, Default)] -pub struct OsRng; - -impl OsRng { - /// Create a new `OsRng`. - #[deprecated(since="0.7.0", note="replace OsRng::new().unwrap() with just OsRng")] - pub fn new() -> Result<OsRng, Error> { - Ok(OsRng) - } -} - -impl CryptoRng for OsRng {} - -impl RngCore for OsRng { - fn next_u32(&mut self) -> u32 { - impls::next_u32_via_fill(self) - } - - fn next_u64(&mut self) -> u64 { - impls::next_u64_via_fill(self) - } - - fn fill_bytes(&mut self, dest: &mut [u8]) { - if let Err(e) = self.try_fill_bytes(dest) { - panic!("Error: {}", e); - } - } - - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { - getrandom(dest)?; - Ok(()) - } -} - -#[test] -fn test_os_rng() { - let x = OsRng.next_u64(); - let y = OsRng.next_u64(); - assert!(x != 0); - assert!(x != y); -} - -#[test] -fn test_construction() { - let mut rng = OsRng::default(); - assert!(rng.next_u64() != 0); -} diff --git a/vendor/rand/src/rngs/small.rs b/vendor/rand/src/rngs/small.rs index 6958a0b40d..d676898149 100644 --- a/vendor/rand/src/rngs/small.rs +++ b/vendor/rand/src/rngs/small.rs @@ -8,7 +8,7 @@ //! A small fast RNG -use rand_core::{RngCore, SeedableRng, Error}; +use rand_core::{Error, RngCore, SeedableRng}; #[cfg(all(not(target_os = "emscripten"), target_pointer_width = "64"))] type Rng = rand_pcg::Pcg64Mcg; @@ -34,8 +34,8 @@ type Rng = rand_pcg::Pcg32; /// The PRNG algorithm in `SmallRng` is chosen to be /// efficient on the current platform, without consideration for cryptography /// or security. The size of its state is much smaller than [`StdRng`]. -/// The current algorithm is [`Pcg64Mcg`][rand_pcg::Pcg64Mcg] on 64-bit -/// platforms and [`Pcg32`][rand_pcg::Pcg32] on 32-bit platforms. Both are +/// The current algorithm is [`Pcg64Mcg`](rand_pcg::Pcg64Mcg) on 64-bit +/// platforms and [`Pcg32`](rand_pcg::Pcg32) on 32-bit platforms. Both are /// implemented by the [rand_pcg] crate. /// /// # Examples @@ -56,7 +56,6 @@ type Rng = rand_pcg::Pcg32; /// efficient: /// /// ``` -/// use std::iter; /// use rand::{SeedableRng, thread_rng}; /// use rand::rngs::SmallRng; /// @@ -65,9 +64,8 @@ type Rng = rand_pcg::Pcg32; /// let mut thread_rng = thread_rng(); /// // Create small, cheap to initialize and fast RNGs with random seeds. /// // One can generally assume this won't fail. -/// let rngs: Vec<SmallRng> = iter::repeat(()) -/// .map(|()| SmallRng::from_rng(&mut thread_rng).unwrap()) -/// .take(10) +/// let rngs: Vec<SmallRng> = (0..10) +/// .map(|_| SmallRng::from_rng(&mut thread_rng).unwrap()) /// .collect(); /// ``` /// diff --git a/vendor/rand/src/rngs/std.rs b/vendor/rand/src/rngs/std.rs index 22e08ae6b6..8b07081a04 100644 --- a/vendor/rand/src/rngs/std.rs +++ b/vendor/rand/src/rngs/std.rs @@ -8,19 +8,21 @@ //! The standard RNG -use crate::{RngCore, CryptoRng, Error, SeedableRng}; +use crate::{CryptoRng, Error, RngCore, SeedableRng}; + +#[cfg(all(any(test, feature = "std"), not(target_os = "emscripten")))] +pub(crate) use rand_chacha::ChaCha20Core as Core; +#[cfg(all(any(test, feature = "std"), target_os = "emscripten"))] +pub(crate) use rand_hc::Hc128Core as Core; -#[cfg(target_os = "emscripten")] pub(crate) use rand_hc::Hc128Core as Core; -#[cfg(not(target_os = "emscripten"))] pub(crate) use rand_chacha::ChaCha20Core as Core; -#[cfg(target_os = "emscripten")] use rand_hc::Hc128Rng as Rng; #[cfg(not(target_os = "emscripten"))] use rand_chacha::ChaCha20Rng as Rng; +#[cfg(target_os = "emscripten")] use rand_hc::Hc128Rng as Rng; /// The standard RNG. The PRNG algorithm in `StdRng` is chosen to be efficient /// on the current platform, to be statistically strong and unpredictable /// (meaning a cryptographically secure PRNG). /// -/// The current algorithm used is the ChaCha block cipher with either 20 or 12 -/// rounds (see the `stdrng_*` feature flags, documented in the README). +/// The current algorithm used is the ChaCha block cipher with 20 rounds. /// This may change as new evidence of cipher security and performance /// becomes available. /// @@ -74,21 +76,22 @@ impl CryptoRng for StdRng {} #[cfg(test)] mod test { - use crate::{RngCore, SeedableRng}; use crate::rngs::StdRng; + use crate::{RngCore, SeedableRng}; #[test] fn test_stdrng_construction() { // Test value-stability of StdRng. This is expected to break any time // the algorithm is changed. + #[rustfmt::skip] let seed = [1,0,0,0, 23,0,0,0, 200,1,0,0, 210,30,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]; - #[cfg(any(feature="stdrng_strong", not(feature="stdrng_fast")))] + #[cfg(any(feature = "stdrng_strong", not(feature = "stdrng_fast")))] let target = [3950704604716924505, 5573172343717151650]; - #[cfg(all(not(feature="stdrng_strong"), feature="stdrng_fast"))] + #[cfg(all(not(feature = "stdrng_strong"), feature = "stdrng_fast"))] let target = [10719222850664546238, 14064965282130556830]; - + let mut rng0 = StdRng::from_seed(seed); let x0 = rng0.next_u64(); diff --git a/vendor/rand/src/rngs/thread.rs b/vendor/rand/src/rngs/thread.rs index 2006f4176f..91ed4c30a8 100644 --- a/vendor/rand/src/rngs/thread.rs +++ b/vendor/rand/src/rngs/thread.rs @@ -11,10 +11,10 @@ use std::cell::UnsafeCell; use std::ptr::NonNull; -use crate::{RngCore, CryptoRng, SeedableRng, Error}; +use super::std::Core; use crate::rngs::adapter::ReseedingRng; use crate::rngs::OsRng; -use super::std::Core; +use crate::{CryptoRng, Error, RngCore, SeedableRng}; // Rationale for using `UnsafeCell` in `ThreadRng`: // diff --git a/vendor/rand/src/seq/index.rs b/vendor/rand/src/seq/index.rs index 0c9a477f24..551d409e71 100644 --- a/vendor/rand/src/seq/index.rs +++ b/vendor/rand/src/seq/index.rs @@ -8,15 +8,18 @@ //! Low-level API for sampling indices -#[cfg(feature="alloc")] use core::slice; +#[cfg(feature = "alloc")] use core::slice; -#[cfg(feature="std")] use std::vec; -#[cfg(all(feature="alloc", not(feature="std")))] use crate::alloc::vec::{self, Vec}; +#[cfg(all(feature = "alloc", not(feature = "std")))] +use crate::alloc::vec::{self, Vec}; +#[cfg(feature = "std")] use std::vec; // BTreeMap is not as fast in tests, but better than nothing. -#[cfg(feature="std")] use std::collections::{HashSet}; -#[cfg(all(feature="alloc", not(feature="std")))] use crate::alloc::collections::BTreeSet; +#[cfg(all(feature = "alloc", not(feature = "std")))] +use crate::alloc::collections::BTreeSet; +#[cfg(feature = "std")] use std::collections::HashSet; -#[cfg(feature="alloc")] use crate::distributions::{Distribution, Uniform, uniform::SampleUniform}; +#[cfg(feature = "alloc")] +use crate::distributions::{uniform::SampleUniform, Distribution, Uniform}; use crate::Rng; /// A vector of indices. @@ -24,16 +27,28 @@ use crate::Rng; /// Multiple internal representations are possible. #[derive(Clone, Debug)] pub enum IndexVec { - #[doc(hidden)] U32(Vec<u32>), - #[doc(hidden)] USize(Vec<usize>), + #[doc(hidden)] + U32(Vec<u32>), + #[doc(hidden)] + USize(Vec<usize>), } impl IndexVec { /// Returns the number of indices + #[inline] pub fn len(&self) -> usize { - match self { - &IndexVec::U32(ref v) => v.len(), - &IndexVec::USize(ref v) => v.len(), + match *self { + IndexVec::U32(ref v) => v.len(), + IndexVec::USize(ref v) => v.len(), + } + } + + /// Returns `true` if the length is 0. + #[inline] + pub fn is_empty(&self) -> bool { + match *self { + IndexVec::U32(ref v) => v.is_empty(), + IndexVec::USize(ref v) => v.is_empty(), } } @@ -41,14 +56,16 @@ impl IndexVec { /// /// (Note: we cannot implement [`std::ops::Index`] because of lifetime /// restrictions.) + #[inline] pub fn index(&self, index: usize) -> usize { - match self { - &IndexVec::U32(ref v) => v[index] as usize, - &IndexVec::USize(ref v) => v[index], + match *self { + IndexVec::U32(ref v) => v[index] as usize, + IndexVec::USize(ref v) => v[index], } } /// Return result as a `Vec<usize>`. Conversion may or may not be trivial. + #[inline] pub fn into_vec(self) -> Vec<usize> { match self { IndexVec::U32(v) => v.into_iter().map(|i| i as usize).collect(), @@ -57,14 +74,16 @@ impl IndexVec { } /// Iterate over the indices as a sequence of `usize` values - pub fn iter<'a>(&'a self) -> IndexVecIter<'a> { - match self { - &IndexVec::U32(ref v) => IndexVecIter::U32(v.iter()), - &IndexVec::USize(ref v) => IndexVecIter::USize(v.iter()), + #[inline] + pub fn iter(&self) -> IndexVecIter<'_> { + match *self { + IndexVec::U32(ref v) => IndexVecIter::U32(v.iter()), + IndexVec::USize(ref v) => IndexVecIter::USize(v.iter()), } } /// Convert into an iterator over the indices as a sequence of `usize` values + #[inline] pub fn into_iter(self) -> IndexVecIntoIter { match self { IndexVec::U32(v) => IndexVecIntoIter::U32(v.into_iter()), @@ -79,21 +98,25 @@ impl PartialEq for IndexVec { match (self, other) { (&U32(ref v1), &U32(ref v2)) => v1 == v2, (&USize(ref v1), &USize(ref v2)) => v1 == v2, - (&U32(ref v1), &USize(ref v2)) => (v1.len() == v2.len()) - && (v1.iter().zip(v2.iter()).all(|(x, y)| *x as usize == *y)), - (&USize(ref v1), &U32(ref v2)) => (v1.len() == v2.len()) - && (v1.iter().zip(v2.iter()).all(|(x, y)| *x == *y as usize)), + (&U32(ref v1), &USize(ref v2)) => { + (v1.len() == v2.len()) && (v1.iter().zip(v2.iter()).all(|(x, y)| *x as usize == *y)) + } + (&USize(ref v1), &U32(ref v2)) => { + (v1.len() == v2.len()) && (v1.iter().zip(v2.iter()).all(|(x, y)| *x == *y as usize)) + } } } } impl From<Vec<u32>> for IndexVec { + #[inline] fn from(v: Vec<u32>) -> Self { IndexVec::U32(v) } } impl From<Vec<usize>> for IndexVec { + #[inline] fn from(v: Vec<usize>) -> Self { IndexVec::USize(v) } @@ -102,24 +125,29 @@ impl From<Vec<usize>> for IndexVec { /// Return type of `IndexVec::iter`. #[derive(Debug)] pub enum IndexVecIter<'a> { - #[doc(hidden)] U32(slice::Iter<'a, u32>), - #[doc(hidden)] USize(slice::Iter<'a, usize>), + #[doc(hidden)] + U32(slice::Iter<'a, u32>), + #[doc(hidden)] + USize(slice::Iter<'a, usize>), } impl<'a> Iterator for IndexVecIter<'a> { type Item = usize; + + #[inline] fn next(&mut self) -> Option<usize> { use self::IndexVecIter::*; - match self { - &mut U32(ref mut iter) => iter.next().map(|i| *i as usize), - &mut USize(ref mut iter) => iter.next().cloned(), + match *self { + U32(ref mut iter) => iter.next().map(|i| *i as usize), + USize(ref mut iter) => iter.next().cloned(), } } + #[inline] fn size_hint(&self) -> (usize, Option<usize>) { - match self { - &IndexVecIter::U32(ref v) => v.size_hint(), - &IndexVecIter::USize(ref v) => v.size_hint(), + match *self { + IndexVecIter::U32(ref v) => v.size_hint(), + IndexVecIter::USize(ref v) => v.size_hint(), } } } @@ -129,26 +157,30 @@ impl<'a> ExactSizeIterator for IndexVecIter<'a> {} /// Return type of `IndexVec::into_iter`. #[derive(Clone, Debug)] pub enum IndexVecIntoIter { - #[doc(hidden)] U32(vec::IntoIter<u32>), - #[doc(hidden)] USize(vec::IntoIter<usize>), + #[doc(hidden)] + U32(vec::IntoIter<u32>), + #[doc(hidden)] + USize(vec::IntoIter<usize>), } impl Iterator for IndexVecIntoIter { type Item = usize; + #[inline] fn next(&mut self) -> Option<Self::Item> { use self::IndexVecIntoIter::*; - match self { - &mut U32(ref mut v) => v.next().map(|i| i as usize), - &mut USize(ref mut v) => v.next(), + match *self { + U32(ref mut v) => v.next().map(|i| i as usize), + USize(ref mut v) => v.next(), } } + #[inline] fn size_hint(&self) -> (usize, Option<usize>) { use self::IndexVecIntoIter::*; - match self { - &U32(ref v) => v.size_hint(), - &USize(ref v) => v.size_hint(), + match *self { + U32(ref v) => v.size_hint(), + USize(ref v) => v.size_hint(), } } } @@ -196,7 +228,7 @@ where R: Rng + ?Sized { // We do some calculations with f32. Accuracy is not very important. if amount < 163 { - const C: [[f32; 2]; 2] = [[1.6, 8.0/45.0], [10.0, 70.0/9.0]]; + const C: [[f32; 2]; 2] = [[1.6, 8.0 / 45.0], [10.0, 70.0 / 9.0]]; let j = if length < 500_000 { 0 } else { 1 }; let amount_fp = amount as f32; let m4 = C[0][j] * amount_fp; @@ -207,7 +239,7 @@ where R: Rng + ?Sized { sample_floyd(rng, length, amount) } } else { - const C: [f32; 2] = [270.0, 330.0/9.0]; + const C: [f32; 2] = [270.0, 330.0 / 9.0]; let j = if length < 500_000 { 0 } else { 1 }; if (length as f32) < C[j] * (amount as f32) { sample_inplace(rng, length, amount) @@ -232,18 +264,16 @@ where R: Rng + ?Sized { debug_assert!(amount <= length); let mut indices = Vec::with_capacity(amount as usize); - for j in length - amount .. length { + for j in length - amount..length { let t = rng.gen_range(0, j + 1); if floyd_shuffle { if let Some(pos) = indices.iter().position(|&x| x == t) { indices.insert(pos, j); continue; } - } else { - if indices.contains(&t) { - indices.push(j); - continue; - } + } else if indices.contains(&t) { + indices.push(j); + continue; } indices.push(t); } @@ -288,12 +318,26 @@ trait UInt: Copy + PartialOrd + Ord + PartialEq + Eq + SampleUniform + core::has fn as_usize(self) -> usize; } impl UInt for u32 { - #[inline] fn zero() -> Self { 0 } - #[inline] fn as_usize(self) -> usize { self as usize } + #[inline] + fn zero() -> Self { + 0 + } + + #[inline] + fn as_usize(self) -> usize { + self as usize + } } impl UInt for usize { - #[inline] fn zero() -> Self { 0 } - #[inline] fn as_usize(self) -> usize { self } + #[inline] + fn zero() -> Self { + 0 + } + + #[inline] + fn as_usize(self) -> usize { + self + } } /// Randomly sample exactly `amount` indices from `0..length`, using rejection @@ -302,14 +346,19 @@ impl UInt for usize { /// Since `amount <<< length` there is a low chance of a random sample in /// `0..length` being a duplicate. We test for duplicates and resample where /// necessary. The algorithm is `O(amount)` time and memory. -/// +/// /// This function is generic over X primarily so that results are value-stable /// over 32-bit and 64-bit platforms. fn sample_rejection<X: UInt, R>(rng: &mut R, length: X, amount: X) -> IndexVec -where R: Rng + ?Sized, IndexVec: From<Vec<X>> { +where + R: Rng + ?Sized, + IndexVec: From<Vec<X>>, +{ debug_assert!(amount < length); - #[cfg(feature="std")] let mut cache = HashSet::with_capacity(amount.as_usize()); - #[cfg(not(feature="std"))] let mut cache = BTreeSet::new(); + #[cfg(feature = "std")] + let mut cache = HashSet::with_capacity(amount.as_usize()); + #[cfg(not(feature = "std"))] + let mut cache = BTreeSet::new(); let distr = Uniform::new(X::zero(), length); let mut indices = Vec::with_capacity(amount.as_usize()); for _ in 0..amount.as_usize() { @@ -326,9 +375,9 @@ where R: Rng + ?Sized, IndexVec: From<Vec<X>> { #[cfg(test)] mod test { - #[cfg(feature="std")] use std::vec; - #[cfg(all(feature="alloc", not(feature="std")))] use crate::alloc::vec; use super::*; + #[cfg(all(feature = "alloc", not(feature = "std")))] use crate::alloc::vec; + #[cfg(feature = "std")] use std::vec; #[test] fn test_sample_boundaries() { @@ -345,17 +394,15 @@ mod test { assert_eq!(sample_floyd(&mut r, 1, 1).into_vec(), vec![0]); // These algorithms should be fast with big numbers. Test average. - let sum: usize = sample_rejection(&mut r, 1 << 25, 10u32) - .into_iter().sum(); + let sum: usize = sample_rejection(&mut r, 1 << 25, 10u32).into_iter().sum(); assert!(1 << 25 < sum && sum < (1 << 25) * 25); - let sum: usize = sample_floyd(&mut r, 1 << 25, 10) - .into_iter().sum(); + let sum: usize = sample_floyd(&mut r, 1 << 25, 10).into_iter().sum(); assert!(1 << 25 < sum && sum < (1 << 25) * 25); } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_sample_alg() { let seed_rng = crate::test::rng; @@ -375,14 +422,14 @@ mod test { assert!(v1 != v3); // A large length and small amount should use Floyd - let (length, amount): (usize, usize) = (1<<20, 50); + let (length, amount): (usize, usize) = (1 << 20, 50); let v1 = sample(&mut seed_rng(421), length, amount); let v2 = sample_floyd(&mut seed_rng(421), length as u32, amount as u32); assert!(v1.iter().all(|e| e < length)); assert_eq!(v1, v2); // A large length and larger amount should use cache - let (length, amount): (usize, usize) = (1<<20, 600); + let (length, amount): (usize, usize) = (1 << 20, 600); let v1 = sample(&mut seed_rng(422), length, amount); let v2 = sample_rejection(&mut seed_rng(422), length as u32, amount as u32); assert!(v1.iter().all(|e| e < length)); diff --git a/vendor/rand/src/seq/mod.rs b/vendor/rand/src/seq/mod.rs index 1f3d103d49..dabf329279 100644 --- a/vendor/rand/src/seq/mod.rs +++ b/vendor/rand/src/seq/mod.rs @@ -7,42 +7,43 @@ // except according to those terms. //! Sequence-related functionality -//! +//! //! This module provides: -//! -//! * [`seq::SliceRandom`] slice sampling and mutation -//! * [`seq::IteratorRandom`] iterator sampling -//! * [`seq::index::sample`] low-level API to choose multiple indices from +//! +//! * [`SliceRandom`] slice sampling and mutation +//! * [`IteratorRandom`] iterator sampling +//! * [`index::sample`] low-level API to choose multiple indices from //! `0..length` -//! +//! //! Also see: -//! -//! * [`distributions::weighted`] module which provides implementations of -//! weighted index sampling. -//! +//! +//! * [`crate::distributions::weighted`] module which provides +//! implementations of weighted index sampling. +//! //! In order to make results reproducible across 32-64 bit architectures, all //! `usize` indices are sampled as a `u32` where possible (also providing a //! small performance boost in some cases). -#[cfg(feature="alloc")] pub mod index; +#[cfg(feature = "alloc")] pub mod index; -#[cfg(feature="alloc")] use core::ops::Index; +#[cfg(feature = "alloc")] use core::ops::Index; -#[cfg(all(feature="alloc", not(feature="std")))] use crate::alloc::vec::Vec; +#[cfg(all(feature = "alloc", not(feature = "std")))] use crate::alloc::vec::Vec; +#[cfg(feature = "alloc")] +use crate::distributions::uniform::{SampleBorrow, SampleUniform}; +#[cfg(feature = "alloc")] use crate::distributions::WeightedError; use crate::Rng; -#[cfg(feature="alloc")] use crate::distributions::WeightedError; -#[cfg(feature="alloc")] use crate::distributions::uniform::{SampleUniform, SampleBorrow}; /// Extension trait on slices, providing random mutation and sampling methods. -/// +/// /// This trait is implemented on all `[T]` slice types, providing several /// methods for choosing and shuffling elements. You must `use` this trait: -/// +/// /// ``` /// use rand::seq::SliceRandom; -/// +/// /// fn main() { /// let mut rng = rand::thread_rng(); /// let mut bytes = "Hello, random!".to_string().into_bytes(); @@ -61,7 +62,7 @@ pub trait SliceRandom { /// Returns a reference to one random element of the slice, or `None` if the /// slice is empty. - /// + /// /// For slices, complexity is `O(1)`. /// /// # Example @@ -115,7 +116,7 @@ pub trait SliceRandom { /// Similar to [`choose`], but where the likelihood of each outcome may be /// specified. - /// + /// /// The specified function `weight` maps each item `x` to a relative /// likelihood `weight(x)`. The probability of each item being selected is /// therefore `weight(x) / s`, where `s` is the sum of all `weight(x)`. @@ -152,7 +153,7 @@ pub trait SliceRandom { /// Similar to [`choose_mut`], but where the likelihood of each outcome may /// be specified. - /// + /// /// The specified function `weight` maps each item `x` to a relative /// likelihood `weight(x)`. The probability of each item being selected is /// therefore `weight(x) / s`, where `s` is the sum of all `weight(x)`. @@ -220,13 +221,13 @@ pub trait SliceRandom { } /// Extension trait on iterators, providing random sampling methods. -/// +/// /// This trait is implemented on all sized iterators, providing methods for /// choosing one or more elements. You must `use` this trait: -/// +/// /// ``` /// use rand::seq::IteratorRandom; -/// +/// /// fn main() { /// let mut rng = rand::thread_rng(); /// @@ -240,7 +241,7 @@ pub trait SliceRandom { /// ``` pub trait IteratorRandom: Iterator + Sized { /// Choose one element at random from the iterator. - /// + /// /// Returns `None` if and only if the iterator is empty. /// /// This method uses [`Iterator::size_hint`] for optimisation. With an @@ -248,7 +249,7 @@ pub trait IteratorRandom: Iterator + Sized { /// this method can offer `O(1)` performance. Where no size hint is /// available, complexity is `O(n)` where `n` is the iterator length. /// Partial hints (where `lower > 0`) also improve performance. - /// + /// /// For slices, prefer [`SliceRandom::choose`] which guarantees `O(1)` /// performance. fn choose<R>(mut self, rng: &mut R) -> Option<Self::Item> @@ -258,20 +259,23 @@ pub trait IteratorRandom: Iterator + Sized { let mut result = None; if upper == Some(lower) { - return if lower == 0 { None } else { self.nth(gen_index(rng, lower)) }; + return if lower == 0 { + None + } else { + self.nth(gen_index(rng, lower)) + }; } // Continue until the iterator is exhausted loop { if lower > 1 { let ix = gen_index(rng, lower + consumed); - let skip; - if ix < lower { + let skip = if ix < lower { result = self.nth(ix); - skip = lower - (ix + 1); + lower - (ix + 1) } else { - skip = lower; - } + lower + }; if upper == Some(lower) { return result; } @@ -479,7 +483,7 @@ impl<I> IteratorRandom for I where I: Iterator + Sized {} /// An iterator over multiple slice elements. -/// +/// /// This struct is created by /// [`SliceRandom::choose_multiple`](trait.SliceRandom.html#tymethod.choose_multiple). #[cfg(feature = "alloc")] @@ -531,13 +535,14 @@ fn gen_index<R: Rng + ?Sized>(rng: &mut R, ubound: usize) -> usize { mod test { use super::*; #[cfg(feature = "alloc")] use crate::Rng; - #[cfg(all(feature="alloc", not(feature="std")))] - use alloc::vec::Vec; + #[cfg(all(feature = "alloc", not(feature = "std")))] use alloc::vec::Vec; #[test] fn test_slice_choose() { let mut r = crate::test::rng(107); - let chars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']; + let chars = [ + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + ]; let mut chosen = [0i32; 14]; // The below all use a binomial distribution with n=1000, p=1/14. // binocdf(40, 1000, 1/14) ~= 2e-5; 1-binocdf(106, ..) ~= 2e-5 @@ -568,6 +573,7 @@ mod test { } impl<I: Iterator + Clone> Iterator for UnhintedIterator<I> { type Item = I::Item; + fn next(&mut self) -> Option<Self::Item> { self.iter.next() } @@ -582,18 +588,25 @@ mod test { } impl<I: ExactSizeIterator + Iterator + Clone> Iterator for ChunkHintedIterator<I> { type Item = I::Item; + fn next(&mut self) -> Option<Self::Item> { if self.chunk_remaining == 0 { - self.chunk_remaining = ::core::cmp::min(self.chunk_size, - self.iter.len()); + self.chunk_remaining = ::core::cmp::min(self.chunk_size, self.iter.len()); } self.chunk_remaining = self.chunk_remaining.saturating_sub(1); self.iter.next() } + fn size_hint(&self) -> (usize, Option<usize>) { - (self.chunk_remaining, - if self.hint_total_size { Some(self.iter.len()) } else { None }) + ( + self.chunk_remaining, + if self.hint_total_size { + Some(self.iter.len()) + } else { + None + }, + ) } } @@ -605,20 +618,28 @@ mod test { } impl<I: ExactSizeIterator + Iterator + Clone> Iterator for WindowHintedIterator<I> { type Item = I::Item; + fn next(&mut self) -> Option<Self::Item> { self.iter.next() } + fn size_hint(&self) -> (usize, Option<usize>) { - (::core::cmp::min(self.iter.len(), self.window_size), - if self.hint_total_size { Some(self.iter.len()) } else { None }) + ( + ::core::cmp::min(self.iter.len(), self.window_size), + if self.hint_total_size { + Some(self.iter.len()) + } else { + None + }, + ) } } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_iterator_choose() { let r = &mut crate::test::rng(109); - fn test_iter<R: Rng + ?Sized, Iter: Iterator<Item=usize> + Clone>(r: &mut R, iter: Iter) { + fn test_iter<R: Rng + ?Sized, Iter: Iterator<Item = usize> + Clone>(r: &mut R, iter: Iter) { let mut chosen = [0i32; 9]; for _ in 0..1000 { let picked = iter.clone().choose(r).unwrap(); @@ -628,7 +649,11 @@ mod test { // Samples should follow Binomial(1000, 1/9) // Octave: binopdf(x, 1000, 1/9) gives the prob of *count == x // Note: have seen 153, which is unlikely but not impossible. - assert!(72 < *count && *count < 154, "count not close to 1000/9: {}", count); + assert!( + 72 < *count && *count < 154, + "count not close to 1000/9: {}", + count + ); } } @@ -637,17 +662,35 @@ mod test { #[cfg(feature = "alloc")] test_iter(r, (0..9).collect::<Vec<_>>().into_iter()); test_iter(r, UnhintedIterator { iter: 0..9 }); - test_iter(r, ChunkHintedIterator { iter: 0..9, chunk_size: 4, chunk_remaining: 4, hint_total_size: false }); - test_iter(r, ChunkHintedIterator { iter: 0..9, chunk_size: 4, chunk_remaining: 4, hint_total_size: true }); - test_iter(r, WindowHintedIterator { iter: 0..9, window_size: 2, hint_total_size: false }); - test_iter(r, WindowHintedIterator { iter: 0..9, window_size: 2, hint_total_size: true }); + test_iter(r, ChunkHintedIterator { + iter: 0..9, + chunk_size: 4, + chunk_remaining: 4, + hint_total_size: false, + }); + test_iter(r, ChunkHintedIterator { + iter: 0..9, + chunk_size: 4, + chunk_remaining: 4, + hint_total_size: true, + }); + test_iter(r, WindowHintedIterator { + iter: 0..9, + window_size: 2, + hint_total_size: false, + }); + test_iter(r, WindowHintedIterator { + iter: 0..9, + window_size: 2, + hint_total_size: true, + }); assert_eq!((0..0).choose(r), None); - assert_eq!(UnhintedIterator{ iter: 0..0 }.choose(r), None); + assert_eq!(UnhintedIterator { iter: 0..0 }.choose(r), None); } #[test] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_shuffle() { let mut r = crate::test::rng(108); let empty: &mut [isize] = &mut []; @@ -695,15 +738,15 @@ mod test { assert!(352 <= *count && *count <= 483, "count: {}", count); } } - + #[test] fn test_partial_shuffle() { let mut r = crate::test::rng(118); - + let mut empty: [u32; 0] = []; let res = empty.partial_shuffle(&mut r, 10); assert_eq!((res.0.len(), res.1.len()), (0, 0)); - + let mut v = [1, 2, 3, 4, 5]; let res = v.partial_shuffle(&mut r, 2); assert_eq!((res.0.len(), res.1.len()), (2, 3)); @@ -728,14 +771,14 @@ mod test { // no randomization happens when amount >= len assert_eq!(large_sample, vals.iter().collect::<Vec<_>>()); - assert!(small_sample.iter().all(|e| { - **e >= min_val && **e <= max_val - })); + assert!(small_sample + .iter() + .all(|e| { **e >= min_val && **e <= max_val })); } - + #[test] #[cfg(feature = "alloc")] - #[cfg(not(miri))] // Miri is too slow + #[cfg_attr(miri, ignore)] // Miri is too slow fn test_weighted() { let mut r = crate::test::rng(406); const N_REPS: u32 = 3000; @@ -783,10 +826,25 @@ mod test { // Check error cases let empty_slice = &mut [10][0..0]; - assert_eq!(empty_slice.choose_weighted(&mut r, |_| 1), Err(WeightedError::NoItem)); - assert_eq!(empty_slice.choose_weighted_mut(&mut r, |_| 1), Err(WeightedError::NoItem)); - assert_eq!(['x'].choose_weighted_mut(&mut r, |_| 0), Err(WeightedError::AllWeightsZero)); - assert_eq!([0, -1].choose_weighted_mut(&mut r, |x| *x), Err(WeightedError::InvalidWeight)); - assert_eq!([-1, 0].choose_weighted_mut(&mut r, |x| *x), Err(WeightedError::InvalidWeight)); + assert_eq!( + empty_slice.choose_weighted(&mut r, |_| 1), + Err(WeightedError::NoItem) + ); + assert_eq!( + empty_slice.choose_weighted_mut(&mut r, |_| 1), + Err(WeightedError::NoItem) + ); + assert_eq!( + ['x'].choose_weighted_mut(&mut r, |_| 0), + Err(WeightedError::AllWeightsZero) + ); + assert_eq!( + [0, -1].choose_weighted_mut(&mut r, |x| *x), + Err(WeightedError::InvalidWeight) + ); + assert_eq!( + [-1, 0].choose_weighted_mut(&mut r, |x| *x), + Err(WeightedError::InvalidWeight) + ); } } diff --git a/vendor/rand_core-0.4.0/.cargo-checksum.json b/vendor/rand_core-0.4.0/.cargo-checksum.json deleted file mode 100644 index 2979fb2653..0000000000 --- a/vendor/rand_core-0.4.0/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"CHANGELOG.md":"93b4744c0355f232107547993a0d771bd276962c9233d4ea1cd4771d7c2f7f92","COPYRIGHT":"90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5","Cargo.toml":"faab1bf947b13c78f97d87f0bd1ab5611b5fd9e128106282c50f03077b22cd2c","LICENSE-APACHE":"aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf","LICENSE-MIT":"209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b","README.md":"26d2c4a2f9c2c3016b76f27eed164adfffcc359b395ed8ec6df255c42eb9a117","src/block.rs":"43778ab70f0b650c3203a6da70b40bc33afa845a5e14ef88dd26c18a07b70f88","src/error.rs":"8403a968d7c9bd95cc9f23d9dc5cc4771ede8e81dda5a8fdd59d347590345d14","src/impls.rs":"c248ddd04a65c974768baaec028fa0d2a6117525fa27bce8a98f2ba2f352700a","src/le.rs":"cb187f58f7514877918f7f47633397e08e20392dcf072bc245d62c9e5238198c","src/lib.rs":"5b3d95e405bed6dc1e4525cc010f0afb2c9f0fc9fe8533f6a02e70ea112c22be"},"package":"d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0"} \ No newline at end of file diff --git a/vendor/rand_core-0.4.0/CHANGELOG.md b/vendor/rand_core-0.4.0/CHANGELOG.md deleted file mode 100644 index 7f2d7978fd..0000000000 --- a/vendor/rand_core-0.4.0/CHANGELOG.md +++ /dev/null @@ -1,36 +0,0 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [0.4.0] - 2019-01-24 -- Disable the `std` feature by default (#702) - -## [0.3.0] - 2018-09-24 -- Add `SeedableRng::seed_from_u64` for convenient seeding. (#537) - -## [0.2.1] - 2018-06-08 -- References to a `CryptoRng` now also implement `CryptoRng`. (#470) - -## [0.2.0] - 2018-05-21 -- Enable the `std` feature by default. (#409) -- Remove `BlockRng{64}::inner` and `BlockRng::inner_mut`; instead making `core` public -- Add `BlockRng{64}::index` and `BlockRng{64}::generate_and_set`. (#374, #419) -- Change `BlockRngCore::Results` bound to also require `AsMut<[Self::Item]>`. (#419) -- Implement `std::io::Read` for RngCore. (#434) - -## [0.1.0] - 2018-04-17 -(Split out of the Rand crate, changes here are relative to rand 0.4.2) -- `RngCore` and `SeedableRng` are now part of `rand_core`. (#288) -- Add modules to help implementing RNGs `impl` and `le`. (#209, #228) -- Add `Error` and `ErrorKind`. (#225) -- Add `CryptoRng` marker trait. (#273) -- Add `BlockRngCore` trait. (#281) -- Add `BlockRng` and `BlockRng64` wrappers to help implementations. (#281, #325) -- Revise the `SeedableRng` trait. (#233) -- Remove default implementations for `RngCore::next_u64` and `RngCore::fill_bytes`. (#288) -- Add `RngCore::try_fill_bytes`. (#225) - -## [0.0.1] - 2017-09-14 (yanked) -Experimental version as part of the rand crate refactor. diff --git a/vendor/rand_core-0.4.0/COPYRIGHT b/vendor/rand_core-0.4.0/COPYRIGHT deleted file mode 100644 index 468d907caf..0000000000 --- a/vendor/rand_core-0.4.0/COPYRIGHT +++ /dev/null @@ -1,12 +0,0 @@ -Copyrights in the Rand project are retained by their contributors. No -copyright assignment is required to contribute to the Rand project. - -For full authorship information, see the version control history. - -Except as otherwise noted (below and/or in individual files), Rand is -licensed under the Apache License, Version 2.0 <LICENSE-APACHE> or -<http://www.apache.org/licenses/LICENSE-2.0> or the MIT license -<LICENSE-MIT> or <http://opensource.org/licenses/MIT>, at your option. - -The Rand project includes code from the Rust project -published under these same licenses. diff --git a/vendor/rand_core-0.4.0/Cargo.toml b/vendor/rand_core-0.4.0/Cargo.toml deleted file mode 100644 index aee2ec0b62..0000000000 --- a/vendor/rand_core-0.4.0/Cargo.toml +++ /dev/null @@ -1,41 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies -# -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -name = "rand_core" -version = "0.4.0" -authors = ["The Rand Project Developers", "The Rust Project Developers"] -description = "Core random number generator traits and tools for implementation.\n" -homepage = "https://crates.io/crates/rand_core" -documentation = "https://rust-random.github.io/rand/rand_core" -readme = "README.md" -keywords = ["random", "rng"] -categories = ["algorithms", "no-std"] -license = "MIT/Apache-2.0" -repository = "https://github.com/rust-random/rand" -[dependencies.serde] -version = "1" -optional = true - -[dependencies.serde_derive] -version = "^1.0.38" -optional = true - -[features] -alloc = [] -serde1 = ["serde", "serde_derive"] -std = ["alloc"] -[badges.appveyor] -repository = "rust-random/rand" - -[badges.travis-ci] -repository = "rust-random/rand" diff --git a/vendor/rand_core-0.4.0/LICENSE-APACHE b/vendor/rand_core-0.4.0/LICENSE-APACHE deleted file mode 100644 index 17d74680f8..0000000000 --- a/vendor/rand_core-0.4.0/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/rand_core-0.4.0/LICENSE-MIT b/vendor/rand_core-0.4.0/LICENSE-MIT deleted file mode 100644 index d93b5baf34..0000000000 --- a/vendor/rand_core-0.4.0/LICENSE-MIT +++ /dev/null @@ -1,26 +0,0 @@ -Copyright 2018 Developers of the Rand project -Copyright (c) 2014 The Rust Project Developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/vendor/rand_core-0.4.0/README.md b/vendor/rand_core-0.4.0/README.md deleted file mode 100644 index ef076b99d8..0000000000 --- a/vendor/rand_core-0.4.0/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# rand_core - -[![Build Status](https://travis-ci.org/rust-random/rand.svg)](https://travis-ci.org/rust-random/rand) -[![Build Status](https://ci.appveyor.com/api/projects/status/github/rust-random/rand?svg=true)](https://ci.appveyor.com/project/rust-random/rand) -[![Latest version](https://img.shields.io/crates/v/rand_core.svg)](https://crates.io/crates/rand_core) -[![Book](https://img.shields.io/badge/book-master-yellow.svg)](https://rust-random.github.io/book/) -[![API](https://img.shields.io/badge/api-master-yellow.svg)](https://rust-random.github.io/rand/rand_core) -[![API](https://docs.rs/rand_core/badge.svg)](https://docs.rs/rand_core) -[![Minimum rustc version](https://img.shields.io/badge/rustc-1.22+-lightgray.svg)](https://github.com/rust-random/rand#rust-version-requirements) - -Core traits and error types of the [rand] library, plus tools for implementing -RNGs. - -This crate is intended for use when implementing the core trait, `RngCore`; it -defines the core traits to be implemented as well as several small functions to -aid in their implementation and types required for error handling. - -The main [rand] crate re-exports most items defined in this crate, along with -tools to convert the integer samples generated by `RngCore` to many different -applications (including sampling from restricted ranges, conversion to floating -point, list permutations and secure initialisation of RNGs). Most users should -prefer to use the main [rand] crate. - -Links: - -- [API documentation (master)](https://rust-random.github.io/rand/rand_core) -- [API documentation (docs.rs)](https://docs.rs/rand_core) -- [Changelog](CHANGELOG.md) - -[rand]: https://crates.io/crates/rand - - -## Functionality - -The `rand_core` crate provides: - -- base random number generator traits -- error-reporting types -- functionality to aid implementation of RNGs - -The traits and error types are also available via `rand`. - -## Crate Features - -`rand_core` supports `no_std` and `alloc`-only configurations, as well as full -`std` functionality. The differences between `no_std` and full `std` are small, -comprising `RngCore` support for `Box<R>` types where `R: RngCore`, -`std::io::Read` support for types supporting `RngCore`, and -extensions to the `Error` type's functionality. - -The `std` feature is *not enabled by default*. This is primarily to avoid build -problems where one crate implicitly requires `rand_core` with `std` support and -another crate requires `rand` *without* `std` support. However, the `rand` crate -continues to enable `std` support by default, both for itself and `rand_core`. - -The `serde1` feature can be used to derive `Serialize` and `Deserialize` for RNG -implementations that use the `BlockRng` or `BlockRng64` wrappers. - - -# License - -`rand_core` is distributed under the terms of both the MIT license and the -Apache License (Version 2.0). - -See [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT), and -[COPYRIGHT](COPYRIGHT) for details. diff --git a/vendor/rand_core-0.4.0/src/block.rs b/vendor/rand_core-0.4.0/src/block.rs deleted file mode 100644 index 3045b9482f..0000000000 --- a/vendor/rand_core-0.4.0/src/block.rs +++ /dev/null @@ -1,499 +0,0 @@ -// Copyright 2018 Developers of the Rand project. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! The `BlockRngCore` trait and implementation helpers -//! -//! The [`BlockRngCore`] trait exists to assist in the implementation of RNGs -//! which generate a block of data in a cache instead of returning generated -//! values directly. -//! -//! Usage of this trait is optional, but provides two advantages: -//! implementations only need to concern themselves with generation of the -//! block, not the various [`RngCore`] methods (especially [`fill_bytes`], where -//! the optimal implementations are not trivial), and this allows -//! `ReseedingRng` (see [`rand`](https://docs.rs/rand) crate) perform periodic -//! reseeding with very low overhead. -//! -//! # Example -//! -//! ```norun -//! use rand_core::block::{BlockRngCore, BlockRng}; -//! -//! struct MyRngCore; -//! -//! impl BlockRngCore for MyRngCore { -//! type Results = [u32; 16]; -//! -//! fn generate(&mut self, results: &mut Self::Results) { -//! unimplemented!() -//! } -//! } -//! -//! impl SeedableRng for MyRngCore { -//! type Seed = unimplemented!(); -//! fn from_seed(seed: Self::Seed) -> Self { -//! unimplemented!() -//! } -//! } -//! -//! // optionally, also implement CryptoRng for MyRngCore -//! -//! // Final RNG. -//! type MyRng = BlockRng<u32, MyRngCore>; -//! ``` -//! -//! [`BlockRngCore`]: crate::block::BlockRngCore -//! [`fill_bytes`]: RngCore::fill_bytes - -use core::convert::AsRef; -use core::fmt; -use {RngCore, CryptoRng, SeedableRng, Error}; -use impls::{fill_via_u32_chunks, fill_via_u64_chunks}; - -/// A trait for RNGs which do not generate random numbers individually, but in -/// blocks (typically `[u32; N]`). This technique is commonly used by -/// cryptographic RNGs to improve performance. -/// -/// See the [module][crate::block] documentation for details. -pub trait BlockRngCore { - /// Results element type, e.g. `u32`. - type Item; - - /// Results type. This is the 'block' an RNG implementing `BlockRngCore` - /// generates, which will usually be an array like `[u32; 16]`. - type Results: AsRef<[Self::Item]> + AsMut<[Self::Item]> + Default; - - /// Generate a new block of results. - fn generate(&mut self, results: &mut Self::Results); -} - - -/// A wrapper type implementing [`RngCore`] for some type implementing -/// [`BlockRngCore`] with `u32` array buffer; i.e. this can be used to implement -/// a full RNG from just a `generate` function. -/// -/// The `core` field may be accessed directly but the results buffer may not. -/// PRNG implementations can simply use a type alias -/// (`pub type MyRng = BlockRng<MyRngCore>;`) but might prefer to use a -/// wrapper type (`pub struct MyRng(BlockRng<MyRngCore>);`); the latter must -/// re-implement `RngCore` but hides the implementation details and allows -/// extra functionality to be defined on the RNG -/// (e.g. `impl MyRng { fn set_stream(...){...} }`). -/// -/// `BlockRng` has heavily optimized implementations of the [`RngCore`] methods -/// reading values from the results buffer, as well as -/// calling [`BlockRngCore::generate`] directly on the output array when -/// [`fill_bytes`] / [`try_fill_bytes`] is called on a large array. These methods -/// also handle the bookkeeping of when to generate a new batch of values. -/// -/// No whole generated `u32` values are thown away and all values are consumed -/// in-order. [`next_u32`] simply takes the next available `u32` value. -/// [`next_u64`] is implemented by combining two `u32` values, least -/// significant first. [`fill_bytes`] and [`try_fill_bytes`] consume a whole -/// number of `u32` values, converting each `u32` to a byte slice in -/// little-endian order. If the requested byte length is not a multiple of 4, -/// some bytes will be discarded. -/// -/// See also [`BlockRng64`] which uses `u64` array buffers. Currently there is -/// no direct support for other buffer types. -/// -/// For easy initialization `BlockRng` also implements [`SeedableRng`]. -/// -/// [`next_u32`]: RngCore::next_u32 -/// [`next_u64`]: RngCore::next_u64 -/// [`fill_bytes`]: RngCore::fill_bytes -/// [`try_fill_bytes`]: RngCore::try_fill_bytes -#[derive(Clone)] -#[cfg_attr(feature="serde1", derive(Serialize, Deserialize))] -pub struct BlockRng<R: BlockRngCore + ?Sized> { - results: R::Results, - index: usize, - /// The *core* part of the RNG, implementing the `generate` function. - pub core: R, -} - -// Custom Debug implementation that does not expose the contents of `results`. -impl<R: BlockRngCore + fmt::Debug> fmt::Debug for BlockRng<R> { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt.debug_struct("BlockRng") - .field("core", &self.core) - .field("result_len", &self.results.as_ref().len()) - .field("index", &self.index) - .finish() - } -} - -impl<R: BlockRngCore> BlockRng<R> { - /// Create a new `BlockRng` from an existing RNG implementing - /// `BlockRngCore`. Results will be generated on first use. - pub fn new(core: R) -> BlockRng<R>{ - let results_empty = R::Results::default(); - BlockRng { - core, - index: results_empty.as_ref().len(), - results: results_empty, - } - } - - /// Get the index into the result buffer. - /// - /// If this is equal to or larger than the size of the result buffer then - /// the buffer is "empty" and `generate()` must be called to produce new - /// results. - pub fn index(&self) -> usize { - self.index - } - - /// Reset the number of available results. - /// This will force a new set of results to be generated on next use. - pub fn reset(&mut self) { - self.index = self.results.as_ref().len(); - } - - /// Generate a new set of results immediately, setting the index to the - /// given value. - pub fn generate_and_set(&mut self, index: usize) { - assert!(index < self.results.as_ref().len()); - self.core.generate(&mut self.results); - self.index = index; - } -} - -impl<R: BlockRngCore<Item=u32>> RngCore for BlockRng<R> -where <R as BlockRngCore>::Results: AsRef<[u32]> + AsMut<[u32]> -{ - #[inline(always)] - fn next_u32(&mut self) -> u32 { - if self.index >= self.results.as_ref().len() { - self.generate_and_set(0); - } - - let value = self.results.as_ref()[self.index]; - self.index += 1; - value - } - - #[inline(always)] - fn next_u64(&mut self) -> u64 { - let read_u64 = |results: &[u32], index| { - if cfg!(any(target_arch = "x86", target_arch = "x86_64")) { - // requires little-endian CPU supporting unaligned reads: - unsafe { *(&results[index] as *const u32 as *const u64) } - } else { - let x = u64::from(results[index]); - let y = u64::from(results[index + 1]); - (y << 32) | x - } - }; - - let len = self.results.as_ref().len(); - - let index = self.index; - if index < len-1 { - self.index += 2; - // Read an u64 from the current index - read_u64(self.results.as_ref(), index) - } else if index >= len { - self.generate_and_set(2); - read_u64(self.results.as_ref(), 0) - } else { - let x = u64::from(self.results.as_ref()[len-1]); - self.generate_and_set(1); - let y = u64::from(self.results.as_ref()[0]); - (y << 32) | x - } - } - - // As an optimization we try to write directly into the output buffer. - // This is only enabled for little-endian platforms where unaligned writes - // are known to be safe and fast. - #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] - fn fill_bytes(&mut self, dest: &mut [u8]) { - let mut filled = 0; - - // Continue filling from the current set of results - if self.index < self.results.as_ref().len() { - let (consumed_u32, filled_u8) = - fill_via_u32_chunks(&self.results.as_ref()[self.index..], - dest); - - self.index += consumed_u32; - filled += filled_u8; - } - - let len_remainder = - (dest.len() - filled) % (self.results.as_ref().len() * 4); - let end_direct = dest.len() - len_remainder; - - while filled < end_direct { - let dest_u32: &mut R::Results = unsafe { - &mut *(dest[filled..].as_mut_ptr() as - *mut <R as BlockRngCore>::Results) - }; - self.core.generate(dest_u32); - filled += self.results.as_ref().len() * 4; - self.index = self.results.as_ref().len(); - } - - if len_remainder > 0 { - self.core.generate(&mut self.results); - let (consumed_u32, _) = - fill_via_u32_chunks(self.results.as_ref(), - &mut dest[filled..]); - - self.index = consumed_u32; - } - } - - #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] - fn fill_bytes(&mut self, dest: &mut [u8]) { - let mut read_len = 0; - while read_len < dest.len() { - if self.index >= self.results.as_ref().len() { - self.generate_and_set(0); - } - let (consumed_u32, filled_u8) = - fill_via_u32_chunks(&self.results.as_ref()[self.index..], - &mut dest[read_len..]); - - self.index += consumed_u32; - read_len += filled_u8; - } - } - - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { - self.fill_bytes(dest); - Ok(()) - } -} - -impl<R: BlockRngCore + SeedableRng> SeedableRng for BlockRng<R> { - type Seed = R::Seed; - - fn from_seed(seed: Self::Seed) -> Self { - Self::new(R::from_seed(seed)) - } - - fn seed_from_u64(seed: u64) -> Self { - Self::new(R::seed_from_u64(seed)) - } - - fn from_rng<S: RngCore>(rng: S) -> Result<Self, Error> { - Ok(Self::new(R::from_rng(rng)?)) - } -} - - - -/// A wrapper type implementing [`RngCore`] for some type implementing -/// [`BlockRngCore`] with `u64` array buffer; i.e. this can be used to implement -/// a full RNG from just a `generate` function. -/// -/// This is similar to [`BlockRng`], but specialized for algorithms that operate -/// on `u64` values. -/// -/// No whole generated `u64` values are thrown away and all values are consumed -/// in-order. [`next_u64`] simply takes the next available `u64` value. -/// [`next_u32`] is however a bit special: half of a `u64` is consumed, leaving -/// the other half in the buffer. If the next function called is [`next_u32`] -/// then the other half is then consumed, however both [`next_u64`] and -/// [`fill_bytes`] discard the rest of any half-consumed `u64`s when called. -/// -/// [`fill_bytes`] and [`try_fill_bytes`] consume a whole number of `u64` -/// values. If the requested length is not a multiple of 8, some bytes will be -/// discarded. -/// -/// [`next_u32`]: RngCore::next_u32 -/// [`next_u64`]: RngCore::next_u64 -/// [`fill_bytes`]: RngCore::fill_bytes -/// [`try_fill_bytes`]: RngCore::try_fill_bytes -#[derive(Clone)] -#[cfg_attr(feature="serde1", derive(Serialize, Deserialize))] -pub struct BlockRng64<R: BlockRngCore + ?Sized> { - results: R::Results, - index: usize, - half_used: bool, // true if only half of the previous result is used - /// The *core* part of the RNG, implementing the `generate` function. - pub core: R, -} - -// Custom Debug implementation that does not expose the contents of `results`. -impl<R: BlockRngCore + fmt::Debug> fmt::Debug for BlockRng64<R> { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt.debug_struct("BlockRng64") - .field("core", &self.core) - .field("result_len", &self.results.as_ref().len()) - .field("index", &self.index) - .field("half_used", &self.half_used) - .finish() - } -} - -impl<R: BlockRngCore> BlockRng64<R> { - /// Create a new `BlockRng` from an existing RNG implementing - /// `BlockRngCore`. Results will be generated on first use. - pub fn new(core: R) -> BlockRng64<R>{ - let results_empty = R::Results::default(); - BlockRng64 { - core, - index: results_empty.as_ref().len(), - half_used: false, - results: results_empty, - } - } - - /// Get the index into the result buffer. - /// - /// If this is equal to or larger than the size of the result buffer then - /// the buffer is "empty" and `generate()` must be called to produce new - /// results. - pub fn index(&self) -> usize { - self.index - } - - /// Reset the number of available results. - /// This will force a new set of results to be generated on next use. - pub fn reset(&mut self) { - self.index = self.results.as_ref().len(); - self.half_used = false; - } - - /// Generate a new set of results immediately, setting the index to the - /// given value. - pub fn generate_and_set(&mut self, index: usize) { - assert!(index < self.results.as_ref().len()); - self.core.generate(&mut self.results); - self.index = index; - self.half_used = false; - } -} - -impl<R: BlockRngCore<Item=u64>> RngCore for BlockRng64<R> -where <R as BlockRngCore>::Results: AsRef<[u64]> + AsMut<[u64]> -{ - #[inline(always)] - fn next_u32(&mut self) -> u32 { - let mut index = self.index * 2 - self.half_used as usize; - if index >= self.results.as_ref().len() * 2 { - self.core.generate(&mut self.results); - self.index = 0; - // `self.half_used` is by definition `false` - self.half_used = false; - index = 0; - } - - self.half_used = !self.half_used; - self.index += self.half_used as usize; - - // Index as if this is a u32 slice. - unsafe { - let results = - &*(self.results.as_ref() as *const [u64] as *const [u32]); - if cfg!(target_endian = "little") { - *results.get_unchecked(index) - } else { - *results.get_unchecked(index ^ 1) - } - } - } - - #[inline(always)] - fn next_u64(&mut self) -> u64 { - if self.index >= self.results.as_ref().len() { - self.core.generate(&mut self.results); - self.index = 0; - } - - let value = self.results.as_ref()[self.index]; - self.index += 1; - self.half_used = false; - value - } - - // As an optimization we try to write directly into the output buffer. - // This is only enabled for little-endian platforms where unaligned writes - // are known to be safe and fast. - #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] - fn fill_bytes(&mut self, dest: &mut [u8]) { - let mut filled = 0; - self.half_used = false; - - // Continue filling from the current set of results - if self.index < self.results.as_ref().len() { - let (consumed_u64, filled_u8) = - fill_via_u64_chunks(&self.results.as_ref()[self.index..], - dest); - - self.index += consumed_u64; - filled += filled_u8; - } - - let len_remainder = - (dest.len() - filled) % (self.results.as_ref().len() * 8); - let end_direct = dest.len() - len_remainder; - - while filled < end_direct { - let dest_u64: &mut R::Results = unsafe { - ::core::mem::transmute(dest[filled..].as_mut_ptr()) - }; - self.core.generate(dest_u64); - filled += self.results.as_ref().len() * 8; - self.index = self.results.as_ref().len(); - } - - if len_remainder > 0 { - self.core.generate(&mut self.results); - let (consumed_u64, _) = - fill_via_u64_chunks(&mut self.results.as_ref(), - &mut dest[filled..]); - - self.index = consumed_u64; - } - } - - #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] - fn fill_bytes(&mut self, dest: &mut [u8]) { - let mut read_len = 0; - self.half_used = false; - while read_len < dest.len() { - if self.index as usize >= self.results.as_ref().len() { - self.core.generate(&mut self.results); - self.index = 0; - } - - let (consumed_u64, filled_u8) = - fill_via_u64_chunks(&self.results.as_ref()[self.index as usize..], - &mut dest[read_len..]); - - self.index += consumed_u64; - read_len += filled_u8; - } - } - - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { - Ok(self.fill_bytes(dest)) - } -} - -impl<R: BlockRngCore + SeedableRng> SeedableRng for BlockRng64<R> { - type Seed = R::Seed; - - fn from_seed(seed: Self::Seed) -> Self { - Self::new(R::from_seed(seed)) - } - - fn seed_from_u64(seed: u64) -> Self { - Self::new(R::seed_from_u64(seed)) - } - - fn from_rng<S: RngCore>(rng: S) -> Result<Self, Error> { - Ok(Self::new(R::from_rng(rng)?)) - } -} - -impl<R: BlockRngCore + CryptoRng> CryptoRng for BlockRng<R> {} diff --git a/vendor/rand_core-0.4.0/src/error.rs b/vendor/rand_core-0.4.0/src/error.rs deleted file mode 100644 index 5a8459ea8b..0000000000 --- a/vendor/rand_core-0.4.0/src/error.rs +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2018 Developers of the Rand project. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Error types - -use core::fmt; - -#[cfg(feature="std")] -use std::error::Error as stdError; -#[cfg(feature="std")] -use std::io; - -/// Error kind which can be matched over. -#[derive(PartialEq, Eq, Debug, Copy, Clone)] -pub enum ErrorKind { - /// Feature is not available; not recoverable. - /// - /// This is the most permanent failure type and implies the error cannot be - /// resolved simply by retrying (e.g. the feature may not exist in this - /// build of the application or on the current platform). - Unavailable, - /// General failure; there may be a chance of recovery on retry. - /// - /// This is the catch-all kind for errors from known and unknown sources - /// which do not have a more specific kind / handling method. - /// - /// It is suggested to retry a couple of times or retry later when - /// handling; some error sources may be able to resolve themselves, - /// although this is not likely. - Unexpected, - /// A transient failure which likely can be resolved or worked around. - /// - /// This error kind exists for a few specific cases where it is known that - /// the error likely can be resolved internally, but is reported anyway. - Transient, - /// Not ready yet: recommended to try again a little later. - /// - /// This error kind implies the generator needs more time or needs some - /// other part of the application to do something else first before it is - /// ready for use; for example this may be used by external generators - /// which require time for initialization. - NotReady, - #[doc(hidden)] - __Nonexhaustive, -} - -impl ErrorKind { - /// True if this kind of error may resolve itself on retry. - /// - /// See also `should_wait()`. - pub fn should_retry(self) -> bool { - self != ErrorKind::Unavailable - } - - /// True if we should retry but wait before retrying - /// - /// This implies `should_retry()` is true. - pub fn should_wait(self) -> bool { - self == ErrorKind::NotReady - } - - /// A description of this error kind - pub fn description(self) -> &'static str { - match self { - ErrorKind::Unavailable => "permanently unavailable", - ErrorKind::Unexpected => "unexpected failure", - ErrorKind::Transient => "transient failure", - ErrorKind::NotReady => "not ready yet", - ErrorKind::__Nonexhaustive => unreachable!(), - } - } -} - - -/// Error type of random number generators -/// -/// This is a relatively simple error type, designed for compatibility with and -/// without the Rust `std` library. It embeds a "kind" code, a message (static -/// string only), and an optional chained cause (`std` only). The `kind` and -/// `msg` fields can be accessed directly; cause can be accessed via -/// `std::error::Error::cause` or `Error::take_cause`. Construction can only be -/// done via `Error::new` or `Error::with_cause`. -#[derive(Debug)] -pub struct Error { - /// The error kind - pub kind: ErrorKind, - /// The error message - pub msg: &'static str, - #[cfg(feature="std")] - cause: Option<Box<stdError + Send + Sync>>, -} - -impl Error { - /// Create a new instance, with specified kind and a message. - pub fn new(kind: ErrorKind, msg: &'static str) -> Self { - #[cfg(feature="std")] { - Error { kind, msg, cause: None } - } - #[cfg(not(feature="std"))] { - Error { kind, msg } - } - } - - /// Create a new instance, with specified kind, message, and a - /// chained cause. - /// - /// Note: `stdError` is an alias for `std::error::Error`. - /// - /// If not targetting `std` (i.e. `no_std`), this function is replaced by - /// another with the same prototype, except that there are no bounds on the - /// type `E` (because both `Box` and `stdError` are unavailable), and the - /// `cause` is ignored. - #[cfg(feature="std")] - pub fn with_cause<E>(kind: ErrorKind, msg: &'static str, cause: E) -> Self - where E: Into<Box<stdError + Send + Sync>> - { - Error { kind, msg, cause: Some(cause.into()) } - } - - /// Create a new instance, with specified kind, message, and a - /// chained cause. - /// - /// In `no_std` mode the *cause* is ignored. - #[cfg(not(feature="std"))] - pub fn with_cause<E>(kind: ErrorKind, msg: &'static str, _cause: E) -> Self { - Error { kind, msg } - } - - /// Take the cause, if any. This allows the embedded cause to be extracted. - /// This uses `Option::take`, leaving `self` with no cause. - #[cfg(feature="std")] - pub fn take_cause(&mut self) -> Option<Box<stdError + Send + Sync>> { - self.cause.take() - } -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - #[cfg(feature="std")] { - if let Some(ref cause) = self.cause { - return write!(f, "{} ({}); cause: {}", - self.msg, self.kind.description(), cause); - } - } - write!(f, "{} ({})", self.msg, self.kind.description()) - } -} - -#[cfg(feature="std")] -impl stdError for Error { - fn description(&self) -> &str { - self.msg - } - - fn cause(&self) -> Option<&stdError> { - self.cause.as_ref().map(|e| e.as_ref() as &stdError) - } -} - -#[cfg(feature="std")] -impl From<Error> for io::Error { - fn from(error: Error) -> Self { - use std::io::ErrorKind::*; - match error.kind { - ErrorKind::Unavailable => io::Error::new(NotFound, error), - ErrorKind::Unexpected | - ErrorKind::Transient => io::Error::new(Other, error), - ErrorKind::NotReady => io::Error::new(WouldBlock, error), - ErrorKind::__Nonexhaustive => unreachable!(), - } - } -} diff --git a/vendor/rand_core-0.4.0/src/impls.rs b/vendor/rand_core-0.4.0/src/impls.rs deleted file mode 100644 index 57bdd070d0..0000000000 --- a/vendor/rand_core-0.4.0/src/impls.rs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2018 Developers of the Rand project. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Helper functions for implementing `RngCore` functions. -//! -//! For cross-platform reproducibility, these functions all use Little Endian: -//! least-significant part first. For example, `next_u64_via_u32` takes `u32` -//! values `x, y`, then outputs `(y << 32) | x`. To implement `next_u32` -//! from `next_u64` in little-endian order, one should use `next_u64() as u32`. -//! -//! Byte-swapping (like the std `to_le` functions) is only needed to convert -//! to/from byte sequences, and since its purpose is reproducibility, -//! non-reproducible sources (e.g. `OsRng`) need not bother with it. - -use core::intrinsics::transmute; -use core::ptr::copy_nonoverlapping; -use core::slice; -use core::cmp::min; -use core::mem::size_of; -use RngCore; - - -/// Implement `next_u64` via `next_u32`, little-endian order. -pub fn next_u64_via_u32<R: RngCore + ?Sized>(rng: &mut R) -> u64 { - // Use LE; we explicitly generate one value before the next. - let x = u64::from(rng.next_u32()); - let y = u64::from(rng.next_u32()); - (y << 32) | x -} - -/// Implement `fill_bytes` via `next_u64` and `next_u32`, little-endian order. -/// -/// The fastest way to fill a slice is usually to work as long as possible with -/// integers. That is why this method mostly uses `next_u64`, and only when -/// there are 4 or less bytes remaining at the end of the slice it uses -/// `next_u32` once. -pub fn fill_bytes_via_next<R: RngCore + ?Sized>(rng: &mut R, dest: &mut [u8]) { - let mut left = dest; - while left.len() >= 8 { - let (l, r) = {left}.split_at_mut(8); - left = r; - let chunk: [u8; 8] = unsafe { - transmute(rng.next_u64().to_le()) - }; - l.copy_from_slice(&chunk); - } - let n = left.len(); - if n > 4 { - let chunk: [u8; 8] = unsafe { - transmute(rng.next_u64().to_le()) - }; - left.copy_from_slice(&chunk[..n]); - } else if n > 0 { - let chunk: [u8; 4] = unsafe { - transmute(rng.next_u32().to_le()) - }; - left.copy_from_slice(&chunk[..n]); - } -} - -macro_rules! impl_uint_from_fill { - ($rng:expr, $ty:ty, $N:expr) => ({ - debug_assert!($N == size_of::<$ty>()); - - let mut int: $ty = 0; - unsafe { - let ptr = &mut int as *mut $ty as *mut u8; - let slice = slice::from_raw_parts_mut(ptr, $N); - $rng.fill_bytes(slice); - } - int - }); -} - -macro_rules! fill_via_chunks { - ($src:expr, $dst:expr, $ty:ty, $size:expr) => ({ - let chunk_size_u8 = min($src.len() * $size, $dst.len()); - let chunk_size = (chunk_size_u8 + $size - 1) / $size; - if cfg!(target_endian="little") { - unsafe { - copy_nonoverlapping( - $src.as_ptr() as *const u8, - $dst.as_mut_ptr(), - chunk_size_u8); - } - } else { - for (&n, chunk) in $src.iter().zip($dst.chunks_mut($size)) { - let tmp = n.to_le(); - let src_ptr = &tmp as *const $ty as *const u8; - unsafe { - copy_nonoverlapping(src_ptr, - chunk.as_mut_ptr(), - chunk.len()); - } - } - } - - (chunk_size, chunk_size_u8) - }); -} - -/// Implement `fill_bytes` by reading chunks from the output buffer of a block -/// based RNG. -/// -/// The return values are `(consumed_u32, filled_u8)`. -/// -/// `filled_u8` is the number of filled bytes in `dest`, which may be less than -/// the length of `dest`. -/// `consumed_u32` is the number of words consumed from `src`, which is the same -/// as `filled_u8 / 4` rounded up. -/// -/// # Example -/// (from `IsaacRng`) -/// -/// ```ignore -/// fn fill_bytes(&mut self, dest: &mut [u8]) { -/// let mut read_len = 0; -/// while read_len < dest.len() { -/// if self.index >= self.rsl.len() { -/// self.isaac(); -/// } -/// -/// let (consumed_u32, filled_u8) = -/// impls::fill_via_u32_chunks(&mut self.rsl[self.index..], -/// &mut dest[read_len..]); -/// -/// self.index += consumed_u32; -/// read_len += filled_u8; -/// } -/// } -/// ``` -pub fn fill_via_u32_chunks(src: &[u32], dest: &mut [u8]) -> (usize, usize) { - fill_via_chunks!(src, dest, u32, 4) -} - -/// Implement `fill_bytes` by reading chunks from the output buffer of a block -/// based RNG. -/// -/// The return values are `(consumed_u64, filled_u8)`. -/// `filled_u8` is the number of filled bytes in `dest`, which may be less than -/// the length of `dest`. -/// `consumed_u64` is the number of words consumed from `src`, which is the same -/// as `filled_u8 / 8` rounded up. -/// -/// See `fill_via_u32_chunks` for an example. -pub fn fill_via_u64_chunks(src: &[u64], dest: &mut [u8]) -> (usize, usize) { - fill_via_chunks!(src, dest, u64, 8) -} - -/// Implement `next_u32` via `fill_bytes`, little-endian order. -pub fn next_u32_via_fill<R: RngCore + ?Sized>(rng: &mut R) -> u32 { - impl_uint_from_fill!(rng, u32, 4) -} - -/// Implement `next_u64` via `fill_bytes`, little-endian order. -pub fn next_u64_via_fill<R: RngCore + ?Sized>(rng: &mut R) -> u64 { - impl_uint_from_fill!(rng, u64, 8) -} - -// TODO: implement tests for the above diff --git a/vendor/rand_core-0.4.0/src/le.rs b/vendor/rand_core-0.4.0/src/le.rs deleted file mode 100644 index 266651f10d..0000000000 --- a/vendor/rand_core-0.4.0/src/le.rs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2018 Developers of the Rand project. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Little-Endian utilities -//! -//! Little-Endian order has been chosen for internal usage; this makes some -//! useful functions available. - -use core::ptr; - -macro_rules! read_slice { - ($src:expr, $dst:expr, $size:expr, $which:ident) => {{ - assert_eq!($src.len(), $size * $dst.len()); - - unsafe { - ptr::copy_nonoverlapping( - $src.as_ptr(), - $dst.as_mut_ptr() as *mut u8, - $src.len()); - } - for v in $dst.iter_mut() { - *v = v.$which(); - } - }}; -} - -/// Reads unsigned 32 bit integers from `src` into `dst`. -/// Borrowed from the `byteorder` crate. -#[inline] -pub fn read_u32_into(src: &[u8], dst: &mut [u32]) { - read_slice!(src, dst, 4, to_le); -} - -/// Reads unsigned 64 bit integers from `src` into `dst`. -/// Borrowed from the `byteorder` crate. -#[inline] -pub fn read_u64_into(src: &[u8], dst: &mut [u64]) { - read_slice!(src, dst, 8, to_le); -} - -#[test] -fn test_read() { - let bytes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; - - let mut buf = [0u32; 4]; - read_u32_into(&bytes, &mut buf); - assert_eq!(buf[0], 0x04030201); - assert_eq!(buf[3], 0x100F0E0D); - - let mut buf = [0u32; 3]; - read_u32_into(&bytes[1..13], &mut buf); // unaligned - assert_eq!(buf[0], 0x05040302); - assert_eq!(buf[2], 0x0D0C0B0A); - - let mut buf = [0u64; 2]; - read_u64_into(&bytes, &mut buf); - assert_eq!(buf[0], 0x0807060504030201); - assert_eq!(buf[1], 0x100F0E0D0C0B0A09); - - let mut buf = [0u64; 1]; - read_u64_into(&bytes[7..15], &mut buf); // unaligned - assert_eq!(buf[0], 0x0F0E0D0C0B0A0908); -} diff --git a/vendor/rand_core-0.4.0/src/lib.rs b/vendor/rand_core-0.4.0/src/lib.rs deleted file mode 100644 index 4b0e6e48b0..0000000000 --- a/vendor/rand_core-0.4.0/src/lib.rs +++ /dev/null @@ -1,477 +0,0 @@ -// Copyright 2018 Developers of the Rand project. -// Copyright 2017-2018 The Rust Project Developers. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Random number generation traits -//! -//! This crate is mainly of interest to crates publishing implementations of -//! [`RngCore`]. Other users are encouraged to use the [`rand`] crate instead -//! which re-exports the main traits and error types. -//! -//! [`RngCore`] is the core trait implemented by algorithmic pseudo-random number -//! generators and external random-number sources. -//! -//! [`SeedableRng`] is an extension trait for construction from fixed seeds and -//! other random number generators. -//! -//! [`Error`] is provided for error-handling. It is safe to use in `no_std` -//! environments. -//! -//! The [`impls`] and [`le`] sub-modules include a few small functions to assist -//! implementation of [`RngCore`]. -//! -//! [`rand`]: https://docs.rs/rand - -#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk.png", - html_favicon_url = "https://www.rust-lang.org/favicon.ico", - html_root_url = "https://rust-random.github.io/rand/")] - -#![deny(missing_docs)] -#![deny(missing_debug_implementations)] -#![doc(test(attr(allow(unused_variables), deny(warnings))))] - -#![cfg_attr(not(feature="std"), no_std)] -#![cfg_attr(all(feature="alloc", not(feature="std")), feature(alloc))] - -#[cfg(feature="std")] extern crate core; -#[cfg(all(feature = "alloc", not(feature="std")))] extern crate alloc; -#[cfg(feature="serde1")] extern crate serde; -#[cfg(feature="serde1")] #[macro_use] extern crate serde_derive; - - -use core::default::Default; -use core::convert::AsMut; -use core::ptr::copy_nonoverlapping; - -#[cfg(all(feature="alloc", not(feature="std")))] use alloc::boxed::Box; - -pub use error::{ErrorKind, Error}; - - -mod error; -pub mod block; -pub mod impls; -pub mod le; - - -/// The core of a random number generator. -/// -/// This trait encapsulates the low-level functionality common to all -/// generators, and is the "back end", to be implemented by generators. -/// End users should normally use the `Rng` trait from the [`rand`] crate, -/// which is automatically implemented for every type implementing `RngCore`. -/// -/// Three different methods for generating random data are provided since the -/// optimal implementation of each is dependent on the type of generator. There -/// is no required relationship between the output of each; e.g. many -/// implementations of [`fill_bytes`] consume a whole number of `u32` or `u64` -/// values and drop any remaining unused bytes. -/// -/// The [`try_fill_bytes`] method is a variant of [`fill_bytes`] allowing error -/// handling; it is not deemed sufficiently useful to add equivalents for -/// [`next_u32`] or [`next_u64`] since the latter methods are almost always used -/// with algorithmic generators (PRNGs), which are normally infallible. -/// -/// Algorithmic generators implementing [`SeedableRng`] should normally have -/// *portable, reproducible* output, i.e. fix Endianness when converting values -/// to avoid platform differences, and avoid making any changes which affect -/// output (except by communicating that the release has breaking changes). -/// -/// Typically implementators will implement only one of the methods available -/// in this trait directly, then use the helper functions from the -/// [`impls`] module to implement the other methods. -/// -/// It is recommended that implementations also implement: -/// -/// - `Debug` with a custom implementation which *does not* print any internal -/// state (at least, [`CryptoRng`]s should not risk leaking state through -/// `Debug`). -/// - `Serialize` and `Deserialize` (from Serde), preferably making Serde -/// support optional at the crate level in PRNG libs. -/// - `Clone`, if possible. -/// - *never* implement `Copy` (accidental copies may cause repeated values). -/// - *do not* implement `Default` for pseudorandom generators, but instead -/// implement [`SeedableRng`], to guide users towards proper seeding. -/// External / hardware RNGs can choose to implement `Default`. -/// - `Eq` and `PartialEq` could be implemented, but are probably not useful. -/// -/// # Example -/// -/// A simple example, obviously not generating very *random* output: -/// -/// ``` -/// #![allow(dead_code)] -/// use rand_core::{RngCore, Error, impls}; -/// -/// struct CountingRng(u64); -/// -/// impl RngCore for CountingRng { -/// fn next_u32(&mut self) -> u32 { -/// self.next_u64() as u32 -/// } -/// -/// fn next_u64(&mut self) -> u64 { -/// self.0 += 1; -/// self.0 -/// } -/// -/// fn fill_bytes(&mut self, dest: &mut [u8]) { -/// impls::fill_bytes_via_next(self, dest) -/// } -/// -/// fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { -/// Ok(self.fill_bytes(dest)) -/// } -/// } -/// ``` -/// -/// [`rand`]: https://docs.rs/rand -/// [`try_fill_bytes`]: RngCore::try_fill_bytes -/// [`fill_bytes`]: RngCore::fill_bytes -/// [`next_u32`]: RngCore::next_u32 -/// [`next_u64`]: RngCore::next_u64 -pub trait RngCore { - /// Return the next random `u32`. - /// - /// RNGs must implement at least one method from this trait directly. In - /// the case this method is not implemented directly, it can be implemented - /// using `self.next_u64() as u32` or via - /// [`fill_bytes`][impls::next_u32_via_fill]. - fn next_u32(&mut self) -> u32; - - /// Return the next random `u64`. - /// - /// RNGs must implement at least one method from this trait directly. In - /// the case this method is not implemented directly, it can be implemented - /// via [`next_u32`][impls::next_u64_via_u32] or via - /// [`fill_bytes`][impls::next_u64_via_fill]. - fn next_u64(&mut self) -> u64; - - /// Fill `dest` with random data. - /// - /// RNGs must implement at least one method from this trait directly. In - /// the case this method is not implemented directly, it can be implemented - /// via [`next_u*`][impls::fill_bytes_via_next] or - /// via [`try_fill_bytes`][RngCore::try_fill_bytes]; if this generator can - /// fail the implementation must choose how best to handle errors here - /// (e.g. panic with a descriptive message or log a warning and retry a few - /// times). - /// - /// This method should guarantee that `dest` is entirely filled - /// with new data, and may panic if this is impossible - /// (e.g. reading past the end of a file that is being used as the - /// source of randomness). - fn fill_bytes(&mut self, dest: &mut [u8]); - - /// Fill `dest` entirely with random data. - /// - /// This is the only method which allows an RNG to report errors while - /// generating random data thus making this the primary method implemented - /// by external (true) RNGs (e.g. `OsRng`) which can fail. It may be used - /// directly to generate keys and to seed (infallible) PRNGs. - /// - /// Other than error handling, this method is identical to [`fill_bytes`]; - /// thus this may be implemented using `Ok(self.fill_bytes(dest))` or - /// `fill_bytes` may be implemented with - /// `self.try_fill_bytes(dest).unwrap()` or more specific error handling. - /// - /// [`fill_bytes`]: RngCore::fill_bytes - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error>; -} - -/// A marker trait used to indicate that an [`RngCore`] or [`BlockRngCore`] -/// implementation is supposed to be cryptographically secure. -/// -/// *Cryptographically secure generators*, also known as *CSPRNGs*, should -/// satisfy an additional properties over other generators: given the first -/// *k* bits of an algorithm's output -/// sequence, it should not be possible using polynomial-time algorithms to -/// predict the next bit with probability significantly greater than 50%. -/// -/// Some generators may satisfy an additional property, however this is not -/// required by this trait: if the CSPRNG's state is revealed, it should not be -/// computationally-feasible to reconstruct output prior to this. Some other -/// generators allow backwards-computation and are consided *reversible*. -/// -/// Note that this trait is provided for guidance only and cannot guarantee -/// suitability for cryptographic applications. In general it should only be -/// implemented for well-reviewed code implementing well-regarded algorithms. -/// -/// Note also that use of a `CryptoRng` does not protect against other -/// weaknesses such as seeding from a weak entropy source or leaking state. -/// -/// [`BlockRngCore`]: block::BlockRngCore -pub trait CryptoRng {} - -/// A random number generator that can be explicitly seeded. -/// -/// This trait encapsulates the low-level functionality common to all -/// pseudo-random number generators (PRNGs, or algorithmic generators). -/// -/// The `FromEntropy` trait from the [`rand`] crate is automatically -/// implemented for every type implementing `SeedableRng`, providing -/// a convenient `from_entropy()` constructor. -/// -/// [`rand`]: https://docs.rs/rand -pub trait SeedableRng: Sized { - /// Seed type, which is restricted to types mutably-dereferencable as `u8` - /// arrays (we recommend `[u8; N]` for some `N`). - /// - /// It is recommended to seed PRNGs with a seed of at least circa 100 bits, - /// which means an array of `[u8; 12]` or greater to avoid picking RNGs with - /// partially overlapping periods. - /// - /// For cryptographic RNG's a seed of 256 bits is recommended, `[u8; 32]`. - /// - /// - /// # Implementing `SeedableRng` for RNGs with large seeds - /// - /// Note that the required traits `core::default::Default` and - /// `core::convert::AsMut<u8>` are not implemented for large arrays - /// `[u8; N]` with `N` > 32. To be able to implement the traits required by - /// `SeedableRng` for RNGs with such large seeds, the newtype pattern can be - /// used: - /// - /// ``` - /// use rand_core::SeedableRng; - /// - /// const N: usize = 64; - /// pub struct MyRngSeed(pub [u8; N]); - /// pub struct MyRng(MyRngSeed); - /// - /// impl Default for MyRngSeed { - /// fn default() -> MyRngSeed { - /// MyRngSeed([0; N]) - /// } - /// } - /// - /// impl AsMut<[u8]> for MyRngSeed { - /// fn as_mut(&mut self) -> &mut [u8] { - /// &mut self.0 - /// } - /// } - /// - /// impl SeedableRng for MyRng { - /// type Seed = MyRngSeed; - /// - /// fn from_seed(seed: MyRngSeed) -> MyRng { - /// MyRng(seed) - /// } - /// } - /// ``` - type Seed: Sized + Default + AsMut<[u8]>; - - /// Create a new PRNG using the given seed. - /// - /// PRNG implementations are allowed to assume that bits in the seed are - /// well distributed. That means usually that the number of one and zero - /// bits are about equal, and values like 0, 1 and (size - 1) are unlikely. - /// - /// PRNG implementations are recommended to be reproducible. A PRNG seeded - /// using this function with a fixed seed should produce the same sequence - /// of output in the future and on different architectures (with for example - /// different endianness). - /// - /// It is however not required that this function yield the same state as a - /// reference implementation of the PRNG given equivalent seed; if necessary - /// another constructor replicating behaviour from a reference - /// implementation can be added. - /// - /// PRNG implementations should make sure `from_seed` never panics. In the - /// case that some special values (like an all zero seed) are not viable - /// seeds it is preferable to map these to alternative constant value(s), - /// for example `0xBAD5EEDu32` or `0x0DDB1A5E5BAD5EEDu64` ("odd biases? bad - /// seed"). This is assuming only a small number of values must be rejected. - fn from_seed(seed: Self::Seed) -> Self; - - /// Create a new PRNG using a `u64` seed. - /// - /// This is a convenience-wrapper around `from_seed` to allow construction - /// of any `SeedableRng` from a simple `u64` value. It is designed such that - /// low Hamming Weight numbers like 0 and 1 can be used and should still - /// result in good, independent seeds to the PRNG which is returned. - /// - /// This **is not suitable for cryptography**, as should be clear given that - /// the input size is only 64 bits. - /// - /// Implementations for PRNGs *may* provide their own implementations of - /// this function, but the default implementation should be good enough for - /// all purposes. *Changing* the implementation of this function should be - /// considered a value-breaking change. - fn seed_from_u64(mut state: u64) -> Self { - // We use PCG32 to generate a u32 sequence, and copy to the seed - const MUL: u64 = 6364136223846793005; - const INC: u64 = 11634580027462260723; - - let mut seed = Self::Seed::default(); - for chunk in seed.as_mut().chunks_mut(4) { - // We advance the state first (to get away from the input value, - // in case it has low Hamming Weight). - state = state.wrapping_mul(MUL).wrapping_add(INC); - - // Use PCG output function with to_le to generate x: - let xorshifted = (((state >> 18) ^ state) >> 27) as u32; - let rot = (state >> 59) as u32; - let x = xorshifted.rotate_right(rot).to_le(); - - unsafe { - let p = &x as *const u32 as *const u8; - copy_nonoverlapping(p, chunk.as_mut_ptr(), chunk.len()); - } - } - - Self::from_seed(seed) - } - - /// Create a new PRNG seeded from another `Rng`. - /// - /// This is the recommended way to initialize PRNGs with fresh entropy. The - /// `FromEntropy` trait from the [`rand`] crate provides a convenient - /// `from_entropy` method based on `from_rng`. - /// - /// Usage of this method is not recommended when reproducibility is required - /// since implementing PRNGs are not required to fix Endianness and are - /// allowed to modify implementations in new releases. - /// - /// It is important to use a good source of randomness to initialize the - /// PRNG. Cryptographic PRNG may be rendered insecure when seeded from a - /// non-cryptographic PRNG or with insufficient entropy. - /// Many non-cryptographic PRNGs will show statistical bias in their first - /// results if their seed numbers are small or if there is a simple pattern - /// between them. - /// - /// Prefer to seed from a strong external entropy source like `OsRng` from - /// the [`rand_os`] crate or from a cryptographic PRNG; if creating a new - /// generator for cryptographic uses you *must* seed from a strong source. - /// - /// Seeding a small PRNG from another small PRNG is possible, but - /// something to be careful with. An extreme example of how this can go - /// wrong is seeding an Xorshift RNG from another Xorshift RNG, which - /// will effectively clone the generator. In general seeding from a - /// generator which is hard to predict is probably okay. - /// - /// PRNG implementations are allowed to assume that a good RNG is provided - /// for seeding, and that it is cryptographically secure when appropriate. - /// - /// [`rand`]: https://docs.rs/rand - /// [`rand_os`]: https://docs.rs/rand_os - fn from_rng<R: RngCore>(mut rng: R) -> Result<Self, Error> { - let mut seed = Self::Seed::default(); - rng.try_fill_bytes(seed.as_mut())?; - Ok(Self::from_seed(seed)) - } -} - -// Implement `RngCore` for references to an `RngCore`. -// Force inlining all functions, so that it is up to the `RngCore` -// implementation and the optimizer to decide on inlining. -impl<'a, R: RngCore + ?Sized> RngCore for &'a mut R { - #[inline(always)] - fn next_u32(&mut self) -> u32 { - (**self).next_u32() - } - - #[inline(always)] - fn next_u64(&mut self) -> u64 { - (**self).next_u64() - } - - #[inline(always)] - fn fill_bytes(&mut self, dest: &mut [u8]) { - (**self).fill_bytes(dest) - } - - #[inline(always)] - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { - (**self).try_fill_bytes(dest) - } -} - -// Implement `RngCore` for boxed references to an `RngCore`. -// Force inlining all functions, so that it is up to the `RngCore` -// implementation and the optimizer to decide on inlining. -#[cfg(feature="alloc")] -impl<R: RngCore + ?Sized> RngCore for Box<R> { - #[inline(always)] - fn next_u32(&mut self) -> u32 { - (**self).next_u32() - } - - #[inline(always)] - fn next_u64(&mut self) -> u64 { - (**self).next_u64() - } - - #[inline(always)] - fn fill_bytes(&mut self, dest: &mut [u8]) { - (**self).fill_bytes(dest) - } - - #[inline(always)] - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> { - (**self).try_fill_bytes(dest) - } -} - -#[cfg(feature="std")] -impl std::io::Read for RngCore { - fn read(&mut self, buf: &mut [u8]) -> Result<usize, std::io::Error> { - self.try_fill_bytes(buf)?; - Ok(buf.len()) - } -} - -// Implement `CryptoRng` for references to an `CryptoRng`. -impl<'a, R: CryptoRng + ?Sized> CryptoRng for &'a mut R {} - -// Implement `CryptoRng` for boxed references to an `CryptoRng`. -#[cfg(feature="alloc")] -impl<R: CryptoRng + ?Sized> CryptoRng for Box<R> {} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_seed_from_u64() { - struct SeedableNum(u64); - impl SeedableRng for SeedableNum { - type Seed = [u8; 8]; - fn from_seed(seed: Self::Seed) -> Self { - let mut x = [0u64; 1]; - le::read_u64_into(&seed, &mut x); - SeedableNum(x[0]) - } - } - - const N: usize = 8; - const SEEDS: [u64; N] = [0u64, 1, 2, 3, 4, 8, 16, -1i64 as u64]; - let mut results = [0u64; N]; - for (i, seed) in SEEDS.iter().enumerate() { - let SeedableNum(x) = SeedableNum::seed_from_u64(*seed); - results[i] = x; - } - - for (i1, r1) in results.iter().enumerate() { - let weight = r1.count_ones(); - // This is the binomial distribution B(64, 0.5), so chance of - // weight < 20 is binocdf(19, 64, 0.5) = 7.8e-4, and same for - // weight > 44. - assert!(weight >= 20 && weight <= 44); - - for (i2, r2) in results.iter().enumerate() { - if i1 == i2 { continue; } - let diff_weight = (r1 ^ r2).count_ones(); - assert!(diff_weight >= 20); - } - } - - // value-breakage test: - assert_eq!(results[0], 5029875928683246316); - } -} diff --git a/vendor/redox_syscall/.cargo-checksum.json b/vendor/redox_syscall/.cargo-checksum.json index 259726a9b5..aa717290c0 100644 --- a/vendor/redox_syscall/.cargo-checksum.json +++ b/vendor/redox_syscall/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"c0c3a8d6373b421e518c7970b28735ef33ea67ee77dfe10d231348d4cbcdab3c","LICENSE":"efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829","README.md":"9161f18ba7f69b4ca51e844aee8ffb8237513a468c5c3b1f3a5f989044f895ac","src/arch/aarch64.rs":"3c36537214f8e10331d42ce4c7ac57a472db49fed029193c31982279d08bdad5","src/arch/arm.rs":"44ed9097879fce0ebe85d29e25ba378fb3ee7fcd649b569207495ed601c42a1c","src/arch/x86.rs":"e72a7f653c25b1ea5595af7ce991fe0e5c96547e127fc67e4967d60abbe1d3bd","src/arch/x86_64.rs":"499a0c997756c1cac5f4b4b98cff474a4e759695d3664712bd1a92d5d4a4a5f1","src/call.rs":"3b92187a127e2dd92df96949b0220844a0e4e1b5d889699f2771f7d5c2a52711","src/data.rs":"8602d05b437216e6774658902f2d5fb030edc7510754ce7277fd299ab53a6b8b","src/error.rs":"d832a641ccb1baf10315e2e1ce59b12c30d605a526fc65a31f63bb3a92c3a2f7","src/flag.rs":"3369635fa04a27b1460abdfe6907aeba693720de5e5681f18ee047b9ea3e7e9a","src/io/dma.rs":"4ab65016b3bc9121f0844dc4b8de77608eba327c0e0d930900254242b2c204b0","src/io/io.rs":"1bcb36d1867e9bab6a8186cd6928efe70ae2655e9f9d0dd3def20bc0fb6a82f6","src/io/mmio.rs":"b9fdb37d37a25a48106d60f1a977c541cb5162b20b12507c7dcd6eb3dff0a2c8","src/io/mod.rs":"4df12af3e82e6b5fe22112c9f51552112ee4811b7d1131d2a43d608d8d1cac09","src/io/pio.rs":"219fcd317d6c490a14794ec4db9de3e305c722dda720043c67076bda60632bb8","src/lib.rs":"dcefb8c5e272ab84162355b1ab08822d3d68a2eddb197eeeb6e56c15c9e7a757","src/number.rs":"ff5f4cb071d7965edf5473362b32ab04c9b1d953d8bed45c32bf7f5679470027","src/scheme/generate.sh":"b022adacb74f2af1470e691341c37acc1582f428e9b8b6b9dccb790dde594b40","src/scheme/mod.rs":"2679272397bf0247e1a4695853465243ca02960feb4ced1124969f67ebd3e3ce","src/scheme/scheme.rs":"5f789f0abae9a0b4d5d888198cab4c90221cdc4cec97d6c80b083aa83963267f","src/scheme/scheme_block.rs":"f5b49f70ef895ca89d566cc5d20ecde640971f6c088c363088146d5a7e6ee8a7","src/scheme/scheme_block_mut.rs":"3adf8797c2009ef66699035abc717c5b470957c0bcc17a43962b5f1d71490b9a","src/scheme/scheme_mut.rs":"e63dc3171f2f544b66d32daae2783bbb97525bfa4d703be8377fd34dcc95a7e5"},"package":"679da7508e9a6390aeaf7fbd02a800fdc64b73fe2204dd2c8ae66d22d9d5ad5d"} \ No newline at end of file +{"files":{"Cargo.toml":"6a30685e5679812735444beae8fbf0637c43cf65d8d7e74a9a44b7172899edd9","LICENSE":"efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829","README.md":"9161f18ba7f69b4ca51e844aee8ffb8237513a468c5c3b1f3a5f989044f895ac","src/arch/aarch64.rs":"3c36537214f8e10331d42ce4c7ac57a472db49fed029193c31982279d08bdad5","src/arch/arm.rs":"44ed9097879fce0ebe85d29e25ba378fb3ee7fcd649b569207495ed601c42a1c","src/arch/nonredox.rs":"de54557f642218b34d451fc52fe3cff97e3e4307304ae02a678a900cab96cdb0","src/arch/x86.rs":"e72a7f653c25b1ea5595af7ce991fe0e5c96547e127fc67e4967d60abbe1d3bd","src/arch/x86_64.rs":"4b809fde77985b335b2f53057d0f13debeb3edae2bc3b18bcc7eb0af4b6d8aef","src/call.rs":"b5b53aab18bb91bfef88d82f1708d05e210a30cde141fce0031dad543d988391","src/data.rs":"84f8beb9d40b753a8c1713b922e99ed9913d35e959694b2c849351b1a92d87c9","src/error.rs":"d832a641ccb1baf10315e2e1ce59b12c30d605a526fc65a31f63bb3a92c3a2f7","src/flag.rs":"1e944be3b134d3776725529e2190e2d1548dd67a631838281b8c5bc829523dbe","src/io/dma.rs":"740cd441f844718a14f77c2fe292d29b7c468d686505810d8b3281f9528a6fe7","src/io/io.rs":"1bcb36d1867e9bab6a8186cd6928efe70ae2655e9f9d0dd3def20bc0fb6a82f6","src/io/mmio.rs":"b9fdb37d37a25a48106d60f1a977c541cb5162b20b12507c7dcd6eb3dff0a2c8","src/io/mod.rs":"4df12af3e82e6b5fe22112c9f51552112ee4811b7d1131d2a43d608d8d1cac09","src/io/pio.rs":"219fcd317d6c490a14794ec4db9de3e305c722dda720043c67076bda60632bb8","src/lib.rs":"907de02434902d35346f7e3b03be652a62e9def472cd1845eeca3da7a0c6bbea","src/number.rs":"4718baa58a0f3e6b9b66d1f328cb2a145e9b1f807654c3079a13b226c4085a29","src/scheme/generate.sh":"b022adacb74f2af1470e691341c37acc1582f428e9b8b6b9dccb790dde594b40","src/scheme/mod.rs":"2679272397bf0247e1a4695853465243ca02960feb4ced1124969f67ebd3e3ce","src/scheme/scheme.rs":"879728e4d4e7d8f3057df5a3a6af1636079135652594ee50ca1b665e876be595","src/scheme/scheme_block.rs":"a8ea17b1101548e9b36f6c9000f68fd5438a796069252f948bde7dda44088a7f","src/scheme/scheme_block_mut.rs":"8b881f84a54e2477967d43eb68dac7c578ff6451dba59eba0d517037b2ac4def","src/scheme/scheme_mut.rs":"30f9b0750437b7f55d5bb24da546fd4afcb3c27b0af06d5f681b8f1c4877e7b4","src/tests.rs":"b9d60e419f7e57bb942756e8011e19704cfd46fb6ec96ffa925fb7deb35c5d43"},"package":"2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"} \ No newline at end of file diff --git a/vendor/redox_syscall/Cargo.toml b/vendor/redox_syscall/Cargo.toml index abe8bc45da..459b06a524 100644 --- a/vendor/redox_syscall/Cargo.toml +++ b/vendor/redox_syscall/Cargo.toml @@ -3,7 +3,7 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies +# to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're @@ -12,7 +12,7 @@ [package] name = "redox_syscall" -version = "0.1.43" +version = "0.1.56" authors = ["Jeremy Soller <jackpot51@gmail.com>"] description = "A Rust library to access raw Redox system calls" documentation = "https://docs.rs/redox_syscall" diff --git a/vendor/redox_syscall/src/arch/nonredox.rs b/vendor/redox_syscall/src/arch/nonredox.rs new file mode 100644 index 0000000000..c99d41ac2c --- /dev/null +++ b/vendor/redox_syscall/src/arch/nonredox.rs @@ -0,0 +1,31 @@ +use super::error::{Error, Result, ENOSYS}; + +pub unsafe fn syscall0(_a: usize) -> Result<usize> { + Err(Error::new(ENOSYS)) +} + +pub unsafe fn syscall1(_a: usize, _b: usize) -> Result<usize> { + Err(Error::new(ENOSYS)) +} + +// Clobbers all registers - special for clone +pub unsafe fn syscall1_clobber(_a: usize, _b: usize) -> Result<usize> { + Err(Error::new(ENOSYS)) +} + +pub unsafe fn syscall2(_a: usize, _b: usize, _c: usize) -> Result<usize> { + Err(Error::new(ENOSYS)) +} + +pub unsafe fn syscall3(_a: usize, _b: usize, _c: usize, _d: usize) -> Result<usize> { + Err(Error::new(ENOSYS)) +} + +pub unsafe fn syscall4(_a: usize, _b: usize, _c: usize, _d: usize, _e: usize) -> Result<usize> { + Err(Error::new(ENOSYS)) +} + +pub unsafe fn syscall5(_a: usize, _b: usize, _c: usize, _d: usize, _e: usize, _f: usize) + -> Result<usize> { + Err(Error::new(ENOSYS)) +} diff --git a/vendor/redox_syscall/src/arch/x86_64.rs b/vendor/redox_syscall/src/arch/x86_64.rs index 52ad01bd4a..76c3da130a 100644 --- a/vendor/redox_syscall/src/arch/x86_64.rs +++ b/vendor/redox_syscall/src/arch/x86_64.rs @@ -1,20 +1,20 @@ use super::error::{Error, Result}; pub unsafe fn syscall0(mut a: usize) -> Result<usize> { - asm!("int 0x80" + asm!("syscall" : "={rax}"(a) : "{rax}"(a) - : "memory" + : "rcx", "r11", "memory" : "intel", "volatile"); Error::demux(a) } pub unsafe fn syscall1(mut a: usize, b: usize) -> Result<usize> { - asm!("int 0x80" + asm!("syscall" : "={rax}"(a) - : "{rax}"(a), "{rbx}"(b) - : "memory" + : "{rax}"(a), "{rdi}"(b) + : "rcx", "r11", "memory" : "intel", "volatile"); Error::demux(a) @@ -22,9 +22,9 @@ pub unsafe fn syscall1(mut a: usize, b: usize) -> Result<usize> { // Clobbers all registers - special for clone pub unsafe fn syscall1_clobber(mut a: usize, b: usize) -> Result<usize> { - asm!("int 0x80" + asm!("syscall" : "={rax}"(a) - : "{rax}"(a), "{rbx}"(b) + : "{rax}"(a), "{rdi}"(b) : "memory", "rbx", "rcx", "rdx", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" : "intel", "volatile"); @@ -33,30 +33,30 @@ pub unsafe fn syscall1_clobber(mut a: usize, b: usize) -> Result<usize> { } pub unsafe fn syscall2(mut a: usize, b: usize, c: usize) -> Result<usize> { - asm!("int 0x80" + asm!("syscall" : "={rax}"(a) - : "{rax}"(a), "{rbx}"(b), "{rcx}"(c) - : "memory" + : "{rax}"(a), "{rdi}"(b), "{rsi}"(c) + : "rcx", "r11", "memory" : "intel", "volatile"); Error::demux(a) } pub unsafe fn syscall3(mut a: usize, b: usize, c: usize, d: usize) -> Result<usize> { - asm!("int 0x80" + asm!("syscall" : "={rax}"(a) - : "{rax}"(a), "{rbx}"(b), "{rcx}"(c), "{rdx}"(d) - : "memory" + : "{rax}"(a), "{rdi}"(b), "{rsi}"(c), "{rdx}"(d) + : "rcx", "r11", "memory" : "intel", "volatile"); Error::demux(a) } pub unsafe fn syscall4(mut a: usize, b: usize, c: usize, d: usize, e: usize) -> Result<usize> { - asm!("int 0x80" + asm!("syscall" : "={rax}"(a) - : "{rax}"(a), "{rbx}"(b), "{rcx}"(c), "{rdx}"(d), "{rsi}"(e) - : "memory" + : "{rax}"(a), "{rdi}"(b), "{rsi}"(c), "{rdx}"(d), "{r10}"(e) + : "rcx", "r11", "memory" : "intel", "volatile"); Error::demux(a) @@ -64,10 +64,10 @@ pub unsafe fn syscall4(mut a: usize, b: usize, c: usize, d: usize, e: usize) -> pub unsafe fn syscall5(mut a: usize, b: usize, c: usize, d: usize, e: usize, f: usize) -> Result<usize> { - asm!("int 0x80" + asm!("syscall" : "={rax}"(a) - : "{rax}"(a), "{rbx}"(b), "{rcx}"(c), "{rdx}"(d), "{rsi}"(e), "{rdi}"(f) - : "memory" + : "{rax}"(a), "{rdi}"(b), "{rsi}"(c), "{rdx}"(d), "{r10}"(e), "{r8}"(f) + : "rcx", "r11", "memory" : "intel", "volatile"); Error::demux(a) diff --git a/vendor/redox_syscall/src/call.rs b/vendor/redox_syscall/src/call.rs index ce9a57d2dc..8b56541419 100644 --- a/vendor/redox_syscall/src/call.rs +++ b/vendor/redox_syscall/src/call.rs @@ -1,5 +1,5 @@ use super::arch::*; -use super::data::{SigAction, Stat, StatVfs, TimeSpec}; +use super::data::{Map, SigAction, Stat, StatVfs, TimeSpec}; use super::error::Result; use super::number::*; @@ -43,6 +43,10 @@ pub fn chdir<T: AsRef<[u8]>>(path: T) -> Result<usize> { unsafe { syscall2(SYS_CHDIR, path.as_ref().as_ptr() as usize, path.as_ref().len()) } } +#[deprecated( + since = "0.1.55", + note = "use fchmod instead" +)] pub fn chmod<T: AsRef<[u8]>>(path: T, mode: usize) -> Result<usize> { unsafe { syscall3(SYS_CHMOD, path.as_ref().as_ptr() as usize, path.as_ref().len(), mode) } } @@ -100,8 +104,8 @@ pub fn fexec(fd: usize, args: &[[usize; 2]], vars: &[[usize; 2]]) -> Result<usiz } /// Map a file into memory -pub unsafe fn fmap(fd: usize, offset: usize, size: usize) -> Result<usize> { - syscall3(SYS_FMAP, fd, offset, size) +pub unsafe fn fmap(fd: usize, map: &Map) -> Result<usize> { + syscall3(SYS_FMAP, fd, map as *const Map as usize, mem::size_of::<Map>()) } /// Unmap a memory-mapped file @@ -230,6 +234,11 @@ pub fn mkns(schemes: &[[usize; 2]]) -> Result<usize> { unsafe { syscall2(SYS_MKNS, schemes.as_ptr() as usize, schemes.len()) } } +/// Change mapping flags +pub unsafe fn mprotect(addr: usize, size: usize, flags: usize) -> Result<usize> { + syscall3(SYS_MPROTECT, addr, size, flags) +} + /// Sleep for the time specified in `req` pub fn nanosleep(req: &TimeSpec, rem: &mut TimeSpec) -> Result<usize> { unsafe { syscall2(SYS_NANOSLEEP, req as *const TimeSpec as usize, @@ -322,6 +331,13 @@ pub fn sigaction(sig: usize, act: Option<&SigAction>, oldact: Option<&mut SigAct restorer as usize) } } +/// Get and/or set signal masks +pub fn sigprocmask(how: usize, set: Option<&[u64; 2]>, oldset: Option<&mut [u64; 2]>) -> Result<usize> { + unsafe { syscall3(SYS_SIGPROCMASK, how, + set.map(|x| x as *const _).unwrap_or_else(ptr::null) as usize, + oldset.map(|x| x as *mut _).unwrap_or_else(ptr::null_mut) as usize) } +} + // Return from signal handler pub fn sigreturn() -> Result<usize> { unsafe { syscall0(SYS_SIGRETURN) } diff --git a/vendor/redox_syscall/src/data.rs b/vendor/redox_syscall/src/data.rs index 8e0cff43f2..f2290e06f5 100644 --- a/vendor/redox_syscall/src/data.rs +++ b/vendor/redox_syscall/src/data.rs @@ -2,6 +2,7 @@ use core::ops::{Deref, DerefMut}; use core::{mem, slice}; #[derive(Copy, Clone, Debug, Default)] +#[repr(C)] pub struct Event { pub id: usize, pub flags: usize, @@ -25,6 +26,57 @@ impl DerefMut for Event { } } +#[derive(Copy, Clone, Debug, Default)] +#[repr(C)] +pub struct ITimerSpec { + pub it_interval: TimeSpec, + pub it_value: TimeSpec, +} + +impl Deref for ITimerSpec { + type Target = [u8]; + fn deref(&self) -> &[u8] { + unsafe { + slice::from_raw_parts(self as *const ITimerSpec as *const u8, + mem::size_of::<ITimerSpec>()) as &[u8] + } + } +} + +impl DerefMut for ITimerSpec { + fn deref_mut(&mut self) -> &mut [u8] { + unsafe { + slice::from_raw_parts_mut(self as *mut ITimerSpec as *mut u8, + mem::size_of::<ITimerSpec>()) as &mut [u8] + } + } +} + +#[derive(Copy, Clone, Debug, Default)] +#[repr(C)] +pub struct Map { + pub offset: usize, + pub size: usize, + pub flags: usize, +} + +impl Deref for Map { + type Target = [u8]; + fn deref(&self) -> &[u8] { + unsafe { + slice::from_raw_parts(self as *const Map as *const u8, mem::size_of::<Map>()) as &[u8] + } + } +} + +impl DerefMut for Map { + fn deref_mut(&mut self) -> &mut [u8] { + unsafe { + slice::from_raw_parts_mut(self as *mut Map as *mut u8, mem::size_of::<Map>()) as &mut [u8] + } + } +} + #[derive(Copy, Clone, Debug, Default)] #[repr(C)] pub struct Packet { @@ -140,7 +192,7 @@ impl DerefMut for StatVfs { } } -#[derive(Copy, Clone, Debug, Default)] +#[derive(Copy, Clone, Debug, Default, PartialEq)] #[repr(C)] pub struct TimeSpec { pub tv_sec: i64, @@ -165,3 +217,93 @@ impl DerefMut for TimeSpec { } } } + +#[derive(Copy, Clone, Debug, Default)] +#[repr(C)] +#[cfg(target_arch = "x86_64")] +pub struct IntRegisters { + pub r15: usize, + pub r14: usize, + pub r13: usize, + pub r12: usize, + pub rbp: usize, + pub rbx: usize, + pub r11: usize, + pub r10: usize, + pub r9: usize, + pub r8: usize, + pub rax: usize, + pub rcx: usize, + pub rdx: usize, + pub rsi: usize, + pub rdi: usize, + // pub orig_rax: usize, + pub rip: usize, + pub cs: usize, + pub eflags: usize, + pub rsp: usize, + pub ss: usize, + pub fs_base: usize, + pub gs_base: usize, + pub ds: usize, + pub es: usize, + pub fs: usize, + pub gs: usize +} + +impl Deref for IntRegisters { + type Target = [u8]; + fn deref(&self) -> &[u8] { + unsafe { + slice::from_raw_parts(self as *const IntRegisters as *const u8, mem::size_of::<IntRegisters>()) as &[u8] + } + } +} + +impl DerefMut for IntRegisters { + fn deref_mut(&mut self) -> &mut [u8] { + unsafe { + slice::from_raw_parts_mut(self as *mut IntRegisters as *mut u8, mem::size_of::<IntRegisters>()) as &mut [u8] + } + } +} + +#[derive(Clone, Copy)] +#[repr(C)] +#[cfg(target_arch = "x86_64")] +pub struct FloatRegisters { + pub cwd: u16, + pub swd: u16, + pub ftw: u16, + pub fop: u16, + pub rip: u64, + pub rdp: u64, + pub mxcsr: u32, + pub mxcr_mask: u32, + pub st_space: [u32; 32], + pub xmm_space: [u32; 64] +} + +impl Default for FloatRegisters { + fn default() -> Self { + // xmm_space is not Default until const generics + unsafe { mem::zeroed() } + } +} + +impl Deref for FloatRegisters { + type Target = [u8]; + fn deref(&self) -> &[u8] { + unsafe { + slice::from_raw_parts(self as *const FloatRegisters as *const u8, mem::size_of::<FloatRegisters>()) as &[u8] + } + } +} + +impl DerefMut for FloatRegisters { + fn deref_mut(&mut self) -> &mut [u8] { + unsafe { + slice::from_raw_parts_mut(self as *mut FloatRegisters as *mut u8, mem::size_of::<FloatRegisters>()) as &mut [u8] + } + } +} diff --git a/vendor/redox_syscall/src/flag.rs b/vendor/redox_syscall/src/flag.rs index a41bc6d4a8..e6c4cbff4f 100644 --- a/vendor/redox_syscall/src/flag.rs +++ b/vendor/redox_syscall/src/flag.rs @@ -4,6 +4,7 @@ pub const CLONE_FILES: usize = 0x400; pub const CLONE_SIGHAND: usize = 0x800; pub const CLONE_VFORK: usize = 0x4000; pub const CLONE_THREAD: usize = 0x10000; +pub const CLONE_STACK: usize = 0x1000_0000; pub const CLOCK_REALTIME: usize = 1; pub const CLOCK_MONOTONIC: usize = 4; @@ -22,8 +23,8 @@ pub const FUTEX_WAIT: usize = 0; pub const FUTEX_WAKE: usize = 1; pub const FUTEX_REQUEUE: usize = 2; -pub const MAP_WRITE: usize = 1; -pub const MAP_WRITE_COMBINE: usize = 2; +pub const MAP_SHARED: usize = 0x0001; +pub const MAP_PRIVATE: usize = 0x0002; pub const MODE_TYPE: u16 = 0xF000; pub const MODE_DIR: u16 = 0x4000; @@ -55,6 +56,22 @@ pub const O_SYMLINK: usize = 0x4000_0000; pub const O_NOFOLLOW: usize = 0x8000_0000; pub const O_ACCMODE: usize = O_RDONLY | O_WRONLY | O_RDWR; +pub const PHYSMAP_WRITE: usize = 0x0000_0001; +pub const PHYSMAP_WRITE_COMBINE: usize = 0x0000_0002; +pub const PHYSMAP_NO_CACHE: usize = 0x0000_0004; + +pub const PROT_NONE: usize = 0x0000_0000; +pub const PROT_EXEC: usize = 0x0001_0000; +pub const PROT_WRITE: usize = 0x0002_0000; +pub const PROT_READ: usize = 0x0004_0000; + +pub const PTRACE_CONT: u8 = 0b0000_0001; +pub const PTRACE_SINGLESTEP: u8 = 0b0000_0010; +pub const PTRACE_SYSCALL: u8 = 0b0000_0011; +pub const PTRACE_WAIT: u8 = 0b0000_0100; +pub const PTRACE_OPERATIONMASK: u8 = 0b0000_1111; +pub const PTRACE_SYSEMU: u8 = 0b0001_0000; + pub const SEEK_SET: usize = 0; pub const SEEK_CUR: usize = 1; pub const SEEK_END: usize = 2; @@ -94,6 +111,10 @@ pub const SIGSYS: usize = 31; pub const SIG_DFL: usize = 0; pub const SIG_IGN: usize = 1; +pub const SIG_BLOCK: usize = 0; +pub const SIG_UNBLOCK: usize = 1; +pub const SIG_SETMASK: usize = 2; + pub const SA_NOCLDSTOP: usize = 0x00000001; pub const SA_NOCLDWAIT: usize = 0x00000002; pub const SA_SIGINFO: usize = 0x00000004; diff --git a/vendor/redox_syscall/src/io/dma.rs b/vendor/redox_syscall/src/io/dma.rs index 200beae74e..d5334b843f 100644 --- a/vendor/redox_syscall/src/io/dma.rs +++ b/vendor/redox_syscall/src/io/dma.rs @@ -32,7 +32,7 @@ pub struct Dma<T> { impl<T> Dma<T> { pub fn new(value: T) -> Result<Dma<T>> { let phys = PhysBox::new(mem::size_of::<T>())?; - let virt = unsafe { ::physmap(phys.address, phys.size, ::MAP_WRITE)? } as *mut T; + let virt = unsafe { ::physmap(phys.address, phys.size, ::PHYSMAP_WRITE)? } as *mut T; unsafe { ptr::write(virt, value); } Ok(Dma { phys: phys, @@ -42,7 +42,7 @@ impl<T> Dma<T> { pub fn zeroed() -> Result<Dma<T>> { let phys = PhysBox::new(mem::size_of::<T>())?; - let virt = unsafe { ::physmap(phys.address, phys.size, ::MAP_WRITE)? } as *mut T; + let virt = unsafe { ::physmap(phys.address, phys.size, ::PHYSMAP_WRITE)? } as *mut T; unsafe { ptr::write_bytes(virt as *mut u8, 0, phys.size); } Ok(Dma { phys: phys, diff --git a/vendor/redox_syscall/src/lib.rs b/vendor/redox_syscall/src/lib.rs index 50c2a9729f..6b8d130f01 100644 --- a/vendor/redox_syscall/src/lib.rs +++ b/vendor/redox_syscall/src/lib.rs @@ -1,8 +1,9 @@ -#![deny(warnings)] #![feature(asm)] #![feature(const_fn)] -#![feature(transpose_result)] -#![no_std] +#![cfg_attr(not(test), no_std)] + +#[cfg(test)] +extern crate core; pub use self::arch::*; pub use self::call::*; @@ -13,22 +14,26 @@ pub use self::io::*; pub use self::number::*; pub use self::scheme::*; -#[cfg(target_arch = "arm")] +#[cfg(all(target_os = "redox", target_arch = "arm"))] #[path="arch/arm.rs"] mod arch; -#[cfg(target_arch = "aarch64")] +#[cfg(all(target_os = "redox", target_arch = "aarch64"))] #[path="arch/aarch64.rs"] mod arch; -#[cfg(target_arch = "x86")] +#[cfg(all(target_os = "redox", target_arch = "x86"))] #[path="arch/x86.rs"] mod arch; -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_os = "redox", target_arch = "x86_64"))] #[path="arch/x86_64.rs"] mod arch; +#[cfg(not(target_os = "redox"))] +#[path="arch/nonredox.rs"] +mod arch; + /// Function definitions pub mod call; @@ -49,3 +54,6 @@ pub mod number; /// A trait useful for scheme handlers pub mod scheme; + +#[cfg(test)] +mod tests; diff --git a/vendor/redox_syscall/src/number.rs b/vendor/redox_syscall/src/number.rs index 3a4407fc99..ec9acfaac2 100644 --- a/vendor/redox_syscall/src/number.rs +++ b/vendor/redox_syscall/src/number.rs @@ -27,7 +27,7 @@ pub const SYS_FCHOWN: usize = SYS_CLASS_FILE | 207; pub const SYS_FCNTL: usize = SYS_CLASS_FILE | 55; pub const SYS_FEVENT: usize = SYS_CLASS_FILE | 927; pub const SYS_FEXEC: usize = SYS_CLASS_FILE | 11; -pub const SYS_FMAP: usize = SYS_CLASS_FILE | 90; +pub const SYS_FMAP: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 90; pub const SYS_FUNMAP: usize = SYS_CLASS_FILE | 91; pub const SYS_FPATH: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 928; pub const SYS_FRENAME: usize = SYS_CLASS_FILE | SYS_ARG_PATH | 38; @@ -55,6 +55,7 @@ pub const SYS_GETPPID: usize = 64; pub const SYS_GETUID: usize = 199; pub const SYS_IOPL: usize = 110; pub const SYS_KILL: usize = 37; +pub const SYS_MPROTECT: usize = 125; pub const SYS_MKNS: usize = 984; pub const SYS_NANOSLEEP: usize =162; pub const SYS_PHYSALLOC: usize =945; @@ -68,6 +69,7 @@ pub const SYS_SETREGID: usize = 204; pub const SYS_SETRENS: usize = 952; pub const SYS_SETREUID: usize = 203; pub const SYS_SIGACTION: usize =67; +pub const SYS_SIGPROCMASK:usize=126; pub const SYS_SIGRETURN: usize =119; pub const SYS_UMASK: usize = 60; pub const SYS_WAITPID: usize = 7; diff --git a/vendor/redox_syscall/src/scheme/scheme.rs b/vendor/redox_syscall/src/scheme/scheme.rs index 26921d454d..c047e96833 100644 --- a/vendor/redox_syscall/src/scheme/scheme.rs +++ b/vendor/redox_syscall/src/scheme/scheme.rs @@ -20,7 +20,12 @@ pub trait Scheme { SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), SYS_FEVENT => self.fevent(packet.b, packet.c), - SYS_FMAP => self.fmap(packet.b, packet.c, packet.d), + SYS_FMAP => if packet.d >= mem::size_of::<Map>() { + self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FUNMAP => self.funmap(packet.b), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => self.frename(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, packet.uid, packet.gid), SYS_FSTAT => if packet.d >= mem::size_of::<Stat>() { @@ -111,7 +116,12 @@ pub trait Scheme { } #[allow(unused_variables)] - fn fmap(&self, id: usize, offset: usize, size: usize) -> Result<usize> { + fn fmap(&self, id: usize, map: &Map) -> Result<usize> { + Err(Error::new(EBADF)) + } + + #[allow(unused_variables)] + fn funmap(&self, address: usize) -> Result<usize> { Err(Error::new(EBADF)) } diff --git a/vendor/redox_syscall/src/scheme/scheme_block.rs b/vendor/redox_syscall/src/scheme/scheme_block.rs index 1688202073..0407dde61d 100644 --- a/vendor/redox_syscall/src/scheme/scheme_block.rs +++ b/vendor/redox_syscall/src/scheme/scheme_block.rs @@ -20,7 +20,12 @@ pub trait SchemeBlock { SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), SYS_FEVENT => self.fevent(packet.b, packet.c), - SYS_FMAP => self.fmap(packet.b, packet.c, packet.d), + SYS_FMAP => if packet.d >= mem::size_of::<Map>() { + self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FUNMAP => self.funmap(packet.b), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => self.frename(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, packet.uid, packet.gid), SYS_FSTAT => if packet.d >= mem::size_of::<Stat>() { @@ -111,7 +116,12 @@ pub trait SchemeBlock { } #[allow(unused_variables)] - fn fmap(&self, id: usize, offset: usize, size: usize) -> Result<Option<usize>> { + fn fmap(&self, id: usize, map: &Map) -> Result<Option<usize>> { + Err(Error::new(EBADF)) + } + + #[allow(unused_variables)] + fn funmap(&self, address: usize) -> Result<Option<usize>> { Err(Error::new(EBADF)) } diff --git a/vendor/redox_syscall/src/scheme/scheme_block_mut.rs b/vendor/redox_syscall/src/scheme/scheme_block_mut.rs index 44e4fc9972..411035f42f 100644 --- a/vendor/redox_syscall/src/scheme/scheme_block_mut.rs +++ b/vendor/redox_syscall/src/scheme/scheme_block_mut.rs @@ -20,7 +20,12 @@ pub trait SchemeBlockMut { SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), SYS_FEVENT => self.fevent(packet.b, packet.c), - SYS_FMAP => self.fmap(packet.b, packet.c, packet.d), + SYS_FMAP => if packet.d >= mem::size_of::<Map>() { + self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FUNMAP => self.funmap(packet.b), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => self.frename(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, packet.uid, packet.gid), SYS_FSTAT => if packet.d >= mem::size_of::<Stat>() { @@ -111,7 +116,12 @@ pub trait SchemeBlockMut { } #[allow(unused_variables)] - fn fmap(&mut self, id: usize, offset: usize, size: usize) -> Result<Option<usize>> { + fn fmap(&mut self, id: usize, map: &Map) -> Result<Option<usize>> { + Err(Error::new(EBADF)) + } + + #[allow(unused_variables)] + fn funmap(&mut self, address: usize) -> Result<Option<usize>> { Err(Error::new(EBADF)) } diff --git a/vendor/redox_syscall/src/scheme/scheme_mut.rs b/vendor/redox_syscall/src/scheme/scheme_mut.rs index 5b5665c734..abd2e88e5c 100644 --- a/vendor/redox_syscall/src/scheme/scheme_mut.rs +++ b/vendor/redox_syscall/src/scheme/scheme_mut.rs @@ -20,7 +20,12 @@ pub trait SchemeMut { SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), SYS_FEVENT => self.fevent(packet.b, packet.c), - SYS_FMAP => self.fmap(packet.b, packet.c, packet.d), + SYS_FMAP => if packet.d >= mem::size_of::<Map>() { + self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FUNMAP => self.funmap(packet.b), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => self.frename(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, packet.uid, packet.gid), SYS_FSTAT => if packet.d >= mem::size_of::<Stat>() { @@ -111,7 +116,12 @@ pub trait SchemeMut { } #[allow(unused_variables)] - fn fmap(&mut self, id: usize, offset: usize, size: usize) -> Result<usize> { + fn fmap(&mut self, id: usize, map: &Map) -> Result<usize> { + Err(Error::new(EBADF)) + } + + #[allow(unused_variables)] + fn funmap(&mut self, address: usize) -> Result<usize> { Err(Error::new(EBADF)) } diff --git a/vendor/redox_syscall/src/tests.rs b/vendor/redox_syscall/src/tests.rs new file mode 100644 index 0000000000..cf89ec96ae --- /dev/null +++ b/vendor/redox_syscall/src/tests.rs @@ -0,0 +1,129 @@ +#[test] +fn brk() { + unsafe { + let start = dbg!(crate::brk(0)).unwrap(); + let end = start + 4 * 1024 * 1024; + assert_eq!(dbg!(crate::brk(end)), Ok(end)); + } +} + +#[test] +fn chdir() { + //TODO: Verify CWD + assert_eq!(dbg!(crate::chdir("file:/")), Ok(0)); + assert_eq!(dbg!(crate::chdir("file:/root")), Ok(0)); +} + +//TODO: chmod + +#[test] +fn clone() { + let expected_status = 42; + let pid_res = unsafe { crate::clone(0) }; + if pid_res == Ok(0) { + crate::exit(expected_status).unwrap(); + panic!("failed to exit"); + } else { + let pid = dbg!(pid_res).unwrap(); + let mut status = 0; + assert_eq!(dbg!(crate::waitpid(pid, &mut status, 0)), Ok(pid)); + assert_eq!(dbg!(crate::wifexited(status)), true); + assert_eq!(dbg!(crate::wexitstatus(status)), expected_status); + } +} + +//TODO: close + +#[test] +fn clock_gettime() { + let mut tp = crate::TimeSpec::default(); + assert_eq!(dbg!( + crate::clock_gettime(crate::CLOCK_MONOTONIC, &mut tp) + ), Ok(0)); + assert_ne!(dbg!(tp), crate::TimeSpec::default()); + + tp = crate::TimeSpec::default(); + assert_eq!(dbg!( + crate::clock_gettime(crate::CLOCK_REALTIME, &mut tp) + ), Ok(0)); + assert_ne!(dbg!(tp), crate::TimeSpec::default()); +} + +//TODO: dup + +//TODO: dup2 + +//TODO: exit (handled by clone?) + +//TODO: fchmod + +//TODO: fcntl + +#[test] +fn fexec() { + let name = "/bin/ls"; + + let fd = dbg!( + crate::open(name, crate::O_RDONLY | crate::O_CLOEXEC) + ).unwrap(); + + let args = &[ + [name.as_ptr() as usize, name.len()] + ]; + + let vars = &[]; + + let pid_res = unsafe { crate::clone(0) }; + if pid_res == Ok(0) { + crate::fexec(fd, args, vars).unwrap(); + panic!("failed to fexec"); + } else { + assert_eq!(dbg!(crate::close(fd)), Ok(0)); + + let pid = dbg!(pid_res).unwrap(); + let mut status = 0; + assert_eq!(dbg!(crate::waitpid(pid, &mut status, 0)), Ok(pid)); + assert_eq!(dbg!(crate::wifexited(status)), true); + assert_eq!(dbg!(crate::wexitstatus(status)), 0); + } +} + +#[test] +fn fmap() { + use std::slice; + + let fd = dbg!( + crate::open( + "/tmp/syscall-tests-fmap", + crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC + ) + ).unwrap(); + + let map = unsafe { + slice::from_raw_parts_mut( + dbg!( + crate::fmap(fd, &crate::Map { + offset: 0, + size: 128, + flags: crate::PROT_READ | crate::PROT_WRITE + }) + ).unwrap() as *mut u8, + 128 + ) + }; + + // Maps should be available after closing + assert_eq!(dbg!(crate::close(fd)), Ok(0)); + + for i in 0..128 { + map[i as usize] = i; + assert_eq!(map[i as usize], i); + } + + //TODO: add msync + unsafe { + assert_eq!(dbg!( + crate::funmap(map.as_mut_ptr() as usize) + ), Ok(0)); + } +} diff --git a/vendor/rustfix/.cargo-checksum.json b/vendor/rustfix/.cargo-checksum.json index e147e845b3..8add93d57e 100644 --- a/vendor/rustfix/.cargo-checksum.json +++ b/vendor/rustfix/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"e085b2de248b6837986f38eed2ce07f45df4779efc919ccefc736d377456b9b8","Changelog.md":"78b0b218038a68313eaf853aea4dd704efaea95d8c5b9a4590aeecd39564bc3b","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"06a5d0a2bfba711b0c19fa86c481bf08b38a84bd31a86648d9e207287d941e36","Readme.md":"51abb14fb159982708a2be4ba1745487d7de96bd981c480265b866791fa25c91","bors.toml":"41e53681450ca950c743b03ce7e2f485496ce2c175e6e2d750dea5159fadecd2","proptest-regressions/replace.txt":"9335379703ca7f8aa978c88d40c966cad42a592fed3e0b56513e9686f661232d","src/diagnostics.rs":"2d375d54d3648026402a298f68a29740bdb5c4bee5f49574cc0486f6ac0f369d","src/lib.rs":"f09eebb86a1ab514d14f6527e04cdada2aa9a6e241c67b6b4007f2d30b470b30","src/replace.rs":"49eebd059faaea966e2994e9de6ef2c256c9bde98840ceb16c63aaee413dc8ab"},"package":"7150ac777a2931a53489f5a41eb0937b84e3092a20cd0e73ad436b65b507f607"} \ No newline at end of file +{"files":{"Cargo.toml":"33b9e841ae93268d092f7e32ddc4ce7a37c9b4e93875c9dfba9b244d40a0eea4","Changelog.md":"78b0b218038a68313eaf853aea4dd704efaea95d8c5b9a4590aeecd39564bc3b","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"06a5d0a2bfba711b0c19fa86c481bf08b38a84bd31a86648d9e207287d941e36","Readme.md":"bb47dd5f422a24973d4ad3fc368a7f5db9eaf4d5985ebe2287a5f3eca4b34f04","proptest-regressions/replace.txt":"9335379703ca7f8aa978c88d40c966cad42a592fed3e0b56513e9686f661232d","src/diagnostics.rs":"2d375d54d3648026402a298f68a29740bdb5c4bee5f49574cc0486f6ac0f369d","src/lib.rs":"9cbd2d6139525615efb77989a9b4cf11f908b212638a30acc23be23daf3e8fee","src/replace.rs":"f5ea534e99cde6d3a1bb89f6fdc1d9eca545efb25418ac4207854a9a6003376c"},"package":"804b11883a5ce0ad0378fbf95a8dea59ee6b51c331a73b8f471b6bdaa3bd40c1"} \ No newline at end of file diff --git a/vendor/rustfix/Cargo.toml b/vendor/rustfix/Cargo.toml index 39bafec088..e9ea3c42a3 100644 --- a/vendor/rustfix/Cargo.toml +++ b/vendor/rustfix/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "rustfix" -version = "0.4.6" +version = "0.5.0" authors = ["Pascal Hertleif <killercup@gmail.com>", "Oliver Schneider <oli-obk@users.noreply.github.com>"] exclude = ["etc/*", "examples/*", "tests/*"] description = "Automatically apply the suggestions made by rustc" @@ -21,8 +21,8 @@ documentation = "https://docs.rs/rustfix" readme = "Readme.md" license = "Apache-2.0/MIT" repository = "https://github.com/rust-lang-nursery/rustfix" -[dependencies.failure] -version = "0.1.2" +[dependencies.anyhow] +version = "1.0.0" [dependencies.log] version = "0.4.1" diff --git a/vendor/rustfix/Readme.md b/vendor/rustfix/Readme.md index 7efee7dc46..fb5eda843b 100644 --- a/vendor/rustfix/Readme.md +++ b/vendor/rustfix/Readme.md @@ -2,9 +2,6 @@ The goal of this tool is to read and apply the suggestions made by rustc. -[![Build Status](https://travis-ci.org/rust-lang-nursery/rustfix.svg?branch=master)](https://travis-ci.org/rust-lang-nursery/rustfix) -[![Build status](https://ci.appveyor.com/api/projects/status/g8ljreo9ryu3s6ee/branch/master?svg=true)](https://ci.appveyor.com/project/rust-lang-libs/rustfix/branch/master) - ## Current status Currently, rustfix is split into two crates: diff --git a/vendor/rustfix/bors.toml b/vendor/rustfix/bors.toml deleted file mode 100644 index 611828927c..0000000000 --- a/vendor/rustfix/bors.toml +++ /dev/null @@ -1,4 +0,0 @@ -status = [ - "continuous-integration/travis-ci/push", -] -required_approvals = 1 diff --git a/vendor/rustfix/src/lib.rs b/vendor/rustfix/src/lib.rs index 124f9fdc24..8026f00c0e 100644 --- a/vendor/rustfix/src/lib.rs +++ b/vendor/rustfix/src/lib.rs @@ -2,8 +2,6 @@ #[macro_use] extern crate log; -#[macro_use] -extern crate failure; #[cfg(test)] #[macro_use] extern crate proptest; @@ -12,7 +10,7 @@ use serde_json; use std::collections::HashSet; use std::ops::Range; -use failure::Error; +use anyhow::Error; pub mod diagnostics; use crate::diagnostics::{Diagnostic, DiagnosticSpan}; @@ -94,10 +92,12 @@ pub struct Replacement { fn parse_snippet(span: &DiagnosticSpan) -> Option<Snippet> { // unindent the snippet - let indent = span.text + let indent = span + .text .iter() .map(|line| { - let indent = line.text + let indent = line + .text .chars() .take_while(|&c| char::is_whitespace(c)) .count(); @@ -127,7 +127,11 @@ fn parse_snippet(span: &DiagnosticSpan) -> Option<Snippet> { if span.text.len() > 1 { body.push('\n'); - body.push_str(&last_slice[indent..last_tail_index].iter().collect::<String>()); + body.push_str( + &last_slice[indent..last_tail_index] + .iter() + .collect::<String>(), + ); } tail.push_str(&last_slice[last_tail_index..].iter().collect::<String>()); Some(Snippet { @@ -150,7 +154,10 @@ fn parse_snippet(span: &DiagnosticSpan) -> Option<Snippet> { fn collect_span(span: &DiagnosticSpan) -> Option<Replacement> { let snippet = parse_snippet(span)?; let replacement = span.suggested_replacement.clone()?; - Some(Replacement { snippet, replacement }) + Some(Replacement { + snippet, + replacement, + }) } pub fn collect_suggestions<S: ::std::hash::BuildHasher>( @@ -184,8 +191,8 @@ pub fn collect_suggestions<S: ::std::hash::BuildHasher>( .spans .iter() .filter(|span| { - use crate::Filter::*; use crate::diagnostics::Applicability::*; + use crate::Filter::*; match (filter, &span.suggestion_applicability) { (MachineApplicableOnly, Some(MachineApplicable)) => true, diff --git a/vendor/rustfix/src/replace.rs b/vendor/rustfix/src/replace.rs index 9dfbd4d94b..8071049396 100644 --- a/vendor/rustfix/src/replace.rs +++ b/vendor/rustfix/src/replace.rs @@ -2,7 +2,7 @@ //! replacement of parts of its content, with the ability to prevent changing //! the same parts multiple times. -use failure::Error; +use anyhow::{anyhow, ensure, Error}; use std::rc::Rc; #[derive(Debug, Clone, PartialEq, Eq)] @@ -43,13 +43,11 @@ impl Data { pub fn new(data: &[u8]) -> Self { Data { original: data.into(), - parts: vec![ - Span { - data: State::Initial, - start: 0, - end: data.len().saturating_sub(1), - }, - ], + parts: vec![Span { + data: State::Initial, + start: 0, + end: data.len().saturating_sub(1), + }], } } @@ -105,7 +103,8 @@ impl Data { // the whole chunk. As an optimization and without loss of generality we // don't add empty parts. let new_parts = { - let index_of_part_to_split = self.parts + let index_of_part_to_split = self + .parts .iter() .position(|p| { !p.data.is_inserted() && p.start <= from && p.end >= up_to_and_including @@ -113,7 +112,8 @@ impl Data { .ok_or_else(|| { use log::Level::Debug; if log_enabled!(Debug) { - let slices = self.parts + let slices = self + .parts .iter() .map(|p| { ( @@ -133,7 +133,7 @@ impl Data { ); } - format_err!( + anyhow!( "Could not replace range {}...{} in file \ -- maybe parts of it were already replaced?", from, @@ -154,7 +154,7 @@ impl Data { if part_to_split.start == from && part_to_split.end == up_to_and_including { if let State::Replaced(ref replacement) = part_to_split.data { if &**replacement == data { - return Ok(()) + return Ok(()); } } } diff --git a/vendor/socket2/.cargo-checksum.json b/vendor/socket2/.cargo-checksum.json index 57d7db7abb..c0a15e6e79 100644 --- a/vendor/socket2/.cargo-checksum.json +++ b/vendor/socket2/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"aded0f06bff3818817cebd94db03cdc5a075cf4cd2e2fae3d0d37b8ab12c7f1f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"c89dbaf3e81e1ee478e7fdd8cb24c7a6dc6d849eed08de0423ea37e334e7e882","src/lib.rs":"1dd607cde24f8afe21076fa76ffc557690ce751842715a14f1f8578b88a66355","src/sockaddr.rs":"71613f3ef962bf2581f59c0f90d6c46d46e651f49f6aeddce86fb736eb330f01","src/socket.rs":"c90b544c5dcc06e50fbb5e311fd47fffe03c6a8351cc0a7d295d48baf541b57c","src/sys/redox/mod.rs":"d462cb1580a775a45d8864a4c819d868e556f98221eceef566fe58af6faa3b64","src/sys/unix/mod.rs":"2d07562d715cc7e6292c25bd012a004bf3379ecdb8fba6217003c0e8130b4aa2","src/sys/unix/weak.rs":"bdfb4f0e355d84585a782b6058ba60cd828d7fb2027cd0bb0bfc68b9c881f04a","src/sys/windows.rs":"370a1ed6e7cbb014b028557e83622a1928ca88f0a2f425549e27ca320c94a968","src/utils.rs":"53968de8c8e078a650fa316438622be9bb78bca95ed07c4f8da2c940ae27e0ae"},"package":"c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7"} \ No newline at end of file +{"files":{"Cargo.toml":"e972a8413402972abe0b109cae127f5f2590eba53af6df9d1537f6a2f0c5d194","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"76b59d53338de3386da807f4d5028cb2a73d027e5d7747e2ad04e2ef113c41dc","src/lib.rs":"4c2966cd283751a96f1769fbe529fd1105bc2a8ac15dc2148b6cfc4cca24cd38","src/sockaddr.rs":"66a14de3a133fb81cefb30737a4470de38c12cd04b115fdd98b1ef7870c22e19","src/socket.rs":"af9d5539bc195bf2b704d31b37e93bcbfee21df13aefc12567e10e612ee36f93","src/sys/redox/mod.rs":"a6ba2a38a7af83a3c85cee892f2a2dc7c66aba267e50f02f682eee938f067e95","src/sys/unix.rs":"7e3f0d6595814c3a70eed9e63e16fcd0c2a037b779a1d9fb9eeefa0bde9e8631","src/sys/windows.rs":"2e914bf3aa08452ebf3358f941f93469b7eb2982909d620139f263c3bb82f28a","src/utils.rs":"53968de8c8e078a650fa316438622be9bb78bca95ed07c4f8da2c940ae27e0ae"},"package":"e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85"} \ No newline at end of file diff --git a/vendor/socket2/Cargo.toml b/vendor/socket2/Cargo.toml index 66b97069bd..692fa9f4f0 100644 --- a/vendor/socket2/Cargo.toml +++ b/vendor/socket2/Cargo.toml @@ -3,7 +3,7 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies +# to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're @@ -11,8 +11,9 @@ # will likely look very different (and much more reasonable) [package] +edition = "2018" name = "socket2" -version = "0.3.8" +version = "0.3.11" authors = ["Alex Crichton <alex@alexcrichton.com>"] description = "Utilities for handling networking sockets with a maximal amount of configuration\npossible intended.\n" homepage = "https://github.com/alexcrichton/socket2-rs" diff --git a/vendor/socket2/README.md b/vendor/socket2/README.md index 2936503ffc..0e9e914818 100644 --- a/vendor/socket2/README.md +++ b/vendor/socket2/README.md @@ -1,6 +1,6 @@ # socket2-rs -[![Build Status](https://travis-ci.org/alexcrichton/socket2-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/socket2-rs) +[![Build Status](https://travis-ci.com/alexcrichton/socket2-rs.svg?branch=master)](https://travis-ci.com/alexcrichton/socket2-rs) [![Build status](https://ci.appveyor.com/api/projects/status/hovebj1gr4bgm3d9?svg=true)](https://ci.appveyor.com/project/alexcrichton/socket2-rs) [Documentation](https://docs.rs/socket2) diff --git a/vendor/socket2/src/lib.rs b/vendor/socket2/src/lib.rs index 16e745d4ef..cf599c8ed3 100644 --- a/vendor/socket2/src/lib.rs +++ b/vendor/socket2/src/lib.rs @@ -37,23 +37,7 @@ #![doc(html_root_url = "https://docs.rs/socket2/0.3")] #![deny(missing_docs)] -#[cfg(unix)] -#[macro_use] -extern crate cfg_if; -#[cfg(target_os = "redox")] -extern crate cfg_if; -#[cfg(any(unix, target_os = "redox"))] -extern crate libc; -#[cfg(target_os = "redox")] -extern crate syscall; - -#[cfg(windows)] -extern crate winapi; - -#[cfg(test)] -extern crate tempdir; - -use utils::NetInt; +use crate::utils::NetInt; #[cfg(any(unix, target_os = "redox"))] use libc::{sockaddr_storage, socklen_t}; @@ -66,9 +50,14 @@ mod sockaddr; mod socket; mod utils; -#[cfg_attr(unix, path = "sys/unix/mod.rs")] -#[cfg_attr(target_os = "redox", path = "sys/redox/mod.rs")] -#[cfg_attr(windows, path = "sys/windows.rs")] +#[cfg(unix)] +#[path = "sys/unix.rs"] +mod sys; +#[cfg(windows)] +#[path = "sys/windows.rs"] +mod sys; +#[cfg(target_os = "redox")] +#[path = "sys/redox/mod.rs"] mod sys; /// Newtype, owned, wrapper around a system socket. diff --git a/vendor/socket2/src/sockaddr.rs b/vendor/socket2/src/sockaddr.rs index 5e335db9be..c6c9ef1d44 100644 --- a/vendor/socket2/src/sockaddr.rs +++ b/vendor/socket2/src/sockaddr.rs @@ -4,18 +4,21 @@ use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6}; use std::ptr; #[cfg(any(unix, target_os = "redox"))] -use libc::{sa_family_t, sockaddr, sockaddr_in, sockaddr_storage, socklen_t, AF_INET6, - sockaddr_in6, AF_INET}; +use libc::{ + sa_family_t, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_storage, socklen_t, AF_INET, + AF_INET6, +}; #[cfg(windows)] -use winapi::shared::ws2def::{ADDRESS_FAMILY as sa_family_t, AF_INET6, SOCKADDR as sockaddr, - SOCKADDR_IN as sockaddr_in, SOCKADDR_STORAGE as sockaddr_storage, - AF_INET}; -#[cfg(windows)] -use winapi::um::ws2tcpip::socklen_t; +use winapi::shared::ws2def::{ + ADDRESS_FAMILY as sa_family_t, AF_INET, AF_INET6, SOCKADDR as sockaddr, + SOCKADDR_IN as sockaddr_in, SOCKADDR_STORAGE as sockaddr_storage, +}; #[cfg(windows)] use winapi::shared::ws2ipdef::SOCKADDR_IN6_LH as sockaddr_in6; +#[cfg(windows)] +use winapi::um::ws2tcpip::socklen_t; -use SockAddr; +use crate::SockAddr; impl fmt::Debug for SockAddr { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { @@ -59,10 +62,10 @@ impl SockAddr { where P: AsRef<::std::path::Path>, { + use libc::{c_char, sockaddr_un, AF_UNIX}; use std::cmp::Ordering; use std::io; use std::os::unix::ffi::OsStrExt; - use libc::{c_char, sockaddr_un, AF_UNIX}; unsafe { let mut addr = mem::zeroed::<sockaddr_un>(); @@ -123,7 +126,7 @@ impl SockAddr { unsafe { self.as_(AF_INET as sa_family_t) } } - /// Returns this address as a `SocketAddrV4` if it is in the `AF_INET6` + /// Returns this address as a `SocketAddrV6` if it is in the `AF_INET6` /// family. pub fn as_inet6(&self) -> Option<SocketAddrV6> { unsafe { self.as_(AF_INET6 as sa_family_t) } diff --git a/vendor/socket2/src/socket.rs b/vendor/socket2/src/socket.rs index b3297d6672..8ca52c128b 100644 --- a/vendor/socket2/src/socket.rs +++ b/vendor/socket2/src/socket.rs @@ -11,17 +11,17 @@ use std::fmt; use std::io::{self, Read, Write}; use std::net::{self, Ipv4Addr, Ipv6Addr, Shutdown}; -use std::time::Duration; #[cfg(all(unix, feature = "unix"))] use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream}; +use std::time::Duration; #[cfg(any(unix, target_os = "redox"))] use libc as c; #[cfg(windows)] use winapi::shared::ws2def as c; -use sys; -use {Domain, Protocol, SockAddr, Socket, Type}; +use crate::sys; +use crate::{Domain, Protocol, SockAddr, Socket, Type}; impl Socket { /// Creates a new socket ready to be configured. @@ -632,20 +632,20 @@ impl Socket { /// /// This function is only available on Unix when the `reuseport` feature is /// enabled. - #[cfg(all(unix, feature = "reuseport"))] + #[cfg(all(unix, not(target_os = "solaris"), feature = "reuseport"))] pub fn reuse_port(&self) -> io::Result<bool> { self.inner.reuse_port() } /// Set value for the `SO_REUSEPORT` option on this socket. /// - /// This indicates that futher calls to `bind` may allow reuse of local + /// This indicates that further calls to `bind` may allow reuse of local /// addresses. For IPv4 sockets this means that a socket may bind even when /// there's a socket already listening on this port. /// /// This function is only available on Unix when the `reuseport` feature is /// enabled. - #[cfg(all(unix, feature = "reuseport"))] + #[cfg(all(unix, not(target_os = "solaris"), feature = "reuseport"))] pub fn set_reuse_port(&self, reuse: bool) -> io::Result<()> { self.inner.set_reuse_port(reuse) } @@ -838,25 +838,25 @@ impl Type { } } -impl ::Protocol { +impl crate::Protocol { /// Protocol corresponding to `ICMPv4` pub fn icmpv4() -> Self { - ::Protocol(sys::IPPROTO_ICMP) + crate::Protocol(sys::IPPROTO_ICMP) } /// Protocol corresponding to `ICMPv6` pub fn icmpv6() -> Self { - ::Protocol(sys::IPPROTO_ICMPV6) + crate::Protocol(sys::IPPROTO_ICMPV6) } /// Protocol corresponding to `TCP` pub fn tcp() -> Self { - ::Protocol(sys::IPPROTO_TCP) + crate::Protocol(sys::IPPROTO_TCP) } /// Protocol corresponding to `UDP` pub fn udp() -> Self { - ::Protocol(sys::IPPROTO_UDP) + crate::Protocol(sys::IPPROTO_UDP) } } @@ -982,4 +982,16 @@ mod test { #[cfg(unix)] assert_eq!(socket.keepalive().unwrap(), None); } + + #[test] + fn nodelay() { + let socket = Socket::new(Domain::ipv4(), Type::stream(), None).unwrap(); + + assert!(socket.set_nodelay(true).is_ok()); + + let result = socket.nodelay(); + + assert!(result.is_ok()); + assert!(result.unwrap()); + } } diff --git a/vendor/socket2/src/sys/redox/mod.rs b/vendor/socket2/src/sys/redox/mod.rs index 3882fc9916..bd1ebfcb02 100644 --- a/vendor/socket2/src/sys/redox/mod.rs +++ b/vendor/socket2/src/sys/redox/mod.rs @@ -10,8 +10,9 @@ use std::cmp; use std::fmt; -use std::io::{ErrorKind, Read, Write}; +use std::fs::File; use std::io; +use std::io::{ErrorKind, Read, Write}; use std::mem; use std::net::Shutdown; use std::net::{self, Ipv4Addr, Ipv6Addr}; @@ -19,9 +20,8 @@ use std::ops::Neg; use std::os::unix::prelude::*; use std::time::Duration; use syscall; -use std::fs::File; -use libc::{self, c_uint, c_int, c_void, socklen_t, ssize_t}; +use libc::{self, c_int, c_uint, c_void, socklen_t, ssize_t}; use libc::IPV6_ADD_MEMBERSHIP; use libc::IPV6_DROP_MEMBERSHIP; @@ -30,8 +30,8 @@ const MSG_NOSIGNAL: c_int = 0x0; use libc::TCP_KEEPIDLE as KEEPALIVE_OPTION; -use SockAddr; -use utils::One; +use crate::utils::One; +use crate::SockAddr; pub const IPPROTO_TCP: i32 = libc::IPPROTO_TCP; @@ -51,7 +51,10 @@ impl Socket { return Err(io::Error::new(ErrorKind::Other, "Type not implemented yet")); } if protocol == -1 { - return Err(io::Error::new(ErrorKind::Other, "Protocol not implemented yet")); + return Err(io::Error::new( + ErrorKind::Other, + "Protocol not implemented yet", + )); } unsafe { let fd = cvt(libc::socket(family, ty, protocol))?; @@ -94,18 +97,18 @@ impl Socket { self.connect(addr)?; let mut event = File::open("event:")?; - let mut time = File::open("time:")?; + let mut time = File::open("time:")?; event.write(&syscall::Event { id: self.fd as usize, flags: syscall::EVENT_WRITE, - data: 0 + data: 0, })?; event.write(&syscall::Event { id: time.as_raw_fd(), flags: syscall::EVENT_WRITE, - data: 1 + data: 1, })?; let mut current = syscall::TimeSpec::default(); @@ -117,11 +120,9 @@ impl Socket { let mut out = syscall::Event::default(); event.read(&mut out)?; - if out.data == 1 { // the timeout we registered - return Err(io::Error::new( - ErrorKind::TimedOut, - "connection timed out", - )); + if out.data == 1 { + // the timeout we registered + return Err(io::Error::new(ErrorKind::TimedOut, "connection timed out")); } Ok(()) @@ -150,7 +151,7 @@ impl Socket { cvt(libc::getpeername( self.fd, &mut storage as *mut _ as *mut _, - &mut len + &mut len, ))?; Ok(SockAddr::from_raw_parts( &storage as *const _ as *const _, @@ -308,10 +309,9 @@ impl Socket { pub fn read_timeout(&self) -> io::Result<Option<Duration>> { unsafe { - Ok(timeval2dur(self.getsockopt( - libc::SOL_SOCKET, - libc::SO_RCVTIMEO, - )?)) + Ok(timeval2dur( + self.getsockopt(libc::SOL_SOCKET, libc::SO_RCVTIMEO)?, + )) } } @@ -321,10 +321,9 @@ impl Socket { pub fn write_timeout(&self) -> io::Result<Option<Duration>> { unsafe { - Ok(timeval2dur(self.getsockopt( - libc::SOL_SOCKET, - libc::SO_SNDTIMEO, - )?)) + Ok(timeval2dur( + self.getsockopt(libc::SOL_SOCKET, libc::SO_SNDTIMEO)?, + )) } } @@ -469,10 +468,9 @@ impl Socket { pub fn linger(&self) -> io::Result<Option<Duration>> { unsafe { - Ok(linger2dur(self.getsockopt( - libc::SOL_SOCKET, - libc::SO_LINGER, - )?)) + Ok(linger2dur( + self.getsockopt(libc::SOL_SOCKET, libc::SO_LINGER)?, + )) } } @@ -539,11 +537,7 @@ impl Socket { )?; if let Some(dur) = keepalive { // TODO: checked cast here - self.setsockopt( - libc::IPPROTO_TCP, - KEEPALIVE_OPTION, - dur.as_secs() as c_int, - )?; + self.setsockopt(libc::IPPROTO_TCP, KEEPALIVE_OPTION, dur.as_secs() as c_int)?; } Ok(()) } @@ -654,21 +648,21 @@ impl FromRawFd for Socket { } } -impl AsRawFd for ::Socket { +impl AsRawFd for crate::Socket { fn as_raw_fd(&self) -> RawFd { self.inner.as_raw_fd() } } -impl IntoRawFd for ::Socket { +impl IntoRawFd for crate::Socket { fn into_raw_fd(self) -> RawFd { self.inner.into_raw_fd() } } -impl FromRawFd for ::Socket { - unsafe fn from_raw_fd(fd: RawFd) -> ::Socket { - ::Socket { +impl FromRawFd for crate::Socket { + unsafe fn from_raw_fd(fd: RawFd) -> crate::Socket { + crate::Socket { inner: Socket::from_raw_fd(fd), } } @@ -788,9 +782,11 @@ fn timeval2dur(raw: libc::timeval) -> Option<Duration> { fn to_s_addr(addr: &Ipv4Addr) -> libc::in_addr_t { let octets = addr.octets(); - ::hton( - ((octets[0] as libc::in_addr_t) << 24) | ((octets[1] as libc::in_addr_t) << 16) - | ((octets[2] as libc::in_addr_t) << 8) | ((octets[3] as libc::in_addr_t) << 0), + crate::hton( + ((octets[0] as libc::in_addr_t) << 24) + | ((octets[1] as libc::in_addr_t) << 16) + | ((octets[2] as libc::in_addr_t) << 8) + | ((octets[3] as libc::in_addr_t) << 0), ) } diff --git a/vendor/socket2/src/sys/unix/mod.rs b/vendor/socket2/src/sys/unix.rs similarity index 94% rename from vendor/socket2/src/sys/unix/mod.rs rename to vendor/socket2/src/sys/unix.rs index 96e01b782c..e138e68405 100644 --- a/vendor/socket2/src/sys/unix/mod.rs +++ b/vendor/socket2/src/sys/unix.rs @@ -10,21 +10,21 @@ use std::cmp; use std::fmt; -use std::io::{ErrorKind, Read, Write}; use std::io; +use std::io::{ErrorKind, Read, Write}; use std::mem; use std::net::Shutdown; use std::net::{self, Ipv4Addr, Ipv6Addr}; use std::ops::Neg; -use std::os::unix::prelude::*; -use std::sync::atomic::{AtomicBool, Ordering, ATOMIC_BOOL_INIT}; -use std::time::{Duration, Instant}; #[cfg(feature = "unix")] use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream}; +use std::os::unix::prelude::*; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::time::{Duration, Instant}; use libc::{self, c_int, c_void, socklen_t, ssize_t}; -cfg_if! { +cfg_if::cfg_if! { if #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "ios", target_os = "macos", target_os = "openbsd", target_os = "netbsd", @@ -37,7 +37,7 @@ cfg_if! { } } -cfg_if! { +cfg_if::cfg_if! { if #[cfg(any(target_os = "linux", target_os = "android", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", @@ -48,7 +48,7 @@ cfg_if! { } } -cfg_if! { +cfg_if::cfg_if! { if #[cfg(any(target_os = "macos", target_os = "ios"))] { use libc::TCP_KEEPALIVE as KEEPALIVE_OPTION; } else if #[cfg(any(target_os = "openbsd", target_os = "netbsd", target_os = "haiku"))] { @@ -58,8 +58,8 @@ cfg_if! { } } -use SockAddr; -use utils::One; +use crate::utils::One; +use crate::SockAddr; pub const IPPROTO_ICMP: i32 = libc::IPPROTO_ICMP; pub const IPPROTO_ICMPV6: i32 = libc::IPPROTO_ICMPV6; @@ -68,10 +68,6 @@ pub const IPPROTO_UDP: i32 = libc::IPPROTO_UDP; pub const SOCK_SEQPACKET: i32 = libc::SOCK_SEQPACKET; pub const SOCK_RAW: i32 = libc::SOCK_RAW; -#[macro_use] -#[cfg(target_os = "linux")] -mod weak; - pub struct Socket { fd: c_int, } @@ -248,7 +244,7 @@ impl Socket { #[cfg(not(any(target_os = "android", target_os = "haiku")))] use libc::F_DUPFD_CLOEXEC; - static CLOEXEC_FAILED: AtomicBool = ATOMIC_BOOL_INIT; + static CLOEXEC_FAILED: AtomicBool = AtomicBool::new(false); unsafe { if !CLOEXEC_FAILED.load(Ordering::Relaxed) { match cvt(libc::fcntl(self.fd, F_DUPFD_CLOEXEC, 0)) { @@ -280,23 +276,19 @@ impl Socket { let mut socket = None; #[cfg(target_os = "linux")] { - weak! { - fn accept4(c_int, *mut libc::sockaddr, *mut socklen_t, c_int) -> c_int - } - if let Some(f) = accept4.get() { - let res = cvt_r(|| unsafe { - f( - self.fd, - &mut storage as *mut _ as *mut _, - &mut len, - libc::SOCK_CLOEXEC, - ) - }); - match res { - Ok(fd) => socket = Some(Socket { fd: fd }), - Err(ref e) if e.raw_os_error() == Some(libc::ENOSYS) => {} - Err(e) => return Err(e), - } + let res = cvt_r(|| unsafe { + libc::syscall( + libc::SYS_accept4, + self.fd as libc::c_long, + &mut storage as *mut _ as libc::c_long, + &mut len, + libc::SOCK_CLOEXEC as libc::c_long, + ) as libc::c_int + }); + match res { + Ok(fd) => socket = Some(Socket { fd: fd }), + Err(ref e) if e.raw_os_error() == Some(libc::ENOSYS) => {} + Err(e) => return Err(e), } } @@ -479,10 +471,9 @@ impl Socket { pub fn read_timeout(&self) -> io::Result<Option<Duration>> { unsafe { - Ok(timeval2dur(self.getsockopt( - libc::SOL_SOCKET, - libc::SO_RCVTIMEO, - )?)) + Ok(timeval2dur( + self.getsockopt(libc::SOL_SOCKET, libc::SO_RCVTIMEO)?, + )) } } @@ -492,10 +483,9 @@ impl Socket { pub fn write_timeout(&self) -> io::Result<Option<Duration>> { unsafe { - Ok(timeval2dur(self.getsockopt( - libc::SOL_SOCKET, - libc::SO_SNDTIMEO, - )?)) + Ok(timeval2dur( + self.getsockopt(libc::SOL_SOCKET, libc::SO_SNDTIMEO)?, + )) } } @@ -659,10 +649,9 @@ impl Socket { pub fn linger(&self) -> io::Result<Option<Duration>> { unsafe { - Ok(linger2dur(self.getsockopt( - libc::SOL_SOCKET, - libc::SO_LINGER, - )?)) + Ok(linger2dur( + self.getsockopt(libc::SOL_SOCKET, libc::SO_LINGER)?, + )) } } @@ -729,17 +718,13 @@ impl Socket { )?; if let Some(dur) = keepalive { // TODO: checked cast here - self.setsockopt( - libc::IPPROTO_TCP, - KEEPALIVE_OPTION, - dur.as_secs() as c_int, - )?; + self.setsockopt(libc::IPPROTO_TCP, KEEPALIVE_OPTION, dur.as_secs() as c_int)?; } Ok(()) } } - #[cfg(all(unix, feature = "reuseport"))] + #[cfg(all(unix, not(target_os = "solaris"), feature = "reuseport"))] pub fn reuse_port(&self) -> io::Result<bool> { unsafe { let raw: c_int = self.getsockopt(libc::SOL_SOCKET, libc::SO_REUSEPORT)?; @@ -747,7 +732,7 @@ impl Socket { } } - #[cfg(all(unix, feature = "reuseport"))] + #[cfg(all(unix, not(target_os = "solaris"), feature = "reuseport"))] pub fn set_reuse_port(&self, reuse: bool) -> io::Result<()> { unsafe { self.setsockopt(libc::SOL_SOCKET, libc::SO_REUSEPORT, reuse as c_int) } } @@ -857,21 +842,21 @@ impl FromRawFd for Socket { } } -impl AsRawFd for ::Socket { +impl AsRawFd for crate::Socket { fn as_raw_fd(&self) -> c_int { self.inner.as_raw_fd() } } -impl IntoRawFd for ::Socket { +impl IntoRawFd for crate::Socket { fn into_raw_fd(self) -> c_int { self.inner.into_raw_fd() } } -impl FromRawFd for ::Socket { - unsafe fn from_raw_fd(fd: c_int) -> ::Socket { - ::Socket { +impl FromRawFd for crate::Socket { + unsafe fn from_raw_fd(fd: c_int) -> crate::Socket { + crate::Socket { inner: Socket::from_raw_fd(fd), } } @@ -1055,14 +1040,16 @@ fn timeval2dur(raw: libc::timeval) -> Option<Duration> { fn to_s_addr(addr: &Ipv4Addr) -> libc::in_addr_t { let octets = addr.octets(); - ::hton( - ((octets[0] as libc::in_addr_t) << 24) | ((octets[1] as libc::in_addr_t) << 16) - | ((octets[2] as libc::in_addr_t) << 8) | ((octets[3] as libc::in_addr_t) << 0), + crate::hton( + ((octets[0] as libc::in_addr_t) << 24) + | ((octets[1] as libc::in_addr_t) << 16) + | ((octets[2] as libc::in_addr_t) << 8) + | ((octets[3] as libc::in_addr_t) << 0), ) } fn from_s_addr(in_addr: libc::in_addr_t) -> Ipv4Addr { - let h_addr = ::ntoh(in_addr); + let h_addr = crate::ntoh(in_addr); let a: u8 = (h_addr >> 24) as u8; let b: u8 = (h_addr >> 16) as u8; diff --git a/vendor/socket2/src/sys/unix/weak.rs b/vendor/socket2/src/sys/unix/weak.rs deleted file mode 100644 index 6767a0f9c7..0000000000 --- a/vendor/socket2/src/sys/unix/weak.rs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::marker; -use std::mem; -use std::sync::atomic::{AtomicUsize, Ordering}; - -use libc; - -macro_rules! weak { - (fn $name:ident($($t:ty),*) -> $ret:ty) => ( - #[allow(bad_style)] - static $name: ::sys::weak::Weak<unsafe extern fn($($t),*) -> $ret> = - ::sys::weak::Weak { - name: concat!(stringify!($name), "\0"), - addr: ::std::sync::atomic::ATOMIC_USIZE_INIT, - _marker: ::std::marker::PhantomData, - }; - ) -} - -pub struct Weak<F> { - pub name: &'static str, - pub addr: AtomicUsize, - pub _marker: marker::PhantomData<F>, -} - -impl<F> Weak<F> { - pub fn get(&self) -> Option<&F> { - assert_eq!(mem::size_of::<F>(), mem::size_of::<usize>()); - unsafe { - if self.addr.load(Ordering::SeqCst) == 0 { - let ptr = match fetch(self.name) { - 1 => 1, - n => n, - }; - self.addr.store(ptr, Ordering::SeqCst); - } - if self.addr.load(Ordering::SeqCst) == 0 { - None - } else { - mem::transmute::<&AtomicUsize, Option<&F>>(&self.addr) - } - } - } -} - -unsafe fn fetch(name: &str) -> usize { - let name = name.as_bytes(); - assert_eq!(name[name.len() - 1], 0); - libc::dlsym(libc::RTLD_DEFAULT, name.as_ptr() as *const _) as usize -} diff --git a/vendor/socket2/src/sys/windows.rs b/vendor/socket2/src/sys/windows.rs index e6c8f114c1..d2c5a882e7 100644 --- a/vendor/socket2/src/sys/windows.rs +++ b/vendor/socket2/src/sys/windows.rs @@ -10,8 +10,8 @@ use std::cmp; use std::fmt; -use std::io::{Read, Write}; use std::io; +use std::io::{Read, Write}; use std::mem; use std::net::Shutdown; use std::net::{self, Ipv4Addr, Ipv6Addr}; @@ -21,19 +21,19 @@ use std::sync::{Once, ONCE_INIT}; use std::time::Duration; use winapi::ctypes::{c_char, c_int, c_long, c_ulong}; -use winapi::shared::inaddr::*; use winapi::shared::in6addr::*; +use winapi::shared::inaddr::*; use winapi::shared::minwindef::DWORD; use winapi::shared::ntdef::{HANDLE, ULONG}; -use winapi::shared::ws2def::*; use winapi::shared::ws2def; +use winapi::shared::ws2def::*; use winapi::shared::ws2ipdef::*; use winapi::um::handleapi::SetHandleInformation; use winapi::um::processthreadsapi::GetCurrentProcessId; use winapi::um::winbase::INFINITE; use winapi::um::winsock2 as sock; -use SockAddr; +use crate::SockAddr; const HANDLE_FLAG_INHERIT: DWORD = 0x00000001; const MSG_PEEK: c_int = 0x2; @@ -445,13 +445,13 @@ impl Socket { pub fn nodelay(&self) -> io::Result<bool> { unsafe { - let raw: c_int = self.getsockopt(IPPROTO_TCP, TCP_NODELAY)?; + let raw: c_char = self.getsockopt(IPPROTO_TCP, TCP_NODELAY)?; Ok(raw != 0) } } pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> { - unsafe { self.setsockopt(IPPROTO_TCP, TCP_NODELAY, nodelay as c_int) } + unsafe { self.setsockopt(IPPROTO_TCP, TCP_NODELAY, nodelay as c_char) } } pub fn broadcast(&self) -> io::Result<bool> { @@ -798,21 +798,21 @@ impl FromRawSocket for Socket { } } -impl AsRawSocket for ::Socket { +impl AsRawSocket for crate::Socket { fn as_raw_socket(&self) -> RawSocket { self.inner.as_raw_socket() } } -impl IntoRawSocket for ::Socket { +impl IntoRawSocket for crate::Socket { fn into_raw_socket(self) -> RawSocket { self.inner.into_raw_socket() } } -impl FromRawSocket for ::Socket { - unsafe fn from_raw_socket(socket: RawSocket) -> ::Socket { - ::Socket { +impl FromRawSocket for crate::Socket { + unsafe fn from_raw_socket(socket: RawSocket) -> crate::Socket { + crate::Socket { inner: Socket::from_raw_socket(socket), } } @@ -876,7 +876,8 @@ fn dur2ms(dur: Option<Duration>) -> io::Result<DWORD> { // * Nanosecond precision is rounded up // * Greater than u32::MAX milliseconds (50 days) is rounded up to // INFINITE (never time out). - let ms = dur.as_secs() + let ms = dur + .as_secs() .checked_mul(1000) .and_then(|ms| ms.checked_add((dur.subsec_nanos() as u64) / 1_000_000)) .and_then(|ms| { @@ -918,8 +919,10 @@ fn ms2dur(raw: DWORD) -> Option<Duration> { fn to_s_addr(addr: &Ipv4Addr) -> in_addr_S_un { let octets = addr.octets(); - let res = ::hton( - ((octets[0] as ULONG) << 24) | ((octets[1] as ULONG) << 16) | ((octets[2] as ULONG) << 8) + let res = crate::hton( + ((octets[0] as ULONG) << 24) + | ((octets[1] as ULONG) << 16) + | ((octets[2] as ULONG) << 8) | ((octets[3] as ULONG) << 0), ); let mut new_addr: in_addr_S_un = unsafe { mem::zeroed() }; @@ -928,7 +931,7 @@ fn to_s_addr(addr: &Ipv4Addr) -> in_addr_S_un { } fn from_s_addr(in_addr: in_addr_S_un) -> Ipv4Addr { - let h_addr = ::ntoh(unsafe { *in_addr.S_addr() }); + let h_addr = crate::ntoh(unsafe { *in_addr.S_addr() }); let a: u8 = (h_addr >> 24) as u8; let b: u8 = (h_addr >> 16) as u8; diff --git a/vendor/ucd-parse/.cargo-checksum.json b/vendor/ucd-parse/.cargo-checksum.json new file mode 100644 index 0000000000..f69820dd1c --- /dev/null +++ b/vendor/ucd-parse/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"d4cf6798f99cb3f2b8f308bb48f1e60926ae3a2b73a8a9c1e4acc5070c4732bd","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"5af803e482641f01332bde35cc8137211714b6f100122ec548c9712a09aead55","src/age.rs":"f2fe700e443629e430e87f069b48c17fa0d3dd2dd4e6b7db77704c80c030cd6c","src/case_folding.rs":"7a4b537108b24c23c1b39e0f12ba9e74e716123a8b72ab1ab0d57eb6815f169b","src/common.rs":"3ac53e5fa205df9ecb28c055a9eca6975e4de0a4854452211b473b354e5d3676","src/core_properties.rs":"86dc18f4198e1c56507d8934bee2d06d537ec1c5574864198b29420df3f16638","src/emoji_properties.rs":"5e3bc0d271311adeb8e57d5b2518c245c6feb4da813bc0b696f7cdc2982b1510","src/error.rs":"d7b2862cebb649ba6c1c4f25d38e71769a138e808627cff435f8cacfc8e9084c","src/grapheme_cluster_break.rs":"6ed1ee40d14c868acde8a6fd45c6c500523e3ae94ca44d72ff8136c4bbb463a6","src/jamo_short_name.rs":"7811ff882e27226710539188d7295dffdd7f9b56b963cc5d1e4bf253e588b4b1","src/lib.rs":"74067d20f10d6305943aa14880a543a699ddc91149baa9be411bf22c9feaa080","src/line_break.rs":"c47e67e90702fb6f7ff734d0995db777b2e5356865e7e5140761524902215110","src/name_aliases.rs":"28065c2d4a0157666428500f836c79babac2d5dd73b345863417b13b83f25b49","src/prop_list.rs":"103933aa434c91525245633f9f1b36057bc3f28fda11eec1acf420bb4ee7ce00","src/property_aliases.rs":"f0ed60d1db7c823afbcd9732c5ab3c16b08188e762e15c0517b3e4ef0f92f405","src/property_value_aliases.rs":"e7f08f973c59e65f90ae09851427c3bb6a6af92f9fcbca2dae8faa7b243fa268","src/script_extensions.rs":"1547f311f7879f363474c56060cb73422ef7ef0a4f6dd0b249c4fa3bc27f6fae","src/scripts.rs":"22fbe25a5d75b13724bc77b1c516833c7a81bb87c0360fb50eecbeb501d39995","src/sentence_break.rs":"5dbd7cdb528835903456c8d126284ad737291cb13150fcf2c7e0060d3cfd48cb","src/special_casing.rs":"a5421b831584a966081ff5448ccce57afaa55069e1a00818d7fcf5e2fa517fdd","src/unicode_data.rs":"91add0d47393e9c0c185625a3effa66326abf294955fc61b34220b8dbe9221b6","src/word_break.rs":"5a9803949598fa090c0dd05bb332470d8540ea00620e0f172f555961c6d9d414"},"package":"ca6b52bf4da6512f0f07785a04769222e50d29639e7ecd016b7806fd2de306b4"} \ No newline at end of file diff --git a/vendor/ucd-parse/Cargo.toml b/vendor/ucd-parse/Cargo.toml new file mode 100644 index 0000000000..0a7a80b4f7 --- /dev/null +++ b/vendor/ucd-parse/Cargo.toml @@ -0,0 +1,28 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +name = "ucd-parse" +version = "0.1.4" +authors = ["Andrew Gallant <jamslam@gmail.com>"] +description = "A library for parsing data files in the Unicode character database.\n" +homepage = "https://github.com/BurntSushi/ucd-generate" +documentation = "https://docs.rs/ucd-parse" +readme = "README.md" +keywords = ["unicode", "database", "character", "property"] +license = "MIT/Apache-2.0" +repository = "https://github.com/BurntSushi/ucd-generate" +[dependencies.lazy_static] +version = "1" + +[dependencies.regex] +version = "1" diff --git a/vendor/ordermap/LICENSE-APACHE b/vendor/ucd-parse/LICENSE-APACHE similarity index 100% rename from vendor/ordermap/LICENSE-APACHE rename to vendor/ucd-parse/LICENSE-APACHE diff --git a/vendor/ucd-parse/LICENSE-MIT b/vendor/ucd-parse/LICENSE-MIT new file mode 100644 index 0000000000..3b0a5dc09c --- /dev/null +++ b/vendor/ucd-parse/LICENSE-MIT @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Andrew Gallant + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/ucd-parse/README.md b/vendor/ucd-parse/README.md new file mode 100644 index 0000000000..dc3f78dc6e --- /dev/null +++ b/vendor/ucd-parse/README.md @@ -0,0 +1,22 @@ +ucd-parse +========= +A library for parsing Unicode Character Database (UCD) files into structured +data. + +[![Linux build status](https://api.travis-ci.org/BurntSushi/ucd-generate.png)](https://travis-ci.org/BurntSushi/ucd-generate) +[![](http://meritbadge.herokuapp.com/ucd-generate)](https://crates.io/crates/ucd-parse) + + +### Documentation + +https://docs.rs/ucd-parse + + +### License + +This project is licensed under either of + * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or + http://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or + http://opensource.org/licenses/MIT) +at your option. diff --git a/vendor/ucd-parse/src/age.rs b/vendor/ucd-parse/src/age.rs new file mode 100644 index 0000000000..491192d3c2 --- /dev/null +++ b/vendor/ucd-parse/src/age.rs @@ -0,0 +1,63 @@ + +use std::path::Path; +use std::str::FromStr; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoints, CodepointIter, + parse_codepoint_association, +}; +use error::Error; + +/// A single row in the `DerivedAge.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct Age { + /// The codepoint or codepoint range for this entry. + pub codepoints: Codepoints, + /// The age assigned to the codepoints in this entry. + pub age: String, +} + +impl UcdFile for Age { + fn relative_file_path() -> &'static Path { + Path::new("DerivedAge.txt") + } +} + +impl UcdFileByCodepoint for Age { + fn codepoints(&self) -> CodepointIter { + self.codepoints.into_iter() + } +} + +impl FromStr for Age { + type Err = Error; + + fn from_str(line: &str) -> Result<Age, Error> { + let (codepoints, script) = parse_codepoint_association(line)?; + Ok(Age { + codepoints: codepoints, + age: script.to_string(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::Age; + + #[test] + fn parse_single() { + let line = "2BD2 ; 10.0 # GROUP MARK\n"; + let row: Age = line.parse().unwrap(); + assert_eq!(row.codepoints, 0x2BD2); + assert_eq!(row.age, "10.0"); + } + + #[test] + fn parse_range() { + let line = "11D0B..11D36 ; 10.0 # [44] MASARAM GONDI LETTER AU..MASARAM GONDI VOWEL SIGN VOCALIC R\n"; + let row: Age = line.parse().unwrap(); + assert_eq!(row.codepoints, (0x11D0B, 0x11D36)); + assert_eq!(row.age, "10.0"); + } +} diff --git a/vendor/ucd-parse/src/case_folding.rs b/vendor/ucd-parse/src/case_folding.rs new file mode 100644 index 0000000000..0b6a4358e5 --- /dev/null +++ b/vendor/ucd-parse/src/case_folding.rs @@ -0,0 +1,155 @@ +use std::path::Path; +use std::str::FromStr; + +use regex::Regex; + +use common::{UcdFile, UcdFileByCodepoint, Codepoint, CodepointIter}; +use error::Error; + +/// A single row in the `CaseFolding.txt` file. +/// +/// The contents of `CaseFolding.txt` are a convenience derived from both +/// `UnicodeData.txt` and `SpecialCasing.txt`. +/// +/// Note that a single codepoint may be mapped multiple times. In particular, +/// a single codepoint might have distinct `CaseStatus::Simple` and +/// `CaseStatus::Full` mappings. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct CaseFold { + /// The codepoint that is being mapped. + pub codepoint: Codepoint, + /// The case status of this mapping. + pub status: CaseStatus, + /// The actual case mapping, which is more than one codepoint if this is + /// a "full" mapping. + pub mapping: Vec<Codepoint>, +} + +impl UcdFile for CaseFold { + fn relative_file_path() -> &'static Path { + Path::new("CaseFolding.txt") + } +} + +impl UcdFileByCodepoint for CaseFold { + fn codepoints(&self) -> CodepointIter { + self.codepoint.into_iter() + } +} + +impl FromStr for CaseFold { + type Err = Error; + + fn from_str(line: &str) -> Result<CaseFold, Error> { + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"(?x) + ^ + \s*(?P<codepoint>[^\s;]+)\s*; + \s*(?P<status>[^\s;]+)\s*; + \s*(?P<mapping>[^;]+)\s*; + " + ).unwrap(); + }; + + let caps = match PARTS.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid CaseFolding line: '{}'", line), + }; + let mut mapping = vec![]; + for cp in caps["mapping"].split_whitespace() { + mapping.push(cp.parse()?); + } + Ok(CaseFold { + codepoint: caps["codepoint"].parse()?, + status: caps["status"].parse()?, + mapping: mapping, + }) + } +} + +/// The status of a particular case mapping. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CaseStatus { + /// Case mappings shared by both "simple" and "full" mappings. + Common, + /// A case mapping that changes the number of codepoints. + Full, + /// A case mapping that doesn't change the number of codepoints, when it + /// differs from `Full`. + Simple, + /// Special cases (currently only for Turkic mappings) that are typically + /// excluded by default. Special cases don't change the number of + /// codepoints, but may changed the encoding (e.g., UTF-8) length in bytes. + Special, +} + +impl Default for CaseStatus { + fn default() -> CaseStatus { + CaseStatus::Common + } +} + +impl CaseStatus { + /// Returns true if and only if this status indicates a case mapping that + /// won't change the number of codepoints. + pub fn is_fixed(&self) -> bool { + *self != CaseStatus::Full + } +} + +impl FromStr for CaseStatus { + type Err = Error; + + fn from_str(s: &str) -> Result<CaseStatus, Error> { + match s { + "C" => Ok(CaseStatus::Common), + "F" => Ok(CaseStatus::Full), + "S" => Ok(CaseStatus::Simple), + "T" => Ok(CaseStatus::Special), + _ => err!("unrecognized case status: '{}' \ + (must be one of C, F, S or T)", s), + } + } +} + +#[cfg(test)] +mod tests { + use super::{CaseFold, CaseStatus}; + + #[test] + fn parse_common() { + let line = "0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE\n"; + let row: CaseFold = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x0150); + assert_eq!(row.status, CaseStatus::Common); + assert_eq!(row.mapping, vec![0x0151]); + } + + #[test] + fn parse_full() { + let line = "03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS\n"; + let row: CaseFold = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x03B0); + assert_eq!(row.status, CaseStatus::Full); + assert_eq!(row.mapping, vec![0x03C5, 0x0308, 0x0301]); + } + + #[test] + fn parse_simple() { + let line = "1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI\n"; + let row: CaseFold = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x1F8F); + assert_eq!(row.status, CaseStatus::Simple); + assert_eq!(row.mapping, vec![0x1F87]); + } + + #[test] + fn parse_special() { + let line = "0049; T; 0131; # LATIN CAPITAL LETTER I\n"; + let row: CaseFold = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x0049); + assert_eq!(row.status, CaseStatus::Special); + assert_eq!(row.mapping, vec![0x0131]); + } +} diff --git a/vendor/ucd-parse/src/common.rs b/vendor/ucd-parse/src/common.rs new file mode 100644 index 0000000000..1aaf2c4e0f --- /dev/null +++ b/vendor/ucd-parse/src/common.rs @@ -0,0 +1,510 @@ +use std::char; +use std::collections::BTreeMap; +use std::fmt; +use std::fs::File; +use std::io::{self, BufRead}; +use std::marker::PhantomData; +use std::path::{Path, PathBuf}; +use std::str::FromStr; + +use regex::Regex; + +use error::{Error, ErrorKind}; + +/// Parse a particular file in the UCD into a sequence of rows. +/// +/// The given directory should be the directory to the UCD. +pub fn parse<P, D>( + ucd_dir: P, +) -> Result<Vec<D>, Error> +where P: AsRef<Path>, D: UcdFile +{ + let mut xs = vec![]; + for result in D::from_dir(ucd_dir)? { + let x = result?; + xs.push(x); + } + Ok(xs) +} + +/// Parse a particular file in the UCD into a map from codepoint to the record. +/// +/// The given directory should be the directory to the UCD. +pub fn parse_by_codepoint<P, D>( + ucd_dir: P, +) -> Result<BTreeMap<Codepoint, D>, Error> +where P: AsRef<Path>, D: UcdFileByCodepoint +{ + let mut map = BTreeMap::new(); + for result in D::from_dir(ucd_dir)? { + let x = result?; + for cp in x.codepoints() { + map.insert(cp, x.clone()); + } + } + Ok(map) +} + +/// Parse a particular file in the UCD into a map from codepoint to all +/// records associated with that codepoint. +/// +/// This is useful for files that have multiple records for each codepoint. +/// For example, the `NameAliases.txt` file lists multiple aliases for some +/// codepoints. +/// +/// The given directory should be the directory to the UCD. +pub fn parse_many_by_codepoint<P, D>( + ucd_dir: P, +) -> Result<BTreeMap<Codepoint, Vec<D>>, Error> +where P: AsRef<Path>, D: UcdFileByCodepoint +{ + let mut map = BTreeMap::new(); + for result in D::from_dir(ucd_dir)? { + let x = result?; + for cp in x.codepoints() { + map.entry(cp).or_insert(vec![]).push(x.clone()); + } + } + Ok(map) +} + +/// A helper function for parsing a common record format that associates one +/// or more codepoints with a string value. +pub fn parse_codepoint_association<'a>( + line: &'a str, +) -> Result<(Codepoints, &'a str), Error> +{ + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"(?x) + ^ + \s*(?P<codepoints>[^\s;]+)\s*; + \s*(?P<property>[^;\x23]+)\s* + " + ).unwrap(); + }; + + let caps = match PARTS.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid PropList line: '{}'", line), + }; + let property = match caps.name("property") { + Some(property) => property.as_str().trim(), + None => return err!( + "could not find property name in PropList line: '{}'", line), + }; + Ok((caps["codepoints"].parse()?, property)) +} + +/// A helper function for parsing a sequence of space separated codepoints. +/// The sequence is permitted to be empty. +pub fn parse_codepoint_sequence(s: &str) -> Result<Vec<Codepoint>, Error> { + let mut cps = vec![]; + for cp in s.trim().split_whitespace() { + cps.push(cp.parse()?); + } + Ok(cps) +} + +/// A helper function for parsing a single test for the various break +/// algorithms. +/// +/// Upon success, this returns the UTF-8 encoded groups of codepoints along +/// with the comment associated with the test. The comment is a human readable +/// description of the test that may prove useful for debugging. +pub fn parse_break_test(line: &str) -> Result<(Vec<String>, String), Error> { + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"(?x) + ^ + (?:÷|×) + (?P<groups>(?:\s[0-9A-Fa-f]{4,5}\s(?:÷|×))+) + \s+ + \#(?P<comment>.+) + $ + " + ).unwrap(); + + static ref GROUP: Regex = Regex::new( + r"(?x) + (?P<codepoint>[0-9A-Fa-f]{4,5})\s(?P<kind>÷|×) + " + ).unwrap(); + } + + let caps = match PARTS.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid break test line: '{}'", line), + }; + let comment = caps["comment"].trim().to_string(); + + let mut groups = vec![]; + let mut cur = String::new(); + for cap in GROUP.captures_iter(&caps["groups"]) { + let cp: Codepoint = cap["codepoint"].parse()?; + let ch = match cp.scalar() { + Some(ch) => ch, + None => return err!( + "invalid codepoint '{:X}' in line: '{}'", cp.value(), line + ), + }; + cur.push(ch); + if &cap["kind"] == "÷" { + groups.push(cur); + cur = String::new(); + } + } + Ok((groups, comment)) +} + +/// Describes a single UCD file. +pub trait UcdFile: + Clone + fmt::Debug + Default + Eq + FromStr<Err=Error> + PartialEq +{ + /// The file path corresponding to this file, relative to the UCD + /// directory. + fn relative_file_path() -> &'static Path; + + /// The full file path corresponding to this file given the UCD directory + /// path. + fn file_path<P: AsRef<Path>>(ucd_dir: P) -> PathBuf { + ucd_dir.as_ref().join(Self::relative_file_path()) + } + + /// Create an iterator over each record in this UCD file. + /// + /// The parameter should correspond to the directory containing the UCD. + fn from_dir<P: AsRef<Path>>( + ucd_dir: P, + ) -> Result<UcdLineParser<File, Self>, Error> { + UcdLineParser::from_path(Self::file_path(ucd_dir)) + } +} + +/// Describes a single UCD file where every record in the file is associated +/// with one or more codepoints. +pub trait UcdFileByCodepoint: UcdFile { + /// Returns the codepoints associated with this record. + fn codepoints(&self) -> CodepointIter; +} + +/// A line oriented parser for a particular UCD file. +/// +/// Callers can build a line parser via the +/// [`UcdFile::from_dir`](trait.UcdFile.html) method. +/// +/// The `R` type parameter refers to the underlying `io::Read` implementation +/// from which the UCD data is read. +/// +/// The `D` type parameter refers to the type of the record parsed out of each +/// line. +#[derive(Debug)] +pub struct UcdLineParser<R, D> { + path: Option<PathBuf>, + rdr: io::BufReader<R>, + line: String, + line_number: u64, + _data: PhantomData<D>, +} + +impl<D> UcdLineParser<File, D> { + /// Create a new parser from the given file path. + pub(crate) fn from_path<P: AsRef<Path>>( + path: P, + ) -> Result<UcdLineParser<File, D>, Error> { + let path = path.as_ref(); + let file = File::open(path).map_err(|e| Error { + kind: ErrorKind::Io(e), + line: None, + path: Some(path.to_path_buf()), + })?; + Ok(UcdLineParser::new(Some(path.to_path_buf()), file)) + } +} + +impl<R: io::Read, D> UcdLineParser<R, D> { + /// Create a new parser that parses the reader given. + /// + /// The type of data parsed is determined when the `parse_next` function + /// is called by virtue of the type requested. + /// + /// Note that the reader is buffered internally, so the caller does not + /// need to provide their own buffering. + pub(crate) fn new(path: Option<PathBuf>, rdr: R) -> UcdLineParser<R, D> { + UcdLineParser { + path: path, + rdr: io::BufReader::new(rdr), + line: String::new(), + line_number: 0, + _data: PhantomData, + } + } +} + +impl<R: io::Read, D: FromStr<Err=Error>> Iterator for UcdLineParser<R, D> { + type Item = Result<D, Error>; + + fn next(&mut self) -> Option<Result<D, Error>> { + loop { + self.line_number += 1; + self.line.clear(); + let n = match self.rdr.read_line(&mut self.line) { + Err(err) => return Some(Err(Error { + kind: ErrorKind::Io(err), + line: None, + path: self.path.clone(), + })), + Ok(n) => n, + }; + if n == 0 { + return None; + } + if !self.line.starts_with('#') && !self.line.trim().is_empty() { + break; + } + } + let line_number = self.line_number; + Some(self.line.parse().map_err(|mut err: Error| { + err.line = Some(line_number); + err + })) + } +} + +/// A representation of either a single codepoint or a range of codepoints. +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)] +pub enum Codepoints { + /// A single codepoint. + Single(Codepoint), + /// A range of codepoints. + Range(CodepointRange), +} + +impl Default for Codepoints { + fn default() -> Codepoints { + Codepoints::Single(Codepoint::default()) + } +} + +impl IntoIterator for Codepoints { + type IntoIter = CodepointIter; + type Item = Codepoint; + + fn into_iter(self) -> CodepointIter { + match self { + Codepoints::Single(x) => x.into_iter(), + Codepoints::Range(x) => x.into_iter(), + } + } +} + +impl FromStr for Codepoints { + type Err = Error; + + fn from_str(s: &str) -> Result<Codepoints, Error> { + if s.contains("..") { + CodepointRange::from_str(s).map(Codepoints::Range) + } else { + Codepoint::from_str(s).map(Codepoints::Single) + } + } +} + +impl fmt::Display for Codepoints { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + Codepoints::Single(ref x) => x.fmt(f), + Codepoints::Range(ref x) => x.fmt(f), + } + } +} + +impl PartialEq<u32> for Codepoints { + fn eq(&self, other: &u32) -> bool { + match *self { + Codepoints::Single(ref x) => x == other, + Codepoints::Range(ref x) => x == &(*other, *other), + } + } +} + +impl PartialEq<Codepoint> for Codepoints { + fn eq(&self, other: &Codepoint) -> bool { + match *self { + Codepoints::Single(ref x) => x == other, + Codepoints::Range(ref x) => x == &(*other, *other), + } + } +} + +impl PartialEq<(u32, u32)> for Codepoints { + fn eq(&self, other: &(u32, u32)) -> bool { + match *self { + Codepoints::Single(ref x) => &(x.value(), x.value()) == other, + Codepoints::Range(ref x) => x == other, + } + } +} + +impl PartialEq<(Codepoint, Codepoint)> for Codepoints { + fn eq(&self, other: &(Codepoint, Codepoint)) -> bool { + match *self { + Codepoints::Single(ref x) => &(*x, *x) == other, + Codepoints::Range(ref x) => x == other, + } + } +} + +/// A range of Unicode codepoints. The range is inclusive; both ends of the +/// range are guaranteed to be valid codepoints. +#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq, PartialOrd, Ord)] +pub struct CodepointRange { + /// The start of the codepoint range. + pub start: Codepoint, + /// The end of the codepoint range. + pub end: Codepoint, +} + +impl IntoIterator for CodepointRange { + type IntoIter = CodepointIter; + type Item = Codepoint; + + fn into_iter(self) -> CodepointIter { + CodepointIter { next: self.start.value(), range: self } + } +} + +impl FromStr for CodepointRange { + type Err = Error; + + fn from_str(s: &str) -> Result<CodepointRange, Error> { + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"^(?P<start>[A-Z0-9]+)\.\.(?P<end>[A-Z0-9]+)$" + ).unwrap(); + } + let caps = match PARTS.captures(s) { + Some(caps) => caps, + None => return err!("invalid codepoint range: '{}'", s), + }; + let start = caps["start"].parse().or_else(|err| { + err!("failed to parse '{}' as a codepoint range: {}", s, err) + })?; + let end = caps["end"].parse().or_else(|err| { + err!("failed to parse '{}' as a codepoint range: {}", s, err) + })?; + Ok(CodepointRange { start: start, end: end }) + } +} + +impl fmt::Display for CodepointRange { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}..{}", self.start, self.end) + } +} + +impl PartialEq<(u32, u32)> for CodepointRange { + fn eq(&self, other: &(u32, u32)) -> bool { + &(self.start.value(), self.end.value()) == other + } +} + +impl PartialEq<(Codepoint, Codepoint)> for CodepointRange { + fn eq(&self, other: &(Codepoint, Codepoint)) -> bool { + &(self.start, self.end) == other + } +} + +/// A single Unicode codepoint. +/// +/// This type's string representation is a hexadecimal number. It is guaranteed +/// to be in the range `[0, 10FFFF]`. +/// +/// Note that unlike Rust's `char` type, this may be a surrogate codepoint. +#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq, PartialOrd, Ord)] +pub struct Codepoint(u32); + +impl Codepoint { + /// Create a new codepoint from a `u32`. + /// + /// If the given number is not a valid codepoint, then this returns an + /// error. + pub fn from_u32(n: u32) -> Result<Codepoint, Error> { + if n > 0x10FFFF { + err!("{:x} is not a valid Unicode codepoint", n) + } else { + Ok(Codepoint(n)) + } + } + + /// Return the underlying `u32` codepoint value. + pub fn value(self) -> u32 { self.0 } + + /// Attempt to convert this codepoint to a Unicode scalar value. + /// + /// If this is a surrogate codepoint, then this returns `None`. + pub fn scalar(self) -> Option<char> { char::from_u32(self.0) } +} + +impl IntoIterator for Codepoint { + type IntoIter = CodepointIter; + type Item = Codepoint; + + fn into_iter(self) -> CodepointIter { + let range = CodepointRange { start: self, end: self }; + CodepointIter { next: self.value(), range: range } + } +} + +impl FromStr for Codepoint { + type Err = Error; + + fn from_str(s: &str) -> Result<Codepoint, Error> { + match u32::from_str_radix(s, 16) { + Ok(n) => Codepoint::from_u32(n), + Err(err) => { + return err!( + "failed to parse '{}' as a hexadecimal codepoint: {}", + s, err); + } + } + } +} + +impl fmt::Display for Codepoint { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{:04X}", self.0) + } +} + +impl PartialEq<u32> for Codepoint { + fn eq(&self, other: &u32) -> bool { + self.0 == *other + } +} + +impl PartialEq<Codepoint> for u32 { + fn eq(&self, other: &Codepoint) -> bool { + *self == other.0 + } +} + +/// An iterator over a range of Unicode codepoints. +#[derive(Debug)] +pub struct CodepointIter { + next: u32, + range: CodepointRange, +} + +impl Iterator for CodepointIter { + type Item = Codepoint; + + fn next(&mut self) -> Option<Codepoint> { + if self.next > self.range.end.value() { + return None; + } + let current = self.next; + self.next += 1; + Some(Codepoint::from_u32(current).unwrap()) + } +} diff --git a/vendor/ucd-parse/src/core_properties.rs b/vendor/ucd-parse/src/core_properties.rs new file mode 100644 index 0000000000..35582edc67 --- /dev/null +++ b/vendor/ucd-parse/src/core_properties.rs @@ -0,0 +1,62 @@ +use std::path::Path; +use std::str::FromStr; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoints, CodepointIter, + parse_codepoint_association, +}; +use error::Error; + +/// A single row in the `DerivedCoreProperties.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct CoreProperty { + /// The codepoint or codepoint range for this entry. + pub codepoints: Codepoints, + /// The property name assigned to the codepoints in this entry. + pub property: String, +} + +impl UcdFile for CoreProperty { + fn relative_file_path() -> &'static Path { + Path::new("DerivedCoreProperties.txt") + } +} + +impl UcdFileByCodepoint for CoreProperty { + fn codepoints(&self) -> CodepointIter { + self.codepoints.into_iter() + } +} + +impl FromStr for CoreProperty { + type Err = Error; + + fn from_str(line: &str) -> Result<CoreProperty, Error> { + let (codepoints, property) = parse_codepoint_association(line)?; + Ok(CoreProperty { + codepoints: codepoints, + property: property.to_string(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::CoreProperty; + + #[test] + fn parse_single() { + let line = "1163D ; Case_Ignorable # Mn MODI SIGN ANUSVARA\n"; + let row: CoreProperty = line.parse().unwrap(); + assert_eq!(row.codepoints, 0x1163D); + assert_eq!(row.property, "Case_Ignorable"); + } + + #[test] + fn parse_range() { + let line = "11133..11134 ; Grapheme_Link # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA\n"; + let row: CoreProperty = line.parse().unwrap(); + assert_eq!(row.codepoints, (0x11133, 0x11134)); + assert_eq!(row.property, "Grapheme_Link"); + } +} diff --git a/vendor/ucd-parse/src/emoji_properties.rs b/vendor/ucd-parse/src/emoji_properties.rs new file mode 100644 index 0000000000..2f9bec35ba --- /dev/null +++ b/vendor/ucd-parse/src/emoji_properties.rs @@ -0,0 +1,69 @@ +use std::path::Path; +use std::str::FromStr; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoints, CodepointIter, + parse_codepoint_association, +}; +use error::Error; + +/// A single row in the `emoji-data.txt` file. +/// +/// The `emoji-data.txt` file is the source of truth on several Emoji-related +/// Unicode properties. +/// +/// Note that `emoji-data.txt` is not formally part of the Unicode Character +/// Database. You can download the Emoji data files separately here: +/// https://unicode.org/Public/emoji/ +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct EmojiProperty { + /// The codepoint or codepoint range for this entry. + pub codepoints: Codepoints, + /// The property name assigned to the codepoints in this entry. + pub property: String, +} + +impl UcdFile for EmojiProperty { + fn relative_file_path() -> &'static Path { + Path::new("emoji-data.txt") + } +} + +impl UcdFileByCodepoint for EmojiProperty { + fn codepoints(&self) -> CodepointIter { + self.codepoints.into_iter() + } +} + +impl FromStr for EmojiProperty { + type Err = Error; + + fn from_str(line: &str) -> Result<EmojiProperty, Error> { + let (codepoints, property) = parse_codepoint_association(line)?; + Ok(EmojiProperty { + codepoints: codepoints, + property: property.to_string(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::EmojiProperty; + + #[test] + fn parse_single() { + let line = "24C2 ; Emoji # 1.1 [1] (Ⓜ️) circled M\n"; + let row: EmojiProperty = line.parse().unwrap(); + assert_eq!(row.codepoints, 0x24C2); + assert_eq!(row.property, "Emoji"); + } + + #[test] + fn parse_range() { + let line = "1FA6E..1FFFD ; Extended_Pictographic# NA[1424] (🩮️..🿽️) <reserved-1FA6E>..<reserved-1FFFD>\n"; + let row: EmojiProperty = line.parse().unwrap(); + assert_eq!(row.codepoints, (0x1FA6E, 0x1FFFD)); + assert_eq!(row.property, "Extended_Pictographic"); + } +} diff --git a/vendor/ucd-parse/src/error.rs b/vendor/ucd-parse/src/error.rs new file mode 100644 index 0000000000..0e18111a65 --- /dev/null +++ b/vendor/ucd-parse/src/error.rs @@ -0,0 +1,93 @@ +use std::error; +use std::fmt; +use std::io; +use std::path::{Path, PathBuf}; + +/// Create a new parse error from the given message. +pub fn error_parse(msg: String) -> Error { + Error { kind: ErrorKind::Parse(msg), line: None, path: None } +} + +/// Represents any kind of error that can occur while parsing the UCD. +#[derive(Debug)] +pub struct Error { + pub(crate) kind: ErrorKind, + pub(crate) line: Option<u64>, + pub(crate) path: Option<PathBuf>, +} + +/// The kind of error that occurred while parsing the UCD. +#[derive(Debug)] +pub enum ErrorKind { + /// An I/O error. + Io(io::Error), + /// A generic parse error. + Parse(String), +} + +impl Error { + /// Return the specific kind of this error. + pub fn kind(&self) -> &ErrorKind { + &self.kind + } + + /// Return the line number at which this error occurred, if available. + pub fn line(&self) -> Option<u64> { + self.line + } + + /// Return the file path associated with this error, if one exists. + pub fn path(&self) -> Option<&Path> { + self.path.as_ref().map(|p| &**p) + } + + /// Unwrap this error into its underlying kind. + pub fn into_kind(self) -> ErrorKind { + self.kind + } + + /// Returns true if and only if this is an I/O error. + /// + /// If this returns true, the underlying `ErrorKind` is guaranteed to be + /// `ErrorKind::Io`. + pub fn is_io_error(&self) -> bool { + match self.kind { + ErrorKind::Io(_) => true, + _ => false, + } + } +} + +impl error::Error for Error { + fn description(&self) -> &str { + match self.kind { + ErrorKind::Io(ref err) => err.description(), + ErrorKind::Parse(ref msg) => msg, + } + } + + fn cause(&self) -> Option<&dyn error::Error> { + match self.kind { + ErrorKind::Io(ref err) => Some(err), + _ => None, + } + } +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + if let Some(ref path) = self.path { + if let Some(line) = self.line { + write!(f, "{}:{}: ", path.display(), line)?; + } else { + write!(f, "{}: ", path.display())?; + } + } else if let Some(line) = self.line { + write!(f, "error on line {}: ", line)?; + } + match self.kind { + ErrorKind::Io(ref err) => write!(f, "{}", err), + ErrorKind::Parse(ref msg) => write!(f, "{}", msg), + } + } +} diff --git a/vendor/ucd-parse/src/grapheme_cluster_break.rs b/vendor/ucd-parse/src/grapheme_cluster_break.rs new file mode 100644 index 0000000000..1e784e0e61 --- /dev/null +++ b/vendor/ucd-parse/src/grapheme_cluster_break.rs @@ -0,0 +1,104 @@ +use std::path::Path; +use std::str::FromStr; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoints, CodepointIter, + parse_break_test, parse_codepoint_association, +}; +use error::Error; + +/// A single row in the `auxiliary/GraphemeBreakProperty.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct GraphemeClusterBreak { + /// The codepoint or codepoint range for this entry. + pub codepoints: Codepoints, + /// The property value assigned to the codepoints in this entry. + pub value: String, +} + +impl UcdFile for GraphemeClusterBreak { + fn relative_file_path() -> &'static Path { + Path::new("auxiliary/GraphemeBreakProperty.txt") + } +} + +impl UcdFileByCodepoint for GraphemeClusterBreak { + fn codepoints(&self) -> CodepointIter { + self.codepoints.into_iter() + } +} + +impl FromStr for GraphemeClusterBreak { + type Err = Error; + + fn from_str(line: &str) -> Result<GraphemeClusterBreak, Error> { + let (codepoints, value) = parse_codepoint_association(line)?; + Ok(GraphemeClusterBreak { + codepoints: codepoints, + value: value.to_string(), + }) + } +} + +/// A single row in the `auxiliary/GraphemeBreakTest.txt` file. +/// +/// This file defines tests for the grapheme cluster break algorithm. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct GraphemeClusterBreakTest { + /// Each string is a UTF-8 encoded group of codepoints that make up a + /// single grapheme cluster. + pub grapheme_clusters: Vec<String>, + /// A human readable description of this test. + pub comment: String, +} + +impl UcdFile for GraphemeClusterBreakTest { + fn relative_file_path() -> &'static Path { + Path::new("auxiliary/GraphemeBreakTest.txt") + } +} + +impl FromStr for GraphemeClusterBreakTest { + type Err = Error; + + fn from_str(line: &str) -> Result<GraphemeClusterBreakTest, Error> { + let (groups, comment) = parse_break_test(line)?; + Ok(GraphemeClusterBreakTest { + grapheme_clusters: groups, + comment: comment, + }) + } +} + +#[cfg(test)] +mod tests { + use super::{GraphemeClusterBreak, GraphemeClusterBreakTest}; + + #[test] + fn parse_single() { + let line = "093B ; SpacingMark # Mc DEVANAGARI VOWEL SIGN OOE\n"; + let row: GraphemeClusterBreak = line.parse().unwrap(); + assert_eq!(row.codepoints, 0x093B); + assert_eq!(row.value, "SpacingMark"); + } + + #[test] + fn parse_range() { + let line = "1F1E6..1F1FF ; Regional_Indicator # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z\n"; + let row: GraphemeClusterBreak = line.parse().unwrap(); + assert_eq!(row.codepoints, (0x1F1E6, 0x1F1FF)); + assert_eq!(row.value, "Regional_Indicator"); + } + + #[test] + fn parse_test() { + let line = "÷ 0061 × 1F3FF ÷ 1F476 × 200D × 1F6D1 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (Extend) ÷ [999.0] BABY (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] OCTAGONAL SIGN (ExtPict) ÷ [0.3]\n"; + + let row: GraphemeClusterBreakTest = line.parse().unwrap(); + assert_eq!(row.grapheme_clusters, vec![ + "\u{0061}\u{1F3FF}", + "\u{1F476}\u{200D}\u{1F6D1}", + ]); + assert!(row.comment.starts_with("÷ [0.2] LATIN SMALL LETTER A")); + } +} diff --git a/vendor/ucd-parse/src/jamo_short_name.rs b/vendor/ucd-parse/src/jamo_short_name.rs new file mode 100644 index 0000000000..6fb7d7062c --- /dev/null +++ b/vendor/ucd-parse/src/jamo_short_name.rs @@ -0,0 +1,78 @@ +use std::path::Path; +use std::str::FromStr; + +use regex::Regex; + +use common::{UcdFile, UcdFileByCodepoint, Codepoint, CodepointIter}; +use error::Error; + +/// A single row in the `Jamo.txt` file. +/// +/// The `Jamo.txt` file defines the `Jamo_Short_Name` property. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct JamoShortName { + /// The codepoint corresponding to this row. + pub codepoint: Codepoint, + /// The actual "Jamo Short Name." This string contains at most 3 bytes and + /// may be empty. + pub name: String, +} + +impl UcdFile for JamoShortName { + fn relative_file_path() -> &'static Path { + Path::new("Jamo.txt") + } +} + +impl UcdFileByCodepoint for JamoShortName { + fn codepoints(&self) -> CodepointIter { + self.codepoint.into_iter() + } +} + +impl FromStr for JamoShortName { + type Err = Error; + + fn from_str(line: &str) -> Result<JamoShortName, Error> { + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"(?x) + ^ + (?P<codepoint>[A-Z0-9]+); + \s* + (?P<name>[A-Z]*) + " + ).unwrap(); + }; + + let caps = match PARTS.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid Jamo_Short_name line"), + }; + Ok(JamoShortName { + codepoint: caps["codepoint"].parse()?, + name: caps.name("name").unwrap().as_str().to_string(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::JamoShortName; + + #[test] + fn parse1() { + let line = "1164; YAE # HANGUL JUNGSEONG YAE\n"; + let row: JamoShortName = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x1164); + assert_eq!(row.name, "YAE"); + } + + #[test] + fn parse2() { + let line = "110B; # HANGUL CHOSEONG IEUNG\n"; + let row: JamoShortName = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x110B); + assert_eq!(row.name, ""); + } +} diff --git a/vendor/ucd-parse/src/lib.rs b/vendor/ucd-parse/src/lib.rs new file mode 100644 index 0000000000..94c9fc57d3 --- /dev/null +++ b/vendor/ucd-parse/src/lib.rs @@ -0,0 +1,67 @@ +/*! +A library for parsing the Unicode character database. +*/ + +#![deny(missing_docs)] + +#[macro_use] +extern crate lazy_static; +extern crate regex; + +pub use common::{ + UcdFile, UcdFileByCodepoint, UcdLineParser, + Codepoint, CodepointRange, Codepoints, CodepointIter, + parse, parse_by_codepoint, parse_many_by_codepoint, +}; +pub use error::{Error, ErrorKind}; + +pub use age::Age; +pub use case_folding::{CaseFold, CaseStatus}; +pub use core_properties::CoreProperty; +pub use emoji_properties::EmojiProperty; +pub use grapheme_cluster_break::{ + GraphemeClusterBreak, GraphemeClusterBreakTest, +}; +pub use jamo_short_name::JamoShortName; +pub use line_break::LineBreakTest; +pub use name_aliases::{NameAlias, NameAliasLabel}; +pub use prop_list::Property; +pub use property_aliases::PropertyAlias; +pub use property_value_aliases::PropertyValueAlias; +pub use script_extensions::ScriptExtension; +pub use scripts::Script; +pub use sentence_break::{SentenceBreak, SentenceBreakTest}; +pub use special_casing::SpecialCaseMapping; +pub use unicode_data::{ + UnicodeData, UnicodeDataNumeric, + UnicodeDataDecomposition, UnicodeDataDecompositionTag, + UnicodeDataExpander, +}; +pub use word_break::{WordBreak, WordBreakTest}; + +macro_rules! err { + ($($tt:tt)*) => { + Err(::error::error_parse(format!($($tt)*))) + } +} + +mod common; +mod error; + +mod age; +mod case_folding; +mod core_properties; +mod emoji_properties; +mod grapheme_cluster_break; +mod jamo_short_name; +mod line_break; +mod name_aliases; +mod prop_list; +mod property_aliases; +mod property_value_aliases; +mod script_extensions; +mod scripts; +mod sentence_break; +mod special_casing; +mod unicode_data; +mod word_break; diff --git a/vendor/ucd-parse/src/line_break.rs b/vendor/ucd-parse/src/line_break.rs new file mode 100644 index 0000000000..c2e8969346 --- /dev/null +++ b/vendor/ucd-parse/src/line_break.rs @@ -0,0 +1,52 @@ +use std::path::Path; +use std::str::FromStr; + +use common::{UcdFile, parse_break_test}; +use error::Error; + +/// A single row in the `auxiliary/LineBreakTest.txt` file. +/// +/// This file defines tests for the line break algorithm. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct LineBreakTest { + /// Each string is a UTF-8 encoded group of codepoints that make up a + /// single line. + pub lines: Vec<String>, + /// A human readable description of this test. + pub comment: String, +} + +impl UcdFile for LineBreakTest { + fn relative_file_path() -> &'static Path { + Path::new("auxiliary/LineBreakTest.txt") + } +} + +impl FromStr for LineBreakTest { + type Err = Error; + + fn from_str(line: &str) -> Result<LineBreakTest, Error> { + let (groups, comment) = parse_break_test(line)?; + Ok(LineBreakTest { + lines: groups, + comment: comment, + }) + } +} + +#[cfg(test)] +mod tests { + use super::LineBreakTest; + + #[test] + fn parse_test() { + let line = "× 1F1F7 × 1F1FA ÷ 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) ÷ [30.13] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3]"; + + let row: LineBreakTest = line.parse().unwrap(); + assert_eq!(row.lines, vec![ + "\u{1F1F7}\u{1F1FA}", + "\u{1F1F8}\u{1F1EA}", + ]); + assert!(row.comment.ends_with("(RI) ÷ [0.3]")); + } +} diff --git a/vendor/ucd-parse/src/name_aliases.rs b/vendor/ucd-parse/src/name_aliases.rs new file mode 100644 index 0000000000..bee3fdbfed --- /dev/null +++ b/vendor/ucd-parse/src/name_aliases.rs @@ -0,0 +1,143 @@ +use std::path::Path; +use std::str::FromStr; + +use regex::Regex; + +use common::{UcdFile, UcdFileByCodepoint, Codepoint, CodepointIter}; +use error::Error; + +/// A single row in the `NameAliases.txt` file. +/// +/// Note that there are multiple rows for some codepoint. Each row provides a +/// new alias. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct NameAlias { + /// The codepoint corresponding to this row. + pub codepoint: Codepoint, + /// The alias. + pub alias: String, + /// The label of this alias. + pub label: NameAliasLabel, +} + +impl UcdFile for NameAlias { + fn relative_file_path() -> &'static Path { + Path::new("NameAliases.txt") + } +} + +impl UcdFileByCodepoint for NameAlias { + fn codepoints(&self) -> CodepointIter { + self.codepoint.into_iter() + } +} + +impl FromStr for NameAlias { + type Err = Error; + + fn from_str(line: &str) -> Result<NameAlias, Error> { + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"(?x) + ^ + (?P<codepoint>[A-Z0-9]+); + \s* + (?P<alias>[^;]+); + \s* + (?P<label>\S+) + " + ).unwrap(); + }; + + let caps = match PARTS.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid NameAliases line"), + }; + Ok(NameAlias { + codepoint: caps["codepoint"].parse()?, + alias: caps.name("alias").unwrap().as_str().to_string(), + label: caps["label"].parse()?, + }) + } +} + +/// The label of a name alias. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum NameAliasLabel { + /// Corrections for serious problems in a character name. + Correction, + /// ISO 6429 names for C0 and C1 control functions and other commonly + /// occurring names for control codes. + Control, + /// A few widely used alternate names for format characters. + Alternate, + /// Several documented labels for C1 control code points which were + /// never actually approved in any standard. + Figment, + /// Commonly occurring abbreviations (or acronyms) for control codes, + /// format characters, spaces and variation selectors. + Abbreviation, +} + +impl Default for NameAliasLabel { + fn default() -> NameAliasLabel { + // This is arbitrary, but the Default impl is convenient. + NameAliasLabel::Correction + } +} + +impl FromStr for NameAliasLabel { + type Err = Error; + + fn from_str(s: &str) -> Result<NameAliasLabel, Error> { + match s { + "correction" => Ok(NameAliasLabel::Correction), + "control" => Ok(NameAliasLabel::Control), + "alternate" => Ok(NameAliasLabel::Alternate), + "figment" => Ok(NameAliasLabel::Figment), + "abbreviation" => Ok(NameAliasLabel::Abbreviation), + unknown => err!("unknown name alias label: '{}'", unknown), + } + } +} + +#[cfg(test)] +mod tests { + use super::{NameAlias, NameAliasLabel}; + + #[test] + fn parse1() { + let line = "0000;NULL;control\n"; + let row: NameAlias = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x0); + assert_eq!(row.alias, "NULL"); + assert_eq!(row.label, NameAliasLabel::Control); + } + + #[test] + fn parse2() { + let line = "000B;VERTICAL TABULATION;control\n"; + let row: NameAlias = line.parse().unwrap(); + assert_eq!(row.codepoint, 0xB); + assert_eq!(row.alias, "VERTICAL TABULATION"); + assert_eq!(row.label, NameAliasLabel::Control); + } + + #[test] + fn parse3() { + let line = "0081;HIGH OCTET PRESET;figment\n"; + let row: NameAlias = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x81); + assert_eq!(row.alias, "HIGH OCTET PRESET"); + assert_eq!(row.label, NameAliasLabel::Figment); + } + + #[test] + fn parse4() { + let line = "E01EF;VS256;abbreviation\n"; + let row: NameAlias = line.parse().unwrap(); + assert_eq!(row.codepoint, 0xE01EF); + assert_eq!(row.alias, "VS256"); + assert_eq!(row.label, NameAliasLabel::Abbreviation); + } +} diff --git a/vendor/ucd-parse/src/prop_list.rs b/vendor/ucd-parse/src/prop_list.rs new file mode 100644 index 0000000000..b56c81ba74 --- /dev/null +++ b/vendor/ucd-parse/src/prop_list.rs @@ -0,0 +1,65 @@ +use std::path::Path; +use std::str::FromStr; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoints, CodepointIter, + parse_codepoint_association, +}; +use error::Error; + +/// A single row in the `PropList.txt` file. +/// +/// The `PropList.txt` file is the source of truth on several Unicode +/// properties. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct Property { + /// The codepoint or codepoint range for this entry. + pub codepoints: Codepoints, + /// The property name assigned to the codepoints in this entry. + pub property: String, +} + +impl UcdFile for Property { + fn relative_file_path() -> &'static Path { + Path::new("PropList.txt") + } +} + +impl UcdFileByCodepoint for Property { + fn codepoints(&self) -> CodepointIter { + self.codepoints.into_iter() + } +} + +impl FromStr for Property { + type Err = Error; + + fn from_str(line: &str) -> Result<Property, Error> { + let (codepoints, property) = parse_codepoint_association(line)?; + Ok(Property { + codepoints: codepoints, + property: property.to_string(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::Property; + + #[test] + fn parse_single() { + let line = "061C ; Bidi_Control # Cf ARABIC LETTER MARK\n"; + let row: Property = line.parse().unwrap(); + assert_eq!(row.codepoints, 0x061C); + assert_eq!(row.property, "Bidi_Control"); + } + + #[test] + fn parse_range() { + let line = "0009..000D ; White_Space # Cc [5] <control-0009>..<control-000D>\n"; + let row: Property = line.parse().unwrap(); + assert_eq!(row.codepoints, (0x0009, 0x000D)); + assert_eq!(row.property, "White_Space"); + } +} diff --git a/vendor/ucd-parse/src/property_aliases.rs b/vendor/ucd-parse/src/property_aliases.rs new file mode 100644 index 0000000000..d2ffa38606 --- /dev/null +++ b/vendor/ucd-parse/src/property_aliases.rs @@ -0,0 +1,111 @@ +use std::path::Path; +use std::str::FromStr; + +use regex::Regex; + +use common::UcdFile; +use error::Error; + +/// A single row in the `PropertyAliases.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct PropertyAlias { + /// An abbreviation for this property. + pub abbreviation: String, + /// The "long" name of this property. + pub long: String, + /// Additional aliases (if present). + pub aliases: Vec<String>, +} + +impl UcdFile for PropertyAlias { + fn relative_file_path() -> &'static Path { + Path::new("PropertyAliases.txt") + } +} + +impl FromStr for PropertyAlias { + type Err = Error; + + fn from_str(line: &str) -> Result<PropertyAlias, Error> { + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"(?x) + ^ + \s*(?P<abbrev>[^\s;]+)\s*; + \s*(?P<long>[^\s;]+)\s* + (?:;(?P<aliases>.*))? + " + ).unwrap(); + static ref ALIASES: Regex = Regex::new( + r"\s*(?P<alias>[^\s;]+)\s*;?\s*" + ).unwrap(); + }; + + let caps = match PARTS.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid PropertyAliases line: '{}'", line), + }; + let mut aliases = vec![]; + if let Some(m) = caps.name("aliases") { + for acaps in ALIASES.captures_iter(m.as_str()) { + let alias = acaps.name("alias").unwrap().as_str(); + aliases.push(alias.to_string()); + } + } + Ok(PropertyAlias { + abbreviation: caps.name("abbrev").unwrap().as_str().to_string(), + long: caps.name("long").unwrap().as_str().to_string(), + aliases: aliases, + }) + } +} + +#[cfg(test)] +mod tests { + use super::PropertyAlias; + + #[test] + fn parse1() { + let line = "cjkAccountingNumeric ; kAccountingNumeric\n"; + let row: PropertyAlias = line.parse().unwrap(); + assert_eq!(row.abbreviation, "cjkAccountingNumeric"); + assert_eq!(row.long, "kAccountingNumeric"); + assert!(row.aliases.is_empty()); + } + + #[test] + fn parse2() { + let line = "nv ; Numeric_Value\n"; + let row: PropertyAlias = line.parse().unwrap(); + assert_eq!(row.abbreviation, "nv"); + assert_eq!(row.long, "Numeric_Value"); + assert!(row.aliases.is_empty()); + } + + #[test] + fn parse3() { + let line = "scf ; Simple_Case_Folding ; sfc\n"; + let row: PropertyAlias = line.parse().unwrap(); + assert_eq!(row.abbreviation, "scf"); + assert_eq!(row.long, "Simple_Case_Folding"); + assert_eq!(row.aliases, vec!["sfc"]); + } + + #[test] + fn parse4() { + let line = "cjkRSUnicode ; kRSUnicode ; Unicode_Radical_Stroke; URS\n"; + let row: PropertyAlias = line.parse().unwrap(); + assert_eq!(row.abbreviation, "cjkRSUnicode"); + assert_eq!(row.long, "kRSUnicode"); + assert_eq!(row.aliases, vec!["Unicode_Radical_Stroke", "URS"]); + } + + #[test] + fn parse5() { + let line = "isc ; ISO_Comment"; + let row: PropertyAlias = line.parse().unwrap(); + assert_eq!(row.abbreviation, "isc"); + assert_eq!(row.long, "ISO_Comment"); + assert!(row.aliases.is_empty()); + } +} diff --git a/vendor/ucd-parse/src/property_value_aliases.rs b/vendor/ucd-parse/src/property_value_aliases.rs new file mode 100644 index 0000000000..5b69362be1 --- /dev/null +++ b/vendor/ucd-parse/src/property_value_aliases.rs @@ -0,0 +1,176 @@ +use std::path::Path; +use std::str::FromStr; + +use regex::Regex; + +use common::UcdFile; +use error::Error; + +/// A single row in the `PropertyValueAliases.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct PropertyValueAlias { + /// The property name for which this value alias applies. + pub property: String, + /// A numeric abbreviation for this property value, if present. (This is + /// seemingly only present for the `ccc`/`Canonical_Combining_Class` + /// property.) + pub numeric: Option<u8>, + /// An abbreviation for this property value. + pub abbreviation: String, + /// The "long" form of this property value. + pub long: String, + /// Additional value aliases (if present). + pub aliases: Vec<String>, +} + +impl UcdFile for PropertyValueAlias { + fn relative_file_path() -> &'static Path { + Path::new("PropertyValueAliases.txt") + } +} + +impl FromStr for PropertyValueAlias { + type Err = Error; + + fn from_str(line: &str) -> Result<PropertyValueAlias, Error> { + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"(?x) + ^ + \s*(?P<prop>[^\s;]+)\s*; + \s*(?P<abbrev>[^\s;]+)\s*; + \s*(?P<long>[^\s;]+)\s* + (?:;(?P<aliases>.*))? + " + ).unwrap(); + static ref PARTS_CCC: Regex = Regex::new( + r"(?x) + ^ + ccc; + \s*(?P<num_class>[0-9]+)\s*; + \s*(?P<abbrev>[^\s;]+)\s*; + \s*(?P<long>[^\s;]+) + " + ).unwrap(); + static ref ALIASES: Regex = Regex::new( + r"\s*(?P<alias>[^\s;]+)\s*;?\s*" + ).unwrap(); + }; + + if line.starts_with("ccc;") { + let caps = match PARTS_CCC.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid PropertyValueAliases (ccc) line"), + }; + let n = match caps["num_class"].parse() { + Ok(n) => n, + Err(err) => return err!( + "failed to parse ccc number '{}': {}", + &caps["num_class"], err), + }; + let abbrev = caps.name("abbrev").unwrap().as_str(); + let long = caps.name("long").unwrap().as_str(); + return Ok(PropertyValueAlias { + property: line[0..3].to_string(), + numeric: Some(n), + abbreviation: abbrev.to_string(), + long: long.to_string(), + aliases: vec![], + }); + } + + let caps = match PARTS.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid PropertyValueAliases line"), + }; + let mut aliases = vec![]; + if let Some(m) = caps.name("aliases") { + for acaps in ALIASES.captures_iter(m.as_str()) { + let alias = acaps.name("alias").unwrap().as_str(); + if alias == "#" { + // This starts a comment, so stop reading. + break; + } + aliases.push(alias.to_string()); + } + } + Ok(PropertyValueAlias { + property: caps.name("prop").unwrap().as_str().to_string(), + numeric: None, + abbreviation: caps.name("abbrev").unwrap().as_str().to_string(), + long: caps.name("long").unwrap().as_str().to_string(), + aliases: aliases, + }) + } +} + +#[cfg(test)] +mod tests { + use super::PropertyValueAlias; + + #[test] + fn parse1() { + let line = "blk; Arabic_PF_A ; Arabic_Presentation_Forms_A ; Arabic_Presentation_Forms-A\n"; + let row: PropertyValueAlias = line.parse().unwrap(); + assert_eq!(row.property, "blk"); + assert_eq!(row.numeric, None); + assert_eq!(row.abbreviation, "Arabic_PF_A"); + assert_eq!(row.long, "Arabic_Presentation_Forms_A"); + assert_eq!(row.aliases, vec!["Arabic_Presentation_Forms-A"]); + } + + #[test] + fn parse2() { + let line = "AHex; N ; No ; F ; False\n"; + let row: PropertyValueAlias = line.parse().unwrap(); + assert_eq!(row.property, "AHex"); + assert_eq!(row.numeric, None); + assert_eq!(row.abbreviation, "N"); + assert_eq!(row.long, "No"); + assert_eq!(row.aliases, vec!["F", "False"]); + } + + #[test] + fn parse3() { + let line = "age; 1.1 ; V1_1\n"; + let row: PropertyValueAlias = line.parse().unwrap(); + assert_eq!(row.property, "age"); + assert_eq!(row.numeric, None); + assert_eq!(row.abbreviation, "1.1"); + assert_eq!(row.long, "V1_1"); + assert!(row.aliases.is_empty()); + } + + #[test] + fn parse4() { + let line = "ccc; 0; NR ; Not_Reordered\n"; + let row: PropertyValueAlias = line.parse().unwrap(); + assert_eq!(row.property, "ccc"); + assert_eq!(row.numeric, Some(0)); + assert_eq!(row.abbreviation, "NR"); + assert_eq!(row.long, "Not_Reordered"); + assert!(row.aliases.is_empty()); + } + + #[test] + fn parse5() { + let line = "ccc; 133; CCC133 ; CCC133 # RESERVED\n"; + let row: PropertyValueAlias = line.parse().unwrap(); + assert_eq!(row.property, "ccc"); + assert_eq!(row.numeric, Some(133)); + assert_eq!(row.abbreviation, "CCC133"); + assert_eq!(row.long, "CCC133"); + assert!(row.aliases.is_empty()); + } + + #[test] + fn parse6() { + let line = "gc ; P ; Punctuation ; punct # Pc | Pd | Pe | Pf | Pi | Po | Ps\n"; + let row: PropertyValueAlias = line.parse().unwrap(); + assert_eq!(row.property, "gc"); + assert_eq!(row.numeric, None); + assert_eq!(row.abbreviation, "P"); + assert_eq!(row.long, "Punctuation"); + assert_eq!(row.aliases, vec!["punct"]); + } +} diff --git a/vendor/ucd-parse/src/script_extensions.rs b/vendor/ucd-parse/src/script_extensions.rs new file mode 100644 index 0000000000..d9cf26235f --- /dev/null +++ b/vendor/ucd-parse/src/script_extensions.rs @@ -0,0 +1,65 @@ +use std::path::Path; +use std::str::FromStr; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoints, CodepointIter, + parse_codepoint_association, +}; +use error::Error; + +/// A single row in the `ScriptExtensions.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct ScriptExtension { + /// The codepoint or codepoint range for this entry. + pub codepoints: Codepoints, + /// The script extension names assigned to the codepoints in this entry. + pub scripts: Vec<String>, +} + +impl UcdFile for ScriptExtension { + fn relative_file_path() -> &'static Path { + Path::new("ScriptExtensions.txt") + } +} + +impl UcdFileByCodepoint for ScriptExtension { + fn codepoints(&self) -> CodepointIter { + self.codepoints.into_iter() + } +} + +impl FromStr for ScriptExtension { + type Err = Error; + + fn from_str(line: &str) -> Result<ScriptExtension, Error> { + let (codepoints, scripts) = parse_codepoint_association(line)?; + Ok(ScriptExtension { + codepoints: codepoints, + scripts: scripts.split_whitespace().map(str::to_string).collect(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::ScriptExtension; + + #[test] + fn parse_single() { + let line = "060C ; Arab Syrc Thaa # Po ARABIC COMMA\n"; + let row: ScriptExtension = line.parse().unwrap(); + assert_eq!(row.codepoints, 0x060C); + assert_eq!(row.scripts, vec!["Arab", "Syrc", "Thaa"]); + } + + #[test] + fn parse_range() { + let line = "A836..A837 ; Deva Gujr Guru Kthi Mahj Modi Sind Takr Tirh # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK\n"; + let row: ScriptExtension = line.parse().unwrap(); + assert_eq!(row.codepoints, (0xA836, 0xA837)); + assert_eq!(row.scripts, vec![ + "Deva", "Gujr", "Guru", "Kthi", "Mahj", "Modi", "Sind", "Takr", + "Tirh", + ]); + } +} diff --git a/vendor/ucd-parse/src/scripts.rs b/vendor/ucd-parse/src/scripts.rs new file mode 100644 index 0000000000..54259e02e0 --- /dev/null +++ b/vendor/ucd-parse/src/scripts.rs @@ -0,0 +1,62 @@ +use std::path::Path; +use std::str::FromStr; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoints, CodepointIter, + parse_codepoint_association, +}; +use error::Error; + +/// A single row in the `Scripts.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct Script { + /// The codepoint or codepoint range for this entry. + pub codepoints: Codepoints, + /// The script name assigned to the codepoints in this entry. + pub script: String, +} + +impl UcdFile for Script { + fn relative_file_path() -> &'static Path { + Path::new("Scripts.txt") + } +} + +impl UcdFileByCodepoint for Script { + fn codepoints(&self) -> CodepointIter { + self.codepoints.into_iter() + } +} + +impl FromStr for Script { + type Err = Error; + + fn from_str(line: &str) -> Result<Script, Error> { + let (codepoints, script) = parse_codepoint_association(line)?; + Ok(Script { + codepoints: codepoints, + script: script.to_string(), + }) + } +} + +#[cfg(test)] +mod tests { + use super::Script; + + #[test] + fn parse_single() { + let line = "10A7F ; Old_South_Arabian # Po OLD SOUTH ARABIAN NUMERIC INDICATOR\n"; + let row: Script = line.parse().unwrap(); + assert_eq!(row.codepoints, 0x10A7F); + assert_eq!(row.script, "Old_South_Arabian"); + } + + #[test] + fn parse_range() { + let line = "1200..1248 ; Ethiopic # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA\n"; + let row: Script = line.parse().unwrap(); + assert_eq!(row.codepoints, (0x1200, 0x1248)); + assert_eq!(row.script, "Ethiopic"); + } +} diff --git a/vendor/ucd-parse/src/sentence_break.rs b/vendor/ucd-parse/src/sentence_break.rs new file mode 100644 index 0000000000..64bd1eb77c --- /dev/null +++ b/vendor/ucd-parse/src/sentence_break.rs @@ -0,0 +1,104 @@ +use std::path::Path; +use std::str::FromStr; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoints, CodepointIter, + parse_break_test, parse_codepoint_association, +}; +use error::Error; + +/// A single row in the `auxiliary/SentenceBreakProperty.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct SentenceBreak { + /// The codepoint or codepoint range for this entry. + pub codepoints: Codepoints, + /// The property value assigned to the codepoints in this entry. + pub value: String, +} + +impl UcdFile for SentenceBreak { + fn relative_file_path() -> &'static Path { + Path::new("auxiliary/SentenceBreakProperty.txt") + } +} + +impl UcdFileByCodepoint for SentenceBreak { + fn codepoints(&self) -> CodepointIter { + self.codepoints.into_iter() + } +} + +impl FromStr for SentenceBreak { + type Err = Error; + + fn from_str(line: &str) -> Result<SentenceBreak, Error> { + let (codepoints, value) = parse_codepoint_association(line)?; + Ok(SentenceBreak { + codepoints: codepoints, + value: value.to_string(), + }) + } +} + +/// A single row in the `auxiliary/SentenceBreakTest.txt` file. +/// +/// This file defines tests for the sentence break algorithm. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct SentenceBreakTest { + /// Each string is a UTF-8 encoded group of codepoints that make up a + /// single sentence. + pub sentences: Vec<String>, + /// A human readable description of this test. + pub comment: String, +} + +impl UcdFile for SentenceBreakTest { + fn relative_file_path() -> &'static Path { + Path::new("auxiliary/SentenceBreakTest.txt") + } +} + +impl FromStr for SentenceBreakTest { + type Err = Error; + + fn from_str(line: &str) -> Result<SentenceBreakTest, Error> { + let (groups, comment) = parse_break_test(line)?; + Ok(SentenceBreakTest { + sentences: groups, + comment: comment, + }) + } +} + +#[cfg(test)] +mod tests { + use super::{SentenceBreak, SentenceBreakTest}; + + #[test] + fn parse_single() { + let line = "11445 ; Extend # Mc NEWA SIGN VISARGA\n"; + let row: SentenceBreak = line.parse().unwrap(); + assert_eq!(row.codepoints, 0x11445); + assert_eq!(row.value, "Extend"); + } + + #[test] + fn parse_range() { + let line = "FE31..FE32 ; SContinue # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH\n"; + let row: SentenceBreak = line.parse().unwrap(); + assert_eq!(row.codepoints, (0xFE31, 0xFE32)); + assert_eq!(row.value, "SContinue"); + } + + #[test] + fn parse_test() { + let line = "÷ 2060 × 5B57 × 2060 × 002E × 2060 ÷ 5B57 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3]"; + + let row: SentenceBreakTest = line.parse().unwrap(); + assert_eq!(row.sentences, vec![ + "\u{2060}\u{5B57}\u{2060}\u{002E}\u{2060}", + "\u{5B57}\u{2060}\u{2060}", + ]); + assert!(row.comment.contains("[5.0] WORD JOINER (Format_FE)")); + } +} diff --git a/vendor/ucd-parse/src/special_casing.rs b/vendor/ucd-parse/src/special_casing.rs new file mode 100644 index 0000000000..0238357481 --- /dev/null +++ b/vendor/ucd-parse/src/special_casing.rs @@ -0,0 +1,104 @@ +use std::path::Path; +use std::str::FromStr; + +use regex::Regex; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoint, CodepointIter, + parse_codepoint_sequence, +}; +use error::Error; + +/// A single row in the `SpecialCasing.txt` file. +/// +/// Note that a single codepoint may be mapped multiple times. In particular, +/// a single codepoint might have mappings based on distinct language sensitive +/// conditions (e.g., `U+0307`). +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct SpecialCaseMapping { + /// The codepoint that is being mapped. + pub codepoint: Codepoint, + /// The lowercase mapping, which may be empty. + pub lowercase: Vec<Codepoint>, + /// The titlecase mapping, which may be empty. + pub titlecase: Vec<Codepoint>, + /// The uppercase mapping, which may be empty. + pub uppercase: Vec<Codepoint>, + /// A list of language specific conditions, see `SpecialCasing.txt` for + /// more details. + pub conditions: Vec<String>, +} + +impl UcdFile for SpecialCaseMapping { + fn relative_file_path() -> &'static Path { + Path::new("SpecialCasing.txt") + } +} + +impl UcdFileByCodepoint for SpecialCaseMapping { + fn codepoints(&self) -> CodepointIter { + self.codepoint.into_iter() + } +} + +impl FromStr for SpecialCaseMapping { + type Err = Error; + + fn from_str(line: &str) -> Result<SpecialCaseMapping, Error> { + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"(?x) + ^ + \s*(?P<codepoint>[^\s;]+)\s*; + \s*(?P<lower>[^;]+)\s*; + \s*(?P<title>[^;]+)\s*; + \s*(?P<upper>[^;]+)\s*; + \s*(?P<conditions>[^;\x23]+)? + " + ).unwrap(); + }; + + let caps = match PARTS.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid SpecialCasing line: '{}'", line), + }; + let conditions = caps + .name("conditions") + .map(|x| x.as_str().trim().split_whitespace().map(|c| c.to_string()).collect()) + .unwrap_or(vec![]); + Ok(SpecialCaseMapping { + codepoint: caps["codepoint"].parse()?, + lowercase: parse_codepoint_sequence(&caps["lower"])?, + titlecase: parse_codepoint_sequence(&caps["title"])?, + uppercase: parse_codepoint_sequence(&caps["upper"])?, + conditions: conditions, + }) + } +} + +#[cfg(test)] +mod tests { + use super::SpecialCaseMapping; + + #[test] + fn parse_no_conds() { + let line = "1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA\n"; + let row: SpecialCaseMapping = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x1F52); + assert_eq!(row.lowercase, vec![0x1F52]); + assert_eq!(row.titlecase, vec![0x03A5, 0x0313, 0x0300]); + assert_eq!(row.uppercase, vec![0x03A5, 0x0313, 0x0300]); + assert!(row.conditions.is_empty()); + } + + #[test] + fn parse_conds() { + let line = "0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE\n"; + let row: SpecialCaseMapping = line.parse().unwrap(); + assert_eq!(row.codepoint, 0x0307); + assert!(row.lowercase.is_empty()); + assert_eq!(row.titlecase, vec![0x0307]); + assert_eq!(row.uppercase, vec![0x0307]); + assert_eq!(row.conditions, vec!["tr", "After_I"]); + } +} diff --git a/vendor/ucd-parse/src/unicode_data.rs b/vendor/ucd-parse/src/unicode_data.rs new file mode 100644 index 0000000000..d71bbd7509 --- /dev/null +++ b/vendor/ucd-parse/src/unicode_data.rs @@ -0,0 +1,731 @@ +use std::fmt; +use std::iter; +use std::ops::Range; +use std::path::Path; +use std::str::FromStr; + +use regex::Regex; + +use common::{UcdFile, UcdFileByCodepoint, Codepoint, CodepointIter}; +use error::Error; + +/// Represents a single row in the `UnicodeData.txt` file. +/// +/// These fields were taken from UAX44, Table 9, as part of the documentation +/// for the +/// [`UnicodeData.txt` file](http://www.unicode.org/reports/tr44/#UnicodeData.txt). +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct UnicodeData { + /// The codepoint corresponding to this row. + pub codepoint: Codepoint, + /// The name of this codepoint. + pub name: String, + /// The "general category" of this codepoint. + pub general_category: String, + /// The class of this codepoint used in the Canonical Ordering Algorithm. + /// + /// Note that some classes map to a particular symbol. See + /// [UAX44, Table 15](http://www.unicode.org/reports/tr44/#Canonical_Combining_Class_Values). + pub canonical_combining_class: u8, + /// The bidirectional class of this codepoint. + /// + /// Possible values are listed in + /// [UAX44, Table 13](http://www.unicode.org/reports/tr44/#Bidi_Class_Values). + pub bidi_class: String, + /// The decomposition mapping for this codepoint. This includes its + /// formatting tag (if present). + pub decomposition: UnicodeDataDecomposition, + /// A decimal numeric representation of this codepoint, if it has the + /// property `Numeric_Type=Decimal`. + pub numeric_type_decimal: Option<u8>, + /// A decimal numeric representation of this codepoint, if it has the + /// property `Numeric_Type=Digit`. Note that while this field is still + /// populated for existing codepoints, no new codepoints will have this + /// field populated. + pub numeric_type_digit: Option<u8>, + /// A decimal or rational numeric representation of this codepoint, if it + /// has the property `Numeric_Type=Numeric`. + pub numeric_type_numeric: Option<UnicodeDataNumeric>, + /// A boolean indicating whether this codepoint is "mirrored" in + /// bidirectional text. + pub bidi_mirrored: bool, + /// The "old" Unicode 1.0 or ISO 6429 name of this codepoint. Note that + /// this field is empty unless it is significantly different from + /// the `name` field. + pub unicode1_name: String, + /// The ISO 10464 comment field. This no longer contains any non-NULL + /// values. + pub iso_comment: String, + /// This codepoint's simple uppercase mapping, if it exists. + pub simple_uppercase_mapping: Option<Codepoint>, + /// This codepoint's simple lowercase mapping, if it exists. + pub simple_lowercase_mapping: Option<Codepoint>, + /// This codepoint's simple titlecase mapping, if it exists. + pub simple_titlecase_mapping: Option<Codepoint>, +} + +impl UcdFile for UnicodeData { + fn relative_file_path() -> &'static Path { + Path::new("UnicodeData.txt") + } +} + +impl UcdFileByCodepoint for UnicodeData { + fn codepoints(&self) -> CodepointIter { + self.codepoint.into_iter() + } +} + +impl UnicodeData { + /// Returns true if and only if this record corresponds to the start of a + /// range. + pub fn is_range_start(&self) -> bool { + self.name.starts_with('<') + && self.name.ends_with('>') + && self.name.contains("First") + } + + /// Returns true if and only if this record corresponds to the end of a + /// range. + pub fn is_range_end(&self) -> bool { + self.name.starts_with('<') + && self.name.ends_with('>') + && self.name.contains("Last") + } +} + +impl FromStr for UnicodeData { + type Err = Error; + + fn from_str(line: &str) -> Result<UnicodeData, Error> { + lazy_static! { + static ref PARTS: Regex = Regex::new( + r"(?x) + ^ + ([A-Z0-9]+); # 1; codepoint + ([^;]+); # 2; name + ([^;]+); # 3; general category + ([0-9]+); # 4; canonical combining class + ([^;]+); # 5; bidi class + ([^;]*); # 6; decomposition + ([0-9]*); # 7; numeric type decimal + ([0-9]*); # 8; numeric type digit + ([-0-9/]*); # 9; numeric type numeric + ([YN]); # 10; bidi mirrored + ([^;]*); # 11; unicode1 name + ([^;]*); # 12; ISO comment + ([^;]*); # 13; simple uppercase mapping + ([^;]*); # 14; simple lowercase mapping + ([^;]*) # 15; simple titlecase mapping + $ + " + ).unwrap(); + }; + let caps = match PARTS.captures(line.trim()) { + Some(caps) => caps, + None => return err!("invalid UnicodeData line"), + }; + let capget = |n| caps.get(n).unwrap().as_str(); + let mut data = UnicodeData::default(); + + data.codepoint = capget(1).parse()?; + data.name = capget(2).to_string(); + data.general_category = capget(3).to_string(); + data.canonical_combining_class = match capget(4).parse() { + Ok(n) => n, + Err(err) => return err!( + "failed to parse canonical combining class '{}': {}", + capget(4), err), + }; + data.bidi_class = capget(5).to_string(); + if !caps[6].is_empty() { + data.decomposition = caps[6].parse()?; + } else { + data.decomposition.push(data.codepoint)?; + } + if !capget(7).is_empty() { + data.numeric_type_decimal = Some(match capget(7).parse() { + Ok(n) => n, + Err(err) => return err!( + "failed to parse numeric type decimal '{}': {}", + capget(7), err), + }); + } + if !capget(8).is_empty() { + data.numeric_type_digit = Some(match capget(8).parse() { + Ok(n) => n, + Err(err) => return err!( + "failed to parse numeric type digit '{}': {}", + capget(8), err), + }); + } + if !capget(9).is_empty() { + data.numeric_type_numeric = Some(capget(9).parse()?); + } + data.bidi_mirrored = capget(10) == "Y"; + data.unicode1_name = capget(11).to_string(); + data.iso_comment = capget(12).to_string(); + if !capget(13).is_empty() { + data.simple_uppercase_mapping = Some(capget(13).parse()?); + } + if !capget(14).is_empty() { + data.simple_lowercase_mapping = Some(capget(14).parse()?); + } + if !capget(15).is_empty() { + data.simple_titlecase_mapping = Some(capget(15).parse()?); + } + Ok(data) + } +} + +impl fmt::Display for UnicodeData { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{};", self.codepoint)?; + write!(f, "{};", self.name)?; + write!(f, "{};", self.general_category)?; + write!(f, "{};", self.canonical_combining_class)?; + write!(f, "{};", self.bidi_class)?; + if self.decomposition.is_canonical() + && self.decomposition.mapping() == &[self.codepoint] + { + write!(f, ";")?; + } else { + write!(f, "{};", self.decomposition)?; + } + if let Some(n) = self.numeric_type_decimal { + write!(f, "{};", n)?; + } else { + write!(f, ";")?; + } + if let Some(n) = self.numeric_type_digit { + write!(f, "{};", n)?; + } else { + write!(f, ";")?; + } + if let Some(n) = self.numeric_type_numeric { + write!(f, "{};", n)?; + } else { + write!(f, ";")?; + } + write!(f, "{};", if self.bidi_mirrored { "Y" } else { "N" })?; + write!(f, "{};", self.unicode1_name)?; + write!(f, "{};", self.iso_comment)?; + if let Some(cp) = self.simple_uppercase_mapping { + write!(f, "{};", cp)?; + } else { + write!(f, ";")?; + } + if let Some(cp) = self.simple_lowercase_mapping { + write!(f, "{};", cp)?; + } else { + write!(f, ";")?; + } + if let Some(cp) = self.simple_titlecase_mapping { + write!(f, "{}", cp)?; + } + Ok(()) + } +} + +/// Represents a decomposition mapping of a single row in the +/// `UnicodeData.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct UnicodeDataDecomposition { + /// The formatting tag associated with this mapping, if present. + pub tag: Option<UnicodeDataDecompositionTag>, + /// The number of codepoints in this mapping. + pub len: usize, + /// The codepoints in the mapping. Entries beyond `len` in the mapping + /// are always U+0000. If no mapping was present, then this always contains + /// a single codepoint corresponding to this row's character. + pub mapping: [Codepoint; 18], +} + +impl UnicodeDataDecomposition { + /// Create a new decomposition mapping with the given tag and codepoints. + /// + /// If there are too many codepoints, then an error is returned. + pub fn new( + tag: Option<UnicodeDataDecompositionTag>, + mapping: &[Codepoint], + ) -> Result<UnicodeDataDecomposition, Error> { + let mut x = UnicodeDataDecomposition::default(); + x.tag = tag; + for &cp in mapping { + x.push(cp)?; + } + Ok(x) + } + + /// Add a new codepoint to this decomposition's mapping. + /// + /// If the mapping is already full, then this returns an error. + pub fn push(&mut self, cp: Codepoint) -> Result<(), Error> { + if self.len >= self.mapping.len() { + return err!("invalid decomposition mapping (too many codepoints)"); + } + self.mapping[self.len] = cp; + self.len += 1; + Ok(()) + } + + /// Return the mapping as a slice of codepoints. The slice returned + /// has length equivalent to the number of codepoints in this mapping. + pub fn mapping(&self) -> &[Codepoint] { + &self.mapping[..self.len] + } + + /// Returns true if and only if this decomposition mapping is canonical. + pub fn is_canonical(&self) -> bool { + self.tag.is_none() + } +} + +impl FromStr for UnicodeDataDecomposition { + type Err = Error; + + fn from_str(s: &str) -> Result<UnicodeDataDecomposition, Error> { + lazy_static! { + static ref WITH_TAG: Regex = Regex::new( + r"^(?:<(?P<tag>[^>]+)>)?\s*(?P<chars>[\s0-9A-F]+)$" + ).unwrap(); + static ref CHARS: Regex = Regex::new(r"[0-9A-F]+").unwrap(); + }; + if s.is_empty() { + return err!("expected non-empty string for \ + UnicodeDataDecomposition value"); + } + let caps = match WITH_TAG.captures(s) { + Some(caps) => caps, + None => return err!("invalid decomposition value"), + }; + let mut decomp = UnicodeDataDecomposition::default(); + let mut codepoints = s; + if let Some(m) = caps.name("tag") { + decomp.tag = Some(m.as_str().parse()?); + codepoints = &caps["chars"]; + } + for m in CHARS.find_iter(codepoints) { + let cp = m.as_str().parse()?; + decomp.push(cp)?; + } + Ok(decomp) + } +} + +impl fmt::Display for UnicodeDataDecomposition { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + if let Some(ref tag) = self.tag { + write!(f, "<{}> ", tag)?; + } + let mut first = true; + for cp in self.mapping() { + if !first { + write!(f, " ")?; + } + first = false; + write!(f, "{}", cp)?; + } + Ok(()) + } +} + +/// The formatting tag on a decomposition mapping. +/// +/// This is taken from +/// [UAX44, Table 14](http://www.unicode.org/reports/tr44/#Character_Decomposition_Mappings). +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum UnicodeDataDecompositionTag { + /// <font> + Font, + /// <noBreak> + NoBreak, + /// <initial> + Initial, + /// <medial> + Medial, + /// <final> + Final, + /// <isolated> + Isolated, + /// <circle> + Circle, + /// <super> + Super, + /// <sub> + Sub, + /// <vertical> + Vertical, + /// <wide> + Wide, + /// <narrow> + Narrow, + /// <small> + Small, + /// <square> + Square, + /// <fraction> + Fraction, + /// <compat> + Compat, +} + +impl FromStr for UnicodeDataDecompositionTag { + type Err = Error; + + fn from_str(s: &str) -> Result<UnicodeDataDecompositionTag, Error> { + use self::UnicodeDataDecompositionTag::*; + Ok(match s { + "font" => Font, + "noBreak" => NoBreak, + "initial" => Initial, + "medial" => Medial, + "final" => Final, + "isolated" => Isolated, + "circle" => Circle, + "super" => Super, + "sub" => Sub, + "vertical" => Vertical, + "wide" => Wide, + "narrow" => Narrow, + "small" => Small, + "square" => Square, + "fraction" => Fraction, + "compat" => Compat, + _ => return err!("invalid decomposition formatting tag: {}", s), + }) + } +} + +impl fmt::Display for UnicodeDataDecompositionTag { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use self::UnicodeDataDecompositionTag::*; + let s = match *self { + Font => "font", + NoBreak => "noBreak", + Initial => "initial", + Medial => "medial", + Final => "final", + Isolated => "isolated", + Circle => "circle", + Super => "super", + Sub => "sub", + Vertical => "vertical", + Wide => "wide", + Narrow => "narrow", + Small => "small", + Square => "square", + Fraction => "fraction", + Compat => "compat", + }; + write!(f, "{}", s) + } +} + +/// A numeric value corresponding to characters with `Numeric_Type=Numeric`. +/// +/// A numeric value can either be a signed integer or a rational number. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum UnicodeDataNumeric { + /// An integer. + Integer(i64), + /// A rational number. The first is the numerator and the latter is the + /// denominator. + Rational(i64, i64), +} + +impl FromStr for UnicodeDataNumeric { + type Err = Error; + + fn from_str(s: &str) -> Result<UnicodeDataNumeric, Error> { + if s.is_empty() { + return err!( + "expected non-empty string for UnicodeDataNumeric value"); + } + if let Some(pos) = s.find('/') { + let (snum, sden) = (&s[..pos], &s[pos+1..]); + let num = match snum.parse() { + Ok(num) => num, + Err(err) => { + return err!( + "invalid integer numerator '{}': {}", snum, err); + } + }; + let den = match sden.parse() { + Ok(den) => den, + Err(err) => { + return err!( + "invalid integer denominator '{}': {}", sden, err); + } + }; + Ok(UnicodeDataNumeric::Rational(num, den)) + } else { + match s.parse() { + Ok(den) => Ok(UnicodeDataNumeric::Integer(den)), + Err(err) => { + return err!( + "invalid integer denominator '{}': {}", s, err); + } + } + } + } +} + +impl fmt::Display for UnicodeDataNumeric { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + UnicodeDataNumeric::Integer(n) => write!(f, "{}", n), + UnicodeDataNumeric::Rational(n, d) => write!(f, "{}/{}", n, d), + } + } +} + +/// An iterator adapter that expands rows in `UnicodeData.txt`. +/// +/// Throughout `UnicodeData.txt`, some assigned codepoints are not explicitly +/// represented. Instead, they are represented by a pair of rows, indicating +/// a range of codepoints with the same properties. For example, the Hangul +/// syllable codepoints are represented by these two rows: +/// +/// ```ignore +/// AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; +/// D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; +/// ``` +/// +/// This iterator will wrap any iterator of `UnicodeData` and, when a range of +/// Unicode codepoints is found, it will be expanded to the appropriate +/// sequence of `UnicodeData` values. Note that all such expanded records will +/// have an empty name. +pub struct UnicodeDataExpander<I: Iterator> { + /// The underlying iterator. + it: iter::Peekable<I>, + /// A range of codepoints to emit when we've found a pair. Otherwise, + /// `None`. + range: CodepointRange, +} + +struct CodepointRange { + /// The codepoint range. + range: Range<u32>, + /// The start record. All subsequent records in this range are generated + /// by cloning this and updating the codepoint/name. + start_record: UnicodeData, +} + +impl<I: Iterator<Item=UnicodeData>> UnicodeDataExpander<I> { + /// Create a new iterator that expands pairs of `UnicodeData` range + /// records. All other records are passed through as-is. + pub fn new<T>(it: T) -> UnicodeDataExpander<I> + where T: IntoIterator<IntoIter=I, Item=I::Item> + { + UnicodeDataExpander { + it: it.into_iter().peekable(), + range: CodepointRange { + range: 0..0, + start_record: UnicodeData::default(), + }, + } + } +} + +impl<I: Iterator<Item=UnicodeData>> + Iterator for UnicodeDataExpander<I> +{ + type Item = UnicodeData; + + fn next(&mut self) -> Option<UnicodeData> { + if let Some(udata) = self.range.next() { + return Some(udata); + } + let row1 = match self.it.next() { + None => return None, + Some(row1) => row1, + }; + if !row1.is_range_start() + || !self.it.peek().map_or(false, |row2| row2.is_range_end()) + { + return Some(row1) + } + let row2 = self.it.next().unwrap(); + self.range = CodepointRange { + range: row1.codepoint.value()..(row2.codepoint.value() + 1), + start_record: row1, + }; + self.next() + } +} + +impl Iterator for CodepointRange { + type Item = UnicodeData; + + fn next(&mut self) -> Option<UnicodeData> { + let cp = match self.range.next() { + None => return None, + Some(cp) => cp, + }; + Some(UnicodeData { + codepoint: Codepoint::from_u32(cp).unwrap(), + name: "".to_string(), + ..self.start_record.clone() + }) + } +} + +#[cfg(test)] +mod tests { + use common::Codepoint; + + use super::{ + UnicodeData, UnicodeDataNumeric, + UnicodeDataDecomposition, UnicodeDataDecompositionTag, + }; + + fn codepoint(n: u32) -> Codepoint { + Codepoint::from_u32(n).unwrap() + } + + fn s(string: &str) -> String { + string.to_string() + } + + #[test] + fn parse1() { + let line = "249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;;\n"; + let data: UnicodeData = line.parse().unwrap(); + assert_eq!(data, UnicodeData { + codepoint: codepoint(0x249d), + name: s("PARENTHESIZED LATIN SMALL LETTER B"), + general_category: s("So"), + canonical_combining_class: 0, + bidi_class: s("L"), + decomposition: UnicodeDataDecomposition::new( + Some(UnicodeDataDecompositionTag::Compat), + &[codepoint(0x28), codepoint(0x62), codepoint(0x29)], + ).unwrap(), + numeric_type_decimal: None, + numeric_type_digit: None, + numeric_type_numeric: None, + bidi_mirrored: false, + unicode1_name: s(""), + iso_comment: s(""), + simple_uppercase_mapping: None, + simple_lowercase_mapping: None, + simple_titlecase_mapping: None, + }); + } + + #[test] + fn parse2() { + let line = "000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;;\n"; + let data: UnicodeData = line.parse().unwrap(); + assert_eq!(data, UnicodeData { + codepoint: codepoint(0x000D), + name: s("<control>"), + general_category: s("Cc"), + canonical_combining_class: 0, + bidi_class: s("B"), + decomposition: UnicodeDataDecomposition::new( + None, &[codepoint(0x000D)]).unwrap(), + numeric_type_decimal: None, + numeric_type_digit: None, + numeric_type_numeric: None, + bidi_mirrored: false, + unicode1_name: s("CARRIAGE RETURN (CR)"), + iso_comment: s(""), + simple_uppercase_mapping: None, + simple_lowercase_mapping: None, + simple_titlecase_mapping: None, + }); + } + + #[test] + fn parse3() { + let line = "00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;\n"; + let data: UnicodeData = line.parse().unwrap(); + assert_eq!(data, UnicodeData { + codepoint: codepoint(0x00BC), + name: s("VULGAR FRACTION ONE QUARTER"), + general_category: s("No"), + canonical_combining_class: 0, + bidi_class: s("ON"), + decomposition: UnicodeDataDecomposition::new( + Some(UnicodeDataDecompositionTag::Fraction), + &[codepoint(0x31), codepoint(0x2044), codepoint(0x34)], + ).unwrap(), + numeric_type_decimal: None, + numeric_type_digit: None, + numeric_type_numeric: Some(UnicodeDataNumeric::Rational(1, 4)), + bidi_mirrored: false, + unicode1_name: s("FRACTION ONE QUARTER"), + iso_comment: s(""), + simple_uppercase_mapping: None, + simple_lowercase_mapping: None, + simple_titlecase_mapping: None, + }); + } + + #[test] + fn parse4() { + let line = "0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;\n"; + let data: UnicodeData = line.parse().unwrap(); + assert_eq!(data, UnicodeData { + codepoint: codepoint(0x0041), + name: s("LATIN CAPITAL LETTER A"), + general_category: s("Lu"), + canonical_combining_class: 0, + bidi_class: s("L"), + decomposition: UnicodeDataDecomposition::new( + None, &[codepoint(0x0041)]).unwrap(), + numeric_type_decimal: None, + numeric_type_digit: None, + numeric_type_numeric: None, + bidi_mirrored: false, + unicode1_name: s(""), + iso_comment: s(""), + simple_uppercase_mapping: None, + simple_lowercase_mapping: Some(codepoint(0x0061)), + simple_titlecase_mapping: None, + }); + } + + #[test] + fn parse5() { + let line = "0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;;\n"; + let data: UnicodeData = line.parse().unwrap(); + assert_eq!(data, UnicodeData { + codepoint: codepoint(0x0F33), + name: s("TIBETAN DIGIT HALF ZERO"), + general_category: s("No"), + canonical_combining_class: 0, + bidi_class: s("L"), + decomposition: UnicodeDataDecomposition::new( + None, &[codepoint(0x0F33)]).unwrap(), + numeric_type_decimal: None, + numeric_type_digit: None, + numeric_type_numeric: Some(UnicodeDataNumeric::Rational(-1, 2)), + bidi_mirrored: false, + unicode1_name: s(""), + iso_comment: s(""), + simple_uppercase_mapping: None, + simple_lowercase_mapping: None, + simple_titlecase_mapping: None, + }); + } + + #[test] + fn expander() { + use common::UcdLineParser; + use super::UnicodeDataExpander; + + let data = "\ +ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; +D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; +D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; +"; + let records = UcdLineParser::new(None, data.as_bytes()) + .collect::<Result<Vec<_>, _>>() + .unwrap(); + assert_eq!(UnicodeDataExpander::new(records).count(), 11174); + } +} diff --git a/vendor/ucd-parse/src/word_break.rs b/vendor/ucd-parse/src/word_break.rs new file mode 100644 index 0000000000..d541e3f55e --- /dev/null +++ b/vendor/ucd-parse/src/word_break.rs @@ -0,0 +1,106 @@ +use std::path::Path; +use std::str::FromStr; + +use common::{ + UcdFile, UcdFileByCodepoint, Codepoints, CodepointIter, + parse_break_test, parse_codepoint_association, +}; +use error::Error; + +/// A single row in the `auxiliary/WordBreakProperty.txt` file. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct WordBreak { + /// The codepoint or codepoint range for this entry. + pub codepoints: Codepoints, + /// The property value assigned to the codepoints in this entry. + pub value: String, +} + +impl UcdFile for WordBreak { + fn relative_file_path() -> &'static Path { + Path::new("auxiliary/WordBreakProperty.txt") + } +} + +impl UcdFileByCodepoint for WordBreak { + fn codepoints(&self) -> CodepointIter { + self.codepoints.into_iter() + } +} + +impl FromStr for WordBreak { + type Err = Error; + + fn from_str(line: &str) -> Result<WordBreak, Error> { + let (codepoints, value) = parse_codepoint_association(line)?; + Ok(WordBreak { + codepoints: codepoints, + value: value.to_string(), + }) + } +} + +/// A single row in the `auxiliary/WordBreakTest.txt` file. +/// +/// This file defines tests for the word break algorithm. +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct WordBreakTest { + /// Each string is a UTF-8 encoded group of codepoints that make up a + /// single word. + pub words: Vec<String>, + /// A human readable description of this test. + pub comment: String, +} + +impl UcdFile for WordBreakTest { + fn relative_file_path() -> &'static Path { + Path::new("auxiliary/WordBreakTest.txt") + } +} + +impl FromStr for WordBreakTest { + type Err = Error; + + fn from_str(line: &str) -> Result<WordBreakTest, Error> { + let (groups, comment) = parse_break_test(line)?; + Ok(WordBreakTest { + words: groups, + comment: comment, + }) + } +} + +#[cfg(test)] +mod tests { + use super::{WordBreak, WordBreakTest}; + + #[test] + fn parse_single() { + let line = "0A83 ; Extend # Mc GUJARATI SIGN VISARGA\n"; + let row: WordBreak = line.parse().unwrap(); + assert_eq!(row.codepoints, 0x0A83); + assert_eq!(row.value, "Extend"); + } + + #[test] + fn parse_range() { + let line = "104A0..104A9 ; Numeric # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE\n"; + let row: WordBreak = line.parse().unwrap(); + assert_eq!(row.codepoints, (0x104A0, 0x104A9)); + assert_eq!(row.value, "Numeric"); + } + + #[test] + fn parse_test() { + let line = "÷ 0031 ÷ 0027 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3]"; + + let row: WordBreakTest = line.parse().unwrap(); + assert_eq!(row.words, vec![ + "\u{0031}", + "\u{0027}\u{0308}", + "\u{0061}", + "\u{0027}\u{2060}", + ]); + assert!(row.comment.contains("[4.0] COMBINING DIAERESIS (Extend_FE)")); + } +} diff --git a/vendor/unicode-normalization/.cargo-checksum.json b/vendor/unicode-normalization/.cargo-checksum.json index 09ceb112d2..6e3afbf442 100644 --- a/vendor/unicode-normalization/.cargo-checksum.json +++ b/vendor/unicode-normalization/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"de7af66ede1e1b369adcdf82174fd97782a26cf11d66deb2bdb518741675e15a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"4e01af0960f3a9abb8a06b64bc903d730a9b285098ec9a1af9bceb135d08a660","benches/bench.rs":"eb8b04b99ac55f8583893ff23385194002472e9b5182e3c74636b989caa163db","scripts/unicode.py":"06e074696ea85b24a82bcad360b7ec765e4bd9ebc574e722689ea2434e8a0548","src/decompose.rs":"7cf48297bfeace89e43e7a0402ca05f4d508c732bf7befddf63ad1e95d14c8c4","src/lib.rs":"5cb3d00fffe5c3cb8f0f1cb4317894946c93247e08f7c612275bfd8948db7a02","src/normalization_tests.rs":"de293b9aa396b1b4235b7bfb460e216e2dc874f4ee58bbf54458173e22363cb1","src/normalize.rs":"82f1a3511432349799b42a360ef4a993a4df7e492d88fdc918adf317317c0ed6","src/quick_check.rs":"73335b915e483604c7d10491bc925fda1bbd29e32ce5dd7529cbe4982034780a","src/recompose.rs":"bf04c41bbcfce4717944f1974b87b97619ba66ca7ebec86745dd53493564e170","src/stream_safe.rs":"18f48fbb6afaa6d75289fe1c473bf9e610e76b3119acf7358b1b12d77b0a85fa","src/tables.rs":"c9c0a7cbdd27c11eb444de215153ba02e08cb9cd485c09855005bf23d30f8502","src/test.rs":"5b51a97954f053c251181277faf7ca8ab8f1a7167104f535fbfad97568442571"},"package":"6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25"} \ No newline at end of file +{"files":{"COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"b023a2eb95f194646ea5597cc9e7e18989681e514925c52b4e0120b770c93577","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"9be318e157dce2d2a7c05f02be884fab1cb81b5818fb8a9a56b0cbbe23450181","benches/bench.rs":"1c6b332d38673345619a09c0016e19cb51318e581b0101770d46304dde8f1cc3","scripts/unicode.py":"e16c4a685517194a126db981a6745977e9f78768ddd5c08be2629746e2bac7d6","src/__test_api.rs":"8f225a10579391814d08cdbc7f09a35dfa825eee3c5ef063e8c7177b95953517","src/decompose.rs":"268fc76456db9fc7587458809880b3287d62cf2b9cc89e234237911600ea528b","src/lib.rs":"d80ce7045c78254316f14c5029aa8bfd37f46f4d7ae8af2a3ca23bed013e8be8","src/lookups.rs":"85a1b391c02c5dc0bb21573f96fc3273bf0e8195b1879293b9e03771d4b627c9","src/normalize.rs":"230ad4265299bb7ce327197f124ddcb224bd12253853bb523fa5523b02acd2db","src/perfect_hash.rs":"267dff34c6917d1b64c1ffad059e10c39ebf3f0b985e91aa3050e0808741d693","src/quick_check.rs":"0b30b4a1c2936b1e0de61762685cc20bea9a331f69d6bea4c2bd0f3f76d1fa4a","src/recompose.rs":"3dd361a545d4056d5d0889aaf4a34334fa1c32268d9aa2ee75c776c07599fcab","src/stream_safe.rs":"2eac6e956097808bdff426d42c8c794d56cbbf32acd5a1bbacdc58cb314b7e2d","src/tables.rs":"83736e2488e7f5e513317e035dfd476611248227efe0a456fddb8a641fe9ade6","src/test.rs":"4b42333f2494727bfd27cb79d86d9644372abf867101a73b92a07a03524be638"},"package":"b561e267b2326bb4cebfc0ef9e68355c7abe6c6f522aeac2f5bf95d56c59bdcf"} \ No newline at end of file diff --git a/vendor/unicode-normalization/Cargo.toml b/vendor/unicode-normalization/Cargo.toml index 8e643292fe..509dc464fc 100644 --- a/vendor/unicode-normalization/Cargo.toml +++ b/vendor/unicode-normalization/Cargo.toml @@ -3,7 +3,7 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies +# to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're @@ -12,13 +12,15 @@ [package] name = "unicode-normalization" -version = "0.1.7" +version = "0.1.11" authors = ["kwantam <kwantam@gmail.com>"] -exclude = ["target/*", "Cargo.lock", "scripts/tmp", "*.txt"] +exclude = ["target/*", "Cargo.lock", "scripts/tmp", "*.txt", "tests/*"] description = "This crate provides functions for normalization of\nUnicode strings, including Canonical and Compatible\nDecomposition and Recomposition, as described in\nUnicode Standard Annex #15.\n" homepage = "https://github.com/unicode-rs/unicode-normalization" -documentation = "https://unicode-rs.github.io/unicode-normalization" +documentation = "https://docs.rs/unicode-normalization/" readme = "README.md" keywords = ["text", "unicode", "normalization", "decomposition", "recomposition"] license = "MIT/Apache-2.0" repository = "https://github.com/unicode-rs/unicode-normalization" +[dependencies.smallvec] +version = "1.0" diff --git a/vendor/unicode-normalization/README.md b/vendor/unicode-normalization/README.md index 51b9e08524..4dbeb3dc66 100644 --- a/vendor/unicode-normalization/README.md +++ b/vendor/unicode-normalization/README.md @@ -1,10 +1,13 @@ +# unicode-normalization + +[![Build Status](https://travis-ci.org/unicode-rs/unicode-normalization.svg)](https://travis-ci.org/unicode-rs/unicode-normalization) +[![Docs](https://docs.rs/unicode-normalization/badge.svg)](https://docs.rs/unicode-normalization/) + Unicode character composition and decomposition utilities as described in [Unicode Standard Annex #15](http://www.unicode.org/reports/tr15/). -[![Build Status](https://travis-ci.org/unicode-rs/unicode-normalization.svg)](https://travis-ci.org/unicode-rs/unicode-normalization) - -[Documentation](https://unicode-rs.github.io/unicode-normalization/unicode_normalization/index.html) +This crate requires Rust 1.36+. ```rust extern crate unicode_normalization; @@ -21,12 +24,12 @@ fn main() { } ``` -# crates.io +## crates.io You can use this package in your project by adding the following to your `Cargo.toml`: ```toml [dependencies] -unicode-normalization = "0.1.7" +unicode-normalization = "0.1.8" ``` diff --git a/vendor/unicode-normalization/benches/bench.rs b/vendor/unicode-normalization/benches/bench.rs index 153012be1a..b3ea836603 100644 --- a/vendor/unicode-normalization/benches/bench.rs +++ b/vendor/unicode-normalization/benches/bench.rs @@ -3,6 +3,7 @@ extern crate unicode_normalization; extern crate test; +use std::fs; use test::Bencher; use unicode_normalization::UnicodeNormalization; @@ -80,6 +81,40 @@ fn bench_nfd_ascii(b: &mut Bencher) { b.iter(|| ASCII.nfd().count()); } +#[bench] +fn bench_nfc_long(b: &mut Bencher) { + let long = fs::read_to_string("benches/long.txt").unwrap(); + b.iter(|| long.nfc().count()); +} + +#[bench] +fn bench_nfd_long(b: &mut Bencher) { + let long = fs::read_to_string("benches/long.txt").unwrap(); + b.iter(|| long.nfd().count()); +} + +#[bench] +fn bench_nfkc_ascii(b: &mut Bencher) { + b.iter(|| ASCII.nfkc().count()); +} + +#[bench] +fn bench_nfkd_ascii(b: &mut Bencher) { + b.iter(|| ASCII.nfkd().count()); +} + +#[bench] +fn bench_nfkc_long(b: &mut Bencher) { + let long = fs::read_to_string("benches/long.txt").unwrap(); + b.iter(|| long.nfkc().count()); +} + +#[bench] +fn bench_nfkd_long(b: &mut Bencher) { + let long = fs::read_to_string("benches/long.txt").unwrap(); + b.iter(|| long.nfkd().count()); +} + #[bench] fn bench_streamsafe_ascii(b: &mut Bencher) { b.iter(|| ASCII.stream_safe().count()); diff --git a/vendor/unicode-normalization/scripts/unicode.py b/vendor/unicode-normalization/scripts/unicode.py index bc31279f03..d67fa6e11e 100644 --- a/vendor/unicode-normalization/scripts/unicode.py +++ b/vendor/unicode-normalization/scripts/unicode.py @@ -18,7 +18,7 @@ # Since this should not require frequent updates, we just store this # out-of-line and check the unicode.rs file into git. import collections -import requests +import urllib.request UNICODE_VERSION = "9.0.0" UCD_URL = "https://www.unicode.org/Public/%s/ucd/" % UNICODE_VERSION @@ -68,9 +68,9 @@ class UnicodeData(object): def stats(name, table): count = sum(len(v) for v in table.values()) - print "%s: %d chars => %d decomposed chars" % (name, len(table), count) + print("%s: %d chars => %d decomposed chars" % (name, len(table), count)) - print "Decomposition table stats:" + print("Decomposition table stats:") stats("Canonical decomp", self.canon_decomp) stats("Compatible decomp", self.compat_decomp) stats("Canonical fully decomp", self.canon_fully_decomp) @@ -79,8 +79,8 @@ class UnicodeData(object): self.ss_leading, self.ss_trailing = self._compute_stream_safe_tables() def _fetch(self, filename): - resp = requests.get(UCD_URL + filename) - return resp.text + resp = urllib.request.urlopen(UCD_URL + filename) + return resp.read().decode('utf-8') def _load_unicode_data(self): self.combining_classes = {} @@ -234,7 +234,7 @@ class UnicodeData(object): # need to store their overlap when they agree. When they don't agree, # store the decomposition in the compatibility table since we'll check # that first when normalizing to NFKD. - assert canon_fully_decomp <= compat_fully_decomp + assert set(canon_fully_decomp) <= set(compat_fully_decomp) for ch in set(canon_fully_decomp) & set(compat_fully_decomp): if canon_fully_decomp[ch] == compat_fully_decomp[ch]: @@ -284,27 +284,37 @@ class UnicodeData(object): return leading_nonstarters, trailing_nonstarters -hexify = lambda c: hex(c)[2:].upper().rjust(4, '0') +hexify = lambda c: '{:04X}'.format(c) -def gen_combining_class(combining_classes, out): - out.write("#[inline]\n") - out.write("pub fn canonical_combining_class(c: char) -> u8 {\n") - out.write(" match c {\n") - - for char, combining_class in sorted(combining_classes.items()): - out.write(" '\u{%s}' => %s,\n" % (hexify(char), combining_class)) +def gen_mph_data(name, d, kv_type, kv_callback): + (salt, keys) = minimal_perfect_hash(d) + out.write("pub(crate) const %s_SALT: &[u16] = &[\n" % name.upper()) + for s in salt: + out.write(" 0x{:x},\n".format(s)) + out.write("];\n") + out.write("pub(crate) const {}_KV: &[{}] = &[\n".format(name.upper(), kv_type)) + for k in keys: + out.write(" {},\n".format(kv_callback(k))) + out.write("];\n\n") - out.write(" _ => 0,\n") - out.write(" }\n") - out.write("}\n") +def gen_combining_class(combining_classes, out): + gen_mph_data('canonical_combining_class', combining_classes, 'u32', + lambda k: "0x{:X}".format(int(combining_classes[k]) | (k << 8))) def gen_composition_table(canon_comp, out): - out.write("#[inline]\n") - out.write("pub fn composition_table(c1: char, c2: char) -> Option<char> {\n") + table = {} + for (c1, c2), c3 in canon_comp.items(): + if c1 < 0x10000 and c2 < 0x10000: + table[(c1 << 16) | c2] = c3 + (salt, keys) = minimal_perfect_hash(table) + gen_mph_data('COMPOSITION_TABLE', table, '(u32, char)', + lambda k: "(0x%s, '\\u{%s}')" % (hexify(k), hexify(table[k]))) + + out.write("pub(crate) fn composition_table_astral(c1: char, c2: char) -> Option<char> {\n") out.write(" match (c1, c2) {\n") - for (c1, c2), c3 in sorted(canon_comp.items()): - out.write(" ('\u{%s}', '\u{%s}') => Some('\u{%s}'),\n" % (hexify(c1), hexify(c2), hexify(c3))) + if c1 >= 0x10000 and c2 >= 0x10000: + out.write(" ('\\u{%s}', '\\u{%s}') => Some('\\u{%s}'),\n" % (hexify(c1), hexify(c2), hexify(c3))) out.write(" _ => None,\n") out.write(" }\n") @@ -313,18 +323,9 @@ def gen_composition_table(canon_comp, out): def gen_decomposition_tables(canon_decomp, compat_decomp, out): tables = [(canon_decomp, 'canonical'), (compat_decomp, 'compatibility')] for table, name in tables: - out.write("#[inline]\n") - out.write("pub fn %s_fully_decomposed(c: char) -> Option<&'static [char]> {\n" % name) - out.write(" match c {\n") - - for char, chars in sorted(table.items()): - d = ", ".join("'\u{%s}'" % hexify(c) for c in chars) - out.write(" '\u{%s}' => Some(&[%s]),\n" % (hexify(char), d)) - - out.write(" _ => None,\n") - out.write(" }\n") - out.write("}\n") - out.write("\n") + gen_mph_data(name + '_decomposed', table, "(u32, &'static [char])", + lambda k: "(0x{:x}, &[{}])".format(k, + ", ".join("'\\u{%s}'" % hexify(c) for c in table[k]))) def gen_qc_match(prop_table, out): out.write(" match c {\n") @@ -343,51 +344,52 @@ def gen_qc_match(prop_table, out): def gen_nfc_qc(prop_tables, out): out.write("#[inline]\n") + out.write("#[allow(ellipsis_inclusive_range_patterns)]\n") out.write("pub fn qc_nfc(c: char) -> IsNormalized {\n") gen_qc_match(prop_tables['NFC_QC'], out) out.write("}\n") +def gen_nfkc_qc(prop_tables, out): + out.write("#[inline]\n") + out.write("#[allow(ellipsis_inclusive_range_patterns)]\n") + out.write("pub fn qc_nfkc(c: char) -> IsNormalized {\n") + gen_qc_match(prop_tables['NFKC_QC'], out) + out.write("}\n") + def gen_nfd_qc(prop_tables, out): out.write("#[inline]\n") + out.write("#[allow(ellipsis_inclusive_range_patterns)]\n") out.write("pub fn qc_nfd(c: char) -> IsNormalized {\n") gen_qc_match(prop_tables['NFD_QC'], out) out.write("}\n") -def gen_combining_mark(general_category_mark, out): +def gen_nfkd_qc(prop_tables, out): out.write("#[inline]\n") - out.write("pub fn is_combining_mark(c: char) -> bool {\n") - out.write(" match c {\n") - - for char in general_category_mark: - out.write(" '\u{%s}' => true,\n" % hexify(char)) - - out.write(" _ => false,\n") - out.write(" }\n") + out.write("#[allow(ellipsis_inclusive_range_patterns)]\n") + out.write("pub fn qc_nfkd(c: char) -> IsNormalized {\n") + gen_qc_match(prop_tables['NFKD_QC'], out) out.write("}\n") +def gen_combining_mark(general_category_mark, out): + gen_mph_data('combining_mark', general_category_mark, 'u32', + lambda k: '0x{:04x}'.format(k)) + def gen_stream_safe(leading, trailing, out): + # This could be done as a hash but the table is very small. out.write("#[inline]\n") out.write("pub fn stream_safe_leading_nonstarters(c: char) -> usize {\n") out.write(" match c {\n") - for char, num_leading in leading.items(): - out.write(" '\u{%s}' => %d,\n" % (hexify(char), num_leading)) + for char, num_leading in sorted(leading.items()): + out.write(" '\\u{%s}' => %d,\n" % (hexify(char), num_leading)) out.write(" _ => 0,\n") out.write(" }\n") out.write("}\n") out.write("\n") - out.write("#[inline]\n") - out.write("pub fn stream_safe_trailing_nonstarters(c: char) -> usize {\n") - out.write(" match c {\n") - - for char, num_trailing in trailing.items(): - out.write(" '\u{%s}' => %d,\n" % (hexify(char), num_trailing)) - - out.write(" _ => 0,\n") - out.write(" }\n") - out.write("}\n") + gen_mph_data('trailing_nonstarters', trailing, 'u32', + lambda k: "0x{:X}".format(int(trailing[k]) | (k << 8))) def gen_tests(tests, out): out.write("""#[derive(Debug)] @@ -402,7 +404,7 @@ pub struct NormalizationTest { """) out.write("pub const NORMALIZATION_TESTS: &[NormalizationTest] = &[\n") - str_literal = lambda s: '"%s"' % "".join("\u{%s}" % c for c in s) + str_literal = lambda s: '"%s"' % "".join("\\u{%s}" % c for c in s) for test in tests: out.write(" NormalizationTest {\n") @@ -415,9 +417,65 @@ pub struct NormalizationTest { out.write("];\n") +# Guaranteed to be less than n. +def my_hash(x, salt, n): + # This is hash based on the theory that multiplication is efficient + mask_32 = 0xffffffff + y = ((x + salt) * 2654435769) & mask_32 + y ^= (x * 0x31415926) & mask_32 + return (y * n) >> 32 + +# Compute minimal perfect hash function, d can be either a dict or list of keys. +def minimal_perfect_hash(d): + n = len(d) + buckets = dict((h, []) for h in range(n)) + for key in d: + h = my_hash(key, 0, n) + buckets[h].append(key) + bsorted = [(len(buckets[h]), h) for h in range(n)] + bsorted.sort(reverse = True) + claimed = [False] * n + salts = [0] * n + keys = [0] * n + for (bucket_size, h) in bsorted: + # Note: the traditional perfect hashing approach would also special-case + # bucket_size == 1 here and assign any empty slot, rather than iterating + # until rehash finds an empty slot. But we're not doing that so we can + # avoid the branch. + if bucket_size == 0: + break + else: + for salt in range(1, 32768): + rehashes = [my_hash(key, salt, n) for key in buckets[h]] + # Make sure there are no rehash collisions within this bucket. + if all(not claimed[hash] for hash in rehashes): + if len(set(rehashes)) < bucket_size: + continue + salts[h] = salt + for key in buckets[h]: + rehash = my_hash(key, salt, n) + claimed[rehash] = True + keys[rehash] = key + break + if salts[h] == 0: + print("minimal perfect hashing failed") + # Note: if this happens (because of unfortunate data), then there are + # a few things that could be done. First, the hash function could be + # tweaked. Second, the bucket order could be scrambled (especially the + # singletons). Right now, the buckets are sorted, which has the advantage + # of being deterministic. + # + # As a more extreme approach, the singleton bucket optimization could be + # applied (give the direct address for singleton buckets, rather than + # relying on a rehash). That is definitely the more standard approach in + # the minimal perfect hashing literature, but in testing the branch was a + # significant slowdown. + exit(1) + return (salts, keys) + if __name__ == '__main__': data = UnicodeData() - with open("tables.rs", "w") as out: + with open("tables.rs", "w", newline = "\n") as out: out.write(PREAMBLE) out.write("use quick_check::IsNormalized;\n") out.write("use quick_check::IsNormalized::*;\n") @@ -441,12 +499,18 @@ if __name__ == '__main__': gen_nfc_qc(data.norm_props, out) out.write("\n") + gen_nfkc_qc(data.norm_props, out) + out.write("\n") + gen_nfd_qc(data.norm_props, out) out.write("\n") + gen_nfkd_qc(data.norm_props, out) + out.write("\n") + gen_stream_safe(data.ss_leading, data.ss_trailing, out) out.write("\n") - with open("normalization_tests.rs", "w") as out: + with open("normalization_tests.rs", "w", newline = "\n") as out: out.write(PREAMBLE) gen_tests(data.norm_tests, out) diff --git a/vendor/unicode-normalization/src/__test_api.rs b/vendor/unicode-normalization/src/__test_api.rs new file mode 100644 index 0000000000..9deff6b39a --- /dev/null +++ b/vendor/unicode-normalization/src/__test_api.rs @@ -0,0 +1,13 @@ +// This crate comprises hacks and glue required to test private functions from tests/ +// +// Keep this as slim as possible. +// +// If you're caught using this outside this crates tests/, you get to clean up the mess. + +use crate::stream_safe::StreamSafe; +pub fn stream_safe(s: &str) -> String { + StreamSafe::new(s.chars()).collect() +} +pub mod quick_check { + pub use crate::quick_check::*; +} diff --git a/vendor/unicode-normalization/src/decompose.rs b/vendor/unicode-normalization/src/decompose.rs index eef43bd318..b4ef386b11 100644 --- a/vendor/unicode-normalization/src/decompose.rs +++ b/vendor/unicode-normalization/src/decompose.rs @@ -7,40 +7,42 @@ // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. +use smallvec::SmallVec; use std::fmt::{self, Write}; +use std::iter::Fuse; +use std::ops::Range; #[derive(Clone)] enum DecompositionType { Canonical, - Compatible + Compatible, } /// External iterator for a string decomposition's characters. #[derive(Clone)] pub struct Decompositions<I> { kind: DecompositionType, - iter: I, - done: bool, + iter: Fuse<I>, // This buffer stores pairs of (canonical combining class, character), // pushed onto the end in text order. // - // It's split into two contiguous regions by the `ready` offset. The first - // `ready` pairs are sorted and ready to emit on demand. The "pending" - // suffix afterwards still needs more characters for us to be able to sort - // in canonical order and is not safe to emit. - buffer: Vec<(u8, char)>, - ready: usize, + // It's divided into up to three sections: + // 1) A prefix that is free space; + // 2) "Ready" characters which are sorted and ready to emit on demand; + // 3) A "pending" block which stills needs more characters for us to be able + // to sort in canonical order and is not safe to emit. + buffer: SmallVec<[(u8, char); 4]>, + ready: Range<usize>, } #[inline] pub fn new_canonical<I: Iterator<Item=char>>(iter: I) -> Decompositions<I> { Decompositions { kind: self::DecompositionType::Canonical, - iter: iter, - done: false, - buffer: Vec::new(), - ready: 0, + iter: iter.fuse(), + buffer: SmallVec::new(), + ready: 0..0, } } @@ -48,10 +50,9 @@ pub fn new_canonical<I: Iterator<Item=char>>(iter: I) -> Decompositions<I> { pub fn new_compatible<I: Iterator<Item=char>>(iter: I) -> Decompositions<I> { Decompositions { kind: self::DecompositionType::Compatible, - iter: iter, - done: false, - buffer: Vec::new(), - ready: 0, + iter: iter.fuse(), + buffer: SmallVec::new(), + ready: 0..0, } } @@ -59,31 +60,41 @@ impl<I> Decompositions<I> { #[inline] fn push_back(&mut self, ch: char) { let class = super::char::canonical_combining_class(ch); + if class == 0 { self.sort_pending(); } + self.buffer.push((class, ch)); } #[inline] fn sort_pending(&mut self) { - if self.ready == 0 && self.buffer.is_empty() { - return; - } - // NB: `sort_by_key` is stable, so it will preserve the original text's // order within a combining class. - self.buffer[self.ready..].sort_by_key(|k| k.0); - self.ready = self.buffer.len(); + self.buffer[self.ready.end..].sort_by_key(|k| k.0); + self.ready.end = self.buffer.len(); + } + + #[inline] + fn reset_buffer(&mut self) { + // Equivalent to `self.buffer.drain(0..self.ready.end)` (if SmallVec + // supported this API) + let pending = self.buffer.len() - self.ready.end; + for i in 0..pending { + self.buffer[i] = self.buffer[i + self.ready.end]; + } + self.buffer.truncate(pending); + self.ready = 0..0; } #[inline] - fn pop_front(&mut self) -> Option<char> { - if self.ready == 0 { - None + fn increment_next_ready(&mut self) { + let next = self.ready.start + 1; + if next == self.ready.end { + self.reset_buffer(); } else { - self.ready -= 1; - Some(self.buffer.remove(0).1) + self.ready.start = next; } } } @@ -93,21 +104,43 @@ impl<I: Iterator<Item=char>> Iterator for Decompositions<I> { #[inline] fn next(&mut self) -> Option<char> { - while self.ready == 0 && !self.done { + while self.ready.end == 0 { match (self.iter.next(), &self.kind) { (Some(ch), &DecompositionType::Canonical) => { super::char::decompose_canonical(ch, |d| self.push_back(d)); - }, + } (Some(ch), &DecompositionType::Compatible) => { super::char::decompose_compatible(ch, |d| self.push_back(d)); - }, + } (None, _) => { - self.sort_pending(); - self.done = true; - }, + if self.buffer.is_empty() { + return None; + } else { + self.sort_pending(); + + // This implementation means that we can call `next` + // on an exhausted iterator; the last outer `next` call + // will result in an inner `next` call. To make this + // safe, we use `fuse`. + break; + } + } } } - self.pop_front() + + // We can assume here that, if `self.ready.end` is greater than zero, + // it's also greater than `self.ready.start`. That's because we only + // increment `self.ready.start` inside `increment_next_ready`, and + // whenever it reaches equality with `self.ready.end`, we reset both + // to zero, maintaining the invariant that: + // self.ready.start < self.ready.end || self.ready.end == self.ready.start == 0 + // + // This less-than-obviously-safe implementation is chosen for performance, + // minimizing the number & complexity of branches in `next` in the common + // case of buffering then unbuffering a single character with each call. + let (_, ch) = self.buffer[self.ready.start]; + self.increment_next_ready(); + Some(ch) } fn size_hint(&self) -> (usize, Option<usize>) { diff --git a/vendor/unicode-normalization/src/lib.rs b/vendor/unicode-normalization/src/lib.rs index 1f19df2f85..a86ade1f17 100644 --- a/vendor/unicode-normalization/src/lib.rs +++ b/vendor/unicode-normalization/src/lib.rs @@ -34,23 +34,29 @@ //! //! ```toml //! [dependencies] -//! unicode-normalization = "0.1.7" +//! unicode-normalization = "0.1.8" //! ``` #![deny(missing_docs, unsafe_code)] #![doc(html_logo_url = "https://unicode-rs.github.io/unicode-rs_sm.png", html_favicon_url = "https://unicode-rs.github.io/unicode-rs_sm.png")] +extern crate smallvec; + pub use tables::UNICODE_VERSION; pub use decompose::Decompositions; pub use quick_check::{ IsNormalized, is_nfc, is_nfc_quick, + is_nfkc, + is_nfkc_quick, is_nfc_stream_safe, is_nfc_stream_safe_quick, is_nfd, is_nfd_quick, + is_nfkd, + is_nfkd_quick, is_nfd_stream_safe, is_nfd_stream_safe_quick, }; @@ -59,7 +65,9 @@ pub use stream_safe::StreamSafe; use std::str::Chars; mod decompose; +mod lookups; mod normalize; +mod perfect_hash; mod recompose; mod quick_check; mod stream_safe; @@ -67,18 +75,14 @@ mod tables; #[cfg(test)] mod test; -#[cfg(test)] -mod normalization_tests; +#[doc(hidden)] +pub mod __test_api; /// Methods for composing and decomposing characters. pub mod char { pub use normalize::{decompose_canonical, decompose_compatible, compose}; - /// Look up the canonical combining class of a character. - pub use tables::canonical_combining_class; - - /// Return whether the given character is a combining mark (`General_Category=Mark`) - pub use tables::is_combining_mark; + pub use lookups::{canonical_combining_class, is_combining_mark}; } diff --git a/vendor/unicode-normalization/src/lookups.rs b/vendor/unicode-normalization/src/lookups.rs new file mode 100644 index 0000000000..edaa0a00cd --- /dev/null +++ b/vendor/unicode-normalization/src/lookups.rs @@ -0,0 +1,89 @@ +// Copyright 2019 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Lookups of unicode properties using minimal perfect hashing. + +use perfect_hash::mph_lookup; +use tables::*; + +/// Look up the canonical combining class for a codepoint. +/// +/// The value returned is as defined in the Unicode Character Database. +pub fn canonical_combining_class(c: char) -> u8 { + mph_lookup(c.into(), CANONICAL_COMBINING_CLASS_SALT, CANONICAL_COMBINING_CLASS_KV, + u8_lookup_fk, u8_lookup_fv, 0) +} + +pub(crate) fn composition_table(c1: char, c2: char) -> Option<char> { + if c1 < '\u{10000}' && c2 < '\u{10000}' { + mph_lookup((c1 as u32) << 16 | (c2 as u32), + COMPOSITION_TABLE_SALT, COMPOSITION_TABLE_KV, + pair_lookup_fk, pair_lookup_fv_opt, None) + } else { + composition_table_astral(c1, c2) + } +} + +pub(crate) fn canonical_fully_decomposed(c: char) -> Option<&'static [char]> { + mph_lookup(c.into(), CANONICAL_DECOMPOSED_SALT, CANONICAL_DECOMPOSED_KV, + pair_lookup_fk, pair_lookup_fv_opt, None) +} + +pub(crate) fn compatibility_fully_decomposed(c: char) -> Option<&'static [char]> { + mph_lookup(c.into(), COMPATIBILITY_DECOMPOSED_SALT, COMPATIBILITY_DECOMPOSED_KV, + pair_lookup_fk, pair_lookup_fv_opt, None) +} + +/// Return whether the given character is a combining mark (`General_Category=Mark`) +pub fn is_combining_mark(c: char) -> bool { + mph_lookup(c.into(), COMBINING_MARK_SALT, COMBINING_MARK_KV, + bool_lookup_fk, bool_lookup_fv, false) +} + +pub fn stream_safe_trailing_nonstarters(c: char) -> usize { + mph_lookup(c.into(), TRAILING_NONSTARTERS_SALT, TRAILING_NONSTARTERS_KV, + u8_lookup_fk, u8_lookup_fv, 0) as usize +} + +/// Extract the key in a 24 bit key and 8 bit value packed in a u32. +#[inline] +fn u8_lookup_fk(kv: u32) -> u32 { + kv >> 8 +} + +/// Extract the value in a 24 bit key and 8 bit value packed in a u32. +#[inline] +fn u8_lookup_fv(kv: u32) -> u8 { + (kv & 0xff) as u8 +} + +/// Extract the key for a boolean lookup. +#[inline] +fn bool_lookup_fk(kv: u32) -> u32 { + kv +} + +/// Extract the value for a boolean lookup. +#[inline] +fn bool_lookup_fv(_kv: u32) -> bool { + true +} + +/// Extract the key in a pair. +#[inline] +fn pair_lookup_fk<T>(kv: (u32, T)) -> u32 { + kv.0 +} + +/// Extract the value in a pair, returning an option. +#[inline] +fn pair_lookup_fv_opt<T>(kv: (u32, T)) -> Option<T> { + Some(kv.1) +} diff --git a/vendor/unicode-normalization/src/normalization_tests.rs b/vendor/unicode-normalization/src/normalization_tests.rs deleted file mode 100644 index bde232ffed..0000000000 --- a/vendor/unicode-normalization/src/normalization_tests.rs +++ /dev/null @@ -1,131078 +0,0 @@ -// Copyright 2012-2018 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// NOTE: The following code was generated by "scripts/unicode.py", do not edit directly - -#![allow(missing_docs)] -#[derive(Debug)] -pub struct NormalizationTest { - pub source: &'static str, - pub nfc: &'static str, - pub nfd: &'static str, - pub nfkc: &'static str, - pub nfkd: &'static str, -} - -pub const NORMALIZATION_TESTS: &[NormalizationTest] = &[ - NormalizationTest { - source: "\u{1E0A}", - nfc: "\u{1E0A}", - nfd: "\u{0044}\u{0307}", - nfkc: "\u{1E0A}", - nfkd: "\u{0044}\u{0307}", - }, - NormalizationTest { - source: "\u{1E0C}", - nfc: "\u{1E0C}", - nfd: "\u{0044}\u{0323}", - nfkc: "\u{1E0C}", - nfkd: "\u{0044}\u{0323}", - }, - NormalizationTest { - source: "\u{1E0A}\u{0323}", - nfc: "\u{1E0C}\u{0307}", - nfd: "\u{0044}\u{0323}\u{0307}", - nfkc: "\u{1E0C}\u{0307}", - nfkd: "\u{0044}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{1E0C}\u{0307}", - nfc: "\u{1E0C}\u{0307}", - nfd: "\u{0044}\u{0323}\u{0307}", - nfkc: "\u{1E0C}\u{0307}", - nfkd: "\u{0044}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{0044}\u{0307}\u{0323}", - nfc: "\u{1E0C}\u{0307}", - nfd: "\u{0044}\u{0323}\u{0307}", - nfkc: "\u{1E0C}\u{0307}", - nfkd: "\u{0044}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{0044}\u{0323}\u{0307}", - nfc: "\u{1E0C}\u{0307}", - nfd: "\u{0044}\u{0323}\u{0307}", - nfkc: "\u{1E0C}\u{0307}", - nfkd: "\u{0044}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{1E0A}\u{031B}", - nfc: "\u{1E0A}\u{031B}", - nfd: "\u{0044}\u{031B}\u{0307}", - nfkc: "\u{1E0A}\u{031B}", - nfkd: "\u{0044}\u{031B}\u{0307}", - }, - NormalizationTest { - source: "\u{1E0C}\u{031B}", - nfc: "\u{1E0C}\u{031B}", - nfd: "\u{0044}\u{031B}\u{0323}", - nfkc: "\u{1E0C}\u{031B}", - nfkd: "\u{0044}\u{031B}\u{0323}", - }, - NormalizationTest { - source: "\u{1E0A}\u{031B}\u{0323}", - nfc: "\u{1E0C}\u{031B}\u{0307}", - nfd: "\u{0044}\u{031B}\u{0323}\u{0307}", - nfkc: "\u{1E0C}\u{031B}\u{0307}", - nfkd: "\u{0044}\u{031B}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{1E0C}\u{031B}\u{0307}", - nfc: "\u{1E0C}\u{031B}\u{0307}", - nfd: "\u{0044}\u{031B}\u{0323}\u{0307}", - nfkc: "\u{1E0C}\u{031B}\u{0307}", - nfkd: "\u{0044}\u{031B}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{0044}\u{031B}\u{0307}\u{0323}", - nfc: "\u{1E0C}\u{031B}\u{0307}", - nfd: "\u{0044}\u{031B}\u{0323}\u{0307}", - nfkc: "\u{1E0C}\u{031B}\u{0307}", - nfkd: "\u{0044}\u{031B}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{0044}\u{031B}\u{0323}\u{0307}", - nfc: "\u{1E0C}\u{031B}\u{0307}", - nfd: "\u{0044}\u{031B}\u{0323}\u{0307}", - nfkc: "\u{1E0C}\u{031B}\u{0307}", - nfkd: "\u{0044}\u{031B}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{00C8}", - nfc: "\u{00C8}", - nfd: "\u{0045}\u{0300}", - nfkc: "\u{00C8}", - nfkd: "\u{0045}\u{0300}", - }, - NormalizationTest { - source: "\u{0112}", - nfc: "\u{0112}", - nfd: "\u{0045}\u{0304}", - nfkc: "\u{0112}", - nfkd: "\u{0045}\u{0304}", - }, - NormalizationTest { - source: "\u{0045}\u{0300}", - nfc: "\u{00C8}", - nfd: "\u{0045}\u{0300}", - nfkc: "\u{00C8}", - nfkd: "\u{0045}\u{0300}", - }, - NormalizationTest { - source: "\u{0045}\u{0304}", - nfc: "\u{0112}", - nfd: "\u{0045}\u{0304}", - nfkc: "\u{0112}", - nfkd: "\u{0045}\u{0304}", - }, - NormalizationTest { - source: "\u{1E14}", - nfc: "\u{1E14}", - nfd: "\u{0045}\u{0304}\u{0300}", - nfkc: "\u{1E14}", - nfkd: "\u{0045}\u{0304}\u{0300}", - }, - NormalizationTest { - source: "\u{0112}\u{0300}", - nfc: "\u{1E14}", - nfd: "\u{0045}\u{0304}\u{0300}", - nfkc: "\u{1E14}", - nfkd: "\u{0045}\u{0304}\u{0300}", - }, - NormalizationTest { - source: "\u{1E14}\u{0304}", - nfc: "\u{1E14}\u{0304}", - nfd: "\u{0045}\u{0304}\u{0300}\u{0304}", - nfkc: "\u{1E14}\u{0304}", - nfkd: "\u{0045}\u{0304}\u{0300}\u{0304}", - }, - NormalizationTest { - source: "\u{0045}\u{0304}\u{0300}", - nfc: "\u{1E14}", - nfd: "\u{0045}\u{0304}\u{0300}", - nfkc: "\u{1E14}", - nfkd: "\u{0045}\u{0304}\u{0300}", - }, - NormalizationTest { - source: "\u{0045}\u{0300}\u{0304}", - nfc: "\u{00C8}\u{0304}", - nfd: "\u{0045}\u{0300}\u{0304}", - nfkc: "\u{00C8}\u{0304}", - nfkd: "\u{0045}\u{0300}\u{0304}", - }, - NormalizationTest { - source: "\u{05B8}\u{05B9}\u{05B1}\u{0591}\u{05C3}\u{05B0}\u{05AC}\u{059F}", - nfc: "\u{05B1}\u{05B8}\u{05B9}\u{0591}\u{05C3}\u{05B0}\u{05AC}\u{059F}", - nfd: "\u{05B1}\u{05B8}\u{05B9}\u{0591}\u{05C3}\u{05B0}\u{05AC}\u{059F}", - nfkc: "\u{05B1}\u{05B8}\u{05B9}\u{0591}\u{05C3}\u{05B0}\u{05AC}\u{059F}", - nfkd: "\u{05B1}\u{05B8}\u{05B9}\u{0591}\u{05C3}\u{05B0}\u{05AC}\u{059F}", - }, - NormalizationTest { - source: "\u{0592}\u{05B7}\u{05BC}\u{05A5}\u{05B0}\u{05C0}\u{05C4}\u{05AD}", - nfc: "\u{05B0}\u{05B7}\u{05BC}\u{05A5}\u{0592}\u{05C0}\u{05AD}\u{05C4}", - nfd: "\u{05B0}\u{05B7}\u{05BC}\u{05A5}\u{0592}\u{05C0}\u{05AD}\u{05C4}", - nfkc: "\u{05B0}\u{05B7}\u{05BC}\u{05A5}\u{0592}\u{05C0}\u{05AD}\u{05C4}", - nfkd: "\u{05B0}\u{05B7}\u{05BC}\u{05A5}\u{0592}\u{05C0}\u{05AD}\u{05C4}", - }, - NormalizationTest { - source: "\u{1100}\u{AC00}\u{11A8}", - nfc: "\u{1100}\u{AC01}", - nfd: "\u{1100}\u{1100}\u{1161}\u{11A8}", - nfkc: "\u{1100}\u{AC01}", - nfkd: "\u{1100}\u{1100}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{1100}\u{AC00}\u{11A8}\u{11A8}", - nfc: "\u{1100}\u{AC01}\u{11A8}", - nfd: "\u{1100}\u{1100}\u{1161}\u{11A8}\u{11A8}", - nfkc: "\u{1100}\u{AC01}\u{11A8}", - nfkd: "\u{1100}\u{1100}\u{1161}\u{11A8}\u{11A8}", - }, - NormalizationTest { - source: "\u{00A0}", - nfc: "\u{00A0}", - nfd: "\u{00A0}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{00A8}", - nfc: "\u{00A8}", - nfd: "\u{00A8}", - nfkc: "\u{0020}\u{0308}", - nfkd: "\u{0020}\u{0308}", - }, - NormalizationTest { - source: "\u{00AA}", - nfc: "\u{00AA}", - nfd: "\u{00AA}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{00AF}", - nfc: "\u{00AF}", - nfd: "\u{00AF}", - nfkc: "\u{0020}\u{0304}", - nfkd: "\u{0020}\u{0304}", - }, - NormalizationTest { - source: "\u{00B2}", - nfc: "\u{00B2}", - nfd: "\u{00B2}", - nfkc: "\u{0032}", - nfkd: "\u{0032}", - }, - NormalizationTest { - source: "\u{00B3}", - nfc: "\u{00B3}", - nfd: "\u{00B3}", - nfkc: "\u{0033}", - nfkd: "\u{0033}", - }, - NormalizationTest { - source: "\u{00B4}", - nfc: "\u{00B4}", - nfd: "\u{00B4}", - nfkc: "\u{0020}\u{0301}", - nfkd: "\u{0020}\u{0301}", - }, - NormalizationTest { - source: "\u{00B5}", - nfc: "\u{00B5}", - nfd: "\u{00B5}", - nfkc: "\u{03BC}", - nfkd: "\u{03BC}", - }, - NormalizationTest { - source: "\u{00B8}", - nfc: "\u{00B8}", - nfd: "\u{00B8}", - nfkc: "\u{0020}\u{0327}", - nfkd: "\u{0020}\u{0327}", - }, - NormalizationTest { - source: "\u{00B9}", - nfc: "\u{00B9}", - nfd: "\u{00B9}", - nfkc: "\u{0031}", - nfkd: "\u{0031}", - }, - NormalizationTest { - source: "\u{00BA}", - nfc: "\u{00BA}", - nfd: "\u{00BA}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{00BC}", - nfc: "\u{00BC}", - nfd: "\u{00BC}", - nfkc: "\u{0031}\u{2044}\u{0034}", - nfkd: "\u{0031}\u{2044}\u{0034}", - }, - NormalizationTest { - source: "\u{00BD}", - nfc: "\u{00BD}", - nfd: "\u{00BD}", - nfkc: "\u{0031}\u{2044}\u{0032}", - nfkd: "\u{0031}\u{2044}\u{0032}", - }, - NormalizationTest { - source: "\u{00BE}", - nfc: "\u{00BE}", - nfd: "\u{00BE}", - nfkc: "\u{0033}\u{2044}\u{0034}", - nfkd: "\u{0033}\u{2044}\u{0034}", - }, - NormalizationTest { - source: "\u{00C0}", - nfc: "\u{00C0}", - nfd: "\u{0041}\u{0300}", - nfkc: "\u{00C0}", - nfkd: "\u{0041}\u{0300}", - }, - NormalizationTest { - source: "\u{00C1}", - nfc: "\u{00C1}", - nfd: "\u{0041}\u{0301}", - nfkc: "\u{00C1}", - nfkd: "\u{0041}\u{0301}", - }, - NormalizationTest { - source: "\u{00C2}", - nfc: "\u{00C2}", - nfd: "\u{0041}\u{0302}", - nfkc: "\u{00C2}", - nfkd: "\u{0041}\u{0302}", - }, - NormalizationTest { - source: "\u{00C3}", - nfc: "\u{00C3}", - nfd: "\u{0041}\u{0303}", - nfkc: "\u{00C3}", - nfkd: "\u{0041}\u{0303}", - }, - NormalizationTest { - source: "\u{00C4}", - nfc: "\u{00C4}", - nfd: "\u{0041}\u{0308}", - nfkc: "\u{00C4}", - nfkd: "\u{0041}\u{0308}", - }, - NormalizationTest { - source: "\u{00C5}", - nfc: "\u{00C5}", - nfd: "\u{0041}\u{030A}", - nfkc: "\u{00C5}", - nfkd: "\u{0041}\u{030A}", - }, - NormalizationTest { - source: "\u{00C7}", - nfc: "\u{00C7}", - nfd: "\u{0043}\u{0327}", - nfkc: "\u{00C7}", - nfkd: "\u{0043}\u{0327}", - }, - NormalizationTest { - source: "\u{00C8}", - nfc: "\u{00C8}", - nfd: "\u{0045}\u{0300}", - nfkc: "\u{00C8}", - nfkd: "\u{0045}\u{0300}", - }, - NormalizationTest { - source: "\u{00C9}", - nfc: "\u{00C9}", - nfd: "\u{0045}\u{0301}", - nfkc: "\u{00C9}", - nfkd: "\u{0045}\u{0301}", - }, - NormalizationTest { - source: "\u{00CA}", - nfc: "\u{00CA}", - nfd: "\u{0045}\u{0302}", - nfkc: "\u{00CA}", - nfkd: "\u{0045}\u{0302}", - }, - NormalizationTest { - source: "\u{00CB}", - nfc: "\u{00CB}", - nfd: "\u{0045}\u{0308}", - nfkc: "\u{00CB}", - nfkd: "\u{0045}\u{0308}", - }, - NormalizationTest { - source: "\u{00CC}", - nfc: "\u{00CC}", - nfd: "\u{0049}\u{0300}", - nfkc: "\u{00CC}", - nfkd: "\u{0049}\u{0300}", - }, - NormalizationTest { - source: "\u{00CD}", - nfc: "\u{00CD}", - nfd: "\u{0049}\u{0301}", - nfkc: "\u{00CD}", - nfkd: "\u{0049}\u{0301}", - }, - NormalizationTest { - source: "\u{00CE}", - nfc: "\u{00CE}", - nfd: "\u{0049}\u{0302}", - nfkc: "\u{00CE}", - nfkd: "\u{0049}\u{0302}", - }, - NormalizationTest { - source: "\u{00CF}", - nfc: "\u{00CF}", - nfd: "\u{0049}\u{0308}", - nfkc: "\u{00CF}", - nfkd: "\u{0049}\u{0308}", - }, - NormalizationTest { - source: "\u{00D1}", - nfc: "\u{00D1}", - nfd: "\u{004E}\u{0303}", - nfkc: "\u{00D1}", - nfkd: "\u{004E}\u{0303}", - }, - NormalizationTest { - source: "\u{00D2}", - nfc: "\u{00D2}", - nfd: "\u{004F}\u{0300}", - nfkc: "\u{00D2}", - nfkd: "\u{004F}\u{0300}", - }, - NormalizationTest { - source: "\u{00D3}", - nfc: "\u{00D3}", - nfd: "\u{004F}\u{0301}", - nfkc: "\u{00D3}", - nfkd: "\u{004F}\u{0301}", - }, - NormalizationTest { - source: "\u{00D4}", - nfc: "\u{00D4}", - nfd: "\u{004F}\u{0302}", - nfkc: "\u{00D4}", - nfkd: "\u{004F}\u{0302}", - }, - NormalizationTest { - source: "\u{00D5}", - nfc: "\u{00D5}", - nfd: "\u{004F}\u{0303}", - nfkc: "\u{00D5}", - nfkd: "\u{004F}\u{0303}", - }, - NormalizationTest { - source: "\u{00D6}", - nfc: "\u{00D6}", - nfd: "\u{004F}\u{0308}", - nfkc: "\u{00D6}", - nfkd: "\u{004F}\u{0308}", - }, - NormalizationTest { - source: "\u{00D9}", - nfc: "\u{00D9}", - nfd: "\u{0055}\u{0300}", - nfkc: "\u{00D9}", - nfkd: "\u{0055}\u{0300}", - }, - NormalizationTest { - source: "\u{00DA}", - nfc: "\u{00DA}", - nfd: "\u{0055}\u{0301}", - nfkc: "\u{00DA}", - nfkd: "\u{0055}\u{0301}", - }, - NormalizationTest { - source: "\u{00DB}", - nfc: "\u{00DB}", - nfd: "\u{0055}\u{0302}", - nfkc: "\u{00DB}", - nfkd: "\u{0055}\u{0302}", - }, - NormalizationTest { - source: "\u{00DC}", - nfc: "\u{00DC}", - nfd: "\u{0055}\u{0308}", - nfkc: "\u{00DC}", - nfkd: "\u{0055}\u{0308}", - }, - NormalizationTest { - source: "\u{00DD}", - nfc: "\u{00DD}", - nfd: "\u{0059}\u{0301}", - nfkc: "\u{00DD}", - nfkd: "\u{0059}\u{0301}", - }, - NormalizationTest { - source: "\u{00E0}", - nfc: "\u{00E0}", - nfd: "\u{0061}\u{0300}", - nfkc: "\u{00E0}", - nfkd: "\u{0061}\u{0300}", - }, - NormalizationTest { - source: "\u{00E1}", - nfc: "\u{00E1}", - nfd: "\u{0061}\u{0301}", - nfkc: "\u{00E1}", - nfkd: "\u{0061}\u{0301}", - }, - NormalizationTest { - source: "\u{00E2}", - nfc: "\u{00E2}", - nfd: "\u{0061}\u{0302}", - nfkc: "\u{00E2}", - nfkd: "\u{0061}\u{0302}", - }, - NormalizationTest { - source: "\u{00E3}", - nfc: "\u{00E3}", - nfd: "\u{0061}\u{0303}", - nfkc: "\u{00E3}", - nfkd: "\u{0061}\u{0303}", - }, - NormalizationTest { - source: "\u{00E4}", - nfc: "\u{00E4}", - nfd: "\u{0061}\u{0308}", - nfkc: "\u{00E4}", - nfkd: "\u{0061}\u{0308}", - }, - NormalizationTest { - source: "\u{00E5}", - nfc: "\u{00E5}", - nfd: "\u{0061}\u{030A}", - nfkc: "\u{00E5}", - nfkd: "\u{0061}\u{030A}", - }, - NormalizationTest { - source: "\u{00E7}", - nfc: "\u{00E7}", - nfd: "\u{0063}\u{0327}", - nfkc: "\u{00E7}", - nfkd: "\u{0063}\u{0327}", - }, - NormalizationTest { - source: "\u{00E8}", - nfc: "\u{00E8}", - nfd: "\u{0065}\u{0300}", - nfkc: "\u{00E8}", - nfkd: "\u{0065}\u{0300}", - }, - NormalizationTest { - source: "\u{00E9}", - nfc: "\u{00E9}", - nfd: "\u{0065}\u{0301}", - nfkc: "\u{00E9}", - nfkd: "\u{0065}\u{0301}", - }, - NormalizationTest { - source: "\u{00EA}", - nfc: "\u{00EA}", - nfd: "\u{0065}\u{0302}", - nfkc: "\u{00EA}", - nfkd: "\u{0065}\u{0302}", - }, - NormalizationTest { - source: "\u{00EB}", - nfc: "\u{00EB}", - nfd: "\u{0065}\u{0308}", - nfkc: "\u{00EB}", - nfkd: "\u{0065}\u{0308}", - }, - NormalizationTest { - source: "\u{00EC}", - nfc: "\u{00EC}", - nfd: "\u{0069}\u{0300}", - nfkc: "\u{00EC}", - nfkd: "\u{0069}\u{0300}", - }, - NormalizationTest { - source: "\u{00ED}", - nfc: "\u{00ED}", - nfd: "\u{0069}\u{0301}", - nfkc: "\u{00ED}", - nfkd: "\u{0069}\u{0301}", - }, - NormalizationTest { - source: "\u{00EE}", - nfc: "\u{00EE}", - nfd: "\u{0069}\u{0302}", - nfkc: "\u{00EE}", - nfkd: "\u{0069}\u{0302}", - }, - NormalizationTest { - source: "\u{00EF}", - nfc: "\u{00EF}", - nfd: "\u{0069}\u{0308}", - nfkc: "\u{00EF}", - nfkd: "\u{0069}\u{0308}", - }, - NormalizationTest { - source: "\u{00F1}", - nfc: "\u{00F1}", - nfd: "\u{006E}\u{0303}", - nfkc: "\u{00F1}", - nfkd: "\u{006E}\u{0303}", - }, - NormalizationTest { - source: "\u{00F2}", - nfc: "\u{00F2}", - nfd: "\u{006F}\u{0300}", - nfkc: "\u{00F2}", - nfkd: "\u{006F}\u{0300}", - }, - NormalizationTest { - source: "\u{00F3}", - nfc: "\u{00F3}", - nfd: "\u{006F}\u{0301}", - nfkc: "\u{00F3}", - nfkd: "\u{006F}\u{0301}", - }, - NormalizationTest { - source: "\u{00F4}", - nfc: "\u{00F4}", - nfd: "\u{006F}\u{0302}", - nfkc: "\u{00F4}", - nfkd: "\u{006F}\u{0302}", - }, - NormalizationTest { - source: "\u{00F5}", - nfc: "\u{00F5}", - nfd: "\u{006F}\u{0303}", - nfkc: "\u{00F5}", - nfkd: "\u{006F}\u{0303}", - }, - NormalizationTest { - source: "\u{00F6}", - nfc: "\u{00F6}", - nfd: "\u{006F}\u{0308}", - nfkc: "\u{00F6}", - nfkd: "\u{006F}\u{0308}", - }, - NormalizationTest { - source: "\u{00F9}", - nfc: "\u{00F9}", - nfd: "\u{0075}\u{0300}", - nfkc: "\u{00F9}", - nfkd: "\u{0075}\u{0300}", - }, - NormalizationTest { - source: "\u{00FA}", - nfc: "\u{00FA}", - nfd: "\u{0075}\u{0301}", - nfkc: "\u{00FA}", - nfkd: "\u{0075}\u{0301}", - }, - NormalizationTest { - source: "\u{00FB}", - nfc: "\u{00FB}", - nfd: "\u{0075}\u{0302}", - nfkc: "\u{00FB}", - nfkd: "\u{0075}\u{0302}", - }, - NormalizationTest { - source: "\u{00FC}", - nfc: "\u{00FC}", - nfd: "\u{0075}\u{0308}", - nfkc: "\u{00FC}", - nfkd: "\u{0075}\u{0308}", - }, - NormalizationTest { - source: "\u{00FD}", - nfc: "\u{00FD}", - nfd: "\u{0079}\u{0301}", - nfkc: "\u{00FD}", - nfkd: "\u{0079}\u{0301}", - }, - NormalizationTest { - source: "\u{00FF}", - nfc: "\u{00FF}", - nfd: "\u{0079}\u{0308}", - nfkc: "\u{00FF}", - nfkd: "\u{0079}\u{0308}", - }, - NormalizationTest { - source: "\u{0100}", - nfc: "\u{0100}", - nfd: "\u{0041}\u{0304}", - nfkc: "\u{0100}", - nfkd: "\u{0041}\u{0304}", - }, - NormalizationTest { - source: "\u{0101}", - nfc: "\u{0101}", - nfd: "\u{0061}\u{0304}", - nfkc: "\u{0101}", - nfkd: "\u{0061}\u{0304}", - }, - NormalizationTest { - source: "\u{0102}", - nfc: "\u{0102}", - nfd: "\u{0041}\u{0306}", - nfkc: "\u{0102}", - nfkd: "\u{0041}\u{0306}", - }, - NormalizationTest { - source: "\u{0103}", - nfc: "\u{0103}", - nfd: "\u{0061}\u{0306}", - nfkc: "\u{0103}", - nfkd: "\u{0061}\u{0306}", - }, - NormalizationTest { - source: "\u{0104}", - nfc: "\u{0104}", - nfd: "\u{0041}\u{0328}", - nfkc: "\u{0104}", - nfkd: "\u{0041}\u{0328}", - }, - NormalizationTest { - source: "\u{0105}", - nfc: "\u{0105}", - nfd: "\u{0061}\u{0328}", - nfkc: "\u{0105}", - nfkd: "\u{0061}\u{0328}", - }, - NormalizationTest { - source: "\u{0106}", - nfc: "\u{0106}", - nfd: "\u{0043}\u{0301}", - nfkc: "\u{0106}", - nfkd: "\u{0043}\u{0301}", - }, - NormalizationTest { - source: "\u{0107}", - nfc: "\u{0107}", - nfd: "\u{0063}\u{0301}", - nfkc: "\u{0107}", - nfkd: "\u{0063}\u{0301}", - }, - NormalizationTest { - source: "\u{0108}", - nfc: "\u{0108}", - nfd: "\u{0043}\u{0302}", - nfkc: "\u{0108}", - nfkd: "\u{0043}\u{0302}", - }, - NormalizationTest { - source: "\u{0109}", - nfc: "\u{0109}", - nfd: "\u{0063}\u{0302}", - nfkc: "\u{0109}", - nfkd: "\u{0063}\u{0302}", - }, - NormalizationTest { - source: "\u{010A}", - nfc: "\u{010A}", - nfd: "\u{0043}\u{0307}", - nfkc: "\u{010A}", - nfkd: "\u{0043}\u{0307}", - }, - NormalizationTest { - source: "\u{010B}", - nfc: "\u{010B}", - nfd: "\u{0063}\u{0307}", - nfkc: "\u{010B}", - nfkd: "\u{0063}\u{0307}", - }, - NormalizationTest { - source: "\u{010C}", - nfc: "\u{010C}", - nfd: "\u{0043}\u{030C}", - nfkc: "\u{010C}", - nfkd: "\u{0043}\u{030C}", - }, - NormalizationTest { - source: "\u{010D}", - nfc: "\u{010D}", - nfd: "\u{0063}\u{030C}", - nfkc: "\u{010D}", - nfkd: "\u{0063}\u{030C}", - }, - NormalizationTest { - source: "\u{010E}", - nfc: "\u{010E}", - nfd: "\u{0044}\u{030C}", - nfkc: "\u{010E}", - nfkd: "\u{0044}\u{030C}", - }, - NormalizationTest { - source: "\u{010F}", - nfc: "\u{010F}", - nfd: "\u{0064}\u{030C}", - nfkc: "\u{010F}", - nfkd: "\u{0064}\u{030C}", - }, - NormalizationTest { - source: "\u{0112}", - nfc: "\u{0112}", - nfd: "\u{0045}\u{0304}", - nfkc: "\u{0112}", - nfkd: "\u{0045}\u{0304}", - }, - NormalizationTest { - source: "\u{0113}", - nfc: "\u{0113}", - nfd: "\u{0065}\u{0304}", - nfkc: "\u{0113}", - nfkd: "\u{0065}\u{0304}", - }, - NormalizationTest { - source: "\u{0114}", - nfc: "\u{0114}", - nfd: "\u{0045}\u{0306}", - nfkc: "\u{0114}", - nfkd: "\u{0045}\u{0306}", - }, - NormalizationTest { - source: "\u{0115}", - nfc: "\u{0115}", - nfd: "\u{0065}\u{0306}", - nfkc: "\u{0115}", - nfkd: "\u{0065}\u{0306}", - }, - NormalizationTest { - source: "\u{0116}", - nfc: "\u{0116}", - nfd: "\u{0045}\u{0307}", - nfkc: "\u{0116}", - nfkd: "\u{0045}\u{0307}", - }, - NormalizationTest { - source: "\u{0117}", - nfc: "\u{0117}", - nfd: "\u{0065}\u{0307}", - nfkc: "\u{0117}", - nfkd: "\u{0065}\u{0307}", - }, - NormalizationTest { - source: "\u{0118}", - nfc: "\u{0118}", - nfd: "\u{0045}\u{0328}", - nfkc: "\u{0118}", - nfkd: "\u{0045}\u{0328}", - }, - NormalizationTest { - source: "\u{0119}", - nfc: "\u{0119}", - nfd: "\u{0065}\u{0328}", - nfkc: "\u{0119}", - nfkd: "\u{0065}\u{0328}", - }, - NormalizationTest { - source: "\u{011A}", - nfc: "\u{011A}", - nfd: "\u{0045}\u{030C}", - nfkc: "\u{011A}", - nfkd: "\u{0045}\u{030C}", - }, - NormalizationTest { - source: "\u{011B}", - nfc: "\u{011B}", - nfd: "\u{0065}\u{030C}", - nfkc: "\u{011B}", - nfkd: "\u{0065}\u{030C}", - }, - NormalizationTest { - source: "\u{011C}", - nfc: "\u{011C}", - nfd: "\u{0047}\u{0302}", - nfkc: "\u{011C}", - nfkd: "\u{0047}\u{0302}", - }, - NormalizationTest { - source: "\u{011D}", - nfc: "\u{011D}", - nfd: "\u{0067}\u{0302}", - nfkc: "\u{011D}", - nfkd: "\u{0067}\u{0302}", - }, - NormalizationTest { - source: "\u{011E}", - nfc: "\u{011E}", - nfd: "\u{0047}\u{0306}", - nfkc: "\u{011E}", - nfkd: "\u{0047}\u{0306}", - }, - NormalizationTest { - source: "\u{011F}", - nfc: "\u{011F}", - nfd: "\u{0067}\u{0306}", - nfkc: "\u{011F}", - nfkd: "\u{0067}\u{0306}", - }, - NormalizationTest { - source: "\u{0120}", - nfc: "\u{0120}", - nfd: "\u{0047}\u{0307}", - nfkc: "\u{0120}", - nfkd: "\u{0047}\u{0307}", - }, - NormalizationTest { - source: "\u{0121}", - nfc: "\u{0121}", - nfd: "\u{0067}\u{0307}", - nfkc: "\u{0121}", - nfkd: "\u{0067}\u{0307}", - }, - NormalizationTest { - source: "\u{0122}", - nfc: "\u{0122}", - nfd: "\u{0047}\u{0327}", - nfkc: "\u{0122}", - nfkd: "\u{0047}\u{0327}", - }, - NormalizationTest { - source: "\u{0123}", - nfc: "\u{0123}", - nfd: "\u{0067}\u{0327}", - nfkc: "\u{0123}", - nfkd: "\u{0067}\u{0327}", - }, - NormalizationTest { - source: "\u{0124}", - nfc: "\u{0124}", - nfd: "\u{0048}\u{0302}", - nfkc: "\u{0124}", - nfkd: "\u{0048}\u{0302}", - }, - NormalizationTest { - source: "\u{0125}", - nfc: "\u{0125}", - nfd: "\u{0068}\u{0302}", - nfkc: "\u{0125}", - nfkd: "\u{0068}\u{0302}", - }, - NormalizationTest { - source: "\u{0128}", - nfc: "\u{0128}", - nfd: "\u{0049}\u{0303}", - nfkc: "\u{0128}", - nfkd: "\u{0049}\u{0303}", - }, - NormalizationTest { - source: "\u{0129}", - nfc: "\u{0129}", - nfd: "\u{0069}\u{0303}", - nfkc: "\u{0129}", - nfkd: "\u{0069}\u{0303}", - }, - NormalizationTest { - source: "\u{012A}", - nfc: "\u{012A}", - nfd: "\u{0049}\u{0304}", - nfkc: "\u{012A}", - nfkd: "\u{0049}\u{0304}", - }, - NormalizationTest { - source: "\u{012B}", - nfc: "\u{012B}", - nfd: "\u{0069}\u{0304}", - nfkc: "\u{012B}", - nfkd: "\u{0069}\u{0304}", - }, - NormalizationTest { - source: "\u{012C}", - nfc: "\u{012C}", - nfd: "\u{0049}\u{0306}", - nfkc: "\u{012C}", - nfkd: "\u{0049}\u{0306}", - }, - NormalizationTest { - source: "\u{012D}", - nfc: "\u{012D}", - nfd: "\u{0069}\u{0306}", - nfkc: "\u{012D}", - nfkd: "\u{0069}\u{0306}", - }, - NormalizationTest { - source: "\u{012E}", - nfc: "\u{012E}", - nfd: "\u{0049}\u{0328}", - nfkc: "\u{012E}", - nfkd: "\u{0049}\u{0328}", - }, - NormalizationTest { - source: "\u{012F}", - nfc: "\u{012F}", - nfd: "\u{0069}\u{0328}", - nfkc: "\u{012F}", - nfkd: "\u{0069}\u{0328}", - }, - NormalizationTest { - source: "\u{0130}", - nfc: "\u{0130}", - nfd: "\u{0049}\u{0307}", - nfkc: "\u{0130}", - nfkd: "\u{0049}\u{0307}", - }, - NormalizationTest { - source: "\u{0132}", - nfc: "\u{0132}", - nfd: "\u{0132}", - nfkc: "\u{0049}\u{004A}", - nfkd: "\u{0049}\u{004A}", - }, - NormalizationTest { - source: "\u{0133}", - nfc: "\u{0133}", - nfd: "\u{0133}", - nfkc: "\u{0069}\u{006A}", - nfkd: "\u{0069}\u{006A}", - }, - NormalizationTest { - source: "\u{0134}", - nfc: "\u{0134}", - nfd: "\u{004A}\u{0302}", - nfkc: "\u{0134}", - nfkd: "\u{004A}\u{0302}", - }, - NormalizationTest { - source: "\u{0135}", - nfc: "\u{0135}", - nfd: "\u{006A}\u{0302}", - nfkc: "\u{0135}", - nfkd: "\u{006A}\u{0302}", - }, - NormalizationTest { - source: "\u{0136}", - nfc: "\u{0136}", - nfd: "\u{004B}\u{0327}", - nfkc: "\u{0136}", - nfkd: "\u{004B}\u{0327}", - }, - NormalizationTest { - source: "\u{0137}", - nfc: "\u{0137}", - nfd: "\u{006B}\u{0327}", - nfkc: "\u{0137}", - nfkd: "\u{006B}\u{0327}", - }, - NormalizationTest { - source: "\u{0139}", - nfc: "\u{0139}", - nfd: "\u{004C}\u{0301}", - nfkc: "\u{0139}", - nfkd: "\u{004C}\u{0301}", - }, - NormalizationTest { - source: "\u{013A}", - nfc: "\u{013A}", - nfd: "\u{006C}\u{0301}", - nfkc: "\u{013A}", - nfkd: "\u{006C}\u{0301}", - }, - NormalizationTest { - source: "\u{013B}", - nfc: "\u{013B}", - nfd: "\u{004C}\u{0327}", - nfkc: "\u{013B}", - nfkd: "\u{004C}\u{0327}", - }, - NormalizationTest { - source: "\u{013C}", - nfc: "\u{013C}", - nfd: "\u{006C}\u{0327}", - nfkc: "\u{013C}", - nfkd: "\u{006C}\u{0327}", - }, - NormalizationTest { - source: "\u{013D}", - nfc: "\u{013D}", - nfd: "\u{004C}\u{030C}", - nfkc: "\u{013D}", - nfkd: "\u{004C}\u{030C}", - }, - NormalizationTest { - source: "\u{013E}", - nfc: "\u{013E}", - nfd: "\u{006C}\u{030C}", - nfkc: "\u{013E}", - nfkd: "\u{006C}\u{030C}", - }, - NormalizationTest { - source: "\u{013F}", - nfc: "\u{013F}", - nfd: "\u{013F}", - nfkc: "\u{004C}\u{00B7}", - nfkd: "\u{004C}\u{00B7}", - }, - NormalizationTest { - source: "\u{0140}", - nfc: "\u{0140}", - nfd: "\u{0140}", - nfkc: "\u{006C}\u{00B7}", - nfkd: "\u{006C}\u{00B7}", - }, - NormalizationTest { - source: "\u{0143}", - nfc: "\u{0143}", - nfd: "\u{004E}\u{0301}", - nfkc: "\u{0143}", - nfkd: "\u{004E}\u{0301}", - }, - NormalizationTest { - source: "\u{0144}", - nfc: "\u{0144}", - nfd: "\u{006E}\u{0301}", - nfkc: "\u{0144}", - nfkd: "\u{006E}\u{0301}", - }, - NormalizationTest { - source: "\u{0145}", - nfc: "\u{0145}", - nfd: "\u{004E}\u{0327}", - nfkc: "\u{0145}", - nfkd: "\u{004E}\u{0327}", - }, - NormalizationTest { - source: "\u{0146}", - nfc: "\u{0146}", - nfd: "\u{006E}\u{0327}", - nfkc: "\u{0146}", - nfkd: "\u{006E}\u{0327}", - }, - NormalizationTest { - source: "\u{0147}", - nfc: "\u{0147}", - nfd: "\u{004E}\u{030C}", - nfkc: "\u{0147}", - nfkd: "\u{004E}\u{030C}", - }, - NormalizationTest { - source: "\u{0148}", - nfc: "\u{0148}", - nfd: "\u{006E}\u{030C}", - nfkc: "\u{0148}", - nfkd: "\u{006E}\u{030C}", - }, - NormalizationTest { - source: "\u{0149}", - nfc: "\u{0149}", - nfd: "\u{0149}", - nfkc: "\u{02BC}\u{006E}", - nfkd: "\u{02BC}\u{006E}", - }, - NormalizationTest { - source: "\u{014C}", - nfc: "\u{014C}", - nfd: "\u{004F}\u{0304}", - nfkc: "\u{014C}", - nfkd: "\u{004F}\u{0304}", - }, - NormalizationTest { - source: "\u{014D}", - nfc: "\u{014D}", - nfd: "\u{006F}\u{0304}", - nfkc: "\u{014D}", - nfkd: "\u{006F}\u{0304}", - }, - NormalizationTest { - source: "\u{014E}", - nfc: "\u{014E}", - nfd: "\u{004F}\u{0306}", - nfkc: "\u{014E}", - nfkd: "\u{004F}\u{0306}", - }, - NormalizationTest { - source: "\u{014F}", - nfc: "\u{014F}", - nfd: "\u{006F}\u{0306}", - nfkc: "\u{014F}", - nfkd: "\u{006F}\u{0306}", - }, - NormalizationTest { - source: "\u{0150}", - nfc: "\u{0150}", - nfd: "\u{004F}\u{030B}", - nfkc: "\u{0150}", - nfkd: "\u{004F}\u{030B}", - }, - NormalizationTest { - source: "\u{0151}", - nfc: "\u{0151}", - nfd: "\u{006F}\u{030B}", - nfkc: "\u{0151}", - nfkd: "\u{006F}\u{030B}", - }, - NormalizationTest { - source: "\u{0154}", - nfc: "\u{0154}", - nfd: "\u{0052}\u{0301}", - nfkc: "\u{0154}", - nfkd: "\u{0052}\u{0301}", - }, - NormalizationTest { - source: "\u{0155}", - nfc: "\u{0155}", - nfd: "\u{0072}\u{0301}", - nfkc: "\u{0155}", - nfkd: "\u{0072}\u{0301}", - }, - NormalizationTest { - source: "\u{0156}", - nfc: "\u{0156}", - nfd: "\u{0052}\u{0327}", - nfkc: "\u{0156}", - nfkd: "\u{0052}\u{0327}", - }, - NormalizationTest { - source: "\u{0157}", - nfc: "\u{0157}", - nfd: "\u{0072}\u{0327}", - nfkc: "\u{0157}", - nfkd: "\u{0072}\u{0327}", - }, - NormalizationTest { - source: "\u{0158}", - nfc: "\u{0158}", - nfd: "\u{0052}\u{030C}", - nfkc: "\u{0158}", - nfkd: "\u{0052}\u{030C}", - }, - NormalizationTest { - source: "\u{0159}", - nfc: "\u{0159}", - nfd: "\u{0072}\u{030C}", - nfkc: "\u{0159}", - nfkd: "\u{0072}\u{030C}", - }, - NormalizationTest { - source: "\u{015A}", - nfc: "\u{015A}", - nfd: "\u{0053}\u{0301}", - nfkc: "\u{015A}", - nfkd: "\u{0053}\u{0301}", - }, - NormalizationTest { - source: "\u{015B}", - nfc: "\u{015B}", - nfd: "\u{0073}\u{0301}", - nfkc: "\u{015B}", - nfkd: "\u{0073}\u{0301}", - }, - NormalizationTest { - source: "\u{015C}", - nfc: "\u{015C}", - nfd: "\u{0053}\u{0302}", - nfkc: "\u{015C}", - nfkd: "\u{0053}\u{0302}", - }, - NormalizationTest { - source: "\u{015D}", - nfc: "\u{015D}", - nfd: "\u{0073}\u{0302}", - nfkc: "\u{015D}", - nfkd: "\u{0073}\u{0302}", - }, - NormalizationTest { - source: "\u{015E}", - nfc: "\u{015E}", - nfd: "\u{0053}\u{0327}", - nfkc: "\u{015E}", - nfkd: "\u{0053}\u{0327}", - }, - NormalizationTest { - source: "\u{015F}", - nfc: "\u{015F}", - nfd: "\u{0073}\u{0327}", - nfkc: "\u{015F}", - nfkd: "\u{0073}\u{0327}", - }, - NormalizationTest { - source: "\u{0160}", - nfc: "\u{0160}", - nfd: "\u{0053}\u{030C}", - nfkc: "\u{0160}", - nfkd: "\u{0053}\u{030C}", - }, - NormalizationTest { - source: "\u{0161}", - nfc: "\u{0161}", - nfd: "\u{0073}\u{030C}", - nfkc: "\u{0161}", - nfkd: "\u{0073}\u{030C}", - }, - NormalizationTest { - source: "\u{0162}", - nfc: "\u{0162}", - nfd: "\u{0054}\u{0327}", - nfkc: "\u{0162}", - nfkd: "\u{0054}\u{0327}", - }, - NormalizationTest { - source: "\u{0163}", - nfc: "\u{0163}", - nfd: "\u{0074}\u{0327}", - nfkc: "\u{0163}", - nfkd: "\u{0074}\u{0327}", - }, - NormalizationTest { - source: "\u{0164}", - nfc: "\u{0164}", - nfd: "\u{0054}\u{030C}", - nfkc: "\u{0164}", - nfkd: "\u{0054}\u{030C}", - }, - NormalizationTest { - source: "\u{0165}", - nfc: "\u{0165}", - nfd: "\u{0074}\u{030C}", - nfkc: "\u{0165}", - nfkd: "\u{0074}\u{030C}", - }, - NormalizationTest { - source: "\u{0168}", - nfc: "\u{0168}", - nfd: "\u{0055}\u{0303}", - nfkc: "\u{0168}", - nfkd: "\u{0055}\u{0303}", - }, - NormalizationTest { - source: "\u{0169}", - nfc: "\u{0169}", - nfd: "\u{0075}\u{0303}", - nfkc: "\u{0169}", - nfkd: "\u{0075}\u{0303}", - }, - NormalizationTest { - source: "\u{016A}", - nfc: "\u{016A}", - nfd: "\u{0055}\u{0304}", - nfkc: "\u{016A}", - nfkd: "\u{0055}\u{0304}", - }, - NormalizationTest { - source: "\u{016B}", - nfc: "\u{016B}", - nfd: "\u{0075}\u{0304}", - nfkc: "\u{016B}", - nfkd: "\u{0075}\u{0304}", - }, - NormalizationTest { - source: "\u{016C}", - nfc: "\u{016C}", - nfd: "\u{0055}\u{0306}", - nfkc: "\u{016C}", - nfkd: "\u{0055}\u{0306}", - }, - NormalizationTest { - source: "\u{016D}", - nfc: "\u{016D}", - nfd: "\u{0075}\u{0306}", - nfkc: "\u{016D}", - nfkd: "\u{0075}\u{0306}", - }, - NormalizationTest { - source: "\u{016E}", - nfc: "\u{016E}", - nfd: "\u{0055}\u{030A}", - nfkc: "\u{016E}", - nfkd: "\u{0055}\u{030A}", - }, - NormalizationTest { - source: "\u{016F}", - nfc: "\u{016F}", - nfd: "\u{0075}\u{030A}", - nfkc: "\u{016F}", - nfkd: "\u{0075}\u{030A}", - }, - NormalizationTest { - source: "\u{0170}", - nfc: "\u{0170}", - nfd: "\u{0055}\u{030B}", - nfkc: "\u{0170}", - nfkd: "\u{0055}\u{030B}", - }, - NormalizationTest { - source: "\u{0171}", - nfc: "\u{0171}", - nfd: "\u{0075}\u{030B}", - nfkc: "\u{0171}", - nfkd: "\u{0075}\u{030B}", - }, - NormalizationTest { - source: "\u{0172}", - nfc: "\u{0172}", - nfd: "\u{0055}\u{0328}", - nfkc: "\u{0172}", - nfkd: "\u{0055}\u{0328}", - }, - NormalizationTest { - source: "\u{0173}", - nfc: "\u{0173}", - nfd: "\u{0075}\u{0328}", - nfkc: "\u{0173}", - nfkd: "\u{0075}\u{0328}", - }, - NormalizationTest { - source: "\u{0174}", - nfc: "\u{0174}", - nfd: "\u{0057}\u{0302}", - nfkc: "\u{0174}", - nfkd: "\u{0057}\u{0302}", - }, - NormalizationTest { - source: "\u{0175}", - nfc: "\u{0175}", - nfd: "\u{0077}\u{0302}", - nfkc: "\u{0175}", - nfkd: "\u{0077}\u{0302}", - }, - NormalizationTest { - source: "\u{0176}", - nfc: "\u{0176}", - nfd: "\u{0059}\u{0302}", - nfkc: "\u{0176}", - nfkd: "\u{0059}\u{0302}", - }, - NormalizationTest { - source: "\u{0177}", - nfc: "\u{0177}", - nfd: "\u{0079}\u{0302}", - nfkc: "\u{0177}", - nfkd: "\u{0079}\u{0302}", - }, - NormalizationTest { - source: "\u{0178}", - nfc: "\u{0178}", - nfd: "\u{0059}\u{0308}", - nfkc: "\u{0178}", - nfkd: "\u{0059}\u{0308}", - }, - NormalizationTest { - source: "\u{0179}", - nfc: "\u{0179}", - nfd: "\u{005A}\u{0301}", - nfkc: "\u{0179}", - nfkd: "\u{005A}\u{0301}", - }, - NormalizationTest { - source: "\u{017A}", - nfc: "\u{017A}", - nfd: "\u{007A}\u{0301}", - nfkc: "\u{017A}", - nfkd: "\u{007A}\u{0301}", - }, - NormalizationTest { - source: "\u{017B}", - nfc: "\u{017B}", - nfd: "\u{005A}\u{0307}", - nfkc: "\u{017B}", - nfkd: "\u{005A}\u{0307}", - }, - NormalizationTest { - source: "\u{017C}", - nfc: "\u{017C}", - nfd: "\u{007A}\u{0307}", - nfkc: "\u{017C}", - nfkd: "\u{007A}\u{0307}", - }, - NormalizationTest { - source: "\u{017D}", - nfc: "\u{017D}", - nfd: "\u{005A}\u{030C}", - nfkc: "\u{017D}", - nfkd: "\u{005A}\u{030C}", - }, - NormalizationTest { - source: "\u{017E}", - nfc: "\u{017E}", - nfd: "\u{007A}\u{030C}", - nfkc: "\u{017E}", - nfkd: "\u{007A}\u{030C}", - }, - NormalizationTest { - source: "\u{017F}", - nfc: "\u{017F}", - nfd: "\u{017F}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{01A0}", - nfc: "\u{01A0}", - nfd: "\u{004F}\u{031B}", - nfkc: "\u{01A0}", - nfkd: "\u{004F}\u{031B}", - }, - NormalizationTest { - source: "\u{01A1}", - nfc: "\u{01A1}", - nfd: "\u{006F}\u{031B}", - nfkc: "\u{01A1}", - nfkd: "\u{006F}\u{031B}", - }, - NormalizationTest { - source: "\u{01AF}", - nfc: "\u{01AF}", - nfd: "\u{0055}\u{031B}", - nfkc: "\u{01AF}", - nfkd: "\u{0055}\u{031B}", - }, - NormalizationTest { - source: "\u{01B0}", - nfc: "\u{01B0}", - nfd: "\u{0075}\u{031B}", - nfkc: "\u{01B0}", - nfkd: "\u{0075}\u{031B}", - }, - NormalizationTest { - source: "\u{01C4}", - nfc: "\u{01C4}", - nfd: "\u{01C4}", - nfkc: "\u{0044}\u{017D}", - nfkd: "\u{0044}\u{005A}\u{030C}", - }, - NormalizationTest { - source: "\u{01C5}", - nfc: "\u{01C5}", - nfd: "\u{01C5}", - nfkc: "\u{0044}\u{017E}", - nfkd: "\u{0044}\u{007A}\u{030C}", - }, - NormalizationTest { - source: "\u{01C6}", - nfc: "\u{01C6}", - nfd: "\u{01C6}", - nfkc: "\u{0064}\u{017E}", - nfkd: "\u{0064}\u{007A}\u{030C}", - }, - NormalizationTest { - source: "\u{01C7}", - nfc: "\u{01C7}", - nfd: "\u{01C7}", - nfkc: "\u{004C}\u{004A}", - nfkd: "\u{004C}\u{004A}", - }, - NormalizationTest { - source: "\u{01C8}", - nfc: "\u{01C8}", - nfd: "\u{01C8}", - nfkc: "\u{004C}\u{006A}", - nfkd: "\u{004C}\u{006A}", - }, - NormalizationTest { - source: "\u{01C9}", - nfc: "\u{01C9}", - nfd: "\u{01C9}", - nfkc: "\u{006C}\u{006A}", - nfkd: "\u{006C}\u{006A}", - }, - NormalizationTest { - source: "\u{01CA}", - nfc: "\u{01CA}", - nfd: "\u{01CA}", - nfkc: "\u{004E}\u{004A}", - nfkd: "\u{004E}\u{004A}", - }, - NormalizationTest { - source: "\u{01CB}", - nfc: "\u{01CB}", - nfd: "\u{01CB}", - nfkc: "\u{004E}\u{006A}", - nfkd: "\u{004E}\u{006A}", - }, - NormalizationTest { - source: "\u{01CC}", - nfc: "\u{01CC}", - nfd: "\u{01CC}", - nfkc: "\u{006E}\u{006A}", - nfkd: "\u{006E}\u{006A}", - }, - NormalizationTest { - source: "\u{01CD}", - nfc: "\u{01CD}", - nfd: "\u{0041}\u{030C}", - nfkc: "\u{01CD}", - nfkd: "\u{0041}\u{030C}", - }, - NormalizationTest { - source: "\u{01CE}", - nfc: "\u{01CE}", - nfd: "\u{0061}\u{030C}", - nfkc: "\u{01CE}", - nfkd: "\u{0061}\u{030C}", - }, - NormalizationTest { - source: "\u{01CF}", - nfc: "\u{01CF}", - nfd: "\u{0049}\u{030C}", - nfkc: "\u{01CF}", - nfkd: "\u{0049}\u{030C}", - }, - NormalizationTest { - source: "\u{01D0}", - nfc: "\u{01D0}", - nfd: "\u{0069}\u{030C}", - nfkc: "\u{01D0}", - nfkd: "\u{0069}\u{030C}", - }, - NormalizationTest { - source: "\u{01D1}", - nfc: "\u{01D1}", - nfd: "\u{004F}\u{030C}", - nfkc: "\u{01D1}", - nfkd: "\u{004F}\u{030C}", - }, - NormalizationTest { - source: "\u{01D2}", - nfc: "\u{01D2}", - nfd: "\u{006F}\u{030C}", - nfkc: "\u{01D2}", - nfkd: "\u{006F}\u{030C}", - }, - NormalizationTest { - source: "\u{01D3}", - nfc: "\u{01D3}", - nfd: "\u{0055}\u{030C}", - nfkc: "\u{01D3}", - nfkd: "\u{0055}\u{030C}", - }, - NormalizationTest { - source: "\u{01D4}", - nfc: "\u{01D4}", - nfd: "\u{0075}\u{030C}", - nfkc: "\u{01D4}", - nfkd: "\u{0075}\u{030C}", - }, - NormalizationTest { - source: "\u{01D5}", - nfc: "\u{01D5}", - nfd: "\u{0055}\u{0308}\u{0304}", - nfkc: "\u{01D5}", - nfkd: "\u{0055}\u{0308}\u{0304}", - }, - NormalizationTest { - source: "\u{01D6}", - nfc: "\u{01D6}", - nfd: "\u{0075}\u{0308}\u{0304}", - nfkc: "\u{01D6}", - nfkd: "\u{0075}\u{0308}\u{0304}", - }, - NormalizationTest { - source: "\u{01D7}", - nfc: "\u{01D7}", - nfd: "\u{0055}\u{0308}\u{0301}", - nfkc: "\u{01D7}", - nfkd: "\u{0055}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{01D8}", - nfc: "\u{01D8}", - nfd: "\u{0075}\u{0308}\u{0301}", - nfkc: "\u{01D8}", - nfkd: "\u{0075}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{01D9}", - nfc: "\u{01D9}", - nfd: "\u{0055}\u{0308}\u{030C}", - nfkc: "\u{01D9}", - nfkd: "\u{0055}\u{0308}\u{030C}", - }, - NormalizationTest { - source: "\u{01DA}", - nfc: "\u{01DA}", - nfd: "\u{0075}\u{0308}\u{030C}", - nfkc: "\u{01DA}", - nfkd: "\u{0075}\u{0308}\u{030C}", - }, - NormalizationTest { - source: "\u{01DB}", - nfc: "\u{01DB}", - nfd: "\u{0055}\u{0308}\u{0300}", - nfkc: "\u{01DB}", - nfkd: "\u{0055}\u{0308}\u{0300}", - }, - NormalizationTest { - source: "\u{01DC}", - nfc: "\u{01DC}", - nfd: "\u{0075}\u{0308}\u{0300}", - nfkc: "\u{01DC}", - nfkd: "\u{0075}\u{0308}\u{0300}", - }, - NormalizationTest { - source: "\u{01DE}", - nfc: "\u{01DE}", - nfd: "\u{0041}\u{0308}\u{0304}", - nfkc: "\u{01DE}", - nfkd: "\u{0041}\u{0308}\u{0304}", - }, - NormalizationTest { - source: "\u{01DF}", - nfc: "\u{01DF}", - nfd: "\u{0061}\u{0308}\u{0304}", - nfkc: "\u{01DF}", - nfkd: "\u{0061}\u{0308}\u{0304}", - }, - NormalizationTest { - source: "\u{01E0}", - nfc: "\u{01E0}", - nfd: "\u{0041}\u{0307}\u{0304}", - nfkc: "\u{01E0}", - nfkd: "\u{0041}\u{0307}\u{0304}", - }, - NormalizationTest { - source: "\u{01E1}", - nfc: "\u{01E1}", - nfd: "\u{0061}\u{0307}\u{0304}", - nfkc: "\u{01E1}", - nfkd: "\u{0061}\u{0307}\u{0304}", - }, - NormalizationTest { - source: "\u{01E2}", - nfc: "\u{01E2}", - nfd: "\u{00C6}\u{0304}", - nfkc: "\u{01E2}", - nfkd: "\u{00C6}\u{0304}", - }, - NormalizationTest { - source: "\u{01E3}", - nfc: "\u{01E3}", - nfd: "\u{00E6}\u{0304}", - nfkc: "\u{01E3}", - nfkd: "\u{00E6}\u{0304}", - }, - NormalizationTest { - source: "\u{01E6}", - nfc: "\u{01E6}", - nfd: "\u{0047}\u{030C}", - nfkc: "\u{01E6}", - nfkd: "\u{0047}\u{030C}", - }, - NormalizationTest { - source: "\u{01E7}", - nfc: "\u{01E7}", - nfd: "\u{0067}\u{030C}", - nfkc: "\u{01E7}", - nfkd: "\u{0067}\u{030C}", - }, - NormalizationTest { - source: "\u{01E8}", - nfc: "\u{01E8}", - nfd: "\u{004B}\u{030C}", - nfkc: "\u{01E8}", - nfkd: "\u{004B}\u{030C}", - }, - NormalizationTest { - source: "\u{01E9}", - nfc: "\u{01E9}", - nfd: "\u{006B}\u{030C}", - nfkc: "\u{01E9}", - nfkd: "\u{006B}\u{030C}", - }, - NormalizationTest { - source: "\u{01EA}", - nfc: "\u{01EA}", - nfd: "\u{004F}\u{0328}", - nfkc: "\u{01EA}", - nfkd: "\u{004F}\u{0328}", - }, - NormalizationTest { - source: "\u{01EB}", - nfc: "\u{01EB}", - nfd: "\u{006F}\u{0328}", - nfkc: "\u{01EB}", - nfkd: "\u{006F}\u{0328}", - }, - NormalizationTest { - source: "\u{01EC}", - nfc: "\u{01EC}", - nfd: "\u{004F}\u{0328}\u{0304}", - nfkc: "\u{01EC}", - nfkd: "\u{004F}\u{0328}\u{0304}", - }, - NormalizationTest { - source: "\u{01ED}", - nfc: "\u{01ED}", - nfd: "\u{006F}\u{0328}\u{0304}", - nfkc: "\u{01ED}", - nfkd: "\u{006F}\u{0328}\u{0304}", - }, - NormalizationTest { - source: "\u{01EE}", - nfc: "\u{01EE}", - nfd: "\u{01B7}\u{030C}", - nfkc: "\u{01EE}", - nfkd: "\u{01B7}\u{030C}", - }, - NormalizationTest { - source: "\u{01EF}", - nfc: "\u{01EF}", - nfd: "\u{0292}\u{030C}", - nfkc: "\u{01EF}", - nfkd: "\u{0292}\u{030C}", - }, - NormalizationTest { - source: "\u{01F0}", - nfc: "\u{01F0}", - nfd: "\u{006A}\u{030C}", - nfkc: "\u{01F0}", - nfkd: "\u{006A}\u{030C}", - }, - NormalizationTest { - source: "\u{01F1}", - nfc: "\u{01F1}", - nfd: "\u{01F1}", - nfkc: "\u{0044}\u{005A}", - nfkd: "\u{0044}\u{005A}", - }, - NormalizationTest { - source: "\u{01F2}", - nfc: "\u{01F2}", - nfd: "\u{01F2}", - nfkc: "\u{0044}\u{007A}", - nfkd: "\u{0044}\u{007A}", - }, - NormalizationTest { - source: "\u{01F3}", - nfc: "\u{01F3}", - nfd: "\u{01F3}", - nfkc: "\u{0064}\u{007A}", - nfkd: "\u{0064}\u{007A}", - }, - NormalizationTest { - source: "\u{01F4}", - nfc: "\u{01F4}", - nfd: "\u{0047}\u{0301}", - nfkc: "\u{01F4}", - nfkd: "\u{0047}\u{0301}", - }, - NormalizationTest { - source: "\u{01F5}", - nfc: "\u{01F5}", - nfd: "\u{0067}\u{0301}", - nfkc: "\u{01F5}", - nfkd: "\u{0067}\u{0301}", - }, - NormalizationTest { - source: "\u{01F8}", - nfc: "\u{01F8}", - nfd: "\u{004E}\u{0300}", - nfkc: "\u{01F8}", - nfkd: "\u{004E}\u{0300}", - }, - NormalizationTest { - source: "\u{01F9}", - nfc: "\u{01F9}", - nfd: "\u{006E}\u{0300}", - nfkc: "\u{01F9}", - nfkd: "\u{006E}\u{0300}", - }, - NormalizationTest { - source: "\u{01FA}", - nfc: "\u{01FA}", - nfd: "\u{0041}\u{030A}\u{0301}", - nfkc: "\u{01FA}", - nfkd: "\u{0041}\u{030A}\u{0301}", - }, - NormalizationTest { - source: "\u{01FB}", - nfc: "\u{01FB}", - nfd: "\u{0061}\u{030A}\u{0301}", - nfkc: "\u{01FB}", - nfkd: "\u{0061}\u{030A}\u{0301}", - }, - NormalizationTest { - source: "\u{01FC}", - nfc: "\u{01FC}", - nfd: "\u{00C6}\u{0301}", - nfkc: "\u{01FC}", - nfkd: "\u{00C6}\u{0301}", - }, - NormalizationTest { - source: "\u{01FD}", - nfc: "\u{01FD}", - nfd: "\u{00E6}\u{0301}", - nfkc: "\u{01FD}", - nfkd: "\u{00E6}\u{0301}", - }, - NormalizationTest { - source: "\u{01FE}", - nfc: "\u{01FE}", - nfd: "\u{00D8}\u{0301}", - nfkc: "\u{01FE}", - nfkd: "\u{00D8}\u{0301}", - }, - NormalizationTest { - source: "\u{01FF}", - nfc: "\u{01FF}", - nfd: "\u{00F8}\u{0301}", - nfkc: "\u{01FF}", - nfkd: "\u{00F8}\u{0301}", - }, - NormalizationTest { - source: "\u{0200}", - nfc: "\u{0200}", - nfd: "\u{0041}\u{030F}", - nfkc: "\u{0200}", - nfkd: "\u{0041}\u{030F}", - }, - NormalizationTest { - source: "\u{0201}", - nfc: "\u{0201}", - nfd: "\u{0061}\u{030F}", - nfkc: "\u{0201}", - nfkd: "\u{0061}\u{030F}", - }, - NormalizationTest { - source: "\u{0202}", - nfc: "\u{0202}", - nfd: "\u{0041}\u{0311}", - nfkc: "\u{0202}", - nfkd: "\u{0041}\u{0311}", - }, - NormalizationTest { - source: "\u{0203}", - nfc: "\u{0203}", - nfd: "\u{0061}\u{0311}", - nfkc: "\u{0203}", - nfkd: "\u{0061}\u{0311}", - }, - NormalizationTest { - source: "\u{0204}", - nfc: "\u{0204}", - nfd: "\u{0045}\u{030F}", - nfkc: "\u{0204}", - nfkd: "\u{0045}\u{030F}", - }, - NormalizationTest { - source: "\u{0205}", - nfc: "\u{0205}", - nfd: "\u{0065}\u{030F}", - nfkc: "\u{0205}", - nfkd: "\u{0065}\u{030F}", - }, - NormalizationTest { - source: "\u{0206}", - nfc: "\u{0206}", - nfd: "\u{0045}\u{0311}", - nfkc: "\u{0206}", - nfkd: "\u{0045}\u{0311}", - }, - NormalizationTest { - source: "\u{0207}", - nfc: "\u{0207}", - nfd: "\u{0065}\u{0311}", - nfkc: "\u{0207}", - nfkd: "\u{0065}\u{0311}", - }, - NormalizationTest { - source: "\u{0208}", - nfc: "\u{0208}", - nfd: "\u{0049}\u{030F}", - nfkc: "\u{0208}", - nfkd: "\u{0049}\u{030F}", - }, - NormalizationTest { - source: "\u{0209}", - nfc: "\u{0209}", - nfd: "\u{0069}\u{030F}", - nfkc: "\u{0209}", - nfkd: "\u{0069}\u{030F}", - }, - NormalizationTest { - source: "\u{020A}", - nfc: "\u{020A}", - nfd: "\u{0049}\u{0311}", - nfkc: "\u{020A}", - nfkd: "\u{0049}\u{0311}", - }, - NormalizationTest { - source: "\u{020B}", - nfc: "\u{020B}", - nfd: "\u{0069}\u{0311}", - nfkc: "\u{020B}", - nfkd: "\u{0069}\u{0311}", - }, - NormalizationTest { - source: "\u{020C}", - nfc: "\u{020C}", - nfd: "\u{004F}\u{030F}", - nfkc: "\u{020C}", - nfkd: "\u{004F}\u{030F}", - }, - NormalizationTest { - source: "\u{020D}", - nfc: "\u{020D}", - nfd: "\u{006F}\u{030F}", - nfkc: "\u{020D}", - nfkd: "\u{006F}\u{030F}", - }, - NormalizationTest { - source: "\u{020E}", - nfc: "\u{020E}", - nfd: "\u{004F}\u{0311}", - nfkc: "\u{020E}", - nfkd: "\u{004F}\u{0311}", - }, - NormalizationTest { - source: "\u{020F}", - nfc: "\u{020F}", - nfd: "\u{006F}\u{0311}", - nfkc: "\u{020F}", - nfkd: "\u{006F}\u{0311}", - }, - NormalizationTest { - source: "\u{0210}", - nfc: "\u{0210}", - nfd: "\u{0052}\u{030F}", - nfkc: "\u{0210}", - nfkd: "\u{0052}\u{030F}", - }, - NormalizationTest { - source: "\u{0211}", - nfc: "\u{0211}", - nfd: "\u{0072}\u{030F}", - nfkc: "\u{0211}", - nfkd: "\u{0072}\u{030F}", - }, - NormalizationTest { - source: "\u{0212}", - nfc: "\u{0212}", - nfd: "\u{0052}\u{0311}", - nfkc: "\u{0212}", - nfkd: "\u{0052}\u{0311}", - }, - NormalizationTest { - source: "\u{0213}", - nfc: "\u{0213}", - nfd: "\u{0072}\u{0311}", - nfkc: "\u{0213}", - nfkd: "\u{0072}\u{0311}", - }, - NormalizationTest { - source: "\u{0214}", - nfc: "\u{0214}", - nfd: "\u{0055}\u{030F}", - nfkc: "\u{0214}", - nfkd: "\u{0055}\u{030F}", - }, - NormalizationTest { - source: "\u{0215}", - nfc: "\u{0215}", - nfd: "\u{0075}\u{030F}", - nfkc: "\u{0215}", - nfkd: "\u{0075}\u{030F}", - }, - NormalizationTest { - source: "\u{0216}", - nfc: "\u{0216}", - nfd: "\u{0055}\u{0311}", - nfkc: "\u{0216}", - nfkd: "\u{0055}\u{0311}", - }, - NormalizationTest { - source: "\u{0217}", - nfc: "\u{0217}", - nfd: "\u{0075}\u{0311}", - nfkc: "\u{0217}", - nfkd: "\u{0075}\u{0311}", - }, - NormalizationTest { - source: "\u{0218}", - nfc: "\u{0218}", - nfd: "\u{0053}\u{0326}", - nfkc: "\u{0218}", - nfkd: "\u{0053}\u{0326}", - }, - NormalizationTest { - source: "\u{0219}", - nfc: "\u{0219}", - nfd: "\u{0073}\u{0326}", - nfkc: "\u{0219}", - nfkd: "\u{0073}\u{0326}", - }, - NormalizationTest { - source: "\u{021A}", - nfc: "\u{021A}", - nfd: "\u{0054}\u{0326}", - nfkc: "\u{021A}", - nfkd: "\u{0054}\u{0326}", - }, - NormalizationTest { - source: "\u{021B}", - nfc: "\u{021B}", - nfd: "\u{0074}\u{0326}", - nfkc: "\u{021B}", - nfkd: "\u{0074}\u{0326}", - }, - NormalizationTest { - source: "\u{021E}", - nfc: "\u{021E}", - nfd: "\u{0048}\u{030C}", - nfkc: "\u{021E}", - nfkd: "\u{0048}\u{030C}", - }, - NormalizationTest { - source: "\u{021F}", - nfc: "\u{021F}", - nfd: "\u{0068}\u{030C}", - nfkc: "\u{021F}", - nfkd: "\u{0068}\u{030C}", - }, - NormalizationTest { - source: "\u{0226}", - nfc: "\u{0226}", - nfd: "\u{0041}\u{0307}", - nfkc: "\u{0226}", - nfkd: "\u{0041}\u{0307}", - }, - NormalizationTest { - source: "\u{0227}", - nfc: "\u{0227}", - nfd: "\u{0061}\u{0307}", - nfkc: "\u{0227}", - nfkd: "\u{0061}\u{0307}", - }, - NormalizationTest { - source: "\u{0228}", - nfc: "\u{0228}", - nfd: "\u{0045}\u{0327}", - nfkc: "\u{0228}", - nfkd: "\u{0045}\u{0327}", - }, - NormalizationTest { - source: "\u{0229}", - nfc: "\u{0229}", - nfd: "\u{0065}\u{0327}", - nfkc: "\u{0229}", - nfkd: "\u{0065}\u{0327}", - }, - NormalizationTest { - source: "\u{022A}", - nfc: "\u{022A}", - nfd: "\u{004F}\u{0308}\u{0304}", - nfkc: "\u{022A}", - nfkd: "\u{004F}\u{0308}\u{0304}", - }, - NormalizationTest { - source: "\u{022B}", - nfc: "\u{022B}", - nfd: "\u{006F}\u{0308}\u{0304}", - nfkc: "\u{022B}", - nfkd: "\u{006F}\u{0308}\u{0304}", - }, - NormalizationTest { - source: "\u{022C}", - nfc: "\u{022C}", - nfd: "\u{004F}\u{0303}\u{0304}", - nfkc: "\u{022C}", - nfkd: "\u{004F}\u{0303}\u{0304}", - }, - NormalizationTest { - source: "\u{022D}", - nfc: "\u{022D}", - nfd: "\u{006F}\u{0303}\u{0304}", - nfkc: "\u{022D}", - nfkd: "\u{006F}\u{0303}\u{0304}", - }, - NormalizationTest { - source: "\u{022E}", - nfc: "\u{022E}", - nfd: "\u{004F}\u{0307}", - nfkc: "\u{022E}", - nfkd: "\u{004F}\u{0307}", - }, - NormalizationTest { - source: "\u{022F}", - nfc: "\u{022F}", - nfd: "\u{006F}\u{0307}", - nfkc: "\u{022F}", - nfkd: "\u{006F}\u{0307}", - }, - NormalizationTest { - source: "\u{0230}", - nfc: "\u{0230}", - nfd: "\u{004F}\u{0307}\u{0304}", - nfkc: "\u{0230}", - nfkd: "\u{004F}\u{0307}\u{0304}", - }, - NormalizationTest { - source: "\u{0231}", - nfc: "\u{0231}", - nfd: "\u{006F}\u{0307}\u{0304}", - nfkc: "\u{0231}", - nfkd: "\u{006F}\u{0307}\u{0304}", - }, - NormalizationTest { - source: "\u{0232}", - nfc: "\u{0232}", - nfd: "\u{0059}\u{0304}", - nfkc: "\u{0232}", - nfkd: "\u{0059}\u{0304}", - }, - NormalizationTest { - source: "\u{0233}", - nfc: "\u{0233}", - nfd: "\u{0079}\u{0304}", - nfkc: "\u{0233}", - nfkd: "\u{0079}\u{0304}", - }, - NormalizationTest { - source: "\u{02B0}", - nfc: "\u{02B0}", - nfd: "\u{02B0}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{02B1}", - nfc: "\u{02B1}", - nfd: "\u{02B1}", - nfkc: "\u{0266}", - nfkd: "\u{0266}", - }, - NormalizationTest { - source: "\u{02B2}", - nfc: "\u{02B2}", - nfd: "\u{02B2}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{02B3}", - nfc: "\u{02B3}", - nfd: "\u{02B3}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{02B4}", - nfc: "\u{02B4}", - nfd: "\u{02B4}", - nfkc: "\u{0279}", - nfkd: "\u{0279}", - }, - NormalizationTest { - source: "\u{02B5}", - nfc: "\u{02B5}", - nfd: "\u{02B5}", - nfkc: "\u{027B}", - nfkd: "\u{027B}", - }, - NormalizationTest { - source: "\u{02B6}", - nfc: "\u{02B6}", - nfd: "\u{02B6}", - nfkc: "\u{0281}", - nfkd: "\u{0281}", - }, - NormalizationTest { - source: "\u{02B7}", - nfc: "\u{02B7}", - nfd: "\u{02B7}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{02B8}", - nfc: "\u{02B8}", - nfd: "\u{02B8}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{02D8}", - nfc: "\u{02D8}", - nfd: "\u{02D8}", - nfkc: "\u{0020}\u{0306}", - nfkd: "\u{0020}\u{0306}", - }, - NormalizationTest { - source: "\u{02D9}", - nfc: "\u{02D9}", - nfd: "\u{02D9}", - nfkc: "\u{0020}\u{0307}", - nfkd: "\u{0020}\u{0307}", - }, - NormalizationTest { - source: "\u{02DA}", - nfc: "\u{02DA}", - nfd: "\u{02DA}", - nfkc: "\u{0020}\u{030A}", - nfkd: "\u{0020}\u{030A}", - }, - NormalizationTest { - source: "\u{02DB}", - nfc: "\u{02DB}", - nfd: "\u{02DB}", - nfkc: "\u{0020}\u{0328}", - nfkd: "\u{0020}\u{0328}", - }, - NormalizationTest { - source: "\u{02DC}", - nfc: "\u{02DC}", - nfd: "\u{02DC}", - nfkc: "\u{0020}\u{0303}", - nfkd: "\u{0020}\u{0303}", - }, - NormalizationTest { - source: "\u{02DD}", - nfc: "\u{02DD}", - nfd: "\u{02DD}", - nfkc: "\u{0020}\u{030B}", - nfkd: "\u{0020}\u{030B}", - }, - NormalizationTest { - source: "\u{02E0}", - nfc: "\u{02E0}", - nfd: "\u{02E0}", - nfkc: "\u{0263}", - nfkd: "\u{0263}", - }, - NormalizationTest { - source: "\u{02E1}", - nfc: "\u{02E1}", - nfd: "\u{02E1}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{02E2}", - nfc: "\u{02E2}", - nfd: "\u{02E2}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{02E3}", - nfc: "\u{02E3}", - nfd: "\u{02E3}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{02E4}", - nfc: "\u{02E4}", - nfd: "\u{02E4}", - nfkc: "\u{0295}", - nfkd: "\u{0295}", - }, - NormalizationTest { - source: "\u{0340}", - nfc: "\u{0300}", - nfd: "\u{0300}", - nfkc: "\u{0300}", - nfkd: "\u{0300}", - }, - NormalizationTest { - source: "\u{0341}", - nfc: "\u{0301}", - nfd: "\u{0301}", - nfkc: "\u{0301}", - nfkd: "\u{0301}", - }, - NormalizationTest { - source: "\u{0343}", - nfc: "\u{0313}", - nfd: "\u{0313}", - nfkc: "\u{0313}", - nfkd: "\u{0313}", - }, - NormalizationTest { - source: "\u{0344}", - nfc: "\u{0308}\u{0301}", - nfd: "\u{0308}\u{0301}", - nfkc: "\u{0308}\u{0301}", - nfkd: "\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{0374}", - nfc: "\u{02B9}", - nfd: "\u{02B9}", - nfkc: "\u{02B9}", - nfkd: "\u{02B9}", - }, - NormalizationTest { - source: "\u{037A}", - nfc: "\u{037A}", - nfd: "\u{037A}", - nfkc: "\u{0020}\u{0345}", - nfkd: "\u{0020}\u{0345}", - }, - NormalizationTest { - source: "\u{037E}", - nfc: "\u{003B}", - nfd: "\u{003B}", - nfkc: "\u{003B}", - nfkd: "\u{003B}", - }, - NormalizationTest { - source: "\u{0384}", - nfc: "\u{0384}", - nfd: "\u{0384}", - nfkc: "\u{0020}\u{0301}", - nfkd: "\u{0020}\u{0301}", - }, - NormalizationTest { - source: "\u{0385}", - nfc: "\u{0385}", - nfd: "\u{00A8}\u{0301}", - nfkc: "\u{0020}\u{0308}\u{0301}", - nfkd: "\u{0020}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{0386}", - nfc: "\u{0386}", - nfd: "\u{0391}\u{0301}", - nfkc: "\u{0386}", - nfkd: "\u{0391}\u{0301}", - }, - NormalizationTest { - source: "\u{0387}", - nfc: "\u{00B7}", - nfd: "\u{00B7}", - nfkc: "\u{00B7}", - nfkd: "\u{00B7}", - }, - NormalizationTest { - source: "\u{0388}", - nfc: "\u{0388}", - nfd: "\u{0395}\u{0301}", - nfkc: "\u{0388}", - nfkd: "\u{0395}\u{0301}", - }, - NormalizationTest { - source: "\u{0389}", - nfc: "\u{0389}", - nfd: "\u{0397}\u{0301}", - nfkc: "\u{0389}", - nfkd: "\u{0397}\u{0301}", - }, - NormalizationTest { - source: "\u{038A}", - nfc: "\u{038A}", - nfd: "\u{0399}\u{0301}", - nfkc: "\u{038A}", - nfkd: "\u{0399}\u{0301}", - }, - NormalizationTest { - source: "\u{038C}", - nfc: "\u{038C}", - nfd: "\u{039F}\u{0301}", - nfkc: "\u{038C}", - nfkd: "\u{039F}\u{0301}", - }, - NormalizationTest { - source: "\u{038E}", - nfc: "\u{038E}", - nfd: "\u{03A5}\u{0301}", - nfkc: "\u{038E}", - nfkd: "\u{03A5}\u{0301}", - }, - NormalizationTest { - source: "\u{038F}", - nfc: "\u{038F}", - nfd: "\u{03A9}\u{0301}", - nfkc: "\u{038F}", - nfkd: "\u{03A9}\u{0301}", - }, - NormalizationTest { - source: "\u{0390}", - nfc: "\u{0390}", - nfd: "\u{03B9}\u{0308}\u{0301}", - nfkc: "\u{0390}", - nfkd: "\u{03B9}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{03AA}", - nfc: "\u{03AA}", - nfd: "\u{0399}\u{0308}", - nfkc: "\u{03AA}", - nfkd: "\u{0399}\u{0308}", - }, - NormalizationTest { - source: "\u{03AB}", - nfc: "\u{03AB}", - nfd: "\u{03A5}\u{0308}", - nfkc: "\u{03AB}", - nfkd: "\u{03A5}\u{0308}", - }, - NormalizationTest { - source: "\u{03AC}", - nfc: "\u{03AC}", - nfd: "\u{03B1}\u{0301}", - nfkc: "\u{03AC}", - nfkd: "\u{03B1}\u{0301}", - }, - NormalizationTest { - source: "\u{03AD}", - nfc: "\u{03AD}", - nfd: "\u{03B5}\u{0301}", - nfkc: "\u{03AD}", - nfkd: "\u{03B5}\u{0301}", - }, - NormalizationTest { - source: "\u{03AE}", - nfc: "\u{03AE}", - nfd: "\u{03B7}\u{0301}", - nfkc: "\u{03AE}", - nfkd: "\u{03B7}\u{0301}", - }, - NormalizationTest { - source: "\u{03AF}", - nfc: "\u{03AF}", - nfd: "\u{03B9}\u{0301}", - nfkc: "\u{03AF}", - nfkd: "\u{03B9}\u{0301}", - }, - NormalizationTest { - source: "\u{03B0}", - nfc: "\u{03B0}", - nfd: "\u{03C5}\u{0308}\u{0301}", - nfkc: "\u{03B0}", - nfkd: "\u{03C5}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{03CA}", - nfc: "\u{03CA}", - nfd: "\u{03B9}\u{0308}", - nfkc: "\u{03CA}", - nfkd: "\u{03B9}\u{0308}", - }, - NormalizationTest { - source: "\u{03CB}", - nfc: "\u{03CB}", - nfd: "\u{03C5}\u{0308}", - nfkc: "\u{03CB}", - nfkd: "\u{03C5}\u{0308}", - }, - NormalizationTest { - source: "\u{03CC}", - nfc: "\u{03CC}", - nfd: "\u{03BF}\u{0301}", - nfkc: "\u{03CC}", - nfkd: "\u{03BF}\u{0301}", - }, - NormalizationTest { - source: "\u{03CD}", - nfc: "\u{03CD}", - nfd: "\u{03C5}\u{0301}", - nfkc: "\u{03CD}", - nfkd: "\u{03C5}\u{0301}", - }, - NormalizationTest { - source: "\u{03CE}", - nfc: "\u{03CE}", - nfd: "\u{03C9}\u{0301}", - nfkc: "\u{03CE}", - nfkd: "\u{03C9}\u{0301}", - }, - NormalizationTest { - source: "\u{03D0}", - nfc: "\u{03D0}", - nfd: "\u{03D0}", - nfkc: "\u{03B2}", - nfkd: "\u{03B2}", - }, - NormalizationTest { - source: "\u{03D1}", - nfc: "\u{03D1}", - nfd: "\u{03D1}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{03D2}", - nfc: "\u{03D2}", - nfd: "\u{03D2}", - nfkc: "\u{03A5}", - nfkd: "\u{03A5}", - }, - NormalizationTest { - source: "\u{03D3}", - nfc: "\u{03D3}", - nfd: "\u{03D2}\u{0301}", - nfkc: "\u{038E}", - nfkd: "\u{03A5}\u{0301}", - }, - NormalizationTest { - source: "\u{03D4}", - nfc: "\u{03D4}", - nfd: "\u{03D2}\u{0308}", - nfkc: "\u{03AB}", - nfkd: "\u{03A5}\u{0308}", - }, - NormalizationTest { - source: "\u{03D5}", - nfc: "\u{03D5}", - nfd: "\u{03D5}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{03D6}", - nfc: "\u{03D6}", - nfd: "\u{03D6}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{03F0}", - nfc: "\u{03F0}", - nfd: "\u{03F0}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{03F1}", - nfc: "\u{03F1}", - nfd: "\u{03F1}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{03F2}", - nfc: "\u{03F2}", - nfd: "\u{03F2}", - nfkc: "\u{03C2}", - nfkd: "\u{03C2}", - }, - NormalizationTest { - source: "\u{03F4}", - nfc: "\u{03F4}", - nfd: "\u{03F4}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{03F5}", - nfc: "\u{03F5}", - nfd: "\u{03F5}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{03F9}", - nfc: "\u{03F9}", - nfd: "\u{03F9}", - nfkc: "\u{03A3}", - nfkd: "\u{03A3}", - }, - NormalizationTest { - source: "\u{0400}", - nfc: "\u{0400}", - nfd: "\u{0415}\u{0300}", - nfkc: "\u{0400}", - nfkd: "\u{0415}\u{0300}", - }, - NormalizationTest { - source: "\u{0401}", - nfc: "\u{0401}", - nfd: "\u{0415}\u{0308}", - nfkc: "\u{0401}", - nfkd: "\u{0415}\u{0308}", - }, - NormalizationTest { - source: "\u{0403}", - nfc: "\u{0403}", - nfd: "\u{0413}\u{0301}", - nfkc: "\u{0403}", - nfkd: "\u{0413}\u{0301}", - }, - NormalizationTest { - source: "\u{0407}", - nfc: "\u{0407}", - nfd: "\u{0406}\u{0308}", - nfkc: "\u{0407}", - nfkd: "\u{0406}\u{0308}", - }, - NormalizationTest { - source: "\u{040C}", - nfc: "\u{040C}", - nfd: "\u{041A}\u{0301}", - nfkc: "\u{040C}", - nfkd: "\u{041A}\u{0301}", - }, - NormalizationTest { - source: "\u{040D}", - nfc: "\u{040D}", - nfd: "\u{0418}\u{0300}", - nfkc: "\u{040D}", - nfkd: "\u{0418}\u{0300}", - }, - NormalizationTest { - source: "\u{040E}", - nfc: "\u{040E}", - nfd: "\u{0423}\u{0306}", - nfkc: "\u{040E}", - nfkd: "\u{0423}\u{0306}", - }, - NormalizationTest { - source: "\u{0419}", - nfc: "\u{0419}", - nfd: "\u{0418}\u{0306}", - nfkc: "\u{0419}", - nfkd: "\u{0418}\u{0306}", - }, - NormalizationTest { - source: "\u{0439}", - nfc: "\u{0439}", - nfd: "\u{0438}\u{0306}", - nfkc: "\u{0439}", - nfkd: "\u{0438}\u{0306}", - }, - NormalizationTest { - source: "\u{0450}", - nfc: "\u{0450}", - nfd: "\u{0435}\u{0300}", - nfkc: "\u{0450}", - nfkd: "\u{0435}\u{0300}", - }, - NormalizationTest { - source: "\u{0451}", - nfc: "\u{0451}", - nfd: "\u{0435}\u{0308}", - nfkc: "\u{0451}", - nfkd: "\u{0435}\u{0308}", - }, - NormalizationTest { - source: "\u{0453}", - nfc: "\u{0453}", - nfd: "\u{0433}\u{0301}", - nfkc: "\u{0453}", - nfkd: "\u{0433}\u{0301}", - }, - NormalizationTest { - source: "\u{0457}", - nfc: "\u{0457}", - nfd: "\u{0456}\u{0308}", - nfkc: "\u{0457}", - nfkd: "\u{0456}\u{0308}", - }, - NormalizationTest { - source: "\u{045C}", - nfc: "\u{045C}", - nfd: "\u{043A}\u{0301}", - nfkc: "\u{045C}", - nfkd: "\u{043A}\u{0301}", - }, - NormalizationTest { - source: "\u{045D}", - nfc: "\u{045D}", - nfd: "\u{0438}\u{0300}", - nfkc: "\u{045D}", - nfkd: "\u{0438}\u{0300}", - }, - NormalizationTest { - source: "\u{045E}", - nfc: "\u{045E}", - nfd: "\u{0443}\u{0306}", - nfkc: "\u{045E}", - nfkd: "\u{0443}\u{0306}", - }, - NormalizationTest { - source: "\u{0476}", - nfc: "\u{0476}", - nfd: "\u{0474}\u{030F}", - nfkc: "\u{0476}", - nfkd: "\u{0474}\u{030F}", - }, - NormalizationTest { - source: "\u{0477}", - nfc: "\u{0477}", - nfd: "\u{0475}\u{030F}", - nfkc: "\u{0477}", - nfkd: "\u{0475}\u{030F}", - }, - NormalizationTest { - source: "\u{04C1}", - nfc: "\u{04C1}", - nfd: "\u{0416}\u{0306}", - nfkc: "\u{04C1}", - nfkd: "\u{0416}\u{0306}", - }, - NormalizationTest { - source: "\u{04C2}", - nfc: "\u{04C2}", - nfd: "\u{0436}\u{0306}", - nfkc: "\u{04C2}", - nfkd: "\u{0436}\u{0306}", - }, - NormalizationTest { - source: "\u{04D0}", - nfc: "\u{04D0}", - nfd: "\u{0410}\u{0306}", - nfkc: "\u{04D0}", - nfkd: "\u{0410}\u{0306}", - }, - NormalizationTest { - source: "\u{04D1}", - nfc: "\u{04D1}", - nfd: "\u{0430}\u{0306}", - nfkc: "\u{04D1}", - nfkd: "\u{0430}\u{0306}", - }, - NormalizationTest { - source: "\u{04D2}", - nfc: "\u{04D2}", - nfd: "\u{0410}\u{0308}", - nfkc: "\u{04D2}", - nfkd: "\u{0410}\u{0308}", - }, - NormalizationTest { - source: "\u{04D3}", - nfc: "\u{04D3}", - nfd: "\u{0430}\u{0308}", - nfkc: "\u{04D3}", - nfkd: "\u{0430}\u{0308}", - }, - NormalizationTest { - source: "\u{04D6}", - nfc: "\u{04D6}", - nfd: "\u{0415}\u{0306}", - nfkc: "\u{04D6}", - nfkd: "\u{0415}\u{0306}", - }, - NormalizationTest { - source: "\u{04D7}", - nfc: "\u{04D7}", - nfd: "\u{0435}\u{0306}", - nfkc: "\u{04D7}", - nfkd: "\u{0435}\u{0306}", - }, - NormalizationTest { - source: "\u{04DA}", - nfc: "\u{04DA}", - nfd: "\u{04D8}\u{0308}", - nfkc: "\u{04DA}", - nfkd: "\u{04D8}\u{0308}", - }, - NormalizationTest { - source: "\u{04DB}", - nfc: "\u{04DB}", - nfd: "\u{04D9}\u{0308}", - nfkc: "\u{04DB}", - nfkd: "\u{04D9}\u{0308}", - }, - NormalizationTest { - source: "\u{04DC}", - nfc: "\u{04DC}", - nfd: "\u{0416}\u{0308}", - nfkc: "\u{04DC}", - nfkd: "\u{0416}\u{0308}", - }, - NormalizationTest { - source: "\u{04DD}", - nfc: "\u{04DD}", - nfd: "\u{0436}\u{0308}", - nfkc: "\u{04DD}", - nfkd: "\u{0436}\u{0308}", - }, - NormalizationTest { - source: "\u{04DE}", - nfc: "\u{04DE}", - nfd: "\u{0417}\u{0308}", - nfkc: "\u{04DE}", - nfkd: "\u{0417}\u{0308}", - }, - NormalizationTest { - source: "\u{04DF}", - nfc: "\u{04DF}", - nfd: "\u{0437}\u{0308}", - nfkc: "\u{04DF}", - nfkd: "\u{0437}\u{0308}", - }, - NormalizationTest { - source: "\u{04E2}", - nfc: "\u{04E2}", - nfd: "\u{0418}\u{0304}", - nfkc: "\u{04E2}", - nfkd: "\u{0418}\u{0304}", - }, - NormalizationTest { - source: "\u{04E3}", - nfc: "\u{04E3}", - nfd: "\u{0438}\u{0304}", - nfkc: "\u{04E3}", - nfkd: "\u{0438}\u{0304}", - }, - NormalizationTest { - source: "\u{04E4}", - nfc: "\u{04E4}", - nfd: "\u{0418}\u{0308}", - nfkc: "\u{04E4}", - nfkd: "\u{0418}\u{0308}", - }, - NormalizationTest { - source: "\u{04E5}", - nfc: "\u{04E5}", - nfd: "\u{0438}\u{0308}", - nfkc: "\u{04E5}", - nfkd: "\u{0438}\u{0308}", - }, - NormalizationTest { - source: "\u{04E6}", - nfc: "\u{04E6}", - nfd: "\u{041E}\u{0308}", - nfkc: "\u{04E6}", - nfkd: "\u{041E}\u{0308}", - }, - NormalizationTest { - source: "\u{04E7}", - nfc: "\u{04E7}", - nfd: "\u{043E}\u{0308}", - nfkc: "\u{04E7}", - nfkd: "\u{043E}\u{0308}", - }, - NormalizationTest { - source: "\u{04EA}", - nfc: "\u{04EA}", - nfd: "\u{04E8}\u{0308}", - nfkc: "\u{04EA}", - nfkd: "\u{04E8}\u{0308}", - }, - NormalizationTest { - source: "\u{04EB}", - nfc: "\u{04EB}", - nfd: "\u{04E9}\u{0308}", - nfkc: "\u{04EB}", - nfkd: "\u{04E9}\u{0308}", - }, - NormalizationTest { - source: "\u{04EC}", - nfc: "\u{04EC}", - nfd: "\u{042D}\u{0308}", - nfkc: "\u{04EC}", - nfkd: "\u{042D}\u{0308}", - }, - NormalizationTest { - source: "\u{04ED}", - nfc: "\u{04ED}", - nfd: "\u{044D}\u{0308}", - nfkc: "\u{04ED}", - nfkd: "\u{044D}\u{0308}", - }, - NormalizationTest { - source: "\u{04EE}", - nfc: "\u{04EE}", - nfd: "\u{0423}\u{0304}", - nfkc: "\u{04EE}", - nfkd: "\u{0423}\u{0304}", - }, - NormalizationTest { - source: "\u{04EF}", - nfc: "\u{04EF}", - nfd: "\u{0443}\u{0304}", - nfkc: "\u{04EF}", - nfkd: "\u{0443}\u{0304}", - }, - NormalizationTest { - source: "\u{04F0}", - nfc: "\u{04F0}", - nfd: "\u{0423}\u{0308}", - nfkc: "\u{04F0}", - nfkd: "\u{0423}\u{0308}", - }, - NormalizationTest { - source: "\u{04F1}", - nfc: "\u{04F1}", - nfd: "\u{0443}\u{0308}", - nfkc: "\u{04F1}", - nfkd: "\u{0443}\u{0308}", - }, - NormalizationTest { - source: "\u{04F2}", - nfc: "\u{04F2}", - nfd: "\u{0423}\u{030B}", - nfkc: "\u{04F2}", - nfkd: "\u{0423}\u{030B}", - }, - NormalizationTest { - source: "\u{04F3}", - nfc: "\u{04F3}", - nfd: "\u{0443}\u{030B}", - nfkc: "\u{04F3}", - nfkd: "\u{0443}\u{030B}", - }, - NormalizationTest { - source: "\u{04F4}", - nfc: "\u{04F4}", - nfd: "\u{0427}\u{0308}", - nfkc: "\u{04F4}", - nfkd: "\u{0427}\u{0308}", - }, - NormalizationTest { - source: "\u{04F5}", - nfc: "\u{04F5}", - nfd: "\u{0447}\u{0308}", - nfkc: "\u{04F5}", - nfkd: "\u{0447}\u{0308}", - }, - NormalizationTest { - source: "\u{04F8}", - nfc: "\u{04F8}", - nfd: "\u{042B}\u{0308}", - nfkc: "\u{04F8}", - nfkd: "\u{042B}\u{0308}", - }, - NormalizationTest { - source: "\u{04F9}", - nfc: "\u{04F9}", - nfd: "\u{044B}\u{0308}", - nfkc: "\u{04F9}", - nfkd: "\u{044B}\u{0308}", - }, - NormalizationTest { - source: "\u{0587}", - nfc: "\u{0587}", - nfd: "\u{0587}", - nfkc: "\u{0565}\u{0582}", - nfkd: "\u{0565}\u{0582}", - }, - NormalizationTest { - source: "\u{0622}", - nfc: "\u{0622}", - nfd: "\u{0627}\u{0653}", - nfkc: "\u{0622}", - nfkd: "\u{0627}\u{0653}", - }, - NormalizationTest { - source: "\u{0623}", - nfc: "\u{0623}", - nfd: "\u{0627}\u{0654}", - nfkc: "\u{0623}", - nfkd: "\u{0627}\u{0654}", - }, - NormalizationTest { - source: "\u{0624}", - nfc: "\u{0624}", - nfd: "\u{0648}\u{0654}", - nfkc: "\u{0624}", - nfkd: "\u{0648}\u{0654}", - }, - NormalizationTest { - source: "\u{0625}", - nfc: "\u{0625}", - nfd: "\u{0627}\u{0655}", - nfkc: "\u{0625}", - nfkd: "\u{0627}\u{0655}", - }, - NormalizationTest { - source: "\u{0626}", - nfc: "\u{0626}", - nfd: "\u{064A}\u{0654}", - nfkc: "\u{0626}", - nfkd: "\u{064A}\u{0654}", - }, - NormalizationTest { - source: "\u{0675}", - nfc: "\u{0675}", - nfd: "\u{0675}", - nfkc: "\u{0627}\u{0674}", - nfkd: "\u{0627}\u{0674}", - }, - NormalizationTest { - source: "\u{0676}", - nfc: "\u{0676}", - nfd: "\u{0676}", - nfkc: "\u{0648}\u{0674}", - nfkd: "\u{0648}\u{0674}", - }, - NormalizationTest { - source: "\u{0677}", - nfc: "\u{0677}", - nfd: "\u{0677}", - nfkc: "\u{06C7}\u{0674}", - nfkd: "\u{06C7}\u{0674}", - }, - NormalizationTest { - source: "\u{0678}", - nfc: "\u{0678}", - nfd: "\u{0678}", - nfkc: "\u{064A}\u{0674}", - nfkd: "\u{064A}\u{0674}", - }, - NormalizationTest { - source: "\u{06C0}", - nfc: "\u{06C0}", - nfd: "\u{06D5}\u{0654}", - nfkc: "\u{06C0}", - nfkd: "\u{06D5}\u{0654}", - }, - NormalizationTest { - source: "\u{06C2}", - nfc: "\u{06C2}", - nfd: "\u{06C1}\u{0654}", - nfkc: "\u{06C2}", - nfkd: "\u{06C1}\u{0654}", - }, - NormalizationTest { - source: "\u{06D3}", - nfc: "\u{06D3}", - nfd: "\u{06D2}\u{0654}", - nfkc: "\u{06D3}", - nfkd: "\u{06D2}\u{0654}", - }, - NormalizationTest { - source: "\u{0929}", - nfc: "\u{0929}", - nfd: "\u{0928}\u{093C}", - nfkc: "\u{0929}", - nfkd: "\u{0928}\u{093C}", - }, - NormalizationTest { - source: "\u{0931}", - nfc: "\u{0931}", - nfd: "\u{0930}\u{093C}", - nfkc: "\u{0931}", - nfkd: "\u{0930}\u{093C}", - }, - NormalizationTest { - source: "\u{0934}", - nfc: "\u{0934}", - nfd: "\u{0933}\u{093C}", - nfkc: "\u{0934}", - nfkd: "\u{0933}\u{093C}", - }, - NormalizationTest { - source: "\u{0958}", - nfc: "\u{0915}\u{093C}", - nfd: "\u{0915}\u{093C}", - nfkc: "\u{0915}\u{093C}", - nfkd: "\u{0915}\u{093C}", - }, - NormalizationTest { - source: "\u{0959}", - nfc: "\u{0916}\u{093C}", - nfd: "\u{0916}\u{093C}", - nfkc: "\u{0916}\u{093C}", - nfkd: "\u{0916}\u{093C}", - }, - NormalizationTest { - source: "\u{095A}", - nfc: "\u{0917}\u{093C}", - nfd: "\u{0917}\u{093C}", - nfkc: "\u{0917}\u{093C}", - nfkd: "\u{0917}\u{093C}", - }, - NormalizationTest { - source: "\u{095B}", - nfc: "\u{091C}\u{093C}", - nfd: "\u{091C}\u{093C}", - nfkc: "\u{091C}\u{093C}", - nfkd: "\u{091C}\u{093C}", - }, - NormalizationTest { - source: "\u{095C}", - nfc: "\u{0921}\u{093C}", - nfd: "\u{0921}\u{093C}", - nfkc: "\u{0921}\u{093C}", - nfkd: "\u{0921}\u{093C}", - }, - NormalizationTest { - source: "\u{095D}", - nfc: "\u{0922}\u{093C}", - nfd: "\u{0922}\u{093C}", - nfkc: "\u{0922}\u{093C}", - nfkd: "\u{0922}\u{093C}", - }, - NormalizationTest { - source: "\u{095E}", - nfc: "\u{092B}\u{093C}", - nfd: "\u{092B}\u{093C}", - nfkc: "\u{092B}\u{093C}", - nfkd: "\u{092B}\u{093C}", - }, - NormalizationTest { - source: "\u{095F}", - nfc: "\u{092F}\u{093C}", - nfd: "\u{092F}\u{093C}", - nfkc: "\u{092F}\u{093C}", - nfkd: "\u{092F}\u{093C}", - }, - NormalizationTest { - source: "\u{09CB}", - nfc: "\u{09CB}", - nfd: "\u{09C7}\u{09BE}", - nfkc: "\u{09CB}", - nfkd: "\u{09C7}\u{09BE}", - }, - NormalizationTest { - source: "\u{09CC}", - nfc: "\u{09CC}", - nfd: "\u{09C7}\u{09D7}", - nfkc: "\u{09CC}", - nfkd: "\u{09C7}\u{09D7}", - }, - NormalizationTest { - source: "\u{09DC}", - nfc: "\u{09A1}\u{09BC}", - nfd: "\u{09A1}\u{09BC}", - nfkc: "\u{09A1}\u{09BC}", - nfkd: "\u{09A1}\u{09BC}", - }, - NormalizationTest { - source: "\u{09DD}", - nfc: "\u{09A2}\u{09BC}", - nfd: "\u{09A2}\u{09BC}", - nfkc: "\u{09A2}\u{09BC}", - nfkd: "\u{09A2}\u{09BC}", - }, - NormalizationTest { - source: "\u{09DF}", - nfc: "\u{09AF}\u{09BC}", - nfd: "\u{09AF}\u{09BC}", - nfkc: "\u{09AF}\u{09BC}", - nfkd: "\u{09AF}\u{09BC}", - }, - NormalizationTest { - source: "\u{0A33}", - nfc: "\u{0A32}\u{0A3C}", - nfd: "\u{0A32}\u{0A3C}", - nfkc: "\u{0A32}\u{0A3C}", - nfkd: "\u{0A32}\u{0A3C}", - }, - NormalizationTest { - source: "\u{0A36}", - nfc: "\u{0A38}\u{0A3C}", - nfd: "\u{0A38}\u{0A3C}", - nfkc: "\u{0A38}\u{0A3C}", - nfkd: "\u{0A38}\u{0A3C}", - }, - NormalizationTest { - source: "\u{0A59}", - nfc: "\u{0A16}\u{0A3C}", - nfd: "\u{0A16}\u{0A3C}", - nfkc: "\u{0A16}\u{0A3C}", - nfkd: "\u{0A16}\u{0A3C}", - }, - NormalizationTest { - source: "\u{0A5A}", - nfc: "\u{0A17}\u{0A3C}", - nfd: "\u{0A17}\u{0A3C}", - nfkc: "\u{0A17}\u{0A3C}", - nfkd: "\u{0A17}\u{0A3C}", - }, - NormalizationTest { - source: "\u{0A5B}", - nfc: "\u{0A1C}\u{0A3C}", - nfd: "\u{0A1C}\u{0A3C}", - nfkc: "\u{0A1C}\u{0A3C}", - nfkd: "\u{0A1C}\u{0A3C}", - }, - NormalizationTest { - source: "\u{0A5E}", - nfc: "\u{0A2B}\u{0A3C}", - nfd: "\u{0A2B}\u{0A3C}", - nfkc: "\u{0A2B}\u{0A3C}", - nfkd: "\u{0A2B}\u{0A3C}", - }, - NormalizationTest { - source: "\u{0B48}", - nfc: "\u{0B48}", - nfd: "\u{0B47}\u{0B56}", - nfkc: "\u{0B48}", - nfkd: "\u{0B47}\u{0B56}", - }, - NormalizationTest { - source: "\u{0B4B}", - nfc: "\u{0B4B}", - nfd: "\u{0B47}\u{0B3E}", - nfkc: "\u{0B4B}", - nfkd: "\u{0B47}\u{0B3E}", - }, - NormalizationTest { - source: "\u{0B4C}", - nfc: "\u{0B4C}", - nfd: "\u{0B47}\u{0B57}", - nfkc: "\u{0B4C}", - nfkd: "\u{0B47}\u{0B57}", - }, - NormalizationTest { - source: "\u{0B5C}", - nfc: "\u{0B21}\u{0B3C}", - nfd: "\u{0B21}\u{0B3C}", - nfkc: "\u{0B21}\u{0B3C}", - nfkd: "\u{0B21}\u{0B3C}", - }, - NormalizationTest { - source: "\u{0B5D}", - nfc: "\u{0B22}\u{0B3C}", - nfd: "\u{0B22}\u{0B3C}", - nfkc: "\u{0B22}\u{0B3C}", - nfkd: "\u{0B22}\u{0B3C}", - }, - NormalizationTest { - source: "\u{0B94}", - nfc: "\u{0B94}", - nfd: "\u{0B92}\u{0BD7}", - nfkc: "\u{0B94}", - nfkd: "\u{0B92}\u{0BD7}", - }, - NormalizationTest { - source: "\u{0BCA}", - nfc: "\u{0BCA}", - nfd: "\u{0BC6}\u{0BBE}", - nfkc: "\u{0BCA}", - nfkd: "\u{0BC6}\u{0BBE}", - }, - NormalizationTest { - source: "\u{0BCB}", - nfc: "\u{0BCB}", - nfd: "\u{0BC7}\u{0BBE}", - nfkc: "\u{0BCB}", - nfkd: "\u{0BC7}\u{0BBE}", - }, - NormalizationTest { - source: "\u{0BCC}", - nfc: "\u{0BCC}", - nfd: "\u{0BC6}\u{0BD7}", - nfkc: "\u{0BCC}", - nfkd: "\u{0BC6}\u{0BD7}", - }, - NormalizationTest { - source: "\u{0C48}", - nfc: "\u{0C48}", - nfd: "\u{0C46}\u{0C56}", - nfkc: "\u{0C48}", - nfkd: "\u{0C46}\u{0C56}", - }, - NormalizationTest { - source: "\u{0CC0}", - nfc: "\u{0CC0}", - nfd: "\u{0CBF}\u{0CD5}", - nfkc: "\u{0CC0}", - nfkd: "\u{0CBF}\u{0CD5}", - }, - NormalizationTest { - source: "\u{0CC7}", - nfc: "\u{0CC7}", - nfd: "\u{0CC6}\u{0CD5}", - nfkc: "\u{0CC7}", - nfkd: "\u{0CC6}\u{0CD5}", - }, - NormalizationTest { - source: "\u{0CC8}", - nfc: "\u{0CC8}", - nfd: "\u{0CC6}\u{0CD6}", - nfkc: "\u{0CC8}", - nfkd: "\u{0CC6}\u{0CD6}", - }, - NormalizationTest { - source: "\u{0CCA}", - nfc: "\u{0CCA}", - nfd: "\u{0CC6}\u{0CC2}", - nfkc: "\u{0CCA}", - nfkd: "\u{0CC6}\u{0CC2}", - }, - NormalizationTest { - source: "\u{0CCB}", - nfc: "\u{0CCB}", - nfd: "\u{0CC6}\u{0CC2}\u{0CD5}", - nfkc: "\u{0CCB}", - nfkd: "\u{0CC6}\u{0CC2}\u{0CD5}", - }, - NormalizationTest { - source: "\u{0D4A}", - nfc: "\u{0D4A}", - nfd: "\u{0D46}\u{0D3E}", - nfkc: "\u{0D4A}", - nfkd: "\u{0D46}\u{0D3E}", - }, - NormalizationTest { - source: "\u{0D4B}", - nfc: "\u{0D4B}", - nfd: "\u{0D47}\u{0D3E}", - nfkc: "\u{0D4B}", - nfkd: "\u{0D47}\u{0D3E}", - }, - NormalizationTest { - source: "\u{0D4C}", - nfc: "\u{0D4C}", - nfd: "\u{0D46}\u{0D57}", - nfkc: "\u{0D4C}", - nfkd: "\u{0D46}\u{0D57}", - }, - NormalizationTest { - source: "\u{0DDA}", - nfc: "\u{0DDA}", - nfd: "\u{0DD9}\u{0DCA}", - nfkc: "\u{0DDA}", - nfkd: "\u{0DD9}\u{0DCA}", - }, - NormalizationTest { - source: "\u{0DDC}", - nfc: "\u{0DDC}", - nfd: "\u{0DD9}\u{0DCF}", - nfkc: "\u{0DDC}", - nfkd: "\u{0DD9}\u{0DCF}", - }, - NormalizationTest { - source: "\u{0DDD}", - nfc: "\u{0DDD}", - nfd: "\u{0DD9}\u{0DCF}\u{0DCA}", - nfkc: "\u{0DDD}", - nfkd: "\u{0DD9}\u{0DCF}\u{0DCA}", - }, - NormalizationTest { - source: "\u{0DDE}", - nfc: "\u{0DDE}", - nfd: "\u{0DD9}\u{0DDF}", - nfkc: "\u{0DDE}", - nfkd: "\u{0DD9}\u{0DDF}", - }, - NormalizationTest { - source: "\u{0E33}", - nfc: "\u{0E33}", - nfd: "\u{0E33}", - nfkc: "\u{0E4D}\u{0E32}", - nfkd: "\u{0E4D}\u{0E32}", - }, - NormalizationTest { - source: "\u{0EB3}", - nfc: "\u{0EB3}", - nfd: "\u{0EB3}", - nfkc: "\u{0ECD}\u{0EB2}", - nfkd: "\u{0ECD}\u{0EB2}", - }, - NormalizationTest { - source: "\u{0EDC}", - nfc: "\u{0EDC}", - nfd: "\u{0EDC}", - nfkc: "\u{0EAB}\u{0E99}", - nfkd: "\u{0EAB}\u{0E99}", - }, - NormalizationTest { - source: "\u{0EDD}", - nfc: "\u{0EDD}", - nfd: "\u{0EDD}", - nfkc: "\u{0EAB}\u{0EA1}", - nfkd: "\u{0EAB}\u{0EA1}", - }, - NormalizationTest { - source: "\u{0F0C}", - nfc: "\u{0F0C}", - nfd: "\u{0F0C}", - nfkc: "\u{0F0B}", - nfkd: "\u{0F0B}", - }, - NormalizationTest { - source: "\u{0F43}", - nfc: "\u{0F42}\u{0FB7}", - nfd: "\u{0F42}\u{0FB7}", - nfkc: "\u{0F42}\u{0FB7}", - nfkd: "\u{0F42}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F4D}", - nfc: "\u{0F4C}\u{0FB7}", - nfd: "\u{0F4C}\u{0FB7}", - nfkc: "\u{0F4C}\u{0FB7}", - nfkd: "\u{0F4C}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F52}", - nfc: "\u{0F51}\u{0FB7}", - nfd: "\u{0F51}\u{0FB7}", - nfkc: "\u{0F51}\u{0FB7}", - nfkd: "\u{0F51}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F57}", - nfc: "\u{0F56}\u{0FB7}", - nfd: "\u{0F56}\u{0FB7}", - nfkc: "\u{0F56}\u{0FB7}", - nfkd: "\u{0F56}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F5C}", - nfc: "\u{0F5B}\u{0FB7}", - nfd: "\u{0F5B}\u{0FB7}", - nfkc: "\u{0F5B}\u{0FB7}", - nfkd: "\u{0F5B}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F69}", - nfc: "\u{0F40}\u{0FB5}", - nfd: "\u{0F40}\u{0FB5}", - nfkc: "\u{0F40}\u{0FB5}", - nfkd: "\u{0F40}\u{0FB5}", - }, - NormalizationTest { - source: "\u{0F73}", - nfc: "\u{0F71}\u{0F72}", - nfd: "\u{0F71}\u{0F72}", - nfkc: "\u{0F71}\u{0F72}", - nfkd: "\u{0F71}\u{0F72}", - }, - NormalizationTest { - source: "\u{0F75}", - nfc: "\u{0F71}\u{0F74}", - nfd: "\u{0F71}\u{0F74}", - nfkc: "\u{0F71}\u{0F74}", - nfkd: "\u{0F71}\u{0F74}", - }, - NormalizationTest { - source: "\u{0F76}", - nfc: "\u{0FB2}\u{0F80}", - nfd: "\u{0FB2}\u{0F80}", - nfkc: "\u{0FB2}\u{0F80}", - nfkd: "\u{0FB2}\u{0F80}", - }, - NormalizationTest { - source: "\u{0F77}", - nfc: "\u{0F77}", - nfd: "\u{0F77}", - nfkc: "\u{0FB2}\u{0F71}\u{0F80}", - nfkd: "\u{0FB2}\u{0F71}\u{0F80}", - }, - NormalizationTest { - source: "\u{0F78}", - nfc: "\u{0FB3}\u{0F80}", - nfd: "\u{0FB3}\u{0F80}", - nfkc: "\u{0FB3}\u{0F80}", - nfkd: "\u{0FB3}\u{0F80}", - }, - NormalizationTest { - source: "\u{0F79}", - nfc: "\u{0F79}", - nfd: "\u{0F79}", - nfkc: "\u{0FB3}\u{0F71}\u{0F80}", - nfkd: "\u{0FB3}\u{0F71}\u{0F80}", - }, - NormalizationTest { - source: "\u{0F81}", - nfc: "\u{0F71}\u{0F80}", - nfd: "\u{0F71}\u{0F80}", - nfkc: "\u{0F71}\u{0F80}", - nfkd: "\u{0F71}\u{0F80}", - }, - NormalizationTest { - source: "\u{0F93}", - nfc: "\u{0F92}\u{0FB7}", - nfd: "\u{0F92}\u{0FB7}", - nfkc: "\u{0F92}\u{0FB7}", - nfkd: "\u{0F92}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F9D}", - nfc: "\u{0F9C}\u{0FB7}", - nfd: "\u{0F9C}\u{0FB7}", - nfkc: "\u{0F9C}\u{0FB7}", - nfkd: "\u{0F9C}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0FA2}", - nfc: "\u{0FA1}\u{0FB7}", - nfd: "\u{0FA1}\u{0FB7}", - nfkc: "\u{0FA1}\u{0FB7}", - nfkd: "\u{0FA1}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0FA7}", - nfc: "\u{0FA6}\u{0FB7}", - nfd: "\u{0FA6}\u{0FB7}", - nfkc: "\u{0FA6}\u{0FB7}", - nfkd: "\u{0FA6}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0FAC}", - nfc: "\u{0FAB}\u{0FB7}", - nfd: "\u{0FAB}\u{0FB7}", - nfkc: "\u{0FAB}\u{0FB7}", - nfkd: "\u{0FAB}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0FB9}", - nfc: "\u{0F90}\u{0FB5}", - nfd: "\u{0F90}\u{0FB5}", - nfkc: "\u{0F90}\u{0FB5}", - nfkd: "\u{0F90}\u{0FB5}", - }, - NormalizationTest { - source: "\u{1026}", - nfc: "\u{1026}", - nfd: "\u{1025}\u{102E}", - nfkc: "\u{1026}", - nfkd: "\u{1025}\u{102E}", - }, - NormalizationTest { - source: "\u{10FC}", - nfc: "\u{10FC}", - nfd: "\u{10FC}", - nfkc: "\u{10DC}", - nfkd: "\u{10DC}", - }, - NormalizationTest { - source: "\u{1B06}", - nfc: "\u{1B06}", - nfd: "\u{1B05}\u{1B35}", - nfkc: "\u{1B06}", - nfkd: "\u{1B05}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B08}", - nfc: "\u{1B08}", - nfd: "\u{1B07}\u{1B35}", - nfkc: "\u{1B08}", - nfkd: "\u{1B07}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B0A}", - nfc: "\u{1B0A}", - nfd: "\u{1B09}\u{1B35}", - nfkc: "\u{1B0A}", - nfkd: "\u{1B09}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B0C}", - nfc: "\u{1B0C}", - nfd: "\u{1B0B}\u{1B35}", - nfkc: "\u{1B0C}", - nfkd: "\u{1B0B}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B0E}", - nfc: "\u{1B0E}", - nfd: "\u{1B0D}\u{1B35}", - nfkc: "\u{1B0E}", - nfkd: "\u{1B0D}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B12}", - nfc: "\u{1B12}", - nfd: "\u{1B11}\u{1B35}", - nfkc: "\u{1B12}", - nfkd: "\u{1B11}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B3B}", - nfc: "\u{1B3B}", - nfd: "\u{1B3A}\u{1B35}", - nfkc: "\u{1B3B}", - nfkd: "\u{1B3A}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B3D}", - nfc: "\u{1B3D}", - nfd: "\u{1B3C}\u{1B35}", - nfkc: "\u{1B3D}", - nfkd: "\u{1B3C}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B40}", - nfc: "\u{1B40}", - nfd: "\u{1B3E}\u{1B35}", - nfkc: "\u{1B40}", - nfkd: "\u{1B3E}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B41}", - nfc: "\u{1B41}", - nfd: "\u{1B3F}\u{1B35}", - nfkc: "\u{1B41}", - nfkd: "\u{1B3F}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B43}", - nfc: "\u{1B43}", - nfd: "\u{1B42}\u{1B35}", - nfkc: "\u{1B43}", - nfkd: "\u{1B42}\u{1B35}", - }, - NormalizationTest { - source: "\u{1D2C}", - nfc: "\u{1D2C}", - nfd: "\u{1D2C}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D2D}", - nfc: "\u{1D2D}", - nfd: "\u{1D2D}", - nfkc: "\u{00C6}", - nfkd: "\u{00C6}", - }, - NormalizationTest { - source: "\u{1D2E}", - nfc: "\u{1D2E}", - nfd: "\u{1D2E}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D30}", - nfc: "\u{1D30}", - nfd: "\u{1D30}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D31}", - nfc: "\u{1D31}", - nfd: "\u{1D31}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D32}", - nfc: "\u{1D32}", - nfd: "\u{1D32}", - nfkc: "\u{018E}", - nfkd: "\u{018E}", - }, - NormalizationTest { - source: "\u{1D33}", - nfc: "\u{1D33}", - nfd: "\u{1D33}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D34}", - nfc: "\u{1D34}", - nfd: "\u{1D34}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D35}", - nfc: "\u{1D35}", - nfd: "\u{1D35}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D36}", - nfc: "\u{1D36}", - nfd: "\u{1D36}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D37}", - nfc: "\u{1D37}", - nfd: "\u{1D37}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D38}", - nfc: "\u{1D38}", - nfd: "\u{1D38}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D39}", - nfc: "\u{1D39}", - nfd: "\u{1D39}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D3A}", - nfc: "\u{1D3A}", - nfd: "\u{1D3A}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D3C}", - nfc: "\u{1D3C}", - nfd: "\u{1D3C}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D3D}", - nfc: "\u{1D3D}", - nfd: "\u{1D3D}", - nfkc: "\u{0222}", - nfkd: "\u{0222}", - }, - NormalizationTest { - source: "\u{1D3E}", - nfc: "\u{1D3E}", - nfd: "\u{1D3E}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D3F}", - nfc: "\u{1D3F}", - nfd: "\u{1D3F}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D40}", - nfc: "\u{1D40}", - nfd: "\u{1D40}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D41}", - nfc: "\u{1D41}", - nfd: "\u{1D41}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D42}", - nfc: "\u{1D42}", - nfd: "\u{1D42}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D43}", - nfc: "\u{1D43}", - nfd: "\u{1D43}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D44}", - nfc: "\u{1D44}", - nfd: "\u{1D44}", - nfkc: "\u{0250}", - nfkd: "\u{0250}", - }, - NormalizationTest { - source: "\u{1D45}", - nfc: "\u{1D45}", - nfd: "\u{1D45}", - nfkc: "\u{0251}", - nfkd: "\u{0251}", - }, - NormalizationTest { - source: "\u{1D46}", - nfc: "\u{1D46}", - nfd: "\u{1D46}", - nfkc: "\u{1D02}", - nfkd: "\u{1D02}", - }, - NormalizationTest { - source: "\u{1D47}", - nfc: "\u{1D47}", - nfd: "\u{1D47}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D48}", - nfc: "\u{1D48}", - nfd: "\u{1D48}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D49}", - nfc: "\u{1D49}", - nfd: "\u{1D49}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D4A}", - nfc: "\u{1D4A}", - nfd: "\u{1D4A}", - nfkc: "\u{0259}", - nfkd: "\u{0259}", - }, - NormalizationTest { - source: "\u{1D4B}", - nfc: "\u{1D4B}", - nfd: "\u{1D4B}", - nfkc: "\u{025B}", - nfkd: "\u{025B}", - }, - NormalizationTest { - source: "\u{1D4C}", - nfc: "\u{1D4C}", - nfd: "\u{1D4C}", - nfkc: "\u{025C}", - nfkd: "\u{025C}", - }, - NormalizationTest { - source: "\u{1D4D}", - nfc: "\u{1D4D}", - nfd: "\u{1D4D}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D4F}", - nfc: "\u{1D4F}", - nfd: "\u{1D4F}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D50}", - nfc: "\u{1D50}", - nfd: "\u{1D50}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D51}", - nfc: "\u{1D51}", - nfd: "\u{1D51}", - nfkc: "\u{014B}", - nfkd: "\u{014B}", - }, - NormalizationTest { - source: "\u{1D52}", - nfc: "\u{1D52}", - nfd: "\u{1D52}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D53}", - nfc: "\u{1D53}", - nfd: "\u{1D53}", - nfkc: "\u{0254}", - nfkd: "\u{0254}", - }, - NormalizationTest { - source: "\u{1D54}", - nfc: "\u{1D54}", - nfd: "\u{1D54}", - nfkc: "\u{1D16}", - nfkd: "\u{1D16}", - }, - NormalizationTest { - source: "\u{1D55}", - nfc: "\u{1D55}", - nfd: "\u{1D55}", - nfkc: "\u{1D17}", - nfkd: "\u{1D17}", - }, - NormalizationTest { - source: "\u{1D56}", - nfc: "\u{1D56}", - nfd: "\u{1D56}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D57}", - nfc: "\u{1D57}", - nfd: "\u{1D57}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D58}", - nfc: "\u{1D58}", - nfd: "\u{1D58}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D59}", - nfc: "\u{1D59}", - nfd: "\u{1D59}", - nfkc: "\u{1D1D}", - nfkd: "\u{1D1D}", - }, - NormalizationTest { - source: "\u{1D5A}", - nfc: "\u{1D5A}", - nfd: "\u{1D5A}", - nfkc: "\u{026F}", - nfkd: "\u{026F}", - }, - NormalizationTest { - source: "\u{1D5B}", - nfc: "\u{1D5B}", - nfd: "\u{1D5B}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D5C}", - nfc: "\u{1D5C}", - nfd: "\u{1D5C}", - nfkc: "\u{1D25}", - nfkd: "\u{1D25}", - }, - NormalizationTest { - source: "\u{1D5D}", - nfc: "\u{1D5D}", - nfd: "\u{1D5D}", - nfkc: "\u{03B2}", - nfkd: "\u{03B2}", - }, - NormalizationTest { - source: "\u{1D5E}", - nfc: "\u{1D5E}", - nfd: "\u{1D5E}", - nfkc: "\u{03B3}", - nfkd: "\u{03B3}", - }, - NormalizationTest { - source: "\u{1D5F}", - nfc: "\u{1D5F}", - nfd: "\u{1D5F}", - nfkc: "\u{03B4}", - nfkd: "\u{03B4}", - }, - NormalizationTest { - source: "\u{1D60}", - nfc: "\u{1D60}", - nfd: "\u{1D60}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D61}", - nfc: "\u{1D61}", - nfd: "\u{1D61}", - nfkc: "\u{03C7}", - nfkd: "\u{03C7}", - }, - NormalizationTest { - source: "\u{1D62}", - nfc: "\u{1D62}", - nfd: "\u{1D62}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D63}", - nfc: "\u{1D63}", - nfd: "\u{1D63}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D64}", - nfc: "\u{1D64}", - nfd: "\u{1D64}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D65}", - nfc: "\u{1D65}", - nfd: "\u{1D65}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D66}", - nfc: "\u{1D66}", - nfd: "\u{1D66}", - nfkc: "\u{03B2}", - nfkd: "\u{03B2}", - }, - NormalizationTest { - source: "\u{1D67}", - nfc: "\u{1D67}", - nfd: "\u{1D67}", - nfkc: "\u{03B3}", - nfkd: "\u{03B3}", - }, - NormalizationTest { - source: "\u{1D68}", - nfc: "\u{1D68}", - nfd: "\u{1D68}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D69}", - nfc: "\u{1D69}", - nfd: "\u{1D69}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D6A}", - nfc: "\u{1D6A}", - nfd: "\u{1D6A}", - nfkc: "\u{03C7}", - nfkd: "\u{03C7}", - }, - NormalizationTest { - source: "\u{1D78}", - nfc: "\u{1D78}", - nfd: "\u{1D78}", - nfkc: "\u{043D}", - nfkd: "\u{043D}", - }, - NormalizationTest { - source: "\u{1D9B}", - nfc: "\u{1D9B}", - nfd: "\u{1D9B}", - nfkc: "\u{0252}", - nfkd: "\u{0252}", - }, - NormalizationTest { - source: "\u{1D9C}", - nfc: "\u{1D9C}", - nfd: "\u{1D9C}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D9D}", - nfc: "\u{1D9D}", - nfd: "\u{1D9D}", - nfkc: "\u{0255}", - nfkd: "\u{0255}", - }, - NormalizationTest { - source: "\u{1D9E}", - nfc: "\u{1D9E}", - nfd: "\u{1D9E}", - nfkc: "\u{00F0}", - nfkd: "\u{00F0}", - }, - NormalizationTest { - source: "\u{1D9F}", - nfc: "\u{1D9F}", - nfd: "\u{1D9F}", - nfkc: "\u{025C}", - nfkd: "\u{025C}", - }, - NormalizationTest { - source: "\u{1DA0}", - nfc: "\u{1DA0}", - nfd: "\u{1DA0}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1DA1}", - nfc: "\u{1DA1}", - nfd: "\u{1DA1}", - nfkc: "\u{025F}", - nfkd: "\u{025F}", - }, - NormalizationTest { - source: "\u{1DA2}", - nfc: "\u{1DA2}", - nfd: "\u{1DA2}", - nfkc: "\u{0261}", - nfkd: "\u{0261}", - }, - NormalizationTest { - source: "\u{1DA3}", - nfc: "\u{1DA3}", - nfd: "\u{1DA3}", - nfkc: "\u{0265}", - nfkd: "\u{0265}", - }, - NormalizationTest { - source: "\u{1DA4}", - nfc: "\u{1DA4}", - nfd: "\u{1DA4}", - nfkc: "\u{0268}", - nfkd: "\u{0268}", - }, - NormalizationTest { - source: "\u{1DA5}", - nfc: "\u{1DA5}", - nfd: "\u{1DA5}", - nfkc: "\u{0269}", - nfkd: "\u{0269}", - }, - NormalizationTest { - source: "\u{1DA6}", - nfc: "\u{1DA6}", - nfd: "\u{1DA6}", - nfkc: "\u{026A}", - nfkd: "\u{026A}", - }, - NormalizationTest { - source: "\u{1DA7}", - nfc: "\u{1DA7}", - nfd: "\u{1DA7}", - nfkc: "\u{1D7B}", - nfkd: "\u{1D7B}", - }, - NormalizationTest { - source: "\u{1DA8}", - nfc: "\u{1DA8}", - nfd: "\u{1DA8}", - nfkc: "\u{029D}", - nfkd: "\u{029D}", - }, - NormalizationTest { - source: "\u{1DA9}", - nfc: "\u{1DA9}", - nfd: "\u{1DA9}", - nfkc: "\u{026D}", - nfkd: "\u{026D}", - }, - NormalizationTest { - source: "\u{1DAA}", - nfc: "\u{1DAA}", - nfd: "\u{1DAA}", - nfkc: "\u{1D85}", - nfkd: "\u{1D85}", - }, - NormalizationTest { - source: "\u{1DAB}", - nfc: "\u{1DAB}", - nfd: "\u{1DAB}", - nfkc: "\u{029F}", - nfkd: "\u{029F}", - }, - NormalizationTest { - source: "\u{1DAC}", - nfc: "\u{1DAC}", - nfd: "\u{1DAC}", - nfkc: "\u{0271}", - nfkd: "\u{0271}", - }, - NormalizationTest { - source: "\u{1DAD}", - nfc: "\u{1DAD}", - nfd: "\u{1DAD}", - nfkc: "\u{0270}", - nfkd: "\u{0270}", - }, - NormalizationTest { - source: "\u{1DAE}", - nfc: "\u{1DAE}", - nfd: "\u{1DAE}", - nfkc: "\u{0272}", - nfkd: "\u{0272}", - }, - NormalizationTest { - source: "\u{1DAF}", - nfc: "\u{1DAF}", - nfd: "\u{1DAF}", - nfkc: "\u{0273}", - nfkd: "\u{0273}", - }, - NormalizationTest { - source: "\u{1DB0}", - nfc: "\u{1DB0}", - nfd: "\u{1DB0}", - nfkc: "\u{0274}", - nfkd: "\u{0274}", - }, - NormalizationTest { - source: "\u{1DB1}", - nfc: "\u{1DB1}", - nfd: "\u{1DB1}", - nfkc: "\u{0275}", - nfkd: "\u{0275}", - }, - NormalizationTest { - source: "\u{1DB2}", - nfc: "\u{1DB2}", - nfd: "\u{1DB2}", - nfkc: "\u{0278}", - nfkd: "\u{0278}", - }, - NormalizationTest { - source: "\u{1DB3}", - nfc: "\u{1DB3}", - nfd: "\u{1DB3}", - nfkc: "\u{0282}", - nfkd: "\u{0282}", - }, - NormalizationTest { - source: "\u{1DB4}", - nfc: "\u{1DB4}", - nfd: "\u{1DB4}", - nfkc: "\u{0283}", - nfkd: "\u{0283}", - }, - NormalizationTest { - source: "\u{1DB5}", - nfc: "\u{1DB5}", - nfd: "\u{1DB5}", - nfkc: "\u{01AB}", - nfkd: "\u{01AB}", - }, - NormalizationTest { - source: "\u{1DB6}", - nfc: "\u{1DB6}", - nfd: "\u{1DB6}", - nfkc: "\u{0289}", - nfkd: "\u{0289}", - }, - NormalizationTest { - source: "\u{1DB7}", - nfc: "\u{1DB7}", - nfd: "\u{1DB7}", - nfkc: "\u{028A}", - nfkd: "\u{028A}", - }, - NormalizationTest { - source: "\u{1DB8}", - nfc: "\u{1DB8}", - nfd: "\u{1DB8}", - nfkc: "\u{1D1C}", - nfkd: "\u{1D1C}", - }, - NormalizationTest { - source: "\u{1DB9}", - nfc: "\u{1DB9}", - nfd: "\u{1DB9}", - nfkc: "\u{028B}", - nfkd: "\u{028B}", - }, - NormalizationTest { - source: "\u{1DBA}", - nfc: "\u{1DBA}", - nfd: "\u{1DBA}", - nfkc: "\u{028C}", - nfkd: "\u{028C}", - }, - NormalizationTest { - source: "\u{1DBB}", - nfc: "\u{1DBB}", - nfd: "\u{1DBB}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1DBC}", - nfc: "\u{1DBC}", - nfd: "\u{1DBC}", - nfkc: "\u{0290}", - nfkd: "\u{0290}", - }, - NormalizationTest { - source: "\u{1DBD}", - nfc: "\u{1DBD}", - nfd: "\u{1DBD}", - nfkc: "\u{0291}", - nfkd: "\u{0291}", - }, - NormalizationTest { - source: "\u{1DBE}", - nfc: "\u{1DBE}", - nfd: "\u{1DBE}", - nfkc: "\u{0292}", - nfkd: "\u{0292}", - }, - NormalizationTest { - source: "\u{1DBF}", - nfc: "\u{1DBF}", - nfd: "\u{1DBF}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1E00}", - nfc: "\u{1E00}", - nfd: "\u{0041}\u{0325}", - nfkc: "\u{1E00}", - nfkd: "\u{0041}\u{0325}", - }, - NormalizationTest { - source: "\u{1E01}", - nfc: "\u{1E01}", - nfd: "\u{0061}\u{0325}", - nfkc: "\u{1E01}", - nfkd: "\u{0061}\u{0325}", - }, - NormalizationTest { - source: "\u{1E02}", - nfc: "\u{1E02}", - nfd: "\u{0042}\u{0307}", - nfkc: "\u{1E02}", - nfkd: "\u{0042}\u{0307}", - }, - NormalizationTest { - source: "\u{1E03}", - nfc: "\u{1E03}", - nfd: "\u{0062}\u{0307}", - nfkc: "\u{1E03}", - nfkd: "\u{0062}\u{0307}", - }, - NormalizationTest { - source: "\u{1E04}", - nfc: "\u{1E04}", - nfd: "\u{0042}\u{0323}", - nfkc: "\u{1E04}", - nfkd: "\u{0042}\u{0323}", - }, - NormalizationTest { - source: "\u{1E05}", - nfc: "\u{1E05}", - nfd: "\u{0062}\u{0323}", - nfkc: "\u{1E05}", - nfkd: "\u{0062}\u{0323}", - }, - NormalizationTest { - source: "\u{1E06}", - nfc: "\u{1E06}", - nfd: "\u{0042}\u{0331}", - nfkc: "\u{1E06}", - nfkd: "\u{0042}\u{0331}", - }, - NormalizationTest { - source: "\u{1E07}", - nfc: "\u{1E07}", - nfd: "\u{0062}\u{0331}", - nfkc: "\u{1E07}", - nfkd: "\u{0062}\u{0331}", - }, - NormalizationTest { - source: "\u{1E08}", - nfc: "\u{1E08}", - nfd: "\u{0043}\u{0327}\u{0301}", - nfkc: "\u{1E08}", - nfkd: "\u{0043}\u{0327}\u{0301}", - }, - NormalizationTest { - source: "\u{1E09}", - nfc: "\u{1E09}", - nfd: "\u{0063}\u{0327}\u{0301}", - nfkc: "\u{1E09}", - nfkd: "\u{0063}\u{0327}\u{0301}", - }, - NormalizationTest { - source: "\u{1E0A}", - nfc: "\u{1E0A}", - nfd: "\u{0044}\u{0307}", - nfkc: "\u{1E0A}", - nfkd: "\u{0044}\u{0307}", - }, - NormalizationTest { - source: "\u{1E0B}", - nfc: "\u{1E0B}", - nfd: "\u{0064}\u{0307}", - nfkc: "\u{1E0B}", - nfkd: "\u{0064}\u{0307}", - }, - NormalizationTest { - source: "\u{1E0C}", - nfc: "\u{1E0C}", - nfd: "\u{0044}\u{0323}", - nfkc: "\u{1E0C}", - nfkd: "\u{0044}\u{0323}", - }, - NormalizationTest { - source: "\u{1E0D}", - nfc: "\u{1E0D}", - nfd: "\u{0064}\u{0323}", - nfkc: "\u{1E0D}", - nfkd: "\u{0064}\u{0323}", - }, - NormalizationTest { - source: "\u{1E0E}", - nfc: "\u{1E0E}", - nfd: "\u{0044}\u{0331}", - nfkc: "\u{1E0E}", - nfkd: "\u{0044}\u{0331}", - }, - NormalizationTest { - source: "\u{1E0F}", - nfc: "\u{1E0F}", - nfd: "\u{0064}\u{0331}", - nfkc: "\u{1E0F}", - nfkd: "\u{0064}\u{0331}", - }, - NormalizationTest { - source: "\u{1E10}", - nfc: "\u{1E10}", - nfd: "\u{0044}\u{0327}", - nfkc: "\u{1E10}", - nfkd: "\u{0044}\u{0327}", - }, - NormalizationTest { - source: "\u{1E11}", - nfc: "\u{1E11}", - nfd: "\u{0064}\u{0327}", - nfkc: "\u{1E11}", - nfkd: "\u{0064}\u{0327}", - }, - NormalizationTest { - source: "\u{1E12}", - nfc: "\u{1E12}", - nfd: "\u{0044}\u{032D}", - nfkc: "\u{1E12}", - nfkd: "\u{0044}\u{032D}", - }, - NormalizationTest { - source: "\u{1E13}", - nfc: "\u{1E13}", - nfd: "\u{0064}\u{032D}", - nfkc: "\u{1E13}", - nfkd: "\u{0064}\u{032D}", - }, - NormalizationTest { - source: "\u{1E14}", - nfc: "\u{1E14}", - nfd: "\u{0045}\u{0304}\u{0300}", - nfkc: "\u{1E14}", - nfkd: "\u{0045}\u{0304}\u{0300}", - }, - NormalizationTest { - source: "\u{1E15}", - nfc: "\u{1E15}", - nfd: "\u{0065}\u{0304}\u{0300}", - nfkc: "\u{1E15}", - nfkd: "\u{0065}\u{0304}\u{0300}", - }, - NormalizationTest { - source: "\u{1E16}", - nfc: "\u{1E16}", - nfd: "\u{0045}\u{0304}\u{0301}", - nfkc: "\u{1E16}", - nfkd: "\u{0045}\u{0304}\u{0301}", - }, - NormalizationTest { - source: "\u{1E17}", - nfc: "\u{1E17}", - nfd: "\u{0065}\u{0304}\u{0301}", - nfkc: "\u{1E17}", - nfkd: "\u{0065}\u{0304}\u{0301}", - }, - NormalizationTest { - source: "\u{1E18}", - nfc: "\u{1E18}", - nfd: "\u{0045}\u{032D}", - nfkc: "\u{1E18}", - nfkd: "\u{0045}\u{032D}", - }, - NormalizationTest { - source: "\u{1E19}", - nfc: "\u{1E19}", - nfd: "\u{0065}\u{032D}", - nfkc: "\u{1E19}", - nfkd: "\u{0065}\u{032D}", - }, - NormalizationTest { - source: "\u{1E1A}", - nfc: "\u{1E1A}", - nfd: "\u{0045}\u{0330}", - nfkc: "\u{1E1A}", - nfkd: "\u{0045}\u{0330}", - }, - NormalizationTest { - source: "\u{1E1B}", - nfc: "\u{1E1B}", - nfd: "\u{0065}\u{0330}", - nfkc: "\u{1E1B}", - nfkd: "\u{0065}\u{0330}", - }, - NormalizationTest { - source: "\u{1E1C}", - nfc: "\u{1E1C}", - nfd: "\u{0045}\u{0327}\u{0306}", - nfkc: "\u{1E1C}", - nfkd: "\u{0045}\u{0327}\u{0306}", - }, - NormalizationTest { - source: "\u{1E1D}", - nfc: "\u{1E1D}", - nfd: "\u{0065}\u{0327}\u{0306}", - nfkc: "\u{1E1D}", - nfkd: "\u{0065}\u{0327}\u{0306}", - }, - NormalizationTest { - source: "\u{1E1E}", - nfc: "\u{1E1E}", - nfd: "\u{0046}\u{0307}", - nfkc: "\u{1E1E}", - nfkd: "\u{0046}\u{0307}", - }, - NormalizationTest { - source: "\u{1E1F}", - nfc: "\u{1E1F}", - nfd: "\u{0066}\u{0307}", - nfkc: "\u{1E1F}", - nfkd: "\u{0066}\u{0307}", - }, - NormalizationTest { - source: "\u{1E20}", - nfc: "\u{1E20}", - nfd: "\u{0047}\u{0304}", - nfkc: "\u{1E20}", - nfkd: "\u{0047}\u{0304}", - }, - NormalizationTest { - source: "\u{1E21}", - nfc: "\u{1E21}", - nfd: "\u{0067}\u{0304}", - nfkc: "\u{1E21}", - nfkd: "\u{0067}\u{0304}", - }, - NormalizationTest { - source: "\u{1E22}", - nfc: "\u{1E22}", - nfd: "\u{0048}\u{0307}", - nfkc: "\u{1E22}", - nfkd: "\u{0048}\u{0307}", - }, - NormalizationTest { - source: "\u{1E23}", - nfc: "\u{1E23}", - nfd: "\u{0068}\u{0307}", - nfkc: "\u{1E23}", - nfkd: "\u{0068}\u{0307}", - }, - NormalizationTest { - source: "\u{1E24}", - nfc: "\u{1E24}", - nfd: "\u{0048}\u{0323}", - nfkc: "\u{1E24}", - nfkd: "\u{0048}\u{0323}", - }, - NormalizationTest { - source: "\u{1E25}", - nfc: "\u{1E25}", - nfd: "\u{0068}\u{0323}", - nfkc: "\u{1E25}", - nfkd: "\u{0068}\u{0323}", - }, - NormalizationTest { - source: "\u{1E26}", - nfc: "\u{1E26}", - nfd: "\u{0048}\u{0308}", - nfkc: "\u{1E26}", - nfkd: "\u{0048}\u{0308}", - }, - NormalizationTest { - source: "\u{1E27}", - nfc: "\u{1E27}", - nfd: "\u{0068}\u{0308}", - nfkc: "\u{1E27}", - nfkd: "\u{0068}\u{0308}", - }, - NormalizationTest { - source: "\u{1E28}", - nfc: "\u{1E28}", - nfd: "\u{0048}\u{0327}", - nfkc: "\u{1E28}", - nfkd: "\u{0048}\u{0327}", - }, - NormalizationTest { - source: "\u{1E29}", - nfc: "\u{1E29}", - nfd: "\u{0068}\u{0327}", - nfkc: "\u{1E29}", - nfkd: "\u{0068}\u{0327}", - }, - NormalizationTest { - source: "\u{1E2A}", - nfc: "\u{1E2A}", - nfd: "\u{0048}\u{032E}", - nfkc: "\u{1E2A}", - nfkd: "\u{0048}\u{032E}", - }, - NormalizationTest { - source: "\u{1E2B}", - nfc: "\u{1E2B}", - nfd: "\u{0068}\u{032E}", - nfkc: "\u{1E2B}", - nfkd: "\u{0068}\u{032E}", - }, - NormalizationTest { - source: "\u{1E2C}", - nfc: "\u{1E2C}", - nfd: "\u{0049}\u{0330}", - nfkc: "\u{1E2C}", - nfkd: "\u{0049}\u{0330}", - }, - NormalizationTest { - source: "\u{1E2D}", - nfc: "\u{1E2D}", - nfd: "\u{0069}\u{0330}", - nfkc: "\u{1E2D}", - nfkd: "\u{0069}\u{0330}", - }, - NormalizationTest { - source: "\u{1E2E}", - nfc: "\u{1E2E}", - nfd: "\u{0049}\u{0308}\u{0301}", - nfkc: "\u{1E2E}", - nfkd: "\u{0049}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{1E2F}", - nfc: "\u{1E2F}", - nfd: "\u{0069}\u{0308}\u{0301}", - nfkc: "\u{1E2F}", - nfkd: "\u{0069}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{1E30}", - nfc: "\u{1E30}", - nfd: "\u{004B}\u{0301}", - nfkc: "\u{1E30}", - nfkd: "\u{004B}\u{0301}", - }, - NormalizationTest { - source: "\u{1E31}", - nfc: "\u{1E31}", - nfd: "\u{006B}\u{0301}", - nfkc: "\u{1E31}", - nfkd: "\u{006B}\u{0301}", - }, - NormalizationTest { - source: "\u{1E32}", - nfc: "\u{1E32}", - nfd: "\u{004B}\u{0323}", - nfkc: "\u{1E32}", - nfkd: "\u{004B}\u{0323}", - }, - NormalizationTest { - source: "\u{1E33}", - nfc: "\u{1E33}", - nfd: "\u{006B}\u{0323}", - nfkc: "\u{1E33}", - nfkd: "\u{006B}\u{0323}", - }, - NormalizationTest { - source: "\u{1E34}", - nfc: "\u{1E34}", - nfd: "\u{004B}\u{0331}", - nfkc: "\u{1E34}", - nfkd: "\u{004B}\u{0331}", - }, - NormalizationTest { - source: "\u{1E35}", - nfc: "\u{1E35}", - nfd: "\u{006B}\u{0331}", - nfkc: "\u{1E35}", - nfkd: "\u{006B}\u{0331}", - }, - NormalizationTest { - source: "\u{1E36}", - nfc: "\u{1E36}", - nfd: "\u{004C}\u{0323}", - nfkc: "\u{1E36}", - nfkd: "\u{004C}\u{0323}", - }, - NormalizationTest { - source: "\u{1E37}", - nfc: "\u{1E37}", - nfd: "\u{006C}\u{0323}", - nfkc: "\u{1E37}", - nfkd: "\u{006C}\u{0323}", - }, - NormalizationTest { - source: "\u{1E38}", - nfc: "\u{1E38}", - nfd: "\u{004C}\u{0323}\u{0304}", - nfkc: "\u{1E38}", - nfkd: "\u{004C}\u{0323}\u{0304}", - }, - NormalizationTest { - source: "\u{1E39}", - nfc: "\u{1E39}", - nfd: "\u{006C}\u{0323}\u{0304}", - nfkc: "\u{1E39}", - nfkd: "\u{006C}\u{0323}\u{0304}", - }, - NormalizationTest { - source: "\u{1E3A}", - nfc: "\u{1E3A}", - nfd: "\u{004C}\u{0331}", - nfkc: "\u{1E3A}", - nfkd: "\u{004C}\u{0331}", - }, - NormalizationTest { - source: "\u{1E3B}", - nfc: "\u{1E3B}", - nfd: "\u{006C}\u{0331}", - nfkc: "\u{1E3B}", - nfkd: "\u{006C}\u{0331}", - }, - NormalizationTest { - source: "\u{1E3C}", - nfc: "\u{1E3C}", - nfd: "\u{004C}\u{032D}", - nfkc: "\u{1E3C}", - nfkd: "\u{004C}\u{032D}", - }, - NormalizationTest { - source: "\u{1E3D}", - nfc: "\u{1E3D}", - nfd: "\u{006C}\u{032D}", - nfkc: "\u{1E3D}", - nfkd: "\u{006C}\u{032D}", - }, - NormalizationTest { - source: "\u{1E3E}", - nfc: "\u{1E3E}", - nfd: "\u{004D}\u{0301}", - nfkc: "\u{1E3E}", - nfkd: "\u{004D}\u{0301}", - }, - NormalizationTest { - source: "\u{1E3F}", - nfc: "\u{1E3F}", - nfd: "\u{006D}\u{0301}", - nfkc: "\u{1E3F}", - nfkd: "\u{006D}\u{0301}", - }, - NormalizationTest { - source: "\u{1E40}", - nfc: "\u{1E40}", - nfd: "\u{004D}\u{0307}", - nfkc: "\u{1E40}", - nfkd: "\u{004D}\u{0307}", - }, - NormalizationTest { - source: "\u{1E41}", - nfc: "\u{1E41}", - nfd: "\u{006D}\u{0307}", - nfkc: "\u{1E41}", - nfkd: "\u{006D}\u{0307}", - }, - NormalizationTest { - source: "\u{1E42}", - nfc: "\u{1E42}", - nfd: "\u{004D}\u{0323}", - nfkc: "\u{1E42}", - nfkd: "\u{004D}\u{0323}", - }, - NormalizationTest { - source: "\u{1E43}", - nfc: "\u{1E43}", - nfd: "\u{006D}\u{0323}", - nfkc: "\u{1E43}", - nfkd: "\u{006D}\u{0323}", - }, - NormalizationTest { - source: "\u{1E44}", - nfc: "\u{1E44}", - nfd: "\u{004E}\u{0307}", - nfkc: "\u{1E44}", - nfkd: "\u{004E}\u{0307}", - }, - NormalizationTest { - source: "\u{1E45}", - nfc: "\u{1E45}", - nfd: "\u{006E}\u{0307}", - nfkc: "\u{1E45}", - nfkd: "\u{006E}\u{0307}", - }, - NormalizationTest { - source: "\u{1E46}", - nfc: "\u{1E46}", - nfd: "\u{004E}\u{0323}", - nfkc: "\u{1E46}", - nfkd: "\u{004E}\u{0323}", - }, - NormalizationTest { - source: "\u{1E47}", - nfc: "\u{1E47}", - nfd: "\u{006E}\u{0323}", - nfkc: "\u{1E47}", - nfkd: "\u{006E}\u{0323}", - }, - NormalizationTest { - source: "\u{1E48}", - nfc: "\u{1E48}", - nfd: "\u{004E}\u{0331}", - nfkc: "\u{1E48}", - nfkd: "\u{004E}\u{0331}", - }, - NormalizationTest { - source: "\u{1E49}", - nfc: "\u{1E49}", - nfd: "\u{006E}\u{0331}", - nfkc: "\u{1E49}", - nfkd: "\u{006E}\u{0331}", - }, - NormalizationTest { - source: "\u{1E4A}", - nfc: "\u{1E4A}", - nfd: "\u{004E}\u{032D}", - nfkc: "\u{1E4A}", - nfkd: "\u{004E}\u{032D}", - }, - NormalizationTest { - source: "\u{1E4B}", - nfc: "\u{1E4B}", - nfd: "\u{006E}\u{032D}", - nfkc: "\u{1E4B}", - nfkd: "\u{006E}\u{032D}", - }, - NormalizationTest { - source: "\u{1E4C}", - nfc: "\u{1E4C}", - nfd: "\u{004F}\u{0303}\u{0301}", - nfkc: "\u{1E4C}", - nfkd: "\u{004F}\u{0303}\u{0301}", - }, - NormalizationTest { - source: "\u{1E4D}", - nfc: "\u{1E4D}", - nfd: "\u{006F}\u{0303}\u{0301}", - nfkc: "\u{1E4D}", - nfkd: "\u{006F}\u{0303}\u{0301}", - }, - NormalizationTest { - source: "\u{1E4E}", - nfc: "\u{1E4E}", - nfd: "\u{004F}\u{0303}\u{0308}", - nfkc: "\u{1E4E}", - nfkd: "\u{004F}\u{0303}\u{0308}", - }, - NormalizationTest { - source: "\u{1E4F}", - nfc: "\u{1E4F}", - nfd: "\u{006F}\u{0303}\u{0308}", - nfkc: "\u{1E4F}", - nfkd: "\u{006F}\u{0303}\u{0308}", - }, - NormalizationTest { - source: "\u{1E50}", - nfc: "\u{1E50}", - nfd: "\u{004F}\u{0304}\u{0300}", - nfkc: "\u{1E50}", - nfkd: "\u{004F}\u{0304}\u{0300}", - }, - NormalizationTest { - source: "\u{1E51}", - nfc: "\u{1E51}", - nfd: "\u{006F}\u{0304}\u{0300}", - nfkc: "\u{1E51}", - nfkd: "\u{006F}\u{0304}\u{0300}", - }, - NormalizationTest { - source: "\u{1E52}", - nfc: "\u{1E52}", - nfd: "\u{004F}\u{0304}\u{0301}", - nfkc: "\u{1E52}", - nfkd: "\u{004F}\u{0304}\u{0301}", - }, - NormalizationTest { - source: "\u{1E53}", - nfc: "\u{1E53}", - nfd: "\u{006F}\u{0304}\u{0301}", - nfkc: "\u{1E53}", - nfkd: "\u{006F}\u{0304}\u{0301}", - }, - NormalizationTest { - source: "\u{1E54}", - nfc: "\u{1E54}", - nfd: "\u{0050}\u{0301}", - nfkc: "\u{1E54}", - nfkd: "\u{0050}\u{0301}", - }, - NormalizationTest { - source: "\u{1E55}", - nfc: "\u{1E55}", - nfd: "\u{0070}\u{0301}", - nfkc: "\u{1E55}", - nfkd: "\u{0070}\u{0301}", - }, - NormalizationTest { - source: "\u{1E56}", - nfc: "\u{1E56}", - nfd: "\u{0050}\u{0307}", - nfkc: "\u{1E56}", - nfkd: "\u{0050}\u{0307}", - }, - NormalizationTest { - source: "\u{1E57}", - nfc: "\u{1E57}", - nfd: "\u{0070}\u{0307}", - nfkc: "\u{1E57}", - nfkd: "\u{0070}\u{0307}", - }, - NormalizationTest { - source: "\u{1E58}", - nfc: "\u{1E58}", - nfd: "\u{0052}\u{0307}", - nfkc: "\u{1E58}", - nfkd: "\u{0052}\u{0307}", - }, - NormalizationTest { - source: "\u{1E59}", - nfc: "\u{1E59}", - nfd: "\u{0072}\u{0307}", - nfkc: "\u{1E59}", - nfkd: "\u{0072}\u{0307}", - }, - NormalizationTest { - source: "\u{1E5A}", - nfc: "\u{1E5A}", - nfd: "\u{0052}\u{0323}", - nfkc: "\u{1E5A}", - nfkd: "\u{0052}\u{0323}", - }, - NormalizationTest { - source: "\u{1E5B}", - nfc: "\u{1E5B}", - nfd: "\u{0072}\u{0323}", - nfkc: "\u{1E5B}", - nfkd: "\u{0072}\u{0323}", - }, - NormalizationTest { - source: "\u{1E5C}", - nfc: "\u{1E5C}", - nfd: "\u{0052}\u{0323}\u{0304}", - nfkc: "\u{1E5C}", - nfkd: "\u{0052}\u{0323}\u{0304}", - }, - NormalizationTest { - source: "\u{1E5D}", - nfc: "\u{1E5D}", - nfd: "\u{0072}\u{0323}\u{0304}", - nfkc: "\u{1E5D}", - nfkd: "\u{0072}\u{0323}\u{0304}", - }, - NormalizationTest { - source: "\u{1E5E}", - nfc: "\u{1E5E}", - nfd: "\u{0052}\u{0331}", - nfkc: "\u{1E5E}", - nfkd: "\u{0052}\u{0331}", - }, - NormalizationTest { - source: "\u{1E5F}", - nfc: "\u{1E5F}", - nfd: "\u{0072}\u{0331}", - nfkc: "\u{1E5F}", - nfkd: "\u{0072}\u{0331}", - }, - NormalizationTest { - source: "\u{1E60}", - nfc: "\u{1E60}", - nfd: "\u{0053}\u{0307}", - nfkc: "\u{1E60}", - nfkd: "\u{0053}\u{0307}", - }, - NormalizationTest { - source: "\u{1E61}", - nfc: "\u{1E61}", - nfd: "\u{0073}\u{0307}", - nfkc: "\u{1E61}", - nfkd: "\u{0073}\u{0307}", - }, - NormalizationTest { - source: "\u{1E62}", - nfc: "\u{1E62}", - nfd: "\u{0053}\u{0323}", - nfkc: "\u{1E62}", - nfkd: "\u{0053}\u{0323}", - }, - NormalizationTest { - source: "\u{1E63}", - nfc: "\u{1E63}", - nfd: "\u{0073}\u{0323}", - nfkc: "\u{1E63}", - nfkd: "\u{0073}\u{0323}", - }, - NormalizationTest { - source: "\u{1E64}", - nfc: "\u{1E64}", - nfd: "\u{0053}\u{0301}\u{0307}", - nfkc: "\u{1E64}", - nfkd: "\u{0053}\u{0301}\u{0307}", - }, - NormalizationTest { - source: "\u{1E65}", - nfc: "\u{1E65}", - nfd: "\u{0073}\u{0301}\u{0307}", - nfkc: "\u{1E65}", - nfkd: "\u{0073}\u{0301}\u{0307}", - }, - NormalizationTest { - source: "\u{1E66}", - nfc: "\u{1E66}", - nfd: "\u{0053}\u{030C}\u{0307}", - nfkc: "\u{1E66}", - nfkd: "\u{0053}\u{030C}\u{0307}", - }, - NormalizationTest { - source: "\u{1E67}", - nfc: "\u{1E67}", - nfd: "\u{0073}\u{030C}\u{0307}", - nfkc: "\u{1E67}", - nfkd: "\u{0073}\u{030C}\u{0307}", - }, - NormalizationTest { - source: "\u{1E68}", - nfc: "\u{1E68}", - nfd: "\u{0053}\u{0323}\u{0307}", - nfkc: "\u{1E68}", - nfkd: "\u{0053}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{1E69}", - nfc: "\u{1E69}", - nfd: "\u{0073}\u{0323}\u{0307}", - nfkc: "\u{1E69}", - nfkd: "\u{0073}\u{0323}\u{0307}", - }, - NormalizationTest { - source: "\u{1E6A}", - nfc: "\u{1E6A}", - nfd: "\u{0054}\u{0307}", - nfkc: "\u{1E6A}", - nfkd: "\u{0054}\u{0307}", - }, - NormalizationTest { - source: "\u{1E6B}", - nfc: "\u{1E6B}", - nfd: "\u{0074}\u{0307}", - nfkc: "\u{1E6B}", - nfkd: "\u{0074}\u{0307}", - }, - NormalizationTest { - source: "\u{1E6C}", - nfc: "\u{1E6C}", - nfd: "\u{0054}\u{0323}", - nfkc: "\u{1E6C}", - nfkd: "\u{0054}\u{0323}", - }, - NormalizationTest { - source: "\u{1E6D}", - nfc: "\u{1E6D}", - nfd: "\u{0074}\u{0323}", - nfkc: "\u{1E6D}", - nfkd: "\u{0074}\u{0323}", - }, - NormalizationTest { - source: "\u{1E6E}", - nfc: "\u{1E6E}", - nfd: "\u{0054}\u{0331}", - nfkc: "\u{1E6E}", - nfkd: "\u{0054}\u{0331}", - }, - NormalizationTest { - source: "\u{1E6F}", - nfc: "\u{1E6F}", - nfd: "\u{0074}\u{0331}", - nfkc: "\u{1E6F}", - nfkd: "\u{0074}\u{0331}", - }, - NormalizationTest { - source: "\u{1E70}", - nfc: "\u{1E70}", - nfd: "\u{0054}\u{032D}", - nfkc: "\u{1E70}", - nfkd: "\u{0054}\u{032D}", - }, - NormalizationTest { - source: "\u{1E71}", - nfc: "\u{1E71}", - nfd: "\u{0074}\u{032D}", - nfkc: "\u{1E71}", - nfkd: "\u{0074}\u{032D}", - }, - NormalizationTest { - source: "\u{1E72}", - nfc: "\u{1E72}", - nfd: "\u{0055}\u{0324}", - nfkc: "\u{1E72}", - nfkd: "\u{0055}\u{0324}", - }, - NormalizationTest { - source: "\u{1E73}", - nfc: "\u{1E73}", - nfd: "\u{0075}\u{0324}", - nfkc: "\u{1E73}", - nfkd: "\u{0075}\u{0324}", - }, - NormalizationTest { - source: "\u{1E74}", - nfc: "\u{1E74}", - nfd: "\u{0055}\u{0330}", - nfkc: "\u{1E74}", - nfkd: "\u{0055}\u{0330}", - }, - NormalizationTest { - source: "\u{1E75}", - nfc: "\u{1E75}", - nfd: "\u{0075}\u{0330}", - nfkc: "\u{1E75}", - nfkd: "\u{0075}\u{0330}", - }, - NormalizationTest { - source: "\u{1E76}", - nfc: "\u{1E76}", - nfd: "\u{0055}\u{032D}", - nfkc: "\u{1E76}", - nfkd: "\u{0055}\u{032D}", - }, - NormalizationTest { - source: "\u{1E77}", - nfc: "\u{1E77}", - nfd: "\u{0075}\u{032D}", - nfkc: "\u{1E77}", - nfkd: "\u{0075}\u{032D}", - }, - NormalizationTest { - source: "\u{1E78}", - nfc: "\u{1E78}", - nfd: "\u{0055}\u{0303}\u{0301}", - nfkc: "\u{1E78}", - nfkd: "\u{0055}\u{0303}\u{0301}", - }, - NormalizationTest { - source: "\u{1E79}", - nfc: "\u{1E79}", - nfd: "\u{0075}\u{0303}\u{0301}", - nfkc: "\u{1E79}", - nfkd: "\u{0075}\u{0303}\u{0301}", - }, - NormalizationTest { - source: "\u{1E7A}", - nfc: "\u{1E7A}", - nfd: "\u{0055}\u{0304}\u{0308}", - nfkc: "\u{1E7A}", - nfkd: "\u{0055}\u{0304}\u{0308}", - }, - NormalizationTest { - source: "\u{1E7B}", - nfc: "\u{1E7B}", - nfd: "\u{0075}\u{0304}\u{0308}", - nfkc: "\u{1E7B}", - nfkd: "\u{0075}\u{0304}\u{0308}", - }, - NormalizationTest { - source: "\u{1E7C}", - nfc: "\u{1E7C}", - nfd: "\u{0056}\u{0303}", - nfkc: "\u{1E7C}", - nfkd: "\u{0056}\u{0303}", - }, - NormalizationTest { - source: "\u{1E7D}", - nfc: "\u{1E7D}", - nfd: "\u{0076}\u{0303}", - nfkc: "\u{1E7D}", - nfkd: "\u{0076}\u{0303}", - }, - NormalizationTest { - source: "\u{1E7E}", - nfc: "\u{1E7E}", - nfd: "\u{0056}\u{0323}", - nfkc: "\u{1E7E}", - nfkd: "\u{0056}\u{0323}", - }, - NormalizationTest { - source: "\u{1E7F}", - nfc: "\u{1E7F}", - nfd: "\u{0076}\u{0323}", - nfkc: "\u{1E7F}", - nfkd: "\u{0076}\u{0323}", - }, - NormalizationTest { - source: "\u{1E80}", - nfc: "\u{1E80}", - nfd: "\u{0057}\u{0300}", - nfkc: "\u{1E80}", - nfkd: "\u{0057}\u{0300}", - }, - NormalizationTest { - source: "\u{1E81}", - nfc: "\u{1E81}", - nfd: "\u{0077}\u{0300}", - nfkc: "\u{1E81}", - nfkd: "\u{0077}\u{0300}", - }, - NormalizationTest { - source: "\u{1E82}", - nfc: "\u{1E82}", - nfd: "\u{0057}\u{0301}", - nfkc: "\u{1E82}", - nfkd: "\u{0057}\u{0301}", - }, - NormalizationTest { - source: "\u{1E83}", - nfc: "\u{1E83}", - nfd: "\u{0077}\u{0301}", - nfkc: "\u{1E83}", - nfkd: "\u{0077}\u{0301}", - }, - NormalizationTest { - source: "\u{1E84}", - nfc: "\u{1E84}", - nfd: "\u{0057}\u{0308}", - nfkc: "\u{1E84}", - nfkd: "\u{0057}\u{0308}", - }, - NormalizationTest { - source: "\u{1E85}", - nfc: "\u{1E85}", - nfd: "\u{0077}\u{0308}", - nfkc: "\u{1E85}", - nfkd: "\u{0077}\u{0308}", - }, - NormalizationTest { - source: "\u{1E86}", - nfc: "\u{1E86}", - nfd: "\u{0057}\u{0307}", - nfkc: "\u{1E86}", - nfkd: "\u{0057}\u{0307}", - }, - NormalizationTest { - source: "\u{1E87}", - nfc: "\u{1E87}", - nfd: "\u{0077}\u{0307}", - nfkc: "\u{1E87}", - nfkd: "\u{0077}\u{0307}", - }, - NormalizationTest { - source: "\u{1E88}", - nfc: "\u{1E88}", - nfd: "\u{0057}\u{0323}", - nfkc: "\u{1E88}", - nfkd: "\u{0057}\u{0323}", - }, - NormalizationTest { - source: "\u{1E89}", - nfc: "\u{1E89}", - nfd: "\u{0077}\u{0323}", - nfkc: "\u{1E89}", - nfkd: "\u{0077}\u{0323}", - }, - NormalizationTest { - source: "\u{1E8A}", - nfc: "\u{1E8A}", - nfd: "\u{0058}\u{0307}", - nfkc: "\u{1E8A}", - nfkd: "\u{0058}\u{0307}", - }, - NormalizationTest { - source: "\u{1E8B}", - nfc: "\u{1E8B}", - nfd: "\u{0078}\u{0307}", - nfkc: "\u{1E8B}", - nfkd: "\u{0078}\u{0307}", - }, - NormalizationTest { - source: "\u{1E8C}", - nfc: "\u{1E8C}", - nfd: "\u{0058}\u{0308}", - nfkc: "\u{1E8C}", - nfkd: "\u{0058}\u{0308}", - }, - NormalizationTest { - source: "\u{1E8D}", - nfc: "\u{1E8D}", - nfd: "\u{0078}\u{0308}", - nfkc: "\u{1E8D}", - nfkd: "\u{0078}\u{0308}", - }, - NormalizationTest { - source: "\u{1E8E}", - nfc: "\u{1E8E}", - nfd: "\u{0059}\u{0307}", - nfkc: "\u{1E8E}", - nfkd: "\u{0059}\u{0307}", - }, - NormalizationTest { - source: "\u{1E8F}", - nfc: "\u{1E8F}", - nfd: "\u{0079}\u{0307}", - nfkc: "\u{1E8F}", - nfkd: "\u{0079}\u{0307}", - }, - NormalizationTest { - source: "\u{1E90}", - nfc: "\u{1E90}", - nfd: "\u{005A}\u{0302}", - nfkc: "\u{1E90}", - nfkd: "\u{005A}\u{0302}", - }, - NormalizationTest { - source: "\u{1E91}", - nfc: "\u{1E91}", - nfd: "\u{007A}\u{0302}", - nfkc: "\u{1E91}", - nfkd: "\u{007A}\u{0302}", - }, - NormalizationTest { - source: "\u{1E92}", - nfc: "\u{1E92}", - nfd: "\u{005A}\u{0323}", - nfkc: "\u{1E92}", - nfkd: "\u{005A}\u{0323}", - }, - NormalizationTest { - source: "\u{1E93}", - nfc: "\u{1E93}", - nfd: "\u{007A}\u{0323}", - nfkc: "\u{1E93}", - nfkd: "\u{007A}\u{0323}", - }, - NormalizationTest { - source: "\u{1E94}", - nfc: "\u{1E94}", - nfd: "\u{005A}\u{0331}", - nfkc: "\u{1E94}", - nfkd: "\u{005A}\u{0331}", - }, - NormalizationTest { - source: "\u{1E95}", - nfc: "\u{1E95}", - nfd: "\u{007A}\u{0331}", - nfkc: "\u{1E95}", - nfkd: "\u{007A}\u{0331}", - }, - NormalizationTest { - source: "\u{1E96}", - nfc: "\u{1E96}", - nfd: "\u{0068}\u{0331}", - nfkc: "\u{1E96}", - nfkd: "\u{0068}\u{0331}", - }, - NormalizationTest { - source: "\u{1E97}", - nfc: "\u{1E97}", - nfd: "\u{0074}\u{0308}", - nfkc: "\u{1E97}", - nfkd: "\u{0074}\u{0308}", - }, - NormalizationTest { - source: "\u{1E98}", - nfc: "\u{1E98}", - nfd: "\u{0077}\u{030A}", - nfkc: "\u{1E98}", - nfkd: "\u{0077}\u{030A}", - }, - NormalizationTest { - source: "\u{1E99}", - nfc: "\u{1E99}", - nfd: "\u{0079}\u{030A}", - nfkc: "\u{1E99}", - nfkd: "\u{0079}\u{030A}", - }, - NormalizationTest { - source: "\u{1E9A}", - nfc: "\u{1E9A}", - nfd: "\u{1E9A}", - nfkc: "\u{0061}\u{02BE}", - nfkd: "\u{0061}\u{02BE}", - }, - NormalizationTest { - source: "\u{1E9B}", - nfc: "\u{1E9B}", - nfd: "\u{017F}\u{0307}", - nfkc: "\u{1E61}", - nfkd: "\u{0073}\u{0307}", - }, - NormalizationTest { - source: "\u{1EA0}", - nfc: "\u{1EA0}", - nfd: "\u{0041}\u{0323}", - nfkc: "\u{1EA0}", - nfkd: "\u{0041}\u{0323}", - }, - NormalizationTest { - source: "\u{1EA1}", - nfc: "\u{1EA1}", - nfd: "\u{0061}\u{0323}", - nfkc: "\u{1EA1}", - nfkd: "\u{0061}\u{0323}", - }, - NormalizationTest { - source: "\u{1EA2}", - nfc: "\u{1EA2}", - nfd: "\u{0041}\u{0309}", - nfkc: "\u{1EA2}", - nfkd: "\u{0041}\u{0309}", - }, - NormalizationTest { - source: "\u{1EA3}", - nfc: "\u{1EA3}", - nfd: "\u{0061}\u{0309}", - nfkc: "\u{1EA3}", - nfkd: "\u{0061}\u{0309}", - }, - NormalizationTest { - source: "\u{1EA4}", - nfc: "\u{1EA4}", - nfd: "\u{0041}\u{0302}\u{0301}", - nfkc: "\u{1EA4}", - nfkd: "\u{0041}\u{0302}\u{0301}", - }, - NormalizationTest { - source: "\u{1EA5}", - nfc: "\u{1EA5}", - nfd: "\u{0061}\u{0302}\u{0301}", - nfkc: "\u{1EA5}", - nfkd: "\u{0061}\u{0302}\u{0301}", - }, - NormalizationTest { - source: "\u{1EA6}", - nfc: "\u{1EA6}", - nfd: "\u{0041}\u{0302}\u{0300}", - nfkc: "\u{1EA6}", - nfkd: "\u{0041}\u{0302}\u{0300}", - }, - NormalizationTest { - source: "\u{1EA7}", - nfc: "\u{1EA7}", - nfd: "\u{0061}\u{0302}\u{0300}", - nfkc: "\u{1EA7}", - nfkd: "\u{0061}\u{0302}\u{0300}", - }, - NormalizationTest { - source: "\u{1EA8}", - nfc: "\u{1EA8}", - nfd: "\u{0041}\u{0302}\u{0309}", - nfkc: "\u{1EA8}", - nfkd: "\u{0041}\u{0302}\u{0309}", - }, - NormalizationTest { - source: "\u{1EA9}", - nfc: "\u{1EA9}", - nfd: "\u{0061}\u{0302}\u{0309}", - nfkc: "\u{1EA9}", - nfkd: "\u{0061}\u{0302}\u{0309}", - }, - NormalizationTest { - source: "\u{1EAA}", - nfc: "\u{1EAA}", - nfd: "\u{0041}\u{0302}\u{0303}", - nfkc: "\u{1EAA}", - nfkd: "\u{0041}\u{0302}\u{0303}", - }, - NormalizationTest { - source: "\u{1EAB}", - nfc: "\u{1EAB}", - nfd: "\u{0061}\u{0302}\u{0303}", - nfkc: "\u{1EAB}", - nfkd: "\u{0061}\u{0302}\u{0303}", - }, - NormalizationTest { - source: "\u{1EAC}", - nfc: "\u{1EAC}", - nfd: "\u{0041}\u{0323}\u{0302}", - nfkc: "\u{1EAC}", - nfkd: "\u{0041}\u{0323}\u{0302}", - }, - NormalizationTest { - source: "\u{1EAD}", - nfc: "\u{1EAD}", - nfd: "\u{0061}\u{0323}\u{0302}", - nfkc: "\u{1EAD}", - nfkd: "\u{0061}\u{0323}\u{0302}", - }, - NormalizationTest { - source: "\u{1EAE}", - nfc: "\u{1EAE}", - nfd: "\u{0041}\u{0306}\u{0301}", - nfkc: "\u{1EAE}", - nfkd: "\u{0041}\u{0306}\u{0301}", - }, - NormalizationTest { - source: "\u{1EAF}", - nfc: "\u{1EAF}", - nfd: "\u{0061}\u{0306}\u{0301}", - nfkc: "\u{1EAF}", - nfkd: "\u{0061}\u{0306}\u{0301}", - }, - NormalizationTest { - source: "\u{1EB0}", - nfc: "\u{1EB0}", - nfd: "\u{0041}\u{0306}\u{0300}", - nfkc: "\u{1EB0}", - nfkd: "\u{0041}\u{0306}\u{0300}", - }, - NormalizationTest { - source: "\u{1EB1}", - nfc: "\u{1EB1}", - nfd: "\u{0061}\u{0306}\u{0300}", - nfkc: "\u{1EB1}", - nfkd: "\u{0061}\u{0306}\u{0300}", - }, - NormalizationTest { - source: "\u{1EB2}", - nfc: "\u{1EB2}", - nfd: "\u{0041}\u{0306}\u{0309}", - nfkc: "\u{1EB2}", - nfkd: "\u{0041}\u{0306}\u{0309}", - }, - NormalizationTest { - source: "\u{1EB3}", - nfc: "\u{1EB3}", - nfd: "\u{0061}\u{0306}\u{0309}", - nfkc: "\u{1EB3}", - nfkd: "\u{0061}\u{0306}\u{0309}", - }, - NormalizationTest { - source: "\u{1EB4}", - nfc: "\u{1EB4}", - nfd: "\u{0041}\u{0306}\u{0303}", - nfkc: "\u{1EB4}", - nfkd: "\u{0041}\u{0306}\u{0303}", - }, - NormalizationTest { - source: "\u{1EB5}", - nfc: "\u{1EB5}", - nfd: "\u{0061}\u{0306}\u{0303}", - nfkc: "\u{1EB5}", - nfkd: "\u{0061}\u{0306}\u{0303}", - }, - NormalizationTest { - source: "\u{1EB6}", - nfc: "\u{1EB6}", - nfd: "\u{0041}\u{0323}\u{0306}", - nfkc: "\u{1EB6}", - nfkd: "\u{0041}\u{0323}\u{0306}", - }, - NormalizationTest { - source: "\u{1EB7}", - nfc: "\u{1EB7}", - nfd: "\u{0061}\u{0323}\u{0306}", - nfkc: "\u{1EB7}", - nfkd: "\u{0061}\u{0323}\u{0306}", - }, - NormalizationTest { - source: "\u{1EB8}", - nfc: "\u{1EB8}", - nfd: "\u{0045}\u{0323}", - nfkc: "\u{1EB8}", - nfkd: "\u{0045}\u{0323}", - }, - NormalizationTest { - source: "\u{1EB9}", - nfc: "\u{1EB9}", - nfd: "\u{0065}\u{0323}", - nfkc: "\u{1EB9}", - nfkd: "\u{0065}\u{0323}", - }, - NormalizationTest { - source: "\u{1EBA}", - nfc: "\u{1EBA}", - nfd: "\u{0045}\u{0309}", - nfkc: "\u{1EBA}", - nfkd: "\u{0045}\u{0309}", - }, - NormalizationTest { - source: "\u{1EBB}", - nfc: "\u{1EBB}", - nfd: "\u{0065}\u{0309}", - nfkc: "\u{1EBB}", - nfkd: "\u{0065}\u{0309}", - }, - NormalizationTest { - source: "\u{1EBC}", - nfc: "\u{1EBC}", - nfd: "\u{0045}\u{0303}", - nfkc: "\u{1EBC}", - nfkd: "\u{0045}\u{0303}", - }, - NormalizationTest { - source: "\u{1EBD}", - nfc: "\u{1EBD}", - nfd: "\u{0065}\u{0303}", - nfkc: "\u{1EBD}", - nfkd: "\u{0065}\u{0303}", - }, - NormalizationTest { - source: "\u{1EBE}", - nfc: "\u{1EBE}", - nfd: "\u{0045}\u{0302}\u{0301}", - nfkc: "\u{1EBE}", - nfkd: "\u{0045}\u{0302}\u{0301}", - }, - NormalizationTest { - source: "\u{1EBF}", - nfc: "\u{1EBF}", - nfd: "\u{0065}\u{0302}\u{0301}", - nfkc: "\u{1EBF}", - nfkd: "\u{0065}\u{0302}\u{0301}", - }, - NormalizationTest { - source: "\u{1EC0}", - nfc: "\u{1EC0}", - nfd: "\u{0045}\u{0302}\u{0300}", - nfkc: "\u{1EC0}", - nfkd: "\u{0045}\u{0302}\u{0300}", - }, - NormalizationTest { - source: "\u{1EC1}", - nfc: "\u{1EC1}", - nfd: "\u{0065}\u{0302}\u{0300}", - nfkc: "\u{1EC1}", - nfkd: "\u{0065}\u{0302}\u{0300}", - }, - NormalizationTest { - source: "\u{1EC2}", - nfc: "\u{1EC2}", - nfd: "\u{0045}\u{0302}\u{0309}", - nfkc: "\u{1EC2}", - nfkd: "\u{0045}\u{0302}\u{0309}", - }, - NormalizationTest { - source: "\u{1EC3}", - nfc: "\u{1EC3}", - nfd: "\u{0065}\u{0302}\u{0309}", - nfkc: "\u{1EC3}", - nfkd: "\u{0065}\u{0302}\u{0309}", - }, - NormalizationTest { - source: "\u{1EC4}", - nfc: "\u{1EC4}", - nfd: "\u{0045}\u{0302}\u{0303}", - nfkc: "\u{1EC4}", - nfkd: "\u{0045}\u{0302}\u{0303}", - }, - NormalizationTest { - source: "\u{1EC5}", - nfc: "\u{1EC5}", - nfd: "\u{0065}\u{0302}\u{0303}", - nfkc: "\u{1EC5}", - nfkd: "\u{0065}\u{0302}\u{0303}", - }, - NormalizationTest { - source: "\u{1EC6}", - nfc: "\u{1EC6}", - nfd: "\u{0045}\u{0323}\u{0302}", - nfkc: "\u{1EC6}", - nfkd: "\u{0045}\u{0323}\u{0302}", - }, - NormalizationTest { - source: "\u{1EC7}", - nfc: "\u{1EC7}", - nfd: "\u{0065}\u{0323}\u{0302}", - nfkc: "\u{1EC7}", - nfkd: "\u{0065}\u{0323}\u{0302}", - }, - NormalizationTest { - source: "\u{1EC8}", - nfc: "\u{1EC8}", - nfd: "\u{0049}\u{0309}", - nfkc: "\u{1EC8}", - nfkd: "\u{0049}\u{0309}", - }, - NormalizationTest { - source: "\u{1EC9}", - nfc: "\u{1EC9}", - nfd: "\u{0069}\u{0309}", - nfkc: "\u{1EC9}", - nfkd: "\u{0069}\u{0309}", - }, - NormalizationTest { - source: "\u{1ECA}", - nfc: "\u{1ECA}", - nfd: "\u{0049}\u{0323}", - nfkc: "\u{1ECA}", - nfkd: "\u{0049}\u{0323}", - }, - NormalizationTest { - source: "\u{1ECB}", - nfc: "\u{1ECB}", - nfd: "\u{0069}\u{0323}", - nfkc: "\u{1ECB}", - nfkd: "\u{0069}\u{0323}", - }, - NormalizationTest { - source: "\u{1ECC}", - nfc: "\u{1ECC}", - nfd: "\u{004F}\u{0323}", - nfkc: "\u{1ECC}", - nfkd: "\u{004F}\u{0323}", - }, - NormalizationTest { - source: "\u{1ECD}", - nfc: "\u{1ECD}", - nfd: "\u{006F}\u{0323}", - nfkc: "\u{1ECD}", - nfkd: "\u{006F}\u{0323}", - }, - NormalizationTest { - source: "\u{1ECE}", - nfc: "\u{1ECE}", - nfd: "\u{004F}\u{0309}", - nfkc: "\u{1ECE}", - nfkd: "\u{004F}\u{0309}", - }, - NormalizationTest { - source: "\u{1ECF}", - nfc: "\u{1ECF}", - nfd: "\u{006F}\u{0309}", - nfkc: "\u{1ECF}", - nfkd: "\u{006F}\u{0309}", - }, - NormalizationTest { - source: "\u{1ED0}", - nfc: "\u{1ED0}", - nfd: "\u{004F}\u{0302}\u{0301}", - nfkc: "\u{1ED0}", - nfkd: "\u{004F}\u{0302}\u{0301}", - }, - NormalizationTest { - source: "\u{1ED1}", - nfc: "\u{1ED1}", - nfd: "\u{006F}\u{0302}\u{0301}", - nfkc: "\u{1ED1}", - nfkd: "\u{006F}\u{0302}\u{0301}", - }, - NormalizationTest { - source: "\u{1ED2}", - nfc: "\u{1ED2}", - nfd: "\u{004F}\u{0302}\u{0300}", - nfkc: "\u{1ED2}", - nfkd: "\u{004F}\u{0302}\u{0300}", - }, - NormalizationTest { - source: "\u{1ED3}", - nfc: "\u{1ED3}", - nfd: "\u{006F}\u{0302}\u{0300}", - nfkc: "\u{1ED3}", - nfkd: "\u{006F}\u{0302}\u{0300}", - }, - NormalizationTest { - source: "\u{1ED4}", - nfc: "\u{1ED4}", - nfd: "\u{004F}\u{0302}\u{0309}", - nfkc: "\u{1ED4}", - nfkd: "\u{004F}\u{0302}\u{0309}", - }, - NormalizationTest { - source: "\u{1ED5}", - nfc: "\u{1ED5}", - nfd: "\u{006F}\u{0302}\u{0309}", - nfkc: "\u{1ED5}", - nfkd: "\u{006F}\u{0302}\u{0309}", - }, - NormalizationTest { - source: "\u{1ED6}", - nfc: "\u{1ED6}", - nfd: "\u{004F}\u{0302}\u{0303}", - nfkc: "\u{1ED6}", - nfkd: "\u{004F}\u{0302}\u{0303}", - }, - NormalizationTest { - source: "\u{1ED7}", - nfc: "\u{1ED7}", - nfd: "\u{006F}\u{0302}\u{0303}", - nfkc: "\u{1ED7}", - nfkd: "\u{006F}\u{0302}\u{0303}", - }, - NormalizationTest { - source: "\u{1ED8}", - nfc: "\u{1ED8}", - nfd: "\u{004F}\u{0323}\u{0302}", - nfkc: "\u{1ED8}", - nfkd: "\u{004F}\u{0323}\u{0302}", - }, - NormalizationTest { - source: "\u{1ED9}", - nfc: "\u{1ED9}", - nfd: "\u{006F}\u{0323}\u{0302}", - nfkc: "\u{1ED9}", - nfkd: "\u{006F}\u{0323}\u{0302}", - }, - NormalizationTest { - source: "\u{1EDA}", - nfc: "\u{1EDA}", - nfd: "\u{004F}\u{031B}\u{0301}", - nfkc: "\u{1EDA}", - nfkd: "\u{004F}\u{031B}\u{0301}", - }, - NormalizationTest { - source: "\u{1EDB}", - nfc: "\u{1EDB}", - nfd: "\u{006F}\u{031B}\u{0301}", - nfkc: "\u{1EDB}", - nfkd: "\u{006F}\u{031B}\u{0301}", - }, - NormalizationTest { - source: "\u{1EDC}", - nfc: "\u{1EDC}", - nfd: "\u{004F}\u{031B}\u{0300}", - nfkc: "\u{1EDC}", - nfkd: "\u{004F}\u{031B}\u{0300}", - }, - NormalizationTest { - source: "\u{1EDD}", - nfc: "\u{1EDD}", - nfd: "\u{006F}\u{031B}\u{0300}", - nfkc: "\u{1EDD}", - nfkd: "\u{006F}\u{031B}\u{0300}", - }, - NormalizationTest { - source: "\u{1EDE}", - nfc: "\u{1EDE}", - nfd: "\u{004F}\u{031B}\u{0309}", - nfkc: "\u{1EDE}", - nfkd: "\u{004F}\u{031B}\u{0309}", - }, - NormalizationTest { - source: "\u{1EDF}", - nfc: "\u{1EDF}", - nfd: "\u{006F}\u{031B}\u{0309}", - nfkc: "\u{1EDF}", - nfkd: "\u{006F}\u{031B}\u{0309}", - }, - NormalizationTest { - source: "\u{1EE0}", - nfc: "\u{1EE0}", - nfd: "\u{004F}\u{031B}\u{0303}", - nfkc: "\u{1EE0}", - nfkd: "\u{004F}\u{031B}\u{0303}", - }, - NormalizationTest { - source: "\u{1EE1}", - nfc: "\u{1EE1}", - nfd: "\u{006F}\u{031B}\u{0303}", - nfkc: "\u{1EE1}", - nfkd: "\u{006F}\u{031B}\u{0303}", - }, - NormalizationTest { - source: "\u{1EE2}", - nfc: "\u{1EE2}", - nfd: "\u{004F}\u{031B}\u{0323}", - nfkc: "\u{1EE2}", - nfkd: "\u{004F}\u{031B}\u{0323}", - }, - NormalizationTest { - source: "\u{1EE3}", - nfc: "\u{1EE3}", - nfd: "\u{006F}\u{031B}\u{0323}", - nfkc: "\u{1EE3}", - nfkd: "\u{006F}\u{031B}\u{0323}", - }, - NormalizationTest { - source: "\u{1EE4}", - nfc: "\u{1EE4}", - nfd: "\u{0055}\u{0323}", - nfkc: "\u{1EE4}", - nfkd: "\u{0055}\u{0323}", - }, - NormalizationTest { - source: "\u{1EE5}", - nfc: "\u{1EE5}", - nfd: "\u{0075}\u{0323}", - nfkc: "\u{1EE5}", - nfkd: "\u{0075}\u{0323}", - }, - NormalizationTest { - source: "\u{1EE6}", - nfc: "\u{1EE6}", - nfd: "\u{0055}\u{0309}", - nfkc: "\u{1EE6}", - nfkd: "\u{0055}\u{0309}", - }, - NormalizationTest { - source: "\u{1EE7}", - nfc: "\u{1EE7}", - nfd: "\u{0075}\u{0309}", - nfkc: "\u{1EE7}", - nfkd: "\u{0075}\u{0309}", - }, - NormalizationTest { - source: "\u{1EE8}", - nfc: "\u{1EE8}", - nfd: "\u{0055}\u{031B}\u{0301}", - nfkc: "\u{1EE8}", - nfkd: "\u{0055}\u{031B}\u{0301}", - }, - NormalizationTest { - source: "\u{1EE9}", - nfc: "\u{1EE9}", - nfd: "\u{0075}\u{031B}\u{0301}", - nfkc: "\u{1EE9}", - nfkd: "\u{0075}\u{031B}\u{0301}", - }, - NormalizationTest { - source: "\u{1EEA}", - nfc: "\u{1EEA}", - nfd: "\u{0055}\u{031B}\u{0300}", - nfkc: "\u{1EEA}", - nfkd: "\u{0055}\u{031B}\u{0300}", - }, - NormalizationTest { - source: "\u{1EEB}", - nfc: "\u{1EEB}", - nfd: "\u{0075}\u{031B}\u{0300}", - nfkc: "\u{1EEB}", - nfkd: "\u{0075}\u{031B}\u{0300}", - }, - NormalizationTest { - source: "\u{1EEC}", - nfc: "\u{1EEC}", - nfd: "\u{0055}\u{031B}\u{0309}", - nfkc: "\u{1EEC}", - nfkd: "\u{0055}\u{031B}\u{0309}", - }, - NormalizationTest { - source: "\u{1EED}", - nfc: "\u{1EED}", - nfd: "\u{0075}\u{031B}\u{0309}", - nfkc: "\u{1EED}", - nfkd: "\u{0075}\u{031B}\u{0309}", - }, - NormalizationTest { - source: "\u{1EEE}", - nfc: "\u{1EEE}", - nfd: "\u{0055}\u{031B}\u{0303}", - nfkc: "\u{1EEE}", - nfkd: "\u{0055}\u{031B}\u{0303}", - }, - NormalizationTest { - source: "\u{1EEF}", - nfc: "\u{1EEF}", - nfd: "\u{0075}\u{031B}\u{0303}", - nfkc: "\u{1EEF}", - nfkd: "\u{0075}\u{031B}\u{0303}", - }, - NormalizationTest { - source: "\u{1EF0}", - nfc: "\u{1EF0}", - nfd: "\u{0055}\u{031B}\u{0323}", - nfkc: "\u{1EF0}", - nfkd: "\u{0055}\u{031B}\u{0323}", - }, - NormalizationTest { - source: "\u{1EF1}", - nfc: "\u{1EF1}", - nfd: "\u{0075}\u{031B}\u{0323}", - nfkc: "\u{1EF1}", - nfkd: "\u{0075}\u{031B}\u{0323}", - }, - NormalizationTest { - source: "\u{1EF2}", - nfc: "\u{1EF2}", - nfd: "\u{0059}\u{0300}", - nfkc: "\u{1EF2}", - nfkd: "\u{0059}\u{0300}", - }, - NormalizationTest { - source: "\u{1EF3}", - nfc: "\u{1EF3}", - nfd: "\u{0079}\u{0300}", - nfkc: "\u{1EF3}", - nfkd: "\u{0079}\u{0300}", - }, - NormalizationTest { - source: "\u{1EF4}", - nfc: "\u{1EF4}", - nfd: "\u{0059}\u{0323}", - nfkc: "\u{1EF4}", - nfkd: "\u{0059}\u{0323}", - }, - NormalizationTest { - source: "\u{1EF5}", - nfc: "\u{1EF5}", - nfd: "\u{0079}\u{0323}", - nfkc: "\u{1EF5}", - nfkd: "\u{0079}\u{0323}", - }, - NormalizationTest { - source: "\u{1EF6}", - nfc: "\u{1EF6}", - nfd: "\u{0059}\u{0309}", - nfkc: "\u{1EF6}", - nfkd: "\u{0059}\u{0309}", - }, - NormalizationTest { - source: "\u{1EF7}", - nfc: "\u{1EF7}", - nfd: "\u{0079}\u{0309}", - nfkc: "\u{1EF7}", - nfkd: "\u{0079}\u{0309}", - }, - NormalizationTest { - source: "\u{1EF8}", - nfc: "\u{1EF8}", - nfd: "\u{0059}\u{0303}", - nfkc: "\u{1EF8}", - nfkd: "\u{0059}\u{0303}", - }, - NormalizationTest { - source: "\u{1EF9}", - nfc: "\u{1EF9}", - nfd: "\u{0079}\u{0303}", - nfkc: "\u{1EF9}", - nfkd: "\u{0079}\u{0303}", - }, - NormalizationTest { - source: "\u{1F00}", - nfc: "\u{1F00}", - nfd: "\u{03B1}\u{0313}", - nfkc: "\u{1F00}", - nfkd: "\u{03B1}\u{0313}", - }, - NormalizationTest { - source: "\u{1F01}", - nfc: "\u{1F01}", - nfd: "\u{03B1}\u{0314}", - nfkc: "\u{1F01}", - nfkd: "\u{03B1}\u{0314}", - }, - NormalizationTest { - source: "\u{1F02}", - nfc: "\u{1F02}", - nfd: "\u{03B1}\u{0313}\u{0300}", - nfkc: "\u{1F02}", - nfkd: "\u{03B1}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F03}", - nfc: "\u{1F03}", - nfd: "\u{03B1}\u{0314}\u{0300}", - nfkc: "\u{1F03}", - nfkd: "\u{03B1}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F04}", - nfc: "\u{1F04}", - nfd: "\u{03B1}\u{0313}\u{0301}", - nfkc: "\u{1F04}", - nfkd: "\u{03B1}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F05}", - nfc: "\u{1F05}", - nfd: "\u{03B1}\u{0314}\u{0301}", - nfkc: "\u{1F05}", - nfkd: "\u{03B1}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F06}", - nfc: "\u{1F06}", - nfd: "\u{03B1}\u{0313}\u{0342}", - nfkc: "\u{1F06}", - nfkd: "\u{03B1}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1F07}", - nfc: "\u{1F07}", - nfd: "\u{03B1}\u{0314}\u{0342}", - nfkc: "\u{1F07}", - nfkd: "\u{03B1}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F08}", - nfc: "\u{1F08}", - nfd: "\u{0391}\u{0313}", - nfkc: "\u{1F08}", - nfkd: "\u{0391}\u{0313}", - }, - NormalizationTest { - source: "\u{1F09}", - nfc: "\u{1F09}", - nfd: "\u{0391}\u{0314}", - nfkc: "\u{1F09}", - nfkd: "\u{0391}\u{0314}", - }, - NormalizationTest { - source: "\u{1F0A}", - nfc: "\u{1F0A}", - nfd: "\u{0391}\u{0313}\u{0300}", - nfkc: "\u{1F0A}", - nfkd: "\u{0391}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F0B}", - nfc: "\u{1F0B}", - nfd: "\u{0391}\u{0314}\u{0300}", - nfkc: "\u{1F0B}", - nfkd: "\u{0391}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F0C}", - nfc: "\u{1F0C}", - nfd: "\u{0391}\u{0313}\u{0301}", - nfkc: "\u{1F0C}", - nfkd: "\u{0391}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F0D}", - nfc: "\u{1F0D}", - nfd: "\u{0391}\u{0314}\u{0301}", - nfkc: "\u{1F0D}", - nfkd: "\u{0391}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F0E}", - nfc: "\u{1F0E}", - nfd: "\u{0391}\u{0313}\u{0342}", - nfkc: "\u{1F0E}", - nfkd: "\u{0391}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1F0F}", - nfc: "\u{1F0F}", - nfd: "\u{0391}\u{0314}\u{0342}", - nfkc: "\u{1F0F}", - nfkd: "\u{0391}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F10}", - nfc: "\u{1F10}", - nfd: "\u{03B5}\u{0313}", - nfkc: "\u{1F10}", - nfkd: "\u{03B5}\u{0313}", - }, - NormalizationTest { - source: "\u{1F11}", - nfc: "\u{1F11}", - nfd: "\u{03B5}\u{0314}", - nfkc: "\u{1F11}", - nfkd: "\u{03B5}\u{0314}", - }, - NormalizationTest { - source: "\u{1F12}", - nfc: "\u{1F12}", - nfd: "\u{03B5}\u{0313}\u{0300}", - nfkc: "\u{1F12}", - nfkd: "\u{03B5}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F13}", - nfc: "\u{1F13}", - nfd: "\u{03B5}\u{0314}\u{0300}", - nfkc: "\u{1F13}", - nfkd: "\u{03B5}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F14}", - nfc: "\u{1F14}", - nfd: "\u{03B5}\u{0313}\u{0301}", - nfkc: "\u{1F14}", - nfkd: "\u{03B5}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F15}", - nfc: "\u{1F15}", - nfd: "\u{03B5}\u{0314}\u{0301}", - nfkc: "\u{1F15}", - nfkd: "\u{03B5}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F18}", - nfc: "\u{1F18}", - nfd: "\u{0395}\u{0313}", - nfkc: "\u{1F18}", - nfkd: "\u{0395}\u{0313}", - }, - NormalizationTest { - source: "\u{1F19}", - nfc: "\u{1F19}", - nfd: "\u{0395}\u{0314}", - nfkc: "\u{1F19}", - nfkd: "\u{0395}\u{0314}", - }, - NormalizationTest { - source: "\u{1F1A}", - nfc: "\u{1F1A}", - nfd: "\u{0395}\u{0313}\u{0300}", - nfkc: "\u{1F1A}", - nfkd: "\u{0395}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F1B}", - nfc: "\u{1F1B}", - nfd: "\u{0395}\u{0314}\u{0300}", - nfkc: "\u{1F1B}", - nfkd: "\u{0395}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F1C}", - nfc: "\u{1F1C}", - nfd: "\u{0395}\u{0313}\u{0301}", - nfkc: "\u{1F1C}", - nfkd: "\u{0395}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F1D}", - nfc: "\u{1F1D}", - nfd: "\u{0395}\u{0314}\u{0301}", - nfkc: "\u{1F1D}", - nfkd: "\u{0395}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F20}", - nfc: "\u{1F20}", - nfd: "\u{03B7}\u{0313}", - nfkc: "\u{1F20}", - nfkd: "\u{03B7}\u{0313}", - }, - NormalizationTest { - source: "\u{1F21}", - nfc: "\u{1F21}", - nfd: "\u{03B7}\u{0314}", - nfkc: "\u{1F21}", - nfkd: "\u{03B7}\u{0314}", - }, - NormalizationTest { - source: "\u{1F22}", - nfc: "\u{1F22}", - nfd: "\u{03B7}\u{0313}\u{0300}", - nfkc: "\u{1F22}", - nfkd: "\u{03B7}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F23}", - nfc: "\u{1F23}", - nfd: "\u{03B7}\u{0314}\u{0300}", - nfkc: "\u{1F23}", - nfkd: "\u{03B7}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F24}", - nfc: "\u{1F24}", - nfd: "\u{03B7}\u{0313}\u{0301}", - nfkc: "\u{1F24}", - nfkd: "\u{03B7}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F25}", - nfc: "\u{1F25}", - nfd: "\u{03B7}\u{0314}\u{0301}", - nfkc: "\u{1F25}", - nfkd: "\u{03B7}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F26}", - nfc: "\u{1F26}", - nfd: "\u{03B7}\u{0313}\u{0342}", - nfkc: "\u{1F26}", - nfkd: "\u{03B7}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1F27}", - nfc: "\u{1F27}", - nfd: "\u{03B7}\u{0314}\u{0342}", - nfkc: "\u{1F27}", - nfkd: "\u{03B7}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F28}", - nfc: "\u{1F28}", - nfd: "\u{0397}\u{0313}", - nfkc: "\u{1F28}", - nfkd: "\u{0397}\u{0313}", - }, - NormalizationTest { - source: "\u{1F29}", - nfc: "\u{1F29}", - nfd: "\u{0397}\u{0314}", - nfkc: "\u{1F29}", - nfkd: "\u{0397}\u{0314}", - }, - NormalizationTest { - source: "\u{1F2A}", - nfc: "\u{1F2A}", - nfd: "\u{0397}\u{0313}\u{0300}", - nfkc: "\u{1F2A}", - nfkd: "\u{0397}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F2B}", - nfc: "\u{1F2B}", - nfd: "\u{0397}\u{0314}\u{0300}", - nfkc: "\u{1F2B}", - nfkd: "\u{0397}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F2C}", - nfc: "\u{1F2C}", - nfd: "\u{0397}\u{0313}\u{0301}", - nfkc: "\u{1F2C}", - nfkd: "\u{0397}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F2D}", - nfc: "\u{1F2D}", - nfd: "\u{0397}\u{0314}\u{0301}", - nfkc: "\u{1F2D}", - nfkd: "\u{0397}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F2E}", - nfc: "\u{1F2E}", - nfd: "\u{0397}\u{0313}\u{0342}", - nfkc: "\u{1F2E}", - nfkd: "\u{0397}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1F2F}", - nfc: "\u{1F2F}", - nfd: "\u{0397}\u{0314}\u{0342}", - nfkc: "\u{1F2F}", - nfkd: "\u{0397}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F30}", - nfc: "\u{1F30}", - nfd: "\u{03B9}\u{0313}", - nfkc: "\u{1F30}", - nfkd: "\u{03B9}\u{0313}", - }, - NormalizationTest { - source: "\u{1F31}", - nfc: "\u{1F31}", - nfd: "\u{03B9}\u{0314}", - nfkc: "\u{1F31}", - nfkd: "\u{03B9}\u{0314}", - }, - NormalizationTest { - source: "\u{1F32}", - nfc: "\u{1F32}", - nfd: "\u{03B9}\u{0313}\u{0300}", - nfkc: "\u{1F32}", - nfkd: "\u{03B9}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F33}", - nfc: "\u{1F33}", - nfd: "\u{03B9}\u{0314}\u{0300}", - nfkc: "\u{1F33}", - nfkd: "\u{03B9}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F34}", - nfc: "\u{1F34}", - nfd: "\u{03B9}\u{0313}\u{0301}", - nfkc: "\u{1F34}", - nfkd: "\u{03B9}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F35}", - nfc: "\u{1F35}", - nfd: "\u{03B9}\u{0314}\u{0301}", - nfkc: "\u{1F35}", - nfkd: "\u{03B9}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F36}", - nfc: "\u{1F36}", - nfd: "\u{03B9}\u{0313}\u{0342}", - nfkc: "\u{1F36}", - nfkd: "\u{03B9}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1F37}", - nfc: "\u{1F37}", - nfd: "\u{03B9}\u{0314}\u{0342}", - nfkc: "\u{1F37}", - nfkd: "\u{03B9}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F38}", - nfc: "\u{1F38}", - nfd: "\u{0399}\u{0313}", - nfkc: "\u{1F38}", - nfkd: "\u{0399}\u{0313}", - }, - NormalizationTest { - source: "\u{1F39}", - nfc: "\u{1F39}", - nfd: "\u{0399}\u{0314}", - nfkc: "\u{1F39}", - nfkd: "\u{0399}\u{0314}", - }, - NormalizationTest { - source: "\u{1F3A}", - nfc: "\u{1F3A}", - nfd: "\u{0399}\u{0313}\u{0300}", - nfkc: "\u{1F3A}", - nfkd: "\u{0399}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F3B}", - nfc: "\u{1F3B}", - nfd: "\u{0399}\u{0314}\u{0300}", - nfkc: "\u{1F3B}", - nfkd: "\u{0399}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F3C}", - nfc: "\u{1F3C}", - nfd: "\u{0399}\u{0313}\u{0301}", - nfkc: "\u{1F3C}", - nfkd: "\u{0399}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F3D}", - nfc: "\u{1F3D}", - nfd: "\u{0399}\u{0314}\u{0301}", - nfkc: "\u{1F3D}", - nfkd: "\u{0399}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F3E}", - nfc: "\u{1F3E}", - nfd: "\u{0399}\u{0313}\u{0342}", - nfkc: "\u{1F3E}", - nfkd: "\u{0399}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1F3F}", - nfc: "\u{1F3F}", - nfd: "\u{0399}\u{0314}\u{0342}", - nfkc: "\u{1F3F}", - nfkd: "\u{0399}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F40}", - nfc: "\u{1F40}", - nfd: "\u{03BF}\u{0313}", - nfkc: "\u{1F40}", - nfkd: "\u{03BF}\u{0313}", - }, - NormalizationTest { - source: "\u{1F41}", - nfc: "\u{1F41}", - nfd: "\u{03BF}\u{0314}", - nfkc: "\u{1F41}", - nfkd: "\u{03BF}\u{0314}", - }, - NormalizationTest { - source: "\u{1F42}", - nfc: "\u{1F42}", - nfd: "\u{03BF}\u{0313}\u{0300}", - nfkc: "\u{1F42}", - nfkd: "\u{03BF}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F43}", - nfc: "\u{1F43}", - nfd: "\u{03BF}\u{0314}\u{0300}", - nfkc: "\u{1F43}", - nfkd: "\u{03BF}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F44}", - nfc: "\u{1F44}", - nfd: "\u{03BF}\u{0313}\u{0301}", - nfkc: "\u{1F44}", - nfkd: "\u{03BF}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F45}", - nfc: "\u{1F45}", - nfd: "\u{03BF}\u{0314}\u{0301}", - nfkc: "\u{1F45}", - nfkd: "\u{03BF}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F48}", - nfc: "\u{1F48}", - nfd: "\u{039F}\u{0313}", - nfkc: "\u{1F48}", - nfkd: "\u{039F}\u{0313}", - }, - NormalizationTest { - source: "\u{1F49}", - nfc: "\u{1F49}", - nfd: "\u{039F}\u{0314}", - nfkc: "\u{1F49}", - nfkd: "\u{039F}\u{0314}", - }, - NormalizationTest { - source: "\u{1F4A}", - nfc: "\u{1F4A}", - nfd: "\u{039F}\u{0313}\u{0300}", - nfkc: "\u{1F4A}", - nfkd: "\u{039F}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F4B}", - nfc: "\u{1F4B}", - nfd: "\u{039F}\u{0314}\u{0300}", - nfkc: "\u{1F4B}", - nfkd: "\u{039F}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F4C}", - nfc: "\u{1F4C}", - nfd: "\u{039F}\u{0313}\u{0301}", - nfkc: "\u{1F4C}", - nfkd: "\u{039F}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F4D}", - nfc: "\u{1F4D}", - nfd: "\u{039F}\u{0314}\u{0301}", - nfkc: "\u{1F4D}", - nfkd: "\u{039F}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F50}", - nfc: "\u{1F50}", - nfd: "\u{03C5}\u{0313}", - nfkc: "\u{1F50}", - nfkd: "\u{03C5}\u{0313}", - }, - NormalizationTest { - source: "\u{1F51}", - nfc: "\u{1F51}", - nfd: "\u{03C5}\u{0314}", - nfkc: "\u{1F51}", - nfkd: "\u{03C5}\u{0314}", - }, - NormalizationTest { - source: "\u{1F52}", - nfc: "\u{1F52}", - nfd: "\u{03C5}\u{0313}\u{0300}", - nfkc: "\u{1F52}", - nfkd: "\u{03C5}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F53}", - nfc: "\u{1F53}", - nfd: "\u{03C5}\u{0314}\u{0300}", - nfkc: "\u{1F53}", - nfkd: "\u{03C5}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F54}", - nfc: "\u{1F54}", - nfd: "\u{03C5}\u{0313}\u{0301}", - nfkc: "\u{1F54}", - nfkd: "\u{03C5}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F55}", - nfc: "\u{1F55}", - nfd: "\u{03C5}\u{0314}\u{0301}", - nfkc: "\u{1F55}", - nfkd: "\u{03C5}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F56}", - nfc: "\u{1F56}", - nfd: "\u{03C5}\u{0313}\u{0342}", - nfkc: "\u{1F56}", - nfkd: "\u{03C5}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1F57}", - nfc: "\u{1F57}", - nfd: "\u{03C5}\u{0314}\u{0342}", - nfkc: "\u{1F57}", - nfkd: "\u{03C5}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F59}", - nfc: "\u{1F59}", - nfd: "\u{03A5}\u{0314}", - nfkc: "\u{1F59}", - nfkd: "\u{03A5}\u{0314}", - }, - NormalizationTest { - source: "\u{1F5B}", - nfc: "\u{1F5B}", - nfd: "\u{03A5}\u{0314}\u{0300}", - nfkc: "\u{1F5B}", - nfkd: "\u{03A5}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F5D}", - nfc: "\u{1F5D}", - nfd: "\u{03A5}\u{0314}\u{0301}", - nfkc: "\u{1F5D}", - nfkd: "\u{03A5}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F5F}", - nfc: "\u{1F5F}", - nfd: "\u{03A5}\u{0314}\u{0342}", - nfkc: "\u{1F5F}", - nfkd: "\u{03A5}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F60}", - nfc: "\u{1F60}", - nfd: "\u{03C9}\u{0313}", - nfkc: "\u{1F60}", - nfkd: "\u{03C9}\u{0313}", - }, - NormalizationTest { - source: "\u{1F61}", - nfc: "\u{1F61}", - nfd: "\u{03C9}\u{0314}", - nfkc: "\u{1F61}", - nfkd: "\u{03C9}\u{0314}", - }, - NormalizationTest { - source: "\u{1F62}", - nfc: "\u{1F62}", - nfd: "\u{03C9}\u{0313}\u{0300}", - nfkc: "\u{1F62}", - nfkd: "\u{03C9}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F63}", - nfc: "\u{1F63}", - nfd: "\u{03C9}\u{0314}\u{0300}", - nfkc: "\u{1F63}", - nfkd: "\u{03C9}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F64}", - nfc: "\u{1F64}", - nfd: "\u{03C9}\u{0313}\u{0301}", - nfkc: "\u{1F64}", - nfkd: "\u{03C9}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F65}", - nfc: "\u{1F65}", - nfd: "\u{03C9}\u{0314}\u{0301}", - nfkc: "\u{1F65}", - nfkd: "\u{03C9}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F66}", - nfc: "\u{1F66}", - nfd: "\u{03C9}\u{0313}\u{0342}", - nfkc: "\u{1F66}", - nfkd: "\u{03C9}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1F67}", - nfc: "\u{1F67}", - nfd: "\u{03C9}\u{0314}\u{0342}", - nfkc: "\u{1F67}", - nfkd: "\u{03C9}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F68}", - nfc: "\u{1F68}", - nfd: "\u{03A9}\u{0313}", - nfkc: "\u{1F68}", - nfkd: "\u{03A9}\u{0313}", - }, - NormalizationTest { - source: "\u{1F69}", - nfc: "\u{1F69}", - nfd: "\u{03A9}\u{0314}", - nfkc: "\u{1F69}", - nfkd: "\u{03A9}\u{0314}", - }, - NormalizationTest { - source: "\u{1F6A}", - nfc: "\u{1F6A}", - nfd: "\u{03A9}\u{0313}\u{0300}", - nfkc: "\u{1F6A}", - nfkd: "\u{03A9}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1F6B}", - nfc: "\u{1F6B}", - nfd: "\u{03A9}\u{0314}\u{0300}", - nfkc: "\u{1F6B}", - nfkd: "\u{03A9}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1F6C}", - nfc: "\u{1F6C}", - nfd: "\u{03A9}\u{0313}\u{0301}", - nfkc: "\u{1F6C}", - nfkd: "\u{03A9}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1F6D}", - nfc: "\u{1F6D}", - nfd: "\u{03A9}\u{0314}\u{0301}", - nfkc: "\u{1F6D}", - nfkd: "\u{03A9}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1F6E}", - nfc: "\u{1F6E}", - nfd: "\u{03A9}\u{0313}\u{0342}", - nfkc: "\u{1F6E}", - nfkd: "\u{03A9}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1F6F}", - nfc: "\u{1F6F}", - nfd: "\u{03A9}\u{0314}\u{0342}", - nfkc: "\u{1F6F}", - nfkd: "\u{03A9}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1F70}", - nfc: "\u{1F70}", - nfd: "\u{03B1}\u{0300}", - nfkc: "\u{1F70}", - nfkd: "\u{03B1}\u{0300}", - }, - NormalizationTest { - source: "\u{1F71}", - nfc: "\u{03AC}", - nfd: "\u{03B1}\u{0301}", - nfkc: "\u{03AC}", - nfkd: "\u{03B1}\u{0301}", - }, - NormalizationTest { - source: "\u{1F72}", - nfc: "\u{1F72}", - nfd: "\u{03B5}\u{0300}", - nfkc: "\u{1F72}", - nfkd: "\u{03B5}\u{0300}", - }, - NormalizationTest { - source: "\u{1F73}", - nfc: "\u{03AD}", - nfd: "\u{03B5}\u{0301}", - nfkc: "\u{03AD}", - nfkd: "\u{03B5}\u{0301}", - }, - NormalizationTest { - source: "\u{1F74}", - nfc: "\u{1F74}", - nfd: "\u{03B7}\u{0300}", - nfkc: "\u{1F74}", - nfkd: "\u{03B7}\u{0300}", - }, - NormalizationTest { - source: "\u{1F75}", - nfc: "\u{03AE}", - nfd: "\u{03B7}\u{0301}", - nfkc: "\u{03AE}", - nfkd: "\u{03B7}\u{0301}", - }, - NormalizationTest { - source: "\u{1F76}", - nfc: "\u{1F76}", - nfd: "\u{03B9}\u{0300}", - nfkc: "\u{1F76}", - nfkd: "\u{03B9}\u{0300}", - }, - NormalizationTest { - source: "\u{1F77}", - nfc: "\u{03AF}", - nfd: "\u{03B9}\u{0301}", - nfkc: "\u{03AF}", - nfkd: "\u{03B9}\u{0301}", - }, - NormalizationTest { - source: "\u{1F78}", - nfc: "\u{1F78}", - nfd: "\u{03BF}\u{0300}", - nfkc: "\u{1F78}", - nfkd: "\u{03BF}\u{0300}", - }, - NormalizationTest { - source: "\u{1F79}", - nfc: "\u{03CC}", - nfd: "\u{03BF}\u{0301}", - nfkc: "\u{03CC}", - nfkd: "\u{03BF}\u{0301}", - }, - NormalizationTest { - source: "\u{1F7A}", - nfc: "\u{1F7A}", - nfd: "\u{03C5}\u{0300}", - nfkc: "\u{1F7A}", - nfkd: "\u{03C5}\u{0300}", - }, - NormalizationTest { - source: "\u{1F7B}", - nfc: "\u{03CD}", - nfd: "\u{03C5}\u{0301}", - nfkc: "\u{03CD}", - nfkd: "\u{03C5}\u{0301}", - }, - NormalizationTest { - source: "\u{1F7C}", - nfc: "\u{1F7C}", - nfd: "\u{03C9}\u{0300}", - nfkc: "\u{1F7C}", - nfkd: "\u{03C9}\u{0300}", - }, - NormalizationTest { - source: "\u{1F7D}", - nfc: "\u{03CE}", - nfd: "\u{03C9}\u{0301}", - nfkc: "\u{03CE}", - nfkd: "\u{03C9}\u{0301}", - }, - NormalizationTest { - source: "\u{1F80}", - nfc: "\u{1F80}", - nfd: "\u{03B1}\u{0313}\u{0345}", - nfkc: "\u{1F80}", - nfkd: "\u{03B1}\u{0313}\u{0345}", - }, - NormalizationTest { - source: "\u{1F81}", - nfc: "\u{1F81}", - nfd: "\u{03B1}\u{0314}\u{0345}", - nfkc: "\u{1F81}", - nfkd: "\u{03B1}\u{0314}\u{0345}", - }, - NormalizationTest { - source: "\u{1F82}", - nfc: "\u{1F82}", - nfd: "\u{03B1}\u{0313}\u{0300}\u{0345}", - nfkc: "\u{1F82}", - nfkd: "\u{03B1}\u{0313}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1F83}", - nfc: "\u{1F83}", - nfd: "\u{03B1}\u{0314}\u{0300}\u{0345}", - nfkc: "\u{1F83}", - nfkd: "\u{03B1}\u{0314}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1F84}", - nfc: "\u{1F84}", - nfd: "\u{03B1}\u{0313}\u{0301}\u{0345}", - nfkc: "\u{1F84}", - nfkd: "\u{03B1}\u{0313}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1F85}", - nfc: "\u{1F85}", - nfd: "\u{03B1}\u{0314}\u{0301}\u{0345}", - nfkc: "\u{1F85}", - nfkd: "\u{03B1}\u{0314}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1F86}", - nfc: "\u{1F86}", - nfd: "\u{03B1}\u{0313}\u{0342}\u{0345}", - nfkc: "\u{1F86}", - nfkd: "\u{03B1}\u{0313}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1F87}", - nfc: "\u{1F87}", - nfd: "\u{03B1}\u{0314}\u{0342}\u{0345}", - nfkc: "\u{1F87}", - nfkd: "\u{03B1}\u{0314}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1F88}", - nfc: "\u{1F88}", - nfd: "\u{0391}\u{0313}\u{0345}", - nfkc: "\u{1F88}", - nfkd: "\u{0391}\u{0313}\u{0345}", - }, - NormalizationTest { - source: "\u{1F89}", - nfc: "\u{1F89}", - nfd: "\u{0391}\u{0314}\u{0345}", - nfkc: "\u{1F89}", - nfkd: "\u{0391}\u{0314}\u{0345}", - }, - NormalizationTest { - source: "\u{1F8A}", - nfc: "\u{1F8A}", - nfd: "\u{0391}\u{0313}\u{0300}\u{0345}", - nfkc: "\u{1F8A}", - nfkd: "\u{0391}\u{0313}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1F8B}", - nfc: "\u{1F8B}", - nfd: "\u{0391}\u{0314}\u{0300}\u{0345}", - nfkc: "\u{1F8B}", - nfkd: "\u{0391}\u{0314}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1F8C}", - nfc: "\u{1F8C}", - nfd: "\u{0391}\u{0313}\u{0301}\u{0345}", - nfkc: "\u{1F8C}", - nfkd: "\u{0391}\u{0313}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1F8D}", - nfc: "\u{1F8D}", - nfd: "\u{0391}\u{0314}\u{0301}\u{0345}", - nfkc: "\u{1F8D}", - nfkd: "\u{0391}\u{0314}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1F8E}", - nfc: "\u{1F8E}", - nfd: "\u{0391}\u{0313}\u{0342}\u{0345}", - nfkc: "\u{1F8E}", - nfkd: "\u{0391}\u{0313}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1F8F}", - nfc: "\u{1F8F}", - nfd: "\u{0391}\u{0314}\u{0342}\u{0345}", - nfkc: "\u{1F8F}", - nfkd: "\u{0391}\u{0314}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1F90}", - nfc: "\u{1F90}", - nfd: "\u{03B7}\u{0313}\u{0345}", - nfkc: "\u{1F90}", - nfkd: "\u{03B7}\u{0313}\u{0345}", - }, - NormalizationTest { - source: "\u{1F91}", - nfc: "\u{1F91}", - nfd: "\u{03B7}\u{0314}\u{0345}", - nfkc: "\u{1F91}", - nfkd: "\u{03B7}\u{0314}\u{0345}", - }, - NormalizationTest { - source: "\u{1F92}", - nfc: "\u{1F92}", - nfd: "\u{03B7}\u{0313}\u{0300}\u{0345}", - nfkc: "\u{1F92}", - nfkd: "\u{03B7}\u{0313}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1F93}", - nfc: "\u{1F93}", - nfd: "\u{03B7}\u{0314}\u{0300}\u{0345}", - nfkc: "\u{1F93}", - nfkd: "\u{03B7}\u{0314}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1F94}", - nfc: "\u{1F94}", - nfd: "\u{03B7}\u{0313}\u{0301}\u{0345}", - nfkc: "\u{1F94}", - nfkd: "\u{03B7}\u{0313}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1F95}", - nfc: "\u{1F95}", - nfd: "\u{03B7}\u{0314}\u{0301}\u{0345}", - nfkc: "\u{1F95}", - nfkd: "\u{03B7}\u{0314}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1F96}", - nfc: "\u{1F96}", - nfd: "\u{03B7}\u{0313}\u{0342}\u{0345}", - nfkc: "\u{1F96}", - nfkd: "\u{03B7}\u{0313}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1F97}", - nfc: "\u{1F97}", - nfd: "\u{03B7}\u{0314}\u{0342}\u{0345}", - nfkc: "\u{1F97}", - nfkd: "\u{03B7}\u{0314}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1F98}", - nfc: "\u{1F98}", - nfd: "\u{0397}\u{0313}\u{0345}", - nfkc: "\u{1F98}", - nfkd: "\u{0397}\u{0313}\u{0345}", - }, - NormalizationTest { - source: "\u{1F99}", - nfc: "\u{1F99}", - nfd: "\u{0397}\u{0314}\u{0345}", - nfkc: "\u{1F99}", - nfkd: "\u{0397}\u{0314}\u{0345}", - }, - NormalizationTest { - source: "\u{1F9A}", - nfc: "\u{1F9A}", - nfd: "\u{0397}\u{0313}\u{0300}\u{0345}", - nfkc: "\u{1F9A}", - nfkd: "\u{0397}\u{0313}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1F9B}", - nfc: "\u{1F9B}", - nfd: "\u{0397}\u{0314}\u{0300}\u{0345}", - nfkc: "\u{1F9B}", - nfkd: "\u{0397}\u{0314}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1F9C}", - nfc: "\u{1F9C}", - nfd: "\u{0397}\u{0313}\u{0301}\u{0345}", - nfkc: "\u{1F9C}", - nfkd: "\u{0397}\u{0313}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1F9D}", - nfc: "\u{1F9D}", - nfd: "\u{0397}\u{0314}\u{0301}\u{0345}", - nfkc: "\u{1F9D}", - nfkd: "\u{0397}\u{0314}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1F9E}", - nfc: "\u{1F9E}", - nfd: "\u{0397}\u{0313}\u{0342}\u{0345}", - nfkc: "\u{1F9E}", - nfkd: "\u{0397}\u{0313}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1F9F}", - nfc: "\u{1F9F}", - nfd: "\u{0397}\u{0314}\u{0342}\u{0345}", - nfkc: "\u{1F9F}", - nfkd: "\u{0397}\u{0314}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA0}", - nfc: "\u{1FA0}", - nfd: "\u{03C9}\u{0313}\u{0345}", - nfkc: "\u{1FA0}", - nfkd: "\u{03C9}\u{0313}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA1}", - nfc: "\u{1FA1}", - nfd: "\u{03C9}\u{0314}\u{0345}", - nfkc: "\u{1FA1}", - nfkd: "\u{03C9}\u{0314}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA2}", - nfc: "\u{1FA2}", - nfd: "\u{03C9}\u{0313}\u{0300}\u{0345}", - nfkc: "\u{1FA2}", - nfkd: "\u{03C9}\u{0313}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA3}", - nfc: "\u{1FA3}", - nfd: "\u{03C9}\u{0314}\u{0300}\u{0345}", - nfkc: "\u{1FA3}", - nfkd: "\u{03C9}\u{0314}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA4}", - nfc: "\u{1FA4}", - nfd: "\u{03C9}\u{0313}\u{0301}\u{0345}", - nfkc: "\u{1FA4}", - nfkd: "\u{03C9}\u{0313}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA5}", - nfc: "\u{1FA5}", - nfd: "\u{03C9}\u{0314}\u{0301}\u{0345}", - nfkc: "\u{1FA5}", - nfkd: "\u{03C9}\u{0314}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA6}", - nfc: "\u{1FA6}", - nfd: "\u{03C9}\u{0313}\u{0342}\u{0345}", - nfkc: "\u{1FA6}", - nfkd: "\u{03C9}\u{0313}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA7}", - nfc: "\u{1FA7}", - nfd: "\u{03C9}\u{0314}\u{0342}\u{0345}", - nfkc: "\u{1FA7}", - nfkd: "\u{03C9}\u{0314}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA8}", - nfc: "\u{1FA8}", - nfd: "\u{03A9}\u{0313}\u{0345}", - nfkc: "\u{1FA8}", - nfkd: "\u{03A9}\u{0313}\u{0345}", - }, - NormalizationTest { - source: "\u{1FA9}", - nfc: "\u{1FA9}", - nfd: "\u{03A9}\u{0314}\u{0345}", - nfkc: "\u{1FA9}", - nfkd: "\u{03A9}\u{0314}\u{0345}", - }, - NormalizationTest { - source: "\u{1FAA}", - nfc: "\u{1FAA}", - nfd: "\u{03A9}\u{0313}\u{0300}\u{0345}", - nfkc: "\u{1FAA}", - nfkd: "\u{03A9}\u{0313}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1FAB}", - nfc: "\u{1FAB}", - nfd: "\u{03A9}\u{0314}\u{0300}\u{0345}", - nfkc: "\u{1FAB}", - nfkd: "\u{03A9}\u{0314}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1FAC}", - nfc: "\u{1FAC}", - nfd: "\u{03A9}\u{0313}\u{0301}\u{0345}", - nfkc: "\u{1FAC}", - nfkd: "\u{03A9}\u{0313}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1FAD}", - nfc: "\u{1FAD}", - nfd: "\u{03A9}\u{0314}\u{0301}\u{0345}", - nfkc: "\u{1FAD}", - nfkd: "\u{03A9}\u{0314}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1FAE}", - nfc: "\u{1FAE}", - nfd: "\u{03A9}\u{0313}\u{0342}\u{0345}", - nfkc: "\u{1FAE}", - nfkd: "\u{03A9}\u{0313}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1FAF}", - nfc: "\u{1FAF}", - nfd: "\u{03A9}\u{0314}\u{0342}\u{0345}", - nfkc: "\u{1FAF}", - nfkd: "\u{03A9}\u{0314}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1FB0}", - nfc: "\u{1FB0}", - nfd: "\u{03B1}\u{0306}", - nfkc: "\u{1FB0}", - nfkd: "\u{03B1}\u{0306}", - }, - NormalizationTest { - source: "\u{1FB1}", - nfc: "\u{1FB1}", - nfd: "\u{03B1}\u{0304}", - nfkc: "\u{1FB1}", - nfkd: "\u{03B1}\u{0304}", - }, - NormalizationTest { - source: "\u{1FB2}", - nfc: "\u{1FB2}", - nfd: "\u{03B1}\u{0300}\u{0345}", - nfkc: "\u{1FB2}", - nfkd: "\u{03B1}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1FB3}", - nfc: "\u{1FB3}", - nfd: "\u{03B1}\u{0345}", - nfkc: "\u{1FB3}", - nfkd: "\u{03B1}\u{0345}", - }, - NormalizationTest { - source: "\u{1FB4}", - nfc: "\u{1FB4}", - nfd: "\u{03B1}\u{0301}\u{0345}", - nfkc: "\u{1FB4}", - nfkd: "\u{03B1}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1FB6}", - nfc: "\u{1FB6}", - nfd: "\u{03B1}\u{0342}", - nfkc: "\u{1FB6}", - nfkd: "\u{03B1}\u{0342}", - }, - NormalizationTest { - source: "\u{1FB7}", - nfc: "\u{1FB7}", - nfd: "\u{03B1}\u{0342}\u{0345}", - nfkc: "\u{1FB7}", - nfkd: "\u{03B1}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1FB8}", - nfc: "\u{1FB8}", - nfd: "\u{0391}\u{0306}", - nfkc: "\u{1FB8}", - nfkd: "\u{0391}\u{0306}", - }, - NormalizationTest { - source: "\u{1FB9}", - nfc: "\u{1FB9}", - nfd: "\u{0391}\u{0304}", - nfkc: "\u{1FB9}", - nfkd: "\u{0391}\u{0304}", - }, - NormalizationTest { - source: "\u{1FBA}", - nfc: "\u{1FBA}", - nfd: "\u{0391}\u{0300}", - nfkc: "\u{1FBA}", - nfkd: "\u{0391}\u{0300}", - }, - NormalizationTest { - source: "\u{1FBB}", - nfc: "\u{0386}", - nfd: "\u{0391}\u{0301}", - nfkc: "\u{0386}", - nfkd: "\u{0391}\u{0301}", - }, - NormalizationTest { - source: "\u{1FBC}", - nfc: "\u{1FBC}", - nfd: "\u{0391}\u{0345}", - nfkc: "\u{1FBC}", - nfkd: "\u{0391}\u{0345}", - }, - NormalizationTest { - source: "\u{1FBD}", - nfc: "\u{1FBD}", - nfd: "\u{1FBD}", - nfkc: "\u{0020}\u{0313}", - nfkd: "\u{0020}\u{0313}", - }, - NormalizationTest { - source: "\u{1FBE}", - nfc: "\u{03B9}", - nfd: "\u{03B9}", - nfkc: "\u{03B9}", - nfkd: "\u{03B9}", - }, - NormalizationTest { - source: "\u{1FBF}", - nfc: "\u{1FBF}", - nfd: "\u{1FBF}", - nfkc: "\u{0020}\u{0313}", - nfkd: "\u{0020}\u{0313}", - }, - NormalizationTest { - source: "\u{1FC0}", - nfc: "\u{1FC0}", - nfd: "\u{1FC0}", - nfkc: "\u{0020}\u{0342}", - nfkd: "\u{0020}\u{0342}", - }, - NormalizationTest { - source: "\u{1FC1}", - nfc: "\u{1FC1}", - nfd: "\u{00A8}\u{0342}", - nfkc: "\u{0020}\u{0308}\u{0342}", - nfkd: "\u{0020}\u{0308}\u{0342}", - }, - NormalizationTest { - source: "\u{1FC2}", - nfc: "\u{1FC2}", - nfd: "\u{03B7}\u{0300}\u{0345}", - nfkc: "\u{1FC2}", - nfkd: "\u{03B7}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1FC3}", - nfc: "\u{1FC3}", - nfd: "\u{03B7}\u{0345}", - nfkc: "\u{1FC3}", - nfkd: "\u{03B7}\u{0345}", - }, - NormalizationTest { - source: "\u{1FC4}", - nfc: "\u{1FC4}", - nfd: "\u{03B7}\u{0301}\u{0345}", - nfkc: "\u{1FC4}", - nfkd: "\u{03B7}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1FC6}", - nfc: "\u{1FC6}", - nfd: "\u{03B7}\u{0342}", - nfkc: "\u{1FC6}", - nfkd: "\u{03B7}\u{0342}", - }, - NormalizationTest { - source: "\u{1FC7}", - nfc: "\u{1FC7}", - nfd: "\u{03B7}\u{0342}\u{0345}", - nfkc: "\u{1FC7}", - nfkd: "\u{03B7}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1FC8}", - nfc: "\u{1FC8}", - nfd: "\u{0395}\u{0300}", - nfkc: "\u{1FC8}", - nfkd: "\u{0395}\u{0300}", - }, - NormalizationTest { - source: "\u{1FC9}", - nfc: "\u{0388}", - nfd: "\u{0395}\u{0301}", - nfkc: "\u{0388}", - nfkd: "\u{0395}\u{0301}", - }, - NormalizationTest { - source: "\u{1FCA}", - nfc: "\u{1FCA}", - nfd: "\u{0397}\u{0300}", - nfkc: "\u{1FCA}", - nfkd: "\u{0397}\u{0300}", - }, - NormalizationTest { - source: "\u{1FCB}", - nfc: "\u{0389}", - nfd: "\u{0397}\u{0301}", - nfkc: "\u{0389}", - nfkd: "\u{0397}\u{0301}", - }, - NormalizationTest { - source: "\u{1FCC}", - nfc: "\u{1FCC}", - nfd: "\u{0397}\u{0345}", - nfkc: "\u{1FCC}", - nfkd: "\u{0397}\u{0345}", - }, - NormalizationTest { - source: "\u{1FCD}", - nfc: "\u{1FCD}", - nfd: "\u{1FBF}\u{0300}", - nfkc: "\u{0020}\u{0313}\u{0300}", - nfkd: "\u{0020}\u{0313}\u{0300}", - }, - NormalizationTest { - source: "\u{1FCE}", - nfc: "\u{1FCE}", - nfd: "\u{1FBF}\u{0301}", - nfkc: "\u{0020}\u{0313}\u{0301}", - nfkd: "\u{0020}\u{0313}\u{0301}", - }, - NormalizationTest { - source: "\u{1FCF}", - nfc: "\u{1FCF}", - nfd: "\u{1FBF}\u{0342}", - nfkc: "\u{0020}\u{0313}\u{0342}", - nfkd: "\u{0020}\u{0313}\u{0342}", - }, - NormalizationTest { - source: "\u{1FD0}", - nfc: "\u{1FD0}", - nfd: "\u{03B9}\u{0306}", - nfkc: "\u{1FD0}", - nfkd: "\u{03B9}\u{0306}", - }, - NormalizationTest { - source: "\u{1FD1}", - nfc: "\u{1FD1}", - nfd: "\u{03B9}\u{0304}", - nfkc: "\u{1FD1}", - nfkd: "\u{03B9}\u{0304}", - }, - NormalizationTest { - source: "\u{1FD2}", - nfc: "\u{1FD2}", - nfd: "\u{03B9}\u{0308}\u{0300}", - nfkc: "\u{1FD2}", - nfkd: "\u{03B9}\u{0308}\u{0300}", - }, - NormalizationTest { - source: "\u{1FD3}", - nfc: "\u{0390}", - nfd: "\u{03B9}\u{0308}\u{0301}", - nfkc: "\u{0390}", - nfkd: "\u{03B9}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{1FD6}", - nfc: "\u{1FD6}", - nfd: "\u{03B9}\u{0342}", - nfkc: "\u{1FD6}", - nfkd: "\u{03B9}\u{0342}", - }, - NormalizationTest { - source: "\u{1FD7}", - nfc: "\u{1FD7}", - nfd: "\u{03B9}\u{0308}\u{0342}", - nfkc: "\u{1FD7}", - nfkd: "\u{03B9}\u{0308}\u{0342}", - }, - NormalizationTest { - source: "\u{1FD8}", - nfc: "\u{1FD8}", - nfd: "\u{0399}\u{0306}", - nfkc: "\u{1FD8}", - nfkd: "\u{0399}\u{0306}", - }, - NormalizationTest { - source: "\u{1FD9}", - nfc: "\u{1FD9}", - nfd: "\u{0399}\u{0304}", - nfkc: "\u{1FD9}", - nfkd: "\u{0399}\u{0304}", - }, - NormalizationTest { - source: "\u{1FDA}", - nfc: "\u{1FDA}", - nfd: "\u{0399}\u{0300}", - nfkc: "\u{1FDA}", - nfkd: "\u{0399}\u{0300}", - }, - NormalizationTest { - source: "\u{1FDB}", - nfc: "\u{038A}", - nfd: "\u{0399}\u{0301}", - nfkc: "\u{038A}", - nfkd: "\u{0399}\u{0301}", - }, - NormalizationTest { - source: "\u{1FDD}", - nfc: "\u{1FDD}", - nfd: "\u{1FFE}\u{0300}", - nfkc: "\u{0020}\u{0314}\u{0300}", - nfkd: "\u{0020}\u{0314}\u{0300}", - }, - NormalizationTest { - source: "\u{1FDE}", - nfc: "\u{1FDE}", - nfd: "\u{1FFE}\u{0301}", - nfkc: "\u{0020}\u{0314}\u{0301}", - nfkd: "\u{0020}\u{0314}\u{0301}", - }, - NormalizationTest { - source: "\u{1FDF}", - nfc: "\u{1FDF}", - nfd: "\u{1FFE}\u{0342}", - nfkc: "\u{0020}\u{0314}\u{0342}", - nfkd: "\u{0020}\u{0314}\u{0342}", - }, - NormalizationTest { - source: "\u{1FE0}", - nfc: "\u{1FE0}", - nfd: "\u{03C5}\u{0306}", - nfkc: "\u{1FE0}", - nfkd: "\u{03C5}\u{0306}", - }, - NormalizationTest { - source: "\u{1FE1}", - nfc: "\u{1FE1}", - nfd: "\u{03C5}\u{0304}", - nfkc: "\u{1FE1}", - nfkd: "\u{03C5}\u{0304}", - }, - NormalizationTest { - source: "\u{1FE2}", - nfc: "\u{1FE2}", - nfd: "\u{03C5}\u{0308}\u{0300}", - nfkc: "\u{1FE2}", - nfkd: "\u{03C5}\u{0308}\u{0300}", - }, - NormalizationTest { - source: "\u{1FE3}", - nfc: "\u{03B0}", - nfd: "\u{03C5}\u{0308}\u{0301}", - nfkc: "\u{03B0}", - nfkd: "\u{03C5}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{1FE4}", - nfc: "\u{1FE4}", - nfd: "\u{03C1}\u{0313}", - nfkc: "\u{1FE4}", - nfkd: "\u{03C1}\u{0313}", - }, - NormalizationTest { - source: "\u{1FE5}", - nfc: "\u{1FE5}", - nfd: "\u{03C1}\u{0314}", - nfkc: "\u{1FE5}", - nfkd: "\u{03C1}\u{0314}", - }, - NormalizationTest { - source: "\u{1FE6}", - nfc: "\u{1FE6}", - nfd: "\u{03C5}\u{0342}", - nfkc: "\u{1FE6}", - nfkd: "\u{03C5}\u{0342}", - }, - NormalizationTest { - source: "\u{1FE7}", - nfc: "\u{1FE7}", - nfd: "\u{03C5}\u{0308}\u{0342}", - nfkc: "\u{1FE7}", - nfkd: "\u{03C5}\u{0308}\u{0342}", - }, - NormalizationTest { - source: "\u{1FE8}", - nfc: "\u{1FE8}", - nfd: "\u{03A5}\u{0306}", - nfkc: "\u{1FE8}", - nfkd: "\u{03A5}\u{0306}", - }, - NormalizationTest { - source: "\u{1FE9}", - nfc: "\u{1FE9}", - nfd: "\u{03A5}\u{0304}", - nfkc: "\u{1FE9}", - nfkd: "\u{03A5}\u{0304}", - }, - NormalizationTest { - source: "\u{1FEA}", - nfc: "\u{1FEA}", - nfd: "\u{03A5}\u{0300}", - nfkc: "\u{1FEA}", - nfkd: "\u{03A5}\u{0300}", - }, - NormalizationTest { - source: "\u{1FEB}", - nfc: "\u{038E}", - nfd: "\u{03A5}\u{0301}", - nfkc: "\u{038E}", - nfkd: "\u{03A5}\u{0301}", - }, - NormalizationTest { - source: "\u{1FEC}", - nfc: "\u{1FEC}", - nfd: "\u{03A1}\u{0314}", - nfkc: "\u{1FEC}", - nfkd: "\u{03A1}\u{0314}", - }, - NormalizationTest { - source: "\u{1FED}", - nfc: "\u{1FED}", - nfd: "\u{00A8}\u{0300}", - nfkc: "\u{0020}\u{0308}\u{0300}", - nfkd: "\u{0020}\u{0308}\u{0300}", - }, - NormalizationTest { - source: "\u{1FEE}", - nfc: "\u{0385}", - nfd: "\u{00A8}\u{0301}", - nfkc: "\u{0020}\u{0308}\u{0301}", - nfkd: "\u{0020}\u{0308}\u{0301}", - }, - NormalizationTest { - source: "\u{1FEF}", - nfc: "\u{0060}", - nfd: "\u{0060}", - nfkc: "\u{0060}", - nfkd: "\u{0060}", - }, - NormalizationTest { - source: "\u{1FF2}", - nfc: "\u{1FF2}", - nfd: "\u{03C9}\u{0300}\u{0345}", - nfkc: "\u{1FF2}", - nfkd: "\u{03C9}\u{0300}\u{0345}", - }, - NormalizationTest { - source: "\u{1FF3}", - nfc: "\u{1FF3}", - nfd: "\u{03C9}\u{0345}", - nfkc: "\u{1FF3}", - nfkd: "\u{03C9}\u{0345}", - }, - NormalizationTest { - source: "\u{1FF4}", - nfc: "\u{1FF4}", - nfd: "\u{03C9}\u{0301}\u{0345}", - nfkc: "\u{1FF4}", - nfkd: "\u{03C9}\u{0301}\u{0345}", - }, - NormalizationTest { - source: "\u{1FF6}", - nfc: "\u{1FF6}", - nfd: "\u{03C9}\u{0342}", - nfkc: "\u{1FF6}", - nfkd: "\u{03C9}\u{0342}", - }, - NormalizationTest { - source: "\u{1FF7}", - nfc: "\u{1FF7}", - nfd: "\u{03C9}\u{0342}\u{0345}", - nfkc: "\u{1FF7}", - nfkd: "\u{03C9}\u{0342}\u{0345}", - }, - NormalizationTest { - source: "\u{1FF8}", - nfc: "\u{1FF8}", - nfd: "\u{039F}\u{0300}", - nfkc: "\u{1FF8}", - nfkd: "\u{039F}\u{0300}", - }, - NormalizationTest { - source: "\u{1FF9}", - nfc: "\u{038C}", - nfd: "\u{039F}\u{0301}", - nfkc: "\u{038C}", - nfkd: "\u{039F}\u{0301}", - }, - NormalizationTest { - source: "\u{1FFA}", - nfc: "\u{1FFA}", - nfd: "\u{03A9}\u{0300}", - nfkc: "\u{1FFA}", - nfkd: "\u{03A9}\u{0300}", - }, - NormalizationTest { - source: "\u{1FFB}", - nfc: "\u{038F}", - nfd: "\u{03A9}\u{0301}", - nfkc: "\u{038F}", - nfkd: "\u{03A9}\u{0301}", - }, - NormalizationTest { - source: "\u{1FFC}", - nfc: "\u{1FFC}", - nfd: "\u{03A9}\u{0345}", - nfkc: "\u{1FFC}", - nfkd: "\u{03A9}\u{0345}", - }, - NormalizationTest { - source: "\u{1FFD}", - nfc: "\u{00B4}", - nfd: "\u{00B4}", - nfkc: "\u{0020}\u{0301}", - nfkd: "\u{0020}\u{0301}", - }, - NormalizationTest { - source: "\u{1FFE}", - nfc: "\u{1FFE}", - nfd: "\u{1FFE}", - nfkc: "\u{0020}\u{0314}", - nfkd: "\u{0020}\u{0314}", - }, - NormalizationTest { - source: "\u{2000}", - nfc: "\u{2002}", - nfd: "\u{2002}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2001}", - nfc: "\u{2003}", - nfd: "\u{2003}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2002}", - nfc: "\u{2002}", - nfd: "\u{2002}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2003}", - nfc: "\u{2003}", - nfd: "\u{2003}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2004}", - nfc: "\u{2004}", - nfd: "\u{2004}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2005}", - nfc: "\u{2005}", - nfd: "\u{2005}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2006}", - nfc: "\u{2006}", - nfd: "\u{2006}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2007}", - nfc: "\u{2007}", - nfd: "\u{2007}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2008}", - nfc: "\u{2008}", - nfd: "\u{2008}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2009}", - nfc: "\u{2009}", - nfd: "\u{2009}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{200A}", - nfc: "\u{200A}", - nfd: "\u{200A}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2011}", - nfc: "\u{2011}", - nfd: "\u{2011}", - nfkc: "\u{2010}", - nfkd: "\u{2010}", - }, - NormalizationTest { - source: "\u{2017}", - nfc: "\u{2017}", - nfd: "\u{2017}", - nfkc: "\u{0020}\u{0333}", - nfkd: "\u{0020}\u{0333}", - }, - NormalizationTest { - source: "\u{2024}", - nfc: "\u{2024}", - nfd: "\u{2024}", - nfkc: "\u{002E}", - nfkd: "\u{002E}", - }, - NormalizationTest { - source: "\u{2025}", - nfc: "\u{2025}", - nfd: "\u{2025}", - nfkc: "\u{002E}\u{002E}", - nfkd: "\u{002E}\u{002E}", - }, - NormalizationTest { - source: "\u{2026}", - nfc: "\u{2026}", - nfd: "\u{2026}", - nfkc: "\u{002E}\u{002E}\u{002E}", - nfkd: "\u{002E}\u{002E}\u{002E}", - }, - NormalizationTest { - source: "\u{202F}", - nfc: "\u{202F}", - nfd: "\u{202F}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2033}", - nfc: "\u{2033}", - nfd: "\u{2033}", - nfkc: "\u{2032}\u{2032}", - nfkd: "\u{2032}\u{2032}", - }, - NormalizationTest { - source: "\u{2034}", - nfc: "\u{2034}", - nfd: "\u{2034}", - nfkc: "\u{2032}\u{2032}\u{2032}", - nfkd: "\u{2032}\u{2032}\u{2032}", - }, - NormalizationTest { - source: "\u{2036}", - nfc: "\u{2036}", - nfd: "\u{2036}", - nfkc: "\u{2035}\u{2035}", - nfkd: "\u{2035}\u{2035}", - }, - NormalizationTest { - source: "\u{2037}", - nfc: "\u{2037}", - nfd: "\u{2037}", - nfkc: "\u{2035}\u{2035}\u{2035}", - nfkd: "\u{2035}\u{2035}\u{2035}", - }, - NormalizationTest { - source: "\u{203C}", - nfc: "\u{203C}", - nfd: "\u{203C}", - nfkc: "\u{0021}\u{0021}", - nfkd: "\u{0021}\u{0021}", - }, - NormalizationTest { - source: "\u{203E}", - nfc: "\u{203E}", - nfd: "\u{203E}", - nfkc: "\u{0020}\u{0305}", - nfkd: "\u{0020}\u{0305}", - }, - NormalizationTest { - source: "\u{2047}", - nfc: "\u{2047}", - nfd: "\u{2047}", - nfkc: "\u{003F}\u{003F}", - nfkd: "\u{003F}\u{003F}", - }, - NormalizationTest { - source: "\u{2048}", - nfc: "\u{2048}", - nfd: "\u{2048}", - nfkc: "\u{003F}\u{0021}", - nfkd: "\u{003F}\u{0021}", - }, - NormalizationTest { - source: "\u{2049}", - nfc: "\u{2049}", - nfd: "\u{2049}", - nfkc: "\u{0021}\u{003F}", - nfkd: "\u{0021}\u{003F}", - }, - NormalizationTest { - source: "\u{2057}", - nfc: "\u{2057}", - nfd: "\u{2057}", - nfkc: "\u{2032}\u{2032}\u{2032}\u{2032}", - nfkd: "\u{2032}\u{2032}\u{2032}\u{2032}", - }, - NormalizationTest { - source: "\u{205F}", - nfc: "\u{205F}", - nfd: "\u{205F}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{2070}", - nfc: "\u{2070}", - nfd: "\u{2070}", - nfkc: "\u{0030}", - nfkd: "\u{0030}", - }, - NormalizationTest { - source: "\u{2071}", - nfc: "\u{2071}", - nfd: "\u{2071}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{2074}", - nfc: "\u{2074}", - nfd: "\u{2074}", - nfkc: "\u{0034}", - nfkd: "\u{0034}", - }, - NormalizationTest { - source: "\u{2075}", - nfc: "\u{2075}", - nfd: "\u{2075}", - nfkc: "\u{0035}", - nfkd: "\u{0035}", - }, - NormalizationTest { - source: "\u{2076}", - nfc: "\u{2076}", - nfd: "\u{2076}", - nfkc: "\u{0036}", - nfkd: "\u{0036}", - }, - NormalizationTest { - source: "\u{2077}", - nfc: "\u{2077}", - nfd: "\u{2077}", - nfkc: "\u{0037}", - nfkd: "\u{0037}", - }, - NormalizationTest { - source: "\u{2078}", - nfc: "\u{2078}", - nfd: "\u{2078}", - nfkc: "\u{0038}", - nfkd: "\u{0038}", - }, - NormalizationTest { - source: "\u{2079}", - nfc: "\u{2079}", - nfd: "\u{2079}", - nfkc: "\u{0039}", - nfkd: "\u{0039}", - }, - NormalizationTest { - source: "\u{207A}", - nfc: "\u{207A}", - nfd: "\u{207A}", - nfkc: "\u{002B}", - nfkd: "\u{002B}", - }, - NormalizationTest { - source: "\u{207B}", - nfc: "\u{207B}", - nfd: "\u{207B}", - nfkc: "\u{2212}", - nfkd: "\u{2212}", - }, - NormalizationTest { - source: "\u{207C}", - nfc: "\u{207C}", - nfd: "\u{207C}", - nfkc: "\u{003D}", - nfkd: "\u{003D}", - }, - NormalizationTest { - source: "\u{207D}", - nfc: "\u{207D}", - nfd: "\u{207D}", - nfkc: "\u{0028}", - nfkd: "\u{0028}", - }, - NormalizationTest { - source: "\u{207E}", - nfc: "\u{207E}", - nfd: "\u{207E}", - nfkc: "\u{0029}", - nfkd: "\u{0029}", - }, - NormalizationTest { - source: "\u{207F}", - nfc: "\u{207F}", - nfd: "\u{207F}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{2080}", - nfc: "\u{2080}", - nfd: "\u{2080}", - nfkc: "\u{0030}", - nfkd: "\u{0030}", - }, - NormalizationTest { - source: "\u{2081}", - nfc: "\u{2081}", - nfd: "\u{2081}", - nfkc: "\u{0031}", - nfkd: "\u{0031}", - }, - NormalizationTest { - source: "\u{2082}", - nfc: "\u{2082}", - nfd: "\u{2082}", - nfkc: "\u{0032}", - nfkd: "\u{0032}", - }, - NormalizationTest { - source: "\u{2083}", - nfc: "\u{2083}", - nfd: "\u{2083}", - nfkc: "\u{0033}", - nfkd: "\u{0033}", - }, - NormalizationTest { - source: "\u{2084}", - nfc: "\u{2084}", - nfd: "\u{2084}", - nfkc: "\u{0034}", - nfkd: "\u{0034}", - }, - NormalizationTest { - source: "\u{2085}", - nfc: "\u{2085}", - nfd: "\u{2085}", - nfkc: "\u{0035}", - nfkd: "\u{0035}", - }, - NormalizationTest { - source: "\u{2086}", - nfc: "\u{2086}", - nfd: "\u{2086}", - nfkc: "\u{0036}", - nfkd: "\u{0036}", - }, - NormalizationTest { - source: "\u{2087}", - nfc: "\u{2087}", - nfd: "\u{2087}", - nfkc: "\u{0037}", - nfkd: "\u{0037}", - }, - NormalizationTest { - source: "\u{2088}", - nfc: "\u{2088}", - nfd: "\u{2088}", - nfkc: "\u{0038}", - nfkd: "\u{0038}", - }, - NormalizationTest { - source: "\u{2089}", - nfc: "\u{2089}", - nfd: "\u{2089}", - nfkc: "\u{0039}", - nfkd: "\u{0039}", - }, - NormalizationTest { - source: "\u{208A}", - nfc: "\u{208A}", - nfd: "\u{208A}", - nfkc: "\u{002B}", - nfkd: "\u{002B}", - }, - NormalizationTest { - source: "\u{208B}", - nfc: "\u{208B}", - nfd: "\u{208B}", - nfkc: "\u{2212}", - nfkd: "\u{2212}", - }, - NormalizationTest { - source: "\u{208C}", - nfc: "\u{208C}", - nfd: "\u{208C}", - nfkc: "\u{003D}", - nfkd: "\u{003D}", - }, - NormalizationTest { - source: "\u{208D}", - nfc: "\u{208D}", - nfd: "\u{208D}", - nfkc: "\u{0028}", - nfkd: "\u{0028}", - }, - NormalizationTest { - source: "\u{208E}", - nfc: "\u{208E}", - nfd: "\u{208E}", - nfkc: "\u{0029}", - nfkd: "\u{0029}", - }, - NormalizationTest { - source: "\u{2090}", - nfc: "\u{2090}", - nfd: "\u{2090}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{2091}", - nfc: "\u{2091}", - nfd: "\u{2091}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{2092}", - nfc: "\u{2092}", - nfd: "\u{2092}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{2093}", - nfc: "\u{2093}", - nfd: "\u{2093}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{2094}", - nfc: "\u{2094}", - nfd: "\u{2094}", - nfkc: "\u{0259}", - nfkd: "\u{0259}", - }, - NormalizationTest { - source: "\u{2095}", - nfc: "\u{2095}", - nfd: "\u{2095}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{2096}", - nfc: "\u{2096}", - nfd: "\u{2096}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{2097}", - nfc: "\u{2097}", - nfd: "\u{2097}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{2098}", - nfc: "\u{2098}", - nfd: "\u{2098}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{2099}", - nfc: "\u{2099}", - nfd: "\u{2099}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{209A}", - nfc: "\u{209A}", - nfd: "\u{209A}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{209B}", - nfc: "\u{209B}", - nfd: "\u{209B}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{209C}", - nfc: "\u{209C}", - nfd: "\u{209C}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{20A8}", - nfc: "\u{20A8}", - nfd: "\u{20A8}", - nfkc: "\u{0052}\u{0073}", - nfkd: "\u{0052}\u{0073}", - }, - NormalizationTest { - source: "\u{2100}", - nfc: "\u{2100}", - nfd: "\u{2100}", - nfkc: "\u{0061}\u{002F}\u{0063}", - nfkd: "\u{0061}\u{002F}\u{0063}", - }, - NormalizationTest { - source: "\u{2101}", - nfc: "\u{2101}", - nfd: "\u{2101}", - nfkc: "\u{0061}\u{002F}\u{0073}", - nfkd: "\u{0061}\u{002F}\u{0073}", - }, - NormalizationTest { - source: "\u{2102}", - nfc: "\u{2102}", - nfd: "\u{2102}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{2103}", - nfc: "\u{2103}", - nfd: "\u{2103}", - nfkc: "\u{00B0}\u{0043}", - nfkd: "\u{00B0}\u{0043}", - }, - NormalizationTest { - source: "\u{2105}", - nfc: "\u{2105}", - nfd: "\u{2105}", - nfkc: "\u{0063}\u{002F}\u{006F}", - nfkd: "\u{0063}\u{002F}\u{006F}", - }, - NormalizationTest { - source: "\u{2106}", - nfc: "\u{2106}", - nfd: "\u{2106}", - nfkc: "\u{0063}\u{002F}\u{0075}", - nfkd: "\u{0063}\u{002F}\u{0075}", - }, - NormalizationTest { - source: "\u{2107}", - nfc: "\u{2107}", - nfd: "\u{2107}", - nfkc: "\u{0190}", - nfkd: "\u{0190}", - }, - NormalizationTest { - source: "\u{2109}", - nfc: "\u{2109}", - nfd: "\u{2109}", - nfkc: "\u{00B0}\u{0046}", - nfkd: "\u{00B0}\u{0046}", - }, - NormalizationTest { - source: "\u{210A}", - nfc: "\u{210A}", - nfd: "\u{210A}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{210B}", - nfc: "\u{210B}", - nfd: "\u{210B}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{210C}", - nfc: "\u{210C}", - nfd: "\u{210C}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{210D}", - nfc: "\u{210D}", - nfd: "\u{210D}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{210E}", - nfc: "\u{210E}", - nfd: "\u{210E}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{210F}", - nfc: "\u{210F}", - nfd: "\u{210F}", - nfkc: "\u{0127}", - nfkd: "\u{0127}", - }, - NormalizationTest { - source: "\u{2110}", - nfc: "\u{2110}", - nfd: "\u{2110}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{2111}", - nfc: "\u{2111}", - nfd: "\u{2111}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{2112}", - nfc: "\u{2112}", - nfd: "\u{2112}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{2113}", - nfc: "\u{2113}", - nfd: "\u{2113}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{2115}", - nfc: "\u{2115}", - nfd: "\u{2115}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{2116}", - nfc: "\u{2116}", - nfd: "\u{2116}", - nfkc: "\u{004E}\u{006F}", - nfkd: "\u{004E}\u{006F}", - }, - NormalizationTest { - source: "\u{2119}", - nfc: "\u{2119}", - nfd: "\u{2119}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{211A}", - nfc: "\u{211A}", - nfd: "\u{211A}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{211B}", - nfc: "\u{211B}", - nfd: "\u{211B}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{211C}", - nfc: "\u{211C}", - nfd: "\u{211C}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{211D}", - nfc: "\u{211D}", - nfd: "\u{211D}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{2120}", - nfc: "\u{2120}", - nfd: "\u{2120}", - nfkc: "\u{0053}\u{004D}", - nfkd: "\u{0053}\u{004D}", - }, - NormalizationTest { - source: "\u{2121}", - nfc: "\u{2121}", - nfd: "\u{2121}", - nfkc: "\u{0054}\u{0045}\u{004C}", - nfkd: "\u{0054}\u{0045}\u{004C}", - }, - NormalizationTest { - source: "\u{2122}", - nfc: "\u{2122}", - nfd: "\u{2122}", - nfkc: "\u{0054}\u{004D}", - nfkd: "\u{0054}\u{004D}", - }, - NormalizationTest { - source: "\u{2124}", - nfc: "\u{2124}", - nfd: "\u{2124}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{2126}", - nfc: "\u{03A9}", - nfd: "\u{03A9}", - nfkc: "\u{03A9}", - nfkd: "\u{03A9}", - }, - NormalizationTest { - source: "\u{2128}", - nfc: "\u{2128}", - nfd: "\u{2128}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{212A}", - nfc: "\u{004B}", - nfd: "\u{004B}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{212B}", - nfc: "\u{00C5}", - nfd: "\u{0041}\u{030A}", - nfkc: "\u{00C5}", - nfkd: "\u{0041}\u{030A}", - }, - NormalizationTest { - source: "\u{212C}", - nfc: "\u{212C}", - nfd: "\u{212C}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{212D}", - nfc: "\u{212D}", - nfd: "\u{212D}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{212F}", - nfc: "\u{212F}", - nfd: "\u{212F}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{2130}", - nfc: "\u{2130}", - nfd: "\u{2130}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{2131}", - nfc: "\u{2131}", - nfd: "\u{2131}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{2133}", - nfc: "\u{2133}", - nfd: "\u{2133}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{2134}", - nfc: "\u{2134}", - nfd: "\u{2134}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{2135}", - nfc: "\u{2135}", - nfd: "\u{2135}", - nfkc: "\u{05D0}", - nfkd: "\u{05D0}", - }, - NormalizationTest { - source: "\u{2136}", - nfc: "\u{2136}", - nfd: "\u{2136}", - nfkc: "\u{05D1}", - nfkd: "\u{05D1}", - }, - NormalizationTest { - source: "\u{2137}", - nfc: "\u{2137}", - nfd: "\u{2137}", - nfkc: "\u{05D2}", - nfkd: "\u{05D2}", - }, - NormalizationTest { - source: "\u{2138}", - nfc: "\u{2138}", - nfd: "\u{2138}", - nfkc: "\u{05D3}", - nfkd: "\u{05D3}", - }, - NormalizationTest { - source: "\u{2139}", - nfc: "\u{2139}", - nfd: "\u{2139}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{213B}", - nfc: "\u{213B}", - nfd: "\u{213B}", - nfkc: "\u{0046}\u{0041}\u{0058}", - nfkd: "\u{0046}\u{0041}\u{0058}", - }, - NormalizationTest { - source: "\u{213C}", - nfc: "\u{213C}", - nfd: "\u{213C}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{213D}", - nfc: "\u{213D}", - nfd: "\u{213D}", - nfkc: "\u{03B3}", - nfkd: "\u{03B3}", - }, - NormalizationTest { - source: "\u{213E}", - nfc: "\u{213E}", - nfd: "\u{213E}", - nfkc: "\u{0393}", - nfkd: "\u{0393}", - }, - NormalizationTest { - source: "\u{213F}", - nfc: "\u{213F}", - nfd: "\u{213F}", - nfkc: "\u{03A0}", - nfkd: "\u{03A0}", - }, - NormalizationTest { - source: "\u{2140}", - nfc: "\u{2140}", - nfd: "\u{2140}", - nfkc: "\u{2211}", - nfkd: "\u{2211}", - }, - NormalizationTest { - source: "\u{2145}", - nfc: "\u{2145}", - nfd: "\u{2145}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{2146}", - nfc: "\u{2146}", - nfd: "\u{2146}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{2147}", - nfc: "\u{2147}", - nfd: "\u{2147}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{2148}", - nfc: "\u{2148}", - nfd: "\u{2148}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{2149}", - nfc: "\u{2149}", - nfd: "\u{2149}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{2150}", - nfc: "\u{2150}", - nfd: "\u{2150}", - nfkc: "\u{0031}\u{2044}\u{0037}", - nfkd: "\u{0031}\u{2044}\u{0037}", - }, - NormalizationTest { - source: "\u{2151}", - nfc: "\u{2151}", - nfd: "\u{2151}", - nfkc: "\u{0031}\u{2044}\u{0039}", - nfkd: "\u{0031}\u{2044}\u{0039}", - }, - NormalizationTest { - source: "\u{2152}", - nfc: "\u{2152}", - nfd: "\u{2152}", - nfkc: "\u{0031}\u{2044}\u{0031}\u{0030}", - nfkd: "\u{0031}\u{2044}\u{0031}\u{0030}", - }, - NormalizationTest { - source: "\u{2153}", - nfc: "\u{2153}", - nfd: "\u{2153}", - nfkc: "\u{0031}\u{2044}\u{0033}", - nfkd: "\u{0031}\u{2044}\u{0033}", - }, - NormalizationTest { - source: "\u{2154}", - nfc: "\u{2154}", - nfd: "\u{2154}", - nfkc: "\u{0032}\u{2044}\u{0033}", - nfkd: "\u{0032}\u{2044}\u{0033}", - }, - NormalizationTest { - source: "\u{2155}", - nfc: "\u{2155}", - nfd: "\u{2155}", - nfkc: "\u{0031}\u{2044}\u{0035}", - nfkd: "\u{0031}\u{2044}\u{0035}", - }, - NormalizationTest { - source: "\u{2156}", - nfc: "\u{2156}", - nfd: "\u{2156}", - nfkc: "\u{0032}\u{2044}\u{0035}", - nfkd: "\u{0032}\u{2044}\u{0035}", - }, - NormalizationTest { - source: "\u{2157}", - nfc: "\u{2157}", - nfd: "\u{2157}", - nfkc: "\u{0033}\u{2044}\u{0035}", - nfkd: "\u{0033}\u{2044}\u{0035}", - }, - NormalizationTest { - source: "\u{2158}", - nfc: "\u{2158}", - nfd: "\u{2158}", - nfkc: "\u{0034}\u{2044}\u{0035}", - nfkd: "\u{0034}\u{2044}\u{0035}", - }, - NormalizationTest { - source: "\u{2159}", - nfc: "\u{2159}", - nfd: "\u{2159}", - nfkc: "\u{0031}\u{2044}\u{0036}", - nfkd: "\u{0031}\u{2044}\u{0036}", - }, - NormalizationTest { - source: "\u{215A}", - nfc: "\u{215A}", - nfd: "\u{215A}", - nfkc: "\u{0035}\u{2044}\u{0036}", - nfkd: "\u{0035}\u{2044}\u{0036}", - }, - NormalizationTest { - source: "\u{215B}", - nfc: "\u{215B}", - nfd: "\u{215B}", - nfkc: "\u{0031}\u{2044}\u{0038}", - nfkd: "\u{0031}\u{2044}\u{0038}", - }, - NormalizationTest { - source: "\u{215C}", - nfc: "\u{215C}", - nfd: "\u{215C}", - nfkc: "\u{0033}\u{2044}\u{0038}", - nfkd: "\u{0033}\u{2044}\u{0038}", - }, - NormalizationTest { - source: "\u{215D}", - nfc: "\u{215D}", - nfd: "\u{215D}", - nfkc: "\u{0035}\u{2044}\u{0038}", - nfkd: "\u{0035}\u{2044}\u{0038}", - }, - NormalizationTest { - source: "\u{215E}", - nfc: "\u{215E}", - nfd: "\u{215E}", - nfkc: "\u{0037}\u{2044}\u{0038}", - nfkd: "\u{0037}\u{2044}\u{0038}", - }, - NormalizationTest { - source: "\u{215F}", - nfc: "\u{215F}", - nfd: "\u{215F}", - nfkc: "\u{0031}\u{2044}", - nfkd: "\u{0031}\u{2044}", - }, - NormalizationTest { - source: "\u{2160}", - nfc: "\u{2160}", - nfd: "\u{2160}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{2161}", - nfc: "\u{2161}", - nfd: "\u{2161}", - nfkc: "\u{0049}\u{0049}", - nfkd: "\u{0049}\u{0049}", - }, - NormalizationTest { - source: "\u{2162}", - nfc: "\u{2162}", - nfd: "\u{2162}", - nfkc: "\u{0049}\u{0049}\u{0049}", - nfkd: "\u{0049}\u{0049}\u{0049}", - }, - NormalizationTest { - source: "\u{2163}", - nfc: "\u{2163}", - nfd: "\u{2163}", - nfkc: "\u{0049}\u{0056}", - nfkd: "\u{0049}\u{0056}", - }, - NormalizationTest { - source: "\u{2164}", - nfc: "\u{2164}", - nfd: "\u{2164}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{2165}", - nfc: "\u{2165}", - nfd: "\u{2165}", - nfkc: "\u{0056}\u{0049}", - nfkd: "\u{0056}\u{0049}", - }, - NormalizationTest { - source: "\u{2166}", - nfc: "\u{2166}", - nfd: "\u{2166}", - nfkc: "\u{0056}\u{0049}\u{0049}", - nfkd: "\u{0056}\u{0049}\u{0049}", - }, - NormalizationTest { - source: "\u{2167}", - nfc: "\u{2167}", - nfd: "\u{2167}", - nfkc: "\u{0056}\u{0049}\u{0049}\u{0049}", - nfkd: "\u{0056}\u{0049}\u{0049}\u{0049}", - }, - NormalizationTest { - source: "\u{2168}", - nfc: "\u{2168}", - nfd: "\u{2168}", - nfkc: "\u{0049}\u{0058}", - nfkd: "\u{0049}\u{0058}", - }, - NormalizationTest { - source: "\u{2169}", - nfc: "\u{2169}", - nfd: "\u{2169}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{216A}", - nfc: "\u{216A}", - nfd: "\u{216A}", - nfkc: "\u{0058}\u{0049}", - nfkd: "\u{0058}\u{0049}", - }, - NormalizationTest { - source: "\u{216B}", - nfc: "\u{216B}", - nfd: "\u{216B}", - nfkc: "\u{0058}\u{0049}\u{0049}", - nfkd: "\u{0058}\u{0049}\u{0049}", - }, - NormalizationTest { - source: "\u{216C}", - nfc: "\u{216C}", - nfd: "\u{216C}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{216D}", - nfc: "\u{216D}", - nfd: "\u{216D}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{216E}", - nfc: "\u{216E}", - nfd: "\u{216E}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{216F}", - nfc: "\u{216F}", - nfd: "\u{216F}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{2170}", - nfc: "\u{2170}", - nfd: "\u{2170}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{2171}", - nfc: "\u{2171}", - nfd: "\u{2171}", - nfkc: "\u{0069}\u{0069}", - nfkd: "\u{0069}\u{0069}", - }, - NormalizationTest { - source: "\u{2172}", - nfc: "\u{2172}", - nfd: "\u{2172}", - nfkc: "\u{0069}\u{0069}\u{0069}", - nfkd: "\u{0069}\u{0069}\u{0069}", - }, - NormalizationTest { - source: "\u{2173}", - nfc: "\u{2173}", - nfd: "\u{2173}", - nfkc: "\u{0069}\u{0076}", - nfkd: "\u{0069}\u{0076}", - }, - NormalizationTest { - source: "\u{2174}", - nfc: "\u{2174}", - nfd: "\u{2174}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{2175}", - nfc: "\u{2175}", - nfd: "\u{2175}", - nfkc: "\u{0076}\u{0069}", - nfkd: "\u{0076}\u{0069}", - }, - NormalizationTest { - source: "\u{2176}", - nfc: "\u{2176}", - nfd: "\u{2176}", - nfkc: "\u{0076}\u{0069}\u{0069}", - nfkd: "\u{0076}\u{0069}\u{0069}", - }, - NormalizationTest { - source: "\u{2177}", - nfc: "\u{2177}", - nfd: "\u{2177}", - nfkc: "\u{0076}\u{0069}\u{0069}\u{0069}", - nfkd: "\u{0076}\u{0069}\u{0069}\u{0069}", - }, - NormalizationTest { - source: "\u{2178}", - nfc: "\u{2178}", - nfd: "\u{2178}", - nfkc: "\u{0069}\u{0078}", - nfkd: "\u{0069}\u{0078}", - }, - NormalizationTest { - source: "\u{2179}", - nfc: "\u{2179}", - nfd: "\u{2179}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{217A}", - nfc: "\u{217A}", - nfd: "\u{217A}", - nfkc: "\u{0078}\u{0069}", - nfkd: "\u{0078}\u{0069}", - }, - NormalizationTest { - source: "\u{217B}", - nfc: "\u{217B}", - nfd: "\u{217B}", - nfkc: "\u{0078}\u{0069}\u{0069}", - nfkd: "\u{0078}\u{0069}\u{0069}", - }, - NormalizationTest { - source: "\u{217C}", - nfc: "\u{217C}", - nfd: "\u{217C}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{217D}", - nfc: "\u{217D}", - nfd: "\u{217D}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{217E}", - nfc: "\u{217E}", - nfd: "\u{217E}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{217F}", - nfc: "\u{217F}", - nfd: "\u{217F}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{2189}", - nfc: "\u{2189}", - nfd: "\u{2189}", - nfkc: "\u{0030}\u{2044}\u{0033}", - nfkd: "\u{0030}\u{2044}\u{0033}", - }, - NormalizationTest { - source: "\u{219A}", - nfc: "\u{219A}", - nfd: "\u{2190}\u{0338}", - nfkc: "\u{219A}", - nfkd: "\u{2190}\u{0338}", - }, - NormalizationTest { - source: "\u{219B}", - nfc: "\u{219B}", - nfd: "\u{2192}\u{0338}", - nfkc: "\u{219B}", - nfkd: "\u{2192}\u{0338}", - }, - NormalizationTest { - source: "\u{21AE}", - nfc: "\u{21AE}", - nfd: "\u{2194}\u{0338}", - nfkc: "\u{21AE}", - nfkd: "\u{2194}\u{0338}", - }, - NormalizationTest { - source: "\u{21CD}", - nfc: "\u{21CD}", - nfd: "\u{21D0}\u{0338}", - nfkc: "\u{21CD}", - nfkd: "\u{21D0}\u{0338}", - }, - NormalizationTest { - source: "\u{21CE}", - nfc: "\u{21CE}", - nfd: "\u{21D4}\u{0338}", - nfkc: "\u{21CE}", - nfkd: "\u{21D4}\u{0338}", - }, - NormalizationTest { - source: "\u{21CF}", - nfc: "\u{21CF}", - nfd: "\u{21D2}\u{0338}", - nfkc: "\u{21CF}", - nfkd: "\u{21D2}\u{0338}", - }, - NormalizationTest { - source: "\u{2204}", - nfc: "\u{2204}", - nfd: "\u{2203}\u{0338}", - nfkc: "\u{2204}", - nfkd: "\u{2203}\u{0338}", - }, - NormalizationTest { - source: "\u{2209}", - nfc: "\u{2209}", - nfd: "\u{2208}\u{0338}", - nfkc: "\u{2209}", - nfkd: "\u{2208}\u{0338}", - }, - NormalizationTest { - source: "\u{220C}", - nfc: "\u{220C}", - nfd: "\u{220B}\u{0338}", - nfkc: "\u{220C}", - nfkd: "\u{220B}\u{0338}", - }, - NormalizationTest { - source: "\u{2224}", - nfc: "\u{2224}", - nfd: "\u{2223}\u{0338}", - nfkc: "\u{2224}", - nfkd: "\u{2223}\u{0338}", - }, - NormalizationTest { - source: "\u{2226}", - nfc: "\u{2226}", - nfd: "\u{2225}\u{0338}", - nfkc: "\u{2226}", - nfkd: "\u{2225}\u{0338}", - }, - NormalizationTest { - source: "\u{222C}", - nfc: "\u{222C}", - nfd: "\u{222C}", - nfkc: "\u{222B}\u{222B}", - nfkd: "\u{222B}\u{222B}", - }, - NormalizationTest { - source: "\u{222D}", - nfc: "\u{222D}", - nfd: "\u{222D}", - nfkc: "\u{222B}\u{222B}\u{222B}", - nfkd: "\u{222B}\u{222B}\u{222B}", - }, - NormalizationTest { - source: "\u{222F}", - nfc: "\u{222F}", - nfd: "\u{222F}", - nfkc: "\u{222E}\u{222E}", - nfkd: "\u{222E}\u{222E}", - }, - NormalizationTest { - source: "\u{2230}", - nfc: "\u{2230}", - nfd: "\u{2230}", - nfkc: "\u{222E}\u{222E}\u{222E}", - nfkd: "\u{222E}\u{222E}\u{222E}", - }, - NormalizationTest { - source: "\u{2241}", - nfc: "\u{2241}", - nfd: "\u{223C}\u{0338}", - nfkc: "\u{2241}", - nfkd: "\u{223C}\u{0338}", - }, - NormalizationTest { - source: "\u{2244}", - nfc: "\u{2244}", - nfd: "\u{2243}\u{0338}", - nfkc: "\u{2244}", - nfkd: "\u{2243}\u{0338}", - }, - NormalizationTest { - source: "\u{2247}", - nfc: "\u{2247}", - nfd: "\u{2245}\u{0338}", - nfkc: "\u{2247}", - nfkd: "\u{2245}\u{0338}", - }, - NormalizationTest { - source: "\u{2249}", - nfc: "\u{2249}", - nfd: "\u{2248}\u{0338}", - nfkc: "\u{2249}", - nfkd: "\u{2248}\u{0338}", - }, - NormalizationTest { - source: "\u{2260}", - nfc: "\u{2260}", - nfd: "\u{003D}\u{0338}", - nfkc: "\u{2260}", - nfkd: "\u{003D}\u{0338}", - }, - NormalizationTest { - source: "\u{2262}", - nfc: "\u{2262}", - nfd: "\u{2261}\u{0338}", - nfkc: "\u{2262}", - nfkd: "\u{2261}\u{0338}", - }, - NormalizationTest { - source: "\u{226D}", - nfc: "\u{226D}", - nfd: "\u{224D}\u{0338}", - nfkc: "\u{226D}", - nfkd: "\u{224D}\u{0338}", - }, - NormalizationTest { - source: "\u{226E}", - nfc: "\u{226E}", - nfd: "\u{003C}\u{0338}", - nfkc: "\u{226E}", - nfkd: "\u{003C}\u{0338}", - }, - NormalizationTest { - source: "\u{226F}", - nfc: "\u{226F}", - nfd: "\u{003E}\u{0338}", - nfkc: "\u{226F}", - nfkd: "\u{003E}\u{0338}", - }, - NormalizationTest { - source: "\u{2270}", - nfc: "\u{2270}", - nfd: "\u{2264}\u{0338}", - nfkc: "\u{2270}", - nfkd: "\u{2264}\u{0338}", - }, - NormalizationTest { - source: "\u{2271}", - nfc: "\u{2271}", - nfd: "\u{2265}\u{0338}", - nfkc: "\u{2271}", - nfkd: "\u{2265}\u{0338}", - }, - NormalizationTest { - source: "\u{2274}", - nfc: "\u{2274}", - nfd: "\u{2272}\u{0338}", - nfkc: "\u{2274}", - nfkd: "\u{2272}\u{0338}", - }, - NormalizationTest { - source: "\u{2275}", - nfc: "\u{2275}", - nfd: "\u{2273}\u{0338}", - nfkc: "\u{2275}", - nfkd: "\u{2273}\u{0338}", - }, - NormalizationTest { - source: "\u{2278}", - nfc: "\u{2278}", - nfd: "\u{2276}\u{0338}", - nfkc: "\u{2278}", - nfkd: "\u{2276}\u{0338}", - }, - NormalizationTest { - source: "\u{2279}", - nfc: "\u{2279}", - nfd: "\u{2277}\u{0338}", - nfkc: "\u{2279}", - nfkd: "\u{2277}\u{0338}", - }, - NormalizationTest { - source: "\u{2280}", - nfc: "\u{2280}", - nfd: "\u{227A}\u{0338}", - nfkc: "\u{2280}", - nfkd: "\u{227A}\u{0338}", - }, - NormalizationTest { - source: "\u{2281}", - nfc: "\u{2281}", - nfd: "\u{227B}\u{0338}", - nfkc: "\u{2281}", - nfkd: "\u{227B}\u{0338}", - }, - NormalizationTest { - source: "\u{2284}", - nfc: "\u{2284}", - nfd: "\u{2282}\u{0338}", - nfkc: "\u{2284}", - nfkd: "\u{2282}\u{0338}", - }, - NormalizationTest { - source: "\u{2285}", - nfc: "\u{2285}", - nfd: "\u{2283}\u{0338}", - nfkc: "\u{2285}", - nfkd: "\u{2283}\u{0338}", - }, - NormalizationTest { - source: "\u{2288}", - nfc: "\u{2288}", - nfd: "\u{2286}\u{0338}", - nfkc: "\u{2288}", - nfkd: "\u{2286}\u{0338}", - }, - NormalizationTest { - source: "\u{2289}", - nfc: "\u{2289}", - nfd: "\u{2287}\u{0338}", - nfkc: "\u{2289}", - nfkd: "\u{2287}\u{0338}", - }, - NormalizationTest { - source: "\u{22AC}", - nfc: "\u{22AC}", - nfd: "\u{22A2}\u{0338}", - nfkc: "\u{22AC}", - nfkd: "\u{22A2}\u{0338}", - }, - NormalizationTest { - source: "\u{22AD}", - nfc: "\u{22AD}", - nfd: "\u{22A8}\u{0338}", - nfkc: "\u{22AD}", - nfkd: "\u{22A8}\u{0338}", - }, - NormalizationTest { - source: "\u{22AE}", - nfc: "\u{22AE}", - nfd: "\u{22A9}\u{0338}", - nfkc: "\u{22AE}", - nfkd: "\u{22A9}\u{0338}", - }, - NormalizationTest { - source: "\u{22AF}", - nfc: "\u{22AF}", - nfd: "\u{22AB}\u{0338}", - nfkc: "\u{22AF}", - nfkd: "\u{22AB}\u{0338}", - }, - NormalizationTest { - source: "\u{22E0}", - nfc: "\u{22E0}", - nfd: "\u{227C}\u{0338}", - nfkc: "\u{22E0}", - nfkd: "\u{227C}\u{0338}", - }, - NormalizationTest { - source: "\u{22E1}", - nfc: "\u{22E1}", - nfd: "\u{227D}\u{0338}", - nfkc: "\u{22E1}", - nfkd: "\u{227D}\u{0338}", - }, - NormalizationTest { - source: "\u{22E2}", - nfc: "\u{22E2}", - nfd: "\u{2291}\u{0338}", - nfkc: "\u{22E2}", - nfkd: "\u{2291}\u{0338}", - }, - NormalizationTest { - source: "\u{22E3}", - nfc: "\u{22E3}", - nfd: "\u{2292}\u{0338}", - nfkc: "\u{22E3}", - nfkd: "\u{2292}\u{0338}", - }, - NormalizationTest { - source: "\u{22EA}", - nfc: "\u{22EA}", - nfd: "\u{22B2}\u{0338}", - nfkc: "\u{22EA}", - nfkd: "\u{22B2}\u{0338}", - }, - NormalizationTest { - source: "\u{22EB}", - nfc: "\u{22EB}", - nfd: "\u{22B3}\u{0338}", - nfkc: "\u{22EB}", - nfkd: "\u{22B3}\u{0338}", - }, - NormalizationTest { - source: "\u{22EC}", - nfc: "\u{22EC}", - nfd: "\u{22B4}\u{0338}", - nfkc: "\u{22EC}", - nfkd: "\u{22B4}\u{0338}", - }, - NormalizationTest { - source: "\u{22ED}", - nfc: "\u{22ED}", - nfd: "\u{22B5}\u{0338}", - nfkc: "\u{22ED}", - nfkd: "\u{22B5}\u{0338}", - }, - NormalizationTest { - source: "\u{2329}", - nfc: "\u{3008}", - nfd: "\u{3008}", - nfkc: "\u{3008}", - nfkd: "\u{3008}", - }, - NormalizationTest { - source: "\u{232A}", - nfc: "\u{3009}", - nfd: "\u{3009}", - nfkc: "\u{3009}", - nfkd: "\u{3009}", - }, - NormalizationTest { - source: "\u{2460}", - nfc: "\u{2460}", - nfd: "\u{2460}", - nfkc: "\u{0031}", - nfkd: "\u{0031}", - }, - NormalizationTest { - source: "\u{2461}", - nfc: "\u{2461}", - nfd: "\u{2461}", - nfkc: "\u{0032}", - nfkd: "\u{0032}", - }, - NormalizationTest { - source: "\u{2462}", - nfc: "\u{2462}", - nfd: "\u{2462}", - nfkc: "\u{0033}", - nfkd: "\u{0033}", - }, - NormalizationTest { - source: "\u{2463}", - nfc: "\u{2463}", - nfd: "\u{2463}", - nfkc: "\u{0034}", - nfkd: "\u{0034}", - }, - NormalizationTest { - source: "\u{2464}", - nfc: "\u{2464}", - nfd: "\u{2464}", - nfkc: "\u{0035}", - nfkd: "\u{0035}", - }, - NormalizationTest { - source: "\u{2465}", - nfc: "\u{2465}", - nfd: "\u{2465}", - nfkc: "\u{0036}", - nfkd: "\u{0036}", - }, - NormalizationTest { - source: "\u{2466}", - nfc: "\u{2466}", - nfd: "\u{2466}", - nfkc: "\u{0037}", - nfkd: "\u{0037}", - }, - NormalizationTest { - source: "\u{2467}", - nfc: "\u{2467}", - nfd: "\u{2467}", - nfkc: "\u{0038}", - nfkd: "\u{0038}", - }, - NormalizationTest { - source: "\u{2468}", - nfc: "\u{2468}", - nfd: "\u{2468}", - nfkc: "\u{0039}", - nfkd: "\u{0039}", - }, - NormalizationTest { - source: "\u{2469}", - nfc: "\u{2469}", - nfd: "\u{2469}", - nfkc: "\u{0031}\u{0030}", - nfkd: "\u{0031}\u{0030}", - }, - NormalizationTest { - source: "\u{246A}", - nfc: "\u{246A}", - nfd: "\u{246A}", - nfkc: "\u{0031}\u{0031}", - nfkd: "\u{0031}\u{0031}", - }, - NormalizationTest { - source: "\u{246B}", - nfc: "\u{246B}", - nfd: "\u{246B}", - nfkc: "\u{0031}\u{0032}", - nfkd: "\u{0031}\u{0032}", - }, - NormalizationTest { - source: "\u{246C}", - nfc: "\u{246C}", - nfd: "\u{246C}", - nfkc: "\u{0031}\u{0033}", - nfkd: "\u{0031}\u{0033}", - }, - NormalizationTest { - source: "\u{246D}", - nfc: "\u{246D}", - nfd: "\u{246D}", - nfkc: "\u{0031}\u{0034}", - nfkd: "\u{0031}\u{0034}", - }, - NormalizationTest { - source: "\u{246E}", - nfc: "\u{246E}", - nfd: "\u{246E}", - nfkc: "\u{0031}\u{0035}", - nfkd: "\u{0031}\u{0035}", - }, - NormalizationTest { - source: "\u{246F}", - nfc: "\u{246F}", - nfd: "\u{246F}", - nfkc: "\u{0031}\u{0036}", - nfkd: "\u{0031}\u{0036}", - }, - NormalizationTest { - source: "\u{2470}", - nfc: "\u{2470}", - nfd: "\u{2470}", - nfkc: "\u{0031}\u{0037}", - nfkd: "\u{0031}\u{0037}", - }, - NormalizationTest { - source: "\u{2471}", - nfc: "\u{2471}", - nfd: "\u{2471}", - nfkc: "\u{0031}\u{0038}", - nfkd: "\u{0031}\u{0038}", - }, - NormalizationTest { - source: "\u{2472}", - nfc: "\u{2472}", - nfd: "\u{2472}", - nfkc: "\u{0031}\u{0039}", - nfkd: "\u{0031}\u{0039}", - }, - NormalizationTest { - source: "\u{2473}", - nfc: "\u{2473}", - nfd: "\u{2473}", - nfkc: "\u{0032}\u{0030}", - nfkd: "\u{0032}\u{0030}", - }, - NormalizationTest { - source: "\u{2474}", - nfc: "\u{2474}", - nfd: "\u{2474}", - nfkc: "\u{0028}\u{0031}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0029}", - }, - NormalizationTest { - source: "\u{2475}", - nfc: "\u{2475}", - nfd: "\u{2475}", - nfkc: "\u{0028}\u{0032}\u{0029}", - nfkd: "\u{0028}\u{0032}\u{0029}", - }, - NormalizationTest { - source: "\u{2476}", - nfc: "\u{2476}", - nfd: "\u{2476}", - nfkc: "\u{0028}\u{0033}\u{0029}", - nfkd: "\u{0028}\u{0033}\u{0029}", - }, - NormalizationTest { - source: "\u{2477}", - nfc: "\u{2477}", - nfd: "\u{2477}", - nfkc: "\u{0028}\u{0034}\u{0029}", - nfkd: "\u{0028}\u{0034}\u{0029}", - }, - NormalizationTest { - source: "\u{2478}", - nfc: "\u{2478}", - nfd: "\u{2478}", - nfkc: "\u{0028}\u{0035}\u{0029}", - nfkd: "\u{0028}\u{0035}\u{0029}", - }, - NormalizationTest { - source: "\u{2479}", - nfc: "\u{2479}", - nfd: "\u{2479}", - nfkc: "\u{0028}\u{0036}\u{0029}", - nfkd: "\u{0028}\u{0036}\u{0029}", - }, - NormalizationTest { - source: "\u{247A}", - nfc: "\u{247A}", - nfd: "\u{247A}", - nfkc: "\u{0028}\u{0037}\u{0029}", - nfkd: "\u{0028}\u{0037}\u{0029}", - }, - NormalizationTest { - source: "\u{247B}", - nfc: "\u{247B}", - nfd: "\u{247B}", - nfkc: "\u{0028}\u{0038}\u{0029}", - nfkd: "\u{0028}\u{0038}\u{0029}", - }, - NormalizationTest { - source: "\u{247C}", - nfc: "\u{247C}", - nfd: "\u{247C}", - nfkc: "\u{0028}\u{0039}\u{0029}", - nfkd: "\u{0028}\u{0039}\u{0029}", - }, - NormalizationTest { - source: "\u{247D}", - nfc: "\u{247D}", - nfd: "\u{247D}", - nfkc: "\u{0028}\u{0031}\u{0030}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0030}\u{0029}", - }, - NormalizationTest { - source: "\u{247E}", - nfc: "\u{247E}", - nfd: "\u{247E}", - nfkc: "\u{0028}\u{0031}\u{0031}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0031}\u{0029}", - }, - NormalizationTest { - source: "\u{247F}", - nfc: "\u{247F}", - nfd: "\u{247F}", - nfkc: "\u{0028}\u{0031}\u{0032}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0032}\u{0029}", - }, - NormalizationTest { - source: "\u{2480}", - nfc: "\u{2480}", - nfd: "\u{2480}", - nfkc: "\u{0028}\u{0031}\u{0033}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0033}\u{0029}", - }, - NormalizationTest { - source: "\u{2481}", - nfc: "\u{2481}", - nfd: "\u{2481}", - nfkc: "\u{0028}\u{0031}\u{0034}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0034}\u{0029}", - }, - NormalizationTest { - source: "\u{2482}", - nfc: "\u{2482}", - nfd: "\u{2482}", - nfkc: "\u{0028}\u{0031}\u{0035}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0035}\u{0029}", - }, - NormalizationTest { - source: "\u{2483}", - nfc: "\u{2483}", - nfd: "\u{2483}", - nfkc: "\u{0028}\u{0031}\u{0036}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0036}\u{0029}", - }, - NormalizationTest { - source: "\u{2484}", - nfc: "\u{2484}", - nfd: "\u{2484}", - nfkc: "\u{0028}\u{0031}\u{0037}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0037}\u{0029}", - }, - NormalizationTest { - source: "\u{2485}", - nfc: "\u{2485}", - nfd: "\u{2485}", - nfkc: "\u{0028}\u{0031}\u{0038}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0038}\u{0029}", - }, - NormalizationTest { - source: "\u{2486}", - nfc: "\u{2486}", - nfd: "\u{2486}", - nfkc: "\u{0028}\u{0031}\u{0039}\u{0029}", - nfkd: "\u{0028}\u{0031}\u{0039}\u{0029}", - }, - NormalizationTest { - source: "\u{2487}", - nfc: "\u{2487}", - nfd: "\u{2487}", - nfkc: "\u{0028}\u{0032}\u{0030}\u{0029}", - nfkd: "\u{0028}\u{0032}\u{0030}\u{0029}", - }, - NormalizationTest { - source: "\u{2488}", - nfc: "\u{2488}", - nfd: "\u{2488}", - nfkc: "\u{0031}\u{002E}", - nfkd: "\u{0031}\u{002E}", - }, - NormalizationTest { - source: "\u{2489}", - nfc: "\u{2489}", - nfd: "\u{2489}", - nfkc: "\u{0032}\u{002E}", - nfkd: "\u{0032}\u{002E}", - }, - NormalizationTest { - source: "\u{248A}", - nfc: "\u{248A}", - nfd: "\u{248A}", - nfkc: "\u{0033}\u{002E}", - nfkd: "\u{0033}\u{002E}", - }, - NormalizationTest { - source: "\u{248B}", - nfc: "\u{248B}", - nfd: "\u{248B}", - nfkc: "\u{0034}\u{002E}", - nfkd: "\u{0034}\u{002E}", - }, - NormalizationTest { - source: "\u{248C}", - nfc: "\u{248C}", - nfd: "\u{248C}", - nfkc: "\u{0035}\u{002E}", - nfkd: "\u{0035}\u{002E}", - }, - NormalizationTest { - source: "\u{248D}", - nfc: "\u{248D}", - nfd: "\u{248D}", - nfkc: "\u{0036}\u{002E}", - nfkd: "\u{0036}\u{002E}", - }, - NormalizationTest { - source: "\u{248E}", - nfc: "\u{248E}", - nfd: "\u{248E}", - nfkc: "\u{0037}\u{002E}", - nfkd: "\u{0037}\u{002E}", - }, - NormalizationTest { - source: "\u{248F}", - nfc: "\u{248F}", - nfd: "\u{248F}", - nfkc: "\u{0038}\u{002E}", - nfkd: "\u{0038}\u{002E}", - }, - NormalizationTest { - source: "\u{2490}", - nfc: "\u{2490}", - nfd: "\u{2490}", - nfkc: "\u{0039}\u{002E}", - nfkd: "\u{0039}\u{002E}", - }, - NormalizationTest { - source: "\u{2491}", - nfc: "\u{2491}", - nfd: "\u{2491}", - nfkc: "\u{0031}\u{0030}\u{002E}", - nfkd: "\u{0031}\u{0030}\u{002E}", - }, - NormalizationTest { - source: "\u{2492}", - nfc: "\u{2492}", - nfd: "\u{2492}", - nfkc: "\u{0031}\u{0031}\u{002E}", - nfkd: "\u{0031}\u{0031}\u{002E}", - }, - NormalizationTest { - source: "\u{2493}", - nfc: "\u{2493}", - nfd: "\u{2493}", - nfkc: "\u{0031}\u{0032}\u{002E}", - nfkd: "\u{0031}\u{0032}\u{002E}", - }, - NormalizationTest { - source: "\u{2494}", - nfc: "\u{2494}", - nfd: "\u{2494}", - nfkc: "\u{0031}\u{0033}\u{002E}", - nfkd: "\u{0031}\u{0033}\u{002E}", - }, - NormalizationTest { - source: "\u{2495}", - nfc: "\u{2495}", - nfd: "\u{2495}", - nfkc: "\u{0031}\u{0034}\u{002E}", - nfkd: "\u{0031}\u{0034}\u{002E}", - }, - NormalizationTest { - source: "\u{2496}", - nfc: "\u{2496}", - nfd: "\u{2496}", - nfkc: "\u{0031}\u{0035}\u{002E}", - nfkd: "\u{0031}\u{0035}\u{002E}", - }, - NormalizationTest { - source: "\u{2497}", - nfc: "\u{2497}", - nfd: "\u{2497}", - nfkc: "\u{0031}\u{0036}\u{002E}", - nfkd: "\u{0031}\u{0036}\u{002E}", - }, - NormalizationTest { - source: "\u{2498}", - nfc: "\u{2498}", - nfd: "\u{2498}", - nfkc: "\u{0031}\u{0037}\u{002E}", - nfkd: "\u{0031}\u{0037}\u{002E}", - }, - NormalizationTest { - source: "\u{2499}", - nfc: "\u{2499}", - nfd: "\u{2499}", - nfkc: "\u{0031}\u{0038}\u{002E}", - nfkd: "\u{0031}\u{0038}\u{002E}", - }, - NormalizationTest { - source: "\u{249A}", - nfc: "\u{249A}", - nfd: "\u{249A}", - nfkc: "\u{0031}\u{0039}\u{002E}", - nfkd: "\u{0031}\u{0039}\u{002E}", - }, - NormalizationTest { - source: "\u{249B}", - nfc: "\u{249B}", - nfd: "\u{249B}", - nfkc: "\u{0032}\u{0030}\u{002E}", - nfkd: "\u{0032}\u{0030}\u{002E}", - }, - NormalizationTest { - source: "\u{249C}", - nfc: "\u{249C}", - nfd: "\u{249C}", - nfkc: "\u{0028}\u{0061}\u{0029}", - nfkd: "\u{0028}\u{0061}\u{0029}", - }, - NormalizationTest { - source: "\u{249D}", - nfc: "\u{249D}", - nfd: "\u{249D}", - nfkc: "\u{0028}\u{0062}\u{0029}", - nfkd: "\u{0028}\u{0062}\u{0029}", - }, - NormalizationTest { - source: "\u{249E}", - nfc: "\u{249E}", - nfd: "\u{249E}", - nfkc: "\u{0028}\u{0063}\u{0029}", - nfkd: "\u{0028}\u{0063}\u{0029}", - }, - NormalizationTest { - source: "\u{249F}", - nfc: "\u{249F}", - nfd: "\u{249F}", - nfkc: "\u{0028}\u{0064}\u{0029}", - nfkd: "\u{0028}\u{0064}\u{0029}", - }, - NormalizationTest { - source: "\u{24A0}", - nfc: "\u{24A0}", - nfd: "\u{24A0}", - nfkc: "\u{0028}\u{0065}\u{0029}", - nfkd: "\u{0028}\u{0065}\u{0029}", - }, - NormalizationTest { - source: "\u{24A1}", - nfc: "\u{24A1}", - nfd: "\u{24A1}", - nfkc: "\u{0028}\u{0066}\u{0029}", - nfkd: "\u{0028}\u{0066}\u{0029}", - }, - NormalizationTest { - source: "\u{24A2}", - nfc: "\u{24A2}", - nfd: "\u{24A2}", - nfkc: "\u{0028}\u{0067}\u{0029}", - nfkd: "\u{0028}\u{0067}\u{0029}", - }, - NormalizationTest { - source: "\u{24A3}", - nfc: "\u{24A3}", - nfd: "\u{24A3}", - nfkc: "\u{0028}\u{0068}\u{0029}", - nfkd: "\u{0028}\u{0068}\u{0029}", - }, - NormalizationTest { - source: "\u{24A4}", - nfc: "\u{24A4}", - nfd: "\u{24A4}", - nfkc: "\u{0028}\u{0069}\u{0029}", - nfkd: "\u{0028}\u{0069}\u{0029}", - }, - NormalizationTest { - source: "\u{24A5}", - nfc: "\u{24A5}", - nfd: "\u{24A5}", - nfkc: "\u{0028}\u{006A}\u{0029}", - nfkd: "\u{0028}\u{006A}\u{0029}", - }, - NormalizationTest { - source: "\u{24A6}", - nfc: "\u{24A6}", - nfd: "\u{24A6}", - nfkc: "\u{0028}\u{006B}\u{0029}", - nfkd: "\u{0028}\u{006B}\u{0029}", - }, - NormalizationTest { - source: "\u{24A7}", - nfc: "\u{24A7}", - nfd: "\u{24A7}", - nfkc: "\u{0028}\u{006C}\u{0029}", - nfkd: "\u{0028}\u{006C}\u{0029}", - }, - NormalizationTest { - source: "\u{24A8}", - nfc: "\u{24A8}", - nfd: "\u{24A8}", - nfkc: "\u{0028}\u{006D}\u{0029}", - nfkd: "\u{0028}\u{006D}\u{0029}", - }, - NormalizationTest { - source: "\u{24A9}", - nfc: "\u{24A9}", - nfd: "\u{24A9}", - nfkc: "\u{0028}\u{006E}\u{0029}", - nfkd: "\u{0028}\u{006E}\u{0029}", - }, - NormalizationTest { - source: "\u{24AA}", - nfc: "\u{24AA}", - nfd: "\u{24AA}", - nfkc: "\u{0028}\u{006F}\u{0029}", - nfkd: "\u{0028}\u{006F}\u{0029}", - }, - NormalizationTest { - source: "\u{24AB}", - nfc: "\u{24AB}", - nfd: "\u{24AB}", - nfkc: "\u{0028}\u{0070}\u{0029}", - nfkd: "\u{0028}\u{0070}\u{0029}", - }, - NormalizationTest { - source: "\u{24AC}", - nfc: "\u{24AC}", - nfd: "\u{24AC}", - nfkc: "\u{0028}\u{0071}\u{0029}", - nfkd: "\u{0028}\u{0071}\u{0029}", - }, - NormalizationTest { - source: "\u{24AD}", - nfc: "\u{24AD}", - nfd: "\u{24AD}", - nfkc: "\u{0028}\u{0072}\u{0029}", - nfkd: "\u{0028}\u{0072}\u{0029}", - }, - NormalizationTest { - source: "\u{24AE}", - nfc: "\u{24AE}", - nfd: "\u{24AE}", - nfkc: "\u{0028}\u{0073}\u{0029}", - nfkd: "\u{0028}\u{0073}\u{0029}", - }, - NormalizationTest { - source: "\u{24AF}", - nfc: "\u{24AF}", - nfd: "\u{24AF}", - nfkc: "\u{0028}\u{0074}\u{0029}", - nfkd: "\u{0028}\u{0074}\u{0029}", - }, - NormalizationTest { - source: "\u{24B0}", - nfc: "\u{24B0}", - nfd: "\u{24B0}", - nfkc: "\u{0028}\u{0075}\u{0029}", - nfkd: "\u{0028}\u{0075}\u{0029}", - }, - NormalizationTest { - source: "\u{24B1}", - nfc: "\u{24B1}", - nfd: "\u{24B1}", - nfkc: "\u{0028}\u{0076}\u{0029}", - nfkd: "\u{0028}\u{0076}\u{0029}", - }, - NormalizationTest { - source: "\u{24B2}", - nfc: "\u{24B2}", - nfd: "\u{24B2}", - nfkc: "\u{0028}\u{0077}\u{0029}", - nfkd: "\u{0028}\u{0077}\u{0029}", - }, - NormalizationTest { - source: "\u{24B3}", - nfc: "\u{24B3}", - nfd: "\u{24B3}", - nfkc: "\u{0028}\u{0078}\u{0029}", - nfkd: "\u{0028}\u{0078}\u{0029}", - }, - NormalizationTest { - source: "\u{24B4}", - nfc: "\u{24B4}", - nfd: "\u{24B4}", - nfkc: "\u{0028}\u{0079}\u{0029}", - nfkd: "\u{0028}\u{0079}\u{0029}", - }, - NormalizationTest { - source: "\u{24B5}", - nfc: "\u{24B5}", - nfd: "\u{24B5}", - nfkc: "\u{0028}\u{007A}\u{0029}", - nfkd: "\u{0028}\u{007A}\u{0029}", - }, - NormalizationTest { - source: "\u{24B6}", - nfc: "\u{24B6}", - nfd: "\u{24B6}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{24B7}", - nfc: "\u{24B7}", - nfd: "\u{24B7}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{24B8}", - nfc: "\u{24B8}", - nfd: "\u{24B8}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{24B9}", - nfc: "\u{24B9}", - nfd: "\u{24B9}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{24BA}", - nfc: "\u{24BA}", - nfd: "\u{24BA}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{24BB}", - nfc: "\u{24BB}", - nfd: "\u{24BB}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{24BC}", - nfc: "\u{24BC}", - nfd: "\u{24BC}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{24BD}", - nfc: "\u{24BD}", - nfd: "\u{24BD}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{24BE}", - nfc: "\u{24BE}", - nfd: "\u{24BE}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{24BF}", - nfc: "\u{24BF}", - nfd: "\u{24BF}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{24C0}", - nfc: "\u{24C0}", - nfd: "\u{24C0}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{24C1}", - nfc: "\u{24C1}", - nfd: "\u{24C1}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{24C2}", - nfc: "\u{24C2}", - nfd: "\u{24C2}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{24C3}", - nfc: "\u{24C3}", - nfd: "\u{24C3}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{24C4}", - nfc: "\u{24C4}", - nfd: "\u{24C4}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{24C5}", - nfc: "\u{24C5}", - nfd: "\u{24C5}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{24C6}", - nfc: "\u{24C6}", - nfd: "\u{24C6}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{24C7}", - nfc: "\u{24C7}", - nfd: "\u{24C7}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{24C8}", - nfc: "\u{24C8}", - nfd: "\u{24C8}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{24C9}", - nfc: "\u{24C9}", - nfd: "\u{24C9}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{24CA}", - nfc: "\u{24CA}", - nfd: "\u{24CA}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{24CB}", - nfc: "\u{24CB}", - nfd: "\u{24CB}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{24CC}", - nfc: "\u{24CC}", - nfd: "\u{24CC}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{24CD}", - nfc: "\u{24CD}", - nfd: "\u{24CD}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{24CE}", - nfc: "\u{24CE}", - nfd: "\u{24CE}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{24CF}", - nfc: "\u{24CF}", - nfd: "\u{24CF}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{24D0}", - nfc: "\u{24D0}", - nfd: "\u{24D0}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{24D1}", - nfc: "\u{24D1}", - nfd: "\u{24D1}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{24D2}", - nfc: "\u{24D2}", - nfd: "\u{24D2}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{24D3}", - nfc: "\u{24D3}", - nfd: "\u{24D3}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{24D4}", - nfc: "\u{24D4}", - nfd: "\u{24D4}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{24D5}", - nfc: "\u{24D5}", - nfd: "\u{24D5}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{24D6}", - nfc: "\u{24D6}", - nfd: "\u{24D6}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{24D7}", - nfc: "\u{24D7}", - nfd: "\u{24D7}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{24D8}", - nfc: "\u{24D8}", - nfd: "\u{24D8}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{24D9}", - nfc: "\u{24D9}", - nfd: "\u{24D9}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{24DA}", - nfc: "\u{24DA}", - nfd: "\u{24DA}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{24DB}", - nfc: "\u{24DB}", - nfd: "\u{24DB}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{24DC}", - nfc: "\u{24DC}", - nfd: "\u{24DC}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{24DD}", - nfc: "\u{24DD}", - nfd: "\u{24DD}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{24DE}", - nfc: "\u{24DE}", - nfd: "\u{24DE}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{24DF}", - nfc: "\u{24DF}", - nfd: "\u{24DF}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{24E0}", - nfc: "\u{24E0}", - nfd: "\u{24E0}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{24E1}", - nfc: "\u{24E1}", - nfd: "\u{24E1}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{24E2}", - nfc: "\u{24E2}", - nfd: "\u{24E2}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{24E3}", - nfc: "\u{24E3}", - nfd: "\u{24E3}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{24E4}", - nfc: "\u{24E4}", - nfd: "\u{24E4}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{24E5}", - nfc: "\u{24E5}", - nfd: "\u{24E5}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{24E6}", - nfc: "\u{24E6}", - nfd: "\u{24E6}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{24E7}", - nfc: "\u{24E7}", - nfd: "\u{24E7}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{24E8}", - nfc: "\u{24E8}", - nfd: "\u{24E8}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{24E9}", - nfc: "\u{24E9}", - nfd: "\u{24E9}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{24EA}", - nfc: "\u{24EA}", - nfd: "\u{24EA}", - nfkc: "\u{0030}", - nfkd: "\u{0030}", - }, - NormalizationTest { - source: "\u{2A0C}", - nfc: "\u{2A0C}", - nfd: "\u{2A0C}", - nfkc: "\u{222B}\u{222B}\u{222B}\u{222B}", - nfkd: "\u{222B}\u{222B}\u{222B}\u{222B}", - }, - NormalizationTest { - source: "\u{2A74}", - nfc: "\u{2A74}", - nfd: "\u{2A74}", - nfkc: "\u{003A}\u{003A}\u{003D}", - nfkd: "\u{003A}\u{003A}\u{003D}", - }, - NormalizationTest { - source: "\u{2A75}", - nfc: "\u{2A75}", - nfd: "\u{2A75}", - nfkc: "\u{003D}\u{003D}", - nfkd: "\u{003D}\u{003D}", - }, - NormalizationTest { - source: "\u{2A76}", - nfc: "\u{2A76}", - nfd: "\u{2A76}", - nfkc: "\u{003D}\u{003D}\u{003D}", - nfkd: "\u{003D}\u{003D}\u{003D}", - }, - NormalizationTest { - source: "\u{2ADC}", - nfc: "\u{2ADD}\u{0338}", - nfd: "\u{2ADD}\u{0338}", - nfkc: "\u{2ADD}\u{0338}", - nfkd: "\u{2ADD}\u{0338}", - }, - NormalizationTest { - source: "\u{2C7C}", - nfc: "\u{2C7C}", - nfd: "\u{2C7C}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{2C7D}", - nfc: "\u{2C7D}", - nfd: "\u{2C7D}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{2D6F}", - nfc: "\u{2D6F}", - nfd: "\u{2D6F}", - nfkc: "\u{2D61}", - nfkd: "\u{2D61}", - }, - NormalizationTest { - source: "\u{2E9F}", - nfc: "\u{2E9F}", - nfd: "\u{2E9F}", - nfkc: "\u{6BCD}", - nfkd: "\u{6BCD}", - }, - NormalizationTest { - source: "\u{2EF3}", - nfc: "\u{2EF3}", - nfd: "\u{2EF3}", - nfkc: "\u{9F9F}", - nfkd: "\u{9F9F}", - }, - NormalizationTest { - source: "\u{2F00}", - nfc: "\u{2F00}", - nfd: "\u{2F00}", - nfkc: "\u{4E00}", - nfkd: "\u{4E00}", - }, - NormalizationTest { - source: "\u{2F01}", - nfc: "\u{2F01}", - nfd: "\u{2F01}", - nfkc: "\u{4E28}", - nfkd: "\u{4E28}", - }, - NormalizationTest { - source: "\u{2F02}", - nfc: "\u{2F02}", - nfd: "\u{2F02}", - nfkc: "\u{4E36}", - nfkd: "\u{4E36}", - }, - NormalizationTest { - source: "\u{2F03}", - nfc: "\u{2F03}", - nfd: "\u{2F03}", - nfkc: "\u{4E3F}", - nfkd: "\u{4E3F}", - }, - NormalizationTest { - source: "\u{2F04}", - nfc: "\u{2F04}", - nfd: "\u{2F04}", - nfkc: "\u{4E59}", - nfkd: "\u{4E59}", - }, - NormalizationTest { - source: "\u{2F05}", - nfc: "\u{2F05}", - nfd: "\u{2F05}", - nfkc: "\u{4E85}", - nfkd: "\u{4E85}", - }, - NormalizationTest { - source: "\u{2F06}", - nfc: "\u{2F06}", - nfd: "\u{2F06}", - nfkc: "\u{4E8C}", - nfkd: "\u{4E8C}", - }, - NormalizationTest { - source: "\u{2F07}", - nfc: "\u{2F07}", - nfd: "\u{2F07}", - nfkc: "\u{4EA0}", - nfkd: "\u{4EA0}", - }, - NormalizationTest { - source: "\u{2F08}", - nfc: "\u{2F08}", - nfd: "\u{2F08}", - nfkc: "\u{4EBA}", - nfkd: "\u{4EBA}", - }, - NormalizationTest { - source: "\u{2F09}", - nfc: "\u{2F09}", - nfd: "\u{2F09}", - nfkc: "\u{513F}", - nfkd: "\u{513F}", - }, - NormalizationTest { - source: "\u{2F0A}", - nfc: "\u{2F0A}", - nfd: "\u{2F0A}", - nfkc: "\u{5165}", - nfkd: "\u{5165}", - }, - NormalizationTest { - source: "\u{2F0B}", - nfc: "\u{2F0B}", - nfd: "\u{2F0B}", - nfkc: "\u{516B}", - nfkd: "\u{516B}", - }, - NormalizationTest { - source: "\u{2F0C}", - nfc: "\u{2F0C}", - nfd: "\u{2F0C}", - nfkc: "\u{5182}", - nfkd: "\u{5182}", - }, - NormalizationTest { - source: "\u{2F0D}", - nfc: "\u{2F0D}", - nfd: "\u{2F0D}", - nfkc: "\u{5196}", - nfkd: "\u{5196}", - }, - NormalizationTest { - source: "\u{2F0E}", - nfc: "\u{2F0E}", - nfd: "\u{2F0E}", - nfkc: "\u{51AB}", - nfkd: "\u{51AB}", - }, - NormalizationTest { - source: "\u{2F0F}", - nfc: "\u{2F0F}", - nfd: "\u{2F0F}", - nfkc: "\u{51E0}", - nfkd: "\u{51E0}", - }, - NormalizationTest { - source: "\u{2F10}", - nfc: "\u{2F10}", - nfd: "\u{2F10}", - nfkc: "\u{51F5}", - nfkd: "\u{51F5}", - }, - NormalizationTest { - source: "\u{2F11}", - nfc: "\u{2F11}", - nfd: "\u{2F11}", - nfkc: "\u{5200}", - nfkd: "\u{5200}", - }, - NormalizationTest { - source: "\u{2F12}", - nfc: "\u{2F12}", - nfd: "\u{2F12}", - nfkc: "\u{529B}", - nfkd: "\u{529B}", - }, - NormalizationTest { - source: "\u{2F13}", - nfc: "\u{2F13}", - nfd: "\u{2F13}", - nfkc: "\u{52F9}", - nfkd: "\u{52F9}", - }, - NormalizationTest { - source: "\u{2F14}", - nfc: "\u{2F14}", - nfd: "\u{2F14}", - nfkc: "\u{5315}", - nfkd: "\u{5315}", - }, - NormalizationTest { - source: "\u{2F15}", - nfc: "\u{2F15}", - nfd: "\u{2F15}", - nfkc: "\u{531A}", - nfkd: "\u{531A}", - }, - NormalizationTest { - source: "\u{2F16}", - nfc: "\u{2F16}", - nfd: "\u{2F16}", - nfkc: "\u{5338}", - nfkd: "\u{5338}", - }, - NormalizationTest { - source: "\u{2F17}", - nfc: "\u{2F17}", - nfd: "\u{2F17}", - nfkc: "\u{5341}", - nfkd: "\u{5341}", - }, - NormalizationTest { - source: "\u{2F18}", - nfc: "\u{2F18}", - nfd: "\u{2F18}", - nfkc: "\u{535C}", - nfkd: "\u{535C}", - }, - NormalizationTest { - source: "\u{2F19}", - nfc: "\u{2F19}", - nfd: "\u{2F19}", - nfkc: "\u{5369}", - nfkd: "\u{5369}", - }, - NormalizationTest { - source: "\u{2F1A}", - nfc: "\u{2F1A}", - nfd: "\u{2F1A}", - nfkc: "\u{5382}", - nfkd: "\u{5382}", - }, - NormalizationTest { - source: "\u{2F1B}", - nfc: "\u{2F1B}", - nfd: "\u{2F1B}", - nfkc: "\u{53B6}", - nfkd: "\u{53B6}", - }, - NormalizationTest { - source: "\u{2F1C}", - nfc: "\u{2F1C}", - nfd: "\u{2F1C}", - nfkc: "\u{53C8}", - nfkd: "\u{53C8}", - }, - NormalizationTest { - source: "\u{2F1D}", - nfc: "\u{2F1D}", - nfd: "\u{2F1D}", - nfkc: "\u{53E3}", - nfkd: "\u{53E3}", - }, - NormalizationTest { - source: "\u{2F1E}", - nfc: "\u{2F1E}", - nfd: "\u{2F1E}", - nfkc: "\u{56D7}", - nfkd: "\u{56D7}", - }, - NormalizationTest { - source: "\u{2F1F}", - nfc: "\u{2F1F}", - nfd: "\u{2F1F}", - nfkc: "\u{571F}", - nfkd: "\u{571F}", - }, - NormalizationTest { - source: "\u{2F20}", - nfc: "\u{2F20}", - nfd: "\u{2F20}", - nfkc: "\u{58EB}", - nfkd: "\u{58EB}", - }, - NormalizationTest { - source: "\u{2F21}", - nfc: "\u{2F21}", - nfd: "\u{2F21}", - nfkc: "\u{5902}", - nfkd: "\u{5902}", - }, - NormalizationTest { - source: "\u{2F22}", - nfc: "\u{2F22}", - nfd: "\u{2F22}", - nfkc: "\u{590A}", - nfkd: "\u{590A}", - }, - NormalizationTest { - source: "\u{2F23}", - nfc: "\u{2F23}", - nfd: "\u{2F23}", - nfkc: "\u{5915}", - nfkd: "\u{5915}", - }, - NormalizationTest { - source: "\u{2F24}", - nfc: "\u{2F24}", - nfd: "\u{2F24}", - nfkc: "\u{5927}", - nfkd: "\u{5927}", - }, - NormalizationTest { - source: "\u{2F25}", - nfc: "\u{2F25}", - nfd: "\u{2F25}", - nfkc: "\u{5973}", - nfkd: "\u{5973}", - }, - NormalizationTest { - source: "\u{2F26}", - nfc: "\u{2F26}", - nfd: "\u{2F26}", - nfkc: "\u{5B50}", - nfkd: "\u{5B50}", - }, - NormalizationTest { - source: "\u{2F27}", - nfc: "\u{2F27}", - nfd: "\u{2F27}", - nfkc: "\u{5B80}", - nfkd: "\u{5B80}", - }, - NormalizationTest { - source: "\u{2F28}", - nfc: "\u{2F28}", - nfd: "\u{2F28}", - nfkc: "\u{5BF8}", - nfkd: "\u{5BF8}", - }, - NormalizationTest { - source: "\u{2F29}", - nfc: "\u{2F29}", - nfd: "\u{2F29}", - nfkc: "\u{5C0F}", - nfkd: "\u{5C0F}", - }, - NormalizationTest { - source: "\u{2F2A}", - nfc: "\u{2F2A}", - nfd: "\u{2F2A}", - nfkc: "\u{5C22}", - nfkd: "\u{5C22}", - }, - NormalizationTest { - source: "\u{2F2B}", - nfc: "\u{2F2B}", - nfd: "\u{2F2B}", - nfkc: "\u{5C38}", - nfkd: "\u{5C38}", - }, - NormalizationTest { - source: "\u{2F2C}", - nfc: "\u{2F2C}", - nfd: "\u{2F2C}", - nfkc: "\u{5C6E}", - nfkd: "\u{5C6E}", - }, - NormalizationTest { - source: "\u{2F2D}", - nfc: "\u{2F2D}", - nfd: "\u{2F2D}", - nfkc: "\u{5C71}", - nfkd: "\u{5C71}", - }, - NormalizationTest { - source: "\u{2F2E}", - nfc: "\u{2F2E}", - nfd: "\u{2F2E}", - nfkc: "\u{5DDB}", - nfkd: "\u{5DDB}", - }, - NormalizationTest { - source: "\u{2F2F}", - nfc: "\u{2F2F}", - nfd: "\u{2F2F}", - nfkc: "\u{5DE5}", - nfkd: "\u{5DE5}", - }, - NormalizationTest { - source: "\u{2F30}", - nfc: "\u{2F30}", - nfd: "\u{2F30}", - nfkc: "\u{5DF1}", - nfkd: "\u{5DF1}", - }, - NormalizationTest { - source: "\u{2F31}", - nfc: "\u{2F31}", - nfd: "\u{2F31}", - nfkc: "\u{5DFE}", - nfkd: "\u{5DFE}", - }, - NormalizationTest { - source: "\u{2F32}", - nfc: "\u{2F32}", - nfd: "\u{2F32}", - nfkc: "\u{5E72}", - nfkd: "\u{5E72}", - }, - NormalizationTest { - source: "\u{2F33}", - nfc: "\u{2F33}", - nfd: "\u{2F33}", - nfkc: "\u{5E7A}", - nfkd: "\u{5E7A}", - }, - NormalizationTest { - source: "\u{2F34}", - nfc: "\u{2F34}", - nfd: "\u{2F34}", - nfkc: "\u{5E7F}", - nfkd: "\u{5E7F}", - }, - NormalizationTest { - source: "\u{2F35}", - nfc: "\u{2F35}", - nfd: "\u{2F35}", - nfkc: "\u{5EF4}", - nfkd: "\u{5EF4}", - }, - NormalizationTest { - source: "\u{2F36}", - nfc: "\u{2F36}", - nfd: "\u{2F36}", - nfkc: "\u{5EFE}", - nfkd: "\u{5EFE}", - }, - NormalizationTest { - source: "\u{2F37}", - nfc: "\u{2F37}", - nfd: "\u{2F37}", - nfkc: "\u{5F0B}", - nfkd: "\u{5F0B}", - }, - NormalizationTest { - source: "\u{2F38}", - nfc: "\u{2F38}", - nfd: "\u{2F38}", - nfkc: "\u{5F13}", - nfkd: "\u{5F13}", - }, - NormalizationTest { - source: "\u{2F39}", - nfc: "\u{2F39}", - nfd: "\u{2F39}", - nfkc: "\u{5F50}", - nfkd: "\u{5F50}", - }, - NormalizationTest { - source: "\u{2F3A}", - nfc: "\u{2F3A}", - nfd: "\u{2F3A}", - nfkc: "\u{5F61}", - nfkd: "\u{5F61}", - }, - NormalizationTest { - source: "\u{2F3B}", - nfc: "\u{2F3B}", - nfd: "\u{2F3B}", - nfkc: "\u{5F73}", - nfkd: "\u{5F73}", - }, - NormalizationTest { - source: "\u{2F3C}", - nfc: "\u{2F3C}", - nfd: "\u{2F3C}", - nfkc: "\u{5FC3}", - nfkd: "\u{5FC3}", - }, - NormalizationTest { - source: "\u{2F3D}", - nfc: "\u{2F3D}", - nfd: "\u{2F3D}", - nfkc: "\u{6208}", - nfkd: "\u{6208}", - }, - NormalizationTest { - source: "\u{2F3E}", - nfc: "\u{2F3E}", - nfd: "\u{2F3E}", - nfkc: "\u{6236}", - nfkd: "\u{6236}", - }, - NormalizationTest { - source: "\u{2F3F}", - nfc: "\u{2F3F}", - nfd: "\u{2F3F}", - nfkc: "\u{624B}", - nfkd: "\u{624B}", - }, - NormalizationTest { - source: "\u{2F40}", - nfc: "\u{2F40}", - nfd: "\u{2F40}", - nfkc: "\u{652F}", - nfkd: "\u{652F}", - }, - NormalizationTest { - source: "\u{2F41}", - nfc: "\u{2F41}", - nfd: "\u{2F41}", - nfkc: "\u{6534}", - nfkd: "\u{6534}", - }, - NormalizationTest { - source: "\u{2F42}", - nfc: "\u{2F42}", - nfd: "\u{2F42}", - nfkc: "\u{6587}", - nfkd: "\u{6587}", - }, - NormalizationTest { - source: "\u{2F43}", - nfc: "\u{2F43}", - nfd: "\u{2F43}", - nfkc: "\u{6597}", - nfkd: "\u{6597}", - }, - NormalizationTest { - source: "\u{2F44}", - nfc: "\u{2F44}", - nfd: "\u{2F44}", - nfkc: "\u{65A4}", - nfkd: "\u{65A4}", - }, - NormalizationTest { - source: "\u{2F45}", - nfc: "\u{2F45}", - nfd: "\u{2F45}", - nfkc: "\u{65B9}", - nfkd: "\u{65B9}", - }, - NormalizationTest { - source: "\u{2F46}", - nfc: "\u{2F46}", - nfd: "\u{2F46}", - nfkc: "\u{65E0}", - nfkd: "\u{65E0}", - }, - NormalizationTest { - source: "\u{2F47}", - nfc: "\u{2F47}", - nfd: "\u{2F47}", - nfkc: "\u{65E5}", - nfkd: "\u{65E5}", - }, - NormalizationTest { - source: "\u{2F48}", - nfc: "\u{2F48}", - nfd: "\u{2F48}", - nfkc: "\u{66F0}", - nfkd: "\u{66F0}", - }, - NormalizationTest { - source: "\u{2F49}", - nfc: "\u{2F49}", - nfd: "\u{2F49}", - nfkc: "\u{6708}", - nfkd: "\u{6708}", - }, - NormalizationTest { - source: "\u{2F4A}", - nfc: "\u{2F4A}", - nfd: "\u{2F4A}", - nfkc: "\u{6728}", - nfkd: "\u{6728}", - }, - NormalizationTest { - source: "\u{2F4B}", - nfc: "\u{2F4B}", - nfd: "\u{2F4B}", - nfkc: "\u{6B20}", - nfkd: "\u{6B20}", - }, - NormalizationTest { - source: "\u{2F4C}", - nfc: "\u{2F4C}", - nfd: "\u{2F4C}", - nfkc: "\u{6B62}", - nfkd: "\u{6B62}", - }, - NormalizationTest { - source: "\u{2F4D}", - nfc: "\u{2F4D}", - nfd: "\u{2F4D}", - nfkc: "\u{6B79}", - nfkd: "\u{6B79}", - }, - NormalizationTest { - source: "\u{2F4E}", - nfc: "\u{2F4E}", - nfd: "\u{2F4E}", - nfkc: "\u{6BB3}", - nfkd: "\u{6BB3}", - }, - NormalizationTest { - source: "\u{2F4F}", - nfc: "\u{2F4F}", - nfd: "\u{2F4F}", - nfkc: "\u{6BCB}", - nfkd: "\u{6BCB}", - }, - NormalizationTest { - source: "\u{2F50}", - nfc: "\u{2F50}", - nfd: "\u{2F50}", - nfkc: "\u{6BD4}", - nfkd: "\u{6BD4}", - }, - NormalizationTest { - source: "\u{2F51}", - nfc: "\u{2F51}", - nfd: "\u{2F51}", - nfkc: "\u{6BDB}", - nfkd: "\u{6BDB}", - }, - NormalizationTest { - source: "\u{2F52}", - nfc: "\u{2F52}", - nfd: "\u{2F52}", - nfkc: "\u{6C0F}", - nfkd: "\u{6C0F}", - }, - NormalizationTest { - source: "\u{2F53}", - nfc: "\u{2F53}", - nfd: "\u{2F53}", - nfkc: "\u{6C14}", - nfkd: "\u{6C14}", - }, - NormalizationTest { - source: "\u{2F54}", - nfc: "\u{2F54}", - nfd: "\u{2F54}", - nfkc: "\u{6C34}", - nfkd: "\u{6C34}", - }, - NormalizationTest { - source: "\u{2F55}", - nfc: "\u{2F55}", - nfd: "\u{2F55}", - nfkc: "\u{706B}", - nfkd: "\u{706B}", - }, - NormalizationTest { - source: "\u{2F56}", - nfc: "\u{2F56}", - nfd: "\u{2F56}", - nfkc: "\u{722A}", - nfkd: "\u{722A}", - }, - NormalizationTest { - source: "\u{2F57}", - nfc: "\u{2F57}", - nfd: "\u{2F57}", - nfkc: "\u{7236}", - nfkd: "\u{7236}", - }, - NormalizationTest { - source: "\u{2F58}", - nfc: "\u{2F58}", - nfd: "\u{2F58}", - nfkc: "\u{723B}", - nfkd: "\u{723B}", - }, - NormalizationTest { - source: "\u{2F59}", - nfc: "\u{2F59}", - nfd: "\u{2F59}", - nfkc: "\u{723F}", - nfkd: "\u{723F}", - }, - NormalizationTest { - source: "\u{2F5A}", - nfc: "\u{2F5A}", - nfd: "\u{2F5A}", - nfkc: "\u{7247}", - nfkd: "\u{7247}", - }, - NormalizationTest { - source: "\u{2F5B}", - nfc: "\u{2F5B}", - nfd: "\u{2F5B}", - nfkc: "\u{7259}", - nfkd: "\u{7259}", - }, - NormalizationTest { - source: "\u{2F5C}", - nfc: "\u{2F5C}", - nfd: "\u{2F5C}", - nfkc: "\u{725B}", - nfkd: "\u{725B}", - }, - NormalizationTest { - source: "\u{2F5D}", - nfc: "\u{2F5D}", - nfd: "\u{2F5D}", - nfkc: "\u{72AC}", - nfkd: "\u{72AC}", - }, - NormalizationTest { - source: "\u{2F5E}", - nfc: "\u{2F5E}", - nfd: "\u{2F5E}", - nfkc: "\u{7384}", - nfkd: "\u{7384}", - }, - NormalizationTest { - source: "\u{2F5F}", - nfc: "\u{2F5F}", - nfd: "\u{2F5F}", - nfkc: "\u{7389}", - nfkd: "\u{7389}", - }, - NormalizationTest { - source: "\u{2F60}", - nfc: "\u{2F60}", - nfd: "\u{2F60}", - nfkc: "\u{74DC}", - nfkd: "\u{74DC}", - }, - NormalizationTest { - source: "\u{2F61}", - nfc: "\u{2F61}", - nfd: "\u{2F61}", - nfkc: "\u{74E6}", - nfkd: "\u{74E6}", - }, - NormalizationTest { - source: "\u{2F62}", - nfc: "\u{2F62}", - nfd: "\u{2F62}", - nfkc: "\u{7518}", - nfkd: "\u{7518}", - }, - NormalizationTest { - source: "\u{2F63}", - nfc: "\u{2F63}", - nfd: "\u{2F63}", - nfkc: "\u{751F}", - nfkd: "\u{751F}", - }, - NormalizationTest { - source: "\u{2F64}", - nfc: "\u{2F64}", - nfd: "\u{2F64}", - nfkc: "\u{7528}", - nfkd: "\u{7528}", - }, - NormalizationTest { - source: "\u{2F65}", - nfc: "\u{2F65}", - nfd: "\u{2F65}", - nfkc: "\u{7530}", - nfkd: "\u{7530}", - }, - NormalizationTest { - source: "\u{2F66}", - nfc: "\u{2F66}", - nfd: "\u{2F66}", - nfkc: "\u{758B}", - nfkd: "\u{758B}", - }, - NormalizationTest { - source: "\u{2F67}", - nfc: "\u{2F67}", - nfd: "\u{2F67}", - nfkc: "\u{7592}", - nfkd: "\u{7592}", - }, - NormalizationTest { - source: "\u{2F68}", - nfc: "\u{2F68}", - nfd: "\u{2F68}", - nfkc: "\u{7676}", - nfkd: "\u{7676}", - }, - NormalizationTest { - source: "\u{2F69}", - nfc: "\u{2F69}", - nfd: "\u{2F69}", - nfkc: "\u{767D}", - nfkd: "\u{767D}", - }, - NormalizationTest { - source: "\u{2F6A}", - nfc: "\u{2F6A}", - nfd: "\u{2F6A}", - nfkc: "\u{76AE}", - nfkd: "\u{76AE}", - }, - NormalizationTest { - source: "\u{2F6B}", - nfc: "\u{2F6B}", - nfd: "\u{2F6B}", - nfkc: "\u{76BF}", - nfkd: "\u{76BF}", - }, - NormalizationTest { - source: "\u{2F6C}", - nfc: "\u{2F6C}", - nfd: "\u{2F6C}", - nfkc: "\u{76EE}", - nfkd: "\u{76EE}", - }, - NormalizationTest { - source: "\u{2F6D}", - nfc: "\u{2F6D}", - nfd: "\u{2F6D}", - nfkc: "\u{77DB}", - nfkd: "\u{77DB}", - }, - NormalizationTest { - source: "\u{2F6E}", - nfc: "\u{2F6E}", - nfd: "\u{2F6E}", - nfkc: "\u{77E2}", - nfkd: "\u{77E2}", - }, - NormalizationTest { - source: "\u{2F6F}", - nfc: "\u{2F6F}", - nfd: "\u{2F6F}", - nfkc: "\u{77F3}", - nfkd: "\u{77F3}", - }, - NormalizationTest { - source: "\u{2F70}", - nfc: "\u{2F70}", - nfd: "\u{2F70}", - nfkc: "\u{793A}", - nfkd: "\u{793A}", - }, - NormalizationTest { - source: "\u{2F71}", - nfc: "\u{2F71}", - nfd: "\u{2F71}", - nfkc: "\u{79B8}", - nfkd: "\u{79B8}", - }, - NormalizationTest { - source: "\u{2F72}", - nfc: "\u{2F72}", - nfd: "\u{2F72}", - nfkc: "\u{79BE}", - nfkd: "\u{79BE}", - }, - NormalizationTest { - source: "\u{2F73}", - nfc: "\u{2F73}", - nfd: "\u{2F73}", - nfkc: "\u{7A74}", - nfkd: "\u{7A74}", - }, - NormalizationTest { - source: "\u{2F74}", - nfc: "\u{2F74}", - nfd: "\u{2F74}", - nfkc: "\u{7ACB}", - nfkd: "\u{7ACB}", - }, - NormalizationTest { - source: "\u{2F75}", - nfc: "\u{2F75}", - nfd: "\u{2F75}", - nfkc: "\u{7AF9}", - nfkd: "\u{7AF9}", - }, - NormalizationTest { - source: "\u{2F76}", - nfc: "\u{2F76}", - nfd: "\u{2F76}", - nfkc: "\u{7C73}", - nfkd: "\u{7C73}", - }, - NormalizationTest { - source: "\u{2F77}", - nfc: "\u{2F77}", - nfd: "\u{2F77}", - nfkc: "\u{7CF8}", - nfkd: "\u{7CF8}", - }, - NormalizationTest { - source: "\u{2F78}", - nfc: "\u{2F78}", - nfd: "\u{2F78}", - nfkc: "\u{7F36}", - nfkd: "\u{7F36}", - }, - NormalizationTest { - source: "\u{2F79}", - nfc: "\u{2F79}", - nfd: "\u{2F79}", - nfkc: "\u{7F51}", - nfkd: "\u{7F51}", - }, - NormalizationTest { - source: "\u{2F7A}", - nfc: "\u{2F7A}", - nfd: "\u{2F7A}", - nfkc: "\u{7F8A}", - nfkd: "\u{7F8A}", - }, - NormalizationTest { - source: "\u{2F7B}", - nfc: "\u{2F7B}", - nfd: "\u{2F7B}", - nfkc: "\u{7FBD}", - nfkd: "\u{7FBD}", - }, - NormalizationTest { - source: "\u{2F7C}", - nfc: "\u{2F7C}", - nfd: "\u{2F7C}", - nfkc: "\u{8001}", - nfkd: "\u{8001}", - }, - NormalizationTest { - source: "\u{2F7D}", - nfc: "\u{2F7D}", - nfd: "\u{2F7D}", - nfkc: "\u{800C}", - nfkd: "\u{800C}", - }, - NormalizationTest { - source: "\u{2F7E}", - nfc: "\u{2F7E}", - nfd: "\u{2F7E}", - nfkc: "\u{8012}", - nfkd: "\u{8012}", - }, - NormalizationTest { - source: "\u{2F7F}", - nfc: "\u{2F7F}", - nfd: "\u{2F7F}", - nfkc: "\u{8033}", - nfkd: "\u{8033}", - }, - NormalizationTest { - source: "\u{2F80}", - nfc: "\u{2F80}", - nfd: "\u{2F80}", - nfkc: "\u{807F}", - nfkd: "\u{807F}", - }, - NormalizationTest { - source: "\u{2F81}", - nfc: "\u{2F81}", - nfd: "\u{2F81}", - nfkc: "\u{8089}", - nfkd: "\u{8089}", - }, - NormalizationTest { - source: "\u{2F82}", - nfc: "\u{2F82}", - nfd: "\u{2F82}", - nfkc: "\u{81E3}", - nfkd: "\u{81E3}", - }, - NormalizationTest { - source: "\u{2F83}", - nfc: "\u{2F83}", - nfd: "\u{2F83}", - nfkc: "\u{81EA}", - nfkd: "\u{81EA}", - }, - NormalizationTest { - source: "\u{2F84}", - nfc: "\u{2F84}", - nfd: "\u{2F84}", - nfkc: "\u{81F3}", - nfkd: "\u{81F3}", - }, - NormalizationTest { - source: "\u{2F85}", - nfc: "\u{2F85}", - nfd: "\u{2F85}", - nfkc: "\u{81FC}", - nfkd: "\u{81FC}", - }, - NormalizationTest { - source: "\u{2F86}", - nfc: "\u{2F86}", - nfd: "\u{2F86}", - nfkc: "\u{820C}", - nfkd: "\u{820C}", - }, - NormalizationTest { - source: "\u{2F87}", - nfc: "\u{2F87}", - nfd: "\u{2F87}", - nfkc: "\u{821B}", - nfkd: "\u{821B}", - }, - NormalizationTest { - source: "\u{2F88}", - nfc: "\u{2F88}", - nfd: "\u{2F88}", - nfkc: "\u{821F}", - nfkd: "\u{821F}", - }, - NormalizationTest { - source: "\u{2F89}", - nfc: "\u{2F89}", - nfd: "\u{2F89}", - nfkc: "\u{826E}", - nfkd: "\u{826E}", - }, - NormalizationTest { - source: "\u{2F8A}", - nfc: "\u{2F8A}", - nfd: "\u{2F8A}", - nfkc: "\u{8272}", - nfkd: "\u{8272}", - }, - NormalizationTest { - source: "\u{2F8B}", - nfc: "\u{2F8B}", - nfd: "\u{2F8B}", - nfkc: "\u{8278}", - nfkd: "\u{8278}", - }, - NormalizationTest { - source: "\u{2F8C}", - nfc: "\u{2F8C}", - nfd: "\u{2F8C}", - nfkc: "\u{864D}", - nfkd: "\u{864D}", - }, - NormalizationTest { - source: "\u{2F8D}", - nfc: "\u{2F8D}", - nfd: "\u{2F8D}", - nfkc: "\u{866B}", - nfkd: "\u{866B}", - }, - NormalizationTest { - source: "\u{2F8E}", - nfc: "\u{2F8E}", - nfd: "\u{2F8E}", - nfkc: "\u{8840}", - nfkd: "\u{8840}", - }, - NormalizationTest { - source: "\u{2F8F}", - nfc: "\u{2F8F}", - nfd: "\u{2F8F}", - nfkc: "\u{884C}", - nfkd: "\u{884C}", - }, - NormalizationTest { - source: "\u{2F90}", - nfc: "\u{2F90}", - nfd: "\u{2F90}", - nfkc: "\u{8863}", - nfkd: "\u{8863}", - }, - NormalizationTest { - source: "\u{2F91}", - nfc: "\u{2F91}", - nfd: "\u{2F91}", - nfkc: "\u{897E}", - nfkd: "\u{897E}", - }, - NormalizationTest { - source: "\u{2F92}", - nfc: "\u{2F92}", - nfd: "\u{2F92}", - nfkc: "\u{898B}", - nfkd: "\u{898B}", - }, - NormalizationTest { - source: "\u{2F93}", - nfc: "\u{2F93}", - nfd: "\u{2F93}", - nfkc: "\u{89D2}", - nfkd: "\u{89D2}", - }, - NormalizationTest { - source: "\u{2F94}", - nfc: "\u{2F94}", - nfd: "\u{2F94}", - nfkc: "\u{8A00}", - nfkd: "\u{8A00}", - }, - NormalizationTest { - source: "\u{2F95}", - nfc: "\u{2F95}", - nfd: "\u{2F95}", - nfkc: "\u{8C37}", - nfkd: "\u{8C37}", - }, - NormalizationTest { - source: "\u{2F96}", - nfc: "\u{2F96}", - nfd: "\u{2F96}", - nfkc: "\u{8C46}", - nfkd: "\u{8C46}", - }, - NormalizationTest { - source: "\u{2F97}", - nfc: "\u{2F97}", - nfd: "\u{2F97}", - nfkc: "\u{8C55}", - nfkd: "\u{8C55}", - }, - NormalizationTest { - source: "\u{2F98}", - nfc: "\u{2F98}", - nfd: "\u{2F98}", - nfkc: "\u{8C78}", - nfkd: "\u{8C78}", - }, - NormalizationTest { - source: "\u{2F99}", - nfc: "\u{2F99}", - nfd: "\u{2F99}", - nfkc: "\u{8C9D}", - nfkd: "\u{8C9D}", - }, - NormalizationTest { - source: "\u{2F9A}", - nfc: "\u{2F9A}", - nfd: "\u{2F9A}", - nfkc: "\u{8D64}", - nfkd: "\u{8D64}", - }, - NormalizationTest { - source: "\u{2F9B}", - nfc: "\u{2F9B}", - nfd: "\u{2F9B}", - nfkc: "\u{8D70}", - nfkd: "\u{8D70}", - }, - NormalizationTest { - source: "\u{2F9C}", - nfc: "\u{2F9C}", - nfd: "\u{2F9C}", - nfkc: "\u{8DB3}", - nfkd: "\u{8DB3}", - }, - NormalizationTest { - source: "\u{2F9D}", - nfc: "\u{2F9D}", - nfd: "\u{2F9D}", - nfkc: "\u{8EAB}", - nfkd: "\u{8EAB}", - }, - NormalizationTest { - source: "\u{2F9E}", - nfc: "\u{2F9E}", - nfd: "\u{2F9E}", - nfkc: "\u{8ECA}", - nfkd: "\u{8ECA}", - }, - NormalizationTest { - source: "\u{2F9F}", - nfc: "\u{2F9F}", - nfd: "\u{2F9F}", - nfkc: "\u{8F9B}", - nfkd: "\u{8F9B}", - }, - NormalizationTest { - source: "\u{2FA0}", - nfc: "\u{2FA0}", - nfd: "\u{2FA0}", - nfkc: "\u{8FB0}", - nfkd: "\u{8FB0}", - }, - NormalizationTest { - source: "\u{2FA1}", - nfc: "\u{2FA1}", - nfd: "\u{2FA1}", - nfkc: "\u{8FB5}", - nfkd: "\u{8FB5}", - }, - NormalizationTest { - source: "\u{2FA2}", - nfc: "\u{2FA2}", - nfd: "\u{2FA2}", - nfkc: "\u{9091}", - nfkd: "\u{9091}", - }, - NormalizationTest { - source: "\u{2FA3}", - nfc: "\u{2FA3}", - nfd: "\u{2FA3}", - nfkc: "\u{9149}", - nfkd: "\u{9149}", - }, - NormalizationTest { - source: "\u{2FA4}", - nfc: "\u{2FA4}", - nfd: "\u{2FA4}", - nfkc: "\u{91C6}", - nfkd: "\u{91C6}", - }, - NormalizationTest { - source: "\u{2FA5}", - nfc: "\u{2FA5}", - nfd: "\u{2FA5}", - nfkc: "\u{91CC}", - nfkd: "\u{91CC}", - }, - NormalizationTest { - source: "\u{2FA6}", - nfc: "\u{2FA6}", - nfd: "\u{2FA6}", - nfkc: "\u{91D1}", - nfkd: "\u{91D1}", - }, - NormalizationTest { - source: "\u{2FA7}", - nfc: "\u{2FA7}", - nfd: "\u{2FA7}", - nfkc: "\u{9577}", - nfkd: "\u{9577}", - }, - NormalizationTest { - source: "\u{2FA8}", - nfc: "\u{2FA8}", - nfd: "\u{2FA8}", - nfkc: "\u{9580}", - nfkd: "\u{9580}", - }, - NormalizationTest { - source: "\u{2FA9}", - nfc: "\u{2FA9}", - nfd: "\u{2FA9}", - nfkc: "\u{961C}", - nfkd: "\u{961C}", - }, - NormalizationTest { - source: "\u{2FAA}", - nfc: "\u{2FAA}", - nfd: "\u{2FAA}", - nfkc: "\u{96B6}", - nfkd: "\u{96B6}", - }, - NormalizationTest { - source: "\u{2FAB}", - nfc: "\u{2FAB}", - nfd: "\u{2FAB}", - nfkc: "\u{96B9}", - nfkd: "\u{96B9}", - }, - NormalizationTest { - source: "\u{2FAC}", - nfc: "\u{2FAC}", - nfd: "\u{2FAC}", - nfkc: "\u{96E8}", - nfkd: "\u{96E8}", - }, - NormalizationTest { - source: "\u{2FAD}", - nfc: "\u{2FAD}", - nfd: "\u{2FAD}", - nfkc: "\u{9751}", - nfkd: "\u{9751}", - }, - NormalizationTest { - source: "\u{2FAE}", - nfc: "\u{2FAE}", - nfd: "\u{2FAE}", - nfkc: "\u{975E}", - nfkd: "\u{975E}", - }, - NormalizationTest { - source: "\u{2FAF}", - nfc: "\u{2FAF}", - nfd: "\u{2FAF}", - nfkc: "\u{9762}", - nfkd: "\u{9762}", - }, - NormalizationTest { - source: "\u{2FB0}", - nfc: "\u{2FB0}", - nfd: "\u{2FB0}", - nfkc: "\u{9769}", - nfkd: "\u{9769}", - }, - NormalizationTest { - source: "\u{2FB1}", - nfc: "\u{2FB1}", - nfd: "\u{2FB1}", - nfkc: "\u{97CB}", - nfkd: "\u{97CB}", - }, - NormalizationTest { - source: "\u{2FB2}", - nfc: "\u{2FB2}", - nfd: "\u{2FB2}", - nfkc: "\u{97ED}", - nfkd: "\u{97ED}", - }, - NormalizationTest { - source: "\u{2FB3}", - nfc: "\u{2FB3}", - nfd: "\u{2FB3}", - nfkc: "\u{97F3}", - nfkd: "\u{97F3}", - }, - NormalizationTest { - source: "\u{2FB4}", - nfc: "\u{2FB4}", - nfd: "\u{2FB4}", - nfkc: "\u{9801}", - nfkd: "\u{9801}", - }, - NormalizationTest { - source: "\u{2FB5}", - nfc: "\u{2FB5}", - nfd: "\u{2FB5}", - nfkc: "\u{98A8}", - nfkd: "\u{98A8}", - }, - NormalizationTest { - source: "\u{2FB6}", - nfc: "\u{2FB6}", - nfd: "\u{2FB6}", - nfkc: "\u{98DB}", - nfkd: "\u{98DB}", - }, - NormalizationTest { - source: "\u{2FB7}", - nfc: "\u{2FB7}", - nfd: "\u{2FB7}", - nfkc: "\u{98DF}", - nfkd: "\u{98DF}", - }, - NormalizationTest { - source: "\u{2FB8}", - nfc: "\u{2FB8}", - nfd: "\u{2FB8}", - nfkc: "\u{9996}", - nfkd: "\u{9996}", - }, - NormalizationTest { - source: "\u{2FB9}", - nfc: "\u{2FB9}", - nfd: "\u{2FB9}", - nfkc: "\u{9999}", - nfkd: "\u{9999}", - }, - NormalizationTest { - source: "\u{2FBA}", - nfc: "\u{2FBA}", - nfd: "\u{2FBA}", - nfkc: "\u{99AC}", - nfkd: "\u{99AC}", - }, - NormalizationTest { - source: "\u{2FBB}", - nfc: "\u{2FBB}", - nfd: "\u{2FBB}", - nfkc: "\u{9AA8}", - nfkd: "\u{9AA8}", - }, - NormalizationTest { - source: "\u{2FBC}", - nfc: "\u{2FBC}", - nfd: "\u{2FBC}", - nfkc: "\u{9AD8}", - nfkd: "\u{9AD8}", - }, - NormalizationTest { - source: "\u{2FBD}", - nfc: "\u{2FBD}", - nfd: "\u{2FBD}", - nfkc: "\u{9ADF}", - nfkd: "\u{9ADF}", - }, - NormalizationTest { - source: "\u{2FBE}", - nfc: "\u{2FBE}", - nfd: "\u{2FBE}", - nfkc: "\u{9B25}", - nfkd: "\u{9B25}", - }, - NormalizationTest { - source: "\u{2FBF}", - nfc: "\u{2FBF}", - nfd: "\u{2FBF}", - nfkc: "\u{9B2F}", - nfkd: "\u{9B2F}", - }, - NormalizationTest { - source: "\u{2FC0}", - nfc: "\u{2FC0}", - nfd: "\u{2FC0}", - nfkc: "\u{9B32}", - nfkd: "\u{9B32}", - }, - NormalizationTest { - source: "\u{2FC1}", - nfc: "\u{2FC1}", - nfd: "\u{2FC1}", - nfkc: "\u{9B3C}", - nfkd: "\u{9B3C}", - }, - NormalizationTest { - source: "\u{2FC2}", - nfc: "\u{2FC2}", - nfd: "\u{2FC2}", - nfkc: "\u{9B5A}", - nfkd: "\u{9B5A}", - }, - NormalizationTest { - source: "\u{2FC3}", - nfc: "\u{2FC3}", - nfd: "\u{2FC3}", - nfkc: "\u{9CE5}", - nfkd: "\u{9CE5}", - }, - NormalizationTest { - source: "\u{2FC4}", - nfc: "\u{2FC4}", - nfd: "\u{2FC4}", - nfkc: "\u{9E75}", - nfkd: "\u{9E75}", - }, - NormalizationTest { - source: "\u{2FC5}", - nfc: "\u{2FC5}", - nfd: "\u{2FC5}", - nfkc: "\u{9E7F}", - nfkd: "\u{9E7F}", - }, - NormalizationTest { - source: "\u{2FC6}", - nfc: "\u{2FC6}", - nfd: "\u{2FC6}", - nfkc: "\u{9EA5}", - nfkd: "\u{9EA5}", - }, - NormalizationTest { - source: "\u{2FC7}", - nfc: "\u{2FC7}", - nfd: "\u{2FC7}", - nfkc: "\u{9EBB}", - nfkd: "\u{9EBB}", - }, - NormalizationTest { - source: "\u{2FC8}", - nfc: "\u{2FC8}", - nfd: "\u{2FC8}", - nfkc: "\u{9EC3}", - nfkd: "\u{9EC3}", - }, - NormalizationTest { - source: "\u{2FC9}", - nfc: "\u{2FC9}", - nfd: "\u{2FC9}", - nfkc: "\u{9ECD}", - nfkd: "\u{9ECD}", - }, - NormalizationTest { - source: "\u{2FCA}", - nfc: "\u{2FCA}", - nfd: "\u{2FCA}", - nfkc: "\u{9ED1}", - nfkd: "\u{9ED1}", - }, - NormalizationTest { - source: "\u{2FCB}", - nfc: "\u{2FCB}", - nfd: "\u{2FCB}", - nfkc: "\u{9EF9}", - nfkd: "\u{9EF9}", - }, - NormalizationTest { - source: "\u{2FCC}", - nfc: "\u{2FCC}", - nfd: "\u{2FCC}", - nfkc: "\u{9EFD}", - nfkd: "\u{9EFD}", - }, - NormalizationTest { - source: "\u{2FCD}", - nfc: "\u{2FCD}", - nfd: "\u{2FCD}", - nfkc: "\u{9F0E}", - nfkd: "\u{9F0E}", - }, - NormalizationTest { - source: "\u{2FCE}", - nfc: "\u{2FCE}", - nfd: "\u{2FCE}", - nfkc: "\u{9F13}", - nfkd: "\u{9F13}", - }, - NormalizationTest { - source: "\u{2FCF}", - nfc: "\u{2FCF}", - nfd: "\u{2FCF}", - nfkc: "\u{9F20}", - nfkd: "\u{9F20}", - }, - NormalizationTest { - source: "\u{2FD0}", - nfc: "\u{2FD0}", - nfd: "\u{2FD0}", - nfkc: "\u{9F3B}", - nfkd: "\u{9F3B}", - }, - NormalizationTest { - source: "\u{2FD1}", - nfc: "\u{2FD1}", - nfd: "\u{2FD1}", - nfkc: "\u{9F4A}", - nfkd: "\u{9F4A}", - }, - NormalizationTest { - source: "\u{2FD2}", - nfc: "\u{2FD2}", - nfd: "\u{2FD2}", - nfkc: "\u{9F52}", - nfkd: "\u{9F52}", - }, - NormalizationTest { - source: "\u{2FD3}", - nfc: "\u{2FD3}", - nfd: "\u{2FD3}", - nfkc: "\u{9F8D}", - nfkd: "\u{9F8D}", - }, - NormalizationTest { - source: "\u{2FD4}", - nfc: "\u{2FD4}", - nfd: "\u{2FD4}", - nfkc: "\u{9F9C}", - nfkd: "\u{9F9C}", - }, - NormalizationTest { - source: "\u{2FD5}", - nfc: "\u{2FD5}", - nfd: "\u{2FD5}", - nfkc: "\u{9FA0}", - nfkd: "\u{9FA0}", - }, - NormalizationTest { - source: "\u{3000}", - nfc: "\u{3000}", - nfd: "\u{3000}", - nfkc: "\u{0020}", - nfkd: "\u{0020}", - }, - NormalizationTest { - source: "\u{3036}", - nfc: "\u{3036}", - nfd: "\u{3036}", - nfkc: "\u{3012}", - nfkd: "\u{3012}", - }, - NormalizationTest { - source: "\u{3038}", - nfc: "\u{3038}", - nfd: "\u{3038}", - nfkc: "\u{5341}", - nfkd: "\u{5341}", - }, - NormalizationTest { - source: "\u{3039}", - nfc: "\u{3039}", - nfd: "\u{3039}", - nfkc: "\u{5344}", - nfkd: "\u{5344}", - }, - NormalizationTest { - source: "\u{303A}", - nfc: "\u{303A}", - nfd: "\u{303A}", - nfkc: "\u{5345}", - nfkd: "\u{5345}", - }, - NormalizationTest { - source: "\u{304C}", - nfc: "\u{304C}", - nfd: "\u{304B}\u{3099}", - nfkc: "\u{304C}", - nfkd: "\u{304B}\u{3099}", - }, - NormalizationTest { - source: "\u{304E}", - nfc: "\u{304E}", - nfd: "\u{304D}\u{3099}", - nfkc: "\u{304E}", - nfkd: "\u{304D}\u{3099}", - }, - NormalizationTest { - source: "\u{3050}", - nfc: "\u{3050}", - nfd: "\u{304F}\u{3099}", - nfkc: "\u{3050}", - nfkd: "\u{304F}\u{3099}", - }, - NormalizationTest { - source: "\u{3052}", - nfc: "\u{3052}", - nfd: "\u{3051}\u{3099}", - nfkc: "\u{3052}", - nfkd: "\u{3051}\u{3099}", - }, - NormalizationTest { - source: "\u{3054}", - nfc: "\u{3054}", - nfd: "\u{3053}\u{3099}", - nfkc: "\u{3054}", - nfkd: "\u{3053}\u{3099}", - }, - NormalizationTest { - source: "\u{3056}", - nfc: "\u{3056}", - nfd: "\u{3055}\u{3099}", - nfkc: "\u{3056}", - nfkd: "\u{3055}\u{3099}", - }, - NormalizationTest { - source: "\u{3058}", - nfc: "\u{3058}", - nfd: "\u{3057}\u{3099}", - nfkc: "\u{3058}", - nfkd: "\u{3057}\u{3099}", - }, - NormalizationTest { - source: "\u{305A}", - nfc: "\u{305A}", - nfd: "\u{3059}\u{3099}", - nfkc: "\u{305A}", - nfkd: "\u{3059}\u{3099}", - }, - NormalizationTest { - source: "\u{305C}", - nfc: "\u{305C}", - nfd: "\u{305B}\u{3099}", - nfkc: "\u{305C}", - nfkd: "\u{305B}\u{3099}", - }, - NormalizationTest { - source: "\u{305E}", - nfc: "\u{305E}", - nfd: "\u{305D}\u{3099}", - nfkc: "\u{305E}", - nfkd: "\u{305D}\u{3099}", - }, - NormalizationTest { - source: "\u{3060}", - nfc: "\u{3060}", - nfd: "\u{305F}\u{3099}", - nfkc: "\u{3060}", - nfkd: "\u{305F}\u{3099}", - }, - NormalizationTest { - source: "\u{3062}", - nfc: "\u{3062}", - nfd: "\u{3061}\u{3099}", - nfkc: "\u{3062}", - nfkd: "\u{3061}\u{3099}", - }, - NormalizationTest { - source: "\u{3065}", - nfc: "\u{3065}", - nfd: "\u{3064}\u{3099}", - nfkc: "\u{3065}", - nfkd: "\u{3064}\u{3099}", - }, - NormalizationTest { - source: "\u{3067}", - nfc: "\u{3067}", - nfd: "\u{3066}\u{3099}", - nfkc: "\u{3067}", - nfkd: "\u{3066}\u{3099}", - }, - NormalizationTest { - source: "\u{3069}", - nfc: "\u{3069}", - nfd: "\u{3068}\u{3099}", - nfkc: "\u{3069}", - nfkd: "\u{3068}\u{3099}", - }, - NormalizationTest { - source: "\u{3070}", - nfc: "\u{3070}", - nfd: "\u{306F}\u{3099}", - nfkc: "\u{3070}", - nfkd: "\u{306F}\u{3099}", - }, - NormalizationTest { - source: "\u{3071}", - nfc: "\u{3071}", - nfd: "\u{306F}\u{309A}", - nfkc: "\u{3071}", - nfkd: "\u{306F}\u{309A}", - }, - NormalizationTest { - source: "\u{3073}", - nfc: "\u{3073}", - nfd: "\u{3072}\u{3099}", - nfkc: "\u{3073}", - nfkd: "\u{3072}\u{3099}", - }, - NormalizationTest { - source: "\u{3074}", - nfc: "\u{3074}", - nfd: "\u{3072}\u{309A}", - nfkc: "\u{3074}", - nfkd: "\u{3072}\u{309A}", - }, - NormalizationTest { - source: "\u{3076}", - nfc: "\u{3076}", - nfd: "\u{3075}\u{3099}", - nfkc: "\u{3076}", - nfkd: "\u{3075}\u{3099}", - }, - NormalizationTest { - source: "\u{3077}", - nfc: "\u{3077}", - nfd: "\u{3075}\u{309A}", - nfkc: "\u{3077}", - nfkd: "\u{3075}\u{309A}", - }, - NormalizationTest { - source: "\u{3079}", - nfc: "\u{3079}", - nfd: "\u{3078}\u{3099}", - nfkc: "\u{3079}", - nfkd: "\u{3078}\u{3099}", - }, - NormalizationTest { - source: "\u{307A}", - nfc: "\u{307A}", - nfd: "\u{3078}\u{309A}", - nfkc: "\u{307A}", - nfkd: "\u{3078}\u{309A}", - }, - NormalizationTest { - source: "\u{307C}", - nfc: "\u{307C}", - nfd: "\u{307B}\u{3099}", - nfkc: "\u{307C}", - nfkd: "\u{307B}\u{3099}", - }, - NormalizationTest { - source: "\u{307D}", - nfc: "\u{307D}", - nfd: "\u{307B}\u{309A}", - nfkc: "\u{307D}", - nfkd: "\u{307B}\u{309A}", - }, - NormalizationTest { - source: "\u{3094}", - nfc: "\u{3094}", - nfd: "\u{3046}\u{3099}", - nfkc: "\u{3094}", - nfkd: "\u{3046}\u{3099}", - }, - NormalizationTest { - source: "\u{309B}", - nfc: "\u{309B}", - nfd: "\u{309B}", - nfkc: "\u{0020}\u{3099}", - nfkd: "\u{0020}\u{3099}", - }, - NormalizationTest { - source: "\u{309C}", - nfc: "\u{309C}", - nfd: "\u{309C}", - nfkc: "\u{0020}\u{309A}", - nfkd: "\u{0020}\u{309A}", - }, - NormalizationTest { - source: "\u{309E}", - nfc: "\u{309E}", - nfd: "\u{309D}\u{3099}", - nfkc: "\u{309E}", - nfkd: "\u{309D}\u{3099}", - }, - NormalizationTest { - source: "\u{309F}", - nfc: "\u{309F}", - nfd: "\u{309F}", - nfkc: "\u{3088}\u{308A}", - nfkd: "\u{3088}\u{308A}", - }, - NormalizationTest { - source: "\u{30AC}", - nfc: "\u{30AC}", - nfd: "\u{30AB}\u{3099}", - nfkc: "\u{30AC}", - nfkd: "\u{30AB}\u{3099}", - }, - NormalizationTest { - source: "\u{30AE}", - nfc: "\u{30AE}", - nfd: "\u{30AD}\u{3099}", - nfkc: "\u{30AE}", - nfkd: "\u{30AD}\u{3099}", - }, - NormalizationTest { - source: "\u{30B0}", - nfc: "\u{30B0}", - nfd: "\u{30AF}\u{3099}", - nfkc: "\u{30B0}", - nfkd: "\u{30AF}\u{3099}", - }, - NormalizationTest { - source: "\u{30B2}", - nfc: "\u{30B2}", - nfd: "\u{30B1}\u{3099}", - nfkc: "\u{30B2}", - nfkd: "\u{30B1}\u{3099}", - }, - NormalizationTest { - source: "\u{30B4}", - nfc: "\u{30B4}", - nfd: "\u{30B3}\u{3099}", - nfkc: "\u{30B4}", - nfkd: "\u{30B3}\u{3099}", - }, - NormalizationTest { - source: "\u{30B6}", - nfc: "\u{30B6}", - nfd: "\u{30B5}\u{3099}", - nfkc: "\u{30B6}", - nfkd: "\u{30B5}\u{3099}", - }, - NormalizationTest { - source: "\u{30B8}", - nfc: "\u{30B8}", - nfd: "\u{30B7}\u{3099}", - nfkc: "\u{30B8}", - nfkd: "\u{30B7}\u{3099}", - }, - NormalizationTest { - source: "\u{30BA}", - nfc: "\u{30BA}", - nfd: "\u{30B9}\u{3099}", - nfkc: "\u{30BA}", - nfkd: "\u{30B9}\u{3099}", - }, - NormalizationTest { - source: "\u{30BC}", - nfc: "\u{30BC}", - nfd: "\u{30BB}\u{3099}", - nfkc: "\u{30BC}", - nfkd: "\u{30BB}\u{3099}", - }, - NormalizationTest { - source: "\u{30BE}", - nfc: "\u{30BE}", - nfd: "\u{30BD}\u{3099}", - nfkc: "\u{30BE}", - nfkd: "\u{30BD}\u{3099}", - }, - NormalizationTest { - source: "\u{30C0}", - nfc: "\u{30C0}", - nfd: "\u{30BF}\u{3099}", - nfkc: "\u{30C0}", - nfkd: "\u{30BF}\u{3099}", - }, - NormalizationTest { - source: "\u{30C2}", - nfc: "\u{30C2}", - nfd: "\u{30C1}\u{3099}", - nfkc: "\u{30C2}", - nfkd: "\u{30C1}\u{3099}", - }, - NormalizationTest { - source: "\u{30C5}", - nfc: "\u{30C5}", - nfd: "\u{30C4}\u{3099}", - nfkc: "\u{30C5}", - nfkd: "\u{30C4}\u{3099}", - }, - NormalizationTest { - source: "\u{30C7}", - nfc: "\u{30C7}", - nfd: "\u{30C6}\u{3099}", - nfkc: "\u{30C7}", - nfkd: "\u{30C6}\u{3099}", - }, - NormalizationTest { - source: "\u{30C9}", - nfc: "\u{30C9}", - nfd: "\u{30C8}\u{3099}", - nfkc: "\u{30C9}", - nfkd: "\u{30C8}\u{3099}", - }, - NormalizationTest { - source: "\u{30D0}", - nfc: "\u{30D0}", - nfd: "\u{30CF}\u{3099}", - nfkc: "\u{30D0}", - nfkd: "\u{30CF}\u{3099}", - }, - NormalizationTest { - source: "\u{30D1}", - nfc: "\u{30D1}", - nfd: "\u{30CF}\u{309A}", - nfkc: "\u{30D1}", - nfkd: "\u{30CF}\u{309A}", - }, - NormalizationTest { - source: "\u{30D3}", - nfc: "\u{30D3}", - nfd: "\u{30D2}\u{3099}", - nfkc: "\u{30D3}", - nfkd: "\u{30D2}\u{3099}", - }, - NormalizationTest { - source: "\u{30D4}", - nfc: "\u{30D4}", - nfd: "\u{30D2}\u{309A}", - nfkc: "\u{30D4}", - nfkd: "\u{30D2}\u{309A}", - }, - NormalizationTest { - source: "\u{30D6}", - nfc: "\u{30D6}", - nfd: "\u{30D5}\u{3099}", - nfkc: "\u{30D6}", - nfkd: "\u{30D5}\u{3099}", - }, - NormalizationTest { - source: "\u{30D7}", - nfc: "\u{30D7}", - nfd: "\u{30D5}\u{309A}", - nfkc: "\u{30D7}", - nfkd: "\u{30D5}\u{309A}", - }, - NormalizationTest { - source: "\u{30D9}", - nfc: "\u{30D9}", - nfd: "\u{30D8}\u{3099}", - nfkc: "\u{30D9}", - nfkd: "\u{30D8}\u{3099}", - }, - NormalizationTest { - source: "\u{30DA}", - nfc: "\u{30DA}", - nfd: "\u{30D8}\u{309A}", - nfkc: "\u{30DA}", - nfkd: "\u{30D8}\u{309A}", - }, - NormalizationTest { - source: "\u{30DC}", - nfc: "\u{30DC}", - nfd: "\u{30DB}\u{3099}", - nfkc: "\u{30DC}", - nfkd: "\u{30DB}\u{3099}", - }, - NormalizationTest { - source: "\u{30DD}", - nfc: "\u{30DD}", - nfd: "\u{30DB}\u{309A}", - nfkc: "\u{30DD}", - nfkd: "\u{30DB}\u{309A}", - }, - NormalizationTest { - source: "\u{30F4}", - nfc: "\u{30F4}", - nfd: "\u{30A6}\u{3099}", - nfkc: "\u{30F4}", - nfkd: "\u{30A6}\u{3099}", - }, - NormalizationTest { - source: "\u{30F7}", - nfc: "\u{30F7}", - nfd: "\u{30EF}\u{3099}", - nfkc: "\u{30F7}", - nfkd: "\u{30EF}\u{3099}", - }, - NormalizationTest { - source: "\u{30F8}", - nfc: "\u{30F8}", - nfd: "\u{30F0}\u{3099}", - nfkc: "\u{30F8}", - nfkd: "\u{30F0}\u{3099}", - }, - NormalizationTest { - source: "\u{30F9}", - nfc: "\u{30F9}", - nfd: "\u{30F1}\u{3099}", - nfkc: "\u{30F9}", - nfkd: "\u{30F1}\u{3099}", - }, - NormalizationTest { - source: "\u{30FA}", - nfc: "\u{30FA}", - nfd: "\u{30F2}\u{3099}", - nfkc: "\u{30FA}", - nfkd: "\u{30F2}\u{3099}", - }, - NormalizationTest { - source: "\u{30FE}", - nfc: "\u{30FE}", - nfd: "\u{30FD}\u{3099}", - nfkc: "\u{30FE}", - nfkd: "\u{30FD}\u{3099}", - }, - NormalizationTest { - source: "\u{30FF}", - nfc: "\u{30FF}", - nfd: "\u{30FF}", - nfkc: "\u{30B3}\u{30C8}", - nfkd: "\u{30B3}\u{30C8}", - }, - NormalizationTest { - source: "\u{3131}", - nfc: "\u{3131}", - nfd: "\u{3131}", - nfkc: "\u{1100}", - nfkd: "\u{1100}", - }, - NormalizationTest { - source: "\u{3132}", - nfc: "\u{3132}", - nfd: "\u{3132}", - nfkc: "\u{1101}", - nfkd: "\u{1101}", - }, - NormalizationTest { - source: "\u{3133}", - nfc: "\u{3133}", - nfd: "\u{3133}", - nfkc: "\u{11AA}", - nfkd: "\u{11AA}", - }, - NormalizationTest { - source: "\u{3134}", - nfc: "\u{3134}", - nfd: "\u{3134}", - nfkc: "\u{1102}", - nfkd: "\u{1102}", - }, - NormalizationTest { - source: "\u{3135}", - nfc: "\u{3135}", - nfd: "\u{3135}", - nfkc: "\u{11AC}", - nfkd: "\u{11AC}", - }, - NormalizationTest { - source: "\u{3136}", - nfc: "\u{3136}", - nfd: "\u{3136}", - nfkc: "\u{11AD}", - nfkd: "\u{11AD}", - }, - NormalizationTest { - source: "\u{3137}", - nfc: "\u{3137}", - nfd: "\u{3137}", - nfkc: "\u{1103}", - nfkd: "\u{1103}", - }, - NormalizationTest { - source: "\u{3138}", - nfc: "\u{3138}", - nfd: "\u{3138}", - nfkc: "\u{1104}", - nfkd: "\u{1104}", - }, - NormalizationTest { - source: "\u{3139}", - nfc: "\u{3139}", - nfd: "\u{3139}", - nfkc: "\u{1105}", - nfkd: "\u{1105}", - }, - NormalizationTest { - source: "\u{313A}", - nfc: "\u{313A}", - nfd: "\u{313A}", - nfkc: "\u{11B0}", - nfkd: "\u{11B0}", - }, - NormalizationTest { - source: "\u{313B}", - nfc: "\u{313B}", - nfd: "\u{313B}", - nfkc: "\u{11B1}", - nfkd: "\u{11B1}", - }, - NormalizationTest { - source: "\u{313C}", - nfc: "\u{313C}", - nfd: "\u{313C}", - nfkc: "\u{11B2}", - nfkd: "\u{11B2}", - }, - NormalizationTest { - source: "\u{313D}", - nfc: "\u{313D}", - nfd: "\u{313D}", - nfkc: "\u{11B3}", - nfkd: "\u{11B3}", - }, - NormalizationTest { - source: "\u{313E}", - nfc: "\u{313E}", - nfd: "\u{313E}", - nfkc: "\u{11B4}", - nfkd: "\u{11B4}", - }, - NormalizationTest { - source: "\u{313F}", - nfc: "\u{313F}", - nfd: "\u{313F}", - nfkc: "\u{11B5}", - nfkd: "\u{11B5}", - }, - NormalizationTest { - source: "\u{3140}", - nfc: "\u{3140}", - nfd: "\u{3140}", - nfkc: "\u{111A}", - nfkd: "\u{111A}", - }, - NormalizationTest { - source: "\u{3141}", - nfc: "\u{3141}", - nfd: "\u{3141}", - nfkc: "\u{1106}", - nfkd: "\u{1106}", - }, - NormalizationTest { - source: "\u{3142}", - nfc: "\u{3142}", - nfd: "\u{3142}", - nfkc: "\u{1107}", - nfkd: "\u{1107}", - }, - NormalizationTest { - source: "\u{3143}", - nfc: "\u{3143}", - nfd: "\u{3143}", - nfkc: "\u{1108}", - nfkd: "\u{1108}", - }, - NormalizationTest { - source: "\u{3144}", - nfc: "\u{3144}", - nfd: "\u{3144}", - nfkc: "\u{1121}", - nfkd: "\u{1121}", - }, - NormalizationTest { - source: "\u{3145}", - nfc: "\u{3145}", - nfd: "\u{3145}", - nfkc: "\u{1109}", - nfkd: "\u{1109}", - }, - NormalizationTest { - source: "\u{3146}", - nfc: "\u{3146}", - nfd: "\u{3146}", - nfkc: "\u{110A}", - nfkd: "\u{110A}", - }, - NormalizationTest { - source: "\u{3147}", - nfc: "\u{3147}", - nfd: "\u{3147}", - nfkc: "\u{110B}", - nfkd: "\u{110B}", - }, - NormalizationTest { - source: "\u{3148}", - nfc: "\u{3148}", - nfd: "\u{3148}", - nfkc: "\u{110C}", - nfkd: "\u{110C}", - }, - NormalizationTest { - source: "\u{3149}", - nfc: "\u{3149}", - nfd: "\u{3149}", - nfkc: "\u{110D}", - nfkd: "\u{110D}", - }, - NormalizationTest { - source: "\u{314A}", - nfc: "\u{314A}", - nfd: "\u{314A}", - nfkc: "\u{110E}", - nfkd: "\u{110E}", - }, - NormalizationTest { - source: "\u{314B}", - nfc: "\u{314B}", - nfd: "\u{314B}", - nfkc: "\u{110F}", - nfkd: "\u{110F}", - }, - NormalizationTest { - source: "\u{314C}", - nfc: "\u{314C}", - nfd: "\u{314C}", - nfkc: "\u{1110}", - nfkd: "\u{1110}", - }, - NormalizationTest { - source: "\u{314D}", - nfc: "\u{314D}", - nfd: "\u{314D}", - nfkc: "\u{1111}", - nfkd: "\u{1111}", - }, - NormalizationTest { - source: "\u{314E}", - nfc: "\u{314E}", - nfd: "\u{314E}", - nfkc: "\u{1112}", - nfkd: "\u{1112}", - }, - NormalizationTest { - source: "\u{314F}", - nfc: "\u{314F}", - nfd: "\u{314F}", - nfkc: "\u{1161}", - nfkd: "\u{1161}", - }, - NormalizationTest { - source: "\u{3150}", - nfc: "\u{3150}", - nfd: "\u{3150}", - nfkc: "\u{1162}", - nfkd: "\u{1162}", - }, - NormalizationTest { - source: "\u{3151}", - nfc: "\u{3151}", - nfd: "\u{3151}", - nfkc: "\u{1163}", - nfkd: "\u{1163}", - }, - NormalizationTest { - source: "\u{3152}", - nfc: "\u{3152}", - nfd: "\u{3152}", - nfkc: "\u{1164}", - nfkd: "\u{1164}", - }, - NormalizationTest { - source: "\u{3153}", - nfc: "\u{3153}", - nfd: "\u{3153}", - nfkc: "\u{1165}", - nfkd: "\u{1165}", - }, - NormalizationTest { - source: "\u{3154}", - nfc: "\u{3154}", - nfd: "\u{3154}", - nfkc: "\u{1166}", - nfkd: "\u{1166}", - }, - NormalizationTest { - source: "\u{3155}", - nfc: "\u{3155}", - nfd: "\u{3155}", - nfkc: "\u{1167}", - nfkd: "\u{1167}", - }, - NormalizationTest { - source: "\u{3156}", - nfc: "\u{3156}", - nfd: "\u{3156}", - nfkc: "\u{1168}", - nfkd: "\u{1168}", - }, - NormalizationTest { - source: "\u{3157}", - nfc: "\u{3157}", - nfd: "\u{3157}", - nfkc: "\u{1169}", - nfkd: "\u{1169}", - }, - NormalizationTest { - source: "\u{3158}", - nfc: "\u{3158}", - nfd: "\u{3158}", - nfkc: "\u{116A}", - nfkd: "\u{116A}", - }, - NormalizationTest { - source: "\u{3159}", - nfc: "\u{3159}", - nfd: "\u{3159}", - nfkc: "\u{116B}", - nfkd: "\u{116B}", - }, - NormalizationTest { - source: "\u{315A}", - nfc: "\u{315A}", - nfd: "\u{315A}", - nfkc: "\u{116C}", - nfkd: "\u{116C}", - }, - NormalizationTest { - source: "\u{315B}", - nfc: "\u{315B}", - nfd: "\u{315B}", - nfkc: "\u{116D}", - nfkd: "\u{116D}", - }, - NormalizationTest { - source: "\u{315C}", - nfc: "\u{315C}", - nfd: "\u{315C}", - nfkc: "\u{116E}", - nfkd: "\u{116E}", - }, - NormalizationTest { - source: "\u{315D}", - nfc: "\u{315D}", - nfd: "\u{315D}", - nfkc: "\u{116F}", - nfkd: "\u{116F}", - }, - NormalizationTest { - source: "\u{315E}", - nfc: "\u{315E}", - nfd: "\u{315E}", - nfkc: "\u{1170}", - nfkd: "\u{1170}", - }, - NormalizationTest { - source: "\u{315F}", - nfc: "\u{315F}", - nfd: "\u{315F}", - nfkc: "\u{1171}", - nfkd: "\u{1171}", - }, - NormalizationTest { - source: "\u{3160}", - nfc: "\u{3160}", - nfd: "\u{3160}", - nfkc: "\u{1172}", - nfkd: "\u{1172}", - }, - NormalizationTest { - source: "\u{3161}", - nfc: "\u{3161}", - nfd: "\u{3161}", - nfkc: "\u{1173}", - nfkd: "\u{1173}", - }, - NormalizationTest { - source: "\u{3162}", - nfc: "\u{3162}", - nfd: "\u{3162}", - nfkc: "\u{1174}", - nfkd: "\u{1174}", - }, - NormalizationTest { - source: "\u{3163}", - nfc: "\u{3163}", - nfd: "\u{3163}", - nfkc: "\u{1175}", - nfkd: "\u{1175}", - }, - NormalizationTest { - source: "\u{3164}", - nfc: "\u{3164}", - nfd: "\u{3164}", - nfkc: "\u{1160}", - nfkd: "\u{1160}", - }, - NormalizationTest { - source: "\u{3165}", - nfc: "\u{3165}", - nfd: "\u{3165}", - nfkc: "\u{1114}", - nfkd: "\u{1114}", - }, - NormalizationTest { - source: "\u{3166}", - nfc: "\u{3166}", - nfd: "\u{3166}", - nfkc: "\u{1115}", - nfkd: "\u{1115}", - }, - NormalizationTest { - source: "\u{3167}", - nfc: "\u{3167}", - nfd: "\u{3167}", - nfkc: "\u{11C7}", - nfkd: "\u{11C7}", - }, - NormalizationTest { - source: "\u{3168}", - nfc: "\u{3168}", - nfd: "\u{3168}", - nfkc: "\u{11C8}", - nfkd: "\u{11C8}", - }, - NormalizationTest { - source: "\u{3169}", - nfc: "\u{3169}", - nfd: "\u{3169}", - nfkc: "\u{11CC}", - nfkd: "\u{11CC}", - }, - NormalizationTest { - source: "\u{316A}", - nfc: "\u{316A}", - nfd: "\u{316A}", - nfkc: "\u{11CE}", - nfkd: "\u{11CE}", - }, - NormalizationTest { - source: "\u{316B}", - nfc: "\u{316B}", - nfd: "\u{316B}", - nfkc: "\u{11D3}", - nfkd: "\u{11D3}", - }, - NormalizationTest { - source: "\u{316C}", - nfc: "\u{316C}", - nfd: "\u{316C}", - nfkc: "\u{11D7}", - nfkd: "\u{11D7}", - }, - NormalizationTest { - source: "\u{316D}", - nfc: "\u{316D}", - nfd: "\u{316D}", - nfkc: "\u{11D9}", - nfkd: "\u{11D9}", - }, - NormalizationTest { - source: "\u{316E}", - nfc: "\u{316E}", - nfd: "\u{316E}", - nfkc: "\u{111C}", - nfkd: "\u{111C}", - }, - NormalizationTest { - source: "\u{316F}", - nfc: "\u{316F}", - nfd: "\u{316F}", - nfkc: "\u{11DD}", - nfkd: "\u{11DD}", - }, - NormalizationTest { - source: "\u{3170}", - nfc: "\u{3170}", - nfd: "\u{3170}", - nfkc: "\u{11DF}", - nfkd: "\u{11DF}", - }, - NormalizationTest { - source: "\u{3171}", - nfc: "\u{3171}", - nfd: "\u{3171}", - nfkc: "\u{111D}", - nfkd: "\u{111D}", - }, - NormalizationTest { - source: "\u{3172}", - nfc: "\u{3172}", - nfd: "\u{3172}", - nfkc: "\u{111E}", - nfkd: "\u{111E}", - }, - NormalizationTest { - source: "\u{3173}", - nfc: "\u{3173}", - nfd: "\u{3173}", - nfkc: "\u{1120}", - nfkd: "\u{1120}", - }, - NormalizationTest { - source: "\u{3174}", - nfc: "\u{3174}", - nfd: "\u{3174}", - nfkc: "\u{1122}", - nfkd: "\u{1122}", - }, - NormalizationTest { - source: "\u{3175}", - nfc: "\u{3175}", - nfd: "\u{3175}", - nfkc: "\u{1123}", - nfkd: "\u{1123}", - }, - NormalizationTest { - source: "\u{3176}", - nfc: "\u{3176}", - nfd: "\u{3176}", - nfkc: "\u{1127}", - nfkd: "\u{1127}", - }, - NormalizationTest { - source: "\u{3177}", - nfc: "\u{3177}", - nfd: "\u{3177}", - nfkc: "\u{1129}", - nfkd: "\u{1129}", - }, - NormalizationTest { - source: "\u{3178}", - nfc: "\u{3178}", - nfd: "\u{3178}", - nfkc: "\u{112B}", - nfkd: "\u{112B}", - }, - NormalizationTest { - source: "\u{3179}", - nfc: "\u{3179}", - nfd: "\u{3179}", - nfkc: "\u{112C}", - nfkd: "\u{112C}", - }, - NormalizationTest { - source: "\u{317A}", - nfc: "\u{317A}", - nfd: "\u{317A}", - nfkc: "\u{112D}", - nfkd: "\u{112D}", - }, - NormalizationTest { - source: "\u{317B}", - nfc: "\u{317B}", - nfd: "\u{317B}", - nfkc: "\u{112E}", - nfkd: "\u{112E}", - }, - NormalizationTest { - source: "\u{317C}", - nfc: "\u{317C}", - nfd: "\u{317C}", - nfkc: "\u{112F}", - nfkd: "\u{112F}", - }, - NormalizationTest { - source: "\u{317D}", - nfc: "\u{317D}", - nfd: "\u{317D}", - nfkc: "\u{1132}", - nfkd: "\u{1132}", - }, - NormalizationTest { - source: "\u{317E}", - nfc: "\u{317E}", - nfd: "\u{317E}", - nfkc: "\u{1136}", - nfkd: "\u{1136}", - }, - NormalizationTest { - source: "\u{317F}", - nfc: "\u{317F}", - nfd: "\u{317F}", - nfkc: "\u{1140}", - nfkd: "\u{1140}", - }, - NormalizationTest { - source: "\u{3180}", - nfc: "\u{3180}", - nfd: "\u{3180}", - nfkc: "\u{1147}", - nfkd: "\u{1147}", - }, - NormalizationTest { - source: "\u{3181}", - nfc: "\u{3181}", - nfd: "\u{3181}", - nfkc: "\u{114C}", - nfkd: "\u{114C}", - }, - NormalizationTest { - source: "\u{3182}", - nfc: "\u{3182}", - nfd: "\u{3182}", - nfkc: "\u{11F1}", - nfkd: "\u{11F1}", - }, - NormalizationTest { - source: "\u{3183}", - nfc: "\u{3183}", - nfd: "\u{3183}", - nfkc: "\u{11F2}", - nfkd: "\u{11F2}", - }, - NormalizationTest { - source: "\u{3184}", - nfc: "\u{3184}", - nfd: "\u{3184}", - nfkc: "\u{1157}", - nfkd: "\u{1157}", - }, - NormalizationTest { - source: "\u{3185}", - nfc: "\u{3185}", - nfd: "\u{3185}", - nfkc: "\u{1158}", - nfkd: "\u{1158}", - }, - NormalizationTest { - source: "\u{3186}", - nfc: "\u{3186}", - nfd: "\u{3186}", - nfkc: "\u{1159}", - nfkd: "\u{1159}", - }, - NormalizationTest { - source: "\u{3187}", - nfc: "\u{3187}", - nfd: "\u{3187}", - nfkc: "\u{1184}", - nfkd: "\u{1184}", - }, - NormalizationTest { - source: "\u{3188}", - nfc: "\u{3188}", - nfd: "\u{3188}", - nfkc: "\u{1185}", - nfkd: "\u{1185}", - }, - NormalizationTest { - source: "\u{3189}", - nfc: "\u{3189}", - nfd: "\u{3189}", - nfkc: "\u{1188}", - nfkd: "\u{1188}", - }, - NormalizationTest { - source: "\u{318A}", - nfc: "\u{318A}", - nfd: "\u{318A}", - nfkc: "\u{1191}", - nfkd: "\u{1191}", - }, - NormalizationTest { - source: "\u{318B}", - nfc: "\u{318B}", - nfd: "\u{318B}", - nfkc: "\u{1192}", - nfkd: "\u{1192}", - }, - NormalizationTest { - source: "\u{318C}", - nfc: "\u{318C}", - nfd: "\u{318C}", - nfkc: "\u{1194}", - nfkd: "\u{1194}", - }, - NormalizationTest { - source: "\u{318D}", - nfc: "\u{318D}", - nfd: "\u{318D}", - nfkc: "\u{119E}", - nfkd: "\u{119E}", - }, - NormalizationTest { - source: "\u{318E}", - nfc: "\u{318E}", - nfd: "\u{318E}", - nfkc: "\u{11A1}", - nfkd: "\u{11A1}", - }, - NormalizationTest { - source: "\u{3192}", - nfc: "\u{3192}", - nfd: "\u{3192}", - nfkc: "\u{4E00}", - nfkd: "\u{4E00}", - }, - NormalizationTest { - source: "\u{3193}", - nfc: "\u{3193}", - nfd: "\u{3193}", - nfkc: "\u{4E8C}", - nfkd: "\u{4E8C}", - }, - NormalizationTest { - source: "\u{3194}", - nfc: "\u{3194}", - nfd: "\u{3194}", - nfkc: "\u{4E09}", - nfkd: "\u{4E09}", - }, - NormalizationTest { - source: "\u{3195}", - nfc: "\u{3195}", - nfd: "\u{3195}", - nfkc: "\u{56DB}", - nfkd: "\u{56DB}", - }, - NormalizationTest { - source: "\u{3196}", - nfc: "\u{3196}", - nfd: "\u{3196}", - nfkc: "\u{4E0A}", - nfkd: "\u{4E0A}", - }, - NormalizationTest { - source: "\u{3197}", - nfc: "\u{3197}", - nfd: "\u{3197}", - nfkc: "\u{4E2D}", - nfkd: "\u{4E2D}", - }, - NormalizationTest { - source: "\u{3198}", - nfc: "\u{3198}", - nfd: "\u{3198}", - nfkc: "\u{4E0B}", - nfkd: "\u{4E0B}", - }, - NormalizationTest { - source: "\u{3199}", - nfc: "\u{3199}", - nfd: "\u{3199}", - nfkc: "\u{7532}", - nfkd: "\u{7532}", - }, - NormalizationTest { - source: "\u{319A}", - nfc: "\u{319A}", - nfd: "\u{319A}", - nfkc: "\u{4E59}", - nfkd: "\u{4E59}", - }, - NormalizationTest { - source: "\u{319B}", - nfc: "\u{319B}", - nfd: "\u{319B}", - nfkc: "\u{4E19}", - nfkd: "\u{4E19}", - }, - NormalizationTest { - source: "\u{319C}", - nfc: "\u{319C}", - nfd: "\u{319C}", - nfkc: "\u{4E01}", - nfkd: "\u{4E01}", - }, - NormalizationTest { - source: "\u{319D}", - nfc: "\u{319D}", - nfd: "\u{319D}", - nfkc: "\u{5929}", - nfkd: "\u{5929}", - }, - NormalizationTest { - source: "\u{319E}", - nfc: "\u{319E}", - nfd: "\u{319E}", - nfkc: "\u{5730}", - nfkd: "\u{5730}", - }, - NormalizationTest { - source: "\u{319F}", - nfc: "\u{319F}", - nfd: "\u{319F}", - nfkc: "\u{4EBA}", - nfkd: "\u{4EBA}", - }, - NormalizationTest { - source: "\u{3200}", - nfc: "\u{3200}", - nfd: "\u{3200}", - nfkc: "\u{0028}\u{1100}\u{0029}", - nfkd: "\u{0028}\u{1100}\u{0029}", - }, - NormalizationTest { - source: "\u{3201}", - nfc: "\u{3201}", - nfd: "\u{3201}", - nfkc: "\u{0028}\u{1102}\u{0029}", - nfkd: "\u{0028}\u{1102}\u{0029}", - }, - NormalizationTest { - source: "\u{3202}", - nfc: "\u{3202}", - nfd: "\u{3202}", - nfkc: "\u{0028}\u{1103}\u{0029}", - nfkd: "\u{0028}\u{1103}\u{0029}", - }, - NormalizationTest { - source: "\u{3203}", - nfc: "\u{3203}", - nfd: "\u{3203}", - nfkc: "\u{0028}\u{1105}\u{0029}", - nfkd: "\u{0028}\u{1105}\u{0029}", - }, - NormalizationTest { - source: "\u{3204}", - nfc: "\u{3204}", - nfd: "\u{3204}", - nfkc: "\u{0028}\u{1106}\u{0029}", - nfkd: "\u{0028}\u{1106}\u{0029}", - }, - NormalizationTest { - source: "\u{3205}", - nfc: "\u{3205}", - nfd: "\u{3205}", - nfkc: "\u{0028}\u{1107}\u{0029}", - nfkd: "\u{0028}\u{1107}\u{0029}", - }, - NormalizationTest { - source: "\u{3206}", - nfc: "\u{3206}", - nfd: "\u{3206}", - nfkc: "\u{0028}\u{1109}\u{0029}", - nfkd: "\u{0028}\u{1109}\u{0029}", - }, - NormalizationTest { - source: "\u{3207}", - nfc: "\u{3207}", - nfd: "\u{3207}", - nfkc: "\u{0028}\u{110B}\u{0029}", - nfkd: "\u{0028}\u{110B}\u{0029}", - }, - NormalizationTest { - source: "\u{3208}", - nfc: "\u{3208}", - nfd: "\u{3208}", - nfkc: "\u{0028}\u{110C}\u{0029}", - nfkd: "\u{0028}\u{110C}\u{0029}", - }, - NormalizationTest { - source: "\u{3209}", - nfc: "\u{3209}", - nfd: "\u{3209}", - nfkc: "\u{0028}\u{110E}\u{0029}", - nfkd: "\u{0028}\u{110E}\u{0029}", - }, - NormalizationTest { - source: "\u{320A}", - nfc: "\u{320A}", - nfd: "\u{320A}", - nfkc: "\u{0028}\u{110F}\u{0029}", - nfkd: "\u{0028}\u{110F}\u{0029}", - }, - NormalizationTest { - source: "\u{320B}", - nfc: "\u{320B}", - nfd: "\u{320B}", - nfkc: "\u{0028}\u{1110}\u{0029}", - nfkd: "\u{0028}\u{1110}\u{0029}", - }, - NormalizationTest { - source: "\u{320C}", - nfc: "\u{320C}", - nfd: "\u{320C}", - nfkc: "\u{0028}\u{1111}\u{0029}", - nfkd: "\u{0028}\u{1111}\u{0029}", - }, - NormalizationTest { - source: "\u{320D}", - nfc: "\u{320D}", - nfd: "\u{320D}", - nfkc: "\u{0028}\u{1112}\u{0029}", - nfkd: "\u{0028}\u{1112}\u{0029}", - }, - NormalizationTest { - source: "\u{320E}", - nfc: "\u{320E}", - nfd: "\u{320E}", - nfkc: "\u{0028}\u{AC00}\u{0029}", - nfkd: "\u{0028}\u{1100}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{320F}", - nfc: "\u{320F}", - nfd: "\u{320F}", - nfkc: "\u{0028}\u{B098}\u{0029}", - nfkd: "\u{0028}\u{1102}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3210}", - nfc: "\u{3210}", - nfd: "\u{3210}", - nfkc: "\u{0028}\u{B2E4}\u{0029}", - nfkd: "\u{0028}\u{1103}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3211}", - nfc: "\u{3211}", - nfd: "\u{3211}", - nfkc: "\u{0028}\u{B77C}\u{0029}", - nfkd: "\u{0028}\u{1105}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3212}", - nfc: "\u{3212}", - nfd: "\u{3212}", - nfkc: "\u{0028}\u{B9C8}\u{0029}", - nfkd: "\u{0028}\u{1106}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3213}", - nfc: "\u{3213}", - nfd: "\u{3213}", - nfkc: "\u{0028}\u{BC14}\u{0029}", - nfkd: "\u{0028}\u{1107}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3214}", - nfc: "\u{3214}", - nfd: "\u{3214}", - nfkc: "\u{0028}\u{C0AC}\u{0029}", - nfkd: "\u{0028}\u{1109}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3215}", - nfc: "\u{3215}", - nfd: "\u{3215}", - nfkc: "\u{0028}\u{C544}\u{0029}", - nfkd: "\u{0028}\u{110B}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3216}", - nfc: "\u{3216}", - nfd: "\u{3216}", - nfkc: "\u{0028}\u{C790}\u{0029}", - nfkd: "\u{0028}\u{110C}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3217}", - nfc: "\u{3217}", - nfd: "\u{3217}", - nfkc: "\u{0028}\u{CC28}\u{0029}", - nfkd: "\u{0028}\u{110E}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3218}", - nfc: "\u{3218}", - nfd: "\u{3218}", - nfkc: "\u{0028}\u{CE74}\u{0029}", - nfkd: "\u{0028}\u{110F}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{3219}", - nfc: "\u{3219}", - nfd: "\u{3219}", - nfkc: "\u{0028}\u{D0C0}\u{0029}", - nfkd: "\u{0028}\u{1110}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{321A}", - nfc: "\u{321A}", - nfd: "\u{321A}", - nfkc: "\u{0028}\u{D30C}\u{0029}", - nfkd: "\u{0028}\u{1111}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{321B}", - nfc: "\u{321B}", - nfd: "\u{321B}", - nfkc: "\u{0028}\u{D558}\u{0029}", - nfkd: "\u{0028}\u{1112}\u{1161}\u{0029}", - }, - NormalizationTest { - source: "\u{321C}", - nfc: "\u{321C}", - nfd: "\u{321C}", - nfkc: "\u{0028}\u{C8FC}\u{0029}", - nfkd: "\u{0028}\u{110C}\u{116E}\u{0029}", - }, - NormalizationTest { - source: "\u{321D}", - nfc: "\u{321D}", - nfd: "\u{321D}", - nfkc: "\u{0028}\u{C624}\u{C804}\u{0029}", - nfkd: "\u{0028}\u{110B}\u{1169}\u{110C}\u{1165}\u{11AB}\u{0029}", - }, - NormalizationTest { - source: "\u{321E}", - nfc: "\u{321E}", - nfd: "\u{321E}", - nfkc: "\u{0028}\u{C624}\u{D6C4}\u{0029}", - nfkd: "\u{0028}\u{110B}\u{1169}\u{1112}\u{116E}\u{0029}", - }, - NormalizationTest { - source: "\u{3220}", - nfc: "\u{3220}", - nfd: "\u{3220}", - nfkc: "\u{0028}\u{4E00}\u{0029}", - nfkd: "\u{0028}\u{4E00}\u{0029}", - }, - NormalizationTest { - source: "\u{3221}", - nfc: "\u{3221}", - nfd: "\u{3221}", - nfkc: "\u{0028}\u{4E8C}\u{0029}", - nfkd: "\u{0028}\u{4E8C}\u{0029}", - }, - NormalizationTest { - source: "\u{3222}", - nfc: "\u{3222}", - nfd: "\u{3222}", - nfkc: "\u{0028}\u{4E09}\u{0029}", - nfkd: "\u{0028}\u{4E09}\u{0029}", - }, - NormalizationTest { - source: "\u{3223}", - nfc: "\u{3223}", - nfd: "\u{3223}", - nfkc: "\u{0028}\u{56DB}\u{0029}", - nfkd: "\u{0028}\u{56DB}\u{0029}", - }, - NormalizationTest { - source: "\u{3224}", - nfc: "\u{3224}", - nfd: "\u{3224}", - nfkc: "\u{0028}\u{4E94}\u{0029}", - nfkd: "\u{0028}\u{4E94}\u{0029}", - }, - NormalizationTest { - source: "\u{3225}", - nfc: "\u{3225}", - nfd: "\u{3225}", - nfkc: "\u{0028}\u{516D}\u{0029}", - nfkd: "\u{0028}\u{516D}\u{0029}", - }, - NormalizationTest { - source: "\u{3226}", - nfc: "\u{3226}", - nfd: "\u{3226}", - nfkc: "\u{0028}\u{4E03}\u{0029}", - nfkd: "\u{0028}\u{4E03}\u{0029}", - }, - NormalizationTest { - source: "\u{3227}", - nfc: "\u{3227}", - nfd: "\u{3227}", - nfkc: "\u{0028}\u{516B}\u{0029}", - nfkd: "\u{0028}\u{516B}\u{0029}", - }, - NormalizationTest { - source: "\u{3228}", - nfc: "\u{3228}", - nfd: "\u{3228}", - nfkc: "\u{0028}\u{4E5D}\u{0029}", - nfkd: "\u{0028}\u{4E5D}\u{0029}", - }, - NormalizationTest { - source: "\u{3229}", - nfc: "\u{3229}", - nfd: "\u{3229}", - nfkc: "\u{0028}\u{5341}\u{0029}", - nfkd: "\u{0028}\u{5341}\u{0029}", - }, - NormalizationTest { - source: "\u{322A}", - nfc: "\u{322A}", - nfd: "\u{322A}", - nfkc: "\u{0028}\u{6708}\u{0029}", - nfkd: "\u{0028}\u{6708}\u{0029}", - }, - NormalizationTest { - source: "\u{322B}", - nfc: "\u{322B}", - nfd: "\u{322B}", - nfkc: "\u{0028}\u{706B}\u{0029}", - nfkd: "\u{0028}\u{706B}\u{0029}", - }, - NormalizationTest { - source: "\u{322C}", - nfc: "\u{322C}", - nfd: "\u{322C}", - nfkc: "\u{0028}\u{6C34}\u{0029}", - nfkd: "\u{0028}\u{6C34}\u{0029}", - }, - NormalizationTest { - source: "\u{322D}", - nfc: "\u{322D}", - nfd: "\u{322D}", - nfkc: "\u{0028}\u{6728}\u{0029}", - nfkd: "\u{0028}\u{6728}\u{0029}", - }, - NormalizationTest { - source: "\u{322E}", - nfc: "\u{322E}", - nfd: "\u{322E}", - nfkc: "\u{0028}\u{91D1}\u{0029}", - nfkd: "\u{0028}\u{91D1}\u{0029}", - }, - NormalizationTest { - source: "\u{322F}", - nfc: "\u{322F}", - nfd: "\u{322F}", - nfkc: "\u{0028}\u{571F}\u{0029}", - nfkd: "\u{0028}\u{571F}\u{0029}", - }, - NormalizationTest { - source: "\u{3230}", - nfc: "\u{3230}", - nfd: "\u{3230}", - nfkc: "\u{0028}\u{65E5}\u{0029}", - nfkd: "\u{0028}\u{65E5}\u{0029}", - }, - NormalizationTest { - source: "\u{3231}", - nfc: "\u{3231}", - nfd: "\u{3231}", - nfkc: "\u{0028}\u{682A}\u{0029}", - nfkd: "\u{0028}\u{682A}\u{0029}", - }, - NormalizationTest { - source: "\u{3232}", - nfc: "\u{3232}", - nfd: "\u{3232}", - nfkc: "\u{0028}\u{6709}\u{0029}", - nfkd: "\u{0028}\u{6709}\u{0029}", - }, - NormalizationTest { - source: "\u{3233}", - nfc: "\u{3233}", - nfd: "\u{3233}", - nfkc: "\u{0028}\u{793E}\u{0029}", - nfkd: "\u{0028}\u{793E}\u{0029}", - }, - NormalizationTest { - source: "\u{3234}", - nfc: "\u{3234}", - nfd: "\u{3234}", - nfkc: "\u{0028}\u{540D}\u{0029}", - nfkd: "\u{0028}\u{540D}\u{0029}", - }, - NormalizationTest { - source: "\u{3235}", - nfc: "\u{3235}", - nfd: "\u{3235}", - nfkc: "\u{0028}\u{7279}\u{0029}", - nfkd: "\u{0028}\u{7279}\u{0029}", - }, - NormalizationTest { - source: "\u{3236}", - nfc: "\u{3236}", - nfd: "\u{3236}", - nfkc: "\u{0028}\u{8CA1}\u{0029}", - nfkd: "\u{0028}\u{8CA1}\u{0029}", - }, - NormalizationTest { - source: "\u{3237}", - nfc: "\u{3237}", - nfd: "\u{3237}", - nfkc: "\u{0028}\u{795D}\u{0029}", - nfkd: "\u{0028}\u{795D}\u{0029}", - }, - NormalizationTest { - source: "\u{3238}", - nfc: "\u{3238}", - nfd: "\u{3238}", - nfkc: "\u{0028}\u{52B4}\u{0029}", - nfkd: "\u{0028}\u{52B4}\u{0029}", - }, - NormalizationTest { - source: "\u{3239}", - nfc: "\u{3239}", - nfd: "\u{3239}", - nfkc: "\u{0028}\u{4EE3}\u{0029}", - nfkd: "\u{0028}\u{4EE3}\u{0029}", - }, - NormalizationTest { - source: "\u{323A}", - nfc: "\u{323A}", - nfd: "\u{323A}", - nfkc: "\u{0028}\u{547C}\u{0029}", - nfkd: "\u{0028}\u{547C}\u{0029}", - }, - NormalizationTest { - source: "\u{323B}", - nfc: "\u{323B}", - nfd: "\u{323B}", - nfkc: "\u{0028}\u{5B66}\u{0029}", - nfkd: "\u{0028}\u{5B66}\u{0029}", - }, - NormalizationTest { - source: "\u{323C}", - nfc: "\u{323C}", - nfd: "\u{323C}", - nfkc: "\u{0028}\u{76E3}\u{0029}", - nfkd: "\u{0028}\u{76E3}\u{0029}", - }, - NormalizationTest { - source: "\u{323D}", - nfc: "\u{323D}", - nfd: "\u{323D}", - nfkc: "\u{0028}\u{4F01}\u{0029}", - nfkd: "\u{0028}\u{4F01}\u{0029}", - }, - NormalizationTest { - source: "\u{323E}", - nfc: "\u{323E}", - nfd: "\u{323E}", - nfkc: "\u{0028}\u{8CC7}\u{0029}", - nfkd: "\u{0028}\u{8CC7}\u{0029}", - }, - NormalizationTest { - source: "\u{323F}", - nfc: "\u{323F}", - nfd: "\u{323F}", - nfkc: "\u{0028}\u{5354}\u{0029}", - nfkd: "\u{0028}\u{5354}\u{0029}", - }, - NormalizationTest { - source: "\u{3240}", - nfc: "\u{3240}", - nfd: "\u{3240}", - nfkc: "\u{0028}\u{796D}\u{0029}", - nfkd: "\u{0028}\u{796D}\u{0029}", - }, - NormalizationTest { - source: "\u{3241}", - nfc: "\u{3241}", - nfd: "\u{3241}", - nfkc: "\u{0028}\u{4F11}\u{0029}", - nfkd: "\u{0028}\u{4F11}\u{0029}", - }, - NormalizationTest { - source: "\u{3242}", - nfc: "\u{3242}", - nfd: "\u{3242}", - nfkc: "\u{0028}\u{81EA}\u{0029}", - nfkd: "\u{0028}\u{81EA}\u{0029}", - }, - NormalizationTest { - source: "\u{3243}", - nfc: "\u{3243}", - nfd: "\u{3243}", - nfkc: "\u{0028}\u{81F3}\u{0029}", - nfkd: "\u{0028}\u{81F3}\u{0029}", - }, - NormalizationTest { - source: "\u{3244}", - nfc: "\u{3244}", - nfd: "\u{3244}", - nfkc: "\u{554F}", - nfkd: "\u{554F}", - }, - NormalizationTest { - source: "\u{3245}", - nfc: "\u{3245}", - nfd: "\u{3245}", - nfkc: "\u{5E7C}", - nfkd: "\u{5E7C}", - }, - NormalizationTest { - source: "\u{3246}", - nfc: "\u{3246}", - nfd: "\u{3246}", - nfkc: "\u{6587}", - nfkd: "\u{6587}", - }, - NormalizationTest { - source: "\u{3247}", - nfc: "\u{3247}", - nfd: "\u{3247}", - nfkc: "\u{7B8F}", - nfkd: "\u{7B8F}", - }, - NormalizationTest { - source: "\u{3250}", - nfc: "\u{3250}", - nfd: "\u{3250}", - nfkc: "\u{0050}\u{0054}\u{0045}", - nfkd: "\u{0050}\u{0054}\u{0045}", - }, - NormalizationTest { - source: "\u{3251}", - nfc: "\u{3251}", - nfd: "\u{3251}", - nfkc: "\u{0032}\u{0031}", - nfkd: "\u{0032}\u{0031}", - }, - NormalizationTest { - source: "\u{3252}", - nfc: "\u{3252}", - nfd: "\u{3252}", - nfkc: "\u{0032}\u{0032}", - nfkd: "\u{0032}\u{0032}", - }, - NormalizationTest { - source: "\u{3253}", - nfc: "\u{3253}", - nfd: "\u{3253}", - nfkc: "\u{0032}\u{0033}", - nfkd: "\u{0032}\u{0033}", - }, - NormalizationTest { - source: "\u{3254}", - nfc: "\u{3254}", - nfd: "\u{3254}", - nfkc: "\u{0032}\u{0034}", - nfkd: "\u{0032}\u{0034}", - }, - NormalizationTest { - source: "\u{3255}", - nfc: "\u{3255}", - nfd: "\u{3255}", - nfkc: "\u{0032}\u{0035}", - nfkd: "\u{0032}\u{0035}", - }, - NormalizationTest { - source: "\u{3256}", - nfc: "\u{3256}", - nfd: "\u{3256}", - nfkc: "\u{0032}\u{0036}", - nfkd: "\u{0032}\u{0036}", - }, - NormalizationTest { - source: "\u{3257}", - nfc: "\u{3257}", - nfd: "\u{3257}", - nfkc: "\u{0032}\u{0037}", - nfkd: "\u{0032}\u{0037}", - }, - NormalizationTest { - source: "\u{3258}", - nfc: "\u{3258}", - nfd: "\u{3258}", - nfkc: "\u{0032}\u{0038}", - nfkd: "\u{0032}\u{0038}", - }, - NormalizationTest { - source: "\u{3259}", - nfc: "\u{3259}", - nfd: "\u{3259}", - nfkc: "\u{0032}\u{0039}", - nfkd: "\u{0032}\u{0039}", - }, - NormalizationTest { - source: "\u{325A}", - nfc: "\u{325A}", - nfd: "\u{325A}", - nfkc: "\u{0033}\u{0030}", - nfkd: "\u{0033}\u{0030}", - }, - NormalizationTest { - source: "\u{325B}", - nfc: "\u{325B}", - nfd: "\u{325B}", - nfkc: "\u{0033}\u{0031}", - nfkd: "\u{0033}\u{0031}", - }, - NormalizationTest { - source: "\u{325C}", - nfc: "\u{325C}", - nfd: "\u{325C}", - nfkc: "\u{0033}\u{0032}", - nfkd: "\u{0033}\u{0032}", - }, - NormalizationTest { - source: "\u{325D}", - nfc: "\u{325D}", - nfd: "\u{325D}", - nfkc: "\u{0033}\u{0033}", - nfkd: "\u{0033}\u{0033}", - }, - NormalizationTest { - source: "\u{325E}", - nfc: "\u{325E}", - nfd: "\u{325E}", - nfkc: "\u{0033}\u{0034}", - nfkd: "\u{0033}\u{0034}", - }, - NormalizationTest { - source: "\u{325F}", - nfc: "\u{325F}", - nfd: "\u{325F}", - nfkc: "\u{0033}\u{0035}", - nfkd: "\u{0033}\u{0035}", - }, - NormalizationTest { - source: "\u{3260}", - nfc: "\u{3260}", - nfd: "\u{3260}", - nfkc: "\u{1100}", - nfkd: "\u{1100}", - }, - NormalizationTest { - source: "\u{3261}", - nfc: "\u{3261}", - nfd: "\u{3261}", - nfkc: "\u{1102}", - nfkd: "\u{1102}", - }, - NormalizationTest { - source: "\u{3262}", - nfc: "\u{3262}", - nfd: "\u{3262}", - nfkc: "\u{1103}", - nfkd: "\u{1103}", - }, - NormalizationTest { - source: "\u{3263}", - nfc: "\u{3263}", - nfd: "\u{3263}", - nfkc: "\u{1105}", - nfkd: "\u{1105}", - }, - NormalizationTest { - source: "\u{3264}", - nfc: "\u{3264}", - nfd: "\u{3264}", - nfkc: "\u{1106}", - nfkd: "\u{1106}", - }, - NormalizationTest { - source: "\u{3265}", - nfc: "\u{3265}", - nfd: "\u{3265}", - nfkc: "\u{1107}", - nfkd: "\u{1107}", - }, - NormalizationTest { - source: "\u{3266}", - nfc: "\u{3266}", - nfd: "\u{3266}", - nfkc: "\u{1109}", - nfkd: "\u{1109}", - }, - NormalizationTest { - source: "\u{3267}", - nfc: "\u{3267}", - nfd: "\u{3267}", - nfkc: "\u{110B}", - nfkd: "\u{110B}", - }, - NormalizationTest { - source: "\u{3268}", - nfc: "\u{3268}", - nfd: "\u{3268}", - nfkc: "\u{110C}", - nfkd: "\u{110C}", - }, - NormalizationTest { - source: "\u{3269}", - nfc: "\u{3269}", - nfd: "\u{3269}", - nfkc: "\u{110E}", - nfkd: "\u{110E}", - }, - NormalizationTest { - source: "\u{326A}", - nfc: "\u{326A}", - nfd: "\u{326A}", - nfkc: "\u{110F}", - nfkd: "\u{110F}", - }, - NormalizationTest { - source: "\u{326B}", - nfc: "\u{326B}", - nfd: "\u{326B}", - nfkc: "\u{1110}", - nfkd: "\u{1110}", - }, - NormalizationTest { - source: "\u{326C}", - nfc: "\u{326C}", - nfd: "\u{326C}", - nfkc: "\u{1111}", - nfkd: "\u{1111}", - }, - NormalizationTest { - source: "\u{326D}", - nfc: "\u{326D}", - nfd: "\u{326D}", - nfkc: "\u{1112}", - nfkd: "\u{1112}", - }, - NormalizationTest { - source: "\u{326E}", - nfc: "\u{326E}", - nfd: "\u{326E}", - nfkc: "\u{AC00}", - nfkd: "\u{1100}\u{1161}", - }, - NormalizationTest { - source: "\u{326F}", - nfc: "\u{326F}", - nfd: "\u{326F}", - nfkc: "\u{B098}", - nfkd: "\u{1102}\u{1161}", - }, - NormalizationTest { - source: "\u{3270}", - nfc: "\u{3270}", - nfd: "\u{3270}", - nfkc: "\u{B2E4}", - nfkd: "\u{1103}\u{1161}", - }, - NormalizationTest { - source: "\u{3271}", - nfc: "\u{3271}", - nfd: "\u{3271}", - nfkc: "\u{B77C}", - nfkd: "\u{1105}\u{1161}", - }, - NormalizationTest { - source: "\u{3272}", - nfc: "\u{3272}", - nfd: "\u{3272}", - nfkc: "\u{B9C8}", - nfkd: "\u{1106}\u{1161}", - }, - NormalizationTest { - source: "\u{3273}", - nfc: "\u{3273}", - nfd: "\u{3273}", - nfkc: "\u{BC14}", - nfkd: "\u{1107}\u{1161}", - }, - NormalizationTest { - source: "\u{3274}", - nfc: "\u{3274}", - nfd: "\u{3274}", - nfkc: "\u{C0AC}", - nfkd: "\u{1109}\u{1161}", - }, - NormalizationTest { - source: "\u{3275}", - nfc: "\u{3275}", - nfd: "\u{3275}", - nfkc: "\u{C544}", - nfkd: "\u{110B}\u{1161}", - }, - NormalizationTest { - source: "\u{3276}", - nfc: "\u{3276}", - nfd: "\u{3276}", - nfkc: "\u{C790}", - nfkd: "\u{110C}\u{1161}", - }, - NormalizationTest { - source: "\u{3277}", - nfc: "\u{3277}", - nfd: "\u{3277}", - nfkc: "\u{CC28}", - nfkd: "\u{110E}\u{1161}", - }, - NormalizationTest { - source: "\u{3278}", - nfc: "\u{3278}", - nfd: "\u{3278}", - nfkc: "\u{CE74}", - nfkd: "\u{110F}\u{1161}", - }, - NormalizationTest { - source: "\u{3279}", - nfc: "\u{3279}", - nfd: "\u{3279}", - nfkc: "\u{D0C0}", - nfkd: "\u{1110}\u{1161}", - }, - NormalizationTest { - source: "\u{327A}", - nfc: "\u{327A}", - nfd: "\u{327A}", - nfkc: "\u{D30C}", - nfkd: "\u{1111}\u{1161}", - }, - NormalizationTest { - source: "\u{327B}", - nfc: "\u{327B}", - nfd: "\u{327B}", - nfkc: "\u{D558}", - nfkd: "\u{1112}\u{1161}", - }, - NormalizationTest { - source: "\u{327C}", - nfc: "\u{327C}", - nfd: "\u{327C}", - nfkc: "\u{CC38}\u{ACE0}", - nfkd: "\u{110E}\u{1161}\u{11B7}\u{1100}\u{1169}", - }, - NormalizationTest { - source: "\u{327D}", - nfc: "\u{327D}", - nfd: "\u{327D}", - nfkc: "\u{C8FC}\u{C758}", - nfkd: "\u{110C}\u{116E}\u{110B}\u{1174}", - }, - NormalizationTest { - source: "\u{327E}", - nfc: "\u{327E}", - nfd: "\u{327E}", - nfkc: "\u{C6B0}", - nfkd: "\u{110B}\u{116E}", - }, - NormalizationTest { - source: "\u{3280}", - nfc: "\u{3280}", - nfd: "\u{3280}", - nfkc: "\u{4E00}", - nfkd: "\u{4E00}", - }, - NormalizationTest { - source: "\u{3281}", - nfc: "\u{3281}", - nfd: "\u{3281}", - nfkc: "\u{4E8C}", - nfkd: "\u{4E8C}", - }, - NormalizationTest { - source: "\u{3282}", - nfc: "\u{3282}", - nfd: "\u{3282}", - nfkc: "\u{4E09}", - nfkd: "\u{4E09}", - }, - NormalizationTest { - source: "\u{3283}", - nfc: "\u{3283}", - nfd: "\u{3283}", - nfkc: "\u{56DB}", - nfkd: "\u{56DB}", - }, - NormalizationTest { - source: "\u{3284}", - nfc: "\u{3284}", - nfd: "\u{3284}", - nfkc: "\u{4E94}", - nfkd: "\u{4E94}", - }, - NormalizationTest { - source: "\u{3285}", - nfc: "\u{3285}", - nfd: "\u{3285}", - nfkc: "\u{516D}", - nfkd: "\u{516D}", - }, - NormalizationTest { - source: "\u{3286}", - nfc: "\u{3286}", - nfd: "\u{3286}", - nfkc: "\u{4E03}", - nfkd: "\u{4E03}", - }, - NormalizationTest { - source: "\u{3287}", - nfc: "\u{3287}", - nfd: "\u{3287}", - nfkc: "\u{516B}", - nfkd: "\u{516B}", - }, - NormalizationTest { - source: "\u{3288}", - nfc: "\u{3288}", - nfd: "\u{3288}", - nfkc: "\u{4E5D}", - nfkd: "\u{4E5D}", - }, - NormalizationTest { - source: "\u{3289}", - nfc: "\u{3289}", - nfd: "\u{3289}", - nfkc: "\u{5341}", - nfkd: "\u{5341}", - }, - NormalizationTest { - source: "\u{328A}", - nfc: "\u{328A}", - nfd: "\u{328A}", - nfkc: "\u{6708}", - nfkd: "\u{6708}", - }, - NormalizationTest { - source: "\u{328B}", - nfc: "\u{328B}", - nfd: "\u{328B}", - nfkc: "\u{706B}", - nfkd: "\u{706B}", - }, - NormalizationTest { - source: "\u{328C}", - nfc: "\u{328C}", - nfd: "\u{328C}", - nfkc: "\u{6C34}", - nfkd: "\u{6C34}", - }, - NormalizationTest { - source: "\u{328D}", - nfc: "\u{328D}", - nfd: "\u{328D}", - nfkc: "\u{6728}", - nfkd: "\u{6728}", - }, - NormalizationTest { - source: "\u{328E}", - nfc: "\u{328E}", - nfd: "\u{328E}", - nfkc: "\u{91D1}", - nfkd: "\u{91D1}", - }, - NormalizationTest { - source: "\u{328F}", - nfc: "\u{328F}", - nfd: "\u{328F}", - nfkc: "\u{571F}", - nfkd: "\u{571F}", - }, - NormalizationTest { - source: "\u{3290}", - nfc: "\u{3290}", - nfd: "\u{3290}", - nfkc: "\u{65E5}", - nfkd: "\u{65E5}", - }, - NormalizationTest { - source: "\u{3291}", - nfc: "\u{3291}", - nfd: "\u{3291}", - nfkc: "\u{682A}", - nfkd: "\u{682A}", - }, - NormalizationTest { - source: "\u{3292}", - nfc: "\u{3292}", - nfd: "\u{3292}", - nfkc: "\u{6709}", - nfkd: "\u{6709}", - }, - NormalizationTest { - source: "\u{3293}", - nfc: "\u{3293}", - nfd: "\u{3293}", - nfkc: "\u{793E}", - nfkd: "\u{793E}", - }, - NormalizationTest { - source: "\u{3294}", - nfc: "\u{3294}", - nfd: "\u{3294}", - nfkc: "\u{540D}", - nfkd: "\u{540D}", - }, - NormalizationTest { - source: "\u{3295}", - nfc: "\u{3295}", - nfd: "\u{3295}", - nfkc: "\u{7279}", - nfkd: "\u{7279}", - }, - NormalizationTest { - source: "\u{3296}", - nfc: "\u{3296}", - nfd: "\u{3296}", - nfkc: "\u{8CA1}", - nfkd: "\u{8CA1}", - }, - NormalizationTest { - source: "\u{3297}", - nfc: "\u{3297}", - nfd: "\u{3297}", - nfkc: "\u{795D}", - nfkd: "\u{795D}", - }, - NormalizationTest { - source: "\u{3298}", - nfc: "\u{3298}", - nfd: "\u{3298}", - nfkc: "\u{52B4}", - nfkd: "\u{52B4}", - }, - NormalizationTest { - source: "\u{3299}", - nfc: "\u{3299}", - nfd: "\u{3299}", - nfkc: "\u{79D8}", - nfkd: "\u{79D8}", - }, - NormalizationTest { - source: "\u{329A}", - nfc: "\u{329A}", - nfd: "\u{329A}", - nfkc: "\u{7537}", - nfkd: "\u{7537}", - }, - NormalizationTest { - source: "\u{329B}", - nfc: "\u{329B}", - nfd: "\u{329B}", - nfkc: "\u{5973}", - nfkd: "\u{5973}", - }, - NormalizationTest { - source: "\u{329C}", - nfc: "\u{329C}", - nfd: "\u{329C}", - nfkc: "\u{9069}", - nfkd: "\u{9069}", - }, - NormalizationTest { - source: "\u{329D}", - nfc: "\u{329D}", - nfd: "\u{329D}", - nfkc: "\u{512A}", - nfkd: "\u{512A}", - }, - NormalizationTest { - source: "\u{329E}", - nfc: "\u{329E}", - nfd: "\u{329E}", - nfkc: "\u{5370}", - nfkd: "\u{5370}", - }, - NormalizationTest { - source: "\u{329F}", - nfc: "\u{329F}", - nfd: "\u{329F}", - nfkc: "\u{6CE8}", - nfkd: "\u{6CE8}", - }, - NormalizationTest { - source: "\u{32A0}", - nfc: "\u{32A0}", - nfd: "\u{32A0}", - nfkc: "\u{9805}", - nfkd: "\u{9805}", - }, - NormalizationTest { - source: "\u{32A1}", - nfc: "\u{32A1}", - nfd: "\u{32A1}", - nfkc: "\u{4F11}", - nfkd: "\u{4F11}", - }, - NormalizationTest { - source: "\u{32A2}", - nfc: "\u{32A2}", - nfd: "\u{32A2}", - nfkc: "\u{5199}", - nfkd: "\u{5199}", - }, - NormalizationTest { - source: "\u{32A3}", - nfc: "\u{32A3}", - nfd: "\u{32A3}", - nfkc: "\u{6B63}", - nfkd: "\u{6B63}", - }, - NormalizationTest { - source: "\u{32A4}", - nfc: "\u{32A4}", - nfd: "\u{32A4}", - nfkc: "\u{4E0A}", - nfkd: "\u{4E0A}", - }, - NormalizationTest { - source: "\u{32A5}", - nfc: "\u{32A5}", - nfd: "\u{32A5}", - nfkc: "\u{4E2D}", - nfkd: "\u{4E2D}", - }, - NormalizationTest { - source: "\u{32A6}", - nfc: "\u{32A6}", - nfd: "\u{32A6}", - nfkc: "\u{4E0B}", - nfkd: "\u{4E0B}", - }, - NormalizationTest { - source: "\u{32A7}", - nfc: "\u{32A7}", - nfd: "\u{32A7}", - nfkc: "\u{5DE6}", - nfkd: "\u{5DE6}", - }, - NormalizationTest { - source: "\u{32A8}", - nfc: "\u{32A8}", - nfd: "\u{32A8}", - nfkc: "\u{53F3}", - nfkd: "\u{53F3}", - }, - NormalizationTest { - source: "\u{32A9}", - nfc: "\u{32A9}", - nfd: "\u{32A9}", - nfkc: "\u{533B}", - nfkd: "\u{533B}", - }, - NormalizationTest { - source: "\u{32AA}", - nfc: "\u{32AA}", - nfd: "\u{32AA}", - nfkc: "\u{5B97}", - nfkd: "\u{5B97}", - }, - NormalizationTest { - source: "\u{32AB}", - nfc: "\u{32AB}", - nfd: "\u{32AB}", - nfkc: "\u{5B66}", - nfkd: "\u{5B66}", - }, - NormalizationTest { - source: "\u{32AC}", - nfc: "\u{32AC}", - nfd: "\u{32AC}", - nfkc: "\u{76E3}", - nfkd: "\u{76E3}", - }, - NormalizationTest { - source: "\u{32AD}", - nfc: "\u{32AD}", - nfd: "\u{32AD}", - nfkc: "\u{4F01}", - nfkd: "\u{4F01}", - }, - NormalizationTest { - source: "\u{32AE}", - nfc: "\u{32AE}", - nfd: "\u{32AE}", - nfkc: "\u{8CC7}", - nfkd: "\u{8CC7}", - }, - NormalizationTest { - source: "\u{32AF}", - nfc: "\u{32AF}", - nfd: "\u{32AF}", - nfkc: "\u{5354}", - nfkd: "\u{5354}", - }, - NormalizationTest { - source: "\u{32B0}", - nfc: "\u{32B0}", - nfd: "\u{32B0}", - nfkc: "\u{591C}", - nfkd: "\u{591C}", - }, - NormalizationTest { - source: "\u{32B1}", - nfc: "\u{32B1}", - nfd: "\u{32B1}", - nfkc: "\u{0033}\u{0036}", - nfkd: "\u{0033}\u{0036}", - }, - NormalizationTest { - source: "\u{32B2}", - nfc: "\u{32B2}", - nfd: "\u{32B2}", - nfkc: "\u{0033}\u{0037}", - nfkd: "\u{0033}\u{0037}", - }, - NormalizationTest { - source: "\u{32B3}", - nfc: "\u{32B3}", - nfd: "\u{32B3}", - nfkc: "\u{0033}\u{0038}", - nfkd: "\u{0033}\u{0038}", - }, - NormalizationTest { - source: "\u{32B4}", - nfc: "\u{32B4}", - nfd: "\u{32B4}", - nfkc: "\u{0033}\u{0039}", - nfkd: "\u{0033}\u{0039}", - }, - NormalizationTest { - source: "\u{32B5}", - nfc: "\u{32B5}", - nfd: "\u{32B5}", - nfkc: "\u{0034}\u{0030}", - nfkd: "\u{0034}\u{0030}", - }, - NormalizationTest { - source: "\u{32B6}", - nfc: "\u{32B6}", - nfd: "\u{32B6}", - nfkc: "\u{0034}\u{0031}", - nfkd: "\u{0034}\u{0031}", - }, - NormalizationTest { - source: "\u{32B7}", - nfc: "\u{32B7}", - nfd: "\u{32B7}", - nfkc: "\u{0034}\u{0032}", - nfkd: "\u{0034}\u{0032}", - }, - NormalizationTest { - source: "\u{32B8}", - nfc: "\u{32B8}", - nfd: "\u{32B8}", - nfkc: "\u{0034}\u{0033}", - nfkd: "\u{0034}\u{0033}", - }, - NormalizationTest { - source: "\u{32B9}", - nfc: "\u{32B9}", - nfd: "\u{32B9}", - nfkc: "\u{0034}\u{0034}", - nfkd: "\u{0034}\u{0034}", - }, - NormalizationTest { - source: "\u{32BA}", - nfc: "\u{32BA}", - nfd: "\u{32BA}", - nfkc: "\u{0034}\u{0035}", - nfkd: "\u{0034}\u{0035}", - }, - NormalizationTest { - source: "\u{32BB}", - nfc: "\u{32BB}", - nfd: "\u{32BB}", - nfkc: "\u{0034}\u{0036}", - nfkd: "\u{0034}\u{0036}", - }, - NormalizationTest { - source: "\u{32BC}", - nfc: "\u{32BC}", - nfd: "\u{32BC}", - nfkc: "\u{0034}\u{0037}", - nfkd: "\u{0034}\u{0037}", - }, - NormalizationTest { - source: "\u{32BD}", - nfc: "\u{32BD}", - nfd: "\u{32BD}", - nfkc: "\u{0034}\u{0038}", - nfkd: "\u{0034}\u{0038}", - }, - NormalizationTest { - source: "\u{32BE}", - nfc: "\u{32BE}", - nfd: "\u{32BE}", - nfkc: "\u{0034}\u{0039}", - nfkd: "\u{0034}\u{0039}", - }, - NormalizationTest { - source: "\u{32BF}", - nfc: "\u{32BF}", - nfd: "\u{32BF}", - nfkc: "\u{0035}\u{0030}", - nfkd: "\u{0035}\u{0030}", - }, - NormalizationTest { - source: "\u{32C0}", - nfc: "\u{32C0}", - nfd: "\u{32C0}", - nfkc: "\u{0031}\u{6708}", - nfkd: "\u{0031}\u{6708}", - }, - NormalizationTest { - source: "\u{32C1}", - nfc: "\u{32C1}", - nfd: "\u{32C1}", - nfkc: "\u{0032}\u{6708}", - nfkd: "\u{0032}\u{6708}", - }, - NormalizationTest { - source: "\u{32C2}", - nfc: "\u{32C2}", - nfd: "\u{32C2}", - nfkc: "\u{0033}\u{6708}", - nfkd: "\u{0033}\u{6708}", - }, - NormalizationTest { - source: "\u{32C3}", - nfc: "\u{32C3}", - nfd: "\u{32C3}", - nfkc: "\u{0034}\u{6708}", - nfkd: "\u{0034}\u{6708}", - }, - NormalizationTest { - source: "\u{32C4}", - nfc: "\u{32C4}", - nfd: "\u{32C4}", - nfkc: "\u{0035}\u{6708}", - nfkd: "\u{0035}\u{6708}", - }, - NormalizationTest { - source: "\u{32C5}", - nfc: "\u{32C5}", - nfd: "\u{32C5}", - nfkc: "\u{0036}\u{6708}", - nfkd: "\u{0036}\u{6708}", - }, - NormalizationTest { - source: "\u{32C6}", - nfc: "\u{32C6}", - nfd: "\u{32C6}", - nfkc: "\u{0037}\u{6708}", - nfkd: "\u{0037}\u{6708}", - }, - NormalizationTest { - source: "\u{32C7}", - nfc: "\u{32C7}", - nfd: "\u{32C7}", - nfkc: "\u{0038}\u{6708}", - nfkd: "\u{0038}\u{6708}", - }, - NormalizationTest { - source: "\u{32C8}", - nfc: "\u{32C8}", - nfd: "\u{32C8}", - nfkc: "\u{0039}\u{6708}", - nfkd: "\u{0039}\u{6708}", - }, - NormalizationTest { - source: "\u{32C9}", - nfc: "\u{32C9}", - nfd: "\u{32C9}", - nfkc: "\u{0031}\u{0030}\u{6708}", - nfkd: "\u{0031}\u{0030}\u{6708}", - }, - NormalizationTest { - source: "\u{32CA}", - nfc: "\u{32CA}", - nfd: "\u{32CA}", - nfkc: "\u{0031}\u{0031}\u{6708}", - nfkd: "\u{0031}\u{0031}\u{6708}", - }, - NormalizationTest { - source: "\u{32CB}", - nfc: "\u{32CB}", - nfd: "\u{32CB}", - nfkc: "\u{0031}\u{0032}\u{6708}", - nfkd: "\u{0031}\u{0032}\u{6708}", - }, - NormalizationTest { - source: "\u{32CC}", - nfc: "\u{32CC}", - nfd: "\u{32CC}", - nfkc: "\u{0048}\u{0067}", - nfkd: "\u{0048}\u{0067}", - }, - NormalizationTest { - source: "\u{32CD}", - nfc: "\u{32CD}", - nfd: "\u{32CD}", - nfkc: "\u{0065}\u{0072}\u{0067}", - nfkd: "\u{0065}\u{0072}\u{0067}", - }, - NormalizationTest { - source: "\u{32CE}", - nfc: "\u{32CE}", - nfd: "\u{32CE}", - nfkc: "\u{0065}\u{0056}", - nfkd: "\u{0065}\u{0056}", - }, - NormalizationTest { - source: "\u{32CF}", - nfc: "\u{32CF}", - nfd: "\u{32CF}", - nfkc: "\u{004C}\u{0054}\u{0044}", - nfkd: "\u{004C}\u{0054}\u{0044}", - }, - NormalizationTest { - source: "\u{32D0}", - nfc: "\u{32D0}", - nfd: "\u{32D0}", - nfkc: "\u{30A2}", - nfkd: "\u{30A2}", - }, - NormalizationTest { - source: "\u{32D1}", - nfc: "\u{32D1}", - nfd: "\u{32D1}", - nfkc: "\u{30A4}", - nfkd: "\u{30A4}", - }, - NormalizationTest { - source: "\u{32D2}", - nfc: "\u{32D2}", - nfd: "\u{32D2}", - nfkc: "\u{30A6}", - nfkd: "\u{30A6}", - }, - NormalizationTest { - source: "\u{32D3}", - nfc: "\u{32D3}", - nfd: "\u{32D3}", - nfkc: "\u{30A8}", - nfkd: "\u{30A8}", - }, - NormalizationTest { - source: "\u{32D4}", - nfc: "\u{32D4}", - nfd: "\u{32D4}", - nfkc: "\u{30AA}", - nfkd: "\u{30AA}", - }, - NormalizationTest { - source: "\u{32D5}", - nfc: "\u{32D5}", - nfd: "\u{32D5}", - nfkc: "\u{30AB}", - nfkd: "\u{30AB}", - }, - NormalizationTest { - source: "\u{32D6}", - nfc: "\u{32D6}", - nfd: "\u{32D6}", - nfkc: "\u{30AD}", - nfkd: "\u{30AD}", - }, - NormalizationTest { - source: "\u{32D7}", - nfc: "\u{32D7}", - nfd: "\u{32D7}", - nfkc: "\u{30AF}", - nfkd: "\u{30AF}", - }, - NormalizationTest { - source: "\u{32D8}", - nfc: "\u{32D8}", - nfd: "\u{32D8}", - nfkc: "\u{30B1}", - nfkd: "\u{30B1}", - }, - NormalizationTest { - source: "\u{32D9}", - nfc: "\u{32D9}", - nfd: "\u{32D9}", - nfkc: "\u{30B3}", - nfkd: "\u{30B3}", - }, - NormalizationTest { - source: "\u{32DA}", - nfc: "\u{32DA}", - nfd: "\u{32DA}", - nfkc: "\u{30B5}", - nfkd: "\u{30B5}", - }, - NormalizationTest { - source: "\u{32DB}", - nfc: "\u{32DB}", - nfd: "\u{32DB}", - nfkc: "\u{30B7}", - nfkd: "\u{30B7}", - }, - NormalizationTest { - source: "\u{32DC}", - nfc: "\u{32DC}", - nfd: "\u{32DC}", - nfkc: "\u{30B9}", - nfkd: "\u{30B9}", - }, - NormalizationTest { - source: "\u{32DD}", - nfc: "\u{32DD}", - nfd: "\u{32DD}", - nfkc: "\u{30BB}", - nfkd: "\u{30BB}", - }, - NormalizationTest { - source: "\u{32DE}", - nfc: "\u{32DE}", - nfd: "\u{32DE}", - nfkc: "\u{30BD}", - nfkd: "\u{30BD}", - }, - NormalizationTest { - source: "\u{32DF}", - nfc: "\u{32DF}", - nfd: "\u{32DF}", - nfkc: "\u{30BF}", - nfkd: "\u{30BF}", - }, - NormalizationTest { - source: "\u{32E0}", - nfc: "\u{32E0}", - nfd: "\u{32E0}", - nfkc: "\u{30C1}", - nfkd: "\u{30C1}", - }, - NormalizationTest { - source: "\u{32E1}", - nfc: "\u{32E1}", - nfd: "\u{32E1}", - nfkc: "\u{30C4}", - nfkd: "\u{30C4}", - }, - NormalizationTest { - source: "\u{32E2}", - nfc: "\u{32E2}", - nfd: "\u{32E2}", - nfkc: "\u{30C6}", - nfkd: "\u{30C6}", - }, - NormalizationTest { - source: "\u{32E3}", - nfc: "\u{32E3}", - nfd: "\u{32E3}", - nfkc: "\u{30C8}", - nfkd: "\u{30C8}", - }, - NormalizationTest { - source: "\u{32E4}", - nfc: "\u{32E4}", - nfd: "\u{32E4}", - nfkc: "\u{30CA}", - nfkd: "\u{30CA}", - }, - NormalizationTest { - source: "\u{32E5}", - nfc: "\u{32E5}", - nfd: "\u{32E5}", - nfkc: "\u{30CB}", - nfkd: "\u{30CB}", - }, - NormalizationTest { - source: "\u{32E6}", - nfc: "\u{32E6}", - nfd: "\u{32E6}", - nfkc: "\u{30CC}", - nfkd: "\u{30CC}", - }, - NormalizationTest { - source: "\u{32E7}", - nfc: "\u{32E7}", - nfd: "\u{32E7}", - nfkc: "\u{30CD}", - nfkd: "\u{30CD}", - }, - NormalizationTest { - source: "\u{32E8}", - nfc: "\u{32E8}", - nfd: "\u{32E8}", - nfkc: "\u{30CE}", - nfkd: "\u{30CE}", - }, - NormalizationTest { - source: "\u{32E9}", - nfc: "\u{32E9}", - nfd: "\u{32E9}", - nfkc: "\u{30CF}", - nfkd: "\u{30CF}", - }, - NormalizationTest { - source: "\u{32EA}", - nfc: "\u{32EA}", - nfd: "\u{32EA}", - nfkc: "\u{30D2}", - nfkd: "\u{30D2}", - }, - NormalizationTest { - source: "\u{32EB}", - nfc: "\u{32EB}", - nfd: "\u{32EB}", - nfkc: "\u{30D5}", - nfkd: "\u{30D5}", - }, - NormalizationTest { - source: "\u{32EC}", - nfc: "\u{32EC}", - nfd: "\u{32EC}", - nfkc: "\u{30D8}", - nfkd: "\u{30D8}", - }, - NormalizationTest { - source: "\u{32ED}", - nfc: "\u{32ED}", - nfd: "\u{32ED}", - nfkc: "\u{30DB}", - nfkd: "\u{30DB}", - }, - NormalizationTest { - source: "\u{32EE}", - nfc: "\u{32EE}", - nfd: "\u{32EE}", - nfkc: "\u{30DE}", - nfkd: "\u{30DE}", - }, - NormalizationTest { - source: "\u{32EF}", - nfc: "\u{32EF}", - nfd: "\u{32EF}", - nfkc: "\u{30DF}", - nfkd: "\u{30DF}", - }, - NormalizationTest { - source: "\u{32F0}", - nfc: "\u{32F0}", - nfd: "\u{32F0}", - nfkc: "\u{30E0}", - nfkd: "\u{30E0}", - }, - NormalizationTest { - source: "\u{32F1}", - nfc: "\u{32F1}", - nfd: "\u{32F1}", - nfkc: "\u{30E1}", - nfkd: "\u{30E1}", - }, - NormalizationTest { - source: "\u{32F2}", - nfc: "\u{32F2}", - nfd: "\u{32F2}", - nfkc: "\u{30E2}", - nfkd: "\u{30E2}", - }, - NormalizationTest { - source: "\u{32F3}", - nfc: "\u{32F3}", - nfd: "\u{32F3}", - nfkc: "\u{30E4}", - nfkd: "\u{30E4}", - }, - NormalizationTest { - source: "\u{32F4}", - nfc: "\u{32F4}", - nfd: "\u{32F4}", - nfkc: "\u{30E6}", - nfkd: "\u{30E6}", - }, - NormalizationTest { - source: "\u{32F5}", - nfc: "\u{32F5}", - nfd: "\u{32F5}", - nfkc: "\u{30E8}", - nfkd: "\u{30E8}", - }, - NormalizationTest { - source: "\u{32F6}", - nfc: "\u{32F6}", - nfd: "\u{32F6}", - nfkc: "\u{30E9}", - nfkd: "\u{30E9}", - }, - NormalizationTest { - source: "\u{32F7}", - nfc: "\u{32F7}", - nfd: "\u{32F7}", - nfkc: "\u{30EA}", - nfkd: "\u{30EA}", - }, - NormalizationTest { - source: "\u{32F8}", - nfc: "\u{32F8}", - nfd: "\u{32F8}", - nfkc: "\u{30EB}", - nfkd: "\u{30EB}", - }, - NormalizationTest { - source: "\u{32F9}", - nfc: "\u{32F9}", - nfd: "\u{32F9}", - nfkc: "\u{30EC}", - nfkd: "\u{30EC}", - }, - NormalizationTest { - source: "\u{32FA}", - nfc: "\u{32FA}", - nfd: "\u{32FA}", - nfkc: "\u{30ED}", - nfkd: "\u{30ED}", - }, - NormalizationTest { - source: "\u{32FB}", - nfc: "\u{32FB}", - nfd: "\u{32FB}", - nfkc: "\u{30EF}", - nfkd: "\u{30EF}", - }, - NormalizationTest { - source: "\u{32FC}", - nfc: "\u{32FC}", - nfd: "\u{32FC}", - nfkc: "\u{30F0}", - nfkd: "\u{30F0}", - }, - NormalizationTest { - source: "\u{32FD}", - nfc: "\u{32FD}", - nfd: "\u{32FD}", - nfkc: "\u{30F1}", - nfkd: "\u{30F1}", - }, - NormalizationTest { - source: "\u{32FE}", - nfc: "\u{32FE}", - nfd: "\u{32FE}", - nfkc: "\u{30F2}", - nfkd: "\u{30F2}", - }, - NormalizationTest { - source: "\u{3300}", - nfc: "\u{3300}", - nfd: "\u{3300}", - nfkc: "\u{30A2}\u{30D1}\u{30FC}\u{30C8}", - nfkd: "\u{30A2}\u{30CF}\u{309A}\u{30FC}\u{30C8}", - }, - NormalizationTest { - source: "\u{3301}", - nfc: "\u{3301}", - nfd: "\u{3301}", - nfkc: "\u{30A2}\u{30EB}\u{30D5}\u{30A1}", - nfkd: "\u{30A2}\u{30EB}\u{30D5}\u{30A1}", - }, - NormalizationTest { - source: "\u{3302}", - nfc: "\u{3302}", - nfd: "\u{3302}", - nfkc: "\u{30A2}\u{30F3}\u{30DA}\u{30A2}", - nfkd: "\u{30A2}\u{30F3}\u{30D8}\u{309A}\u{30A2}", - }, - NormalizationTest { - source: "\u{3303}", - nfc: "\u{3303}", - nfd: "\u{3303}", - nfkc: "\u{30A2}\u{30FC}\u{30EB}", - nfkd: "\u{30A2}\u{30FC}\u{30EB}", - }, - NormalizationTest { - source: "\u{3304}", - nfc: "\u{3304}", - nfd: "\u{3304}", - nfkc: "\u{30A4}\u{30CB}\u{30F3}\u{30B0}", - nfkd: "\u{30A4}\u{30CB}\u{30F3}\u{30AF}\u{3099}", - }, - NormalizationTest { - source: "\u{3305}", - nfc: "\u{3305}", - nfd: "\u{3305}", - nfkc: "\u{30A4}\u{30F3}\u{30C1}", - nfkd: "\u{30A4}\u{30F3}\u{30C1}", - }, - NormalizationTest { - source: "\u{3306}", - nfc: "\u{3306}", - nfd: "\u{3306}", - nfkc: "\u{30A6}\u{30A9}\u{30F3}", - nfkd: "\u{30A6}\u{30A9}\u{30F3}", - }, - NormalizationTest { - source: "\u{3307}", - nfc: "\u{3307}", - nfd: "\u{3307}", - nfkc: "\u{30A8}\u{30B9}\u{30AF}\u{30FC}\u{30C9}", - nfkd: "\u{30A8}\u{30B9}\u{30AF}\u{30FC}\u{30C8}\u{3099}", - }, - NormalizationTest { - source: "\u{3308}", - nfc: "\u{3308}", - nfd: "\u{3308}", - nfkc: "\u{30A8}\u{30FC}\u{30AB}\u{30FC}", - nfkd: "\u{30A8}\u{30FC}\u{30AB}\u{30FC}", - }, - NormalizationTest { - source: "\u{3309}", - nfc: "\u{3309}", - nfd: "\u{3309}", - nfkc: "\u{30AA}\u{30F3}\u{30B9}", - nfkd: "\u{30AA}\u{30F3}\u{30B9}", - }, - NormalizationTest { - source: "\u{330A}", - nfc: "\u{330A}", - nfd: "\u{330A}", - nfkc: "\u{30AA}\u{30FC}\u{30E0}", - nfkd: "\u{30AA}\u{30FC}\u{30E0}", - }, - NormalizationTest { - source: "\u{330B}", - nfc: "\u{330B}", - nfd: "\u{330B}", - nfkc: "\u{30AB}\u{30A4}\u{30EA}", - nfkd: "\u{30AB}\u{30A4}\u{30EA}", - }, - NormalizationTest { - source: "\u{330C}", - nfc: "\u{330C}", - nfd: "\u{330C}", - nfkc: "\u{30AB}\u{30E9}\u{30C3}\u{30C8}", - nfkd: "\u{30AB}\u{30E9}\u{30C3}\u{30C8}", - }, - NormalizationTest { - source: "\u{330D}", - nfc: "\u{330D}", - nfd: "\u{330D}", - nfkc: "\u{30AB}\u{30ED}\u{30EA}\u{30FC}", - nfkd: "\u{30AB}\u{30ED}\u{30EA}\u{30FC}", - }, - NormalizationTest { - source: "\u{330E}", - nfc: "\u{330E}", - nfd: "\u{330E}", - nfkc: "\u{30AC}\u{30ED}\u{30F3}", - nfkd: "\u{30AB}\u{3099}\u{30ED}\u{30F3}", - }, - NormalizationTest { - source: "\u{330F}", - nfc: "\u{330F}", - nfd: "\u{330F}", - nfkc: "\u{30AC}\u{30F3}\u{30DE}", - nfkd: "\u{30AB}\u{3099}\u{30F3}\u{30DE}", - }, - NormalizationTest { - source: "\u{3310}", - nfc: "\u{3310}", - nfd: "\u{3310}", - nfkc: "\u{30AE}\u{30AC}", - nfkd: "\u{30AD}\u{3099}\u{30AB}\u{3099}", - }, - NormalizationTest { - source: "\u{3311}", - nfc: "\u{3311}", - nfd: "\u{3311}", - nfkc: "\u{30AE}\u{30CB}\u{30FC}", - nfkd: "\u{30AD}\u{3099}\u{30CB}\u{30FC}", - }, - NormalizationTest { - source: "\u{3312}", - nfc: "\u{3312}", - nfd: "\u{3312}", - nfkc: "\u{30AD}\u{30E5}\u{30EA}\u{30FC}", - nfkd: "\u{30AD}\u{30E5}\u{30EA}\u{30FC}", - }, - NormalizationTest { - source: "\u{3313}", - nfc: "\u{3313}", - nfd: "\u{3313}", - nfkc: "\u{30AE}\u{30EB}\u{30C0}\u{30FC}", - nfkd: "\u{30AD}\u{3099}\u{30EB}\u{30BF}\u{3099}\u{30FC}", - }, - NormalizationTest { - source: "\u{3314}", - nfc: "\u{3314}", - nfd: "\u{3314}", - nfkc: "\u{30AD}\u{30ED}", - nfkd: "\u{30AD}\u{30ED}", - }, - NormalizationTest { - source: "\u{3315}", - nfc: "\u{3315}", - nfd: "\u{3315}", - nfkc: "\u{30AD}\u{30ED}\u{30B0}\u{30E9}\u{30E0}", - nfkd: "\u{30AD}\u{30ED}\u{30AF}\u{3099}\u{30E9}\u{30E0}", - }, - NormalizationTest { - source: "\u{3316}", - nfc: "\u{3316}", - nfd: "\u{3316}", - nfkc: "\u{30AD}\u{30ED}\u{30E1}\u{30FC}\u{30C8}\u{30EB}", - nfkd: "\u{30AD}\u{30ED}\u{30E1}\u{30FC}\u{30C8}\u{30EB}", - }, - NormalizationTest { - source: "\u{3317}", - nfc: "\u{3317}", - nfd: "\u{3317}", - nfkc: "\u{30AD}\u{30ED}\u{30EF}\u{30C3}\u{30C8}", - nfkd: "\u{30AD}\u{30ED}\u{30EF}\u{30C3}\u{30C8}", - }, - NormalizationTest { - source: "\u{3318}", - nfc: "\u{3318}", - nfd: "\u{3318}", - nfkc: "\u{30B0}\u{30E9}\u{30E0}", - nfkd: "\u{30AF}\u{3099}\u{30E9}\u{30E0}", - }, - NormalizationTest { - source: "\u{3319}", - nfc: "\u{3319}", - nfd: "\u{3319}", - nfkc: "\u{30B0}\u{30E9}\u{30E0}\u{30C8}\u{30F3}", - nfkd: "\u{30AF}\u{3099}\u{30E9}\u{30E0}\u{30C8}\u{30F3}", - }, - NormalizationTest { - source: "\u{331A}", - nfc: "\u{331A}", - nfd: "\u{331A}", - nfkc: "\u{30AF}\u{30EB}\u{30BC}\u{30A4}\u{30ED}", - nfkd: "\u{30AF}\u{30EB}\u{30BB}\u{3099}\u{30A4}\u{30ED}", - }, - NormalizationTest { - source: "\u{331B}", - nfc: "\u{331B}", - nfd: "\u{331B}", - nfkc: "\u{30AF}\u{30ED}\u{30FC}\u{30CD}", - nfkd: "\u{30AF}\u{30ED}\u{30FC}\u{30CD}", - }, - NormalizationTest { - source: "\u{331C}", - nfc: "\u{331C}", - nfd: "\u{331C}", - nfkc: "\u{30B1}\u{30FC}\u{30B9}", - nfkd: "\u{30B1}\u{30FC}\u{30B9}", - }, - NormalizationTest { - source: "\u{331D}", - nfc: "\u{331D}", - nfd: "\u{331D}", - nfkc: "\u{30B3}\u{30EB}\u{30CA}", - nfkd: "\u{30B3}\u{30EB}\u{30CA}", - }, - NormalizationTest { - source: "\u{331E}", - nfc: "\u{331E}", - nfd: "\u{331E}", - nfkc: "\u{30B3}\u{30FC}\u{30DD}", - nfkd: "\u{30B3}\u{30FC}\u{30DB}\u{309A}", - }, - NormalizationTest { - source: "\u{331F}", - nfc: "\u{331F}", - nfd: "\u{331F}", - nfkc: "\u{30B5}\u{30A4}\u{30AF}\u{30EB}", - nfkd: "\u{30B5}\u{30A4}\u{30AF}\u{30EB}", - }, - NormalizationTest { - source: "\u{3320}", - nfc: "\u{3320}", - nfd: "\u{3320}", - nfkc: "\u{30B5}\u{30F3}\u{30C1}\u{30FC}\u{30E0}", - nfkd: "\u{30B5}\u{30F3}\u{30C1}\u{30FC}\u{30E0}", - }, - NormalizationTest { - source: "\u{3321}", - nfc: "\u{3321}", - nfd: "\u{3321}", - nfkc: "\u{30B7}\u{30EA}\u{30F3}\u{30B0}", - nfkd: "\u{30B7}\u{30EA}\u{30F3}\u{30AF}\u{3099}", - }, - NormalizationTest { - source: "\u{3322}", - nfc: "\u{3322}", - nfd: "\u{3322}", - nfkc: "\u{30BB}\u{30F3}\u{30C1}", - nfkd: "\u{30BB}\u{30F3}\u{30C1}", - }, - NormalizationTest { - source: "\u{3323}", - nfc: "\u{3323}", - nfd: "\u{3323}", - nfkc: "\u{30BB}\u{30F3}\u{30C8}", - nfkd: "\u{30BB}\u{30F3}\u{30C8}", - }, - NormalizationTest { - source: "\u{3324}", - nfc: "\u{3324}", - nfd: "\u{3324}", - nfkc: "\u{30C0}\u{30FC}\u{30B9}", - nfkd: "\u{30BF}\u{3099}\u{30FC}\u{30B9}", - }, - NormalizationTest { - source: "\u{3325}", - nfc: "\u{3325}", - nfd: "\u{3325}", - nfkc: "\u{30C7}\u{30B7}", - nfkd: "\u{30C6}\u{3099}\u{30B7}", - }, - NormalizationTest { - source: "\u{3326}", - nfc: "\u{3326}", - nfd: "\u{3326}", - nfkc: "\u{30C9}\u{30EB}", - nfkd: "\u{30C8}\u{3099}\u{30EB}", - }, - NormalizationTest { - source: "\u{3327}", - nfc: "\u{3327}", - nfd: "\u{3327}", - nfkc: "\u{30C8}\u{30F3}", - nfkd: "\u{30C8}\u{30F3}", - }, - NormalizationTest { - source: "\u{3328}", - nfc: "\u{3328}", - nfd: "\u{3328}", - nfkc: "\u{30CA}\u{30CE}", - nfkd: "\u{30CA}\u{30CE}", - }, - NormalizationTest { - source: "\u{3329}", - nfc: "\u{3329}", - nfd: "\u{3329}", - nfkc: "\u{30CE}\u{30C3}\u{30C8}", - nfkd: "\u{30CE}\u{30C3}\u{30C8}", - }, - NormalizationTest { - source: "\u{332A}", - nfc: "\u{332A}", - nfd: "\u{332A}", - nfkc: "\u{30CF}\u{30A4}\u{30C4}", - nfkd: "\u{30CF}\u{30A4}\u{30C4}", - }, - NormalizationTest { - source: "\u{332B}", - nfc: "\u{332B}", - nfd: "\u{332B}", - nfkc: "\u{30D1}\u{30FC}\u{30BB}\u{30F3}\u{30C8}", - nfkd: "\u{30CF}\u{309A}\u{30FC}\u{30BB}\u{30F3}\u{30C8}", - }, - NormalizationTest { - source: "\u{332C}", - nfc: "\u{332C}", - nfd: "\u{332C}", - nfkc: "\u{30D1}\u{30FC}\u{30C4}", - nfkd: "\u{30CF}\u{309A}\u{30FC}\u{30C4}", - }, - NormalizationTest { - source: "\u{332D}", - nfc: "\u{332D}", - nfd: "\u{332D}", - nfkc: "\u{30D0}\u{30FC}\u{30EC}\u{30EB}", - nfkd: "\u{30CF}\u{3099}\u{30FC}\u{30EC}\u{30EB}", - }, - NormalizationTest { - source: "\u{332E}", - nfc: "\u{332E}", - nfd: "\u{332E}", - nfkc: "\u{30D4}\u{30A2}\u{30B9}\u{30C8}\u{30EB}", - nfkd: "\u{30D2}\u{309A}\u{30A2}\u{30B9}\u{30C8}\u{30EB}", - }, - NormalizationTest { - source: "\u{332F}", - nfc: "\u{332F}", - nfd: "\u{332F}", - nfkc: "\u{30D4}\u{30AF}\u{30EB}", - nfkd: "\u{30D2}\u{309A}\u{30AF}\u{30EB}", - }, - NormalizationTest { - source: "\u{3330}", - nfc: "\u{3330}", - nfd: "\u{3330}", - nfkc: "\u{30D4}\u{30B3}", - nfkd: "\u{30D2}\u{309A}\u{30B3}", - }, - NormalizationTest { - source: "\u{3331}", - nfc: "\u{3331}", - nfd: "\u{3331}", - nfkc: "\u{30D3}\u{30EB}", - nfkd: "\u{30D2}\u{3099}\u{30EB}", - }, - NormalizationTest { - source: "\u{3332}", - nfc: "\u{3332}", - nfd: "\u{3332}", - nfkc: "\u{30D5}\u{30A1}\u{30E9}\u{30C3}\u{30C9}", - nfkd: "\u{30D5}\u{30A1}\u{30E9}\u{30C3}\u{30C8}\u{3099}", - }, - NormalizationTest { - source: "\u{3333}", - nfc: "\u{3333}", - nfd: "\u{3333}", - nfkc: "\u{30D5}\u{30A3}\u{30FC}\u{30C8}", - nfkd: "\u{30D5}\u{30A3}\u{30FC}\u{30C8}", - }, - NormalizationTest { - source: "\u{3334}", - nfc: "\u{3334}", - nfd: "\u{3334}", - nfkc: "\u{30D6}\u{30C3}\u{30B7}\u{30A7}\u{30EB}", - nfkd: "\u{30D5}\u{3099}\u{30C3}\u{30B7}\u{30A7}\u{30EB}", - }, - NormalizationTest { - source: "\u{3335}", - nfc: "\u{3335}", - nfd: "\u{3335}", - nfkc: "\u{30D5}\u{30E9}\u{30F3}", - nfkd: "\u{30D5}\u{30E9}\u{30F3}", - }, - NormalizationTest { - source: "\u{3336}", - nfc: "\u{3336}", - nfd: "\u{3336}", - nfkc: "\u{30D8}\u{30AF}\u{30BF}\u{30FC}\u{30EB}", - nfkd: "\u{30D8}\u{30AF}\u{30BF}\u{30FC}\u{30EB}", - }, - NormalizationTest { - source: "\u{3337}", - nfc: "\u{3337}", - nfd: "\u{3337}", - nfkc: "\u{30DA}\u{30BD}", - nfkd: "\u{30D8}\u{309A}\u{30BD}", - }, - NormalizationTest { - source: "\u{3338}", - nfc: "\u{3338}", - nfd: "\u{3338}", - nfkc: "\u{30DA}\u{30CB}\u{30D2}", - nfkd: "\u{30D8}\u{309A}\u{30CB}\u{30D2}", - }, - NormalizationTest { - source: "\u{3339}", - nfc: "\u{3339}", - nfd: "\u{3339}", - nfkc: "\u{30D8}\u{30EB}\u{30C4}", - nfkd: "\u{30D8}\u{30EB}\u{30C4}", - }, - NormalizationTest { - source: "\u{333A}", - nfc: "\u{333A}", - nfd: "\u{333A}", - nfkc: "\u{30DA}\u{30F3}\u{30B9}", - nfkd: "\u{30D8}\u{309A}\u{30F3}\u{30B9}", - }, - NormalizationTest { - source: "\u{333B}", - nfc: "\u{333B}", - nfd: "\u{333B}", - nfkc: "\u{30DA}\u{30FC}\u{30B8}", - nfkd: "\u{30D8}\u{309A}\u{30FC}\u{30B7}\u{3099}", - }, - NormalizationTest { - source: "\u{333C}", - nfc: "\u{333C}", - nfd: "\u{333C}", - nfkc: "\u{30D9}\u{30FC}\u{30BF}", - nfkd: "\u{30D8}\u{3099}\u{30FC}\u{30BF}", - }, - NormalizationTest { - source: "\u{333D}", - nfc: "\u{333D}", - nfd: "\u{333D}", - nfkc: "\u{30DD}\u{30A4}\u{30F3}\u{30C8}", - nfkd: "\u{30DB}\u{309A}\u{30A4}\u{30F3}\u{30C8}", - }, - NormalizationTest { - source: "\u{333E}", - nfc: "\u{333E}", - nfd: "\u{333E}", - nfkc: "\u{30DC}\u{30EB}\u{30C8}", - nfkd: "\u{30DB}\u{3099}\u{30EB}\u{30C8}", - }, - NormalizationTest { - source: "\u{333F}", - nfc: "\u{333F}", - nfd: "\u{333F}", - nfkc: "\u{30DB}\u{30F3}", - nfkd: "\u{30DB}\u{30F3}", - }, - NormalizationTest { - source: "\u{3340}", - nfc: "\u{3340}", - nfd: "\u{3340}", - nfkc: "\u{30DD}\u{30F3}\u{30C9}", - nfkd: "\u{30DB}\u{309A}\u{30F3}\u{30C8}\u{3099}", - }, - NormalizationTest { - source: "\u{3341}", - nfc: "\u{3341}", - nfd: "\u{3341}", - nfkc: "\u{30DB}\u{30FC}\u{30EB}", - nfkd: "\u{30DB}\u{30FC}\u{30EB}", - }, - NormalizationTest { - source: "\u{3342}", - nfc: "\u{3342}", - nfd: "\u{3342}", - nfkc: "\u{30DB}\u{30FC}\u{30F3}", - nfkd: "\u{30DB}\u{30FC}\u{30F3}", - }, - NormalizationTest { - source: "\u{3343}", - nfc: "\u{3343}", - nfd: "\u{3343}", - nfkc: "\u{30DE}\u{30A4}\u{30AF}\u{30ED}", - nfkd: "\u{30DE}\u{30A4}\u{30AF}\u{30ED}", - }, - NormalizationTest { - source: "\u{3344}", - nfc: "\u{3344}", - nfd: "\u{3344}", - nfkc: "\u{30DE}\u{30A4}\u{30EB}", - nfkd: "\u{30DE}\u{30A4}\u{30EB}", - }, - NormalizationTest { - source: "\u{3345}", - nfc: "\u{3345}", - nfd: "\u{3345}", - nfkc: "\u{30DE}\u{30C3}\u{30CF}", - nfkd: "\u{30DE}\u{30C3}\u{30CF}", - }, - NormalizationTest { - source: "\u{3346}", - nfc: "\u{3346}", - nfd: "\u{3346}", - nfkc: "\u{30DE}\u{30EB}\u{30AF}", - nfkd: "\u{30DE}\u{30EB}\u{30AF}", - }, - NormalizationTest { - source: "\u{3347}", - nfc: "\u{3347}", - nfd: "\u{3347}", - nfkc: "\u{30DE}\u{30F3}\u{30B7}\u{30E7}\u{30F3}", - nfkd: "\u{30DE}\u{30F3}\u{30B7}\u{30E7}\u{30F3}", - }, - NormalizationTest { - source: "\u{3348}", - nfc: "\u{3348}", - nfd: "\u{3348}", - nfkc: "\u{30DF}\u{30AF}\u{30ED}\u{30F3}", - nfkd: "\u{30DF}\u{30AF}\u{30ED}\u{30F3}", - }, - NormalizationTest { - source: "\u{3349}", - nfc: "\u{3349}", - nfd: "\u{3349}", - nfkc: "\u{30DF}\u{30EA}", - nfkd: "\u{30DF}\u{30EA}", - }, - NormalizationTest { - source: "\u{334A}", - nfc: "\u{334A}", - nfd: "\u{334A}", - nfkc: "\u{30DF}\u{30EA}\u{30D0}\u{30FC}\u{30EB}", - nfkd: "\u{30DF}\u{30EA}\u{30CF}\u{3099}\u{30FC}\u{30EB}", - }, - NormalizationTest { - source: "\u{334B}", - nfc: "\u{334B}", - nfd: "\u{334B}", - nfkc: "\u{30E1}\u{30AC}", - nfkd: "\u{30E1}\u{30AB}\u{3099}", - }, - NormalizationTest { - source: "\u{334C}", - nfc: "\u{334C}", - nfd: "\u{334C}", - nfkc: "\u{30E1}\u{30AC}\u{30C8}\u{30F3}", - nfkd: "\u{30E1}\u{30AB}\u{3099}\u{30C8}\u{30F3}", - }, - NormalizationTest { - source: "\u{334D}", - nfc: "\u{334D}", - nfd: "\u{334D}", - nfkc: "\u{30E1}\u{30FC}\u{30C8}\u{30EB}", - nfkd: "\u{30E1}\u{30FC}\u{30C8}\u{30EB}", - }, - NormalizationTest { - source: "\u{334E}", - nfc: "\u{334E}", - nfd: "\u{334E}", - nfkc: "\u{30E4}\u{30FC}\u{30C9}", - nfkd: "\u{30E4}\u{30FC}\u{30C8}\u{3099}", - }, - NormalizationTest { - source: "\u{334F}", - nfc: "\u{334F}", - nfd: "\u{334F}", - nfkc: "\u{30E4}\u{30FC}\u{30EB}", - nfkd: "\u{30E4}\u{30FC}\u{30EB}", - }, - NormalizationTest { - source: "\u{3350}", - nfc: "\u{3350}", - nfd: "\u{3350}", - nfkc: "\u{30E6}\u{30A2}\u{30F3}", - nfkd: "\u{30E6}\u{30A2}\u{30F3}", - }, - NormalizationTest { - source: "\u{3351}", - nfc: "\u{3351}", - nfd: "\u{3351}", - nfkc: "\u{30EA}\u{30C3}\u{30C8}\u{30EB}", - nfkd: "\u{30EA}\u{30C3}\u{30C8}\u{30EB}", - }, - NormalizationTest { - source: "\u{3352}", - nfc: "\u{3352}", - nfd: "\u{3352}", - nfkc: "\u{30EA}\u{30E9}", - nfkd: "\u{30EA}\u{30E9}", - }, - NormalizationTest { - source: "\u{3353}", - nfc: "\u{3353}", - nfd: "\u{3353}", - nfkc: "\u{30EB}\u{30D4}\u{30FC}", - nfkd: "\u{30EB}\u{30D2}\u{309A}\u{30FC}", - }, - NormalizationTest { - source: "\u{3354}", - nfc: "\u{3354}", - nfd: "\u{3354}", - nfkc: "\u{30EB}\u{30FC}\u{30D6}\u{30EB}", - nfkd: "\u{30EB}\u{30FC}\u{30D5}\u{3099}\u{30EB}", - }, - NormalizationTest { - source: "\u{3355}", - nfc: "\u{3355}", - nfd: "\u{3355}", - nfkc: "\u{30EC}\u{30E0}", - nfkd: "\u{30EC}\u{30E0}", - }, - NormalizationTest { - source: "\u{3356}", - nfc: "\u{3356}", - nfd: "\u{3356}", - nfkc: "\u{30EC}\u{30F3}\u{30C8}\u{30B2}\u{30F3}", - nfkd: "\u{30EC}\u{30F3}\u{30C8}\u{30B1}\u{3099}\u{30F3}", - }, - NormalizationTest { - source: "\u{3357}", - nfc: "\u{3357}", - nfd: "\u{3357}", - nfkc: "\u{30EF}\u{30C3}\u{30C8}", - nfkd: "\u{30EF}\u{30C3}\u{30C8}", - }, - NormalizationTest { - source: "\u{3358}", - nfc: "\u{3358}", - nfd: "\u{3358}", - nfkc: "\u{0030}\u{70B9}", - nfkd: "\u{0030}\u{70B9}", - }, - NormalizationTest { - source: "\u{3359}", - nfc: "\u{3359}", - nfd: "\u{3359}", - nfkc: "\u{0031}\u{70B9}", - nfkd: "\u{0031}\u{70B9}", - }, - NormalizationTest { - source: "\u{335A}", - nfc: "\u{335A}", - nfd: "\u{335A}", - nfkc: "\u{0032}\u{70B9}", - nfkd: "\u{0032}\u{70B9}", - }, - NormalizationTest { - source: "\u{335B}", - nfc: "\u{335B}", - nfd: "\u{335B}", - nfkc: "\u{0033}\u{70B9}", - nfkd: "\u{0033}\u{70B9}", - }, - NormalizationTest { - source: "\u{335C}", - nfc: "\u{335C}", - nfd: "\u{335C}", - nfkc: "\u{0034}\u{70B9}", - nfkd: "\u{0034}\u{70B9}", - }, - NormalizationTest { - source: "\u{335D}", - nfc: "\u{335D}", - nfd: "\u{335D}", - nfkc: "\u{0035}\u{70B9}", - nfkd: "\u{0035}\u{70B9}", - }, - NormalizationTest { - source: "\u{335E}", - nfc: "\u{335E}", - nfd: "\u{335E}", - nfkc: "\u{0036}\u{70B9}", - nfkd: "\u{0036}\u{70B9}", - }, - NormalizationTest { - source: "\u{335F}", - nfc: "\u{335F}", - nfd: "\u{335F}", - nfkc: "\u{0037}\u{70B9}", - nfkd: "\u{0037}\u{70B9}", - }, - NormalizationTest { - source: "\u{3360}", - nfc: "\u{3360}", - nfd: "\u{3360}", - nfkc: "\u{0038}\u{70B9}", - nfkd: "\u{0038}\u{70B9}", - }, - NormalizationTest { - source: "\u{3361}", - nfc: "\u{3361}", - nfd: "\u{3361}", - nfkc: "\u{0039}\u{70B9}", - nfkd: "\u{0039}\u{70B9}", - }, - NormalizationTest { - source: "\u{3362}", - nfc: "\u{3362}", - nfd: "\u{3362}", - nfkc: "\u{0031}\u{0030}\u{70B9}", - nfkd: "\u{0031}\u{0030}\u{70B9}", - }, - NormalizationTest { - source: "\u{3363}", - nfc: "\u{3363}", - nfd: "\u{3363}", - nfkc: "\u{0031}\u{0031}\u{70B9}", - nfkd: "\u{0031}\u{0031}\u{70B9}", - }, - NormalizationTest { - source: "\u{3364}", - nfc: "\u{3364}", - nfd: "\u{3364}", - nfkc: "\u{0031}\u{0032}\u{70B9}", - nfkd: "\u{0031}\u{0032}\u{70B9}", - }, - NormalizationTest { - source: "\u{3365}", - nfc: "\u{3365}", - nfd: "\u{3365}", - nfkc: "\u{0031}\u{0033}\u{70B9}", - nfkd: "\u{0031}\u{0033}\u{70B9}", - }, - NormalizationTest { - source: "\u{3366}", - nfc: "\u{3366}", - nfd: "\u{3366}", - nfkc: "\u{0031}\u{0034}\u{70B9}", - nfkd: "\u{0031}\u{0034}\u{70B9}", - }, - NormalizationTest { - source: "\u{3367}", - nfc: "\u{3367}", - nfd: "\u{3367}", - nfkc: "\u{0031}\u{0035}\u{70B9}", - nfkd: "\u{0031}\u{0035}\u{70B9}", - }, - NormalizationTest { - source: "\u{3368}", - nfc: "\u{3368}", - nfd: "\u{3368}", - nfkc: "\u{0031}\u{0036}\u{70B9}", - nfkd: "\u{0031}\u{0036}\u{70B9}", - }, - NormalizationTest { - source: "\u{3369}", - nfc: "\u{3369}", - nfd: "\u{3369}", - nfkc: "\u{0031}\u{0037}\u{70B9}", - nfkd: "\u{0031}\u{0037}\u{70B9}", - }, - NormalizationTest { - source: "\u{336A}", - nfc: "\u{336A}", - nfd: "\u{336A}", - nfkc: "\u{0031}\u{0038}\u{70B9}", - nfkd: "\u{0031}\u{0038}\u{70B9}", - }, - NormalizationTest { - source: "\u{336B}", - nfc: "\u{336B}", - nfd: "\u{336B}", - nfkc: "\u{0031}\u{0039}\u{70B9}", - nfkd: "\u{0031}\u{0039}\u{70B9}", - }, - NormalizationTest { - source: "\u{336C}", - nfc: "\u{336C}", - nfd: "\u{336C}", - nfkc: "\u{0032}\u{0030}\u{70B9}", - nfkd: "\u{0032}\u{0030}\u{70B9}", - }, - NormalizationTest { - source: "\u{336D}", - nfc: "\u{336D}", - nfd: "\u{336D}", - nfkc: "\u{0032}\u{0031}\u{70B9}", - nfkd: "\u{0032}\u{0031}\u{70B9}", - }, - NormalizationTest { - source: "\u{336E}", - nfc: "\u{336E}", - nfd: "\u{336E}", - nfkc: "\u{0032}\u{0032}\u{70B9}", - nfkd: "\u{0032}\u{0032}\u{70B9}", - }, - NormalizationTest { - source: "\u{336F}", - nfc: "\u{336F}", - nfd: "\u{336F}", - nfkc: "\u{0032}\u{0033}\u{70B9}", - nfkd: "\u{0032}\u{0033}\u{70B9}", - }, - NormalizationTest { - source: "\u{3370}", - nfc: "\u{3370}", - nfd: "\u{3370}", - nfkc: "\u{0032}\u{0034}\u{70B9}", - nfkd: "\u{0032}\u{0034}\u{70B9}", - }, - NormalizationTest { - source: "\u{3371}", - nfc: "\u{3371}", - nfd: "\u{3371}", - nfkc: "\u{0068}\u{0050}\u{0061}", - nfkd: "\u{0068}\u{0050}\u{0061}", - }, - NormalizationTest { - source: "\u{3372}", - nfc: "\u{3372}", - nfd: "\u{3372}", - nfkc: "\u{0064}\u{0061}", - nfkd: "\u{0064}\u{0061}", - }, - NormalizationTest { - source: "\u{3373}", - nfc: "\u{3373}", - nfd: "\u{3373}", - nfkc: "\u{0041}\u{0055}", - nfkd: "\u{0041}\u{0055}", - }, - NormalizationTest { - source: "\u{3374}", - nfc: "\u{3374}", - nfd: "\u{3374}", - nfkc: "\u{0062}\u{0061}\u{0072}", - nfkd: "\u{0062}\u{0061}\u{0072}", - }, - NormalizationTest { - source: "\u{3375}", - nfc: "\u{3375}", - nfd: "\u{3375}", - nfkc: "\u{006F}\u{0056}", - nfkd: "\u{006F}\u{0056}", - }, - NormalizationTest { - source: "\u{3376}", - nfc: "\u{3376}", - nfd: "\u{3376}", - nfkc: "\u{0070}\u{0063}", - nfkd: "\u{0070}\u{0063}", - }, - NormalizationTest { - source: "\u{3377}", - nfc: "\u{3377}", - nfd: "\u{3377}", - nfkc: "\u{0064}\u{006D}", - nfkd: "\u{0064}\u{006D}", - }, - NormalizationTest { - source: "\u{3378}", - nfc: "\u{3378}", - nfd: "\u{3378}", - nfkc: "\u{0064}\u{006D}\u{0032}", - nfkd: "\u{0064}\u{006D}\u{0032}", - }, - NormalizationTest { - source: "\u{3379}", - nfc: "\u{3379}", - nfd: "\u{3379}", - nfkc: "\u{0064}\u{006D}\u{0033}", - nfkd: "\u{0064}\u{006D}\u{0033}", - }, - NormalizationTest { - source: "\u{337A}", - nfc: "\u{337A}", - nfd: "\u{337A}", - nfkc: "\u{0049}\u{0055}", - nfkd: "\u{0049}\u{0055}", - }, - NormalizationTest { - source: "\u{337B}", - nfc: "\u{337B}", - nfd: "\u{337B}", - nfkc: "\u{5E73}\u{6210}", - nfkd: "\u{5E73}\u{6210}", - }, - NormalizationTest { - source: "\u{337C}", - nfc: "\u{337C}", - nfd: "\u{337C}", - nfkc: "\u{662D}\u{548C}", - nfkd: "\u{662D}\u{548C}", - }, - NormalizationTest { - source: "\u{337D}", - nfc: "\u{337D}", - nfd: "\u{337D}", - nfkc: "\u{5927}\u{6B63}", - nfkd: "\u{5927}\u{6B63}", - }, - NormalizationTest { - source: "\u{337E}", - nfc: "\u{337E}", - nfd: "\u{337E}", - nfkc: "\u{660E}\u{6CBB}", - nfkd: "\u{660E}\u{6CBB}", - }, - NormalizationTest { - source: "\u{337F}", - nfc: "\u{337F}", - nfd: "\u{337F}", - nfkc: "\u{682A}\u{5F0F}\u{4F1A}\u{793E}", - nfkd: "\u{682A}\u{5F0F}\u{4F1A}\u{793E}", - }, - NormalizationTest { - source: "\u{3380}", - nfc: "\u{3380}", - nfd: "\u{3380}", - nfkc: "\u{0070}\u{0041}", - nfkd: "\u{0070}\u{0041}", - }, - NormalizationTest { - source: "\u{3381}", - nfc: "\u{3381}", - nfd: "\u{3381}", - nfkc: "\u{006E}\u{0041}", - nfkd: "\u{006E}\u{0041}", - }, - NormalizationTest { - source: "\u{3382}", - nfc: "\u{3382}", - nfd: "\u{3382}", - nfkc: "\u{03BC}\u{0041}", - nfkd: "\u{03BC}\u{0041}", - }, - NormalizationTest { - source: "\u{3383}", - nfc: "\u{3383}", - nfd: "\u{3383}", - nfkc: "\u{006D}\u{0041}", - nfkd: "\u{006D}\u{0041}", - }, - NormalizationTest { - source: "\u{3384}", - nfc: "\u{3384}", - nfd: "\u{3384}", - nfkc: "\u{006B}\u{0041}", - nfkd: "\u{006B}\u{0041}", - }, - NormalizationTest { - source: "\u{3385}", - nfc: "\u{3385}", - nfd: "\u{3385}", - nfkc: "\u{004B}\u{0042}", - nfkd: "\u{004B}\u{0042}", - }, - NormalizationTest { - source: "\u{3386}", - nfc: "\u{3386}", - nfd: "\u{3386}", - nfkc: "\u{004D}\u{0042}", - nfkd: "\u{004D}\u{0042}", - }, - NormalizationTest { - source: "\u{3387}", - nfc: "\u{3387}", - nfd: "\u{3387}", - nfkc: "\u{0047}\u{0042}", - nfkd: "\u{0047}\u{0042}", - }, - NormalizationTest { - source: "\u{3388}", - nfc: "\u{3388}", - nfd: "\u{3388}", - nfkc: "\u{0063}\u{0061}\u{006C}", - nfkd: "\u{0063}\u{0061}\u{006C}", - }, - NormalizationTest { - source: "\u{3389}", - nfc: "\u{3389}", - nfd: "\u{3389}", - nfkc: "\u{006B}\u{0063}\u{0061}\u{006C}", - nfkd: "\u{006B}\u{0063}\u{0061}\u{006C}", - }, - NormalizationTest { - source: "\u{338A}", - nfc: "\u{338A}", - nfd: "\u{338A}", - nfkc: "\u{0070}\u{0046}", - nfkd: "\u{0070}\u{0046}", - }, - NormalizationTest { - source: "\u{338B}", - nfc: "\u{338B}", - nfd: "\u{338B}", - nfkc: "\u{006E}\u{0046}", - nfkd: "\u{006E}\u{0046}", - }, - NormalizationTest { - source: "\u{338C}", - nfc: "\u{338C}", - nfd: "\u{338C}", - nfkc: "\u{03BC}\u{0046}", - nfkd: "\u{03BC}\u{0046}", - }, - NormalizationTest { - source: "\u{338D}", - nfc: "\u{338D}", - nfd: "\u{338D}", - nfkc: "\u{03BC}\u{0067}", - nfkd: "\u{03BC}\u{0067}", - }, - NormalizationTest { - source: "\u{338E}", - nfc: "\u{338E}", - nfd: "\u{338E}", - nfkc: "\u{006D}\u{0067}", - nfkd: "\u{006D}\u{0067}", - }, - NormalizationTest { - source: "\u{338F}", - nfc: "\u{338F}", - nfd: "\u{338F}", - nfkc: "\u{006B}\u{0067}", - nfkd: "\u{006B}\u{0067}", - }, - NormalizationTest { - source: "\u{3390}", - nfc: "\u{3390}", - nfd: "\u{3390}", - nfkc: "\u{0048}\u{007A}", - nfkd: "\u{0048}\u{007A}", - }, - NormalizationTest { - source: "\u{3391}", - nfc: "\u{3391}", - nfd: "\u{3391}", - nfkc: "\u{006B}\u{0048}\u{007A}", - nfkd: "\u{006B}\u{0048}\u{007A}", - }, - NormalizationTest { - source: "\u{3392}", - nfc: "\u{3392}", - nfd: "\u{3392}", - nfkc: "\u{004D}\u{0048}\u{007A}", - nfkd: "\u{004D}\u{0048}\u{007A}", - }, - NormalizationTest { - source: "\u{3393}", - nfc: "\u{3393}", - nfd: "\u{3393}", - nfkc: "\u{0047}\u{0048}\u{007A}", - nfkd: "\u{0047}\u{0048}\u{007A}", - }, - NormalizationTest { - source: "\u{3394}", - nfc: "\u{3394}", - nfd: "\u{3394}", - nfkc: "\u{0054}\u{0048}\u{007A}", - nfkd: "\u{0054}\u{0048}\u{007A}", - }, - NormalizationTest { - source: "\u{3395}", - nfc: "\u{3395}", - nfd: "\u{3395}", - nfkc: "\u{03BC}\u{006C}", - nfkd: "\u{03BC}\u{006C}", - }, - NormalizationTest { - source: "\u{3396}", - nfc: "\u{3396}", - nfd: "\u{3396}", - nfkc: "\u{006D}\u{006C}", - nfkd: "\u{006D}\u{006C}", - }, - NormalizationTest { - source: "\u{3397}", - nfc: "\u{3397}", - nfd: "\u{3397}", - nfkc: "\u{0064}\u{006C}", - nfkd: "\u{0064}\u{006C}", - }, - NormalizationTest { - source: "\u{3398}", - nfc: "\u{3398}", - nfd: "\u{3398}", - nfkc: "\u{006B}\u{006C}", - nfkd: "\u{006B}\u{006C}", - }, - NormalizationTest { - source: "\u{3399}", - nfc: "\u{3399}", - nfd: "\u{3399}", - nfkc: "\u{0066}\u{006D}", - nfkd: "\u{0066}\u{006D}", - }, - NormalizationTest { - source: "\u{339A}", - nfc: "\u{339A}", - nfd: "\u{339A}", - nfkc: "\u{006E}\u{006D}", - nfkd: "\u{006E}\u{006D}", - }, - NormalizationTest { - source: "\u{339B}", - nfc: "\u{339B}", - nfd: "\u{339B}", - nfkc: "\u{03BC}\u{006D}", - nfkd: "\u{03BC}\u{006D}", - }, - NormalizationTest { - source: "\u{339C}", - nfc: "\u{339C}", - nfd: "\u{339C}", - nfkc: "\u{006D}\u{006D}", - nfkd: "\u{006D}\u{006D}", - }, - NormalizationTest { - source: "\u{339D}", - nfc: "\u{339D}", - nfd: "\u{339D}", - nfkc: "\u{0063}\u{006D}", - nfkd: "\u{0063}\u{006D}", - }, - NormalizationTest { - source: "\u{339E}", - nfc: "\u{339E}", - nfd: "\u{339E}", - nfkc: "\u{006B}\u{006D}", - nfkd: "\u{006B}\u{006D}", - }, - NormalizationTest { - source: "\u{339F}", - nfc: "\u{339F}", - nfd: "\u{339F}", - nfkc: "\u{006D}\u{006D}\u{0032}", - nfkd: "\u{006D}\u{006D}\u{0032}", - }, - NormalizationTest { - source: "\u{33A0}", - nfc: "\u{33A0}", - nfd: "\u{33A0}", - nfkc: "\u{0063}\u{006D}\u{0032}", - nfkd: "\u{0063}\u{006D}\u{0032}", - }, - NormalizationTest { - source: "\u{33A1}", - nfc: "\u{33A1}", - nfd: "\u{33A1}", - nfkc: "\u{006D}\u{0032}", - nfkd: "\u{006D}\u{0032}", - }, - NormalizationTest { - source: "\u{33A2}", - nfc: "\u{33A2}", - nfd: "\u{33A2}", - nfkc: "\u{006B}\u{006D}\u{0032}", - nfkd: "\u{006B}\u{006D}\u{0032}", - }, - NormalizationTest { - source: "\u{33A3}", - nfc: "\u{33A3}", - nfd: "\u{33A3}", - nfkc: "\u{006D}\u{006D}\u{0033}", - nfkd: "\u{006D}\u{006D}\u{0033}", - }, - NormalizationTest { - source: "\u{33A4}", - nfc: "\u{33A4}", - nfd: "\u{33A4}", - nfkc: "\u{0063}\u{006D}\u{0033}", - nfkd: "\u{0063}\u{006D}\u{0033}", - }, - NormalizationTest { - source: "\u{33A5}", - nfc: "\u{33A5}", - nfd: "\u{33A5}", - nfkc: "\u{006D}\u{0033}", - nfkd: "\u{006D}\u{0033}", - }, - NormalizationTest { - source: "\u{33A6}", - nfc: "\u{33A6}", - nfd: "\u{33A6}", - nfkc: "\u{006B}\u{006D}\u{0033}", - nfkd: "\u{006B}\u{006D}\u{0033}", - }, - NormalizationTest { - source: "\u{33A7}", - nfc: "\u{33A7}", - nfd: "\u{33A7}", - nfkc: "\u{006D}\u{2215}\u{0073}", - nfkd: "\u{006D}\u{2215}\u{0073}", - }, - NormalizationTest { - source: "\u{33A8}", - nfc: "\u{33A8}", - nfd: "\u{33A8}", - nfkc: "\u{006D}\u{2215}\u{0073}\u{0032}", - nfkd: "\u{006D}\u{2215}\u{0073}\u{0032}", - }, - NormalizationTest { - source: "\u{33A9}", - nfc: "\u{33A9}", - nfd: "\u{33A9}", - nfkc: "\u{0050}\u{0061}", - nfkd: "\u{0050}\u{0061}", - }, - NormalizationTest { - source: "\u{33AA}", - nfc: "\u{33AA}", - nfd: "\u{33AA}", - nfkc: "\u{006B}\u{0050}\u{0061}", - nfkd: "\u{006B}\u{0050}\u{0061}", - }, - NormalizationTest { - source: "\u{33AB}", - nfc: "\u{33AB}", - nfd: "\u{33AB}", - nfkc: "\u{004D}\u{0050}\u{0061}", - nfkd: "\u{004D}\u{0050}\u{0061}", - }, - NormalizationTest { - source: "\u{33AC}", - nfc: "\u{33AC}", - nfd: "\u{33AC}", - nfkc: "\u{0047}\u{0050}\u{0061}", - nfkd: "\u{0047}\u{0050}\u{0061}", - }, - NormalizationTest { - source: "\u{33AD}", - nfc: "\u{33AD}", - nfd: "\u{33AD}", - nfkc: "\u{0072}\u{0061}\u{0064}", - nfkd: "\u{0072}\u{0061}\u{0064}", - }, - NormalizationTest { - source: "\u{33AE}", - nfc: "\u{33AE}", - nfd: "\u{33AE}", - nfkc: "\u{0072}\u{0061}\u{0064}\u{2215}\u{0073}", - nfkd: "\u{0072}\u{0061}\u{0064}\u{2215}\u{0073}", - }, - NormalizationTest { - source: "\u{33AF}", - nfc: "\u{33AF}", - nfd: "\u{33AF}", - nfkc: "\u{0072}\u{0061}\u{0064}\u{2215}\u{0073}\u{0032}", - nfkd: "\u{0072}\u{0061}\u{0064}\u{2215}\u{0073}\u{0032}", - }, - NormalizationTest { - source: "\u{33B0}", - nfc: "\u{33B0}", - nfd: "\u{33B0}", - nfkc: "\u{0070}\u{0073}", - nfkd: "\u{0070}\u{0073}", - }, - NormalizationTest { - source: "\u{33B1}", - nfc: "\u{33B1}", - nfd: "\u{33B1}", - nfkc: "\u{006E}\u{0073}", - nfkd: "\u{006E}\u{0073}", - }, - NormalizationTest { - source: "\u{33B2}", - nfc: "\u{33B2}", - nfd: "\u{33B2}", - nfkc: "\u{03BC}\u{0073}", - nfkd: "\u{03BC}\u{0073}", - }, - NormalizationTest { - source: "\u{33B3}", - nfc: "\u{33B3}", - nfd: "\u{33B3}", - nfkc: "\u{006D}\u{0073}", - nfkd: "\u{006D}\u{0073}", - }, - NormalizationTest { - source: "\u{33B4}", - nfc: "\u{33B4}", - nfd: "\u{33B4}", - nfkc: "\u{0070}\u{0056}", - nfkd: "\u{0070}\u{0056}", - }, - NormalizationTest { - source: "\u{33B5}", - nfc: "\u{33B5}", - nfd: "\u{33B5}", - nfkc: "\u{006E}\u{0056}", - nfkd: "\u{006E}\u{0056}", - }, - NormalizationTest { - source: "\u{33B6}", - nfc: "\u{33B6}", - nfd: "\u{33B6}", - nfkc: "\u{03BC}\u{0056}", - nfkd: "\u{03BC}\u{0056}", - }, - NormalizationTest { - source: "\u{33B7}", - nfc: "\u{33B7}", - nfd: "\u{33B7}", - nfkc: "\u{006D}\u{0056}", - nfkd: "\u{006D}\u{0056}", - }, - NormalizationTest { - source: "\u{33B8}", - nfc: "\u{33B8}", - nfd: "\u{33B8}", - nfkc: "\u{006B}\u{0056}", - nfkd: "\u{006B}\u{0056}", - }, - NormalizationTest { - source: "\u{33B9}", - nfc: "\u{33B9}", - nfd: "\u{33B9}", - nfkc: "\u{004D}\u{0056}", - nfkd: "\u{004D}\u{0056}", - }, - NormalizationTest { - source: "\u{33BA}", - nfc: "\u{33BA}", - nfd: "\u{33BA}", - nfkc: "\u{0070}\u{0057}", - nfkd: "\u{0070}\u{0057}", - }, - NormalizationTest { - source: "\u{33BB}", - nfc: "\u{33BB}", - nfd: "\u{33BB}", - nfkc: "\u{006E}\u{0057}", - nfkd: "\u{006E}\u{0057}", - }, - NormalizationTest { - source: "\u{33BC}", - nfc: "\u{33BC}", - nfd: "\u{33BC}", - nfkc: "\u{03BC}\u{0057}", - nfkd: "\u{03BC}\u{0057}", - }, - NormalizationTest { - source: "\u{33BD}", - nfc: "\u{33BD}", - nfd: "\u{33BD}", - nfkc: "\u{006D}\u{0057}", - nfkd: "\u{006D}\u{0057}", - }, - NormalizationTest { - source: "\u{33BE}", - nfc: "\u{33BE}", - nfd: "\u{33BE}", - nfkc: "\u{006B}\u{0057}", - nfkd: "\u{006B}\u{0057}", - }, - NormalizationTest { - source: "\u{33BF}", - nfc: "\u{33BF}", - nfd: "\u{33BF}", - nfkc: "\u{004D}\u{0057}", - nfkd: "\u{004D}\u{0057}", - }, - NormalizationTest { - source: "\u{33C0}", - nfc: "\u{33C0}", - nfd: "\u{33C0}", - nfkc: "\u{006B}\u{03A9}", - nfkd: "\u{006B}\u{03A9}", - }, - NormalizationTest { - source: "\u{33C1}", - nfc: "\u{33C1}", - nfd: "\u{33C1}", - nfkc: "\u{004D}\u{03A9}", - nfkd: "\u{004D}\u{03A9}", - }, - NormalizationTest { - source: "\u{33C2}", - nfc: "\u{33C2}", - nfd: "\u{33C2}", - nfkc: "\u{0061}\u{002E}\u{006D}\u{002E}", - nfkd: "\u{0061}\u{002E}\u{006D}\u{002E}", - }, - NormalizationTest { - source: "\u{33C3}", - nfc: "\u{33C3}", - nfd: "\u{33C3}", - nfkc: "\u{0042}\u{0071}", - nfkd: "\u{0042}\u{0071}", - }, - NormalizationTest { - source: "\u{33C4}", - nfc: "\u{33C4}", - nfd: "\u{33C4}", - nfkc: "\u{0063}\u{0063}", - nfkd: "\u{0063}\u{0063}", - }, - NormalizationTest { - source: "\u{33C5}", - nfc: "\u{33C5}", - nfd: "\u{33C5}", - nfkc: "\u{0063}\u{0064}", - nfkd: "\u{0063}\u{0064}", - }, - NormalizationTest { - source: "\u{33C6}", - nfc: "\u{33C6}", - nfd: "\u{33C6}", - nfkc: "\u{0043}\u{2215}\u{006B}\u{0067}", - nfkd: "\u{0043}\u{2215}\u{006B}\u{0067}", - }, - NormalizationTest { - source: "\u{33C7}", - nfc: "\u{33C7}", - nfd: "\u{33C7}", - nfkc: "\u{0043}\u{006F}\u{002E}", - nfkd: "\u{0043}\u{006F}\u{002E}", - }, - NormalizationTest { - source: "\u{33C8}", - nfc: "\u{33C8}", - nfd: "\u{33C8}", - nfkc: "\u{0064}\u{0042}", - nfkd: "\u{0064}\u{0042}", - }, - NormalizationTest { - source: "\u{33C9}", - nfc: "\u{33C9}", - nfd: "\u{33C9}", - nfkc: "\u{0047}\u{0079}", - nfkd: "\u{0047}\u{0079}", - }, - NormalizationTest { - source: "\u{33CA}", - nfc: "\u{33CA}", - nfd: "\u{33CA}", - nfkc: "\u{0068}\u{0061}", - nfkd: "\u{0068}\u{0061}", - }, - NormalizationTest { - source: "\u{33CB}", - nfc: "\u{33CB}", - nfd: "\u{33CB}", - nfkc: "\u{0048}\u{0050}", - nfkd: "\u{0048}\u{0050}", - }, - NormalizationTest { - source: "\u{33CC}", - nfc: "\u{33CC}", - nfd: "\u{33CC}", - nfkc: "\u{0069}\u{006E}", - nfkd: "\u{0069}\u{006E}", - }, - NormalizationTest { - source: "\u{33CD}", - nfc: "\u{33CD}", - nfd: "\u{33CD}", - nfkc: "\u{004B}\u{004B}", - nfkd: "\u{004B}\u{004B}", - }, - NormalizationTest { - source: "\u{33CE}", - nfc: "\u{33CE}", - nfd: "\u{33CE}", - nfkc: "\u{004B}\u{004D}", - nfkd: "\u{004B}\u{004D}", - }, - NormalizationTest { - source: "\u{33CF}", - nfc: "\u{33CF}", - nfd: "\u{33CF}", - nfkc: "\u{006B}\u{0074}", - nfkd: "\u{006B}\u{0074}", - }, - NormalizationTest { - source: "\u{33D0}", - nfc: "\u{33D0}", - nfd: "\u{33D0}", - nfkc: "\u{006C}\u{006D}", - nfkd: "\u{006C}\u{006D}", - }, - NormalizationTest { - source: "\u{33D1}", - nfc: "\u{33D1}", - nfd: "\u{33D1}", - nfkc: "\u{006C}\u{006E}", - nfkd: "\u{006C}\u{006E}", - }, - NormalizationTest { - source: "\u{33D2}", - nfc: "\u{33D2}", - nfd: "\u{33D2}", - nfkc: "\u{006C}\u{006F}\u{0067}", - nfkd: "\u{006C}\u{006F}\u{0067}", - }, - NormalizationTest { - source: "\u{33D3}", - nfc: "\u{33D3}", - nfd: "\u{33D3}", - nfkc: "\u{006C}\u{0078}", - nfkd: "\u{006C}\u{0078}", - }, - NormalizationTest { - source: "\u{33D4}", - nfc: "\u{33D4}", - nfd: "\u{33D4}", - nfkc: "\u{006D}\u{0062}", - nfkd: "\u{006D}\u{0062}", - }, - NormalizationTest { - source: "\u{33D5}", - nfc: "\u{33D5}", - nfd: "\u{33D5}", - nfkc: "\u{006D}\u{0069}\u{006C}", - nfkd: "\u{006D}\u{0069}\u{006C}", - }, - NormalizationTest { - source: "\u{33D6}", - nfc: "\u{33D6}", - nfd: "\u{33D6}", - nfkc: "\u{006D}\u{006F}\u{006C}", - nfkd: "\u{006D}\u{006F}\u{006C}", - }, - NormalizationTest { - source: "\u{33D7}", - nfc: "\u{33D7}", - nfd: "\u{33D7}", - nfkc: "\u{0050}\u{0048}", - nfkd: "\u{0050}\u{0048}", - }, - NormalizationTest { - source: "\u{33D8}", - nfc: "\u{33D8}", - nfd: "\u{33D8}", - nfkc: "\u{0070}\u{002E}\u{006D}\u{002E}", - nfkd: "\u{0070}\u{002E}\u{006D}\u{002E}", - }, - NormalizationTest { - source: "\u{33D9}", - nfc: "\u{33D9}", - nfd: "\u{33D9}", - nfkc: "\u{0050}\u{0050}\u{004D}", - nfkd: "\u{0050}\u{0050}\u{004D}", - }, - NormalizationTest { - source: "\u{33DA}", - nfc: "\u{33DA}", - nfd: "\u{33DA}", - nfkc: "\u{0050}\u{0052}", - nfkd: "\u{0050}\u{0052}", - }, - NormalizationTest { - source: "\u{33DB}", - nfc: "\u{33DB}", - nfd: "\u{33DB}", - nfkc: "\u{0073}\u{0072}", - nfkd: "\u{0073}\u{0072}", - }, - NormalizationTest { - source: "\u{33DC}", - nfc: "\u{33DC}", - nfd: "\u{33DC}", - nfkc: "\u{0053}\u{0076}", - nfkd: "\u{0053}\u{0076}", - }, - NormalizationTest { - source: "\u{33DD}", - nfc: "\u{33DD}", - nfd: "\u{33DD}", - nfkc: "\u{0057}\u{0062}", - nfkd: "\u{0057}\u{0062}", - }, - NormalizationTest { - source: "\u{33DE}", - nfc: "\u{33DE}", - nfd: "\u{33DE}", - nfkc: "\u{0056}\u{2215}\u{006D}", - nfkd: "\u{0056}\u{2215}\u{006D}", - }, - NormalizationTest { - source: "\u{33DF}", - nfc: "\u{33DF}", - nfd: "\u{33DF}", - nfkc: "\u{0041}\u{2215}\u{006D}", - nfkd: "\u{0041}\u{2215}\u{006D}", - }, - NormalizationTest { - source: "\u{33E0}", - nfc: "\u{33E0}", - nfd: "\u{33E0}", - nfkc: "\u{0031}\u{65E5}", - nfkd: "\u{0031}\u{65E5}", - }, - NormalizationTest { - source: "\u{33E1}", - nfc: "\u{33E1}", - nfd: "\u{33E1}", - nfkc: "\u{0032}\u{65E5}", - nfkd: "\u{0032}\u{65E5}", - }, - NormalizationTest { - source: "\u{33E2}", - nfc: "\u{33E2}", - nfd: "\u{33E2}", - nfkc: "\u{0033}\u{65E5}", - nfkd: "\u{0033}\u{65E5}", - }, - NormalizationTest { - source: "\u{33E3}", - nfc: "\u{33E3}", - nfd: "\u{33E3}", - nfkc: "\u{0034}\u{65E5}", - nfkd: "\u{0034}\u{65E5}", - }, - NormalizationTest { - source: "\u{33E4}", - nfc: "\u{33E4}", - nfd: "\u{33E4}", - nfkc: "\u{0035}\u{65E5}", - nfkd: "\u{0035}\u{65E5}", - }, - NormalizationTest { - source: "\u{33E5}", - nfc: "\u{33E5}", - nfd: "\u{33E5}", - nfkc: "\u{0036}\u{65E5}", - nfkd: "\u{0036}\u{65E5}", - }, - NormalizationTest { - source: "\u{33E6}", - nfc: "\u{33E6}", - nfd: "\u{33E6}", - nfkc: "\u{0037}\u{65E5}", - nfkd: "\u{0037}\u{65E5}", - }, - NormalizationTest { - source: "\u{33E7}", - nfc: "\u{33E7}", - nfd: "\u{33E7}", - nfkc: "\u{0038}\u{65E5}", - nfkd: "\u{0038}\u{65E5}", - }, - NormalizationTest { - source: "\u{33E8}", - nfc: "\u{33E8}", - nfd: "\u{33E8}", - nfkc: "\u{0039}\u{65E5}", - nfkd: "\u{0039}\u{65E5}", - }, - NormalizationTest { - source: "\u{33E9}", - nfc: "\u{33E9}", - nfd: "\u{33E9}", - nfkc: "\u{0031}\u{0030}\u{65E5}", - nfkd: "\u{0031}\u{0030}\u{65E5}", - }, - NormalizationTest { - source: "\u{33EA}", - nfc: "\u{33EA}", - nfd: "\u{33EA}", - nfkc: "\u{0031}\u{0031}\u{65E5}", - nfkd: "\u{0031}\u{0031}\u{65E5}", - }, - NormalizationTest { - source: "\u{33EB}", - nfc: "\u{33EB}", - nfd: "\u{33EB}", - nfkc: "\u{0031}\u{0032}\u{65E5}", - nfkd: "\u{0031}\u{0032}\u{65E5}", - }, - NormalizationTest { - source: "\u{33EC}", - nfc: "\u{33EC}", - nfd: "\u{33EC}", - nfkc: "\u{0031}\u{0033}\u{65E5}", - nfkd: "\u{0031}\u{0033}\u{65E5}", - }, - NormalizationTest { - source: "\u{33ED}", - nfc: "\u{33ED}", - nfd: "\u{33ED}", - nfkc: "\u{0031}\u{0034}\u{65E5}", - nfkd: "\u{0031}\u{0034}\u{65E5}", - }, - NormalizationTest { - source: "\u{33EE}", - nfc: "\u{33EE}", - nfd: "\u{33EE}", - nfkc: "\u{0031}\u{0035}\u{65E5}", - nfkd: "\u{0031}\u{0035}\u{65E5}", - }, - NormalizationTest { - source: "\u{33EF}", - nfc: "\u{33EF}", - nfd: "\u{33EF}", - nfkc: "\u{0031}\u{0036}\u{65E5}", - nfkd: "\u{0031}\u{0036}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F0}", - nfc: "\u{33F0}", - nfd: "\u{33F0}", - nfkc: "\u{0031}\u{0037}\u{65E5}", - nfkd: "\u{0031}\u{0037}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F1}", - nfc: "\u{33F1}", - nfd: "\u{33F1}", - nfkc: "\u{0031}\u{0038}\u{65E5}", - nfkd: "\u{0031}\u{0038}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F2}", - nfc: "\u{33F2}", - nfd: "\u{33F2}", - nfkc: "\u{0031}\u{0039}\u{65E5}", - nfkd: "\u{0031}\u{0039}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F3}", - nfc: "\u{33F3}", - nfd: "\u{33F3}", - nfkc: "\u{0032}\u{0030}\u{65E5}", - nfkd: "\u{0032}\u{0030}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F4}", - nfc: "\u{33F4}", - nfd: "\u{33F4}", - nfkc: "\u{0032}\u{0031}\u{65E5}", - nfkd: "\u{0032}\u{0031}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F5}", - nfc: "\u{33F5}", - nfd: "\u{33F5}", - nfkc: "\u{0032}\u{0032}\u{65E5}", - nfkd: "\u{0032}\u{0032}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F6}", - nfc: "\u{33F6}", - nfd: "\u{33F6}", - nfkc: "\u{0032}\u{0033}\u{65E5}", - nfkd: "\u{0032}\u{0033}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F7}", - nfc: "\u{33F7}", - nfd: "\u{33F7}", - nfkc: "\u{0032}\u{0034}\u{65E5}", - nfkd: "\u{0032}\u{0034}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F8}", - nfc: "\u{33F8}", - nfd: "\u{33F8}", - nfkc: "\u{0032}\u{0035}\u{65E5}", - nfkd: "\u{0032}\u{0035}\u{65E5}", - }, - NormalizationTest { - source: "\u{33F9}", - nfc: "\u{33F9}", - nfd: "\u{33F9}", - nfkc: "\u{0032}\u{0036}\u{65E5}", - nfkd: "\u{0032}\u{0036}\u{65E5}", - }, - NormalizationTest { - source: "\u{33FA}", - nfc: "\u{33FA}", - nfd: "\u{33FA}", - nfkc: "\u{0032}\u{0037}\u{65E5}", - nfkd: "\u{0032}\u{0037}\u{65E5}", - }, - NormalizationTest { - source: "\u{33FB}", - nfc: "\u{33FB}", - nfd: "\u{33FB}", - nfkc: "\u{0032}\u{0038}\u{65E5}", - nfkd: "\u{0032}\u{0038}\u{65E5}", - }, - NormalizationTest { - source: "\u{33FC}", - nfc: "\u{33FC}", - nfd: "\u{33FC}", - nfkc: "\u{0032}\u{0039}\u{65E5}", - nfkd: "\u{0032}\u{0039}\u{65E5}", - }, - NormalizationTest { - source: "\u{33FD}", - nfc: "\u{33FD}", - nfd: "\u{33FD}", - nfkc: "\u{0033}\u{0030}\u{65E5}", - nfkd: "\u{0033}\u{0030}\u{65E5}", - }, - NormalizationTest { - source: "\u{33FE}", - nfc: "\u{33FE}", - nfd: "\u{33FE}", - nfkc: "\u{0033}\u{0031}\u{65E5}", - nfkd: "\u{0033}\u{0031}\u{65E5}", - }, - NormalizationTest { - source: "\u{33FF}", - nfc: "\u{33FF}", - nfd: "\u{33FF}", - nfkc: "\u{0067}\u{0061}\u{006C}", - nfkd: "\u{0067}\u{0061}\u{006C}", - }, - NormalizationTest { - source: "\u{A69C}", - nfc: "\u{A69C}", - nfd: "\u{A69C}", - nfkc: "\u{044A}", - nfkd: "\u{044A}", - }, - NormalizationTest { - source: "\u{A69D}", - nfc: "\u{A69D}", - nfd: "\u{A69D}", - nfkc: "\u{044C}", - nfkd: "\u{044C}", - }, - NormalizationTest { - source: "\u{A770}", - nfc: "\u{A770}", - nfd: "\u{A770}", - nfkc: "\u{A76F}", - nfkd: "\u{A76F}", - }, - NormalizationTest { - source: "\u{A7F8}", - nfc: "\u{A7F8}", - nfd: "\u{A7F8}", - nfkc: "\u{0126}", - nfkd: "\u{0126}", - }, - NormalizationTest { - source: "\u{A7F9}", - nfc: "\u{A7F9}", - nfd: "\u{A7F9}", - nfkc: "\u{0153}", - nfkd: "\u{0153}", - }, - NormalizationTest { - source: "\u{AB5C}", - nfc: "\u{AB5C}", - nfd: "\u{AB5C}", - nfkc: "\u{A727}", - nfkd: "\u{A727}", - }, - NormalizationTest { - source: "\u{AB5D}", - nfc: "\u{AB5D}", - nfd: "\u{AB5D}", - nfkc: "\u{AB37}", - nfkd: "\u{AB37}", - }, - NormalizationTest { - source: "\u{AB5E}", - nfc: "\u{AB5E}", - nfd: "\u{AB5E}", - nfkc: "\u{026B}", - nfkd: "\u{026B}", - }, - NormalizationTest { - source: "\u{AB5F}", - nfc: "\u{AB5F}", - nfd: "\u{AB5F}", - nfkc: "\u{AB52}", - nfkd: "\u{AB52}", - }, - NormalizationTest { - source: "\u{AC00}", - nfc: "\u{AC00}", - nfd: "\u{1100}\u{1161}", - nfkc: "\u{AC00}", - nfkd: "\u{1100}\u{1161}", - }, - NormalizationTest { - source: "\u{AC01}", - nfc: "\u{AC01}", - nfd: "\u{1100}\u{1161}\u{11A8}", - nfkc: "\u{AC01}", - nfkd: "\u{1100}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{AC02}", - nfc: "\u{AC02}", - nfd: "\u{1100}\u{1161}\u{11A9}", - nfkc: "\u{AC02}", - nfkd: "\u{1100}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{AC03}", - nfc: "\u{AC03}", - nfd: "\u{1100}\u{1161}\u{11AA}", - nfkc: "\u{AC03}", - nfkd: "\u{1100}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{AC04}", - nfc: "\u{AC04}", - nfd: "\u{1100}\u{1161}\u{11AB}", - nfkc: "\u{AC04}", - nfkd: "\u{1100}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{AC05}", - nfc: "\u{AC05}", - nfd: "\u{1100}\u{1161}\u{11AC}", - nfkc: "\u{AC05}", - nfkd: "\u{1100}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{AC06}", - nfc: "\u{AC06}", - nfd: "\u{1100}\u{1161}\u{11AD}", - nfkc: "\u{AC06}", - nfkd: "\u{1100}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{AC07}", - nfc: "\u{AC07}", - nfd: "\u{1100}\u{1161}\u{11AE}", - nfkc: "\u{AC07}", - nfkd: "\u{1100}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{AC08}", - nfc: "\u{AC08}", - nfd: "\u{1100}\u{1161}\u{11AF}", - nfkc: "\u{AC08}", - nfkd: "\u{1100}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{AC09}", - nfc: "\u{AC09}", - nfd: "\u{1100}\u{1161}\u{11B0}", - nfkc: "\u{AC09}", - nfkd: "\u{1100}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{AC0A}", - nfc: "\u{AC0A}", - nfd: "\u{1100}\u{1161}\u{11B1}", - nfkc: "\u{AC0A}", - nfkd: "\u{1100}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{AC0B}", - nfc: "\u{AC0B}", - nfd: "\u{1100}\u{1161}\u{11B2}", - nfkc: "\u{AC0B}", - nfkd: "\u{1100}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{AC0C}", - nfc: "\u{AC0C}", - nfd: "\u{1100}\u{1161}\u{11B3}", - nfkc: "\u{AC0C}", - nfkd: "\u{1100}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{AC0D}", - nfc: "\u{AC0D}", - nfd: "\u{1100}\u{1161}\u{11B4}", - nfkc: "\u{AC0D}", - nfkd: "\u{1100}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{AC0E}", - nfc: "\u{AC0E}", - nfd: "\u{1100}\u{1161}\u{11B5}", - nfkc: "\u{AC0E}", - nfkd: "\u{1100}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{AC0F}", - nfc: "\u{AC0F}", - nfd: "\u{1100}\u{1161}\u{11B6}", - nfkc: "\u{AC0F}", - nfkd: "\u{1100}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{AC10}", - nfc: "\u{AC10}", - nfd: "\u{1100}\u{1161}\u{11B7}", - nfkc: "\u{AC10}", - nfkd: "\u{1100}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{AC11}", - nfc: "\u{AC11}", - nfd: "\u{1100}\u{1161}\u{11B8}", - nfkc: "\u{AC11}", - nfkd: "\u{1100}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{AC12}", - nfc: "\u{AC12}", - nfd: "\u{1100}\u{1161}\u{11B9}", - nfkc: "\u{AC12}", - nfkd: "\u{1100}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{AC13}", - nfc: "\u{AC13}", - nfd: "\u{1100}\u{1161}\u{11BA}", - nfkc: "\u{AC13}", - nfkd: "\u{1100}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{AC14}", - nfc: "\u{AC14}", - nfd: "\u{1100}\u{1161}\u{11BB}", - nfkc: "\u{AC14}", - nfkd: "\u{1100}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{AC15}", - nfc: "\u{AC15}", - nfd: "\u{1100}\u{1161}\u{11BC}", - nfkc: "\u{AC15}", - nfkd: "\u{1100}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{AC16}", - nfc: "\u{AC16}", - nfd: "\u{1100}\u{1161}\u{11BD}", - nfkc: "\u{AC16}", - nfkd: "\u{1100}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{AC17}", - nfc: "\u{AC17}", - nfd: "\u{1100}\u{1161}\u{11BE}", - nfkc: "\u{AC17}", - nfkd: "\u{1100}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{AC18}", - nfc: "\u{AC18}", - nfd: "\u{1100}\u{1161}\u{11BF}", - nfkc: "\u{AC18}", - nfkd: "\u{1100}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{AC19}", - nfc: "\u{AC19}", - nfd: "\u{1100}\u{1161}\u{11C0}", - nfkc: "\u{AC19}", - nfkd: "\u{1100}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{AC1A}", - nfc: "\u{AC1A}", - nfd: "\u{1100}\u{1161}\u{11C1}", - nfkc: "\u{AC1A}", - nfkd: "\u{1100}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{AC1B}", - nfc: "\u{AC1B}", - nfd: "\u{1100}\u{1161}\u{11C2}", - nfkc: "\u{AC1B}", - nfkd: "\u{1100}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{AC1C}", - nfc: "\u{AC1C}", - nfd: "\u{1100}\u{1162}", - nfkc: "\u{AC1C}", - nfkd: "\u{1100}\u{1162}", - }, - NormalizationTest { - source: "\u{AC1D}", - nfc: "\u{AC1D}", - nfd: "\u{1100}\u{1162}\u{11A8}", - nfkc: "\u{AC1D}", - nfkd: "\u{1100}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{AC1E}", - nfc: "\u{AC1E}", - nfd: "\u{1100}\u{1162}\u{11A9}", - nfkc: "\u{AC1E}", - nfkd: "\u{1100}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{AC1F}", - nfc: "\u{AC1F}", - nfd: "\u{1100}\u{1162}\u{11AA}", - nfkc: "\u{AC1F}", - nfkd: "\u{1100}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{AC20}", - nfc: "\u{AC20}", - nfd: "\u{1100}\u{1162}\u{11AB}", - nfkc: "\u{AC20}", - nfkd: "\u{1100}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{AC21}", - nfc: "\u{AC21}", - nfd: "\u{1100}\u{1162}\u{11AC}", - nfkc: "\u{AC21}", - nfkd: "\u{1100}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{AC22}", - nfc: "\u{AC22}", - nfd: "\u{1100}\u{1162}\u{11AD}", - nfkc: "\u{AC22}", - nfkd: "\u{1100}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{AC23}", - nfc: "\u{AC23}", - nfd: "\u{1100}\u{1162}\u{11AE}", - nfkc: "\u{AC23}", - nfkd: "\u{1100}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{AC24}", - nfc: "\u{AC24}", - nfd: "\u{1100}\u{1162}\u{11AF}", - nfkc: "\u{AC24}", - nfkd: "\u{1100}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{AC25}", - nfc: "\u{AC25}", - nfd: "\u{1100}\u{1162}\u{11B0}", - nfkc: "\u{AC25}", - nfkd: "\u{1100}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{AC26}", - nfc: "\u{AC26}", - nfd: "\u{1100}\u{1162}\u{11B1}", - nfkc: "\u{AC26}", - nfkd: "\u{1100}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{AC27}", - nfc: "\u{AC27}", - nfd: "\u{1100}\u{1162}\u{11B2}", - nfkc: "\u{AC27}", - nfkd: "\u{1100}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{AC28}", - nfc: "\u{AC28}", - nfd: "\u{1100}\u{1162}\u{11B3}", - nfkc: "\u{AC28}", - nfkd: "\u{1100}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{AC29}", - nfc: "\u{AC29}", - nfd: "\u{1100}\u{1162}\u{11B4}", - nfkc: "\u{AC29}", - nfkd: "\u{1100}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{AC2A}", - nfc: "\u{AC2A}", - nfd: "\u{1100}\u{1162}\u{11B5}", - nfkc: "\u{AC2A}", - nfkd: "\u{1100}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{AC2B}", - nfc: "\u{AC2B}", - nfd: "\u{1100}\u{1162}\u{11B6}", - nfkc: "\u{AC2B}", - nfkd: "\u{1100}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{AC2C}", - nfc: "\u{AC2C}", - nfd: "\u{1100}\u{1162}\u{11B7}", - nfkc: "\u{AC2C}", - nfkd: "\u{1100}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{AC2D}", - nfc: "\u{AC2D}", - nfd: "\u{1100}\u{1162}\u{11B8}", - nfkc: "\u{AC2D}", - nfkd: "\u{1100}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{AC2E}", - nfc: "\u{AC2E}", - nfd: "\u{1100}\u{1162}\u{11B9}", - nfkc: "\u{AC2E}", - nfkd: "\u{1100}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{AC2F}", - nfc: "\u{AC2F}", - nfd: "\u{1100}\u{1162}\u{11BA}", - nfkc: "\u{AC2F}", - nfkd: "\u{1100}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{AC30}", - nfc: "\u{AC30}", - nfd: "\u{1100}\u{1162}\u{11BB}", - nfkc: "\u{AC30}", - nfkd: "\u{1100}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{AC31}", - nfc: "\u{AC31}", - nfd: "\u{1100}\u{1162}\u{11BC}", - nfkc: "\u{AC31}", - nfkd: "\u{1100}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{AC32}", - nfc: "\u{AC32}", - nfd: "\u{1100}\u{1162}\u{11BD}", - nfkc: "\u{AC32}", - nfkd: "\u{1100}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{AC33}", - nfc: "\u{AC33}", - nfd: "\u{1100}\u{1162}\u{11BE}", - nfkc: "\u{AC33}", - nfkd: "\u{1100}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{AC34}", - nfc: "\u{AC34}", - nfd: "\u{1100}\u{1162}\u{11BF}", - nfkc: "\u{AC34}", - nfkd: "\u{1100}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{AC35}", - nfc: "\u{AC35}", - nfd: "\u{1100}\u{1162}\u{11C0}", - nfkc: "\u{AC35}", - nfkd: "\u{1100}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{AC36}", - nfc: "\u{AC36}", - nfd: "\u{1100}\u{1162}\u{11C1}", - nfkc: "\u{AC36}", - nfkd: "\u{1100}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{AC37}", - nfc: "\u{AC37}", - nfd: "\u{1100}\u{1162}\u{11C2}", - nfkc: "\u{AC37}", - nfkd: "\u{1100}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{AC38}", - nfc: "\u{AC38}", - nfd: "\u{1100}\u{1163}", - nfkc: "\u{AC38}", - nfkd: "\u{1100}\u{1163}", - }, - NormalizationTest { - source: "\u{AC39}", - nfc: "\u{AC39}", - nfd: "\u{1100}\u{1163}\u{11A8}", - nfkc: "\u{AC39}", - nfkd: "\u{1100}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{AC3A}", - nfc: "\u{AC3A}", - nfd: "\u{1100}\u{1163}\u{11A9}", - nfkc: "\u{AC3A}", - nfkd: "\u{1100}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{AC3B}", - nfc: "\u{AC3B}", - nfd: "\u{1100}\u{1163}\u{11AA}", - nfkc: "\u{AC3B}", - nfkd: "\u{1100}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{AC3C}", - nfc: "\u{AC3C}", - nfd: "\u{1100}\u{1163}\u{11AB}", - nfkc: "\u{AC3C}", - nfkd: "\u{1100}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{AC3D}", - nfc: "\u{AC3D}", - nfd: "\u{1100}\u{1163}\u{11AC}", - nfkc: "\u{AC3D}", - nfkd: "\u{1100}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{AC3E}", - nfc: "\u{AC3E}", - nfd: "\u{1100}\u{1163}\u{11AD}", - nfkc: "\u{AC3E}", - nfkd: "\u{1100}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{AC3F}", - nfc: "\u{AC3F}", - nfd: "\u{1100}\u{1163}\u{11AE}", - nfkc: "\u{AC3F}", - nfkd: "\u{1100}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{AC40}", - nfc: "\u{AC40}", - nfd: "\u{1100}\u{1163}\u{11AF}", - nfkc: "\u{AC40}", - nfkd: "\u{1100}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{AC41}", - nfc: "\u{AC41}", - nfd: "\u{1100}\u{1163}\u{11B0}", - nfkc: "\u{AC41}", - nfkd: "\u{1100}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{AC42}", - nfc: "\u{AC42}", - nfd: "\u{1100}\u{1163}\u{11B1}", - nfkc: "\u{AC42}", - nfkd: "\u{1100}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{AC43}", - nfc: "\u{AC43}", - nfd: "\u{1100}\u{1163}\u{11B2}", - nfkc: "\u{AC43}", - nfkd: "\u{1100}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{AC44}", - nfc: "\u{AC44}", - nfd: "\u{1100}\u{1163}\u{11B3}", - nfkc: "\u{AC44}", - nfkd: "\u{1100}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{AC45}", - nfc: "\u{AC45}", - nfd: "\u{1100}\u{1163}\u{11B4}", - nfkc: "\u{AC45}", - nfkd: "\u{1100}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{AC46}", - nfc: "\u{AC46}", - nfd: "\u{1100}\u{1163}\u{11B5}", - nfkc: "\u{AC46}", - nfkd: "\u{1100}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{AC47}", - nfc: "\u{AC47}", - nfd: "\u{1100}\u{1163}\u{11B6}", - nfkc: "\u{AC47}", - nfkd: "\u{1100}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{AC48}", - nfc: "\u{AC48}", - nfd: "\u{1100}\u{1163}\u{11B7}", - nfkc: "\u{AC48}", - nfkd: "\u{1100}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{AC49}", - nfc: "\u{AC49}", - nfd: "\u{1100}\u{1163}\u{11B8}", - nfkc: "\u{AC49}", - nfkd: "\u{1100}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{AC4A}", - nfc: "\u{AC4A}", - nfd: "\u{1100}\u{1163}\u{11B9}", - nfkc: "\u{AC4A}", - nfkd: "\u{1100}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{AC4B}", - nfc: "\u{AC4B}", - nfd: "\u{1100}\u{1163}\u{11BA}", - nfkc: "\u{AC4B}", - nfkd: "\u{1100}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{AC4C}", - nfc: "\u{AC4C}", - nfd: "\u{1100}\u{1163}\u{11BB}", - nfkc: "\u{AC4C}", - nfkd: "\u{1100}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{AC4D}", - nfc: "\u{AC4D}", - nfd: "\u{1100}\u{1163}\u{11BC}", - nfkc: "\u{AC4D}", - nfkd: "\u{1100}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{AC4E}", - nfc: "\u{AC4E}", - nfd: "\u{1100}\u{1163}\u{11BD}", - nfkc: "\u{AC4E}", - nfkd: "\u{1100}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{AC4F}", - nfc: "\u{AC4F}", - nfd: "\u{1100}\u{1163}\u{11BE}", - nfkc: "\u{AC4F}", - nfkd: "\u{1100}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{AC50}", - nfc: "\u{AC50}", - nfd: "\u{1100}\u{1163}\u{11BF}", - nfkc: "\u{AC50}", - nfkd: "\u{1100}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{AC51}", - nfc: "\u{AC51}", - nfd: "\u{1100}\u{1163}\u{11C0}", - nfkc: "\u{AC51}", - nfkd: "\u{1100}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{AC52}", - nfc: "\u{AC52}", - nfd: "\u{1100}\u{1163}\u{11C1}", - nfkc: "\u{AC52}", - nfkd: "\u{1100}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{AC53}", - nfc: "\u{AC53}", - nfd: "\u{1100}\u{1163}\u{11C2}", - nfkc: "\u{AC53}", - nfkd: "\u{1100}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{AC54}", - nfc: "\u{AC54}", - nfd: "\u{1100}\u{1164}", - nfkc: "\u{AC54}", - nfkd: "\u{1100}\u{1164}", - }, - NormalizationTest { - source: "\u{AC55}", - nfc: "\u{AC55}", - nfd: "\u{1100}\u{1164}\u{11A8}", - nfkc: "\u{AC55}", - nfkd: "\u{1100}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{AC56}", - nfc: "\u{AC56}", - nfd: "\u{1100}\u{1164}\u{11A9}", - nfkc: "\u{AC56}", - nfkd: "\u{1100}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{AC57}", - nfc: "\u{AC57}", - nfd: "\u{1100}\u{1164}\u{11AA}", - nfkc: "\u{AC57}", - nfkd: "\u{1100}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{AC58}", - nfc: "\u{AC58}", - nfd: "\u{1100}\u{1164}\u{11AB}", - nfkc: "\u{AC58}", - nfkd: "\u{1100}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{AC59}", - nfc: "\u{AC59}", - nfd: "\u{1100}\u{1164}\u{11AC}", - nfkc: "\u{AC59}", - nfkd: "\u{1100}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{AC5A}", - nfc: "\u{AC5A}", - nfd: "\u{1100}\u{1164}\u{11AD}", - nfkc: "\u{AC5A}", - nfkd: "\u{1100}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{AC5B}", - nfc: "\u{AC5B}", - nfd: "\u{1100}\u{1164}\u{11AE}", - nfkc: "\u{AC5B}", - nfkd: "\u{1100}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{AC5C}", - nfc: "\u{AC5C}", - nfd: "\u{1100}\u{1164}\u{11AF}", - nfkc: "\u{AC5C}", - nfkd: "\u{1100}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{AC5D}", - nfc: "\u{AC5D}", - nfd: "\u{1100}\u{1164}\u{11B0}", - nfkc: "\u{AC5D}", - nfkd: "\u{1100}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{AC5E}", - nfc: "\u{AC5E}", - nfd: "\u{1100}\u{1164}\u{11B1}", - nfkc: "\u{AC5E}", - nfkd: "\u{1100}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{AC5F}", - nfc: "\u{AC5F}", - nfd: "\u{1100}\u{1164}\u{11B2}", - nfkc: "\u{AC5F}", - nfkd: "\u{1100}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{AC60}", - nfc: "\u{AC60}", - nfd: "\u{1100}\u{1164}\u{11B3}", - nfkc: "\u{AC60}", - nfkd: "\u{1100}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{AC61}", - nfc: "\u{AC61}", - nfd: "\u{1100}\u{1164}\u{11B4}", - nfkc: "\u{AC61}", - nfkd: "\u{1100}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{AC62}", - nfc: "\u{AC62}", - nfd: "\u{1100}\u{1164}\u{11B5}", - nfkc: "\u{AC62}", - nfkd: "\u{1100}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{AC63}", - nfc: "\u{AC63}", - nfd: "\u{1100}\u{1164}\u{11B6}", - nfkc: "\u{AC63}", - nfkd: "\u{1100}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{AC64}", - nfc: "\u{AC64}", - nfd: "\u{1100}\u{1164}\u{11B7}", - nfkc: "\u{AC64}", - nfkd: "\u{1100}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{AC65}", - nfc: "\u{AC65}", - nfd: "\u{1100}\u{1164}\u{11B8}", - nfkc: "\u{AC65}", - nfkd: "\u{1100}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{AC66}", - nfc: "\u{AC66}", - nfd: "\u{1100}\u{1164}\u{11B9}", - nfkc: "\u{AC66}", - nfkd: "\u{1100}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{AC67}", - nfc: "\u{AC67}", - nfd: "\u{1100}\u{1164}\u{11BA}", - nfkc: "\u{AC67}", - nfkd: "\u{1100}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{AC68}", - nfc: "\u{AC68}", - nfd: "\u{1100}\u{1164}\u{11BB}", - nfkc: "\u{AC68}", - nfkd: "\u{1100}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{AC69}", - nfc: "\u{AC69}", - nfd: "\u{1100}\u{1164}\u{11BC}", - nfkc: "\u{AC69}", - nfkd: "\u{1100}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{AC6A}", - nfc: "\u{AC6A}", - nfd: "\u{1100}\u{1164}\u{11BD}", - nfkc: "\u{AC6A}", - nfkd: "\u{1100}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{AC6B}", - nfc: "\u{AC6B}", - nfd: "\u{1100}\u{1164}\u{11BE}", - nfkc: "\u{AC6B}", - nfkd: "\u{1100}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{AC6C}", - nfc: "\u{AC6C}", - nfd: "\u{1100}\u{1164}\u{11BF}", - nfkc: "\u{AC6C}", - nfkd: "\u{1100}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{AC6D}", - nfc: "\u{AC6D}", - nfd: "\u{1100}\u{1164}\u{11C0}", - nfkc: "\u{AC6D}", - nfkd: "\u{1100}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{AC6E}", - nfc: "\u{AC6E}", - nfd: "\u{1100}\u{1164}\u{11C1}", - nfkc: "\u{AC6E}", - nfkd: "\u{1100}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{AC6F}", - nfc: "\u{AC6F}", - nfd: "\u{1100}\u{1164}\u{11C2}", - nfkc: "\u{AC6F}", - nfkd: "\u{1100}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{AC70}", - nfc: "\u{AC70}", - nfd: "\u{1100}\u{1165}", - nfkc: "\u{AC70}", - nfkd: "\u{1100}\u{1165}", - }, - NormalizationTest { - source: "\u{AC71}", - nfc: "\u{AC71}", - nfd: "\u{1100}\u{1165}\u{11A8}", - nfkc: "\u{AC71}", - nfkd: "\u{1100}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{AC72}", - nfc: "\u{AC72}", - nfd: "\u{1100}\u{1165}\u{11A9}", - nfkc: "\u{AC72}", - nfkd: "\u{1100}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{AC73}", - nfc: "\u{AC73}", - nfd: "\u{1100}\u{1165}\u{11AA}", - nfkc: "\u{AC73}", - nfkd: "\u{1100}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{AC74}", - nfc: "\u{AC74}", - nfd: "\u{1100}\u{1165}\u{11AB}", - nfkc: "\u{AC74}", - nfkd: "\u{1100}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{AC75}", - nfc: "\u{AC75}", - nfd: "\u{1100}\u{1165}\u{11AC}", - nfkc: "\u{AC75}", - nfkd: "\u{1100}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{AC76}", - nfc: "\u{AC76}", - nfd: "\u{1100}\u{1165}\u{11AD}", - nfkc: "\u{AC76}", - nfkd: "\u{1100}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{AC77}", - nfc: "\u{AC77}", - nfd: "\u{1100}\u{1165}\u{11AE}", - nfkc: "\u{AC77}", - nfkd: "\u{1100}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{AC78}", - nfc: "\u{AC78}", - nfd: "\u{1100}\u{1165}\u{11AF}", - nfkc: "\u{AC78}", - nfkd: "\u{1100}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{AC79}", - nfc: "\u{AC79}", - nfd: "\u{1100}\u{1165}\u{11B0}", - nfkc: "\u{AC79}", - nfkd: "\u{1100}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{AC7A}", - nfc: "\u{AC7A}", - nfd: "\u{1100}\u{1165}\u{11B1}", - nfkc: "\u{AC7A}", - nfkd: "\u{1100}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{AC7B}", - nfc: "\u{AC7B}", - nfd: "\u{1100}\u{1165}\u{11B2}", - nfkc: "\u{AC7B}", - nfkd: "\u{1100}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{AC7C}", - nfc: "\u{AC7C}", - nfd: "\u{1100}\u{1165}\u{11B3}", - nfkc: "\u{AC7C}", - nfkd: "\u{1100}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{AC7D}", - nfc: "\u{AC7D}", - nfd: "\u{1100}\u{1165}\u{11B4}", - nfkc: "\u{AC7D}", - nfkd: "\u{1100}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{AC7E}", - nfc: "\u{AC7E}", - nfd: "\u{1100}\u{1165}\u{11B5}", - nfkc: "\u{AC7E}", - nfkd: "\u{1100}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{AC7F}", - nfc: "\u{AC7F}", - nfd: "\u{1100}\u{1165}\u{11B6}", - nfkc: "\u{AC7F}", - nfkd: "\u{1100}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{AC80}", - nfc: "\u{AC80}", - nfd: "\u{1100}\u{1165}\u{11B7}", - nfkc: "\u{AC80}", - nfkd: "\u{1100}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{AC81}", - nfc: "\u{AC81}", - nfd: "\u{1100}\u{1165}\u{11B8}", - nfkc: "\u{AC81}", - nfkd: "\u{1100}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{AC82}", - nfc: "\u{AC82}", - nfd: "\u{1100}\u{1165}\u{11B9}", - nfkc: "\u{AC82}", - nfkd: "\u{1100}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{AC83}", - nfc: "\u{AC83}", - nfd: "\u{1100}\u{1165}\u{11BA}", - nfkc: "\u{AC83}", - nfkd: "\u{1100}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{AC84}", - nfc: "\u{AC84}", - nfd: "\u{1100}\u{1165}\u{11BB}", - nfkc: "\u{AC84}", - nfkd: "\u{1100}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{AC85}", - nfc: "\u{AC85}", - nfd: "\u{1100}\u{1165}\u{11BC}", - nfkc: "\u{AC85}", - nfkd: "\u{1100}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{AC86}", - nfc: "\u{AC86}", - nfd: "\u{1100}\u{1165}\u{11BD}", - nfkc: "\u{AC86}", - nfkd: "\u{1100}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{AC87}", - nfc: "\u{AC87}", - nfd: "\u{1100}\u{1165}\u{11BE}", - nfkc: "\u{AC87}", - nfkd: "\u{1100}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{AC88}", - nfc: "\u{AC88}", - nfd: "\u{1100}\u{1165}\u{11BF}", - nfkc: "\u{AC88}", - nfkd: "\u{1100}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{AC89}", - nfc: "\u{AC89}", - nfd: "\u{1100}\u{1165}\u{11C0}", - nfkc: "\u{AC89}", - nfkd: "\u{1100}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{AC8A}", - nfc: "\u{AC8A}", - nfd: "\u{1100}\u{1165}\u{11C1}", - nfkc: "\u{AC8A}", - nfkd: "\u{1100}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{AC8B}", - nfc: "\u{AC8B}", - nfd: "\u{1100}\u{1165}\u{11C2}", - nfkc: "\u{AC8B}", - nfkd: "\u{1100}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{AC8C}", - nfc: "\u{AC8C}", - nfd: "\u{1100}\u{1166}", - nfkc: "\u{AC8C}", - nfkd: "\u{1100}\u{1166}", - }, - NormalizationTest { - source: "\u{AC8D}", - nfc: "\u{AC8D}", - nfd: "\u{1100}\u{1166}\u{11A8}", - nfkc: "\u{AC8D}", - nfkd: "\u{1100}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{AC8E}", - nfc: "\u{AC8E}", - nfd: "\u{1100}\u{1166}\u{11A9}", - nfkc: "\u{AC8E}", - nfkd: "\u{1100}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{AC8F}", - nfc: "\u{AC8F}", - nfd: "\u{1100}\u{1166}\u{11AA}", - nfkc: "\u{AC8F}", - nfkd: "\u{1100}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{AC90}", - nfc: "\u{AC90}", - nfd: "\u{1100}\u{1166}\u{11AB}", - nfkc: "\u{AC90}", - nfkd: "\u{1100}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{AC91}", - nfc: "\u{AC91}", - nfd: "\u{1100}\u{1166}\u{11AC}", - nfkc: "\u{AC91}", - nfkd: "\u{1100}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{AC92}", - nfc: "\u{AC92}", - nfd: "\u{1100}\u{1166}\u{11AD}", - nfkc: "\u{AC92}", - nfkd: "\u{1100}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{AC93}", - nfc: "\u{AC93}", - nfd: "\u{1100}\u{1166}\u{11AE}", - nfkc: "\u{AC93}", - nfkd: "\u{1100}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{AC94}", - nfc: "\u{AC94}", - nfd: "\u{1100}\u{1166}\u{11AF}", - nfkc: "\u{AC94}", - nfkd: "\u{1100}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{AC95}", - nfc: "\u{AC95}", - nfd: "\u{1100}\u{1166}\u{11B0}", - nfkc: "\u{AC95}", - nfkd: "\u{1100}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{AC96}", - nfc: "\u{AC96}", - nfd: "\u{1100}\u{1166}\u{11B1}", - nfkc: "\u{AC96}", - nfkd: "\u{1100}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{AC97}", - nfc: "\u{AC97}", - nfd: "\u{1100}\u{1166}\u{11B2}", - nfkc: "\u{AC97}", - nfkd: "\u{1100}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{AC98}", - nfc: "\u{AC98}", - nfd: "\u{1100}\u{1166}\u{11B3}", - nfkc: "\u{AC98}", - nfkd: "\u{1100}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{AC99}", - nfc: "\u{AC99}", - nfd: "\u{1100}\u{1166}\u{11B4}", - nfkc: "\u{AC99}", - nfkd: "\u{1100}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{AC9A}", - nfc: "\u{AC9A}", - nfd: "\u{1100}\u{1166}\u{11B5}", - nfkc: "\u{AC9A}", - nfkd: "\u{1100}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{AC9B}", - nfc: "\u{AC9B}", - nfd: "\u{1100}\u{1166}\u{11B6}", - nfkc: "\u{AC9B}", - nfkd: "\u{1100}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{AC9C}", - nfc: "\u{AC9C}", - nfd: "\u{1100}\u{1166}\u{11B7}", - nfkc: "\u{AC9C}", - nfkd: "\u{1100}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{AC9D}", - nfc: "\u{AC9D}", - nfd: "\u{1100}\u{1166}\u{11B8}", - nfkc: "\u{AC9D}", - nfkd: "\u{1100}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{AC9E}", - nfc: "\u{AC9E}", - nfd: "\u{1100}\u{1166}\u{11B9}", - nfkc: "\u{AC9E}", - nfkd: "\u{1100}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{AC9F}", - nfc: "\u{AC9F}", - nfd: "\u{1100}\u{1166}\u{11BA}", - nfkc: "\u{AC9F}", - nfkd: "\u{1100}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{ACA0}", - nfc: "\u{ACA0}", - nfd: "\u{1100}\u{1166}\u{11BB}", - nfkc: "\u{ACA0}", - nfkd: "\u{1100}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{ACA1}", - nfc: "\u{ACA1}", - nfd: "\u{1100}\u{1166}\u{11BC}", - nfkc: "\u{ACA1}", - nfkd: "\u{1100}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{ACA2}", - nfc: "\u{ACA2}", - nfd: "\u{1100}\u{1166}\u{11BD}", - nfkc: "\u{ACA2}", - nfkd: "\u{1100}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{ACA3}", - nfc: "\u{ACA3}", - nfd: "\u{1100}\u{1166}\u{11BE}", - nfkc: "\u{ACA3}", - nfkd: "\u{1100}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{ACA4}", - nfc: "\u{ACA4}", - nfd: "\u{1100}\u{1166}\u{11BF}", - nfkc: "\u{ACA4}", - nfkd: "\u{1100}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{ACA5}", - nfc: "\u{ACA5}", - nfd: "\u{1100}\u{1166}\u{11C0}", - nfkc: "\u{ACA5}", - nfkd: "\u{1100}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{ACA6}", - nfc: "\u{ACA6}", - nfd: "\u{1100}\u{1166}\u{11C1}", - nfkc: "\u{ACA6}", - nfkd: "\u{1100}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{ACA7}", - nfc: "\u{ACA7}", - nfd: "\u{1100}\u{1166}\u{11C2}", - nfkc: "\u{ACA7}", - nfkd: "\u{1100}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{ACA8}", - nfc: "\u{ACA8}", - nfd: "\u{1100}\u{1167}", - nfkc: "\u{ACA8}", - nfkd: "\u{1100}\u{1167}", - }, - NormalizationTest { - source: "\u{ACA9}", - nfc: "\u{ACA9}", - nfd: "\u{1100}\u{1167}\u{11A8}", - nfkc: "\u{ACA9}", - nfkd: "\u{1100}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{ACAA}", - nfc: "\u{ACAA}", - nfd: "\u{1100}\u{1167}\u{11A9}", - nfkc: "\u{ACAA}", - nfkd: "\u{1100}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{ACAB}", - nfc: "\u{ACAB}", - nfd: "\u{1100}\u{1167}\u{11AA}", - nfkc: "\u{ACAB}", - nfkd: "\u{1100}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{ACAC}", - nfc: "\u{ACAC}", - nfd: "\u{1100}\u{1167}\u{11AB}", - nfkc: "\u{ACAC}", - nfkd: "\u{1100}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{ACAD}", - nfc: "\u{ACAD}", - nfd: "\u{1100}\u{1167}\u{11AC}", - nfkc: "\u{ACAD}", - nfkd: "\u{1100}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{ACAE}", - nfc: "\u{ACAE}", - nfd: "\u{1100}\u{1167}\u{11AD}", - nfkc: "\u{ACAE}", - nfkd: "\u{1100}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{ACAF}", - nfc: "\u{ACAF}", - nfd: "\u{1100}\u{1167}\u{11AE}", - nfkc: "\u{ACAF}", - nfkd: "\u{1100}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{ACB0}", - nfc: "\u{ACB0}", - nfd: "\u{1100}\u{1167}\u{11AF}", - nfkc: "\u{ACB0}", - nfkd: "\u{1100}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{ACB1}", - nfc: "\u{ACB1}", - nfd: "\u{1100}\u{1167}\u{11B0}", - nfkc: "\u{ACB1}", - nfkd: "\u{1100}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{ACB2}", - nfc: "\u{ACB2}", - nfd: "\u{1100}\u{1167}\u{11B1}", - nfkc: "\u{ACB2}", - nfkd: "\u{1100}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{ACB3}", - nfc: "\u{ACB3}", - nfd: "\u{1100}\u{1167}\u{11B2}", - nfkc: "\u{ACB3}", - nfkd: "\u{1100}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{ACB4}", - nfc: "\u{ACB4}", - nfd: "\u{1100}\u{1167}\u{11B3}", - nfkc: "\u{ACB4}", - nfkd: "\u{1100}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{ACB5}", - nfc: "\u{ACB5}", - nfd: "\u{1100}\u{1167}\u{11B4}", - nfkc: "\u{ACB5}", - nfkd: "\u{1100}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{ACB6}", - nfc: "\u{ACB6}", - nfd: "\u{1100}\u{1167}\u{11B5}", - nfkc: "\u{ACB6}", - nfkd: "\u{1100}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{ACB7}", - nfc: "\u{ACB7}", - nfd: "\u{1100}\u{1167}\u{11B6}", - nfkc: "\u{ACB7}", - nfkd: "\u{1100}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{ACB8}", - nfc: "\u{ACB8}", - nfd: "\u{1100}\u{1167}\u{11B7}", - nfkc: "\u{ACB8}", - nfkd: "\u{1100}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{ACB9}", - nfc: "\u{ACB9}", - nfd: "\u{1100}\u{1167}\u{11B8}", - nfkc: "\u{ACB9}", - nfkd: "\u{1100}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{ACBA}", - nfc: "\u{ACBA}", - nfd: "\u{1100}\u{1167}\u{11B9}", - nfkc: "\u{ACBA}", - nfkd: "\u{1100}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{ACBB}", - nfc: "\u{ACBB}", - nfd: "\u{1100}\u{1167}\u{11BA}", - nfkc: "\u{ACBB}", - nfkd: "\u{1100}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{ACBC}", - nfc: "\u{ACBC}", - nfd: "\u{1100}\u{1167}\u{11BB}", - nfkc: "\u{ACBC}", - nfkd: "\u{1100}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{ACBD}", - nfc: "\u{ACBD}", - nfd: "\u{1100}\u{1167}\u{11BC}", - nfkc: "\u{ACBD}", - nfkd: "\u{1100}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{ACBE}", - nfc: "\u{ACBE}", - nfd: "\u{1100}\u{1167}\u{11BD}", - nfkc: "\u{ACBE}", - nfkd: "\u{1100}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{ACBF}", - nfc: "\u{ACBF}", - nfd: "\u{1100}\u{1167}\u{11BE}", - nfkc: "\u{ACBF}", - nfkd: "\u{1100}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{ACC0}", - nfc: "\u{ACC0}", - nfd: "\u{1100}\u{1167}\u{11BF}", - nfkc: "\u{ACC0}", - nfkd: "\u{1100}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{ACC1}", - nfc: "\u{ACC1}", - nfd: "\u{1100}\u{1167}\u{11C0}", - nfkc: "\u{ACC1}", - nfkd: "\u{1100}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{ACC2}", - nfc: "\u{ACC2}", - nfd: "\u{1100}\u{1167}\u{11C1}", - nfkc: "\u{ACC2}", - nfkd: "\u{1100}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{ACC3}", - nfc: "\u{ACC3}", - nfd: "\u{1100}\u{1167}\u{11C2}", - nfkc: "\u{ACC3}", - nfkd: "\u{1100}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{ACC4}", - nfc: "\u{ACC4}", - nfd: "\u{1100}\u{1168}", - nfkc: "\u{ACC4}", - nfkd: "\u{1100}\u{1168}", - }, - NormalizationTest { - source: "\u{ACC5}", - nfc: "\u{ACC5}", - nfd: "\u{1100}\u{1168}\u{11A8}", - nfkc: "\u{ACC5}", - nfkd: "\u{1100}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{ACC6}", - nfc: "\u{ACC6}", - nfd: "\u{1100}\u{1168}\u{11A9}", - nfkc: "\u{ACC6}", - nfkd: "\u{1100}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{ACC7}", - nfc: "\u{ACC7}", - nfd: "\u{1100}\u{1168}\u{11AA}", - nfkc: "\u{ACC7}", - nfkd: "\u{1100}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{ACC8}", - nfc: "\u{ACC8}", - nfd: "\u{1100}\u{1168}\u{11AB}", - nfkc: "\u{ACC8}", - nfkd: "\u{1100}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{ACC9}", - nfc: "\u{ACC9}", - nfd: "\u{1100}\u{1168}\u{11AC}", - nfkc: "\u{ACC9}", - nfkd: "\u{1100}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{ACCA}", - nfc: "\u{ACCA}", - nfd: "\u{1100}\u{1168}\u{11AD}", - nfkc: "\u{ACCA}", - nfkd: "\u{1100}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{ACCB}", - nfc: "\u{ACCB}", - nfd: "\u{1100}\u{1168}\u{11AE}", - nfkc: "\u{ACCB}", - nfkd: "\u{1100}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{ACCC}", - nfc: "\u{ACCC}", - nfd: "\u{1100}\u{1168}\u{11AF}", - nfkc: "\u{ACCC}", - nfkd: "\u{1100}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{ACCD}", - nfc: "\u{ACCD}", - nfd: "\u{1100}\u{1168}\u{11B0}", - nfkc: "\u{ACCD}", - nfkd: "\u{1100}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{ACCE}", - nfc: "\u{ACCE}", - nfd: "\u{1100}\u{1168}\u{11B1}", - nfkc: "\u{ACCE}", - nfkd: "\u{1100}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{ACCF}", - nfc: "\u{ACCF}", - nfd: "\u{1100}\u{1168}\u{11B2}", - nfkc: "\u{ACCF}", - nfkd: "\u{1100}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{ACD0}", - nfc: "\u{ACD0}", - nfd: "\u{1100}\u{1168}\u{11B3}", - nfkc: "\u{ACD0}", - nfkd: "\u{1100}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{ACD1}", - nfc: "\u{ACD1}", - nfd: "\u{1100}\u{1168}\u{11B4}", - nfkc: "\u{ACD1}", - nfkd: "\u{1100}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{ACD2}", - nfc: "\u{ACD2}", - nfd: "\u{1100}\u{1168}\u{11B5}", - nfkc: "\u{ACD2}", - nfkd: "\u{1100}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{ACD3}", - nfc: "\u{ACD3}", - nfd: "\u{1100}\u{1168}\u{11B6}", - nfkc: "\u{ACD3}", - nfkd: "\u{1100}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{ACD4}", - nfc: "\u{ACD4}", - nfd: "\u{1100}\u{1168}\u{11B7}", - nfkc: "\u{ACD4}", - nfkd: "\u{1100}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{ACD5}", - nfc: "\u{ACD5}", - nfd: "\u{1100}\u{1168}\u{11B8}", - nfkc: "\u{ACD5}", - nfkd: "\u{1100}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{ACD6}", - nfc: "\u{ACD6}", - nfd: "\u{1100}\u{1168}\u{11B9}", - nfkc: "\u{ACD6}", - nfkd: "\u{1100}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{ACD7}", - nfc: "\u{ACD7}", - nfd: "\u{1100}\u{1168}\u{11BA}", - nfkc: "\u{ACD7}", - nfkd: "\u{1100}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{ACD8}", - nfc: "\u{ACD8}", - nfd: "\u{1100}\u{1168}\u{11BB}", - nfkc: "\u{ACD8}", - nfkd: "\u{1100}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{ACD9}", - nfc: "\u{ACD9}", - nfd: "\u{1100}\u{1168}\u{11BC}", - nfkc: "\u{ACD9}", - nfkd: "\u{1100}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{ACDA}", - nfc: "\u{ACDA}", - nfd: "\u{1100}\u{1168}\u{11BD}", - nfkc: "\u{ACDA}", - nfkd: "\u{1100}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{ACDB}", - nfc: "\u{ACDB}", - nfd: "\u{1100}\u{1168}\u{11BE}", - nfkc: "\u{ACDB}", - nfkd: "\u{1100}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{ACDC}", - nfc: "\u{ACDC}", - nfd: "\u{1100}\u{1168}\u{11BF}", - nfkc: "\u{ACDC}", - nfkd: "\u{1100}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{ACDD}", - nfc: "\u{ACDD}", - nfd: "\u{1100}\u{1168}\u{11C0}", - nfkc: "\u{ACDD}", - nfkd: "\u{1100}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{ACDE}", - nfc: "\u{ACDE}", - nfd: "\u{1100}\u{1168}\u{11C1}", - nfkc: "\u{ACDE}", - nfkd: "\u{1100}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{ACDF}", - nfc: "\u{ACDF}", - nfd: "\u{1100}\u{1168}\u{11C2}", - nfkc: "\u{ACDF}", - nfkd: "\u{1100}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{ACE0}", - nfc: "\u{ACE0}", - nfd: "\u{1100}\u{1169}", - nfkc: "\u{ACE0}", - nfkd: "\u{1100}\u{1169}", - }, - NormalizationTest { - source: "\u{ACE1}", - nfc: "\u{ACE1}", - nfd: "\u{1100}\u{1169}\u{11A8}", - nfkc: "\u{ACE1}", - nfkd: "\u{1100}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{ACE2}", - nfc: "\u{ACE2}", - nfd: "\u{1100}\u{1169}\u{11A9}", - nfkc: "\u{ACE2}", - nfkd: "\u{1100}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{ACE3}", - nfc: "\u{ACE3}", - nfd: "\u{1100}\u{1169}\u{11AA}", - nfkc: "\u{ACE3}", - nfkd: "\u{1100}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{ACE4}", - nfc: "\u{ACE4}", - nfd: "\u{1100}\u{1169}\u{11AB}", - nfkc: "\u{ACE4}", - nfkd: "\u{1100}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{ACE5}", - nfc: "\u{ACE5}", - nfd: "\u{1100}\u{1169}\u{11AC}", - nfkc: "\u{ACE5}", - nfkd: "\u{1100}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{ACE6}", - nfc: "\u{ACE6}", - nfd: "\u{1100}\u{1169}\u{11AD}", - nfkc: "\u{ACE6}", - nfkd: "\u{1100}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{ACE7}", - nfc: "\u{ACE7}", - nfd: "\u{1100}\u{1169}\u{11AE}", - nfkc: "\u{ACE7}", - nfkd: "\u{1100}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{ACE8}", - nfc: "\u{ACE8}", - nfd: "\u{1100}\u{1169}\u{11AF}", - nfkc: "\u{ACE8}", - nfkd: "\u{1100}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{ACE9}", - nfc: "\u{ACE9}", - nfd: "\u{1100}\u{1169}\u{11B0}", - nfkc: "\u{ACE9}", - nfkd: "\u{1100}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{ACEA}", - nfc: "\u{ACEA}", - nfd: "\u{1100}\u{1169}\u{11B1}", - nfkc: "\u{ACEA}", - nfkd: "\u{1100}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{ACEB}", - nfc: "\u{ACEB}", - nfd: "\u{1100}\u{1169}\u{11B2}", - nfkc: "\u{ACEB}", - nfkd: "\u{1100}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{ACEC}", - nfc: "\u{ACEC}", - nfd: "\u{1100}\u{1169}\u{11B3}", - nfkc: "\u{ACEC}", - nfkd: "\u{1100}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{ACED}", - nfc: "\u{ACED}", - nfd: "\u{1100}\u{1169}\u{11B4}", - nfkc: "\u{ACED}", - nfkd: "\u{1100}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{ACEE}", - nfc: "\u{ACEE}", - nfd: "\u{1100}\u{1169}\u{11B5}", - nfkc: "\u{ACEE}", - nfkd: "\u{1100}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{ACEF}", - nfc: "\u{ACEF}", - nfd: "\u{1100}\u{1169}\u{11B6}", - nfkc: "\u{ACEF}", - nfkd: "\u{1100}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{ACF0}", - nfc: "\u{ACF0}", - nfd: "\u{1100}\u{1169}\u{11B7}", - nfkc: "\u{ACF0}", - nfkd: "\u{1100}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{ACF1}", - nfc: "\u{ACF1}", - nfd: "\u{1100}\u{1169}\u{11B8}", - nfkc: "\u{ACF1}", - nfkd: "\u{1100}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{ACF2}", - nfc: "\u{ACF2}", - nfd: "\u{1100}\u{1169}\u{11B9}", - nfkc: "\u{ACF2}", - nfkd: "\u{1100}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{ACF3}", - nfc: "\u{ACF3}", - nfd: "\u{1100}\u{1169}\u{11BA}", - nfkc: "\u{ACF3}", - nfkd: "\u{1100}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{ACF4}", - nfc: "\u{ACF4}", - nfd: "\u{1100}\u{1169}\u{11BB}", - nfkc: "\u{ACF4}", - nfkd: "\u{1100}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{ACF5}", - nfc: "\u{ACF5}", - nfd: "\u{1100}\u{1169}\u{11BC}", - nfkc: "\u{ACF5}", - nfkd: "\u{1100}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{ACF6}", - nfc: "\u{ACF6}", - nfd: "\u{1100}\u{1169}\u{11BD}", - nfkc: "\u{ACF6}", - nfkd: "\u{1100}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{ACF7}", - nfc: "\u{ACF7}", - nfd: "\u{1100}\u{1169}\u{11BE}", - nfkc: "\u{ACF7}", - nfkd: "\u{1100}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{ACF8}", - nfc: "\u{ACF8}", - nfd: "\u{1100}\u{1169}\u{11BF}", - nfkc: "\u{ACF8}", - nfkd: "\u{1100}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{ACF9}", - nfc: "\u{ACF9}", - nfd: "\u{1100}\u{1169}\u{11C0}", - nfkc: "\u{ACF9}", - nfkd: "\u{1100}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{ACFA}", - nfc: "\u{ACFA}", - nfd: "\u{1100}\u{1169}\u{11C1}", - nfkc: "\u{ACFA}", - nfkd: "\u{1100}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{ACFB}", - nfc: "\u{ACFB}", - nfd: "\u{1100}\u{1169}\u{11C2}", - nfkc: "\u{ACFB}", - nfkd: "\u{1100}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{ACFC}", - nfc: "\u{ACFC}", - nfd: "\u{1100}\u{116A}", - nfkc: "\u{ACFC}", - nfkd: "\u{1100}\u{116A}", - }, - NormalizationTest { - source: "\u{ACFD}", - nfc: "\u{ACFD}", - nfd: "\u{1100}\u{116A}\u{11A8}", - nfkc: "\u{ACFD}", - nfkd: "\u{1100}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{ACFE}", - nfc: "\u{ACFE}", - nfd: "\u{1100}\u{116A}\u{11A9}", - nfkc: "\u{ACFE}", - nfkd: "\u{1100}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{ACFF}", - nfc: "\u{ACFF}", - nfd: "\u{1100}\u{116A}\u{11AA}", - nfkc: "\u{ACFF}", - nfkd: "\u{1100}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{AD00}", - nfc: "\u{AD00}", - nfd: "\u{1100}\u{116A}\u{11AB}", - nfkc: "\u{AD00}", - nfkd: "\u{1100}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{AD01}", - nfc: "\u{AD01}", - nfd: "\u{1100}\u{116A}\u{11AC}", - nfkc: "\u{AD01}", - nfkd: "\u{1100}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{AD02}", - nfc: "\u{AD02}", - nfd: "\u{1100}\u{116A}\u{11AD}", - nfkc: "\u{AD02}", - nfkd: "\u{1100}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{AD03}", - nfc: "\u{AD03}", - nfd: "\u{1100}\u{116A}\u{11AE}", - nfkc: "\u{AD03}", - nfkd: "\u{1100}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{AD04}", - nfc: "\u{AD04}", - nfd: "\u{1100}\u{116A}\u{11AF}", - nfkc: "\u{AD04}", - nfkd: "\u{1100}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{AD05}", - nfc: "\u{AD05}", - nfd: "\u{1100}\u{116A}\u{11B0}", - nfkc: "\u{AD05}", - nfkd: "\u{1100}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{AD06}", - nfc: "\u{AD06}", - nfd: "\u{1100}\u{116A}\u{11B1}", - nfkc: "\u{AD06}", - nfkd: "\u{1100}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{AD07}", - nfc: "\u{AD07}", - nfd: "\u{1100}\u{116A}\u{11B2}", - nfkc: "\u{AD07}", - nfkd: "\u{1100}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{AD08}", - nfc: "\u{AD08}", - nfd: "\u{1100}\u{116A}\u{11B3}", - nfkc: "\u{AD08}", - nfkd: "\u{1100}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{AD09}", - nfc: "\u{AD09}", - nfd: "\u{1100}\u{116A}\u{11B4}", - nfkc: "\u{AD09}", - nfkd: "\u{1100}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{AD0A}", - nfc: "\u{AD0A}", - nfd: "\u{1100}\u{116A}\u{11B5}", - nfkc: "\u{AD0A}", - nfkd: "\u{1100}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{AD0B}", - nfc: "\u{AD0B}", - nfd: "\u{1100}\u{116A}\u{11B6}", - nfkc: "\u{AD0B}", - nfkd: "\u{1100}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{AD0C}", - nfc: "\u{AD0C}", - nfd: "\u{1100}\u{116A}\u{11B7}", - nfkc: "\u{AD0C}", - nfkd: "\u{1100}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{AD0D}", - nfc: "\u{AD0D}", - nfd: "\u{1100}\u{116A}\u{11B8}", - nfkc: "\u{AD0D}", - nfkd: "\u{1100}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{AD0E}", - nfc: "\u{AD0E}", - nfd: "\u{1100}\u{116A}\u{11B9}", - nfkc: "\u{AD0E}", - nfkd: "\u{1100}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{AD0F}", - nfc: "\u{AD0F}", - nfd: "\u{1100}\u{116A}\u{11BA}", - nfkc: "\u{AD0F}", - nfkd: "\u{1100}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{AD10}", - nfc: "\u{AD10}", - nfd: "\u{1100}\u{116A}\u{11BB}", - nfkc: "\u{AD10}", - nfkd: "\u{1100}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{AD11}", - nfc: "\u{AD11}", - nfd: "\u{1100}\u{116A}\u{11BC}", - nfkc: "\u{AD11}", - nfkd: "\u{1100}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{AD12}", - nfc: "\u{AD12}", - nfd: "\u{1100}\u{116A}\u{11BD}", - nfkc: "\u{AD12}", - nfkd: "\u{1100}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{AD13}", - nfc: "\u{AD13}", - nfd: "\u{1100}\u{116A}\u{11BE}", - nfkc: "\u{AD13}", - nfkd: "\u{1100}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{AD14}", - nfc: "\u{AD14}", - nfd: "\u{1100}\u{116A}\u{11BF}", - nfkc: "\u{AD14}", - nfkd: "\u{1100}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{AD15}", - nfc: "\u{AD15}", - nfd: "\u{1100}\u{116A}\u{11C0}", - nfkc: "\u{AD15}", - nfkd: "\u{1100}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{AD16}", - nfc: "\u{AD16}", - nfd: "\u{1100}\u{116A}\u{11C1}", - nfkc: "\u{AD16}", - nfkd: "\u{1100}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{AD17}", - nfc: "\u{AD17}", - nfd: "\u{1100}\u{116A}\u{11C2}", - nfkc: "\u{AD17}", - nfkd: "\u{1100}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{AD18}", - nfc: "\u{AD18}", - nfd: "\u{1100}\u{116B}", - nfkc: "\u{AD18}", - nfkd: "\u{1100}\u{116B}", - }, - NormalizationTest { - source: "\u{AD19}", - nfc: "\u{AD19}", - nfd: "\u{1100}\u{116B}\u{11A8}", - nfkc: "\u{AD19}", - nfkd: "\u{1100}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{AD1A}", - nfc: "\u{AD1A}", - nfd: "\u{1100}\u{116B}\u{11A9}", - nfkc: "\u{AD1A}", - nfkd: "\u{1100}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{AD1B}", - nfc: "\u{AD1B}", - nfd: "\u{1100}\u{116B}\u{11AA}", - nfkc: "\u{AD1B}", - nfkd: "\u{1100}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{AD1C}", - nfc: "\u{AD1C}", - nfd: "\u{1100}\u{116B}\u{11AB}", - nfkc: "\u{AD1C}", - nfkd: "\u{1100}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{AD1D}", - nfc: "\u{AD1D}", - nfd: "\u{1100}\u{116B}\u{11AC}", - nfkc: "\u{AD1D}", - nfkd: "\u{1100}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{AD1E}", - nfc: "\u{AD1E}", - nfd: "\u{1100}\u{116B}\u{11AD}", - nfkc: "\u{AD1E}", - nfkd: "\u{1100}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{AD1F}", - nfc: "\u{AD1F}", - nfd: "\u{1100}\u{116B}\u{11AE}", - nfkc: "\u{AD1F}", - nfkd: "\u{1100}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{AD20}", - nfc: "\u{AD20}", - nfd: "\u{1100}\u{116B}\u{11AF}", - nfkc: "\u{AD20}", - nfkd: "\u{1100}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{AD21}", - nfc: "\u{AD21}", - nfd: "\u{1100}\u{116B}\u{11B0}", - nfkc: "\u{AD21}", - nfkd: "\u{1100}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{AD22}", - nfc: "\u{AD22}", - nfd: "\u{1100}\u{116B}\u{11B1}", - nfkc: "\u{AD22}", - nfkd: "\u{1100}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{AD23}", - nfc: "\u{AD23}", - nfd: "\u{1100}\u{116B}\u{11B2}", - nfkc: "\u{AD23}", - nfkd: "\u{1100}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{AD24}", - nfc: "\u{AD24}", - nfd: "\u{1100}\u{116B}\u{11B3}", - nfkc: "\u{AD24}", - nfkd: "\u{1100}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{AD25}", - nfc: "\u{AD25}", - nfd: "\u{1100}\u{116B}\u{11B4}", - nfkc: "\u{AD25}", - nfkd: "\u{1100}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{AD26}", - nfc: "\u{AD26}", - nfd: "\u{1100}\u{116B}\u{11B5}", - nfkc: "\u{AD26}", - nfkd: "\u{1100}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{AD27}", - nfc: "\u{AD27}", - nfd: "\u{1100}\u{116B}\u{11B6}", - nfkc: "\u{AD27}", - nfkd: "\u{1100}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{AD28}", - nfc: "\u{AD28}", - nfd: "\u{1100}\u{116B}\u{11B7}", - nfkc: "\u{AD28}", - nfkd: "\u{1100}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{AD29}", - nfc: "\u{AD29}", - nfd: "\u{1100}\u{116B}\u{11B8}", - nfkc: "\u{AD29}", - nfkd: "\u{1100}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{AD2A}", - nfc: "\u{AD2A}", - nfd: "\u{1100}\u{116B}\u{11B9}", - nfkc: "\u{AD2A}", - nfkd: "\u{1100}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{AD2B}", - nfc: "\u{AD2B}", - nfd: "\u{1100}\u{116B}\u{11BA}", - nfkc: "\u{AD2B}", - nfkd: "\u{1100}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{AD2C}", - nfc: "\u{AD2C}", - nfd: "\u{1100}\u{116B}\u{11BB}", - nfkc: "\u{AD2C}", - nfkd: "\u{1100}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{AD2D}", - nfc: "\u{AD2D}", - nfd: "\u{1100}\u{116B}\u{11BC}", - nfkc: "\u{AD2D}", - nfkd: "\u{1100}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{AD2E}", - nfc: "\u{AD2E}", - nfd: "\u{1100}\u{116B}\u{11BD}", - nfkc: "\u{AD2E}", - nfkd: "\u{1100}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{AD2F}", - nfc: "\u{AD2F}", - nfd: "\u{1100}\u{116B}\u{11BE}", - nfkc: "\u{AD2F}", - nfkd: "\u{1100}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{AD30}", - nfc: "\u{AD30}", - nfd: "\u{1100}\u{116B}\u{11BF}", - nfkc: "\u{AD30}", - nfkd: "\u{1100}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{AD31}", - nfc: "\u{AD31}", - nfd: "\u{1100}\u{116B}\u{11C0}", - nfkc: "\u{AD31}", - nfkd: "\u{1100}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{AD32}", - nfc: "\u{AD32}", - nfd: "\u{1100}\u{116B}\u{11C1}", - nfkc: "\u{AD32}", - nfkd: "\u{1100}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{AD33}", - nfc: "\u{AD33}", - nfd: "\u{1100}\u{116B}\u{11C2}", - nfkc: "\u{AD33}", - nfkd: "\u{1100}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{AD34}", - nfc: "\u{AD34}", - nfd: "\u{1100}\u{116C}", - nfkc: "\u{AD34}", - nfkd: "\u{1100}\u{116C}", - }, - NormalizationTest { - source: "\u{AD35}", - nfc: "\u{AD35}", - nfd: "\u{1100}\u{116C}\u{11A8}", - nfkc: "\u{AD35}", - nfkd: "\u{1100}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{AD36}", - nfc: "\u{AD36}", - nfd: "\u{1100}\u{116C}\u{11A9}", - nfkc: "\u{AD36}", - nfkd: "\u{1100}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{AD37}", - nfc: "\u{AD37}", - nfd: "\u{1100}\u{116C}\u{11AA}", - nfkc: "\u{AD37}", - nfkd: "\u{1100}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{AD38}", - nfc: "\u{AD38}", - nfd: "\u{1100}\u{116C}\u{11AB}", - nfkc: "\u{AD38}", - nfkd: "\u{1100}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{AD39}", - nfc: "\u{AD39}", - nfd: "\u{1100}\u{116C}\u{11AC}", - nfkc: "\u{AD39}", - nfkd: "\u{1100}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{AD3A}", - nfc: "\u{AD3A}", - nfd: "\u{1100}\u{116C}\u{11AD}", - nfkc: "\u{AD3A}", - nfkd: "\u{1100}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{AD3B}", - nfc: "\u{AD3B}", - nfd: "\u{1100}\u{116C}\u{11AE}", - nfkc: "\u{AD3B}", - nfkd: "\u{1100}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{AD3C}", - nfc: "\u{AD3C}", - nfd: "\u{1100}\u{116C}\u{11AF}", - nfkc: "\u{AD3C}", - nfkd: "\u{1100}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{AD3D}", - nfc: "\u{AD3D}", - nfd: "\u{1100}\u{116C}\u{11B0}", - nfkc: "\u{AD3D}", - nfkd: "\u{1100}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{AD3E}", - nfc: "\u{AD3E}", - nfd: "\u{1100}\u{116C}\u{11B1}", - nfkc: "\u{AD3E}", - nfkd: "\u{1100}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{AD3F}", - nfc: "\u{AD3F}", - nfd: "\u{1100}\u{116C}\u{11B2}", - nfkc: "\u{AD3F}", - nfkd: "\u{1100}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{AD40}", - nfc: "\u{AD40}", - nfd: "\u{1100}\u{116C}\u{11B3}", - nfkc: "\u{AD40}", - nfkd: "\u{1100}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{AD41}", - nfc: "\u{AD41}", - nfd: "\u{1100}\u{116C}\u{11B4}", - nfkc: "\u{AD41}", - nfkd: "\u{1100}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{AD42}", - nfc: "\u{AD42}", - nfd: "\u{1100}\u{116C}\u{11B5}", - nfkc: "\u{AD42}", - nfkd: "\u{1100}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{AD43}", - nfc: "\u{AD43}", - nfd: "\u{1100}\u{116C}\u{11B6}", - nfkc: "\u{AD43}", - nfkd: "\u{1100}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{AD44}", - nfc: "\u{AD44}", - nfd: "\u{1100}\u{116C}\u{11B7}", - nfkc: "\u{AD44}", - nfkd: "\u{1100}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{AD45}", - nfc: "\u{AD45}", - nfd: "\u{1100}\u{116C}\u{11B8}", - nfkc: "\u{AD45}", - nfkd: "\u{1100}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{AD46}", - nfc: "\u{AD46}", - nfd: "\u{1100}\u{116C}\u{11B9}", - nfkc: "\u{AD46}", - nfkd: "\u{1100}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{AD47}", - nfc: "\u{AD47}", - nfd: "\u{1100}\u{116C}\u{11BA}", - nfkc: "\u{AD47}", - nfkd: "\u{1100}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{AD48}", - nfc: "\u{AD48}", - nfd: "\u{1100}\u{116C}\u{11BB}", - nfkc: "\u{AD48}", - nfkd: "\u{1100}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{AD49}", - nfc: "\u{AD49}", - nfd: "\u{1100}\u{116C}\u{11BC}", - nfkc: "\u{AD49}", - nfkd: "\u{1100}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{AD4A}", - nfc: "\u{AD4A}", - nfd: "\u{1100}\u{116C}\u{11BD}", - nfkc: "\u{AD4A}", - nfkd: "\u{1100}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{AD4B}", - nfc: "\u{AD4B}", - nfd: "\u{1100}\u{116C}\u{11BE}", - nfkc: "\u{AD4B}", - nfkd: "\u{1100}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{AD4C}", - nfc: "\u{AD4C}", - nfd: "\u{1100}\u{116C}\u{11BF}", - nfkc: "\u{AD4C}", - nfkd: "\u{1100}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{AD4D}", - nfc: "\u{AD4D}", - nfd: "\u{1100}\u{116C}\u{11C0}", - nfkc: "\u{AD4D}", - nfkd: "\u{1100}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{AD4E}", - nfc: "\u{AD4E}", - nfd: "\u{1100}\u{116C}\u{11C1}", - nfkc: "\u{AD4E}", - nfkd: "\u{1100}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{AD4F}", - nfc: "\u{AD4F}", - nfd: "\u{1100}\u{116C}\u{11C2}", - nfkc: "\u{AD4F}", - nfkd: "\u{1100}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{AD50}", - nfc: "\u{AD50}", - nfd: "\u{1100}\u{116D}", - nfkc: "\u{AD50}", - nfkd: "\u{1100}\u{116D}", - }, - NormalizationTest { - source: "\u{AD51}", - nfc: "\u{AD51}", - nfd: "\u{1100}\u{116D}\u{11A8}", - nfkc: "\u{AD51}", - nfkd: "\u{1100}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{AD52}", - nfc: "\u{AD52}", - nfd: "\u{1100}\u{116D}\u{11A9}", - nfkc: "\u{AD52}", - nfkd: "\u{1100}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{AD53}", - nfc: "\u{AD53}", - nfd: "\u{1100}\u{116D}\u{11AA}", - nfkc: "\u{AD53}", - nfkd: "\u{1100}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{AD54}", - nfc: "\u{AD54}", - nfd: "\u{1100}\u{116D}\u{11AB}", - nfkc: "\u{AD54}", - nfkd: "\u{1100}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{AD55}", - nfc: "\u{AD55}", - nfd: "\u{1100}\u{116D}\u{11AC}", - nfkc: "\u{AD55}", - nfkd: "\u{1100}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{AD56}", - nfc: "\u{AD56}", - nfd: "\u{1100}\u{116D}\u{11AD}", - nfkc: "\u{AD56}", - nfkd: "\u{1100}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{AD57}", - nfc: "\u{AD57}", - nfd: "\u{1100}\u{116D}\u{11AE}", - nfkc: "\u{AD57}", - nfkd: "\u{1100}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{AD58}", - nfc: "\u{AD58}", - nfd: "\u{1100}\u{116D}\u{11AF}", - nfkc: "\u{AD58}", - nfkd: "\u{1100}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{AD59}", - nfc: "\u{AD59}", - nfd: "\u{1100}\u{116D}\u{11B0}", - nfkc: "\u{AD59}", - nfkd: "\u{1100}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{AD5A}", - nfc: "\u{AD5A}", - nfd: "\u{1100}\u{116D}\u{11B1}", - nfkc: "\u{AD5A}", - nfkd: "\u{1100}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{AD5B}", - nfc: "\u{AD5B}", - nfd: "\u{1100}\u{116D}\u{11B2}", - nfkc: "\u{AD5B}", - nfkd: "\u{1100}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{AD5C}", - nfc: "\u{AD5C}", - nfd: "\u{1100}\u{116D}\u{11B3}", - nfkc: "\u{AD5C}", - nfkd: "\u{1100}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{AD5D}", - nfc: "\u{AD5D}", - nfd: "\u{1100}\u{116D}\u{11B4}", - nfkc: "\u{AD5D}", - nfkd: "\u{1100}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{AD5E}", - nfc: "\u{AD5E}", - nfd: "\u{1100}\u{116D}\u{11B5}", - nfkc: "\u{AD5E}", - nfkd: "\u{1100}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{AD5F}", - nfc: "\u{AD5F}", - nfd: "\u{1100}\u{116D}\u{11B6}", - nfkc: "\u{AD5F}", - nfkd: "\u{1100}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{AD60}", - nfc: "\u{AD60}", - nfd: "\u{1100}\u{116D}\u{11B7}", - nfkc: "\u{AD60}", - nfkd: "\u{1100}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{AD61}", - nfc: "\u{AD61}", - nfd: "\u{1100}\u{116D}\u{11B8}", - nfkc: "\u{AD61}", - nfkd: "\u{1100}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{AD62}", - nfc: "\u{AD62}", - nfd: "\u{1100}\u{116D}\u{11B9}", - nfkc: "\u{AD62}", - nfkd: "\u{1100}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{AD63}", - nfc: "\u{AD63}", - nfd: "\u{1100}\u{116D}\u{11BA}", - nfkc: "\u{AD63}", - nfkd: "\u{1100}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{AD64}", - nfc: "\u{AD64}", - nfd: "\u{1100}\u{116D}\u{11BB}", - nfkc: "\u{AD64}", - nfkd: "\u{1100}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{AD65}", - nfc: "\u{AD65}", - nfd: "\u{1100}\u{116D}\u{11BC}", - nfkc: "\u{AD65}", - nfkd: "\u{1100}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{AD66}", - nfc: "\u{AD66}", - nfd: "\u{1100}\u{116D}\u{11BD}", - nfkc: "\u{AD66}", - nfkd: "\u{1100}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{AD67}", - nfc: "\u{AD67}", - nfd: "\u{1100}\u{116D}\u{11BE}", - nfkc: "\u{AD67}", - nfkd: "\u{1100}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{AD68}", - nfc: "\u{AD68}", - nfd: "\u{1100}\u{116D}\u{11BF}", - nfkc: "\u{AD68}", - nfkd: "\u{1100}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{AD69}", - nfc: "\u{AD69}", - nfd: "\u{1100}\u{116D}\u{11C0}", - nfkc: "\u{AD69}", - nfkd: "\u{1100}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{AD6A}", - nfc: "\u{AD6A}", - nfd: "\u{1100}\u{116D}\u{11C1}", - nfkc: "\u{AD6A}", - nfkd: "\u{1100}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{AD6B}", - nfc: "\u{AD6B}", - nfd: "\u{1100}\u{116D}\u{11C2}", - nfkc: "\u{AD6B}", - nfkd: "\u{1100}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{AD6C}", - nfc: "\u{AD6C}", - nfd: "\u{1100}\u{116E}", - nfkc: "\u{AD6C}", - nfkd: "\u{1100}\u{116E}", - }, - NormalizationTest { - source: "\u{AD6D}", - nfc: "\u{AD6D}", - nfd: "\u{1100}\u{116E}\u{11A8}", - nfkc: "\u{AD6D}", - nfkd: "\u{1100}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{AD6E}", - nfc: "\u{AD6E}", - nfd: "\u{1100}\u{116E}\u{11A9}", - nfkc: "\u{AD6E}", - nfkd: "\u{1100}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{AD6F}", - nfc: "\u{AD6F}", - nfd: "\u{1100}\u{116E}\u{11AA}", - nfkc: "\u{AD6F}", - nfkd: "\u{1100}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{AD70}", - nfc: "\u{AD70}", - nfd: "\u{1100}\u{116E}\u{11AB}", - nfkc: "\u{AD70}", - nfkd: "\u{1100}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{AD71}", - nfc: "\u{AD71}", - nfd: "\u{1100}\u{116E}\u{11AC}", - nfkc: "\u{AD71}", - nfkd: "\u{1100}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{AD72}", - nfc: "\u{AD72}", - nfd: "\u{1100}\u{116E}\u{11AD}", - nfkc: "\u{AD72}", - nfkd: "\u{1100}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{AD73}", - nfc: "\u{AD73}", - nfd: "\u{1100}\u{116E}\u{11AE}", - nfkc: "\u{AD73}", - nfkd: "\u{1100}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{AD74}", - nfc: "\u{AD74}", - nfd: "\u{1100}\u{116E}\u{11AF}", - nfkc: "\u{AD74}", - nfkd: "\u{1100}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{AD75}", - nfc: "\u{AD75}", - nfd: "\u{1100}\u{116E}\u{11B0}", - nfkc: "\u{AD75}", - nfkd: "\u{1100}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{AD76}", - nfc: "\u{AD76}", - nfd: "\u{1100}\u{116E}\u{11B1}", - nfkc: "\u{AD76}", - nfkd: "\u{1100}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{AD77}", - nfc: "\u{AD77}", - nfd: "\u{1100}\u{116E}\u{11B2}", - nfkc: "\u{AD77}", - nfkd: "\u{1100}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{AD78}", - nfc: "\u{AD78}", - nfd: "\u{1100}\u{116E}\u{11B3}", - nfkc: "\u{AD78}", - nfkd: "\u{1100}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{AD79}", - nfc: "\u{AD79}", - nfd: "\u{1100}\u{116E}\u{11B4}", - nfkc: "\u{AD79}", - nfkd: "\u{1100}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{AD7A}", - nfc: "\u{AD7A}", - nfd: "\u{1100}\u{116E}\u{11B5}", - nfkc: "\u{AD7A}", - nfkd: "\u{1100}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{AD7B}", - nfc: "\u{AD7B}", - nfd: "\u{1100}\u{116E}\u{11B6}", - nfkc: "\u{AD7B}", - nfkd: "\u{1100}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{AD7C}", - nfc: "\u{AD7C}", - nfd: "\u{1100}\u{116E}\u{11B7}", - nfkc: "\u{AD7C}", - nfkd: "\u{1100}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{AD7D}", - nfc: "\u{AD7D}", - nfd: "\u{1100}\u{116E}\u{11B8}", - nfkc: "\u{AD7D}", - nfkd: "\u{1100}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{AD7E}", - nfc: "\u{AD7E}", - nfd: "\u{1100}\u{116E}\u{11B9}", - nfkc: "\u{AD7E}", - nfkd: "\u{1100}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{AD7F}", - nfc: "\u{AD7F}", - nfd: "\u{1100}\u{116E}\u{11BA}", - nfkc: "\u{AD7F}", - nfkd: "\u{1100}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{AD80}", - nfc: "\u{AD80}", - nfd: "\u{1100}\u{116E}\u{11BB}", - nfkc: "\u{AD80}", - nfkd: "\u{1100}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{AD81}", - nfc: "\u{AD81}", - nfd: "\u{1100}\u{116E}\u{11BC}", - nfkc: "\u{AD81}", - nfkd: "\u{1100}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{AD82}", - nfc: "\u{AD82}", - nfd: "\u{1100}\u{116E}\u{11BD}", - nfkc: "\u{AD82}", - nfkd: "\u{1100}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{AD83}", - nfc: "\u{AD83}", - nfd: "\u{1100}\u{116E}\u{11BE}", - nfkc: "\u{AD83}", - nfkd: "\u{1100}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{AD84}", - nfc: "\u{AD84}", - nfd: "\u{1100}\u{116E}\u{11BF}", - nfkc: "\u{AD84}", - nfkd: "\u{1100}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{AD85}", - nfc: "\u{AD85}", - nfd: "\u{1100}\u{116E}\u{11C0}", - nfkc: "\u{AD85}", - nfkd: "\u{1100}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{AD86}", - nfc: "\u{AD86}", - nfd: "\u{1100}\u{116E}\u{11C1}", - nfkc: "\u{AD86}", - nfkd: "\u{1100}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{AD87}", - nfc: "\u{AD87}", - nfd: "\u{1100}\u{116E}\u{11C2}", - nfkc: "\u{AD87}", - nfkd: "\u{1100}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{AD88}", - nfc: "\u{AD88}", - nfd: "\u{1100}\u{116F}", - nfkc: "\u{AD88}", - nfkd: "\u{1100}\u{116F}", - }, - NormalizationTest { - source: "\u{AD89}", - nfc: "\u{AD89}", - nfd: "\u{1100}\u{116F}\u{11A8}", - nfkc: "\u{AD89}", - nfkd: "\u{1100}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{AD8A}", - nfc: "\u{AD8A}", - nfd: "\u{1100}\u{116F}\u{11A9}", - nfkc: "\u{AD8A}", - nfkd: "\u{1100}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{AD8B}", - nfc: "\u{AD8B}", - nfd: "\u{1100}\u{116F}\u{11AA}", - nfkc: "\u{AD8B}", - nfkd: "\u{1100}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{AD8C}", - nfc: "\u{AD8C}", - nfd: "\u{1100}\u{116F}\u{11AB}", - nfkc: "\u{AD8C}", - nfkd: "\u{1100}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{AD8D}", - nfc: "\u{AD8D}", - nfd: "\u{1100}\u{116F}\u{11AC}", - nfkc: "\u{AD8D}", - nfkd: "\u{1100}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{AD8E}", - nfc: "\u{AD8E}", - nfd: "\u{1100}\u{116F}\u{11AD}", - nfkc: "\u{AD8E}", - nfkd: "\u{1100}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{AD8F}", - nfc: "\u{AD8F}", - nfd: "\u{1100}\u{116F}\u{11AE}", - nfkc: "\u{AD8F}", - nfkd: "\u{1100}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{AD90}", - nfc: "\u{AD90}", - nfd: "\u{1100}\u{116F}\u{11AF}", - nfkc: "\u{AD90}", - nfkd: "\u{1100}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{AD91}", - nfc: "\u{AD91}", - nfd: "\u{1100}\u{116F}\u{11B0}", - nfkc: "\u{AD91}", - nfkd: "\u{1100}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{AD92}", - nfc: "\u{AD92}", - nfd: "\u{1100}\u{116F}\u{11B1}", - nfkc: "\u{AD92}", - nfkd: "\u{1100}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{AD93}", - nfc: "\u{AD93}", - nfd: "\u{1100}\u{116F}\u{11B2}", - nfkc: "\u{AD93}", - nfkd: "\u{1100}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{AD94}", - nfc: "\u{AD94}", - nfd: "\u{1100}\u{116F}\u{11B3}", - nfkc: "\u{AD94}", - nfkd: "\u{1100}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{AD95}", - nfc: "\u{AD95}", - nfd: "\u{1100}\u{116F}\u{11B4}", - nfkc: "\u{AD95}", - nfkd: "\u{1100}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{AD96}", - nfc: "\u{AD96}", - nfd: "\u{1100}\u{116F}\u{11B5}", - nfkc: "\u{AD96}", - nfkd: "\u{1100}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{AD97}", - nfc: "\u{AD97}", - nfd: "\u{1100}\u{116F}\u{11B6}", - nfkc: "\u{AD97}", - nfkd: "\u{1100}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{AD98}", - nfc: "\u{AD98}", - nfd: "\u{1100}\u{116F}\u{11B7}", - nfkc: "\u{AD98}", - nfkd: "\u{1100}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{AD99}", - nfc: "\u{AD99}", - nfd: "\u{1100}\u{116F}\u{11B8}", - nfkc: "\u{AD99}", - nfkd: "\u{1100}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{AD9A}", - nfc: "\u{AD9A}", - nfd: "\u{1100}\u{116F}\u{11B9}", - nfkc: "\u{AD9A}", - nfkd: "\u{1100}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{AD9B}", - nfc: "\u{AD9B}", - nfd: "\u{1100}\u{116F}\u{11BA}", - nfkc: "\u{AD9B}", - nfkd: "\u{1100}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{AD9C}", - nfc: "\u{AD9C}", - nfd: "\u{1100}\u{116F}\u{11BB}", - nfkc: "\u{AD9C}", - nfkd: "\u{1100}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{AD9D}", - nfc: "\u{AD9D}", - nfd: "\u{1100}\u{116F}\u{11BC}", - nfkc: "\u{AD9D}", - nfkd: "\u{1100}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{AD9E}", - nfc: "\u{AD9E}", - nfd: "\u{1100}\u{116F}\u{11BD}", - nfkc: "\u{AD9E}", - nfkd: "\u{1100}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{AD9F}", - nfc: "\u{AD9F}", - nfd: "\u{1100}\u{116F}\u{11BE}", - nfkc: "\u{AD9F}", - nfkd: "\u{1100}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{ADA0}", - nfc: "\u{ADA0}", - nfd: "\u{1100}\u{116F}\u{11BF}", - nfkc: "\u{ADA0}", - nfkd: "\u{1100}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{ADA1}", - nfc: "\u{ADA1}", - nfd: "\u{1100}\u{116F}\u{11C0}", - nfkc: "\u{ADA1}", - nfkd: "\u{1100}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{ADA2}", - nfc: "\u{ADA2}", - nfd: "\u{1100}\u{116F}\u{11C1}", - nfkc: "\u{ADA2}", - nfkd: "\u{1100}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{ADA3}", - nfc: "\u{ADA3}", - nfd: "\u{1100}\u{116F}\u{11C2}", - nfkc: "\u{ADA3}", - nfkd: "\u{1100}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{ADA4}", - nfc: "\u{ADA4}", - nfd: "\u{1100}\u{1170}", - nfkc: "\u{ADA4}", - nfkd: "\u{1100}\u{1170}", - }, - NormalizationTest { - source: "\u{ADA5}", - nfc: "\u{ADA5}", - nfd: "\u{1100}\u{1170}\u{11A8}", - nfkc: "\u{ADA5}", - nfkd: "\u{1100}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{ADA6}", - nfc: "\u{ADA6}", - nfd: "\u{1100}\u{1170}\u{11A9}", - nfkc: "\u{ADA6}", - nfkd: "\u{1100}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{ADA7}", - nfc: "\u{ADA7}", - nfd: "\u{1100}\u{1170}\u{11AA}", - nfkc: "\u{ADA7}", - nfkd: "\u{1100}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{ADA8}", - nfc: "\u{ADA8}", - nfd: "\u{1100}\u{1170}\u{11AB}", - nfkc: "\u{ADA8}", - nfkd: "\u{1100}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{ADA9}", - nfc: "\u{ADA9}", - nfd: "\u{1100}\u{1170}\u{11AC}", - nfkc: "\u{ADA9}", - nfkd: "\u{1100}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{ADAA}", - nfc: "\u{ADAA}", - nfd: "\u{1100}\u{1170}\u{11AD}", - nfkc: "\u{ADAA}", - nfkd: "\u{1100}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{ADAB}", - nfc: "\u{ADAB}", - nfd: "\u{1100}\u{1170}\u{11AE}", - nfkc: "\u{ADAB}", - nfkd: "\u{1100}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{ADAC}", - nfc: "\u{ADAC}", - nfd: "\u{1100}\u{1170}\u{11AF}", - nfkc: "\u{ADAC}", - nfkd: "\u{1100}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{ADAD}", - nfc: "\u{ADAD}", - nfd: "\u{1100}\u{1170}\u{11B0}", - nfkc: "\u{ADAD}", - nfkd: "\u{1100}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{ADAE}", - nfc: "\u{ADAE}", - nfd: "\u{1100}\u{1170}\u{11B1}", - nfkc: "\u{ADAE}", - nfkd: "\u{1100}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{ADAF}", - nfc: "\u{ADAF}", - nfd: "\u{1100}\u{1170}\u{11B2}", - nfkc: "\u{ADAF}", - nfkd: "\u{1100}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{ADB0}", - nfc: "\u{ADB0}", - nfd: "\u{1100}\u{1170}\u{11B3}", - nfkc: "\u{ADB0}", - nfkd: "\u{1100}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{ADB1}", - nfc: "\u{ADB1}", - nfd: "\u{1100}\u{1170}\u{11B4}", - nfkc: "\u{ADB1}", - nfkd: "\u{1100}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{ADB2}", - nfc: "\u{ADB2}", - nfd: "\u{1100}\u{1170}\u{11B5}", - nfkc: "\u{ADB2}", - nfkd: "\u{1100}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{ADB3}", - nfc: "\u{ADB3}", - nfd: "\u{1100}\u{1170}\u{11B6}", - nfkc: "\u{ADB3}", - nfkd: "\u{1100}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{ADB4}", - nfc: "\u{ADB4}", - nfd: "\u{1100}\u{1170}\u{11B7}", - nfkc: "\u{ADB4}", - nfkd: "\u{1100}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{ADB5}", - nfc: "\u{ADB5}", - nfd: "\u{1100}\u{1170}\u{11B8}", - nfkc: "\u{ADB5}", - nfkd: "\u{1100}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{ADB6}", - nfc: "\u{ADB6}", - nfd: "\u{1100}\u{1170}\u{11B9}", - nfkc: "\u{ADB6}", - nfkd: "\u{1100}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{ADB7}", - nfc: "\u{ADB7}", - nfd: "\u{1100}\u{1170}\u{11BA}", - nfkc: "\u{ADB7}", - nfkd: "\u{1100}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{ADB8}", - nfc: "\u{ADB8}", - nfd: "\u{1100}\u{1170}\u{11BB}", - nfkc: "\u{ADB8}", - nfkd: "\u{1100}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{ADB9}", - nfc: "\u{ADB9}", - nfd: "\u{1100}\u{1170}\u{11BC}", - nfkc: "\u{ADB9}", - nfkd: "\u{1100}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{ADBA}", - nfc: "\u{ADBA}", - nfd: "\u{1100}\u{1170}\u{11BD}", - nfkc: "\u{ADBA}", - nfkd: "\u{1100}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{ADBB}", - nfc: "\u{ADBB}", - nfd: "\u{1100}\u{1170}\u{11BE}", - nfkc: "\u{ADBB}", - nfkd: "\u{1100}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{ADBC}", - nfc: "\u{ADBC}", - nfd: "\u{1100}\u{1170}\u{11BF}", - nfkc: "\u{ADBC}", - nfkd: "\u{1100}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{ADBD}", - nfc: "\u{ADBD}", - nfd: "\u{1100}\u{1170}\u{11C0}", - nfkc: "\u{ADBD}", - nfkd: "\u{1100}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{ADBE}", - nfc: "\u{ADBE}", - nfd: "\u{1100}\u{1170}\u{11C1}", - nfkc: "\u{ADBE}", - nfkd: "\u{1100}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{ADBF}", - nfc: "\u{ADBF}", - nfd: "\u{1100}\u{1170}\u{11C2}", - nfkc: "\u{ADBF}", - nfkd: "\u{1100}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{ADC0}", - nfc: "\u{ADC0}", - nfd: "\u{1100}\u{1171}", - nfkc: "\u{ADC0}", - nfkd: "\u{1100}\u{1171}", - }, - NormalizationTest { - source: "\u{ADC1}", - nfc: "\u{ADC1}", - nfd: "\u{1100}\u{1171}\u{11A8}", - nfkc: "\u{ADC1}", - nfkd: "\u{1100}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{ADC2}", - nfc: "\u{ADC2}", - nfd: "\u{1100}\u{1171}\u{11A9}", - nfkc: "\u{ADC2}", - nfkd: "\u{1100}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{ADC3}", - nfc: "\u{ADC3}", - nfd: "\u{1100}\u{1171}\u{11AA}", - nfkc: "\u{ADC3}", - nfkd: "\u{1100}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{ADC4}", - nfc: "\u{ADC4}", - nfd: "\u{1100}\u{1171}\u{11AB}", - nfkc: "\u{ADC4}", - nfkd: "\u{1100}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{ADC5}", - nfc: "\u{ADC5}", - nfd: "\u{1100}\u{1171}\u{11AC}", - nfkc: "\u{ADC5}", - nfkd: "\u{1100}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{ADC6}", - nfc: "\u{ADC6}", - nfd: "\u{1100}\u{1171}\u{11AD}", - nfkc: "\u{ADC6}", - nfkd: "\u{1100}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{ADC7}", - nfc: "\u{ADC7}", - nfd: "\u{1100}\u{1171}\u{11AE}", - nfkc: "\u{ADC7}", - nfkd: "\u{1100}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{ADC8}", - nfc: "\u{ADC8}", - nfd: "\u{1100}\u{1171}\u{11AF}", - nfkc: "\u{ADC8}", - nfkd: "\u{1100}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{ADC9}", - nfc: "\u{ADC9}", - nfd: "\u{1100}\u{1171}\u{11B0}", - nfkc: "\u{ADC9}", - nfkd: "\u{1100}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{ADCA}", - nfc: "\u{ADCA}", - nfd: "\u{1100}\u{1171}\u{11B1}", - nfkc: "\u{ADCA}", - nfkd: "\u{1100}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{ADCB}", - nfc: "\u{ADCB}", - nfd: "\u{1100}\u{1171}\u{11B2}", - nfkc: "\u{ADCB}", - nfkd: "\u{1100}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{ADCC}", - nfc: "\u{ADCC}", - nfd: "\u{1100}\u{1171}\u{11B3}", - nfkc: "\u{ADCC}", - nfkd: "\u{1100}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{ADCD}", - nfc: "\u{ADCD}", - nfd: "\u{1100}\u{1171}\u{11B4}", - nfkc: "\u{ADCD}", - nfkd: "\u{1100}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{ADCE}", - nfc: "\u{ADCE}", - nfd: "\u{1100}\u{1171}\u{11B5}", - nfkc: "\u{ADCE}", - nfkd: "\u{1100}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{ADCF}", - nfc: "\u{ADCF}", - nfd: "\u{1100}\u{1171}\u{11B6}", - nfkc: "\u{ADCF}", - nfkd: "\u{1100}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{ADD0}", - nfc: "\u{ADD0}", - nfd: "\u{1100}\u{1171}\u{11B7}", - nfkc: "\u{ADD0}", - nfkd: "\u{1100}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{ADD1}", - nfc: "\u{ADD1}", - nfd: "\u{1100}\u{1171}\u{11B8}", - nfkc: "\u{ADD1}", - nfkd: "\u{1100}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{ADD2}", - nfc: "\u{ADD2}", - nfd: "\u{1100}\u{1171}\u{11B9}", - nfkc: "\u{ADD2}", - nfkd: "\u{1100}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{ADD3}", - nfc: "\u{ADD3}", - nfd: "\u{1100}\u{1171}\u{11BA}", - nfkc: "\u{ADD3}", - nfkd: "\u{1100}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{ADD4}", - nfc: "\u{ADD4}", - nfd: "\u{1100}\u{1171}\u{11BB}", - nfkc: "\u{ADD4}", - nfkd: "\u{1100}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{ADD5}", - nfc: "\u{ADD5}", - nfd: "\u{1100}\u{1171}\u{11BC}", - nfkc: "\u{ADD5}", - nfkd: "\u{1100}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{ADD6}", - nfc: "\u{ADD6}", - nfd: "\u{1100}\u{1171}\u{11BD}", - nfkc: "\u{ADD6}", - nfkd: "\u{1100}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{ADD7}", - nfc: "\u{ADD7}", - nfd: "\u{1100}\u{1171}\u{11BE}", - nfkc: "\u{ADD7}", - nfkd: "\u{1100}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{ADD8}", - nfc: "\u{ADD8}", - nfd: "\u{1100}\u{1171}\u{11BF}", - nfkc: "\u{ADD8}", - nfkd: "\u{1100}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{ADD9}", - nfc: "\u{ADD9}", - nfd: "\u{1100}\u{1171}\u{11C0}", - nfkc: "\u{ADD9}", - nfkd: "\u{1100}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{ADDA}", - nfc: "\u{ADDA}", - nfd: "\u{1100}\u{1171}\u{11C1}", - nfkc: "\u{ADDA}", - nfkd: "\u{1100}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{ADDB}", - nfc: "\u{ADDB}", - nfd: "\u{1100}\u{1171}\u{11C2}", - nfkc: "\u{ADDB}", - nfkd: "\u{1100}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{ADDC}", - nfc: "\u{ADDC}", - nfd: "\u{1100}\u{1172}", - nfkc: "\u{ADDC}", - nfkd: "\u{1100}\u{1172}", - }, - NormalizationTest { - source: "\u{ADDD}", - nfc: "\u{ADDD}", - nfd: "\u{1100}\u{1172}\u{11A8}", - nfkc: "\u{ADDD}", - nfkd: "\u{1100}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{ADDE}", - nfc: "\u{ADDE}", - nfd: "\u{1100}\u{1172}\u{11A9}", - nfkc: "\u{ADDE}", - nfkd: "\u{1100}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{ADDF}", - nfc: "\u{ADDF}", - nfd: "\u{1100}\u{1172}\u{11AA}", - nfkc: "\u{ADDF}", - nfkd: "\u{1100}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{ADE0}", - nfc: "\u{ADE0}", - nfd: "\u{1100}\u{1172}\u{11AB}", - nfkc: "\u{ADE0}", - nfkd: "\u{1100}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{ADE1}", - nfc: "\u{ADE1}", - nfd: "\u{1100}\u{1172}\u{11AC}", - nfkc: "\u{ADE1}", - nfkd: "\u{1100}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{ADE2}", - nfc: "\u{ADE2}", - nfd: "\u{1100}\u{1172}\u{11AD}", - nfkc: "\u{ADE2}", - nfkd: "\u{1100}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{ADE3}", - nfc: "\u{ADE3}", - nfd: "\u{1100}\u{1172}\u{11AE}", - nfkc: "\u{ADE3}", - nfkd: "\u{1100}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{ADE4}", - nfc: "\u{ADE4}", - nfd: "\u{1100}\u{1172}\u{11AF}", - nfkc: "\u{ADE4}", - nfkd: "\u{1100}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{ADE5}", - nfc: "\u{ADE5}", - nfd: "\u{1100}\u{1172}\u{11B0}", - nfkc: "\u{ADE5}", - nfkd: "\u{1100}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{ADE6}", - nfc: "\u{ADE6}", - nfd: "\u{1100}\u{1172}\u{11B1}", - nfkc: "\u{ADE6}", - nfkd: "\u{1100}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{ADE7}", - nfc: "\u{ADE7}", - nfd: "\u{1100}\u{1172}\u{11B2}", - nfkc: "\u{ADE7}", - nfkd: "\u{1100}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{ADE8}", - nfc: "\u{ADE8}", - nfd: "\u{1100}\u{1172}\u{11B3}", - nfkc: "\u{ADE8}", - nfkd: "\u{1100}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{ADE9}", - nfc: "\u{ADE9}", - nfd: "\u{1100}\u{1172}\u{11B4}", - nfkc: "\u{ADE9}", - nfkd: "\u{1100}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{ADEA}", - nfc: "\u{ADEA}", - nfd: "\u{1100}\u{1172}\u{11B5}", - nfkc: "\u{ADEA}", - nfkd: "\u{1100}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{ADEB}", - nfc: "\u{ADEB}", - nfd: "\u{1100}\u{1172}\u{11B6}", - nfkc: "\u{ADEB}", - nfkd: "\u{1100}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{ADEC}", - nfc: "\u{ADEC}", - nfd: "\u{1100}\u{1172}\u{11B7}", - nfkc: "\u{ADEC}", - nfkd: "\u{1100}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{ADED}", - nfc: "\u{ADED}", - nfd: "\u{1100}\u{1172}\u{11B8}", - nfkc: "\u{ADED}", - nfkd: "\u{1100}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{ADEE}", - nfc: "\u{ADEE}", - nfd: "\u{1100}\u{1172}\u{11B9}", - nfkc: "\u{ADEE}", - nfkd: "\u{1100}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{ADEF}", - nfc: "\u{ADEF}", - nfd: "\u{1100}\u{1172}\u{11BA}", - nfkc: "\u{ADEF}", - nfkd: "\u{1100}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{ADF0}", - nfc: "\u{ADF0}", - nfd: "\u{1100}\u{1172}\u{11BB}", - nfkc: "\u{ADF0}", - nfkd: "\u{1100}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{ADF1}", - nfc: "\u{ADF1}", - nfd: "\u{1100}\u{1172}\u{11BC}", - nfkc: "\u{ADF1}", - nfkd: "\u{1100}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{ADF2}", - nfc: "\u{ADF2}", - nfd: "\u{1100}\u{1172}\u{11BD}", - nfkc: "\u{ADF2}", - nfkd: "\u{1100}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{ADF3}", - nfc: "\u{ADF3}", - nfd: "\u{1100}\u{1172}\u{11BE}", - nfkc: "\u{ADF3}", - nfkd: "\u{1100}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{ADF4}", - nfc: "\u{ADF4}", - nfd: "\u{1100}\u{1172}\u{11BF}", - nfkc: "\u{ADF4}", - nfkd: "\u{1100}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{ADF5}", - nfc: "\u{ADF5}", - nfd: "\u{1100}\u{1172}\u{11C0}", - nfkc: "\u{ADF5}", - nfkd: "\u{1100}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{ADF6}", - nfc: "\u{ADF6}", - nfd: "\u{1100}\u{1172}\u{11C1}", - nfkc: "\u{ADF6}", - nfkd: "\u{1100}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{ADF7}", - nfc: "\u{ADF7}", - nfd: "\u{1100}\u{1172}\u{11C2}", - nfkc: "\u{ADF7}", - nfkd: "\u{1100}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{ADF8}", - nfc: "\u{ADF8}", - nfd: "\u{1100}\u{1173}", - nfkc: "\u{ADF8}", - nfkd: "\u{1100}\u{1173}", - }, - NormalizationTest { - source: "\u{ADF9}", - nfc: "\u{ADF9}", - nfd: "\u{1100}\u{1173}\u{11A8}", - nfkc: "\u{ADF9}", - nfkd: "\u{1100}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{ADFA}", - nfc: "\u{ADFA}", - nfd: "\u{1100}\u{1173}\u{11A9}", - nfkc: "\u{ADFA}", - nfkd: "\u{1100}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{ADFB}", - nfc: "\u{ADFB}", - nfd: "\u{1100}\u{1173}\u{11AA}", - nfkc: "\u{ADFB}", - nfkd: "\u{1100}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{ADFC}", - nfc: "\u{ADFC}", - nfd: "\u{1100}\u{1173}\u{11AB}", - nfkc: "\u{ADFC}", - nfkd: "\u{1100}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{ADFD}", - nfc: "\u{ADFD}", - nfd: "\u{1100}\u{1173}\u{11AC}", - nfkc: "\u{ADFD}", - nfkd: "\u{1100}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{ADFE}", - nfc: "\u{ADFE}", - nfd: "\u{1100}\u{1173}\u{11AD}", - nfkc: "\u{ADFE}", - nfkd: "\u{1100}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{ADFF}", - nfc: "\u{ADFF}", - nfd: "\u{1100}\u{1173}\u{11AE}", - nfkc: "\u{ADFF}", - nfkd: "\u{1100}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{AE00}", - nfc: "\u{AE00}", - nfd: "\u{1100}\u{1173}\u{11AF}", - nfkc: "\u{AE00}", - nfkd: "\u{1100}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{AE01}", - nfc: "\u{AE01}", - nfd: "\u{1100}\u{1173}\u{11B0}", - nfkc: "\u{AE01}", - nfkd: "\u{1100}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{AE02}", - nfc: "\u{AE02}", - nfd: "\u{1100}\u{1173}\u{11B1}", - nfkc: "\u{AE02}", - nfkd: "\u{1100}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{AE03}", - nfc: "\u{AE03}", - nfd: "\u{1100}\u{1173}\u{11B2}", - nfkc: "\u{AE03}", - nfkd: "\u{1100}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{AE04}", - nfc: "\u{AE04}", - nfd: "\u{1100}\u{1173}\u{11B3}", - nfkc: "\u{AE04}", - nfkd: "\u{1100}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{AE05}", - nfc: "\u{AE05}", - nfd: "\u{1100}\u{1173}\u{11B4}", - nfkc: "\u{AE05}", - nfkd: "\u{1100}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{AE06}", - nfc: "\u{AE06}", - nfd: "\u{1100}\u{1173}\u{11B5}", - nfkc: "\u{AE06}", - nfkd: "\u{1100}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{AE07}", - nfc: "\u{AE07}", - nfd: "\u{1100}\u{1173}\u{11B6}", - nfkc: "\u{AE07}", - nfkd: "\u{1100}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{AE08}", - nfc: "\u{AE08}", - nfd: "\u{1100}\u{1173}\u{11B7}", - nfkc: "\u{AE08}", - nfkd: "\u{1100}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{AE09}", - nfc: "\u{AE09}", - nfd: "\u{1100}\u{1173}\u{11B8}", - nfkc: "\u{AE09}", - nfkd: "\u{1100}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{AE0A}", - nfc: "\u{AE0A}", - nfd: "\u{1100}\u{1173}\u{11B9}", - nfkc: "\u{AE0A}", - nfkd: "\u{1100}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{AE0B}", - nfc: "\u{AE0B}", - nfd: "\u{1100}\u{1173}\u{11BA}", - nfkc: "\u{AE0B}", - nfkd: "\u{1100}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{AE0C}", - nfc: "\u{AE0C}", - nfd: "\u{1100}\u{1173}\u{11BB}", - nfkc: "\u{AE0C}", - nfkd: "\u{1100}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{AE0D}", - nfc: "\u{AE0D}", - nfd: "\u{1100}\u{1173}\u{11BC}", - nfkc: "\u{AE0D}", - nfkd: "\u{1100}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{AE0E}", - nfc: "\u{AE0E}", - nfd: "\u{1100}\u{1173}\u{11BD}", - nfkc: "\u{AE0E}", - nfkd: "\u{1100}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{AE0F}", - nfc: "\u{AE0F}", - nfd: "\u{1100}\u{1173}\u{11BE}", - nfkc: "\u{AE0F}", - nfkd: "\u{1100}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{AE10}", - nfc: "\u{AE10}", - nfd: "\u{1100}\u{1173}\u{11BF}", - nfkc: "\u{AE10}", - nfkd: "\u{1100}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{AE11}", - nfc: "\u{AE11}", - nfd: "\u{1100}\u{1173}\u{11C0}", - nfkc: "\u{AE11}", - nfkd: "\u{1100}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{AE12}", - nfc: "\u{AE12}", - nfd: "\u{1100}\u{1173}\u{11C1}", - nfkc: "\u{AE12}", - nfkd: "\u{1100}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{AE13}", - nfc: "\u{AE13}", - nfd: "\u{1100}\u{1173}\u{11C2}", - nfkc: "\u{AE13}", - nfkd: "\u{1100}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{AE14}", - nfc: "\u{AE14}", - nfd: "\u{1100}\u{1174}", - nfkc: "\u{AE14}", - nfkd: "\u{1100}\u{1174}", - }, - NormalizationTest { - source: "\u{AE15}", - nfc: "\u{AE15}", - nfd: "\u{1100}\u{1174}\u{11A8}", - nfkc: "\u{AE15}", - nfkd: "\u{1100}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{AE16}", - nfc: "\u{AE16}", - nfd: "\u{1100}\u{1174}\u{11A9}", - nfkc: "\u{AE16}", - nfkd: "\u{1100}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{AE17}", - nfc: "\u{AE17}", - nfd: "\u{1100}\u{1174}\u{11AA}", - nfkc: "\u{AE17}", - nfkd: "\u{1100}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{AE18}", - nfc: "\u{AE18}", - nfd: "\u{1100}\u{1174}\u{11AB}", - nfkc: "\u{AE18}", - nfkd: "\u{1100}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{AE19}", - nfc: "\u{AE19}", - nfd: "\u{1100}\u{1174}\u{11AC}", - nfkc: "\u{AE19}", - nfkd: "\u{1100}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{AE1A}", - nfc: "\u{AE1A}", - nfd: "\u{1100}\u{1174}\u{11AD}", - nfkc: "\u{AE1A}", - nfkd: "\u{1100}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{AE1B}", - nfc: "\u{AE1B}", - nfd: "\u{1100}\u{1174}\u{11AE}", - nfkc: "\u{AE1B}", - nfkd: "\u{1100}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{AE1C}", - nfc: "\u{AE1C}", - nfd: "\u{1100}\u{1174}\u{11AF}", - nfkc: "\u{AE1C}", - nfkd: "\u{1100}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{AE1D}", - nfc: "\u{AE1D}", - nfd: "\u{1100}\u{1174}\u{11B0}", - nfkc: "\u{AE1D}", - nfkd: "\u{1100}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{AE1E}", - nfc: "\u{AE1E}", - nfd: "\u{1100}\u{1174}\u{11B1}", - nfkc: "\u{AE1E}", - nfkd: "\u{1100}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{AE1F}", - nfc: "\u{AE1F}", - nfd: "\u{1100}\u{1174}\u{11B2}", - nfkc: "\u{AE1F}", - nfkd: "\u{1100}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{AE20}", - nfc: "\u{AE20}", - nfd: "\u{1100}\u{1174}\u{11B3}", - nfkc: "\u{AE20}", - nfkd: "\u{1100}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{AE21}", - nfc: "\u{AE21}", - nfd: "\u{1100}\u{1174}\u{11B4}", - nfkc: "\u{AE21}", - nfkd: "\u{1100}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{AE22}", - nfc: "\u{AE22}", - nfd: "\u{1100}\u{1174}\u{11B5}", - nfkc: "\u{AE22}", - nfkd: "\u{1100}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{AE23}", - nfc: "\u{AE23}", - nfd: "\u{1100}\u{1174}\u{11B6}", - nfkc: "\u{AE23}", - nfkd: "\u{1100}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{AE24}", - nfc: "\u{AE24}", - nfd: "\u{1100}\u{1174}\u{11B7}", - nfkc: "\u{AE24}", - nfkd: "\u{1100}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{AE25}", - nfc: "\u{AE25}", - nfd: "\u{1100}\u{1174}\u{11B8}", - nfkc: "\u{AE25}", - nfkd: "\u{1100}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{AE26}", - nfc: "\u{AE26}", - nfd: "\u{1100}\u{1174}\u{11B9}", - nfkc: "\u{AE26}", - nfkd: "\u{1100}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{AE27}", - nfc: "\u{AE27}", - nfd: "\u{1100}\u{1174}\u{11BA}", - nfkc: "\u{AE27}", - nfkd: "\u{1100}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{AE28}", - nfc: "\u{AE28}", - nfd: "\u{1100}\u{1174}\u{11BB}", - nfkc: "\u{AE28}", - nfkd: "\u{1100}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{AE29}", - nfc: "\u{AE29}", - nfd: "\u{1100}\u{1174}\u{11BC}", - nfkc: "\u{AE29}", - nfkd: "\u{1100}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{AE2A}", - nfc: "\u{AE2A}", - nfd: "\u{1100}\u{1174}\u{11BD}", - nfkc: "\u{AE2A}", - nfkd: "\u{1100}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{AE2B}", - nfc: "\u{AE2B}", - nfd: "\u{1100}\u{1174}\u{11BE}", - nfkc: "\u{AE2B}", - nfkd: "\u{1100}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{AE2C}", - nfc: "\u{AE2C}", - nfd: "\u{1100}\u{1174}\u{11BF}", - nfkc: "\u{AE2C}", - nfkd: "\u{1100}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{AE2D}", - nfc: "\u{AE2D}", - nfd: "\u{1100}\u{1174}\u{11C0}", - nfkc: "\u{AE2D}", - nfkd: "\u{1100}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{AE2E}", - nfc: "\u{AE2E}", - nfd: "\u{1100}\u{1174}\u{11C1}", - nfkc: "\u{AE2E}", - nfkd: "\u{1100}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{AE2F}", - nfc: "\u{AE2F}", - nfd: "\u{1100}\u{1174}\u{11C2}", - nfkc: "\u{AE2F}", - nfkd: "\u{1100}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{AE30}", - nfc: "\u{AE30}", - nfd: "\u{1100}\u{1175}", - nfkc: "\u{AE30}", - nfkd: "\u{1100}\u{1175}", - }, - NormalizationTest { - source: "\u{AE31}", - nfc: "\u{AE31}", - nfd: "\u{1100}\u{1175}\u{11A8}", - nfkc: "\u{AE31}", - nfkd: "\u{1100}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{AE32}", - nfc: "\u{AE32}", - nfd: "\u{1100}\u{1175}\u{11A9}", - nfkc: "\u{AE32}", - nfkd: "\u{1100}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{AE33}", - nfc: "\u{AE33}", - nfd: "\u{1100}\u{1175}\u{11AA}", - nfkc: "\u{AE33}", - nfkd: "\u{1100}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{AE34}", - nfc: "\u{AE34}", - nfd: "\u{1100}\u{1175}\u{11AB}", - nfkc: "\u{AE34}", - nfkd: "\u{1100}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{AE35}", - nfc: "\u{AE35}", - nfd: "\u{1100}\u{1175}\u{11AC}", - nfkc: "\u{AE35}", - nfkd: "\u{1100}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{AE36}", - nfc: "\u{AE36}", - nfd: "\u{1100}\u{1175}\u{11AD}", - nfkc: "\u{AE36}", - nfkd: "\u{1100}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{AE37}", - nfc: "\u{AE37}", - nfd: "\u{1100}\u{1175}\u{11AE}", - nfkc: "\u{AE37}", - nfkd: "\u{1100}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{AE38}", - nfc: "\u{AE38}", - nfd: "\u{1100}\u{1175}\u{11AF}", - nfkc: "\u{AE38}", - nfkd: "\u{1100}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{AE39}", - nfc: "\u{AE39}", - nfd: "\u{1100}\u{1175}\u{11B0}", - nfkc: "\u{AE39}", - nfkd: "\u{1100}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{AE3A}", - nfc: "\u{AE3A}", - nfd: "\u{1100}\u{1175}\u{11B1}", - nfkc: "\u{AE3A}", - nfkd: "\u{1100}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{AE3B}", - nfc: "\u{AE3B}", - nfd: "\u{1100}\u{1175}\u{11B2}", - nfkc: "\u{AE3B}", - nfkd: "\u{1100}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{AE3C}", - nfc: "\u{AE3C}", - nfd: "\u{1100}\u{1175}\u{11B3}", - nfkc: "\u{AE3C}", - nfkd: "\u{1100}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{AE3D}", - nfc: "\u{AE3D}", - nfd: "\u{1100}\u{1175}\u{11B4}", - nfkc: "\u{AE3D}", - nfkd: "\u{1100}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{AE3E}", - nfc: "\u{AE3E}", - nfd: "\u{1100}\u{1175}\u{11B5}", - nfkc: "\u{AE3E}", - nfkd: "\u{1100}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{AE3F}", - nfc: "\u{AE3F}", - nfd: "\u{1100}\u{1175}\u{11B6}", - nfkc: "\u{AE3F}", - nfkd: "\u{1100}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{AE40}", - nfc: "\u{AE40}", - nfd: "\u{1100}\u{1175}\u{11B7}", - nfkc: "\u{AE40}", - nfkd: "\u{1100}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{AE41}", - nfc: "\u{AE41}", - nfd: "\u{1100}\u{1175}\u{11B8}", - nfkc: "\u{AE41}", - nfkd: "\u{1100}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{AE42}", - nfc: "\u{AE42}", - nfd: "\u{1100}\u{1175}\u{11B9}", - nfkc: "\u{AE42}", - nfkd: "\u{1100}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{AE43}", - nfc: "\u{AE43}", - nfd: "\u{1100}\u{1175}\u{11BA}", - nfkc: "\u{AE43}", - nfkd: "\u{1100}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{AE44}", - nfc: "\u{AE44}", - nfd: "\u{1100}\u{1175}\u{11BB}", - nfkc: "\u{AE44}", - nfkd: "\u{1100}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{AE45}", - nfc: "\u{AE45}", - nfd: "\u{1100}\u{1175}\u{11BC}", - nfkc: "\u{AE45}", - nfkd: "\u{1100}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{AE46}", - nfc: "\u{AE46}", - nfd: "\u{1100}\u{1175}\u{11BD}", - nfkc: "\u{AE46}", - nfkd: "\u{1100}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{AE47}", - nfc: "\u{AE47}", - nfd: "\u{1100}\u{1175}\u{11BE}", - nfkc: "\u{AE47}", - nfkd: "\u{1100}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{AE48}", - nfc: "\u{AE48}", - nfd: "\u{1100}\u{1175}\u{11BF}", - nfkc: "\u{AE48}", - nfkd: "\u{1100}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{AE49}", - nfc: "\u{AE49}", - nfd: "\u{1100}\u{1175}\u{11C0}", - nfkc: "\u{AE49}", - nfkd: "\u{1100}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{AE4A}", - nfc: "\u{AE4A}", - nfd: "\u{1100}\u{1175}\u{11C1}", - nfkc: "\u{AE4A}", - nfkd: "\u{1100}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{AE4B}", - nfc: "\u{AE4B}", - nfd: "\u{1100}\u{1175}\u{11C2}", - nfkc: "\u{AE4B}", - nfkd: "\u{1100}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{AE4C}", - nfc: "\u{AE4C}", - nfd: "\u{1101}\u{1161}", - nfkc: "\u{AE4C}", - nfkd: "\u{1101}\u{1161}", - }, - NormalizationTest { - source: "\u{AE4D}", - nfc: "\u{AE4D}", - nfd: "\u{1101}\u{1161}\u{11A8}", - nfkc: "\u{AE4D}", - nfkd: "\u{1101}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{AE4E}", - nfc: "\u{AE4E}", - nfd: "\u{1101}\u{1161}\u{11A9}", - nfkc: "\u{AE4E}", - nfkd: "\u{1101}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{AE4F}", - nfc: "\u{AE4F}", - nfd: "\u{1101}\u{1161}\u{11AA}", - nfkc: "\u{AE4F}", - nfkd: "\u{1101}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{AE50}", - nfc: "\u{AE50}", - nfd: "\u{1101}\u{1161}\u{11AB}", - nfkc: "\u{AE50}", - nfkd: "\u{1101}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{AE51}", - nfc: "\u{AE51}", - nfd: "\u{1101}\u{1161}\u{11AC}", - nfkc: "\u{AE51}", - nfkd: "\u{1101}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{AE52}", - nfc: "\u{AE52}", - nfd: "\u{1101}\u{1161}\u{11AD}", - nfkc: "\u{AE52}", - nfkd: "\u{1101}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{AE53}", - nfc: "\u{AE53}", - nfd: "\u{1101}\u{1161}\u{11AE}", - nfkc: "\u{AE53}", - nfkd: "\u{1101}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{AE54}", - nfc: "\u{AE54}", - nfd: "\u{1101}\u{1161}\u{11AF}", - nfkc: "\u{AE54}", - nfkd: "\u{1101}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{AE55}", - nfc: "\u{AE55}", - nfd: "\u{1101}\u{1161}\u{11B0}", - nfkc: "\u{AE55}", - nfkd: "\u{1101}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{AE56}", - nfc: "\u{AE56}", - nfd: "\u{1101}\u{1161}\u{11B1}", - nfkc: "\u{AE56}", - nfkd: "\u{1101}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{AE57}", - nfc: "\u{AE57}", - nfd: "\u{1101}\u{1161}\u{11B2}", - nfkc: "\u{AE57}", - nfkd: "\u{1101}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{AE58}", - nfc: "\u{AE58}", - nfd: "\u{1101}\u{1161}\u{11B3}", - nfkc: "\u{AE58}", - nfkd: "\u{1101}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{AE59}", - nfc: "\u{AE59}", - nfd: "\u{1101}\u{1161}\u{11B4}", - nfkc: "\u{AE59}", - nfkd: "\u{1101}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{AE5A}", - nfc: "\u{AE5A}", - nfd: "\u{1101}\u{1161}\u{11B5}", - nfkc: "\u{AE5A}", - nfkd: "\u{1101}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{AE5B}", - nfc: "\u{AE5B}", - nfd: "\u{1101}\u{1161}\u{11B6}", - nfkc: "\u{AE5B}", - nfkd: "\u{1101}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{AE5C}", - nfc: "\u{AE5C}", - nfd: "\u{1101}\u{1161}\u{11B7}", - nfkc: "\u{AE5C}", - nfkd: "\u{1101}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{AE5D}", - nfc: "\u{AE5D}", - nfd: "\u{1101}\u{1161}\u{11B8}", - nfkc: "\u{AE5D}", - nfkd: "\u{1101}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{AE5E}", - nfc: "\u{AE5E}", - nfd: "\u{1101}\u{1161}\u{11B9}", - nfkc: "\u{AE5E}", - nfkd: "\u{1101}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{AE5F}", - nfc: "\u{AE5F}", - nfd: "\u{1101}\u{1161}\u{11BA}", - nfkc: "\u{AE5F}", - nfkd: "\u{1101}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{AE60}", - nfc: "\u{AE60}", - nfd: "\u{1101}\u{1161}\u{11BB}", - nfkc: "\u{AE60}", - nfkd: "\u{1101}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{AE61}", - nfc: "\u{AE61}", - nfd: "\u{1101}\u{1161}\u{11BC}", - nfkc: "\u{AE61}", - nfkd: "\u{1101}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{AE62}", - nfc: "\u{AE62}", - nfd: "\u{1101}\u{1161}\u{11BD}", - nfkc: "\u{AE62}", - nfkd: "\u{1101}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{AE63}", - nfc: "\u{AE63}", - nfd: "\u{1101}\u{1161}\u{11BE}", - nfkc: "\u{AE63}", - nfkd: "\u{1101}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{AE64}", - nfc: "\u{AE64}", - nfd: "\u{1101}\u{1161}\u{11BF}", - nfkc: "\u{AE64}", - nfkd: "\u{1101}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{AE65}", - nfc: "\u{AE65}", - nfd: "\u{1101}\u{1161}\u{11C0}", - nfkc: "\u{AE65}", - nfkd: "\u{1101}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{AE66}", - nfc: "\u{AE66}", - nfd: "\u{1101}\u{1161}\u{11C1}", - nfkc: "\u{AE66}", - nfkd: "\u{1101}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{AE67}", - nfc: "\u{AE67}", - nfd: "\u{1101}\u{1161}\u{11C2}", - nfkc: "\u{AE67}", - nfkd: "\u{1101}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{AE68}", - nfc: "\u{AE68}", - nfd: "\u{1101}\u{1162}", - nfkc: "\u{AE68}", - nfkd: "\u{1101}\u{1162}", - }, - NormalizationTest { - source: "\u{AE69}", - nfc: "\u{AE69}", - nfd: "\u{1101}\u{1162}\u{11A8}", - nfkc: "\u{AE69}", - nfkd: "\u{1101}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{AE6A}", - nfc: "\u{AE6A}", - nfd: "\u{1101}\u{1162}\u{11A9}", - nfkc: "\u{AE6A}", - nfkd: "\u{1101}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{AE6B}", - nfc: "\u{AE6B}", - nfd: "\u{1101}\u{1162}\u{11AA}", - nfkc: "\u{AE6B}", - nfkd: "\u{1101}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{AE6C}", - nfc: "\u{AE6C}", - nfd: "\u{1101}\u{1162}\u{11AB}", - nfkc: "\u{AE6C}", - nfkd: "\u{1101}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{AE6D}", - nfc: "\u{AE6D}", - nfd: "\u{1101}\u{1162}\u{11AC}", - nfkc: "\u{AE6D}", - nfkd: "\u{1101}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{AE6E}", - nfc: "\u{AE6E}", - nfd: "\u{1101}\u{1162}\u{11AD}", - nfkc: "\u{AE6E}", - nfkd: "\u{1101}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{AE6F}", - nfc: "\u{AE6F}", - nfd: "\u{1101}\u{1162}\u{11AE}", - nfkc: "\u{AE6F}", - nfkd: "\u{1101}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{AE70}", - nfc: "\u{AE70}", - nfd: "\u{1101}\u{1162}\u{11AF}", - nfkc: "\u{AE70}", - nfkd: "\u{1101}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{AE71}", - nfc: "\u{AE71}", - nfd: "\u{1101}\u{1162}\u{11B0}", - nfkc: "\u{AE71}", - nfkd: "\u{1101}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{AE72}", - nfc: "\u{AE72}", - nfd: "\u{1101}\u{1162}\u{11B1}", - nfkc: "\u{AE72}", - nfkd: "\u{1101}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{AE73}", - nfc: "\u{AE73}", - nfd: "\u{1101}\u{1162}\u{11B2}", - nfkc: "\u{AE73}", - nfkd: "\u{1101}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{AE74}", - nfc: "\u{AE74}", - nfd: "\u{1101}\u{1162}\u{11B3}", - nfkc: "\u{AE74}", - nfkd: "\u{1101}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{AE75}", - nfc: "\u{AE75}", - nfd: "\u{1101}\u{1162}\u{11B4}", - nfkc: "\u{AE75}", - nfkd: "\u{1101}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{AE76}", - nfc: "\u{AE76}", - nfd: "\u{1101}\u{1162}\u{11B5}", - nfkc: "\u{AE76}", - nfkd: "\u{1101}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{AE77}", - nfc: "\u{AE77}", - nfd: "\u{1101}\u{1162}\u{11B6}", - nfkc: "\u{AE77}", - nfkd: "\u{1101}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{AE78}", - nfc: "\u{AE78}", - nfd: "\u{1101}\u{1162}\u{11B7}", - nfkc: "\u{AE78}", - nfkd: "\u{1101}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{AE79}", - nfc: "\u{AE79}", - nfd: "\u{1101}\u{1162}\u{11B8}", - nfkc: "\u{AE79}", - nfkd: "\u{1101}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{AE7A}", - nfc: "\u{AE7A}", - nfd: "\u{1101}\u{1162}\u{11B9}", - nfkc: "\u{AE7A}", - nfkd: "\u{1101}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{AE7B}", - nfc: "\u{AE7B}", - nfd: "\u{1101}\u{1162}\u{11BA}", - nfkc: "\u{AE7B}", - nfkd: "\u{1101}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{AE7C}", - nfc: "\u{AE7C}", - nfd: "\u{1101}\u{1162}\u{11BB}", - nfkc: "\u{AE7C}", - nfkd: "\u{1101}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{AE7D}", - nfc: "\u{AE7D}", - nfd: "\u{1101}\u{1162}\u{11BC}", - nfkc: "\u{AE7D}", - nfkd: "\u{1101}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{AE7E}", - nfc: "\u{AE7E}", - nfd: "\u{1101}\u{1162}\u{11BD}", - nfkc: "\u{AE7E}", - nfkd: "\u{1101}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{AE7F}", - nfc: "\u{AE7F}", - nfd: "\u{1101}\u{1162}\u{11BE}", - nfkc: "\u{AE7F}", - nfkd: "\u{1101}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{AE80}", - nfc: "\u{AE80}", - nfd: "\u{1101}\u{1162}\u{11BF}", - nfkc: "\u{AE80}", - nfkd: "\u{1101}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{AE81}", - nfc: "\u{AE81}", - nfd: "\u{1101}\u{1162}\u{11C0}", - nfkc: "\u{AE81}", - nfkd: "\u{1101}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{AE82}", - nfc: "\u{AE82}", - nfd: "\u{1101}\u{1162}\u{11C1}", - nfkc: "\u{AE82}", - nfkd: "\u{1101}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{AE83}", - nfc: "\u{AE83}", - nfd: "\u{1101}\u{1162}\u{11C2}", - nfkc: "\u{AE83}", - nfkd: "\u{1101}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{AE84}", - nfc: "\u{AE84}", - nfd: "\u{1101}\u{1163}", - nfkc: "\u{AE84}", - nfkd: "\u{1101}\u{1163}", - }, - NormalizationTest { - source: "\u{AE85}", - nfc: "\u{AE85}", - nfd: "\u{1101}\u{1163}\u{11A8}", - nfkc: "\u{AE85}", - nfkd: "\u{1101}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{AE86}", - nfc: "\u{AE86}", - nfd: "\u{1101}\u{1163}\u{11A9}", - nfkc: "\u{AE86}", - nfkd: "\u{1101}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{AE87}", - nfc: "\u{AE87}", - nfd: "\u{1101}\u{1163}\u{11AA}", - nfkc: "\u{AE87}", - nfkd: "\u{1101}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{AE88}", - nfc: "\u{AE88}", - nfd: "\u{1101}\u{1163}\u{11AB}", - nfkc: "\u{AE88}", - nfkd: "\u{1101}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{AE89}", - nfc: "\u{AE89}", - nfd: "\u{1101}\u{1163}\u{11AC}", - nfkc: "\u{AE89}", - nfkd: "\u{1101}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{AE8A}", - nfc: "\u{AE8A}", - nfd: "\u{1101}\u{1163}\u{11AD}", - nfkc: "\u{AE8A}", - nfkd: "\u{1101}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{AE8B}", - nfc: "\u{AE8B}", - nfd: "\u{1101}\u{1163}\u{11AE}", - nfkc: "\u{AE8B}", - nfkd: "\u{1101}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{AE8C}", - nfc: "\u{AE8C}", - nfd: "\u{1101}\u{1163}\u{11AF}", - nfkc: "\u{AE8C}", - nfkd: "\u{1101}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{AE8D}", - nfc: "\u{AE8D}", - nfd: "\u{1101}\u{1163}\u{11B0}", - nfkc: "\u{AE8D}", - nfkd: "\u{1101}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{AE8E}", - nfc: "\u{AE8E}", - nfd: "\u{1101}\u{1163}\u{11B1}", - nfkc: "\u{AE8E}", - nfkd: "\u{1101}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{AE8F}", - nfc: "\u{AE8F}", - nfd: "\u{1101}\u{1163}\u{11B2}", - nfkc: "\u{AE8F}", - nfkd: "\u{1101}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{AE90}", - nfc: "\u{AE90}", - nfd: "\u{1101}\u{1163}\u{11B3}", - nfkc: "\u{AE90}", - nfkd: "\u{1101}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{AE91}", - nfc: "\u{AE91}", - nfd: "\u{1101}\u{1163}\u{11B4}", - nfkc: "\u{AE91}", - nfkd: "\u{1101}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{AE92}", - nfc: "\u{AE92}", - nfd: "\u{1101}\u{1163}\u{11B5}", - nfkc: "\u{AE92}", - nfkd: "\u{1101}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{AE93}", - nfc: "\u{AE93}", - nfd: "\u{1101}\u{1163}\u{11B6}", - nfkc: "\u{AE93}", - nfkd: "\u{1101}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{AE94}", - nfc: "\u{AE94}", - nfd: "\u{1101}\u{1163}\u{11B7}", - nfkc: "\u{AE94}", - nfkd: "\u{1101}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{AE95}", - nfc: "\u{AE95}", - nfd: "\u{1101}\u{1163}\u{11B8}", - nfkc: "\u{AE95}", - nfkd: "\u{1101}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{AE96}", - nfc: "\u{AE96}", - nfd: "\u{1101}\u{1163}\u{11B9}", - nfkc: "\u{AE96}", - nfkd: "\u{1101}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{AE97}", - nfc: "\u{AE97}", - nfd: "\u{1101}\u{1163}\u{11BA}", - nfkc: "\u{AE97}", - nfkd: "\u{1101}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{AE98}", - nfc: "\u{AE98}", - nfd: "\u{1101}\u{1163}\u{11BB}", - nfkc: "\u{AE98}", - nfkd: "\u{1101}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{AE99}", - nfc: "\u{AE99}", - nfd: "\u{1101}\u{1163}\u{11BC}", - nfkc: "\u{AE99}", - nfkd: "\u{1101}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{AE9A}", - nfc: "\u{AE9A}", - nfd: "\u{1101}\u{1163}\u{11BD}", - nfkc: "\u{AE9A}", - nfkd: "\u{1101}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{AE9B}", - nfc: "\u{AE9B}", - nfd: "\u{1101}\u{1163}\u{11BE}", - nfkc: "\u{AE9B}", - nfkd: "\u{1101}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{AE9C}", - nfc: "\u{AE9C}", - nfd: "\u{1101}\u{1163}\u{11BF}", - nfkc: "\u{AE9C}", - nfkd: "\u{1101}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{AE9D}", - nfc: "\u{AE9D}", - nfd: "\u{1101}\u{1163}\u{11C0}", - nfkc: "\u{AE9D}", - nfkd: "\u{1101}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{AE9E}", - nfc: "\u{AE9E}", - nfd: "\u{1101}\u{1163}\u{11C1}", - nfkc: "\u{AE9E}", - nfkd: "\u{1101}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{AE9F}", - nfc: "\u{AE9F}", - nfd: "\u{1101}\u{1163}\u{11C2}", - nfkc: "\u{AE9F}", - nfkd: "\u{1101}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{AEA0}", - nfc: "\u{AEA0}", - nfd: "\u{1101}\u{1164}", - nfkc: "\u{AEA0}", - nfkd: "\u{1101}\u{1164}", - }, - NormalizationTest { - source: "\u{AEA1}", - nfc: "\u{AEA1}", - nfd: "\u{1101}\u{1164}\u{11A8}", - nfkc: "\u{AEA1}", - nfkd: "\u{1101}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{AEA2}", - nfc: "\u{AEA2}", - nfd: "\u{1101}\u{1164}\u{11A9}", - nfkc: "\u{AEA2}", - nfkd: "\u{1101}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{AEA3}", - nfc: "\u{AEA3}", - nfd: "\u{1101}\u{1164}\u{11AA}", - nfkc: "\u{AEA3}", - nfkd: "\u{1101}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{AEA4}", - nfc: "\u{AEA4}", - nfd: "\u{1101}\u{1164}\u{11AB}", - nfkc: "\u{AEA4}", - nfkd: "\u{1101}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{AEA5}", - nfc: "\u{AEA5}", - nfd: "\u{1101}\u{1164}\u{11AC}", - nfkc: "\u{AEA5}", - nfkd: "\u{1101}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{AEA6}", - nfc: "\u{AEA6}", - nfd: "\u{1101}\u{1164}\u{11AD}", - nfkc: "\u{AEA6}", - nfkd: "\u{1101}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{AEA7}", - nfc: "\u{AEA7}", - nfd: "\u{1101}\u{1164}\u{11AE}", - nfkc: "\u{AEA7}", - nfkd: "\u{1101}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{AEA8}", - nfc: "\u{AEA8}", - nfd: "\u{1101}\u{1164}\u{11AF}", - nfkc: "\u{AEA8}", - nfkd: "\u{1101}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{AEA9}", - nfc: "\u{AEA9}", - nfd: "\u{1101}\u{1164}\u{11B0}", - nfkc: "\u{AEA9}", - nfkd: "\u{1101}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{AEAA}", - nfc: "\u{AEAA}", - nfd: "\u{1101}\u{1164}\u{11B1}", - nfkc: "\u{AEAA}", - nfkd: "\u{1101}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{AEAB}", - nfc: "\u{AEAB}", - nfd: "\u{1101}\u{1164}\u{11B2}", - nfkc: "\u{AEAB}", - nfkd: "\u{1101}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{AEAC}", - nfc: "\u{AEAC}", - nfd: "\u{1101}\u{1164}\u{11B3}", - nfkc: "\u{AEAC}", - nfkd: "\u{1101}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{AEAD}", - nfc: "\u{AEAD}", - nfd: "\u{1101}\u{1164}\u{11B4}", - nfkc: "\u{AEAD}", - nfkd: "\u{1101}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{AEAE}", - nfc: "\u{AEAE}", - nfd: "\u{1101}\u{1164}\u{11B5}", - nfkc: "\u{AEAE}", - nfkd: "\u{1101}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{AEAF}", - nfc: "\u{AEAF}", - nfd: "\u{1101}\u{1164}\u{11B6}", - nfkc: "\u{AEAF}", - nfkd: "\u{1101}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{AEB0}", - nfc: "\u{AEB0}", - nfd: "\u{1101}\u{1164}\u{11B7}", - nfkc: "\u{AEB0}", - nfkd: "\u{1101}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{AEB1}", - nfc: "\u{AEB1}", - nfd: "\u{1101}\u{1164}\u{11B8}", - nfkc: "\u{AEB1}", - nfkd: "\u{1101}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{AEB2}", - nfc: "\u{AEB2}", - nfd: "\u{1101}\u{1164}\u{11B9}", - nfkc: "\u{AEB2}", - nfkd: "\u{1101}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{AEB3}", - nfc: "\u{AEB3}", - nfd: "\u{1101}\u{1164}\u{11BA}", - nfkc: "\u{AEB3}", - nfkd: "\u{1101}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{AEB4}", - nfc: "\u{AEB4}", - nfd: "\u{1101}\u{1164}\u{11BB}", - nfkc: "\u{AEB4}", - nfkd: "\u{1101}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{AEB5}", - nfc: "\u{AEB5}", - nfd: "\u{1101}\u{1164}\u{11BC}", - nfkc: "\u{AEB5}", - nfkd: "\u{1101}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{AEB6}", - nfc: "\u{AEB6}", - nfd: "\u{1101}\u{1164}\u{11BD}", - nfkc: "\u{AEB6}", - nfkd: "\u{1101}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{AEB7}", - nfc: "\u{AEB7}", - nfd: "\u{1101}\u{1164}\u{11BE}", - nfkc: "\u{AEB7}", - nfkd: "\u{1101}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{AEB8}", - nfc: "\u{AEB8}", - nfd: "\u{1101}\u{1164}\u{11BF}", - nfkc: "\u{AEB8}", - nfkd: "\u{1101}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{AEB9}", - nfc: "\u{AEB9}", - nfd: "\u{1101}\u{1164}\u{11C0}", - nfkc: "\u{AEB9}", - nfkd: "\u{1101}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{AEBA}", - nfc: "\u{AEBA}", - nfd: "\u{1101}\u{1164}\u{11C1}", - nfkc: "\u{AEBA}", - nfkd: "\u{1101}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{AEBB}", - nfc: "\u{AEBB}", - nfd: "\u{1101}\u{1164}\u{11C2}", - nfkc: "\u{AEBB}", - nfkd: "\u{1101}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{AEBC}", - nfc: "\u{AEBC}", - nfd: "\u{1101}\u{1165}", - nfkc: "\u{AEBC}", - nfkd: "\u{1101}\u{1165}", - }, - NormalizationTest { - source: "\u{AEBD}", - nfc: "\u{AEBD}", - nfd: "\u{1101}\u{1165}\u{11A8}", - nfkc: "\u{AEBD}", - nfkd: "\u{1101}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{AEBE}", - nfc: "\u{AEBE}", - nfd: "\u{1101}\u{1165}\u{11A9}", - nfkc: "\u{AEBE}", - nfkd: "\u{1101}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{AEBF}", - nfc: "\u{AEBF}", - nfd: "\u{1101}\u{1165}\u{11AA}", - nfkc: "\u{AEBF}", - nfkd: "\u{1101}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{AEC0}", - nfc: "\u{AEC0}", - nfd: "\u{1101}\u{1165}\u{11AB}", - nfkc: "\u{AEC0}", - nfkd: "\u{1101}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{AEC1}", - nfc: "\u{AEC1}", - nfd: "\u{1101}\u{1165}\u{11AC}", - nfkc: "\u{AEC1}", - nfkd: "\u{1101}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{AEC2}", - nfc: "\u{AEC2}", - nfd: "\u{1101}\u{1165}\u{11AD}", - nfkc: "\u{AEC2}", - nfkd: "\u{1101}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{AEC3}", - nfc: "\u{AEC3}", - nfd: "\u{1101}\u{1165}\u{11AE}", - nfkc: "\u{AEC3}", - nfkd: "\u{1101}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{AEC4}", - nfc: "\u{AEC4}", - nfd: "\u{1101}\u{1165}\u{11AF}", - nfkc: "\u{AEC4}", - nfkd: "\u{1101}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{AEC5}", - nfc: "\u{AEC5}", - nfd: "\u{1101}\u{1165}\u{11B0}", - nfkc: "\u{AEC5}", - nfkd: "\u{1101}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{AEC6}", - nfc: "\u{AEC6}", - nfd: "\u{1101}\u{1165}\u{11B1}", - nfkc: "\u{AEC6}", - nfkd: "\u{1101}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{AEC7}", - nfc: "\u{AEC7}", - nfd: "\u{1101}\u{1165}\u{11B2}", - nfkc: "\u{AEC7}", - nfkd: "\u{1101}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{AEC8}", - nfc: "\u{AEC8}", - nfd: "\u{1101}\u{1165}\u{11B3}", - nfkc: "\u{AEC8}", - nfkd: "\u{1101}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{AEC9}", - nfc: "\u{AEC9}", - nfd: "\u{1101}\u{1165}\u{11B4}", - nfkc: "\u{AEC9}", - nfkd: "\u{1101}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{AECA}", - nfc: "\u{AECA}", - nfd: "\u{1101}\u{1165}\u{11B5}", - nfkc: "\u{AECA}", - nfkd: "\u{1101}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{AECB}", - nfc: "\u{AECB}", - nfd: "\u{1101}\u{1165}\u{11B6}", - nfkc: "\u{AECB}", - nfkd: "\u{1101}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{AECC}", - nfc: "\u{AECC}", - nfd: "\u{1101}\u{1165}\u{11B7}", - nfkc: "\u{AECC}", - nfkd: "\u{1101}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{AECD}", - nfc: "\u{AECD}", - nfd: "\u{1101}\u{1165}\u{11B8}", - nfkc: "\u{AECD}", - nfkd: "\u{1101}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{AECE}", - nfc: "\u{AECE}", - nfd: "\u{1101}\u{1165}\u{11B9}", - nfkc: "\u{AECE}", - nfkd: "\u{1101}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{AECF}", - nfc: "\u{AECF}", - nfd: "\u{1101}\u{1165}\u{11BA}", - nfkc: "\u{AECF}", - nfkd: "\u{1101}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{AED0}", - nfc: "\u{AED0}", - nfd: "\u{1101}\u{1165}\u{11BB}", - nfkc: "\u{AED0}", - nfkd: "\u{1101}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{AED1}", - nfc: "\u{AED1}", - nfd: "\u{1101}\u{1165}\u{11BC}", - nfkc: "\u{AED1}", - nfkd: "\u{1101}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{AED2}", - nfc: "\u{AED2}", - nfd: "\u{1101}\u{1165}\u{11BD}", - nfkc: "\u{AED2}", - nfkd: "\u{1101}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{AED3}", - nfc: "\u{AED3}", - nfd: "\u{1101}\u{1165}\u{11BE}", - nfkc: "\u{AED3}", - nfkd: "\u{1101}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{AED4}", - nfc: "\u{AED4}", - nfd: "\u{1101}\u{1165}\u{11BF}", - nfkc: "\u{AED4}", - nfkd: "\u{1101}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{AED5}", - nfc: "\u{AED5}", - nfd: "\u{1101}\u{1165}\u{11C0}", - nfkc: "\u{AED5}", - nfkd: "\u{1101}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{AED6}", - nfc: "\u{AED6}", - nfd: "\u{1101}\u{1165}\u{11C1}", - nfkc: "\u{AED6}", - nfkd: "\u{1101}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{AED7}", - nfc: "\u{AED7}", - nfd: "\u{1101}\u{1165}\u{11C2}", - nfkc: "\u{AED7}", - nfkd: "\u{1101}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{AED8}", - nfc: "\u{AED8}", - nfd: "\u{1101}\u{1166}", - nfkc: "\u{AED8}", - nfkd: "\u{1101}\u{1166}", - }, - NormalizationTest { - source: "\u{AED9}", - nfc: "\u{AED9}", - nfd: "\u{1101}\u{1166}\u{11A8}", - nfkc: "\u{AED9}", - nfkd: "\u{1101}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{AEDA}", - nfc: "\u{AEDA}", - nfd: "\u{1101}\u{1166}\u{11A9}", - nfkc: "\u{AEDA}", - nfkd: "\u{1101}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{AEDB}", - nfc: "\u{AEDB}", - nfd: "\u{1101}\u{1166}\u{11AA}", - nfkc: "\u{AEDB}", - nfkd: "\u{1101}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{AEDC}", - nfc: "\u{AEDC}", - nfd: "\u{1101}\u{1166}\u{11AB}", - nfkc: "\u{AEDC}", - nfkd: "\u{1101}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{AEDD}", - nfc: "\u{AEDD}", - nfd: "\u{1101}\u{1166}\u{11AC}", - nfkc: "\u{AEDD}", - nfkd: "\u{1101}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{AEDE}", - nfc: "\u{AEDE}", - nfd: "\u{1101}\u{1166}\u{11AD}", - nfkc: "\u{AEDE}", - nfkd: "\u{1101}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{AEDF}", - nfc: "\u{AEDF}", - nfd: "\u{1101}\u{1166}\u{11AE}", - nfkc: "\u{AEDF}", - nfkd: "\u{1101}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{AEE0}", - nfc: "\u{AEE0}", - nfd: "\u{1101}\u{1166}\u{11AF}", - nfkc: "\u{AEE0}", - nfkd: "\u{1101}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{AEE1}", - nfc: "\u{AEE1}", - nfd: "\u{1101}\u{1166}\u{11B0}", - nfkc: "\u{AEE1}", - nfkd: "\u{1101}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{AEE2}", - nfc: "\u{AEE2}", - nfd: "\u{1101}\u{1166}\u{11B1}", - nfkc: "\u{AEE2}", - nfkd: "\u{1101}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{AEE3}", - nfc: "\u{AEE3}", - nfd: "\u{1101}\u{1166}\u{11B2}", - nfkc: "\u{AEE3}", - nfkd: "\u{1101}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{AEE4}", - nfc: "\u{AEE4}", - nfd: "\u{1101}\u{1166}\u{11B3}", - nfkc: "\u{AEE4}", - nfkd: "\u{1101}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{AEE5}", - nfc: "\u{AEE5}", - nfd: "\u{1101}\u{1166}\u{11B4}", - nfkc: "\u{AEE5}", - nfkd: "\u{1101}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{AEE6}", - nfc: "\u{AEE6}", - nfd: "\u{1101}\u{1166}\u{11B5}", - nfkc: "\u{AEE6}", - nfkd: "\u{1101}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{AEE7}", - nfc: "\u{AEE7}", - nfd: "\u{1101}\u{1166}\u{11B6}", - nfkc: "\u{AEE7}", - nfkd: "\u{1101}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{AEE8}", - nfc: "\u{AEE8}", - nfd: "\u{1101}\u{1166}\u{11B7}", - nfkc: "\u{AEE8}", - nfkd: "\u{1101}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{AEE9}", - nfc: "\u{AEE9}", - nfd: "\u{1101}\u{1166}\u{11B8}", - nfkc: "\u{AEE9}", - nfkd: "\u{1101}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{AEEA}", - nfc: "\u{AEEA}", - nfd: "\u{1101}\u{1166}\u{11B9}", - nfkc: "\u{AEEA}", - nfkd: "\u{1101}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{AEEB}", - nfc: "\u{AEEB}", - nfd: "\u{1101}\u{1166}\u{11BA}", - nfkc: "\u{AEEB}", - nfkd: "\u{1101}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{AEEC}", - nfc: "\u{AEEC}", - nfd: "\u{1101}\u{1166}\u{11BB}", - nfkc: "\u{AEEC}", - nfkd: "\u{1101}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{AEED}", - nfc: "\u{AEED}", - nfd: "\u{1101}\u{1166}\u{11BC}", - nfkc: "\u{AEED}", - nfkd: "\u{1101}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{AEEE}", - nfc: "\u{AEEE}", - nfd: "\u{1101}\u{1166}\u{11BD}", - nfkc: "\u{AEEE}", - nfkd: "\u{1101}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{AEEF}", - nfc: "\u{AEEF}", - nfd: "\u{1101}\u{1166}\u{11BE}", - nfkc: "\u{AEEF}", - nfkd: "\u{1101}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{AEF0}", - nfc: "\u{AEF0}", - nfd: "\u{1101}\u{1166}\u{11BF}", - nfkc: "\u{AEF0}", - nfkd: "\u{1101}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{AEF1}", - nfc: "\u{AEF1}", - nfd: "\u{1101}\u{1166}\u{11C0}", - nfkc: "\u{AEF1}", - nfkd: "\u{1101}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{AEF2}", - nfc: "\u{AEF2}", - nfd: "\u{1101}\u{1166}\u{11C1}", - nfkc: "\u{AEF2}", - nfkd: "\u{1101}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{AEF3}", - nfc: "\u{AEF3}", - nfd: "\u{1101}\u{1166}\u{11C2}", - nfkc: "\u{AEF3}", - nfkd: "\u{1101}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{AEF4}", - nfc: "\u{AEF4}", - nfd: "\u{1101}\u{1167}", - nfkc: "\u{AEF4}", - nfkd: "\u{1101}\u{1167}", - }, - NormalizationTest { - source: "\u{AEF5}", - nfc: "\u{AEF5}", - nfd: "\u{1101}\u{1167}\u{11A8}", - nfkc: "\u{AEF5}", - nfkd: "\u{1101}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{AEF6}", - nfc: "\u{AEF6}", - nfd: "\u{1101}\u{1167}\u{11A9}", - nfkc: "\u{AEF6}", - nfkd: "\u{1101}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{AEF7}", - nfc: "\u{AEF7}", - nfd: "\u{1101}\u{1167}\u{11AA}", - nfkc: "\u{AEF7}", - nfkd: "\u{1101}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{AEF8}", - nfc: "\u{AEF8}", - nfd: "\u{1101}\u{1167}\u{11AB}", - nfkc: "\u{AEF8}", - nfkd: "\u{1101}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{AEF9}", - nfc: "\u{AEF9}", - nfd: "\u{1101}\u{1167}\u{11AC}", - nfkc: "\u{AEF9}", - nfkd: "\u{1101}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{AEFA}", - nfc: "\u{AEFA}", - nfd: "\u{1101}\u{1167}\u{11AD}", - nfkc: "\u{AEFA}", - nfkd: "\u{1101}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{AEFB}", - nfc: "\u{AEFB}", - nfd: "\u{1101}\u{1167}\u{11AE}", - nfkc: "\u{AEFB}", - nfkd: "\u{1101}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{AEFC}", - nfc: "\u{AEFC}", - nfd: "\u{1101}\u{1167}\u{11AF}", - nfkc: "\u{AEFC}", - nfkd: "\u{1101}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{AEFD}", - nfc: "\u{AEFD}", - nfd: "\u{1101}\u{1167}\u{11B0}", - nfkc: "\u{AEFD}", - nfkd: "\u{1101}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{AEFE}", - nfc: "\u{AEFE}", - nfd: "\u{1101}\u{1167}\u{11B1}", - nfkc: "\u{AEFE}", - nfkd: "\u{1101}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{AEFF}", - nfc: "\u{AEFF}", - nfd: "\u{1101}\u{1167}\u{11B2}", - nfkc: "\u{AEFF}", - nfkd: "\u{1101}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{AF00}", - nfc: "\u{AF00}", - nfd: "\u{1101}\u{1167}\u{11B3}", - nfkc: "\u{AF00}", - nfkd: "\u{1101}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{AF01}", - nfc: "\u{AF01}", - nfd: "\u{1101}\u{1167}\u{11B4}", - nfkc: "\u{AF01}", - nfkd: "\u{1101}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{AF02}", - nfc: "\u{AF02}", - nfd: "\u{1101}\u{1167}\u{11B5}", - nfkc: "\u{AF02}", - nfkd: "\u{1101}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{AF03}", - nfc: "\u{AF03}", - nfd: "\u{1101}\u{1167}\u{11B6}", - nfkc: "\u{AF03}", - nfkd: "\u{1101}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{AF04}", - nfc: "\u{AF04}", - nfd: "\u{1101}\u{1167}\u{11B7}", - nfkc: "\u{AF04}", - nfkd: "\u{1101}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{AF05}", - nfc: "\u{AF05}", - nfd: "\u{1101}\u{1167}\u{11B8}", - nfkc: "\u{AF05}", - nfkd: "\u{1101}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{AF06}", - nfc: "\u{AF06}", - nfd: "\u{1101}\u{1167}\u{11B9}", - nfkc: "\u{AF06}", - nfkd: "\u{1101}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{AF07}", - nfc: "\u{AF07}", - nfd: "\u{1101}\u{1167}\u{11BA}", - nfkc: "\u{AF07}", - nfkd: "\u{1101}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{AF08}", - nfc: "\u{AF08}", - nfd: "\u{1101}\u{1167}\u{11BB}", - nfkc: "\u{AF08}", - nfkd: "\u{1101}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{AF09}", - nfc: "\u{AF09}", - nfd: "\u{1101}\u{1167}\u{11BC}", - nfkc: "\u{AF09}", - nfkd: "\u{1101}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{AF0A}", - nfc: "\u{AF0A}", - nfd: "\u{1101}\u{1167}\u{11BD}", - nfkc: "\u{AF0A}", - nfkd: "\u{1101}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{AF0B}", - nfc: "\u{AF0B}", - nfd: "\u{1101}\u{1167}\u{11BE}", - nfkc: "\u{AF0B}", - nfkd: "\u{1101}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{AF0C}", - nfc: "\u{AF0C}", - nfd: "\u{1101}\u{1167}\u{11BF}", - nfkc: "\u{AF0C}", - nfkd: "\u{1101}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{AF0D}", - nfc: "\u{AF0D}", - nfd: "\u{1101}\u{1167}\u{11C0}", - nfkc: "\u{AF0D}", - nfkd: "\u{1101}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{AF0E}", - nfc: "\u{AF0E}", - nfd: "\u{1101}\u{1167}\u{11C1}", - nfkc: "\u{AF0E}", - nfkd: "\u{1101}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{AF0F}", - nfc: "\u{AF0F}", - nfd: "\u{1101}\u{1167}\u{11C2}", - nfkc: "\u{AF0F}", - nfkd: "\u{1101}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{AF10}", - nfc: "\u{AF10}", - nfd: "\u{1101}\u{1168}", - nfkc: "\u{AF10}", - nfkd: "\u{1101}\u{1168}", - }, - NormalizationTest { - source: "\u{AF11}", - nfc: "\u{AF11}", - nfd: "\u{1101}\u{1168}\u{11A8}", - nfkc: "\u{AF11}", - nfkd: "\u{1101}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{AF12}", - nfc: "\u{AF12}", - nfd: "\u{1101}\u{1168}\u{11A9}", - nfkc: "\u{AF12}", - nfkd: "\u{1101}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{AF13}", - nfc: "\u{AF13}", - nfd: "\u{1101}\u{1168}\u{11AA}", - nfkc: "\u{AF13}", - nfkd: "\u{1101}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{AF14}", - nfc: "\u{AF14}", - nfd: "\u{1101}\u{1168}\u{11AB}", - nfkc: "\u{AF14}", - nfkd: "\u{1101}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{AF15}", - nfc: "\u{AF15}", - nfd: "\u{1101}\u{1168}\u{11AC}", - nfkc: "\u{AF15}", - nfkd: "\u{1101}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{AF16}", - nfc: "\u{AF16}", - nfd: "\u{1101}\u{1168}\u{11AD}", - nfkc: "\u{AF16}", - nfkd: "\u{1101}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{AF17}", - nfc: "\u{AF17}", - nfd: "\u{1101}\u{1168}\u{11AE}", - nfkc: "\u{AF17}", - nfkd: "\u{1101}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{AF18}", - nfc: "\u{AF18}", - nfd: "\u{1101}\u{1168}\u{11AF}", - nfkc: "\u{AF18}", - nfkd: "\u{1101}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{AF19}", - nfc: "\u{AF19}", - nfd: "\u{1101}\u{1168}\u{11B0}", - nfkc: "\u{AF19}", - nfkd: "\u{1101}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{AF1A}", - nfc: "\u{AF1A}", - nfd: "\u{1101}\u{1168}\u{11B1}", - nfkc: "\u{AF1A}", - nfkd: "\u{1101}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{AF1B}", - nfc: "\u{AF1B}", - nfd: "\u{1101}\u{1168}\u{11B2}", - nfkc: "\u{AF1B}", - nfkd: "\u{1101}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{AF1C}", - nfc: "\u{AF1C}", - nfd: "\u{1101}\u{1168}\u{11B3}", - nfkc: "\u{AF1C}", - nfkd: "\u{1101}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{AF1D}", - nfc: "\u{AF1D}", - nfd: "\u{1101}\u{1168}\u{11B4}", - nfkc: "\u{AF1D}", - nfkd: "\u{1101}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{AF1E}", - nfc: "\u{AF1E}", - nfd: "\u{1101}\u{1168}\u{11B5}", - nfkc: "\u{AF1E}", - nfkd: "\u{1101}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{AF1F}", - nfc: "\u{AF1F}", - nfd: "\u{1101}\u{1168}\u{11B6}", - nfkc: "\u{AF1F}", - nfkd: "\u{1101}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{AF20}", - nfc: "\u{AF20}", - nfd: "\u{1101}\u{1168}\u{11B7}", - nfkc: "\u{AF20}", - nfkd: "\u{1101}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{AF21}", - nfc: "\u{AF21}", - nfd: "\u{1101}\u{1168}\u{11B8}", - nfkc: "\u{AF21}", - nfkd: "\u{1101}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{AF22}", - nfc: "\u{AF22}", - nfd: "\u{1101}\u{1168}\u{11B9}", - nfkc: "\u{AF22}", - nfkd: "\u{1101}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{AF23}", - nfc: "\u{AF23}", - nfd: "\u{1101}\u{1168}\u{11BA}", - nfkc: "\u{AF23}", - nfkd: "\u{1101}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{AF24}", - nfc: "\u{AF24}", - nfd: "\u{1101}\u{1168}\u{11BB}", - nfkc: "\u{AF24}", - nfkd: "\u{1101}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{AF25}", - nfc: "\u{AF25}", - nfd: "\u{1101}\u{1168}\u{11BC}", - nfkc: "\u{AF25}", - nfkd: "\u{1101}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{AF26}", - nfc: "\u{AF26}", - nfd: "\u{1101}\u{1168}\u{11BD}", - nfkc: "\u{AF26}", - nfkd: "\u{1101}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{AF27}", - nfc: "\u{AF27}", - nfd: "\u{1101}\u{1168}\u{11BE}", - nfkc: "\u{AF27}", - nfkd: "\u{1101}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{AF28}", - nfc: "\u{AF28}", - nfd: "\u{1101}\u{1168}\u{11BF}", - nfkc: "\u{AF28}", - nfkd: "\u{1101}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{AF29}", - nfc: "\u{AF29}", - nfd: "\u{1101}\u{1168}\u{11C0}", - nfkc: "\u{AF29}", - nfkd: "\u{1101}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{AF2A}", - nfc: "\u{AF2A}", - nfd: "\u{1101}\u{1168}\u{11C1}", - nfkc: "\u{AF2A}", - nfkd: "\u{1101}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{AF2B}", - nfc: "\u{AF2B}", - nfd: "\u{1101}\u{1168}\u{11C2}", - nfkc: "\u{AF2B}", - nfkd: "\u{1101}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{AF2C}", - nfc: "\u{AF2C}", - nfd: "\u{1101}\u{1169}", - nfkc: "\u{AF2C}", - nfkd: "\u{1101}\u{1169}", - }, - NormalizationTest { - source: "\u{AF2D}", - nfc: "\u{AF2D}", - nfd: "\u{1101}\u{1169}\u{11A8}", - nfkc: "\u{AF2D}", - nfkd: "\u{1101}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{AF2E}", - nfc: "\u{AF2E}", - nfd: "\u{1101}\u{1169}\u{11A9}", - nfkc: "\u{AF2E}", - nfkd: "\u{1101}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{AF2F}", - nfc: "\u{AF2F}", - nfd: "\u{1101}\u{1169}\u{11AA}", - nfkc: "\u{AF2F}", - nfkd: "\u{1101}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{AF30}", - nfc: "\u{AF30}", - nfd: "\u{1101}\u{1169}\u{11AB}", - nfkc: "\u{AF30}", - nfkd: "\u{1101}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{AF31}", - nfc: "\u{AF31}", - nfd: "\u{1101}\u{1169}\u{11AC}", - nfkc: "\u{AF31}", - nfkd: "\u{1101}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{AF32}", - nfc: "\u{AF32}", - nfd: "\u{1101}\u{1169}\u{11AD}", - nfkc: "\u{AF32}", - nfkd: "\u{1101}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{AF33}", - nfc: "\u{AF33}", - nfd: "\u{1101}\u{1169}\u{11AE}", - nfkc: "\u{AF33}", - nfkd: "\u{1101}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{AF34}", - nfc: "\u{AF34}", - nfd: "\u{1101}\u{1169}\u{11AF}", - nfkc: "\u{AF34}", - nfkd: "\u{1101}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{AF35}", - nfc: "\u{AF35}", - nfd: "\u{1101}\u{1169}\u{11B0}", - nfkc: "\u{AF35}", - nfkd: "\u{1101}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{AF36}", - nfc: "\u{AF36}", - nfd: "\u{1101}\u{1169}\u{11B1}", - nfkc: "\u{AF36}", - nfkd: "\u{1101}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{AF37}", - nfc: "\u{AF37}", - nfd: "\u{1101}\u{1169}\u{11B2}", - nfkc: "\u{AF37}", - nfkd: "\u{1101}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{AF38}", - nfc: "\u{AF38}", - nfd: "\u{1101}\u{1169}\u{11B3}", - nfkc: "\u{AF38}", - nfkd: "\u{1101}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{AF39}", - nfc: "\u{AF39}", - nfd: "\u{1101}\u{1169}\u{11B4}", - nfkc: "\u{AF39}", - nfkd: "\u{1101}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{AF3A}", - nfc: "\u{AF3A}", - nfd: "\u{1101}\u{1169}\u{11B5}", - nfkc: "\u{AF3A}", - nfkd: "\u{1101}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{AF3B}", - nfc: "\u{AF3B}", - nfd: "\u{1101}\u{1169}\u{11B6}", - nfkc: "\u{AF3B}", - nfkd: "\u{1101}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{AF3C}", - nfc: "\u{AF3C}", - nfd: "\u{1101}\u{1169}\u{11B7}", - nfkc: "\u{AF3C}", - nfkd: "\u{1101}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{AF3D}", - nfc: "\u{AF3D}", - nfd: "\u{1101}\u{1169}\u{11B8}", - nfkc: "\u{AF3D}", - nfkd: "\u{1101}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{AF3E}", - nfc: "\u{AF3E}", - nfd: "\u{1101}\u{1169}\u{11B9}", - nfkc: "\u{AF3E}", - nfkd: "\u{1101}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{AF3F}", - nfc: "\u{AF3F}", - nfd: "\u{1101}\u{1169}\u{11BA}", - nfkc: "\u{AF3F}", - nfkd: "\u{1101}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{AF40}", - nfc: "\u{AF40}", - nfd: "\u{1101}\u{1169}\u{11BB}", - nfkc: "\u{AF40}", - nfkd: "\u{1101}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{AF41}", - nfc: "\u{AF41}", - nfd: "\u{1101}\u{1169}\u{11BC}", - nfkc: "\u{AF41}", - nfkd: "\u{1101}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{AF42}", - nfc: "\u{AF42}", - nfd: "\u{1101}\u{1169}\u{11BD}", - nfkc: "\u{AF42}", - nfkd: "\u{1101}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{AF43}", - nfc: "\u{AF43}", - nfd: "\u{1101}\u{1169}\u{11BE}", - nfkc: "\u{AF43}", - nfkd: "\u{1101}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{AF44}", - nfc: "\u{AF44}", - nfd: "\u{1101}\u{1169}\u{11BF}", - nfkc: "\u{AF44}", - nfkd: "\u{1101}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{AF45}", - nfc: "\u{AF45}", - nfd: "\u{1101}\u{1169}\u{11C0}", - nfkc: "\u{AF45}", - nfkd: "\u{1101}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{AF46}", - nfc: "\u{AF46}", - nfd: "\u{1101}\u{1169}\u{11C1}", - nfkc: "\u{AF46}", - nfkd: "\u{1101}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{AF47}", - nfc: "\u{AF47}", - nfd: "\u{1101}\u{1169}\u{11C2}", - nfkc: "\u{AF47}", - nfkd: "\u{1101}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{AF48}", - nfc: "\u{AF48}", - nfd: "\u{1101}\u{116A}", - nfkc: "\u{AF48}", - nfkd: "\u{1101}\u{116A}", - }, - NormalizationTest { - source: "\u{AF49}", - nfc: "\u{AF49}", - nfd: "\u{1101}\u{116A}\u{11A8}", - nfkc: "\u{AF49}", - nfkd: "\u{1101}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{AF4A}", - nfc: "\u{AF4A}", - nfd: "\u{1101}\u{116A}\u{11A9}", - nfkc: "\u{AF4A}", - nfkd: "\u{1101}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{AF4B}", - nfc: "\u{AF4B}", - nfd: "\u{1101}\u{116A}\u{11AA}", - nfkc: "\u{AF4B}", - nfkd: "\u{1101}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{AF4C}", - nfc: "\u{AF4C}", - nfd: "\u{1101}\u{116A}\u{11AB}", - nfkc: "\u{AF4C}", - nfkd: "\u{1101}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{AF4D}", - nfc: "\u{AF4D}", - nfd: "\u{1101}\u{116A}\u{11AC}", - nfkc: "\u{AF4D}", - nfkd: "\u{1101}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{AF4E}", - nfc: "\u{AF4E}", - nfd: "\u{1101}\u{116A}\u{11AD}", - nfkc: "\u{AF4E}", - nfkd: "\u{1101}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{AF4F}", - nfc: "\u{AF4F}", - nfd: "\u{1101}\u{116A}\u{11AE}", - nfkc: "\u{AF4F}", - nfkd: "\u{1101}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{AF50}", - nfc: "\u{AF50}", - nfd: "\u{1101}\u{116A}\u{11AF}", - nfkc: "\u{AF50}", - nfkd: "\u{1101}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{AF51}", - nfc: "\u{AF51}", - nfd: "\u{1101}\u{116A}\u{11B0}", - nfkc: "\u{AF51}", - nfkd: "\u{1101}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{AF52}", - nfc: "\u{AF52}", - nfd: "\u{1101}\u{116A}\u{11B1}", - nfkc: "\u{AF52}", - nfkd: "\u{1101}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{AF53}", - nfc: "\u{AF53}", - nfd: "\u{1101}\u{116A}\u{11B2}", - nfkc: "\u{AF53}", - nfkd: "\u{1101}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{AF54}", - nfc: "\u{AF54}", - nfd: "\u{1101}\u{116A}\u{11B3}", - nfkc: "\u{AF54}", - nfkd: "\u{1101}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{AF55}", - nfc: "\u{AF55}", - nfd: "\u{1101}\u{116A}\u{11B4}", - nfkc: "\u{AF55}", - nfkd: "\u{1101}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{AF56}", - nfc: "\u{AF56}", - nfd: "\u{1101}\u{116A}\u{11B5}", - nfkc: "\u{AF56}", - nfkd: "\u{1101}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{AF57}", - nfc: "\u{AF57}", - nfd: "\u{1101}\u{116A}\u{11B6}", - nfkc: "\u{AF57}", - nfkd: "\u{1101}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{AF58}", - nfc: "\u{AF58}", - nfd: "\u{1101}\u{116A}\u{11B7}", - nfkc: "\u{AF58}", - nfkd: "\u{1101}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{AF59}", - nfc: "\u{AF59}", - nfd: "\u{1101}\u{116A}\u{11B8}", - nfkc: "\u{AF59}", - nfkd: "\u{1101}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{AF5A}", - nfc: "\u{AF5A}", - nfd: "\u{1101}\u{116A}\u{11B9}", - nfkc: "\u{AF5A}", - nfkd: "\u{1101}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{AF5B}", - nfc: "\u{AF5B}", - nfd: "\u{1101}\u{116A}\u{11BA}", - nfkc: "\u{AF5B}", - nfkd: "\u{1101}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{AF5C}", - nfc: "\u{AF5C}", - nfd: "\u{1101}\u{116A}\u{11BB}", - nfkc: "\u{AF5C}", - nfkd: "\u{1101}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{AF5D}", - nfc: "\u{AF5D}", - nfd: "\u{1101}\u{116A}\u{11BC}", - nfkc: "\u{AF5D}", - nfkd: "\u{1101}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{AF5E}", - nfc: "\u{AF5E}", - nfd: "\u{1101}\u{116A}\u{11BD}", - nfkc: "\u{AF5E}", - nfkd: "\u{1101}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{AF5F}", - nfc: "\u{AF5F}", - nfd: "\u{1101}\u{116A}\u{11BE}", - nfkc: "\u{AF5F}", - nfkd: "\u{1101}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{AF60}", - nfc: "\u{AF60}", - nfd: "\u{1101}\u{116A}\u{11BF}", - nfkc: "\u{AF60}", - nfkd: "\u{1101}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{AF61}", - nfc: "\u{AF61}", - nfd: "\u{1101}\u{116A}\u{11C0}", - nfkc: "\u{AF61}", - nfkd: "\u{1101}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{AF62}", - nfc: "\u{AF62}", - nfd: "\u{1101}\u{116A}\u{11C1}", - nfkc: "\u{AF62}", - nfkd: "\u{1101}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{AF63}", - nfc: "\u{AF63}", - nfd: "\u{1101}\u{116A}\u{11C2}", - nfkc: "\u{AF63}", - nfkd: "\u{1101}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{AF64}", - nfc: "\u{AF64}", - nfd: "\u{1101}\u{116B}", - nfkc: "\u{AF64}", - nfkd: "\u{1101}\u{116B}", - }, - NormalizationTest { - source: "\u{AF65}", - nfc: "\u{AF65}", - nfd: "\u{1101}\u{116B}\u{11A8}", - nfkc: "\u{AF65}", - nfkd: "\u{1101}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{AF66}", - nfc: "\u{AF66}", - nfd: "\u{1101}\u{116B}\u{11A9}", - nfkc: "\u{AF66}", - nfkd: "\u{1101}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{AF67}", - nfc: "\u{AF67}", - nfd: "\u{1101}\u{116B}\u{11AA}", - nfkc: "\u{AF67}", - nfkd: "\u{1101}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{AF68}", - nfc: "\u{AF68}", - nfd: "\u{1101}\u{116B}\u{11AB}", - nfkc: "\u{AF68}", - nfkd: "\u{1101}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{AF69}", - nfc: "\u{AF69}", - nfd: "\u{1101}\u{116B}\u{11AC}", - nfkc: "\u{AF69}", - nfkd: "\u{1101}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{AF6A}", - nfc: "\u{AF6A}", - nfd: "\u{1101}\u{116B}\u{11AD}", - nfkc: "\u{AF6A}", - nfkd: "\u{1101}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{AF6B}", - nfc: "\u{AF6B}", - nfd: "\u{1101}\u{116B}\u{11AE}", - nfkc: "\u{AF6B}", - nfkd: "\u{1101}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{AF6C}", - nfc: "\u{AF6C}", - nfd: "\u{1101}\u{116B}\u{11AF}", - nfkc: "\u{AF6C}", - nfkd: "\u{1101}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{AF6D}", - nfc: "\u{AF6D}", - nfd: "\u{1101}\u{116B}\u{11B0}", - nfkc: "\u{AF6D}", - nfkd: "\u{1101}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{AF6E}", - nfc: "\u{AF6E}", - nfd: "\u{1101}\u{116B}\u{11B1}", - nfkc: "\u{AF6E}", - nfkd: "\u{1101}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{AF6F}", - nfc: "\u{AF6F}", - nfd: "\u{1101}\u{116B}\u{11B2}", - nfkc: "\u{AF6F}", - nfkd: "\u{1101}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{AF70}", - nfc: "\u{AF70}", - nfd: "\u{1101}\u{116B}\u{11B3}", - nfkc: "\u{AF70}", - nfkd: "\u{1101}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{AF71}", - nfc: "\u{AF71}", - nfd: "\u{1101}\u{116B}\u{11B4}", - nfkc: "\u{AF71}", - nfkd: "\u{1101}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{AF72}", - nfc: "\u{AF72}", - nfd: "\u{1101}\u{116B}\u{11B5}", - nfkc: "\u{AF72}", - nfkd: "\u{1101}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{AF73}", - nfc: "\u{AF73}", - nfd: "\u{1101}\u{116B}\u{11B6}", - nfkc: "\u{AF73}", - nfkd: "\u{1101}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{AF74}", - nfc: "\u{AF74}", - nfd: "\u{1101}\u{116B}\u{11B7}", - nfkc: "\u{AF74}", - nfkd: "\u{1101}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{AF75}", - nfc: "\u{AF75}", - nfd: "\u{1101}\u{116B}\u{11B8}", - nfkc: "\u{AF75}", - nfkd: "\u{1101}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{AF76}", - nfc: "\u{AF76}", - nfd: "\u{1101}\u{116B}\u{11B9}", - nfkc: "\u{AF76}", - nfkd: "\u{1101}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{AF77}", - nfc: "\u{AF77}", - nfd: "\u{1101}\u{116B}\u{11BA}", - nfkc: "\u{AF77}", - nfkd: "\u{1101}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{AF78}", - nfc: "\u{AF78}", - nfd: "\u{1101}\u{116B}\u{11BB}", - nfkc: "\u{AF78}", - nfkd: "\u{1101}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{AF79}", - nfc: "\u{AF79}", - nfd: "\u{1101}\u{116B}\u{11BC}", - nfkc: "\u{AF79}", - nfkd: "\u{1101}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{AF7A}", - nfc: "\u{AF7A}", - nfd: "\u{1101}\u{116B}\u{11BD}", - nfkc: "\u{AF7A}", - nfkd: "\u{1101}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{AF7B}", - nfc: "\u{AF7B}", - nfd: "\u{1101}\u{116B}\u{11BE}", - nfkc: "\u{AF7B}", - nfkd: "\u{1101}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{AF7C}", - nfc: "\u{AF7C}", - nfd: "\u{1101}\u{116B}\u{11BF}", - nfkc: "\u{AF7C}", - nfkd: "\u{1101}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{AF7D}", - nfc: "\u{AF7D}", - nfd: "\u{1101}\u{116B}\u{11C0}", - nfkc: "\u{AF7D}", - nfkd: "\u{1101}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{AF7E}", - nfc: "\u{AF7E}", - nfd: "\u{1101}\u{116B}\u{11C1}", - nfkc: "\u{AF7E}", - nfkd: "\u{1101}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{AF7F}", - nfc: "\u{AF7F}", - nfd: "\u{1101}\u{116B}\u{11C2}", - nfkc: "\u{AF7F}", - nfkd: "\u{1101}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{AF80}", - nfc: "\u{AF80}", - nfd: "\u{1101}\u{116C}", - nfkc: "\u{AF80}", - nfkd: "\u{1101}\u{116C}", - }, - NormalizationTest { - source: "\u{AF81}", - nfc: "\u{AF81}", - nfd: "\u{1101}\u{116C}\u{11A8}", - nfkc: "\u{AF81}", - nfkd: "\u{1101}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{AF82}", - nfc: "\u{AF82}", - nfd: "\u{1101}\u{116C}\u{11A9}", - nfkc: "\u{AF82}", - nfkd: "\u{1101}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{AF83}", - nfc: "\u{AF83}", - nfd: "\u{1101}\u{116C}\u{11AA}", - nfkc: "\u{AF83}", - nfkd: "\u{1101}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{AF84}", - nfc: "\u{AF84}", - nfd: "\u{1101}\u{116C}\u{11AB}", - nfkc: "\u{AF84}", - nfkd: "\u{1101}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{AF85}", - nfc: "\u{AF85}", - nfd: "\u{1101}\u{116C}\u{11AC}", - nfkc: "\u{AF85}", - nfkd: "\u{1101}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{AF86}", - nfc: "\u{AF86}", - nfd: "\u{1101}\u{116C}\u{11AD}", - nfkc: "\u{AF86}", - nfkd: "\u{1101}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{AF87}", - nfc: "\u{AF87}", - nfd: "\u{1101}\u{116C}\u{11AE}", - nfkc: "\u{AF87}", - nfkd: "\u{1101}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{AF88}", - nfc: "\u{AF88}", - nfd: "\u{1101}\u{116C}\u{11AF}", - nfkc: "\u{AF88}", - nfkd: "\u{1101}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{AF89}", - nfc: "\u{AF89}", - nfd: "\u{1101}\u{116C}\u{11B0}", - nfkc: "\u{AF89}", - nfkd: "\u{1101}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{AF8A}", - nfc: "\u{AF8A}", - nfd: "\u{1101}\u{116C}\u{11B1}", - nfkc: "\u{AF8A}", - nfkd: "\u{1101}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{AF8B}", - nfc: "\u{AF8B}", - nfd: "\u{1101}\u{116C}\u{11B2}", - nfkc: "\u{AF8B}", - nfkd: "\u{1101}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{AF8C}", - nfc: "\u{AF8C}", - nfd: "\u{1101}\u{116C}\u{11B3}", - nfkc: "\u{AF8C}", - nfkd: "\u{1101}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{AF8D}", - nfc: "\u{AF8D}", - nfd: "\u{1101}\u{116C}\u{11B4}", - nfkc: "\u{AF8D}", - nfkd: "\u{1101}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{AF8E}", - nfc: "\u{AF8E}", - nfd: "\u{1101}\u{116C}\u{11B5}", - nfkc: "\u{AF8E}", - nfkd: "\u{1101}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{AF8F}", - nfc: "\u{AF8F}", - nfd: "\u{1101}\u{116C}\u{11B6}", - nfkc: "\u{AF8F}", - nfkd: "\u{1101}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{AF90}", - nfc: "\u{AF90}", - nfd: "\u{1101}\u{116C}\u{11B7}", - nfkc: "\u{AF90}", - nfkd: "\u{1101}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{AF91}", - nfc: "\u{AF91}", - nfd: "\u{1101}\u{116C}\u{11B8}", - nfkc: "\u{AF91}", - nfkd: "\u{1101}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{AF92}", - nfc: "\u{AF92}", - nfd: "\u{1101}\u{116C}\u{11B9}", - nfkc: "\u{AF92}", - nfkd: "\u{1101}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{AF93}", - nfc: "\u{AF93}", - nfd: "\u{1101}\u{116C}\u{11BA}", - nfkc: "\u{AF93}", - nfkd: "\u{1101}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{AF94}", - nfc: "\u{AF94}", - nfd: "\u{1101}\u{116C}\u{11BB}", - nfkc: "\u{AF94}", - nfkd: "\u{1101}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{AF95}", - nfc: "\u{AF95}", - nfd: "\u{1101}\u{116C}\u{11BC}", - nfkc: "\u{AF95}", - nfkd: "\u{1101}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{AF96}", - nfc: "\u{AF96}", - nfd: "\u{1101}\u{116C}\u{11BD}", - nfkc: "\u{AF96}", - nfkd: "\u{1101}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{AF97}", - nfc: "\u{AF97}", - nfd: "\u{1101}\u{116C}\u{11BE}", - nfkc: "\u{AF97}", - nfkd: "\u{1101}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{AF98}", - nfc: "\u{AF98}", - nfd: "\u{1101}\u{116C}\u{11BF}", - nfkc: "\u{AF98}", - nfkd: "\u{1101}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{AF99}", - nfc: "\u{AF99}", - nfd: "\u{1101}\u{116C}\u{11C0}", - nfkc: "\u{AF99}", - nfkd: "\u{1101}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{AF9A}", - nfc: "\u{AF9A}", - nfd: "\u{1101}\u{116C}\u{11C1}", - nfkc: "\u{AF9A}", - nfkd: "\u{1101}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{AF9B}", - nfc: "\u{AF9B}", - nfd: "\u{1101}\u{116C}\u{11C2}", - nfkc: "\u{AF9B}", - nfkd: "\u{1101}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{AF9C}", - nfc: "\u{AF9C}", - nfd: "\u{1101}\u{116D}", - nfkc: "\u{AF9C}", - nfkd: "\u{1101}\u{116D}", - }, - NormalizationTest { - source: "\u{AF9D}", - nfc: "\u{AF9D}", - nfd: "\u{1101}\u{116D}\u{11A8}", - nfkc: "\u{AF9D}", - nfkd: "\u{1101}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{AF9E}", - nfc: "\u{AF9E}", - nfd: "\u{1101}\u{116D}\u{11A9}", - nfkc: "\u{AF9E}", - nfkd: "\u{1101}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{AF9F}", - nfc: "\u{AF9F}", - nfd: "\u{1101}\u{116D}\u{11AA}", - nfkc: "\u{AF9F}", - nfkd: "\u{1101}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{AFA0}", - nfc: "\u{AFA0}", - nfd: "\u{1101}\u{116D}\u{11AB}", - nfkc: "\u{AFA0}", - nfkd: "\u{1101}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{AFA1}", - nfc: "\u{AFA1}", - nfd: "\u{1101}\u{116D}\u{11AC}", - nfkc: "\u{AFA1}", - nfkd: "\u{1101}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{AFA2}", - nfc: "\u{AFA2}", - nfd: "\u{1101}\u{116D}\u{11AD}", - nfkc: "\u{AFA2}", - nfkd: "\u{1101}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{AFA3}", - nfc: "\u{AFA3}", - nfd: "\u{1101}\u{116D}\u{11AE}", - nfkc: "\u{AFA3}", - nfkd: "\u{1101}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{AFA4}", - nfc: "\u{AFA4}", - nfd: "\u{1101}\u{116D}\u{11AF}", - nfkc: "\u{AFA4}", - nfkd: "\u{1101}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{AFA5}", - nfc: "\u{AFA5}", - nfd: "\u{1101}\u{116D}\u{11B0}", - nfkc: "\u{AFA5}", - nfkd: "\u{1101}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{AFA6}", - nfc: "\u{AFA6}", - nfd: "\u{1101}\u{116D}\u{11B1}", - nfkc: "\u{AFA6}", - nfkd: "\u{1101}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{AFA7}", - nfc: "\u{AFA7}", - nfd: "\u{1101}\u{116D}\u{11B2}", - nfkc: "\u{AFA7}", - nfkd: "\u{1101}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{AFA8}", - nfc: "\u{AFA8}", - nfd: "\u{1101}\u{116D}\u{11B3}", - nfkc: "\u{AFA8}", - nfkd: "\u{1101}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{AFA9}", - nfc: "\u{AFA9}", - nfd: "\u{1101}\u{116D}\u{11B4}", - nfkc: "\u{AFA9}", - nfkd: "\u{1101}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{AFAA}", - nfc: "\u{AFAA}", - nfd: "\u{1101}\u{116D}\u{11B5}", - nfkc: "\u{AFAA}", - nfkd: "\u{1101}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{AFAB}", - nfc: "\u{AFAB}", - nfd: "\u{1101}\u{116D}\u{11B6}", - nfkc: "\u{AFAB}", - nfkd: "\u{1101}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{AFAC}", - nfc: "\u{AFAC}", - nfd: "\u{1101}\u{116D}\u{11B7}", - nfkc: "\u{AFAC}", - nfkd: "\u{1101}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{AFAD}", - nfc: "\u{AFAD}", - nfd: "\u{1101}\u{116D}\u{11B8}", - nfkc: "\u{AFAD}", - nfkd: "\u{1101}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{AFAE}", - nfc: "\u{AFAE}", - nfd: "\u{1101}\u{116D}\u{11B9}", - nfkc: "\u{AFAE}", - nfkd: "\u{1101}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{AFAF}", - nfc: "\u{AFAF}", - nfd: "\u{1101}\u{116D}\u{11BA}", - nfkc: "\u{AFAF}", - nfkd: "\u{1101}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{AFB0}", - nfc: "\u{AFB0}", - nfd: "\u{1101}\u{116D}\u{11BB}", - nfkc: "\u{AFB0}", - nfkd: "\u{1101}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{AFB1}", - nfc: "\u{AFB1}", - nfd: "\u{1101}\u{116D}\u{11BC}", - nfkc: "\u{AFB1}", - nfkd: "\u{1101}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{AFB2}", - nfc: "\u{AFB2}", - nfd: "\u{1101}\u{116D}\u{11BD}", - nfkc: "\u{AFB2}", - nfkd: "\u{1101}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{AFB3}", - nfc: "\u{AFB3}", - nfd: "\u{1101}\u{116D}\u{11BE}", - nfkc: "\u{AFB3}", - nfkd: "\u{1101}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{AFB4}", - nfc: "\u{AFB4}", - nfd: "\u{1101}\u{116D}\u{11BF}", - nfkc: "\u{AFB4}", - nfkd: "\u{1101}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{AFB5}", - nfc: "\u{AFB5}", - nfd: "\u{1101}\u{116D}\u{11C0}", - nfkc: "\u{AFB5}", - nfkd: "\u{1101}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{AFB6}", - nfc: "\u{AFB6}", - nfd: "\u{1101}\u{116D}\u{11C1}", - nfkc: "\u{AFB6}", - nfkd: "\u{1101}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{AFB7}", - nfc: "\u{AFB7}", - nfd: "\u{1101}\u{116D}\u{11C2}", - nfkc: "\u{AFB7}", - nfkd: "\u{1101}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{AFB8}", - nfc: "\u{AFB8}", - nfd: "\u{1101}\u{116E}", - nfkc: "\u{AFB8}", - nfkd: "\u{1101}\u{116E}", - }, - NormalizationTest { - source: "\u{AFB9}", - nfc: "\u{AFB9}", - nfd: "\u{1101}\u{116E}\u{11A8}", - nfkc: "\u{AFB9}", - nfkd: "\u{1101}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{AFBA}", - nfc: "\u{AFBA}", - nfd: "\u{1101}\u{116E}\u{11A9}", - nfkc: "\u{AFBA}", - nfkd: "\u{1101}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{AFBB}", - nfc: "\u{AFBB}", - nfd: "\u{1101}\u{116E}\u{11AA}", - nfkc: "\u{AFBB}", - nfkd: "\u{1101}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{AFBC}", - nfc: "\u{AFBC}", - nfd: "\u{1101}\u{116E}\u{11AB}", - nfkc: "\u{AFBC}", - nfkd: "\u{1101}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{AFBD}", - nfc: "\u{AFBD}", - nfd: "\u{1101}\u{116E}\u{11AC}", - nfkc: "\u{AFBD}", - nfkd: "\u{1101}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{AFBE}", - nfc: "\u{AFBE}", - nfd: "\u{1101}\u{116E}\u{11AD}", - nfkc: "\u{AFBE}", - nfkd: "\u{1101}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{AFBF}", - nfc: "\u{AFBF}", - nfd: "\u{1101}\u{116E}\u{11AE}", - nfkc: "\u{AFBF}", - nfkd: "\u{1101}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{AFC0}", - nfc: "\u{AFC0}", - nfd: "\u{1101}\u{116E}\u{11AF}", - nfkc: "\u{AFC0}", - nfkd: "\u{1101}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{AFC1}", - nfc: "\u{AFC1}", - nfd: "\u{1101}\u{116E}\u{11B0}", - nfkc: "\u{AFC1}", - nfkd: "\u{1101}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{AFC2}", - nfc: "\u{AFC2}", - nfd: "\u{1101}\u{116E}\u{11B1}", - nfkc: "\u{AFC2}", - nfkd: "\u{1101}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{AFC3}", - nfc: "\u{AFC3}", - nfd: "\u{1101}\u{116E}\u{11B2}", - nfkc: "\u{AFC3}", - nfkd: "\u{1101}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{AFC4}", - nfc: "\u{AFC4}", - nfd: "\u{1101}\u{116E}\u{11B3}", - nfkc: "\u{AFC4}", - nfkd: "\u{1101}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{AFC5}", - nfc: "\u{AFC5}", - nfd: "\u{1101}\u{116E}\u{11B4}", - nfkc: "\u{AFC5}", - nfkd: "\u{1101}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{AFC6}", - nfc: "\u{AFC6}", - nfd: "\u{1101}\u{116E}\u{11B5}", - nfkc: "\u{AFC6}", - nfkd: "\u{1101}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{AFC7}", - nfc: "\u{AFC7}", - nfd: "\u{1101}\u{116E}\u{11B6}", - nfkc: "\u{AFC7}", - nfkd: "\u{1101}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{AFC8}", - nfc: "\u{AFC8}", - nfd: "\u{1101}\u{116E}\u{11B7}", - nfkc: "\u{AFC8}", - nfkd: "\u{1101}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{AFC9}", - nfc: "\u{AFC9}", - nfd: "\u{1101}\u{116E}\u{11B8}", - nfkc: "\u{AFC9}", - nfkd: "\u{1101}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{AFCA}", - nfc: "\u{AFCA}", - nfd: "\u{1101}\u{116E}\u{11B9}", - nfkc: "\u{AFCA}", - nfkd: "\u{1101}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{AFCB}", - nfc: "\u{AFCB}", - nfd: "\u{1101}\u{116E}\u{11BA}", - nfkc: "\u{AFCB}", - nfkd: "\u{1101}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{AFCC}", - nfc: "\u{AFCC}", - nfd: "\u{1101}\u{116E}\u{11BB}", - nfkc: "\u{AFCC}", - nfkd: "\u{1101}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{AFCD}", - nfc: "\u{AFCD}", - nfd: "\u{1101}\u{116E}\u{11BC}", - nfkc: "\u{AFCD}", - nfkd: "\u{1101}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{AFCE}", - nfc: "\u{AFCE}", - nfd: "\u{1101}\u{116E}\u{11BD}", - nfkc: "\u{AFCE}", - nfkd: "\u{1101}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{AFCF}", - nfc: "\u{AFCF}", - nfd: "\u{1101}\u{116E}\u{11BE}", - nfkc: "\u{AFCF}", - nfkd: "\u{1101}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{AFD0}", - nfc: "\u{AFD0}", - nfd: "\u{1101}\u{116E}\u{11BF}", - nfkc: "\u{AFD0}", - nfkd: "\u{1101}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{AFD1}", - nfc: "\u{AFD1}", - nfd: "\u{1101}\u{116E}\u{11C0}", - nfkc: "\u{AFD1}", - nfkd: "\u{1101}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{AFD2}", - nfc: "\u{AFD2}", - nfd: "\u{1101}\u{116E}\u{11C1}", - nfkc: "\u{AFD2}", - nfkd: "\u{1101}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{AFD3}", - nfc: "\u{AFD3}", - nfd: "\u{1101}\u{116E}\u{11C2}", - nfkc: "\u{AFD3}", - nfkd: "\u{1101}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{AFD4}", - nfc: "\u{AFD4}", - nfd: "\u{1101}\u{116F}", - nfkc: "\u{AFD4}", - nfkd: "\u{1101}\u{116F}", - }, - NormalizationTest { - source: "\u{AFD5}", - nfc: "\u{AFD5}", - nfd: "\u{1101}\u{116F}\u{11A8}", - nfkc: "\u{AFD5}", - nfkd: "\u{1101}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{AFD6}", - nfc: "\u{AFD6}", - nfd: "\u{1101}\u{116F}\u{11A9}", - nfkc: "\u{AFD6}", - nfkd: "\u{1101}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{AFD7}", - nfc: "\u{AFD7}", - nfd: "\u{1101}\u{116F}\u{11AA}", - nfkc: "\u{AFD7}", - nfkd: "\u{1101}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{AFD8}", - nfc: "\u{AFD8}", - nfd: "\u{1101}\u{116F}\u{11AB}", - nfkc: "\u{AFD8}", - nfkd: "\u{1101}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{AFD9}", - nfc: "\u{AFD9}", - nfd: "\u{1101}\u{116F}\u{11AC}", - nfkc: "\u{AFD9}", - nfkd: "\u{1101}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{AFDA}", - nfc: "\u{AFDA}", - nfd: "\u{1101}\u{116F}\u{11AD}", - nfkc: "\u{AFDA}", - nfkd: "\u{1101}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{AFDB}", - nfc: "\u{AFDB}", - nfd: "\u{1101}\u{116F}\u{11AE}", - nfkc: "\u{AFDB}", - nfkd: "\u{1101}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{AFDC}", - nfc: "\u{AFDC}", - nfd: "\u{1101}\u{116F}\u{11AF}", - nfkc: "\u{AFDC}", - nfkd: "\u{1101}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{AFDD}", - nfc: "\u{AFDD}", - nfd: "\u{1101}\u{116F}\u{11B0}", - nfkc: "\u{AFDD}", - nfkd: "\u{1101}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{AFDE}", - nfc: "\u{AFDE}", - nfd: "\u{1101}\u{116F}\u{11B1}", - nfkc: "\u{AFDE}", - nfkd: "\u{1101}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{AFDF}", - nfc: "\u{AFDF}", - nfd: "\u{1101}\u{116F}\u{11B2}", - nfkc: "\u{AFDF}", - nfkd: "\u{1101}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{AFE0}", - nfc: "\u{AFE0}", - nfd: "\u{1101}\u{116F}\u{11B3}", - nfkc: "\u{AFE0}", - nfkd: "\u{1101}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{AFE1}", - nfc: "\u{AFE1}", - nfd: "\u{1101}\u{116F}\u{11B4}", - nfkc: "\u{AFE1}", - nfkd: "\u{1101}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{AFE2}", - nfc: "\u{AFE2}", - nfd: "\u{1101}\u{116F}\u{11B5}", - nfkc: "\u{AFE2}", - nfkd: "\u{1101}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{AFE3}", - nfc: "\u{AFE3}", - nfd: "\u{1101}\u{116F}\u{11B6}", - nfkc: "\u{AFE3}", - nfkd: "\u{1101}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{AFE4}", - nfc: "\u{AFE4}", - nfd: "\u{1101}\u{116F}\u{11B7}", - nfkc: "\u{AFE4}", - nfkd: "\u{1101}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{AFE5}", - nfc: "\u{AFE5}", - nfd: "\u{1101}\u{116F}\u{11B8}", - nfkc: "\u{AFE5}", - nfkd: "\u{1101}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{AFE6}", - nfc: "\u{AFE6}", - nfd: "\u{1101}\u{116F}\u{11B9}", - nfkc: "\u{AFE6}", - nfkd: "\u{1101}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{AFE7}", - nfc: "\u{AFE7}", - nfd: "\u{1101}\u{116F}\u{11BA}", - nfkc: "\u{AFE7}", - nfkd: "\u{1101}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{AFE8}", - nfc: "\u{AFE8}", - nfd: "\u{1101}\u{116F}\u{11BB}", - nfkc: "\u{AFE8}", - nfkd: "\u{1101}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{AFE9}", - nfc: "\u{AFE9}", - nfd: "\u{1101}\u{116F}\u{11BC}", - nfkc: "\u{AFE9}", - nfkd: "\u{1101}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{AFEA}", - nfc: "\u{AFEA}", - nfd: "\u{1101}\u{116F}\u{11BD}", - nfkc: "\u{AFEA}", - nfkd: "\u{1101}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{AFEB}", - nfc: "\u{AFEB}", - nfd: "\u{1101}\u{116F}\u{11BE}", - nfkc: "\u{AFEB}", - nfkd: "\u{1101}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{AFEC}", - nfc: "\u{AFEC}", - nfd: "\u{1101}\u{116F}\u{11BF}", - nfkc: "\u{AFEC}", - nfkd: "\u{1101}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{AFED}", - nfc: "\u{AFED}", - nfd: "\u{1101}\u{116F}\u{11C0}", - nfkc: "\u{AFED}", - nfkd: "\u{1101}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{AFEE}", - nfc: "\u{AFEE}", - nfd: "\u{1101}\u{116F}\u{11C1}", - nfkc: "\u{AFEE}", - nfkd: "\u{1101}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{AFEF}", - nfc: "\u{AFEF}", - nfd: "\u{1101}\u{116F}\u{11C2}", - nfkc: "\u{AFEF}", - nfkd: "\u{1101}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{AFF0}", - nfc: "\u{AFF0}", - nfd: "\u{1101}\u{1170}", - nfkc: "\u{AFF0}", - nfkd: "\u{1101}\u{1170}", - }, - NormalizationTest { - source: "\u{AFF1}", - nfc: "\u{AFF1}", - nfd: "\u{1101}\u{1170}\u{11A8}", - nfkc: "\u{AFF1}", - nfkd: "\u{1101}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{AFF2}", - nfc: "\u{AFF2}", - nfd: "\u{1101}\u{1170}\u{11A9}", - nfkc: "\u{AFF2}", - nfkd: "\u{1101}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{AFF3}", - nfc: "\u{AFF3}", - nfd: "\u{1101}\u{1170}\u{11AA}", - nfkc: "\u{AFF3}", - nfkd: "\u{1101}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{AFF4}", - nfc: "\u{AFF4}", - nfd: "\u{1101}\u{1170}\u{11AB}", - nfkc: "\u{AFF4}", - nfkd: "\u{1101}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{AFF5}", - nfc: "\u{AFF5}", - nfd: "\u{1101}\u{1170}\u{11AC}", - nfkc: "\u{AFF5}", - nfkd: "\u{1101}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{AFF6}", - nfc: "\u{AFF6}", - nfd: "\u{1101}\u{1170}\u{11AD}", - nfkc: "\u{AFF6}", - nfkd: "\u{1101}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{AFF7}", - nfc: "\u{AFF7}", - nfd: "\u{1101}\u{1170}\u{11AE}", - nfkc: "\u{AFF7}", - nfkd: "\u{1101}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{AFF8}", - nfc: "\u{AFF8}", - nfd: "\u{1101}\u{1170}\u{11AF}", - nfkc: "\u{AFF8}", - nfkd: "\u{1101}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{AFF9}", - nfc: "\u{AFF9}", - nfd: "\u{1101}\u{1170}\u{11B0}", - nfkc: "\u{AFF9}", - nfkd: "\u{1101}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{AFFA}", - nfc: "\u{AFFA}", - nfd: "\u{1101}\u{1170}\u{11B1}", - nfkc: "\u{AFFA}", - nfkd: "\u{1101}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{AFFB}", - nfc: "\u{AFFB}", - nfd: "\u{1101}\u{1170}\u{11B2}", - nfkc: "\u{AFFB}", - nfkd: "\u{1101}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{AFFC}", - nfc: "\u{AFFC}", - nfd: "\u{1101}\u{1170}\u{11B3}", - nfkc: "\u{AFFC}", - nfkd: "\u{1101}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{AFFD}", - nfc: "\u{AFFD}", - nfd: "\u{1101}\u{1170}\u{11B4}", - nfkc: "\u{AFFD}", - nfkd: "\u{1101}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{AFFE}", - nfc: "\u{AFFE}", - nfd: "\u{1101}\u{1170}\u{11B5}", - nfkc: "\u{AFFE}", - nfkd: "\u{1101}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{AFFF}", - nfc: "\u{AFFF}", - nfd: "\u{1101}\u{1170}\u{11B6}", - nfkc: "\u{AFFF}", - nfkd: "\u{1101}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{B000}", - nfc: "\u{B000}", - nfd: "\u{1101}\u{1170}\u{11B7}", - nfkc: "\u{B000}", - nfkd: "\u{1101}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{B001}", - nfc: "\u{B001}", - nfd: "\u{1101}\u{1170}\u{11B8}", - nfkc: "\u{B001}", - nfkd: "\u{1101}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{B002}", - nfc: "\u{B002}", - nfd: "\u{1101}\u{1170}\u{11B9}", - nfkc: "\u{B002}", - nfkd: "\u{1101}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{B003}", - nfc: "\u{B003}", - nfd: "\u{1101}\u{1170}\u{11BA}", - nfkc: "\u{B003}", - nfkd: "\u{1101}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{B004}", - nfc: "\u{B004}", - nfd: "\u{1101}\u{1170}\u{11BB}", - nfkc: "\u{B004}", - nfkd: "\u{1101}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{B005}", - nfc: "\u{B005}", - nfd: "\u{1101}\u{1170}\u{11BC}", - nfkc: "\u{B005}", - nfkd: "\u{1101}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{B006}", - nfc: "\u{B006}", - nfd: "\u{1101}\u{1170}\u{11BD}", - nfkc: "\u{B006}", - nfkd: "\u{1101}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{B007}", - nfc: "\u{B007}", - nfd: "\u{1101}\u{1170}\u{11BE}", - nfkc: "\u{B007}", - nfkd: "\u{1101}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{B008}", - nfc: "\u{B008}", - nfd: "\u{1101}\u{1170}\u{11BF}", - nfkc: "\u{B008}", - nfkd: "\u{1101}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{B009}", - nfc: "\u{B009}", - nfd: "\u{1101}\u{1170}\u{11C0}", - nfkc: "\u{B009}", - nfkd: "\u{1101}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{B00A}", - nfc: "\u{B00A}", - nfd: "\u{1101}\u{1170}\u{11C1}", - nfkc: "\u{B00A}", - nfkd: "\u{1101}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{B00B}", - nfc: "\u{B00B}", - nfd: "\u{1101}\u{1170}\u{11C2}", - nfkc: "\u{B00B}", - nfkd: "\u{1101}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{B00C}", - nfc: "\u{B00C}", - nfd: "\u{1101}\u{1171}", - nfkc: "\u{B00C}", - nfkd: "\u{1101}\u{1171}", - }, - NormalizationTest { - source: "\u{B00D}", - nfc: "\u{B00D}", - nfd: "\u{1101}\u{1171}\u{11A8}", - nfkc: "\u{B00D}", - nfkd: "\u{1101}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{B00E}", - nfc: "\u{B00E}", - nfd: "\u{1101}\u{1171}\u{11A9}", - nfkc: "\u{B00E}", - nfkd: "\u{1101}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{B00F}", - nfc: "\u{B00F}", - nfd: "\u{1101}\u{1171}\u{11AA}", - nfkc: "\u{B00F}", - nfkd: "\u{1101}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{B010}", - nfc: "\u{B010}", - nfd: "\u{1101}\u{1171}\u{11AB}", - nfkc: "\u{B010}", - nfkd: "\u{1101}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{B011}", - nfc: "\u{B011}", - nfd: "\u{1101}\u{1171}\u{11AC}", - nfkc: "\u{B011}", - nfkd: "\u{1101}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{B012}", - nfc: "\u{B012}", - nfd: "\u{1101}\u{1171}\u{11AD}", - nfkc: "\u{B012}", - nfkd: "\u{1101}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{B013}", - nfc: "\u{B013}", - nfd: "\u{1101}\u{1171}\u{11AE}", - nfkc: "\u{B013}", - nfkd: "\u{1101}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{B014}", - nfc: "\u{B014}", - nfd: "\u{1101}\u{1171}\u{11AF}", - nfkc: "\u{B014}", - nfkd: "\u{1101}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{B015}", - nfc: "\u{B015}", - nfd: "\u{1101}\u{1171}\u{11B0}", - nfkc: "\u{B015}", - nfkd: "\u{1101}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{B016}", - nfc: "\u{B016}", - nfd: "\u{1101}\u{1171}\u{11B1}", - nfkc: "\u{B016}", - nfkd: "\u{1101}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{B017}", - nfc: "\u{B017}", - nfd: "\u{1101}\u{1171}\u{11B2}", - nfkc: "\u{B017}", - nfkd: "\u{1101}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{B018}", - nfc: "\u{B018}", - nfd: "\u{1101}\u{1171}\u{11B3}", - nfkc: "\u{B018}", - nfkd: "\u{1101}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{B019}", - nfc: "\u{B019}", - nfd: "\u{1101}\u{1171}\u{11B4}", - nfkc: "\u{B019}", - nfkd: "\u{1101}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{B01A}", - nfc: "\u{B01A}", - nfd: "\u{1101}\u{1171}\u{11B5}", - nfkc: "\u{B01A}", - nfkd: "\u{1101}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{B01B}", - nfc: "\u{B01B}", - nfd: "\u{1101}\u{1171}\u{11B6}", - nfkc: "\u{B01B}", - nfkd: "\u{1101}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{B01C}", - nfc: "\u{B01C}", - nfd: "\u{1101}\u{1171}\u{11B7}", - nfkc: "\u{B01C}", - nfkd: "\u{1101}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{B01D}", - nfc: "\u{B01D}", - nfd: "\u{1101}\u{1171}\u{11B8}", - nfkc: "\u{B01D}", - nfkd: "\u{1101}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{B01E}", - nfc: "\u{B01E}", - nfd: "\u{1101}\u{1171}\u{11B9}", - nfkc: "\u{B01E}", - nfkd: "\u{1101}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{B01F}", - nfc: "\u{B01F}", - nfd: "\u{1101}\u{1171}\u{11BA}", - nfkc: "\u{B01F}", - nfkd: "\u{1101}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{B020}", - nfc: "\u{B020}", - nfd: "\u{1101}\u{1171}\u{11BB}", - nfkc: "\u{B020}", - nfkd: "\u{1101}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{B021}", - nfc: "\u{B021}", - nfd: "\u{1101}\u{1171}\u{11BC}", - nfkc: "\u{B021}", - nfkd: "\u{1101}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{B022}", - nfc: "\u{B022}", - nfd: "\u{1101}\u{1171}\u{11BD}", - nfkc: "\u{B022}", - nfkd: "\u{1101}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{B023}", - nfc: "\u{B023}", - nfd: "\u{1101}\u{1171}\u{11BE}", - nfkc: "\u{B023}", - nfkd: "\u{1101}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{B024}", - nfc: "\u{B024}", - nfd: "\u{1101}\u{1171}\u{11BF}", - nfkc: "\u{B024}", - nfkd: "\u{1101}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{B025}", - nfc: "\u{B025}", - nfd: "\u{1101}\u{1171}\u{11C0}", - nfkc: "\u{B025}", - nfkd: "\u{1101}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{B026}", - nfc: "\u{B026}", - nfd: "\u{1101}\u{1171}\u{11C1}", - nfkc: "\u{B026}", - nfkd: "\u{1101}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{B027}", - nfc: "\u{B027}", - nfd: "\u{1101}\u{1171}\u{11C2}", - nfkc: "\u{B027}", - nfkd: "\u{1101}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{B028}", - nfc: "\u{B028}", - nfd: "\u{1101}\u{1172}", - nfkc: "\u{B028}", - nfkd: "\u{1101}\u{1172}", - }, - NormalizationTest { - source: "\u{B029}", - nfc: "\u{B029}", - nfd: "\u{1101}\u{1172}\u{11A8}", - nfkc: "\u{B029}", - nfkd: "\u{1101}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{B02A}", - nfc: "\u{B02A}", - nfd: "\u{1101}\u{1172}\u{11A9}", - nfkc: "\u{B02A}", - nfkd: "\u{1101}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{B02B}", - nfc: "\u{B02B}", - nfd: "\u{1101}\u{1172}\u{11AA}", - nfkc: "\u{B02B}", - nfkd: "\u{1101}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{B02C}", - nfc: "\u{B02C}", - nfd: "\u{1101}\u{1172}\u{11AB}", - nfkc: "\u{B02C}", - nfkd: "\u{1101}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{B02D}", - nfc: "\u{B02D}", - nfd: "\u{1101}\u{1172}\u{11AC}", - nfkc: "\u{B02D}", - nfkd: "\u{1101}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{B02E}", - nfc: "\u{B02E}", - nfd: "\u{1101}\u{1172}\u{11AD}", - nfkc: "\u{B02E}", - nfkd: "\u{1101}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{B02F}", - nfc: "\u{B02F}", - nfd: "\u{1101}\u{1172}\u{11AE}", - nfkc: "\u{B02F}", - nfkd: "\u{1101}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{B030}", - nfc: "\u{B030}", - nfd: "\u{1101}\u{1172}\u{11AF}", - nfkc: "\u{B030}", - nfkd: "\u{1101}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{B031}", - nfc: "\u{B031}", - nfd: "\u{1101}\u{1172}\u{11B0}", - nfkc: "\u{B031}", - nfkd: "\u{1101}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{B032}", - nfc: "\u{B032}", - nfd: "\u{1101}\u{1172}\u{11B1}", - nfkc: "\u{B032}", - nfkd: "\u{1101}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{B033}", - nfc: "\u{B033}", - nfd: "\u{1101}\u{1172}\u{11B2}", - nfkc: "\u{B033}", - nfkd: "\u{1101}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{B034}", - nfc: "\u{B034}", - nfd: "\u{1101}\u{1172}\u{11B3}", - nfkc: "\u{B034}", - nfkd: "\u{1101}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{B035}", - nfc: "\u{B035}", - nfd: "\u{1101}\u{1172}\u{11B4}", - nfkc: "\u{B035}", - nfkd: "\u{1101}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{B036}", - nfc: "\u{B036}", - nfd: "\u{1101}\u{1172}\u{11B5}", - nfkc: "\u{B036}", - nfkd: "\u{1101}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{B037}", - nfc: "\u{B037}", - nfd: "\u{1101}\u{1172}\u{11B6}", - nfkc: "\u{B037}", - nfkd: "\u{1101}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{B038}", - nfc: "\u{B038}", - nfd: "\u{1101}\u{1172}\u{11B7}", - nfkc: "\u{B038}", - nfkd: "\u{1101}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{B039}", - nfc: "\u{B039}", - nfd: "\u{1101}\u{1172}\u{11B8}", - nfkc: "\u{B039}", - nfkd: "\u{1101}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{B03A}", - nfc: "\u{B03A}", - nfd: "\u{1101}\u{1172}\u{11B9}", - nfkc: "\u{B03A}", - nfkd: "\u{1101}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{B03B}", - nfc: "\u{B03B}", - nfd: "\u{1101}\u{1172}\u{11BA}", - nfkc: "\u{B03B}", - nfkd: "\u{1101}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{B03C}", - nfc: "\u{B03C}", - nfd: "\u{1101}\u{1172}\u{11BB}", - nfkc: "\u{B03C}", - nfkd: "\u{1101}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{B03D}", - nfc: "\u{B03D}", - nfd: "\u{1101}\u{1172}\u{11BC}", - nfkc: "\u{B03D}", - nfkd: "\u{1101}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{B03E}", - nfc: "\u{B03E}", - nfd: "\u{1101}\u{1172}\u{11BD}", - nfkc: "\u{B03E}", - nfkd: "\u{1101}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{B03F}", - nfc: "\u{B03F}", - nfd: "\u{1101}\u{1172}\u{11BE}", - nfkc: "\u{B03F}", - nfkd: "\u{1101}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{B040}", - nfc: "\u{B040}", - nfd: "\u{1101}\u{1172}\u{11BF}", - nfkc: "\u{B040}", - nfkd: "\u{1101}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{B041}", - nfc: "\u{B041}", - nfd: "\u{1101}\u{1172}\u{11C0}", - nfkc: "\u{B041}", - nfkd: "\u{1101}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{B042}", - nfc: "\u{B042}", - nfd: "\u{1101}\u{1172}\u{11C1}", - nfkc: "\u{B042}", - nfkd: "\u{1101}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{B043}", - nfc: "\u{B043}", - nfd: "\u{1101}\u{1172}\u{11C2}", - nfkc: "\u{B043}", - nfkd: "\u{1101}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{B044}", - nfc: "\u{B044}", - nfd: "\u{1101}\u{1173}", - nfkc: "\u{B044}", - nfkd: "\u{1101}\u{1173}", - }, - NormalizationTest { - source: "\u{B045}", - nfc: "\u{B045}", - nfd: "\u{1101}\u{1173}\u{11A8}", - nfkc: "\u{B045}", - nfkd: "\u{1101}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{B046}", - nfc: "\u{B046}", - nfd: "\u{1101}\u{1173}\u{11A9}", - nfkc: "\u{B046}", - nfkd: "\u{1101}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{B047}", - nfc: "\u{B047}", - nfd: "\u{1101}\u{1173}\u{11AA}", - nfkc: "\u{B047}", - nfkd: "\u{1101}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{B048}", - nfc: "\u{B048}", - nfd: "\u{1101}\u{1173}\u{11AB}", - nfkc: "\u{B048}", - nfkd: "\u{1101}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{B049}", - nfc: "\u{B049}", - nfd: "\u{1101}\u{1173}\u{11AC}", - nfkc: "\u{B049}", - nfkd: "\u{1101}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{B04A}", - nfc: "\u{B04A}", - nfd: "\u{1101}\u{1173}\u{11AD}", - nfkc: "\u{B04A}", - nfkd: "\u{1101}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{B04B}", - nfc: "\u{B04B}", - nfd: "\u{1101}\u{1173}\u{11AE}", - nfkc: "\u{B04B}", - nfkd: "\u{1101}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{B04C}", - nfc: "\u{B04C}", - nfd: "\u{1101}\u{1173}\u{11AF}", - nfkc: "\u{B04C}", - nfkd: "\u{1101}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{B04D}", - nfc: "\u{B04D}", - nfd: "\u{1101}\u{1173}\u{11B0}", - nfkc: "\u{B04D}", - nfkd: "\u{1101}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{B04E}", - nfc: "\u{B04E}", - nfd: "\u{1101}\u{1173}\u{11B1}", - nfkc: "\u{B04E}", - nfkd: "\u{1101}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{B04F}", - nfc: "\u{B04F}", - nfd: "\u{1101}\u{1173}\u{11B2}", - nfkc: "\u{B04F}", - nfkd: "\u{1101}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{B050}", - nfc: "\u{B050}", - nfd: "\u{1101}\u{1173}\u{11B3}", - nfkc: "\u{B050}", - nfkd: "\u{1101}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{B051}", - nfc: "\u{B051}", - nfd: "\u{1101}\u{1173}\u{11B4}", - nfkc: "\u{B051}", - nfkd: "\u{1101}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{B052}", - nfc: "\u{B052}", - nfd: "\u{1101}\u{1173}\u{11B5}", - nfkc: "\u{B052}", - nfkd: "\u{1101}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{B053}", - nfc: "\u{B053}", - nfd: "\u{1101}\u{1173}\u{11B6}", - nfkc: "\u{B053}", - nfkd: "\u{1101}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{B054}", - nfc: "\u{B054}", - nfd: "\u{1101}\u{1173}\u{11B7}", - nfkc: "\u{B054}", - nfkd: "\u{1101}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{B055}", - nfc: "\u{B055}", - nfd: "\u{1101}\u{1173}\u{11B8}", - nfkc: "\u{B055}", - nfkd: "\u{1101}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{B056}", - nfc: "\u{B056}", - nfd: "\u{1101}\u{1173}\u{11B9}", - nfkc: "\u{B056}", - nfkd: "\u{1101}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{B057}", - nfc: "\u{B057}", - nfd: "\u{1101}\u{1173}\u{11BA}", - nfkc: "\u{B057}", - nfkd: "\u{1101}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{B058}", - nfc: "\u{B058}", - nfd: "\u{1101}\u{1173}\u{11BB}", - nfkc: "\u{B058}", - nfkd: "\u{1101}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{B059}", - nfc: "\u{B059}", - nfd: "\u{1101}\u{1173}\u{11BC}", - nfkc: "\u{B059}", - nfkd: "\u{1101}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{B05A}", - nfc: "\u{B05A}", - nfd: "\u{1101}\u{1173}\u{11BD}", - nfkc: "\u{B05A}", - nfkd: "\u{1101}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{B05B}", - nfc: "\u{B05B}", - nfd: "\u{1101}\u{1173}\u{11BE}", - nfkc: "\u{B05B}", - nfkd: "\u{1101}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{B05C}", - nfc: "\u{B05C}", - nfd: "\u{1101}\u{1173}\u{11BF}", - nfkc: "\u{B05C}", - nfkd: "\u{1101}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{B05D}", - nfc: "\u{B05D}", - nfd: "\u{1101}\u{1173}\u{11C0}", - nfkc: "\u{B05D}", - nfkd: "\u{1101}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{B05E}", - nfc: "\u{B05E}", - nfd: "\u{1101}\u{1173}\u{11C1}", - nfkc: "\u{B05E}", - nfkd: "\u{1101}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{B05F}", - nfc: "\u{B05F}", - nfd: "\u{1101}\u{1173}\u{11C2}", - nfkc: "\u{B05F}", - nfkd: "\u{1101}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{B060}", - nfc: "\u{B060}", - nfd: "\u{1101}\u{1174}", - nfkc: "\u{B060}", - nfkd: "\u{1101}\u{1174}", - }, - NormalizationTest { - source: "\u{B061}", - nfc: "\u{B061}", - nfd: "\u{1101}\u{1174}\u{11A8}", - nfkc: "\u{B061}", - nfkd: "\u{1101}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{B062}", - nfc: "\u{B062}", - nfd: "\u{1101}\u{1174}\u{11A9}", - nfkc: "\u{B062}", - nfkd: "\u{1101}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{B063}", - nfc: "\u{B063}", - nfd: "\u{1101}\u{1174}\u{11AA}", - nfkc: "\u{B063}", - nfkd: "\u{1101}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{B064}", - nfc: "\u{B064}", - nfd: "\u{1101}\u{1174}\u{11AB}", - nfkc: "\u{B064}", - nfkd: "\u{1101}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{B065}", - nfc: "\u{B065}", - nfd: "\u{1101}\u{1174}\u{11AC}", - nfkc: "\u{B065}", - nfkd: "\u{1101}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{B066}", - nfc: "\u{B066}", - nfd: "\u{1101}\u{1174}\u{11AD}", - nfkc: "\u{B066}", - nfkd: "\u{1101}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{B067}", - nfc: "\u{B067}", - nfd: "\u{1101}\u{1174}\u{11AE}", - nfkc: "\u{B067}", - nfkd: "\u{1101}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{B068}", - nfc: "\u{B068}", - nfd: "\u{1101}\u{1174}\u{11AF}", - nfkc: "\u{B068}", - nfkd: "\u{1101}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{B069}", - nfc: "\u{B069}", - nfd: "\u{1101}\u{1174}\u{11B0}", - nfkc: "\u{B069}", - nfkd: "\u{1101}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{B06A}", - nfc: "\u{B06A}", - nfd: "\u{1101}\u{1174}\u{11B1}", - nfkc: "\u{B06A}", - nfkd: "\u{1101}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{B06B}", - nfc: "\u{B06B}", - nfd: "\u{1101}\u{1174}\u{11B2}", - nfkc: "\u{B06B}", - nfkd: "\u{1101}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{B06C}", - nfc: "\u{B06C}", - nfd: "\u{1101}\u{1174}\u{11B3}", - nfkc: "\u{B06C}", - nfkd: "\u{1101}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{B06D}", - nfc: "\u{B06D}", - nfd: "\u{1101}\u{1174}\u{11B4}", - nfkc: "\u{B06D}", - nfkd: "\u{1101}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{B06E}", - nfc: "\u{B06E}", - nfd: "\u{1101}\u{1174}\u{11B5}", - nfkc: "\u{B06E}", - nfkd: "\u{1101}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{B06F}", - nfc: "\u{B06F}", - nfd: "\u{1101}\u{1174}\u{11B6}", - nfkc: "\u{B06F}", - nfkd: "\u{1101}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{B070}", - nfc: "\u{B070}", - nfd: "\u{1101}\u{1174}\u{11B7}", - nfkc: "\u{B070}", - nfkd: "\u{1101}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{B071}", - nfc: "\u{B071}", - nfd: "\u{1101}\u{1174}\u{11B8}", - nfkc: "\u{B071}", - nfkd: "\u{1101}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{B072}", - nfc: "\u{B072}", - nfd: "\u{1101}\u{1174}\u{11B9}", - nfkc: "\u{B072}", - nfkd: "\u{1101}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{B073}", - nfc: "\u{B073}", - nfd: "\u{1101}\u{1174}\u{11BA}", - nfkc: "\u{B073}", - nfkd: "\u{1101}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{B074}", - nfc: "\u{B074}", - nfd: "\u{1101}\u{1174}\u{11BB}", - nfkc: "\u{B074}", - nfkd: "\u{1101}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{B075}", - nfc: "\u{B075}", - nfd: "\u{1101}\u{1174}\u{11BC}", - nfkc: "\u{B075}", - nfkd: "\u{1101}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{B076}", - nfc: "\u{B076}", - nfd: "\u{1101}\u{1174}\u{11BD}", - nfkc: "\u{B076}", - nfkd: "\u{1101}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{B077}", - nfc: "\u{B077}", - nfd: "\u{1101}\u{1174}\u{11BE}", - nfkc: "\u{B077}", - nfkd: "\u{1101}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{B078}", - nfc: "\u{B078}", - nfd: "\u{1101}\u{1174}\u{11BF}", - nfkc: "\u{B078}", - nfkd: "\u{1101}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{B079}", - nfc: "\u{B079}", - nfd: "\u{1101}\u{1174}\u{11C0}", - nfkc: "\u{B079}", - nfkd: "\u{1101}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{B07A}", - nfc: "\u{B07A}", - nfd: "\u{1101}\u{1174}\u{11C1}", - nfkc: "\u{B07A}", - nfkd: "\u{1101}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{B07B}", - nfc: "\u{B07B}", - nfd: "\u{1101}\u{1174}\u{11C2}", - nfkc: "\u{B07B}", - nfkd: "\u{1101}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{B07C}", - nfc: "\u{B07C}", - nfd: "\u{1101}\u{1175}", - nfkc: "\u{B07C}", - nfkd: "\u{1101}\u{1175}", - }, - NormalizationTest { - source: "\u{B07D}", - nfc: "\u{B07D}", - nfd: "\u{1101}\u{1175}\u{11A8}", - nfkc: "\u{B07D}", - nfkd: "\u{1101}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{B07E}", - nfc: "\u{B07E}", - nfd: "\u{1101}\u{1175}\u{11A9}", - nfkc: "\u{B07E}", - nfkd: "\u{1101}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{B07F}", - nfc: "\u{B07F}", - nfd: "\u{1101}\u{1175}\u{11AA}", - nfkc: "\u{B07F}", - nfkd: "\u{1101}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{B080}", - nfc: "\u{B080}", - nfd: "\u{1101}\u{1175}\u{11AB}", - nfkc: "\u{B080}", - nfkd: "\u{1101}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{B081}", - nfc: "\u{B081}", - nfd: "\u{1101}\u{1175}\u{11AC}", - nfkc: "\u{B081}", - nfkd: "\u{1101}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{B082}", - nfc: "\u{B082}", - nfd: "\u{1101}\u{1175}\u{11AD}", - nfkc: "\u{B082}", - nfkd: "\u{1101}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{B083}", - nfc: "\u{B083}", - nfd: "\u{1101}\u{1175}\u{11AE}", - nfkc: "\u{B083}", - nfkd: "\u{1101}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{B084}", - nfc: "\u{B084}", - nfd: "\u{1101}\u{1175}\u{11AF}", - nfkc: "\u{B084}", - nfkd: "\u{1101}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{B085}", - nfc: "\u{B085}", - nfd: "\u{1101}\u{1175}\u{11B0}", - nfkc: "\u{B085}", - nfkd: "\u{1101}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{B086}", - nfc: "\u{B086}", - nfd: "\u{1101}\u{1175}\u{11B1}", - nfkc: "\u{B086}", - nfkd: "\u{1101}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{B087}", - nfc: "\u{B087}", - nfd: "\u{1101}\u{1175}\u{11B2}", - nfkc: "\u{B087}", - nfkd: "\u{1101}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{B088}", - nfc: "\u{B088}", - nfd: "\u{1101}\u{1175}\u{11B3}", - nfkc: "\u{B088}", - nfkd: "\u{1101}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{B089}", - nfc: "\u{B089}", - nfd: "\u{1101}\u{1175}\u{11B4}", - nfkc: "\u{B089}", - nfkd: "\u{1101}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{B08A}", - nfc: "\u{B08A}", - nfd: "\u{1101}\u{1175}\u{11B5}", - nfkc: "\u{B08A}", - nfkd: "\u{1101}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{B08B}", - nfc: "\u{B08B}", - nfd: "\u{1101}\u{1175}\u{11B6}", - nfkc: "\u{B08B}", - nfkd: "\u{1101}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{B08C}", - nfc: "\u{B08C}", - nfd: "\u{1101}\u{1175}\u{11B7}", - nfkc: "\u{B08C}", - nfkd: "\u{1101}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{B08D}", - nfc: "\u{B08D}", - nfd: "\u{1101}\u{1175}\u{11B8}", - nfkc: "\u{B08D}", - nfkd: "\u{1101}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{B08E}", - nfc: "\u{B08E}", - nfd: "\u{1101}\u{1175}\u{11B9}", - nfkc: "\u{B08E}", - nfkd: "\u{1101}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{B08F}", - nfc: "\u{B08F}", - nfd: "\u{1101}\u{1175}\u{11BA}", - nfkc: "\u{B08F}", - nfkd: "\u{1101}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{B090}", - nfc: "\u{B090}", - nfd: "\u{1101}\u{1175}\u{11BB}", - nfkc: "\u{B090}", - nfkd: "\u{1101}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{B091}", - nfc: "\u{B091}", - nfd: "\u{1101}\u{1175}\u{11BC}", - nfkc: "\u{B091}", - nfkd: "\u{1101}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{B092}", - nfc: "\u{B092}", - nfd: "\u{1101}\u{1175}\u{11BD}", - nfkc: "\u{B092}", - nfkd: "\u{1101}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{B093}", - nfc: "\u{B093}", - nfd: "\u{1101}\u{1175}\u{11BE}", - nfkc: "\u{B093}", - nfkd: "\u{1101}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{B094}", - nfc: "\u{B094}", - nfd: "\u{1101}\u{1175}\u{11BF}", - nfkc: "\u{B094}", - nfkd: "\u{1101}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{B095}", - nfc: "\u{B095}", - nfd: "\u{1101}\u{1175}\u{11C0}", - nfkc: "\u{B095}", - nfkd: "\u{1101}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{B096}", - nfc: "\u{B096}", - nfd: "\u{1101}\u{1175}\u{11C1}", - nfkc: "\u{B096}", - nfkd: "\u{1101}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{B097}", - nfc: "\u{B097}", - nfd: "\u{1101}\u{1175}\u{11C2}", - nfkc: "\u{B097}", - nfkd: "\u{1101}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{B098}", - nfc: "\u{B098}", - nfd: "\u{1102}\u{1161}", - nfkc: "\u{B098}", - nfkd: "\u{1102}\u{1161}", - }, - NormalizationTest { - source: "\u{B099}", - nfc: "\u{B099}", - nfd: "\u{1102}\u{1161}\u{11A8}", - nfkc: "\u{B099}", - nfkd: "\u{1102}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{B09A}", - nfc: "\u{B09A}", - nfd: "\u{1102}\u{1161}\u{11A9}", - nfkc: "\u{B09A}", - nfkd: "\u{1102}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{B09B}", - nfc: "\u{B09B}", - nfd: "\u{1102}\u{1161}\u{11AA}", - nfkc: "\u{B09B}", - nfkd: "\u{1102}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{B09C}", - nfc: "\u{B09C}", - nfd: "\u{1102}\u{1161}\u{11AB}", - nfkc: "\u{B09C}", - nfkd: "\u{1102}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{B09D}", - nfc: "\u{B09D}", - nfd: "\u{1102}\u{1161}\u{11AC}", - nfkc: "\u{B09D}", - nfkd: "\u{1102}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{B09E}", - nfc: "\u{B09E}", - nfd: "\u{1102}\u{1161}\u{11AD}", - nfkc: "\u{B09E}", - nfkd: "\u{1102}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{B09F}", - nfc: "\u{B09F}", - nfd: "\u{1102}\u{1161}\u{11AE}", - nfkc: "\u{B09F}", - nfkd: "\u{1102}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{B0A0}", - nfc: "\u{B0A0}", - nfd: "\u{1102}\u{1161}\u{11AF}", - nfkc: "\u{B0A0}", - nfkd: "\u{1102}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{B0A1}", - nfc: "\u{B0A1}", - nfd: "\u{1102}\u{1161}\u{11B0}", - nfkc: "\u{B0A1}", - nfkd: "\u{1102}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{B0A2}", - nfc: "\u{B0A2}", - nfd: "\u{1102}\u{1161}\u{11B1}", - nfkc: "\u{B0A2}", - nfkd: "\u{1102}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{B0A3}", - nfc: "\u{B0A3}", - nfd: "\u{1102}\u{1161}\u{11B2}", - nfkc: "\u{B0A3}", - nfkd: "\u{1102}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{B0A4}", - nfc: "\u{B0A4}", - nfd: "\u{1102}\u{1161}\u{11B3}", - nfkc: "\u{B0A4}", - nfkd: "\u{1102}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{B0A5}", - nfc: "\u{B0A5}", - nfd: "\u{1102}\u{1161}\u{11B4}", - nfkc: "\u{B0A5}", - nfkd: "\u{1102}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{B0A6}", - nfc: "\u{B0A6}", - nfd: "\u{1102}\u{1161}\u{11B5}", - nfkc: "\u{B0A6}", - nfkd: "\u{1102}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{B0A7}", - nfc: "\u{B0A7}", - nfd: "\u{1102}\u{1161}\u{11B6}", - nfkc: "\u{B0A7}", - nfkd: "\u{1102}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{B0A8}", - nfc: "\u{B0A8}", - nfd: "\u{1102}\u{1161}\u{11B7}", - nfkc: "\u{B0A8}", - nfkd: "\u{1102}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{B0A9}", - nfc: "\u{B0A9}", - nfd: "\u{1102}\u{1161}\u{11B8}", - nfkc: "\u{B0A9}", - nfkd: "\u{1102}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{B0AA}", - nfc: "\u{B0AA}", - nfd: "\u{1102}\u{1161}\u{11B9}", - nfkc: "\u{B0AA}", - nfkd: "\u{1102}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{B0AB}", - nfc: "\u{B0AB}", - nfd: "\u{1102}\u{1161}\u{11BA}", - nfkc: "\u{B0AB}", - nfkd: "\u{1102}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{B0AC}", - nfc: "\u{B0AC}", - nfd: "\u{1102}\u{1161}\u{11BB}", - nfkc: "\u{B0AC}", - nfkd: "\u{1102}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{B0AD}", - nfc: "\u{B0AD}", - nfd: "\u{1102}\u{1161}\u{11BC}", - nfkc: "\u{B0AD}", - nfkd: "\u{1102}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{B0AE}", - nfc: "\u{B0AE}", - nfd: "\u{1102}\u{1161}\u{11BD}", - nfkc: "\u{B0AE}", - nfkd: "\u{1102}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{B0AF}", - nfc: "\u{B0AF}", - nfd: "\u{1102}\u{1161}\u{11BE}", - nfkc: "\u{B0AF}", - nfkd: "\u{1102}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{B0B0}", - nfc: "\u{B0B0}", - nfd: "\u{1102}\u{1161}\u{11BF}", - nfkc: "\u{B0B0}", - nfkd: "\u{1102}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{B0B1}", - nfc: "\u{B0B1}", - nfd: "\u{1102}\u{1161}\u{11C0}", - nfkc: "\u{B0B1}", - nfkd: "\u{1102}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{B0B2}", - nfc: "\u{B0B2}", - nfd: "\u{1102}\u{1161}\u{11C1}", - nfkc: "\u{B0B2}", - nfkd: "\u{1102}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{B0B3}", - nfc: "\u{B0B3}", - nfd: "\u{1102}\u{1161}\u{11C2}", - nfkc: "\u{B0B3}", - nfkd: "\u{1102}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{B0B4}", - nfc: "\u{B0B4}", - nfd: "\u{1102}\u{1162}", - nfkc: "\u{B0B4}", - nfkd: "\u{1102}\u{1162}", - }, - NormalizationTest { - source: "\u{B0B5}", - nfc: "\u{B0B5}", - nfd: "\u{1102}\u{1162}\u{11A8}", - nfkc: "\u{B0B5}", - nfkd: "\u{1102}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{B0B6}", - nfc: "\u{B0B6}", - nfd: "\u{1102}\u{1162}\u{11A9}", - nfkc: "\u{B0B6}", - nfkd: "\u{1102}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{B0B7}", - nfc: "\u{B0B7}", - nfd: "\u{1102}\u{1162}\u{11AA}", - nfkc: "\u{B0B7}", - nfkd: "\u{1102}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{B0B8}", - nfc: "\u{B0B8}", - nfd: "\u{1102}\u{1162}\u{11AB}", - nfkc: "\u{B0B8}", - nfkd: "\u{1102}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{B0B9}", - nfc: "\u{B0B9}", - nfd: "\u{1102}\u{1162}\u{11AC}", - nfkc: "\u{B0B9}", - nfkd: "\u{1102}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{B0BA}", - nfc: "\u{B0BA}", - nfd: "\u{1102}\u{1162}\u{11AD}", - nfkc: "\u{B0BA}", - nfkd: "\u{1102}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{B0BB}", - nfc: "\u{B0BB}", - nfd: "\u{1102}\u{1162}\u{11AE}", - nfkc: "\u{B0BB}", - nfkd: "\u{1102}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{B0BC}", - nfc: "\u{B0BC}", - nfd: "\u{1102}\u{1162}\u{11AF}", - nfkc: "\u{B0BC}", - nfkd: "\u{1102}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{B0BD}", - nfc: "\u{B0BD}", - nfd: "\u{1102}\u{1162}\u{11B0}", - nfkc: "\u{B0BD}", - nfkd: "\u{1102}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{B0BE}", - nfc: "\u{B0BE}", - nfd: "\u{1102}\u{1162}\u{11B1}", - nfkc: "\u{B0BE}", - nfkd: "\u{1102}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{B0BF}", - nfc: "\u{B0BF}", - nfd: "\u{1102}\u{1162}\u{11B2}", - nfkc: "\u{B0BF}", - nfkd: "\u{1102}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{B0C0}", - nfc: "\u{B0C0}", - nfd: "\u{1102}\u{1162}\u{11B3}", - nfkc: "\u{B0C0}", - nfkd: "\u{1102}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{B0C1}", - nfc: "\u{B0C1}", - nfd: "\u{1102}\u{1162}\u{11B4}", - nfkc: "\u{B0C1}", - nfkd: "\u{1102}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{B0C2}", - nfc: "\u{B0C2}", - nfd: "\u{1102}\u{1162}\u{11B5}", - nfkc: "\u{B0C2}", - nfkd: "\u{1102}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{B0C3}", - nfc: "\u{B0C3}", - nfd: "\u{1102}\u{1162}\u{11B6}", - nfkc: "\u{B0C3}", - nfkd: "\u{1102}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{B0C4}", - nfc: "\u{B0C4}", - nfd: "\u{1102}\u{1162}\u{11B7}", - nfkc: "\u{B0C4}", - nfkd: "\u{1102}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{B0C5}", - nfc: "\u{B0C5}", - nfd: "\u{1102}\u{1162}\u{11B8}", - nfkc: "\u{B0C5}", - nfkd: "\u{1102}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{B0C6}", - nfc: "\u{B0C6}", - nfd: "\u{1102}\u{1162}\u{11B9}", - nfkc: "\u{B0C6}", - nfkd: "\u{1102}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{B0C7}", - nfc: "\u{B0C7}", - nfd: "\u{1102}\u{1162}\u{11BA}", - nfkc: "\u{B0C7}", - nfkd: "\u{1102}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{B0C8}", - nfc: "\u{B0C8}", - nfd: "\u{1102}\u{1162}\u{11BB}", - nfkc: "\u{B0C8}", - nfkd: "\u{1102}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{B0C9}", - nfc: "\u{B0C9}", - nfd: "\u{1102}\u{1162}\u{11BC}", - nfkc: "\u{B0C9}", - nfkd: "\u{1102}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{B0CA}", - nfc: "\u{B0CA}", - nfd: "\u{1102}\u{1162}\u{11BD}", - nfkc: "\u{B0CA}", - nfkd: "\u{1102}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{B0CB}", - nfc: "\u{B0CB}", - nfd: "\u{1102}\u{1162}\u{11BE}", - nfkc: "\u{B0CB}", - nfkd: "\u{1102}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{B0CC}", - nfc: "\u{B0CC}", - nfd: "\u{1102}\u{1162}\u{11BF}", - nfkc: "\u{B0CC}", - nfkd: "\u{1102}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{B0CD}", - nfc: "\u{B0CD}", - nfd: "\u{1102}\u{1162}\u{11C0}", - nfkc: "\u{B0CD}", - nfkd: "\u{1102}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{B0CE}", - nfc: "\u{B0CE}", - nfd: "\u{1102}\u{1162}\u{11C1}", - nfkc: "\u{B0CE}", - nfkd: "\u{1102}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{B0CF}", - nfc: "\u{B0CF}", - nfd: "\u{1102}\u{1162}\u{11C2}", - nfkc: "\u{B0CF}", - nfkd: "\u{1102}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{B0D0}", - nfc: "\u{B0D0}", - nfd: "\u{1102}\u{1163}", - nfkc: "\u{B0D0}", - nfkd: "\u{1102}\u{1163}", - }, - NormalizationTest { - source: "\u{B0D1}", - nfc: "\u{B0D1}", - nfd: "\u{1102}\u{1163}\u{11A8}", - nfkc: "\u{B0D1}", - nfkd: "\u{1102}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{B0D2}", - nfc: "\u{B0D2}", - nfd: "\u{1102}\u{1163}\u{11A9}", - nfkc: "\u{B0D2}", - nfkd: "\u{1102}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{B0D3}", - nfc: "\u{B0D3}", - nfd: "\u{1102}\u{1163}\u{11AA}", - nfkc: "\u{B0D3}", - nfkd: "\u{1102}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{B0D4}", - nfc: "\u{B0D4}", - nfd: "\u{1102}\u{1163}\u{11AB}", - nfkc: "\u{B0D4}", - nfkd: "\u{1102}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{B0D5}", - nfc: "\u{B0D5}", - nfd: "\u{1102}\u{1163}\u{11AC}", - nfkc: "\u{B0D5}", - nfkd: "\u{1102}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{B0D6}", - nfc: "\u{B0D6}", - nfd: "\u{1102}\u{1163}\u{11AD}", - nfkc: "\u{B0D6}", - nfkd: "\u{1102}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{B0D7}", - nfc: "\u{B0D7}", - nfd: "\u{1102}\u{1163}\u{11AE}", - nfkc: "\u{B0D7}", - nfkd: "\u{1102}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{B0D8}", - nfc: "\u{B0D8}", - nfd: "\u{1102}\u{1163}\u{11AF}", - nfkc: "\u{B0D8}", - nfkd: "\u{1102}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{B0D9}", - nfc: "\u{B0D9}", - nfd: "\u{1102}\u{1163}\u{11B0}", - nfkc: "\u{B0D9}", - nfkd: "\u{1102}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{B0DA}", - nfc: "\u{B0DA}", - nfd: "\u{1102}\u{1163}\u{11B1}", - nfkc: "\u{B0DA}", - nfkd: "\u{1102}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{B0DB}", - nfc: "\u{B0DB}", - nfd: "\u{1102}\u{1163}\u{11B2}", - nfkc: "\u{B0DB}", - nfkd: "\u{1102}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{B0DC}", - nfc: "\u{B0DC}", - nfd: "\u{1102}\u{1163}\u{11B3}", - nfkc: "\u{B0DC}", - nfkd: "\u{1102}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{B0DD}", - nfc: "\u{B0DD}", - nfd: "\u{1102}\u{1163}\u{11B4}", - nfkc: "\u{B0DD}", - nfkd: "\u{1102}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{B0DE}", - nfc: "\u{B0DE}", - nfd: "\u{1102}\u{1163}\u{11B5}", - nfkc: "\u{B0DE}", - nfkd: "\u{1102}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{B0DF}", - nfc: "\u{B0DF}", - nfd: "\u{1102}\u{1163}\u{11B6}", - nfkc: "\u{B0DF}", - nfkd: "\u{1102}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{B0E0}", - nfc: "\u{B0E0}", - nfd: "\u{1102}\u{1163}\u{11B7}", - nfkc: "\u{B0E0}", - nfkd: "\u{1102}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{B0E1}", - nfc: "\u{B0E1}", - nfd: "\u{1102}\u{1163}\u{11B8}", - nfkc: "\u{B0E1}", - nfkd: "\u{1102}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{B0E2}", - nfc: "\u{B0E2}", - nfd: "\u{1102}\u{1163}\u{11B9}", - nfkc: "\u{B0E2}", - nfkd: "\u{1102}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{B0E3}", - nfc: "\u{B0E3}", - nfd: "\u{1102}\u{1163}\u{11BA}", - nfkc: "\u{B0E3}", - nfkd: "\u{1102}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{B0E4}", - nfc: "\u{B0E4}", - nfd: "\u{1102}\u{1163}\u{11BB}", - nfkc: "\u{B0E4}", - nfkd: "\u{1102}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{B0E5}", - nfc: "\u{B0E5}", - nfd: "\u{1102}\u{1163}\u{11BC}", - nfkc: "\u{B0E5}", - nfkd: "\u{1102}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{B0E6}", - nfc: "\u{B0E6}", - nfd: "\u{1102}\u{1163}\u{11BD}", - nfkc: "\u{B0E6}", - nfkd: "\u{1102}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{B0E7}", - nfc: "\u{B0E7}", - nfd: "\u{1102}\u{1163}\u{11BE}", - nfkc: "\u{B0E7}", - nfkd: "\u{1102}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{B0E8}", - nfc: "\u{B0E8}", - nfd: "\u{1102}\u{1163}\u{11BF}", - nfkc: "\u{B0E8}", - nfkd: "\u{1102}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{B0E9}", - nfc: "\u{B0E9}", - nfd: "\u{1102}\u{1163}\u{11C0}", - nfkc: "\u{B0E9}", - nfkd: "\u{1102}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{B0EA}", - nfc: "\u{B0EA}", - nfd: "\u{1102}\u{1163}\u{11C1}", - nfkc: "\u{B0EA}", - nfkd: "\u{1102}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{B0EB}", - nfc: "\u{B0EB}", - nfd: "\u{1102}\u{1163}\u{11C2}", - nfkc: "\u{B0EB}", - nfkd: "\u{1102}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{B0EC}", - nfc: "\u{B0EC}", - nfd: "\u{1102}\u{1164}", - nfkc: "\u{B0EC}", - nfkd: "\u{1102}\u{1164}", - }, - NormalizationTest { - source: "\u{B0ED}", - nfc: "\u{B0ED}", - nfd: "\u{1102}\u{1164}\u{11A8}", - nfkc: "\u{B0ED}", - nfkd: "\u{1102}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{B0EE}", - nfc: "\u{B0EE}", - nfd: "\u{1102}\u{1164}\u{11A9}", - nfkc: "\u{B0EE}", - nfkd: "\u{1102}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{B0EF}", - nfc: "\u{B0EF}", - nfd: "\u{1102}\u{1164}\u{11AA}", - nfkc: "\u{B0EF}", - nfkd: "\u{1102}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{B0F0}", - nfc: "\u{B0F0}", - nfd: "\u{1102}\u{1164}\u{11AB}", - nfkc: "\u{B0F0}", - nfkd: "\u{1102}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{B0F1}", - nfc: "\u{B0F1}", - nfd: "\u{1102}\u{1164}\u{11AC}", - nfkc: "\u{B0F1}", - nfkd: "\u{1102}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{B0F2}", - nfc: "\u{B0F2}", - nfd: "\u{1102}\u{1164}\u{11AD}", - nfkc: "\u{B0F2}", - nfkd: "\u{1102}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{B0F3}", - nfc: "\u{B0F3}", - nfd: "\u{1102}\u{1164}\u{11AE}", - nfkc: "\u{B0F3}", - nfkd: "\u{1102}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{B0F4}", - nfc: "\u{B0F4}", - nfd: "\u{1102}\u{1164}\u{11AF}", - nfkc: "\u{B0F4}", - nfkd: "\u{1102}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{B0F5}", - nfc: "\u{B0F5}", - nfd: "\u{1102}\u{1164}\u{11B0}", - nfkc: "\u{B0F5}", - nfkd: "\u{1102}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{B0F6}", - nfc: "\u{B0F6}", - nfd: "\u{1102}\u{1164}\u{11B1}", - nfkc: "\u{B0F6}", - nfkd: "\u{1102}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{B0F7}", - nfc: "\u{B0F7}", - nfd: "\u{1102}\u{1164}\u{11B2}", - nfkc: "\u{B0F7}", - nfkd: "\u{1102}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{B0F8}", - nfc: "\u{B0F8}", - nfd: "\u{1102}\u{1164}\u{11B3}", - nfkc: "\u{B0F8}", - nfkd: "\u{1102}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{B0F9}", - nfc: "\u{B0F9}", - nfd: "\u{1102}\u{1164}\u{11B4}", - nfkc: "\u{B0F9}", - nfkd: "\u{1102}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{B0FA}", - nfc: "\u{B0FA}", - nfd: "\u{1102}\u{1164}\u{11B5}", - nfkc: "\u{B0FA}", - nfkd: "\u{1102}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{B0FB}", - nfc: "\u{B0FB}", - nfd: "\u{1102}\u{1164}\u{11B6}", - nfkc: "\u{B0FB}", - nfkd: "\u{1102}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{B0FC}", - nfc: "\u{B0FC}", - nfd: "\u{1102}\u{1164}\u{11B7}", - nfkc: "\u{B0FC}", - nfkd: "\u{1102}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{B0FD}", - nfc: "\u{B0FD}", - nfd: "\u{1102}\u{1164}\u{11B8}", - nfkc: "\u{B0FD}", - nfkd: "\u{1102}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{B0FE}", - nfc: "\u{B0FE}", - nfd: "\u{1102}\u{1164}\u{11B9}", - nfkc: "\u{B0FE}", - nfkd: "\u{1102}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{B0FF}", - nfc: "\u{B0FF}", - nfd: "\u{1102}\u{1164}\u{11BA}", - nfkc: "\u{B0FF}", - nfkd: "\u{1102}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{B100}", - nfc: "\u{B100}", - nfd: "\u{1102}\u{1164}\u{11BB}", - nfkc: "\u{B100}", - nfkd: "\u{1102}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{B101}", - nfc: "\u{B101}", - nfd: "\u{1102}\u{1164}\u{11BC}", - nfkc: "\u{B101}", - nfkd: "\u{1102}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{B102}", - nfc: "\u{B102}", - nfd: "\u{1102}\u{1164}\u{11BD}", - nfkc: "\u{B102}", - nfkd: "\u{1102}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{B103}", - nfc: "\u{B103}", - nfd: "\u{1102}\u{1164}\u{11BE}", - nfkc: "\u{B103}", - nfkd: "\u{1102}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{B104}", - nfc: "\u{B104}", - nfd: "\u{1102}\u{1164}\u{11BF}", - nfkc: "\u{B104}", - nfkd: "\u{1102}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{B105}", - nfc: "\u{B105}", - nfd: "\u{1102}\u{1164}\u{11C0}", - nfkc: "\u{B105}", - nfkd: "\u{1102}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{B106}", - nfc: "\u{B106}", - nfd: "\u{1102}\u{1164}\u{11C1}", - nfkc: "\u{B106}", - nfkd: "\u{1102}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{B107}", - nfc: "\u{B107}", - nfd: "\u{1102}\u{1164}\u{11C2}", - nfkc: "\u{B107}", - nfkd: "\u{1102}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{B108}", - nfc: "\u{B108}", - nfd: "\u{1102}\u{1165}", - nfkc: "\u{B108}", - nfkd: "\u{1102}\u{1165}", - }, - NormalizationTest { - source: "\u{B109}", - nfc: "\u{B109}", - nfd: "\u{1102}\u{1165}\u{11A8}", - nfkc: "\u{B109}", - nfkd: "\u{1102}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{B10A}", - nfc: "\u{B10A}", - nfd: "\u{1102}\u{1165}\u{11A9}", - nfkc: "\u{B10A}", - nfkd: "\u{1102}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{B10B}", - nfc: "\u{B10B}", - nfd: "\u{1102}\u{1165}\u{11AA}", - nfkc: "\u{B10B}", - nfkd: "\u{1102}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{B10C}", - nfc: "\u{B10C}", - nfd: "\u{1102}\u{1165}\u{11AB}", - nfkc: "\u{B10C}", - nfkd: "\u{1102}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{B10D}", - nfc: "\u{B10D}", - nfd: "\u{1102}\u{1165}\u{11AC}", - nfkc: "\u{B10D}", - nfkd: "\u{1102}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{B10E}", - nfc: "\u{B10E}", - nfd: "\u{1102}\u{1165}\u{11AD}", - nfkc: "\u{B10E}", - nfkd: "\u{1102}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{B10F}", - nfc: "\u{B10F}", - nfd: "\u{1102}\u{1165}\u{11AE}", - nfkc: "\u{B10F}", - nfkd: "\u{1102}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{B110}", - nfc: "\u{B110}", - nfd: "\u{1102}\u{1165}\u{11AF}", - nfkc: "\u{B110}", - nfkd: "\u{1102}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{B111}", - nfc: "\u{B111}", - nfd: "\u{1102}\u{1165}\u{11B0}", - nfkc: "\u{B111}", - nfkd: "\u{1102}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{B112}", - nfc: "\u{B112}", - nfd: "\u{1102}\u{1165}\u{11B1}", - nfkc: "\u{B112}", - nfkd: "\u{1102}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{B113}", - nfc: "\u{B113}", - nfd: "\u{1102}\u{1165}\u{11B2}", - nfkc: "\u{B113}", - nfkd: "\u{1102}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{B114}", - nfc: "\u{B114}", - nfd: "\u{1102}\u{1165}\u{11B3}", - nfkc: "\u{B114}", - nfkd: "\u{1102}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{B115}", - nfc: "\u{B115}", - nfd: "\u{1102}\u{1165}\u{11B4}", - nfkc: "\u{B115}", - nfkd: "\u{1102}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{B116}", - nfc: "\u{B116}", - nfd: "\u{1102}\u{1165}\u{11B5}", - nfkc: "\u{B116}", - nfkd: "\u{1102}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{B117}", - nfc: "\u{B117}", - nfd: "\u{1102}\u{1165}\u{11B6}", - nfkc: "\u{B117}", - nfkd: "\u{1102}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{B118}", - nfc: "\u{B118}", - nfd: "\u{1102}\u{1165}\u{11B7}", - nfkc: "\u{B118}", - nfkd: "\u{1102}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{B119}", - nfc: "\u{B119}", - nfd: "\u{1102}\u{1165}\u{11B8}", - nfkc: "\u{B119}", - nfkd: "\u{1102}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{B11A}", - nfc: "\u{B11A}", - nfd: "\u{1102}\u{1165}\u{11B9}", - nfkc: "\u{B11A}", - nfkd: "\u{1102}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{B11B}", - nfc: "\u{B11B}", - nfd: "\u{1102}\u{1165}\u{11BA}", - nfkc: "\u{B11B}", - nfkd: "\u{1102}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{B11C}", - nfc: "\u{B11C}", - nfd: "\u{1102}\u{1165}\u{11BB}", - nfkc: "\u{B11C}", - nfkd: "\u{1102}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{B11D}", - nfc: "\u{B11D}", - nfd: "\u{1102}\u{1165}\u{11BC}", - nfkc: "\u{B11D}", - nfkd: "\u{1102}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{B11E}", - nfc: "\u{B11E}", - nfd: "\u{1102}\u{1165}\u{11BD}", - nfkc: "\u{B11E}", - nfkd: "\u{1102}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{B11F}", - nfc: "\u{B11F}", - nfd: "\u{1102}\u{1165}\u{11BE}", - nfkc: "\u{B11F}", - nfkd: "\u{1102}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{B120}", - nfc: "\u{B120}", - nfd: "\u{1102}\u{1165}\u{11BF}", - nfkc: "\u{B120}", - nfkd: "\u{1102}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{B121}", - nfc: "\u{B121}", - nfd: "\u{1102}\u{1165}\u{11C0}", - nfkc: "\u{B121}", - nfkd: "\u{1102}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{B122}", - nfc: "\u{B122}", - nfd: "\u{1102}\u{1165}\u{11C1}", - nfkc: "\u{B122}", - nfkd: "\u{1102}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{B123}", - nfc: "\u{B123}", - nfd: "\u{1102}\u{1165}\u{11C2}", - nfkc: "\u{B123}", - nfkd: "\u{1102}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{B124}", - nfc: "\u{B124}", - nfd: "\u{1102}\u{1166}", - nfkc: "\u{B124}", - nfkd: "\u{1102}\u{1166}", - }, - NormalizationTest { - source: "\u{B125}", - nfc: "\u{B125}", - nfd: "\u{1102}\u{1166}\u{11A8}", - nfkc: "\u{B125}", - nfkd: "\u{1102}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{B126}", - nfc: "\u{B126}", - nfd: "\u{1102}\u{1166}\u{11A9}", - nfkc: "\u{B126}", - nfkd: "\u{1102}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{B127}", - nfc: "\u{B127}", - nfd: "\u{1102}\u{1166}\u{11AA}", - nfkc: "\u{B127}", - nfkd: "\u{1102}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{B128}", - nfc: "\u{B128}", - nfd: "\u{1102}\u{1166}\u{11AB}", - nfkc: "\u{B128}", - nfkd: "\u{1102}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{B129}", - nfc: "\u{B129}", - nfd: "\u{1102}\u{1166}\u{11AC}", - nfkc: "\u{B129}", - nfkd: "\u{1102}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{B12A}", - nfc: "\u{B12A}", - nfd: "\u{1102}\u{1166}\u{11AD}", - nfkc: "\u{B12A}", - nfkd: "\u{1102}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{B12B}", - nfc: "\u{B12B}", - nfd: "\u{1102}\u{1166}\u{11AE}", - nfkc: "\u{B12B}", - nfkd: "\u{1102}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{B12C}", - nfc: "\u{B12C}", - nfd: "\u{1102}\u{1166}\u{11AF}", - nfkc: "\u{B12C}", - nfkd: "\u{1102}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{B12D}", - nfc: "\u{B12D}", - nfd: "\u{1102}\u{1166}\u{11B0}", - nfkc: "\u{B12D}", - nfkd: "\u{1102}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{B12E}", - nfc: "\u{B12E}", - nfd: "\u{1102}\u{1166}\u{11B1}", - nfkc: "\u{B12E}", - nfkd: "\u{1102}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{B12F}", - nfc: "\u{B12F}", - nfd: "\u{1102}\u{1166}\u{11B2}", - nfkc: "\u{B12F}", - nfkd: "\u{1102}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{B130}", - nfc: "\u{B130}", - nfd: "\u{1102}\u{1166}\u{11B3}", - nfkc: "\u{B130}", - nfkd: "\u{1102}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{B131}", - nfc: "\u{B131}", - nfd: "\u{1102}\u{1166}\u{11B4}", - nfkc: "\u{B131}", - nfkd: "\u{1102}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{B132}", - nfc: "\u{B132}", - nfd: "\u{1102}\u{1166}\u{11B5}", - nfkc: "\u{B132}", - nfkd: "\u{1102}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{B133}", - nfc: "\u{B133}", - nfd: "\u{1102}\u{1166}\u{11B6}", - nfkc: "\u{B133}", - nfkd: "\u{1102}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{B134}", - nfc: "\u{B134}", - nfd: "\u{1102}\u{1166}\u{11B7}", - nfkc: "\u{B134}", - nfkd: "\u{1102}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{B135}", - nfc: "\u{B135}", - nfd: "\u{1102}\u{1166}\u{11B8}", - nfkc: "\u{B135}", - nfkd: "\u{1102}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{B136}", - nfc: "\u{B136}", - nfd: "\u{1102}\u{1166}\u{11B9}", - nfkc: "\u{B136}", - nfkd: "\u{1102}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{B137}", - nfc: "\u{B137}", - nfd: "\u{1102}\u{1166}\u{11BA}", - nfkc: "\u{B137}", - nfkd: "\u{1102}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{B138}", - nfc: "\u{B138}", - nfd: "\u{1102}\u{1166}\u{11BB}", - nfkc: "\u{B138}", - nfkd: "\u{1102}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{B139}", - nfc: "\u{B139}", - nfd: "\u{1102}\u{1166}\u{11BC}", - nfkc: "\u{B139}", - nfkd: "\u{1102}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{B13A}", - nfc: "\u{B13A}", - nfd: "\u{1102}\u{1166}\u{11BD}", - nfkc: "\u{B13A}", - nfkd: "\u{1102}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{B13B}", - nfc: "\u{B13B}", - nfd: "\u{1102}\u{1166}\u{11BE}", - nfkc: "\u{B13B}", - nfkd: "\u{1102}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{B13C}", - nfc: "\u{B13C}", - nfd: "\u{1102}\u{1166}\u{11BF}", - nfkc: "\u{B13C}", - nfkd: "\u{1102}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{B13D}", - nfc: "\u{B13D}", - nfd: "\u{1102}\u{1166}\u{11C0}", - nfkc: "\u{B13D}", - nfkd: "\u{1102}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{B13E}", - nfc: "\u{B13E}", - nfd: "\u{1102}\u{1166}\u{11C1}", - nfkc: "\u{B13E}", - nfkd: "\u{1102}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{B13F}", - nfc: "\u{B13F}", - nfd: "\u{1102}\u{1166}\u{11C2}", - nfkc: "\u{B13F}", - nfkd: "\u{1102}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{B140}", - nfc: "\u{B140}", - nfd: "\u{1102}\u{1167}", - nfkc: "\u{B140}", - nfkd: "\u{1102}\u{1167}", - }, - NormalizationTest { - source: "\u{B141}", - nfc: "\u{B141}", - nfd: "\u{1102}\u{1167}\u{11A8}", - nfkc: "\u{B141}", - nfkd: "\u{1102}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{B142}", - nfc: "\u{B142}", - nfd: "\u{1102}\u{1167}\u{11A9}", - nfkc: "\u{B142}", - nfkd: "\u{1102}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{B143}", - nfc: "\u{B143}", - nfd: "\u{1102}\u{1167}\u{11AA}", - nfkc: "\u{B143}", - nfkd: "\u{1102}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{B144}", - nfc: "\u{B144}", - nfd: "\u{1102}\u{1167}\u{11AB}", - nfkc: "\u{B144}", - nfkd: "\u{1102}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{B145}", - nfc: "\u{B145}", - nfd: "\u{1102}\u{1167}\u{11AC}", - nfkc: "\u{B145}", - nfkd: "\u{1102}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{B146}", - nfc: "\u{B146}", - nfd: "\u{1102}\u{1167}\u{11AD}", - nfkc: "\u{B146}", - nfkd: "\u{1102}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{B147}", - nfc: "\u{B147}", - nfd: "\u{1102}\u{1167}\u{11AE}", - nfkc: "\u{B147}", - nfkd: "\u{1102}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{B148}", - nfc: "\u{B148}", - nfd: "\u{1102}\u{1167}\u{11AF}", - nfkc: "\u{B148}", - nfkd: "\u{1102}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{B149}", - nfc: "\u{B149}", - nfd: "\u{1102}\u{1167}\u{11B0}", - nfkc: "\u{B149}", - nfkd: "\u{1102}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{B14A}", - nfc: "\u{B14A}", - nfd: "\u{1102}\u{1167}\u{11B1}", - nfkc: "\u{B14A}", - nfkd: "\u{1102}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{B14B}", - nfc: "\u{B14B}", - nfd: "\u{1102}\u{1167}\u{11B2}", - nfkc: "\u{B14B}", - nfkd: "\u{1102}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{B14C}", - nfc: "\u{B14C}", - nfd: "\u{1102}\u{1167}\u{11B3}", - nfkc: "\u{B14C}", - nfkd: "\u{1102}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{B14D}", - nfc: "\u{B14D}", - nfd: "\u{1102}\u{1167}\u{11B4}", - nfkc: "\u{B14D}", - nfkd: "\u{1102}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{B14E}", - nfc: "\u{B14E}", - nfd: "\u{1102}\u{1167}\u{11B5}", - nfkc: "\u{B14E}", - nfkd: "\u{1102}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{B14F}", - nfc: "\u{B14F}", - nfd: "\u{1102}\u{1167}\u{11B6}", - nfkc: "\u{B14F}", - nfkd: "\u{1102}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{B150}", - nfc: "\u{B150}", - nfd: "\u{1102}\u{1167}\u{11B7}", - nfkc: "\u{B150}", - nfkd: "\u{1102}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{B151}", - nfc: "\u{B151}", - nfd: "\u{1102}\u{1167}\u{11B8}", - nfkc: "\u{B151}", - nfkd: "\u{1102}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{B152}", - nfc: "\u{B152}", - nfd: "\u{1102}\u{1167}\u{11B9}", - nfkc: "\u{B152}", - nfkd: "\u{1102}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{B153}", - nfc: "\u{B153}", - nfd: "\u{1102}\u{1167}\u{11BA}", - nfkc: "\u{B153}", - nfkd: "\u{1102}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{B154}", - nfc: "\u{B154}", - nfd: "\u{1102}\u{1167}\u{11BB}", - nfkc: "\u{B154}", - nfkd: "\u{1102}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{B155}", - nfc: "\u{B155}", - nfd: "\u{1102}\u{1167}\u{11BC}", - nfkc: "\u{B155}", - nfkd: "\u{1102}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{B156}", - nfc: "\u{B156}", - nfd: "\u{1102}\u{1167}\u{11BD}", - nfkc: "\u{B156}", - nfkd: "\u{1102}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{B157}", - nfc: "\u{B157}", - nfd: "\u{1102}\u{1167}\u{11BE}", - nfkc: "\u{B157}", - nfkd: "\u{1102}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{B158}", - nfc: "\u{B158}", - nfd: "\u{1102}\u{1167}\u{11BF}", - nfkc: "\u{B158}", - nfkd: "\u{1102}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{B159}", - nfc: "\u{B159}", - nfd: "\u{1102}\u{1167}\u{11C0}", - nfkc: "\u{B159}", - nfkd: "\u{1102}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{B15A}", - nfc: "\u{B15A}", - nfd: "\u{1102}\u{1167}\u{11C1}", - nfkc: "\u{B15A}", - nfkd: "\u{1102}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{B15B}", - nfc: "\u{B15B}", - nfd: "\u{1102}\u{1167}\u{11C2}", - nfkc: "\u{B15B}", - nfkd: "\u{1102}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{B15C}", - nfc: "\u{B15C}", - nfd: "\u{1102}\u{1168}", - nfkc: "\u{B15C}", - nfkd: "\u{1102}\u{1168}", - }, - NormalizationTest { - source: "\u{B15D}", - nfc: "\u{B15D}", - nfd: "\u{1102}\u{1168}\u{11A8}", - nfkc: "\u{B15D}", - nfkd: "\u{1102}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{B15E}", - nfc: "\u{B15E}", - nfd: "\u{1102}\u{1168}\u{11A9}", - nfkc: "\u{B15E}", - nfkd: "\u{1102}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{B15F}", - nfc: "\u{B15F}", - nfd: "\u{1102}\u{1168}\u{11AA}", - nfkc: "\u{B15F}", - nfkd: "\u{1102}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{B160}", - nfc: "\u{B160}", - nfd: "\u{1102}\u{1168}\u{11AB}", - nfkc: "\u{B160}", - nfkd: "\u{1102}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{B161}", - nfc: "\u{B161}", - nfd: "\u{1102}\u{1168}\u{11AC}", - nfkc: "\u{B161}", - nfkd: "\u{1102}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{B162}", - nfc: "\u{B162}", - nfd: "\u{1102}\u{1168}\u{11AD}", - nfkc: "\u{B162}", - nfkd: "\u{1102}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{B163}", - nfc: "\u{B163}", - nfd: "\u{1102}\u{1168}\u{11AE}", - nfkc: "\u{B163}", - nfkd: "\u{1102}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{B164}", - nfc: "\u{B164}", - nfd: "\u{1102}\u{1168}\u{11AF}", - nfkc: "\u{B164}", - nfkd: "\u{1102}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{B165}", - nfc: "\u{B165}", - nfd: "\u{1102}\u{1168}\u{11B0}", - nfkc: "\u{B165}", - nfkd: "\u{1102}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{B166}", - nfc: "\u{B166}", - nfd: "\u{1102}\u{1168}\u{11B1}", - nfkc: "\u{B166}", - nfkd: "\u{1102}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{B167}", - nfc: "\u{B167}", - nfd: "\u{1102}\u{1168}\u{11B2}", - nfkc: "\u{B167}", - nfkd: "\u{1102}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{B168}", - nfc: "\u{B168}", - nfd: "\u{1102}\u{1168}\u{11B3}", - nfkc: "\u{B168}", - nfkd: "\u{1102}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{B169}", - nfc: "\u{B169}", - nfd: "\u{1102}\u{1168}\u{11B4}", - nfkc: "\u{B169}", - nfkd: "\u{1102}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{B16A}", - nfc: "\u{B16A}", - nfd: "\u{1102}\u{1168}\u{11B5}", - nfkc: "\u{B16A}", - nfkd: "\u{1102}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{B16B}", - nfc: "\u{B16B}", - nfd: "\u{1102}\u{1168}\u{11B6}", - nfkc: "\u{B16B}", - nfkd: "\u{1102}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{B16C}", - nfc: "\u{B16C}", - nfd: "\u{1102}\u{1168}\u{11B7}", - nfkc: "\u{B16C}", - nfkd: "\u{1102}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{B16D}", - nfc: "\u{B16D}", - nfd: "\u{1102}\u{1168}\u{11B8}", - nfkc: "\u{B16D}", - nfkd: "\u{1102}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{B16E}", - nfc: "\u{B16E}", - nfd: "\u{1102}\u{1168}\u{11B9}", - nfkc: "\u{B16E}", - nfkd: "\u{1102}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{B16F}", - nfc: "\u{B16F}", - nfd: "\u{1102}\u{1168}\u{11BA}", - nfkc: "\u{B16F}", - nfkd: "\u{1102}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{B170}", - nfc: "\u{B170}", - nfd: "\u{1102}\u{1168}\u{11BB}", - nfkc: "\u{B170}", - nfkd: "\u{1102}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{B171}", - nfc: "\u{B171}", - nfd: "\u{1102}\u{1168}\u{11BC}", - nfkc: "\u{B171}", - nfkd: "\u{1102}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{B172}", - nfc: "\u{B172}", - nfd: "\u{1102}\u{1168}\u{11BD}", - nfkc: "\u{B172}", - nfkd: "\u{1102}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{B173}", - nfc: "\u{B173}", - nfd: "\u{1102}\u{1168}\u{11BE}", - nfkc: "\u{B173}", - nfkd: "\u{1102}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{B174}", - nfc: "\u{B174}", - nfd: "\u{1102}\u{1168}\u{11BF}", - nfkc: "\u{B174}", - nfkd: "\u{1102}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{B175}", - nfc: "\u{B175}", - nfd: "\u{1102}\u{1168}\u{11C0}", - nfkc: "\u{B175}", - nfkd: "\u{1102}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{B176}", - nfc: "\u{B176}", - nfd: "\u{1102}\u{1168}\u{11C1}", - nfkc: "\u{B176}", - nfkd: "\u{1102}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{B177}", - nfc: "\u{B177}", - nfd: "\u{1102}\u{1168}\u{11C2}", - nfkc: "\u{B177}", - nfkd: "\u{1102}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{B178}", - nfc: "\u{B178}", - nfd: "\u{1102}\u{1169}", - nfkc: "\u{B178}", - nfkd: "\u{1102}\u{1169}", - }, - NormalizationTest { - source: "\u{B179}", - nfc: "\u{B179}", - nfd: "\u{1102}\u{1169}\u{11A8}", - nfkc: "\u{B179}", - nfkd: "\u{1102}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{B17A}", - nfc: "\u{B17A}", - nfd: "\u{1102}\u{1169}\u{11A9}", - nfkc: "\u{B17A}", - nfkd: "\u{1102}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{B17B}", - nfc: "\u{B17B}", - nfd: "\u{1102}\u{1169}\u{11AA}", - nfkc: "\u{B17B}", - nfkd: "\u{1102}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{B17C}", - nfc: "\u{B17C}", - nfd: "\u{1102}\u{1169}\u{11AB}", - nfkc: "\u{B17C}", - nfkd: "\u{1102}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{B17D}", - nfc: "\u{B17D}", - nfd: "\u{1102}\u{1169}\u{11AC}", - nfkc: "\u{B17D}", - nfkd: "\u{1102}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{B17E}", - nfc: "\u{B17E}", - nfd: "\u{1102}\u{1169}\u{11AD}", - nfkc: "\u{B17E}", - nfkd: "\u{1102}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{B17F}", - nfc: "\u{B17F}", - nfd: "\u{1102}\u{1169}\u{11AE}", - nfkc: "\u{B17F}", - nfkd: "\u{1102}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{B180}", - nfc: "\u{B180}", - nfd: "\u{1102}\u{1169}\u{11AF}", - nfkc: "\u{B180}", - nfkd: "\u{1102}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{B181}", - nfc: "\u{B181}", - nfd: "\u{1102}\u{1169}\u{11B0}", - nfkc: "\u{B181}", - nfkd: "\u{1102}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{B182}", - nfc: "\u{B182}", - nfd: "\u{1102}\u{1169}\u{11B1}", - nfkc: "\u{B182}", - nfkd: "\u{1102}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{B183}", - nfc: "\u{B183}", - nfd: "\u{1102}\u{1169}\u{11B2}", - nfkc: "\u{B183}", - nfkd: "\u{1102}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{B184}", - nfc: "\u{B184}", - nfd: "\u{1102}\u{1169}\u{11B3}", - nfkc: "\u{B184}", - nfkd: "\u{1102}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{B185}", - nfc: "\u{B185}", - nfd: "\u{1102}\u{1169}\u{11B4}", - nfkc: "\u{B185}", - nfkd: "\u{1102}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{B186}", - nfc: "\u{B186}", - nfd: "\u{1102}\u{1169}\u{11B5}", - nfkc: "\u{B186}", - nfkd: "\u{1102}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{B187}", - nfc: "\u{B187}", - nfd: "\u{1102}\u{1169}\u{11B6}", - nfkc: "\u{B187}", - nfkd: "\u{1102}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{B188}", - nfc: "\u{B188}", - nfd: "\u{1102}\u{1169}\u{11B7}", - nfkc: "\u{B188}", - nfkd: "\u{1102}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{B189}", - nfc: "\u{B189}", - nfd: "\u{1102}\u{1169}\u{11B8}", - nfkc: "\u{B189}", - nfkd: "\u{1102}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{B18A}", - nfc: "\u{B18A}", - nfd: "\u{1102}\u{1169}\u{11B9}", - nfkc: "\u{B18A}", - nfkd: "\u{1102}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{B18B}", - nfc: "\u{B18B}", - nfd: "\u{1102}\u{1169}\u{11BA}", - nfkc: "\u{B18B}", - nfkd: "\u{1102}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{B18C}", - nfc: "\u{B18C}", - nfd: "\u{1102}\u{1169}\u{11BB}", - nfkc: "\u{B18C}", - nfkd: "\u{1102}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{B18D}", - nfc: "\u{B18D}", - nfd: "\u{1102}\u{1169}\u{11BC}", - nfkc: "\u{B18D}", - nfkd: "\u{1102}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{B18E}", - nfc: "\u{B18E}", - nfd: "\u{1102}\u{1169}\u{11BD}", - nfkc: "\u{B18E}", - nfkd: "\u{1102}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{B18F}", - nfc: "\u{B18F}", - nfd: "\u{1102}\u{1169}\u{11BE}", - nfkc: "\u{B18F}", - nfkd: "\u{1102}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{B190}", - nfc: "\u{B190}", - nfd: "\u{1102}\u{1169}\u{11BF}", - nfkc: "\u{B190}", - nfkd: "\u{1102}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{B191}", - nfc: "\u{B191}", - nfd: "\u{1102}\u{1169}\u{11C0}", - nfkc: "\u{B191}", - nfkd: "\u{1102}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{B192}", - nfc: "\u{B192}", - nfd: "\u{1102}\u{1169}\u{11C1}", - nfkc: "\u{B192}", - nfkd: "\u{1102}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{B193}", - nfc: "\u{B193}", - nfd: "\u{1102}\u{1169}\u{11C2}", - nfkc: "\u{B193}", - nfkd: "\u{1102}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{B194}", - nfc: "\u{B194}", - nfd: "\u{1102}\u{116A}", - nfkc: "\u{B194}", - nfkd: "\u{1102}\u{116A}", - }, - NormalizationTest { - source: "\u{B195}", - nfc: "\u{B195}", - nfd: "\u{1102}\u{116A}\u{11A8}", - nfkc: "\u{B195}", - nfkd: "\u{1102}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{B196}", - nfc: "\u{B196}", - nfd: "\u{1102}\u{116A}\u{11A9}", - nfkc: "\u{B196}", - nfkd: "\u{1102}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{B197}", - nfc: "\u{B197}", - nfd: "\u{1102}\u{116A}\u{11AA}", - nfkc: "\u{B197}", - nfkd: "\u{1102}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{B198}", - nfc: "\u{B198}", - nfd: "\u{1102}\u{116A}\u{11AB}", - nfkc: "\u{B198}", - nfkd: "\u{1102}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{B199}", - nfc: "\u{B199}", - nfd: "\u{1102}\u{116A}\u{11AC}", - nfkc: "\u{B199}", - nfkd: "\u{1102}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{B19A}", - nfc: "\u{B19A}", - nfd: "\u{1102}\u{116A}\u{11AD}", - nfkc: "\u{B19A}", - nfkd: "\u{1102}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{B19B}", - nfc: "\u{B19B}", - nfd: "\u{1102}\u{116A}\u{11AE}", - nfkc: "\u{B19B}", - nfkd: "\u{1102}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{B19C}", - nfc: "\u{B19C}", - nfd: "\u{1102}\u{116A}\u{11AF}", - nfkc: "\u{B19C}", - nfkd: "\u{1102}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{B19D}", - nfc: "\u{B19D}", - nfd: "\u{1102}\u{116A}\u{11B0}", - nfkc: "\u{B19D}", - nfkd: "\u{1102}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{B19E}", - nfc: "\u{B19E}", - nfd: "\u{1102}\u{116A}\u{11B1}", - nfkc: "\u{B19E}", - nfkd: "\u{1102}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{B19F}", - nfc: "\u{B19F}", - nfd: "\u{1102}\u{116A}\u{11B2}", - nfkc: "\u{B19F}", - nfkd: "\u{1102}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{B1A0}", - nfc: "\u{B1A0}", - nfd: "\u{1102}\u{116A}\u{11B3}", - nfkc: "\u{B1A0}", - nfkd: "\u{1102}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{B1A1}", - nfc: "\u{B1A1}", - nfd: "\u{1102}\u{116A}\u{11B4}", - nfkc: "\u{B1A1}", - nfkd: "\u{1102}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{B1A2}", - nfc: "\u{B1A2}", - nfd: "\u{1102}\u{116A}\u{11B5}", - nfkc: "\u{B1A2}", - nfkd: "\u{1102}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{B1A3}", - nfc: "\u{B1A3}", - nfd: "\u{1102}\u{116A}\u{11B6}", - nfkc: "\u{B1A3}", - nfkd: "\u{1102}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{B1A4}", - nfc: "\u{B1A4}", - nfd: "\u{1102}\u{116A}\u{11B7}", - nfkc: "\u{B1A4}", - nfkd: "\u{1102}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{B1A5}", - nfc: "\u{B1A5}", - nfd: "\u{1102}\u{116A}\u{11B8}", - nfkc: "\u{B1A5}", - nfkd: "\u{1102}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{B1A6}", - nfc: "\u{B1A6}", - nfd: "\u{1102}\u{116A}\u{11B9}", - nfkc: "\u{B1A6}", - nfkd: "\u{1102}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{B1A7}", - nfc: "\u{B1A7}", - nfd: "\u{1102}\u{116A}\u{11BA}", - nfkc: "\u{B1A7}", - nfkd: "\u{1102}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{B1A8}", - nfc: "\u{B1A8}", - nfd: "\u{1102}\u{116A}\u{11BB}", - nfkc: "\u{B1A8}", - nfkd: "\u{1102}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{B1A9}", - nfc: "\u{B1A9}", - nfd: "\u{1102}\u{116A}\u{11BC}", - nfkc: "\u{B1A9}", - nfkd: "\u{1102}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{B1AA}", - nfc: "\u{B1AA}", - nfd: "\u{1102}\u{116A}\u{11BD}", - nfkc: "\u{B1AA}", - nfkd: "\u{1102}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{B1AB}", - nfc: "\u{B1AB}", - nfd: "\u{1102}\u{116A}\u{11BE}", - nfkc: "\u{B1AB}", - nfkd: "\u{1102}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{B1AC}", - nfc: "\u{B1AC}", - nfd: "\u{1102}\u{116A}\u{11BF}", - nfkc: "\u{B1AC}", - nfkd: "\u{1102}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{B1AD}", - nfc: "\u{B1AD}", - nfd: "\u{1102}\u{116A}\u{11C0}", - nfkc: "\u{B1AD}", - nfkd: "\u{1102}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{B1AE}", - nfc: "\u{B1AE}", - nfd: "\u{1102}\u{116A}\u{11C1}", - nfkc: "\u{B1AE}", - nfkd: "\u{1102}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{B1AF}", - nfc: "\u{B1AF}", - nfd: "\u{1102}\u{116A}\u{11C2}", - nfkc: "\u{B1AF}", - nfkd: "\u{1102}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{B1B0}", - nfc: "\u{B1B0}", - nfd: "\u{1102}\u{116B}", - nfkc: "\u{B1B0}", - nfkd: "\u{1102}\u{116B}", - }, - NormalizationTest { - source: "\u{B1B1}", - nfc: "\u{B1B1}", - nfd: "\u{1102}\u{116B}\u{11A8}", - nfkc: "\u{B1B1}", - nfkd: "\u{1102}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{B1B2}", - nfc: "\u{B1B2}", - nfd: "\u{1102}\u{116B}\u{11A9}", - nfkc: "\u{B1B2}", - nfkd: "\u{1102}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{B1B3}", - nfc: "\u{B1B3}", - nfd: "\u{1102}\u{116B}\u{11AA}", - nfkc: "\u{B1B3}", - nfkd: "\u{1102}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{B1B4}", - nfc: "\u{B1B4}", - nfd: "\u{1102}\u{116B}\u{11AB}", - nfkc: "\u{B1B4}", - nfkd: "\u{1102}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{B1B5}", - nfc: "\u{B1B5}", - nfd: "\u{1102}\u{116B}\u{11AC}", - nfkc: "\u{B1B5}", - nfkd: "\u{1102}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{B1B6}", - nfc: "\u{B1B6}", - nfd: "\u{1102}\u{116B}\u{11AD}", - nfkc: "\u{B1B6}", - nfkd: "\u{1102}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{B1B7}", - nfc: "\u{B1B7}", - nfd: "\u{1102}\u{116B}\u{11AE}", - nfkc: "\u{B1B7}", - nfkd: "\u{1102}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{B1B8}", - nfc: "\u{B1B8}", - nfd: "\u{1102}\u{116B}\u{11AF}", - nfkc: "\u{B1B8}", - nfkd: "\u{1102}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{B1B9}", - nfc: "\u{B1B9}", - nfd: "\u{1102}\u{116B}\u{11B0}", - nfkc: "\u{B1B9}", - nfkd: "\u{1102}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{B1BA}", - nfc: "\u{B1BA}", - nfd: "\u{1102}\u{116B}\u{11B1}", - nfkc: "\u{B1BA}", - nfkd: "\u{1102}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{B1BB}", - nfc: "\u{B1BB}", - nfd: "\u{1102}\u{116B}\u{11B2}", - nfkc: "\u{B1BB}", - nfkd: "\u{1102}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{B1BC}", - nfc: "\u{B1BC}", - nfd: "\u{1102}\u{116B}\u{11B3}", - nfkc: "\u{B1BC}", - nfkd: "\u{1102}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{B1BD}", - nfc: "\u{B1BD}", - nfd: "\u{1102}\u{116B}\u{11B4}", - nfkc: "\u{B1BD}", - nfkd: "\u{1102}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{B1BE}", - nfc: "\u{B1BE}", - nfd: "\u{1102}\u{116B}\u{11B5}", - nfkc: "\u{B1BE}", - nfkd: "\u{1102}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{B1BF}", - nfc: "\u{B1BF}", - nfd: "\u{1102}\u{116B}\u{11B6}", - nfkc: "\u{B1BF}", - nfkd: "\u{1102}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{B1C0}", - nfc: "\u{B1C0}", - nfd: "\u{1102}\u{116B}\u{11B7}", - nfkc: "\u{B1C0}", - nfkd: "\u{1102}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{B1C1}", - nfc: "\u{B1C1}", - nfd: "\u{1102}\u{116B}\u{11B8}", - nfkc: "\u{B1C1}", - nfkd: "\u{1102}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{B1C2}", - nfc: "\u{B1C2}", - nfd: "\u{1102}\u{116B}\u{11B9}", - nfkc: "\u{B1C2}", - nfkd: "\u{1102}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{B1C3}", - nfc: "\u{B1C3}", - nfd: "\u{1102}\u{116B}\u{11BA}", - nfkc: "\u{B1C3}", - nfkd: "\u{1102}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{B1C4}", - nfc: "\u{B1C4}", - nfd: "\u{1102}\u{116B}\u{11BB}", - nfkc: "\u{B1C4}", - nfkd: "\u{1102}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{B1C5}", - nfc: "\u{B1C5}", - nfd: "\u{1102}\u{116B}\u{11BC}", - nfkc: "\u{B1C5}", - nfkd: "\u{1102}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{B1C6}", - nfc: "\u{B1C6}", - nfd: "\u{1102}\u{116B}\u{11BD}", - nfkc: "\u{B1C6}", - nfkd: "\u{1102}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{B1C7}", - nfc: "\u{B1C7}", - nfd: "\u{1102}\u{116B}\u{11BE}", - nfkc: "\u{B1C7}", - nfkd: "\u{1102}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{B1C8}", - nfc: "\u{B1C8}", - nfd: "\u{1102}\u{116B}\u{11BF}", - nfkc: "\u{B1C8}", - nfkd: "\u{1102}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{B1C9}", - nfc: "\u{B1C9}", - nfd: "\u{1102}\u{116B}\u{11C0}", - nfkc: "\u{B1C9}", - nfkd: "\u{1102}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{B1CA}", - nfc: "\u{B1CA}", - nfd: "\u{1102}\u{116B}\u{11C1}", - nfkc: "\u{B1CA}", - nfkd: "\u{1102}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{B1CB}", - nfc: "\u{B1CB}", - nfd: "\u{1102}\u{116B}\u{11C2}", - nfkc: "\u{B1CB}", - nfkd: "\u{1102}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{B1CC}", - nfc: "\u{B1CC}", - nfd: "\u{1102}\u{116C}", - nfkc: "\u{B1CC}", - nfkd: "\u{1102}\u{116C}", - }, - NormalizationTest { - source: "\u{B1CD}", - nfc: "\u{B1CD}", - nfd: "\u{1102}\u{116C}\u{11A8}", - nfkc: "\u{B1CD}", - nfkd: "\u{1102}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{B1CE}", - nfc: "\u{B1CE}", - nfd: "\u{1102}\u{116C}\u{11A9}", - nfkc: "\u{B1CE}", - nfkd: "\u{1102}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{B1CF}", - nfc: "\u{B1CF}", - nfd: "\u{1102}\u{116C}\u{11AA}", - nfkc: "\u{B1CF}", - nfkd: "\u{1102}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{B1D0}", - nfc: "\u{B1D0}", - nfd: "\u{1102}\u{116C}\u{11AB}", - nfkc: "\u{B1D0}", - nfkd: "\u{1102}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{B1D1}", - nfc: "\u{B1D1}", - nfd: "\u{1102}\u{116C}\u{11AC}", - nfkc: "\u{B1D1}", - nfkd: "\u{1102}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{B1D2}", - nfc: "\u{B1D2}", - nfd: "\u{1102}\u{116C}\u{11AD}", - nfkc: "\u{B1D2}", - nfkd: "\u{1102}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{B1D3}", - nfc: "\u{B1D3}", - nfd: "\u{1102}\u{116C}\u{11AE}", - nfkc: "\u{B1D3}", - nfkd: "\u{1102}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{B1D4}", - nfc: "\u{B1D4}", - nfd: "\u{1102}\u{116C}\u{11AF}", - nfkc: "\u{B1D4}", - nfkd: "\u{1102}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{B1D5}", - nfc: "\u{B1D5}", - nfd: "\u{1102}\u{116C}\u{11B0}", - nfkc: "\u{B1D5}", - nfkd: "\u{1102}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{B1D6}", - nfc: "\u{B1D6}", - nfd: "\u{1102}\u{116C}\u{11B1}", - nfkc: "\u{B1D6}", - nfkd: "\u{1102}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{B1D7}", - nfc: "\u{B1D7}", - nfd: "\u{1102}\u{116C}\u{11B2}", - nfkc: "\u{B1D7}", - nfkd: "\u{1102}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{B1D8}", - nfc: "\u{B1D8}", - nfd: "\u{1102}\u{116C}\u{11B3}", - nfkc: "\u{B1D8}", - nfkd: "\u{1102}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{B1D9}", - nfc: "\u{B1D9}", - nfd: "\u{1102}\u{116C}\u{11B4}", - nfkc: "\u{B1D9}", - nfkd: "\u{1102}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{B1DA}", - nfc: "\u{B1DA}", - nfd: "\u{1102}\u{116C}\u{11B5}", - nfkc: "\u{B1DA}", - nfkd: "\u{1102}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{B1DB}", - nfc: "\u{B1DB}", - nfd: "\u{1102}\u{116C}\u{11B6}", - nfkc: "\u{B1DB}", - nfkd: "\u{1102}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{B1DC}", - nfc: "\u{B1DC}", - nfd: "\u{1102}\u{116C}\u{11B7}", - nfkc: "\u{B1DC}", - nfkd: "\u{1102}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{B1DD}", - nfc: "\u{B1DD}", - nfd: "\u{1102}\u{116C}\u{11B8}", - nfkc: "\u{B1DD}", - nfkd: "\u{1102}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{B1DE}", - nfc: "\u{B1DE}", - nfd: "\u{1102}\u{116C}\u{11B9}", - nfkc: "\u{B1DE}", - nfkd: "\u{1102}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{B1DF}", - nfc: "\u{B1DF}", - nfd: "\u{1102}\u{116C}\u{11BA}", - nfkc: "\u{B1DF}", - nfkd: "\u{1102}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{B1E0}", - nfc: "\u{B1E0}", - nfd: "\u{1102}\u{116C}\u{11BB}", - nfkc: "\u{B1E0}", - nfkd: "\u{1102}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{B1E1}", - nfc: "\u{B1E1}", - nfd: "\u{1102}\u{116C}\u{11BC}", - nfkc: "\u{B1E1}", - nfkd: "\u{1102}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{B1E2}", - nfc: "\u{B1E2}", - nfd: "\u{1102}\u{116C}\u{11BD}", - nfkc: "\u{B1E2}", - nfkd: "\u{1102}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{B1E3}", - nfc: "\u{B1E3}", - nfd: "\u{1102}\u{116C}\u{11BE}", - nfkc: "\u{B1E3}", - nfkd: "\u{1102}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{B1E4}", - nfc: "\u{B1E4}", - nfd: "\u{1102}\u{116C}\u{11BF}", - nfkc: "\u{B1E4}", - nfkd: "\u{1102}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{B1E5}", - nfc: "\u{B1E5}", - nfd: "\u{1102}\u{116C}\u{11C0}", - nfkc: "\u{B1E5}", - nfkd: "\u{1102}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{B1E6}", - nfc: "\u{B1E6}", - nfd: "\u{1102}\u{116C}\u{11C1}", - nfkc: "\u{B1E6}", - nfkd: "\u{1102}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{B1E7}", - nfc: "\u{B1E7}", - nfd: "\u{1102}\u{116C}\u{11C2}", - nfkc: "\u{B1E7}", - nfkd: "\u{1102}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{B1E8}", - nfc: "\u{B1E8}", - nfd: "\u{1102}\u{116D}", - nfkc: "\u{B1E8}", - nfkd: "\u{1102}\u{116D}", - }, - NormalizationTest { - source: "\u{B1E9}", - nfc: "\u{B1E9}", - nfd: "\u{1102}\u{116D}\u{11A8}", - nfkc: "\u{B1E9}", - nfkd: "\u{1102}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{B1EA}", - nfc: "\u{B1EA}", - nfd: "\u{1102}\u{116D}\u{11A9}", - nfkc: "\u{B1EA}", - nfkd: "\u{1102}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{B1EB}", - nfc: "\u{B1EB}", - nfd: "\u{1102}\u{116D}\u{11AA}", - nfkc: "\u{B1EB}", - nfkd: "\u{1102}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{B1EC}", - nfc: "\u{B1EC}", - nfd: "\u{1102}\u{116D}\u{11AB}", - nfkc: "\u{B1EC}", - nfkd: "\u{1102}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{B1ED}", - nfc: "\u{B1ED}", - nfd: "\u{1102}\u{116D}\u{11AC}", - nfkc: "\u{B1ED}", - nfkd: "\u{1102}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{B1EE}", - nfc: "\u{B1EE}", - nfd: "\u{1102}\u{116D}\u{11AD}", - nfkc: "\u{B1EE}", - nfkd: "\u{1102}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{B1EF}", - nfc: "\u{B1EF}", - nfd: "\u{1102}\u{116D}\u{11AE}", - nfkc: "\u{B1EF}", - nfkd: "\u{1102}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{B1F0}", - nfc: "\u{B1F0}", - nfd: "\u{1102}\u{116D}\u{11AF}", - nfkc: "\u{B1F0}", - nfkd: "\u{1102}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{B1F1}", - nfc: "\u{B1F1}", - nfd: "\u{1102}\u{116D}\u{11B0}", - nfkc: "\u{B1F1}", - nfkd: "\u{1102}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{B1F2}", - nfc: "\u{B1F2}", - nfd: "\u{1102}\u{116D}\u{11B1}", - nfkc: "\u{B1F2}", - nfkd: "\u{1102}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{B1F3}", - nfc: "\u{B1F3}", - nfd: "\u{1102}\u{116D}\u{11B2}", - nfkc: "\u{B1F3}", - nfkd: "\u{1102}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{B1F4}", - nfc: "\u{B1F4}", - nfd: "\u{1102}\u{116D}\u{11B3}", - nfkc: "\u{B1F4}", - nfkd: "\u{1102}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{B1F5}", - nfc: "\u{B1F5}", - nfd: "\u{1102}\u{116D}\u{11B4}", - nfkc: "\u{B1F5}", - nfkd: "\u{1102}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{B1F6}", - nfc: "\u{B1F6}", - nfd: "\u{1102}\u{116D}\u{11B5}", - nfkc: "\u{B1F6}", - nfkd: "\u{1102}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{B1F7}", - nfc: "\u{B1F7}", - nfd: "\u{1102}\u{116D}\u{11B6}", - nfkc: "\u{B1F7}", - nfkd: "\u{1102}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{B1F8}", - nfc: "\u{B1F8}", - nfd: "\u{1102}\u{116D}\u{11B7}", - nfkc: "\u{B1F8}", - nfkd: "\u{1102}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{B1F9}", - nfc: "\u{B1F9}", - nfd: "\u{1102}\u{116D}\u{11B8}", - nfkc: "\u{B1F9}", - nfkd: "\u{1102}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{B1FA}", - nfc: "\u{B1FA}", - nfd: "\u{1102}\u{116D}\u{11B9}", - nfkc: "\u{B1FA}", - nfkd: "\u{1102}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{B1FB}", - nfc: "\u{B1FB}", - nfd: "\u{1102}\u{116D}\u{11BA}", - nfkc: "\u{B1FB}", - nfkd: "\u{1102}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{B1FC}", - nfc: "\u{B1FC}", - nfd: "\u{1102}\u{116D}\u{11BB}", - nfkc: "\u{B1FC}", - nfkd: "\u{1102}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{B1FD}", - nfc: "\u{B1FD}", - nfd: "\u{1102}\u{116D}\u{11BC}", - nfkc: "\u{B1FD}", - nfkd: "\u{1102}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{B1FE}", - nfc: "\u{B1FE}", - nfd: "\u{1102}\u{116D}\u{11BD}", - nfkc: "\u{B1FE}", - nfkd: "\u{1102}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{B1FF}", - nfc: "\u{B1FF}", - nfd: "\u{1102}\u{116D}\u{11BE}", - nfkc: "\u{B1FF}", - nfkd: "\u{1102}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{B200}", - nfc: "\u{B200}", - nfd: "\u{1102}\u{116D}\u{11BF}", - nfkc: "\u{B200}", - nfkd: "\u{1102}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{B201}", - nfc: "\u{B201}", - nfd: "\u{1102}\u{116D}\u{11C0}", - nfkc: "\u{B201}", - nfkd: "\u{1102}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{B202}", - nfc: "\u{B202}", - nfd: "\u{1102}\u{116D}\u{11C1}", - nfkc: "\u{B202}", - nfkd: "\u{1102}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{B203}", - nfc: "\u{B203}", - nfd: "\u{1102}\u{116D}\u{11C2}", - nfkc: "\u{B203}", - nfkd: "\u{1102}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{B204}", - nfc: "\u{B204}", - nfd: "\u{1102}\u{116E}", - nfkc: "\u{B204}", - nfkd: "\u{1102}\u{116E}", - }, - NormalizationTest { - source: "\u{B205}", - nfc: "\u{B205}", - nfd: "\u{1102}\u{116E}\u{11A8}", - nfkc: "\u{B205}", - nfkd: "\u{1102}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{B206}", - nfc: "\u{B206}", - nfd: "\u{1102}\u{116E}\u{11A9}", - nfkc: "\u{B206}", - nfkd: "\u{1102}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{B207}", - nfc: "\u{B207}", - nfd: "\u{1102}\u{116E}\u{11AA}", - nfkc: "\u{B207}", - nfkd: "\u{1102}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{B208}", - nfc: "\u{B208}", - nfd: "\u{1102}\u{116E}\u{11AB}", - nfkc: "\u{B208}", - nfkd: "\u{1102}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{B209}", - nfc: "\u{B209}", - nfd: "\u{1102}\u{116E}\u{11AC}", - nfkc: "\u{B209}", - nfkd: "\u{1102}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{B20A}", - nfc: "\u{B20A}", - nfd: "\u{1102}\u{116E}\u{11AD}", - nfkc: "\u{B20A}", - nfkd: "\u{1102}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{B20B}", - nfc: "\u{B20B}", - nfd: "\u{1102}\u{116E}\u{11AE}", - nfkc: "\u{B20B}", - nfkd: "\u{1102}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{B20C}", - nfc: "\u{B20C}", - nfd: "\u{1102}\u{116E}\u{11AF}", - nfkc: "\u{B20C}", - nfkd: "\u{1102}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{B20D}", - nfc: "\u{B20D}", - nfd: "\u{1102}\u{116E}\u{11B0}", - nfkc: "\u{B20D}", - nfkd: "\u{1102}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{B20E}", - nfc: "\u{B20E}", - nfd: "\u{1102}\u{116E}\u{11B1}", - nfkc: "\u{B20E}", - nfkd: "\u{1102}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{B20F}", - nfc: "\u{B20F}", - nfd: "\u{1102}\u{116E}\u{11B2}", - nfkc: "\u{B20F}", - nfkd: "\u{1102}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{B210}", - nfc: "\u{B210}", - nfd: "\u{1102}\u{116E}\u{11B3}", - nfkc: "\u{B210}", - nfkd: "\u{1102}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{B211}", - nfc: "\u{B211}", - nfd: "\u{1102}\u{116E}\u{11B4}", - nfkc: "\u{B211}", - nfkd: "\u{1102}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{B212}", - nfc: "\u{B212}", - nfd: "\u{1102}\u{116E}\u{11B5}", - nfkc: "\u{B212}", - nfkd: "\u{1102}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{B213}", - nfc: "\u{B213}", - nfd: "\u{1102}\u{116E}\u{11B6}", - nfkc: "\u{B213}", - nfkd: "\u{1102}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{B214}", - nfc: "\u{B214}", - nfd: "\u{1102}\u{116E}\u{11B7}", - nfkc: "\u{B214}", - nfkd: "\u{1102}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{B215}", - nfc: "\u{B215}", - nfd: "\u{1102}\u{116E}\u{11B8}", - nfkc: "\u{B215}", - nfkd: "\u{1102}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{B216}", - nfc: "\u{B216}", - nfd: "\u{1102}\u{116E}\u{11B9}", - nfkc: "\u{B216}", - nfkd: "\u{1102}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{B217}", - nfc: "\u{B217}", - nfd: "\u{1102}\u{116E}\u{11BA}", - nfkc: "\u{B217}", - nfkd: "\u{1102}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{B218}", - nfc: "\u{B218}", - nfd: "\u{1102}\u{116E}\u{11BB}", - nfkc: "\u{B218}", - nfkd: "\u{1102}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{B219}", - nfc: "\u{B219}", - nfd: "\u{1102}\u{116E}\u{11BC}", - nfkc: "\u{B219}", - nfkd: "\u{1102}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{B21A}", - nfc: "\u{B21A}", - nfd: "\u{1102}\u{116E}\u{11BD}", - nfkc: "\u{B21A}", - nfkd: "\u{1102}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{B21B}", - nfc: "\u{B21B}", - nfd: "\u{1102}\u{116E}\u{11BE}", - nfkc: "\u{B21B}", - nfkd: "\u{1102}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{B21C}", - nfc: "\u{B21C}", - nfd: "\u{1102}\u{116E}\u{11BF}", - nfkc: "\u{B21C}", - nfkd: "\u{1102}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{B21D}", - nfc: "\u{B21D}", - nfd: "\u{1102}\u{116E}\u{11C0}", - nfkc: "\u{B21D}", - nfkd: "\u{1102}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{B21E}", - nfc: "\u{B21E}", - nfd: "\u{1102}\u{116E}\u{11C1}", - nfkc: "\u{B21E}", - nfkd: "\u{1102}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{B21F}", - nfc: "\u{B21F}", - nfd: "\u{1102}\u{116E}\u{11C2}", - nfkc: "\u{B21F}", - nfkd: "\u{1102}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{B220}", - nfc: "\u{B220}", - nfd: "\u{1102}\u{116F}", - nfkc: "\u{B220}", - nfkd: "\u{1102}\u{116F}", - }, - NormalizationTest { - source: "\u{B221}", - nfc: "\u{B221}", - nfd: "\u{1102}\u{116F}\u{11A8}", - nfkc: "\u{B221}", - nfkd: "\u{1102}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{B222}", - nfc: "\u{B222}", - nfd: "\u{1102}\u{116F}\u{11A9}", - nfkc: "\u{B222}", - nfkd: "\u{1102}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{B223}", - nfc: "\u{B223}", - nfd: "\u{1102}\u{116F}\u{11AA}", - nfkc: "\u{B223}", - nfkd: "\u{1102}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{B224}", - nfc: "\u{B224}", - nfd: "\u{1102}\u{116F}\u{11AB}", - nfkc: "\u{B224}", - nfkd: "\u{1102}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{B225}", - nfc: "\u{B225}", - nfd: "\u{1102}\u{116F}\u{11AC}", - nfkc: "\u{B225}", - nfkd: "\u{1102}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{B226}", - nfc: "\u{B226}", - nfd: "\u{1102}\u{116F}\u{11AD}", - nfkc: "\u{B226}", - nfkd: "\u{1102}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{B227}", - nfc: "\u{B227}", - nfd: "\u{1102}\u{116F}\u{11AE}", - nfkc: "\u{B227}", - nfkd: "\u{1102}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{B228}", - nfc: "\u{B228}", - nfd: "\u{1102}\u{116F}\u{11AF}", - nfkc: "\u{B228}", - nfkd: "\u{1102}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{B229}", - nfc: "\u{B229}", - nfd: "\u{1102}\u{116F}\u{11B0}", - nfkc: "\u{B229}", - nfkd: "\u{1102}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{B22A}", - nfc: "\u{B22A}", - nfd: "\u{1102}\u{116F}\u{11B1}", - nfkc: "\u{B22A}", - nfkd: "\u{1102}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{B22B}", - nfc: "\u{B22B}", - nfd: "\u{1102}\u{116F}\u{11B2}", - nfkc: "\u{B22B}", - nfkd: "\u{1102}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{B22C}", - nfc: "\u{B22C}", - nfd: "\u{1102}\u{116F}\u{11B3}", - nfkc: "\u{B22C}", - nfkd: "\u{1102}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{B22D}", - nfc: "\u{B22D}", - nfd: "\u{1102}\u{116F}\u{11B4}", - nfkc: "\u{B22D}", - nfkd: "\u{1102}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{B22E}", - nfc: "\u{B22E}", - nfd: "\u{1102}\u{116F}\u{11B5}", - nfkc: "\u{B22E}", - nfkd: "\u{1102}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{B22F}", - nfc: "\u{B22F}", - nfd: "\u{1102}\u{116F}\u{11B6}", - nfkc: "\u{B22F}", - nfkd: "\u{1102}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{B230}", - nfc: "\u{B230}", - nfd: "\u{1102}\u{116F}\u{11B7}", - nfkc: "\u{B230}", - nfkd: "\u{1102}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{B231}", - nfc: "\u{B231}", - nfd: "\u{1102}\u{116F}\u{11B8}", - nfkc: "\u{B231}", - nfkd: "\u{1102}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{B232}", - nfc: "\u{B232}", - nfd: "\u{1102}\u{116F}\u{11B9}", - nfkc: "\u{B232}", - nfkd: "\u{1102}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{B233}", - nfc: "\u{B233}", - nfd: "\u{1102}\u{116F}\u{11BA}", - nfkc: "\u{B233}", - nfkd: "\u{1102}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{B234}", - nfc: "\u{B234}", - nfd: "\u{1102}\u{116F}\u{11BB}", - nfkc: "\u{B234}", - nfkd: "\u{1102}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{B235}", - nfc: "\u{B235}", - nfd: "\u{1102}\u{116F}\u{11BC}", - nfkc: "\u{B235}", - nfkd: "\u{1102}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{B236}", - nfc: "\u{B236}", - nfd: "\u{1102}\u{116F}\u{11BD}", - nfkc: "\u{B236}", - nfkd: "\u{1102}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{B237}", - nfc: "\u{B237}", - nfd: "\u{1102}\u{116F}\u{11BE}", - nfkc: "\u{B237}", - nfkd: "\u{1102}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{B238}", - nfc: "\u{B238}", - nfd: "\u{1102}\u{116F}\u{11BF}", - nfkc: "\u{B238}", - nfkd: "\u{1102}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{B239}", - nfc: "\u{B239}", - nfd: "\u{1102}\u{116F}\u{11C0}", - nfkc: "\u{B239}", - nfkd: "\u{1102}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{B23A}", - nfc: "\u{B23A}", - nfd: "\u{1102}\u{116F}\u{11C1}", - nfkc: "\u{B23A}", - nfkd: "\u{1102}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{B23B}", - nfc: "\u{B23B}", - nfd: "\u{1102}\u{116F}\u{11C2}", - nfkc: "\u{B23B}", - nfkd: "\u{1102}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{B23C}", - nfc: "\u{B23C}", - nfd: "\u{1102}\u{1170}", - nfkc: "\u{B23C}", - nfkd: "\u{1102}\u{1170}", - }, - NormalizationTest { - source: "\u{B23D}", - nfc: "\u{B23D}", - nfd: "\u{1102}\u{1170}\u{11A8}", - nfkc: "\u{B23D}", - nfkd: "\u{1102}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{B23E}", - nfc: "\u{B23E}", - nfd: "\u{1102}\u{1170}\u{11A9}", - nfkc: "\u{B23E}", - nfkd: "\u{1102}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{B23F}", - nfc: "\u{B23F}", - nfd: "\u{1102}\u{1170}\u{11AA}", - nfkc: "\u{B23F}", - nfkd: "\u{1102}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{B240}", - nfc: "\u{B240}", - nfd: "\u{1102}\u{1170}\u{11AB}", - nfkc: "\u{B240}", - nfkd: "\u{1102}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{B241}", - nfc: "\u{B241}", - nfd: "\u{1102}\u{1170}\u{11AC}", - nfkc: "\u{B241}", - nfkd: "\u{1102}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{B242}", - nfc: "\u{B242}", - nfd: "\u{1102}\u{1170}\u{11AD}", - nfkc: "\u{B242}", - nfkd: "\u{1102}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{B243}", - nfc: "\u{B243}", - nfd: "\u{1102}\u{1170}\u{11AE}", - nfkc: "\u{B243}", - nfkd: "\u{1102}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{B244}", - nfc: "\u{B244}", - nfd: "\u{1102}\u{1170}\u{11AF}", - nfkc: "\u{B244}", - nfkd: "\u{1102}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{B245}", - nfc: "\u{B245}", - nfd: "\u{1102}\u{1170}\u{11B0}", - nfkc: "\u{B245}", - nfkd: "\u{1102}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{B246}", - nfc: "\u{B246}", - nfd: "\u{1102}\u{1170}\u{11B1}", - nfkc: "\u{B246}", - nfkd: "\u{1102}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{B247}", - nfc: "\u{B247}", - nfd: "\u{1102}\u{1170}\u{11B2}", - nfkc: "\u{B247}", - nfkd: "\u{1102}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{B248}", - nfc: "\u{B248}", - nfd: "\u{1102}\u{1170}\u{11B3}", - nfkc: "\u{B248}", - nfkd: "\u{1102}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{B249}", - nfc: "\u{B249}", - nfd: "\u{1102}\u{1170}\u{11B4}", - nfkc: "\u{B249}", - nfkd: "\u{1102}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{B24A}", - nfc: "\u{B24A}", - nfd: "\u{1102}\u{1170}\u{11B5}", - nfkc: "\u{B24A}", - nfkd: "\u{1102}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{B24B}", - nfc: "\u{B24B}", - nfd: "\u{1102}\u{1170}\u{11B6}", - nfkc: "\u{B24B}", - nfkd: "\u{1102}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{B24C}", - nfc: "\u{B24C}", - nfd: "\u{1102}\u{1170}\u{11B7}", - nfkc: "\u{B24C}", - nfkd: "\u{1102}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{B24D}", - nfc: "\u{B24D}", - nfd: "\u{1102}\u{1170}\u{11B8}", - nfkc: "\u{B24D}", - nfkd: "\u{1102}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{B24E}", - nfc: "\u{B24E}", - nfd: "\u{1102}\u{1170}\u{11B9}", - nfkc: "\u{B24E}", - nfkd: "\u{1102}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{B24F}", - nfc: "\u{B24F}", - nfd: "\u{1102}\u{1170}\u{11BA}", - nfkc: "\u{B24F}", - nfkd: "\u{1102}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{B250}", - nfc: "\u{B250}", - nfd: "\u{1102}\u{1170}\u{11BB}", - nfkc: "\u{B250}", - nfkd: "\u{1102}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{B251}", - nfc: "\u{B251}", - nfd: "\u{1102}\u{1170}\u{11BC}", - nfkc: "\u{B251}", - nfkd: "\u{1102}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{B252}", - nfc: "\u{B252}", - nfd: "\u{1102}\u{1170}\u{11BD}", - nfkc: "\u{B252}", - nfkd: "\u{1102}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{B253}", - nfc: "\u{B253}", - nfd: "\u{1102}\u{1170}\u{11BE}", - nfkc: "\u{B253}", - nfkd: "\u{1102}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{B254}", - nfc: "\u{B254}", - nfd: "\u{1102}\u{1170}\u{11BF}", - nfkc: "\u{B254}", - nfkd: "\u{1102}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{B255}", - nfc: "\u{B255}", - nfd: "\u{1102}\u{1170}\u{11C0}", - nfkc: "\u{B255}", - nfkd: "\u{1102}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{B256}", - nfc: "\u{B256}", - nfd: "\u{1102}\u{1170}\u{11C1}", - nfkc: "\u{B256}", - nfkd: "\u{1102}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{B257}", - nfc: "\u{B257}", - nfd: "\u{1102}\u{1170}\u{11C2}", - nfkc: "\u{B257}", - nfkd: "\u{1102}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{B258}", - nfc: "\u{B258}", - nfd: "\u{1102}\u{1171}", - nfkc: "\u{B258}", - nfkd: "\u{1102}\u{1171}", - }, - NormalizationTest { - source: "\u{B259}", - nfc: "\u{B259}", - nfd: "\u{1102}\u{1171}\u{11A8}", - nfkc: "\u{B259}", - nfkd: "\u{1102}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{B25A}", - nfc: "\u{B25A}", - nfd: "\u{1102}\u{1171}\u{11A9}", - nfkc: "\u{B25A}", - nfkd: "\u{1102}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{B25B}", - nfc: "\u{B25B}", - nfd: "\u{1102}\u{1171}\u{11AA}", - nfkc: "\u{B25B}", - nfkd: "\u{1102}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{B25C}", - nfc: "\u{B25C}", - nfd: "\u{1102}\u{1171}\u{11AB}", - nfkc: "\u{B25C}", - nfkd: "\u{1102}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{B25D}", - nfc: "\u{B25D}", - nfd: "\u{1102}\u{1171}\u{11AC}", - nfkc: "\u{B25D}", - nfkd: "\u{1102}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{B25E}", - nfc: "\u{B25E}", - nfd: "\u{1102}\u{1171}\u{11AD}", - nfkc: "\u{B25E}", - nfkd: "\u{1102}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{B25F}", - nfc: "\u{B25F}", - nfd: "\u{1102}\u{1171}\u{11AE}", - nfkc: "\u{B25F}", - nfkd: "\u{1102}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{B260}", - nfc: "\u{B260}", - nfd: "\u{1102}\u{1171}\u{11AF}", - nfkc: "\u{B260}", - nfkd: "\u{1102}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{B261}", - nfc: "\u{B261}", - nfd: "\u{1102}\u{1171}\u{11B0}", - nfkc: "\u{B261}", - nfkd: "\u{1102}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{B262}", - nfc: "\u{B262}", - nfd: "\u{1102}\u{1171}\u{11B1}", - nfkc: "\u{B262}", - nfkd: "\u{1102}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{B263}", - nfc: "\u{B263}", - nfd: "\u{1102}\u{1171}\u{11B2}", - nfkc: "\u{B263}", - nfkd: "\u{1102}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{B264}", - nfc: "\u{B264}", - nfd: "\u{1102}\u{1171}\u{11B3}", - nfkc: "\u{B264}", - nfkd: "\u{1102}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{B265}", - nfc: "\u{B265}", - nfd: "\u{1102}\u{1171}\u{11B4}", - nfkc: "\u{B265}", - nfkd: "\u{1102}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{B266}", - nfc: "\u{B266}", - nfd: "\u{1102}\u{1171}\u{11B5}", - nfkc: "\u{B266}", - nfkd: "\u{1102}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{B267}", - nfc: "\u{B267}", - nfd: "\u{1102}\u{1171}\u{11B6}", - nfkc: "\u{B267}", - nfkd: "\u{1102}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{B268}", - nfc: "\u{B268}", - nfd: "\u{1102}\u{1171}\u{11B7}", - nfkc: "\u{B268}", - nfkd: "\u{1102}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{B269}", - nfc: "\u{B269}", - nfd: "\u{1102}\u{1171}\u{11B8}", - nfkc: "\u{B269}", - nfkd: "\u{1102}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{B26A}", - nfc: "\u{B26A}", - nfd: "\u{1102}\u{1171}\u{11B9}", - nfkc: "\u{B26A}", - nfkd: "\u{1102}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{B26B}", - nfc: "\u{B26B}", - nfd: "\u{1102}\u{1171}\u{11BA}", - nfkc: "\u{B26B}", - nfkd: "\u{1102}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{B26C}", - nfc: "\u{B26C}", - nfd: "\u{1102}\u{1171}\u{11BB}", - nfkc: "\u{B26C}", - nfkd: "\u{1102}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{B26D}", - nfc: "\u{B26D}", - nfd: "\u{1102}\u{1171}\u{11BC}", - nfkc: "\u{B26D}", - nfkd: "\u{1102}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{B26E}", - nfc: "\u{B26E}", - nfd: "\u{1102}\u{1171}\u{11BD}", - nfkc: "\u{B26E}", - nfkd: "\u{1102}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{B26F}", - nfc: "\u{B26F}", - nfd: "\u{1102}\u{1171}\u{11BE}", - nfkc: "\u{B26F}", - nfkd: "\u{1102}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{B270}", - nfc: "\u{B270}", - nfd: "\u{1102}\u{1171}\u{11BF}", - nfkc: "\u{B270}", - nfkd: "\u{1102}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{B271}", - nfc: "\u{B271}", - nfd: "\u{1102}\u{1171}\u{11C0}", - nfkc: "\u{B271}", - nfkd: "\u{1102}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{B272}", - nfc: "\u{B272}", - nfd: "\u{1102}\u{1171}\u{11C1}", - nfkc: "\u{B272}", - nfkd: "\u{1102}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{B273}", - nfc: "\u{B273}", - nfd: "\u{1102}\u{1171}\u{11C2}", - nfkc: "\u{B273}", - nfkd: "\u{1102}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{B274}", - nfc: "\u{B274}", - nfd: "\u{1102}\u{1172}", - nfkc: "\u{B274}", - nfkd: "\u{1102}\u{1172}", - }, - NormalizationTest { - source: "\u{B275}", - nfc: "\u{B275}", - nfd: "\u{1102}\u{1172}\u{11A8}", - nfkc: "\u{B275}", - nfkd: "\u{1102}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{B276}", - nfc: "\u{B276}", - nfd: "\u{1102}\u{1172}\u{11A9}", - nfkc: "\u{B276}", - nfkd: "\u{1102}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{B277}", - nfc: "\u{B277}", - nfd: "\u{1102}\u{1172}\u{11AA}", - nfkc: "\u{B277}", - nfkd: "\u{1102}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{B278}", - nfc: "\u{B278}", - nfd: "\u{1102}\u{1172}\u{11AB}", - nfkc: "\u{B278}", - nfkd: "\u{1102}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{B279}", - nfc: "\u{B279}", - nfd: "\u{1102}\u{1172}\u{11AC}", - nfkc: "\u{B279}", - nfkd: "\u{1102}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{B27A}", - nfc: "\u{B27A}", - nfd: "\u{1102}\u{1172}\u{11AD}", - nfkc: "\u{B27A}", - nfkd: "\u{1102}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{B27B}", - nfc: "\u{B27B}", - nfd: "\u{1102}\u{1172}\u{11AE}", - nfkc: "\u{B27B}", - nfkd: "\u{1102}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{B27C}", - nfc: "\u{B27C}", - nfd: "\u{1102}\u{1172}\u{11AF}", - nfkc: "\u{B27C}", - nfkd: "\u{1102}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{B27D}", - nfc: "\u{B27D}", - nfd: "\u{1102}\u{1172}\u{11B0}", - nfkc: "\u{B27D}", - nfkd: "\u{1102}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{B27E}", - nfc: "\u{B27E}", - nfd: "\u{1102}\u{1172}\u{11B1}", - nfkc: "\u{B27E}", - nfkd: "\u{1102}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{B27F}", - nfc: "\u{B27F}", - nfd: "\u{1102}\u{1172}\u{11B2}", - nfkc: "\u{B27F}", - nfkd: "\u{1102}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{B280}", - nfc: "\u{B280}", - nfd: "\u{1102}\u{1172}\u{11B3}", - nfkc: "\u{B280}", - nfkd: "\u{1102}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{B281}", - nfc: "\u{B281}", - nfd: "\u{1102}\u{1172}\u{11B4}", - nfkc: "\u{B281}", - nfkd: "\u{1102}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{B282}", - nfc: "\u{B282}", - nfd: "\u{1102}\u{1172}\u{11B5}", - nfkc: "\u{B282}", - nfkd: "\u{1102}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{B283}", - nfc: "\u{B283}", - nfd: "\u{1102}\u{1172}\u{11B6}", - nfkc: "\u{B283}", - nfkd: "\u{1102}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{B284}", - nfc: "\u{B284}", - nfd: "\u{1102}\u{1172}\u{11B7}", - nfkc: "\u{B284}", - nfkd: "\u{1102}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{B285}", - nfc: "\u{B285}", - nfd: "\u{1102}\u{1172}\u{11B8}", - nfkc: "\u{B285}", - nfkd: "\u{1102}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{B286}", - nfc: "\u{B286}", - nfd: "\u{1102}\u{1172}\u{11B9}", - nfkc: "\u{B286}", - nfkd: "\u{1102}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{B287}", - nfc: "\u{B287}", - nfd: "\u{1102}\u{1172}\u{11BA}", - nfkc: "\u{B287}", - nfkd: "\u{1102}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{B288}", - nfc: "\u{B288}", - nfd: "\u{1102}\u{1172}\u{11BB}", - nfkc: "\u{B288}", - nfkd: "\u{1102}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{B289}", - nfc: "\u{B289}", - nfd: "\u{1102}\u{1172}\u{11BC}", - nfkc: "\u{B289}", - nfkd: "\u{1102}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{B28A}", - nfc: "\u{B28A}", - nfd: "\u{1102}\u{1172}\u{11BD}", - nfkc: "\u{B28A}", - nfkd: "\u{1102}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{B28B}", - nfc: "\u{B28B}", - nfd: "\u{1102}\u{1172}\u{11BE}", - nfkc: "\u{B28B}", - nfkd: "\u{1102}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{B28C}", - nfc: "\u{B28C}", - nfd: "\u{1102}\u{1172}\u{11BF}", - nfkc: "\u{B28C}", - nfkd: "\u{1102}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{B28D}", - nfc: "\u{B28D}", - nfd: "\u{1102}\u{1172}\u{11C0}", - nfkc: "\u{B28D}", - nfkd: "\u{1102}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{B28E}", - nfc: "\u{B28E}", - nfd: "\u{1102}\u{1172}\u{11C1}", - nfkc: "\u{B28E}", - nfkd: "\u{1102}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{B28F}", - nfc: "\u{B28F}", - nfd: "\u{1102}\u{1172}\u{11C2}", - nfkc: "\u{B28F}", - nfkd: "\u{1102}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{B290}", - nfc: "\u{B290}", - nfd: "\u{1102}\u{1173}", - nfkc: "\u{B290}", - nfkd: "\u{1102}\u{1173}", - }, - NormalizationTest { - source: "\u{B291}", - nfc: "\u{B291}", - nfd: "\u{1102}\u{1173}\u{11A8}", - nfkc: "\u{B291}", - nfkd: "\u{1102}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{B292}", - nfc: "\u{B292}", - nfd: "\u{1102}\u{1173}\u{11A9}", - nfkc: "\u{B292}", - nfkd: "\u{1102}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{B293}", - nfc: "\u{B293}", - nfd: "\u{1102}\u{1173}\u{11AA}", - nfkc: "\u{B293}", - nfkd: "\u{1102}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{B294}", - nfc: "\u{B294}", - nfd: "\u{1102}\u{1173}\u{11AB}", - nfkc: "\u{B294}", - nfkd: "\u{1102}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{B295}", - nfc: "\u{B295}", - nfd: "\u{1102}\u{1173}\u{11AC}", - nfkc: "\u{B295}", - nfkd: "\u{1102}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{B296}", - nfc: "\u{B296}", - nfd: "\u{1102}\u{1173}\u{11AD}", - nfkc: "\u{B296}", - nfkd: "\u{1102}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{B297}", - nfc: "\u{B297}", - nfd: "\u{1102}\u{1173}\u{11AE}", - nfkc: "\u{B297}", - nfkd: "\u{1102}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{B298}", - nfc: "\u{B298}", - nfd: "\u{1102}\u{1173}\u{11AF}", - nfkc: "\u{B298}", - nfkd: "\u{1102}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{B299}", - nfc: "\u{B299}", - nfd: "\u{1102}\u{1173}\u{11B0}", - nfkc: "\u{B299}", - nfkd: "\u{1102}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{B29A}", - nfc: "\u{B29A}", - nfd: "\u{1102}\u{1173}\u{11B1}", - nfkc: "\u{B29A}", - nfkd: "\u{1102}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{B29B}", - nfc: "\u{B29B}", - nfd: "\u{1102}\u{1173}\u{11B2}", - nfkc: "\u{B29B}", - nfkd: "\u{1102}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{B29C}", - nfc: "\u{B29C}", - nfd: "\u{1102}\u{1173}\u{11B3}", - nfkc: "\u{B29C}", - nfkd: "\u{1102}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{B29D}", - nfc: "\u{B29D}", - nfd: "\u{1102}\u{1173}\u{11B4}", - nfkc: "\u{B29D}", - nfkd: "\u{1102}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{B29E}", - nfc: "\u{B29E}", - nfd: "\u{1102}\u{1173}\u{11B5}", - nfkc: "\u{B29E}", - nfkd: "\u{1102}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{B29F}", - nfc: "\u{B29F}", - nfd: "\u{1102}\u{1173}\u{11B6}", - nfkc: "\u{B29F}", - nfkd: "\u{1102}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{B2A0}", - nfc: "\u{B2A0}", - nfd: "\u{1102}\u{1173}\u{11B7}", - nfkc: "\u{B2A0}", - nfkd: "\u{1102}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{B2A1}", - nfc: "\u{B2A1}", - nfd: "\u{1102}\u{1173}\u{11B8}", - nfkc: "\u{B2A1}", - nfkd: "\u{1102}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{B2A2}", - nfc: "\u{B2A2}", - nfd: "\u{1102}\u{1173}\u{11B9}", - nfkc: "\u{B2A2}", - nfkd: "\u{1102}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{B2A3}", - nfc: "\u{B2A3}", - nfd: "\u{1102}\u{1173}\u{11BA}", - nfkc: "\u{B2A3}", - nfkd: "\u{1102}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{B2A4}", - nfc: "\u{B2A4}", - nfd: "\u{1102}\u{1173}\u{11BB}", - nfkc: "\u{B2A4}", - nfkd: "\u{1102}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{B2A5}", - nfc: "\u{B2A5}", - nfd: "\u{1102}\u{1173}\u{11BC}", - nfkc: "\u{B2A5}", - nfkd: "\u{1102}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{B2A6}", - nfc: "\u{B2A6}", - nfd: "\u{1102}\u{1173}\u{11BD}", - nfkc: "\u{B2A6}", - nfkd: "\u{1102}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{B2A7}", - nfc: "\u{B2A7}", - nfd: "\u{1102}\u{1173}\u{11BE}", - nfkc: "\u{B2A7}", - nfkd: "\u{1102}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{B2A8}", - nfc: "\u{B2A8}", - nfd: "\u{1102}\u{1173}\u{11BF}", - nfkc: "\u{B2A8}", - nfkd: "\u{1102}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{B2A9}", - nfc: "\u{B2A9}", - nfd: "\u{1102}\u{1173}\u{11C0}", - nfkc: "\u{B2A9}", - nfkd: "\u{1102}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{B2AA}", - nfc: "\u{B2AA}", - nfd: "\u{1102}\u{1173}\u{11C1}", - nfkc: "\u{B2AA}", - nfkd: "\u{1102}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{B2AB}", - nfc: "\u{B2AB}", - nfd: "\u{1102}\u{1173}\u{11C2}", - nfkc: "\u{B2AB}", - nfkd: "\u{1102}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{B2AC}", - nfc: "\u{B2AC}", - nfd: "\u{1102}\u{1174}", - nfkc: "\u{B2AC}", - nfkd: "\u{1102}\u{1174}", - }, - NormalizationTest { - source: "\u{B2AD}", - nfc: "\u{B2AD}", - nfd: "\u{1102}\u{1174}\u{11A8}", - nfkc: "\u{B2AD}", - nfkd: "\u{1102}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{B2AE}", - nfc: "\u{B2AE}", - nfd: "\u{1102}\u{1174}\u{11A9}", - nfkc: "\u{B2AE}", - nfkd: "\u{1102}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{B2AF}", - nfc: "\u{B2AF}", - nfd: "\u{1102}\u{1174}\u{11AA}", - nfkc: "\u{B2AF}", - nfkd: "\u{1102}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{B2B0}", - nfc: "\u{B2B0}", - nfd: "\u{1102}\u{1174}\u{11AB}", - nfkc: "\u{B2B0}", - nfkd: "\u{1102}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{B2B1}", - nfc: "\u{B2B1}", - nfd: "\u{1102}\u{1174}\u{11AC}", - nfkc: "\u{B2B1}", - nfkd: "\u{1102}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{B2B2}", - nfc: "\u{B2B2}", - nfd: "\u{1102}\u{1174}\u{11AD}", - nfkc: "\u{B2B2}", - nfkd: "\u{1102}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{B2B3}", - nfc: "\u{B2B3}", - nfd: "\u{1102}\u{1174}\u{11AE}", - nfkc: "\u{B2B3}", - nfkd: "\u{1102}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{B2B4}", - nfc: "\u{B2B4}", - nfd: "\u{1102}\u{1174}\u{11AF}", - nfkc: "\u{B2B4}", - nfkd: "\u{1102}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{B2B5}", - nfc: "\u{B2B5}", - nfd: "\u{1102}\u{1174}\u{11B0}", - nfkc: "\u{B2B5}", - nfkd: "\u{1102}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{B2B6}", - nfc: "\u{B2B6}", - nfd: "\u{1102}\u{1174}\u{11B1}", - nfkc: "\u{B2B6}", - nfkd: "\u{1102}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{B2B7}", - nfc: "\u{B2B7}", - nfd: "\u{1102}\u{1174}\u{11B2}", - nfkc: "\u{B2B7}", - nfkd: "\u{1102}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{B2B8}", - nfc: "\u{B2B8}", - nfd: "\u{1102}\u{1174}\u{11B3}", - nfkc: "\u{B2B8}", - nfkd: "\u{1102}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{B2B9}", - nfc: "\u{B2B9}", - nfd: "\u{1102}\u{1174}\u{11B4}", - nfkc: "\u{B2B9}", - nfkd: "\u{1102}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{B2BA}", - nfc: "\u{B2BA}", - nfd: "\u{1102}\u{1174}\u{11B5}", - nfkc: "\u{B2BA}", - nfkd: "\u{1102}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{B2BB}", - nfc: "\u{B2BB}", - nfd: "\u{1102}\u{1174}\u{11B6}", - nfkc: "\u{B2BB}", - nfkd: "\u{1102}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{B2BC}", - nfc: "\u{B2BC}", - nfd: "\u{1102}\u{1174}\u{11B7}", - nfkc: "\u{B2BC}", - nfkd: "\u{1102}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{B2BD}", - nfc: "\u{B2BD}", - nfd: "\u{1102}\u{1174}\u{11B8}", - nfkc: "\u{B2BD}", - nfkd: "\u{1102}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{B2BE}", - nfc: "\u{B2BE}", - nfd: "\u{1102}\u{1174}\u{11B9}", - nfkc: "\u{B2BE}", - nfkd: "\u{1102}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{B2BF}", - nfc: "\u{B2BF}", - nfd: "\u{1102}\u{1174}\u{11BA}", - nfkc: "\u{B2BF}", - nfkd: "\u{1102}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{B2C0}", - nfc: "\u{B2C0}", - nfd: "\u{1102}\u{1174}\u{11BB}", - nfkc: "\u{B2C0}", - nfkd: "\u{1102}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{B2C1}", - nfc: "\u{B2C1}", - nfd: "\u{1102}\u{1174}\u{11BC}", - nfkc: "\u{B2C1}", - nfkd: "\u{1102}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{B2C2}", - nfc: "\u{B2C2}", - nfd: "\u{1102}\u{1174}\u{11BD}", - nfkc: "\u{B2C2}", - nfkd: "\u{1102}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{B2C3}", - nfc: "\u{B2C3}", - nfd: "\u{1102}\u{1174}\u{11BE}", - nfkc: "\u{B2C3}", - nfkd: "\u{1102}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{B2C4}", - nfc: "\u{B2C4}", - nfd: "\u{1102}\u{1174}\u{11BF}", - nfkc: "\u{B2C4}", - nfkd: "\u{1102}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{B2C5}", - nfc: "\u{B2C5}", - nfd: "\u{1102}\u{1174}\u{11C0}", - nfkc: "\u{B2C5}", - nfkd: "\u{1102}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{B2C6}", - nfc: "\u{B2C6}", - nfd: "\u{1102}\u{1174}\u{11C1}", - nfkc: "\u{B2C6}", - nfkd: "\u{1102}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{B2C7}", - nfc: "\u{B2C7}", - nfd: "\u{1102}\u{1174}\u{11C2}", - nfkc: "\u{B2C7}", - nfkd: "\u{1102}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{B2C8}", - nfc: "\u{B2C8}", - nfd: "\u{1102}\u{1175}", - nfkc: "\u{B2C8}", - nfkd: "\u{1102}\u{1175}", - }, - NormalizationTest { - source: "\u{B2C9}", - nfc: "\u{B2C9}", - nfd: "\u{1102}\u{1175}\u{11A8}", - nfkc: "\u{B2C9}", - nfkd: "\u{1102}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{B2CA}", - nfc: "\u{B2CA}", - nfd: "\u{1102}\u{1175}\u{11A9}", - nfkc: "\u{B2CA}", - nfkd: "\u{1102}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{B2CB}", - nfc: "\u{B2CB}", - nfd: "\u{1102}\u{1175}\u{11AA}", - nfkc: "\u{B2CB}", - nfkd: "\u{1102}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{B2CC}", - nfc: "\u{B2CC}", - nfd: "\u{1102}\u{1175}\u{11AB}", - nfkc: "\u{B2CC}", - nfkd: "\u{1102}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{B2CD}", - nfc: "\u{B2CD}", - nfd: "\u{1102}\u{1175}\u{11AC}", - nfkc: "\u{B2CD}", - nfkd: "\u{1102}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{B2CE}", - nfc: "\u{B2CE}", - nfd: "\u{1102}\u{1175}\u{11AD}", - nfkc: "\u{B2CE}", - nfkd: "\u{1102}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{B2CF}", - nfc: "\u{B2CF}", - nfd: "\u{1102}\u{1175}\u{11AE}", - nfkc: "\u{B2CF}", - nfkd: "\u{1102}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{B2D0}", - nfc: "\u{B2D0}", - nfd: "\u{1102}\u{1175}\u{11AF}", - nfkc: "\u{B2D0}", - nfkd: "\u{1102}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{B2D1}", - nfc: "\u{B2D1}", - nfd: "\u{1102}\u{1175}\u{11B0}", - nfkc: "\u{B2D1}", - nfkd: "\u{1102}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{B2D2}", - nfc: "\u{B2D2}", - nfd: "\u{1102}\u{1175}\u{11B1}", - nfkc: "\u{B2D2}", - nfkd: "\u{1102}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{B2D3}", - nfc: "\u{B2D3}", - nfd: "\u{1102}\u{1175}\u{11B2}", - nfkc: "\u{B2D3}", - nfkd: "\u{1102}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{B2D4}", - nfc: "\u{B2D4}", - nfd: "\u{1102}\u{1175}\u{11B3}", - nfkc: "\u{B2D4}", - nfkd: "\u{1102}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{B2D5}", - nfc: "\u{B2D5}", - nfd: "\u{1102}\u{1175}\u{11B4}", - nfkc: "\u{B2D5}", - nfkd: "\u{1102}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{B2D6}", - nfc: "\u{B2D6}", - nfd: "\u{1102}\u{1175}\u{11B5}", - nfkc: "\u{B2D6}", - nfkd: "\u{1102}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{B2D7}", - nfc: "\u{B2D7}", - nfd: "\u{1102}\u{1175}\u{11B6}", - nfkc: "\u{B2D7}", - nfkd: "\u{1102}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{B2D8}", - nfc: "\u{B2D8}", - nfd: "\u{1102}\u{1175}\u{11B7}", - nfkc: "\u{B2D8}", - nfkd: "\u{1102}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{B2D9}", - nfc: "\u{B2D9}", - nfd: "\u{1102}\u{1175}\u{11B8}", - nfkc: "\u{B2D9}", - nfkd: "\u{1102}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{B2DA}", - nfc: "\u{B2DA}", - nfd: "\u{1102}\u{1175}\u{11B9}", - nfkc: "\u{B2DA}", - nfkd: "\u{1102}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{B2DB}", - nfc: "\u{B2DB}", - nfd: "\u{1102}\u{1175}\u{11BA}", - nfkc: "\u{B2DB}", - nfkd: "\u{1102}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{B2DC}", - nfc: "\u{B2DC}", - nfd: "\u{1102}\u{1175}\u{11BB}", - nfkc: "\u{B2DC}", - nfkd: "\u{1102}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{B2DD}", - nfc: "\u{B2DD}", - nfd: "\u{1102}\u{1175}\u{11BC}", - nfkc: "\u{B2DD}", - nfkd: "\u{1102}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{B2DE}", - nfc: "\u{B2DE}", - nfd: "\u{1102}\u{1175}\u{11BD}", - nfkc: "\u{B2DE}", - nfkd: "\u{1102}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{B2DF}", - nfc: "\u{B2DF}", - nfd: "\u{1102}\u{1175}\u{11BE}", - nfkc: "\u{B2DF}", - nfkd: "\u{1102}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{B2E0}", - nfc: "\u{B2E0}", - nfd: "\u{1102}\u{1175}\u{11BF}", - nfkc: "\u{B2E0}", - nfkd: "\u{1102}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{B2E1}", - nfc: "\u{B2E1}", - nfd: "\u{1102}\u{1175}\u{11C0}", - nfkc: "\u{B2E1}", - nfkd: "\u{1102}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{B2E2}", - nfc: "\u{B2E2}", - nfd: "\u{1102}\u{1175}\u{11C1}", - nfkc: "\u{B2E2}", - nfkd: "\u{1102}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{B2E3}", - nfc: "\u{B2E3}", - nfd: "\u{1102}\u{1175}\u{11C2}", - nfkc: "\u{B2E3}", - nfkd: "\u{1102}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{B2E4}", - nfc: "\u{B2E4}", - nfd: "\u{1103}\u{1161}", - nfkc: "\u{B2E4}", - nfkd: "\u{1103}\u{1161}", - }, - NormalizationTest { - source: "\u{B2E5}", - nfc: "\u{B2E5}", - nfd: "\u{1103}\u{1161}\u{11A8}", - nfkc: "\u{B2E5}", - nfkd: "\u{1103}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{B2E6}", - nfc: "\u{B2E6}", - nfd: "\u{1103}\u{1161}\u{11A9}", - nfkc: "\u{B2E6}", - nfkd: "\u{1103}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{B2E7}", - nfc: "\u{B2E7}", - nfd: "\u{1103}\u{1161}\u{11AA}", - nfkc: "\u{B2E7}", - nfkd: "\u{1103}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{B2E8}", - nfc: "\u{B2E8}", - nfd: "\u{1103}\u{1161}\u{11AB}", - nfkc: "\u{B2E8}", - nfkd: "\u{1103}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{B2E9}", - nfc: "\u{B2E9}", - nfd: "\u{1103}\u{1161}\u{11AC}", - nfkc: "\u{B2E9}", - nfkd: "\u{1103}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{B2EA}", - nfc: "\u{B2EA}", - nfd: "\u{1103}\u{1161}\u{11AD}", - nfkc: "\u{B2EA}", - nfkd: "\u{1103}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{B2EB}", - nfc: "\u{B2EB}", - nfd: "\u{1103}\u{1161}\u{11AE}", - nfkc: "\u{B2EB}", - nfkd: "\u{1103}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{B2EC}", - nfc: "\u{B2EC}", - nfd: "\u{1103}\u{1161}\u{11AF}", - nfkc: "\u{B2EC}", - nfkd: "\u{1103}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{B2ED}", - nfc: "\u{B2ED}", - nfd: "\u{1103}\u{1161}\u{11B0}", - nfkc: "\u{B2ED}", - nfkd: "\u{1103}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{B2EE}", - nfc: "\u{B2EE}", - nfd: "\u{1103}\u{1161}\u{11B1}", - nfkc: "\u{B2EE}", - nfkd: "\u{1103}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{B2EF}", - nfc: "\u{B2EF}", - nfd: "\u{1103}\u{1161}\u{11B2}", - nfkc: "\u{B2EF}", - nfkd: "\u{1103}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{B2F0}", - nfc: "\u{B2F0}", - nfd: "\u{1103}\u{1161}\u{11B3}", - nfkc: "\u{B2F0}", - nfkd: "\u{1103}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{B2F1}", - nfc: "\u{B2F1}", - nfd: "\u{1103}\u{1161}\u{11B4}", - nfkc: "\u{B2F1}", - nfkd: "\u{1103}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{B2F2}", - nfc: "\u{B2F2}", - nfd: "\u{1103}\u{1161}\u{11B5}", - nfkc: "\u{B2F2}", - nfkd: "\u{1103}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{B2F3}", - nfc: "\u{B2F3}", - nfd: "\u{1103}\u{1161}\u{11B6}", - nfkc: "\u{B2F3}", - nfkd: "\u{1103}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{B2F4}", - nfc: "\u{B2F4}", - nfd: "\u{1103}\u{1161}\u{11B7}", - nfkc: "\u{B2F4}", - nfkd: "\u{1103}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{B2F5}", - nfc: "\u{B2F5}", - nfd: "\u{1103}\u{1161}\u{11B8}", - nfkc: "\u{B2F5}", - nfkd: "\u{1103}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{B2F6}", - nfc: "\u{B2F6}", - nfd: "\u{1103}\u{1161}\u{11B9}", - nfkc: "\u{B2F6}", - nfkd: "\u{1103}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{B2F7}", - nfc: "\u{B2F7}", - nfd: "\u{1103}\u{1161}\u{11BA}", - nfkc: "\u{B2F7}", - nfkd: "\u{1103}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{B2F8}", - nfc: "\u{B2F8}", - nfd: "\u{1103}\u{1161}\u{11BB}", - nfkc: "\u{B2F8}", - nfkd: "\u{1103}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{B2F9}", - nfc: "\u{B2F9}", - nfd: "\u{1103}\u{1161}\u{11BC}", - nfkc: "\u{B2F9}", - nfkd: "\u{1103}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{B2FA}", - nfc: "\u{B2FA}", - nfd: "\u{1103}\u{1161}\u{11BD}", - nfkc: "\u{B2FA}", - nfkd: "\u{1103}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{B2FB}", - nfc: "\u{B2FB}", - nfd: "\u{1103}\u{1161}\u{11BE}", - nfkc: "\u{B2FB}", - nfkd: "\u{1103}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{B2FC}", - nfc: "\u{B2FC}", - nfd: "\u{1103}\u{1161}\u{11BF}", - nfkc: "\u{B2FC}", - nfkd: "\u{1103}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{B2FD}", - nfc: "\u{B2FD}", - nfd: "\u{1103}\u{1161}\u{11C0}", - nfkc: "\u{B2FD}", - nfkd: "\u{1103}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{B2FE}", - nfc: "\u{B2FE}", - nfd: "\u{1103}\u{1161}\u{11C1}", - nfkc: "\u{B2FE}", - nfkd: "\u{1103}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{B2FF}", - nfc: "\u{B2FF}", - nfd: "\u{1103}\u{1161}\u{11C2}", - nfkc: "\u{B2FF}", - nfkd: "\u{1103}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{B300}", - nfc: "\u{B300}", - nfd: "\u{1103}\u{1162}", - nfkc: "\u{B300}", - nfkd: "\u{1103}\u{1162}", - }, - NormalizationTest { - source: "\u{B301}", - nfc: "\u{B301}", - nfd: "\u{1103}\u{1162}\u{11A8}", - nfkc: "\u{B301}", - nfkd: "\u{1103}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{B302}", - nfc: "\u{B302}", - nfd: "\u{1103}\u{1162}\u{11A9}", - nfkc: "\u{B302}", - nfkd: "\u{1103}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{B303}", - nfc: "\u{B303}", - nfd: "\u{1103}\u{1162}\u{11AA}", - nfkc: "\u{B303}", - nfkd: "\u{1103}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{B304}", - nfc: "\u{B304}", - nfd: "\u{1103}\u{1162}\u{11AB}", - nfkc: "\u{B304}", - nfkd: "\u{1103}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{B305}", - nfc: "\u{B305}", - nfd: "\u{1103}\u{1162}\u{11AC}", - nfkc: "\u{B305}", - nfkd: "\u{1103}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{B306}", - nfc: "\u{B306}", - nfd: "\u{1103}\u{1162}\u{11AD}", - nfkc: "\u{B306}", - nfkd: "\u{1103}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{B307}", - nfc: "\u{B307}", - nfd: "\u{1103}\u{1162}\u{11AE}", - nfkc: "\u{B307}", - nfkd: "\u{1103}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{B308}", - nfc: "\u{B308}", - nfd: "\u{1103}\u{1162}\u{11AF}", - nfkc: "\u{B308}", - nfkd: "\u{1103}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{B309}", - nfc: "\u{B309}", - nfd: "\u{1103}\u{1162}\u{11B0}", - nfkc: "\u{B309}", - nfkd: "\u{1103}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{B30A}", - nfc: "\u{B30A}", - nfd: "\u{1103}\u{1162}\u{11B1}", - nfkc: "\u{B30A}", - nfkd: "\u{1103}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{B30B}", - nfc: "\u{B30B}", - nfd: "\u{1103}\u{1162}\u{11B2}", - nfkc: "\u{B30B}", - nfkd: "\u{1103}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{B30C}", - nfc: "\u{B30C}", - nfd: "\u{1103}\u{1162}\u{11B3}", - nfkc: "\u{B30C}", - nfkd: "\u{1103}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{B30D}", - nfc: "\u{B30D}", - nfd: "\u{1103}\u{1162}\u{11B4}", - nfkc: "\u{B30D}", - nfkd: "\u{1103}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{B30E}", - nfc: "\u{B30E}", - nfd: "\u{1103}\u{1162}\u{11B5}", - nfkc: "\u{B30E}", - nfkd: "\u{1103}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{B30F}", - nfc: "\u{B30F}", - nfd: "\u{1103}\u{1162}\u{11B6}", - nfkc: "\u{B30F}", - nfkd: "\u{1103}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{B310}", - nfc: "\u{B310}", - nfd: "\u{1103}\u{1162}\u{11B7}", - nfkc: "\u{B310}", - nfkd: "\u{1103}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{B311}", - nfc: "\u{B311}", - nfd: "\u{1103}\u{1162}\u{11B8}", - nfkc: "\u{B311}", - nfkd: "\u{1103}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{B312}", - nfc: "\u{B312}", - nfd: "\u{1103}\u{1162}\u{11B9}", - nfkc: "\u{B312}", - nfkd: "\u{1103}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{B313}", - nfc: "\u{B313}", - nfd: "\u{1103}\u{1162}\u{11BA}", - nfkc: "\u{B313}", - nfkd: "\u{1103}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{B314}", - nfc: "\u{B314}", - nfd: "\u{1103}\u{1162}\u{11BB}", - nfkc: "\u{B314}", - nfkd: "\u{1103}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{B315}", - nfc: "\u{B315}", - nfd: "\u{1103}\u{1162}\u{11BC}", - nfkc: "\u{B315}", - nfkd: "\u{1103}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{B316}", - nfc: "\u{B316}", - nfd: "\u{1103}\u{1162}\u{11BD}", - nfkc: "\u{B316}", - nfkd: "\u{1103}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{B317}", - nfc: "\u{B317}", - nfd: "\u{1103}\u{1162}\u{11BE}", - nfkc: "\u{B317}", - nfkd: "\u{1103}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{B318}", - nfc: "\u{B318}", - nfd: "\u{1103}\u{1162}\u{11BF}", - nfkc: "\u{B318}", - nfkd: "\u{1103}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{B319}", - nfc: "\u{B319}", - nfd: "\u{1103}\u{1162}\u{11C0}", - nfkc: "\u{B319}", - nfkd: "\u{1103}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{B31A}", - nfc: "\u{B31A}", - nfd: "\u{1103}\u{1162}\u{11C1}", - nfkc: "\u{B31A}", - nfkd: "\u{1103}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{B31B}", - nfc: "\u{B31B}", - nfd: "\u{1103}\u{1162}\u{11C2}", - nfkc: "\u{B31B}", - nfkd: "\u{1103}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{B31C}", - nfc: "\u{B31C}", - nfd: "\u{1103}\u{1163}", - nfkc: "\u{B31C}", - nfkd: "\u{1103}\u{1163}", - }, - NormalizationTest { - source: "\u{B31D}", - nfc: "\u{B31D}", - nfd: "\u{1103}\u{1163}\u{11A8}", - nfkc: "\u{B31D}", - nfkd: "\u{1103}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{B31E}", - nfc: "\u{B31E}", - nfd: "\u{1103}\u{1163}\u{11A9}", - nfkc: "\u{B31E}", - nfkd: "\u{1103}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{B31F}", - nfc: "\u{B31F}", - nfd: "\u{1103}\u{1163}\u{11AA}", - nfkc: "\u{B31F}", - nfkd: "\u{1103}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{B320}", - nfc: "\u{B320}", - nfd: "\u{1103}\u{1163}\u{11AB}", - nfkc: "\u{B320}", - nfkd: "\u{1103}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{B321}", - nfc: "\u{B321}", - nfd: "\u{1103}\u{1163}\u{11AC}", - nfkc: "\u{B321}", - nfkd: "\u{1103}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{B322}", - nfc: "\u{B322}", - nfd: "\u{1103}\u{1163}\u{11AD}", - nfkc: "\u{B322}", - nfkd: "\u{1103}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{B323}", - nfc: "\u{B323}", - nfd: "\u{1103}\u{1163}\u{11AE}", - nfkc: "\u{B323}", - nfkd: "\u{1103}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{B324}", - nfc: "\u{B324}", - nfd: "\u{1103}\u{1163}\u{11AF}", - nfkc: "\u{B324}", - nfkd: "\u{1103}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{B325}", - nfc: "\u{B325}", - nfd: "\u{1103}\u{1163}\u{11B0}", - nfkc: "\u{B325}", - nfkd: "\u{1103}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{B326}", - nfc: "\u{B326}", - nfd: "\u{1103}\u{1163}\u{11B1}", - nfkc: "\u{B326}", - nfkd: "\u{1103}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{B327}", - nfc: "\u{B327}", - nfd: "\u{1103}\u{1163}\u{11B2}", - nfkc: "\u{B327}", - nfkd: "\u{1103}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{B328}", - nfc: "\u{B328}", - nfd: "\u{1103}\u{1163}\u{11B3}", - nfkc: "\u{B328}", - nfkd: "\u{1103}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{B329}", - nfc: "\u{B329}", - nfd: "\u{1103}\u{1163}\u{11B4}", - nfkc: "\u{B329}", - nfkd: "\u{1103}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{B32A}", - nfc: "\u{B32A}", - nfd: "\u{1103}\u{1163}\u{11B5}", - nfkc: "\u{B32A}", - nfkd: "\u{1103}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{B32B}", - nfc: "\u{B32B}", - nfd: "\u{1103}\u{1163}\u{11B6}", - nfkc: "\u{B32B}", - nfkd: "\u{1103}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{B32C}", - nfc: "\u{B32C}", - nfd: "\u{1103}\u{1163}\u{11B7}", - nfkc: "\u{B32C}", - nfkd: "\u{1103}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{B32D}", - nfc: "\u{B32D}", - nfd: "\u{1103}\u{1163}\u{11B8}", - nfkc: "\u{B32D}", - nfkd: "\u{1103}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{B32E}", - nfc: "\u{B32E}", - nfd: "\u{1103}\u{1163}\u{11B9}", - nfkc: "\u{B32E}", - nfkd: "\u{1103}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{B32F}", - nfc: "\u{B32F}", - nfd: "\u{1103}\u{1163}\u{11BA}", - nfkc: "\u{B32F}", - nfkd: "\u{1103}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{B330}", - nfc: "\u{B330}", - nfd: "\u{1103}\u{1163}\u{11BB}", - nfkc: "\u{B330}", - nfkd: "\u{1103}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{B331}", - nfc: "\u{B331}", - nfd: "\u{1103}\u{1163}\u{11BC}", - nfkc: "\u{B331}", - nfkd: "\u{1103}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{B332}", - nfc: "\u{B332}", - nfd: "\u{1103}\u{1163}\u{11BD}", - nfkc: "\u{B332}", - nfkd: "\u{1103}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{B333}", - nfc: "\u{B333}", - nfd: "\u{1103}\u{1163}\u{11BE}", - nfkc: "\u{B333}", - nfkd: "\u{1103}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{B334}", - nfc: "\u{B334}", - nfd: "\u{1103}\u{1163}\u{11BF}", - nfkc: "\u{B334}", - nfkd: "\u{1103}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{B335}", - nfc: "\u{B335}", - nfd: "\u{1103}\u{1163}\u{11C0}", - nfkc: "\u{B335}", - nfkd: "\u{1103}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{B336}", - nfc: "\u{B336}", - nfd: "\u{1103}\u{1163}\u{11C1}", - nfkc: "\u{B336}", - nfkd: "\u{1103}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{B337}", - nfc: "\u{B337}", - nfd: "\u{1103}\u{1163}\u{11C2}", - nfkc: "\u{B337}", - nfkd: "\u{1103}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{B338}", - nfc: "\u{B338}", - nfd: "\u{1103}\u{1164}", - nfkc: "\u{B338}", - nfkd: "\u{1103}\u{1164}", - }, - NormalizationTest { - source: "\u{B339}", - nfc: "\u{B339}", - nfd: "\u{1103}\u{1164}\u{11A8}", - nfkc: "\u{B339}", - nfkd: "\u{1103}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{B33A}", - nfc: "\u{B33A}", - nfd: "\u{1103}\u{1164}\u{11A9}", - nfkc: "\u{B33A}", - nfkd: "\u{1103}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{B33B}", - nfc: "\u{B33B}", - nfd: "\u{1103}\u{1164}\u{11AA}", - nfkc: "\u{B33B}", - nfkd: "\u{1103}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{B33C}", - nfc: "\u{B33C}", - nfd: "\u{1103}\u{1164}\u{11AB}", - nfkc: "\u{B33C}", - nfkd: "\u{1103}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{B33D}", - nfc: "\u{B33D}", - nfd: "\u{1103}\u{1164}\u{11AC}", - nfkc: "\u{B33D}", - nfkd: "\u{1103}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{B33E}", - nfc: "\u{B33E}", - nfd: "\u{1103}\u{1164}\u{11AD}", - nfkc: "\u{B33E}", - nfkd: "\u{1103}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{B33F}", - nfc: "\u{B33F}", - nfd: "\u{1103}\u{1164}\u{11AE}", - nfkc: "\u{B33F}", - nfkd: "\u{1103}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{B340}", - nfc: "\u{B340}", - nfd: "\u{1103}\u{1164}\u{11AF}", - nfkc: "\u{B340}", - nfkd: "\u{1103}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{B341}", - nfc: "\u{B341}", - nfd: "\u{1103}\u{1164}\u{11B0}", - nfkc: "\u{B341}", - nfkd: "\u{1103}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{B342}", - nfc: "\u{B342}", - nfd: "\u{1103}\u{1164}\u{11B1}", - nfkc: "\u{B342}", - nfkd: "\u{1103}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{B343}", - nfc: "\u{B343}", - nfd: "\u{1103}\u{1164}\u{11B2}", - nfkc: "\u{B343}", - nfkd: "\u{1103}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{B344}", - nfc: "\u{B344}", - nfd: "\u{1103}\u{1164}\u{11B3}", - nfkc: "\u{B344}", - nfkd: "\u{1103}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{B345}", - nfc: "\u{B345}", - nfd: "\u{1103}\u{1164}\u{11B4}", - nfkc: "\u{B345}", - nfkd: "\u{1103}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{B346}", - nfc: "\u{B346}", - nfd: "\u{1103}\u{1164}\u{11B5}", - nfkc: "\u{B346}", - nfkd: "\u{1103}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{B347}", - nfc: "\u{B347}", - nfd: "\u{1103}\u{1164}\u{11B6}", - nfkc: "\u{B347}", - nfkd: "\u{1103}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{B348}", - nfc: "\u{B348}", - nfd: "\u{1103}\u{1164}\u{11B7}", - nfkc: "\u{B348}", - nfkd: "\u{1103}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{B349}", - nfc: "\u{B349}", - nfd: "\u{1103}\u{1164}\u{11B8}", - nfkc: "\u{B349}", - nfkd: "\u{1103}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{B34A}", - nfc: "\u{B34A}", - nfd: "\u{1103}\u{1164}\u{11B9}", - nfkc: "\u{B34A}", - nfkd: "\u{1103}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{B34B}", - nfc: "\u{B34B}", - nfd: "\u{1103}\u{1164}\u{11BA}", - nfkc: "\u{B34B}", - nfkd: "\u{1103}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{B34C}", - nfc: "\u{B34C}", - nfd: "\u{1103}\u{1164}\u{11BB}", - nfkc: "\u{B34C}", - nfkd: "\u{1103}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{B34D}", - nfc: "\u{B34D}", - nfd: "\u{1103}\u{1164}\u{11BC}", - nfkc: "\u{B34D}", - nfkd: "\u{1103}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{B34E}", - nfc: "\u{B34E}", - nfd: "\u{1103}\u{1164}\u{11BD}", - nfkc: "\u{B34E}", - nfkd: "\u{1103}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{B34F}", - nfc: "\u{B34F}", - nfd: "\u{1103}\u{1164}\u{11BE}", - nfkc: "\u{B34F}", - nfkd: "\u{1103}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{B350}", - nfc: "\u{B350}", - nfd: "\u{1103}\u{1164}\u{11BF}", - nfkc: "\u{B350}", - nfkd: "\u{1103}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{B351}", - nfc: "\u{B351}", - nfd: "\u{1103}\u{1164}\u{11C0}", - nfkc: "\u{B351}", - nfkd: "\u{1103}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{B352}", - nfc: "\u{B352}", - nfd: "\u{1103}\u{1164}\u{11C1}", - nfkc: "\u{B352}", - nfkd: "\u{1103}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{B353}", - nfc: "\u{B353}", - nfd: "\u{1103}\u{1164}\u{11C2}", - nfkc: "\u{B353}", - nfkd: "\u{1103}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{B354}", - nfc: "\u{B354}", - nfd: "\u{1103}\u{1165}", - nfkc: "\u{B354}", - nfkd: "\u{1103}\u{1165}", - }, - NormalizationTest { - source: "\u{B355}", - nfc: "\u{B355}", - nfd: "\u{1103}\u{1165}\u{11A8}", - nfkc: "\u{B355}", - nfkd: "\u{1103}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{B356}", - nfc: "\u{B356}", - nfd: "\u{1103}\u{1165}\u{11A9}", - nfkc: "\u{B356}", - nfkd: "\u{1103}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{B357}", - nfc: "\u{B357}", - nfd: "\u{1103}\u{1165}\u{11AA}", - nfkc: "\u{B357}", - nfkd: "\u{1103}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{B358}", - nfc: "\u{B358}", - nfd: "\u{1103}\u{1165}\u{11AB}", - nfkc: "\u{B358}", - nfkd: "\u{1103}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{B359}", - nfc: "\u{B359}", - nfd: "\u{1103}\u{1165}\u{11AC}", - nfkc: "\u{B359}", - nfkd: "\u{1103}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{B35A}", - nfc: "\u{B35A}", - nfd: "\u{1103}\u{1165}\u{11AD}", - nfkc: "\u{B35A}", - nfkd: "\u{1103}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{B35B}", - nfc: "\u{B35B}", - nfd: "\u{1103}\u{1165}\u{11AE}", - nfkc: "\u{B35B}", - nfkd: "\u{1103}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{B35C}", - nfc: "\u{B35C}", - nfd: "\u{1103}\u{1165}\u{11AF}", - nfkc: "\u{B35C}", - nfkd: "\u{1103}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{B35D}", - nfc: "\u{B35D}", - nfd: "\u{1103}\u{1165}\u{11B0}", - nfkc: "\u{B35D}", - nfkd: "\u{1103}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{B35E}", - nfc: "\u{B35E}", - nfd: "\u{1103}\u{1165}\u{11B1}", - nfkc: "\u{B35E}", - nfkd: "\u{1103}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{B35F}", - nfc: "\u{B35F}", - nfd: "\u{1103}\u{1165}\u{11B2}", - nfkc: "\u{B35F}", - nfkd: "\u{1103}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{B360}", - nfc: "\u{B360}", - nfd: "\u{1103}\u{1165}\u{11B3}", - nfkc: "\u{B360}", - nfkd: "\u{1103}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{B361}", - nfc: "\u{B361}", - nfd: "\u{1103}\u{1165}\u{11B4}", - nfkc: "\u{B361}", - nfkd: "\u{1103}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{B362}", - nfc: "\u{B362}", - nfd: "\u{1103}\u{1165}\u{11B5}", - nfkc: "\u{B362}", - nfkd: "\u{1103}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{B363}", - nfc: "\u{B363}", - nfd: "\u{1103}\u{1165}\u{11B6}", - nfkc: "\u{B363}", - nfkd: "\u{1103}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{B364}", - nfc: "\u{B364}", - nfd: "\u{1103}\u{1165}\u{11B7}", - nfkc: "\u{B364}", - nfkd: "\u{1103}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{B365}", - nfc: "\u{B365}", - nfd: "\u{1103}\u{1165}\u{11B8}", - nfkc: "\u{B365}", - nfkd: "\u{1103}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{B366}", - nfc: "\u{B366}", - nfd: "\u{1103}\u{1165}\u{11B9}", - nfkc: "\u{B366}", - nfkd: "\u{1103}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{B367}", - nfc: "\u{B367}", - nfd: "\u{1103}\u{1165}\u{11BA}", - nfkc: "\u{B367}", - nfkd: "\u{1103}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{B368}", - nfc: "\u{B368}", - nfd: "\u{1103}\u{1165}\u{11BB}", - nfkc: "\u{B368}", - nfkd: "\u{1103}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{B369}", - nfc: "\u{B369}", - nfd: "\u{1103}\u{1165}\u{11BC}", - nfkc: "\u{B369}", - nfkd: "\u{1103}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{B36A}", - nfc: "\u{B36A}", - nfd: "\u{1103}\u{1165}\u{11BD}", - nfkc: "\u{B36A}", - nfkd: "\u{1103}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{B36B}", - nfc: "\u{B36B}", - nfd: "\u{1103}\u{1165}\u{11BE}", - nfkc: "\u{B36B}", - nfkd: "\u{1103}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{B36C}", - nfc: "\u{B36C}", - nfd: "\u{1103}\u{1165}\u{11BF}", - nfkc: "\u{B36C}", - nfkd: "\u{1103}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{B36D}", - nfc: "\u{B36D}", - nfd: "\u{1103}\u{1165}\u{11C0}", - nfkc: "\u{B36D}", - nfkd: "\u{1103}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{B36E}", - nfc: "\u{B36E}", - nfd: "\u{1103}\u{1165}\u{11C1}", - nfkc: "\u{B36E}", - nfkd: "\u{1103}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{B36F}", - nfc: "\u{B36F}", - nfd: "\u{1103}\u{1165}\u{11C2}", - nfkc: "\u{B36F}", - nfkd: "\u{1103}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{B370}", - nfc: "\u{B370}", - nfd: "\u{1103}\u{1166}", - nfkc: "\u{B370}", - nfkd: "\u{1103}\u{1166}", - }, - NormalizationTest { - source: "\u{B371}", - nfc: "\u{B371}", - nfd: "\u{1103}\u{1166}\u{11A8}", - nfkc: "\u{B371}", - nfkd: "\u{1103}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{B372}", - nfc: "\u{B372}", - nfd: "\u{1103}\u{1166}\u{11A9}", - nfkc: "\u{B372}", - nfkd: "\u{1103}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{B373}", - nfc: "\u{B373}", - nfd: "\u{1103}\u{1166}\u{11AA}", - nfkc: "\u{B373}", - nfkd: "\u{1103}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{B374}", - nfc: "\u{B374}", - nfd: "\u{1103}\u{1166}\u{11AB}", - nfkc: "\u{B374}", - nfkd: "\u{1103}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{B375}", - nfc: "\u{B375}", - nfd: "\u{1103}\u{1166}\u{11AC}", - nfkc: "\u{B375}", - nfkd: "\u{1103}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{B376}", - nfc: "\u{B376}", - nfd: "\u{1103}\u{1166}\u{11AD}", - nfkc: "\u{B376}", - nfkd: "\u{1103}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{B377}", - nfc: "\u{B377}", - nfd: "\u{1103}\u{1166}\u{11AE}", - nfkc: "\u{B377}", - nfkd: "\u{1103}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{B378}", - nfc: "\u{B378}", - nfd: "\u{1103}\u{1166}\u{11AF}", - nfkc: "\u{B378}", - nfkd: "\u{1103}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{B379}", - nfc: "\u{B379}", - nfd: "\u{1103}\u{1166}\u{11B0}", - nfkc: "\u{B379}", - nfkd: "\u{1103}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{B37A}", - nfc: "\u{B37A}", - nfd: "\u{1103}\u{1166}\u{11B1}", - nfkc: "\u{B37A}", - nfkd: "\u{1103}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{B37B}", - nfc: "\u{B37B}", - nfd: "\u{1103}\u{1166}\u{11B2}", - nfkc: "\u{B37B}", - nfkd: "\u{1103}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{B37C}", - nfc: "\u{B37C}", - nfd: "\u{1103}\u{1166}\u{11B3}", - nfkc: "\u{B37C}", - nfkd: "\u{1103}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{B37D}", - nfc: "\u{B37D}", - nfd: "\u{1103}\u{1166}\u{11B4}", - nfkc: "\u{B37D}", - nfkd: "\u{1103}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{B37E}", - nfc: "\u{B37E}", - nfd: "\u{1103}\u{1166}\u{11B5}", - nfkc: "\u{B37E}", - nfkd: "\u{1103}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{B37F}", - nfc: "\u{B37F}", - nfd: "\u{1103}\u{1166}\u{11B6}", - nfkc: "\u{B37F}", - nfkd: "\u{1103}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{B380}", - nfc: "\u{B380}", - nfd: "\u{1103}\u{1166}\u{11B7}", - nfkc: "\u{B380}", - nfkd: "\u{1103}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{B381}", - nfc: "\u{B381}", - nfd: "\u{1103}\u{1166}\u{11B8}", - nfkc: "\u{B381}", - nfkd: "\u{1103}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{B382}", - nfc: "\u{B382}", - nfd: "\u{1103}\u{1166}\u{11B9}", - nfkc: "\u{B382}", - nfkd: "\u{1103}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{B383}", - nfc: "\u{B383}", - nfd: "\u{1103}\u{1166}\u{11BA}", - nfkc: "\u{B383}", - nfkd: "\u{1103}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{B384}", - nfc: "\u{B384}", - nfd: "\u{1103}\u{1166}\u{11BB}", - nfkc: "\u{B384}", - nfkd: "\u{1103}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{B385}", - nfc: "\u{B385}", - nfd: "\u{1103}\u{1166}\u{11BC}", - nfkc: "\u{B385}", - nfkd: "\u{1103}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{B386}", - nfc: "\u{B386}", - nfd: "\u{1103}\u{1166}\u{11BD}", - nfkc: "\u{B386}", - nfkd: "\u{1103}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{B387}", - nfc: "\u{B387}", - nfd: "\u{1103}\u{1166}\u{11BE}", - nfkc: "\u{B387}", - nfkd: "\u{1103}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{B388}", - nfc: "\u{B388}", - nfd: "\u{1103}\u{1166}\u{11BF}", - nfkc: "\u{B388}", - nfkd: "\u{1103}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{B389}", - nfc: "\u{B389}", - nfd: "\u{1103}\u{1166}\u{11C0}", - nfkc: "\u{B389}", - nfkd: "\u{1103}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{B38A}", - nfc: "\u{B38A}", - nfd: "\u{1103}\u{1166}\u{11C1}", - nfkc: "\u{B38A}", - nfkd: "\u{1103}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{B38B}", - nfc: "\u{B38B}", - nfd: "\u{1103}\u{1166}\u{11C2}", - nfkc: "\u{B38B}", - nfkd: "\u{1103}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{B38C}", - nfc: "\u{B38C}", - nfd: "\u{1103}\u{1167}", - nfkc: "\u{B38C}", - nfkd: "\u{1103}\u{1167}", - }, - NormalizationTest { - source: "\u{B38D}", - nfc: "\u{B38D}", - nfd: "\u{1103}\u{1167}\u{11A8}", - nfkc: "\u{B38D}", - nfkd: "\u{1103}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{B38E}", - nfc: "\u{B38E}", - nfd: "\u{1103}\u{1167}\u{11A9}", - nfkc: "\u{B38E}", - nfkd: "\u{1103}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{B38F}", - nfc: "\u{B38F}", - nfd: "\u{1103}\u{1167}\u{11AA}", - nfkc: "\u{B38F}", - nfkd: "\u{1103}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{B390}", - nfc: "\u{B390}", - nfd: "\u{1103}\u{1167}\u{11AB}", - nfkc: "\u{B390}", - nfkd: "\u{1103}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{B391}", - nfc: "\u{B391}", - nfd: "\u{1103}\u{1167}\u{11AC}", - nfkc: "\u{B391}", - nfkd: "\u{1103}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{B392}", - nfc: "\u{B392}", - nfd: "\u{1103}\u{1167}\u{11AD}", - nfkc: "\u{B392}", - nfkd: "\u{1103}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{B393}", - nfc: "\u{B393}", - nfd: "\u{1103}\u{1167}\u{11AE}", - nfkc: "\u{B393}", - nfkd: "\u{1103}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{B394}", - nfc: "\u{B394}", - nfd: "\u{1103}\u{1167}\u{11AF}", - nfkc: "\u{B394}", - nfkd: "\u{1103}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{B395}", - nfc: "\u{B395}", - nfd: "\u{1103}\u{1167}\u{11B0}", - nfkc: "\u{B395}", - nfkd: "\u{1103}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{B396}", - nfc: "\u{B396}", - nfd: "\u{1103}\u{1167}\u{11B1}", - nfkc: "\u{B396}", - nfkd: "\u{1103}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{B397}", - nfc: "\u{B397}", - nfd: "\u{1103}\u{1167}\u{11B2}", - nfkc: "\u{B397}", - nfkd: "\u{1103}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{B398}", - nfc: "\u{B398}", - nfd: "\u{1103}\u{1167}\u{11B3}", - nfkc: "\u{B398}", - nfkd: "\u{1103}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{B399}", - nfc: "\u{B399}", - nfd: "\u{1103}\u{1167}\u{11B4}", - nfkc: "\u{B399}", - nfkd: "\u{1103}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{B39A}", - nfc: "\u{B39A}", - nfd: "\u{1103}\u{1167}\u{11B5}", - nfkc: "\u{B39A}", - nfkd: "\u{1103}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{B39B}", - nfc: "\u{B39B}", - nfd: "\u{1103}\u{1167}\u{11B6}", - nfkc: "\u{B39B}", - nfkd: "\u{1103}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{B39C}", - nfc: "\u{B39C}", - nfd: "\u{1103}\u{1167}\u{11B7}", - nfkc: "\u{B39C}", - nfkd: "\u{1103}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{B39D}", - nfc: "\u{B39D}", - nfd: "\u{1103}\u{1167}\u{11B8}", - nfkc: "\u{B39D}", - nfkd: "\u{1103}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{B39E}", - nfc: "\u{B39E}", - nfd: "\u{1103}\u{1167}\u{11B9}", - nfkc: "\u{B39E}", - nfkd: "\u{1103}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{B39F}", - nfc: "\u{B39F}", - nfd: "\u{1103}\u{1167}\u{11BA}", - nfkc: "\u{B39F}", - nfkd: "\u{1103}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{B3A0}", - nfc: "\u{B3A0}", - nfd: "\u{1103}\u{1167}\u{11BB}", - nfkc: "\u{B3A0}", - nfkd: "\u{1103}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{B3A1}", - nfc: "\u{B3A1}", - nfd: "\u{1103}\u{1167}\u{11BC}", - nfkc: "\u{B3A1}", - nfkd: "\u{1103}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{B3A2}", - nfc: "\u{B3A2}", - nfd: "\u{1103}\u{1167}\u{11BD}", - nfkc: "\u{B3A2}", - nfkd: "\u{1103}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{B3A3}", - nfc: "\u{B3A3}", - nfd: "\u{1103}\u{1167}\u{11BE}", - nfkc: "\u{B3A3}", - nfkd: "\u{1103}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{B3A4}", - nfc: "\u{B3A4}", - nfd: "\u{1103}\u{1167}\u{11BF}", - nfkc: "\u{B3A4}", - nfkd: "\u{1103}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{B3A5}", - nfc: "\u{B3A5}", - nfd: "\u{1103}\u{1167}\u{11C0}", - nfkc: "\u{B3A5}", - nfkd: "\u{1103}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{B3A6}", - nfc: "\u{B3A6}", - nfd: "\u{1103}\u{1167}\u{11C1}", - nfkc: "\u{B3A6}", - nfkd: "\u{1103}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{B3A7}", - nfc: "\u{B3A7}", - nfd: "\u{1103}\u{1167}\u{11C2}", - nfkc: "\u{B3A7}", - nfkd: "\u{1103}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{B3A8}", - nfc: "\u{B3A8}", - nfd: "\u{1103}\u{1168}", - nfkc: "\u{B3A8}", - nfkd: "\u{1103}\u{1168}", - }, - NormalizationTest { - source: "\u{B3A9}", - nfc: "\u{B3A9}", - nfd: "\u{1103}\u{1168}\u{11A8}", - nfkc: "\u{B3A9}", - nfkd: "\u{1103}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{B3AA}", - nfc: "\u{B3AA}", - nfd: "\u{1103}\u{1168}\u{11A9}", - nfkc: "\u{B3AA}", - nfkd: "\u{1103}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{B3AB}", - nfc: "\u{B3AB}", - nfd: "\u{1103}\u{1168}\u{11AA}", - nfkc: "\u{B3AB}", - nfkd: "\u{1103}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{B3AC}", - nfc: "\u{B3AC}", - nfd: "\u{1103}\u{1168}\u{11AB}", - nfkc: "\u{B3AC}", - nfkd: "\u{1103}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{B3AD}", - nfc: "\u{B3AD}", - nfd: "\u{1103}\u{1168}\u{11AC}", - nfkc: "\u{B3AD}", - nfkd: "\u{1103}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{B3AE}", - nfc: "\u{B3AE}", - nfd: "\u{1103}\u{1168}\u{11AD}", - nfkc: "\u{B3AE}", - nfkd: "\u{1103}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{B3AF}", - nfc: "\u{B3AF}", - nfd: "\u{1103}\u{1168}\u{11AE}", - nfkc: "\u{B3AF}", - nfkd: "\u{1103}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{B3B0}", - nfc: "\u{B3B0}", - nfd: "\u{1103}\u{1168}\u{11AF}", - nfkc: "\u{B3B0}", - nfkd: "\u{1103}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{B3B1}", - nfc: "\u{B3B1}", - nfd: "\u{1103}\u{1168}\u{11B0}", - nfkc: "\u{B3B1}", - nfkd: "\u{1103}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{B3B2}", - nfc: "\u{B3B2}", - nfd: "\u{1103}\u{1168}\u{11B1}", - nfkc: "\u{B3B2}", - nfkd: "\u{1103}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{B3B3}", - nfc: "\u{B3B3}", - nfd: "\u{1103}\u{1168}\u{11B2}", - nfkc: "\u{B3B3}", - nfkd: "\u{1103}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{B3B4}", - nfc: "\u{B3B4}", - nfd: "\u{1103}\u{1168}\u{11B3}", - nfkc: "\u{B3B4}", - nfkd: "\u{1103}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{B3B5}", - nfc: "\u{B3B5}", - nfd: "\u{1103}\u{1168}\u{11B4}", - nfkc: "\u{B3B5}", - nfkd: "\u{1103}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{B3B6}", - nfc: "\u{B3B6}", - nfd: "\u{1103}\u{1168}\u{11B5}", - nfkc: "\u{B3B6}", - nfkd: "\u{1103}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{B3B7}", - nfc: "\u{B3B7}", - nfd: "\u{1103}\u{1168}\u{11B6}", - nfkc: "\u{B3B7}", - nfkd: "\u{1103}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{B3B8}", - nfc: "\u{B3B8}", - nfd: "\u{1103}\u{1168}\u{11B7}", - nfkc: "\u{B3B8}", - nfkd: "\u{1103}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{B3B9}", - nfc: "\u{B3B9}", - nfd: "\u{1103}\u{1168}\u{11B8}", - nfkc: "\u{B3B9}", - nfkd: "\u{1103}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{B3BA}", - nfc: "\u{B3BA}", - nfd: "\u{1103}\u{1168}\u{11B9}", - nfkc: "\u{B3BA}", - nfkd: "\u{1103}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{B3BB}", - nfc: "\u{B3BB}", - nfd: "\u{1103}\u{1168}\u{11BA}", - nfkc: "\u{B3BB}", - nfkd: "\u{1103}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{B3BC}", - nfc: "\u{B3BC}", - nfd: "\u{1103}\u{1168}\u{11BB}", - nfkc: "\u{B3BC}", - nfkd: "\u{1103}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{B3BD}", - nfc: "\u{B3BD}", - nfd: "\u{1103}\u{1168}\u{11BC}", - nfkc: "\u{B3BD}", - nfkd: "\u{1103}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{B3BE}", - nfc: "\u{B3BE}", - nfd: "\u{1103}\u{1168}\u{11BD}", - nfkc: "\u{B3BE}", - nfkd: "\u{1103}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{B3BF}", - nfc: "\u{B3BF}", - nfd: "\u{1103}\u{1168}\u{11BE}", - nfkc: "\u{B3BF}", - nfkd: "\u{1103}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{B3C0}", - nfc: "\u{B3C0}", - nfd: "\u{1103}\u{1168}\u{11BF}", - nfkc: "\u{B3C0}", - nfkd: "\u{1103}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{B3C1}", - nfc: "\u{B3C1}", - nfd: "\u{1103}\u{1168}\u{11C0}", - nfkc: "\u{B3C1}", - nfkd: "\u{1103}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{B3C2}", - nfc: "\u{B3C2}", - nfd: "\u{1103}\u{1168}\u{11C1}", - nfkc: "\u{B3C2}", - nfkd: "\u{1103}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{B3C3}", - nfc: "\u{B3C3}", - nfd: "\u{1103}\u{1168}\u{11C2}", - nfkc: "\u{B3C3}", - nfkd: "\u{1103}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{B3C4}", - nfc: "\u{B3C4}", - nfd: "\u{1103}\u{1169}", - nfkc: "\u{B3C4}", - nfkd: "\u{1103}\u{1169}", - }, - NormalizationTest { - source: "\u{B3C5}", - nfc: "\u{B3C5}", - nfd: "\u{1103}\u{1169}\u{11A8}", - nfkc: "\u{B3C5}", - nfkd: "\u{1103}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{B3C6}", - nfc: "\u{B3C6}", - nfd: "\u{1103}\u{1169}\u{11A9}", - nfkc: "\u{B3C6}", - nfkd: "\u{1103}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{B3C7}", - nfc: "\u{B3C7}", - nfd: "\u{1103}\u{1169}\u{11AA}", - nfkc: "\u{B3C7}", - nfkd: "\u{1103}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{B3C8}", - nfc: "\u{B3C8}", - nfd: "\u{1103}\u{1169}\u{11AB}", - nfkc: "\u{B3C8}", - nfkd: "\u{1103}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{B3C9}", - nfc: "\u{B3C9}", - nfd: "\u{1103}\u{1169}\u{11AC}", - nfkc: "\u{B3C9}", - nfkd: "\u{1103}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{B3CA}", - nfc: "\u{B3CA}", - nfd: "\u{1103}\u{1169}\u{11AD}", - nfkc: "\u{B3CA}", - nfkd: "\u{1103}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{B3CB}", - nfc: "\u{B3CB}", - nfd: "\u{1103}\u{1169}\u{11AE}", - nfkc: "\u{B3CB}", - nfkd: "\u{1103}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{B3CC}", - nfc: "\u{B3CC}", - nfd: "\u{1103}\u{1169}\u{11AF}", - nfkc: "\u{B3CC}", - nfkd: "\u{1103}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{B3CD}", - nfc: "\u{B3CD}", - nfd: "\u{1103}\u{1169}\u{11B0}", - nfkc: "\u{B3CD}", - nfkd: "\u{1103}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{B3CE}", - nfc: "\u{B3CE}", - nfd: "\u{1103}\u{1169}\u{11B1}", - nfkc: "\u{B3CE}", - nfkd: "\u{1103}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{B3CF}", - nfc: "\u{B3CF}", - nfd: "\u{1103}\u{1169}\u{11B2}", - nfkc: "\u{B3CF}", - nfkd: "\u{1103}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{B3D0}", - nfc: "\u{B3D0}", - nfd: "\u{1103}\u{1169}\u{11B3}", - nfkc: "\u{B3D0}", - nfkd: "\u{1103}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{B3D1}", - nfc: "\u{B3D1}", - nfd: "\u{1103}\u{1169}\u{11B4}", - nfkc: "\u{B3D1}", - nfkd: "\u{1103}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{B3D2}", - nfc: "\u{B3D2}", - nfd: "\u{1103}\u{1169}\u{11B5}", - nfkc: "\u{B3D2}", - nfkd: "\u{1103}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{B3D3}", - nfc: "\u{B3D3}", - nfd: "\u{1103}\u{1169}\u{11B6}", - nfkc: "\u{B3D3}", - nfkd: "\u{1103}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{B3D4}", - nfc: "\u{B3D4}", - nfd: "\u{1103}\u{1169}\u{11B7}", - nfkc: "\u{B3D4}", - nfkd: "\u{1103}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{B3D5}", - nfc: "\u{B3D5}", - nfd: "\u{1103}\u{1169}\u{11B8}", - nfkc: "\u{B3D5}", - nfkd: "\u{1103}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{B3D6}", - nfc: "\u{B3D6}", - nfd: "\u{1103}\u{1169}\u{11B9}", - nfkc: "\u{B3D6}", - nfkd: "\u{1103}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{B3D7}", - nfc: "\u{B3D7}", - nfd: "\u{1103}\u{1169}\u{11BA}", - nfkc: "\u{B3D7}", - nfkd: "\u{1103}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{B3D8}", - nfc: "\u{B3D8}", - nfd: "\u{1103}\u{1169}\u{11BB}", - nfkc: "\u{B3D8}", - nfkd: "\u{1103}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{B3D9}", - nfc: "\u{B3D9}", - nfd: "\u{1103}\u{1169}\u{11BC}", - nfkc: "\u{B3D9}", - nfkd: "\u{1103}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{B3DA}", - nfc: "\u{B3DA}", - nfd: "\u{1103}\u{1169}\u{11BD}", - nfkc: "\u{B3DA}", - nfkd: "\u{1103}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{B3DB}", - nfc: "\u{B3DB}", - nfd: "\u{1103}\u{1169}\u{11BE}", - nfkc: "\u{B3DB}", - nfkd: "\u{1103}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{B3DC}", - nfc: "\u{B3DC}", - nfd: "\u{1103}\u{1169}\u{11BF}", - nfkc: "\u{B3DC}", - nfkd: "\u{1103}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{B3DD}", - nfc: "\u{B3DD}", - nfd: "\u{1103}\u{1169}\u{11C0}", - nfkc: "\u{B3DD}", - nfkd: "\u{1103}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{B3DE}", - nfc: "\u{B3DE}", - nfd: "\u{1103}\u{1169}\u{11C1}", - nfkc: "\u{B3DE}", - nfkd: "\u{1103}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{B3DF}", - nfc: "\u{B3DF}", - nfd: "\u{1103}\u{1169}\u{11C2}", - nfkc: "\u{B3DF}", - nfkd: "\u{1103}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{B3E0}", - nfc: "\u{B3E0}", - nfd: "\u{1103}\u{116A}", - nfkc: "\u{B3E0}", - nfkd: "\u{1103}\u{116A}", - }, - NormalizationTest { - source: "\u{B3E1}", - nfc: "\u{B3E1}", - nfd: "\u{1103}\u{116A}\u{11A8}", - nfkc: "\u{B3E1}", - nfkd: "\u{1103}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{B3E2}", - nfc: "\u{B3E2}", - nfd: "\u{1103}\u{116A}\u{11A9}", - nfkc: "\u{B3E2}", - nfkd: "\u{1103}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{B3E3}", - nfc: "\u{B3E3}", - nfd: "\u{1103}\u{116A}\u{11AA}", - nfkc: "\u{B3E3}", - nfkd: "\u{1103}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{B3E4}", - nfc: "\u{B3E4}", - nfd: "\u{1103}\u{116A}\u{11AB}", - nfkc: "\u{B3E4}", - nfkd: "\u{1103}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{B3E5}", - nfc: "\u{B3E5}", - nfd: "\u{1103}\u{116A}\u{11AC}", - nfkc: "\u{B3E5}", - nfkd: "\u{1103}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{B3E6}", - nfc: "\u{B3E6}", - nfd: "\u{1103}\u{116A}\u{11AD}", - nfkc: "\u{B3E6}", - nfkd: "\u{1103}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{B3E7}", - nfc: "\u{B3E7}", - nfd: "\u{1103}\u{116A}\u{11AE}", - nfkc: "\u{B3E7}", - nfkd: "\u{1103}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{B3E8}", - nfc: "\u{B3E8}", - nfd: "\u{1103}\u{116A}\u{11AF}", - nfkc: "\u{B3E8}", - nfkd: "\u{1103}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{B3E9}", - nfc: "\u{B3E9}", - nfd: "\u{1103}\u{116A}\u{11B0}", - nfkc: "\u{B3E9}", - nfkd: "\u{1103}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{B3EA}", - nfc: "\u{B3EA}", - nfd: "\u{1103}\u{116A}\u{11B1}", - nfkc: "\u{B3EA}", - nfkd: "\u{1103}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{B3EB}", - nfc: "\u{B3EB}", - nfd: "\u{1103}\u{116A}\u{11B2}", - nfkc: "\u{B3EB}", - nfkd: "\u{1103}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{B3EC}", - nfc: "\u{B3EC}", - nfd: "\u{1103}\u{116A}\u{11B3}", - nfkc: "\u{B3EC}", - nfkd: "\u{1103}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{B3ED}", - nfc: "\u{B3ED}", - nfd: "\u{1103}\u{116A}\u{11B4}", - nfkc: "\u{B3ED}", - nfkd: "\u{1103}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{B3EE}", - nfc: "\u{B3EE}", - nfd: "\u{1103}\u{116A}\u{11B5}", - nfkc: "\u{B3EE}", - nfkd: "\u{1103}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{B3EF}", - nfc: "\u{B3EF}", - nfd: "\u{1103}\u{116A}\u{11B6}", - nfkc: "\u{B3EF}", - nfkd: "\u{1103}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{B3F0}", - nfc: "\u{B3F0}", - nfd: "\u{1103}\u{116A}\u{11B7}", - nfkc: "\u{B3F0}", - nfkd: "\u{1103}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{B3F1}", - nfc: "\u{B3F1}", - nfd: "\u{1103}\u{116A}\u{11B8}", - nfkc: "\u{B3F1}", - nfkd: "\u{1103}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{B3F2}", - nfc: "\u{B3F2}", - nfd: "\u{1103}\u{116A}\u{11B9}", - nfkc: "\u{B3F2}", - nfkd: "\u{1103}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{B3F3}", - nfc: "\u{B3F3}", - nfd: "\u{1103}\u{116A}\u{11BA}", - nfkc: "\u{B3F3}", - nfkd: "\u{1103}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{B3F4}", - nfc: "\u{B3F4}", - nfd: "\u{1103}\u{116A}\u{11BB}", - nfkc: "\u{B3F4}", - nfkd: "\u{1103}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{B3F5}", - nfc: "\u{B3F5}", - nfd: "\u{1103}\u{116A}\u{11BC}", - nfkc: "\u{B3F5}", - nfkd: "\u{1103}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{B3F6}", - nfc: "\u{B3F6}", - nfd: "\u{1103}\u{116A}\u{11BD}", - nfkc: "\u{B3F6}", - nfkd: "\u{1103}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{B3F7}", - nfc: "\u{B3F7}", - nfd: "\u{1103}\u{116A}\u{11BE}", - nfkc: "\u{B3F7}", - nfkd: "\u{1103}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{B3F8}", - nfc: "\u{B3F8}", - nfd: "\u{1103}\u{116A}\u{11BF}", - nfkc: "\u{B3F8}", - nfkd: "\u{1103}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{B3F9}", - nfc: "\u{B3F9}", - nfd: "\u{1103}\u{116A}\u{11C0}", - nfkc: "\u{B3F9}", - nfkd: "\u{1103}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{B3FA}", - nfc: "\u{B3FA}", - nfd: "\u{1103}\u{116A}\u{11C1}", - nfkc: "\u{B3FA}", - nfkd: "\u{1103}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{B3FB}", - nfc: "\u{B3FB}", - nfd: "\u{1103}\u{116A}\u{11C2}", - nfkc: "\u{B3FB}", - nfkd: "\u{1103}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{B3FC}", - nfc: "\u{B3FC}", - nfd: "\u{1103}\u{116B}", - nfkc: "\u{B3FC}", - nfkd: "\u{1103}\u{116B}", - }, - NormalizationTest { - source: "\u{B3FD}", - nfc: "\u{B3FD}", - nfd: "\u{1103}\u{116B}\u{11A8}", - nfkc: "\u{B3FD}", - nfkd: "\u{1103}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{B3FE}", - nfc: "\u{B3FE}", - nfd: "\u{1103}\u{116B}\u{11A9}", - nfkc: "\u{B3FE}", - nfkd: "\u{1103}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{B3FF}", - nfc: "\u{B3FF}", - nfd: "\u{1103}\u{116B}\u{11AA}", - nfkc: "\u{B3FF}", - nfkd: "\u{1103}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{B400}", - nfc: "\u{B400}", - nfd: "\u{1103}\u{116B}\u{11AB}", - nfkc: "\u{B400}", - nfkd: "\u{1103}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{B401}", - nfc: "\u{B401}", - nfd: "\u{1103}\u{116B}\u{11AC}", - nfkc: "\u{B401}", - nfkd: "\u{1103}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{B402}", - nfc: "\u{B402}", - nfd: "\u{1103}\u{116B}\u{11AD}", - nfkc: "\u{B402}", - nfkd: "\u{1103}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{B403}", - nfc: "\u{B403}", - nfd: "\u{1103}\u{116B}\u{11AE}", - nfkc: "\u{B403}", - nfkd: "\u{1103}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{B404}", - nfc: "\u{B404}", - nfd: "\u{1103}\u{116B}\u{11AF}", - nfkc: "\u{B404}", - nfkd: "\u{1103}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{B405}", - nfc: "\u{B405}", - nfd: "\u{1103}\u{116B}\u{11B0}", - nfkc: "\u{B405}", - nfkd: "\u{1103}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{B406}", - nfc: "\u{B406}", - nfd: "\u{1103}\u{116B}\u{11B1}", - nfkc: "\u{B406}", - nfkd: "\u{1103}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{B407}", - nfc: "\u{B407}", - nfd: "\u{1103}\u{116B}\u{11B2}", - nfkc: "\u{B407}", - nfkd: "\u{1103}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{B408}", - nfc: "\u{B408}", - nfd: "\u{1103}\u{116B}\u{11B3}", - nfkc: "\u{B408}", - nfkd: "\u{1103}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{B409}", - nfc: "\u{B409}", - nfd: "\u{1103}\u{116B}\u{11B4}", - nfkc: "\u{B409}", - nfkd: "\u{1103}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{B40A}", - nfc: "\u{B40A}", - nfd: "\u{1103}\u{116B}\u{11B5}", - nfkc: "\u{B40A}", - nfkd: "\u{1103}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{B40B}", - nfc: "\u{B40B}", - nfd: "\u{1103}\u{116B}\u{11B6}", - nfkc: "\u{B40B}", - nfkd: "\u{1103}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{B40C}", - nfc: "\u{B40C}", - nfd: "\u{1103}\u{116B}\u{11B7}", - nfkc: "\u{B40C}", - nfkd: "\u{1103}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{B40D}", - nfc: "\u{B40D}", - nfd: "\u{1103}\u{116B}\u{11B8}", - nfkc: "\u{B40D}", - nfkd: "\u{1103}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{B40E}", - nfc: "\u{B40E}", - nfd: "\u{1103}\u{116B}\u{11B9}", - nfkc: "\u{B40E}", - nfkd: "\u{1103}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{B40F}", - nfc: "\u{B40F}", - nfd: "\u{1103}\u{116B}\u{11BA}", - nfkc: "\u{B40F}", - nfkd: "\u{1103}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{B410}", - nfc: "\u{B410}", - nfd: "\u{1103}\u{116B}\u{11BB}", - nfkc: "\u{B410}", - nfkd: "\u{1103}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{B411}", - nfc: "\u{B411}", - nfd: "\u{1103}\u{116B}\u{11BC}", - nfkc: "\u{B411}", - nfkd: "\u{1103}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{B412}", - nfc: "\u{B412}", - nfd: "\u{1103}\u{116B}\u{11BD}", - nfkc: "\u{B412}", - nfkd: "\u{1103}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{B413}", - nfc: "\u{B413}", - nfd: "\u{1103}\u{116B}\u{11BE}", - nfkc: "\u{B413}", - nfkd: "\u{1103}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{B414}", - nfc: "\u{B414}", - nfd: "\u{1103}\u{116B}\u{11BF}", - nfkc: "\u{B414}", - nfkd: "\u{1103}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{B415}", - nfc: "\u{B415}", - nfd: "\u{1103}\u{116B}\u{11C0}", - nfkc: "\u{B415}", - nfkd: "\u{1103}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{B416}", - nfc: "\u{B416}", - nfd: "\u{1103}\u{116B}\u{11C1}", - nfkc: "\u{B416}", - nfkd: "\u{1103}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{B417}", - nfc: "\u{B417}", - nfd: "\u{1103}\u{116B}\u{11C2}", - nfkc: "\u{B417}", - nfkd: "\u{1103}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{B418}", - nfc: "\u{B418}", - nfd: "\u{1103}\u{116C}", - nfkc: "\u{B418}", - nfkd: "\u{1103}\u{116C}", - }, - NormalizationTest { - source: "\u{B419}", - nfc: "\u{B419}", - nfd: "\u{1103}\u{116C}\u{11A8}", - nfkc: "\u{B419}", - nfkd: "\u{1103}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{B41A}", - nfc: "\u{B41A}", - nfd: "\u{1103}\u{116C}\u{11A9}", - nfkc: "\u{B41A}", - nfkd: "\u{1103}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{B41B}", - nfc: "\u{B41B}", - nfd: "\u{1103}\u{116C}\u{11AA}", - nfkc: "\u{B41B}", - nfkd: "\u{1103}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{B41C}", - nfc: "\u{B41C}", - nfd: "\u{1103}\u{116C}\u{11AB}", - nfkc: "\u{B41C}", - nfkd: "\u{1103}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{B41D}", - nfc: "\u{B41D}", - nfd: "\u{1103}\u{116C}\u{11AC}", - nfkc: "\u{B41D}", - nfkd: "\u{1103}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{B41E}", - nfc: "\u{B41E}", - nfd: "\u{1103}\u{116C}\u{11AD}", - nfkc: "\u{B41E}", - nfkd: "\u{1103}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{B41F}", - nfc: "\u{B41F}", - nfd: "\u{1103}\u{116C}\u{11AE}", - nfkc: "\u{B41F}", - nfkd: "\u{1103}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{B420}", - nfc: "\u{B420}", - nfd: "\u{1103}\u{116C}\u{11AF}", - nfkc: "\u{B420}", - nfkd: "\u{1103}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{B421}", - nfc: "\u{B421}", - nfd: "\u{1103}\u{116C}\u{11B0}", - nfkc: "\u{B421}", - nfkd: "\u{1103}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{B422}", - nfc: "\u{B422}", - nfd: "\u{1103}\u{116C}\u{11B1}", - nfkc: "\u{B422}", - nfkd: "\u{1103}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{B423}", - nfc: "\u{B423}", - nfd: "\u{1103}\u{116C}\u{11B2}", - nfkc: "\u{B423}", - nfkd: "\u{1103}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{B424}", - nfc: "\u{B424}", - nfd: "\u{1103}\u{116C}\u{11B3}", - nfkc: "\u{B424}", - nfkd: "\u{1103}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{B425}", - nfc: "\u{B425}", - nfd: "\u{1103}\u{116C}\u{11B4}", - nfkc: "\u{B425}", - nfkd: "\u{1103}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{B426}", - nfc: "\u{B426}", - nfd: "\u{1103}\u{116C}\u{11B5}", - nfkc: "\u{B426}", - nfkd: "\u{1103}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{B427}", - nfc: "\u{B427}", - nfd: "\u{1103}\u{116C}\u{11B6}", - nfkc: "\u{B427}", - nfkd: "\u{1103}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{B428}", - nfc: "\u{B428}", - nfd: "\u{1103}\u{116C}\u{11B7}", - nfkc: "\u{B428}", - nfkd: "\u{1103}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{B429}", - nfc: "\u{B429}", - nfd: "\u{1103}\u{116C}\u{11B8}", - nfkc: "\u{B429}", - nfkd: "\u{1103}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{B42A}", - nfc: "\u{B42A}", - nfd: "\u{1103}\u{116C}\u{11B9}", - nfkc: "\u{B42A}", - nfkd: "\u{1103}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{B42B}", - nfc: "\u{B42B}", - nfd: "\u{1103}\u{116C}\u{11BA}", - nfkc: "\u{B42B}", - nfkd: "\u{1103}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{B42C}", - nfc: "\u{B42C}", - nfd: "\u{1103}\u{116C}\u{11BB}", - nfkc: "\u{B42C}", - nfkd: "\u{1103}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{B42D}", - nfc: "\u{B42D}", - nfd: "\u{1103}\u{116C}\u{11BC}", - nfkc: "\u{B42D}", - nfkd: "\u{1103}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{B42E}", - nfc: "\u{B42E}", - nfd: "\u{1103}\u{116C}\u{11BD}", - nfkc: "\u{B42E}", - nfkd: "\u{1103}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{B42F}", - nfc: "\u{B42F}", - nfd: "\u{1103}\u{116C}\u{11BE}", - nfkc: "\u{B42F}", - nfkd: "\u{1103}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{B430}", - nfc: "\u{B430}", - nfd: "\u{1103}\u{116C}\u{11BF}", - nfkc: "\u{B430}", - nfkd: "\u{1103}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{B431}", - nfc: "\u{B431}", - nfd: "\u{1103}\u{116C}\u{11C0}", - nfkc: "\u{B431}", - nfkd: "\u{1103}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{B432}", - nfc: "\u{B432}", - nfd: "\u{1103}\u{116C}\u{11C1}", - nfkc: "\u{B432}", - nfkd: "\u{1103}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{B433}", - nfc: "\u{B433}", - nfd: "\u{1103}\u{116C}\u{11C2}", - nfkc: "\u{B433}", - nfkd: "\u{1103}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{B434}", - nfc: "\u{B434}", - nfd: "\u{1103}\u{116D}", - nfkc: "\u{B434}", - nfkd: "\u{1103}\u{116D}", - }, - NormalizationTest { - source: "\u{B435}", - nfc: "\u{B435}", - nfd: "\u{1103}\u{116D}\u{11A8}", - nfkc: "\u{B435}", - nfkd: "\u{1103}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{B436}", - nfc: "\u{B436}", - nfd: "\u{1103}\u{116D}\u{11A9}", - nfkc: "\u{B436}", - nfkd: "\u{1103}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{B437}", - nfc: "\u{B437}", - nfd: "\u{1103}\u{116D}\u{11AA}", - nfkc: "\u{B437}", - nfkd: "\u{1103}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{B438}", - nfc: "\u{B438}", - nfd: "\u{1103}\u{116D}\u{11AB}", - nfkc: "\u{B438}", - nfkd: "\u{1103}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{B439}", - nfc: "\u{B439}", - nfd: "\u{1103}\u{116D}\u{11AC}", - nfkc: "\u{B439}", - nfkd: "\u{1103}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{B43A}", - nfc: "\u{B43A}", - nfd: "\u{1103}\u{116D}\u{11AD}", - nfkc: "\u{B43A}", - nfkd: "\u{1103}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{B43B}", - nfc: "\u{B43B}", - nfd: "\u{1103}\u{116D}\u{11AE}", - nfkc: "\u{B43B}", - nfkd: "\u{1103}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{B43C}", - nfc: "\u{B43C}", - nfd: "\u{1103}\u{116D}\u{11AF}", - nfkc: "\u{B43C}", - nfkd: "\u{1103}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{B43D}", - nfc: "\u{B43D}", - nfd: "\u{1103}\u{116D}\u{11B0}", - nfkc: "\u{B43D}", - nfkd: "\u{1103}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{B43E}", - nfc: "\u{B43E}", - nfd: "\u{1103}\u{116D}\u{11B1}", - nfkc: "\u{B43E}", - nfkd: "\u{1103}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{B43F}", - nfc: "\u{B43F}", - nfd: "\u{1103}\u{116D}\u{11B2}", - nfkc: "\u{B43F}", - nfkd: "\u{1103}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{B440}", - nfc: "\u{B440}", - nfd: "\u{1103}\u{116D}\u{11B3}", - nfkc: "\u{B440}", - nfkd: "\u{1103}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{B441}", - nfc: "\u{B441}", - nfd: "\u{1103}\u{116D}\u{11B4}", - nfkc: "\u{B441}", - nfkd: "\u{1103}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{B442}", - nfc: "\u{B442}", - nfd: "\u{1103}\u{116D}\u{11B5}", - nfkc: "\u{B442}", - nfkd: "\u{1103}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{B443}", - nfc: "\u{B443}", - nfd: "\u{1103}\u{116D}\u{11B6}", - nfkc: "\u{B443}", - nfkd: "\u{1103}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{B444}", - nfc: "\u{B444}", - nfd: "\u{1103}\u{116D}\u{11B7}", - nfkc: "\u{B444}", - nfkd: "\u{1103}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{B445}", - nfc: "\u{B445}", - nfd: "\u{1103}\u{116D}\u{11B8}", - nfkc: "\u{B445}", - nfkd: "\u{1103}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{B446}", - nfc: "\u{B446}", - nfd: "\u{1103}\u{116D}\u{11B9}", - nfkc: "\u{B446}", - nfkd: "\u{1103}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{B447}", - nfc: "\u{B447}", - nfd: "\u{1103}\u{116D}\u{11BA}", - nfkc: "\u{B447}", - nfkd: "\u{1103}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{B448}", - nfc: "\u{B448}", - nfd: "\u{1103}\u{116D}\u{11BB}", - nfkc: "\u{B448}", - nfkd: "\u{1103}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{B449}", - nfc: "\u{B449}", - nfd: "\u{1103}\u{116D}\u{11BC}", - nfkc: "\u{B449}", - nfkd: "\u{1103}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{B44A}", - nfc: "\u{B44A}", - nfd: "\u{1103}\u{116D}\u{11BD}", - nfkc: "\u{B44A}", - nfkd: "\u{1103}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{B44B}", - nfc: "\u{B44B}", - nfd: "\u{1103}\u{116D}\u{11BE}", - nfkc: "\u{B44B}", - nfkd: "\u{1103}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{B44C}", - nfc: "\u{B44C}", - nfd: "\u{1103}\u{116D}\u{11BF}", - nfkc: "\u{B44C}", - nfkd: "\u{1103}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{B44D}", - nfc: "\u{B44D}", - nfd: "\u{1103}\u{116D}\u{11C0}", - nfkc: "\u{B44D}", - nfkd: "\u{1103}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{B44E}", - nfc: "\u{B44E}", - nfd: "\u{1103}\u{116D}\u{11C1}", - nfkc: "\u{B44E}", - nfkd: "\u{1103}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{B44F}", - nfc: "\u{B44F}", - nfd: "\u{1103}\u{116D}\u{11C2}", - nfkc: "\u{B44F}", - nfkd: "\u{1103}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{B450}", - nfc: "\u{B450}", - nfd: "\u{1103}\u{116E}", - nfkc: "\u{B450}", - nfkd: "\u{1103}\u{116E}", - }, - NormalizationTest { - source: "\u{B451}", - nfc: "\u{B451}", - nfd: "\u{1103}\u{116E}\u{11A8}", - nfkc: "\u{B451}", - nfkd: "\u{1103}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{B452}", - nfc: "\u{B452}", - nfd: "\u{1103}\u{116E}\u{11A9}", - nfkc: "\u{B452}", - nfkd: "\u{1103}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{B453}", - nfc: "\u{B453}", - nfd: "\u{1103}\u{116E}\u{11AA}", - nfkc: "\u{B453}", - nfkd: "\u{1103}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{B454}", - nfc: "\u{B454}", - nfd: "\u{1103}\u{116E}\u{11AB}", - nfkc: "\u{B454}", - nfkd: "\u{1103}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{B455}", - nfc: "\u{B455}", - nfd: "\u{1103}\u{116E}\u{11AC}", - nfkc: "\u{B455}", - nfkd: "\u{1103}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{B456}", - nfc: "\u{B456}", - nfd: "\u{1103}\u{116E}\u{11AD}", - nfkc: "\u{B456}", - nfkd: "\u{1103}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{B457}", - nfc: "\u{B457}", - nfd: "\u{1103}\u{116E}\u{11AE}", - nfkc: "\u{B457}", - nfkd: "\u{1103}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{B458}", - nfc: "\u{B458}", - nfd: "\u{1103}\u{116E}\u{11AF}", - nfkc: "\u{B458}", - nfkd: "\u{1103}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{B459}", - nfc: "\u{B459}", - nfd: "\u{1103}\u{116E}\u{11B0}", - nfkc: "\u{B459}", - nfkd: "\u{1103}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{B45A}", - nfc: "\u{B45A}", - nfd: "\u{1103}\u{116E}\u{11B1}", - nfkc: "\u{B45A}", - nfkd: "\u{1103}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{B45B}", - nfc: "\u{B45B}", - nfd: "\u{1103}\u{116E}\u{11B2}", - nfkc: "\u{B45B}", - nfkd: "\u{1103}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{B45C}", - nfc: "\u{B45C}", - nfd: "\u{1103}\u{116E}\u{11B3}", - nfkc: "\u{B45C}", - nfkd: "\u{1103}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{B45D}", - nfc: "\u{B45D}", - nfd: "\u{1103}\u{116E}\u{11B4}", - nfkc: "\u{B45D}", - nfkd: "\u{1103}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{B45E}", - nfc: "\u{B45E}", - nfd: "\u{1103}\u{116E}\u{11B5}", - nfkc: "\u{B45E}", - nfkd: "\u{1103}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{B45F}", - nfc: "\u{B45F}", - nfd: "\u{1103}\u{116E}\u{11B6}", - nfkc: "\u{B45F}", - nfkd: "\u{1103}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{B460}", - nfc: "\u{B460}", - nfd: "\u{1103}\u{116E}\u{11B7}", - nfkc: "\u{B460}", - nfkd: "\u{1103}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{B461}", - nfc: "\u{B461}", - nfd: "\u{1103}\u{116E}\u{11B8}", - nfkc: "\u{B461}", - nfkd: "\u{1103}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{B462}", - nfc: "\u{B462}", - nfd: "\u{1103}\u{116E}\u{11B9}", - nfkc: "\u{B462}", - nfkd: "\u{1103}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{B463}", - nfc: "\u{B463}", - nfd: "\u{1103}\u{116E}\u{11BA}", - nfkc: "\u{B463}", - nfkd: "\u{1103}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{B464}", - nfc: "\u{B464}", - nfd: "\u{1103}\u{116E}\u{11BB}", - nfkc: "\u{B464}", - nfkd: "\u{1103}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{B465}", - nfc: "\u{B465}", - nfd: "\u{1103}\u{116E}\u{11BC}", - nfkc: "\u{B465}", - nfkd: "\u{1103}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{B466}", - nfc: "\u{B466}", - nfd: "\u{1103}\u{116E}\u{11BD}", - nfkc: "\u{B466}", - nfkd: "\u{1103}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{B467}", - nfc: "\u{B467}", - nfd: "\u{1103}\u{116E}\u{11BE}", - nfkc: "\u{B467}", - nfkd: "\u{1103}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{B468}", - nfc: "\u{B468}", - nfd: "\u{1103}\u{116E}\u{11BF}", - nfkc: "\u{B468}", - nfkd: "\u{1103}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{B469}", - nfc: "\u{B469}", - nfd: "\u{1103}\u{116E}\u{11C0}", - nfkc: "\u{B469}", - nfkd: "\u{1103}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{B46A}", - nfc: "\u{B46A}", - nfd: "\u{1103}\u{116E}\u{11C1}", - nfkc: "\u{B46A}", - nfkd: "\u{1103}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{B46B}", - nfc: "\u{B46B}", - nfd: "\u{1103}\u{116E}\u{11C2}", - nfkc: "\u{B46B}", - nfkd: "\u{1103}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{B46C}", - nfc: "\u{B46C}", - nfd: "\u{1103}\u{116F}", - nfkc: "\u{B46C}", - nfkd: "\u{1103}\u{116F}", - }, - NormalizationTest { - source: "\u{B46D}", - nfc: "\u{B46D}", - nfd: "\u{1103}\u{116F}\u{11A8}", - nfkc: "\u{B46D}", - nfkd: "\u{1103}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{B46E}", - nfc: "\u{B46E}", - nfd: "\u{1103}\u{116F}\u{11A9}", - nfkc: "\u{B46E}", - nfkd: "\u{1103}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{B46F}", - nfc: "\u{B46F}", - nfd: "\u{1103}\u{116F}\u{11AA}", - nfkc: "\u{B46F}", - nfkd: "\u{1103}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{B470}", - nfc: "\u{B470}", - nfd: "\u{1103}\u{116F}\u{11AB}", - nfkc: "\u{B470}", - nfkd: "\u{1103}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{B471}", - nfc: "\u{B471}", - nfd: "\u{1103}\u{116F}\u{11AC}", - nfkc: "\u{B471}", - nfkd: "\u{1103}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{B472}", - nfc: "\u{B472}", - nfd: "\u{1103}\u{116F}\u{11AD}", - nfkc: "\u{B472}", - nfkd: "\u{1103}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{B473}", - nfc: "\u{B473}", - nfd: "\u{1103}\u{116F}\u{11AE}", - nfkc: "\u{B473}", - nfkd: "\u{1103}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{B474}", - nfc: "\u{B474}", - nfd: "\u{1103}\u{116F}\u{11AF}", - nfkc: "\u{B474}", - nfkd: "\u{1103}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{B475}", - nfc: "\u{B475}", - nfd: "\u{1103}\u{116F}\u{11B0}", - nfkc: "\u{B475}", - nfkd: "\u{1103}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{B476}", - nfc: "\u{B476}", - nfd: "\u{1103}\u{116F}\u{11B1}", - nfkc: "\u{B476}", - nfkd: "\u{1103}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{B477}", - nfc: "\u{B477}", - nfd: "\u{1103}\u{116F}\u{11B2}", - nfkc: "\u{B477}", - nfkd: "\u{1103}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{B478}", - nfc: "\u{B478}", - nfd: "\u{1103}\u{116F}\u{11B3}", - nfkc: "\u{B478}", - nfkd: "\u{1103}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{B479}", - nfc: "\u{B479}", - nfd: "\u{1103}\u{116F}\u{11B4}", - nfkc: "\u{B479}", - nfkd: "\u{1103}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{B47A}", - nfc: "\u{B47A}", - nfd: "\u{1103}\u{116F}\u{11B5}", - nfkc: "\u{B47A}", - nfkd: "\u{1103}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{B47B}", - nfc: "\u{B47B}", - nfd: "\u{1103}\u{116F}\u{11B6}", - nfkc: "\u{B47B}", - nfkd: "\u{1103}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{B47C}", - nfc: "\u{B47C}", - nfd: "\u{1103}\u{116F}\u{11B7}", - nfkc: "\u{B47C}", - nfkd: "\u{1103}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{B47D}", - nfc: "\u{B47D}", - nfd: "\u{1103}\u{116F}\u{11B8}", - nfkc: "\u{B47D}", - nfkd: "\u{1103}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{B47E}", - nfc: "\u{B47E}", - nfd: "\u{1103}\u{116F}\u{11B9}", - nfkc: "\u{B47E}", - nfkd: "\u{1103}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{B47F}", - nfc: "\u{B47F}", - nfd: "\u{1103}\u{116F}\u{11BA}", - nfkc: "\u{B47F}", - nfkd: "\u{1103}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{B480}", - nfc: "\u{B480}", - nfd: "\u{1103}\u{116F}\u{11BB}", - nfkc: "\u{B480}", - nfkd: "\u{1103}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{B481}", - nfc: "\u{B481}", - nfd: "\u{1103}\u{116F}\u{11BC}", - nfkc: "\u{B481}", - nfkd: "\u{1103}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{B482}", - nfc: "\u{B482}", - nfd: "\u{1103}\u{116F}\u{11BD}", - nfkc: "\u{B482}", - nfkd: "\u{1103}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{B483}", - nfc: "\u{B483}", - nfd: "\u{1103}\u{116F}\u{11BE}", - nfkc: "\u{B483}", - nfkd: "\u{1103}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{B484}", - nfc: "\u{B484}", - nfd: "\u{1103}\u{116F}\u{11BF}", - nfkc: "\u{B484}", - nfkd: "\u{1103}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{B485}", - nfc: "\u{B485}", - nfd: "\u{1103}\u{116F}\u{11C0}", - nfkc: "\u{B485}", - nfkd: "\u{1103}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{B486}", - nfc: "\u{B486}", - nfd: "\u{1103}\u{116F}\u{11C1}", - nfkc: "\u{B486}", - nfkd: "\u{1103}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{B487}", - nfc: "\u{B487}", - nfd: "\u{1103}\u{116F}\u{11C2}", - nfkc: "\u{B487}", - nfkd: "\u{1103}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{B488}", - nfc: "\u{B488}", - nfd: "\u{1103}\u{1170}", - nfkc: "\u{B488}", - nfkd: "\u{1103}\u{1170}", - }, - NormalizationTest { - source: "\u{B489}", - nfc: "\u{B489}", - nfd: "\u{1103}\u{1170}\u{11A8}", - nfkc: "\u{B489}", - nfkd: "\u{1103}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{B48A}", - nfc: "\u{B48A}", - nfd: "\u{1103}\u{1170}\u{11A9}", - nfkc: "\u{B48A}", - nfkd: "\u{1103}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{B48B}", - nfc: "\u{B48B}", - nfd: "\u{1103}\u{1170}\u{11AA}", - nfkc: "\u{B48B}", - nfkd: "\u{1103}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{B48C}", - nfc: "\u{B48C}", - nfd: "\u{1103}\u{1170}\u{11AB}", - nfkc: "\u{B48C}", - nfkd: "\u{1103}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{B48D}", - nfc: "\u{B48D}", - nfd: "\u{1103}\u{1170}\u{11AC}", - nfkc: "\u{B48D}", - nfkd: "\u{1103}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{B48E}", - nfc: "\u{B48E}", - nfd: "\u{1103}\u{1170}\u{11AD}", - nfkc: "\u{B48E}", - nfkd: "\u{1103}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{B48F}", - nfc: "\u{B48F}", - nfd: "\u{1103}\u{1170}\u{11AE}", - nfkc: "\u{B48F}", - nfkd: "\u{1103}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{B490}", - nfc: "\u{B490}", - nfd: "\u{1103}\u{1170}\u{11AF}", - nfkc: "\u{B490}", - nfkd: "\u{1103}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{B491}", - nfc: "\u{B491}", - nfd: "\u{1103}\u{1170}\u{11B0}", - nfkc: "\u{B491}", - nfkd: "\u{1103}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{B492}", - nfc: "\u{B492}", - nfd: "\u{1103}\u{1170}\u{11B1}", - nfkc: "\u{B492}", - nfkd: "\u{1103}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{B493}", - nfc: "\u{B493}", - nfd: "\u{1103}\u{1170}\u{11B2}", - nfkc: "\u{B493}", - nfkd: "\u{1103}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{B494}", - nfc: "\u{B494}", - nfd: "\u{1103}\u{1170}\u{11B3}", - nfkc: "\u{B494}", - nfkd: "\u{1103}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{B495}", - nfc: "\u{B495}", - nfd: "\u{1103}\u{1170}\u{11B4}", - nfkc: "\u{B495}", - nfkd: "\u{1103}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{B496}", - nfc: "\u{B496}", - nfd: "\u{1103}\u{1170}\u{11B5}", - nfkc: "\u{B496}", - nfkd: "\u{1103}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{B497}", - nfc: "\u{B497}", - nfd: "\u{1103}\u{1170}\u{11B6}", - nfkc: "\u{B497}", - nfkd: "\u{1103}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{B498}", - nfc: "\u{B498}", - nfd: "\u{1103}\u{1170}\u{11B7}", - nfkc: "\u{B498}", - nfkd: "\u{1103}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{B499}", - nfc: "\u{B499}", - nfd: "\u{1103}\u{1170}\u{11B8}", - nfkc: "\u{B499}", - nfkd: "\u{1103}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{B49A}", - nfc: "\u{B49A}", - nfd: "\u{1103}\u{1170}\u{11B9}", - nfkc: "\u{B49A}", - nfkd: "\u{1103}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{B49B}", - nfc: "\u{B49B}", - nfd: "\u{1103}\u{1170}\u{11BA}", - nfkc: "\u{B49B}", - nfkd: "\u{1103}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{B49C}", - nfc: "\u{B49C}", - nfd: "\u{1103}\u{1170}\u{11BB}", - nfkc: "\u{B49C}", - nfkd: "\u{1103}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{B49D}", - nfc: "\u{B49D}", - nfd: "\u{1103}\u{1170}\u{11BC}", - nfkc: "\u{B49D}", - nfkd: "\u{1103}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{B49E}", - nfc: "\u{B49E}", - nfd: "\u{1103}\u{1170}\u{11BD}", - nfkc: "\u{B49E}", - nfkd: "\u{1103}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{B49F}", - nfc: "\u{B49F}", - nfd: "\u{1103}\u{1170}\u{11BE}", - nfkc: "\u{B49F}", - nfkd: "\u{1103}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{B4A0}", - nfc: "\u{B4A0}", - nfd: "\u{1103}\u{1170}\u{11BF}", - nfkc: "\u{B4A0}", - nfkd: "\u{1103}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{B4A1}", - nfc: "\u{B4A1}", - nfd: "\u{1103}\u{1170}\u{11C0}", - nfkc: "\u{B4A1}", - nfkd: "\u{1103}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{B4A2}", - nfc: "\u{B4A2}", - nfd: "\u{1103}\u{1170}\u{11C1}", - nfkc: "\u{B4A2}", - nfkd: "\u{1103}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{B4A3}", - nfc: "\u{B4A3}", - nfd: "\u{1103}\u{1170}\u{11C2}", - nfkc: "\u{B4A3}", - nfkd: "\u{1103}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{B4A4}", - nfc: "\u{B4A4}", - nfd: "\u{1103}\u{1171}", - nfkc: "\u{B4A4}", - nfkd: "\u{1103}\u{1171}", - }, - NormalizationTest { - source: "\u{B4A5}", - nfc: "\u{B4A5}", - nfd: "\u{1103}\u{1171}\u{11A8}", - nfkc: "\u{B4A5}", - nfkd: "\u{1103}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{B4A6}", - nfc: "\u{B4A6}", - nfd: "\u{1103}\u{1171}\u{11A9}", - nfkc: "\u{B4A6}", - nfkd: "\u{1103}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{B4A7}", - nfc: "\u{B4A7}", - nfd: "\u{1103}\u{1171}\u{11AA}", - nfkc: "\u{B4A7}", - nfkd: "\u{1103}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{B4A8}", - nfc: "\u{B4A8}", - nfd: "\u{1103}\u{1171}\u{11AB}", - nfkc: "\u{B4A8}", - nfkd: "\u{1103}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{B4A9}", - nfc: "\u{B4A9}", - nfd: "\u{1103}\u{1171}\u{11AC}", - nfkc: "\u{B4A9}", - nfkd: "\u{1103}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{B4AA}", - nfc: "\u{B4AA}", - nfd: "\u{1103}\u{1171}\u{11AD}", - nfkc: "\u{B4AA}", - nfkd: "\u{1103}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{B4AB}", - nfc: "\u{B4AB}", - nfd: "\u{1103}\u{1171}\u{11AE}", - nfkc: "\u{B4AB}", - nfkd: "\u{1103}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{B4AC}", - nfc: "\u{B4AC}", - nfd: "\u{1103}\u{1171}\u{11AF}", - nfkc: "\u{B4AC}", - nfkd: "\u{1103}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{B4AD}", - nfc: "\u{B4AD}", - nfd: "\u{1103}\u{1171}\u{11B0}", - nfkc: "\u{B4AD}", - nfkd: "\u{1103}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{B4AE}", - nfc: "\u{B4AE}", - nfd: "\u{1103}\u{1171}\u{11B1}", - nfkc: "\u{B4AE}", - nfkd: "\u{1103}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{B4AF}", - nfc: "\u{B4AF}", - nfd: "\u{1103}\u{1171}\u{11B2}", - nfkc: "\u{B4AF}", - nfkd: "\u{1103}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{B4B0}", - nfc: "\u{B4B0}", - nfd: "\u{1103}\u{1171}\u{11B3}", - nfkc: "\u{B4B0}", - nfkd: "\u{1103}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{B4B1}", - nfc: "\u{B4B1}", - nfd: "\u{1103}\u{1171}\u{11B4}", - nfkc: "\u{B4B1}", - nfkd: "\u{1103}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{B4B2}", - nfc: "\u{B4B2}", - nfd: "\u{1103}\u{1171}\u{11B5}", - nfkc: "\u{B4B2}", - nfkd: "\u{1103}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{B4B3}", - nfc: "\u{B4B3}", - nfd: "\u{1103}\u{1171}\u{11B6}", - nfkc: "\u{B4B3}", - nfkd: "\u{1103}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{B4B4}", - nfc: "\u{B4B4}", - nfd: "\u{1103}\u{1171}\u{11B7}", - nfkc: "\u{B4B4}", - nfkd: "\u{1103}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{B4B5}", - nfc: "\u{B4B5}", - nfd: "\u{1103}\u{1171}\u{11B8}", - nfkc: "\u{B4B5}", - nfkd: "\u{1103}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{B4B6}", - nfc: "\u{B4B6}", - nfd: "\u{1103}\u{1171}\u{11B9}", - nfkc: "\u{B4B6}", - nfkd: "\u{1103}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{B4B7}", - nfc: "\u{B4B7}", - nfd: "\u{1103}\u{1171}\u{11BA}", - nfkc: "\u{B4B7}", - nfkd: "\u{1103}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{B4B8}", - nfc: "\u{B4B8}", - nfd: "\u{1103}\u{1171}\u{11BB}", - nfkc: "\u{B4B8}", - nfkd: "\u{1103}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{B4B9}", - nfc: "\u{B4B9}", - nfd: "\u{1103}\u{1171}\u{11BC}", - nfkc: "\u{B4B9}", - nfkd: "\u{1103}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{B4BA}", - nfc: "\u{B4BA}", - nfd: "\u{1103}\u{1171}\u{11BD}", - nfkc: "\u{B4BA}", - nfkd: "\u{1103}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{B4BB}", - nfc: "\u{B4BB}", - nfd: "\u{1103}\u{1171}\u{11BE}", - nfkc: "\u{B4BB}", - nfkd: "\u{1103}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{B4BC}", - nfc: "\u{B4BC}", - nfd: "\u{1103}\u{1171}\u{11BF}", - nfkc: "\u{B4BC}", - nfkd: "\u{1103}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{B4BD}", - nfc: "\u{B4BD}", - nfd: "\u{1103}\u{1171}\u{11C0}", - nfkc: "\u{B4BD}", - nfkd: "\u{1103}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{B4BE}", - nfc: "\u{B4BE}", - nfd: "\u{1103}\u{1171}\u{11C1}", - nfkc: "\u{B4BE}", - nfkd: "\u{1103}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{B4BF}", - nfc: "\u{B4BF}", - nfd: "\u{1103}\u{1171}\u{11C2}", - nfkc: "\u{B4BF}", - nfkd: "\u{1103}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{B4C0}", - nfc: "\u{B4C0}", - nfd: "\u{1103}\u{1172}", - nfkc: "\u{B4C0}", - nfkd: "\u{1103}\u{1172}", - }, - NormalizationTest { - source: "\u{B4C1}", - nfc: "\u{B4C1}", - nfd: "\u{1103}\u{1172}\u{11A8}", - nfkc: "\u{B4C1}", - nfkd: "\u{1103}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{B4C2}", - nfc: "\u{B4C2}", - nfd: "\u{1103}\u{1172}\u{11A9}", - nfkc: "\u{B4C2}", - nfkd: "\u{1103}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{B4C3}", - nfc: "\u{B4C3}", - nfd: "\u{1103}\u{1172}\u{11AA}", - nfkc: "\u{B4C3}", - nfkd: "\u{1103}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{B4C4}", - nfc: "\u{B4C4}", - nfd: "\u{1103}\u{1172}\u{11AB}", - nfkc: "\u{B4C4}", - nfkd: "\u{1103}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{B4C5}", - nfc: "\u{B4C5}", - nfd: "\u{1103}\u{1172}\u{11AC}", - nfkc: "\u{B4C5}", - nfkd: "\u{1103}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{B4C6}", - nfc: "\u{B4C6}", - nfd: "\u{1103}\u{1172}\u{11AD}", - nfkc: "\u{B4C6}", - nfkd: "\u{1103}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{B4C7}", - nfc: "\u{B4C7}", - nfd: "\u{1103}\u{1172}\u{11AE}", - nfkc: "\u{B4C7}", - nfkd: "\u{1103}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{B4C8}", - nfc: "\u{B4C8}", - nfd: "\u{1103}\u{1172}\u{11AF}", - nfkc: "\u{B4C8}", - nfkd: "\u{1103}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{B4C9}", - nfc: "\u{B4C9}", - nfd: "\u{1103}\u{1172}\u{11B0}", - nfkc: "\u{B4C9}", - nfkd: "\u{1103}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{B4CA}", - nfc: "\u{B4CA}", - nfd: "\u{1103}\u{1172}\u{11B1}", - nfkc: "\u{B4CA}", - nfkd: "\u{1103}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{B4CB}", - nfc: "\u{B4CB}", - nfd: "\u{1103}\u{1172}\u{11B2}", - nfkc: "\u{B4CB}", - nfkd: "\u{1103}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{B4CC}", - nfc: "\u{B4CC}", - nfd: "\u{1103}\u{1172}\u{11B3}", - nfkc: "\u{B4CC}", - nfkd: "\u{1103}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{B4CD}", - nfc: "\u{B4CD}", - nfd: "\u{1103}\u{1172}\u{11B4}", - nfkc: "\u{B4CD}", - nfkd: "\u{1103}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{B4CE}", - nfc: "\u{B4CE}", - nfd: "\u{1103}\u{1172}\u{11B5}", - nfkc: "\u{B4CE}", - nfkd: "\u{1103}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{B4CF}", - nfc: "\u{B4CF}", - nfd: "\u{1103}\u{1172}\u{11B6}", - nfkc: "\u{B4CF}", - nfkd: "\u{1103}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{B4D0}", - nfc: "\u{B4D0}", - nfd: "\u{1103}\u{1172}\u{11B7}", - nfkc: "\u{B4D0}", - nfkd: "\u{1103}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{B4D1}", - nfc: "\u{B4D1}", - nfd: "\u{1103}\u{1172}\u{11B8}", - nfkc: "\u{B4D1}", - nfkd: "\u{1103}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{B4D2}", - nfc: "\u{B4D2}", - nfd: "\u{1103}\u{1172}\u{11B9}", - nfkc: "\u{B4D2}", - nfkd: "\u{1103}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{B4D3}", - nfc: "\u{B4D3}", - nfd: "\u{1103}\u{1172}\u{11BA}", - nfkc: "\u{B4D3}", - nfkd: "\u{1103}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{B4D4}", - nfc: "\u{B4D4}", - nfd: "\u{1103}\u{1172}\u{11BB}", - nfkc: "\u{B4D4}", - nfkd: "\u{1103}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{B4D5}", - nfc: "\u{B4D5}", - nfd: "\u{1103}\u{1172}\u{11BC}", - nfkc: "\u{B4D5}", - nfkd: "\u{1103}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{B4D6}", - nfc: "\u{B4D6}", - nfd: "\u{1103}\u{1172}\u{11BD}", - nfkc: "\u{B4D6}", - nfkd: "\u{1103}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{B4D7}", - nfc: "\u{B4D7}", - nfd: "\u{1103}\u{1172}\u{11BE}", - nfkc: "\u{B4D7}", - nfkd: "\u{1103}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{B4D8}", - nfc: "\u{B4D8}", - nfd: "\u{1103}\u{1172}\u{11BF}", - nfkc: "\u{B4D8}", - nfkd: "\u{1103}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{B4D9}", - nfc: "\u{B4D9}", - nfd: "\u{1103}\u{1172}\u{11C0}", - nfkc: "\u{B4D9}", - nfkd: "\u{1103}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{B4DA}", - nfc: "\u{B4DA}", - nfd: "\u{1103}\u{1172}\u{11C1}", - nfkc: "\u{B4DA}", - nfkd: "\u{1103}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{B4DB}", - nfc: "\u{B4DB}", - nfd: "\u{1103}\u{1172}\u{11C2}", - nfkc: "\u{B4DB}", - nfkd: "\u{1103}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{B4DC}", - nfc: "\u{B4DC}", - nfd: "\u{1103}\u{1173}", - nfkc: "\u{B4DC}", - nfkd: "\u{1103}\u{1173}", - }, - NormalizationTest { - source: "\u{B4DD}", - nfc: "\u{B4DD}", - nfd: "\u{1103}\u{1173}\u{11A8}", - nfkc: "\u{B4DD}", - nfkd: "\u{1103}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{B4DE}", - nfc: "\u{B4DE}", - nfd: "\u{1103}\u{1173}\u{11A9}", - nfkc: "\u{B4DE}", - nfkd: "\u{1103}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{B4DF}", - nfc: "\u{B4DF}", - nfd: "\u{1103}\u{1173}\u{11AA}", - nfkc: "\u{B4DF}", - nfkd: "\u{1103}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{B4E0}", - nfc: "\u{B4E0}", - nfd: "\u{1103}\u{1173}\u{11AB}", - nfkc: "\u{B4E0}", - nfkd: "\u{1103}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{B4E1}", - nfc: "\u{B4E1}", - nfd: "\u{1103}\u{1173}\u{11AC}", - nfkc: "\u{B4E1}", - nfkd: "\u{1103}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{B4E2}", - nfc: "\u{B4E2}", - nfd: "\u{1103}\u{1173}\u{11AD}", - nfkc: "\u{B4E2}", - nfkd: "\u{1103}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{B4E3}", - nfc: "\u{B4E3}", - nfd: "\u{1103}\u{1173}\u{11AE}", - nfkc: "\u{B4E3}", - nfkd: "\u{1103}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{B4E4}", - nfc: "\u{B4E4}", - nfd: "\u{1103}\u{1173}\u{11AF}", - nfkc: "\u{B4E4}", - nfkd: "\u{1103}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{B4E5}", - nfc: "\u{B4E5}", - nfd: "\u{1103}\u{1173}\u{11B0}", - nfkc: "\u{B4E5}", - nfkd: "\u{1103}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{B4E6}", - nfc: "\u{B4E6}", - nfd: "\u{1103}\u{1173}\u{11B1}", - nfkc: "\u{B4E6}", - nfkd: "\u{1103}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{B4E7}", - nfc: "\u{B4E7}", - nfd: "\u{1103}\u{1173}\u{11B2}", - nfkc: "\u{B4E7}", - nfkd: "\u{1103}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{B4E8}", - nfc: "\u{B4E8}", - nfd: "\u{1103}\u{1173}\u{11B3}", - nfkc: "\u{B4E8}", - nfkd: "\u{1103}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{B4E9}", - nfc: "\u{B4E9}", - nfd: "\u{1103}\u{1173}\u{11B4}", - nfkc: "\u{B4E9}", - nfkd: "\u{1103}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{B4EA}", - nfc: "\u{B4EA}", - nfd: "\u{1103}\u{1173}\u{11B5}", - nfkc: "\u{B4EA}", - nfkd: "\u{1103}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{B4EB}", - nfc: "\u{B4EB}", - nfd: "\u{1103}\u{1173}\u{11B6}", - nfkc: "\u{B4EB}", - nfkd: "\u{1103}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{B4EC}", - nfc: "\u{B4EC}", - nfd: "\u{1103}\u{1173}\u{11B7}", - nfkc: "\u{B4EC}", - nfkd: "\u{1103}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{B4ED}", - nfc: "\u{B4ED}", - nfd: "\u{1103}\u{1173}\u{11B8}", - nfkc: "\u{B4ED}", - nfkd: "\u{1103}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{B4EE}", - nfc: "\u{B4EE}", - nfd: "\u{1103}\u{1173}\u{11B9}", - nfkc: "\u{B4EE}", - nfkd: "\u{1103}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{B4EF}", - nfc: "\u{B4EF}", - nfd: "\u{1103}\u{1173}\u{11BA}", - nfkc: "\u{B4EF}", - nfkd: "\u{1103}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{B4F0}", - nfc: "\u{B4F0}", - nfd: "\u{1103}\u{1173}\u{11BB}", - nfkc: "\u{B4F0}", - nfkd: "\u{1103}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{B4F1}", - nfc: "\u{B4F1}", - nfd: "\u{1103}\u{1173}\u{11BC}", - nfkc: "\u{B4F1}", - nfkd: "\u{1103}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{B4F2}", - nfc: "\u{B4F2}", - nfd: "\u{1103}\u{1173}\u{11BD}", - nfkc: "\u{B4F2}", - nfkd: "\u{1103}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{B4F3}", - nfc: "\u{B4F3}", - nfd: "\u{1103}\u{1173}\u{11BE}", - nfkc: "\u{B4F3}", - nfkd: "\u{1103}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{B4F4}", - nfc: "\u{B4F4}", - nfd: "\u{1103}\u{1173}\u{11BF}", - nfkc: "\u{B4F4}", - nfkd: "\u{1103}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{B4F5}", - nfc: "\u{B4F5}", - nfd: "\u{1103}\u{1173}\u{11C0}", - nfkc: "\u{B4F5}", - nfkd: "\u{1103}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{B4F6}", - nfc: "\u{B4F6}", - nfd: "\u{1103}\u{1173}\u{11C1}", - nfkc: "\u{B4F6}", - nfkd: "\u{1103}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{B4F7}", - nfc: "\u{B4F7}", - nfd: "\u{1103}\u{1173}\u{11C2}", - nfkc: "\u{B4F7}", - nfkd: "\u{1103}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{B4F8}", - nfc: "\u{B4F8}", - nfd: "\u{1103}\u{1174}", - nfkc: "\u{B4F8}", - nfkd: "\u{1103}\u{1174}", - }, - NormalizationTest { - source: "\u{B4F9}", - nfc: "\u{B4F9}", - nfd: "\u{1103}\u{1174}\u{11A8}", - nfkc: "\u{B4F9}", - nfkd: "\u{1103}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{B4FA}", - nfc: "\u{B4FA}", - nfd: "\u{1103}\u{1174}\u{11A9}", - nfkc: "\u{B4FA}", - nfkd: "\u{1103}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{B4FB}", - nfc: "\u{B4FB}", - nfd: "\u{1103}\u{1174}\u{11AA}", - nfkc: "\u{B4FB}", - nfkd: "\u{1103}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{B4FC}", - nfc: "\u{B4FC}", - nfd: "\u{1103}\u{1174}\u{11AB}", - nfkc: "\u{B4FC}", - nfkd: "\u{1103}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{B4FD}", - nfc: "\u{B4FD}", - nfd: "\u{1103}\u{1174}\u{11AC}", - nfkc: "\u{B4FD}", - nfkd: "\u{1103}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{B4FE}", - nfc: "\u{B4FE}", - nfd: "\u{1103}\u{1174}\u{11AD}", - nfkc: "\u{B4FE}", - nfkd: "\u{1103}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{B4FF}", - nfc: "\u{B4FF}", - nfd: "\u{1103}\u{1174}\u{11AE}", - nfkc: "\u{B4FF}", - nfkd: "\u{1103}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{B500}", - nfc: "\u{B500}", - nfd: "\u{1103}\u{1174}\u{11AF}", - nfkc: "\u{B500}", - nfkd: "\u{1103}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{B501}", - nfc: "\u{B501}", - nfd: "\u{1103}\u{1174}\u{11B0}", - nfkc: "\u{B501}", - nfkd: "\u{1103}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{B502}", - nfc: "\u{B502}", - nfd: "\u{1103}\u{1174}\u{11B1}", - nfkc: "\u{B502}", - nfkd: "\u{1103}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{B503}", - nfc: "\u{B503}", - nfd: "\u{1103}\u{1174}\u{11B2}", - nfkc: "\u{B503}", - nfkd: "\u{1103}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{B504}", - nfc: "\u{B504}", - nfd: "\u{1103}\u{1174}\u{11B3}", - nfkc: "\u{B504}", - nfkd: "\u{1103}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{B505}", - nfc: "\u{B505}", - nfd: "\u{1103}\u{1174}\u{11B4}", - nfkc: "\u{B505}", - nfkd: "\u{1103}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{B506}", - nfc: "\u{B506}", - nfd: "\u{1103}\u{1174}\u{11B5}", - nfkc: "\u{B506}", - nfkd: "\u{1103}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{B507}", - nfc: "\u{B507}", - nfd: "\u{1103}\u{1174}\u{11B6}", - nfkc: "\u{B507}", - nfkd: "\u{1103}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{B508}", - nfc: "\u{B508}", - nfd: "\u{1103}\u{1174}\u{11B7}", - nfkc: "\u{B508}", - nfkd: "\u{1103}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{B509}", - nfc: "\u{B509}", - nfd: "\u{1103}\u{1174}\u{11B8}", - nfkc: "\u{B509}", - nfkd: "\u{1103}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{B50A}", - nfc: "\u{B50A}", - nfd: "\u{1103}\u{1174}\u{11B9}", - nfkc: "\u{B50A}", - nfkd: "\u{1103}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{B50B}", - nfc: "\u{B50B}", - nfd: "\u{1103}\u{1174}\u{11BA}", - nfkc: "\u{B50B}", - nfkd: "\u{1103}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{B50C}", - nfc: "\u{B50C}", - nfd: "\u{1103}\u{1174}\u{11BB}", - nfkc: "\u{B50C}", - nfkd: "\u{1103}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{B50D}", - nfc: "\u{B50D}", - nfd: "\u{1103}\u{1174}\u{11BC}", - nfkc: "\u{B50D}", - nfkd: "\u{1103}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{B50E}", - nfc: "\u{B50E}", - nfd: "\u{1103}\u{1174}\u{11BD}", - nfkc: "\u{B50E}", - nfkd: "\u{1103}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{B50F}", - nfc: "\u{B50F}", - nfd: "\u{1103}\u{1174}\u{11BE}", - nfkc: "\u{B50F}", - nfkd: "\u{1103}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{B510}", - nfc: "\u{B510}", - nfd: "\u{1103}\u{1174}\u{11BF}", - nfkc: "\u{B510}", - nfkd: "\u{1103}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{B511}", - nfc: "\u{B511}", - nfd: "\u{1103}\u{1174}\u{11C0}", - nfkc: "\u{B511}", - nfkd: "\u{1103}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{B512}", - nfc: "\u{B512}", - nfd: "\u{1103}\u{1174}\u{11C1}", - nfkc: "\u{B512}", - nfkd: "\u{1103}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{B513}", - nfc: "\u{B513}", - nfd: "\u{1103}\u{1174}\u{11C2}", - nfkc: "\u{B513}", - nfkd: "\u{1103}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{B514}", - nfc: "\u{B514}", - nfd: "\u{1103}\u{1175}", - nfkc: "\u{B514}", - nfkd: "\u{1103}\u{1175}", - }, - NormalizationTest { - source: "\u{B515}", - nfc: "\u{B515}", - nfd: "\u{1103}\u{1175}\u{11A8}", - nfkc: "\u{B515}", - nfkd: "\u{1103}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{B516}", - nfc: "\u{B516}", - nfd: "\u{1103}\u{1175}\u{11A9}", - nfkc: "\u{B516}", - nfkd: "\u{1103}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{B517}", - nfc: "\u{B517}", - nfd: "\u{1103}\u{1175}\u{11AA}", - nfkc: "\u{B517}", - nfkd: "\u{1103}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{B518}", - nfc: "\u{B518}", - nfd: "\u{1103}\u{1175}\u{11AB}", - nfkc: "\u{B518}", - nfkd: "\u{1103}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{B519}", - nfc: "\u{B519}", - nfd: "\u{1103}\u{1175}\u{11AC}", - nfkc: "\u{B519}", - nfkd: "\u{1103}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{B51A}", - nfc: "\u{B51A}", - nfd: "\u{1103}\u{1175}\u{11AD}", - nfkc: "\u{B51A}", - nfkd: "\u{1103}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{B51B}", - nfc: "\u{B51B}", - nfd: "\u{1103}\u{1175}\u{11AE}", - nfkc: "\u{B51B}", - nfkd: "\u{1103}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{B51C}", - nfc: "\u{B51C}", - nfd: "\u{1103}\u{1175}\u{11AF}", - nfkc: "\u{B51C}", - nfkd: "\u{1103}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{B51D}", - nfc: "\u{B51D}", - nfd: "\u{1103}\u{1175}\u{11B0}", - nfkc: "\u{B51D}", - nfkd: "\u{1103}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{B51E}", - nfc: "\u{B51E}", - nfd: "\u{1103}\u{1175}\u{11B1}", - nfkc: "\u{B51E}", - nfkd: "\u{1103}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{B51F}", - nfc: "\u{B51F}", - nfd: "\u{1103}\u{1175}\u{11B2}", - nfkc: "\u{B51F}", - nfkd: "\u{1103}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{B520}", - nfc: "\u{B520}", - nfd: "\u{1103}\u{1175}\u{11B3}", - nfkc: "\u{B520}", - nfkd: "\u{1103}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{B521}", - nfc: "\u{B521}", - nfd: "\u{1103}\u{1175}\u{11B4}", - nfkc: "\u{B521}", - nfkd: "\u{1103}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{B522}", - nfc: "\u{B522}", - nfd: "\u{1103}\u{1175}\u{11B5}", - nfkc: "\u{B522}", - nfkd: "\u{1103}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{B523}", - nfc: "\u{B523}", - nfd: "\u{1103}\u{1175}\u{11B6}", - nfkc: "\u{B523}", - nfkd: "\u{1103}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{B524}", - nfc: "\u{B524}", - nfd: "\u{1103}\u{1175}\u{11B7}", - nfkc: "\u{B524}", - nfkd: "\u{1103}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{B525}", - nfc: "\u{B525}", - nfd: "\u{1103}\u{1175}\u{11B8}", - nfkc: "\u{B525}", - nfkd: "\u{1103}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{B526}", - nfc: "\u{B526}", - nfd: "\u{1103}\u{1175}\u{11B9}", - nfkc: "\u{B526}", - nfkd: "\u{1103}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{B527}", - nfc: "\u{B527}", - nfd: "\u{1103}\u{1175}\u{11BA}", - nfkc: "\u{B527}", - nfkd: "\u{1103}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{B528}", - nfc: "\u{B528}", - nfd: "\u{1103}\u{1175}\u{11BB}", - nfkc: "\u{B528}", - nfkd: "\u{1103}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{B529}", - nfc: "\u{B529}", - nfd: "\u{1103}\u{1175}\u{11BC}", - nfkc: "\u{B529}", - nfkd: "\u{1103}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{B52A}", - nfc: "\u{B52A}", - nfd: "\u{1103}\u{1175}\u{11BD}", - nfkc: "\u{B52A}", - nfkd: "\u{1103}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{B52B}", - nfc: "\u{B52B}", - nfd: "\u{1103}\u{1175}\u{11BE}", - nfkc: "\u{B52B}", - nfkd: "\u{1103}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{B52C}", - nfc: "\u{B52C}", - nfd: "\u{1103}\u{1175}\u{11BF}", - nfkc: "\u{B52C}", - nfkd: "\u{1103}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{B52D}", - nfc: "\u{B52D}", - nfd: "\u{1103}\u{1175}\u{11C0}", - nfkc: "\u{B52D}", - nfkd: "\u{1103}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{B52E}", - nfc: "\u{B52E}", - nfd: "\u{1103}\u{1175}\u{11C1}", - nfkc: "\u{B52E}", - nfkd: "\u{1103}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{B52F}", - nfc: "\u{B52F}", - nfd: "\u{1103}\u{1175}\u{11C2}", - nfkc: "\u{B52F}", - nfkd: "\u{1103}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{B530}", - nfc: "\u{B530}", - nfd: "\u{1104}\u{1161}", - nfkc: "\u{B530}", - nfkd: "\u{1104}\u{1161}", - }, - NormalizationTest { - source: "\u{B531}", - nfc: "\u{B531}", - nfd: "\u{1104}\u{1161}\u{11A8}", - nfkc: "\u{B531}", - nfkd: "\u{1104}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{B532}", - nfc: "\u{B532}", - nfd: "\u{1104}\u{1161}\u{11A9}", - nfkc: "\u{B532}", - nfkd: "\u{1104}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{B533}", - nfc: "\u{B533}", - nfd: "\u{1104}\u{1161}\u{11AA}", - nfkc: "\u{B533}", - nfkd: "\u{1104}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{B534}", - nfc: "\u{B534}", - nfd: "\u{1104}\u{1161}\u{11AB}", - nfkc: "\u{B534}", - nfkd: "\u{1104}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{B535}", - nfc: "\u{B535}", - nfd: "\u{1104}\u{1161}\u{11AC}", - nfkc: "\u{B535}", - nfkd: "\u{1104}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{B536}", - nfc: "\u{B536}", - nfd: "\u{1104}\u{1161}\u{11AD}", - nfkc: "\u{B536}", - nfkd: "\u{1104}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{B537}", - nfc: "\u{B537}", - nfd: "\u{1104}\u{1161}\u{11AE}", - nfkc: "\u{B537}", - nfkd: "\u{1104}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{B538}", - nfc: "\u{B538}", - nfd: "\u{1104}\u{1161}\u{11AF}", - nfkc: "\u{B538}", - nfkd: "\u{1104}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{B539}", - nfc: "\u{B539}", - nfd: "\u{1104}\u{1161}\u{11B0}", - nfkc: "\u{B539}", - nfkd: "\u{1104}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{B53A}", - nfc: "\u{B53A}", - nfd: "\u{1104}\u{1161}\u{11B1}", - nfkc: "\u{B53A}", - nfkd: "\u{1104}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{B53B}", - nfc: "\u{B53B}", - nfd: "\u{1104}\u{1161}\u{11B2}", - nfkc: "\u{B53B}", - nfkd: "\u{1104}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{B53C}", - nfc: "\u{B53C}", - nfd: "\u{1104}\u{1161}\u{11B3}", - nfkc: "\u{B53C}", - nfkd: "\u{1104}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{B53D}", - nfc: "\u{B53D}", - nfd: "\u{1104}\u{1161}\u{11B4}", - nfkc: "\u{B53D}", - nfkd: "\u{1104}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{B53E}", - nfc: "\u{B53E}", - nfd: "\u{1104}\u{1161}\u{11B5}", - nfkc: "\u{B53E}", - nfkd: "\u{1104}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{B53F}", - nfc: "\u{B53F}", - nfd: "\u{1104}\u{1161}\u{11B6}", - nfkc: "\u{B53F}", - nfkd: "\u{1104}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{B540}", - nfc: "\u{B540}", - nfd: "\u{1104}\u{1161}\u{11B7}", - nfkc: "\u{B540}", - nfkd: "\u{1104}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{B541}", - nfc: "\u{B541}", - nfd: "\u{1104}\u{1161}\u{11B8}", - nfkc: "\u{B541}", - nfkd: "\u{1104}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{B542}", - nfc: "\u{B542}", - nfd: "\u{1104}\u{1161}\u{11B9}", - nfkc: "\u{B542}", - nfkd: "\u{1104}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{B543}", - nfc: "\u{B543}", - nfd: "\u{1104}\u{1161}\u{11BA}", - nfkc: "\u{B543}", - nfkd: "\u{1104}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{B544}", - nfc: "\u{B544}", - nfd: "\u{1104}\u{1161}\u{11BB}", - nfkc: "\u{B544}", - nfkd: "\u{1104}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{B545}", - nfc: "\u{B545}", - nfd: "\u{1104}\u{1161}\u{11BC}", - nfkc: "\u{B545}", - nfkd: "\u{1104}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{B546}", - nfc: "\u{B546}", - nfd: "\u{1104}\u{1161}\u{11BD}", - nfkc: "\u{B546}", - nfkd: "\u{1104}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{B547}", - nfc: "\u{B547}", - nfd: "\u{1104}\u{1161}\u{11BE}", - nfkc: "\u{B547}", - nfkd: "\u{1104}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{B548}", - nfc: "\u{B548}", - nfd: "\u{1104}\u{1161}\u{11BF}", - nfkc: "\u{B548}", - nfkd: "\u{1104}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{B549}", - nfc: "\u{B549}", - nfd: "\u{1104}\u{1161}\u{11C0}", - nfkc: "\u{B549}", - nfkd: "\u{1104}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{B54A}", - nfc: "\u{B54A}", - nfd: "\u{1104}\u{1161}\u{11C1}", - nfkc: "\u{B54A}", - nfkd: "\u{1104}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{B54B}", - nfc: "\u{B54B}", - nfd: "\u{1104}\u{1161}\u{11C2}", - nfkc: "\u{B54B}", - nfkd: "\u{1104}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{B54C}", - nfc: "\u{B54C}", - nfd: "\u{1104}\u{1162}", - nfkc: "\u{B54C}", - nfkd: "\u{1104}\u{1162}", - }, - NormalizationTest { - source: "\u{B54D}", - nfc: "\u{B54D}", - nfd: "\u{1104}\u{1162}\u{11A8}", - nfkc: "\u{B54D}", - nfkd: "\u{1104}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{B54E}", - nfc: "\u{B54E}", - nfd: "\u{1104}\u{1162}\u{11A9}", - nfkc: "\u{B54E}", - nfkd: "\u{1104}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{B54F}", - nfc: "\u{B54F}", - nfd: "\u{1104}\u{1162}\u{11AA}", - nfkc: "\u{B54F}", - nfkd: "\u{1104}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{B550}", - nfc: "\u{B550}", - nfd: "\u{1104}\u{1162}\u{11AB}", - nfkc: "\u{B550}", - nfkd: "\u{1104}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{B551}", - nfc: "\u{B551}", - nfd: "\u{1104}\u{1162}\u{11AC}", - nfkc: "\u{B551}", - nfkd: "\u{1104}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{B552}", - nfc: "\u{B552}", - nfd: "\u{1104}\u{1162}\u{11AD}", - nfkc: "\u{B552}", - nfkd: "\u{1104}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{B553}", - nfc: "\u{B553}", - nfd: "\u{1104}\u{1162}\u{11AE}", - nfkc: "\u{B553}", - nfkd: "\u{1104}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{B554}", - nfc: "\u{B554}", - nfd: "\u{1104}\u{1162}\u{11AF}", - nfkc: "\u{B554}", - nfkd: "\u{1104}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{B555}", - nfc: "\u{B555}", - nfd: "\u{1104}\u{1162}\u{11B0}", - nfkc: "\u{B555}", - nfkd: "\u{1104}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{B556}", - nfc: "\u{B556}", - nfd: "\u{1104}\u{1162}\u{11B1}", - nfkc: "\u{B556}", - nfkd: "\u{1104}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{B557}", - nfc: "\u{B557}", - nfd: "\u{1104}\u{1162}\u{11B2}", - nfkc: "\u{B557}", - nfkd: "\u{1104}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{B558}", - nfc: "\u{B558}", - nfd: "\u{1104}\u{1162}\u{11B3}", - nfkc: "\u{B558}", - nfkd: "\u{1104}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{B559}", - nfc: "\u{B559}", - nfd: "\u{1104}\u{1162}\u{11B4}", - nfkc: "\u{B559}", - nfkd: "\u{1104}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{B55A}", - nfc: "\u{B55A}", - nfd: "\u{1104}\u{1162}\u{11B5}", - nfkc: "\u{B55A}", - nfkd: "\u{1104}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{B55B}", - nfc: "\u{B55B}", - nfd: "\u{1104}\u{1162}\u{11B6}", - nfkc: "\u{B55B}", - nfkd: "\u{1104}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{B55C}", - nfc: "\u{B55C}", - nfd: "\u{1104}\u{1162}\u{11B7}", - nfkc: "\u{B55C}", - nfkd: "\u{1104}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{B55D}", - nfc: "\u{B55D}", - nfd: "\u{1104}\u{1162}\u{11B8}", - nfkc: "\u{B55D}", - nfkd: "\u{1104}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{B55E}", - nfc: "\u{B55E}", - nfd: "\u{1104}\u{1162}\u{11B9}", - nfkc: "\u{B55E}", - nfkd: "\u{1104}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{B55F}", - nfc: "\u{B55F}", - nfd: "\u{1104}\u{1162}\u{11BA}", - nfkc: "\u{B55F}", - nfkd: "\u{1104}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{B560}", - nfc: "\u{B560}", - nfd: "\u{1104}\u{1162}\u{11BB}", - nfkc: "\u{B560}", - nfkd: "\u{1104}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{B561}", - nfc: "\u{B561}", - nfd: "\u{1104}\u{1162}\u{11BC}", - nfkc: "\u{B561}", - nfkd: "\u{1104}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{B562}", - nfc: "\u{B562}", - nfd: "\u{1104}\u{1162}\u{11BD}", - nfkc: "\u{B562}", - nfkd: "\u{1104}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{B563}", - nfc: "\u{B563}", - nfd: "\u{1104}\u{1162}\u{11BE}", - nfkc: "\u{B563}", - nfkd: "\u{1104}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{B564}", - nfc: "\u{B564}", - nfd: "\u{1104}\u{1162}\u{11BF}", - nfkc: "\u{B564}", - nfkd: "\u{1104}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{B565}", - nfc: "\u{B565}", - nfd: "\u{1104}\u{1162}\u{11C0}", - nfkc: "\u{B565}", - nfkd: "\u{1104}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{B566}", - nfc: "\u{B566}", - nfd: "\u{1104}\u{1162}\u{11C1}", - nfkc: "\u{B566}", - nfkd: "\u{1104}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{B567}", - nfc: "\u{B567}", - nfd: "\u{1104}\u{1162}\u{11C2}", - nfkc: "\u{B567}", - nfkd: "\u{1104}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{B568}", - nfc: "\u{B568}", - nfd: "\u{1104}\u{1163}", - nfkc: "\u{B568}", - nfkd: "\u{1104}\u{1163}", - }, - NormalizationTest { - source: "\u{B569}", - nfc: "\u{B569}", - nfd: "\u{1104}\u{1163}\u{11A8}", - nfkc: "\u{B569}", - nfkd: "\u{1104}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{B56A}", - nfc: "\u{B56A}", - nfd: "\u{1104}\u{1163}\u{11A9}", - nfkc: "\u{B56A}", - nfkd: "\u{1104}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{B56B}", - nfc: "\u{B56B}", - nfd: "\u{1104}\u{1163}\u{11AA}", - nfkc: "\u{B56B}", - nfkd: "\u{1104}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{B56C}", - nfc: "\u{B56C}", - nfd: "\u{1104}\u{1163}\u{11AB}", - nfkc: "\u{B56C}", - nfkd: "\u{1104}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{B56D}", - nfc: "\u{B56D}", - nfd: "\u{1104}\u{1163}\u{11AC}", - nfkc: "\u{B56D}", - nfkd: "\u{1104}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{B56E}", - nfc: "\u{B56E}", - nfd: "\u{1104}\u{1163}\u{11AD}", - nfkc: "\u{B56E}", - nfkd: "\u{1104}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{B56F}", - nfc: "\u{B56F}", - nfd: "\u{1104}\u{1163}\u{11AE}", - nfkc: "\u{B56F}", - nfkd: "\u{1104}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{B570}", - nfc: "\u{B570}", - nfd: "\u{1104}\u{1163}\u{11AF}", - nfkc: "\u{B570}", - nfkd: "\u{1104}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{B571}", - nfc: "\u{B571}", - nfd: "\u{1104}\u{1163}\u{11B0}", - nfkc: "\u{B571}", - nfkd: "\u{1104}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{B572}", - nfc: "\u{B572}", - nfd: "\u{1104}\u{1163}\u{11B1}", - nfkc: "\u{B572}", - nfkd: "\u{1104}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{B573}", - nfc: "\u{B573}", - nfd: "\u{1104}\u{1163}\u{11B2}", - nfkc: "\u{B573}", - nfkd: "\u{1104}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{B574}", - nfc: "\u{B574}", - nfd: "\u{1104}\u{1163}\u{11B3}", - nfkc: "\u{B574}", - nfkd: "\u{1104}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{B575}", - nfc: "\u{B575}", - nfd: "\u{1104}\u{1163}\u{11B4}", - nfkc: "\u{B575}", - nfkd: "\u{1104}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{B576}", - nfc: "\u{B576}", - nfd: "\u{1104}\u{1163}\u{11B5}", - nfkc: "\u{B576}", - nfkd: "\u{1104}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{B577}", - nfc: "\u{B577}", - nfd: "\u{1104}\u{1163}\u{11B6}", - nfkc: "\u{B577}", - nfkd: "\u{1104}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{B578}", - nfc: "\u{B578}", - nfd: "\u{1104}\u{1163}\u{11B7}", - nfkc: "\u{B578}", - nfkd: "\u{1104}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{B579}", - nfc: "\u{B579}", - nfd: "\u{1104}\u{1163}\u{11B8}", - nfkc: "\u{B579}", - nfkd: "\u{1104}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{B57A}", - nfc: "\u{B57A}", - nfd: "\u{1104}\u{1163}\u{11B9}", - nfkc: "\u{B57A}", - nfkd: "\u{1104}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{B57B}", - nfc: "\u{B57B}", - nfd: "\u{1104}\u{1163}\u{11BA}", - nfkc: "\u{B57B}", - nfkd: "\u{1104}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{B57C}", - nfc: "\u{B57C}", - nfd: "\u{1104}\u{1163}\u{11BB}", - nfkc: "\u{B57C}", - nfkd: "\u{1104}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{B57D}", - nfc: "\u{B57D}", - nfd: "\u{1104}\u{1163}\u{11BC}", - nfkc: "\u{B57D}", - nfkd: "\u{1104}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{B57E}", - nfc: "\u{B57E}", - nfd: "\u{1104}\u{1163}\u{11BD}", - nfkc: "\u{B57E}", - nfkd: "\u{1104}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{B57F}", - nfc: "\u{B57F}", - nfd: "\u{1104}\u{1163}\u{11BE}", - nfkc: "\u{B57F}", - nfkd: "\u{1104}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{B580}", - nfc: "\u{B580}", - nfd: "\u{1104}\u{1163}\u{11BF}", - nfkc: "\u{B580}", - nfkd: "\u{1104}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{B581}", - nfc: "\u{B581}", - nfd: "\u{1104}\u{1163}\u{11C0}", - nfkc: "\u{B581}", - nfkd: "\u{1104}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{B582}", - nfc: "\u{B582}", - nfd: "\u{1104}\u{1163}\u{11C1}", - nfkc: "\u{B582}", - nfkd: "\u{1104}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{B583}", - nfc: "\u{B583}", - nfd: "\u{1104}\u{1163}\u{11C2}", - nfkc: "\u{B583}", - nfkd: "\u{1104}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{B584}", - nfc: "\u{B584}", - nfd: "\u{1104}\u{1164}", - nfkc: "\u{B584}", - nfkd: "\u{1104}\u{1164}", - }, - NormalizationTest { - source: "\u{B585}", - nfc: "\u{B585}", - nfd: "\u{1104}\u{1164}\u{11A8}", - nfkc: "\u{B585}", - nfkd: "\u{1104}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{B586}", - nfc: "\u{B586}", - nfd: "\u{1104}\u{1164}\u{11A9}", - nfkc: "\u{B586}", - nfkd: "\u{1104}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{B587}", - nfc: "\u{B587}", - nfd: "\u{1104}\u{1164}\u{11AA}", - nfkc: "\u{B587}", - nfkd: "\u{1104}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{B588}", - nfc: "\u{B588}", - nfd: "\u{1104}\u{1164}\u{11AB}", - nfkc: "\u{B588}", - nfkd: "\u{1104}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{B589}", - nfc: "\u{B589}", - nfd: "\u{1104}\u{1164}\u{11AC}", - nfkc: "\u{B589}", - nfkd: "\u{1104}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{B58A}", - nfc: "\u{B58A}", - nfd: "\u{1104}\u{1164}\u{11AD}", - nfkc: "\u{B58A}", - nfkd: "\u{1104}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{B58B}", - nfc: "\u{B58B}", - nfd: "\u{1104}\u{1164}\u{11AE}", - nfkc: "\u{B58B}", - nfkd: "\u{1104}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{B58C}", - nfc: "\u{B58C}", - nfd: "\u{1104}\u{1164}\u{11AF}", - nfkc: "\u{B58C}", - nfkd: "\u{1104}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{B58D}", - nfc: "\u{B58D}", - nfd: "\u{1104}\u{1164}\u{11B0}", - nfkc: "\u{B58D}", - nfkd: "\u{1104}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{B58E}", - nfc: "\u{B58E}", - nfd: "\u{1104}\u{1164}\u{11B1}", - nfkc: "\u{B58E}", - nfkd: "\u{1104}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{B58F}", - nfc: "\u{B58F}", - nfd: "\u{1104}\u{1164}\u{11B2}", - nfkc: "\u{B58F}", - nfkd: "\u{1104}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{B590}", - nfc: "\u{B590}", - nfd: "\u{1104}\u{1164}\u{11B3}", - nfkc: "\u{B590}", - nfkd: "\u{1104}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{B591}", - nfc: "\u{B591}", - nfd: "\u{1104}\u{1164}\u{11B4}", - nfkc: "\u{B591}", - nfkd: "\u{1104}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{B592}", - nfc: "\u{B592}", - nfd: "\u{1104}\u{1164}\u{11B5}", - nfkc: "\u{B592}", - nfkd: "\u{1104}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{B593}", - nfc: "\u{B593}", - nfd: "\u{1104}\u{1164}\u{11B6}", - nfkc: "\u{B593}", - nfkd: "\u{1104}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{B594}", - nfc: "\u{B594}", - nfd: "\u{1104}\u{1164}\u{11B7}", - nfkc: "\u{B594}", - nfkd: "\u{1104}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{B595}", - nfc: "\u{B595}", - nfd: "\u{1104}\u{1164}\u{11B8}", - nfkc: "\u{B595}", - nfkd: "\u{1104}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{B596}", - nfc: "\u{B596}", - nfd: "\u{1104}\u{1164}\u{11B9}", - nfkc: "\u{B596}", - nfkd: "\u{1104}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{B597}", - nfc: "\u{B597}", - nfd: "\u{1104}\u{1164}\u{11BA}", - nfkc: "\u{B597}", - nfkd: "\u{1104}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{B598}", - nfc: "\u{B598}", - nfd: "\u{1104}\u{1164}\u{11BB}", - nfkc: "\u{B598}", - nfkd: "\u{1104}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{B599}", - nfc: "\u{B599}", - nfd: "\u{1104}\u{1164}\u{11BC}", - nfkc: "\u{B599}", - nfkd: "\u{1104}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{B59A}", - nfc: "\u{B59A}", - nfd: "\u{1104}\u{1164}\u{11BD}", - nfkc: "\u{B59A}", - nfkd: "\u{1104}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{B59B}", - nfc: "\u{B59B}", - nfd: "\u{1104}\u{1164}\u{11BE}", - nfkc: "\u{B59B}", - nfkd: "\u{1104}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{B59C}", - nfc: "\u{B59C}", - nfd: "\u{1104}\u{1164}\u{11BF}", - nfkc: "\u{B59C}", - nfkd: "\u{1104}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{B59D}", - nfc: "\u{B59D}", - nfd: "\u{1104}\u{1164}\u{11C0}", - nfkc: "\u{B59D}", - nfkd: "\u{1104}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{B59E}", - nfc: "\u{B59E}", - nfd: "\u{1104}\u{1164}\u{11C1}", - nfkc: "\u{B59E}", - nfkd: "\u{1104}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{B59F}", - nfc: "\u{B59F}", - nfd: "\u{1104}\u{1164}\u{11C2}", - nfkc: "\u{B59F}", - nfkd: "\u{1104}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{B5A0}", - nfc: "\u{B5A0}", - nfd: "\u{1104}\u{1165}", - nfkc: "\u{B5A0}", - nfkd: "\u{1104}\u{1165}", - }, - NormalizationTest { - source: "\u{B5A1}", - nfc: "\u{B5A1}", - nfd: "\u{1104}\u{1165}\u{11A8}", - nfkc: "\u{B5A1}", - nfkd: "\u{1104}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{B5A2}", - nfc: "\u{B5A2}", - nfd: "\u{1104}\u{1165}\u{11A9}", - nfkc: "\u{B5A2}", - nfkd: "\u{1104}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{B5A3}", - nfc: "\u{B5A3}", - nfd: "\u{1104}\u{1165}\u{11AA}", - nfkc: "\u{B5A3}", - nfkd: "\u{1104}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{B5A4}", - nfc: "\u{B5A4}", - nfd: "\u{1104}\u{1165}\u{11AB}", - nfkc: "\u{B5A4}", - nfkd: "\u{1104}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{B5A5}", - nfc: "\u{B5A5}", - nfd: "\u{1104}\u{1165}\u{11AC}", - nfkc: "\u{B5A5}", - nfkd: "\u{1104}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{B5A6}", - nfc: "\u{B5A6}", - nfd: "\u{1104}\u{1165}\u{11AD}", - nfkc: "\u{B5A6}", - nfkd: "\u{1104}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{B5A7}", - nfc: "\u{B5A7}", - nfd: "\u{1104}\u{1165}\u{11AE}", - nfkc: "\u{B5A7}", - nfkd: "\u{1104}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{B5A8}", - nfc: "\u{B5A8}", - nfd: "\u{1104}\u{1165}\u{11AF}", - nfkc: "\u{B5A8}", - nfkd: "\u{1104}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{B5A9}", - nfc: "\u{B5A9}", - nfd: "\u{1104}\u{1165}\u{11B0}", - nfkc: "\u{B5A9}", - nfkd: "\u{1104}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{B5AA}", - nfc: "\u{B5AA}", - nfd: "\u{1104}\u{1165}\u{11B1}", - nfkc: "\u{B5AA}", - nfkd: "\u{1104}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{B5AB}", - nfc: "\u{B5AB}", - nfd: "\u{1104}\u{1165}\u{11B2}", - nfkc: "\u{B5AB}", - nfkd: "\u{1104}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{B5AC}", - nfc: "\u{B5AC}", - nfd: "\u{1104}\u{1165}\u{11B3}", - nfkc: "\u{B5AC}", - nfkd: "\u{1104}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{B5AD}", - nfc: "\u{B5AD}", - nfd: "\u{1104}\u{1165}\u{11B4}", - nfkc: "\u{B5AD}", - nfkd: "\u{1104}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{B5AE}", - nfc: "\u{B5AE}", - nfd: "\u{1104}\u{1165}\u{11B5}", - nfkc: "\u{B5AE}", - nfkd: "\u{1104}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{B5AF}", - nfc: "\u{B5AF}", - nfd: "\u{1104}\u{1165}\u{11B6}", - nfkc: "\u{B5AF}", - nfkd: "\u{1104}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{B5B0}", - nfc: "\u{B5B0}", - nfd: "\u{1104}\u{1165}\u{11B7}", - nfkc: "\u{B5B0}", - nfkd: "\u{1104}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{B5B1}", - nfc: "\u{B5B1}", - nfd: "\u{1104}\u{1165}\u{11B8}", - nfkc: "\u{B5B1}", - nfkd: "\u{1104}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{B5B2}", - nfc: "\u{B5B2}", - nfd: "\u{1104}\u{1165}\u{11B9}", - nfkc: "\u{B5B2}", - nfkd: "\u{1104}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{B5B3}", - nfc: "\u{B5B3}", - nfd: "\u{1104}\u{1165}\u{11BA}", - nfkc: "\u{B5B3}", - nfkd: "\u{1104}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{B5B4}", - nfc: "\u{B5B4}", - nfd: "\u{1104}\u{1165}\u{11BB}", - nfkc: "\u{B5B4}", - nfkd: "\u{1104}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{B5B5}", - nfc: "\u{B5B5}", - nfd: "\u{1104}\u{1165}\u{11BC}", - nfkc: "\u{B5B5}", - nfkd: "\u{1104}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{B5B6}", - nfc: "\u{B5B6}", - nfd: "\u{1104}\u{1165}\u{11BD}", - nfkc: "\u{B5B6}", - nfkd: "\u{1104}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{B5B7}", - nfc: "\u{B5B7}", - nfd: "\u{1104}\u{1165}\u{11BE}", - nfkc: "\u{B5B7}", - nfkd: "\u{1104}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{B5B8}", - nfc: "\u{B5B8}", - nfd: "\u{1104}\u{1165}\u{11BF}", - nfkc: "\u{B5B8}", - nfkd: "\u{1104}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{B5B9}", - nfc: "\u{B5B9}", - nfd: "\u{1104}\u{1165}\u{11C0}", - nfkc: "\u{B5B9}", - nfkd: "\u{1104}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{B5BA}", - nfc: "\u{B5BA}", - nfd: "\u{1104}\u{1165}\u{11C1}", - nfkc: "\u{B5BA}", - nfkd: "\u{1104}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{B5BB}", - nfc: "\u{B5BB}", - nfd: "\u{1104}\u{1165}\u{11C2}", - nfkc: "\u{B5BB}", - nfkd: "\u{1104}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{B5BC}", - nfc: "\u{B5BC}", - nfd: "\u{1104}\u{1166}", - nfkc: "\u{B5BC}", - nfkd: "\u{1104}\u{1166}", - }, - NormalizationTest { - source: "\u{B5BD}", - nfc: "\u{B5BD}", - nfd: "\u{1104}\u{1166}\u{11A8}", - nfkc: "\u{B5BD}", - nfkd: "\u{1104}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{B5BE}", - nfc: "\u{B5BE}", - nfd: "\u{1104}\u{1166}\u{11A9}", - nfkc: "\u{B5BE}", - nfkd: "\u{1104}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{B5BF}", - nfc: "\u{B5BF}", - nfd: "\u{1104}\u{1166}\u{11AA}", - nfkc: "\u{B5BF}", - nfkd: "\u{1104}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{B5C0}", - nfc: "\u{B5C0}", - nfd: "\u{1104}\u{1166}\u{11AB}", - nfkc: "\u{B5C0}", - nfkd: "\u{1104}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{B5C1}", - nfc: "\u{B5C1}", - nfd: "\u{1104}\u{1166}\u{11AC}", - nfkc: "\u{B5C1}", - nfkd: "\u{1104}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{B5C2}", - nfc: "\u{B5C2}", - nfd: "\u{1104}\u{1166}\u{11AD}", - nfkc: "\u{B5C2}", - nfkd: "\u{1104}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{B5C3}", - nfc: "\u{B5C3}", - nfd: "\u{1104}\u{1166}\u{11AE}", - nfkc: "\u{B5C3}", - nfkd: "\u{1104}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{B5C4}", - nfc: "\u{B5C4}", - nfd: "\u{1104}\u{1166}\u{11AF}", - nfkc: "\u{B5C4}", - nfkd: "\u{1104}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{B5C5}", - nfc: "\u{B5C5}", - nfd: "\u{1104}\u{1166}\u{11B0}", - nfkc: "\u{B5C5}", - nfkd: "\u{1104}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{B5C6}", - nfc: "\u{B5C6}", - nfd: "\u{1104}\u{1166}\u{11B1}", - nfkc: "\u{B5C6}", - nfkd: "\u{1104}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{B5C7}", - nfc: "\u{B5C7}", - nfd: "\u{1104}\u{1166}\u{11B2}", - nfkc: "\u{B5C7}", - nfkd: "\u{1104}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{B5C8}", - nfc: "\u{B5C8}", - nfd: "\u{1104}\u{1166}\u{11B3}", - nfkc: "\u{B5C8}", - nfkd: "\u{1104}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{B5C9}", - nfc: "\u{B5C9}", - nfd: "\u{1104}\u{1166}\u{11B4}", - nfkc: "\u{B5C9}", - nfkd: "\u{1104}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{B5CA}", - nfc: "\u{B5CA}", - nfd: "\u{1104}\u{1166}\u{11B5}", - nfkc: "\u{B5CA}", - nfkd: "\u{1104}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{B5CB}", - nfc: "\u{B5CB}", - nfd: "\u{1104}\u{1166}\u{11B6}", - nfkc: "\u{B5CB}", - nfkd: "\u{1104}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{B5CC}", - nfc: "\u{B5CC}", - nfd: "\u{1104}\u{1166}\u{11B7}", - nfkc: "\u{B5CC}", - nfkd: "\u{1104}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{B5CD}", - nfc: "\u{B5CD}", - nfd: "\u{1104}\u{1166}\u{11B8}", - nfkc: "\u{B5CD}", - nfkd: "\u{1104}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{B5CE}", - nfc: "\u{B5CE}", - nfd: "\u{1104}\u{1166}\u{11B9}", - nfkc: "\u{B5CE}", - nfkd: "\u{1104}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{B5CF}", - nfc: "\u{B5CF}", - nfd: "\u{1104}\u{1166}\u{11BA}", - nfkc: "\u{B5CF}", - nfkd: "\u{1104}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{B5D0}", - nfc: "\u{B5D0}", - nfd: "\u{1104}\u{1166}\u{11BB}", - nfkc: "\u{B5D0}", - nfkd: "\u{1104}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{B5D1}", - nfc: "\u{B5D1}", - nfd: "\u{1104}\u{1166}\u{11BC}", - nfkc: "\u{B5D1}", - nfkd: "\u{1104}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{B5D2}", - nfc: "\u{B5D2}", - nfd: "\u{1104}\u{1166}\u{11BD}", - nfkc: "\u{B5D2}", - nfkd: "\u{1104}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{B5D3}", - nfc: "\u{B5D3}", - nfd: "\u{1104}\u{1166}\u{11BE}", - nfkc: "\u{B5D3}", - nfkd: "\u{1104}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{B5D4}", - nfc: "\u{B5D4}", - nfd: "\u{1104}\u{1166}\u{11BF}", - nfkc: "\u{B5D4}", - nfkd: "\u{1104}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{B5D5}", - nfc: "\u{B5D5}", - nfd: "\u{1104}\u{1166}\u{11C0}", - nfkc: "\u{B5D5}", - nfkd: "\u{1104}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{B5D6}", - nfc: "\u{B5D6}", - nfd: "\u{1104}\u{1166}\u{11C1}", - nfkc: "\u{B5D6}", - nfkd: "\u{1104}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{B5D7}", - nfc: "\u{B5D7}", - nfd: "\u{1104}\u{1166}\u{11C2}", - nfkc: "\u{B5D7}", - nfkd: "\u{1104}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{B5D8}", - nfc: "\u{B5D8}", - nfd: "\u{1104}\u{1167}", - nfkc: "\u{B5D8}", - nfkd: "\u{1104}\u{1167}", - }, - NormalizationTest { - source: "\u{B5D9}", - nfc: "\u{B5D9}", - nfd: "\u{1104}\u{1167}\u{11A8}", - nfkc: "\u{B5D9}", - nfkd: "\u{1104}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{B5DA}", - nfc: "\u{B5DA}", - nfd: "\u{1104}\u{1167}\u{11A9}", - nfkc: "\u{B5DA}", - nfkd: "\u{1104}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{B5DB}", - nfc: "\u{B5DB}", - nfd: "\u{1104}\u{1167}\u{11AA}", - nfkc: "\u{B5DB}", - nfkd: "\u{1104}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{B5DC}", - nfc: "\u{B5DC}", - nfd: "\u{1104}\u{1167}\u{11AB}", - nfkc: "\u{B5DC}", - nfkd: "\u{1104}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{B5DD}", - nfc: "\u{B5DD}", - nfd: "\u{1104}\u{1167}\u{11AC}", - nfkc: "\u{B5DD}", - nfkd: "\u{1104}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{B5DE}", - nfc: "\u{B5DE}", - nfd: "\u{1104}\u{1167}\u{11AD}", - nfkc: "\u{B5DE}", - nfkd: "\u{1104}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{B5DF}", - nfc: "\u{B5DF}", - nfd: "\u{1104}\u{1167}\u{11AE}", - nfkc: "\u{B5DF}", - nfkd: "\u{1104}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{B5E0}", - nfc: "\u{B5E0}", - nfd: "\u{1104}\u{1167}\u{11AF}", - nfkc: "\u{B5E0}", - nfkd: "\u{1104}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{B5E1}", - nfc: "\u{B5E1}", - nfd: "\u{1104}\u{1167}\u{11B0}", - nfkc: "\u{B5E1}", - nfkd: "\u{1104}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{B5E2}", - nfc: "\u{B5E2}", - nfd: "\u{1104}\u{1167}\u{11B1}", - nfkc: "\u{B5E2}", - nfkd: "\u{1104}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{B5E3}", - nfc: "\u{B5E3}", - nfd: "\u{1104}\u{1167}\u{11B2}", - nfkc: "\u{B5E3}", - nfkd: "\u{1104}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{B5E4}", - nfc: "\u{B5E4}", - nfd: "\u{1104}\u{1167}\u{11B3}", - nfkc: "\u{B5E4}", - nfkd: "\u{1104}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{B5E5}", - nfc: "\u{B5E5}", - nfd: "\u{1104}\u{1167}\u{11B4}", - nfkc: "\u{B5E5}", - nfkd: "\u{1104}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{B5E6}", - nfc: "\u{B5E6}", - nfd: "\u{1104}\u{1167}\u{11B5}", - nfkc: "\u{B5E6}", - nfkd: "\u{1104}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{B5E7}", - nfc: "\u{B5E7}", - nfd: "\u{1104}\u{1167}\u{11B6}", - nfkc: "\u{B5E7}", - nfkd: "\u{1104}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{B5E8}", - nfc: "\u{B5E8}", - nfd: "\u{1104}\u{1167}\u{11B7}", - nfkc: "\u{B5E8}", - nfkd: "\u{1104}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{B5E9}", - nfc: "\u{B5E9}", - nfd: "\u{1104}\u{1167}\u{11B8}", - nfkc: "\u{B5E9}", - nfkd: "\u{1104}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{B5EA}", - nfc: "\u{B5EA}", - nfd: "\u{1104}\u{1167}\u{11B9}", - nfkc: "\u{B5EA}", - nfkd: "\u{1104}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{B5EB}", - nfc: "\u{B5EB}", - nfd: "\u{1104}\u{1167}\u{11BA}", - nfkc: "\u{B5EB}", - nfkd: "\u{1104}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{B5EC}", - nfc: "\u{B5EC}", - nfd: "\u{1104}\u{1167}\u{11BB}", - nfkc: "\u{B5EC}", - nfkd: "\u{1104}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{B5ED}", - nfc: "\u{B5ED}", - nfd: "\u{1104}\u{1167}\u{11BC}", - nfkc: "\u{B5ED}", - nfkd: "\u{1104}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{B5EE}", - nfc: "\u{B5EE}", - nfd: "\u{1104}\u{1167}\u{11BD}", - nfkc: "\u{B5EE}", - nfkd: "\u{1104}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{B5EF}", - nfc: "\u{B5EF}", - nfd: "\u{1104}\u{1167}\u{11BE}", - nfkc: "\u{B5EF}", - nfkd: "\u{1104}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{B5F0}", - nfc: "\u{B5F0}", - nfd: "\u{1104}\u{1167}\u{11BF}", - nfkc: "\u{B5F0}", - nfkd: "\u{1104}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{B5F1}", - nfc: "\u{B5F1}", - nfd: "\u{1104}\u{1167}\u{11C0}", - nfkc: "\u{B5F1}", - nfkd: "\u{1104}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{B5F2}", - nfc: "\u{B5F2}", - nfd: "\u{1104}\u{1167}\u{11C1}", - nfkc: "\u{B5F2}", - nfkd: "\u{1104}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{B5F3}", - nfc: "\u{B5F3}", - nfd: "\u{1104}\u{1167}\u{11C2}", - nfkc: "\u{B5F3}", - nfkd: "\u{1104}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{B5F4}", - nfc: "\u{B5F4}", - nfd: "\u{1104}\u{1168}", - nfkc: "\u{B5F4}", - nfkd: "\u{1104}\u{1168}", - }, - NormalizationTest { - source: "\u{B5F5}", - nfc: "\u{B5F5}", - nfd: "\u{1104}\u{1168}\u{11A8}", - nfkc: "\u{B5F5}", - nfkd: "\u{1104}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{B5F6}", - nfc: "\u{B5F6}", - nfd: "\u{1104}\u{1168}\u{11A9}", - nfkc: "\u{B5F6}", - nfkd: "\u{1104}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{B5F7}", - nfc: "\u{B5F7}", - nfd: "\u{1104}\u{1168}\u{11AA}", - nfkc: "\u{B5F7}", - nfkd: "\u{1104}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{B5F8}", - nfc: "\u{B5F8}", - nfd: "\u{1104}\u{1168}\u{11AB}", - nfkc: "\u{B5F8}", - nfkd: "\u{1104}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{B5F9}", - nfc: "\u{B5F9}", - nfd: "\u{1104}\u{1168}\u{11AC}", - nfkc: "\u{B5F9}", - nfkd: "\u{1104}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{B5FA}", - nfc: "\u{B5FA}", - nfd: "\u{1104}\u{1168}\u{11AD}", - nfkc: "\u{B5FA}", - nfkd: "\u{1104}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{B5FB}", - nfc: "\u{B5FB}", - nfd: "\u{1104}\u{1168}\u{11AE}", - nfkc: "\u{B5FB}", - nfkd: "\u{1104}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{B5FC}", - nfc: "\u{B5FC}", - nfd: "\u{1104}\u{1168}\u{11AF}", - nfkc: "\u{B5FC}", - nfkd: "\u{1104}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{B5FD}", - nfc: "\u{B5FD}", - nfd: "\u{1104}\u{1168}\u{11B0}", - nfkc: "\u{B5FD}", - nfkd: "\u{1104}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{B5FE}", - nfc: "\u{B5FE}", - nfd: "\u{1104}\u{1168}\u{11B1}", - nfkc: "\u{B5FE}", - nfkd: "\u{1104}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{B5FF}", - nfc: "\u{B5FF}", - nfd: "\u{1104}\u{1168}\u{11B2}", - nfkc: "\u{B5FF}", - nfkd: "\u{1104}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{B600}", - nfc: "\u{B600}", - nfd: "\u{1104}\u{1168}\u{11B3}", - nfkc: "\u{B600}", - nfkd: "\u{1104}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{B601}", - nfc: "\u{B601}", - nfd: "\u{1104}\u{1168}\u{11B4}", - nfkc: "\u{B601}", - nfkd: "\u{1104}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{B602}", - nfc: "\u{B602}", - nfd: "\u{1104}\u{1168}\u{11B5}", - nfkc: "\u{B602}", - nfkd: "\u{1104}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{B603}", - nfc: "\u{B603}", - nfd: "\u{1104}\u{1168}\u{11B6}", - nfkc: "\u{B603}", - nfkd: "\u{1104}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{B604}", - nfc: "\u{B604}", - nfd: "\u{1104}\u{1168}\u{11B7}", - nfkc: "\u{B604}", - nfkd: "\u{1104}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{B605}", - nfc: "\u{B605}", - nfd: "\u{1104}\u{1168}\u{11B8}", - nfkc: "\u{B605}", - nfkd: "\u{1104}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{B606}", - nfc: "\u{B606}", - nfd: "\u{1104}\u{1168}\u{11B9}", - nfkc: "\u{B606}", - nfkd: "\u{1104}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{B607}", - nfc: "\u{B607}", - nfd: "\u{1104}\u{1168}\u{11BA}", - nfkc: "\u{B607}", - nfkd: "\u{1104}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{B608}", - nfc: "\u{B608}", - nfd: "\u{1104}\u{1168}\u{11BB}", - nfkc: "\u{B608}", - nfkd: "\u{1104}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{B609}", - nfc: "\u{B609}", - nfd: "\u{1104}\u{1168}\u{11BC}", - nfkc: "\u{B609}", - nfkd: "\u{1104}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{B60A}", - nfc: "\u{B60A}", - nfd: "\u{1104}\u{1168}\u{11BD}", - nfkc: "\u{B60A}", - nfkd: "\u{1104}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{B60B}", - nfc: "\u{B60B}", - nfd: "\u{1104}\u{1168}\u{11BE}", - nfkc: "\u{B60B}", - nfkd: "\u{1104}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{B60C}", - nfc: "\u{B60C}", - nfd: "\u{1104}\u{1168}\u{11BF}", - nfkc: "\u{B60C}", - nfkd: "\u{1104}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{B60D}", - nfc: "\u{B60D}", - nfd: "\u{1104}\u{1168}\u{11C0}", - nfkc: "\u{B60D}", - nfkd: "\u{1104}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{B60E}", - nfc: "\u{B60E}", - nfd: "\u{1104}\u{1168}\u{11C1}", - nfkc: "\u{B60E}", - nfkd: "\u{1104}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{B60F}", - nfc: "\u{B60F}", - nfd: "\u{1104}\u{1168}\u{11C2}", - nfkc: "\u{B60F}", - nfkd: "\u{1104}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{B610}", - nfc: "\u{B610}", - nfd: "\u{1104}\u{1169}", - nfkc: "\u{B610}", - nfkd: "\u{1104}\u{1169}", - }, - NormalizationTest { - source: "\u{B611}", - nfc: "\u{B611}", - nfd: "\u{1104}\u{1169}\u{11A8}", - nfkc: "\u{B611}", - nfkd: "\u{1104}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{B612}", - nfc: "\u{B612}", - nfd: "\u{1104}\u{1169}\u{11A9}", - nfkc: "\u{B612}", - nfkd: "\u{1104}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{B613}", - nfc: "\u{B613}", - nfd: "\u{1104}\u{1169}\u{11AA}", - nfkc: "\u{B613}", - nfkd: "\u{1104}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{B614}", - nfc: "\u{B614}", - nfd: "\u{1104}\u{1169}\u{11AB}", - nfkc: "\u{B614}", - nfkd: "\u{1104}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{B615}", - nfc: "\u{B615}", - nfd: "\u{1104}\u{1169}\u{11AC}", - nfkc: "\u{B615}", - nfkd: "\u{1104}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{B616}", - nfc: "\u{B616}", - nfd: "\u{1104}\u{1169}\u{11AD}", - nfkc: "\u{B616}", - nfkd: "\u{1104}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{B617}", - nfc: "\u{B617}", - nfd: "\u{1104}\u{1169}\u{11AE}", - nfkc: "\u{B617}", - nfkd: "\u{1104}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{B618}", - nfc: "\u{B618}", - nfd: "\u{1104}\u{1169}\u{11AF}", - nfkc: "\u{B618}", - nfkd: "\u{1104}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{B619}", - nfc: "\u{B619}", - nfd: "\u{1104}\u{1169}\u{11B0}", - nfkc: "\u{B619}", - nfkd: "\u{1104}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{B61A}", - nfc: "\u{B61A}", - nfd: "\u{1104}\u{1169}\u{11B1}", - nfkc: "\u{B61A}", - nfkd: "\u{1104}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{B61B}", - nfc: "\u{B61B}", - nfd: "\u{1104}\u{1169}\u{11B2}", - nfkc: "\u{B61B}", - nfkd: "\u{1104}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{B61C}", - nfc: "\u{B61C}", - nfd: "\u{1104}\u{1169}\u{11B3}", - nfkc: "\u{B61C}", - nfkd: "\u{1104}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{B61D}", - nfc: "\u{B61D}", - nfd: "\u{1104}\u{1169}\u{11B4}", - nfkc: "\u{B61D}", - nfkd: "\u{1104}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{B61E}", - nfc: "\u{B61E}", - nfd: "\u{1104}\u{1169}\u{11B5}", - nfkc: "\u{B61E}", - nfkd: "\u{1104}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{B61F}", - nfc: "\u{B61F}", - nfd: "\u{1104}\u{1169}\u{11B6}", - nfkc: "\u{B61F}", - nfkd: "\u{1104}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{B620}", - nfc: "\u{B620}", - nfd: "\u{1104}\u{1169}\u{11B7}", - nfkc: "\u{B620}", - nfkd: "\u{1104}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{B621}", - nfc: "\u{B621}", - nfd: "\u{1104}\u{1169}\u{11B8}", - nfkc: "\u{B621}", - nfkd: "\u{1104}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{B622}", - nfc: "\u{B622}", - nfd: "\u{1104}\u{1169}\u{11B9}", - nfkc: "\u{B622}", - nfkd: "\u{1104}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{B623}", - nfc: "\u{B623}", - nfd: "\u{1104}\u{1169}\u{11BA}", - nfkc: "\u{B623}", - nfkd: "\u{1104}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{B624}", - nfc: "\u{B624}", - nfd: "\u{1104}\u{1169}\u{11BB}", - nfkc: "\u{B624}", - nfkd: "\u{1104}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{B625}", - nfc: "\u{B625}", - nfd: "\u{1104}\u{1169}\u{11BC}", - nfkc: "\u{B625}", - nfkd: "\u{1104}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{B626}", - nfc: "\u{B626}", - nfd: "\u{1104}\u{1169}\u{11BD}", - nfkc: "\u{B626}", - nfkd: "\u{1104}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{B627}", - nfc: "\u{B627}", - nfd: "\u{1104}\u{1169}\u{11BE}", - nfkc: "\u{B627}", - nfkd: "\u{1104}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{B628}", - nfc: "\u{B628}", - nfd: "\u{1104}\u{1169}\u{11BF}", - nfkc: "\u{B628}", - nfkd: "\u{1104}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{B629}", - nfc: "\u{B629}", - nfd: "\u{1104}\u{1169}\u{11C0}", - nfkc: "\u{B629}", - nfkd: "\u{1104}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{B62A}", - nfc: "\u{B62A}", - nfd: "\u{1104}\u{1169}\u{11C1}", - nfkc: "\u{B62A}", - nfkd: "\u{1104}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{B62B}", - nfc: "\u{B62B}", - nfd: "\u{1104}\u{1169}\u{11C2}", - nfkc: "\u{B62B}", - nfkd: "\u{1104}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{B62C}", - nfc: "\u{B62C}", - nfd: "\u{1104}\u{116A}", - nfkc: "\u{B62C}", - nfkd: "\u{1104}\u{116A}", - }, - NormalizationTest { - source: "\u{B62D}", - nfc: "\u{B62D}", - nfd: "\u{1104}\u{116A}\u{11A8}", - nfkc: "\u{B62D}", - nfkd: "\u{1104}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{B62E}", - nfc: "\u{B62E}", - nfd: "\u{1104}\u{116A}\u{11A9}", - nfkc: "\u{B62E}", - nfkd: "\u{1104}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{B62F}", - nfc: "\u{B62F}", - nfd: "\u{1104}\u{116A}\u{11AA}", - nfkc: "\u{B62F}", - nfkd: "\u{1104}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{B630}", - nfc: "\u{B630}", - nfd: "\u{1104}\u{116A}\u{11AB}", - nfkc: "\u{B630}", - nfkd: "\u{1104}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{B631}", - nfc: "\u{B631}", - nfd: "\u{1104}\u{116A}\u{11AC}", - nfkc: "\u{B631}", - nfkd: "\u{1104}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{B632}", - nfc: "\u{B632}", - nfd: "\u{1104}\u{116A}\u{11AD}", - nfkc: "\u{B632}", - nfkd: "\u{1104}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{B633}", - nfc: "\u{B633}", - nfd: "\u{1104}\u{116A}\u{11AE}", - nfkc: "\u{B633}", - nfkd: "\u{1104}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{B634}", - nfc: "\u{B634}", - nfd: "\u{1104}\u{116A}\u{11AF}", - nfkc: "\u{B634}", - nfkd: "\u{1104}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{B635}", - nfc: "\u{B635}", - nfd: "\u{1104}\u{116A}\u{11B0}", - nfkc: "\u{B635}", - nfkd: "\u{1104}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{B636}", - nfc: "\u{B636}", - nfd: "\u{1104}\u{116A}\u{11B1}", - nfkc: "\u{B636}", - nfkd: "\u{1104}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{B637}", - nfc: "\u{B637}", - nfd: "\u{1104}\u{116A}\u{11B2}", - nfkc: "\u{B637}", - nfkd: "\u{1104}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{B638}", - nfc: "\u{B638}", - nfd: "\u{1104}\u{116A}\u{11B3}", - nfkc: "\u{B638}", - nfkd: "\u{1104}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{B639}", - nfc: "\u{B639}", - nfd: "\u{1104}\u{116A}\u{11B4}", - nfkc: "\u{B639}", - nfkd: "\u{1104}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{B63A}", - nfc: "\u{B63A}", - nfd: "\u{1104}\u{116A}\u{11B5}", - nfkc: "\u{B63A}", - nfkd: "\u{1104}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{B63B}", - nfc: "\u{B63B}", - nfd: "\u{1104}\u{116A}\u{11B6}", - nfkc: "\u{B63B}", - nfkd: "\u{1104}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{B63C}", - nfc: "\u{B63C}", - nfd: "\u{1104}\u{116A}\u{11B7}", - nfkc: "\u{B63C}", - nfkd: "\u{1104}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{B63D}", - nfc: "\u{B63D}", - nfd: "\u{1104}\u{116A}\u{11B8}", - nfkc: "\u{B63D}", - nfkd: "\u{1104}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{B63E}", - nfc: "\u{B63E}", - nfd: "\u{1104}\u{116A}\u{11B9}", - nfkc: "\u{B63E}", - nfkd: "\u{1104}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{B63F}", - nfc: "\u{B63F}", - nfd: "\u{1104}\u{116A}\u{11BA}", - nfkc: "\u{B63F}", - nfkd: "\u{1104}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{B640}", - nfc: "\u{B640}", - nfd: "\u{1104}\u{116A}\u{11BB}", - nfkc: "\u{B640}", - nfkd: "\u{1104}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{B641}", - nfc: "\u{B641}", - nfd: "\u{1104}\u{116A}\u{11BC}", - nfkc: "\u{B641}", - nfkd: "\u{1104}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{B642}", - nfc: "\u{B642}", - nfd: "\u{1104}\u{116A}\u{11BD}", - nfkc: "\u{B642}", - nfkd: "\u{1104}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{B643}", - nfc: "\u{B643}", - nfd: "\u{1104}\u{116A}\u{11BE}", - nfkc: "\u{B643}", - nfkd: "\u{1104}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{B644}", - nfc: "\u{B644}", - nfd: "\u{1104}\u{116A}\u{11BF}", - nfkc: "\u{B644}", - nfkd: "\u{1104}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{B645}", - nfc: "\u{B645}", - nfd: "\u{1104}\u{116A}\u{11C0}", - nfkc: "\u{B645}", - nfkd: "\u{1104}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{B646}", - nfc: "\u{B646}", - nfd: "\u{1104}\u{116A}\u{11C1}", - nfkc: "\u{B646}", - nfkd: "\u{1104}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{B647}", - nfc: "\u{B647}", - nfd: "\u{1104}\u{116A}\u{11C2}", - nfkc: "\u{B647}", - nfkd: "\u{1104}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{B648}", - nfc: "\u{B648}", - nfd: "\u{1104}\u{116B}", - nfkc: "\u{B648}", - nfkd: "\u{1104}\u{116B}", - }, - NormalizationTest { - source: "\u{B649}", - nfc: "\u{B649}", - nfd: "\u{1104}\u{116B}\u{11A8}", - nfkc: "\u{B649}", - nfkd: "\u{1104}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{B64A}", - nfc: "\u{B64A}", - nfd: "\u{1104}\u{116B}\u{11A9}", - nfkc: "\u{B64A}", - nfkd: "\u{1104}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{B64B}", - nfc: "\u{B64B}", - nfd: "\u{1104}\u{116B}\u{11AA}", - nfkc: "\u{B64B}", - nfkd: "\u{1104}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{B64C}", - nfc: "\u{B64C}", - nfd: "\u{1104}\u{116B}\u{11AB}", - nfkc: "\u{B64C}", - nfkd: "\u{1104}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{B64D}", - nfc: "\u{B64D}", - nfd: "\u{1104}\u{116B}\u{11AC}", - nfkc: "\u{B64D}", - nfkd: "\u{1104}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{B64E}", - nfc: "\u{B64E}", - nfd: "\u{1104}\u{116B}\u{11AD}", - nfkc: "\u{B64E}", - nfkd: "\u{1104}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{B64F}", - nfc: "\u{B64F}", - nfd: "\u{1104}\u{116B}\u{11AE}", - nfkc: "\u{B64F}", - nfkd: "\u{1104}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{B650}", - nfc: "\u{B650}", - nfd: "\u{1104}\u{116B}\u{11AF}", - nfkc: "\u{B650}", - nfkd: "\u{1104}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{B651}", - nfc: "\u{B651}", - nfd: "\u{1104}\u{116B}\u{11B0}", - nfkc: "\u{B651}", - nfkd: "\u{1104}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{B652}", - nfc: "\u{B652}", - nfd: "\u{1104}\u{116B}\u{11B1}", - nfkc: "\u{B652}", - nfkd: "\u{1104}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{B653}", - nfc: "\u{B653}", - nfd: "\u{1104}\u{116B}\u{11B2}", - nfkc: "\u{B653}", - nfkd: "\u{1104}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{B654}", - nfc: "\u{B654}", - nfd: "\u{1104}\u{116B}\u{11B3}", - nfkc: "\u{B654}", - nfkd: "\u{1104}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{B655}", - nfc: "\u{B655}", - nfd: "\u{1104}\u{116B}\u{11B4}", - nfkc: "\u{B655}", - nfkd: "\u{1104}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{B656}", - nfc: "\u{B656}", - nfd: "\u{1104}\u{116B}\u{11B5}", - nfkc: "\u{B656}", - nfkd: "\u{1104}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{B657}", - nfc: "\u{B657}", - nfd: "\u{1104}\u{116B}\u{11B6}", - nfkc: "\u{B657}", - nfkd: "\u{1104}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{B658}", - nfc: "\u{B658}", - nfd: "\u{1104}\u{116B}\u{11B7}", - nfkc: "\u{B658}", - nfkd: "\u{1104}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{B659}", - nfc: "\u{B659}", - nfd: "\u{1104}\u{116B}\u{11B8}", - nfkc: "\u{B659}", - nfkd: "\u{1104}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{B65A}", - nfc: "\u{B65A}", - nfd: "\u{1104}\u{116B}\u{11B9}", - nfkc: "\u{B65A}", - nfkd: "\u{1104}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{B65B}", - nfc: "\u{B65B}", - nfd: "\u{1104}\u{116B}\u{11BA}", - nfkc: "\u{B65B}", - nfkd: "\u{1104}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{B65C}", - nfc: "\u{B65C}", - nfd: "\u{1104}\u{116B}\u{11BB}", - nfkc: "\u{B65C}", - nfkd: "\u{1104}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{B65D}", - nfc: "\u{B65D}", - nfd: "\u{1104}\u{116B}\u{11BC}", - nfkc: "\u{B65D}", - nfkd: "\u{1104}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{B65E}", - nfc: "\u{B65E}", - nfd: "\u{1104}\u{116B}\u{11BD}", - nfkc: "\u{B65E}", - nfkd: "\u{1104}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{B65F}", - nfc: "\u{B65F}", - nfd: "\u{1104}\u{116B}\u{11BE}", - nfkc: "\u{B65F}", - nfkd: "\u{1104}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{B660}", - nfc: "\u{B660}", - nfd: "\u{1104}\u{116B}\u{11BF}", - nfkc: "\u{B660}", - nfkd: "\u{1104}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{B661}", - nfc: "\u{B661}", - nfd: "\u{1104}\u{116B}\u{11C0}", - nfkc: "\u{B661}", - nfkd: "\u{1104}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{B662}", - nfc: "\u{B662}", - nfd: "\u{1104}\u{116B}\u{11C1}", - nfkc: "\u{B662}", - nfkd: "\u{1104}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{B663}", - nfc: "\u{B663}", - nfd: "\u{1104}\u{116B}\u{11C2}", - nfkc: "\u{B663}", - nfkd: "\u{1104}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{B664}", - nfc: "\u{B664}", - nfd: "\u{1104}\u{116C}", - nfkc: "\u{B664}", - nfkd: "\u{1104}\u{116C}", - }, - NormalizationTest { - source: "\u{B665}", - nfc: "\u{B665}", - nfd: "\u{1104}\u{116C}\u{11A8}", - nfkc: "\u{B665}", - nfkd: "\u{1104}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{B666}", - nfc: "\u{B666}", - nfd: "\u{1104}\u{116C}\u{11A9}", - nfkc: "\u{B666}", - nfkd: "\u{1104}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{B667}", - nfc: "\u{B667}", - nfd: "\u{1104}\u{116C}\u{11AA}", - nfkc: "\u{B667}", - nfkd: "\u{1104}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{B668}", - nfc: "\u{B668}", - nfd: "\u{1104}\u{116C}\u{11AB}", - nfkc: "\u{B668}", - nfkd: "\u{1104}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{B669}", - nfc: "\u{B669}", - nfd: "\u{1104}\u{116C}\u{11AC}", - nfkc: "\u{B669}", - nfkd: "\u{1104}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{B66A}", - nfc: "\u{B66A}", - nfd: "\u{1104}\u{116C}\u{11AD}", - nfkc: "\u{B66A}", - nfkd: "\u{1104}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{B66B}", - nfc: "\u{B66B}", - nfd: "\u{1104}\u{116C}\u{11AE}", - nfkc: "\u{B66B}", - nfkd: "\u{1104}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{B66C}", - nfc: "\u{B66C}", - nfd: "\u{1104}\u{116C}\u{11AF}", - nfkc: "\u{B66C}", - nfkd: "\u{1104}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{B66D}", - nfc: "\u{B66D}", - nfd: "\u{1104}\u{116C}\u{11B0}", - nfkc: "\u{B66D}", - nfkd: "\u{1104}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{B66E}", - nfc: "\u{B66E}", - nfd: "\u{1104}\u{116C}\u{11B1}", - nfkc: "\u{B66E}", - nfkd: "\u{1104}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{B66F}", - nfc: "\u{B66F}", - nfd: "\u{1104}\u{116C}\u{11B2}", - nfkc: "\u{B66F}", - nfkd: "\u{1104}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{B670}", - nfc: "\u{B670}", - nfd: "\u{1104}\u{116C}\u{11B3}", - nfkc: "\u{B670}", - nfkd: "\u{1104}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{B671}", - nfc: "\u{B671}", - nfd: "\u{1104}\u{116C}\u{11B4}", - nfkc: "\u{B671}", - nfkd: "\u{1104}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{B672}", - nfc: "\u{B672}", - nfd: "\u{1104}\u{116C}\u{11B5}", - nfkc: "\u{B672}", - nfkd: "\u{1104}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{B673}", - nfc: "\u{B673}", - nfd: "\u{1104}\u{116C}\u{11B6}", - nfkc: "\u{B673}", - nfkd: "\u{1104}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{B674}", - nfc: "\u{B674}", - nfd: "\u{1104}\u{116C}\u{11B7}", - nfkc: "\u{B674}", - nfkd: "\u{1104}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{B675}", - nfc: "\u{B675}", - nfd: "\u{1104}\u{116C}\u{11B8}", - nfkc: "\u{B675}", - nfkd: "\u{1104}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{B676}", - nfc: "\u{B676}", - nfd: "\u{1104}\u{116C}\u{11B9}", - nfkc: "\u{B676}", - nfkd: "\u{1104}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{B677}", - nfc: "\u{B677}", - nfd: "\u{1104}\u{116C}\u{11BA}", - nfkc: "\u{B677}", - nfkd: "\u{1104}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{B678}", - nfc: "\u{B678}", - nfd: "\u{1104}\u{116C}\u{11BB}", - nfkc: "\u{B678}", - nfkd: "\u{1104}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{B679}", - nfc: "\u{B679}", - nfd: "\u{1104}\u{116C}\u{11BC}", - nfkc: "\u{B679}", - nfkd: "\u{1104}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{B67A}", - nfc: "\u{B67A}", - nfd: "\u{1104}\u{116C}\u{11BD}", - nfkc: "\u{B67A}", - nfkd: "\u{1104}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{B67B}", - nfc: "\u{B67B}", - nfd: "\u{1104}\u{116C}\u{11BE}", - nfkc: "\u{B67B}", - nfkd: "\u{1104}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{B67C}", - nfc: "\u{B67C}", - nfd: "\u{1104}\u{116C}\u{11BF}", - nfkc: "\u{B67C}", - nfkd: "\u{1104}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{B67D}", - nfc: "\u{B67D}", - nfd: "\u{1104}\u{116C}\u{11C0}", - nfkc: "\u{B67D}", - nfkd: "\u{1104}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{B67E}", - nfc: "\u{B67E}", - nfd: "\u{1104}\u{116C}\u{11C1}", - nfkc: "\u{B67E}", - nfkd: "\u{1104}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{B67F}", - nfc: "\u{B67F}", - nfd: "\u{1104}\u{116C}\u{11C2}", - nfkc: "\u{B67F}", - nfkd: "\u{1104}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{B680}", - nfc: "\u{B680}", - nfd: "\u{1104}\u{116D}", - nfkc: "\u{B680}", - nfkd: "\u{1104}\u{116D}", - }, - NormalizationTest { - source: "\u{B681}", - nfc: "\u{B681}", - nfd: "\u{1104}\u{116D}\u{11A8}", - nfkc: "\u{B681}", - nfkd: "\u{1104}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{B682}", - nfc: "\u{B682}", - nfd: "\u{1104}\u{116D}\u{11A9}", - nfkc: "\u{B682}", - nfkd: "\u{1104}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{B683}", - nfc: "\u{B683}", - nfd: "\u{1104}\u{116D}\u{11AA}", - nfkc: "\u{B683}", - nfkd: "\u{1104}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{B684}", - nfc: "\u{B684}", - nfd: "\u{1104}\u{116D}\u{11AB}", - nfkc: "\u{B684}", - nfkd: "\u{1104}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{B685}", - nfc: "\u{B685}", - nfd: "\u{1104}\u{116D}\u{11AC}", - nfkc: "\u{B685}", - nfkd: "\u{1104}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{B686}", - nfc: "\u{B686}", - nfd: "\u{1104}\u{116D}\u{11AD}", - nfkc: "\u{B686}", - nfkd: "\u{1104}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{B687}", - nfc: "\u{B687}", - nfd: "\u{1104}\u{116D}\u{11AE}", - nfkc: "\u{B687}", - nfkd: "\u{1104}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{B688}", - nfc: "\u{B688}", - nfd: "\u{1104}\u{116D}\u{11AF}", - nfkc: "\u{B688}", - nfkd: "\u{1104}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{B689}", - nfc: "\u{B689}", - nfd: "\u{1104}\u{116D}\u{11B0}", - nfkc: "\u{B689}", - nfkd: "\u{1104}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{B68A}", - nfc: "\u{B68A}", - nfd: "\u{1104}\u{116D}\u{11B1}", - nfkc: "\u{B68A}", - nfkd: "\u{1104}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{B68B}", - nfc: "\u{B68B}", - nfd: "\u{1104}\u{116D}\u{11B2}", - nfkc: "\u{B68B}", - nfkd: "\u{1104}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{B68C}", - nfc: "\u{B68C}", - nfd: "\u{1104}\u{116D}\u{11B3}", - nfkc: "\u{B68C}", - nfkd: "\u{1104}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{B68D}", - nfc: "\u{B68D}", - nfd: "\u{1104}\u{116D}\u{11B4}", - nfkc: "\u{B68D}", - nfkd: "\u{1104}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{B68E}", - nfc: "\u{B68E}", - nfd: "\u{1104}\u{116D}\u{11B5}", - nfkc: "\u{B68E}", - nfkd: "\u{1104}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{B68F}", - nfc: "\u{B68F}", - nfd: "\u{1104}\u{116D}\u{11B6}", - nfkc: "\u{B68F}", - nfkd: "\u{1104}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{B690}", - nfc: "\u{B690}", - nfd: "\u{1104}\u{116D}\u{11B7}", - nfkc: "\u{B690}", - nfkd: "\u{1104}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{B691}", - nfc: "\u{B691}", - nfd: "\u{1104}\u{116D}\u{11B8}", - nfkc: "\u{B691}", - nfkd: "\u{1104}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{B692}", - nfc: "\u{B692}", - nfd: "\u{1104}\u{116D}\u{11B9}", - nfkc: "\u{B692}", - nfkd: "\u{1104}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{B693}", - nfc: "\u{B693}", - nfd: "\u{1104}\u{116D}\u{11BA}", - nfkc: "\u{B693}", - nfkd: "\u{1104}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{B694}", - nfc: "\u{B694}", - nfd: "\u{1104}\u{116D}\u{11BB}", - nfkc: "\u{B694}", - nfkd: "\u{1104}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{B695}", - nfc: "\u{B695}", - nfd: "\u{1104}\u{116D}\u{11BC}", - nfkc: "\u{B695}", - nfkd: "\u{1104}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{B696}", - nfc: "\u{B696}", - nfd: "\u{1104}\u{116D}\u{11BD}", - nfkc: "\u{B696}", - nfkd: "\u{1104}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{B697}", - nfc: "\u{B697}", - nfd: "\u{1104}\u{116D}\u{11BE}", - nfkc: "\u{B697}", - nfkd: "\u{1104}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{B698}", - nfc: "\u{B698}", - nfd: "\u{1104}\u{116D}\u{11BF}", - nfkc: "\u{B698}", - nfkd: "\u{1104}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{B699}", - nfc: "\u{B699}", - nfd: "\u{1104}\u{116D}\u{11C0}", - nfkc: "\u{B699}", - nfkd: "\u{1104}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{B69A}", - nfc: "\u{B69A}", - nfd: "\u{1104}\u{116D}\u{11C1}", - nfkc: "\u{B69A}", - nfkd: "\u{1104}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{B69B}", - nfc: "\u{B69B}", - nfd: "\u{1104}\u{116D}\u{11C2}", - nfkc: "\u{B69B}", - nfkd: "\u{1104}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{B69C}", - nfc: "\u{B69C}", - nfd: "\u{1104}\u{116E}", - nfkc: "\u{B69C}", - nfkd: "\u{1104}\u{116E}", - }, - NormalizationTest { - source: "\u{B69D}", - nfc: "\u{B69D}", - nfd: "\u{1104}\u{116E}\u{11A8}", - nfkc: "\u{B69D}", - nfkd: "\u{1104}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{B69E}", - nfc: "\u{B69E}", - nfd: "\u{1104}\u{116E}\u{11A9}", - nfkc: "\u{B69E}", - nfkd: "\u{1104}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{B69F}", - nfc: "\u{B69F}", - nfd: "\u{1104}\u{116E}\u{11AA}", - nfkc: "\u{B69F}", - nfkd: "\u{1104}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{B6A0}", - nfc: "\u{B6A0}", - nfd: "\u{1104}\u{116E}\u{11AB}", - nfkc: "\u{B6A0}", - nfkd: "\u{1104}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{B6A1}", - nfc: "\u{B6A1}", - nfd: "\u{1104}\u{116E}\u{11AC}", - nfkc: "\u{B6A1}", - nfkd: "\u{1104}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{B6A2}", - nfc: "\u{B6A2}", - nfd: "\u{1104}\u{116E}\u{11AD}", - nfkc: "\u{B6A2}", - nfkd: "\u{1104}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{B6A3}", - nfc: "\u{B6A3}", - nfd: "\u{1104}\u{116E}\u{11AE}", - nfkc: "\u{B6A3}", - nfkd: "\u{1104}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{B6A4}", - nfc: "\u{B6A4}", - nfd: "\u{1104}\u{116E}\u{11AF}", - nfkc: "\u{B6A4}", - nfkd: "\u{1104}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{B6A5}", - nfc: "\u{B6A5}", - nfd: "\u{1104}\u{116E}\u{11B0}", - nfkc: "\u{B6A5}", - nfkd: "\u{1104}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{B6A6}", - nfc: "\u{B6A6}", - nfd: "\u{1104}\u{116E}\u{11B1}", - nfkc: "\u{B6A6}", - nfkd: "\u{1104}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{B6A7}", - nfc: "\u{B6A7}", - nfd: "\u{1104}\u{116E}\u{11B2}", - nfkc: "\u{B6A7}", - nfkd: "\u{1104}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{B6A8}", - nfc: "\u{B6A8}", - nfd: "\u{1104}\u{116E}\u{11B3}", - nfkc: "\u{B6A8}", - nfkd: "\u{1104}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{B6A9}", - nfc: "\u{B6A9}", - nfd: "\u{1104}\u{116E}\u{11B4}", - nfkc: "\u{B6A9}", - nfkd: "\u{1104}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{B6AA}", - nfc: "\u{B6AA}", - nfd: "\u{1104}\u{116E}\u{11B5}", - nfkc: "\u{B6AA}", - nfkd: "\u{1104}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{B6AB}", - nfc: "\u{B6AB}", - nfd: "\u{1104}\u{116E}\u{11B6}", - nfkc: "\u{B6AB}", - nfkd: "\u{1104}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{B6AC}", - nfc: "\u{B6AC}", - nfd: "\u{1104}\u{116E}\u{11B7}", - nfkc: "\u{B6AC}", - nfkd: "\u{1104}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{B6AD}", - nfc: "\u{B6AD}", - nfd: "\u{1104}\u{116E}\u{11B8}", - nfkc: "\u{B6AD}", - nfkd: "\u{1104}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{B6AE}", - nfc: "\u{B6AE}", - nfd: "\u{1104}\u{116E}\u{11B9}", - nfkc: "\u{B6AE}", - nfkd: "\u{1104}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{B6AF}", - nfc: "\u{B6AF}", - nfd: "\u{1104}\u{116E}\u{11BA}", - nfkc: "\u{B6AF}", - nfkd: "\u{1104}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{B6B0}", - nfc: "\u{B6B0}", - nfd: "\u{1104}\u{116E}\u{11BB}", - nfkc: "\u{B6B0}", - nfkd: "\u{1104}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{B6B1}", - nfc: "\u{B6B1}", - nfd: "\u{1104}\u{116E}\u{11BC}", - nfkc: "\u{B6B1}", - nfkd: "\u{1104}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{B6B2}", - nfc: "\u{B6B2}", - nfd: "\u{1104}\u{116E}\u{11BD}", - nfkc: "\u{B6B2}", - nfkd: "\u{1104}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{B6B3}", - nfc: "\u{B6B3}", - nfd: "\u{1104}\u{116E}\u{11BE}", - nfkc: "\u{B6B3}", - nfkd: "\u{1104}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{B6B4}", - nfc: "\u{B6B4}", - nfd: "\u{1104}\u{116E}\u{11BF}", - nfkc: "\u{B6B4}", - nfkd: "\u{1104}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{B6B5}", - nfc: "\u{B6B5}", - nfd: "\u{1104}\u{116E}\u{11C0}", - nfkc: "\u{B6B5}", - nfkd: "\u{1104}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{B6B6}", - nfc: "\u{B6B6}", - nfd: "\u{1104}\u{116E}\u{11C1}", - nfkc: "\u{B6B6}", - nfkd: "\u{1104}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{B6B7}", - nfc: "\u{B6B7}", - nfd: "\u{1104}\u{116E}\u{11C2}", - nfkc: "\u{B6B7}", - nfkd: "\u{1104}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{B6B8}", - nfc: "\u{B6B8}", - nfd: "\u{1104}\u{116F}", - nfkc: "\u{B6B8}", - nfkd: "\u{1104}\u{116F}", - }, - NormalizationTest { - source: "\u{B6B9}", - nfc: "\u{B6B9}", - nfd: "\u{1104}\u{116F}\u{11A8}", - nfkc: "\u{B6B9}", - nfkd: "\u{1104}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{B6BA}", - nfc: "\u{B6BA}", - nfd: "\u{1104}\u{116F}\u{11A9}", - nfkc: "\u{B6BA}", - nfkd: "\u{1104}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{B6BB}", - nfc: "\u{B6BB}", - nfd: "\u{1104}\u{116F}\u{11AA}", - nfkc: "\u{B6BB}", - nfkd: "\u{1104}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{B6BC}", - nfc: "\u{B6BC}", - nfd: "\u{1104}\u{116F}\u{11AB}", - nfkc: "\u{B6BC}", - nfkd: "\u{1104}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{B6BD}", - nfc: "\u{B6BD}", - nfd: "\u{1104}\u{116F}\u{11AC}", - nfkc: "\u{B6BD}", - nfkd: "\u{1104}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{B6BE}", - nfc: "\u{B6BE}", - nfd: "\u{1104}\u{116F}\u{11AD}", - nfkc: "\u{B6BE}", - nfkd: "\u{1104}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{B6BF}", - nfc: "\u{B6BF}", - nfd: "\u{1104}\u{116F}\u{11AE}", - nfkc: "\u{B6BF}", - nfkd: "\u{1104}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{B6C0}", - nfc: "\u{B6C0}", - nfd: "\u{1104}\u{116F}\u{11AF}", - nfkc: "\u{B6C0}", - nfkd: "\u{1104}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{B6C1}", - nfc: "\u{B6C1}", - nfd: "\u{1104}\u{116F}\u{11B0}", - nfkc: "\u{B6C1}", - nfkd: "\u{1104}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{B6C2}", - nfc: "\u{B6C2}", - nfd: "\u{1104}\u{116F}\u{11B1}", - nfkc: "\u{B6C2}", - nfkd: "\u{1104}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{B6C3}", - nfc: "\u{B6C3}", - nfd: "\u{1104}\u{116F}\u{11B2}", - nfkc: "\u{B6C3}", - nfkd: "\u{1104}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{B6C4}", - nfc: "\u{B6C4}", - nfd: "\u{1104}\u{116F}\u{11B3}", - nfkc: "\u{B6C4}", - nfkd: "\u{1104}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{B6C5}", - nfc: "\u{B6C5}", - nfd: "\u{1104}\u{116F}\u{11B4}", - nfkc: "\u{B6C5}", - nfkd: "\u{1104}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{B6C6}", - nfc: "\u{B6C6}", - nfd: "\u{1104}\u{116F}\u{11B5}", - nfkc: "\u{B6C6}", - nfkd: "\u{1104}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{B6C7}", - nfc: "\u{B6C7}", - nfd: "\u{1104}\u{116F}\u{11B6}", - nfkc: "\u{B6C7}", - nfkd: "\u{1104}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{B6C8}", - nfc: "\u{B6C8}", - nfd: "\u{1104}\u{116F}\u{11B7}", - nfkc: "\u{B6C8}", - nfkd: "\u{1104}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{B6C9}", - nfc: "\u{B6C9}", - nfd: "\u{1104}\u{116F}\u{11B8}", - nfkc: "\u{B6C9}", - nfkd: "\u{1104}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{B6CA}", - nfc: "\u{B6CA}", - nfd: "\u{1104}\u{116F}\u{11B9}", - nfkc: "\u{B6CA}", - nfkd: "\u{1104}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{B6CB}", - nfc: "\u{B6CB}", - nfd: "\u{1104}\u{116F}\u{11BA}", - nfkc: "\u{B6CB}", - nfkd: "\u{1104}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{B6CC}", - nfc: "\u{B6CC}", - nfd: "\u{1104}\u{116F}\u{11BB}", - nfkc: "\u{B6CC}", - nfkd: "\u{1104}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{B6CD}", - nfc: "\u{B6CD}", - nfd: "\u{1104}\u{116F}\u{11BC}", - nfkc: "\u{B6CD}", - nfkd: "\u{1104}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{B6CE}", - nfc: "\u{B6CE}", - nfd: "\u{1104}\u{116F}\u{11BD}", - nfkc: "\u{B6CE}", - nfkd: "\u{1104}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{B6CF}", - nfc: "\u{B6CF}", - nfd: "\u{1104}\u{116F}\u{11BE}", - nfkc: "\u{B6CF}", - nfkd: "\u{1104}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{B6D0}", - nfc: "\u{B6D0}", - nfd: "\u{1104}\u{116F}\u{11BF}", - nfkc: "\u{B6D0}", - nfkd: "\u{1104}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{B6D1}", - nfc: "\u{B6D1}", - nfd: "\u{1104}\u{116F}\u{11C0}", - nfkc: "\u{B6D1}", - nfkd: "\u{1104}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{B6D2}", - nfc: "\u{B6D2}", - nfd: "\u{1104}\u{116F}\u{11C1}", - nfkc: "\u{B6D2}", - nfkd: "\u{1104}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{B6D3}", - nfc: "\u{B6D3}", - nfd: "\u{1104}\u{116F}\u{11C2}", - nfkc: "\u{B6D3}", - nfkd: "\u{1104}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{B6D4}", - nfc: "\u{B6D4}", - nfd: "\u{1104}\u{1170}", - nfkc: "\u{B6D4}", - nfkd: "\u{1104}\u{1170}", - }, - NormalizationTest { - source: "\u{B6D5}", - nfc: "\u{B6D5}", - nfd: "\u{1104}\u{1170}\u{11A8}", - nfkc: "\u{B6D5}", - nfkd: "\u{1104}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{B6D6}", - nfc: "\u{B6D6}", - nfd: "\u{1104}\u{1170}\u{11A9}", - nfkc: "\u{B6D6}", - nfkd: "\u{1104}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{B6D7}", - nfc: "\u{B6D7}", - nfd: "\u{1104}\u{1170}\u{11AA}", - nfkc: "\u{B6D7}", - nfkd: "\u{1104}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{B6D8}", - nfc: "\u{B6D8}", - nfd: "\u{1104}\u{1170}\u{11AB}", - nfkc: "\u{B6D8}", - nfkd: "\u{1104}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{B6D9}", - nfc: "\u{B6D9}", - nfd: "\u{1104}\u{1170}\u{11AC}", - nfkc: "\u{B6D9}", - nfkd: "\u{1104}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{B6DA}", - nfc: "\u{B6DA}", - nfd: "\u{1104}\u{1170}\u{11AD}", - nfkc: "\u{B6DA}", - nfkd: "\u{1104}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{B6DB}", - nfc: "\u{B6DB}", - nfd: "\u{1104}\u{1170}\u{11AE}", - nfkc: "\u{B6DB}", - nfkd: "\u{1104}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{B6DC}", - nfc: "\u{B6DC}", - nfd: "\u{1104}\u{1170}\u{11AF}", - nfkc: "\u{B6DC}", - nfkd: "\u{1104}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{B6DD}", - nfc: "\u{B6DD}", - nfd: "\u{1104}\u{1170}\u{11B0}", - nfkc: "\u{B6DD}", - nfkd: "\u{1104}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{B6DE}", - nfc: "\u{B6DE}", - nfd: "\u{1104}\u{1170}\u{11B1}", - nfkc: "\u{B6DE}", - nfkd: "\u{1104}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{B6DF}", - nfc: "\u{B6DF}", - nfd: "\u{1104}\u{1170}\u{11B2}", - nfkc: "\u{B6DF}", - nfkd: "\u{1104}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{B6E0}", - nfc: "\u{B6E0}", - nfd: "\u{1104}\u{1170}\u{11B3}", - nfkc: "\u{B6E0}", - nfkd: "\u{1104}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{B6E1}", - nfc: "\u{B6E1}", - nfd: "\u{1104}\u{1170}\u{11B4}", - nfkc: "\u{B6E1}", - nfkd: "\u{1104}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{B6E2}", - nfc: "\u{B6E2}", - nfd: "\u{1104}\u{1170}\u{11B5}", - nfkc: "\u{B6E2}", - nfkd: "\u{1104}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{B6E3}", - nfc: "\u{B6E3}", - nfd: "\u{1104}\u{1170}\u{11B6}", - nfkc: "\u{B6E3}", - nfkd: "\u{1104}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{B6E4}", - nfc: "\u{B6E4}", - nfd: "\u{1104}\u{1170}\u{11B7}", - nfkc: "\u{B6E4}", - nfkd: "\u{1104}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{B6E5}", - nfc: "\u{B6E5}", - nfd: "\u{1104}\u{1170}\u{11B8}", - nfkc: "\u{B6E5}", - nfkd: "\u{1104}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{B6E6}", - nfc: "\u{B6E6}", - nfd: "\u{1104}\u{1170}\u{11B9}", - nfkc: "\u{B6E6}", - nfkd: "\u{1104}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{B6E7}", - nfc: "\u{B6E7}", - nfd: "\u{1104}\u{1170}\u{11BA}", - nfkc: "\u{B6E7}", - nfkd: "\u{1104}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{B6E8}", - nfc: "\u{B6E8}", - nfd: "\u{1104}\u{1170}\u{11BB}", - nfkc: "\u{B6E8}", - nfkd: "\u{1104}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{B6E9}", - nfc: "\u{B6E9}", - nfd: "\u{1104}\u{1170}\u{11BC}", - nfkc: "\u{B6E9}", - nfkd: "\u{1104}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{B6EA}", - nfc: "\u{B6EA}", - nfd: "\u{1104}\u{1170}\u{11BD}", - nfkc: "\u{B6EA}", - nfkd: "\u{1104}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{B6EB}", - nfc: "\u{B6EB}", - nfd: "\u{1104}\u{1170}\u{11BE}", - nfkc: "\u{B6EB}", - nfkd: "\u{1104}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{B6EC}", - nfc: "\u{B6EC}", - nfd: "\u{1104}\u{1170}\u{11BF}", - nfkc: "\u{B6EC}", - nfkd: "\u{1104}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{B6ED}", - nfc: "\u{B6ED}", - nfd: "\u{1104}\u{1170}\u{11C0}", - nfkc: "\u{B6ED}", - nfkd: "\u{1104}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{B6EE}", - nfc: "\u{B6EE}", - nfd: "\u{1104}\u{1170}\u{11C1}", - nfkc: "\u{B6EE}", - nfkd: "\u{1104}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{B6EF}", - nfc: "\u{B6EF}", - nfd: "\u{1104}\u{1170}\u{11C2}", - nfkc: "\u{B6EF}", - nfkd: "\u{1104}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{B6F0}", - nfc: "\u{B6F0}", - nfd: "\u{1104}\u{1171}", - nfkc: "\u{B6F0}", - nfkd: "\u{1104}\u{1171}", - }, - NormalizationTest { - source: "\u{B6F1}", - nfc: "\u{B6F1}", - nfd: "\u{1104}\u{1171}\u{11A8}", - nfkc: "\u{B6F1}", - nfkd: "\u{1104}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{B6F2}", - nfc: "\u{B6F2}", - nfd: "\u{1104}\u{1171}\u{11A9}", - nfkc: "\u{B6F2}", - nfkd: "\u{1104}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{B6F3}", - nfc: "\u{B6F3}", - nfd: "\u{1104}\u{1171}\u{11AA}", - nfkc: "\u{B6F3}", - nfkd: "\u{1104}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{B6F4}", - nfc: "\u{B6F4}", - nfd: "\u{1104}\u{1171}\u{11AB}", - nfkc: "\u{B6F4}", - nfkd: "\u{1104}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{B6F5}", - nfc: "\u{B6F5}", - nfd: "\u{1104}\u{1171}\u{11AC}", - nfkc: "\u{B6F5}", - nfkd: "\u{1104}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{B6F6}", - nfc: "\u{B6F6}", - nfd: "\u{1104}\u{1171}\u{11AD}", - nfkc: "\u{B6F6}", - nfkd: "\u{1104}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{B6F7}", - nfc: "\u{B6F7}", - nfd: "\u{1104}\u{1171}\u{11AE}", - nfkc: "\u{B6F7}", - nfkd: "\u{1104}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{B6F8}", - nfc: "\u{B6F8}", - nfd: "\u{1104}\u{1171}\u{11AF}", - nfkc: "\u{B6F8}", - nfkd: "\u{1104}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{B6F9}", - nfc: "\u{B6F9}", - nfd: "\u{1104}\u{1171}\u{11B0}", - nfkc: "\u{B6F9}", - nfkd: "\u{1104}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{B6FA}", - nfc: "\u{B6FA}", - nfd: "\u{1104}\u{1171}\u{11B1}", - nfkc: "\u{B6FA}", - nfkd: "\u{1104}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{B6FB}", - nfc: "\u{B6FB}", - nfd: "\u{1104}\u{1171}\u{11B2}", - nfkc: "\u{B6FB}", - nfkd: "\u{1104}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{B6FC}", - nfc: "\u{B6FC}", - nfd: "\u{1104}\u{1171}\u{11B3}", - nfkc: "\u{B6FC}", - nfkd: "\u{1104}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{B6FD}", - nfc: "\u{B6FD}", - nfd: "\u{1104}\u{1171}\u{11B4}", - nfkc: "\u{B6FD}", - nfkd: "\u{1104}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{B6FE}", - nfc: "\u{B6FE}", - nfd: "\u{1104}\u{1171}\u{11B5}", - nfkc: "\u{B6FE}", - nfkd: "\u{1104}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{B6FF}", - nfc: "\u{B6FF}", - nfd: "\u{1104}\u{1171}\u{11B6}", - nfkc: "\u{B6FF}", - nfkd: "\u{1104}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{B700}", - nfc: "\u{B700}", - nfd: "\u{1104}\u{1171}\u{11B7}", - nfkc: "\u{B700}", - nfkd: "\u{1104}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{B701}", - nfc: "\u{B701}", - nfd: "\u{1104}\u{1171}\u{11B8}", - nfkc: "\u{B701}", - nfkd: "\u{1104}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{B702}", - nfc: "\u{B702}", - nfd: "\u{1104}\u{1171}\u{11B9}", - nfkc: "\u{B702}", - nfkd: "\u{1104}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{B703}", - nfc: "\u{B703}", - nfd: "\u{1104}\u{1171}\u{11BA}", - nfkc: "\u{B703}", - nfkd: "\u{1104}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{B704}", - nfc: "\u{B704}", - nfd: "\u{1104}\u{1171}\u{11BB}", - nfkc: "\u{B704}", - nfkd: "\u{1104}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{B705}", - nfc: "\u{B705}", - nfd: "\u{1104}\u{1171}\u{11BC}", - nfkc: "\u{B705}", - nfkd: "\u{1104}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{B706}", - nfc: "\u{B706}", - nfd: "\u{1104}\u{1171}\u{11BD}", - nfkc: "\u{B706}", - nfkd: "\u{1104}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{B707}", - nfc: "\u{B707}", - nfd: "\u{1104}\u{1171}\u{11BE}", - nfkc: "\u{B707}", - nfkd: "\u{1104}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{B708}", - nfc: "\u{B708}", - nfd: "\u{1104}\u{1171}\u{11BF}", - nfkc: "\u{B708}", - nfkd: "\u{1104}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{B709}", - nfc: "\u{B709}", - nfd: "\u{1104}\u{1171}\u{11C0}", - nfkc: "\u{B709}", - nfkd: "\u{1104}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{B70A}", - nfc: "\u{B70A}", - nfd: "\u{1104}\u{1171}\u{11C1}", - nfkc: "\u{B70A}", - nfkd: "\u{1104}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{B70B}", - nfc: "\u{B70B}", - nfd: "\u{1104}\u{1171}\u{11C2}", - nfkc: "\u{B70B}", - nfkd: "\u{1104}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{B70C}", - nfc: "\u{B70C}", - nfd: "\u{1104}\u{1172}", - nfkc: "\u{B70C}", - nfkd: "\u{1104}\u{1172}", - }, - NormalizationTest { - source: "\u{B70D}", - nfc: "\u{B70D}", - nfd: "\u{1104}\u{1172}\u{11A8}", - nfkc: "\u{B70D}", - nfkd: "\u{1104}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{B70E}", - nfc: "\u{B70E}", - nfd: "\u{1104}\u{1172}\u{11A9}", - nfkc: "\u{B70E}", - nfkd: "\u{1104}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{B70F}", - nfc: "\u{B70F}", - nfd: "\u{1104}\u{1172}\u{11AA}", - nfkc: "\u{B70F}", - nfkd: "\u{1104}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{B710}", - nfc: "\u{B710}", - nfd: "\u{1104}\u{1172}\u{11AB}", - nfkc: "\u{B710}", - nfkd: "\u{1104}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{B711}", - nfc: "\u{B711}", - nfd: "\u{1104}\u{1172}\u{11AC}", - nfkc: "\u{B711}", - nfkd: "\u{1104}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{B712}", - nfc: "\u{B712}", - nfd: "\u{1104}\u{1172}\u{11AD}", - nfkc: "\u{B712}", - nfkd: "\u{1104}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{B713}", - nfc: "\u{B713}", - nfd: "\u{1104}\u{1172}\u{11AE}", - nfkc: "\u{B713}", - nfkd: "\u{1104}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{B714}", - nfc: "\u{B714}", - nfd: "\u{1104}\u{1172}\u{11AF}", - nfkc: "\u{B714}", - nfkd: "\u{1104}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{B715}", - nfc: "\u{B715}", - nfd: "\u{1104}\u{1172}\u{11B0}", - nfkc: "\u{B715}", - nfkd: "\u{1104}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{B716}", - nfc: "\u{B716}", - nfd: "\u{1104}\u{1172}\u{11B1}", - nfkc: "\u{B716}", - nfkd: "\u{1104}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{B717}", - nfc: "\u{B717}", - nfd: "\u{1104}\u{1172}\u{11B2}", - nfkc: "\u{B717}", - nfkd: "\u{1104}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{B718}", - nfc: "\u{B718}", - nfd: "\u{1104}\u{1172}\u{11B3}", - nfkc: "\u{B718}", - nfkd: "\u{1104}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{B719}", - nfc: "\u{B719}", - nfd: "\u{1104}\u{1172}\u{11B4}", - nfkc: "\u{B719}", - nfkd: "\u{1104}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{B71A}", - nfc: "\u{B71A}", - nfd: "\u{1104}\u{1172}\u{11B5}", - nfkc: "\u{B71A}", - nfkd: "\u{1104}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{B71B}", - nfc: "\u{B71B}", - nfd: "\u{1104}\u{1172}\u{11B6}", - nfkc: "\u{B71B}", - nfkd: "\u{1104}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{B71C}", - nfc: "\u{B71C}", - nfd: "\u{1104}\u{1172}\u{11B7}", - nfkc: "\u{B71C}", - nfkd: "\u{1104}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{B71D}", - nfc: "\u{B71D}", - nfd: "\u{1104}\u{1172}\u{11B8}", - nfkc: "\u{B71D}", - nfkd: "\u{1104}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{B71E}", - nfc: "\u{B71E}", - nfd: "\u{1104}\u{1172}\u{11B9}", - nfkc: "\u{B71E}", - nfkd: "\u{1104}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{B71F}", - nfc: "\u{B71F}", - nfd: "\u{1104}\u{1172}\u{11BA}", - nfkc: "\u{B71F}", - nfkd: "\u{1104}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{B720}", - nfc: "\u{B720}", - nfd: "\u{1104}\u{1172}\u{11BB}", - nfkc: "\u{B720}", - nfkd: "\u{1104}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{B721}", - nfc: "\u{B721}", - nfd: "\u{1104}\u{1172}\u{11BC}", - nfkc: "\u{B721}", - nfkd: "\u{1104}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{B722}", - nfc: "\u{B722}", - nfd: "\u{1104}\u{1172}\u{11BD}", - nfkc: "\u{B722}", - nfkd: "\u{1104}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{B723}", - nfc: "\u{B723}", - nfd: "\u{1104}\u{1172}\u{11BE}", - nfkc: "\u{B723}", - nfkd: "\u{1104}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{B724}", - nfc: "\u{B724}", - nfd: "\u{1104}\u{1172}\u{11BF}", - nfkc: "\u{B724}", - nfkd: "\u{1104}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{B725}", - nfc: "\u{B725}", - nfd: "\u{1104}\u{1172}\u{11C0}", - nfkc: "\u{B725}", - nfkd: "\u{1104}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{B726}", - nfc: "\u{B726}", - nfd: "\u{1104}\u{1172}\u{11C1}", - nfkc: "\u{B726}", - nfkd: "\u{1104}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{B727}", - nfc: "\u{B727}", - nfd: "\u{1104}\u{1172}\u{11C2}", - nfkc: "\u{B727}", - nfkd: "\u{1104}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{B728}", - nfc: "\u{B728}", - nfd: "\u{1104}\u{1173}", - nfkc: "\u{B728}", - nfkd: "\u{1104}\u{1173}", - }, - NormalizationTest { - source: "\u{B729}", - nfc: "\u{B729}", - nfd: "\u{1104}\u{1173}\u{11A8}", - nfkc: "\u{B729}", - nfkd: "\u{1104}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{B72A}", - nfc: "\u{B72A}", - nfd: "\u{1104}\u{1173}\u{11A9}", - nfkc: "\u{B72A}", - nfkd: "\u{1104}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{B72B}", - nfc: "\u{B72B}", - nfd: "\u{1104}\u{1173}\u{11AA}", - nfkc: "\u{B72B}", - nfkd: "\u{1104}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{B72C}", - nfc: "\u{B72C}", - nfd: "\u{1104}\u{1173}\u{11AB}", - nfkc: "\u{B72C}", - nfkd: "\u{1104}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{B72D}", - nfc: "\u{B72D}", - nfd: "\u{1104}\u{1173}\u{11AC}", - nfkc: "\u{B72D}", - nfkd: "\u{1104}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{B72E}", - nfc: "\u{B72E}", - nfd: "\u{1104}\u{1173}\u{11AD}", - nfkc: "\u{B72E}", - nfkd: "\u{1104}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{B72F}", - nfc: "\u{B72F}", - nfd: "\u{1104}\u{1173}\u{11AE}", - nfkc: "\u{B72F}", - nfkd: "\u{1104}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{B730}", - nfc: "\u{B730}", - nfd: "\u{1104}\u{1173}\u{11AF}", - nfkc: "\u{B730}", - nfkd: "\u{1104}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{B731}", - nfc: "\u{B731}", - nfd: "\u{1104}\u{1173}\u{11B0}", - nfkc: "\u{B731}", - nfkd: "\u{1104}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{B732}", - nfc: "\u{B732}", - nfd: "\u{1104}\u{1173}\u{11B1}", - nfkc: "\u{B732}", - nfkd: "\u{1104}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{B733}", - nfc: "\u{B733}", - nfd: "\u{1104}\u{1173}\u{11B2}", - nfkc: "\u{B733}", - nfkd: "\u{1104}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{B734}", - nfc: "\u{B734}", - nfd: "\u{1104}\u{1173}\u{11B3}", - nfkc: "\u{B734}", - nfkd: "\u{1104}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{B735}", - nfc: "\u{B735}", - nfd: "\u{1104}\u{1173}\u{11B4}", - nfkc: "\u{B735}", - nfkd: "\u{1104}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{B736}", - nfc: "\u{B736}", - nfd: "\u{1104}\u{1173}\u{11B5}", - nfkc: "\u{B736}", - nfkd: "\u{1104}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{B737}", - nfc: "\u{B737}", - nfd: "\u{1104}\u{1173}\u{11B6}", - nfkc: "\u{B737}", - nfkd: "\u{1104}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{B738}", - nfc: "\u{B738}", - nfd: "\u{1104}\u{1173}\u{11B7}", - nfkc: "\u{B738}", - nfkd: "\u{1104}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{B739}", - nfc: "\u{B739}", - nfd: "\u{1104}\u{1173}\u{11B8}", - nfkc: "\u{B739}", - nfkd: "\u{1104}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{B73A}", - nfc: "\u{B73A}", - nfd: "\u{1104}\u{1173}\u{11B9}", - nfkc: "\u{B73A}", - nfkd: "\u{1104}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{B73B}", - nfc: "\u{B73B}", - nfd: "\u{1104}\u{1173}\u{11BA}", - nfkc: "\u{B73B}", - nfkd: "\u{1104}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{B73C}", - nfc: "\u{B73C}", - nfd: "\u{1104}\u{1173}\u{11BB}", - nfkc: "\u{B73C}", - nfkd: "\u{1104}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{B73D}", - nfc: "\u{B73D}", - nfd: "\u{1104}\u{1173}\u{11BC}", - nfkc: "\u{B73D}", - nfkd: "\u{1104}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{B73E}", - nfc: "\u{B73E}", - nfd: "\u{1104}\u{1173}\u{11BD}", - nfkc: "\u{B73E}", - nfkd: "\u{1104}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{B73F}", - nfc: "\u{B73F}", - nfd: "\u{1104}\u{1173}\u{11BE}", - nfkc: "\u{B73F}", - nfkd: "\u{1104}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{B740}", - nfc: "\u{B740}", - nfd: "\u{1104}\u{1173}\u{11BF}", - nfkc: "\u{B740}", - nfkd: "\u{1104}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{B741}", - nfc: "\u{B741}", - nfd: "\u{1104}\u{1173}\u{11C0}", - nfkc: "\u{B741}", - nfkd: "\u{1104}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{B742}", - nfc: "\u{B742}", - nfd: "\u{1104}\u{1173}\u{11C1}", - nfkc: "\u{B742}", - nfkd: "\u{1104}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{B743}", - nfc: "\u{B743}", - nfd: "\u{1104}\u{1173}\u{11C2}", - nfkc: "\u{B743}", - nfkd: "\u{1104}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{B744}", - nfc: "\u{B744}", - nfd: "\u{1104}\u{1174}", - nfkc: "\u{B744}", - nfkd: "\u{1104}\u{1174}", - }, - NormalizationTest { - source: "\u{B745}", - nfc: "\u{B745}", - nfd: "\u{1104}\u{1174}\u{11A8}", - nfkc: "\u{B745}", - nfkd: "\u{1104}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{B746}", - nfc: "\u{B746}", - nfd: "\u{1104}\u{1174}\u{11A9}", - nfkc: "\u{B746}", - nfkd: "\u{1104}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{B747}", - nfc: "\u{B747}", - nfd: "\u{1104}\u{1174}\u{11AA}", - nfkc: "\u{B747}", - nfkd: "\u{1104}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{B748}", - nfc: "\u{B748}", - nfd: "\u{1104}\u{1174}\u{11AB}", - nfkc: "\u{B748}", - nfkd: "\u{1104}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{B749}", - nfc: "\u{B749}", - nfd: "\u{1104}\u{1174}\u{11AC}", - nfkc: "\u{B749}", - nfkd: "\u{1104}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{B74A}", - nfc: "\u{B74A}", - nfd: "\u{1104}\u{1174}\u{11AD}", - nfkc: "\u{B74A}", - nfkd: "\u{1104}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{B74B}", - nfc: "\u{B74B}", - nfd: "\u{1104}\u{1174}\u{11AE}", - nfkc: "\u{B74B}", - nfkd: "\u{1104}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{B74C}", - nfc: "\u{B74C}", - nfd: "\u{1104}\u{1174}\u{11AF}", - nfkc: "\u{B74C}", - nfkd: "\u{1104}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{B74D}", - nfc: "\u{B74D}", - nfd: "\u{1104}\u{1174}\u{11B0}", - nfkc: "\u{B74D}", - nfkd: "\u{1104}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{B74E}", - nfc: "\u{B74E}", - nfd: "\u{1104}\u{1174}\u{11B1}", - nfkc: "\u{B74E}", - nfkd: "\u{1104}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{B74F}", - nfc: "\u{B74F}", - nfd: "\u{1104}\u{1174}\u{11B2}", - nfkc: "\u{B74F}", - nfkd: "\u{1104}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{B750}", - nfc: "\u{B750}", - nfd: "\u{1104}\u{1174}\u{11B3}", - nfkc: "\u{B750}", - nfkd: "\u{1104}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{B751}", - nfc: "\u{B751}", - nfd: "\u{1104}\u{1174}\u{11B4}", - nfkc: "\u{B751}", - nfkd: "\u{1104}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{B752}", - nfc: "\u{B752}", - nfd: "\u{1104}\u{1174}\u{11B5}", - nfkc: "\u{B752}", - nfkd: "\u{1104}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{B753}", - nfc: "\u{B753}", - nfd: "\u{1104}\u{1174}\u{11B6}", - nfkc: "\u{B753}", - nfkd: "\u{1104}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{B754}", - nfc: "\u{B754}", - nfd: "\u{1104}\u{1174}\u{11B7}", - nfkc: "\u{B754}", - nfkd: "\u{1104}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{B755}", - nfc: "\u{B755}", - nfd: "\u{1104}\u{1174}\u{11B8}", - nfkc: "\u{B755}", - nfkd: "\u{1104}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{B756}", - nfc: "\u{B756}", - nfd: "\u{1104}\u{1174}\u{11B9}", - nfkc: "\u{B756}", - nfkd: "\u{1104}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{B757}", - nfc: "\u{B757}", - nfd: "\u{1104}\u{1174}\u{11BA}", - nfkc: "\u{B757}", - nfkd: "\u{1104}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{B758}", - nfc: "\u{B758}", - nfd: "\u{1104}\u{1174}\u{11BB}", - nfkc: "\u{B758}", - nfkd: "\u{1104}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{B759}", - nfc: "\u{B759}", - nfd: "\u{1104}\u{1174}\u{11BC}", - nfkc: "\u{B759}", - nfkd: "\u{1104}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{B75A}", - nfc: "\u{B75A}", - nfd: "\u{1104}\u{1174}\u{11BD}", - nfkc: "\u{B75A}", - nfkd: "\u{1104}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{B75B}", - nfc: "\u{B75B}", - nfd: "\u{1104}\u{1174}\u{11BE}", - nfkc: "\u{B75B}", - nfkd: "\u{1104}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{B75C}", - nfc: "\u{B75C}", - nfd: "\u{1104}\u{1174}\u{11BF}", - nfkc: "\u{B75C}", - nfkd: "\u{1104}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{B75D}", - nfc: "\u{B75D}", - nfd: "\u{1104}\u{1174}\u{11C0}", - nfkc: "\u{B75D}", - nfkd: "\u{1104}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{B75E}", - nfc: "\u{B75E}", - nfd: "\u{1104}\u{1174}\u{11C1}", - nfkc: "\u{B75E}", - nfkd: "\u{1104}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{B75F}", - nfc: "\u{B75F}", - nfd: "\u{1104}\u{1174}\u{11C2}", - nfkc: "\u{B75F}", - nfkd: "\u{1104}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{B760}", - nfc: "\u{B760}", - nfd: "\u{1104}\u{1175}", - nfkc: "\u{B760}", - nfkd: "\u{1104}\u{1175}", - }, - NormalizationTest { - source: "\u{B761}", - nfc: "\u{B761}", - nfd: "\u{1104}\u{1175}\u{11A8}", - nfkc: "\u{B761}", - nfkd: "\u{1104}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{B762}", - nfc: "\u{B762}", - nfd: "\u{1104}\u{1175}\u{11A9}", - nfkc: "\u{B762}", - nfkd: "\u{1104}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{B763}", - nfc: "\u{B763}", - nfd: "\u{1104}\u{1175}\u{11AA}", - nfkc: "\u{B763}", - nfkd: "\u{1104}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{B764}", - nfc: "\u{B764}", - nfd: "\u{1104}\u{1175}\u{11AB}", - nfkc: "\u{B764}", - nfkd: "\u{1104}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{B765}", - nfc: "\u{B765}", - nfd: "\u{1104}\u{1175}\u{11AC}", - nfkc: "\u{B765}", - nfkd: "\u{1104}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{B766}", - nfc: "\u{B766}", - nfd: "\u{1104}\u{1175}\u{11AD}", - nfkc: "\u{B766}", - nfkd: "\u{1104}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{B767}", - nfc: "\u{B767}", - nfd: "\u{1104}\u{1175}\u{11AE}", - nfkc: "\u{B767}", - nfkd: "\u{1104}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{B768}", - nfc: "\u{B768}", - nfd: "\u{1104}\u{1175}\u{11AF}", - nfkc: "\u{B768}", - nfkd: "\u{1104}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{B769}", - nfc: "\u{B769}", - nfd: "\u{1104}\u{1175}\u{11B0}", - nfkc: "\u{B769}", - nfkd: "\u{1104}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{B76A}", - nfc: "\u{B76A}", - nfd: "\u{1104}\u{1175}\u{11B1}", - nfkc: "\u{B76A}", - nfkd: "\u{1104}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{B76B}", - nfc: "\u{B76B}", - nfd: "\u{1104}\u{1175}\u{11B2}", - nfkc: "\u{B76B}", - nfkd: "\u{1104}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{B76C}", - nfc: "\u{B76C}", - nfd: "\u{1104}\u{1175}\u{11B3}", - nfkc: "\u{B76C}", - nfkd: "\u{1104}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{B76D}", - nfc: "\u{B76D}", - nfd: "\u{1104}\u{1175}\u{11B4}", - nfkc: "\u{B76D}", - nfkd: "\u{1104}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{B76E}", - nfc: "\u{B76E}", - nfd: "\u{1104}\u{1175}\u{11B5}", - nfkc: "\u{B76E}", - nfkd: "\u{1104}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{B76F}", - nfc: "\u{B76F}", - nfd: "\u{1104}\u{1175}\u{11B6}", - nfkc: "\u{B76F}", - nfkd: "\u{1104}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{B770}", - nfc: "\u{B770}", - nfd: "\u{1104}\u{1175}\u{11B7}", - nfkc: "\u{B770}", - nfkd: "\u{1104}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{B771}", - nfc: "\u{B771}", - nfd: "\u{1104}\u{1175}\u{11B8}", - nfkc: "\u{B771}", - nfkd: "\u{1104}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{B772}", - nfc: "\u{B772}", - nfd: "\u{1104}\u{1175}\u{11B9}", - nfkc: "\u{B772}", - nfkd: "\u{1104}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{B773}", - nfc: "\u{B773}", - nfd: "\u{1104}\u{1175}\u{11BA}", - nfkc: "\u{B773}", - nfkd: "\u{1104}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{B774}", - nfc: "\u{B774}", - nfd: "\u{1104}\u{1175}\u{11BB}", - nfkc: "\u{B774}", - nfkd: "\u{1104}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{B775}", - nfc: "\u{B775}", - nfd: "\u{1104}\u{1175}\u{11BC}", - nfkc: "\u{B775}", - nfkd: "\u{1104}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{B776}", - nfc: "\u{B776}", - nfd: "\u{1104}\u{1175}\u{11BD}", - nfkc: "\u{B776}", - nfkd: "\u{1104}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{B777}", - nfc: "\u{B777}", - nfd: "\u{1104}\u{1175}\u{11BE}", - nfkc: "\u{B777}", - nfkd: "\u{1104}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{B778}", - nfc: "\u{B778}", - nfd: "\u{1104}\u{1175}\u{11BF}", - nfkc: "\u{B778}", - nfkd: "\u{1104}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{B779}", - nfc: "\u{B779}", - nfd: "\u{1104}\u{1175}\u{11C0}", - nfkc: "\u{B779}", - nfkd: "\u{1104}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{B77A}", - nfc: "\u{B77A}", - nfd: "\u{1104}\u{1175}\u{11C1}", - nfkc: "\u{B77A}", - nfkd: "\u{1104}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{B77B}", - nfc: "\u{B77B}", - nfd: "\u{1104}\u{1175}\u{11C2}", - nfkc: "\u{B77B}", - nfkd: "\u{1104}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{B77C}", - nfc: "\u{B77C}", - nfd: "\u{1105}\u{1161}", - nfkc: "\u{B77C}", - nfkd: "\u{1105}\u{1161}", - }, - NormalizationTest { - source: "\u{B77D}", - nfc: "\u{B77D}", - nfd: "\u{1105}\u{1161}\u{11A8}", - nfkc: "\u{B77D}", - nfkd: "\u{1105}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{B77E}", - nfc: "\u{B77E}", - nfd: "\u{1105}\u{1161}\u{11A9}", - nfkc: "\u{B77E}", - nfkd: "\u{1105}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{B77F}", - nfc: "\u{B77F}", - nfd: "\u{1105}\u{1161}\u{11AA}", - nfkc: "\u{B77F}", - nfkd: "\u{1105}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{B780}", - nfc: "\u{B780}", - nfd: "\u{1105}\u{1161}\u{11AB}", - nfkc: "\u{B780}", - nfkd: "\u{1105}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{B781}", - nfc: "\u{B781}", - nfd: "\u{1105}\u{1161}\u{11AC}", - nfkc: "\u{B781}", - nfkd: "\u{1105}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{B782}", - nfc: "\u{B782}", - nfd: "\u{1105}\u{1161}\u{11AD}", - nfkc: "\u{B782}", - nfkd: "\u{1105}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{B783}", - nfc: "\u{B783}", - nfd: "\u{1105}\u{1161}\u{11AE}", - nfkc: "\u{B783}", - nfkd: "\u{1105}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{B784}", - nfc: "\u{B784}", - nfd: "\u{1105}\u{1161}\u{11AF}", - nfkc: "\u{B784}", - nfkd: "\u{1105}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{B785}", - nfc: "\u{B785}", - nfd: "\u{1105}\u{1161}\u{11B0}", - nfkc: "\u{B785}", - nfkd: "\u{1105}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{B786}", - nfc: "\u{B786}", - nfd: "\u{1105}\u{1161}\u{11B1}", - nfkc: "\u{B786}", - nfkd: "\u{1105}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{B787}", - nfc: "\u{B787}", - nfd: "\u{1105}\u{1161}\u{11B2}", - nfkc: "\u{B787}", - nfkd: "\u{1105}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{B788}", - nfc: "\u{B788}", - nfd: "\u{1105}\u{1161}\u{11B3}", - nfkc: "\u{B788}", - nfkd: "\u{1105}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{B789}", - nfc: "\u{B789}", - nfd: "\u{1105}\u{1161}\u{11B4}", - nfkc: "\u{B789}", - nfkd: "\u{1105}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{B78A}", - nfc: "\u{B78A}", - nfd: "\u{1105}\u{1161}\u{11B5}", - nfkc: "\u{B78A}", - nfkd: "\u{1105}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{B78B}", - nfc: "\u{B78B}", - nfd: "\u{1105}\u{1161}\u{11B6}", - nfkc: "\u{B78B}", - nfkd: "\u{1105}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{B78C}", - nfc: "\u{B78C}", - nfd: "\u{1105}\u{1161}\u{11B7}", - nfkc: "\u{B78C}", - nfkd: "\u{1105}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{B78D}", - nfc: "\u{B78D}", - nfd: "\u{1105}\u{1161}\u{11B8}", - nfkc: "\u{B78D}", - nfkd: "\u{1105}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{B78E}", - nfc: "\u{B78E}", - nfd: "\u{1105}\u{1161}\u{11B9}", - nfkc: "\u{B78E}", - nfkd: "\u{1105}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{B78F}", - nfc: "\u{B78F}", - nfd: "\u{1105}\u{1161}\u{11BA}", - nfkc: "\u{B78F}", - nfkd: "\u{1105}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{B790}", - nfc: "\u{B790}", - nfd: "\u{1105}\u{1161}\u{11BB}", - nfkc: "\u{B790}", - nfkd: "\u{1105}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{B791}", - nfc: "\u{B791}", - nfd: "\u{1105}\u{1161}\u{11BC}", - nfkc: "\u{B791}", - nfkd: "\u{1105}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{B792}", - nfc: "\u{B792}", - nfd: "\u{1105}\u{1161}\u{11BD}", - nfkc: "\u{B792}", - nfkd: "\u{1105}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{B793}", - nfc: "\u{B793}", - nfd: "\u{1105}\u{1161}\u{11BE}", - nfkc: "\u{B793}", - nfkd: "\u{1105}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{B794}", - nfc: "\u{B794}", - nfd: "\u{1105}\u{1161}\u{11BF}", - nfkc: "\u{B794}", - nfkd: "\u{1105}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{B795}", - nfc: "\u{B795}", - nfd: "\u{1105}\u{1161}\u{11C0}", - nfkc: "\u{B795}", - nfkd: "\u{1105}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{B796}", - nfc: "\u{B796}", - nfd: "\u{1105}\u{1161}\u{11C1}", - nfkc: "\u{B796}", - nfkd: "\u{1105}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{B797}", - nfc: "\u{B797}", - nfd: "\u{1105}\u{1161}\u{11C2}", - nfkc: "\u{B797}", - nfkd: "\u{1105}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{B798}", - nfc: "\u{B798}", - nfd: "\u{1105}\u{1162}", - nfkc: "\u{B798}", - nfkd: "\u{1105}\u{1162}", - }, - NormalizationTest { - source: "\u{B799}", - nfc: "\u{B799}", - nfd: "\u{1105}\u{1162}\u{11A8}", - nfkc: "\u{B799}", - nfkd: "\u{1105}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{B79A}", - nfc: "\u{B79A}", - nfd: "\u{1105}\u{1162}\u{11A9}", - nfkc: "\u{B79A}", - nfkd: "\u{1105}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{B79B}", - nfc: "\u{B79B}", - nfd: "\u{1105}\u{1162}\u{11AA}", - nfkc: "\u{B79B}", - nfkd: "\u{1105}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{B79C}", - nfc: "\u{B79C}", - nfd: "\u{1105}\u{1162}\u{11AB}", - nfkc: "\u{B79C}", - nfkd: "\u{1105}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{B79D}", - nfc: "\u{B79D}", - nfd: "\u{1105}\u{1162}\u{11AC}", - nfkc: "\u{B79D}", - nfkd: "\u{1105}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{B79E}", - nfc: "\u{B79E}", - nfd: "\u{1105}\u{1162}\u{11AD}", - nfkc: "\u{B79E}", - nfkd: "\u{1105}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{B79F}", - nfc: "\u{B79F}", - nfd: "\u{1105}\u{1162}\u{11AE}", - nfkc: "\u{B79F}", - nfkd: "\u{1105}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{B7A0}", - nfc: "\u{B7A0}", - nfd: "\u{1105}\u{1162}\u{11AF}", - nfkc: "\u{B7A0}", - nfkd: "\u{1105}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{B7A1}", - nfc: "\u{B7A1}", - nfd: "\u{1105}\u{1162}\u{11B0}", - nfkc: "\u{B7A1}", - nfkd: "\u{1105}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{B7A2}", - nfc: "\u{B7A2}", - nfd: "\u{1105}\u{1162}\u{11B1}", - nfkc: "\u{B7A2}", - nfkd: "\u{1105}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{B7A3}", - nfc: "\u{B7A3}", - nfd: "\u{1105}\u{1162}\u{11B2}", - nfkc: "\u{B7A3}", - nfkd: "\u{1105}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{B7A4}", - nfc: "\u{B7A4}", - nfd: "\u{1105}\u{1162}\u{11B3}", - nfkc: "\u{B7A4}", - nfkd: "\u{1105}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{B7A5}", - nfc: "\u{B7A5}", - nfd: "\u{1105}\u{1162}\u{11B4}", - nfkc: "\u{B7A5}", - nfkd: "\u{1105}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{B7A6}", - nfc: "\u{B7A6}", - nfd: "\u{1105}\u{1162}\u{11B5}", - nfkc: "\u{B7A6}", - nfkd: "\u{1105}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{B7A7}", - nfc: "\u{B7A7}", - nfd: "\u{1105}\u{1162}\u{11B6}", - nfkc: "\u{B7A7}", - nfkd: "\u{1105}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{B7A8}", - nfc: "\u{B7A8}", - nfd: "\u{1105}\u{1162}\u{11B7}", - nfkc: "\u{B7A8}", - nfkd: "\u{1105}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{B7A9}", - nfc: "\u{B7A9}", - nfd: "\u{1105}\u{1162}\u{11B8}", - nfkc: "\u{B7A9}", - nfkd: "\u{1105}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{B7AA}", - nfc: "\u{B7AA}", - nfd: "\u{1105}\u{1162}\u{11B9}", - nfkc: "\u{B7AA}", - nfkd: "\u{1105}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{B7AB}", - nfc: "\u{B7AB}", - nfd: "\u{1105}\u{1162}\u{11BA}", - nfkc: "\u{B7AB}", - nfkd: "\u{1105}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{B7AC}", - nfc: "\u{B7AC}", - nfd: "\u{1105}\u{1162}\u{11BB}", - nfkc: "\u{B7AC}", - nfkd: "\u{1105}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{B7AD}", - nfc: "\u{B7AD}", - nfd: "\u{1105}\u{1162}\u{11BC}", - nfkc: "\u{B7AD}", - nfkd: "\u{1105}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{B7AE}", - nfc: "\u{B7AE}", - nfd: "\u{1105}\u{1162}\u{11BD}", - nfkc: "\u{B7AE}", - nfkd: "\u{1105}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{B7AF}", - nfc: "\u{B7AF}", - nfd: "\u{1105}\u{1162}\u{11BE}", - nfkc: "\u{B7AF}", - nfkd: "\u{1105}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{B7B0}", - nfc: "\u{B7B0}", - nfd: "\u{1105}\u{1162}\u{11BF}", - nfkc: "\u{B7B0}", - nfkd: "\u{1105}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{B7B1}", - nfc: "\u{B7B1}", - nfd: "\u{1105}\u{1162}\u{11C0}", - nfkc: "\u{B7B1}", - nfkd: "\u{1105}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{B7B2}", - nfc: "\u{B7B2}", - nfd: "\u{1105}\u{1162}\u{11C1}", - nfkc: "\u{B7B2}", - nfkd: "\u{1105}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{B7B3}", - nfc: "\u{B7B3}", - nfd: "\u{1105}\u{1162}\u{11C2}", - nfkc: "\u{B7B3}", - nfkd: "\u{1105}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{B7B4}", - nfc: "\u{B7B4}", - nfd: "\u{1105}\u{1163}", - nfkc: "\u{B7B4}", - nfkd: "\u{1105}\u{1163}", - }, - NormalizationTest { - source: "\u{B7B5}", - nfc: "\u{B7B5}", - nfd: "\u{1105}\u{1163}\u{11A8}", - nfkc: "\u{B7B5}", - nfkd: "\u{1105}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{B7B6}", - nfc: "\u{B7B6}", - nfd: "\u{1105}\u{1163}\u{11A9}", - nfkc: "\u{B7B6}", - nfkd: "\u{1105}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{B7B7}", - nfc: "\u{B7B7}", - nfd: "\u{1105}\u{1163}\u{11AA}", - nfkc: "\u{B7B7}", - nfkd: "\u{1105}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{B7B8}", - nfc: "\u{B7B8}", - nfd: "\u{1105}\u{1163}\u{11AB}", - nfkc: "\u{B7B8}", - nfkd: "\u{1105}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{B7B9}", - nfc: "\u{B7B9}", - nfd: "\u{1105}\u{1163}\u{11AC}", - nfkc: "\u{B7B9}", - nfkd: "\u{1105}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{B7BA}", - nfc: "\u{B7BA}", - nfd: "\u{1105}\u{1163}\u{11AD}", - nfkc: "\u{B7BA}", - nfkd: "\u{1105}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{B7BB}", - nfc: "\u{B7BB}", - nfd: "\u{1105}\u{1163}\u{11AE}", - nfkc: "\u{B7BB}", - nfkd: "\u{1105}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{B7BC}", - nfc: "\u{B7BC}", - nfd: "\u{1105}\u{1163}\u{11AF}", - nfkc: "\u{B7BC}", - nfkd: "\u{1105}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{B7BD}", - nfc: "\u{B7BD}", - nfd: "\u{1105}\u{1163}\u{11B0}", - nfkc: "\u{B7BD}", - nfkd: "\u{1105}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{B7BE}", - nfc: "\u{B7BE}", - nfd: "\u{1105}\u{1163}\u{11B1}", - nfkc: "\u{B7BE}", - nfkd: "\u{1105}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{B7BF}", - nfc: "\u{B7BF}", - nfd: "\u{1105}\u{1163}\u{11B2}", - nfkc: "\u{B7BF}", - nfkd: "\u{1105}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{B7C0}", - nfc: "\u{B7C0}", - nfd: "\u{1105}\u{1163}\u{11B3}", - nfkc: "\u{B7C0}", - nfkd: "\u{1105}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{B7C1}", - nfc: "\u{B7C1}", - nfd: "\u{1105}\u{1163}\u{11B4}", - nfkc: "\u{B7C1}", - nfkd: "\u{1105}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{B7C2}", - nfc: "\u{B7C2}", - nfd: "\u{1105}\u{1163}\u{11B5}", - nfkc: "\u{B7C2}", - nfkd: "\u{1105}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{B7C3}", - nfc: "\u{B7C3}", - nfd: "\u{1105}\u{1163}\u{11B6}", - nfkc: "\u{B7C3}", - nfkd: "\u{1105}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{B7C4}", - nfc: "\u{B7C4}", - nfd: "\u{1105}\u{1163}\u{11B7}", - nfkc: "\u{B7C4}", - nfkd: "\u{1105}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{B7C5}", - nfc: "\u{B7C5}", - nfd: "\u{1105}\u{1163}\u{11B8}", - nfkc: "\u{B7C5}", - nfkd: "\u{1105}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{B7C6}", - nfc: "\u{B7C6}", - nfd: "\u{1105}\u{1163}\u{11B9}", - nfkc: "\u{B7C6}", - nfkd: "\u{1105}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{B7C7}", - nfc: "\u{B7C7}", - nfd: "\u{1105}\u{1163}\u{11BA}", - nfkc: "\u{B7C7}", - nfkd: "\u{1105}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{B7C8}", - nfc: "\u{B7C8}", - nfd: "\u{1105}\u{1163}\u{11BB}", - nfkc: "\u{B7C8}", - nfkd: "\u{1105}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{B7C9}", - nfc: "\u{B7C9}", - nfd: "\u{1105}\u{1163}\u{11BC}", - nfkc: "\u{B7C9}", - nfkd: "\u{1105}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{B7CA}", - nfc: "\u{B7CA}", - nfd: "\u{1105}\u{1163}\u{11BD}", - nfkc: "\u{B7CA}", - nfkd: "\u{1105}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{B7CB}", - nfc: "\u{B7CB}", - nfd: "\u{1105}\u{1163}\u{11BE}", - nfkc: "\u{B7CB}", - nfkd: "\u{1105}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{B7CC}", - nfc: "\u{B7CC}", - nfd: "\u{1105}\u{1163}\u{11BF}", - nfkc: "\u{B7CC}", - nfkd: "\u{1105}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{B7CD}", - nfc: "\u{B7CD}", - nfd: "\u{1105}\u{1163}\u{11C0}", - nfkc: "\u{B7CD}", - nfkd: "\u{1105}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{B7CE}", - nfc: "\u{B7CE}", - nfd: "\u{1105}\u{1163}\u{11C1}", - nfkc: "\u{B7CE}", - nfkd: "\u{1105}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{B7CF}", - nfc: "\u{B7CF}", - nfd: "\u{1105}\u{1163}\u{11C2}", - nfkc: "\u{B7CF}", - nfkd: "\u{1105}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{B7D0}", - nfc: "\u{B7D0}", - nfd: "\u{1105}\u{1164}", - nfkc: "\u{B7D0}", - nfkd: "\u{1105}\u{1164}", - }, - NormalizationTest { - source: "\u{B7D1}", - nfc: "\u{B7D1}", - nfd: "\u{1105}\u{1164}\u{11A8}", - nfkc: "\u{B7D1}", - nfkd: "\u{1105}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{B7D2}", - nfc: "\u{B7D2}", - nfd: "\u{1105}\u{1164}\u{11A9}", - nfkc: "\u{B7D2}", - nfkd: "\u{1105}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{B7D3}", - nfc: "\u{B7D3}", - nfd: "\u{1105}\u{1164}\u{11AA}", - nfkc: "\u{B7D3}", - nfkd: "\u{1105}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{B7D4}", - nfc: "\u{B7D4}", - nfd: "\u{1105}\u{1164}\u{11AB}", - nfkc: "\u{B7D4}", - nfkd: "\u{1105}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{B7D5}", - nfc: "\u{B7D5}", - nfd: "\u{1105}\u{1164}\u{11AC}", - nfkc: "\u{B7D5}", - nfkd: "\u{1105}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{B7D6}", - nfc: "\u{B7D6}", - nfd: "\u{1105}\u{1164}\u{11AD}", - nfkc: "\u{B7D6}", - nfkd: "\u{1105}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{B7D7}", - nfc: "\u{B7D7}", - nfd: "\u{1105}\u{1164}\u{11AE}", - nfkc: "\u{B7D7}", - nfkd: "\u{1105}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{B7D8}", - nfc: "\u{B7D8}", - nfd: "\u{1105}\u{1164}\u{11AF}", - nfkc: "\u{B7D8}", - nfkd: "\u{1105}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{B7D9}", - nfc: "\u{B7D9}", - nfd: "\u{1105}\u{1164}\u{11B0}", - nfkc: "\u{B7D9}", - nfkd: "\u{1105}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{B7DA}", - nfc: "\u{B7DA}", - nfd: "\u{1105}\u{1164}\u{11B1}", - nfkc: "\u{B7DA}", - nfkd: "\u{1105}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{B7DB}", - nfc: "\u{B7DB}", - nfd: "\u{1105}\u{1164}\u{11B2}", - nfkc: "\u{B7DB}", - nfkd: "\u{1105}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{B7DC}", - nfc: "\u{B7DC}", - nfd: "\u{1105}\u{1164}\u{11B3}", - nfkc: "\u{B7DC}", - nfkd: "\u{1105}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{B7DD}", - nfc: "\u{B7DD}", - nfd: "\u{1105}\u{1164}\u{11B4}", - nfkc: "\u{B7DD}", - nfkd: "\u{1105}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{B7DE}", - nfc: "\u{B7DE}", - nfd: "\u{1105}\u{1164}\u{11B5}", - nfkc: "\u{B7DE}", - nfkd: "\u{1105}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{B7DF}", - nfc: "\u{B7DF}", - nfd: "\u{1105}\u{1164}\u{11B6}", - nfkc: "\u{B7DF}", - nfkd: "\u{1105}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{B7E0}", - nfc: "\u{B7E0}", - nfd: "\u{1105}\u{1164}\u{11B7}", - nfkc: "\u{B7E0}", - nfkd: "\u{1105}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{B7E1}", - nfc: "\u{B7E1}", - nfd: "\u{1105}\u{1164}\u{11B8}", - nfkc: "\u{B7E1}", - nfkd: "\u{1105}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{B7E2}", - nfc: "\u{B7E2}", - nfd: "\u{1105}\u{1164}\u{11B9}", - nfkc: "\u{B7E2}", - nfkd: "\u{1105}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{B7E3}", - nfc: "\u{B7E3}", - nfd: "\u{1105}\u{1164}\u{11BA}", - nfkc: "\u{B7E3}", - nfkd: "\u{1105}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{B7E4}", - nfc: "\u{B7E4}", - nfd: "\u{1105}\u{1164}\u{11BB}", - nfkc: "\u{B7E4}", - nfkd: "\u{1105}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{B7E5}", - nfc: "\u{B7E5}", - nfd: "\u{1105}\u{1164}\u{11BC}", - nfkc: "\u{B7E5}", - nfkd: "\u{1105}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{B7E6}", - nfc: "\u{B7E6}", - nfd: "\u{1105}\u{1164}\u{11BD}", - nfkc: "\u{B7E6}", - nfkd: "\u{1105}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{B7E7}", - nfc: "\u{B7E7}", - nfd: "\u{1105}\u{1164}\u{11BE}", - nfkc: "\u{B7E7}", - nfkd: "\u{1105}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{B7E8}", - nfc: "\u{B7E8}", - nfd: "\u{1105}\u{1164}\u{11BF}", - nfkc: "\u{B7E8}", - nfkd: "\u{1105}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{B7E9}", - nfc: "\u{B7E9}", - nfd: "\u{1105}\u{1164}\u{11C0}", - nfkc: "\u{B7E9}", - nfkd: "\u{1105}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{B7EA}", - nfc: "\u{B7EA}", - nfd: "\u{1105}\u{1164}\u{11C1}", - nfkc: "\u{B7EA}", - nfkd: "\u{1105}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{B7EB}", - nfc: "\u{B7EB}", - nfd: "\u{1105}\u{1164}\u{11C2}", - nfkc: "\u{B7EB}", - nfkd: "\u{1105}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{B7EC}", - nfc: "\u{B7EC}", - nfd: "\u{1105}\u{1165}", - nfkc: "\u{B7EC}", - nfkd: "\u{1105}\u{1165}", - }, - NormalizationTest { - source: "\u{B7ED}", - nfc: "\u{B7ED}", - nfd: "\u{1105}\u{1165}\u{11A8}", - nfkc: "\u{B7ED}", - nfkd: "\u{1105}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{B7EE}", - nfc: "\u{B7EE}", - nfd: "\u{1105}\u{1165}\u{11A9}", - nfkc: "\u{B7EE}", - nfkd: "\u{1105}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{B7EF}", - nfc: "\u{B7EF}", - nfd: "\u{1105}\u{1165}\u{11AA}", - nfkc: "\u{B7EF}", - nfkd: "\u{1105}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{B7F0}", - nfc: "\u{B7F0}", - nfd: "\u{1105}\u{1165}\u{11AB}", - nfkc: "\u{B7F0}", - nfkd: "\u{1105}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{B7F1}", - nfc: "\u{B7F1}", - nfd: "\u{1105}\u{1165}\u{11AC}", - nfkc: "\u{B7F1}", - nfkd: "\u{1105}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{B7F2}", - nfc: "\u{B7F2}", - nfd: "\u{1105}\u{1165}\u{11AD}", - nfkc: "\u{B7F2}", - nfkd: "\u{1105}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{B7F3}", - nfc: "\u{B7F3}", - nfd: "\u{1105}\u{1165}\u{11AE}", - nfkc: "\u{B7F3}", - nfkd: "\u{1105}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{B7F4}", - nfc: "\u{B7F4}", - nfd: "\u{1105}\u{1165}\u{11AF}", - nfkc: "\u{B7F4}", - nfkd: "\u{1105}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{B7F5}", - nfc: "\u{B7F5}", - nfd: "\u{1105}\u{1165}\u{11B0}", - nfkc: "\u{B7F5}", - nfkd: "\u{1105}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{B7F6}", - nfc: "\u{B7F6}", - nfd: "\u{1105}\u{1165}\u{11B1}", - nfkc: "\u{B7F6}", - nfkd: "\u{1105}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{B7F7}", - nfc: "\u{B7F7}", - nfd: "\u{1105}\u{1165}\u{11B2}", - nfkc: "\u{B7F7}", - nfkd: "\u{1105}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{B7F8}", - nfc: "\u{B7F8}", - nfd: "\u{1105}\u{1165}\u{11B3}", - nfkc: "\u{B7F8}", - nfkd: "\u{1105}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{B7F9}", - nfc: "\u{B7F9}", - nfd: "\u{1105}\u{1165}\u{11B4}", - nfkc: "\u{B7F9}", - nfkd: "\u{1105}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{B7FA}", - nfc: "\u{B7FA}", - nfd: "\u{1105}\u{1165}\u{11B5}", - nfkc: "\u{B7FA}", - nfkd: "\u{1105}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{B7FB}", - nfc: "\u{B7FB}", - nfd: "\u{1105}\u{1165}\u{11B6}", - nfkc: "\u{B7FB}", - nfkd: "\u{1105}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{B7FC}", - nfc: "\u{B7FC}", - nfd: "\u{1105}\u{1165}\u{11B7}", - nfkc: "\u{B7FC}", - nfkd: "\u{1105}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{B7FD}", - nfc: "\u{B7FD}", - nfd: "\u{1105}\u{1165}\u{11B8}", - nfkc: "\u{B7FD}", - nfkd: "\u{1105}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{B7FE}", - nfc: "\u{B7FE}", - nfd: "\u{1105}\u{1165}\u{11B9}", - nfkc: "\u{B7FE}", - nfkd: "\u{1105}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{B7FF}", - nfc: "\u{B7FF}", - nfd: "\u{1105}\u{1165}\u{11BA}", - nfkc: "\u{B7FF}", - nfkd: "\u{1105}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{B800}", - nfc: "\u{B800}", - nfd: "\u{1105}\u{1165}\u{11BB}", - nfkc: "\u{B800}", - nfkd: "\u{1105}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{B801}", - nfc: "\u{B801}", - nfd: "\u{1105}\u{1165}\u{11BC}", - nfkc: "\u{B801}", - nfkd: "\u{1105}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{B802}", - nfc: "\u{B802}", - nfd: "\u{1105}\u{1165}\u{11BD}", - nfkc: "\u{B802}", - nfkd: "\u{1105}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{B803}", - nfc: "\u{B803}", - nfd: "\u{1105}\u{1165}\u{11BE}", - nfkc: "\u{B803}", - nfkd: "\u{1105}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{B804}", - nfc: "\u{B804}", - nfd: "\u{1105}\u{1165}\u{11BF}", - nfkc: "\u{B804}", - nfkd: "\u{1105}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{B805}", - nfc: "\u{B805}", - nfd: "\u{1105}\u{1165}\u{11C0}", - nfkc: "\u{B805}", - nfkd: "\u{1105}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{B806}", - nfc: "\u{B806}", - nfd: "\u{1105}\u{1165}\u{11C1}", - nfkc: "\u{B806}", - nfkd: "\u{1105}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{B807}", - nfc: "\u{B807}", - nfd: "\u{1105}\u{1165}\u{11C2}", - nfkc: "\u{B807}", - nfkd: "\u{1105}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{B808}", - nfc: "\u{B808}", - nfd: "\u{1105}\u{1166}", - nfkc: "\u{B808}", - nfkd: "\u{1105}\u{1166}", - }, - NormalizationTest { - source: "\u{B809}", - nfc: "\u{B809}", - nfd: "\u{1105}\u{1166}\u{11A8}", - nfkc: "\u{B809}", - nfkd: "\u{1105}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{B80A}", - nfc: "\u{B80A}", - nfd: "\u{1105}\u{1166}\u{11A9}", - nfkc: "\u{B80A}", - nfkd: "\u{1105}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{B80B}", - nfc: "\u{B80B}", - nfd: "\u{1105}\u{1166}\u{11AA}", - nfkc: "\u{B80B}", - nfkd: "\u{1105}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{B80C}", - nfc: "\u{B80C}", - nfd: "\u{1105}\u{1166}\u{11AB}", - nfkc: "\u{B80C}", - nfkd: "\u{1105}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{B80D}", - nfc: "\u{B80D}", - nfd: "\u{1105}\u{1166}\u{11AC}", - nfkc: "\u{B80D}", - nfkd: "\u{1105}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{B80E}", - nfc: "\u{B80E}", - nfd: "\u{1105}\u{1166}\u{11AD}", - nfkc: "\u{B80E}", - nfkd: "\u{1105}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{B80F}", - nfc: "\u{B80F}", - nfd: "\u{1105}\u{1166}\u{11AE}", - nfkc: "\u{B80F}", - nfkd: "\u{1105}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{B810}", - nfc: "\u{B810}", - nfd: "\u{1105}\u{1166}\u{11AF}", - nfkc: "\u{B810}", - nfkd: "\u{1105}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{B811}", - nfc: "\u{B811}", - nfd: "\u{1105}\u{1166}\u{11B0}", - nfkc: "\u{B811}", - nfkd: "\u{1105}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{B812}", - nfc: "\u{B812}", - nfd: "\u{1105}\u{1166}\u{11B1}", - nfkc: "\u{B812}", - nfkd: "\u{1105}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{B813}", - nfc: "\u{B813}", - nfd: "\u{1105}\u{1166}\u{11B2}", - nfkc: "\u{B813}", - nfkd: "\u{1105}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{B814}", - nfc: "\u{B814}", - nfd: "\u{1105}\u{1166}\u{11B3}", - nfkc: "\u{B814}", - nfkd: "\u{1105}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{B815}", - nfc: "\u{B815}", - nfd: "\u{1105}\u{1166}\u{11B4}", - nfkc: "\u{B815}", - nfkd: "\u{1105}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{B816}", - nfc: "\u{B816}", - nfd: "\u{1105}\u{1166}\u{11B5}", - nfkc: "\u{B816}", - nfkd: "\u{1105}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{B817}", - nfc: "\u{B817}", - nfd: "\u{1105}\u{1166}\u{11B6}", - nfkc: "\u{B817}", - nfkd: "\u{1105}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{B818}", - nfc: "\u{B818}", - nfd: "\u{1105}\u{1166}\u{11B7}", - nfkc: "\u{B818}", - nfkd: "\u{1105}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{B819}", - nfc: "\u{B819}", - nfd: "\u{1105}\u{1166}\u{11B8}", - nfkc: "\u{B819}", - nfkd: "\u{1105}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{B81A}", - nfc: "\u{B81A}", - nfd: "\u{1105}\u{1166}\u{11B9}", - nfkc: "\u{B81A}", - nfkd: "\u{1105}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{B81B}", - nfc: "\u{B81B}", - nfd: "\u{1105}\u{1166}\u{11BA}", - nfkc: "\u{B81B}", - nfkd: "\u{1105}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{B81C}", - nfc: "\u{B81C}", - nfd: "\u{1105}\u{1166}\u{11BB}", - nfkc: "\u{B81C}", - nfkd: "\u{1105}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{B81D}", - nfc: "\u{B81D}", - nfd: "\u{1105}\u{1166}\u{11BC}", - nfkc: "\u{B81D}", - nfkd: "\u{1105}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{B81E}", - nfc: "\u{B81E}", - nfd: "\u{1105}\u{1166}\u{11BD}", - nfkc: "\u{B81E}", - nfkd: "\u{1105}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{B81F}", - nfc: "\u{B81F}", - nfd: "\u{1105}\u{1166}\u{11BE}", - nfkc: "\u{B81F}", - nfkd: "\u{1105}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{B820}", - nfc: "\u{B820}", - nfd: "\u{1105}\u{1166}\u{11BF}", - nfkc: "\u{B820}", - nfkd: "\u{1105}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{B821}", - nfc: "\u{B821}", - nfd: "\u{1105}\u{1166}\u{11C0}", - nfkc: "\u{B821}", - nfkd: "\u{1105}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{B822}", - nfc: "\u{B822}", - nfd: "\u{1105}\u{1166}\u{11C1}", - nfkc: "\u{B822}", - nfkd: "\u{1105}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{B823}", - nfc: "\u{B823}", - nfd: "\u{1105}\u{1166}\u{11C2}", - nfkc: "\u{B823}", - nfkd: "\u{1105}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{B824}", - nfc: "\u{B824}", - nfd: "\u{1105}\u{1167}", - nfkc: "\u{B824}", - nfkd: "\u{1105}\u{1167}", - }, - NormalizationTest { - source: "\u{B825}", - nfc: "\u{B825}", - nfd: "\u{1105}\u{1167}\u{11A8}", - nfkc: "\u{B825}", - nfkd: "\u{1105}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{B826}", - nfc: "\u{B826}", - nfd: "\u{1105}\u{1167}\u{11A9}", - nfkc: "\u{B826}", - nfkd: "\u{1105}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{B827}", - nfc: "\u{B827}", - nfd: "\u{1105}\u{1167}\u{11AA}", - nfkc: "\u{B827}", - nfkd: "\u{1105}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{B828}", - nfc: "\u{B828}", - nfd: "\u{1105}\u{1167}\u{11AB}", - nfkc: "\u{B828}", - nfkd: "\u{1105}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{B829}", - nfc: "\u{B829}", - nfd: "\u{1105}\u{1167}\u{11AC}", - nfkc: "\u{B829}", - nfkd: "\u{1105}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{B82A}", - nfc: "\u{B82A}", - nfd: "\u{1105}\u{1167}\u{11AD}", - nfkc: "\u{B82A}", - nfkd: "\u{1105}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{B82B}", - nfc: "\u{B82B}", - nfd: "\u{1105}\u{1167}\u{11AE}", - nfkc: "\u{B82B}", - nfkd: "\u{1105}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{B82C}", - nfc: "\u{B82C}", - nfd: "\u{1105}\u{1167}\u{11AF}", - nfkc: "\u{B82C}", - nfkd: "\u{1105}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{B82D}", - nfc: "\u{B82D}", - nfd: "\u{1105}\u{1167}\u{11B0}", - nfkc: "\u{B82D}", - nfkd: "\u{1105}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{B82E}", - nfc: "\u{B82E}", - nfd: "\u{1105}\u{1167}\u{11B1}", - nfkc: "\u{B82E}", - nfkd: "\u{1105}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{B82F}", - nfc: "\u{B82F}", - nfd: "\u{1105}\u{1167}\u{11B2}", - nfkc: "\u{B82F}", - nfkd: "\u{1105}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{B830}", - nfc: "\u{B830}", - nfd: "\u{1105}\u{1167}\u{11B3}", - nfkc: "\u{B830}", - nfkd: "\u{1105}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{B831}", - nfc: "\u{B831}", - nfd: "\u{1105}\u{1167}\u{11B4}", - nfkc: "\u{B831}", - nfkd: "\u{1105}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{B832}", - nfc: "\u{B832}", - nfd: "\u{1105}\u{1167}\u{11B5}", - nfkc: "\u{B832}", - nfkd: "\u{1105}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{B833}", - nfc: "\u{B833}", - nfd: "\u{1105}\u{1167}\u{11B6}", - nfkc: "\u{B833}", - nfkd: "\u{1105}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{B834}", - nfc: "\u{B834}", - nfd: "\u{1105}\u{1167}\u{11B7}", - nfkc: "\u{B834}", - nfkd: "\u{1105}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{B835}", - nfc: "\u{B835}", - nfd: "\u{1105}\u{1167}\u{11B8}", - nfkc: "\u{B835}", - nfkd: "\u{1105}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{B836}", - nfc: "\u{B836}", - nfd: "\u{1105}\u{1167}\u{11B9}", - nfkc: "\u{B836}", - nfkd: "\u{1105}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{B837}", - nfc: "\u{B837}", - nfd: "\u{1105}\u{1167}\u{11BA}", - nfkc: "\u{B837}", - nfkd: "\u{1105}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{B838}", - nfc: "\u{B838}", - nfd: "\u{1105}\u{1167}\u{11BB}", - nfkc: "\u{B838}", - nfkd: "\u{1105}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{B839}", - nfc: "\u{B839}", - nfd: "\u{1105}\u{1167}\u{11BC}", - nfkc: "\u{B839}", - nfkd: "\u{1105}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{B83A}", - nfc: "\u{B83A}", - nfd: "\u{1105}\u{1167}\u{11BD}", - nfkc: "\u{B83A}", - nfkd: "\u{1105}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{B83B}", - nfc: "\u{B83B}", - nfd: "\u{1105}\u{1167}\u{11BE}", - nfkc: "\u{B83B}", - nfkd: "\u{1105}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{B83C}", - nfc: "\u{B83C}", - nfd: "\u{1105}\u{1167}\u{11BF}", - nfkc: "\u{B83C}", - nfkd: "\u{1105}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{B83D}", - nfc: "\u{B83D}", - nfd: "\u{1105}\u{1167}\u{11C0}", - nfkc: "\u{B83D}", - nfkd: "\u{1105}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{B83E}", - nfc: "\u{B83E}", - nfd: "\u{1105}\u{1167}\u{11C1}", - nfkc: "\u{B83E}", - nfkd: "\u{1105}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{B83F}", - nfc: "\u{B83F}", - nfd: "\u{1105}\u{1167}\u{11C2}", - nfkc: "\u{B83F}", - nfkd: "\u{1105}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{B840}", - nfc: "\u{B840}", - nfd: "\u{1105}\u{1168}", - nfkc: "\u{B840}", - nfkd: "\u{1105}\u{1168}", - }, - NormalizationTest { - source: "\u{B841}", - nfc: "\u{B841}", - nfd: "\u{1105}\u{1168}\u{11A8}", - nfkc: "\u{B841}", - nfkd: "\u{1105}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{B842}", - nfc: "\u{B842}", - nfd: "\u{1105}\u{1168}\u{11A9}", - nfkc: "\u{B842}", - nfkd: "\u{1105}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{B843}", - nfc: "\u{B843}", - nfd: "\u{1105}\u{1168}\u{11AA}", - nfkc: "\u{B843}", - nfkd: "\u{1105}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{B844}", - nfc: "\u{B844}", - nfd: "\u{1105}\u{1168}\u{11AB}", - nfkc: "\u{B844}", - nfkd: "\u{1105}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{B845}", - nfc: "\u{B845}", - nfd: "\u{1105}\u{1168}\u{11AC}", - nfkc: "\u{B845}", - nfkd: "\u{1105}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{B846}", - nfc: "\u{B846}", - nfd: "\u{1105}\u{1168}\u{11AD}", - nfkc: "\u{B846}", - nfkd: "\u{1105}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{B847}", - nfc: "\u{B847}", - nfd: "\u{1105}\u{1168}\u{11AE}", - nfkc: "\u{B847}", - nfkd: "\u{1105}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{B848}", - nfc: "\u{B848}", - nfd: "\u{1105}\u{1168}\u{11AF}", - nfkc: "\u{B848}", - nfkd: "\u{1105}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{B849}", - nfc: "\u{B849}", - nfd: "\u{1105}\u{1168}\u{11B0}", - nfkc: "\u{B849}", - nfkd: "\u{1105}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{B84A}", - nfc: "\u{B84A}", - nfd: "\u{1105}\u{1168}\u{11B1}", - nfkc: "\u{B84A}", - nfkd: "\u{1105}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{B84B}", - nfc: "\u{B84B}", - nfd: "\u{1105}\u{1168}\u{11B2}", - nfkc: "\u{B84B}", - nfkd: "\u{1105}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{B84C}", - nfc: "\u{B84C}", - nfd: "\u{1105}\u{1168}\u{11B3}", - nfkc: "\u{B84C}", - nfkd: "\u{1105}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{B84D}", - nfc: "\u{B84D}", - nfd: "\u{1105}\u{1168}\u{11B4}", - nfkc: "\u{B84D}", - nfkd: "\u{1105}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{B84E}", - nfc: "\u{B84E}", - nfd: "\u{1105}\u{1168}\u{11B5}", - nfkc: "\u{B84E}", - nfkd: "\u{1105}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{B84F}", - nfc: "\u{B84F}", - nfd: "\u{1105}\u{1168}\u{11B6}", - nfkc: "\u{B84F}", - nfkd: "\u{1105}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{B850}", - nfc: "\u{B850}", - nfd: "\u{1105}\u{1168}\u{11B7}", - nfkc: "\u{B850}", - nfkd: "\u{1105}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{B851}", - nfc: "\u{B851}", - nfd: "\u{1105}\u{1168}\u{11B8}", - nfkc: "\u{B851}", - nfkd: "\u{1105}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{B852}", - nfc: "\u{B852}", - nfd: "\u{1105}\u{1168}\u{11B9}", - nfkc: "\u{B852}", - nfkd: "\u{1105}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{B853}", - nfc: "\u{B853}", - nfd: "\u{1105}\u{1168}\u{11BA}", - nfkc: "\u{B853}", - nfkd: "\u{1105}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{B854}", - nfc: "\u{B854}", - nfd: "\u{1105}\u{1168}\u{11BB}", - nfkc: "\u{B854}", - nfkd: "\u{1105}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{B855}", - nfc: "\u{B855}", - nfd: "\u{1105}\u{1168}\u{11BC}", - nfkc: "\u{B855}", - nfkd: "\u{1105}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{B856}", - nfc: "\u{B856}", - nfd: "\u{1105}\u{1168}\u{11BD}", - nfkc: "\u{B856}", - nfkd: "\u{1105}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{B857}", - nfc: "\u{B857}", - nfd: "\u{1105}\u{1168}\u{11BE}", - nfkc: "\u{B857}", - nfkd: "\u{1105}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{B858}", - nfc: "\u{B858}", - nfd: "\u{1105}\u{1168}\u{11BF}", - nfkc: "\u{B858}", - nfkd: "\u{1105}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{B859}", - nfc: "\u{B859}", - nfd: "\u{1105}\u{1168}\u{11C0}", - nfkc: "\u{B859}", - nfkd: "\u{1105}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{B85A}", - nfc: "\u{B85A}", - nfd: "\u{1105}\u{1168}\u{11C1}", - nfkc: "\u{B85A}", - nfkd: "\u{1105}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{B85B}", - nfc: "\u{B85B}", - nfd: "\u{1105}\u{1168}\u{11C2}", - nfkc: "\u{B85B}", - nfkd: "\u{1105}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{B85C}", - nfc: "\u{B85C}", - nfd: "\u{1105}\u{1169}", - nfkc: "\u{B85C}", - nfkd: "\u{1105}\u{1169}", - }, - NormalizationTest { - source: "\u{B85D}", - nfc: "\u{B85D}", - nfd: "\u{1105}\u{1169}\u{11A8}", - nfkc: "\u{B85D}", - nfkd: "\u{1105}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{B85E}", - nfc: "\u{B85E}", - nfd: "\u{1105}\u{1169}\u{11A9}", - nfkc: "\u{B85E}", - nfkd: "\u{1105}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{B85F}", - nfc: "\u{B85F}", - nfd: "\u{1105}\u{1169}\u{11AA}", - nfkc: "\u{B85F}", - nfkd: "\u{1105}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{B860}", - nfc: "\u{B860}", - nfd: "\u{1105}\u{1169}\u{11AB}", - nfkc: "\u{B860}", - nfkd: "\u{1105}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{B861}", - nfc: "\u{B861}", - nfd: "\u{1105}\u{1169}\u{11AC}", - nfkc: "\u{B861}", - nfkd: "\u{1105}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{B862}", - nfc: "\u{B862}", - nfd: "\u{1105}\u{1169}\u{11AD}", - nfkc: "\u{B862}", - nfkd: "\u{1105}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{B863}", - nfc: "\u{B863}", - nfd: "\u{1105}\u{1169}\u{11AE}", - nfkc: "\u{B863}", - nfkd: "\u{1105}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{B864}", - nfc: "\u{B864}", - nfd: "\u{1105}\u{1169}\u{11AF}", - nfkc: "\u{B864}", - nfkd: "\u{1105}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{B865}", - nfc: "\u{B865}", - nfd: "\u{1105}\u{1169}\u{11B0}", - nfkc: "\u{B865}", - nfkd: "\u{1105}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{B866}", - nfc: "\u{B866}", - nfd: "\u{1105}\u{1169}\u{11B1}", - nfkc: "\u{B866}", - nfkd: "\u{1105}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{B867}", - nfc: "\u{B867}", - nfd: "\u{1105}\u{1169}\u{11B2}", - nfkc: "\u{B867}", - nfkd: "\u{1105}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{B868}", - nfc: "\u{B868}", - nfd: "\u{1105}\u{1169}\u{11B3}", - nfkc: "\u{B868}", - nfkd: "\u{1105}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{B869}", - nfc: "\u{B869}", - nfd: "\u{1105}\u{1169}\u{11B4}", - nfkc: "\u{B869}", - nfkd: "\u{1105}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{B86A}", - nfc: "\u{B86A}", - nfd: "\u{1105}\u{1169}\u{11B5}", - nfkc: "\u{B86A}", - nfkd: "\u{1105}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{B86B}", - nfc: "\u{B86B}", - nfd: "\u{1105}\u{1169}\u{11B6}", - nfkc: "\u{B86B}", - nfkd: "\u{1105}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{B86C}", - nfc: "\u{B86C}", - nfd: "\u{1105}\u{1169}\u{11B7}", - nfkc: "\u{B86C}", - nfkd: "\u{1105}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{B86D}", - nfc: "\u{B86D}", - nfd: "\u{1105}\u{1169}\u{11B8}", - nfkc: "\u{B86D}", - nfkd: "\u{1105}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{B86E}", - nfc: "\u{B86E}", - nfd: "\u{1105}\u{1169}\u{11B9}", - nfkc: "\u{B86E}", - nfkd: "\u{1105}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{B86F}", - nfc: "\u{B86F}", - nfd: "\u{1105}\u{1169}\u{11BA}", - nfkc: "\u{B86F}", - nfkd: "\u{1105}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{B870}", - nfc: "\u{B870}", - nfd: "\u{1105}\u{1169}\u{11BB}", - nfkc: "\u{B870}", - nfkd: "\u{1105}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{B871}", - nfc: "\u{B871}", - nfd: "\u{1105}\u{1169}\u{11BC}", - nfkc: "\u{B871}", - nfkd: "\u{1105}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{B872}", - nfc: "\u{B872}", - nfd: "\u{1105}\u{1169}\u{11BD}", - nfkc: "\u{B872}", - nfkd: "\u{1105}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{B873}", - nfc: "\u{B873}", - nfd: "\u{1105}\u{1169}\u{11BE}", - nfkc: "\u{B873}", - nfkd: "\u{1105}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{B874}", - nfc: "\u{B874}", - nfd: "\u{1105}\u{1169}\u{11BF}", - nfkc: "\u{B874}", - nfkd: "\u{1105}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{B875}", - nfc: "\u{B875}", - nfd: "\u{1105}\u{1169}\u{11C0}", - nfkc: "\u{B875}", - nfkd: "\u{1105}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{B876}", - nfc: "\u{B876}", - nfd: "\u{1105}\u{1169}\u{11C1}", - nfkc: "\u{B876}", - nfkd: "\u{1105}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{B877}", - nfc: "\u{B877}", - nfd: "\u{1105}\u{1169}\u{11C2}", - nfkc: "\u{B877}", - nfkd: "\u{1105}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{B878}", - nfc: "\u{B878}", - nfd: "\u{1105}\u{116A}", - nfkc: "\u{B878}", - nfkd: "\u{1105}\u{116A}", - }, - NormalizationTest { - source: "\u{B879}", - nfc: "\u{B879}", - nfd: "\u{1105}\u{116A}\u{11A8}", - nfkc: "\u{B879}", - nfkd: "\u{1105}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{B87A}", - nfc: "\u{B87A}", - nfd: "\u{1105}\u{116A}\u{11A9}", - nfkc: "\u{B87A}", - nfkd: "\u{1105}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{B87B}", - nfc: "\u{B87B}", - nfd: "\u{1105}\u{116A}\u{11AA}", - nfkc: "\u{B87B}", - nfkd: "\u{1105}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{B87C}", - nfc: "\u{B87C}", - nfd: "\u{1105}\u{116A}\u{11AB}", - nfkc: "\u{B87C}", - nfkd: "\u{1105}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{B87D}", - nfc: "\u{B87D}", - nfd: "\u{1105}\u{116A}\u{11AC}", - nfkc: "\u{B87D}", - nfkd: "\u{1105}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{B87E}", - nfc: "\u{B87E}", - nfd: "\u{1105}\u{116A}\u{11AD}", - nfkc: "\u{B87E}", - nfkd: "\u{1105}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{B87F}", - nfc: "\u{B87F}", - nfd: "\u{1105}\u{116A}\u{11AE}", - nfkc: "\u{B87F}", - nfkd: "\u{1105}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{B880}", - nfc: "\u{B880}", - nfd: "\u{1105}\u{116A}\u{11AF}", - nfkc: "\u{B880}", - nfkd: "\u{1105}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{B881}", - nfc: "\u{B881}", - nfd: "\u{1105}\u{116A}\u{11B0}", - nfkc: "\u{B881}", - nfkd: "\u{1105}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{B882}", - nfc: "\u{B882}", - nfd: "\u{1105}\u{116A}\u{11B1}", - nfkc: "\u{B882}", - nfkd: "\u{1105}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{B883}", - nfc: "\u{B883}", - nfd: "\u{1105}\u{116A}\u{11B2}", - nfkc: "\u{B883}", - nfkd: "\u{1105}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{B884}", - nfc: "\u{B884}", - nfd: "\u{1105}\u{116A}\u{11B3}", - nfkc: "\u{B884}", - nfkd: "\u{1105}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{B885}", - nfc: "\u{B885}", - nfd: "\u{1105}\u{116A}\u{11B4}", - nfkc: "\u{B885}", - nfkd: "\u{1105}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{B886}", - nfc: "\u{B886}", - nfd: "\u{1105}\u{116A}\u{11B5}", - nfkc: "\u{B886}", - nfkd: "\u{1105}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{B887}", - nfc: "\u{B887}", - nfd: "\u{1105}\u{116A}\u{11B6}", - nfkc: "\u{B887}", - nfkd: "\u{1105}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{B888}", - nfc: "\u{B888}", - nfd: "\u{1105}\u{116A}\u{11B7}", - nfkc: "\u{B888}", - nfkd: "\u{1105}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{B889}", - nfc: "\u{B889}", - nfd: "\u{1105}\u{116A}\u{11B8}", - nfkc: "\u{B889}", - nfkd: "\u{1105}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{B88A}", - nfc: "\u{B88A}", - nfd: "\u{1105}\u{116A}\u{11B9}", - nfkc: "\u{B88A}", - nfkd: "\u{1105}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{B88B}", - nfc: "\u{B88B}", - nfd: "\u{1105}\u{116A}\u{11BA}", - nfkc: "\u{B88B}", - nfkd: "\u{1105}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{B88C}", - nfc: "\u{B88C}", - nfd: "\u{1105}\u{116A}\u{11BB}", - nfkc: "\u{B88C}", - nfkd: "\u{1105}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{B88D}", - nfc: "\u{B88D}", - nfd: "\u{1105}\u{116A}\u{11BC}", - nfkc: "\u{B88D}", - nfkd: "\u{1105}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{B88E}", - nfc: "\u{B88E}", - nfd: "\u{1105}\u{116A}\u{11BD}", - nfkc: "\u{B88E}", - nfkd: "\u{1105}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{B88F}", - nfc: "\u{B88F}", - nfd: "\u{1105}\u{116A}\u{11BE}", - nfkc: "\u{B88F}", - nfkd: "\u{1105}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{B890}", - nfc: "\u{B890}", - nfd: "\u{1105}\u{116A}\u{11BF}", - nfkc: "\u{B890}", - nfkd: "\u{1105}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{B891}", - nfc: "\u{B891}", - nfd: "\u{1105}\u{116A}\u{11C0}", - nfkc: "\u{B891}", - nfkd: "\u{1105}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{B892}", - nfc: "\u{B892}", - nfd: "\u{1105}\u{116A}\u{11C1}", - nfkc: "\u{B892}", - nfkd: "\u{1105}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{B893}", - nfc: "\u{B893}", - nfd: "\u{1105}\u{116A}\u{11C2}", - nfkc: "\u{B893}", - nfkd: "\u{1105}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{B894}", - nfc: "\u{B894}", - nfd: "\u{1105}\u{116B}", - nfkc: "\u{B894}", - nfkd: "\u{1105}\u{116B}", - }, - NormalizationTest { - source: "\u{B895}", - nfc: "\u{B895}", - nfd: "\u{1105}\u{116B}\u{11A8}", - nfkc: "\u{B895}", - nfkd: "\u{1105}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{B896}", - nfc: "\u{B896}", - nfd: "\u{1105}\u{116B}\u{11A9}", - nfkc: "\u{B896}", - nfkd: "\u{1105}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{B897}", - nfc: "\u{B897}", - nfd: "\u{1105}\u{116B}\u{11AA}", - nfkc: "\u{B897}", - nfkd: "\u{1105}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{B898}", - nfc: "\u{B898}", - nfd: "\u{1105}\u{116B}\u{11AB}", - nfkc: "\u{B898}", - nfkd: "\u{1105}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{B899}", - nfc: "\u{B899}", - nfd: "\u{1105}\u{116B}\u{11AC}", - nfkc: "\u{B899}", - nfkd: "\u{1105}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{B89A}", - nfc: "\u{B89A}", - nfd: "\u{1105}\u{116B}\u{11AD}", - nfkc: "\u{B89A}", - nfkd: "\u{1105}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{B89B}", - nfc: "\u{B89B}", - nfd: "\u{1105}\u{116B}\u{11AE}", - nfkc: "\u{B89B}", - nfkd: "\u{1105}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{B89C}", - nfc: "\u{B89C}", - nfd: "\u{1105}\u{116B}\u{11AF}", - nfkc: "\u{B89C}", - nfkd: "\u{1105}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{B89D}", - nfc: "\u{B89D}", - nfd: "\u{1105}\u{116B}\u{11B0}", - nfkc: "\u{B89D}", - nfkd: "\u{1105}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{B89E}", - nfc: "\u{B89E}", - nfd: "\u{1105}\u{116B}\u{11B1}", - nfkc: "\u{B89E}", - nfkd: "\u{1105}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{B89F}", - nfc: "\u{B89F}", - nfd: "\u{1105}\u{116B}\u{11B2}", - nfkc: "\u{B89F}", - nfkd: "\u{1105}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{B8A0}", - nfc: "\u{B8A0}", - nfd: "\u{1105}\u{116B}\u{11B3}", - nfkc: "\u{B8A0}", - nfkd: "\u{1105}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{B8A1}", - nfc: "\u{B8A1}", - nfd: "\u{1105}\u{116B}\u{11B4}", - nfkc: "\u{B8A1}", - nfkd: "\u{1105}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{B8A2}", - nfc: "\u{B8A2}", - nfd: "\u{1105}\u{116B}\u{11B5}", - nfkc: "\u{B8A2}", - nfkd: "\u{1105}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{B8A3}", - nfc: "\u{B8A3}", - nfd: "\u{1105}\u{116B}\u{11B6}", - nfkc: "\u{B8A3}", - nfkd: "\u{1105}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{B8A4}", - nfc: "\u{B8A4}", - nfd: "\u{1105}\u{116B}\u{11B7}", - nfkc: "\u{B8A4}", - nfkd: "\u{1105}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{B8A5}", - nfc: "\u{B8A5}", - nfd: "\u{1105}\u{116B}\u{11B8}", - nfkc: "\u{B8A5}", - nfkd: "\u{1105}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{B8A6}", - nfc: "\u{B8A6}", - nfd: "\u{1105}\u{116B}\u{11B9}", - nfkc: "\u{B8A6}", - nfkd: "\u{1105}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{B8A7}", - nfc: "\u{B8A7}", - nfd: "\u{1105}\u{116B}\u{11BA}", - nfkc: "\u{B8A7}", - nfkd: "\u{1105}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{B8A8}", - nfc: "\u{B8A8}", - nfd: "\u{1105}\u{116B}\u{11BB}", - nfkc: "\u{B8A8}", - nfkd: "\u{1105}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{B8A9}", - nfc: "\u{B8A9}", - nfd: "\u{1105}\u{116B}\u{11BC}", - nfkc: "\u{B8A9}", - nfkd: "\u{1105}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{B8AA}", - nfc: "\u{B8AA}", - nfd: "\u{1105}\u{116B}\u{11BD}", - nfkc: "\u{B8AA}", - nfkd: "\u{1105}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{B8AB}", - nfc: "\u{B8AB}", - nfd: "\u{1105}\u{116B}\u{11BE}", - nfkc: "\u{B8AB}", - nfkd: "\u{1105}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{B8AC}", - nfc: "\u{B8AC}", - nfd: "\u{1105}\u{116B}\u{11BF}", - nfkc: "\u{B8AC}", - nfkd: "\u{1105}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{B8AD}", - nfc: "\u{B8AD}", - nfd: "\u{1105}\u{116B}\u{11C0}", - nfkc: "\u{B8AD}", - nfkd: "\u{1105}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{B8AE}", - nfc: "\u{B8AE}", - nfd: "\u{1105}\u{116B}\u{11C1}", - nfkc: "\u{B8AE}", - nfkd: "\u{1105}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{B8AF}", - nfc: "\u{B8AF}", - nfd: "\u{1105}\u{116B}\u{11C2}", - nfkc: "\u{B8AF}", - nfkd: "\u{1105}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{B8B0}", - nfc: "\u{B8B0}", - nfd: "\u{1105}\u{116C}", - nfkc: "\u{B8B0}", - nfkd: "\u{1105}\u{116C}", - }, - NormalizationTest { - source: "\u{B8B1}", - nfc: "\u{B8B1}", - nfd: "\u{1105}\u{116C}\u{11A8}", - nfkc: "\u{B8B1}", - nfkd: "\u{1105}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{B8B2}", - nfc: "\u{B8B2}", - nfd: "\u{1105}\u{116C}\u{11A9}", - nfkc: "\u{B8B2}", - nfkd: "\u{1105}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{B8B3}", - nfc: "\u{B8B3}", - nfd: "\u{1105}\u{116C}\u{11AA}", - nfkc: "\u{B8B3}", - nfkd: "\u{1105}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{B8B4}", - nfc: "\u{B8B4}", - nfd: "\u{1105}\u{116C}\u{11AB}", - nfkc: "\u{B8B4}", - nfkd: "\u{1105}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{B8B5}", - nfc: "\u{B8B5}", - nfd: "\u{1105}\u{116C}\u{11AC}", - nfkc: "\u{B8B5}", - nfkd: "\u{1105}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{B8B6}", - nfc: "\u{B8B6}", - nfd: "\u{1105}\u{116C}\u{11AD}", - nfkc: "\u{B8B6}", - nfkd: "\u{1105}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{B8B7}", - nfc: "\u{B8B7}", - nfd: "\u{1105}\u{116C}\u{11AE}", - nfkc: "\u{B8B7}", - nfkd: "\u{1105}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{B8B8}", - nfc: "\u{B8B8}", - nfd: "\u{1105}\u{116C}\u{11AF}", - nfkc: "\u{B8B8}", - nfkd: "\u{1105}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{B8B9}", - nfc: "\u{B8B9}", - nfd: "\u{1105}\u{116C}\u{11B0}", - nfkc: "\u{B8B9}", - nfkd: "\u{1105}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{B8BA}", - nfc: "\u{B8BA}", - nfd: "\u{1105}\u{116C}\u{11B1}", - nfkc: "\u{B8BA}", - nfkd: "\u{1105}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{B8BB}", - nfc: "\u{B8BB}", - nfd: "\u{1105}\u{116C}\u{11B2}", - nfkc: "\u{B8BB}", - nfkd: "\u{1105}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{B8BC}", - nfc: "\u{B8BC}", - nfd: "\u{1105}\u{116C}\u{11B3}", - nfkc: "\u{B8BC}", - nfkd: "\u{1105}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{B8BD}", - nfc: "\u{B8BD}", - nfd: "\u{1105}\u{116C}\u{11B4}", - nfkc: "\u{B8BD}", - nfkd: "\u{1105}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{B8BE}", - nfc: "\u{B8BE}", - nfd: "\u{1105}\u{116C}\u{11B5}", - nfkc: "\u{B8BE}", - nfkd: "\u{1105}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{B8BF}", - nfc: "\u{B8BF}", - nfd: "\u{1105}\u{116C}\u{11B6}", - nfkc: "\u{B8BF}", - nfkd: "\u{1105}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{B8C0}", - nfc: "\u{B8C0}", - nfd: "\u{1105}\u{116C}\u{11B7}", - nfkc: "\u{B8C0}", - nfkd: "\u{1105}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{B8C1}", - nfc: "\u{B8C1}", - nfd: "\u{1105}\u{116C}\u{11B8}", - nfkc: "\u{B8C1}", - nfkd: "\u{1105}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{B8C2}", - nfc: "\u{B8C2}", - nfd: "\u{1105}\u{116C}\u{11B9}", - nfkc: "\u{B8C2}", - nfkd: "\u{1105}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{B8C3}", - nfc: "\u{B8C3}", - nfd: "\u{1105}\u{116C}\u{11BA}", - nfkc: "\u{B8C3}", - nfkd: "\u{1105}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{B8C4}", - nfc: "\u{B8C4}", - nfd: "\u{1105}\u{116C}\u{11BB}", - nfkc: "\u{B8C4}", - nfkd: "\u{1105}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{B8C5}", - nfc: "\u{B8C5}", - nfd: "\u{1105}\u{116C}\u{11BC}", - nfkc: "\u{B8C5}", - nfkd: "\u{1105}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{B8C6}", - nfc: "\u{B8C6}", - nfd: "\u{1105}\u{116C}\u{11BD}", - nfkc: "\u{B8C6}", - nfkd: "\u{1105}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{B8C7}", - nfc: "\u{B8C7}", - nfd: "\u{1105}\u{116C}\u{11BE}", - nfkc: "\u{B8C7}", - nfkd: "\u{1105}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{B8C8}", - nfc: "\u{B8C8}", - nfd: "\u{1105}\u{116C}\u{11BF}", - nfkc: "\u{B8C8}", - nfkd: "\u{1105}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{B8C9}", - nfc: "\u{B8C9}", - nfd: "\u{1105}\u{116C}\u{11C0}", - nfkc: "\u{B8C9}", - nfkd: "\u{1105}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{B8CA}", - nfc: "\u{B8CA}", - nfd: "\u{1105}\u{116C}\u{11C1}", - nfkc: "\u{B8CA}", - nfkd: "\u{1105}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{B8CB}", - nfc: "\u{B8CB}", - nfd: "\u{1105}\u{116C}\u{11C2}", - nfkc: "\u{B8CB}", - nfkd: "\u{1105}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{B8CC}", - nfc: "\u{B8CC}", - nfd: "\u{1105}\u{116D}", - nfkc: "\u{B8CC}", - nfkd: "\u{1105}\u{116D}", - }, - NormalizationTest { - source: "\u{B8CD}", - nfc: "\u{B8CD}", - nfd: "\u{1105}\u{116D}\u{11A8}", - nfkc: "\u{B8CD}", - nfkd: "\u{1105}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{B8CE}", - nfc: "\u{B8CE}", - nfd: "\u{1105}\u{116D}\u{11A9}", - nfkc: "\u{B8CE}", - nfkd: "\u{1105}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{B8CF}", - nfc: "\u{B8CF}", - nfd: "\u{1105}\u{116D}\u{11AA}", - nfkc: "\u{B8CF}", - nfkd: "\u{1105}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{B8D0}", - nfc: "\u{B8D0}", - nfd: "\u{1105}\u{116D}\u{11AB}", - nfkc: "\u{B8D0}", - nfkd: "\u{1105}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{B8D1}", - nfc: "\u{B8D1}", - nfd: "\u{1105}\u{116D}\u{11AC}", - nfkc: "\u{B8D1}", - nfkd: "\u{1105}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{B8D2}", - nfc: "\u{B8D2}", - nfd: "\u{1105}\u{116D}\u{11AD}", - nfkc: "\u{B8D2}", - nfkd: "\u{1105}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{B8D3}", - nfc: "\u{B8D3}", - nfd: "\u{1105}\u{116D}\u{11AE}", - nfkc: "\u{B8D3}", - nfkd: "\u{1105}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{B8D4}", - nfc: "\u{B8D4}", - nfd: "\u{1105}\u{116D}\u{11AF}", - nfkc: "\u{B8D4}", - nfkd: "\u{1105}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{B8D5}", - nfc: "\u{B8D5}", - nfd: "\u{1105}\u{116D}\u{11B0}", - nfkc: "\u{B8D5}", - nfkd: "\u{1105}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{B8D6}", - nfc: "\u{B8D6}", - nfd: "\u{1105}\u{116D}\u{11B1}", - nfkc: "\u{B8D6}", - nfkd: "\u{1105}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{B8D7}", - nfc: "\u{B8D7}", - nfd: "\u{1105}\u{116D}\u{11B2}", - nfkc: "\u{B8D7}", - nfkd: "\u{1105}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{B8D8}", - nfc: "\u{B8D8}", - nfd: "\u{1105}\u{116D}\u{11B3}", - nfkc: "\u{B8D8}", - nfkd: "\u{1105}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{B8D9}", - nfc: "\u{B8D9}", - nfd: "\u{1105}\u{116D}\u{11B4}", - nfkc: "\u{B8D9}", - nfkd: "\u{1105}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{B8DA}", - nfc: "\u{B8DA}", - nfd: "\u{1105}\u{116D}\u{11B5}", - nfkc: "\u{B8DA}", - nfkd: "\u{1105}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{B8DB}", - nfc: "\u{B8DB}", - nfd: "\u{1105}\u{116D}\u{11B6}", - nfkc: "\u{B8DB}", - nfkd: "\u{1105}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{B8DC}", - nfc: "\u{B8DC}", - nfd: "\u{1105}\u{116D}\u{11B7}", - nfkc: "\u{B8DC}", - nfkd: "\u{1105}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{B8DD}", - nfc: "\u{B8DD}", - nfd: "\u{1105}\u{116D}\u{11B8}", - nfkc: "\u{B8DD}", - nfkd: "\u{1105}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{B8DE}", - nfc: "\u{B8DE}", - nfd: "\u{1105}\u{116D}\u{11B9}", - nfkc: "\u{B8DE}", - nfkd: "\u{1105}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{B8DF}", - nfc: "\u{B8DF}", - nfd: "\u{1105}\u{116D}\u{11BA}", - nfkc: "\u{B8DF}", - nfkd: "\u{1105}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{B8E0}", - nfc: "\u{B8E0}", - nfd: "\u{1105}\u{116D}\u{11BB}", - nfkc: "\u{B8E0}", - nfkd: "\u{1105}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{B8E1}", - nfc: "\u{B8E1}", - nfd: "\u{1105}\u{116D}\u{11BC}", - nfkc: "\u{B8E1}", - nfkd: "\u{1105}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{B8E2}", - nfc: "\u{B8E2}", - nfd: "\u{1105}\u{116D}\u{11BD}", - nfkc: "\u{B8E2}", - nfkd: "\u{1105}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{B8E3}", - nfc: "\u{B8E3}", - nfd: "\u{1105}\u{116D}\u{11BE}", - nfkc: "\u{B8E3}", - nfkd: "\u{1105}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{B8E4}", - nfc: "\u{B8E4}", - nfd: "\u{1105}\u{116D}\u{11BF}", - nfkc: "\u{B8E4}", - nfkd: "\u{1105}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{B8E5}", - nfc: "\u{B8E5}", - nfd: "\u{1105}\u{116D}\u{11C0}", - nfkc: "\u{B8E5}", - nfkd: "\u{1105}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{B8E6}", - nfc: "\u{B8E6}", - nfd: "\u{1105}\u{116D}\u{11C1}", - nfkc: "\u{B8E6}", - nfkd: "\u{1105}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{B8E7}", - nfc: "\u{B8E7}", - nfd: "\u{1105}\u{116D}\u{11C2}", - nfkc: "\u{B8E7}", - nfkd: "\u{1105}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{B8E8}", - nfc: "\u{B8E8}", - nfd: "\u{1105}\u{116E}", - nfkc: "\u{B8E8}", - nfkd: "\u{1105}\u{116E}", - }, - NormalizationTest { - source: "\u{B8E9}", - nfc: "\u{B8E9}", - nfd: "\u{1105}\u{116E}\u{11A8}", - nfkc: "\u{B8E9}", - nfkd: "\u{1105}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{B8EA}", - nfc: "\u{B8EA}", - nfd: "\u{1105}\u{116E}\u{11A9}", - nfkc: "\u{B8EA}", - nfkd: "\u{1105}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{B8EB}", - nfc: "\u{B8EB}", - nfd: "\u{1105}\u{116E}\u{11AA}", - nfkc: "\u{B8EB}", - nfkd: "\u{1105}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{B8EC}", - nfc: "\u{B8EC}", - nfd: "\u{1105}\u{116E}\u{11AB}", - nfkc: "\u{B8EC}", - nfkd: "\u{1105}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{B8ED}", - nfc: "\u{B8ED}", - nfd: "\u{1105}\u{116E}\u{11AC}", - nfkc: "\u{B8ED}", - nfkd: "\u{1105}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{B8EE}", - nfc: "\u{B8EE}", - nfd: "\u{1105}\u{116E}\u{11AD}", - nfkc: "\u{B8EE}", - nfkd: "\u{1105}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{B8EF}", - nfc: "\u{B8EF}", - nfd: "\u{1105}\u{116E}\u{11AE}", - nfkc: "\u{B8EF}", - nfkd: "\u{1105}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{B8F0}", - nfc: "\u{B8F0}", - nfd: "\u{1105}\u{116E}\u{11AF}", - nfkc: "\u{B8F0}", - nfkd: "\u{1105}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{B8F1}", - nfc: "\u{B8F1}", - nfd: "\u{1105}\u{116E}\u{11B0}", - nfkc: "\u{B8F1}", - nfkd: "\u{1105}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{B8F2}", - nfc: "\u{B8F2}", - nfd: "\u{1105}\u{116E}\u{11B1}", - nfkc: "\u{B8F2}", - nfkd: "\u{1105}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{B8F3}", - nfc: "\u{B8F3}", - nfd: "\u{1105}\u{116E}\u{11B2}", - nfkc: "\u{B8F3}", - nfkd: "\u{1105}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{B8F4}", - nfc: "\u{B8F4}", - nfd: "\u{1105}\u{116E}\u{11B3}", - nfkc: "\u{B8F4}", - nfkd: "\u{1105}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{B8F5}", - nfc: "\u{B8F5}", - nfd: "\u{1105}\u{116E}\u{11B4}", - nfkc: "\u{B8F5}", - nfkd: "\u{1105}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{B8F6}", - nfc: "\u{B8F6}", - nfd: "\u{1105}\u{116E}\u{11B5}", - nfkc: "\u{B8F6}", - nfkd: "\u{1105}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{B8F7}", - nfc: "\u{B8F7}", - nfd: "\u{1105}\u{116E}\u{11B6}", - nfkc: "\u{B8F7}", - nfkd: "\u{1105}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{B8F8}", - nfc: "\u{B8F8}", - nfd: "\u{1105}\u{116E}\u{11B7}", - nfkc: "\u{B8F8}", - nfkd: "\u{1105}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{B8F9}", - nfc: "\u{B8F9}", - nfd: "\u{1105}\u{116E}\u{11B8}", - nfkc: "\u{B8F9}", - nfkd: "\u{1105}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{B8FA}", - nfc: "\u{B8FA}", - nfd: "\u{1105}\u{116E}\u{11B9}", - nfkc: "\u{B8FA}", - nfkd: "\u{1105}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{B8FB}", - nfc: "\u{B8FB}", - nfd: "\u{1105}\u{116E}\u{11BA}", - nfkc: "\u{B8FB}", - nfkd: "\u{1105}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{B8FC}", - nfc: "\u{B8FC}", - nfd: "\u{1105}\u{116E}\u{11BB}", - nfkc: "\u{B8FC}", - nfkd: "\u{1105}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{B8FD}", - nfc: "\u{B8FD}", - nfd: "\u{1105}\u{116E}\u{11BC}", - nfkc: "\u{B8FD}", - nfkd: "\u{1105}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{B8FE}", - nfc: "\u{B8FE}", - nfd: "\u{1105}\u{116E}\u{11BD}", - nfkc: "\u{B8FE}", - nfkd: "\u{1105}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{B8FF}", - nfc: "\u{B8FF}", - nfd: "\u{1105}\u{116E}\u{11BE}", - nfkc: "\u{B8FF}", - nfkd: "\u{1105}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{B900}", - nfc: "\u{B900}", - nfd: "\u{1105}\u{116E}\u{11BF}", - nfkc: "\u{B900}", - nfkd: "\u{1105}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{B901}", - nfc: "\u{B901}", - nfd: "\u{1105}\u{116E}\u{11C0}", - nfkc: "\u{B901}", - nfkd: "\u{1105}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{B902}", - nfc: "\u{B902}", - nfd: "\u{1105}\u{116E}\u{11C1}", - nfkc: "\u{B902}", - nfkd: "\u{1105}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{B903}", - nfc: "\u{B903}", - nfd: "\u{1105}\u{116E}\u{11C2}", - nfkc: "\u{B903}", - nfkd: "\u{1105}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{B904}", - nfc: "\u{B904}", - nfd: "\u{1105}\u{116F}", - nfkc: "\u{B904}", - nfkd: "\u{1105}\u{116F}", - }, - NormalizationTest { - source: "\u{B905}", - nfc: "\u{B905}", - nfd: "\u{1105}\u{116F}\u{11A8}", - nfkc: "\u{B905}", - nfkd: "\u{1105}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{B906}", - nfc: "\u{B906}", - nfd: "\u{1105}\u{116F}\u{11A9}", - nfkc: "\u{B906}", - nfkd: "\u{1105}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{B907}", - nfc: "\u{B907}", - nfd: "\u{1105}\u{116F}\u{11AA}", - nfkc: "\u{B907}", - nfkd: "\u{1105}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{B908}", - nfc: "\u{B908}", - nfd: "\u{1105}\u{116F}\u{11AB}", - nfkc: "\u{B908}", - nfkd: "\u{1105}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{B909}", - nfc: "\u{B909}", - nfd: "\u{1105}\u{116F}\u{11AC}", - nfkc: "\u{B909}", - nfkd: "\u{1105}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{B90A}", - nfc: "\u{B90A}", - nfd: "\u{1105}\u{116F}\u{11AD}", - nfkc: "\u{B90A}", - nfkd: "\u{1105}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{B90B}", - nfc: "\u{B90B}", - nfd: "\u{1105}\u{116F}\u{11AE}", - nfkc: "\u{B90B}", - nfkd: "\u{1105}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{B90C}", - nfc: "\u{B90C}", - nfd: "\u{1105}\u{116F}\u{11AF}", - nfkc: "\u{B90C}", - nfkd: "\u{1105}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{B90D}", - nfc: "\u{B90D}", - nfd: "\u{1105}\u{116F}\u{11B0}", - nfkc: "\u{B90D}", - nfkd: "\u{1105}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{B90E}", - nfc: "\u{B90E}", - nfd: "\u{1105}\u{116F}\u{11B1}", - nfkc: "\u{B90E}", - nfkd: "\u{1105}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{B90F}", - nfc: "\u{B90F}", - nfd: "\u{1105}\u{116F}\u{11B2}", - nfkc: "\u{B90F}", - nfkd: "\u{1105}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{B910}", - nfc: "\u{B910}", - nfd: "\u{1105}\u{116F}\u{11B3}", - nfkc: "\u{B910}", - nfkd: "\u{1105}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{B911}", - nfc: "\u{B911}", - nfd: "\u{1105}\u{116F}\u{11B4}", - nfkc: "\u{B911}", - nfkd: "\u{1105}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{B912}", - nfc: "\u{B912}", - nfd: "\u{1105}\u{116F}\u{11B5}", - nfkc: "\u{B912}", - nfkd: "\u{1105}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{B913}", - nfc: "\u{B913}", - nfd: "\u{1105}\u{116F}\u{11B6}", - nfkc: "\u{B913}", - nfkd: "\u{1105}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{B914}", - nfc: "\u{B914}", - nfd: "\u{1105}\u{116F}\u{11B7}", - nfkc: "\u{B914}", - nfkd: "\u{1105}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{B915}", - nfc: "\u{B915}", - nfd: "\u{1105}\u{116F}\u{11B8}", - nfkc: "\u{B915}", - nfkd: "\u{1105}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{B916}", - nfc: "\u{B916}", - nfd: "\u{1105}\u{116F}\u{11B9}", - nfkc: "\u{B916}", - nfkd: "\u{1105}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{B917}", - nfc: "\u{B917}", - nfd: "\u{1105}\u{116F}\u{11BA}", - nfkc: "\u{B917}", - nfkd: "\u{1105}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{B918}", - nfc: "\u{B918}", - nfd: "\u{1105}\u{116F}\u{11BB}", - nfkc: "\u{B918}", - nfkd: "\u{1105}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{B919}", - nfc: "\u{B919}", - nfd: "\u{1105}\u{116F}\u{11BC}", - nfkc: "\u{B919}", - nfkd: "\u{1105}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{B91A}", - nfc: "\u{B91A}", - nfd: "\u{1105}\u{116F}\u{11BD}", - nfkc: "\u{B91A}", - nfkd: "\u{1105}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{B91B}", - nfc: "\u{B91B}", - nfd: "\u{1105}\u{116F}\u{11BE}", - nfkc: "\u{B91B}", - nfkd: "\u{1105}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{B91C}", - nfc: "\u{B91C}", - nfd: "\u{1105}\u{116F}\u{11BF}", - nfkc: "\u{B91C}", - nfkd: "\u{1105}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{B91D}", - nfc: "\u{B91D}", - nfd: "\u{1105}\u{116F}\u{11C0}", - nfkc: "\u{B91D}", - nfkd: "\u{1105}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{B91E}", - nfc: "\u{B91E}", - nfd: "\u{1105}\u{116F}\u{11C1}", - nfkc: "\u{B91E}", - nfkd: "\u{1105}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{B91F}", - nfc: "\u{B91F}", - nfd: "\u{1105}\u{116F}\u{11C2}", - nfkc: "\u{B91F}", - nfkd: "\u{1105}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{B920}", - nfc: "\u{B920}", - nfd: "\u{1105}\u{1170}", - nfkc: "\u{B920}", - nfkd: "\u{1105}\u{1170}", - }, - NormalizationTest { - source: "\u{B921}", - nfc: "\u{B921}", - nfd: "\u{1105}\u{1170}\u{11A8}", - nfkc: "\u{B921}", - nfkd: "\u{1105}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{B922}", - nfc: "\u{B922}", - nfd: "\u{1105}\u{1170}\u{11A9}", - nfkc: "\u{B922}", - nfkd: "\u{1105}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{B923}", - nfc: "\u{B923}", - nfd: "\u{1105}\u{1170}\u{11AA}", - nfkc: "\u{B923}", - nfkd: "\u{1105}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{B924}", - nfc: "\u{B924}", - nfd: "\u{1105}\u{1170}\u{11AB}", - nfkc: "\u{B924}", - nfkd: "\u{1105}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{B925}", - nfc: "\u{B925}", - nfd: "\u{1105}\u{1170}\u{11AC}", - nfkc: "\u{B925}", - nfkd: "\u{1105}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{B926}", - nfc: "\u{B926}", - nfd: "\u{1105}\u{1170}\u{11AD}", - nfkc: "\u{B926}", - nfkd: "\u{1105}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{B927}", - nfc: "\u{B927}", - nfd: "\u{1105}\u{1170}\u{11AE}", - nfkc: "\u{B927}", - nfkd: "\u{1105}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{B928}", - nfc: "\u{B928}", - nfd: "\u{1105}\u{1170}\u{11AF}", - nfkc: "\u{B928}", - nfkd: "\u{1105}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{B929}", - nfc: "\u{B929}", - nfd: "\u{1105}\u{1170}\u{11B0}", - nfkc: "\u{B929}", - nfkd: "\u{1105}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{B92A}", - nfc: "\u{B92A}", - nfd: "\u{1105}\u{1170}\u{11B1}", - nfkc: "\u{B92A}", - nfkd: "\u{1105}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{B92B}", - nfc: "\u{B92B}", - nfd: "\u{1105}\u{1170}\u{11B2}", - nfkc: "\u{B92B}", - nfkd: "\u{1105}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{B92C}", - nfc: "\u{B92C}", - nfd: "\u{1105}\u{1170}\u{11B3}", - nfkc: "\u{B92C}", - nfkd: "\u{1105}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{B92D}", - nfc: "\u{B92D}", - nfd: "\u{1105}\u{1170}\u{11B4}", - nfkc: "\u{B92D}", - nfkd: "\u{1105}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{B92E}", - nfc: "\u{B92E}", - nfd: "\u{1105}\u{1170}\u{11B5}", - nfkc: "\u{B92E}", - nfkd: "\u{1105}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{B92F}", - nfc: "\u{B92F}", - nfd: "\u{1105}\u{1170}\u{11B6}", - nfkc: "\u{B92F}", - nfkd: "\u{1105}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{B930}", - nfc: "\u{B930}", - nfd: "\u{1105}\u{1170}\u{11B7}", - nfkc: "\u{B930}", - nfkd: "\u{1105}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{B931}", - nfc: "\u{B931}", - nfd: "\u{1105}\u{1170}\u{11B8}", - nfkc: "\u{B931}", - nfkd: "\u{1105}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{B932}", - nfc: "\u{B932}", - nfd: "\u{1105}\u{1170}\u{11B9}", - nfkc: "\u{B932}", - nfkd: "\u{1105}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{B933}", - nfc: "\u{B933}", - nfd: "\u{1105}\u{1170}\u{11BA}", - nfkc: "\u{B933}", - nfkd: "\u{1105}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{B934}", - nfc: "\u{B934}", - nfd: "\u{1105}\u{1170}\u{11BB}", - nfkc: "\u{B934}", - nfkd: "\u{1105}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{B935}", - nfc: "\u{B935}", - nfd: "\u{1105}\u{1170}\u{11BC}", - nfkc: "\u{B935}", - nfkd: "\u{1105}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{B936}", - nfc: "\u{B936}", - nfd: "\u{1105}\u{1170}\u{11BD}", - nfkc: "\u{B936}", - nfkd: "\u{1105}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{B937}", - nfc: "\u{B937}", - nfd: "\u{1105}\u{1170}\u{11BE}", - nfkc: "\u{B937}", - nfkd: "\u{1105}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{B938}", - nfc: "\u{B938}", - nfd: "\u{1105}\u{1170}\u{11BF}", - nfkc: "\u{B938}", - nfkd: "\u{1105}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{B939}", - nfc: "\u{B939}", - nfd: "\u{1105}\u{1170}\u{11C0}", - nfkc: "\u{B939}", - nfkd: "\u{1105}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{B93A}", - nfc: "\u{B93A}", - nfd: "\u{1105}\u{1170}\u{11C1}", - nfkc: "\u{B93A}", - nfkd: "\u{1105}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{B93B}", - nfc: "\u{B93B}", - nfd: "\u{1105}\u{1170}\u{11C2}", - nfkc: "\u{B93B}", - nfkd: "\u{1105}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{B93C}", - nfc: "\u{B93C}", - nfd: "\u{1105}\u{1171}", - nfkc: "\u{B93C}", - nfkd: "\u{1105}\u{1171}", - }, - NormalizationTest { - source: "\u{B93D}", - nfc: "\u{B93D}", - nfd: "\u{1105}\u{1171}\u{11A8}", - nfkc: "\u{B93D}", - nfkd: "\u{1105}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{B93E}", - nfc: "\u{B93E}", - nfd: "\u{1105}\u{1171}\u{11A9}", - nfkc: "\u{B93E}", - nfkd: "\u{1105}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{B93F}", - nfc: "\u{B93F}", - nfd: "\u{1105}\u{1171}\u{11AA}", - nfkc: "\u{B93F}", - nfkd: "\u{1105}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{B940}", - nfc: "\u{B940}", - nfd: "\u{1105}\u{1171}\u{11AB}", - nfkc: "\u{B940}", - nfkd: "\u{1105}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{B941}", - nfc: "\u{B941}", - nfd: "\u{1105}\u{1171}\u{11AC}", - nfkc: "\u{B941}", - nfkd: "\u{1105}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{B942}", - nfc: "\u{B942}", - nfd: "\u{1105}\u{1171}\u{11AD}", - nfkc: "\u{B942}", - nfkd: "\u{1105}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{B943}", - nfc: "\u{B943}", - nfd: "\u{1105}\u{1171}\u{11AE}", - nfkc: "\u{B943}", - nfkd: "\u{1105}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{B944}", - nfc: "\u{B944}", - nfd: "\u{1105}\u{1171}\u{11AF}", - nfkc: "\u{B944}", - nfkd: "\u{1105}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{B945}", - nfc: "\u{B945}", - nfd: "\u{1105}\u{1171}\u{11B0}", - nfkc: "\u{B945}", - nfkd: "\u{1105}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{B946}", - nfc: "\u{B946}", - nfd: "\u{1105}\u{1171}\u{11B1}", - nfkc: "\u{B946}", - nfkd: "\u{1105}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{B947}", - nfc: "\u{B947}", - nfd: "\u{1105}\u{1171}\u{11B2}", - nfkc: "\u{B947}", - nfkd: "\u{1105}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{B948}", - nfc: "\u{B948}", - nfd: "\u{1105}\u{1171}\u{11B3}", - nfkc: "\u{B948}", - nfkd: "\u{1105}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{B949}", - nfc: "\u{B949}", - nfd: "\u{1105}\u{1171}\u{11B4}", - nfkc: "\u{B949}", - nfkd: "\u{1105}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{B94A}", - nfc: "\u{B94A}", - nfd: "\u{1105}\u{1171}\u{11B5}", - nfkc: "\u{B94A}", - nfkd: "\u{1105}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{B94B}", - nfc: "\u{B94B}", - nfd: "\u{1105}\u{1171}\u{11B6}", - nfkc: "\u{B94B}", - nfkd: "\u{1105}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{B94C}", - nfc: "\u{B94C}", - nfd: "\u{1105}\u{1171}\u{11B7}", - nfkc: "\u{B94C}", - nfkd: "\u{1105}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{B94D}", - nfc: "\u{B94D}", - nfd: "\u{1105}\u{1171}\u{11B8}", - nfkc: "\u{B94D}", - nfkd: "\u{1105}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{B94E}", - nfc: "\u{B94E}", - nfd: "\u{1105}\u{1171}\u{11B9}", - nfkc: "\u{B94E}", - nfkd: "\u{1105}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{B94F}", - nfc: "\u{B94F}", - nfd: "\u{1105}\u{1171}\u{11BA}", - nfkc: "\u{B94F}", - nfkd: "\u{1105}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{B950}", - nfc: "\u{B950}", - nfd: "\u{1105}\u{1171}\u{11BB}", - nfkc: "\u{B950}", - nfkd: "\u{1105}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{B951}", - nfc: "\u{B951}", - nfd: "\u{1105}\u{1171}\u{11BC}", - nfkc: "\u{B951}", - nfkd: "\u{1105}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{B952}", - nfc: "\u{B952}", - nfd: "\u{1105}\u{1171}\u{11BD}", - nfkc: "\u{B952}", - nfkd: "\u{1105}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{B953}", - nfc: "\u{B953}", - nfd: "\u{1105}\u{1171}\u{11BE}", - nfkc: "\u{B953}", - nfkd: "\u{1105}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{B954}", - nfc: "\u{B954}", - nfd: "\u{1105}\u{1171}\u{11BF}", - nfkc: "\u{B954}", - nfkd: "\u{1105}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{B955}", - nfc: "\u{B955}", - nfd: "\u{1105}\u{1171}\u{11C0}", - nfkc: "\u{B955}", - nfkd: "\u{1105}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{B956}", - nfc: "\u{B956}", - nfd: "\u{1105}\u{1171}\u{11C1}", - nfkc: "\u{B956}", - nfkd: "\u{1105}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{B957}", - nfc: "\u{B957}", - nfd: "\u{1105}\u{1171}\u{11C2}", - nfkc: "\u{B957}", - nfkd: "\u{1105}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{B958}", - nfc: "\u{B958}", - nfd: "\u{1105}\u{1172}", - nfkc: "\u{B958}", - nfkd: "\u{1105}\u{1172}", - }, - NormalizationTest { - source: "\u{B959}", - nfc: "\u{B959}", - nfd: "\u{1105}\u{1172}\u{11A8}", - nfkc: "\u{B959}", - nfkd: "\u{1105}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{B95A}", - nfc: "\u{B95A}", - nfd: "\u{1105}\u{1172}\u{11A9}", - nfkc: "\u{B95A}", - nfkd: "\u{1105}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{B95B}", - nfc: "\u{B95B}", - nfd: "\u{1105}\u{1172}\u{11AA}", - nfkc: "\u{B95B}", - nfkd: "\u{1105}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{B95C}", - nfc: "\u{B95C}", - nfd: "\u{1105}\u{1172}\u{11AB}", - nfkc: "\u{B95C}", - nfkd: "\u{1105}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{B95D}", - nfc: "\u{B95D}", - nfd: "\u{1105}\u{1172}\u{11AC}", - nfkc: "\u{B95D}", - nfkd: "\u{1105}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{B95E}", - nfc: "\u{B95E}", - nfd: "\u{1105}\u{1172}\u{11AD}", - nfkc: "\u{B95E}", - nfkd: "\u{1105}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{B95F}", - nfc: "\u{B95F}", - nfd: "\u{1105}\u{1172}\u{11AE}", - nfkc: "\u{B95F}", - nfkd: "\u{1105}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{B960}", - nfc: "\u{B960}", - nfd: "\u{1105}\u{1172}\u{11AF}", - nfkc: "\u{B960}", - nfkd: "\u{1105}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{B961}", - nfc: "\u{B961}", - nfd: "\u{1105}\u{1172}\u{11B0}", - nfkc: "\u{B961}", - nfkd: "\u{1105}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{B962}", - nfc: "\u{B962}", - nfd: "\u{1105}\u{1172}\u{11B1}", - nfkc: "\u{B962}", - nfkd: "\u{1105}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{B963}", - nfc: "\u{B963}", - nfd: "\u{1105}\u{1172}\u{11B2}", - nfkc: "\u{B963}", - nfkd: "\u{1105}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{B964}", - nfc: "\u{B964}", - nfd: "\u{1105}\u{1172}\u{11B3}", - nfkc: "\u{B964}", - nfkd: "\u{1105}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{B965}", - nfc: "\u{B965}", - nfd: "\u{1105}\u{1172}\u{11B4}", - nfkc: "\u{B965}", - nfkd: "\u{1105}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{B966}", - nfc: "\u{B966}", - nfd: "\u{1105}\u{1172}\u{11B5}", - nfkc: "\u{B966}", - nfkd: "\u{1105}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{B967}", - nfc: "\u{B967}", - nfd: "\u{1105}\u{1172}\u{11B6}", - nfkc: "\u{B967}", - nfkd: "\u{1105}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{B968}", - nfc: "\u{B968}", - nfd: "\u{1105}\u{1172}\u{11B7}", - nfkc: "\u{B968}", - nfkd: "\u{1105}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{B969}", - nfc: "\u{B969}", - nfd: "\u{1105}\u{1172}\u{11B8}", - nfkc: "\u{B969}", - nfkd: "\u{1105}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{B96A}", - nfc: "\u{B96A}", - nfd: "\u{1105}\u{1172}\u{11B9}", - nfkc: "\u{B96A}", - nfkd: "\u{1105}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{B96B}", - nfc: "\u{B96B}", - nfd: "\u{1105}\u{1172}\u{11BA}", - nfkc: "\u{B96B}", - nfkd: "\u{1105}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{B96C}", - nfc: "\u{B96C}", - nfd: "\u{1105}\u{1172}\u{11BB}", - nfkc: "\u{B96C}", - nfkd: "\u{1105}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{B96D}", - nfc: "\u{B96D}", - nfd: "\u{1105}\u{1172}\u{11BC}", - nfkc: "\u{B96D}", - nfkd: "\u{1105}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{B96E}", - nfc: "\u{B96E}", - nfd: "\u{1105}\u{1172}\u{11BD}", - nfkc: "\u{B96E}", - nfkd: "\u{1105}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{B96F}", - nfc: "\u{B96F}", - nfd: "\u{1105}\u{1172}\u{11BE}", - nfkc: "\u{B96F}", - nfkd: "\u{1105}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{B970}", - nfc: "\u{B970}", - nfd: "\u{1105}\u{1172}\u{11BF}", - nfkc: "\u{B970}", - nfkd: "\u{1105}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{B971}", - nfc: "\u{B971}", - nfd: "\u{1105}\u{1172}\u{11C0}", - nfkc: "\u{B971}", - nfkd: "\u{1105}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{B972}", - nfc: "\u{B972}", - nfd: "\u{1105}\u{1172}\u{11C1}", - nfkc: "\u{B972}", - nfkd: "\u{1105}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{B973}", - nfc: "\u{B973}", - nfd: "\u{1105}\u{1172}\u{11C2}", - nfkc: "\u{B973}", - nfkd: "\u{1105}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{B974}", - nfc: "\u{B974}", - nfd: "\u{1105}\u{1173}", - nfkc: "\u{B974}", - nfkd: "\u{1105}\u{1173}", - }, - NormalizationTest { - source: "\u{B975}", - nfc: "\u{B975}", - nfd: "\u{1105}\u{1173}\u{11A8}", - nfkc: "\u{B975}", - nfkd: "\u{1105}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{B976}", - nfc: "\u{B976}", - nfd: "\u{1105}\u{1173}\u{11A9}", - nfkc: "\u{B976}", - nfkd: "\u{1105}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{B977}", - nfc: "\u{B977}", - nfd: "\u{1105}\u{1173}\u{11AA}", - nfkc: "\u{B977}", - nfkd: "\u{1105}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{B978}", - nfc: "\u{B978}", - nfd: "\u{1105}\u{1173}\u{11AB}", - nfkc: "\u{B978}", - nfkd: "\u{1105}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{B979}", - nfc: "\u{B979}", - nfd: "\u{1105}\u{1173}\u{11AC}", - nfkc: "\u{B979}", - nfkd: "\u{1105}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{B97A}", - nfc: "\u{B97A}", - nfd: "\u{1105}\u{1173}\u{11AD}", - nfkc: "\u{B97A}", - nfkd: "\u{1105}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{B97B}", - nfc: "\u{B97B}", - nfd: "\u{1105}\u{1173}\u{11AE}", - nfkc: "\u{B97B}", - nfkd: "\u{1105}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{B97C}", - nfc: "\u{B97C}", - nfd: "\u{1105}\u{1173}\u{11AF}", - nfkc: "\u{B97C}", - nfkd: "\u{1105}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{B97D}", - nfc: "\u{B97D}", - nfd: "\u{1105}\u{1173}\u{11B0}", - nfkc: "\u{B97D}", - nfkd: "\u{1105}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{B97E}", - nfc: "\u{B97E}", - nfd: "\u{1105}\u{1173}\u{11B1}", - nfkc: "\u{B97E}", - nfkd: "\u{1105}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{B97F}", - nfc: "\u{B97F}", - nfd: "\u{1105}\u{1173}\u{11B2}", - nfkc: "\u{B97F}", - nfkd: "\u{1105}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{B980}", - nfc: "\u{B980}", - nfd: "\u{1105}\u{1173}\u{11B3}", - nfkc: "\u{B980}", - nfkd: "\u{1105}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{B981}", - nfc: "\u{B981}", - nfd: "\u{1105}\u{1173}\u{11B4}", - nfkc: "\u{B981}", - nfkd: "\u{1105}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{B982}", - nfc: "\u{B982}", - nfd: "\u{1105}\u{1173}\u{11B5}", - nfkc: "\u{B982}", - nfkd: "\u{1105}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{B983}", - nfc: "\u{B983}", - nfd: "\u{1105}\u{1173}\u{11B6}", - nfkc: "\u{B983}", - nfkd: "\u{1105}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{B984}", - nfc: "\u{B984}", - nfd: "\u{1105}\u{1173}\u{11B7}", - nfkc: "\u{B984}", - nfkd: "\u{1105}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{B985}", - nfc: "\u{B985}", - nfd: "\u{1105}\u{1173}\u{11B8}", - nfkc: "\u{B985}", - nfkd: "\u{1105}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{B986}", - nfc: "\u{B986}", - nfd: "\u{1105}\u{1173}\u{11B9}", - nfkc: "\u{B986}", - nfkd: "\u{1105}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{B987}", - nfc: "\u{B987}", - nfd: "\u{1105}\u{1173}\u{11BA}", - nfkc: "\u{B987}", - nfkd: "\u{1105}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{B988}", - nfc: "\u{B988}", - nfd: "\u{1105}\u{1173}\u{11BB}", - nfkc: "\u{B988}", - nfkd: "\u{1105}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{B989}", - nfc: "\u{B989}", - nfd: "\u{1105}\u{1173}\u{11BC}", - nfkc: "\u{B989}", - nfkd: "\u{1105}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{B98A}", - nfc: "\u{B98A}", - nfd: "\u{1105}\u{1173}\u{11BD}", - nfkc: "\u{B98A}", - nfkd: "\u{1105}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{B98B}", - nfc: "\u{B98B}", - nfd: "\u{1105}\u{1173}\u{11BE}", - nfkc: "\u{B98B}", - nfkd: "\u{1105}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{B98C}", - nfc: "\u{B98C}", - nfd: "\u{1105}\u{1173}\u{11BF}", - nfkc: "\u{B98C}", - nfkd: "\u{1105}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{B98D}", - nfc: "\u{B98D}", - nfd: "\u{1105}\u{1173}\u{11C0}", - nfkc: "\u{B98D}", - nfkd: "\u{1105}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{B98E}", - nfc: "\u{B98E}", - nfd: "\u{1105}\u{1173}\u{11C1}", - nfkc: "\u{B98E}", - nfkd: "\u{1105}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{B98F}", - nfc: "\u{B98F}", - nfd: "\u{1105}\u{1173}\u{11C2}", - nfkc: "\u{B98F}", - nfkd: "\u{1105}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{B990}", - nfc: "\u{B990}", - nfd: "\u{1105}\u{1174}", - nfkc: "\u{B990}", - nfkd: "\u{1105}\u{1174}", - }, - NormalizationTest { - source: "\u{B991}", - nfc: "\u{B991}", - nfd: "\u{1105}\u{1174}\u{11A8}", - nfkc: "\u{B991}", - nfkd: "\u{1105}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{B992}", - nfc: "\u{B992}", - nfd: "\u{1105}\u{1174}\u{11A9}", - nfkc: "\u{B992}", - nfkd: "\u{1105}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{B993}", - nfc: "\u{B993}", - nfd: "\u{1105}\u{1174}\u{11AA}", - nfkc: "\u{B993}", - nfkd: "\u{1105}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{B994}", - nfc: "\u{B994}", - nfd: "\u{1105}\u{1174}\u{11AB}", - nfkc: "\u{B994}", - nfkd: "\u{1105}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{B995}", - nfc: "\u{B995}", - nfd: "\u{1105}\u{1174}\u{11AC}", - nfkc: "\u{B995}", - nfkd: "\u{1105}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{B996}", - nfc: "\u{B996}", - nfd: "\u{1105}\u{1174}\u{11AD}", - nfkc: "\u{B996}", - nfkd: "\u{1105}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{B997}", - nfc: "\u{B997}", - nfd: "\u{1105}\u{1174}\u{11AE}", - nfkc: "\u{B997}", - nfkd: "\u{1105}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{B998}", - nfc: "\u{B998}", - nfd: "\u{1105}\u{1174}\u{11AF}", - nfkc: "\u{B998}", - nfkd: "\u{1105}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{B999}", - nfc: "\u{B999}", - nfd: "\u{1105}\u{1174}\u{11B0}", - nfkc: "\u{B999}", - nfkd: "\u{1105}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{B99A}", - nfc: "\u{B99A}", - nfd: "\u{1105}\u{1174}\u{11B1}", - nfkc: "\u{B99A}", - nfkd: "\u{1105}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{B99B}", - nfc: "\u{B99B}", - nfd: "\u{1105}\u{1174}\u{11B2}", - nfkc: "\u{B99B}", - nfkd: "\u{1105}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{B99C}", - nfc: "\u{B99C}", - nfd: "\u{1105}\u{1174}\u{11B3}", - nfkc: "\u{B99C}", - nfkd: "\u{1105}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{B99D}", - nfc: "\u{B99D}", - nfd: "\u{1105}\u{1174}\u{11B4}", - nfkc: "\u{B99D}", - nfkd: "\u{1105}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{B99E}", - nfc: "\u{B99E}", - nfd: "\u{1105}\u{1174}\u{11B5}", - nfkc: "\u{B99E}", - nfkd: "\u{1105}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{B99F}", - nfc: "\u{B99F}", - nfd: "\u{1105}\u{1174}\u{11B6}", - nfkc: "\u{B99F}", - nfkd: "\u{1105}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{B9A0}", - nfc: "\u{B9A0}", - nfd: "\u{1105}\u{1174}\u{11B7}", - nfkc: "\u{B9A0}", - nfkd: "\u{1105}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{B9A1}", - nfc: "\u{B9A1}", - nfd: "\u{1105}\u{1174}\u{11B8}", - nfkc: "\u{B9A1}", - nfkd: "\u{1105}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{B9A2}", - nfc: "\u{B9A2}", - nfd: "\u{1105}\u{1174}\u{11B9}", - nfkc: "\u{B9A2}", - nfkd: "\u{1105}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{B9A3}", - nfc: "\u{B9A3}", - nfd: "\u{1105}\u{1174}\u{11BA}", - nfkc: "\u{B9A3}", - nfkd: "\u{1105}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{B9A4}", - nfc: "\u{B9A4}", - nfd: "\u{1105}\u{1174}\u{11BB}", - nfkc: "\u{B9A4}", - nfkd: "\u{1105}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{B9A5}", - nfc: "\u{B9A5}", - nfd: "\u{1105}\u{1174}\u{11BC}", - nfkc: "\u{B9A5}", - nfkd: "\u{1105}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{B9A6}", - nfc: "\u{B9A6}", - nfd: "\u{1105}\u{1174}\u{11BD}", - nfkc: "\u{B9A6}", - nfkd: "\u{1105}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{B9A7}", - nfc: "\u{B9A7}", - nfd: "\u{1105}\u{1174}\u{11BE}", - nfkc: "\u{B9A7}", - nfkd: "\u{1105}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{B9A8}", - nfc: "\u{B9A8}", - nfd: "\u{1105}\u{1174}\u{11BF}", - nfkc: "\u{B9A8}", - nfkd: "\u{1105}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{B9A9}", - nfc: "\u{B9A9}", - nfd: "\u{1105}\u{1174}\u{11C0}", - nfkc: "\u{B9A9}", - nfkd: "\u{1105}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{B9AA}", - nfc: "\u{B9AA}", - nfd: "\u{1105}\u{1174}\u{11C1}", - nfkc: "\u{B9AA}", - nfkd: "\u{1105}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{B9AB}", - nfc: "\u{B9AB}", - nfd: "\u{1105}\u{1174}\u{11C2}", - nfkc: "\u{B9AB}", - nfkd: "\u{1105}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{B9AC}", - nfc: "\u{B9AC}", - nfd: "\u{1105}\u{1175}", - nfkc: "\u{B9AC}", - nfkd: "\u{1105}\u{1175}", - }, - NormalizationTest { - source: "\u{B9AD}", - nfc: "\u{B9AD}", - nfd: "\u{1105}\u{1175}\u{11A8}", - nfkc: "\u{B9AD}", - nfkd: "\u{1105}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{B9AE}", - nfc: "\u{B9AE}", - nfd: "\u{1105}\u{1175}\u{11A9}", - nfkc: "\u{B9AE}", - nfkd: "\u{1105}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{B9AF}", - nfc: "\u{B9AF}", - nfd: "\u{1105}\u{1175}\u{11AA}", - nfkc: "\u{B9AF}", - nfkd: "\u{1105}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{B9B0}", - nfc: "\u{B9B0}", - nfd: "\u{1105}\u{1175}\u{11AB}", - nfkc: "\u{B9B0}", - nfkd: "\u{1105}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{B9B1}", - nfc: "\u{B9B1}", - nfd: "\u{1105}\u{1175}\u{11AC}", - nfkc: "\u{B9B1}", - nfkd: "\u{1105}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{B9B2}", - nfc: "\u{B9B2}", - nfd: "\u{1105}\u{1175}\u{11AD}", - nfkc: "\u{B9B2}", - nfkd: "\u{1105}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{B9B3}", - nfc: "\u{B9B3}", - nfd: "\u{1105}\u{1175}\u{11AE}", - nfkc: "\u{B9B3}", - nfkd: "\u{1105}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{B9B4}", - nfc: "\u{B9B4}", - nfd: "\u{1105}\u{1175}\u{11AF}", - nfkc: "\u{B9B4}", - nfkd: "\u{1105}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{B9B5}", - nfc: "\u{B9B5}", - nfd: "\u{1105}\u{1175}\u{11B0}", - nfkc: "\u{B9B5}", - nfkd: "\u{1105}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{B9B6}", - nfc: "\u{B9B6}", - nfd: "\u{1105}\u{1175}\u{11B1}", - nfkc: "\u{B9B6}", - nfkd: "\u{1105}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{B9B7}", - nfc: "\u{B9B7}", - nfd: "\u{1105}\u{1175}\u{11B2}", - nfkc: "\u{B9B7}", - nfkd: "\u{1105}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{B9B8}", - nfc: "\u{B9B8}", - nfd: "\u{1105}\u{1175}\u{11B3}", - nfkc: "\u{B9B8}", - nfkd: "\u{1105}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{B9B9}", - nfc: "\u{B9B9}", - nfd: "\u{1105}\u{1175}\u{11B4}", - nfkc: "\u{B9B9}", - nfkd: "\u{1105}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{B9BA}", - nfc: "\u{B9BA}", - nfd: "\u{1105}\u{1175}\u{11B5}", - nfkc: "\u{B9BA}", - nfkd: "\u{1105}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{B9BB}", - nfc: "\u{B9BB}", - nfd: "\u{1105}\u{1175}\u{11B6}", - nfkc: "\u{B9BB}", - nfkd: "\u{1105}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{B9BC}", - nfc: "\u{B9BC}", - nfd: "\u{1105}\u{1175}\u{11B7}", - nfkc: "\u{B9BC}", - nfkd: "\u{1105}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{B9BD}", - nfc: "\u{B9BD}", - nfd: "\u{1105}\u{1175}\u{11B8}", - nfkc: "\u{B9BD}", - nfkd: "\u{1105}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{B9BE}", - nfc: "\u{B9BE}", - nfd: "\u{1105}\u{1175}\u{11B9}", - nfkc: "\u{B9BE}", - nfkd: "\u{1105}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{B9BF}", - nfc: "\u{B9BF}", - nfd: "\u{1105}\u{1175}\u{11BA}", - nfkc: "\u{B9BF}", - nfkd: "\u{1105}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{B9C0}", - nfc: "\u{B9C0}", - nfd: "\u{1105}\u{1175}\u{11BB}", - nfkc: "\u{B9C0}", - nfkd: "\u{1105}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{B9C1}", - nfc: "\u{B9C1}", - nfd: "\u{1105}\u{1175}\u{11BC}", - nfkc: "\u{B9C1}", - nfkd: "\u{1105}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{B9C2}", - nfc: "\u{B9C2}", - nfd: "\u{1105}\u{1175}\u{11BD}", - nfkc: "\u{B9C2}", - nfkd: "\u{1105}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{B9C3}", - nfc: "\u{B9C3}", - nfd: "\u{1105}\u{1175}\u{11BE}", - nfkc: "\u{B9C3}", - nfkd: "\u{1105}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{B9C4}", - nfc: "\u{B9C4}", - nfd: "\u{1105}\u{1175}\u{11BF}", - nfkc: "\u{B9C4}", - nfkd: "\u{1105}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{B9C5}", - nfc: "\u{B9C5}", - nfd: "\u{1105}\u{1175}\u{11C0}", - nfkc: "\u{B9C5}", - nfkd: "\u{1105}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{B9C6}", - nfc: "\u{B9C6}", - nfd: "\u{1105}\u{1175}\u{11C1}", - nfkc: "\u{B9C6}", - nfkd: "\u{1105}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{B9C7}", - nfc: "\u{B9C7}", - nfd: "\u{1105}\u{1175}\u{11C2}", - nfkc: "\u{B9C7}", - nfkd: "\u{1105}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{B9C8}", - nfc: "\u{B9C8}", - nfd: "\u{1106}\u{1161}", - nfkc: "\u{B9C8}", - nfkd: "\u{1106}\u{1161}", - }, - NormalizationTest { - source: "\u{B9C9}", - nfc: "\u{B9C9}", - nfd: "\u{1106}\u{1161}\u{11A8}", - nfkc: "\u{B9C9}", - nfkd: "\u{1106}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{B9CA}", - nfc: "\u{B9CA}", - nfd: "\u{1106}\u{1161}\u{11A9}", - nfkc: "\u{B9CA}", - nfkd: "\u{1106}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{B9CB}", - nfc: "\u{B9CB}", - nfd: "\u{1106}\u{1161}\u{11AA}", - nfkc: "\u{B9CB}", - nfkd: "\u{1106}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{B9CC}", - nfc: "\u{B9CC}", - nfd: "\u{1106}\u{1161}\u{11AB}", - nfkc: "\u{B9CC}", - nfkd: "\u{1106}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{B9CD}", - nfc: "\u{B9CD}", - nfd: "\u{1106}\u{1161}\u{11AC}", - nfkc: "\u{B9CD}", - nfkd: "\u{1106}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{B9CE}", - nfc: "\u{B9CE}", - nfd: "\u{1106}\u{1161}\u{11AD}", - nfkc: "\u{B9CE}", - nfkd: "\u{1106}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{B9CF}", - nfc: "\u{B9CF}", - nfd: "\u{1106}\u{1161}\u{11AE}", - nfkc: "\u{B9CF}", - nfkd: "\u{1106}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{B9D0}", - nfc: "\u{B9D0}", - nfd: "\u{1106}\u{1161}\u{11AF}", - nfkc: "\u{B9D0}", - nfkd: "\u{1106}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{B9D1}", - nfc: "\u{B9D1}", - nfd: "\u{1106}\u{1161}\u{11B0}", - nfkc: "\u{B9D1}", - nfkd: "\u{1106}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{B9D2}", - nfc: "\u{B9D2}", - nfd: "\u{1106}\u{1161}\u{11B1}", - nfkc: "\u{B9D2}", - nfkd: "\u{1106}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{B9D3}", - nfc: "\u{B9D3}", - nfd: "\u{1106}\u{1161}\u{11B2}", - nfkc: "\u{B9D3}", - nfkd: "\u{1106}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{B9D4}", - nfc: "\u{B9D4}", - nfd: "\u{1106}\u{1161}\u{11B3}", - nfkc: "\u{B9D4}", - nfkd: "\u{1106}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{B9D5}", - nfc: "\u{B9D5}", - nfd: "\u{1106}\u{1161}\u{11B4}", - nfkc: "\u{B9D5}", - nfkd: "\u{1106}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{B9D6}", - nfc: "\u{B9D6}", - nfd: "\u{1106}\u{1161}\u{11B5}", - nfkc: "\u{B9D6}", - nfkd: "\u{1106}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{B9D7}", - nfc: "\u{B9D7}", - nfd: "\u{1106}\u{1161}\u{11B6}", - nfkc: "\u{B9D7}", - nfkd: "\u{1106}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{B9D8}", - nfc: "\u{B9D8}", - nfd: "\u{1106}\u{1161}\u{11B7}", - nfkc: "\u{B9D8}", - nfkd: "\u{1106}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{B9D9}", - nfc: "\u{B9D9}", - nfd: "\u{1106}\u{1161}\u{11B8}", - nfkc: "\u{B9D9}", - nfkd: "\u{1106}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{B9DA}", - nfc: "\u{B9DA}", - nfd: "\u{1106}\u{1161}\u{11B9}", - nfkc: "\u{B9DA}", - nfkd: "\u{1106}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{B9DB}", - nfc: "\u{B9DB}", - nfd: "\u{1106}\u{1161}\u{11BA}", - nfkc: "\u{B9DB}", - nfkd: "\u{1106}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{B9DC}", - nfc: "\u{B9DC}", - nfd: "\u{1106}\u{1161}\u{11BB}", - nfkc: "\u{B9DC}", - nfkd: "\u{1106}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{B9DD}", - nfc: "\u{B9DD}", - nfd: "\u{1106}\u{1161}\u{11BC}", - nfkc: "\u{B9DD}", - nfkd: "\u{1106}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{B9DE}", - nfc: "\u{B9DE}", - nfd: "\u{1106}\u{1161}\u{11BD}", - nfkc: "\u{B9DE}", - nfkd: "\u{1106}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{B9DF}", - nfc: "\u{B9DF}", - nfd: "\u{1106}\u{1161}\u{11BE}", - nfkc: "\u{B9DF}", - nfkd: "\u{1106}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{B9E0}", - nfc: "\u{B9E0}", - nfd: "\u{1106}\u{1161}\u{11BF}", - nfkc: "\u{B9E0}", - nfkd: "\u{1106}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{B9E1}", - nfc: "\u{B9E1}", - nfd: "\u{1106}\u{1161}\u{11C0}", - nfkc: "\u{B9E1}", - nfkd: "\u{1106}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{B9E2}", - nfc: "\u{B9E2}", - nfd: "\u{1106}\u{1161}\u{11C1}", - nfkc: "\u{B9E2}", - nfkd: "\u{1106}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{B9E3}", - nfc: "\u{B9E3}", - nfd: "\u{1106}\u{1161}\u{11C2}", - nfkc: "\u{B9E3}", - nfkd: "\u{1106}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{B9E4}", - nfc: "\u{B9E4}", - nfd: "\u{1106}\u{1162}", - nfkc: "\u{B9E4}", - nfkd: "\u{1106}\u{1162}", - }, - NormalizationTest { - source: "\u{B9E5}", - nfc: "\u{B9E5}", - nfd: "\u{1106}\u{1162}\u{11A8}", - nfkc: "\u{B9E5}", - nfkd: "\u{1106}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{B9E6}", - nfc: "\u{B9E6}", - nfd: "\u{1106}\u{1162}\u{11A9}", - nfkc: "\u{B9E6}", - nfkd: "\u{1106}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{B9E7}", - nfc: "\u{B9E7}", - nfd: "\u{1106}\u{1162}\u{11AA}", - nfkc: "\u{B9E7}", - nfkd: "\u{1106}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{B9E8}", - nfc: "\u{B9E8}", - nfd: "\u{1106}\u{1162}\u{11AB}", - nfkc: "\u{B9E8}", - nfkd: "\u{1106}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{B9E9}", - nfc: "\u{B9E9}", - nfd: "\u{1106}\u{1162}\u{11AC}", - nfkc: "\u{B9E9}", - nfkd: "\u{1106}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{B9EA}", - nfc: "\u{B9EA}", - nfd: "\u{1106}\u{1162}\u{11AD}", - nfkc: "\u{B9EA}", - nfkd: "\u{1106}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{B9EB}", - nfc: "\u{B9EB}", - nfd: "\u{1106}\u{1162}\u{11AE}", - nfkc: "\u{B9EB}", - nfkd: "\u{1106}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{B9EC}", - nfc: "\u{B9EC}", - nfd: "\u{1106}\u{1162}\u{11AF}", - nfkc: "\u{B9EC}", - nfkd: "\u{1106}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{B9ED}", - nfc: "\u{B9ED}", - nfd: "\u{1106}\u{1162}\u{11B0}", - nfkc: "\u{B9ED}", - nfkd: "\u{1106}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{B9EE}", - nfc: "\u{B9EE}", - nfd: "\u{1106}\u{1162}\u{11B1}", - nfkc: "\u{B9EE}", - nfkd: "\u{1106}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{B9EF}", - nfc: "\u{B9EF}", - nfd: "\u{1106}\u{1162}\u{11B2}", - nfkc: "\u{B9EF}", - nfkd: "\u{1106}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{B9F0}", - nfc: "\u{B9F0}", - nfd: "\u{1106}\u{1162}\u{11B3}", - nfkc: "\u{B9F0}", - nfkd: "\u{1106}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{B9F1}", - nfc: "\u{B9F1}", - nfd: "\u{1106}\u{1162}\u{11B4}", - nfkc: "\u{B9F1}", - nfkd: "\u{1106}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{B9F2}", - nfc: "\u{B9F2}", - nfd: "\u{1106}\u{1162}\u{11B5}", - nfkc: "\u{B9F2}", - nfkd: "\u{1106}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{B9F3}", - nfc: "\u{B9F3}", - nfd: "\u{1106}\u{1162}\u{11B6}", - nfkc: "\u{B9F3}", - nfkd: "\u{1106}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{B9F4}", - nfc: "\u{B9F4}", - nfd: "\u{1106}\u{1162}\u{11B7}", - nfkc: "\u{B9F4}", - nfkd: "\u{1106}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{B9F5}", - nfc: "\u{B9F5}", - nfd: "\u{1106}\u{1162}\u{11B8}", - nfkc: "\u{B9F5}", - nfkd: "\u{1106}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{B9F6}", - nfc: "\u{B9F6}", - nfd: "\u{1106}\u{1162}\u{11B9}", - nfkc: "\u{B9F6}", - nfkd: "\u{1106}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{B9F7}", - nfc: "\u{B9F7}", - nfd: "\u{1106}\u{1162}\u{11BA}", - nfkc: "\u{B9F7}", - nfkd: "\u{1106}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{B9F8}", - nfc: "\u{B9F8}", - nfd: "\u{1106}\u{1162}\u{11BB}", - nfkc: "\u{B9F8}", - nfkd: "\u{1106}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{B9F9}", - nfc: "\u{B9F9}", - nfd: "\u{1106}\u{1162}\u{11BC}", - nfkc: "\u{B9F9}", - nfkd: "\u{1106}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{B9FA}", - nfc: "\u{B9FA}", - nfd: "\u{1106}\u{1162}\u{11BD}", - nfkc: "\u{B9FA}", - nfkd: "\u{1106}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{B9FB}", - nfc: "\u{B9FB}", - nfd: "\u{1106}\u{1162}\u{11BE}", - nfkc: "\u{B9FB}", - nfkd: "\u{1106}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{B9FC}", - nfc: "\u{B9FC}", - nfd: "\u{1106}\u{1162}\u{11BF}", - nfkc: "\u{B9FC}", - nfkd: "\u{1106}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{B9FD}", - nfc: "\u{B9FD}", - nfd: "\u{1106}\u{1162}\u{11C0}", - nfkc: "\u{B9FD}", - nfkd: "\u{1106}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{B9FE}", - nfc: "\u{B9FE}", - nfd: "\u{1106}\u{1162}\u{11C1}", - nfkc: "\u{B9FE}", - nfkd: "\u{1106}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{B9FF}", - nfc: "\u{B9FF}", - nfd: "\u{1106}\u{1162}\u{11C2}", - nfkc: "\u{B9FF}", - nfkd: "\u{1106}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{BA00}", - nfc: "\u{BA00}", - nfd: "\u{1106}\u{1163}", - nfkc: "\u{BA00}", - nfkd: "\u{1106}\u{1163}", - }, - NormalizationTest { - source: "\u{BA01}", - nfc: "\u{BA01}", - nfd: "\u{1106}\u{1163}\u{11A8}", - nfkc: "\u{BA01}", - nfkd: "\u{1106}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{BA02}", - nfc: "\u{BA02}", - nfd: "\u{1106}\u{1163}\u{11A9}", - nfkc: "\u{BA02}", - nfkd: "\u{1106}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{BA03}", - nfc: "\u{BA03}", - nfd: "\u{1106}\u{1163}\u{11AA}", - nfkc: "\u{BA03}", - nfkd: "\u{1106}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{BA04}", - nfc: "\u{BA04}", - nfd: "\u{1106}\u{1163}\u{11AB}", - nfkc: "\u{BA04}", - nfkd: "\u{1106}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{BA05}", - nfc: "\u{BA05}", - nfd: "\u{1106}\u{1163}\u{11AC}", - nfkc: "\u{BA05}", - nfkd: "\u{1106}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{BA06}", - nfc: "\u{BA06}", - nfd: "\u{1106}\u{1163}\u{11AD}", - nfkc: "\u{BA06}", - nfkd: "\u{1106}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{BA07}", - nfc: "\u{BA07}", - nfd: "\u{1106}\u{1163}\u{11AE}", - nfkc: "\u{BA07}", - nfkd: "\u{1106}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{BA08}", - nfc: "\u{BA08}", - nfd: "\u{1106}\u{1163}\u{11AF}", - nfkc: "\u{BA08}", - nfkd: "\u{1106}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{BA09}", - nfc: "\u{BA09}", - nfd: "\u{1106}\u{1163}\u{11B0}", - nfkc: "\u{BA09}", - nfkd: "\u{1106}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{BA0A}", - nfc: "\u{BA0A}", - nfd: "\u{1106}\u{1163}\u{11B1}", - nfkc: "\u{BA0A}", - nfkd: "\u{1106}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{BA0B}", - nfc: "\u{BA0B}", - nfd: "\u{1106}\u{1163}\u{11B2}", - nfkc: "\u{BA0B}", - nfkd: "\u{1106}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{BA0C}", - nfc: "\u{BA0C}", - nfd: "\u{1106}\u{1163}\u{11B3}", - nfkc: "\u{BA0C}", - nfkd: "\u{1106}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{BA0D}", - nfc: "\u{BA0D}", - nfd: "\u{1106}\u{1163}\u{11B4}", - nfkc: "\u{BA0D}", - nfkd: "\u{1106}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{BA0E}", - nfc: "\u{BA0E}", - nfd: "\u{1106}\u{1163}\u{11B5}", - nfkc: "\u{BA0E}", - nfkd: "\u{1106}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{BA0F}", - nfc: "\u{BA0F}", - nfd: "\u{1106}\u{1163}\u{11B6}", - nfkc: "\u{BA0F}", - nfkd: "\u{1106}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{BA10}", - nfc: "\u{BA10}", - nfd: "\u{1106}\u{1163}\u{11B7}", - nfkc: "\u{BA10}", - nfkd: "\u{1106}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{BA11}", - nfc: "\u{BA11}", - nfd: "\u{1106}\u{1163}\u{11B8}", - nfkc: "\u{BA11}", - nfkd: "\u{1106}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{BA12}", - nfc: "\u{BA12}", - nfd: "\u{1106}\u{1163}\u{11B9}", - nfkc: "\u{BA12}", - nfkd: "\u{1106}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{BA13}", - nfc: "\u{BA13}", - nfd: "\u{1106}\u{1163}\u{11BA}", - nfkc: "\u{BA13}", - nfkd: "\u{1106}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{BA14}", - nfc: "\u{BA14}", - nfd: "\u{1106}\u{1163}\u{11BB}", - nfkc: "\u{BA14}", - nfkd: "\u{1106}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{BA15}", - nfc: "\u{BA15}", - nfd: "\u{1106}\u{1163}\u{11BC}", - nfkc: "\u{BA15}", - nfkd: "\u{1106}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{BA16}", - nfc: "\u{BA16}", - nfd: "\u{1106}\u{1163}\u{11BD}", - nfkc: "\u{BA16}", - nfkd: "\u{1106}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{BA17}", - nfc: "\u{BA17}", - nfd: "\u{1106}\u{1163}\u{11BE}", - nfkc: "\u{BA17}", - nfkd: "\u{1106}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{BA18}", - nfc: "\u{BA18}", - nfd: "\u{1106}\u{1163}\u{11BF}", - nfkc: "\u{BA18}", - nfkd: "\u{1106}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{BA19}", - nfc: "\u{BA19}", - nfd: "\u{1106}\u{1163}\u{11C0}", - nfkc: "\u{BA19}", - nfkd: "\u{1106}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{BA1A}", - nfc: "\u{BA1A}", - nfd: "\u{1106}\u{1163}\u{11C1}", - nfkc: "\u{BA1A}", - nfkd: "\u{1106}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{BA1B}", - nfc: "\u{BA1B}", - nfd: "\u{1106}\u{1163}\u{11C2}", - nfkc: "\u{BA1B}", - nfkd: "\u{1106}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{BA1C}", - nfc: "\u{BA1C}", - nfd: "\u{1106}\u{1164}", - nfkc: "\u{BA1C}", - nfkd: "\u{1106}\u{1164}", - }, - NormalizationTest { - source: "\u{BA1D}", - nfc: "\u{BA1D}", - nfd: "\u{1106}\u{1164}\u{11A8}", - nfkc: "\u{BA1D}", - nfkd: "\u{1106}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{BA1E}", - nfc: "\u{BA1E}", - nfd: "\u{1106}\u{1164}\u{11A9}", - nfkc: "\u{BA1E}", - nfkd: "\u{1106}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{BA1F}", - nfc: "\u{BA1F}", - nfd: "\u{1106}\u{1164}\u{11AA}", - nfkc: "\u{BA1F}", - nfkd: "\u{1106}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{BA20}", - nfc: "\u{BA20}", - nfd: "\u{1106}\u{1164}\u{11AB}", - nfkc: "\u{BA20}", - nfkd: "\u{1106}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{BA21}", - nfc: "\u{BA21}", - nfd: "\u{1106}\u{1164}\u{11AC}", - nfkc: "\u{BA21}", - nfkd: "\u{1106}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{BA22}", - nfc: "\u{BA22}", - nfd: "\u{1106}\u{1164}\u{11AD}", - nfkc: "\u{BA22}", - nfkd: "\u{1106}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{BA23}", - nfc: "\u{BA23}", - nfd: "\u{1106}\u{1164}\u{11AE}", - nfkc: "\u{BA23}", - nfkd: "\u{1106}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{BA24}", - nfc: "\u{BA24}", - nfd: "\u{1106}\u{1164}\u{11AF}", - nfkc: "\u{BA24}", - nfkd: "\u{1106}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{BA25}", - nfc: "\u{BA25}", - nfd: "\u{1106}\u{1164}\u{11B0}", - nfkc: "\u{BA25}", - nfkd: "\u{1106}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{BA26}", - nfc: "\u{BA26}", - nfd: "\u{1106}\u{1164}\u{11B1}", - nfkc: "\u{BA26}", - nfkd: "\u{1106}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{BA27}", - nfc: "\u{BA27}", - nfd: "\u{1106}\u{1164}\u{11B2}", - nfkc: "\u{BA27}", - nfkd: "\u{1106}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{BA28}", - nfc: "\u{BA28}", - nfd: "\u{1106}\u{1164}\u{11B3}", - nfkc: "\u{BA28}", - nfkd: "\u{1106}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{BA29}", - nfc: "\u{BA29}", - nfd: "\u{1106}\u{1164}\u{11B4}", - nfkc: "\u{BA29}", - nfkd: "\u{1106}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{BA2A}", - nfc: "\u{BA2A}", - nfd: "\u{1106}\u{1164}\u{11B5}", - nfkc: "\u{BA2A}", - nfkd: "\u{1106}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{BA2B}", - nfc: "\u{BA2B}", - nfd: "\u{1106}\u{1164}\u{11B6}", - nfkc: "\u{BA2B}", - nfkd: "\u{1106}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{BA2C}", - nfc: "\u{BA2C}", - nfd: "\u{1106}\u{1164}\u{11B7}", - nfkc: "\u{BA2C}", - nfkd: "\u{1106}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{BA2D}", - nfc: "\u{BA2D}", - nfd: "\u{1106}\u{1164}\u{11B8}", - nfkc: "\u{BA2D}", - nfkd: "\u{1106}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{BA2E}", - nfc: "\u{BA2E}", - nfd: "\u{1106}\u{1164}\u{11B9}", - nfkc: "\u{BA2E}", - nfkd: "\u{1106}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{BA2F}", - nfc: "\u{BA2F}", - nfd: "\u{1106}\u{1164}\u{11BA}", - nfkc: "\u{BA2F}", - nfkd: "\u{1106}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{BA30}", - nfc: "\u{BA30}", - nfd: "\u{1106}\u{1164}\u{11BB}", - nfkc: "\u{BA30}", - nfkd: "\u{1106}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{BA31}", - nfc: "\u{BA31}", - nfd: "\u{1106}\u{1164}\u{11BC}", - nfkc: "\u{BA31}", - nfkd: "\u{1106}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{BA32}", - nfc: "\u{BA32}", - nfd: "\u{1106}\u{1164}\u{11BD}", - nfkc: "\u{BA32}", - nfkd: "\u{1106}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{BA33}", - nfc: "\u{BA33}", - nfd: "\u{1106}\u{1164}\u{11BE}", - nfkc: "\u{BA33}", - nfkd: "\u{1106}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{BA34}", - nfc: "\u{BA34}", - nfd: "\u{1106}\u{1164}\u{11BF}", - nfkc: "\u{BA34}", - nfkd: "\u{1106}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{BA35}", - nfc: "\u{BA35}", - nfd: "\u{1106}\u{1164}\u{11C0}", - nfkc: "\u{BA35}", - nfkd: "\u{1106}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{BA36}", - nfc: "\u{BA36}", - nfd: "\u{1106}\u{1164}\u{11C1}", - nfkc: "\u{BA36}", - nfkd: "\u{1106}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{BA37}", - nfc: "\u{BA37}", - nfd: "\u{1106}\u{1164}\u{11C2}", - nfkc: "\u{BA37}", - nfkd: "\u{1106}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{BA38}", - nfc: "\u{BA38}", - nfd: "\u{1106}\u{1165}", - nfkc: "\u{BA38}", - nfkd: "\u{1106}\u{1165}", - }, - NormalizationTest { - source: "\u{BA39}", - nfc: "\u{BA39}", - nfd: "\u{1106}\u{1165}\u{11A8}", - nfkc: "\u{BA39}", - nfkd: "\u{1106}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{BA3A}", - nfc: "\u{BA3A}", - nfd: "\u{1106}\u{1165}\u{11A9}", - nfkc: "\u{BA3A}", - nfkd: "\u{1106}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{BA3B}", - nfc: "\u{BA3B}", - nfd: "\u{1106}\u{1165}\u{11AA}", - nfkc: "\u{BA3B}", - nfkd: "\u{1106}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{BA3C}", - nfc: "\u{BA3C}", - nfd: "\u{1106}\u{1165}\u{11AB}", - nfkc: "\u{BA3C}", - nfkd: "\u{1106}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{BA3D}", - nfc: "\u{BA3D}", - nfd: "\u{1106}\u{1165}\u{11AC}", - nfkc: "\u{BA3D}", - nfkd: "\u{1106}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{BA3E}", - nfc: "\u{BA3E}", - nfd: "\u{1106}\u{1165}\u{11AD}", - nfkc: "\u{BA3E}", - nfkd: "\u{1106}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{BA3F}", - nfc: "\u{BA3F}", - nfd: "\u{1106}\u{1165}\u{11AE}", - nfkc: "\u{BA3F}", - nfkd: "\u{1106}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{BA40}", - nfc: "\u{BA40}", - nfd: "\u{1106}\u{1165}\u{11AF}", - nfkc: "\u{BA40}", - nfkd: "\u{1106}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{BA41}", - nfc: "\u{BA41}", - nfd: "\u{1106}\u{1165}\u{11B0}", - nfkc: "\u{BA41}", - nfkd: "\u{1106}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{BA42}", - nfc: "\u{BA42}", - nfd: "\u{1106}\u{1165}\u{11B1}", - nfkc: "\u{BA42}", - nfkd: "\u{1106}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{BA43}", - nfc: "\u{BA43}", - nfd: "\u{1106}\u{1165}\u{11B2}", - nfkc: "\u{BA43}", - nfkd: "\u{1106}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{BA44}", - nfc: "\u{BA44}", - nfd: "\u{1106}\u{1165}\u{11B3}", - nfkc: "\u{BA44}", - nfkd: "\u{1106}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{BA45}", - nfc: "\u{BA45}", - nfd: "\u{1106}\u{1165}\u{11B4}", - nfkc: "\u{BA45}", - nfkd: "\u{1106}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{BA46}", - nfc: "\u{BA46}", - nfd: "\u{1106}\u{1165}\u{11B5}", - nfkc: "\u{BA46}", - nfkd: "\u{1106}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{BA47}", - nfc: "\u{BA47}", - nfd: "\u{1106}\u{1165}\u{11B6}", - nfkc: "\u{BA47}", - nfkd: "\u{1106}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{BA48}", - nfc: "\u{BA48}", - nfd: "\u{1106}\u{1165}\u{11B7}", - nfkc: "\u{BA48}", - nfkd: "\u{1106}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{BA49}", - nfc: "\u{BA49}", - nfd: "\u{1106}\u{1165}\u{11B8}", - nfkc: "\u{BA49}", - nfkd: "\u{1106}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{BA4A}", - nfc: "\u{BA4A}", - nfd: "\u{1106}\u{1165}\u{11B9}", - nfkc: "\u{BA4A}", - nfkd: "\u{1106}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{BA4B}", - nfc: "\u{BA4B}", - nfd: "\u{1106}\u{1165}\u{11BA}", - nfkc: "\u{BA4B}", - nfkd: "\u{1106}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{BA4C}", - nfc: "\u{BA4C}", - nfd: "\u{1106}\u{1165}\u{11BB}", - nfkc: "\u{BA4C}", - nfkd: "\u{1106}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{BA4D}", - nfc: "\u{BA4D}", - nfd: "\u{1106}\u{1165}\u{11BC}", - nfkc: "\u{BA4D}", - nfkd: "\u{1106}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{BA4E}", - nfc: "\u{BA4E}", - nfd: "\u{1106}\u{1165}\u{11BD}", - nfkc: "\u{BA4E}", - nfkd: "\u{1106}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{BA4F}", - nfc: "\u{BA4F}", - nfd: "\u{1106}\u{1165}\u{11BE}", - nfkc: "\u{BA4F}", - nfkd: "\u{1106}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{BA50}", - nfc: "\u{BA50}", - nfd: "\u{1106}\u{1165}\u{11BF}", - nfkc: "\u{BA50}", - nfkd: "\u{1106}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{BA51}", - nfc: "\u{BA51}", - nfd: "\u{1106}\u{1165}\u{11C0}", - nfkc: "\u{BA51}", - nfkd: "\u{1106}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{BA52}", - nfc: "\u{BA52}", - nfd: "\u{1106}\u{1165}\u{11C1}", - nfkc: "\u{BA52}", - nfkd: "\u{1106}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{BA53}", - nfc: "\u{BA53}", - nfd: "\u{1106}\u{1165}\u{11C2}", - nfkc: "\u{BA53}", - nfkd: "\u{1106}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{BA54}", - nfc: "\u{BA54}", - nfd: "\u{1106}\u{1166}", - nfkc: "\u{BA54}", - nfkd: "\u{1106}\u{1166}", - }, - NormalizationTest { - source: "\u{BA55}", - nfc: "\u{BA55}", - nfd: "\u{1106}\u{1166}\u{11A8}", - nfkc: "\u{BA55}", - nfkd: "\u{1106}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{BA56}", - nfc: "\u{BA56}", - nfd: "\u{1106}\u{1166}\u{11A9}", - nfkc: "\u{BA56}", - nfkd: "\u{1106}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{BA57}", - nfc: "\u{BA57}", - nfd: "\u{1106}\u{1166}\u{11AA}", - nfkc: "\u{BA57}", - nfkd: "\u{1106}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{BA58}", - nfc: "\u{BA58}", - nfd: "\u{1106}\u{1166}\u{11AB}", - nfkc: "\u{BA58}", - nfkd: "\u{1106}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{BA59}", - nfc: "\u{BA59}", - nfd: "\u{1106}\u{1166}\u{11AC}", - nfkc: "\u{BA59}", - nfkd: "\u{1106}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{BA5A}", - nfc: "\u{BA5A}", - nfd: "\u{1106}\u{1166}\u{11AD}", - nfkc: "\u{BA5A}", - nfkd: "\u{1106}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{BA5B}", - nfc: "\u{BA5B}", - nfd: "\u{1106}\u{1166}\u{11AE}", - nfkc: "\u{BA5B}", - nfkd: "\u{1106}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{BA5C}", - nfc: "\u{BA5C}", - nfd: "\u{1106}\u{1166}\u{11AF}", - nfkc: "\u{BA5C}", - nfkd: "\u{1106}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{BA5D}", - nfc: "\u{BA5D}", - nfd: "\u{1106}\u{1166}\u{11B0}", - nfkc: "\u{BA5D}", - nfkd: "\u{1106}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{BA5E}", - nfc: "\u{BA5E}", - nfd: "\u{1106}\u{1166}\u{11B1}", - nfkc: "\u{BA5E}", - nfkd: "\u{1106}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{BA5F}", - nfc: "\u{BA5F}", - nfd: "\u{1106}\u{1166}\u{11B2}", - nfkc: "\u{BA5F}", - nfkd: "\u{1106}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{BA60}", - nfc: "\u{BA60}", - nfd: "\u{1106}\u{1166}\u{11B3}", - nfkc: "\u{BA60}", - nfkd: "\u{1106}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{BA61}", - nfc: "\u{BA61}", - nfd: "\u{1106}\u{1166}\u{11B4}", - nfkc: "\u{BA61}", - nfkd: "\u{1106}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{BA62}", - nfc: "\u{BA62}", - nfd: "\u{1106}\u{1166}\u{11B5}", - nfkc: "\u{BA62}", - nfkd: "\u{1106}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{BA63}", - nfc: "\u{BA63}", - nfd: "\u{1106}\u{1166}\u{11B6}", - nfkc: "\u{BA63}", - nfkd: "\u{1106}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{BA64}", - nfc: "\u{BA64}", - nfd: "\u{1106}\u{1166}\u{11B7}", - nfkc: "\u{BA64}", - nfkd: "\u{1106}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{BA65}", - nfc: "\u{BA65}", - nfd: "\u{1106}\u{1166}\u{11B8}", - nfkc: "\u{BA65}", - nfkd: "\u{1106}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{BA66}", - nfc: "\u{BA66}", - nfd: "\u{1106}\u{1166}\u{11B9}", - nfkc: "\u{BA66}", - nfkd: "\u{1106}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{BA67}", - nfc: "\u{BA67}", - nfd: "\u{1106}\u{1166}\u{11BA}", - nfkc: "\u{BA67}", - nfkd: "\u{1106}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{BA68}", - nfc: "\u{BA68}", - nfd: "\u{1106}\u{1166}\u{11BB}", - nfkc: "\u{BA68}", - nfkd: "\u{1106}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{BA69}", - nfc: "\u{BA69}", - nfd: "\u{1106}\u{1166}\u{11BC}", - nfkc: "\u{BA69}", - nfkd: "\u{1106}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{BA6A}", - nfc: "\u{BA6A}", - nfd: "\u{1106}\u{1166}\u{11BD}", - nfkc: "\u{BA6A}", - nfkd: "\u{1106}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{BA6B}", - nfc: "\u{BA6B}", - nfd: "\u{1106}\u{1166}\u{11BE}", - nfkc: "\u{BA6B}", - nfkd: "\u{1106}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{BA6C}", - nfc: "\u{BA6C}", - nfd: "\u{1106}\u{1166}\u{11BF}", - nfkc: "\u{BA6C}", - nfkd: "\u{1106}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{BA6D}", - nfc: "\u{BA6D}", - nfd: "\u{1106}\u{1166}\u{11C0}", - nfkc: "\u{BA6D}", - nfkd: "\u{1106}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{BA6E}", - nfc: "\u{BA6E}", - nfd: "\u{1106}\u{1166}\u{11C1}", - nfkc: "\u{BA6E}", - nfkd: "\u{1106}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{BA6F}", - nfc: "\u{BA6F}", - nfd: "\u{1106}\u{1166}\u{11C2}", - nfkc: "\u{BA6F}", - nfkd: "\u{1106}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{BA70}", - nfc: "\u{BA70}", - nfd: "\u{1106}\u{1167}", - nfkc: "\u{BA70}", - nfkd: "\u{1106}\u{1167}", - }, - NormalizationTest { - source: "\u{BA71}", - nfc: "\u{BA71}", - nfd: "\u{1106}\u{1167}\u{11A8}", - nfkc: "\u{BA71}", - nfkd: "\u{1106}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{BA72}", - nfc: "\u{BA72}", - nfd: "\u{1106}\u{1167}\u{11A9}", - nfkc: "\u{BA72}", - nfkd: "\u{1106}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{BA73}", - nfc: "\u{BA73}", - nfd: "\u{1106}\u{1167}\u{11AA}", - nfkc: "\u{BA73}", - nfkd: "\u{1106}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{BA74}", - nfc: "\u{BA74}", - nfd: "\u{1106}\u{1167}\u{11AB}", - nfkc: "\u{BA74}", - nfkd: "\u{1106}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{BA75}", - nfc: "\u{BA75}", - nfd: "\u{1106}\u{1167}\u{11AC}", - nfkc: "\u{BA75}", - nfkd: "\u{1106}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{BA76}", - nfc: "\u{BA76}", - nfd: "\u{1106}\u{1167}\u{11AD}", - nfkc: "\u{BA76}", - nfkd: "\u{1106}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{BA77}", - nfc: "\u{BA77}", - nfd: "\u{1106}\u{1167}\u{11AE}", - nfkc: "\u{BA77}", - nfkd: "\u{1106}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{BA78}", - nfc: "\u{BA78}", - nfd: "\u{1106}\u{1167}\u{11AF}", - nfkc: "\u{BA78}", - nfkd: "\u{1106}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{BA79}", - nfc: "\u{BA79}", - nfd: "\u{1106}\u{1167}\u{11B0}", - nfkc: "\u{BA79}", - nfkd: "\u{1106}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{BA7A}", - nfc: "\u{BA7A}", - nfd: "\u{1106}\u{1167}\u{11B1}", - nfkc: "\u{BA7A}", - nfkd: "\u{1106}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{BA7B}", - nfc: "\u{BA7B}", - nfd: "\u{1106}\u{1167}\u{11B2}", - nfkc: "\u{BA7B}", - nfkd: "\u{1106}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{BA7C}", - nfc: "\u{BA7C}", - nfd: "\u{1106}\u{1167}\u{11B3}", - nfkc: "\u{BA7C}", - nfkd: "\u{1106}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{BA7D}", - nfc: "\u{BA7D}", - nfd: "\u{1106}\u{1167}\u{11B4}", - nfkc: "\u{BA7D}", - nfkd: "\u{1106}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{BA7E}", - nfc: "\u{BA7E}", - nfd: "\u{1106}\u{1167}\u{11B5}", - nfkc: "\u{BA7E}", - nfkd: "\u{1106}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{BA7F}", - nfc: "\u{BA7F}", - nfd: "\u{1106}\u{1167}\u{11B6}", - nfkc: "\u{BA7F}", - nfkd: "\u{1106}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{BA80}", - nfc: "\u{BA80}", - nfd: "\u{1106}\u{1167}\u{11B7}", - nfkc: "\u{BA80}", - nfkd: "\u{1106}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{BA81}", - nfc: "\u{BA81}", - nfd: "\u{1106}\u{1167}\u{11B8}", - nfkc: "\u{BA81}", - nfkd: "\u{1106}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{BA82}", - nfc: "\u{BA82}", - nfd: "\u{1106}\u{1167}\u{11B9}", - nfkc: "\u{BA82}", - nfkd: "\u{1106}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{BA83}", - nfc: "\u{BA83}", - nfd: "\u{1106}\u{1167}\u{11BA}", - nfkc: "\u{BA83}", - nfkd: "\u{1106}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{BA84}", - nfc: "\u{BA84}", - nfd: "\u{1106}\u{1167}\u{11BB}", - nfkc: "\u{BA84}", - nfkd: "\u{1106}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{BA85}", - nfc: "\u{BA85}", - nfd: "\u{1106}\u{1167}\u{11BC}", - nfkc: "\u{BA85}", - nfkd: "\u{1106}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{BA86}", - nfc: "\u{BA86}", - nfd: "\u{1106}\u{1167}\u{11BD}", - nfkc: "\u{BA86}", - nfkd: "\u{1106}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{BA87}", - nfc: "\u{BA87}", - nfd: "\u{1106}\u{1167}\u{11BE}", - nfkc: "\u{BA87}", - nfkd: "\u{1106}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{BA88}", - nfc: "\u{BA88}", - nfd: "\u{1106}\u{1167}\u{11BF}", - nfkc: "\u{BA88}", - nfkd: "\u{1106}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{BA89}", - nfc: "\u{BA89}", - nfd: "\u{1106}\u{1167}\u{11C0}", - nfkc: "\u{BA89}", - nfkd: "\u{1106}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{BA8A}", - nfc: "\u{BA8A}", - nfd: "\u{1106}\u{1167}\u{11C1}", - nfkc: "\u{BA8A}", - nfkd: "\u{1106}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{BA8B}", - nfc: "\u{BA8B}", - nfd: "\u{1106}\u{1167}\u{11C2}", - nfkc: "\u{BA8B}", - nfkd: "\u{1106}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{BA8C}", - nfc: "\u{BA8C}", - nfd: "\u{1106}\u{1168}", - nfkc: "\u{BA8C}", - nfkd: "\u{1106}\u{1168}", - }, - NormalizationTest { - source: "\u{BA8D}", - nfc: "\u{BA8D}", - nfd: "\u{1106}\u{1168}\u{11A8}", - nfkc: "\u{BA8D}", - nfkd: "\u{1106}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{BA8E}", - nfc: "\u{BA8E}", - nfd: "\u{1106}\u{1168}\u{11A9}", - nfkc: "\u{BA8E}", - nfkd: "\u{1106}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{BA8F}", - nfc: "\u{BA8F}", - nfd: "\u{1106}\u{1168}\u{11AA}", - nfkc: "\u{BA8F}", - nfkd: "\u{1106}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{BA90}", - nfc: "\u{BA90}", - nfd: "\u{1106}\u{1168}\u{11AB}", - nfkc: "\u{BA90}", - nfkd: "\u{1106}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{BA91}", - nfc: "\u{BA91}", - nfd: "\u{1106}\u{1168}\u{11AC}", - nfkc: "\u{BA91}", - nfkd: "\u{1106}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{BA92}", - nfc: "\u{BA92}", - nfd: "\u{1106}\u{1168}\u{11AD}", - nfkc: "\u{BA92}", - nfkd: "\u{1106}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{BA93}", - nfc: "\u{BA93}", - nfd: "\u{1106}\u{1168}\u{11AE}", - nfkc: "\u{BA93}", - nfkd: "\u{1106}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{BA94}", - nfc: "\u{BA94}", - nfd: "\u{1106}\u{1168}\u{11AF}", - nfkc: "\u{BA94}", - nfkd: "\u{1106}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{BA95}", - nfc: "\u{BA95}", - nfd: "\u{1106}\u{1168}\u{11B0}", - nfkc: "\u{BA95}", - nfkd: "\u{1106}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{BA96}", - nfc: "\u{BA96}", - nfd: "\u{1106}\u{1168}\u{11B1}", - nfkc: "\u{BA96}", - nfkd: "\u{1106}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{BA97}", - nfc: "\u{BA97}", - nfd: "\u{1106}\u{1168}\u{11B2}", - nfkc: "\u{BA97}", - nfkd: "\u{1106}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{BA98}", - nfc: "\u{BA98}", - nfd: "\u{1106}\u{1168}\u{11B3}", - nfkc: "\u{BA98}", - nfkd: "\u{1106}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{BA99}", - nfc: "\u{BA99}", - nfd: "\u{1106}\u{1168}\u{11B4}", - nfkc: "\u{BA99}", - nfkd: "\u{1106}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{BA9A}", - nfc: "\u{BA9A}", - nfd: "\u{1106}\u{1168}\u{11B5}", - nfkc: "\u{BA9A}", - nfkd: "\u{1106}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{BA9B}", - nfc: "\u{BA9B}", - nfd: "\u{1106}\u{1168}\u{11B6}", - nfkc: "\u{BA9B}", - nfkd: "\u{1106}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{BA9C}", - nfc: "\u{BA9C}", - nfd: "\u{1106}\u{1168}\u{11B7}", - nfkc: "\u{BA9C}", - nfkd: "\u{1106}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{BA9D}", - nfc: "\u{BA9D}", - nfd: "\u{1106}\u{1168}\u{11B8}", - nfkc: "\u{BA9D}", - nfkd: "\u{1106}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{BA9E}", - nfc: "\u{BA9E}", - nfd: "\u{1106}\u{1168}\u{11B9}", - nfkc: "\u{BA9E}", - nfkd: "\u{1106}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{BA9F}", - nfc: "\u{BA9F}", - nfd: "\u{1106}\u{1168}\u{11BA}", - nfkc: "\u{BA9F}", - nfkd: "\u{1106}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{BAA0}", - nfc: "\u{BAA0}", - nfd: "\u{1106}\u{1168}\u{11BB}", - nfkc: "\u{BAA0}", - nfkd: "\u{1106}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{BAA1}", - nfc: "\u{BAA1}", - nfd: "\u{1106}\u{1168}\u{11BC}", - nfkc: "\u{BAA1}", - nfkd: "\u{1106}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{BAA2}", - nfc: "\u{BAA2}", - nfd: "\u{1106}\u{1168}\u{11BD}", - nfkc: "\u{BAA2}", - nfkd: "\u{1106}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{BAA3}", - nfc: "\u{BAA3}", - nfd: "\u{1106}\u{1168}\u{11BE}", - nfkc: "\u{BAA3}", - nfkd: "\u{1106}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{BAA4}", - nfc: "\u{BAA4}", - nfd: "\u{1106}\u{1168}\u{11BF}", - nfkc: "\u{BAA4}", - nfkd: "\u{1106}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{BAA5}", - nfc: "\u{BAA5}", - nfd: "\u{1106}\u{1168}\u{11C0}", - nfkc: "\u{BAA5}", - nfkd: "\u{1106}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{BAA6}", - nfc: "\u{BAA6}", - nfd: "\u{1106}\u{1168}\u{11C1}", - nfkc: "\u{BAA6}", - nfkd: "\u{1106}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{BAA7}", - nfc: "\u{BAA7}", - nfd: "\u{1106}\u{1168}\u{11C2}", - nfkc: "\u{BAA7}", - nfkd: "\u{1106}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{BAA8}", - nfc: "\u{BAA8}", - nfd: "\u{1106}\u{1169}", - nfkc: "\u{BAA8}", - nfkd: "\u{1106}\u{1169}", - }, - NormalizationTest { - source: "\u{BAA9}", - nfc: "\u{BAA9}", - nfd: "\u{1106}\u{1169}\u{11A8}", - nfkc: "\u{BAA9}", - nfkd: "\u{1106}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{BAAA}", - nfc: "\u{BAAA}", - nfd: "\u{1106}\u{1169}\u{11A9}", - nfkc: "\u{BAAA}", - nfkd: "\u{1106}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{BAAB}", - nfc: "\u{BAAB}", - nfd: "\u{1106}\u{1169}\u{11AA}", - nfkc: "\u{BAAB}", - nfkd: "\u{1106}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{BAAC}", - nfc: "\u{BAAC}", - nfd: "\u{1106}\u{1169}\u{11AB}", - nfkc: "\u{BAAC}", - nfkd: "\u{1106}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{BAAD}", - nfc: "\u{BAAD}", - nfd: "\u{1106}\u{1169}\u{11AC}", - nfkc: "\u{BAAD}", - nfkd: "\u{1106}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{BAAE}", - nfc: "\u{BAAE}", - nfd: "\u{1106}\u{1169}\u{11AD}", - nfkc: "\u{BAAE}", - nfkd: "\u{1106}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{BAAF}", - nfc: "\u{BAAF}", - nfd: "\u{1106}\u{1169}\u{11AE}", - nfkc: "\u{BAAF}", - nfkd: "\u{1106}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{BAB0}", - nfc: "\u{BAB0}", - nfd: "\u{1106}\u{1169}\u{11AF}", - nfkc: "\u{BAB0}", - nfkd: "\u{1106}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{BAB1}", - nfc: "\u{BAB1}", - nfd: "\u{1106}\u{1169}\u{11B0}", - nfkc: "\u{BAB1}", - nfkd: "\u{1106}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{BAB2}", - nfc: "\u{BAB2}", - nfd: "\u{1106}\u{1169}\u{11B1}", - nfkc: "\u{BAB2}", - nfkd: "\u{1106}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{BAB3}", - nfc: "\u{BAB3}", - nfd: "\u{1106}\u{1169}\u{11B2}", - nfkc: "\u{BAB3}", - nfkd: "\u{1106}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{BAB4}", - nfc: "\u{BAB4}", - nfd: "\u{1106}\u{1169}\u{11B3}", - nfkc: "\u{BAB4}", - nfkd: "\u{1106}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{BAB5}", - nfc: "\u{BAB5}", - nfd: "\u{1106}\u{1169}\u{11B4}", - nfkc: "\u{BAB5}", - nfkd: "\u{1106}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{BAB6}", - nfc: "\u{BAB6}", - nfd: "\u{1106}\u{1169}\u{11B5}", - nfkc: "\u{BAB6}", - nfkd: "\u{1106}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{BAB7}", - nfc: "\u{BAB7}", - nfd: "\u{1106}\u{1169}\u{11B6}", - nfkc: "\u{BAB7}", - nfkd: "\u{1106}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{BAB8}", - nfc: "\u{BAB8}", - nfd: "\u{1106}\u{1169}\u{11B7}", - nfkc: "\u{BAB8}", - nfkd: "\u{1106}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{BAB9}", - nfc: "\u{BAB9}", - nfd: "\u{1106}\u{1169}\u{11B8}", - nfkc: "\u{BAB9}", - nfkd: "\u{1106}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{BABA}", - nfc: "\u{BABA}", - nfd: "\u{1106}\u{1169}\u{11B9}", - nfkc: "\u{BABA}", - nfkd: "\u{1106}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{BABB}", - nfc: "\u{BABB}", - nfd: "\u{1106}\u{1169}\u{11BA}", - nfkc: "\u{BABB}", - nfkd: "\u{1106}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{BABC}", - nfc: "\u{BABC}", - nfd: "\u{1106}\u{1169}\u{11BB}", - nfkc: "\u{BABC}", - nfkd: "\u{1106}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{BABD}", - nfc: "\u{BABD}", - nfd: "\u{1106}\u{1169}\u{11BC}", - nfkc: "\u{BABD}", - nfkd: "\u{1106}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{BABE}", - nfc: "\u{BABE}", - nfd: "\u{1106}\u{1169}\u{11BD}", - nfkc: "\u{BABE}", - nfkd: "\u{1106}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{BABF}", - nfc: "\u{BABF}", - nfd: "\u{1106}\u{1169}\u{11BE}", - nfkc: "\u{BABF}", - nfkd: "\u{1106}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{BAC0}", - nfc: "\u{BAC0}", - nfd: "\u{1106}\u{1169}\u{11BF}", - nfkc: "\u{BAC0}", - nfkd: "\u{1106}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{BAC1}", - nfc: "\u{BAC1}", - nfd: "\u{1106}\u{1169}\u{11C0}", - nfkc: "\u{BAC1}", - nfkd: "\u{1106}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{BAC2}", - nfc: "\u{BAC2}", - nfd: "\u{1106}\u{1169}\u{11C1}", - nfkc: "\u{BAC2}", - nfkd: "\u{1106}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{BAC3}", - nfc: "\u{BAC3}", - nfd: "\u{1106}\u{1169}\u{11C2}", - nfkc: "\u{BAC3}", - nfkd: "\u{1106}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{BAC4}", - nfc: "\u{BAC4}", - nfd: "\u{1106}\u{116A}", - nfkc: "\u{BAC4}", - nfkd: "\u{1106}\u{116A}", - }, - NormalizationTest { - source: "\u{BAC5}", - nfc: "\u{BAC5}", - nfd: "\u{1106}\u{116A}\u{11A8}", - nfkc: "\u{BAC5}", - nfkd: "\u{1106}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{BAC6}", - nfc: "\u{BAC6}", - nfd: "\u{1106}\u{116A}\u{11A9}", - nfkc: "\u{BAC6}", - nfkd: "\u{1106}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{BAC7}", - nfc: "\u{BAC7}", - nfd: "\u{1106}\u{116A}\u{11AA}", - nfkc: "\u{BAC7}", - nfkd: "\u{1106}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{BAC8}", - nfc: "\u{BAC8}", - nfd: "\u{1106}\u{116A}\u{11AB}", - nfkc: "\u{BAC8}", - nfkd: "\u{1106}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{BAC9}", - nfc: "\u{BAC9}", - nfd: "\u{1106}\u{116A}\u{11AC}", - nfkc: "\u{BAC9}", - nfkd: "\u{1106}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{BACA}", - nfc: "\u{BACA}", - nfd: "\u{1106}\u{116A}\u{11AD}", - nfkc: "\u{BACA}", - nfkd: "\u{1106}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{BACB}", - nfc: "\u{BACB}", - nfd: "\u{1106}\u{116A}\u{11AE}", - nfkc: "\u{BACB}", - nfkd: "\u{1106}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{BACC}", - nfc: "\u{BACC}", - nfd: "\u{1106}\u{116A}\u{11AF}", - nfkc: "\u{BACC}", - nfkd: "\u{1106}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{BACD}", - nfc: "\u{BACD}", - nfd: "\u{1106}\u{116A}\u{11B0}", - nfkc: "\u{BACD}", - nfkd: "\u{1106}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{BACE}", - nfc: "\u{BACE}", - nfd: "\u{1106}\u{116A}\u{11B1}", - nfkc: "\u{BACE}", - nfkd: "\u{1106}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{BACF}", - nfc: "\u{BACF}", - nfd: "\u{1106}\u{116A}\u{11B2}", - nfkc: "\u{BACF}", - nfkd: "\u{1106}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{BAD0}", - nfc: "\u{BAD0}", - nfd: "\u{1106}\u{116A}\u{11B3}", - nfkc: "\u{BAD0}", - nfkd: "\u{1106}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{BAD1}", - nfc: "\u{BAD1}", - nfd: "\u{1106}\u{116A}\u{11B4}", - nfkc: "\u{BAD1}", - nfkd: "\u{1106}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{BAD2}", - nfc: "\u{BAD2}", - nfd: "\u{1106}\u{116A}\u{11B5}", - nfkc: "\u{BAD2}", - nfkd: "\u{1106}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{BAD3}", - nfc: "\u{BAD3}", - nfd: "\u{1106}\u{116A}\u{11B6}", - nfkc: "\u{BAD3}", - nfkd: "\u{1106}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{BAD4}", - nfc: "\u{BAD4}", - nfd: "\u{1106}\u{116A}\u{11B7}", - nfkc: "\u{BAD4}", - nfkd: "\u{1106}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{BAD5}", - nfc: "\u{BAD5}", - nfd: "\u{1106}\u{116A}\u{11B8}", - nfkc: "\u{BAD5}", - nfkd: "\u{1106}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{BAD6}", - nfc: "\u{BAD6}", - nfd: "\u{1106}\u{116A}\u{11B9}", - nfkc: "\u{BAD6}", - nfkd: "\u{1106}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{BAD7}", - nfc: "\u{BAD7}", - nfd: "\u{1106}\u{116A}\u{11BA}", - nfkc: "\u{BAD7}", - nfkd: "\u{1106}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{BAD8}", - nfc: "\u{BAD8}", - nfd: "\u{1106}\u{116A}\u{11BB}", - nfkc: "\u{BAD8}", - nfkd: "\u{1106}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{BAD9}", - nfc: "\u{BAD9}", - nfd: "\u{1106}\u{116A}\u{11BC}", - nfkc: "\u{BAD9}", - nfkd: "\u{1106}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{BADA}", - nfc: "\u{BADA}", - nfd: "\u{1106}\u{116A}\u{11BD}", - nfkc: "\u{BADA}", - nfkd: "\u{1106}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{BADB}", - nfc: "\u{BADB}", - nfd: "\u{1106}\u{116A}\u{11BE}", - nfkc: "\u{BADB}", - nfkd: "\u{1106}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{BADC}", - nfc: "\u{BADC}", - nfd: "\u{1106}\u{116A}\u{11BF}", - nfkc: "\u{BADC}", - nfkd: "\u{1106}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{BADD}", - nfc: "\u{BADD}", - nfd: "\u{1106}\u{116A}\u{11C0}", - nfkc: "\u{BADD}", - nfkd: "\u{1106}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{BADE}", - nfc: "\u{BADE}", - nfd: "\u{1106}\u{116A}\u{11C1}", - nfkc: "\u{BADE}", - nfkd: "\u{1106}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{BADF}", - nfc: "\u{BADF}", - nfd: "\u{1106}\u{116A}\u{11C2}", - nfkc: "\u{BADF}", - nfkd: "\u{1106}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{BAE0}", - nfc: "\u{BAE0}", - nfd: "\u{1106}\u{116B}", - nfkc: "\u{BAE0}", - nfkd: "\u{1106}\u{116B}", - }, - NormalizationTest { - source: "\u{BAE1}", - nfc: "\u{BAE1}", - nfd: "\u{1106}\u{116B}\u{11A8}", - nfkc: "\u{BAE1}", - nfkd: "\u{1106}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{BAE2}", - nfc: "\u{BAE2}", - nfd: "\u{1106}\u{116B}\u{11A9}", - nfkc: "\u{BAE2}", - nfkd: "\u{1106}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{BAE3}", - nfc: "\u{BAE3}", - nfd: "\u{1106}\u{116B}\u{11AA}", - nfkc: "\u{BAE3}", - nfkd: "\u{1106}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{BAE4}", - nfc: "\u{BAE4}", - nfd: "\u{1106}\u{116B}\u{11AB}", - nfkc: "\u{BAE4}", - nfkd: "\u{1106}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{BAE5}", - nfc: "\u{BAE5}", - nfd: "\u{1106}\u{116B}\u{11AC}", - nfkc: "\u{BAE5}", - nfkd: "\u{1106}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{BAE6}", - nfc: "\u{BAE6}", - nfd: "\u{1106}\u{116B}\u{11AD}", - nfkc: "\u{BAE6}", - nfkd: "\u{1106}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{BAE7}", - nfc: "\u{BAE7}", - nfd: "\u{1106}\u{116B}\u{11AE}", - nfkc: "\u{BAE7}", - nfkd: "\u{1106}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{BAE8}", - nfc: "\u{BAE8}", - nfd: "\u{1106}\u{116B}\u{11AF}", - nfkc: "\u{BAE8}", - nfkd: "\u{1106}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{BAE9}", - nfc: "\u{BAE9}", - nfd: "\u{1106}\u{116B}\u{11B0}", - nfkc: "\u{BAE9}", - nfkd: "\u{1106}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{BAEA}", - nfc: "\u{BAEA}", - nfd: "\u{1106}\u{116B}\u{11B1}", - nfkc: "\u{BAEA}", - nfkd: "\u{1106}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{BAEB}", - nfc: "\u{BAEB}", - nfd: "\u{1106}\u{116B}\u{11B2}", - nfkc: "\u{BAEB}", - nfkd: "\u{1106}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{BAEC}", - nfc: "\u{BAEC}", - nfd: "\u{1106}\u{116B}\u{11B3}", - nfkc: "\u{BAEC}", - nfkd: "\u{1106}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{BAED}", - nfc: "\u{BAED}", - nfd: "\u{1106}\u{116B}\u{11B4}", - nfkc: "\u{BAED}", - nfkd: "\u{1106}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{BAEE}", - nfc: "\u{BAEE}", - nfd: "\u{1106}\u{116B}\u{11B5}", - nfkc: "\u{BAEE}", - nfkd: "\u{1106}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{BAEF}", - nfc: "\u{BAEF}", - nfd: "\u{1106}\u{116B}\u{11B6}", - nfkc: "\u{BAEF}", - nfkd: "\u{1106}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{BAF0}", - nfc: "\u{BAF0}", - nfd: "\u{1106}\u{116B}\u{11B7}", - nfkc: "\u{BAF0}", - nfkd: "\u{1106}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{BAF1}", - nfc: "\u{BAF1}", - nfd: "\u{1106}\u{116B}\u{11B8}", - nfkc: "\u{BAF1}", - nfkd: "\u{1106}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{BAF2}", - nfc: "\u{BAF2}", - nfd: "\u{1106}\u{116B}\u{11B9}", - nfkc: "\u{BAF2}", - nfkd: "\u{1106}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{BAF3}", - nfc: "\u{BAF3}", - nfd: "\u{1106}\u{116B}\u{11BA}", - nfkc: "\u{BAF3}", - nfkd: "\u{1106}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{BAF4}", - nfc: "\u{BAF4}", - nfd: "\u{1106}\u{116B}\u{11BB}", - nfkc: "\u{BAF4}", - nfkd: "\u{1106}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{BAF5}", - nfc: "\u{BAF5}", - nfd: "\u{1106}\u{116B}\u{11BC}", - nfkc: "\u{BAF5}", - nfkd: "\u{1106}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{BAF6}", - nfc: "\u{BAF6}", - nfd: "\u{1106}\u{116B}\u{11BD}", - nfkc: "\u{BAF6}", - nfkd: "\u{1106}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{BAF7}", - nfc: "\u{BAF7}", - nfd: "\u{1106}\u{116B}\u{11BE}", - nfkc: "\u{BAF7}", - nfkd: "\u{1106}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{BAF8}", - nfc: "\u{BAF8}", - nfd: "\u{1106}\u{116B}\u{11BF}", - nfkc: "\u{BAF8}", - nfkd: "\u{1106}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{BAF9}", - nfc: "\u{BAF9}", - nfd: "\u{1106}\u{116B}\u{11C0}", - nfkc: "\u{BAF9}", - nfkd: "\u{1106}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{BAFA}", - nfc: "\u{BAFA}", - nfd: "\u{1106}\u{116B}\u{11C1}", - nfkc: "\u{BAFA}", - nfkd: "\u{1106}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{BAFB}", - nfc: "\u{BAFB}", - nfd: "\u{1106}\u{116B}\u{11C2}", - nfkc: "\u{BAFB}", - nfkd: "\u{1106}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{BAFC}", - nfc: "\u{BAFC}", - nfd: "\u{1106}\u{116C}", - nfkc: "\u{BAFC}", - nfkd: "\u{1106}\u{116C}", - }, - NormalizationTest { - source: "\u{BAFD}", - nfc: "\u{BAFD}", - nfd: "\u{1106}\u{116C}\u{11A8}", - nfkc: "\u{BAFD}", - nfkd: "\u{1106}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{BAFE}", - nfc: "\u{BAFE}", - nfd: "\u{1106}\u{116C}\u{11A9}", - nfkc: "\u{BAFE}", - nfkd: "\u{1106}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{BAFF}", - nfc: "\u{BAFF}", - nfd: "\u{1106}\u{116C}\u{11AA}", - nfkc: "\u{BAFF}", - nfkd: "\u{1106}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{BB00}", - nfc: "\u{BB00}", - nfd: "\u{1106}\u{116C}\u{11AB}", - nfkc: "\u{BB00}", - nfkd: "\u{1106}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{BB01}", - nfc: "\u{BB01}", - nfd: "\u{1106}\u{116C}\u{11AC}", - nfkc: "\u{BB01}", - nfkd: "\u{1106}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{BB02}", - nfc: "\u{BB02}", - nfd: "\u{1106}\u{116C}\u{11AD}", - nfkc: "\u{BB02}", - nfkd: "\u{1106}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{BB03}", - nfc: "\u{BB03}", - nfd: "\u{1106}\u{116C}\u{11AE}", - nfkc: "\u{BB03}", - nfkd: "\u{1106}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{BB04}", - nfc: "\u{BB04}", - nfd: "\u{1106}\u{116C}\u{11AF}", - nfkc: "\u{BB04}", - nfkd: "\u{1106}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{BB05}", - nfc: "\u{BB05}", - nfd: "\u{1106}\u{116C}\u{11B0}", - nfkc: "\u{BB05}", - nfkd: "\u{1106}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{BB06}", - nfc: "\u{BB06}", - nfd: "\u{1106}\u{116C}\u{11B1}", - nfkc: "\u{BB06}", - nfkd: "\u{1106}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{BB07}", - nfc: "\u{BB07}", - nfd: "\u{1106}\u{116C}\u{11B2}", - nfkc: "\u{BB07}", - nfkd: "\u{1106}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{BB08}", - nfc: "\u{BB08}", - nfd: "\u{1106}\u{116C}\u{11B3}", - nfkc: "\u{BB08}", - nfkd: "\u{1106}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{BB09}", - nfc: "\u{BB09}", - nfd: "\u{1106}\u{116C}\u{11B4}", - nfkc: "\u{BB09}", - nfkd: "\u{1106}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{BB0A}", - nfc: "\u{BB0A}", - nfd: "\u{1106}\u{116C}\u{11B5}", - nfkc: "\u{BB0A}", - nfkd: "\u{1106}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{BB0B}", - nfc: "\u{BB0B}", - nfd: "\u{1106}\u{116C}\u{11B6}", - nfkc: "\u{BB0B}", - nfkd: "\u{1106}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{BB0C}", - nfc: "\u{BB0C}", - nfd: "\u{1106}\u{116C}\u{11B7}", - nfkc: "\u{BB0C}", - nfkd: "\u{1106}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{BB0D}", - nfc: "\u{BB0D}", - nfd: "\u{1106}\u{116C}\u{11B8}", - nfkc: "\u{BB0D}", - nfkd: "\u{1106}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{BB0E}", - nfc: "\u{BB0E}", - nfd: "\u{1106}\u{116C}\u{11B9}", - nfkc: "\u{BB0E}", - nfkd: "\u{1106}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{BB0F}", - nfc: "\u{BB0F}", - nfd: "\u{1106}\u{116C}\u{11BA}", - nfkc: "\u{BB0F}", - nfkd: "\u{1106}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{BB10}", - nfc: "\u{BB10}", - nfd: "\u{1106}\u{116C}\u{11BB}", - nfkc: "\u{BB10}", - nfkd: "\u{1106}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{BB11}", - nfc: "\u{BB11}", - nfd: "\u{1106}\u{116C}\u{11BC}", - nfkc: "\u{BB11}", - nfkd: "\u{1106}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{BB12}", - nfc: "\u{BB12}", - nfd: "\u{1106}\u{116C}\u{11BD}", - nfkc: "\u{BB12}", - nfkd: "\u{1106}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{BB13}", - nfc: "\u{BB13}", - nfd: "\u{1106}\u{116C}\u{11BE}", - nfkc: "\u{BB13}", - nfkd: "\u{1106}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{BB14}", - nfc: "\u{BB14}", - nfd: "\u{1106}\u{116C}\u{11BF}", - nfkc: "\u{BB14}", - nfkd: "\u{1106}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{BB15}", - nfc: "\u{BB15}", - nfd: "\u{1106}\u{116C}\u{11C0}", - nfkc: "\u{BB15}", - nfkd: "\u{1106}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{BB16}", - nfc: "\u{BB16}", - nfd: "\u{1106}\u{116C}\u{11C1}", - nfkc: "\u{BB16}", - nfkd: "\u{1106}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{BB17}", - nfc: "\u{BB17}", - nfd: "\u{1106}\u{116C}\u{11C2}", - nfkc: "\u{BB17}", - nfkd: "\u{1106}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{BB18}", - nfc: "\u{BB18}", - nfd: "\u{1106}\u{116D}", - nfkc: "\u{BB18}", - nfkd: "\u{1106}\u{116D}", - }, - NormalizationTest { - source: "\u{BB19}", - nfc: "\u{BB19}", - nfd: "\u{1106}\u{116D}\u{11A8}", - nfkc: "\u{BB19}", - nfkd: "\u{1106}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{BB1A}", - nfc: "\u{BB1A}", - nfd: "\u{1106}\u{116D}\u{11A9}", - nfkc: "\u{BB1A}", - nfkd: "\u{1106}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{BB1B}", - nfc: "\u{BB1B}", - nfd: "\u{1106}\u{116D}\u{11AA}", - nfkc: "\u{BB1B}", - nfkd: "\u{1106}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{BB1C}", - nfc: "\u{BB1C}", - nfd: "\u{1106}\u{116D}\u{11AB}", - nfkc: "\u{BB1C}", - nfkd: "\u{1106}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{BB1D}", - nfc: "\u{BB1D}", - nfd: "\u{1106}\u{116D}\u{11AC}", - nfkc: "\u{BB1D}", - nfkd: "\u{1106}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{BB1E}", - nfc: "\u{BB1E}", - nfd: "\u{1106}\u{116D}\u{11AD}", - nfkc: "\u{BB1E}", - nfkd: "\u{1106}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{BB1F}", - nfc: "\u{BB1F}", - nfd: "\u{1106}\u{116D}\u{11AE}", - nfkc: "\u{BB1F}", - nfkd: "\u{1106}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{BB20}", - nfc: "\u{BB20}", - nfd: "\u{1106}\u{116D}\u{11AF}", - nfkc: "\u{BB20}", - nfkd: "\u{1106}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{BB21}", - nfc: "\u{BB21}", - nfd: "\u{1106}\u{116D}\u{11B0}", - nfkc: "\u{BB21}", - nfkd: "\u{1106}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{BB22}", - nfc: "\u{BB22}", - nfd: "\u{1106}\u{116D}\u{11B1}", - nfkc: "\u{BB22}", - nfkd: "\u{1106}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{BB23}", - nfc: "\u{BB23}", - nfd: "\u{1106}\u{116D}\u{11B2}", - nfkc: "\u{BB23}", - nfkd: "\u{1106}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{BB24}", - nfc: "\u{BB24}", - nfd: "\u{1106}\u{116D}\u{11B3}", - nfkc: "\u{BB24}", - nfkd: "\u{1106}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{BB25}", - nfc: "\u{BB25}", - nfd: "\u{1106}\u{116D}\u{11B4}", - nfkc: "\u{BB25}", - nfkd: "\u{1106}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{BB26}", - nfc: "\u{BB26}", - nfd: "\u{1106}\u{116D}\u{11B5}", - nfkc: "\u{BB26}", - nfkd: "\u{1106}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{BB27}", - nfc: "\u{BB27}", - nfd: "\u{1106}\u{116D}\u{11B6}", - nfkc: "\u{BB27}", - nfkd: "\u{1106}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{BB28}", - nfc: "\u{BB28}", - nfd: "\u{1106}\u{116D}\u{11B7}", - nfkc: "\u{BB28}", - nfkd: "\u{1106}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{BB29}", - nfc: "\u{BB29}", - nfd: "\u{1106}\u{116D}\u{11B8}", - nfkc: "\u{BB29}", - nfkd: "\u{1106}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{BB2A}", - nfc: "\u{BB2A}", - nfd: "\u{1106}\u{116D}\u{11B9}", - nfkc: "\u{BB2A}", - nfkd: "\u{1106}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{BB2B}", - nfc: "\u{BB2B}", - nfd: "\u{1106}\u{116D}\u{11BA}", - nfkc: "\u{BB2B}", - nfkd: "\u{1106}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{BB2C}", - nfc: "\u{BB2C}", - nfd: "\u{1106}\u{116D}\u{11BB}", - nfkc: "\u{BB2C}", - nfkd: "\u{1106}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{BB2D}", - nfc: "\u{BB2D}", - nfd: "\u{1106}\u{116D}\u{11BC}", - nfkc: "\u{BB2D}", - nfkd: "\u{1106}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{BB2E}", - nfc: "\u{BB2E}", - nfd: "\u{1106}\u{116D}\u{11BD}", - nfkc: "\u{BB2E}", - nfkd: "\u{1106}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{BB2F}", - nfc: "\u{BB2F}", - nfd: "\u{1106}\u{116D}\u{11BE}", - nfkc: "\u{BB2F}", - nfkd: "\u{1106}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{BB30}", - nfc: "\u{BB30}", - nfd: "\u{1106}\u{116D}\u{11BF}", - nfkc: "\u{BB30}", - nfkd: "\u{1106}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{BB31}", - nfc: "\u{BB31}", - nfd: "\u{1106}\u{116D}\u{11C0}", - nfkc: "\u{BB31}", - nfkd: "\u{1106}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{BB32}", - nfc: "\u{BB32}", - nfd: "\u{1106}\u{116D}\u{11C1}", - nfkc: "\u{BB32}", - nfkd: "\u{1106}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{BB33}", - nfc: "\u{BB33}", - nfd: "\u{1106}\u{116D}\u{11C2}", - nfkc: "\u{BB33}", - nfkd: "\u{1106}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{BB34}", - nfc: "\u{BB34}", - nfd: "\u{1106}\u{116E}", - nfkc: "\u{BB34}", - nfkd: "\u{1106}\u{116E}", - }, - NormalizationTest { - source: "\u{BB35}", - nfc: "\u{BB35}", - nfd: "\u{1106}\u{116E}\u{11A8}", - nfkc: "\u{BB35}", - nfkd: "\u{1106}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{BB36}", - nfc: "\u{BB36}", - nfd: "\u{1106}\u{116E}\u{11A9}", - nfkc: "\u{BB36}", - nfkd: "\u{1106}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{BB37}", - nfc: "\u{BB37}", - nfd: "\u{1106}\u{116E}\u{11AA}", - nfkc: "\u{BB37}", - nfkd: "\u{1106}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{BB38}", - nfc: "\u{BB38}", - nfd: "\u{1106}\u{116E}\u{11AB}", - nfkc: "\u{BB38}", - nfkd: "\u{1106}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{BB39}", - nfc: "\u{BB39}", - nfd: "\u{1106}\u{116E}\u{11AC}", - nfkc: "\u{BB39}", - nfkd: "\u{1106}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{BB3A}", - nfc: "\u{BB3A}", - nfd: "\u{1106}\u{116E}\u{11AD}", - nfkc: "\u{BB3A}", - nfkd: "\u{1106}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{BB3B}", - nfc: "\u{BB3B}", - nfd: "\u{1106}\u{116E}\u{11AE}", - nfkc: "\u{BB3B}", - nfkd: "\u{1106}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{BB3C}", - nfc: "\u{BB3C}", - nfd: "\u{1106}\u{116E}\u{11AF}", - nfkc: "\u{BB3C}", - nfkd: "\u{1106}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{BB3D}", - nfc: "\u{BB3D}", - nfd: "\u{1106}\u{116E}\u{11B0}", - nfkc: "\u{BB3D}", - nfkd: "\u{1106}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{BB3E}", - nfc: "\u{BB3E}", - nfd: "\u{1106}\u{116E}\u{11B1}", - nfkc: "\u{BB3E}", - nfkd: "\u{1106}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{BB3F}", - nfc: "\u{BB3F}", - nfd: "\u{1106}\u{116E}\u{11B2}", - nfkc: "\u{BB3F}", - nfkd: "\u{1106}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{BB40}", - nfc: "\u{BB40}", - nfd: "\u{1106}\u{116E}\u{11B3}", - nfkc: "\u{BB40}", - nfkd: "\u{1106}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{BB41}", - nfc: "\u{BB41}", - nfd: "\u{1106}\u{116E}\u{11B4}", - nfkc: "\u{BB41}", - nfkd: "\u{1106}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{BB42}", - nfc: "\u{BB42}", - nfd: "\u{1106}\u{116E}\u{11B5}", - nfkc: "\u{BB42}", - nfkd: "\u{1106}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{BB43}", - nfc: "\u{BB43}", - nfd: "\u{1106}\u{116E}\u{11B6}", - nfkc: "\u{BB43}", - nfkd: "\u{1106}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{BB44}", - nfc: "\u{BB44}", - nfd: "\u{1106}\u{116E}\u{11B7}", - nfkc: "\u{BB44}", - nfkd: "\u{1106}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{BB45}", - nfc: "\u{BB45}", - nfd: "\u{1106}\u{116E}\u{11B8}", - nfkc: "\u{BB45}", - nfkd: "\u{1106}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{BB46}", - nfc: "\u{BB46}", - nfd: "\u{1106}\u{116E}\u{11B9}", - nfkc: "\u{BB46}", - nfkd: "\u{1106}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{BB47}", - nfc: "\u{BB47}", - nfd: "\u{1106}\u{116E}\u{11BA}", - nfkc: "\u{BB47}", - nfkd: "\u{1106}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{BB48}", - nfc: "\u{BB48}", - nfd: "\u{1106}\u{116E}\u{11BB}", - nfkc: "\u{BB48}", - nfkd: "\u{1106}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{BB49}", - nfc: "\u{BB49}", - nfd: "\u{1106}\u{116E}\u{11BC}", - nfkc: "\u{BB49}", - nfkd: "\u{1106}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{BB4A}", - nfc: "\u{BB4A}", - nfd: "\u{1106}\u{116E}\u{11BD}", - nfkc: "\u{BB4A}", - nfkd: "\u{1106}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{BB4B}", - nfc: "\u{BB4B}", - nfd: "\u{1106}\u{116E}\u{11BE}", - nfkc: "\u{BB4B}", - nfkd: "\u{1106}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{BB4C}", - nfc: "\u{BB4C}", - nfd: "\u{1106}\u{116E}\u{11BF}", - nfkc: "\u{BB4C}", - nfkd: "\u{1106}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{BB4D}", - nfc: "\u{BB4D}", - nfd: "\u{1106}\u{116E}\u{11C0}", - nfkc: "\u{BB4D}", - nfkd: "\u{1106}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{BB4E}", - nfc: "\u{BB4E}", - nfd: "\u{1106}\u{116E}\u{11C1}", - nfkc: "\u{BB4E}", - nfkd: "\u{1106}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{BB4F}", - nfc: "\u{BB4F}", - nfd: "\u{1106}\u{116E}\u{11C2}", - nfkc: "\u{BB4F}", - nfkd: "\u{1106}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{BB50}", - nfc: "\u{BB50}", - nfd: "\u{1106}\u{116F}", - nfkc: "\u{BB50}", - nfkd: "\u{1106}\u{116F}", - }, - NormalizationTest { - source: "\u{BB51}", - nfc: "\u{BB51}", - nfd: "\u{1106}\u{116F}\u{11A8}", - nfkc: "\u{BB51}", - nfkd: "\u{1106}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{BB52}", - nfc: "\u{BB52}", - nfd: "\u{1106}\u{116F}\u{11A9}", - nfkc: "\u{BB52}", - nfkd: "\u{1106}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{BB53}", - nfc: "\u{BB53}", - nfd: "\u{1106}\u{116F}\u{11AA}", - nfkc: "\u{BB53}", - nfkd: "\u{1106}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{BB54}", - nfc: "\u{BB54}", - nfd: "\u{1106}\u{116F}\u{11AB}", - nfkc: "\u{BB54}", - nfkd: "\u{1106}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{BB55}", - nfc: "\u{BB55}", - nfd: "\u{1106}\u{116F}\u{11AC}", - nfkc: "\u{BB55}", - nfkd: "\u{1106}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{BB56}", - nfc: "\u{BB56}", - nfd: "\u{1106}\u{116F}\u{11AD}", - nfkc: "\u{BB56}", - nfkd: "\u{1106}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{BB57}", - nfc: "\u{BB57}", - nfd: "\u{1106}\u{116F}\u{11AE}", - nfkc: "\u{BB57}", - nfkd: "\u{1106}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{BB58}", - nfc: "\u{BB58}", - nfd: "\u{1106}\u{116F}\u{11AF}", - nfkc: "\u{BB58}", - nfkd: "\u{1106}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{BB59}", - nfc: "\u{BB59}", - nfd: "\u{1106}\u{116F}\u{11B0}", - nfkc: "\u{BB59}", - nfkd: "\u{1106}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{BB5A}", - nfc: "\u{BB5A}", - nfd: "\u{1106}\u{116F}\u{11B1}", - nfkc: "\u{BB5A}", - nfkd: "\u{1106}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{BB5B}", - nfc: "\u{BB5B}", - nfd: "\u{1106}\u{116F}\u{11B2}", - nfkc: "\u{BB5B}", - nfkd: "\u{1106}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{BB5C}", - nfc: "\u{BB5C}", - nfd: "\u{1106}\u{116F}\u{11B3}", - nfkc: "\u{BB5C}", - nfkd: "\u{1106}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{BB5D}", - nfc: "\u{BB5D}", - nfd: "\u{1106}\u{116F}\u{11B4}", - nfkc: "\u{BB5D}", - nfkd: "\u{1106}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{BB5E}", - nfc: "\u{BB5E}", - nfd: "\u{1106}\u{116F}\u{11B5}", - nfkc: "\u{BB5E}", - nfkd: "\u{1106}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{BB5F}", - nfc: "\u{BB5F}", - nfd: "\u{1106}\u{116F}\u{11B6}", - nfkc: "\u{BB5F}", - nfkd: "\u{1106}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{BB60}", - nfc: "\u{BB60}", - nfd: "\u{1106}\u{116F}\u{11B7}", - nfkc: "\u{BB60}", - nfkd: "\u{1106}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{BB61}", - nfc: "\u{BB61}", - nfd: "\u{1106}\u{116F}\u{11B8}", - nfkc: "\u{BB61}", - nfkd: "\u{1106}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{BB62}", - nfc: "\u{BB62}", - nfd: "\u{1106}\u{116F}\u{11B9}", - nfkc: "\u{BB62}", - nfkd: "\u{1106}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{BB63}", - nfc: "\u{BB63}", - nfd: "\u{1106}\u{116F}\u{11BA}", - nfkc: "\u{BB63}", - nfkd: "\u{1106}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{BB64}", - nfc: "\u{BB64}", - nfd: "\u{1106}\u{116F}\u{11BB}", - nfkc: "\u{BB64}", - nfkd: "\u{1106}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{BB65}", - nfc: "\u{BB65}", - nfd: "\u{1106}\u{116F}\u{11BC}", - nfkc: "\u{BB65}", - nfkd: "\u{1106}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{BB66}", - nfc: "\u{BB66}", - nfd: "\u{1106}\u{116F}\u{11BD}", - nfkc: "\u{BB66}", - nfkd: "\u{1106}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{BB67}", - nfc: "\u{BB67}", - nfd: "\u{1106}\u{116F}\u{11BE}", - nfkc: "\u{BB67}", - nfkd: "\u{1106}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{BB68}", - nfc: "\u{BB68}", - nfd: "\u{1106}\u{116F}\u{11BF}", - nfkc: "\u{BB68}", - nfkd: "\u{1106}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{BB69}", - nfc: "\u{BB69}", - nfd: "\u{1106}\u{116F}\u{11C0}", - nfkc: "\u{BB69}", - nfkd: "\u{1106}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{BB6A}", - nfc: "\u{BB6A}", - nfd: "\u{1106}\u{116F}\u{11C1}", - nfkc: "\u{BB6A}", - nfkd: "\u{1106}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{BB6B}", - nfc: "\u{BB6B}", - nfd: "\u{1106}\u{116F}\u{11C2}", - nfkc: "\u{BB6B}", - nfkd: "\u{1106}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{BB6C}", - nfc: "\u{BB6C}", - nfd: "\u{1106}\u{1170}", - nfkc: "\u{BB6C}", - nfkd: "\u{1106}\u{1170}", - }, - NormalizationTest { - source: "\u{BB6D}", - nfc: "\u{BB6D}", - nfd: "\u{1106}\u{1170}\u{11A8}", - nfkc: "\u{BB6D}", - nfkd: "\u{1106}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{BB6E}", - nfc: "\u{BB6E}", - nfd: "\u{1106}\u{1170}\u{11A9}", - nfkc: "\u{BB6E}", - nfkd: "\u{1106}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{BB6F}", - nfc: "\u{BB6F}", - nfd: "\u{1106}\u{1170}\u{11AA}", - nfkc: "\u{BB6F}", - nfkd: "\u{1106}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{BB70}", - nfc: "\u{BB70}", - nfd: "\u{1106}\u{1170}\u{11AB}", - nfkc: "\u{BB70}", - nfkd: "\u{1106}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{BB71}", - nfc: "\u{BB71}", - nfd: "\u{1106}\u{1170}\u{11AC}", - nfkc: "\u{BB71}", - nfkd: "\u{1106}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{BB72}", - nfc: "\u{BB72}", - nfd: "\u{1106}\u{1170}\u{11AD}", - nfkc: "\u{BB72}", - nfkd: "\u{1106}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{BB73}", - nfc: "\u{BB73}", - nfd: "\u{1106}\u{1170}\u{11AE}", - nfkc: "\u{BB73}", - nfkd: "\u{1106}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{BB74}", - nfc: "\u{BB74}", - nfd: "\u{1106}\u{1170}\u{11AF}", - nfkc: "\u{BB74}", - nfkd: "\u{1106}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{BB75}", - nfc: "\u{BB75}", - nfd: "\u{1106}\u{1170}\u{11B0}", - nfkc: "\u{BB75}", - nfkd: "\u{1106}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{BB76}", - nfc: "\u{BB76}", - nfd: "\u{1106}\u{1170}\u{11B1}", - nfkc: "\u{BB76}", - nfkd: "\u{1106}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{BB77}", - nfc: "\u{BB77}", - nfd: "\u{1106}\u{1170}\u{11B2}", - nfkc: "\u{BB77}", - nfkd: "\u{1106}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{BB78}", - nfc: "\u{BB78}", - nfd: "\u{1106}\u{1170}\u{11B3}", - nfkc: "\u{BB78}", - nfkd: "\u{1106}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{BB79}", - nfc: "\u{BB79}", - nfd: "\u{1106}\u{1170}\u{11B4}", - nfkc: "\u{BB79}", - nfkd: "\u{1106}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{BB7A}", - nfc: "\u{BB7A}", - nfd: "\u{1106}\u{1170}\u{11B5}", - nfkc: "\u{BB7A}", - nfkd: "\u{1106}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{BB7B}", - nfc: "\u{BB7B}", - nfd: "\u{1106}\u{1170}\u{11B6}", - nfkc: "\u{BB7B}", - nfkd: "\u{1106}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{BB7C}", - nfc: "\u{BB7C}", - nfd: "\u{1106}\u{1170}\u{11B7}", - nfkc: "\u{BB7C}", - nfkd: "\u{1106}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{BB7D}", - nfc: "\u{BB7D}", - nfd: "\u{1106}\u{1170}\u{11B8}", - nfkc: "\u{BB7D}", - nfkd: "\u{1106}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{BB7E}", - nfc: "\u{BB7E}", - nfd: "\u{1106}\u{1170}\u{11B9}", - nfkc: "\u{BB7E}", - nfkd: "\u{1106}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{BB7F}", - nfc: "\u{BB7F}", - nfd: "\u{1106}\u{1170}\u{11BA}", - nfkc: "\u{BB7F}", - nfkd: "\u{1106}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{BB80}", - nfc: "\u{BB80}", - nfd: "\u{1106}\u{1170}\u{11BB}", - nfkc: "\u{BB80}", - nfkd: "\u{1106}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{BB81}", - nfc: "\u{BB81}", - nfd: "\u{1106}\u{1170}\u{11BC}", - nfkc: "\u{BB81}", - nfkd: "\u{1106}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{BB82}", - nfc: "\u{BB82}", - nfd: "\u{1106}\u{1170}\u{11BD}", - nfkc: "\u{BB82}", - nfkd: "\u{1106}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{BB83}", - nfc: "\u{BB83}", - nfd: "\u{1106}\u{1170}\u{11BE}", - nfkc: "\u{BB83}", - nfkd: "\u{1106}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{BB84}", - nfc: "\u{BB84}", - nfd: "\u{1106}\u{1170}\u{11BF}", - nfkc: "\u{BB84}", - nfkd: "\u{1106}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{BB85}", - nfc: "\u{BB85}", - nfd: "\u{1106}\u{1170}\u{11C0}", - nfkc: "\u{BB85}", - nfkd: "\u{1106}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{BB86}", - nfc: "\u{BB86}", - nfd: "\u{1106}\u{1170}\u{11C1}", - nfkc: "\u{BB86}", - nfkd: "\u{1106}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{BB87}", - nfc: "\u{BB87}", - nfd: "\u{1106}\u{1170}\u{11C2}", - nfkc: "\u{BB87}", - nfkd: "\u{1106}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{BB88}", - nfc: "\u{BB88}", - nfd: "\u{1106}\u{1171}", - nfkc: "\u{BB88}", - nfkd: "\u{1106}\u{1171}", - }, - NormalizationTest { - source: "\u{BB89}", - nfc: "\u{BB89}", - nfd: "\u{1106}\u{1171}\u{11A8}", - nfkc: "\u{BB89}", - nfkd: "\u{1106}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{BB8A}", - nfc: "\u{BB8A}", - nfd: "\u{1106}\u{1171}\u{11A9}", - nfkc: "\u{BB8A}", - nfkd: "\u{1106}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{BB8B}", - nfc: "\u{BB8B}", - nfd: "\u{1106}\u{1171}\u{11AA}", - nfkc: "\u{BB8B}", - nfkd: "\u{1106}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{BB8C}", - nfc: "\u{BB8C}", - nfd: "\u{1106}\u{1171}\u{11AB}", - nfkc: "\u{BB8C}", - nfkd: "\u{1106}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{BB8D}", - nfc: "\u{BB8D}", - nfd: "\u{1106}\u{1171}\u{11AC}", - nfkc: "\u{BB8D}", - nfkd: "\u{1106}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{BB8E}", - nfc: "\u{BB8E}", - nfd: "\u{1106}\u{1171}\u{11AD}", - nfkc: "\u{BB8E}", - nfkd: "\u{1106}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{BB8F}", - nfc: "\u{BB8F}", - nfd: "\u{1106}\u{1171}\u{11AE}", - nfkc: "\u{BB8F}", - nfkd: "\u{1106}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{BB90}", - nfc: "\u{BB90}", - nfd: "\u{1106}\u{1171}\u{11AF}", - nfkc: "\u{BB90}", - nfkd: "\u{1106}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{BB91}", - nfc: "\u{BB91}", - nfd: "\u{1106}\u{1171}\u{11B0}", - nfkc: "\u{BB91}", - nfkd: "\u{1106}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{BB92}", - nfc: "\u{BB92}", - nfd: "\u{1106}\u{1171}\u{11B1}", - nfkc: "\u{BB92}", - nfkd: "\u{1106}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{BB93}", - nfc: "\u{BB93}", - nfd: "\u{1106}\u{1171}\u{11B2}", - nfkc: "\u{BB93}", - nfkd: "\u{1106}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{BB94}", - nfc: "\u{BB94}", - nfd: "\u{1106}\u{1171}\u{11B3}", - nfkc: "\u{BB94}", - nfkd: "\u{1106}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{BB95}", - nfc: "\u{BB95}", - nfd: "\u{1106}\u{1171}\u{11B4}", - nfkc: "\u{BB95}", - nfkd: "\u{1106}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{BB96}", - nfc: "\u{BB96}", - nfd: "\u{1106}\u{1171}\u{11B5}", - nfkc: "\u{BB96}", - nfkd: "\u{1106}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{BB97}", - nfc: "\u{BB97}", - nfd: "\u{1106}\u{1171}\u{11B6}", - nfkc: "\u{BB97}", - nfkd: "\u{1106}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{BB98}", - nfc: "\u{BB98}", - nfd: "\u{1106}\u{1171}\u{11B7}", - nfkc: "\u{BB98}", - nfkd: "\u{1106}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{BB99}", - nfc: "\u{BB99}", - nfd: "\u{1106}\u{1171}\u{11B8}", - nfkc: "\u{BB99}", - nfkd: "\u{1106}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{BB9A}", - nfc: "\u{BB9A}", - nfd: "\u{1106}\u{1171}\u{11B9}", - nfkc: "\u{BB9A}", - nfkd: "\u{1106}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{BB9B}", - nfc: "\u{BB9B}", - nfd: "\u{1106}\u{1171}\u{11BA}", - nfkc: "\u{BB9B}", - nfkd: "\u{1106}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{BB9C}", - nfc: "\u{BB9C}", - nfd: "\u{1106}\u{1171}\u{11BB}", - nfkc: "\u{BB9C}", - nfkd: "\u{1106}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{BB9D}", - nfc: "\u{BB9D}", - nfd: "\u{1106}\u{1171}\u{11BC}", - nfkc: "\u{BB9D}", - nfkd: "\u{1106}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{BB9E}", - nfc: "\u{BB9E}", - nfd: "\u{1106}\u{1171}\u{11BD}", - nfkc: "\u{BB9E}", - nfkd: "\u{1106}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{BB9F}", - nfc: "\u{BB9F}", - nfd: "\u{1106}\u{1171}\u{11BE}", - nfkc: "\u{BB9F}", - nfkd: "\u{1106}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{BBA0}", - nfc: "\u{BBA0}", - nfd: "\u{1106}\u{1171}\u{11BF}", - nfkc: "\u{BBA0}", - nfkd: "\u{1106}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{BBA1}", - nfc: "\u{BBA1}", - nfd: "\u{1106}\u{1171}\u{11C0}", - nfkc: "\u{BBA1}", - nfkd: "\u{1106}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{BBA2}", - nfc: "\u{BBA2}", - nfd: "\u{1106}\u{1171}\u{11C1}", - nfkc: "\u{BBA2}", - nfkd: "\u{1106}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{BBA3}", - nfc: "\u{BBA3}", - nfd: "\u{1106}\u{1171}\u{11C2}", - nfkc: "\u{BBA3}", - nfkd: "\u{1106}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{BBA4}", - nfc: "\u{BBA4}", - nfd: "\u{1106}\u{1172}", - nfkc: "\u{BBA4}", - nfkd: "\u{1106}\u{1172}", - }, - NormalizationTest { - source: "\u{BBA5}", - nfc: "\u{BBA5}", - nfd: "\u{1106}\u{1172}\u{11A8}", - nfkc: "\u{BBA5}", - nfkd: "\u{1106}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{BBA6}", - nfc: "\u{BBA6}", - nfd: "\u{1106}\u{1172}\u{11A9}", - nfkc: "\u{BBA6}", - nfkd: "\u{1106}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{BBA7}", - nfc: "\u{BBA7}", - nfd: "\u{1106}\u{1172}\u{11AA}", - nfkc: "\u{BBA7}", - nfkd: "\u{1106}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{BBA8}", - nfc: "\u{BBA8}", - nfd: "\u{1106}\u{1172}\u{11AB}", - nfkc: "\u{BBA8}", - nfkd: "\u{1106}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{BBA9}", - nfc: "\u{BBA9}", - nfd: "\u{1106}\u{1172}\u{11AC}", - nfkc: "\u{BBA9}", - nfkd: "\u{1106}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{BBAA}", - nfc: "\u{BBAA}", - nfd: "\u{1106}\u{1172}\u{11AD}", - nfkc: "\u{BBAA}", - nfkd: "\u{1106}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{BBAB}", - nfc: "\u{BBAB}", - nfd: "\u{1106}\u{1172}\u{11AE}", - nfkc: "\u{BBAB}", - nfkd: "\u{1106}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{BBAC}", - nfc: "\u{BBAC}", - nfd: "\u{1106}\u{1172}\u{11AF}", - nfkc: "\u{BBAC}", - nfkd: "\u{1106}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{BBAD}", - nfc: "\u{BBAD}", - nfd: "\u{1106}\u{1172}\u{11B0}", - nfkc: "\u{BBAD}", - nfkd: "\u{1106}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{BBAE}", - nfc: "\u{BBAE}", - nfd: "\u{1106}\u{1172}\u{11B1}", - nfkc: "\u{BBAE}", - nfkd: "\u{1106}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{BBAF}", - nfc: "\u{BBAF}", - nfd: "\u{1106}\u{1172}\u{11B2}", - nfkc: "\u{BBAF}", - nfkd: "\u{1106}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{BBB0}", - nfc: "\u{BBB0}", - nfd: "\u{1106}\u{1172}\u{11B3}", - nfkc: "\u{BBB0}", - nfkd: "\u{1106}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{BBB1}", - nfc: "\u{BBB1}", - nfd: "\u{1106}\u{1172}\u{11B4}", - nfkc: "\u{BBB1}", - nfkd: "\u{1106}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{BBB2}", - nfc: "\u{BBB2}", - nfd: "\u{1106}\u{1172}\u{11B5}", - nfkc: "\u{BBB2}", - nfkd: "\u{1106}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{BBB3}", - nfc: "\u{BBB3}", - nfd: "\u{1106}\u{1172}\u{11B6}", - nfkc: "\u{BBB3}", - nfkd: "\u{1106}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{BBB4}", - nfc: "\u{BBB4}", - nfd: "\u{1106}\u{1172}\u{11B7}", - nfkc: "\u{BBB4}", - nfkd: "\u{1106}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{BBB5}", - nfc: "\u{BBB5}", - nfd: "\u{1106}\u{1172}\u{11B8}", - nfkc: "\u{BBB5}", - nfkd: "\u{1106}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{BBB6}", - nfc: "\u{BBB6}", - nfd: "\u{1106}\u{1172}\u{11B9}", - nfkc: "\u{BBB6}", - nfkd: "\u{1106}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{BBB7}", - nfc: "\u{BBB7}", - nfd: "\u{1106}\u{1172}\u{11BA}", - nfkc: "\u{BBB7}", - nfkd: "\u{1106}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{BBB8}", - nfc: "\u{BBB8}", - nfd: "\u{1106}\u{1172}\u{11BB}", - nfkc: "\u{BBB8}", - nfkd: "\u{1106}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{BBB9}", - nfc: "\u{BBB9}", - nfd: "\u{1106}\u{1172}\u{11BC}", - nfkc: "\u{BBB9}", - nfkd: "\u{1106}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{BBBA}", - nfc: "\u{BBBA}", - nfd: "\u{1106}\u{1172}\u{11BD}", - nfkc: "\u{BBBA}", - nfkd: "\u{1106}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{BBBB}", - nfc: "\u{BBBB}", - nfd: "\u{1106}\u{1172}\u{11BE}", - nfkc: "\u{BBBB}", - nfkd: "\u{1106}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{BBBC}", - nfc: "\u{BBBC}", - nfd: "\u{1106}\u{1172}\u{11BF}", - nfkc: "\u{BBBC}", - nfkd: "\u{1106}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{BBBD}", - nfc: "\u{BBBD}", - nfd: "\u{1106}\u{1172}\u{11C0}", - nfkc: "\u{BBBD}", - nfkd: "\u{1106}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{BBBE}", - nfc: "\u{BBBE}", - nfd: "\u{1106}\u{1172}\u{11C1}", - nfkc: "\u{BBBE}", - nfkd: "\u{1106}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{BBBF}", - nfc: "\u{BBBF}", - nfd: "\u{1106}\u{1172}\u{11C2}", - nfkc: "\u{BBBF}", - nfkd: "\u{1106}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{BBC0}", - nfc: "\u{BBC0}", - nfd: "\u{1106}\u{1173}", - nfkc: "\u{BBC0}", - nfkd: "\u{1106}\u{1173}", - }, - NormalizationTest { - source: "\u{BBC1}", - nfc: "\u{BBC1}", - nfd: "\u{1106}\u{1173}\u{11A8}", - nfkc: "\u{BBC1}", - nfkd: "\u{1106}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{BBC2}", - nfc: "\u{BBC2}", - nfd: "\u{1106}\u{1173}\u{11A9}", - nfkc: "\u{BBC2}", - nfkd: "\u{1106}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{BBC3}", - nfc: "\u{BBC3}", - nfd: "\u{1106}\u{1173}\u{11AA}", - nfkc: "\u{BBC3}", - nfkd: "\u{1106}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{BBC4}", - nfc: "\u{BBC4}", - nfd: "\u{1106}\u{1173}\u{11AB}", - nfkc: "\u{BBC4}", - nfkd: "\u{1106}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{BBC5}", - nfc: "\u{BBC5}", - nfd: "\u{1106}\u{1173}\u{11AC}", - nfkc: "\u{BBC5}", - nfkd: "\u{1106}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{BBC6}", - nfc: "\u{BBC6}", - nfd: "\u{1106}\u{1173}\u{11AD}", - nfkc: "\u{BBC6}", - nfkd: "\u{1106}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{BBC7}", - nfc: "\u{BBC7}", - nfd: "\u{1106}\u{1173}\u{11AE}", - nfkc: "\u{BBC7}", - nfkd: "\u{1106}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{BBC8}", - nfc: "\u{BBC8}", - nfd: "\u{1106}\u{1173}\u{11AF}", - nfkc: "\u{BBC8}", - nfkd: "\u{1106}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{BBC9}", - nfc: "\u{BBC9}", - nfd: "\u{1106}\u{1173}\u{11B0}", - nfkc: "\u{BBC9}", - nfkd: "\u{1106}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{BBCA}", - nfc: "\u{BBCA}", - nfd: "\u{1106}\u{1173}\u{11B1}", - nfkc: "\u{BBCA}", - nfkd: "\u{1106}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{BBCB}", - nfc: "\u{BBCB}", - nfd: "\u{1106}\u{1173}\u{11B2}", - nfkc: "\u{BBCB}", - nfkd: "\u{1106}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{BBCC}", - nfc: "\u{BBCC}", - nfd: "\u{1106}\u{1173}\u{11B3}", - nfkc: "\u{BBCC}", - nfkd: "\u{1106}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{BBCD}", - nfc: "\u{BBCD}", - nfd: "\u{1106}\u{1173}\u{11B4}", - nfkc: "\u{BBCD}", - nfkd: "\u{1106}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{BBCE}", - nfc: "\u{BBCE}", - nfd: "\u{1106}\u{1173}\u{11B5}", - nfkc: "\u{BBCE}", - nfkd: "\u{1106}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{BBCF}", - nfc: "\u{BBCF}", - nfd: "\u{1106}\u{1173}\u{11B6}", - nfkc: "\u{BBCF}", - nfkd: "\u{1106}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{BBD0}", - nfc: "\u{BBD0}", - nfd: "\u{1106}\u{1173}\u{11B7}", - nfkc: "\u{BBD0}", - nfkd: "\u{1106}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{BBD1}", - nfc: "\u{BBD1}", - nfd: "\u{1106}\u{1173}\u{11B8}", - nfkc: "\u{BBD1}", - nfkd: "\u{1106}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{BBD2}", - nfc: "\u{BBD2}", - nfd: "\u{1106}\u{1173}\u{11B9}", - nfkc: "\u{BBD2}", - nfkd: "\u{1106}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{BBD3}", - nfc: "\u{BBD3}", - nfd: "\u{1106}\u{1173}\u{11BA}", - nfkc: "\u{BBD3}", - nfkd: "\u{1106}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{BBD4}", - nfc: "\u{BBD4}", - nfd: "\u{1106}\u{1173}\u{11BB}", - nfkc: "\u{BBD4}", - nfkd: "\u{1106}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{BBD5}", - nfc: "\u{BBD5}", - nfd: "\u{1106}\u{1173}\u{11BC}", - nfkc: "\u{BBD5}", - nfkd: "\u{1106}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{BBD6}", - nfc: "\u{BBD6}", - nfd: "\u{1106}\u{1173}\u{11BD}", - nfkc: "\u{BBD6}", - nfkd: "\u{1106}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{BBD7}", - nfc: "\u{BBD7}", - nfd: "\u{1106}\u{1173}\u{11BE}", - nfkc: "\u{BBD7}", - nfkd: "\u{1106}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{BBD8}", - nfc: "\u{BBD8}", - nfd: "\u{1106}\u{1173}\u{11BF}", - nfkc: "\u{BBD8}", - nfkd: "\u{1106}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{BBD9}", - nfc: "\u{BBD9}", - nfd: "\u{1106}\u{1173}\u{11C0}", - nfkc: "\u{BBD9}", - nfkd: "\u{1106}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{BBDA}", - nfc: "\u{BBDA}", - nfd: "\u{1106}\u{1173}\u{11C1}", - nfkc: "\u{BBDA}", - nfkd: "\u{1106}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{BBDB}", - nfc: "\u{BBDB}", - nfd: "\u{1106}\u{1173}\u{11C2}", - nfkc: "\u{BBDB}", - nfkd: "\u{1106}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{BBDC}", - nfc: "\u{BBDC}", - nfd: "\u{1106}\u{1174}", - nfkc: "\u{BBDC}", - nfkd: "\u{1106}\u{1174}", - }, - NormalizationTest { - source: "\u{BBDD}", - nfc: "\u{BBDD}", - nfd: "\u{1106}\u{1174}\u{11A8}", - nfkc: "\u{BBDD}", - nfkd: "\u{1106}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{BBDE}", - nfc: "\u{BBDE}", - nfd: "\u{1106}\u{1174}\u{11A9}", - nfkc: "\u{BBDE}", - nfkd: "\u{1106}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{BBDF}", - nfc: "\u{BBDF}", - nfd: "\u{1106}\u{1174}\u{11AA}", - nfkc: "\u{BBDF}", - nfkd: "\u{1106}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{BBE0}", - nfc: "\u{BBE0}", - nfd: "\u{1106}\u{1174}\u{11AB}", - nfkc: "\u{BBE0}", - nfkd: "\u{1106}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{BBE1}", - nfc: "\u{BBE1}", - nfd: "\u{1106}\u{1174}\u{11AC}", - nfkc: "\u{BBE1}", - nfkd: "\u{1106}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{BBE2}", - nfc: "\u{BBE2}", - nfd: "\u{1106}\u{1174}\u{11AD}", - nfkc: "\u{BBE2}", - nfkd: "\u{1106}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{BBE3}", - nfc: "\u{BBE3}", - nfd: "\u{1106}\u{1174}\u{11AE}", - nfkc: "\u{BBE3}", - nfkd: "\u{1106}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{BBE4}", - nfc: "\u{BBE4}", - nfd: "\u{1106}\u{1174}\u{11AF}", - nfkc: "\u{BBE4}", - nfkd: "\u{1106}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{BBE5}", - nfc: "\u{BBE5}", - nfd: "\u{1106}\u{1174}\u{11B0}", - nfkc: "\u{BBE5}", - nfkd: "\u{1106}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{BBE6}", - nfc: "\u{BBE6}", - nfd: "\u{1106}\u{1174}\u{11B1}", - nfkc: "\u{BBE6}", - nfkd: "\u{1106}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{BBE7}", - nfc: "\u{BBE7}", - nfd: "\u{1106}\u{1174}\u{11B2}", - nfkc: "\u{BBE7}", - nfkd: "\u{1106}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{BBE8}", - nfc: "\u{BBE8}", - nfd: "\u{1106}\u{1174}\u{11B3}", - nfkc: "\u{BBE8}", - nfkd: "\u{1106}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{BBE9}", - nfc: "\u{BBE9}", - nfd: "\u{1106}\u{1174}\u{11B4}", - nfkc: "\u{BBE9}", - nfkd: "\u{1106}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{BBEA}", - nfc: "\u{BBEA}", - nfd: "\u{1106}\u{1174}\u{11B5}", - nfkc: "\u{BBEA}", - nfkd: "\u{1106}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{BBEB}", - nfc: "\u{BBEB}", - nfd: "\u{1106}\u{1174}\u{11B6}", - nfkc: "\u{BBEB}", - nfkd: "\u{1106}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{BBEC}", - nfc: "\u{BBEC}", - nfd: "\u{1106}\u{1174}\u{11B7}", - nfkc: "\u{BBEC}", - nfkd: "\u{1106}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{BBED}", - nfc: "\u{BBED}", - nfd: "\u{1106}\u{1174}\u{11B8}", - nfkc: "\u{BBED}", - nfkd: "\u{1106}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{BBEE}", - nfc: "\u{BBEE}", - nfd: "\u{1106}\u{1174}\u{11B9}", - nfkc: "\u{BBEE}", - nfkd: "\u{1106}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{BBEF}", - nfc: "\u{BBEF}", - nfd: "\u{1106}\u{1174}\u{11BA}", - nfkc: "\u{BBEF}", - nfkd: "\u{1106}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{BBF0}", - nfc: "\u{BBF0}", - nfd: "\u{1106}\u{1174}\u{11BB}", - nfkc: "\u{BBF0}", - nfkd: "\u{1106}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{BBF1}", - nfc: "\u{BBF1}", - nfd: "\u{1106}\u{1174}\u{11BC}", - nfkc: "\u{BBF1}", - nfkd: "\u{1106}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{BBF2}", - nfc: "\u{BBF2}", - nfd: "\u{1106}\u{1174}\u{11BD}", - nfkc: "\u{BBF2}", - nfkd: "\u{1106}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{BBF3}", - nfc: "\u{BBF3}", - nfd: "\u{1106}\u{1174}\u{11BE}", - nfkc: "\u{BBF3}", - nfkd: "\u{1106}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{BBF4}", - nfc: "\u{BBF4}", - nfd: "\u{1106}\u{1174}\u{11BF}", - nfkc: "\u{BBF4}", - nfkd: "\u{1106}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{BBF5}", - nfc: "\u{BBF5}", - nfd: "\u{1106}\u{1174}\u{11C0}", - nfkc: "\u{BBF5}", - nfkd: "\u{1106}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{BBF6}", - nfc: "\u{BBF6}", - nfd: "\u{1106}\u{1174}\u{11C1}", - nfkc: "\u{BBF6}", - nfkd: "\u{1106}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{BBF7}", - nfc: "\u{BBF7}", - nfd: "\u{1106}\u{1174}\u{11C2}", - nfkc: "\u{BBF7}", - nfkd: "\u{1106}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{BBF8}", - nfc: "\u{BBF8}", - nfd: "\u{1106}\u{1175}", - nfkc: "\u{BBF8}", - nfkd: "\u{1106}\u{1175}", - }, - NormalizationTest { - source: "\u{BBF9}", - nfc: "\u{BBF9}", - nfd: "\u{1106}\u{1175}\u{11A8}", - nfkc: "\u{BBF9}", - nfkd: "\u{1106}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{BBFA}", - nfc: "\u{BBFA}", - nfd: "\u{1106}\u{1175}\u{11A9}", - nfkc: "\u{BBFA}", - nfkd: "\u{1106}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{BBFB}", - nfc: "\u{BBFB}", - nfd: "\u{1106}\u{1175}\u{11AA}", - nfkc: "\u{BBFB}", - nfkd: "\u{1106}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{BBFC}", - nfc: "\u{BBFC}", - nfd: "\u{1106}\u{1175}\u{11AB}", - nfkc: "\u{BBFC}", - nfkd: "\u{1106}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{BBFD}", - nfc: "\u{BBFD}", - nfd: "\u{1106}\u{1175}\u{11AC}", - nfkc: "\u{BBFD}", - nfkd: "\u{1106}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{BBFE}", - nfc: "\u{BBFE}", - nfd: "\u{1106}\u{1175}\u{11AD}", - nfkc: "\u{BBFE}", - nfkd: "\u{1106}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{BBFF}", - nfc: "\u{BBFF}", - nfd: "\u{1106}\u{1175}\u{11AE}", - nfkc: "\u{BBFF}", - nfkd: "\u{1106}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{BC00}", - nfc: "\u{BC00}", - nfd: "\u{1106}\u{1175}\u{11AF}", - nfkc: "\u{BC00}", - nfkd: "\u{1106}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{BC01}", - nfc: "\u{BC01}", - nfd: "\u{1106}\u{1175}\u{11B0}", - nfkc: "\u{BC01}", - nfkd: "\u{1106}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{BC02}", - nfc: "\u{BC02}", - nfd: "\u{1106}\u{1175}\u{11B1}", - nfkc: "\u{BC02}", - nfkd: "\u{1106}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{BC03}", - nfc: "\u{BC03}", - nfd: "\u{1106}\u{1175}\u{11B2}", - nfkc: "\u{BC03}", - nfkd: "\u{1106}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{BC04}", - nfc: "\u{BC04}", - nfd: "\u{1106}\u{1175}\u{11B3}", - nfkc: "\u{BC04}", - nfkd: "\u{1106}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{BC05}", - nfc: "\u{BC05}", - nfd: "\u{1106}\u{1175}\u{11B4}", - nfkc: "\u{BC05}", - nfkd: "\u{1106}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{BC06}", - nfc: "\u{BC06}", - nfd: "\u{1106}\u{1175}\u{11B5}", - nfkc: "\u{BC06}", - nfkd: "\u{1106}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{BC07}", - nfc: "\u{BC07}", - nfd: "\u{1106}\u{1175}\u{11B6}", - nfkc: "\u{BC07}", - nfkd: "\u{1106}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{BC08}", - nfc: "\u{BC08}", - nfd: "\u{1106}\u{1175}\u{11B7}", - nfkc: "\u{BC08}", - nfkd: "\u{1106}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{BC09}", - nfc: "\u{BC09}", - nfd: "\u{1106}\u{1175}\u{11B8}", - nfkc: "\u{BC09}", - nfkd: "\u{1106}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{BC0A}", - nfc: "\u{BC0A}", - nfd: "\u{1106}\u{1175}\u{11B9}", - nfkc: "\u{BC0A}", - nfkd: "\u{1106}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{BC0B}", - nfc: "\u{BC0B}", - nfd: "\u{1106}\u{1175}\u{11BA}", - nfkc: "\u{BC0B}", - nfkd: "\u{1106}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{BC0C}", - nfc: "\u{BC0C}", - nfd: "\u{1106}\u{1175}\u{11BB}", - nfkc: "\u{BC0C}", - nfkd: "\u{1106}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{BC0D}", - nfc: "\u{BC0D}", - nfd: "\u{1106}\u{1175}\u{11BC}", - nfkc: "\u{BC0D}", - nfkd: "\u{1106}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{BC0E}", - nfc: "\u{BC0E}", - nfd: "\u{1106}\u{1175}\u{11BD}", - nfkc: "\u{BC0E}", - nfkd: "\u{1106}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{BC0F}", - nfc: "\u{BC0F}", - nfd: "\u{1106}\u{1175}\u{11BE}", - nfkc: "\u{BC0F}", - nfkd: "\u{1106}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{BC10}", - nfc: "\u{BC10}", - nfd: "\u{1106}\u{1175}\u{11BF}", - nfkc: "\u{BC10}", - nfkd: "\u{1106}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{BC11}", - nfc: "\u{BC11}", - nfd: "\u{1106}\u{1175}\u{11C0}", - nfkc: "\u{BC11}", - nfkd: "\u{1106}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{BC12}", - nfc: "\u{BC12}", - nfd: "\u{1106}\u{1175}\u{11C1}", - nfkc: "\u{BC12}", - nfkd: "\u{1106}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{BC13}", - nfc: "\u{BC13}", - nfd: "\u{1106}\u{1175}\u{11C2}", - nfkc: "\u{BC13}", - nfkd: "\u{1106}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{BC14}", - nfc: "\u{BC14}", - nfd: "\u{1107}\u{1161}", - nfkc: "\u{BC14}", - nfkd: "\u{1107}\u{1161}", - }, - NormalizationTest { - source: "\u{BC15}", - nfc: "\u{BC15}", - nfd: "\u{1107}\u{1161}\u{11A8}", - nfkc: "\u{BC15}", - nfkd: "\u{1107}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{BC16}", - nfc: "\u{BC16}", - nfd: "\u{1107}\u{1161}\u{11A9}", - nfkc: "\u{BC16}", - nfkd: "\u{1107}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{BC17}", - nfc: "\u{BC17}", - nfd: "\u{1107}\u{1161}\u{11AA}", - nfkc: "\u{BC17}", - nfkd: "\u{1107}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{BC18}", - nfc: "\u{BC18}", - nfd: "\u{1107}\u{1161}\u{11AB}", - nfkc: "\u{BC18}", - nfkd: "\u{1107}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{BC19}", - nfc: "\u{BC19}", - nfd: "\u{1107}\u{1161}\u{11AC}", - nfkc: "\u{BC19}", - nfkd: "\u{1107}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{BC1A}", - nfc: "\u{BC1A}", - nfd: "\u{1107}\u{1161}\u{11AD}", - nfkc: "\u{BC1A}", - nfkd: "\u{1107}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{BC1B}", - nfc: "\u{BC1B}", - nfd: "\u{1107}\u{1161}\u{11AE}", - nfkc: "\u{BC1B}", - nfkd: "\u{1107}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{BC1C}", - nfc: "\u{BC1C}", - nfd: "\u{1107}\u{1161}\u{11AF}", - nfkc: "\u{BC1C}", - nfkd: "\u{1107}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{BC1D}", - nfc: "\u{BC1D}", - nfd: "\u{1107}\u{1161}\u{11B0}", - nfkc: "\u{BC1D}", - nfkd: "\u{1107}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{BC1E}", - nfc: "\u{BC1E}", - nfd: "\u{1107}\u{1161}\u{11B1}", - nfkc: "\u{BC1E}", - nfkd: "\u{1107}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{BC1F}", - nfc: "\u{BC1F}", - nfd: "\u{1107}\u{1161}\u{11B2}", - nfkc: "\u{BC1F}", - nfkd: "\u{1107}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{BC20}", - nfc: "\u{BC20}", - nfd: "\u{1107}\u{1161}\u{11B3}", - nfkc: "\u{BC20}", - nfkd: "\u{1107}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{BC21}", - nfc: "\u{BC21}", - nfd: "\u{1107}\u{1161}\u{11B4}", - nfkc: "\u{BC21}", - nfkd: "\u{1107}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{BC22}", - nfc: "\u{BC22}", - nfd: "\u{1107}\u{1161}\u{11B5}", - nfkc: "\u{BC22}", - nfkd: "\u{1107}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{BC23}", - nfc: "\u{BC23}", - nfd: "\u{1107}\u{1161}\u{11B6}", - nfkc: "\u{BC23}", - nfkd: "\u{1107}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{BC24}", - nfc: "\u{BC24}", - nfd: "\u{1107}\u{1161}\u{11B7}", - nfkc: "\u{BC24}", - nfkd: "\u{1107}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{BC25}", - nfc: "\u{BC25}", - nfd: "\u{1107}\u{1161}\u{11B8}", - nfkc: "\u{BC25}", - nfkd: "\u{1107}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{BC26}", - nfc: "\u{BC26}", - nfd: "\u{1107}\u{1161}\u{11B9}", - nfkc: "\u{BC26}", - nfkd: "\u{1107}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{BC27}", - nfc: "\u{BC27}", - nfd: "\u{1107}\u{1161}\u{11BA}", - nfkc: "\u{BC27}", - nfkd: "\u{1107}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{BC28}", - nfc: "\u{BC28}", - nfd: "\u{1107}\u{1161}\u{11BB}", - nfkc: "\u{BC28}", - nfkd: "\u{1107}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{BC29}", - nfc: "\u{BC29}", - nfd: "\u{1107}\u{1161}\u{11BC}", - nfkc: "\u{BC29}", - nfkd: "\u{1107}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{BC2A}", - nfc: "\u{BC2A}", - nfd: "\u{1107}\u{1161}\u{11BD}", - nfkc: "\u{BC2A}", - nfkd: "\u{1107}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{BC2B}", - nfc: "\u{BC2B}", - nfd: "\u{1107}\u{1161}\u{11BE}", - nfkc: "\u{BC2B}", - nfkd: "\u{1107}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{BC2C}", - nfc: "\u{BC2C}", - nfd: "\u{1107}\u{1161}\u{11BF}", - nfkc: "\u{BC2C}", - nfkd: "\u{1107}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{BC2D}", - nfc: "\u{BC2D}", - nfd: "\u{1107}\u{1161}\u{11C0}", - nfkc: "\u{BC2D}", - nfkd: "\u{1107}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{BC2E}", - nfc: "\u{BC2E}", - nfd: "\u{1107}\u{1161}\u{11C1}", - nfkc: "\u{BC2E}", - nfkd: "\u{1107}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{BC2F}", - nfc: "\u{BC2F}", - nfd: "\u{1107}\u{1161}\u{11C2}", - nfkc: "\u{BC2F}", - nfkd: "\u{1107}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{BC30}", - nfc: "\u{BC30}", - nfd: "\u{1107}\u{1162}", - nfkc: "\u{BC30}", - nfkd: "\u{1107}\u{1162}", - }, - NormalizationTest { - source: "\u{BC31}", - nfc: "\u{BC31}", - nfd: "\u{1107}\u{1162}\u{11A8}", - nfkc: "\u{BC31}", - nfkd: "\u{1107}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{BC32}", - nfc: "\u{BC32}", - nfd: "\u{1107}\u{1162}\u{11A9}", - nfkc: "\u{BC32}", - nfkd: "\u{1107}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{BC33}", - nfc: "\u{BC33}", - nfd: "\u{1107}\u{1162}\u{11AA}", - nfkc: "\u{BC33}", - nfkd: "\u{1107}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{BC34}", - nfc: "\u{BC34}", - nfd: "\u{1107}\u{1162}\u{11AB}", - nfkc: "\u{BC34}", - nfkd: "\u{1107}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{BC35}", - nfc: "\u{BC35}", - nfd: "\u{1107}\u{1162}\u{11AC}", - nfkc: "\u{BC35}", - nfkd: "\u{1107}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{BC36}", - nfc: "\u{BC36}", - nfd: "\u{1107}\u{1162}\u{11AD}", - nfkc: "\u{BC36}", - nfkd: "\u{1107}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{BC37}", - nfc: "\u{BC37}", - nfd: "\u{1107}\u{1162}\u{11AE}", - nfkc: "\u{BC37}", - nfkd: "\u{1107}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{BC38}", - nfc: "\u{BC38}", - nfd: "\u{1107}\u{1162}\u{11AF}", - nfkc: "\u{BC38}", - nfkd: "\u{1107}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{BC39}", - nfc: "\u{BC39}", - nfd: "\u{1107}\u{1162}\u{11B0}", - nfkc: "\u{BC39}", - nfkd: "\u{1107}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{BC3A}", - nfc: "\u{BC3A}", - nfd: "\u{1107}\u{1162}\u{11B1}", - nfkc: "\u{BC3A}", - nfkd: "\u{1107}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{BC3B}", - nfc: "\u{BC3B}", - nfd: "\u{1107}\u{1162}\u{11B2}", - nfkc: "\u{BC3B}", - nfkd: "\u{1107}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{BC3C}", - nfc: "\u{BC3C}", - nfd: "\u{1107}\u{1162}\u{11B3}", - nfkc: "\u{BC3C}", - nfkd: "\u{1107}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{BC3D}", - nfc: "\u{BC3D}", - nfd: "\u{1107}\u{1162}\u{11B4}", - nfkc: "\u{BC3D}", - nfkd: "\u{1107}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{BC3E}", - nfc: "\u{BC3E}", - nfd: "\u{1107}\u{1162}\u{11B5}", - nfkc: "\u{BC3E}", - nfkd: "\u{1107}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{BC3F}", - nfc: "\u{BC3F}", - nfd: "\u{1107}\u{1162}\u{11B6}", - nfkc: "\u{BC3F}", - nfkd: "\u{1107}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{BC40}", - nfc: "\u{BC40}", - nfd: "\u{1107}\u{1162}\u{11B7}", - nfkc: "\u{BC40}", - nfkd: "\u{1107}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{BC41}", - nfc: "\u{BC41}", - nfd: "\u{1107}\u{1162}\u{11B8}", - nfkc: "\u{BC41}", - nfkd: "\u{1107}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{BC42}", - nfc: "\u{BC42}", - nfd: "\u{1107}\u{1162}\u{11B9}", - nfkc: "\u{BC42}", - nfkd: "\u{1107}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{BC43}", - nfc: "\u{BC43}", - nfd: "\u{1107}\u{1162}\u{11BA}", - nfkc: "\u{BC43}", - nfkd: "\u{1107}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{BC44}", - nfc: "\u{BC44}", - nfd: "\u{1107}\u{1162}\u{11BB}", - nfkc: "\u{BC44}", - nfkd: "\u{1107}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{BC45}", - nfc: "\u{BC45}", - nfd: "\u{1107}\u{1162}\u{11BC}", - nfkc: "\u{BC45}", - nfkd: "\u{1107}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{BC46}", - nfc: "\u{BC46}", - nfd: "\u{1107}\u{1162}\u{11BD}", - nfkc: "\u{BC46}", - nfkd: "\u{1107}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{BC47}", - nfc: "\u{BC47}", - nfd: "\u{1107}\u{1162}\u{11BE}", - nfkc: "\u{BC47}", - nfkd: "\u{1107}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{BC48}", - nfc: "\u{BC48}", - nfd: "\u{1107}\u{1162}\u{11BF}", - nfkc: "\u{BC48}", - nfkd: "\u{1107}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{BC49}", - nfc: "\u{BC49}", - nfd: "\u{1107}\u{1162}\u{11C0}", - nfkc: "\u{BC49}", - nfkd: "\u{1107}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{BC4A}", - nfc: "\u{BC4A}", - nfd: "\u{1107}\u{1162}\u{11C1}", - nfkc: "\u{BC4A}", - nfkd: "\u{1107}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{BC4B}", - nfc: "\u{BC4B}", - nfd: "\u{1107}\u{1162}\u{11C2}", - nfkc: "\u{BC4B}", - nfkd: "\u{1107}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{BC4C}", - nfc: "\u{BC4C}", - nfd: "\u{1107}\u{1163}", - nfkc: "\u{BC4C}", - nfkd: "\u{1107}\u{1163}", - }, - NormalizationTest { - source: "\u{BC4D}", - nfc: "\u{BC4D}", - nfd: "\u{1107}\u{1163}\u{11A8}", - nfkc: "\u{BC4D}", - nfkd: "\u{1107}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{BC4E}", - nfc: "\u{BC4E}", - nfd: "\u{1107}\u{1163}\u{11A9}", - nfkc: "\u{BC4E}", - nfkd: "\u{1107}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{BC4F}", - nfc: "\u{BC4F}", - nfd: "\u{1107}\u{1163}\u{11AA}", - nfkc: "\u{BC4F}", - nfkd: "\u{1107}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{BC50}", - nfc: "\u{BC50}", - nfd: "\u{1107}\u{1163}\u{11AB}", - nfkc: "\u{BC50}", - nfkd: "\u{1107}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{BC51}", - nfc: "\u{BC51}", - nfd: "\u{1107}\u{1163}\u{11AC}", - nfkc: "\u{BC51}", - nfkd: "\u{1107}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{BC52}", - nfc: "\u{BC52}", - nfd: "\u{1107}\u{1163}\u{11AD}", - nfkc: "\u{BC52}", - nfkd: "\u{1107}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{BC53}", - nfc: "\u{BC53}", - nfd: "\u{1107}\u{1163}\u{11AE}", - nfkc: "\u{BC53}", - nfkd: "\u{1107}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{BC54}", - nfc: "\u{BC54}", - nfd: "\u{1107}\u{1163}\u{11AF}", - nfkc: "\u{BC54}", - nfkd: "\u{1107}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{BC55}", - nfc: "\u{BC55}", - nfd: "\u{1107}\u{1163}\u{11B0}", - nfkc: "\u{BC55}", - nfkd: "\u{1107}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{BC56}", - nfc: "\u{BC56}", - nfd: "\u{1107}\u{1163}\u{11B1}", - nfkc: "\u{BC56}", - nfkd: "\u{1107}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{BC57}", - nfc: "\u{BC57}", - nfd: "\u{1107}\u{1163}\u{11B2}", - nfkc: "\u{BC57}", - nfkd: "\u{1107}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{BC58}", - nfc: "\u{BC58}", - nfd: "\u{1107}\u{1163}\u{11B3}", - nfkc: "\u{BC58}", - nfkd: "\u{1107}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{BC59}", - nfc: "\u{BC59}", - nfd: "\u{1107}\u{1163}\u{11B4}", - nfkc: "\u{BC59}", - nfkd: "\u{1107}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{BC5A}", - nfc: "\u{BC5A}", - nfd: "\u{1107}\u{1163}\u{11B5}", - nfkc: "\u{BC5A}", - nfkd: "\u{1107}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{BC5B}", - nfc: "\u{BC5B}", - nfd: "\u{1107}\u{1163}\u{11B6}", - nfkc: "\u{BC5B}", - nfkd: "\u{1107}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{BC5C}", - nfc: "\u{BC5C}", - nfd: "\u{1107}\u{1163}\u{11B7}", - nfkc: "\u{BC5C}", - nfkd: "\u{1107}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{BC5D}", - nfc: "\u{BC5D}", - nfd: "\u{1107}\u{1163}\u{11B8}", - nfkc: "\u{BC5D}", - nfkd: "\u{1107}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{BC5E}", - nfc: "\u{BC5E}", - nfd: "\u{1107}\u{1163}\u{11B9}", - nfkc: "\u{BC5E}", - nfkd: "\u{1107}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{BC5F}", - nfc: "\u{BC5F}", - nfd: "\u{1107}\u{1163}\u{11BA}", - nfkc: "\u{BC5F}", - nfkd: "\u{1107}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{BC60}", - nfc: "\u{BC60}", - nfd: "\u{1107}\u{1163}\u{11BB}", - nfkc: "\u{BC60}", - nfkd: "\u{1107}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{BC61}", - nfc: "\u{BC61}", - nfd: "\u{1107}\u{1163}\u{11BC}", - nfkc: "\u{BC61}", - nfkd: "\u{1107}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{BC62}", - nfc: "\u{BC62}", - nfd: "\u{1107}\u{1163}\u{11BD}", - nfkc: "\u{BC62}", - nfkd: "\u{1107}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{BC63}", - nfc: "\u{BC63}", - nfd: "\u{1107}\u{1163}\u{11BE}", - nfkc: "\u{BC63}", - nfkd: "\u{1107}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{BC64}", - nfc: "\u{BC64}", - nfd: "\u{1107}\u{1163}\u{11BF}", - nfkc: "\u{BC64}", - nfkd: "\u{1107}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{BC65}", - nfc: "\u{BC65}", - nfd: "\u{1107}\u{1163}\u{11C0}", - nfkc: "\u{BC65}", - nfkd: "\u{1107}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{BC66}", - nfc: "\u{BC66}", - nfd: "\u{1107}\u{1163}\u{11C1}", - nfkc: "\u{BC66}", - nfkd: "\u{1107}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{BC67}", - nfc: "\u{BC67}", - nfd: "\u{1107}\u{1163}\u{11C2}", - nfkc: "\u{BC67}", - nfkd: "\u{1107}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{BC68}", - nfc: "\u{BC68}", - nfd: "\u{1107}\u{1164}", - nfkc: "\u{BC68}", - nfkd: "\u{1107}\u{1164}", - }, - NormalizationTest { - source: "\u{BC69}", - nfc: "\u{BC69}", - nfd: "\u{1107}\u{1164}\u{11A8}", - nfkc: "\u{BC69}", - nfkd: "\u{1107}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{BC6A}", - nfc: "\u{BC6A}", - nfd: "\u{1107}\u{1164}\u{11A9}", - nfkc: "\u{BC6A}", - nfkd: "\u{1107}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{BC6B}", - nfc: "\u{BC6B}", - nfd: "\u{1107}\u{1164}\u{11AA}", - nfkc: "\u{BC6B}", - nfkd: "\u{1107}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{BC6C}", - nfc: "\u{BC6C}", - nfd: "\u{1107}\u{1164}\u{11AB}", - nfkc: "\u{BC6C}", - nfkd: "\u{1107}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{BC6D}", - nfc: "\u{BC6D}", - nfd: "\u{1107}\u{1164}\u{11AC}", - nfkc: "\u{BC6D}", - nfkd: "\u{1107}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{BC6E}", - nfc: "\u{BC6E}", - nfd: "\u{1107}\u{1164}\u{11AD}", - nfkc: "\u{BC6E}", - nfkd: "\u{1107}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{BC6F}", - nfc: "\u{BC6F}", - nfd: "\u{1107}\u{1164}\u{11AE}", - nfkc: "\u{BC6F}", - nfkd: "\u{1107}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{BC70}", - nfc: "\u{BC70}", - nfd: "\u{1107}\u{1164}\u{11AF}", - nfkc: "\u{BC70}", - nfkd: "\u{1107}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{BC71}", - nfc: "\u{BC71}", - nfd: "\u{1107}\u{1164}\u{11B0}", - nfkc: "\u{BC71}", - nfkd: "\u{1107}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{BC72}", - nfc: "\u{BC72}", - nfd: "\u{1107}\u{1164}\u{11B1}", - nfkc: "\u{BC72}", - nfkd: "\u{1107}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{BC73}", - nfc: "\u{BC73}", - nfd: "\u{1107}\u{1164}\u{11B2}", - nfkc: "\u{BC73}", - nfkd: "\u{1107}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{BC74}", - nfc: "\u{BC74}", - nfd: "\u{1107}\u{1164}\u{11B3}", - nfkc: "\u{BC74}", - nfkd: "\u{1107}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{BC75}", - nfc: "\u{BC75}", - nfd: "\u{1107}\u{1164}\u{11B4}", - nfkc: "\u{BC75}", - nfkd: "\u{1107}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{BC76}", - nfc: "\u{BC76}", - nfd: "\u{1107}\u{1164}\u{11B5}", - nfkc: "\u{BC76}", - nfkd: "\u{1107}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{BC77}", - nfc: "\u{BC77}", - nfd: "\u{1107}\u{1164}\u{11B6}", - nfkc: "\u{BC77}", - nfkd: "\u{1107}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{BC78}", - nfc: "\u{BC78}", - nfd: "\u{1107}\u{1164}\u{11B7}", - nfkc: "\u{BC78}", - nfkd: "\u{1107}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{BC79}", - nfc: "\u{BC79}", - nfd: "\u{1107}\u{1164}\u{11B8}", - nfkc: "\u{BC79}", - nfkd: "\u{1107}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{BC7A}", - nfc: "\u{BC7A}", - nfd: "\u{1107}\u{1164}\u{11B9}", - nfkc: "\u{BC7A}", - nfkd: "\u{1107}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{BC7B}", - nfc: "\u{BC7B}", - nfd: "\u{1107}\u{1164}\u{11BA}", - nfkc: "\u{BC7B}", - nfkd: "\u{1107}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{BC7C}", - nfc: "\u{BC7C}", - nfd: "\u{1107}\u{1164}\u{11BB}", - nfkc: "\u{BC7C}", - nfkd: "\u{1107}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{BC7D}", - nfc: "\u{BC7D}", - nfd: "\u{1107}\u{1164}\u{11BC}", - nfkc: "\u{BC7D}", - nfkd: "\u{1107}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{BC7E}", - nfc: "\u{BC7E}", - nfd: "\u{1107}\u{1164}\u{11BD}", - nfkc: "\u{BC7E}", - nfkd: "\u{1107}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{BC7F}", - nfc: "\u{BC7F}", - nfd: "\u{1107}\u{1164}\u{11BE}", - nfkc: "\u{BC7F}", - nfkd: "\u{1107}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{BC80}", - nfc: "\u{BC80}", - nfd: "\u{1107}\u{1164}\u{11BF}", - nfkc: "\u{BC80}", - nfkd: "\u{1107}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{BC81}", - nfc: "\u{BC81}", - nfd: "\u{1107}\u{1164}\u{11C0}", - nfkc: "\u{BC81}", - nfkd: "\u{1107}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{BC82}", - nfc: "\u{BC82}", - nfd: "\u{1107}\u{1164}\u{11C1}", - nfkc: "\u{BC82}", - nfkd: "\u{1107}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{BC83}", - nfc: "\u{BC83}", - nfd: "\u{1107}\u{1164}\u{11C2}", - nfkc: "\u{BC83}", - nfkd: "\u{1107}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{BC84}", - nfc: "\u{BC84}", - nfd: "\u{1107}\u{1165}", - nfkc: "\u{BC84}", - nfkd: "\u{1107}\u{1165}", - }, - NormalizationTest { - source: "\u{BC85}", - nfc: "\u{BC85}", - nfd: "\u{1107}\u{1165}\u{11A8}", - nfkc: "\u{BC85}", - nfkd: "\u{1107}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{BC86}", - nfc: "\u{BC86}", - nfd: "\u{1107}\u{1165}\u{11A9}", - nfkc: "\u{BC86}", - nfkd: "\u{1107}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{BC87}", - nfc: "\u{BC87}", - nfd: "\u{1107}\u{1165}\u{11AA}", - nfkc: "\u{BC87}", - nfkd: "\u{1107}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{BC88}", - nfc: "\u{BC88}", - nfd: "\u{1107}\u{1165}\u{11AB}", - nfkc: "\u{BC88}", - nfkd: "\u{1107}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{BC89}", - nfc: "\u{BC89}", - nfd: "\u{1107}\u{1165}\u{11AC}", - nfkc: "\u{BC89}", - nfkd: "\u{1107}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{BC8A}", - nfc: "\u{BC8A}", - nfd: "\u{1107}\u{1165}\u{11AD}", - nfkc: "\u{BC8A}", - nfkd: "\u{1107}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{BC8B}", - nfc: "\u{BC8B}", - nfd: "\u{1107}\u{1165}\u{11AE}", - nfkc: "\u{BC8B}", - nfkd: "\u{1107}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{BC8C}", - nfc: "\u{BC8C}", - nfd: "\u{1107}\u{1165}\u{11AF}", - nfkc: "\u{BC8C}", - nfkd: "\u{1107}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{BC8D}", - nfc: "\u{BC8D}", - nfd: "\u{1107}\u{1165}\u{11B0}", - nfkc: "\u{BC8D}", - nfkd: "\u{1107}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{BC8E}", - nfc: "\u{BC8E}", - nfd: "\u{1107}\u{1165}\u{11B1}", - nfkc: "\u{BC8E}", - nfkd: "\u{1107}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{BC8F}", - nfc: "\u{BC8F}", - nfd: "\u{1107}\u{1165}\u{11B2}", - nfkc: "\u{BC8F}", - nfkd: "\u{1107}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{BC90}", - nfc: "\u{BC90}", - nfd: "\u{1107}\u{1165}\u{11B3}", - nfkc: "\u{BC90}", - nfkd: "\u{1107}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{BC91}", - nfc: "\u{BC91}", - nfd: "\u{1107}\u{1165}\u{11B4}", - nfkc: "\u{BC91}", - nfkd: "\u{1107}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{BC92}", - nfc: "\u{BC92}", - nfd: "\u{1107}\u{1165}\u{11B5}", - nfkc: "\u{BC92}", - nfkd: "\u{1107}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{BC93}", - nfc: "\u{BC93}", - nfd: "\u{1107}\u{1165}\u{11B6}", - nfkc: "\u{BC93}", - nfkd: "\u{1107}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{BC94}", - nfc: "\u{BC94}", - nfd: "\u{1107}\u{1165}\u{11B7}", - nfkc: "\u{BC94}", - nfkd: "\u{1107}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{BC95}", - nfc: "\u{BC95}", - nfd: "\u{1107}\u{1165}\u{11B8}", - nfkc: "\u{BC95}", - nfkd: "\u{1107}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{BC96}", - nfc: "\u{BC96}", - nfd: "\u{1107}\u{1165}\u{11B9}", - nfkc: "\u{BC96}", - nfkd: "\u{1107}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{BC97}", - nfc: "\u{BC97}", - nfd: "\u{1107}\u{1165}\u{11BA}", - nfkc: "\u{BC97}", - nfkd: "\u{1107}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{BC98}", - nfc: "\u{BC98}", - nfd: "\u{1107}\u{1165}\u{11BB}", - nfkc: "\u{BC98}", - nfkd: "\u{1107}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{BC99}", - nfc: "\u{BC99}", - nfd: "\u{1107}\u{1165}\u{11BC}", - nfkc: "\u{BC99}", - nfkd: "\u{1107}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{BC9A}", - nfc: "\u{BC9A}", - nfd: "\u{1107}\u{1165}\u{11BD}", - nfkc: "\u{BC9A}", - nfkd: "\u{1107}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{BC9B}", - nfc: "\u{BC9B}", - nfd: "\u{1107}\u{1165}\u{11BE}", - nfkc: "\u{BC9B}", - nfkd: "\u{1107}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{BC9C}", - nfc: "\u{BC9C}", - nfd: "\u{1107}\u{1165}\u{11BF}", - nfkc: "\u{BC9C}", - nfkd: "\u{1107}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{BC9D}", - nfc: "\u{BC9D}", - nfd: "\u{1107}\u{1165}\u{11C0}", - nfkc: "\u{BC9D}", - nfkd: "\u{1107}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{BC9E}", - nfc: "\u{BC9E}", - nfd: "\u{1107}\u{1165}\u{11C1}", - nfkc: "\u{BC9E}", - nfkd: "\u{1107}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{BC9F}", - nfc: "\u{BC9F}", - nfd: "\u{1107}\u{1165}\u{11C2}", - nfkc: "\u{BC9F}", - nfkd: "\u{1107}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{BCA0}", - nfc: "\u{BCA0}", - nfd: "\u{1107}\u{1166}", - nfkc: "\u{BCA0}", - nfkd: "\u{1107}\u{1166}", - }, - NormalizationTest { - source: "\u{BCA1}", - nfc: "\u{BCA1}", - nfd: "\u{1107}\u{1166}\u{11A8}", - nfkc: "\u{BCA1}", - nfkd: "\u{1107}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{BCA2}", - nfc: "\u{BCA2}", - nfd: "\u{1107}\u{1166}\u{11A9}", - nfkc: "\u{BCA2}", - nfkd: "\u{1107}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{BCA3}", - nfc: "\u{BCA3}", - nfd: "\u{1107}\u{1166}\u{11AA}", - nfkc: "\u{BCA3}", - nfkd: "\u{1107}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{BCA4}", - nfc: "\u{BCA4}", - nfd: "\u{1107}\u{1166}\u{11AB}", - nfkc: "\u{BCA4}", - nfkd: "\u{1107}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{BCA5}", - nfc: "\u{BCA5}", - nfd: "\u{1107}\u{1166}\u{11AC}", - nfkc: "\u{BCA5}", - nfkd: "\u{1107}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{BCA6}", - nfc: "\u{BCA6}", - nfd: "\u{1107}\u{1166}\u{11AD}", - nfkc: "\u{BCA6}", - nfkd: "\u{1107}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{BCA7}", - nfc: "\u{BCA7}", - nfd: "\u{1107}\u{1166}\u{11AE}", - nfkc: "\u{BCA7}", - nfkd: "\u{1107}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{BCA8}", - nfc: "\u{BCA8}", - nfd: "\u{1107}\u{1166}\u{11AF}", - nfkc: "\u{BCA8}", - nfkd: "\u{1107}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{BCA9}", - nfc: "\u{BCA9}", - nfd: "\u{1107}\u{1166}\u{11B0}", - nfkc: "\u{BCA9}", - nfkd: "\u{1107}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{BCAA}", - nfc: "\u{BCAA}", - nfd: "\u{1107}\u{1166}\u{11B1}", - nfkc: "\u{BCAA}", - nfkd: "\u{1107}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{BCAB}", - nfc: "\u{BCAB}", - nfd: "\u{1107}\u{1166}\u{11B2}", - nfkc: "\u{BCAB}", - nfkd: "\u{1107}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{BCAC}", - nfc: "\u{BCAC}", - nfd: "\u{1107}\u{1166}\u{11B3}", - nfkc: "\u{BCAC}", - nfkd: "\u{1107}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{BCAD}", - nfc: "\u{BCAD}", - nfd: "\u{1107}\u{1166}\u{11B4}", - nfkc: "\u{BCAD}", - nfkd: "\u{1107}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{BCAE}", - nfc: "\u{BCAE}", - nfd: "\u{1107}\u{1166}\u{11B5}", - nfkc: "\u{BCAE}", - nfkd: "\u{1107}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{BCAF}", - nfc: "\u{BCAF}", - nfd: "\u{1107}\u{1166}\u{11B6}", - nfkc: "\u{BCAF}", - nfkd: "\u{1107}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{BCB0}", - nfc: "\u{BCB0}", - nfd: "\u{1107}\u{1166}\u{11B7}", - nfkc: "\u{BCB0}", - nfkd: "\u{1107}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{BCB1}", - nfc: "\u{BCB1}", - nfd: "\u{1107}\u{1166}\u{11B8}", - nfkc: "\u{BCB1}", - nfkd: "\u{1107}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{BCB2}", - nfc: "\u{BCB2}", - nfd: "\u{1107}\u{1166}\u{11B9}", - nfkc: "\u{BCB2}", - nfkd: "\u{1107}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{BCB3}", - nfc: "\u{BCB3}", - nfd: "\u{1107}\u{1166}\u{11BA}", - nfkc: "\u{BCB3}", - nfkd: "\u{1107}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{BCB4}", - nfc: "\u{BCB4}", - nfd: "\u{1107}\u{1166}\u{11BB}", - nfkc: "\u{BCB4}", - nfkd: "\u{1107}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{BCB5}", - nfc: "\u{BCB5}", - nfd: "\u{1107}\u{1166}\u{11BC}", - nfkc: "\u{BCB5}", - nfkd: "\u{1107}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{BCB6}", - nfc: "\u{BCB6}", - nfd: "\u{1107}\u{1166}\u{11BD}", - nfkc: "\u{BCB6}", - nfkd: "\u{1107}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{BCB7}", - nfc: "\u{BCB7}", - nfd: "\u{1107}\u{1166}\u{11BE}", - nfkc: "\u{BCB7}", - nfkd: "\u{1107}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{BCB8}", - nfc: "\u{BCB8}", - nfd: "\u{1107}\u{1166}\u{11BF}", - nfkc: "\u{BCB8}", - nfkd: "\u{1107}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{BCB9}", - nfc: "\u{BCB9}", - nfd: "\u{1107}\u{1166}\u{11C0}", - nfkc: "\u{BCB9}", - nfkd: "\u{1107}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{BCBA}", - nfc: "\u{BCBA}", - nfd: "\u{1107}\u{1166}\u{11C1}", - nfkc: "\u{BCBA}", - nfkd: "\u{1107}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{BCBB}", - nfc: "\u{BCBB}", - nfd: "\u{1107}\u{1166}\u{11C2}", - nfkc: "\u{BCBB}", - nfkd: "\u{1107}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{BCBC}", - nfc: "\u{BCBC}", - nfd: "\u{1107}\u{1167}", - nfkc: "\u{BCBC}", - nfkd: "\u{1107}\u{1167}", - }, - NormalizationTest { - source: "\u{BCBD}", - nfc: "\u{BCBD}", - nfd: "\u{1107}\u{1167}\u{11A8}", - nfkc: "\u{BCBD}", - nfkd: "\u{1107}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{BCBE}", - nfc: "\u{BCBE}", - nfd: "\u{1107}\u{1167}\u{11A9}", - nfkc: "\u{BCBE}", - nfkd: "\u{1107}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{BCBF}", - nfc: "\u{BCBF}", - nfd: "\u{1107}\u{1167}\u{11AA}", - nfkc: "\u{BCBF}", - nfkd: "\u{1107}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{BCC0}", - nfc: "\u{BCC0}", - nfd: "\u{1107}\u{1167}\u{11AB}", - nfkc: "\u{BCC0}", - nfkd: "\u{1107}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{BCC1}", - nfc: "\u{BCC1}", - nfd: "\u{1107}\u{1167}\u{11AC}", - nfkc: "\u{BCC1}", - nfkd: "\u{1107}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{BCC2}", - nfc: "\u{BCC2}", - nfd: "\u{1107}\u{1167}\u{11AD}", - nfkc: "\u{BCC2}", - nfkd: "\u{1107}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{BCC3}", - nfc: "\u{BCC3}", - nfd: "\u{1107}\u{1167}\u{11AE}", - nfkc: "\u{BCC3}", - nfkd: "\u{1107}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{BCC4}", - nfc: "\u{BCC4}", - nfd: "\u{1107}\u{1167}\u{11AF}", - nfkc: "\u{BCC4}", - nfkd: "\u{1107}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{BCC5}", - nfc: "\u{BCC5}", - nfd: "\u{1107}\u{1167}\u{11B0}", - nfkc: "\u{BCC5}", - nfkd: "\u{1107}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{BCC6}", - nfc: "\u{BCC6}", - nfd: "\u{1107}\u{1167}\u{11B1}", - nfkc: "\u{BCC6}", - nfkd: "\u{1107}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{BCC7}", - nfc: "\u{BCC7}", - nfd: "\u{1107}\u{1167}\u{11B2}", - nfkc: "\u{BCC7}", - nfkd: "\u{1107}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{BCC8}", - nfc: "\u{BCC8}", - nfd: "\u{1107}\u{1167}\u{11B3}", - nfkc: "\u{BCC8}", - nfkd: "\u{1107}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{BCC9}", - nfc: "\u{BCC9}", - nfd: "\u{1107}\u{1167}\u{11B4}", - nfkc: "\u{BCC9}", - nfkd: "\u{1107}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{BCCA}", - nfc: "\u{BCCA}", - nfd: "\u{1107}\u{1167}\u{11B5}", - nfkc: "\u{BCCA}", - nfkd: "\u{1107}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{BCCB}", - nfc: "\u{BCCB}", - nfd: "\u{1107}\u{1167}\u{11B6}", - nfkc: "\u{BCCB}", - nfkd: "\u{1107}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{BCCC}", - nfc: "\u{BCCC}", - nfd: "\u{1107}\u{1167}\u{11B7}", - nfkc: "\u{BCCC}", - nfkd: "\u{1107}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{BCCD}", - nfc: "\u{BCCD}", - nfd: "\u{1107}\u{1167}\u{11B8}", - nfkc: "\u{BCCD}", - nfkd: "\u{1107}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{BCCE}", - nfc: "\u{BCCE}", - nfd: "\u{1107}\u{1167}\u{11B9}", - nfkc: "\u{BCCE}", - nfkd: "\u{1107}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{BCCF}", - nfc: "\u{BCCF}", - nfd: "\u{1107}\u{1167}\u{11BA}", - nfkc: "\u{BCCF}", - nfkd: "\u{1107}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{BCD0}", - nfc: "\u{BCD0}", - nfd: "\u{1107}\u{1167}\u{11BB}", - nfkc: "\u{BCD0}", - nfkd: "\u{1107}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{BCD1}", - nfc: "\u{BCD1}", - nfd: "\u{1107}\u{1167}\u{11BC}", - nfkc: "\u{BCD1}", - nfkd: "\u{1107}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{BCD2}", - nfc: "\u{BCD2}", - nfd: "\u{1107}\u{1167}\u{11BD}", - nfkc: "\u{BCD2}", - nfkd: "\u{1107}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{BCD3}", - nfc: "\u{BCD3}", - nfd: "\u{1107}\u{1167}\u{11BE}", - nfkc: "\u{BCD3}", - nfkd: "\u{1107}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{BCD4}", - nfc: "\u{BCD4}", - nfd: "\u{1107}\u{1167}\u{11BF}", - nfkc: "\u{BCD4}", - nfkd: "\u{1107}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{BCD5}", - nfc: "\u{BCD5}", - nfd: "\u{1107}\u{1167}\u{11C0}", - nfkc: "\u{BCD5}", - nfkd: "\u{1107}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{BCD6}", - nfc: "\u{BCD6}", - nfd: "\u{1107}\u{1167}\u{11C1}", - nfkc: "\u{BCD6}", - nfkd: "\u{1107}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{BCD7}", - nfc: "\u{BCD7}", - nfd: "\u{1107}\u{1167}\u{11C2}", - nfkc: "\u{BCD7}", - nfkd: "\u{1107}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{BCD8}", - nfc: "\u{BCD8}", - nfd: "\u{1107}\u{1168}", - nfkc: "\u{BCD8}", - nfkd: "\u{1107}\u{1168}", - }, - NormalizationTest { - source: "\u{BCD9}", - nfc: "\u{BCD9}", - nfd: "\u{1107}\u{1168}\u{11A8}", - nfkc: "\u{BCD9}", - nfkd: "\u{1107}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{BCDA}", - nfc: "\u{BCDA}", - nfd: "\u{1107}\u{1168}\u{11A9}", - nfkc: "\u{BCDA}", - nfkd: "\u{1107}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{BCDB}", - nfc: "\u{BCDB}", - nfd: "\u{1107}\u{1168}\u{11AA}", - nfkc: "\u{BCDB}", - nfkd: "\u{1107}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{BCDC}", - nfc: "\u{BCDC}", - nfd: "\u{1107}\u{1168}\u{11AB}", - nfkc: "\u{BCDC}", - nfkd: "\u{1107}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{BCDD}", - nfc: "\u{BCDD}", - nfd: "\u{1107}\u{1168}\u{11AC}", - nfkc: "\u{BCDD}", - nfkd: "\u{1107}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{BCDE}", - nfc: "\u{BCDE}", - nfd: "\u{1107}\u{1168}\u{11AD}", - nfkc: "\u{BCDE}", - nfkd: "\u{1107}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{BCDF}", - nfc: "\u{BCDF}", - nfd: "\u{1107}\u{1168}\u{11AE}", - nfkc: "\u{BCDF}", - nfkd: "\u{1107}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{BCE0}", - nfc: "\u{BCE0}", - nfd: "\u{1107}\u{1168}\u{11AF}", - nfkc: "\u{BCE0}", - nfkd: "\u{1107}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{BCE1}", - nfc: "\u{BCE1}", - nfd: "\u{1107}\u{1168}\u{11B0}", - nfkc: "\u{BCE1}", - nfkd: "\u{1107}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{BCE2}", - nfc: "\u{BCE2}", - nfd: "\u{1107}\u{1168}\u{11B1}", - nfkc: "\u{BCE2}", - nfkd: "\u{1107}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{BCE3}", - nfc: "\u{BCE3}", - nfd: "\u{1107}\u{1168}\u{11B2}", - nfkc: "\u{BCE3}", - nfkd: "\u{1107}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{BCE4}", - nfc: "\u{BCE4}", - nfd: "\u{1107}\u{1168}\u{11B3}", - nfkc: "\u{BCE4}", - nfkd: "\u{1107}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{BCE5}", - nfc: "\u{BCE5}", - nfd: "\u{1107}\u{1168}\u{11B4}", - nfkc: "\u{BCE5}", - nfkd: "\u{1107}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{BCE6}", - nfc: "\u{BCE6}", - nfd: "\u{1107}\u{1168}\u{11B5}", - nfkc: "\u{BCE6}", - nfkd: "\u{1107}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{BCE7}", - nfc: "\u{BCE7}", - nfd: "\u{1107}\u{1168}\u{11B6}", - nfkc: "\u{BCE7}", - nfkd: "\u{1107}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{BCE8}", - nfc: "\u{BCE8}", - nfd: "\u{1107}\u{1168}\u{11B7}", - nfkc: "\u{BCE8}", - nfkd: "\u{1107}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{BCE9}", - nfc: "\u{BCE9}", - nfd: "\u{1107}\u{1168}\u{11B8}", - nfkc: "\u{BCE9}", - nfkd: "\u{1107}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{BCEA}", - nfc: "\u{BCEA}", - nfd: "\u{1107}\u{1168}\u{11B9}", - nfkc: "\u{BCEA}", - nfkd: "\u{1107}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{BCEB}", - nfc: "\u{BCEB}", - nfd: "\u{1107}\u{1168}\u{11BA}", - nfkc: "\u{BCEB}", - nfkd: "\u{1107}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{BCEC}", - nfc: "\u{BCEC}", - nfd: "\u{1107}\u{1168}\u{11BB}", - nfkc: "\u{BCEC}", - nfkd: "\u{1107}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{BCED}", - nfc: "\u{BCED}", - nfd: "\u{1107}\u{1168}\u{11BC}", - nfkc: "\u{BCED}", - nfkd: "\u{1107}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{BCEE}", - nfc: "\u{BCEE}", - nfd: "\u{1107}\u{1168}\u{11BD}", - nfkc: "\u{BCEE}", - nfkd: "\u{1107}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{BCEF}", - nfc: "\u{BCEF}", - nfd: "\u{1107}\u{1168}\u{11BE}", - nfkc: "\u{BCEF}", - nfkd: "\u{1107}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{BCF0}", - nfc: "\u{BCF0}", - nfd: "\u{1107}\u{1168}\u{11BF}", - nfkc: "\u{BCF0}", - nfkd: "\u{1107}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{BCF1}", - nfc: "\u{BCF1}", - nfd: "\u{1107}\u{1168}\u{11C0}", - nfkc: "\u{BCF1}", - nfkd: "\u{1107}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{BCF2}", - nfc: "\u{BCF2}", - nfd: "\u{1107}\u{1168}\u{11C1}", - nfkc: "\u{BCF2}", - nfkd: "\u{1107}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{BCF3}", - nfc: "\u{BCF3}", - nfd: "\u{1107}\u{1168}\u{11C2}", - nfkc: "\u{BCF3}", - nfkd: "\u{1107}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{BCF4}", - nfc: "\u{BCF4}", - nfd: "\u{1107}\u{1169}", - nfkc: "\u{BCF4}", - nfkd: "\u{1107}\u{1169}", - }, - NormalizationTest { - source: "\u{BCF5}", - nfc: "\u{BCF5}", - nfd: "\u{1107}\u{1169}\u{11A8}", - nfkc: "\u{BCF5}", - nfkd: "\u{1107}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{BCF6}", - nfc: "\u{BCF6}", - nfd: "\u{1107}\u{1169}\u{11A9}", - nfkc: "\u{BCF6}", - nfkd: "\u{1107}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{BCF7}", - nfc: "\u{BCF7}", - nfd: "\u{1107}\u{1169}\u{11AA}", - nfkc: "\u{BCF7}", - nfkd: "\u{1107}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{BCF8}", - nfc: "\u{BCF8}", - nfd: "\u{1107}\u{1169}\u{11AB}", - nfkc: "\u{BCF8}", - nfkd: "\u{1107}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{BCF9}", - nfc: "\u{BCF9}", - nfd: "\u{1107}\u{1169}\u{11AC}", - nfkc: "\u{BCF9}", - nfkd: "\u{1107}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{BCFA}", - nfc: "\u{BCFA}", - nfd: "\u{1107}\u{1169}\u{11AD}", - nfkc: "\u{BCFA}", - nfkd: "\u{1107}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{BCFB}", - nfc: "\u{BCFB}", - nfd: "\u{1107}\u{1169}\u{11AE}", - nfkc: "\u{BCFB}", - nfkd: "\u{1107}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{BCFC}", - nfc: "\u{BCFC}", - nfd: "\u{1107}\u{1169}\u{11AF}", - nfkc: "\u{BCFC}", - nfkd: "\u{1107}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{BCFD}", - nfc: "\u{BCFD}", - nfd: "\u{1107}\u{1169}\u{11B0}", - nfkc: "\u{BCFD}", - nfkd: "\u{1107}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{BCFE}", - nfc: "\u{BCFE}", - nfd: "\u{1107}\u{1169}\u{11B1}", - nfkc: "\u{BCFE}", - nfkd: "\u{1107}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{BCFF}", - nfc: "\u{BCFF}", - nfd: "\u{1107}\u{1169}\u{11B2}", - nfkc: "\u{BCFF}", - nfkd: "\u{1107}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{BD00}", - nfc: "\u{BD00}", - nfd: "\u{1107}\u{1169}\u{11B3}", - nfkc: "\u{BD00}", - nfkd: "\u{1107}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{BD01}", - nfc: "\u{BD01}", - nfd: "\u{1107}\u{1169}\u{11B4}", - nfkc: "\u{BD01}", - nfkd: "\u{1107}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{BD02}", - nfc: "\u{BD02}", - nfd: "\u{1107}\u{1169}\u{11B5}", - nfkc: "\u{BD02}", - nfkd: "\u{1107}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{BD03}", - nfc: "\u{BD03}", - nfd: "\u{1107}\u{1169}\u{11B6}", - nfkc: "\u{BD03}", - nfkd: "\u{1107}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{BD04}", - nfc: "\u{BD04}", - nfd: "\u{1107}\u{1169}\u{11B7}", - nfkc: "\u{BD04}", - nfkd: "\u{1107}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{BD05}", - nfc: "\u{BD05}", - nfd: "\u{1107}\u{1169}\u{11B8}", - nfkc: "\u{BD05}", - nfkd: "\u{1107}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{BD06}", - nfc: "\u{BD06}", - nfd: "\u{1107}\u{1169}\u{11B9}", - nfkc: "\u{BD06}", - nfkd: "\u{1107}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{BD07}", - nfc: "\u{BD07}", - nfd: "\u{1107}\u{1169}\u{11BA}", - nfkc: "\u{BD07}", - nfkd: "\u{1107}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{BD08}", - nfc: "\u{BD08}", - nfd: "\u{1107}\u{1169}\u{11BB}", - nfkc: "\u{BD08}", - nfkd: "\u{1107}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{BD09}", - nfc: "\u{BD09}", - nfd: "\u{1107}\u{1169}\u{11BC}", - nfkc: "\u{BD09}", - nfkd: "\u{1107}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{BD0A}", - nfc: "\u{BD0A}", - nfd: "\u{1107}\u{1169}\u{11BD}", - nfkc: "\u{BD0A}", - nfkd: "\u{1107}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{BD0B}", - nfc: "\u{BD0B}", - nfd: "\u{1107}\u{1169}\u{11BE}", - nfkc: "\u{BD0B}", - nfkd: "\u{1107}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{BD0C}", - nfc: "\u{BD0C}", - nfd: "\u{1107}\u{1169}\u{11BF}", - nfkc: "\u{BD0C}", - nfkd: "\u{1107}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{BD0D}", - nfc: "\u{BD0D}", - nfd: "\u{1107}\u{1169}\u{11C0}", - nfkc: "\u{BD0D}", - nfkd: "\u{1107}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{BD0E}", - nfc: "\u{BD0E}", - nfd: "\u{1107}\u{1169}\u{11C1}", - nfkc: "\u{BD0E}", - nfkd: "\u{1107}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{BD0F}", - nfc: "\u{BD0F}", - nfd: "\u{1107}\u{1169}\u{11C2}", - nfkc: "\u{BD0F}", - nfkd: "\u{1107}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{BD10}", - nfc: "\u{BD10}", - nfd: "\u{1107}\u{116A}", - nfkc: "\u{BD10}", - nfkd: "\u{1107}\u{116A}", - }, - NormalizationTest { - source: "\u{BD11}", - nfc: "\u{BD11}", - nfd: "\u{1107}\u{116A}\u{11A8}", - nfkc: "\u{BD11}", - nfkd: "\u{1107}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{BD12}", - nfc: "\u{BD12}", - nfd: "\u{1107}\u{116A}\u{11A9}", - nfkc: "\u{BD12}", - nfkd: "\u{1107}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{BD13}", - nfc: "\u{BD13}", - nfd: "\u{1107}\u{116A}\u{11AA}", - nfkc: "\u{BD13}", - nfkd: "\u{1107}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{BD14}", - nfc: "\u{BD14}", - nfd: "\u{1107}\u{116A}\u{11AB}", - nfkc: "\u{BD14}", - nfkd: "\u{1107}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{BD15}", - nfc: "\u{BD15}", - nfd: "\u{1107}\u{116A}\u{11AC}", - nfkc: "\u{BD15}", - nfkd: "\u{1107}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{BD16}", - nfc: "\u{BD16}", - nfd: "\u{1107}\u{116A}\u{11AD}", - nfkc: "\u{BD16}", - nfkd: "\u{1107}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{BD17}", - nfc: "\u{BD17}", - nfd: "\u{1107}\u{116A}\u{11AE}", - nfkc: "\u{BD17}", - nfkd: "\u{1107}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{BD18}", - nfc: "\u{BD18}", - nfd: "\u{1107}\u{116A}\u{11AF}", - nfkc: "\u{BD18}", - nfkd: "\u{1107}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{BD19}", - nfc: "\u{BD19}", - nfd: "\u{1107}\u{116A}\u{11B0}", - nfkc: "\u{BD19}", - nfkd: "\u{1107}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{BD1A}", - nfc: "\u{BD1A}", - nfd: "\u{1107}\u{116A}\u{11B1}", - nfkc: "\u{BD1A}", - nfkd: "\u{1107}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{BD1B}", - nfc: "\u{BD1B}", - nfd: "\u{1107}\u{116A}\u{11B2}", - nfkc: "\u{BD1B}", - nfkd: "\u{1107}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{BD1C}", - nfc: "\u{BD1C}", - nfd: "\u{1107}\u{116A}\u{11B3}", - nfkc: "\u{BD1C}", - nfkd: "\u{1107}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{BD1D}", - nfc: "\u{BD1D}", - nfd: "\u{1107}\u{116A}\u{11B4}", - nfkc: "\u{BD1D}", - nfkd: "\u{1107}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{BD1E}", - nfc: "\u{BD1E}", - nfd: "\u{1107}\u{116A}\u{11B5}", - nfkc: "\u{BD1E}", - nfkd: "\u{1107}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{BD1F}", - nfc: "\u{BD1F}", - nfd: "\u{1107}\u{116A}\u{11B6}", - nfkc: "\u{BD1F}", - nfkd: "\u{1107}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{BD20}", - nfc: "\u{BD20}", - nfd: "\u{1107}\u{116A}\u{11B7}", - nfkc: "\u{BD20}", - nfkd: "\u{1107}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{BD21}", - nfc: "\u{BD21}", - nfd: "\u{1107}\u{116A}\u{11B8}", - nfkc: "\u{BD21}", - nfkd: "\u{1107}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{BD22}", - nfc: "\u{BD22}", - nfd: "\u{1107}\u{116A}\u{11B9}", - nfkc: "\u{BD22}", - nfkd: "\u{1107}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{BD23}", - nfc: "\u{BD23}", - nfd: "\u{1107}\u{116A}\u{11BA}", - nfkc: "\u{BD23}", - nfkd: "\u{1107}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{BD24}", - nfc: "\u{BD24}", - nfd: "\u{1107}\u{116A}\u{11BB}", - nfkc: "\u{BD24}", - nfkd: "\u{1107}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{BD25}", - nfc: "\u{BD25}", - nfd: "\u{1107}\u{116A}\u{11BC}", - nfkc: "\u{BD25}", - nfkd: "\u{1107}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{BD26}", - nfc: "\u{BD26}", - nfd: "\u{1107}\u{116A}\u{11BD}", - nfkc: "\u{BD26}", - nfkd: "\u{1107}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{BD27}", - nfc: "\u{BD27}", - nfd: "\u{1107}\u{116A}\u{11BE}", - nfkc: "\u{BD27}", - nfkd: "\u{1107}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{BD28}", - nfc: "\u{BD28}", - nfd: "\u{1107}\u{116A}\u{11BF}", - nfkc: "\u{BD28}", - nfkd: "\u{1107}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{BD29}", - nfc: "\u{BD29}", - nfd: "\u{1107}\u{116A}\u{11C0}", - nfkc: "\u{BD29}", - nfkd: "\u{1107}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{BD2A}", - nfc: "\u{BD2A}", - nfd: "\u{1107}\u{116A}\u{11C1}", - nfkc: "\u{BD2A}", - nfkd: "\u{1107}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{BD2B}", - nfc: "\u{BD2B}", - nfd: "\u{1107}\u{116A}\u{11C2}", - nfkc: "\u{BD2B}", - nfkd: "\u{1107}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{BD2C}", - nfc: "\u{BD2C}", - nfd: "\u{1107}\u{116B}", - nfkc: "\u{BD2C}", - nfkd: "\u{1107}\u{116B}", - }, - NormalizationTest { - source: "\u{BD2D}", - nfc: "\u{BD2D}", - nfd: "\u{1107}\u{116B}\u{11A8}", - nfkc: "\u{BD2D}", - nfkd: "\u{1107}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{BD2E}", - nfc: "\u{BD2E}", - nfd: "\u{1107}\u{116B}\u{11A9}", - nfkc: "\u{BD2E}", - nfkd: "\u{1107}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{BD2F}", - nfc: "\u{BD2F}", - nfd: "\u{1107}\u{116B}\u{11AA}", - nfkc: "\u{BD2F}", - nfkd: "\u{1107}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{BD30}", - nfc: "\u{BD30}", - nfd: "\u{1107}\u{116B}\u{11AB}", - nfkc: "\u{BD30}", - nfkd: "\u{1107}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{BD31}", - nfc: "\u{BD31}", - nfd: "\u{1107}\u{116B}\u{11AC}", - nfkc: "\u{BD31}", - nfkd: "\u{1107}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{BD32}", - nfc: "\u{BD32}", - nfd: "\u{1107}\u{116B}\u{11AD}", - nfkc: "\u{BD32}", - nfkd: "\u{1107}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{BD33}", - nfc: "\u{BD33}", - nfd: "\u{1107}\u{116B}\u{11AE}", - nfkc: "\u{BD33}", - nfkd: "\u{1107}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{BD34}", - nfc: "\u{BD34}", - nfd: "\u{1107}\u{116B}\u{11AF}", - nfkc: "\u{BD34}", - nfkd: "\u{1107}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{BD35}", - nfc: "\u{BD35}", - nfd: "\u{1107}\u{116B}\u{11B0}", - nfkc: "\u{BD35}", - nfkd: "\u{1107}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{BD36}", - nfc: "\u{BD36}", - nfd: "\u{1107}\u{116B}\u{11B1}", - nfkc: "\u{BD36}", - nfkd: "\u{1107}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{BD37}", - nfc: "\u{BD37}", - nfd: "\u{1107}\u{116B}\u{11B2}", - nfkc: "\u{BD37}", - nfkd: "\u{1107}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{BD38}", - nfc: "\u{BD38}", - nfd: "\u{1107}\u{116B}\u{11B3}", - nfkc: "\u{BD38}", - nfkd: "\u{1107}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{BD39}", - nfc: "\u{BD39}", - nfd: "\u{1107}\u{116B}\u{11B4}", - nfkc: "\u{BD39}", - nfkd: "\u{1107}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{BD3A}", - nfc: "\u{BD3A}", - nfd: "\u{1107}\u{116B}\u{11B5}", - nfkc: "\u{BD3A}", - nfkd: "\u{1107}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{BD3B}", - nfc: "\u{BD3B}", - nfd: "\u{1107}\u{116B}\u{11B6}", - nfkc: "\u{BD3B}", - nfkd: "\u{1107}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{BD3C}", - nfc: "\u{BD3C}", - nfd: "\u{1107}\u{116B}\u{11B7}", - nfkc: "\u{BD3C}", - nfkd: "\u{1107}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{BD3D}", - nfc: "\u{BD3D}", - nfd: "\u{1107}\u{116B}\u{11B8}", - nfkc: "\u{BD3D}", - nfkd: "\u{1107}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{BD3E}", - nfc: "\u{BD3E}", - nfd: "\u{1107}\u{116B}\u{11B9}", - nfkc: "\u{BD3E}", - nfkd: "\u{1107}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{BD3F}", - nfc: "\u{BD3F}", - nfd: "\u{1107}\u{116B}\u{11BA}", - nfkc: "\u{BD3F}", - nfkd: "\u{1107}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{BD40}", - nfc: "\u{BD40}", - nfd: "\u{1107}\u{116B}\u{11BB}", - nfkc: "\u{BD40}", - nfkd: "\u{1107}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{BD41}", - nfc: "\u{BD41}", - nfd: "\u{1107}\u{116B}\u{11BC}", - nfkc: "\u{BD41}", - nfkd: "\u{1107}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{BD42}", - nfc: "\u{BD42}", - nfd: "\u{1107}\u{116B}\u{11BD}", - nfkc: "\u{BD42}", - nfkd: "\u{1107}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{BD43}", - nfc: "\u{BD43}", - nfd: "\u{1107}\u{116B}\u{11BE}", - nfkc: "\u{BD43}", - nfkd: "\u{1107}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{BD44}", - nfc: "\u{BD44}", - nfd: "\u{1107}\u{116B}\u{11BF}", - nfkc: "\u{BD44}", - nfkd: "\u{1107}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{BD45}", - nfc: "\u{BD45}", - nfd: "\u{1107}\u{116B}\u{11C0}", - nfkc: "\u{BD45}", - nfkd: "\u{1107}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{BD46}", - nfc: "\u{BD46}", - nfd: "\u{1107}\u{116B}\u{11C1}", - nfkc: "\u{BD46}", - nfkd: "\u{1107}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{BD47}", - nfc: "\u{BD47}", - nfd: "\u{1107}\u{116B}\u{11C2}", - nfkc: "\u{BD47}", - nfkd: "\u{1107}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{BD48}", - nfc: "\u{BD48}", - nfd: "\u{1107}\u{116C}", - nfkc: "\u{BD48}", - nfkd: "\u{1107}\u{116C}", - }, - NormalizationTest { - source: "\u{BD49}", - nfc: "\u{BD49}", - nfd: "\u{1107}\u{116C}\u{11A8}", - nfkc: "\u{BD49}", - nfkd: "\u{1107}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{BD4A}", - nfc: "\u{BD4A}", - nfd: "\u{1107}\u{116C}\u{11A9}", - nfkc: "\u{BD4A}", - nfkd: "\u{1107}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{BD4B}", - nfc: "\u{BD4B}", - nfd: "\u{1107}\u{116C}\u{11AA}", - nfkc: "\u{BD4B}", - nfkd: "\u{1107}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{BD4C}", - nfc: "\u{BD4C}", - nfd: "\u{1107}\u{116C}\u{11AB}", - nfkc: "\u{BD4C}", - nfkd: "\u{1107}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{BD4D}", - nfc: "\u{BD4D}", - nfd: "\u{1107}\u{116C}\u{11AC}", - nfkc: "\u{BD4D}", - nfkd: "\u{1107}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{BD4E}", - nfc: "\u{BD4E}", - nfd: "\u{1107}\u{116C}\u{11AD}", - nfkc: "\u{BD4E}", - nfkd: "\u{1107}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{BD4F}", - nfc: "\u{BD4F}", - nfd: "\u{1107}\u{116C}\u{11AE}", - nfkc: "\u{BD4F}", - nfkd: "\u{1107}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{BD50}", - nfc: "\u{BD50}", - nfd: "\u{1107}\u{116C}\u{11AF}", - nfkc: "\u{BD50}", - nfkd: "\u{1107}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{BD51}", - nfc: "\u{BD51}", - nfd: "\u{1107}\u{116C}\u{11B0}", - nfkc: "\u{BD51}", - nfkd: "\u{1107}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{BD52}", - nfc: "\u{BD52}", - nfd: "\u{1107}\u{116C}\u{11B1}", - nfkc: "\u{BD52}", - nfkd: "\u{1107}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{BD53}", - nfc: "\u{BD53}", - nfd: "\u{1107}\u{116C}\u{11B2}", - nfkc: "\u{BD53}", - nfkd: "\u{1107}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{BD54}", - nfc: "\u{BD54}", - nfd: "\u{1107}\u{116C}\u{11B3}", - nfkc: "\u{BD54}", - nfkd: "\u{1107}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{BD55}", - nfc: "\u{BD55}", - nfd: "\u{1107}\u{116C}\u{11B4}", - nfkc: "\u{BD55}", - nfkd: "\u{1107}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{BD56}", - nfc: "\u{BD56}", - nfd: "\u{1107}\u{116C}\u{11B5}", - nfkc: "\u{BD56}", - nfkd: "\u{1107}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{BD57}", - nfc: "\u{BD57}", - nfd: "\u{1107}\u{116C}\u{11B6}", - nfkc: "\u{BD57}", - nfkd: "\u{1107}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{BD58}", - nfc: "\u{BD58}", - nfd: "\u{1107}\u{116C}\u{11B7}", - nfkc: "\u{BD58}", - nfkd: "\u{1107}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{BD59}", - nfc: "\u{BD59}", - nfd: "\u{1107}\u{116C}\u{11B8}", - nfkc: "\u{BD59}", - nfkd: "\u{1107}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{BD5A}", - nfc: "\u{BD5A}", - nfd: "\u{1107}\u{116C}\u{11B9}", - nfkc: "\u{BD5A}", - nfkd: "\u{1107}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{BD5B}", - nfc: "\u{BD5B}", - nfd: "\u{1107}\u{116C}\u{11BA}", - nfkc: "\u{BD5B}", - nfkd: "\u{1107}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{BD5C}", - nfc: "\u{BD5C}", - nfd: "\u{1107}\u{116C}\u{11BB}", - nfkc: "\u{BD5C}", - nfkd: "\u{1107}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{BD5D}", - nfc: "\u{BD5D}", - nfd: "\u{1107}\u{116C}\u{11BC}", - nfkc: "\u{BD5D}", - nfkd: "\u{1107}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{BD5E}", - nfc: "\u{BD5E}", - nfd: "\u{1107}\u{116C}\u{11BD}", - nfkc: "\u{BD5E}", - nfkd: "\u{1107}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{BD5F}", - nfc: "\u{BD5F}", - nfd: "\u{1107}\u{116C}\u{11BE}", - nfkc: "\u{BD5F}", - nfkd: "\u{1107}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{BD60}", - nfc: "\u{BD60}", - nfd: "\u{1107}\u{116C}\u{11BF}", - nfkc: "\u{BD60}", - nfkd: "\u{1107}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{BD61}", - nfc: "\u{BD61}", - nfd: "\u{1107}\u{116C}\u{11C0}", - nfkc: "\u{BD61}", - nfkd: "\u{1107}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{BD62}", - nfc: "\u{BD62}", - nfd: "\u{1107}\u{116C}\u{11C1}", - nfkc: "\u{BD62}", - nfkd: "\u{1107}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{BD63}", - nfc: "\u{BD63}", - nfd: "\u{1107}\u{116C}\u{11C2}", - nfkc: "\u{BD63}", - nfkd: "\u{1107}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{BD64}", - nfc: "\u{BD64}", - nfd: "\u{1107}\u{116D}", - nfkc: "\u{BD64}", - nfkd: "\u{1107}\u{116D}", - }, - NormalizationTest { - source: "\u{BD65}", - nfc: "\u{BD65}", - nfd: "\u{1107}\u{116D}\u{11A8}", - nfkc: "\u{BD65}", - nfkd: "\u{1107}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{BD66}", - nfc: "\u{BD66}", - nfd: "\u{1107}\u{116D}\u{11A9}", - nfkc: "\u{BD66}", - nfkd: "\u{1107}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{BD67}", - nfc: "\u{BD67}", - nfd: "\u{1107}\u{116D}\u{11AA}", - nfkc: "\u{BD67}", - nfkd: "\u{1107}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{BD68}", - nfc: "\u{BD68}", - nfd: "\u{1107}\u{116D}\u{11AB}", - nfkc: "\u{BD68}", - nfkd: "\u{1107}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{BD69}", - nfc: "\u{BD69}", - nfd: "\u{1107}\u{116D}\u{11AC}", - nfkc: "\u{BD69}", - nfkd: "\u{1107}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{BD6A}", - nfc: "\u{BD6A}", - nfd: "\u{1107}\u{116D}\u{11AD}", - nfkc: "\u{BD6A}", - nfkd: "\u{1107}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{BD6B}", - nfc: "\u{BD6B}", - nfd: "\u{1107}\u{116D}\u{11AE}", - nfkc: "\u{BD6B}", - nfkd: "\u{1107}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{BD6C}", - nfc: "\u{BD6C}", - nfd: "\u{1107}\u{116D}\u{11AF}", - nfkc: "\u{BD6C}", - nfkd: "\u{1107}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{BD6D}", - nfc: "\u{BD6D}", - nfd: "\u{1107}\u{116D}\u{11B0}", - nfkc: "\u{BD6D}", - nfkd: "\u{1107}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{BD6E}", - nfc: "\u{BD6E}", - nfd: "\u{1107}\u{116D}\u{11B1}", - nfkc: "\u{BD6E}", - nfkd: "\u{1107}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{BD6F}", - nfc: "\u{BD6F}", - nfd: "\u{1107}\u{116D}\u{11B2}", - nfkc: "\u{BD6F}", - nfkd: "\u{1107}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{BD70}", - nfc: "\u{BD70}", - nfd: "\u{1107}\u{116D}\u{11B3}", - nfkc: "\u{BD70}", - nfkd: "\u{1107}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{BD71}", - nfc: "\u{BD71}", - nfd: "\u{1107}\u{116D}\u{11B4}", - nfkc: "\u{BD71}", - nfkd: "\u{1107}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{BD72}", - nfc: "\u{BD72}", - nfd: "\u{1107}\u{116D}\u{11B5}", - nfkc: "\u{BD72}", - nfkd: "\u{1107}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{BD73}", - nfc: "\u{BD73}", - nfd: "\u{1107}\u{116D}\u{11B6}", - nfkc: "\u{BD73}", - nfkd: "\u{1107}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{BD74}", - nfc: "\u{BD74}", - nfd: "\u{1107}\u{116D}\u{11B7}", - nfkc: "\u{BD74}", - nfkd: "\u{1107}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{BD75}", - nfc: "\u{BD75}", - nfd: "\u{1107}\u{116D}\u{11B8}", - nfkc: "\u{BD75}", - nfkd: "\u{1107}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{BD76}", - nfc: "\u{BD76}", - nfd: "\u{1107}\u{116D}\u{11B9}", - nfkc: "\u{BD76}", - nfkd: "\u{1107}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{BD77}", - nfc: "\u{BD77}", - nfd: "\u{1107}\u{116D}\u{11BA}", - nfkc: "\u{BD77}", - nfkd: "\u{1107}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{BD78}", - nfc: "\u{BD78}", - nfd: "\u{1107}\u{116D}\u{11BB}", - nfkc: "\u{BD78}", - nfkd: "\u{1107}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{BD79}", - nfc: "\u{BD79}", - nfd: "\u{1107}\u{116D}\u{11BC}", - nfkc: "\u{BD79}", - nfkd: "\u{1107}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{BD7A}", - nfc: "\u{BD7A}", - nfd: "\u{1107}\u{116D}\u{11BD}", - nfkc: "\u{BD7A}", - nfkd: "\u{1107}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{BD7B}", - nfc: "\u{BD7B}", - nfd: "\u{1107}\u{116D}\u{11BE}", - nfkc: "\u{BD7B}", - nfkd: "\u{1107}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{BD7C}", - nfc: "\u{BD7C}", - nfd: "\u{1107}\u{116D}\u{11BF}", - nfkc: "\u{BD7C}", - nfkd: "\u{1107}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{BD7D}", - nfc: "\u{BD7D}", - nfd: "\u{1107}\u{116D}\u{11C0}", - nfkc: "\u{BD7D}", - nfkd: "\u{1107}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{BD7E}", - nfc: "\u{BD7E}", - nfd: "\u{1107}\u{116D}\u{11C1}", - nfkc: "\u{BD7E}", - nfkd: "\u{1107}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{BD7F}", - nfc: "\u{BD7F}", - nfd: "\u{1107}\u{116D}\u{11C2}", - nfkc: "\u{BD7F}", - nfkd: "\u{1107}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{BD80}", - nfc: "\u{BD80}", - nfd: "\u{1107}\u{116E}", - nfkc: "\u{BD80}", - nfkd: "\u{1107}\u{116E}", - }, - NormalizationTest { - source: "\u{BD81}", - nfc: "\u{BD81}", - nfd: "\u{1107}\u{116E}\u{11A8}", - nfkc: "\u{BD81}", - nfkd: "\u{1107}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{BD82}", - nfc: "\u{BD82}", - nfd: "\u{1107}\u{116E}\u{11A9}", - nfkc: "\u{BD82}", - nfkd: "\u{1107}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{BD83}", - nfc: "\u{BD83}", - nfd: "\u{1107}\u{116E}\u{11AA}", - nfkc: "\u{BD83}", - nfkd: "\u{1107}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{BD84}", - nfc: "\u{BD84}", - nfd: "\u{1107}\u{116E}\u{11AB}", - nfkc: "\u{BD84}", - nfkd: "\u{1107}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{BD85}", - nfc: "\u{BD85}", - nfd: "\u{1107}\u{116E}\u{11AC}", - nfkc: "\u{BD85}", - nfkd: "\u{1107}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{BD86}", - nfc: "\u{BD86}", - nfd: "\u{1107}\u{116E}\u{11AD}", - nfkc: "\u{BD86}", - nfkd: "\u{1107}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{BD87}", - nfc: "\u{BD87}", - nfd: "\u{1107}\u{116E}\u{11AE}", - nfkc: "\u{BD87}", - nfkd: "\u{1107}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{BD88}", - nfc: "\u{BD88}", - nfd: "\u{1107}\u{116E}\u{11AF}", - nfkc: "\u{BD88}", - nfkd: "\u{1107}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{BD89}", - nfc: "\u{BD89}", - nfd: "\u{1107}\u{116E}\u{11B0}", - nfkc: "\u{BD89}", - nfkd: "\u{1107}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{BD8A}", - nfc: "\u{BD8A}", - nfd: "\u{1107}\u{116E}\u{11B1}", - nfkc: "\u{BD8A}", - nfkd: "\u{1107}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{BD8B}", - nfc: "\u{BD8B}", - nfd: "\u{1107}\u{116E}\u{11B2}", - nfkc: "\u{BD8B}", - nfkd: "\u{1107}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{BD8C}", - nfc: "\u{BD8C}", - nfd: "\u{1107}\u{116E}\u{11B3}", - nfkc: "\u{BD8C}", - nfkd: "\u{1107}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{BD8D}", - nfc: "\u{BD8D}", - nfd: "\u{1107}\u{116E}\u{11B4}", - nfkc: "\u{BD8D}", - nfkd: "\u{1107}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{BD8E}", - nfc: "\u{BD8E}", - nfd: "\u{1107}\u{116E}\u{11B5}", - nfkc: "\u{BD8E}", - nfkd: "\u{1107}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{BD8F}", - nfc: "\u{BD8F}", - nfd: "\u{1107}\u{116E}\u{11B6}", - nfkc: "\u{BD8F}", - nfkd: "\u{1107}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{BD90}", - nfc: "\u{BD90}", - nfd: "\u{1107}\u{116E}\u{11B7}", - nfkc: "\u{BD90}", - nfkd: "\u{1107}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{BD91}", - nfc: "\u{BD91}", - nfd: "\u{1107}\u{116E}\u{11B8}", - nfkc: "\u{BD91}", - nfkd: "\u{1107}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{BD92}", - nfc: "\u{BD92}", - nfd: "\u{1107}\u{116E}\u{11B9}", - nfkc: "\u{BD92}", - nfkd: "\u{1107}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{BD93}", - nfc: "\u{BD93}", - nfd: "\u{1107}\u{116E}\u{11BA}", - nfkc: "\u{BD93}", - nfkd: "\u{1107}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{BD94}", - nfc: "\u{BD94}", - nfd: "\u{1107}\u{116E}\u{11BB}", - nfkc: "\u{BD94}", - nfkd: "\u{1107}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{BD95}", - nfc: "\u{BD95}", - nfd: "\u{1107}\u{116E}\u{11BC}", - nfkc: "\u{BD95}", - nfkd: "\u{1107}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{BD96}", - nfc: "\u{BD96}", - nfd: "\u{1107}\u{116E}\u{11BD}", - nfkc: "\u{BD96}", - nfkd: "\u{1107}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{BD97}", - nfc: "\u{BD97}", - nfd: "\u{1107}\u{116E}\u{11BE}", - nfkc: "\u{BD97}", - nfkd: "\u{1107}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{BD98}", - nfc: "\u{BD98}", - nfd: "\u{1107}\u{116E}\u{11BF}", - nfkc: "\u{BD98}", - nfkd: "\u{1107}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{BD99}", - nfc: "\u{BD99}", - nfd: "\u{1107}\u{116E}\u{11C0}", - nfkc: "\u{BD99}", - nfkd: "\u{1107}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{BD9A}", - nfc: "\u{BD9A}", - nfd: "\u{1107}\u{116E}\u{11C1}", - nfkc: "\u{BD9A}", - nfkd: "\u{1107}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{BD9B}", - nfc: "\u{BD9B}", - nfd: "\u{1107}\u{116E}\u{11C2}", - nfkc: "\u{BD9B}", - nfkd: "\u{1107}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{BD9C}", - nfc: "\u{BD9C}", - nfd: "\u{1107}\u{116F}", - nfkc: "\u{BD9C}", - nfkd: "\u{1107}\u{116F}", - }, - NormalizationTest { - source: "\u{BD9D}", - nfc: "\u{BD9D}", - nfd: "\u{1107}\u{116F}\u{11A8}", - nfkc: "\u{BD9D}", - nfkd: "\u{1107}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{BD9E}", - nfc: "\u{BD9E}", - nfd: "\u{1107}\u{116F}\u{11A9}", - nfkc: "\u{BD9E}", - nfkd: "\u{1107}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{BD9F}", - nfc: "\u{BD9F}", - nfd: "\u{1107}\u{116F}\u{11AA}", - nfkc: "\u{BD9F}", - nfkd: "\u{1107}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{BDA0}", - nfc: "\u{BDA0}", - nfd: "\u{1107}\u{116F}\u{11AB}", - nfkc: "\u{BDA0}", - nfkd: "\u{1107}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{BDA1}", - nfc: "\u{BDA1}", - nfd: "\u{1107}\u{116F}\u{11AC}", - nfkc: "\u{BDA1}", - nfkd: "\u{1107}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{BDA2}", - nfc: "\u{BDA2}", - nfd: "\u{1107}\u{116F}\u{11AD}", - nfkc: "\u{BDA2}", - nfkd: "\u{1107}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{BDA3}", - nfc: "\u{BDA3}", - nfd: "\u{1107}\u{116F}\u{11AE}", - nfkc: "\u{BDA3}", - nfkd: "\u{1107}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{BDA4}", - nfc: "\u{BDA4}", - nfd: "\u{1107}\u{116F}\u{11AF}", - nfkc: "\u{BDA4}", - nfkd: "\u{1107}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{BDA5}", - nfc: "\u{BDA5}", - nfd: "\u{1107}\u{116F}\u{11B0}", - nfkc: "\u{BDA5}", - nfkd: "\u{1107}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{BDA6}", - nfc: "\u{BDA6}", - nfd: "\u{1107}\u{116F}\u{11B1}", - nfkc: "\u{BDA6}", - nfkd: "\u{1107}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{BDA7}", - nfc: "\u{BDA7}", - nfd: "\u{1107}\u{116F}\u{11B2}", - nfkc: "\u{BDA7}", - nfkd: "\u{1107}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{BDA8}", - nfc: "\u{BDA8}", - nfd: "\u{1107}\u{116F}\u{11B3}", - nfkc: "\u{BDA8}", - nfkd: "\u{1107}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{BDA9}", - nfc: "\u{BDA9}", - nfd: "\u{1107}\u{116F}\u{11B4}", - nfkc: "\u{BDA9}", - nfkd: "\u{1107}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{BDAA}", - nfc: "\u{BDAA}", - nfd: "\u{1107}\u{116F}\u{11B5}", - nfkc: "\u{BDAA}", - nfkd: "\u{1107}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{BDAB}", - nfc: "\u{BDAB}", - nfd: "\u{1107}\u{116F}\u{11B6}", - nfkc: "\u{BDAB}", - nfkd: "\u{1107}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{BDAC}", - nfc: "\u{BDAC}", - nfd: "\u{1107}\u{116F}\u{11B7}", - nfkc: "\u{BDAC}", - nfkd: "\u{1107}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{BDAD}", - nfc: "\u{BDAD}", - nfd: "\u{1107}\u{116F}\u{11B8}", - nfkc: "\u{BDAD}", - nfkd: "\u{1107}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{BDAE}", - nfc: "\u{BDAE}", - nfd: "\u{1107}\u{116F}\u{11B9}", - nfkc: "\u{BDAE}", - nfkd: "\u{1107}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{BDAF}", - nfc: "\u{BDAF}", - nfd: "\u{1107}\u{116F}\u{11BA}", - nfkc: "\u{BDAF}", - nfkd: "\u{1107}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{BDB0}", - nfc: "\u{BDB0}", - nfd: "\u{1107}\u{116F}\u{11BB}", - nfkc: "\u{BDB0}", - nfkd: "\u{1107}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{BDB1}", - nfc: "\u{BDB1}", - nfd: "\u{1107}\u{116F}\u{11BC}", - nfkc: "\u{BDB1}", - nfkd: "\u{1107}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{BDB2}", - nfc: "\u{BDB2}", - nfd: "\u{1107}\u{116F}\u{11BD}", - nfkc: "\u{BDB2}", - nfkd: "\u{1107}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{BDB3}", - nfc: "\u{BDB3}", - nfd: "\u{1107}\u{116F}\u{11BE}", - nfkc: "\u{BDB3}", - nfkd: "\u{1107}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{BDB4}", - nfc: "\u{BDB4}", - nfd: "\u{1107}\u{116F}\u{11BF}", - nfkc: "\u{BDB4}", - nfkd: "\u{1107}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{BDB5}", - nfc: "\u{BDB5}", - nfd: "\u{1107}\u{116F}\u{11C0}", - nfkc: "\u{BDB5}", - nfkd: "\u{1107}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{BDB6}", - nfc: "\u{BDB6}", - nfd: "\u{1107}\u{116F}\u{11C1}", - nfkc: "\u{BDB6}", - nfkd: "\u{1107}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{BDB7}", - nfc: "\u{BDB7}", - nfd: "\u{1107}\u{116F}\u{11C2}", - nfkc: "\u{BDB7}", - nfkd: "\u{1107}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{BDB8}", - nfc: "\u{BDB8}", - nfd: "\u{1107}\u{1170}", - nfkc: "\u{BDB8}", - nfkd: "\u{1107}\u{1170}", - }, - NormalizationTest { - source: "\u{BDB9}", - nfc: "\u{BDB9}", - nfd: "\u{1107}\u{1170}\u{11A8}", - nfkc: "\u{BDB9}", - nfkd: "\u{1107}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{BDBA}", - nfc: "\u{BDBA}", - nfd: "\u{1107}\u{1170}\u{11A9}", - nfkc: "\u{BDBA}", - nfkd: "\u{1107}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{BDBB}", - nfc: "\u{BDBB}", - nfd: "\u{1107}\u{1170}\u{11AA}", - nfkc: "\u{BDBB}", - nfkd: "\u{1107}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{BDBC}", - nfc: "\u{BDBC}", - nfd: "\u{1107}\u{1170}\u{11AB}", - nfkc: "\u{BDBC}", - nfkd: "\u{1107}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{BDBD}", - nfc: "\u{BDBD}", - nfd: "\u{1107}\u{1170}\u{11AC}", - nfkc: "\u{BDBD}", - nfkd: "\u{1107}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{BDBE}", - nfc: "\u{BDBE}", - nfd: "\u{1107}\u{1170}\u{11AD}", - nfkc: "\u{BDBE}", - nfkd: "\u{1107}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{BDBF}", - nfc: "\u{BDBF}", - nfd: "\u{1107}\u{1170}\u{11AE}", - nfkc: "\u{BDBF}", - nfkd: "\u{1107}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{BDC0}", - nfc: "\u{BDC0}", - nfd: "\u{1107}\u{1170}\u{11AF}", - nfkc: "\u{BDC0}", - nfkd: "\u{1107}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{BDC1}", - nfc: "\u{BDC1}", - nfd: "\u{1107}\u{1170}\u{11B0}", - nfkc: "\u{BDC1}", - nfkd: "\u{1107}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{BDC2}", - nfc: "\u{BDC2}", - nfd: "\u{1107}\u{1170}\u{11B1}", - nfkc: "\u{BDC2}", - nfkd: "\u{1107}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{BDC3}", - nfc: "\u{BDC3}", - nfd: "\u{1107}\u{1170}\u{11B2}", - nfkc: "\u{BDC3}", - nfkd: "\u{1107}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{BDC4}", - nfc: "\u{BDC4}", - nfd: "\u{1107}\u{1170}\u{11B3}", - nfkc: "\u{BDC4}", - nfkd: "\u{1107}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{BDC5}", - nfc: "\u{BDC5}", - nfd: "\u{1107}\u{1170}\u{11B4}", - nfkc: "\u{BDC5}", - nfkd: "\u{1107}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{BDC6}", - nfc: "\u{BDC6}", - nfd: "\u{1107}\u{1170}\u{11B5}", - nfkc: "\u{BDC6}", - nfkd: "\u{1107}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{BDC7}", - nfc: "\u{BDC7}", - nfd: "\u{1107}\u{1170}\u{11B6}", - nfkc: "\u{BDC7}", - nfkd: "\u{1107}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{BDC8}", - nfc: "\u{BDC8}", - nfd: "\u{1107}\u{1170}\u{11B7}", - nfkc: "\u{BDC8}", - nfkd: "\u{1107}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{BDC9}", - nfc: "\u{BDC9}", - nfd: "\u{1107}\u{1170}\u{11B8}", - nfkc: "\u{BDC9}", - nfkd: "\u{1107}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{BDCA}", - nfc: "\u{BDCA}", - nfd: "\u{1107}\u{1170}\u{11B9}", - nfkc: "\u{BDCA}", - nfkd: "\u{1107}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{BDCB}", - nfc: "\u{BDCB}", - nfd: "\u{1107}\u{1170}\u{11BA}", - nfkc: "\u{BDCB}", - nfkd: "\u{1107}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{BDCC}", - nfc: "\u{BDCC}", - nfd: "\u{1107}\u{1170}\u{11BB}", - nfkc: "\u{BDCC}", - nfkd: "\u{1107}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{BDCD}", - nfc: "\u{BDCD}", - nfd: "\u{1107}\u{1170}\u{11BC}", - nfkc: "\u{BDCD}", - nfkd: "\u{1107}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{BDCE}", - nfc: "\u{BDCE}", - nfd: "\u{1107}\u{1170}\u{11BD}", - nfkc: "\u{BDCE}", - nfkd: "\u{1107}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{BDCF}", - nfc: "\u{BDCF}", - nfd: "\u{1107}\u{1170}\u{11BE}", - nfkc: "\u{BDCF}", - nfkd: "\u{1107}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{BDD0}", - nfc: "\u{BDD0}", - nfd: "\u{1107}\u{1170}\u{11BF}", - nfkc: "\u{BDD0}", - nfkd: "\u{1107}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{BDD1}", - nfc: "\u{BDD1}", - nfd: "\u{1107}\u{1170}\u{11C0}", - nfkc: "\u{BDD1}", - nfkd: "\u{1107}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{BDD2}", - nfc: "\u{BDD2}", - nfd: "\u{1107}\u{1170}\u{11C1}", - nfkc: "\u{BDD2}", - nfkd: "\u{1107}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{BDD3}", - nfc: "\u{BDD3}", - nfd: "\u{1107}\u{1170}\u{11C2}", - nfkc: "\u{BDD3}", - nfkd: "\u{1107}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{BDD4}", - nfc: "\u{BDD4}", - nfd: "\u{1107}\u{1171}", - nfkc: "\u{BDD4}", - nfkd: "\u{1107}\u{1171}", - }, - NormalizationTest { - source: "\u{BDD5}", - nfc: "\u{BDD5}", - nfd: "\u{1107}\u{1171}\u{11A8}", - nfkc: "\u{BDD5}", - nfkd: "\u{1107}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{BDD6}", - nfc: "\u{BDD6}", - nfd: "\u{1107}\u{1171}\u{11A9}", - nfkc: "\u{BDD6}", - nfkd: "\u{1107}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{BDD7}", - nfc: "\u{BDD7}", - nfd: "\u{1107}\u{1171}\u{11AA}", - nfkc: "\u{BDD7}", - nfkd: "\u{1107}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{BDD8}", - nfc: "\u{BDD8}", - nfd: "\u{1107}\u{1171}\u{11AB}", - nfkc: "\u{BDD8}", - nfkd: "\u{1107}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{BDD9}", - nfc: "\u{BDD9}", - nfd: "\u{1107}\u{1171}\u{11AC}", - nfkc: "\u{BDD9}", - nfkd: "\u{1107}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{BDDA}", - nfc: "\u{BDDA}", - nfd: "\u{1107}\u{1171}\u{11AD}", - nfkc: "\u{BDDA}", - nfkd: "\u{1107}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{BDDB}", - nfc: "\u{BDDB}", - nfd: "\u{1107}\u{1171}\u{11AE}", - nfkc: "\u{BDDB}", - nfkd: "\u{1107}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{BDDC}", - nfc: "\u{BDDC}", - nfd: "\u{1107}\u{1171}\u{11AF}", - nfkc: "\u{BDDC}", - nfkd: "\u{1107}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{BDDD}", - nfc: "\u{BDDD}", - nfd: "\u{1107}\u{1171}\u{11B0}", - nfkc: "\u{BDDD}", - nfkd: "\u{1107}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{BDDE}", - nfc: "\u{BDDE}", - nfd: "\u{1107}\u{1171}\u{11B1}", - nfkc: "\u{BDDE}", - nfkd: "\u{1107}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{BDDF}", - nfc: "\u{BDDF}", - nfd: "\u{1107}\u{1171}\u{11B2}", - nfkc: "\u{BDDF}", - nfkd: "\u{1107}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{BDE0}", - nfc: "\u{BDE0}", - nfd: "\u{1107}\u{1171}\u{11B3}", - nfkc: "\u{BDE0}", - nfkd: "\u{1107}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{BDE1}", - nfc: "\u{BDE1}", - nfd: "\u{1107}\u{1171}\u{11B4}", - nfkc: "\u{BDE1}", - nfkd: "\u{1107}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{BDE2}", - nfc: "\u{BDE2}", - nfd: "\u{1107}\u{1171}\u{11B5}", - nfkc: "\u{BDE2}", - nfkd: "\u{1107}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{BDE3}", - nfc: "\u{BDE3}", - nfd: "\u{1107}\u{1171}\u{11B6}", - nfkc: "\u{BDE3}", - nfkd: "\u{1107}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{BDE4}", - nfc: "\u{BDE4}", - nfd: "\u{1107}\u{1171}\u{11B7}", - nfkc: "\u{BDE4}", - nfkd: "\u{1107}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{BDE5}", - nfc: "\u{BDE5}", - nfd: "\u{1107}\u{1171}\u{11B8}", - nfkc: "\u{BDE5}", - nfkd: "\u{1107}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{BDE6}", - nfc: "\u{BDE6}", - nfd: "\u{1107}\u{1171}\u{11B9}", - nfkc: "\u{BDE6}", - nfkd: "\u{1107}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{BDE7}", - nfc: "\u{BDE7}", - nfd: "\u{1107}\u{1171}\u{11BA}", - nfkc: "\u{BDE7}", - nfkd: "\u{1107}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{BDE8}", - nfc: "\u{BDE8}", - nfd: "\u{1107}\u{1171}\u{11BB}", - nfkc: "\u{BDE8}", - nfkd: "\u{1107}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{BDE9}", - nfc: "\u{BDE9}", - nfd: "\u{1107}\u{1171}\u{11BC}", - nfkc: "\u{BDE9}", - nfkd: "\u{1107}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{BDEA}", - nfc: "\u{BDEA}", - nfd: "\u{1107}\u{1171}\u{11BD}", - nfkc: "\u{BDEA}", - nfkd: "\u{1107}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{BDEB}", - nfc: "\u{BDEB}", - nfd: "\u{1107}\u{1171}\u{11BE}", - nfkc: "\u{BDEB}", - nfkd: "\u{1107}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{BDEC}", - nfc: "\u{BDEC}", - nfd: "\u{1107}\u{1171}\u{11BF}", - nfkc: "\u{BDEC}", - nfkd: "\u{1107}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{BDED}", - nfc: "\u{BDED}", - nfd: "\u{1107}\u{1171}\u{11C0}", - nfkc: "\u{BDED}", - nfkd: "\u{1107}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{BDEE}", - nfc: "\u{BDEE}", - nfd: "\u{1107}\u{1171}\u{11C1}", - nfkc: "\u{BDEE}", - nfkd: "\u{1107}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{BDEF}", - nfc: "\u{BDEF}", - nfd: "\u{1107}\u{1171}\u{11C2}", - nfkc: "\u{BDEF}", - nfkd: "\u{1107}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{BDF0}", - nfc: "\u{BDF0}", - nfd: "\u{1107}\u{1172}", - nfkc: "\u{BDF0}", - nfkd: "\u{1107}\u{1172}", - }, - NormalizationTest { - source: "\u{BDF1}", - nfc: "\u{BDF1}", - nfd: "\u{1107}\u{1172}\u{11A8}", - nfkc: "\u{BDF1}", - nfkd: "\u{1107}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{BDF2}", - nfc: "\u{BDF2}", - nfd: "\u{1107}\u{1172}\u{11A9}", - nfkc: "\u{BDF2}", - nfkd: "\u{1107}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{BDF3}", - nfc: "\u{BDF3}", - nfd: "\u{1107}\u{1172}\u{11AA}", - nfkc: "\u{BDF3}", - nfkd: "\u{1107}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{BDF4}", - nfc: "\u{BDF4}", - nfd: "\u{1107}\u{1172}\u{11AB}", - nfkc: "\u{BDF4}", - nfkd: "\u{1107}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{BDF5}", - nfc: "\u{BDF5}", - nfd: "\u{1107}\u{1172}\u{11AC}", - nfkc: "\u{BDF5}", - nfkd: "\u{1107}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{BDF6}", - nfc: "\u{BDF6}", - nfd: "\u{1107}\u{1172}\u{11AD}", - nfkc: "\u{BDF6}", - nfkd: "\u{1107}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{BDF7}", - nfc: "\u{BDF7}", - nfd: "\u{1107}\u{1172}\u{11AE}", - nfkc: "\u{BDF7}", - nfkd: "\u{1107}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{BDF8}", - nfc: "\u{BDF8}", - nfd: "\u{1107}\u{1172}\u{11AF}", - nfkc: "\u{BDF8}", - nfkd: "\u{1107}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{BDF9}", - nfc: "\u{BDF9}", - nfd: "\u{1107}\u{1172}\u{11B0}", - nfkc: "\u{BDF9}", - nfkd: "\u{1107}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{BDFA}", - nfc: "\u{BDFA}", - nfd: "\u{1107}\u{1172}\u{11B1}", - nfkc: "\u{BDFA}", - nfkd: "\u{1107}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{BDFB}", - nfc: "\u{BDFB}", - nfd: "\u{1107}\u{1172}\u{11B2}", - nfkc: "\u{BDFB}", - nfkd: "\u{1107}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{BDFC}", - nfc: "\u{BDFC}", - nfd: "\u{1107}\u{1172}\u{11B3}", - nfkc: "\u{BDFC}", - nfkd: "\u{1107}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{BDFD}", - nfc: "\u{BDFD}", - nfd: "\u{1107}\u{1172}\u{11B4}", - nfkc: "\u{BDFD}", - nfkd: "\u{1107}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{BDFE}", - nfc: "\u{BDFE}", - nfd: "\u{1107}\u{1172}\u{11B5}", - nfkc: "\u{BDFE}", - nfkd: "\u{1107}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{BDFF}", - nfc: "\u{BDFF}", - nfd: "\u{1107}\u{1172}\u{11B6}", - nfkc: "\u{BDFF}", - nfkd: "\u{1107}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{BE00}", - nfc: "\u{BE00}", - nfd: "\u{1107}\u{1172}\u{11B7}", - nfkc: "\u{BE00}", - nfkd: "\u{1107}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{BE01}", - nfc: "\u{BE01}", - nfd: "\u{1107}\u{1172}\u{11B8}", - nfkc: "\u{BE01}", - nfkd: "\u{1107}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{BE02}", - nfc: "\u{BE02}", - nfd: "\u{1107}\u{1172}\u{11B9}", - nfkc: "\u{BE02}", - nfkd: "\u{1107}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{BE03}", - nfc: "\u{BE03}", - nfd: "\u{1107}\u{1172}\u{11BA}", - nfkc: "\u{BE03}", - nfkd: "\u{1107}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{BE04}", - nfc: "\u{BE04}", - nfd: "\u{1107}\u{1172}\u{11BB}", - nfkc: "\u{BE04}", - nfkd: "\u{1107}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{BE05}", - nfc: "\u{BE05}", - nfd: "\u{1107}\u{1172}\u{11BC}", - nfkc: "\u{BE05}", - nfkd: "\u{1107}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{BE06}", - nfc: "\u{BE06}", - nfd: "\u{1107}\u{1172}\u{11BD}", - nfkc: "\u{BE06}", - nfkd: "\u{1107}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{BE07}", - nfc: "\u{BE07}", - nfd: "\u{1107}\u{1172}\u{11BE}", - nfkc: "\u{BE07}", - nfkd: "\u{1107}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{BE08}", - nfc: "\u{BE08}", - nfd: "\u{1107}\u{1172}\u{11BF}", - nfkc: "\u{BE08}", - nfkd: "\u{1107}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{BE09}", - nfc: "\u{BE09}", - nfd: "\u{1107}\u{1172}\u{11C0}", - nfkc: "\u{BE09}", - nfkd: "\u{1107}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{BE0A}", - nfc: "\u{BE0A}", - nfd: "\u{1107}\u{1172}\u{11C1}", - nfkc: "\u{BE0A}", - nfkd: "\u{1107}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{BE0B}", - nfc: "\u{BE0B}", - nfd: "\u{1107}\u{1172}\u{11C2}", - nfkc: "\u{BE0B}", - nfkd: "\u{1107}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{BE0C}", - nfc: "\u{BE0C}", - nfd: "\u{1107}\u{1173}", - nfkc: "\u{BE0C}", - nfkd: "\u{1107}\u{1173}", - }, - NormalizationTest { - source: "\u{BE0D}", - nfc: "\u{BE0D}", - nfd: "\u{1107}\u{1173}\u{11A8}", - nfkc: "\u{BE0D}", - nfkd: "\u{1107}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{BE0E}", - nfc: "\u{BE0E}", - nfd: "\u{1107}\u{1173}\u{11A9}", - nfkc: "\u{BE0E}", - nfkd: "\u{1107}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{BE0F}", - nfc: "\u{BE0F}", - nfd: "\u{1107}\u{1173}\u{11AA}", - nfkc: "\u{BE0F}", - nfkd: "\u{1107}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{BE10}", - nfc: "\u{BE10}", - nfd: "\u{1107}\u{1173}\u{11AB}", - nfkc: "\u{BE10}", - nfkd: "\u{1107}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{BE11}", - nfc: "\u{BE11}", - nfd: "\u{1107}\u{1173}\u{11AC}", - nfkc: "\u{BE11}", - nfkd: "\u{1107}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{BE12}", - nfc: "\u{BE12}", - nfd: "\u{1107}\u{1173}\u{11AD}", - nfkc: "\u{BE12}", - nfkd: "\u{1107}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{BE13}", - nfc: "\u{BE13}", - nfd: "\u{1107}\u{1173}\u{11AE}", - nfkc: "\u{BE13}", - nfkd: "\u{1107}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{BE14}", - nfc: "\u{BE14}", - nfd: "\u{1107}\u{1173}\u{11AF}", - nfkc: "\u{BE14}", - nfkd: "\u{1107}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{BE15}", - nfc: "\u{BE15}", - nfd: "\u{1107}\u{1173}\u{11B0}", - nfkc: "\u{BE15}", - nfkd: "\u{1107}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{BE16}", - nfc: "\u{BE16}", - nfd: "\u{1107}\u{1173}\u{11B1}", - nfkc: "\u{BE16}", - nfkd: "\u{1107}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{BE17}", - nfc: "\u{BE17}", - nfd: "\u{1107}\u{1173}\u{11B2}", - nfkc: "\u{BE17}", - nfkd: "\u{1107}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{BE18}", - nfc: "\u{BE18}", - nfd: "\u{1107}\u{1173}\u{11B3}", - nfkc: "\u{BE18}", - nfkd: "\u{1107}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{BE19}", - nfc: "\u{BE19}", - nfd: "\u{1107}\u{1173}\u{11B4}", - nfkc: "\u{BE19}", - nfkd: "\u{1107}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{BE1A}", - nfc: "\u{BE1A}", - nfd: "\u{1107}\u{1173}\u{11B5}", - nfkc: "\u{BE1A}", - nfkd: "\u{1107}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{BE1B}", - nfc: "\u{BE1B}", - nfd: "\u{1107}\u{1173}\u{11B6}", - nfkc: "\u{BE1B}", - nfkd: "\u{1107}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{BE1C}", - nfc: "\u{BE1C}", - nfd: "\u{1107}\u{1173}\u{11B7}", - nfkc: "\u{BE1C}", - nfkd: "\u{1107}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{BE1D}", - nfc: "\u{BE1D}", - nfd: "\u{1107}\u{1173}\u{11B8}", - nfkc: "\u{BE1D}", - nfkd: "\u{1107}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{BE1E}", - nfc: "\u{BE1E}", - nfd: "\u{1107}\u{1173}\u{11B9}", - nfkc: "\u{BE1E}", - nfkd: "\u{1107}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{BE1F}", - nfc: "\u{BE1F}", - nfd: "\u{1107}\u{1173}\u{11BA}", - nfkc: "\u{BE1F}", - nfkd: "\u{1107}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{BE20}", - nfc: "\u{BE20}", - nfd: "\u{1107}\u{1173}\u{11BB}", - nfkc: "\u{BE20}", - nfkd: "\u{1107}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{BE21}", - nfc: "\u{BE21}", - nfd: "\u{1107}\u{1173}\u{11BC}", - nfkc: "\u{BE21}", - nfkd: "\u{1107}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{BE22}", - nfc: "\u{BE22}", - nfd: "\u{1107}\u{1173}\u{11BD}", - nfkc: "\u{BE22}", - nfkd: "\u{1107}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{BE23}", - nfc: "\u{BE23}", - nfd: "\u{1107}\u{1173}\u{11BE}", - nfkc: "\u{BE23}", - nfkd: "\u{1107}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{BE24}", - nfc: "\u{BE24}", - nfd: "\u{1107}\u{1173}\u{11BF}", - nfkc: "\u{BE24}", - nfkd: "\u{1107}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{BE25}", - nfc: "\u{BE25}", - nfd: "\u{1107}\u{1173}\u{11C0}", - nfkc: "\u{BE25}", - nfkd: "\u{1107}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{BE26}", - nfc: "\u{BE26}", - nfd: "\u{1107}\u{1173}\u{11C1}", - nfkc: "\u{BE26}", - nfkd: "\u{1107}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{BE27}", - nfc: "\u{BE27}", - nfd: "\u{1107}\u{1173}\u{11C2}", - nfkc: "\u{BE27}", - nfkd: "\u{1107}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{BE28}", - nfc: "\u{BE28}", - nfd: "\u{1107}\u{1174}", - nfkc: "\u{BE28}", - nfkd: "\u{1107}\u{1174}", - }, - NormalizationTest { - source: "\u{BE29}", - nfc: "\u{BE29}", - nfd: "\u{1107}\u{1174}\u{11A8}", - nfkc: "\u{BE29}", - nfkd: "\u{1107}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{BE2A}", - nfc: "\u{BE2A}", - nfd: "\u{1107}\u{1174}\u{11A9}", - nfkc: "\u{BE2A}", - nfkd: "\u{1107}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{BE2B}", - nfc: "\u{BE2B}", - nfd: "\u{1107}\u{1174}\u{11AA}", - nfkc: "\u{BE2B}", - nfkd: "\u{1107}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{BE2C}", - nfc: "\u{BE2C}", - nfd: "\u{1107}\u{1174}\u{11AB}", - nfkc: "\u{BE2C}", - nfkd: "\u{1107}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{BE2D}", - nfc: "\u{BE2D}", - nfd: "\u{1107}\u{1174}\u{11AC}", - nfkc: "\u{BE2D}", - nfkd: "\u{1107}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{BE2E}", - nfc: "\u{BE2E}", - nfd: "\u{1107}\u{1174}\u{11AD}", - nfkc: "\u{BE2E}", - nfkd: "\u{1107}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{BE2F}", - nfc: "\u{BE2F}", - nfd: "\u{1107}\u{1174}\u{11AE}", - nfkc: "\u{BE2F}", - nfkd: "\u{1107}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{BE30}", - nfc: "\u{BE30}", - nfd: "\u{1107}\u{1174}\u{11AF}", - nfkc: "\u{BE30}", - nfkd: "\u{1107}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{BE31}", - nfc: "\u{BE31}", - nfd: "\u{1107}\u{1174}\u{11B0}", - nfkc: "\u{BE31}", - nfkd: "\u{1107}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{BE32}", - nfc: "\u{BE32}", - nfd: "\u{1107}\u{1174}\u{11B1}", - nfkc: "\u{BE32}", - nfkd: "\u{1107}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{BE33}", - nfc: "\u{BE33}", - nfd: "\u{1107}\u{1174}\u{11B2}", - nfkc: "\u{BE33}", - nfkd: "\u{1107}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{BE34}", - nfc: "\u{BE34}", - nfd: "\u{1107}\u{1174}\u{11B3}", - nfkc: "\u{BE34}", - nfkd: "\u{1107}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{BE35}", - nfc: "\u{BE35}", - nfd: "\u{1107}\u{1174}\u{11B4}", - nfkc: "\u{BE35}", - nfkd: "\u{1107}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{BE36}", - nfc: "\u{BE36}", - nfd: "\u{1107}\u{1174}\u{11B5}", - nfkc: "\u{BE36}", - nfkd: "\u{1107}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{BE37}", - nfc: "\u{BE37}", - nfd: "\u{1107}\u{1174}\u{11B6}", - nfkc: "\u{BE37}", - nfkd: "\u{1107}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{BE38}", - nfc: "\u{BE38}", - nfd: "\u{1107}\u{1174}\u{11B7}", - nfkc: "\u{BE38}", - nfkd: "\u{1107}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{BE39}", - nfc: "\u{BE39}", - nfd: "\u{1107}\u{1174}\u{11B8}", - nfkc: "\u{BE39}", - nfkd: "\u{1107}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{BE3A}", - nfc: "\u{BE3A}", - nfd: "\u{1107}\u{1174}\u{11B9}", - nfkc: "\u{BE3A}", - nfkd: "\u{1107}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{BE3B}", - nfc: "\u{BE3B}", - nfd: "\u{1107}\u{1174}\u{11BA}", - nfkc: "\u{BE3B}", - nfkd: "\u{1107}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{BE3C}", - nfc: "\u{BE3C}", - nfd: "\u{1107}\u{1174}\u{11BB}", - nfkc: "\u{BE3C}", - nfkd: "\u{1107}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{BE3D}", - nfc: "\u{BE3D}", - nfd: "\u{1107}\u{1174}\u{11BC}", - nfkc: "\u{BE3D}", - nfkd: "\u{1107}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{BE3E}", - nfc: "\u{BE3E}", - nfd: "\u{1107}\u{1174}\u{11BD}", - nfkc: "\u{BE3E}", - nfkd: "\u{1107}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{BE3F}", - nfc: "\u{BE3F}", - nfd: "\u{1107}\u{1174}\u{11BE}", - nfkc: "\u{BE3F}", - nfkd: "\u{1107}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{BE40}", - nfc: "\u{BE40}", - nfd: "\u{1107}\u{1174}\u{11BF}", - nfkc: "\u{BE40}", - nfkd: "\u{1107}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{BE41}", - nfc: "\u{BE41}", - nfd: "\u{1107}\u{1174}\u{11C0}", - nfkc: "\u{BE41}", - nfkd: "\u{1107}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{BE42}", - nfc: "\u{BE42}", - nfd: "\u{1107}\u{1174}\u{11C1}", - nfkc: "\u{BE42}", - nfkd: "\u{1107}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{BE43}", - nfc: "\u{BE43}", - nfd: "\u{1107}\u{1174}\u{11C2}", - nfkc: "\u{BE43}", - nfkd: "\u{1107}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{BE44}", - nfc: "\u{BE44}", - nfd: "\u{1107}\u{1175}", - nfkc: "\u{BE44}", - nfkd: "\u{1107}\u{1175}", - }, - NormalizationTest { - source: "\u{BE45}", - nfc: "\u{BE45}", - nfd: "\u{1107}\u{1175}\u{11A8}", - nfkc: "\u{BE45}", - nfkd: "\u{1107}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{BE46}", - nfc: "\u{BE46}", - nfd: "\u{1107}\u{1175}\u{11A9}", - nfkc: "\u{BE46}", - nfkd: "\u{1107}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{BE47}", - nfc: "\u{BE47}", - nfd: "\u{1107}\u{1175}\u{11AA}", - nfkc: "\u{BE47}", - nfkd: "\u{1107}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{BE48}", - nfc: "\u{BE48}", - nfd: "\u{1107}\u{1175}\u{11AB}", - nfkc: "\u{BE48}", - nfkd: "\u{1107}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{BE49}", - nfc: "\u{BE49}", - nfd: "\u{1107}\u{1175}\u{11AC}", - nfkc: "\u{BE49}", - nfkd: "\u{1107}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{BE4A}", - nfc: "\u{BE4A}", - nfd: "\u{1107}\u{1175}\u{11AD}", - nfkc: "\u{BE4A}", - nfkd: "\u{1107}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{BE4B}", - nfc: "\u{BE4B}", - nfd: "\u{1107}\u{1175}\u{11AE}", - nfkc: "\u{BE4B}", - nfkd: "\u{1107}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{BE4C}", - nfc: "\u{BE4C}", - nfd: "\u{1107}\u{1175}\u{11AF}", - nfkc: "\u{BE4C}", - nfkd: "\u{1107}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{BE4D}", - nfc: "\u{BE4D}", - nfd: "\u{1107}\u{1175}\u{11B0}", - nfkc: "\u{BE4D}", - nfkd: "\u{1107}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{BE4E}", - nfc: "\u{BE4E}", - nfd: "\u{1107}\u{1175}\u{11B1}", - nfkc: "\u{BE4E}", - nfkd: "\u{1107}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{BE4F}", - nfc: "\u{BE4F}", - nfd: "\u{1107}\u{1175}\u{11B2}", - nfkc: "\u{BE4F}", - nfkd: "\u{1107}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{BE50}", - nfc: "\u{BE50}", - nfd: "\u{1107}\u{1175}\u{11B3}", - nfkc: "\u{BE50}", - nfkd: "\u{1107}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{BE51}", - nfc: "\u{BE51}", - nfd: "\u{1107}\u{1175}\u{11B4}", - nfkc: "\u{BE51}", - nfkd: "\u{1107}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{BE52}", - nfc: "\u{BE52}", - nfd: "\u{1107}\u{1175}\u{11B5}", - nfkc: "\u{BE52}", - nfkd: "\u{1107}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{BE53}", - nfc: "\u{BE53}", - nfd: "\u{1107}\u{1175}\u{11B6}", - nfkc: "\u{BE53}", - nfkd: "\u{1107}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{BE54}", - nfc: "\u{BE54}", - nfd: "\u{1107}\u{1175}\u{11B7}", - nfkc: "\u{BE54}", - nfkd: "\u{1107}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{BE55}", - nfc: "\u{BE55}", - nfd: "\u{1107}\u{1175}\u{11B8}", - nfkc: "\u{BE55}", - nfkd: "\u{1107}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{BE56}", - nfc: "\u{BE56}", - nfd: "\u{1107}\u{1175}\u{11B9}", - nfkc: "\u{BE56}", - nfkd: "\u{1107}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{BE57}", - nfc: "\u{BE57}", - nfd: "\u{1107}\u{1175}\u{11BA}", - nfkc: "\u{BE57}", - nfkd: "\u{1107}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{BE58}", - nfc: "\u{BE58}", - nfd: "\u{1107}\u{1175}\u{11BB}", - nfkc: "\u{BE58}", - nfkd: "\u{1107}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{BE59}", - nfc: "\u{BE59}", - nfd: "\u{1107}\u{1175}\u{11BC}", - nfkc: "\u{BE59}", - nfkd: "\u{1107}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{BE5A}", - nfc: "\u{BE5A}", - nfd: "\u{1107}\u{1175}\u{11BD}", - nfkc: "\u{BE5A}", - nfkd: "\u{1107}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{BE5B}", - nfc: "\u{BE5B}", - nfd: "\u{1107}\u{1175}\u{11BE}", - nfkc: "\u{BE5B}", - nfkd: "\u{1107}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{BE5C}", - nfc: "\u{BE5C}", - nfd: "\u{1107}\u{1175}\u{11BF}", - nfkc: "\u{BE5C}", - nfkd: "\u{1107}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{BE5D}", - nfc: "\u{BE5D}", - nfd: "\u{1107}\u{1175}\u{11C0}", - nfkc: "\u{BE5D}", - nfkd: "\u{1107}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{BE5E}", - nfc: "\u{BE5E}", - nfd: "\u{1107}\u{1175}\u{11C1}", - nfkc: "\u{BE5E}", - nfkd: "\u{1107}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{BE5F}", - nfc: "\u{BE5F}", - nfd: "\u{1107}\u{1175}\u{11C2}", - nfkc: "\u{BE5F}", - nfkd: "\u{1107}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{BE60}", - nfc: "\u{BE60}", - nfd: "\u{1108}\u{1161}", - nfkc: "\u{BE60}", - nfkd: "\u{1108}\u{1161}", - }, - NormalizationTest { - source: "\u{BE61}", - nfc: "\u{BE61}", - nfd: "\u{1108}\u{1161}\u{11A8}", - nfkc: "\u{BE61}", - nfkd: "\u{1108}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{BE62}", - nfc: "\u{BE62}", - nfd: "\u{1108}\u{1161}\u{11A9}", - nfkc: "\u{BE62}", - nfkd: "\u{1108}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{BE63}", - nfc: "\u{BE63}", - nfd: "\u{1108}\u{1161}\u{11AA}", - nfkc: "\u{BE63}", - nfkd: "\u{1108}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{BE64}", - nfc: "\u{BE64}", - nfd: "\u{1108}\u{1161}\u{11AB}", - nfkc: "\u{BE64}", - nfkd: "\u{1108}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{BE65}", - nfc: "\u{BE65}", - nfd: "\u{1108}\u{1161}\u{11AC}", - nfkc: "\u{BE65}", - nfkd: "\u{1108}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{BE66}", - nfc: "\u{BE66}", - nfd: "\u{1108}\u{1161}\u{11AD}", - nfkc: "\u{BE66}", - nfkd: "\u{1108}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{BE67}", - nfc: "\u{BE67}", - nfd: "\u{1108}\u{1161}\u{11AE}", - nfkc: "\u{BE67}", - nfkd: "\u{1108}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{BE68}", - nfc: "\u{BE68}", - nfd: "\u{1108}\u{1161}\u{11AF}", - nfkc: "\u{BE68}", - nfkd: "\u{1108}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{BE69}", - nfc: "\u{BE69}", - nfd: "\u{1108}\u{1161}\u{11B0}", - nfkc: "\u{BE69}", - nfkd: "\u{1108}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{BE6A}", - nfc: "\u{BE6A}", - nfd: "\u{1108}\u{1161}\u{11B1}", - nfkc: "\u{BE6A}", - nfkd: "\u{1108}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{BE6B}", - nfc: "\u{BE6B}", - nfd: "\u{1108}\u{1161}\u{11B2}", - nfkc: "\u{BE6B}", - nfkd: "\u{1108}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{BE6C}", - nfc: "\u{BE6C}", - nfd: "\u{1108}\u{1161}\u{11B3}", - nfkc: "\u{BE6C}", - nfkd: "\u{1108}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{BE6D}", - nfc: "\u{BE6D}", - nfd: "\u{1108}\u{1161}\u{11B4}", - nfkc: "\u{BE6D}", - nfkd: "\u{1108}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{BE6E}", - nfc: "\u{BE6E}", - nfd: "\u{1108}\u{1161}\u{11B5}", - nfkc: "\u{BE6E}", - nfkd: "\u{1108}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{BE6F}", - nfc: "\u{BE6F}", - nfd: "\u{1108}\u{1161}\u{11B6}", - nfkc: "\u{BE6F}", - nfkd: "\u{1108}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{BE70}", - nfc: "\u{BE70}", - nfd: "\u{1108}\u{1161}\u{11B7}", - nfkc: "\u{BE70}", - nfkd: "\u{1108}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{BE71}", - nfc: "\u{BE71}", - nfd: "\u{1108}\u{1161}\u{11B8}", - nfkc: "\u{BE71}", - nfkd: "\u{1108}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{BE72}", - nfc: "\u{BE72}", - nfd: "\u{1108}\u{1161}\u{11B9}", - nfkc: "\u{BE72}", - nfkd: "\u{1108}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{BE73}", - nfc: "\u{BE73}", - nfd: "\u{1108}\u{1161}\u{11BA}", - nfkc: "\u{BE73}", - nfkd: "\u{1108}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{BE74}", - nfc: "\u{BE74}", - nfd: "\u{1108}\u{1161}\u{11BB}", - nfkc: "\u{BE74}", - nfkd: "\u{1108}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{BE75}", - nfc: "\u{BE75}", - nfd: "\u{1108}\u{1161}\u{11BC}", - nfkc: "\u{BE75}", - nfkd: "\u{1108}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{BE76}", - nfc: "\u{BE76}", - nfd: "\u{1108}\u{1161}\u{11BD}", - nfkc: "\u{BE76}", - nfkd: "\u{1108}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{BE77}", - nfc: "\u{BE77}", - nfd: "\u{1108}\u{1161}\u{11BE}", - nfkc: "\u{BE77}", - nfkd: "\u{1108}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{BE78}", - nfc: "\u{BE78}", - nfd: "\u{1108}\u{1161}\u{11BF}", - nfkc: "\u{BE78}", - nfkd: "\u{1108}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{BE79}", - nfc: "\u{BE79}", - nfd: "\u{1108}\u{1161}\u{11C0}", - nfkc: "\u{BE79}", - nfkd: "\u{1108}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{BE7A}", - nfc: "\u{BE7A}", - nfd: "\u{1108}\u{1161}\u{11C1}", - nfkc: "\u{BE7A}", - nfkd: "\u{1108}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{BE7B}", - nfc: "\u{BE7B}", - nfd: "\u{1108}\u{1161}\u{11C2}", - nfkc: "\u{BE7B}", - nfkd: "\u{1108}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{BE7C}", - nfc: "\u{BE7C}", - nfd: "\u{1108}\u{1162}", - nfkc: "\u{BE7C}", - nfkd: "\u{1108}\u{1162}", - }, - NormalizationTest { - source: "\u{BE7D}", - nfc: "\u{BE7D}", - nfd: "\u{1108}\u{1162}\u{11A8}", - nfkc: "\u{BE7D}", - nfkd: "\u{1108}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{BE7E}", - nfc: "\u{BE7E}", - nfd: "\u{1108}\u{1162}\u{11A9}", - nfkc: "\u{BE7E}", - nfkd: "\u{1108}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{BE7F}", - nfc: "\u{BE7F}", - nfd: "\u{1108}\u{1162}\u{11AA}", - nfkc: "\u{BE7F}", - nfkd: "\u{1108}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{BE80}", - nfc: "\u{BE80}", - nfd: "\u{1108}\u{1162}\u{11AB}", - nfkc: "\u{BE80}", - nfkd: "\u{1108}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{BE81}", - nfc: "\u{BE81}", - nfd: "\u{1108}\u{1162}\u{11AC}", - nfkc: "\u{BE81}", - nfkd: "\u{1108}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{BE82}", - nfc: "\u{BE82}", - nfd: "\u{1108}\u{1162}\u{11AD}", - nfkc: "\u{BE82}", - nfkd: "\u{1108}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{BE83}", - nfc: "\u{BE83}", - nfd: "\u{1108}\u{1162}\u{11AE}", - nfkc: "\u{BE83}", - nfkd: "\u{1108}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{BE84}", - nfc: "\u{BE84}", - nfd: "\u{1108}\u{1162}\u{11AF}", - nfkc: "\u{BE84}", - nfkd: "\u{1108}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{BE85}", - nfc: "\u{BE85}", - nfd: "\u{1108}\u{1162}\u{11B0}", - nfkc: "\u{BE85}", - nfkd: "\u{1108}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{BE86}", - nfc: "\u{BE86}", - nfd: "\u{1108}\u{1162}\u{11B1}", - nfkc: "\u{BE86}", - nfkd: "\u{1108}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{BE87}", - nfc: "\u{BE87}", - nfd: "\u{1108}\u{1162}\u{11B2}", - nfkc: "\u{BE87}", - nfkd: "\u{1108}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{BE88}", - nfc: "\u{BE88}", - nfd: "\u{1108}\u{1162}\u{11B3}", - nfkc: "\u{BE88}", - nfkd: "\u{1108}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{BE89}", - nfc: "\u{BE89}", - nfd: "\u{1108}\u{1162}\u{11B4}", - nfkc: "\u{BE89}", - nfkd: "\u{1108}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{BE8A}", - nfc: "\u{BE8A}", - nfd: "\u{1108}\u{1162}\u{11B5}", - nfkc: "\u{BE8A}", - nfkd: "\u{1108}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{BE8B}", - nfc: "\u{BE8B}", - nfd: "\u{1108}\u{1162}\u{11B6}", - nfkc: "\u{BE8B}", - nfkd: "\u{1108}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{BE8C}", - nfc: "\u{BE8C}", - nfd: "\u{1108}\u{1162}\u{11B7}", - nfkc: "\u{BE8C}", - nfkd: "\u{1108}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{BE8D}", - nfc: "\u{BE8D}", - nfd: "\u{1108}\u{1162}\u{11B8}", - nfkc: "\u{BE8D}", - nfkd: "\u{1108}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{BE8E}", - nfc: "\u{BE8E}", - nfd: "\u{1108}\u{1162}\u{11B9}", - nfkc: "\u{BE8E}", - nfkd: "\u{1108}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{BE8F}", - nfc: "\u{BE8F}", - nfd: "\u{1108}\u{1162}\u{11BA}", - nfkc: "\u{BE8F}", - nfkd: "\u{1108}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{BE90}", - nfc: "\u{BE90}", - nfd: "\u{1108}\u{1162}\u{11BB}", - nfkc: "\u{BE90}", - nfkd: "\u{1108}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{BE91}", - nfc: "\u{BE91}", - nfd: "\u{1108}\u{1162}\u{11BC}", - nfkc: "\u{BE91}", - nfkd: "\u{1108}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{BE92}", - nfc: "\u{BE92}", - nfd: "\u{1108}\u{1162}\u{11BD}", - nfkc: "\u{BE92}", - nfkd: "\u{1108}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{BE93}", - nfc: "\u{BE93}", - nfd: "\u{1108}\u{1162}\u{11BE}", - nfkc: "\u{BE93}", - nfkd: "\u{1108}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{BE94}", - nfc: "\u{BE94}", - nfd: "\u{1108}\u{1162}\u{11BF}", - nfkc: "\u{BE94}", - nfkd: "\u{1108}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{BE95}", - nfc: "\u{BE95}", - nfd: "\u{1108}\u{1162}\u{11C0}", - nfkc: "\u{BE95}", - nfkd: "\u{1108}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{BE96}", - nfc: "\u{BE96}", - nfd: "\u{1108}\u{1162}\u{11C1}", - nfkc: "\u{BE96}", - nfkd: "\u{1108}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{BE97}", - nfc: "\u{BE97}", - nfd: "\u{1108}\u{1162}\u{11C2}", - nfkc: "\u{BE97}", - nfkd: "\u{1108}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{BE98}", - nfc: "\u{BE98}", - nfd: "\u{1108}\u{1163}", - nfkc: "\u{BE98}", - nfkd: "\u{1108}\u{1163}", - }, - NormalizationTest { - source: "\u{BE99}", - nfc: "\u{BE99}", - nfd: "\u{1108}\u{1163}\u{11A8}", - nfkc: "\u{BE99}", - nfkd: "\u{1108}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{BE9A}", - nfc: "\u{BE9A}", - nfd: "\u{1108}\u{1163}\u{11A9}", - nfkc: "\u{BE9A}", - nfkd: "\u{1108}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{BE9B}", - nfc: "\u{BE9B}", - nfd: "\u{1108}\u{1163}\u{11AA}", - nfkc: "\u{BE9B}", - nfkd: "\u{1108}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{BE9C}", - nfc: "\u{BE9C}", - nfd: "\u{1108}\u{1163}\u{11AB}", - nfkc: "\u{BE9C}", - nfkd: "\u{1108}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{BE9D}", - nfc: "\u{BE9D}", - nfd: "\u{1108}\u{1163}\u{11AC}", - nfkc: "\u{BE9D}", - nfkd: "\u{1108}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{BE9E}", - nfc: "\u{BE9E}", - nfd: "\u{1108}\u{1163}\u{11AD}", - nfkc: "\u{BE9E}", - nfkd: "\u{1108}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{BE9F}", - nfc: "\u{BE9F}", - nfd: "\u{1108}\u{1163}\u{11AE}", - nfkc: "\u{BE9F}", - nfkd: "\u{1108}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{BEA0}", - nfc: "\u{BEA0}", - nfd: "\u{1108}\u{1163}\u{11AF}", - nfkc: "\u{BEA0}", - nfkd: "\u{1108}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{BEA1}", - nfc: "\u{BEA1}", - nfd: "\u{1108}\u{1163}\u{11B0}", - nfkc: "\u{BEA1}", - nfkd: "\u{1108}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{BEA2}", - nfc: "\u{BEA2}", - nfd: "\u{1108}\u{1163}\u{11B1}", - nfkc: "\u{BEA2}", - nfkd: "\u{1108}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{BEA3}", - nfc: "\u{BEA3}", - nfd: "\u{1108}\u{1163}\u{11B2}", - nfkc: "\u{BEA3}", - nfkd: "\u{1108}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{BEA4}", - nfc: "\u{BEA4}", - nfd: "\u{1108}\u{1163}\u{11B3}", - nfkc: "\u{BEA4}", - nfkd: "\u{1108}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{BEA5}", - nfc: "\u{BEA5}", - nfd: "\u{1108}\u{1163}\u{11B4}", - nfkc: "\u{BEA5}", - nfkd: "\u{1108}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{BEA6}", - nfc: "\u{BEA6}", - nfd: "\u{1108}\u{1163}\u{11B5}", - nfkc: "\u{BEA6}", - nfkd: "\u{1108}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{BEA7}", - nfc: "\u{BEA7}", - nfd: "\u{1108}\u{1163}\u{11B6}", - nfkc: "\u{BEA7}", - nfkd: "\u{1108}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{BEA8}", - nfc: "\u{BEA8}", - nfd: "\u{1108}\u{1163}\u{11B7}", - nfkc: "\u{BEA8}", - nfkd: "\u{1108}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{BEA9}", - nfc: "\u{BEA9}", - nfd: "\u{1108}\u{1163}\u{11B8}", - nfkc: "\u{BEA9}", - nfkd: "\u{1108}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{BEAA}", - nfc: "\u{BEAA}", - nfd: "\u{1108}\u{1163}\u{11B9}", - nfkc: "\u{BEAA}", - nfkd: "\u{1108}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{BEAB}", - nfc: "\u{BEAB}", - nfd: "\u{1108}\u{1163}\u{11BA}", - nfkc: "\u{BEAB}", - nfkd: "\u{1108}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{BEAC}", - nfc: "\u{BEAC}", - nfd: "\u{1108}\u{1163}\u{11BB}", - nfkc: "\u{BEAC}", - nfkd: "\u{1108}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{BEAD}", - nfc: "\u{BEAD}", - nfd: "\u{1108}\u{1163}\u{11BC}", - nfkc: "\u{BEAD}", - nfkd: "\u{1108}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{BEAE}", - nfc: "\u{BEAE}", - nfd: "\u{1108}\u{1163}\u{11BD}", - nfkc: "\u{BEAE}", - nfkd: "\u{1108}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{BEAF}", - nfc: "\u{BEAF}", - nfd: "\u{1108}\u{1163}\u{11BE}", - nfkc: "\u{BEAF}", - nfkd: "\u{1108}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{BEB0}", - nfc: "\u{BEB0}", - nfd: "\u{1108}\u{1163}\u{11BF}", - nfkc: "\u{BEB0}", - nfkd: "\u{1108}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{BEB1}", - nfc: "\u{BEB1}", - nfd: "\u{1108}\u{1163}\u{11C0}", - nfkc: "\u{BEB1}", - nfkd: "\u{1108}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{BEB2}", - nfc: "\u{BEB2}", - nfd: "\u{1108}\u{1163}\u{11C1}", - nfkc: "\u{BEB2}", - nfkd: "\u{1108}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{BEB3}", - nfc: "\u{BEB3}", - nfd: "\u{1108}\u{1163}\u{11C2}", - nfkc: "\u{BEB3}", - nfkd: "\u{1108}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{BEB4}", - nfc: "\u{BEB4}", - nfd: "\u{1108}\u{1164}", - nfkc: "\u{BEB4}", - nfkd: "\u{1108}\u{1164}", - }, - NormalizationTest { - source: "\u{BEB5}", - nfc: "\u{BEB5}", - nfd: "\u{1108}\u{1164}\u{11A8}", - nfkc: "\u{BEB5}", - nfkd: "\u{1108}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{BEB6}", - nfc: "\u{BEB6}", - nfd: "\u{1108}\u{1164}\u{11A9}", - nfkc: "\u{BEB6}", - nfkd: "\u{1108}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{BEB7}", - nfc: "\u{BEB7}", - nfd: "\u{1108}\u{1164}\u{11AA}", - nfkc: "\u{BEB7}", - nfkd: "\u{1108}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{BEB8}", - nfc: "\u{BEB8}", - nfd: "\u{1108}\u{1164}\u{11AB}", - nfkc: "\u{BEB8}", - nfkd: "\u{1108}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{BEB9}", - nfc: "\u{BEB9}", - nfd: "\u{1108}\u{1164}\u{11AC}", - nfkc: "\u{BEB9}", - nfkd: "\u{1108}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{BEBA}", - nfc: "\u{BEBA}", - nfd: "\u{1108}\u{1164}\u{11AD}", - nfkc: "\u{BEBA}", - nfkd: "\u{1108}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{BEBB}", - nfc: "\u{BEBB}", - nfd: "\u{1108}\u{1164}\u{11AE}", - nfkc: "\u{BEBB}", - nfkd: "\u{1108}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{BEBC}", - nfc: "\u{BEBC}", - nfd: "\u{1108}\u{1164}\u{11AF}", - nfkc: "\u{BEBC}", - nfkd: "\u{1108}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{BEBD}", - nfc: "\u{BEBD}", - nfd: "\u{1108}\u{1164}\u{11B0}", - nfkc: "\u{BEBD}", - nfkd: "\u{1108}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{BEBE}", - nfc: "\u{BEBE}", - nfd: "\u{1108}\u{1164}\u{11B1}", - nfkc: "\u{BEBE}", - nfkd: "\u{1108}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{BEBF}", - nfc: "\u{BEBF}", - nfd: "\u{1108}\u{1164}\u{11B2}", - nfkc: "\u{BEBF}", - nfkd: "\u{1108}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{BEC0}", - nfc: "\u{BEC0}", - nfd: "\u{1108}\u{1164}\u{11B3}", - nfkc: "\u{BEC0}", - nfkd: "\u{1108}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{BEC1}", - nfc: "\u{BEC1}", - nfd: "\u{1108}\u{1164}\u{11B4}", - nfkc: "\u{BEC1}", - nfkd: "\u{1108}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{BEC2}", - nfc: "\u{BEC2}", - nfd: "\u{1108}\u{1164}\u{11B5}", - nfkc: "\u{BEC2}", - nfkd: "\u{1108}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{BEC3}", - nfc: "\u{BEC3}", - nfd: "\u{1108}\u{1164}\u{11B6}", - nfkc: "\u{BEC3}", - nfkd: "\u{1108}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{BEC4}", - nfc: "\u{BEC4}", - nfd: "\u{1108}\u{1164}\u{11B7}", - nfkc: "\u{BEC4}", - nfkd: "\u{1108}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{BEC5}", - nfc: "\u{BEC5}", - nfd: "\u{1108}\u{1164}\u{11B8}", - nfkc: "\u{BEC5}", - nfkd: "\u{1108}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{BEC6}", - nfc: "\u{BEC6}", - nfd: "\u{1108}\u{1164}\u{11B9}", - nfkc: "\u{BEC6}", - nfkd: "\u{1108}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{BEC7}", - nfc: "\u{BEC7}", - nfd: "\u{1108}\u{1164}\u{11BA}", - nfkc: "\u{BEC7}", - nfkd: "\u{1108}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{BEC8}", - nfc: "\u{BEC8}", - nfd: "\u{1108}\u{1164}\u{11BB}", - nfkc: "\u{BEC8}", - nfkd: "\u{1108}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{BEC9}", - nfc: "\u{BEC9}", - nfd: "\u{1108}\u{1164}\u{11BC}", - nfkc: "\u{BEC9}", - nfkd: "\u{1108}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{BECA}", - nfc: "\u{BECA}", - nfd: "\u{1108}\u{1164}\u{11BD}", - nfkc: "\u{BECA}", - nfkd: "\u{1108}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{BECB}", - nfc: "\u{BECB}", - nfd: "\u{1108}\u{1164}\u{11BE}", - nfkc: "\u{BECB}", - nfkd: "\u{1108}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{BECC}", - nfc: "\u{BECC}", - nfd: "\u{1108}\u{1164}\u{11BF}", - nfkc: "\u{BECC}", - nfkd: "\u{1108}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{BECD}", - nfc: "\u{BECD}", - nfd: "\u{1108}\u{1164}\u{11C0}", - nfkc: "\u{BECD}", - nfkd: "\u{1108}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{BECE}", - nfc: "\u{BECE}", - nfd: "\u{1108}\u{1164}\u{11C1}", - nfkc: "\u{BECE}", - nfkd: "\u{1108}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{BECF}", - nfc: "\u{BECF}", - nfd: "\u{1108}\u{1164}\u{11C2}", - nfkc: "\u{BECF}", - nfkd: "\u{1108}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{BED0}", - nfc: "\u{BED0}", - nfd: "\u{1108}\u{1165}", - nfkc: "\u{BED0}", - nfkd: "\u{1108}\u{1165}", - }, - NormalizationTest { - source: "\u{BED1}", - nfc: "\u{BED1}", - nfd: "\u{1108}\u{1165}\u{11A8}", - nfkc: "\u{BED1}", - nfkd: "\u{1108}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{BED2}", - nfc: "\u{BED2}", - nfd: "\u{1108}\u{1165}\u{11A9}", - nfkc: "\u{BED2}", - nfkd: "\u{1108}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{BED3}", - nfc: "\u{BED3}", - nfd: "\u{1108}\u{1165}\u{11AA}", - nfkc: "\u{BED3}", - nfkd: "\u{1108}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{BED4}", - nfc: "\u{BED4}", - nfd: "\u{1108}\u{1165}\u{11AB}", - nfkc: "\u{BED4}", - nfkd: "\u{1108}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{BED5}", - nfc: "\u{BED5}", - nfd: "\u{1108}\u{1165}\u{11AC}", - nfkc: "\u{BED5}", - nfkd: "\u{1108}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{BED6}", - nfc: "\u{BED6}", - nfd: "\u{1108}\u{1165}\u{11AD}", - nfkc: "\u{BED6}", - nfkd: "\u{1108}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{BED7}", - nfc: "\u{BED7}", - nfd: "\u{1108}\u{1165}\u{11AE}", - nfkc: "\u{BED7}", - nfkd: "\u{1108}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{BED8}", - nfc: "\u{BED8}", - nfd: "\u{1108}\u{1165}\u{11AF}", - nfkc: "\u{BED8}", - nfkd: "\u{1108}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{BED9}", - nfc: "\u{BED9}", - nfd: "\u{1108}\u{1165}\u{11B0}", - nfkc: "\u{BED9}", - nfkd: "\u{1108}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{BEDA}", - nfc: "\u{BEDA}", - nfd: "\u{1108}\u{1165}\u{11B1}", - nfkc: "\u{BEDA}", - nfkd: "\u{1108}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{BEDB}", - nfc: "\u{BEDB}", - nfd: "\u{1108}\u{1165}\u{11B2}", - nfkc: "\u{BEDB}", - nfkd: "\u{1108}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{BEDC}", - nfc: "\u{BEDC}", - nfd: "\u{1108}\u{1165}\u{11B3}", - nfkc: "\u{BEDC}", - nfkd: "\u{1108}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{BEDD}", - nfc: "\u{BEDD}", - nfd: "\u{1108}\u{1165}\u{11B4}", - nfkc: "\u{BEDD}", - nfkd: "\u{1108}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{BEDE}", - nfc: "\u{BEDE}", - nfd: "\u{1108}\u{1165}\u{11B5}", - nfkc: "\u{BEDE}", - nfkd: "\u{1108}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{BEDF}", - nfc: "\u{BEDF}", - nfd: "\u{1108}\u{1165}\u{11B6}", - nfkc: "\u{BEDF}", - nfkd: "\u{1108}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{BEE0}", - nfc: "\u{BEE0}", - nfd: "\u{1108}\u{1165}\u{11B7}", - nfkc: "\u{BEE0}", - nfkd: "\u{1108}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{BEE1}", - nfc: "\u{BEE1}", - nfd: "\u{1108}\u{1165}\u{11B8}", - nfkc: "\u{BEE1}", - nfkd: "\u{1108}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{BEE2}", - nfc: "\u{BEE2}", - nfd: "\u{1108}\u{1165}\u{11B9}", - nfkc: "\u{BEE2}", - nfkd: "\u{1108}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{BEE3}", - nfc: "\u{BEE3}", - nfd: "\u{1108}\u{1165}\u{11BA}", - nfkc: "\u{BEE3}", - nfkd: "\u{1108}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{BEE4}", - nfc: "\u{BEE4}", - nfd: "\u{1108}\u{1165}\u{11BB}", - nfkc: "\u{BEE4}", - nfkd: "\u{1108}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{BEE5}", - nfc: "\u{BEE5}", - nfd: "\u{1108}\u{1165}\u{11BC}", - nfkc: "\u{BEE5}", - nfkd: "\u{1108}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{BEE6}", - nfc: "\u{BEE6}", - nfd: "\u{1108}\u{1165}\u{11BD}", - nfkc: "\u{BEE6}", - nfkd: "\u{1108}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{BEE7}", - nfc: "\u{BEE7}", - nfd: "\u{1108}\u{1165}\u{11BE}", - nfkc: "\u{BEE7}", - nfkd: "\u{1108}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{BEE8}", - nfc: "\u{BEE8}", - nfd: "\u{1108}\u{1165}\u{11BF}", - nfkc: "\u{BEE8}", - nfkd: "\u{1108}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{BEE9}", - nfc: "\u{BEE9}", - nfd: "\u{1108}\u{1165}\u{11C0}", - nfkc: "\u{BEE9}", - nfkd: "\u{1108}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{BEEA}", - nfc: "\u{BEEA}", - nfd: "\u{1108}\u{1165}\u{11C1}", - nfkc: "\u{BEEA}", - nfkd: "\u{1108}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{BEEB}", - nfc: "\u{BEEB}", - nfd: "\u{1108}\u{1165}\u{11C2}", - nfkc: "\u{BEEB}", - nfkd: "\u{1108}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{BEEC}", - nfc: "\u{BEEC}", - nfd: "\u{1108}\u{1166}", - nfkc: "\u{BEEC}", - nfkd: "\u{1108}\u{1166}", - }, - NormalizationTest { - source: "\u{BEED}", - nfc: "\u{BEED}", - nfd: "\u{1108}\u{1166}\u{11A8}", - nfkc: "\u{BEED}", - nfkd: "\u{1108}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{BEEE}", - nfc: "\u{BEEE}", - nfd: "\u{1108}\u{1166}\u{11A9}", - nfkc: "\u{BEEE}", - nfkd: "\u{1108}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{BEEF}", - nfc: "\u{BEEF}", - nfd: "\u{1108}\u{1166}\u{11AA}", - nfkc: "\u{BEEF}", - nfkd: "\u{1108}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{BEF0}", - nfc: "\u{BEF0}", - nfd: "\u{1108}\u{1166}\u{11AB}", - nfkc: "\u{BEF0}", - nfkd: "\u{1108}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{BEF1}", - nfc: "\u{BEF1}", - nfd: "\u{1108}\u{1166}\u{11AC}", - nfkc: "\u{BEF1}", - nfkd: "\u{1108}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{BEF2}", - nfc: "\u{BEF2}", - nfd: "\u{1108}\u{1166}\u{11AD}", - nfkc: "\u{BEF2}", - nfkd: "\u{1108}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{BEF3}", - nfc: "\u{BEF3}", - nfd: "\u{1108}\u{1166}\u{11AE}", - nfkc: "\u{BEF3}", - nfkd: "\u{1108}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{BEF4}", - nfc: "\u{BEF4}", - nfd: "\u{1108}\u{1166}\u{11AF}", - nfkc: "\u{BEF4}", - nfkd: "\u{1108}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{BEF5}", - nfc: "\u{BEF5}", - nfd: "\u{1108}\u{1166}\u{11B0}", - nfkc: "\u{BEF5}", - nfkd: "\u{1108}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{BEF6}", - nfc: "\u{BEF6}", - nfd: "\u{1108}\u{1166}\u{11B1}", - nfkc: "\u{BEF6}", - nfkd: "\u{1108}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{BEF7}", - nfc: "\u{BEF7}", - nfd: "\u{1108}\u{1166}\u{11B2}", - nfkc: "\u{BEF7}", - nfkd: "\u{1108}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{BEF8}", - nfc: "\u{BEF8}", - nfd: "\u{1108}\u{1166}\u{11B3}", - nfkc: "\u{BEF8}", - nfkd: "\u{1108}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{BEF9}", - nfc: "\u{BEF9}", - nfd: "\u{1108}\u{1166}\u{11B4}", - nfkc: "\u{BEF9}", - nfkd: "\u{1108}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{BEFA}", - nfc: "\u{BEFA}", - nfd: "\u{1108}\u{1166}\u{11B5}", - nfkc: "\u{BEFA}", - nfkd: "\u{1108}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{BEFB}", - nfc: "\u{BEFB}", - nfd: "\u{1108}\u{1166}\u{11B6}", - nfkc: "\u{BEFB}", - nfkd: "\u{1108}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{BEFC}", - nfc: "\u{BEFC}", - nfd: "\u{1108}\u{1166}\u{11B7}", - nfkc: "\u{BEFC}", - nfkd: "\u{1108}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{BEFD}", - nfc: "\u{BEFD}", - nfd: "\u{1108}\u{1166}\u{11B8}", - nfkc: "\u{BEFD}", - nfkd: "\u{1108}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{BEFE}", - nfc: "\u{BEFE}", - nfd: "\u{1108}\u{1166}\u{11B9}", - nfkc: "\u{BEFE}", - nfkd: "\u{1108}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{BEFF}", - nfc: "\u{BEFF}", - nfd: "\u{1108}\u{1166}\u{11BA}", - nfkc: "\u{BEFF}", - nfkd: "\u{1108}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{BF00}", - nfc: "\u{BF00}", - nfd: "\u{1108}\u{1166}\u{11BB}", - nfkc: "\u{BF00}", - nfkd: "\u{1108}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{BF01}", - nfc: "\u{BF01}", - nfd: "\u{1108}\u{1166}\u{11BC}", - nfkc: "\u{BF01}", - nfkd: "\u{1108}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{BF02}", - nfc: "\u{BF02}", - nfd: "\u{1108}\u{1166}\u{11BD}", - nfkc: "\u{BF02}", - nfkd: "\u{1108}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{BF03}", - nfc: "\u{BF03}", - nfd: "\u{1108}\u{1166}\u{11BE}", - nfkc: "\u{BF03}", - nfkd: "\u{1108}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{BF04}", - nfc: "\u{BF04}", - nfd: "\u{1108}\u{1166}\u{11BF}", - nfkc: "\u{BF04}", - nfkd: "\u{1108}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{BF05}", - nfc: "\u{BF05}", - nfd: "\u{1108}\u{1166}\u{11C0}", - nfkc: "\u{BF05}", - nfkd: "\u{1108}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{BF06}", - nfc: "\u{BF06}", - nfd: "\u{1108}\u{1166}\u{11C1}", - nfkc: "\u{BF06}", - nfkd: "\u{1108}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{BF07}", - nfc: "\u{BF07}", - nfd: "\u{1108}\u{1166}\u{11C2}", - nfkc: "\u{BF07}", - nfkd: "\u{1108}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{BF08}", - nfc: "\u{BF08}", - nfd: "\u{1108}\u{1167}", - nfkc: "\u{BF08}", - nfkd: "\u{1108}\u{1167}", - }, - NormalizationTest { - source: "\u{BF09}", - nfc: "\u{BF09}", - nfd: "\u{1108}\u{1167}\u{11A8}", - nfkc: "\u{BF09}", - nfkd: "\u{1108}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{BF0A}", - nfc: "\u{BF0A}", - nfd: "\u{1108}\u{1167}\u{11A9}", - nfkc: "\u{BF0A}", - nfkd: "\u{1108}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{BF0B}", - nfc: "\u{BF0B}", - nfd: "\u{1108}\u{1167}\u{11AA}", - nfkc: "\u{BF0B}", - nfkd: "\u{1108}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{BF0C}", - nfc: "\u{BF0C}", - nfd: "\u{1108}\u{1167}\u{11AB}", - nfkc: "\u{BF0C}", - nfkd: "\u{1108}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{BF0D}", - nfc: "\u{BF0D}", - nfd: "\u{1108}\u{1167}\u{11AC}", - nfkc: "\u{BF0D}", - nfkd: "\u{1108}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{BF0E}", - nfc: "\u{BF0E}", - nfd: "\u{1108}\u{1167}\u{11AD}", - nfkc: "\u{BF0E}", - nfkd: "\u{1108}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{BF0F}", - nfc: "\u{BF0F}", - nfd: "\u{1108}\u{1167}\u{11AE}", - nfkc: "\u{BF0F}", - nfkd: "\u{1108}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{BF10}", - nfc: "\u{BF10}", - nfd: "\u{1108}\u{1167}\u{11AF}", - nfkc: "\u{BF10}", - nfkd: "\u{1108}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{BF11}", - nfc: "\u{BF11}", - nfd: "\u{1108}\u{1167}\u{11B0}", - nfkc: "\u{BF11}", - nfkd: "\u{1108}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{BF12}", - nfc: "\u{BF12}", - nfd: "\u{1108}\u{1167}\u{11B1}", - nfkc: "\u{BF12}", - nfkd: "\u{1108}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{BF13}", - nfc: "\u{BF13}", - nfd: "\u{1108}\u{1167}\u{11B2}", - nfkc: "\u{BF13}", - nfkd: "\u{1108}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{BF14}", - nfc: "\u{BF14}", - nfd: "\u{1108}\u{1167}\u{11B3}", - nfkc: "\u{BF14}", - nfkd: "\u{1108}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{BF15}", - nfc: "\u{BF15}", - nfd: "\u{1108}\u{1167}\u{11B4}", - nfkc: "\u{BF15}", - nfkd: "\u{1108}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{BF16}", - nfc: "\u{BF16}", - nfd: "\u{1108}\u{1167}\u{11B5}", - nfkc: "\u{BF16}", - nfkd: "\u{1108}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{BF17}", - nfc: "\u{BF17}", - nfd: "\u{1108}\u{1167}\u{11B6}", - nfkc: "\u{BF17}", - nfkd: "\u{1108}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{BF18}", - nfc: "\u{BF18}", - nfd: "\u{1108}\u{1167}\u{11B7}", - nfkc: "\u{BF18}", - nfkd: "\u{1108}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{BF19}", - nfc: "\u{BF19}", - nfd: "\u{1108}\u{1167}\u{11B8}", - nfkc: "\u{BF19}", - nfkd: "\u{1108}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{BF1A}", - nfc: "\u{BF1A}", - nfd: "\u{1108}\u{1167}\u{11B9}", - nfkc: "\u{BF1A}", - nfkd: "\u{1108}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{BF1B}", - nfc: "\u{BF1B}", - nfd: "\u{1108}\u{1167}\u{11BA}", - nfkc: "\u{BF1B}", - nfkd: "\u{1108}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{BF1C}", - nfc: "\u{BF1C}", - nfd: "\u{1108}\u{1167}\u{11BB}", - nfkc: "\u{BF1C}", - nfkd: "\u{1108}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{BF1D}", - nfc: "\u{BF1D}", - nfd: "\u{1108}\u{1167}\u{11BC}", - nfkc: "\u{BF1D}", - nfkd: "\u{1108}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{BF1E}", - nfc: "\u{BF1E}", - nfd: "\u{1108}\u{1167}\u{11BD}", - nfkc: "\u{BF1E}", - nfkd: "\u{1108}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{BF1F}", - nfc: "\u{BF1F}", - nfd: "\u{1108}\u{1167}\u{11BE}", - nfkc: "\u{BF1F}", - nfkd: "\u{1108}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{BF20}", - nfc: "\u{BF20}", - nfd: "\u{1108}\u{1167}\u{11BF}", - nfkc: "\u{BF20}", - nfkd: "\u{1108}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{BF21}", - nfc: "\u{BF21}", - nfd: "\u{1108}\u{1167}\u{11C0}", - nfkc: "\u{BF21}", - nfkd: "\u{1108}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{BF22}", - nfc: "\u{BF22}", - nfd: "\u{1108}\u{1167}\u{11C1}", - nfkc: "\u{BF22}", - nfkd: "\u{1108}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{BF23}", - nfc: "\u{BF23}", - nfd: "\u{1108}\u{1167}\u{11C2}", - nfkc: "\u{BF23}", - nfkd: "\u{1108}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{BF24}", - nfc: "\u{BF24}", - nfd: "\u{1108}\u{1168}", - nfkc: "\u{BF24}", - nfkd: "\u{1108}\u{1168}", - }, - NormalizationTest { - source: "\u{BF25}", - nfc: "\u{BF25}", - nfd: "\u{1108}\u{1168}\u{11A8}", - nfkc: "\u{BF25}", - nfkd: "\u{1108}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{BF26}", - nfc: "\u{BF26}", - nfd: "\u{1108}\u{1168}\u{11A9}", - nfkc: "\u{BF26}", - nfkd: "\u{1108}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{BF27}", - nfc: "\u{BF27}", - nfd: "\u{1108}\u{1168}\u{11AA}", - nfkc: "\u{BF27}", - nfkd: "\u{1108}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{BF28}", - nfc: "\u{BF28}", - nfd: "\u{1108}\u{1168}\u{11AB}", - nfkc: "\u{BF28}", - nfkd: "\u{1108}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{BF29}", - nfc: "\u{BF29}", - nfd: "\u{1108}\u{1168}\u{11AC}", - nfkc: "\u{BF29}", - nfkd: "\u{1108}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{BF2A}", - nfc: "\u{BF2A}", - nfd: "\u{1108}\u{1168}\u{11AD}", - nfkc: "\u{BF2A}", - nfkd: "\u{1108}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{BF2B}", - nfc: "\u{BF2B}", - nfd: "\u{1108}\u{1168}\u{11AE}", - nfkc: "\u{BF2B}", - nfkd: "\u{1108}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{BF2C}", - nfc: "\u{BF2C}", - nfd: "\u{1108}\u{1168}\u{11AF}", - nfkc: "\u{BF2C}", - nfkd: "\u{1108}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{BF2D}", - nfc: "\u{BF2D}", - nfd: "\u{1108}\u{1168}\u{11B0}", - nfkc: "\u{BF2D}", - nfkd: "\u{1108}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{BF2E}", - nfc: "\u{BF2E}", - nfd: "\u{1108}\u{1168}\u{11B1}", - nfkc: "\u{BF2E}", - nfkd: "\u{1108}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{BF2F}", - nfc: "\u{BF2F}", - nfd: "\u{1108}\u{1168}\u{11B2}", - nfkc: "\u{BF2F}", - nfkd: "\u{1108}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{BF30}", - nfc: "\u{BF30}", - nfd: "\u{1108}\u{1168}\u{11B3}", - nfkc: "\u{BF30}", - nfkd: "\u{1108}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{BF31}", - nfc: "\u{BF31}", - nfd: "\u{1108}\u{1168}\u{11B4}", - nfkc: "\u{BF31}", - nfkd: "\u{1108}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{BF32}", - nfc: "\u{BF32}", - nfd: "\u{1108}\u{1168}\u{11B5}", - nfkc: "\u{BF32}", - nfkd: "\u{1108}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{BF33}", - nfc: "\u{BF33}", - nfd: "\u{1108}\u{1168}\u{11B6}", - nfkc: "\u{BF33}", - nfkd: "\u{1108}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{BF34}", - nfc: "\u{BF34}", - nfd: "\u{1108}\u{1168}\u{11B7}", - nfkc: "\u{BF34}", - nfkd: "\u{1108}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{BF35}", - nfc: "\u{BF35}", - nfd: "\u{1108}\u{1168}\u{11B8}", - nfkc: "\u{BF35}", - nfkd: "\u{1108}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{BF36}", - nfc: "\u{BF36}", - nfd: "\u{1108}\u{1168}\u{11B9}", - nfkc: "\u{BF36}", - nfkd: "\u{1108}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{BF37}", - nfc: "\u{BF37}", - nfd: "\u{1108}\u{1168}\u{11BA}", - nfkc: "\u{BF37}", - nfkd: "\u{1108}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{BF38}", - nfc: "\u{BF38}", - nfd: "\u{1108}\u{1168}\u{11BB}", - nfkc: "\u{BF38}", - nfkd: "\u{1108}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{BF39}", - nfc: "\u{BF39}", - nfd: "\u{1108}\u{1168}\u{11BC}", - nfkc: "\u{BF39}", - nfkd: "\u{1108}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{BF3A}", - nfc: "\u{BF3A}", - nfd: "\u{1108}\u{1168}\u{11BD}", - nfkc: "\u{BF3A}", - nfkd: "\u{1108}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{BF3B}", - nfc: "\u{BF3B}", - nfd: "\u{1108}\u{1168}\u{11BE}", - nfkc: "\u{BF3B}", - nfkd: "\u{1108}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{BF3C}", - nfc: "\u{BF3C}", - nfd: "\u{1108}\u{1168}\u{11BF}", - nfkc: "\u{BF3C}", - nfkd: "\u{1108}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{BF3D}", - nfc: "\u{BF3D}", - nfd: "\u{1108}\u{1168}\u{11C0}", - nfkc: "\u{BF3D}", - nfkd: "\u{1108}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{BF3E}", - nfc: "\u{BF3E}", - nfd: "\u{1108}\u{1168}\u{11C1}", - nfkc: "\u{BF3E}", - nfkd: "\u{1108}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{BF3F}", - nfc: "\u{BF3F}", - nfd: "\u{1108}\u{1168}\u{11C2}", - nfkc: "\u{BF3F}", - nfkd: "\u{1108}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{BF40}", - nfc: "\u{BF40}", - nfd: "\u{1108}\u{1169}", - nfkc: "\u{BF40}", - nfkd: "\u{1108}\u{1169}", - }, - NormalizationTest { - source: "\u{BF41}", - nfc: "\u{BF41}", - nfd: "\u{1108}\u{1169}\u{11A8}", - nfkc: "\u{BF41}", - nfkd: "\u{1108}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{BF42}", - nfc: "\u{BF42}", - nfd: "\u{1108}\u{1169}\u{11A9}", - nfkc: "\u{BF42}", - nfkd: "\u{1108}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{BF43}", - nfc: "\u{BF43}", - nfd: "\u{1108}\u{1169}\u{11AA}", - nfkc: "\u{BF43}", - nfkd: "\u{1108}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{BF44}", - nfc: "\u{BF44}", - nfd: "\u{1108}\u{1169}\u{11AB}", - nfkc: "\u{BF44}", - nfkd: "\u{1108}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{BF45}", - nfc: "\u{BF45}", - nfd: "\u{1108}\u{1169}\u{11AC}", - nfkc: "\u{BF45}", - nfkd: "\u{1108}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{BF46}", - nfc: "\u{BF46}", - nfd: "\u{1108}\u{1169}\u{11AD}", - nfkc: "\u{BF46}", - nfkd: "\u{1108}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{BF47}", - nfc: "\u{BF47}", - nfd: "\u{1108}\u{1169}\u{11AE}", - nfkc: "\u{BF47}", - nfkd: "\u{1108}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{BF48}", - nfc: "\u{BF48}", - nfd: "\u{1108}\u{1169}\u{11AF}", - nfkc: "\u{BF48}", - nfkd: "\u{1108}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{BF49}", - nfc: "\u{BF49}", - nfd: "\u{1108}\u{1169}\u{11B0}", - nfkc: "\u{BF49}", - nfkd: "\u{1108}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{BF4A}", - nfc: "\u{BF4A}", - nfd: "\u{1108}\u{1169}\u{11B1}", - nfkc: "\u{BF4A}", - nfkd: "\u{1108}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{BF4B}", - nfc: "\u{BF4B}", - nfd: "\u{1108}\u{1169}\u{11B2}", - nfkc: "\u{BF4B}", - nfkd: "\u{1108}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{BF4C}", - nfc: "\u{BF4C}", - nfd: "\u{1108}\u{1169}\u{11B3}", - nfkc: "\u{BF4C}", - nfkd: "\u{1108}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{BF4D}", - nfc: "\u{BF4D}", - nfd: "\u{1108}\u{1169}\u{11B4}", - nfkc: "\u{BF4D}", - nfkd: "\u{1108}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{BF4E}", - nfc: "\u{BF4E}", - nfd: "\u{1108}\u{1169}\u{11B5}", - nfkc: "\u{BF4E}", - nfkd: "\u{1108}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{BF4F}", - nfc: "\u{BF4F}", - nfd: "\u{1108}\u{1169}\u{11B6}", - nfkc: "\u{BF4F}", - nfkd: "\u{1108}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{BF50}", - nfc: "\u{BF50}", - nfd: "\u{1108}\u{1169}\u{11B7}", - nfkc: "\u{BF50}", - nfkd: "\u{1108}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{BF51}", - nfc: "\u{BF51}", - nfd: "\u{1108}\u{1169}\u{11B8}", - nfkc: "\u{BF51}", - nfkd: "\u{1108}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{BF52}", - nfc: "\u{BF52}", - nfd: "\u{1108}\u{1169}\u{11B9}", - nfkc: "\u{BF52}", - nfkd: "\u{1108}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{BF53}", - nfc: "\u{BF53}", - nfd: "\u{1108}\u{1169}\u{11BA}", - nfkc: "\u{BF53}", - nfkd: "\u{1108}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{BF54}", - nfc: "\u{BF54}", - nfd: "\u{1108}\u{1169}\u{11BB}", - nfkc: "\u{BF54}", - nfkd: "\u{1108}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{BF55}", - nfc: "\u{BF55}", - nfd: "\u{1108}\u{1169}\u{11BC}", - nfkc: "\u{BF55}", - nfkd: "\u{1108}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{BF56}", - nfc: "\u{BF56}", - nfd: "\u{1108}\u{1169}\u{11BD}", - nfkc: "\u{BF56}", - nfkd: "\u{1108}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{BF57}", - nfc: "\u{BF57}", - nfd: "\u{1108}\u{1169}\u{11BE}", - nfkc: "\u{BF57}", - nfkd: "\u{1108}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{BF58}", - nfc: "\u{BF58}", - nfd: "\u{1108}\u{1169}\u{11BF}", - nfkc: "\u{BF58}", - nfkd: "\u{1108}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{BF59}", - nfc: "\u{BF59}", - nfd: "\u{1108}\u{1169}\u{11C0}", - nfkc: "\u{BF59}", - nfkd: "\u{1108}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{BF5A}", - nfc: "\u{BF5A}", - nfd: "\u{1108}\u{1169}\u{11C1}", - nfkc: "\u{BF5A}", - nfkd: "\u{1108}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{BF5B}", - nfc: "\u{BF5B}", - nfd: "\u{1108}\u{1169}\u{11C2}", - nfkc: "\u{BF5B}", - nfkd: "\u{1108}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{BF5C}", - nfc: "\u{BF5C}", - nfd: "\u{1108}\u{116A}", - nfkc: "\u{BF5C}", - nfkd: "\u{1108}\u{116A}", - }, - NormalizationTest { - source: "\u{BF5D}", - nfc: "\u{BF5D}", - nfd: "\u{1108}\u{116A}\u{11A8}", - nfkc: "\u{BF5D}", - nfkd: "\u{1108}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{BF5E}", - nfc: "\u{BF5E}", - nfd: "\u{1108}\u{116A}\u{11A9}", - nfkc: "\u{BF5E}", - nfkd: "\u{1108}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{BF5F}", - nfc: "\u{BF5F}", - nfd: "\u{1108}\u{116A}\u{11AA}", - nfkc: "\u{BF5F}", - nfkd: "\u{1108}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{BF60}", - nfc: "\u{BF60}", - nfd: "\u{1108}\u{116A}\u{11AB}", - nfkc: "\u{BF60}", - nfkd: "\u{1108}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{BF61}", - nfc: "\u{BF61}", - nfd: "\u{1108}\u{116A}\u{11AC}", - nfkc: "\u{BF61}", - nfkd: "\u{1108}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{BF62}", - nfc: "\u{BF62}", - nfd: "\u{1108}\u{116A}\u{11AD}", - nfkc: "\u{BF62}", - nfkd: "\u{1108}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{BF63}", - nfc: "\u{BF63}", - nfd: "\u{1108}\u{116A}\u{11AE}", - nfkc: "\u{BF63}", - nfkd: "\u{1108}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{BF64}", - nfc: "\u{BF64}", - nfd: "\u{1108}\u{116A}\u{11AF}", - nfkc: "\u{BF64}", - nfkd: "\u{1108}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{BF65}", - nfc: "\u{BF65}", - nfd: "\u{1108}\u{116A}\u{11B0}", - nfkc: "\u{BF65}", - nfkd: "\u{1108}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{BF66}", - nfc: "\u{BF66}", - nfd: "\u{1108}\u{116A}\u{11B1}", - nfkc: "\u{BF66}", - nfkd: "\u{1108}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{BF67}", - nfc: "\u{BF67}", - nfd: "\u{1108}\u{116A}\u{11B2}", - nfkc: "\u{BF67}", - nfkd: "\u{1108}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{BF68}", - nfc: "\u{BF68}", - nfd: "\u{1108}\u{116A}\u{11B3}", - nfkc: "\u{BF68}", - nfkd: "\u{1108}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{BF69}", - nfc: "\u{BF69}", - nfd: "\u{1108}\u{116A}\u{11B4}", - nfkc: "\u{BF69}", - nfkd: "\u{1108}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{BF6A}", - nfc: "\u{BF6A}", - nfd: "\u{1108}\u{116A}\u{11B5}", - nfkc: "\u{BF6A}", - nfkd: "\u{1108}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{BF6B}", - nfc: "\u{BF6B}", - nfd: "\u{1108}\u{116A}\u{11B6}", - nfkc: "\u{BF6B}", - nfkd: "\u{1108}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{BF6C}", - nfc: "\u{BF6C}", - nfd: "\u{1108}\u{116A}\u{11B7}", - nfkc: "\u{BF6C}", - nfkd: "\u{1108}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{BF6D}", - nfc: "\u{BF6D}", - nfd: "\u{1108}\u{116A}\u{11B8}", - nfkc: "\u{BF6D}", - nfkd: "\u{1108}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{BF6E}", - nfc: "\u{BF6E}", - nfd: "\u{1108}\u{116A}\u{11B9}", - nfkc: "\u{BF6E}", - nfkd: "\u{1108}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{BF6F}", - nfc: "\u{BF6F}", - nfd: "\u{1108}\u{116A}\u{11BA}", - nfkc: "\u{BF6F}", - nfkd: "\u{1108}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{BF70}", - nfc: "\u{BF70}", - nfd: "\u{1108}\u{116A}\u{11BB}", - nfkc: "\u{BF70}", - nfkd: "\u{1108}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{BF71}", - nfc: "\u{BF71}", - nfd: "\u{1108}\u{116A}\u{11BC}", - nfkc: "\u{BF71}", - nfkd: "\u{1108}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{BF72}", - nfc: "\u{BF72}", - nfd: "\u{1108}\u{116A}\u{11BD}", - nfkc: "\u{BF72}", - nfkd: "\u{1108}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{BF73}", - nfc: "\u{BF73}", - nfd: "\u{1108}\u{116A}\u{11BE}", - nfkc: "\u{BF73}", - nfkd: "\u{1108}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{BF74}", - nfc: "\u{BF74}", - nfd: "\u{1108}\u{116A}\u{11BF}", - nfkc: "\u{BF74}", - nfkd: "\u{1108}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{BF75}", - nfc: "\u{BF75}", - nfd: "\u{1108}\u{116A}\u{11C0}", - nfkc: "\u{BF75}", - nfkd: "\u{1108}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{BF76}", - nfc: "\u{BF76}", - nfd: "\u{1108}\u{116A}\u{11C1}", - nfkc: "\u{BF76}", - nfkd: "\u{1108}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{BF77}", - nfc: "\u{BF77}", - nfd: "\u{1108}\u{116A}\u{11C2}", - nfkc: "\u{BF77}", - nfkd: "\u{1108}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{BF78}", - nfc: "\u{BF78}", - nfd: "\u{1108}\u{116B}", - nfkc: "\u{BF78}", - nfkd: "\u{1108}\u{116B}", - }, - NormalizationTest { - source: "\u{BF79}", - nfc: "\u{BF79}", - nfd: "\u{1108}\u{116B}\u{11A8}", - nfkc: "\u{BF79}", - nfkd: "\u{1108}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{BF7A}", - nfc: "\u{BF7A}", - nfd: "\u{1108}\u{116B}\u{11A9}", - nfkc: "\u{BF7A}", - nfkd: "\u{1108}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{BF7B}", - nfc: "\u{BF7B}", - nfd: "\u{1108}\u{116B}\u{11AA}", - nfkc: "\u{BF7B}", - nfkd: "\u{1108}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{BF7C}", - nfc: "\u{BF7C}", - nfd: "\u{1108}\u{116B}\u{11AB}", - nfkc: "\u{BF7C}", - nfkd: "\u{1108}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{BF7D}", - nfc: "\u{BF7D}", - nfd: "\u{1108}\u{116B}\u{11AC}", - nfkc: "\u{BF7D}", - nfkd: "\u{1108}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{BF7E}", - nfc: "\u{BF7E}", - nfd: "\u{1108}\u{116B}\u{11AD}", - nfkc: "\u{BF7E}", - nfkd: "\u{1108}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{BF7F}", - nfc: "\u{BF7F}", - nfd: "\u{1108}\u{116B}\u{11AE}", - nfkc: "\u{BF7F}", - nfkd: "\u{1108}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{BF80}", - nfc: "\u{BF80}", - nfd: "\u{1108}\u{116B}\u{11AF}", - nfkc: "\u{BF80}", - nfkd: "\u{1108}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{BF81}", - nfc: "\u{BF81}", - nfd: "\u{1108}\u{116B}\u{11B0}", - nfkc: "\u{BF81}", - nfkd: "\u{1108}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{BF82}", - nfc: "\u{BF82}", - nfd: "\u{1108}\u{116B}\u{11B1}", - nfkc: "\u{BF82}", - nfkd: "\u{1108}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{BF83}", - nfc: "\u{BF83}", - nfd: "\u{1108}\u{116B}\u{11B2}", - nfkc: "\u{BF83}", - nfkd: "\u{1108}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{BF84}", - nfc: "\u{BF84}", - nfd: "\u{1108}\u{116B}\u{11B3}", - nfkc: "\u{BF84}", - nfkd: "\u{1108}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{BF85}", - nfc: "\u{BF85}", - nfd: "\u{1108}\u{116B}\u{11B4}", - nfkc: "\u{BF85}", - nfkd: "\u{1108}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{BF86}", - nfc: "\u{BF86}", - nfd: "\u{1108}\u{116B}\u{11B5}", - nfkc: "\u{BF86}", - nfkd: "\u{1108}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{BF87}", - nfc: "\u{BF87}", - nfd: "\u{1108}\u{116B}\u{11B6}", - nfkc: "\u{BF87}", - nfkd: "\u{1108}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{BF88}", - nfc: "\u{BF88}", - nfd: "\u{1108}\u{116B}\u{11B7}", - nfkc: "\u{BF88}", - nfkd: "\u{1108}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{BF89}", - nfc: "\u{BF89}", - nfd: "\u{1108}\u{116B}\u{11B8}", - nfkc: "\u{BF89}", - nfkd: "\u{1108}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{BF8A}", - nfc: "\u{BF8A}", - nfd: "\u{1108}\u{116B}\u{11B9}", - nfkc: "\u{BF8A}", - nfkd: "\u{1108}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{BF8B}", - nfc: "\u{BF8B}", - nfd: "\u{1108}\u{116B}\u{11BA}", - nfkc: "\u{BF8B}", - nfkd: "\u{1108}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{BF8C}", - nfc: "\u{BF8C}", - nfd: "\u{1108}\u{116B}\u{11BB}", - nfkc: "\u{BF8C}", - nfkd: "\u{1108}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{BF8D}", - nfc: "\u{BF8D}", - nfd: "\u{1108}\u{116B}\u{11BC}", - nfkc: "\u{BF8D}", - nfkd: "\u{1108}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{BF8E}", - nfc: "\u{BF8E}", - nfd: "\u{1108}\u{116B}\u{11BD}", - nfkc: "\u{BF8E}", - nfkd: "\u{1108}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{BF8F}", - nfc: "\u{BF8F}", - nfd: "\u{1108}\u{116B}\u{11BE}", - nfkc: "\u{BF8F}", - nfkd: "\u{1108}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{BF90}", - nfc: "\u{BF90}", - nfd: "\u{1108}\u{116B}\u{11BF}", - nfkc: "\u{BF90}", - nfkd: "\u{1108}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{BF91}", - nfc: "\u{BF91}", - nfd: "\u{1108}\u{116B}\u{11C0}", - nfkc: "\u{BF91}", - nfkd: "\u{1108}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{BF92}", - nfc: "\u{BF92}", - nfd: "\u{1108}\u{116B}\u{11C1}", - nfkc: "\u{BF92}", - nfkd: "\u{1108}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{BF93}", - nfc: "\u{BF93}", - nfd: "\u{1108}\u{116B}\u{11C2}", - nfkc: "\u{BF93}", - nfkd: "\u{1108}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{BF94}", - nfc: "\u{BF94}", - nfd: "\u{1108}\u{116C}", - nfkc: "\u{BF94}", - nfkd: "\u{1108}\u{116C}", - }, - NormalizationTest { - source: "\u{BF95}", - nfc: "\u{BF95}", - nfd: "\u{1108}\u{116C}\u{11A8}", - nfkc: "\u{BF95}", - nfkd: "\u{1108}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{BF96}", - nfc: "\u{BF96}", - nfd: "\u{1108}\u{116C}\u{11A9}", - nfkc: "\u{BF96}", - nfkd: "\u{1108}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{BF97}", - nfc: "\u{BF97}", - nfd: "\u{1108}\u{116C}\u{11AA}", - nfkc: "\u{BF97}", - nfkd: "\u{1108}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{BF98}", - nfc: "\u{BF98}", - nfd: "\u{1108}\u{116C}\u{11AB}", - nfkc: "\u{BF98}", - nfkd: "\u{1108}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{BF99}", - nfc: "\u{BF99}", - nfd: "\u{1108}\u{116C}\u{11AC}", - nfkc: "\u{BF99}", - nfkd: "\u{1108}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{BF9A}", - nfc: "\u{BF9A}", - nfd: "\u{1108}\u{116C}\u{11AD}", - nfkc: "\u{BF9A}", - nfkd: "\u{1108}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{BF9B}", - nfc: "\u{BF9B}", - nfd: "\u{1108}\u{116C}\u{11AE}", - nfkc: "\u{BF9B}", - nfkd: "\u{1108}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{BF9C}", - nfc: "\u{BF9C}", - nfd: "\u{1108}\u{116C}\u{11AF}", - nfkc: "\u{BF9C}", - nfkd: "\u{1108}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{BF9D}", - nfc: "\u{BF9D}", - nfd: "\u{1108}\u{116C}\u{11B0}", - nfkc: "\u{BF9D}", - nfkd: "\u{1108}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{BF9E}", - nfc: "\u{BF9E}", - nfd: "\u{1108}\u{116C}\u{11B1}", - nfkc: "\u{BF9E}", - nfkd: "\u{1108}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{BF9F}", - nfc: "\u{BF9F}", - nfd: "\u{1108}\u{116C}\u{11B2}", - nfkc: "\u{BF9F}", - nfkd: "\u{1108}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{BFA0}", - nfc: "\u{BFA0}", - nfd: "\u{1108}\u{116C}\u{11B3}", - nfkc: "\u{BFA0}", - nfkd: "\u{1108}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{BFA1}", - nfc: "\u{BFA1}", - nfd: "\u{1108}\u{116C}\u{11B4}", - nfkc: "\u{BFA1}", - nfkd: "\u{1108}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{BFA2}", - nfc: "\u{BFA2}", - nfd: "\u{1108}\u{116C}\u{11B5}", - nfkc: "\u{BFA2}", - nfkd: "\u{1108}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{BFA3}", - nfc: "\u{BFA3}", - nfd: "\u{1108}\u{116C}\u{11B6}", - nfkc: "\u{BFA3}", - nfkd: "\u{1108}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{BFA4}", - nfc: "\u{BFA4}", - nfd: "\u{1108}\u{116C}\u{11B7}", - nfkc: "\u{BFA4}", - nfkd: "\u{1108}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{BFA5}", - nfc: "\u{BFA5}", - nfd: "\u{1108}\u{116C}\u{11B8}", - nfkc: "\u{BFA5}", - nfkd: "\u{1108}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{BFA6}", - nfc: "\u{BFA6}", - nfd: "\u{1108}\u{116C}\u{11B9}", - nfkc: "\u{BFA6}", - nfkd: "\u{1108}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{BFA7}", - nfc: "\u{BFA7}", - nfd: "\u{1108}\u{116C}\u{11BA}", - nfkc: "\u{BFA7}", - nfkd: "\u{1108}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{BFA8}", - nfc: "\u{BFA8}", - nfd: "\u{1108}\u{116C}\u{11BB}", - nfkc: "\u{BFA8}", - nfkd: "\u{1108}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{BFA9}", - nfc: "\u{BFA9}", - nfd: "\u{1108}\u{116C}\u{11BC}", - nfkc: "\u{BFA9}", - nfkd: "\u{1108}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{BFAA}", - nfc: "\u{BFAA}", - nfd: "\u{1108}\u{116C}\u{11BD}", - nfkc: "\u{BFAA}", - nfkd: "\u{1108}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{BFAB}", - nfc: "\u{BFAB}", - nfd: "\u{1108}\u{116C}\u{11BE}", - nfkc: "\u{BFAB}", - nfkd: "\u{1108}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{BFAC}", - nfc: "\u{BFAC}", - nfd: "\u{1108}\u{116C}\u{11BF}", - nfkc: "\u{BFAC}", - nfkd: "\u{1108}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{BFAD}", - nfc: "\u{BFAD}", - nfd: "\u{1108}\u{116C}\u{11C0}", - nfkc: "\u{BFAD}", - nfkd: "\u{1108}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{BFAE}", - nfc: "\u{BFAE}", - nfd: "\u{1108}\u{116C}\u{11C1}", - nfkc: "\u{BFAE}", - nfkd: "\u{1108}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{BFAF}", - nfc: "\u{BFAF}", - nfd: "\u{1108}\u{116C}\u{11C2}", - nfkc: "\u{BFAF}", - nfkd: "\u{1108}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{BFB0}", - nfc: "\u{BFB0}", - nfd: "\u{1108}\u{116D}", - nfkc: "\u{BFB0}", - nfkd: "\u{1108}\u{116D}", - }, - NormalizationTest { - source: "\u{BFB1}", - nfc: "\u{BFB1}", - nfd: "\u{1108}\u{116D}\u{11A8}", - nfkc: "\u{BFB1}", - nfkd: "\u{1108}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{BFB2}", - nfc: "\u{BFB2}", - nfd: "\u{1108}\u{116D}\u{11A9}", - nfkc: "\u{BFB2}", - nfkd: "\u{1108}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{BFB3}", - nfc: "\u{BFB3}", - nfd: "\u{1108}\u{116D}\u{11AA}", - nfkc: "\u{BFB3}", - nfkd: "\u{1108}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{BFB4}", - nfc: "\u{BFB4}", - nfd: "\u{1108}\u{116D}\u{11AB}", - nfkc: "\u{BFB4}", - nfkd: "\u{1108}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{BFB5}", - nfc: "\u{BFB5}", - nfd: "\u{1108}\u{116D}\u{11AC}", - nfkc: "\u{BFB5}", - nfkd: "\u{1108}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{BFB6}", - nfc: "\u{BFB6}", - nfd: "\u{1108}\u{116D}\u{11AD}", - nfkc: "\u{BFB6}", - nfkd: "\u{1108}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{BFB7}", - nfc: "\u{BFB7}", - nfd: "\u{1108}\u{116D}\u{11AE}", - nfkc: "\u{BFB7}", - nfkd: "\u{1108}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{BFB8}", - nfc: "\u{BFB8}", - nfd: "\u{1108}\u{116D}\u{11AF}", - nfkc: "\u{BFB8}", - nfkd: "\u{1108}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{BFB9}", - nfc: "\u{BFB9}", - nfd: "\u{1108}\u{116D}\u{11B0}", - nfkc: "\u{BFB9}", - nfkd: "\u{1108}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{BFBA}", - nfc: "\u{BFBA}", - nfd: "\u{1108}\u{116D}\u{11B1}", - nfkc: "\u{BFBA}", - nfkd: "\u{1108}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{BFBB}", - nfc: "\u{BFBB}", - nfd: "\u{1108}\u{116D}\u{11B2}", - nfkc: "\u{BFBB}", - nfkd: "\u{1108}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{BFBC}", - nfc: "\u{BFBC}", - nfd: "\u{1108}\u{116D}\u{11B3}", - nfkc: "\u{BFBC}", - nfkd: "\u{1108}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{BFBD}", - nfc: "\u{BFBD}", - nfd: "\u{1108}\u{116D}\u{11B4}", - nfkc: "\u{BFBD}", - nfkd: "\u{1108}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{BFBE}", - nfc: "\u{BFBE}", - nfd: "\u{1108}\u{116D}\u{11B5}", - nfkc: "\u{BFBE}", - nfkd: "\u{1108}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{BFBF}", - nfc: "\u{BFBF}", - nfd: "\u{1108}\u{116D}\u{11B6}", - nfkc: "\u{BFBF}", - nfkd: "\u{1108}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{BFC0}", - nfc: "\u{BFC0}", - nfd: "\u{1108}\u{116D}\u{11B7}", - nfkc: "\u{BFC0}", - nfkd: "\u{1108}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{BFC1}", - nfc: "\u{BFC1}", - nfd: "\u{1108}\u{116D}\u{11B8}", - nfkc: "\u{BFC1}", - nfkd: "\u{1108}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{BFC2}", - nfc: "\u{BFC2}", - nfd: "\u{1108}\u{116D}\u{11B9}", - nfkc: "\u{BFC2}", - nfkd: "\u{1108}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{BFC3}", - nfc: "\u{BFC3}", - nfd: "\u{1108}\u{116D}\u{11BA}", - nfkc: "\u{BFC3}", - nfkd: "\u{1108}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{BFC4}", - nfc: "\u{BFC4}", - nfd: "\u{1108}\u{116D}\u{11BB}", - nfkc: "\u{BFC4}", - nfkd: "\u{1108}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{BFC5}", - nfc: "\u{BFC5}", - nfd: "\u{1108}\u{116D}\u{11BC}", - nfkc: "\u{BFC5}", - nfkd: "\u{1108}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{BFC6}", - nfc: "\u{BFC6}", - nfd: "\u{1108}\u{116D}\u{11BD}", - nfkc: "\u{BFC6}", - nfkd: "\u{1108}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{BFC7}", - nfc: "\u{BFC7}", - nfd: "\u{1108}\u{116D}\u{11BE}", - nfkc: "\u{BFC7}", - nfkd: "\u{1108}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{BFC8}", - nfc: "\u{BFC8}", - nfd: "\u{1108}\u{116D}\u{11BF}", - nfkc: "\u{BFC8}", - nfkd: "\u{1108}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{BFC9}", - nfc: "\u{BFC9}", - nfd: "\u{1108}\u{116D}\u{11C0}", - nfkc: "\u{BFC9}", - nfkd: "\u{1108}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{BFCA}", - nfc: "\u{BFCA}", - nfd: "\u{1108}\u{116D}\u{11C1}", - nfkc: "\u{BFCA}", - nfkd: "\u{1108}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{BFCB}", - nfc: "\u{BFCB}", - nfd: "\u{1108}\u{116D}\u{11C2}", - nfkc: "\u{BFCB}", - nfkd: "\u{1108}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{BFCC}", - nfc: "\u{BFCC}", - nfd: "\u{1108}\u{116E}", - nfkc: "\u{BFCC}", - nfkd: "\u{1108}\u{116E}", - }, - NormalizationTest { - source: "\u{BFCD}", - nfc: "\u{BFCD}", - nfd: "\u{1108}\u{116E}\u{11A8}", - nfkc: "\u{BFCD}", - nfkd: "\u{1108}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{BFCE}", - nfc: "\u{BFCE}", - nfd: "\u{1108}\u{116E}\u{11A9}", - nfkc: "\u{BFCE}", - nfkd: "\u{1108}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{BFCF}", - nfc: "\u{BFCF}", - nfd: "\u{1108}\u{116E}\u{11AA}", - nfkc: "\u{BFCF}", - nfkd: "\u{1108}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{BFD0}", - nfc: "\u{BFD0}", - nfd: "\u{1108}\u{116E}\u{11AB}", - nfkc: "\u{BFD0}", - nfkd: "\u{1108}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{BFD1}", - nfc: "\u{BFD1}", - nfd: "\u{1108}\u{116E}\u{11AC}", - nfkc: "\u{BFD1}", - nfkd: "\u{1108}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{BFD2}", - nfc: "\u{BFD2}", - nfd: "\u{1108}\u{116E}\u{11AD}", - nfkc: "\u{BFD2}", - nfkd: "\u{1108}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{BFD3}", - nfc: "\u{BFD3}", - nfd: "\u{1108}\u{116E}\u{11AE}", - nfkc: "\u{BFD3}", - nfkd: "\u{1108}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{BFD4}", - nfc: "\u{BFD4}", - nfd: "\u{1108}\u{116E}\u{11AF}", - nfkc: "\u{BFD4}", - nfkd: "\u{1108}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{BFD5}", - nfc: "\u{BFD5}", - nfd: "\u{1108}\u{116E}\u{11B0}", - nfkc: "\u{BFD5}", - nfkd: "\u{1108}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{BFD6}", - nfc: "\u{BFD6}", - nfd: "\u{1108}\u{116E}\u{11B1}", - nfkc: "\u{BFD6}", - nfkd: "\u{1108}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{BFD7}", - nfc: "\u{BFD7}", - nfd: "\u{1108}\u{116E}\u{11B2}", - nfkc: "\u{BFD7}", - nfkd: "\u{1108}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{BFD8}", - nfc: "\u{BFD8}", - nfd: "\u{1108}\u{116E}\u{11B3}", - nfkc: "\u{BFD8}", - nfkd: "\u{1108}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{BFD9}", - nfc: "\u{BFD9}", - nfd: "\u{1108}\u{116E}\u{11B4}", - nfkc: "\u{BFD9}", - nfkd: "\u{1108}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{BFDA}", - nfc: "\u{BFDA}", - nfd: "\u{1108}\u{116E}\u{11B5}", - nfkc: "\u{BFDA}", - nfkd: "\u{1108}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{BFDB}", - nfc: "\u{BFDB}", - nfd: "\u{1108}\u{116E}\u{11B6}", - nfkc: "\u{BFDB}", - nfkd: "\u{1108}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{BFDC}", - nfc: "\u{BFDC}", - nfd: "\u{1108}\u{116E}\u{11B7}", - nfkc: "\u{BFDC}", - nfkd: "\u{1108}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{BFDD}", - nfc: "\u{BFDD}", - nfd: "\u{1108}\u{116E}\u{11B8}", - nfkc: "\u{BFDD}", - nfkd: "\u{1108}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{BFDE}", - nfc: "\u{BFDE}", - nfd: "\u{1108}\u{116E}\u{11B9}", - nfkc: "\u{BFDE}", - nfkd: "\u{1108}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{BFDF}", - nfc: "\u{BFDF}", - nfd: "\u{1108}\u{116E}\u{11BA}", - nfkc: "\u{BFDF}", - nfkd: "\u{1108}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{BFE0}", - nfc: "\u{BFE0}", - nfd: "\u{1108}\u{116E}\u{11BB}", - nfkc: "\u{BFE0}", - nfkd: "\u{1108}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{BFE1}", - nfc: "\u{BFE1}", - nfd: "\u{1108}\u{116E}\u{11BC}", - nfkc: "\u{BFE1}", - nfkd: "\u{1108}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{BFE2}", - nfc: "\u{BFE2}", - nfd: "\u{1108}\u{116E}\u{11BD}", - nfkc: "\u{BFE2}", - nfkd: "\u{1108}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{BFE3}", - nfc: "\u{BFE3}", - nfd: "\u{1108}\u{116E}\u{11BE}", - nfkc: "\u{BFE3}", - nfkd: "\u{1108}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{BFE4}", - nfc: "\u{BFE4}", - nfd: "\u{1108}\u{116E}\u{11BF}", - nfkc: "\u{BFE4}", - nfkd: "\u{1108}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{BFE5}", - nfc: "\u{BFE5}", - nfd: "\u{1108}\u{116E}\u{11C0}", - nfkc: "\u{BFE5}", - nfkd: "\u{1108}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{BFE6}", - nfc: "\u{BFE6}", - nfd: "\u{1108}\u{116E}\u{11C1}", - nfkc: "\u{BFE6}", - nfkd: "\u{1108}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{BFE7}", - nfc: "\u{BFE7}", - nfd: "\u{1108}\u{116E}\u{11C2}", - nfkc: "\u{BFE7}", - nfkd: "\u{1108}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{BFE8}", - nfc: "\u{BFE8}", - nfd: "\u{1108}\u{116F}", - nfkc: "\u{BFE8}", - nfkd: "\u{1108}\u{116F}", - }, - NormalizationTest { - source: "\u{BFE9}", - nfc: "\u{BFE9}", - nfd: "\u{1108}\u{116F}\u{11A8}", - nfkc: "\u{BFE9}", - nfkd: "\u{1108}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{BFEA}", - nfc: "\u{BFEA}", - nfd: "\u{1108}\u{116F}\u{11A9}", - nfkc: "\u{BFEA}", - nfkd: "\u{1108}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{BFEB}", - nfc: "\u{BFEB}", - nfd: "\u{1108}\u{116F}\u{11AA}", - nfkc: "\u{BFEB}", - nfkd: "\u{1108}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{BFEC}", - nfc: "\u{BFEC}", - nfd: "\u{1108}\u{116F}\u{11AB}", - nfkc: "\u{BFEC}", - nfkd: "\u{1108}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{BFED}", - nfc: "\u{BFED}", - nfd: "\u{1108}\u{116F}\u{11AC}", - nfkc: "\u{BFED}", - nfkd: "\u{1108}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{BFEE}", - nfc: "\u{BFEE}", - nfd: "\u{1108}\u{116F}\u{11AD}", - nfkc: "\u{BFEE}", - nfkd: "\u{1108}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{BFEF}", - nfc: "\u{BFEF}", - nfd: "\u{1108}\u{116F}\u{11AE}", - nfkc: "\u{BFEF}", - nfkd: "\u{1108}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{BFF0}", - nfc: "\u{BFF0}", - nfd: "\u{1108}\u{116F}\u{11AF}", - nfkc: "\u{BFF0}", - nfkd: "\u{1108}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{BFF1}", - nfc: "\u{BFF1}", - nfd: "\u{1108}\u{116F}\u{11B0}", - nfkc: "\u{BFF1}", - nfkd: "\u{1108}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{BFF2}", - nfc: "\u{BFF2}", - nfd: "\u{1108}\u{116F}\u{11B1}", - nfkc: "\u{BFF2}", - nfkd: "\u{1108}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{BFF3}", - nfc: "\u{BFF3}", - nfd: "\u{1108}\u{116F}\u{11B2}", - nfkc: "\u{BFF3}", - nfkd: "\u{1108}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{BFF4}", - nfc: "\u{BFF4}", - nfd: "\u{1108}\u{116F}\u{11B3}", - nfkc: "\u{BFF4}", - nfkd: "\u{1108}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{BFF5}", - nfc: "\u{BFF5}", - nfd: "\u{1108}\u{116F}\u{11B4}", - nfkc: "\u{BFF5}", - nfkd: "\u{1108}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{BFF6}", - nfc: "\u{BFF6}", - nfd: "\u{1108}\u{116F}\u{11B5}", - nfkc: "\u{BFF6}", - nfkd: "\u{1108}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{BFF7}", - nfc: "\u{BFF7}", - nfd: "\u{1108}\u{116F}\u{11B6}", - nfkc: "\u{BFF7}", - nfkd: "\u{1108}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{BFF8}", - nfc: "\u{BFF8}", - nfd: "\u{1108}\u{116F}\u{11B7}", - nfkc: "\u{BFF8}", - nfkd: "\u{1108}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{BFF9}", - nfc: "\u{BFF9}", - nfd: "\u{1108}\u{116F}\u{11B8}", - nfkc: "\u{BFF9}", - nfkd: "\u{1108}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{BFFA}", - nfc: "\u{BFFA}", - nfd: "\u{1108}\u{116F}\u{11B9}", - nfkc: "\u{BFFA}", - nfkd: "\u{1108}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{BFFB}", - nfc: "\u{BFFB}", - nfd: "\u{1108}\u{116F}\u{11BA}", - nfkc: "\u{BFFB}", - nfkd: "\u{1108}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{BFFC}", - nfc: "\u{BFFC}", - nfd: "\u{1108}\u{116F}\u{11BB}", - nfkc: "\u{BFFC}", - nfkd: "\u{1108}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{BFFD}", - nfc: "\u{BFFD}", - nfd: "\u{1108}\u{116F}\u{11BC}", - nfkc: "\u{BFFD}", - nfkd: "\u{1108}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{BFFE}", - nfc: "\u{BFFE}", - nfd: "\u{1108}\u{116F}\u{11BD}", - nfkc: "\u{BFFE}", - nfkd: "\u{1108}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{BFFF}", - nfc: "\u{BFFF}", - nfd: "\u{1108}\u{116F}\u{11BE}", - nfkc: "\u{BFFF}", - nfkd: "\u{1108}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{C000}", - nfc: "\u{C000}", - nfd: "\u{1108}\u{116F}\u{11BF}", - nfkc: "\u{C000}", - nfkd: "\u{1108}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{C001}", - nfc: "\u{C001}", - nfd: "\u{1108}\u{116F}\u{11C0}", - nfkc: "\u{C001}", - nfkd: "\u{1108}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{C002}", - nfc: "\u{C002}", - nfd: "\u{1108}\u{116F}\u{11C1}", - nfkc: "\u{C002}", - nfkd: "\u{1108}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{C003}", - nfc: "\u{C003}", - nfd: "\u{1108}\u{116F}\u{11C2}", - nfkc: "\u{C003}", - nfkd: "\u{1108}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{C004}", - nfc: "\u{C004}", - nfd: "\u{1108}\u{1170}", - nfkc: "\u{C004}", - nfkd: "\u{1108}\u{1170}", - }, - NormalizationTest { - source: "\u{C005}", - nfc: "\u{C005}", - nfd: "\u{1108}\u{1170}\u{11A8}", - nfkc: "\u{C005}", - nfkd: "\u{1108}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{C006}", - nfc: "\u{C006}", - nfd: "\u{1108}\u{1170}\u{11A9}", - nfkc: "\u{C006}", - nfkd: "\u{1108}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{C007}", - nfc: "\u{C007}", - nfd: "\u{1108}\u{1170}\u{11AA}", - nfkc: "\u{C007}", - nfkd: "\u{1108}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{C008}", - nfc: "\u{C008}", - nfd: "\u{1108}\u{1170}\u{11AB}", - nfkc: "\u{C008}", - nfkd: "\u{1108}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{C009}", - nfc: "\u{C009}", - nfd: "\u{1108}\u{1170}\u{11AC}", - nfkc: "\u{C009}", - nfkd: "\u{1108}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{C00A}", - nfc: "\u{C00A}", - nfd: "\u{1108}\u{1170}\u{11AD}", - nfkc: "\u{C00A}", - nfkd: "\u{1108}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{C00B}", - nfc: "\u{C00B}", - nfd: "\u{1108}\u{1170}\u{11AE}", - nfkc: "\u{C00B}", - nfkd: "\u{1108}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{C00C}", - nfc: "\u{C00C}", - nfd: "\u{1108}\u{1170}\u{11AF}", - nfkc: "\u{C00C}", - nfkd: "\u{1108}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{C00D}", - nfc: "\u{C00D}", - nfd: "\u{1108}\u{1170}\u{11B0}", - nfkc: "\u{C00D}", - nfkd: "\u{1108}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{C00E}", - nfc: "\u{C00E}", - nfd: "\u{1108}\u{1170}\u{11B1}", - nfkc: "\u{C00E}", - nfkd: "\u{1108}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{C00F}", - nfc: "\u{C00F}", - nfd: "\u{1108}\u{1170}\u{11B2}", - nfkc: "\u{C00F}", - nfkd: "\u{1108}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{C010}", - nfc: "\u{C010}", - nfd: "\u{1108}\u{1170}\u{11B3}", - nfkc: "\u{C010}", - nfkd: "\u{1108}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{C011}", - nfc: "\u{C011}", - nfd: "\u{1108}\u{1170}\u{11B4}", - nfkc: "\u{C011}", - nfkd: "\u{1108}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{C012}", - nfc: "\u{C012}", - nfd: "\u{1108}\u{1170}\u{11B5}", - nfkc: "\u{C012}", - nfkd: "\u{1108}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{C013}", - nfc: "\u{C013}", - nfd: "\u{1108}\u{1170}\u{11B6}", - nfkc: "\u{C013}", - nfkd: "\u{1108}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{C014}", - nfc: "\u{C014}", - nfd: "\u{1108}\u{1170}\u{11B7}", - nfkc: "\u{C014}", - nfkd: "\u{1108}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{C015}", - nfc: "\u{C015}", - nfd: "\u{1108}\u{1170}\u{11B8}", - nfkc: "\u{C015}", - nfkd: "\u{1108}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{C016}", - nfc: "\u{C016}", - nfd: "\u{1108}\u{1170}\u{11B9}", - nfkc: "\u{C016}", - nfkd: "\u{1108}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{C017}", - nfc: "\u{C017}", - nfd: "\u{1108}\u{1170}\u{11BA}", - nfkc: "\u{C017}", - nfkd: "\u{1108}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{C018}", - nfc: "\u{C018}", - nfd: "\u{1108}\u{1170}\u{11BB}", - nfkc: "\u{C018}", - nfkd: "\u{1108}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{C019}", - nfc: "\u{C019}", - nfd: "\u{1108}\u{1170}\u{11BC}", - nfkc: "\u{C019}", - nfkd: "\u{1108}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{C01A}", - nfc: "\u{C01A}", - nfd: "\u{1108}\u{1170}\u{11BD}", - nfkc: "\u{C01A}", - nfkd: "\u{1108}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{C01B}", - nfc: "\u{C01B}", - nfd: "\u{1108}\u{1170}\u{11BE}", - nfkc: "\u{C01B}", - nfkd: "\u{1108}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{C01C}", - nfc: "\u{C01C}", - nfd: "\u{1108}\u{1170}\u{11BF}", - nfkc: "\u{C01C}", - nfkd: "\u{1108}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{C01D}", - nfc: "\u{C01D}", - nfd: "\u{1108}\u{1170}\u{11C0}", - nfkc: "\u{C01D}", - nfkd: "\u{1108}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{C01E}", - nfc: "\u{C01E}", - nfd: "\u{1108}\u{1170}\u{11C1}", - nfkc: "\u{C01E}", - nfkd: "\u{1108}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{C01F}", - nfc: "\u{C01F}", - nfd: "\u{1108}\u{1170}\u{11C2}", - nfkc: "\u{C01F}", - nfkd: "\u{1108}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{C020}", - nfc: "\u{C020}", - nfd: "\u{1108}\u{1171}", - nfkc: "\u{C020}", - nfkd: "\u{1108}\u{1171}", - }, - NormalizationTest { - source: "\u{C021}", - nfc: "\u{C021}", - nfd: "\u{1108}\u{1171}\u{11A8}", - nfkc: "\u{C021}", - nfkd: "\u{1108}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{C022}", - nfc: "\u{C022}", - nfd: "\u{1108}\u{1171}\u{11A9}", - nfkc: "\u{C022}", - nfkd: "\u{1108}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{C023}", - nfc: "\u{C023}", - nfd: "\u{1108}\u{1171}\u{11AA}", - nfkc: "\u{C023}", - nfkd: "\u{1108}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{C024}", - nfc: "\u{C024}", - nfd: "\u{1108}\u{1171}\u{11AB}", - nfkc: "\u{C024}", - nfkd: "\u{1108}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{C025}", - nfc: "\u{C025}", - nfd: "\u{1108}\u{1171}\u{11AC}", - nfkc: "\u{C025}", - nfkd: "\u{1108}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{C026}", - nfc: "\u{C026}", - nfd: "\u{1108}\u{1171}\u{11AD}", - nfkc: "\u{C026}", - nfkd: "\u{1108}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{C027}", - nfc: "\u{C027}", - nfd: "\u{1108}\u{1171}\u{11AE}", - nfkc: "\u{C027}", - nfkd: "\u{1108}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{C028}", - nfc: "\u{C028}", - nfd: "\u{1108}\u{1171}\u{11AF}", - nfkc: "\u{C028}", - nfkd: "\u{1108}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{C029}", - nfc: "\u{C029}", - nfd: "\u{1108}\u{1171}\u{11B0}", - nfkc: "\u{C029}", - nfkd: "\u{1108}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{C02A}", - nfc: "\u{C02A}", - nfd: "\u{1108}\u{1171}\u{11B1}", - nfkc: "\u{C02A}", - nfkd: "\u{1108}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{C02B}", - nfc: "\u{C02B}", - nfd: "\u{1108}\u{1171}\u{11B2}", - nfkc: "\u{C02B}", - nfkd: "\u{1108}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{C02C}", - nfc: "\u{C02C}", - nfd: "\u{1108}\u{1171}\u{11B3}", - nfkc: "\u{C02C}", - nfkd: "\u{1108}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{C02D}", - nfc: "\u{C02D}", - nfd: "\u{1108}\u{1171}\u{11B4}", - nfkc: "\u{C02D}", - nfkd: "\u{1108}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{C02E}", - nfc: "\u{C02E}", - nfd: "\u{1108}\u{1171}\u{11B5}", - nfkc: "\u{C02E}", - nfkd: "\u{1108}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{C02F}", - nfc: "\u{C02F}", - nfd: "\u{1108}\u{1171}\u{11B6}", - nfkc: "\u{C02F}", - nfkd: "\u{1108}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{C030}", - nfc: "\u{C030}", - nfd: "\u{1108}\u{1171}\u{11B7}", - nfkc: "\u{C030}", - nfkd: "\u{1108}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{C031}", - nfc: "\u{C031}", - nfd: "\u{1108}\u{1171}\u{11B8}", - nfkc: "\u{C031}", - nfkd: "\u{1108}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{C032}", - nfc: "\u{C032}", - nfd: "\u{1108}\u{1171}\u{11B9}", - nfkc: "\u{C032}", - nfkd: "\u{1108}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{C033}", - nfc: "\u{C033}", - nfd: "\u{1108}\u{1171}\u{11BA}", - nfkc: "\u{C033}", - nfkd: "\u{1108}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{C034}", - nfc: "\u{C034}", - nfd: "\u{1108}\u{1171}\u{11BB}", - nfkc: "\u{C034}", - nfkd: "\u{1108}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{C035}", - nfc: "\u{C035}", - nfd: "\u{1108}\u{1171}\u{11BC}", - nfkc: "\u{C035}", - nfkd: "\u{1108}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{C036}", - nfc: "\u{C036}", - nfd: "\u{1108}\u{1171}\u{11BD}", - nfkc: "\u{C036}", - nfkd: "\u{1108}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{C037}", - nfc: "\u{C037}", - nfd: "\u{1108}\u{1171}\u{11BE}", - nfkc: "\u{C037}", - nfkd: "\u{1108}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{C038}", - nfc: "\u{C038}", - nfd: "\u{1108}\u{1171}\u{11BF}", - nfkc: "\u{C038}", - nfkd: "\u{1108}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{C039}", - nfc: "\u{C039}", - nfd: "\u{1108}\u{1171}\u{11C0}", - nfkc: "\u{C039}", - nfkd: "\u{1108}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{C03A}", - nfc: "\u{C03A}", - nfd: "\u{1108}\u{1171}\u{11C1}", - nfkc: "\u{C03A}", - nfkd: "\u{1108}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{C03B}", - nfc: "\u{C03B}", - nfd: "\u{1108}\u{1171}\u{11C2}", - nfkc: "\u{C03B}", - nfkd: "\u{1108}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{C03C}", - nfc: "\u{C03C}", - nfd: "\u{1108}\u{1172}", - nfkc: "\u{C03C}", - nfkd: "\u{1108}\u{1172}", - }, - NormalizationTest { - source: "\u{C03D}", - nfc: "\u{C03D}", - nfd: "\u{1108}\u{1172}\u{11A8}", - nfkc: "\u{C03D}", - nfkd: "\u{1108}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{C03E}", - nfc: "\u{C03E}", - nfd: "\u{1108}\u{1172}\u{11A9}", - nfkc: "\u{C03E}", - nfkd: "\u{1108}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{C03F}", - nfc: "\u{C03F}", - nfd: "\u{1108}\u{1172}\u{11AA}", - nfkc: "\u{C03F}", - nfkd: "\u{1108}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{C040}", - nfc: "\u{C040}", - nfd: "\u{1108}\u{1172}\u{11AB}", - nfkc: "\u{C040}", - nfkd: "\u{1108}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{C041}", - nfc: "\u{C041}", - nfd: "\u{1108}\u{1172}\u{11AC}", - nfkc: "\u{C041}", - nfkd: "\u{1108}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{C042}", - nfc: "\u{C042}", - nfd: "\u{1108}\u{1172}\u{11AD}", - nfkc: "\u{C042}", - nfkd: "\u{1108}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{C043}", - nfc: "\u{C043}", - nfd: "\u{1108}\u{1172}\u{11AE}", - nfkc: "\u{C043}", - nfkd: "\u{1108}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{C044}", - nfc: "\u{C044}", - nfd: "\u{1108}\u{1172}\u{11AF}", - nfkc: "\u{C044}", - nfkd: "\u{1108}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{C045}", - nfc: "\u{C045}", - nfd: "\u{1108}\u{1172}\u{11B0}", - nfkc: "\u{C045}", - nfkd: "\u{1108}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{C046}", - nfc: "\u{C046}", - nfd: "\u{1108}\u{1172}\u{11B1}", - nfkc: "\u{C046}", - nfkd: "\u{1108}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{C047}", - nfc: "\u{C047}", - nfd: "\u{1108}\u{1172}\u{11B2}", - nfkc: "\u{C047}", - nfkd: "\u{1108}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{C048}", - nfc: "\u{C048}", - nfd: "\u{1108}\u{1172}\u{11B3}", - nfkc: "\u{C048}", - nfkd: "\u{1108}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{C049}", - nfc: "\u{C049}", - nfd: "\u{1108}\u{1172}\u{11B4}", - nfkc: "\u{C049}", - nfkd: "\u{1108}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{C04A}", - nfc: "\u{C04A}", - nfd: "\u{1108}\u{1172}\u{11B5}", - nfkc: "\u{C04A}", - nfkd: "\u{1108}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{C04B}", - nfc: "\u{C04B}", - nfd: "\u{1108}\u{1172}\u{11B6}", - nfkc: "\u{C04B}", - nfkd: "\u{1108}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{C04C}", - nfc: "\u{C04C}", - nfd: "\u{1108}\u{1172}\u{11B7}", - nfkc: "\u{C04C}", - nfkd: "\u{1108}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{C04D}", - nfc: "\u{C04D}", - nfd: "\u{1108}\u{1172}\u{11B8}", - nfkc: "\u{C04D}", - nfkd: "\u{1108}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{C04E}", - nfc: "\u{C04E}", - nfd: "\u{1108}\u{1172}\u{11B9}", - nfkc: "\u{C04E}", - nfkd: "\u{1108}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{C04F}", - nfc: "\u{C04F}", - nfd: "\u{1108}\u{1172}\u{11BA}", - nfkc: "\u{C04F}", - nfkd: "\u{1108}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{C050}", - nfc: "\u{C050}", - nfd: "\u{1108}\u{1172}\u{11BB}", - nfkc: "\u{C050}", - nfkd: "\u{1108}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{C051}", - nfc: "\u{C051}", - nfd: "\u{1108}\u{1172}\u{11BC}", - nfkc: "\u{C051}", - nfkd: "\u{1108}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{C052}", - nfc: "\u{C052}", - nfd: "\u{1108}\u{1172}\u{11BD}", - nfkc: "\u{C052}", - nfkd: "\u{1108}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{C053}", - nfc: "\u{C053}", - nfd: "\u{1108}\u{1172}\u{11BE}", - nfkc: "\u{C053}", - nfkd: "\u{1108}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{C054}", - nfc: "\u{C054}", - nfd: "\u{1108}\u{1172}\u{11BF}", - nfkc: "\u{C054}", - nfkd: "\u{1108}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{C055}", - nfc: "\u{C055}", - nfd: "\u{1108}\u{1172}\u{11C0}", - nfkc: "\u{C055}", - nfkd: "\u{1108}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{C056}", - nfc: "\u{C056}", - nfd: "\u{1108}\u{1172}\u{11C1}", - nfkc: "\u{C056}", - nfkd: "\u{1108}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{C057}", - nfc: "\u{C057}", - nfd: "\u{1108}\u{1172}\u{11C2}", - nfkc: "\u{C057}", - nfkd: "\u{1108}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{C058}", - nfc: "\u{C058}", - nfd: "\u{1108}\u{1173}", - nfkc: "\u{C058}", - nfkd: "\u{1108}\u{1173}", - }, - NormalizationTest { - source: "\u{C059}", - nfc: "\u{C059}", - nfd: "\u{1108}\u{1173}\u{11A8}", - nfkc: "\u{C059}", - nfkd: "\u{1108}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{C05A}", - nfc: "\u{C05A}", - nfd: "\u{1108}\u{1173}\u{11A9}", - nfkc: "\u{C05A}", - nfkd: "\u{1108}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{C05B}", - nfc: "\u{C05B}", - nfd: "\u{1108}\u{1173}\u{11AA}", - nfkc: "\u{C05B}", - nfkd: "\u{1108}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{C05C}", - nfc: "\u{C05C}", - nfd: "\u{1108}\u{1173}\u{11AB}", - nfkc: "\u{C05C}", - nfkd: "\u{1108}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{C05D}", - nfc: "\u{C05D}", - nfd: "\u{1108}\u{1173}\u{11AC}", - nfkc: "\u{C05D}", - nfkd: "\u{1108}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{C05E}", - nfc: "\u{C05E}", - nfd: "\u{1108}\u{1173}\u{11AD}", - nfkc: "\u{C05E}", - nfkd: "\u{1108}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{C05F}", - nfc: "\u{C05F}", - nfd: "\u{1108}\u{1173}\u{11AE}", - nfkc: "\u{C05F}", - nfkd: "\u{1108}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{C060}", - nfc: "\u{C060}", - nfd: "\u{1108}\u{1173}\u{11AF}", - nfkc: "\u{C060}", - nfkd: "\u{1108}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{C061}", - nfc: "\u{C061}", - nfd: "\u{1108}\u{1173}\u{11B0}", - nfkc: "\u{C061}", - nfkd: "\u{1108}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{C062}", - nfc: "\u{C062}", - nfd: "\u{1108}\u{1173}\u{11B1}", - nfkc: "\u{C062}", - nfkd: "\u{1108}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{C063}", - nfc: "\u{C063}", - nfd: "\u{1108}\u{1173}\u{11B2}", - nfkc: "\u{C063}", - nfkd: "\u{1108}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{C064}", - nfc: "\u{C064}", - nfd: "\u{1108}\u{1173}\u{11B3}", - nfkc: "\u{C064}", - nfkd: "\u{1108}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{C065}", - nfc: "\u{C065}", - nfd: "\u{1108}\u{1173}\u{11B4}", - nfkc: "\u{C065}", - nfkd: "\u{1108}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{C066}", - nfc: "\u{C066}", - nfd: "\u{1108}\u{1173}\u{11B5}", - nfkc: "\u{C066}", - nfkd: "\u{1108}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{C067}", - nfc: "\u{C067}", - nfd: "\u{1108}\u{1173}\u{11B6}", - nfkc: "\u{C067}", - nfkd: "\u{1108}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{C068}", - nfc: "\u{C068}", - nfd: "\u{1108}\u{1173}\u{11B7}", - nfkc: "\u{C068}", - nfkd: "\u{1108}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{C069}", - nfc: "\u{C069}", - nfd: "\u{1108}\u{1173}\u{11B8}", - nfkc: "\u{C069}", - nfkd: "\u{1108}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{C06A}", - nfc: "\u{C06A}", - nfd: "\u{1108}\u{1173}\u{11B9}", - nfkc: "\u{C06A}", - nfkd: "\u{1108}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{C06B}", - nfc: "\u{C06B}", - nfd: "\u{1108}\u{1173}\u{11BA}", - nfkc: "\u{C06B}", - nfkd: "\u{1108}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{C06C}", - nfc: "\u{C06C}", - nfd: "\u{1108}\u{1173}\u{11BB}", - nfkc: "\u{C06C}", - nfkd: "\u{1108}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{C06D}", - nfc: "\u{C06D}", - nfd: "\u{1108}\u{1173}\u{11BC}", - nfkc: "\u{C06D}", - nfkd: "\u{1108}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{C06E}", - nfc: "\u{C06E}", - nfd: "\u{1108}\u{1173}\u{11BD}", - nfkc: "\u{C06E}", - nfkd: "\u{1108}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{C06F}", - nfc: "\u{C06F}", - nfd: "\u{1108}\u{1173}\u{11BE}", - nfkc: "\u{C06F}", - nfkd: "\u{1108}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{C070}", - nfc: "\u{C070}", - nfd: "\u{1108}\u{1173}\u{11BF}", - nfkc: "\u{C070}", - nfkd: "\u{1108}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{C071}", - nfc: "\u{C071}", - nfd: "\u{1108}\u{1173}\u{11C0}", - nfkc: "\u{C071}", - nfkd: "\u{1108}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{C072}", - nfc: "\u{C072}", - nfd: "\u{1108}\u{1173}\u{11C1}", - nfkc: "\u{C072}", - nfkd: "\u{1108}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{C073}", - nfc: "\u{C073}", - nfd: "\u{1108}\u{1173}\u{11C2}", - nfkc: "\u{C073}", - nfkd: "\u{1108}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{C074}", - nfc: "\u{C074}", - nfd: "\u{1108}\u{1174}", - nfkc: "\u{C074}", - nfkd: "\u{1108}\u{1174}", - }, - NormalizationTest { - source: "\u{C075}", - nfc: "\u{C075}", - nfd: "\u{1108}\u{1174}\u{11A8}", - nfkc: "\u{C075}", - nfkd: "\u{1108}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{C076}", - nfc: "\u{C076}", - nfd: "\u{1108}\u{1174}\u{11A9}", - nfkc: "\u{C076}", - nfkd: "\u{1108}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{C077}", - nfc: "\u{C077}", - nfd: "\u{1108}\u{1174}\u{11AA}", - nfkc: "\u{C077}", - nfkd: "\u{1108}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{C078}", - nfc: "\u{C078}", - nfd: "\u{1108}\u{1174}\u{11AB}", - nfkc: "\u{C078}", - nfkd: "\u{1108}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{C079}", - nfc: "\u{C079}", - nfd: "\u{1108}\u{1174}\u{11AC}", - nfkc: "\u{C079}", - nfkd: "\u{1108}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{C07A}", - nfc: "\u{C07A}", - nfd: "\u{1108}\u{1174}\u{11AD}", - nfkc: "\u{C07A}", - nfkd: "\u{1108}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{C07B}", - nfc: "\u{C07B}", - nfd: "\u{1108}\u{1174}\u{11AE}", - nfkc: "\u{C07B}", - nfkd: "\u{1108}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{C07C}", - nfc: "\u{C07C}", - nfd: "\u{1108}\u{1174}\u{11AF}", - nfkc: "\u{C07C}", - nfkd: "\u{1108}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{C07D}", - nfc: "\u{C07D}", - nfd: "\u{1108}\u{1174}\u{11B0}", - nfkc: "\u{C07D}", - nfkd: "\u{1108}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{C07E}", - nfc: "\u{C07E}", - nfd: "\u{1108}\u{1174}\u{11B1}", - nfkc: "\u{C07E}", - nfkd: "\u{1108}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{C07F}", - nfc: "\u{C07F}", - nfd: "\u{1108}\u{1174}\u{11B2}", - nfkc: "\u{C07F}", - nfkd: "\u{1108}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{C080}", - nfc: "\u{C080}", - nfd: "\u{1108}\u{1174}\u{11B3}", - nfkc: "\u{C080}", - nfkd: "\u{1108}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{C081}", - nfc: "\u{C081}", - nfd: "\u{1108}\u{1174}\u{11B4}", - nfkc: "\u{C081}", - nfkd: "\u{1108}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{C082}", - nfc: "\u{C082}", - nfd: "\u{1108}\u{1174}\u{11B5}", - nfkc: "\u{C082}", - nfkd: "\u{1108}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{C083}", - nfc: "\u{C083}", - nfd: "\u{1108}\u{1174}\u{11B6}", - nfkc: "\u{C083}", - nfkd: "\u{1108}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{C084}", - nfc: "\u{C084}", - nfd: "\u{1108}\u{1174}\u{11B7}", - nfkc: "\u{C084}", - nfkd: "\u{1108}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{C085}", - nfc: "\u{C085}", - nfd: "\u{1108}\u{1174}\u{11B8}", - nfkc: "\u{C085}", - nfkd: "\u{1108}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{C086}", - nfc: "\u{C086}", - nfd: "\u{1108}\u{1174}\u{11B9}", - nfkc: "\u{C086}", - nfkd: "\u{1108}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{C087}", - nfc: "\u{C087}", - nfd: "\u{1108}\u{1174}\u{11BA}", - nfkc: "\u{C087}", - nfkd: "\u{1108}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{C088}", - nfc: "\u{C088}", - nfd: "\u{1108}\u{1174}\u{11BB}", - nfkc: "\u{C088}", - nfkd: "\u{1108}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{C089}", - nfc: "\u{C089}", - nfd: "\u{1108}\u{1174}\u{11BC}", - nfkc: "\u{C089}", - nfkd: "\u{1108}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{C08A}", - nfc: "\u{C08A}", - nfd: "\u{1108}\u{1174}\u{11BD}", - nfkc: "\u{C08A}", - nfkd: "\u{1108}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{C08B}", - nfc: "\u{C08B}", - nfd: "\u{1108}\u{1174}\u{11BE}", - nfkc: "\u{C08B}", - nfkd: "\u{1108}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{C08C}", - nfc: "\u{C08C}", - nfd: "\u{1108}\u{1174}\u{11BF}", - nfkc: "\u{C08C}", - nfkd: "\u{1108}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{C08D}", - nfc: "\u{C08D}", - nfd: "\u{1108}\u{1174}\u{11C0}", - nfkc: "\u{C08D}", - nfkd: "\u{1108}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{C08E}", - nfc: "\u{C08E}", - nfd: "\u{1108}\u{1174}\u{11C1}", - nfkc: "\u{C08E}", - nfkd: "\u{1108}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{C08F}", - nfc: "\u{C08F}", - nfd: "\u{1108}\u{1174}\u{11C2}", - nfkc: "\u{C08F}", - nfkd: "\u{1108}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{C090}", - nfc: "\u{C090}", - nfd: "\u{1108}\u{1175}", - nfkc: "\u{C090}", - nfkd: "\u{1108}\u{1175}", - }, - NormalizationTest { - source: "\u{C091}", - nfc: "\u{C091}", - nfd: "\u{1108}\u{1175}\u{11A8}", - nfkc: "\u{C091}", - nfkd: "\u{1108}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{C092}", - nfc: "\u{C092}", - nfd: "\u{1108}\u{1175}\u{11A9}", - nfkc: "\u{C092}", - nfkd: "\u{1108}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{C093}", - nfc: "\u{C093}", - nfd: "\u{1108}\u{1175}\u{11AA}", - nfkc: "\u{C093}", - nfkd: "\u{1108}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{C094}", - nfc: "\u{C094}", - nfd: "\u{1108}\u{1175}\u{11AB}", - nfkc: "\u{C094}", - nfkd: "\u{1108}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{C095}", - nfc: "\u{C095}", - nfd: "\u{1108}\u{1175}\u{11AC}", - nfkc: "\u{C095}", - nfkd: "\u{1108}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{C096}", - nfc: "\u{C096}", - nfd: "\u{1108}\u{1175}\u{11AD}", - nfkc: "\u{C096}", - nfkd: "\u{1108}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{C097}", - nfc: "\u{C097}", - nfd: "\u{1108}\u{1175}\u{11AE}", - nfkc: "\u{C097}", - nfkd: "\u{1108}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{C098}", - nfc: "\u{C098}", - nfd: "\u{1108}\u{1175}\u{11AF}", - nfkc: "\u{C098}", - nfkd: "\u{1108}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{C099}", - nfc: "\u{C099}", - nfd: "\u{1108}\u{1175}\u{11B0}", - nfkc: "\u{C099}", - nfkd: "\u{1108}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{C09A}", - nfc: "\u{C09A}", - nfd: "\u{1108}\u{1175}\u{11B1}", - nfkc: "\u{C09A}", - nfkd: "\u{1108}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{C09B}", - nfc: "\u{C09B}", - nfd: "\u{1108}\u{1175}\u{11B2}", - nfkc: "\u{C09B}", - nfkd: "\u{1108}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{C09C}", - nfc: "\u{C09C}", - nfd: "\u{1108}\u{1175}\u{11B3}", - nfkc: "\u{C09C}", - nfkd: "\u{1108}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{C09D}", - nfc: "\u{C09D}", - nfd: "\u{1108}\u{1175}\u{11B4}", - nfkc: "\u{C09D}", - nfkd: "\u{1108}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{C09E}", - nfc: "\u{C09E}", - nfd: "\u{1108}\u{1175}\u{11B5}", - nfkc: "\u{C09E}", - nfkd: "\u{1108}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{C09F}", - nfc: "\u{C09F}", - nfd: "\u{1108}\u{1175}\u{11B6}", - nfkc: "\u{C09F}", - nfkd: "\u{1108}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{C0A0}", - nfc: "\u{C0A0}", - nfd: "\u{1108}\u{1175}\u{11B7}", - nfkc: "\u{C0A0}", - nfkd: "\u{1108}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{C0A1}", - nfc: "\u{C0A1}", - nfd: "\u{1108}\u{1175}\u{11B8}", - nfkc: "\u{C0A1}", - nfkd: "\u{1108}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{C0A2}", - nfc: "\u{C0A2}", - nfd: "\u{1108}\u{1175}\u{11B9}", - nfkc: "\u{C0A2}", - nfkd: "\u{1108}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{C0A3}", - nfc: "\u{C0A3}", - nfd: "\u{1108}\u{1175}\u{11BA}", - nfkc: "\u{C0A3}", - nfkd: "\u{1108}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{C0A4}", - nfc: "\u{C0A4}", - nfd: "\u{1108}\u{1175}\u{11BB}", - nfkc: "\u{C0A4}", - nfkd: "\u{1108}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{C0A5}", - nfc: "\u{C0A5}", - nfd: "\u{1108}\u{1175}\u{11BC}", - nfkc: "\u{C0A5}", - nfkd: "\u{1108}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{C0A6}", - nfc: "\u{C0A6}", - nfd: "\u{1108}\u{1175}\u{11BD}", - nfkc: "\u{C0A6}", - nfkd: "\u{1108}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{C0A7}", - nfc: "\u{C0A7}", - nfd: "\u{1108}\u{1175}\u{11BE}", - nfkc: "\u{C0A7}", - nfkd: "\u{1108}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{C0A8}", - nfc: "\u{C0A8}", - nfd: "\u{1108}\u{1175}\u{11BF}", - nfkc: "\u{C0A8}", - nfkd: "\u{1108}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{C0A9}", - nfc: "\u{C0A9}", - nfd: "\u{1108}\u{1175}\u{11C0}", - nfkc: "\u{C0A9}", - nfkd: "\u{1108}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{C0AA}", - nfc: "\u{C0AA}", - nfd: "\u{1108}\u{1175}\u{11C1}", - nfkc: "\u{C0AA}", - nfkd: "\u{1108}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{C0AB}", - nfc: "\u{C0AB}", - nfd: "\u{1108}\u{1175}\u{11C2}", - nfkc: "\u{C0AB}", - nfkd: "\u{1108}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{C0AC}", - nfc: "\u{C0AC}", - nfd: "\u{1109}\u{1161}", - nfkc: "\u{C0AC}", - nfkd: "\u{1109}\u{1161}", - }, - NormalizationTest { - source: "\u{C0AD}", - nfc: "\u{C0AD}", - nfd: "\u{1109}\u{1161}\u{11A8}", - nfkc: "\u{C0AD}", - nfkd: "\u{1109}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{C0AE}", - nfc: "\u{C0AE}", - nfd: "\u{1109}\u{1161}\u{11A9}", - nfkc: "\u{C0AE}", - nfkd: "\u{1109}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{C0AF}", - nfc: "\u{C0AF}", - nfd: "\u{1109}\u{1161}\u{11AA}", - nfkc: "\u{C0AF}", - nfkd: "\u{1109}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{C0B0}", - nfc: "\u{C0B0}", - nfd: "\u{1109}\u{1161}\u{11AB}", - nfkc: "\u{C0B0}", - nfkd: "\u{1109}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{C0B1}", - nfc: "\u{C0B1}", - nfd: "\u{1109}\u{1161}\u{11AC}", - nfkc: "\u{C0B1}", - nfkd: "\u{1109}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{C0B2}", - nfc: "\u{C0B2}", - nfd: "\u{1109}\u{1161}\u{11AD}", - nfkc: "\u{C0B2}", - nfkd: "\u{1109}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{C0B3}", - nfc: "\u{C0B3}", - nfd: "\u{1109}\u{1161}\u{11AE}", - nfkc: "\u{C0B3}", - nfkd: "\u{1109}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{C0B4}", - nfc: "\u{C0B4}", - nfd: "\u{1109}\u{1161}\u{11AF}", - nfkc: "\u{C0B4}", - nfkd: "\u{1109}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{C0B5}", - nfc: "\u{C0B5}", - nfd: "\u{1109}\u{1161}\u{11B0}", - nfkc: "\u{C0B5}", - nfkd: "\u{1109}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{C0B6}", - nfc: "\u{C0B6}", - nfd: "\u{1109}\u{1161}\u{11B1}", - nfkc: "\u{C0B6}", - nfkd: "\u{1109}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{C0B7}", - nfc: "\u{C0B7}", - nfd: "\u{1109}\u{1161}\u{11B2}", - nfkc: "\u{C0B7}", - nfkd: "\u{1109}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{C0B8}", - nfc: "\u{C0B8}", - nfd: "\u{1109}\u{1161}\u{11B3}", - nfkc: "\u{C0B8}", - nfkd: "\u{1109}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{C0B9}", - nfc: "\u{C0B9}", - nfd: "\u{1109}\u{1161}\u{11B4}", - nfkc: "\u{C0B9}", - nfkd: "\u{1109}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{C0BA}", - nfc: "\u{C0BA}", - nfd: "\u{1109}\u{1161}\u{11B5}", - nfkc: "\u{C0BA}", - nfkd: "\u{1109}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{C0BB}", - nfc: "\u{C0BB}", - nfd: "\u{1109}\u{1161}\u{11B6}", - nfkc: "\u{C0BB}", - nfkd: "\u{1109}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{C0BC}", - nfc: "\u{C0BC}", - nfd: "\u{1109}\u{1161}\u{11B7}", - nfkc: "\u{C0BC}", - nfkd: "\u{1109}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{C0BD}", - nfc: "\u{C0BD}", - nfd: "\u{1109}\u{1161}\u{11B8}", - nfkc: "\u{C0BD}", - nfkd: "\u{1109}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{C0BE}", - nfc: "\u{C0BE}", - nfd: "\u{1109}\u{1161}\u{11B9}", - nfkc: "\u{C0BE}", - nfkd: "\u{1109}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{C0BF}", - nfc: "\u{C0BF}", - nfd: "\u{1109}\u{1161}\u{11BA}", - nfkc: "\u{C0BF}", - nfkd: "\u{1109}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{C0C0}", - nfc: "\u{C0C0}", - nfd: "\u{1109}\u{1161}\u{11BB}", - nfkc: "\u{C0C0}", - nfkd: "\u{1109}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{C0C1}", - nfc: "\u{C0C1}", - nfd: "\u{1109}\u{1161}\u{11BC}", - nfkc: "\u{C0C1}", - nfkd: "\u{1109}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{C0C2}", - nfc: "\u{C0C2}", - nfd: "\u{1109}\u{1161}\u{11BD}", - nfkc: "\u{C0C2}", - nfkd: "\u{1109}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{C0C3}", - nfc: "\u{C0C3}", - nfd: "\u{1109}\u{1161}\u{11BE}", - nfkc: "\u{C0C3}", - nfkd: "\u{1109}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{C0C4}", - nfc: "\u{C0C4}", - nfd: "\u{1109}\u{1161}\u{11BF}", - nfkc: "\u{C0C4}", - nfkd: "\u{1109}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{C0C5}", - nfc: "\u{C0C5}", - nfd: "\u{1109}\u{1161}\u{11C0}", - nfkc: "\u{C0C5}", - nfkd: "\u{1109}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{C0C6}", - nfc: "\u{C0C6}", - nfd: "\u{1109}\u{1161}\u{11C1}", - nfkc: "\u{C0C6}", - nfkd: "\u{1109}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{C0C7}", - nfc: "\u{C0C7}", - nfd: "\u{1109}\u{1161}\u{11C2}", - nfkc: "\u{C0C7}", - nfkd: "\u{1109}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{C0C8}", - nfc: "\u{C0C8}", - nfd: "\u{1109}\u{1162}", - nfkc: "\u{C0C8}", - nfkd: "\u{1109}\u{1162}", - }, - NormalizationTest { - source: "\u{C0C9}", - nfc: "\u{C0C9}", - nfd: "\u{1109}\u{1162}\u{11A8}", - nfkc: "\u{C0C9}", - nfkd: "\u{1109}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{C0CA}", - nfc: "\u{C0CA}", - nfd: "\u{1109}\u{1162}\u{11A9}", - nfkc: "\u{C0CA}", - nfkd: "\u{1109}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{C0CB}", - nfc: "\u{C0CB}", - nfd: "\u{1109}\u{1162}\u{11AA}", - nfkc: "\u{C0CB}", - nfkd: "\u{1109}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{C0CC}", - nfc: "\u{C0CC}", - nfd: "\u{1109}\u{1162}\u{11AB}", - nfkc: "\u{C0CC}", - nfkd: "\u{1109}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{C0CD}", - nfc: "\u{C0CD}", - nfd: "\u{1109}\u{1162}\u{11AC}", - nfkc: "\u{C0CD}", - nfkd: "\u{1109}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{C0CE}", - nfc: "\u{C0CE}", - nfd: "\u{1109}\u{1162}\u{11AD}", - nfkc: "\u{C0CE}", - nfkd: "\u{1109}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{C0CF}", - nfc: "\u{C0CF}", - nfd: "\u{1109}\u{1162}\u{11AE}", - nfkc: "\u{C0CF}", - nfkd: "\u{1109}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{C0D0}", - nfc: "\u{C0D0}", - nfd: "\u{1109}\u{1162}\u{11AF}", - nfkc: "\u{C0D0}", - nfkd: "\u{1109}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{C0D1}", - nfc: "\u{C0D1}", - nfd: "\u{1109}\u{1162}\u{11B0}", - nfkc: "\u{C0D1}", - nfkd: "\u{1109}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{C0D2}", - nfc: "\u{C0D2}", - nfd: "\u{1109}\u{1162}\u{11B1}", - nfkc: "\u{C0D2}", - nfkd: "\u{1109}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{C0D3}", - nfc: "\u{C0D3}", - nfd: "\u{1109}\u{1162}\u{11B2}", - nfkc: "\u{C0D3}", - nfkd: "\u{1109}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{C0D4}", - nfc: "\u{C0D4}", - nfd: "\u{1109}\u{1162}\u{11B3}", - nfkc: "\u{C0D4}", - nfkd: "\u{1109}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{C0D5}", - nfc: "\u{C0D5}", - nfd: "\u{1109}\u{1162}\u{11B4}", - nfkc: "\u{C0D5}", - nfkd: "\u{1109}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{C0D6}", - nfc: "\u{C0D6}", - nfd: "\u{1109}\u{1162}\u{11B5}", - nfkc: "\u{C0D6}", - nfkd: "\u{1109}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{C0D7}", - nfc: "\u{C0D7}", - nfd: "\u{1109}\u{1162}\u{11B6}", - nfkc: "\u{C0D7}", - nfkd: "\u{1109}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{C0D8}", - nfc: "\u{C0D8}", - nfd: "\u{1109}\u{1162}\u{11B7}", - nfkc: "\u{C0D8}", - nfkd: "\u{1109}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{C0D9}", - nfc: "\u{C0D9}", - nfd: "\u{1109}\u{1162}\u{11B8}", - nfkc: "\u{C0D9}", - nfkd: "\u{1109}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{C0DA}", - nfc: "\u{C0DA}", - nfd: "\u{1109}\u{1162}\u{11B9}", - nfkc: "\u{C0DA}", - nfkd: "\u{1109}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{C0DB}", - nfc: "\u{C0DB}", - nfd: "\u{1109}\u{1162}\u{11BA}", - nfkc: "\u{C0DB}", - nfkd: "\u{1109}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{C0DC}", - nfc: "\u{C0DC}", - nfd: "\u{1109}\u{1162}\u{11BB}", - nfkc: "\u{C0DC}", - nfkd: "\u{1109}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{C0DD}", - nfc: "\u{C0DD}", - nfd: "\u{1109}\u{1162}\u{11BC}", - nfkc: "\u{C0DD}", - nfkd: "\u{1109}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{C0DE}", - nfc: "\u{C0DE}", - nfd: "\u{1109}\u{1162}\u{11BD}", - nfkc: "\u{C0DE}", - nfkd: "\u{1109}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{C0DF}", - nfc: "\u{C0DF}", - nfd: "\u{1109}\u{1162}\u{11BE}", - nfkc: "\u{C0DF}", - nfkd: "\u{1109}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{C0E0}", - nfc: "\u{C0E0}", - nfd: "\u{1109}\u{1162}\u{11BF}", - nfkc: "\u{C0E0}", - nfkd: "\u{1109}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{C0E1}", - nfc: "\u{C0E1}", - nfd: "\u{1109}\u{1162}\u{11C0}", - nfkc: "\u{C0E1}", - nfkd: "\u{1109}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{C0E2}", - nfc: "\u{C0E2}", - nfd: "\u{1109}\u{1162}\u{11C1}", - nfkc: "\u{C0E2}", - nfkd: "\u{1109}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{C0E3}", - nfc: "\u{C0E3}", - nfd: "\u{1109}\u{1162}\u{11C2}", - nfkc: "\u{C0E3}", - nfkd: "\u{1109}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{C0E4}", - nfc: "\u{C0E4}", - nfd: "\u{1109}\u{1163}", - nfkc: "\u{C0E4}", - nfkd: "\u{1109}\u{1163}", - }, - NormalizationTest { - source: "\u{C0E5}", - nfc: "\u{C0E5}", - nfd: "\u{1109}\u{1163}\u{11A8}", - nfkc: "\u{C0E5}", - nfkd: "\u{1109}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{C0E6}", - nfc: "\u{C0E6}", - nfd: "\u{1109}\u{1163}\u{11A9}", - nfkc: "\u{C0E6}", - nfkd: "\u{1109}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{C0E7}", - nfc: "\u{C0E7}", - nfd: "\u{1109}\u{1163}\u{11AA}", - nfkc: "\u{C0E7}", - nfkd: "\u{1109}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{C0E8}", - nfc: "\u{C0E8}", - nfd: "\u{1109}\u{1163}\u{11AB}", - nfkc: "\u{C0E8}", - nfkd: "\u{1109}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{C0E9}", - nfc: "\u{C0E9}", - nfd: "\u{1109}\u{1163}\u{11AC}", - nfkc: "\u{C0E9}", - nfkd: "\u{1109}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{C0EA}", - nfc: "\u{C0EA}", - nfd: "\u{1109}\u{1163}\u{11AD}", - nfkc: "\u{C0EA}", - nfkd: "\u{1109}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{C0EB}", - nfc: "\u{C0EB}", - nfd: "\u{1109}\u{1163}\u{11AE}", - nfkc: "\u{C0EB}", - nfkd: "\u{1109}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{C0EC}", - nfc: "\u{C0EC}", - nfd: "\u{1109}\u{1163}\u{11AF}", - nfkc: "\u{C0EC}", - nfkd: "\u{1109}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{C0ED}", - nfc: "\u{C0ED}", - nfd: "\u{1109}\u{1163}\u{11B0}", - nfkc: "\u{C0ED}", - nfkd: "\u{1109}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{C0EE}", - nfc: "\u{C0EE}", - nfd: "\u{1109}\u{1163}\u{11B1}", - nfkc: "\u{C0EE}", - nfkd: "\u{1109}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{C0EF}", - nfc: "\u{C0EF}", - nfd: "\u{1109}\u{1163}\u{11B2}", - nfkc: "\u{C0EF}", - nfkd: "\u{1109}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{C0F0}", - nfc: "\u{C0F0}", - nfd: "\u{1109}\u{1163}\u{11B3}", - nfkc: "\u{C0F0}", - nfkd: "\u{1109}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{C0F1}", - nfc: "\u{C0F1}", - nfd: "\u{1109}\u{1163}\u{11B4}", - nfkc: "\u{C0F1}", - nfkd: "\u{1109}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{C0F2}", - nfc: "\u{C0F2}", - nfd: "\u{1109}\u{1163}\u{11B5}", - nfkc: "\u{C0F2}", - nfkd: "\u{1109}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{C0F3}", - nfc: "\u{C0F3}", - nfd: "\u{1109}\u{1163}\u{11B6}", - nfkc: "\u{C0F3}", - nfkd: "\u{1109}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{C0F4}", - nfc: "\u{C0F4}", - nfd: "\u{1109}\u{1163}\u{11B7}", - nfkc: "\u{C0F4}", - nfkd: "\u{1109}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{C0F5}", - nfc: "\u{C0F5}", - nfd: "\u{1109}\u{1163}\u{11B8}", - nfkc: "\u{C0F5}", - nfkd: "\u{1109}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{C0F6}", - nfc: "\u{C0F6}", - nfd: "\u{1109}\u{1163}\u{11B9}", - nfkc: "\u{C0F6}", - nfkd: "\u{1109}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{C0F7}", - nfc: "\u{C0F7}", - nfd: "\u{1109}\u{1163}\u{11BA}", - nfkc: "\u{C0F7}", - nfkd: "\u{1109}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{C0F8}", - nfc: "\u{C0F8}", - nfd: "\u{1109}\u{1163}\u{11BB}", - nfkc: "\u{C0F8}", - nfkd: "\u{1109}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{C0F9}", - nfc: "\u{C0F9}", - nfd: "\u{1109}\u{1163}\u{11BC}", - nfkc: "\u{C0F9}", - nfkd: "\u{1109}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{C0FA}", - nfc: "\u{C0FA}", - nfd: "\u{1109}\u{1163}\u{11BD}", - nfkc: "\u{C0FA}", - nfkd: "\u{1109}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{C0FB}", - nfc: "\u{C0FB}", - nfd: "\u{1109}\u{1163}\u{11BE}", - nfkc: "\u{C0FB}", - nfkd: "\u{1109}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{C0FC}", - nfc: "\u{C0FC}", - nfd: "\u{1109}\u{1163}\u{11BF}", - nfkc: "\u{C0FC}", - nfkd: "\u{1109}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{C0FD}", - nfc: "\u{C0FD}", - nfd: "\u{1109}\u{1163}\u{11C0}", - nfkc: "\u{C0FD}", - nfkd: "\u{1109}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{C0FE}", - nfc: "\u{C0FE}", - nfd: "\u{1109}\u{1163}\u{11C1}", - nfkc: "\u{C0FE}", - nfkd: "\u{1109}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{C0FF}", - nfc: "\u{C0FF}", - nfd: "\u{1109}\u{1163}\u{11C2}", - nfkc: "\u{C0FF}", - nfkd: "\u{1109}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{C100}", - nfc: "\u{C100}", - nfd: "\u{1109}\u{1164}", - nfkc: "\u{C100}", - nfkd: "\u{1109}\u{1164}", - }, - NormalizationTest { - source: "\u{C101}", - nfc: "\u{C101}", - nfd: "\u{1109}\u{1164}\u{11A8}", - nfkc: "\u{C101}", - nfkd: "\u{1109}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{C102}", - nfc: "\u{C102}", - nfd: "\u{1109}\u{1164}\u{11A9}", - nfkc: "\u{C102}", - nfkd: "\u{1109}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{C103}", - nfc: "\u{C103}", - nfd: "\u{1109}\u{1164}\u{11AA}", - nfkc: "\u{C103}", - nfkd: "\u{1109}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{C104}", - nfc: "\u{C104}", - nfd: "\u{1109}\u{1164}\u{11AB}", - nfkc: "\u{C104}", - nfkd: "\u{1109}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{C105}", - nfc: "\u{C105}", - nfd: "\u{1109}\u{1164}\u{11AC}", - nfkc: "\u{C105}", - nfkd: "\u{1109}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{C106}", - nfc: "\u{C106}", - nfd: "\u{1109}\u{1164}\u{11AD}", - nfkc: "\u{C106}", - nfkd: "\u{1109}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{C107}", - nfc: "\u{C107}", - nfd: "\u{1109}\u{1164}\u{11AE}", - nfkc: "\u{C107}", - nfkd: "\u{1109}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{C108}", - nfc: "\u{C108}", - nfd: "\u{1109}\u{1164}\u{11AF}", - nfkc: "\u{C108}", - nfkd: "\u{1109}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{C109}", - nfc: "\u{C109}", - nfd: "\u{1109}\u{1164}\u{11B0}", - nfkc: "\u{C109}", - nfkd: "\u{1109}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{C10A}", - nfc: "\u{C10A}", - nfd: "\u{1109}\u{1164}\u{11B1}", - nfkc: "\u{C10A}", - nfkd: "\u{1109}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{C10B}", - nfc: "\u{C10B}", - nfd: "\u{1109}\u{1164}\u{11B2}", - nfkc: "\u{C10B}", - nfkd: "\u{1109}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{C10C}", - nfc: "\u{C10C}", - nfd: "\u{1109}\u{1164}\u{11B3}", - nfkc: "\u{C10C}", - nfkd: "\u{1109}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{C10D}", - nfc: "\u{C10D}", - nfd: "\u{1109}\u{1164}\u{11B4}", - nfkc: "\u{C10D}", - nfkd: "\u{1109}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{C10E}", - nfc: "\u{C10E}", - nfd: "\u{1109}\u{1164}\u{11B5}", - nfkc: "\u{C10E}", - nfkd: "\u{1109}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{C10F}", - nfc: "\u{C10F}", - nfd: "\u{1109}\u{1164}\u{11B6}", - nfkc: "\u{C10F}", - nfkd: "\u{1109}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{C110}", - nfc: "\u{C110}", - nfd: "\u{1109}\u{1164}\u{11B7}", - nfkc: "\u{C110}", - nfkd: "\u{1109}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{C111}", - nfc: "\u{C111}", - nfd: "\u{1109}\u{1164}\u{11B8}", - nfkc: "\u{C111}", - nfkd: "\u{1109}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{C112}", - nfc: "\u{C112}", - nfd: "\u{1109}\u{1164}\u{11B9}", - nfkc: "\u{C112}", - nfkd: "\u{1109}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{C113}", - nfc: "\u{C113}", - nfd: "\u{1109}\u{1164}\u{11BA}", - nfkc: "\u{C113}", - nfkd: "\u{1109}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{C114}", - nfc: "\u{C114}", - nfd: "\u{1109}\u{1164}\u{11BB}", - nfkc: "\u{C114}", - nfkd: "\u{1109}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{C115}", - nfc: "\u{C115}", - nfd: "\u{1109}\u{1164}\u{11BC}", - nfkc: "\u{C115}", - nfkd: "\u{1109}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{C116}", - nfc: "\u{C116}", - nfd: "\u{1109}\u{1164}\u{11BD}", - nfkc: "\u{C116}", - nfkd: "\u{1109}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{C117}", - nfc: "\u{C117}", - nfd: "\u{1109}\u{1164}\u{11BE}", - nfkc: "\u{C117}", - nfkd: "\u{1109}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{C118}", - nfc: "\u{C118}", - nfd: "\u{1109}\u{1164}\u{11BF}", - nfkc: "\u{C118}", - nfkd: "\u{1109}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{C119}", - nfc: "\u{C119}", - nfd: "\u{1109}\u{1164}\u{11C0}", - nfkc: "\u{C119}", - nfkd: "\u{1109}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{C11A}", - nfc: "\u{C11A}", - nfd: "\u{1109}\u{1164}\u{11C1}", - nfkc: "\u{C11A}", - nfkd: "\u{1109}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{C11B}", - nfc: "\u{C11B}", - nfd: "\u{1109}\u{1164}\u{11C2}", - nfkc: "\u{C11B}", - nfkd: "\u{1109}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{C11C}", - nfc: "\u{C11C}", - nfd: "\u{1109}\u{1165}", - nfkc: "\u{C11C}", - nfkd: "\u{1109}\u{1165}", - }, - NormalizationTest { - source: "\u{C11D}", - nfc: "\u{C11D}", - nfd: "\u{1109}\u{1165}\u{11A8}", - nfkc: "\u{C11D}", - nfkd: "\u{1109}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{C11E}", - nfc: "\u{C11E}", - nfd: "\u{1109}\u{1165}\u{11A9}", - nfkc: "\u{C11E}", - nfkd: "\u{1109}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{C11F}", - nfc: "\u{C11F}", - nfd: "\u{1109}\u{1165}\u{11AA}", - nfkc: "\u{C11F}", - nfkd: "\u{1109}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{C120}", - nfc: "\u{C120}", - nfd: "\u{1109}\u{1165}\u{11AB}", - nfkc: "\u{C120}", - nfkd: "\u{1109}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{C121}", - nfc: "\u{C121}", - nfd: "\u{1109}\u{1165}\u{11AC}", - nfkc: "\u{C121}", - nfkd: "\u{1109}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{C122}", - nfc: "\u{C122}", - nfd: "\u{1109}\u{1165}\u{11AD}", - nfkc: "\u{C122}", - nfkd: "\u{1109}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{C123}", - nfc: "\u{C123}", - nfd: "\u{1109}\u{1165}\u{11AE}", - nfkc: "\u{C123}", - nfkd: "\u{1109}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{C124}", - nfc: "\u{C124}", - nfd: "\u{1109}\u{1165}\u{11AF}", - nfkc: "\u{C124}", - nfkd: "\u{1109}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{C125}", - nfc: "\u{C125}", - nfd: "\u{1109}\u{1165}\u{11B0}", - nfkc: "\u{C125}", - nfkd: "\u{1109}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{C126}", - nfc: "\u{C126}", - nfd: "\u{1109}\u{1165}\u{11B1}", - nfkc: "\u{C126}", - nfkd: "\u{1109}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{C127}", - nfc: "\u{C127}", - nfd: "\u{1109}\u{1165}\u{11B2}", - nfkc: "\u{C127}", - nfkd: "\u{1109}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{C128}", - nfc: "\u{C128}", - nfd: "\u{1109}\u{1165}\u{11B3}", - nfkc: "\u{C128}", - nfkd: "\u{1109}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{C129}", - nfc: "\u{C129}", - nfd: "\u{1109}\u{1165}\u{11B4}", - nfkc: "\u{C129}", - nfkd: "\u{1109}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{C12A}", - nfc: "\u{C12A}", - nfd: "\u{1109}\u{1165}\u{11B5}", - nfkc: "\u{C12A}", - nfkd: "\u{1109}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{C12B}", - nfc: "\u{C12B}", - nfd: "\u{1109}\u{1165}\u{11B6}", - nfkc: "\u{C12B}", - nfkd: "\u{1109}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{C12C}", - nfc: "\u{C12C}", - nfd: "\u{1109}\u{1165}\u{11B7}", - nfkc: "\u{C12C}", - nfkd: "\u{1109}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{C12D}", - nfc: "\u{C12D}", - nfd: "\u{1109}\u{1165}\u{11B8}", - nfkc: "\u{C12D}", - nfkd: "\u{1109}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{C12E}", - nfc: "\u{C12E}", - nfd: "\u{1109}\u{1165}\u{11B9}", - nfkc: "\u{C12E}", - nfkd: "\u{1109}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{C12F}", - nfc: "\u{C12F}", - nfd: "\u{1109}\u{1165}\u{11BA}", - nfkc: "\u{C12F}", - nfkd: "\u{1109}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{C130}", - nfc: "\u{C130}", - nfd: "\u{1109}\u{1165}\u{11BB}", - nfkc: "\u{C130}", - nfkd: "\u{1109}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{C131}", - nfc: "\u{C131}", - nfd: "\u{1109}\u{1165}\u{11BC}", - nfkc: "\u{C131}", - nfkd: "\u{1109}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{C132}", - nfc: "\u{C132}", - nfd: "\u{1109}\u{1165}\u{11BD}", - nfkc: "\u{C132}", - nfkd: "\u{1109}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{C133}", - nfc: "\u{C133}", - nfd: "\u{1109}\u{1165}\u{11BE}", - nfkc: "\u{C133}", - nfkd: "\u{1109}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{C134}", - nfc: "\u{C134}", - nfd: "\u{1109}\u{1165}\u{11BF}", - nfkc: "\u{C134}", - nfkd: "\u{1109}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{C135}", - nfc: "\u{C135}", - nfd: "\u{1109}\u{1165}\u{11C0}", - nfkc: "\u{C135}", - nfkd: "\u{1109}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{C136}", - nfc: "\u{C136}", - nfd: "\u{1109}\u{1165}\u{11C1}", - nfkc: "\u{C136}", - nfkd: "\u{1109}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{C137}", - nfc: "\u{C137}", - nfd: "\u{1109}\u{1165}\u{11C2}", - nfkc: "\u{C137}", - nfkd: "\u{1109}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{C138}", - nfc: "\u{C138}", - nfd: "\u{1109}\u{1166}", - nfkc: "\u{C138}", - nfkd: "\u{1109}\u{1166}", - }, - NormalizationTest { - source: "\u{C139}", - nfc: "\u{C139}", - nfd: "\u{1109}\u{1166}\u{11A8}", - nfkc: "\u{C139}", - nfkd: "\u{1109}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{C13A}", - nfc: "\u{C13A}", - nfd: "\u{1109}\u{1166}\u{11A9}", - nfkc: "\u{C13A}", - nfkd: "\u{1109}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{C13B}", - nfc: "\u{C13B}", - nfd: "\u{1109}\u{1166}\u{11AA}", - nfkc: "\u{C13B}", - nfkd: "\u{1109}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{C13C}", - nfc: "\u{C13C}", - nfd: "\u{1109}\u{1166}\u{11AB}", - nfkc: "\u{C13C}", - nfkd: "\u{1109}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{C13D}", - nfc: "\u{C13D}", - nfd: "\u{1109}\u{1166}\u{11AC}", - nfkc: "\u{C13D}", - nfkd: "\u{1109}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{C13E}", - nfc: "\u{C13E}", - nfd: "\u{1109}\u{1166}\u{11AD}", - nfkc: "\u{C13E}", - nfkd: "\u{1109}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{C13F}", - nfc: "\u{C13F}", - nfd: "\u{1109}\u{1166}\u{11AE}", - nfkc: "\u{C13F}", - nfkd: "\u{1109}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{C140}", - nfc: "\u{C140}", - nfd: "\u{1109}\u{1166}\u{11AF}", - nfkc: "\u{C140}", - nfkd: "\u{1109}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{C141}", - nfc: "\u{C141}", - nfd: "\u{1109}\u{1166}\u{11B0}", - nfkc: "\u{C141}", - nfkd: "\u{1109}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{C142}", - nfc: "\u{C142}", - nfd: "\u{1109}\u{1166}\u{11B1}", - nfkc: "\u{C142}", - nfkd: "\u{1109}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{C143}", - nfc: "\u{C143}", - nfd: "\u{1109}\u{1166}\u{11B2}", - nfkc: "\u{C143}", - nfkd: "\u{1109}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{C144}", - nfc: "\u{C144}", - nfd: "\u{1109}\u{1166}\u{11B3}", - nfkc: "\u{C144}", - nfkd: "\u{1109}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{C145}", - nfc: "\u{C145}", - nfd: "\u{1109}\u{1166}\u{11B4}", - nfkc: "\u{C145}", - nfkd: "\u{1109}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{C146}", - nfc: "\u{C146}", - nfd: "\u{1109}\u{1166}\u{11B5}", - nfkc: "\u{C146}", - nfkd: "\u{1109}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{C147}", - nfc: "\u{C147}", - nfd: "\u{1109}\u{1166}\u{11B6}", - nfkc: "\u{C147}", - nfkd: "\u{1109}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{C148}", - nfc: "\u{C148}", - nfd: "\u{1109}\u{1166}\u{11B7}", - nfkc: "\u{C148}", - nfkd: "\u{1109}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{C149}", - nfc: "\u{C149}", - nfd: "\u{1109}\u{1166}\u{11B8}", - nfkc: "\u{C149}", - nfkd: "\u{1109}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{C14A}", - nfc: "\u{C14A}", - nfd: "\u{1109}\u{1166}\u{11B9}", - nfkc: "\u{C14A}", - nfkd: "\u{1109}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{C14B}", - nfc: "\u{C14B}", - nfd: "\u{1109}\u{1166}\u{11BA}", - nfkc: "\u{C14B}", - nfkd: "\u{1109}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{C14C}", - nfc: "\u{C14C}", - nfd: "\u{1109}\u{1166}\u{11BB}", - nfkc: "\u{C14C}", - nfkd: "\u{1109}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{C14D}", - nfc: "\u{C14D}", - nfd: "\u{1109}\u{1166}\u{11BC}", - nfkc: "\u{C14D}", - nfkd: "\u{1109}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{C14E}", - nfc: "\u{C14E}", - nfd: "\u{1109}\u{1166}\u{11BD}", - nfkc: "\u{C14E}", - nfkd: "\u{1109}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{C14F}", - nfc: "\u{C14F}", - nfd: "\u{1109}\u{1166}\u{11BE}", - nfkc: "\u{C14F}", - nfkd: "\u{1109}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{C150}", - nfc: "\u{C150}", - nfd: "\u{1109}\u{1166}\u{11BF}", - nfkc: "\u{C150}", - nfkd: "\u{1109}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{C151}", - nfc: "\u{C151}", - nfd: "\u{1109}\u{1166}\u{11C0}", - nfkc: "\u{C151}", - nfkd: "\u{1109}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{C152}", - nfc: "\u{C152}", - nfd: "\u{1109}\u{1166}\u{11C1}", - nfkc: "\u{C152}", - nfkd: "\u{1109}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{C153}", - nfc: "\u{C153}", - nfd: "\u{1109}\u{1166}\u{11C2}", - nfkc: "\u{C153}", - nfkd: "\u{1109}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{C154}", - nfc: "\u{C154}", - nfd: "\u{1109}\u{1167}", - nfkc: "\u{C154}", - nfkd: "\u{1109}\u{1167}", - }, - NormalizationTest { - source: "\u{C155}", - nfc: "\u{C155}", - nfd: "\u{1109}\u{1167}\u{11A8}", - nfkc: "\u{C155}", - nfkd: "\u{1109}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{C156}", - nfc: "\u{C156}", - nfd: "\u{1109}\u{1167}\u{11A9}", - nfkc: "\u{C156}", - nfkd: "\u{1109}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{C157}", - nfc: "\u{C157}", - nfd: "\u{1109}\u{1167}\u{11AA}", - nfkc: "\u{C157}", - nfkd: "\u{1109}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{C158}", - nfc: "\u{C158}", - nfd: "\u{1109}\u{1167}\u{11AB}", - nfkc: "\u{C158}", - nfkd: "\u{1109}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{C159}", - nfc: "\u{C159}", - nfd: "\u{1109}\u{1167}\u{11AC}", - nfkc: "\u{C159}", - nfkd: "\u{1109}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{C15A}", - nfc: "\u{C15A}", - nfd: "\u{1109}\u{1167}\u{11AD}", - nfkc: "\u{C15A}", - nfkd: "\u{1109}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{C15B}", - nfc: "\u{C15B}", - nfd: "\u{1109}\u{1167}\u{11AE}", - nfkc: "\u{C15B}", - nfkd: "\u{1109}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{C15C}", - nfc: "\u{C15C}", - nfd: "\u{1109}\u{1167}\u{11AF}", - nfkc: "\u{C15C}", - nfkd: "\u{1109}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{C15D}", - nfc: "\u{C15D}", - nfd: "\u{1109}\u{1167}\u{11B0}", - nfkc: "\u{C15D}", - nfkd: "\u{1109}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{C15E}", - nfc: "\u{C15E}", - nfd: "\u{1109}\u{1167}\u{11B1}", - nfkc: "\u{C15E}", - nfkd: "\u{1109}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{C15F}", - nfc: "\u{C15F}", - nfd: "\u{1109}\u{1167}\u{11B2}", - nfkc: "\u{C15F}", - nfkd: "\u{1109}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{C160}", - nfc: "\u{C160}", - nfd: "\u{1109}\u{1167}\u{11B3}", - nfkc: "\u{C160}", - nfkd: "\u{1109}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{C161}", - nfc: "\u{C161}", - nfd: "\u{1109}\u{1167}\u{11B4}", - nfkc: "\u{C161}", - nfkd: "\u{1109}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{C162}", - nfc: "\u{C162}", - nfd: "\u{1109}\u{1167}\u{11B5}", - nfkc: "\u{C162}", - nfkd: "\u{1109}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{C163}", - nfc: "\u{C163}", - nfd: "\u{1109}\u{1167}\u{11B6}", - nfkc: "\u{C163}", - nfkd: "\u{1109}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{C164}", - nfc: "\u{C164}", - nfd: "\u{1109}\u{1167}\u{11B7}", - nfkc: "\u{C164}", - nfkd: "\u{1109}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{C165}", - nfc: "\u{C165}", - nfd: "\u{1109}\u{1167}\u{11B8}", - nfkc: "\u{C165}", - nfkd: "\u{1109}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{C166}", - nfc: "\u{C166}", - nfd: "\u{1109}\u{1167}\u{11B9}", - nfkc: "\u{C166}", - nfkd: "\u{1109}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{C167}", - nfc: "\u{C167}", - nfd: "\u{1109}\u{1167}\u{11BA}", - nfkc: "\u{C167}", - nfkd: "\u{1109}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{C168}", - nfc: "\u{C168}", - nfd: "\u{1109}\u{1167}\u{11BB}", - nfkc: "\u{C168}", - nfkd: "\u{1109}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{C169}", - nfc: "\u{C169}", - nfd: "\u{1109}\u{1167}\u{11BC}", - nfkc: "\u{C169}", - nfkd: "\u{1109}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{C16A}", - nfc: "\u{C16A}", - nfd: "\u{1109}\u{1167}\u{11BD}", - nfkc: "\u{C16A}", - nfkd: "\u{1109}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{C16B}", - nfc: "\u{C16B}", - nfd: "\u{1109}\u{1167}\u{11BE}", - nfkc: "\u{C16B}", - nfkd: "\u{1109}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{C16C}", - nfc: "\u{C16C}", - nfd: "\u{1109}\u{1167}\u{11BF}", - nfkc: "\u{C16C}", - nfkd: "\u{1109}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{C16D}", - nfc: "\u{C16D}", - nfd: "\u{1109}\u{1167}\u{11C0}", - nfkc: "\u{C16D}", - nfkd: "\u{1109}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{C16E}", - nfc: "\u{C16E}", - nfd: "\u{1109}\u{1167}\u{11C1}", - nfkc: "\u{C16E}", - nfkd: "\u{1109}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{C16F}", - nfc: "\u{C16F}", - nfd: "\u{1109}\u{1167}\u{11C2}", - nfkc: "\u{C16F}", - nfkd: "\u{1109}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{C170}", - nfc: "\u{C170}", - nfd: "\u{1109}\u{1168}", - nfkc: "\u{C170}", - nfkd: "\u{1109}\u{1168}", - }, - NormalizationTest { - source: "\u{C171}", - nfc: "\u{C171}", - nfd: "\u{1109}\u{1168}\u{11A8}", - nfkc: "\u{C171}", - nfkd: "\u{1109}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{C172}", - nfc: "\u{C172}", - nfd: "\u{1109}\u{1168}\u{11A9}", - nfkc: "\u{C172}", - nfkd: "\u{1109}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{C173}", - nfc: "\u{C173}", - nfd: "\u{1109}\u{1168}\u{11AA}", - nfkc: "\u{C173}", - nfkd: "\u{1109}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{C174}", - nfc: "\u{C174}", - nfd: "\u{1109}\u{1168}\u{11AB}", - nfkc: "\u{C174}", - nfkd: "\u{1109}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{C175}", - nfc: "\u{C175}", - nfd: "\u{1109}\u{1168}\u{11AC}", - nfkc: "\u{C175}", - nfkd: "\u{1109}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{C176}", - nfc: "\u{C176}", - nfd: "\u{1109}\u{1168}\u{11AD}", - nfkc: "\u{C176}", - nfkd: "\u{1109}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{C177}", - nfc: "\u{C177}", - nfd: "\u{1109}\u{1168}\u{11AE}", - nfkc: "\u{C177}", - nfkd: "\u{1109}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{C178}", - nfc: "\u{C178}", - nfd: "\u{1109}\u{1168}\u{11AF}", - nfkc: "\u{C178}", - nfkd: "\u{1109}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{C179}", - nfc: "\u{C179}", - nfd: "\u{1109}\u{1168}\u{11B0}", - nfkc: "\u{C179}", - nfkd: "\u{1109}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{C17A}", - nfc: "\u{C17A}", - nfd: "\u{1109}\u{1168}\u{11B1}", - nfkc: "\u{C17A}", - nfkd: "\u{1109}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{C17B}", - nfc: "\u{C17B}", - nfd: "\u{1109}\u{1168}\u{11B2}", - nfkc: "\u{C17B}", - nfkd: "\u{1109}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{C17C}", - nfc: "\u{C17C}", - nfd: "\u{1109}\u{1168}\u{11B3}", - nfkc: "\u{C17C}", - nfkd: "\u{1109}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{C17D}", - nfc: "\u{C17D}", - nfd: "\u{1109}\u{1168}\u{11B4}", - nfkc: "\u{C17D}", - nfkd: "\u{1109}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{C17E}", - nfc: "\u{C17E}", - nfd: "\u{1109}\u{1168}\u{11B5}", - nfkc: "\u{C17E}", - nfkd: "\u{1109}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{C17F}", - nfc: "\u{C17F}", - nfd: "\u{1109}\u{1168}\u{11B6}", - nfkc: "\u{C17F}", - nfkd: "\u{1109}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{C180}", - nfc: "\u{C180}", - nfd: "\u{1109}\u{1168}\u{11B7}", - nfkc: "\u{C180}", - nfkd: "\u{1109}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{C181}", - nfc: "\u{C181}", - nfd: "\u{1109}\u{1168}\u{11B8}", - nfkc: "\u{C181}", - nfkd: "\u{1109}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{C182}", - nfc: "\u{C182}", - nfd: "\u{1109}\u{1168}\u{11B9}", - nfkc: "\u{C182}", - nfkd: "\u{1109}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{C183}", - nfc: "\u{C183}", - nfd: "\u{1109}\u{1168}\u{11BA}", - nfkc: "\u{C183}", - nfkd: "\u{1109}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{C184}", - nfc: "\u{C184}", - nfd: "\u{1109}\u{1168}\u{11BB}", - nfkc: "\u{C184}", - nfkd: "\u{1109}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{C185}", - nfc: "\u{C185}", - nfd: "\u{1109}\u{1168}\u{11BC}", - nfkc: "\u{C185}", - nfkd: "\u{1109}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{C186}", - nfc: "\u{C186}", - nfd: "\u{1109}\u{1168}\u{11BD}", - nfkc: "\u{C186}", - nfkd: "\u{1109}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{C187}", - nfc: "\u{C187}", - nfd: "\u{1109}\u{1168}\u{11BE}", - nfkc: "\u{C187}", - nfkd: "\u{1109}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{C188}", - nfc: "\u{C188}", - nfd: "\u{1109}\u{1168}\u{11BF}", - nfkc: "\u{C188}", - nfkd: "\u{1109}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{C189}", - nfc: "\u{C189}", - nfd: "\u{1109}\u{1168}\u{11C0}", - nfkc: "\u{C189}", - nfkd: "\u{1109}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{C18A}", - nfc: "\u{C18A}", - nfd: "\u{1109}\u{1168}\u{11C1}", - nfkc: "\u{C18A}", - nfkd: "\u{1109}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{C18B}", - nfc: "\u{C18B}", - nfd: "\u{1109}\u{1168}\u{11C2}", - nfkc: "\u{C18B}", - nfkd: "\u{1109}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{C18C}", - nfc: "\u{C18C}", - nfd: "\u{1109}\u{1169}", - nfkc: "\u{C18C}", - nfkd: "\u{1109}\u{1169}", - }, - NormalizationTest { - source: "\u{C18D}", - nfc: "\u{C18D}", - nfd: "\u{1109}\u{1169}\u{11A8}", - nfkc: "\u{C18D}", - nfkd: "\u{1109}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{C18E}", - nfc: "\u{C18E}", - nfd: "\u{1109}\u{1169}\u{11A9}", - nfkc: "\u{C18E}", - nfkd: "\u{1109}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{C18F}", - nfc: "\u{C18F}", - nfd: "\u{1109}\u{1169}\u{11AA}", - nfkc: "\u{C18F}", - nfkd: "\u{1109}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{C190}", - nfc: "\u{C190}", - nfd: "\u{1109}\u{1169}\u{11AB}", - nfkc: "\u{C190}", - nfkd: "\u{1109}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{C191}", - nfc: "\u{C191}", - nfd: "\u{1109}\u{1169}\u{11AC}", - nfkc: "\u{C191}", - nfkd: "\u{1109}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{C192}", - nfc: "\u{C192}", - nfd: "\u{1109}\u{1169}\u{11AD}", - nfkc: "\u{C192}", - nfkd: "\u{1109}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{C193}", - nfc: "\u{C193}", - nfd: "\u{1109}\u{1169}\u{11AE}", - nfkc: "\u{C193}", - nfkd: "\u{1109}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{C194}", - nfc: "\u{C194}", - nfd: "\u{1109}\u{1169}\u{11AF}", - nfkc: "\u{C194}", - nfkd: "\u{1109}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{C195}", - nfc: "\u{C195}", - nfd: "\u{1109}\u{1169}\u{11B0}", - nfkc: "\u{C195}", - nfkd: "\u{1109}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{C196}", - nfc: "\u{C196}", - nfd: "\u{1109}\u{1169}\u{11B1}", - nfkc: "\u{C196}", - nfkd: "\u{1109}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{C197}", - nfc: "\u{C197}", - nfd: "\u{1109}\u{1169}\u{11B2}", - nfkc: "\u{C197}", - nfkd: "\u{1109}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{C198}", - nfc: "\u{C198}", - nfd: "\u{1109}\u{1169}\u{11B3}", - nfkc: "\u{C198}", - nfkd: "\u{1109}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{C199}", - nfc: "\u{C199}", - nfd: "\u{1109}\u{1169}\u{11B4}", - nfkc: "\u{C199}", - nfkd: "\u{1109}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{C19A}", - nfc: "\u{C19A}", - nfd: "\u{1109}\u{1169}\u{11B5}", - nfkc: "\u{C19A}", - nfkd: "\u{1109}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{C19B}", - nfc: "\u{C19B}", - nfd: "\u{1109}\u{1169}\u{11B6}", - nfkc: "\u{C19B}", - nfkd: "\u{1109}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{C19C}", - nfc: "\u{C19C}", - nfd: "\u{1109}\u{1169}\u{11B7}", - nfkc: "\u{C19C}", - nfkd: "\u{1109}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{C19D}", - nfc: "\u{C19D}", - nfd: "\u{1109}\u{1169}\u{11B8}", - nfkc: "\u{C19D}", - nfkd: "\u{1109}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{C19E}", - nfc: "\u{C19E}", - nfd: "\u{1109}\u{1169}\u{11B9}", - nfkc: "\u{C19E}", - nfkd: "\u{1109}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{C19F}", - nfc: "\u{C19F}", - nfd: "\u{1109}\u{1169}\u{11BA}", - nfkc: "\u{C19F}", - nfkd: "\u{1109}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{C1A0}", - nfc: "\u{C1A0}", - nfd: "\u{1109}\u{1169}\u{11BB}", - nfkc: "\u{C1A0}", - nfkd: "\u{1109}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{C1A1}", - nfc: "\u{C1A1}", - nfd: "\u{1109}\u{1169}\u{11BC}", - nfkc: "\u{C1A1}", - nfkd: "\u{1109}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{C1A2}", - nfc: "\u{C1A2}", - nfd: "\u{1109}\u{1169}\u{11BD}", - nfkc: "\u{C1A2}", - nfkd: "\u{1109}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{C1A3}", - nfc: "\u{C1A3}", - nfd: "\u{1109}\u{1169}\u{11BE}", - nfkc: "\u{C1A3}", - nfkd: "\u{1109}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{C1A4}", - nfc: "\u{C1A4}", - nfd: "\u{1109}\u{1169}\u{11BF}", - nfkc: "\u{C1A4}", - nfkd: "\u{1109}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{C1A5}", - nfc: "\u{C1A5}", - nfd: "\u{1109}\u{1169}\u{11C0}", - nfkc: "\u{C1A5}", - nfkd: "\u{1109}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{C1A6}", - nfc: "\u{C1A6}", - nfd: "\u{1109}\u{1169}\u{11C1}", - nfkc: "\u{C1A6}", - nfkd: "\u{1109}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{C1A7}", - nfc: "\u{C1A7}", - nfd: "\u{1109}\u{1169}\u{11C2}", - nfkc: "\u{C1A7}", - nfkd: "\u{1109}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{C1A8}", - nfc: "\u{C1A8}", - nfd: "\u{1109}\u{116A}", - nfkc: "\u{C1A8}", - nfkd: "\u{1109}\u{116A}", - }, - NormalizationTest { - source: "\u{C1A9}", - nfc: "\u{C1A9}", - nfd: "\u{1109}\u{116A}\u{11A8}", - nfkc: "\u{C1A9}", - nfkd: "\u{1109}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{C1AA}", - nfc: "\u{C1AA}", - nfd: "\u{1109}\u{116A}\u{11A9}", - nfkc: "\u{C1AA}", - nfkd: "\u{1109}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{C1AB}", - nfc: "\u{C1AB}", - nfd: "\u{1109}\u{116A}\u{11AA}", - nfkc: "\u{C1AB}", - nfkd: "\u{1109}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{C1AC}", - nfc: "\u{C1AC}", - nfd: "\u{1109}\u{116A}\u{11AB}", - nfkc: "\u{C1AC}", - nfkd: "\u{1109}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{C1AD}", - nfc: "\u{C1AD}", - nfd: "\u{1109}\u{116A}\u{11AC}", - nfkc: "\u{C1AD}", - nfkd: "\u{1109}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{C1AE}", - nfc: "\u{C1AE}", - nfd: "\u{1109}\u{116A}\u{11AD}", - nfkc: "\u{C1AE}", - nfkd: "\u{1109}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{C1AF}", - nfc: "\u{C1AF}", - nfd: "\u{1109}\u{116A}\u{11AE}", - nfkc: "\u{C1AF}", - nfkd: "\u{1109}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{C1B0}", - nfc: "\u{C1B0}", - nfd: "\u{1109}\u{116A}\u{11AF}", - nfkc: "\u{C1B0}", - nfkd: "\u{1109}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{C1B1}", - nfc: "\u{C1B1}", - nfd: "\u{1109}\u{116A}\u{11B0}", - nfkc: "\u{C1B1}", - nfkd: "\u{1109}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{C1B2}", - nfc: "\u{C1B2}", - nfd: "\u{1109}\u{116A}\u{11B1}", - nfkc: "\u{C1B2}", - nfkd: "\u{1109}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{C1B3}", - nfc: "\u{C1B3}", - nfd: "\u{1109}\u{116A}\u{11B2}", - nfkc: "\u{C1B3}", - nfkd: "\u{1109}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{C1B4}", - nfc: "\u{C1B4}", - nfd: "\u{1109}\u{116A}\u{11B3}", - nfkc: "\u{C1B4}", - nfkd: "\u{1109}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{C1B5}", - nfc: "\u{C1B5}", - nfd: "\u{1109}\u{116A}\u{11B4}", - nfkc: "\u{C1B5}", - nfkd: "\u{1109}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{C1B6}", - nfc: "\u{C1B6}", - nfd: "\u{1109}\u{116A}\u{11B5}", - nfkc: "\u{C1B6}", - nfkd: "\u{1109}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{C1B7}", - nfc: "\u{C1B7}", - nfd: "\u{1109}\u{116A}\u{11B6}", - nfkc: "\u{C1B7}", - nfkd: "\u{1109}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{C1B8}", - nfc: "\u{C1B8}", - nfd: "\u{1109}\u{116A}\u{11B7}", - nfkc: "\u{C1B8}", - nfkd: "\u{1109}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{C1B9}", - nfc: "\u{C1B9}", - nfd: "\u{1109}\u{116A}\u{11B8}", - nfkc: "\u{C1B9}", - nfkd: "\u{1109}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{C1BA}", - nfc: "\u{C1BA}", - nfd: "\u{1109}\u{116A}\u{11B9}", - nfkc: "\u{C1BA}", - nfkd: "\u{1109}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{C1BB}", - nfc: "\u{C1BB}", - nfd: "\u{1109}\u{116A}\u{11BA}", - nfkc: "\u{C1BB}", - nfkd: "\u{1109}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{C1BC}", - nfc: "\u{C1BC}", - nfd: "\u{1109}\u{116A}\u{11BB}", - nfkc: "\u{C1BC}", - nfkd: "\u{1109}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{C1BD}", - nfc: "\u{C1BD}", - nfd: "\u{1109}\u{116A}\u{11BC}", - nfkc: "\u{C1BD}", - nfkd: "\u{1109}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{C1BE}", - nfc: "\u{C1BE}", - nfd: "\u{1109}\u{116A}\u{11BD}", - nfkc: "\u{C1BE}", - nfkd: "\u{1109}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{C1BF}", - nfc: "\u{C1BF}", - nfd: "\u{1109}\u{116A}\u{11BE}", - nfkc: "\u{C1BF}", - nfkd: "\u{1109}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{C1C0}", - nfc: "\u{C1C0}", - nfd: "\u{1109}\u{116A}\u{11BF}", - nfkc: "\u{C1C0}", - nfkd: "\u{1109}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{C1C1}", - nfc: "\u{C1C1}", - nfd: "\u{1109}\u{116A}\u{11C0}", - nfkc: "\u{C1C1}", - nfkd: "\u{1109}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{C1C2}", - nfc: "\u{C1C2}", - nfd: "\u{1109}\u{116A}\u{11C1}", - nfkc: "\u{C1C2}", - nfkd: "\u{1109}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{C1C3}", - nfc: "\u{C1C3}", - nfd: "\u{1109}\u{116A}\u{11C2}", - nfkc: "\u{C1C3}", - nfkd: "\u{1109}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{C1C4}", - nfc: "\u{C1C4}", - nfd: "\u{1109}\u{116B}", - nfkc: "\u{C1C4}", - nfkd: "\u{1109}\u{116B}", - }, - NormalizationTest { - source: "\u{C1C5}", - nfc: "\u{C1C5}", - nfd: "\u{1109}\u{116B}\u{11A8}", - nfkc: "\u{C1C5}", - nfkd: "\u{1109}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{C1C6}", - nfc: "\u{C1C6}", - nfd: "\u{1109}\u{116B}\u{11A9}", - nfkc: "\u{C1C6}", - nfkd: "\u{1109}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{C1C7}", - nfc: "\u{C1C7}", - nfd: "\u{1109}\u{116B}\u{11AA}", - nfkc: "\u{C1C7}", - nfkd: "\u{1109}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{C1C8}", - nfc: "\u{C1C8}", - nfd: "\u{1109}\u{116B}\u{11AB}", - nfkc: "\u{C1C8}", - nfkd: "\u{1109}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{C1C9}", - nfc: "\u{C1C9}", - nfd: "\u{1109}\u{116B}\u{11AC}", - nfkc: "\u{C1C9}", - nfkd: "\u{1109}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{C1CA}", - nfc: "\u{C1CA}", - nfd: "\u{1109}\u{116B}\u{11AD}", - nfkc: "\u{C1CA}", - nfkd: "\u{1109}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{C1CB}", - nfc: "\u{C1CB}", - nfd: "\u{1109}\u{116B}\u{11AE}", - nfkc: "\u{C1CB}", - nfkd: "\u{1109}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{C1CC}", - nfc: "\u{C1CC}", - nfd: "\u{1109}\u{116B}\u{11AF}", - nfkc: "\u{C1CC}", - nfkd: "\u{1109}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{C1CD}", - nfc: "\u{C1CD}", - nfd: "\u{1109}\u{116B}\u{11B0}", - nfkc: "\u{C1CD}", - nfkd: "\u{1109}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{C1CE}", - nfc: "\u{C1CE}", - nfd: "\u{1109}\u{116B}\u{11B1}", - nfkc: "\u{C1CE}", - nfkd: "\u{1109}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{C1CF}", - nfc: "\u{C1CF}", - nfd: "\u{1109}\u{116B}\u{11B2}", - nfkc: "\u{C1CF}", - nfkd: "\u{1109}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{C1D0}", - nfc: "\u{C1D0}", - nfd: "\u{1109}\u{116B}\u{11B3}", - nfkc: "\u{C1D0}", - nfkd: "\u{1109}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{C1D1}", - nfc: "\u{C1D1}", - nfd: "\u{1109}\u{116B}\u{11B4}", - nfkc: "\u{C1D1}", - nfkd: "\u{1109}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{C1D2}", - nfc: "\u{C1D2}", - nfd: "\u{1109}\u{116B}\u{11B5}", - nfkc: "\u{C1D2}", - nfkd: "\u{1109}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{C1D3}", - nfc: "\u{C1D3}", - nfd: "\u{1109}\u{116B}\u{11B6}", - nfkc: "\u{C1D3}", - nfkd: "\u{1109}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{C1D4}", - nfc: "\u{C1D4}", - nfd: "\u{1109}\u{116B}\u{11B7}", - nfkc: "\u{C1D4}", - nfkd: "\u{1109}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{C1D5}", - nfc: "\u{C1D5}", - nfd: "\u{1109}\u{116B}\u{11B8}", - nfkc: "\u{C1D5}", - nfkd: "\u{1109}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{C1D6}", - nfc: "\u{C1D6}", - nfd: "\u{1109}\u{116B}\u{11B9}", - nfkc: "\u{C1D6}", - nfkd: "\u{1109}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{C1D7}", - nfc: "\u{C1D7}", - nfd: "\u{1109}\u{116B}\u{11BA}", - nfkc: "\u{C1D7}", - nfkd: "\u{1109}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{C1D8}", - nfc: "\u{C1D8}", - nfd: "\u{1109}\u{116B}\u{11BB}", - nfkc: "\u{C1D8}", - nfkd: "\u{1109}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{C1D9}", - nfc: "\u{C1D9}", - nfd: "\u{1109}\u{116B}\u{11BC}", - nfkc: "\u{C1D9}", - nfkd: "\u{1109}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{C1DA}", - nfc: "\u{C1DA}", - nfd: "\u{1109}\u{116B}\u{11BD}", - nfkc: "\u{C1DA}", - nfkd: "\u{1109}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{C1DB}", - nfc: "\u{C1DB}", - nfd: "\u{1109}\u{116B}\u{11BE}", - nfkc: "\u{C1DB}", - nfkd: "\u{1109}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{C1DC}", - nfc: "\u{C1DC}", - nfd: "\u{1109}\u{116B}\u{11BF}", - nfkc: "\u{C1DC}", - nfkd: "\u{1109}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{C1DD}", - nfc: "\u{C1DD}", - nfd: "\u{1109}\u{116B}\u{11C0}", - nfkc: "\u{C1DD}", - nfkd: "\u{1109}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{C1DE}", - nfc: "\u{C1DE}", - nfd: "\u{1109}\u{116B}\u{11C1}", - nfkc: "\u{C1DE}", - nfkd: "\u{1109}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{C1DF}", - nfc: "\u{C1DF}", - nfd: "\u{1109}\u{116B}\u{11C2}", - nfkc: "\u{C1DF}", - nfkd: "\u{1109}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{C1E0}", - nfc: "\u{C1E0}", - nfd: "\u{1109}\u{116C}", - nfkc: "\u{C1E0}", - nfkd: "\u{1109}\u{116C}", - }, - NormalizationTest { - source: "\u{C1E1}", - nfc: "\u{C1E1}", - nfd: "\u{1109}\u{116C}\u{11A8}", - nfkc: "\u{C1E1}", - nfkd: "\u{1109}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{C1E2}", - nfc: "\u{C1E2}", - nfd: "\u{1109}\u{116C}\u{11A9}", - nfkc: "\u{C1E2}", - nfkd: "\u{1109}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{C1E3}", - nfc: "\u{C1E3}", - nfd: "\u{1109}\u{116C}\u{11AA}", - nfkc: "\u{C1E3}", - nfkd: "\u{1109}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{C1E4}", - nfc: "\u{C1E4}", - nfd: "\u{1109}\u{116C}\u{11AB}", - nfkc: "\u{C1E4}", - nfkd: "\u{1109}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{C1E5}", - nfc: "\u{C1E5}", - nfd: "\u{1109}\u{116C}\u{11AC}", - nfkc: "\u{C1E5}", - nfkd: "\u{1109}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{C1E6}", - nfc: "\u{C1E6}", - nfd: "\u{1109}\u{116C}\u{11AD}", - nfkc: "\u{C1E6}", - nfkd: "\u{1109}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{C1E7}", - nfc: "\u{C1E7}", - nfd: "\u{1109}\u{116C}\u{11AE}", - nfkc: "\u{C1E7}", - nfkd: "\u{1109}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{C1E8}", - nfc: "\u{C1E8}", - nfd: "\u{1109}\u{116C}\u{11AF}", - nfkc: "\u{C1E8}", - nfkd: "\u{1109}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{C1E9}", - nfc: "\u{C1E9}", - nfd: "\u{1109}\u{116C}\u{11B0}", - nfkc: "\u{C1E9}", - nfkd: "\u{1109}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{C1EA}", - nfc: "\u{C1EA}", - nfd: "\u{1109}\u{116C}\u{11B1}", - nfkc: "\u{C1EA}", - nfkd: "\u{1109}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{C1EB}", - nfc: "\u{C1EB}", - nfd: "\u{1109}\u{116C}\u{11B2}", - nfkc: "\u{C1EB}", - nfkd: "\u{1109}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{C1EC}", - nfc: "\u{C1EC}", - nfd: "\u{1109}\u{116C}\u{11B3}", - nfkc: "\u{C1EC}", - nfkd: "\u{1109}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{C1ED}", - nfc: "\u{C1ED}", - nfd: "\u{1109}\u{116C}\u{11B4}", - nfkc: "\u{C1ED}", - nfkd: "\u{1109}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{C1EE}", - nfc: "\u{C1EE}", - nfd: "\u{1109}\u{116C}\u{11B5}", - nfkc: "\u{C1EE}", - nfkd: "\u{1109}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{C1EF}", - nfc: "\u{C1EF}", - nfd: "\u{1109}\u{116C}\u{11B6}", - nfkc: "\u{C1EF}", - nfkd: "\u{1109}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{C1F0}", - nfc: "\u{C1F0}", - nfd: "\u{1109}\u{116C}\u{11B7}", - nfkc: "\u{C1F0}", - nfkd: "\u{1109}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{C1F1}", - nfc: "\u{C1F1}", - nfd: "\u{1109}\u{116C}\u{11B8}", - nfkc: "\u{C1F1}", - nfkd: "\u{1109}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{C1F2}", - nfc: "\u{C1F2}", - nfd: "\u{1109}\u{116C}\u{11B9}", - nfkc: "\u{C1F2}", - nfkd: "\u{1109}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{C1F3}", - nfc: "\u{C1F3}", - nfd: "\u{1109}\u{116C}\u{11BA}", - nfkc: "\u{C1F3}", - nfkd: "\u{1109}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{C1F4}", - nfc: "\u{C1F4}", - nfd: "\u{1109}\u{116C}\u{11BB}", - nfkc: "\u{C1F4}", - nfkd: "\u{1109}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{C1F5}", - nfc: "\u{C1F5}", - nfd: "\u{1109}\u{116C}\u{11BC}", - nfkc: "\u{C1F5}", - nfkd: "\u{1109}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{C1F6}", - nfc: "\u{C1F6}", - nfd: "\u{1109}\u{116C}\u{11BD}", - nfkc: "\u{C1F6}", - nfkd: "\u{1109}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{C1F7}", - nfc: "\u{C1F7}", - nfd: "\u{1109}\u{116C}\u{11BE}", - nfkc: "\u{C1F7}", - nfkd: "\u{1109}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{C1F8}", - nfc: "\u{C1F8}", - nfd: "\u{1109}\u{116C}\u{11BF}", - nfkc: "\u{C1F8}", - nfkd: "\u{1109}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{C1F9}", - nfc: "\u{C1F9}", - nfd: "\u{1109}\u{116C}\u{11C0}", - nfkc: "\u{C1F9}", - nfkd: "\u{1109}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{C1FA}", - nfc: "\u{C1FA}", - nfd: "\u{1109}\u{116C}\u{11C1}", - nfkc: "\u{C1FA}", - nfkd: "\u{1109}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{C1FB}", - nfc: "\u{C1FB}", - nfd: "\u{1109}\u{116C}\u{11C2}", - nfkc: "\u{C1FB}", - nfkd: "\u{1109}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{C1FC}", - nfc: "\u{C1FC}", - nfd: "\u{1109}\u{116D}", - nfkc: "\u{C1FC}", - nfkd: "\u{1109}\u{116D}", - }, - NormalizationTest { - source: "\u{C1FD}", - nfc: "\u{C1FD}", - nfd: "\u{1109}\u{116D}\u{11A8}", - nfkc: "\u{C1FD}", - nfkd: "\u{1109}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{C1FE}", - nfc: "\u{C1FE}", - nfd: "\u{1109}\u{116D}\u{11A9}", - nfkc: "\u{C1FE}", - nfkd: "\u{1109}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{C1FF}", - nfc: "\u{C1FF}", - nfd: "\u{1109}\u{116D}\u{11AA}", - nfkc: "\u{C1FF}", - nfkd: "\u{1109}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{C200}", - nfc: "\u{C200}", - nfd: "\u{1109}\u{116D}\u{11AB}", - nfkc: "\u{C200}", - nfkd: "\u{1109}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{C201}", - nfc: "\u{C201}", - nfd: "\u{1109}\u{116D}\u{11AC}", - nfkc: "\u{C201}", - nfkd: "\u{1109}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{C202}", - nfc: "\u{C202}", - nfd: "\u{1109}\u{116D}\u{11AD}", - nfkc: "\u{C202}", - nfkd: "\u{1109}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{C203}", - nfc: "\u{C203}", - nfd: "\u{1109}\u{116D}\u{11AE}", - nfkc: "\u{C203}", - nfkd: "\u{1109}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{C204}", - nfc: "\u{C204}", - nfd: "\u{1109}\u{116D}\u{11AF}", - nfkc: "\u{C204}", - nfkd: "\u{1109}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{C205}", - nfc: "\u{C205}", - nfd: "\u{1109}\u{116D}\u{11B0}", - nfkc: "\u{C205}", - nfkd: "\u{1109}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{C206}", - nfc: "\u{C206}", - nfd: "\u{1109}\u{116D}\u{11B1}", - nfkc: "\u{C206}", - nfkd: "\u{1109}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{C207}", - nfc: "\u{C207}", - nfd: "\u{1109}\u{116D}\u{11B2}", - nfkc: "\u{C207}", - nfkd: "\u{1109}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{C208}", - nfc: "\u{C208}", - nfd: "\u{1109}\u{116D}\u{11B3}", - nfkc: "\u{C208}", - nfkd: "\u{1109}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{C209}", - nfc: "\u{C209}", - nfd: "\u{1109}\u{116D}\u{11B4}", - nfkc: "\u{C209}", - nfkd: "\u{1109}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{C20A}", - nfc: "\u{C20A}", - nfd: "\u{1109}\u{116D}\u{11B5}", - nfkc: "\u{C20A}", - nfkd: "\u{1109}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{C20B}", - nfc: "\u{C20B}", - nfd: "\u{1109}\u{116D}\u{11B6}", - nfkc: "\u{C20B}", - nfkd: "\u{1109}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{C20C}", - nfc: "\u{C20C}", - nfd: "\u{1109}\u{116D}\u{11B7}", - nfkc: "\u{C20C}", - nfkd: "\u{1109}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{C20D}", - nfc: "\u{C20D}", - nfd: "\u{1109}\u{116D}\u{11B8}", - nfkc: "\u{C20D}", - nfkd: "\u{1109}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{C20E}", - nfc: "\u{C20E}", - nfd: "\u{1109}\u{116D}\u{11B9}", - nfkc: "\u{C20E}", - nfkd: "\u{1109}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{C20F}", - nfc: "\u{C20F}", - nfd: "\u{1109}\u{116D}\u{11BA}", - nfkc: "\u{C20F}", - nfkd: "\u{1109}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{C210}", - nfc: "\u{C210}", - nfd: "\u{1109}\u{116D}\u{11BB}", - nfkc: "\u{C210}", - nfkd: "\u{1109}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{C211}", - nfc: "\u{C211}", - nfd: "\u{1109}\u{116D}\u{11BC}", - nfkc: "\u{C211}", - nfkd: "\u{1109}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{C212}", - nfc: "\u{C212}", - nfd: "\u{1109}\u{116D}\u{11BD}", - nfkc: "\u{C212}", - nfkd: "\u{1109}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{C213}", - nfc: "\u{C213}", - nfd: "\u{1109}\u{116D}\u{11BE}", - nfkc: "\u{C213}", - nfkd: "\u{1109}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{C214}", - nfc: "\u{C214}", - nfd: "\u{1109}\u{116D}\u{11BF}", - nfkc: "\u{C214}", - nfkd: "\u{1109}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{C215}", - nfc: "\u{C215}", - nfd: "\u{1109}\u{116D}\u{11C0}", - nfkc: "\u{C215}", - nfkd: "\u{1109}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{C216}", - nfc: "\u{C216}", - nfd: "\u{1109}\u{116D}\u{11C1}", - nfkc: "\u{C216}", - nfkd: "\u{1109}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{C217}", - nfc: "\u{C217}", - nfd: "\u{1109}\u{116D}\u{11C2}", - nfkc: "\u{C217}", - nfkd: "\u{1109}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{C218}", - nfc: "\u{C218}", - nfd: "\u{1109}\u{116E}", - nfkc: "\u{C218}", - nfkd: "\u{1109}\u{116E}", - }, - NormalizationTest { - source: "\u{C219}", - nfc: "\u{C219}", - nfd: "\u{1109}\u{116E}\u{11A8}", - nfkc: "\u{C219}", - nfkd: "\u{1109}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{C21A}", - nfc: "\u{C21A}", - nfd: "\u{1109}\u{116E}\u{11A9}", - nfkc: "\u{C21A}", - nfkd: "\u{1109}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{C21B}", - nfc: "\u{C21B}", - nfd: "\u{1109}\u{116E}\u{11AA}", - nfkc: "\u{C21B}", - nfkd: "\u{1109}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{C21C}", - nfc: "\u{C21C}", - nfd: "\u{1109}\u{116E}\u{11AB}", - nfkc: "\u{C21C}", - nfkd: "\u{1109}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{C21D}", - nfc: "\u{C21D}", - nfd: "\u{1109}\u{116E}\u{11AC}", - nfkc: "\u{C21D}", - nfkd: "\u{1109}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{C21E}", - nfc: "\u{C21E}", - nfd: "\u{1109}\u{116E}\u{11AD}", - nfkc: "\u{C21E}", - nfkd: "\u{1109}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{C21F}", - nfc: "\u{C21F}", - nfd: "\u{1109}\u{116E}\u{11AE}", - nfkc: "\u{C21F}", - nfkd: "\u{1109}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{C220}", - nfc: "\u{C220}", - nfd: "\u{1109}\u{116E}\u{11AF}", - nfkc: "\u{C220}", - nfkd: "\u{1109}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{C221}", - nfc: "\u{C221}", - nfd: "\u{1109}\u{116E}\u{11B0}", - nfkc: "\u{C221}", - nfkd: "\u{1109}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{C222}", - nfc: "\u{C222}", - nfd: "\u{1109}\u{116E}\u{11B1}", - nfkc: "\u{C222}", - nfkd: "\u{1109}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{C223}", - nfc: "\u{C223}", - nfd: "\u{1109}\u{116E}\u{11B2}", - nfkc: "\u{C223}", - nfkd: "\u{1109}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{C224}", - nfc: "\u{C224}", - nfd: "\u{1109}\u{116E}\u{11B3}", - nfkc: "\u{C224}", - nfkd: "\u{1109}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{C225}", - nfc: "\u{C225}", - nfd: "\u{1109}\u{116E}\u{11B4}", - nfkc: "\u{C225}", - nfkd: "\u{1109}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{C226}", - nfc: "\u{C226}", - nfd: "\u{1109}\u{116E}\u{11B5}", - nfkc: "\u{C226}", - nfkd: "\u{1109}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{C227}", - nfc: "\u{C227}", - nfd: "\u{1109}\u{116E}\u{11B6}", - nfkc: "\u{C227}", - nfkd: "\u{1109}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{C228}", - nfc: "\u{C228}", - nfd: "\u{1109}\u{116E}\u{11B7}", - nfkc: "\u{C228}", - nfkd: "\u{1109}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{C229}", - nfc: "\u{C229}", - nfd: "\u{1109}\u{116E}\u{11B8}", - nfkc: "\u{C229}", - nfkd: "\u{1109}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{C22A}", - nfc: "\u{C22A}", - nfd: "\u{1109}\u{116E}\u{11B9}", - nfkc: "\u{C22A}", - nfkd: "\u{1109}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{C22B}", - nfc: "\u{C22B}", - nfd: "\u{1109}\u{116E}\u{11BA}", - nfkc: "\u{C22B}", - nfkd: "\u{1109}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{C22C}", - nfc: "\u{C22C}", - nfd: "\u{1109}\u{116E}\u{11BB}", - nfkc: "\u{C22C}", - nfkd: "\u{1109}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{C22D}", - nfc: "\u{C22D}", - nfd: "\u{1109}\u{116E}\u{11BC}", - nfkc: "\u{C22D}", - nfkd: "\u{1109}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{C22E}", - nfc: "\u{C22E}", - nfd: "\u{1109}\u{116E}\u{11BD}", - nfkc: "\u{C22E}", - nfkd: "\u{1109}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{C22F}", - nfc: "\u{C22F}", - nfd: "\u{1109}\u{116E}\u{11BE}", - nfkc: "\u{C22F}", - nfkd: "\u{1109}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{C230}", - nfc: "\u{C230}", - nfd: "\u{1109}\u{116E}\u{11BF}", - nfkc: "\u{C230}", - nfkd: "\u{1109}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{C231}", - nfc: "\u{C231}", - nfd: "\u{1109}\u{116E}\u{11C0}", - nfkc: "\u{C231}", - nfkd: "\u{1109}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{C232}", - nfc: "\u{C232}", - nfd: "\u{1109}\u{116E}\u{11C1}", - nfkc: "\u{C232}", - nfkd: "\u{1109}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{C233}", - nfc: "\u{C233}", - nfd: "\u{1109}\u{116E}\u{11C2}", - nfkc: "\u{C233}", - nfkd: "\u{1109}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{C234}", - nfc: "\u{C234}", - nfd: "\u{1109}\u{116F}", - nfkc: "\u{C234}", - nfkd: "\u{1109}\u{116F}", - }, - NormalizationTest { - source: "\u{C235}", - nfc: "\u{C235}", - nfd: "\u{1109}\u{116F}\u{11A8}", - nfkc: "\u{C235}", - nfkd: "\u{1109}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{C236}", - nfc: "\u{C236}", - nfd: "\u{1109}\u{116F}\u{11A9}", - nfkc: "\u{C236}", - nfkd: "\u{1109}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{C237}", - nfc: "\u{C237}", - nfd: "\u{1109}\u{116F}\u{11AA}", - nfkc: "\u{C237}", - nfkd: "\u{1109}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{C238}", - nfc: "\u{C238}", - nfd: "\u{1109}\u{116F}\u{11AB}", - nfkc: "\u{C238}", - nfkd: "\u{1109}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{C239}", - nfc: "\u{C239}", - nfd: "\u{1109}\u{116F}\u{11AC}", - nfkc: "\u{C239}", - nfkd: "\u{1109}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{C23A}", - nfc: "\u{C23A}", - nfd: "\u{1109}\u{116F}\u{11AD}", - nfkc: "\u{C23A}", - nfkd: "\u{1109}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{C23B}", - nfc: "\u{C23B}", - nfd: "\u{1109}\u{116F}\u{11AE}", - nfkc: "\u{C23B}", - nfkd: "\u{1109}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{C23C}", - nfc: "\u{C23C}", - nfd: "\u{1109}\u{116F}\u{11AF}", - nfkc: "\u{C23C}", - nfkd: "\u{1109}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{C23D}", - nfc: "\u{C23D}", - nfd: "\u{1109}\u{116F}\u{11B0}", - nfkc: "\u{C23D}", - nfkd: "\u{1109}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{C23E}", - nfc: "\u{C23E}", - nfd: "\u{1109}\u{116F}\u{11B1}", - nfkc: "\u{C23E}", - nfkd: "\u{1109}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{C23F}", - nfc: "\u{C23F}", - nfd: "\u{1109}\u{116F}\u{11B2}", - nfkc: "\u{C23F}", - nfkd: "\u{1109}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{C240}", - nfc: "\u{C240}", - nfd: "\u{1109}\u{116F}\u{11B3}", - nfkc: "\u{C240}", - nfkd: "\u{1109}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{C241}", - nfc: "\u{C241}", - nfd: "\u{1109}\u{116F}\u{11B4}", - nfkc: "\u{C241}", - nfkd: "\u{1109}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{C242}", - nfc: "\u{C242}", - nfd: "\u{1109}\u{116F}\u{11B5}", - nfkc: "\u{C242}", - nfkd: "\u{1109}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{C243}", - nfc: "\u{C243}", - nfd: "\u{1109}\u{116F}\u{11B6}", - nfkc: "\u{C243}", - nfkd: "\u{1109}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{C244}", - nfc: "\u{C244}", - nfd: "\u{1109}\u{116F}\u{11B7}", - nfkc: "\u{C244}", - nfkd: "\u{1109}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{C245}", - nfc: "\u{C245}", - nfd: "\u{1109}\u{116F}\u{11B8}", - nfkc: "\u{C245}", - nfkd: "\u{1109}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{C246}", - nfc: "\u{C246}", - nfd: "\u{1109}\u{116F}\u{11B9}", - nfkc: "\u{C246}", - nfkd: "\u{1109}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{C247}", - nfc: "\u{C247}", - nfd: "\u{1109}\u{116F}\u{11BA}", - nfkc: "\u{C247}", - nfkd: "\u{1109}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{C248}", - nfc: "\u{C248}", - nfd: "\u{1109}\u{116F}\u{11BB}", - nfkc: "\u{C248}", - nfkd: "\u{1109}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{C249}", - nfc: "\u{C249}", - nfd: "\u{1109}\u{116F}\u{11BC}", - nfkc: "\u{C249}", - nfkd: "\u{1109}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{C24A}", - nfc: "\u{C24A}", - nfd: "\u{1109}\u{116F}\u{11BD}", - nfkc: "\u{C24A}", - nfkd: "\u{1109}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{C24B}", - nfc: "\u{C24B}", - nfd: "\u{1109}\u{116F}\u{11BE}", - nfkc: "\u{C24B}", - nfkd: "\u{1109}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{C24C}", - nfc: "\u{C24C}", - nfd: "\u{1109}\u{116F}\u{11BF}", - nfkc: "\u{C24C}", - nfkd: "\u{1109}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{C24D}", - nfc: "\u{C24D}", - nfd: "\u{1109}\u{116F}\u{11C0}", - nfkc: "\u{C24D}", - nfkd: "\u{1109}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{C24E}", - nfc: "\u{C24E}", - nfd: "\u{1109}\u{116F}\u{11C1}", - nfkc: "\u{C24E}", - nfkd: "\u{1109}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{C24F}", - nfc: "\u{C24F}", - nfd: "\u{1109}\u{116F}\u{11C2}", - nfkc: "\u{C24F}", - nfkd: "\u{1109}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{C250}", - nfc: "\u{C250}", - nfd: "\u{1109}\u{1170}", - nfkc: "\u{C250}", - nfkd: "\u{1109}\u{1170}", - }, - NormalizationTest { - source: "\u{C251}", - nfc: "\u{C251}", - nfd: "\u{1109}\u{1170}\u{11A8}", - nfkc: "\u{C251}", - nfkd: "\u{1109}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{C252}", - nfc: "\u{C252}", - nfd: "\u{1109}\u{1170}\u{11A9}", - nfkc: "\u{C252}", - nfkd: "\u{1109}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{C253}", - nfc: "\u{C253}", - nfd: "\u{1109}\u{1170}\u{11AA}", - nfkc: "\u{C253}", - nfkd: "\u{1109}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{C254}", - nfc: "\u{C254}", - nfd: "\u{1109}\u{1170}\u{11AB}", - nfkc: "\u{C254}", - nfkd: "\u{1109}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{C255}", - nfc: "\u{C255}", - nfd: "\u{1109}\u{1170}\u{11AC}", - nfkc: "\u{C255}", - nfkd: "\u{1109}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{C256}", - nfc: "\u{C256}", - nfd: "\u{1109}\u{1170}\u{11AD}", - nfkc: "\u{C256}", - nfkd: "\u{1109}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{C257}", - nfc: "\u{C257}", - nfd: "\u{1109}\u{1170}\u{11AE}", - nfkc: "\u{C257}", - nfkd: "\u{1109}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{C258}", - nfc: "\u{C258}", - nfd: "\u{1109}\u{1170}\u{11AF}", - nfkc: "\u{C258}", - nfkd: "\u{1109}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{C259}", - nfc: "\u{C259}", - nfd: "\u{1109}\u{1170}\u{11B0}", - nfkc: "\u{C259}", - nfkd: "\u{1109}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{C25A}", - nfc: "\u{C25A}", - nfd: "\u{1109}\u{1170}\u{11B1}", - nfkc: "\u{C25A}", - nfkd: "\u{1109}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{C25B}", - nfc: "\u{C25B}", - nfd: "\u{1109}\u{1170}\u{11B2}", - nfkc: "\u{C25B}", - nfkd: "\u{1109}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{C25C}", - nfc: "\u{C25C}", - nfd: "\u{1109}\u{1170}\u{11B3}", - nfkc: "\u{C25C}", - nfkd: "\u{1109}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{C25D}", - nfc: "\u{C25D}", - nfd: "\u{1109}\u{1170}\u{11B4}", - nfkc: "\u{C25D}", - nfkd: "\u{1109}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{C25E}", - nfc: "\u{C25E}", - nfd: "\u{1109}\u{1170}\u{11B5}", - nfkc: "\u{C25E}", - nfkd: "\u{1109}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{C25F}", - nfc: "\u{C25F}", - nfd: "\u{1109}\u{1170}\u{11B6}", - nfkc: "\u{C25F}", - nfkd: "\u{1109}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{C260}", - nfc: "\u{C260}", - nfd: "\u{1109}\u{1170}\u{11B7}", - nfkc: "\u{C260}", - nfkd: "\u{1109}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{C261}", - nfc: "\u{C261}", - nfd: "\u{1109}\u{1170}\u{11B8}", - nfkc: "\u{C261}", - nfkd: "\u{1109}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{C262}", - nfc: "\u{C262}", - nfd: "\u{1109}\u{1170}\u{11B9}", - nfkc: "\u{C262}", - nfkd: "\u{1109}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{C263}", - nfc: "\u{C263}", - nfd: "\u{1109}\u{1170}\u{11BA}", - nfkc: "\u{C263}", - nfkd: "\u{1109}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{C264}", - nfc: "\u{C264}", - nfd: "\u{1109}\u{1170}\u{11BB}", - nfkc: "\u{C264}", - nfkd: "\u{1109}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{C265}", - nfc: "\u{C265}", - nfd: "\u{1109}\u{1170}\u{11BC}", - nfkc: "\u{C265}", - nfkd: "\u{1109}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{C266}", - nfc: "\u{C266}", - nfd: "\u{1109}\u{1170}\u{11BD}", - nfkc: "\u{C266}", - nfkd: "\u{1109}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{C267}", - nfc: "\u{C267}", - nfd: "\u{1109}\u{1170}\u{11BE}", - nfkc: "\u{C267}", - nfkd: "\u{1109}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{C268}", - nfc: "\u{C268}", - nfd: "\u{1109}\u{1170}\u{11BF}", - nfkc: "\u{C268}", - nfkd: "\u{1109}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{C269}", - nfc: "\u{C269}", - nfd: "\u{1109}\u{1170}\u{11C0}", - nfkc: "\u{C269}", - nfkd: "\u{1109}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{C26A}", - nfc: "\u{C26A}", - nfd: "\u{1109}\u{1170}\u{11C1}", - nfkc: "\u{C26A}", - nfkd: "\u{1109}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{C26B}", - nfc: "\u{C26B}", - nfd: "\u{1109}\u{1170}\u{11C2}", - nfkc: "\u{C26B}", - nfkd: "\u{1109}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{C26C}", - nfc: "\u{C26C}", - nfd: "\u{1109}\u{1171}", - nfkc: "\u{C26C}", - nfkd: "\u{1109}\u{1171}", - }, - NormalizationTest { - source: "\u{C26D}", - nfc: "\u{C26D}", - nfd: "\u{1109}\u{1171}\u{11A8}", - nfkc: "\u{C26D}", - nfkd: "\u{1109}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{C26E}", - nfc: "\u{C26E}", - nfd: "\u{1109}\u{1171}\u{11A9}", - nfkc: "\u{C26E}", - nfkd: "\u{1109}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{C26F}", - nfc: "\u{C26F}", - nfd: "\u{1109}\u{1171}\u{11AA}", - nfkc: "\u{C26F}", - nfkd: "\u{1109}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{C270}", - nfc: "\u{C270}", - nfd: "\u{1109}\u{1171}\u{11AB}", - nfkc: "\u{C270}", - nfkd: "\u{1109}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{C271}", - nfc: "\u{C271}", - nfd: "\u{1109}\u{1171}\u{11AC}", - nfkc: "\u{C271}", - nfkd: "\u{1109}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{C272}", - nfc: "\u{C272}", - nfd: "\u{1109}\u{1171}\u{11AD}", - nfkc: "\u{C272}", - nfkd: "\u{1109}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{C273}", - nfc: "\u{C273}", - nfd: "\u{1109}\u{1171}\u{11AE}", - nfkc: "\u{C273}", - nfkd: "\u{1109}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{C274}", - nfc: "\u{C274}", - nfd: "\u{1109}\u{1171}\u{11AF}", - nfkc: "\u{C274}", - nfkd: "\u{1109}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{C275}", - nfc: "\u{C275}", - nfd: "\u{1109}\u{1171}\u{11B0}", - nfkc: "\u{C275}", - nfkd: "\u{1109}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{C276}", - nfc: "\u{C276}", - nfd: "\u{1109}\u{1171}\u{11B1}", - nfkc: "\u{C276}", - nfkd: "\u{1109}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{C277}", - nfc: "\u{C277}", - nfd: "\u{1109}\u{1171}\u{11B2}", - nfkc: "\u{C277}", - nfkd: "\u{1109}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{C278}", - nfc: "\u{C278}", - nfd: "\u{1109}\u{1171}\u{11B3}", - nfkc: "\u{C278}", - nfkd: "\u{1109}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{C279}", - nfc: "\u{C279}", - nfd: "\u{1109}\u{1171}\u{11B4}", - nfkc: "\u{C279}", - nfkd: "\u{1109}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{C27A}", - nfc: "\u{C27A}", - nfd: "\u{1109}\u{1171}\u{11B5}", - nfkc: "\u{C27A}", - nfkd: "\u{1109}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{C27B}", - nfc: "\u{C27B}", - nfd: "\u{1109}\u{1171}\u{11B6}", - nfkc: "\u{C27B}", - nfkd: "\u{1109}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{C27C}", - nfc: "\u{C27C}", - nfd: "\u{1109}\u{1171}\u{11B7}", - nfkc: "\u{C27C}", - nfkd: "\u{1109}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{C27D}", - nfc: "\u{C27D}", - nfd: "\u{1109}\u{1171}\u{11B8}", - nfkc: "\u{C27D}", - nfkd: "\u{1109}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{C27E}", - nfc: "\u{C27E}", - nfd: "\u{1109}\u{1171}\u{11B9}", - nfkc: "\u{C27E}", - nfkd: "\u{1109}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{C27F}", - nfc: "\u{C27F}", - nfd: "\u{1109}\u{1171}\u{11BA}", - nfkc: "\u{C27F}", - nfkd: "\u{1109}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{C280}", - nfc: "\u{C280}", - nfd: "\u{1109}\u{1171}\u{11BB}", - nfkc: "\u{C280}", - nfkd: "\u{1109}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{C281}", - nfc: "\u{C281}", - nfd: "\u{1109}\u{1171}\u{11BC}", - nfkc: "\u{C281}", - nfkd: "\u{1109}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{C282}", - nfc: "\u{C282}", - nfd: "\u{1109}\u{1171}\u{11BD}", - nfkc: "\u{C282}", - nfkd: "\u{1109}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{C283}", - nfc: "\u{C283}", - nfd: "\u{1109}\u{1171}\u{11BE}", - nfkc: "\u{C283}", - nfkd: "\u{1109}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{C284}", - nfc: "\u{C284}", - nfd: "\u{1109}\u{1171}\u{11BF}", - nfkc: "\u{C284}", - nfkd: "\u{1109}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{C285}", - nfc: "\u{C285}", - nfd: "\u{1109}\u{1171}\u{11C0}", - nfkc: "\u{C285}", - nfkd: "\u{1109}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{C286}", - nfc: "\u{C286}", - nfd: "\u{1109}\u{1171}\u{11C1}", - nfkc: "\u{C286}", - nfkd: "\u{1109}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{C287}", - nfc: "\u{C287}", - nfd: "\u{1109}\u{1171}\u{11C2}", - nfkc: "\u{C287}", - nfkd: "\u{1109}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{C288}", - nfc: "\u{C288}", - nfd: "\u{1109}\u{1172}", - nfkc: "\u{C288}", - nfkd: "\u{1109}\u{1172}", - }, - NormalizationTest { - source: "\u{C289}", - nfc: "\u{C289}", - nfd: "\u{1109}\u{1172}\u{11A8}", - nfkc: "\u{C289}", - nfkd: "\u{1109}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{C28A}", - nfc: "\u{C28A}", - nfd: "\u{1109}\u{1172}\u{11A9}", - nfkc: "\u{C28A}", - nfkd: "\u{1109}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{C28B}", - nfc: "\u{C28B}", - nfd: "\u{1109}\u{1172}\u{11AA}", - nfkc: "\u{C28B}", - nfkd: "\u{1109}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{C28C}", - nfc: "\u{C28C}", - nfd: "\u{1109}\u{1172}\u{11AB}", - nfkc: "\u{C28C}", - nfkd: "\u{1109}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{C28D}", - nfc: "\u{C28D}", - nfd: "\u{1109}\u{1172}\u{11AC}", - nfkc: "\u{C28D}", - nfkd: "\u{1109}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{C28E}", - nfc: "\u{C28E}", - nfd: "\u{1109}\u{1172}\u{11AD}", - nfkc: "\u{C28E}", - nfkd: "\u{1109}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{C28F}", - nfc: "\u{C28F}", - nfd: "\u{1109}\u{1172}\u{11AE}", - nfkc: "\u{C28F}", - nfkd: "\u{1109}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{C290}", - nfc: "\u{C290}", - nfd: "\u{1109}\u{1172}\u{11AF}", - nfkc: "\u{C290}", - nfkd: "\u{1109}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{C291}", - nfc: "\u{C291}", - nfd: "\u{1109}\u{1172}\u{11B0}", - nfkc: "\u{C291}", - nfkd: "\u{1109}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{C292}", - nfc: "\u{C292}", - nfd: "\u{1109}\u{1172}\u{11B1}", - nfkc: "\u{C292}", - nfkd: "\u{1109}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{C293}", - nfc: "\u{C293}", - nfd: "\u{1109}\u{1172}\u{11B2}", - nfkc: "\u{C293}", - nfkd: "\u{1109}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{C294}", - nfc: "\u{C294}", - nfd: "\u{1109}\u{1172}\u{11B3}", - nfkc: "\u{C294}", - nfkd: "\u{1109}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{C295}", - nfc: "\u{C295}", - nfd: "\u{1109}\u{1172}\u{11B4}", - nfkc: "\u{C295}", - nfkd: "\u{1109}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{C296}", - nfc: "\u{C296}", - nfd: "\u{1109}\u{1172}\u{11B5}", - nfkc: "\u{C296}", - nfkd: "\u{1109}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{C297}", - nfc: "\u{C297}", - nfd: "\u{1109}\u{1172}\u{11B6}", - nfkc: "\u{C297}", - nfkd: "\u{1109}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{C298}", - nfc: "\u{C298}", - nfd: "\u{1109}\u{1172}\u{11B7}", - nfkc: "\u{C298}", - nfkd: "\u{1109}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{C299}", - nfc: "\u{C299}", - nfd: "\u{1109}\u{1172}\u{11B8}", - nfkc: "\u{C299}", - nfkd: "\u{1109}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{C29A}", - nfc: "\u{C29A}", - nfd: "\u{1109}\u{1172}\u{11B9}", - nfkc: "\u{C29A}", - nfkd: "\u{1109}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{C29B}", - nfc: "\u{C29B}", - nfd: "\u{1109}\u{1172}\u{11BA}", - nfkc: "\u{C29B}", - nfkd: "\u{1109}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{C29C}", - nfc: "\u{C29C}", - nfd: "\u{1109}\u{1172}\u{11BB}", - nfkc: "\u{C29C}", - nfkd: "\u{1109}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{C29D}", - nfc: "\u{C29D}", - nfd: "\u{1109}\u{1172}\u{11BC}", - nfkc: "\u{C29D}", - nfkd: "\u{1109}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{C29E}", - nfc: "\u{C29E}", - nfd: "\u{1109}\u{1172}\u{11BD}", - nfkc: "\u{C29E}", - nfkd: "\u{1109}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{C29F}", - nfc: "\u{C29F}", - nfd: "\u{1109}\u{1172}\u{11BE}", - nfkc: "\u{C29F}", - nfkd: "\u{1109}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{C2A0}", - nfc: "\u{C2A0}", - nfd: "\u{1109}\u{1172}\u{11BF}", - nfkc: "\u{C2A0}", - nfkd: "\u{1109}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{C2A1}", - nfc: "\u{C2A1}", - nfd: "\u{1109}\u{1172}\u{11C0}", - nfkc: "\u{C2A1}", - nfkd: "\u{1109}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{C2A2}", - nfc: "\u{C2A2}", - nfd: "\u{1109}\u{1172}\u{11C1}", - nfkc: "\u{C2A2}", - nfkd: "\u{1109}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{C2A3}", - nfc: "\u{C2A3}", - nfd: "\u{1109}\u{1172}\u{11C2}", - nfkc: "\u{C2A3}", - nfkd: "\u{1109}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{C2A4}", - nfc: "\u{C2A4}", - nfd: "\u{1109}\u{1173}", - nfkc: "\u{C2A4}", - nfkd: "\u{1109}\u{1173}", - }, - NormalizationTest { - source: "\u{C2A5}", - nfc: "\u{C2A5}", - nfd: "\u{1109}\u{1173}\u{11A8}", - nfkc: "\u{C2A5}", - nfkd: "\u{1109}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{C2A6}", - nfc: "\u{C2A6}", - nfd: "\u{1109}\u{1173}\u{11A9}", - nfkc: "\u{C2A6}", - nfkd: "\u{1109}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{C2A7}", - nfc: "\u{C2A7}", - nfd: "\u{1109}\u{1173}\u{11AA}", - nfkc: "\u{C2A7}", - nfkd: "\u{1109}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{C2A8}", - nfc: "\u{C2A8}", - nfd: "\u{1109}\u{1173}\u{11AB}", - nfkc: "\u{C2A8}", - nfkd: "\u{1109}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{C2A9}", - nfc: "\u{C2A9}", - nfd: "\u{1109}\u{1173}\u{11AC}", - nfkc: "\u{C2A9}", - nfkd: "\u{1109}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{C2AA}", - nfc: "\u{C2AA}", - nfd: "\u{1109}\u{1173}\u{11AD}", - nfkc: "\u{C2AA}", - nfkd: "\u{1109}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{C2AB}", - nfc: "\u{C2AB}", - nfd: "\u{1109}\u{1173}\u{11AE}", - nfkc: "\u{C2AB}", - nfkd: "\u{1109}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{C2AC}", - nfc: "\u{C2AC}", - nfd: "\u{1109}\u{1173}\u{11AF}", - nfkc: "\u{C2AC}", - nfkd: "\u{1109}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{C2AD}", - nfc: "\u{C2AD}", - nfd: "\u{1109}\u{1173}\u{11B0}", - nfkc: "\u{C2AD}", - nfkd: "\u{1109}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{C2AE}", - nfc: "\u{C2AE}", - nfd: "\u{1109}\u{1173}\u{11B1}", - nfkc: "\u{C2AE}", - nfkd: "\u{1109}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{C2AF}", - nfc: "\u{C2AF}", - nfd: "\u{1109}\u{1173}\u{11B2}", - nfkc: "\u{C2AF}", - nfkd: "\u{1109}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{C2B0}", - nfc: "\u{C2B0}", - nfd: "\u{1109}\u{1173}\u{11B3}", - nfkc: "\u{C2B0}", - nfkd: "\u{1109}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{C2B1}", - nfc: "\u{C2B1}", - nfd: "\u{1109}\u{1173}\u{11B4}", - nfkc: "\u{C2B1}", - nfkd: "\u{1109}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{C2B2}", - nfc: "\u{C2B2}", - nfd: "\u{1109}\u{1173}\u{11B5}", - nfkc: "\u{C2B2}", - nfkd: "\u{1109}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{C2B3}", - nfc: "\u{C2B3}", - nfd: "\u{1109}\u{1173}\u{11B6}", - nfkc: "\u{C2B3}", - nfkd: "\u{1109}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{C2B4}", - nfc: "\u{C2B4}", - nfd: "\u{1109}\u{1173}\u{11B7}", - nfkc: "\u{C2B4}", - nfkd: "\u{1109}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{C2B5}", - nfc: "\u{C2B5}", - nfd: "\u{1109}\u{1173}\u{11B8}", - nfkc: "\u{C2B5}", - nfkd: "\u{1109}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{C2B6}", - nfc: "\u{C2B6}", - nfd: "\u{1109}\u{1173}\u{11B9}", - nfkc: "\u{C2B6}", - nfkd: "\u{1109}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{C2B7}", - nfc: "\u{C2B7}", - nfd: "\u{1109}\u{1173}\u{11BA}", - nfkc: "\u{C2B7}", - nfkd: "\u{1109}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{C2B8}", - nfc: "\u{C2B8}", - nfd: "\u{1109}\u{1173}\u{11BB}", - nfkc: "\u{C2B8}", - nfkd: "\u{1109}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{C2B9}", - nfc: "\u{C2B9}", - nfd: "\u{1109}\u{1173}\u{11BC}", - nfkc: "\u{C2B9}", - nfkd: "\u{1109}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{C2BA}", - nfc: "\u{C2BA}", - nfd: "\u{1109}\u{1173}\u{11BD}", - nfkc: "\u{C2BA}", - nfkd: "\u{1109}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{C2BB}", - nfc: "\u{C2BB}", - nfd: "\u{1109}\u{1173}\u{11BE}", - nfkc: "\u{C2BB}", - nfkd: "\u{1109}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{C2BC}", - nfc: "\u{C2BC}", - nfd: "\u{1109}\u{1173}\u{11BF}", - nfkc: "\u{C2BC}", - nfkd: "\u{1109}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{C2BD}", - nfc: "\u{C2BD}", - nfd: "\u{1109}\u{1173}\u{11C0}", - nfkc: "\u{C2BD}", - nfkd: "\u{1109}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{C2BE}", - nfc: "\u{C2BE}", - nfd: "\u{1109}\u{1173}\u{11C1}", - nfkc: "\u{C2BE}", - nfkd: "\u{1109}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{C2BF}", - nfc: "\u{C2BF}", - nfd: "\u{1109}\u{1173}\u{11C2}", - nfkc: "\u{C2BF}", - nfkd: "\u{1109}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{C2C0}", - nfc: "\u{C2C0}", - nfd: "\u{1109}\u{1174}", - nfkc: "\u{C2C0}", - nfkd: "\u{1109}\u{1174}", - }, - NormalizationTest { - source: "\u{C2C1}", - nfc: "\u{C2C1}", - nfd: "\u{1109}\u{1174}\u{11A8}", - nfkc: "\u{C2C1}", - nfkd: "\u{1109}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{C2C2}", - nfc: "\u{C2C2}", - nfd: "\u{1109}\u{1174}\u{11A9}", - nfkc: "\u{C2C2}", - nfkd: "\u{1109}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{C2C3}", - nfc: "\u{C2C3}", - nfd: "\u{1109}\u{1174}\u{11AA}", - nfkc: "\u{C2C3}", - nfkd: "\u{1109}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{C2C4}", - nfc: "\u{C2C4}", - nfd: "\u{1109}\u{1174}\u{11AB}", - nfkc: "\u{C2C4}", - nfkd: "\u{1109}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{C2C5}", - nfc: "\u{C2C5}", - nfd: "\u{1109}\u{1174}\u{11AC}", - nfkc: "\u{C2C5}", - nfkd: "\u{1109}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{C2C6}", - nfc: "\u{C2C6}", - nfd: "\u{1109}\u{1174}\u{11AD}", - nfkc: "\u{C2C6}", - nfkd: "\u{1109}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{C2C7}", - nfc: "\u{C2C7}", - nfd: "\u{1109}\u{1174}\u{11AE}", - nfkc: "\u{C2C7}", - nfkd: "\u{1109}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{C2C8}", - nfc: "\u{C2C8}", - nfd: "\u{1109}\u{1174}\u{11AF}", - nfkc: "\u{C2C8}", - nfkd: "\u{1109}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{C2C9}", - nfc: "\u{C2C9}", - nfd: "\u{1109}\u{1174}\u{11B0}", - nfkc: "\u{C2C9}", - nfkd: "\u{1109}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{C2CA}", - nfc: "\u{C2CA}", - nfd: "\u{1109}\u{1174}\u{11B1}", - nfkc: "\u{C2CA}", - nfkd: "\u{1109}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{C2CB}", - nfc: "\u{C2CB}", - nfd: "\u{1109}\u{1174}\u{11B2}", - nfkc: "\u{C2CB}", - nfkd: "\u{1109}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{C2CC}", - nfc: "\u{C2CC}", - nfd: "\u{1109}\u{1174}\u{11B3}", - nfkc: "\u{C2CC}", - nfkd: "\u{1109}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{C2CD}", - nfc: "\u{C2CD}", - nfd: "\u{1109}\u{1174}\u{11B4}", - nfkc: "\u{C2CD}", - nfkd: "\u{1109}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{C2CE}", - nfc: "\u{C2CE}", - nfd: "\u{1109}\u{1174}\u{11B5}", - nfkc: "\u{C2CE}", - nfkd: "\u{1109}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{C2CF}", - nfc: "\u{C2CF}", - nfd: "\u{1109}\u{1174}\u{11B6}", - nfkc: "\u{C2CF}", - nfkd: "\u{1109}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{C2D0}", - nfc: "\u{C2D0}", - nfd: "\u{1109}\u{1174}\u{11B7}", - nfkc: "\u{C2D0}", - nfkd: "\u{1109}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{C2D1}", - nfc: "\u{C2D1}", - nfd: "\u{1109}\u{1174}\u{11B8}", - nfkc: "\u{C2D1}", - nfkd: "\u{1109}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{C2D2}", - nfc: "\u{C2D2}", - nfd: "\u{1109}\u{1174}\u{11B9}", - nfkc: "\u{C2D2}", - nfkd: "\u{1109}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{C2D3}", - nfc: "\u{C2D3}", - nfd: "\u{1109}\u{1174}\u{11BA}", - nfkc: "\u{C2D3}", - nfkd: "\u{1109}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{C2D4}", - nfc: "\u{C2D4}", - nfd: "\u{1109}\u{1174}\u{11BB}", - nfkc: "\u{C2D4}", - nfkd: "\u{1109}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{C2D5}", - nfc: "\u{C2D5}", - nfd: "\u{1109}\u{1174}\u{11BC}", - nfkc: "\u{C2D5}", - nfkd: "\u{1109}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{C2D6}", - nfc: "\u{C2D6}", - nfd: "\u{1109}\u{1174}\u{11BD}", - nfkc: "\u{C2D6}", - nfkd: "\u{1109}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{C2D7}", - nfc: "\u{C2D7}", - nfd: "\u{1109}\u{1174}\u{11BE}", - nfkc: "\u{C2D7}", - nfkd: "\u{1109}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{C2D8}", - nfc: "\u{C2D8}", - nfd: "\u{1109}\u{1174}\u{11BF}", - nfkc: "\u{C2D8}", - nfkd: "\u{1109}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{C2D9}", - nfc: "\u{C2D9}", - nfd: "\u{1109}\u{1174}\u{11C0}", - nfkc: "\u{C2D9}", - nfkd: "\u{1109}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{C2DA}", - nfc: "\u{C2DA}", - nfd: "\u{1109}\u{1174}\u{11C1}", - nfkc: "\u{C2DA}", - nfkd: "\u{1109}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{C2DB}", - nfc: "\u{C2DB}", - nfd: "\u{1109}\u{1174}\u{11C2}", - nfkc: "\u{C2DB}", - nfkd: "\u{1109}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{C2DC}", - nfc: "\u{C2DC}", - nfd: "\u{1109}\u{1175}", - nfkc: "\u{C2DC}", - nfkd: "\u{1109}\u{1175}", - }, - NormalizationTest { - source: "\u{C2DD}", - nfc: "\u{C2DD}", - nfd: "\u{1109}\u{1175}\u{11A8}", - nfkc: "\u{C2DD}", - nfkd: "\u{1109}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{C2DE}", - nfc: "\u{C2DE}", - nfd: "\u{1109}\u{1175}\u{11A9}", - nfkc: "\u{C2DE}", - nfkd: "\u{1109}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{C2DF}", - nfc: "\u{C2DF}", - nfd: "\u{1109}\u{1175}\u{11AA}", - nfkc: "\u{C2DF}", - nfkd: "\u{1109}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{C2E0}", - nfc: "\u{C2E0}", - nfd: "\u{1109}\u{1175}\u{11AB}", - nfkc: "\u{C2E0}", - nfkd: "\u{1109}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{C2E1}", - nfc: "\u{C2E1}", - nfd: "\u{1109}\u{1175}\u{11AC}", - nfkc: "\u{C2E1}", - nfkd: "\u{1109}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{C2E2}", - nfc: "\u{C2E2}", - nfd: "\u{1109}\u{1175}\u{11AD}", - nfkc: "\u{C2E2}", - nfkd: "\u{1109}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{C2E3}", - nfc: "\u{C2E3}", - nfd: "\u{1109}\u{1175}\u{11AE}", - nfkc: "\u{C2E3}", - nfkd: "\u{1109}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{C2E4}", - nfc: "\u{C2E4}", - nfd: "\u{1109}\u{1175}\u{11AF}", - nfkc: "\u{C2E4}", - nfkd: "\u{1109}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{C2E5}", - nfc: "\u{C2E5}", - nfd: "\u{1109}\u{1175}\u{11B0}", - nfkc: "\u{C2E5}", - nfkd: "\u{1109}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{C2E6}", - nfc: "\u{C2E6}", - nfd: "\u{1109}\u{1175}\u{11B1}", - nfkc: "\u{C2E6}", - nfkd: "\u{1109}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{C2E7}", - nfc: "\u{C2E7}", - nfd: "\u{1109}\u{1175}\u{11B2}", - nfkc: "\u{C2E7}", - nfkd: "\u{1109}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{C2E8}", - nfc: "\u{C2E8}", - nfd: "\u{1109}\u{1175}\u{11B3}", - nfkc: "\u{C2E8}", - nfkd: "\u{1109}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{C2E9}", - nfc: "\u{C2E9}", - nfd: "\u{1109}\u{1175}\u{11B4}", - nfkc: "\u{C2E9}", - nfkd: "\u{1109}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{C2EA}", - nfc: "\u{C2EA}", - nfd: "\u{1109}\u{1175}\u{11B5}", - nfkc: "\u{C2EA}", - nfkd: "\u{1109}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{C2EB}", - nfc: "\u{C2EB}", - nfd: "\u{1109}\u{1175}\u{11B6}", - nfkc: "\u{C2EB}", - nfkd: "\u{1109}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{C2EC}", - nfc: "\u{C2EC}", - nfd: "\u{1109}\u{1175}\u{11B7}", - nfkc: "\u{C2EC}", - nfkd: "\u{1109}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{C2ED}", - nfc: "\u{C2ED}", - nfd: "\u{1109}\u{1175}\u{11B8}", - nfkc: "\u{C2ED}", - nfkd: "\u{1109}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{C2EE}", - nfc: "\u{C2EE}", - nfd: "\u{1109}\u{1175}\u{11B9}", - nfkc: "\u{C2EE}", - nfkd: "\u{1109}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{C2EF}", - nfc: "\u{C2EF}", - nfd: "\u{1109}\u{1175}\u{11BA}", - nfkc: "\u{C2EF}", - nfkd: "\u{1109}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{C2F0}", - nfc: "\u{C2F0}", - nfd: "\u{1109}\u{1175}\u{11BB}", - nfkc: "\u{C2F0}", - nfkd: "\u{1109}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{C2F1}", - nfc: "\u{C2F1}", - nfd: "\u{1109}\u{1175}\u{11BC}", - nfkc: "\u{C2F1}", - nfkd: "\u{1109}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{C2F2}", - nfc: "\u{C2F2}", - nfd: "\u{1109}\u{1175}\u{11BD}", - nfkc: "\u{C2F2}", - nfkd: "\u{1109}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{C2F3}", - nfc: "\u{C2F3}", - nfd: "\u{1109}\u{1175}\u{11BE}", - nfkc: "\u{C2F3}", - nfkd: "\u{1109}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{C2F4}", - nfc: "\u{C2F4}", - nfd: "\u{1109}\u{1175}\u{11BF}", - nfkc: "\u{C2F4}", - nfkd: "\u{1109}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{C2F5}", - nfc: "\u{C2F5}", - nfd: "\u{1109}\u{1175}\u{11C0}", - nfkc: "\u{C2F5}", - nfkd: "\u{1109}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{C2F6}", - nfc: "\u{C2F6}", - nfd: "\u{1109}\u{1175}\u{11C1}", - nfkc: "\u{C2F6}", - nfkd: "\u{1109}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{C2F7}", - nfc: "\u{C2F7}", - nfd: "\u{1109}\u{1175}\u{11C2}", - nfkc: "\u{C2F7}", - nfkd: "\u{1109}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{C2F8}", - nfc: "\u{C2F8}", - nfd: "\u{110A}\u{1161}", - nfkc: "\u{C2F8}", - nfkd: "\u{110A}\u{1161}", - }, - NormalizationTest { - source: "\u{C2F9}", - nfc: "\u{C2F9}", - nfd: "\u{110A}\u{1161}\u{11A8}", - nfkc: "\u{C2F9}", - nfkd: "\u{110A}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{C2FA}", - nfc: "\u{C2FA}", - nfd: "\u{110A}\u{1161}\u{11A9}", - nfkc: "\u{C2FA}", - nfkd: "\u{110A}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{C2FB}", - nfc: "\u{C2FB}", - nfd: "\u{110A}\u{1161}\u{11AA}", - nfkc: "\u{C2FB}", - nfkd: "\u{110A}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{C2FC}", - nfc: "\u{C2FC}", - nfd: "\u{110A}\u{1161}\u{11AB}", - nfkc: "\u{C2FC}", - nfkd: "\u{110A}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{C2FD}", - nfc: "\u{C2FD}", - nfd: "\u{110A}\u{1161}\u{11AC}", - nfkc: "\u{C2FD}", - nfkd: "\u{110A}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{C2FE}", - nfc: "\u{C2FE}", - nfd: "\u{110A}\u{1161}\u{11AD}", - nfkc: "\u{C2FE}", - nfkd: "\u{110A}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{C2FF}", - nfc: "\u{C2FF}", - nfd: "\u{110A}\u{1161}\u{11AE}", - nfkc: "\u{C2FF}", - nfkd: "\u{110A}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{C300}", - nfc: "\u{C300}", - nfd: "\u{110A}\u{1161}\u{11AF}", - nfkc: "\u{C300}", - nfkd: "\u{110A}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{C301}", - nfc: "\u{C301}", - nfd: "\u{110A}\u{1161}\u{11B0}", - nfkc: "\u{C301}", - nfkd: "\u{110A}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{C302}", - nfc: "\u{C302}", - nfd: "\u{110A}\u{1161}\u{11B1}", - nfkc: "\u{C302}", - nfkd: "\u{110A}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{C303}", - nfc: "\u{C303}", - nfd: "\u{110A}\u{1161}\u{11B2}", - nfkc: "\u{C303}", - nfkd: "\u{110A}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{C304}", - nfc: "\u{C304}", - nfd: "\u{110A}\u{1161}\u{11B3}", - nfkc: "\u{C304}", - nfkd: "\u{110A}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{C305}", - nfc: "\u{C305}", - nfd: "\u{110A}\u{1161}\u{11B4}", - nfkc: "\u{C305}", - nfkd: "\u{110A}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{C306}", - nfc: "\u{C306}", - nfd: "\u{110A}\u{1161}\u{11B5}", - nfkc: "\u{C306}", - nfkd: "\u{110A}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{C307}", - nfc: "\u{C307}", - nfd: "\u{110A}\u{1161}\u{11B6}", - nfkc: "\u{C307}", - nfkd: "\u{110A}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{C308}", - nfc: "\u{C308}", - nfd: "\u{110A}\u{1161}\u{11B7}", - nfkc: "\u{C308}", - nfkd: "\u{110A}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{C309}", - nfc: "\u{C309}", - nfd: "\u{110A}\u{1161}\u{11B8}", - nfkc: "\u{C309}", - nfkd: "\u{110A}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{C30A}", - nfc: "\u{C30A}", - nfd: "\u{110A}\u{1161}\u{11B9}", - nfkc: "\u{C30A}", - nfkd: "\u{110A}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{C30B}", - nfc: "\u{C30B}", - nfd: "\u{110A}\u{1161}\u{11BA}", - nfkc: "\u{C30B}", - nfkd: "\u{110A}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{C30C}", - nfc: "\u{C30C}", - nfd: "\u{110A}\u{1161}\u{11BB}", - nfkc: "\u{C30C}", - nfkd: "\u{110A}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{C30D}", - nfc: "\u{C30D}", - nfd: "\u{110A}\u{1161}\u{11BC}", - nfkc: "\u{C30D}", - nfkd: "\u{110A}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{C30E}", - nfc: "\u{C30E}", - nfd: "\u{110A}\u{1161}\u{11BD}", - nfkc: "\u{C30E}", - nfkd: "\u{110A}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{C30F}", - nfc: "\u{C30F}", - nfd: "\u{110A}\u{1161}\u{11BE}", - nfkc: "\u{C30F}", - nfkd: "\u{110A}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{C310}", - nfc: "\u{C310}", - nfd: "\u{110A}\u{1161}\u{11BF}", - nfkc: "\u{C310}", - nfkd: "\u{110A}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{C311}", - nfc: "\u{C311}", - nfd: "\u{110A}\u{1161}\u{11C0}", - nfkc: "\u{C311}", - nfkd: "\u{110A}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{C312}", - nfc: "\u{C312}", - nfd: "\u{110A}\u{1161}\u{11C1}", - nfkc: "\u{C312}", - nfkd: "\u{110A}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{C313}", - nfc: "\u{C313}", - nfd: "\u{110A}\u{1161}\u{11C2}", - nfkc: "\u{C313}", - nfkd: "\u{110A}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{C314}", - nfc: "\u{C314}", - nfd: "\u{110A}\u{1162}", - nfkc: "\u{C314}", - nfkd: "\u{110A}\u{1162}", - }, - NormalizationTest { - source: "\u{C315}", - nfc: "\u{C315}", - nfd: "\u{110A}\u{1162}\u{11A8}", - nfkc: "\u{C315}", - nfkd: "\u{110A}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{C316}", - nfc: "\u{C316}", - nfd: "\u{110A}\u{1162}\u{11A9}", - nfkc: "\u{C316}", - nfkd: "\u{110A}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{C317}", - nfc: "\u{C317}", - nfd: "\u{110A}\u{1162}\u{11AA}", - nfkc: "\u{C317}", - nfkd: "\u{110A}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{C318}", - nfc: "\u{C318}", - nfd: "\u{110A}\u{1162}\u{11AB}", - nfkc: "\u{C318}", - nfkd: "\u{110A}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{C319}", - nfc: "\u{C319}", - nfd: "\u{110A}\u{1162}\u{11AC}", - nfkc: "\u{C319}", - nfkd: "\u{110A}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{C31A}", - nfc: "\u{C31A}", - nfd: "\u{110A}\u{1162}\u{11AD}", - nfkc: "\u{C31A}", - nfkd: "\u{110A}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{C31B}", - nfc: "\u{C31B}", - nfd: "\u{110A}\u{1162}\u{11AE}", - nfkc: "\u{C31B}", - nfkd: "\u{110A}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{C31C}", - nfc: "\u{C31C}", - nfd: "\u{110A}\u{1162}\u{11AF}", - nfkc: "\u{C31C}", - nfkd: "\u{110A}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{C31D}", - nfc: "\u{C31D}", - nfd: "\u{110A}\u{1162}\u{11B0}", - nfkc: "\u{C31D}", - nfkd: "\u{110A}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{C31E}", - nfc: "\u{C31E}", - nfd: "\u{110A}\u{1162}\u{11B1}", - nfkc: "\u{C31E}", - nfkd: "\u{110A}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{C31F}", - nfc: "\u{C31F}", - nfd: "\u{110A}\u{1162}\u{11B2}", - nfkc: "\u{C31F}", - nfkd: "\u{110A}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{C320}", - nfc: "\u{C320}", - nfd: "\u{110A}\u{1162}\u{11B3}", - nfkc: "\u{C320}", - nfkd: "\u{110A}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{C321}", - nfc: "\u{C321}", - nfd: "\u{110A}\u{1162}\u{11B4}", - nfkc: "\u{C321}", - nfkd: "\u{110A}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{C322}", - nfc: "\u{C322}", - nfd: "\u{110A}\u{1162}\u{11B5}", - nfkc: "\u{C322}", - nfkd: "\u{110A}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{C323}", - nfc: "\u{C323}", - nfd: "\u{110A}\u{1162}\u{11B6}", - nfkc: "\u{C323}", - nfkd: "\u{110A}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{C324}", - nfc: "\u{C324}", - nfd: "\u{110A}\u{1162}\u{11B7}", - nfkc: "\u{C324}", - nfkd: "\u{110A}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{C325}", - nfc: "\u{C325}", - nfd: "\u{110A}\u{1162}\u{11B8}", - nfkc: "\u{C325}", - nfkd: "\u{110A}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{C326}", - nfc: "\u{C326}", - nfd: "\u{110A}\u{1162}\u{11B9}", - nfkc: "\u{C326}", - nfkd: "\u{110A}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{C327}", - nfc: "\u{C327}", - nfd: "\u{110A}\u{1162}\u{11BA}", - nfkc: "\u{C327}", - nfkd: "\u{110A}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{C328}", - nfc: "\u{C328}", - nfd: "\u{110A}\u{1162}\u{11BB}", - nfkc: "\u{C328}", - nfkd: "\u{110A}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{C329}", - nfc: "\u{C329}", - nfd: "\u{110A}\u{1162}\u{11BC}", - nfkc: "\u{C329}", - nfkd: "\u{110A}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{C32A}", - nfc: "\u{C32A}", - nfd: "\u{110A}\u{1162}\u{11BD}", - nfkc: "\u{C32A}", - nfkd: "\u{110A}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{C32B}", - nfc: "\u{C32B}", - nfd: "\u{110A}\u{1162}\u{11BE}", - nfkc: "\u{C32B}", - nfkd: "\u{110A}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{C32C}", - nfc: "\u{C32C}", - nfd: "\u{110A}\u{1162}\u{11BF}", - nfkc: "\u{C32C}", - nfkd: "\u{110A}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{C32D}", - nfc: "\u{C32D}", - nfd: "\u{110A}\u{1162}\u{11C0}", - nfkc: "\u{C32D}", - nfkd: "\u{110A}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{C32E}", - nfc: "\u{C32E}", - nfd: "\u{110A}\u{1162}\u{11C1}", - nfkc: "\u{C32E}", - nfkd: "\u{110A}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{C32F}", - nfc: "\u{C32F}", - nfd: "\u{110A}\u{1162}\u{11C2}", - nfkc: "\u{C32F}", - nfkd: "\u{110A}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{C330}", - nfc: "\u{C330}", - nfd: "\u{110A}\u{1163}", - nfkc: "\u{C330}", - nfkd: "\u{110A}\u{1163}", - }, - NormalizationTest { - source: "\u{C331}", - nfc: "\u{C331}", - nfd: "\u{110A}\u{1163}\u{11A8}", - nfkc: "\u{C331}", - nfkd: "\u{110A}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{C332}", - nfc: "\u{C332}", - nfd: "\u{110A}\u{1163}\u{11A9}", - nfkc: "\u{C332}", - nfkd: "\u{110A}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{C333}", - nfc: "\u{C333}", - nfd: "\u{110A}\u{1163}\u{11AA}", - nfkc: "\u{C333}", - nfkd: "\u{110A}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{C334}", - nfc: "\u{C334}", - nfd: "\u{110A}\u{1163}\u{11AB}", - nfkc: "\u{C334}", - nfkd: "\u{110A}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{C335}", - nfc: "\u{C335}", - nfd: "\u{110A}\u{1163}\u{11AC}", - nfkc: "\u{C335}", - nfkd: "\u{110A}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{C336}", - nfc: "\u{C336}", - nfd: "\u{110A}\u{1163}\u{11AD}", - nfkc: "\u{C336}", - nfkd: "\u{110A}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{C337}", - nfc: "\u{C337}", - nfd: "\u{110A}\u{1163}\u{11AE}", - nfkc: "\u{C337}", - nfkd: "\u{110A}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{C338}", - nfc: "\u{C338}", - nfd: "\u{110A}\u{1163}\u{11AF}", - nfkc: "\u{C338}", - nfkd: "\u{110A}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{C339}", - nfc: "\u{C339}", - nfd: "\u{110A}\u{1163}\u{11B0}", - nfkc: "\u{C339}", - nfkd: "\u{110A}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{C33A}", - nfc: "\u{C33A}", - nfd: "\u{110A}\u{1163}\u{11B1}", - nfkc: "\u{C33A}", - nfkd: "\u{110A}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{C33B}", - nfc: "\u{C33B}", - nfd: "\u{110A}\u{1163}\u{11B2}", - nfkc: "\u{C33B}", - nfkd: "\u{110A}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{C33C}", - nfc: "\u{C33C}", - nfd: "\u{110A}\u{1163}\u{11B3}", - nfkc: "\u{C33C}", - nfkd: "\u{110A}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{C33D}", - nfc: "\u{C33D}", - nfd: "\u{110A}\u{1163}\u{11B4}", - nfkc: "\u{C33D}", - nfkd: "\u{110A}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{C33E}", - nfc: "\u{C33E}", - nfd: "\u{110A}\u{1163}\u{11B5}", - nfkc: "\u{C33E}", - nfkd: "\u{110A}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{C33F}", - nfc: "\u{C33F}", - nfd: "\u{110A}\u{1163}\u{11B6}", - nfkc: "\u{C33F}", - nfkd: "\u{110A}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{C340}", - nfc: "\u{C340}", - nfd: "\u{110A}\u{1163}\u{11B7}", - nfkc: "\u{C340}", - nfkd: "\u{110A}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{C341}", - nfc: "\u{C341}", - nfd: "\u{110A}\u{1163}\u{11B8}", - nfkc: "\u{C341}", - nfkd: "\u{110A}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{C342}", - nfc: "\u{C342}", - nfd: "\u{110A}\u{1163}\u{11B9}", - nfkc: "\u{C342}", - nfkd: "\u{110A}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{C343}", - nfc: "\u{C343}", - nfd: "\u{110A}\u{1163}\u{11BA}", - nfkc: "\u{C343}", - nfkd: "\u{110A}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{C344}", - nfc: "\u{C344}", - nfd: "\u{110A}\u{1163}\u{11BB}", - nfkc: "\u{C344}", - nfkd: "\u{110A}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{C345}", - nfc: "\u{C345}", - nfd: "\u{110A}\u{1163}\u{11BC}", - nfkc: "\u{C345}", - nfkd: "\u{110A}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{C346}", - nfc: "\u{C346}", - nfd: "\u{110A}\u{1163}\u{11BD}", - nfkc: "\u{C346}", - nfkd: "\u{110A}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{C347}", - nfc: "\u{C347}", - nfd: "\u{110A}\u{1163}\u{11BE}", - nfkc: "\u{C347}", - nfkd: "\u{110A}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{C348}", - nfc: "\u{C348}", - nfd: "\u{110A}\u{1163}\u{11BF}", - nfkc: "\u{C348}", - nfkd: "\u{110A}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{C349}", - nfc: "\u{C349}", - nfd: "\u{110A}\u{1163}\u{11C0}", - nfkc: "\u{C349}", - nfkd: "\u{110A}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{C34A}", - nfc: "\u{C34A}", - nfd: "\u{110A}\u{1163}\u{11C1}", - nfkc: "\u{C34A}", - nfkd: "\u{110A}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{C34B}", - nfc: "\u{C34B}", - nfd: "\u{110A}\u{1163}\u{11C2}", - nfkc: "\u{C34B}", - nfkd: "\u{110A}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{C34C}", - nfc: "\u{C34C}", - nfd: "\u{110A}\u{1164}", - nfkc: "\u{C34C}", - nfkd: "\u{110A}\u{1164}", - }, - NormalizationTest { - source: "\u{C34D}", - nfc: "\u{C34D}", - nfd: "\u{110A}\u{1164}\u{11A8}", - nfkc: "\u{C34D}", - nfkd: "\u{110A}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{C34E}", - nfc: "\u{C34E}", - nfd: "\u{110A}\u{1164}\u{11A9}", - nfkc: "\u{C34E}", - nfkd: "\u{110A}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{C34F}", - nfc: "\u{C34F}", - nfd: "\u{110A}\u{1164}\u{11AA}", - nfkc: "\u{C34F}", - nfkd: "\u{110A}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{C350}", - nfc: "\u{C350}", - nfd: "\u{110A}\u{1164}\u{11AB}", - nfkc: "\u{C350}", - nfkd: "\u{110A}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{C351}", - nfc: "\u{C351}", - nfd: "\u{110A}\u{1164}\u{11AC}", - nfkc: "\u{C351}", - nfkd: "\u{110A}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{C352}", - nfc: "\u{C352}", - nfd: "\u{110A}\u{1164}\u{11AD}", - nfkc: "\u{C352}", - nfkd: "\u{110A}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{C353}", - nfc: "\u{C353}", - nfd: "\u{110A}\u{1164}\u{11AE}", - nfkc: "\u{C353}", - nfkd: "\u{110A}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{C354}", - nfc: "\u{C354}", - nfd: "\u{110A}\u{1164}\u{11AF}", - nfkc: "\u{C354}", - nfkd: "\u{110A}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{C355}", - nfc: "\u{C355}", - nfd: "\u{110A}\u{1164}\u{11B0}", - nfkc: "\u{C355}", - nfkd: "\u{110A}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{C356}", - nfc: "\u{C356}", - nfd: "\u{110A}\u{1164}\u{11B1}", - nfkc: "\u{C356}", - nfkd: "\u{110A}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{C357}", - nfc: "\u{C357}", - nfd: "\u{110A}\u{1164}\u{11B2}", - nfkc: "\u{C357}", - nfkd: "\u{110A}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{C358}", - nfc: "\u{C358}", - nfd: "\u{110A}\u{1164}\u{11B3}", - nfkc: "\u{C358}", - nfkd: "\u{110A}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{C359}", - nfc: "\u{C359}", - nfd: "\u{110A}\u{1164}\u{11B4}", - nfkc: "\u{C359}", - nfkd: "\u{110A}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{C35A}", - nfc: "\u{C35A}", - nfd: "\u{110A}\u{1164}\u{11B5}", - nfkc: "\u{C35A}", - nfkd: "\u{110A}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{C35B}", - nfc: "\u{C35B}", - nfd: "\u{110A}\u{1164}\u{11B6}", - nfkc: "\u{C35B}", - nfkd: "\u{110A}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{C35C}", - nfc: "\u{C35C}", - nfd: "\u{110A}\u{1164}\u{11B7}", - nfkc: "\u{C35C}", - nfkd: "\u{110A}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{C35D}", - nfc: "\u{C35D}", - nfd: "\u{110A}\u{1164}\u{11B8}", - nfkc: "\u{C35D}", - nfkd: "\u{110A}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{C35E}", - nfc: "\u{C35E}", - nfd: "\u{110A}\u{1164}\u{11B9}", - nfkc: "\u{C35E}", - nfkd: "\u{110A}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{C35F}", - nfc: "\u{C35F}", - nfd: "\u{110A}\u{1164}\u{11BA}", - nfkc: "\u{C35F}", - nfkd: "\u{110A}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{C360}", - nfc: "\u{C360}", - nfd: "\u{110A}\u{1164}\u{11BB}", - nfkc: "\u{C360}", - nfkd: "\u{110A}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{C361}", - nfc: "\u{C361}", - nfd: "\u{110A}\u{1164}\u{11BC}", - nfkc: "\u{C361}", - nfkd: "\u{110A}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{C362}", - nfc: "\u{C362}", - nfd: "\u{110A}\u{1164}\u{11BD}", - nfkc: "\u{C362}", - nfkd: "\u{110A}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{C363}", - nfc: "\u{C363}", - nfd: "\u{110A}\u{1164}\u{11BE}", - nfkc: "\u{C363}", - nfkd: "\u{110A}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{C364}", - nfc: "\u{C364}", - nfd: "\u{110A}\u{1164}\u{11BF}", - nfkc: "\u{C364}", - nfkd: "\u{110A}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{C365}", - nfc: "\u{C365}", - nfd: "\u{110A}\u{1164}\u{11C0}", - nfkc: "\u{C365}", - nfkd: "\u{110A}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{C366}", - nfc: "\u{C366}", - nfd: "\u{110A}\u{1164}\u{11C1}", - nfkc: "\u{C366}", - nfkd: "\u{110A}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{C367}", - nfc: "\u{C367}", - nfd: "\u{110A}\u{1164}\u{11C2}", - nfkc: "\u{C367}", - nfkd: "\u{110A}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{C368}", - nfc: "\u{C368}", - nfd: "\u{110A}\u{1165}", - nfkc: "\u{C368}", - nfkd: "\u{110A}\u{1165}", - }, - NormalizationTest { - source: "\u{C369}", - nfc: "\u{C369}", - nfd: "\u{110A}\u{1165}\u{11A8}", - nfkc: "\u{C369}", - nfkd: "\u{110A}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{C36A}", - nfc: "\u{C36A}", - nfd: "\u{110A}\u{1165}\u{11A9}", - nfkc: "\u{C36A}", - nfkd: "\u{110A}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{C36B}", - nfc: "\u{C36B}", - nfd: "\u{110A}\u{1165}\u{11AA}", - nfkc: "\u{C36B}", - nfkd: "\u{110A}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{C36C}", - nfc: "\u{C36C}", - nfd: "\u{110A}\u{1165}\u{11AB}", - nfkc: "\u{C36C}", - nfkd: "\u{110A}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{C36D}", - nfc: "\u{C36D}", - nfd: "\u{110A}\u{1165}\u{11AC}", - nfkc: "\u{C36D}", - nfkd: "\u{110A}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{C36E}", - nfc: "\u{C36E}", - nfd: "\u{110A}\u{1165}\u{11AD}", - nfkc: "\u{C36E}", - nfkd: "\u{110A}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{C36F}", - nfc: "\u{C36F}", - nfd: "\u{110A}\u{1165}\u{11AE}", - nfkc: "\u{C36F}", - nfkd: "\u{110A}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{C370}", - nfc: "\u{C370}", - nfd: "\u{110A}\u{1165}\u{11AF}", - nfkc: "\u{C370}", - nfkd: "\u{110A}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{C371}", - nfc: "\u{C371}", - nfd: "\u{110A}\u{1165}\u{11B0}", - nfkc: "\u{C371}", - nfkd: "\u{110A}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{C372}", - nfc: "\u{C372}", - nfd: "\u{110A}\u{1165}\u{11B1}", - nfkc: "\u{C372}", - nfkd: "\u{110A}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{C373}", - nfc: "\u{C373}", - nfd: "\u{110A}\u{1165}\u{11B2}", - nfkc: "\u{C373}", - nfkd: "\u{110A}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{C374}", - nfc: "\u{C374}", - nfd: "\u{110A}\u{1165}\u{11B3}", - nfkc: "\u{C374}", - nfkd: "\u{110A}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{C375}", - nfc: "\u{C375}", - nfd: "\u{110A}\u{1165}\u{11B4}", - nfkc: "\u{C375}", - nfkd: "\u{110A}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{C376}", - nfc: "\u{C376}", - nfd: "\u{110A}\u{1165}\u{11B5}", - nfkc: "\u{C376}", - nfkd: "\u{110A}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{C377}", - nfc: "\u{C377}", - nfd: "\u{110A}\u{1165}\u{11B6}", - nfkc: "\u{C377}", - nfkd: "\u{110A}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{C378}", - nfc: "\u{C378}", - nfd: "\u{110A}\u{1165}\u{11B7}", - nfkc: "\u{C378}", - nfkd: "\u{110A}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{C379}", - nfc: "\u{C379}", - nfd: "\u{110A}\u{1165}\u{11B8}", - nfkc: "\u{C379}", - nfkd: "\u{110A}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{C37A}", - nfc: "\u{C37A}", - nfd: "\u{110A}\u{1165}\u{11B9}", - nfkc: "\u{C37A}", - nfkd: "\u{110A}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{C37B}", - nfc: "\u{C37B}", - nfd: "\u{110A}\u{1165}\u{11BA}", - nfkc: "\u{C37B}", - nfkd: "\u{110A}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{C37C}", - nfc: "\u{C37C}", - nfd: "\u{110A}\u{1165}\u{11BB}", - nfkc: "\u{C37C}", - nfkd: "\u{110A}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{C37D}", - nfc: "\u{C37D}", - nfd: "\u{110A}\u{1165}\u{11BC}", - nfkc: "\u{C37D}", - nfkd: "\u{110A}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{C37E}", - nfc: "\u{C37E}", - nfd: "\u{110A}\u{1165}\u{11BD}", - nfkc: "\u{C37E}", - nfkd: "\u{110A}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{C37F}", - nfc: "\u{C37F}", - nfd: "\u{110A}\u{1165}\u{11BE}", - nfkc: "\u{C37F}", - nfkd: "\u{110A}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{C380}", - nfc: "\u{C380}", - nfd: "\u{110A}\u{1165}\u{11BF}", - nfkc: "\u{C380}", - nfkd: "\u{110A}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{C381}", - nfc: "\u{C381}", - nfd: "\u{110A}\u{1165}\u{11C0}", - nfkc: "\u{C381}", - nfkd: "\u{110A}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{C382}", - nfc: "\u{C382}", - nfd: "\u{110A}\u{1165}\u{11C1}", - nfkc: "\u{C382}", - nfkd: "\u{110A}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{C383}", - nfc: "\u{C383}", - nfd: "\u{110A}\u{1165}\u{11C2}", - nfkc: "\u{C383}", - nfkd: "\u{110A}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{C384}", - nfc: "\u{C384}", - nfd: "\u{110A}\u{1166}", - nfkc: "\u{C384}", - nfkd: "\u{110A}\u{1166}", - }, - NormalizationTest { - source: "\u{C385}", - nfc: "\u{C385}", - nfd: "\u{110A}\u{1166}\u{11A8}", - nfkc: "\u{C385}", - nfkd: "\u{110A}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{C386}", - nfc: "\u{C386}", - nfd: "\u{110A}\u{1166}\u{11A9}", - nfkc: "\u{C386}", - nfkd: "\u{110A}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{C387}", - nfc: "\u{C387}", - nfd: "\u{110A}\u{1166}\u{11AA}", - nfkc: "\u{C387}", - nfkd: "\u{110A}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{C388}", - nfc: "\u{C388}", - nfd: "\u{110A}\u{1166}\u{11AB}", - nfkc: "\u{C388}", - nfkd: "\u{110A}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{C389}", - nfc: "\u{C389}", - nfd: "\u{110A}\u{1166}\u{11AC}", - nfkc: "\u{C389}", - nfkd: "\u{110A}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{C38A}", - nfc: "\u{C38A}", - nfd: "\u{110A}\u{1166}\u{11AD}", - nfkc: "\u{C38A}", - nfkd: "\u{110A}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{C38B}", - nfc: "\u{C38B}", - nfd: "\u{110A}\u{1166}\u{11AE}", - nfkc: "\u{C38B}", - nfkd: "\u{110A}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{C38C}", - nfc: "\u{C38C}", - nfd: "\u{110A}\u{1166}\u{11AF}", - nfkc: "\u{C38C}", - nfkd: "\u{110A}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{C38D}", - nfc: "\u{C38D}", - nfd: "\u{110A}\u{1166}\u{11B0}", - nfkc: "\u{C38D}", - nfkd: "\u{110A}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{C38E}", - nfc: "\u{C38E}", - nfd: "\u{110A}\u{1166}\u{11B1}", - nfkc: "\u{C38E}", - nfkd: "\u{110A}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{C38F}", - nfc: "\u{C38F}", - nfd: "\u{110A}\u{1166}\u{11B2}", - nfkc: "\u{C38F}", - nfkd: "\u{110A}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{C390}", - nfc: "\u{C390}", - nfd: "\u{110A}\u{1166}\u{11B3}", - nfkc: "\u{C390}", - nfkd: "\u{110A}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{C391}", - nfc: "\u{C391}", - nfd: "\u{110A}\u{1166}\u{11B4}", - nfkc: "\u{C391}", - nfkd: "\u{110A}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{C392}", - nfc: "\u{C392}", - nfd: "\u{110A}\u{1166}\u{11B5}", - nfkc: "\u{C392}", - nfkd: "\u{110A}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{C393}", - nfc: "\u{C393}", - nfd: "\u{110A}\u{1166}\u{11B6}", - nfkc: "\u{C393}", - nfkd: "\u{110A}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{C394}", - nfc: "\u{C394}", - nfd: "\u{110A}\u{1166}\u{11B7}", - nfkc: "\u{C394}", - nfkd: "\u{110A}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{C395}", - nfc: "\u{C395}", - nfd: "\u{110A}\u{1166}\u{11B8}", - nfkc: "\u{C395}", - nfkd: "\u{110A}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{C396}", - nfc: "\u{C396}", - nfd: "\u{110A}\u{1166}\u{11B9}", - nfkc: "\u{C396}", - nfkd: "\u{110A}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{C397}", - nfc: "\u{C397}", - nfd: "\u{110A}\u{1166}\u{11BA}", - nfkc: "\u{C397}", - nfkd: "\u{110A}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{C398}", - nfc: "\u{C398}", - nfd: "\u{110A}\u{1166}\u{11BB}", - nfkc: "\u{C398}", - nfkd: "\u{110A}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{C399}", - nfc: "\u{C399}", - nfd: "\u{110A}\u{1166}\u{11BC}", - nfkc: "\u{C399}", - nfkd: "\u{110A}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{C39A}", - nfc: "\u{C39A}", - nfd: "\u{110A}\u{1166}\u{11BD}", - nfkc: "\u{C39A}", - nfkd: "\u{110A}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{C39B}", - nfc: "\u{C39B}", - nfd: "\u{110A}\u{1166}\u{11BE}", - nfkc: "\u{C39B}", - nfkd: "\u{110A}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{C39C}", - nfc: "\u{C39C}", - nfd: "\u{110A}\u{1166}\u{11BF}", - nfkc: "\u{C39C}", - nfkd: "\u{110A}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{C39D}", - nfc: "\u{C39D}", - nfd: "\u{110A}\u{1166}\u{11C0}", - nfkc: "\u{C39D}", - nfkd: "\u{110A}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{C39E}", - nfc: "\u{C39E}", - nfd: "\u{110A}\u{1166}\u{11C1}", - nfkc: "\u{C39E}", - nfkd: "\u{110A}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{C39F}", - nfc: "\u{C39F}", - nfd: "\u{110A}\u{1166}\u{11C2}", - nfkc: "\u{C39F}", - nfkd: "\u{110A}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{C3A0}", - nfc: "\u{C3A0}", - nfd: "\u{110A}\u{1167}", - nfkc: "\u{C3A0}", - nfkd: "\u{110A}\u{1167}", - }, - NormalizationTest { - source: "\u{C3A1}", - nfc: "\u{C3A1}", - nfd: "\u{110A}\u{1167}\u{11A8}", - nfkc: "\u{C3A1}", - nfkd: "\u{110A}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{C3A2}", - nfc: "\u{C3A2}", - nfd: "\u{110A}\u{1167}\u{11A9}", - nfkc: "\u{C3A2}", - nfkd: "\u{110A}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{C3A3}", - nfc: "\u{C3A3}", - nfd: "\u{110A}\u{1167}\u{11AA}", - nfkc: "\u{C3A3}", - nfkd: "\u{110A}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{C3A4}", - nfc: "\u{C3A4}", - nfd: "\u{110A}\u{1167}\u{11AB}", - nfkc: "\u{C3A4}", - nfkd: "\u{110A}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{C3A5}", - nfc: "\u{C3A5}", - nfd: "\u{110A}\u{1167}\u{11AC}", - nfkc: "\u{C3A5}", - nfkd: "\u{110A}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{C3A6}", - nfc: "\u{C3A6}", - nfd: "\u{110A}\u{1167}\u{11AD}", - nfkc: "\u{C3A6}", - nfkd: "\u{110A}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{C3A7}", - nfc: "\u{C3A7}", - nfd: "\u{110A}\u{1167}\u{11AE}", - nfkc: "\u{C3A7}", - nfkd: "\u{110A}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{C3A8}", - nfc: "\u{C3A8}", - nfd: "\u{110A}\u{1167}\u{11AF}", - nfkc: "\u{C3A8}", - nfkd: "\u{110A}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{C3A9}", - nfc: "\u{C3A9}", - nfd: "\u{110A}\u{1167}\u{11B0}", - nfkc: "\u{C3A9}", - nfkd: "\u{110A}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{C3AA}", - nfc: "\u{C3AA}", - nfd: "\u{110A}\u{1167}\u{11B1}", - nfkc: "\u{C3AA}", - nfkd: "\u{110A}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{C3AB}", - nfc: "\u{C3AB}", - nfd: "\u{110A}\u{1167}\u{11B2}", - nfkc: "\u{C3AB}", - nfkd: "\u{110A}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{C3AC}", - nfc: "\u{C3AC}", - nfd: "\u{110A}\u{1167}\u{11B3}", - nfkc: "\u{C3AC}", - nfkd: "\u{110A}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{C3AD}", - nfc: "\u{C3AD}", - nfd: "\u{110A}\u{1167}\u{11B4}", - nfkc: "\u{C3AD}", - nfkd: "\u{110A}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{C3AE}", - nfc: "\u{C3AE}", - nfd: "\u{110A}\u{1167}\u{11B5}", - nfkc: "\u{C3AE}", - nfkd: "\u{110A}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{C3AF}", - nfc: "\u{C3AF}", - nfd: "\u{110A}\u{1167}\u{11B6}", - nfkc: "\u{C3AF}", - nfkd: "\u{110A}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{C3B0}", - nfc: "\u{C3B0}", - nfd: "\u{110A}\u{1167}\u{11B7}", - nfkc: "\u{C3B0}", - nfkd: "\u{110A}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{C3B1}", - nfc: "\u{C3B1}", - nfd: "\u{110A}\u{1167}\u{11B8}", - nfkc: "\u{C3B1}", - nfkd: "\u{110A}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{C3B2}", - nfc: "\u{C3B2}", - nfd: "\u{110A}\u{1167}\u{11B9}", - nfkc: "\u{C3B2}", - nfkd: "\u{110A}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{C3B3}", - nfc: "\u{C3B3}", - nfd: "\u{110A}\u{1167}\u{11BA}", - nfkc: "\u{C3B3}", - nfkd: "\u{110A}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{C3B4}", - nfc: "\u{C3B4}", - nfd: "\u{110A}\u{1167}\u{11BB}", - nfkc: "\u{C3B4}", - nfkd: "\u{110A}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{C3B5}", - nfc: "\u{C3B5}", - nfd: "\u{110A}\u{1167}\u{11BC}", - nfkc: "\u{C3B5}", - nfkd: "\u{110A}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{C3B6}", - nfc: "\u{C3B6}", - nfd: "\u{110A}\u{1167}\u{11BD}", - nfkc: "\u{C3B6}", - nfkd: "\u{110A}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{C3B7}", - nfc: "\u{C3B7}", - nfd: "\u{110A}\u{1167}\u{11BE}", - nfkc: "\u{C3B7}", - nfkd: "\u{110A}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{C3B8}", - nfc: "\u{C3B8}", - nfd: "\u{110A}\u{1167}\u{11BF}", - nfkc: "\u{C3B8}", - nfkd: "\u{110A}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{C3B9}", - nfc: "\u{C3B9}", - nfd: "\u{110A}\u{1167}\u{11C0}", - nfkc: "\u{C3B9}", - nfkd: "\u{110A}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{C3BA}", - nfc: "\u{C3BA}", - nfd: "\u{110A}\u{1167}\u{11C1}", - nfkc: "\u{C3BA}", - nfkd: "\u{110A}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{C3BB}", - nfc: "\u{C3BB}", - nfd: "\u{110A}\u{1167}\u{11C2}", - nfkc: "\u{C3BB}", - nfkd: "\u{110A}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{C3BC}", - nfc: "\u{C3BC}", - nfd: "\u{110A}\u{1168}", - nfkc: "\u{C3BC}", - nfkd: "\u{110A}\u{1168}", - }, - NormalizationTest { - source: "\u{C3BD}", - nfc: "\u{C3BD}", - nfd: "\u{110A}\u{1168}\u{11A8}", - nfkc: "\u{C3BD}", - nfkd: "\u{110A}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{C3BE}", - nfc: "\u{C3BE}", - nfd: "\u{110A}\u{1168}\u{11A9}", - nfkc: "\u{C3BE}", - nfkd: "\u{110A}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{C3BF}", - nfc: "\u{C3BF}", - nfd: "\u{110A}\u{1168}\u{11AA}", - nfkc: "\u{C3BF}", - nfkd: "\u{110A}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{C3C0}", - nfc: "\u{C3C0}", - nfd: "\u{110A}\u{1168}\u{11AB}", - nfkc: "\u{C3C0}", - nfkd: "\u{110A}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{C3C1}", - nfc: "\u{C3C1}", - nfd: "\u{110A}\u{1168}\u{11AC}", - nfkc: "\u{C3C1}", - nfkd: "\u{110A}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{C3C2}", - nfc: "\u{C3C2}", - nfd: "\u{110A}\u{1168}\u{11AD}", - nfkc: "\u{C3C2}", - nfkd: "\u{110A}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{C3C3}", - nfc: "\u{C3C3}", - nfd: "\u{110A}\u{1168}\u{11AE}", - nfkc: "\u{C3C3}", - nfkd: "\u{110A}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{C3C4}", - nfc: "\u{C3C4}", - nfd: "\u{110A}\u{1168}\u{11AF}", - nfkc: "\u{C3C4}", - nfkd: "\u{110A}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{C3C5}", - nfc: "\u{C3C5}", - nfd: "\u{110A}\u{1168}\u{11B0}", - nfkc: "\u{C3C5}", - nfkd: "\u{110A}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{C3C6}", - nfc: "\u{C3C6}", - nfd: "\u{110A}\u{1168}\u{11B1}", - nfkc: "\u{C3C6}", - nfkd: "\u{110A}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{C3C7}", - nfc: "\u{C3C7}", - nfd: "\u{110A}\u{1168}\u{11B2}", - nfkc: "\u{C3C7}", - nfkd: "\u{110A}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{C3C8}", - nfc: "\u{C3C8}", - nfd: "\u{110A}\u{1168}\u{11B3}", - nfkc: "\u{C3C8}", - nfkd: "\u{110A}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{C3C9}", - nfc: "\u{C3C9}", - nfd: "\u{110A}\u{1168}\u{11B4}", - nfkc: "\u{C3C9}", - nfkd: "\u{110A}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{C3CA}", - nfc: "\u{C3CA}", - nfd: "\u{110A}\u{1168}\u{11B5}", - nfkc: "\u{C3CA}", - nfkd: "\u{110A}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{C3CB}", - nfc: "\u{C3CB}", - nfd: "\u{110A}\u{1168}\u{11B6}", - nfkc: "\u{C3CB}", - nfkd: "\u{110A}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{C3CC}", - nfc: "\u{C3CC}", - nfd: "\u{110A}\u{1168}\u{11B7}", - nfkc: "\u{C3CC}", - nfkd: "\u{110A}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{C3CD}", - nfc: "\u{C3CD}", - nfd: "\u{110A}\u{1168}\u{11B8}", - nfkc: "\u{C3CD}", - nfkd: "\u{110A}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{C3CE}", - nfc: "\u{C3CE}", - nfd: "\u{110A}\u{1168}\u{11B9}", - nfkc: "\u{C3CE}", - nfkd: "\u{110A}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{C3CF}", - nfc: "\u{C3CF}", - nfd: "\u{110A}\u{1168}\u{11BA}", - nfkc: "\u{C3CF}", - nfkd: "\u{110A}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{C3D0}", - nfc: "\u{C3D0}", - nfd: "\u{110A}\u{1168}\u{11BB}", - nfkc: "\u{C3D0}", - nfkd: "\u{110A}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{C3D1}", - nfc: "\u{C3D1}", - nfd: "\u{110A}\u{1168}\u{11BC}", - nfkc: "\u{C3D1}", - nfkd: "\u{110A}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{C3D2}", - nfc: "\u{C3D2}", - nfd: "\u{110A}\u{1168}\u{11BD}", - nfkc: "\u{C3D2}", - nfkd: "\u{110A}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{C3D3}", - nfc: "\u{C3D3}", - nfd: "\u{110A}\u{1168}\u{11BE}", - nfkc: "\u{C3D3}", - nfkd: "\u{110A}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{C3D4}", - nfc: "\u{C3D4}", - nfd: "\u{110A}\u{1168}\u{11BF}", - nfkc: "\u{C3D4}", - nfkd: "\u{110A}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{C3D5}", - nfc: "\u{C3D5}", - nfd: "\u{110A}\u{1168}\u{11C0}", - nfkc: "\u{C3D5}", - nfkd: "\u{110A}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{C3D6}", - nfc: "\u{C3D6}", - nfd: "\u{110A}\u{1168}\u{11C1}", - nfkc: "\u{C3D6}", - nfkd: "\u{110A}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{C3D7}", - nfc: "\u{C3D7}", - nfd: "\u{110A}\u{1168}\u{11C2}", - nfkc: "\u{C3D7}", - nfkd: "\u{110A}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{C3D8}", - nfc: "\u{C3D8}", - nfd: "\u{110A}\u{1169}", - nfkc: "\u{C3D8}", - nfkd: "\u{110A}\u{1169}", - }, - NormalizationTest { - source: "\u{C3D9}", - nfc: "\u{C3D9}", - nfd: "\u{110A}\u{1169}\u{11A8}", - nfkc: "\u{C3D9}", - nfkd: "\u{110A}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{C3DA}", - nfc: "\u{C3DA}", - nfd: "\u{110A}\u{1169}\u{11A9}", - nfkc: "\u{C3DA}", - nfkd: "\u{110A}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{C3DB}", - nfc: "\u{C3DB}", - nfd: "\u{110A}\u{1169}\u{11AA}", - nfkc: "\u{C3DB}", - nfkd: "\u{110A}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{C3DC}", - nfc: "\u{C3DC}", - nfd: "\u{110A}\u{1169}\u{11AB}", - nfkc: "\u{C3DC}", - nfkd: "\u{110A}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{C3DD}", - nfc: "\u{C3DD}", - nfd: "\u{110A}\u{1169}\u{11AC}", - nfkc: "\u{C3DD}", - nfkd: "\u{110A}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{C3DE}", - nfc: "\u{C3DE}", - nfd: "\u{110A}\u{1169}\u{11AD}", - nfkc: "\u{C3DE}", - nfkd: "\u{110A}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{C3DF}", - nfc: "\u{C3DF}", - nfd: "\u{110A}\u{1169}\u{11AE}", - nfkc: "\u{C3DF}", - nfkd: "\u{110A}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{C3E0}", - nfc: "\u{C3E0}", - nfd: "\u{110A}\u{1169}\u{11AF}", - nfkc: "\u{C3E0}", - nfkd: "\u{110A}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{C3E1}", - nfc: "\u{C3E1}", - nfd: "\u{110A}\u{1169}\u{11B0}", - nfkc: "\u{C3E1}", - nfkd: "\u{110A}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{C3E2}", - nfc: "\u{C3E2}", - nfd: "\u{110A}\u{1169}\u{11B1}", - nfkc: "\u{C3E2}", - nfkd: "\u{110A}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{C3E3}", - nfc: "\u{C3E3}", - nfd: "\u{110A}\u{1169}\u{11B2}", - nfkc: "\u{C3E3}", - nfkd: "\u{110A}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{C3E4}", - nfc: "\u{C3E4}", - nfd: "\u{110A}\u{1169}\u{11B3}", - nfkc: "\u{C3E4}", - nfkd: "\u{110A}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{C3E5}", - nfc: "\u{C3E5}", - nfd: "\u{110A}\u{1169}\u{11B4}", - nfkc: "\u{C3E5}", - nfkd: "\u{110A}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{C3E6}", - nfc: "\u{C3E6}", - nfd: "\u{110A}\u{1169}\u{11B5}", - nfkc: "\u{C3E6}", - nfkd: "\u{110A}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{C3E7}", - nfc: "\u{C3E7}", - nfd: "\u{110A}\u{1169}\u{11B6}", - nfkc: "\u{C3E7}", - nfkd: "\u{110A}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{C3E8}", - nfc: "\u{C3E8}", - nfd: "\u{110A}\u{1169}\u{11B7}", - nfkc: "\u{C3E8}", - nfkd: "\u{110A}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{C3E9}", - nfc: "\u{C3E9}", - nfd: "\u{110A}\u{1169}\u{11B8}", - nfkc: "\u{C3E9}", - nfkd: "\u{110A}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{C3EA}", - nfc: "\u{C3EA}", - nfd: "\u{110A}\u{1169}\u{11B9}", - nfkc: "\u{C3EA}", - nfkd: "\u{110A}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{C3EB}", - nfc: "\u{C3EB}", - nfd: "\u{110A}\u{1169}\u{11BA}", - nfkc: "\u{C3EB}", - nfkd: "\u{110A}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{C3EC}", - nfc: "\u{C3EC}", - nfd: "\u{110A}\u{1169}\u{11BB}", - nfkc: "\u{C3EC}", - nfkd: "\u{110A}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{C3ED}", - nfc: "\u{C3ED}", - nfd: "\u{110A}\u{1169}\u{11BC}", - nfkc: "\u{C3ED}", - nfkd: "\u{110A}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{C3EE}", - nfc: "\u{C3EE}", - nfd: "\u{110A}\u{1169}\u{11BD}", - nfkc: "\u{C3EE}", - nfkd: "\u{110A}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{C3EF}", - nfc: "\u{C3EF}", - nfd: "\u{110A}\u{1169}\u{11BE}", - nfkc: "\u{C3EF}", - nfkd: "\u{110A}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{C3F0}", - nfc: "\u{C3F0}", - nfd: "\u{110A}\u{1169}\u{11BF}", - nfkc: "\u{C3F0}", - nfkd: "\u{110A}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{C3F1}", - nfc: "\u{C3F1}", - nfd: "\u{110A}\u{1169}\u{11C0}", - nfkc: "\u{C3F1}", - nfkd: "\u{110A}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{C3F2}", - nfc: "\u{C3F2}", - nfd: "\u{110A}\u{1169}\u{11C1}", - nfkc: "\u{C3F2}", - nfkd: "\u{110A}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{C3F3}", - nfc: "\u{C3F3}", - nfd: "\u{110A}\u{1169}\u{11C2}", - nfkc: "\u{C3F3}", - nfkd: "\u{110A}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{C3F4}", - nfc: "\u{C3F4}", - nfd: "\u{110A}\u{116A}", - nfkc: "\u{C3F4}", - nfkd: "\u{110A}\u{116A}", - }, - NormalizationTest { - source: "\u{C3F5}", - nfc: "\u{C3F5}", - nfd: "\u{110A}\u{116A}\u{11A8}", - nfkc: "\u{C3F5}", - nfkd: "\u{110A}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{C3F6}", - nfc: "\u{C3F6}", - nfd: "\u{110A}\u{116A}\u{11A9}", - nfkc: "\u{C3F6}", - nfkd: "\u{110A}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{C3F7}", - nfc: "\u{C3F7}", - nfd: "\u{110A}\u{116A}\u{11AA}", - nfkc: "\u{C3F7}", - nfkd: "\u{110A}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{C3F8}", - nfc: "\u{C3F8}", - nfd: "\u{110A}\u{116A}\u{11AB}", - nfkc: "\u{C3F8}", - nfkd: "\u{110A}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{C3F9}", - nfc: "\u{C3F9}", - nfd: "\u{110A}\u{116A}\u{11AC}", - nfkc: "\u{C3F9}", - nfkd: "\u{110A}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{C3FA}", - nfc: "\u{C3FA}", - nfd: "\u{110A}\u{116A}\u{11AD}", - nfkc: "\u{C3FA}", - nfkd: "\u{110A}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{C3FB}", - nfc: "\u{C3FB}", - nfd: "\u{110A}\u{116A}\u{11AE}", - nfkc: "\u{C3FB}", - nfkd: "\u{110A}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{C3FC}", - nfc: "\u{C3FC}", - nfd: "\u{110A}\u{116A}\u{11AF}", - nfkc: "\u{C3FC}", - nfkd: "\u{110A}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{C3FD}", - nfc: "\u{C3FD}", - nfd: "\u{110A}\u{116A}\u{11B0}", - nfkc: "\u{C3FD}", - nfkd: "\u{110A}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{C3FE}", - nfc: "\u{C3FE}", - nfd: "\u{110A}\u{116A}\u{11B1}", - nfkc: "\u{C3FE}", - nfkd: "\u{110A}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{C3FF}", - nfc: "\u{C3FF}", - nfd: "\u{110A}\u{116A}\u{11B2}", - nfkc: "\u{C3FF}", - nfkd: "\u{110A}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{C400}", - nfc: "\u{C400}", - nfd: "\u{110A}\u{116A}\u{11B3}", - nfkc: "\u{C400}", - nfkd: "\u{110A}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{C401}", - nfc: "\u{C401}", - nfd: "\u{110A}\u{116A}\u{11B4}", - nfkc: "\u{C401}", - nfkd: "\u{110A}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{C402}", - nfc: "\u{C402}", - nfd: "\u{110A}\u{116A}\u{11B5}", - nfkc: "\u{C402}", - nfkd: "\u{110A}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{C403}", - nfc: "\u{C403}", - nfd: "\u{110A}\u{116A}\u{11B6}", - nfkc: "\u{C403}", - nfkd: "\u{110A}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{C404}", - nfc: "\u{C404}", - nfd: "\u{110A}\u{116A}\u{11B7}", - nfkc: "\u{C404}", - nfkd: "\u{110A}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{C405}", - nfc: "\u{C405}", - nfd: "\u{110A}\u{116A}\u{11B8}", - nfkc: "\u{C405}", - nfkd: "\u{110A}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{C406}", - nfc: "\u{C406}", - nfd: "\u{110A}\u{116A}\u{11B9}", - nfkc: "\u{C406}", - nfkd: "\u{110A}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{C407}", - nfc: "\u{C407}", - nfd: "\u{110A}\u{116A}\u{11BA}", - nfkc: "\u{C407}", - nfkd: "\u{110A}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{C408}", - nfc: "\u{C408}", - nfd: "\u{110A}\u{116A}\u{11BB}", - nfkc: "\u{C408}", - nfkd: "\u{110A}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{C409}", - nfc: "\u{C409}", - nfd: "\u{110A}\u{116A}\u{11BC}", - nfkc: "\u{C409}", - nfkd: "\u{110A}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{C40A}", - nfc: "\u{C40A}", - nfd: "\u{110A}\u{116A}\u{11BD}", - nfkc: "\u{C40A}", - nfkd: "\u{110A}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{C40B}", - nfc: "\u{C40B}", - nfd: "\u{110A}\u{116A}\u{11BE}", - nfkc: "\u{C40B}", - nfkd: "\u{110A}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{C40C}", - nfc: "\u{C40C}", - nfd: "\u{110A}\u{116A}\u{11BF}", - nfkc: "\u{C40C}", - nfkd: "\u{110A}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{C40D}", - nfc: "\u{C40D}", - nfd: "\u{110A}\u{116A}\u{11C0}", - nfkc: "\u{C40D}", - nfkd: "\u{110A}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{C40E}", - nfc: "\u{C40E}", - nfd: "\u{110A}\u{116A}\u{11C1}", - nfkc: "\u{C40E}", - nfkd: "\u{110A}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{C40F}", - nfc: "\u{C40F}", - nfd: "\u{110A}\u{116A}\u{11C2}", - nfkc: "\u{C40F}", - nfkd: "\u{110A}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{C410}", - nfc: "\u{C410}", - nfd: "\u{110A}\u{116B}", - nfkc: "\u{C410}", - nfkd: "\u{110A}\u{116B}", - }, - NormalizationTest { - source: "\u{C411}", - nfc: "\u{C411}", - nfd: "\u{110A}\u{116B}\u{11A8}", - nfkc: "\u{C411}", - nfkd: "\u{110A}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{C412}", - nfc: "\u{C412}", - nfd: "\u{110A}\u{116B}\u{11A9}", - nfkc: "\u{C412}", - nfkd: "\u{110A}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{C413}", - nfc: "\u{C413}", - nfd: "\u{110A}\u{116B}\u{11AA}", - nfkc: "\u{C413}", - nfkd: "\u{110A}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{C414}", - nfc: "\u{C414}", - nfd: "\u{110A}\u{116B}\u{11AB}", - nfkc: "\u{C414}", - nfkd: "\u{110A}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{C415}", - nfc: "\u{C415}", - nfd: "\u{110A}\u{116B}\u{11AC}", - nfkc: "\u{C415}", - nfkd: "\u{110A}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{C416}", - nfc: "\u{C416}", - nfd: "\u{110A}\u{116B}\u{11AD}", - nfkc: "\u{C416}", - nfkd: "\u{110A}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{C417}", - nfc: "\u{C417}", - nfd: "\u{110A}\u{116B}\u{11AE}", - nfkc: "\u{C417}", - nfkd: "\u{110A}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{C418}", - nfc: "\u{C418}", - nfd: "\u{110A}\u{116B}\u{11AF}", - nfkc: "\u{C418}", - nfkd: "\u{110A}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{C419}", - nfc: "\u{C419}", - nfd: "\u{110A}\u{116B}\u{11B0}", - nfkc: "\u{C419}", - nfkd: "\u{110A}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{C41A}", - nfc: "\u{C41A}", - nfd: "\u{110A}\u{116B}\u{11B1}", - nfkc: "\u{C41A}", - nfkd: "\u{110A}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{C41B}", - nfc: "\u{C41B}", - nfd: "\u{110A}\u{116B}\u{11B2}", - nfkc: "\u{C41B}", - nfkd: "\u{110A}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{C41C}", - nfc: "\u{C41C}", - nfd: "\u{110A}\u{116B}\u{11B3}", - nfkc: "\u{C41C}", - nfkd: "\u{110A}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{C41D}", - nfc: "\u{C41D}", - nfd: "\u{110A}\u{116B}\u{11B4}", - nfkc: "\u{C41D}", - nfkd: "\u{110A}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{C41E}", - nfc: "\u{C41E}", - nfd: "\u{110A}\u{116B}\u{11B5}", - nfkc: "\u{C41E}", - nfkd: "\u{110A}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{C41F}", - nfc: "\u{C41F}", - nfd: "\u{110A}\u{116B}\u{11B6}", - nfkc: "\u{C41F}", - nfkd: "\u{110A}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{C420}", - nfc: "\u{C420}", - nfd: "\u{110A}\u{116B}\u{11B7}", - nfkc: "\u{C420}", - nfkd: "\u{110A}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{C421}", - nfc: "\u{C421}", - nfd: "\u{110A}\u{116B}\u{11B8}", - nfkc: "\u{C421}", - nfkd: "\u{110A}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{C422}", - nfc: "\u{C422}", - nfd: "\u{110A}\u{116B}\u{11B9}", - nfkc: "\u{C422}", - nfkd: "\u{110A}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{C423}", - nfc: "\u{C423}", - nfd: "\u{110A}\u{116B}\u{11BA}", - nfkc: "\u{C423}", - nfkd: "\u{110A}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{C424}", - nfc: "\u{C424}", - nfd: "\u{110A}\u{116B}\u{11BB}", - nfkc: "\u{C424}", - nfkd: "\u{110A}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{C425}", - nfc: "\u{C425}", - nfd: "\u{110A}\u{116B}\u{11BC}", - nfkc: "\u{C425}", - nfkd: "\u{110A}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{C426}", - nfc: "\u{C426}", - nfd: "\u{110A}\u{116B}\u{11BD}", - nfkc: "\u{C426}", - nfkd: "\u{110A}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{C427}", - nfc: "\u{C427}", - nfd: "\u{110A}\u{116B}\u{11BE}", - nfkc: "\u{C427}", - nfkd: "\u{110A}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{C428}", - nfc: "\u{C428}", - nfd: "\u{110A}\u{116B}\u{11BF}", - nfkc: "\u{C428}", - nfkd: "\u{110A}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{C429}", - nfc: "\u{C429}", - nfd: "\u{110A}\u{116B}\u{11C0}", - nfkc: "\u{C429}", - nfkd: "\u{110A}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{C42A}", - nfc: "\u{C42A}", - nfd: "\u{110A}\u{116B}\u{11C1}", - nfkc: "\u{C42A}", - nfkd: "\u{110A}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{C42B}", - nfc: "\u{C42B}", - nfd: "\u{110A}\u{116B}\u{11C2}", - nfkc: "\u{C42B}", - nfkd: "\u{110A}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{C42C}", - nfc: "\u{C42C}", - nfd: "\u{110A}\u{116C}", - nfkc: "\u{C42C}", - nfkd: "\u{110A}\u{116C}", - }, - NormalizationTest { - source: "\u{C42D}", - nfc: "\u{C42D}", - nfd: "\u{110A}\u{116C}\u{11A8}", - nfkc: "\u{C42D}", - nfkd: "\u{110A}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{C42E}", - nfc: "\u{C42E}", - nfd: "\u{110A}\u{116C}\u{11A9}", - nfkc: "\u{C42E}", - nfkd: "\u{110A}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{C42F}", - nfc: "\u{C42F}", - nfd: "\u{110A}\u{116C}\u{11AA}", - nfkc: "\u{C42F}", - nfkd: "\u{110A}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{C430}", - nfc: "\u{C430}", - nfd: "\u{110A}\u{116C}\u{11AB}", - nfkc: "\u{C430}", - nfkd: "\u{110A}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{C431}", - nfc: "\u{C431}", - nfd: "\u{110A}\u{116C}\u{11AC}", - nfkc: "\u{C431}", - nfkd: "\u{110A}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{C432}", - nfc: "\u{C432}", - nfd: "\u{110A}\u{116C}\u{11AD}", - nfkc: "\u{C432}", - nfkd: "\u{110A}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{C433}", - nfc: "\u{C433}", - nfd: "\u{110A}\u{116C}\u{11AE}", - nfkc: "\u{C433}", - nfkd: "\u{110A}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{C434}", - nfc: "\u{C434}", - nfd: "\u{110A}\u{116C}\u{11AF}", - nfkc: "\u{C434}", - nfkd: "\u{110A}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{C435}", - nfc: "\u{C435}", - nfd: "\u{110A}\u{116C}\u{11B0}", - nfkc: "\u{C435}", - nfkd: "\u{110A}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{C436}", - nfc: "\u{C436}", - nfd: "\u{110A}\u{116C}\u{11B1}", - nfkc: "\u{C436}", - nfkd: "\u{110A}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{C437}", - nfc: "\u{C437}", - nfd: "\u{110A}\u{116C}\u{11B2}", - nfkc: "\u{C437}", - nfkd: "\u{110A}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{C438}", - nfc: "\u{C438}", - nfd: "\u{110A}\u{116C}\u{11B3}", - nfkc: "\u{C438}", - nfkd: "\u{110A}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{C439}", - nfc: "\u{C439}", - nfd: "\u{110A}\u{116C}\u{11B4}", - nfkc: "\u{C439}", - nfkd: "\u{110A}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{C43A}", - nfc: "\u{C43A}", - nfd: "\u{110A}\u{116C}\u{11B5}", - nfkc: "\u{C43A}", - nfkd: "\u{110A}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{C43B}", - nfc: "\u{C43B}", - nfd: "\u{110A}\u{116C}\u{11B6}", - nfkc: "\u{C43B}", - nfkd: "\u{110A}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{C43C}", - nfc: "\u{C43C}", - nfd: "\u{110A}\u{116C}\u{11B7}", - nfkc: "\u{C43C}", - nfkd: "\u{110A}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{C43D}", - nfc: "\u{C43D}", - nfd: "\u{110A}\u{116C}\u{11B8}", - nfkc: "\u{C43D}", - nfkd: "\u{110A}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{C43E}", - nfc: "\u{C43E}", - nfd: "\u{110A}\u{116C}\u{11B9}", - nfkc: "\u{C43E}", - nfkd: "\u{110A}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{C43F}", - nfc: "\u{C43F}", - nfd: "\u{110A}\u{116C}\u{11BA}", - nfkc: "\u{C43F}", - nfkd: "\u{110A}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{C440}", - nfc: "\u{C440}", - nfd: "\u{110A}\u{116C}\u{11BB}", - nfkc: "\u{C440}", - nfkd: "\u{110A}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{C441}", - nfc: "\u{C441}", - nfd: "\u{110A}\u{116C}\u{11BC}", - nfkc: "\u{C441}", - nfkd: "\u{110A}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{C442}", - nfc: "\u{C442}", - nfd: "\u{110A}\u{116C}\u{11BD}", - nfkc: "\u{C442}", - nfkd: "\u{110A}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{C443}", - nfc: "\u{C443}", - nfd: "\u{110A}\u{116C}\u{11BE}", - nfkc: "\u{C443}", - nfkd: "\u{110A}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{C444}", - nfc: "\u{C444}", - nfd: "\u{110A}\u{116C}\u{11BF}", - nfkc: "\u{C444}", - nfkd: "\u{110A}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{C445}", - nfc: "\u{C445}", - nfd: "\u{110A}\u{116C}\u{11C0}", - nfkc: "\u{C445}", - nfkd: "\u{110A}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{C446}", - nfc: "\u{C446}", - nfd: "\u{110A}\u{116C}\u{11C1}", - nfkc: "\u{C446}", - nfkd: "\u{110A}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{C447}", - nfc: "\u{C447}", - nfd: "\u{110A}\u{116C}\u{11C2}", - nfkc: "\u{C447}", - nfkd: "\u{110A}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{C448}", - nfc: "\u{C448}", - nfd: "\u{110A}\u{116D}", - nfkc: "\u{C448}", - nfkd: "\u{110A}\u{116D}", - }, - NormalizationTest { - source: "\u{C449}", - nfc: "\u{C449}", - nfd: "\u{110A}\u{116D}\u{11A8}", - nfkc: "\u{C449}", - nfkd: "\u{110A}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{C44A}", - nfc: "\u{C44A}", - nfd: "\u{110A}\u{116D}\u{11A9}", - nfkc: "\u{C44A}", - nfkd: "\u{110A}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{C44B}", - nfc: "\u{C44B}", - nfd: "\u{110A}\u{116D}\u{11AA}", - nfkc: "\u{C44B}", - nfkd: "\u{110A}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{C44C}", - nfc: "\u{C44C}", - nfd: "\u{110A}\u{116D}\u{11AB}", - nfkc: "\u{C44C}", - nfkd: "\u{110A}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{C44D}", - nfc: "\u{C44D}", - nfd: "\u{110A}\u{116D}\u{11AC}", - nfkc: "\u{C44D}", - nfkd: "\u{110A}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{C44E}", - nfc: "\u{C44E}", - nfd: "\u{110A}\u{116D}\u{11AD}", - nfkc: "\u{C44E}", - nfkd: "\u{110A}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{C44F}", - nfc: "\u{C44F}", - nfd: "\u{110A}\u{116D}\u{11AE}", - nfkc: "\u{C44F}", - nfkd: "\u{110A}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{C450}", - nfc: "\u{C450}", - nfd: "\u{110A}\u{116D}\u{11AF}", - nfkc: "\u{C450}", - nfkd: "\u{110A}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{C451}", - nfc: "\u{C451}", - nfd: "\u{110A}\u{116D}\u{11B0}", - nfkc: "\u{C451}", - nfkd: "\u{110A}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{C452}", - nfc: "\u{C452}", - nfd: "\u{110A}\u{116D}\u{11B1}", - nfkc: "\u{C452}", - nfkd: "\u{110A}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{C453}", - nfc: "\u{C453}", - nfd: "\u{110A}\u{116D}\u{11B2}", - nfkc: "\u{C453}", - nfkd: "\u{110A}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{C454}", - nfc: "\u{C454}", - nfd: "\u{110A}\u{116D}\u{11B3}", - nfkc: "\u{C454}", - nfkd: "\u{110A}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{C455}", - nfc: "\u{C455}", - nfd: "\u{110A}\u{116D}\u{11B4}", - nfkc: "\u{C455}", - nfkd: "\u{110A}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{C456}", - nfc: "\u{C456}", - nfd: "\u{110A}\u{116D}\u{11B5}", - nfkc: "\u{C456}", - nfkd: "\u{110A}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{C457}", - nfc: "\u{C457}", - nfd: "\u{110A}\u{116D}\u{11B6}", - nfkc: "\u{C457}", - nfkd: "\u{110A}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{C458}", - nfc: "\u{C458}", - nfd: "\u{110A}\u{116D}\u{11B7}", - nfkc: "\u{C458}", - nfkd: "\u{110A}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{C459}", - nfc: "\u{C459}", - nfd: "\u{110A}\u{116D}\u{11B8}", - nfkc: "\u{C459}", - nfkd: "\u{110A}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{C45A}", - nfc: "\u{C45A}", - nfd: "\u{110A}\u{116D}\u{11B9}", - nfkc: "\u{C45A}", - nfkd: "\u{110A}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{C45B}", - nfc: "\u{C45B}", - nfd: "\u{110A}\u{116D}\u{11BA}", - nfkc: "\u{C45B}", - nfkd: "\u{110A}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{C45C}", - nfc: "\u{C45C}", - nfd: "\u{110A}\u{116D}\u{11BB}", - nfkc: "\u{C45C}", - nfkd: "\u{110A}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{C45D}", - nfc: "\u{C45D}", - nfd: "\u{110A}\u{116D}\u{11BC}", - nfkc: "\u{C45D}", - nfkd: "\u{110A}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{C45E}", - nfc: "\u{C45E}", - nfd: "\u{110A}\u{116D}\u{11BD}", - nfkc: "\u{C45E}", - nfkd: "\u{110A}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{C45F}", - nfc: "\u{C45F}", - nfd: "\u{110A}\u{116D}\u{11BE}", - nfkc: "\u{C45F}", - nfkd: "\u{110A}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{C460}", - nfc: "\u{C460}", - nfd: "\u{110A}\u{116D}\u{11BF}", - nfkc: "\u{C460}", - nfkd: "\u{110A}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{C461}", - nfc: "\u{C461}", - nfd: "\u{110A}\u{116D}\u{11C0}", - nfkc: "\u{C461}", - nfkd: "\u{110A}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{C462}", - nfc: "\u{C462}", - nfd: "\u{110A}\u{116D}\u{11C1}", - nfkc: "\u{C462}", - nfkd: "\u{110A}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{C463}", - nfc: "\u{C463}", - nfd: "\u{110A}\u{116D}\u{11C2}", - nfkc: "\u{C463}", - nfkd: "\u{110A}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{C464}", - nfc: "\u{C464}", - nfd: "\u{110A}\u{116E}", - nfkc: "\u{C464}", - nfkd: "\u{110A}\u{116E}", - }, - NormalizationTest { - source: "\u{C465}", - nfc: "\u{C465}", - nfd: "\u{110A}\u{116E}\u{11A8}", - nfkc: "\u{C465}", - nfkd: "\u{110A}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{C466}", - nfc: "\u{C466}", - nfd: "\u{110A}\u{116E}\u{11A9}", - nfkc: "\u{C466}", - nfkd: "\u{110A}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{C467}", - nfc: "\u{C467}", - nfd: "\u{110A}\u{116E}\u{11AA}", - nfkc: "\u{C467}", - nfkd: "\u{110A}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{C468}", - nfc: "\u{C468}", - nfd: "\u{110A}\u{116E}\u{11AB}", - nfkc: "\u{C468}", - nfkd: "\u{110A}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{C469}", - nfc: "\u{C469}", - nfd: "\u{110A}\u{116E}\u{11AC}", - nfkc: "\u{C469}", - nfkd: "\u{110A}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{C46A}", - nfc: "\u{C46A}", - nfd: "\u{110A}\u{116E}\u{11AD}", - nfkc: "\u{C46A}", - nfkd: "\u{110A}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{C46B}", - nfc: "\u{C46B}", - nfd: "\u{110A}\u{116E}\u{11AE}", - nfkc: "\u{C46B}", - nfkd: "\u{110A}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{C46C}", - nfc: "\u{C46C}", - nfd: "\u{110A}\u{116E}\u{11AF}", - nfkc: "\u{C46C}", - nfkd: "\u{110A}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{C46D}", - nfc: "\u{C46D}", - nfd: "\u{110A}\u{116E}\u{11B0}", - nfkc: "\u{C46D}", - nfkd: "\u{110A}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{C46E}", - nfc: "\u{C46E}", - nfd: "\u{110A}\u{116E}\u{11B1}", - nfkc: "\u{C46E}", - nfkd: "\u{110A}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{C46F}", - nfc: "\u{C46F}", - nfd: "\u{110A}\u{116E}\u{11B2}", - nfkc: "\u{C46F}", - nfkd: "\u{110A}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{C470}", - nfc: "\u{C470}", - nfd: "\u{110A}\u{116E}\u{11B3}", - nfkc: "\u{C470}", - nfkd: "\u{110A}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{C471}", - nfc: "\u{C471}", - nfd: "\u{110A}\u{116E}\u{11B4}", - nfkc: "\u{C471}", - nfkd: "\u{110A}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{C472}", - nfc: "\u{C472}", - nfd: "\u{110A}\u{116E}\u{11B5}", - nfkc: "\u{C472}", - nfkd: "\u{110A}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{C473}", - nfc: "\u{C473}", - nfd: "\u{110A}\u{116E}\u{11B6}", - nfkc: "\u{C473}", - nfkd: "\u{110A}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{C474}", - nfc: "\u{C474}", - nfd: "\u{110A}\u{116E}\u{11B7}", - nfkc: "\u{C474}", - nfkd: "\u{110A}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{C475}", - nfc: "\u{C475}", - nfd: "\u{110A}\u{116E}\u{11B8}", - nfkc: "\u{C475}", - nfkd: "\u{110A}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{C476}", - nfc: "\u{C476}", - nfd: "\u{110A}\u{116E}\u{11B9}", - nfkc: "\u{C476}", - nfkd: "\u{110A}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{C477}", - nfc: "\u{C477}", - nfd: "\u{110A}\u{116E}\u{11BA}", - nfkc: "\u{C477}", - nfkd: "\u{110A}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{C478}", - nfc: "\u{C478}", - nfd: "\u{110A}\u{116E}\u{11BB}", - nfkc: "\u{C478}", - nfkd: "\u{110A}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{C479}", - nfc: "\u{C479}", - nfd: "\u{110A}\u{116E}\u{11BC}", - nfkc: "\u{C479}", - nfkd: "\u{110A}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{C47A}", - nfc: "\u{C47A}", - nfd: "\u{110A}\u{116E}\u{11BD}", - nfkc: "\u{C47A}", - nfkd: "\u{110A}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{C47B}", - nfc: "\u{C47B}", - nfd: "\u{110A}\u{116E}\u{11BE}", - nfkc: "\u{C47B}", - nfkd: "\u{110A}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{C47C}", - nfc: "\u{C47C}", - nfd: "\u{110A}\u{116E}\u{11BF}", - nfkc: "\u{C47C}", - nfkd: "\u{110A}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{C47D}", - nfc: "\u{C47D}", - nfd: "\u{110A}\u{116E}\u{11C0}", - nfkc: "\u{C47D}", - nfkd: "\u{110A}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{C47E}", - nfc: "\u{C47E}", - nfd: "\u{110A}\u{116E}\u{11C1}", - nfkc: "\u{C47E}", - nfkd: "\u{110A}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{C47F}", - nfc: "\u{C47F}", - nfd: "\u{110A}\u{116E}\u{11C2}", - nfkc: "\u{C47F}", - nfkd: "\u{110A}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{C480}", - nfc: "\u{C480}", - nfd: "\u{110A}\u{116F}", - nfkc: "\u{C480}", - nfkd: "\u{110A}\u{116F}", - }, - NormalizationTest { - source: "\u{C481}", - nfc: "\u{C481}", - nfd: "\u{110A}\u{116F}\u{11A8}", - nfkc: "\u{C481}", - nfkd: "\u{110A}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{C482}", - nfc: "\u{C482}", - nfd: "\u{110A}\u{116F}\u{11A9}", - nfkc: "\u{C482}", - nfkd: "\u{110A}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{C483}", - nfc: "\u{C483}", - nfd: "\u{110A}\u{116F}\u{11AA}", - nfkc: "\u{C483}", - nfkd: "\u{110A}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{C484}", - nfc: "\u{C484}", - nfd: "\u{110A}\u{116F}\u{11AB}", - nfkc: "\u{C484}", - nfkd: "\u{110A}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{C485}", - nfc: "\u{C485}", - nfd: "\u{110A}\u{116F}\u{11AC}", - nfkc: "\u{C485}", - nfkd: "\u{110A}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{C486}", - nfc: "\u{C486}", - nfd: "\u{110A}\u{116F}\u{11AD}", - nfkc: "\u{C486}", - nfkd: "\u{110A}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{C487}", - nfc: "\u{C487}", - nfd: "\u{110A}\u{116F}\u{11AE}", - nfkc: "\u{C487}", - nfkd: "\u{110A}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{C488}", - nfc: "\u{C488}", - nfd: "\u{110A}\u{116F}\u{11AF}", - nfkc: "\u{C488}", - nfkd: "\u{110A}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{C489}", - nfc: "\u{C489}", - nfd: "\u{110A}\u{116F}\u{11B0}", - nfkc: "\u{C489}", - nfkd: "\u{110A}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{C48A}", - nfc: "\u{C48A}", - nfd: "\u{110A}\u{116F}\u{11B1}", - nfkc: "\u{C48A}", - nfkd: "\u{110A}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{C48B}", - nfc: "\u{C48B}", - nfd: "\u{110A}\u{116F}\u{11B2}", - nfkc: "\u{C48B}", - nfkd: "\u{110A}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{C48C}", - nfc: "\u{C48C}", - nfd: "\u{110A}\u{116F}\u{11B3}", - nfkc: "\u{C48C}", - nfkd: "\u{110A}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{C48D}", - nfc: "\u{C48D}", - nfd: "\u{110A}\u{116F}\u{11B4}", - nfkc: "\u{C48D}", - nfkd: "\u{110A}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{C48E}", - nfc: "\u{C48E}", - nfd: "\u{110A}\u{116F}\u{11B5}", - nfkc: "\u{C48E}", - nfkd: "\u{110A}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{C48F}", - nfc: "\u{C48F}", - nfd: "\u{110A}\u{116F}\u{11B6}", - nfkc: "\u{C48F}", - nfkd: "\u{110A}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{C490}", - nfc: "\u{C490}", - nfd: "\u{110A}\u{116F}\u{11B7}", - nfkc: "\u{C490}", - nfkd: "\u{110A}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{C491}", - nfc: "\u{C491}", - nfd: "\u{110A}\u{116F}\u{11B8}", - nfkc: "\u{C491}", - nfkd: "\u{110A}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{C492}", - nfc: "\u{C492}", - nfd: "\u{110A}\u{116F}\u{11B9}", - nfkc: "\u{C492}", - nfkd: "\u{110A}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{C493}", - nfc: "\u{C493}", - nfd: "\u{110A}\u{116F}\u{11BA}", - nfkc: "\u{C493}", - nfkd: "\u{110A}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{C494}", - nfc: "\u{C494}", - nfd: "\u{110A}\u{116F}\u{11BB}", - nfkc: "\u{C494}", - nfkd: "\u{110A}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{C495}", - nfc: "\u{C495}", - nfd: "\u{110A}\u{116F}\u{11BC}", - nfkc: "\u{C495}", - nfkd: "\u{110A}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{C496}", - nfc: "\u{C496}", - nfd: "\u{110A}\u{116F}\u{11BD}", - nfkc: "\u{C496}", - nfkd: "\u{110A}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{C497}", - nfc: "\u{C497}", - nfd: "\u{110A}\u{116F}\u{11BE}", - nfkc: "\u{C497}", - nfkd: "\u{110A}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{C498}", - nfc: "\u{C498}", - nfd: "\u{110A}\u{116F}\u{11BF}", - nfkc: "\u{C498}", - nfkd: "\u{110A}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{C499}", - nfc: "\u{C499}", - nfd: "\u{110A}\u{116F}\u{11C0}", - nfkc: "\u{C499}", - nfkd: "\u{110A}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{C49A}", - nfc: "\u{C49A}", - nfd: "\u{110A}\u{116F}\u{11C1}", - nfkc: "\u{C49A}", - nfkd: "\u{110A}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{C49B}", - nfc: "\u{C49B}", - nfd: "\u{110A}\u{116F}\u{11C2}", - nfkc: "\u{C49B}", - nfkd: "\u{110A}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{C49C}", - nfc: "\u{C49C}", - nfd: "\u{110A}\u{1170}", - nfkc: "\u{C49C}", - nfkd: "\u{110A}\u{1170}", - }, - NormalizationTest { - source: "\u{C49D}", - nfc: "\u{C49D}", - nfd: "\u{110A}\u{1170}\u{11A8}", - nfkc: "\u{C49D}", - nfkd: "\u{110A}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{C49E}", - nfc: "\u{C49E}", - nfd: "\u{110A}\u{1170}\u{11A9}", - nfkc: "\u{C49E}", - nfkd: "\u{110A}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{C49F}", - nfc: "\u{C49F}", - nfd: "\u{110A}\u{1170}\u{11AA}", - nfkc: "\u{C49F}", - nfkd: "\u{110A}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{C4A0}", - nfc: "\u{C4A0}", - nfd: "\u{110A}\u{1170}\u{11AB}", - nfkc: "\u{C4A0}", - nfkd: "\u{110A}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{C4A1}", - nfc: "\u{C4A1}", - nfd: "\u{110A}\u{1170}\u{11AC}", - nfkc: "\u{C4A1}", - nfkd: "\u{110A}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{C4A2}", - nfc: "\u{C4A2}", - nfd: "\u{110A}\u{1170}\u{11AD}", - nfkc: "\u{C4A2}", - nfkd: "\u{110A}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{C4A3}", - nfc: "\u{C4A3}", - nfd: "\u{110A}\u{1170}\u{11AE}", - nfkc: "\u{C4A3}", - nfkd: "\u{110A}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{C4A4}", - nfc: "\u{C4A4}", - nfd: "\u{110A}\u{1170}\u{11AF}", - nfkc: "\u{C4A4}", - nfkd: "\u{110A}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{C4A5}", - nfc: "\u{C4A5}", - nfd: "\u{110A}\u{1170}\u{11B0}", - nfkc: "\u{C4A5}", - nfkd: "\u{110A}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{C4A6}", - nfc: "\u{C4A6}", - nfd: "\u{110A}\u{1170}\u{11B1}", - nfkc: "\u{C4A6}", - nfkd: "\u{110A}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{C4A7}", - nfc: "\u{C4A7}", - nfd: "\u{110A}\u{1170}\u{11B2}", - nfkc: "\u{C4A7}", - nfkd: "\u{110A}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{C4A8}", - nfc: "\u{C4A8}", - nfd: "\u{110A}\u{1170}\u{11B3}", - nfkc: "\u{C4A8}", - nfkd: "\u{110A}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{C4A9}", - nfc: "\u{C4A9}", - nfd: "\u{110A}\u{1170}\u{11B4}", - nfkc: "\u{C4A9}", - nfkd: "\u{110A}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{C4AA}", - nfc: "\u{C4AA}", - nfd: "\u{110A}\u{1170}\u{11B5}", - nfkc: "\u{C4AA}", - nfkd: "\u{110A}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{C4AB}", - nfc: "\u{C4AB}", - nfd: "\u{110A}\u{1170}\u{11B6}", - nfkc: "\u{C4AB}", - nfkd: "\u{110A}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{C4AC}", - nfc: "\u{C4AC}", - nfd: "\u{110A}\u{1170}\u{11B7}", - nfkc: "\u{C4AC}", - nfkd: "\u{110A}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{C4AD}", - nfc: "\u{C4AD}", - nfd: "\u{110A}\u{1170}\u{11B8}", - nfkc: "\u{C4AD}", - nfkd: "\u{110A}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{C4AE}", - nfc: "\u{C4AE}", - nfd: "\u{110A}\u{1170}\u{11B9}", - nfkc: "\u{C4AE}", - nfkd: "\u{110A}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{C4AF}", - nfc: "\u{C4AF}", - nfd: "\u{110A}\u{1170}\u{11BA}", - nfkc: "\u{C4AF}", - nfkd: "\u{110A}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{C4B0}", - nfc: "\u{C4B0}", - nfd: "\u{110A}\u{1170}\u{11BB}", - nfkc: "\u{C4B0}", - nfkd: "\u{110A}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{C4B1}", - nfc: "\u{C4B1}", - nfd: "\u{110A}\u{1170}\u{11BC}", - nfkc: "\u{C4B1}", - nfkd: "\u{110A}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{C4B2}", - nfc: "\u{C4B2}", - nfd: "\u{110A}\u{1170}\u{11BD}", - nfkc: "\u{C4B2}", - nfkd: "\u{110A}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{C4B3}", - nfc: "\u{C4B3}", - nfd: "\u{110A}\u{1170}\u{11BE}", - nfkc: "\u{C4B3}", - nfkd: "\u{110A}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{C4B4}", - nfc: "\u{C4B4}", - nfd: "\u{110A}\u{1170}\u{11BF}", - nfkc: "\u{C4B4}", - nfkd: "\u{110A}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{C4B5}", - nfc: "\u{C4B5}", - nfd: "\u{110A}\u{1170}\u{11C0}", - nfkc: "\u{C4B5}", - nfkd: "\u{110A}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{C4B6}", - nfc: "\u{C4B6}", - nfd: "\u{110A}\u{1170}\u{11C1}", - nfkc: "\u{C4B6}", - nfkd: "\u{110A}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{C4B7}", - nfc: "\u{C4B7}", - nfd: "\u{110A}\u{1170}\u{11C2}", - nfkc: "\u{C4B7}", - nfkd: "\u{110A}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{C4B8}", - nfc: "\u{C4B8}", - nfd: "\u{110A}\u{1171}", - nfkc: "\u{C4B8}", - nfkd: "\u{110A}\u{1171}", - }, - NormalizationTest { - source: "\u{C4B9}", - nfc: "\u{C4B9}", - nfd: "\u{110A}\u{1171}\u{11A8}", - nfkc: "\u{C4B9}", - nfkd: "\u{110A}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{C4BA}", - nfc: "\u{C4BA}", - nfd: "\u{110A}\u{1171}\u{11A9}", - nfkc: "\u{C4BA}", - nfkd: "\u{110A}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{C4BB}", - nfc: "\u{C4BB}", - nfd: "\u{110A}\u{1171}\u{11AA}", - nfkc: "\u{C4BB}", - nfkd: "\u{110A}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{C4BC}", - nfc: "\u{C4BC}", - nfd: "\u{110A}\u{1171}\u{11AB}", - nfkc: "\u{C4BC}", - nfkd: "\u{110A}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{C4BD}", - nfc: "\u{C4BD}", - nfd: "\u{110A}\u{1171}\u{11AC}", - nfkc: "\u{C4BD}", - nfkd: "\u{110A}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{C4BE}", - nfc: "\u{C4BE}", - nfd: "\u{110A}\u{1171}\u{11AD}", - nfkc: "\u{C4BE}", - nfkd: "\u{110A}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{C4BF}", - nfc: "\u{C4BF}", - nfd: "\u{110A}\u{1171}\u{11AE}", - nfkc: "\u{C4BF}", - nfkd: "\u{110A}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{C4C0}", - nfc: "\u{C4C0}", - nfd: "\u{110A}\u{1171}\u{11AF}", - nfkc: "\u{C4C0}", - nfkd: "\u{110A}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{C4C1}", - nfc: "\u{C4C1}", - nfd: "\u{110A}\u{1171}\u{11B0}", - nfkc: "\u{C4C1}", - nfkd: "\u{110A}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{C4C2}", - nfc: "\u{C4C2}", - nfd: "\u{110A}\u{1171}\u{11B1}", - nfkc: "\u{C4C2}", - nfkd: "\u{110A}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{C4C3}", - nfc: "\u{C4C3}", - nfd: "\u{110A}\u{1171}\u{11B2}", - nfkc: "\u{C4C3}", - nfkd: "\u{110A}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{C4C4}", - nfc: "\u{C4C4}", - nfd: "\u{110A}\u{1171}\u{11B3}", - nfkc: "\u{C4C4}", - nfkd: "\u{110A}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{C4C5}", - nfc: "\u{C4C5}", - nfd: "\u{110A}\u{1171}\u{11B4}", - nfkc: "\u{C4C5}", - nfkd: "\u{110A}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{C4C6}", - nfc: "\u{C4C6}", - nfd: "\u{110A}\u{1171}\u{11B5}", - nfkc: "\u{C4C6}", - nfkd: "\u{110A}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{C4C7}", - nfc: "\u{C4C7}", - nfd: "\u{110A}\u{1171}\u{11B6}", - nfkc: "\u{C4C7}", - nfkd: "\u{110A}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{C4C8}", - nfc: "\u{C4C8}", - nfd: "\u{110A}\u{1171}\u{11B7}", - nfkc: "\u{C4C8}", - nfkd: "\u{110A}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{C4C9}", - nfc: "\u{C4C9}", - nfd: "\u{110A}\u{1171}\u{11B8}", - nfkc: "\u{C4C9}", - nfkd: "\u{110A}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{C4CA}", - nfc: "\u{C4CA}", - nfd: "\u{110A}\u{1171}\u{11B9}", - nfkc: "\u{C4CA}", - nfkd: "\u{110A}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{C4CB}", - nfc: "\u{C4CB}", - nfd: "\u{110A}\u{1171}\u{11BA}", - nfkc: "\u{C4CB}", - nfkd: "\u{110A}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{C4CC}", - nfc: "\u{C4CC}", - nfd: "\u{110A}\u{1171}\u{11BB}", - nfkc: "\u{C4CC}", - nfkd: "\u{110A}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{C4CD}", - nfc: "\u{C4CD}", - nfd: "\u{110A}\u{1171}\u{11BC}", - nfkc: "\u{C4CD}", - nfkd: "\u{110A}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{C4CE}", - nfc: "\u{C4CE}", - nfd: "\u{110A}\u{1171}\u{11BD}", - nfkc: "\u{C4CE}", - nfkd: "\u{110A}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{C4CF}", - nfc: "\u{C4CF}", - nfd: "\u{110A}\u{1171}\u{11BE}", - nfkc: "\u{C4CF}", - nfkd: "\u{110A}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{C4D0}", - nfc: "\u{C4D0}", - nfd: "\u{110A}\u{1171}\u{11BF}", - nfkc: "\u{C4D0}", - nfkd: "\u{110A}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{C4D1}", - nfc: "\u{C4D1}", - nfd: "\u{110A}\u{1171}\u{11C0}", - nfkc: "\u{C4D1}", - nfkd: "\u{110A}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{C4D2}", - nfc: "\u{C4D2}", - nfd: "\u{110A}\u{1171}\u{11C1}", - nfkc: "\u{C4D2}", - nfkd: "\u{110A}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{C4D3}", - nfc: "\u{C4D3}", - nfd: "\u{110A}\u{1171}\u{11C2}", - nfkc: "\u{C4D3}", - nfkd: "\u{110A}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{C4D4}", - nfc: "\u{C4D4}", - nfd: "\u{110A}\u{1172}", - nfkc: "\u{C4D4}", - nfkd: "\u{110A}\u{1172}", - }, - NormalizationTest { - source: "\u{C4D5}", - nfc: "\u{C4D5}", - nfd: "\u{110A}\u{1172}\u{11A8}", - nfkc: "\u{C4D5}", - nfkd: "\u{110A}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{C4D6}", - nfc: "\u{C4D6}", - nfd: "\u{110A}\u{1172}\u{11A9}", - nfkc: "\u{C4D6}", - nfkd: "\u{110A}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{C4D7}", - nfc: "\u{C4D7}", - nfd: "\u{110A}\u{1172}\u{11AA}", - nfkc: "\u{C4D7}", - nfkd: "\u{110A}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{C4D8}", - nfc: "\u{C4D8}", - nfd: "\u{110A}\u{1172}\u{11AB}", - nfkc: "\u{C4D8}", - nfkd: "\u{110A}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{C4D9}", - nfc: "\u{C4D9}", - nfd: "\u{110A}\u{1172}\u{11AC}", - nfkc: "\u{C4D9}", - nfkd: "\u{110A}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{C4DA}", - nfc: "\u{C4DA}", - nfd: "\u{110A}\u{1172}\u{11AD}", - nfkc: "\u{C4DA}", - nfkd: "\u{110A}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{C4DB}", - nfc: "\u{C4DB}", - nfd: "\u{110A}\u{1172}\u{11AE}", - nfkc: "\u{C4DB}", - nfkd: "\u{110A}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{C4DC}", - nfc: "\u{C4DC}", - nfd: "\u{110A}\u{1172}\u{11AF}", - nfkc: "\u{C4DC}", - nfkd: "\u{110A}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{C4DD}", - nfc: "\u{C4DD}", - nfd: "\u{110A}\u{1172}\u{11B0}", - nfkc: "\u{C4DD}", - nfkd: "\u{110A}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{C4DE}", - nfc: "\u{C4DE}", - nfd: "\u{110A}\u{1172}\u{11B1}", - nfkc: "\u{C4DE}", - nfkd: "\u{110A}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{C4DF}", - nfc: "\u{C4DF}", - nfd: "\u{110A}\u{1172}\u{11B2}", - nfkc: "\u{C4DF}", - nfkd: "\u{110A}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{C4E0}", - nfc: "\u{C4E0}", - nfd: "\u{110A}\u{1172}\u{11B3}", - nfkc: "\u{C4E0}", - nfkd: "\u{110A}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{C4E1}", - nfc: "\u{C4E1}", - nfd: "\u{110A}\u{1172}\u{11B4}", - nfkc: "\u{C4E1}", - nfkd: "\u{110A}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{C4E2}", - nfc: "\u{C4E2}", - nfd: "\u{110A}\u{1172}\u{11B5}", - nfkc: "\u{C4E2}", - nfkd: "\u{110A}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{C4E3}", - nfc: "\u{C4E3}", - nfd: "\u{110A}\u{1172}\u{11B6}", - nfkc: "\u{C4E3}", - nfkd: "\u{110A}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{C4E4}", - nfc: "\u{C4E4}", - nfd: "\u{110A}\u{1172}\u{11B7}", - nfkc: "\u{C4E4}", - nfkd: "\u{110A}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{C4E5}", - nfc: "\u{C4E5}", - nfd: "\u{110A}\u{1172}\u{11B8}", - nfkc: "\u{C4E5}", - nfkd: "\u{110A}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{C4E6}", - nfc: "\u{C4E6}", - nfd: "\u{110A}\u{1172}\u{11B9}", - nfkc: "\u{C4E6}", - nfkd: "\u{110A}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{C4E7}", - nfc: "\u{C4E7}", - nfd: "\u{110A}\u{1172}\u{11BA}", - nfkc: "\u{C4E7}", - nfkd: "\u{110A}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{C4E8}", - nfc: "\u{C4E8}", - nfd: "\u{110A}\u{1172}\u{11BB}", - nfkc: "\u{C4E8}", - nfkd: "\u{110A}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{C4E9}", - nfc: "\u{C4E9}", - nfd: "\u{110A}\u{1172}\u{11BC}", - nfkc: "\u{C4E9}", - nfkd: "\u{110A}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{C4EA}", - nfc: "\u{C4EA}", - nfd: "\u{110A}\u{1172}\u{11BD}", - nfkc: "\u{C4EA}", - nfkd: "\u{110A}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{C4EB}", - nfc: "\u{C4EB}", - nfd: "\u{110A}\u{1172}\u{11BE}", - nfkc: "\u{C4EB}", - nfkd: "\u{110A}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{C4EC}", - nfc: "\u{C4EC}", - nfd: "\u{110A}\u{1172}\u{11BF}", - nfkc: "\u{C4EC}", - nfkd: "\u{110A}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{C4ED}", - nfc: "\u{C4ED}", - nfd: "\u{110A}\u{1172}\u{11C0}", - nfkc: "\u{C4ED}", - nfkd: "\u{110A}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{C4EE}", - nfc: "\u{C4EE}", - nfd: "\u{110A}\u{1172}\u{11C1}", - nfkc: "\u{C4EE}", - nfkd: "\u{110A}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{C4EF}", - nfc: "\u{C4EF}", - nfd: "\u{110A}\u{1172}\u{11C2}", - nfkc: "\u{C4EF}", - nfkd: "\u{110A}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{C4F0}", - nfc: "\u{C4F0}", - nfd: "\u{110A}\u{1173}", - nfkc: "\u{C4F0}", - nfkd: "\u{110A}\u{1173}", - }, - NormalizationTest { - source: "\u{C4F1}", - nfc: "\u{C4F1}", - nfd: "\u{110A}\u{1173}\u{11A8}", - nfkc: "\u{C4F1}", - nfkd: "\u{110A}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{C4F2}", - nfc: "\u{C4F2}", - nfd: "\u{110A}\u{1173}\u{11A9}", - nfkc: "\u{C4F2}", - nfkd: "\u{110A}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{C4F3}", - nfc: "\u{C4F3}", - nfd: "\u{110A}\u{1173}\u{11AA}", - nfkc: "\u{C4F3}", - nfkd: "\u{110A}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{C4F4}", - nfc: "\u{C4F4}", - nfd: "\u{110A}\u{1173}\u{11AB}", - nfkc: "\u{C4F4}", - nfkd: "\u{110A}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{C4F5}", - nfc: "\u{C4F5}", - nfd: "\u{110A}\u{1173}\u{11AC}", - nfkc: "\u{C4F5}", - nfkd: "\u{110A}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{C4F6}", - nfc: "\u{C4F6}", - nfd: "\u{110A}\u{1173}\u{11AD}", - nfkc: "\u{C4F6}", - nfkd: "\u{110A}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{C4F7}", - nfc: "\u{C4F7}", - nfd: "\u{110A}\u{1173}\u{11AE}", - nfkc: "\u{C4F7}", - nfkd: "\u{110A}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{C4F8}", - nfc: "\u{C4F8}", - nfd: "\u{110A}\u{1173}\u{11AF}", - nfkc: "\u{C4F8}", - nfkd: "\u{110A}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{C4F9}", - nfc: "\u{C4F9}", - nfd: "\u{110A}\u{1173}\u{11B0}", - nfkc: "\u{C4F9}", - nfkd: "\u{110A}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{C4FA}", - nfc: "\u{C4FA}", - nfd: "\u{110A}\u{1173}\u{11B1}", - nfkc: "\u{C4FA}", - nfkd: "\u{110A}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{C4FB}", - nfc: "\u{C4FB}", - nfd: "\u{110A}\u{1173}\u{11B2}", - nfkc: "\u{C4FB}", - nfkd: "\u{110A}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{C4FC}", - nfc: "\u{C4FC}", - nfd: "\u{110A}\u{1173}\u{11B3}", - nfkc: "\u{C4FC}", - nfkd: "\u{110A}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{C4FD}", - nfc: "\u{C4FD}", - nfd: "\u{110A}\u{1173}\u{11B4}", - nfkc: "\u{C4FD}", - nfkd: "\u{110A}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{C4FE}", - nfc: "\u{C4FE}", - nfd: "\u{110A}\u{1173}\u{11B5}", - nfkc: "\u{C4FE}", - nfkd: "\u{110A}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{C4FF}", - nfc: "\u{C4FF}", - nfd: "\u{110A}\u{1173}\u{11B6}", - nfkc: "\u{C4FF}", - nfkd: "\u{110A}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{C500}", - nfc: "\u{C500}", - nfd: "\u{110A}\u{1173}\u{11B7}", - nfkc: "\u{C500}", - nfkd: "\u{110A}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{C501}", - nfc: "\u{C501}", - nfd: "\u{110A}\u{1173}\u{11B8}", - nfkc: "\u{C501}", - nfkd: "\u{110A}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{C502}", - nfc: "\u{C502}", - nfd: "\u{110A}\u{1173}\u{11B9}", - nfkc: "\u{C502}", - nfkd: "\u{110A}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{C503}", - nfc: "\u{C503}", - nfd: "\u{110A}\u{1173}\u{11BA}", - nfkc: "\u{C503}", - nfkd: "\u{110A}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{C504}", - nfc: "\u{C504}", - nfd: "\u{110A}\u{1173}\u{11BB}", - nfkc: "\u{C504}", - nfkd: "\u{110A}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{C505}", - nfc: "\u{C505}", - nfd: "\u{110A}\u{1173}\u{11BC}", - nfkc: "\u{C505}", - nfkd: "\u{110A}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{C506}", - nfc: "\u{C506}", - nfd: "\u{110A}\u{1173}\u{11BD}", - nfkc: "\u{C506}", - nfkd: "\u{110A}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{C507}", - nfc: "\u{C507}", - nfd: "\u{110A}\u{1173}\u{11BE}", - nfkc: "\u{C507}", - nfkd: "\u{110A}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{C508}", - nfc: "\u{C508}", - nfd: "\u{110A}\u{1173}\u{11BF}", - nfkc: "\u{C508}", - nfkd: "\u{110A}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{C509}", - nfc: "\u{C509}", - nfd: "\u{110A}\u{1173}\u{11C0}", - nfkc: "\u{C509}", - nfkd: "\u{110A}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{C50A}", - nfc: "\u{C50A}", - nfd: "\u{110A}\u{1173}\u{11C1}", - nfkc: "\u{C50A}", - nfkd: "\u{110A}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{C50B}", - nfc: "\u{C50B}", - nfd: "\u{110A}\u{1173}\u{11C2}", - nfkc: "\u{C50B}", - nfkd: "\u{110A}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{C50C}", - nfc: "\u{C50C}", - nfd: "\u{110A}\u{1174}", - nfkc: "\u{C50C}", - nfkd: "\u{110A}\u{1174}", - }, - NormalizationTest { - source: "\u{C50D}", - nfc: "\u{C50D}", - nfd: "\u{110A}\u{1174}\u{11A8}", - nfkc: "\u{C50D}", - nfkd: "\u{110A}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{C50E}", - nfc: "\u{C50E}", - nfd: "\u{110A}\u{1174}\u{11A9}", - nfkc: "\u{C50E}", - nfkd: "\u{110A}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{C50F}", - nfc: "\u{C50F}", - nfd: "\u{110A}\u{1174}\u{11AA}", - nfkc: "\u{C50F}", - nfkd: "\u{110A}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{C510}", - nfc: "\u{C510}", - nfd: "\u{110A}\u{1174}\u{11AB}", - nfkc: "\u{C510}", - nfkd: "\u{110A}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{C511}", - nfc: "\u{C511}", - nfd: "\u{110A}\u{1174}\u{11AC}", - nfkc: "\u{C511}", - nfkd: "\u{110A}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{C512}", - nfc: "\u{C512}", - nfd: "\u{110A}\u{1174}\u{11AD}", - nfkc: "\u{C512}", - nfkd: "\u{110A}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{C513}", - nfc: "\u{C513}", - nfd: "\u{110A}\u{1174}\u{11AE}", - nfkc: "\u{C513}", - nfkd: "\u{110A}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{C514}", - nfc: "\u{C514}", - nfd: "\u{110A}\u{1174}\u{11AF}", - nfkc: "\u{C514}", - nfkd: "\u{110A}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{C515}", - nfc: "\u{C515}", - nfd: "\u{110A}\u{1174}\u{11B0}", - nfkc: "\u{C515}", - nfkd: "\u{110A}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{C516}", - nfc: "\u{C516}", - nfd: "\u{110A}\u{1174}\u{11B1}", - nfkc: "\u{C516}", - nfkd: "\u{110A}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{C517}", - nfc: "\u{C517}", - nfd: "\u{110A}\u{1174}\u{11B2}", - nfkc: "\u{C517}", - nfkd: "\u{110A}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{C518}", - nfc: "\u{C518}", - nfd: "\u{110A}\u{1174}\u{11B3}", - nfkc: "\u{C518}", - nfkd: "\u{110A}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{C519}", - nfc: "\u{C519}", - nfd: "\u{110A}\u{1174}\u{11B4}", - nfkc: "\u{C519}", - nfkd: "\u{110A}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{C51A}", - nfc: "\u{C51A}", - nfd: "\u{110A}\u{1174}\u{11B5}", - nfkc: "\u{C51A}", - nfkd: "\u{110A}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{C51B}", - nfc: "\u{C51B}", - nfd: "\u{110A}\u{1174}\u{11B6}", - nfkc: "\u{C51B}", - nfkd: "\u{110A}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{C51C}", - nfc: "\u{C51C}", - nfd: "\u{110A}\u{1174}\u{11B7}", - nfkc: "\u{C51C}", - nfkd: "\u{110A}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{C51D}", - nfc: "\u{C51D}", - nfd: "\u{110A}\u{1174}\u{11B8}", - nfkc: "\u{C51D}", - nfkd: "\u{110A}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{C51E}", - nfc: "\u{C51E}", - nfd: "\u{110A}\u{1174}\u{11B9}", - nfkc: "\u{C51E}", - nfkd: "\u{110A}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{C51F}", - nfc: "\u{C51F}", - nfd: "\u{110A}\u{1174}\u{11BA}", - nfkc: "\u{C51F}", - nfkd: "\u{110A}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{C520}", - nfc: "\u{C520}", - nfd: "\u{110A}\u{1174}\u{11BB}", - nfkc: "\u{C520}", - nfkd: "\u{110A}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{C521}", - nfc: "\u{C521}", - nfd: "\u{110A}\u{1174}\u{11BC}", - nfkc: "\u{C521}", - nfkd: "\u{110A}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{C522}", - nfc: "\u{C522}", - nfd: "\u{110A}\u{1174}\u{11BD}", - nfkc: "\u{C522}", - nfkd: "\u{110A}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{C523}", - nfc: "\u{C523}", - nfd: "\u{110A}\u{1174}\u{11BE}", - nfkc: "\u{C523}", - nfkd: "\u{110A}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{C524}", - nfc: "\u{C524}", - nfd: "\u{110A}\u{1174}\u{11BF}", - nfkc: "\u{C524}", - nfkd: "\u{110A}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{C525}", - nfc: "\u{C525}", - nfd: "\u{110A}\u{1174}\u{11C0}", - nfkc: "\u{C525}", - nfkd: "\u{110A}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{C526}", - nfc: "\u{C526}", - nfd: "\u{110A}\u{1174}\u{11C1}", - nfkc: "\u{C526}", - nfkd: "\u{110A}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{C527}", - nfc: "\u{C527}", - nfd: "\u{110A}\u{1174}\u{11C2}", - nfkc: "\u{C527}", - nfkd: "\u{110A}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{C528}", - nfc: "\u{C528}", - nfd: "\u{110A}\u{1175}", - nfkc: "\u{C528}", - nfkd: "\u{110A}\u{1175}", - }, - NormalizationTest { - source: "\u{C529}", - nfc: "\u{C529}", - nfd: "\u{110A}\u{1175}\u{11A8}", - nfkc: "\u{C529}", - nfkd: "\u{110A}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{C52A}", - nfc: "\u{C52A}", - nfd: "\u{110A}\u{1175}\u{11A9}", - nfkc: "\u{C52A}", - nfkd: "\u{110A}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{C52B}", - nfc: "\u{C52B}", - nfd: "\u{110A}\u{1175}\u{11AA}", - nfkc: "\u{C52B}", - nfkd: "\u{110A}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{C52C}", - nfc: "\u{C52C}", - nfd: "\u{110A}\u{1175}\u{11AB}", - nfkc: "\u{C52C}", - nfkd: "\u{110A}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{C52D}", - nfc: "\u{C52D}", - nfd: "\u{110A}\u{1175}\u{11AC}", - nfkc: "\u{C52D}", - nfkd: "\u{110A}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{C52E}", - nfc: "\u{C52E}", - nfd: "\u{110A}\u{1175}\u{11AD}", - nfkc: "\u{C52E}", - nfkd: "\u{110A}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{C52F}", - nfc: "\u{C52F}", - nfd: "\u{110A}\u{1175}\u{11AE}", - nfkc: "\u{C52F}", - nfkd: "\u{110A}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{C530}", - nfc: "\u{C530}", - nfd: "\u{110A}\u{1175}\u{11AF}", - nfkc: "\u{C530}", - nfkd: "\u{110A}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{C531}", - nfc: "\u{C531}", - nfd: "\u{110A}\u{1175}\u{11B0}", - nfkc: "\u{C531}", - nfkd: "\u{110A}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{C532}", - nfc: "\u{C532}", - nfd: "\u{110A}\u{1175}\u{11B1}", - nfkc: "\u{C532}", - nfkd: "\u{110A}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{C533}", - nfc: "\u{C533}", - nfd: "\u{110A}\u{1175}\u{11B2}", - nfkc: "\u{C533}", - nfkd: "\u{110A}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{C534}", - nfc: "\u{C534}", - nfd: "\u{110A}\u{1175}\u{11B3}", - nfkc: "\u{C534}", - nfkd: "\u{110A}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{C535}", - nfc: "\u{C535}", - nfd: "\u{110A}\u{1175}\u{11B4}", - nfkc: "\u{C535}", - nfkd: "\u{110A}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{C536}", - nfc: "\u{C536}", - nfd: "\u{110A}\u{1175}\u{11B5}", - nfkc: "\u{C536}", - nfkd: "\u{110A}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{C537}", - nfc: "\u{C537}", - nfd: "\u{110A}\u{1175}\u{11B6}", - nfkc: "\u{C537}", - nfkd: "\u{110A}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{C538}", - nfc: "\u{C538}", - nfd: "\u{110A}\u{1175}\u{11B7}", - nfkc: "\u{C538}", - nfkd: "\u{110A}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{C539}", - nfc: "\u{C539}", - nfd: "\u{110A}\u{1175}\u{11B8}", - nfkc: "\u{C539}", - nfkd: "\u{110A}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{C53A}", - nfc: "\u{C53A}", - nfd: "\u{110A}\u{1175}\u{11B9}", - nfkc: "\u{C53A}", - nfkd: "\u{110A}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{C53B}", - nfc: "\u{C53B}", - nfd: "\u{110A}\u{1175}\u{11BA}", - nfkc: "\u{C53B}", - nfkd: "\u{110A}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{C53C}", - nfc: "\u{C53C}", - nfd: "\u{110A}\u{1175}\u{11BB}", - nfkc: "\u{C53C}", - nfkd: "\u{110A}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{C53D}", - nfc: "\u{C53D}", - nfd: "\u{110A}\u{1175}\u{11BC}", - nfkc: "\u{C53D}", - nfkd: "\u{110A}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{C53E}", - nfc: "\u{C53E}", - nfd: "\u{110A}\u{1175}\u{11BD}", - nfkc: "\u{C53E}", - nfkd: "\u{110A}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{C53F}", - nfc: "\u{C53F}", - nfd: "\u{110A}\u{1175}\u{11BE}", - nfkc: "\u{C53F}", - nfkd: "\u{110A}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{C540}", - nfc: "\u{C540}", - nfd: "\u{110A}\u{1175}\u{11BF}", - nfkc: "\u{C540}", - nfkd: "\u{110A}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{C541}", - nfc: "\u{C541}", - nfd: "\u{110A}\u{1175}\u{11C0}", - nfkc: "\u{C541}", - nfkd: "\u{110A}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{C542}", - nfc: "\u{C542}", - nfd: "\u{110A}\u{1175}\u{11C1}", - nfkc: "\u{C542}", - nfkd: "\u{110A}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{C543}", - nfc: "\u{C543}", - nfd: "\u{110A}\u{1175}\u{11C2}", - nfkc: "\u{C543}", - nfkd: "\u{110A}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{C544}", - nfc: "\u{C544}", - nfd: "\u{110B}\u{1161}", - nfkc: "\u{C544}", - nfkd: "\u{110B}\u{1161}", - }, - NormalizationTest { - source: "\u{C545}", - nfc: "\u{C545}", - nfd: "\u{110B}\u{1161}\u{11A8}", - nfkc: "\u{C545}", - nfkd: "\u{110B}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{C546}", - nfc: "\u{C546}", - nfd: "\u{110B}\u{1161}\u{11A9}", - nfkc: "\u{C546}", - nfkd: "\u{110B}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{C547}", - nfc: "\u{C547}", - nfd: "\u{110B}\u{1161}\u{11AA}", - nfkc: "\u{C547}", - nfkd: "\u{110B}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{C548}", - nfc: "\u{C548}", - nfd: "\u{110B}\u{1161}\u{11AB}", - nfkc: "\u{C548}", - nfkd: "\u{110B}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{C549}", - nfc: "\u{C549}", - nfd: "\u{110B}\u{1161}\u{11AC}", - nfkc: "\u{C549}", - nfkd: "\u{110B}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{C54A}", - nfc: "\u{C54A}", - nfd: "\u{110B}\u{1161}\u{11AD}", - nfkc: "\u{C54A}", - nfkd: "\u{110B}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{C54B}", - nfc: "\u{C54B}", - nfd: "\u{110B}\u{1161}\u{11AE}", - nfkc: "\u{C54B}", - nfkd: "\u{110B}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{C54C}", - nfc: "\u{C54C}", - nfd: "\u{110B}\u{1161}\u{11AF}", - nfkc: "\u{C54C}", - nfkd: "\u{110B}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{C54D}", - nfc: "\u{C54D}", - nfd: "\u{110B}\u{1161}\u{11B0}", - nfkc: "\u{C54D}", - nfkd: "\u{110B}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{C54E}", - nfc: "\u{C54E}", - nfd: "\u{110B}\u{1161}\u{11B1}", - nfkc: "\u{C54E}", - nfkd: "\u{110B}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{C54F}", - nfc: "\u{C54F}", - nfd: "\u{110B}\u{1161}\u{11B2}", - nfkc: "\u{C54F}", - nfkd: "\u{110B}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{C550}", - nfc: "\u{C550}", - nfd: "\u{110B}\u{1161}\u{11B3}", - nfkc: "\u{C550}", - nfkd: "\u{110B}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{C551}", - nfc: "\u{C551}", - nfd: "\u{110B}\u{1161}\u{11B4}", - nfkc: "\u{C551}", - nfkd: "\u{110B}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{C552}", - nfc: "\u{C552}", - nfd: "\u{110B}\u{1161}\u{11B5}", - nfkc: "\u{C552}", - nfkd: "\u{110B}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{C553}", - nfc: "\u{C553}", - nfd: "\u{110B}\u{1161}\u{11B6}", - nfkc: "\u{C553}", - nfkd: "\u{110B}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{C554}", - nfc: "\u{C554}", - nfd: "\u{110B}\u{1161}\u{11B7}", - nfkc: "\u{C554}", - nfkd: "\u{110B}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{C555}", - nfc: "\u{C555}", - nfd: "\u{110B}\u{1161}\u{11B8}", - nfkc: "\u{C555}", - nfkd: "\u{110B}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{C556}", - nfc: "\u{C556}", - nfd: "\u{110B}\u{1161}\u{11B9}", - nfkc: "\u{C556}", - nfkd: "\u{110B}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{C557}", - nfc: "\u{C557}", - nfd: "\u{110B}\u{1161}\u{11BA}", - nfkc: "\u{C557}", - nfkd: "\u{110B}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{C558}", - nfc: "\u{C558}", - nfd: "\u{110B}\u{1161}\u{11BB}", - nfkc: "\u{C558}", - nfkd: "\u{110B}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{C559}", - nfc: "\u{C559}", - nfd: "\u{110B}\u{1161}\u{11BC}", - nfkc: "\u{C559}", - nfkd: "\u{110B}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{C55A}", - nfc: "\u{C55A}", - nfd: "\u{110B}\u{1161}\u{11BD}", - nfkc: "\u{C55A}", - nfkd: "\u{110B}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{C55B}", - nfc: "\u{C55B}", - nfd: "\u{110B}\u{1161}\u{11BE}", - nfkc: "\u{C55B}", - nfkd: "\u{110B}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{C55C}", - nfc: "\u{C55C}", - nfd: "\u{110B}\u{1161}\u{11BF}", - nfkc: "\u{C55C}", - nfkd: "\u{110B}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{C55D}", - nfc: "\u{C55D}", - nfd: "\u{110B}\u{1161}\u{11C0}", - nfkc: "\u{C55D}", - nfkd: "\u{110B}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{C55E}", - nfc: "\u{C55E}", - nfd: "\u{110B}\u{1161}\u{11C1}", - nfkc: "\u{C55E}", - nfkd: "\u{110B}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{C55F}", - nfc: "\u{C55F}", - nfd: "\u{110B}\u{1161}\u{11C2}", - nfkc: "\u{C55F}", - nfkd: "\u{110B}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{C560}", - nfc: "\u{C560}", - nfd: "\u{110B}\u{1162}", - nfkc: "\u{C560}", - nfkd: "\u{110B}\u{1162}", - }, - NormalizationTest { - source: "\u{C561}", - nfc: "\u{C561}", - nfd: "\u{110B}\u{1162}\u{11A8}", - nfkc: "\u{C561}", - nfkd: "\u{110B}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{C562}", - nfc: "\u{C562}", - nfd: "\u{110B}\u{1162}\u{11A9}", - nfkc: "\u{C562}", - nfkd: "\u{110B}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{C563}", - nfc: "\u{C563}", - nfd: "\u{110B}\u{1162}\u{11AA}", - nfkc: "\u{C563}", - nfkd: "\u{110B}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{C564}", - nfc: "\u{C564}", - nfd: "\u{110B}\u{1162}\u{11AB}", - nfkc: "\u{C564}", - nfkd: "\u{110B}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{C565}", - nfc: "\u{C565}", - nfd: "\u{110B}\u{1162}\u{11AC}", - nfkc: "\u{C565}", - nfkd: "\u{110B}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{C566}", - nfc: "\u{C566}", - nfd: "\u{110B}\u{1162}\u{11AD}", - nfkc: "\u{C566}", - nfkd: "\u{110B}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{C567}", - nfc: "\u{C567}", - nfd: "\u{110B}\u{1162}\u{11AE}", - nfkc: "\u{C567}", - nfkd: "\u{110B}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{C568}", - nfc: "\u{C568}", - nfd: "\u{110B}\u{1162}\u{11AF}", - nfkc: "\u{C568}", - nfkd: "\u{110B}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{C569}", - nfc: "\u{C569}", - nfd: "\u{110B}\u{1162}\u{11B0}", - nfkc: "\u{C569}", - nfkd: "\u{110B}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{C56A}", - nfc: "\u{C56A}", - nfd: "\u{110B}\u{1162}\u{11B1}", - nfkc: "\u{C56A}", - nfkd: "\u{110B}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{C56B}", - nfc: "\u{C56B}", - nfd: "\u{110B}\u{1162}\u{11B2}", - nfkc: "\u{C56B}", - nfkd: "\u{110B}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{C56C}", - nfc: "\u{C56C}", - nfd: "\u{110B}\u{1162}\u{11B3}", - nfkc: "\u{C56C}", - nfkd: "\u{110B}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{C56D}", - nfc: "\u{C56D}", - nfd: "\u{110B}\u{1162}\u{11B4}", - nfkc: "\u{C56D}", - nfkd: "\u{110B}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{C56E}", - nfc: "\u{C56E}", - nfd: "\u{110B}\u{1162}\u{11B5}", - nfkc: "\u{C56E}", - nfkd: "\u{110B}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{C56F}", - nfc: "\u{C56F}", - nfd: "\u{110B}\u{1162}\u{11B6}", - nfkc: "\u{C56F}", - nfkd: "\u{110B}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{C570}", - nfc: "\u{C570}", - nfd: "\u{110B}\u{1162}\u{11B7}", - nfkc: "\u{C570}", - nfkd: "\u{110B}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{C571}", - nfc: "\u{C571}", - nfd: "\u{110B}\u{1162}\u{11B8}", - nfkc: "\u{C571}", - nfkd: "\u{110B}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{C572}", - nfc: "\u{C572}", - nfd: "\u{110B}\u{1162}\u{11B9}", - nfkc: "\u{C572}", - nfkd: "\u{110B}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{C573}", - nfc: "\u{C573}", - nfd: "\u{110B}\u{1162}\u{11BA}", - nfkc: "\u{C573}", - nfkd: "\u{110B}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{C574}", - nfc: "\u{C574}", - nfd: "\u{110B}\u{1162}\u{11BB}", - nfkc: "\u{C574}", - nfkd: "\u{110B}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{C575}", - nfc: "\u{C575}", - nfd: "\u{110B}\u{1162}\u{11BC}", - nfkc: "\u{C575}", - nfkd: "\u{110B}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{C576}", - nfc: "\u{C576}", - nfd: "\u{110B}\u{1162}\u{11BD}", - nfkc: "\u{C576}", - nfkd: "\u{110B}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{C577}", - nfc: "\u{C577}", - nfd: "\u{110B}\u{1162}\u{11BE}", - nfkc: "\u{C577}", - nfkd: "\u{110B}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{C578}", - nfc: "\u{C578}", - nfd: "\u{110B}\u{1162}\u{11BF}", - nfkc: "\u{C578}", - nfkd: "\u{110B}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{C579}", - nfc: "\u{C579}", - nfd: "\u{110B}\u{1162}\u{11C0}", - nfkc: "\u{C579}", - nfkd: "\u{110B}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{C57A}", - nfc: "\u{C57A}", - nfd: "\u{110B}\u{1162}\u{11C1}", - nfkc: "\u{C57A}", - nfkd: "\u{110B}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{C57B}", - nfc: "\u{C57B}", - nfd: "\u{110B}\u{1162}\u{11C2}", - nfkc: "\u{C57B}", - nfkd: "\u{110B}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{C57C}", - nfc: "\u{C57C}", - nfd: "\u{110B}\u{1163}", - nfkc: "\u{C57C}", - nfkd: "\u{110B}\u{1163}", - }, - NormalizationTest { - source: "\u{C57D}", - nfc: "\u{C57D}", - nfd: "\u{110B}\u{1163}\u{11A8}", - nfkc: "\u{C57D}", - nfkd: "\u{110B}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{C57E}", - nfc: "\u{C57E}", - nfd: "\u{110B}\u{1163}\u{11A9}", - nfkc: "\u{C57E}", - nfkd: "\u{110B}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{C57F}", - nfc: "\u{C57F}", - nfd: "\u{110B}\u{1163}\u{11AA}", - nfkc: "\u{C57F}", - nfkd: "\u{110B}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{C580}", - nfc: "\u{C580}", - nfd: "\u{110B}\u{1163}\u{11AB}", - nfkc: "\u{C580}", - nfkd: "\u{110B}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{C581}", - nfc: "\u{C581}", - nfd: "\u{110B}\u{1163}\u{11AC}", - nfkc: "\u{C581}", - nfkd: "\u{110B}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{C582}", - nfc: "\u{C582}", - nfd: "\u{110B}\u{1163}\u{11AD}", - nfkc: "\u{C582}", - nfkd: "\u{110B}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{C583}", - nfc: "\u{C583}", - nfd: "\u{110B}\u{1163}\u{11AE}", - nfkc: "\u{C583}", - nfkd: "\u{110B}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{C584}", - nfc: "\u{C584}", - nfd: "\u{110B}\u{1163}\u{11AF}", - nfkc: "\u{C584}", - nfkd: "\u{110B}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{C585}", - nfc: "\u{C585}", - nfd: "\u{110B}\u{1163}\u{11B0}", - nfkc: "\u{C585}", - nfkd: "\u{110B}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{C586}", - nfc: "\u{C586}", - nfd: "\u{110B}\u{1163}\u{11B1}", - nfkc: "\u{C586}", - nfkd: "\u{110B}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{C587}", - nfc: "\u{C587}", - nfd: "\u{110B}\u{1163}\u{11B2}", - nfkc: "\u{C587}", - nfkd: "\u{110B}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{C588}", - nfc: "\u{C588}", - nfd: "\u{110B}\u{1163}\u{11B3}", - nfkc: "\u{C588}", - nfkd: "\u{110B}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{C589}", - nfc: "\u{C589}", - nfd: "\u{110B}\u{1163}\u{11B4}", - nfkc: "\u{C589}", - nfkd: "\u{110B}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{C58A}", - nfc: "\u{C58A}", - nfd: "\u{110B}\u{1163}\u{11B5}", - nfkc: "\u{C58A}", - nfkd: "\u{110B}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{C58B}", - nfc: "\u{C58B}", - nfd: "\u{110B}\u{1163}\u{11B6}", - nfkc: "\u{C58B}", - nfkd: "\u{110B}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{C58C}", - nfc: "\u{C58C}", - nfd: "\u{110B}\u{1163}\u{11B7}", - nfkc: "\u{C58C}", - nfkd: "\u{110B}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{C58D}", - nfc: "\u{C58D}", - nfd: "\u{110B}\u{1163}\u{11B8}", - nfkc: "\u{C58D}", - nfkd: "\u{110B}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{C58E}", - nfc: "\u{C58E}", - nfd: "\u{110B}\u{1163}\u{11B9}", - nfkc: "\u{C58E}", - nfkd: "\u{110B}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{C58F}", - nfc: "\u{C58F}", - nfd: "\u{110B}\u{1163}\u{11BA}", - nfkc: "\u{C58F}", - nfkd: "\u{110B}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{C590}", - nfc: "\u{C590}", - nfd: "\u{110B}\u{1163}\u{11BB}", - nfkc: "\u{C590}", - nfkd: "\u{110B}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{C591}", - nfc: "\u{C591}", - nfd: "\u{110B}\u{1163}\u{11BC}", - nfkc: "\u{C591}", - nfkd: "\u{110B}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{C592}", - nfc: "\u{C592}", - nfd: "\u{110B}\u{1163}\u{11BD}", - nfkc: "\u{C592}", - nfkd: "\u{110B}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{C593}", - nfc: "\u{C593}", - nfd: "\u{110B}\u{1163}\u{11BE}", - nfkc: "\u{C593}", - nfkd: "\u{110B}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{C594}", - nfc: "\u{C594}", - nfd: "\u{110B}\u{1163}\u{11BF}", - nfkc: "\u{C594}", - nfkd: "\u{110B}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{C595}", - nfc: "\u{C595}", - nfd: "\u{110B}\u{1163}\u{11C0}", - nfkc: "\u{C595}", - nfkd: "\u{110B}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{C596}", - nfc: "\u{C596}", - nfd: "\u{110B}\u{1163}\u{11C1}", - nfkc: "\u{C596}", - nfkd: "\u{110B}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{C597}", - nfc: "\u{C597}", - nfd: "\u{110B}\u{1163}\u{11C2}", - nfkc: "\u{C597}", - nfkd: "\u{110B}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{C598}", - nfc: "\u{C598}", - nfd: "\u{110B}\u{1164}", - nfkc: "\u{C598}", - nfkd: "\u{110B}\u{1164}", - }, - NormalizationTest { - source: "\u{C599}", - nfc: "\u{C599}", - nfd: "\u{110B}\u{1164}\u{11A8}", - nfkc: "\u{C599}", - nfkd: "\u{110B}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{C59A}", - nfc: "\u{C59A}", - nfd: "\u{110B}\u{1164}\u{11A9}", - nfkc: "\u{C59A}", - nfkd: "\u{110B}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{C59B}", - nfc: "\u{C59B}", - nfd: "\u{110B}\u{1164}\u{11AA}", - nfkc: "\u{C59B}", - nfkd: "\u{110B}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{C59C}", - nfc: "\u{C59C}", - nfd: "\u{110B}\u{1164}\u{11AB}", - nfkc: "\u{C59C}", - nfkd: "\u{110B}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{C59D}", - nfc: "\u{C59D}", - nfd: "\u{110B}\u{1164}\u{11AC}", - nfkc: "\u{C59D}", - nfkd: "\u{110B}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{C59E}", - nfc: "\u{C59E}", - nfd: "\u{110B}\u{1164}\u{11AD}", - nfkc: "\u{C59E}", - nfkd: "\u{110B}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{C59F}", - nfc: "\u{C59F}", - nfd: "\u{110B}\u{1164}\u{11AE}", - nfkc: "\u{C59F}", - nfkd: "\u{110B}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{C5A0}", - nfc: "\u{C5A0}", - nfd: "\u{110B}\u{1164}\u{11AF}", - nfkc: "\u{C5A0}", - nfkd: "\u{110B}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{C5A1}", - nfc: "\u{C5A1}", - nfd: "\u{110B}\u{1164}\u{11B0}", - nfkc: "\u{C5A1}", - nfkd: "\u{110B}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{C5A2}", - nfc: "\u{C5A2}", - nfd: "\u{110B}\u{1164}\u{11B1}", - nfkc: "\u{C5A2}", - nfkd: "\u{110B}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{C5A3}", - nfc: "\u{C5A3}", - nfd: "\u{110B}\u{1164}\u{11B2}", - nfkc: "\u{C5A3}", - nfkd: "\u{110B}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{C5A4}", - nfc: "\u{C5A4}", - nfd: "\u{110B}\u{1164}\u{11B3}", - nfkc: "\u{C5A4}", - nfkd: "\u{110B}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{C5A5}", - nfc: "\u{C5A5}", - nfd: "\u{110B}\u{1164}\u{11B4}", - nfkc: "\u{C5A5}", - nfkd: "\u{110B}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{C5A6}", - nfc: "\u{C5A6}", - nfd: "\u{110B}\u{1164}\u{11B5}", - nfkc: "\u{C5A6}", - nfkd: "\u{110B}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{C5A7}", - nfc: "\u{C5A7}", - nfd: "\u{110B}\u{1164}\u{11B6}", - nfkc: "\u{C5A7}", - nfkd: "\u{110B}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{C5A8}", - nfc: "\u{C5A8}", - nfd: "\u{110B}\u{1164}\u{11B7}", - nfkc: "\u{C5A8}", - nfkd: "\u{110B}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{C5A9}", - nfc: "\u{C5A9}", - nfd: "\u{110B}\u{1164}\u{11B8}", - nfkc: "\u{C5A9}", - nfkd: "\u{110B}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{C5AA}", - nfc: "\u{C5AA}", - nfd: "\u{110B}\u{1164}\u{11B9}", - nfkc: "\u{C5AA}", - nfkd: "\u{110B}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{C5AB}", - nfc: "\u{C5AB}", - nfd: "\u{110B}\u{1164}\u{11BA}", - nfkc: "\u{C5AB}", - nfkd: "\u{110B}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{C5AC}", - nfc: "\u{C5AC}", - nfd: "\u{110B}\u{1164}\u{11BB}", - nfkc: "\u{C5AC}", - nfkd: "\u{110B}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{C5AD}", - nfc: "\u{C5AD}", - nfd: "\u{110B}\u{1164}\u{11BC}", - nfkc: "\u{C5AD}", - nfkd: "\u{110B}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{C5AE}", - nfc: "\u{C5AE}", - nfd: "\u{110B}\u{1164}\u{11BD}", - nfkc: "\u{C5AE}", - nfkd: "\u{110B}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{C5AF}", - nfc: "\u{C5AF}", - nfd: "\u{110B}\u{1164}\u{11BE}", - nfkc: "\u{C5AF}", - nfkd: "\u{110B}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{C5B0}", - nfc: "\u{C5B0}", - nfd: "\u{110B}\u{1164}\u{11BF}", - nfkc: "\u{C5B0}", - nfkd: "\u{110B}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{C5B1}", - nfc: "\u{C5B1}", - nfd: "\u{110B}\u{1164}\u{11C0}", - nfkc: "\u{C5B1}", - nfkd: "\u{110B}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{C5B2}", - nfc: "\u{C5B2}", - nfd: "\u{110B}\u{1164}\u{11C1}", - nfkc: "\u{C5B2}", - nfkd: "\u{110B}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{C5B3}", - nfc: "\u{C5B3}", - nfd: "\u{110B}\u{1164}\u{11C2}", - nfkc: "\u{C5B3}", - nfkd: "\u{110B}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{C5B4}", - nfc: "\u{C5B4}", - nfd: "\u{110B}\u{1165}", - nfkc: "\u{C5B4}", - nfkd: "\u{110B}\u{1165}", - }, - NormalizationTest { - source: "\u{C5B5}", - nfc: "\u{C5B5}", - nfd: "\u{110B}\u{1165}\u{11A8}", - nfkc: "\u{C5B5}", - nfkd: "\u{110B}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{C5B6}", - nfc: "\u{C5B6}", - nfd: "\u{110B}\u{1165}\u{11A9}", - nfkc: "\u{C5B6}", - nfkd: "\u{110B}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{C5B7}", - nfc: "\u{C5B7}", - nfd: "\u{110B}\u{1165}\u{11AA}", - nfkc: "\u{C5B7}", - nfkd: "\u{110B}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{C5B8}", - nfc: "\u{C5B8}", - nfd: "\u{110B}\u{1165}\u{11AB}", - nfkc: "\u{C5B8}", - nfkd: "\u{110B}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{C5B9}", - nfc: "\u{C5B9}", - nfd: "\u{110B}\u{1165}\u{11AC}", - nfkc: "\u{C5B9}", - nfkd: "\u{110B}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{C5BA}", - nfc: "\u{C5BA}", - nfd: "\u{110B}\u{1165}\u{11AD}", - nfkc: "\u{C5BA}", - nfkd: "\u{110B}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{C5BB}", - nfc: "\u{C5BB}", - nfd: "\u{110B}\u{1165}\u{11AE}", - nfkc: "\u{C5BB}", - nfkd: "\u{110B}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{C5BC}", - nfc: "\u{C5BC}", - nfd: "\u{110B}\u{1165}\u{11AF}", - nfkc: "\u{C5BC}", - nfkd: "\u{110B}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{C5BD}", - nfc: "\u{C5BD}", - nfd: "\u{110B}\u{1165}\u{11B0}", - nfkc: "\u{C5BD}", - nfkd: "\u{110B}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{C5BE}", - nfc: "\u{C5BE}", - nfd: "\u{110B}\u{1165}\u{11B1}", - nfkc: "\u{C5BE}", - nfkd: "\u{110B}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{C5BF}", - nfc: "\u{C5BF}", - nfd: "\u{110B}\u{1165}\u{11B2}", - nfkc: "\u{C5BF}", - nfkd: "\u{110B}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{C5C0}", - nfc: "\u{C5C0}", - nfd: "\u{110B}\u{1165}\u{11B3}", - nfkc: "\u{C5C0}", - nfkd: "\u{110B}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{C5C1}", - nfc: "\u{C5C1}", - nfd: "\u{110B}\u{1165}\u{11B4}", - nfkc: "\u{C5C1}", - nfkd: "\u{110B}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{C5C2}", - nfc: "\u{C5C2}", - nfd: "\u{110B}\u{1165}\u{11B5}", - nfkc: "\u{C5C2}", - nfkd: "\u{110B}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{C5C3}", - nfc: "\u{C5C3}", - nfd: "\u{110B}\u{1165}\u{11B6}", - nfkc: "\u{C5C3}", - nfkd: "\u{110B}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{C5C4}", - nfc: "\u{C5C4}", - nfd: "\u{110B}\u{1165}\u{11B7}", - nfkc: "\u{C5C4}", - nfkd: "\u{110B}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{C5C5}", - nfc: "\u{C5C5}", - nfd: "\u{110B}\u{1165}\u{11B8}", - nfkc: "\u{C5C5}", - nfkd: "\u{110B}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{C5C6}", - nfc: "\u{C5C6}", - nfd: "\u{110B}\u{1165}\u{11B9}", - nfkc: "\u{C5C6}", - nfkd: "\u{110B}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{C5C7}", - nfc: "\u{C5C7}", - nfd: "\u{110B}\u{1165}\u{11BA}", - nfkc: "\u{C5C7}", - nfkd: "\u{110B}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{C5C8}", - nfc: "\u{C5C8}", - nfd: "\u{110B}\u{1165}\u{11BB}", - nfkc: "\u{C5C8}", - nfkd: "\u{110B}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{C5C9}", - nfc: "\u{C5C9}", - nfd: "\u{110B}\u{1165}\u{11BC}", - nfkc: "\u{C5C9}", - nfkd: "\u{110B}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{C5CA}", - nfc: "\u{C5CA}", - nfd: "\u{110B}\u{1165}\u{11BD}", - nfkc: "\u{C5CA}", - nfkd: "\u{110B}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{C5CB}", - nfc: "\u{C5CB}", - nfd: "\u{110B}\u{1165}\u{11BE}", - nfkc: "\u{C5CB}", - nfkd: "\u{110B}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{C5CC}", - nfc: "\u{C5CC}", - nfd: "\u{110B}\u{1165}\u{11BF}", - nfkc: "\u{C5CC}", - nfkd: "\u{110B}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{C5CD}", - nfc: "\u{C5CD}", - nfd: "\u{110B}\u{1165}\u{11C0}", - nfkc: "\u{C5CD}", - nfkd: "\u{110B}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{C5CE}", - nfc: "\u{C5CE}", - nfd: "\u{110B}\u{1165}\u{11C1}", - nfkc: "\u{C5CE}", - nfkd: "\u{110B}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{C5CF}", - nfc: "\u{C5CF}", - nfd: "\u{110B}\u{1165}\u{11C2}", - nfkc: "\u{C5CF}", - nfkd: "\u{110B}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{C5D0}", - nfc: "\u{C5D0}", - nfd: "\u{110B}\u{1166}", - nfkc: "\u{C5D0}", - nfkd: "\u{110B}\u{1166}", - }, - NormalizationTest { - source: "\u{C5D1}", - nfc: "\u{C5D1}", - nfd: "\u{110B}\u{1166}\u{11A8}", - nfkc: "\u{C5D1}", - nfkd: "\u{110B}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{C5D2}", - nfc: "\u{C5D2}", - nfd: "\u{110B}\u{1166}\u{11A9}", - nfkc: "\u{C5D2}", - nfkd: "\u{110B}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{C5D3}", - nfc: "\u{C5D3}", - nfd: "\u{110B}\u{1166}\u{11AA}", - nfkc: "\u{C5D3}", - nfkd: "\u{110B}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{C5D4}", - nfc: "\u{C5D4}", - nfd: "\u{110B}\u{1166}\u{11AB}", - nfkc: "\u{C5D4}", - nfkd: "\u{110B}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{C5D5}", - nfc: "\u{C5D5}", - nfd: "\u{110B}\u{1166}\u{11AC}", - nfkc: "\u{C5D5}", - nfkd: "\u{110B}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{C5D6}", - nfc: "\u{C5D6}", - nfd: "\u{110B}\u{1166}\u{11AD}", - nfkc: "\u{C5D6}", - nfkd: "\u{110B}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{C5D7}", - nfc: "\u{C5D7}", - nfd: "\u{110B}\u{1166}\u{11AE}", - nfkc: "\u{C5D7}", - nfkd: "\u{110B}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{C5D8}", - nfc: "\u{C5D8}", - nfd: "\u{110B}\u{1166}\u{11AF}", - nfkc: "\u{C5D8}", - nfkd: "\u{110B}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{C5D9}", - nfc: "\u{C5D9}", - nfd: "\u{110B}\u{1166}\u{11B0}", - nfkc: "\u{C5D9}", - nfkd: "\u{110B}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{C5DA}", - nfc: "\u{C5DA}", - nfd: "\u{110B}\u{1166}\u{11B1}", - nfkc: "\u{C5DA}", - nfkd: "\u{110B}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{C5DB}", - nfc: "\u{C5DB}", - nfd: "\u{110B}\u{1166}\u{11B2}", - nfkc: "\u{C5DB}", - nfkd: "\u{110B}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{C5DC}", - nfc: "\u{C5DC}", - nfd: "\u{110B}\u{1166}\u{11B3}", - nfkc: "\u{C5DC}", - nfkd: "\u{110B}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{C5DD}", - nfc: "\u{C5DD}", - nfd: "\u{110B}\u{1166}\u{11B4}", - nfkc: "\u{C5DD}", - nfkd: "\u{110B}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{C5DE}", - nfc: "\u{C5DE}", - nfd: "\u{110B}\u{1166}\u{11B5}", - nfkc: "\u{C5DE}", - nfkd: "\u{110B}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{C5DF}", - nfc: "\u{C5DF}", - nfd: "\u{110B}\u{1166}\u{11B6}", - nfkc: "\u{C5DF}", - nfkd: "\u{110B}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{C5E0}", - nfc: "\u{C5E0}", - nfd: "\u{110B}\u{1166}\u{11B7}", - nfkc: "\u{C5E0}", - nfkd: "\u{110B}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{C5E1}", - nfc: "\u{C5E1}", - nfd: "\u{110B}\u{1166}\u{11B8}", - nfkc: "\u{C5E1}", - nfkd: "\u{110B}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{C5E2}", - nfc: "\u{C5E2}", - nfd: "\u{110B}\u{1166}\u{11B9}", - nfkc: "\u{C5E2}", - nfkd: "\u{110B}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{C5E3}", - nfc: "\u{C5E3}", - nfd: "\u{110B}\u{1166}\u{11BA}", - nfkc: "\u{C5E3}", - nfkd: "\u{110B}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{C5E4}", - nfc: "\u{C5E4}", - nfd: "\u{110B}\u{1166}\u{11BB}", - nfkc: "\u{C5E4}", - nfkd: "\u{110B}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{C5E5}", - nfc: "\u{C5E5}", - nfd: "\u{110B}\u{1166}\u{11BC}", - nfkc: "\u{C5E5}", - nfkd: "\u{110B}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{C5E6}", - nfc: "\u{C5E6}", - nfd: "\u{110B}\u{1166}\u{11BD}", - nfkc: "\u{C5E6}", - nfkd: "\u{110B}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{C5E7}", - nfc: "\u{C5E7}", - nfd: "\u{110B}\u{1166}\u{11BE}", - nfkc: "\u{C5E7}", - nfkd: "\u{110B}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{C5E8}", - nfc: "\u{C5E8}", - nfd: "\u{110B}\u{1166}\u{11BF}", - nfkc: "\u{C5E8}", - nfkd: "\u{110B}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{C5E9}", - nfc: "\u{C5E9}", - nfd: "\u{110B}\u{1166}\u{11C0}", - nfkc: "\u{C5E9}", - nfkd: "\u{110B}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{C5EA}", - nfc: "\u{C5EA}", - nfd: "\u{110B}\u{1166}\u{11C1}", - nfkc: "\u{C5EA}", - nfkd: "\u{110B}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{C5EB}", - nfc: "\u{C5EB}", - nfd: "\u{110B}\u{1166}\u{11C2}", - nfkc: "\u{C5EB}", - nfkd: "\u{110B}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{C5EC}", - nfc: "\u{C5EC}", - nfd: "\u{110B}\u{1167}", - nfkc: "\u{C5EC}", - nfkd: "\u{110B}\u{1167}", - }, - NormalizationTest { - source: "\u{C5ED}", - nfc: "\u{C5ED}", - nfd: "\u{110B}\u{1167}\u{11A8}", - nfkc: "\u{C5ED}", - nfkd: "\u{110B}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{C5EE}", - nfc: "\u{C5EE}", - nfd: "\u{110B}\u{1167}\u{11A9}", - nfkc: "\u{C5EE}", - nfkd: "\u{110B}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{C5EF}", - nfc: "\u{C5EF}", - nfd: "\u{110B}\u{1167}\u{11AA}", - nfkc: "\u{C5EF}", - nfkd: "\u{110B}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{C5F0}", - nfc: "\u{C5F0}", - nfd: "\u{110B}\u{1167}\u{11AB}", - nfkc: "\u{C5F0}", - nfkd: "\u{110B}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{C5F1}", - nfc: "\u{C5F1}", - nfd: "\u{110B}\u{1167}\u{11AC}", - nfkc: "\u{C5F1}", - nfkd: "\u{110B}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{C5F2}", - nfc: "\u{C5F2}", - nfd: "\u{110B}\u{1167}\u{11AD}", - nfkc: "\u{C5F2}", - nfkd: "\u{110B}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{C5F3}", - nfc: "\u{C5F3}", - nfd: "\u{110B}\u{1167}\u{11AE}", - nfkc: "\u{C5F3}", - nfkd: "\u{110B}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{C5F4}", - nfc: "\u{C5F4}", - nfd: "\u{110B}\u{1167}\u{11AF}", - nfkc: "\u{C5F4}", - nfkd: "\u{110B}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{C5F5}", - nfc: "\u{C5F5}", - nfd: "\u{110B}\u{1167}\u{11B0}", - nfkc: "\u{C5F5}", - nfkd: "\u{110B}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{C5F6}", - nfc: "\u{C5F6}", - nfd: "\u{110B}\u{1167}\u{11B1}", - nfkc: "\u{C5F6}", - nfkd: "\u{110B}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{C5F7}", - nfc: "\u{C5F7}", - nfd: "\u{110B}\u{1167}\u{11B2}", - nfkc: "\u{C5F7}", - nfkd: "\u{110B}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{C5F8}", - nfc: "\u{C5F8}", - nfd: "\u{110B}\u{1167}\u{11B3}", - nfkc: "\u{C5F8}", - nfkd: "\u{110B}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{C5F9}", - nfc: "\u{C5F9}", - nfd: "\u{110B}\u{1167}\u{11B4}", - nfkc: "\u{C5F9}", - nfkd: "\u{110B}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{C5FA}", - nfc: "\u{C5FA}", - nfd: "\u{110B}\u{1167}\u{11B5}", - nfkc: "\u{C5FA}", - nfkd: "\u{110B}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{C5FB}", - nfc: "\u{C5FB}", - nfd: "\u{110B}\u{1167}\u{11B6}", - nfkc: "\u{C5FB}", - nfkd: "\u{110B}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{C5FC}", - nfc: "\u{C5FC}", - nfd: "\u{110B}\u{1167}\u{11B7}", - nfkc: "\u{C5FC}", - nfkd: "\u{110B}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{C5FD}", - nfc: "\u{C5FD}", - nfd: "\u{110B}\u{1167}\u{11B8}", - nfkc: "\u{C5FD}", - nfkd: "\u{110B}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{C5FE}", - nfc: "\u{C5FE}", - nfd: "\u{110B}\u{1167}\u{11B9}", - nfkc: "\u{C5FE}", - nfkd: "\u{110B}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{C5FF}", - nfc: "\u{C5FF}", - nfd: "\u{110B}\u{1167}\u{11BA}", - nfkc: "\u{C5FF}", - nfkd: "\u{110B}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{C600}", - nfc: "\u{C600}", - nfd: "\u{110B}\u{1167}\u{11BB}", - nfkc: "\u{C600}", - nfkd: "\u{110B}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{C601}", - nfc: "\u{C601}", - nfd: "\u{110B}\u{1167}\u{11BC}", - nfkc: "\u{C601}", - nfkd: "\u{110B}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{C602}", - nfc: "\u{C602}", - nfd: "\u{110B}\u{1167}\u{11BD}", - nfkc: "\u{C602}", - nfkd: "\u{110B}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{C603}", - nfc: "\u{C603}", - nfd: "\u{110B}\u{1167}\u{11BE}", - nfkc: "\u{C603}", - nfkd: "\u{110B}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{C604}", - nfc: "\u{C604}", - nfd: "\u{110B}\u{1167}\u{11BF}", - nfkc: "\u{C604}", - nfkd: "\u{110B}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{C605}", - nfc: "\u{C605}", - nfd: "\u{110B}\u{1167}\u{11C0}", - nfkc: "\u{C605}", - nfkd: "\u{110B}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{C606}", - nfc: "\u{C606}", - nfd: "\u{110B}\u{1167}\u{11C1}", - nfkc: "\u{C606}", - nfkd: "\u{110B}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{C607}", - nfc: "\u{C607}", - nfd: "\u{110B}\u{1167}\u{11C2}", - nfkc: "\u{C607}", - nfkd: "\u{110B}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{C608}", - nfc: "\u{C608}", - nfd: "\u{110B}\u{1168}", - nfkc: "\u{C608}", - nfkd: "\u{110B}\u{1168}", - }, - NormalizationTest { - source: "\u{C609}", - nfc: "\u{C609}", - nfd: "\u{110B}\u{1168}\u{11A8}", - nfkc: "\u{C609}", - nfkd: "\u{110B}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{C60A}", - nfc: "\u{C60A}", - nfd: "\u{110B}\u{1168}\u{11A9}", - nfkc: "\u{C60A}", - nfkd: "\u{110B}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{C60B}", - nfc: "\u{C60B}", - nfd: "\u{110B}\u{1168}\u{11AA}", - nfkc: "\u{C60B}", - nfkd: "\u{110B}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{C60C}", - nfc: "\u{C60C}", - nfd: "\u{110B}\u{1168}\u{11AB}", - nfkc: "\u{C60C}", - nfkd: "\u{110B}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{C60D}", - nfc: "\u{C60D}", - nfd: "\u{110B}\u{1168}\u{11AC}", - nfkc: "\u{C60D}", - nfkd: "\u{110B}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{C60E}", - nfc: "\u{C60E}", - nfd: "\u{110B}\u{1168}\u{11AD}", - nfkc: "\u{C60E}", - nfkd: "\u{110B}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{C60F}", - nfc: "\u{C60F}", - nfd: "\u{110B}\u{1168}\u{11AE}", - nfkc: "\u{C60F}", - nfkd: "\u{110B}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{C610}", - nfc: "\u{C610}", - nfd: "\u{110B}\u{1168}\u{11AF}", - nfkc: "\u{C610}", - nfkd: "\u{110B}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{C611}", - nfc: "\u{C611}", - nfd: "\u{110B}\u{1168}\u{11B0}", - nfkc: "\u{C611}", - nfkd: "\u{110B}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{C612}", - nfc: "\u{C612}", - nfd: "\u{110B}\u{1168}\u{11B1}", - nfkc: "\u{C612}", - nfkd: "\u{110B}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{C613}", - nfc: "\u{C613}", - nfd: "\u{110B}\u{1168}\u{11B2}", - nfkc: "\u{C613}", - nfkd: "\u{110B}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{C614}", - nfc: "\u{C614}", - nfd: "\u{110B}\u{1168}\u{11B3}", - nfkc: "\u{C614}", - nfkd: "\u{110B}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{C615}", - nfc: "\u{C615}", - nfd: "\u{110B}\u{1168}\u{11B4}", - nfkc: "\u{C615}", - nfkd: "\u{110B}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{C616}", - nfc: "\u{C616}", - nfd: "\u{110B}\u{1168}\u{11B5}", - nfkc: "\u{C616}", - nfkd: "\u{110B}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{C617}", - nfc: "\u{C617}", - nfd: "\u{110B}\u{1168}\u{11B6}", - nfkc: "\u{C617}", - nfkd: "\u{110B}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{C618}", - nfc: "\u{C618}", - nfd: "\u{110B}\u{1168}\u{11B7}", - nfkc: "\u{C618}", - nfkd: "\u{110B}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{C619}", - nfc: "\u{C619}", - nfd: "\u{110B}\u{1168}\u{11B8}", - nfkc: "\u{C619}", - nfkd: "\u{110B}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{C61A}", - nfc: "\u{C61A}", - nfd: "\u{110B}\u{1168}\u{11B9}", - nfkc: "\u{C61A}", - nfkd: "\u{110B}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{C61B}", - nfc: "\u{C61B}", - nfd: "\u{110B}\u{1168}\u{11BA}", - nfkc: "\u{C61B}", - nfkd: "\u{110B}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{C61C}", - nfc: "\u{C61C}", - nfd: "\u{110B}\u{1168}\u{11BB}", - nfkc: "\u{C61C}", - nfkd: "\u{110B}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{C61D}", - nfc: "\u{C61D}", - nfd: "\u{110B}\u{1168}\u{11BC}", - nfkc: "\u{C61D}", - nfkd: "\u{110B}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{C61E}", - nfc: "\u{C61E}", - nfd: "\u{110B}\u{1168}\u{11BD}", - nfkc: "\u{C61E}", - nfkd: "\u{110B}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{C61F}", - nfc: "\u{C61F}", - nfd: "\u{110B}\u{1168}\u{11BE}", - nfkc: "\u{C61F}", - nfkd: "\u{110B}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{C620}", - nfc: "\u{C620}", - nfd: "\u{110B}\u{1168}\u{11BF}", - nfkc: "\u{C620}", - nfkd: "\u{110B}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{C621}", - nfc: "\u{C621}", - nfd: "\u{110B}\u{1168}\u{11C0}", - nfkc: "\u{C621}", - nfkd: "\u{110B}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{C622}", - nfc: "\u{C622}", - nfd: "\u{110B}\u{1168}\u{11C1}", - nfkc: "\u{C622}", - nfkd: "\u{110B}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{C623}", - nfc: "\u{C623}", - nfd: "\u{110B}\u{1168}\u{11C2}", - nfkc: "\u{C623}", - nfkd: "\u{110B}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{C624}", - nfc: "\u{C624}", - nfd: "\u{110B}\u{1169}", - nfkc: "\u{C624}", - nfkd: "\u{110B}\u{1169}", - }, - NormalizationTest { - source: "\u{C625}", - nfc: "\u{C625}", - nfd: "\u{110B}\u{1169}\u{11A8}", - nfkc: "\u{C625}", - nfkd: "\u{110B}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{C626}", - nfc: "\u{C626}", - nfd: "\u{110B}\u{1169}\u{11A9}", - nfkc: "\u{C626}", - nfkd: "\u{110B}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{C627}", - nfc: "\u{C627}", - nfd: "\u{110B}\u{1169}\u{11AA}", - nfkc: "\u{C627}", - nfkd: "\u{110B}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{C628}", - nfc: "\u{C628}", - nfd: "\u{110B}\u{1169}\u{11AB}", - nfkc: "\u{C628}", - nfkd: "\u{110B}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{C629}", - nfc: "\u{C629}", - nfd: "\u{110B}\u{1169}\u{11AC}", - nfkc: "\u{C629}", - nfkd: "\u{110B}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{C62A}", - nfc: "\u{C62A}", - nfd: "\u{110B}\u{1169}\u{11AD}", - nfkc: "\u{C62A}", - nfkd: "\u{110B}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{C62B}", - nfc: "\u{C62B}", - nfd: "\u{110B}\u{1169}\u{11AE}", - nfkc: "\u{C62B}", - nfkd: "\u{110B}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{C62C}", - nfc: "\u{C62C}", - nfd: "\u{110B}\u{1169}\u{11AF}", - nfkc: "\u{C62C}", - nfkd: "\u{110B}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{C62D}", - nfc: "\u{C62D}", - nfd: "\u{110B}\u{1169}\u{11B0}", - nfkc: "\u{C62D}", - nfkd: "\u{110B}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{C62E}", - nfc: "\u{C62E}", - nfd: "\u{110B}\u{1169}\u{11B1}", - nfkc: "\u{C62E}", - nfkd: "\u{110B}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{C62F}", - nfc: "\u{C62F}", - nfd: "\u{110B}\u{1169}\u{11B2}", - nfkc: "\u{C62F}", - nfkd: "\u{110B}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{C630}", - nfc: "\u{C630}", - nfd: "\u{110B}\u{1169}\u{11B3}", - nfkc: "\u{C630}", - nfkd: "\u{110B}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{C631}", - nfc: "\u{C631}", - nfd: "\u{110B}\u{1169}\u{11B4}", - nfkc: "\u{C631}", - nfkd: "\u{110B}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{C632}", - nfc: "\u{C632}", - nfd: "\u{110B}\u{1169}\u{11B5}", - nfkc: "\u{C632}", - nfkd: "\u{110B}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{C633}", - nfc: "\u{C633}", - nfd: "\u{110B}\u{1169}\u{11B6}", - nfkc: "\u{C633}", - nfkd: "\u{110B}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{C634}", - nfc: "\u{C634}", - nfd: "\u{110B}\u{1169}\u{11B7}", - nfkc: "\u{C634}", - nfkd: "\u{110B}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{C635}", - nfc: "\u{C635}", - nfd: "\u{110B}\u{1169}\u{11B8}", - nfkc: "\u{C635}", - nfkd: "\u{110B}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{C636}", - nfc: "\u{C636}", - nfd: "\u{110B}\u{1169}\u{11B9}", - nfkc: "\u{C636}", - nfkd: "\u{110B}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{C637}", - nfc: "\u{C637}", - nfd: "\u{110B}\u{1169}\u{11BA}", - nfkc: "\u{C637}", - nfkd: "\u{110B}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{C638}", - nfc: "\u{C638}", - nfd: "\u{110B}\u{1169}\u{11BB}", - nfkc: "\u{C638}", - nfkd: "\u{110B}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{C639}", - nfc: "\u{C639}", - nfd: "\u{110B}\u{1169}\u{11BC}", - nfkc: "\u{C639}", - nfkd: "\u{110B}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{C63A}", - nfc: "\u{C63A}", - nfd: "\u{110B}\u{1169}\u{11BD}", - nfkc: "\u{C63A}", - nfkd: "\u{110B}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{C63B}", - nfc: "\u{C63B}", - nfd: "\u{110B}\u{1169}\u{11BE}", - nfkc: "\u{C63B}", - nfkd: "\u{110B}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{C63C}", - nfc: "\u{C63C}", - nfd: "\u{110B}\u{1169}\u{11BF}", - nfkc: "\u{C63C}", - nfkd: "\u{110B}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{C63D}", - nfc: "\u{C63D}", - nfd: "\u{110B}\u{1169}\u{11C0}", - nfkc: "\u{C63D}", - nfkd: "\u{110B}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{C63E}", - nfc: "\u{C63E}", - nfd: "\u{110B}\u{1169}\u{11C1}", - nfkc: "\u{C63E}", - nfkd: "\u{110B}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{C63F}", - nfc: "\u{C63F}", - nfd: "\u{110B}\u{1169}\u{11C2}", - nfkc: "\u{C63F}", - nfkd: "\u{110B}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{C640}", - nfc: "\u{C640}", - nfd: "\u{110B}\u{116A}", - nfkc: "\u{C640}", - nfkd: "\u{110B}\u{116A}", - }, - NormalizationTest { - source: "\u{C641}", - nfc: "\u{C641}", - nfd: "\u{110B}\u{116A}\u{11A8}", - nfkc: "\u{C641}", - nfkd: "\u{110B}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{C642}", - nfc: "\u{C642}", - nfd: "\u{110B}\u{116A}\u{11A9}", - nfkc: "\u{C642}", - nfkd: "\u{110B}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{C643}", - nfc: "\u{C643}", - nfd: "\u{110B}\u{116A}\u{11AA}", - nfkc: "\u{C643}", - nfkd: "\u{110B}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{C644}", - nfc: "\u{C644}", - nfd: "\u{110B}\u{116A}\u{11AB}", - nfkc: "\u{C644}", - nfkd: "\u{110B}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{C645}", - nfc: "\u{C645}", - nfd: "\u{110B}\u{116A}\u{11AC}", - nfkc: "\u{C645}", - nfkd: "\u{110B}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{C646}", - nfc: "\u{C646}", - nfd: "\u{110B}\u{116A}\u{11AD}", - nfkc: "\u{C646}", - nfkd: "\u{110B}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{C647}", - nfc: "\u{C647}", - nfd: "\u{110B}\u{116A}\u{11AE}", - nfkc: "\u{C647}", - nfkd: "\u{110B}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{C648}", - nfc: "\u{C648}", - nfd: "\u{110B}\u{116A}\u{11AF}", - nfkc: "\u{C648}", - nfkd: "\u{110B}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{C649}", - nfc: "\u{C649}", - nfd: "\u{110B}\u{116A}\u{11B0}", - nfkc: "\u{C649}", - nfkd: "\u{110B}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{C64A}", - nfc: "\u{C64A}", - nfd: "\u{110B}\u{116A}\u{11B1}", - nfkc: "\u{C64A}", - nfkd: "\u{110B}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{C64B}", - nfc: "\u{C64B}", - nfd: "\u{110B}\u{116A}\u{11B2}", - nfkc: "\u{C64B}", - nfkd: "\u{110B}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{C64C}", - nfc: "\u{C64C}", - nfd: "\u{110B}\u{116A}\u{11B3}", - nfkc: "\u{C64C}", - nfkd: "\u{110B}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{C64D}", - nfc: "\u{C64D}", - nfd: "\u{110B}\u{116A}\u{11B4}", - nfkc: "\u{C64D}", - nfkd: "\u{110B}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{C64E}", - nfc: "\u{C64E}", - nfd: "\u{110B}\u{116A}\u{11B5}", - nfkc: "\u{C64E}", - nfkd: "\u{110B}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{C64F}", - nfc: "\u{C64F}", - nfd: "\u{110B}\u{116A}\u{11B6}", - nfkc: "\u{C64F}", - nfkd: "\u{110B}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{C650}", - nfc: "\u{C650}", - nfd: "\u{110B}\u{116A}\u{11B7}", - nfkc: "\u{C650}", - nfkd: "\u{110B}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{C651}", - nfc: "\u{C651}", - nfd: "\u{110B}\u{116A}\u{11B8}", - nfkc: "\u{C651}", - nfkd: "\u{110B}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{C652}", - nfc: "\u{C652}", - nfd: "\u{110B}\u{116A}\u{11B9}", - nfkc: "\u{C652}", - nfkd: "\u{110B}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{C653}", - nfc: "\u{C653}", - nfd: "\u{110B}\u{116A}\u{11BA}", - nfkc: "\u{C653}", - nfkd: "\u{110B}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{C654}", - nfc: "\u{C654}", - nfd: "\u{110B}\u{116A}\u{11BB}", - nfkc: "\u{C654}", - nfkd: "\u{110B}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{C655}", - nfc: "\u{C655}", - nfd: "\u{110B}\u{116A}\u{11BC}", - nfkc: "\u{C655}", - nfkd: "\u{110B}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{C656}", - nfc: "\u{C656}", - nfd: "\u{110B}\u{116A}\u{11BD}", - nfkc: "\u{C656}", - nfkd: "\u{110B}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{C657}", - nfc: "\u{C657}", - nfd: "\u{110B}\u{116A}\u{11BE}", - nfkc: "\u{C657}", - nfkd: "\u{110B}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{C658}", - nfc: "\u{C658}", - nfd: "\u{110B}\u{116A}\u{11BF}", - nfkc: "\u{C658}", - nfkd: "\u{110B}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{C659}", - nfc: "\u{C659}", - nfd: "\u{110B}\u{116A}\u{11C0}", - nfkc: "\u{C659}", - nfkd: "\u{110B}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{C65A}", - nfc: "\u{C65A}", - nfd: "\u{110B}\u{116A}\u{11C1}", - nfkc: "\u{C65A}", - nfkd: "\u{110B}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{C65B}", - nfc: "\u{C65B}", - nfd: "\u{110B}\u{116A}\u{11C2}", - nfkc: "\u{C65B}", - nfkd: "\u{110B}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{C65C}", - nfc: "\u{C65C}", - nfd: "\u{110B}\u{116B}", - nfkc: "\u{C65C}", - nfkd: "\u{110B}\u{116B}", - }, - NormalizationTest { - source: "\u{C65D}", - nfc: "\u{C65D}", - nfd: "\u{110B}\u{116B}\u{11A8}", - nfkc: "\u{C65D}", - nfkd: "\u{110B}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{C65E}", - nfc: "\u{C65E}", - nfd: "\u{110B}\u{116B}\u{11A9}", - nfkc: "\u{C65E}", - nfkd: "\u{110B}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{C65F}", - nfc: "\u{C65F}", - nfd: "\u{110B}\u{116B}\u{11AA}", - nfkc: "\u{C65F}", - nfkd: "\u{110B}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{C660}", - nfc: "\u{C660}", - nfd: "\u{110B}\u{116B}\u{11AB}", - nfkc: "\u{C660}", - nfkd: "\u{110B}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{C661}", - nfc: "\u{C661}", - nfd: "\u{110B}\u{116B}\u{11AC}", - nfkc: "\u{C661}", - nfkd: "\u{110B}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{C662}", - nfc: "\u{C662}", - nfd: "\u{110B}\u{116B}\u{11AD}", - nfkc: "\u{C662}", - nfkd: "\u{110B}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{C663}", - nfc: "\u{C663}", - nfd: "\u{110B}\u{116B}\u{11AE}", - nfkc: "\u{C663}", - nfkd: "\u{110B}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{C664}", - nfc: "\u{C664}", - nfd: "\u{110B}\u{116B}\u{11AF}", - nfkc: "\u{C664}", - nfkd: "\u{110B}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{C665}", - nfc: "\u{C665}", - nfd: "\u{110B}\u{116B}\u{11B0}", - nfkc: "\u{C665}", - nfkd: "\u{110B}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{C666}", - nfc: "\u{C666}", - nfd: "\u{110B}\u{116B}\u{11B1}", - nfkc: "\u{C666}", - nfkd: "\u{110B}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{C667}", - nfc: "\u{C667}", - nfd: "\u{110B}\u{116B}\u{11B2}", - nfkc: "\u{C667}", - nfkd: "\u{110B}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{C668}", - nfc: "\u{C668}", - nfd: "\u{110B}\u{116B}\u{11B3}", - nfkc: "\u{C668}", - nfkd: "\u{110B}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{C669}", - nfc: "\u{C669}", - nfd: "\u{110B}\u{116B}\u{11B4}", - nfkc: "\u{C669}", - nfkd: "\u{110B}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{C66A}", - nfc: "\u{C66A}", - nfd: "\u{110B}\u{116B}\u{11B5}", - nfkc: "\u{C66A}", - nfkd: "\u{110B}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{C66B}", - nfc: "\u{C66B}", - nfd: "\u{110B}\u{116B}\u{11B6}", - nfkc: "\u{C66B}", - nfkd: "\u{110B}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{C66C}", - nfc: "\u{C66C}", - nfd: "\u{110B}\u{116B}\u{11B7}", - nfkc: "\u{C66C}", - nfkd: "\u{110B}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{C66D}", - nfc: "\u{C66D}", - nfd: "\u{110B}\u{116B}\u{11B8}", - nfkc: "\u{C66D}", - nfkd: "\u{110B}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{C66E}", - nfc: "\u{C66E}", - nfd: "\u{110B}\u{116B}\u{11B9}", - nfkc: "\u{C66E}", - nfkd: "\u{110B}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{C66F}", - nfc: "\u{C66F}", - nfd: "\u{110B}\u{116B}\u{11BA}", - nfkc: "\u{C66F}", - nfkd: "\u{110B}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{C670}", - nfc: "\u{C670}", - nfd: "\u{110B}\u{116B}\u{11BB}", - nfkc: "\u{C670}", - nfkd: "\u{110B}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{C671}", - nfc: "\u{C671}", - nfd: "\u{110B}\u{116B}\u{11BC}", - nfkc: "\u{C671}", - nfkd: "\u{110B}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{C672}", - nfc: "\u{C672}", - nfd: "\u{110B}\u{116B}\u{11BD}", - nfkc: "\u{C672}", - nfkd: "\u{110B}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{C673}", - nfc: "\u{C673}", - nfd: "\u{110B}\u{116B}\u{11BE}", - nfkc: "\u{C673}", - nfkd: "\u{110B}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{C674}", - nfc: "\u{C674}", - nfd: "\u{110B}\u{116B}\u{11BF}", - nfkc: "\u{C674}", - nfkd: "\u{110B}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{C675}", - nfc: "\u{C675}", - nfd: "\u{110B}\u{116B}\u{11C0}", - nfkc: "\u{C675}", - nfkd: "\u{110B}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{C676}", - nfc: "\u{C676}", - nfd: "\u{110B}\u{116B}\u{11C1}", - nfkc: "\u{C676}", - nfkd: "\u{110B}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{C677}", - nfc: "\u{C677}", - nfd: "\u{110B}\u{116B}\u{11C2}", - nfkc: "\u{C677}", - nfkd: "\u{110B}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{C678}", - nfc: "\u{C678}", - nfd: "\u{110B}\u{116C}", - nfkc: "\u{C678}", - nfkd: "\u{110B}\u{116C}", - }, - NormalizationTest { - source: "\u{C679}", - nfc: "\u{C679}", - nfd: "\u{110B}\u{116C}\u{11A8}", - nfkc: "\u{C679}", - nfkd: "\u{110B}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{C67A}", - nfc: "\u{C67A}", - nfd: "\u{110B}\u{116C}\u{11A9}", - nfkc: "\u{C67A}", - nfkd: "\u{110B}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{C67B}", - nfc: "\u{C67B}", - nfd: "\u{110B}\u{116C}\u{11AA}", - nfkc: "\u{C67B}", - nfkd: "\u{110B}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{C67C}", - nfc: "\u{C67C}", - nfd: "\u{110B}\u{116C}\u{11AB}", - nfkc: "\u{C67C}", - nfkd: "\u{110B}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{C67D}", - nfc: "\u{C67D}", - nfd: "\u{110B}\u{116C}\u{11AC}", - nfkc: "\u{C67D}", - nfkd: "\u{110B}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{C67E}", - nfc: "\u{C67E}", - nfd: "\u{110B}\u{116C}\u{11AD}", - nfkc: "\u{C67E}", - nfkd: "\u{110B}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{C67F}", - nfc: "\u{C67F}", - nfd: "\u{110B}\u{116C}\u{11AE}", - nfkc: "\u{C67F}", - nfkd: "\u{110B}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{C680}", - nfc: "\u{C680}", - nfd: "\u{110B}\u{116C}\u{11AF}", - nfkc: "\u{C680}", - nfkd: "\u{110B}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{C681}", - nfc: "\u{C681}", - nfd: "\u{110B}\u{116C}\u{11B0}", - nfkc: "\u{C681}", - nfkd: "\u{110B}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{C682}", - nfc: "\u{C682}", - nfd: "\u{110B}\u{116C}\u{11B1}", - nfkc: "\u{C682}", - nfkd: "\u{110B}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{C683}", - nfc: "\u{C683}", - nfd: "\u{110B}\u{116C}\u{11B2}", - nfkc: "\u{C683}", - nfkd: "\u{110B}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{C684}", - nfc: "\u{C684}", - nfd: "\u{110B}\u{116C}\u{11B3}", - nfkc: "\u{C684}", - nfkd: "\u{110B}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{C685}", - nfc: "\u{C685}", - nfd: "\u{110B}\u{116C}\u{11B4}", - nfkc: "\u{C685}", - nfkd: "\u{110B}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{C686}", - nfc: "\u{C686}", - nfd: "\u{110B}\u{116C}\u{11B5}", - nfkc: "\u{C686}", - nfkd: "\u{110B}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{C687}", - nfc: "\u{C687}", - nfd: "\u{110B}\u{116C}\u{11B6}", - nfkc: "\u{C687}", - nfkd: "\u{110B}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{C688}", - nfc: "\u{C688}", - nfd: "\u{110B}\u{116C}\u{11B7}", - nfkc: "\u{C688}", - nfkd: "\u{110B}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{C689}", - nfc: "\u{C689}", - nfd: "\u{110B}\u{116C}\u{11B8}", - nfkc: "\u{C689}", - nfkd: "\u{110B}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{C68A}", - nfc: "\u{C68A}", - nfd: "\u{110B}\u{116C}\u{11B9}", - nfkc: "\u{C68A}", - nfkd: "\u{110B}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{C68B}", - nfc: "\u{C68B}", - nfd: "\u{110B}\u{116C}\u{11BA}", - nfkc: "\u{C68B}", - nfkd: "\u{110B}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{C68C}", - nfc: "\u{C68C}", - nfd: "\u{110B}\u{116C}\u{11BB}", - nfkc: "\u{C68C}", - nfkd: "\u{110B}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{C68D}", - nfc: "\u{C68D}", - nfd: "\u{110B}\u{116C}\u{11BC}", - nfkc: "\u{C68D}", - nfkd: "\u{110B}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{C68E}", - nfc: "\u{C68E}", - nfd: "\u{110B}\u{116C}\u{11BD}", - nfkc: "\u{C68E}", - nfkd: "\u{110B}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{C68F}", - nfc: "\u{C68F}", - nfd: "\u{110B}\u{116C}\u{11BE}", - nfkc: "\u{C68F}", - nfkd: "\u{110B}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{C690}", - nfc: "\u{C690}", - nfd: "\u{110B}\u{116C}\u{11BF}", - nfkc: "\u{C690}", - nfkd: "\u{110B}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{C691}", - nfc: "\u{C691}", - nfd: "\u{110B}\u{116C}\u{11C0}", - nfkc: "\u{C691}", - nfkd: "\u{110B}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{C692}", - nfc: "\u{C692}", - nfd: "\u{110B}\u{116C}\u{11C1}", - nfkc: "\u{C692}", - nfkd: "\u{110B}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{C693}", - nfc: "\u{C693}", - nfd: "\u{110B}\u{116C}\u{11C2}", - nfkc: "\u{C693}", - nfkd: "\u{110B}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{C694}", - nfc: "\u{C694}", - nfd: "\u{110B}\u{116D}", - nfkc: "\u{C694}", - nfkd: "\u{110B}\u{116D}", - }, - NormalizationTest { - source: "\u{C695}", - nfc: "\u{C695}", - nfd: "\u{110B}\u{116D}\u{11A8}", - nfkc: "\u{C695}", - nfkd: "\u{110B}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{C696}", - nfc: "\u{C696}", - nfd: "\u{110B}\u{116D}\u{11A9}", - nfkc: "\u{C696}", - nfkd: "\u{110B}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{C697}", - nfc: "\u{C697}", - nfd: "\u{110B}\u{116D}\u{11AA}", - nfkc: "\u{C697}", - nfkd: "\u{110B}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{C698}", - nfc: "\u{C698}", - nfd: "\u{110B}\u{116D}\u{11AB}", - nfkc: "\u{C698}", - nfkd: "\u{110B}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{C699}", - nfc: "\u{C699}", - nfd: "\u{110B}\u{116D}\u{11AC}", - nfkc: "\u{C699}", - nfkd: "\u{110B}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{C69A}", - nfc: "\u{C69A}", - nfd: "\u{110B}\u{116D}\u{11AD}", - nfkc: "\u{C69A}", - nfkd: "\u{110B}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{C69B}", - nfc: "\u{C69B}", - nfd: "\u{110B}\u{116D}\u{11AE}", - nfkc: "\u{C69B}", - nfkd: "\u{110B}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{C69C}", - nfc: "\u{C69C}", - nfd: "\u{110B}\u{116D}\u{11AF}", - nfkc: "\u{C69C}", - nfkd: "\u{110B}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{C69D}", - nfc: "\u{C69D}", - nfd: "\u{110B}\u{116D}\u{11B0}", - nfkc: "\u{C69D}", - nfkd: "\u{110B}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{C69E}", - nfc: "\u{C69E}", - nfd: "\u{110B}\u{116D}\u{11B1}", - nfkc: "\u{C69E}", - nfkd: "\u{110B}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{C69F}", - nfc: "\u{C69F}", - nfd: "\u{110B}\u{116D}\u{11B2}", - nfkc: "\u{C69F}", - nfkd: "\u{110B}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{C6A0}", - nfc: "\u{C6A0}", - nfd: "\u{110B}\u{116D}\u{11B3}", - nfkc: "\u{C6A0}", - nfkd: "\u{110B}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{C6A1}", - nfc: "\u{C6A1}", - nfd: "\u{110B}\u{116D}\u{11B4}", - nfkc: "\u{C6A1}", - nfkd: "\u{110B}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{C6A2}", - nfc: "\u{C6A2}", - nfd: "\u{110B}\u{116D}\u{11B5}", - nfkc: "\u{C6A2}", - nfkd: "\u{110B}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{C6A3}", - nfc: "\u{C6A3}", - nfd: "\u{110B}\u{116D}\u{11B6}", - nfkc: "\u{C6A3}", - nfkd: "\u{110B}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{C6A4}", - nfc: "\u{C6A4}", - nfd: "\u{110B}\u{116D}\u{11B7}", - nfkc: "\u{C6A4}", - nfkd: "\u{110B}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{C6A5}", - nfc: "\u{C6A5}", - nfd: "\u{110B}\u{116D}\u{11B8}", - nfkc: "\u{C6A5}", - nfkd: "\u{110B}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{C6A6}", - nfc: "\u{C6A6}", - nfd: "\u{110B}\u{116D}\u{11B9}", - nfkc: "\u{C6A6}", - nfkd: "\u{110B}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{C6A7}", - nfc: "\u{C6A7}", - nfd: "\u{110B}\u{116D}\u{11BA}", - nfkc: "\u{C6A7}", - nfkd: "\u{110B}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{C6A8}", - nfc: "\u{C6A8}", - nfd: "\u{110B}\u{116D}\u{11BB}", - nfkc: "\u{C6A8}", - nfkd: "\u{110B}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{C6A9}", - nfc: "\u{C6A9}", - nfd: "\u{110B}\u{116D}\u{11BC}", - nfkc: "\u{C6A9}", - nfkd: "\u{110B}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{C6AA}", - nfc: "\u{C6AA}", - nfd: "\u{110B}\u{116D}\u{11BD}", - nfkc: "\u{C6AA}", - nfkd: "\u{110B}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{C6AB}", - nfc: "\u{C6AB}", - nfd: "\u{110B}\u{116D}\u{11BE}", - nfkc: "\u{C6AB}", - nfkd: "\u{110B}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{C6AC}", - nfc: "\u{C6AC}", - nfd: "\u{110B}\u{116D}\u{11BF}", - nfkc: "\u{C6AC}", - nfkd: "\u{110B}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{C6AD}", - nfc: "\u{C6AD}", - nfd: "\u{110B}\u{116D}\u{11C0}", - nfkc: "\u{C6AD}", - nfkd: "\u{110B}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{C6AE}", - nfc: "\u{C6AE}", - nfd: "\u{110B}\u{116D}\u{11C1}", - nfkc: "\u{C6AE}", - nfkd: "\u{110B}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{C6AF}", - nfc: "\u{C6AF}", - nfd: "\u{110B}\u{116D}\u{11C2}", - nfkc: "\u{C6AF}", - nfkd: "\u{110B}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{C6B0}", - nfc: "\u{C6B0}", - nfd: "\u{110B}\u{116E}", - nfkc: "\u{C6B0}", - nfkd: "\u{110B}\u{116E}", - }, - NormalizationTest { - source: "\u{C6B1}", - nfc: "\u{C6B1}", - nfd: "\u{110B}\u{116E}\u{11A8}", - nfkc: "\u{C6B1}", - nfkd: "\u{110B}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{C6B2}", - nfc: "\u{C6B2}", - nfd: "\u{110B}\u{116E}\u{11A9}", - nfkc: "\u{C6B2}", - nfkd: "\u{110B}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{C6B3}", - nfc: "\u{C6B3}", - nfd: "\u{110B}\u{116E}\u{11AA}", - nfkc: "\u{C6B3}", - nfkd: "\u{110B}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{C6B4}", - nfc: "\u{C6B4}", - nfd: "\u{110B}\u{116E}\u{11AB}", - nfkc: "\u{C6B4}", - nfkd: "\u{110B}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{C6B5}", - nfc: "\u{C6B5}", - nfd: "\u{110B}\u{116E}\u{11AC}", - nfkc: "\u{C6B5}", - nfkd: "\u{110B}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{C6B6}", - nfc: "\u{C6B6}", - nfd: "\u{110B}\u{116E}\u{11AD}", - nfkc: "\u{C6B6}", - nfkd: "\u{110B}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{C6B7}", - nfc: "\u{C6B7}", - nfd: "\u{110B}\u{116E}\u{11AE}", - nfkc: "\u{C6B7}", - nfkd: "\u{110B}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{C6B8}", - nfc: "\u{C6B8}", - nfd: "\u{110B}\u{116E}\u{11AF}", - nfkc: "\u{C6B8}", - nfkd: "\u{110B}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{C6B9}", - nfc: "\u{C6B9}", - nfd: "\u{110B}\u{116E}\u{11B0}", - nfkc: "\u{C6B9}", - nfkd: "\u{110B}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{C6BA}", - nfc: "\u{C6BA}", - nfd: "\u{110B}\u{116E}\u{11B1}", - nfkc: "\u{C6BA}", - nfkd: "\u{110B}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{C6BB}", - nfc: "\u{C6BB}", - nfd: "\u{110B}\u{116E}\u{11B2}", - nfkc: "\u{C6BB}", - nfkd: "\u{110B}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{C6BC}", - nfc: "\u{C6BC}", - nfd: "\u{110B}\u{116E}\u{11B3}", - nfkc: "\u{C6BC}", - nfkd: "\u{110B}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{C6BD}", - nfc: "\u{C6BD}", - nfd: "\u{110B}\u{116E}\u{11B4}", - nfkc: "\u{C6BD}", - nfkd: "\u{110B}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{C6BE}", - nfc: "\u{C6BE}", - nfd: "\u{110B}\u{116E}\u{11B5}", - nfkc: "\u{C6BE}", - nfkd: "\u{110B}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{C6BF}", - nfc: "\u{C6BF}", - nfd: "\u{110B}\u{116E}\u{11B6}", - nfkc: "\u{C6BF}", - nfkd: "\u{110B}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{C6C0}", - nfc: "\u{C6C0}", - nfd: "\u{110B}\u{116E}\u{11B7}", - nfkc: "\u{C6C0}", - nfkd: "\u{110B}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{C6C1}", - nfc: "\u{C6C1}", - nfd: "\u{110B}\u{116E}\u{11B8}", - nfkc: "\u{C6C1}", - nfkd: "\u{110B}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{C6C2}", - nfc: "\u{C6C2}", - nfd: "\u{110B}\u{116E}\u{11B9}", - nfkc: "\u{C6C2}", - nfkd: "\u{110B}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{C6C3}", - nfc: "\u{C6C3}", - nfd: "\u{110B}\u{116E}\u{11BA}", - nfkc: "\u{C6C3}", - nfkd: "\u{110B}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{C6C4}", - nfc: "\u{C6C4}", - nfd: "\u{110B}\u{116E}\u{11BB}", - nfkc: "\u{C6C4}", - nfkd: "\u{110B}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{C6C5}", - nfc: "\u{C6C5}", - nfd: "\u{110B}\u{116E}\u{11BC}", - nfkc: "\u{C6C5}", - nfkd: "\u{110B}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{C6C6}", - nfc: "\u{C6C6}", - nfd: "\u{110B}\u{116E}\u{11BD}", - nfkc: "\u{C6C6}", - nfkd: "\u{110B}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{C6C7}", - nfc: "\u{C6C7}", - nfd: "\u{110B}\u{116E}\u{11BE}", - nfkc: "\u{C6C7}", - nfkd: "\u{110B}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{C6C8}", - nfc: "\u{C6C8}", - nfd: "\u{110B}\u{116E}\u{11BF}", - nfkc: "\u{C6C8}", - nfkd: "\u{110B}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{C6C9}", - nfc: "\u{C6C9}", - nfd: "\u{110B}\u{116E}\u{11C0}", - nfkc: "\u{C6C9}", - nfkd: "\u{110B}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{C6CA}", - nfc: "\u{C6CA}", - nfd: "\u{110B}\u{116E}\u{11C1}", - nfkc: "\u{C6CA}", - nfkd: "\u{110B}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{C6CB}", - nfc: "\u{C6CB}", - nfd: "\u{110B}\u{116E}\u{11C2}", - nfkc: "\u{C6CB}", - nfkd: "\u{110B}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{C6CC}", - nfc: "\u{C6CC}", - nfd: "\u{110B}\u{116F}", - nfkc: "\u{C6CC}", - nfkd: "\u{110B}\u{116F}", - }, - NormalizationTest { - source: "\u{C6CD}", - nfc: "\u{C6CD}", - nfd: "\u{110B}\u{116F}\u{11A8}", - nfkc: "\u{C6CD}", - nfkd: "\u{110B}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{C6CE}", - nfc: "\u{C6CE}", - nfd: "\u{110B}\u{116F}\u{11A9}", - nfkc: "\u{C6CE}", - nfkd: "\u{110B}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{C6CF}", - nfc: "\u{C6CF}", - nfd: "\u{110B}\u{116F}\u{11AA}", - nfkc: "\u{C6CF}", - nfkd: "\u{110B}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{C6D0}", - nfc: "\u{C6D0}", - nfd: "\u{110B}\u{116F}\u{11AB}", - nfkc: "\u{C6D0}", - nfkd: "\u{110B}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{C6D1}", - nfc: "\u{C6D1}", - nfd: "\u{110B}\u{116F}\u{11AC}", - nfkc: "\u{C6D1}", - nfkd: "\u{110B}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{C6D2}", - nfc: "\u{C6D2}", - nfd: "\u{110B}\u{116F}\u{11AD}", - nfkc: "\u{C6D2}", - nfkd: "\u{110B}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{C6D3}", - nfc: "\u{C6D3}", - nfd: "\u{110B}\u{116F}\u{11AE}", - nfkc: "\u{C6D3}", - nfkd: "\u{110B}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{C6D4}", - nfc: "\u{C6D4}", - nfd: "\u{110B}\u{116F}\u{11AF}", - nfkc: "\u{C6D4}", - nfkd: "\u{110B}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{C6D5}", - nfc: "\u{C6D5}", - nfd: "\u{110B}\u{116F}\u{11B0}", - nfkc: "\u{C6D5}", - nfkd: "\u{110B}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{C6D6}", - nfc: "\u{C6D6}", - nfd: "\u{110B}\u{116F}\u{11B1}", - nfkc: "\u{C6D6}", - nfkd: "\u{110B}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{C6D7}", - nfc: "\u{C6D7}", - nfd: "\u{110B}\u{116F}\u{11B2}", - nfkc: "\u{C6D7}", - nfkd: "\u{110B}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{C6D8}", - nfc: "\u{C6D8}", - nfd: "\u{110B}\u{116F}\u{11B3}", - nfkc: "\u{C6D8}", - nfkd: "\u{110B}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{C6D9}", - nfc: "\u{C6D9}", - nfd: "\u{110B}\u{116F}\u{11B4}", - nfkc: "\u{C6D9}", - nfkd: "\u{110B}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{C6DA}", - nfc: "\u{C6DA}", - nfd: "\u{110B}\u{116F}\u{11B5}", - nfkc: "\u{C6DA}", - nfkd: "\u{110B}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{C6DB}", - nfc: "\u{C6DB}", - nfd: "\u{110B}\u{116F}\u{11B6}", - nfkc: "\u{C6DB}", - nfkd: "\u{110B}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{C6DC}", - nfc: "\u{C6DC}", - nfd: "\u{110B}\u{116F}\u{11B7}", - nfkc: "\u{C6DC}", - nfkd: "\u{110B}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{C6DD}", - nfc: "\u{C6DD}", - nfd: "\u{110B}\u{116F}\u{11B8}", - nfkc: "\u{C6DD}", - nfkd: "\u{110B}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{C6DE}", - nfc: "\u{C6DE}", - nfd: "\u{110B}\u{116F}\u{11B9}", - nfkc: "\u{C6DE}", - nfkd: "\u{110B}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{C6DF}", - nfc: "\u{C6DF}", - nfd: "\u{110B}\u{116F}\u{11BA}", - nfkc: "\u{C6DF}", - nfkd: "\u{110B}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{C6E0}", - nfc: "\u{C6E0}", - nfd: "\u{110B}\u{116F}\u{11BB}", - nfkc: "\u{C6E0}", - nfkd: "\u{110B}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{C6E1}", - nfc: "\u{C6E1}", - nfd: "\u{110B}\u{116F}\u{11BC}", - nfkc: "\u{C6E1}", - nfkd: "\u{110B}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{C6E2}", - nfc: "\u{C6E2}", - nfd: "\u{110B}\u{116F}\u{11BD}", - nfkc: "\u{C6E2}", - nfkd: "\u{110B}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{C6E3}", - nfc: "\u{C6E3}", - nfd: "\u{110B}\u{116F}\u{11BE}", - nfkc: "\u{C6E3}", - nfkd: "\u{110B}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{C6E4}", - nfc: "\u{C6E4}", - nfd: "\u{110B}\u{116F}\u{11BF}", - nfkc: "\u{C6E4}", - nfkd: "\u{110B}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{C6E5}", - nfc: "\u{C6E5}", - nfd: "\u{110B}\u{116F}\u{11C0}", - nfkc: "\u{C6E5}", - nfkd: "\u{110B}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{C6E6}", - nfc: "\u{C6E6}", - nfd: "\u{110B}\u{116F}\u{11C1}", - nfkc: "\u{C6E6}", - nfkd: "\u{110B}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{C6E7}", - nfc: "\u{C6E7}", - nfd: "\u{110B}\u{116F}\u{11C2}", - nfkc: "\u{C6E7}", - nfkd: "\u{110B}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{C6E8}", - nfc: "\u{C6E8}", - nfd: "\u{110B}\u{1170}", - nfkc: "\u{C6E8}", - nfkd: "\u{110B}\u{1170}", - }, - NormalizationTest { - source: "\u{C6E9}", - nfc: "\u{C6E9}", - nfd: "\u{110B}\u{1170}\u{11A8}", - nfkc: "\u{C6E9}", - nfkd: "\u{110B}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{C6EA}", - nfc: "\u{C6EA}", - nfd: "\u{110B}\u{1170}\u{11A9}", - nfkc: "\u{C6EA}", - nfkd: "\u{110B}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{C6EB}", - nfc: "\u{C6EB}", - nfd: "\u{110B}\u{1170}\u{11AA}", - nfkc: "\u{C6EB}", - nfkd: "\u{110B}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{C6EC}", - nfc: "\u{C6EC}", - nfd: "\u{110B}\u{1170}\u{11AB}", - nfkc: "\u{C6EC}", - nfkd: "\u{110B}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{C6ED}", - nfc: "\u{C6ED}", - nfd: "\u{110B}\u{1170}\u{11AC}", - nfkc: "\u{C6ED}", - nfkd: "\u{110B}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{C6EE}", - nfc: "\u{C6EE}", - nfd: "\u{110B}\u{1170}\u{11AD}", - nfkc: "\u{C6EE}", - nfkd: "\u{110B}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{C6EF}", - nfc: "\u{C6EF}", - nfd: "\u{110B}\u{1170}\u{11AE}", - nfkc: "\u{C6EF}", - nfkd: "\u{110B}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{C6F0}", - nfc: "\u{C6F0}", - nfd: "\u{110B}\u{1170}\u{11AF}", - nfkc: "\u{C6F0}", - nfkd: "\u{110B}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{C6F1}", - nfc: "\u{C6F1}", - nfd: "\u{110B}\u{1170}\u{11B0}", - nfkc: "\u{C6F1}", - nfkd: "\u{110B}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{C6F2}", - nfc: "\u{C6F2}", - nfd: "\u{110B}\u{1170}\u{11B1}", - nfkc: "\u{C6F2}", - nfkd: "\u{110B}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{C6F3}", - nfc: "\u{C6F3}", - nfd: "\u{110B}\u{1170}\u{11B2}", - nfkc: "\u{C6F3}", - nfkd: "\u{110B}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{C6F4}", - nfc: "\u{C6F4}", - nfd: "\u{110B}\u{1170}\u{11B3}", - nfkc: "\u{C6F4}", - nfkd: "\u{110B}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{C6F5}", - nfc: "\u{C6F5}", - nfd: "\u{110B}\u{1170}\u{11B4}", - nfkc: "\u{C6F5}", - nfkd: "\u{110B}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{C6F6}", - nfc: "\u{C6F6}", - nfd: "\u{110B}\u{1170}\u{11B5}", - nfkc: "\u{C6F6}", - nfkd: "\u{110B}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{C6F7}", - nfc: "\u{C6F7}", - nfd: "\u{110B}\u{1170}\u{11B6}", - nfkc: "\u{C6F7}", - nfkd: "\u{110B}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{C6F8}", - nfc: "\u{C6F8}", - nfd: "\u{110B}\u{1170}\u{11B7}", - nfkc: "\u{C6F8}", - nfkd: "\u{110B}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{C6F9}", - nfc: "\u{C6F9}", - nfd: "\u{110B}\u{1170}\u{11B8}", - nfkc: "\u{C6F9}", - nfkd: "\u{110B}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{C6FA}", - nfc: "\u{C6FA}", - nfd: "\u{110B}\u{1170}\u{11B9}", - nfkc: "\u{C6FA}", - nfkd: "\u{110B}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{C6FB}", - nfc: "\u{C6FB}", - nfd: "\u{110B}\u{1170}\u{11BA}", - nfkc: "\u{C6FB}", - nfkd: "\u{110B}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{C6FC}", - nfc: "\u{C6FC}", - nfd: "\u{110B}\u{1170}\u{11BB}", - nfkc: "\u{C6FC}", - nfkd: "\u{110B}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{C6FD}", - nfc: "\u{C6FD}", - nfd: "\u{110B}\u{1170}\u{11BC}", - nfkc: "\u{C6FD}", - nfkd: "\u{110B}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{C6FE}", - nfc: "\u{C6FE}", - nfd: "\u{110B}\u{1170}\u{11BD}", - nfkc: "\u{C6FE}", - nfkd: "\u{110B}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{C6FF}", - nfc: "\u{C6FF}", - nfd: "\u{110B}\u{1170}\u{11BE}", - nfkc: "\u{C6FF}", - nfkd: "\u{110B}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{C700}", - nfc: "\u{C700}", - nfd: "\u{110B}\u{1170}\u{11BF}", - nfkc: "\u{C700}", - nfkd: "\u{110B}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{C701}", - nfc: "\u{C701}", - nfd: "\u{110B}\u{1170}\u{11C0}", - nfkc: "\u{C701}", - nfkd: "\u{110B}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{C702}", - nfc: "\u{C702}", - nfd: "\u{110B}\u{1170}\u{11C1}", - nfkc: "\u{C702}", - nfkd: "\u{110B}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{C703}", - nfc: "\u{C703}", - nfd: "\u{110B}\u{1170}\u{11C2}", - nfkc: "\u{C703}", - nfkd: "\u{110B}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{C704}", - nfc: "\u{C704}", - nfd: "\u{110B}\u{1171}", - nfkc: "\u{C704}", - nfkd: "\u{110B}\u{1171}", - }, - NormalizationTest { - source: "\u{C705}", - nfc: "\u{C705}", - nfd: "\u{110B}\u{1171}\u{11A8}", - nfkc: "\u{C705}", - nfkd: "\u{110B}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{C706}", - nfc: "\u{C706}", - nfd: "\u{110B}\u{1171}\u{11A9}", - nfkc: "\u{C706}", - nfkd: "\u{110B}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{C707}", - nfc: "\u{C707}", - nfd: "\u{110B}\u{1171}\u{11AA}", - nfkc: "\u{C707}", - nfkd: "\u{110B}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{C708}", - nfc: "\u{C708}", - nfd: "\u{110B}\u{1171}\u{11AB}", - nfkc: "\u{C708}", - nfkd: "\u{110B}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{C709}", - nfc: "\u{C709}", - nfd: "\u{110B}\u{1171}\u{11AC}", - nfkc: "\u{C709}", - nfkd: "\u{110B}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{C70A}", - nfc: "\u{C70A}", - nfd: "\u{110B}\u{1171}\u{11AD}", - nfkc: "\u{C70A}", - nfkd: "\u{110B}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{C70B}", - nfc: "\u{C70B}", - nfd: "\u{110B}\u{1171}\u{11AE}", - nfkc: "\u{C70B}", - nfkd: "\u{110B}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{C70C}", - nfc: "\u{C70C}", - nfd: "\u{110B}\u{1171}\u{11AF}", - nfkc: "\u{C70C}", - nfkd: "\u{110B}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{C70D}", - nfc: "\u{C70D}", - nfd: "\u{110B}\u{1171}\u{11B0}", - nfkc: "\u{C70D}", - nfkd: "\u{110B}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{C70E}", - nfc: "\u{C70E}", - nfd: "\u{110B}\u{1171}\u{11B1}", - nfkc: "\u{C70E}", - nfkd: "\u{110B}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{C70F}", - nfc: "\u{C70F}", - nfd: "\u{110B}\u{1171}\u{11B2}", - nfkc: "\u{C70F}", - nfkd: "\u{110B}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{C710}", - nfc: "\u{C710}", - nfd: "\u{110B}\u{1171}\u{11B3}", - nfkc: "\u{C710}", - nfkd: "\u{110B}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{C711}", - nfc: "\u{C711}", - nfd: "\u{110B}\u{1171}\u{11B4}", - nfkc: "\u{C711}", - nfkd: "\u{110B}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{C712}", - nfc: "\u{C712}", - nfd: "\u{110B}\u{1171}\u{11B5}", - nfkc: "\u{C712}", - nfkd: "\u{110B}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{C713}", - nfc: "\u{C713}", - nfd: "\u{110B}\u{1171}\u{11B6}", - nfkc: "\u{C713}", - nfkd: "\u{110B}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{C714}", - nfc: "\u{C714}", - nfd: "\u{110B}\u{1171}\u{11B7}", - nfkc: "\u{C714}", - nfkd: "\u{110B}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{C715}", - nfc: "\u{C715}", - nfd: "\u{110B}\u{1171}\u{11B8}", - nfkc: "\u{C715}", - nfkd: "\u{110B}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{C716}", - nfc: "\u{C716}", - nfd: "\u{110B}\u{1171}\u{11B9}", - nfkc: "\u{C716}", - nfkd: "\u{110B}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{C717}", - nfc: "\u{C717}", - nfd: "\u{110B}\u{1171}\u{11BA}", - nfkc: "\u{C717}", - nfkd: "\u{110B}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{C718}", - nfc: "\u{C718}", - nfd: "\u{110B}\u{1171}\u{11BB}", - nfkc: "\u{C718}", - nfkd: "\u{110B}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{C719}", - nfc: "\u{C719}", - nfd: "\u{110B}\u{1171}\u{11BC}", - nfkc: "\u{C719}", - nfkd: "\u{110B}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{C71A}", - nfc: "\u{C71A}", - nfd: "\u{110B}\u{1171}\u{11BD}", - nfkc: "\u{C71A}", - nfkd: "\u{110B}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{C71B}", - nfc: "\u{C71B}", - nfd: "\u{110B}\u{1171}\u{11BE}", - nfkc: "\u{C71B}", - nfkd: "\u{110B}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{C71C}", - nfc: "\u{C71C}", - nfd: "\u{110B}\u{1171}\u{11BF}", - nfkc: "\u{C71C}", - nfkd: "\u{110B}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{C71D}", - nfc: "\u{C71D}", - nfd: "\u{110B}\u{1171}\u{11C0}", - nfkc: "\u{C71D}", - nfkd: "\u{110B}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{C71E}", - nfc: "\u{C71E}", - nfd: "\u{110B}\u{1171}\u{11C1}", - nfkc: "\u{C71E}", - nfkd: "\u{110B}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{C71F}", - nfc: "\u{C71F}", - nfd: "\u{110B}\u{1171}\u{11C2}", - nfkc: "\u{C71F}", - nfkd: "\u{110B}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{C720}", - nfc: "\u{C720}", - nfd: "\u{110B}\u{1172}", - nfkc: "\u{C720}", - nfkd: "\u{110B}\u{1172}", - }, - NormalizationTest { - source: "\u{C721}", - nfc: "\u{C721}", - nfd: "\u{110B}\u{1172}\u{11A8}", - nfkc: "\u{C721}", - nfkd: "\u{110B}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{C722}", - nfc: "\u{C722}", - nfd: "\u{110B}\u{1172}\u{11A9}", - nfkc: "\u{C722}", - nfkd: "\u{110B}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{C723}", - nfc: "\u{C723}", - nfd: "\u{110B}\u{1172}\u{11AA}", - nfkc: "\u{C723}", - nfkd: "\u{110B}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{C724}", - nfc: "\u{C724}", - nfd: "\u{110B}\u{1172}\u{11AB}", - nfkc: "\u{C724}", - nfkd: "\u{110B}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{C725}", - nfc: "\u{C725}", - nfd: "\u{110B}\u{1172}\u{11AC}", - nfkc: "\u{C725}", - nfkd: "\u{110B}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{C726}", - nfc: "\u{C726}", - nfd: "\u{110B}\u{1172}\u{11AD}", - nfkc: "\u{C726}", - nfkd: "\u{110B}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{C727}", - nfc: "\u{C727}", - nfd: "\u{110B}\u{1172}\u{11AE}", - nfkc: "\u{C727}", - nfkd: "\u{110B}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{C728}", - nfc: "\u{C728}", - nfd: "\u{110B}\u{1172}\u{11AF}", - nfkc: "\u{C728}", - nfkd: "\u{110B}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{C729}", - nfc: "\u{C729}", - nfd: "\u{110B}\u{1172}\u{11B0}", - nfkc: "\u{C729}", - nfkd: "\u{110B}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{C72A}", - nfc: "\u{C72A}", - nfd: "\u{110B}\u{1172}\u{11B1}", - nfkc: "\u{C72A}", - nfkd: "\u{110B}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{C72B}", - nfc: "\u{C72B}", - nfd: "\u{110B}\u{1172}\u{11B2}", - nfkc: "\u{C72B}", - nfkd: "\u{110B}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{C72C}", - nfc: "\u{C72C}", - nfd: "\u{110B}\u{1172}\u{11B3}", - nfkc: "\u{C72C}", - nfkd: "\u{110B}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{C72D}", - nfc: "\u{C72D}", - nfd: "\u{110B}\u{1172}\u{11B4}", - nfkc: "\u{C72D}", - nfkd: "\u{110B}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{C72E}", - nfc: "\u{C72E}", - nfd: "\u{110B}\u{1172}\u{11B5}", - nfkc: "\u{C72E}", - nfkd: "\u{110B}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{C72F}", - nfc: "\u{C72F}", - nfd: "\u{110B}\u{1172}\u{11B6}", - nfkc: "\u{C72F}", - nfkd: "\u{110B}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{C730}", - nfc: "\u{C730}", - nfd: "\u{110B}\u{1172}\u{11B7}", - nfkc: "\u{C730}", - nfkd: "\u{110B}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{C731}", - nfc: "\u{C731}", - nfd: "\u{110B}\u{1172}\u{11B8}", - nfkc: "\u{C731}", - nfkd: "\u{110B}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{C732}", - nfc: "\u{C732}", - nfd: "\u{110B}\u{1172}\u{11B9}", - nfkc: "\u{C732}", - nfkd: "\u{110B}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{C733}", - nfc: "\u{C733}", - nfd: "\u{110B}\u{1172}\u{11BA}", - nfkc: "\u{C733}", - nfkd: "\u{110B}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{C734}", - nfc: "\u{C734}", - nfd: "\u{110B}\u{1172}\u{11BB}", - nfkc: "\u{C734}", - nfkd: "\u{110B}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{C735}", - nfc: "\u{C735}", - nfd: "\u{110B}\u{1172}\u{11BC}", - nfkc: "\u{C735}", - nfkd: "\u{110B}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{C736}", - nfc: "\u{C736}", - nfd: "\u{110B}\u{1172}\u{11BD}", - nfkc: "\u{C736}", - nfkd: "\u{110B}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{C737}", - nfc: "\u{C737}", - nfd: "\u{110B}\u{1172}\u{11BE}", - nfkc: "\u{C737}", - nfkd: "\u{110B}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{C738}", - nfc: "\u{C738}", - nfd: "\u{110B}\u{1172}\u{11BF}", - nfkc: "\u{C738}", - nfkd: "\u{110B}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{C739}", - nfc: "\u{C739}", - nfd: "\u{110B}\u{1172}\u{11C0}", - nfkc: "\u{C739}", - nfkd: "\u{110B}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{C73A}", - nfc: "\u{C73A}", - nfd: "\u{110B}\u{1172}\u{11C1}", - nfkc: "\u{C73A}", - nfkd: "\u{110B}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{C73B}", - nfc: "\u{C73B}", - nfd: "\u{110B}\u{1172}\u{11C2}", - nfkc: "\u{C73B}", - nfkd: "\u{110B}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{C73C}", - nfc: "\u{C73C}", - nfd: "\u{110B}\u{1173}", - nfkc: "\u{C73C}", - nfkd: "\u{110B}\u{1173}", - }, - NormalizationTest { - source: "\u{C73D}", - nfc: "\u{C73D}", - nfd: "\u{110B}\u{1173}\u{11A8}", - nfkc: "\u{C73D}", - nfkd: "\u{110B}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{C73E}", - nfc: "\u{C73E}", - nfd: "\u{110B}\u{1173}\u{11A9}", - nfkc: "\u{C73E}", - nfkd: "\u{110B}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{C73F}", - nfc: "\u{C73F}", - nfd: "\u{110B}\u{1173}\u{11AA}", - nfkc: "\u{C73F}", - nfkd: "\u{110B}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{C740}", - nfc: "\u{C740}", - nfd: "\u{110B}\u{1173}\u{11AB}", - nfkc: "\u{C740}", - nfkd: "\u{110B}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{C741}", - nfc: "\u{C741}", - nfd: "\u{110B}\u{1173}\u{11AC}", - nfkc: "\u{C741}", - nfkd: "\u{110B}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{C742}", - nfc: "\u{C742}", - nfd: "\u{110B}\u{1173}\u{11AD}", - nfkc: "\u{C742}", - nfkd: "\u{110B}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{C743}", - nfc: "\u{C743}", - nfd: "\u{110B}\u{1173}\u{11AE}", - nfkc: "\u{C743}", - nfkd: "\u{110B}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{C744}", - nfc: "\u{C744}", - nfd: "\u{110B}\u{1173}\u{11AF}", - nfkc: "\u{C744}", - nfkd: "\u{110B}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{C745}", - nfc: "\u{C745}", - nfd: "\u{110B}\u{1173}\u{11B0}", - nfkc: "\u{C745}", - nfkd: "\u{110B}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{C746}", - nfc: "\u{C746}", - nfd: "\u{110B}\u{1173}\u{11B1}", - nfkc: "\u{C746}", - nfkd: "\u{110B}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{C747}", - nfc: "\u{C747}", - nfd: "\u{110B}\u{1173}\u{11B2}", - nfkc: "\u{C747}", - nfkd: "\u{110B}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{C748}", - nfc: "\u{C748}", - nfd: "\u{110B}\u{1173}\u{11B3}", - nfkc: "\u{C748}", - nfkd: "\u{110B}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{C749}", - nfc: "\u{C749}", - nfd: "\u{110B}\u{1173}\u{11B4}", - nfkc: "\u{C749}", - nfkd: "\u{110B}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{C74A}", - nfc: "\u{C74A}", - nfd: "\u{110B}\u{1173}\u{11B5}", - nfkc: "\u{C74A}", - nfkd: "\u{110B}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{C74B}", - nfc: "\u{C74B}", - nfd: "\u{110B}\u{1173}\u{11B6}", - nfkc: "\u{C74B}", - nfkd: "\u{110B}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{C74C}", - nfc: "\u{C74C}", - nfd: "\u{110B}\u{1173}\u{11B7}", - nfkc: "\u{C74C}", - nfkd: "\u{110B}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{C74D}", - nfc: "\u{C74D}", - nfd: "\u{110B}\u{1173}\u{11B8}", - nfkc: "\u{C74D}", - nfkd: "\u{110B}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{C74E}", - nfc: "\u{C74E}", - nfd: "\u{110B}\u{1173}\u{11B9}", - nfkc: "\u{C74E}", - nfkd: "\u{110B}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{C74F}", - nfc: "\u{C74F}", - nfd: "\u{110B}\u{1173}\u{11BA}", - nfkc: "\u{C74F}", - nfkd: "\u{110B}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{C750}", - nfc: "\u{C750}", - nfd: "\u{110B}\u{1173}\u{11BB}", - nfkc: "\u{C750}", - nfkd: "\u{110B}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{C751}", - nfc: "\u{C751}", - nfd: "\u{110B}\u{1173}\u{11BC}", - nfkc: "\u{C751}", - nfkd: "\u{110B}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{C752}", - nfc: "\u{C752}", - nfd: "\u{110B}\u{1173}\u{11BD}", - nfkc: "\u{C752}", - nfkd: "\u{110B}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{C753}", - nfc: "\u{C753}", - nfd: "\u{110B}\u{1173}\u{11BE}", - nfkc: "\u{C753}", - nfkd: "\u{110B}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{C754}", - nfc: "\u{C754}", - nfd: "\u{110B}\u{1173}\u{11BF}", - nfkc: "\u{C754}", - nfkd: "\u{110B}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{C755}", - nfc: "\u{C755}", - nfd: "\u{110B}\u{1173}\u{11C0}", - nfkc: "\u{C755}", - nfkd: "\u{110B}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{C756}", - nfc: "\u{C756}", - nfd: "\u{110B}\u{1173}\u{11C1}", - nfkc: "\u{C756}", - nfkd: "\u{110B}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{C757}", - nfc: "\u{C757}", - nfd: "\u{110B}\u{1173}\u{11C2}", - nfkc: "\u{C757}", - nfkd: "\u{110B}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{C758}", - nfc: "\u{C758}", - nfd: "\u{110B}\u{1174}", - nfkc: "\u{C758}", - nfkd: "\u{110B}\u{1174}", - }, - NormalizationTest { - source: "\u{C759}", - nfc: "\u{C759}", - nfd: "\u{110B}\u{1174}\u{11A8}", - nfkc: "\u{C759}", - nfkd: "\u{110B}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{C75A}", - nfc: "\u{C75A}", - nfd: "\u{110B}\u{1174}\u{11A9}", - nfkc: "\u{C75A}", - nfkd: "\u{110B}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{C75B}", - nfc: "\u{C75B}", - nfd: "\u{110B}\u{1174}\u{11AA}", - nfkc: "\u{C75B}", - nfkd: "\u{110B}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{C75C}", - nfc: "\u{C75C}", - nfd: "\u{110B}\u{1174}\u{11AB}", - nfkc: "\u{C75C}", - nfkd: "\u{110B}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{C75D}", - nfc: "\u{C75D}", - nfd: "\u{110B}\u{1174}\u{11AC}", - nfkc: "\u{C75D}", - nfkd: "\u{110B}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{C75E}", - nfc: "\u{C75E}", - nfd: "\u{110B}\u{1174}\u{11AD}", - nfkc: "\u{C75E}", - nfkd: "\u{110B}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{C75F}", - nfc: "\u{C75F}", - nfd: "\u{110B}\u{1174}\u{11AE}", - nfkc: "\u{C75F}", - nfkd: "\u{110B}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{C760}", - nfc: "\u{C760}", - nfd: "\u{110B}\u{1174}\u{11AF}", - nfkc: "\u{C760}", - nfkd: "\u{110B}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{C761}", - nfc: "\u{C761}", - nfd: "\u{110B}\u{1174}\u{11B0}", - nfkc: "\u{C761}", - nfkd: "\u{110B}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{C762}", - nfc: "\u{C762}", - nfd: "\u{110B}\u{1174}\u{11B1}", - nfkc: "\u{C762}", - nfkd: "\u{110B}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{C763}", - nfc: "\u{C763}", - nfd: "\u{110B}\u{1174}\u{11B2}", - nfkc: "\u{C763}", - nfkd: "\u{110B}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{C764}", - nfc: "\u{C764}", - nfd: "\u{110B}\u{1174}\u{11B3}", - nfkc: "\u{C764}", - nfkd: "\u{110B}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{C765}", - nfc: "\u{C765}", - nfd: "\u{110B}\u{1174}\u{11B4}", - nfkc: "\u{C765}", - nfkd: "\u{110B}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{C766}", - nfc: "\u{C766}", - nfd: "\u{110B}\u{1174}\u{11B5}", - nfkc: "\u{C766}", - nfkd: "\u{110B}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{C767}", - nfc: "\u{C767}", - nfd: "\u{110B}\u{1174}\u{11B6}", - nfkc: "\u{C767}", - nfkd: "\u{110B}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{C768}", - nfc: "\u{C768}", - nfd: "\u{110B}\u{1174}\u{11B7}", - nfkc: "\u{C768}", - nfkd: "\u{110B}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{C769}", - nfc: "\u{C769}", - nfd: "\u{110B}\u{1174}\u{11B8}", - nfkc: "\u{C769}", - nfkd: "\u{110B}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{C76A}", - nfc: "\u{C76A}", - nfd: "\u{110B}\u{1174}\u{11B9}", - nfkc: "\u{C76A}", - nfkd: "\u{110B}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{C76B}", - nfc: "\u{C76B}", - nfd: "\u{110B}\u{1174}\u{11BA}", - nfkc: "\u{C76B}", - nfkd: "\u{110B}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{C76C}", - nfc: "\u{C76C}", - nfd: "\u{110B}\u{1174}\u{11BB}", - nfkc: "\u{C76C}", - nfkd: "\u{110B}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{C76D}", - nfc: "\u{C76D}", - nfd: "\u{110B}\u{1174}\u{11BC}", - nfkc: "\u{C76D}", - nfkd: "\u{110B}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{C76E}", - nfc: "\u{C76E}", - nfd: "\u{110B}\u{1174}\u{11BD}", - nfkc: "\u{C76E}", - nfkd: "\u{110B}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{C76F}", - nfc: "\u{C76F}", - nfd: "\u{110B}\u{1174}\u{11BE}", - nfkc: "\u{C76F}", - nfkd: "\u{110B}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{C770}", - nfc: "\u{C770}", - nfd: "\u{110B}\u{1174}\u{11BF}", - nfkc: "\u{C770}", - nfkd: "\u{110B}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{C771}", - nfc: "\u{C771}", - nfd: "\u{110B}\u{1174}\u{11C0}", - nfkc: "\u{C771}", - nfkd: "\u{110B}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{C772}", - nfc: "\u{C772}", - nfd: "\u{110B}\u{1174}\u{11C1}", - nfkc: "\u{C772}", - nfkd: "\u{110B}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{C773}", - nfc: "\u{C773}", - nfd: "\u{110B}\u{1174}\u{11C2}", - nfkc: "\u{C773}", - nfkd: "\u{110B}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{C774}", - nfc: "\u{C774}", - nfd: "\u{110B}\u{1175}", - nfkc: "\u{C774}", - nfkd: "\u{110B}\u{1175}", - }, - NormalizationTest { - source: "\u{C775}", - nfc: "\u{C775}", - nfd: "\u{110B}\u{1175}\u{11A8}", - nfkc: "\u{C775}", - nfkd: "\u{110B}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{C776}", - nfc: "\u{C776}", - nfd: "\u{110B}\u{1175}\u{11A9}", - nfkc: "\u{C776}", - nfkd: "\u{110B}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{C777}", - nfc: "\u{C777}", - nfd: "\u{110B}\u{1175}\u{11AA}", - nfkc: "\u{C777}", - nfkd: "\u{110B}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{C778}", - nfc: "\u{C778}", - nfd: "\u{110B}\u{1175}\u{11AB}", - nfkc: "\u{C778}", - nfkd: "\u{110B}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{C779}", - nfc: "\u{C779}", - nfd: "\u{110B}\u{1175}\u{11AC}", - nfkc: "\u{C779}", - nfkd: "\u{110B}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{C77A}", - nfc: "\u{C77A}", - nfd: "\u{110B}\u{1175}\u{11AD}", - nfkc: "\u{C77A}", - nfkd: "\u{110B}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{C77B}", - nfc: "\u{C77B}", - nfd: "\u{110B}\u{1175}\u{11AE}", - nfkc: "\u{C77B}", - nfkd: "\u{110B}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{C77C}", - nfc: "\u{C77C}", - nfd: "\u{110B}\u{1175}\u{11AF}", - nfkc: "\u{C77C}", - nfkd: "\u{110B}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{C77D}", - nfc: "\u{C77D}", - nfd: "\u{110B}\u{1175}\u{11B0}", - nfkc: "\u{C77D}", - nfkd: "\u{110B}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{C77E}", - nfc: "\u{C77E}", - nfd: "\u{110B}\u{1175}\u{11B1}", - nfkc: "\u{C77E}", - nfkd: "\u{110B}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{C77F}", - nfc: "\u{C77F}", - nfd: "\u{110B}\u{1175}\u{11B2}", - nfkc: "\u{C77F}", - nfkd: "\u{110B}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{C780}", - nfc: "\u{C780}", - nfd: "\u{110B}\u{1175}\u{11B3}", - nfkc: "\u{C780}", - nfkd: "\u{110B}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{C781}", - nfc: "\u{C781}", - nfd: "\u{110B}\u{1175}\u{11B4}", - nfkc: "\u{C781}", - nfkd: "\u{110B}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{C782}", - nfc: "\u{C782}", - nfd: "\u{110B}\u{1175}\u{11B5}", - nfkc: "\u{C782}", - nfkd: "\u{110B}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{C783}", - nfc: "\u{C783}", - nfd: "\u{110B}\u{1175}\u{11B6}", - nfkc: "\u{C783}", - nfkd: "\u{110B}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{C784}", - nfc: "\u{C784}", - nfd: "\u{110B}\u{1175}\u{11B7}", - nfkc: "\u{C784}", - nfkd: "\u{110B}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{C785}", - nfc: "\u{C785}", - nfd: "\u{110B}\u{1175}\u{11B8}", - nfkc: "\u{C785}", - nfkd: "\u{110B}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{C786}", - nfc: "\u{C786}", - nfd: "\u{110B}\u{1175}\u{11B9}", - nfkc: "\u{C786}", - nfkd: "\u{110B}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{C787}", - nfc: "\u{C787}", - nfd: "\u{110B}\u{1175}\u{11BA}", - nfkc: "\u{C787}", - nfkd: "\u{110B}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{C788}", - nfc: "\u{C788}", - nfd: "\u{110B}\u{1175}\u{11BB}", - nfkc: "\u{C788}", - nfkd: "\u{110B}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{C789}", - nfc: "\u{C789}", - nfd: "\u{110B}\u{1175}\u{11BC}", - nfkc: "\u{C789}", - nfkd: "\u{110B}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{C78A}", - nfc: "\u{C78A}", - nfd: "\u{110B}\u{1175}\u{11BD}", - nfkc: "\u{C78A}", - nfkd: "\u{110B}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{C78B}", - nfc: "\u{C78B}", - nfd: "\u{110B}\u{1175}\u{11BE}", - nfkc: "\u{C78B}", - nfkd: "\u{110B}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{C78C}", - nfc: "\u{C78C}", - nfd: "\u{110B}\u{1175}\u{11BF}", - nfkc: "\u{C78C}", - nfkd: "\u{110B}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{C78D}", - nfc: "\u{C78D}", - nfd: "\u{110B}\u{1175}\u{11C0}", - nfkc: "\u{C78D}", - nfkd: "\u{110B}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{C78E}", - nfc: "\u{C78E}", - nfd: "\u{110B}\u{1175}\u{11C1}", - nfkc: "\u{C78E}", - nfkd: "\u{110B}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{C78F}", - nfc: "\u{C78F}", - nfd: "\u{110B}\u{1175}\u{11C2}", - nfkc: "\u{C78F}", - nfkd: "\u{110B}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{C790}", - nfc: "\u{C790}", - nfd: "\u{110C}\u{1161}", - nfkc: "\u{C790}", - nfkd: "\u{110C}\u{1161}", - }, - NormalizationTest { - source: "\u{C791}", - nfc: "\u{C791}", - nfd: "\u{110C}\u{1161}\u{11A8}", - nfkc: "\u{C791}", - nfkd: "\u{110C}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{C792}", - nfc: "\u{C792}", - nfd: "\u{110C}\u{1161}\u{11A9}", - nfkc: "\u{C792}", - nfkd: "\u{110C}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{C793}", - nfc: "\u{C793}", - nfd: "\u{110C}\u{1161}\u{11AA}", - nfkc: "\u{C793}", - nfkd: "\u{110C}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{C794}", - nfc: "\u{C794}", - nfd: "\u{110C}\u{1161}\u{11AB}", - nfkc: "\u{C794}", - nfkd: "\u{110C}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{C795}", - nfc: "\u{C795}", - nfd: "\u{110C}\u{1161}\u{11AC}", - nfkc: "\u{C795}", - nfkd: "\u{110C}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{C796}", - nfc: "\u{C796}", - nfd: "\u{110C}\u{1161}\u{11AD}", - nfkc: "\u{C796}", - nfkd: "\u{110C}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{C797}", - nfc: "\u{C797}", - nfd: "\u{110C}\u{1161}\u{11AE}", - nfkc: "\u{C797}", - nfkd: "\u{110C}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{C798}", - nfc: "\u{C798}", - nfd: "\u{110C}\u{1161}\u{11AF}", - nfkc: "\u{C798}", - nfkd: "\u{110C}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{C799}", - nfc: "\u{C799}", - nfd: "\u{110C}\u{1161}\u{11B0}", - nfkc: "\u{C799}", - nfkd: "\u{110C}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{C79A}", - nfc: "\u{C79A}", - nfd: "\u{110C}\u{1161}\u{11B1}", - nfkc: "\u{C79A}", - nfkd: "\u{110C}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{C79B}", - nfc: "\u{C79B}", - nfd: "\u{110C}\u{1161}\u{11B2}", - nfkc: "\u{C79B}", - nfkd: "\u{110C}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{C79C}", - nfc: "\u{C79C}", - nfd: "\u{110C}\u{1161}\u{11B3}", - nfkc: "\u{C79C}", - nfkd: "\u{110C}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{C79D}", - nfc: "\u{C79D}", - nfd: "\u{110C}\u{1161}\u{11B4}", - nfkc: "\u{C79D}", - nfkd: "\u{110C}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{C79E}", - nfc: "\u{C79E}", - nfd: "\u{110C}\u{1161}\u{11B5}", - nfkc: "\u{C79E}", - nfkd: "\u{110C}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{C79F}", - nfc: "\u{C79F}", - nfd: "\u{110C}\u{1161}\u{11B6}", - nfkc: "\u{C79F}", - nfkd: "\u{110C}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{C7A0}", - nfc: "\u{C7A0}", - nfd: "\u{110C}\u{1161}\u{11B7}", - nfkc: "\u{C7A0}", - nfkd: "\u{110C}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{C7A1}", - nfc: "\u{C7A1}", - nfd: "\u{110C}\u{1161}\u{11B8}", - nfkc: "\u{C7A1}", - nfkd: "\u{110C}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{C7A2}", - nfc: "\u{C7A2}", - nfd: "\u{110C}\u{1161}\u{11B9}", - nfkc: "\u{C7A2}", - nfkd: "\u{110C}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{C7A3}", - nfc: "\u{C7A3}", - nfd: "\u{110C}\u{1161}\u{11BA}", - nfkc: "\u{C7A3}", - nfkd: "\u{110C}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{C7A4}", - nfc: "\u{C7A4}", - nfd: "\u{110C}\u{1161}\u{11BB}", - nfkc: "\u{C7A4}", - nfkd: "\u{110C}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{C7A5}", - nfc: "\u{C7A5}", - nfd: "\u{110C}\u{1161}\u{11BC}", - nfkc: "\u{C7A5}", - nfkd: "\u{110C}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{C7A6}", - nfc: "\u{C7A6}", - nfd: "\u{110C}\u{1161}\u{11BD}", - nfkc: "\u{C7A6}", - nfkd: "\u{110C}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{C7A7}", - nfc: "\u{C7A7}", - nfd: "\u{110C}\u{1161}\u{11BE}", - nfkc: "\u{C7A7}", - nfkd: "\u{110C}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{C7A8}", - nfc: "\u{C7A8}", - nfd: "\u{110C}\u{1161}\u{11BF}", - nfkc: "\u{C7A8}", - nfkd: "\u{110C}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{C7A9}", - nfc: "\u{C7A9}", - nfd: "\u{110C}\u{1161}\u{11C0}", - nfkc: "\u{C7A9}", - nfkd: "\u{110C}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{C7AA}", - nfc: "\u{C7AA}", - nfd: "\u{110C}\u{1161}\u{11C1}", - nfkc: "\u{C7AA}", - nfkd: "\u{110C}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{C7AB}", - nfc: "\u{C7AB}", - nfd: "\u{110C}\u{1161}\u{11C2}", - nfkc: "\u{C7AB}", - nfkd: "\u{110C}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{C7AC}", - nfc: "\u{C7AC}", - nfd: "\u{110C}\u{1162}", - nfkc: "\u{C7AC}", - nfkd: "\u{110C}\u{1162}", - }, - NormalizationTest { - source: "\u{C7AD}", - nfc: "\u{C7AD}", - nfd: "\u{110C}\u{1162}\u{11A8}", - nfkc: "\u{C7AD}", - nfkd: "\u{110C}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{C7AE}", - nfc: "\u{C7AE}", - nfd: "\u{110C}\u{1162}\u{11A9}", - nfkc: "\u{C7AE}", - nfkd: "\u{110C}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{C7AF}", - nfc: "\u{C7AF}", - nfd: "\u{110C}\u{1162}\u{11AA}", - nfkc: "\u{C7AF}", - nfkd: "\u{110C}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{C7B0}", - nfc: "\u{C7B0}", - nfd: "\u{110C}\u{1162}\u{11AB}", - nfkc: "\u{C7B0}", - nfkd: "\u{110C}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{C7B1}", - nfc: "\u{C7B1}", - nfd: "\u{110C}\u{1162}\u{11AC}", - nfkc: "\u{C7B1}", - nfkd: "\u{110C}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{C7B2}", - nfc: "\u{C7B2}", - nfd: "\u{110C}\u{1162}\u{11AD}", - nfkc: "\u{C7B2}", - nfkd: "\u{110C}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{C7B3}", - nfc: "\u{C7B3}", - nfd: "\u{110C}\u{1162}\u{11AE}", - nfkc: "\u{C7B3}", - nfkd: "\u{110C}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{C7B4}", - nfc: "\u{C7B4}", - nfd: "\u{110C}\u{1162}\u{11AF}", - nfkc: "\u{C7B4}", - nfkd: "\u{110C}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{C7B5}", - nfc: "\u{C7B5}", - nfd: "\u{110C}\u{1162}\u{11B0}", - nfkc: "\u{C7B5}", - nfkd: "\u{110C}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{C7B6}", - nfc: "\u{C7B6}", - nfd: "\u{110C}\u{1162}\u{11B1}", - nfkc: "\u{C7B6}", - nfkd: "\u{110C}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{C7B7}", - nfc: "\u{C7B7}", - nfd: "\u{110C}\u{1162}\u{11B2}", - nfkc: "\u{C7B7}", - nfkd: "\u{110C}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{C7B8}", - nfc: "\u{C7B8}", - nfd: "\u{110C}\u{1162}\u{11B3}", - nfkc: "\u{C7B8}", - nfkd: "\u{110C}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{C7B9}", - nfc: "\u{C7B9}", - nfd: "\u{110C}\u{1162}\u{11B4}", - nfkc: "\u{C7B9}", - nfkd: "\u{110C}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{C7BA}", - nfc: "\u{C7BA}", - nfd: "\u{110C}\u{1162}\u{11B5}", - nfkc: "\u{C7BA}", - nfkd: "\u{110C}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{C7BB}", - nfc: "\u{C7BB}", - nfd: "\u{110C}\u{1162}\u{11B6}", - nfkc: "\u{C7BB}", - nfkd: "\u{110C}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{C7BC}", - nfc: "\u{C7BC}", - nfd: "\u{110C}\u{1162}\u{11B7}", - nfkc: "\u{C7BC}", - nfkd: "\u{110C}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{C7BD}", - nfc: "\u{C7BD}", - nfd: "\u{110C}\u{1162}\u{11B8}", - nfkc: "\u{C7BD}", - nfkd: "\u{110C}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{C7BE}", - nfc: "\u{C7BE}", - nfd: "\u{110C}\u{1162}\u{11B9}", - nfkc: "\u{C7BE}", - nfkd: "\u{110C}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{C7BF}", - nfc: "\u{C7BF}", - nfd: "\u{110C}\u{1162}\u{11BA}", - nfkc: "\u{C7BF}", - nfkd: "\u{110C}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{C7C0}", - nfc: "\u{C7C0}", - nfd: "\u{110C}\u{1162}\u{11BB}", - nfkc: "\u{C7C0}", - nfkd: "\u{110C}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{C7C1}", - nfc: "\u{C7C1}", - nfd: "\u{110C}\u{1162}\u{11BC}", - nfkc: "\u{C7C1}", - nfkd: "\u{110C}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{C7C2}", - nfc: "\u{C7C2}", - nfd: "\u{110C}\u{1162}\u{11BD}", - nfkc: "\u{C7C2}", - nfkd: "\u{110C}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{C7C3}", - nfc: "\u{C7C3}", - nfd: "\u{110C}\u{1162}\u{11BE}", - nfkc: "\u{C7C3}", - nfkd: "\u{110C}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{C7C4}", - nfc: "\u{C7C4}", - nfd: "\u{110C}\u{1162}\u{11BF}", - nfkc: "\u{C7C4}", - nfkd: "\u{110C}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{C7C5}", - nfc: "\u{C7C5}", - nfd: "\u{110C}\u{1162}\u{11C0}", - nfkc: "\u{C7C5}", - nfkd: "\u{110C}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{C7C6}", - nfc: "\u{C7C6}", - nfd: "\u{110C}\u{1162}\u{11C1}", - nfkc: "\u{C7C6}", - nfkd: "\u{110C}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{C7C7}", - nfc: "\u{C7C7}", - nfd: "\u{110C}\u{1162}\u{11C2}", - nfkc: "\u{C7C7}", - nfkd: "\u{110C}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{C7C8}", - nfc: "\u{C7C8}", - nfd: "\u{110C}\u{1163}", - nfkc: "\u{C7C8}", - nfkd: "\u{110C}\u{1163}", - }, - NormalizationTest { - source: "\u{C7C9}", - nfc: "\u{C7C9}", - nfd: "\u{110C}\u{1163}\u{11A8}", - nfkc: "\u{C7C9}", - nfkd: "\u{110C}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{C7CA}", - nfc: "\u{C7CA}", - nfd: "\u{110C}\u{1163}\u{11A9}", - nfkc: "\u{C7CA}", - nfkd: "\u{110C}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{C7CB}", - nfc: "\u{C7CB}", - nfd: "\u{110C}\u{1163}\u{11AA}", - nfkc: "\u{C7CB}", - nfkd: "\u{110C}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{C7CC}", - nfc: "\u{C7CC}", - nfd: "\u{110C}\u{1163}\u{11AB}", - nfkc: "\u{C7CC}", - nfkd: "\u{110C}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{C7CD}", - nfc: "\u{C7CD}", - nfd: "\u{110C}\u{1163}\u{11AC}", - nfkc: "\u{C7CD}", - nfkd: "\u{110C}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{C7CE}", - nfc: "\u{C7CE}", - nfd: "\u{110C}\u{1163}\u{11AD}", - nfkc: "\u{C7CE}", - nfkd: "\u{110C}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{C7CF}", - nfc: "\u{C7CF}", - nfd: "\u{110C}\u{1163}\u{11AE}", - nfkc: "\u{C7CF}", - nfkd: "\u{110C}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{C7D0}", - nfc: "\u{C7D0}", - nfd: "\u{110C}\u{1163}\u{11AF}", - nfkc: "\u{C7D0}", - nfkd: "\u{110C}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{C7D1}", - nfc: "\u{C7D1}", - nfd: "\u{110C}\u{1163}\u{11B0}", - nfkc: "\u{C7D1}", - nfkd: "\u{110C}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{C7D2}", - nfc: "\u{C7D2}", - nfd: "\u{110C}\u{1163}\u{11B1}", - nfkc: "\u{C7D2}", - nfkd: "\u{110C}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{C7D3}", - nfc: "\u{C7D3}", - nfd: "\u{110C}\u{1163}\u{11B2}", - nfkc: "\u{C7D3}", - nfkd: "\u{110C}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{C7D4}", - nfc: "\u{C7D4}", - nfd: "\u{110C}\u{1163}\u{11B3}", - nfkc: "\u{C7D4}", - nfkd: "\u{110C}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{C7D5}", - nfc: "\u{C7D5}", - nfd: "\u{110C}\u{1163}\u{11B4}", - nfkc: "\u{C7D5}", - nfkd: "\u{110C}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{C7D6}", - nfc: "\u{C7D6}", - nfd: "\u{110C}\u{1163}\u{11B5}", - nfkc: "\u{C7D6}", - nfkd: "\u{110C}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{C7D7}", - nfc: "\u{C7D7}", - nfd: "\u{110C}\u{1163}\u{11B6}", - nfkc: "\u{C7D7}", - nfkd: "\u{110C}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{C7D8}", - nfc: "\u{C7D8}", - nfd: "\u{110C}\u{1163}\u{11B7}", - nfkc: "\u{C7D8}", - nfkd: "\u{110C}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{C7D9}", - nfc: "\u{C7D9}", - nfd: "\u{110C}\u{1163}\u{11B8}", - nfkc: "\u{C7D9}", - nfkd: "\u{110C}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{C7DA}", - nfc: "\u{C7DA}", - nfd: "\u{110C}\u{1163}\u{11B9}", - nfkc: "\u{C7DA}", - nfkd: "\u{110C}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{C7DB}", - nfc: "\u{C7DB}", - nfd: "\u{110C}\u{1163}\u{11BA}", - nfkc: "\u{C7DB}", - nfkd: "\u{110C}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{C7DC}", - nfc: "\u{C7DC}", - nfd: "\u{110C}\u{1163}\u{11BB}", - nfkc: "\u{C7DC}", - nfkd: "\u{110C}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{C7DD}", - nfc: "\u{C7DD}", - nfd: "\u{110C}\u{1163}\u{11BC}", - nfkc: "\u{C7DD}", - nfkd: "\u{110C}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{C7DE}", - nfc: "\u{C7DE}", - nfd: "\u{110C}\u{1163}\u{11BD}", - nfkc: "\u{C7DE}", - nfkd: "\u{110C}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{C7DF}", - nfc: "\u{C7DF}", - nfd: "\u{110C}\u{1163}\u{11BE}", - nfkc: "\u{C7DF}", - nfkd: "\u{110C}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{C7E0}", - nfc: "\u{C7E0}", - nfd: "\u{110C}\u{1163}\u{11BF}", - nfkc: "\u{C7E0}", - nfkd: "\u{110C}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{C7E1}", - nfc: "\u{C7E1}", - nfd: "\u{110C}\u{1163}\u{11C0}", - nfkc: "\u{C7E1}", - nfkd: "\u{110C}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{C7E2}", - nfc: "\u{C7E2}", - nfd: "\u{110C}\u{1163}\u{11C1}", - nfkc: "\u{C7E2}", - nfkd: "\u{110C}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{C7E3}", - nfc: "\u{C7E3}", - nfd: "\u{110C}\u{1163}\u{11C2}", - nfkc: "\u{C7E3}", - nfkd: "\u{110C}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{C7E4}", - nfc: "\u{C7E4}", - nfd: "\u{110C}\u{1164}", - nfkc: "\u{C7E4}", - nfkd: "\u{110C}\u{1164}", - }, - NormalizationTest { - source: "\u{C7E5}", - nfc: "\u{C7E5}", - nfd: "\u{110C}\u{1164}\u{11A8}", - nfkc: "\u{C7E5}", - nfkd: "\u{110C}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{C7E6}", - nfc: "\u{C7E6}", - nfd: "\u{110C}\u{1164}\u{11A9}", - nfkc: "\u{C7E6}", - nfkd: "\u{110C}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{C7E7}", - nfc: "\u{C7E7}", - nfd: "\u{110C}\u{1164}\u{11AA}", - nfkc: "\u{C7E7}", - nfkd: "\u{110C}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{C7E8}", - nfc: "\u{C7E8}", - nfd: "\u{110C}\u{1164}\u{11AB}", - nfkc: "\u{C7E8}", - nfkd: "\u{110C}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{C7E9}", - nfc: "\u{C7E9}", - nfd: "\u{110C}\u{1164}\u{11AC}", - nfkc: "\u{C7E9}", - nfkd: "\u{110C}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{C7EA}", - nfc: "\u{C7EA}", - nfd: "\u{110C}\u{1164}\u{11AD}", - nfkc: "\u{C7EA}", - nfkd: "\u{110C}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{C7EB}", - nfc: "\u{C7EB}", - nfd: "\u{110C}\u{1164}\u{11AE}", - nfkc: "\u{C7EB}", - nfkd: "\u{110C}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{C7EC}", - nfc: "\u{C7EC}", - nfd: "\u{110C}\u{1164}\u{11AF}", - nfkc: "\u{C7EC}", - nfkd: "\u{110C}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{C7ED}", - nfc: "\u{C7ED}", - nfd: "\u{110C}\u{1164}\u{11B0}", - nfkc: "\u{C7ED}", - nfkd: "\u{110C}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{C7EE}", - nfc: "\u{C7EE}", - nfd: "\u{110C}\u{1164}\u{11B1}", - nfkc: "\u{C7EE}", - nfkd: "\u{110C}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{C7EF}", - nfc: "\u{C7EF}", - nfd: "\u{110C}\u{1164}\u{11B2}", - nfkc: "\u{C7EF}", - nfkd: "\u{110C}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{C7F0}", - nfc: "\u{C7F0}", - nfd: "\u{110C}\u{1164}\u{11B3}", - nfkc: "\u{C7F0}", - nfkd: "\u{110C}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{C7F1}", - nfc: "\u{C7F1}", - nfd: "\u{110C}\u{1164}\u{11B4}", - nfkc: "\u{C7F1}", - nfkd: "\u{110C}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{C7F2}", - nfc: "\u{C7F2}", - nfd: "\u{110C}\u{1164}\u{11B5}", - nfkc: "\u{C7F2}", - nfkd: "\u{110C}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{C7F3}", - nfc: "\u{C7F3}", - nfd: "\u{110C}\u{1164}\u{11B6}", - nfkc: "\u{C7F3}", - nfkd: "\u{110C}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{C7F4}", - nfc: "\u{C7F4}", - nfd: "\u{110C}\u{1164}\u{11B7}", - nfkc: "\u{C7F4}", - nfkd: "\u{110C}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{C7F5}", - nfc: "\u{C7F5}", - nfd: "\u{110C}\u{1164}\u{11B8}", - nfkc: "\u{C7F5}", - nfkd: "\u{110C}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{C7F6}", - nfc: "\u{C7F6}", - nfd: "\u{110C}\u{1164}\u{11B9}", - nfkc: "\u{C7F6}", - nfkd: "\u{110C}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{C7F7}", - nfc: "\u{C7F7}", - nfd: "\u{110C}\u{1164}\u{11BA}", - nfkc: "\u{C7F7}", - nfkd: "\u{110C}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{C7F8}", - nfc: "\u{C7F8}", - nfd: "\u{110C}\u{1164}\u{11BB}", - nfkc: "\u{C7F8}", - nfkd: "\u{110C}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{C7F9}", - nfc: "\u{C7F9}", - nfd: "\u{110C}\u{1164}\u{11BC}", - nfkc: "\u{C7F9}", - nfkd: "\u{110C}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{C7FA}", - nfc: "\u{C7FA}", - nfd: "\u{110C}\u{1164}\u{11BD}", - nfkc: "\u{C7FA}", - nfkd: "\u{110C}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{C7FB}", - nfc: "\u{C7FB}", - nfd: "\u{110C}\u{1164}\u{11BE}", - nfkc: "\u{C7FB}", - nfkd: "\u{110C}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{C7FC}", - nfc: "\u{C7FC}", - nfd: "\u{110C}\u{1164}\u{11BF}", - nfkc: "\u{C7FC}", - nfkd: "\u{110C}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{C7FD}", - nfc: "\u{C7FD}", - nfd: "\u{110C}\u{1164}\u{11C0}", - nfkc: "\u{C7FD}", - nfkd: "\u{110C}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{C7FE}", - nfc: "\u{C7FE}", - nfd: "\u{110C}\u{1164}\u{11C1}", - nfkc: "\u{C7FE}", - nfkd: "\u{110C}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{C7FF}", - nfc: "\u{C7FF}", - nfd: "\u{110C}\u{1164}\u{11C2}", - nfkc: "\u{C7FF}", - nfkd: "\u{110C}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{C800}", - nfc: "\u{C800}", - nfd: "\u{110C}\u{1165}", - nfkc: "\u{C800}", - nfkd: "\u{110C}\u{1165}", - }, - NormalizationTest { - source: "\u{C801}", - nfc: "\u{C801}", - nfd: "\u{110C}\u{1165}\u{11A8}", - nfkc: "\u{C801}", - nfkd: "\u{110C}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{C802}", - nfc: "\u{C802}", - nfd: "\u{110C}\u{1165}\u{11A9}", - nfkc: "\u{C802}", - nfkd: "\u{110C}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{C803}", - nfc: "\u{C803}", - nfd: "\u{110C}\u{1165}\u{11AA}", - nfkc: "\u{C803}", - nfkd: "\u{110C}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{C804}", - nfc: "\u{C804}", - nfd: "\u{110C}\u{1165}\u{11AB}", - nfkc: "\u{C804}", - nfkd: "\u{110C}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{C805}", - nfc: "\u{C805}", - nfd: "\u{110C}\u{1165}\u{11AC}", - nfkc: "\u{C805}", - nfkd: "\u{110C}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{C806}", - nfc: "\u{C806}", - nfd: "\u{110C}\u{1165}\u{11AD}", - nfkc: "\u{C806}", - nfkd: "\u{110C}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{C807}", - nfc: "\u{C807}", - nfd: "\u{110C}\u{1165}\u{11AE}", - nfkc: "\u{C807}", - nfkd: "\u{110C}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{C808}", - nfc: "\u{C808}", - nfd: "\u{110C}\u{1165}\u{11AF}", - nfkc: "\u{C808}", - nfkd: "\u{110C}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{C809}", - nfc: "\u{C809}", - nfd: "\u{110C}\u{1165}\u{11B0}", - nfkc: "\u{C809}", - nfkd: "\u{110C}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{C80A}", - nfc: "\u{C80A}", - nfd: "\u{110C}\u{1165}\u{11B1}", - nfkc: "\u{C80A}", - nfkd: "\u{110C}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{C80B}", - nfc: "\u{C80B}", - nfd: "\u{110C}\u{1165}\u{11B2}", - nfkc: "\u{C80B}", - nfkd: "\u{110C}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{C80C}", - nfc: "\u{C80C}", - nfd: "\u{110C}\u{1165}\u{11B3}", - nfkc: "\u{C80C}", - nfkd: "\u{110C}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{C80D}", - nfc: "\u{C80D}", - nfd: "\u{110C}\u{1165}\u{11B4}", - nfkc: "\u{C80D}", - nfkd: "\u{110C}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{C80E}", - nfc: "\u{C80E}", - nfd: "\u{110C}\u{1165}\u{11B5}", - nfkc: "\u{C80E}", - nfkd: "\u{110C}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{C80F}", - nfc: "\u{C80F}", - nfd: "\u{110C}\u{1165}\u{11B6}", - nfkc: "\u{C80F}", - nfkd: "\u{110C}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{C810}", - nfc: "\u{C810}", - nfd: "\u{110C}\u{1165}\u{11B7}", - nfkc: "\u{C810}", - nfkd: "\u{110C}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{C811}", - nfc: "\u{C811}", - nfd: "\u{110C}\u{1165}\u{11B8}", - nfkc: "\u{C811}", - nfkd: "\u{110C}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{C812}", - nfc: "\u{C812}", - nfd: "\u{110C}\u{1165}\u{11B9}", - nfkc: "\u{C812}", - nfkd: "\u{110C}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{C813}", - nfc: "\u{C813}", - nfd: "\u{110C}\u{1165}\u{11BA}", - nfkc: "\u{C813}", - nfkd: "\u{110C}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{C814}", - nfc: "\u{C814}", - nfd: "\u{110C}\u{1165}\u{11BB}", - nfkc: "\u{C814}", - nfkd: "\u{110C}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{C815}", - nfc: "\u{C815}", - nfd: "\u{110C}\u{1165}\u{11BC}", - nfkc: "\u{C815}", - nfkd: "\u{110C}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{C816}", - nfc: "\u{C816}", - nfd: "\u{110C}\u{1165}\u{11BD}", - nfkc: "\u{C816}", - nfkd: "\u{110C}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{C817}", - nfc: "\u{C817}", - nfd: "\u{110C}\u{1165}\u{11BE}", - nfkc: "\u{C817}", - nfkd: "\u{110C}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{C818}", - nfc: "\u{C818}", - nfd: "\u{110C}\u{1165}\u{11BF}", - nfkc: "\u{C818}", - nfkd: "\u{110C}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{C819}", - nfc: "\u{C819}", - nfd: "\u{110C}\u{1165}\u{11C0}", - nfkc: "\u{C819}", - nfkd: "\u{110C}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{C81A}", - nfc: "\u{C81A}", - nfd: "\u{110C}\u{1165}\u{11C1}", - nfkc: "\u{C81A}", - nfkd: "\u{110C}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{C81B}", - nfc: "\u{C81B}", - nfd: "\u{110C}\u{1165}\u{11C2}", - nfkc: "\u{C81B}", - nfkd: "\u{110C}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{C81C}", - nfc: "\u{C81C}", - nfd: "\u{110C}\u{1166}", - nfkc: "\u{C81C}", - nfkd: "\u{110C}\u{1166}", - }, - NormalizationTest { - source: "\u{C81D}", - nfc: "\u{C81D}", - nfd: "\u{110C}\u{1166}\u{11A8}", - nfkc: "\u{C81D}", - nfkd: "\u{110C}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{C81E}", - nfc: "\u{C81E}", - nfd: "\u{110C}\u{1166}\u{11A9}", - nfkc: "\u{C81E}", - nfkd: "\u{110C}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{C81F}", - nfc: "\u{C81F}", - nfd: "\u{110C}\u{1166}\u{11AA}", - nfkc: "\u{C81F}", - nfkd: "\u{110C}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{C820}", - nfc: "\u{C820}", - nfd: "\u{110C}\u{1166}\u{11AB}", - nfkc: "\u{C820}", - nfkd: "\u{110C}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{C821}", - nfc: "\u{C821}", - nfd: "\u{110C}\u{1166}\u{11AC}", - nfkc: "\u{C821}", - nfkd: "\u{110C}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{C822}", - nfc: "\u{C822}", - nfd: "\u{110C}\u{1166}\u{11AD}", - nfkc: "\u{C822}", - nfkd: "\u{110C}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{C823}", - nfc: "\u{C823}", - nfd: "\u{110C}\u{1166}\u{11AE}", - nfkc: "\u{C823}", - nfkd: "\u{110C}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{C824}", - nfc: "\u{C824}", - nfd: "\u{110C}\u{1166}\u{11AF}", - nfkc: "\u{C824}", - nfkd: "\u{110C}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{C825}", - nfc: "\u{C825}", - nfd: "\u{110C}\u{1166}\u{11B0}", - nfkc: "\u{C825}", - nfkd: "\u{110C}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{C826}", - nfc: "\u{C826}", - nfd: "\u{110C}\u{1166}\u{11B1}", - nfkc: "\u{C826}", - nfkd: "\u{110C}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{C827}", - nfc: "\u{C827}", - nfd: "\u{110C}\u{1166}\u{11B2}", - nfkc: "\u{C827}", - nfkd: "\u{110C}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{C828}", - nfc: "\u{C828}", - nfd: "\u{110C}\u{1166}\u{11B3}", - nfkc: "\u{C828}", - nfkd: "\u{110C}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{C829}", - nfc: "\u{C829}", - nfd: "\u{110C}\u{1166}\u{11B4}", - nfkc: "\u{C829}", - nfkd: "\u{110C}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{C82A}", - nfc: "\u{C82A}", - nfd: "\u{110C}\u{1166}\u{11B5}", - nfkc: "\u{C82A}", - nfkd: "\u{110C}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{C82B}", - nfc: "\u{C82B}", - nfd: "\u{110C}\u{1166}\u{11B6}", - nfkc: "\u{C82B}", - nfkd: "\u{110C}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{C82C}", - nfc: "\u{C82C}", - nfd: "\u{110C}\u{1166}\u{11B7}", - nfkc: "\u{C82C}", - nfkd: "\u{110C}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{C82D}", - nfc: "\u{C82D}", - nfd: "\u{110C}\u{1166}\u{11B8}", - nfkc: "\u{C82D}", - nfkd: "\u{110C}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{C82E}", - nfc: "\u{C82E}", - nfd: "\u{110C}\u{1166}\u{11B9}", - nfkc: "\u{C82E}", - nfkd: "\u{110C}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{C82F}", - nfc: "\u{C82F}", - nfd: "\u{110C}\u{1166}\u{11BA}", - nfkc: "\u{C82F}", - nfkd: "\u{110C}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{C830}", - nfc: "\u{C830}", - nfd: "\u{110C}\u{1166}\u{11BB}", - nfkc: "\u{C830}", - nfkd: "\u{110C}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{C831}", - nfc: "\u{C831}", - nfd: "\u{110C}\u{1166}\u{11BC}", - nfkc: "\u{C831}", - nfkd: "\u{110C}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{C832}", - nfc: "\u{C832}", - nfd: "\u{110C}\u{1166}\u{11BD}", - nfkc: "\u{C832}", - nfkd: "\u{110C}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{C833}", - nfc: "\u{C833}", - nfd: "\u{110C}\u{1166}\u{11BE}", - nfkc: "\u{C833}", - nfkd: "\u{110C}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{C834}", - nfc: "\u{C834}", - nfd: "\u{110C}\u{1166}\u{11BF}", - nfkc: "\u{C834}", - nfkd: "\u{110C}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{C835}", - nfc: "\u{C835}", - nfd: "\u{110C}\u{1166}\u{11C0}", - nfkc: "\u{C835}", - nfkd: "\u{110C}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{C836}", - nfc: "\u{C836}", - nfd: "\u{110C}\u{1166}\u{11C1}", - nfkc: "\u{C836}", - nfkd: "\u{110C}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{C837}", - nfc: "\u{C837}", - nfd: "\u{110C}\u{1166}\u{11C2}", - nfkc: "\u{C837}", - nfkd: "\u{110C}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{C838}", - nfc: "\u{C838}", - nfd: "\u{110C}\u{1167}", - nfkc: "\u{C838}", - nfkd: "\u{110C}\u{1167}", - }, - NormalizationTest { - source: "\u{C839}", - nfc: "\u{C839}", - nfd: "\u{110C}\u{1167}\u{11A8}", - nfkc: "\u{C839}", - nfkd: "\u{110C}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{C83A}", - nfc: "\u{C83A}", - nfd: "\u{110C}\u{1167}\u{11A9}", - nfkc: "\u{C83A}", - nfkd: "\u{110C}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{C83B}", - nfc: "\u{C83B}", - nfd: "\u{110C}\u{1167}\u{11AA}", - nfkc: "\u{C83B}", - nfkd: "\u{110C}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{C83C}", - nfc: "\u{C83C}", - nfd: "\u{110C}\u{1167}\u{11AB}", - nfkc: "\u{C83C}", - nfkd: "\u{110C}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{C83D}", - nfc: "\u{C83D}", - nfd: "\u{110C}\u{1167}\u{11AC}", - nfkc: "\u{C83D}", - nfkd: "\u{110C}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{C83E}", - nfc: "\u{C83E}", - nfd: "\u{110C}\u{1167}\u{11AD}", - nfkc: "\u{C83E}", - nfkd: "\u{110C}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{C83F}", - nfc: "\u{C83F}", - nfd: "\u{110C}\u{1167}\u{11AE}", - nfkc: "\u{C83F}", - nfkd: "\u{110C}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{C840}", - nfc: "\u{C840}", - nfd: "\u{110C}\u{1167}\u{11AF}", - nfkc: "\u{C840}", - nfkd: "\u{110C}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{C841}", - nfc: "\u{C841}", - nfd: "\u{110C}\u{1167}\u{11B0}", - nfkc: "\u{C841}", - nfkd: "\u{110C}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{C842}", - nfc: "\u{C842}", - nfd: "\u{110C}\u{1167}\u{11B1}", - nfkc: "\u{C842}", - nfkd: "\u{110C}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{C843}", - nfc: "\u{C843}", - nfd: "\u{110C}\u{1167}\u{11B2}", - nfkc: "\u{C843}", - nfkd: "\u{110C}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{C844}", - nfc: "\u{C844}", - nfd: "\u{110C}\u{1167}\u{11B3}", - nfkc: "\u{C844}", - nfkd: "\u{110C}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{C845}", - nfc: "\u{C845}", - nfd: "\u{110C}\u{1167}\u{11B4}", - nfkc: "\u{C845}", - nfkd: "\u{110C}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{C846}", - nfc: "\u{C846}", - nfd: "\u{110C}\u{1167}\u{11B5}", - nfkc: "\u{C846}", - nfkd: "\u{110C}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{C847}", - nfc: "\u{C847}", - nfd: "\u{110C}\u{1167}\u{11B6}", - nfkc: "\u{C847}", - nfkd: "\u{110C}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{C848}", - nfc: "\u{C848}", - nfd: "\u{110C}\u{1167}\u{11B7}", - nfkc: "\u{C848}", - nfkd: "\u{110C}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{C849}", - nfc: "\u{C849}", - nfd: "\u{110C}\u{1167}\u{11B8}", - nfkc: "\u{C849}", - nfkd: "\u{110C}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{C84A}", - nfc: "\u{C84A}", - nfd: "\u{110C}\u{1167}\u{11B9}", - nfkc: "\u{C84A}", - nfkd: "\u{110C}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{C84B}", - nfc: "\u{C84B}", - nfd: "\u{110C}\u{1167}\u{11BA}", - nfkc: "\u{C84B}", - nfkd: "\u{110C}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{C84C}", - nfc: "\u{C84C}", - nfd: "\u{110C}\u{1167}\u{11BB}", - nfkc: "\u{C84C}", - nfkd: "\u{110C}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{C84D}", - nfc: "\u{C84D}", - nfd: "\u{110C}\u{1167}\u{11BC}", - nfkc: "\u{C84D}", - nfkd: "\u{110C}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{C84E}", - nfc: "\u{C84E}", - nfd: "\u{110C}\u{1167}\u{11BD}", - nfkc: "\u{C84E}", - nfkd: "\u{110C}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{C84F}", - nfc: "\u{C84F}", - nfd: "\u{110C}\u{1167}\u{11BE}", - nfkc: "\u{C84F}", - nfkd: "\u{110C}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{C850}", - nfc: "\u{C850}", - nfd: "\u{110C}\u{1167}\u{11BF}", - nfkc: "\u{C850}", - nfkd: "\u{110C}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{C851}", - nfc: "\u{C851}", - nfd: "\u{110C}\u{1167}\u{11C0}", - nfkc: "\u{C851}", - nfkd: "\u{110C}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{C852}", - nfc: "\u{C852}", - nfd: "\u{110C}\u{1167}\u{11C1}", - nfkc: "\u{C852}", - nfkd: "\u{110C}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{C853}", - nfc: "\u{C853}", - nfd: "\u{110C}\u{1167}\u{11C2}", - nfkc: "\u{C853}", - nfkd: "\u{110C}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{C854}", - nfc: "\u{C854}", - nfd: "\u{110C}\u{1168}", - nfkc: "\u{C854}", - nfkd: "\u{110C}\u{1168}", - }, - NormalizationTest { - source: "\u{C855}", - nfc: "\u{C855}", - nfd: "\u{110C}\u{1168}\u{11A8}", - nfkc: "\u{C855}", - nfkd: "\u{110C}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{C856}", - nfc: "\u{C856}", - nfd: "\u{110C}\u{1168}\u{11A9}", - nfkc: "\u{C856}", - nfkd: "\u{110C}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{C857}", - nfc: "\u{C857}", - nfd: "\u{110C}\u{1168}\u{11AA}", - nfkc: "\u{C857}", - nfkd: "\u{110C}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{C858}", - nfc: "\u{C858}", - nfd: "\u{110C}\u{1168}\u{11AB}", - nfkc: "\u{C858}", - nfkd: "\u{110C}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{C859}", - nfc: "\u{C859}", - nfd: "\u{110C}\u{1168}\u{11AC}", - nfkc: "\u{C859}", - nfkd: "\u{110C}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{C85A}", - nfc: "\u{C85A}", - nfd: "\u{110C}\u{1168}\u{11AD}", - nfkc: "\u{C85A}", - nfkd: "\u{110C}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{C85B}", - nfc: "\u{C85B}", - nfd: "\u{110C}\u{1168}\u{11AE}", - nfkc: "\u{C85B}", - nfkd: "\u{110C}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{C85C}", - nfc: "\u{C85C}", - nfd: "\u{110C}\u{1168}\u{11AF}", - nfkc: "\u{C85C}", - nfkd: "\u{110C}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{C85D}", - nfc: "\u{C85D}", - nfd: "\u{110C}\u{1168}\u{11B0}", - nfkc: "\u{C85D}", - nfkd: "\u{110C}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{C85E}", - nfc: "\u{C85E}", - nfd: "\u{110C}\u{1168}\u{11B1}", - nfkc: "\u{C85E}", - nfkd: "\u{110C}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{C85F}", - nfc: "\u{C85F}", - nfd: "\u{110C}\u{1168}\u{11B2}", - nfkc: "\u{C85F}", - nfkd: "\u{110C}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{C860}", - nfc: "\u{C860}", - nfd: "\u{110C}\u{1168}\u{11B3}", - nfkc: "\u{C860}", - nfkd: "\u{110C}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{C861}", - nfc: "\u{C861}", - nfd: "\u{110C}\u{1168}\u{11B4}", - nfkc: "\u{C861}", - nfkd: "\u{110C}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{C862}", - nfc: "\u{C862}", - nfd: "\u{110C}\u{1168}\u{11B5}", - nfkc: "\u{C862}", - nfkd: "\u{110C}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{C863}", - nfc: "\u{C863}", - nfd: "\u{110C}\u{1168}\u{11B6}", - nfkc: "\u{C863}", - nfkd: "\u{110C}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{C864}", - nfc: "\u{C864}", - nfd: "\u{110C}\u{1168}\u{11B7}", - nfkc: "\u{C864}", - nfkd: "\u{110C}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{C865}", - nfc: "\u{C865}", - nfd: "\u{110C}\u{1168}\u{11B8}", - nfkc: "\u{C865}", - nfkd: "\u{110C}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{C866}", - nfc: "\u{C866}", - nfd: "\u{110C}\u{1168}\u{11B9}", - nfkc: "\u{C866}", - nfkd: "\u{110C}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{C867}", - nfc: "\u{C867}", - nfd: "\u{110C}\u{1168}\u{11BA}", - nfkc: "\u{C867}", - nfkd: "\u{110C}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{C868}", - nfc: "\u{C868}", - nfd: "\u{110C}\u{1168}\u{11BB}", - nfkc: "\u{C868}", - nfkd: "\u{110C}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{C869}", - nfc: "\u{C869}", - nfd: "\u{110C}\u{1168}\u{11BC}", - nfkc: "\u{C869}", - nfkd: "\u{110C}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{C86A}", - nfc: "\u{C86A}", - nfd: "\u{110C}\u{1168}\u{11BD}", - nfkc: "\u{C86A}", - nfkd: "\u{110C}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{C86B}", - nfc: "\u{C86B}", - nfd: "\u{110C}\u{1168}\u{11BE}", - nfkc: "\u{C86B}", - nfkd: "\u{110C}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{C86C}", - nfc: "\u{C86C}", - nfd: "\u{110C}\u{1168}\u{11BF}", - nfkc: "\u{C86C}", - nfkd: "\u{110C}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{C86D}", - nfc: "\u{C86D}", - nfd: "\u{110C}\u{1168}\u{11C0}", - nfkc: "\u{C86D}", - nfkd: "\u{110C}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{C86E}", - nfc: "\u{C86E}", - nfd: "\u{110C}\u{1168}\u{11C1}", - nfkc: "\u{C86E}", - nfkd: "\u{110C}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{C86F}", - nfc: "\u{C86F}", - nfd: "\u{110C}\u{1168}\u{11C2}", - nfkc: "\u{C86F}", - nfkd: "\u{110C}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{C870}", - nfc: "\u{C870}", - nfd: "\u{110C}\u{1169}", - nfkc: "\u{C870}", - nfkd: "\u{110C}\u{1169}", - }, - NormalizationTest { - source: "\u{C871}", - nfc: "\u{C871}", - nfd: "\u{110C}\u{1169}\u{11A8}", - nfkc: "\u{C871}", - nfkd: "\u{110C}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{C872}", - nfc: "\u{C872}", - nfd: "\u{110C}\u{1169}\u{11A9}", - nfkc: "\u{C872}", - nfkd: "\u{110C}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{C873}", - nfc: "\u{C873}", - nfd: "\u{110C}\u{1169}\u{11AA}", - nfkc: "\u{C873}", - nfkd: "\u{110C}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{C874}", - nfc: "\u{C874}", - nfd: "\u{110C}\u{1169}\u{11AB}", - nfkc: "\u{C874}", - nfkd: "\u{110C}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{C875}", - nfc: "\u{C875}", - nfd: "\u{110C}\u{1169}\u{11AC}", - nfkc: "\u{C875}", - nfkd: "\u{110C}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{C876}", - nfc: "\u{C876}", - nfd: "\u{110C}\u{1169}\u{11AD}", - nfkc: "\u{C876}", - nfkd: "\u{110C}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{C877}", - nfc: "\u{C877}", - nfd: "\u{110C}\u{1169}\u{11AE}", - nfkc: "\u{C877}", - nfkd: "\u{110C}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{C878}", - nfc: "\u{C878}", - nfd: "\u{110C}\u{1169}\u{11AF}", - nfkc: "\u{C878}", - nfkd: "\u{110C}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{C879}", - nfc: "\u{C879}", - nfd: "\u{110C}\u{1169}\u{11B0}", - nfkc: "\u{C879}", - nfkd: "\u{110C}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{C87A}", - nfc: "\u{C87A}", - nfd: "\u{110C}\u{1169}\u{11B1}", - nfkc: "\u{C87A}", - nfkd: "\u{110C}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{C87B}", - nfc: "\u{C87B}", - nfd: "\u{110C}\u{1169}\u{11B2}", - nfkc: "\u{C87B}", - nfkd: "\u{110C}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{C87C}", - nfc: "\u{C87C}", - nfd: "\u{110C}\u{1169}\u{11B3}", - nfkc: "\u{C87C}", - nfkd: "\u{110C}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{C87D}", - nfc: "\u{C87D}", - nfd: "\u{110C}\u{1169}\u{11B4}", - nfkc: "\u{C87D}", - nfkd: "\u{110C}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{C87E}", - nfc: "\u{C87E}", - nfd: "\u{110C}\u{1169}\u{11B5}", - nfkc: "\u{C87E}", - nfkd: "\u{110C}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{C87F}", - nfc: "\u{C87F}", - nfd: "\u{110C}\u{1169}\u{11B6}", - nfkc: "\u{C87F}", - nfkd: "\u{110C}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{C880}", - nfc: "\u{C880}", - nfd: "\u{110C}\u{1169}\u{11B7}", - nfkc: "\u{C880}", - nfkd: "\u{110C}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{C881}", - nfc: "\u{C881}", - nfd: "\u{110C}\u{1169}\u{11B8}", - nfkc: "\u{C881}", - nfkd: "\u{110C}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{C882}", - nfc: "\u{C882}", - nfd: "\u{110C}\u{1169}\u{11B9}", - nfkc: "\u{C882}", - nfkd: "\u{110C}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{C883}", - nfc: "\u{C883}", - nfd: "\u{110C}\u{1169}\u{11BA}", - nfkc: "\u{C883}", - nfkd: "\u{110C}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{C884}", - nfc: "\u{C884}", - nfd: "\u{110C}\u{1169}\u{11BB}", - nfkc: "\u{C884}", - nfkd: "\u{110C}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{C885}", - nfc: "\u{C885}", - nfd: "\u{110C}\u{1169}\u{11BC}", - nfkc: "\u{C885}", - nfkd: "\u{110C}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{C886}", - nfc: "\u{C886}", - nfd: "\u{110C}\u{1169}\u{11BD}", - nfkc: "\u{C886}", - nfkd: "\u{110C}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{C887}", - nfc: "\u{C887}", - nfd: "\u{110C}\u{1169}\u{11BE}", - nfkc: "\u{C887}", - nfkd: "\u{110C}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{C888}", - nfc: "\u{C888}", - nfd: "\u{110C}\u{1169}\u{11BF}", - nfkc: "\u{C888}", - nfkd: "\u{110C}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{C889}", - nfc: "\u{C889}", - nfd: "\u{110C}\u{1169}\u{11C0}", - nfkc: "\u{C889}", - nfkd: "\u{110C}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{C88A}", - nfc: "\u{C88A}", - nfd: "\u{110C}\u{1169}\u{11C1}", - nfkc: "\u{C88A}", - nfkd: "\u{110C}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{C88B}", - nfc: "\u{C88B}", - nfd: "\u{110C}\u{1169}\u{11C2}", - nfkc: "\u{C88B}", - nfkd: "\u{110C}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{C88C}", - nfc: "\u{C88C}", - nfd: "\u{110C}\u{116A}", - nfkc: "\u{C88C}", - nfkd: "\u{110C}\u{116A}", - }, - NormalizationTest { - source: "\u{C88D}", - nfc: "\u{C88D}", - nfd: "\u{110C}\u{116A}\u{11A8}", - nfkc: "\u{C88D}", - nfkd: "\u{110C}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{C88E}", - nfc: "\u{C88E}", - nfd: "\u{110C}\u{116A}\u{11A9}", - nfkc: "\u{C88E}", - nfkd: "\u{110C}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{C88F}", - nfc: "\u{C88F}", - nfd: "\u{110C}\u{116A}\u{11AA}", - nfkc: "\u{C88F}", - nfkd: "\u{110C}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{C890}", - nfc: "\u{C890}", - nfd: "\u{110C}\u{116A}\u{11AB}", - nfkc: "\u{C890}", - nfkd: "\u{110C}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{C891}", - nfc: "\u{C891}", - nfd: "\u{110C}\u{116A}\u{11AC}", - nfkc: "\u{C891}", - nfkd: "\u{110C}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{C892}", - nfc: "\u{C892}", - nfd: "\u{110C}\u{116A}\u{11AD}", - nfkc: "\u{C892}", - nfkd: "\u{110C}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{C893}", - nfc: "\u{C893}", - nfd: "\u{110C}\u{116A}\u{11AE}", - nfkc: "\u{C893}", - nfkd: "\u{110C}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{C894}", - nfc: "\u{C894}", - nfd: "\u{110C}\u{116A}\u{11AF}", - nfkc: "\u{C894}", - nfkd: "\u{110C}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{C895}", - nfc: "\u{C895}", - nfd: "\u{110C}\u{116A}\u{11B0}", - nfkc: "\u{C895}", - nfkd: "\u{110C}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{C896}", - nfc: "\u{C896}", - nfd: "\u{110C}\u{116A}\u{11B1}", - nfkc: "\u{C896}", - nfkd: "\u{110C}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{C897}", - nfc: "\u{C897}", - nfd: "\u{110C}\u{116A}\u{11B2}", - nfkc: "\u{C897}", - nfkd: "\u{110C}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{C898}", - nfc: "\u{C898}", - nfd: "\u{110C}\u{116A}\u{11B3}", - nfkc: "\u{C898}", - nfkd: "\u{110C}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{C899}", - nfc: "\u{C899}", - nfd: "\u{110C}\u{116A}\u{11B4}", - nfkc: "\u{C899}", - nfkd: "\u{110C}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{C89A}", - nfc: "\u{C89A}", - nfd: "\u{110C}\u{116A}\u{11B5}", - nfkc: "\u{C89A}", - nfkd: "\u{110C}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{C89B}", - nfc: "\u{C89B}", - nfd: "\u{110C}\u{116A}\u{11B6}", - nfkc: "\u{C89B}", - nfkd: "\u{110C}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{C89C}", - nfc: "\u{C89C}", - nfd: "\u{110C}\u{116A}\u{11B7}", - nfkc: "\u{C89C}", - nfkd: "\u{110C}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{C89D}", - nfc: "\u{C89D}", - nfd: "\u{110C}\u{116A}\u{11B8}", - nfkc: "\u{C89D}", - nfkd: "\u{110C}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{C89E}", - nfc: "\u{C89E}", - nfd: "\u{110C}\u{116A}\u{11B9}", - nfkc: "\u{C89E}", - nfkd: "\u{110C}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{C89F}", - nfc: "\u{C89F}", - nfd: "\u{110C}\u{116A}\u{11BA}", - nfkc: "\u{C89F}", - nfkd: "\u{110C}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{C8A0}", - nfc: "\u{C8A0}", - nfd: "\u{110C}\u{116A}\u{11BB}", - nfkc: "\u{C8A0}", - nfkd: "\u{110C}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{C8A1}", - nfc: "\u{C8A1}", - nfd: "\u{110C}\u{116A}\u{11BC}", - nfkc: "\u{C8A1}", - nfkd: "\u{110C}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{C8A2}", - nfc: "\u{C8A2}", - nfd: "\u{110C}\u{116A}\u{11BD}", - nfkc: "\u{C8A2}", - nfkd: "\u{110C}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{C8A3}", - nfc: "\u{C8A3}", - nfd: "\u{110C}\u{116A}\u{11BE}", - nfkc: "\u{C8A3}", - nfkd: "\u{110C}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{C8A4}", - nfc: "\u{C8A4}", - nfd: "\u{110C}\u{116A}\u{11BF}", - nfkc: "\u{C8A4}", - nfkd: "\u{110C}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{C8A5}", - nfc: "\u{C8A5}", - nfd: "\u{110C}\u{116A}\u{11C0}", - nfkc: "\u{C8A5}", - nfkd: "\u{110C}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{C8A6}", - nfc: "\u{C8A6}", - nfd: "\u{110C}\u{116A}\u{11C1}", - nfkc: "\u{C8A6}", - nfkd: "\u{110C}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{C8A7}", - nfc: "\u{C8A7}", - nfd: "\u{110C}\u{116A}\u{11C2}", - nfkc: "\u{C8A7}", - nfkd: "\u{110C}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{C8A8}", - nfc: "\u{C8A8}", - nfd: "\u{110C}\u{116B}", - nfkc: "\u{C8A8}", - nfkd: "\u{110C}\u{116B}", - }, - NormalizationTest { - source: "\u{C8A9}", - nfc: "\u{C8A9}", - nfd: "\u{110C}\u{116B}\u{11A8}", - nfkc: "\u{C8A9}", - nfkd: "\u{110C}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{C8AA}", - nfc: "\u{C8AA}", - nfd: "\u{110C}\u{116B}\u{11A9}", - nfkc: "\u{C8AA}", - nfkd: "\u{110C}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{C8AB}", - nfc: "\u{C8AB}", - nfd: "\u{110C}\u{116B}\u{11AA}", - nfkc: "\u{C8AB}", - nfkd: "\u{110C}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{C8AC}", - nfc: "\u{C8AC}", - nfd: "\u{110C}\u{116B}\u{11AB}", - nfkc: "\u{C8AC}", - nfkd: "\u{110C}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{C8AD}", - nfc: "\u{C8AD}", - nfd: "\u{110C}\u{116B}\u{11AC}", - nfkc: "\u{C8AD}", - nfkd: "\u{110C}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{C8AE}", - nfc: "\u{C8AE}", - nfd: "\u{110C}\u{116B}\u{11AD}", - nfkc: "\u{C8AE}", - nfkd: "\u{110C}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{C8AF}", - nfc: "\u{C8AF}", - nfd: "\u{110C}\u{116B}\u{11AE}", - nfkc: "\u{C8AF}", - nfkd: "\u{110C}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{C8B0}", - nfc: "\u{C8B0}", - nfd: "\u{110C}\u{116B}\u{11AF}", - nfkc: "\u{C8B0}", - nfkd: "\u{110C}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{C8B1}", - nfc: "\u{C8B1}", - nfd: "\u{110C}\u{116B}\u{11B0}", - nfkc: "\u{C8B1}", - nfkd: "\u{110C}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{C8B2}", - nfc: "\u{C8B2}", - nfd: "\u{110C}\u{116B}\u{11B1}", - nfkc: "\u{C8B2}", - nfkd: "\u{110C}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{C8B3}", - nfc: "\u{C8B3}", - nfd: "\u{110C}\u{116B}\u{11B2}", - nfkc: "\u{C8B3}", - nfkd: "\u{110C}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{C8B4}", - nfc: "\u{C8B4}", - nfd: "\u{110C}\u{116B}\u{11B3}", - nfkc: "\u{C8B4}", - nfkd: "\u{110C}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{C8B5}", - nfc: "\u{C8B5}", - nfd: "\u{110C}\u{116B}\u{11B4}", - nfkc: "\u{C8B5}", - nfkd: "\u{110C}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{C8B6}", - nfc: "\u{C8B6}", - nfd: "\u{110C}\u{116B}\u{11B5}", - nfkc: "\u{C8B6}", - nfkd: "\u{110C}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{C8B7}", - nfc: "\u{C8B7}", - nfd: "\u{110C}\u{116B}\u{11B6}", - nfkc: "\u{C8B7}", - nfkd: "\u{110C}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{C8B8}", - nfc: "\u{C8B8}", - nfd: "\u{110C}\u{116B}\u{11B7}", - nfkc: "\u{C8B8}", - nfkd: "\u{110C}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{C8B9}", - nfc: "\u{C8B9}", - nfd: "\u{110C}\u{116B}\u{11B8}", - nfkc: "\u{C8B9}", - nfkd: "\u{110C}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{C8BA}", - nfc: "\u{C8BA}", - nfd: "\u{110C}\u{116B}\u{11B9}", - nfkc: "\u{C8BA}", - nfkd: "\u{110C}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{C8BB}", - nfc: "\u{C8BB}", - nfd: "\u{110C}\u{116B}\u{11BA}", - nfkc: "\u{C8BB}", - nfkd: "\u{110C}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{C8BC}", - nfc: "\u{C8BC}", - nfd: "\u{110C}\u{116B}\u{11BB}", - nfkc: "\u{C8BC}", - nfkd: "\u{110C}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{C8BD}", - nfc: "\u{C8BD}", - nfd: "\u{110C}\u{116B}\u{11BC}", - nfkc: "\u{C8BD}", - nfkd: "\u{110C}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{C8BE}", - nfc: "\u{C8BE}", - nfd: "\u{110C}\u{116B}\u{11BD}", - nfkc: "\u{C8BE}", - nfkd: "\u{110C}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{C8BF}", - nfc: "\u{C8BF}", - nfd: "\u{110C}\u{116B}\u{11BE}", - nfkc: "\u{C8BF}", - nfkd: "\u{110C}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{C8C0}", - nfc: "\u{C8C0}", - nfd: "\u{110C}\u{116B}\u{11BF}", - nfkc: "\u{C8C0}", - nfkd: "\u{110C}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{C8C1}", - nfc: "\u{C8C1}", - nfd: "\u{110C}\u{116B}\u{11C0}", - nfkc: "\u{C8C1}", - nfkd: "\u{110C}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{C8C2}", - nfc: "\u{C8C2}", - nfd: "\u{110C}\u{116B}\u{11C1}", - nfkc: "\u{C8C2}", - nfkd: "\u{110C}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{C8C3}", - nfc: "\u{C8C3}", - nfd: "\u{110C}\u{116B}\u{11C2}", - nfkc: "\u{C8C3}", - nfkd: "\u{110C}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{C8C4}", - nfc: "\u{C8C4}", - nfd: "\u{110C}\u{116C}", - nfkc: "\u{C8C4}", - nfkd: "\u{110C}\u{116C}", - }, - NormalizationTest { - source: "\u{C8C5}", - nfc: "\u{C8C5}", - nfd: "\u{110C}\u{116C}\u{11A8}", - nfkc: "\u{C8C5}", - nfkd: "\u{110C}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{C8C6}", - nfc: "\u{C8C6}", - nfd: "\u{110C}\u{116C}\u{11A9}", - nfkc: "\u{C8C6}", - nfkd: "\u{110C}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{C8C7}", - nfc: "\u{C8C7}", - nfd: "\u{110C}\u{116C}\u{11AA}", - nfkc: "\u{C8C7}", - nfkd: "\u{110C}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{C8C8}", - nfc: "\u{C8C8}", - nfd: "\u{110C}\u{116C}\u{11AB}", - nfkc: "\u{C8C8}", - nfkd: "\u{110C}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{C8C9}", - nfc: "\u{C8C9}", - nfd: "\u{110C}\u{116C}\u{11AC}", - nfkc: "\u{C8C9}", - nfkd: "\u{110C}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{C8CA}", - nfc: "\u{C8CA}", - nfd: "\u{110C}\u{116C}\u{11AD}", - nfkc: "\u{C8CA}", - nfkd: "\u{110C}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{C8CB}", - nfc: "\u{C8CB}", - nfd: "\u{110C}\u{116C}\u{11AE}", - nfkc: "\u{C8CB}", - nfkd: "\u{110C}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{C8CC}", - nfc: "\u{C8CC}", - nfd: "\u{110C}\u{116C}\u{11AF}", - nfkc: "\u{C8CC}", - nfkd: "\u{110C}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{C8CD}", - nfc: "\u{C8CD}", - nfd: "\u{110C}\u{116C}\u{11B0}", - nfkc: "\u{C8CD}", - nfkd: "\u{110C}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{C8CE}", - nfc: "\u{C8CE}", - nfd: "\u{110C}\u{116C}\u{11B1}", - nfkc: "\u{C8CE}", - nfkd: "\u{110C}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{C8CF}", - nfc: "\u{C8CF}", - nfd: "\u{110C}\u{116C}\u{11B2}", - nfkc: "\u{C8CF}", - nfkd: "\u{110C}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{C8D0}", - nfc: "\u{C8D0}", - nfd: "\u{110C}\u{116C}\u{11B3}", - nfkc: "\u{C8D0}", - nfkd: "\u{110C}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{C8D1}", - nfc: "\u{C8D1}", - nfd: "\u{110C}\u{116C}\u{11B4}", - nfkc: "\u{C8D1}", - nfkd: "\u{110C}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{C8D2}", - nfc: "\u{C8D2}", - nfd: "\u{110C}\u{116C}\u{11B5}", - nfkc: "\u{C8D2}", - nfkd: "\u{110C}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{C8D3}", - nfc: "\u{C8D3}", - nfd: "\u{110C}\u{116C}\u{11B6}", - nfkc: "\u{C8D3}", - nfkd: "\u{110C}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{C8D4}", - nfc: "\u{C8D4}", - nfd: "\u{110C}\u{116C}\u{11B7}", - nfkc: "\u{C8D4}", - nfkd: "\u{110C}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{C8D5}", - nfc: "\u{C8D5}", - nfd: "\u{110C}\u{116C}\u{11B8}", - nfkc: "\u{C8D5}", - nfkd: "\u{110C}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{C8D6}", - nfc: "\u{C8D6}", - nfd: "\u{110C}\u{116C}\u{11B9}", - nfkc: "\u{C8D6}", - nfkd: "\u{110C}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{C8D7}", - nfc: "\u{C8D7}", - nfd: "\u{110C}\u{116C}\u{11BA}", - nfkc: "\u{C8D7}", - nfkd: "\u{110C}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{C8D8}", - nfc: "\u{C8D8}", - nfd: "\u{110C}\u{116C}\u{11BB}", - nfkc: "\u{C8D8}", - nfkd: "\u{110C}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{C8D9}", - nfc: "\u{C8D9}", - nfd: "\u{110C}\u{116C}\u{11BC}", - nfkc: "\u{C8D9}", - nfkd: "\u{110C}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{C8DA}", - nfc: "\u{C8DA}", - nfd: "\u{110C}\u{116C}\u{11BD}", - nfkc: "\u{C8DA}", - nfkd: "\u{110C}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{C8DB}", - nfc: "\u{C8DB}", - nfd: "\u{110C}\u{116C}\u{11BE}", - nfkc: "\u{C8DB}", - nfkd: "\u{110C}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{C8DC}", - nfc: "\u{C8DC}", - nfd: "\u{110C}\u{116C}\u{11BF}", - nfkc: "\u{C8DC}", - nfkd: "\u{110C}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{C8DD}", - nfc: "\u{C8DD}", - nfd: "\u{110C}\u{116C}\u{11C0}", - nfkc: "\u{C8DD}", - nfkd: "\u{110C}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{C8DE}", - nfc: "\u{C8DE}", - nfd: "\u{110C}\u{116C}\u{11C1}", - nfkc: "\u{C8DE}", - nfkd: "\u{110C}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{C8DF}", - nfc: "\u{C8DF}", - nfd: "\u{110C}\u{116C}\u{11C2}", - nfkc: "\u{C8DF}", - nfkd: "\u{110C}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{C8E0}", - nfc: "\u{C8E0}", - nfd: "\u{110C}\u{116D}", - nfkc: "\u{C8E0}", - nfkd: "\u{110C}\u{116D}", - }, - NormalizationTest { - source: "\u{C8E1}", - nfc: "\u{C8E1}", - nfd: "\u{110C}\u{116D}\u{11A8}", - nfkc: "\u{C8E1}", - nfkd: "\u{110C}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{C8E2}", - nfc: "\u{C8E2}", - nfd: "\u{110C}\u{116D}\u{11A9}", - nfkc: "\u{C8E2}", - nfkd: "\u{110C}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{C8E3}", - nfc: "\u{C8E3}", - nfd: "\u{110C}\u{116D}\u{11AA}", - nfkc: "\u{C8E3}", - nfkd: "\u{110C}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{C8E4}", - nfc: "\u{C8E4}", - nfd: "\u{110C}\u{116D}\u{11AB}", - nfkc: "\u{C8E4}", - nfkd: "\u{110C}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{C8E5}", - nfc: "\u{C8E5}", - nfd: "\u{110C}\u{116D}\u{11AC}", - nfkc: "\u{C8E5}", - nfkd: "\u{110C}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{C8E6}", - nfc: "\u{C8E6}", - nfd: "\u{110C}\u{116D}\u{11AD}", - nfkc: "\u{C8E6}", - nfkd: "\u{110C}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{C8E7}", - nfc: "\u{C8E7}", - nfd: "\u{110C}\u{116D}\u{11AE}", - nfkc: "\u{C8E7}", - nfkd: "\u{110C}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{C8E8}", - nfc: "\u{C8E8}", - nfd: "\u{110C}\u{116D}\u{11AF}", - nfkc: "\u{C8E8}", - nfkd: "\u{110C}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{C8E9}", - nfc: "\u{C8E9}", - nfd: "\u{110C}\u{116D}\u{11B0}", - nfkc: "\u{C8E9}", - nfkd: "\u{110C}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{C8EA}", - nfc: "\u{C8EA}", - nfd: "\u{110C}\u{116D}\u{11B1}", - nfkc: "\u{C8EA}", - nfkd: "\u{110C}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{C8EB}", - nfc: "\u{C8EB}", - nfd: "\u{110C}\u{116D}\u{11B2}", - nfkc: "\u{C8EB}", - nfkd: "\u{110C}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{C8EC}", - nfc: "\u{C8EC}", - nfd: "\u{110C}\u{116D}\u{11B3}", - nfkc: "\u{C8EC}", - nfkd: "\u{110C}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{C8ED}", - nfc: "\u{C8ED}", - nfd: "\u{110C}\u{116D}\u{11B4}", - nfkc: "\u{C8ED}", - nfkd: "\u{110C}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{C8EE}", - nfc: "\u{C8EE}", - nfd: "\u{110C}\u{116D}\u{11B5}", - nfkc: "\u{C8EE}", - nfkd: "\u{110C}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{C8EF}", - nfc: "\u{C8EF}", - nfd: "\u{110C}\u{116D}\u{11B6}", - nfkc: "\u{C8EF}", - nfkd: "\u{110C}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{C8F0}", - nfc: "\u{C8F0}", - nfd: "\u{110C}\u{116D}\u{11B7}", - nfkc: "\u{C8F0}", - nfkd: "\u{110C}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{C8F1}", - nfc: "\u{C8F1}", - nfd: "\u{110C}\u{116D}\u{11B8}", - nfkc: "\u{C8F1}", - nfkd: "\u{110C}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{C8F2}", - nfc: "\u{C8F2}", - nfd: "\u{110C}\u{116D}\u{11B9}", - nfkc: "\u{C8F2}", - nfkd: "\u{110C}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{C8F3}", - nfc: "\u{C8F3}", - nfd: "\u{110C}\u{116D}\u{11BA}", - nfkc: "\u{C8F3}", - nfkd: "\u{110C}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{C8F4}", - nfc: "\u{C8F4}", - nfd: "\u{110C}\u{116D}\u{11BB}", - nfkc: "\u{C8F4}", - nfkd: "\u{110C}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{C8F5}", - nfc: "\u{C8F5}", - nfd: "\u{110C}\u{116D}\u{11BC}", - nfkc: "\u{C8F5}", - nfkd: "\u{110C}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{C8F6}", - nfc: "\u{C8F6}", - nfd: "\u{110C}\u{116D}\u{11BD}", - nfkc: "\u{C8F6}", - nfkd: "\u{110C}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{C8F7}", - nfc: "\u{C8F7}", - nfd: "\u{110C}\u{116D}\u{11BE}", - nfkc: "\u{C8F7}", - nfkd: "\u{110C}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{C8F8}", - nfc: "\u{C8F8}", - nfd: "\u{110C}\u{116D}\u{11BF}", - nfkc: "\u{C8F8}", - nfkd: "\u{110C}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{C8F9}", - nfc: "\u{C8F9}", - nfd: "\u{110C}\u{116D}\u{11C0}", - nfkc: "\u{C8F9}", - nfkd: "\u{110C}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{C8FA}", - nfc: "\u{C8FA}", - nfd: "\u{110C}\u{116D}\u{11C1}", - nfkc: "\u{C8FA}", - nfkd: "\u{110C}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{C8FB}", - nfc: "\u{C8FB}", - nfd: "\u{110C}\u{116D}\u{11C2}", - nfkc: "\u{C8FB}", - nfkd: "\u{110C}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{C8FC}", - nfc: "\u{C8FC}", - nfd: "\u{110C}\u{116E}", - nfkc: "\u{C8FC}", - nfkd: "\u{110C}\u{116E}", - }, - NormalizationTest { - source: "\u{C8FD}", - nfc: "\u{C8FD}", - nfd: "\u{110C}\u{116E}\u{11A8}", - nfkc: "\u{C8FD}", - nfkd: "\u{110C}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{C8FE}", - nfc: "\u{C8FE}", - nfd: "\u{110C}\u{116E}\u{11A9}", - nfkc: "\u{C8FE}", - nfkd: "\u{110C}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{C8FF}", - nfc: "\u{C8FF}", - nfd: "\u{110C}\u{116E}\u{11AA}", - nfkc: "\u{C8FF}", - nfkd: "\u{110C}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{C900}", - nfc: "\u{C900}", - nfd: "\u{110C}\u{116E}\u{11AB}", - nfkc: "\u{C900}", - nfkd: "\u{110C}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{C901}", - nfc: "\u{C901}", - nfd: "\u{110C}\u{116E}\u{11AC}", - nfkc: "\u{C901}", - nfkd: "\u{110C}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{C902}", - nfc: "\u{C902}", - nfd: "\u{110C}\u{116E}\u{11AD}", - nfkc: "\u{C902}", - nfkd: "\u{110C}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{C903}", - nfc: "\u{C903}", - nfd: "\u{110C}\u{116E}\u{11AE}", - nfkc: "\u{C903}", - nfkd: "\u{110C}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{C904}", - nfc: "\u{C904}", - nfd: "\u{110C}\u{116E}\u{11AF}", - nfkc: "\u{C904}", - nfkd: "\u{110C}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{C905}", - nfc: "\u{C905}", - nfd: "\u{110C}\u{116E}\u{11B0}", - nfkc: "\u{C905}", - nfkd: "\u{110C}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{C906}", - nfc: "\u{C906}", - nfd: "\u{110C}\u{116E}\u{11B1}", - nfkc: "\u{C906}", - nfkd: "\u{110C}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{C907}", - nfc: "\u{C907}", - nfd: "\u{110C}\u{116E}\u{11B2}", - nfkc: "\u{C907}", - nfkd: "\u{110C}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{C908}", - nfc: "\u{C908}", - nfd: "\u{110C}\u{116E}\u{11B3}", - nfkc: "\u{C908}", - nfkd: "\u{110C}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{C909}", - nfc: "\u{C909}", - nfd: "\u{110C}\u{116E}\u{11B4}", - nfkc: "\u{C909}", - nfkd: "\u{110C}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{C90A}", - nfc: "\u{C90A}", - nfd: "\u{110C}\u{116E}\u{11B5}", - nfkc: "\u{C90A}", - nfkd: "\u{110C}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{C90B}", - nfc: "\u{C90B}", - nfd: "\u{110C}\u{116E}\u{11B6}", - nfkc: "\u{C90B}", - nfkd: "\u{110C}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{C90C}", - nfc: "\u{C90C}", - nfd: "\u{110C}\u{116E}\u{11B7}", - nfkc: "\u{C90C}", - nfkd: "\u{110C}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{C90D}", - nfc: "\u{C90D}", - nfd: "\u{110C}\u{116E}\u{11B8}", - nfkc: "\u{C90D}", - nfkd: "\u{110C}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{C90E}", - nfc: "\u{C90E}", - nfd: "\u{110C}\u{116E}\u{11B9}", - nfkc: "\u{C90E}", - nfkd: "\u{110C}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{C90F}", - nfc: "\u{C90F}", - nfd: "\u{110C}\u{116E}\u{11BA}", - nfkc: "\u{C90F}", - nfkd: "\u{110C}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{C910}", - nfc: "\u{C910}", - nfd: "\u{110C}\u{116E}\u{11BB}", - nfkc: "\u{C910}", - nfkd: "\u{110C}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{C911}", - nfc: "\u{C911}", - nfd: "\u{110C}\u{116E}\u{11BC}", - nfkc: "\u{C911}", - nfkd: "\u{110C}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{C912}", - nfc: "\u{C912}", - nfd: "\u{110C}\u{116E}\u{11BD}", - nfkc: "\u{C912}", - nfkd: "\u{110C}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{C913}", - nfc: "\u{C913}", - nfd: "\u{110C}\u{116E}\u{11BE}", - nfkc: "\u{C913}", - nfkd: "\u{110C}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{C914}", - nfc: "\u{C914}", - nfd: "\u{110C}\u{116E}\u{11BF}", - nfkc: "\u{C914}", - nfkd: "\u{110C}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{C915}", - nfc: "\u{C915}", - nfd: "\u{110C}\u{116E}\u{11C0}", - nfkc: "\u{C915}", - nfkd: "\u{110C}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{C916}", - nfc: "\u{C916}", - nfd: "\u{110C}\u{116E}\u{11C1}", - nfkc: "\u{C916}", - nfkd: "\u{110C}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{C917}", - nfc: "\u{C917}", - nfd: "\u{110C}\u{116E}\u{11C2}", - nfkc: "\u{C917}", - nfkd: "\u{110C}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{C918}", - nfc: "\u{C918}", - nfd: "\u{110C}\u{116F}", - nfkc: "\u{C918}", - nfkd: "\u{110C}\u{116F}", - }, - NormalizationTest { - source: "\u{C919}", - nfc: "\u{C919}", - nfd: "\u{110C}\u{116F}\u{11A8}", - nfkc: "\u{C919}", - nfkd: "\u{110C}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{C91A}", - nfc: "\u{C91A}", - nfd: "\u{110C}\u{116F}\u{11A9}", - nfkc: "\u{C91A}", - nfkd: "\u{110C}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{C91B}", - nfc: "\u{C91B}", - nfd: "\u{110C}\u{116F}\u{11AA}", - nfkc: "\u{C91B}", - nfkd: "\u{110C}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{C91C}", - nfc: "\u{C91C}", - nfd: "\u{110C}\u{116F}\u{11AB}", - nfkc: "\u{C91C}", - nfkd: "\u{110C}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{C91D}", - nfc: "\u{C91D}", - nfd: "\u{110C}\u{116F}\u{11AC}", - nfkc: "\u{C91D}", - nfkd: "\u{110C}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{C91E}", - nfc: "\u{C91E}", - nfd: "\u{110C}\u{116F}\u{11AD}", - nfkc: "\u{C91E}", - nfkd: "\u{110C}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{C91F}", - nfc: "\u{C91F}", - nfd: "\u{110C}\u{116F}\u{11AE}", - nfkc: "\u{C91F}", - nfkd: "\u{110C}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{C920}", - nfc: "\u{C920}", - nfd: "\u{110C}\u{116F}\u{11AF}", - nfkc: "\u{C920}", - nfkd: "\u{110C}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{C921}", - nfc: "\u{C921}", - nfd: "\u{110C}\u{116F}\u{11B0}", - nfkc: "\u{C921}", - nfkd: "\u{110C}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{C922}", - nfc: "\u{C922}", - nfd: "\u{110C}\u{116F}\u{11B1}", - nfkc: "\u{C922}", - nfkd: "\u{110C}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{C923}", - nfc: "\u{C923}", - nfd: "\u{110C}\u{116F}\u{11B2}", - nfkc: "\u{C923}", - nfkd: "\u{110C}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{C924}", - nfc: "\u{C924}", - nfd: "\u{110C}\u{116F}\u{11B3}", - nfkc: "\u{C924}", - nfkd: "\u{110C}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{C925}", - nfc: "\u{C925}", - nfd: "\u{110C}\u{116F}\u{11B4}", - nfkc: "\u{C925}", - nfkd: "\u{110C}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{C926}", - nfc: "\u{C926}", - nfd: "\u{110C}\u{116F}\u{11B5}", - nfkc: "\u{C926}", - nfkd: "\u{110C}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{C927}", - nfc: "\u{C927}", - nfd: "\u{110C}\u{116F}\u{11B6}", - nfkc: "\u{C927}", - nfkd: "\u{110C}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{C928}", - nfc: "\u{C928}", - nfd: "\u{110C}\u{116F}\u{11B7}", - nfkc: "\u{C928}", - nfkd: "\u{110C}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{C929}", - nfc: "\u{C929}", - nfd: "\u{110C}\u{116F}\u{11B8}", - nfkc: "\u{C929}", - nfkd: "\u{110C}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{C92A}", - nfc: "\u{C92A}", - nfd: "\u{110C}\u{116F}\u{11B9}", - nfkc: "\u{C92A}", - nfkd: "\u{110C}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{C92B}", - nfc: "\u{C92B}", - nfd: "\u{110C}\u{116F}\u{11BA}", - nfkc: "\u{C92B}", - nfkd: "\u{110C}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{C92C}", - nfc: "\u{C92C}", - nfd: "\u{110C}\u{116F}\u{11BB}", - nfkc: "\u{C92C}", - nfkd: "\u{110C}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{C92D}", - nfc: "\u{C92D}", - nfd: "\u{110C}\u{116F}\u{11BC}", - nfkc: "\u{C92D}", - nfkd: "\u{110C}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{C92E}", - nfc: "\u{C92E}", - nfd: "\u{110C}\u{116F}\u{11BD}", - nfkc: "\u{C92E}", - nfkd: "\u{110C}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{C92F}", - nfc: "\u{C92F}", - nfd: "\u{110C}\u{116F}\u{11BE}", - nfkc: "\u{C92F}", - nfkd: "\u{110C}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{C930}", - nfc: "\u{C930}", - nfd: "\u{110C}\u{116F}\u{11BF}", - nfkc: "\u{C930}", - nfkd: "\u{110C}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{C931}", - nfc: "\u{C931}", - nfd: "\u{110C}\u{116F}\u{11C0}", - nfkc: "\u{C931}", - nfkd: "\u{110C}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{C932}", - nfc: "\u{C932}", - nfd: "\u{110C}\u{116F}\u{11C1}", - nfkc: "\u{C932}", - nfkd: "\u{110C}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{C933}", - nfc: "\u{C933}", - nfd: "\u{110C}\u{116F}\u{11C2}", - nfkc: "\u{C933}", - nfkd: "\u{110C}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{C934}", - nfc: "\u{C934}", - nfd: "\u{110C}\u{1170}", - nfkc: "\u{C934}", - nfkd: "\u{110C}\u{1170}", - }, - NormalizationTest { - source: "\u{C935}", - nfc: "\u{C935}", - nfd: "\u{110C}\u{1170}\u{11A8}", - nfkc: "\u{C935}", - nfkd: "\u{110C}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{C936}", - nfc: "\u{C936}", - nfd: "\u{110C}\u{1170}\u{11A9}", - nfkc: "\u{C936}", - nfkd: "\u{110C}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{C937}", - nfc: "\u{C937}", - nfd: "\u{110C}\u{1170}\u{11AA}", - nfkc: "\u{C937}", - nfkd: "\u{110C}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{C938}", - nfc: "\u{C938}", - nfd: "\u{110C}\u{1170}\u{11AB}", - nfkc: "\u{C938}", - nfkd: "\u{110C}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{C939}", - nfc: "\u{C939}", - nfd: "\u{110C}\u{1170}\u{11AC}", - nfkc: "\u{C939}", - nfkd: "\u{110C}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{C93A}", - nfc: "\u{C93A}", - nfd: "\u{110C}\u{1170}\u{11AD}", - nfkc: "\u{C93A}", - nfkd: "\u{110C}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{C93B}", - nfc: "\u{C93B}", - nfd: "\u{110C}\u{1170}\u{11AE}", - nfkc: "\u{C93B}", - nfkd: "\u{110C}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{C93C}", - nfc: "\u{C93C}", - nfd: "\u{110C}\u{1170}\u{11AF}", - nfkc: "\u{C93C}", - nfkd: "\u{110C}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{C93D}", - nfc: "\u{C93D}", - nfd: "\u{110C}\u{1170}\u{11B0}", - nfkc: "\u{C93D}", - nfkd: "\u{110C}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{C93E}", - nfc: "\u{C93E}", - nfd: "\u{110C}\u{1170}\u{11B1}", - nfkc: "\u{C93E}", - nfkd: "\u{110C}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{C93F}", - nfc: "\u{C93F}", - nfd: "\u{110C}\u{1170}\u{11B2}", - nfkc: "\u{C93F}", - nfkd: "\u{110C}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{C940}", - nfc: "\u{C940}", - nfd: "\u{110C}\u{1170}\u{11B3}", - nfkc: "\u{C940}", - nfkd: "\u{110C}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{C941}", - nfc: "\u{C941}", - nfd: "\u{110C}\u{1170}\u{11B4}", - nfkc: "\u{C941}", - nfkd: "\u{110C}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{C942}", - nfc: "\u{C942}", - nfd: "\u{110C}\u{1170}\u{11B5}", - nfkc: "\u{C942}", - nfkd: "\u{110C}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{C943}", - nfc: "\u{C943}", - nfd: "\u{110C}\u{1170}\u{11B6}", - nfkc: "\u{C943}", - nfkd: "\u{110C}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{C944}", - nfc: "\u{C944}", - nfd: "\u{110C}\u{1170}\u{11B7}", - nfkc: "\u{C944}", - nfkd: "\u{110C}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{C945}", - nfc: "\u{C945}", - nfd: "\u{110C}\u{1170}\u{11B8}", - nfkc: "\u{C945}", - nfkd: "\u{110C}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{C946}", - nfc: "\u{C946}", - nfd: "\u{110C}\u{1170}\u{11B9}", - nfkc: "\u{C946}", - nfkd: "\u{110C}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{C947}", - nfc: "\u{C947}", - nfd: "\u{110C}\u{1170}\u{11BA}", - nfkc: "\u{C947}", - nfkd: "\u{110C}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{C948}", - nfc: "\u{C948}", - nfd: "\u{110C}\u{1170}\u{11BB}", - nfkc: "\u{C948}", - nfkd: "\u{110C}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{C949}", - nfc: "\u{C949}", - nfd: "\u{110C}\u{1170}\u{11BC}", - nfkc: "\u{C949}", - nfkd: "\u{110C}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{C94A}", - nfc: "\u{C94A}", - nfd: "\u{110C}\u{1170}\u{11BD}", - nfkc: "\u{C94A}", - nfkd: "\u{110C}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{C94B}", - nfc: "\u{C94B}", - nfd: "\u{110C}\u{1170}\u{11BE}", - nfkc: "\u{C94B}", - nfkd: "\u{110C}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{C94C}", - nfc: "\u{C94C}", - nfd: "\u{110C}\u{1170}\u{11BF}", - nfkc: "\u{C94C}", - nfkd: "\u{110C}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{C94D}", - nfc: "\u{C94D}", - nfd: "\u{110C}\u{1170}\u{11C0}", - nfkc: "\u{C94D}", - nfkd: "\u{110C}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{C94E}", - nfc: "\u{C94E}", - nfd: "\u{110C}\u{1170}\u{11C1}", - nfkc: "\u{C94E}", - nfkd: "\u{110C}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{C94F}", - nfc: "\u{C94F}", - nfd: "\u{110C}\u{1170}\u{11C2}", - nfkc: "\u{C94F}", - nfkd: "\u{110C}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{C950}", - nfc: "\u{C950}", - nfd: "\u{110C}\u{1171}", - nfkc: "\u{C950}", - nfkd: "\u{110C}\u{1171}", - }, - NormalizationTest { - source: "\u{C951}", - nfc: "\u{C951}", - nfd: "\u{110C}\u{1171}\u{11A8}", - nfkc: "\u{C951}", - nfkd: "\u{110C}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{C952}", - nfc: "\u{C952}", - nfd: "\u{110C}\u{1171}\u{11A9}", - nfkc: "\u{C952}", - nfkd: "\u{110C}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{C953}", - nfc: "\u{C953}", - nfd: "\u{110C}\u{1171}\u{11AA}", - nfkc: "\u{C953}", - nfkd: "\u{110C}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{C954}", - nfc: "\u{C954}", - nfd: "\u{110C}\u{1171}\u{11AB}", - nfkc: "\u{C954}", - nfkd: "\u{110C}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{C955}", - nfc: "\u{C955}", - nfd: "\u{110C}\u{1171}\u{11AC}", - nfkc: "\u{C955}", - nfkd: "\u{110C}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{C956}", - nfc: "\u{C956}", - nfd: "\u{110C}\u{1171}\u{11AD}", - nfkc: "\u{C956}", - nfkd: "\u{110C}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{C957}", - nfc: "\u{C957}", - nfd: "\u{110C}\u{1171}\u{11AE}", - nfkc: "\u{C957}", - nfkd: "\u{110C}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{C958}", - nfc: "\u{C958}", - nfd: "\u{110C}\u{1171}\u{11AF}", - nfkc: "\u{C958}", - nfkd: "\u{110C}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{C959}", - nfc: "\u{C959}", - nfd: "\u{110C}\u{1171}\u{11B0}", - nfkc: "\u{C959}", - nfkd: "\u{110C}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{C95A}", - nfc: "\u{C95A}", - nfd: "\u{110C}\u{1171}\u{11B1}", - nfkc: "\u{C95A}", - nfkd: "\u{110C}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{C95B}", - nfc: "\u{C95B}", - nfd: "\u{110C}\u{1171}\u{11B2}", - nfkc: "\u{C95B}", - nfkd: "\u{110C}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{C95C}", - nfc: "\u{C95C}", - nfd: "\u{110C}\u{1171}\u{11B3}", - nfkc: "\u{C95C}", - nfkd: "\u{110C}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{C95D}", - nfc: "\u{C95D}", - nfd: "\u{110C}\u{1171}\u{11B4}", - nfkc: "\u{C95D}", - nfkd: "\u{110C}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{C95E}", - nfc: "\u{C95E}", - nfd: "\u{110C}\u{1171}\u{11B5}", - nfkc: "\u{C95E}", - nfkd: "\u{110C}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{C95F}", - nfc: "\u{C95F}", - nfd: "\u{110C}\u{1171}\u{11B6}", - nfkc: "\u{C95F}", - nfkd: "\u{110C}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{C960}", - nfc: "\u{C960}", - nfd: "\u{110C}\u{1171}\u{11B7}", - nfkc: "\u{C960}", - nfkd: "\u{110C}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{C961}", - nfc: "\u{C961}", - nfd: "\u{110C}\u{1171}\u{11B8}", - nfkc: "\u{C961}", - nfkd: "\u{110C}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{C962}", - nfc: "\u{C962}", - nfd: "\u{110C}\u{1171}\u{11B9}", - nfkc: "\u{C962}", - nfkd: "\u{110C}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{C963}", - nfc: "\u{C963}", - nfd: "\u{110C}\u{1171}\u{11BA}", - nfkc: "\u{C963}", - nfkd: "\u{110C}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{C964}", - nfc: "\u{C964}", - nfd: "\u{110C}\u{1171}\u{11BB}", - nfkc: "\u{C964}", - nfkd: "\u{110C}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{C965}", - nfc: "\u{C965}", - nfd: "\u{110C}\u{1171}\u{11BC}", - nfkc: "\u{C965}", - nfkd: "\u{110C}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{C966}", - nfc: "\u{C966}", - nfd: "\u{110C}\u{1171}\u{11BD}", - nfkc: "\u{C966}", - nfkd: "\u{110C}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{C967}", - nfc: "\u{C967}", - nfd: "\u{110C}\u{1171}\u{11BE}", - nfkc: "\u{C967}", - nfkd: "\u{110C}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{C968}", - nfc: "\u{C968}", - nfd: "\u{110C}\u{1171}\u{11BF}", - nfkc: "\u{C968}", - nfkd: "\u{110C}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{C969}", - nfc: "\u{C969}", - nfd: "\u{110C}\u{1171}\u{11C0}", - nfkc: "\u{C969}", - nfkd: "\u{110C}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{C96A}", - nfc: "\u{C96A}", - nfd: "\u{110C}\u{1171}\u{11C1}", - nfkc: "\u{C96A}", - nfkd: "\u{110C}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{C96B}", - nfc: "\u{C96B}", - nfd: "\u{110C}\u{1171}\u{11C2}", - nfkc: "\u{C96B}", - nfkd: "\u{110C}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{C96C}", - nfc: "\u{C96C}", - nfd: "\u{110C}\u{1172}", - nfkc: "\u{C96C}", - nfkd: "\u{110C}\u{1172}", - }, - NormalizationTest { - source: "\u{C96D}", - nfc: "\u{C96D}", - nfd: "\u{110C}\u{1172}\u{11A8}", - nfkc: "\u{C96D}", - nfkd: "\u{110C}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{C96E}", - nfc: "\u{C96E}", - nfd: "\u{110C}\u{1172}\u{11A9}", - nfkc: "\u{C96E}", - nfkd: "\u{110C}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{C96F}", - nfc: "\u{C96F}", - nfd: "\u{110C}\u{1172}\u{11AA}", - nfkc: "\u{C96F}", - nfkd: "\u{110C}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{C970}", - nfc: "\u{C970}", - nfd: "\u{110C}\u{1172}\u{11AB}", - nfkc: "\u{C970}", - nfkd: "\u{110C}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{C971}", - nfc: "\u{C971}", - nfd: "\u{110C}\u{1172}\u{11AC}", - nfkc: "\u{C971}", - nfkd: "\u{110C}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{C972}", - nfc: "\u{C972}", - nfd: "\u{110C}\u{1172}\u{11AD}", - nfkc: "\u{C972}", - nfkd: "\u{110C}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{C973}", - nfc: "\u{C973}", - nfd: "\u{110C}\u{1172}\u{11AE}", - nfkc: "\u{C973}", - nfkd: "\u{110C}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{C974}", - nfc: "\u{C974}", - nfd: "\u{110C}\u{1172}\u{11AF}", - nfkc: "\u{C974}", - nfkd: "\u{110C}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{C975}", - nfc: "\u{C975}", - nfd: "\u{110C}\u{1172}\u{11B0}", - nfkc: "\u{C975}", - nfkd: "\u{110C}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{C976}", - nfc: "\u{C976}", - nfd: "\u{110C}\u{1172}\u{11B1}", - nfkc: "\u{C976}", - nfkd: "\u{110C}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{C977}", - nfc: "\u{C977}", - nfd: "\u{110C}\u{1172}\u{11B2}", - nfkc: "\u{C977}", - nfkd: "\u{110C}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{C978}", - nfc: "\u{C978}", - nfd: "\u{110C}\u{1172}\u{11B3}", - nfkc: "\u{C978}", - nfkd: "\u{110C}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{C979}", - nfc: "\u{C979}", - nfd: "\u{110C}\u{1172}\u{11B4}", - nfkc: "\u{C979}", - nfkd: "\u{110C}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{C97A}", - nfc: "\u{C97A}", - nfd: "\u{110C}\u{1172}\u{11B5}", - nfkc: "\u{C97A}", - nfkd: "\u{110C}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{C97B}", - nfc: "\u{C97B}", - nfd: "\u{110C}\u{1172}\u{11B6}", - nfkc: "\u{C97B}", - nfkd: "\u{110C}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{C97C}", - nfc: "\u{C97C}", - nfd: "\u{110C}\u{1172}\u{11B7}", - nfkc: "\u{C97C}", - nfkd: "\u{110C}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{C97D}", - nfc: "\u{C97D}", - nfd: "\u{110C}\u{1172}\u{11B8}", - nfkc: "\u{C97D}", - nfkd: "\u{110C}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{C97E}", - nfc: "\u{C97E}", - nfd: "\u{110C}\u{1172}\u{11B9}", - nfkc: "\u{C97E}", - nfkd: "\u{110C}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{C97F}", - nfc: "\u{C97F}", - nfd: "\u{110C}\u{1172}\u{11BA}", - nfkc: "\u{C97F}", - nfkd: "\u{110C}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{C980}", - nfc: "\u{C980}", - nfd: "\u{110C}\u{1172}\u{11BB}", - nfkc: "\u{C980}", - nfkd: "\u{110C}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{C981}", - nfc: "\u{C981}", - nfd: "\u{110C}\u{1172}\u{11BC}", - nfkc: "\u{C981}", - nfkd: "\u{110C}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{C982}", - nfc: "\u{C982}", - nfd: "\u{110C}\u{1172}\u{11BD}", - nfkc: "\u{C982}", - nfkd: "\u{110C}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{C983}", - nfc: "\u{C983}", - nfd: "\u{110C}\u{1172}\u{11BE}", - nfkc: "\u{C983}", - nfkd: "\u{110C}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{C984}", - nfc: "\u{C984}", - nfd: "\u{110C}\u{1172}\u{11BF}", - nfkc: "\u{C984}", - nfkd: "\u{110C}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{C985}", - nfc: "\u{C985}", - nfd: "\u{110C}\u{1172}\u{11C0}", - nfkc: "\u{C985}", - nfkd: "\u{110C}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{C986}", - nfc: "\u{C986}", - nfd: "\u{110C}\u{1172}\u{11C1}", - nfkc: "\u{C986}", - nfkd: "\u{110C}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{C987}", - nfc: "\u{C987}", - nfd: "\u{110C}\u{1172}\u{11C2}", - nfkc: "\u{C987}", - nfkd: "\u{110C}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{C988}", - nfc: "\u{C988}", - nfd: "\u{110C}\u{1173}", - nfkc: "\u{C988}", - nfkd: "\u{110C}\u{1173}", - }, - NormalizationTest { - source: "\u{C989}", - nfc: "\u{C989}", - nfd: "\u{110C}\u{1173}\u{11A8}", - nfkc: "\u{C989}", - nfkd: "\u{110C}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{C98A}", - nfc: "\u{C98A}", - nfd: "\u{110C}\u{1173}\u{11A9}", - nfkc: "\u{C98A}", - nfkd: "\u{110C}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{C98B}", - nfc: "\u{C98B}", - nfd: "\u{110C}\u{1173}\u{11AA}", - nfkc: "\u{C98B}", - nfkd: "\u{110C}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{C98C}", - nfc: "\u{C98C}", - nfd: "\u{110C}\u{1173}\u{11AB}", - nfkc: "\u{C98C}", - nfkd: "\u{110C}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{C98D}", - nfc: "\u{C98D}", - nfd: "\u{110C}\u{1173}\u{11AC}", - nfkc: "\u{C98D}", - nfkd: "\u{110C}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{C98E}", - nfc: "\u{C98E}", - nfd: "\u{110C}\u{1173}\u{11AD}", - nfkc: "\u{C98E}", - nfkd: "\u{110C}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{C98F}", - nfc: "\u{C98F}", - nfd: "\u{110C}\u{1173}\u{11AE}", - nfkc: "\u{C98F}", - nfkd: "\u{110C}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{C990}", - nfc: "\u{C990}", - nfd: "\u{110C}\u{1173}\u{11AF}", - nfkc: "\u{C990}", - nfkd: "\u{110C}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{C991}", - nfc: "\u{C991}", - nfd: "\u{110C}\u{1173}\u{11B0}", - nfkc: "\u{C991}", - nfkd: "\u{110C}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{C992}", - nfc: "\u{C992}", - nfd: "\u{110C}\u{1173}\u{11B1}", - nfkc: "\u{C992}", - nfkd: "\u{110C}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{C993}", - nfc: "\u{C993}", - nfd: "\u{110C}\u{1173}\u{11B2}", - nfkc: "\u{C993}", - nfkd: "\u{110C}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{C994}", - nfc: "\u{C994}", - nfd: "\u{110C}\u{1173}\u{11B3}", - nfkc: "\u{C994}", - nfkd: "\u{110C}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{C995}", - nfc: "\u{C995}", - nfd: "\u{110C}\u{1173}\u{11B4}", - nfkc: "\u{C995}", - nfkd: "\u{110C}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{C996}", - nfc: "\u{C996}", - nfd: "\u{110C}\u{1173}\u{11B5}", - nfkc: "\u{C996}", - nfkd: "\u{110C}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{C997}", - nfc: "\u{C997}", - nfd: "\u{110C}\u{1173}\u{11B6}", - nfkc: "\u{C997}", - nfkd: "\u{110C}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{C998}", - nfc: "\u{C998}", - nfd: "\u{110C}\u{1173}\u{11B7}", - nfkc: "\u{C998}", - nfkd: "\u{110C}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{C999}", - nfc: "\u{C999}", - nfd: "\u{110C}\u{1173}\u{11B8}", - nfkc: "\u{C999}", - nfkd: "\u{110C}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{C99A}", - nfc: "\u{C99A}", - nfd: "\u{110C}\u{1173}\u{11B9}", - nfkc: "\u{C99A}", - nfkd: "\u{110C}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{C99B}", - nfc: "\u{C99B}", - nfd: "\u{110C}\u{1173}\u{11BA}", - nfkc: "\u{C99B}", - nfkd: "\u{110C}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{C99C}", - nfc: "\u{C99C}", - nfd: "\u{110C}\u{1173}\u{11BB}", - nfkc: "\u{C99C}", - nfkd: "\u{110C}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{C99D}", - nfc: "\u{C99D}", - nfd: "\u{110C}\u{1173}\u{11BC}", - nfkc: "\u{C99D}", - nfkd: "\u{110C}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{C99E}", - nfc: "\u{C99E}", - nfd: "\u{110C}\u{1173}\u{11BD}", - nfkc: "\u{C99E}", - nfkd: "\u{110C}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{C99F}", - nfc: "\u{C99F}", - nfd: "\u{110C}\u{1173}\u{11BE}", - nfkc: "\u{C99F}", - nfkd: "\u{110C}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{C9A0}", - nfc: "\u{C9A0}", - nfd: "\u{110C}\u{1173}\u{11BF}", - nfkc: "\u{C9A0}", - nfkd: "\u{110C}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{C9A1}", - nfc: "\u{C9A1}", - nfd: "\u{110C}\u{1173}\u{11C0}", - nfkc: "\u{C9A1}", - nfkd: "\u{110C}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{C9A2}", - nfc: "\u{C9A2}", - nfd: "\u{110C}\u{1173}\u{11C1}", - nfkc: "\u{C9A2}", - nfkd: "\u{110C}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{C9A3}", - nfc: "\u{C9A3}", - nfd: "\u{110C}\u{1173}\u{11C2}", - nfkc: "\u{C9A3}", - nfkd: "\u{110C}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{C9A4}", - nfc: "\u{C9A4}", - nfd: "\u{110C}\u{1174}", - nfkc: "\u{C9A4}", - nfkd: "\u{110C}\u{1174}", - }, - NormalizationTest { - source: "\u{C9A5}", - nfc: "\u{C9A5}", - nfd: "\u{110C}\u{1174}\u{11A8}", - nfkc: "\u{C9A5}", - nfkd: "\u{110C}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{C9A6}", - nfc: "\u{C9A6}", - nfd: "\u{110C}\u{1174}\u{11A9}", - nfkc: "\u{C9A6}", - nfkd: "\u{110C}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{C9A7}", - nfc: "\u{C9A7}", - nfd: "\u{110C}\u{1174}\u{11AA}", - nfkc: "\u{C9A7}", - nfkd: "\u{110C}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{C9A8}", - nfc: "\u{C9A8}", - nfd: "\u{110C}\u{1174}\u{11AB}", - nfkc: "\u{C9A8}", - nfkd: "\u{110C}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{C9A9}", - nfc: "\u{C9A9}", - nfd: "\u{110C}\u{1174}\u{11AC}", - nfkc: "\u{C9A9}", - nfkd: "\u{110C}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{C9AA}", - nfc: "\u{C9AA}", - nfd: "\u{110C}\u{1174}\u{11AD}", - nfkc: "\u{C9AA}", - nfkd: "\u{110C}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{C9AB}", - nfc: "\u{C9AB}", - nfd: "\u{110C}\u{1174}\u{11AE}", - nfkc: "\u{C9AB}", - nfkd: "\u{110C}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{C9AC}", - nfc: "\u{C9AC}", - nfd: "\u{110C}\u{1174}\u{11AF}", - nfkc: "\u{C9AC}", - nfkd: "\u{110C}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{C9AD}", - nfc: "\u{C9AD}", - nfd: "\u{110C}\u{1174}\u{11B0}", - nfkc: "\u{C9AD}", - nfkd: "\u{110C}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{C9AE}", - nfc: "\u{C9AE}", - nfd: "\u{110C}\u{1174}\u{11B1}", - nfkc: "\u{C9AE}", - nfkd: "\u{110C}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{C9AF}", - nfc: "\u{C9AF}", - nfd: "\u{110C}\u{1174}\u{11B2}", - nfkc: "\u{C9AF}", - nfkd: "\u{110C}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{C9B0}", - nfc: "\u{C9B0}", - nfd: "\u{110C}\u{1174}\u{11B3}", - nfkc: "\u{C9B0}", - nfkd: "\u{110C}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{C9B1}", - nfc: "\u{C9B1}", - nfd: "\u{110C}\u{1174}\u{11B4}", - nfkc: "\u{C9B1}", - nfkd: "\u{110C}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{C9B2}", - nfc: "\u{C9B2}", - nfd: "\u{110C}\u{1174}\u{11B5}", - nfkc: "\u{C9B2}", - nfkd: "\u{110C}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{C9B3}", - nfc: "\u{C9B3}", - nfd: "\u{110C}\u{1174}\u{11B6}", - nfkc: "\u{C9B3}", - nfkd: "\u{110C}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{C9B4}", - nfc: "\u{C9B4}", - nfd: "\u{110C}\u{1174}\u{11B7}", - nfkc: "\u{C9B4}", - nfkd: "\u{110C}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{C9B5}", - nfc: "\u{C9B5}", - nfd: "\u{110C}\u{1174}\u{11B8}", - nfkc: "\u{C9B5}", - nfkd: "\u{110C}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{C9B6}", - nfc: "\u{C9B6}", - nfd: "\u{110C}\u{1174}\u{11B9}", - nfkc: "\u{C9B6}", - nfkd: "\u{110C}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{C9B7}", - nfc: "\u{C9B7}", - nfd: "\u{110C}\u{1174}\u{11BA}", - nfkc: "\u{C9B7}", - nfkd: "\u{110C}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{C9B8}", - nfc: "\u{C9B8}", - nfd: "\u{110C}\u{1174}\u{11BB}", - nfkc: "\u{C9B8}", - nfkd: "\u{110C}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{C9B9}", - nfc: "\u{C9B9}", - nfd: "\u{110C}\u{1174}\u{11BC}", - nfkc: "\u{C9B9}", - nfkd: "\u{110C}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{C9BA}", - nfc: "\u{C9BA}", - nfd: "\u{110C}\u{1174}\u{11BD}", - nfkc: "\u{C9BA}", - nfkd: "\u{110C}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{C9BB}", - nfc: "\u{C9BB}", - nfd: "\u{110C}\u{1174}\u{11BE}", - nfkc: "\u{C9BB}", - nfkd: "\u{110C}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{C9BC}", - nfc: "\u{C9BC}", - nfd: "\u{110C}\u{1174}\u{11BF}", - nfkc: "\u{C9BC}", - nfkd: "\u{110C}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{C9BD}", - nfc: "\u{C9BD}", - nfd: "\u{110C}\u{1174}\u{11C0}", - nfkc: "\u{C9BD}", - nfkd: "\u{110C}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{C9BE}", - nfc: "\u{C9BE}", - nfd: "\u{110C}\u{1174}\u{11C1}", - nfkc: "\u{C9BE}", - nfkd: "\u{110C}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{C9BF}", - nfc: "\u{C9BF}", - nfd: "\u{110C}\u{1174}\u{11C2}", - nfkc: "\u{C9BF}", - nfkd: "\u{110C}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{C9C0}", - nfc: "\u{C9C0}", - nfd: "\u{110C}\u{1175}", - nfkc: "\u{C9C0}", - nfkd: "\u{110C}\u{1175}", - }, - NormalizationTest { - source: "\u{C9C1}", - nfc: "\u{C9C1}", - nfd: "\u{110C}\u{1175}\u{11A8}", - nfkc: "\u{C9C1}", - nfkd: "\u{110C}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{C9C2}", - nfc: "\u{C9C2}", - nfd: "\u{110C}\u{1175}\u{11A9}", - nfkc: "\u{C9C2}", - nfkd: "\u{110C}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{C9C3}", - nfc: "\u{C9C3}", - nfd: "\u{110C}\u{1175}\u{11AA}", - nfkc: "\u{C9C3}", - nfkd: "\u{110C}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{C9C4}", - nfc: "\u{C9C4}", - nfd: "\u{110C}\u{1175}\u{11AB}", - nfkc: "\u{C9C4}", - nfkd: "\u{110C}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{C9C5}", - nfc: "\u{C9C5}", - nfd: "\u{110C}\u{1175}\u{11AC}", - nfkc: "\u{C9C5}", - nfkd: "\u{110C}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{C9C6}", - nfc: "\u{C9C6}", - nfd: "\u{110C}\u{1175}\u{11AD}", - nfkc: "\u{C9C6}", - nfkd: "\u{110C}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{C9C7}", - nfc: "\u{C9C7}", - nfd: "\u{110C}\u{1175}\u{11AE}", - nfkc: "\u{C9C7}", - nfkd: "\u{110C}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{C9C8}", - nfc: "\u{C9C8}", - nfd: "\u{110C}\u{1175}\u{11AF}", - nfkc: "\u{C9C8}", - nfkd: "\u{110C}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{C9C9}", - nfc: "\u{C9C9}", - nfd: "\u{110C}\u{1175}\u{11B0}", - nfkc: "\u{C9C9}", - nfkd: "\u{110C}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{C9CA}", - nfc: "\u{C9CA}", - nfd: "\u{110C}\u{1175}\u{11B1}", - nfkc: "\u{C9CA}", - nfkd: "\u{110C}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{C9CB}", - nfc: "\u{C9CB}", - nfd: "\u{110C}\u{1175}\u{11B2}", - nfkc: "\u{C9CB}", - nfkd: "\u{110C}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{C9CC}", - nfc: "\u{C9CC}", - nfd: "\u{110C}\u{1175}\u{11B3}", - nfkc: "\u{C9CC}", - nfkd: "\u{110C}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{C9CD}", - nfc: "\u{C9CD}", - nfd: "\u{110C}\u{1175}\u{11B4}", - nfkc: "\u{C9CD}", - nfkd: "\u{110C}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{C9CE}", - nfc: "\u{C9CE}", - nfd: "\u{110C}\u{1175}\u{11B5}", - nfkc: "\u{C9CE}", - nfkd: "\u{110C}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{C9CF}", - nfc: "\u{C9CF}", - nfd: "\u{110C}\u{1175}\u{11B6}", - nfkc: "\u{C9CF}", - nfkd: "\u{110C}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{C9D0}", - nfc: "\u{C9D0}", - nfd: "\u{110C}\u{1175}\u{11B7}", - nfkc: "\u{C9D0}", - nfkd: "\u{110C}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{C9D1}", - nfc: "\u{C9D1}", - nfd: "\u{110C}\u{1175}\u{11B8}", - nfkc: "\u{C9D1}", - nfkd: "\u{110C}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{C9D2}", - nfc: "\u{C9D2}", - nfd: "\u{110C}\u{1175}\u{11B9}", - nfkc: "\u{C9D2}", - nfkd: "\u{110C}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{C9D3}", - nfc: "\u{C9D3}", - nfd: "\u{110C}\u{1175}\u{11BA}", - nfkc: "\u{C9D3}", - nfkd: "\u{110C}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{C9D4}", - nfc: "\u{C9D4}", - nfd: "\u{110C}\u{1175}\u{11BB}", - nfkc: "\u{C9D4}", - nfkd: "\u{110C}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{C9D5}", - nfc: "\u{C9D5}", - nfd: "\u{110C}\u{1175}\u{11BC}", - nfkc: "\u{C9D5}", - nfkd: "\u{110C}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{C9D6}", - nfc: "\u{C9D6}", - nfd: "\u{110C}\u{1175}\u{11BD}", - nfkc: "\u{C9D6}", - nfkd: "\u{110C}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{C9D7}", - nfc: "\u{C9D7}", - nfd: "\u{110C}\u{1175}\u{11BE}", - nfkc: "\u{C9D7}", - nfkd: "\u{110C}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{C9D8}", - nfc: "\u{C9D8}", - nfd: "\u{110C}\u{1175}\u{11BF}", - nfkc: "\u{C9D8}", - nfkd: "\u{110C}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{C9D9}", - nfc: "\u{C9D9}", - nfd: "\u{110C}\u{1175}\u{11C0}", - nfkc: "\u{C9D9}", - nfkd: "\u{110C}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{C9DA}", - nfc: "\u{C9DA}", - nfd: "\u{110C}\u{1175}\u{11C1}", - nfkc: "\u{C9DA}", - nfkd: "\u{110C}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{C9DB}", - nfc: "\u{C9DB}", - nfd: "\u{110C}\u{1175}\u{11C2}", - nfkc: "\u{C9DB}", - nfkd: "\u{110C}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{C9DC}", - nfc: "\u{C9DC}", - nfd: "\u{110D}\u{1161}", - nfkc: "\u{C9DC}", - nfkd: "\u{110D}\u{1161}", - }, - NormalizationTest { - source: "\u{C9DD}", - nfc: "\u{C9DD}", - nfd: "\u{110D}\u{1161}\u{11A8}", - nfkc: "\u{C9DD}", - nfkd: "\u{110D}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{C9DE}", - nfc: "\u{C9DE}", - nfd: "\u{110D}\u{1161}\u{11A9}", - nfkc: "\u{C9DE}", - nfkd: "\u{110D}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{C9DF}", - nfc: "\u{C9DF}", - nfd: "\u{110D}\u{1161}\u{11AA}", - nfkc: "\u{C9DF}", - nfkd: "\u{110D}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{C9E0}", - nfc: "\u{C9E0}", - nfd: "\u{110D}\u{1161}\u{11AB}", - nfkc: "\u{C9E0}", - nfkd: "\u{110D}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{C9E1}", - nfc: "\u{C9E1}", - nfd: "\u{110D}\u{1161}\u{11AC}", - nfkc: "\u{C9E1}", - nfkd: "\u{110D}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{C9E2}", - nfc: "\u{C9E2}", - nfd: "\u{110D}\u{1161}\u{11AD}", - nfkc: "\u{C9E2}", - nfkd: "\u{110D}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{C9E3}", - nfc: "\u{C9E3}", - nfd: "\u{110D}\u{1161}\u{11AE}", - nfkc: "\u{C9E3}", - nfkd: "\u{110D}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{C9E4}", - nfc: "\u{C9E4}", - nfd: "\u{110D}\u{1161}\u{11AF}", - nfkc: "\u{C9E4}", - nfkd: "\u{110D}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{C9E5}", - nfc: "\u{C9E5}", - nfd: "\u{110D}\u{1161}\u{11B0}", - nfkc: "\u{C9E5}", - nfkd: "\u{110D}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{C9E6}", - nfc: "\u{C9E6}", - nfd: "\u{110D}\u{1161}\u{11B1}", - nfkc: "\u{C9E6}", - nfkd: "\u{110D}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{C9E7}", - nfc: "\u{C9E7}", - nfd: "\u{110D}\u{1161}\u{11B2}", - nfkc: "\u{C9E7}", - nfkd: "\u{110D}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{C9E8}", - nfc: "\u{C9E8}", - nfd: "\u{110D}\u{1161}\u{11B3}", - nfkc: "\u{C9E8}", - nfkd: "\u{110D}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{C9E9}", - nfc: "\u{C9E9}", - nfd: "\u{110D}\u{1161}\u{11B4}", - nfkc: "\u{C9E9}", - nfkd: "\u{110D}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{C9EA}", - nfc: "\u{C9EA}", - nfd: "\u{110D}\u{1161}\u{11B5}", - nfkc: "\u{C9EA}", - nfkd: "\u{110D}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{C9EB}", - nfc: "\u{C9EB}", - nfd: "\u{110D}\u{1161}\u{11B6}", - nfkc: "\u{C9EB}", - nfkd: "\u{110D}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{C9EC}", - nfc: "\u{C9EC}", - nfd: "\u{110D}\u{1161}\u{11B7}", - nfkc: "\u{C9EC}", - nfkd: "\u{110D}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{C9ED}", - nfc: "\u{C9ED}", - nfd: "\u{110D}\u{1161}\u{11B8}", - nfkc: "\u{C9ED}", - nfkd: "\u{110D}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{C9EE}", - nfc: "\u{C9EE}", - nfd: "\u{110D}\u{1161}\u{11B9}", - nfkc: "\u{C9EE}", - nfkd: "\u{110D}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{C9EF}", - nfc: "\u{C9EF}", - nfd: "\u{110D}\u{1161}\u{11BA}", - nfkc: "\u{C9EF}", - nfkd: "\u{110D}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{C9F0}", - nfc: "\u{C9F0}", - nfd: "\u{110D}\u{1161}\u{11BB}", - nfkc: "\u{C9F0}", - nfkd: "\u{110D}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{C9F1}", - nfc: "\u{C9F1}", - nfd: "\u{110D}\u{1161}\u{11BC}", - nfkc: "\u{C9F1}", - nfkd: "\u{110D}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{C9F2}", - nfc: "\u{C9F2}", - nfd: "\u{110D}\u{1161}\u{11BD}", - nfkc: "\u{C9F2}", - nfkd: "\u{110D}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{C9F3}", - nfc: "\u{C9F3}", - nfd: "\u{110D}\u{1161}\u{11BE}", - nfkc: "\u{C9F3}", - nfkd: "\u{110D}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{C9F4}", - nfc: "\u{C9F4}", - nfd: "\u{110D}\u{1161}\u{11BF}", - nfkc: "\u{C9F4}", - nfkd: "\u{110D}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{C9F5}", - nfc: "\u{C9F5}", - nfd: "\u{110D}\u{1161}\u{11C0}", - nfkc: "\u{C9F5}", - nfkd: "\u{110D}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{C9F6}", - nfc: "\u{C9F6}", - nfd: "\u{110D}\u{1161}\u{11C1}", - nfkc: "\u{C9F6}", - nfkd: "\u{110D}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{C9F7}", - nfc: "\u{C9F7}", - nfd: "\u{110D}\u{1161}\u{11C2}", - nfkc: "\u{C9F7}", - nfkd: "\u{110D}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{C9F8}", - nfc: "\u{C9F8}", - nfd: "\u{110D}\u{1162}", - nfkc: "\u{C9F8}", - nfkd: "\u{110D}\u{1162}", - }, - NormalizationTest { - source: "\u{C9F9}", - nfc: "\u{C9F9}", - nfd: "\u{110D}\u{1162}\u{11A8}", - nfkc: "\u{C9F9}", - nfkd: "\u{110D}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{C9FA}", - nfc: "\u{C9FA}", - nfd: "\u{110D}\u{1162}\u{11A9}", - nfkc: "\u{C9FA}", - nfkd: "\u{110D}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{C9FB}", - nfc: "\u{C9FB}", - nfd: "\u{110D}\u{1162}\u{11AA}", - nfkc: "\u{C9FB}", - nfkd: "\u{110D}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{C9FC}", - nfc: "\u{C9FC}", - nfd: "\u{110D}\u{1162}\u{11AB}", - nfkc: "\u{C9FC}", - nfkd: "\u{110D}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{C9FD}", - nfc: "\u{C9FD}", - nfd: "\u{110D}\u{1162}\u{11AC}", - nfkc: "\u{C9FD}", - nfkd: "\u{110D}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{C9FE}", - nfc: "\u{C9FE}", - nfd: "\u{110D}\u{1162}\u{11AD}", - nfkc: "\u{C9FE}", - nfkd: "\u{110D}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{C9FF}", - nfc: "\u{C9FF}", - nfd: "\u{110D}\u{1162}\u{11AE}", - nfkc: "\u{C9FF}", - nfkd: "\u{110D}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{CA00}", - nfc: "\u{CA00}", - nfd: "\u{110D}\u{1162}\u{11AF}", - nfkc: "\u{CA00}", - nfkd: "\u{110D}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{CA01}", - nfc: "\u{CA01}", - nfd: "\u{110D}\u{1162}\u{11B0}", - nfkc: "\u{CA01}", - nfkd: "\u{110D}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{CA02}", - nfc: "\u{CA02}", - nfd: "\u{110D}\u{1162}\u{11B1}", - nfkc: "\u{CA02}", - nfkd: "\u{110D}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{CA03}", - nfc: "\u{CA03}", - nfd: "\u{110D}\u{1162}\u{11B2}", - nfkc: "\u{CA03}", - nfkd: "\u{110D}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{CA04}", - nfc: "\u{CA04}", - nfd: "\u{110D}\u{1162}\u{11B3}", - nfkc: "\u{CA04}", - nfkd: "\u{110D}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{CA05}", - nfc: "\u{CA05}", - nfd: "\u{110D}\u{1162}\u{11B4}", - nfkc: "\u{CA05}", - nfkd: "\u{110D}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{CA06}", - nfc: "\u{CA06}", - nfd: "\u{110D}\u{1162}\u{11B5}", - nfkc: "\u{CA06}", - nfkd: "\u{110D}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{CA07}", - nfc: "\u{CA07}", - nfd: "\u{110D}\u{1162}\u{11B6}", - nfkc: "\u{CA07}", - nfkd: "\u{110D}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{CA08}", - nfc: "\u{CA08}", - nfd: "\u{110D}\u{1162}\u{11B7}", - nfkc: "\u{CA08}", - nfkd: "\u{110D}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{CA09}", - nfc: "\u{CA09}", - nfd: "\u{110D}\u{1162}\u{11B8}", - nfkc: "\u{CA09}", - nfkd: "\u{110D}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{CA0A}", - nfc: "\u{CA0A}", - nfd: "\u{110D}\u{1162}\u{11B9}", - nfkc: "\u{CA0A}", - nfkd: "\u{110D}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{CA0B}", - nfc: "\u{CA0B}", - nfd: "\u{110D}\u{1162}\u{11BA}", - nfkc: "\u{CA0B}", - nfkd: "\u{110D}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{CA0C}", - nfc: "\u{CA0C}", - nfd: "\u{110D}\u{1162}\u{11BB}", - nfkc: "\u{CA0C}", - nfkd: "\u{110D}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{CA0D}", - nfc: "\u{CA0D}", - nfd: "\u{110D}\u{1162}\u{11BC}", - nfkc: "\u{CA0D}", - nfkd: "\u{110D}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{CA0E}", - nfc: "\u{CA0E}", - nfd: "\u{110D}\u{1162}\u{11BD}", - nfkc: "\u{CA0E}", - nfkd: "\u{110D}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{CA0F}", - nfc: "\u{CA0F}", - nfd: "\u{110D}\u{1162}\u{11BE}", - nfkc: "\u{CA0F}", - nfkd: "\u{110D}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{CA10}", - nfc: "\u{CA10}", - nfd: "\u{110D}\u{1162}\u{11BF}", - nfkc: "\u{CA10}", - nfkd: "\u{110D}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{CA11}", - nfc: "\u{CA11}", - nfd: "\u{110D}\u{1162}\u{11C0}", - nfkc: "\u{CA11}", - nfkd: "\u{110D}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{CA12}", - nfc: "\u{CA12}", - nfd: "\u{110D}\u{1162}\u{11C1}", - nfkc: "\u{CA12}", - nfkd: "\u{110D}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{CA13}", - nfc: "\u{CA13}", - nfd: "\u{110D}\u{1162}\u{11C2}", - nfkc: "\u{CA13}", - nfkd: "\u{110D}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{CA14}", - nfc: "\u{CA14}", - nfd: "\u{110D}\u{1163}", - nfkc: "\u{CA14}", - nfkd: "\u{110D}\u{1163}", - }, - NormalizationTest { - source: "\u{CA15}", - nfc: "\u{CA15}", - nfd: "\u{110D}\u{1163}\u{11A8}", - nfkc: "\u{CA15}", - nfkd: "\u{110D}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{CA16}", - nfc: "\u{CA16}", - nfd: "\u{110D}\u{1163}\u{11A9}", - nfkc: "\u{CA16}", - nfkd: "\u{110D}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{CA17}", - nfc: "\u{CA17}", - nfd: "\u{110D}\u{1163}\u{11AA}", - nfkc: "\u{CA17}", - nfkd: "\u{110D}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{CA18}", - nfc: "\u{CA18}", - nfd: "\u{110D}\u{1163}\u{11AB}", - nfkc: "\u{CA18}", - nfkd: "\u{110D}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{CA19}", - nfc: "\u{CA19}", - nfd: "\u{110D}\u{1163}\u{11AC}", - nfkc: "\u{CA19}", - nfkd: "\u{110D}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{CA1A}", - nfc: "\u{CA1A}", - nfd: "\u{110D}\u{1163}\u{11AD}", - nfkc: "\u{CA1A}", - nfkd: "\u{110D}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{CA1B}", - nfc: "\u{CA1B}", - nfd: "\u{110D}\u{1163}\u{11AE}", - nfkc: "\u{CA1B}", - nfkd: "\u{110D}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{CA1C}", - nfc: "\u{CA1C}", - nfd: "\u{110D}\u{1163}\u{11AF}", - nfkc: "\u{CA1C}", - nfkd: "\u{110D}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{CA1D}", - nfc: "\u{CA1D}", - nfd: "\u{110D}\u{1163}\u{11B0}", - nfkc: "\u{CA1D}", - nfkd: "\u{110D}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{CA1E}", - nfc: "\u{CA1E}", - nfd: "\u{110D}\u{1163}\u{11B1}", - nfkc: "\u{CA1E}", - nfkd: "\u{110D}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{CA1F}", - nfc: "\u{CA1F}", - nfd: "\u{110D}\u{1163}\u{11B2}", - nfkc: "\u{CA1F}", - nfkd: "\u{110D}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{CA20}", - nfc: "\u{CA20}", - nfd: "\u{110D}\u{1163}\u{11B3}", - nfkc: "\u{CA20}", - nfkd: "\u{110D}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{CA21}", - nfc: "\u{CA21}", - nfd: "\u{110D}\u{1163}\u{11B4}", - nfkc: "\u{CA21}", - nfkd: "\u{110D}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{CA22}", - nfc: "\u{CA22}", - nfd: "\u{110D}\u{1163}\u{11B5}", - nfkc: "\u{CA22}", - nfkd: "\u{110D}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{CA23}", - nfc: "\u{CA23}", - nfd: "\u{110D}\u{1163}\u{11B6}", - nfkc: "\u{CA23}", - nfkd: "\u{110D}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{CA24}", - nfc: "\u{CA24}", - nfd: "\u{110D}\u{1163}\u{11B7}", - nfkc: "\u{CA24}", - nfkd: "\u{110D}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{CA25}", - nfc: "\u{CA25}", - nfd: "\u{110D}\u{1163}\u{11B8}", - nfkc: "\u{CA25}", - nfkd: "\u{110D}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{CA26}", - nfc: "\u{CA26}", - nfd: "\u{110D}\u{1163}\u{11B9}", - nfkc: "\u{CA26}", - nfkd: "\u{110D}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{CA27}", - nfc: "\u{CA27}", - nfd: "\u{110D}\u{1163}\u{11BA}", - nfkc: "\u{CA27}", - nfkd: "\u{110D}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{CA28}", - nfc: "\u{CA28}", - nfd: "\u{110D}\u{1163}\u{11BB}", - nfkc: "\u{CA28}", - nfkd: "\u{110D}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{CA29}", - nfc: "\u{CA29}", - nfd: "\u{110D}\u{1163}\u{11BC}", - nfkc: "\u{CA29}", - nfkd: "\u{110D}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{CA2A}", - nfc: "\u{CA2A}", - nfd: "\u{110D}\u{1163}\u{11BD}", - nfkc: "\u{CA2A}", - nfkd: "\u{110D}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{CA2B}", - nfc: "\u{CA2B}", - nfd: "\u{110D}\u{1163}\u{11BE}", - nfkc: "\u{CA2B}", - nfkd: "\u{110D}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{CA2C}", - nfc: "\u{CA2C}", - nfd: "\u{110D}\u{1163}\u{11BF}", - nfkc: "\u{CA2C}", - nfkd: "\u{110D}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{CA2D}", - nfc: "\u{CA2D}", - nfd: "\u{110D}\u{1163}\u{11C0}", - nfkc: "\u{CA2D}", - nfkd: "\u{110D}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{CA2E}", - nfc: "\u{CA2E}", - nfd: "\u{110D}\u{1163}\u{11C1}", - nfkc: "\u{CA2E}", - nfkd: "\u{110D}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{CA2F}", - nfc: "\u{CA2F}", - nfd: "\u{110D}\u{1163}\u{11C2}", - nfkc: "\u{CA2F}", - nfkd: "\u{110D}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{CA30}", - nfc: "\u{CA30}", - nfd: "\u{110D}\u{1164}", - nfkc: "\u{CA30}", - nfkd: "\u{110D}\u{1164}", - }, - NormalizationTest { - source: "\u{CA31}", - nfc: "\u{CA31}", - nfd: "\u{110D}\u{1164}\u{11A8}", - nfkc: "\u{CA31}", - nfkd: "\u{110D}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{CA32}", - nfc: "\u{CA32}", - nfd: "\u{110D}\u{1164}\u{11A9}", - nfkc: "\u{CA32}", - nfkd: "\u{110D}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{CA33}", - nfc: "\u{CA33}", - nfd: "\u{110D}\u{1164}\u{11AA}", - nfkc: "\u{CA33}", - nfkd: "\u{110D}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{CA34}", - nfc: "\u{CA34}", - nfd: "\u{110D}\u{1164}\u{11AB}", - nfkc: "\u{CA34}", - nfkd: "\u{110D}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{CA35}", - nfc: "\u{CA35}", - nfd: "\u{110D}\u{1164}\u{11AC}", - nfkc: "\u{CA35}", - nfkd: "\u{110D}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{CA36}", - nfc: "\u{CA36}", - nfd: "\u{110D}\u{1164}\u{11AD}", - nfkc: "\u{CA36}", - nfkd: "\u{110D}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{CA37}", - nfc: "\u{CA37}", - nfd: "\u{110D}\u{1164}\u{11AE}", - nfkc: "\u{CA37}", - nfkd: "\u{110D}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{CA38}", - nfc: "\u{CA38}", - nfd: "\u{110D}\u{1164}\u{11AF}", - nfkc: "\u{CA38}", - nfkd: "\u{110D}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{CA39}", - nfc: "\u{CA39}", - nfd: "\u{110D}\u{1164}\u{11B0}", - nfkc: "\u{CA39}", - nfkd: "\u{110D}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{CA3A}", - nfc: "\u{CA3A}", - nfd: "\u{110D}\u{1164}\u{11B1}", - nfkc: "\u{CA3A}", - nfkd: "\u{110D}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{CA3B}", - nfc: "\u{CA3B}", - nfd: "\u{110D}\u{1164}\u{11B2}", - nfkc: "\u{CA3B}", - nfkd: "\u{110D}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{CA3C}", - nfc: "\u{CA3C}", - nfd: "\u{110D}\u{1164}\u{11B3}", - nfkc: "\u{CA3C}", - nfkd: "\u{110D}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{CA3D}", - nfc: "\u{CA3D}", - nfd: "\u{110D}\u{1164}\u{11B4}", - nfkc: "\u{CA3D}", - nfkd: "\u{110D}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{CA3E}", - nfc: "\u{CA3E}", - nfd: "\u{110D}\u{1164}\u{11B5}", - nfkc: "\u{CA3E}", - nfkd: "\u{110D}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{CA3F}", - nfc: "\u{CA3F}", - nfd: "\u{110D}\u{1164}\u{11B6}", - nfkc: "\u{CA3F}", - nfkd: "\u{110D}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{CA40}", - nfc: "\u{CA40}", - nfd: "\u{110D}\u{1164}\u{11B7}", - nfkc: "\u{CA40}", - nfkd: "\u{110D}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{CA41}", - nfc: "\u{CA41}", - nfd: "\u{110D}\u{1164}\u{11B8}", - nfkc: "\u{CA41}", - nfkd: "\u{110D}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{CA42}", - nfc: "\u{CA42}", - nfd: "\u{110D}\u{1164}\u{11B9}", - nfkc: "\u{CA42}", - nfkd: "\u{110D}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{CA43}", - nfc: "\u{CA43}", - nfd: "\u{110D}\u{1164}\u{11BA}", - nfkc: "\u{CA43}", - nfkd: "\u{110D}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{CA44}", - nfc: "\u{CA44}", - nfd: "\u{110D}\u{1164}\u{11BB}", - nfkc: "\u{CA44}", - nfkd: "\u{110D}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{CA45}", - nfc: "\u{CA45}", - nfd: "\u{110D}\u{1164}\u{11BC}", - nfkc: "\u{CA45}", - nfkd: "\u{110D}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{CA46}", - nfc: "\u{CA46}", - nfd: "\u{110D}\u{1164}\u{11BD}", - nfkc: "\u{CA46}", - nfkd: "\u{110D}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{CA47}", - nfc: "\u{CA47}", - nfd: "\u{110D}\u{1164}\u{11BE}", - nfkc: "\u{CA47}", - nfkd: "\u{110D}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{CA48}", - nfc: "\u{CA48}", - nfd: "\u{110D}\u{1164}\u{11BF}", - nfkc: "\u{CA48}", - nfkd: "\u{110D}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{CA49}", - nfc: "\u{CA49}", - nfd: "\u{110D}\u{1164}\u{11C0}", - nfkc: "\u{CA49}", - nfkd: "\u{110D}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{CA4A}", - nfc: "\u{CA4A}", - nfd: "\u{110D}\u{1164}\u{11C1}", - nfkc: "\u{CA4A}", - nfkd: "\u{110D}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{CA4B}", - nfc: "\u{CA4B}", - nfd: "\u{110D}\u{1164}\u{11C2}", - nfkc: "\u{CA4B}", - nfkd: "\u{110D}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{CA4C}", - nfc: "\u{CA4C}", - nfd: "\u{110D}\u{1165}", - nfkc: "\u{CA4C}", - nfkd: "\u{110D}\u{1165}", - }, - NormalizationTest { - source: "\u{CA4D}", - nfc: "\u{CA4D}", - nfd: "\u{110D}\u{1165}\u{11A8}", - nfkc: "\u{CA4D}", - nfkd: "\u{110D}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{CA4E}", - nfc: "\u{CA4E}", - nfd: "\u{110D}\u{1165}\u{11A9}", - nfkc: "\u{CA4E}", - nfkd: "\u{110D}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{CA4F}", - nfc: "\u{CA4F}", - nfd: "\u{110D}\u{1165}\u{11AA}", - nfkc: "\u{CA4F}", - nfkd: "\u{110D}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{CA50}", - nfc: "\u{CA50}", - nfd: "\u{110D}\u{1165}\u{11AB}", - nfkc: "\u{CA50}", - nfkd: "\u{110D}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{CA51}", - nfc: "\u{CA51}", - nfd: "\u{110D}\u{1165}\u{11AC}", - nfkc: "\u{CA51}", - nfkd: "\u{110D}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{CA52}", - nfc: "\u{CA52}", - nfd: "\u{110D}\u{1165}\u{11AD}", - nfkc: "\u{CA52}", - nfkd: "\u{110D}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{CA53}", - nfc: "\u{CA53}", - nfd: "\u{110D}\u{1165}\u{11AE}", - nfkc: "\u{CA53}", - nfkd: "\u{110D}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{CA54}", - nfc: "\u{CA54}", - nfd: "\u{110D}\u{1165}\u{11AF}", - nfkc: "\u{CA54}", - nfkd: "\u{110D}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{CA55}", - nfc: "\u{CA55}", - nfd: "\u{110D}\u{1165}\u{11B0}", - nfkc: "\u{CA55}", - nfkd: "\u{110D}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{CA56}", - nfc: "\u{CA56}", - nfd: "\u{110D}\u{1165}\u{11B1}", - nfkc: "\u{CA56}", - nfkd: "\u{110D}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{CA57}", - nfc: "\u{CA57}", - nfd: "\u{110D}\u{1165}\u{11B2}", - nfkc: "\u{CA57}", - nfkd: "\u{110D}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{CA58}", - nfc: "\u{CA58}", - nfd: "\u{110D}\u{1165}\u{11B3}", - nfkc: "\u{CA58}", - nfkd: "\u{110D}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{CA59}", - nfc: "\u{CA59}", - nfd: "\u{110D}\u{1165}\u{11B4}", - nfkc: "\u{CA59}", - nfkd: "\u{110D}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{CA5A}", - nfc: "\u{CA5A}", - nfd: "\u{110D}\u{1165}\u{11B5}", - nfkc: "\u{CA5A}", - nfkd: "\u{110D}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{CA5B}", - nfc: "\u{CA5B}", - nfd: "\u{110D}\u{1165}\u{11B6}", - nfkc: "\u{CA5B}", - nfkd: "\u{110D}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{CA5C}", - nfc: "\u{CA5C}", - nfd: "\u{110D}\u{1165}\u{11B7}", - nfkc: "\u{CA5C}", - nfkd: "\u{110D}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{CA5D}", - nfc: "\u{CA5D}", - nfd: "\u{110D}\u{1165}\u{11B8}", - nfkc: "\u{CA5D}", - nfkd: "\u{110D}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{CA5E}", - nfc: "\u{CA5E}", - nfd: "\u{110D}\u{1165}\u{11B9}", - nfkc: "\u{CA5E}", - nfkd: "\u{110D}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{CA5F}", - nfc: "\u{CA5F}", - nfd: "\u{110D}\u{1165}\u{11BA}", - nfkc: "\u{CA5F}", - nfkd: "\u{110D}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{CA60}", - nfc: "\u{CA60}", - nfd: "\u{110D}\u{1165}\u{11BB}", - nfkc: "\u{CA60}", - nfkd: "\u{110D}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{CA61}", - nfc: "\u{CA61}", - nfd: "\u{110D}\u{1165}\u{11BC}", - nfkc: "\u{CA61}", - nfkd: "\u{110D}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{CA62}", - nfc: "\u{CA62}", - nfd: "\u{110D}\u{1165}\u{11BD}", - nfkc: "\u{CA62}", - nfkd: "\u{110D}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{CA63}", - nfc: "\u{CA63}", - nfd: "\u{110D}\u{1165}\u{11BE}", - nfkc: "\u{CA63}", - nfkd: "\u{110D}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{CA64}", - nfc: "\u{CA64}", - nfd: "\u{110D}\u{1165}\u{11BF}", - nfkc: "\u{CA64}", - nfkd: "\u{110D}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{CA65}", - nfc: "\u{CA65}", - nfd: "\u{110D}\u{1165}\u{11C0}", - nfkc: "\u{CA65}", - nfkd: "\u{110D}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{CA66}", - nfc: "\u{CA66}", - nfd: "\u{110D}\u{1165}\u{11C1}", - nfkc: "\u{CA66}", - nfkd: "\u{110D}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{CA67}", - nfc: "\u{CA67}", - nfd: "\u{110D}\u{1165}\u{11C2}", - nfkc: "\u{CA67}", - nfkd: "\u{110D}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{CA68}", - nfc: "\u{CA68}", - nfd: "\u{110D}\u{1166}", - nfkc: "\u{CA68}", - nfkd: "\u{110D}\u{1166}", - }, - NormalizationTest { - source: "\u{CA69}", - nfc: "\u{CA69}", - nfd: "\u{110D}\u{1166}\u{11A8}", - nfkc: "\u{CA69}", - nfkd: "\u{110D}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{CA6A}", - nfc: "\u{CA6A}", - nfd: "\u{110D}\u{1166}\u{11A9}", - nfkc: "\u{CA6A}", - nfkd: "\u{110D}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{CA6B}", - nfc: "\u{CA6B}", - nfd: "\u{110D}\u{1166}\u{11AA}", - nfkc: "\u{CA6B}", - nfkd: "\u{110D}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{CA6C}", - nfc: "\u{CA6C}", - nfd: "\u{110D}\u{1166}\u{11AB}", - nfkc: "\u{CA6C}", - nfkd: "\u{110D}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{CA6D}", - nfc: "\u{CA6D}", - nfd: "\u{110D}\u{1166}\u{11AC}", - nfkc: "\u{CA6D}", - nfkd: "\u{110D}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{CA6E}", - nfc: "\u{CA6E}", - nfd: "\u{110D}\u{1166}\u{11AD}", - nfkc: "\u{CA6E}", - nfkd: "\u{110D}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{CA6F}", - nfc: "\u{CA6F}", - nfd: "\u{110D}\u{1166}\u{11AE}", - nfkc: "\u{CA6F}", - nfkd: "\u{110D}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{CA70}", - nfc: "\u{CA70}", - nfd: "\u{110D}\u{1166}\u{11AF}", - nfkc: "\u{CA70}", - nfkd: "\u{110D}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{CA71}", - nfc: "\u{CA71}", - nfd: "\u{110D}\u{1166}\u{11B0}", - nfkc: "\u{CA71}", - nfkd: "\u{110D}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{CA72}", - nfc: "\u{CA72}", - nfd: "\u{110D}\u{1166}\u{11B1}", - nfkc: "\u{CA72}", - nfkd: "\u{110D}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{CA73}", - nfc: "\u{CA73}", - nfd: "\u{110D}\u{1166}\u{11B2}", - nfkc: "\u{CA73}", - nfkd: "\u{110D}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{CA74}", - nfc: "\u{CA74}", - nfd: "\u{110D}\u{1166}\u{11B3}", - nfkc: "\u{CA74}", - nfkd: "\u{110D}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{CA75}", - nfc: "\u{CA75}", - nfd: "\u{110D}\u{1166}\u{11B4}", - nfkc: "\u{CA75}", - nfkd: "\u{110D}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{CA76}", - nfc: "\u{CA76}", - nfd: "\u{110D}\u{1166}\u{11B5}", - nfkc: "\u{CA76}", - nfkd: "\u{110D}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{CA77}", - nfc: "\u{CA77}", - nfd: "\u{110D}\u{1166}\u{11B6}", - nfkc: "\u{CA77}", - nfkd: "\u{110D}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{CA78}", - nfc: "\u{CA78}", - nfd: "\u{110D}\u{1166}\u{11B7}", - nfkc: "\u{CA78}", - nfkd: "\u{110D}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{CA79}", - nfc: "\u{CA79}", - nfd: "\u{110D}\u{1166}\u{11B8}", - nfkc: "\u{CA79}", - nfkd: "\u{110D}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{CA7A}", - nfc: "\u{CA7A}", - nfd: "\u{110D}\u{1166}\u{11B9}", - nfkc: "\u{CA7A}", - nfkd: "\u{110D}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{CA7B}", - nfc: "\u{CA7B}", - nfd: "\u{110D}\u{1166}\u{11BA}", - nfkc: "\u{CA7B}", - nfkd: "\u{110D}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{CA7C}", - nfc: "\u{CA7C}", - nfd: "\u{110D}\u{1166}\u{11BB}", - nfkc: "\u{CA7C}", - nfkd: "\u{110D}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{CA7D}", - nfc: "\u{CA7D}", - nfd: "\u{110D}\u{1166}\u{11BC}", - nfkc: "\u{CA7D}", - nfkd: "\u{110D}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{CA7E}", - nfc: "\u{CA7E}", - nfd: "\u{110D}\u{1166}\u{11BD}", - nfkc: "\u{CA7E}", - nfkd: "\u{110D}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{CA7F}", - nfc: "\u{CA7F}", - nfd: "\u{110D}\u{1166}\u{11BE}", - nfkc: "\u{CA7F}", - nfkd: "\u{110D}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{CA80}", - nfc: "\u{CA80}", - nfd: "\u{110D}\u{1166}\u{11BF}", - nfkc: "\u{CA80}", - nfkd: "\u{110D}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{CA81}", - nfc: "\u{CA81}", - nfd: "\u{110D}\u{1166}\u{11C0}", - nfkc: "\u{CA81}", - nfkd: "\u{110D}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{CA82}", - nfc: "\u{CA82}", - nfd: "\u{110D}\u{1166}\u{11C1}", - nfkc: "\u{CA82}", - nfkd: "\u{110D}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{CA83}", - nfc: "\u{CA83}", - nfd: "\u{110D}\u{1166}\u{11C2}", - nfkc: "\u{CA83}", - nfkd: "\u{110D}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{CA84}", - nfc: "\u{CA84}", - nfd: "\u{110D}\u{1167}", - nfkc: "\u{CA84}", - nfkd: "\u{110D}\u{1167}", - }, - NormalizationTest { - source: "\u{CA85}", - nfc: "\u{CA85}", - nfd: "\u{110D}\u{1167}\u{11A8}", - nfkc: "\u{CA85}", - nfkd: "\u{110D}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{CA86}", - nfc: "\u{CA86}", - nfd: "\u{110D}\u{1167}\u{11A9}", - nfkc: "\u{CA86}", - nfkd: "\u{110D}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{CA87}", - nfc: "\u{CA87}", - nfd: "\u{110D}\u{1167}\u{11AA}", - nfkc: "\u{CA87}", - nfkd: "\u{110D}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{CA88}", - nfc: "\u{CA88}", - nfd: "\u{110D}\u{1167}\u{11AB}", - nfkc: "\u{CA88}", - nfkd: "\u{110D}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{CA89}", - nfc: "\u{CA89}", - nfd: "\u{110D}\u{1167}\u{11AC}", - nfkc: "\u{CA89}", - nfkd: "\u{110D}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{CA8A}", - nfc: "\u{CA8A}", - nfd: "\u{110D}\u{1167}\u{11AD}", - nfkc: "\u{CA8A}", - nfkd: "\u{110D}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{CA8B}", - nfc: "\u{CA8B}", - nfd: "\u{110D}\u{1167}\u{11AE}", - nfkc: "\u{CA8B}", - nfkd: "\u{110D}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{CA8C}", - nfc: "\u{CA8C}", - nfd: "\u{110D}\u{1167}\u{11AF}", - nfkc: "\u{CA8C}", - nfkd: "\u{110D}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{CA8D}", - nfc: "\u{CA8D}", - nfd: "\u{110D}\u{1167}\u{11B0}", - nfkc: "\u{CA8D}", - nfkd: "\u{110D}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{CA8E}", - nfc: "\u{CA8E}", - nfd: "\u{110D}\u{1167}\u{11B1}", - nfkc: "\u{CA8E}", - nfkd: "\u{110D}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{CA8F}", - nfc: "\u{CA8F}", - nfd: "\u{110D}\u{1167}\u{11B2}", - nfkc: "\u{CA8F}", - nfkd: "\u{110D}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{CA90}", - nfc: "\u{CA90}", - nfd: "\u{110D}\u{1167}\u{11B3}", - nfkc: "\u{CA90}", - nfkd: "\u{110D}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{CA91}", - nfc: "\u{CA91}", - nfd: "\u{110D}\u{1167}\u{11B4}", - nfkc: "\u{CA91}", - nfkd: "\u{110D}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{CA92}", - nfc: "\u{CA92}", - nfd: "\u{110D}\u{1167}\u{11B5}", - nfkc: "\u{CA92}", - nfkd: "\u{110D}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{CA93}", - nfc: "\u{CA93}", - nfd: "\u{110D}\u{1167}\u{11B6}", - nfkc: "\u{CA93}", - nfkd: "\u{110D}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{CA94}", - nfc: "\u{CA94}", - nfd: "\u{110D}\u{1167}\u{11B7}", - nfkc: "\u{CA94}", - nfkd: "\u{110D}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{CA95}", - nfc: "\u{CA95}", - nfd: "\u{110D}\u{1167}\u{11B8}", - nfkc: "\u{CA95}", - nfkd: "\u{110D}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{CA96}", - nfc: "\u{CA96}", - nfd: "\u{110D}\u{1167}\u{11B9}", - nfkc: "\u{CA96}", - nfkd: "\u{110D}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{CA97}", - nfc: "\u{CA97}", - nfd: "\u{110D}\u{1167}\u{11BA}", - nfkc: "\u{CA97}", - nfkd: "\u{110D}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{CA98}", - nfc: "\u{CA98}", - nfd: "\u{110D}\u{1167}\u{11BB}", - nfkc: "\u{CA98}", - nfkd: "\u{110D}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{CA99}", - nfc: "\u{CA99}", - nfd: "\u{110D}\u{1167}\u{11BC}", - nfkc: "\u{CA99}", - nfkd: "\u{110D}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{CA9A}", - nfc: "\u{CA9A}", - nfd: "\u{110D}\u{1167}\u{11BD}", - nfkc: "\u{CA9A}", - nfkd: "\u{110D}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{CA9B}", - nfc: "\u{CA9B}", - nfd: "\u{110D}\u{1167}\u{11BE}", - nfkc: "\u{CA9B}", - nfkd: "\u{110D}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{CA9C}", - nfc: "\u{CA9C}", - nfd: "\u{110D}\u{1167}\u{11BF}", - nfkc: "\u{CA9C}", - nfkd: "\u{110D}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{CA9D}", - nfc: "\u{CA9D}", - nfd: "\u{110D}\u{1167}\u{11C0}", - nfkc: "\u{CA9D}", - nfkd: "\u{110D}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{CA9E}", - nfc: "\u{CA9E}", - nfd: "\u{110D}\u{1167}\u{11C1}", - nfkc: "\u{CA9E}", - nfkd: "\u{110D}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{CA9F}", - nfc: "\u{CA9F}", - nfd: "\u{110D}\u{1167}\u{11C2}", - nfkc: "\u{CA9F}", - nfkd: "\u{110D}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{CAA0}", - nfc: "\u{CAA0}", - nfd: "\u{110D}\u{1168}", - nfkc: "\u{CAA0}", - nfkd: "\u{110D}\u{1168}", - }, - NormalizationTest { - source: "\u{CAA1}", - nfc: "\u{CAA1}", - nfd: "\u{110D}\u{1168}\u{11A8}", - nfkc: "\u{CAA1}", - nfkd: "\u{110D}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{CAA2}", - nfc: "\u{CAA2}", - nfd: "\u{110D}\u{1168}\u{11A9}", - nfkc: "\u{CAA2}", - nfkd: "\u{110D}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{CAA3}", - nfc: "\u{CAA3}", - nfd: "\u{110D}\u{1168}\u{11AA}", - nfkc: "\u{CAA3}", - nfkd: "\u{110D}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{CAA4}", - nfc: "\u{CAA4}", - nfd: "\u{110D}\u{1168}\u{11AB}", - nfkc: "\u{CAA4}", - nfkd: "\u{110D}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{CAA5}", - nfc: "\u{CAA5}", - nfd: "\u{110D}\u{1168}\u{11AC}", - nfkc: "\u{CAA5}", - nfkd: "\u{110D}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{CAA6}", - nfc: "\u{CAA6}", - nfd: "\u{110D}\u{1168}\u{11AD}", - nfkc: "\u{CAA6}", - nfkd: "\u{110D}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{CAA7}", - nfc: "\u{CAA7}", - nfd: "\u{110D}\u{1168}\u{11AE}", - nfkc: "\u{CAA7}", - nfkd: "\u{110D}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{CAA8}", - nfc: "\u{CAA8}", - nfd: "\u{110D}\u{1168}\u{11AF}", - nfkc: "\u{CAA8}", - nfkd: "\u{110D}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{CAA9}", - nfc: "\u{CAA9}", - nfd: "\u{110D}\u{1168}\u{11B0}", - nfkc: "\u{CAA9}", - nfkd: "\u{110D}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{CAAA}", - nfc: "\u{CAAA}", - nfd: "\u{110D}\u{1168}\u{11B1}", - nfkc: "\u{CAAA}", - nfkd: "\u{110D}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{CAAB}", - nfc: "\u{CAAB}", - nfd: "\u{110D}\u{1168}\u{11B2}", - nfkc: "\u{CAAB}", - nfkd: "\u{110D}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{CAAC}", - nfc: "\u{CAAC}", - nfd: "\u{110D}\u{1168}\u{11B3}", - nfkc: "\u{CAAC}", - nfkd: "\u{110D}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{CAAD}", - nfc: "\u{CAAD}", - nfd: "\u{110D}\u{1168}\u{11B4}", - nfkc: "\u{CAAD}", - nfkd: "\u{110D}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{CAAE}", - nfc: "\u{CAAE}", - nfd: "\u{110D}\u{1168}\u{11B5}", - nfkc: "\u{CAAE}", - nfkd: "\u{110D}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{CAAF}", - nfc: "\u{CAAF}", - nfd: "\u{110D}\u{1168}\u{11B6}", - nfkc: "\u{CAAF}", - nfkd: "\u{110D}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{CAB0}", - nfc: "\u{CAB0}", - nfd: "\u{110D}\u{1168}\u{11B7}", - nfkc: "\u{CAB0}", - nfkd: "\u{110D}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{CAB1}", - nfc: "\u{CAB1}", - nfd: "\u{110D}\u{1168}\u{11B8}", - nfkc: "\u{CAB1}", - nfkd: "\u{110D}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{CAB2}", - nfc: "\u{CAB2}", - nfd: "\u{110D}\u{1168}\u{11B9}", - nfkc: "\u{CAB2}", - nfkd: "\u{110D}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{CAB3}", - nfc: "\u{CAB3}", - nfd: "\u{110D}\u{1168}\u{11BA}", - nfkc: "\u{CAB3}", - nfkd: "\u{110D}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{CAB4}", - nfc: "\u{CAB4}", - nfd: "\u{110D}\u{1168}\u{11BB}", - nfkc: "\u{CAB4}", - nfkd: "\u{110D}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{CAB5}", - nfc: "\u{CAB5}", - nfd: "\u{110D}\u{1168}\u{11BC}", - nfkc: "\u{CAB5}", - nfkd: "\u{110D}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{CAB6}", - nfc: "\u{CAB6}", - nfd: "\u{110D}\u{1168}\u{11BD}", - nfkc: "\u{CAB6}", - nfkd: "\u{110D}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{CAB7}", - nfc: "\u{CAB7}", - nfd: "\u{110D}\u{1168}\u{11BE}", - nfkc: "\u{CAB7}", - nfkd: "\u{110D}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{CAB8}", - nfc: "\u{CAB8}", - nfd: "\u{110D}\u{1168}\u{11BF}", - nfkc: "\u{CAB8}", - nfkd: "\u{110D}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{CAB9}", - nfc: "\u{CAB9}", - nfd: "\u{110D}\u{1168}\u{11C0}", - nfkc: "\u{CAB9}", - nfkd: "\u{110D}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{CABA}", - nfc: "\u{CABA}", - nfd: "\u{110D}\u{1168}\u{11C1}", - nfkc: "\u{CABA}", - nfkd: "\u{110D}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{CABB}", - nfc: "\u{CABB}", - nfd: "\u{110D}\u{1168}\u{11C2}", - nfkc: "\u{CABB}", - nfkd: "\u{110D}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{CABC}", - nfc: "\u{CABC}", - nfd: "\u{110D}\u{1169}", - nfkc: "\u{CABC}", - nfkd: "\u{110D}\u{1169}", - }, - NormalizationTest { - source: "\u{CABD}", - nfc: "\u{CABD}", - nfd: "\u{110D}\u{1169}\u{11A8}", - nfkc: "\u{CABD}", - nfkd: "\u{110D}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{CABE}", - nfc: "\u{CABE}", - nfd: "\u{110D}\u{1169}\u{11A9}", - nfkc: "\u{CABE}", - nfkd: "\u{110D}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{CABF}", - nfc: "\u{CABF}", - nfd: "\u{110D}\u{1169}\u{11AA}", - nfkc: "\u{CABF}", - nfkd: "\u{110D}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{CAC0}", - nfc: "\u{CAC0}", - nfd: "\u{110D}\u{1169}\u{11AB}", - nfkc: "\u{CAC0}", - nfkd: "\u{110D}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{CAC1}", - nfc: "\u{CAC1}", - nfd: "\u{110D}\u{1169}\u{11AC}", - nfkc: "\u{CAC1}", - nfkd: "\u{110D}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{CAC2}", - nfc: "\u{CAC2}", - nfd: "\u{110D}\u{1169}\u{11AD}", - nfkc: "\u{CAC2}", - nfkd: "\u{110D}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{CAC3}", - nfc: "\u{CAC3}", - nfd: "\u{110D}\u{1169}\u{11AE}", - nfkc: "\u{CAC3}", - nfkd: "\u{110D}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{CAC4}", - nfc: "\u{CAC4}", - nfd: "\u{110D}\u{1169}\u{11AF}", - nfkc: "\u{CAC4}", - nfkd: "\u{110D}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{CAC5}", - nfc: "\u{CAC5}", - nfd: "\u{110D}\u{1169}\u{11B0}", - nfkc: "\u{CAC5}", - nfkd: "\u{110D}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{CAC6}", - nfc: "\u{CAC6}", - nfd: "\u{110D}\u{1169}\u{11B1}", - nfkc: "\u{CAC6}", - nfkd: "\u{110D}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{CAC7}", - nfc: "\u{CAC7}", - nfd: "\u{110D}\u{1169}\u{11B2}", - nfkc: "\u{CAC7}", - nfkd: "\u{110D}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{CAC8}", - nfc: "\u{CAC8}", - nfd: "\u{110D}\u{1169}\u{11B3}", - nfkc: "\u{CAC8}", - nfkd: "\u{110D}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{CAC9}", - nfc: "\u{CAC9}", - nfd: "\u{110D}\u{1169}\u{11B4}", - nfkc: "\u{CAC9}", - nfkd: "\u{110D}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{CACA}", - nfc: "\u{CACA}", - nfd: "\u{110D}\u{1169}\u{11B5}", - nfkc: "\u{CACA}", - nfkd: "\u{110D}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{CACB}", - nfc: "\u{CACB}", - nfd: "\u{110D}\u{1169}\u{11B6}", - nfkc: "\u{CACB}", - nfkd: "\u{110D}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{CACC}", - nfc: "\u{CACC}", - nfd: "\u{110D}\u{1169}\u{11B7}", - nfkc: "\u{CACC}", - nfkd: "\u{110D}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{CACD}", - nfc: "\u{CACD}", - nfd: "\u{110D}\u{1169}\u{11B8}", - nfkc: "\u{CACD}", - nfkd: "\u{110D}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{CACE}", - nfc: "\u{CACE}", - nfd: "\u{110D}\u{1169}\u{11B9}", - nfkc: "\u{CACE}", - nfkd: "\u{110D}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{CACF}", - nfc: "\u{CACF}", - nfd: "\u{110D}\u{1169}\u{11BA}", - nfkc: "\u{CACF}", - nfkd: "\u{110D}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{CAD0}", - nfc: "\u{CAD0}", - nfd: "\u{110D}\u{1169}\u{11BB}", - nfkc: "\u{CAD0}", - nfkd: "\u{110D}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{CAD1}", - nfc: "\u{CAD1}", - nfd: "\u{110D}\u{1169}\u{11BC}", - nfkc: "\u{CAD1}", - nfkd: "\u{110D}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{CAD2}", - nfc: "\u{CAD2}", - nfd: "\u{110D}\u{1169}\u{11BD}", - nfkc: "\u{CAD2}", - nfkd: "\u{110D}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{CAD3}", - nfc: "\u{CAD3}", - nfd: "\u{110D}\u{1169}\u{11BE}", - nfkc: "\u{CAD3}", - nfkd: "\u{110D}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{CAD4}", - nfc: "\u{CAD4}", - nfd: "\u{110D}\u{1169}\u{11BF}", - nfkc: "\u{CAD4}", - nfkd: "\u{110D}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{CAD5}", - nfc: "\u{CAD5}", - nfd: "\u{110D}\u{1169}\u{11C0}", - nfkc: "\u{CAD5}", - nfkd: "\u{110D}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{CAD6}", - nfc: "\u{CAD6}", - nfd: "\u{110D}\u{1169}\u{11C1}", - nfkc: "\u{CAD6}", - nfkd: "\u{110D}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{CAD7}", - nfc: "\u{CAD7}", - nfd: "\u{110D}\u{1169}\u{11C2}", - nfkc: "\u{CAD7}", - nfkd: "\u{110D}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{CAD8}", - nfc: "\u{CAD8}", - nfd: "\u{110D}\u{116A}", - nfkc: "\u{CAD8}", - nfkd: "\u{110D}\u{116A}", - }, - NormalizationTest { - source: "\u{CAD9}", - nfc: "\u{CAD9}", - nfd: "\u{110D}\u{116A}\u{11A8}", - nfkc: "\u{CAD9}", - nfkd: "\u{110D}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{CADA}", - nfc: "\u{CADA}", - nfd: "\u{110D}\u{116A}\u{11A9}", - nfkc: "\u{CADA}", - nfkd: "\u{110D}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{CADB}", - nfc: "\u{CADB}", - nfd: "\u{110D}\u{116A}\u{11AA}", - nfkc: "\u{CADB}", - nfkd: "\u{110D}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{CADC}", - nfc: "\u{CADC}", - nfd: "\u{110D}\u{116A}\u{11AB}", - nfkc: "\u{CADC}", - nfkd: "\u{110D}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{CADD}", - nfc: "\u{CADD}", - nfd: "\u{110D}\u{116A}\u{11AC}", - nfkc: "\u{CADD}", - nfkd: "\u{110D}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{CADE}", - nfc: "\u{CADE}", - nfd: "\u{110D}\u{116A}\u{11AD}", - nfkc: "\u{CADE}", - nfkd: "\u{110D}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{CADF}", - nfc: "\u{CADF}", - nfd: "\u{110D}\u{116A}\u{11AE}", - nfkc: "\u{CADF}", - nfkd: "\u{110D}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{CAE0}", - nfc: "\u{CAE0}", - nfd: "\u{110D}\u{116A}\u{11AF}", - nfkc: "\u{CAE0}", - nfkd: "\u{110D}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{CAE1}", - nfc: "\u{CAE1}", - nfd: "\u{110D}\u{116A}\u{11B0}", - nfkc: "\u{CAE1}", - nfkd: "\u{110D}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{CAE2}", - nfc: "\u{CAE2}", - nfd: "\u{110D}\u{116A}\u{11B1}", - nfkc: "\u{CAE2}", - nfkd: "\u{110D}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{CAE3}", - nfc: "\u{CAE3}", - nfd: "\u{110D}\u{116A}\u{11B2}", - nfkc: "\u{CAE3}", - nfkd: "\u{110D}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{CAE4}", - nfc: "\u{CAE4}", - nfd: "\u{110D}\u{116A}\u{11B3}", - nfkc: "\u{CAE4}", - nfkd: "\u{110D}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{CAE5}", - nfc: "\u{CAE5}", - nfd: "\u{110D}\u{116A}\u{11B4}", - nfkc: "\u{CAE5}", - nfkd: "\u{110D}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{CAE6}", - nfc: "\u{CAE6}", - nfd: "\u{110D}\u{116A}\u{11B5}", - nfkc: "\u{CAE6}", - nfkd: "\u{110D}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{CAE7}", - nfc: "\u{CAE7}", - nfd: "\u{110D}\u{116A}\u{11B6}", - nfkc: "\u{CAE7}", - nfkd: "\u{110D}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{CAE8}", - nfc: "\u{CAE8}", - nfd: "\u{110D}\u{116A}\u{11B7}", - nfkc: "\u{CAE8}", - nfkd: "\u{110D}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{CAE9}", - nfc: "\u{CAE9}", - nfd: "\u{110D}\u{116A}\u{11B8}", - nfkc: "\u{CAE9}", - nfkd: "\u{110D}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{CAEA}", - nfc: "\u{CAEA}", - nfd: "\u{110D}\u{116A}\u{11B9}", - nfkc: "\u{CAEA}", - nfkd: "\u{110D}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{CAEB}", - nfc: "\u{CAEB}", - nfd: "\u{110D}\u{116A}\u{11BA}", - nfkc: "\u{CAEB}", - nfkd: "\u{110D}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{CAEC}", - nfc: "\u{CAEC}", - nfd: "\u{110D}\u{116A}\u{11BB}", - nfkc: "\u{CAEC}", - nfkd: "\u{110D}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{CAED}", - nfc: "\u{CAED}", - nfd: "\u{110D}\u{116A}\u{11BC}", - nfkc: "\u{CAED}", - nfkd: "\u{110D}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{CAEE}", - nfc: "\u{CAEE}", - nfd: "\u{110D}\u{116A}\u{11BD}", - nfkc: "\u{CAEE}", - nfkd: "\u{110D}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{CAEF}", - nfc: "\u{CAEF}", - nfd: "\u{110D}\u{116A}\u{11BE}", - nfkc: "\u{CAEF}", - nfkd: "\u{110D}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{CAF0}", - nfc: "\u{CAF0}", - nfd: "\u{110D}\u{116A}\u{11BF}", - nfkc: "\u{CAF0}", - nfkd: "\u{110D}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{CAF1}", - nfc: "\u{CAF1}", - nfd: "\u{110D}\u{116A}\u{11C0}", - nfkc: "\u{CAF1}", - nfkd: "\u{110D}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{CAF2}", - nfc: "\u{CAF2}", - nfd: "\u{110D}\u{116A}\u{11C1}", - nfkc: "\u{CAF2}", - nfkd: "\u{110D}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{CAF3}", - nfc: "\u{CAF3}", - nfd: "\u{110D}\u{116A}\u{11C2}", - nfkc: "\u{CAF3}", - nfkd: "\u{110D}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{CAF4}", - nfc: "\u{CAF4}", - nfd: "\u{110D}\u{116B}", - nfkc: "\u{CAF4}", - nfkd: "\u{110D}\u{116B}", - }, - NormalizationTest { - source: "\u{CAF5}", - nfc: "\u{CAF5}", - nfd: "\u{110D}\u{116B}\u{11A8}", - nfkc: "\u{CAF5}", - nfkd: "\u{110D}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{CAF6}", - nfc: "\u{CAF6}", - nfd: "\u{110D}\u{116B}\u{11A9}", - nfkc: "\u{CAF6}", - nfkd: "\u{110D}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{CAF7}", - nfc: "\u{CAF7}", - nfd: "\u{110D}\u{116B}\u{11AA}", - nfkc: "\u{CAF7}", - nfkd: "\u{110D}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{CAF8}", - nfc: "\u{CAF8}", - nfd: "\u{110D}\u{116B}\u{11AB}", - nfkc: "\u{CAF8}", - nfkd: "\u{110D}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{CAF9}", - nfc: "\u{CAF9}", - nfd: "\u{110D}\u{116B}\u{11AC}", - nfkc: "\u{CAF9}", - nfkd: "\u{110D}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{CAFA}", - nfc: "\u{CAFA}", - nfd: "\u{110D}\u{116B}\u{11AD}", - nfkc: "\u{CAFA}", - nfkd: "\u{110D}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{CAFB}", - nfc: "\u{CAFB}", - nfd: "\u{110D}\u{116B}\u{11AE}", - nfkc: "\u{CAFB}", - nfkd: "\u{110D}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{CAFC}", - nfc: "\u{CAFC}", - nfd: "\u{110D}\u{116B}\u{11AF}", - nfkc: "\u{CAFC}", - nfkd: "\u{110D}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{CAFD}", - nfc: "\u{CAFD}", - nfd: "\u{110D}\u{116B}\u{11B0}", - nfkc: "\u{CAFD}", - nfkd: "\u{110D}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{CAFE}", - nfc: "\u{CAFE}", - nfd: "\u{110D}\u{116B}\u{11B1}", - nfkc: "\u{CAFE}", - nfkd: "\u{110D}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{CAFF}", - nfc: "\u{CAFF}", - nfd: "\u{110D}\u{116B}\u{11B2}", - nfkc: "\u{CAFF}", - nfkd: "\u{110D}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{CB00}", - nfc: "\u{CB00}", - nfd: "\u{110D}\u{116B}\u{11B3}", - nfkc: "\u{CB00}", - nfkd: "\u{110D}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{CB01}", - nfc: "\u{CB01}", - nfd: "\u{110D}\u{116B}\u{11B4}", - nfkc: "\u{CB01}", - nfkd: "\u{110D}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{CB02}", - nfc: "\u{CB02}", - nfd: "\u{110D}\u{116B}\u{11B5}", - nfkc: "\u{CB02}", - nfkd: "\u{110D}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{CB03}", - nfc: "\u{CB03}", - nfd: "\u{110D}\u{116B}\u{11B6}", - nfkc: "\u{CB03}", - nfkd: "\u{110D}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{CB04}", - nfc: "\u{CB04}", - nfd: "\u{110D}\u{116B}\u{11B7}", - nfkc: "\u{CB04}", - nfkd: "\u{110D}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{CB05}", - nfc: "\u{CB05}", - nfd: "\u{110D}\u{116B}\u{11B8}", - nfkc: "\u{CB05}", - nfkd: "\u{110D}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{CB06}", - nfc: "\u{CB06}", - nfd: "\u{110D}\u{116B}\u{11B9}", - nfkc: "\u{CB06}", - nfkd: "\u{110D}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{CB07}", - nfc: "\u{CB07}", - nfd: "\u{110D}\u{116B}\u{11BA}", - nfkc: "\u{CB07}", - nfkd: "\u{110D}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{CB08}", - nfc: "\u{CB08}", - nfd: "\u{110D}\u{116B}\u{11BB}", - nfkc: "\u{CB08}", - nfkd: "\u{110D}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{CB09}", - nfc: "\u{CB09}", - nfd: "\u{110D}\u{116B}\u{11BC}", - nfkc: "\u{CB09}", - nfkd: "\u{110D}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{CB0A}", - nfc: "\u{CB0A}", - nfd: "\u{110D}\u{116B}\u{11BD}", - nfkc: "\u{CB0A}", - nfkd: "\u{110D}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{CB0B}", - nfc: "\u{CB0B}", - nfd: "\u{110D}\u{116B}\u{11BE}", - nfkc: "\u{CB0B}", - nfkd: "\u{110D}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{CB0C}", - nfc: "\u{CB0C}", - nfd: "\u{110D}\u{116B}\u{11BF}", - nfkc: "\u{CB0C}", - nfkd: "\u{110D}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{CB0D}", - nfc: "\u{CB0D}", - nfd: "\u{110D}\u{116B}\u{11C0}", - nfkc: "\u{CB0D}", - nfkd: "\u{110D}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{CB0E}", - nfc: "\u{CB0E}", - nfd: "\u{110D}\u{116B}\u{11C1}", - nfkc: "\u{CB0E}", - nfkd: "\u{110D}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{CB0F}", - nfc: "\u{CB0F}", - nfd: "\u{110D}\u{116B}\u{11C2}", - nfkc: "\u{CB0F}", - nfkd: "\u{110D}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{CB10}", - nfc: "\u{CB10}", - nfd: "\u{110D}\u{116C}", - nfkc: "\u{CB10}", - nfkd: "\u{110D}\u{116C}", - }, - NormalizationTest { - source: "\u{CB11}", - nfc: "\u{CB11}", - nfd: "\u{110D}\u{116C}\u{11A8}", - nfkc: "\u{CB11}", - nfkd: "\u{110D}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{CB12}", - nfc: "\u{CB12}", - nfd: "\u{110D}\u{116C}\u{11A9}", - nfkc: "\u{CB12}", - nfkd: "\u{110D}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{CB13}", - nfc: "\u{CB13}", - nfd: "\u{110D}\u{116C}\u{11AA}", - nfkc: "\u{CB13}", - nfkd: "\u{110D}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{CB14}", - nfc: "\u{CB14}", - nfd: "\u{110D}\u{116C}\u{11AB}", - nfkc: "\u{CB14}", - nfkd: "\u{110D}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{CB15}", - nfc: "\u{CB15}", - nfd: "\u{110D}\u{116C}\u{11AC}", - nfkc: "\u{CB15}", - nfkd: "\u{110D}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{CB16}", - nfc: "\u{CB16}", - nfd: "\u{110D}\u{116C}\u{11AD}", - nfkc: "\u{CB16}", - nfkd: "\u{110D}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{CB17}", - nfc: "\u{CB17}", - nfd: "\u{110D}\u{116C}\u{11AE}", - nfkc: "\u{CB17}", - nfkd: "\u{110D}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{CB18}", - nfc: "\u{CB18}", - nfd: "\u{110D}\u{116C}\u{11AF}", - nfkc: "\u{CB18}", - nfkd: "\u{110D}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{CB19}", - nfc: "\u{CB19}", - nfd: "\u{110D}\u{116C}\u{11B0}", - nfkc: "\u{CB19}", - nfkd: "\u{110D}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{CB1A}", - nfc: "\u{CB1A}", - nfd: "\u{110D}\u{116C}\u{11B1}", - nfkc: "\u{CB1A}", - nfkd: "\u{110D}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{CB1B}", - nfc: "\u{CB1B}", - nfd: "\u{110D}\u{116C}\u{11B2}", - nfkc: "\u{CB1B}", - nfkd: "\u{110D}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{CB1C}", - nfc: "\u{CB1C}", - nfd: "\u{110D}\u{116C}\u{11B3}", - nfkc: "\u{CB1C}", - nfkd: "\u{110D}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{CB1D}", - nfc: "\u{CB1D}", - nfd: "\u{110D}\u{116C}\u{11B4}", - nfkc: "\u{CB1D}", - nfkd: "\u{110D}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{CB1E}", - nfc: "\u{CB1E}", - nfd: "\u{110D}\u{116C}\u{11B5}", - nfkc: "\u{CB1E}", - nfkd: "\u{110D}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{CB1F}", - nfc: "\u{CB1F}", - nfd: "\u{110D}\u{116C}\u{11B6}", - nfkc: "\u{CB1F}", - nfkd: "\u{110D}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{CB20}", - nfc: "\u{CB20}", - nfd: "\u{110D}\u{116C}\u{11B7}", - nfkc: "\u{CB20}", - nfkd: "\u{110D}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{CB21}", - nfc: "\u{CB21}", - nfd: "\u{110D}\u{116C}\u{11B8}", - nfkc: "\u{CB21}", - nfkd: "\u{110D}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{CB22}", - nfc: "\u{CB22}", - nfd: "\u{110D}\u{116C}\u{11B9}", - nfkc: "\u{CB22}", - nfkd: "\u{110D}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{CB23}", - nfc: "\u{CB23}", - nfd: "\u{110D}\u{116C}\u{11BA}", - nfkc: "\u{CB23}", - nfkd: "\u{110D}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{CB24}", - nfc: "\u{CB24}", - nfd: "\u{110D}\u{116C}\u{11BB}", - nfkc: "\u{CB24}", - nfkd: "\u{110D}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{CB25}", - nfc: "\u{CB25}", - nfd: "\u{110D}\u{116C}\u{11BC}", - nfkc: "\u{CB25}", - nfkd: "\u{110D}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{CB26}", - nfc: "\u{CB26}", - nfd: "\u{110D}\u{116C}\u{11BD}", - nfkc: "\u{CB26}", - nfkd: "\u{110D}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{CB27}", - nfc: "\u{CB27}", - nfd: "\u{110D}\u{116C}\u{11BE}", - nfkc: "\u{CB27}", - nfkd: "\u{110D}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{CB28}", - nfc: "\u{CB28}", - nfd: "\u{110D}\u{116C}\u{11BF}", - nfkc: "\u{CB28}", - nfkd: "\u{110D}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{CB29}", - nfc: "\u{CB29}", - nfd: "\u{110D}\u{116C}\u{11C0}", - nfkc: "\u{CB29}", - nfkd: "\u{110D}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{CB2A}", - nfc: "\u{CB2A}", - nfd: "\u{110D}\u{116C}\u{11C1}", - nfkc: "\u{CB2A}", - nfkd: "\u{110D}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{CB2B}", - nfc: "\u{CB2B}", - nfd: "\u{110D}\u{116C}\u{11C2}", - nfkc: "\u{CB2B}", - nfkd: "\u{110D}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{CB2C}", - nfc: "\u{CB2C}", - nfd: "\u{110D}\u{116D}", - nfkc: "\u{CB2C}", - nfkd: "\u{110D}\u{116D}", - }, - NormalizationTest { - source: "\u{CB2D}", - nfc: "\u{CB2D}", - nfd: "\u{110D}\u{116D}\u{11A8}", - nfkc: "\u{CB2D}", - nfkd: "\u{110D}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{CB2E}", - nfc: "\u{CB2E}", - nfd: "\u{110D}\u{116D}\u{11A9}", - nfkc: "\u{CB2E}", - nfkd: "\u{110D}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{CB2F}", - nfc: "\u{CB2F}", - nfd: "\u{110D}\u{116D}\u{11AA}", - nfkc: "\u{CB2F}", - nfkd: "\u{110D}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{CB30}", - nfc: "\u{CB30}", - nfd: "\u{110D}\u{116D}\u{11AB}", - nfkc: "\u{CB30}", - nfkd: "\u{110D}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{CB31}", - nfc: "\u{CB31}", - nfd: "\u{110D}\u{116D}\u{11AC}", - nfkc: "\u{CB31}", - nfkd: "\u{110D}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{CB32}", - nfc: "\u{CB32}", - nfd: "\u{110D}\u{116D}\u{11AD}", - nfkc: "\u{CB32}", - nfkd: "\u{110D}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{CB33}", - nfc: "\u{CB33}", - nfd: "\u{110D}\u{116D}\u{11AE}", - nfkc: "\u{CB33}", - nfkd: "\u{110D}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{CB34}", - nfc: "\u{CB34}", - nfd: "\u{110D}\u{116D}\u{11AF}", - nfkc: "\u{CB34}", - nfkd: "\u{110D}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{CB35}", - nfc: "\u{CB35}", - nfd: "\u{110D}\u{116D}\u{11B0}", - nfkc: "\u{CB35}", - nfkd: "\u{110D}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{CB36}", - nfc: "\u{CB36}", - nfd: "\u{110D}\u{116D}\u{11B1}", - nfkc: "\u{CB36}", - nfkd: "\u{110D}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{CB37}", - nfc: "\u{CB37}", - nfd: "\u{110D}\u{116D}\u{11B2}", - nfkc: "\u{CB37}", - nfkd: "\u{110D}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{CB38}", - nfc: "\u{CB38}", - nfd: "\u{110D}\u{116D}\u{11B3}", - nfkc: "\u{CB38}", - nfkd: "\u{110D}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{CB39}", - nfc: "\u{CB39}", - nfd: "\u{110D}\u{116D}\u{11B4}", - nfkc: "\u{CB39}", - nfkd: "\u{110D}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{CB3A}", - nfc: "\u{CB3A}", - nfd: "\u{110D}\u{116D}\u{11B5}", - nfkc: "\u{CB3A}", - nfkd: "\u{110D}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{CB3B}", - nfc: "\u{CB3B}", - nfd: "\u{110D}\u{116D}\u{11B6}", - nfkc: "\u{CB3B}", - nfkd: "\u{110D}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{CB3C}", - nfc: "\u{CB3C}", - nfd: "\u{110D}\u{116D}\u{11B7}", - nfkc: "\u{CB3C}", - nfkd: "\u{110D}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{CB3D}", - nfc: "\u{CB3D}", - nfd: "\u{110D}\u{116D}\u{11B8}", - nfkc: "\u{CB3D}", - nfkd: "\u{110D}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{CB3E}", - nfc: "\u{CB3E}", - nfd: "\u{110D}\u{116D}\u{11B9}", - nfkc: "\u{CB3E}", - nfkd: "\u{110D}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{CB3F}", - nfc: "\u{CB3F}", - nfd: "\u{110D}\u{116D}\u{11BA}", - nfkc: "\u{CB3F}", - nfkd: "\u{110D}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{CB40}", - nfc: "\u{CB40}", - nfd: "\u{110D}\u{116D}\u{11BB}", - nfkc: "\u{CB40}", - nfkd: "\u{110D}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{CB41}", - nfc: "\u{CB41}", - nfd: "\u{110D}\u{116D}\u{11BC}", - nfkc: "\u{CB41}", - nfkd: "\u{110D}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{CB42}", - nfc: "\u{CB42}", - nfd: "\u{110D}\u{116D}\u{11BD}", - nfkc: "\u{CB42}", - nfkd: "\u{110D}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{CB43}", - nfc: "\u{CB43}", - nfd: "\u{110D}\u{116D}\u{11BE}", - nfkc: "\u{CB43}", - nfkd: "\u{110D}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{CB44}", - nfc: "\u{CB44}", - nfd: "\u{110D}\u{116D}\u{11BF}", - nfkc: "\u{CB44}", - nfkd: "\u{110D}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{CB45}", - nfc: "\u{CB45}", - nfd: "\u{110D}\u{116D}\u{11C0}", - nfkc: "\u{CB45}", - nfkd: "\u{110D}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{CB46}", - nfc: "\u{CB46}", - nfd: "\u{110D}\u{116D}\u{11C1}", - nfkc: "\u{CB46}", - nfkd: "\u{110D}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{CB47}", - nfc: "\u{CB47}", - nfd: "\u{110D}\u{116D}\u{11C2}", - nfkc: "\u{CB47}", - nfkd: "\u{110D}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{CB48}", - nfc: "\u{CB48}", - nfd: "\u{110D}\u{116E}", - nfkc: "\u{CB48}", - nfkd: "\u{110D}\u{116E}", - }, - NormalizationTest { - source: "\u{CB49}", - nfc: "\u{CB49}", - nfd: "\u{110D}\u{116E}\u{11A8}", - nfkc: "\u{CB49}", - nfkd: "\u{110D}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{CB4A}", - nfc: "\u{CB4A}", - nfd: "\u{110D}\u{116E}\u{11A9}", - nfkc: "\u{CB4A}", - nfkd: "\u{110D}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{CB4B}", - nfc: "\u{CB4B}", - nfd: "\u{110D}\u{116E}\u{11AA}", - nfkc: "\u{CB4B}", - nfkd: "\u{110D}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{CB4C}", - nfc: "\u{CB4C}", - nfd: "\u{110D}\u{116E}\u{11AB}", - nfkc: "\u{CB4C}", - nfkd: "\u{110D}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{CB4D}", - nfc: "\u{CB4D}", - nfd: "\u{110D}\u{116E}\u{11AC}", - nfkc: "\u{CB4D}", - nfkd: "\u{110D}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{CB4E}", - nfc: "\u{CB4E}", - nfd: "\u{110D}\u{116E}\u{11AD}", - nfkc: "\u{CB4E}", - nfkd: "\u{110D}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{CB4F}", - nfc: "\u{CB4F}", - nfd: "\u{110D}\u{116E}\u{11AE}", - nfkc: "\u{CB4F}", - nfkd: "\u{110D}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{CB50}", - nfc: "\u{CB50}", - nfd: "\u{110D}\u{116E}\u{11AF}", - nfkc: "\u{CB50}", - nfkd: "\u{110D}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{CB51}", - nfc: "\u{CB51}", - nfd: "\u{110D}\u{116E}\u{11B0}", - nfkc: "\u{CB51}", - nfkd: "\u{110D}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{CB52}", - nfc: "\u{CB52}", - nfd: "\u{110D}\u{116E}\u{11B1}", - nfkc: "\u{CB52}", - nfkd: "\u{110D}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{CB53}", - nfc: "\u{CB53}", - nfd: "\u{110D}\u{116E}\u{11B2}", - nfkc: "\u{CB53}", - nfkd: "\u{110D}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{CB54}", - nfc: "\u{CB54}", - nfd: "\u{110D}\u{116E}\u{11B3}", - nfkc: "\u{CB54}", - nfkd: "\u{110D}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{CB55}", - nfc: "\u{CB55}", - nfd: "\u{110D}\u{116E}\u{11B4}", - nfkc: "\u{CB55}", - nfkd: "\u{110D}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{CB56}", - nfc: "\u{CB56}", - nfd: "\u{110D}\u{116E}\u{11B5}", - nfkc: "\u{CB56}", - nfkd: "\u{110D}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{CB57}", - nfc: "\u{CB57}", - nfd: "\u{110D}\u{116E}\u{11B6}", - nfkc: "\u{CB57}", - nfkd: "\u{110D}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{CB58}", - nfc: "\u{CB58}", - nfd: "\u{110D}\u{116E}\u{11B7}", - nfkc: "\u{CB58}", - nfkd: "\u{110D}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{CB59}", - nfc: "\u{CB59}", - nfd: "\u{110D}\u{116E}\u{11B8}", - nfkc: "\u{CB59}", - nfkd: "\u{110D}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{CB5A}", - nfc: "\u{CB5A}", - nfd: "\u{110D}\u{116E}\u{11B9}", - nfkc: "\u{CB5A}", - nfkd: "\u{110D}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{CB5B}", - nfc: "\u{CB5B}", - nfd: "\u{110D}\u{116E}\u{11BA}", - nfkc: "\u{CB5B}", - nfkd: "\u{110D}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{CB5C}", - nfc: "\u{CB5C}", - nfd: "\u{110D}\u{116E}\u{11BB}", - nfkc: "\u{CB5C}", - nfkd: "\u{110D}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{CB5D}", - nfc: "\u{CB5D}", - nfd: "\u{110D}\u{116E}\u{11BC}", - nfkc: "\u{CB5D}", - nfkd: "\u{110D}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{CB5E}", - nfc: "\u{CB5E}", - nfd: "\u{110D}\u{116E}\u{11BD}", - nfkc: "\u{CB5E}", - nfkd: "\u{110D}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{CB5F}", - nfc: "\u{CB5F}", - nfd: "\u{110D}\u{116E}\u{11BE}", - nfkc: "\u{CB5F}", - nfkd: "\u{110D}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{CB60}", - nfc: "\u{CB60}", - nfd: "\u{110D}\u{116E}\u{11BF}", - nfkc: "\u{CB60}", - nfkd: "\u{110D}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{CB61}", - nfc: "\u{CB61}", - nfd: "\u{110D}\u{116E}\u{11C0}", - nfkc: "\u{CB61}", - nfkd: "\u{110D}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{CB62}", - nfc: "\u{CB62}", - nfd: "\u{110D}\u{116E}\u{11C1}", - nfkc: "\u{CB62}", - nfkd: "\u{110D}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{CB63}", - nfc: "\u{CB63}", - nfd: "\u{110D}\u{116E}\u{11C2}", - nfkc: "\u{CB63}", - nfkd: "\u{110D}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{CB64}", - nfc: "\u{CB64}", - nfd: "\u{110D}\u{116F}", - nfkc: "\u{CB64}", - nfkd: "\u{110D}\u{116F}", - }, - NormalizationTest { - source: "\u{CB65}", - nfc: "\u{CB65}", - nfd: "\u{110D}\u{116F}\u{11A8}", - nfkc: "\u{CB65}", - nfkd: "\u{110D}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{CB66}", - nfc: "\u{CB66}", - nfd: "\u{110D}\u{116F}\u{11A9}", - nfkc: "\u{CB66}", - nfkd: "\u{110D}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{CB67}", - nfc: "\u{CB67}", - nfd: "\u{110D}\u{116F}\u{11AA}", - nfkc: "\u{CB67}", - nfkd: "\u{110D}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{CB68}", - nfc: "\u{CB68}", - nfd: "\u{110D}\u{116F}\u{11AB}", - nfkc: "\u{CB68}", - nfkd: "\u{110D}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{CB69}", - nfc: "\u{CB69}", - nfd: "\u{110D}\u{116F}\u{11AC}", - nfkc: "\u{CB69}", - nfkd: "\u{110D}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{CB6A}", - nfc: "\u{CB6A}", - nfd: "\u{110D}\u{116F}\u{11AD}", - nfkc: "\u{CB6A}", - nfkd: "\u{110D}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{CB6B}", - nfc: "\u{CB6B}", - nfd: "\u{110D}\u{116F}\u{11AE}", - nfkc: "\u{CB6B}", - nfkd: "\u{110D}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{CB6C}", - nfc: "\u{CB6C}", - nfd: "\u{110D}\u{116F}\u{11AF}", - nfkc: "\u{CB6C}", - nfkd: "\u{110D}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{CB6D}", - nfc: "\u{CB6D}", - nfd: "\u{110D}\u{116F}\u{11B0}", - nfkc: "\u{CB6D}", - nfkd: "\u{110D}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{CB6E}", - nfc: "\u{CB6E}", - nfd: "\u{110D}\u{116F}\u{11B1}", - nfkc: "\u{CB6E}", - nfkd: "\u{110D}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{CB6F}", - nfc: "\u{CB6F}", - nfd: "\u{110D}\u{116F}\u{11B2}", - nfkc: "\u{CB6F}", - nfkd: "\u{110D}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{CB70}", - nfc: "\u{CB70}", - nfd: "\u{110D}\u{116F}\u{11B3}", - nfkc: "\u{CB70}", - nfkd: "\u{110D}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{CB71}", - nfc: "\u{CB71}", - nfd: "\u{110D}\u{116F}\u{11B4}", - nfkc: "\u{CB71}", - nfkd: "\u{110D}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{CB72}", - nfc: "\u{CB72}", - nfd: "\u{110D}\u{116F}\u{11B5}", - nfkc: "\u{CB72}", - nfkd: "\u{110D}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{CB73}", - nfc: "\u{CB73}", - nfd: "\u{110D}\u{116F}\u{11B6}", - nfkc: "\u{CB73}", - nfkd: "\u{110D}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{CB74}", - nfc: "\u{CB74}", - nfd: "\u{110D}\u{116F}\u{11B7}", - nfkc: "\u{CB74}", - nfkd: "\u{110D}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{CB75}", - nfc: "\u{CB75}", - nfd: "\u{110D}\u{116F}\u{11B8}", - nfkc: "\u{CB75}", - nfkd: "\u{110D}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{CB76}", - nfc: "\u{CB76}", - nfd: "\u{110D}\u{116F}\u{11B9}", - nfkc: "\u{CB76}", - nfkd: "\u{110D}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{CB77}", - nfc: "\u{CB77}", - nfd: "\u{110D}\u{116F}\u{11BA}", - nfkc: "\u{CB77}", - nfkd: "\u{110D}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{CB78}", - nfc: "\u{CB78}", - nfd: "\u{110D}\u{116F}\u{11BB}", - nfkc: "\u{CB78}", - nfkd: "\u{110D}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{CB79}", - nfc: "\u{CB79}", - nfd: "\u{110D}\u{116F}\u{11BC}", - nfkc: "\u{CB79}", - nfkd: "\u{110D}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{CB7A}", - nfc: "\u{CB7A}", - nfd: "\u{110D}\u{116F}\u{11BD}", - nfkc: "\u{CB7A}", - nfkd: "\u{110D}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{CB7B}", - nfc: "\u{CB7B}", - nfd: "\u{110D}\u{116F}\u{11BE}", - nfkc: "\u{CB7B}", - nfkd: "\u{110D}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{CB7C}", - nfc: "\u{CB7C}", - nfd: "\u{110D}\u{116F}\u{11BF}", - nfkc: "\u{CB7C}", - nfkd: "\u{110D}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{CB7D}", - nfc: "\u{CB7D}", - nfd: "\u{110D}\u{116F}\u{11C0}", - nfkc: "\u{CB7D}", - nfkd: "\u{110D}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{CB7E}", - nfc: "\u{CB7E}", - nfd: "\u{110D}\u{116F}\u{11C1}", - nfkc: "\u{CB7E}", - nfkd: "\u{110D}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{CB7F}", - nfc: "\u{CB7F}", - nfd: "\u{110D}\u{116F}\u{11C2}", - nfkc: "\u{CB7F}", - nfkd: "\u{110D}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{CB80}", - nfc: "\u{CB80}", - nfd: "\u{110D}\u{1170}", - nfkc: "\u{CB80}", - nfkd: "\u{110D}\u{1170}", - }, - NormalizationTest { - source: "\u{CB81}", - nfc: "\u{CB81}", - nfd: "\u{110D}\u{1170}\u{11A8}", - nfkc: "\u{CB81}", - nfkd: "\u{110D}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{CB82}", - nfc: "\u{CB82}", - nfd: "\u{110D}\u{1170}\u{11A9}", - nfkc: "\u{CB82}", - nfkd: "\u{110D}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{CB83}", - nfc: "\u{CB83}", - nfd: "\u{110D}\u{1170}\u{11AA}", - nfkc: "\u{CB83}", - nfkd: "\u{110D}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{CB84}", - nfc: "\u{CB84}", - nfd: "\u{110D}\u{1170}\u{11AB}", - nfkc: "\u{CB84}", - nfkd: "\u{110D}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{CB85}", - nfc: "\u{CB85}", - nfd: "\u{110D}\u{1170}\u{11AC}", - nfkc: "\u{CB85}", - nfkd: "\u{110D}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{CB86}", - nfc: "\u{CB86}", - nfd: "\u{110D}\u{1170}\u{11AD}", - nfkc: "\u{CB86}", - nfkd: "\u{110D}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{CB87}", - nfc: "\u{CB87}", - nfd: "\u{110D}\u{1170}\u{11AE}", - nfkc: "\u{CB87}", - nfkd: "\u{110D}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{CB88}", - nfc: "\u{CB88}", - nfd: "\u{110D}\u{1170}\u{11AF}", - nfkc: "\u{CB88}", - nfkd: "\u{110D}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{CB89}", - nfc: "\u{CB89}", - nfd: "\u{110D}\u{1170}\u{11B0}", - nfkc: "\u{CB89}", - nfkd: "\u{110D}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{CB8A}", - nfc: "\u{CB8A}", - nfd: "\u{110D}\u{1170}\u{11B1}", - nfkc: "\u{CB8A}", - nfkd: "\u{110D}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{CB8B}", - nfc: "\u{CB8B}", - nfd: "\u{110D}\u{1170}\u{11B2}", - nfkc: "\u{CB8B}", - nfkd: "\u{110D}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{CB8C}", - nfc: "\u{CB8C}", - nfd: "\u{110D}\u{1170}\u{11B3}", - nfkc: "\u{CB8C}", - nfkd: "\u{110D}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{CB8D}", - nfc: "\u{CB8D}", - nfd: "\u{110D}\u{1170}\u{11B4}", - nfkc: "\u{CB8D}", - nfkd: "\u{110D}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{CB8E}", - nfc: "\u{CB8E}", - nfd: "\u{110D}\u{1170}\u{11B5}", - nfkc: "\u{CB8E}", - nfkd: "\u{110D}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{CB8F}", - nfc: "\u{CB8F}", - nfd: "\u{110D}\u{1170}\u{11B6}", - nfkc: "\u{CB8F}", - nfkd: "\u{110D}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{CB90}", - nfc: "\u{CB90}", - nfd: "\u{110D}\u{1170}\u{11B7}", - nfkc: "\u{CB90}", - nfkd: "\u{110D}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{CB91}", - nfc: "\u{CB91}", - nfd: "\u{110D}\u{1170}\u{11B8}", - nfkc: "\u{CB91}", - nfkd: "\u{110D}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{CB92}", - nfc: "\u{CB92}", - nfd: "\u{110D}\u{1170}\u{11B9}", - nfkc: "\u{CB92}", - nfkd: "\u{110D}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{CB93}", - nfc: "\u{CB93}", - nfd: "\u{110D}\u{1170}\u{11BA}", - nfkc: "\u{CB93}", - nfkd: "\u{110D}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{CB94}", - nfc: "\u{CB94}", - nfd: "\u{110D}\u{1170}\u{11BB}", - nfkc: "\u{CB94}", - nfkd: "\u{110D}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{CB95}", - nfc: "\u{CB95}", - nfd: "\u{110D}\u{1170}\u{11BC}", - nfkc: "\u{CB95}", - nfkd: "\u{110D}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{CB96}", - nfc: "\u{CB96}", - nfd: "\u{110D}\u{1170}\u{11BD}", - nfkc: "\u{CB96}", - nfkd: "\u{110D}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{CB97}", - nfc: "\u{CB97}", - nfd: "\u{110D}\u{1170}\u{11BE}", - nfkc: "\u{CB97}", - nfkd: "\u{110D}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{CB98}", - nfc: "\u{CB98}", - nfd: "\u{110D}\u{1170}\u{11BF}", - nfkc: "\u{CB98}", - nfkd: "\u{110D}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{CB99}", - nfc: "\u{CB99}", - nfd: "\u{110D}\u{1170}\u{11C0}", - nfkc: "\u{CB99}", - nfkd: "\u{110D}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{CB9A}", - nfc: "\u{CB9A}", - nfd: "\u{110D}\u{1170}\u{11C1}", - nfkc: "\u{CB9A}", - nfkd: "\u{110D}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{CB9B}", - nfc: "\u{CB9B}", - nfd: "\u{110D}\u{1170}\u{11C2}", - nfkc: "\u{CB9B}", - nfkd: "\u{110D}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{CB9C}", - nfc: "\u{CB9C}", - nfd: "\u{110D}\u{1171}", - nfkc: "\u{CB9C}", - nfkd: "\u{110D}\u{1171}", - }, - NormalizationTest { - source: "\u{CB9D}", - nfc: "\u{CB9D}", - nfd: "\u{110D}\u{1171}\u{11A8}", - nfkc: "\u{CB9D}", - nfkd: "\u{110D}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{CB9E}", - nfc: "\u{CB9E}", - nfd: "\u{110D}\u{1171}\u{11A9}", - nfkc: "\u{CB9E}", - nfkd: "\u{110D}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{CB9F}", - nfc: "\u{CB9F}", - nfd: "\u{110D}\u{1171}\u{11AA}", - nfkc: "\u{CB9F}", - nfkd: "\u{110D}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{CBA0}", - nfc: "\u{CBA0}", - nfd: "\u{110D}\u{1171}\u{11AB}", - nfkc: "\u{CBA0}", - nfkd: "\u{110D}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{CBA1}", - nfc: "\u{CBA1}", - nfd: "\u{110D}\u{1171}\u{11AC}", - nfkc: "\u{CBA1}", - nfkd: "\u{110D}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{CBA2}", - nfc: "\u{CBA2}", - nfd: "\u{110D}\u{1171}\u{11AD}", - nfkc: "\u{CBA2}", - nfkd: "\u{110D}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{CBA3}", - nfc: "\u{CBA3}", - nfd: "\u{110D}\u{1171}\u{11AE}", - nfkc: "\u{CBA3}", - nfkd: "\u{110D}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{CBA4}", - nfc: "\u{CBA4}", - nfd: "\u{110D}\u{1171}\u{11AF}", - nfkc: "\u{CBA4}", - nfkd: "\u{110D}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{CBA5}", - nfc: "\u{CBA5}", - nfd: "\u{110D}\u{1171}\u{11B0}", - nfkc: "\u{CBA5}", - nfkd: "\u{110D}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{CBA6}", - nfc: "\u{CBA6}", - nfd: "\u{110D}\u{1171}\u{11B1}", - nfkc: "\u{CBA6}", - nfkd: "\u{110D}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{CBA7}", - nfc: "\u{CBA7}", - nfd: "\u{110D}\u{1171}\u{11B2}", - nfkc: "\u{CBA7}", - nfkd: "\u{110D}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{CBA8}", - nfc: "\u{CBA8}", - nfd: "\u{110D}\u{1171}\u{11B3}", - nfkc: "\u{CBA8}", - nfkd: "\u{110D}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{CBA9}", - nfc: "\u{CBA9}", - nfd: "\u{110D}\u{1171}\u{11B4}", - nfkc: "\u{CBA9}", - nfkd: "\u{110D}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{CBAA}", - nfc: "\u{CBAA}", - nfd: "\u{110D}\u{1171}\u{11B5}", - nfkc: "\u{CBAA}", - nfkd: "\u{110D}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{CBAB}", - nfc: "\u{CBAB}", - nfd: "\u{110D}\u{1171}\u{11B6}", - nfkc: "\u{CBAB}", - nfkd: "\u{110D}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{CBAC}", - nfc: "\u{CBAC}", - nfd: "\u{110D}\u{1171}\u{11B7}", - nfkc: "\u{CBAC}", - nfkd: "\u{110D}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{CBAD}", - nfc: "\u{CBAD}", - nfd: "\u{110D}\u{1171}\u{11B8}", - nfkc: "\u{CBAD}", - nfkd: "\u{110D}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{CBAE}", - nfc: "\u{CBAE}", - nfd: "\u{110D}\u{1171}\u{11B9}", - nfkc: "\u{CBAE}", - nfkd: "\u{110D}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{CBAF}", - nfc: "\u{CBAF}", - nfd: "\u{110D}\u{1171}\u{11BA}", - nfkc: "\u{CBAF}", - nfkd: "\u{110D}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{CBB0}", - nfc: "\u{CBB0}", - nfd: "\u{110D}\u{1171}\u{11BB}", - nfkc: "\u{CBB0}", - nfkd: "\u{110D}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{CBB1}", - nfc: "\u{CBB1}", - nfd: "\u{110D}\u{1171}\u{11BC}", - nfkc: "\u{CBB1}", - nfkd: "\u{110D}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{CBB2}", - nfc: "\u{CBB2}", - nfd: "\u{110D}\u{1171}\u{11BD}", - nfkc: "\u{CBB2}", - nfkd: "\u{110D}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{CBB3}", - nfc: "\u{CBB3}", - nfd: "\u{110D}\u{1171}\u{11BE}", - nfkc: "\u{CBB3}", - nfkd: "\u{110D}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{CBB4}", - nfc: "\u{CBB4}", - nfd: "\u{110D}\u{1171}\u{11BF}", - nfkc: "\u{CBB4}", - nfkd: "\u{110D}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{CBB5}", - nfc: "\u{CBB5}", - nfd: "\u{110D}\u{1171}\u{11C0}", - nfkc: "\u{CBB5}", - nfkd: "\u{110D}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{CBB6}", - nfc: "\u{CBB6}", - nfd: "\u{110D}\u{1171}\u{11C1}", - nfkc: "\u{CBB6}", - nfkd: "\u{110D}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{CBB7}", - nfc: "\u{CBB7}", - nfd: "\u{110D}\u{1171}\u{11C2}", - nfkc: "\u{CBB7}", - nfkd: "\u{110D}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{CBB8}", - nfc: "\u{CBB8}", - nfd: "\u{110D}\u{1172}", - nfkc: "\u{CBB8}", - nfkd: "\u{110D}\u{1172}", - }, - NormalizationTest { - source: "\u{CBB9}", - nfc: "\u{CBB9}", - nfd: "\u{110D}\u{1172}\u{11A8}", - nfkc: "\u{CBB9}", - nfkd: "\u{110D}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{CBBA}", - nfc: "\u{CBBA}", - nfd: "\u{110D}\u{1172}\u{11A9}", - nfkc: "\u{CBBA}", - nfkd: "\u{110D}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{CBBB}", - nfc: "\u{CBBB}", - nfd: "\u{110D}\u{1172}\u{11AA}", - nfkc: "\u{CBBB}", - nfkd: "\u{110D}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{CBBC}", - nfc: "\u{CBBC}", - nfd: "\u{110D}\u{1172}\u{11AB}", - nfkc: "\u{CBBC}", - nfkd: "\u{110D}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{CBBD}", - nfc: "\u{CBBD}", - nfd: "\u{110D}\u{1172}\u{11AC}", - nfkc: "\u{CBBD}", - nfkd: "\u{110D}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{CBBE}", - nfc: "\u{CBBE}", - nfd: "\u{110D}\u{1172}\u{11AD}", - nfkc: "\u{CBBE}", - nfkd: "\u{110D}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{CBBF}", - nfc: "\u{CBBF}", - nfd: "\u{110D}\u{1172}\u{11AE}", - nfkc: "\u{CBBF}", - nfkd: "\u{110D}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{CBC0}", - nfc: "\u{CBC0}", - nfd: "\u{110D}\u{1172}\u{11AF}", - nfkc: "\u{CBC0}", - nfkd: "\u{110D}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{CBC1}", - nfc: "\u{CBC1}", - nfd: "\u{110D}\u{1172}\u{11B0}", - nfkc: "\u{CBC1}", - nfkd: "\u{110D}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{CBC2}", - nfc: "\u{CBC2}", - nfd: "\u{110D}\u{1172}\u{11B1}", - nfkc: "\u{CBC2}", - nfkd: "\u{110D}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{CBC3}", - nfc: "\u{CBC3}", - nfd: "\u{110D}\u{1172}\u{11B2}", - nfkc: "\u{CBC3}", - nfkd: "\u{110D}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{CBC4}", - nfc: "\u{CBC4}", - nfd: "\u{110D}\u{1172}\u{11B3}", - nfkc: "\u{CBC4}", - nfkd: "\u{110D}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{CBC5}", - nfc: "\u{CBC5}", - nfd: "\u{110D}\u{1172}\u{11B4}", - nfkc: "\u{CBC5}", - nfkd: "\u{110D}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{CBC6}", - nfc: "\u{CBC6}", - nfd: "\u{110D}\u{1172}\u{11B5}", - nfkc: "\u{CBC6}", - nfkd: "\u{110D}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{CBC7}", - nfc: "\u{CBC7}", - nfd: "\u{110D}\u{1172}\u{11B6}", - nfkc: "\u{CBC7}", - nfkd: "\u{110D}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{CBC8}", - nfc: "\u{CBC8}", - nfd: "\u{110D}\u{1172}\u{11B7}", - nfkc: "\u{CBC8}", - nfkd: "\u{110D}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{CBC9}", - nfc: "\u{CBC9}", - nfd: "\u{110D}\u{1172}\u{11B8}", - nfkc: "\u{CBC9}", - nfkd: "\u{110D}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{CBCA}", - nfc: "\u{CBCA}", - nfd: "\u{110D}\u{1172}\u{11B9}", - nfkc: "\u{CBCA}", - nfkd: "\u{110D}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{CBCB}", - nfc: "\u{CBCB}", - nfd: "\u{110D}\u{1172}\u{11BA}", - nfkc: "\u{CBCB}", - nfkd: "\u{110D}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{CBCC}", - nfc: "\u{CBCC}", - nfd: "\u{110D}\u{1172}\u{11BB}", - nfkc: "\u{CBCC}", - nfkd: "\u{110D}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{CBCD}", - nfc: "\u{CBCD}", - nfd: "\u{110D}\u{1172}\u{11BC}", - nfkc: "\u{CBCD}", - nfkd: "\u{110D}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{CBCE}", - nfc: "\u{CBCE}", - nfd: "\u{110D}\u{1172}\u{11BD}", - nfkc: "\u{CBCE}", - nfkd: "\u{110D}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{CBCF}", - nfc: "\u{CBCF}", - nfd: "\u{110D}\u{1172}\u{11BE}", - nfkc: "\u{CBCF}", - nfkd: "\u{110D}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{CBD0}", - nfc: "\u{CBD0}", - nfd: "\u{110D}\u{1172}\u{11BF}", - nfkc: "\u{CBD0}", - nfkd: "\u{110D}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{CBD1}", - nfc: "\u{CBD1}", - nfd: "\u{110D}\u{1172}\u{11C0}", - nfkc: "\u{CBD1}", - nfkd: "\u{110D}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{CBD2}", - nfc: "\u{CBD2}", - nfd: "\u{110D}\u{1172}\u{11C1}", - nfkc: "\u{CBD2}", - nfkd: "\u{110D}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{CBD3}", - nfc: "\u{CBD3}", - nfd: "\u{110D}\u{1172}\u{11C2}", - nfkc: "\u{CBD3}", - nfkd: "\u{110D}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{CBD4}", - nfc: "\u{CBD4}", - nfd: "\u{110D}\u{1173}", - nfkc: "\u{CBD4}", - nfkd: "\u{110D}\u{1173}", - }, - NormalizationTest { - source: "\u{CBD5}", - nfc: "\u{CBD5}", - nfd: "\u{110D}\u{1173}\u{11A8}", - nfkc: "\u{CBD5}", - nfkd: "\u{110D}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{CBD6}", - nfc: "\u{CBD6}", - nfd: "\u{110D}\u{1173}\u{11A9}", - nfkc: "\u{CBD6}", - nfkd: "\u{110D}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{CBD7}", - nfc: "\u{CBD7}", - nfd: "\u{110D}\u{1173}\u{11AA}", - nfkc: "\u{CBD7}", - nfkd: "\u{110D}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{CBD8}", - nfc: "\u{CBD8}", - nfd: "\u{110D}\u{1173}\u{11AB}", - nfkc: "\u{CBD8}", - nfkd: "\u{110D}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{CBD9}", - nfc: "\u{CBD9}", - nfd: "\u{110D}\u{1173}\u{11AC}", - nfkc: "\u{CBD9}", - nfkd: "\u{110D}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{CBDA}", - nfc: "\u{CBDA}", - nfd: "\u{110D}\u{1173}\u{11AD}", - nfkc: "\u{CBDA}", - nfkd: "\u{110D}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{CBDB}", - nfc: "\u{CBDB}", - nfd: "\u{110D}\u{1173}\u{11AE}", - nfkc: "\u{CBDB}", - nfkd: "\u{110D}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{CBDC}", - nfc: "\u{CBDC}", - nfd: "\u{110D}\u{1173}\u{11AF}", - nfkc: "\u{CBDC}", - nfkd: "\u{110D}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{CBDD}", - nfc: "\u{CBDD}", - nfd: "\u{110D}\u{1173}\u{11B0}", - nfkc: "\u{CBDD}", - nfkd: "\u{110D}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{CBDE}", - nfc: "\u{CBDE}", - nfd: "\u{110D}\u{1173}\u{11B1}", - nfkc: "\u{CBDE}", - nfkd: "\u{110D}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{CBDF}", - nfc: "\u{CBDF}", - nfd: "\u{110D}\u{1173}\u{11B2}", - nfkc: "\u{CBDF}", - nfkd: "\u{110D}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{CBE0}", - nfc: "\u{CBE0}", - nfd: "\u{110D}\u{1173}\u{11B3}", - nfkc: "\u{CBE0}", - nfkd: "\u{110D}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{CBE1}", - nfc: "\u{CBE1}", - nfd: "\u{110D}\u{1173}\u{11B4}", - nfkc: "\u{CBE1}", - nfkd: "\u{110D}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{CBE2}", - nfc: "\u{CBE2}", - nfd: "\u{110D}\u{1173}\u{11B5}", - nfkc: "\u{CBE2}", - nfkd: "\u{110D}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{CBE3}", - nfc: "\u{CBE3}", - nfd: "\u{110D}\u{1173}\u{11B6}", - nfkc: "\u{CBE3}", - nfkd: "\u{110D}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{CBE4}", - nfc: "\u{CBE4}", - nfd: "\u{110D}\u{1173}\u{11B7}", - nfkc: "\u{CBE4}", - nfkd: "\u{110D}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{CBE5}", - nfc: "\u{CBE5}", - nfd: "\u{110D}\u{1173}\u{11B8}", - nfkc: "\u{CBE5}", - nfkd: "\u{110D}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{CBE6}", - nfc: "\u{CBE6}", - nfd: "\u{110D}\u{1173}\u{11B9}", - nfkc: "\u{CBE6}", - nfkd: "\u{110D}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{CBE7}", - nfc: "\u{CBE7}", - nfd: "\u{110D}\u{1173}\u{11BA}", - nfkc: "\u{CBE7}", - nfkd: "\u{110D}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{CBE8}", - nfc: "\u{CBE8}", - nfd: "\u{110D}\u{1173}\u{11BB}", - nfkc: "\u{CBE8}", - nfkd: "\u{110D}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{CBE9}", - nfc: "\u{CBE9}", - nfd: "\u{110D}\u{1173}\u{11BC}", - nfkc: "\u{CBE9}", - nfkd: "\u{110D}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{CBEA}", - nfc: "\u{CBEA}", - nfd: "\u{110D}\u{1173}\u{11BD}", - nfkc: "\u{CBEA}", - nfkd: "\u{110D}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{CBEB}", - nfc: "\u{CBEB}", - nfd: "\u{110D}\u{1173}\u{11BE}", - nfkc: "\u{CBEB}", - nfkd: "\u{110D}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{CBEC}", - nfc: "\u{CBEC}", - nfd: "\u{110D}\u{1173}\u{11BF}", - nfkc: "\u{CBEC}", - nfkd: "\u{110D}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{CBED}", - nfc: "\u{CBED}", - nfd: "\u{110D}\u{1173}\u{11C0}", - nfkc: "\u{CBED}", - nfkd: "\u{110D}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{CBEE}", - nfc: "\u{CBEE}", - nfd: "\u{110D}\u{1173}\u{11C1}", - nfkc: "\u{CBEE}", - nfkd: "\u{110D}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{CBEF}", - nfc: "\u{CBEF}", - nfd: "\u{110D}\u{1173}\u{11C2}", - nfkc: "\u{CBEF}", - nfkd: "\u{110D}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{CBF0}", - nfc: "\u{CBF0}", - nfd: "\u{110D}\u{1174}", - nfkc: "\u{CBF0}", - nfkd: "\u{110D}\u{1174}", - }, - NormalizationTest { - source: "\u{CBF1}", - nfc: "\u{CBF1}", - nfd: "\u{110D}\u{1174}\u{11A8}", - nfkc: "\u{CBF1}", - nfkd: "\u{110D}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{CBF2}", - nfc: "\u{CBF2}", - nfd: "\u{110D}\u{1174}\u{11A9}", - nfkc: "\u{CBF2}", - nfkd: "\u{110D}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{CBF3}", - nfc: "\u{CBF3}", - nfd: "\u{110D}\u{1174}\u{11AA}", - nfkc: "\u{CBF3}", - nfkd: "\u{110D}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{CBF4}", - nfc: "\u{CBF4}", - nfd: "\u{110D}\u{1174}\u{11AB}", - nfkc: "\u{CBF4}", - nfkd: "\u{110D}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{CBF5}", - nfc: "\u{CBF5}", - nfd: "\u{110D}\u{1174}\u{11AC}", - nfkc: "\u{CBF5}", - nfkd: "\u{110D}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{CBF6}", - nfc: "\u{CBF6}", - nfd: "\u{110D}\u{1174}\u{11AD}", - nfkc: "\u{CBF6}", - nfkd: "\u{110D}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{CBF7}", - nfc: "\u{CBF7}", - nfd: "\u{110D}\u{1174}\u{11AE}", - nfkc: "\u{CBF7}", - nfkd: "\u{110D}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{CBF8}", - nfc: "\u{CBF8}", - nfd: "\u{110D}\u{1174}\u{11AF}", - nfkc: "\u{CBF8}", - nfkd: "\u{110D}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{CBF9}", - nfc: "\u{CBF9}", - nfd: "\u{110D}\u{1174}\u{11B0}", - nfkc: "\u{CBF9}", - nfkd: "\u{110D}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{CBFA}", - nfc: "\u{CBFA}", - nfd: "\u{110D}\u{1174}\u{11B1}", - nfkc: "\u{CBFA}", - nfkd: "\u{110D}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{CBFB}", - nfc: "\u{CBFB}", - nfd: "\u{110D}\u{1174}\u{11B2}", - nfkc: "\u{CBFB}", - nfkd: "\u{110D}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{CBFC}", - nfc: "\u{CBFC}", - nfd: "\u{110D}\u{1174}\u{11B3}", - nfkc: "\u{CBFC}", - nfkd: "\u{110D}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{CBFD}", - nfc: "\u{CBFD}", - nfd: "\u{110D}\u{1174}\u{11B4}", - nfkc: "\u{CBFD}", - nfkd: "\u{110D}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{CBFE}", - nfc: "\u{CBFE}", - nfd: "\u{110D}\u{1174}\u{11B5}", - nfkc: "\u{CBFE}", - nfkd: "\u{110D}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{CBFF}", - nfc: "\u{CBFF}", - nfd: "\u{110D}\u{1174}\u{11B6}", - nfkc: "\u{CBFF}", - nfkd: "\u{110D}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{CC00}", - nfc: "\u{CC00}", - nfd: "\u{110D}\u{1174}\u{11B7}", - nfkc: "\u{CC00}", - nfkd: "\u{110D}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{CC01}", - nfc: "\u{CC01}", - nfd: "\u{110D}\u{1174}\u{11B8}", - nfkc: "\u{CC01}", - nfkd: "\u{110D}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{CC02}", - nfc: "\u{CC02}", - nfd: "\u{110D}\u{1174}\u{11B9}", - nfkc: "\u{CC02}", - nfkd: "\u{110D}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{CC03}", - nfc: "\u{CC03}", - nfd: "\u{110D}\u{1174}\u{11BA}", - nfkc: "\u{CC03}", - nfkd: "\u{110D}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{CC04}", - nfc: "\u{CC04}", - nfd: "\u{110D}\u{1174}\u{11BB}", - nfkc: "\u{CC04}", - nfkd: "\u{110D}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{CC05}", - nfc: "\u{CC05}", - nfd: "\u{110D}\u{1174}\u{11BC}", - nfkc: "\u{CC05}", - nfkd: "\u{110D}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{CC06}", - nfc: "\u{CC06}", - nfd: "\u{110D}\u{1174}\u{11BD}", - nfkc: "\u{CC06}", - nfkd: "\u{110D}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{CC07}", - nfc: "\u{CC07}", - nfd: "\u{110D}\u{1174}\u{11BE}", - nfkc: "\u{CC07}", - nfkd: "\u{110D}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{CC08}", - nfc: "\u{CC08}", - nfd: "\u{110D}\u{1174}\u{11BF}", - nfkc: "\u{CC08}", - nfkd: "\u{110D}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{CC09}", - nfc: "\u{CC09}", - nfd: "\u{110D}\u{1174}\u{11C0}", - nfkc: "\u{CC09}", - nfkd: "\u{110D}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{CC0A}", - nfc: "\u{CC0A}", - nfd: "\u{110D}\u{1174}\u{11C1}", - nfkc: "\u{CC0A}", - nfkd: "\u{110D}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{CC0B}", - nfc: "\u{CC0B}", - nfd: "\u{110D}\u{1174}\u{11C2}", - nfkc: "\u{CC0B}", - nfkd: "\u{110D}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{CC0C}", - nfc: "\u{CC0C}", - nfd: "\u{110D}\u{1175}", - nfkc: "\u{CC0C}", - nfkd: "\u{110D}\u{1175}", - }, - NormalizationTest { - source: "\u{CC0D}", - nfc: "\u{CC0D}", - nfd: "\u{110D}\u{1175}\u{11A8}", - nfkc: "\u{CC0D}", - nfkd: "\u{110D}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{CC0E}", - nfc: "\u{CC0E}", - nfd: "\u{110D}\u{1175}\u{11A9}", - nfkc: "\u{CC0E}", - nfkd: "\u{110D}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{CC0F}", - nfc: "\u{CC0F}", - nfd: "\u{110D}\u{1175}\u{11AA}", - nfkc: "\u{CC0F}", - nfkd: "\u{110D}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{CC10}", - nfc: "\u{CC10}", - nfd: "\u{110D}\u{1175}\u{11AB}", - nfkc: "\u{CC10}", - nfkd: "\u{110D}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{CC11}", - nfc: "\u{CC11}", - nfd: "\u{110D}\u{1175}\u{11AC}", - nfkc: "\u{CC11}", - nfkd: "\u{110D}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{CC12}", - nfc: "\u{CC12}", - nfd: "\u{110D}\u{1175}\u{11AD}", - nfkc: "\u{CC12}", - nfkd: "\u{110D}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{CC13}", - nfc: "\u{CC13}", - nfd: "\u{110D}\u{1175}\u{11AE}", - nfkc: "\u{CC13}", - nfkd: "\u{110D}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{CC14}", - nfc: "\u{CC14}", - nfd: "\u{110D}\u{1175}\u{11AF}", - nfkc: "\u{CC14}", - nfkd: "\u{110D}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{CC15}", - nfc: "\u{CC15}", - nfd: "\u{110D}\u{1175}\u{11B0}", - nfkc: "\u{CC15}", - nfkd: "\u{110D}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{CC16}", - nfc: "\u{CC16}", - nfd: "\u{110D}\u{1175}\u{11B1}", - nfkc: "\u{CC16}", - nfkd: "\u{110D}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{CC17}", - nfc: "\u{CC17}", - nfd: "\u{110D}\u{1175}\u{11B2}", - nfkc: "\u{CC17}", - nfkd: "\u{110D}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{CC18}", - nfc: "\u{CC18}", - nfd: "\u{110D}\u{1175}\u{11B3}", - nfkc: "\u{CC18}", - nfkd: "\u{110D}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{CC19}", - nfc: "\u{CC19}", - nfd: "\u{110D}\u{1175}\u{11B4}", - nfkc: "\u{CC19}", - nfkd: "\u{110D}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{CC1A}", - nfc: "\u{CC1A}", - nfd: "\u{110D}\u{1175}\u{11B5}", - nfkc: "\u{CC1A}", - nfkd: "\u{110D}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{CC1B}", - nfc: "\u{CC1B}", - nfd: "\u{110D}\u{1175}\u{11B6}", - nfkc: "\u{CC1B}", - nfkd: "\u{110D}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{CC1C}", - nfc: "\u{CC1C}", - nfd: "\u{110D}\u{1175}\u{11B7}", - nfkc: "\u{CC1C}", - nfkd: "\u{110D}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{CC1D}", - nfc: "\u{CC1D}", - nfd: "\u{110D}\u{1175}\u{11B8}", - nfkc: "\u{CC1D}", - nfkd: "\u{110D}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{CC1E}", - nfc: "\u{CC1E}", - nfd: "\u{110D}\u{1175}\u{11B9}", - nfkc: "\u{CC1E}", - nfkd: "\u{110D}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{CC1F}", - nfc: "\u{CC1F}", - nfd: "\u{110D}\u{1175}\u{11BA}", - nfkc: "\u{CC1F}", - nfkd: "\u{110D}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{CC20}", - nfc: "\u{CC20}", - nfd: "\u{110D}\u{1175}\u{11BB}", - nfkc: "\u{CC20}", - nfkd: "\u{110D}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{CC21}", - nfc: "\u{CC21}", - nfd: "\u{110D}\u{1175}\u{11BC}", - nfkc: "\u{CC21}", - nfkd: "\u{110D}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{CC22}", - nfc: "\u{CC22}", - nfd: "\u{110D}\u{1175}\u{11BD}", - nfkc: "\u{CC22}", - nfkd: "\u{110D}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{CC23}", - nfc: "\u{CC23}", - nfd: "\u{110D}\u{1175}\u{11BE}", - nfkc: "\u{CC23}", - nfkd: "\u{110D}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{CC24}", - nfc: "\u{CC24}", - nfd: "\u{110D}\u{1175}\u{11BF}", - nfkc: "\u{CC24}", - nfkd: "\u{110D}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{CC25}", - nfc: "\u{CC25}", - nfd: "\u{110D}\u{1175}\u{11C0}", - nfkc: "\u{CC25}", - nfkd: "\u{110D}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{CC26}", - nfc: "\u{CC26}", - nfd: "\u{110D}\u{1175}\u{11C1}", - nfkc: "\u{CC26}", - nfkd: "\u{110D}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{CC27}", - nfc: "\u{CC27}", - nfd: "\u{110D}\u{1175}\u{11C2}", - nfkc: "\u{CC27}", - nfkd: "\u{110D}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{CC28}", - nfc: "\u{CC28}", - nfd: "\u{110E}\u{1161}", - nfkc: "\u{CC28}", - nfkd: "\u{110E}\u{1161}", - }, - NormalizationTest { - source: "\u{CC29}", - nfc: "\u{CC29}", - nfd: "\u{110E}\u{1161}\u{11A8}", - nfkc: "\u{CC29}", - nfkd: "\u{110E}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{CC2A}", - nfc: "\u{CC2A}", - nfd: "\u{110E}\u{1161}\u{11A9}", - nfkc: "\u{CC2A}", - nfkd: "\u{110E}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{CC2B}", - nfc: "\u{CC2B}", - nfd: "\u{110E}\u{1161}\u{11AA}", - nfkc: "\u{CC2B}", - nfkd: "\u{110E}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{CC2C}", - nfc: "\u{CC2C}", - nfd: "\u{110E}\u{1161}\u{11AB}", - nfkc: "\u{CC2C}", - nfkd: "\u{110E}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{CC2D}", - nfc: "\u{CC2D}", - nfd: "\u{110E}\u{1161}\u{11AC}", - nfkc: "\u{CC2D}", - nfkd: "\u{110E}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{CC2E}", - nfc: "\u{CC2E}", - nfd: "\u{110E}\u{1161}\u{11AD}", - nfkc: "\u{CC2E}", - nfkd: "\u{110E}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{CC2F}", - nfc: "\u{CC2F}", - nfd: "\u{110E}\u{1161}\u{11AE}", - nfkc: "\u{CC2F}", - nfkd: "\u{110E}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{CC30}", - nfc: "\u{CC30}", - nfd: "\u{110E}\u{1161}\u{11AF}", - nfkc: "\u{CC30}", - nfkd: "\u{110E}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{CC31}", - nfc: "\u{CC31}", - nfd: "\u{110E}\u{1161}\u{11B0}", - nfkc: "\u{CC31}", - nfkd: "\u{110E}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{CC32}", - nfc: "\u{CC32}", - nfd: "\u{110E}\u{1161}\u{11B1}", - nfkc: "\u{CC32}", - nfkd: "\u{110E}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{CC33}", - nfc: "\u{CC33}", - nfd: "\u{110E}\u{1161}\u{11B2}", - nfkc: "\u{CC33}", - nfkd: "\u{110E}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{CC34}", - nfc: "\u{CC34}", - nfd: "\u{110E}\u{1161}\u{11B3}", - nfkc: "\u{CC34}", - nfkd: "\u{110E}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{CC35}", - nfc: "\u{CC35}", - nfd: "\u{110E}\u{1161}\u{11B4}", - nfkc: "\u{CC35}", - nfkd: "\u{110E}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{CC36}", - nfc: "\u{CC36}", - nfd: "\u{110E}\u{1161}\u{11B5}", - nfkc: "\u{CC36}", - nfkd: "\u{110E}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{CC37}", - nfc: "\u{CC37}", - nfd: "\u{110E}\u{1161}\u{11B6}", - nfkc: "\u{CC37}", - nfkd: "\u{110E}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{CC38}", - nfc: "\u{CC38}", - nfd: "\u{110E}\u{1161}\u{11B7}", - nfkc: "\u{CC38}", - nfkd: "\u{110E}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{CC39}", - nfc: "\u{CC39}", - nfd: "\u{110E}\u{1161}\u{11B8}", - nfkc: "\u{CC39}", - nfkd: "\u{110E}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{CC3A}", - nfc: "\u{CC3A}", - nfd: "\u{110E}\u{1161}\u{11B9}", - nfkc: "\u{CC3A}", - nfkd: "\u{110E}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{CC3B}", - nfc: "\u{CC3B}", - nfd: "\u{110E}\u{1161}\u{11BA}", - nfkc: "\u{CC3B}", - nfkd: "\u{110E}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{CC3C}", - nfc: "\u{CC3C}", - nfd: "\u{110E}\u{1161}\u{11BB}", - nfkc: "\u{CC3C}", - nfkd: "\u{110E}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{CC3D}", - nfc: "\u{CC3D}", - nfd: "\u{110E}\u{1161}\u{11BC}", - nfkc: "\u{CC3D}", - nfkd: "\u{110E}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{CC3E}", - nfc: "\u{CC3E}", - nfd: "\u{110E}\u{1161}\u{11BD}", - nfkc: "\u{CC3E}", - nfkd: "\u{110E}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{CC3F}", - nfc: "\u{CC3F}", - nfd: "\u{110E}\u{1161}\u{11BE}", - nfkc: "\u{CC3F}", - nfkd: "\u{110E}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{CC40}", - nfc: "\u{CC40}", - nfd: "\u{110E}\u{1161}\u{11BF}", - nfkc: "\u{CC40}", - nfkd: "\u{110E}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{CC41}", - nfc: "\u{CC41}", - nfd: "\u{110E}\u{1161}\u{11C0}", - nfkc: "\u{CC41}", - nfkd: "\u{110E}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{CC42}", - nfc: "\u{CC42}", - nfd: "\u{110E}\u{1161}\u{11C1}", - nfkc: "\u{CC42}", - nfkd: "\u{110E}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{CC43}", - nfc: "\u{CC43}", - nfd: "\u{110E}\u{1161}\u{11C2}", - nfkc: "\u{CC43}", - nfkd: "\u{110E}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{CC44}", - nfc: "\u{CC44}", - nfd: "\u{110E}\u{1162}", - nfkc: "\u{CC44}", - nfkd: "\u{110E}\u{1162}", - }, - NormalizationTest { - source: "\u{CC45}", - nfc: "\u{CC45}", - nfd: "\u{110E}\u{1162}\u{11A8}", - nfkc: "\u{CC45}", - nfkd: "\u{110E}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{CC46}", - nfc: "\u{CC46}", - nfd: "\u{110E}\u{1162}\u{11A9}", - nfkc: "\u{CC46}", - nfkd: "\u{110E}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{CC47}", - nfc: "\u{CC47}", - nfd: "\u{110E}\u{1162}\u{11AA}", - nfkc: "\u{CC47}", - nfkd: "\u{110E}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{CC48}", - nfc: "\u{CC48}", - nfd: "\u{110E}\u{1162}\u{11AB}", - nfkc: "\u{CC48}", - nfkd: "\u{110E}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{CC49}", - nfc: "\u{CC49}", - nfd: "\u{110E}\u{1162}\u{11AC}", - nfkc: "\u{CC49}", - nfkd: "\u{110E}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{CC4A}", - nfc: "\u{CC4A}", - nfd: "\u{110E}\u{1162}\u{11AD}", - nfkc: "\u{CC4A}", - nfkd: "\u{110E}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{CC4B}", - nfc: "\u{CC4B}", - nfd: "\u{110E}\u{1162}\u{11AE}", - nfkc: "\u{CC4B}", - nfkd: "\u{110E}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{CC4C}", - nfc: "\u{CC4C}", - nfd: "\u{110E}\u{1162}\u{11AF}", - nfkc: "\u{CC4C}", - nfkd: "\u{110E}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{CC4D}", - nfc: "\u{CC4D}", - nfd: "\u{110E}\u{1162}\u{11B0}", - nfkc: "\u{CC4D}", - nfkd: "\u{110E}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{CC4E}", - nfc: "\u{CC4E}", - nfd: "\u{110E}\u{1162}\u{11B1}", - nfkc: "\u{CC4E}", - nfkd: "\u{110E}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{CC4F}", - nfc: "\u{CC4F}", - nfd: "\u{110E}\u{1162}\u{11B2}", - nfkc: "\u{CC4F}", - nfkd: "\u{110E}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{CC50}", - nfc: "\u{CC50}", - nfd: "\u{110E}\u{1162}\u{11B3}", - nfkc: "\u{CC50}", - nfkd: "\u{110E}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{CC51}", - nfc: "\u{CC51}", - nfd: "\u{110E}\u{1162}\u{11B4}", - nfkc: "\u{CC51}", - nfkd: "\u{110E}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{CC52}", - nfc: "\u{CC52}", - nfd: "\u{110E}\u{1162}\u{11B5}", - nfkc: "\u{CC52}", - nfkd: "\u{110E}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{CC53}", - nfc: "\u{CC53}", - nfd: "\u{110E}\u{1162}\u{11B6}", - nfkc: "\u{CC53}", - nfkd: "\u{110E}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{CC54}", - nfc: "\u{CC54}", - nfd: "\u{110E}\u{1162}\u{11B7}", - nfkc: "\u{CC54}", - nfkd: "\u{110E}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{CC55}", - nfc: "\u{CC55}", - nfd: "\u{110E}\u{1162}\u{11B8}", - nfkc: "\u{CC55}", - nfkd: "\u{110E}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{CC56}", - nfc: "\u{CC56}", - nfd: "\u{110E}\u{1162}\u{11B9}", - nfkc: "\u{CC56}", - nfkd: "\u{110E}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{CC57}", - nfc: "\u{CC57}", - nfd: "\u{110E}\u{1162}\u{11BA}", - nfkc: "\u{CC57}", - nfkd: "\u{110E}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{CC58}", - nfc: "\u{CC58}", - nfd: "\u{110E}\u{1162}\u{11BB}", - nfkc: "\u{CC58}", - nfkd: "\u{110E}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{CC59}", - nfc: "\u{CC59}", - nfd: "\u{110E}\u{1162}\u{11BC}", - nfkc: "\u{CC59}", - nfkd: "\u{110E}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{CC5A}", - nfc: "\u{CC5A}", - nfd: "\u{110E}\u{1162}\u{11BD}", - nfkc: "\u{CC5A}", - nfkd: "\u{110E}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{CC5B}", - nfc: "\u{CC5B}", - nfd: "\u{110E}\u{1162}\u{11BE}", - nfkc: "\u{CC5B}", - nfkd: "\u{110E}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{CC5C}", - nfc: "\u{CC5C}", - nfd: "\u{110E}\u{1162}\u{11BF}", - nfkc: "\u{CC5C}", - nfkd: "\u{110E}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{CC5D}", - nfc: "\u{CC5D}", - nfd: "\u{110E}\u{1162}\u{11C0}", - nfkc: "\u{CC5D}", - nfkd: "\u{110E}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{CC5E}", - nfc: "\u{CC5E}", - nfd: "\u{110E}\u{1162}\u{11C1}", - nfkc: "\u{CC5E}", - nfkd: "\u{110E}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{CC5F}", - nfc: "\u{CC5F}", - nfd: "\u{110E}\u{1162}\u{11C2}", - nfkc: "\u{CC5F}", - nfkd: "\u{110E}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{CC60}", - nfc: "\u{CC60}", - nfd: "\u{110E}\u{1163}", - nfkc: "\u{CC60}", - nfkd: "\u{110E}\u{1163}", - }, - NormalizationTest { - source: "\u{CC61}", - nfc: "\u{CC61}", - nfd: "\u{110E}\u{1163}\u{11A8}", - nfkc: "\u{CC61}", - nfkd: "\u{110E}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{CC62}", - nfc: "\u{CC62}", - nfd: "\u{110E}\u{1163}\u{11A9}", - nfkc: "\u{CC62}", - nfkd: "\u{110E}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{CC63}", - nfc: "\u{CC63}", - nfd: "\u{110E}\u{1163}\u{11AA}", - nfkc: "\u{CC63}", - nfkd: "\u{110E}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{CC64}", - nfc: "\u{CC64}", - nfd: "\u{110E}\u{1163}\u{11AB}", - nfkc: "\u{CC64}", - nfkd: "\u{110E}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{CC65}", - nfc: "\u{CC65}", - nfd: "\u{110E}\u{1163}\u{11AC}", - nfkc: "\u{CC65}", - nfkd: "\u{110E}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{CC66}", - nfc: "\u{CC66}", - nfd: "\u{110E}\u{1163}\u{11AD}", - nfkc: "\u{CC66}", - nfkd: "\u{110E}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{CC67}", - nfc: "\u{CC67}", - nfd: "\u{110E}\u{1163}\u{11AE}", - nfkc: "\u{CC67}", - nfkd: "\u{110E}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{CC68}", - nfc: "\u{CC68}", - nfd: "\u{110E}\u{1163}\u{11AF}", - nfkc: "\u{CC68}", - nfkd: "\u{110E}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{CC69}", - nfc: "\u{CC69}", - nfd: "\u{110E}\u{1163}\u{11B0}", - nfkc: "\u{CC69}", - nfkd: "\u{110E}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{CC6A}", - nfc: "\u{CC6A}", - nfd: "\u{110E}\u{1163}\u{11B1}", - nfkc: "\u{CC6A}", - nfkd: "\u{110E}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{CC6B}", - nfc: "\u{CC6B}", - nfd: "\u{110E}\u{1163}\u{11B2}", - nfkc: "\u{CC6B}", - nfkd: "\u{110E}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{CC6C}", - nfc: "\u{CC6C}", - nfd: "\u{110E}\u{1163}\u{11B3}", - nfkc: "\u{CC6C}", - nfkd: "\u{110E}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{CC6D}", - nfc: "\u{CC6D}", - nfd: "\u{110E}\u{1163}\u{11B4}", - nfkc: "\u{CC6D}", - nfkd: "\u{110E}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{CC6E}", - nfc: "\u{CC6E}", - nfd: "\u{110E}\u{1163}\u{11B5}", - nfkc: "\u{CC6E}", - nfkd: "\u{110E}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{CC6F}", - nfc: "\u{CC6F}", - nfd: "\u{110E}\u{1163}\u{11B6}", - nfkc: "\u{CC6F}", - nfkd: "\u{110E}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{CC70}", - nfc: "\u{CC70}", - nfd: "\u{110E}\u{1163}\u{11B7}", - nfkc: "\u{CC70}", - nfkd: "\u{110E}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{CC71}", - nfc: "\u{CC71}", - nfd: "\u{110E}\u{1163}\u{11B8}", - nfkc: "\u{CC71}", - nfkd: "\u{110E}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{CC72}", - nfc: "\u{CC72}", - nfd: "\u{110E}\u{1163}\u{11B9}", - nfkc: "\u{CC72}", - nfkd: "\u{110E}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{CC73}", - nfc: "\u{CC73}", - nfd: "\u{110E}\u{1163}\u{11BA}", - nfkc: "\u{CC73}", - nfkd: "\u{110E}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{CC74}", - nfc: "\u{CC74}", - nfd: "\u{110E}\u{1163}\u{11BB}", - nfkc: "\u{CC74}", - nfkd: "\u{110E}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{CC75}", - nfc: "\u{CC75}", - nfd: "\u{110E}\u{1163}\u{11BC}", - nfkc: "\u{CC75}", - nfkd: "\u{110E}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{CC76}", - nfc: "\u{CC76}", - nfd: "\u{110E}\u{1163}\u{11BD}", - nfkc: "\u{CC76}", - nfkd: "\u{110E}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{CC77}", - nfc: "\u{CC77}", - nfd: "\u{110E}\u{1163}\u{11BE}", - nfkc: "\u{CC77}", - nfkd: "\u{110E}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{CC78}", - nfc: "\u{CC78}", - nfd: "\u{110E}\u{1163}\u{11BF}", - nfkc: "\u{CC78}", - nfkd: "\u{110E}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{CC79}", - nfc: "\u{CC79}", - nfd: "\u{110E}\u{1163}\u{11C0}", - nfkc: "\u{CC79}", - nfkd: "\u{110E}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{CC7A}", - nfc: "\u{CC7A}", - nfd: "\u{110E}\u{1163}\u{11C1}", - nfkc: "\u{CC7A}", - nfkd: "\u{110E}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{CC7B}", - nfc: "\u{CC7B}", - nfd: "\u{110E}\u{1163}\u{11C2}", - nfkc: "\u{CC7B}", - nfkd: "\u{110E}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{CC7C}", - nfc: "\u{CC7C}", - nfd: "\u{110E}\u{1164}", - nfkc: "\u{CC7C}", - nfkd: "\u{110E}\u{1164}", - }, - NormalizationTest { - source: "\u{CC7D}", - nfc: "\u{CC7D}", - nfd: "\u{110E}\u{1164}\u{11A8}", - nfkc: "\u{CC7D}", - nfkd: "\u{110E}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{CC7E}", - nfc: "\u{CC7E}", - nfd: "\u{110E}\u{1164}\u{11A9}", - nfkc: "\u{CC7E}", - nfkd: "\u{110E}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{CC7F}", - nfc: "\u{CC7F}", - nfd: "\u{110E}\u{1164}\u{11AA}", - nfkc: "\u{CC7F}", - nfkd: "\u{110E}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{CC80}", - nfc: "\u{CC80}", - nfd: "\u{110E}\u{1164}\u{11AB}", - nfkc: "\u{CC80}", - nfkd: "\u{110E}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{CC81}", - nfc: "\u{CC81}", - nfd: "\u{110E}\u{1164}\u{11AC}", - nfkc: "\u{CC81}", - nfkd: "\u{110E}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{CC82}", - nfc: "\u{CC82}", - nfd: "\u{110E}\u{1164}\u{11AD}", - nfkc: "\u{CC82}", - nfkd: "\u{110E}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{CC83}", - nfc: "\u{CC83}", - nfd: "\u{110E}\u{1164}\u{11AE}", - nfkc: "\u{CC83}", - nfkd: "\u{110E}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{CC84}", - nfc: "\u{CC84}", - nfd: "\u{110E}\u{1164}\u{11AF}", - nfkc: "\u{CC84}", - nfkd: "\u{110E}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{CC85}", - nfc: "\u{CC85}", - nfd: "\u{110E}\u{1164}\u{11B0}", - nfkc: "\u{CC85}", - nfkd: "\u{110E}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{CC86}", - nfc: "\u{CC86}", - nfd: "\u{110E}\u{1164}\u{11B1}", - nfkc: "\u{CC86}", - nfkd: "\u{110E}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{CC87}", - nfc: "\u{CC87}", - nfd: "\u{110E}\u{1164}\u{11B2}", - nfkc: "\u{CC87}", - nfkd: "\u{110E}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{CC88}", - nfc: "\u{CC88}", - nfd: "\u{110E}\u{1164}\u{11B3}", - nfkc: "\u{CC88}", - nfkd: "\u{110E}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{CC89}", - nfc: "\u{CC89}", - nfd: "\u{110E}\u{1164}\u{11B4}", - nfkc: "\u{CC89}", - nfkd: "\u{110E}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{CC8A}", - nfc: "\u{CC8A}", - nfd: "\u{110E}\u{1164}\u{11B5}", - nfkc: "\u{CC8A}", - nfkd: "\u{110E}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{CC8B}", - nfc: "\u{CC8B}", - nfd: "\u{110E}\u{1164}\u{11B6}", - nfkc: "\u{CC8B}", - nfkd: "\u{110E}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{CC8C}", - nfc: "\u{CC8C}", - nfd: "\u{110E}\u{1164}\u{11B7}", - nfkc: "\u{CC8C}", - nfkd: "\u{110E}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{CC8D}", - nfc: "\u{CC8D}", - nfd: "\u{110E}\u{1164}\u{11B8}", - nfkc: "\u{CC8D}", - nfkd: "\u{110E}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{CC8E}", - nfc: "\u{CC8E}", - nfd: "\u{110E}\u{1164}\u{11B9}", - nfkc: "\u{CC8E}", - nfkd: "\u{110E}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{CC8F}", - nfc: "\u{CC8F}", - nfd: "\u{110E}\u{1164}\u{11BA}", - nfkc: "\u{CC8F}", - nfkd: "\u{110E}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{CC90}", - nfc: "\u{CC90}", - nfd: "\u{110E}\u{1164}\u{11BB}", - nfkc: "\u{CC90}", - nfkd: "\u{110E}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{CC91}", - nfc: "\u{CC91}", - nfd: "\u{110E}\u{1164}\u{11BC}", - nfkc: "\u{CC91}", - nfkd: "\u{110E}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{CC92}", - nfc: "\u{CC92}", - nfd: "\u{110E}\u{1164}\u{11BD}", - nfkc: "\u{CC92}", - nfkd: "\u{110E}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{CC93}", - nfc: "\u{CC93}", - nfd: "\u{110E}\u{1164}\u{11BE}", - nfkc: "\u{CC93}", - nfkd: "\u{110E}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{CC94}", - nfc: "\u{CC94}", - nfd: "\u{110E}\u{1164}\u{11BF}", - nfkc: "\u{CC94}", - nfkd: "\u{110E}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{CC95}", - nfc: "\u{CC95}", - nfd: "\u{110E}\u{1164}\u{11C0}", - nfkc: "\u{CC95}", - nfkd: "\u{110E}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{CC96}", - nfc: "\u{CC96}", - nfd: "\u{110E}\u{1164}\u{11C1}", - nfkc: "\u{CC96}", - nfkd: "\u{110E}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{CC97}", - nfc: "\u{CC97}", - nfd: "\u{110E}\u{1164}\u{11C2}", - nfkc: "\u{CC97}", - nfkd: "\u{110E}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{CC98}", - nfc: "\u{CC98}", - nfd: "\u{110E}\u{1165}", - nfkc: "\u{CC98}", - nfkd: "\u{110E}\u{1165}", - }, - NormalizationTest { - source: "\u{CC99}", - nfc: "\u{CC99}", - nfd: "\u{110E}\u{1165}\u{11A8}", - nfkc: "\u{CC99}", - nfkd: "\u{110E}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{CC9A}", - nfc: "\u{CC9A}", - nfd: "\u{110E}\u{1165}\u{11A9}", - nfkc: "\u{CC9A}", - nfkd: "\u{110E}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{CC9B}", - nfc: "\u{CC9B}", - nfd: "\u{110E}\u{1165}\u{11AA}", - nfkc: "\u{CC9B}", - nfkd: "\u{110E}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{CC9C}", - nfc: "\u{CC9C}", - nfd: "\u{110E}\u{1165}\u{11AB}", - nfkc: "\u{CC9C}", - nfkd: "\u{110E}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{CC9D}", - nfc: "\u{CC9D}", - nfd: "\u{110E}\u{1165}\u{11AC}", - nfkc: "\u{CC9D}", - nfkd: "\u{110E}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{CC9E}", - nfc: "\u{CC9E}", - nfd: "\u{110E}\u{1165}\u{11AD}", - nfkc: "\u{CC9E}", - nfkd: "\u{110E}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{CC9F}", - nfc: "\u{CC9F}", - nfd: "\u{110E}\u{1165}\u{11AE}", - nfkc: "\u{CC9F}", - nfkd: "\u{110E}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{CCA0}", - nfc: "\u{CCA0}", - nfd: "\u{110E}\u{1165}\u{11AF}", - nfkc: "\u{CCA0}", - nfkd: "\u{110E}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{CCA1}", - nfc: "\u{CCA1}", - nfd: "\u{110E}\u{1165}\u{11B0}", - nfkc: "\u{CCA1}", - nfkd: "\u{110E}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{CCA2}", - nfc: "\u{CCA2}", - nfd: "\u{110E}\u{1165}\u{11B1}", - nfkc: "\u{CCA2}", - nfkd: "\u{110E}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{CCA3}", - nfc: "\u{CCA3}", - nfd: "\u{110E}\u{1165}\u{11B2}", - nfkc: "\u{CCA3}", - nfkd: "\u{110E}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{CCA4}", - nfc: "\u{CCA4}", - nfd: "\u{110E}\u{1165}\u{11B3}", - nfkc: "\u{CCA4}", - nfkd: "\u{110E}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{CCA5}", - nfc: "\u{CCA5}", - nfd: "\u{110E}\u{1165}\u{11B4}", - nfkc: "\u{CCA5}", - nfkd: "\u{110E}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{CCA6}", - nfc: "\u{CCA6}", - nfd: "\u{110E}\u{1165}\u{11B5}", - nfkc: "\u{CCA6}", - nfkd: "\u{110E}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{CCA7}", - nfc: "\u{CCA7}", - nfd: "\u{110E}\u{1165}\u{11B6}", - nfkc: "\u{CCA7}", - nfkd: "\u{110E}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{CCA8}", - nfc: "\u{CCA8}", - nfd: "\u{110E}\u{1165}\u{11B7}", - nfkc: "\u{CCA8}", - nfkd: "\u{110E}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{CCA9}", - nfc: "\u{CCA9}", - nfd: "\u{110E}\u{1165}\u{11B8}", - nfkc: "\u{CCA9}", - nfkd: "\u{110E}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{CCAA}", - nfc: "\u{CCAA}", - nfd: "\u{110E}\u{1165}\u{11B9}", - nfkc: "\u{CCAA}", - nfkd: "\u{110E}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{CCAB}", - nfc: "\u{CCAB}", - nfd: "\u{110E}\u{1165}\u{11BA}", - nfkc: "\u{CCAB}", - nfkd: "\u{110E}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{CCAC}", - nfc: "\u{CCAC}", - nfd: "\u{110E}\u{1165}\u{11BB}", - nfkc: "\u{CCAC}", - nfkd: "\u{110E}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{CCAD}", - nfc: "\u{CCAD}", - nfd: "\u{110E}\u{1165}\u{11BC}", - nfkc: "\u{CCAD}", - nfkd: "\u{110E}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{CCAE}", - nfc: "\u{CCAE}", - nfd: "\u{110E}\u{1165}\u{11BD}", - nfkc: "\u{CCAE}", - nfkd: "\u{110E}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{CCAF}", - nfc: "\u{CCAF}", - nfd: "\u{110E}\u{1165}\u{11BE}", - nfkc: "\u{CCAF}", - nfkd: "\u{110E}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{CCB0}", - nfc: "\u{CCB0}", - nfd: "\u{110E}\u{1165}\u{11BF}", - nfkc: "\u{CCB0}", - nfkd: "\u{110E}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{CCB1}", - nfc: "\u{CCB1}", - nfd: "\u{110E}\u{1165}\u{11C0}", - nfkc: "\u{CCB1}", - nfkd: "\u{110E}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{CCB2}", - nfc: "\u{CCB2}", - nfd: "\u{110E}\u{1165}\u{11C1}", - nfkc: "\u{CCB2}", - nfkd: "\u{110E}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{CCB3}", - nfc: "\u{CCB3}", - nfd: "\u{110E}\u{1165}\u{11C2}", - nfkc: "\u{CCB3}", - nfkd: "\u{110E}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{CCB4}", - nfc: "\u{CCB4}", - nfd: "\u{110E}\u{1166}", - nfkc: "\u{CCB4}", - nfkd: "\u{110E}\u{1166}", - }, - NormalizationTest { - source: "\u{CCB5}", - nfc: "\u{CCB5}", - nfd: "\u{110E}\u{1166}\u{11A8}", - nfkc: "\u{CCB5}", - nfkd: "\u{110E}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{CCB6}", - nfc: "\u{CCB6}", - nfd: "\u{110E}\u{1166}\u{11A9}", - nfkc: "\u{CCB6}", - nfkd: "\u{110E}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{CCB7}", - nfc: "\u{CCB7}", - nfd: "\u{110E}\u{1166}\u{11AA}", - nfkc: "\u{CCB7}", - nfkd: "\u{110E}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{CCB8}", - nfc: "\u{CCB8}", - nfd: "\u{110E}\u{1166}\u{11AB}", - nfkc: "\u{CCB8}", - nfkd: "\u{110E}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{CCB9}", - nfc: "\u{CCB9}", - nfd: "\u{110E}\u{1166}\u{11AC}", - nfkc: "\u{CCB9}", - nfkd: "\u{110E}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{CCBA}", - nfc: "\u{CCBA}", - nfd: "\u{110E}\u{1166}\u{11AD}", - nfkc: "\u{CCBA}", - nfkd: "\u{110E}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{CCBB}", - nfc: "\u{CCBB}", - nfd: "\u{110E}\u{1166}\u{11AE}", - nfkc: "\u{CCBB}", - nfkd: "\u{110E}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{CCBC}", - nfc: "\u{CCBC}", - nfd: "\u{110E}\u{1166}\u{11AF}", - nfkc: "\u{CCBC}", - nfkd: "\u{110E}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{CCBD}", - nfc: "\u{CCBD}", - nfd: "\u{110E}\u{1166}\u{11B0}", - nfkc: "\u{CCBD}", - nfkd: "\u{110E}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{CCBE}", - nfc: "\u{CCBE}", - nfd: "\u{110E}\u{1166}\u{11B1}", - nfkc: "\u{CCBE}", - nfkd: "\u{110E}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{CCBF}", - nfc: "\u{CCBF}", - nfd: "\u{110E}\u{1166}\u{11B2}", - nfkc: "\u{CCBF}", - nfkd: "\u{110E}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{CCC0}", - nfc: "\u{CCC0}", - nfd: "\u{110E}\u{1166}\u{11B3}", - nfkc: "\u{CCC0}", - nfkd: "\u{110E}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{CCC1}", - nfc: "\u{CCC1}", - nfd: "\u{110E}\u{1166}\u{11B4}", - nfkc: "\u{CCC1}", - nfkd: "\u{110E}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{CCC2}", - nfc: "\u{CCC2}", - nfd: "\u{110E}\u{1166}\u{11B5}", - nfkc: "\u{CCC2}", - nfkd: "\u{110E}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{CCC3}", - nfc: "\u{CCC3}", - nfd: "\u{110E}\u{1166}\u{11B6}", - nfkc: "\u{CCC3}", - nfkd: "\u{110E}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{CCC4}", - nfc: "\u{CCC4}", - nfd: "\u{110E}\u{1166}\u{11B7}", - nfkc: "\u{CCC4}", - nfkd: "\u{110E}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{CCC5}", - nfc: "\u{CCC5}", - nfd: "\u{110E}\u{1166}\u{11B8}", - nfkc: "\u{CCC5}", - nfkd: "\u{110E}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{CCC6}", - nfc: "\u{CCC6}", - nfd: "\u{110E}\u{1166}\u{11B9}", - nfkc: "\u{CCC6}", - nfkd: "\u{110E}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{CCC7}", - nfc: "\u{CCC7}", - nfd: "\u{110E}\u{1166}\u{11BA}", - nfkc: "\u{CCC7}", - nfkd: "\u{110E}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{CCC8}", - nfc: "\u{CCC8}", - nfd: "\u{110E}\u{1166}\u{11BB}", - nfkc: "\u{CCC8}", - nfkd: "\u{110E}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{CCC9}", - nfc: "\u{CCC9}", - nfd: "\u{110E}\u{1166}\u{11BC}", - nfkc: "\u{CCC9}", - nfkd: "\u{110E}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{CCCA}", - nfc: "\u{CCCA}", - nfd: "\u{110E}\u{1166}\u{11BD}", - nfkc: "\u{CCCA}", - nfkd: "\u{110E}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{CCCB}", - nfc: "\u{CCCB}", - nfd: "\u{110E}\u{1166}\u{11BE}", - nfkc: "\u{CCCB}", - nfkd: "\u{110E}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{CCCC}", - nfc: "\u{CCCC}", - nfd: "\u{110E}\u{1166}\u{11BF}", - nfkc: "\u{CCCC}", - nfkd: "\u{110E}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{CCCD}", - nfc: "\u{CCCD}", - nfd: "\u{110E}\u{1166}\u{11C0}", - nfkc: "\u{CCCD}", - nfkd: "\u{110E}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{CCCE}", - nfc: "\u{CCCE}", - nfd: "\u{110E}\u{1166}\u{11C1}", - nfkc: "\u{CCCE}", - nfkd: "\u{110E}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{CCCF}", - nfc: "\u{CCCF}", - nfd: "\u{110E}\u{1166}\u{11C2}", - nfkc: "\u{CCCF}", - nfkd: "\u{110E}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{CCD0}", - nfc: "\u{CCD0}", - nfd: "\u{110E}\u{1167}", - nfkc: "\u{CCD0}", - nfkd: "\u{110E}\u{1167}", - }, - NormalizationTest { - source: "\u{CCD1}", - nfc: "\u{CCD1}", - nfd: "\u{110E}\u{1167}\u{11A8}", - nfkc: "\u{CCD1}", - nfkd: "\u{110E}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{CCD2}", - nfc: "\u{CCD2}", - nfd: "\u{110E}\u{1167}\u{11A9}", - nfkc: "\u{CCD2}", - nfkd: "\u{110E}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{CCD3}", - nfc: "\u{CCD3}", - nfd: "\u{110E}\u{1167}\u{11AA}", - nfkc: "\u{CCD3}", - nfkd: "\u{110E}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{CCD4}", - nfc: "\u{CCD4}", - nfd: "\u{110E}\u{1167}\u{11AB}", - nfkc: "\u{CCD4}", - nfkd: "\u{110E}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{CCD5}", - nfc: "\u{CCD5}", - nfd: "\u{110E}\u{1167}\u{11AC}", - nfkc: "\u{CCD5}", - nfkd: "\u{110E}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{CCD6}", - nfc: "\u{CCD6}", - nfd: "\u{110E}\u{1167}\u{11AD}", - nfkc: "\u{CCD6}", - nfkd: "\u{110E}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{CCD7}", - nfc: "\u{CCD7}", - nfd: "\u{110E}\u{1167}\u{11AE}", - nfkc: "\u{CCD7}", - nfkd: "\u{110E}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{CCD8}", - nfc: "\u{CCD8}", - nfd: "\u{110E}\u{1167}\u{11AF}", - nfkc: "\u{CCD8}", - nfkd: "\u{110E}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{CCD9}", - nfc: "\u{CCD9}", - nfd: "\u{110E}\u{1167}\u{11B0}", - nfkc: "\u{CCD9}", - nfkd: "\u{110E}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{CCDA}", - nfc: "\u{CCDA}", - nfd: "\u{110E}\u{1167}\u{11B1}", - nfkc: "\u{CCDA}", - nfkd: "\u{110E}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{CCDB}", - nfc: "\u{CCDB}", - nfd: "\u{110E}\u{1167}\u{11B2}", - nfkc: "\u{CCDB}", - nfkd: "\u{110E}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{CCDC}", - nfc: "\u{CCDC}", - nfd: "\u{110E}\u{1167}\u{11B3}", - nfkc: "\u{CCDC}", - nfkd: "\u{110E}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{CCDD}", - nfc: "\u{CCDD}", - nfd: "\u{110E}\u{1167}\u{11B4}", - nfkc: "\u{CCDD}", - nfkd: "\u{110E}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{CCDE}", - nfc: "\u{CCDE}", - nfd: "\u{110E}\u{1167}\u{11B5}", - nfkc: "\u{CCDE}", - nfkd: "\u{110E}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{CCDF}", - nfc: "\u{CCDF}", - nfd: "\u{110E}\u{1167}\u{11B6}", - nfkc: "\u{CCDF}", - nfkd: "\u{110E}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{CCE0}", - nfc: "\u{CCE0}", - nfd: "\u{110E}\u{1167}\u{11B7}", - nfkc: "\u{CCE0}", - nfkd: "\u{110E}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{CCE1}", - nfc: "\u{CCE1}", - nfd: "\u{110E}\u{1167}\u{11B8}", - nfkc: "\u{CCE1}", - nfkd: "\u{110E}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{CCE2}", - nfc: "\u{CCE2}", - nfd: "\u{110E}\u{1167}\u{11B9}", - nfkc: "\u{CCE2}", - nfkd: "\u{110E}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{CCE3}", - nfc: "\u{CCE3}", - nfd: "\u{110E}\u{1167}\u{11BA}", - nfkc: "\u{CCE3}", - nfkd: "\u{110E}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{CCE4}", - nfc: "\u{CCE4}", - nfd: "\u{110E}\u{1167}\u{11BB}", - nfkc: "\u{CCE4}", - nfkd: "\u{110E}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{CCE5}", - nfc: "\u{CCE5}", - nfd: "\u{110E}\u{1167}\u{11BC}", - nfkc: "\u{CCE5}", - nfkd: "\u{110E}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{CCE6}", - nfc: "\u{CCE6}", - nfd: "\u{110E}\u{1167}\u{11BD}", - nfkc: "\u{CCE6}", - nfkd: "\u{110E}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{CCE7}", - nfc: "\u{CCE7}", - nfd: "\u{110E}\u{1167}\u{11BE}", - nfkc: "\u{CCE7}", - nfkd: "\u{110E}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{CCE8}", - nfc: "\u{CCE8}", - nfd: "\u{110E}\u{1167}\u{11BF}", - nfkc: "\u{CCE8}", - nfkd: "\u{110E}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{CCE9}", - nfc: "\u{CCE9}", - nfd: "\u{110E}\u{1167}\u{11C0}", - nfkc: "\u{CCE9}", - nfkd: "\u{110E}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{CCEA}", - nfc: "\u{CCEA}", - nfd: "\u{110E}\u{1167}\u{11C1}", - nfkc: "\u{CCEA}", - nfkd: "\u{110E}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{CCEB}", - nfc: "\u{CCEB}", - nfd: "\u{110E}\u{1167}\u{11C2}", - nfkc: "\u{CCEB}", - nfkd: "\u{110E}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{CCEC}", - nfc: "\u{CCEC}", - nfd: "\u{110E}\u{1168}", - nfkc: "\u{CCEC}", - nfkd: "\u{110E}\u{1168}", - }, - NormalizationTest { - source: "\u{CCED}", - nfc: "\u{CCED}", - nfd: "\u{110E}\u{1168}\u{11A8}", - nfkc: "\u{CCED}", - nfkd: "\u{110E}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{CCEE}", - nfc: "\u{CCEE}", - nfd: "\u{110E}\u{1168}\u{11A9}", - nfkc: "\u{CCEE}", - nfkd: "\u{110E}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{CCEF}", - nfc: "\u{CCEF}", - nfd: "\u{110E}\u{1168}\u{11AA}", - nfkc: "\u{CCEF}", - nfkd: "\u{110E}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{CCF0}", - nfc: "\u{CCF0}", - nfd: "\u{110E}\u{1168}\u{11AB}", - nfkc: "\u{CCF0}", - nfkd: "\u{110E}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{CCF1}", - nfc: "\u{CCF1}", - nfd: "\u{110E}\u{1168}\u{11AC}", - nfkc: "\u{CCF1}", - nfkd: "\u{110E}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{CCF2}", - nfc: "\u{CCF2}", - nfd: "\u{110E}\u{1168}\u{11AD}", - nfkc: "\u{CCF2}", - nfkd: "\u{110E}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{CCF3}", - nfc: "\u{CCF3}", - nfd: "\u{110E}\u{1168}\u{11AE}", - nfkc: "\u{CCF3}", - nfkd: "\u{110E}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{CCF4}", - nfc: "\u{CCF4}", - nfd: "\u{110E}\u{1168}\u{11AF}", - nfkc: "\u{CCF4}", - nfkd: "\u{110E}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{CCF5}", - nfc: "\u{CCF5}", - nfd: "\u{110E}\u{1168}\u{11B0}", - nfkc: "\u{CCF5}", - nfkd: "\u{110E}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{CCF6}", - nfc: "\u{CCF6}", - nfd: "\u{110E}\u{1168}\u{11B1}", - nfkc: "\u{CCF6}", - nfkd: "\u{110E}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{CCF7}", - nfc: "\u{CCF7}", - nfd: "\u{110E}\u{1168}\u{11B2}", - nfkc: "\u{CCF7}", - nfkd: "\u{110E}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{CCF8}", - nfc: "\u{CCF8}", - nfd: "\u{110E}\u{1168}\u{11B3}", - nfkc: "\u{CCF8}", - nfkd: "\u{110E}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{CCF9}", - nfc: "\u{CCF9}", - nfd: "\u{110E}\u{1168}\u{11B4}", - nfkc: "\u{CCF9}", - nfkd: "\u{110E}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{CCFA}", - nfc: "\u{CCFA}", - nfd: "\u{110E}\u{1168}\u{11B5}", - nfkc: "\u{CCFA}", - nfkd: "\u{110E}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{CCFB}", - nfc: "\u{CCFB}", - nfd: "\u{110E}\u{1168}\u{11B6}", - nfkc: "\u{CCFB}", - nfkd: "\u{110E}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{CCFC}", - nfc: "\u{CCFC}", - nfd: "\u{110E}\u{1168}\u{11B7}", - nfkc: "\u{CCFC}", - nfkd: "\u{110E}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{CCFD}", - nfc: "\u{CCFD}", - nfd: "\u{110E}\u{1168}\u{11B8}", - nfkc: "\u{CCFD}", - nfkd: "\u{110E}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{CCFE}", - nfc: "\u{CCFE}", - nfd: "\u{110E}\u{1168}\u{11B9}", - nfkc: "\u{CCFE}", - nfkd: "\u{110E}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{CCFF}", - nfc: "\u{CCFF}", - nfd: "\u{110E}\u{1168}\u{11BA}", - nfkc: "\u{CCFF}", - nfkd: "\u{110E}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{CD00}", - nfc: "\u{CD00}", - nfd: "\u{110E}\u{1168}\u{11BB}", - nfkc: "\u{CD00}", - nfkd: "\u{110E}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{CD01}", - nfc: "\u{CD01}", - nfd: "\u{110E}\u{1168}\u{11BC}", - nfkc: "\u{CD01}", - nfkd: "\u{110E}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{CD02}", - nfc: "\u{CD02}", - nfd: "\u{110E}\u{1168}\u{11BD}", - nfkc: "\u{CD02}", - nfkd: "\u{110E}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{CD03}", - nfc: "\u{CD03}", - nfd: "\u{110E}\u{1168}\u{11BE}", - nfkc: "\u{CD03}", - nfkd: "\u{110E}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{CD04}", - nfc: "\u{CD04}", - nfd: "\u{110E}\u{1168}\u{11BF}", - nfkc: "\u{CD04}", - nfkd: "\u{110E}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{CD05}", - nfc: "\u{CD05}", - nfd: "\u{110E}\u{1168}\u{11C0}", - nfkc: "\u{CD05}", - nfkd: "\u{110E}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{CD06}", - nfc: "\u{CD06}", - nfd: "\u{110E}\u{1168}\u{11C1}", - nfkc: "\u{CD06}", - nfkd: "\u{110E}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{CD07}", - nfc: "\u{CD07}", - nfd: "\u{110E}\u{1168}\u{11C2}", - nfkc: "\u{CD07}", - nfkd: "\u{110E}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{CD08}", - nfc: "\u{CD08}", - nfd: "\u{110E}\u{1169}", - nfkc: "\u{CD08}", - nfkd: "\u{110E}\u{1169}", - }, - NormalizationTest { - source: "\u{CD09}", - nfc: "\u{CD09}", - nfd: "\u{110E}\u{1169}\u{11A8}", - nfkc: "\u{CD09}", - nfkd: "\u{110E}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{CD0A}", - nfc: "\u{CD0A}", - nfd: "\u{110E}\u{1169}\u{11A9}", - nfkc: "\u{CD0A}", - nfkd: "\u{110E}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{CD0B}", - nfc: "\u{CD0B}", - nfd: "\u{110E}\u{1169}\u{11AA}", - nfkc: "\u{CD0B}", - nfkd: "\u{110E}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{CD0C}", - nfc: "\u{CD0C}", - nfd: "\u{110E}\u{1169}\u{11AB}", - nfkc: "\u{CD0C}", - nfkd: "\u{110E}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{CD0D}", - nfc: "\u{CD0D}", - nfd: "\u{110E}\u{1169}\u{11AC}", - nfkc: "\u{CD0D}", - nfkd: "\u{110E}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{CD0E}", - nfc: "\u{CD0E}", - nfd: "\u{110E}\u{1169}\u{11AD}", - nfkc: "\u{CD0E}", - nfkd: "\u{110E}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{CD0F}", - nfc: "\u{CD0F}", - nfd: "\u{110E}\u{1169}\u{11AE}", - nfkc: "\u{CD0F}", - nfkd: "\u{110E}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{CD10}", - nfc: "\u{CD10}", - nfd: "\u{110E}\u{1169}\u{11AF}", - nfkc: "\u{CD10}", - nfkd: "\u{110E}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{CD11}", - nfc: "\u{CD11}", - nfd: "\u{110E}\u{1169}\u{11B0}", - nfkc: "\u{CD11}", - nfkd: "\u{110E}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{CD12}", - nfc: "\u{CD12}", - nfd: "\u{110E}\u{1169}\u{11B1}", - nfkc: "\u{CD12}", - nfkd: "\u{110E}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{CD13}", - nfc: "\u{CD13}", - nfd: "\u{110E}\u{1169}\u{11B2}", - nfkc: "\u{CD13}", - nfkd: "\u{110E}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{CD14}", - nfc: "\u{CD14}", - nfd: "\u{110E}\u{1169}\u{11B3}", - nfkc: "\u{CD14}", - nfkd: "\u{110E}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{CD15}", - nfc: "\u{CD15}", - nfd: "\u{110E}\u{1169}\u{11B4}", - nfkc: "\u{CD15}", - nfkd: "\u{110E}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{CD16}", - nfc: "\u{CD16}", - nfd: "\u{110E}\u{1169}\u{11B5}", - nfkc: "\u{CD16}", - nfkd: "\u{110E}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{CD17}", - nfc: "\u{CD17}", - nfd: "\u{110E}\u{1169}\u{11B6}", - nfkc: "\u{CD17}", - nfkd: "\u{110E}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{CD18}", - nfc: "\u{CD18}", - nfd: "\u{110E}\u{1169}\u{11B7}", - nfkc: "\u{CD18}", - nfkd: "\u{110E}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{CD19}", - nfc: "\u{CD19}", - nfd: "\u{110E}\u{1169}\u{11B8}", - nfkc: "\u{CD19}", - nfkd: "\u{110E}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{CD1A}", - nfc: "\u{CD1A}", - nfd: "\u{110E}\u{1169}\u{11B9}", - nfkc: "\u{CD1A}", - nfkd: "\u{110E}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{CD1B}", - nfc: "\u{CD1B}", - nfd: "\u{110E}\u{1169}\u{11BA}", - nfkc: "\u{CD1B}", - nfkd: "\u{110E}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{CD1C}", - nfc: "\u{CD1C}", - nfd: "\u{110E}\u{1169}\u{11BB}", - nfkc: "\u{CD1C}", - nfkd: "\u{110E}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{CD1D}", - nfc: "\u{CD1D}", - nfd: "\u{110E}\u{1169}\u{11BC}", - nfkc: "\u{CD1D}", - nfkd: "\u{110E}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{CD1E}", - nfc: "\u{CD1E}", - nfd: "\u{110E}\u{1169}\u{11BD}", - nfkc: "\u{CD1E}", - nfkd: "\u{110E}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{CD1F}", - nfc: "\u{CD1F}", - nfd: "\u{110E}\u{1169}\u{11BE}", - nfkc: "\u{CD1F}", - nfkd: "\u{110E}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{CD20}", - nfc: "\u{CD20}", - nfd: "\u{110E}\u{1169}\u{11BF}", - nfkc: "\u{CD20}", - nfkd: "\u{110E}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{CD21}", - nfc: "\u{CD21}", - nfd: "\u{110E}\u{1169}\u{11C0}", - nfkc: "\u{CD21}", - nfkd: "\u{110E}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{CD22}", - nfc: "\u{CD22}", - nfd: "\u{110E}\u{1169}\u{11C1}", - nfkc: "\u{CD22}", - nfkd: "\u{110E}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{CD23}", - nfc: "\u{CD23}", - nfd: "\u{110E}\u{1169}\u{11C2}", - nfkc: "\u{CD23}", - nfkd: "\u{110E}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{CD24}", - nfc: "\u{CD24}", - nfd: "\u{110E}\u{116A}", - nfkc: "\u{CD24}", - nfkd: "\u{110E}\u{116A}", - }, - NormalizationTest { - source: "\u{CD25}", - nfc: "\u{CD25}", - nfd: "\u{110E}\u{116A}\u{11A8}", - nfkc: "\u{CD25}", - nfkd: "\u{110E}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{CD26}", - nfc: "\u{CD26}", - nfd: "\u{110E}\u{116A}\u{11A9}", - nfkc: "\u{CD26}", - nfkd: "\u{110E}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{CD27}", - nfc: "\u{CD27}", - nfd: "\u{110E}\u{116A}\u{11AA}", - nfkc: "\u{CD27}", - nfkd: "\u{110E}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{CD28}", - nfc: "\u{CD28}", - nfd: "\u{110E}\u{116A}\u{11AB}", - nfkc: "\u{CD28}", - nfkd: "\u{110E}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{CD29}", - nfc: "\u{CD29}", - nfd: "\u{110E}\u{116A}\u{11AC}", - nfkc: "\u{CD29}", - nfkd: "\u{110E}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{CD2A}", - nfc: "\u{CD2A}", - nfd: "\u{110E}\u{116A}\u{11AD}", - nfkc: "\u{CD2A}", - nfkd: "\u{110E}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{CD2B}", - nfc: "\u{CD2B}", - nfd: "\u{110E}\u{116A}\u{11AE}", - nfkc: "\u{CD2B}", - nfkd: "\u{110E}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{CD2C}", - nfc: "\u{CD2C}", - nfd: "\u{110E}\u{116A}\u{11AF}", - nfkc: "\u{CD2C}", - nfkd: "\u{110E}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{CD2D}", - nfc: "\u{CD2D}", - nfd: "\u{110E}\u{116A}\u{11B0}", - nfkc: "\u{CD2D}", - nfkd: "\u{110E}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{CD2E}", - nfc: "\u{CD2E}", - nfd: "\u{110E}\u{116A}\u{11B1}", - nfkc: "\u{CD2E}", - nfkd: "\u{110E}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{CD2F}", - nfc: "\u{CD2F}", - nfd: "\u{110E}\u{116A}\u{11B2}", - nfkc: "\u{CD2F}", - nfkd: "\u{110E}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{CD30}", - nfc: "\u{CD30}", - nfd: "\u{110E}\u{116A}\u{11B3}", - nfkc: "\u{CD30}", - nfkd: "\u{110E}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{CD31}", - nfc: "\u{CD31}", - nfd: "\u{110E}\u{116A}\u{11B4}", - nfkc: "\u{CD31}", - nfkd: "\u{110E}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{CD32}", - nfc: "\u{CD32}", - nfd: "\u{110E}\u{116A}\u{11B5}", - nfkc: "\u{CD32}", - nfkd: "\u{110E}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{CD33}", - nfc: "\u{CD33}", - nfd: "\u{110E}\u{116A}\u{11B6}", - nfkc: "\u{CD33}", - nfkd: "\u{110E}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{CD34}", - nfc: "\u{CD34}", - nfd: "\u{110E}\u{116A}\u{11B7}", - nfkc: "\u{CD34}", - nfkd: "\u{110E}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{CD35}", - nfc: "\u{CD35}", - nfd: "\u{110E}\u{116A}\u{11B8}", - nfkc: "\u{CD35}", - nfkd: "\u{110E}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{CD36}", - nfc: "\u{CD36}", - nfd: "\u{110E}\u{116A}\u{11B9}", - nfkc: "\u{CD36}", - nfkd: "\u{110E}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{CD37}", - nfc: "\u{CD37}", - nfd: "\u{110E}\u{116A}\u{11BA}", - nfkc: "\u{CD37}", - nfkd: "\u{110E}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{CD38}", - nfc: "\u{CD38}", - nfd: "\u{110E}\u{116A}\u{11BB}", - nfkc: "\u{CD38}", - nfkd: "\u{110E}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{CD39}", - nfc: "\u{CD39}", - nfd: "\u{110E}\u{116A}\u{11BC}", - nfkc: "\u{CD39}", - nfkd: "\u{110E}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{CD3A}", - nfc: "\u{CD3A}", - nfd: "\u{110E}\u{116A}\u{11BD}", - nfkc: "\u{CD3A}", - nfkd: "\u{110E}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{CD3B}", - nfc: "\u{CD3B}", - nfd: "\u{110E}\u{116A}\u{11BE}", - nfkc: "\u{CD3B}", - nfkd: "\u{110E}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{CD3C}", - nfc: "\u{CD3C}", - nfd: "\u{110E}\u{116A}\u{11BF}", - nfkc: "\u{CD3C}", - nfkd: "\u{110E}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{CD3D}", - nfc: "\u{CD3D}", - nfd: "\u{110E}\u{116A}\u{11C0}", - nfkc: "\u{CD3D}", - nfkd: "\u{110E}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{CD3E}", - nfc: "\u{CD3E}", - nfd: "\u{110E}\u{116A}\u{11C1}", - nfkc: "\u{CD3E}", - nfkd: "\u{110E}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{CD3F}", - nfc: "\u{CD3F}", - nfd: "\u{110E}\u{116A}\u{11C2}", - nfkc: "\u{CD3F}", - nfkd: "\u{110E}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{CD40}", - nfc: "\u{CD40}", - nfd: "\u{110E}\u{116B}", - nfkc: "\u{CD40}", - nfkd: "\u{110E}\u{116B}", - }, - NormalizationTest { - source: "\u{CD41}", - nfc: "\u{CD41}", - nfd: "\u{110E}\u{116B}\u{11A8}", - nfkc: "\u{CD41}", - nfkd: "\u{110E}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{CD42}", - nfc: "\u{CD42}", - nfd: "\u{110E}\u{116B}\u{11A9}", - nfkc: "\u{CD42}", - nfkd: "\u{110E}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{CD43}", - nfc: "\u{CD43}", - nfd: "\u{110E}\u{116B}\u{11AA}", - nfkc: "\u{CD43}", - nfkd: "\u{110E}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{CD44}", - nfc: "\u{CD44}", - nfd: "\u{110E}\u{116B}\u{11AB}", - nfkc: "\u{CD44}", - nfkd: "\u{110E}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{CD45}", - nfc: "\u{CD45}", - nfd: "\u{110E}\u{116B}\u{11AC}", - nfkc: "\u{CD45}", - nfkd: "\u{110E}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{CD46}", - nfc: "\u{CD46}", - nfd: "\u{110E}\u{116B}\u{11AD}", - nfkc: "\u{CD46}", - nfkd: "\u{110E}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{CD47}", - nfc: "\u{CD47}", - nfd: "\u{110E}\u{116B}\u{11AE}", - nfkc: "\u{CD47}", - nfkd: "\u{110E}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{CD48}", - nfc: "\u{CD48}", - nfd: "\u{110E}\u{116B}\u{11AF}", - nfkc: "\u{CD48}", - nfkd: "\u{110E}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{CD49}", - nfc: "\u{CD49}", - nfd: "\u{110E}\u{116B}\u{11B0}", - nfkc: "\u{CD49}", - nfkd: "\u{110E}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{CD4A}", - nfc: "\u{CD4A}", - nfd: "\u{110E}\u{116B}\u{11B1}", - nfkc: "\u{CD4A}", - nfkd: "\u{110E}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{CD4B}", - nfc: "\u{CD4B}", - nfd: "\u{110E}\u{116B}\u{11B2}", - nfkc: "\u{CD4B}", - nfkd: "\u{110E}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{CD4C}", - nfc: "\u{CD4C}", - nfd: "\u{110E}\u{116B}\u{11B3}", - nfkc: "\u{CD4C}", - nfkd: "\u{110E}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{CD4D}", - nfc: "\u{CD4D}", - nfd: "\u{110E}\u{116B}\u{11B4}", - nfkc: "\u{CD4D}", - nfkd: "\u{110E}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{CD4E}", - nfc: "\u{CD4E}", - nfd: "\u{110E}\u{116B}\u{11B5}", - nfkc: "\u{CD4E}", - nfkd: "\u{110E}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{CD4F}", - nfc: "\u{CD4F}", - nfd: "\u{110E}\u{116B}\u{11B6}", - nfkc: "\u{CD4F}", - nfkd: "\u{110E}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{CD50}", - nfc: "\u{CD50}", - nfd: "\u{110E}\u{116B}\u{11B7}", - nfkc: "\u{CD50}", - nfkd: "\u{110E}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{CD51}", - nfc: "\u{CD51}", - nfd: "\u{110E}\u{116B}\u{11B8}", - nfkc: "\u{CD51}", - nfkd: "\u{110E}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{CD52}", - nfc: "\u{CD52}", - nfd: "\u{110E}\u{116B}\u{11B9}", - nfkc: "\u{CD52}", - nfkd: "\u{110E}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{CD53}", - nfc: "\u{CD53}", - nfd: "\u{110E}\u{116B}\u{11BA}", - nfkc: "\u{CD53}", - nfkd: "\u{110E}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{CD54}", - nfc: "\u{CD54}", - nfd: "\u{110E}\u{116B}\u{11BB}", - nfkc: "\u{CD54}", - nfkd: "\u{110E}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{CD55}", - nfc: "\u{CD55}", - nfd: "\u{110E}\u{116B}\u{11BC}", - nfkc: "\u{CD55}", - nfkd: "\u{110E}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{CD56}", - nfc: "\u{CD56}", - nfd: "\u{110E}\u{116B}\u{11BD}", - nfkc: "\u{CD56}", - nfkd: "\u{110E}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{CD57}", - nfc: "\u{CD57}", - nfd: "\u{110E}\u{116B}\u{11BE}", - nfkc: "\u{CD57}", - nfkd: "\u{110E}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{CD58}", - nfc: "\u{CD58}", - nfd: "\u{110E}\u{116B}\u{11BF}", - nfkc: "\u{CD58}", - nfkd: "\u{110E}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{CD59}", - nfc: "\u{CD59}", - nfd: "\u{110E}\u{116B}\u{11C0}", - nfkc: "\u{CD59}", - nfkd: "\u{110E}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{CD5A}", - nfc: "\u{CD5A}", - nfd: "\u{110E}\u{116B}\u{11C1}", - nfkc: "\u{CD5A}", - nfkd: "\u{110E}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{CD5B}", - nfc: "\u{CD5B}", - nfd: "\u{110E}\u{116B}\u{11C2}", - nfkc: "\u{CD5B}", - nfkd: "\u{110E}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{CD5C}", - nfc: "\u{CD5C}", - nfd: "\u{110E}\u{116C}", - nfkc: "\u{CD5C}", - nfkd: "\u{110E}\u{116C}", - }, - NormalizationTest { - source: "\u{CD5D}", - nfc: "\u{CD5D}", - nfd: "\u{110E}\u{116C}\u{11A8}", - nfkc: "\u{CD5D}", - nfkd: "\u{110E}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{CD5E}", - nfc: "\u{CD5E}", - nfd: "\u{110E}\u{116C}\u{11A9}", - nfkc: "\u{CD5E}", - nfkd: "\u{110E}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{CD5F}", - nfc: "\u{CD5F}", - nfd: "\u{110E}\u{116C}\u{11AA}", - nfkc: "\u{CD5F}", - nfkd: "\u{110E}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{CD60}", - nfc: "\u{CD60}", - nfd: "\u{110E}\u{116C}\u{11AB}", - nfkc: "\u{CD60}", - nfkd: "\u{110E}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{CD61}", - nfc: "\u{CD61}", - nfd: "\u{110E}\u{116C}\u{11AC}", - nfkc: "\u{CD61}", - nfkd: "\u{110E}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{CD62}", - nfc: "\u{CD62}", - nfd: "\u{110E}\u{116C}\u{11AD}", - nfkc: "\u{CD62}", - nfkd: "\u{110E}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{CD63}", - nfc: "\u{CD63}", - nfd: "\u{110E}\u{116C}\u{11AE}", - nfkc: "\u{CD63}", - nfkd: "\u{110E}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{CD64}", - nfc: "\u{CD64}", - nfd: "\u{110E}\u{116C}\u{11AF}", - nfkc: "\u{CD64}", - nfkd: "\u{110E}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{CD65}", - nfc: "\u{CD65}", - nfd: "\u{110E}\u{116C}\u{11B0}", - nfkc: "\u{CD65}", - nfkd: "\u{110E}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{CD66}", - nfc: "\u{CD66}", - nfd: "\u{110E}\u{116C}\u{11B1}", - nfkc: "\u{CD66}", - nfkd: "\u{110E}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{CD67}", - nfc: "\u{CD67}", - nfd: "\u{110E}\u{116C}\u{11B2}", - nfkc: "\u{CD67}", - nfkd: "\u{110E}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{CD68}", - nfc: "\u{CD68}", - nfd: "\u{110E}\u{116C}\u{11B3}", - nfkc: "\u{CD68}", - nfkd: "\u{110E}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{CD69}", - nfc: "\u{CD69}", - nfd: "\u{110E}\u{116C}\u{11B4}", - nfkc: "\u{CD69}", - nfkd: "\u{110E}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{CD6A}", - nfc: "\u{CD6A}", - nfd: "\u{110E}\u{116C}\u{11B5}", - nfkc: "\u{CD6A}", - nfkd: "\u{110E}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{CD6B}", - nfc: "\u{CD6B}", - nfd: "\u{110E}\u{116C}\u{11B6}", - nfkc: "\u{CD6B}", - nfkd: "\u{110E}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{CD6C}", - nfc: "\u{CD6C}", - nfd: "\u{110E}\u{116C}\u{11B7}", - nfkc: "\u{CD6C}", - nfkd: "\u{110E}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{CD6D}", - nfc: "\u{CD6D}", - nfd: "\u{110E}\u{116C}\u{11B8}", - nfkc: "\u{CD6D}", - nfkd: "\u{110E}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{CD6E}", - nfc: "\u{CD6E}", - nfd: "\u{110E}\u{116C}\u{11B9}", - nfkc: "\u{CD6E}", - nfkd: "\u{110E}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{CD6F}", - nfc: "\u{CD6F}", - nfd: "\u{110E}\u{116C}\u{11BA}", - nfkc: "\u{CD6F}", - nfkd: "\u{110E}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{CD70}", - nfc: "\u{CD70}", - nfd: "\u{110E}\u{116C}\u{11BB}", - nfkc: "\u{CD70}", - nfkd: "\u{110E}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{CD71}", - nfc: "\u{CD71}", - nfd: "\u{110E}\u{116C}\u{11BC}", - nfkc: "\u{CD71}", - nfkd: "\u{110E}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{CD72}", - nfc: "\u{CD72}", - nfd: "\u{110E}\u{116C}\u{11BD}", - nfkc: "\u{CD72}", - nfkd: "\u{110E}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{CD73}", - nfc: "\u{CD73}", - nfd: "\u{110E}\u{116C}\u{11BE}", - nfkc: "\u{CD73}", - nfkd: "\u{110E}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{CD74}", - nfc: "\u{CD74}", - nfd: "\u{110E}\u{116C}\u{11BF}", - nfkc: "\u{CD74}", - nfkd: "\u{110E}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{CD75}", - nfc: "\u{CD75}", - nfd: "\u{110E}\u{116C}\u{11C0}", - nfkc: "\u{CD75}", - nfkd: "\u{110E}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{CD76}", - nfc: "\u{CD76}", - nfd: "\u{110E}\u{116C}\u{11C1}", - nfkc: "\u{CD76}", - nfkd: "\u{110E}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{CD77}", - nfc: "\u{CD77}", - nfd: "\u{110E}\u{116C}\u{11C2}", - nfkc: "\u{CD77}", - nfkd: "\u{110E}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{CD78}", - nfc: "\u{CD78}", - nfd: "\u{110E}\u{116D}", - nfkc: "\u{CD78}", - nfkd: "\u{110E}\u{116D}", - }, - NormalizationTest { - source: "\u{CD79}", - nfc: "\u{CD79}", - nfd: "\u{110E}\u{116D}\u{11A8}", - nfkc: "\u{CD79}", - nfkd: "\u{110E}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{CD7A}", - nfc: "\u{CD7A}", - nfd: "\u{110E}\u{116D}\u{11A9}", - nfkc: "\u{CD7A}", - nfkd: "\u{110E}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{CD7B}", - nfc: "\u{CD7B}", - nfd: "\u{110E}\u{116D}\u{11AA}", - nfkc: "\u{CD7B}", - nfkd: "\u{110E}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{CD7C}", - nfc: "\u{CD7C}", - nfd: "\u{110E}\u{116D}\u{11AB}", - nfkc: "\u{CD7C}", - nfkd: "\u{110E}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{CD7D}", - nfc: "\u{CD7D}", - nfd: "\u{110E}\u{116D}\u{11AC}", - nfkc: "\u{CD7D}", - nfkd: "\u{110E}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{CD7E}", - nfc: "\u{CD7E}", - nfd: "\u{110E}\u{116D}\u{11AD}", - nfkc: "\u{CD7E}", - nfkd: "\u{110E}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{CD7F}", - nfc: "\u{CD7F}", - nfd: "\u{110E}\u{116D}\u{11AE}", - nfkc: "\u{CD7F}", - nfkd: "\u{110E}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{CD80}", - nfc: "\u{CD80}", - nfd: "\u{110E}\u{116D}\u{11AF}", - nfkc: "\u{CD80}", - nfkd: "\u{110E}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{CD81}", - nfc: "\u{CD81}", - nfd: "\u{110E}\u{116D}\u{11B0}", - nfkc: "\u{CD81}", - nfkd: "\u{110E}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{CD82}", - nfc: "\u{CD82}", - nfd: "\u{110E}\u{116D}\u{11B1}", - nfkc: "\u{CD82}", - nfkd: "\u{110E}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{CD83}", - nfc: "\u{CD83}", - nfd: "\u{110E}\u{116D}\u{11B2}", - nfkc: "\u{CD83}", - nfkd: "\u{110E}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{CD84}", - nfc: "\u{CD84}", - nfd: "\u{110E}\u{116D}\u{11B3}", - nfkc: "\u{CD84}", - nfkd: "\u{110E}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{CD85}", - nfc: "\u{CD85}", - nfd: "\u{110E}\u{116D}\u{11B4}", - nfkc: "\u{CD85}", - nfkd: "\u{110E}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{CD86}", - nfc: "\u{CD86}", - nfd: "\u{110E}\u{116D}\u{11B5}", - nfkc: "\u{CD86}", - nfkd: "\u{110E}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{CD87}", - nfc: "\u{CD87}", - nfd: "\u{110E}\u{116D}\u{11B6}", - nfkc: "\u{CD87}", - nfkd: "\u{110E}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{CD88}", - nfc: "\u{CD88}", - nfd: "\u{110E}\u{116D}\u{11B7}", - nfkc: "\u{CD88}", - nfkd: "\u{110E}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{CD89}", - nfc: "\u{CD89}", - nfd: "\u{110E}\u{116D}\u{11B8}", - nfkc: "\u{CD89}", - nfkd: "\u{110E}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{CD8A}", - nfc: "\u{CD8A}", - nfd: "\u{110E}\u{116D}\u{11B9}", - nfkc: "\u{CD8A}", - nfkd: "\u{110E}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{CD8B}", - nfc: "\u{CD8B}", - nfd: "\u{110E}\u{116D}\u{11BA}", - nfkc: "\u{CD8B}", - nfkd: "\u{110E}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{CD8C}", - nfc: "\u{CD8C}", - nfd: "\u{110E}\u{116D}\u{11BB}", - nfkc: "\u{CD8C}", - nfkd: "\u{110E}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{CD8D}", - nfc: "\u{CD8D}", - nfd: "\u{110E}\u{116D}\u{11BC}", - nfkc: "\u{CD8D}", - nfkd: "\u{110E}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{CD8E}", - nfc: "\u{CD8E}", - nfd: "\u{110E}\u{116D}\u{11BD}", - nfkc: "\u{CD8E}", - nfkd: "\u{110E}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{CD8F}", - nfc: "\u{CD8F}", - nfd: "\u{110E}\u{116D}\u{11BE}", - nfkc: "\u{CD8F}", - nfkd: "\u{110E}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{CD90}", - nfc: "\u{CD90}", - nfd: "\u{110E}\u{116D}\u{11BF}", - nfkc: "\u{CD90}", - nfkd: "\u{110E}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{CD91}", - nfc: "\u{CD91}", - nfd: "\u{110E}\u{116D}\u{11C0}", - nfkc: "\u{CD91}", - nfkd: "\u{110E}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{CD92}", - nfc: "\u{CD92}", - nfd: "\u{110E}\u{116D}\u{11C1}", - nfkc: "\u{CD92}", - nfkd: "\u{110E}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{CD93}", - nfc: "\u{CD93}", - nfd: "\u{110E}\u{116D}\u{11C2}", - nfkc: "\u{CD93}", - nfkd: "\u{110E}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{CD94}", - nfc: "\u{CD94}", - nfd: "\u{110E}\u{116E}", - nfkc: "\u{CD94}", - nfkd: "\u{110E}\u{116E}", - }, - NormalizationTest { - source: "\u{CD95}", - nfc: "\u{CD95}", - nfd: "\u{110E}\u{116E}\u{11A8}", - nfkc: "\u{CD95}", - nfkd: "\u{110E}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{CD96}", - nfc: "\u{CD96}", - nfd: "\u{110E}\u{116E}\u{11A9}", - nfkc: "\u{CD96}", - nfkd: "\u{110E}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{CD97}", - nfc: "\u{CD97}", - nfd: "\u{110E}\u{116E}\u{11AA}", - nfkc: "\u{CD97}", - nfkd: "\u{110E}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{CD98}", - nfc: "\u{CD98}", - nfd: "\u{110E}\u{116E}\u{11AB}", - nfkc: "\u{CD98}", - nfkd: "\u{110E}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{CD99}", - nfc: "\u{CD99}", - nfd: "\u{110E}\u{116E}\u{11AC}", - nfkc: "\u{CD99}", - nfkd: "\u{110E}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{CD9A}", - nfc: "\u{CD9A}", - nfd: "\u{110E}\u{116E}\u{11AD}", - nfkc: "\u{CD9A}", - nfkd: "\u{110E}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{CD9B}", - nfc: "\u{CD9B}", - nfd: "\u{110E}\u{116E}\u{11AE}", - nfkc: "\u{CD9B}", - nfkd: "\u{110E}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{CD9C}", - nfc: "\u{CD9C}", - nfd: "\u{110E}\u{116E}\u{11AF}", - nfkc: "\u{CD9C}", - nfkd: "\u{110E}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{CD9D}", - nfc: "\u{CD9D}", - nfd: "\u{110E}\u{116E}\u{11B0}", - nfkc: "\u{CD9D}", - nfkd: "\u{110E}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{CD9E}", - nfc: "\u{CD9E}", - nfd: "\u{110E}\u{116E}\u{11B1}", - nfkc: "\u{CD9E}", - nfkd: "\u{110E}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{CD9F}", - nfc: "\u{CD9F}", - nfd: "\u{110E}\u{116E}\u{11B2}", - nfkc: "\u{CD9F}", - nfkd: "\u{110E}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{CDA0}", - nfc: "\u{CDA0}", - nfd: "\u{110E}\u{116E}\u{11B3}", - nfkc: "\u{CDA0}", - nfkd: "\u{110E}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{CDA1}", - nfc: "\u{CDA1}", - nfd: "\u{110E}\u{116E}\u{11B4}", - nfkc: "\u{CDA1}", - nfkd: "\u{110E}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{CDA2}", - nfc: "\u{CDA2}", - nfd: "\u{110E}\u{116E}\u{11B5}", - nfkc: "\u{CDA2}", - nfkd: "\u{110E}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{CDA3}", - nfc: "\u{CDA3}", - nfd: "\u{110E}\u{116E}\u{11B6}", - nfkc: "\u{CDA3}", - nfkd: "\u{110E}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{CDA4}", - nfc: "\u{CDA4}", - nfd: "\u{110E}\u{116E}\u{11B7}", - nfkc: "\u{CDA4}", - nfkd: "\u{110E}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{CDA5}", - nfc: "\u{CDA5}", - nfd: "\u{110E}\u{116E}\u{11B8}", - nfkc: "\u{CDA5}", - nfkd: "\u{110E}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{CDA6}", - nfc: "\u{CDA6}", - nfd: "\u{110E}\u{116E}\u{11B9}", - nfkc: "\u{CDA6}", - nfkd: "\u{110E}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{CDA7}", - nfc: "\u{CDA7}", - nfd: "\u{110E}\u{116E}\u{11BA}", - nfkc: "\u{CDA7}", - nfkd: "\u{110E}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{CDA8}", - nfc: "\u{CDA8}", - nfd: "\u{110E}\u{116E}\u{11BB}", - nfkc: "\u{CDA8}", - nfkd: "\u{110E}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{CDA9}", - nfc: "\u{CDA9}", - nfd: "\u{110E}\u{116E}\u{11BC}", - nfkc: "\u{CDA9}", - nfkd: "\u{110E}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{CDAA}", - nfc: "\u{CDAA}", - nfd: "\u{110E}\u{116E}\u{11BD}", - nfkc: "\u{CDAA}", - nfkd: "\u{110E}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{CDAB}", - nfc: "\u{CDAB}", - nfd: "\u{110E}\u{116E}\u{11BE}", - nfkc: "\u{CDAB}", - nfkd: "\u{110E}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{CDAC}", - nfc: "\u{CDAC}", - nfd: "\u{110E}\u{116E}\u{11BF}", - nfkc: "\u{CDAC}", - nfkd: "\u{110E}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{CDAD}", - nfc: "\u{CDAD}", - nfd: "\u{110E}\u{116E}\u{11C0}", - nfkc: "\u{CDAD}", - nfkd: "\u{110E}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{CDAE}", - nfc: "\u{CDAE}", - nfd: "\u{110E}\u{116E}\u{11C1}", - nfkc: "\u{CDAE}", - nfkd: "\u{110E}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{CDAF}", - nfc: "\u{CDAF}", - nfd: "\u{110E}\u{116E}\u{11C2}", - nfkc: "\u{CDAF}", - nfkd: "\u{110E}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{CDB0}", - nfc: "\u{CDB0}", - nfd: "\u{110E}\u{116F}", - nfkc: "\u{CDB0}", - nfkd: "\u{110E}\u{116F}", - }, - NormalizationTest { - source: "\u{CDB1}", - nfc: "\u{CDB1}", - nfd: "\u{110E}\u{116F}\u{11A8}", - nfkc: "\u{CDB1}", - nfkd: "\u{110E}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{CDB2}", - nfc: "\u{CDB2}", - nfd: "\u{110E}\u{116F}\u{11A9}", - nfkc: "\u{CDB2}", - nfkd: "\u{110E}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{CDB3}", - nfc: "\u{CDB3}", - nfd: "\u{110E}\u{116F}\u{11AA}", - nfkc: "\u{CDB3}", - nfkd: "\u{110E}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{CDB4}", - nfc: "\u{CDB4}", - nfd: "\u{110E}\u{116F}\u{11AB}", - nfkc: "\u{CDB4}", - nfkd: "\u{110E}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{CDB5}", - nfc: "\u{CDB5}", - nfd: "\u{110E}\u{116F}\u{11AC}", - nfkc: "\u{CDB5}", - nfkd: "\u{110E}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{CDB6}", - nfc: "\u{CDB6}", - nfd: "\u{110E}\u{116F}\u{11AD}", - nfkc: "\u{CDB6}", - nfkd: "\u{110E}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{CDB7}", - nfc: "\u{CDB7}", - nfd: "\u{110E}\u{116F}\u{11AE}", - nfkc: "\u{CDB7}", - nfkd: "\u{110E}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{CDB8}", - nfc: "\u{CDB8}", - nfd: "\u{110E}\u{116F}\u{11AF}", - nfkc: "\u{CDB8}", - nfkd: "\u{110E}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{CDB9}", - nfc: "\u{CDB9}", - nfd: "\u{110E}\u{116F}\u{11B0}", - nfkc: "\u{CDB9}", - nfkd: "\u{110E}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{CDBA}", - nfc: "\u{CDBA}", - nfd: "\u{110E}\u{116F}\u{11B1}", - nfkc: "\u{CDBA}", - nfkd: "\u{110E}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{CDBB}", - nfc: "\u{CDBB}", - nfd: "\u{110E}\u{116F}\u{11B2}", - nfkc: "\u{CDBB}", - nfkd: "\u{110E}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{CDBC}", - nfc: "\u{CDBC}", - nfd: "\u{110E}\u{116F}\u{11B3}", - nfkc: "\u{CDBC}", - nfkd: "\u{110E}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{CDBD}", - nfc: "\u{CDBD}", - nfd: "\u{110E}\u{116F}\u{11B4}", - nfkc: "\u{CDBD}", - nfkd: "\u{110E}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{CDBE}", - nfc: "\u{CDBE}", - nfd: "\u{110E}\u{116F}\u{11B5}", - nfkc: "\u{CDBE}", - nfkd: "\u{110E}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{CDBF}", - nfc: "\u{CDBF}", - nfd: "\u{110E}\u{116F}\u{11B6}", - nfkc: "\u{CDBF}", - nfkd: "\u{110E}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{CDC0}", - nfc: "\u{CDC0}", - nfd: "\u{110E}\u{116F}\u{11B7}", - nfkc: "\u{CDC0}", - nfkd: "\u{110E}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{CDC1}", - nfc: "\u{CDC1}", - nfd: "\u{110E}\u{116F}\u{11B8}", - nfkc: "\u{CDC1}", - nfkd: "\u{110E}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{CDC2}", - nfc: "\u{CDC2}", - nfd: "\u{110E}\u{116F}\u{11B9}", - nfkc: "\u{CDC2}", - nfkd: "\u{110E}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{CDC3}", - nfc: "\u{CDC3}", - nfd: "\u{110E}\u{116F}\u{11BA}", - nfkc: "\u{CDC3}", - nfkd: "\u{110E}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{CDC4}", - nfc: "\u{CDC4}", - nfd: "\u{110E}\u{116F}\u{11BB}", - nfkc: "\u{CDC4}", - nfkd: "\u{110E}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{CDC5}", - nfc: "\u{CDC5}", - nfd: "\u{110E}\u{116F}\u{11BC}", - nfkc: "\u{CDC5}", - nfkd: "\u{110E}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{CDC6}", - nfc: "\u{CDC6}", - nfd: "\u{110E}\u{116F}\u{11BD}", - nfkc: "\u{CDC6}", - nfkd: "\u{110E}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{CDC7}", - nfc: "\u{CDC7}", - nfd: "\u{110E}\u{116F}\u{11BE}", - nfkc: "\u{CDC7}", - nfkd: "\u{110E}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{CDC8}", - nfc: "\u{CDC8}", - nfd: "\u{110E}\u{116F}\u{11BF}", - nfkc: "\u{CDC8}", - nfkd: "\u{110E}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{CDC9}", - nfc: "\u{CDC9}", - nfd: "\u{110E}\u{116F}\u{11C0}", - nfkc: "\u{CDC9}", - nfkd: "\u{110E}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{CDCA}", - nfc: "\u{CDCA}", - nfd: "\u{110E}\u{116F}\u{11C1}", - nfkc: "\u{CDCA}", - nfkd: "\u{110E}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{CDCB}", - nfc: "\u{CDCB}", - nfd: "\u{110E}\u{116F}\u{11C2}", - nfkc: "\u{CDCB}", - nfkd: "\u{110E}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{CDCC}", - nfc: "\u{CDCC}", - nfd: "\u{110E}\u{1170}", - nfkc: "\u{CDCC}", - nfkd: "\u{110E}\u{1170}", - }, - NormalizationTest { - source: "\u{CDCD}", - nfc: "\u{CDCD}", - nfd: "\u{110E}\u{1170}\u{11A8}", - nfkc: "\u{CDCD}", - nfkd: "\u{110E}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{CDCE}", - nfc: "\u{CDCE}", - nfd: "\u{110E}\u{1170}\u{11A9}", - nfkc: "\u{CDCE}", - nfkd: "\u{110E}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{CDCF}", - nfc: "\u{CDCF}", - nfd: "\u{110E}\u{1170}\u{11AA}", - nfkc: "\u{CDCF}", - nfkd: "\u{110E}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{CDD0}", - nfc: "\u{CDD0}", - nfd: "\u{110E}\u{1170}\u{11AB}", - nfkc: "\u{CDD0}", - nfkd: "\u{110E}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{CDD1}", - nfc: "\u{CDD1}", - nfd: "\u{110E}\u{1170}\u{11AC}", - nfkc: "\u{CDD1}", - nfkd: "\u{110E}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{CDD2}", - nfc: "\u{CDD2}", - nfd: "\u{110E}\u{1170}\u{11AD}", - nfkc: "\u{CDD2}", - nfkd: "\u{110E}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{CDD3}", - nfc: "\u{CDD3}", - nfd: "\u{110E}\u{1170}\u{11AE}", - nfkc: "\u{CDD3}", - nfkd: "\u{110E}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{CDD4}", - nfc: "\u{CDD4}", - nfd: "\u{110E}\u{1170}\u{11AF}", - nfkc: "\u{CDD4}", - nfkd: "\u{110E}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{CDD5}", - nfc: "\u{CDD5}", - nfd: "\u{110E}\u{1170}\u{11B0}", - nfkc: "\u{CDD5}", - nfkd: "\u{110E}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{CDD6}", - nfc: "\u{CDD6}", - nfd: "\u{110E}\u{1170}\u{11B1}", - nfkc: "\u{CDD6}", - nfkd: "\u{110E}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{CDD7}", - nfc: "\u{CDD7}", - nfd: "\u{110E}\u{1170}\u{11B2}", - nfkc: "\u{CDD7}", - nfkd: "\u{110E}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{CDD8}", - nfc: "\u{CDD8}", - nfd: "\u{110E}\u{1170}\u{11B3}", - nfkc: "\u{CDD8}", - nfkd: "\u{110E}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{CDD9}", - nfc: "\u{CDD9}", - nfd: "\u{110E}\u{1170}\u{11B4}", - nfkc: "\u{CDD9}", - nfkd: "\u{110E}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{CDDA}", - nfc: "\u{CDDA}", - nfd: "\u{110E}\u{1170}\u{11B5}", - nfkc: "\u{CDDA}", - nfkd: "\u{110E}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{CDDB}", - nfc: "\u{CDDB}", - nfd: "\u{110E}\u{1170}\u{11B6}", - nfkc: "\u{CDDB}", - nfkd: "\u{110E}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{CDDC}", - nfc: "\u{CDDC}", - nfd: "\u{110E}\u{1170}\u{11B7}", - nfkc: "\u{CDDC}", - nfkd: "\u{110E}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{CDDD}", - nfc: "\u{CDDD}", - nfd: "\u{110E}\u{1170}\u{11B8}", - nfkc: "\u{CDDD}", - nfkd: "\u{110E}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{CDDE}", - nfc: "\u{CDDE}", - nfd: "\u{110E}\u{1170}\u{11B9}", - nfkc: "\u{CDDE}", - nfkd: "\u{110E}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{CDDF}", - nfc: "\u{CDDF}", - nfd: "\u{110E}\u{1170}\u{11BA}", - nfkc: "\u{CDDF}", - nfkd: "\u{110E}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{CDE0}", - nfc: "\u{CDE0}", - nfd: "\u{110E}\u{1170}\u{11BB}", - nfkc: "\u{CDE0}", - nfkd: "\u{110E}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{CDE1}", - nfc: "\u{CDE1}", - nfd: "\u{110E}\u{1170}\u{11BC}", - nfkc: "\u{CDE1}", - nfkd: "\u{110E}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{CDE2}", - nfc: "\u{CDE2}", - nfd: "\u{110E}\u{1170}\u{11BD}", - nfkc: "\u{CDE2}", - nfkd: "\u{110E}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{CDE3}", - nfc: "\u{CDE3}", - nfd: "\u{110E}\u{1170}\u{11BE}", - nfkc: "\u{CDE3}", - nfkd: "\u{110E}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{CDE4}", - nfc: "\u{CDE4}", - nfd: "\u{110E}\u{1170}\u{11BF}", - nfkc: "\u{CDE4}", - nfkd: "\u{110E}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{CDE5}", - nfc: "\u{CDE5}", - nfd: "\u{110E}\u{1170}\u{11C0}", - nfkc: "\u{CDE5}", - nfkd: "\u{110E}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{CDE6}", - nfc: "\u{CDE6}", - nfd: "\u{110E}\u{1170}\u{11C1}", - nfkc: "\u{CDE6}", - nfkd: "\u{110E}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{CDE7}", - nfc: "\u{CDE7}", - nfd: "\u{110E}\u{1170}\u{11C2}", - nfkc: "\u{CDE7}", - nfkd: "\u{110E}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{CDE8}", - nfc: "\u{CDE8}", - nfd: "\u{110E}\u{1171}", - nfkc: "\u{CDE8}", - nfkd: "\u{110E}\u{1171}", - }, - NormalizationTest { - source: "\u{CDE9}", - nfc: "\u{CDE9}", - nfd: "\u{110E}\u{1171}\u{11A8}", - nfkc: "\u{CDE9}", - nfkd: "\u{110E}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{CDEA}", - nfc: "\u{CDEA}", - nfd: "\u{110E}\u{1171}\u{11A9}", - nfkc: "\u{CDEA}", - nfkd: "\u{110E}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{CDEB}", - nfc: "\u{CDEB}", - nfd: "\u{110E}\u{1171}\u{11AA}", - nfkc: "\u{CDEB}", - nfkd: "\u{110E}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{CDEC}", - nfc: "\u{CDEC}", - nfd: "\u{110E}\u{1171}\u{11AB}", - nfkc: "\u{CDEC}", - nfkd: "\u{110E}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{CDED}", - nfc: "\u{CDED}", - nfd: "\u{110E}\u{1171}\u{11AC}", - nfkc: "\u{CDED}", - nfkd: "\u{110E}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{CDEE}", - nfc: "\u{CDEE}", - nfd: "\u{110E}\u{1171}\u{11AD}", - nfkc: "\u{CDEE}", - nfkd: "\u{110E}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{CDEF}", - nfc: "\u{CDEF}", - nfd: "\u{110E}\u{1171}\u{11AE}", - nfkc: "\u{CDEF}", - nfkd: "\u{110E}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{CDF0}", - nfc: "\u{CDF0}", - nfd: "\u{110E}\u{1171}\u{11AF}", - nfkc: "\u{CDF0}", - nfkd: "\u{110E}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{CDF1}", - nfc: "\u{CDF1}", - nfd: "\u{110E}\u{1171}\u{11B0}", - nfkc: "\u{CDF1}", - nfkd: "\u{110E}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{CDF2}", - nfc: "\u{CDF2}", - nfd: "\u{110E}\u{1171}\u{11B1}", - nfkc: "\u{CDF2}", - nfkd: "\u{110E}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{CDF3}", - nfc: "\u{CDF3}", - nfd: "\u{110E}\u{1171}\u{11B2}", - nfkc: "\u{CDF3}", - nfkd: "\u{110E}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{CDF4}", - nfc: "\u{CDF4}", - nfd: "\u{110E}\u{1171}\u{11B3}", - nfkc: "\u{CDF4}", - nfkd: "\u{110E}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{CDF5}", - nfc: "\u{CDF5}", - nfd: "\u{110E}\u{1171}\u{11B4}", - nfkc: "\u{CDF5}", - nfkd: "\u{110E}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{CDF6}", - nfc: "\u{CDF6}", - nfd: "\u{110E}\u{1171}\u{11B5}", - nfkc: "\u{CDF6}", - nfkd: "\u{110E}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{CDF7}", - nfc: "\u{CDF7}", - nfd: "\u{110E}\u{1171}\u{11B6}", - nfkc: "\u{CDF7}", - nfkd: "\u{110E}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{CDF8}", - nfc: "\u{CDF8}", - nfd: "\u{110E}\u{1171}\u{11B7}", - nfkc: "\u{CDF8}", - nfkd: "\u{110E}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{CDF9}", - nfc: "\u{CDF9}", - nfd: "\u{110E}\u{1171}\u{11B8}", - nfkc: "\u{CDF9}", - nfkd: "\u{110E}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{CDFA}", - nfc: "\u{CDFA}", - nfd: "\u{110E}\u{1171}\u{11B9}", - nfkc: "\u{CDFA}", - nfkd: "\u{110E}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{CDFB}", - nfc: "\u{CDFB}", - nfd: "\u{110E}\u{1171}\u{11BA}", - nfkc: "\u{CDFB}", - nfkd: "\u{110E}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{CDFC}", - nfc: "\u{CDFC}", - nfd: "\u{110E}\u{1171}\u{11BB}", - nfkc: "\u{CDFC}", - nfkd: "\u{110E}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{CDFD}", - nfc: "\u{CDFD}", - nfd: "\u{110E}\u{1171}\u{11BC}", - nfkc: "\u{CDFD}", - nfkd: "\u{110E}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{CDFE}", - nfc: "\u{CDFE}", - nfd: "\u{110E}\u{1171}\u{11BD}", - nfkc: "\u{CDFE}", - nfkd: "\u{110E}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{CDFF}", - nfc: "\u{CDFF}", - nfd: "\u{110E}\u{1171}\u{11BE}", - nfkc: "\u{CDFF}", - nfkd: "\u{110E}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{CE00}", - nfc: "\u{CE00}", - nfd: "\u{110E}\u{1171}\u{11BF}", - nfkc: "\u{CE00}", - nfkd: "\u{110E}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{CE01}", - nfc: "\u{CE01}", - nfd: "\u{110E}\u{1171}\u{11C0}", - nfkc: "\u{CE01}", - nfkd: "\u{110E}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{CE02}", - nfc: "\u{CE02}", - nfd: "\u{110E}\u{1171}\u{11C1}", - nfkc: "\u{CE02}", - nfkd: "\u{110E}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{CE03}", - nfc: "\u{CE03}", - nfd: "\u{110E}\u{1171}\u{11C2}", - nfkc: "\u{CE03}", - nfkd: "\u{110E}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{CE04}", - nfc: "\u{CE04}", - nfd: "\u{110E}\u{1172}", - nfkc: "\u{CE04}", - nfkd: "\u{110E}\u{1172}", - }, - NormalizationTest { - source: "\u{CE05}", - nfc: "\u{CE05}", - nfd: "\u{110E}\u{1172}\u{11A8}", - nfkc: "\u{CE05}", - nfkd: "\u{110E}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{CE06}", - nfc: "\u{CE06}", - nfd: "\u{110E}\u{1172}\u{11A9}", - nfkc: "\u{CE06}", - nfkd: "\u{110E}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{CE07}", - nfc: "\u{CE07}", - nfd: "\u{110E}\u{1172}\u{11AA}", - nfkc: "\u{CE07}", - nfkd: "\u{110E}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{CE08}", - nfc: "\u{CE08}", - nfd: "\u{110E}\u{1172}\u{11AB}", - nfkc: "\u{CE08}", - nfkd: "\u{110E}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{CE09}", - nfc: "\u{CE09}", - nfd: "\u{110E}\u{1172}\u{11AC}", - nfkc: "\u{CE09}", - nfkd: "\u{110E}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{CE0A}", - nfc: "\u{CE0A}", - nfd: "\u{110E}\u{1172}\u{11AD}", - nfkc: "\u{CE0A}", - nfkd: "\u{110E}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{CE0B}", - nfc: "\u{CE0B}", - nfd: "\u{110E}\u{1172}\u{11AE}", - nfkc: "\u{CE0B}", - nfkd: "\u{110E}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{CE0C}", - nfc: "\u{CE0C}", - nfd: "\u{110E}\u{1172}\u{11AF}", - nfkc: "\u{CE0C}", - nfkd: "\u{110E}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{CE0D}", - nfc: "\u{CE0D}", - nfd: "\u{110E}\u{1172}\u{11B0}", - nfkc: "\u{CE0D}", - nfkd: "\u{110E}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{CE0E}", - nfc: "\u{CE0E}", - nfd: "\u{110E}\u{1172}\u{11B1}", - nfkc: "\u{CE0E}", - nfkd: "\u{110E}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{CE0F}", - nfc: "\u{CE0F}", - nfd: "\u{110E}\u{1172}\u{11B2}", - nfkc: "\u{CE0F}", - nfkd: "\u{110E}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{CE10}", - nfc: "\u{CE10}", - nfd: "\u{110E}\u{1172}\u{11B3}", - nfkc: "\u{CE10}", - nfkd: "\u{110E}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{CE11}", - nfc: "\u{CE11}", - nfd: "\u{110E}\u{1172}\u{11B4}", - nfkc: "\u{CE11}", - nfkd: "\u{110E}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{CE12}", - nfc: "\u{CE12}", - nfd: "\u{110E}\u{1172}\u{11B5}", - nfkc: "\u{CE12}", - nfkd: "\u{110E}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{CE13}", - nfc: "\u{CE13}", - nfd: "\u{110E}\u{1172}\u{11B6}", - nfkc: "\u{CE13}", - nfkd: "\u{110E}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{CE14}", - nfc: "\u{CE14}", - nfd: "\u{110E}\u{1172}\u{11B7}", - nfkc: "\u{CE14}", - nfkd: "\u{110E}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{CE15}", - nfc: "\u{CE15}", - nfd: "\u{110E}\u{1172}\u{11B8}", - nfkc: "\u{CE15}", - nfkd: "\u{110E}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{CE16}", - nfc: "\u{CE16}", - nfd: "\u{110E}\u{1172}\u{11B9}", - nfkc: "\u{CE16}", - nfkd: "\u{110E}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{CE17}", - nfc: "\u{CE17}", - nfd: "\u{110E}\u{1172}\u{11BA}", - nfkc: "\u{CE17}", - nfkd: "\u{110E}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{CE18}", - nfc: "\u{CE18}", - nfd: "\u{110E}\u{1172}\u{11BB}", - nfkc: "\u{CE18}", - nfkd: "\u{110E}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{CE19}", - nfc: "\u{CE19}", - nfd: "\u{110E}\u{1172}\u{11BC}", - nfkc: "\u{CE19}", - nfkd: "\u{110E}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{CE1A}", - nfc: "\u{CE1A}", - nfd: "\u{110E}\u{1172}\u{11BD}", - nfkc: "\u{CE1A}", - nfkd: "\u{110E}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{CE1B}", - nfc: "\u{CE1B}", - nfd: "\u{110E}\u{1172}\u{11BE}", - nfkc: "\u{CE1B}", - nfkd: "\u{110E}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{CE1C}", - nfc: "\u{CE1C}", - nfd: "\u{110E}\u{1172}\u{11BF}", - nfkc: "\u{CE1C}", - nfkd: "\u{110E}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{CE1D}", - nfc: "\u{CE1D}", - nfd: "\u{110E}\u{1172}\u{11C0}", - nfkc: "\u{CE1D}", - nfkd: "\u{110E}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{CE1E}", - nfc: "\u{CE1E}", - nfd: "\u{110E}\u{1172}\u{11C1}", - nfkc: "\u{CE1E}", - nfkd: "\u{110E}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{CE1F}", - nfc: "\u{CE1F}", - nfd: "\u{110E}\u{1172}\u{11C2}", - nfkc: "\u{CE1F}", - nfkd: "\u{110E}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{CE20}", - nfc: "\u{CE20}", - nfd: "\u{110E}\u{1173}", - nfkc: "\u{CE20}", - nfkd: "\u{110E}\u{1173}", - }, - NormalizationTest { - source: "\u{CE21}", - nfc: "\u{CE21}", - nfd: "\u{110E}\u{1173}\u{11A8}", - nfkc: "\u{CE21}", - nfkd: "\u{110E}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{CE22}", - nfc: "\u{CE22}", - nfd: "\u{110E}\u{1173}\u{11A9}", - nfkc: "\u{CE22}", - nfkd: "\u{110E}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{CE23}", - nfc: "\u{CE23}", - nfd: "\u{110E}\u{1173}\u{11AA}", - nfkc: "\u{CE23}", - nfkd: "\u{110E}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{CE24}", - nfc: "\u{CE24}", - nfd: "\u{110E}\u{1173}\u{11AB}", - nfkc: "\u{CE24}", - nfkd: "\u{110E}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{CE25}", - nfc: "\u{CE25}", - nfd: "\u{110E}\u{1173}\u{11AC}", - nfkc: "\u{CE25}", - nfkd: "\u{110E}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{CE26}", - nfc: "\u{CE26}", - nfd: "\u{110E}\u{1173}\u{11AD}", - nfkc: "\u{CE26}", - nfkd: "\u{110E}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{CE27}", - nfc: "\u{CE27}", - nfd: "\u{110E}\u{1173}\u{11AE}", - nfkc: "\u{CE27}", - nfkd: "\u{110E}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{CE28}", - nfc: "\u{CE28}", - nfd: "\u{110E}\u{1173}\u{11AF}", - nfkc: "\u{CE28}", - nfkd: "\u{110E}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{CE29}", - nfc: "\u{CE29}", - nfd: "\u{110E}\u{1173}\u{11B0}", - nfkc: "\u{CE29}", - nfkd: "\u{110E}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{CE2A}", - nfc: "\u{CE2A}", - nfd: "\u{110E}\u{1173}\u{11B1}", - nfkc: "\u{CE2A}", - nfkd: "\u{110E}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{CE2B}", - nfc: "\u{CE2B}", - nfd: "\u{110E}\u{1173}\u{11B2}", - nfkc: "\u{CE2B}", - nfkd: "\u{110E}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{CE2C}", - nfc: "\u{CE2C}", - nfd: "\u{110E}\u{1173}\u{11B3}", - nfkc: "\u{CE2C}", - nfkd: "\u{110E}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{CE2D}", - nfc: "\u{CE2D}", - nfd: "\u{110E}\u{1173}\u{11B4}", - nfkc: "\u{CE2D}", - nfkd: "\u{110E}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{CE2E}", - nfc: "\u{CE2E}", - nfd: "\u{110E}\u{1173}\u{11B5}", - nfkc: "\u{CE2E}", - nfkd: "\u{110E}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{CE2F}", - nfc: "\u{CE2F}", - nfd: "\u{110E}\u{1173}\u{11B6}", - nfkc: "\u{CE2F}", - nfkd: "\u{110E}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{CE30}", - nfc: "\u{CE30}", - nfd: "\u{110E}\u{1173}\u{11B7}", - nfkc: "\u{CE30}", - nfkd: "\u{110E}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{CE31}", - nfc: "\u{CE31}", - nfd: "\u{110E}\u{1173}\u{11B8}", - nfkc: "\u{CE31}", - nfkd: "\u{110E}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{CE32}", - nfc: "\u{CE32}", - nfd: "\u{110E}\u{1173}\u{11B9}", - nfkc: "\u{CE32}", - nfkd: "\u{110E}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{CE33}", - nfc: "\u{CE33}", - nfd: "\u{110E}\u{1173}\u{11BA}", - nfkc: "\u{CE33}", - nfkd: "\u{110E}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{CE34}", - nfc: "\u{CE34}", - nfd: "\u{110E}\u{1173}\u{11BB}", - nfkc: "\u{CE34}", - nfkd: "\u{110E}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{CE35}", - nfc: "\u{CE35}", - nfd: "\u{110E}\u{1173}\u{11BC}", - nfkc: "\u{CE35}", - nfkd: "\u{110E}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{CE36}", - nfc: "\u{CE36}", - nfd: "\u{110E}\u{1173}\u{11BD}", - nfkc: "\u{CE36}", - nfkd: "\u{110E}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{CE37}", - nfc: "\u{CE37}", - nfd: "\u{110E}\u{1173}\u{11BE}", - nfkc: "\u{CE37}", - nfkd: "\u{110E}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{CE38}", - nfc: "\u{CE38}", - nfd: "\u{110E}\u{1173}\u{11BF}", - nfkc: "\u{CE38}", - nfkd: "\u{110E}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{CE39}", - nfc: "\u{CE39}", - nfd: "\u{110E}\u{1173}\u{11C0}", - nfkc: "\u{CE39}", - nfkd: "\u{110E}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{CE3A}", - nfc: "\u{CE3A}", - nfd: "\u{110E}\u{1173}\u{11C1}", - nfkc: "\u{CE3A}", - nfkd: "\u{110E}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{CE3B}", - nfc: "\u{CE3B}", - nfd: "\u{110E}\u{1173}\u{11C2}", - nfkc: "\u{CE3B}", - nfkd: "\u{110E}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{CE3C}", - nfc: "\u{CE3C}", - nfd: "\u{110E}\u{1174}", - nfkc: "\u{CE3C}", - nfkd: "\u{110E}\u{1174}", - }, - NormalizationTest { - source: "\u{CE3D}", - nfc: "\u{CE3D}", - nfd: "\u{110E}\u{1174}\u{11A8}", - nfkc: "\u{CE3D}", - nfkd: "\u{110E}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{CE3E}", - nfc: "\u{CE3E}", - nfd: "\u{110E}\u{1174}\u{11A9}", - nfkc: "\u{CE3E}", - nfkd: "\u{110E}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{CE3F}", - nfc: "\u{CE3F}", - nfd: "\u{110E}\u{1174}\u{11AA}", - nfkc: "\u{CE3F}", - nfkd: "\u{110E}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{CE40}", - nfc: "\u{CE40}", - nfd: "\u{110E}\u{1174}\u{11AB}", - nfkc: "\u{CE40}", - nfkd: "\u{110E}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{CE41}", - nfc: "\u{CE41}", - nfd: "\u{110E}\u{1174}\u{11AC}", - nfkc: "\u{CE41}", - nfkd: "\u{110E}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{CE42}", - nfc: "\u{CE42}", - nfd: "\u{110E}\u{1174}\u{11AD}", - nfkc: "\u{CE42}", - nfkd: "\u{110E}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{CE43}", - nfc: "\u{CE43}", - nfd: "\u{110E}\u{1174}\u{11AE}", - nfkc: "\u{CE43}", - nfkd: "\u{110E}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{CE44}", - nfc: "\u{CE44}", - nfd: "\u{110E}\u{1174}\u{11AF}", - nfkc: "\u{CE44}", - nfkd: "\u{110E}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{CE45}", - nfc: "\u{CE45}", - nfd: "\u{110E}\u{1174}\u{11B0}", - nfkc: "\u{CE45}", - nfkd: "\u{110E}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{CE46}", - nfc: "\u{CE46}", - nfd: "\u{110E}\u{1174}\u{11B1}", - nfkc: "\u{CE46}", - nfkd: "\u{110E}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{CE47}", - nfc: "\u{CE47}", - nfd: "\u{110E}\u{1174}\u{11B2}", - nfkc: "\u{CE47}", - nfkd: "\u{110E}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{CE48}", - nfc: "\u{CE48}", - nfd: "\u{110E}\u{1174}\u{11B3}", - nfkc: "\u{CE48}", - nfkd: "\u{110E}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{CE49}", - nfc: "\u{CE49}", - nfd: "\u{110E}\u{1174}\u{11B4}", - nfkc: "\u{CE49}", - nfkd: "\u{110E}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{CE4A}", - nfc: "\u{CE4A}", - nfd: "\u{110E}\u{1174}\u{11B5}", - nfkc: "\u{CE4A}", - nfkd: "\u{110E}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{CE4B}", - nfc: "\u{CE4B}", - nfd: "\u{110E}\u{1174}\u{11B6}", - nfkc: "\u{CE4B}", - nfkd: "\u{110E}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{CE4C}", - nfc: "\u{CE4C}", - nfd: "\u{110E}\u{1174}\u{11B7}", - nfkc: "\u{CE4C}", - nfkd: "\u{110E}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{CE4D}", - nfc: "\u{CE4D}", - nfd: "\u{110E}\u{1174}\u{11B8}", - nfkc: "\u{CE4D}", - nfkd: "\u{110E}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{CE4E}", - nfc: "\u{CE4E}", - nfd: "\u{110E}\u{1174}\u{11B9}", - nfkc: "\u{CE4E}", - nfkd: "\u{110E}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{CE4F}", - nfc: "\u{CE4F}", - nfd: "\u{110E}\u{1174}\u{11BA}", - nfkc: "\u{CE4F}", - nfkd: "\u{110E}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{CE50}", - nfc: "\u{CE50}", - nfd: "\u{110E}\u{1174}\u{11BB}", - nfkc: "\u{CE50}", - nfkd: "\u{110E}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{CE51}", - nfc: "\u{CE51}", - nfd: "\u{110E}\u{1174}\u{11BC}", - nfkc: "\u{CE51}", - nfkd: "\u{110E}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{CE52}", - nfc: "\u{CE52}", - nfd: "\u{110E}\u{1174}\u{11BD}", - nfkc: "\u{CE52}", - nfkd: "\u{110E}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{CE53}", - nfc: "\u{CE53}", - nfd: "\u{110E}\u{1174}\u{11BE}", - nfkc: "\u{CE53}", - nfkd: "\u{110E}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{CE54}", - nfc: "\u{CE54}", - nfd: "\u{110E}\u{1174}\u{11BF}", - nfkc: "\u{CE54}", - nfkd: "\u{110E}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{CE55}", - nfc: "\u{CE55}", - nfd: "\u{110E}\u{1174}\u{11C0}", - nfkc: "\u{CE55}", - nfkd: "\u{110E}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{CE56}", - nfc: "\u{CE56}", - nfd: "\u{110E}\u{1174}\u{11C1}", - nfkc: "\u{CE56}", - nfkd: "\u{110E}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{CE57}", - nfc: "\u{CE57}", - nfd: "\u{110E}\u{1174}\u{11C2}", - nfkc: "\u{CE57}", - nfkd: "\u{110E}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{CE58}", - nfc: "\u{CE58}", - nfd: "\u{110E}\u{1175}", - nfkc: "\u{CE58}", - nfkd: "\u{110E}\u{1175}", - }, - NormalizationTest { - source: "\u{CE59}", - nfc: "\u{CE59}", - nfd: "\u{110E}\u{1175}\u{11A8}", - nfkc: "\u{CE59}", - nfkd: "\u{110E}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{CE5A}", - nfc: "\u{CE5A}", - nfd: "\u{110E}\u{1175}\u{11A9}", - nfkc: "\u{CE5A}", - nfkd: "\u{110E}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{CE5B}", - nfc: "\u{CE5B}", - nfd: "\u{110E}\u{1175}\u{11AA}", - nfkc: "\u{CE5B}", - nfkd: "\u{110E}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{CE5C}", - nfc: "\u{CE5C}", - nfd: "\u{110E}\u{1175}\u{11AB}", - nfkc: "\u{CE5C}", - nfkd: "\u{110E}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{CE5D}", - nfc: "\u{CE5D}", - nfd: "\u{110E}\u{1175}\u{11AC}", - nfkc: "\u{CE5D}", - nfkd: "\u{110E}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{CE5E}", - nfc: "\u{CE5E}", - nfd: "\u{110E}\u{1175}\u{11AD}", - nfkc: "\u{CE5E}", - nfkd: "\u{110E}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{CE5F}", - nfc: "\u{CE5F}", - nfd: "\u{110E}\u{1175}\u{11AE}", - nfkc: "\u{CE5F}", - nfkd: "\u{110E}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{CE60}", - nfc: "\u{CE60}", - nfd: "\u{110E}\u{1175}\u{11AF}", - nfkc: "\u{CE60}", - nfkd: "\u{110E}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{CE61}", - nfc: "\u{CE61}", - nfd: "\u{110E}\u{1175}\u{11B0}", - nfkc: "\u{CE61}", - nfkd: "\u{110E}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{CE62}", - nfc: "\u{CE62}", - nfd: "\u{110E}\u{1175}\u{11B1}", - nfkc: "\u{CE62}", - nfkd: "\u{110E}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{CE63}", - nfc: "\u{CE63}", - nfd: "\u{110E}\u{1175}\u{11B2}", - nfkc: "\u{CE63}", - nfkd: "\u{110E}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{CE64}", - nfc: "\u{CE64}", - nfd: "\u{110E}\u{1175}\u{11B3}", - nfkc: "\u{CE64}", - nfkd: "\u{110E}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{CE65}", - nfc: "\u{CE65}", - nfd: "\u{110E}\u{1175}\u{11B4}", - nfkc: "\u{CE65}", - nfkd: "\u{110E}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{CE66}", - nfc: "\u{CE66}", - nfd: "\u{110E}\u{1175}\u{11B5}", - nfkc: "\u{CE66}", - nfkd: "\u{110E}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{CE67}", - nfc: "\u{CE67}", - nfd: "\u{110E}\u{1175}\u{11B6}", - nfkc: "\u{CE67}", - nfkd: "\u{110E}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{CE68}", - nfc: "\u{CE68}", - nfd: "\u{110E}\u{1175}\u{11B7}", - nfkc: "\u{CE68}", - nfkd: "\u{110E}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{CE69}", - nfc: "\u{CE69}", - nfd: "\u{110E}\u{1175}\u{11B8}", - nfkc: "\u{CE69}", - nfkd: "\u{110E}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{CE6A}", - nfc: "\u{CE6A}", - nfd: "\u{110E}\u{1175}\u{11B9}", - nfkc: "\u{CE6A}", - nfkd: "\u{110E}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{CE6B}", - nfc: "\u{CE6B}", - nfd: "\u{110E}\u{1175}\u{11BA}", - nfkc: "\u{CE6B}", - nfkd: "\u{110E}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{CE6C}", - nfc: "\u{CE6C}", - nfd: "\u{110E}\u{1175}\u{11BB}", - nfkc: "\u{CE6C}", - nfkd: "\u{110E}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{CE6D}", - nfc: "\u{CE6D}", - nfd: "\u{110E}\u{1175}\u{11BC}", - nfkc: "\u{CE6D}", - nfkd: "\u{110E}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{CE6E}", - nfc: "\u{CE6E}", - nfd: "\u{110E}\u{1175}\u{11BD}", - nfkc: "\u{CE6E}", - nfkd: "\u{110E}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{CE6F}", - nfc: "\u{CE6F}", - nfd: "\u{110E}\u{1175}\u{11BE}", - nfkc: "\u{CE6F}", - nfkd: "\u{110E}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{CE70}", - nfc: "\u{CE70}", - nfd: "\u{110E}\u{1175}\u{11BF}", - nfkc: "\u{CE70}", - nfkd: "\u{110E}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{CE71}", - nfc: "\u{CE71}", - nfd: "\u{110E}\u{1175}\u{11C0}", - nfkc: "\u{CE71}", - nfkd: "\u{110E}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{CE72}", - nfc: "\u{CE72}", - nfd: "\u{110E}\u{1175}\u{11C1}", - nfkc: "\u{CE72}", - nfkd: "\u{110E}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{CE73}", - nfc: "\u{CE73}", - nfd: "\u{110E}\u{1175}\u{11C2}", - nfkc: "\u{CE73}", - nfkd: "\u{110E}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{CE74}", - nfc: "\u{CE74}", - nfd: "\u{110F}\u{1161}", - nfkc: "\u{CE74}", - nfkd: "\u{110F}\u{1161}", - }, - NormalizationTest { - source: "\u{CE75}", - nfc: "\u{CE75}", - nfd: "\u{110F}\u{1161}\u{11A8}", - nfkc: "\u{CE75}", - nfkd: "\u{110F}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{CE76}", - nfc: "\u{CE76}", - nfd: "\u{110F}\u{1161}\u{11A9}", - nfkc: "\u{CE76}", - nfkd: "\u{110F}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{CE77}", - nfc: "\u{CE77}", - nfd: "\u{110F}\u{1161}\u{11AA}", - nfkc: "\u{CE77}", - nfkd: "\u{110F}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{CE78}", - nfc: "\u{CE78}", - nfd: "\u{110F}\u{1161}\u{11AB}", - nfkc: "\u{CE78}", - nfkd: "\u{110F}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{CE79}", - nfc: "\u{CE79}", - nfd: "\u{110F}\u{1161}\u{11AC}", - nfkc: "\u{CE79}", - nfkd: "\u{110F}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{CE7A}", - nfc: "\u{CE7A}", - nfd: "\u{110F}\u{1161}\u{11AD}", - nfkc: "\u{CE7A}", - nfkd: "\u{110F}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{CE7B}", - nfc: "\u{CE7B}", - nfd: "\u{110F}\u{1161}\u{11AE}", - nfkc: "\u{CE7B}", - nfkd: "\u{110F}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{CE7C}", - nfc: "\u{CE7C}", - nfd: "\u{110F}\u{1161}\u{11AF}", - nfkc: "\u{CE7C}", - nfkd: "\u{110F}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{CE7D}", - nfc: "\u{CE7D}", - nfd: "\u{110F}\u{1161}\u{11B0}", - nfkc: "\u{CE7D}", - nfkd: "\u{110F}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{CE7E}", - nfc: "\u{CE7E}", - nfd: "\u{110F}\u{1161}\u{11B1}", - nfkc: "\u{CE7E}", - nfkd: "\u{110F}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{CE7F}", - nfc: "\u{CE7F}", - nfd: "\u{110F}\u{1161}\u{11B2}", - nfkc: "\u{CE7F}", - nfkd: "\u{110F}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{CE80}", - nfc: "\u{CE80}", - nfd: "\u{110F}\u{1161}\u{11B3}", - nfkc: "\u{CE80}", - nfkd: "\u{110F}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{CE81}", - nfc: "\u{CE81}", - nfd: "\u{110F}\u{1161}\u{11B4}", - nfkc: "\u{CE81}", - nfkd: "\u{110F}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{CE82}", - nfc: "\u{CE82}", - nfd: "\u{110F}\u{1161}\u{11B5}", - nfkc: "\u{CE82}", - nfkd: "\u{110F}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{CE83}", - nfc: "\u{CE83}", - nfd: "\u{110F}\u{1161}\u{11B6}", - nfkc: "\u{CE83}", - nfkd: "\u{110F}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{CE84}", - nfc: "\u{CE84}", - nfd: "\u{110F}\u{1161}\u{11B7}", - nfkc: "\u{CE84}", - nfkd: "\u{110F}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{CE85}", - nfc: "\u{CE85}", - nfd: "\u{110F}\u{1161}\u{11B8}", - nfkc: "\u{CE85}", - nfkd: "\u{110F}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{CE86}", - nfc: "\u{CE86}", - nfd: "\u{110F}\u{1161}\u{11B9}", - nfkc: "\u{CE86}", - nfkd: "\u{110F}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{CE87}", - nfc: "\u{CE87}", - nfd: "\u{110F}\u{1161}\u{11BA}", - nfkc: "\u{CE87}", - nfkd: "\u{110F}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{CE88}", - nfc: "\u{CE88}", - nfd: "\u{110F}\u{1161}\u{11BB}", - nfkc: "\u{CE88}", - nfkd: "\u{110F}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{CE89}", - nfc: "\u{CE89}", - nfd: "\u{110F}\u{1161}\u{11BC}", - nfkc: "\u{CE89}", - nfkd: "\u{110F}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{CE8A}", - nfc: "\u{CE8A}", - nfd: "\u{110F}\u{1161}\u{11BD}", - nfkc: "\u{CE8A}", - nfkd: "\u{110F}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{CE8B}", - nfc: "\u{CE8B}", - nfd: "\u{110F}\u{1161}\u{11BE}", - nfkc: "\u{CE8B}", - nfkd: "\u{110F}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{CE8C}", - nfc: "\u{CE8C}", - nfd: "\u{110F}\u{1161}\u{11BF}", - nfkc: "\u{CE8C}", - nfkd: "\u{110F}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{CE8D}", - nfc: "\u{CE8D}", - nfd: "\u{110F}\u{1161}\u{11C0}", - nfkc: "\u{CE8D}", - nfkd: "\u{110F}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{CE8E}", - nfc: "\u{CE8E}", - nfd: "\u{110F}\u{1161}\u{11C1}", - nfkc: "\u{CE8E}", - nfkd: "\u{110F}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{CE8F}", - nfc: "\u{CE8F}", - nfd: "\u{110F}\u{1161}\u{11C2}", - nfkc: "\u{CE8F}", - nfkd: "\u{110F}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{CE90}", - nfc: "\u{CE90}", - nfd: "\u{110F}\u{1162}", - nfkc: "\u{CE90}", - nfkd: "\u{110F}\u{1162}", - }, - NormalizationTest { - source: "\u{CE91}", - nfc: "\u{CE91}", - nfd: "\u{110F}\u{1162}\u{11A8}", - nfkc: "\u{CE91}", - nfkd: "\u{110F}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{CE92}", - nfc: "\u{CE92}", - nfd: "\u{110F}\u{1162}\u{11A9}", - nfkc: "\u{CE92}", - nfkd: "\u{110F}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{CE93}", - nfc: "\u{CE93}", - nfd: "\u{110F}\u{1162}\u{11AA}", - nfkc: "\u{CE93}", - nfkd: "\u{110F}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{CE94}", - nfc: "\u{CE94}", - nfd: "\u{110F}\u{1162}\u{11AB}", - nfkc: "\u{CE94}", - nfkd: "\u{110F}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{CE95}", - nfc: "\u{CE95}", - nfd: "\u{110F}\u{1162}\u{11AC}", - nfkc: "\u{CE95}", - nfkd: "\u{110F}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{CE96}", - nfc: "\u{CE96}", - nfd: "\u{110F}\u{1162}\u{11AD}", - nfkc: "\u{CE96}", - nfkd: "\u{110F}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{CE97}", - nfc: "\u{CE97}", - nfd: "\u{110F}\u{1162}\u{11AE}", - nfkc: "\u{CE97}", - nfkd: "\u{110F}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{CE98}", - nfc: "\u{CE98}", - nfd: "\u{110F}\u{1162}\u{11AF}", - nfkc: "\u{CE98}", - nfkd: "\u{110F}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{CE99}", - nfc: "\u{CE99}", - nfd: "\u{110F}\u{1162}\u{11B0}", - nfkc: "\u{CE99}", - nfkd: "\u{110F}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{CE9A}", - nfc: "\u{CE9A}", - nfd: "\u{110F}\u{1162}\u{11B1}", - nfkc: "\u{CE9A}", - nfkd: "\u{110F}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{CE9B}", - nfc: "\u{CE9B}", - nfd: "\u{110F}\u{1162}\u{11B2}", - nfkc: "\u{CE9B}", - nfkd: "\u{110F}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{CE9C}", - nfc: "\u{CE9C}", - nfd: "\u{110F}\u{1162}\u{11B3}", - nfkc: "\u{CE9C}", - nfkd: "\u{110F}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{CE9D}", - nfc: "\u{CE9D}", - nfd: "\u{110F}\u{1162}\u{11B4}", - nfkc: "\u{CE9D}", - nfkd: "\u{110F}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{CE9E}", - nfc: "\u{CE9E}", - nfd: "\u{110F}\u{1162}\u{11B5}", - nfkc: "\u{CE9E}", - nfkd: "\u{110F}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{CE9F}", - nfc: "\u{CE9F}", - nfd: "\u{110F}\u{1162}\u{11B6}", - nfkc: "\u{CE9F}", - nfkd: "\u{110F}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{CEA0}", - nfc: "\u{CEA0}", - nfd: "\u{110F}\u{1162}\u{11B7}", - nfkc: "\u{CEA0}", - nfkd: "\u{110F}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{CEA1}", - nfc: "\u{CEA1}", - nfd: "\u{110F}\u{1162}\u{11B8}", - nfkc: "\u{CEA1}", - nfkd: "\u{110F}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{CEA2}", - nfc: "\u{CEA2}", - nfd: "\u{110F}\u{1162}\u{11B9}", - nfkc: "\u{CEA2}", - nfkd: "\u{110F}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{CEA3}", - nfc: "\u{CEA3}", - nfd: "\u{110F}\u{1162}\u{11BA}", - nfkc: "\u{CEA3}", - nfkd: "\u{110F}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{CEA4}", - nfc: "\u{CEA4}", - nfd: "\u{110F}\u{1162}\u{11BB}", - nfkc: "\u{CEA4}", - nfkd: "\u{110F}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{CEA5}", - nfc: "\u{CEA5}", - nfd: "\u{110F}\u{1162}\u{11BC}", - nfkc: "\u{CEA5}", - nfkd: "\u{110F}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{CEA6}", - nfc: "\u{CEA6}", - nfd: "\u{110F}\u{1162}\u{11BD}", - nfkc: "\u{CEA6}", - nfkd: "\u{110F}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{CEA7}", - nfc: "\u{CEA7}", - nfd: "\u{110F}\u{1162}\u{11BE}", - nfkc: "\u{CEA7}", - nfkd: "\u{110F}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{CEA8}", - nfc: "\u{CEA8}", - nfd: "\u{110F}\u{1162}\u{11BF}", - nfkc: "\u{CEA8}", - nfkd: "\u{110F}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{CEA9}", - nfc: "\u{CEA9}", - nfd: "\u{110F}\u{1162}\u{11C0}", - nfkc: "\u{CEA9}", - nfkd: "\u{110F}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{CEAA}", - nfc: "\u{CEAA}", - nfd: "\u{110F}\u{1162}\u{11C1}", - nfkc: "\u{CEAA}", - nfkd: "\u{110F}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{CEAB}", - nfc: "\u{CEAB}", - nfd: "\u{110F}\u{1162}\u{11C2}", - nfkc: "\u{CEAB}", - nfkd: "\u{110F}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{CEAC}", - nfc: "\u{CEAC}", - nfd: "\u{110F}\u{1163}", - nfkc: "\u{CEAC}", - nfkd: "\u{110F}\u{1163}", - }, - NormalizationTest { - source: "\u{CEAD}", - nfc: "\u{CEAD}", - nfd: "\u{110F}\u{1163}\u{11A8}", - nfkc: "\u{CEAD}", - nfkd: "\u{110F}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{CEAE}", - nfc: "\u{CEAE}", - nfd: "\u{110F}\u{1163}\u{11A9}", - nfkc: "\u{CEAE}", - nfkd: "\u{110F}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{CEAF}", - nfc: "\u{CEAF}", - nfd: "\u{110F}\u{1163}\u{11AA}", - nfkc: "\u{CEAF}", - nfkd: "\u{110F}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{CEB0}", - nfc: "\u{CEB0}", - nfd: "\u{110F}\u{1163}\u{11AB}", - nfkc: "\u{CEB0}", - nfkd: "\u{110F}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{CEB1}", - nfc: "\u{CEB1}", - nfd: "\u{110F}\u{1163}\u{11AC}", - nfkc: "\u{CEB1}", - nfkd: "\u{110F}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{CEB2}", - nfc: "\u{CEB2}", - nfd: "\u{110F}\u{1163}\u{11AD}", - nfkc: "\u{CEB2}", - nfkd: "\u{110F}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{CEB3}", - nfc: "\u{CEB3}", - nfd: "\u{110F}\u{1163}\u{11AE}", - nfkc: "\u{CEB3}", - nfkd: "\u{110F}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{CEB4}", - nfc: "\u{CEB4}", - nfd: "\u{110F}\u{1163}\u{11AF}", - nfkc: "\u{CEB4}", - nfkd: "\u{110F}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{CEB5}", - nfc: "\u{CEB5}", - nfd: "\u{110F}\u{1163}\u{11B0}", - nfkc: "\u{CEB5}", - nfkd: "\u{110F}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{CEB6}", - nfc: "\u{CEB6}", - nfd: "\u{110F}\u{1163}\u{11B1}", - nfkc: "\u{CEB6}", - nfkd: "\u{110F}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{CEB7}", - nfc: "\u{CEB7}", - nfd: "\u{110F}\u{1163}\u{11B2}", - nfkc: "\u{CEB7}", - nfkd: "\u{110F}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{CEB8}", - nfc: "\u{CEB8}", - nfd: "\u{110F}\u{1163}\u{11B3}", - nfkc: "\u{CEB8}", - nfkd: "\u{110F}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{CEB9}", - nfc: "\u{CEB9}", - nfd: "\u{110F}\u{1163}\u{11B4}", - nfkc: "\u{CEB9}", - nfkd: "\u{110F}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{CEBA}", - nfc: "\u{CEBA}", - nfd: "\u{110F}\u{1163}\u{11B5}", - nfkc: "\u{CEBA}", - nfkd: "\u{110F}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{CEBB}", - nfc: "\u{CEBB}", - nfd: "\u{110F}\u{1163}\u{11B6}", - nfkc: "\u{CEBB}", - nfkd: "\u{110F}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{CEBC}", - nfc: "\u{CEBC}", - nfd: "\u{110F}\u{1163}\u{11B7}", - nfkc: "\u{CEBC}", - nfkd: "\u{110F}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{CEBD}", - nfc: "\u{CEBD}", - nfd: "\u{110F}\u{1163}\u{11B8}", - nfkc: "\u{CEBD}", - nfkd: "\u{110F}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{CEBE}", - nfc: "\u{CEBE}", - nfd: "\u{110F}\u{1163}\u{11B9}", - nfkc: "\u{CEBE}", - nfkd: "\u{110F}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{CEBF}", - nfc: "\u{CEBF}", - nfd: "\u{110F}\u{1163}\u{11BA}", - nfkc: "\u{CEBF}", - nfkd: "\u{110F}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{CEC0}", - nfc: "\u{CEC0}", - nfd: "\u{110F}\u{1163}\u{11BB}", - nfkc: "\u{CEC0}", - nfkd: "\u{110F}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{CEC1}", - nfc: "\u{CEC1}", - nfd: "\u{110F}\u{1163}\u{11BC}", - nfkc: "\u{CEC1}", - nfkd: "\u{110F}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{CEC2}", - nfc: "\u{CEC2}", - nfd: "\u{110F}\u{1163}\u{11BD}", - nfkc: "\u{CEC2}", - nfkd: "\u{110F}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{CEC3}", - nfc: "\u{CEC3}", - nfd: "\u{110F}\u{1163}\u{11BE}", - nfkc: "\u{CEC3}", - nfkd: "\u{110F}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{CEC4}", - nfc: "\u{CEC4}", - nfd: "\u{110F}\u{1163}\u{11BF}", - nfkc: "\u{CEC4}", - nfkd: "\u{110F}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{CEC5}", - nfc: "\u{CEC5}", - nfd: "\u{110F}\u{1163}\u{11C0}", - nfkc: "\u{CEC5}", - nfkd: "\u{110F}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{CEC6}", - nfc: "\u{CEC6}", - nfd: "\u{110F}\u{1163}\u{11C1}", - nfkc: "\u{CEC6}", - nfkd: "\u{110F}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{CEC7}", - nfc: "\u{CEC7}", - nfd: "\u{110F}\u{1163}\u{11C2}", - nfkc: "\u{CEC7}", - nfkd: "\u{110F}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{CEC8}", - nfc: "\u{CEC8}", - nfd: "\u{110F}\u{1164}", - nfkc: "\u{CEC8}", - nfkd: "\u{110F}\u{1164}", - }, - NormalizationTest { - source: "\u{CEC9}", - nfc: "\u{CEC9}", - nfd: "\u{110F}\u{1164}\u{11A8}", - nfkc: "\u{CEC9}", - nfkd: "\u{110F}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{CECA}", - nfc: "\u{CECA}", - nfd: "\u{110F}\u{1164}\u{11A9}", - nfkc: "\u{CECA}", - nfkd: "\u{110F}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{CECB}", - nfc: "\u{CECB}", - nfd: "\u{110F}\u{1164}\u{11AA}", - nfkc: "\u{CECB}", - nfkd: "\u{110F}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{CECC}", - nfc: "\u{CECC}", - nfd: "\u{110F}\u{1164}\u{11AB}", - nfkc: "\u{CECC}", - nfkd: "\u{110F}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{CECD}", - nfc: "\u{CECD}", - nfd: "\u{110F}\u{1164}\u{11AC}", - nfkc: "\u{CECD}", - nfkd: "\u{110F}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{CECE}", - nfc: "\u{CECE}", - nfd: "\u{110F}\u{1164}\u{11AD}", - nfkc: "\u{CECE}", - nfkd: "\u{110F}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{CECF}", - nfc: "\u{CECF}", - nfd: "\u{110F}\u{1164}\u{11AE}", - nfkc: "\u{CECF}", - nfkd: "\u{110F}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{CED0}", - nfc: "\u{CED0}", - nfd: "\u{110F}\u{1164}\u{11AF}", - nfkc: "\u{CED0}", - nfkd: "\u{110F}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{CED1}", - nfc: "\u{CED1}", - nfd: "\u{110F}\u{1164}\u{11B0}", - nfkc: "\u{CED1}", - nfkd: "\u{110F}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{CED2}", - nfc: "\u{CED2}", - nfd: "\u{110F}\u{1164}\u{11B1}", - nfkc: "\u{CED2}", - nfkd: "\u{110F}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{CED3}", - nfc: "\u{CED3}", - nfd: "\u{110F}\u{1164}\u{11B2}", - nfkc: "\u{CED3}", - nfkd: "\u{110F}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{CED4}", - nfc: "\u{CED4}", - nfd: "\u{110F}\u{1164}\u{11B3}", - nfkc: "\u{CED4}", - nfkd: "\u{110F}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{CED5}", - nfc: "\u{CED5}", - nfd: "\u{110F}\u{1164}\u{11B4}", - nfkc: "\u{CED5}", - nfkd: "\u{110F}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{CED6}", - nfc: "\u{CED6}", - nfd: "\u{110F}\u{1164}\u{11B5}", - nfkc: "\u{CED6}", - nfkd: "\u{110F}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{CED7}", - nfc: "\u{CED7}", - nfd: "\u{110F}\u{1164}\u{11B6}", - nfkc: "\u{CED7}", - nfkd: "\u{110F}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{CED8}", - nfc: "\u{CED8}", - nfd: "\u{110F}\u{1164}\u{11B7}", - nfkc: "\u{CED8}", - nfkd: "\u{110F}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{CED9}", - nfc: "\u{CED9}", - nfd: "\u{110F}\u{1164}\u{11B8}", - nfkc: "\u{CED9}", - nfkd: "\u{110F}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{CEDA}", - nfc: "\u{CEDA}", - nfd: "\u{110F}\u{1164}\u{11B9}", - nfkc: "\u{CEDA}", - nfkd: "\u{110F}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{CEDB}", - nfc: "\u{CEDB}", - nfd: "\u{110F}\u{1164}\u{11BA}", - nfkc: "\u{CEDB}", - nfkd: "\u{110F}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{CEDC}", - nfc: "\u{CEDC}", - nfd: "\u{110F}\u{1164}\u{11BB}", - nfkc: "\u{CEDC}", - nfkd: "\u{110F}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{CEDD}", - nfc: "\u{CEDD}", - nfd: "\u{110F}\u{1164}\u{11BC}", - nfkc: "\u{CEDD}", - nfkd: "\u{110F}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{CEDE}", - nfc: "\u{CEDE}", - nfd: "\u{110F}\u{1164}\u{11BD}", - nfkc: "\u{CEDE}", - nfkd: "\u{110F}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{CEDF}", - nfc: "\u{CEDF}", - nfd: "\u{110F}\u{1164}\u{11BE}", - nfkc: "\u{CEDF}", - nfkd: "\u{110F}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{CEE0}", - nfc: "\u{CEE0}", - nfd: "\u{110F}\u{1164}\u{11BF}", - nfkc: "\u{CEE0}", - nfkd: "\u{110F}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{CEE1}", - nfc: "\u{CEE1}", - nfd: "\u{110F}\u{1164}\u{11C0}", - nfkc: "\u{CEE1}", - nfkd: "\u{110F}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{CEE2}", - nfc: "\u{CEE2}", - nfd: "\u{110F}\u{1164}\u{11C1}", - nfkc: "\u{CEE2}", - nfkd: "\u{110F}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{CEE3}", - nfc: "\u{CEE3}", - nfd: "\u{110F}\u{1164}\u{11C2}", - nfkc: "\u{CEE3}", - nfkd: "\u{110F}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{CEE4}", - nfc: "\u{CEE4}", - nfd: "\u{110F}\u{1165}", - nfkc: "\u{CEE4}", - nfkd: "\u{110F}\u{1165}", - }, - NormalizationTest { - source: "\u{CEE5}", - nfc: "\u{CEE5}", - nfd: "\u{110F}\u{1165}\u{11A8}", - nfkc: "\u{CEE5}", - nfkd: "\u{110F}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{CEE6}", - nfc: "\u{CEE6}", - nfd: "\u{110F}\u{1165}\u{11A9}", - nfkc: "\u{CEE6}", - nfkd: "\u{110F}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{CEE7}", - nfc: "\u{CEE7}", - nfd: "\u{110F}\u{1165}\u{11AA}", - nfkc: "\u{CEE7}", - nfkd: "\u{110F}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{CEE8}", - nfc: "\u{CEE8}", - nfd: "\u{110F}\u{1165}\u{11AB}", - nfkc: "\u{CEE8}", - nfkd: "\u{110F}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{CEE9}", - nfc: "\u{CEE9}", - nfd: "\u{110F}\u{1165}\u{11AC}", - nfkc: "\u{CEE9}", - nfkd: "\u{110F}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{CEEA}", - nfc: "\u{CEEA}", - nfd: "\u{110F}\u{1165}\u{11AD}", - nfkc: "\u{CEEA}", - nfkd: "\u{110F}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{CEEB}", - nfc: "\u{CEEB}", - nfd: "\u{110F}\u{1165}\u{11AE}", - nfkc: "\u{CEEB}", - nfkd: "\u{110F}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{CEEC}", - nfc: "\u{CEEC}", - nfd: "\u{110F}\u{1165}\u{11AF}", - nfkc: "\u{CEEC}", - nfkd: "\u{110F}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{CEED}", - nfc: "\u{CEED}", - nfd: "\u{110F}\u{1165}\u{11B0}", - nfkc: "\u{CEED}", - nfkd: "\u{110F}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{CEEE}", - nfc: "\u{CEEE}", - nfd: "\u{110F}\u{1165}\u{11B1}", - nfkc: "\u{CEEE}", - nfkd: "\u{110F}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{CEEF}", - nfc: "\u{CEEF}", - nfd: "\u{110F}\u{1165}\u{11B2}", - nfkc: "\u{CEEF}", - nfkd: "\u{110F}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{CEF0}", - nfc: "\u{CEF0}", - nfd: "\u{110F}\u{1165}\u{11B3}", - nfkc: "\u{CEF0}", - nfkd: "\u{110F}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{CEF1}", - nfc: "\u{CEF1}", - nfd: "\u{110F}\u{1165}\u{11B4}", - nfkc: "\u{CEF1}", - nfkd: "\u{110F}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{CEF2}", - nfc: "\u{CEF2}", - nfd: "\u{110F}\u{1165}\u{11B5}", - nfkc: "\u{CEF2}", - nfkd: "\u{110F}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{CEF3}", - nfc: "\u{CEF3}", - nfd: "\u{110F}\u{1165}\u{11B6}", - nfkc: "\u{CEF3}", - nfkd: "\u{110F}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{CEF4}", - nfc: "\u{CEF4}", - nfd: "\u{110F}\u{1165}\u{11B7}", - nfkc: "\u{CEF4}", - nfkd: "\u{110F}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{CEF5}", - nfc: "\u{CEF5}", - nfd: "\u{110F}\u{1165}\u{11B8}", - nfkc: "\u{CEF5}", - nfkd: "\u{110F}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{CEF6}", - nfc: "\u{CEF6}", - nfd: "\u{110F}\u{1165}\u{11B9}", - nfkc: "\u{CEF6}", - nfkd: "\u{110F}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{CEF7}", - nfc: "\u{CEF7}", - nfd: "\u{110F}\u{1165}\u{11BA}", - nfkc: "\u{CEF7}", - nfkd: "\u{110F}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{CEF8}", - nfc: "\u{CEF8}", - nfd: "\u{110F}\u{1165}\u{11BB}", - nfkc: "\u{CEF8}", - nfkd: "\u{110F}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{CEF9}", - nfc: "\u{CEF9}", - nfd: "\u{110F}\u{1165}\u{11BC}", - nfkc: "\u{CEF9}", - nfkd: "\u{110F}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{CEFA}", - nfc: "\u{CEFA}", - nfd: "\u{110F}\u{1165}\u{11BD}", - nfkc: "\u{CEFA}", - nfkd: "\u{110F}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{CEFB}", - nfc: "\u{CEFB}", - nfd: "\u{110F}\u{1165}\u{11BE}", - nfkc: "\u{CEFB}", - nfkd: "\u{110F}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{CEFC}", - nfc: "\u{CEFC}", - nfd: "\u{110F}\u{1165}\u{11BF}", - nfkc: "\u{CEFC}", - nfkd: "\u{110F}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{CEFD}", - nfc: "\u{CEFD}", - nfd: "\u{110F}\u{1165}\u{11C0}", - nfkc: "\u{CEFD}", - nfkd: "\u{110F}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{CEFE}", - nfc: "\u{CEFE}", - nfd: "\u{110F}\u{1165}\u{11C1}", - nfkc: "\u{CEFE}", - nfkd: "\u{110F}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{CEFF}", - nfc: "\u{CEFF}", - nfd: "\u{110F}\u{1165}\u{11C2}", - nfkc: "\u{CEFF}", - nfkd: "\u{110F}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{CF00}", - nfc: "\u{CF00}", - nfd: "\u{110F}\u{1166}", - nfkc: "\u{CF00}", - nfkd: "\u{110F}\u{1166}", - }, - NormalizationTest { - source: "\u{CF01}", - nfc: "\u{CF01}", - nfd: "\u{110F}\u{1166}\u{11A8}", - nfkc: "\u{CF01}", - nfkd: "\u{110F}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{CF02}", - nfc: "\u{CF02}", - nfd: "\u{110F}\u{1166}\u{11A9}", - nfkc: "\u{CF02}", - nfkd: "\u{110F}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{CF03}", - nfc: "\u{CF03}", - nfd: "\u{110F}\u{1166}\u{11AA}", - nfkc: "\u{CF03}", - nfkd: "\u{110F}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{CF04}", - nfc: "\u{CF04}", - nfd: "\u{110F}\u{1166}\u{11AB}", - nfkc: "\u{CF04}", - nfkd: "\u{110F}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{CF05}", - nfc: "\u{CF05}", - nfd: "\u{110F}\u{1166}\u{11AC}", - nfkc: "\u{CF05}", - nfkd: "\u{110F}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{CF06}", - nfc: "\u{CF06}", - nfd: "\u{110F}\u{1166}\u{11AD}", - nfkc: "\u{CF06}", - nfkd: "\u{110F}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{CF07}", - nfc: "\u{CF07}", - nfd: "\u{110F}\u{1166}\u{11AE}", - nfkc: "\u{CF07}", - nfkd: "\u{110F}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{CF08}", - nfc: "\u{CF08}", - nfd: "\u{110F}\u{1166}\u{11AF}", - nfkc: "\u{CF08}", - nfkd: "\u{110F}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{CF09}", - nfc: "\u{CF09}", - nfd: "\u{110F}\u{1166}\u{11B0}", - nfkc: "\u{CF09}", - nfkd: "\u{110F}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{CF0A}", - nfc: "\u{CF0A}", - nfd: "\u{110F}\u{1166}\u{11B1}", - nfkc: "\u{CF0A}", - nfkd: "\u{110F}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{CF0B}", - nfc: "\u{CF0B}", - nfd: "\u{110F}\u{1166}\u{11B2}", - nfkc: "\u{CF0B}", - nfkd: "\u{110F}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{CF0C}", - nfc: "\u{CF0C}", - nfd: "\u{110F}\u{1166}\u{11B3}", - nfkc: "\u{CF0C}", - nfkd: "\u{110F}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{CF0D}", - nfc: "\u{CF0D}", - nfd: "\u{110F}\u{1166}\u{11B4}", - nfkc: "\u{CF0D}", - nfkd: "\u{110F}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{CF0E}", - nfc: "\u{CF0E}", - nfd: "\u{110F}\u{1166}\u{11B5}", - nfkc: "\u{CF0E}", - nfkd: "\u{110F}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{CF0F}", - nfc: "\u{CF0F}", - nfd: "\u{110F}\u{1166}\u{11B6}", - nfkc: "\u{CF0F}", - nfkd: "\u{110F}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{CF10}", - nfc: "\u{CF10}", - nfd: "\u{110F}\u{1166}\u{11B7}", - nfkc: "\u{CF10}", - nfkd: "\u{110F}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{CF11}", - nfc: "\u{CF11}", - nfd: "\u{110F}\u{1166}\u{11B8}", - nfkc: "\u{CF11}", - nfkd: "\u{110F}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{CF12}", - nfc: "\u{CF12}", - nfd: "\u{110F}\u{1166}\u{11B9}", - nfkc: "\u{CF12}", - nfkd: "\u{110F}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{CF13}", - nfc: "\u{CF13}", - nfd: "\u{110F}\u{1166}\u{11BA}", - nfkc: "\u{CF13}", - nfkd: "\u{110F}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{CF14}", - nfc: "\u{CF14}", - nfd: "\u{110F}\u{1166}\u{11BB}", - nfkc: "\u{CF14}", - nfkd: "\u{110F}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{CF15}", - nfc: "\u{CF15}", - nfd: "\u{110F}\u{1166}\u{11BC}", - nfkc: "\u{CF15}", - nfkd: "\u{110F}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{CF16}", - nfc: "\u{CF16}", - nfd: "\u{110F}\u{1166}\u{11BD}", - nfkc: "\u{CF16}", - nfkd: "\u{110F}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{CF17}", - nfc: "\u{CF17}", - nfd: "\u{110F}\u{1166}\u{11BE}", - nfkc: "\u{CF17}", - nfkd: "\u{110F}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{CF18}", - nfc: "\u{CF18}", - nfd: "\u{110F}\u{1166}\u{11BF}", - nfkc: "\u{CF18}", - nfkd: "\u{110F}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{CF19}", - nfc: "\u{CF19}", - nfd: "\u{110F}\u{1166}\u{11C0}", - nfkc: "\u{CF19}", - nfkd: "\u{110F}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{CF1A}", - nfc: "\u{CF1A}", - nfd: "\u{110F}\u{1166}\u{11C1}", - nfkc: "\u{CF1A}", - nfkd: "\u{110F}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{CF1B}", - nfc: "\u{CF1B}", - nfd: "\u{110F}\u{1166}\u{11C2}", - nfkc: "\u{CF1B}", - nfkd: "\u{110F}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{CF1C}", - nfc: "\u{CF1C}", - nfd: "\u{110F}\u{1167}", - nfkc: "\u{CF1C}", - nfkd: "\u{110F}\u{1167}", - }, - NormalizationTest { - source: "\u{CF1D}", - nfc: "\u{CF1D}", - nfd: "\u{110F}\u{1167}\u{11A8}", - nfkc: "\u{CF1D}", - nfkd: "\u{110F}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{CF1E}", - nfc: "\u{CF1E}", - nfd: "\u{110F}\u{1167}\u{11A9}", - nfkc: "\u{CF1E}", - nfkd: "\u{110F}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{CF1F}", - nfc: "\u{CF1F}", - nfd: "\u{110F}\u{1167}\u{11AA}", - nfkc: "\u{CF1F}", - nfkd: "\u{110F}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{CF20}", - nfc: "\u{CF20}", - nfd: "\u{110F}\u{1167}\u{11AB}", - nfkc: "\u{CF20}", - nfkd: "\u{110F}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{CF21}", - nfc: "\u{CF21}", - nfd: "\u{110F}\u{1167}\u{11AC}", - nfkc: "\u{CF21}", - nfkd: "\u{110F}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{CF22}", - nfc: "\u{CF22}", - nfd: "\u{110F}\u{1167}\u{11AD}", - nfkc: "\u{CF22}", - nfkd: "\u{110F}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{CF23}", - nfc: "\u{CF23}", - nfd: "\u{110F}\u{1167}\u{11AE}", - nfkc: "\u{CF23}", - nfkd: "\u{110F}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{CF24}", - nfc: "\u{CF24}", - nfd: "\u{110F}\u{1167}\u{11AF}", - nfkc: "\u{CF24}", - nfkd: "\u{110F}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{CF25}", - nfc: "\u{CF25}", - nfd: "\u{110F}\u{1167}\u{11B0}", - nfkc: "\u{CF25}", - nfkd: "\u{110F}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{CF26}", - nfc: "\u{CF26}", - nfd: "\u{110F}\u{1167}\u{11B1}", - nfkc: "\u{CF26}", - nfkd: "\u{110F}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{CF27}", - nfc: "\u{CF27}", - nfd: "\u{110F}\u{1167}\u{11B2}", - nfkc: "\u{CF27}", - nfkd: "\u{110F}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{CF28}", - nfc: "\u{CF28}", - nfd: "\u{110F}\u{1167}\u{11B3}", - nfkc: "\u{CF28}", - nfkd: "\u{110F}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{CF29}", - nfc: "\u{CF29}", - nfd: "\u{110F}\u{1167}\u{11B4}", - nfkc: "\u{CF29}", - nfkd: "\u{110F}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{CF2A}", - nfc: "\u{CF2A}", - nfd: "\u{110F}\u{1167}\u{11B5}", - nfkc: "\u{CF2A}", - nfkd: "\u{110F}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{CF2B}", - nfc: "\u{CF2B}", - nfd: "\u{110F}\u{1167}\u{11B6}", - nfkc: "\u{CF2B}", - nfkd: "\u{110F}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{CF2C}", - nfc: "\u{CF2C}", - nfd: "\u{110F}\u{1167}\u{11B7}", - nfkc: "\u{CF2C}", - nfkd: "\u{110F}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{CF2D}", - nfc: "\u{CF2D}", - nfd: "\u{110F}\u{1167}\u{11B8}", - nfkc: "\u{CF2D}", - nfkd: "\u{110F}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{CF2E}", - nfc: "\u{CF2E}", - nfd: "\u{110F}\u{1167}\u{11B9}", - nfkc: "\u{CF2E}", - nfkd: "\u{110F}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{CF2F}", - nfc: "\u{CF2F}", - nfd: "\u{110F}\u{1167}\u{11BA}", - nfkc: "\u{CF2F}", - nfkd: "\u{110F}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{CF30}", - nfc: "\u{CF30}", - nfd: "\u{110F}\u{1167}\u{11BB}", - nfkc: "\u{CF30}", - nfkd: "\u{110F}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{CF31}", - nfc: "\u{CF31}", - nfd: "\u{110F}\u{1167}\u{11BC}", - nfkc: "\u{CF31}", - nfkd: "\u{110F}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{CF32}", - nfc: "\u{CF32}", - nfd: "\u{110F}\u{1167}\u{11BD}", - nfkc: "\u{CF32}", - nfkd: "\u{110F}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{CF33}", - nfc: "\u{CF33}", - nfd: "\u{110F}\u{1167}\u{11BE}", - nfkc: "\u{CF33}", - nfkd: "\u{110F}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{CF34}", - nfc: "\u{CF34}", - nfd: "\u{110F}\u{1167}\u{11BF}", - nfkc: "\u{CF34}", - nfkd: "\u{110F}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{CF35}", - nfc: "\u{CF35}", - nfd: "\u{110F}\u{1167}\u{11C0}", - nfkc: "\u{CF35}", - nfkd: "\u{110F}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{CF36}", - nfc: "\u{CF36}", - nfd: "\u{110F}\u{1167}\u{11C1}", - nfkc: "\u{CF36}", - nfkd: "\u{110F}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{CF37}", - nfc: "\u{CF37}", - nfd: "\u{110F}\u{1167}\u{11C2}", - nfkc: "\u{CF37}", - nfkd: "\u{110F}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{CF38}", - nfc: "\u{CF38}", - nfd: "\u{110F}\u{1168}", - nfkc: "\u{CF38}", - nfkd: "\u{110F}\u{1168}", - }, - NormalizationTest { - source: "\u{CF39}", - nfc: "\u{CF39}", - nfd: "\u{110F}\u{1168}\u{11A8}", - nfkc: "\u{CF39}", - nfkd: "\u{110F}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{CF3A}", - nfc: "\u{CF3A}", - nfd: "\u{110F}\u{1168}\u{11A9}", - nfkc: "\u{CF3A}", - nfkd: "\u{110F}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{CF3B}", - nfc: "\u{CF3B}", - nfd: "\u{110F}\u{1168}\u{11AA}", - nfkc: "\u{CF3B}", - nfkd: "\u{110F}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{CF3C}", - nfc: "\u{CF3C}", - nfd: "\u{110F}\u{1168}\u{11AB}", - nfkc: "\u{CF3C}", - nfkd: "\u{110F}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{CF3D}", - nfc: "\u{CF3D}", - nfd: "\u{110F}\u{1168}\u{11AC}", - nfkc: "\u{CF3D}", - nfkd: "\u{110F}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{CF3E}", - nfc: "\u{CF3E}", - nfd: "\u{110F}\u{1168}\u{11AD}", - nfkc: "\u{CF3E}", - nfkd: "\u{110F}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{CF3F}", - nfc: "\u{CF3F}", - nfd: "\u{110F}\u{1168}\u{11AE}", - nfkc: "\u{CF3F}", - nfkd: "\u{110F}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{CF40}", - nfc: "\u{CF40}", - nfd: "\u{110F}\u{1168}\u{11AF}", - nfkc: "\u{CF40}", - nfkd: "\u{110F}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{CF41}", - nfc: "\u{CF41}", - nfd: "\u{110F}\u{1168}\u{11B0}", - nfkc: "\u{CF41}", - nfkd: "\u{110F}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{CF42}", - nfc: "\u{CF42}", - nfd: "\u{110F}\u{1168}\u{11B1}", - nfkc: "\u{CF42}", - nfkd: "\u{110F}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{CF43}", - nfc: "\u{CF43}", - nfd: "\u{110F}\u{1168}\u{11B2}", - nfkc: "\u{CF43}", - nfkd: "\u{110F}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{CF44}", - nfc: "\u{CF44}", - nfd: "\u{110F}\u{1168}\u{11B3}", - nfkc: "\u{CF44}", - nfkd: "\u{110F}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{CF45}", - nfc: "\u{CF45}", - nfd: "\u{110F}\u{1168}\u{11B4}", - nfkc: "\u{CF45}", - nfkd: "\u{110F}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{CF46}", - nfc: "\u{CF46}", - nfd: "\u{110F}\u{1168}\u{11B5}", - nfkc: "\u{CF46}", - nfkd: "\u{110F}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{CF47}", - nfc: "\u{CF47}", - nfd: "\u{110F}\u{1168}\u{11B6}", - nfkc: "\u{CF47}", - nfkd: "\u{110F}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{CF48}", - nfc: "\u{CF48}", - nfd: "\u{110F}\u{1168}\u{11B7}", - nfkc: "\u{CF48}", - nfkd: "\u{110F}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{CF49}", - nfc: "\u{CF49}", - nfd: "\u{110F}\u{1168}\u{11B8}", - nfkc: "\u{CF49}", - nfkd: "\u{110F}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{CF4A}", - nfc: "\u{CF4A}", - nfd: "\u{110F}\u{1168}\u{11B9}", - nfkc: "\u{CF4A}", - nfkd: "\u{110F}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{CF4B}", - nfc: "\u{CF4B}", - nfd: "\u{110F}\u{1168}\u{11BA}", - nfkc: "\u{CF4B}", - nfkd: "\u{110F}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{CF4C}", - nfc: "\u{CF4C}", - nfd: "\u{110F}\u{1168}\u{11BB}", - nfkc: "\u{CF4C}", - nfkd: "\u{110F}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{CF4D}", - nfc: "\u{CF4D}", - nfd: "\u{110F}\u{1168}\u{11BC}", - nfkc: "\u{CF4D}", - nfkd: "\u{110F}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{CF4E}", - nfc: "\u{CF4E}", - nfd: "\u{110F}\u{1168}\u{11BD}", - nfkc: "\u{CF4E}", - nfkd: "\u{110F}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{CF4F}", - nfc: "\u{CF4F}", - nfd: "\u{110F}\u{1168}\u{11BE}", - nfkc: "\u{CF4F}", - nfkd: "\u{110F}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{CF50}", - nfc: "\u{CF50}", - nfd: "\u{110F}\u{1168}\u{11BF}", - nfkc: "\u{CF50}", - nfkd: "\u{110F}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{CF51}", - nfc: "\u{CF51}", - nfd: "\u{110F}\u{1168}\u{11C0}", - nfkc: "\u{CF51}", - nfkd: "\u{110F}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{CF52}", - nfc: "\u{CF52}", - nfd: "\u{110F}\u{1168}\u{11C1}", - nfkc: "\u{CF52}", - nfkd: "\u{110F}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{CF53}", - nfc: "\u{CF53}", - nfd: "\u{110F}\u{1168}\u{11C2}", - nfkc: "\u{CF53}", - nfkd: "\u{110F}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{CF54}", - nfc: "\u{CF54}", - nfd: "\u{110F}\u{1169}", - nfkc: "\u{CF54}", - nfkd: "\u{110F}\u{1169}", - }, - NormalizationTest { - source: "\u{CF55}", - nfc: "\u{CF55}", - nfd: "\u{110F}\u{1169}\u{11A8}", - nfkc: "\u{CF55}", - nfkd: "\u{110F}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{CF56}", - nfc: "\u{CF56}", - nfd: "\u{110F}\u{1169}\u{11A9}", - nfkc: "\u{CF56}", - nfkd: "\u{110F}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{CF57}", - nfc: "\u{CF57}", - nfd: "\u{110F}\u{1169}\u{11AA}", - nfkc: "\u{CF57}", - nfkd: "\u{110F}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{CF58}", - nfc: "\u{CF58}", - nfd: "\u{110F}\u{1169}\u{11AB}", - nfkc: "\u{CF58}", - nfkd: "\u{110F}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{CF59}", - nfc: "\u{CF59}", - nfd: "\u{110F}\u{1169}\u{11AC}", - nfkc: "\u{CF59}", - nfkd: "\u{110F}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{CF5A}", - nfc: "\u{CF5A}", - nfd: "\u{110F}\u{1169}\u{11AD}", - nfkc: "\u{CF5A}", - nfkd: "\u{110F}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{CF5B}", - nfc: "\u{CF5B}", - nfd: "\u{110F}\u{1169}\u{11AE}", - nfkc: "\u{CF5B}", - nfkd: "\u{110F}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{CF5C}", - nfc: "\u{CF5C}", - nfd: "\u{110F}\u{1169}\u{11AF}", - nfkc: "\u{CF5C}", - nfkd: "\u{110F}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{CF5D}", - nfc: "\u{CF5D}", - nfd: "\u{110F}\u{1169}\u{11B0}", - nfkc: "\u{CF5D}", - nfkd: "\u{110F}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{CF5E}", - nfc: "\u{CF5E}", - nfd: "\u{110F}\u{1169}\u{11B1}", - nfkc: "\u{CF5E}", - nfkd: "\u{110F}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{CF5F}", - nfc: "\u{CF5F}", - nfd: "\u{110F}\u{1169}\u{11B2}", - nfkc: "\u{CF5F}", - nfkd: "\u{110F}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{CF60}", - nfc: "\u{CF60}", - nfd: "\u{110F}\u{1169}\u{11B3}", - nfkc: "\u{CF60}", - nfkd: "\u{110F}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{CF61}", - nfc: "\u{CF61}", - nfd: "\u{110F}\u{1169}\u{11B4}", - nfkc: "\u{CF61}", - nfkd: "\u{110F}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{CF62}", - nfc: "\u{CF62}", - nfd: "\u{110F}\u{1169}\u{11B5}", - nfkc: "\u{CF62}", - nfkd: "\u{110F}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{CF63}", - nfc: "\u{CF63}", - nfd: "\u{110F}\u{1169}\u{11B6}", - nfkc: "\u{CF63}", - nfkd: "\u{110F}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{CF64}", - nfc: "\u{CF64}", - nfd: "\u{110F}\u{1169}\u{11B7}", - nfkc: "\u{CF64}", - nfkd: "\u{110F}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{CF65}", - nfc: "\u{CF65}", - nfd: "\u{110F}\u{1169}\u{11B8}", - nfkc: "\u{CF65}", - nfkd: "\u{110F}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{CF66}", - nfc: "\u{CF66}", - nfd: "\u{110F}\u{1169}\u{11B9}", - nfkc: "\u{CF66}", - nfkd: "\u{110F}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{CF67}", - nfc: "\u{CF67}", - nfd: "\u{110F}\u{1169}\u{11BA}", - nfkc: "\u{CF67}", - nfkd: "\u{110F}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{CF68}", - nfc: "\u{CF68}", - nfd: "\u{110F}\u{1169}\u{11BB}", - nfkc: "\u{CF68}", - nfkd: "\u{110F}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{CF69}", - nfc: "\u{CF69}", - nfd: "\u{110F}\u{1169}\u{11BC}", - nfkc: "\u{CF69}", - nfkd: "\u{110F}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{CF6A}", - nfc: "\u{CF6A}", - nfd: "\u{110F}\u{1169}\u{11BD}", - nfkc: "\u{CF6A}", - nfkd: "\u{110F}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{CF6B}", - nfc: "\u{CF6B}", - nfd: "\u{110F}\u{1169}\u{11BE}", - nfkc: "\u{CF6B}", - nfkd: "\u{110F}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{CF6C}", - nfc: "\u{CF6C}", - nfd: "\u{110F}\u{1169}\u{11BF}", - nfkc: "\u{CF6C}", - nfkd: "\u{110F}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{CF6D}", - nfc: "\u{CF6D}", - nfd: "\u{110F}\u{1169}\u{11C0}", - nfkc: "\u{CF6D}", - nfkd: "\u{110F}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{CF6E}", - nfc: "\u{CF6E}", - nfd: "\u{110F}\u{1169}\u{11C1}", - nfkc: "\u{CF6E}", - nfkd: "\u{110F}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{CF6F}", - nfc: "\u{CF6F}", - nfd: "\u{110F}\u{1169}\u{11C2}", - nfkc: "\u{CF6F}", - nfkd: "\u{110F}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{CF70}", - nfc: "\u{CF70}", - nfd: "\u{110F}\u{116A}", - nfkc: "\u{CF70}", - nfkd: "\u{110F}\u{116A}", - }, - NormalizationTest { - source: "\u{CF71}", - nfc: "\u{CF71}", - nfd: "\u{110F}\u{116A}\u{11A8}", - nfkc: "\u{CF71}", - nfkd: "\u{110F}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{CF72}", - nfc: "\u{CF72}", - nfd: "\u{110F}\u{116A}\u{11A9}", - nfkc: "\u{CF72}", - nfkd: "\u{110F}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{CF73}", - nfc: "\u{CF73}", - nfd: "\u{110F}\u{116A}\u{11AA}", - nfkc: "\u{CF73}", - nfkd: "\u{110F}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{CF74}", - nfc: "\u{CF74}", - nfd: "\u{110F}\u{116A}\u{11AB}", - nfkc: "\u{CF74}", - nfkd: "\u{110F}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{CF75}", - nfc: "\u{CF75}", - nfd: "\u{110F}\u{116A}\u{11AC}", - nfkc: "\u{CF75}", - nfkd: "\u{110F}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{CF76}", - nfc: "\u{CF76}", - nfd: "\u{110F}\u{116A}\u{11AD}", - nfkc: "\u{CF76}", - nfkd: "\u{110F}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{CF77}", - nfc: "\u{CF77}", - nfd: "\u{110F}\u{116A}\u{11AE}", - nfkc: "\u{CF77}", - nfkd: "\u{110F}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{CF78}", - nfc: "\u{CF78}", - nfd: "\u{110F}\u{116A}\u{11AF}", - nfkc: "\u{CF78}", - nfkd: "\u{110F}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{CF79}", - nfc: "\u{CF79}", - nfd: "\u{110F}\u{116A}\u{11B0}", - nfkc: "\u{CF79}", - nfkd: "\u{110F}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{CF7A}", - nfc: "\u{CF7A}", - nfd: "\u{110F}\u{116A}\u{11B1}", - nfkc: "\u{CF7A}", - nfkd: "\u{110F}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{CF7B}", - nfc: "\u{CF7B}", - nfd: "\u{110F}\u{116A}\u{11B2}", - nfkc: "\u{CF7B}", - nfkd: "\u{110F}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{CF7C}", - nfc: "\u{CF7C}", - nfd: "\u{110F}\u{116A}\u{11B3}", - nfkc: "\u{CF7C}", - nfkd: "\u{110F}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{CF7D}", - nfc: "\u{CF7D}", - nfd: "\u{110F}\u{116A}\u{11B4}", - nfkc: "\u{CF7D}", - nfkd: "\u{110F}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{CF7E}", - nfc: "\u{CF7E}", - nfd: "\u{110F}\u{116A}\u{11B5}", - nfkc: "\u{CF7E}", - nfkd: "\u{110F}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{CF7F}", - nfc: "\u{CF7F}", - nfd: "\u{110F}\u{116A}\u{11B6}", - nfkc: "\u{CF7F}", - nfkd: "\u{110F}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{CF80}", - nfc: "\u{CF80}", - nfd: "\u{110F}\u{116A}\u{11B7}", - nfkc: "\u{CF80}", - nfkd: "\u{110F}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{CF81}", - nfc: "\u{CF81}", - nfd: "\u{110F}\u{116A}\u{11B8}", - nfkc: "\u{CF81}", - nfkd: "\u{110F}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{CF82}", - nfc: "\u{CF82}", - nfd: "\u{110F}\u{116A}\u{11B9}", - nfkc: "\u{CF82}", - nfkd: "\u{110F}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{CF83}", - nfc: "\u{CF83}", - nfd: "\u{110F}\u{116A}\u{11BA}", - nfkc: "\u{CF83}", - nfkd: "\u{110F}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{CF84}", - nfc: "\u{CF84}", - nfd: "\u{110F}\u{116A}\u{11BB}", - nfkc: "\u{CF84}", - nfkd: "\u{110F}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{CF85}", - nfc: "\u{CF85}", - nfd: "\u{110F}\u{116A}\u{11BC}", - nfkc: "\u{CF85}", - nfkd: "\u{110F}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{CF86}", - nfc: "\u{CF86}", - nfd: "\u{110F}\u{116A}\u{11BD}", - nfkc: "\u{CF86}", - nfkd: "\u{110F}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{CF87}", - nfc: "\u{CF87}", - nfd: "\u{110F}\u{116A}\u{11BE}", - nfkc: "\u{CF87}", - nfkd: "\u{110F}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{CF88}", - nfc: "\u{CF88}", - nfd: "\u{110F}\u{116A}\u{11BF}", - nfkc: "\u{CF88}", - nfkd: "\u{110F}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{CF89}", - nfc: "\u{CF89}", - nfd: "\u{110F}\u{116A}\u{11C0}", - nfkc: "\u{CF89}", - nfkd: "\u{110F}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{CF8A}", - nfc: "\u{CF8A}", - nfd: "\u{110F}\u{116A}\u{11C1}", - nfkc: "\u{CF8A}", - nfkd: "\u{110F}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{CF8B}", - nfc: "\u{CF8B}", - nfd: "\u{110F}\u{116A}\u{11C2}", - nfkc: "\u{CF8B}", - nfkd: "\u{110F}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{CF8C}", - nfc: "\u{CF8C}", - nfd: "\u{110F}\u{116B}", - nfkc: "\u{CF8C}", - nfkd: "\u{110F}\u{116B}", - }, - NormalizationTest { - source: "\u{CF8D}", - nfc: "\u{CF8D}", - nfd: "\u{110F}\u{116B}\u{11A8}", - nfkc: "\u{CF8D}", - nfkd: "\u{110F}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{CF8E}", - nfc: "\u{CF8E}", - nfd: "\u{110F}\u{116B}\u{11A9}", - nfkc: "\u{CF8E}", - nfkd: "\u{110F}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{CF8F}", - nfc: "\u{CF8F}", - nfd: "\u{110F}\u{116B}\u{11AA}", - nfkc: "\u{CF8F}", - nfkd: "\u{110F}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{CF90}", - nfc: "\u{CF90}", - nfd: "\u{110F}\u{116B}\u{11AB}", - nfkc: "\u{CF90}", - nfkd: "\u{110F}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{CF91}", - nfc: "\u{CF91}", - nfd: "\u{110F}\u{116B}\u{11AC}", - nfkc: "\u{CF91}", - nfkd: "\u{110F}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{CF92}", - nfc: "\u{CF92}", - nfd: "\u{110F}\u{116B}\u{11AD}", - nfkc: "\u{CF92}", - nfkd: "\u{110F}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{CF93}", - nfc: "\u{CF93}", - nfd: "\u{110F}\u{116B}\u{11AE}", - nfkc: "\u{CF93}", - nfkd: "\u{110F}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{CF94}", - nfc: "\u{CF94}", - nfd: "\u{110F}\u{116B}\u{11AF}", - nfkc: "\u{CF94}", - nfkd: "\u{110F}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{CF95}", - nfc: "\u{CF95}", - nfd: "\u{110F}\u{116B}\u{11B0}", - nfkc: "\u{CF95}", - nfkd: "\u{110F}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{CF96}", - nfc: "\u{CF96}", - nfd: "\u{110F}\u{116B}\u{11B1}", - nfkc: "\u{CF96}", - nfkd: "\u{110F}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{CF97}", - nfc: "\u{CF97}", - nfd: "\u{110F}\u{116B}\u{11B2}", - nfkc: "\u{CF97}", - nfkd: "\u{110F}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{CF98}", - nfc: "\u{CF98}", - nfd: "\u{110F}\u{116B}\u{11B3}", - nfkc: "\u{CF98}", - nfkd: "\u{110F}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{CF99}", - nfc: "\u{CF99}", - nfd: "\u{110F}\u{116B}\u{11B4}", - nfkc: "\u{CF99}", - nfkd: "\u{110F}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{CF9A}", - nfc: "\u{CF9A}", - nfd: "\u{110F}\u{116B}\u{11B5}", - nfkc: "\u{CF9A}", - nfkd: "\u{110F}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{CF9B}", - nfc: "\u{CF9B}", - nfd: "\u{110F}\u{116B}\u{11B6}", - nfkc: "\u{CF9B}", - nfkd: "\u{110F}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{CF9C}", - nfc: "\u{CF9C}", - nfd: "\u{110F}\u{116B}\u{11B7}", - nfkc: "\u{CF9C}", - nfkd: "\u{110F}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{CF9D}", - nfc: "\u{CF9D}", - nfd: "\u{110F}\u{116B}\u{11B8}", - nfkc: "\u{CF9D}", - nfkd: "\u{110F}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{CF9E}", - nfc: "\u{CF9E}", - nfd: "\u{110F}\u{116B}\u{11B9}", - nfkc: "\u{CF9E}", - nfkd: "\u{110F}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{CF9F}", - nfc: "\u{CF9F}", - nfd: "\u{110F}\u{116B}\u{11BA}", - nfkc: "\u{CF9F}", - nfkd: "\u{110F}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{CFA0}", - nfc: "\u{CFA0}", - nfd: "\u{110F}\u{116B}\u{11BB}", - nfkc: "\u{CFA0}", - nfkd: "\u{110F}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{CFA1}", - nfc: "\u{CFA1}", - nfd: "\u{110F}\u{116B}\u{11BC}", - nfkc: "\u{CFA1}", - nfkd: "\u{110F}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{CFA2}", - nfc: "\u{CFA2}", - nfd: "\u{110F}\u{116B}\u{11BD}", - nfkc: "\u{CFA2}", - nfkd: "\u{110F}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{CFA3}", - nfc: "\u{CFA3}", - nfd: "\u{110F}\u{116B}\u{11BE}", - nfkc: "\u{CFA3}", - nfkd: "\u{110F}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{CFA4}", - nfc: "\u{CFA4}", - nfd: "\u{110F}\u{116B}\u{11BF}", - nfkc: "\u{CFA4}", - nfkd: "\u{110F}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{CFA5}", - nfc: "\u{CFA5}", - nfd: "\u{110F}\u{116B}\u{11C0}", - nfkc: "\u{CFA5}", - nfkd: "\u{110F}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{CFA6}", - nfc: "\u{CFA6}", - nfd: "\u{110F}\u{116B}\u{11C1}", - nfkc: "\u{CFA6}", - nfkd: "\u{110F}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{CFA7}", - nfc: "\u{CFA7}", - nfd: "\u{110F}\u{116B}\u{11C2}", - nfkc: "\u{CFA7}", - nfkd: "\u{110F}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{CFA8}", - nfc: "\u{CFA8}", - nfd: "\u{110F}\u{116C}", - nfkc: "\u{CFA8}", - nfkd: "\u{110F}\u{116C}", - }, - NormalizationTest { - source: "\u{CFA9}", - nfc: "\u{CFA9}", - nfd: "\u{110F}\u{116C}\u{11A8}", - nfkc: "\u{CFA9}", - nfkd: "\u{110F}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{CFAA}", - nfc: "\u{CFAA}", - nfd: "\u{110F}\u{116C}\u{11A9}", - nfkc: "\u{CFAA}", - nfkd: "\u{110F}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{CFAB}", - nfc: "\u{CFAB}", - nfd: "\u{110F}\u{116C}\u{11AA}", - nfkc: "\u{CFAB}", - nfkd: "\u{110F}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{CFAC}", - nfc: "\u{CFAC}", - nfd: "\u{110F}\u{116C}\u{11AB}", - nfkc: "\u{CFAC}", - nfkd: "\u{110F}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{CFAD}", - nfc: "\u{CFAD}", - nfd: "\u{110F}\u{116C}\u{11AC}", - nfkc: "\u{CFAD}", - nfkd: "\u{110F}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{CFAE}", - nfc: "\u{CFAE}", - nfd: "\u{110F}\u{116C}\u{11AD}", - nfkc: "\u{CFAE}", - nfkd: "\u{110F}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{CFAF}", - nfc: "\u{CFAF}", - nfd: "\u{110F}\u{116C}\u{11AE}", - nfkc: "\u{CFAF}", - nfkd: "\u{110F}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{CFB0}", - nfc: "\u{CFB0}", - nfd: "\u{110F}\u{116C}\u{11AF}", - nfkc: "\u{CFB0}", - nfkd: "\u{110F}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{CFB1}", - nfc: "\u{CFB1}", - nfd: "\u{110F}\u{116C}\u{11B0}", - nfkc: "\u{CFB1}", - nfkd: "\u{110F}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{CFB2}", - nfc: "\u{CFB2}", - nfd: "\u{110F}\u{116C}\u{11B1}", - nfkc: "\u{CFB2}", - nfkd: "\u{110F}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{CFB3}", - nfc: "\u{CFB3}", - nfd: "\u{110F}\u{116C}\u{11B2}", - nfkc: "\u{CFB3}", - nfkd: "\u{110F}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{CFB4}", - nfc: "\u{CFB4}", - nfd: "\u{110F}\u{116C}\u{11B3}", - nfkc: "\u{CFB4}", - nfkd: "\u{110F}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{CFB5}", - nfc: "\u{CFB5}", - nfd: "\u{110F}\u{116C}\u{11B4}", - nfkc: "\u{CFB5}", - nfkd: "\u{110F}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{CFB6}", - nfc: "\u{CFB6}", - nfd: "\u{110F}\u{116C}\u{11B5}", - nfkc: "\u{CFB6}", - nfkd: "\u{110F}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{CFB7}", - nfc: "\u{CFB7}", - nfd: "\u{110F}\u{116C}\u{11B6}", - nfkc: "\u{CFB7}", - nfkd: "\u{110F}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{CFB8}", - nfc: "\u{CFB8}", - nfd: "\u{110F}\u{116C}\u{11B7}", - nfkc: "\u{CFB8}", - nfkd: "\u{110F}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{CFB9}", - nfc: "\u{CFB9}", - nfd: "\u{110F}\u{116C}\u{11B8}", - nfkc: "\u{CFB9}", - nfkd: "\u{110F}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{CFBA}", - nfc: "\u{CFBA}", - nfd: "\u{110F}\u{116C}\u{11B9}", - nfkc: "\u{CFBA}", - nfkd: "\u{110F}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{CFBB}", - nfc: "\u{CFBB}", - nfd: "\u{110F}\u{116C}\u{11BA}", - nfkc: "\u{CFBB}", - nfkd: "\u{110F}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{CFBC}", - nfc: "\u{CFBC}", - nfd: "\u{110F}\u{116C}\u{11BB}", - nfkc: "\u{CFBC}", - nfkd: "\u{110F}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{CFBD}", - nfc: "\u{CFBD}", - nfd: "\u{110F}\u{116C}\u{11BC}", - nfkc: "\u{CFBD}", - nfkd: "\u{110F}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{CFBE}", - nfc: "\u{CFBE}", - nfd: "\u{110F}\u{116C}\u{11BD}", - nfkc: "\u{CFBE}", - nfkd: "\u{110F}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{CFBF}", - nfc: "\u{CFBF}", - nfd: "\u{110F}\u{116C}\u{11BE}", - nfkc: "\u{CFBF}", - nfkd: "\u{110F}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{CFC0}", - nfc: "\u{CFC0}", - nfd: "\u{110F}\u{116C}\u{11BF}", - nfkc: "\u{CFC0}", - nfkd: "\u{110F}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{CFC1}", - nfc: "\u{CFC1}", - nfd: "\u{110F}\u{116C}\u{11C0}", - nfkc: "\u{CFC1}", - nfkd: "\u{110F}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{CFC2}", - nfc: "\u{CFC2}", - nfd: "\u{110F}\u{116C}\u{11C1}", - nfkc: "\u{CFC2}", - nfkd: "\u{110F}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{CFC3}", - nfc: "\u{CFC3}", - nfd: "\u{110F}\u{116C}\u{11C2}", - nfkc: "\u{CFC3}", - nfkd: "\u{110F}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{CFC4}", - nfc: "\u{CFC4}", - nfd: "\u{110F}\u{116D}", - nfkc: "\u{CFC4}", - nfkd: "\u{110F}\u{116D}", - }, - NormalizationTest { - source: "\u{CFC5}", - nfc: "\u{CFC5}", - nfd: "\u{110F}\u{116D}\u{11A8}", - nfkc: "\u{CFC5}", - nfkd: "\u{110F}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{CFC6}", - nfc: "\u{CFC6}", - nfd: "\u{110F}\u{116D}\u{11A9}", - nfkc: "\u{CFC6}", - nfkd: "\u{110F}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{CFC7}", - nfc: "\u{CFC7}", - nfd: "\u{110F}\u{116D}\u{11AA}", - nfkc: "\u{CFC7}", - nfkd: "\u{110F}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{CFC8}", - nfc: "\u{CFC8}", - nfd: "\u{110F}\u{116D}\u{11AB}", - nfkc: "\u{CFC8}", - nfkd: "\u{110F}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{CFC9}", - nfc: "\u{CFC9}", - nfd: "\u{110F}\u{116D}\u{11AC}", - nfkc: "\u{CFC9}", - nfkd: "\u{110F}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{CFCA}", - nfc: "\u{CFCA}", - nfd: "\u{110F}\u{116D}\u{11AD}", - nfkc: "\u{CFCA}", - nfkd: "\u{110F}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{CFCB}", - nfc: "\u{CFCB}", - nfd: "\u{110F}\u{116D}\u{11AE}", - nfkc: "\u{CFCB}", - nfkd: "\u{110F}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{CFCC}", - nfc: "\u{CFCC}", - nfd: "\u{110F}\u{116D}\u{11AF}", - nfkc: "\u{CFCC}", - nfkd: "\u{110F}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{CFCD}", - nfc: "\u{CFCD}", - nfd: "\u{110F}\u{116D}\u{11B0}", - nfkc: "\u{CFCD}", - nfkd: "\u{110F}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{CFCE}", - nfc: "\u{CFCE}", - nfd: "\u{110F}\u{116D}\u{11B1}", - nfkc: "\u{CFCE}", - nfkd: "\u{110F}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{CFCF}", - nfc: "\u{CFCF}", - nfd: "\u{110F}\u{116D}\u{11B2}", - nfkc: "\u{CFCF}", - nfkd: "\u{110F}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{CFD0}", - nfc: "\u{CFD0}", - nfd: "\u{110F}\u{116D}\u{11B3}", - nfkc: "\u{CFD0}", - nfkd: "\u{110F}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{CFD1}", - nfc: "\u{CFD1}", - nfd: "\u{110F}\u{116D}\u{11B4}", - nfkc: "\u{CFD1}", - nfkd: "\u{110F}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{CFD2}", - nfc: "\u{CFD2}", - nfd: "\u{110F}\u{116D}\u{11B5}", - nfkc: "\u{CFD2}", - nfkd: "\u{110F}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{CFD3}", - nfc: "\u{CFD3}", - nfd: "\u{110F}\u{116D}\u{11B6}", - nfkc: "\u{CFD3}", - nfkd: "\u{110F}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{CFD4}", - nfc: "\u{CFD4}", - nfd: "\u{110F}\u{116D}\u{11B7}", - nfkc: "\u{CFD4}", - nfkd: "\u{110F}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{CFD5}", - nfc: "\u{CFD5}", - nfd: "\u{110F}\u{116D}\u{11B8}", - nfkc: "\u{CFD5}", - nfkd: "\u{110F}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{CFD6}", - nfc: "\u{CFD6}", - nfd: "\u{110F}\u{116D}\u{11B9}", - nfkc: "\u{CFD6}", - nfkd: "\u{110F}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{CFD7}", - nfc: "\u{CFD7}", - nfd: "\u{110F}\u{116D}\u{11BA}", - nfkc: "\u{CFD7}", - nfkd: "\u{110F}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{CFD8}", - nfc: "\u{CFD8}", - nfd: "\u{110F}\u{116D}\u{11BB}", - nfkc: "\u{CFD8}", - nfkd: "\u{110F}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{CFD9}", - nfc: "\u{CFD9}", - nfd: "\u{110F}\u{116D}\u{11BC}", - nfkc: "\u{CFD9}", - nfkd: "\u{110F}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{CFDA}", - nfc: "\u{CFDA}", - nfd: "\u{110F}\u{116D}\u{11BD}", - nfkc: "\u{CFDA}", - nfkd: "\u{110F}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{CFDB}", - nfc: "\u{CFDB}", - nfd: "\u{110F}\u{116D}\u{11BE}", - nfkc: "\u{CFDB}", - nfkd: "\u{110F}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{CFDC}", - nfc: "\u{CFDC}", - nfd: "\u{110F}\u{116D}\u{11BF}", - nfkc: "\u{CFDC}", - nfkd: "\u{110F}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{CFDD}", - nfc: "\u{CFDD}", - nfd: "\u{110F}\u{116D}\u{11C0}", - nfkc: "\u{CFDD}", - nfkd: "\u{110F}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{CFDE}", - nfc: "\u{CFDE}", - nfd: "\u{110F}\u{116D}\u{11C1}", - nfkc: "\u{CFDE}", - nfkd: "\u{110F}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{CFDF}", - nfc: "\u{CFDF}", - nfd: "\u{110F}\u{116D}\u{11C2}", - nfkc: "\u{CFDF}", - nfkd: "\u{110F}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{CFE0}", - nfc: "\u{CFE0}", - nfd: "\u{110F}\u{116E}", - nfkc: "\u{CFE0}", - nfkd: "\u{110F}\u{116E}", - }, - NormalizationTest { - source: "\u{CFE1}", - nfc: "\u{CFE1}", - nfd: "\u{110F}\u{116E}\u{11A8}", - nfkc: "\u{CFE1}", - nfkd: "\u{110F}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{CFE2}", - nfc: "\u{CFE2}", - nfd: "\u{110F}\u{116E}\u{11A9}", - nfkc: "\u{CFE2}", - nfkd: "\u{110F}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{CFE3}", - nfc: "\u{CFE3}", - nfd: "\u{110F}\u{116E}\u{11AA}", - nfkc: "\u{CFE3}", - nfkd: "\u{110F}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{CFE4}", - nfc: "\u{CFE4}", - nfd: "\u{110F}\u{116E}\u{11AB}", - nfkc: "\u{CFE4}", - nfkd: "\u{110F}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{CFE5}", - nfc: "\u{CFE5}", - nfd: "\u{110F}\u{116E}\u{11AC}", - nfkc: "\u{CFE5}", - nfkd: "\u{110F}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{CFE6}", - nfc: "\u{CFE6}", - nfd: "\u{110F}\u{116E}\u{11AD}", - nfkc: "\u{CFE6}", - nfkd: "\u{110F}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{CFE7}", - nfc: "\u{CFE7}", - nfd: "\u{110F}\u{116E}\u{11AE}", - nfkc: "\u{CFE7}", - nfkd: "\u{110F}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{CFE8}", - nfc: "\u{CFE8}", - nfd: "\u{110F}\u{116E}\u{11AF}", - nfkc: "\u{CFE8}", - nfkd: "\u{110F}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{CFE9}", - nfc: "\u{CFE9}", - nfd: "\u{110F}\u{116E}\u{11B0}", - nfkc: "\u{CFE9}", - nfkd: "\u{110F}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{CFEA}", - nfc: "\u{CFEA}", - nfd: "\u{110F}\u{116E}\u{11B1}", - nfkc: "\u{CFEA}", - nfkd: "\u{110F}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{CFEB}", - nfc: "\u{CFEB}", - nfd: "\u{110F}\u{116E}\u{11B2}", - nfkc: "\u{CFEB}", - nfkd: "\u{110F}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{CFEC}", - nfc: "\u{CFEC}", - nfd: "\u{110F}\u{116E}\u{11B3}", - nfkc: "\u{CFEC}", - nfkd: "\u{110F}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{CFED}", - nfc: "\u{CFED}", - nfd: "\u{110F}\u{116E}\u{11B4}", - nfkc: "\u{CFED}", - nfkd: "\u{110F}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{CFEE}", - nfc: "\u{CFEE}", - nfd: "\u{110F}\u{116E}\u{11B5}", - nfkc: "\u{CFEE}", - nfkd: "\u{110F}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{CFEF}", - nfc: "\u{CFEF}", - nfd: "\u{110F}\u{116E}\u{11B6}", - nfkc: "\u{CFEF}", - nfkd: "\u{110F}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{CFF0}", - nfc: "\u{CFF0}", - nfd: "\u{110F}\u{116E}\u{11B7}", - nfkc: "\u{CFF0}", - nfkd: "\u{110F}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{CFF1}", - nfc: "\u{CFF1}", - nfd: "\u{110F}\u{116E}\u{11B8}", - nfkc: "\u{CFF1}", - nfkd: "\u{110F}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{CFF2}", - nfc: "\u{CFF2}", - nfd: "\u{110F}\u{116E}\u{11B9}", - nfkc: "\u{CFF2}", - nfkd: "\u{110F}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{CFF3}", - nfc: "\u{CFF3}", - nfd: "\u{110F}\u{116E}\u{11BA}", - nfkc: "\u{CFF3}", - nfkd: "\u{110F}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{CFF4}", - nfc: "\u{CFF4}", - nfd: "\u{110F}\u{116E}\u{11BB}", - nfkc: "\u{CFF4}", - nfkd: "\u{110F}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{CFF5}", - nfc: "\u{CFF5}", - nfd: "\u{110F}\u{116E}\u{11BC}", - nfkc: "\u{CFF5}", - nfkd: "\u{110F}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{CFF6}", - nfc: "\u{CFF6}", - nfd: "\u{110F}\u{116E}\u{11BD}", - nfkc: "\u{CFF6}", - nfkd: "\u{110F}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{CFF7}", - nfc: "\u{CFF7}", - nfd: "\u{110F}\u{116E}\u{11BE}", - nfkc: "\u{CFF7}", - nfkd: "\u{110F}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{CFF8}", - nfc: "\u{CFF8}", - nfd: "\u{110F}\u{116E}\u{11BF}", - nfkc: "\u{CFF8}", - nfkd: "\u{110F}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{CFF9}", - nfc: "\u{CFF9}", - nfd: "\u{110F}\u{116E}\u{11C0}", - nfkc: "\u{CFF9}", - nfkd: "\u{110F}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{CFFA}", - nfc: "\u{CFFA}", - nfd: "\u{110F}\u{116E}\u{11C1}", - nfkc: "\u{CFFA}", - nfkd: "\u{110F}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{CFFB}", - nfc: "\u{CFFB}", - nfd: "\u{110F}\u{116E}\u{11C2}", - nfkc: "\u{CFFB}", - nfkd: "\u{110F}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{CFFC}", - nfc: "\u{CFFC}", - nfd: "\u{110F}\u{116F}", - nfkc: "\u{CFFC}", - nfkd: "\u{110F}\u{116F}", - }, - NormalizationTest { - source: "\u{CFFD}", - nfc: "\u{CFFD}", - nfd: "\u{110F}\u{116F}\u{11A8}", - nfkc: "\u{CFFD}", - nfkd: "\u{110F}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{CFFE}", - nfc: "\u{CFFE}", - nfd: "\u{110F}\u{116F}\u{11A9}", - nfkc: "\u{CFFE}", - nfkd: "\u{110F}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{CFFF}", - nfc: "\u{CFFF}", - nfd: "\u{110F}\u{116F}\u{11AA}", - nfkc: "\u{CFFF}", - nfkd: "\u{110F}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{D000}", - nfc: "\u{D000}", - nfd: "\u{110F}\u{116F}\u{11AB}", - nfkc: "\u{D000}", - nfkd: "\u{110F}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{D001}", - nfc: "\u{D001}", - nfd: "\u{110F}\u{116F}\u{11AC}", - nfkc: "\u{D001}", - nfkd: "\u{110F}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{D002}", - nfc: "\u{D002}", - nfd: "\u{110F}\u{116F}\u{11AD}", - nfkc: "\u{D002}", - nfkd: "\u{110F}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{D003}", - nfc: "\u{D003}", - nfd: "\u{110F}\u{116F}\u{11AE}", - nfkc: "\u{D003}", - nfkd: "\u{110F}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{D004}", - nfc: "\u{D004}", - nfd: "\u{110F}\u{116F}\u{11AF}", - nfkc: "\u{D004}", - nfkd: "\u{110F}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{D005}", - nfc: "\u{D005}", - nfd: "\u{110F}\u{116F}\u{11B0}", - nfkc: "\u{D005}", - nfkd: "\u{110F}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{D006}", - nfc: "\u{D006}", - nfd: "\u{110F}\u{116F}\u{11B1}", - nfkc: "\u{D006}", - nfkd: "\u{110F}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{D007}", - nfc: "\u{D007}", - nfd: "\u{110F}\u{116F}\u{11B2}", - nfkc: "\u{D007}", - nfkd: "\u{110F}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{D008}", - nfc: "\u{D008}", - nfd: "\u{110F}\u{116F}\u{11B3}", - nfkc: "\u{D008}", - nfkd: "\u{110F}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{D009}", - nfc: "\u{D009}", - nfd: "\u{110F}\u{116F}\u{11B4}", - nfkc: "\u{D009}", - nfkd: "\u{110F}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{D00A}", - nfc: "\u{D00A}", - nfd: "\u{110F}\u{116F}\u{11B5}", - nfkc: "\u{D00A}", - nfkd: "\u{110F}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{D00B}", - nfc: "\u{D00B}", - nfd: "\u{110F}\u{116F}\u{11B6}", - nfkc: "\u{D00B}", - nfkd: "\u{110F}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{D00C}", - nfc: "\u{D00C}", - nfd: "\u{110F}\u{116F}\u{11B7}", - nfkc: "\u{D00C}", - nfkd: "\u{110F}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{D00D}", - nfc: "\u{D00D}", - nfd: "\u{110F}\u{116F}\u{11B8}", - nfkc: "\u{D00D}", - nfkd: "\u{110F}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{D00E}", - nfc: "\u{D00E}", - nfd: "\u{110F}\u{116F}\u{11B9}", - nfkc: "\u{D00E}", - nfkd: "\u{110F}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{D00F}", - nfc: "\u{D00F}", - nfd: "\u{110F}\u{116F}\u{11BA}", - nfkc: "\u{D00F}", - nfkd: "\u{110F}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{D010}", - nfc: "\u{D010}", - nfd: "\u{110F}\u{116F}\u{11BB}", - nfkc: "\u{D010}", - nfkd: "\u{110F}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{D011}", - nfc: "\u{D011}", - nfd: "\u{110F}\u{116F}\u{11BC}", - nfkc: "\u{D011}", - nfkd: "\u{110F}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{D012}", - nfc: "\u{D012}", - nfd: "\u{110F}\u{116F}\u{11BD}", - nfkc: "\u{D012}", - nfkd: "\u{110F}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{D013}", - nfc: "\u{D013}", - nfd: "\u{110F}\u{116F}\u{11BE}", - nfkc: "\u{D013}", - nfkd: "\u{110F}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{D014}", - nfc: "\u{D014}", - nfd: "\u{110F}\u{116F}\u{11BF}", - nfkc: "\u{D014}", - nfkd: "\u{110F}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{D015}", - nfc: "\u{D015}", - nfd: "\u{110F}\u{116F}\u{11C0}", - nfkc: "\u{D015}", - nfkd: "\u{110F}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{D016}", - nfc: "\u{D016}", - nfd: "\u{110F}\u{116F}\u{11C1}", - nfkc: "\u{D016}", - nfkd: "\u{110F}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{D017}", - nfc: "\u{D017}", - nfd: "\u{110F}\u{116F}\u{11C2}", - nfkc: "\u{D017}", - nfkd: "\u{110F}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{D018}", - nfc: "\u{D018}", - nfd: "\u{110F}\u{1170}", - nfkc: "\u{D018}", - nfkd: "\u{110F}\u{1170}", - }, - NormalizationTest { - source: "\u{D019}", - nfc: "\u{D019}", - nfd: "\u{110F}\u{1170}\u{11A8}", - nfkc: "\u{D019}", - nfkd: "\u{110F}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{D01A}", - nfc: "\u{D01A}", - nfd: "\u{110F}\u{1170}\u{11A9}", - nfkc: "\u{D01A}", - nfkd: "\u{110F}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{D01B}", - nfc: "\u{D01B}", - nfd: "\u{110F}\u{1170}\u{11AA}", - nfkc: "\u{D01B}", - nfkd: "\u{110F}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{D01C}", - nfc: "\u{D01C}", - nfd: "\u{110F}\u{1170}\u{11AB}", - nfkc: "\u{D01C}", - nfkd: "\u{110F}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{D01D}", - nfc: "\u{D01D}", - nfd: "\u{110F}\u{1170}\u{11AC}", - nfkc: "\u{D01D}", - nfkd: "\u{110F}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{D01E}", - nfc: "\u{D01E}", - nfd: "\u{110F}\u{1170}\u{11AD}", - nfkc: "\u{D01E}", - nfkd: "\u{110F}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{D01F}", - nfc: "\u{D01F}", - nfd: "\u{110F}\u{1170}\u{11AE}", - nfkc: "\u{D01F}", - nfkd: "\u{110F}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{D020}", - nfc: "\u{D020}", - nfd: "\u{110F}\u{1170}\u{11AF}", - nfkc: "\u{D020}", - nfkd: "\u{110F}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{D021}", - nfc: "\u{D021}", - nfd: "\u{110F}\u{1170}\u{11B0}", - nfkc: "\u{D021}", - nfkd: "\u{110F}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{D022}", - nfc: "\u{D022}", - nfd: "\u{110F}\u{1170}\u{11B1}", - nfkc: "\u{D022}", - nfkd: "\u{110F}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{D023}", - nfc: "\u{D023}", - nfd: "\u{110F}\u{1170}\u{11B2}", - nfkc: "\u{D023}", - nfkd: "\u{110F}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{D024}", - nfc: "\u{D024}", - nfd: "\u{110F}\u{1170}\u{11B3}", - nfkc: "\u{D024}", - nfkd: "\u{110F}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{D025}", - nfc: "\u{D025}", - nfd: "\u{110F}\u{1170}\u{11B4}", - nfkc: "\u{D025}", - nfkd: "\u{110F}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{D026}", - nfc: "\u{D026}", - nfd: "\u{110F}\u{1170}\u{11B5}", - nfkc: "\u{D026}", - nfkd: "\u{110F}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{D027}", - nfc: "\u{D027}", - nfd: "\u{110F}\u{1170}\u{11B6}", - nfkc: "\u{D027}", - nfkd: "\u{110F}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{D028}", - nfc: "\u{D028}", - nfd: "\u{110F}\u{1170}\u{11B7}", - nfkc: "\u{D028}", - nfkd: "\u{110F}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{D029}", - nfc: "\u{D029}", - nfd: "\u{110F}\u{1170}\u{11B8}", - nfkc: "\u{D029}", - nfkd: "\u{110F}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{D02A}", - nfc: "\u{D02A}", - nfd: "\u{110F}\u{1170}\u{11B9}", - nfkc: "\u{D02A}", - nfkd: "\u{110F}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{D02B}", - nfc: "\u{D02B}", - nfd: "\u{110F}\u{1170}\u{11BA}", - nfkc: "\u{D02B}", - nfkd: "\u{110F}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{D02C}", - nfc: "\u{D02C}", - nfd: "\u{110F}\u{1170}\u{11BB}", - nfkc: "\u{D02C}", - nfkd: "\u{110F}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{D02D}", - nfc: "\u{D02D}", - nfd: "\u{110F}\u{1170}\u{11BC}", - nfkc: "\u{D02D}", - nfkd: "\u{110F}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{D02E}", - nfc: "\u{D02E}", - nfd: "\u{110F}\u{1170}\u{11BD}", - nfkc: "\u{D02E}", - nfkd: "\u{110F}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{D02F}", - nfc: "\u{D02F}", - nfd: "\u{110F}\u{1170}\u{11BE}", - nfkc: "\u{D02F}", - nfkd: "\u{110F}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{D030}", - nfc: "\u{D030}", - nfd: "\u{110F}\u{1170}\u{11BF}", - nfkc: "\u{D030}", - nfkd: "\u{110F}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{D031}", - nfc: "\u{D031}", - nfd: "\u{110F}\u{1170}\u{11C0}", - nfkc: "\u{D031}", - nfkd: "\u{110F}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{D032}", - nfc: "\u{D032}", - nfd: "\u{110F}\u{1170}\u{11C1}", - nfkc: "\u{D032}", - nfkd: "\u{110F}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{D033}", - nfc: "\u{D033}", - nfd: "\u{110F}\u{1170}\u{11C2}", - nfkc: "\u{D033}", - nfkd: "\u{110F}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{D034}", - nfc: "\u{D034}", - nfd: "\u{110F}\u{1171}", - nfkc: "\u{D034}", - nfkd: "\u{110F}\u{1171}", - }, - NormalizationTest { - source: "\u{D035}", - nfc: "\u{D035}", - nfd: "\u{110F}\u{1171}\u{11A8}", - nfkc: "\u{D035}", - nfkd: "\u{110F}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{D036}", - nfc: "\u{D036}", - nfd: "\u{110F}\u{1171}\u{11A9}", - nfkc: "\u{D036}", - nfkd: "\u{110F}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{D037}", - nfc: "\u{D037}", - nfd: "\u{110F}\u{1171}\u{11AA}", - nfkc: "\u{D037}", - nfkd: "\u{110F}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{D038}", - nfc: "\u{D038}", - nfd: "\u{110F}\u{1171}\u{11AB}", - nfkc: "\u{D038}", - nfkd: "\u{110F}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{D039}", - nfc: "\u{D039}", - nfd: "\u{110F}\u{1171}\u{11AC}", - nfkc: "\u{D039}", - nfkd: "\u{110F}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{D03A}", - nfc: "\u{D03A}", - nfd: "\u{110F}\u{1171}\u{11AD}", - nfkc: "\u{D03A}", - nfkd: "\u{110F}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{D03B}", - nfc: "\u{D03B}", - nfd: "\u{110F}\u{1171}\u{11AE}", - nfkc: "\u{D03B}", - nfkd: "\u{110F}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{D03C}", - nfc: "\u{D03C}", - nfd: "\u{110F}\u{1171}\u{11AF}", - nfkc: "\u{D03C}", - nfkd: "\u{110F}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{D03D}", - nfc: "\u{D03D}", - nfd: "\u{110F}\u{1171}\u{11B0}", - nfkc: "\u{D03D}", - nfkd: "\u{110F}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{D03E}", - nfc: "\u{D03E}", - nfd: "\u{110F}\u{1171}\u{11B1}", - nfkc: "\u{D03E}", - nfkd: "\u{110F}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{D03F}", - nfc: "\u{D03F}", - nfd: "\u{110F}\u{1171}\u{11B2}", - nfkc: "\u{D03F}", - nfkd: "\u{110F}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{D040}", - nfc: "\u{D040}", - nfd: "\u{110F}\u{1171}\u{11B3}", - nfkc: "\u{D040}", - nfkd: "\u{110F}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{D041}", - nfc: "\u{D041}", - nfd: "\u{110F}\u{1171}\u{11B4}", - nfkc: "\u{D041}", - nfkd: "\u{110F}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{D042}", - nfc: "\u{D042}", - nfd: "\u{110F}\u{1171}\u{11B5}", - nfkc: "\u{D042}", - nfkd: "\u{110F}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{D043}", - nfc: "\u{D043}", - nfd: "\u{110F}\u{1171}\u{11B6}", - nfkc: "\u{D043}", - nfkd: "\u{110F}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{D044}", - nfc: "\u{D044}", - nfd: "\u{110F}\u{1171}\u{11B7}", - nfkc: "\u{D044}", - nfkd: "\u{110F}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{D045}", - nfc: "\u{D045}", - nfd: "\u{110F}\u{1171}\u{11B8}", - nfkc: "\u{D045}", - nfkd: "\u{110F}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{D046}", - nfc: "\u{D046}", - nfd: "\u{110F}\u{1171}\u{11B9}", - nfkc: "\u{D046}", - nfkd: "\u{110F}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{D047}", - nfc: "\u{D047}", - nfd: "\u{110F}\u{1171}\u{11BA}", - nfkc: "\u{D047}", - nfkd: "\u{110F}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{D048}", - nfc: "\u{D048}", - nfd: "\u{110F}\u{1171}\u{11BB}", - nfkc: "\u{D048}", - nfkd: "\u{110F}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{D049}", - nfc: "\u{D049}", - nfd: "\u{110F}\u{1171}\u{11BC}", - nfkc: "\u{D049}", - nfkd: "\u{110F}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{D04A}", - nfc: "\u{D04A}", - nfd: "\u{110F}\u{1171}\u{11BD}", - nfkc: "\u{D04A}", - nfkd: "\u{110F}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{D04B}", - nfc: "\u{D04B}", - nfd: "\u{110F}\u{1171}\u{11BE}", - nfkc: "\u{D04B}", - nfkd: "\u{110F}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{D04C}", - nfc: "\u{D04C}", - nfd: "\u{110F}\u{1171}\u{11BF}", - nfkc: "\u{D04C}", - nfkd: "\u{110F}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{D04D}", - nfc: "\u{D04D}", - nfd: "\u{110F}\u{1171}\u{11C0}", - nfkc: "\u{D04D}", - nfkd: "\u{110F}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{D04E}", - nfc: "\u{D04E}", - nfd: "\u{110F}\u{1171}\u{11C1}", - nfkc: "\u{D04E}", - nfkd: "\u{110F}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{D04F}", - nfc: "\u{D04F}", - nfd: "\u{110F}\u{1171}\u{11C2}", - nfkc: "\u{D04F}", - nfkd: "\u{110F}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{D050}", - nfc: "\u{D050}", - nfd: "\u{110F}\u{1172}", - nfkc: "\u{D050}", - nfkd: "\u{110F}\u{1172}", - }, - NormalizationTest { - source: "\u{D051}", - nfc: "\u{D051}", - nfd: "\u{110F}\u{1172}\u{11A8}", - nfkc: "\u{D051}", - nfkd: "\u{110F}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{D052}", - nfc: "\u{D052}", - nfd: "\u{110F}\u{1172}\u{11A9}", - nfkc: "\u{D052}", - nfkd: "\u{110F}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{D053}", - nfc: "\u{D053}", - nfd: "\u{110F}\u{1172}\u{11AA}", - nfkc: "\u{D053}", - nfkd: "\u{110F}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{D054}", - nfc: "\u{D054}", - nfd: "\u{110F}\u{1172}\u{11AB}", - nfkc: "\u{D054}", - nfkd: "\u{110F}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{D055}", - nfc: "\u{D055}", - nfd: "\u{110F}\u{1172}\u{11AC}", - nfkc: "\u{D055}", - nfkd: "\u{110F}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{D056}", - nfc: "\u{D056}", - nfd: "\u{110F}\u{1172}\u{11AD}", - nfkc: "\u{D056}", - nfkd: "\u{110F}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{D057}", - nfc: "\u{D057}", - nfd: "\u{110F}\u{1172}\u{11AE}", - nfkc: "\u{D057}", - nfkd: "\u{110F}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{D058}", - nfc: "\u{D058}", - nfd: "\u{110F}\u{1172}\u{11AF}", - nfkc: "\u{D058}", - nfkd: "\u{110F}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{D059}", - nfc: "\u{D059}", - nfd: "\u{110F}\u{1172}\u{11B0}", - nfkc: "\u{D059}", - nfkd: "\u{110F}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{D05A}", - nfc: "\u{D05A}", - nfd: "\u{110F}\u{1172}\u{11B1}", - nfkc: "\u{D05A}", - nfkd: "\u{110F}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{D05B}", - nfc: "\u{D05B}", - nfd: "\u{110F}\u{1172}\u{11B2}", - nfkc: "\u{D05B}", - nfkd: "\u{110F}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{D05C}", - nfc: "\u{D05C}", - nfd: "\u{110F}\u{1172}\u{11B3}", - nfkc: "\u{D05C}", - nfkd: "\u{110F}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{D05D}", - nfc: "\u{D05D}", - nfd: "\u{110F}\u{1172}\u{11B4}", - nfkc: "\u{D05D}", - nfkd: "\u{110F}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{D05E}", - nfc: "\u{D05E}", - nfd: "\u{110F}\u{1172}\u{11B5}", - nfkc: "\u{D05E}", - nfkd: "\u{110F}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{D05F}", - nfc: "\u{D05F}", - nfd: "\u{110F}\u{1172}\u{11B6}", - nfkc: "\u{D05F}", - nfkd: "\u{110F}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{D060}", - nfc: "\u{D060}", - nfd: "\u{110F}\u{1172}\u{11B7}", - nfkc: "\u{D060}", - nfkd: "\u{110F}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{D061}", - nfc: "\u{D061}", - nfd: "\u{110F}\u{1172}\u{11B8}", - nfkc: "\u{D061}", - nfkd: "\u{110F}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{D062}", - nfc: "\u{D062}", - nfd: "\u{110F}\u{1172}\u{11B9}", - nfkc: "\u{D062}", - nfkd: "\u{110F}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{D063}", - nfc: "\u{D063}", - nfd: "\u{110F}\u{1172}\u{11BA}", - nfkc: "\u{D063}", - nfkd: "\u{110F}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{D064}", - nfc: "\u{D064}", - nfd: "\u{110F}\u{1172}\u{11BB}", - nfkc: "\u{D064}", - nfkd: "\u{110F}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{D065}", - nfc: "\u{D065}", - nfd: "\u{110F}\u{1172}\u{11BC}", - nfkc: "\u{D065}", - nfkd: "\u{110F}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{D066}", - nfc: "\u{D066}", - nfd: "\u{110F}\u{1172}\u{11BD}", - nfkc: "\u{D066}", - nfkd: "\u{110F}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{D067}", - nfc: "\u{D067}", - nfd: "\u{110F}\u{1172}\u{11BE}", - nfkc: "\u{D067}", - nfkd: "\u{110F}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{D068}", - nfc: "\u{D068}", - nfd: "\u{110F}\u{1172}\u{11BF}", - nfkc: "\u{D068}", - nfkd: "\u{110F}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{D069}", - nfc: "\u{D069}", - nfd: "\u{110F}\u{1172}\u{11C0}", - nfkc: "\u{D069}", - nfkd: "\u{110F}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{D06A}", - nfc: "\u{D06A}", - nfd: "\u{110F}\u{1172}\u{11C1}", - nfkc: "\u{D06A}", - nfkd: "\u{110F}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{D06B}", - nfc: "\u{D06B}", - nfd: "\u{110F}\u{1172}\u{11C2}", - nfkc: "\u{D06B}", - nfkd: "\u{110F}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{D06C}", - nfc: "\u{D06C}", - nfd: "\u{110F}\u{1173}", - nfkc: "\u{D06C}", - nfkd: "\u{110F}\u{1173}", - }, - NormalizationTest { - source: "\u{D06D}", - nfc: "\u{D06D}", - nfd: "\u{110F}\u{1173}\u{11A8}", - nfkc: "\u{D06D}", - nfkd: "\u{110F}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{D06E}", - nfc: "\u{D06E}", - nfd: "\u{110F}\u{1173}\u{11A9}", - nfkc: "\u{D06E}", - nfkd: "\u{110F}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{D06F}", - nfc: "\u{D06F}", - nfd: "\u{110F}\u{1173}\u{11AA}", - nfkc: "\u{D06F}", - nfkd: "\u{110F}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{D070}", - nfc: "\u{D070}", - nfd: "\u{110F}\u{1173}\u{11AB}", - nfkc: "\u{D070}", - nfkd: "\u{110F}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{D071}", - nfc: "\u{D071}", - nfd: "\u{110F}\u{1173}\u{11AC}", - nfkc: "\u{D071}", - nfkd: "\u{110F}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{D072}", - nfc: "\u{D072}", - nfd: "\u{110F}\u{1173}\u{11AD}", - nfkc: "\u{D072}", - nfkd: "\u{110F}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{D073}", - nfc: "\u{D073}", - nfd: "\u{110F}\u{1173}\u{11AE}", - nfkc: "\u{D073}", - nfkd: "\u{110F}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{D074}", - nfc: "\u{D074}", - nfd: "\u{110F}\u{1173}\u{11AF}", - nfkc: "\u{D074}", - nfkd: "\u{110F}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{D075}", - nfc: "\u{D075}", - nfd: "\u{110F}\u{1173}\u{11B0}", - nfkc: "\u{D075}", - nfkd: "\u{110F}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{D076}", - nfc: "\u{D076}", - nfd: "\u{110F}\u{1173}\u{11B1}", - nfkc: "\u{D076}", - nfkd: "\u{110F}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{D077}", - nfc: "\u{D077}", - nfd: "\u{110F}\u{1173}\u{11B2}", - nfkc: "\u{D077}", - nfkd: "\u{110F}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{D078}", - nfc: "\u{D078}", - nfd: "\u{110F}\u{1173}\u{11B3}", - nfkc: "\u{D078}", - nfkd: "\u{110F}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{D079}", - nfc: "\u{D079}", - nfd: "\u{110F}\u{1173}\u{11B4}", - nfkc: "\u{D079}", - nfkd: "\u{110F}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{D07A}", - nfc: "\u{D07A}", - nfd: "\u{110F}\u{1173}\u{11B5}", - nfkc: "\u{D07A}", - nfkd: "\u{110F}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{D07B}", - nfc: "\u{D07B}", - nfd: "\u{110F}\u{1173}\u{11B6}", - nfkc: "\u{D07B}", - nfkd: "\u{110F}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{D07C}", - nfc: "\u{D07C}", - nfd: "\u{110F}\u{1173}\u{11B7}", - nfkc: "\u{D07C}", - nfkd: "\u{110F}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{D07D}", - nfc: "\u{D07D}", - nfd: "\u{110F}\u{1173}\u{11B8}", - nfkc: "\u{D07D}", - nfkd: "\u{110F}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{D07E}", - nfc: "\u{D07E}", - nfd: "\u{110F}\u{1173}\u{11B9}", - nfkc: "\u{D07E}", - nfkd: "\u{110F}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{D07F}", - nfc: "\u{D07F}", - nfd: "\u{110F}\u{1173}\u{11BA}", - nfkc: "\u{D07F}", - nfkd: "\u{110F}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{D080}", - nfc: "\u{D080}", - nfd: "\u{110F}\u{1173}\u{11BB}", - nfkc: "\u{D080}", - nfkd: "\u{110F}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{D081}", - nfc: "\u{D081}", - nfd: "\u{110F}\u{1173}\u{11BC}", - nfkc: "\u{D081}", - nfkd: "\u{110F}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{D082}", - nfc: "\u{D082}", - nfd: "\u{110F}\u{1173}\u{11BD}", - nfkc: "\u{D082}", - nfkd: "\u{110F}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{D083}", - nfc: "\u{D083}", - nfd: "\u{110F}\u{1173}\u{11BE}", - nfkc: "\u{D083}", - nfkd: "\u{110F}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{D084}", - nfc: "\u{D084}", - nfd: "\u{110F}\u{1173}\u{11BF}", - nfkc: "\u{D084}", - nfkd: "\u{110F}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{D085}", - nfc: "\u{D085}", - nfd: "\u{110F}\u{1173}\u{11C0}", - nfkc: "\u{D085}", - nfkd: "\u{110F}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{D086}", - nfc: "\u{D086}", - nfd: "\u{110F}\u{1173}\u{11C1}", - nfkc: "\u{D086}", - nfkd: "\u{110F}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{D087}", - nfc: "\u{D087}", - nfd: "\u{110F}\u{1173}\u{11C2}", - nfkc: "\u{D087}", - nfkd: "\u{110F}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{D088}", - nfc: "\u{D088}", - nfd: "\u{110F}\u{1174}", - nfkc: "\u{D088}", - nfkd: "\u{110F}\u{1174}", - }, - NormalizationTest { - source: "\u{D089}", - nfc: "\u{D089}", - nfd: "\u{110F}\u{1174}\u{11A8}", - nfkc: "\u{D089}", - nfkd: "\u{110F}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{D08A}", - nfc: "\u{D08A}", - nfd: "\u{110F}\u{1174}\u{11A9}", - nfkc: "\u{D08A}", - nfkd: "\u{110F}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{D08B}", - nfc: "\u{D08B}", - nfd: "\u{110F}\u{1174}\u{11AA}", - nfkc: "\u{D08B}", - nfkd: "\u{110F}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{D08C}", - nfc: "\u{D08C}", - nfd: "\u{110F}\u{1174}\u{11AB}", - nfkc: "\u{D08C}", - nfkd: "\u{110F}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{D08D}", - nfc: "\u{D08D}", - nfd: "\u{110F}\u{1174}\u{11AC}", - nfkc: "\u{D08D}", - nfkd: "\u{110F}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{D08E}", - nfc: "\u{D08E}", - nfd: "\u{110F}\u{1174}\u{11AD}", - nfkc: "\u{D08E}", - nfkd: "\u{110F}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{D08F}", - nfc: "\u{D08F}", - nfd: "\u{110F}\u{1174}\u{11AE}", - nfkc: "\u{D08F}", - nfkd: "\u{110F}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{D090}", - nfc: "\u{D090}", - nfd: "\u{110F}\u{1174}\u{11AF}", - nfkc: "\u{D090}", - nfkd: "\u{110F}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{D091}", - nfc: "\u{D091}", - nfd: "\u{110F}\u{1174}\u{11B0}", - nfkc: "\u{D091}", - nfkd: "\u{110F}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{D092}", - nfc: "\u{D092}", - nfd: "\u{110F}\u{1174}\u{11B1}", - nfkc: "\u{D092}", - nfkd: "\u{110F}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{D093}", - nfc: "\u{D093}", - nfd: "\u{110F}\u{1174}\u{11B2}", - nfkc: "\u{D093}", - nfkd: "\u{110F}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{D094}", - nfc: "\u{D094}", - nfd: "\u{110F}\u{1174}\u{11B3}", - nfkc: "\u{D094}", - nfkd: "\u{110F}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{D095}", - nfc: "\u{D095}", - nfd: "\u{110F}\u{1174}\u{11B4}", - nfkc: "\u{D095}", - nfkd: "\u{110F}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{D096}", - nfc: "\u{D096}", - nfd: "\u{110F}\u{1174}\u{11B5}", - nfkc: "\u{D096}", - nfkd: "\u{110F}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{D097}", - nfc: "\u{D097}", - nfd: "\u{110F}\u{1174}\u{11B6}", - nfkc: "\u{D097}", - nfkd: "\u{110F}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{D098}", - nfc: "\u{D098}", - nfd: "\u{110F}\u{1174}\u{11B7}", - nfkc: "\u{D098}", - nfkd: "\u{110F}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{D099}", - nfc: "\u{D099}", - nfd: "\u{110F}\u{1174}\u{11B8}", - nfkc: "\u{D099}", - nfkd: "\u{110F}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{D09A}", - nfc: "\u{D09A}", - nfd: "\u{110F}\u{1174}\u{11B9}", - nfkc: "\u{D09A}", - nfkd: "\u{110F}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{D09B}", - nfc: "\u{D09B}", - nfd: "\u{110F}\u{1174}\u{11BA}", - nfkc: "\u{D09B}", - nfkd: "\u{110F}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{D09C}", - nfc: "\u{D09C}", - nfd: "\u{110F}\u{1174}\u{11BB}", - nfkc: "\u{D09C}", - nfkd: "\u{110F}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{D09D}", - nfc: "\u{D09D}", - nfd: "\u{110F}\u{1174}\u{11BC}", - nfkc: "\u{D09D}", - nfkd: "\u{110F}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{D09E}", - nfc: "\u{D09E}", - nfd: "\u{110F}\u{1174}\u{11BD}", - nfkc: "\u{D09E}", - nfkd: "\u{110F}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{D09F}", - nfc: "\u{D09F}", - nfd: "\u{110F}\u{1174}\u{11BE}", - nfkc: "\u{D09F}", - nfkd: "\u{110F}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{D0A0}", - nfc: "\u{D0A0}", - nfd: "\u{110F}\u{1174}\u{11BF}", - nfkc: "\u{D0A0}", - nfkd: "\u{110F}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{D0A1}", - nfc: "\u{D0A1}", - nfd: "\u{110F}\u{1174}\u{11C0}", - nfkc: "\u{D0A1}", - nfkd: "\u{110F}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{D0A2}", - nfc: "\u{D0A2}", - nfd: "\u{110F}\u{1174}\u{11C1}", - nfkc: "\u{D0A2}", - nfkd: "\u{110F}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{D0A3}", - nfc: "\u{D0A3}", - nfd: "\u{110F}\u{1174}\u{11C2}", - nfkc: "\u{D0A3}", - nfkd: "\u{110F}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{D0A4}", - nfc: "\u{D0A4}", - nfd: "\u{110F}\u{1175}", - nfkc: "\u{D0A4}", - nfkd: "\u{110F}\u{1175}", - }, - NormalizationTest { - source: "\u{D0A5}", - nfc: "\u{D0A5}", - nfd: "\u{110F}\u{1175}\u{11A8}", - nfkc: "\u{D0A5}", - nfkd: "\u{110F}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{D0A6}", - nfc: "\u{D0A6}", - nfd: "\u{110F}\u{1175}\u{11A9}", - nfkc: "\u{D0A6}", - nfkd: "\u{110F}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{D0A7}", - nfc: "\u{D0A7}", - nfd: "\u{110F}\u{1175}\u{11AA}", - nfkc: "\u{D0A7}", - nfkd: "\u{110F}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{D0A8}", - nfc: "\u{D0A8}", - nfd: "\u{110F}\u{1175}\u{11AB}", - nfkc: "\u{D0A8}", - nfkd: "\u{110F}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{D0A9}", - nfc: "\u{D0A9}", - nfd: "\u{110F}\u{1175}\u{11AC}", - nfkc: "\u{D0A9}", - nfkd: "\u{110F}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{D0AA}", - nfc: "\u{D0AA}", - nfd: "\u{110F}\u{1175}\u{11AD}", - nfkc: "\u{D0AA}", - nfkd: "\u{110F}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{D0AB}", - nfc: "\u{D0AB}", - nfd: "\u{110F}\u{1175}\u{11AE}", - nfkc: "\u{D0AB}", - nfkd: "\u{110F}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{D0AC}", - nfc: "\u{D0AC}", - nfd: "\u{110F}\u{1175}\u{11AF}", - nfkc: "\u{D0AC}", - nfkd: "\u{110F}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{D0AD}", - nfc: "\u{D0AD}", - nfd: "\u{110F}\u{1175}\u{11B0}", - nfkc: "\u{D0AD}", - nfkd: "\u{110F}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{D0AE}", - nfc: "\u{D0AE}", - nfd: "\u{110F}\u{1175}\u{11B1}", - nfkc: "\u{D0AE}", - nfkd: "\u{110F}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{D0AF}", - nfc: "\u{D0AF}", - nfd: "\u{110F}\u{1175}\u{11B2}", - nfkc: "\u{D0AF}", - nfkd: "\u{110F}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{D0B0}", - nfc: "\u{D0B0}", - nfd: "\u{110F}\u{1175}\u{11B3}", - nfkc: "\u{D0B0}", - nfkd: "\u{110F}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{D0B1}", - nfc: "\u{D0B1}", - nfd: "\u{110F}\u{1175}\u{11B4}", - nfkc: "\u{D0B1}", - nfkd: "\u{110F}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{D0B2}", - nfc: "\u{D0B2}", - nfd: "\u{110F}\u{1175}\u{11B5}", - nfkc: "\u{D0B2}", - nfkd: "\u{110F}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{D0B3}", - nfc: "\u{D0B3}", - nfd: "\u{110F}\u{1175}\u{11B6}", - nfkc: "\u{D0B3}", - nfkd: "\u{110F}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{D0B4}", - nfc: "\u{D0B4}", - nfd: "\u{110F}\u{1175}\u{11B7}", - nfkc: "\u{D0B4}", - nfkd: "\u{110F}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{D0B5}", - nfc: "\u{D0B5}", - nfd: "\u{110F}\u{1175}\u{11B8}", - nfkc: "\u{D0B5}", - nfkd: "\u{110F}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{D0B6}", - nfc: "\u{D0B6}", - nfd: "\u{110F}\u{1175}\u{11B9}", - nfkc: "\u{D0B6}", - nfkd: "\u{110F}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{D0B7}", - nfc: "\u{D0B7}", - nfd: "\u{110F}\u{1175}\u{11BA}", - nfkc: "\u{D0B7}", - nfkd: "\u{110F}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{D0B8}", - nfc: "\u{D0B8}", - nfd: "\u{110F}\u{1175}\u{11BB}", - nfkc: "\u{D0B8}", - nfkd: "\u{110F}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{D0B9}", - nfc: "\u{D0B9}", - nfd: "\u{110F}\u{1175}\u{11BC}", - nfkc: "\u{D0B9}", - nfkd: "\u{110F}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{D0BA}", - nfc: "\u{D0BA}", - nfd: "\u{110F}\u{1175}\u{11BD}", - nfkc: "\u{D0BA}", - nfkd: "\u{110F}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{D0BB}", - nfc: "\u{D0BB}", - nfd: "\u{110F}\u{1175}\u{11BE}", - nfkc: "\u{D0BB}", - nfkd: "\u{110F}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{D0BC}", - nfc: "\u{D0BC}", - nfd: "\u{110F}\u{1175}\u{11BF}", - nfkc: "\u{D0BC}", - nfkd: "\u{110F}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{D0BD}", - nfc: "\u{D0BD}", - nfd: "\u{110F}\u{1175}\u{11C0}", - nfkc: "\u{D0BD}", - nfkd: "\u{110F}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{D0BE}", - nfc: "\u{D0BE}", - nfd: "\u{110F}\u{1175}\u{11C1}", - nfkc: "\u{D0BE}", - nfkd: "\u{110F}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{D0BF}", - nfc: "\u{D0BF}", - nfd: "\u{110F}\u{1175}\u{11C2}", - nfkc: "\u{D0BF}", - nfkd: "\u{110F}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{D0C0}", - nfc: "\u{D0C0}", - nfd: "\u{1110}\u{1161}", - nfkc: "\u{D0C0}", - nfkd: "\u{1110}\u{1161}", - }, - NormalizationTest { - source: "\u{D0C1}", - nfc: "\u{D0C1}", - nfd: "\u{1110}\u{1161}\u{11A8}", - nfkc: "\u{D0C1}", - nfkd: "\u{1110}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{D0C2}", - nfc: "\u{D0C2}", - nfd: "\u{1110}\u{1161}\u{11A9}", - nfkc: "\u{D0C2}", - nfkd: "\u{1110}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{D0C3}", - nfc: "\u{D0C3}", - nfd: "\u{1110}\u{1161}\u{11AA}", - nfkc: "\u{D0C3}", - nfkd: "\u{1110}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{D0C4}", - nfc: "\u{D0C4}", - nfd: "\u{1110}\u{1161}\u{11AB}", - nfkc: "\u{D0C4}", - nfkd: "\u{1110}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{D0C5}", - nfc: "\u{D0C5}", - nfd: "\u{1110}\u{1161}\u{11AC}", - nfkc: "\u{D0C5}", - nfkd: "\u{1110}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{D0C6}", - nfc: "\u{D0C6}", - nfd: "\u{1110}\u{1161}\u{11AD}", - nfkc: "\u{D0C6}", - nfkd: "\u{1110}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{D0C7}", - nfc: "\u{D0C7}", - nfd: "\u{1110}\u{1161}\u{11AE}", - nfkc: "\u{D0C7}", - nfkd: "\u{1110}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{D0C8}", - nfc: "\u{D0C8}", - nfd: "\u{1110}\u{1161}\u{11AF}", - nfkc: "\u{D0C8}", - nfkd: "\u{1110}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{D0C9}", - nfc: "\u{D0C9}", - nfd: "\u{1110}\u{1161}\u{11B0}", - nfkc: "\u{D0C9}", - nfkd: "\u{1110}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{D0CA}", - nfc: "\u{D0CA}", - nfd: "\u{1110}\u{1161}\u{11B1}", - nfkc: "\u{D0CA}", - nfkd: "\u{1110}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{D0CB}", - nfc: "\u{D0CB}", - nfd: "\u{1110}\u{1161}\u{11B2}", - nfkc: "\u{D0CB}", - nfkd: "\u{1110}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{D0CC}", - nfc: "\u{D0CC}", - nfd: "\u{1110}\u{1161}\u{11B3}", - nfkc: "\u{D0CC}", - nfkd: "\u{1110}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{D0CD}", - nfc: "\u{D0CD}", - nfd: "\u{1110}\u{1161}\u{11B4}", - nfkc: "\u{D0CD}", - nfkd: "\u{1110}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{D0CE}", - nfc: "\u{D0CE}", - nfd: "\u{1110}\u{1161}\u{11B5}", - nfkc: "\u{D0CE}", - nfkd: "\u{1110}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{D0CF}", - nfc: "\u{D0CF}", - nfd: "\u{1110}\u{1161}\u{11B6}", - nfkc: "\u{D0CF}", - nfkd: "\u{1110}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{D0D0}", - nfc: "\u{D0D0}", - nfd: "\u{1110}\u{1161}\u{11B7}", - nfkc: "\u{D0D0}", - nfkd: "\u{1110}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{D0D1}", - nfc: "\u{D0D1}", - nfd: "\u{1110}\u{1161}\u{11B8}", - nfkc: "\u{D0D1}", - nfkd: "\u{1110}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{D0D2}", - nfc: "\u{D0D2}", - nfd: "\u{1110}\u{1161}\u{11B9}", - nfkc: "\u{D0D2}", - nfkd: "\u{1110}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{D0D3}", - nfc: "\u{D0D3}", - nfd: "\u{1110}\u{1161}\u{11BA}", - nfkc: "\u{D0D3}", - nfkd: "\u{1110}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{D0D4}", - nfc: "\u{D0D4}", - nfd: "\u{1110}\u{1161}\u{11BB}", - nfkc: "\u{D0D4}", - nfkd: "\u{1110}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{D0D5}", - nfc: "\u{D0D5}", - nfd: "\u{1110}\u{1161}\u{11BC}", - nfkc: "\u{D0D5}", - nfkd: "\u{1110}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{D0D6}", - nfc: "\u{D0D6}", - nfd: "\u{1110}\u{1161}\u{11BD}", - nfkc: "\u{D0D6}", - nfkd: "\u{1110}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{D0D7}", - nfc: "\u{D0D7}", - nfd: "\u{1110}\u{1161}\u{11BE}", - nfkc: "\u{D0D7}", - nfkd: "\u{1110}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{D0D8}", - nfc: "\u{D0D8}", - nfd: "\u{1110}\u{1161}\u{11BF}", - nfkc: "\u{D0D8}", - nfkd: "\u{1110}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{D0D9}", - nfc: "\u{D0D9}", - nfd: "\u{1110}\u{1161}\u{11C0}", - nfkc: "\u{D0D9}", - nfkd: "\u{1110}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{D0DA}", - nfc: "\u{D0DA}", - nfd: "\u{1110}\u{1161}\u{11C1}", - nfkc: "\u{D0DA}", - nfkd: "\u{1110}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{D0DB}", - nfc: "\u{D0DB}", - nfd: "\u{1110}\u{1161}\u{11C2}", - nfkc: "\u{D0DB}", - nfkd: "\u{1110}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{D0DC}", - nfc: "\u{D0DC}", - nfd: "\u{1110}\u{1162}", - nfkc: "\u{D0DC}", - nfkd: "\u{1110}\u{1162}", - }, - NormalizationTest { - source: "\u{D0DD}", - nfc: "\u{D0DD}", - nfd: "\u{1110}\u{1162}\u{11A8}", - nfkc: "\u{D0DD}", - nfkd: "\u{1110}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{D0DE}", - nfc: "\u{D0DE}", - nfd: "\u{1110}\u{1162}\u{11A9}", - nfkc: "\u{D0DE}", - nfkd: "\u{1110}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{D0DF}", - nfc: "\u{D0DF}", - nfd: "\u{1110}\u{1162}\u{11AA}", - nfkc: "\u{D0DF}", - nfkd: "\u{1110}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{D0E0}", - nfc: "\u{D0E0}", - nfd: "\u{1110}\u{1162}\u{11AB}", - nfkc: "\u{D0E0}", - nfkd: "\u{1110}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{D0E1}", - nfc: "\u{D0E1}", - nfd: "\u{1110}\u{1162}\u{11AC}", - nfkc: "\u{D0E1}", - nfkd: "\u{1110}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{D0E2}", - nfc: "\u{D0E2}", - nfd: "\u{1110}\u{1162}\u{11AD}", - nfkc: "\u{D0E2}", - nfkd: "\u{1110}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{D0E3}", - nfc: "\u{D0E3}", - nfd: "\u{1110}\u{1162}\u{11AE}", - nfkc: "\u{D0E3}", - nfkd: "\u{1110}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{D0E4}", - nfc: "\u{D0E4}", - nfd: "\u{1110}\u{1162}\u{11AF}", - nfkc: "\u{D0E4}", - nfkd: "\u{1110}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{D0E5}", - nfc: "\u{D0E5}", - nfd: "\u{1110}\u{1162}\u{11B0}", - nfkc: "\u{D0E5}", - nfkd: "\u{1110}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{D0E6}", - nfc: "\u{D0E6}", - nfd: "\u{1110}\u{1162}\u{11B1}", - nfkc: "\u{D0E6}", - nfkd: "\u{1110}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{D0E7}", - nfc: "\u{D0E7}", - nfd: "\u{1110}\u{1162}\u{11B2}", - nfkc: "\u{D0E7}", - nfkd: "\u{1110}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{D0E8}", - nfc: "\u{D0E8}", - nfd: "\u{1110}\u{1162}\u{11B3}", - nfkc: "\u{D0E8}", - nfkd: "\u{1110}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{D0E9}", - nfc: "\u{D0E9}", - nfd: "\u{1110}\u{1162}\u{11B4}", - nfkc: "\u{D0E9}", - nfkd: "\u{1110}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{D0EA}", - nfc: "\u{D0EA}", - nfd: "\u{1110}\u{1162}\u{11B5}", - nfkc: "\u{D0EA}", - nfkd: "\u{1110}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{D0EB}", - nfc: "\u{D0EB}", - nfd: "\u{1110}\u{1162}\u{11B6}", - nfkc: "\u{D0EB}", - nfkd: "\u{1110}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{D0EC}", - nfc: "\u{D0EC}", - nfd: "\u{1110}\u{1162}\u{11B7}", - nfkc: "\u{D0EC}", - nfkd: "\u{1110}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{D0ED}", - nfc: "\u{D0ED}", - nfd: "\u{1110}\u{1162}\u{11B8}", - nfkc: "\u{D0ED}", - nfkd: "\u{1110}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{D0EE}", - nfc: "\u{D0EE}", - nfd: "\u{1110}\u{1162}\u{11B9}", - nfkc: "\u{D0EE}", - nfkd: "\u{1110}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{D0EF}", - nfc: "\u{D0EF}", - nfd: "\u{1110}\u{1162}\u{11BA}", - nfkc: "\u{D0EF}", - nfkd: "\u{1110}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{D0F0}", - nfc: "\u{D0F0}", - nfd: "\u{1110}\u{1162}\u{11BB}", - nfkc: "\u{D0F0}", - nfkd: "\u{1110}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{D0F1}", - nfc: "\u{D0F1}", - nfd: "\u{1110}\u{1162}\u{11BC}", - nfkc: "\u{D0F1}", - nfkd: "\u{1110}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{D0F2}", - nfc: "\u{D0F2}", - nfd: "\u{1110}\u{1162}\u{11BD}", - nfkc: "\u{D0F2}", - nfkd: "\u{1110}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{D0F3}", - nfc: "\u{D0F3}", - nfd: "\u{1110}\u{1162}\u{11BE}", - nfkc: "\u{D0F3}", - nfkd: "\u{1110}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{D0F4}", - nfc: "\u{D0F4}", - nfd: "\u{1110}\u{1162}\u{11BF}", - nfkc: "\u{D0F4}", - nfkd: "\u{1110}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{D0F5}", - nfc: "\u{D0F5}", - nfd: "\u{1110}\u{1162}\u{11C0}", - nfkc: "\u{D0F5}", - nfkd: "\u{1110}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{D0F6}", - nfc: "\u{D0F6}", - nfd: "\u{1110}\u{1162}\u{11C1}", - nfkc: "\u{D0F6}", - nfkd: "\u{1110}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{D0F7}", - nfc: "\u{D0F7}", - nfd: "\u{1110}\u{1162}\u{11C2}", - nfkc: "\u{D0F7}", - nfkd: "\u{1110}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{D0F8}", - nfc: "\u{D0F8}", - nfd: "\u{1110}\u{1163}", - nfkc: "\u{D0F8}", - nfkd: "\u{1110}\u{1163}", - }, - NormalizationTest { - source: "\u{D0F9}", - nfc: "\u{D0F9}", - nfd: "\u{1110}\u{1163}\u{11A8}", - nfkc: "\u{D0F9}", - nfkd: "\u{1110}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{D0FA}", - nfc: "\u{D0FA}", - nfd: "\u{1110}\u{1163}\u{11A9}", - nfkc: "\u{D0FA}", - nfkd: "\u{1110}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{D0FB}", - nfc: "\u{D0FB}", - nfd: "\u{1110}\u{1163}\u{11AA}", - nfkc: "\u{D0FB}", - nfkd: "\u{1110}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{D0FC}", - nfc: "\u{D0FC}", - nfd: "\u{1110}\u{1163}\u{11AB}", - nfkc: "\u{D0FC}", - nfkd: "\u{1110}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{D0FD}", - nfc: "\u{D0FD}", - nfd: "\u{1110}\u{1163}\u{11AC}", - nfkc: "\u{D0FD}", - nfkd: "\u{1110}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{D0FE}", - nfc: "\u{D0FE}", - nfd: "\u{1110}\u{1163}\u{11AD}", - nfkc: "\u{D0FE}", - nfkd: "\u{1110}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{D0FF}", - nfc: "\u{D0FF}", - nfd: "\u{1110}\u{1163}\u{11AE}", - nfkc: "\u{D0FF}", - nfkd: "\u{1110}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{D100}", - nfc: "\u{D100}", - nfd: "\u{1110}\u{1163}\u{11AF}", - nfkc: "\u{D100}", - nfkd: "\u{1110}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{D101}", - nfc: "\u{D101}", - nfd: "\u{1110}\u{1163}\u{11B0}", - nfkc: "\u{D101}", - nfkd: "\u{1110}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{D102}", - nfc: "\u{D102}", - nfd: "\u{1110}\u{1163}\u{11B1}", - nfkc: "\u{D102}", - nfkd: "\u{1110}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{D103}", - nfc: "\u{D103}", - nfd: "\u{1110}\u{1163}\u{11B2}", - nfkc: "\u{D103}", - nfkd: "\u{1110}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{D104}", - nfc: "\u{D104}", - nfd: "\u{1110}\u{1163}\u{11B3}", - nfkc: "\u{D104}", - nfkd: "\u{1110}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{D105}", - nfc: "\u{D105}", - nfd: "\u{1110}\u{1163}\u{11B4}", - nfkc: "\u{D105}", - nfkd: "\u{1110}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{D106}", - nfc: "\u{D106}", - nfd: "\u{1110}\u{1163}\u{11B5}", - nfkc: "\u{D106}", - nfkd: "\u{1110}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{D107}", - nfc: "\u{D107}", - nfd: "\u{1110}\u{1163}\u{11B6}", - nfkc: "\u{D107}", - nfkd: "\u{1110}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{D108}", - nfc: "\u{D108}", - nfd: "\u{1110}\u{1163}\u{11B7}", - nfkc: "\u{D108}", - nfkd: "\u{1110}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{D109}", - nfc: "\u{D109}", - nfd: "\u{1110}\u{1163}\u{11B8}", - nfkc: "\u{D109}", - nfkd: "\u{1110}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{D10A}", - nfc: "\u{D10A}", - nfd: "\u{1110}\u{1163}\u{11B9}", - nfkc: "\u{D10A}", - nfkd: "\u{1110}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{D10B}", - nfc: "\u{D10B}", - nfd: "\u{1110}\u{1163}\u{11BA}", - nfkc: "\u{D10B}", - nfkd: "\u{1110}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{D10C}", - nfc: "\u{D10C}", - nfd: "\u{1110}\u{1163}\u{11BB}", - nfkc: "\u{D10C}", - nfkd: "\u{1110}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{D10D}", - nfc: "\u{D10D}", - nfd: "\u{1110}\u{1163}\u{11BC}", - nfkc: "\u{D10D}", - nfkd: "\u{1110}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{D10E}", - nfc: "\u{D10E}", - nfd: "\u{1110}\u{1163}\u{11BD}", - nfkc: "\u{D10E}", - nfkd: "\u{1110}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{D10F}", - nfc: "\u{D10F}", - nfd: "\u{1110}\u{1163}\u{11BE}", - nfkc: "\u{D10F}", - nfkd: "\u{1110}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{D110}", - nfc: "\u{D110}", - nfd: "\u{1110}\u{1163}\u{11BF}", - nfkc: "\u{D110}", - nfkd: "\u{1110}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{D111}", - nfc: "\u{D111}", - nfd: "\u{1110}\u{1163}\u{11C0}", - nfkc: "\u{D111}", - nfkd: "\u{1110}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{D112}", - nfc: "\u{D112}", - nfd: "\u{1110}\u{1163}\u{11C1}", - nfkc: "\u{D112}", - nfkd: "\u{1110}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{D113}", - nfc: "\u{D113}", - nfd: "\u{1110}\u{1163}\u{11C2}", - nfkc: "\u{D113}", - nfkd: "\u{1110}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{D114}", - nfc: "\u{D114}", - nfd: "\u{1110}\u{1164}", - nfkc: "\u{D114}", - nfkd: "\u{1110}\u{1164}", - }, - NormalizationTest { - source: "\u{D115}", - nfc: "\u{D115}", - nfd: "\u{1110}\u{1164}\u{11A8}", - nfkc: "\u{D115}", - nfkd: "\u{1110}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{D116}", - nfc: "\u{D116}", - nfd: "\u{1110}\u{1164}\u{11A9}", - nfkc: "\u{D116}", - nfkd: "\u{1110}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{D117}", - nfc: "\u{D117}", - nfd: "\u{1110}\u{1164}\u{11AA}", - nfkc: "\u{D117}", - nfkd: "\u{1110}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{D118}", - nfc: "\u{D118}", - nfd: "\u{1110}\u{1164}\u{11AB}", - nfkc: "\u{D118}", - nfkd: "\u{1110}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{D119}", - nfc: "\u{D119}", - nfd: "\u{1110}\u{1164}\u{11AC}", - nfkc: "\u{D119}", - nfkd: "\u{1110}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{D11A}", - nfc: "\u{D11A}", - nfd: "\u{1110}\u{1164}\u{11AD}", - nfkc: "\u{D11A}", - nfkd: "\u{1110}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{D11B}", - nfc: "\u{D11B}", - nfd: "\u{1110}\u{1164}\u{11AE}", - nfkc: "\u{D11B}", - nfkd: "\u{1110}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{D11C}", - nfc: "\u{D11C}", - nfd: "\u{1110}\u{1164}\u{11AF}", - nfkc: "\u{D11C}", - nfkd: "\u{1110}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{D11D}", - nfc: "\u{D11D}", - nfd: "\u{1110}\u{1164}\u{11B0}", - nfkc: "\u{D11D}", - nfkd: "\u{1110}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{D11E}", - nfc: "\u{D11E}", - nfd: "\u{1110}\u{1164}\u{11B1}", - nfkc: "\u{D11E}", - nfkd: "\u{1110}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{D11F}", - nfc: "\u{D11F}", - nfd: "\u{1110}\u{1164}\u{11B2}", - nfkc: "\u{D11F}", - nfkd: "\u{1110}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{D120}", - nfc: "\u{D120}", - nfd: "\u{1110}\u{1164}\u{11B3}", - nfkc: "\u{D120}", - nfkd: "\u{1110}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{D121}", - nfc: "\u{D121}", - nfd: "\u{1110}\u{1164}\u{11B4}", - nfkc: "\u{D121}", - nfkd: "\u{1110}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{D122}", - nfc: "\u{D122}", - nfd: "\u{1110}\u{1164}\u{11B5}", - nfkc: "\u{D122}", - nfkd: "\u{1110}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{D123}", - nfc: "\u{D123}", - nfd: "\u{1110}\u{1164}\u{11B6}", - nfkc: "\u{D123}", - nfkd: "\u{1110}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{D124}", - nfc: "\u{D124}", - nfd: "\u{1110}\u{1164}\u{11B7}", - nfkc: "\u{D124}", - nfkd: "\u{1110}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{D125}", - nfc: "\u{D125}", - nfd: "\u{1110}\u{1164}\u{11B8}", - nfkc: "\u{D125}", - nfkd: "\u{1110}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{D126}", - nfc: "\u{D126}", - nfd: "\u{1110}\u{1164}\u{11B9}", - nfkc: "\u{D126}", - nfkd: "\u{1110}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{D127}", - nfc: "\u{D127}", - nfd: "\u{1110}\u{1164}\u{11BA}", - nfkc: "\u{D127}", - nfkd: "\u{1110}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{D128}", - nfc: "\u{D128}", - nfd: "\u{1110}\u{1164}\u{11BB}", - nfkc: "\u{D128}", - nfkd: "\u{1110}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{D129}", - nfc: "\u{D129}", - nfd: "\u{1110}\u{1164}\u{11BC}", - nfkc: "\u{D129}", - nfkd: "\u{1110}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{D12A}", - nfc: "\u{D12A}", - nfd: "\u{1110}\u{1164}\u{11BD}", - nfkc: "\u{D12A}", - nfkd: "\u{1110}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{D12B}", - nfc: "\u{D12B}", - nfd: "\u{1110}\u{1164}\u{11BE}", - nfkc: "\u{D12B}", - nfkd: "\u{1110}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{D12C}", - nfc: "\u{D12C}", - nfd: "\u{1110}\u{1164}\u{11BF}", - nfkc: "\u{D12C}", - nfkd: "\u{1110}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{D12D}", - nfc: "\u{D12D}", - nfd: "\u{1110}\u{1164}\u{11C0}", - nfkc: "\u{D12D}", - nfkd: "\u{1110}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{D12E}", - nfc: "\u{D12E}", - nfd: "\u{1110}\u{1164}\u{11C1}", - nfkc: "\u{D12E}", - nfkd: "\u{1110}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{D12F}", - nfc: "\u{D12F}", - nfd: "\u{1110}\u{1164}\u{11C2}", - nfkc: "\u{D12F}", - nfkd: "\u{1110}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{D130}", - nfc: "\u{D130}", - nfd: "\u{1110}\u{1165}", - nfkc: "\u{D130}", - nfkd: "\u{1110}\u{1165}", - }, - NormalizationTest { - source: "\u{D131}", - nfc: "\u{D131}", - nfd: "\u{1110}\u{1165}\u{11A8}", - nfkc: "\u{D131}", - nfkd: "\u{1110}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{D132}", - nfc: "\u{D132}", - nfd: "\u{1110}\u{1165}\u{11A9}", - nfkc: "\u{D132}", - nfkd: "\u{1110}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{D133}", - nfc: "\u{D133}", - nfd: "\u{1110}\u{1165}\u{11AA}", - nfkc: "\u{D133}", - nfkd: "\u{1110}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{D134}", - nfc: "\u{D134}", - nfd: "\u{1110}\u{1165}\u{11AB}", - nfkc: "\u{D134}", - nfkd: "\u{1110}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{D135}", - nfc: "\u{D135}", - nfd: "\u{1110}\u{1165}\u{11AC}", - nfkc: "\u{D135}", - nfkd: "\u{1110}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{D136}", - nfc: "\u{D136}", - nfd: "\u{1110}\u{1165}\u{11AD}", - nfkc: "\u{D136}", - nfkd: "\u{1110}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{D137}", - nfc: "\u{D137}", - nfd: "\u{1110}\u{1165}\u{11AE}", - nfkc: "\u{D137}", - nfkd: "\u{1110}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{D138}", - nfc: "\u{D138}", - nfd: "\u{1110}\u{1165}\u{11AF}", - nfkc: "\u{D138}", - nfkd: "\u{1110}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{D139}", - nfc: "\u{D139}", - nfd: "\u{1110}\u{1165}\u{11B0}", - nfkc: "\u{D139}", - nfkd: "\u{1110}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{D13A}", - nfc: "\u{D13A}", - nfd: "\u{1110}\u{1165}\u{11B1}", - nfkc: "\u{D13A}", - nfkd: "\u{1110}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{D13B}", - nfc: "\u{D13B}", - nfd: "\u{1110}\u{1165}\u{11B2}", - nfkc: "\u{D13B}", - nfkd: "\u{1110}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{D13C}", - nfc: "\u{D13C}", - nfd: "\u{1110}\u{1165}\u{11B3}", - nfkc: "\u{D13C}", - nfkd: "\u{1110}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{D13D}", - nfc: "\u{D13D}", - nfd: "\u{1110}\u{1165}\u{11B4}", - nfkc: "\u{D13D}", - nfkd: "\u{1110}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{D13E}", - nfc: "\u{D13E}", - nfd: "\u{1110}\u{1165}\u{11B5}", - nfkc: "\u{D13E}", - nfkd: "\u{1110}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{D13F}", - nfc: "\u{D13F}", - nfd: "\u{1110}\u{1165}\u{11B6}", - nfkc: "\u{D13F}", - nfkd: "\u{1110}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{D140}", - nfc: "\u{D140}", - nfd: "\u{1110}\u{1165}\u{11B7}", - nfkc: "\u{D140}", - nfkd: "\u{1110}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{D141}", - nfc: "\u{D141}", - nfd: "\u{1110}\u{1165}\u{11B8}", - nfkc: "\u{D141}", - nfkd: "\u{1110}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{D142}", - nfc: "\u{D142}", - nfd: "\u{1110}\u{1165}\u{11B9}", - nfkc: "\u{D142}", - nfkd: "\u{1110}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{D143}", - nfc: "\u{D143}", - nfd: "\u{1110}\u{1165}\u{11BA}", - nfkc: "\u{D143}", - nfkd: "\u{1110}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{D144}", - nfc: "\u{D144}", - nfd: "\u{1110}\u{1165}\u{11BB}", - nfkc: "\u{D144}", - nfkd: "\u{1110}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{D145}", - nfc: "\u{D145}", - nfd: "\u{1110}\u{1165}\u{11BC}", - nfkc: "\u{D145}", - nfkd: "\u{1110}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{D146}", - nfc: "\u{D146}", - nfd: "\u{1110}\u{1165}\u{11BD}", - nfkc: "\u{D146}", - nfkd: "\u{1110}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{D147}", - nfc: "\u{D147}", - nfd: "\u{1110}\u{1165}\u{11BE}", - nfkc: "\u{D147}", - nfkd: "\u{1110}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{D148}", - nfc: "\u{D148}", - nfd: "\u{1110}\u{1165}\u{11BF}", - nfkc: "\u{D148}", - nfkd: "\u{1110}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{D149}", - nfc: "\u{D149}", - nfd: "\u{1110}\u{1165}\u{11C0}", - nfkc: "\u{D149}", - nfkd: "\u{1110}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{D14A}", - nfc: "\u{D14A}", - nfd: "\u{1110}\u{1165}\u{11C1}", - nfkc: "\u{D14A}", - nfkd: "\u{1110}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{D14B}", - nfc: "\u{D14B}", - nfd: "\u{1110}\u{1165}\u{11C2}", - nfkc: "\u{D14B}", - nfkd: "\u{1110}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{D14C}", - nfc: "\u{D14C}", - nfd: "\u{1110}\u{1166}", - nfkc: "\u{D14C}", - nfkd: "\u{1110}\u{1166}", - }, - NormalizationTest { - source: "\u{D14D}", - nfc: "\u{D14D}", - nfd: "\u{1110}\u{1166}\u{11A8}", - nfkc: "\u{D14D}", - nfkd: "\u{1110}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{D14E}", - nfc: "\u{D14E}", - nfd: "\u{1110}\u{1166}\u{11A9}", - nfkc: "\u{D14E}", - nfkd: "\u{1110}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{D14F}", - nfc: "\u{D14F}", - nfd: "\u{1110}\u{1166}\u{11AA}", - nfkc: "\u{D14F}", - nfkd: "\u{1110}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{D150}", - nfc: "\u{D150}", - nfd: "\u{1110}\u{1166}\u{11AB}", - nfkc: "\u{D150}", - nfkd: "\u{1110}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{D151}", - nfc: "\u{D151}", - nfd: "\u{1110}\u{1166}\u{11AC}", - nfkc: "\u{D151}", - nfkd: "\u{1110}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{D152}", - nfc: "\u{D152}", - nfd: "\u{1110}\u{1166}\u{11AD}", - nfkc: "\u{D152}", - nfkd: "\u{1110}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{D153}", - nfc: "\u{D153}", - nfd: "\u{1110}\u{1166}\u{11AE}", - nfkc: "\u{D153}", - nfkd: "\u{1110}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{D154}", - nfc: "\u{D154}", - nfd: "\u{1110}\u{1166}\u{11AF}", - nfkc: "\u{D154}", - nfkd: "\u{1110}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{D155}", - nfc: "\u{D155}", - nfd: "\u{1110}\u{1166}\u{11B0}", - nfkc: "\u{D155}", - nfkd: "\u{1110}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{D156}", - nfc: "\u{D156}", - nfd: "\u{1110}\u{1166}\u{11B1}", - nfkc: "\u{D156}", - nfkd: "\u{1110}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{D157}", - nfc: "\u{D157}", - nfd: "\u{1110}\u{1166}\u{11B2}", - nfkc: "\u{D157}", - nfkd: "\u{1110}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{D158}", - nfc: "\u{D158}", - nfd: "\u{1110}\u{1166}\u{11B3}", - nfkc: "\u{D158}", - nfkd: "\u{1110}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{D159}", - nfc: "\u{D159}", - nfd: "\u{1110}\u{1166}\u{11B4}", - nfkc: "\u{D159}", - nfkd: "\u{1110}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{D15A}", - nfc: "\u{D15A}", - nfd: "\u{1110}\u{1166}\u{11B5}", - nfkc: "\u{D15A}", - nfkd: "\u{1110}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{D15B}", - nfc: "\u{D15B}", - nfd: "\u{1110}\u{1166}\u{11B6}", - nfkc: "\u{D15B}", - nfkd: "\u{1110}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{D15C}", - nfc: "\u{D15C}", - nfd: "\u{1110}\u{1166}\u{11B7}", - nfkc: "\u{D15C}", - nfkd: "\u{1110}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{D15D}", - nfc: "\u{D15D}", - nfd: "\u{1110}\u{1166}\u{11B8}", - nfkc: "\u{D15D}", - nfkd: "\u{1110}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{D15E}", - nfc: "\u{D15E}", - nfd: "\u{1110}\u{1166}\u{11B9}", - nfkc: "\u{D15E}", - nfkd: "\u{1110}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{D15F}", - nfc: "\u{D15F}", - nfd: "\u{1110}\u{1166}\u{11BA}", - nfkc: "\u{D15F}", - nfkd: "\u{1110}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{D160}", - nfc: "\u{D160}", - nfd: "\u{1110}\u{1166}\u{11BB}", - nfkc: "\u{D160}", - nfkd: "\u{1110}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{D161}", - nfc: "\u{D161}", - nfd: "\u{1110}\u{1166}\u{11BC}", - nfkc: "\u{D161}", - nfkd: "\u{1110}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{D162}", - nfc: "\u{D162}", - nfd: "\u{1110}\u{1166}\u{11BD}", - nfkc: "\u{D162}", - nfkd: "\u{1110}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{D163}", - nfc: "\u{D163}", - nfd: "\u{1110}\u{1166}\u{11BE}", - nfkc: "\u{D163}", - nfkd: "\u{1110}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{D164}", - nfc: "\u{D164}", - nfd: "\u{1110}\u{1166}\u{11BF}", - nfkc: "\u{D164}", - nfkd: "\u{1110}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{D165}", - nfc: "\u{D165}", - nfd: "\u{1110}\u{1166}\u{11C0}", - nfkc: "\u{D165}", - nfkd: "\u{1110}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{D166}", - nfc: "\u{D166}", - nfd: "\u{1110}\u{1166}\u{11C1}", - nfkc: "\u{D166}", - nfkd: "\u{1110}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{D167}", - nfc: "\u{D167}", - nfd: "\u{1110}\u{1166}\u{11C2}", - nfkc: "\u{D167}", - nfkd: "\u{1110}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{D168}", - nfc: "\u{D168}", - nfd: "\u{1110}\u{1167}", - nfkc: "\u{D168}", - nfkd: "\u{1110}\u{1167}", - }, - NormalizationTest { - source: "\u{D169}", - nfc: "\u{D169}", - nfd: "\u{1110}\u{1167}\u{11A8}", - nfkc: "\u{D169}", - nfkd: "\u{1110}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{D16A}", - nfc: "\u{D16A}", - nfd: "\u{1110}\u{1167}\u{11A9}", - nfkc: "\u{D16A}", - nfkd: "\u{1110}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{D16B}", - nfc: "\u{D16B}", - nfd: "\u{1110}\u{1167}\u{11AA}", - nfkc: "\u{D16B}", - nfkd: "\u{1110}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{D16C}", - nfc: "\u{D16C}", - nfd: "\u{1110}\u{1167}\u{11AB}", - nfkc: "\u{D16C}", - nfkd: "\u{1110}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{D16D}", - nfc: "\u{D16D}", - nfd: "\u{1110}\u{1167}\u{11AC}", - nfkc: "\u{D16D}", - nfkd: "\u{1110}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{D16E}", - nfc: "\u{D16E}", - nfd: "\u{1110}\u{1167}\u{11AD}", - nfkc: "\u{D16E}", - nfkd: "\u{1110}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{D16F}", - nfc: "\u{D16F}", - nfd: "\u{1110}\u{1167}\u{11AE}", - nfkc: "\u{D16F}", - nfkd: "\u{1110}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{D170}", - nfc: "\u{D170}", - nfd: "\u{1110}\u{1167}\u{11AF}", - nfkc: "\u{D170}", - nfkd: "\u{1110}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{D171}", - nfc: "\u{D171}", - nfd: "\u{1110}\u{1167}\u{11B0}", - nfkc: "\u{D171}", - nfkd: "\u{1110}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{D172}", - nfc: "\u{D172}", - nfd: "\u{1110}\u{1167}\u{11B1}", - nfkc: "\u{D172}", - nfkd: "\u{1110}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{D173}", - nfc: "\u{D173}", - nfd: "\u{1110}\u{1167}\u{11B2}", - nfkc: "\u{D173}", - nfkd: "\u{1110}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{D174}", - nfc: "\u{D174}", - nfd: "\u{1110}\u{1167}\u{11B3}", - nfkc: "\u{D174}", - nfkd: "\u{1110}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{D175}", - nfc: "\u{D175}", - nfd: "\u{1110}\u{1167}\u{11B4}", - nfkc: "\u{D175}", - nfkd: "\u{1110}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{D176}", - nfc: "\u{D176}", - nfd: "\u{1110}\u{1167}\u{11B5}", - nfkc: "\u{D176}", - nfkd: "\u{1110}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{D177}", - nfc: "\u{D177}", - nfd: "\u{1110}\u{1167}\u{11B6}", - nfkc: "\u{D177}", - nfkd: "\u{1110}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{D178}", - nfc: "\u{D178}", - nfd: "\u{1110}\u{1167}\u{11B7}", - nfkc: "\u{D178}", - nfkd: "\u{1110}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{D179}", - nfc: "\u{D179}", - nfd: "\u{1110}\u{1167}\u{11B8}", - nfkc: "\u{D179}", - nfkd: "\u{1110}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{D17A}", - nfc: "\u{D17A}", - nfd: "\u{1110}\u{1167}\u{11B9}", - nfkc: "\u{D17A}", - nfkd: "\u{1110}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{D17B}", - nfc: "\u{D17B}", - nfd: "\u{1110}\u{1167}\u{11BA}", - nfkc: "\u{D17B}", - nfkd: "\u{1110}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{D17C}", - nfc: "\u{D17C}", - nfd: "\u{1110}\u{1167}\u{11BB}", - nfkc: "\u{D17C}", - nfkd: "\u{1110}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{D17D}", - nfc: "\u{D17D}", - nfd: "\u{1110}\u{1167}\u{11BC}", - nfkc: "\u{D17D}", - nfkd: "\u{1110}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{D17E}", - nfc: "\u{D17E}", - nfd: "\u{1110}\u{1167}\u{11BD}", - nfkc: "\u{D17E}", - nfkd: "\u{1110}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{D17F}", - nfc: "\u{D17F}", - nfd: "\u{1110}\u{1167}\u{11BE}", - nfkc: "\u{D17F}", - nfkd: "\u{1110}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{D180}", - nfc: "\u{D180}", - nfd: "\u{1110}\u{1167}\u{11BF}", - nfkc: "\u{D180}", - nfkd: "\u{1110}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{D181}", - nfc: "\u{D181}", - nfd: "\u{1110}\u{1167}\u{11C0}", - nfkc: "\u{D181}", - nfkd: "\u{1110}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{D182}", - nfc: "\u{D182}", - nfd: "\u{1110}\u{1167}\u{11C1}", - nfkc: "\u{D182}", - nfkd: "\u{1110}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{D183}", - nfc: "\u{D183}", - nfd: "\u{1110}\u{1167}\u{11C2}", - nfkc: "\u{D183}", - nfkd: "\u{1110}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{D184}", - nfc: "\u{D184}", - nfd: "\u{1110}\u{1168}", - nfkc: "\u{D184}", - nfkd: "\u{1110}\u{1168}", - }, - NormalizationTest { - source: "\u{D185}", - nfc: "\u{D185}", - nfd: "\u{1110}\u{1168}\u{11A8}", - nfkc: "\u{D185}", - nfkd: "\u{1110}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{D186}", - nfc: "\u{D186}", - nfd: "\u{1110}\u{1168}\u{11A9}", - nfkc: "\u{D186}", - nfkd: "\u{1110}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{D187}", - nfc: "\u{D187}", - nfd: "\u{1110}\u{1168}\u{11AA}", - nfkc: "\u{D187}", - nfkd: "\u{1110}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{D188}", - nfc: "\u{D188}", - nfd: "\u{1110}\u{1168}\u{11AB}", - nfkc: "\u{D188}", - nfkd: "\u{1110}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{D189}", - nfc: "\u{D189}", - nfd: "\u{1110}\u{1168}\u{11AC}", - nfkc: "\u{D189}", - nfkd: "\u{1110}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{D18A}", - nfc: "\u{D18A}", - nfd: "\u{1110}\u{1168}\u{11AD}", - nfkc: "\u{D18A}", - nfkd: "\u{1110}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{D18B}", - nfc: "\u{D18B}", - nfd: "\u{1110}\u{1168}\u{11AE}", - nfkc: "\u{D18B}", - nfkd: "\u{1110}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{D18C}", - nfc: "\u{D18C}", - nfd: "\u{1110}\u{1168}\u{11AF}", - nfkc: "\u{D18C}", - nfkd: "\u{1110}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{D18D}", - nfc: "\u{D18D}", - nfd: "\u{1110}\u{1168}\u{11B0}", - nfkc: "\u{D18D}", - nfkd: "\u{1110}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{D18E}", - nfc: "\u{D18E}", - nfd: "\u{1110}\u{1168}\u{11B1}", - nfkc: "\u{D18E}", - nfkd: "\u{1110}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{D18F}", - nfc: "\u{D18F}", - nfd: "\u{1110}\u{1168}\u{11B2}", - nfkc: "\u{D18F}", - nfkd: "\u{1110}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{D190}", - nfc: "\u{D190}", - nfd: "\u{1110}\u{1168}\u{11B3}", - nfkc: "\u{D190}", - nfkd: "\u{1110}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{D191}", - nfc: "\u{D191}", - nfd: "\u{1110}\u{1168}\u{11B4}", - nfkc: "\u{D191}", - nfkd: "\u{1110}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{D192}", - nfc: "\u{D192}", - nfd: "\u{1110}\u{1168}\u{11B5}", - nfkc: "\u{D192}", - nfkd: "\u{1110}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{D193}", - nfc: "\u{D193}", - nfd: "\u{1110}\u{1168}\u{11B6}", - nfkc: "\u{D193}", - nfkd: "\u{1110}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{D194}", - nfc: "\u{D194}", - nfd: "\u{1110}\u{1168}\u{11B7}", - nfkc: "\u{D194}", - nfkd: "\u{1110}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{D195}", - nfc: "\u{D195}", - nfd: "\u{1110}\u{1168}\u{11B8}", - nfkc: "\u{D195}", - nfkd: "\u{1110}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{D196}", - nfc: "\u{D196}", - nfd: "\u{1110}\u{1168}\u{11B9}", - nfkc: "\u{D196}", - nfkd: "\u{1110}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{D197}", - nfc: "\u{D197}", - nfd: "\u{1110}\u{1168}\u{11BA}", - nfkc: "\u{D197}", - nfkd: "\u{1110}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{D198}", - nfc: "\u{D198}", - nfd: "\u{1110}\u{1168}\u{11BB}", - nfkc: "\u{D198}", - nfkd: "\u{1110}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{D199}", - nfc: "\u{D199}", - nfd: "\u{1110}\u{1168}\u{11BC}", - nfkc: "\u{D199}", - nfkd: "\u{1110}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{D19A}", - nfc: "\u{D19A}", - nfd: "\u{1110}\u{1168}\u{11BD}", - nfkc: "\u{D19A}", - nfkd: "\u{1110}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{D19B}", - nfc: "\u{D19B}", - nfd: "\u{1110}\u{1168}\u{11BE}", - nfkc: "\u{D19B}", - nfkd: "\u{1110}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{D19C}", - nfc: "\u{D19C}", - nfd: "\u{1110}\u{1168}\u{11BF}", - nfkc: "\u{D19C}", - nfkd: "\u{1110}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{D19D}", - nfc: "\u{D19D}", - nfd: "\u{1110}\u{1168}\u{11C0}", - nfkc: "\u{D19D}", - nfkd: "\u{1110}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{D19E}", - nfc: "\u{D19E}", - nfd: "\u{1110}\u{1168}\u{11C1}", - nfkc: "\u{D19E}", - nfkd: "\u{1110}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{D19F}", - nfc: "\u{D19F}", - nfd: "\u{1110}\u{1168}\u{11C2}", - nfkc: "\u{D19F}", - nfkd: "\u{1110}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{D1A0}", - nfc: "\u{D1A0}", - nfd: "\u{1110}\u{1169}", - nfkc: "\u{D1A0}", - nfkd: "\u{1110}\u{1169}", - }, - NormalizationTest { - source: "\u{D1A1}", - nfc: "\u{D1A1}", - nfd: "\u{1110}\u{1169}\u{11A8}", - nfkc: "\u{D1A1}", - nfkd: "\u{1110}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{D1A2}", - nfc: "\u{D1A2}", - nfd: "\u{1110}\u{1169}\u{11A9}", - nfkc: "\u{D1A2}", - nfkd: "\u{1110}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{D1A3}", - nfc: "\u{D1A3}", - nfd: "\u{1110}\u{1169}\u{11AA}", - nfkc: "\u{D1A3}", - nfkd: "\u{1110}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{D1A4}", - nfc: "\u{D1A4}", - nfd: "\u{1110}\u{1169}\u{11AB}", - nfkc: "\u{D1A4}", - nfkd: "\u{1110}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{D1A5}", - nfc: "\u{D1A5}", - nfd: "\u{1110}\u{1169}\u{11AC}", - nfkc: "\u{D1A5}", - nfkd: "\u{1110}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{D1A6}", - nfc: "\u{D1A6}", - nfd: "\u{1110}\u{1169}\u{11AD}", - nfkc: "\u{D1A6}", - nfkd: "\u{1110}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{D1A7}", - nfc: "\u{D1A7}", - nfd: "\u{1110}\u{1169}\u{11AE}", - nfkc: "\u{D1A7}", - nfkd: "\u{1110}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{D1A8}", - nfc: "\u{D1A8}", - nfd: "\u{1110}\u{1169}\u{11AF}", - nfkc: "\u{D1A8}", - nfkd: "\u{1110}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{D1A9}", - nfc: "\u{D1A9}", - nfd: "\u{1110}\u{1169}\u{11B0}", - nfkc: "\u{D1A9}", - nfkd: "\u{1110}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{D1AA}", - nfc: "\u{D1AA}", - nfd: "\u{1110}\u{1169}\u{11B1}", - nfkc: "\u{D1AA}", - nfkd: "\u{1110}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{D1AB}", - nfc: "\u{D1AB}", - nfd: "\u{1110}\u{1169}\u{11B2}", - nfkc: "\u{D1AB}", - nfkd: "\u{1110}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{D1AC}", - nfc: "\u{D1AC}", - nfd: "\u{1110}\u{1169}\u{11B3}", - nfkc: "\u{D1AC}", - nfkd: "\u{1110}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{D1AD}", - nfc: "\u{D1AD}", - nfd: "\u{1110}\u{1169}\u{11B4}", - nfkc: "\u{D1AD}", - nfkd: "\u{1110}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{D1AE}", - nfc: "\u{D1AE}", - nfd: "\u{1110}\u{1169}\u{11B5}", - nfkc: "\u{D1AE}", - nfkd: "\u{1110}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{D1AF}", - nfc: "\u{D1AF}", - nfd: "\u{1110}\u{1169}\u{11B6}", - nfkc: "\u{D1AF}", - nfkd: "\u{1110}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{D1B0}", - nfc: "\u{D1B0}", - nfd: "\u{1110}\u{1169}\u{11B7}", - nfkc: "\u{D1B0}", - nfkd: "\u{1110}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{D1B1}", - nfc: "\u{D1B1}", - nfd: "\u{1110}\u{1169}\u{11B8}", - nfkc: "\u{D1B1}", - nfkd: "\u{1110}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{D1B2}", - nfc: "\u{D1B2}", - nfd: "\u{1110}\u{1169}\u{11B9}", - nfkc: "\u{D1B2}", - nfkd: "\u{1110}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{D1B3}", - nfc: "\u{D1B3}", - nfd: "\u{1110}\u{1169}\u{11BA}", - nfkc: "\u{D1B3}", - nfkd: "\u{1110}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{D1B4}", - nfc: "\u{D1B4}", - nfd: "\u{1110}\u{1169}\u{11BB}", - nfkc: "\u{D1B4}", - nfkd: "\u{1110}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{D1B5}", - nfc: "\u{D1B5}", - nfd: "\u{1110}\u{1169}\u{11BC}", - nfkc: "\u{D1B5}", - nfkd: "\u{1110}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{D1B6}", - nfc: "\u{D1B6}", - nfd: "\u{1110}\u{1169}\u{11BD}", - nfkc: "\u{D1B6}", - nfkd: "\u{1110}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{D1B7}", - nfc: "\u{D1B7}", - nfd: "\u{1110}\u{1169}\u{11BE}", - nfkc: "\u{D1B7}", - nfkd: "\u{1110}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{D1B8}", - nfc: "\u{D1B8}", - nfd: "\u{1110}\u{1169}\u{11BF}", - nfkc: "\u{D1B8}", - nfkd: "\u{1110}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{D1B9}", - nfc: "\u{D1B9}", - nfd: "\u{1110}\u{1169}\u{11C0}", - nfkc: "\u{D1B9}", - nfkd: "\u{1110}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{D1BA}", - nfc: "\u{D1BA}", - nfd: "\u{1110}\u{1169}\u{11C1}", - nfkc: "\u{D1BA}", - nfkd: "\u{1110}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{D1BB}", - nfc: "\u{D1BB}", - nfd: "\u{1110}\u{1169}\u{11C2}", - nfkc: "\u{D1BB}", - nfkd: "\u{1110}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{D1BC}", - nfc: "\u{D1BC}", - nfd: "\u{1110}\u{116A}", - nfkc: "\u{D1BC}", - nfkd: "\u{1110}\u{116A}", - }, - NormalizationTest { - source: "\u{D1BD}", - nfc: "\u{D1BD}", - nfd: "\u{1110}\u{116A}\u{11A8}", - nfkc: "\u{D1BD}", - nfkd: "\u{1110}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{D1BE}", - nfc: "\u{D1BE}", - nfd: "\u{1110}\u{116A}\u{11A9}", - nfkc: "\u{D1BE}", - nfkd: "\u{1110}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{D1BF}", - nfc: "\u{D1BF}", - nfd: "\u{1110}\u{116A}\u{11AA}", - nfkc: "\u{D1BF}", - nfkd: "\u{1110}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{D1C0}", - nfc: "\u{D1C0}", - nfd: "\u{1110}\u{116A}\u{11AB}", - nfkc: "\u{D1C0}", - nfkd: "\u{1110}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{D1C1}", - nfc: "\u{D1C1}", - nfd: "\u{1110}\u{116A}\u{11AC}", - nfkc: "\u{D1C1}", - nfkd: "\u{1110}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{D1C2}", - nfc: "\u{D1C2}", - nfd: "\u{1110}\u{116A}\u{11AD}", - nfkc: "\u{D1C2}", - nfkd: "\u{1110}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{D1C3}", - nfc: "\u{D1C3}", - nfd: "\u{1110}\u{116A}\u{11AE}", - nfkc: "\u{D1C3}", - nfkd: "\u{1110}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{D1C4}", - nfc: "\u{D1C4}", - nfd: "\u{1110}\u{116A}\u{11AF}", - nfkc: "\u{D1C4}", - nfkd: "\u{1110}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{D1C5}", - nfc: "\u{D1C5}", - nfd: "\u{1110}\u{116A}\u{11B0}", - nfkc: "\u{D1C5}", - nfkd: "\u{1110}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{D1C6}", - nfc: "\u{D1C6}", - nfd: "\u{1110}\u{116A}\u{11B1}", - nfkc: "\u{D1C6}", - nfkd: "\u{1110}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{D1C7}", - nfc: "\u{D1C7}", - nfd: "\u{1110}\u{116A}\u{11B2}", - nfkc: "\u{D1C7}", - nfkd: "\u{1110}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{D1C8}", - nfc: "\u{D1C8}", - nfd: "\u{1110}\u{116A}\u{11B3}", - nfkc: "\u{D1C8}", - nfkd: "\u{1110}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{D1C9}", - nfc: "\u{D1C9}", - nfd: "\u{1110}\u{116A}\u{11B4}", - nfkc: "\u{D1C9}", - nfkd: "\u{1110}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{D1CA}", - nfc: "\u{D1CA}", - nfd: "\u{1110}\u{116A}\u{11B5}", - nfkc: "\u{D1CA}", - nfkd: "\u{1110}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{D1CB}", - nfc: "\u{D1CB}", - nfd: "\u{1110}\u{116A}\u{11B6}", - nfkc: "\u{D1CB}", - nfkd: "\u{1110}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{D1CC}", - nfc: "\u{D1CC}", - nfd: "\u{1110}\u{116A}\u{11B7}", - nfkc: "\u{D1CC}", - nfkd: "\u{1110}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{D1CD}", - nfc: "\u{D1CD}", - nfd: "\u{1110}\u{116A}\u{11B8}", - nfkc: "\u{D1CD}", - nfkd: "\u{1110}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{D1CE}", - nfc: "\u{D1CE}", - nfd: "\u{1110}\u{116A}\u{11B9}", - nfkc: "\u{D1CE}", - nfkd: "\u{1110}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{D1CF}", - nfc: "\u{D1CF}", - nfd: "\u{1110}\u{116A}\u{11BA}", - nfkc: "\u{D1CF}", - nfkd: "\u{1110}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{D1D0}", - nfc: "\u{D1D0}", - nfd: "\u{1110}\u{116A}\u{11BB}", - nfkc: "\u{D1D0}", - nfkd: "\u{1110}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{D1D1}", - nfc: "\u{D1D1}", - nfd: "\u{1110}\u{116A}\u{11BC}", - nfkc: "\u{D1D1}", - nfkd: "\u{1110}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{D1D2}", - nfc: "\u{D1D2}", - nfd: "\u{1110}\u{116A}\u{11BD}", - nfkc: "\u{D1D2}", - nfkd: "\u{1110}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{D1D3}", - nfc: "\u{D1D3}", - nfd: "\u{1110}\u{116A}\u{11BE}", - nfkc: "\u{D1D3}", - nfkd: "\u{1110}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{D1D4}", - nfc: "\u{D1D4}", - nfd: "\u{1110}\u{116A}\u{11BF}", - nfkc: "\u{D1D4}", - nfkd: "\u{1110}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{D1D5}", - nfc: "\u{D1D5}", - nfd: "\u{1110}\u{116A}\u{11C0}", - nfkc: "\u{D1D5}", - nfkd: "\u{1110}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{D1D6}", - nfc: "\u{D1D6}", - nfd: "\u{1110}\u{116A}\u{11C1}", - nfkc: "\u{D1D6}", - nfkd: "\u{1110}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{D1D7}", - nfc: "\u{D1D7}", - nfd: "\u{1110}\u{116A}\u{11C2}", - nfkc: "\u{D1D7}", - nfkd: "\u{1110}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{D1D8}", - nfc: "\u{D1D8}", - nfd: "\u{1110}\u{116B}", - nfkc: "\u{D1D8}", - nfkd: "\u{1110}\u{116B}", - }, - NormalizationTest { - source: "\u{D1D9}", - nfc: "\u{D1D9}", - nfd: "\u{1110}\u{116B}\u{11A8}", - nfkc: "\u{D1D9}", - nfkd: "\u{1110}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{D1DA}", - nfc: "\u{D1DA}", - nfd: "\u{1110}\u{116B}\u{11A9}", - nfkc: "\u{D1DA}", - nfkd: "\u{1110}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{D1DB}", - nfc: "\u{D1DB}", - nfd: "\u{1110}\u{116B}\u{11AA}", - nfkc: "\u{D1DB}", - nfkd: "\u{1110}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{D1DC}", - nfc: "\u{D1DC}", - nfd: "\u{1110}\u{116B}\u{11AB}", - nfkc: "\u{D1DC}", - nfkd: "\u{1110}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{D1DD}", - nfc: "\u{D1DD}", - nfd: "\u{1110}\u{116B}\u{11AC}", - nfkc: "\u{D1DD}", - nfkd: "\u{1110}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{D1DE}", - nfc: "\u{D1DE}", - nfd: "\u{1110}\u{116B}\u{11AD}", - nfkc: "\u{D1DE}", - nfkd: "\u{1110}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{D1DF}", - nfc: "\u{D1DF}", - nfd: "\u{1110}\u{116B}\u{11AE}", - nfkc: "\u{D1DF}", - nfkd: "\u{1110}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{D1E0}", - nfc: "\u{D1E0}", - nfd: "\u{1110}\u{116B}\u{11AF}", - nfkc: "\u{D1E0}", - nfkd: "\u{1110}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{D1E1}", - nfc: "\u{D1E1}", - nfd: "\u{1110}\u{116B}\u{11B0}", - nfkc: "\u{D1E1}", - nfkd: "\u{1110}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{D1E2}", - nfc: "\u{D1E2}", - nfd: "\u{1110}\u{116B}\u{11B1}", - nfkc: "\u{D1E2}", - nfkd: "\u{1110}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{D1E3}", - nfc: "\u{D1E3}", - nfd: "\u{1110}\u{116B}\u{11B2}", - nfkc: "\u{D1E3}", - nfkd: "\u{1110}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{D1E4}", - nfc: "\u{D1E4}", - nfd: "\u{1110}\u{116B}\u{11B3}", - nfkc: "\u{D1E4}", - nfkd: "\u{1110}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{D1E5}", - nfc: "\u{D1E5}", - nfd: "\u{1110}\u{116B}\u{11B4}", - nfkc: "\u{D1E5}", - nfkd: "\u{1110}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{D1E6}", - nfc: "\u{D1E6}", - nfd: "\u{1110}\u{116B}\u{11B5}", - nfkc: "\u{D1E6}", - nfkd: "\u{1110}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{D1E7}", - nfc: "\u{D1E7}", - nfd: "\u{1110}\u{116B}\u{11B6}", - nfkc: "\u{D1E7}", - nfkd: "\u{1110}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{D1E8}", - nfc: "\u{D1E8}", - nfd: "\u{1110}\u{116B}\u{11B7}", - nfkc: "\u{D1E8}", - nfkd: "\u{1110}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{D1E9}", - nfc: "\u{D1E9}", - nfd: "\u{1110}\u{116B}\u{11B8}", - nfkc: "\u{D1E9}", - nfkd: "\u{1110}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{D1EA}", - nfc: "\u{D1EA}", - nfd: "\u{1110}\u{116B}\u{11B9}", - nfkc: "\u{D1EA}", - nfkd: "\u{1110}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{D1EB}", - nfc: "\u{D1EB}", - nfd: "\u{1110}\u{116B}\u{11BA}", - nfkc: "\u{D1EB}", - nfkd: "\u{1110}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{D1EC}", - nfc: "\u{D1EC}", - nfd: "\u{1110}\u{116B}\u{11BB}", - nfkc: "\u{D1EC}", - nfkd: "\u{1110}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{D1ED}", - nfc: "\u{D1ED}", - nfd: "\u{1110}\u{116B}\u{11BC}", - nfkc: "\u{D1ED}", - nfkd: "\u{1110}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{D1EE}", - nfc: "\u{D1EE}", - nfd: "\u{1110}\u{116B}\u{11BD}", - nfkc: "\u{D1EE}", - nfkd: "\u{1110}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{D1EF}", - nfc: "\u{D1EF}", - nfd: "\u{1110}\u{116B}\u{11BE}", - nfkc: "\u{D1EF}", - nfkd: "\u{1110}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{D1F0}", - nfc: "\u{D1F0}", - nfd: "\u{1110}\u{116B}\u{11BF}", - nfkc: "\u{D1F0}", - nfkd: "\u{1110}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{D1F1}", - nfc: "\u{D1F1}", - nfd: "\u{1110}\u{116B}\u{11C0}", - nfkc: "\u{D1F1}", - nfkd: "\u{1110}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{D1F2}", - nfc: "\u{D1F2}", - nfd: "\u{1110}\u{116B}\u{11C1}", - nfkc: "\u{D1F2}", - nfkd: "\u{1110}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{D1F3}", - nfc: "\u{D1F3}", - nfd: "\u{1110}\u{116B}\u{11C2}", - nfkc: "\u{D1F3}", - nfkd: "\u{1110}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{D1F4}", - nfc: "\u{D1F4}", - nfd: "\u{1110}\u{116C}", - nfkc: "\u{D1F4}", - nfkd: "\u{1110}\u{116C}", - }, - NormalizationTest { - source: "\u{D1F5}", - nfc: "\u{D1F5}", - nfd: "\u{1110}\u{116C}\u{11A8}", - nfkc: "\u{D1F5}", - nfkd: "\u{1110}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{D1F6}", - nfc: "\u{D1F6}", - nfd: "\u{1110}\u{116C}\u{11A9}", - nfkc: "\u{D1F6}", - nfkd: "\u{1110}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{D1F7}", - nfc: "\u{D1F7}", - nfd: "\u{1110}\u{116C}\u{11AA}", - nfkc: "\u{D1F7}", - nfkd: "\u{1110}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{D1F8}", - nfc: "\u{D1F8}", - nfd: "\u{1110}\u{116C}\u{11AB}", - nfkc: "\u{D1F8}", - nfkd: "\u{1110}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{D1F9}", - nfc: "\u{D1F9}", - nfd: "\u{1110}\u{116C}\u{11AC}", - nfkc: "\u{D1F9}", - nfkd: "\u{1110}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{D1FA}", - nfc: "\u{D1FA}", - nfd: "\u{1110}\u{116C}\u{11AD}", - nfkc: "\u{D1FA}", - nfkd: "\u{1110}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{D1FB}", - nfc: "\u{D1FB}", - nfd: "\u{1110}\u{116C}\u{11AE}", - nfkc: "\u{D1FB}", - nfkd: "\u{1110}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{D1FC}", - nfc: "\u{D1FC}", - nfd: "\u{1110}\u{116C}\u{11AF}", - nfkc: "\u{D1FC}", - nfkd: "\u{1110}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{D1FD}", - nfc: "\u{D1FD}", - nfd: "\u{1110}\u{116C}\u{11B0}", - nfkc: "\u{D1FD}", - nfkd: "\u{1110}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{D1FE}", - nfc: "\u{D1FE}", - nfd: "\u{1110}\u{116C}\u{11B1}", - nfkc: "\u{D1FE}", - nfkd: "\u{1110}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{D1FF}", - nfc: "\u{D1FF}", - nfd: "\u{1110}\u{116C}\u{11B2}", - nfkc: "\u{D1FF}", - nfkd: "\u{1110}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{D200}", - nfc: "\u{D200}", - nfd: "\u{1110}\u{116C}\u{11B3}", - nfkc: "\u{D200}", - nfkd: "\u{1110}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{D201}", - nfc: "\u{D201}", - nfd: "\u{1110}\u{116C}\u{11B4}", - nfkc: "\u{D201}", - nfkd: "\u{1110}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{D202}", - nfc: "\u{D202}", - nfd: "\u{1110}\u{116C}\u{11B5}", - nfkc: "\u{D202}", - nfkd: "\u{1110}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{D203}", - nfc: "\u{D203}", - nfd: "\u{1110}\u{116C}\u{11B6}", - nfkc: "\u{D203}", - nfkd: "\u{1110}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{D204}", - nfc: "\u{D204}", - nfd: "\u{1110}\u{116C}\u{11B7}", - nfkc: "\u{D204}", - nfkd: "\u{1110}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{D205}", - nfc: "\u{D205}", - nfd: "\u{1110}\u{116C}\u{11B8}", - nfkc: "\u{D205}", - nfkd: "\u{1110}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{D206}", - nfc: "\u{D206}", - nfd: "\u{1110}\u{116C}\u{11B9}", - nfkc: "\u{D206}", - nfkd: "\u{1110}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{D207}", - nfc: "\u{D207}", - nfd: "\u{1110}\u{116C}\u{11BA}", - nfkc: "\u{D207}", - nfkd: "\u{1110}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{D208}", - nfc: "\u{D208}", - nfd: "\u{1110}\u{116C}\u{11BB}", - nfkc: "\u{D208}", - nfkd: "\u{1110}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{D209}", - nfc: "\u{D209}", - nfd: "\u{1110}\u{116C}\u{11BC}", - nfkc: "\u{D209}", - nfkd: "\u{1110}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{D20A}", - nfc: "\u{D20A}", - nfd: "\u{1110}\u{116C}\u{11BD}", - nfkc: "\u{D20A}", - nfkd: "\u{1110}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{D20B}", - nfc: "\u{D20B}", - nfd: "\u{1110}\u{116C}\u{11BE}", - nfkc: "\u{D20B}", - nfkd: "\u{1110}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{D20C}", - nfc: "\u{D20C}", - nfd: "\u{1110}\u{116C}\u{11BF}", - nfkc: "\u{D20C}", - nfkd: "\u{1110}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{D20D}", - nfc: "\u{D20D}", - nfd: "\u{1110}\u{116C}\u{11C0}", - nfkc: "\u{D20D}", - nfkd: "\u{1110}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{D20E}", - nfc: "\u{D20E}", - nfd: "\u{1110}\u{116C}\u{11C1}", - nfkc: "\u{D20E}", - nfkd: "\u{1110}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{D20F}", - nfc: "\u{D20F}", - nfd: "\u{1110}\u{116C}\u{11C2}", - nfkc: "\u{D20F}", - nfkd: "\u{1110}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{D210}", - nfc: "\u{D210}", - nfd: "\u{1110}\u{116D}", - nfkc: "\u{D210}", - nfkd: "\u{1110}\u{116D}", - }, - NormalizationTest { - source: "\u{D211}", - nfc: "\u{D211}", - nfd: "\u{1110}\u{116D}\u{11A8}", - nfkc: "\u{D211}", - nfkd: "\u{1110}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{D212}", - nfc: "\u{D212}", - nfd: "\u{1110}\u{116D}\u{11A9}", - nfkc: "\u{D212}", - nfkd: "\u{1110}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{D213}", - nfc: "\u{D213}", - nfd: "\u{1110}\u{116D}\u{11AA}", - nfkc: "\u{D213}", - nfkd: "\u{1110}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{D214}", - nfc: "\u{D214}", - nfd: "\u{1110}\u{116D}\u{11AB}", - nfkc: "\u{D214}", - nfkd: "\u{1110}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{D215}", - nfc: "\u{D215}", - nfd: "\u{1110}\u{116D}\u{11AC}", - nfkc: "\u{D215}", - nfkd: "\u{1110}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{D216}", - nfc: "\u{D216}", - nfd: "\u{1110}\u{116D}\u{11AD}", - nfkc: "\u{D216}", - nfkd: "\u{1110}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{D217}", - nfc: "\u{D217}", - nfd: "\u{1110}\u{116D}\u{11AE}", - nfkc: "\u{D217}", - nfkd: "\u{1110}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{D218}", - nfc: "\u{D218}", - nfd: "\u{1110}\u{116D}\u{11AF}", - nfkc: "\u{D218}", - nfkd: "\u{1110}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{D219}", - nfc: "\u{D219}", - nfd: "\u{1110}\u{116D}\u{11B0}", - nfkc: "\u{D219}", - nfkd: "\u{1110}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{D21A}", - nfc: "\u{D21A}", - nfd: "\u{1110}\u{116D}\u{11B1}", - nfkc: "\u{D21A}", - nfkd: "\u{1110}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{D21B}", - nfc: "\u{D21B}", - nfd: "\u{1110}\u{116D}\u{11B2}", - nfkc: "\u{D21B}", - nfkd: "\u{1110}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{D21C}", - nfc: "\u{D21C}", - nfd: "\u{1110}\u{116D}\u{11B3}", - nfkc: "\u{D21C}", - nfkd: "\u{1110}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{D21D}", - nfc: "\u{D21D}", - nfd: "\u{1110}\u{116D}\u{11B4}", - nfkc: "\u{D21D}", - nfkd: "\u{1110}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{D21E}", - nfc: "\u{D21E}", - nfd: "\u{1110}\u{116D}\u{11B5}", - nfkc: "\u{D21E}", - nfkd: "\u{1110}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{D21F}", - nfc: "\u{D21F}", - nfd: "\u{1110}\u{116D}\u{11B6}", - nfkc: "\u{D21F}", - nfkd: "\u{1110}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{D220}", - nfc: "\u{D220}", - nfd: "\u{1110}\u{116D}\u{11B7}", - nfkc: "\u{D220}", - nfkd: "\u{1110}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{D221}", - nfc: "\u{D221}", - nfd: "\u{1110}\u{116D}\u{11B8}", - nfkc: "\u{D221}", - nfkd: "\u{1110}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{D222}", - nfc: "\u{D222}", - nfd: "\u{1110}\u{116D}\u{11B9}", - nfkc: "\u{D222}", - nfkd: "\u{1110}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{D223}", - nfc: "\u{D223}", - nfd: "\u{1110}\u{116D}\u{11BA}", - nfkc: "\u{D223}", - nfkd: "\u{1110}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{D224}", - nfc: "\u{D224}", - nfd: "\u{1110}\u{116D}\u{11BB}", - nfkc: "\u{D224}", - nfkd: "\u{1110}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{D225}", - nfc: "\u{D225}", - nfd: "\u{1110}\u{116D}\u{11BC}", - nfkc: "\u{D225}", - nfkd: "\u{1110}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{D226}", - nfc: "\u{D226}", - nfd: "\u{1110}\u{116D}\u{11BD}", - nfkc: "\u{D226}", - nfkd: "\u{1110}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{D227}", - nfc: "\u{D227}", - nfd: "\u{1110}\u{116D}\u{11BE}", - nfkc: "\u{D227}", - nfkd: "\u{1110}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{D228}", - nfc: "\u{D228}", - nfd: "\u{1110}\u{116D}\u{11BF}", - nfkc: "\u{D228}", - nfkd: "\u{1110}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{D229}", - nfc: "\u{D229}", - nfd: "\u{1110}\u{116D}\u{11C0}", - nfkc: "\u{D229}", - nfkd: "\u{1110}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{D22A}", - nfc: "\u{D22A}", - nfd: "\u{1110}\u{116D}\u{11C1}", - nfkc: "\u{D22A}", - nfkd: "\u{1110}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{D22B}", - nfc: "\u{D22B}", - nfd: "\u{1110}\u{116D}\u{11C2}", - nfkc: "\u{D22B}", - nfkd: "\u{1110}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{D22C}", - nfc: "\u{D22C}", - nfd: "\u{1110}\u{116E}", - nfkc: "\u{D22C}", - nfkd: "\u{1110}\u{116E}", - }, - NormalizationTest { - source: "\u{D22D}", - nfc: "\u{D22D}", - nfd: "\u{1110}\u{116E}\u{11A8}", - nfkc: "\u{D22D}", - nfkd: "\u{1110}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{D22E}", - nfc: "\u{D22E}", - nfd: "\u{1110}\u{116E}\u{11A9}", - nfkc: "\u{D22E}", - nfkd: "\u{1110}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{D22F}", - nfc: "\u{D22F}", - nfd: "\u{1110}\u{116E}\u{11AA}", - nfkc: "\u{D22F}", - nfkd: "\u{1110}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{D230}", - nfc: "\u{D230}", - nfd: "\u{1110}\u{116E}\u{11AB}", - nfkc: "\u{D230}", - nfkd: "\u{1110}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{D231}", - nfc: "\u{D231}", - nfd: "\u{1110}\u{116E}\u{11AC}", - nfkc: "\u{D231}", - nfkd: "\u{1110}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{D232}", - nfc: "\u{D232}", - nfd: "\u{1110}\u{116E}\u{11AD}", - nfkc: "\u{D232}", - nfkd: "\u{1110}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{D233}", - nfc: "\u{D233}", - nfd: "\u{1110}\u{116E}\u{11AE}", - nfkc: "\u{D233}", - nfkd: "\u{1110}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{D234}", - nfc: "\u{D234}", - nfd: "\u{1110}\u{116E}\u{11AF}", - nfkc: "\u{D234}", - nfkd: "\u{1110}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{D235}", - nfc: "\u{D235}", - nfd: "\u{1110}\u{116E}\u{11B0}", - nfkc: "\u{D235}", - nfkd: "\u{1110}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{D236}", - nfc: "\u{D236}", - nfd: "\u{1110}\u{116E}\u{11B1}", - nfkc: "\u{D236}", - nfkd: "\u{1110}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{D237}", - nfc: "\u{D237}", - nfd: "\u{1110}\u{116E}\u{11B2}", - nfkc: "\u{D237}", - nfkd: "\u{1110}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{D238}", - nfc: "\u{D238}", - nfd: "\u{1110}\u{116E}\u{11B3}", - nfkc: "\u{D238}", - nfkd: "\u{1110}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{D239}", - nfc: "\u{D239}", - nfd: "\u{1110}\u{116E}\u{11B4}", - nfkc: "\u{D239}", - nfkd: "\u{1110}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{D23A}", - nfc: "\u{D23A}", - nfd: "\u{1110}\u{116E}\u{11B5}", - nfkc: "\u{D23A}", - nfkd: "\u{1110}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{D23B}", - nfc: "\u{D23B}", - nfd: "\u{1110}\u{116E}\u{11B6}", - nfkc: "\u{D23B}", - nfkd: "\u{1110}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{D23C}", - nfc: "\u{D23C}", - nfd: "\u{1110}\u{116E}\u{11B7}", - nfkc: "\u{D23C}", - nfkd: "\u{1110}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{D23D}", - nfc: "\u{D23D}", - nfd: "\u{1110}\u{116E}\u{11B8}", - nfkc: "\u{D23D}", - nfkd: "\u{1110}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{D23E}", - nfc: "\u{D23E}", - nfd: "\u{1110}\u{116E}\u{11B9}", - nfkc: "\u{D23E}", - nfkd: "\u{1110}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{D23F}", - nfc: "\u{D23F}", - nfd: "\u{1110}\u{116E}\u{11BA}", - nfkc: "\u{D23F}", - nfkd: "\u{1110}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{D240}", - nfc: "\u{D240}", - nfd: "\u{1110}\u{116E}\u{11BB}", - nfkc: "\u{D240}", - nfkd: "\u{1110}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{D241}", - nfc: "\u{D241}", - nfd: "\u{1110}\u{116E}\u{11BC}", - nfkc: "\u{D241}", - nfkd: "\u{1110}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{D242}", - nfc: "\u{D242}", - nfd: "\u{1110}\u{116E}\u{11BD}", - nfkc: "\u{D242}", - nfkd: "\u{1110}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{D243}", - nfc: "\u{D243}", - nfd: "\u{1110}\u{116E}\u{11BE}", - nfkc: "\u{D243}", - nfkd: "\u{1110}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{D244}", - nfc: "\u{D244}", - nfd: "\u{1110}\u{116E}\u{11BF}", - nfkc: "\u{D244}", - nfkd: "\u{1110}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{D245}", - nfc: "\u{D245}", - nfd: "\u{1110}\u{116E}\u{11C0}", - nfkc: "\u{D245}", - nfkd: "\u{1110}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{D246}", - nfc: "\u{D246}", - nfd: "\u{1110}\u{116E}\u{11C1}", - nfkc: "\u{D246}", - nfkd: "\u{1110}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{D247}", - nfc: "\u{D247}", - nfd: "\u{1110}\u{116E}\u{11C2}", - nfkc: "\u{D247}", - nfkd: "\u{1110}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{D248}", - nfc: "\u{D248}", - nfd: "\u{1110}\u{116F}", - nfkc: "\u{D248}", - nfkd: "\u{1110}\u{116F}", - }, - NormalizationTest { - source: "\u{D249}", - nfc: "\u{D249}", - nfd: "\u{1110}\u{116F}\u{11A8}", - nfkc: "\u{D249}", - nfkd: "\u{1110}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{D24A}", - nfc: "\u{D24A}", - nfd: "\u{1110}\u{116F}\u{11A9}", - nfkc: "\u{D24A}", - nfkd: "\u{1110}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{D24B}", - nfc: "\u{D24B}", - nfd: "\u{1110}\u{116F}\u{11AA}", - nfkc: "\u{D24B}", - nfkd: "\u{1110}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{D24C}", - nfc: "\u{D24C}", - nfd: "\u{1110}\u{116F}\u{11AB}", - nfkc: "\u{D24C}", - nfkd: "\u{1110}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{D24D}", - nfc: "\u{D24D}", - nfd: "\u{1110}\u{116F}\u{11AC}", - nfkc: "\u{D24D}", - nfkd: "\u{1110}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{D24E}", - nfc: "\u{D24E}", - nfd: "\u{1110}\u{116F}\u{11AD}", - nfkc: "\u{D24E}", - nfkd: "\u{1110}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{D24F}", - nfc: "\u{D24F}", - nfd: "\u{1110}\u{116F}\u{11AE}", - nfkc: "\u{D24F}", - nfkd: "\u{1110}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{D250}", - nfc: "\u{D250}", - nfd: "\u{1110}\u{116F}\u{11AF}", - nfkc: "\u{D250}", - nfkd: "\u{1110}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{D251}", - nfc: "\u{D251}", - nfd: "\u{1110}\u{116F}\u{11B0}", - nfkc: "\u{D251}", - nfkd: "\u{1110}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{D252}", - nfc: "\u{D252}", - nfd: "\u{1110}\u{116F}\u{11B1}", - nfkc: "\u{D252}", - nfkd: "\u{1110}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{D253}", - nfc: "\u{D253}", - nfd: "\u{1110}\u{116F}\u{11B2}", - nfkc: "\u{D253}", - nfkd: "\u{1110}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{D254}", - nfc: "\u{D254}", - nfd: "\u{1110}\u{116F}\u{11B3}", - nfkc: "\u{D254}", - nfkd: "\u{1110}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{D255}", - nfc: "\u{D255}", - nfd: "\u{1110}\u{116F}\u{11B4}", - nfkc: "\u{D255}", - nfkd: "\u{1110}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{D256}", - nfc: "\u{D256}", - nfd: "\u{1110}\u{116F}\u{11B5}", - nfkc: "\u{D256}", - nfkd: "\u{1110}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{D257}", - nfc: "\u{D257}", - nfd: "\u{1110}\u{116F}\u{11B6}", - nfkc: "\u{D257}", - nfkd: "\u{1110}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{D258}", - nfc: "\u{D258}", - nfd: "\u{1110}\u{116F}\u{11B7}", - nfkc: "\u{D258}", - nfkd: "\u{1110}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{D259}", - nfc: "\u{D259}", - nfd: "\u{1110}\u{116F}\u{11B8}", - nfkc: "\u{D259}", - nfkd: "\u{1110}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{D25A}", - nfc: "\u{D25A}", - nfd: "\u{1110}\u{116F}\u{11B9}", - nfkc: "\u{D25A}", - nfkd: "\u{1110}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{D25B}", - nfc: "\u{D25B}", - nfd: "\u{1110}\u{116F}\u{11BA}", - nfkc: "\u{D25B}", - nfkd: "\u{1110}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{D25C}", - nfc: "\u{D25C}", - nfd: "\u{1110}\u{116F}\u{11BB}", - nfkc: "\u{D25C}", - nfkd: "\u{1110}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{D25D}", - nfc: "\u{D25D}", - nfd: "\u{1110}\u{116F}\u{11BC}", - nfkc: "\u{D25D}", - nfkd: "\u{1110}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{D25E}", - nfc: "\u{D25E}", - nfd: "\u{1110}\u{116F}\u{11BD}", - nfkc: "\u{D25E}", - nfkd: "\u{1110}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{D25F}", - nfc: "\u{D25F}", - nfd: "\u{1110}\u{116F}\u{11BE}", - nfkc: "\u{D25F}", - nfkd: "\u{1110}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{D260}", - nfc: "\u{D260}", - nfd: "\u{1110}\u{116F}\u{11BF}", - nfkc: "\u{D260}", - nfkd: "\u{1110}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{D261}", - nfc: "\u{D261}", - nfd: "\u{1110}\u{116F}\u{11C0}", - nfkc: "\u{D261}", - nfkd: "\u{1110}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{D262}", - nfc: "\u{D262}", - nfd: "\u{1110}\u{116F}\u{11C1}", - nfkc: "\u{D262}", - nfkd: "\u{1110}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{D263}", - nfc: "\u{D263}", - nfd: "\u{1110}\u{116F}\u{11C2}", - nfkc: "\u{D263}", - nfkd: "\u{1110}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{D264}", - nfc: "\u{D264}", - nfd: "\u{1110}\u{1170}", - nfkc: "\u{D264}", - nfkd: "\u{1110}\u{1170}", - }, - NormalizationTest { - source: "\u{D265}", - nfc: "\u{D265}", - nfd: "\u{1110}\u{1170}\u{11A8}", - nfkc: "\u{D265}", - nfkd: "\u{1110}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{D266}", - nfc: "\u{D266}", - nfd: "\u{1110}\u{1170}\u{11A9}", - nfkc: "\u{D266}", - nfkd: "\u{1110}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{D267}", - nfc: "\u{D267}", - nfd: "\u{1110}\u{1170}\u{11AA}", - nfkc: "\u{D267}", - nfkd: "\u{1110}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{D268}", - nfc: "\u{D268}", - nfd: "\u{1110}\u{1170}\u{11AB}", - nfkc: "\u{D268}", - nfkd: "\u{1110}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{D269}", - nfc: "\u{D269}", - nfd: "\u{1110}\u{1170}\u{11AC}", - nfkc: "\u{D269}", - nfkd: "\u{1110}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{D26A}", - nfc: "\u{D26A}", - nfd: "\u{1110}\u{1170}\u{11AD}", - nfkc: "\u{D26A}", - nfkd: "\u{1110}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{D26B}", - nfc: "\u{D26B}", - nfd: "\u{1110}\u{1170}\u{11AE}", - nfkc: "\u{D26B}", - nfkd: "\u{1110}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{D26C}", - nfc: "\u{D26C}", - nfd: "\u{1110}\u{1170}\u{11AF}", - nfkc: "\u{D26C}", - nfkd: "\u{1110}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{D26D}", - nfc: "\u{D26D}", - nfd: "\u{1110}\u{1170}\u{11B0}", - nfkc: "\u{D26D}", - nfkd: "\u{1110}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{D26E}", - nfc: "\u{D26E}", - nfd: "\u{1110}\u{1170}\u{11B1}", - nfkc: "\u{D26E}", - nfkd: "\u{1110}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{D26F}", - nfc: "\u{D26F}", - nfd: "\u{1110}\u{1170}\u{11B2}", - nfkc: "\u{D26F}", - nfkd: "\u{1110}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{D270}", - nfc: "\u{D270}", - nfd: "\u{1110}\u{1170}\u{11B3}", - nfkc: "\u{D270}", - nfkd: "\u{1110}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{D271}", - nfc: "\u{D271}", - nfd: "\u{1110}\u{1170}\u{11B4}", - nfkc: "\u{D271}", - nfkd: "\u{1110}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{D272}", - nfc: "\u{D272}", - nfd: "\u{1110}\u{1170}\u{11B5}", - nfkc: "\u{D272}", - nfkd: "\u{1110}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{D273}", - nfc: "\u{D273}", - nfd: "\u{1110}\u{1170}\u{11B6}", - nfkc: "\u{D273}", - nfkd: "\u{1110}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{D274}", - nfc: "\u{D274}", - nfd: "\u{1110}\u{1170}\u{11B7}", - nfkc: "\u{D274}", - nfkd: "\u{1110}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{D275}", - nfc: "\u{D275}", - nfd: "\u{1110}\u{1170}\u{11B8}", - nfkc: "\u{D275}", - nfkd: "\u{1110}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{D276}", - nfc: "\u{D276}", - nfd: "\u{1110}\u{1170}\u{11B9}", - nfkc: "\u{D276}", - nfkd: "\u{1110}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{D277}", - nfc: "\u{D277}", - nfd: "\u{1110}\u{1170}\u{11BA}", - nfkc: "\u{D277}", - nfkd: "\u{1110}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{D278}", - nfc: "\u{D278}", - nfd: "\u{1110}\u{1170}\u{11BB}", - nfkc: "\u{D278}", - nfkd: "\u{1110}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{D279}", - nfc: "\u{D279}", - nfd: "\u{1110}\u{1170}\u{11BC}", - nfkc: "\u{D279}", - nfkd: "\u{1110}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{D27A}", - nfc: "\u{D27A}", - nfd: "\u{1110}\u{1170}\u{11BD}", - nfkc: "\u{D27A}", - nfkd: "\u{1110}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{D27B}", - nfc: "\u{D27B}", - nfd: "\u{1110}\u{1170}\u{11BE}", - nfkc: "\u{D27B}", - nfkd: "\u{1110}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{D27C}", - nfc: "\u{D27C}", - nfd: "\u{1110}\u{1170}\u{11BF}", - nfkc: "\u{D27C}", - nfkd: "\u{1110}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{D27D}", - nfc: "\u{D27D}", - nfd: "\u{1110}\u{1170}\u{11C0}", - nfkc: "\u{D27D}", - nfkd: "\u{1110}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{D27E}", - nfc: "\u{D27E}", - nfd: "\u{1110}\u{1170}\u{11C1}", - nfkc: "\u{D27E}", - nfkd: "\u{1110}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{D27F}", - nfc: "\u{D27F}", - nfd: "\u{1110}\u{1170}\u{11C2}", - nfkc: "\u{D27F}", - nfkd: "\u{1110}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{D280}", - nfc: "\u{D280}", - nfd: "\u{1110}\u{1171}", - nfkc: "\u{D280}", - nfkd: "\u{1110}\u{1171}", - }, - NormalizationTest { - source: "\u{D281}", - nfc: "\u{D281}", - nfd: "\u{1110}\u{1171}\u{11A8}", - nfkc: "\u{D281}", - nfkd: "\u{1110}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{D282}", - nfc: "\u{D282}", - nfd: "\u{1110}\u{1171}\u{11A9}", - nfkc: "\u{D282}", - nfkd: "\u{1110}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{D283}", - nfc: "\u{D283}", - nfd: "\u{1110}\u{1171}\u{11AA}", - nfkc: "\u{D283}", - nfkd: "\u{1110}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{D284}", - nfc: "\u{D284}", - nfd: "\u{1110}\u{1171}\u{11AB}", - nfkc: "\u{D284}", - nfkd: "\u{1110}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{D285}", - nfc: "\u{D285}", - nfd: "\u{1110}\u{1171}\u{11AC}", - nfkc: "\u{D285}", - nfkd: "\u{1110}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{D286}", - nfc: "\u{D286}", - nfd: "\u{1110}\u{1171}\u{11AD}", - nfkc: "\u{D286}", - nfkd: "\u{1110}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{D287}", - nfc: "\u{D287}", - nfd: "\u{1110}\u{1171}\u{11AE}", - nfkc: "\u{D287}", - nfkd: "\u{1110}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{D288}", - nfc: "\u{D288}", - nfd: "\u{1110}\u{1171}\u{11AF}", - nfkc: "\u{D288}", - nfkd: "\u{1110}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{D289}", - nfc: "\u{D289}", - nfd: "\u{1110}\u{1171}\u{11B0}", - nfkc: "\u{D289}", - nfkd: "\u{1110}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{D28A}", - nfc: "\u{D28A}", - nfd: "\u{1110}\u{1171}\u{11B1}", - nfkc: "\u{D28A}", - nfkd: "\u{1110}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{D28B}", - nfc: "\u{D28B}", - nfd: "\u{1110}\u{1171}\u{11B2}", - nfkc: "\u{D28B}", - nfkd: "\u{1110}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{D28C}", - nfc: "\u{D28C}", - nfd: "\u{1110}\u{1171}\u{11B3}", - nfkc: "\u{D28C}", - nfkd: "\u{1110}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{D28D}", - nfc: "\u{D28D}", - nfd: "\u{1110}\u{1171}\u{11B4}", - nfkc: "\u{D28D}", - nfkd: "\u{1110}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{D28E}", - nfc: "\u{D28E}", - nfd: "\u{1110}\u{1171}\u{11B5}", - nfkc: "\u{D28E}", - nfkd: "\u{1110}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{D28F}", - nfc: "\u{D28F}", - nfd: "\u{1110}\u{1171}\u{11B6}", - nfkc: "\u{D28F}", - nfkd: "\u{1110}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{D290}", - nfc: "\u{D290}", - nfd: "\u{1110}\u{1171}\u{11B7}", - nfkc: "\u{D290}", - nfkd: "\u{1110}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{D291}", - nfc: "\u{D291}", - nfd: "\u{1110}\u{1171}\u{11B8}", - nfkc: "\u{D291}", - nfkd: "\u{1110}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{D292}", - nfc: "\u{D292}", - nfd: "\u{1110}\u{1171}\u{11B9}", - nfkc: "\u{D292}", - nfkd: "\u{1110}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{D293}", - nfc: "\u{D293}", - nfd: "\u{1110}\u{1171}\u{11BA}", - nfkc: "\u{D293}", - nfkd: "\u{1110}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{D294}", - nfc: "\u{D294}", - nfd: "\u{1110}\u{1171}\u{11BB}", - nfkc: "\u{D294}", - nfkd: "\u{1110}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{D295}", - nfc: "\u{D295}", - nfd: "\u{1110}\u{1171}\u{11BC}", - nfkc: "\u{D295}", - nfkd: "\u{1110}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{D296}", - nfc: "\u{D296}", - nfd: "\u{1110}\u{1171}\u{11BD}", - nfkc: "\u{D296}", - nfkd: "\u{1110}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{D297}", - nfc: "\u{D297}", - nfd: "\u{1110}\u{1171}\u{11BE}", - nfkc: "\u{D297}", - nfkd: "\u{1110}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{D298}", - nfc: "\u{D298}", - nfd: "\u{1110}\u{1171}\u{11BF}", - nfkc: "\u{D298}", - nfkd: "\u{1110}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{D299}", - nfc: "\u{D299}", - nfd: "\u{1110}\u{1171}\u{11C0}", - nfkc: "\u{D299}", - nfkd: "\u{1110}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{D29A}", - nfc: "\u{D29A}", - nfd: "\u{1110}\u{1171}\u{11C1}", - nfkc: "\u{D29A}", - nfkd: "\u{1110}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{D29B}", - nfc: "\u{D29B}", - nfd: "\u{1110}\u{1171}\u{11C2}", - nfkc: "\u{D29B}", - nfkd: "\u{1110}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{D29C}", - nfc: "\u{D29C}", - nfd: "\u{1110}\u{1172}", - nfkc: "\u{D29C}", - nfkd: "\u{1110}\u{1172}", - }, - NormalizationTest { - source: "\u{D29D}", - nfc: "\u{D29D}", - nfd: "\u{1110}\u{1172}\u{11A8}", - nfkc: "\u{D29D}", - nfkd: "\u{1110}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{D29E}", - nfc: "\u{D29E}", - nfd: "\u{1110}\u{1172}\u{11A9}", - nfkc: "\u{D29E}", - nfkd: "\u{1110}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{D29F}", - nfc: "\u{D29F}", - nfd: "\u{1110}\u{1172}\u{11AA}", - nfkc: "\u{D29F}", - nfkd: "\u{1110}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{D2A0}", - nfc: "\u{D2A0}", - nfd: "\u{1110}\u{1172}\u{11AB}", - nfkc: "\u{D2A0}", - nfkd: "\u{1110}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{D2A1}", - nfc: "\u{D2A1}", - nfd: "\u{1110}\u{1172}\u{11AC}", - nfkc: "\u{D2A1}", - nfkd: "\u{1110}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{D2A2}", - nfc: "\u{D2A2}", - nfd: "\u{1110}\u{1172}\u{11AD}", - nfkc: "\u{D2A2}", - nfkd: "\u{1110}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{D2A3}", - nfc: "\u{D2A3}", - nfd: "\u{1110}\u{1172}\u{11AE}", - nfkc: "\u{D2A3}", - nfkd: "\u{1110}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{D2A4}", - nfc: "\u{D2A4}", - nfd: "\u{1110}\u{1172}\u{11AF}", - nfkc: "\u{D2A4}", - nfkd: "\u{1110}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{D2A5}", - nfc: "\u{D2A5}", - nfd: "\u{1110}\u{1172}\u{11B0}", - nfkc: "\u{D2A5}", - nfkd: "\u{1110}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{D2A6}", - nfc: "\u{D2A6}", - nfd: "\u{1110}\u{1172}\u{11B1}", - nfkc: "\u{D2A6}", - nfkd: "\u{1110}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{D2A7}", - nfc: "\u{D2A7}", - nfd: "\u{1110}\u{1172}\u{11B2}", - nfkc: "\u{D2A7}", - nfkd: "\u{1110}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{D2A8}", - nfc: "\u{D2A8}", - nfd: "\u{1110}\u{1172}\u{11B3}", - nfkc: "\u{D2A8}", - nfkd: "\u{1110}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{D2A9}", - nfc: "\u{D2A9}", - nfd: "\u{1110}\u{1172}\u{11B4}", - nfkc: "\u{D2A9}", - nfkd: "\u{1110}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{D2AA}", - nfc: "\u{D2AA}", - nfd: "\u{1110}\u{1172}\u{11B5}", - nfkc: "\u{D2AA}", - nfkd: "\u{1110}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{D2AB}", - nfc: "\u{D2AB}", - nfd: "\u{1110}\u{1172}\u{11B6}", - nfkc: "\u{D2AB}", - nfkd: "\u{1110}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{D2AC}", - nfc: "\u{D2AC}", - nfd: "\u{1110}\u{1172}\u{11B7}", - nfkc: "\u{D2AC}", - nfkd: "\u{1110}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{D2AD}", - nfc: "\u{D2AD}", - nfd: "\u{1110}\u{1172}\u{11B8}", - nfkc: "\u{D2AD}", - nfkd: "\u{1110}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{D2AE}", - nfc: "\u{D2AE}", - nfd: "\u{1110}\u{1172}\u{11B9}", - nfkc: "\u{D2AE}", - nfkd: "\u{1110}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{D2AF}", - nfc: "\u{D2AF}", - nfd: "\u{1110}\u{1172}\u{11BA}", - nfkc: "\u{D2AF}", - nfkd: "\u{1110}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{D2B0}", - nfc: "\u{D2B0}", - nfd: "\u{1110}\u{1172}\u{11BB}", - nfkc: "\u{D2B0}", - nfkd: "\u{1110}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{D2B1}", - nfc: "\u{D2B1}", - nfd: "\u{1110}\u{1172}\u{11BC}", - nfkc: "\u{D2B1}", - nfkd: "\u{1110}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{D2B2}", - nfc: "\u{D2B2}", - nfd: "\u{1110}\u{1172}\u{11BD}", - nfkc: "\u{D2B2}", - nfkd: "\u{1110}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{D2B3}", - nfc: "\u{D2B3}", - nfd: "\u{1110}\u{1172}\u{11BE}", - nfkc: "\u{D2B3}", - nfkd: "\u{1110}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{D2B4}", - nfc: "\u{D2B4}", - nfd: "\u{1110}\u{1172}\u{11BF}", - nfkc: "\u{D2B4}", - nfkd: "\u{1110}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{D2B5}", - nfc: "\u{D2B5}", - nfd: "\u{1110}\u{1172}\u{11C0}", - nfkc: "\u{D2B5}", - nfkd: "\u{1110}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{D2B6}", - nfc: "\u{D2B6}", - nfd: "\u{1110}\u{1172}\u{11C1}", - nfkc: "\u{D2B6}", - nfkd: "\u{1110}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{D2B7}", - nfc: "\u{D2B7}", - nfd: "\u{1110}\u{1172}\u{11C2}", - nfkc: "\u{D2B7}", - nfkd: "\u{1110}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{D2B8}", - nfc: "\u{D2B8}", - nfd: "\u{1110}\u{1173}", - nfkc: "\u{D2B8}", - nfkd: "\u{1110}\u{1173}", - }, - NormalizationTest { - source: "\u{D2B9}", - nfc: "\u{D2B9}", - nfd: "\u{1110}\u{1173}\u{11A8}", - nfkc: "\u{D2B9}", - nfkd: "\u{1110}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{D2BA}", - nfc: "\u{D2BA}", - nfd: "\u{1110}\u{1173}\u{11A9}", - nfkc: "\u{D2BA}", - nfkd: "\u{1110}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{D2BB}", - nfc: "\u{D2BB}", - nfd: "\u{1110}\u{1173}\u{11AA}", - nfkc: "\u{D2BB}", - nfkd: "\u{1110}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{D2BC}", - nfc: "\u{D2BC}", - nfd: "\u{1110}\u{1173}\u{11AB}", - nfkc: "\u{D2BC}", - nfkd: "\u{1110}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{D2BD}", - nfc: "\u{D2BD}", - nfd: "\u{1110}\u{1173}\u{11AC}", - nfkc: "\u{D2BD}", - nfkd: "\u{1110}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{D2BE}", - nfc: "\u{D2BE}", - nfd: "\u{1110}\u{1173}\u{11AD}", - nfkc: "\u{D2BE}", - nfkd: "\u{1110}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{D2BF}", - nfc: "\u{D2BF}", - nfd: "\u{1110}\u{1173}\u{11AE}", - nfkc: "\u{D2BF}", - nfkd: "\u{1110}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{D2C0}", - nfc: "\u{D2C0}", - nfd: "\u{1110}\u{1173}\u{11AF}", - nfkc: "\u{D2C0}", - nfkd: "\u{1110}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{D2C1}", - nfc: "\u{D2C1}", - nfd: "\u{1110}\u{1173}\u{11B0}", - nfkc: "\u{D2C1}", - nfkd: "\u{1110}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{D2C2}", - nfc: "\u{D2C2}", - nfd: "\u{1110}\u{1173}\u{11B1}", - nfkc: "\u{D2C2}", - nfkd: "\u{1110}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{D2C3}", - nfc: "\u{D2C3}", - nfd: "\u{1110}\u{1173}\u{11B2}", - nfkc: "\u{D2C3}", - nfkd: "\u{1110}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{D2C4}", - nfc: "\u{D2C4}", - nfd: "\u{1110}\u{1173}\u{11B3}", - nfkc: "\u{D2C4}", - nfkd: "\u{1110}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{D2C5}", - nfc: "\u{D2C5}", - nfd: "\u{1110}\u{1173}\u{11B4}", - nfkc: "\u{D2C5}", - nfkd: "\u{1110}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{D2C6}", - nfc: "\u{D2C6}", - nfd: "\u{1110}\u{1173}\u{11B5}", - nfkc: "\u{D2C6}", - nfkd: "\u{1110}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{D2C7}", - nfc: "\u{D2C7}", - nfd: "\u{1110}\u{1173}\u{11B6}", - nfkc: "\u{D2C7}", - nfkd: "\u{1110}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{D2C8}", - nfc: "\u{D2C8}", - nfd: "\u{1110}\u{1173}\u{11B7}", - nfkc: "\u{D2C8}", - nfkd: "\u{1110}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{D2C9}", - nfc: "\u{D2C9}", - nfd: "\u{1110}\u{1173}\u{11B8}", - nfkc: "\u{D2C9}", - nfkd: "\u{1110}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{D2CA}", - nfc: "\u{D2CA}", - nfd: "\u{1110}\u{1173}\u{11B9}", - nfkc: "\u{D2CA}", - nfkd: "\u{1110}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{D2CB}", - nfc: "\u{D2CB}", - nfd: "\u{1110}\u{1173}\u{11BA}", - nfkc: "\u{D2CB}", - nfkd: "\u{1110}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{D2CC}", - nfc: "\u{D2CC}", - nfd: "\u{1110}\u{1173}\u{11BB}", - nfkc: "\u{D2CC}", - nfkd: "\u{1110}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{D2CD}", - nfc: "\u{D2CD}", - nfd: "\u{1110}\u{1173}\u{11BC}", - nfkc: "\u{D2CD}", - nfkd: "\u{1110}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{D2CE}", - nfc: "\u{D2CE}", - nfd: "\u{1110}\u{1173}\u{11BD}", - nfkc: "\u{D2CE}", - nfkd: "\u{1110}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{D2CF}", - nfc: "\u{D2CF}", - nfd: "\u{1110}\u{1173}\u{11BE}", - nfkc: "\u{D2CF}", - nfkd: "\u{1110}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{D2D0}", - nfc: "\u{D2D0}", - nfd: "\u{1110}\u{1173}\u{11BF}", - nfkc: "\u{D2D0}", - nfkd: "\u{1110}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{D2D1}", - nfc: "\u{D2D1}", - nfd: "\u{1110}\u{1173}\u{11C0}", - nfkc: "\u{D2D1}", - nfkd: "\u{1110}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{D2D2}", - nfc: "\u{D2D2}", - nfd: "\u{1110}\u{1173}\u{11C1}", - nfkc: "\u{D2D2}", - nfkd: "\u{1110}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{D2D3}", - nfc: "\u{D2D3}", - nfd: "\u{1110}\u{1173}\u{11C2}", - nfkc: "\u{D2D3}", - nfkd: "\u{1110}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{D2D4}", - nfc: "\u{D2D4}", - nfd: "\u{1110}\u{1174}", - nfkc: "\u{D2D4}", - nfkd: "\u{1110}\u{1174}", - }, - NormalizationTest { - source: "\u{D2D5}", - nfc: "\u{D2D5}", - nfd: "\u{1110}\u{1174}\u{11A8}", - nfkc: "\u{D2D5}", - nfkd: "\u{1110}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{D2D6}", - nfc: "\u{D2D6}", - nfd: "\u{1110}\u{1174}\u{11A9}", - nfkc: "\u{D2D6}", - nfkd: "\u{1110}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{D2D7}", - nfc: "\u{D2D7}", - nfd: "\u{1110}\u{1174}\u{11AA}", - nfkc: "\u{D2D7}", - nfkd: "\u{1110}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{D2D8}", - nfc: "\u{D2D8}", - nfd: "\u{1110}\u{1174}\u{11AB}", - nfkc: "\u{D2D8}", - nfkd: "\u{1110}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{D2D9}", - nfc: "\u{D2D9}", - nfd: "\u{1110}\u{1174}\u{11AC}", - nfkc: "\u{D2D9}", - nfkd: "\u{1110}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{D2DA}", - nfc: "\u{D2DA}", - nfd: "\u{1110}\u{1174}\u{11AD}", - nfkc: "\u{D2DA}", - nfkd: "\u{1110}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{D2DB}", - nfc: "\u{D2DB}", - nfd: "\u{1110}\u{1174}\u{11AE}", - nfkc: "\u{D2DB}", - nfkd: "\u{1110}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{D2DC}", - nfc: "\u{D2DC}", - nfd: "\u{1110}\u{1174}\u{11AF}", - nfkc: "\u{D2DC}", - nfkd: "\u{1110}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{D2DD}", - nfc: "\u{D2DD}", - nfd: "\u{1110}\u{1174}\u{11B0}", - nfkc: "\u{D2DD}", - nfkd: "\u{1110}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{D2DE}", - nfc: "\u{D2DE}", - nfd: "\u{1110}\u{1174}\u{11B1}", - nfkc: "\u{D2DE}", - nfkd: "\u{1110}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{D2DF}", - nfc: "\u{D2DF}", - nfd: "\u{1110}\u{1174}\u{11B2}", - nfkc: "\u{D2DF}", - nfkd: "\u{1110}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{D2E0}", - nfc: "\u{D2E0}", - nfd: "\u{1110}\u{1174}\u{11B3}", - nfkc: "\u{D2E0}", - nfkd: "\u{1110}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{D2E1}", - nfc: "\u{D2E1}", - nfd: "\u{1110}\u{1174}\u{11B4}", - nfkc: "\u{D2E1}", - nfkd: "\u{1110}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{D2E2}", - nfc: "\u{D2E2}", - nfd: "\u{1110}\u{1174}\u{11B5}", - nfkc: "\u{D2E2}", - nfkd: "\u{1110}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{D2E3}", - nfc: "\u{D2E3}", - nfd: "\u{1110}\u{1174}\u{11B6}", - nfkc: "\u{D2E3}", - nfkd: "\u{1110}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{D2E4}", - nfc: "\u{D2E4}", - nfd: "\u{1110}\u{1174}\u{11B7}", - nfkc: "\u{D2E4}", - nfkd: "\u{1110}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{D2E5}", - nfc: "\u{D2E5}", - nfd: "\u{1110}\u{1174}\u{11B8}", - nfkc: "\u{D2E5}", - nfkd: "\u{1110}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{D2E6}", - nfc: "\u{D2E6}", - nfd: "\u{1110}\u{1174}\u{11B9}", - nfkc: "\u{D2E6}", - nfkd: "\u{1110}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{D2E7}", - nfc: "\u{D2E7}", - nfd: "\u{1110}\u{1174}\u{11BA}", - nfkc: "\u{D2E7}", - nfkd: "\u{1110}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{D2E8}", - nfc: "\u{D2E8}", - nfd: "\u{1110}\u{1174}\u{11BB}", - nfkc: "\u{D2E8}", - nfkd: "\u{1110}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{D2E9}", - nfc: "\u{D2E9}", - nfd: "\u{1110}\u{1174}\u{11BC}", - nfkc: "\u{D2E9}", - nfkd: "\u{1110}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{D2EA}", - nfc: "\u{D2EA}", - nfd: "\u{1110}\u{1174}\u{11BD}", - nfkc: "\u{D2EA}", - nfkd: "\u{1110}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{D2EB}", - nfc: "\u{D2EB}", - nfd: "\u{1110}\u{1174}\u{11BE}", - nfkc: "\u{D2EB}", - nfkd: "\u{1110}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{D2EC}", - nfc: "\u{D2EC}", - nfd: "\u{1110}\u{1174}\u{11BF}", - nfkc: "\u{D2EC}", - nfkd: "\u{1110}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{D2ED}", - nfc: "\u{D2ED}", - nfd: "\u{1110}\u{1174}\u{11C0}", - nfkc: "\u{D2ED}", - nfkd: "\u{1110}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{D2EE}", - nfc: "\u{D2EE}", - nfd: "\u{1110}\u{1174}\u{11C1}", - nfkc: "\u{D2EE}", - nfkd: "\u{1110}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{D2EF}", - nfc: "\u{D2EF}", - nfd: "\u{1110}\u{1174}\u{11C2}", - nfkc: "\u{D2EF}", - nfkd: "\u{1110}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{D2F0}", - nfc: "\u{D2F0}", - nfd: "\u{1110}\u{1175}", - nfkc: "\u{D2F0}", - nfkd: "\u{1110}\u{1175}", - }, - NormalizationTest { - source: "\u{D2F1}", - nfc: "\u{D2F1}", - nfd: "\u{1110}\u{1175}\u{11A8}", - nfkc: "\u{D2F1}", - nfkd: "\u{1110}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{D2F2}", - nfc: "\u{D2F2}", - nfd: "\u{1110}\u{1175}\u{11A9}", - nfkc: "\u{D2F2}", - nfkd: "\u{1110}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{D2F3}", - nfc: "\u{D2F3}", - nfd: "\u{1110}\u{1175}\u{11AA}", - nfkc: "\u{D2F3}", - nfkd: "\u{1110}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{D2F4}", - nfc: "\u{D2F4}", - nfd: "\u{1110}\u{1175}\u{11AB}", - nfkc: "\u{D2F4}", - nfkd: "\u{1110}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{D2F5}", - nfc: "\u{D2F5}", - nfd: "\u{1110}\u{1175}\u{11AC}", - nfkc: "\u{D2F5}", - nfkd: "\u{1110}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{D2F6}", - nfc: "\u{D2F6}", - nfd: "\u{1110}\u{1175}\u{11AD}", - nfkc: "\u{D2F6}", - nfkd: "\u{1110}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{D2F7}", - nfc: "\u{D2F7}", - nfd: "\u{1110}\u{1175}\u{11AE}", - nfkc: "\u{D2F7}", - nfkd: "\u{1110}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{D2F8}", - nfc: "\u{D2F8}", - nfd: "\u{1110}\u{1175}\u{11AF}", - nfkc: "\u{D2F8}", - nfkd: "\u{1110}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{D2F9}", - nfc: "\u{D2F9}", - nfd: "\u{1110}\u{1175}\u{11B0}", - nfkc: "\u{D2F9}", - nfkd: "\u{1110}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{D2FA}", - nfc: "\u{D2FA}", - nfd: "\u{1110}\u{1175}\u{11B1}", - nfkc: "\u{D2FA}", - nfkd: "\u{1110}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{D2FB}", - nfc: "\u{D2FB}", - nfd: "\u{1110}\u{1175}\u{11B2}", - nfkc: "\u{D2FB}", - nfkd: "\u{1110}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{D2FC}", - nfc: "\u{D2FC}", - nfd: "\u{1110}\u{1175}\u{11B3}", - nfkc: "\u{D2FC}", - nfkd: "\u{1110}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{D2FD}", - nfc: "\u{D2FD}", - nfd: "\u{1110}\u{1175}\u{11B4}", - nfkc: "\u{D2FD}", - nfkd: "\u{1110}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{D2FE}", - nfc: "\u{D2FE}", - nfd: "\u{1110}\u{1175}\u{11B5}", - nfkc: "\u{D2FE}", - nfkd: "\u{1110}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{D2FF}", - nfc: "\u{D2FF}", - nfd: "\u{1110}\u{1175}\u{11B6}", - nfkc: "\u{D2FF}", - nfkd: "\u{1110}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{D300}", - nfc: "\u{D300}", - nfd: "\u{1110}\u{1175}\u{11B7}", - nfkc: "\u{D300}", - nfkd: "\u{1110}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{D301}", - nfc: "\u{D301}", - nfd: "\u{1110}\u{1175}\u{11B8}", - nfkc: "\u{D301}", - nfkd: "\u{1110}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{D302}", - nfc: "\u{D302}", - nfd: "\u{1110}\u{1175}\u{11B9}", - nfkc: "\u{D302}", - nfkd: "\u{1110}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{D303}", - nfc: "\u{D303}", - nfd: "\u{1110}\u{1175}\u{11BA}", - nfkc: "\u{D303}", - nfkd: "\u{1110}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{D304}", - nfc: "\u{D304}", - nfd: "\u{1110}\u{1175}\u{11BB}", - nfkc: "\u{D304}", - nfkd: "\u{1110}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{D305}", - nfc: "\u{D305}", - nfd: "\u{1110}\u{1175}\u{11BC}", - nfkc: "\u{D305}", - nfkd: "\u{1110}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{D306}", - nfc: "\u{D306}", - nfd: "\u{1110}\u{1175}\u{11BD}", - nfkc: "\u{D306}", - nfkd: "\u{1110}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{D307}", - nfc: "\u{D307}", - nfd: "\u{1110}\u{1175}\u{11BE}", - nfkc: "\u{D307}", - nfkd: "\u{1110}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{D308}", - nfc: "\u{D308}", - nfd: "\u{1110}\u{1175}\u{11BF}", - nfkc: "\u{D308}", - nfkd: "\u{1110}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{D309}", - nfc: "\u{D309}", - nfd: "\u{1110}\u{1175}\u{11C0}", - nfkc: "\u{D309}", - nfkd: "\u{1110}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{D30A}", - nfc: "\u{D30A}", - nfd: "\u{1110}\u{1175}\u{11C1}", - nfkc: "\u{D30A}", - nfkd: "\u{1110}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{D30B}", - nfc: "\u{D30B}", - nfd: "\u{1110}\u{1175}\u{11C2}", - nfkc: "\u{D30B}", - nfkd: "\u{1110}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{D30C}", - nfc: "\u{D30C}", - nfd: "\u{1111}\u{1161}", - nfkc: "\u{D30C}", - nfkd: "\u{1111}\u{1161}", - }, - NormalizationTest { - source: "\u{D30D}", - nfc: "\u{D30D}", - nfd: "\u{1111}\u{1161}\u{11A8}", - nfkc: "\u{D30D}", - nfkd: "\u{1111}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{D30E}", - nfc: "\u{D30E}", - nfd: "\u{1111}\u{1161}\u{11A9}", - nfkc: "\u{D30E}", - nfkd: "\u{1111}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{D30F}", - nfc: "\u{D30F}", - nfd: "\u{1111}\u{1161}\u{11AA}", - nfkc: "\u{D30F}", - nfkd: "\u{1111}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{D310}", - nfc: "\u{D310}", - nfd: "\u{1111}\u{1161}\u{11AB}", - nfkc: "\u{D310}", - nfkd: "\u{1111}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{D311}", - nfc: "\u{D311}", - nfd: "\u{1111}\u{1161}\u{11AC}", - nfkc: "\u{D311}", - nfkd: "\u{1111}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{D312}", - nfc: "\u{D312}", - nfd: "\u{1111}\u{1161}\u{11AD}", - nfkc: "\u{D312}", - nfkd: "\u{1111}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{D313}", - nfc: "\u{D313}", - nfd: "\u{1111}\u{1161}\u{11AE}", - nfkc: "\u{D313}", - nfkd: "\u{1111}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{D314}", - nfc: "\u{D314}", - nfd: "\u{1111}\u{1161}\u{11AF}", - nfkc: "\u{D314}", - nfkd: "\u{1111}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{D315}", - nfc: "\u{D315}", - nfd: "\u{1111}\u{1161}\u{11B0}", - nfkc: "\u{D315}", - nfkd: "\u{1111}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{D316}", - nfc: "\u{D316}", - nfd: "\u{1111}\u{1161}\u{11B1}", - nfkc: "\u{D316}", - nfkd: "\u{1111}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{D317}", - nfc: "\u{D317}", - nfd: "\u{1111}\u{1161}\u{11B2}", - nfkc: "\u{D317}", - nfkd: "\u{1111}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{D318}", - nfc: "\u{D318}", - nfd: "\u{1111}\u{1161}\u{11B3}", - nfkc: "\u{D318}", - nfkd: "\u{1111}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{D319}", - nfc: "\u{D319}", - nfd: "\u{1111}\u{1161}\u{11B4}", - nfkc: "\u{D319}", - nfkd: "\u{1111}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{D31A}", - nfc: "\u{D31A}", - nfd: "\u{1111}\u{1161}\u{11B5}", - nfkc: "\u{D31A}", - nfkd: "\u{1111}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{D31B}", - nfc: "\u{D31B}", - nfd: "\u{1111}\u{1161}\u{11B6}", - nfkc: "\u{D31B}", - nfkd: "\u{1111}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{D31C}", - nfc: "\u{D31C}", - nfd: "\u{1111}\u{1161}\u{11B7}", - nfkc: "\u{D31C}", - nfkd: "\u{1111}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{D31D}", - nfc: "\u{D31D}", - nfd: "\u{1111}\u{1161}\u{11B8}", - nfkc: "\u{D31D}", - nfkd: "\u{1111}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{D31E}", - nfc: "\u{D31E}", - nfd: "\u{1111}\u{1161}\u{11B9}", - nfkc: "\u{D31E}", - nfkd: "\u{1111}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{D31F}", - nfc: "\u{D31F}", - nfd: "\u{1111}\u{1161}\u{11BA}", - nfkc: "\u{D31F}", - nfkd: "\u{1111}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{D320}", - nfc: "\u{D320}", - nfd: "\u{1111}\u{1161}\u{11BB}", - nfkc: "\u{D320}", - nfkd: "\u{1111}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{D321}", - nfc: "\u{D321}", - nfd: "\u{1111}\u{1161}\u{11BC}", - nfkc: "\u{D321}", - nfkd: "\u{1111}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{D322}", - nfc: "\u{D322}", - nfd: "\u{1111}\u{1161}\u{11BD}", - nfkc: "\u{D322}", - nfkd: "\u{1111}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{D323}", - nfc: "\u{D323}", - nfd: "\u{1111}\u{1161}\u{11BE}", - nfkc: "\u{D323}", - nfkd: "\u{1111}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{D324}", - nfc: "\u{D324}", - nfd: "\u{1111}\u{1161}\u{11BF}", - nfkc: "\u{D324}", - nfkd: "\u{1111}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{D325}", - nfc: "\u{D325}", - nfd: "\u{1111}\u{1161}\u{11C0}", - nfkc: "\u{D325}", - nfkd: "\u{1111}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{D326}", - nfc: "\u{D326}", - nfd: "\u{1111}\u{1161}\u{11C1}", - nfkc: "\u{D326}", - nfkd: "\u{1111}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{D327}", - nfc: "\u{D327}", - nfd: "\u{1111}\u{1161}\u{11C2}", - nfkc: "\u{D327}", - nfkd: "\u{1111}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{D328}", - nfc: "\u{D328}", - nfd: "\u{1111}\u{1162}", - nfkc: "\u{D328}", - nfkd: "\u{1111}\u{1162}", - }, - NormalizationTest { - source: "\u{D329}", - nfc: "\u{D329}", - nfd: "\u{1111}\u{1162}\u{11A8}", - nfkc: "\u{D329}", - nfkd: "\u{1111}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{D32A}", - nfc: "\u{D32A}", - nfd: "\u{1111}\u{1162}\u{11A9}", - nfkc: "\u{D32A}", - nfkd: "\u{1111}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{D32B}", - nfc: "\u{D32B}", - nfd: "\u{1111}\u{1162}\u{11AA}", - nfkc: "\u{D32B}", - nfkd: "\u{1111}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{D32C}", - nfc: "\u{D32C}", - nfd: "\u{1111}\u{1162}\u{11AB}", - nfkc: "\u{D32C}", - nfkd: "\u{1111}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{D32D}", - nfc: "\u{D32D}", - nfd: "\u{1111}\u{1162}\u{11AC}", - nfkc: "\u{D32D}", - nfkd: "\u{1111}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{D32E}", - nfc: "\u{D32E}", - nfd: "\u{1111}\u{1162}\u{11AD}", - nfkc: "\u{D32E}", - nfkd: "\u{1111}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{D32F}", - nfc: "\u{D32F}", - nfd: "\u{1111}\u{1162}\u{11AE}", - nfkc: "\u{D32F}", - nfkd: "\u{1111}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{D330}", - nfc: "\u{D330}", - nfd: "\u{1111}\u{1162}\u{11AF}", - nfkc: "\u{D330}", - nfkd: "\u{1111}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{D331}", - nfc: "\u{D331}", - nfd: "\u{1111}\u{1162}\u{11B0}", - nfkc: "\u{D331}", - nfkd: "\u{1111}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{D332}", - nfc: "\u{D332}", - nfd: "\u{1111}\u{1162}\u{11B1}", - nfkc: "\u{D332}", - nfkd: "\u{1111}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{D333}", - nfc: "\u{D333}", - nfd: "\u{1111}\u{1162}\u{11B2}", - nfkc: "\u{D333}", - nfkd: "\u{1111}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{D334}", - nfc: "\u{D334}", - nfd: "\u{1111}\u{1162}\u{11B3}", - nfkc: "\u{D334}", - nfkd: "\u{1111}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{D335}", - nfc: "\u{D335}", - nfd: "\u{1111}\u{1162}\u{11B4}", - nfkc: "\u{D335}", - nfkd: "\u{1111}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{D336}", - nfc: "\u{D336}", - nfd: "\u{1111}\u{1162}\u{11B5}", - nfkc: "\u{D336}", - nfkd: "\u{1111}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{D337}", - nfc: "\u{D337}", - nfd: "\u{1111}\u{1162}\u{11B6}", - nfkc: "\u{D337}", - nfkd: "\u{1111}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{D338}", - nfc: "\u{D338}", - nfd: "\u{1111}\u{1162}\u{11B7}", - nfkc: "\u{D338}", - nfkd: "\u{1111}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{D339}", - nfc: "\u{D339}", - nfd: "\u{1111}\u{1162}\u{11B8}", - nfkc: "\u{D339}", - nfkd: "\u{1111}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{D33A}", - nfc: "\u{D33A}", - nfd: "\u{1111}\u{1162}\u{11B9}", - nfkc: "\u{D33A}", - nfkd: "\u{1111}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{D33B}", - nfc: "\u{D33B}", - nfd: "\u{1111}\u{1162}\u{11BA}", - nfkc: "\u{D33B}", - nfkd: "\u{1111}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{D33C}", - nfc: "\u{D33C}", - nfd: "\u{1111}\u{1162}\u{11BB}", - nfkc: "\u{D33C}", - nfkd: "\u{1111}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{D33D}", - nfc: "\u{D33D}", - nfd: "\u{1111}\u{1162}\u{11BC}", - nfkc: "\u{D33D}", - nfkd: "\u{1111}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{D33E}", - nfc: "\u{D33E}", - nfd: "\u{1111}\u{1162}\u{11BD}", - nfkc: "\u{D33E}", - nfkd: "\u{1111}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{D33F}", - nfc: "\u{D33F}", - nfd: "\u{1111}\u{1162}\u{11BE}", - nfkc: "\u{D33F}", - nfkd: "\u{1111}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{D340}", - nfc: "\u{D340}", - nfd: "\u{1111}\u{1162}\u{11BF}", - nfkc: "\u{D340}", - nfkd: "\u{1111}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{D341}", - nfc: "\u{D341}", - nfd: "\u{1111}\u{1162}\u{11C0}", - nfkc: "\u{D341}", - nfkd: "\u{1111}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{D342}", - nfc: "\u{D342}", - nfd: "\u{1111}\u{1162}\u{11C1}", - nfkc: "\u{D342}", - nfkd: "\u{1111}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{D343}", - nfc: "\u{D343}", - nfd: "\u{1111}\u{1162}\u{11C2}", - nfkc: "\u{D343}", - nfkd: "\u{1111}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{D344}", - nfc: "\u{D344}", - nfd: "\u{1111}\u{1163}", - nfkc: "\u{D344}", - nfkd: "\u{1111}\u{1163}", - }, - NormalizationTest { - source: "\u{D345}", - nfc: "\u{D345}", - nfd: "\u{1111}\u{1163}\u{11A8}", - nfkc: "\u{D345}", - nfkd: "\u{1111}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{D346}", - nfc: "\u{D346}", - nfd: "\u{1111}\u{1163}\u{11A9}", - nfkc: "\u{D346}", - nfkd: "\u{1111}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{D347}", - nfc: "\u{D347}", - nfd: "\u{1111}\u{1163}\u{11AA}", - nfkc: "\u{D347}", - nfkd: "\u{1111}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{D348}", - nfc: "\u{D348}", - nfd: "\u{1111}\u{1163}\u{11AB}", - nfkc: "\u{D348}", - nfkd: "\u{1111}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{D349}", - nfc: "\u{D349}", - nfd: "\u{1111}\u{1163}\u{11AC}", - nfkc: "\u{D349}", - nfkd: "\u{1111}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{D34A}", - nfc: "\u{D34A}", - nfd: "\u{1111}\u{1163}\u{11AD}", - nfkc: "\u{D34A}", - nfkd: "\u{1111}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{D34B}", - nfc: "\u{D34B}", - nfd: "\u{1111}\u{1163}\u{11AE}", - nfkc: "\u{D34B}", - nfkd: "\u{1111}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{D34C}", - nfc: "\u{D34C}", - nfd: "\u{1111}\u{1163}\u{11AF}", - nfkc: "\u{D34C}", - nfkd: "\u{1111}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{D34D}", - nfc: "\u{D34D}", - nfd: "\u{1111}\u{1163}\u{11B0}", - nfkc: "\u{D34D}", - nfkd: "\u{1111}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{D34E}", - nfc: "\u{D34E}", - nfd: "\u{1111}\u{1163}\u{11B1}", - nfkc: "\u{D34E}", - nfkd: "\u{1111}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{D34F}", - nfc: "\u{D34F}", - nfd: "\u{1111}\u{1163}\u{11B2}", - nfkc: "\u{D34F}", - nfkd: "\u{1111}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{D350}", - nfc: "\u{D350}", - nfd: "\u{1111}\u{1163}\u{11B3}", - nfkc: "\u{D350}", - nfkd: "\u{1111}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{D351}", - nfc: "\u{D351}", - nfd: "\u{1111}\u{1163}\u{11B4}", - nfkc: "\u{D351}", - nfkd: "\u{1111}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{D352}", - nfc: "\u{D352}", - nfd: "\u{1111}\u{1163}\u{11B5}", - nfkc: "\u{D352}", - nfkd: "\u{1111}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{D353}", - nfc: "\u{D353}", - nfd: "\u{1111}\u{1163}\u{11B6}", - nfkc: "\u{D353}", - nfkd: "\u{1111}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{D354}", - nfc: "\u{D354}", - nfd: "\u{1111}\u{1163}\u{11B7}", - nfkc: "\u{D354}", - nfkd: "\u{1111}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{D355}", - nfc: "\u{D355}", - nfd: "\u{1111}\u{1163}\u{11B8}", - nfkc: "\u{D355}", - nfkd: "\u{1111}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{D356}", - nfc: "\u{D356}", - nfd: "\u{1111}\u{1163}\u{11B9}", - nfkc: "\u{D356}", - nfkd: "\u{1111}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{D357}", - nfc: "\u{D357}", - nfd: "\u{1111}\u{1163}\u{11BA}", - nfkc: "\u{D357}", - nfkd: "\u{1111}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{D358}", - nfc: "\u{D358}", - nfd: "\u{1111}\u{1163}\u{11BB}", - nfkc: "\u{D358}", - nfkd: "\u{1111}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{D359}", - nfc: "\u{D359}", - nfd: "\u{1111}\u{1163}\u{11BC}", - nfkc: "\u{D359}", - nfkd: "\u{1111}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{D35A}", - nfc: "\u{D35A}", - nfd: "\u{1111}\u{1163}\u{11BD}", - nfkc: "\u{D35A}", - nfkd: "\u{1111}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{D35B}", - nfc: "\u{D35B}", - nfd: "\u{1111}\u{1163}\u{11BE}", - nfkc: "\u{D35B}", - nfkd: "\u{1111}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{D35C}", - nfc: "\u{D35C}", - nfd: "\u{1111}\u{1163}\u{11BF}", - nfkc: "\u{D35C}", - nfkd: "\u{1111}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{D35D}", - nfc: "\u{D35D}", - nfd: "\u{1111}\u{1163}\u{11C0}", - nfkc: "\u{D35D}", - nfkd: "\u{1111}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{D35E}", - nfc: "\u{D35E}", - nfd: "\u{1111}\u{1163}\u{11C1}", - nfkc: "\u{D35E}", - nfkd: "\u{1111}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{D35F}", - nfc: "\u{D35F}", - nfd: "\u{1111}\u{1163}\u{11C2}", - nfkc: "\u{D35F}", - nfkd: "\u{1111}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{D360}", - nfc: "\u{D360}", - nfd: "\u{1111}\u{1164}", - nfkc: "\u{D360}", - nfkd: "\u{1111}\u{1164}", - }, - NormalizationTest { - source: "\u{D361}", - nfc: "\u{D361}", - nfd: "\u{1111}\u{1164}\u{11A8}", - nfkc: "\u{D361}", - nfkd: "\u{1111}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{D362}", - nfc: "\u{D362}", - nfd: "\u{1111}\u{1164}\u{11A9}", - nfkc: "\u{D362}", - nfkd: "\u{1111}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{D363}", - nfc: "\u{D363}", - nfd: "\u{1111}\u{1164}\u{11AA}", - nfkc: "\u{D363}", - nfkd: "\u{1111}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{D364}", - nfc: "\u{D364}", - nfd: "\u{1111}\u{1164}\u{11AB}", - nfkc: "\u{D364}", - nfkd: "\u{1111}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{D365}", - nfc: "\u{D365}", - nfd: "\u{1111}\u{1164}\u{11AC}", - nfkc: "\u{D365}", - nfkd: "\u{1111}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{D366}", - nfc: "\u{D366}", - nfd: "\u{1111}\u{1164}\u{11AD}", - nfkc: "\u{D366}", - nfkd: "\u{1111}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{D367}", - nfc: "\u{D367}", - nfd: "\u{1111}\u{1164}\u{11AE}", - nfkc: "\u{D367}", - nfkd: "\u{1111}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{D368}", - nfc: "\u{D368}", - nfd: "\u{1111}\u{1164}\u{11AF}", - nfkc: "\u{D368}", - nfkd: "\u{1111}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{D369}", - nfc: "\u{D369}", - nfd: "\u{1111}\u{1164}\u{11B0}", - nfkc: "\u{D369}", - nfkd: "\u{1111}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{D36A}", - nfc: "\u{D36A}", - nfd: "\u{1111}\u{1164}\u{11B1}", - nfkc: "\u{D36A}", - nfkd: "\u{1111}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{D36B}", - nfc: "\u{D36B}", - nfd: "\u{1111}\u{1164}\u{11B2}", - nfkc: "\u{D36B}", - nfkd: "\u{1111}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{D36C}", - nfc: "\u{D36C}", - nfd: "\u{1111}\u{1164}\u{11B3}", - nfkc: "\u{D36C}", - nfkd: "\u{1111}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{D36D}", - nfc: "\u{D36D}", - nfd: "\u{1111}\u{1164}\u{11B4}", - nfkc: "\u{D36D}", - nfkd: "\u{1111}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{D36E}", - nfc: "\u{D36E}", - nfd: "\u{1111}\u{1164}\u{11B5}", - nfkc: "\u{D36E}", - nfkd: "\u{1111}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{D36F}", - nfc: "\u{D36F}", - nfd: "\u{1111}\u{1164}\u{11B6}", - nfkc: "\u{D36F}", - nfkd: "\u{1111}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{D370}", - nfc: "\u{D370}", - nfd: "\u{1111}\u{1164}\u{11B7}", - nfkc: "\u{D370}", - nfkd: "\u{1111}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{D371}", - nfc: "\u{D371}", - nfd: "\u{1111}\u{1164}\u{11B8}", - nfkc: "\u{D371}", - nfkd: "\u{1111}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{D372}", - nfc: "\u{D372}", - nfd: "\u{1111}\u{1164}\u{11B9}", - nfkc: "\u{D372}", - nfkd: "\u{1111}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{D373}", - nfc: "\u{D373}", - nfd: "\u{1111}\u{1164}\u{11BA}", - nfkc: "\u{D373}", - nfkd: "\u{1111}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{D374}", - nfc: "\u{D374}", - nfd: "\u{1111}\u{1164}\u{11BB}", - nfkc: "\u{D374}", - nfkd: "\u{1111}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{D375}", - nfc: "\u{D375}", - nfd: "\u{1111}\u{1164}\u{11BC}", - nfkc: "\u{D375}", - nfkd: "\u{1111}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{D376}", - nfc: "\u{D376}", - nfd: "\u{1111}\u{1164}\u{11BD}", - nfkc: "\u{D376}", - nfkd: "\u{1111}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{D377}", - nfc: "\u{D377}", - nfd: "\u{1111}\u{1164}\u{11BE}", - nfkc: "\u{D377}", - nfkd: "\u{1111}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{D378}", - nfc: "\u{D378}", - nfd: "\u{1111}\u{1164}\u{11BF}", - nfkc: "\u{D378}", - nfkd: "\u{1111}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{D379}", - nfc: "\u{D379}", - nfd: "\u{1111}\u{1164}\u{11C0}", - nfkc: "\u{D379}", - nfkd: "\u{1111}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{D37A}", - nfc: "\u{D37A}", - nfd: "\u{1111}\u{1164}\u{11C1}", - nfkc: "\u{D37A}", - nfkd: "\u{1111}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{D37B}", - nfc: "\u{D37B}", - nfd: "\u{1111}\u{1164}\u{11C2}", - nfkc: "\u{D37B}", - nfkd: "\u{1111}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{D37C}", - nfc: "\u{D37C}", - nfd: "\u{1111}\u{1165}", - nfkc: "\u{D37C}", - nfkd: "\u{1111}\u{1165}", - }, - NormalizationTest { - source: "\u{D37D}", - nfc: "\u{D37D}", - nfd: "\u{1111}\u{1165}\u{11A8}", - nfkc: "\u{D37D}", - nfkd: "\u{1111}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{D37E}", - nfc: "\u{D37E}", - nfd: "\u{1111}\u{1165}\u{11A9}", - nfkc: "\u{D37E}", - nfkd: "\u{1111}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{D37F}", - nfc: "\u{D37F}", - nfd: "\u{1111}\u{1165}\u{11AA}", - nfkc: "\u{D37F}", - nfkd: "\u{1111}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{D380}", - nfc: "\u{D380}", - nfd: "\u{1111}\u{1165}\u{11AB}", - nfkc: "\u{D380}", - nfkd: "\u{1111}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{D381}", - nfc: "\u{D381}", - nfd: "\u{1111}\u{1165}\u{11AC}", - nfkc: "\u{D381}", - nfkd: "\u{1111}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{D382}", - nfc: "\u{D382}", - nfd: "\u{1111}\u{1165}\u{11AD}", - nfkc: "\u{D382}", - nfkd: "\u{1111}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{D383}", - nfc: "\u{D383}", - nfd: "\u{1111}\u{1165}\u{11AE}", - nfkc: "\u{D383}", - nfkd: "\u{1111}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{D384}", - nfc: "\u{D384}", - nfd: "\u{1111}\u{1165}\u{11AF}", - nfkc: "\u{D384}", - nfkd: "\u{1111}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{D385}", - nfc: "\u{D385}", - nfd: "\u{1111}\u{1165}\u{11B0}", - nfkc: "\u{D385}", - nfkd: "\u{1111}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{D386}", - nfc: "\u{D386}", - nfd: "\u{1111}\u{1165}\u{11B1}", - nfkc: "\u{D386}", - nfkd: "\u{1111}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{D387}", - nfc: "\u{D387}", - nfd: "\u{1111}\u{1165}\u{11B2}", - nfkc: "\u{D387}", - nfkd: "\u{1111}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{D388}", - nfc: "\u{D388}", - nfd: "\u{1111}\u{1165}\u{11B3}", - nfkc: "\u{D388}", - nfkd: "\u{1111}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{D389}", - nfc: "\u{D389}", - nfd: "\u{1111}\u{1165}\u{11B4}", - nfkc: "\u{D389}", - nfkd: "\u{1111}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{D38A}", - nfc: "\u{D38A}", - nfd: "\u{1111}\u{1165}\u{11B5}", - nfkc: "\u{D38A}", - nfkd: "\u{1111}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{D38B}", - nfc: "\u{D38B}", - nfd: "\u{1111}\u{1165}\u{11B6}", - nfkc: "\u{D38B}", - nfkd: "\u{1111}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{D38C}", - nfc: "\u{D38C}", - nfd: "\u{1111}\u{1165}\u{11B7}", - nfkc: "\u{D38C}", - nfkd: "\u{1111}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{D38D}", - nfc: "\u{D38D}", - nfd: "\u{1111}\u{1165}\u{11B8}", - nfkc: "\u{D38D}", - nfkd: "\u{1111}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{D38E}", - nfc: "\u{D38E}", - nfd: "\u{1111}\u{1165}\u{11B9}", - nfkc: "\u{D38E}", - nfkd: "\u{1111}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{D38F}", - nfc: "\u{D38F}", - nfd: "\u{1111}\u{1165}\u{11BA}", - nfkc: "\u{D38F}", - nfkd: "\u{1111}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{D390}", - nfc: "\u{D390}", - nfd: "\u{1111}\u{1165}\u{11BB}", - nfkc: "\u{D390}", - nfkd: "\u{1111}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{D391}", - nfc: "\u{D391}", - nfd: "\u{1111}\u{1165}\u{11BC}", - nfkc: "\u{D391}", - nfkd: "\u{1111}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{D392}", - nfc: "\u{D392}", - nfd: "\u{1111}\u{1165}\u{11BD}", - nfkc: "\u{D392}", - nfkd: "\u{1111}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{D393}", - nfc: "\u{D393}", - nfd: "\u{1111}\u{1165}\u{11BE}", - nfkc: "\u{D393}", - nfkd: "\u{1111}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{D394}", - nfc: "\u{D394}", - nfd: "\u{1111}\u{1165}\u{11BF}", - nfkc: "\u{D394}", - nfkd: "\u{1111}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{D395}", - nfc: "\u{D395}", - nfd: "\u{1111}\u{1165}\u{11C0}", - nfkc: "\u{D395}", - nfkd: "\u{1111}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{D396}", - nfc: "\u{D396}", - nfd: "\u{1111}\u{1165}\u{11C1}", - nfkc: "\u{D396}", - nfkd: "\u{1111}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{D397}", - nfc: "\u{D397}", - nfd: "\u{1111}\u{1165}\u{11C2}", - nfkc: "\u{D397}", - nfkd: "\u{1111}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{D398}", - nfc: "\u{D398}", - nfd: "\u{1111}\u{1166}", - nfkc: "\u{D398}", - nfkd: "\u{1111}\u{1166}", - }, - NormalizationTest { - source: "\u{D399}", - nfc: "\u{D399}", - nfd: "\u{1111}\u{1166}\u{11A8}", - nfkc: "\u{D399}", - nfkd: "\u{1111}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{D39A}", - nfc: "\u{D39A}", - nfd: "\u{1111}\u{1166}\u{11A9}", - nfkc: "\u{D39A}", - nfkd: "\u{1111}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{D39B}", - nfc: "\u{D39B}", - nfd: "\u{1111}\u{1166}\u{11AA}", - nfkc: "\u{D39B}", - nfkd: "\u{1111}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{D39C}", - nfc: "\u{D39C}", - nfd: "\u{1111}\u{1166}\u{11AB}", - nfkc: "\u{D39C}", - nfkd: "\u{1111}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{D39D}", - nfc: "\u{D39D}", - nfd: "\u{1111}\u{1166}\u{11AC}", - nfkc: "\u{D39D}", - nfkd: "\u{1111}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{D39E}", - nfc: "\u{D39E}", - nfd: "\u{1111}\u{1166}\u{11AD}", - nfkc: "\u{D39E}", - nfkd: "\u{1111}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{D39F}", - nfc: "\u{D39F}", - nfd: "\u{1111}\u{1166}\u{11AE}", - nfkc: "\u{D39F}", - nfkd: "\u{1111}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{D3A0}", - nfc: "\u{D3A0}", - nfd: "\u{1111}\u{1166}\u{11AF}", - nfkc: "\u{D3A0}", - nfkd: "\u{1111}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{D3A1}", - nfc: "\u{D3A1}", - nfd: "\u{1111}\u{1166}\u{11B0}", - nfkc: "\u{D3A1}", - nfkd: "\u{1111}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{D3A2}", - nfc: "\u{D3A2}", - nfd: "\u{1111}\u{1166}\u{11B1}", - nfkc: "\u{D3A2}", - nfkd: "\u{1111}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{D3A3}", - nfc: "\u{D3A3}", - nfd: "\u{1111}\u{1166}\u{11B2}", - nfkc: "\u{D3A3}", - nfkd: "\u{1111}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{D3A4}", - nfc: "\u{D3A4}", - nfd: "\u{1111}\u{1166}\u{11B3}", - nfkc: "\u{D3A4}", - nfkd: "\u{1111}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{D3A5}", - nfc: "\u{D3A5}", - nfd: "\u{1111}\u{1166}\u{11B4}", - nfkc: "\u{D3A5}", - nfkd: "\u{1111}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{D3A6}", - nfc: "\u{D3A6}", - nfd: "\u{1111}\u{1166}\u{11B5}", - nfkc: "\u{D3A6}", - nfkd: "\u{1111}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{D3A7}", - nfc: "\u{D3A7}", - nfd: "\u{1111}\u{1166}\u{11B6}", - nfkc: "\u{D3A7}", - nfkd: "\u{1111}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{D3A8}", - nfc: "\u{D3A8}", - nfd: "\u{1111}\u{1166}\u{11B7}", - nfkc: "\u{D3A8}", - nfkd: "\u{1111}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{D3A9}", - nfc: "\u{D3A9}", - nfd: "\u{1111}\u{1166}\u{11B8}", - nfkc: "\u{D3A9}", - nfkd: "\u{1111}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{D3AA}", - nfc: "\u{D3AA}", - nfd: "\u{1111}\u{1166}\u{11B9}", - nfkc: "\u{D3AA}", - nfkd: "\u{1111}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{D3AB}", - nfc: "\u{D3AB}", - nfd: "\u{1111}\u{1166}\u{11BA}", - nfkc: "\u{D3AB}", - nfkd: "\u{1111}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{D3AC}", - nfc: "\u{D3AC}", - nfd: "\u{1111}\u{1166}\u{11BB}", - nfkc: "\u{D3AC}", - nfkd: "\u{1111}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{D3AD}", - nfc: "\u{D3AD}", - nfd: "\u{1111}\u{1166}\u{11BC}", - nfkc: "\u{D3AD}", - nfkd: "\u{1111}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{D3AE}", - nfc: "\u{D3AE}", - nfd: "\u{1111}\u{1166}\u{11BD}", - nfkc: "\u{D3AE}", - nfkd: "\u{1111}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{D3AF}", - nfc: "\u{D3AF}", - nfd: "\u{1111}\u{1166}\u{11BE}", - nfkc: "\u{D3AF}", - nfkd: "\u{1111}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{D3B0}", - nfc: "\u{D3B0}", - nfd: "\u{1111}\u{1166}\u{11BF}", - nfkc: "\u{D3B0}", - nfkd: "\u{1111}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{D3B1}", - nfc: "\u{D3B1}", - nfd: "\u{1111}\u{1166}\u{11C0}", - nfkc: "\u{D3B1}", - nfkd: "\u{1111}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{D3B2}", - nfc: "\u{D3B2}", - nfd: "\u{1111}\u{1166}\u{11C1}", - nfkc: "\u{D3B2}", - nfkd: "\u{1111}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{D3B3}", - nfc: "\u{D3B3}", - nfd: "\u{1111}\u{1166}\u{11C2}", - nfkc: "\u{D3B3}", - nfkd: "\u{1111}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{D3B4}", - nfc: "\u{D3B4}", - nfd: "\u{1111}\u{1167}", - nfkc: "\u{D3B4}", - nfkd: "\u{1111}\u{1167}", - }, - NormalizationTest { - source: "\u{D3B5}", - nfc: "\u{D3B5}", - nfd: "\u{1111}\u{1167}\u{11A8}", - nfkc: "\u{D3B5}", - nfkd: "\u{1111}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{D3B6}", - nfc: "\u{D3B6}", - nfd: "\u{1111}\u{1167}\u{11A9}", - nfkc: "\u{D3B6}", - nfkd: "\u{1111}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{D3B7}", - nfc: "\u{D3B7}", - nfd: "\u{1111}\u{1167}\u{11AA}", - nfkc: "\u{D3B7}", - nfkd: "\u{1111}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{D3B8}", - nfc: "\u{D3B8}", - nfd: "\u{1111}\u{1167}\u{11AB}", - nfkc: "\u{D3B8}", - nfkd: "\u{1111}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{D3B9}", - nfc: "\u{D3B9}", - nfd: "\u{1111}\u{1167}\u{11AC}", - nfkc: "\u{D3B9}", - nfkd: "\u{1111}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{D3BA}", - nfc: "\u{D3BA}", - nfd: "\u{1111}\u{1167}\u{11AD}", - nfkc: "\u{D3BA}", - nfkd: "\u{1111}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{D3BB}", - nfc: "\u{D3BB}", - nfd: "\u{1111}\u{1167}\u{11AE}", - nfkc: "\u{D3BB}", - nfkd: "\u{1111}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{D3BC}", - nfc: "\u{D3BC}", - nfd: "\u{1111}\u{1167}\u{11AF}", - nfkc: "\u{D3BC}", - nfkd: "\u{1111}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{D3BD}", - nfc: "\u{D3BD}", - nfd: "\u{1111}\u{1167}\u{11B0}", - nfkc: "\u{D3BD}", - nfkd: "\u{1111}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{D3BE}", - nfc: "\u{D3BE}", - nfd: "\u{1111}\u{1167}\u{11B1}", - nfkc: "\u{D3BE}", - nfkd: "\u{1111}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{D3BF}", - nfc: "\u{D3BF}", - nfd: "\u{1111}\u{1167}\u{11B2}", - nfkc: "\u{D3BF}", - nfkd: "\u{1111}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{D3C0}", - nfc: "\u{D3C0}", - nfd: "\u{1111}\u{1167}\u{11B3}", - nfkc: "\u{D3C0}", - nfkd: "\u{1111}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{D3C1}", - nfc: "\u{D3C1}", - nfd: "\u{1111}\u{1167}\u{11B4}", - nfkc: "\u{D3C1}", - nfkd: "\u{1111}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{D3C2}", - nfc: "\u{D3C2}", - nfd: "\u{1111}\u{1167}\u{11B5}", - nfkc: "\u{D3C2}", - nfkd: "\u{1111}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{D3C3}", - nfc: "\u{D3C3}", - nfd: "\u{1111}\u{1167}\u{11B6}", - nfkc: "\u{D3C3}", - nfkd: "\u{1111}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{D3C4}", - nfc: "\u{D3C4}", - nfd: "\u{1111}\u{1167}\u{11B7}", - nfkc: "\u{D3C4}", - nfkd: "\u{1111}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{D3C5}", - nfc: "\u{D3C5}", - nfd: "\u{1111}\u{1167}\u{11B8}", - nfkc: "\u{D3C5}", - nfkd: "\u{1111}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{D3C6}", - nfc: "\u{D3C6}", - nfd: "\u{1111}\u{1167}\u{11B9}", - nfkc: "\u{D3C6}", - nfkd: "\u{1111}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{D3C7}", - nfc: "\u{D3C7}", - nfd: "\u{1111}\u{1167}\u{11BA}", - nfkc: "\u{D3C7}", - nfkd: "\u{1111}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{D3C8}", - nfc: "\u{D3C8}", - nfd: "\u{1111}\u{1167}\u{11BB}", - nfkc: "\u{D3C8}", - nfkd: "\u{1111}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{D3C9}", - nfc: "\u{D3C9}", - nfd: "\u{1111}\u{1167}\u{11BC}", - nfkc: "\u{D3C9}", - nfkd: "\u{1111}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{D3CA}", - nfc: "\u{D3CA}", - nfd: "\u{1111}\u{1167}\u{11BD}", - nfkc: "\u{D3CA}", - nfkd: "\u{1111}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{D3CB}", - nfc: "\u{D3CB}", - nfd: "\u{1111}\u{1167}\u{11BE}", - nfkc: "\u{D3CB}", - nfkd: "\u{1111}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{D3CC}", - nfc: "\u{D3CC}", - nfd: "\u{1111}\u{1167}\u{11BF}", - nfkc: "\u{D3CC}", - nfkd: "\u{1111}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{D3CD}", - nfc: "\u{D3CD}", - nfd: "\u{1111}\u{1167}\u{11C0}", - nfkc: "\u{D3CD}", - nfkd: "\u{1111}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{D3CE}", - nfc: "\u{D3CE}", - nfd: "\u{1111}\u{1167}\u{11C1}", - nfkc: "\u{D3CE}", - nfkd: "\u{1111}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{D3CF}", - nfc: "\u{D3CF}", - nfd: "\u{1111}\u{1167}\u{11C2}", - nfkc: "\u{D3CF}", - nfkd: "\u{1111}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{D3D0}", - nfc: "\u{D3D0}", - nfd: "\u{1111}\u{1168}", - nfkc: "\u{D3D0}", - nfkd: "\u{1111}\u{1168}", - }, - NormalizationTest { - source: "\u{D3D1}", - nfc: "\u{D3D1}", - nfd: "\u{1111}\u{1168}\u{11A8}", - nfkc: "\u{D3D1}", - nfkd: "\u{1111}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{D3D2}", - nfc: "\u{D3D2}", - nfd: "\u{1111}\u{1168}\u{11A9}", - nfkc: "\u{D3D2}", - nfkd: "\u{1111}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{D3D3}", - nfc: "\u{D3D3}", - nfd: "\u{1111}\u{1168}\u{11AA}", - nfkc: "\u{D3D3}", - nfkd: "\u{1111}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{D3D4}", - nfc: "\u{D3D4}", - nfd: "\u{1111}\u{1168}\u{11AB}", - nfkc: "\u{D3D4}", - nfkd: "\u{1111}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{D3D5}", - nfc: "\u{D3D5}", - nfd: "\u{1111}\u{1168}\u{11AC}", - nfkc: "\u{D3D5}", - nfkd: "\u{1111}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{D3D6}", - nfc: "\u{D3D6}", - nfd: "\u{1111}\u{1168}\u{11AD}", - nfkc: "\u{D3D6}", - nfkd: "\u{1111}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{D3D7}", - nfc: "\u{D3D7}", - nfd: "\u{1111}\u{1168}\u{11AE}", - nfkc: "\u{D3D7}", - nfkd: "\u{1111}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{D3D8}", - nfc: "\u{D3D8}", - nfd: "\u{1111}\u{1168}\u{11AF}", - nfkc: "\u{D3D8}", - nfkd: "\u{1111}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{D3D9}", - nfc: "\u{D3D9}", - nfd: "\u{1111}\u{1168}\u{11B0}", - nfkc: "\u{D3D9}", - nfkd: "\u{1111}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{D3DA}", - nfc: "\u{D3DA}", - nfd: "\u{1111}\u{1168}\u{11B1}", - nfkc: "\u{D3DA}", - nfkd: "\u{1111}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{D3DB}", - nfc: "\u{D3DB}", - nfd: "\u{1111}\u{1168}\u{11B2}", - nfkc: "\u{D3DB}", - nfkd: "\u{1111}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{D3DC}", - nfc: "\u{D3DC}", - nfd: "\u{1111}\u{1168}\u{11B3}", - nfkc: "\u{D3DC}", - nfkd: "\u{1111}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{D3DD}", - nfc: "\u{D3DD}", - nfd: "\u{1111}\u{1168}\u{11B4}", - nfkc: "\u{D3DD}", - nfkd: "\u{1111}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{D3DE}", - nfc: "\u{D3DE}", - nfd: "\u{1111}\u{1168}\u{11B5}", - nfkc: "\u{D3DE}", - nfkd: "\u{1111}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{D3DF}", - nfc: "\u{D3DF}", - nfd: "\u{1111}\u{1168}\u{11B6}", - nfkc: "\u{D3DF}", - nfkd: "\u{1111}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{D3E0}", - nfc: "\u{D3E0}", - nfd: "\u{1111}\u{1168}\u{11B7}", - nfkc: "\u{D3E0}", - nfkd: "\u{1111}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{D3E1}", - nfc: "\u{D3E1}", - nfd: "\u{1111}\u{1168}\u{11B8}", - nfkc: "\u{D3E1}", - nfkd: "\u{1111}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{D3E2}", - nfc: "\u{D3E2}", - nfd: "\u{1111}\u{1168}\u{11B9}", - nfkc: "\u{D3E2}", - nfkd: "\u{1111}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{D3E3}", - nfc: "\u{D3E3}", - nfd: "\u{1111}\u{1168}\u{11BA}", - nfkc: "\u{D3E3}", - nfkd: "\u{1111}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{D3E4}", - nfc: "\u{D3E4}", - nfd: "\u{1111}\u{1168}\u{11BB}", - nfkc: "\u{D3E4}", - nfkd: "\u{1111}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{D3E5}", - nfc: "\u{D3E5}", - nfd: "\u{1111}\u{1168}\u{11BC}", - nfkc: "\u{D3E5}", - nfkd: "\u{1111}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{D3E6}", - nfc: "\u{D3E6}", - nfd: "\u{1111}\u{1168}\u{11BD}", - nfkc: "\u{D3E6}", - nfkd: "\u{1111}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{D3E7}", - nfc: "\u{D3E7}", - nfd: "\u{1111}\u{1168}\u{11BE}", - nfkc: "\u{D3E7}", - nfkd: "\u{1111}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{D3E8}", - nfc: "\u{D3E8}", - nfd: "\u{1111}\u{1168}\u{11BF}", - nfkc: "\u{D3E8}", - nfkd: "\u{1111}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{D3E9}", - nfc: "\u{D3E9}", - nfd: "\u{1111}\u{1168}\u{11C0}", - nfkc: "\u{D3E9}", - nfkd: "\u{1111}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{D3EA}", - nfc: "\u{D3EA}", - nfd: "\u{1111}\u{1168}\u{11C1}", - nfkc: "\u{D3EA}", - nfkd: "\u{1111}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{D3EB}", - nfc: "\u{D3EB}", - nfd: "\u{1111}\u{1168}\u{11C2}", - nfkc: "\u{D3EB}", - nfkd: "\u{1111}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{D3EC}", - nfc: "\u{D3EC}", - nfd: "\u{1111}\u{1169}", - nfkc: "\u{D3EC}", - nfkd: "\u{1111}\u{1169}", - }, - NormalizationTest { - source: "\u{D3ED}", - nfc: "\u{D3ED}", - nfd: "\u{1111}\u{1169}\u{11A8}", - nfkc: "\u{D3ED}", - nfkd: "\u{1111}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{D3EE}", - nfc: "\u{D3EE}", - nfd: "\u{1111}\u{1169}\u{11A9}", - nfkc: "\u{D3EE}", - nfkd: "\u{1111}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{D3EF}", - nfc: "\u{D3EF}", - nfd: "\u{1111}\u{1169}\u{11AA}", - nfkc: "\u{D3EF}", - nfkd: "\u{1111}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{D3F0}", - nfc: "\u{D3F0}", - nfd: "\u{1111}\u{1169}\u{11AB}", - nfkc: "\u{D3F0}", - nfkd: "\u{1111}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{D3F1}", - nfc: "\u{D3F1}", - nfd: "\u{1111}\u{1169}\u{11AC}", - nfkc: "\u{D3F1}", - nfkd: "\u{1111}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{D3F2}", - nfc: "\u{D3F2}", - nfd: "\u{1111}\u{1169}\u{11AD}", - nfkc: "\u{D3F2}", - nfkd: "\u{1111}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{D3F3}", - nfc: "\u{D3F3}", - nfd: "\u{1111}\u{1169}\u{11AE}", - nfkc: "\u{D3F3}", - nfkd: "\u{1111}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{D3F4}", - nfc: "\u{D3F4}", - nfd: "\u{1111}\u{1169}\u{11AF}", - nfkc: "\u{D3F4}", - nfkd: "\u{1111}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{D3F5}", - nfc: "\u{D3F5}", - nfd: "\u{1111}\u{1169}\u{11B0}", - nfkc: "\u{D3F5}", - nfkd: "\u{1111}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{D3F6}", - nfc: "\u{D3F6}", - nfd: "\u{1111}\u{1169}\u{11B1}", - nfkc: "\u{D3F6}", - nfkd: "\u{1111}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{D3F7}", - nfc: "\u{D3F7}", - nfd: "\u{1111}\u{1169}\u{11B2}", - nfkc: "\u{D3F7}", - nfkd: "\u{1111}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{D3F8}", - nfc: "\u{D3F8}", - nfd: "\u{1111}\u{1169}\u{11B3}", - nfkc: "\u{D3F8}", - nfkd: "\u{1111}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{D3F9}", - nfc: "\u{D3F9}", - nfd: "\u{1111}\u{1169}\u{11B4}", - nfkc: "\u{D3F9}", - nfkd: "\u{1111}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{D3FA}", - nfc: "\u{D3FA}", - nfd: "\u{1111}\u{1169}\u{11B5}", - nfkc: "\u{D3FA}", - nfkd: "\u{1111}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{D3FB}", - nfc: "\u{D3FB}", - nfd: "\u{1111}\u{1169}\u{11B6}", - nfkc: "\u{D3FB}", - nfkd: "\u{1111}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{D3FC}", - nfc: "\u{D3FC}", - nfd: "\u{1111}\u{1169}\u{11B7}", - nfkc: "\u{D3FC}", - nfkd: "\u{1111}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{D3FD}", - nfc: "\u{D3FD}", - nfd: "\u{1111}\u{1169}\u{11B8}", - nfkc: "\u{D3FD}", - nfkd: "\u{1111}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{D3FE}", - nfc: "\u{D3FE}", - nfd: "\u{1111}\u{1169}\u{11B9}", - nfkc: "\u{D3FE}", - nfkd: "\u{1111}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{D3FF}", - nfc: "\u{D3FF}", - nfd: "\u{1111}\u{1169}\u{11BA}", - nfkc: "\u{D3FF}", - nfkd: "\u{1111}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{D400}", - nfc: "\u{D400}", - nfd: "\u{1111}\u{1169}\u{11BB}", - nfkc: "\u{D400}", - nfkd: "\u{1111}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{D401}", - nfc: "\u{D401}", - nfd: "\u{1111}\u{1169}\u{11BC}", - nfkc: "\u{D401}", - nfkd: "\u{1111}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{D402}", - nfc: "\u{D402}", - nfd: "\u{1111}\u{1169}\u{11BD}", - nfkc: "\u{D402}", - nfkd: "\u{1111}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{D403}", - nfc: "\u{D403}", - nfd: "\u{1111}\u{1169}\u{11BE}", - nfkc: "\u{D403}", - nfkd: "\u{1111}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{D404}", - nfc: "\u{D404}", - nfd: "\u{1111}\u{1169}\u{11BF}", - nfkc: "\u{D404}", - nfkd: "\u{1111}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{D405}", - nfc: "\u{D405}", - nfd: "\u{1111}\u{1169}\u{11C0}", - nfkc: "\u{D405}", - nfkd: "\u{1111}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{D406}", - nfc: "\u{D406}", - nfd: "\u{1111}\u{1169}\u{11C1}", - nfkc: "\u{D406}", - nfkd: "\u{1111}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{D407}", - nfc: "\u{D407}", - nfd: "\u{1111}\u{1169}\u{11C2}", - nfkc: "\u{D407}", - nfkd: "\u{1111}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{D408}", - nfc: "\u{D408}", - nfd: "\u{1111}\u{116A}", - nfkc: "\u{D408}", - nfkd: "\u{1111}\u{116A}", - }, - NormalizationTest { - source: "\u{D409}", - nfc: "\u{D409}", - nfd: "\u{1111}\u{116A}\u{11A8}", - nfkc: "\u{D409}", - nfkd: "\u{1111}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{D40A}", - nfc: "\u{D40A}", - nfd: "\u{1111}\u{116A}\u{11A9}", - nfkc: "\u{D40A}", - nfkd: "\u{1111}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{D40B}", - nfc: "\u{D40B}", - nfd: "\u{1111}\u{116A}\u{11AA}", - nfkc: "\u{D40B}", - nfkd: "\u{1111}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{D40C}", - nfc: "\u{D40C}", - nfd: "\u{1111}\u{116A}\u{11AB}", - nfkc: "\u{D40C}", - nfkd: "\u{1111}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{D40D}", - nfc: "\u{D40D}", - nfd: "\u{1111}\u{116A}\u{11AC}", - nfkc: "\u{D40D}", - nfkd: "\u{1111}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{D40E}", - nfc: "\u{D40E}", - nfd: "\u{1111}\u{116A}\u{11AD}", - nfkc: "\u{D40E}", - nfkd: "\u{1111}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{D40F}", - nfc: "\u{D40F}", - nfd: "\u{1111}\u{116A}\u{11AE}", - nfkc: "\u{D40F}", - nfkd: "\u{1111}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{D410}", - nfc: "\u{D410}", - nfd: "\u{1111}\u{116A}\u{11AF}", - nfkc: "\u{D410}", - nfkd: "\u{1111}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{D411}", - nfc: "\u{D411}", - nfd: "\u{1111}\u{116A}\u{11B0}", - nfkc: "\u{D411}", - nfkd: "\u{1111}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{D412}", - nfc: "\u{D412}", - nfd: "\u{1111}\u{116A}\u{11B1}", - nfkc: "\u{D412}", - nfkd: "\u{1111}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{D413}", - nfc: "\u{D413}", - nfd: "\u{1111}\u{116A}\u{11B2}", - nfkc: "\u{D413}", - nfkd: "\u{1111}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{D414}", - nfc: "\u{D414}", - nfd: "\u{1111}\u{116A}\u{11B3}", - nfkc: "\u{D414}", - nfkd: "\u{1111}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{D415}", - nfc: "\u{D415}", - nfd: "\u{1111}\u{116A}\u{11B4}", - nfkc: "\u{D415}", - nfkd: "\u{1111}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{D416}", - nfc: "\u{D416}", - nfd: "\u{1111}\u{116A}\u{11B5}", - nfkc: "\u{D416}", - nfkd: "\u{1111}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{D417}", - nfc: "\u{D417}", - nfd: "\u{1111}\u{116A}\u{11B6}", - nfkc: "\u{D417}", - nfkd: "\u{1111}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{D418}", - nfc: "\u{D418}", - nfd: "\u{1111}\u{116A}\u{11B7}", - nfkc: "\u{D418}", - nfkd: "\u{1111}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{D419}", - nfc: "\u{D419}", - nfd: "\u{1111}\u{116A}\u{11B8}", - nfkc: "\u{D419}", - nfkd: "\u{1111}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{D41A}", - nfc: "\u{D41A}", - nfd: "\u{1111}\u{116A}\u{11B9}", - nfkc: "\u{D41A}", - nfkd: "\u{1111}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{D41B}", - nfc: "\u{D41B}", - nfd: "\u{1111}\u{116A}\u{11BA}", - nfkc: "\u{D41B}", - nfkd: "\u{1111}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{D41C}", - nfc: "\u{D41C}", - nfd: "\u{1111}\u{116A}\u{11BB}", - nfkc: "\u{D41C}", - nfkd: "\u{1111}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{D41D}", - nfc: "\u{D41D}", - nfd: "\u{1111}\u{116A}\u{11BC}", - nfkc: "\u{D41D}", - nfkd: "\u{1111}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{D41E}", - nfc: "\u{D41E}", - nfd: "\u{1111}\u{116A}\u{11BD}", - nfkc: "\u{D41E}", - nfkd: "\u{1111}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{D41F}", - nfc: "\u{D41F}", - nfd: "\u{1111}\u{116A}\u{11BE}", - nfkc: "\u{D41F}", - nfkd: "\u{1111}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{D420}", - nfc: "\u{D420}", - nfd: "\u{1111}\u{116A}\u{11BF}", - nfkc: "\u{D420}", - nfkd: "\u{1111}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{D421}", - nfc: "\u{D421}", - nfd: "\u{1111}\u{116A}\u{11C0}", - nfkc: "\u{D421}", - nfkd: "\u{1111}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{D422}", - nfc: "\u{D422}", - nfd: "\u{1111}\u{116A}\u{11C1}", - nfkc: "\u{D422}", - nfkd: "\u{1111}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{D423}", - nfc: "\u{D423}", - nfd: "\u{1111}\u{116A}\u{11C2}", - nfkc: "\u{D423}", - nfkd: "\u{1111}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{D424}", - nfc: "\u{D424}", - nfd: "\u{1111}\u{116B}", - nfkc: "\u{D424}", - nfkd: "\u{1111}\u{116B}", - }, - NormalizationTest { - source: "\u{D425}", - nfc: "\u{D425}", - nfd: "\u{1111}\u{116B}\u{11A8}", - nfkc: "\u{D425}", - nfkd: "\u{1111}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{D426}", - nfc: "\u{D426}", - nfd: "\u{1111}\u{116B}\u{11A9}", - nfkc: "\u{D426}", - nfkd: "\u{1111}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{D427}", - nfc: "\u{D427}", - nfd: "\u{1111}\u{116B}\u{11AA}", - nfkc: "\u{D427}", - nfkd: "\u{1111}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{D428}", - nfc: "\u{D428}", - nfd: "\u{1111}\u{116B}\u{11AB}", - nfkc: "\u{D428}", - nfkd: "\u{1111}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{D429}", - nfc: "\u{D429}", - nfd: "\u{1111}\u{116B}\u{11AC}", - nfkc: "\u{D429}", - nfkd: "\u{1111}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{D42A}", - nfc: "\u{D42A}", - nfd: "\u{1111}\u{116B}\u{11AD}", - nfkc: "\u{D42A}", - nfkd: "\u{1111}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{D42B}", - nfc: "\u{D42B}", - nfd: "\u{1111}\u{116B}\u{11AE}", - nfkc: "\u{D42B}", - nfkd: "\u{1111}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{D42C}", - nfc: "\u{D42C}", - nfd: "\u{1111}\u{116B}\u{11AF}", - nfkc: "\u{D42C}", - nfkd: "\u{1111}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{D42D}", - nfc: "\u{D42D}", - nfd: "\u{1111}\u{116B}\u{11B0}", - nfkc: "\u{D42D}", - nfkd: "\u{1111}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{D42E}", - nfc: "\u{D42E}", - nfd: "\u{1111}\u{116B}\u{11B1}", - nfkc: "\u{D42E}", - nfkd: "\u{1111}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{D42F}", - nfc: "\u{D42F}", - nfd: "\u{1111}\u{116B}\u{11B2}", - nfkc: "\u{D42F}", - nfkd: "\u{1111}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{D430}", - nfc: "\u{D430}", - nfd: "\u{1111}\u{116B}\u{11B3}", - nfkc: "\u{D430}", - nfkd: "\u{1111}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{D431}", - nfc: "\u{D431}", - nfd: "\u{1111}\u{116B}\u{11B4}", - nfkc: "\u{D431}", - nfkd: "\u{1111}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{D432}", - nfc: "\u{D432}", - nfd: "\u{1111}\u{116B}\u{11B5}", - nfkc: "\u{D432}", - nfkd: "\u{1111}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{D433}", - nfc: "\u{D433}", - nfd: "\u{1111}\u{116B}\u{11B6}", - nfkc: "\u{D433}", - nfkd: "\u{1111}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{D434}", - nfc: "\u{D434}", - nfd: "\u{1111}\u{116B}\u{11B7}", - nfkc: "\u{D434}", - nfkd: "\u{1111}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{D435}", - nfc: "\u{D435}", - nfd: "\u{1111}\u{116B}\u{11B8}", - nfkc: "\u{D435}", - nfkd: "\u{1111}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{D436}", - nfc: "\u{D436}", - nfd: "\u{1111}\u{116B}\u{11B9}", - nfkc: "\u{D436}", - nfkd: "\u{1111}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{D437}", - nfc: "\u{D437}", - nfd: "\u{1111}\u{116B}\u{11BA}", - nfkc: "\u{D437}", - nfkd: "\u{1111}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{D438}", - nfc: "\u{D438}", - nfd: "\u{1111}\u{116B}\u{11BB}", - nfkc: "\u{D438}", - nfkd: "\u{1111}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{D439}", - nfc: "\u{D439}", - nfd: "\u{1111}\u{116B}\u{11BC}", - nfkc: "\u{D439}", - nfkd: "\u{1111}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{D43A}", - nfc: "\u{D43A}", - nfd: "\u{1111}\u{116B}\u{11BD}", - nfkc: "\u{D43A}", - nfkd: "\u{1111}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{D43B}", - nfc: "\u{D43B}", - nfd: "\u{1111}\u{116B}\u{11BE}", - nfkc: "\u{D43B}", - nfkd: "\u{1111}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{D43C}", - nfc: "\u{D43C}", - nfd: "\u{1111}\u{116B}\u{11BF}", - nfkc: "\u{D43C}", - nfkd: "\u{1111}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{D43D}", - nfc: "\u{D43D}", - nfd: "\u{1111}\u{116B}\u{11C0}", - nfkc: "\u{D43D}", - nfkd: "\u{1111}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{D43E}", - nfc: "\u{D43E}", - nfd: "\u{1111}\u{116B}\u{11C1}", - nfkc: "\u{D43E}", - nfkd: "\u{1111}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{D43F}", - nfc: "\u{D43F}", - nfd: "\u{1111}\u{116B}\u{11C2}", - nfkc: "\u{D43F}", - nfkd: "\u{1111}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{D440}", - nfc: "\u{D440}", - nfd: "\u{1111}\u{116C}", - nfkc: "\u{D440}", - nfkd: "\u{1111}\u{116C}", - }, - NormalizationTest { - source: "\u{D441}", - nfc: "\u{D441}", - nfd: "\u{1111}\u{116C}\u{11A8}", - nfkc: "\u{D441}", - nfkd: "\u{1111}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{D442}", - nfc: "\u{D442}", - nfd: "\u{1111}\u{116C}\u{11A9}", - nfkc: "\u{D442}", - nfkd: "\u{1111}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{D443}", - nfc: "\u{D443}", - nfd: "\u{1111}\u{116C}\u{11AA}", - nfkc: "\u{D443}", - nfkd: "\u{1111}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{D444}", - nfc: "\u{D444}", - nfd: "\u{1111}\u{116C}\u{11AB}", - nfkc: "\u{D444}", - nfkd: "\u{1111}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{D445}", - nfc: "\u{D445}", - nfd: "\u{1111}\u{116C}\u{11AC}", - nfkc: "\u{D445}", - nfkd: "\u{1111}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{D446}", - nfc: "\u{D446}", - nfd: "\u{1111}\u{116C}\u{11AD}", - nfkc: "\u{D446}", - nfkd: "\u{1111}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{D447}", - nfc: "\u{D447}", - nfd: "\u{1111}\u{116C}\u{11AE}", - nfkc: "\u{D447}", - nfkd: "\u{1111}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{D448}", - nfc: "\u{D448}", - nfd: "\u{1111}\u{116C}\u{11AF}", - nfkc: "\u{D448}", - nfkd: "\u{1111}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{D449}", - nfc: "\u{D449}", - nfd: "\u{1111}\u{116C}\u{11B0}", - nfkc: "\u{D449}", - nfkd: "\u{1111}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{D44A}", - nfc: "\u{D44A}", - nfd: "\u{1111}\u{116C}\u{11B1}", - nfkc: "\u{D44A}", - nfkd: "\u{1111}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{D44B}", - nfc: "\u{D44B}", - nfd: "\u{1111}\u{116C}\u{11B2}", - nfkc: "\u{D44B}", - nfkd: "\u{1111}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{D44C}", - nfc: "\u{D44C}", - nfd: "\u{1111}\u{116C}\u{11B3}", - nfkc: "\u{D44C}", - nfkd: "\u{1111}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{D44D}", - nfc: "\u{D44D}", - nfd: "\u{1111}\u{116C}\u{11B4}", - nfkc: "\u{D44D}", - nfkd: "\u{1111}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{D44E}", - nfc: "\u{D44E}", - nfd: "\u{1111}\u{116C}\u{11B5}", - nfkc: "\u{D44E}", - nfkd: "\u{1111}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{D44F}", - nfc: "\u{D44F}", - nfd: "\u{1111}\u{116C}\u{11B6}", - nfkc: "\u{D44F}", - nfkd: "\u{1111}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{D450}", - nfc: "\u{D450}", - nfd: "\u{1111}\u{116C}\u{11B7}", - nfkc: "\u{D450}", - nfkd: "\u{1111}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{D451}", - nfc: "\u{D451}", - nfd: "\u{1111}\u{116C}\u{11B8}", - nfkc: "\u{D451}", - nfkd: "\u{1111}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{D452}", - nfc: "\u{D452}", - nfd: "\u{1111}\u{116C}\u{11B9}", - nfkc: "\u{D452}", - nfkd: "\u{1111}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{D453}", - nfc: "\u{D453}", - nfd: "\u{1111}\u{116C}\u{11BA}", - nfkc: "\u{D453}", - nfkd: "\u{1111}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{D454}", - nfc: "\u{D454}", - nfd: "\u{1111}\u{116C}\u{11BB}", - nfkc: "\u{D454}", - nfkd: "\u{1111}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{D455}", - nfc: "\u{D455}", - nfd: "\u{1111}\u{116C}\u{11BC}", - nfkc: "\u{D455}", - nfkd: "\u{1111}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{D456}", - nfc: "\u{D456}", - nfd: "\u{1111}\u{116C}\u{11BD}", - nfkc: "\u{D456}", - nfkd: "\u{1111}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{D457}", - nfc: "\u{D457}", - nfd: "\u{1111}\u{116C}\u{11BE}", - nfkc: "\u{D457}", - nfkd: "\u{1111}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{D458}", - nfc: "\u{D458}", - nfd: "\u{1111}\u{116C}\u{11BF}", - nfkc: "\u{D458}", - nfkd: "\u{1111}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{D459}", - nfc: "\u{D459}", - nfd: "\u{1111}\u{116C}\u{11C0}", - nfkc: "\u{D459}", - nfkd: "\u{1111}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{D45A}", - nfc: "\u{D45A}", - nfd: "\u{1111}\u{116C}\u{11C1}", - nfkc: "\u{D45A}", - nfkd: "\u{1111}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{D45B}", - nfc: "\u{D45B}", - nfd: "\u{1111}\u{116C}\u{11C2}", - nfkc: "\u{D45B}", - nfkd: "\u{1111}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{D45C}", - nfc: "\u{D45C}", - nfd: "\u{1111}\u{116D}", - nfkc: "\u{D45C}", - nfkd: "\u{1111}\u{116D}", - }, - NormalizationTest { - source: "\u{D45D}", - nfc: "\u{D45D}", - nfd: "\u{1111}\u{116D}\u{11A8}", - nfkc: "\u{D45D}", - nfkd: "\u{1111}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{D45E}", - nfc: "\u{D45E}", - nfd: "\u{1111}\u{116D}\u{11A9}", - nfkc: "\u{D45E}", - nfkd: "\u{1111}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{D45F}", - nfc: "\u{D45F}", - nfd: "\u{1111}\u{116D}\u{11AA}", - nfkc: "\u{D45F}", - nfkd: "\u{1111}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{D460}", - nfc: "\u{D460}", - nfd: "\u{1111}\u{116D}\u{11AB}", - nfkc: "\u{D460}", - nfkd: "\u{1111}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{D461}", - nfc: "\u{D461}", - nfd: "\u{1111}\u{116D}\u{11AC}", - nfkc: "\u{D461}", - nfkd: "\u{1111}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{D462}", - nfc: "\u{D462}", - nfd: "\u{1111}\u{116D}\u{11AD}", - nfkc: "\u{D462}", - nfkd: "\u{1111}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{D463}", - nfc: "\u{D463}", - nfd: "\u{1111}\u{116D}\u{11AE}", - nfkc: "\u{D463}", - nfkd: "\u{1111}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{D464}", - nfc: "\u{D464}", - nfd: "\u{1111}\u{116D}\u{11AF}", - nfkc: "\u{D464}", - nfkd: "\u{1111}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{D465}", - nfc: "\u{D465}", - nfd: "\u{1111}\u{116D}\u{11B0}", - nfkc: "\u{D465}", - nfkd: "\u{1111}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{D466}", - nfc: "\u{D466}", - nfd: "\u{1111}\u{116D}\u{11B1}", - nfkc: "\u{D466}", - nfkd: "\u{1111}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{D467}", - nfc: "\u{D467}", - nfd: "\u{1111}\u{116D}\u{11B2}", - nfkc: "\u{D467}", - nfkd: "\u{1111}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{D468}", - nfc: "\u{D468}", - nfd: "\u{1111}\u{116D}\u{11B3}", - nfkc: "\u{D468}", - nfkd: "\u{1111}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{D469}", - nfc: "\u{D469}", - nfd: "\u{1111}\u{116D}\u{11B4}", - nfkc: "\u{D469}", - nfkd: "\u{1111}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{D46A}", - nfc: "\u{D46A}", - nfd: "\u{1111}\u{116D}\u{11B5}", - nfkc: "\u{D46A}", - nfkd: "\u{1111}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{D46B}", - nfc: "\u{D46B}", - nfd: "\u{1111}\u{116D}\u{11B6}", - nfkc: "\u{D46B}", - nfkd: "\u{1111}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{D46C}", - nfc: "\u{D46C}", - nfd: "\u{1111}\u{116D}\u{11B7}", - nfkc: "\u{D46C}", - nfkd: "\u{1111}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{D46D}", - nfc: "\u{D46D}", - nfd: "\u{1111}\u{116D}\u{11B8}", - nfkc: "\u{D46D}", - nfkd: "\u{1111}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{D46E}", - nfc: "\u{D46E}", - nfd: "\u{1111}\u{116D}\u{11B9}", - nfkc: "\u{D46E}", - nfkd: "\u{1111}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{D46F}", - nfc: "\u{D46F}", - nfd: "\u{1111}\u{116D}\u{11BA}", - nfkc: "\u{D46F}", - nfkd: "\u{1111}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{D470}", - nfc: "\u{D470}", - nfd: "\u{1111}\u{116D}\u{11BB}", - nfkc: "\u{D470}", - nfkd: "\u{1111}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{D471}", - nfc: "\u{D471}", - nfd: "\u{1111}\u{116D}\u{11BC}", - nfkc: "\u{D471}", - nfkd: "\u{1111}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{D472}", - nfc: "\u{D472}", - nfd: "\u{1111}\u{116D}\u{11BD}", - nfkc: "\u{D472}", - nfkd: "\u{1111}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{D473}", - nfc: "\u{D473}", - nfd: "\u{1111}\u{116D}\u{11BE}", - nfkc: "\u{D473}", - nfkd: "\u{1111}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{D474}", - nfc: "\u{D474}", - nfd: "\u{1111}\u{116D}\u{11BF}", - nfkc: "\u{D474}", - nfkd: "\u{1111}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{D475}", - nfc: "\u{D475}", - nfd: "\u{1111}\u{116D}\u{11C0}", - nfkc: "\u{D475}", - nfkd: "\u{1111}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{D476}", - nfc: "\u{D476}", - nfd: "\u{1111}\u{116D}\u{11C1}", - nfkc: "\u{D476}", - nfkd: "\u{1111}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{D477}", - nfc: "\u{D477}", - nfd: "\u{1111}\u{116D}\u{11C2}", - nfkc: "\u{D477}", - nfkd: "\u{1111}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{D478}", - nfc: "\u{D478}", - nfd: "\u{1111}\u{116E}", - nfkc: "\u{D478}", - nfkd: "\u{1111}\u{116E}", - }, - NormalizationTest { - source: "\u{D479}", - nfc: "\u{D479}", - nfd: "\u{1111}\u{116E}\u{11A8}", - nfkc: "\u{D479}", - nfkd: "\u{1111}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{D47A}", - nfc: "\u{D47A}", - nfd: "\u{1111}\u{116E}\u{11A9}", - nfkc: "\u{D47A}", - nfkd: "\u{1111}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{D47B}", - nfc: "\u{D47B}", - nfd: "\u{1111}\u{116E}\u{11AA}", - nfkc: "\u{D47B}", - nfkd: "\u{1111}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{D47C}", - nfc: "\u{D47C}", - nfd: "\u{1111}\u{116E}\u{11AB}", - nfkc: "\u{D47C}", - nfkd: "\u{1111}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{D47D}", - nfc: "\u{D47D}", - nfd: "\u{1111}\u{116E}\u{11AC}", - nfkc: "\u{D47D}", - nfkd: "\u{1111}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{D47E}", - nfc: "\u{D47E}", - nfd: "\u{1111}\u{116E}\u{11AD}", - nfkc: "\u{D47E}", - nfkd: "\u{1111}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{D47F}", - nfc: "\u{D47F}", - nfd: "\u{1111}\u{116E}\u{11AE}", - nfkc: "\u{D47F}", - nfkd: "\u{1111}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{D480}", - nfc: "\u{D480}", - nfd: "\u{1111}\u{116E}\u{11AF}", - nfkc: "\u{D480}", - nfkd: "\u{1111}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{D481}", - nfc: "\u{D481}", - nfd: "\u{1111}\u{116E}\u{11B0}", - nfkc: "\u{D481}", - nfkd: "\u{1111}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{D482}", - nfc: "\u{D482}", - nfd: "\u{1111}\u{116E}\u{11B1}", - nfkc: "\u{D482}", - nfkd: "\u{1111}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{D483}", - nfc: "\u{D483}", - nfd: "\u{1111}\u{116E}\u{11B2}", - nfkc: "\u{D483}", - nfkd: "\u{1111}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{D484}", - nfc: "\u{D484}", - nfd: "\u{1111}\u{116E}\u{11B3}", - nfkc: "\u{D484}", - nfkd: "\u{1111}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{D485}", - nfc: "\u{D485}", - nfd: "\u{1111}\u{116E}\u{11B4}", - nfkc: "\u{D485}", - nfkd: "\u{1111}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{D486}", - nfc: "\u{D486}", - nfd: "\u{1111}\u{116E}\u{11B5}", - nfkc: "\u{D486}", - nfkd: "\u{1111}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{D487}", - nfc: "\u{D487}", - nfd: "\u{1111}\u{116E}\u{11B6}", - nfkc: "\u{D487}", - nfkd: "\u{1111}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{D488}", - nfc: "\u{D488}", - nfd: "\u{1111}\u{116E}\u{11B7}", - nfkc: "\u{D488}", - nfkd: "\u{1111}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{D489}", - nfc: "\u{D489}", - nfd: "\u{1111}\u{116E}\u{11B8}", - nfkc: "\u{D489}", - nfkd: "\u{1111}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{D48A}", - nfc: "\u{D48A}", - nfd: "\u{1111}\u{116E}\u{11B9}", - nfkc: "\u{D48A}", - nfkd: "\u{1111}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{D48B}", - nfc: "\u{D48B}", - nfd: "\u{1111}\u{116E}\u{11BA}", - nfkc: "\u{D48B}", - nfkd: "\u{1111}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{D48C}", - nfc: "\u{D48C}", - nfd: "\u{1111}\u{116E}\u{11BB}", - nfkc: "\u{D48C}", - nfkd: "\u{1111}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{D48D}", - nfc: "\u{D48D}", - nfd: "\u{1111}\u{116E}\u{11BC}", - nfkc: "\u{D48D}", - nfkd: "\u{1111}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{D48E}", - nfc: "\u{D48E}", - nfd: "\u{1111}\u{116E}\u{11BD}", - nfkc: "\u{D48E}", - nfkd: "\u{1111}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{D48F}", - nfc: "\u{D48F}", - nfd: "\u{1111}\u{116E}\u{11BE}", - nfkc: "\u{D48F}", - nfkd: "\u{1111}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{D490}", - nfc: "\u{D490}", - nfd: "\u{1111}\u{116E}\u{11BF}", - nfkc: "\u{D490}", - nfkd: "\u{1111}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{D491}", - nfc: "\u{D491}", - nfd: "\u{1111}\u{116E}\u{11C0}", - nfkc: "\u{D491}", - nfkd: "\u{1111}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{D492}", - nfc: "\u{D492}", - nfd: "\u{1111}\u{116E}\u{11C1}", - nfkc: "\u{D492}", - nfkd: "\u{1111}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{D493}", - nfc: "\u{D493}", - nfd: "\u{1111}\u{116E}\u{11C2}", - nfkc: "\u{D493}", - nfkd: "\u{1111}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{D494}", - nfc: "\u{D494}", - nfd: "\u{1111}\u{116F}", - nfkc: "\u{D494}", - nfkd: "\u{1111}\u{116F}", - }, - NormalizationTest { - source: "\u{D495}", - nfc: "\u{D495}", - nfd: "\u{1111}\u{116F}\u{11A8}", - nfkc: "\u{D495}", - nfkd: "\u{1111}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{D496}", - nfc: "\u{D496}", - nfd: "\u{1111}\u{116F}\u{11A9}", - nfkc: "\u{D496}", - nfkd: "\u{1111}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{D497}", - nfc: "\u{D497}", - nfd: "\u{1111}\u{116F}\u{11AA}", - nfkc: "\u{D497}", - nfkd: "\u{1111}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{D498}", - nfc: "\u{D498}", - nfd: "\u{1111}\u{116F}\u{11AB}", - nfkc: "\u{D498}", - nfkd: "\u{1111}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{D499}", - nfc: "\u{D499}", - nfd: "\u{1111}\u{116F}\u{11AC}", - nfkc: "\u{D499}", - nfkd: "\u{1111}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{D49A}", - nfc: "\u{D49A}", - nfd: "\u{1111}\u{116F}\u{11AD}", - nfkc: "\u{D49A}", - nfkd: "\u{1111}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{D49B}", - nfc: "\u{D49B}", - nfd: "\u{1111}\u{116F}\u{11AE}", - nfkc: "\u{D49B}", - nfkd: "\u{1111}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{D49C}", - nfc: "\u{D49C}", - nfd: "\u{1111}\u{116F}\u{11AF}", - nfkc: "\u{D49C}", - nfkd: "\u{1111}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{D49D}", - nfc: "\u{D49D}", - nfd: "\u{1111}\u{116F}\u{11B0}", - nfkc: "\u{D49D}", - nfkd: "\u{1111}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{D49E}", - nfc: "\u{D49E}", - nfd: "\u{1111}\u{116F}\u{11B1}", - nfkc: "\u{D49E}", - nfkd: "\u{1111}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{D49F}", - nfc: "\u{D49F}", - nfd: "\u{1111}\u{116F}\u{11B2}", - nfkc: "\u{D49F}", - nfkd: "\u{1111}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{D4A0}", - nfc: "\u{D4A0}", - nfd: "\u{1111}\u{116F}\u{11B3}", - nfkc: "\u{D4A0}", - nfkd: "\u{1111}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{D4A1}", - nfc: "\u{D4A1}", - nfd: "\u{1111}\u{116F}\u{11B4}", - nfkc: "\u{D4A1}", - nfkd: "\u{1111}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{D4A2}", - nfc: "\u{D4A2}", - nfd: "\u{1111}\u{116F}\u{11B5}", - nfkc: "\u{D4A2}", - nfkd: "\u{1111}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{D4A3}", - nfc: "\u{D4A3}", - nfd: "\u{1111}\u{116F}\u{11B6}", - nfkc: "\u{D4A3}", - nfkd: "\u{1111}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{D4A4}", - nfc: "\u{D4A4}", - nfd: "\u{1111}\u{116F}\u{11B7}", - nfkc: "\u{D4A4}", - nfkd: "\u{1111}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{D4A5}", - nfc: "\u{D4A5}", - nfd: "\u{1111}\u{116F}\u{11B8}", - nfkc: "\u{D4A5}", - nfkd: "\u{1111}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{D4A6}", - nfc: "\u{D4A6}", - nfd: "\u{1111}\u{116F}\u{11B9}", - nfkc: "\u{D4A6}", - nfkd: "\u{1111}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{D4A7}", - nfc: "\u{D4A7}", - nfd: "\u{1111}\u{116F}\u{11BA}", - nfkc: "\u{D4A7}", - nfkd: "\u{1111}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{D4A8}", - nfc: "\u{D4A8}", - nfd: "\u{1111}\u{116F}\u{11BB}", - nfkc: "\u{D4A8}", - nfkd: "\u{1111}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{D4A9}", - nfc: "\u{D4A9}", - nfd: "\u{1111}\u{116F}\u{11BC}", - nfkc: "\u{D4A9}", - nfkd: "\u{1111}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{D4AA}", - nfc: "\u{D4AA}", - nfd: "\u{1111}\u{116F}\u{11BD}", - nfkc: "\u{D4AA}", - nfkd: "\u{1111}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{D4AB}", - nfc: "\u{D4AB}", - nfd: "\u{1111}\u{116F}\u{11BE}", - nfkc: "\u{D4AB}", - nfkd: "\u{1111}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{D4AC}", - nfc: "\u{D4AC}", - nfd: "\u{1111}\u{116F}\u{11BF}", - nfkc: "\u{D4AC}", - nfkd: "\u{1111}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{D4AD}", - nfc: "\u{D4AD}", - nfd: "\u{1111}\u{116F}\u{11C0}", - nfkc: "\u{D4AD}", - nfkd: "\u{1111}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{D4AE}", - nfc: "\u{D4AE}", - nfd: "\u{1111}\u{116F}\u{11C1}", - nfkc: "\u{D4AE}", - nfkd: "\u{1111}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{D4AF}", - nfc: "\u{D4AF}", - nfd: "\u{1111}\u{116F}\u{11C2}", - nfkc: "\u{D4AF}", - nfkd: "\u{1111}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{D4B0}", - nfc: "\u{D4B0}", - nfd: "\u{1111}\u{1170}", - nfkc: "\u{D4B0}", - nfkd: "\u{1111}\u{1170}", - }, - NormalizationTest { - source: "\u{D4B1}", - nfc: "\u{D4B1}", - nfd: "\u{1111}\u{1170}\u{11A8}", - nfkc: "\u{D4B1}", - nfkd: "\u{1111}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{D4B2}", - nfc: "\u{D4B2}", - nfd: "\u{1111}\u{1170}\u{11A9}", - nfkc: "\u{D4B2}", - nfkd: "\u{1111}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{D4B3}", - nfc: "\u{D4B3}", - nfd: "\u{1111}\u{1170}\u{11AA}", - nfkc: "\u{D4B3}", - nfkd: "\u{1111}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{D4B4}", - nfc: "\u{D4B4}", - nfd: "\u{1111}\u{1170}\u{11AB}", - nfkc: "\u{D4B4}", - nfkd: "\u{1111}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{D4B5}", - nfc: "\u{D4B5}", - nfd: "\u{1111}\u{1170}\u{11AC}", - nfkc: "\u{D4B5}", - nfkd: "\u{1111}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{D4B6}", - nfc: "\u{D4B6}", - nfd: "\u{1111}\u{1170}\u{11AD}", - nfkc: "\u{D4B6}", - nfkd: "\u{1111}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{D4B7}", - nfc: "\u{D4B7}", - nfd: "\u{1111}\u{1170}\u{11AE}", - nfkc: "\u{D4B7}", - nfkd: "\u{1111}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{D4B8}", - nfc: "\u{D4B8}", - nfd: "\u{1111}\u{1170}\u{11AF}", - nfkc: "\u{D4B8}", - nfkd: "\u{1111}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{D4B9}", - nfc: "\u{D4B9}", - nfd: "\u{1111}\u{1170}\u{11B0}", - nfkc: "\u{D4B9}", - nfkd: "\u{1111}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{D4BA}", - nfc: "\u{D4BA}", - nfd: "\u{1111}\u{1170}\u{11B1}", - nfkc: "\u{D4BA}", - nfkd: "\u{1111}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{D4BB}", - nfc: "\u{D4BB}", - nfd: "\u{1111}\u{1170}\u{11B2}", - nfkc: "\u{D4BB}", - nfkd: "\u{1111}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{D4BC}", - nfc: "\u{D4BC}", - nfd: "\u{1111}\u{1170}\u{11B3}", - nfkc: "\u{D4BC}", - nfkd: "\u{1111}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{D4BD}", - nfc: "\u{D4BD}", - nfd: "\u{1111}\u{1170}\u{11B4}", - nfkc: "\u{D4BD}", - nfkd: "\u{1111}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{D4BE}", - nfc: "\u{D4BE}", - nfd: "\u{1111}\u{1170}\u{11B5}", - nfkc: "\u{D4BE}", - nfkd: "\u{1111}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{D4BF}", - nfc: "\u{D4BF}", - nfd: "\u{1111}\u{1170}\u{11B6}", - nfkc: "\u{D4BF}", - nfkd: "\u{1111}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{D4C0}", - nfc: "\u{D4C0}", - nfd: "\u{1111}\u{1170}\u{11B7}", - nfkc: "\u{D4C0}", - nfkd: "\u{1111}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{D4C1}", - nfc: "\u{D4C1}", - nfd: "\u{1111}\u{1170}\u{11B8}", - nfkc: "\u{D4C1}", - nfkd: "\u{1111}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{D4C2}", - nfc: "\u{D4C2}", - nfd: "\u{1111}\u{1170}\u{11B9}", - nfkc: "\u{D4C2}", - nfkd: "\u{1111}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{D4C3}", - nfc: "\u{D4C3}", - nfd: "\u{1111}\u{1170}\u{11BA}", - nfkc: "\u{D4C3}", - nfkd: "\u{1111}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{D4C4}", - nfc: "\u{D4C4}", - nfd: "\u{1111}\u{1170}\u{11BB}", - nfkc: "\u{D4C4}", - nfkd: "\u{1111}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{D4C5}", - nfc: "\u{D4C5}", - nfd: "\u{1111}\u{1170}\u{11BC}", - nfkc: "\u{D4C5}", - nfkd: "\u{1111}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{D4C6}", - nfc: "\u{D4C6}", - nfd: "\u{1111}\u{1170}\u{11BD}", - nfkc: "\u{D4C6}", - nfkd: "\u{1111}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{D4C7}", - nfc: "\u{D4C7}", - nfd: "\u{1111}\u{1170}\u{11BE}", - nfkc: "\u{D4C7}", - nfkd: "\u{1111}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{D4C8}", - nfc: "\u{D4C8}", - nfd: "\u{1111}\u{1170}\u{11BF}", - nfkc: "\u{D4C8}", - nfkd: "\u{1111}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{D4C9}", - nfc: "\u{D4C9}", - nfd: "\u{1111}\u{1170}\u{11C0}", - nfkc: "\u{D4C9}", - nfkd: "\u{1111}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{D4CA}", - nfc: "\u{D4CA}", - nfd: "\u{1111}\u{1170}\u{11C1}", - nfkc: "\u{D4CA}", - nfkd: "\u{1111}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{D4CB}", - nfc: "\u{D4CB}", - nfd: "\u{1111}\u{1170}\u{11C2}", - nfkc: "\u{D4CB}", - nfkd: "\u{1111}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{D4CC}", - nfc: "\u{D4CC}", - nfd: "\u{1111}\u{1171}", - nfkc: "\u{D4CC}", - nfkd: "\u{1111}\u{1171}", - }, - NormalizationTest { - source: "\u{D4CD}", - nfc: "\u{D4CD}", - nfd: "\u{1111}\u{1171}\u{11A8}", - nfkc: "\u{D4CD}", - nfkd: "\u{1111}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{D4CE}", - nfc: "\u{D4CE}", - nfd: "\u{1111}\u{1171}\u{11A9}", - nfkc: "\u{D4CE}", - nfkd: "\u{1111}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{D4CF}", - nfc: "\u{D4CF}", - nfd: "\u{1111}\u{1171}\u{11AA}", - nfkc: "\u{D4CF}", - nfkd: "\u{1111}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{D4D0}", - nfc: "\u{D4D0}", - nfd: "\u{1111}\u{1171}\u{11AB}", - nfkc: "\u{D4D0}", - nfkd: "\u{1111}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{D4D1}", - nfc: "\u{D4D1}", - nfd: "\u{1111}\u{1171}\u{11AC}", - nfkc: "\u{D4D1}", - nfkd: "\u{1111}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{D4D2}", - nfc: "\u{D4D2}", - nfd: "\u{1111}\u{1171}\u{11AD}", - nfkc: "\u{D4D2}", - nfkd: "\u{1111}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{D4D3}", - nfc: "\u{D4D3}", - nfd: "\u{1111}\u{1171}\u{11AE}", - nfkc: "\u{D4D3}", - nfkd: "\u{1111}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{D4D4}", - nfc: "\u{D4D4}", - nfd: "\u{1111}\u{1171}\u{11AF}", - nfkc: "\u{D4D4}", - nfkd: "\u{1111}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{D4D5}", - nfc: "\u{D4D5}", - nfd: "\u{1111}\u{1171}\u{11B0}", - nfkc: "\u{D4D5}", - nfkd: "\u{1111}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{D4D6}", - nfc: "\u{D4D6}", - nfd: "\u{1111}\u{1171}\u{11B1}", - nfkc: "\u{D4D6}", - nfkd: "\u{1111}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{D4D7}", - nfc: "\u{D4D7}", - nfd: "\u{1111}\u{1171}\u{11B2}", - nfkc: "\u{D4D7}", - nfkd: "\u{1111}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{D4D8}", - nfc: "\u{D4D8}", - nfd: "\u{1111}\u{1171}\u{11B3}", - nfkc: "\u{D4D8}", - nfkd: "\u{1111}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{D4D9}", - nfc: "\u{D4D9}", - nfd: "\u{1111}\u{1171}\u{11B4}", - nfkc: "\u{D4D9}", - nfkd: "\u{1111}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{D4DA}", - nfc: "\u{D4DA}", - nfd: "\u{1111}\u{1171}\u{11B5}", - nfkc: "\u{D4DA}", - nfkd: "\u{1111}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{D4DB}", - nfc: "\u{D4DB}", - nfd: "\u{1111}\u{1171}\u{11B6}", - nfkc: "\u{D4DB}", - nfkd: "\u{1111}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{D4DC}", - nfc: "\u{D4DC}", - nfd: "\u{1111}\u{1171}\u{11B7}", - nfkc: "\u{D4DC}", - nfkd: "\u{1111}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{D4DD}", - nfc: "\u{D4DD}", - nfd: "\u{1111}\u{1171}\u{11B8}", - nfkc: "\u{D4DD}", - nfkd: "\u{1111}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{D4DE}", - nfc: "\u{D4DE}", - nfd: "\u{1111}\u{1171}\u{11B9}", - nfkc: "\u{D4DE}", - nfkd: "\u{1111}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{D4DF}", - nfc: "\u{D4DF}", - nfd: "\u{1111}\u{1171}\u{11BA}", - nfkc: "\u{D4DF}", - nfkd: "\u{1111}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{D4E0}", - nfc: "\u{D4E0}", - nfd: "\u{1111}\u{1171}\u{11BB}", - nfkc: "\u{D4E0}", - nfkd: "\u{1111}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{D4E1}", - nfc: "\u{D4E1}", - nfd: "\u{1111}\u{1171}\u{11BC}", - nfkc: "\u{D4E1}", - nfkd: "\u{1111}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{D4E2}", - nfc: "\u{D4E2}", - nfd: "\u{1111}\u{1171}\u{11BD}", - nfkc: "\u{D4E2}", - nfkd: "\u{1111}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{D4E3}", - nfc: "\u{D4E3}", - nfd: "\u{1111}\u{1171}\u{11BE}", - nfkc: "\u{D4E3}", - nfkd: "\u{1111}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{D4E4}", - nfc: "\u{D4E4}", - nfd: "\u{1111}\u{1171}\u{11BF}", - nfkc: "\u{D4E4}", - nfkd: "\u{1111}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{D4E5}", - nfc: "\u{D4E5}", - nfd: "\u{1111}\u{1171}\u{11C0}", - nfkc: "\u{D4E5}", - nfkd: "\u{1111}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{D4E6}", - nfc: "\u{D4E6}", - nfd: "\u{1111}\u{1171}\u{11C1}", - nfkc: "\u{D4E6}", - nfkd: "\u{1111}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{D4E7}", - nfc: "\u{D4E7}", - nfd: "\u{1111}\u{1171}\u{11C2}", - nfkc: "\u{D4E7}", - nfkd: "\u{1111}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{D4E8}", - nfc: "\u{D4E8}", - nfd: "\u{1111}\u{1172}", - nfkc: "\u{D4E8}", - nfkd: "\u{1111}\u{1172}", - }, - NormalizationTest { - source: "\u{D4E9}", - nfc: "\u{D4E9}", - nfd: "\u{1111}\u{1172}\u{11A8}", - nfkc: "\u{D4E9}", - nfkd: "\u{1111}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{D4EA}", - nfc: "\u{D4EA}", - nfd: "\u{1111}\u{1172}\u{11A9}", - nfkc: "\u{D4EA}", - nfkd: "\u{1111}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{D4EB}", - nfc: "\u{D4EB}", - nfd: "\u{1111}\u{1172}\u{11AA}", - nfkc: "\u{D4EB}", - nfkd: "\u{1111}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{D4EC}", - nfc: "\u{D4EC}", - nfd: "\u{1111}\u{1172}\u{11AB}", - nfkc: "\u{D4EC}", - nfkd: "\u{1111}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{D4ED}", - nfc: "\u{D4ED}", - nfd: "\u{1111}\u{1172}\u{11AC}", - nfkc: "\u{D4ED}", - nfkd: "\u{1111}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{D4EE}", - nfc: "\u{D4EE}", - nfd: "\u{1111}\u{1172}\u{11AD}", - nfkc: "\u{D4EE}", - nfkd: "\u{1111}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{D4EF}", - nfc: "\u{D4EF}", - nfd: "\u{1111}\u{1172}\u{11AE}", - nfkc: "\u{D4EF}", - nfkd: "\u{1111}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{D4F0}", - nfc: "\u{D4F0}", - nfd: "\u{1111}\u{1172}\u{11AF}", - nfkc: "\u{D4F0}", - nfkd: "\u{1111}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{D4F1}", - nfc: "\u{D4F1}", - nfd: "\u{1111}\u{1172}\u{11B0}", - nfkc: "\u{D4F1}", - nfkd: "\u{1111}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{D4F2}", - nfc: "\u{D4F2}", - nfd: "\u{1111}\u{1172}\u{11B1}", - nfkc: "\u{D4F2}", - nfkd: "\u{1111}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{D4F3}", - nfc: "\u{D4F3}", - nfd: "\u{1111}\u{1172}\u{11B2}", - nfkc: "\u{D4F3}", - nfkd: "\u{1111}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{D4F4}", - nfc: "\u{D4F4}", - nfd: "\u{1111}\u{1172}\u{11B3}", - nfkc: "\u{D4F4}", - nfkd: "\u{1111}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{D4F5}", - nfc: "\u{D4F5}", - nfd: "\u{1111}\u{1172}\u{11B4}", - nfkc: "\u{D4F5}", - nfkd: "\u{1111}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{D4F6}", - nfc: "\u{D4F6}", - nfd: "\u{1111}\u{1172}\u{11B5}", - nfkc: "\u{D4F6}", - nfkd: "\u{1111}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{D4F7}", - nfc: "\u{D4F7}", - nfd: "\u{1111}\u{1172}\u{11B6}", - nfkc: "\u{D4F7}", - nfkd: "\u{1111}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{D4F8}", - nfc: "\u{D4F8}", - nfd: "\u{1111}\u{1172}\u{11B7}", - nfkc: "\u{D4F8}", - nfkd: "\u{1111}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{D4F9}", - nfc: "\u{D4F9}", - nfd: "\u{1111}\u{1172}\u{11B8}", - nfkc: "\u{D4F9}", - nfkd: "\u{1111}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{D4FA}", - nfc: "\u{D4FA}", - nfd: "\u{1111}\u{1172}\u{11B9}", - nfkc: "\u{D4FA}", - nfkd: "\u{1111}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{D4FB}", - nfc: "\u{D4FB}", - nfd: "\u{1111}\u{1172}\u{11BA}", - nfkc: "\u{D4FB}", - nfkd: "\u{1111}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{D4FC}", - nfc: "\u{D4FC}", - nfd: "\u{1111}\u{1172}\u{11BB}", - nfkc: "\u{D4FC}", - nfkd: "\u{1111}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{D4FD}", - nfc: "\u{D4FD}", - nfd: "\u{1111}\u{1172}\u{11BC}", - nfkc: "\u{D4FD}", - nfkd: "\u{1111}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{D4FE}", - nfc: "\u{D4FE}", - nfd: "\u{1111}\u{1172}\u{11BD}", - nfkc: "\u{D4FE}", - nfkd: "\u{1111}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{D4FF}", - nfc: "\u{D4FF}", - nfd: "\u{1111}\u{1172}\u{11BE}", - nfkc: "\u{D4FF}", - nfkd: "\u{1111}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{D500}", - nfc: "\u{D500}", - nfd: "\u{1111}\u{1172}\u{11BF}", - nfkc: "\u{D500}", - nfkd: "\u{1111}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{D501}", - nfc: "\u{D501}", - nfd: "\u{1111}\u{1172}\u{11C0}", - nfkc: "\u{D501}", - nfkd: "\u{1111}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{D502}", - nfc: "\u{D502}", - nfd: "\u{1111}\u{1172}\u{11C1}", - nfkc: "\u{D502}", - nfkd: "\u{1111}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{D503}", - nfc: "\u{D503}", - nfd: "\u{1111}\u{1172}\u{11C2}", - nfkc: "\u{D503}", - nfkd: "\u{1111}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{D504}", - nfc: "\u{D504}", - nfd: "\u{1111}\u{1173}", - nfkc: "\u{D504}", - nfkd: "\u{1111}\u{1173}", - }, - NormalizationTest { - source: "\u{D505}", - nfc: "\u{D505}", - nfd: "\u{1111}\u{1173}\u{11A8}", - nfkc: "\u{D505}", - nfkd: "\u{1111}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{D506}", - nfc: "\u{D506}", - nfd: "\u{1111}\u{1173}\u{11A9}", - nfkc: "\u{D506}", - nfkd: "\u{1111}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{D507}", - nfc: "\u{D507}", - nfd: "\u{1111}\u{1173}\u{11AA}", - nfkc: "\u{D507}", - nfkd: "\u{1111}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{D508}", - nfc: "\u{D508}", - nfd: "\u{1111}\u{1173}\u{11AB}", - nfkc: "\u{D508}", - nfkd: "\u{1111}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{D509}", - nfc: "\u{D509}", - nfd: "\u{1111}\u{1173}\u{11AC}", - nfkc: "\u{D509}", - nfkd: "\u{1111}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{D50A}", - nfc: "\u{D50A}", - nfd: "\u{1111}\u{1173}\u{11AD}", - nfkc: "\u{D50A}", - nfkd: "\u{1111}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{D50B}", - nfc: "\u{D50B}", - nfd: "\u{1111}\u{1173}\u{11AE}", - nfkc: "\u{D50B}", - nfkd: "\u{1111}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{D50C}", - nfc: "\u{D50C}", - nfd: "\u{1111}\u{1173}\u{11AF}", - nfkc: "\u{D50C}", - nfkd: "\u{1111}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{D50D}", - nfc: "\u{D50D}", - nfd: "\u{1111}\u{1173}\u{11B0}", - nfkc: "\u{D50D}", - nfkd: "\u{1111}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{D50E}", - nfc: "\u{D50E}", - nfd: "\u{1111}\u{1173}\u{11B1}", - nfkc: "\u{D50E}", - nfkd: "\u{1111}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{D50F}", - nfc: "\u{D50F}", - nfd: "\u{1111}\u{1173}\u{11B2}", - nfkc: "\u{D50F}", - nfkd: "\u{1111}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{D510}", - nfc: "\u{D510}", - nfd: "\u{1111}\u{1173}\u{11B3}", - nfkc: "\u{D510}", - nfkd: "\u{1111}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{D511}", - nfc: "\u{D511}", - nfd: "\u{1111}\u{1173}\u{11B4}", - nfkc: "\u{D511}", - nfkd: "\u{1111}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{D512}", - nfc: "\u{D512}", - nfd: "\u{1111}\u{1173}\u{11B5}", - nfkc: "\u{D512}", - nfkd: "\u{1111}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{D513}", - nfc: "\u{D513}", - nfd: "\u{1111}\u{1173}\u{11B6}", - nfkc: "\u{D513}", - nfkd: "\u{1111}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{D514}", - nfc: "\u{D514}", - nfd: "\u{1111}\u{1173}\u{11B7}", - nfkc: "\u{D514}", - nfkd: "\u{1111}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{D515}", - nfc: "\u{D515}", - nfd: "\u{1111}\u{1173}\u{11B8}", - nfkc: "\u{D515}", - nfkd: "\u{1111}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{D516}", - nfc: "\u{D516}", - nfd: "\u{1111}\u{1173}\u{11B9}", - nfkc: "\u{D516}", - nfkd: "\u{1111}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{D517}", - nfc: "\u{D517}", - nfd: "\u{1111}\u{1173}\u{11BA}", - nfkc: "\u{D517}", - nfkd: "\u{1111}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{D518}", - nfc: "\u{D518}", - nfd: "\u{1111}\u{1173}\u{11BB}", - nfkc: "\u{D518}", - nfkd: "\u{1111}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{D519}", - nfc: "\u{D519}", - nfd: "\u{1111}\u{1173}\u{11BC}", - nfkc: "\u{D519}", - nfkd: "\u{1111}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{D51A}", - nfc: "\u{D51A}", - nfd: "\u{1111}\u{1173}\u{11BD}", - nfkc: "\u{D51A}", - nfkd: "\u{1111}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{D51B}", - nfc: "\u{D51B}", - nfd: "\u{1111}\u{1173}\u{11BE}", - nfkc: "\u{D51B}", - nfkd: "\u{1111}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{D51C}", - nfc: "\u{D51C}", - nfd: "\u{1111}\u{1173}\u{11BF}", - nfkc: "\u{D51C}", - nfkd: "\u{1111}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{D51D}", - nfc: "\u{D51D}", - nfd: "\u{1111}\u{1173}\u{11C0}", - nfkc: "\u{D51D}", - nfkd: "\u{1111}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{D51E}", - nfc: "\u{D51E}", - nfd: "\u{1111}\u{1173}\u{11C1}", - nfkc: "\u{D51E}", - nfkd: "\u{1111}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{D51F}", - nfc: "\u{D51F}", - nfd: "\u{1111}\u{1173}\u{11C2}", - nfkc: "\u{D51F}", - nfkd: "\u{1111}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{D520}", - nfc: "\u{D520}", - nfd: "\u{1111}\u{1174}", - nfkc: "\u{D520}", - nfkd: "\u{1111}\u{1174}", - }, - NormalizationTest { - source: "\u{D521}", - nfc: "\u{D521}", - nfd: "\u{1111}\u{1174}\u{11A8}", - nfkc: "\u{D521}", - nfkd: "\u{1111}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{D522}", - nfc: "\u{D522}", - nfd: "\u{1111}\u{1174}\u{11A9}", - nfkc: "\u{D522}", - nfkd: "\u{1111}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{D523}", - nfc: "\u{D523}", - nfd: "\u{1111}\u{1174}\u{11AA}", - nfkc: "\u{D523}", - nfkd: "\u{1111}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{D524}", - nfc: "\u{D524}", - nfd: "\u{1111}\u{1174}\u{11AB}", - nfkc: "\u{D524}", - nfkd: "\u{1111}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{D525}", - nfc: "\u{D525}", - nfd: "\u{1111}\u{1174}\u{11AC}", - nfkc: "\u{D525}", - nfkd: "\u{1111}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{D526}", - nfc: "\u{D526}", - nfd: "\u{1111}\u{1174}\u{11AD}", - nfkc: "\u{D526}", - nfkd: "\u{1111}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{D527}", - nfc: "\u{D527}", - nfd: "\u{1111}\u{1174}\u{11AE}", - nfkc: "\u{D527}", - nfkd: "\u{1111}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{D528}", - nfc: "\u{D528}", - nfd: "\u{1111}\u{1174}\u{11AF}", - nfkc: "\u{D528}", - nfkd: "\u{1111}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{D529}", - nfc: "\u{D529}", - nfd: "\u{1111}\u{1174}\u{11B0}", - nfkc: "\u{D529}", - nfkd: "\u{1111}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{D52A}", - nfc: "\u{D52A}", - nfd: "\u{1111}\u{1174}\u{11B1}", - nfkc: "\u{D52A}", - nfkd: "\u{1111}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{D52B}", - nfc: "\u{D52B}", - nfd: "\u{1111}\u{1174}\u{11B2}", - nfkc: "\u{D52B}", - nfkd: "\u{1111}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{D52C}", - nfc: "\u{D52C}", - nfd: "\u{1111}\u{1174}\u{11B3}", - nfkc: "\u{D52C}", - nfkd: "\u{1111}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{D52D}", - nfc: "\u{D52D}", - nfd: "\u{1111}\u{1174}\u{11B4}", - nfkc: "\u{D52D}", - nfkd: "\u{1111}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{D52E}", - nfc: "\u{D52E}", - nfd: "\u{1111}\u{1174}\u{11B5}", - nfkc: "\u{D52E}", - nfkd: "\u{1111}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{D52F}", - nfc: "\u{D52F}", - nfd: "\u{1111}\u{1174}\u{11B6}", - nfkc: "\u{D52F}", - nfkd: "\u{1111}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{D530}", - nfc: "\u{D530}", - nfd: "\u{1111}\u{1174}\u{11B7}", - nfkc: "\u{D530}", - nfkd: "\u{1111}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{D531}", - nfc: "\u{D531}", - nfd: "\u{1111}\u{1174}\u{11B8}", - nfkc: "\u{D531}", - nfkd: "\u{1111}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{D532}", - nfc: "\u{D532}", - nfd: "\u{1111}\u{1174}\u{11B9}", - nfkc: "\u{D532}", - nfkd: "\u{1111}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{D533}", - nfc: "\u{D533}", - nfd: "\u{1111}\u{1174}\u{11BA}", - nfkc: "\u{D533}", - nfkd: "\u{1111}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{D534}", - nfc: "\u{D534}", - nfd: "\u{1111}\u{1174}\u{11BB}", - nfkc: "\u{D534}", - nfkd: "\u{1111}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{D535}", - nfc: "\u{D535}", - nfd: "\u{1111}\u{1174}\u{11BC}", - nfkc: "\u{D535}", - nfkd: "\u{1111}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{D536}", - nfc: "\u{D536}", - nfd: "\u{1111}\u{1174}\u{11BD}", - nfkc: "\u{D536}", - nfkd: "\u{1111}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{D537}", - nfc: "\u{D537}", - nfd: "\u{1111}\u{1174}\u{11BE}", - nfkc: "\u{D537}", - nfkd: "\u{1111}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{D538}", - nfc: "\u{D538}", - nfd: "\u{1111}\u{1174}\u{11BF}", - nfkc: "\u{D538}", - nfkd: "\u{1111}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{D539}", - nfc: "\u{D539}", - nfd: "\u{1111}\u{1174}\u{11C0}", - nfkc: "\u{D539}", - nfkd: "\u{1111}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{D53A}", - nfc: "\u{D53A}", - nfd: "\u{1111}\u{1174}\u{11C1}", - nfkc: "\u{D53A}", - nfkd: "\u{1111}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{D53B}", - nfc: "\u{D53B}", - nfd: "\u{1111}\u{1174}\u{11C2}", - nfkc: "\u{D53B}", - nfkd: "\u{1111}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{D53C}", - nfc: "\u{D53C}", - nfd: "\u{1111}\u{1175}", - nfkc: "\u{D53C}", - nfkd: "\u{1111}\u{1175}", - }, - NormalizationTest { - source: "\u{D53D}", - nfc: "\u{D53D}", - nfd: "\u{1111}\u{1175}\u{11A8}", - nfkc: "\u{D53D}", - nfkd: "\u{1111}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{D53E}", - nfc: "\u{D53E}", - nfd: "\u{1111}\u{1175}\u{11A9}", - nfkc: "\u{D53E}", - nfkd: "\u{1111}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{D53F}", - nfc: "\u{D53F}", - nfd: "\u{1111}\u{1175}\u{11AA}", - nfkc: "\u{D53F}", - nfkd: "\u{1111}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{D540}", - nfc: "\u{D540}", - nfd: "\u{1111}\u{1175}\u{11AB}", - nfkc: "\u{D540}", - nfkd: "\u{1111}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{D541}", - nfc: "\u{D541}", - nfd: "\u{1111}\u{1175}\u{11AC}", - nfkc: "\u{D541}", - nfkd: "\u{1111}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{D542}", - nfc: "\u{D542}", - nfd: "\u{1111}\u{1175}\u{11AD}", - nfkc: "\u{D542}", - nfkd: "\u{1111}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{D543}", - nfc: "\u{D543}", - nfd: "\u{1111}\u{1175}\u{11AE}", - nfkc: "\u{D543}", - nfkd: "\u{1111}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{D544}", - nfc: "\u{D544}", - nfd: "\u{1111}\u{1175}\u{11AF}", - nfkc: "\u{D544}", - nfkd: "\u{1111}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{D545}", - nfc: "\u{D545}", - nfd: "\u{1111}\u{1175}\u{11B0}", - nfkc: "\u{D545}", - nfkd: "\u{1111}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{D546}", - nfc: "\u{D546}", - nfd: "\u{1111}\u{1175}\u{11B1}", - nfkc: "\u{D546}", - nfkd: "\u{1111}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{D547}", - nfc: "\u{D547}", - nfd: "\u{1111}\u{1175}\u{11B2}", - nfkc: "\u{D547}", - nfkd: "\u{1111}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{D548}", - nfc: "\u{D548}", - nfd: "\u{1111}\u{1175}\u{11B3}", - nfkc: "\u{D548}", - nfkd: "\u{1111}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{D549}", - nfc: "\u{D549}", - nfd: "\u{1111}\u{1175}\u{11B4}", - nfkc: "\u{D549}", - nfkd: "\u{1111}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{D54A}", - nfc: "\u{D54A}", - nfd: "\u{1111}\u{1175}\u{11B5}", - nfkc: "\u{D54A}", - nfkd: "\u{1111}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{D54B}", - nfc: "\u{D54B}", - nfd: "\u{1111}\u{1175}\u{11B6}", - nfkc: "\u{D54B}", - nfkd: "\u{1111}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{D54C}", - nfc: "\u{D54C}", - nfd: "\u{1111}\u{1175}\u{11B7}", - nfkc: "\u{D54C}", - nfkd: "\u{1111}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{D54D}", - nfc: "\u{D54D}", - nfd: "\u{1111}\u{1175}\u{11B8}", - nfkc: "\u{D54D}", - nfkd: "\u{1111}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{D54E}", - nfc: "\u{D54E}", - nfd: "\u{1111}\u{1175}\u{11B9}", - nfkc: "\u{D54E}", - nfkd: "\u{1111}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{D54F}", - nfc: "\u{D54F}", - nfd: "\u{1111}\u{1175}\u{11BA}", - nfkc: "\u{D54F}", - nfkd: "\u{1111}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{D550}", - nfc: "\u{D550}", - nfd: "\u{1111}\u{1175}\u{11BB}", - nfkc: "\u{D550}", - nfkd: "\u{1111}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{D551}", - nfc: "\u{D551}", - nfd: "\u{1111}\u{1175}\u{11BC}", - nfkc: "\u{D551}", - nfkd: "\u{1111}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{D552}", - nfc: "\u{D552}", - nfd: "\u{1111}\u{1175}\u{11BD}", - nfkc: "\u{D552}", - nfkd: "\u{1111}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{D553}", - nfc: "\u{D553}", - nfd: "\u{1111}\u{1175}\u{11BE}", - nfkc: "\u{D553}", - nfkd: "\u{1111}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{D554}", - nfc: "\u{D554}", - nfd: "\u{1111}\u{1175}\u{11BF}", - nfkc: "\u{D554}", - nfkd: "\u{1111}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{D555}", - nfc: "\u{D555}", - nfd: "\u{1111}\u{1175}\u{11C0}", - nfkc: "\u{D555}", - nfkd: "\u{1111}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{D556}", - nfc: "\u{D556}", - nfd: "\u{1111}\u{1175}\u{11C1}", - nfkc: "\u{D556}", - nfkd: "\u{1111}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{D557}", - nfc: "\u{D557}", - nfd: "\u{1111}\u{1175}\u{11C2}", - nfkc: "\u{D557}", - nfkd: "\u{1111}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{D558}", - nfc: "\u{D558}", - nfd: "\u{1112}\u{1161}", - nfkc: "\u{D558}", - nfkd: "\u{1112}\u{1161}", - }, - NormalizationTest { - source: "\u{D559}", - nfc: "\u{D559}", - nfd: "\u{1112}\u{1161}\u{11A8}", - nfkc: "\u{D559}", - nfkd: "\u{1112}\u{1161}\u{11A8}", - }, - NormalizationTest { - source: "\u{D55A}", - nfc: "\u{D55A}", - nfd: "\u{1112}\u{1161}\u{11A9}", - nfkc: "\u{D55A}", - nfkd: "\u{1112}\u{1161}\u{11A9}", - }, - NormalizationTest { - source: "\u{D55B}", - nfc: "\u{D55B}", - nfd: "\u{1112}\u{1161}\u{11AA}", - nfkc: "\u{D55B}", - nfkd: "\u{1112}\u{1161}\u{11AA}", - }, - NormalizationTest { - source: "\u{D55C}", - nfc: "\u{D55C}", - nfd: "\u{1112}\u{1161}\u{11AB}", - nfkc: "\u{D55C}", - nfkd: "\u{1112}\u{1161}\u{11AB}", - }, - NormalizationTest { - source: "\u{D55D}", - nfc: "\u{D55D}", - nfd: "\u{1112}\u{1161}\u{11AC}", - nfkc: "\u{D55D}", - nfkd: "\u{1112}\u{1161}\u{11AC}", - }, - NormalizationTest { - source: "\u{D55E}", - nfc: "\u{D55E}", - nfd: "\u{1112}\u{1161}\u{11AD}", - nfkc: "\u{D55E}", - nfkd: "\u{1112}\u{1161}\u{11AD}", - }, - NormalizationTest { - source: "\u{D55F}", - nfc: "\u{D55F}", - nfd: "\u{1112}\u{1161}\u{11AE}", - nfkc: "\u{D55F}", - nfkd: "\u{1112}\u{1161}\u{11AE}", - }, - NormalizationTest { - source: "\u{D560}", - nfc: "\u{D560}", - nfd: "\u{1112}\u{1161}\u{11AF}", - nfkc: "\u{D560}", - nfkd: "\u{1112}\u{1161}\u{11AF}", - }, - NormalizationTest { - source: "\u{D561}", - nfc: "\u{D561}", - nfd: "\u{1112}\u{1161}\u{11B0}", - nfkc: "\u{D561}", - nfkd: "\u{1112}\u{1161}\u{11B0}", - }, - NormalizationTest { - source: "\u{D562}", - nfc: "\u{D562}", - nfd: "\u{1112}\u{1161}\u{11B1}", - nfkc: "\u{D562}", - nfkd: "\u{1112}\u{1161}\u{11B1}", - }, - NormalizationTest { - source: "\u{D563}", - nfc: "\u{D563}", - nfd: "\u{1112}\u{1161}\u{11B2}", - nfkc: "\u{D563}", - nfkd: "\u{1112}\u{1161}\u{11B2}", - }, - NormalizationTest { - source: "\u{D564}", - nfc: "\u{D564}", - nfd: "\u{1112}\u{1161}\u{11B3}", - nfkc: "\u{D564}", - nfkd: "\u{1112}\u{1161}\u{11B3}", - }, - NormalizationTest { - source: "\u{D565}", - nfc: "\u{D565}", - nfd: "\u{1112}\u{1161}\u{11B4}", - nfkc: "\u{D565}", - nfkd: "\u{1112}\u{1161}\u{11B4}", - }, - NormalizationTest { - source: "\u{D566}", - nfc: "\u{D566}", - nfd: "\u{1112}\u{1161}\u{11B5}", - nfkc: "\u{D566}", - nfkd: "\u{1112}\u{1161}\u{11B5}", - }, - NormalizationTest { - source: "\u{D567}", - nfc: "\u{D567}", - nfd: "\u{1112}\u{1161}\u{11B6}", - nfkc: "\u{D567}", - nfkd: "\u{1112}\u{1161}\u{11B6}", - }, - NormalizationTest { - source: "\u{D568}", - nfc: "\u{D568}", - nfd: "\u{1112}\u{1161}\u{11B7}", - nfkc: "\u{D568}", - nfkd: "\u{1112}\u{1161}\u{11B7}", - }, - NormalizationTest { - source: "\u{D569}", - nfc: "\u{D569}", - nfd: "\u{1112}\u{1161}\u{11B8}", - nfkc: "\u{D569}", - nfkd: "\u{1112}\u{1161}\u{11B8}", - }, - NormalizationTest { - source: "\u{D56A}", - nfc: "\u{D56A}", - nfd: "\u{1112}\u{1161}\u{11B9}", - nfkc: "\u{D56A}", - nfkd: "\u{1112}\u{1161}\u{11B9}", - }, - NormalizationTest { - source: "\u{D56B}", - nfc: "\u{D56B}", - nfd: "\u{1112}\u{1161}\u{11BA}", - nfkc: "\u{D56B}", - nfkd: "\u{1112}\u{1161}\u{11BA}", - }, - NormalizationTest { - source: "\u{D56C}", - nfc: "\u{D56C}", - nfd: "\u{1112}\u{1161}\u{11BB}", - nfkc: "\u{D56C}", - nfkd: "\u{1112}\u{1161}\u{11BB}", - }, - NormalizationTest { - source: "\u{D56D}", - nfc: "\u{D56D}", - nfd: "\u{1112}\u{1161}\u{11BC}", - nfkc: "\u{D56D}", - nfkd: "\u{1112}\u{1161}\u{11BC}", - }, - NormalizationTest { - source: "\u{D56E}", - nfc: "\u{D56E}", - nfd: "\u{1112}\u{1161}\u{11BD}", - nfkc: "\u{D56E}", - nfkd: "\u{1112}\u{1161}\u{11BD}", - }, - NormalizationTest { - source: "\u{D56F}", - nfc: "\u{D56F}", - nfd: "\u{1112}\u{1161}\u{11BE}", - nfkc: "\u{D56F}", - nfkd: "\u{1112}\u{1161}\u{11BE}", - }, - NormalizationTest { - source: "\u{D570}", - nfc: "\u{D570}", - nfd: "\u{1112}\u{1161}\u{11BF}", - nfkc: "\u{D570}", - nfkd: "\u{1112}\u{1161}\u{11BF}", - }, - NormalizationTest { - source: "\u{D571}", - nfc: "\u{D571}", - nfd: "\u{1112}\u{1161}\u{11C0}", - nfkc: "\u{D571}", - nfkd: "\u{1112}\u{1161}\u{11C0}", - }, - NormalizationTest { - source: "\u{D572}", - nfc: "\u{D572}", - nfd: "\u{1112}\u{1161}\u{11C1}", - nfkc: "\u{D572}", - nfkd: "\u{1112}\u{1161}\u{11C1}", - }, - NormalizationTest { - source: "\u{D573}", - nfc: "\u{D573}", - nfd: "\u{1112}\u{1161}\u{11C2}", - nfkc: "\u{D573}", - nfkd: "\u{1112}\u{1161}\u{11C2}", - }, - NormalizationTest { - source: "\u{D574}", - nfc: "\u{D574}", - nfd: "\u{1112}\u{1162}", - nfkc: "\u{D574}", - nfkd: "\u{1112}\u{1162}", - }, - NormalizationTest { - source: "\u{D575}", - nfc: "\u{D575}", - nfd: "\u{1112}\u{1162}\u{11A8}", - nfkc: "\u{D575}", - nfkd: "\u{1112}\u{1162}\u{11A8}", - }, - NormalizationTest { - source: "\u{D576}", - nfc: "\u{D576}", - nfd: "\u{1112}\u{1162}\u{11A9}", - nfkc: "\u{D576}", - nfkd: "\u{1112}\u{1162}\u{11A9}", - }, - NormalizationTest { - source: "\u{D577}", - nfc: "\u{D577}", - nfd: "\u{1112}\u{1162}\u{11AA}", - nfkc: "\u{D577}", - nfkd: "\u{1112}\u{1162}\u{11AA}", - }, - NormalizationTest { - source: "\u{D578}", - nfc: "\u{D578}", - nfd: "\u{1112}\u{1162}\u{11AB}", - nfkc: "\u{D578}", - nfkd: "\u{1112}\u{1162}\u{11AB}", - }, - NormalizationTest { - source: "\u{D579}", - nfc: "\u{D579}", - nfd: "\u{1112}\u{1162}\u{11AC}", - nfkc: "\u{D579}", - nfkd: "\u{1112}\u{1162}\u{11AC}", - }, - NormalizationTest { - source: "\u{D57A}", - nfc: "\u{D57A}", - nfd: "\u{1112}\u{1162}\u{11AD}", - nfkc: "\u{D57A}", - nfkd: "\u{1112}\u{1162}\u{11AD}", - }, - NormalizationTest { - source: "\u{D57B}", - nfc: "\u{D57B}", - nfd: "\u{1112}\u{1162}\u{11AE}", - nfkc: "\u{D57B}", - nfkd: "\u{1112}\u{1162}\u{11AE}", - }, - NormalizationTest { - source: "\u{D57C}", - nfc: "\u{D57C}", - nfd: "\u{1112}\u{1162}\u{11AF}", - nfkc: "\u{D57C}", - nfkd: "\u{1112}\u{1162}\u{11AF}", - }, - NormalizationTest { - source: "\u{D57D}", - nfc: "\u{D57D}", - nfd: "\u{1112}\u{1162}\u{11B0}", - nfkc: "\u{D57D}", - nfkd: "\u{1112}\u{1162}\u{11B0}", - }, - NormalizationTest { - source: "\u{D57E}", - nfc: "\u{D57E}", - nfd: "\u{1112}\u{1162}\u{11B1}", - nfkc: "\u{D57E}", - nfkd: "\u{1112}\u{1162}\u{11B1}", - }, - NormalizationTest { - source: "\u{D57F}", - nfc: "\u{D57F}", - nfd: "\u{1112}\u{1162}\u{11B2}", - nfkc: "\u{D57F}", - nfkd: "\u{1112}\u{1162}\u{11B2}", - }, - NormalizationTest { - source: "\u{D580}", - nfc: "\u{D580}", - nfd: "\u{1112}\u{1162}\u{11B3}", - nfkc: "\u{D580}", - nfkd: "\u{1112}\u{1162}\u{11B3}", - }, - NormalizationTest { - source: "\u{D581}", - nfc: "\u{D581}", - nfd: "\u{1112}\u{1162}\u{11B4}", - nfkc: "\u{D581}", - nfkd: "\u{1112}\u{1162}\u{11B4}", - }, - NormalizationTest { - source: "\u{D582}", - nfc: "\u{D582}", - nfd: "\u{1112}\u{1162}\u{11B5}", - nfkc: "\u{D582}", - nfkd: "\u{1112}\u{1162}\u{11B5}", - }, - NormalizationTest { - source: "\u{D583}", - nfc: "\u{D583}", - nfd: "\u{1112}\u{1162}\u{11B6}", - nfkc: "\u{D583}", - nfkd: "\u{1112}\u{1162}\u{11B6}", - }, - NormalizationTest { - source: "\u{D584}", - nfc: "\u{D584}", - nfd: "\u{1112}\u{1162}\u{11B7}", - nfkc: "\u{D584}", - nfkd: "\u{1112}\u{1162}\u{11B7}", - }, - NormalizationTest { - source: "\u{D585}", - nfc: "\u{D585}", - nfd: "\u{1112}\u{1162}\u{11B8}", - nfkc: "\u{D585}", - nfkd: "\u{1112}\u{1162}\u{11B8}", - }, - NormalizationTest { - source: "\u{D586}", - nfc: "\u{D586}", - nfd: "\u{1112}\u{1162}\u{11B9}", - nfkc: "\u{D586}", - nfkd: "\u{1112}\u{1162}\u{11B9}", - }, - NormalizationTest { - source: "\u{D587}", - nfc: "\u{D587}", - nfd: "\u{1112}\u{1162}\u{11BA}", - nfkc: "\u{D587}", - nfkd: "\u{1112}\u{1162}\u{11BA}", - }, - NormalizationTest { - source: "\u{D588}", - nfc: "\u{D588}", - nfd: "\u{1112}\u{1162}\u{11BB}", - nfkc: "\u{D588}", - nfkd: "\u{1112}\u{1162}\u{11BB}", - }, - NormalizationTest { - source: "\u{D589}", - nfc: "\u{D589}", - nfd: "\u{1112}\u{1162}\u{11BC}", - nfkc: "\u{D589}", - nfkd: "\u{1112}\u{1162}\u{11BC}", - }, - NormalizationTest { - source: "\u{D58A}", - nfc: "\u{D58A}", - nfd: "\u{1112}\u{1162}\u{11BD}", - nfkc: "\u{D58A}", - nfkd: "\u{1112}\u{1162}\u{11BD}", - }, - NormalizationTest { - source: "\u{D58B}", - nfc: "\u{D58B}", - nfd: "\u{1112}\u{1162}\u{11BE}", - nfkc: "\u{D58B}", - nfkd: "\u{1112}\u{1162}\u{11BE}", - }, - NormalizationTest { - source: "\u{D58C}", - nfc: "\u{D58C}", - nfd: "\u{1112}\u{1162}\u{11BF}", - nfkc: "\u{D58C}", - nfkd: "\u{1112}\u{1162}\u{11BF}", - }, - NormalizationTest { - source: "\u{D58D}", - nfc: "\u{D58D}", - nfd: "\u{1112}\u{1162}\u{11C0}", - nfkc: "\u{D58D}", - nfkd: "\u{1112}\u{1162}\u{11C0}", - }, - NormalizationTest { - source: "\u{D58E}", - nfc: "\u{D58E}", - nfd: "\u{1112}\u{1162}\u{11C1}", - nfkc: "\u{D58E}", - nfkd: "\u{1112}\u{1162}\u{11C1}", - }, - NormalizationTest { - source: "\u{D58F}", - nfc: "\u{D58F}", - nfd: "\u{1112}\u{1162}\u{11C2}", - nfkc: "\u{D58F}", - nfkd: "\u{1112}\u{1162}\u{11C2}", - }, - NormalizationTest { - source: "\u{D590}", - nfc: "\u{D590}", - nfd: "\u{1112}\u{1163}", - nfkc: "\u{D590}", - nfkd: "\u{1112}\u{1163}", - }, - NormalizationTest { - source: "\u{D591}", - nfc: "\u{D591}", - nfd: "\u{1112}\u{1163}\u{11A8}", - nfkc: "\u{D591}", - nfkd: "\u{1112}\u{1163}\u{11A8}", - }, - NormalizationTest { - source: "\u{D592}", - nfc: "\u{D592}", - nfd: "\u{1112}\u{1163}\u{11A9}", - nfkc: "\u{D592}", - nfkd: "\u{1112}\u{1163}\u{11A9}", - }, - NormalizationTest { - source: "\u{D593}", - nfc: "\u{D593}", - nfd: "\u{1112}\u{1163}\u{11AA}", - nfkc: "\u{D593}", - nfkd: "\u{1112}\u{1163}\u{11AA}", - }, - NormalizationTest { - source: "\u{D594}", - nfc: "\u{D594}", - nfd: "\u{1112}\u{1163}\u{11AB}", - nfkc: "\u{D594}", - nfkd: "\u{1112}\u{1163}\u{11AB}", - }, - NormalizationTest { - source: "\u{D595}", - nfc: "\u{D595}", - nfd: "\u{1112}\u{1163}\u{11AC}", - nfkc: "\u{D595}", - nfkd: "\u{1112}\u{1163}\u{11AC}", - }, - NormalizationTest { - source: "\u{D596}", - nfc: "\u{D596}", - nfd: "\u{1112}\u{1163}\u{11AD}", - nfkc: "\u{D596}", - nfkd: "\u{1112}\u{1163}\u{11AD}", - }, - NormalizationTest { - source: "\u{D597}", - nfc: "\u{D597}", - nfd: "\u{1112}\u{1163}\u{11AE}", - nfkc: "\u{D597}", - nfkd: "\u{1112}\u{1163}\u{11AE}", - }, - NormalizationTest { - source: "\u{D598}", - nfc: "\u{D598}", - nfd: "\u{1112}\u{1163}\u{11AF}", - nfkc: "\u{D598}", - nfkd: "\u{1112}\u{1163}\u{11AF}", - }, - NormalizationTest { - source: "\u{D599}", - nfc: "\u{D599}", - nfd: "\u{1112}\u{1163}\u{11B0}", - nfkc: "\u{D599}", - nfkd: "\u{1112}\u{1163}\u{11B0}", - }, - NormalizationTest { - source: "\u{D59A}", - nfc: "\u{D59A}", - nfd: "\u{1112}\u{1163}\u{11B1}", - nfkc: "\u{D59A}", - nfkd: "\u{1112}\u{1163}\u{11B1}", - }, - NormalizationTest { - source: "\u{D59B}", - nfc: "\u{D59B}", - nfd: "\u{1112}\u{1163}\u{11B2}", - nfkc: "\u{D59B}", - nfkd: "\u{1112}\u{1163}\u{11B2}", - }, - NormalizationTest { - source: "\u{D59C}", - nfc: "\u{D59C}", - nfd: "\u{1112}\u{1163}\u{11B3}", - nfkc: "\u{D59C}", - nfkd: "\u{1112}\u{1163}\u{11B3}", - }, - NormalizationTest { - source: "\u{D59D}", - nfc: "\u{D59D}", - nfd: "\u{1112}\u{1163}\u{11B4}", - nfkc: "\u{D59D}", - nfkd: "\u{1112}\u{1163}\u{11B4}", - }, - NormalizationTest { - source: "\u{D59E}", - nfc: "\u{D59E}", - nfd: "\u{1112}\u{1163}\u{11B5}", - nfkc: "\u{D59E}", - nfkd: "\u{1112}\u{1163}\u{11B5}", - }, - NormalizationTest { - source: "\u{D59F}", - nfc: "\u{D59F}", - nfd: "\u{1112}\u{1163}\u{11B6}", - nfkc: "\u{D59F}", - nfkd: "\u{1112}\u{1163}\u{11B6}", - }, - NormalizationTest { - source: "\u{D5A0}", - nfc: "\u{D5A0}", - nfd: "\u{1112}\u{1163}\u{11B7}", - nfkc: "\u{D5A0}", - nfkd: "\u{1112}\u{1163}\u{11B7}", - }, - NormalizationTest { - source: "\u{D5A1}", - nfc: "\u{D5A1}", - nfd: "\u{1112}\u{1163}\u{11B8}", - nfkc: "\u{D5A1}", - nfkd: "\u{1112}\u{1163}\u{11B8}", - }, - NormalizationTest { - source: "\u{D5A2}", - nfc: "\u{D5A2}", - nfd: "\u{1112}\u{1163}\u{11B9}", - nfkc: "\u{D5A2}", - nfkd: "\u{1112}\u{1163}\u{11B9}", - }, - NormalizationTest { - source: "\u{D5A3}", - nfc: "\u{D5A3}", - nfd: "\u{1112}\u{1163}\u{11BA}", - nfkc: "\u{D5A3}", - nfkd: "\u{1112}\u{1163}\u{11BA}", - }, - NormalizationTest { - source: "\u{D5A4}", - nfc: "\u{D5A4}", - nfd: "\u{1112}\u{1163}\u{11BB}", - nfkc: "\u{D5A4}", - nfkd: "\u{1112}\u{1163}\u{11BB}", - }, - NormalizationTest { - source: "\u{D5A5}", - nfc: "\u{D5A5}", - nfd: "\u{1112}\u{1163}\u{11BC}", - nfkc: "\u{D5A5}", - nfkd: "\u{1112}\u{1163}\u{11BC}", - }, - NormalizationTest { - source: "\u{D5A6}", - nfc: "\u{D5A6}", - nfd: "\u{1112}\u{1163}\u{11BD}", - nfkc: "\u{D5A6}", - nfkd: "\u{1112}\u{1163}\u{11BD}", - }, - NormalizationTest { - source: "\u{D5A7}", - nfc: "\u{D5A7}", - nfd: "\u{1112}\u{1163}\u{11BE}", - nfkc: "\u{D5A7}", - nfkd: "\u{1112}\u{1163}\u{11BE}", - }, - NormalizationTest { - source: "\u{D5A8}", - nfc: "\u{D5A8}", - nfd: "\u{1112}\u{1163}\u{11BF}", - nfkc: "\u{D5A8}", - nfkd: "\u{1112}\u{1163}\u{11BF}", - }, - NormalizationTest { - source: "\u{D5A9}", - nfc: "\u{D5A9}", - nfd: "\u{1112}\u{1163}\u{11C0}", - nfkc: "\u{D5A9}", - nfkd: "\u{1112}\u{1163}\u{11C0}", - }, - NormalizationTest { - source: "\u{D5AA}", - nfc: "\u{D5AA}", - nfd: "\u{1112}\u{1163}\u{11C1}", - nfkc: "\u{D5AA}", - nfkd: "\u{1112}\u{1163}\u{11C1}", - }, - NormalizationTest { - source: "\u{D5AB}", - nfc: "\u{D5AB}", - nfd: "\u{1112}\u{1163}\u{11C2}", - nfkc: "\u{D5AB}", - nfkd: "\u{1112}\u{1163}\u{11C2}", - }, - NormalizationTest { - source: "\u{D5AC}", - nfc: "\u{D5AC}", - nfd: "\u{1112}\u{1164}", - nfkc: "\u{D5AC}", - nfkd: "\u{1112}\u{1164}", - }, - NormalizationTest { - source: "\u{D5AD}", - nfc: "\u{D5AD}", - nfd: "\u{1112}\u{1164}\u{11A8}", - nfkc: "\u{D5AD}", - nfkd: "\u{1112}\u{1164}\u{11A8}", - }, - NormalizationTest { - source: "\u{D5AE}", - nfc: "\u{D5AE}", - nfd: "\u{1112}\u{1164}\u{11A9}", - nfkc: "\u{D5AE}", - nfkd: "\u{1112}\u{1164}\u{11A9}", - }, - NormalizationTest { - source: "\u{D5AF}", - nfc: "\u{D5AF}", - nfd: "\u{1112}\u{1164}\u{11AA}", - nfkc: "\u{D5AF}", - nfkd: "\u{1112}\u{1164}\u{11AA}", - }, - NormalizationTest { - source: "\u{D5B0}", - nfc: "\u{D5B0}", - nfd: "\u{1112}\u{1164}\u{11AB}", - nfkc: "\u{D5B0}", - nfkd: "\u{1112}\u{1164}\u{11AB}", - }, - NormalizationTest { - source: "\u{D5B1}", - nfc: "\u{D5B1}", - nfd: "\u{1112}\u{1164}\u{11AC}", - nfkc: "\u{D5B1}", - nfkd: "\u{1112}\u{1164}\u{11AC}", - }, - NormalizationTest { - source: "\u{D5B2}", - nfc: "\u{D5B2}", - nfd: "\u{1112}\u{1164}\u{11AD}", - nfkc: "\u{D5B2}", - nfkd: "\u{1112}\u{1164}\u{11AD}", - }, - NormalizationTest { - source: "\u{D5B3}", - nfc: "\u{D5B3}", - nfd: "\u{1112}\u{1164}\u{11AE}", - nfkc: "\u{D5B3}", - nfkd: "\u{1112}\u{1164}\u{11AE}", - }, - NormalizationTest { - source: "\u{D5B4}", - nfc: "\u{D5B4}", - nfd: "\u{1112}\u{1164}\u{11AF}", - nfkc: "\u{D5B4}", - nfkd: "\u{1112}\u{1164}\u{11AF}", - }, - NormalizationTest { - source: "\u{D5B5}", - nfc: "\u{D5B5}", - nfd: "\u{1112}\u{1164}\u{11B0}", - nfkc: "\u{D5B5}", - nfkd: "\u{1112}\u{1164}\u{11B0}", - }, - NormalizationTest { - source: "\u{D5B6}", - nfc: "\u{D5B6}", - nfd: "\u{1112}\u{1164}\u{11B1}", - nfkc: "\u{D5B6}", - nfkd: "\u{1112}\u{1164}\u{11B1}", - }, - NormalizationTest { - source: "\u{D5B7}", - nfc: "\u{D5B7}", - nfd: "\u{1112}\u{1164}\u{11B2}", - nfkc: "\u{D5B7}", - nfkd: "\u{1112}\u{1164}\u{11B2}", - }, - NormalizationTest { - source: "\u{D5B8}", - nfc: "\u{D5B8}", - nfd: "\u{1112}\u{1164}\u{11B3}", - nfkc: "\u{D5B8}", - nfkd: "\u{1112}\u{1164}\u{11B3}", - }, - NormalizationTest { - source: "\u{D5B9}", - nfc: "\u{D5B9}", - nfd: "\u{1112}\u{1164}\u{11B4}", - nfkc: "\u{D5B9}", - nfkd: "\u{1112}\u{1164}\u{11B4}", - }, - NormalizationTest { - source: "\u{D5BA}", - nfc: "\u{D5BA}", - nfd: "\u{1112}\u{1164}\u{11B5}", - nfkc: "\u{D5BA}", - nfkd: "\u{1112}\u{1164}\u{11B5}", - }, - NormalizationTest { - source: "\u{D5BB}", - nfc: "\u{D5BB}", - nfd: "\u{1112}\u{1164}\u{11B6}", - nfkc: "\u{D5BB}", - nfkd: "\u{1112}\u{1164}\u{11B6}", - }, - NormalizationTest { - source: "\u{D5BC}", - nfc: "\u{D5BC}", - nfd: "\u{1112}\u{1164}\u{11B7}", - nfkc: "\u{D5BC}", - nfkd: "\u{1112}\u{1164}\u{11B7}", - }, - NormalizationTest { - source: "\u{D5BD}", - nfc: "\u{D5BD}", - nfd: "\u{1112}\u{1164}\u{11B8}", - nfkc: "\u{D5BD}", - nfkd: "\u{1112}\u{1164}\u{11B8}", - }, - NormalizationTest { - source: "\u{D5BE}", - nfc: "\u{D5BE}", - nfd: "\u{1112}\u{1164}\u{11B9}", - nfkc: "\u{D5BE}", - nfkd: "\u{1112}\u{1164}\u{11B9}", - }, - NormalizationTest { - source: "\u{D5BF}", - nfc: "\u{D5BF}", - nfd: "\u{1112}\u{1164}\u{11BA}", - nfkc: "\u{D5BF}", - nfkd: "\u{1112}\u{1164}\u{11BA}", - }, - NormalizationTest { - source: "\u{D5C0}", - nfc: "\u{D5C0}", - nfd: "\u{1112}\u{1164}\u{11BB}", - nfkc: "\u{D5C0}", - nfkd: "\u{1112}\u{1164}\u{11BB}", - }, - NormalizationTest { - source: "\u{D5C1}", - nfc: "\u{D5C1}", - nfd: "\u{1112}\u{1164}\u{11BC}", - nfkc: "\u{D5C1}", - nfkd: "\u{1112}\u{1164}\u{11BC}", - }, - NormalizationTest { - source: "\u{D5C2}", - nfc: "\u{D5C2}", - nfd: "\u{1112}\u{1164}\u{11BD}", - nfkc: "\u{D5C2}", - nfkd: "\u{1112}\u{1164}\u{11BD}", - }, - NormalizationTest { - source: "\u{D5C3}", - nfc: "\u{D5C3}", - nfd: "\u{1112}\u{1164}\u{11BE}", - nfkc: "\u{D5C3}", - nfkd: "\u{1112}\u{1164}\u{11BE}", - }, - NormalizationTest { - source: "\u{D5C4}", - nfc: "\u{D5C4}", - nfd: "\u{1112}\u{1164}\u{11BF}", - nfkc: "\u{D5C4}", - nfkd: "\u{1112}\u{1164}\u{11BF}", - }, - NormalizationTest { - source: "\u{D5C5}", - nfc: "\u{D5C5}", - nfd: "\u{1112}\u{1164}\u{11C0}", - nfkc: "\u{D5C5}", - nfkd: "\u{1112}\u{1164}\u{11C0}", - }, - NormalizationTest { - source: "\u{D5C6}", - nfc: "\u{D5C6}", - nfd: "\u{1112}\u{1164}\u{11C1}", - nfkc: "\u{D5C6}", - nfkd: "\u{1112}\u{1164}\u{11C1}", - }, - NormalizationTest { - source: "\u{D5C7}", - nfc: "\u{D5C7}", - nfd: "\u{1112}\u{1164}\u{11C2}", - nfkc: "\u{D5C7}", - nfkd: "\u{1112}\u{1164}\u{11C2}", - }, - NormalizationTest { - source: "\u{D5C8}", - nfc: "\u{D5C8}", - nfd: "\u{1112}\u{1165}", - nfkc: "\u{D5C8}", - nfkd: "\u{1112}\u{1165}", - }, - NormalizationTest { - source: "\u{D5C9}", - nfc: "\u{D5C9}", - nfd: "\u{1112}\u{1165}\u{11A8}", - nfkc: "\u{D5C9}", - nfkd: "\u{1112}\u{1165}\u{11A8}", - }, - NormalizationTest { - source: "\u{D5CA}", - nfc: "\u{D5CA}", - nfd: "\u{1112}\u{1165}\u{11A9}", - nfkc: "\u{D5CA}", - nfkd: "\u{1112}\u{1165}\u{11A9}", - }, - NormalizationTest { - source: "\u{D5CB}", - nfc: "\u{D5CB}", - nfd: "\u{1112}\u{1165}\u{11AA}", - nfkc: "\u{D5CB}", - nfkd: "\u{1112}\u{1165}\u{11AA}", - }, - NormalizationTest { - source: "\u{D5CC}", - nfc: "\u{D5CC}", - nfd: "\u{1112}\u{1165}\u{11AB}", - nfkc: "\u{D5CC}", - nfkd: "\u{1112}\u{1165}\u{11AB}", - }, - NormalizationTest { - source: "\u{D5CD}", - nfc: "\u{D5CD}", - nfd: "\u{1112}\u{1165}\u{11AC}", - nfkc: "\u{D5CD}", - nfkd: "\u{1112}\u{1165}\u{11AC}", - }, - NormalizationTest { - source: "\u{D5CE}", - nfc: "\u{D5CE}", - nfd: "\u{1112}\u{1165}\u{11AD}", - nfkc: "\u{D5CE}", - nfkd: "\u{1112}\u{1165}\u{11AD}", - }, - NormalizationTest { - source: "\u{D5CF}", - nfc: "\u{D5CF}", - nfd: "\u{1112}\u{1165}\u{11AE}", - nfkc: "\u{D5CF}", - nfkd: "\u{1112}\u{1165}\u{11AE}", - }, - NormalizationTest { - source: "\u{D5D0}", - nfc: "\u{D5D0}", - nfd: "\u{1112}\u{1165}\u{11AF}", - nfkc: "\u{D5D0}", - nfkd: "\u{1112}\u{1165}\u{11AF}", - }, - NormalizationTest { - source: "\u{D5D1}", - nfc: "\u{D5D1}", - nfd: "\u{1112}\u{1165}\u{11B0}", - nfkc: "\u{D5D1}", - nfkd: "\u{1112}\u{1165}\u{11B0}", - }, - NormalizationTest { - source: "\u{D5D2}", - nfc: "\u{D5D2}", - nfd: "\u{1112}\u{1165}\u{11B1}", - nfkc: "\u{D5D2}", - nfkd: "\u{1112}\u{1165}\u{11B1}", - }, - NormalizationTest { - source: "\u{D5D3}", - nfc: "\u{D5D3}", - nfd: "\u{1112}\u{1165}\u{11B2}", - nfkc: "\u{D5D3}", - nfkd: "\u{1112}\u{1165}\u{11B2}", - }, - NormalizationTest { - source: "\u{D5D4}", - nfc: "\u{D5D4}", - nfd: "\u{1112}\u{1165}\u{11B3}", - nfkc: "\u{D5D4}", - nfkd: "\u{1112}\u{1165}\u{11B3}", - }, - NormalizationTest { - source: "\u{D5D5}", - nfc: "\u{D5D5}", - nfd: "\u{1112}\u{1165}\u{11B4}", - nfkc: "\u{D5D5}", - nfkd: "\u{1112}\u{1165}\u{11B4}", - }, - NormalizationTest { - source: "\u{D5D6}", - nfc: "\u{D5D6}", - nfd: "\u{1112}\u{1165}\u{11B5}", - nfkc: "\u{D5D6}", - nfkd: "\u{1112}\u{1165}\u{11B5}", - }, - NormalizationTest { - source: "\u{D5D7}", - nfc: "\u{D5D7}", - nfd: "\u{1112}\u{1165}\u{11B6}", - nfkc: "\u{D5D7}", - nfkd: "\u{1112}\u{1165}\u{11B6}", - }, - NormalizationTest { - source: "\u{D5D8}", - nfc: "\u{D5D8}", - nfd: "\u{1112}\u{1165}\u{11B7}", - nfkc: "\u{D5D8}", - nfkd: "\u{1112}\u{1165}\u{11B7}", - }, - NormalizationTest { - source: "\u{D5D9}", - nfc: "\u{D5D9}", - nfd: "\u{1112}\u{1165}\u{11B8}", - nfkc: "\u{D5D9}", - nfkd: "\u{1112}\u{1165}\u{11B8}", - }, - NormalizationTest { - source: "\u{D5DA}", - nfc: "\u{D5DA}", - nfd: "\u{1112}\u{1165}\u{11B9}", - nfkc: "\u{D5DA}", - nfkd: "\u{1112}\u{1165}\u{11B9}", - }, - NormalizationTest { - source: "\u{D5DB}", - nfc: "\u{D5DB}", - nfd: "\u{1112}\u{1165}\u{11BA}", - nfkc: "\u{D5DB}", - nfkd: "\u{1112}\u{1165}\u{11BA}", - }, - NormalizationTest { - source: "\u{D5DC}", - nfc: "\u{D5DC}", - nfd: "\u{1112}\u{1165}\u{11BB}", - nfkc: "\u{D5DC}", - nfkd: "\u{1112}\u{1165}\u{11BB}", - }, - NormalizationTest { - source: "\u{D5DD}", - nfc: "\u{D5DD}", - nfd: "\u{1112}\u{1165}\u{11BC}", - nfkc: "\u{D5DD}", - nfkd: "\u{1112}\u{1165}\u{11BC}", - }, - NormalizationTest { - source: "\u{D5DE}", - nfc: "\u{D5DE}", - nfd: "\u{1112}\u{1165}\u{11BD}", - nfkc: "\u{D5DE}", - nfkd: "\u{1112}\u{1165}\u{11BD}", - }, - NormalizationTest { - source: "\u{D5DF}", - nfc: "\u{D5DF}", - nfd: "\u{1112}\u{1165}\u{11BE}", - nfkc: "\u{D5DF}", - nfkd: "\u{1112}\u{1165}\u{11BE}", - }, - NormalizationTest { - source: "\u{D5E0}", - nfc: "\u{D5E0}", - nfd: "\u{1112}\u{1165}\u{11BF}", - nfkc: "\u{D5E0}", - nfkd: "\u{1112}\u{1165}\u{11BF}", - }, - NormalizationTest { - source: "\u{D5E1}", - nfc: "\u{D5E1}", - nfd: "\u{1112}\u{1165}\u{11C0}", - nfkc: "\u{D5E1}", - nfkd: "\u{1112}\u{1165}\u{11C0}", - }, - NormalizationTest { - source: "\u{D5E2}", - nfc: "\u{D5E2}", - nfd: "\u{1112}\u{1165}\u{11C1}", - nfkc: "\u{D5E2}", - nfkd: "\u{1112}\u{1165}\u{11C1}", - }, - NormalizationTest { - source: "\u{D5E3}", - nfc: "\u{D5E3}", - nfd: "\u{1112}\u{1165}\u{11C2}", - nfkc: "\u{D5E3}", - nfkd: "\u{1112}\u{1165}\u{11C2}", - }, - NormalizationTest { - source: "\u{D5E4}", - nfc: "\u{D5E4}", - nfd: "\u{1112}\u{1166}", - nfkc: "\u{D5E4}", - nfkd: "\u{1112}\u{1166}", - }, - NormalizationTest { - source: "\u{D5E5}", - nfc: "\u{D5E5}", - nfd: "\u{1112}\u{1166}\u{11A8}", - nfkc: "\u{D5E5}", - nfkd: "\u{1112}\u{1166}\u{11A8}", - }, - NormalizationTest { - source: "\u{D5E6}", - nfc: "\u{D5E6}", - nfd: "\u{1112}\u{1166}\u{11A9}", - nfkc: "\u{D5E6}", - nfkd: "\u{1112}\u{1166}\u{11A9}", - }, - NormalizationTest { - source: "\u{D5E7}", - nfc: "\u{D5E7}", - nfd: "\u{1112}\u{1166}\u{11AA}", - nfkc: "\u{D5E7}", - nfkd: "\u{1112}\u{1166}\u{11AA}", - }, - NormalizationTest { - source: "\u{D5E8}", - nfc: "\u{D5E8}", - nfd: "\u{1112}\u{1166}\u{11AB}", - nfkc: "\u{D5E8}", - nfkd: "\u{1112}\u{1166}\u{11AB}", - }, - NormalizationTest { - source: "\u{D5E9}", - nfc: "\u{D5E9}", - nfd: "\u{1112}\u{1166}\u{11AC}", - nfkc: "\u{D5E9}", - nfkd: "\u{1112}\u{1166}\u{11AC}", - }, - NormalizationTest { - source: "\u{D5EA}", - nfc: "\u{D5EA}", - nfd: "\u{1112}\u{1166}\u{11AD}", - nfkc: "\u{D5EA}", - nfkd: "\u{1112}\u{1166}\u{11AD}", - }, - NormalizationTest { - source: "\u{D5EB}", - nfc: "\u{D5EB}", - nfd: "\u{1112}\u{1166}\u{11AE}", - nfkc: "\u{D5EB}", - nfkd: "\u{1112}\u{1166}\u{11AE}", - }, - NormalizationTest { - source: "\u{D5EC}", - nfc: "\u{D5EC}", - nfd: "\u{1112}\u{1166}\u{11AF}", - nfkc: "\u{D5EC}", - nfkd: "\u{1112}\u{1166}\u{11AF}", - }, - NormalizationTest { - source: "\u{D5ED}", - nfc: "\u{D5ED}", - nfd: "\u{1112}\u{1166}\u{11B0}", - nfkc: "\u{D5ED}", - nfkd: "\u{1112}\u{1166}\u{11B0}", - }, - NormalizationTest { - source: "\u{D5EE}", - nfc: "\u{D5EE}", - nfd: "\u{1112}\u{1166}\u{11B1}", - nfkc: "\u{D5EE}", - nfkd: "\u{1112}\u{1166}\u{11B1}", - }, - NormalizationTest { - source: "\u{D5EF}", - nfc: "\u{D5EF}", - nfd: "\u{1112}\u{1166}\u{11B2}", - nfkc: "\u{D5EF}", - nfkd: "\u{1112}\u{1166}\u{11B2}", - }, - NormalizationTest { - source: "\u{D5F0}", - nfc: "\u{D5F0}", - nfd: "\u{1112}\u{1166}\u{11B3}", - nfkc: "\u{D5F0}", - nfkd: "\u{1112}\u{1166}\u{11B3}", - }, - NormalizationTest { - source: "\u{D5F1}", - nfc: "\u{D5F1}", - nfd: "\u{1112}\u{1166}\u{11B4}", - nfkc: "\u{D5F1}", - nfkd: "\u{1112}\u{1166}\u{11B4}", - }, - NormalizationTest { - source: "\u{D5F2}", - nfc: "\u{D5F2}", - nfd: "\u{1112}\u{1166}\u{11B5}", - nfkc: "\u{D5F2}", - nfkd: "\u{1112}\u{1166}\u{11B5}", - }, - NormalizationTest { - source: "\u{D5F3}", - nfc: "\u{D5F3}", - nfd: "\u{1112}\u{1166}\u{11B6}", - nfkc: "\u{D5F3}", - nfkd: "\u{1112}\u{1166}\u{11B6}", - }, - NormalizationTest { - source: "\u{D5F4}", - nfc: "\u{D5F4}", - nfd: "\u{1112}\u{1166}\u{11B7}", - nfkc: "\u{D5F4}", - nfkd: "\u{1112}\u{1166}\u{11B7}", - }, - NormalizationTest { - source: "\u{D5F5}", - nfc: "\u{D5F5}", - nfd: "\u{1112}\u{1166}\u{11B8}", - nfkc: "\u{D5F5}", - nfkd: "\u{1112}\u{1166}\u{11B8}", - }, - NormalizationTest { - source: "\u{D5F6}", - nfc: "\u{D5F6}", - nfd: "\u{1112}\u{1166}\u{11B9}", - nfkc: "\u{D5F6}", - nfkd: "\u{1112}\u{1166}\u{11B9}", - }, - NormalizationTest { - source: "\u{D5F7}", - nfc: "\u{D5F7}", - nfd: "\u{1112}\u{1166}\u{11BA}", - nfkc: "\u{D5F7}", - nfkd: "\u{1112}\u{1166}\u{11BA}", - }, - NormalizationTest { - source: "\u{D5F8}", - nfc: "\u{D5F8}", - nfd: "\u{1112}\u{1166}\u{11BB}", - nfkc: "\u{D5F8}", - nfkd: "\u{1112}\u{1166}\u{11BB}", - }, - NormalizationTest { - source: "\u{D5F9}", - nfc: "\u{D5F9}", - nfd: "\u{1112}\u{1166}\u{11BC}", - nfkc: "\u{D5F9}", - nfkd: "\u{1112}\u{1166}\u{11BC}", - }, - NormalizationTest { - source: "\u{D5FA}", - nfc: "\u{D5FA}", - nfd: "\u{1112}\u{1166}\u{11BD}", - nfkc: "\u{D5FA}", - nfkd: "\u{1112}\u{1166}\u{11BD}", - }, - NormalizationTest { - source: "\u{D5FB}", - nfc: "\u{D5FB}", - nfd: "\u{1112}\u{1166}\u{11BE}", - nfkc: "\u{D5FB}", - nfkd: "\u{1112}\u{1166}\u{11BE}", - }, - NormalizationTest { - source: "\u{D5FC}", - nfc: "\u{D5FC}", - nfd: "\u{1112}\u{1166}\u{11BF}", - nfkc: "\u{D5FC}", - nfkd: "\u{1112}\u{1166}\u{11BF}", - }, - NormalizationTest { - source: "\u{D5FD}", - nfc: "\u{D5FD}", - nfd: "\u{1112}\u{1166}\u{11C0}", - nfkc: "\u{D5FD}", - nfkd: "\u{1112}\u{1166}\u{11C0}", - }, - NormalizationTest { - source: "\u{D5FE}", - nfc: "\u{D5FE}", - nfd: "\u{1112}\u{1166}\u{11C1}", - nfkc: "\u{D5FE}", - nfkd: "\u{1112}\u{1166}\u{11C1}", - }, - NormalizationTest { - source: "\u{D5FF}", - nfc: "\u{D5FF}", - nfd: "\u{1112}\u{1166}\u{11C2}", - nfkc: "\u{D5FF}", - nfkd: "\u{1112}\u{1166}\u{11C2}", - }, - NormalizationTest { - source: "\u{D600}", - nfc: "\u{D600}", - nfd: "\u{1112}\u{1167}", - nfkc: "\u{D600}", - nfkd: "\u{1112}\u{1167}", - }, - NormalizationTest { - source: "\u{D601}", - nfc: "\u{D601}", - nfd: "\u{1112}\u{1167}\u{11A8}", - nfkc: "\u{D601}", - nfkd: "\u{1112}\u{1167}\u{11A8}", - }, - NormalizationTest { - source: "\u{D602}", - nfc: "\u{D602}", - nfd: "\u{1112}\u{1167}\u{11A9}", - nfkc: "\u{D602}", - nfkd: "\u{1112}\u{1167}\u{11A9}", - }, - NormalizationTest { - source: "\u{D603}", - nfc: "\u{D603}", - nfd: "\u{1112}\u{1167}\u{11AA}", - nfkc: "\u{D603}", - nfkd: "\u{1112}\u{1167}\u{11AA}", - }, - NormalizationTest { - source: "\u{D604}", - nfc: "\u{D604}", - nfd: "\u{1112}\u{1167}\u{11AB}", - nfkc: "\u{D604}", - nfkd: "\u{1112}\u{1167}\u{11AB}", - }, - NormalizationTest { - source: "\u{D605}", - nfc: "\u{D605}", - nfd: "\u{1112}\u{1167}\u{11AC}", - nfkc: "\u{D605}", - nfkd: "\u{1112}\u{1167}\u{11AC}", - }, - NormalizationTest { - source: "\u{D606}", - nfc: "\u{D606}", - nfd: "\u{1112}\u{1167}\u{11AD}", - nfkc: "\u{D606}", - nfkd: "\u{1112}\u{1167}\u{11AD}", - }, - NormalizationTest { - source: "\u{D607}", - nfc: "\u{D607}", - nfd: "\u{1112}\u{1167}\u{11AE}", - nfkc: "\u{D607}", - nfkd: "\u{1112}\u{1167}\u{11AE}", - }, - NormalizationTest { - source: "\u{D608}", - nfc: "\u{D608}", - nfd: "\u{1112}\u{1167}\u{11AF}", - nfkc: "\u{D608}", - nfkd: "\u{1112}\u{1167}\u{11AF}", - }, - NormalizationTest { - source: "\u{D609}", - nfc: "\u{D609}", - nfd: "\u{1112}\u{1167}\u{11B0}", - nfkc: "\u{D609}", - nfkd: "\u{1112}\u{1167}\u{11B0}", - }, - NormalizationTest { - source: "\u{D60A}", - nfc: "\u{D60A}", - nfd: "\u{1112}\u{1167}\u{11B1}", - nfkc: "\u{D60A}", - nfkd: "\u{1112}\u{1167}\u{11B1}", - }, - NormalizationTest { - source: "\u{D60B}", - nfc: "\u{D60B}", - nfd: "\u{1112}\u{1167}\u{11B2}", - nfkc: "\u{D60B}", - nfkd: "\u{1112}\u{1167}\u{11B2}", - }, - NormalizationTest { - source: "\u{D60C}", - nfc: "\u{D60C}", - nfd: "\u{1112}\u{1167}\u{11B3}", - nfkc: "\u{D60C}", - nfkd: "\u{1112}\u{1167}\u{11B3}", - }, - NormalizationTest { - source: "\u{D60D}", - nfc: "\u{D60D}", - nfd: "\u{1112}\u{1167}\u{11B4}", - nfkc: "\u{D60D}", - nfkd: "\u{1112}\u{1167}\u{11B4}", - }, - NormalizationTest { - source: "\u{D60E}", - nfc: "\u{D60E}", - nfd: "\u{1112}\u{1167}\u{11B5}", - nfkc: "\u{D60E}", - nfkd: "\u{1112}\u{1167}\u{11B5}", - }, - NormalizationTest { - source: "\u{D60F}", - nfc: "\u{D60F}", - nfd: "\u{1112}\u{1167}\u{11B6}", - nfkc: "\u{D60F}", - nfkd: "\u{1112}\u{1167}\u{11B6}", - }, - NormalizationTest { - source: "\u{D610}", - nfc: "\u{D610}", - nfd: "\u{1112}\u{1167}\u{11B7}", - nfkc: "\u{D610}", - nfkd: "\u{1112}\u{1167}\u{11B7}", - }, - NormalizationTest { - source: "\u{D611}", - nfc: "\u{D611}", - nfd: "\u{1112}\u{1167}\u{11B8}", - nfkc: "\u{D611}", - nfkd: "\u{1112}\u{1167}\u{11B8}", - }, - NormalizationTest { - source: "\u{D612}", - nfc: "\u{D612}", - nfd: "\u{1112}\u{1167}\u{11B9}", - nfkc: "\u{D612}", - nfkd: "\u{1112}\u{1167}\u{11B9}", - }, - NormalizationTest { - source: "\u{D613}", - nfc: "\u{D613}", - nfd: "\u{1112}\u{1167}\u{11BA}", - nfkc: "\u{D613}", - nfkd: "\u{1112}\u{1167}\u{11BA}", - }, - NormalizationTest { - source: "\u{D614}", - nfc: "\u{D614}", - nfd: "\u{1112}\u{1167}\u{11BB}", - nfkc: "\u{D614}", - nfkd: "\u{1112}\u{1167}\u{11BB}", - }, - NormalizationTest { - source: "\u{D615}", - nfc: "\u{D615}", - nfd: "\u{1112}\u{1167}\u{11BC}", - nfkc: "\u{D615}", - nfkd: "\u{1112}\u{1167}\u{11BC}", - }, - NormalizationTest { - source: "\u{D616}", - nfc: "\u{D616}", - nfd: "\u{1112}\u{1167}\u{11BD}", - nfkc: "\u{D616}", - nfkd: "\u{1112}\u{1167}\u{11BD}", - }, - NormalizationTest { - source: "\u{D617}", - nfc: "\u{D617}", - nfd: "\u{1112}\u{1167}\u{11BE}", - nfkc: "\u{D617}", - nfkd: "\u{1112}\u{1167}\u{11BE}", - }, - NormalizationTest { - source: "\u{D618}", - nfc: "\u{D618}", - nfd: "\u{1112}\u{1167}\u{11BF}", - nfkc: "\u{D618}", - nfkd: "\u{1112}\u{1167}\u{11BF}", - }, - NormalizationTest { - source: "\u{D619}", - nfc: "\u{D619}", - nfd: "\u{1112}\u{1167}\u{11C0}", - nfkc: "\u{D619}", - nfkd: "\u{1112}\u{1167}\u{11C0}", - }, - NormalizationTest { - source: "\u{D61A}", - nfc: "\u{D61A}", - nfd: "\u{1112}\u{1167}\u{11C1}", - nfkc: "\u{D61A}", - nfkd: "\u{1112}\u{1167}\u{11C1}", - }, - NormalizationTest { - source: "\u{D61B}", - nfc: "\u{D61B}", - nfd: "\u{1112}\u{1167}\u{11C2}", - nfkc: "\u{D61B}", - nfkd: "\u{1112}\u{1167}\u{11C2}", - }, - NormalizationTest { - source: "\u{D61C}", - nfc: "\u{D61C}", - nfd: "\u{1112}\u{1168}", - nfkc: "\u{D61C}", - nfkd: "\u{1112}\u{1168}", - }, - NormalizationTest { - source: "\u{D61D}", - nfc: "\u{D61D}", - nfd: "\u{1112}\u{1168}\u{11A8}", - nfkc: "\u{D61D}", - nfkd: "\u{1112}\u{1168}\u{11A8}", - }, - NormalizationTest { - source: "\u{D61E}", - nfc: "\u{D61E}", - nfd: "\u{1112}\u{1168}\u{11A9}", - nfkc: "\u{D61E}", - nfkd: "\u{1112}\u{1168}\u{11A9}", - }, - NormalizationTest { - source: "\u{D61F}", - nfc: "\u{D61F}", - nfd: "\u{1112}\u{1168}\u{11AA}", - nfkc: "\u{D61F}", - nfkd: "\u{1112}\u{1168}\u{11AA}", - }, - NormalizationTest { - source: "\u{D620}", - nfc: "\u{D620}", - nfd: "\u{1112}\u{1168}\u{11AB}", - nfkc: "\u{D620}", - nfkd: "\u{1112}\u{1168}\u{11AB}", - }, - NormalizationTest { - source: "\u{D621}", - nfc: "\u{D621}", - nfd: "\u{1112}\u{1168}\u{11AC}", - nfkc: "\u{D621}", - nfkd: "\u{1112}\u{1168}\u{11AC}", - }, - NormalizationTest { - source: "\u{D622}", - nfc: "\u{D622}", - nfd: "\u{1112}\u{1168}\u{11AD}", - nfkc: "\u{D622}", - nfkd: "\u{1112}\u{1168}\u{11AD}", - }, - NormalizationTest { - source: "\u{D623}", - nfc: "\u{D623}", - nfd: "\u{1112}\u{1168}\u{11AE}", - nfkc: "\u{D623}", - nfkd: "\u{1112}\u{1168}\u{11AE}", - }, - NormalizationTest { - source: "\u{D624}", - nfc: "\u{D624}", - nfd: "\u{1112}\u{1168}\u{11AF}", - nfkc: "\u{D624}", - nfkd: "\u{1112}\u{1168}\u{11AF}", - }, - NormalizationTest { - source: "\u{D625}", - nfc: "\u{D625}", - nfd: "\u{1112}\u{1168}\u{11B0}", - nfkc: "\u{D625}", - nfkd: "\u{1112}\u{1168}\u{11B0}", - }, - NormalizationTest { - source: "\u{D626}", - nfc: "\u{D626}", - nfd: "\u{1112}\u{1168}\u{11B1}", - nfkc: "\u{D626}", - nfkd: "\u{1112}\u{1168}\u{11B1}", - }, - NormalizationTest { - source: "\u{D627}", - nfc: "\u{D627}", - nfd: "\u{1112}\u{1168}\u{11B2}", - nfkc: "\u{D627}", - nfkd: "\u{1112}\u{1168}\u{11B2}", - }, - NormalizationTest { - source: "\u{D628}", - nfc: "\u{D628}", - nfd: "\u{1112}\u{1168}\u{11B3}", - nfkc: "\u{D628}", - nfkd: "\u{1112}\u{1168}\u{11B3}", - }, - NormalizationTest { - source: "\u{D629}", - nfc: "\u{D629}", - nfd: "\u{1112}\u{1168}\u{11B4}", - nfkc: "\u{D629}", - nfkd: "\u{1112}\u{1168}\u{11B4}", - }, - NormalizationTest { - source: "\u{D62A}", - nfc: "\u{D62A}", - nfd: "\u{1112}\u{1168}\u{11B5}", - nfkc: "\u{D62A}", - nfkd: "\u{1112}\u{1168}\u{11B5}", - }, - NormalizationTest { - source: "\u{D62B}", - nfc: "\u{D62B}", - nfd: "\u{1112}\u{1168}\u{11B6}", - nfkc: "\u{D62B}", - nfkd: "\u{1112}\u{1168}\u{11B6}", - }, - NormalizationTest { - source: "\u{D62C}", - nfc: "\u{D62C}", - nfd: "\u{1112}\u{1168}\u{11B7}", - nfkc: "\u{D62C}", - nfkd: "\u{1112}\u{1168}\u{11B7}", - }, - NormalizationTest { - source: "\u{D62D}", - nfc: "\u{D62D}", - nfd: "\u{1112}\u{1168}\u{11B8}", - nfkc: "\u{D62D}", - nfkd: "\u{1112}\u{1168}\u{11B8}", - }, - NormalizationTest { - source: "\u{D62E}", - nfc: "\u{D62E}", - nfd: "\u{1112}\u{1168}\u{11B9}", - nfkc: "\u{D62E}", - nfkd: "\u{1112}\u{1168}\u{11B9}", - }, - NormalizationTest { - source: "\u{D62F}", - nfc: "\u{D62F}", - nfd: "\u{1112}\u{1168}\u{11BA}", - nfkc: "\u{D62F}", - nfkd: "\u{1112}\u{1168}\u{11BA}", - }, - NormalizationTest { - source: "\u{D630}", - nfc: "\u{D630}", - nfd: "\u{1112}\u{1168}\u{11BB}", - nfkc: "\u{D630}", - nfkd: "\u{1112}\u{1168}\u{11BB}", - }, - NormalizationTest { - source: "\u{D631}", - nfc: "\u{D631}", - nfd: "\u{1112}\u{1168}\u{11BC}", - nfkc: "\u{D631}", - nfkd: "\u{1112}\u{1168}\u{11BC}", - }, - NormalizationTest { - source: "\u{D632}", - nfc: "\u{D632}", - nfd: "\u{1112}\u{1168}\u{11BD}", - nfkc: "\u{D632}", - nfkd: "\u{1112}\u{1168}\u{11BD}", - }, - NormalizationTest { - source: "\u{D633}", - nfc: "\u{D633}", - nfd: "\u{1112}\u{1168}\u{11BE}", - nfkc: "\u{D633}", - nfkd: "\u{1112}\u{1168}\u{11BE}", - }, - NormalizationTest { - source: "\u{D634}", - nfc: "\u{D634}", - nfd: "\u{1112}\u{1168}\u{11BF}", - nfkc: "\u{D634}", - nfkd: "\u{1112}\u{1168}\u{11BF}", - }, - NormalizationTest { - source: "\u{D635}", - nfc: "\u{D635}", - nfd: "\u{1112}\u{1168}\u{11C0}", - nfkc: "\u{D635}", - nfkd: "\u{1112}\u{1168}\u{11C0}", - }, - NormalizationTest { - source: "\u{D636}", - nfc: "\u{D636}", - nfd: "\u{1112}\u{1168}\u{11C1}", - nfkc: "\u{D636}", - nfkd: "\u{1112}\u{1168}\u{11C1}", - }, - NormalizationTest { - source: "\u{D637}", - nfc: "\u{D637}", - nfd: "\u{1112}\u{1168}\u{11C2}", - nfkc: "\u{D637}", - nfkd: "\u{1112}\u{1168}\u{11C2}", - }, - NormalizationTest { - source: "\u{D638}", - nfc: "\u{D638}", - nfd: "\u{1112}\u{1169}", - nfkc: "\u{D638}", - nfkd: "\u{1112}\u{1169}", - }, - NormalizationTest { - source: "\u{D639}", - nfc: "\u{D639}", - nfd: "\u{1112}\u{1169}\u{11A8}", - nfkc: "\u{D639}", - nfkd: "\u{1112}\u{1169}\u{11A8}", - }, - NormalizationTest { - source: "\u{D63A}", - nfc: "\u{D63A}", - nfd: "\u{1112}\u{1169}\u{11A9}", - nfkc: "\u{D63A}", - nfkd: "\u{1112}\u{1169}\u{11A9}", - }, - NormalizationTest { - source: "\u{D63B}", - nfc: "\u{D63B}", - nfd: "\u{1112}\u{1169}\u{11AA}", - nfkc: "\u{D63B}", - nfkd: "\u{1112}\u{1169}\u{11AA}", - }, - NormalizationTest { - source: "\u{D63C}", - nfc: "\u{D63C}", - nfd: "\u{1112}\u{1169}\u{11AB}", - nfkc: "\u{D63C}", - nfkd: "\u{1112}\u{1169}\u{11AB}", - }, - NormalizationTest { - source: "\u{D63D}", - nfc: "\u{D63D}", - nfd: "\u{1112}\u{1169}\u{11AC}", - nfkc: "\u{D63D}", - nfkd: "\u{1112}\u{1169}\u{11AC}", - }, - NormalizationTest { - source: "\u{D63E}", - nfc: "\u{D63E}", - nfd: "\u{1112}\u{1169}\u{11AD}", - nfkc: "\u{D63E}", - nfkd: "\u{1112}\u{1169}\u{11AD}", - }, - NormalizationTest { - source: "\u{D63F}", - nfc: "\u{D63F}", - nfd: "\u{1112}\u{1169}\u{11AE}", - nfkc: "\u{D63F}", - nfkd: "\u{1112}\u{1169}\u{11AE}", - }, - NormalizationTest { - source: "\u{D640}", - nfc: "\u{D640}", - nfd: "\u{1112}\u{1169}\u{11AF}", - nfkc: "\u{D640}", - nfkd: "\u{1112}\u{1169}\u{11AF}", - }, - NormalizationTest { - source: "\u{D641}", - nfc: "\u{D641}", - nfd: "\u{1112}\u{1169}\u{11B0}", - nfkc: "\u{D641}", - nfkd: "\u{1112}\u{1169}\u{11B0}", - }, - NormalizationTest { - source: "\u{D642}", - nfc: "\u{D642}", - nfd: "\u{1112}\u{1169}\u{11B1}", - nfkc: "\u{D642}", - nfkd: "\u{1112}\u{1169}\u{11B1}", - }, - NormalizationTest { - source: "\u{D643}", - nfc: "\u{D643}", - nfd: "\u{1112}\u{1169}\u{11B2}", - nfkc: "\u{D643}", - nfkd: "\u{1112}\u{1169}\u{11B2}", - }, - NormalizationTest { - source: "\u{D644}", - nfc: "\u{D644}", - nfd: "\u{1112}\u{1169}\u{11B3}", - nfkc: "\u{D644}", - nfkd: "\u{1112}\u{1169}\u{11B3}", - }, - NormalizationTest { - source: "\u{D645}", - nfc: "\u{D645}", - nfd: "\u{1112}\u{1169}\u{11B4}", - nfkc: "\u{D645}", - nfkd: "\u{1112}\u{1169}\u{11B4}", - }, - NormalizationTest { - source: "\u{D646}", - nfc: "\u{D646}", - nfd: "\u{1112}\u{1169}\u{11B5}", - nfkc: "\u{D646}", - nfkd: "\u{1112}\u{1169}\u{11B5}", - }, - NormalizationTest { - source: "\u{D647}", - nfc: "\u{D647}", - nfd: "\u{1112}\u{1169}\u{11B6}", - nfkc: "\u{D647}", - nfkd: "\u{1112}\u{1169}\u{11B6}", - }, - NormalizationTest { - source: "\u{D648}", - nfc: "\u{D648}", - nfd: "\u{1112}\u{1169}\u{11B7}", - nfkc: "\u{D648}", - nfkd: "\u{1112}\u{1169}\u{11B7}", - }, - NormalizationTest { - source: "\u{D649}", - nfc: "\u{D649}", - nfd: "\u{1112}\u{1169}\u{11B8}", - nfkc: "\u{D649}", - nfkd: "\u{1112}\u{1169}\u{11B8}", - }, - NormalizationTest { - source: "\u{D64A}", - nfc: "\u{D64A}", - nfd: "\u{1112}\u{1169}\u{11B9}", - nfkc: "\u{D64A}", - nfkd: "\u{1112}\u{1169}\u{11B9}", - }, - NormalizationTest { - source: "\u{D64B}", - nfc: "\u{D64B}", - nfd: "\u{1112}\u{1169}\u{11BA}", - nfkc: "\u{D64B}", - nfkd: "\u{1112}\u{1169}\u{11BA}", - }, - NormalizationTest { - source: "\u{D64C}", - nfc: "\u{D64C}", - nfd: "\u{1112}\u{1169}\u{11BB}", - nfkc: "\u{D64C}", - nfkd: "\u{1112}\u{1169}\u{11BB}", - }, - NormalizationTest { - source: "\u{D64D}", - nfc: "\u{D64D}", - nfd: "\u{1112}\u{1169}\u{11BC}", - nfkc: "\u{D64D}", - nfkd: "\u{1112}\u{1169}\u{11BC}", - }, - NormalizationTest { - source: "\u{D64E}", - nfc: "\u{D64E}", - nfd: "\u{1112}\u{1169}\u{11BD}", - nfkc: "\u{D64E}", - nfkd: "\u{1112}\u{1169}\u{11BD}", - }, - NormalizationTest { - source: "\u{D64F}", - nfc: "\u{D64F}", - nfd: "\u{1112}\u{1169}\u{11BE}", - nfkc: "\u{D64F}", - nfkd: "\u{1112}\u{1169}\u{11BE}", - }, - NormalizationTest { - source: "\u{D650}", - nfc: "\u{D650}", - nfd: "\u{1112}\u{1169}\u{11BF}", - nfkc: "\u{D650}", - nfkd: "\u{1112}\u{1169}\u{11BF}", - }, - NormalizationTest { - source: "\u{D651}", - nfc: "\u{D651}", - nfd: "\u{1112}\u{1169}\u{11C0}", - nfkc: "\u{D651}", - nfkd: "\u{1112}\u{1169}\u{11C0}", - }, - NormalizationTest { - source: "\u{D652}", - nfc: "\u{D652}", - nfd: "\u{1112}\u{1169}\u{11C1}", - nfkc: "\u{D652}", - nfkd: "\u{1112}\u{1169}\u{11C1}", - }, - NormalizationTest { - source: "\u{D653}", - nfc: "\u{D653}", - nfd: "\u{1112}\u{1169}\u{11C2}", - nfkc: "\u{D653}", - nfkd: "\u{1112}\u{1169}\u{11C2}", - }, - NormalizationTest { - source: "\u{D654}", - nfc: "\u{D654}", - nfd: "\u{1112}\u{116A}", - nfkc: "\u{D654}", - nfkd: "\u{1112}\u{116A}", - }, - NormalizationTest { - source: "\u{D655}", - nfc: "\u{D655}", - nfd: "\u{1112}\u{116A}\u{11A8}", - nfkc: "\u{D655}", - nfkd: "\u{1112}\u{116A}\u{11A8}", - }, - NormalizationTest { - source: "\u{D656}", - nfc: "\u{D656}", - nfd: "\u{1112}\u{116A}\u{11A9}", - nfkc: "\u{D656}", - nfkd: "\u{1112}\u{116A}\u{11A9}", - }, - NormalizationTest { - source: "\u{D657}", - nfc: "\u{D657}", - nfd: "\u{1112}\u{116A}\u{11AA}", - nfkc: "\u{D657}", - nfkd: "\u{1112}\u{116A}\u{11AA}", - }, - NormalizationTest { - source: "\u{D658}", - nfc: "\u{D658}", - nfd: "\u{1112}\u{116A}\u{11AB}", - nfkc: "\u{D658}", - nfkd: "\u{1112}\u{116A}\u{11AB}", - }, - NormalizationTest { - source: "\u{D659}", - nfc: "\u{D659}", - nfd: "\u{1112}\u{116A}\u{11AC}", - nfkc: "\u{D659}", - nfkd: "\u{1112}\u{116A}\u{11AC}", - }, - NormalizationTest { - source: "\u{D65A}", - nfc: "\u{D65A}", - nfd: "\u{1112}\u{116A}\u{11AD}", - nfkc: "\u{D65A}", - nfkd: "\u{1112}\u{116A}\u{11AD}", - }, - NormalizationTest { - source: "\u{D65B}", - nfc: "\u{D65B}", - nfd: "\u{1112}\u{116A}\u{11AE}", - nfkc: "\u{D65B}", - nfkd: "\u{1112}\u{116A}\u{11AE}", - }, - NormalizationTest { - source: "\u{D65C}", - nfc: "\u{D65C}", - nfd: "\u{1112}\u{116A}\u{11AF}", - nfkc: "\u{D65C}", - nfkd: "\u{1112}\u{116A}\u{11AF}", - }, - NormalizationTest { - source: "\u{D65D}", - nfc: "\u{D65D}", - nfd: "\u{1112}\u{116A}\u{11B0}", - nfkc: "\u{D65D}", - nfkd: "\u{1112}\u{116A}\u{11B0}", - }, - NormalizationTest { - source: "\u{D65E}", - nfc: "\u{D65E}", - nfd: "\u{1112}\u{116A}\u{11B1}", - nfkc: "\u{D65E}", - nfkd: "\u{1112}\u{116A}\u{11B1}", - }, - NormalizationTest { - source: "\u{D65F}", - nfc: "\u{D65F}", - nfd: "\u{1112}\u{116A}\u{11B2}", - nfkc: "\u{D65F}", - nfkd: "\u{1112}\u{116A}\u{11B2}", - }, - NormalizationTest { - source: "\u{D660}", - nfc: "\u{D660}", - nfd: "\u{1112}\u{116A}\u{11B3}", - nfkc: "\u{D660}", - nfkd: "\u{1112}\u{116A}\u{11B3}", - }, - NormalizationTest { - source: "\u{D661}", - nfc: "\u{D661}", - nfd: "\u{1112}\u{116A}\u{11B4}", - nfkc: "\u{D661}", - nfkd: "\u{1112}\u{116A}\u{11B4}", - }, - NormalizationTest { - source: "\u{D662}", - nfc: "\u{D662}", - nfd: "\u{1112}\u{116A}\u{11B5}", - nfkc: "\u{D662}", - nfkd: "\u{1112}\u{116A}\u{11B5}", - }, - NormalizationTest { - source: "\u{D663}", - nfc: "\u{D663}", - nfd: "\u{1112}\u{116A}\u{11B6}", - nfkc: "\u{D663}", - nfkd: "\u{1112}\u{116A}\u{11B6}", - }, - NormalizationTest { - source: "\u{D664}", - nfc: "\u{D664}", - nfd: "\u{1112}\u{116A}\u{11B7}", - nfkc: "\u{D664}", - nfkd: "\u{1112}\u{116A}\u{11B7}", - }, - NormalizationTest { - source: "\u{D665}", - nfc: "\u{D665}", - nfd: "\u{1112}\u{116A}\u{11B8}", - nfkc: "\u{D665}", - nfkd: "\u{1112}\u{116A}\u{11B8}", - }, - NormalizationTest { - source: "\u{D666}", - nfc: "\u{D666}", - nfd: "\u{1112}\u{116A}\u{11B9}", - nfkc: "\u{D666}", - nfkd: "\u{1112}\u{116A}\u{11B9}", - }, - NormalizationTest { - source: "\u{D667}", - nfc: "\u{D667}", - nfd: "\u{1112}\u{116A}\u{11BA}", - nfkc: "\u{D667}", - nfkd: "\u{1112}\u{116A}\u{11BA}", - }, - NormalizationTest { - source: "\u{D668}", - nfc: "\u{D668}", - nfd: "\u{1112}\u{116A}\u{11BB}", - nfkc: "\u{D668}", - nfkd: "\u{1112}\u{116A}\u{11BB}", - }, - NormalizationTest { - source: "\u{D669}", - nfc: "\u{D669}", - nfd: "\u{1112}\u{116A}\u{11BC}", - nfkc: "\u{D669}", - nfkd: "\u{1112}\u{116A}\u{11BC}", - }, - NormalizationTest { - source: "\u{D66A}", - nfc: "\u{D66A}", - nfd: "\u{1112}\u{116A}\u{11BD}", - nfkc: "\u{D66A}", - nfkd: "\u{1112}\u{116A}\u{11BD}", - }, - NormalizationTest { - source: "\u{D66B}", - nfc: "\u{D66B}", - nfd: "\u{1112}\u{116A}\u{11BE}", - nfkc: "\u{D66B}", - nfkd: "\u{1112}\u{116A}\u{11BE}", - }, - NormalizationTest { - source: "\u{D66C}", - nfc: "\u{D66C}", - nfd: "\u{1112}\u{116A}\u{11BF}", - nfkc: "\u{D66C}", - nfkd: "\u{1112}\u{116A}\u{11BF}", - }, - NormalizationTest { - source: "\u{D66D}", - nfc: "\u{D66D}", - nfd: "\u{1112}\u{116A}\u{11C0}", - nfkc: "\u{D66D}", - nfkd: "\u{1112}\u{116A}\u{11C0}", - }, - NormalizationTest { - source: "\u{D66E}", - nfc: "\u{D66E}", - nfd: "\u{1112}\u{116A}\u{11C1}", - nfkc: "\u{D66E}", - nfkd: "\u{1112}\u{116A}\u{11C1}", - }, - NormalizationTest { - source: "\u{D66F}", - nfc: "\u{D66F}", - nfd: "\u{1112}\u{116A}\u{11C2}", - nfkc: "\u{D66F}", - nfkd: "\u{1112}\u{116A}\u{11C2}", - }, - NormalizationTest { - source: "\u{D670}", - nfc: "\u{D670}", - nfd: "\u{1112}\u{116B}", - nfkc: "\u{D670}", - nfkd: "\u{1112}\u{116B}", - }, - NormalizationTest { - source: "\u{D671}", - nfc: "\u{D671}", - nfd: "\u{1112}\u{116B}\u{11A8}", - nfkc: "\u{D671}", - nfkd: "\u{1112}\u{116B}\u{11A8}", - }, - NormalizationTest { - source: "\u{D672}", - nfc: "\u{D672}", - nfd: "\u{1112}\u{116B}\u{11A9}", - nfkc: "\u{D672}", - nfkd: "\u{1112}\u{116B}\u{11A9}", - }, - NormalizationTest { - source: "\u{D673}", - nfc: "\u{D673}", - nfd: "\u{1112}\u{116B}\u{11AA}", - nfkc: "\u{D673}", - nfkd: "\u{1112}\u{116B}\u{11AA}", - }, - NormalizationTest { - source: "\u{D674}", - nfc: "\u{D674}", - nfd: "\u{1112}\u{116B}\u{11AB}", - nfkc: "\u{D674}", - nfkd: "\u{1112}\u{116B}\u{11AB}", - }, - NormalizationTest { - source: "\u{D675}", - nfc: "\u{D675}", - nfd: "\u{1112}\u{116B}\u{11AC}", - nfkc: "\u{D675}", - nfkd: "\u{1112}\u{116B}\u{11AC}", - }, - NormalizationTest { - source: "\u{D676}", - nfc: "\u{D676}", - nfd: "\u{1112}\u{116B}\u{11AD}", - nfkc: "\u{D676}", - nfkd: "\u{1112}\u{116B}\u{11AD}", - }, - NormalizationTest { - source: "\u{D677}", - nfc: "\u{D677}", - nfd: "\u{1112}\u{116B}\u{11AE}", - nfkc: "\u{D677}", - nfkd: "\u{1112}\u{116B}\u{11AE}", - }, - NormalizationTest { - source: "\u{D678}", - nfc: "\u{D678}", - nfd: "\u{1112}\u{116B}\u{11AF}", - nfkc: "\u{D678}", - nfkd: "\u{1112}\u{116B}\u{11AF}", - }, - NormalizationTest { - source: "\u{D679}", - nfc: "\u{D679}", - nfd: "\u{1112}\u{116B}\u{11B0}", - nfkc: "\u{D679}", - nfkd: "\u{1112}\u{116B}\u{11B0}", - }, - NormalizationTest { - source: "\u{D67A}", - nfc: "\u{D67A}", - nfd: "\u{1112}\u{116B}\u{11B1}", - nfkc: "\u{D67A}", - nfkd: "\u{1112}\u{116B}\u{11B1}", - }, - NormalizationTest { - source: "\u{D67B}", - nfc: "\u{D67B}", - nfd: "\u{1112}\u{116B}\u{11B2}", - nfkc: "\u{D67B}", - nfkd: "\u{1112}\u{116B}\u{11B2}", - }, - NormalizationTest { - source: "\u{D67C}", - nfc: "\u{D67C}", - nfd: "\u{1112}\u{116B}\u{11B3}", - nfkc: "\u{D67C}", - nfkd: "\u{1112}\u{116B}\u{11B3}", - }, - NormalizationTest { - source: "\u{D67D}", - nfc: "\u{D67D}", - nfd: "\u{1112}\u{116B}\u{11B4}", - nfkc: "\u{D67D}", - nfkd: "\u{1112}\u{116B}\u{11B4}", - }, - NormalizationTest { - source: "\u{D67E}", - nfc: "\u{D67E}", - nfd: "\u{1112}\u{116B}\u{11B5}", - nfkc: "\u{D67E}", - nfkd: "\u{1112}\u{116B}\u{11B5}", - }, - NormalizationTest { - source: "\u{D67F}", - nfc: "\u{D67F}", - nfd: "\u{1112}\u{116B}\u{11B6}", - nfkc: "\u{D67F}", - nfkd: "\u{1112}\u{116B}\u{11B6}", - }, - NormalizationTest { - source: "\u{D680}", - nfc: "\u{D680}", - nfd: "\u{1112}\u{116B}\u{11B7}", - nfkc: "\u{D680}", - nfkd: "\u{1112}\u{116B}\u{11B7}", - }, - NormalizationTest { - source: "\u{D681}", - nfc: "\u{D681}", - nfd: "\u{1112}\u{116B}\u{11B8}", - nfkc: "\u{D681}", - nfkd: "\u{1112}\u{116B}\u{11B8}", - }, - NormalizationTest { - source: "\u{D682}", - nfc: "\u{D682}", - nfd: "\u{1112}\u{116B}\u{11B9}", - nfkc: "\u{D682}", - nfkd: "\u{1112}\u{116B}\u{11B9}", - }, - NormalizationTest { - source: "\u{D683}", - nfc: "\u{D683}", - nfd: "\u{1112}\u{116B}\u{11BA}", - nfkc: "\u{D683}", - nfkd: "\u{1112}\u{116B}\u{11BA}", - }, - NormalizationTest { - source: "\u{D684}", - nfc: "\u{D684}", - nfd: "\u{1112}\u{116B}\u{11BB}", - nfkc: "\u{D684}", - nfkd: "\u{1112}\u{116B}\u{11BB}", - }, - NormalizationTest { - source: "\u{D685}", - nfc: "\u{D685}", - nfd: "\u{1112}\u{116B}\u{11BC}", - nfkc: "\u{D685}", - nfkd: "\u{1112}\u{116B}\u{11BC}", - }, - NormalizationTest { - source: "\u{D686}", - nfc: "\u{D686}", - nfd: "\u{1112}\u{116B}\u{11BD}", - nfkc: "\u{D686}", - nfkd: "\u{1112}\u{116B}\u{11BD}", - }, - NormalizationTest { - source: "\u{D687}", - nfc: "\u{D687}", - nfd: "\u{1112}\u{116B}\u{11BE}", - nfkc: "\u{D687}", - nfkd: "\u{1112}\u{116B}\u{11BE}", - }, - NormalizationTest { - source: "\u{D688}", - nfc: "\u{D688}", - nfd: "\u{1112}\u{116B}\u{11BF}", - nfkc: "\u{D688}", - nfkd: "\u{1112}\u{116B}\u{11BF}", - }, - NormalizationTest { - source: "\u{D689}", - nfc: "\u{D689}", - nfd: "\u{1112}\u{116B}\u{11C0}", - nfkc: "\u{D689}", - nfkd: "\u{1112}\u{116B}\u{11C0}", - }, - NormalizationTest { - source: "\u{D68A}", - nfc: "\u{D68A}", - nfd: "\u{1112}\u{116B}\u{11C1}", - nfkc: "\u{D68A}", - nfkd: "\u{1112}\u{116B}\u{11C1}", - }, - NormalizationTest { - source: "\u{D68B}", - nfc: "\u{D68B}", - nfd: "\u{1112}\u{116B}\u{11C2}", - nfkc: "\u{D68B}", - nfkd: "\u{1112}\u{116B}\u{11C2}", - }, - NormalizationTest { - source: "\u{D68C}", - nfc: "\u{D68C}", - nfd: "\u{1112}\u{116C}", - nfkc: "\u{D68C}", - nfkd: "\u{1112}\u{116C}", - }, - NormalizationTest { - source: "\u{D68D}", - nfc: "\u{D68D}", - nfd: "\u{1112}\u{116C}\u{11A8}", - nfkc: "\u{D68D}", - nfkd: "\u{1112}\u{116C}\u{11A8}", - }, - NormalizationTest { - source: "\u{D68E}", - nfc: "\u{D68E}", - nfd: "\u{1112}\u{116C}\u{11A9}", - nfkc: "\u{D68E}", - nfkd: "\u{1112}\u{116C}\u{11A9}", - }, - NormalizationTest { - source: "\u{D68F}", - nfc: "\u{D68F}", - nfd: "\u{1112}\u{116C}\u{11AA}", - nfkc: "\u{D68F}", - nfkd: "\u{1112}\u{116C}\u{11AA}", - }, - NormalizationTest { - source: "\u{D690}", - nfc: "\u{D690}", - nfd: "\u{1112}\u{116C}\u{11AB}", - nfkc: "\u{D690}", - nfkd: "\u{1112}\u{116C}\u{11AB}", - }, - NormalizationTest { - source: "\u{D691}", - nfc: "\u{D691}", - nfd: "\u{1112}\u{116C}\u{11AC}", - nfkc: "\u{D691}", - nfkd: "\u{1112}\u{116C}\u{11AC}", - }, - NormalizationTest { - source: "\u{D692}", - nfc: "\u{D692}", - nfd: "\u{1112}\u{116C}\u{11AD}", - nfkc: "\u{D692}", - nfkd: "\u{1112}\u{116C}\u{11AD}", - }, - NormalizationTest { - source: "\u{D693}", - nfc: "\u{D693}", - nfd: "\u{1112}\u{116C}\u{11AE}", - nfkc: "\u{D693}", - nfkd: "\u{1112}\u{116C}\u{11AE}", - }, - NormalizationTest { - source: "\u{D694}", - nfc: "\u{D694}", - nfd: "\u{1112}\u{116C}\u{11AF}", - nfkc: "\u{D694}", - nfkd: "\u{1112}\u{116C}\u{11AF}", - }, - NormalizationTest { - source: "\u{D695}", - nfc: "\u{D695}", - nfd: "\u{1112}\u{116C}\u{11B0}", - nfkc: "\u{D695}", - nfkd: "\u{1112}\u{116C}\u{11B0}", - }, - NormalizationTest { - source: "\u{D696}", - nfc: "\u{D696}", - nfd: "\u{1112}\u{116C}\u{11B1}", - nfkc: "\u{D696}", - nfkd: "\u{1112}\u{116C}\u{11B1}", - }, - NormalizationTest { - source: "\u{D697}", - nfc: "\u{D697}", - nfd: "\u{1112}\u{116C}\u{11B2}", - nfkc: "\u{D697}", - nfkd: "\u{1112}\u{116C}\u{11B2}", - }, - NormalizationTest { - source: "\u{D698}", - nfc: "\u{D698}", - nfd: "\u{1112}\u{116C}\u{11B3}", - nfkc: "\u{D698}", - nfkd: "\u{1112}\u{116C}\u{11B3}", - }, - NormalizationTest { - source: "\u{D699}", - nfc: "\u{D699}", - nfd: "\u{1112}\u{116C}\u{11B4}", - nfkc: "\u{D699}", - nfkd: "\u{1112}\u{116C}\u{11B4}", - }, - NormalizationTest { - source: "\u{D69A}", - nfc: "\u{D69A}", - nfd: "\u{1112}\u{116C}\u{11B5}", - nfkc: "\u{D69A}", - nfkd: "\u{1112}\u{116C}\u{11B5}", - }, - NormalizationTest { - source: "\u{D69B}", - nfc: "\u{D69B}", - nfd: "\u{1112}\u{116C}\u{11B6}", - nfkc: "\u{D69B}", - nfkd: "\u{1112}\u{116C}\u{11B6}", - }, - NormalizationTest { - source: "\u{D69C}", - nfc: "\u{D69C}", - nfd: "\u{1112}\u{116C}\u{11B7}", - nfkc: "\u{D69C}", - nfkd: "\u{1112}\u{116C}\u{11B7}", - }, - NormalizationTest { - source: "\u{D69D}", - nfc: "\u{D69D}", - nfd: "\u{1112}\u{116C}\u{11B8}", - nfkc: "\u{D69D}", - nfkd: "\u{1112}\u{116C}\u{11B8}", - }, - NormalizationTest { - source: "\u{D69E}", - nfc: "\u{D69E}", - nfd: "\u{1112}\u{116C}\u{11B9}", - nfkc: "\u{D69E}", - nfkd: "\u{1112}\u{116C}\u{11B9}", - }, - NormalizationTest { - source: "\u{D69F}", - nfc: "\u{D69F}", - nfd: "\u{1112}\u{116C}\u{11BA}", - nfkc: "\u{D69F}", - nfkd: "\u{1112}\u{116C}\u{11BA}", - }, - NormalizationTest { - source: "\u{D6A0}", - nfc: "\u{D6A0}", - nfd: "\u{1112}\u{116C}\u{11BB}", - nfkc: "\u{D6A0}", - nfkd: "\u{1112}\u{116C}\u{11BB}", - }, - NormalizationTest { - source: "\u{D6A1}", - nfc: "\u{D6A1}", - nfd: "\u{1112}\u{116C}\u{11BC}", - nfkc: "\u{D6A1}", - nfkd: "\u{1112}\u{116C}\u{11BC}", - }, - NormalizationTest { - source: "\u{D6A2}", - nfc: "\u{D6A2}", - nfd: "\u{1112}\u{116C}\u{11BD}", - nfkc: "\u{D6A2}", - nfkd: "\u{1112}\u{116C}\u{11BD}", - }, - NormalizationTest { - source: "\u{D6A3}", - nfc: "\u{D6A3}", - nfd: "\u{1112}\u{116C}\u{11BE}", - nfkc: "\u{D6A3}", - nfkd: "\u{1112}\u{116C}\u{11BE}", - }, - NormalizationTest { - source: "\u{D6A4}", - nfc: "\u{D6A4}", - nfd: "\u{1112}\u{116C}\u{11BF}", - nfkc: "\u{D6A4}", - nfkd: "\u{1112}\u{116C}\u{11BF}", - }, - NormalizationTest { - source: "\u{D6A5}", - nfc: "\u{D6A5}", - nfd: "\u{1112}\u{116C}\u{11C0}", - nfkc: "\u{D6A5}", - nfkd: "\u{1112}\u{116C}\u{11C0}", - }, - NormalizationTest { - source: "\u{D6A6}", - nfc: "\u{D6A6}", - nfd: "\u{1112}\u{116C}\u{11C1}", - nfkc: "\u{D6A6}", - nfkd: "\u{1112}\u{116C}\u{11C1}", - }, - NormalizationTest { - source: "\u{D6A7}", - nfc: "\u{D6A7}", - nfd: "\u{1112}\u{116C}\u{11C2}", - nfkc: "\u{D6A7}", - nfkd: "\u{1112}\u{116C}\u{11C2}", - }, - NormalizationTest { - source: "\u{D6A8}", - nfc: "\u{D6A8}", - nfd: "\u{1112}\u{116D}", - nfkc: "\u{D6A8}", - nfkd: "\u{1112}\u{116D}", - }, - NormalizationTest { - source: "\u{D6A9}", - nfc: "\u{D6A9}", - nfd: "\u{1112}\u{116D}\u{11A8}", - nfkc: "\u{D6A9}", - nfkd: "\u{1112}\u{116D}\u{11A8}", - }, - NormalizationTest { - source: "\u{D6AA}", - nfc: "\u{D6AA}", - nfd: "\u{1112}\u{116D}\u{11A9}", - nfkc: "\u{D6AA}", - nfkd: "\u{1112}\u{116D}\u{11A9}", - }, - NormalizationTest { - source: "\u{D6AB}", - nfc: "\u{D6AB}", - nfd: "\u{1112}\u{116D}\u{11AA}", - nfkc: "\u{D6AB}", - nfkd: "\u{1112}\u{116D}\u{11AA}", - }, - NormalizationTest { - source: "\u{D6AC}", - nfc: "\u{D6AC}", - nfd: "\u{1112}\u{116D}\u{11AB}", - nfkc: "\u{D6AC}", - nfkd: "\u{1112}\u{116D}\u{11AB}", - }, - NormalizationTest { - source: "\u{D6AD}", - nfc: "\u{D6AD}", - nfd: "\u{1112}\u{116D}\u{11AC}", - nfkc: "\u{D6AD}", - nfkd: "\u{1112}\u{116D}\u{11AC}", - }, - NormalizationTest { - source: "\u{D6AE}", - nfc: "\u{D6AE}", - nfd: "\u{1112}\u{116D}\u{11AD}", - nfkc: "\u{D6AE}", - nfkd: "\u{1112}\u{116D}\u{11AD}", - }, - NormalizationTest { - source: "\u{D6AF}", - nfc: "\u{D6AF}", - nfd: "\u{1112}\u{116D}\u{11AE}", - nfkc: "\u{D6AF}", - nfkd: "\u{1112}\u{116D}\u{11AE}", - }, - NormalizationTest { - source: "\u{D6B0}", - nfc: "\u{D6B0}", - nfd: "\u{1112}\u{116D}\u{11AF}", - nfkc: "\u{D6B0}", - nfkd: "\u{1112}\u{116D}\u{11AF}", - }, - NormalizationTest { - source: "\u{D6B1}", - nfc: "\u{D6B1}", - nfd: "\u{1112}\u{116D}\u{11B0}", - nfkc: "\u{D6B1}", - nfkd: "\u{1112}\u{116D}\u{11B0}", - }, - NormalizationTest { - source: "\u{D6B2}", - nfc: "\u{D6B2}", - nfd: "\u{1112}\u{116D}\u{11B1}", - nfkc: "\u{D6B2}", - nfkd: "\u{1112}\u{116D}\u{11B1}", - }, - NormalizationTest { - source: "\u{D6B3}", - nfc: "\u{D6B3}", - nfd: "\u{1112}\u{116D}\u{11B2}", - nfkc: "\u{D6B3}", - nfkd: "\u{1112}\u{116D}\u{11B2}", - }, - NormalizationTest { - source: "\u{D6B4}", - nfc: "\u{D6B4}", - nfd: "\u{1112}\u{116D}\u{11B3}", - nfkc: "\u{D6B4}", - nfkd: "\u{1112}\u{116D}\u{11B3}", - }, - NormalizationTest { - source: "\u{D6B5}", - nfc: "\u{D6B5}", - nfd: "\u{1112}\u{116D}\u{11B4}", - nfkc: "\u{D6B5}", - nfkd: "\u{1112}\u{116D}\u{11B4}", - }, - NormalizationTest { - source: "\u{D6B6}", - nfc: "\u{D6B6}", - nfd: "\u{1112}\u{116D}\u{11B5}", - nfkc: "\u{D6B6}", - nfkd: "\u{1112}\u{116D}\u{11B5}", - }, - NormalizationTest { - source: "\u{D6B7}", - nfc: "\u{D6B7}", - nfd: "\u{1112}\u{116D}\u{11B6}", - nfkc: "\u{D6B7}", - nfkd: "\u{1112}\u{116D}\u{11B6}", - }, - NormalizationTest { - source: "\u{D6B8}", - nfc: "\u{D6B8}", - nfd: "\u{1112}\u{116D}\u{11B7}", - nfkc: "\u{D6B8}", - nfkd: "\u{1112}\u{116D}\u{11B7}", - }, - NormalizationTest { - source: "\u{D6B9}", - nfc: "\u{D6B9}", - nfd: "\u{1112}\u{116D}\u{11B8}", - nfkc: "\u{D6B9}", - nfkd: "\u{1112}\u{116D}\u{11B8}", - }, - NormalizationTest { - source: "\u{D6BA}", - nfc: "\u{D6BA}", - nfd: "\u{1112}\u{116D}\u{11B9}", - nfkc: "\u{D6BA}", - nfkd: "\u{1112}\u{116D}\u{11B9}", - }, - NormalizationTest { - source: "\u{D6BB}", - nfc: "\u{D6BB}", - nfd: "\u{1112}\u{116D}\u{11BA}", - nfkc: "\u{D6BB}", - nfkd: "\u{1112}\u{116D}\u{11BA}", - }, - NormalizationTest { - source: "\u{D6BC}", - nfc: "\u{D6BC}", - nfd: "\u{1112}\u{116D}\u{11BB}", - nfkc: "\u{D6BC}", - nfkd: "\u{1112}\u{116D}\u{11BB}", - }, - NormalizationTest { - source: "\u{D6BD}", - nfc: "\u{D6BD}", - nfd: "\u{1112}\u{116D}\u{11BC}", - nfkc: "\u{D6BD}", - nfkd: "\u{1112}\u{116D}\u{11BC}", - }, - NormalizationTest { - source: "\u{D6BE}", - nfc: "\u{D6BE}", - nfd: "\u{1112}\u{116D}\u{11BD}", - nfkc: "\u{D6BE}", - nfkd: "\u{1112}\u{116D}\u{11BD}", - }, - NormalizationTest { - source: "\u{D6BF}", - nfc: "\u{D6BF}", - nfd: "\u{1112}\u{116D}\u{11BE}", - nfkc: "\u{D6BF}", - nfkd: "\u{1112}\u{116D}\u{11BE}", - }, - NormalizationTest { - source: "\u{D6C0}", - nfc: "\u{D6C0}", - nfd: "\u{1112}\u{116D}\u{11BF}", - nfkc: "\u{D6C0}", - nfkd: "\u{1112}\u{116D}\u{11BF}", - }, - NormalizationTest { - source: "\u{D6C1}", - nfc: "\u{D6C1}", - nfd: "\u{1112}\u{116D}\u{11C0}", - nfkc: "\u{D6C1}", - nfkd: "\u{1112}\u{116D}\u{11C0}", - }, - NormalizationTest { - source: "\u{D6C2}", - nfc: "\u{D6C2}", - nfd: "\u{1112}\u{116D}\u{11C1}", - nfkc: "\u{D6C2}", - nfkd: "\u{1112}\u{116D}\u{11C1}", - }, - NormalizationTest { - source: "\u{D6C3}", - nfc: "\u{D6C3}", - nfd: "\u{1112}\u{116D}\u{11C2}", - nfkc: "\u{D6C3}", - nfkd: "\u{1112}\u{116D}\u{11C2}", - }, - NormalizationTest { - source: "\u{D6C4}", - nfc: "\u{D6C4}", - nfd: "\u{1112}\u{116E}", - nfkc: "\u{D6C4}", - nfkd: "\u{1112}\u{116E}", - }, - NormalizationTest { - source: "\u{D6C5}", - nfc: "\u{D6C5}", - nfd: "\u{1112}\u{116E}\u{11A8}", - nfkc: "\u{D6C5}", - nfkd: "\u{1112}\u{116E}\u{11A8}", - }, - NormalizationTest { - source: "\u{D6C6}", - nfc: "\u{D6C6}", - nfd: "\u{1112}\u{116E}\u{11A9}", - nfkc: "\u{D6C6}", - nfkd: "\u{1112}\u{116E}\u{11A9}", - }, - NormalizationTest { - source: "\u{D6C7}", - nfc: "\u{D6C7}", - nfd: "\u{1112}\u{116E}\u{11AA}", - nfkc: "\u{D6C7}", - nfkd: "\u{1112}\u{116E}\u{11AA}", - }, - NormalizationTest { - source: "\u{D6C8}", - nfc: "\u{D6C8}", - nfd: "\u{1112}\u{116E}\u{11AB}", - nfkc: "\u{D6C8}", - nfkd: "\u{1112}\u{116E}\u{11AB}", - }, - NormalizationTest { - source: "\u{D6C9}", - nfc: "\u{D6C9}", - nfd: "\u{1112}\u{116E}\u{11AC}", - nfkc: "\u{D6C9}", - nfkd: "\u{1112}\u{116E}\u{11AC}", - }, - NormalizationTest { - source: "\u{D6CA}", - nfc: "\u{D6CA}", - nfd: "\u{1112}\u{116E}\u{11AD}", - nfkc: "\u{D6CA}", - nfkd: "\u{1112}\u{116E}\u{11AD}", - }, - NormalizationTest { - source: "\u{D6CB}", - nfc: "\u{D6CB}", - nfd: "\u{1112}\u{116E}\u{11AE}", - nfkc: "\u{D6CB}", - nfkd: "\u{1112}\u{116E}\u{11AE}", - }, - NormalizationTest { - source: "\u{D6CC}", - nfc: "\u{D6CC}", - nfd: "\u{1112}\u{116E}\u{11AF}", - nfkc: "\u{D6CC}", - nfkd: "\u{1112}\u{116E}\u{11AF}", - }, - NormalizationTest { - source: "\u{D6CD}", - nfc: "\u{D6CD}", - nfd: "\u{1112}\u{116E}\u{11B0}", - nfkc: "\u{D6CD}", - nfkd: "\u{1112}\u{116E}\u{11B0}", - }, - NormalizationTest { - source: "\u{D6CE}", - nfc: "\u{D6CE}", - nfd: "\u{1112}\u{116E}\u{11B1}", - nfkc: "\u{D6CE}", - nfkd: "\u{1112}\u{116E}\u{11B1}", - }, - NormalizationTest { - source: "\u{D6CF}", - nfc: "\u{D6CF}", - nfd: "\u{1112}\u{116E}\u{11B2}", - nfkc: "\u{D6CF}", - nfkd: "\u{1112}\u{116E}\u{11B2}", - }, - NormalizationTest { - source: "\u{D6D0}", - nfc: "\u{D6D0}", - nfd: "\u{1112}\u{116E}\u{11B3}", - nfkc: "\u{D6D0}", - nfkd: "\u{1112}\u{116E}\u{11B3}", - }, - NormalizationTest { - source: "\u{D6D1}", - nfc: "\u{D6D1}", - nfd: "\u{1112}\u{116E}\u{11B4}", - nfkc: "\u{D6D1}", - nfkd: "\u{1112}\u{116E}\u{11B4}", - }, - NormalizationTest { - source: "\u{D6D2}", - nfc: "\u{D6D2}", - nfd: "\u{1112}\u{116E}\u{11B5}", - nfkc: "\u{D6D2}", - nfkd: "\u{1112}\u{116E}\u{11B5}", - }, - NormalizationTest { - source: "\u{D6D3}", - nfc: "\u{D6D3}", - nfd: "\u{1112}\u{116E}\u{11B6}", - nfkc: "\u{D6D3}", - nfkd: "\u{1112}\u{116E}\u{11B6}", - }, - NormalizationTest { - source: "\u{D6D4}", - nfc: "\u{D6D4}", - nfd: "\u{1112}\u{116E}\u{11B7}", - nfkc: "\u{D6D4}", - nfkd: "\u{1112}\u{116E}\u{11B7}", - }, - NormalizationTest { - source: "\u{D6D5}", - nfc: "\u{D6D5}", - nfd: "\u{1112}\u{116E}\u{11B8}", - nfkc: "\u{D6D5}", - nfkd: "\u{1112}\u{116E}\u{11B8}", - }, - NormalizationTest { - source: "\u{D6D6}", - nfc: "\u{D6D6}", - nfd: "\u{1112}\u{116E}\u{11B9}", - nfkc: "\u{D6D6}", - nfkd: "\u{1112}\u{116E}\u{11B9}", - }, - NormalizationTest { - source: "\u{D6D7}", - nfc: "\u{D6D7}", - nfd: "\u{1112}\u{116E}\u{11BA}", - nfkc: "\u{D6D7}", - nfkd: "\u{1112}\u{116E}\u{11BA}", - }, - NormalizationTest { - source: "\u{D6D8}", - nfc: "\u{D6D8}", - nfd: "\u{1112}\u{116E}\u{11BB}", - nfkc: "\u{D6D8}", - nfkd: "\u{1112}\u{116E}\u{11BB}", - }, - NormalizationTest { - source: "\u{D6D9}", - nfc: "\u{D6D9}", - nfd: "\u{1112}\u{116E}\u{11BC}", - nfkc: "\u{D6D9}", - nfkd: "\u{1112}\u{116E}\u{11BC}", - }, - NormalizationTest { - source: "\u{D6DA}", - nfc: "\u{D6DA}", - nfd: "\u{1112}\u{116E}\u{11BD}", - nfkc: "\u{D6DA}", - nfkd: "\u{1112}\u{116E}\u{11BD}", - }, - NormalizationTest { - source: "\u{D6DB}", - nfc: "\u{D6DB}", - nfd: "\u{1112}\u{116E}\u{11BE}", - nfkc: "\u{D6DB}", - nfkd: "\u{1112}\u{116E}\u{11BE}", - }, - NormalizationTest { - source: "\u{D6DC}", - nfc: "\u{D6DC}", - nfd: "\u{1112}\u{116E}\u{11BF}", - nfkc: "\u{D6DC}", - nfkd: "\u{1112}\u{116E}\u{11BF}", - }, - NormalizationTest { - source: "\u{D6DD}", - nfc: "\u{D6DD}", - nfd: "\u{1112}\u{116E}\u{11C0}", - nfkc: "\u{D6DD}", - nfkd: "\u{1112}\u{116E}\u{11C0}", - }, - NormalizationTest { - source: "\u{D6DE}", - nfc: "\u{D6DE}", - nfd: "\u{1112}\u{116E}\u{11C1}", - nfkc: "\u{D6DE}", - nfkd: "\u{1112}\u{116E}\u{11C1}", - }, - NormalizationTest { - source: "\u{D6DF}", - nfc: "\u{D6DF}", - nfd: "\u{1112}\u{116E}\u{11C2}", - nfkc: "\u{D6DF}", - nfkd: "\u{1112}\u{116E}\u{11C2}", - }, - NormalizationTest { - source: "\u{D6E0}", - nfc: "\u{D6E0}", - nfd: "\u{1112}\u{116F}", - nfkc: "\u{D6E0}", - nfkd: "\u{1112}\u{116F}", - }, - NormalizationTest { - source: "\u{D6E1}", - nfc: "\u{D6E1}", - nfd: "\u{1112}\u{116F}\u{11A8}", - nfkc: "\u{D6E1}", - nfkd: "\u{1112}\u{116F}\u{11A8}", - }, - NormalizationTest { - source: "\u{D6E2}", - nfc: "\u{D6E2}", - nfd: "\u{1112}\u{116F}\u{11A9}", - nfkc: "\u{D6E2}", - nfkd: "\u{1112}\u{116F}\u{11A9}", - }, - NormalizationTest { - source: "\u{D6E3}", - nfc: "\u{D6E3}", - nfd: "\u{1112}\u{116F}\u{11AA}", - nfkc: "\u{D6E3}", - nfkd: "\u{1112}\u{116F}\u{11AA}", - }, - NormalizationTest { - source: "\u{D6E4}", - nfc: "\u{D6E4}", - nfd: "\u{1112}\u{116F}\u{11AB}", - nfkc: "\u{D6E4}", - nfkd: "\u{1112}\u{116F}\u{11AB}", - }, - NormalizationTest { - source: "\u{D6E5}", - nfc: "\u{D6E5}", - nfd: "\u{1112}\u{116F}\u{11AC}", - nfkc: "\u{D6E5}", - nfkd: "\u{1112}\u{116F}\u{11AC}", - }, - NormalizationTest { - source: "\u{D6E6}", - nfc: "\u{D6E6}", - nfd: "\u{1112}\u{116F}\u{11AD}", - nfkc: "\u{D6E6}", - nfkd: "\u{1112}\u{116F}\u{11AD}", - }, - NormalizationTest { - source: "\u{D6E7}", - nfc: "\u{D6E7}", - nfd: "\u{1112}\u{116F}\u{11AE}", - nfkc: "\u{D6E7}", - nfkd: "\u{1112}\u{116F}\u{11AE}", - }, - NormalizationTest { - source: "\u{D6E8}", - nfc: "\u{D6E8}", - nfd: "\u{1112}\u{116F}\u{11AF}", - nfkc: "\u{D6E8}", - nfkd: "\u{1112}\u{116F}\u{11AF}", - }, - NormalizationTest { - source: "\u{D6E9}", - nfc: "\u{D6E9}", - nfd: "\u{1112}\u{116F}\u{11B0}", - nfkc: "\u{D6E9}", - nfkd: "\u{1112}\u{116F}\u{11B0}", - }, - NormalizationTest { - source: "\u{D6EA}", - nfc: "\u{D6EA}", - nfd: "\u{1112}\u{116F}\u{11B1}", - nfkc: "\u{D6EA}", - nfkd: "\u{1112}\u{116F}\u{11B1}", - }, - NormalizationTest { - source: "\u{D6EB}", - nfc: "\u{D6EB}", - nfd: "\u{1112}\u{116F}\u{11B2}", - nfkc: "\u{D6EB}", - nfkd: "\u{1112}\u{116F}\u{11B2}", - }, - NormalizationTest { - source: "\u{D6EC}", - nfc: "\u{D6EC}", - nfd: "\u{1112}\u{116F}\u{11B3}", - nfkc: "\u{D6EC}", - nfkd: "\u{1112}\u{116F}\u{11B3}", - }, - NormalizationTest { - source: "\u{D6ED}", - nfc: "\u{D6ED}", - nfd: "\u{1112}\u{116F}\u{11B4}", - nfkc: "\u{D6ED}", - nfkd: "\u{1112}\u{116F}\u{11B4}", - }, - NormalizationTest { - source: "\u{D6EE}", - nfc: "\u{D6EE}", - nfd: "\u{1112}\u{116F}\u{11B5}", - nfkc: "\u{D6EE}", - nfkd: "\u{1112}\u{116F}\u{11B5}", - }, - NormalizationTest { - source: "\u{D6EF}", - nfc: "\u{D6EF}", - nfd: "\u{1112}\u{116F}\u{11B6}", - nfkc: "\u{D6EF}", - nfkd: "\u{1112}\u{116F}\u{11B6}", - }, - NormalizationTest { - source: "\u{D6F0}", - nfc: "\u{D6F0}", - nfd: "\u{1112}\u{116F}\u{11B7}", - nfkc: "\u{D6F0}", - nfkd: "\u{1112}\u{116F}\u{11B7}", - }, - NormalizationTest { - source: "\u{D6F1}", - nfc: "\u{D6F1}", - nfd: "\u{1112}\u{116F}\u{11B8}", - nfkc: "\u{D6F1}", - nfkd: "\u{1112}\u{116F}\u{11B8}", - }, - NormalizationTest { - source: "\u{D6F2}", - nfc: "\u{D6F2}", - nfd: "\u{1112}\u{116F}\u{11B9}", - nfkc: "\u{D6F2}", - nfkd: "\u{1112}\u{116F}\u{11B9}", - }, - NormalizationTest { - source: "\u{D6F3}", - nfc: "\u{D6F3}", - nfd: "\u{1112}\u{116F}\u{11BA}", - nfkc: "\u{D6F3}", - nfkd: "\u{1112}\u{116F}\u{11BA}", - }, - NormalizationTest { - source: "\u{D6F4}", - nfc: "\u{D6F4}", - nfd: "\u{1112}\u{116F}\u{11BB}", - nfkc: "\u{D6F4}", - nfkd: "\u{1112}\u{116F}\u{11BB}", - }, - NormalizationTest { - source: "\u{D6F5}", - nfc: "\u{D6F5}", - nfd: "\u{1112}\u{116F}\u{11BC}", - nfkc: "\u{D6F5}", - nfkd: "\u{1112}\u{116F}\u{11BC}", - }, - NormalizationTest { - source: "\u{D6F6}", - nfc: "\u{D6F6}", - nfd: "\u{1112}\u{116F}\u{11BD}", - nfkc: "\u{D6F6}", - nfkd: "\u{1112}\u{116F}\u{11BD}", - }, - NormalizationTest { - source: "\u{D6F7}", - nfc: "\u{D6F7}", - nfd: "\u{1112}\u{116F}\u{11BE}", - nfkc: "\u{D6F7}", - nfkd: "\u{1112}\u{116F}\u{11BE}", - }, - NormalizationTest { - source: "\u{D6F8}", - nfc: "\u{D6F8}", - nfd: "\u{1112}\u{116F}\u{11BF}", - nfkc: "\u{D6F8}", - nfkd: "\u{1112}\u{116F}\u{11BF}", - }, - NormalizationTest { - source: "\u{D6F9}", - nfc: "\u{D6F9}", - nfd: "\u{1112}\u{116F}\u{11C0}", - nfkc: "\u{D6F9}", - nfkd: "\u{1112}\u{116F}\u{11C0}", - }, - NormalizationTest { - source: "\u{D6FA}", - nfc: "\u{D6FA}", - nfd: "\u{1112}\u{116F}\u{11C1}", - nfkc: "\u{D6FA}", - nfkd: "\u{1112}\u{116F}\u{11C1}", - }, - NormalizationTest { - source: "\u{D6FB}", - nfc: "\u{D6FB}", - nfd: "\u{1112}\u{116F}\u{11C2}", - nfkc: "\u{D6FB}", - nfkd: "\u{1112}\u{116F}\u{11C2}", - }, - NormalizationTest { - source: "\u{D6FC}", - nfc: "\u{D6FC}", - nfd: "\u{1112}\u{1170}", - nfkc: "\u{D6FC}", - nfkd: "\u{1112}\u{1170}", - }, - NormalizationTest { - source: "\u{D6FD}", - nfc: "\u{D6FD}", - nfd: "\u{1112}\u{1170}\u{11A8}", - nfkc: "\u{D6FD}", - nfkd: "\u{1112}\u{1170}\u{11A8}", - }, - NormalizationTest { - source: "\u{D6FE}", - nfc: "\u{D6FE}", - nfd: "\u{1112}\u{1170}\u{11A9}", - nfkc: "\u{D6FE}", - nfkd: "\u{1112}\u{1170}\u{11A9}", - }, - NormalizationTest { - source: "\u{D6FF}", - nfc: "\u{D6FF}", - nfd: "\u{1112}\u{1170}\u{11AA}", - nfkc: "\u{D6FF}", - nfkd: "\u{1112}\u{1170}\u{11AA}", - }, - NormalizationTest { - source: "\u{D700}", - nfc: "\u{D700}", - nfd: "\u{1112}\u{1170}\u{11AB}", - nfkc: "\u{D700}", - nfkd: "\u{1112}\u{1170}\u{11AB}", - }, - NormalizationTest { - source: "\u{D701}", - nfc: "\u{D701}", - nfd: "\u{1112}\u{1170}\u{11AC}", - nfkc: "\u{D701}", - nfkd: "\u{1112}\u{1170}\u{11AC}", - }, - NormalizationTest { - source: "\u{D702}", - nfc: "\u{D702}", - nfd: "\u{1112}\u{1170}\u{11AD}", - nfkc: "\u{D702}", - nfkd: "\u{1112}\u{1170}\u{11AD}", - }, - NormalizationTest { - source: "\u{D703}", - nfc: "\u{D703}", - nfd: "\u{1112}\u{1170}\u{11AE}", - nfkc: "\u{D703}", - nfkd: "\u{1112}\u{1170}\u{11AE}", - }, - NormalizationTest { - source: "\u{D704}", - nfc: "\u{D704}", - nfd: "\u{1112}\u{1170}\u{11AF}", - nfkc: "\u{D704}", - nfkd: "\u{1112}\u{1170}\u{11AF}", - }, - NormalizationTest { - source: "\u{D705}", - nfc: "\u{D705}", - nfd: "\u{1112}\u{1170}\u{11B0}", - nfkc: "\u{D705}", - nfkd: "\u{1112}\u{1170}\u{11B0}", - }, - NormalizationTest { - source: "\u{D706}", - nfc: "\u{D706}", - nfd: "\u{1112}\u{1170}\u{11B1}", - nfkc: "\u{D706}", - nfkd: "\u{1112}\u{1170}\u{11B1}", - }, - NormalizationTest { - source: "\u{D707}", - nfc: "\u{D707}", - nfd: "\u{1112}\u{1170}\u{11B2}", - nfkc: "\u{D707}", - nfkd: "\u{1112}\u{1170}\u{11B2}", - }, - NormalizationTest { - source: "\u{D708}", - nfc: "\u{D708}", - nfd: "\u{1112}\u{1170}\u{11B3}", - nfkc: "\u{D708}", - nfkd: "\u{1112}\u{1170}\u{11B3}", - }, - NormalizationTest { - source: "\u{D709}", - nfc: "\u{D709}", - nfd: "\u{1112}\u{1170}\u{11B4}", - nfkc: "\u{D709}", - nfkd: "\u{1112}\u{1170}\u{11B4}", - }, - NormalizationTest { - source: "\u{D70A}", - nfc: "\u{D70A}", - nfd: "\u{1112}\u{1170}\u{11B5}", - nfkc: "\u{D70A}", - nfkd: "\u{1112}\u{1170}\u{11B5}", - }, - NormalizationTest { - source: "\u{D70B}", - nfc: "\u{D70B}", - nfd: "\u{1112}\u{1170}\u{11B6}", - nfkc: "\u{D70B}", - nfkd: "\u{1112}\u{1170}\u{11B6}", - }, - NormalizationTest { - source: "\u{D70C}", - nfc: "\u{D70C}", - nfd: "\u{1112}\u{1170}\u{11B7}", - nfkc: "\u{D70C}", - nfkd: "\u{1112}\u{1170}\u{11B7}", - }, - NormalizationTest { - source: "\u{D70D}", - nfc: "\u{D70D}", - nfd: "\u{1112}\u{1170}\u{11B8}", - nfkc: "\u{D70D}", - nfkd: "\u{1112}\u{1170}\u{11B8}", - }, - NormalizationTest { - source: "\u{D70E}", - nfc: "\u{D70E}", - nfd: "\u{1112}\u{1170}\u{11B9}", - nfkc: "\u{D70E}", - nfkd: "\u{1112}\u{1170}\u{11B9}", - }, - NormalizationTest { - source: "\u{D70F}", - nfc: "\u{D70F}", - nfd: "\u{1112}\u{1170}\u{11BA}", - nfkc: "\u{D70F}", - nfkd: "\u{1112}\u{1170}\u{11BA}", - }, - NormalizationTest { - source: "\u{D710}", - nfc: "\u{D710}", - nfd: "\u{1112}\u{1170}\u{11BB}", - nfkc: "\u{D710}", - nfkd: "\u{1112}\u{1170}\u{11BB}", - }, - NormalizationTest { - source: "\u{D711}", - nfc: "\u{D711}", - nfd: "\u{1112}\u{1170}\u{11BC}", - nfkc: "\u{D711}", - nfkd: "\u{1112}\u{1170}\u{11BC}", - }, - NormalizationTest { - source: "\u{D712}", - nfc: "\u{D712}", - nfd: "\u{1112}\u{1170}\u{11BD}", - nfkc: "\u{D712}", - nfkd: "\u{1112}\u{1170}\u{11BD}", - }, - NormalizationTest { - source: "\u{D713}", - nfc: "\u{D713}", - nfd: "\u{1112}\u{1170}\u{11BE}", - nfkc: "\u{D713}", - nfkd: "\u{1112}\u{1170}\u{11BE}", - }, - NormalizationTest { - source: "\u{D714}", - nfc: "\u{D714}", - nfd: "\u{1112}\u{1170}\u{11BF}", - nfkc: "\u{D714}", - nfkd: "\u{1112}\u{1170}\u{11BF}", - }, - NormalizationTest { - source: "\u{D715}", - nfc: "\u{D715}", - nfd: "\u{1112}\u{1170}\u{11C0}", - nfkc: "\u{D715}", - nfkd: "\u{1112}\u{1170}\u{11C0}", - }, - NormalizationTest { - source: "\u{D716}", - nfc: "\u{D716}", - nfd: "\u{1112}\u{1170}\u{11C1}", - nfkc: "\u{D716}", - nfkd: "\u{1112}\u{1170}\u{11C1}", - }, - NormalizationTest { - source: "\u{D717}", - nfc: "\u{D717}", - nfd: "\u{1112}\u{1170}\u{11C2}", - nfkc: "\u{D717}", - nfkd: "\u{1112}\u{1170}\u{11C2}", - }, - NormalizationTest { - source: "\u{D718}", - nfc: "\u{D718}", - nfd: "\u{1112}\u{1171}", - nfkc: "\u{D718}", - nfkd: "\u{1112}\u{1171}", - }, - NormalizationTest { - source: "\u{D719}", - nfc: "\u{D719}", - nfd: "\u{1112}\u{1171}\u{11A8}", - nfkc: "\u{D719}", - nfkd: "\u{1112}\u{1171}\u{11A8}", - }, - NormalizationTest { - source: "\u{D71A}", - nfc: "\u{D71A}", - nfd: "\u{1112}\u{1171}\u{11A9}", - nfkc: "\u{D71A}", - nfkd: "\u{1112}\u{1171}\u{11A9}", - }, - NormalizationTest { - source: "\u{D71B}", - nfc: "\u{D71B}", - nfd: "\u{1112}\u{1171}\u{11AA}", - nfkc: "\u{D71B}", - nfkd: "\u{1112}\u{1171}\u{11AA}", - }, - NormalizationTest { - source: "\u{D71C}", - nfc: "\u{D71C}", - nfd: "\u{1112}\u{1171}\u{11AB}", - nfkc: "\u{D71C}", - nfkd: "\u{1112}\u{1171}\u{11AB}", - }, - NormalizationTest { - source: "\u{D71D}", - nfc: "\u{D71D}", - nfd: "\u{1112}\u{1171}\u{11AC}", - nfkc: "\u{D71D}", - nfkd: "\u{1112}\u{1171}\u{11AC}", - }, - NormalizationTest { - source: "\u{D71E}", - nfc: "\u{D71E}", - nfd: "\u{1112}\u{1171}\u{11AD}", - nfkc: "\u{D71E}", - nfkd: "\u{1112}\u{1171}\u{11AD}", - }, - NormalizationTest { - source: "\u{D71F}", - nfc: "\u{D71F}", - nfd: "\u{1112}\u{1171}\u{11AE}", - nfkc: "\u{D71F}", - nfkd: "\u{1112}\u{1171}\u{11AE}", - }, - NormalizationTest { - source: "\u{D720}", - nfc: "\u{D720}", - nfd: "\u{1112}\u{1171}\u{11AF}", - nfkc: "\u{D720}", - nfkd: "\u{1112}\u{1171}\u{11AF}", - }, - NormalizationTest { - source: "\u{D721}", - nfc: "\u{D721}", - nfd: "\u{1112}\u{1171}\u{11B0}", - nfkc: "\u{D721}", - nfkd: "\u{1112}\u{1171}\u{11B0}", - }, - NormalizationTest { - source: "\u{D722}", - nfc: "\u{D722}", - nfd: "\u{1112}\u{1171}\u{11B1}", - nfkc: "\u{D722}", - nfkd: "\u{1112}\u{1171}\u{11B1}", - }, - NormalizationTest { - source: "\u{D723}", - nfc: "\u{D723}", - nfd: "\u{1112}\u{1171}\u{11B2}", - nfkc: "\u{D723}", - nfkd: "\u{1112}\u{1171}\u{11B2}", - }, - NormalizationTest { - source: "\u{D724}", - nfc: "\u{D724}", - nfd: "\u{1112}\u{1171}\u{11B3}", - nfkc: "\u{D724}", - nfkd: "\u{1112}\u{1171}\u{11B3}", - }, - NormalizationTest { - source: "\u{D725}", - nfc: "\u{D725}", - nfd: "\u{1112}\u{1171}\u{11B4}", - nfkc: "\u{D725}", - nfkd: "\u{1112}\u{1171}\u{11B4}", - }, - NormalizationTest { - source: "\u{D726}", - nfc: "\u{D726}", - nfd: "\u{1112}\u{1171}\u{11B5}", - nfkc: "\u{D726}", - nfkd: "\u{1112}\u{1171}\u{11B5}", - }, - NormalizationTest { - source: "\u{D727}", - nfc: "\u{D727}", - nfd: "\u{1112}\u{1171}\u{11B6}", - nfkc: "\u{D727}", - nfkd: "\u{1112}\u{1171}\u{11B6}", - }, - NormalizationTest { - source: "\u{D728}", - nfc: "\u{D728}", - nfd: "\u{1112}\u{1171}\u{11B7}", - nfkc: "\u{D728}", - nfkd: "\u{1112}\u{1171}\u{11B7}", - }, - NormalizationTest { - source: "\u{D729}", - nfc: "\u{D729}", - nfd: "\u{1112}\u{1171}\u{11B8}", - nfkc: "\u{D729}", - nfkd: "\u{1112}\u{1171}\u{11B8}", - }, - NormalizationTest { - source: "\u{D72A}", - nfc: "\u{D72A}", - nfd: "\u{1112}\u{1171}\u{11B9}", - nfkc: "\u{D72A}", - nfkd: "\u{1112}\u{1171}\u{11B9}", - }, - NormalizationTest { - source: "\u{D72B}", - nfc: "\u{D72B}", - nfd: "\u{1112}\u{1171}\u{11BA}", - nfkc: "\u{D72B}", - nfkd: "\u{1112}\u{1171}\u{11BA}", - }, - NormalizationTest { - source: "\u{D72C}", - nfc: "\u{D72C}", - nfd: "\u{1112}\u{1171}\u{11BB}", - nfkc: "\u{D72C}", - nfkd: "\u{1112}\u{1171}\u{11BB}", - }, - NormalizationTest { - source: "\u{D72D}", - nfc: "\u{D72D}", - nfd: "\u{1112}\u{1171}\u{11BC}", - nfkc: "\u{D72D}", - nfkd: "\u{1112}\u{1171}\u{11BC}", - }, - NormalizationTest { - source: "\u{D72E}", - nfc: "\u{D72E}", - nfd: "\u{1112}\u{1171}\u{11BD}", - nfkc: "\u{D72E}", - nfkd: "\u{1112}\u{1171}\u{11BD}", - }, - NormalizationTest { - source: "\u{D72F}", - nfc: "\u{D72F}", - nfd: "\u{1112}\u{1171}\u{11BE}", - nfkc: "\u{D72F}", - nfkd: "\u{1112}\u{1171}\u{11BE}", - }, - NormalizationTest { - source: "\u{D730}", - nfc: "\u{D730}", - nfd: "\u{1112}\u{1171}\u{11BF}", - nfkc: "\u{D730}", - nfkd: "\u{1112}\u{1171}\u{11BF}", - }, - NormalizationTest { - source: "\u{D731}", - nfc: "\u{D731}", - nfd: "\u{1112}\u{1171}\u{11C0}", - nfkc: "\u{D731}", - nfkd: "\u{1112}\u{1171}\u{11C0}", - }, - NormalizationTest { - source: "\u{D732}", - nfc: "\u{D732}", - nfd: "\u{1112}\u{1171}\u{11C1}", - nfkc: "\u{D732}", - nfkd: "\u{1112}\u{1171}\u{11C1}", - }, - NormalizationTest { - source: "\u{D733}", - nfc: "\u{D733}", - nfd: "\u{1112}\u{1171}\u{11C2}", - nfkc: "\u{D733}", - nfkd: "\u{1112}\u{1171}\u{11C2}", - }, - NormalizationTest { - source: "\u{D734}", - nfc: "\u{D734}", - nfd: "\u{1112}\u{1172}", - nfkc: "\u{D734}", - nfkd: "\u{1112}\u{1172}", - }, - NormalizationTest { - source: "\u{D735}", - nfc: "\u{D735}", - nfd: "\u{1112}\u{1172}\u{11A8}", - nfkc: "\u{D735}", - nfkd: "\u{1112}\u{1172}\u{11A8}", - }, - NormalizationTest { - source: "\u{D736}", - nfc: "\u{D736}", - nfd: "\u{1112}\u{1172}\u{11A9}", - nfkc: "\u{D736}", - nfkd: "\u{1112}\u{1172}\u{11A9}", - }, - NormalizationTest { - source: "\u{D737}", - nfc: "\u{D737}", - nfd: "\u{1112}\u{1172}\u{11AA}", - nfkc: "\u{D737}", - nfkd: "\u{1112}\u{1172}\u{11AA}", - }, - NormalizationTest { - source: "\u{D738}", - nfc: "\u{D738}", - nfd: "\u{1112}\u{1172}\u{11AB}", - nfkc: "\u{D738}", - nfkd: "\u{1112}\u{1172}\u{11AB}", - }, - NormalizationTest { - source: "\u{D739}", - nfc: "\u{D739}", - nfd: "\u{1112}\u{1172}\u{11AC}", - nfkc: "\u{D739}", - nfkd: "\u{1112}\u{1172}\u{11AC}", - }, - NormalizationTest { - source: "\u{D73A}", - nfc: "\u{D73A}", - nfd: "\u{1112}\u{1172}\u{11AD}", - nfkc: "\u{D73A}", - nfkd: "\u{1112}\u{1172}\u{11AD}", - }, - NormalizationTest { - source: "\u{D73B}", - nfc: "\u{D73B}", - nfd: "\u{1112}\u{1172}\u{11AE}", - nfkc: "\u{D73B}", - nfkd: "\u{1112}\u{1172}\u{11AE}", - }, - NormalizationTest { - source: "\u{D73C}", - nfc: "\u{D73C}", - nfd: "\u{1112}\u{1172}\u{11AF}", - nfkc: "\u{D73C}", - nfkd: "\u{1112}\u{1172}\u{11AF}", - }, - NormalizationTest { - source: "\u{D73D}", - nfc: "\u{D73D}", - nfd: "\u{1112}\u{1172}\u{11B0}", - nfkc: "\u{D73D}", - nfkd: "\u{1112}\u{1172}\u{11B0}", - }, - NormalizationTest { - source: "\u{D73E}", - nfc: "\u{D73E}", - nfd: "\u{1112}\u{1172}\u{11B1}", - nfkc: "\u{D73E}", - nfkd: "\u{1112}\u{1172}\u{11B1}", - }, - NormalizationTest { - source: "\u{D73F}", - nfc: "\u{D73F}", - nfd: "\u{1112}\u{1172}\u{11B2}", - nfkc: "\u{D73F}", - nfkd: "\u{1112}\u{1172}\u{11B2}", - }, - NormalizationTest { - source: "\u{D740}", - nfc: "\u{D740}", - nfd: "\u{1112}\u{1172}\u{11B3}", - nfkc: "\u{D740}", - nfkd: "\u{1112}\u{1172}\u{11B3}", - }, - NormalizationTest { - source: "\u{D741}", - nfc: "\u{D741}", - nfd: "\u{1112}\u{1172}\u{11B4}", - nfkc: "\u{D741}", - nfkd: "\u{1112}\u{1172}\u{11B4}", - }, - NormalizationTest { - source: "\u{D742}", - nfc: "\u{D742}", - nfd: "\u{1112}\u{1172}\u{11B5}", - nfkc: "\u{D742}", - nfkd: "\u{1112}\u{1172}\u{11B5}", - }, - NormalizationTest { - source: "\u{D743}", - nfc: "\u{D743}", - nfd: "\u{1112}\u{1172}\u{11B6}", - nfkc: "\u{D743}", - nfkd: "\u{1112}\u{1172}\u{11B6}", - }, - NormalizationTest { - source: "\u{D744}", - nfc: "\u{D744}", - nfd: "\u{1112}\u{1172}\u{11B7}", - nfkc: "\u{D744}", - nfkd: "\u{1112}\u{1172}\u{11B7}", - }, - NormalizationTest { - source: "\u{D745}", - nfc: "\u{D745}", - nfd: "\u{1112}\u{1172}\u{11B8}", - nfkc: "\u{D745}", - nfkd: "\u{1112}\u{1172}\u{11B8}", - }, - NormalizationTest { - source: "\u{D746}", - nfc: "\u{D746}", - nfd: "\u{1112}\u{1172}\u{11B9}", - nfkc: "\u{D746}", - nfkd: "\u{1112}\u{1172}\u{11B9}", - }, - NormalizationTest { - source: "\u{D747}", - nfc: "\u{D747}", - nfd: "\u{1112}\u{1172}\u{11BA}", - nfkc: "\u{D747}", - nfkd: "\u{1112}\u{1172}\u{11BA}", - }, - NormalizationTest { - source: "\u{D748}", - nfc: "\u{D748}", - nfd: "\u{1112}\u{1172}\u{11BB}", - nfkc: "\u{D748}", - nfkd: "\u{1112}\u{1172}\u{11BB}", - }, - NormalizationTest { - source: "\u{D749}", - nfc: "\u{D749}", - nfd: "\u{1112}\u{1172}\u{11BC}", - nfkc: "\u{D749}", - nfkd: "\u{1112}\u{1172}\u{11BC}", - }, - NormalizationTest { - source: "\u{D74A}", - nfc: "\u{D74A}", - nfd: "\u{1112}\u{1172}\u{11BD}", - nfkc: "\u{D74A}", - nfkd: "\u{1112}\u{1172}\u{11BD}", - }, - NormalizationTest { - source: "\u{D74B}", - nfc: "\u{D74B}", - nfd: "\u{1112}\u{1172}\u{11BE}", - nfkc: "\u{D74B}", - nfkd: "\u{1112}\u{1172}\u{11BE}", - }, - NormalizationTest { - source: "\u{D74C}", - nfc: "\u{D74C}", - nfd: "\u{1112}\u{1172}\u{11BF}", - nfkc: "\u{D74C}", - nfkd: "\u{1112}\u{1172}\u{11BF}", - }, - NormalizationTest { - source: "\u{D74D}", - nfc: "\u{D74D}", - nfd: "\u{1112}\u{1172}\u{11C0}", - nfkc: "\u{D74D}", - nfkd: "\u{1112}\u{1172}\u{11C0}", - }, - NormalizationTest { - source: "\u{D74E}", - nfc: "\u{D74E}", - nfd: "\u{1112}\u{1172}\u{11C1}", - nfkc: "\u{D74E}", - nfkd: "\u{1112}\u{1172}\u{11C1}", - }, - NormalizationTest { - source: "\u{D74F}", - nfc: "\u{D74F}", - nfd: "\u{1112}\u{1172}\u{11C2}", - nfkc: "\u{D74F}", - nfkd: "\u{1112}\u{1172}\u{11C2}", - }, - NormalizationTest { - source: "\u{D750}", - nfc: "\u{D750}", - nfd: "\u{1112}\u{1173}", - nfkc: "\u{D750}", - nfkd: "\u{1112}\u{1173}", - }, - NormalizationTest { - source: "\u{D751}", - nfc: "\u{D751}", - nfd: "\u{1112}\u{1173}\u{11A8}", - nfkc: "\u{D751}", - nfkd: "\u{1112}\u{1173}\u{11A8}", - }, - NormalizationTest { - source: "\u{D752}", - nfc: "\u{D752}", - nfd: "\u{1112}\u{1173}\u{11A9}", - nfkc: "\u{D752}", - nfkd: "\u{1112}\u{1173}\u{11A9}", - }, - NormalizationTest { - source: "\u{D753}", - nfc: "\u{D753}", - nfd: "\u{1112}\u{1173}\u{11AA}", - nfkc: "\u{D753}", - nfkd: "\u{1112}\u{1173}\u{11AA}", - }, - NormalizationTest { - source: "\u{D754}", - nfc: "\u{D754}", - nfd: "\u{1112}\u{1173}\u{11AB}", - nfkc: "\u{D754}", - nfkd: "\u{1112}\u{1173}\u{11AB}", - }, - NormalizationTest { - source: "\u{D755}", - nfc: "\u{D755}", - nfd: "\u{1112}\u{1173}\u{11AC}", - nfkc: "\u{D755}", - nfkd: "\u{1112}\u{1173}\u{11AC}", - }, - NormalizationTest { - source: "\u{D756}", - nfc: "\u{D756}", - nfd: "\u{1112}\u{1173}\u{11AD}", - nfkc: "\u{D756}", - nfkd: "\u{1112}\u{1173}\u{11AD}", - }, - NormalizationTest { - source: "\u{D757}", - nfc: "\u{D757}", - nfd: "\u{1112}\u{1173}\u{11AE}", - nfkc: "\u{D757}", - nfkd: "\u{1112}\u{1173}\u{11AE}", - }, - NormalizationTest { - source: "\u{D758}", - nfc: "\u{D758}", - nfd: "\u{1112}\u{1173}\u{11AF}", - nfkc: "\u{D758}", - nfkd: "\u{1112}\u{1173}\u{11AF}", - }, - NormalizationTest { - source: "\u{D759}", - nfc: "\u{D759}", - nfd: "\u{1112}\u{1173}\u{11B0}", - nfkc: "\u{D759}", - nfkd: "\u{1112}\u{1173}\u{11B0}", - }, - NormalizationTest { - source: "\u{D75A}", - nfc: "\u{D75A}", - nfd: "\u{1112}\u{1173}\u{11B1}", - nfkc: "\u{D75A}", - nfkd: "\u{1112}\u{1173}\u{11B1}", - }, - NormalizationTest { - source: "\u{D75B}", - nfc: "\u{D75B}", - nfd: "\u{1112}\u{1173}\u{11B2}", - nfkc: "\u{D75B}", - nfkd: "\u{1112}\u{1173}\u{11B2}", - }, - NormalizationTest { - source: "\u{D75C}", - nfc: "\u{D75C}", - nfd: "\u{1112}\u{1173}\u{11B3}", - nfkc: "\u{D75C}", - nfkd: "\u{1112}\u{1173}\u{11B3}", - }, - NormalizationTest { - source: "\u{D75D}", - nfc: "\u{D75D}", - nfd: "\u{1112}\u{1173}\u{11B4}", - nfkc: "\u{D75D}", - nfkd: "\u{1112}\u{1173}\u{11B4}", - }, - NormalizationTest { - source: "\u{D75E}", - nfc: "\u{D75E}", - nfd: "\u{1112}\u{1173}\u{11B5}", - nfkc: "\u{D75E}", - nfkd: "\u{1112}\u{1173}\u{11B5}", - }, - NormalizationTest { - source: "\u{D75F}", - nfc: "\u{D75F}", - nfd: "\u{1112}\u{1173}\u{11B6}", - nfkc: "\u{D75F}", - nfkd: "\u{1112}\u{1173}\u{11B6}", - }, - NormalizationTest { - source: "\u{D760}", - nfc: "\u{D760}", - nfd: "\u{1112}\u{1173}\u{11B7}", - nfkc: "\u{D760}", - nfkd: "\u{1112}\u{1173}\u{11B7}", - }, - NormalizationTest { - source: "\u{D761}", - nfc: "\u{D761}", - nfd: "\u{1112}\u{1173}\u{11B8}", - nfkc: "\u{D761}", - nfkd: "\u{1112}\u{1173}\u{11B8}", - }, - NormalizationTest { - source: "\u{D762}", - nfc: "\u{D762}", - nfd: "\u{1112}\u{1173}\u{11B9}", - nfkc: "\u{D762}", - nfkd: "\u{1112}\u{1173}\u{11B9}", - }, - NormalizationTest { - source: "\u{D763}", - nfc: "\u{D763}", - nfd: "\u{1112}\u{1173}\u{11BA}", - nfkc: "\u{D763}", - nfkd: "\u{1112}\u{1173}\u{11BA}", - }, - NormalizationTest { - source: "\u{D764}", - nfc: "\u{D764}", - nfd: "\u{1112}\u{1173}\u{11BB}", - nfkc: "\u{D764}", - nfkd: "\u{1112}\u{1173}\u{11BB}", - }, - NormalizationTest { - source: "\u{D765}", - nfc: "\u{D765}", - nfd: "\u{1112}\u{1173}\u{11BC}", - nfkc: "\u{D765}", - nfkd: "\u{1112}\u{1173}\u{11BC}", - }, - NormalizationTest { - source: "\u{D766}", - nfc: "\u{D766}", - nfd: "\u{1112}\u{1173}\u{11BD}", - nfkc: "\u{D766}", - nfkd: "\u{1112}\u{1173}\u{11BD}", - }, - NormalizationTest { - source: "\u{D767}", - nfc: "\u{D767}", - nfd: "\u{1112}\u{1173}\u{11BE}", - nfkc: "\u{D767}", - nfkd: "\u{1112}\u{1173}\u{11BE}", - }, - NormalizationTest { - source: "\u{D768}", - nfc: "\u{D768}", - nfd: "\u{1112}\u{1173}\u{11BF}", - nfkc: "\u{D768}", - nfkd: "\u{1112}\u{1173}\u{11BF}", - }, - NormalizationTest { - source: "\u{D769}", - nfc: "\u{D769}", - nfd: "\u{1112}\u{1173}\u{11C0}", - nfkc: "\u{D769}", - nfkd: "\u{1112}\u{1173}\u{11C0}", - }, - NormalizationTest { - source: "\u{D76A}", - nfc: "\u{D76A}", - nfd: "\u{1112}\u{1173}\u{11C1}", - nfkc: "\u{D76A}", - nfkd: "\u{1112}\u{1173}\u{11C1}", - }, - NormalizationTest { - source: "\u{D76B}", - nfc: "\u{D76B}", - nfd: "\u{1112}\u{1173}\u{11C2}", - nfkc: "\u{D76B}", - nfkd: "\u{1112}\u{1173}\u{11C2}", - }, - NormalizationTest { - source: "\u{D76C}", - nfc: "\u{D76C}", - nfd: "\u{1112}\u{1174}", - nfkc: "\u{D76C}", - nfkd: "\u{1112}\u{1174}", - }, - NormalizationTest { - source: "\u{D76D}", - nfc: "\u{D76D}", - nfd: "\u{1112}\u{1174}\u{11A8}", - nfkc: "\u{D76D}", - nfkd: "\u{1112}\u{1174}\u{11A8}", - }, - NormalizationTest { - source: "\u{D76E}", - nfc: "\u{D76E}", - nfd: "\u{1112}\u{1174}\u{11A9}", - nfkc: "\u{D76E}", - nfkd: "\u{1112}\u{1174}\u{11A9}", - }, - NormalizationTest { - source: "\u{D76F}", - nfc: "\u{D76F}", - nfd: "\u{1112}\u{1174}\u{11AA}", - nfkc: "\u{D76F}", - nfkd: "\u{1112}\u{1174}\u{11AA}", - }, - NormalizationTest { - source: "\u{D770}", - nfc: "\u{D770}", - nfd: "\u{1112}\u{1174}\u{11AB}", - nfkc: "\u{D770}", - nfkd: "\u{1112}\u{1174}\u{11AB}", - }, - NormalizationTest { - source: "\u{D771}", - nfc: "\u{D771}", - nfd: "\u{1112}\u{1174}\u{11AC}", - nfkc: "\u{D771}", - nfkd: "\u{1112}\u{1174}\u{11AC}", - }, - NormalizationTest { - source: "\u{D772}", - nfc: "\u{D772}", - nfd: "\u{1112}\u{1174}\u{11AD}", - nfkc: "\u{D772}", - nfkd: "\u{1112}\u{1174}\u{11AD}", - }, - NormalizationTest { - source: "\u{D773}", - nfc: "\u{D773}", - nfd: "\u{1112}\u{1174}\u{11AE}", - nfkc: "\u{D773}", - nfkd: "\u{1112}\u{1174}\u{11AE}", - }, - NormalizationTest { - source: "\u{D774}", - nfc: "\u{D774}", - nfd: "\u{1112}\u{1174}\u{11AF}", - nfkc: "\u{D774}", - nfkd: "\u{1112}\u{1174}\u{11AF}", - }, - NormalizationTest { - source: "\u{D775}", - nfc: "\u{D775}", - nfd: "\u{1112}\u{1174}\u{11B0}", - nfkc: "\u{D775}", - nfkd: "\u{1112}\u{1174}\u{11B0}", - }, - NormalizationTest { - source: "\u{D776}", - nfc: "\u{D776}", - nfd: "\u{1112}\u{1174}\u{11B1}", - nfkc: "\u{D776}", - nfkd: "\u{1112}\u{1174}\u{11B1}", - }, - NormalizationTest { - source: "\u{D777}", - nfc: "\u{D777}", - nfd: "\u{1112}\u{1174}\u{11B2}", - nfkc: "\u{D777}", - nfkd: "\u{1112}\u{1174}\u{11B2}", - }, - NormalizationTest { - source: "\u{D778}", - nfc: "\u{D778}", - nfd: "\u{1112}\u{1174}\u{11B3}", - nfkc: "\u{D778}", - nfkd: "\u{1112}\u{1174}\u{11B3}", - }, - NormalizationTest { - source: "\u{D779}", - nfc: "\u{D779}", - nfd: "\u{1112}\u{1174}\u{11B4}", - nfkc: "\u{D779}", - nfkd: "\u{1112}\u{1174}\u{11B4}", - }, - NormalizationTest { - source: "\u{D77A}", - nfc: "\u{D77A}", - nfd: "\u{1112}\u{1174}\u{11B5}", - nfkc: "\u{D77A}", - nfkd: "\u{1112}\u{1174}\u{11B5}", - }, - NormalizationTest { - source: "\u{D77B}", - nfc: "\u{D77B}", - nfd: "\u{1112}\u{1174}\u{11B6}", - nfkc: "\u{D77B}", - nfkd: "\u{1112}\u{1174}\u{11B6}", - }, - NormalizationTest { - source: "\u{D77C}", - nfc: "\u{D77C}", - nfd: "\u{1112}\u{1174}\u{11B7}", - nfkc: "\u{D77C}", - nfkd: "\u{1112}\u{1174}\u{11B7}", - }, - NormalizationTest { - source: "\u{D77D}", - nfc: "\u{D77D}", - nfd: "\u{1112}\u{1174}\u{11B8}", - nfkc: "\u{D77D}", - nfkd: "\u{1112}\u{1174}\u{11B8}", - }, - NormalizationTest { - source: "\u{D77E}", - nfc: "\u{D77E}", - nfd: "\u{1112}\u{1174}\u{11B9}", - nfkc: "\u{D77E}", - nfkd: "\u{1112}\u{1174}\u{11B9}", - }, - NormalizationTest { - source: "\u{D77F}", - nfc: "\u{D77F}", - nfd: "\u{1112}\u{1174}\u{11BA}", - nfkc: "\u{D77F}", - nfkd: "\u{1112}\u{1174}\u{11BA}", - }, - NormalizationTest { - source: "\u{D780}", - nfc: "\u{D780}", - nfd: "\u{1112}\u{1174}\u{11BB}", - nfkc: "\u{D780}", - nfkd: "\u{1112}\u{1174}\u{11BB}", - }, - NormalizationTest { - source: "\u{D781}", - nfc: "\u{D781}", - nfd: "\u{1112}\u{1174}\u{11BC}", - nfkc: "\u{D781}", - nfkd: "\u{1112}\u{1174}\u{11BC}", - }, - NormalizationTest { - source: "\u{D782}", - nfc: "\u{D782}", - nfd: "\u{1112}\u{1174}\u{11BD}", - nfkc: "\u{D782}", - nfkd: "\u{1112}\u{1174}\u{11BD}", - }, - NormalizationTest { - source: "\u{D783}", - nfc: "\u{D783}", - nfd: "\u{1112}\u{1174}\u{11BE}", - nfkc: "\u{D783}", - nfkd: "\u{1112}\u{1174}\u{11BE}", - }, - NormalizationTest { - source: "\u{D784}", - nfc: "\u{D784}", - nfd: "\u{1112}\u{1174}\u{11BF}", - nfkc: "\u{D784}", - nfkd: "\u{1112}\u{1174}\u{11BF}", - }, - NormalizationTest { - source: "\u{D785}", - nfc: "\u{D785}", - nfd: "\u{1112}\u{1174}\u{11C0}", - nfkc: "\u{D785}", - nfkd: "\u{1112}\u{1174}\u{11C0}", - }, - NormalizationTest { - source: "\u{D786}", - nfc: "\u{D786}", - nfd: "\u{1112}\u{1174}\u{11C1}", - nfkc: "\u{D786}", - nfkd: "\u{1112}\u{1174}\u{11C1}", - }, - NormalizationTest { - source: "\u{D787}", - nfc: "\u{D787}", - nfd: "\u{1112}\u{1174}\u{11C2}", - nfkc: "\u{D787}", - nfkd: "\u{1112}\u{1174}\u{11C2}", - }, - NormalizationTest { - source: "\u{D788}", - nfc: "\u{D788}", - nfd: "\u{1112}\u{1175}", - nfkc: "\u{D788}", - nfkd: "\u{1112}\u{1175}", - }, - NormalizationTest { - source: "\u{D789}", - nfc: "\u{D789}", - nfd: "\u{1112}\u{1175}\u{11A8}", - nfkc: "\u{D789}", - nfkd: "\u{1112}\u{1175}\u{11A8}", - }, - NormalizationTest { - source: "\u{D78A}", - nfc: "\u{D78A}", - nfd: "\u{1112}\u{1175}\u{11A9}", - nfkc: "\u{D78A}", - nfkd: "\u{1112}\u{1175}\u{11A9}", - }, - NormalizationTest { - source: "\u{D78B}", - nfc: "\u{D78B}", - nfd: "\u{1112}\u{1175}\u{11AA}", - nfkc: "\u{D78B}", - nfkd: "\u{1112}\u{1175}\u{11AA}", - }, - NormalizationTest { - source: "\u{D78C}", - nfc: "\u{D78C}", - nfd: "\u{1112}\u{1175}\u{11AB}", - nfkc: "\u{D78C}", - nfkd: "\u{1112}\u{1175}\u{11AB}", - }, - NormalizationTest { - source: "\u{D78D}", - nfc: "\u{D78D}", - nfd: "\u{1112}\u{1175}\u{11AC}", - nfkc: "\u{D78D}", - nfkd: "\u{1112}\u{1175}\u{11AC}", - }, - NormalizationTest { - source: "\u{D78E}", - nfc: "\u{D78E}", - nfd: "\u{1112}\u{1175}\u{11AD}", - nfkc: "\u{D78E}", - nfkd: "\u{1112}\u{1175}\u{11AD}", - }, - NormalizationTest { - source: "\u{D78F}", - nfc: "\u{D78F}", - nfd: "\u{1112}\u{1175}\u{11AE}", - nfkc: "\u{D78F}", - nfkd: "\u{1112}\u{1175}\u{11AE}", - }, - NormalizationTest { - source: "\u{D790}", - nfc: "\u{D790}", - nfd: "\u{1112}\u{1175}\u{11AF}", - nfkc: "\u{D790}", - nfkd: "\u{1112}\u{1175}\u{11AF}", - }, - NormalizationTest { - source: "\u{D791}", - nfc: "\u{D791}", - nfd: "\u{1112}\u{1175}\u{11B0}", - nfkc: "\u{D791}", - nfkd: "\u{1112}\u{1175}\u{11B0}", - }, - NormalizationTest { - source: "\u{D792}", - nfc: "\u{D792}", - nfd: "\u{1112}\u{1175}\u{11B1}", - nfkc: "\u{D792}", - nfkd: "\u{1112}\u{1175}\u{11B1}", - }, - NormalizationTest { - source: "\u{D793}", - nfc: "\u{D793}", - nfd: "\u{1112}\u{1175}\u{11B2}", - nfkc: "\u{D793}", - nfkd: "\u{1112}\u{1175}\u{11B2}", - }, - NormalizationTest { - source: "\u{D794}", - nfc: "\u{D794}", - nfd: "\u{1112}\u{1175}\u{11B3}", - nfkc: "\u{D794}", - nfkd: "\u{1112}\u{1175}\u{11B3}", - }, - NormalizationTest { - source: "\u{D795}", - nfc: "\u{D795}", - nfd: "\u{1112}\u{1175}\u{11B4}", - nfkc: "\u{D795}", - nfkd: "\u{1112}\u{1175}\u{11B4}", - }, - NormalizationTest { - source: "\u{D796}", - nfc: "\u{D796}", - nfd: "\u{1112}\u{1175}\u{11B5}", - nfkc: "\u{D796}", - nfkd: "\u{1112}\u{1175}\u{11B5}", - }, - NormalizationTest { - source: "\u{D797}", - nfc: "\u{D797}", - nfd: "\u{1112}\u{1175}\u{11B6}", - nfkc: "\u{D797}", - nfkd: "\u{1112}\u{1175}\u{11B6}", - }, - NormalizationTest { - source: "\u{D798}", - nfc: "\u{D798}", - nfd: "\u{1112}\u{1175}\u{11B7}", - nfkc: "\u{D798}", - nfkd: "\u{1112}\u{1175}\u{11B7}", - }, - NormalizationTest { - source: "\u{D799}", - nfc: "\u{D799}", - nfd: "\u{1112}\u{1175}\u{11B8}", - nfkc: "\u{D799}", - nfkd: "\u{1112}\u{1175}\u{11B8}", - }, - NormalizationTest { - source: "\u{D79A}", - nfc: "\u{D79A}", - nfd: "\u{1112}\u{1175}\u{11B9}", - nfkc: "\u{D79A}", - nfkd: "\u{1112}\u{1175}\u{11B9}", - }, - NormalizationTest { - source: "\u{D79B}", - nfc: "\u{D79B}", - nfd: "\u{1112}\u{1175}\u{11BA}", - nfkc: "\u{D79B}", - nfkd: "\u{1112}\u{1175}\u{11BA}", - }, - NormalizationTest { - source: "\u{D79C}", - nfc: "\u{D79C}", - nfd: "\u{1112}\u{1175}\u{11BB}", - nfkc: "\u{D79C}", - nfkd: "\u{1112}\u{1175}\u{11BB}", - }, - NormalizationTest { - source: "\u{D79D}", - nfc: "\u{D79D}", - nfd: "\u{1112}\u{1175}\u{11BC}", - nfkc: "\u{D79D}", - nfkd: "\u{1112}\u{1175}\u{11BC}", - }, - NormalizationTest { - source: "\u{D79E}", - nfc: "\u{D79E}", - nfd: "\u{1112}\u{1175}\u{11BD}", - nfkc: "\u{D79E}", - nfkd: "\u{1112}\u{1175}\u{11BD}", - }, - NormalizationTest { - source: "\u{D79F}", - nfc: "\u{D79F}", - nfd: "\u{1112}\u{1175}\u{11BE}", - nfkc: "\u{D79F}", - nfkd: "\u{1112}\u{1175}\u{11BE}", - }, - NormalizationTest { - source: "\u{D7A0}", - nfc: "\u{D7A0}", - nfd: "\u{1112}\u{1175}\u{11BF}", - nfkc: "\u{D7A0}", - nfkd: "\u{1112}\u{1175}\u{11BF}", - }, - NormalizationTest { - source: "\u{D7A1}", - nfc: "\u{D7A1}", - nfd: "\u{1112}\u{1175}\u{11C0}", - nfkc: "\u{D7A1}", - nfkd: "\u{1112}\u{1175}\u{11C0}", - }, - NormalizationTest { - source: "\u{D7A2}", - nfc: "\u{D7A2}", - nfd: "\u{1112}\u{1175}\u{11C1}", - nfkc: "\u{D7A2}", - nfkd: "\u{1112}\u{1175}\u{11C1}", - }, - NormalizationTest { - source: "\u{D7A3}", - nfc: "\u{D7A3}", - nfd: "\u{1112}\u{1175}\u{11C2}", - nfkc: "\u{D7A3}", - nfkd: "\u{1112}\u{1175}\u{11C2}", - }, - NormalizationTest { - source: "\u{F900}", - nfc: "\u{8C48}", - nfd: "\u{8C48}", - nfkc: "\u{8C48}", - nfkd: "\u{8C48}", - }, - NormalizationTest { - source: "\u{F901}", - nfc: "\u{66F4}", - nfd: "\u{66F4}", - nfkc: "\u{66F4}", - nfkd: "\u{66F4}", - }, - NormalizationTest { - source: "\u{F902}", - nfc: "\u{8ECA}", - nfd: "\u{8ECA}", - nfkc: "\u{8ECA}", - nfkd: "\u{8ECA}", - }, - NormalizationTest { - source: "\u{F903}", - nfc: "\u{8CC8}", - nfd: "\u{8CC8}", - nfkc: "\u{8CC8}", - nfkd: "\u{8CC8}", - }, - NormalizationTest { - source: "\u{F904}", - nfc: "\u{6ED1}", - nfd: "\u{6ED1}", - nfkc: "\u{6ED1}", - nfkd: "\u{6ED1}", - }, - NormalizationTest { - source: "\u{F905}", - nfc: "\u{4E32}", - nfd: "\u{4E32}", - nfkc: "\u{4E32}", - nfkd: "\u{4E32}", - }, - NormalizationTest { - source: "\u{F906}", - nfc: "\u{53E5}", - nfd: "\u{53E5}", - nfkc: "\u{53E5}", - nfkd: "\u{53E5}", - }, - NormalizationTest { - source: "\u{F907}", - nfc: "\u{9F9C}", - nfd: "\u{9F9C}", - nfkc: "\u{9F9C}", - nfkd: "\u{9F9C}", - }, - NormalizationTest { - source: "\u{F908}", - nfc: "\u{9F9C}", - nfd: "\u{9F9C}", - nfkc: "\u{9F9C}", - nfkd: "\u{9F9C}", - }, - NormalizationTest { - source: "\u{F909}", - nfc: "\u{5951}", - nfd: "\u{5951}", - nfkc: "\u{5951}", - nfkd: "\u{5951}", - }, - NormalizationTest { - source: "\u{F90A}", - nfc: "\u{91D1}", - nfd: "\u{91D1}", - nfkc: "\u{91D1}", - nfkd: "\u{91D1}", - }, - NormalizationTest { - source: "\u{F90B}", - nfc: "\u{5587}", - nfd: "\u{5587}", - nfkc: "\u{5587}", - nfkd: "\u{5587}", - }, - NormalizationTest { - source: "\u{F90C}", - nfc: "\u{5948}", - nfd: "\u{5948}", - nfkc: "\u{5948}", - nfkd: "\u{5948}", - }, - NormalizationTest { - source: "\u{F90D}", - nfc: "\u{61F6}", - nfd: "\u{61F6}", - nfkc: "\u{61F6}", - nfkd: "\u{61F6}", - }, - NormalizationTest { - source: "\u{F90E}", - nfc: "\u{7669}", - nfd: "\u{7669}", - nfkc: "\u{7669}", - nfkd: "\u{7669}", - }, - NormalizationTest { - source: "\u{F90F}", - nfc: "\u{7F85}", - nfd: "\u{7F85}", - nfkc: "\u{7F85}", - nfkd: "\u{7F85}", - }, - NormalizationTest { - source: "\u{F910}", - nfc: "\u{863F}", - nfd: "\u{863F}", - nfkc: "\u{863F}", - nfkd: "\u{863F}", - }, - NormalizationTest { - source: "\u{F911}", - nfc: "\u{87BA}", - nfd: "\u{87BA}", - nfkc: "\u{87BA}", - nfkd: "\u{87BA}", - }, - NormalizationTest { - source: "\u{F912}", - nfc: "\u{88F8}", - nfd: "\u{88F8}", - nfkc: "\u{88F8}", - nfkd: "\u{88F8}", - }, - NormalizationTest { - source: "\u{F913}", - nfc: "\u{908F}", - nfd: "\u{908F}", - nfkc: "\u{908F}", - nfkd: "\u{908F}", - }, - NormalizationTest { - source: "\u{F914}", - nfc: "\u{6A02}", - nfd: "\u{6A02}", - nfkc: "\u{6A02}", - nfkd: "\u{6A02}", - }, - NormalizationTest { - source: "\u{F915}", - nfc: "\u{6D1B}", - nfd: "\u{6D1B}", - nfkc: "\u{6D1B}", - nfkd: "\u{6D1B}", - }, - NormalizationTest { - source: "\u{F916}", - nfc: "\u{70D9}", - nfd: "\u{70D9}", - nfkc: "\u{70D9}", - nfkd: "\u{70D9}", - }, - NormalizationTest { - source: "\u{F917}", - nfc: "\u{73DE}", - nfd: "\u{73DE}", - nfkc: "\u{73DE}", - nfkd: "\u{73DE}", - }, - NormalizationTest { - source: "\u{F918}", - nfc: "\u{843D}", - nfd: "\u{843D}", - nfkc: "\u{843D}", - nfkd: "\u{843D}", - }, - NormalizationTest { - source: "\u{F919}", - nfc: "\u{916A}", - nfd: "\u{916A}", - nfkc: "\u{916A}", - nfkd: "\u{916A}", - }, - NormalizationTest { - source: "\u{F91A}", - nfc: "\u{99F1}", - nfd: "\u{99F1}", - nfkc: "\u{99F1}", - nfkd: "\u{99F1}", - }, - NormalizationTest { - source: "\u{F91B}", - nfc: "\u{4E82}", - nfd: "\u{4E82}", - nfkc: "\u{4E82}", - nfkd: "\u{4E82}", - }, - NormalizationTest { - source: "\u{F91C}", - nfc: "\u{5375}", - nfd: "\u{5375}", - nfkc: "\u{5375}", - nfkd: "\u{5375}", - }, - NormalizationTest { - source: "\u{F91D}", - nfc: "\u{6B04}", - nfd: "\u{6B04}", - nfkc: "\u{6B04}", - nfkd: "\u{6B04}", - }, - NormalizationTest { - source: "\u{F91E}", - nfc: "\u{721B}", - nfd: "\u{721B}", - nfkc: "\u{721B}", - nfkd: "\u{721B}", - }, - NormalizationTest { - source: "\u{F91F}", - nfc: "\u{862D}", - nfd: "\u{862D}", - nfkc: "\u{862D}", - nfkd: "\u{862D}", - }, - NormalizationTest { - source: "\u{F920}", - nfc: "\u{9E1E}", - nfd: "\u{9E1E}", - nfkc: "\u{9E1E}", - nfkd: "\u{9E1E}", - }, - NormalizationTest { - source: "\u{F921}", - nfc: "\u{5D50}", - nfd: "\u{5D50}", - nfkc: "\u{5D50}", - nfkd: "\u{5D50}", - }, - NormalizationTest { - source: "\u{F922}", - nfc: "\u{6FEB}", - nfd: "\u{6FEB}", - nfkc: "\u{6FEB}", - nfkd: "\u{6FEB}", - }, - NormalizationTest { - source: "\u{F923}", - nfc: "\u{85CD}", - nfd: "\u{85CD}", - nfkc: "\u{85CD}", - nfkd: "\u{85CD}", - }, - NormalizationTest { - source: "\u{F924}", - nfc: "\u{8964}", - nfd: "\u{8964}", - nfkc: "\u{8964}", - nfkd: "\u{8964}", - }, - NormalizationTest { - source: "\u{F925}", - nfc: "\u{62C9}", - nfd: "\u{62C9}", - nfkc: "\u{62C9}", - nfkd: "\u{62C9}", - }, - NormalizationTest { - source: "\u{F926}", - nfc: "\u{81D8}", - nfd: "\u{81D8}", - nfkc: "\u{81D8}", - nfkd: "\u{81D8}", - }, - NormalizationTest { - source: "\u{F927}", - nfc: "\u{881F}", - nfd: "\u{881F}", - nfkc: "\u{881F}", - nfkd: "\u{881F}", - }, - NormalizationTest { - source: "\u{F928}", - nfc: "\u{5ECA}", - nfd: "\u{5ECA}", - nfkc: "\u{5ECA}", - nfkd: "\u{5ECA}", - }, - NormalizationTest { - source: "\u{F929}", - nfc: "\u{6717}", - nfd: "\u{6717}", - nfkc: "\u{6717}", - nfkd: "\u{6717}", - }, - NormalizationTest { - source: "\u{F92A}", - nfc: "\u{6D6A}", - nfd: "\u{6D6A}", - nfkc: "\u{6D6A}", - nfkd: "\u{6D6A}", - }, - NormalizationTest { - source: "\u{F92B}", - nfc: "\u{72FC}", - nfd: "\u{72FC}", - nfkc: "\u{72FC}", - nfkd: "\u{72FC}", - }, - NormalizationTest { - source: "\u{F92C}", - nfc: "\u{90CE}", - nfd: "\u{90CE}", - nfkc: "\u{90CE}", - nfkd: "\u{90CE}", - }, - NormalizationTest { - source: "\u{F92D}", - nfc: "\u{4F86}", - nfd: "\u{4F86}", - nfkc: "\u{4F86}", - nfkd: "\u{4F86}", - }, - NormalizationTest { - source: "\u{F92E}", - nfc: "\u{51B7}", - nfd: "\u{51B7}", - nfkc: "\u{51B7}", - nfkd: "\u{51B7}", - }, - NormalizationTest { - source: "\u{F92F}", - nfc: "\u{52DE}", - nfd: "\u{52DE}", - nfkc: "\u{52DE}", - nfkd: "\u{52DE}", - }, - NormalizationTest { - source: "\u{F930}", - nfc: "\u{64C4}", - nfd: "\u{64C4}", - nfkc: "\u{64C4}", - nfkd: "\u{64C4}", - }, - NormalizationTest { - source: "\u{F931}", - nfc: "\u{6AD3}", - nfd: "\u{6AD3}", - nfkc: "\u{6AD3}", - nfkd: "\u{6AD3}", - }, - NormalizationTest { - source: "\u{F932}", - nfc: "\u{7210}", - nfd: "\u{7210}", - nfkc: "\u{7210}", - nfkd: "\u{7210}", - }, - NormalizationTest { - source: "\u{F933}", - nfc: "\u{76E7}", - nfd: "\u{76E7}", - nfkc: "\u{76E7}", - nfkd: "\u{76E7}", - }, - NormalizationTest { - source: "\u{F934}", - nfc: "\u{8001}", - nfd: "\u{8001}", - nfkc: "\u{8001}", - nfkd: "\u{8001}", - }, - NormalizationTest { - source: "\u{F935}", - nfc: "\u{8606}", - nfd: "\u{8606}", - nfkc: "\u{8606}", - nfkd: "\u{8606}", - }, - NormalizationTest { - source: "\u{F936}", - nfc: "\u{865C}", - nfd: "\u{865C}", - nfkc: "\u{865C}", - nfkd: "\u{865C}", - }, - NormalizationTest { - source: "\u{F937}", - nfc: "\u{8DEF}", - nfd: "\u{8DEF}", - nfkc: "\u{8DEF}", - nfkd: "\u{8DEF}", - }, - NormalizationTest { - source: "\u{F938}", - nfc: "\u{9732}", - nfd: "\u{9732}", - nfkc: "\u{9732}", - nfkd: "\u{9732}", - }, - NormalizationTest { - source: "\u{F939}", - nfc: "\u{9B6F}", - nfd: "\u{9B6F}", - nfkc: "\u{9B6F}", - nfkd: "\u{9B6F}", - }, - NormalizationTest { - source: "\u{F93A}", - nfc: "\u{9DFA}", - nfd: "\u{9DFA}", - nfkc: "\u{9DFA}", - nfkd: "\u{9DFA}", - }, - NormalizationTest { - source: "\u{F93B}", - nfc: "\u{788C}", - nfd: "\u{788C}", - nfkc: "\u{788C}", - nfkd: "\u{788C}", - }, - NormalizationTest { - source: "\u{F93C}", - nfc: "\u{797F}", - nfd: "\u{797F}", - nfkc: "\u{797F}", - nfkd: "\u{797F}", - }, - NormalizationTest { - source: "\u{F93D}", - nfc: "\u{7DA0}", - nfd: "\u{7DA0}", - nfkc: "\u{7DA0}", - nfkd: "\u{7DA0}", - }, - NormalizationTest { - source: "\u{F93E}", - nfc: "\u{83C9}", - nfd: "\u{83C9}", - nfkc: "\u{83C9}", - nfkd: "\u{83C9}", - }, - NormalizationTest { - source: "\u{F93F}", - nfc: "\u{9304}", - nfd: "\u{9304}", - nfkc: "\u{9304}", - nfkd: "\u{9304}", - }, - NormalizationTest { - source: "\u{F940}", - nfc: "\u{9E7F}", - nfd: "\u{9E7F}", - nfkc: "\u{9E7F}", - nfkd: "\u{9E7F}", - }, - NormalizationTest { - source: "\u{F941}", - nfc: "\u{8AD6}", - nfd: "\u{8AD6}", - nfkc: "\u{8AD6}", - nfkd: "\u{8AD6}", - }, - NormalizationTest { - source: "\u{F942}", - nfc: "\u{58DF}", - nfd: "\u{58DF}", - nfkc: "\u{58DF}", - nfkd: "\u{58DF}", - }, - NormalizationTest { - source: "\u{F943}", - nfc: "\u{5F04}", - nfd: "\u{5F04}", - nfkc: "\u{5F04}", - nfkd: "\u{5F04}", - }, - NormalizationTest { - source: "\u{F944}", - nfc: "\u{7C60}", - nfd: "\u{7C60}", - nfkc: "\u{7C60}", - nfkd: "\u{7C60}", - }, - NormalizationTest { - source: "\u{F945}", - nfc: "\u{807E}", - nfd: "\u{807E}", - nfkc: "\u{807E}", - nfkd: "\u{807E}", - }, - NormalizationTest { - source: "\u{F946}", - nfc: "\u{7262}", - nfd: "\u{7262}", - nfkc: "\u{7262}", - nfkd: "\u{7262}", - }, - NormalizationTest { - source: "\u{F947}", - nfc: "\u{78CA}", - nfd: "\u{78CA}", - nfkc: "\u{78CA}", - nfkd: "\u{78CA}", - }, - NormalizationTest { - source: "\u{F948}", - nfc: "\u{8CC2}", - nfd: "\u{8CC2}", - nfkc: "\u{8CC2}", - nfkd: "\u{8CC2}", - }, - NormalizationTest { - source: "\u{F949}", - nfc: "\u{96F7}", - nfd: "\u{96F7}", - nfkc: "\u{96F7}", - nfkd: "\u{96F7}", - }, - NormalizationTest { - source: "\u{F94A}", - nfc: "\u{58D8}", - nfd: "\u{58D8}", - nfkc: "\u{58D8}", - nfkd: "\u{58D8}", - }, - NormalizationTest { - source: "\u{F94B}", - nfc: "\u{5C62}", - nfd: "\u{5C62}", - nfkc: "\u{5C62}", - nfkd: "\u{5C62}", - }, - NormalizationTest { - source: "\u{F94C}", - nfc: "\u{6A13}", - nfd: "\u{6A13}", - nfkc: "\u{6A13}", - nfkd: "\u{6A13}", - }, - NormalizationTest { - source: "\u{F94D}", - nfc: "\u{6DDA}", - nfd: "\u{6DDA}", - nfkc: "\u{6DDA}", - nfkd: "\u{6DDA}", - }, - NormalizationTest { - source: "\u{F94E}", - nfc: "\u{6F0F}", - nfd: "\u{6F0F}", - nfkc: "\u{6F0F}", - nfkd: "\u{6F0F}", - }, - NormalizationTest { - source: "\u{F94F}", - nfc: "\u{7D2F}", - nfd: "\u{7D2F}", - nfkc: "\u{7D2F}", - nfkd: "\u{7D2F}", - }, - NormalizationTest { - source: "\u{F950}", - nfc: "\u{7E37}", - nfd: "\u{7E37}", - nfkc: "\u{7E37}", - nfkd: "\u{7E37}", - }, - NormalizationTest { - source: "\u{F951}", - nfc: "\u{964B}", - nfd: "\u{964B}", - nfkc: "\u{964B}", - nfkd: "\u{964B}", - }, - NormalizationTest { - source: "\u{F952}", - nfc: "\u{52D2}", - nfd: "\u{52D2}", - nfkc: "\u{52D2}", - nfkd: "\u{52D2}", - }, - NormalizationTest { - source: "\u{F953}", - nfc: "\u{808B}", - nfd: "\u{808B}", - nfkc: "\u{808B}", - nfkd: "\u{808B}", - }, - NormalizationTest { - source: "\u{F954}", - nfc: "\u{51DC}", - nfd: "\u{51DC}", - nfkc: "\u{51DC}", - nfkd: "\u{51DC}", - }, - NormalizationTest { - source: "\u{F955}", - nfc: "\u{51CC}", - nfd: "\u{51CC}", - nfkc: "\u{51CC}", - nfkd: "\u{51CC}", - }, - NormalizationTest { - source: "\u{F956}", - nfc: "\u{7A1C}", - nfd: "\u{7A1C}", - nfkc: "\u{7A1C}", - nfkd: "\u{7A1C}", - }, - NormalizationTest { - source: "\u{F957}", - nfc: "\u{7DBE}", - nfd: "\u{7DBE}", - nfkc: "\u{7DBE}", - nfkd: "\u{7DBE}", - }, - NormalizationTest { - source: "\u{F958}", - nfc: "\u{83F1}", - nfd: "\u{83F1}", - nfkc: "\u{83F1}", - nfkd: "\u{83F1}", - }, - NormalizationTest { - source: "\u{F959}", - nfc: "\u{9675}", - nfd: "\u{9675}", - nfkc: "\u{9675}", - nfkd: "\u{9675}", - }, - NormalizationTest { - source: "\u{F95A}", - nfc: "\u{8B80}", - nfd: "\u{8B80}", - nfkc: "\u{8B80}", - nfkd: "\u{8B80}", - }, - NormalizationTest { - source: "\u{F95B}", - nfc: "\u{62CF}", - nfd: "\u{62CF}", - nfkc: "\u{62CF}", - nfkd: "\u{62CF}", - }, - NormalizationTest { - source: "\u{F95C}", - nfc: "\u{6A02}", - nfd: "\u{6A02}", - nfkc: "\u{6A02}", - nfkd: "\u{6A02}", - }, - NormalizationTest { - source: "\u{F95D}", - nfc: "\u{8AFE}", - nfd: "\u{8AFE}", - nfkc: "\u{8AFE}", - nfkd: "\u{8AFE}", - }, - NormalizationTest { - source: "\u{F95E}", - nfc: "\u{4E39}", - nfd: "\u{4E39}", - nfkc: "\u{4E39}", - nfkd: "\u{4E39}", - }, - NormalizationTest { - source: "\u{F95F}", - nfc: "\u{5BE7}", - nfd: "\u{5BE7}", - nfkc: "\u{5BE7}", - nfkd: "\u{5BE7}", - }, - NormalizationTest { - source: "\u{F960}", - nfc: "\u{6012}", - nfd: "\u{6012}", - nfkc: "\u{6012}", - nfkd: "\u{6012}", - }, - NormalizationTest { - source: "\u{F961}", - nfc: "\u{7387}", - nfd: "\u{7387}", - nfkc: "\u{7387}", - nfkd: "\u{7387}", - }, - NormalizationTest { - source: "\u{F962}", - nfc: "\u{7570}", - nfd: "\u{7570}", - nfkc: "\u{7570}", - nfkd: "\u{7570}", - }, - NormalizationTest { - source: "\u{F963}", - nfc: "\u{5317}", - nfd: "\u{5317}", - nfkc: "\u{5317}", - nfkd: "\u{5317}", - }, - NormalizationTest { - source: "\u{F964}", - nfc: "\u{78FB}", - nfd: "\u{78FB}", - nfkc: "\u{78FB}", - nfkd: "\u{78FB}", - }, - NormalizationTest { - source: "\u{F965}", - nfc: "\u{4FBF}", - nfd: "\u{4FBF}", - nfkc: "\u{4FBF}", - nfkd: "\u{4FBF}", - }, - NormalizationTest { - source: "\u{F966}", - nfc: "\u{5FA9}", - nfd: "\u{5FA9}", - nfkc: "\u{5FA9}", - nfkd: "\u{5FA9}", - }, - NormalizationTest { - source: "\u{F967}", - nfc: "\u{4E0D}", - nfd: "\u{4E0D}", - nfkc: "\u{4E0D}", - nfkd: "\u{4E0D}", - }, - NormalizationTest { - source: "\u{F968}", - nfc: "\u{6CCC}", - nfd: "\u{6CCC}", - nfkc: "\u{6CCC}", - nfkd: "\u{6CCC}", - }, - NormalizationTest { - source: "\u{F969}", - nfc: "\u{6578}", - nfd: "\u{6578}", - nfkc: "\u{6578}", - nfkd: "\u{6578}", - }, - NormalizationTest { - source: "\u{F96A}", - nfc: "\u{7D22}", - nfd: "\u{7D22}", - nfkc: "\u{7D22}", - nfkd: "\u{7D22}", - }, - NormalizationTest { - source: "\u{F96B}", - nfc: "\u{53C3}", - nfd: "\u{53C3}", - nfkc: "\u{53C3}", - nfkd: "\u{53C3}", - }, - NormalizationTest { - source: "\u{F96C}", - nfc: "\u{585E}", - nfd: "\u{585E}", - nfkc: "\u{585E}", - nfkd: "\u{585E}", - }, - NormalizationTest { - source: "\u{F96D}", - nfc: "\u{7701}", - nfd: "\u{7701}", - nfkc: "\u{7701}", - nfkd: "\u{7701}", - }, - NormalizationTest { - source: "\u{F96E}", - nfc: "\u{8449}", - nfd: "\u{8449}", - nfkc: "\u{8449}", - nfkd: "\u{8449}", - }, - NormalizationTest { - source: "\u{F96F}", - nfc: "\u{8AAA}", - nfd: "\u{8AAA}", - nfkc: "\u{8AAA}", - nfkd: "\u{8AAA}", - }, - NormalizationTest { - source: "\u{F970}", - nfc: "\u{6BBA}", - nfd: "\u{6BBA}", - nfkc: "\u{6BBA}", - nfkd: "\u{6BBA}", - }, - NormalizationTest { - source: "\u{F971}", - nfc: "\u{8FB0}", - nfd: "\u{8FB0}", - nfkc: "\u{8FB0}", - nfkd: "\u{8FB0}", - }, - NormalizationTest { - source: "\u{F972}", - nfc: "\u{6C88}", - nfd: "\u{6C88}", - nfkc: "\u{6C88}", - nfkd: "\u{6C88}", - }, - NormalizationTest { - source: "\u{F973}", - nfc: "\u{62FE}", - nfd: "\u{62FE}", - nfkc: "\u{62FE}", - nfkd: "\u{62FE}", - }, - NormalizationTest { - source: "\u{F974}", - nfc: "\u{82E5}", - nfd: "\u{82E5}", - nfkc: "\u{82E5}", - nfkd: "\u{82E5}", - }, - NormalizationTest { - source: "\u{F975}", - nfc: "\u{63A0}", - nfd: "\u{63A0}", - nfkc: "\u{63A0}", - nfkd: "\u{63A0}", - }, - NormalizationTest { - source: "\u{F976}", - nfc: "\u{7565}", - nfd: "\u{7565}", - nfkc: "\u{7565}", - nfkd: "\u{7565}", - }, - NormalizationTest { - source: "\u{F977}", - nfc: "\u{4EAE}", - nfd: "\u{4EAE}", - nfkc: "\u{4EAE}", - nfkd: "\u{4EAE}", - }, - NormalizationTest { - source: "\u{F978}", - nfc: "\u{5169}", - nfd: "\u{5169}", - nfkc: "\u{5169}", - nfkd: "\u{5169}", - }, - NormalizationTest { - source: "\u{F979}", - nfc: "\u{51C9}", - nfd: "\u{51C9}", - nfkc: "\u{51C9}", - nfkd: "\u{51C9}", - }, - NormalizationTest { - source: "\u{F97A}", - nfc: "\u{6881}", - nfd: "\u{6881}", - nfkc: "\u{6881}", - nfkd: "\u{6881}", - }, - NormalizationTest { - source: "\u{F97B}", - nfc: "\u{7CE7}", - nfd: "\u{7CE7}", - nfkc: "\u{7CE7}", - nfkd: "\u{7CE7}", - }, - NormalizationTest { - source: "\u{F97C}", - nfc: "\u{826F}", - nfd: "\u{826F}", - nfkc: "\u{826F}", - nfkd: "\u{826F}", - }, - NormalizationTest { - source: "\u{F97D}", - nfc: "\u{8AD2}", - nfd: "\u{8AD2}", - nfkc: "\u{8AD2}", - nfkd: "\u{8AD2}", - }, - NormalizationTest { - source: "\u{F97E}", - nfc: "\u{91CF}", - nfd: "\u{91CF}", - nfkc: "\u{91CF}", - nfkd: "\u{91CF}", - }, - NormalizationTest { - source: "\u{F97F}", - nfc: "\u{52F5}", - nfd: "\u{52F5}", - nfkc: "\u{52F5}", - nfkd: "\u{52F5}", - }, - NormalizationTest { - source: "\u{F980}", - nfc: "\u{5442}", - nfd: "\u{5442}", - nfkc: "\u{5442}", - nfkd: "\u{5442}", - }, - NormalizationTest { - source: "\u{F981}", - nfc: "\u{5973}", - nfd: "\u{5973}", - nfkc: "\u{5973}", - nfkd: "\u{5973}", - }, - NormalizationTest { - source: "\u{F982}", - nfc: "\u{5EEC}", - nfd: "\u{5EEC}", - nfkc: "\u{5EEC}", - nfkd: "\u{5EEC}", - }, - NormalizationTest { - source: "\u{F983}", - nfc: "\u{65C5}", - nfd: "\u{65C5}", - nfkc: "\u{65C5}", - nfkd: "\u{65C5}", - }, - NormalizationTest { - source: "\u{F984}", - nfc: "\u{6FFE}", - nfd: "\u{6FFE}", - nfkc: "\u{6FFE}", - nfkd: "\u{6FFE}", - }, - NormalizationTest { - source: "\u{F985}", - nfc: "\u{792A}", - nfd: "\u{792A}", - nfkc: "\u{792A}", - nfkd: "\u{792A}", - }, - NormalizationTest { - source: "\u{F986}", - nfc: "\u{95AD}", - nfd: "\u{95AD}", - nfkc: "\u{95AD}", - nfkd: "\u{95AD}", - }, - NormalizationTest { - source: "\u{F987}", - nfc: "\u{9A6A}", - nfd: "\u{9A6A}", - nfkc: "\u{9A6A}", - nfkd: "\u{9A6A}", - }, - NormalizationTest { - source: "\u{F988}", - nfc: "\u{9E97}", - nfd: "\u{9E97}", - nfkc: "\u{9E97}", - nfkd: "\u{9E97}", - }, - NormalizationTest { - source: "\u{F989}", - nfc: "\u{9ECE}", - nfd: "\u{9ECE}", - nfkc: "\u{9ECE}", - nfkd: "\u{9ECE}", - }, - NormalizationTest { - source: "\u{F98A}", - nfc: "\u{529B}", - nfd: "\u{529B}", - nfkc: "\u{529B}", - nfkd: "\u{529B}", - }, - NormalizationTest { - source: "\u{F98B}", - nfc: "\u{66C6}", - nfd: "\u{66C6}", - nfkc: "\u{66C6}", - nfkd: "\u{66C6}", - }, - NormalizationTest { - source: "\u{F98C}", - nfc: "\u{6B77}", - nfd: "\u{6B77}", - nfkc: "\u{6B77}", - nfkd: "\u{6B77}", - }, - NormalizationTest { - source: "\u{F98D}", - nfc: "\u{8F62}", - nfd: "\u{8F62}", - nfkc: "\u{8F62}", - nfkd: "\u{8F62}", - }, - NormalizationTest { - source: "\u{F98E}", - nfc: "\u{5E74}", - nfd: "\u{5E74}", - nfkc: "\u{5E74}", - nfkd: "\u{5E74}", - }, - NormalizationTest { - source: "\u{F98F}", - nfc: "\u{6190}", - nfd: "\u{6190}", - nfkc: "\u{6190}", - nfkd: "\u{6190}", - }, - NormalizationTest { - source: "\u{F990}", - nfc: "\u{6200}", - nfd: "\u{6200}", - nfkc: "\u{6200}", - nfkd: "\u{6200}", - }, - NormalizationTest { - source: "\u{F991}", - nfc: "\u{649A}", - nfd: "\u{649A}", - nfkc: "\u{649A}", - nfkd: "\u{649A}", - }, - NormalizationTest { - source: "\u{F992}", - nfc: "\u{6F23}", - nfd: "\u{6F23}", - nfkc: "\u{6F23}", - nfkd: "\u{6F23}", - }, - NormalizationTest { - source: "\u{F993}", - nfc: "\u{7149}", - nfd: "\u{7149}", - nfkc: "\u{7149}", - nfkd: "\u{7149}", - }, - NormalizationTest { - source: "\u{F994}", - nfc: "\u{7489}", - nfd: "\u{7489}", - nfkc: "\u{7489}", - nfkd: "\u{7489}", - }, - NormalizationTest { - source: "\u{F995}", - nfc: "\u{79CA}", - nfd: "\u{79CA}", - nfkc: "\u{79CA}", - nfkd: "\u{79CA}", - }, - NormalizationTest { - source: "\u{F996}", - nfc: "\u{7DF4}", - nfd: "\u{7DF4}", - nfkc: "\u{7DF4}", - nfkd: "\u{7DF4}", - }, - NormalizationTest { - source: "\u{F997}", - nfc: "\u{806F}", - nfd: "\u{806F}", - nfkc: "\u{806F}", - nfkd: "\u{806F}", - }, - NormalizationTest { - source: "\u{F998}", - nfc: "\u{8F26}", - nfd: "\u{8F26}", - nfkc: "\u{8F26}", - nfkd: "\u{8F26}", - }, - NormalizationTest { - source: "\u{F999}", - nfc: "\u{84EE}", - nfd: "\u{84EE}", - nfkc: "\u{84EE}", - nfkd: "\u{84EE}", - }, - NormalizationTest { - source: "\u{F99A}", - nfc: "\u{9023}", - nfd: "\u{9023}", - nfkc: "\u{9023}", - nfkd: "\u{9023}", - }, - NormalizationTest { - source: "\u{F99B}", - nfc: "\u{934A}", - nfd: "\u{934A}", - nfkc: "\u{934A}", - nfkd: "\u{934A}", - }, - NormalizationTest { - source: "\u{F99C}", - nfc: "\u{5217}", - nfd: "\u{5217}", - nfkc: "\u{5217}", - nfkd: "\u{5217}", - }, - NormalizationTest { - source: "\u{F99D}", - nfc: "\u{52A3}", - nfd: "\u{52A3}", - nfkc: "\u{52A3}", - nfkd: "\u{52A3}", - }, - NormalizationTest { - source: "\u{F99E}", - nfc: "\u{54BD}", - nfd: "\u{54BD}", - nfkc: "\u{54BD}", - nfkd: "\u{54BD}", - }, - NormalizationTest { - source: "\u{F99F}", - nfc: "\u{70C8}", - nfd: "\u{70C8}", - nfkc: "\u{70C8}", - nfkd: "\u{70C8}", - }, - NormalizationTest { - source: "\u{F9A0}", - nfc: "\u{88C2}", - nfd: "\u{88C2}", - nfkc: "\u{88C2}", - nfkd: "\u{88C2}", - }, - NormalizationTest { - source: "\u{F9A1}", - nfc: "\u{8AAA}", - nfd: "\u{8AAA}", - nfkc: "\u{8AAA}", - nfkd: "\u{8AAA}", - }, - NormalizationTest { - source: "\u{F9A2}", - nfc: "\u{5EC9}", - nfd: "\u{5EC9}", - nfkc: "\u{5EC9}", - nfkd: "\u{5EC9}", - }, - NormalizationTest { - source: "\u{F9A3}", - nfc: "\u{5FF5}", - nfd: "\u{5FF5}", - nfkc: "\u{5FF5}", - nfkd: "\u{5FF5}", - }, - NormalizationTest { - source: "\u{F9A4}", - nfc: "\u{637B}", - nfd: "\u{637B}", - nfkc: "\u{637B}", - nfkd: "\u{637B}", - }, - NormalizationTest { - source: "\u{F9A5}", - nfc: "\u{6BAE}", - nfd: "\u{6BAE}", - nfkc: "\u{6BAE}", - nfkd: "\u{6BAE}", - }, - NormalizationTest { - source: "\u{F9A6}", - nfc: "\u{7C3E}", - nfd: "\u{7C3E}", - nfkc: "\u{7C3E}", - nfkd: "\u{7C3E}", - }, - NormalizationTest { - source: "\u{F9A7}", - nfc: "\u{7375}", - nfd: "\u{7375}", - nfkc: "\u{7375}", - nfkd: "\u{7375}", - }, - NormalizationTest { - source: "\u{F9A8}", - nfc: "\u{4EE4}", - nfd: "\u{4EE4}", - nfkc: "\u{4EE4}", - nfkd: "\u{4EE4}", - }, - NormalizationTest { - source: "\u{F9A9}", - nfc: "\u{56F9}", - nfd: "\u{56F9}", - nfkc: "\u{56F9}", - nfkd: "\u{56F9}", - }, - NormalizationTest { - source: "\u{F9AA}", - nfc: "\u{5BE7}", - nfd: "\u{5BE7}", - nfkc: "\u{5BE7}", - nfkd: "\u{5BE7}", - }, - NormalizationTest { - source: "\u{F9AB}", - nfc: "\u{5DBA}", - nfd: "\u{5DBA}", - nfkc: "\u{5DBA}", - nfkd: "\u{5DBA}", - }, - NormalizationTest { - source: "\u{F9AC}", - nfc: "\u{601C}", - nfd: "\u{601C}", - nfkc: "\u{601C}", - nfkd: "\u{601C}", - }, - NormalizationTest { - source: "\u{F9AD}", - nfc: "\u{73B2}", - nfd: "\u{73B2}", - nfkc: "\u{73B2}", - nfkd: "\u{73B2}", - }, - NormalizationTest { - source: "\u{F9AE}", - nfc: "\u{7469}", - nfd: "\u{7469}", - nfkc: "\u{7469}", - nfkd: "\u{7469}", - }, - NormalizationTest { - source: "\u{F9AF}", - nfc: "\u{7F9A}", - nfd: "\u{7F9A}", - nfkc: "\u{7F9A}", - nfkd: "\u{7F9A}", - }, - NormalizationTest { - source: "\u{F9B0}", - nfc: "\u{8046}", - nfd: "\u{8046}", - nfkc: "\u{8046}", - nfkd: "\u{8046}", - }, - NormalizationTest { - source: "\u{F9B1}", - nfc: "\u{9234}", - nfd: "\u{9234}", - nfkc: "\u{9234}", - nfkd: "\u{9234}", - }, - NormalizationTest { - source: "\u{F9B2}", - nfc: "\u{96F6}", - nfd: "\u{96F6}", - nfkc: "\u{96F6}", - nfkd: "\u{96F6}", - }, - NormalizationTest { - source: "\u{F9B3}", - nfc: "\u{9748}", - nfd: "\u{9748}", - nfkc: "\u{9748}", - nfkd: "\u{9748}", - }, - NormalizationTest { - source: "\u{F9B4}", - nfc: "\u{9818}", - nfd: "\u{9818}", - nfkc: "\u{9818}", - nfkd: "\u{9818}", - }, - NormalizationTest { - source: "\u{F9B5}", - nfc: "\u{4F8B}", - nfd: "\u{4F8B}", - nfkc: "\u{4F8B}", - nfkd: "\u{4F8B}", - }, - NormalizationTest { - source: "\u{F9B6}", - nfc: "\u{79AE}", - nfd: "\u{79AE}", - nfkc: "\u{79AE}", - nfkd: "\u{79AE}", - }, - NormalizationTest { - source: "\u{F9B7}", - nfc: "\u{91B4}", - nfd: "\u{91B4}", - nfkc: "\u{91B4}", - nfkd: "\u{91B4}", - }, - NormalizationTest { - source: "\u{F9B8}", - nfc: "\u{96B8}", - nfd: "\u{96B8}", - nfkc: "\u{96B8}", - nfkd: "\u{96B8}", - }, - NormalizationTest { - source: "\u{F9B9}", - nfc: "\u{60E1}", - nfd: "\u{60E1}", - nfkc: "\u{60E1}", - nfkd: "\u{60E1}", - }, - NormalizationTest { - source: "\u{F9BA}", - nfc: "\u{4E86}", - nfd: "\u{4E86}", - nfkc: "\u{4E86}", - nfkd: "\u{4E86}", - }, - NormalizationTest { - source: "\u{F9BB}", - nfc: "\u{50DA}", - nfd: "\u{50DA}", - nfkc: "\u{50DA}", - nfkd: "\u{50DA}", - }, - NormalizationTest { - source: "\u{F9BC}", - nfc: "\u{5BEE}", - nfd: "\u{5BEE}", - nfkc: "\u{5BEE}", - nfkd: "\u{5BEE}", - }, - NormalizationTest { - source: "\u{F9BD}", - nfc: "\u{5C3F}", - nfd: "\u{5C3F}", - nfkc: "\u{5C3F}", - nfkd: "\u{5C3F}", - }, - NormalizationTest { - source: "\u{F9BE}", - nfc: "\u{6599}", - nfd: "\u{6599}", - nfkc: "\u{6599}", - nfkd: "\u{6599}", - }, - NormalizationTest { - source: "\u{F9BF}", - nfc: "\u{6A02}", - nfd: "\u{6A02}", - nfkc: "\u{6A02}", - nfkd: "\u{6A02}", - }, - NormalizationTest { - source: "\u{F9C0}", - nfc: "\u{71CE}", - nfd: "\u{71CE}", - nfkc: "\u{71CE}", - nfkd: "\u{71CE}", - }, - NormalizationTest { - source: "\u{F9C1}", - nfc: "\u{7642}", - nfd: "\u{7642}", - nfkc: "\u{7642}", - nfkd: "\u{7642}", - }, - NormalizationTest { - source: "\u{F9C2}", - nfc: "\u{84FC}", - nfd: "\u{84FC}", - nfkc: "\u{84FC}", - nfkd: "\u{84FC}", - }, - NormalizationTest { - source: "\u{F9C3}", - nfc: "\u{907C}", - nfd: "\u{907C}", - nfkc: "\u{907C}", - nfkd: "\u{907C}", - }, - NormalizationTest { - source: "\u{F9C4}", - nfc: "\u{9F8D}", - nfd: "\u{9F8D}", - nfkc: "\u{9F8D}", - nfkd: "\u{9F8D}", - }, - NormalizationTest { - source: "\u{F9C5}", - nfc: "\u{6688}", - nfd: "\u{6688}", - nfkc: "\u{6688}", - nfkd: "\u{6688}", - }, - NormalizationTest { - source: "\u{F9C6}", - nfc: "\u{962E}", - nfd: "\u{962E}", - nfkc: "\u{962E}", - nfkd: "\u{962E}", - }, - NormalizationTest { - source: "\u{F9C7}", - nfc: "\u{5289}", - nfd: "\u{5289}", - nfkc: "\u{5289}", - nfkd: "\u{5289}", - }, - NormalizationTest { - source: "\u{F9C8}", - nfc: "\u{677B}", - nfd: "\u{677B}", - nfkc: "\u{677B}", - nfkd: "\u{677B}", - }, - NormalizationTest { - source: "\u{F9C9}", - nfc: "\u{67F3}", - nfd: "\u{67F3}", - nfkc: "\u{67F3}", - nfkd: "\u{67F3}", - }, - NormalizationTest { - source: "\u{F9CA}", - nfc: "\u{6D41}", - nfd: "\u{6D41}", - nfkc: "\u{6D41}", - nfkd: "\u{6D41}", - }, - NormalizationTest { - source: "\u{F9CB}", - nfc: "\u{6E9C}", - nfd: "\u{6E9C}", - nfkc: "\u{6E9C}", - nfkd: "\u{6E9C}", - }, - NormalizationTest { - source: "\u{F9CC}", - nfc: "\u{7409}", - nfd: "\u{7409}", - nfkc: "\u{7409}", - nfkd: "\u{7409}", - }, - NormalizationTest { - source: "\u{F9CD}", - nfc: "\u{7559}", - nfd: "\u{7559}", - nfkc: "\u{7559}", - nfkd: "\u{7559}", - }, - NormalizationTest { - source: "\u{F9CE}", - nfc: "\u{786B}", - nfd: "\u{786B}", - nfkc: "\u{786B}", - nfkd: "\u{786B}", - }, - NormalizationTest { - source: "\u{F9CF}", - nfc: "\u{7D10}", - nfd: "\u{7D10}", - nfkc: "\u{7D10}", - nfkd: "\u{7D10}", - }, - NormalizationTest { - source: "\u{F9D0}", - nfc: "\u{985E}", - nfd: "\u{985E}", - nfkc: "\u{985E}", - nfkd: "\u{985E}", - }, - NormalizationTest { - source: "\u{F9D1}", - nfc: "\u{516D}", - nfd: "\u{516D}", - nfkc: "\u{516D}", - nfkd: "\u{516D}", - }, - NormalizationTest { - source: "\u{F9D2}", - nfc: "\u{622E}", - nfd: "\u{622E}", - nfkc: "\u{622E}", - nfkd: "\u{622E}", - }, - NormalizationTest { - source: "\u{F9D3}", - nfc: "\u{9678}", - nfd: "\u{9678}", - nfkc: "\u{9678}", - nfkd: "\u{9678}", - }, - NormalizationTest { - source: "\u{F9D4}", - nfc: "\u{502B}", - nfd: "\u{502B}", - nfkc: "\u{502B}", - nfkd: "\u{502B}", - }, - NormalizationTest { - source: "\u{F9D5}", - nfc: "\u{5D19}", - nfd: "\u{5D19}", - nfkc: "\u{5D19}", - nfkd: "\u{5D19}", - }, - NormalizationTest { - source: "\u{F9D6}", - nfc: "\u{6DEA}", - nfd: "\u{6DEA}", - nfkc: "\u{6DEA}", - nfkd: "\u{6DEA}", - }, - NormalizationTest { - source: "\u{F9D7}", - nfc: "\u{8F2A}", - nfd: "\u{8F2A}", - nfkc: "\u{8F2A}", - nfkd: "\u{8F2A}", - }, - NormalizationTest { - source: "\u{F9D8}", - nfc: "\u{5F8B}", - nfd: "\u{5F8B}", - nfkc: "\u{5F8B}", - nfkd: "\u{5F8B}", - }, - NormalizationTest { - source: "\u{F9D9}", - nfc: "\u{6144}", - nfd: "\u{6144}", - nfkc: "\u{6144}", - nfkd: "\u{6144}", - }, - NormalizationTest { - source: "\u{F9DA}", - nfc: "\u{6817}", - nfd: "\u{6817}", - nfkc: "\u{6817}", - nfkd: "\u{6817}", - }, - NormalizationTest { - source: "\u{F9DB}", - nfc: "\u{7387}", - nfd: "\u{7387}", - nfkc: "\u{7387}", - nfkd: "\u{7387}", - }, - NormalizationTest { - source: "\u{F9DC}", - nfc: "\u{9686}", - nfd: "\u{9686}", - nfkc: "\u{9686}", - nfkd: "\u{9686}", - }, - NormalizationTest { - source: "\u{F9DD}", - nfc: "\u{5229}", - nfd: "\u{5229}", - nfkc: "\u{5229}", - nfkd: "\u{5229}", - }, - NormalizationTest { - source: "\u{F9DE}", - nfc: "\u{540F}", - nfd: "\u{540F}", - nfkc: "\u{540F}", - nfkd: "\u{540F}", - }, - NormalizationTest { - source: "\u{F9DF}", - nfc: "\u{5C65}", - nfd: "\u{5C65}", - nfkc: "\u{5C65}", - nfkd: "\u{5C65}", - }, - NormalizationTest { - source: "\u{F9E0}", - nfc: "\u{6613}", - nfd: "\u{6613}", - nfkc: "\u{6613}", - nfkd: "\u{6613}", - }, - NormalizationTest { - source: "\u{F9E1}", - nfc: "\u{674E}", - nfd: "\u{674E}", - nfkc: "\u{674E}", - nfkd: "\u{674E}", - }, - NormalizationTest { - source: "\u{F9E2}", - nfc: "\u{68A8}", - nfd: "\u{68A8}", - nfkc: "\u{68A8}", - nfkd: "\u{68A8}", - }, - NormalizationTest { - source: "\u{F9E3}", - nfc: "\u{6CE5}", - nfd: "\u{6CE5}", - nfkc: "\u{6CE5}", - nfkd: "\u{6CE5}", - }, - NormalizationTest { - source: "\u{F9E4}", - nfc: "\u{7406}", - nfd: "\u{7406}", - nfkc: "\u{7406}", - nfkd: "\u{7406}", - }, - NormalizationTest { - source: "\u{F9E5}", - nfc: "\u{75E2}", - nfd: "\u{75E2}", - nfkc: "\u{75E2}", - nfkd: "\u{75E2}", - }, - NormalizationTest { - source: "\u{F9E6}", - nfc: "\u{7F79}", - nfd: "\u{7F79}", - nfkc: "\u{7F79}", - nfkd: "\u{7F79}", - }, - NormalizationTest { - source: "\u{F9E7}", - nfc: "\u{88CF}", - nfd: "\u{88CF}", - nfkc: "\u{88CF}", - nfkd: "\u{88CF}", - }, - NormalizationTest { - source: "\u{F9E8}", - nfc: "\u{88E1}", - nfd: "\u{88E1}", - nfkc: "\u{88E1}", - nfkd: "\u{88E1}", - }, - NormalizationTest { - source: "\u{F9E9}", - nfc: "\u{91CC}", - nfd: "\u{91CC}", - nfkc: "\u{91CC}", - nfkd: "\u{91CC}", - }, - NormalizationTest { - source: "\u{F9EA}", - nfc: "\u{96E2}", - nfd: "\u{96E2}", - nfkc: "\u{96E2}", - nfkd: "\u{96E2}", - }, - NormalizationTest { - source: "\u{F9EB}", - nfc: "\u{533F}", - nfd: "\u{533F}", - nfkc: "\u{533F}", - nfkd: "\u{533F}", - }, - NormalizationTest { - source: "\u{F9EC}", - nfc: "\u{6EBA}", - nfd: "\u{6EBA}", - nfkc: "\u{6EBA}", - nfkd: "\u{6EBA}", - }, - NormalizationTest { - source: "\u{F9ED}", - nfc: "\u{541D}", - nfd: "\u{541D}", - nfkc: "\u{541D}", - nfkd: "\u{541D}", - }, - NormalizationTest { - source: "\u{F9EE}", - nfc: "\u{71D0}", - nfd: "\u{71D0}", - nfkc: "\u{71D0}", - nfkd: "\u{71D0}", - }, - NormalizationTest { - source: "\u{F9EF}", - nfc: "\u{7498}", - nfd: "\u{7498}", - nfkc: "\u{7498}", - nfkd: "\u{7498}", - }, - NormalizationTest { - source: "\u{F9F0}", - nfc: "\u{85FA}", - nfd: "\u{85FA}", - nfkc: "\u{85FA}", - nfkd: "\u{85FA}", - }, - NormalizationTest { - source: "\u{F9F1}", - nfc: "\u{96A3}", - nfd: "\u{96A3}", - nfkc: "\u{96A3}", - nfkd: "\u{96A3}", - }, - NormalizationTest { - source: "\u{F9F2}", - nfc: "\u{9C57}", - nfd: "\u{9C57}", - nfkc: "\u{9C57}", - nfkd: "\u{9C57}", - }, - NormalizationTest { - source: "\u{F9F3}", - nfc: "\u{9E9F}", - nfd: "\u{9E9F}", - nfkc: "\u{9E9F}", - nfkd: "\u{9E9F}", - }, - NormalizationTest { - source: "\u{F9F4}", - nfc: "\u{6797}", - nfd: "\u{6797}", - nfkc: "\u{6797}", - nfkd: "\u{6797}", - }, - NormalizationTest { - source: "\u{F9F5}", - nfc: "\u{6DCB}", - nfd: "\u{6DCB}", - nfkc: "\u{6DCB}", - nfkd: "\u{6DCB}", - }, - NormalizationTest { - source: "\u{F9F6}", - nfc: "\u{81E8}", - nfd: "\u{81E8}", - nfkc: "\u{81E8}", - nfkd: "\u{81E8}", - }, - NormalizationTest { - source: "\u{F9F7}", - nfc: "\u{7ACB}", - nfd: "\u{7ACB}", - nfkc: "\u{7ACB}", - nfkd: "\u{7ACB}", - }, - NormalizationTest { - source: "\u{F9F8}", - nfc: "\u{7B20}", - nfd: "\u{7B20}", - nfkc: "\u{7B20}", - nfkd: "\u{7B20}", - }, - NormalizationTest { - source: "\u{F9F9}", - nfc: "\u{7C92}", - nfd: "\u{7C92}", - nfkc: "\u{7C92}", - nfkd: "\u{7C92}", - }, - NormalizationTest { - source: "\u{F9FA}", - nfc: "\u{72C0}", - nfd: "\u{72C0}", - nfkc: "\u{72C0}", - nfkd: "\u{72C0}", - }, - NormalizationTest { - source: "\u{F9FB}", - nfc: "\u{7099}", - nfd: "\u{7099}", - nfkc: "\u{7099}", - nfkd: "\u{7099}", - }, - NormalizationTest { - source: "\u{F9FC}", - nfc: "\u{8B58}", - nfd: "\u{8B58}", - nfkc: "\u{8B58}", - nfkd: "\u{8B58}", - }, - NormalizationTest { - source: "\u{F9FD}", - nfc: "\u{4EC0}", - nfd: "\u{4EC0}", - nfkc: "\u{4EC0}", - nfkd: "\u{4EC0}", - }, - NormalizationTest { - source: "\u{F9FE}", - nfc: "\u{8336}", - nfd: "\u{8336}", - nfkc: "\u{8336}", - nfkd: "\u{8336}", - }, - NormalizationTest { - source: "\u{F9FF}", - nfc: "\u{523A}", - nfd: "\u{523A}", - nfkc: "\u{523A}", - nfkd: "\u{523A}", - }, - NormalizationTest { - source: "\u{FA00}", - nfc: "\u{5207}", - nfd: "\u{5207}", - nfkc: "\u{5207}", - nfkd: "\u{5207}", - }, - NormalizationTest { - source: "\u{FA01}", - nfc: "\u{5EA6}", - nfd: "\u{5EA6}", - nfkc: "\u{5EA6}", - nfkd: "\u{5EA6}", - }, - NormalizationTest { - source: "\u{FA02}", - nfc: "\u{62D3}", - nfd: "\u{62D3}", - nfkc: "\u{62D3}", - nfkd: "\u{62D3}", - }, - NormalizationTest { - source: "\u{FA03}", - nfc: "\u{7CD6}", - nfd: "\u{7CD6}", - nfkc: "\u{7CD6}", - nfkd: "\u{7CD6}", - }, - NormalizationTest { - source: "\u{FA04}", - nfc: "\u{5B85}", - nfd: "\u{5B85}", - nfkc: "\u{5B85}", - nfkd: "\u{5B85}", - }, - NormalizationTest { - source: "\u{FA05}", - nfc: "\u{6D1E}", - nfd: "\u{6D1E}", - nfkc: "\u{6D1E}", - nfkd: "\u{6D1E}", - }, - NormalizationTest { - source: "\u{FA06}", - nfc: "\u{66B4}", - nfd: "\u{66B4}", - nfkc: "\u{66B4}", - nfkd: "\u{66B4}", - }, - NormalizationTest { - source: "\u{FA07}", - nfc: "\u{8F3B}", - nfd: "\u{8F3B}", - nfkc: "\u{8F3B}", - nfkd: "\u{8F3B}", - }, - NormalizationTest { - source: "\u{FA08}", - nfc: "\u{884C}", - nfd: "\u{884C}", - nfkc: "\u{884C}", - nfkd: "\u{884C}", - }, - NormalizationTest { - source: "\u{FA09}", - nfc: "\u{964D}", - nfd: "\u{964D}", - nfkc: "\u{964D}", - nfkd: "\u{964D}", - }, - NormalizationTest { - source: "\u{FA0A}", - nfc: "\u{898B}", - nfd: "\u{898B}", - nfkc: "\u{898B}", - nfkd: "\u{898B}", - }, - NormalizationTest { - source: "\u{FA0B}", - nfc: "\u{5ED3}", - nfd: "\u{5ED3}", - nfkc: "\u{5ED3}", - nfkd: "\u{5ED3}", - }, - NormalizationTest { - source: "\u{FA0C}", - nfc: "\u{5140}", - nfd: "\u{5140}", - nfkc: "\u{5140}", - nfkd: "\u{5140}", - }, - NormalizationTest { - source: "\u{FA0D}", - nfc: "\u{55C0}", - nfd: "\u{55C0}", - nfkc: "\u{55C0}", - nfkd: "\u{55C0}", - }, - NormalizationTest { - source: "\u{FA10}", - nfc: "\u{585A}", - nfd: "\u{585A}", - nfkc: "\u{585A}", - nfkd: "\u{585A}", - }, - NormalizationTest { - source: "\u{FA12}", - nfc: "\u{6674}", - nfd: "\u{6674}", - nfkc: "\u{6674}", - nfkd: "\u{6674}", - }, - NormalizationTest { - source: "\u{FA15}", - nfc: "\u{51DE}", - nfd: "\u{51DE}", - nfkc: "\u{51DE}", - nfkd: "\u{51DE}", - }, - NormalizationTest { - source: "\u{FA16}", - nfc: "\u{732A}", - nfd: "\u{732A}", - nfkc: "\u{732A}", - nfkd: "\u{732A}", - }, - NormalizationTest { - source: "\u{FA17}", - nfc: "\u{76CA}", - nfd: "\u{76CA}", - nfkc: "\u{76CA}", - nfkd: "\u{76CA}", - }, - NormalizationTest { - source: "\u{FA18}", - nfc: "\u{793C}", - nfd: "\u{793C}", - nfkc: "\u{793C}", - nfkd: "\u{793C}", - }, - NormalizationTest { - source: "\u{FA19}", - nfc: "\u{795E}", - nfd: "\u{795E}", - nfkc: "\u{795E}", - nfkd: "\u{795E}", - }, - NormalizationTest { - source: "\u{FA1A}", - nfc: "\u{7965}", - nfd: "\u{7965}", - nfkc: "\u{7965}", - nfkd: "\u{7965}", - }, - NormalizationTest { - source: "\u{FA1B}", - nfc: "\u{798F}", - nfd: "\u{798F}", - nfkc: "\u{798F}", - nfkd: "\u{798F}", - }, - NormalizationTest { - source: "\u{FA1C}", - nfc: "\u{9756}", - nfd: "\u{9756}", - nfkc: "\u{9756}", - nfkd: "\u{9756}", - }, - NormalizationTest { - source: "\u{FA1D}", - nfc: "\u{7CBE}", - nfd: "\u{7CBE}", - nfkc: "\u{7CBE}", - nfkd: "\u{7CBE}", - }, - NormalizationTest { - source: "\u{FA1E}", - nfc: "\u{7FBD}", - nfd: "\u{7FBD}", - nfkc: "\u{7FBD}", - nfkd: "\u{7FBD}", - }, - NormalizationTest { - source: "\u{FA20}", - nfc: "\u{8612}", - nfd: "\u{8612}", - nfkc: "\u{8612}", - nfkd: "\u{8612}", - }, - NormalizationTest { - source: "\u{FA22}", - nfc: "\u{8AF8}", - nfd: "\u{8AF8}", - nfkc: "\u{8AF8}", - nfkd: "\u{8AF8}", - }, - NormalizationTest { - source: "\u{FA25}", - nfc: "\u{9038}", - nfd: "\u{9038}", - nfkc: "\u{9038}", - nfkd: "\u{9038}", - }, - NormalizationTest { - source: "\u{FA26}", - nfc: "\u{90FD}", - nfd: "\u{90FD}", - nfkc: "\u{90FD}", - nfkd: "\u{90FD}", - }, - NormalizationTest { - source: "\u{FA2A}", - nfc: "\u{98EF}", - nfd: "\u{98EF}", - nfkc: "\u{98EF}", - nfkd: "\u{98EF}", - }, - NormalizationTest { - source: "\u{FA2B}", - nfc: "\u{98FC}", - nfd: "\u{98FC}", - nfkc: "\u{98FC}", - nfkd: "\u{98FC}", - }, - NormalizationTest { - source: "\u{FA2C}", - nfc: "\u{9928}", - nfd: "\u{9928}", - nfkc: "\u{9928}", - nfkd: "\u{9928}", - }, - NormalizationTest { - source: "\u{FA2D}", - nfc: "\u{9DB4}", - nfd: "\u{9DB4}", - nfkc: "\u{9DB4}", - nfkd: "\u{9DB4}", - }, - NormalizationTest { - source: "\u{FA2E}", - nfc: "\u{90DE}", - nfd: "\u{90DE}", - nfkc: "\u{90DE}", - nfkd: "\u{90DE}", - }, - NormalizationTest { - source: "\u{FA2F}", - nfc: "\u{96B7}", - nfd: "\u{96B7}", - nfkc: "\u{96B7}", - nfkd: "\u{96B7}", - }, - NormalizationTest { - source: "\u{FA30}", - nfc: "\u{4FAE}", - nfd: "\u{4FAE}", - nfkc: "\u{4FAE}", - nfkd: "\u{4FAE}", - }, - NormalizationTest { - source: "\u{FA31}", - nfc: "\u{50E7}", - nfd: "\u{50E7}", - nfkc: "\u{50E7}", - nfkd: "\u{50E7}", - }, - NormalizationTest { - source: "\u{FA32}", - nfc: "\u{514D}", - nfd: "\u{514D}", - nfkc: "\u{514D}", - nfkd: "\u{514D}", - }, - NormalizationTest { - source: "\u{FA33}", - nfc: "\u{52C9}", - nfd: "\u{52C9}", - nfkc: "\u{52C9}", - nfkd: "\u{52C9}", - }, - NormalizationTest { - source: "\u{FA34}", - nfc: "\u{52E4}", - nfd: "\u{52E4}", - nfkc: "\u{52E4}", - nfkd: "\u{52E4}", - }, - NormalizationTest { - source: "\u{FA35}", - nfc: "\u{5351}", - nfd: "\u{5351}", - nfkc: "\u{5351}", - nfkd: "\u{5351}", - }, - NormalizationTest { - source: "\u{FA36}", - nfc: "\u{559D}", - nfd: "\u{559D}", - nfkc: "\u{559D}", - nfkd: "\u{559D}", - }, - NormalizationTest { - source: "\u{FA37}", - nfc: "\u{5606}", - nfd: "\u{5606}", - nfkc: "\u{5606}", - nfkd: "\u{5606}", - }, - NormalizationTest { - source: "\u{FA38}", - nfc: "\u{5668}", - nfd: "\u{5668}", - nfkc: "\u{5668}", - nfkd: "\u{5668}", - }, - NormalizationTest { - source: "\u{FA39}", - nfc: "\u{5840}", - nfd: "\u{5840}", - nfkc: "\u{5840}", - nfkd: "\u{5840}", - }, - NormalizationTest { - source: "\u{FA3A}", - nfc: "\u{58A8}", - nfd: "\u{58A8}", - nfkc: "\u{58A8}", - nfkd: "\u{58A8}", - }, - NormalizationTest { - source: "\u{FA3B}", - nfc: "\u{5C64}", - nfd: "\u{5C64}", - nfkc: "\u{5C64}", - nfkd: "\u{5C64}", - }, - NormalizationTest { - source: "\u{FA3C}", - nfc: "\u{5C6E}", - nfd: "\u{5C6E}", - nfkc: "\u{5C6E}", - nfkd: "\u{5C6E}", - }, - NormalizationTest { - source: "\u{FA3D}", - nfc: "\u{6094}", - nfd: "\u{6094}", - nfkc: "\u{6094}", - nfkd: "\u{6094}", - }, - NormalizationTest { - source: "\u{FA3E}", - nfc: "\u{6168}", - nfd: "\u{6168}", - nfkc: "\u{6168}", - nfkd: "\u{6168}", - }, - NormalizationTest { - source: "\u{FA3F}", - nfc: "\u{618E}", - nfd: "\u{618E}", - nfkc: "\u{618E}", - nfkd: "\u{618E}", - }, - NormalizationTest { - source: "\u{FA40}", - nfc: "\u{61F2}", - nfd: "\u{61F2}", - nfkc: "\u{61F2}", - nfkd: "\u{61F2}", - }, - NormalizationTest { - source: "\u{FA41}", - nfc: "\u{654F}", - nfd: "\u{654F}", - nfkc: "\u{654F}", - nfkd: "\u{654F}", - }, - NormalizationTest { - source: "\u{FA42}", - nfc: "\u{65E2}", - nfd: "\u{65E2}", - nfkc: "\u{65E2}", - nfkd: "\u{65E2}", - }, - NormalizationTest { - source: "\u{FA43}", - nfc: "\u{6691}", - nfd: "\u{6691}", - nfkc: "\u{6691}", - nfkd: "\u{6691}", - }, - NormalizationTest { - source: "\u{FA44}", - nfc: "\u{6885}", - nfd: "\u{6885}", - nfkc: "\u{6885}", - nfkd: "\u{6885}", - }, - NormalizationTest { - source: "\u{FA45}", - nfc: "\u{6D77}", - nfd: "\u{6D77}", - nfkc: "\u{6D77}", - nfkd: "\u{6D77}", - }, - NormalizationTest { - source: "\u{FA46}", - nfc: "\u{6E1A}", - nfd: "\u{6E1A}", - nfkc: "\u{6E1A}", - nfkd: "\u{6E1A}", - }, - NormalizationTest { - source: "\u{FA47}", - nfc: "\u{6F22}", - nfd: "\u{6F22}", - nfkc: "\u{6F22}", - nfkd: "\u{6F22}", - }, - NormalizationTest { - source: "\u{FA48}", - nfc: "\u{716E}", - nfd: "\u{716E}", - nfkc: "\u{716E}", - nfkd: "\u{716E}", - }, - NormalizationTest { - source: "\u{FA49}", - nfc: "\u{722B}", - nfd: "\u{722B}", - nfkc: "\u{722B}", - nfkd: "\u{722B}", - }, - NormalizationTest { - source: "\u{FA4A}", - nfc: "\u{7422}", - nfd: "\u{7422}", - nfkc: "\u{7422}", - nfkd: "\u{7422}", - }, - NormalizationTest { - source: "\u{FA4B}", - nfc: "\u{7891}", - nfd: "\u{7891}", - nfkc: "\u{7891}", - nfkd: "\u{7891}", - }, - NormalizationTest { - source: "\u{FA4C}", - nfc: "\u{793E}", - nfd: "\u{793E}", - nfkc: "\u{793E}", - nfkd: "\u{793E}", - }, - NormalizationTest { - source: "\u{FA4D}", - nfc: "\u{7949}", - nfd: "\u{7949}", - nfkc: "\u{7949}", - nfkd: "\u{7949}", - }, - NormalizationTest { - source: "\u{FA4E}", - nfc: "\u{7948}", - nfd: "\u{7948}", - nfkc: "\u{7948}", - nfkd: "\u{7948}", - }, - NormalizationTest { - source: "\u{FA4F}", - nfc: "\u{7950}", - nfd: "\u{7950}", - nfkc: "\u{7950}", - nfkd: "\u{7950}", - }, - NormalizationTest { - source: "\u{FA50}", - nfc: "\u{7956}", - nfd: "\u{7956}", - nfkc: "\u{7956}", - nfkd: "\u{7956}", - }, - NormalizationTest { - source: "\u{FA51}", - nfc: "\u{795D}", - nfd: "\u{795D}", - nfkc: "\u{795D}", - nfkd: "\u{795D}", - }, - NormalizationTest { - source: "\u{FA52}", - nfc: "\u{798D}", - nfd: "\u{798D}", - nfkc: "\u{798D}", - nfkd: "\u{798D}", - }, - NormalizationTest { - source: "\u{FA53}", - nfc: "\u{798E}", - nfd: "\u{798E}", - nfkc: "\u{798E}", - nfkd: "\u{798E}", - }, - NormalizationTest { - source: "\u{FA54}", - nfc: "\u{7A40}", - nfd: "\u{7A40}", - nfkc: "\u{7A40}", - nfkd: "\u{7A40}", - }, - NormalizationTest { - source: "\u{FA55}", - nfc: "\u{7A81}", - nfd: "\u{7A81}", - nfkc: "\u{7A81}", - nfkd: "\u{7A81}", - }, - NormalizationTest { - source: "\u{FA56}", - nfc: "\u{7BC0}", - nfd: "\u{7BC0}", - nfkc: "\u{7BC0}", - nfkd: "\u{7BC0}", - }, - NormalizationTest { - source: "\u{FA57}", - nfc: "\u{7DF4}", - nfd: "\u{7DF4}", - nfkc: "\u{7DF4}", - nfkd: "\u{7DF4}", - }, - NormalizationTest { - source: "\u{FA58}", - nfc: "\u{7E09}", - nfd: "\u{7E09}", - nfkc: "\u{7E09}", - nfkd: "\u{7E09}", - }, - NormalizationTest { - source: "\u{FA59}", - nfc: "\u{7E41}", - nfd: "\u{7E41}", - nfkc: "\u{7E41}", - nfkd: "\u{7E41}", - }, - NormalizationTest { - source: "\u{FA5A}", - nfc: "\u{7F72}", - nfd: "\u{7F72}", - nfkc: "\u{7F72}", - nfkd: "\u{7F72}", - }, - NormalizationTest { - source: "\u{FA5B}", - nfc: "\u{8005}", - nfd: "\u{8005}", - nfkc: "\u{8005}", - nfkd: "\u{8005}", - }, - NormalizationTest { - source: "\u{FA5C}", - nfc: "\u{81ED}", - nfd: "\u{81ED}", - nfkc: "\u{81ED}", - nfkd: "\u{81ED}", - }, - NormalizationTest { - source: "\u{FA5D}", - nfc: "\u{8279}", - nfd: "\u{8279}", - nfkc: "\u{8279}", - nfkd: "\u{8279}", - }, - NormalizationTest { - source: "\u{FA5E}", - nfc: "\u{8279}", - nfd: "\u{8279}", - nfkc: "\u{8279}", - nfkd: "\u{8279}", - }, - NormalizationTest { - source: "\u{FA5F}", - nfc: "\u{8457}", - nfd: "\u{8457}", - nfkc: "\u{8457}", - nfkd: "\u{8457}", - }, - NormalizationTest { - source: "\u{FA60}", - nfc: "\u{8910}", - nfd: "\u{8910}", - nfkc: "\u{8910}", - nfkd: "\u{8910}", - }, - NormalizationTest { - source: "\u{FA61}", - nfc: "\u{8996}", - nfd: "\u{8996}", - nfkc: "\u{8996}", - nfkd: "\u{8996}", - }, - NormalizationTest { - source: "\u{FA62}", - nfc: "\u{8B01}", - nfd: "\u{8B01}", - nfkc: "\u{8B01}", - nfkd: "\u{8B01}", - }, - NormalizationTest { - source: "\u{FA63}", - nfc: "\u{8B39}", - nfd: "\u{8B39}", - nfkc: "\u{8B39}", - nfkd: "\u{8B39}", - }, - NormalizationTest { - source: "\u{FA64}", - nfc: "\u{8CD3}", - nfd: "\u{8CD3}", - nfkc: "\u{8CD3}", - nfkd: "\u{8CD3}", - }, - NormalizationTest { - source: "\u{FA65}", - nfc: "\u{8D08}", - nfd: "\u{8D08}", - nfkc: "\u{8D08}", - nfkd: "\u{8D08}", - }, - NormalizationTest { - source: "\u{FA66}", - nfc: "\u{8FB6}", - nfd: "\u{8FB6}", - nfkc: "\u{8FB6}", - nfkd: "\u{8FB6}", - }, - NormalizationTest { - source: "\u{FA67}", - nfc: "\u{9038}", - nfd: "\u{9038}", - nfkc: "\u{9038}", - nfkd: "\u{9038}", - }, - NormalizationTest { - source: "\u{FA68}", - nfc: "\u{96E3}", - nfd: "\u{96E3}", - nfkc: "\u{96E3}", - nfkd: "\u{96E3}", - }, - NormalizationTest { - source: "\u{FA69}", - nfc: "\u{97FF}", - nfd: "\u{97FF}", - nfkc: "\u{97FF}", - nfkd: "\u{97FF}", - }, - NormalizationTest { - source: "\u{FA6A}", - nfc: "\u{983B}", - nfd: "\u{983B}", - nfkc: "\u{983B}", - nfkd: "\u{983B}", - }, - NormalizationTest { - source: "\u{FA6B}", - nfc: "\u{6075}", - nfd: "\u{6075}", - nfkc: "\u{6075}", - nfkd: "\u{6075}", - }, - NormalizationTest { - source: "\u{FA6C}", - nfc: "\u{242EE}", - nfd: "\u{242EE}", - nfkc: "\u{242EE}", - nfkd: "\u{242EE}", - }, - NormalizationTest { - source: "\u{FA6D}", - nfc: "\u{8218}", - nfd: "\u{8218}", - nfkc: "\u{8218}", - nfkd: "\u{8218}", - }, - NormalizationTest { - source: "\u{FA70}", - nfc: "\u{4E26}", - nfd: "\u{4E26}", - nfkc: "\u{4E26}", - nfkd: "\u{4E26}", - }, - NormalizationTest { - source: "\u{FA71}", - nfc: "\u{51B5}", - nfd: "\u{51B5}", - nfkc: "\u{51B5}", - nfkd: "\u{51B5}", - }, - NormalizationTest { - source: "\u{FA72}", - nfc: "\u{5168}", - nfd: "\u{5168}", - nfkc: "\u{5168}", - nfkd: "\u{5168}", - }, - NormalizationTest { - source: "\u{FA73}", - nfc: "\u{4F80}", - nfd: "\u{4F80}", - nfkc: "\u{4F80}", - nfkd: "\u{4F80}", - }, - NormalizationTest { - source: "\u{FA74}", - nfc: "\u{5145}", - nfd: "\u{5145}", - nfkc: "\u{5145}", - nfkd: "\u{5145}", - }, - NormalizationTest { - source: "\u{FA75}", - nfc: "\u{5180}", - nfd: "\u{5180}", - nfkc: "\u{5180}", - nfkd: "\u{5180}", - }, - NormalizationTest { - source: "\u{FA76}", - nfc: "\u{52C7}", - nfd: "\u{52C7}", - nfkc: "\u{52C7}", - nfkd: "\u{52C7}", - }, - NormalizationTest { - source: "\u{FA77}", - nfc: "\u{52FA}", - nfd: "\u{52FA}", - nfkc: "\u{52FA}", - nfkd: "\u{52FA}", - }, - NormalizationTest { - source: "\u{FA78}", - nfc: "\u{559D}", - nfd: "\u{559D}", - nfkc: "\u{559D}", - nfkd: "\u{559D}", - }, - NormalizationTest { - source: "\u{FA79}", - nfc: "\u{5555}", - nfd: "\u{5555}", - nfkc: "\u{5555}", - nfkd: "\u{5555}", - }, - NormalizationTest { - source: "\u{FA7A}", - nfc: "\u{5599}", - nfd: "\u{5599}", - nfkc: "\u{5599}", - nfkd: "\u{5599}", - }, - NormalizationTest { - source: "\u{FA7B}", - nfc: "\u{55E2}", - nfd: "\u{55E2}", - nfkc: "\u{55E2}", - nfkd: "\u{55E2}", - }, - NormalizationTest { - source: "\u{FA7C}", - nfc: "\u{585A}", - nfd: "\u{585A}", - nfkc: "\u{585A}", - nfkd: "\u{585A}", - }, - NormalizationTest { - source: "\u{FA7D}", - nfc: "\u{58B3}", - nfd: "\u{58B3}", - nfkc: "\u{58B3}", - nfkd: "\u{58B3}", - }, - NormalizationTest { - source: "\u{FA7E}", - nfc: "\u{5944}", - nfd: "\u{5944}", - nfkc: "\u{5944}", - nfkd: "\u{5944}", - }, - NormalizationTest { - source: "\u{FA7F}", - nfc: "\u{5954}", - nfd: "\u{5954}", - nfkc: "\u{5954}", - nfkd: "\u{5954}", - }, - NormalizationTest { - source: "\u{FA80}", - nfc: "\u{5A62}", - nfd: "\u{5A62}", - nfkc: "\u{5A62}", - nfkd: "\u{5A62}", - }, - NormalizationTest { - source: "\u{FA81}", - nfc: "\u{5B28}", - nfd: "\u{5B28}", - nfkc: "\u{5B28}", - nfkd: "\u{5B28}", - }, - NormalizationTest { - source: "\u{FA82}", - nfc: "\u{5ED2}", - nfd: "\u{5ED2}", - nfkc: "\u{5ED2}", - nfkd: "\u{5ED2}", - }, - NormalizationTest { - source: "\u{FA83}", - nfc: "\u{5ED9}", - nfd: "\u{5ED9}", - nfkc: "\u{5ED9}", - nfkd: "\u{5ED9}", - }, - NormalizationTest { - source: "\u{FA84}", - nfc: "\u{5F69}", - nfd: "\u{5F69}", - nfkc: "\u{5F69}", - nfkd: "\u{5F69}", - }, - NormalizationTest { - source: "\u{FA85}", - nfc: "\u{5FAD}", - nfd: "\u{5FAD}", - nfkc: "\u{5FAD}", - nfkd: "\u{5FAD}", - }, - NormalizationTest { - source: "\u{FA86}", - nfc: "\u{60D8}", - nfd: "\u{60D8}", - nfkc: "\u{60D8}", - nfkd: "\u{60D8}", - }, - NormalizationTest { - source: "\u{FA87}", - nfc: "\u{614E}", - nfd: "\u{614E}", - nfkc: "\u{614E}", - nfkd: "\u{614E}", - }, - NormalizationTest { - source: "\u{FA88}", - nfc: "\u{6108}", - nfd: "\u{6108}", - nfkc: "\u{6108}", - nfkd: "\u{6108}", - }, - NormalizationTest { - source: "\u{FA89}", - nfc: "\u{618E}", - nfd: "\u{618E}", - nfkc: "\u{618E}", - nfkd: "\u{618E}", - }, - NormalizationTest { - source: "\u{FA8A}", - nfc: "\u{6160}", - nfd: "\u{6160}", - nfkc: "\u{6160}", - nfkd: "\u{6160}", - }, - NormalizationTest { - source: "\u{FA8B}", - nfc: "\u{61F2}", - nfd: "\u{61F2}", - nfkc: "\u{61F2}", - nfkd: "\u{61F2}", - }, - NormalizationTest { - source: "\u{FA8C}", - nfc: "\u{6234}", - nfd: "\u{6234}", - nfkc: "\u{6234}", - nfkd: "\u{6234}", - }, - NormalizationTest { - source: "\u{FA8D}", - nfc: "\u{63C4}", - nfd: "\u{63C4}", - nfkc: "\u{63C4}", - nfkd: "\u{63C4}", - }, - NormalizationTest { - source: "\u{FA8E}", - nfc: "\u{641C}", - nfd: "\u{641C}", - nfkc: "\u{641C}", - nfkd: "\u{641C}", - }, - NormalizationTest { - source: "\u{FA8F}", - nfc: "\u{6452}", - nfd: "\u{6452}", - nfkc: "\u{6452}", - nfkd: "\u{6452}", - }, - NormalizationTest { - source: "\u{FA90}", - nfc: "\u{6556}", - nfd: "\u{6556}", - nfkc: "\u{6556}", - nfkd: "\u{6556}", - }, - NormalizationTest { - source: "\u{FA91}", - nfc: "\u{6674}", - nfd: "\u{6674}", - nfkc: "\u{6674}", - nfkd: "\u{6674}", - }, - NormalizationTest { - source: "\u{FA92}", - nfc: "\u{6717}", - nfd: "\u{6717}", - nfkc: "\u{6717}", - nfkd: "\u{6717}", - }, - NormalizationTest { - source: "\u{FA93}", - nfc: "\u{671B}", - nfd: "\u{671B}", - nfkc: "\u{671B}", - nfkd: "\u{671B}", - }, - NormalizationTest { - source: "\u{FA94}", - nfc: "\u{6756}", - nfd: "\u{6756}", - nfkc: "\u{6756}", - nfkd: "\u{6756}", - }, - NormalizationTest { - source: "\u{FA95}", - nfc: "\u{6B79}", - nfd: "\u{6B79}", - nfkc: "\u{6B79}", - nfkd: "\u{6B79}", - }, - NormalizationTest { - source: "\u{FA96}", - nfc: "\u{6BBA}", - nfd: "\u{6BBA}", - nfkc: "\u{6BBA}", - nfkd: "\u{6BBA}", - }, - NormalizationTest { - source: "\u{FA97}", - nfc: "\u{6D41}", - nfd: "\u{6D41}", - nfkc: "\u{6D41}", - nfkd: "\u{6D41}", - }, - NormalizationTest { - source: "\u{FA98}", - nfc: "\u{6EDB}", - nfd: "\u{6EDB}", - nfkc: "\u{6EDB}", - nfkd: "\u{6EDB}", - }, - NormalizationTest { - source: "\u{FA99}", - nfc: "\u{6ECB}", - nfd: "\u{6ECB}", - nfkc: "\u{6ECB}", - nfkd: "\u{6ECB}", - }, - NormalizationTest { - source: "\u{FA9A}", - nfc: "\u{6F22}", - nfd: "\u{6F22}", - nfkc: "\u{6F22}", - nfkd: "\u{6F22}", - }, - NormalizationTest { - source: "\u{FA9B}", - nfc: "\u{701E}", - nfd: "\u{701E}", - nfkc: "\u{701E}", - nfkd: "\u{701E}", - }, - NormalizationTest { - source: "\u{FA9C}", - nfc: "\u{716E}", - nfd: "\u{716E}", - nfkc: "\u{716E}", - nfkd: "\u{716E}", - }, - NormalizationTest { - source: "\u{FA9D}", - nfc: "\u{77A7}", - nfd: "\u{77A7}", - nfkc: "\u{77A7}", - nfkd: "\u{77A7}", - }, - NormalizationTest { - source: "\u{FA9E}", - nfc: "\u{7235}", - nfd: "\u{7235}", - nfkc: "\u{7235}", - nfkd: "\u{7235}", - }, - NormalizationTest { - source: "\u{FA9F}", - nfc: "\u{72AF}", - nfd: "\u{72AF}", - nfkc: "\u{72AF}", - nfkd: "\u{72AF}", - }, - NormalizationTest { - source: "\u{FAA0}", - nfc: "\u{732A}", - nfd: "\u{732A}", - nfkc: "\u{732A}", - nfkd: "\u{732A}", - }, - NormalizationTest { - source: "\u{FAA1}", - nfc: "\u{7471}", - nfd: "\u{7471}", - nfkc: "\u{7471}", - nfkd: "\u{7471}", - }, - NormalizationTest { - source: "\u{FAA2}", - nfc: "\u{7506}", - nfd: "\u{7506}", - nfkc: "\u{7506}", - nfkd: "\u{7506}", - }, - NormalizationTest { - source: "\u{FAA3}", - nfc: "\u{753B}", - nfd: "\u{753B}", - nfkc: "\u{753B}", - nfkd: "\u{753B}", - }, - NormalizationTest { - source: "\u{FAA4}", - nfc: "\u{761D}", - nfd: "\u{761D}", - nfkc: "\u{761D}", - nfkd: "\u{761D}", - }, - NormalizationTest { - source: "\u{FAA5}", - nfc: "\u{761F}", - nfd: "\u{761F}", - nfkc: "\u{761F}", - nfkd: "\u{761F}", - }, - NormalizationTest { - source: "\u{FAA6}", - nfc: "\u{76CA}", - nfd: "\u{76CA}", - nfkc: "\u{76CA}", - nfkd: "\u{76CA}", - }, - NormalizationTest { - source: "\u{FAA7}", - nfc: "\u{76DB}", - nfd: "\u{76DB}", - nfkc: "\u{76DB}", - nfkd: "\u{76DB}", - }, - NormalizationTest { - source: "\u{FAA8}", - nfc: "\u{76F4}", - nfd: "\u{76F4}", - nfkc: "\u{76F4}", - nfkd: "\u{76F4}", - }, - NormalizationTest { - source: "\u{FAA9}", - nfc: "\u{774A}", - nfd: "\u{774A}", - nfkc: "\u{774A}", - nfkd: "\u{774A}", - }, - NormalizationTest { - source: "\u{FAAA}", - nfc: "\u{7740}", - nfd: "\u{7740}", - nfkc: "\u{7740}", - nfkd: "\u{7740}", - }, - NormalizationTest { - source: "\u{FAAB}", - nfc: "\u{78CC}", - nfd: "\u{78CC}", - nfkc: "\u{78CC}", - nfkd: "\u{78CC}", - }, - NormalizationTest { - source: "\u{FAAC}", - nfc: "\u{7AB1}", - nfd: "\u{7AB1}", - nfkc: "\u{7AB1}", - nfkd: "\u{7AB1}", - }, - NormalizationTest { - source: "\u{FAAD}", - nfc: "\u{7BC0}", - nfd: "\u{7BC0}", - nfkc: "\u{7BC0}", - nfkd: "\u{7BC0}", - }, - NormalizationTest { - source: "\u{FAAE}", - nfc: "\u{7C7B}", - nfd: "\u{7C7B}", - nfkc: "\u{7C7B}", - nfkd: "\u{7C7B}", - }, - NormalizationTest { - source: "\u{FAAF}", - nfc: "\u{7D5B}", - nfd: "\u{7D5B}", - nfkc: "\u{7D5B}", - nfkd: "\u{7D5B}", - }, - NormalizationTest { - source: "\u{FAB0}", - nfc: "\u{7DF4}", - nfd: "\u{7DF4}", - nfkc: "\u{7DF4}", - nfkd: "\u{7DF4}", - }, - NormalizationTest { - source: "\u{FAB1}", - nfc: "\u{7F3E}", - nfd: "\u{7F3E}", - nfkc: "\u{7F3E}", - nfkd: "\u{7F3E}", - }, - NormalizationTest { - source: "\u{FAB2}", - nfc: "\u{8005}", - nfd: "\u{8005}", - nfkc: "\u{8005}", - nfkd: "\u{8005}", - }, - NormalizationTest { - source: "\u{FAB3}", - nfc: "\u{8352}", - nfd: "\u{8352}", - nfkc: "\u{8352}", - nfkd: "\u{8352}", - }, - NormalizationTest { - source: "\u{FAB4}", - nfc: "\u{83EF}", - nfd: "\u{83EF}", - nfkc: "\u{83EF}", - nfkd: "\u{83EF}", - }, - NormalizationTest { - source: "\u{FAB5}", - nfc: "\u{8779}", - nfd: "\u{8779}", - nfkc: "\u{8779}", - nfkd: "\u{8779}", - }, - NormalizationTest { - source: "\u{FAB6}", - nfc: "\u{8941}", - nfd: "\u{8941}", - nfkc: "\u{8941}", - nfkd: "\u{8941}", - }, - NormalizationTest { - source: "\u{FAB7}", - nfc: "\u{8986}", - nfd: "\u{8986}", - nfkc: "\u{8986}", - nfkd: "\u{8986}", - }, - NormalizationTest { - source: "\u{FAB8}", - nfc: "\u{8996}", - nfd: "\u{8996}", - nfkc: "\u{8996}", - nfkd: "\u{8996}", - }, - NormalizationTest { - source: "\u{FAB9}", - nfc: "\u{8ABF}", - nfd: "\u{8ABF}", - nfkc: "\u{8ABF}", - nfkd: "\u{8ABF}", - }, - NormalizationTest { - source: "\u{FABA}", - nfc: "\u{8AF8}", - nfd: "\u{8AF8}", - nfkc: "\u{8AF8}", - nfkd: "\u{8AF8}", - }, - NormalizationTest { - source: "\u{FABB}", - nfc: "\u{8ACB}", - nfd: "\u{8ACB}", - nfkc: "\u{8ACB}", - nfkd: "\u{8ACB}", - }, - NormalizationTest { - source: "\u{FABC}", - nfc: "\u{8B01}", - nfd: "\u{8B01}", - nfkc: "\u{8B01}", - nfkd: "\u{8B01}", - }, - NormalizationTest { - source: "\u{FABD}", - nfc: "\u{8AFE}", - nfd: "\u{8AFE}", - nfkc: "\u{8AFE}", - nfkd: "\u{8AFE}", - }, - NormalizationTest { - source: "\u{FABE}", - nfc: "\u{8AED}", - nfd: "\u{8AED}", - nfkc: "\u{8AED}", - nfkd: "\u{8AED}", - }, - NormalizationTest { - source: "\u{FABF}", - nfc: "\u{8B39}", - nfd: "\u{8B39}", - nfkc: "\u{8B39}", - nfkd: "\u{8B39}", - }, - NormalizationTest { - source: "\u{FAC0}", - nfc: "\u{8B8A}", - nfd: "\u{8B8A}", - nfkc: "\u{8B8A}", - nfkd: "\u{8B8A}", - }, - NormalizationTest { - source: "\u{FAC1}", - nfc: "\u{8D08}", - nfd: "\u{8D08}", - nfkc: "\u{8D08}", - nfkd: "\u{8D08}", - }, - NormalizationTest { - source: "\u{FAC2}", - nfc: "\u{8F38}", - nfd: "\u{8F38}", - nfkc: "\u{8F38}", - nfkd: "\u{8F38}", - }, - NormalizationTest { - source: "\u{FAC3}", - nfc: "\u{9072}", - nfd: "\u{9072}", - nfkc: "\u{9072}", - nfkd: "\u{9072}", - }, - NormalizationTest { - source: "\u{FAC4}", - nfc: "\u{9199}", - nfd: "\u{9199}", - nfkc: "\u{9199}", - nfkd: "\u{9199}", - }, - NormalizationTest { - source: "\u{FAC5}", - nfc: "\u{9276}", - nfd: "\u{9276}", - nfkc: "\u{9276}", - nfkd: "\u{9276}", - }, - NormalizationTest { - source: "\u{FAC6}", - nfc: "\u{967C}", - nfd: "\u{967C}", - nfkc: "\u{967C}", - nfkd: "\u{967C}", - }, - NormalizationTest { - source: "\u{FAC7}", - nfc: "\u{96E3}", - nfd: "\u{96E3}", - nfkc: "\u{96E3}", - nfkd: "\u{96E3}", - }, - NormalizationTest { - source: "\u{FAC8}", - nfc: "\u{9756}", - nfd: "\u{9756}", - nfkc: "\u{9756}", - nfkd: "\u{9756}", - }, - NormalizationTest { - source: "\u{FAC9}", - nfc: "\u{97DB}", - nfd: "\u{97DB}", - nfkc: "\u{97DB}", - nfkd: "\u{97DB}", - }, - NormalizationTest { - source: "\u{FACA}", - nfc: "\u{97FF}", - nfd: "\u{97FF}", - nfkc: "\u{97FF}", - nfkd: "\u{97FF}", - }, - NormalizationTest { - source: "\u{FACB}", - nfc: "\u{980B}", - nfd: "\u{980B}", - nfkc: "\u{980B}", - nfkd: "\u{980B}", - }, - NormalizationTest { - source: "\u{FACC}", - nfc: "\u{983B}", - nfd: "\u{983B}", - nfkc: "\u{983B}", - nfkd: "\u{983B}", - }, - NormalizationTest { - source: "\u{FACD}", - nfc: "\u{9B12}", - nfd: "\u{9B12}", - nfkc: "\u{9B12}", - nfkd: "\u{9B12}", - }, - NormalizationTest { - source: "\u{FACE}", - nfc: "\u{9F9C}", - nfd: "\u{9F9C}", - nfkc: "\u{9F9C}", - nfkd: "\u{9F9C}", - }, - NormalizationTest { - source: "\u{FACF}", - nfc: "\u{2284A}", - nfd: "\u{2284A}", - nfkc: "\u{2284A}", - nfkd: "\u{2284A}", - }, - NormalizationTest { - source: "\u{FAD0}", - nfc: "\u{22844}", - nfd: "\u{22844}", - nfkc: "\u{22844}", - nfkd: "\u{22844}", - }, - NormalizationTest { - source: "\u{FAD1}", - nfc: "\u{233D5}", - nfd: "\u{233D5}", - nfkc: "\u{233D5}", - nfkd: "\u{233D5}", - }, - NormalizationTest { - source: "\u{FAD2}", - nfc: "\u{3B9D}", - nfd: "\u{3B9D}", - nfkc: "\u{3B9D}", - nfkd: "\u{3B9D}", - }, - NormalizationTest { - source: "\u{FAD3}", - nfc: "\u{4018}", - nfd: "\u{4018}", - nfkc: "\u{4018}", - nfkd: "\u{4018}", - }, - NormalizationTest { - source: "\u{FAD4}", - nfc: "\u{4039}", - nfd: "\u{4039}", - nfkc: "\u{4039}", - nfkd: "\u{4039}", - }, - NormalizationTest { - source: "\u{FAD5}", - nfc: "\u{25249}", - nfd: "\u{25249}", - nfkc: "\u{25249}", - nfkd: "\u{25249}", - }, - NormalizationTest { - source: "\u{FAD6}", - nfc: "\u{25CD0}", - nfd: "\u{25CD0}", - nfkc: "\u{25CD0}", - nfkd: "\u{25CD0}", - }, - NormalizationTest { - source: "\u{FAD7}", - nfc: "\u{27ED3}", - nfd: "\u{27ED3}", - nfkc: "\u{27ED3}", - nfkd: "\u{27ED3}", - }, - NormalizationTest { - source: "\u{FAD8}", - nfc: "\u{9F43}", - nfd: "\u{9F43}", - nfkc: "\u{9F43}", - nfkd: "\u{9F43}", - }, - NormalizationTest { - source: "\u{FAD9}", - nfc: "\u{9F8E}", - nfd: "\u{9F8E}", - nfkc: "\u{9F8E}", - nfkd: "\u{9F8E}", - }, - NormalizationTest { - source: "\u{FB00}", - nfc: "\u{FB00}", - nfd: "\u{FB00}", - nfkc: "\u{0066}\u{0066}", - nfkd: "\u{0066}\u{0066}", - }, - NormalizationTest { - source: "\u{FB01}", - nfc: "\u{FB01}", - nfd: "\u{FB01}", - nfkc: "\u{0066}\u{0069}", - nfkd: "\u{0066}\u{0069}", - }, - NormalizationTest { - source: "\u{FB02}", - nfc: "\u{FB02}", - nfd: "\u{FB02}", - nfkc: "\u{0066}\u{006C}", - nfkd: "\u{0066}\u{006C}", - }, - NormalizationTest { - source: "\u{FB03}", - nfc: "\u{FB03}", - nfd: "\u{FB03}", - nfkc: "\u{0066}\u{0066}\u{0069}", - nfkd: "\u{0066}\u{0066}\u{0069}", - }, - NormalizationTest { - source: "\u{FB04}", - nfc: "\u{FB04}", - nfd: "\u{FB04}", - nfkc: "\u{0066}\u{0066}\u{006C}", - nfkd: "\u{0066}\u{0066}\u{006C}", - }, - NormalizationTest { - source: "\u{FB05}", - nfc: "\u{FB05}", - nfd: "\u{FB05}", - nfkc: "\u{0073}\u{0074}", - nfkd: "\u{0073}\u{0074}", - }, - NormalizationTest { - source: "\u{FB06}", - nfc: "\u{FB06}", - nfd: "\u{FB06}", - nfkc: "\u{0073}\u{0074}", - nfkd: "\u{0073}\u{0074}", - }, - NormalizationTest { - source: "\u{FB13}", - nfc: "\u{FB13}", - nfd: "\u{FB13}", - nfkc: "\u{0574}\u{0576}", - nfkd: "\u{0574}\u{0576}", - }, - NormalizationTest { - source: "\u{FB14}", - nfc: "\u{FB14}", - nfd: "\u{FB14}", - nfkc: "\u{0574}\u{0565}", - nfkd: "\u{0574}\u{0565}", - }, - NormalizationTest { - source: "\u{FB15}", - nfc: "\u{FB15}", - nfd: "\u{FB15}", - nfkc: "\u{0574}\u{056B}", - nfkd: "\u{0574}\u{056B}", - }, - NormalizationTest { - source: "\u{FB16}", - nfc: "\u{FB16}", - nfd: "\u{FB16}", - nfkc: "\u{057E}\u{0576}", - nfkd: "\u{057E}\u{0576}", - }, - NormalizationTest { - source: "\u{FB17}", - nfc: "\u{FB17}", - nfd: "\u{FB17}", - nfkc: "\u{0574}\u{056D}", - nfkd: "\u{0574}\u{056D}", - }, - NormalizationTest { - source: "\u{FB1D}", - nfc: "\u{05D9}\u{05B4}", - nfd: "\u{05D9}\u{05B4}", - nfkc: "\u{05D9}\u{05B4}", - nfkd: "\u{05D9}\u{05B4}", - }, - NormalizationTest { - source: "\u{FB1F}", - nfc: "\u{05F2}\u{05B7}", - nfd: "\u{05F2}\u{05B7}", - nfkc: "\u{05F2}\u{05B7}", - nfkd: "\u{05F2}\u{05B7}", - }, - NormalizationTest { - source: "\u{FB20}", - nfc: "\u{FB20}", - nfd: "\u{FB20}", - nfkc: "\u{05E2}", - nfkd: "\u{05E2}", - }, - NormalizationTest { - source: "\u{FB21}", - nfc: "\u{FB21}", - nfd: "\u{FB21}", - nfkc: "\u{05D0}", - nfkd: "\u{05D0}", - }, - NormalizationTest { - source: "\u{FB22}", - nfc: "\u{FB22}", - nfd: "\u{FB22}", - nfkc: "\u{05D3}", - nfkd: "\u{05D3}", - }, - NormalizationTest { - source: "\u{FB23}", - nfc: "\u{FB23}", - nfd: "\u{FB23}", - nfkc: "\u{05D4}", - nfkd: "\u{05D4}", - }, - NormalizationTest { - source: "\u{FB24}", - nfc: "\u{FB24}", - nfd: "\u{FB24}", - nfkc: "\u{05DB}", - nfkd: "\u{05DB}", - }, - NormalizationTest { - source: "\u{FB25}", - nfc: "\u{FB25}", - nfd: "\u{FB25}", - nfkc: "\u{05DC}", - nfkd: "\u{05DC}", - }, - NormalizationTest { - source: "\u{FB26}", - nfc: "\u{FB26}", - nfd: "\u{FB26}", - nfkc: "\u{05DD}", - nfkd: "\u{05DD}", - }, - NormalizationTest { - source: "\u{FB27}", - nfc: "\u{FB27}", - nfd: "\u{FB27}", - nfkc: "\u{05E8}", - nfkd: "\u{05E8}", - }, - NormalizationTest { - source: "\u{FB28}", - nfc: "\u{FB28}", - nfd: "\u{FB28}", - nfkc: "\u{05EA}", - nfkd: "\u{05EA}", - }, - NormalizationTest { - source: "\u{FB29}", - nfc: "\u{FB29}", - nfd: "\u{FB29}", - nfkc: "\u{002B}", - nfkd: "\u{002B}", - }, - NormalizationTest { - source: "\u{FB2A}", - nfc: "\u{05E9}\u{05C1}", - nfd: "\u{05E9}\u{05C1}", - nfkc: "\u{05E9}\u{05C1}", - nfkd: "\u{05E9}\u{05C1}", - }, - NormalizationTest { - source: "\u{FB2B}", - nfc: "\u{05E9}\u{05C2}", - nfd: "\u{05E9}\u{05C2}", - nfkc: "\u{05E9}\u{05C2}", - nfkd: "\u{05E9}\u{05C2}", - }, - NormalizationTest { - source: "\u{FB2C}", - nfc: "\u{05E9}\u{05BC}\u{05C1}", - nfd: "\u{05E9}\u{05BC}\u{05C1}", - nfkc: "\u{05E9}\u{05BC}\u{05C1}", - nfkd: "\u{05E9}\u{05BC}\u{05C1}", - }, - NormalizationTest { - source: "\u{FB2D}", - nfc: "\u{05E9}\u{05BC}\u{05C2}", - nfd: "\u{05E9}\u{05BC}\u{05C2}", - nfkc: "\u{05E9}\u{05BC}\u{05C2}", - nfkd: "\u{05E9}\u{05BC}\u{05C2}", - }, - NormalizationTest { - source: "\u{FB2E}", - nfc: "\u{05D0}\u{05B7}", - nfd: "\u{05D0}\u{05B7}", - nfkc: "\u{05D0}\u{05B7}", - nfkd: "\u{05D0}\u{05B7}", - }, - NormalizationTest { - source: "\u{FB2F}", - nfc: "\u{05D0}\u{05B8}", - nfd: "\u{05D0}\u{05B8}", - nfkc: "\u{05D0}\u{05B8}", - nfkd: "\u{05D0}\u{05B8}", - }, - NormalizationTest { - source: "\u{FB30}", - nfc: "\u{05D0}\u{05BC}", - nfd: "\u{05D0}\u{05BC}", - nfkc: "\u{05D0}\u{05BC}", - nfkd: "\u{05D0}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB31}", - nfc: "\u{05D1}\u{05BC}", - nfd: "\u{05D1}\u{05BC}", - nfkc: "\u{05D1}\u{05BC}", - nfkd: "\u{05D1}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB32}", - nfc: "\u{05D2}\u{05BC}", - nfd: "\u{05D2}\u{05BC}", - nfkc: "\u{05D2}\u{05BC}", - nfkd: "\u{05D2}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB33}", - nfc: "\u{05D3}\u{05BC}", - nfd: "\u{05D3}\u{05BC}", - nfkc: "\u{05D3}\u{05BC}", - nfkd: "\u{05D3}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB34}", - nfc: "\u{05D4}\u{05BC}", - nfd: "\u{05D4}\u{05BC}", - nfkc: "\u{05D4}\u{05BC}", - nfkd: "\u{05D4}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB35}", - nfc: "\u{05D5}\u{05BC}", - nfd: "\u{05D5}\u{05BC}", - nfkc: "\u{05D5}\u{05BC}", - nfkd: "\u{05D5}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB36}", - nfc: "\u{05D6}\u{05BC}", - nfd: "\u{05D6}\u{05BC}", - nfkc: "\u{05D6}\u{05BC}", - nfkd: "\u{05D6}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB38}", - nfc: "\u{05D8}\u{05BC}", - nfd: "\u{05D8}\u{05BC}", - nfkc: "\u{05D8}\u{05BC}", - nfkd: "\u{05D8}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB39}", - nfc: "\u{05D9}\u{05BC}", - nfd: "\u{05D9}\u{05BC}", - nfkc: "\u{05D9}\u{05BC}", - nfkd: "\u{05D9}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB3A}", - nfc: "\u{05DA}\u{05BC}", - nfd: "\u{05DA}\u{05BC}", - nfkc: "\u{05DA}\u{05BC}", - nfkd: "\u{05DA}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB3B}", - nfc: "\u{05DB}\u{05BC}", - nfd: "\u{05DB}\u{05BC}", - nfkc: "\u{05DB}\u{05BC}", - nfkd: "\u{05DB}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB3C}", - nfc: "\u{05DC}\u{05BC}", - nfd: "\u{05DC}\u{05BC}", - nfkc: "\u{05DC}\u{05BC}", - nfkd: "\u{05DC}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB3E}", - nfc: "\u{05DE}\u{05BC}", - nfd: "\u{05DE}\u{05BC}", - nfkc: "\u{05DE}\u{05BC}", - nfkd: "\u{05DE}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB40}", - nfc: "\u{05E0}\u{05BC}", - nfd: "\u{05E0}\u{05BC}", - nfkc: "\u{05E0}\u{05BC}", - nfkd: "\u{05E0}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB41}", - nfc: "\u{05E1}\u{05BC}", - nfd: "\u{05E1}\u{05BC}", - nfkc: "\u{05E1}\u{05BC}", - nfkd: "\u{05E1}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB43}", - nfc: "\u{05E3}\u{05BC}", - nfd: "\u{05E3}\u{05BC}", - nfkc: "\u{05E3}\u{05BC}", - nfkd: "\u{05E3}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB44}", - nfc: "\u{05E4}\u{05BC}", - nfd: "\u{05E4}\u{05BC}", - nfkc: "\u{05E4}\u{05BC}", - nfkd: "\u{05E4}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB46}", - nfc: "\u{05E6}\u{05BC}", - nfd: "\u{05E6}\u{05BC}", - nfkc: "\u{05E6}\u{05BC}", - nfkd: "\u{05E6}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB47}", - nfc: "\u{05E7}\u{05BC}", - nfd: "\u{05E7}\u{05BC}", - nfkc: "\u{05E7}\u{05BC}", - nfkd: "\u{05E7}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB48}", - nfc: "\u{05E8}\u{05BC}", - nfd: "\u{05E8}\u{05BC}", - nfkc: "\u{05E8}\u{05BC}", - nfkd: "\u{05E8}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB49}", - nfc: "\u{05E9}\u{05BC}", - nfd: "\u{05E9}\u{05BC}", - nfkc: "\u{05E9}\u{05BC}", - nfkd: "\u{05E9}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB4A}", - nfc: "\u{05EA}\u{05BC}", - nfd: "\u{05EA}\u{05BC}", - nfkc: "\u{05EA}\u{05BC}", - nfkd: "\u{05EA}\u{05BC}", - }, - NormalizationTest { - source: "\u{FB4B}", - nfc: "\u{05D5}\u{05B9}", - nfd: "\u{05D5}\u{05B9}", - nfkc: "\u{05D5}\u{05B9}", - nfkd: "\u{05D5}\u{05B9}", - }, - NormalizationTest { - source: "\u{FB4C}", - nfc: "\u{05D1}\u{05BF}", - nfd: "\u{05D1}\u{05BF}", - nfkc: "\u{05D1}\u{05BF}", - nfkd: "\u{05D1}\u{05BF}", - }, - NormalizationTest { - source: "\u{FB4D}", - nfc: "\u{05DB}\u{05BF}", - nfd: "\u{05DB}\u{05BF}", - nfkc: "\u{05DB}\u{05BF}", - nfkd: "\u{05DB}\u{05BF}", - }, - NormalizationTest { - source: "\u{FB4E}", - nfc: "\u{05E4}\u{05BF}", - nfd: "\u{05E4}\u{05BF}", - nfkc: "\u{05E4}\u{05BF}", - nfkd: "\u{05E4}\u{05BF}", - }, - NormalizationTest { - source: "\u{FB4F}", - nfc: "\u{FB4F}", - nfd: "\u{FB4F}", - nfkc: "\u{05D0}\u{05DC}", - nfkd: "\u{05D0}\u{05DC}", - }, - NormalizationTest { - source: "\u{FB50}", - nfc: "\u{FB50}", - nfd: "\u{FB50}", - nfkc: "\u{0671}", - nfkd: "\u{0671}", - }, - NormalizationTest { - source: "\u{FB51}", - nfc: "\u{FB51}", - nfd: "\u{FB51}", - nfkc: "\u{0671}", - nfkd: "\u{0671}", - }, - NormalizationTest { - source: "\u{FB52}", - nfc: "\u{FB52}", - nfd: "\u{FB52}", - nfkc: "\u{067B}", - nfkd: "\u{067B}", - }, - NormalizationTest { - source: "\u{FB53}", - nfc: "\u{FB53}", - nfd: "\u{FB53}", - nfkc: "\u{067B}", - nfkd: "\u{067B}", - }, - NormalizationTest { - source: "\u{FB54}", - nfc: "\u{FB54}", - nfd: "\u{FB54}", - nfkc: "\u{067B}", - nfkd: "\u{067B}", - }, - NormalizationTest { - source: "\u{FB55}", - nfc: "\u{FB55}", - nfd: "\u{FB55}", - nfkc: "\u{067B}", - nfkd: "\u{067B}", - }, - NormalizationTest { - source: "\u{FB56}", - nfc: "\u{FB56}", - nfd: "\u{FB56}", - nfkc: "\u{067E}", - nfkd: "\u{067E}", - }, - NormalizationTest { - source: "\u{FB57}", - nfc: "\u{FB57}", - nfd: "\u{FB57}", - nfkc: "\u{067E}", - nfkd: "\u{067E}", - }, - NormalizationTest { - source: "\u{FB58}", - nfc: "\u{FB58}", - nfd: "\u{FB58}", - nfkc: "\u{067E}", - nfkd: "\u{067E}", - }, - NormalizationTest { - source: "\u{FB59}", - nfc: "\u{FB59}", - nfd: "\u{FB59}", - nfkc: "\u{067E}", - nfkd: "\u{067E}", - }, - NormalizationTest { - source: "\u{FB5A}", - nfc: "\u{FB5A}", - nfd: "\u{FB5A}", - nfkc: "\u{0680}", - nfkd: "\u{0680}", - }, - NormalizationTest { - source: "\u{FB5B}", - nfc: "\u{FB5B}", - nfd: "\u{FB5B}", - nfkc: "\u{0680}", - nfkd: "\u{0680}", - }, - NormalizationTest { - source: "\u{FB5C}", - nfc: "\u{FB5C}", - nfd: "\u{FB5C}", - nfkc: "\u{0680}", - nfkd: "\u{0680}", - }, - NormalizationTest { - source: "\u{FB5D}", - nfc: "\u{FB5D}", - nfd: "\u{FB5D}", - nfkc: "\u{0680}", - nfkd: "\u{0680}", - }, - NormalizationTest { - source: "\u{FB5E}", - nfc: "\u{FB5E}", - nfd: "\u{FB5E}", - nfkc: "\u{067A}", - nfkd: "\u{067A}", - }, - NormalizationTest { - source: "\u{FB5F}", - nfc: "\u{FB5F}", - nfd: "\u{FB5F}", - nfkc: "\u{067A}", - nfkd: "\u{067A}", - }, - NormalizationTest { - source: "\u{FB60}", - nfc: "\u{FB60}", - nfd: "\u{FB60}", - nfkc: "\u{067A}", - nfkd: "\u{067A}", - }, - NormalizationTest { - source: "\u{FB61}", - nfc: "\u{FB61}", - nfd: "\u{FB61}", - nfkc: "\u{067A}", - nfkd: "\u{067A}", - }, - NormalizationTest { - source: "\u{FB62}", - nfc: "\u{FB62}", - nfd: "\u{FB62}", - nfkc: "\u{067F}", - nfkd: "\u{067F}", - }, - NormalizationTest { - source: "\u{FB63}", - nfc: "\u{FB63}", - nfd: "\u{FB63}", - nfkc: "\u{067F}", - nfkd: "\u{067F}", - }, - NormalizationTest { - source: "\u{FB64}", - nfc: "\u{FB64}", - nfd: "\u{FB64}", - nfkc: "\u{067F}", - nfkd: "\u{067F}", - }, - NormalizationTest { - source: "\u{FB65}", - nfc: "\u{FB65}", - nfd: "\u{FB65}", - nfkc: "\u{067F}", - nfkd: "\u{067F}", - }, - NormalizationTest { - source: "\u{FB66}", - nfc: "\u{FB66}", - nfd: "\u{FB66}", - nfkc: "\u{0679}", - nfkd: "\u{0679}", - }, - NormalizationTest { - source: "\u{FB67}", - nfc: "\u{FB67}", - nfd: "\u{FB67}", - nfkc: "\u{0679}", - nfkd: "\u{0679}", - }, - NormalizationTest { - source: "\u{FB68}", - nfc: "\u{FB68}", - nfd: "\u{FB68}", - nfkc: "\u{0679}", - nfkd: "\u{0679}", - }, - NormalizationTest { - source: "\u{FB69}", - nfc: "\u{FB69}", - nfd: "\u{FB69}", - nfkc: "\u{0679}", - nfkd: "\u{0679}", - }, - NormalizationTest { - source: "\u{FB6A}", - nfc: "\u{FB6A}", - nfd: "\u{FB6A}", - nfkc: "\u{06A4}", - nfkd: "\u{06A4}", - }, - NormalizationTest { - source: "\u{FB6B}", - nfc: "\u{FB6B}", - nfd: "\u{FB6B}", - nfkc: "\u{06A4}", - nfkd: "\u{06A4}", - }, - NormalizationTest { - source: "\u{FB6C}", - nfc: "\u{FB6C}", - nfd: "\u{FB6C}", - nfkc: "\u{06A4}", - nfkd: "\u{06A4}", - }, - NormalizationTest { - source: "\u{FB6D}", - nfc: "\u{FB6D}", - nfd: "\u{FB6D}", - nfkc: "\u{06A4}", - nfkd: "\u{06A4}", - }, - NormalizationTest { - source: "\u{FB6E}", - nfc: "\u{FB6E}", - nfd: "\u{FB6E}", - nfkc: "\u{06A6}", - nfkd: "\u{06A6}", - }, - NormalizationTest { - source: "\u{FB6F}", - nfc: "\u{FB6F}", - nfd: "\u{FB6F}", - nfkc: "\u{06A6}", - nfkd: "\u{06A6}", - }, - NormalizationTest { - source: "\u{FB70}", - nfc: "\u{FB70}", - nfd: "\u{FB70}", - nfkc: "\u{06A6}", - nfkd: "\u{06A6}", - }, - NormalizationTest { - source: "\u{FB71}", - nfc: "\u{FB71}", - nfd: "\u{FB71}", - nfkc: "\u{06A6}", - nfkd: "\u{06A6}", - }, - NormalizationTest { - source: "\u{FB72}", - nfc: "\u{FB72}", - nfd: "\u{FB72}", - nfkc: "\u{0684}", - nfkd: "\u{0684}", - }, - NormalizationTest { - source: "\u{FB73}", - nfc: "\u{FB73}", - nfd: "\u{FB73}", - nfkc: "\u{0684}", - nfkd: "\u{0684}", - }, - NormalizationTest { - source: "\u{FB74}", - nfc: "\u{FB74}", - nfd: "\u{FB74}", - nfkc: "\u{0684}", - nfkd: "\u{0684}", - }, - NormalizationTest { - source: "\u{FB75}", - nfc: "\u{FB75}", - nfd: "\u{FB75}", - nfkc: "\u{0684}", - nfkd: "\u{0684}", - }, - NormalizationTest { - source: "\u{FB76}", - nfc: "\u{FB76}", - nfd: "\u{FB76}", - nfkc: "\u{0683}", - nfkd: "\u{0683}", - }, - NormalizationTest { - source: "\u{FB77}", - nfc: "\u{FB77}", - nfd: "\u{FB77}", - nfkc: "\u{0683}", - nfkd: "\u{0683}", - }, - NormalizationTest { - source: "\u{FB78}", - nfc: "\u{FB78}", - nfd: "\u{FB78}", - nfkc: "\u{0683}", - nfkd: "\u{0683}", - }, - NormalizationTest { - source: "\u{FB79}", - nfc: "\u{FB79}", - nfd: "\u{FB79}", - nfkc: "\u{0683}", - nfkd: "\u{0683}", - }, - NormalizationTest { - source: "\u{FB7A}", - nfc: "\u{FB7A}", - nfd: "\u{FB7A}", - nfkc: "\u{0686}", - nfkd: "\u{0686}", - }, - NormalizationTest { - source: "\u{FB7B}", - nfc: "\u{FB7B}", - nfd: "\u{FB7B}", - nfkc: "\u{0686}", - nfkd: "\u{0686}", - }, - NormalizationTest { - source: "\u{FB7C}", - nfc: "\u{FB7C}", - nfd: "\u{FB7C}", - nfkc: "\u{0686}", - nfkd: "\u{0686}", - }, - NormalizationTest { - source: "\u{FB7D}", - nfc: "\u{FB7D}", - nfd: "\u{FB7D}", - nfkc: "\u{0686}", - nfkd: "\u{0686}", - }, - NormalizationTest { - source: "\u{FB7E}", - nfc: "\u{FB7E}", - nfd: "\u{FB7E}", - nfkc: "\u{0687}", - nfkd: "\u{0687}", - }, - NormalizationTest { - source: "\u{FB7F}", - nfc: "\u{FB7F}", - nfd: "\u{FB7F}", - nfkc: "\u{0687}", - nfkd: "\u{0687}", - }, - NormalizationTest { - source: "\u{FB80}", - nfc: "\u{FB80}", - nfd: "\u{FB80}", - nfkc: "\u{0687}", - nfkd: "\u{0687}", - }, - NormalizationTest { - source: "\u{FB81}", - nfc: "\u{FB81}", - nfd: "\u{FB81}", - nfkc: "\u{0687}", - nfkd: "\u{0687}", - }, - NormalizationTest { - source: "\u{FB82}", - nfc: "\u{FB82}", - nfd: "\u{FB82}", - nfkc: "\u{068D}", - nfkd: "\u{068D}", - }, - NormalizationTest { - source: "\u{FB83}", - nfc: "\u{FB83}", - nfd: "\u{FB83}", - nfkc: "\u{068D}", - nfkd: "\u{068D}", - }, - NormalizationTest { - source: "\u{FB84}", - nfc: "\u{FB84}", - nfd: "\u{FB84}", - nfkc: "\u{068C}", - nfkd: "\u{068C}", - }, - NormalizationTest { - source: "\u{FB85}", - nfc: "\u{FB85}", - nfd: "\u{FB85}", - nfkc: "\u{068C}", - nfkd: "\u{068C}", - }, - NormalizationTest { - source: "\u{FB86}", - nfc: "\u{FB86}", - nfd: "\u{FB86}", - nfkc: "\u{068E}", - nfkd: "\u{068E}", - }, - NormalizationTest { - source: "\u{FB87}", - nfc: "\u{FB87}", - nfd: "\u{FB87}", - nfkc: "\u{068E}", - nfkd: "\u{068E}", - }, - NormalizationTest { - source: "\u{FB88}", - nfc: "\u{FB88}", - nfd: "\u{FB88}", - nfkc: "\u{0688}", - nfkd: "\u{0688}", - }, - NormalizationTest { - source: "\u{FB89}", - nfc: "\u{FB89}", - nfd: "\u{FB89}", - nfkc: "\u{0688}", - nfkd: "\u{0688}", - }, - NormalizationTest { - source: "\u{FB8A}", - nfc: "\u{FB8A}", - nfd: "\u{FB8A}", - nfkc: "\u{0698}", - nfkd: "\u{0698}", - }, - NormalizationTest { - source: "\u{FB8B}", - nfc: "\u{FB8B}", - nfd: "\u{FB8B}", - nfkc: "\u{0698}", - nfkd: "\u{0698}", - }, - NormalizationTest { - source: "\u{FB8C}", - nfc: "\u{FB8C}", - nfd: "\u{FB8C}", - nfkc: "\u{0691}", - nfkd: "\u{0691}", - }, - NormalizationTest { - source: "\u{FB8D}", - nfc: "\u{FB8D}", - nfd: "\u{FB8D}", - nfkc: "\u{0691}", - nfkd: "\u{0691}", - }, - NormalizationTest { - source: "\u{FB8E}", - nfc: "\u{FB8E}", - nfd: "\u{FB8E}", - nfkc: "\u{06A9}", - nfkd: "\u{06A9}", - }, - NormalizationTest { - source: "\u{FB8F}", - nfc: "\u{FB8F}", - nfd: "\u{FB8F}", - nfkc: "\u{06A9}", - nfkd: "\u{06A9}", - }, - NormalizationTest { - source: "\u{FB90}", - nfc: "\u{FB90}", - nfd: "\u{FB90}", - nfkc: "\u{06A9}", - nfkd: "\u{06A9}", - }, - NormalizationTest { - source: "\u{FB91}", - nfc: "\u{FB91}", - nfd: "\u{FB91}", - nfkc: "\u{06A9}", - nfkd: "\u{06A9}", - }, - NormalizationTest { - source: "\u{FB92}", - nfc: "\u{FB92}", - nfd: "\u{FB92}", - nfkc: "\u{06AF}", - nfkd: "\u{06AF}", - }, - NormalizationTest { - source: "\u{FB93}", - nfc: "\u{FB93}", - nfd: "\u{FB93}", - nfkc: "\u{06AF}", - nfkd: "\u{06AF}", - }, - NormalizationTest { - source: "\u{FB94}", - nfc: "\u{FB94}", - nfd: "\u{FB94}", - nfkc: "\u{06AF}", - nfkd: "\u{06AF}", - }, - NormalizationTest { - source: "\u{FB95}", - nfc: "\u{FB95}", - nfd: "\u{FB95}", - nfkc: "\u{06AF}", - nfkd: "\u{06AF}", - }, - NormalizationTest { - source: "\u{FB96}", - nfc: "\u{FB96}", - nfd: "\u{FB96}", - nfkc: "\u{06B3}", - nfkd: "\u{06B3}", - }, - NormalizationTest { - source: "\u{FB97}", - nfc: "\u{FB97}", - nfd: "\u{FB97}", - nfkc: "\u{06B3}", - nfkd: "\u{06B3}", - }, - NormalizationTest { - source: "\u{FB98}", - nfc: "\u{FB98}", - nfd: "\u{FB98}", - nfkc: "\u{06B3}", - nfkd: "\u{06B3}", - }, - NormalizationTest { - source: "\u{FB99}", - nfc: "\u{FB99}", - nfd: "\u{FB99}", - nfkc: "\u{06B3}", - nfkd: "\u{06B3}", - }, - NormalizationTest { - source: "\u{FB9A}", - nfc: "\u{FB9A}", - nfd: "\u{FB9A}", - nfkc: "\u{06B1}", - nfkd: "\u{06B1}", - }, - NormalizationTest { - source: "\u{FB9B}", - nfc: "\u{FB9B}", - nfd: "\u{FB9B}", - nfkc: "\u{06B1}", - nfkd: "\u{06B1}", - }, - NormalizationTest { - source: "\u{FB9C}", - nfc: "\u{FB9C}", - nfd: "\u{FB9C}", - nfkc: "\u{06B1}", - nfkd: "\u{06B1}", - }, - NormalizationTest { - source: "\u{FB9D}", - nfc: "\u{FB9D}", - nfd: "\u{FB9D}", - nfkc: "\u{06B1}", - nfkd: "\u{06B1}", - }, - NormalizationTest { - source: "\u{FB9E}", - nfc: "\u{FB9E}", - nfd: "\u{FB9E}", - nfkc: "\u{06BA}", - nfkd: "\u{06BA}", - }, - NormalizationTest { - source: "\u{FB9F}", - nfc: "\u{FB9F}", - nfd: "\u{FB9F}", - nfkc: "\u{06BA}", - nfkd: "\u{06BA}", - }, - NormalizationTest { - source: "\u{FBA0}", - nfc: "\u{FBA0}", - nfd: "\u{FBA0}", - nfkc: "\u{06BB}", - nfkd: "\u{06BB}", - }, - NormalizationTest { - source: "\u{FBA1}", - nfc: "\u{FBA1}", - nfd: "\u{FBA1}", - nfkc: "\u{06BB}", - nfkd: "\u{06BB}", - }, - NormalizationTest { - source: "\u{FBA2}", - nfc: "\u{FBA2}", - nfd: "\u{FBA2}", - nfkc: "\u{06BB}", - nfkd: "\u{06BB}", - }, - NormalizationTest { - source: "\u{FBA3}", - nfc: "\u{FBA3}", - nfd: "\u{FBA3}", - nfkc: "\u{06BB}", - nfkd: "\u{06BB}", - }, - NormalizationTest { - source: "\u{FBA4}", - nfc: "\u{FBA4}", - nfd: "\u{FBA4}", - nfkc: "\u{06C0}", - nfkd: "\u{06D5}\u{0654}", - }, - NormalizationTest { - source: "\u{FBA5}", - nfc: "\u{FBA5}", - nfd: "\u{FBA5}", - nfkc: "\u{06C0}", - nfkd: "\u{06D5}\u{0654}", - }, - NormalizationTest { - source: "\u{FBA6}", - nfc: "\u{FBA6}", - nfd: "\u{FBA6}", - nfkc: "\u{06C1}", - nfkd: "\u{06C1}", - }, - NormalizationTest { - source: "\u{FBA7}", - nfc: "\u{FBA7}", - nfd: "\u{FBA7}", - nfkc: "\u{06C1}", - nfkd: "\u{06C1}", - }, - NormalizationTest { - source: "\u{FBA8}", - nfc: "\u{FBA8}", - nfd: "\u{FBA8}", - nfkc: "\u{06C1}", - nfkd: "\u{06C1}", - }, - NormalizationTest { - source: "\u{FBA9}", - nfc: "\u{FBA9}", - nfd: "\u{FBA9}", - nfkc: "\u{06C1}", - nfkd: "\u{06C1}", - }, - NormalizationTest { - source: "\u{FBAA}", - nfc: "\u{FBAA}", - nfd: "\u{FBAA}", - nfkc: "\u{06BE}", - nfkd: "\u{06BE}", - }, - NormalizationTest { - source: "\u{FBAB}", - nfc: "\u{FBAB}", - nfd: "\u{FBAB}", - nfkc: "\u{06BE}", - nfkd: "\u{06BE}", - }, - NormalizationTest { - source: "\u{FBAC}", - nfc: "\u{FBAC}", - nfd: "\u{FBAC}", - nfkc: "\u{06BE}", - nfkd: "\u{06BE}", - }, - NormalizationTest { - source: "\u{FBAD}", - nfc: "\u{FBAD}", - nfd: "\u{FBAD}", - nfkc: "\u{06BE}", - nfkd: "\u{06BE}", - }, - NormalizationTest { - source: "\u{FBAE}", - nfc: "\u{FBAE}", - nfd: "\u{FBAE}", - nfkc: "\u{06D2}", - nfkd: "\u{06D2}", - }, - NormalizationTest { - source: "\u{FBAF}", - nfc: "\u{FBAF}", - nfd: "\u{FBAF}", - nfkc: "\u{06D2}", - nfkd: "\u{06D2}", - }, - NormalizationTest { - source: "\u{FBB0}", - nfc: "\u{FBB0}", - nfd: "\u{FBB0}", - nfkc: "\u{06D3}", - nfkd: "\u{06D2}\u{0654}", - }, - NormalizationTest { - source: "\u{FBB1}", - nfc: "\u{FBB1}", - nfd: "\u{FBB1}", - nfkc: "\u{06D3}", - nfkd: "\u{06D2}\u{0654}", - }, - NormalizationTest { - source: "\u{FBD3}", - nfc: "\u{FBD3}", - nfd: "\u{FBD3}", - nfkc: "\u{06AD}", - nfkd: "\u{06AD}", - }, - NormalizationTest { - source: "\u{FBD4}", - nfc: "\u{FBD4}", - nfd: "\u{FBD4}", - nfkc: "\u{06AD}", - nfkd: "\u{06AD}", - }, - NormalizationTest { - source: "\u{FBD5}", - nfc: "\u{FBD5}", - nfd: "\u{FBD5}", - nfkc: "\u{06AD}", - nfkd: "\u{06AD}", - }, - NormalizationTest { - source: "\u{FBD6}", - nfc: "\u{FBD6}", - nfd: "\u{FBD6}", - nfkc: "\u{06AD}", - nfkd: "\u{06AD}", - }, - NormalizationTest { - source: "\u{FBD7}", - nfc: "\u{FBD7}", - nfd: "\u{FBD7}", - nfkc: "\u{06C7}", - nfkd: "\u{06C7}", - }, - NormalizationTest { - source: "\u{FBD8}", - nfc: "\u{FBD8}", - nfd: "\u{FBD8}", - nfkc: "\u{06C7}", - nfkd: "\u{06C7}", - }, - NormalizationTest { - source: "\u{FBD9}", - nfc: "\u{FBD9}", - nfd: "\u{FBD9}", - nfkc: "\u{06C6}", - nfkd: "\u{06C6}", - }, - NormalizationTest { - source: "\u{FBDA}", - nfc: "\u{FBDA}", - nfd: "\u{FBDA}", - nfkc: "\u{06C6}", - nfkd: "\u{06C6}", - }, - NormalizationTest { - source: "\u{FBDB}", - nfc: "\u{FBDB}", - nfd: "\u{FBDB}", - nfkc: "\u{06C8}", - nfkd: "\u{06C8}", - }, - NormalizationTest { - source: "\u{FBDC}", - nfc: "\u{FBDC}", - nfd: "\u{FBDC}", - nfkc: "\u{06C8}", - nfkd: "\u{06C8}", - }, - NormalizationTest { - source: "\u{FBDD}", - nfc: "\u{FBDD}", - nfd: "\u{FBDD}", - nfkc: "\u{06C7}\u{0674}", - nfkd: "\u{06C7}\u{0674}", - }, - NormalizationTest { - source: "\u{FBDE}", - nfc: "\u{FBDE}", - nfd: "\u{FBDE}", - nfkc: "\u{06CB}", - nfkd: "\u{06CB}", - }, - NormalizationTest { - source: "\u{FBDF}", - nfc: "\u{FBDF}", - nfd: "\u{FBDF}", - nfkc: "\u{06CB}", - nfkd: "\u{06CB}", - }, - NormalizationTest { - source: "\u{FBE0}", - nfc: "\u{FBE0}", - nfd: "\u{FBE0}", - nfkc: "\u{06C5}", - nfkd: "\u{06C5}", - }, - NormalizationTest { - source: "\u{FBE1}", - nfc: "\u{FBE1}", - nfd: "\u{FBE1}", - nfkc: "\u{06C5}", - nfkd: "\u{06C5}", - }, - NormalizationTest { - source: "\u{FBE2}", - nfc: "\u{FBE2}", - nfd: "\u{FBE2}", - nfkc: "\u{06C9}", - nfkd: "\u{06C9}", - }, - NormalizationTest { - source: "\u{FBE3}", - nfc: "\u{FBE3}", - nfd: "\u{FBE3}", - nfkc: "\u{06C9}", - nfkd: "\u{06C9}", - }, - NormalizationTest { - source: "\u{FBE4}", - nfc: "\u{FBE4}", - nfd: "\u{FBE4}", - nfkc: "\u{06D0}", - nfkd: "\u{06D0}", - }, - NormalizationTest { - source: "\u{FBE5}", - nfc: "\u{FBE5}", - nfd: "\u{FBE5}", - nfkc: "\u{06D0}", - nfkd: "\u{06D0}", - }, - NormalizationTest { - source: "\u{FBE6}", - nfc: "\u{FBE6}", - nfd: "\u{FBE6}", - nfkc: "\u{06D0}", - nfkd: "\u{06D0}", - }, - NormalizationTest { - source: "\u{FBE7}", - nfc: "\u{FBE7}", - nfd: "\u{FBE7}", - nfkc: "\u{06D0}", - nfkd: "\u{06D0}", - }, - NormalizationTest { - source: "\u{FBE8}", - nfc: "\u{FBE8}", - nfd: "\u{FBE8}", - nfkc: "\u{0649}", - nfkd: "\u{0649}", - }, - NormalizationTest { - source: "\u{FBE9}", - nfc: "\u{FBE9}", - nfd: "\u{FBE9}", - nfkc: "\u{0649}", - nfkd: "\u{0649}", - }, - NormalizationTest { - source: "\u{FBEA}", - nfc: "\u{FBEA}", - nfd: "\u{FBEA}", - nfkc: "\u{0626}\u{0627}", - nfkd: "\u{064A}\u{0654}\u{0627}", - }, - NormalizationTest { - source: "\u{FBEB}", - nfc: "\u{FBEB}", - nfd: "\u{FBEB}", - nfkc: "\u{0626}\u{0627}", - nfkd: "\u{064A}\u{0654}\u{0627}", - }, - NormalizationTest { - source: "\u{FBEC}", - nfc: "\u{FBEC}", - nfd: "\u{FBEC}", - nfkc: "\u{0626}\u{06D5}", - nfkd: "\u{064A}\u{0654}\u{06D5}", - }, - NormalizationTest { - source: "\u{FBED}", - nfc: "\u{FBED}", - nfd: "\u{FBED}", - nfkc: "\u{0626}\u{06D5}", - nfkd: "\u{064A}\u{0654}\u{06D5}", - }, - NormalizationTest { - source: "\u{FBEE}", - nfc: "\u{FBEE}", - nfd: "\u{FBEE}", - nfkc: "\u{0626}\u{0648}", - nfkd: "\u{064A}\u{0654}\u{0648}", - }, - NormalizationTest { - source: "\u{FBEF}", - nfc: "\u{FBEF}", - nfd: "\u{FBEF}", - nfkc: "\u{0626}\u{0648}", - nfkd: "\u{064A}\u{0654}\u{0648}", - }, - NormalizationTest { - source: "\u{FBF0}", - nfc: "\u{FBF0}", - nfd: "\u{FBF0}", - nfkc: "\u{0626}\u{06C7}", - nfkd: "\u{064A}\u{0654}\u{06C7}", - }, - NormalizationTest { - source: "\u{FBF1}", - nfc: "\u{FBF1}", - nfd: "\u{FBF1}", - nfkc: "\u{0626}\u{06C7}", - nfkd: "\u{064A}\u{0654}\u{06C7}", - }, - NormalizationTest { - source: "\u{FBF2}", - nfc: "\u{FBF2}", - nfd: "\u{FBF2}", - nfkc: "\u{0626}\u{06C6}", - nfkd: "\u{064A}\u{0654}\u{06C6}", - }, - NormalizationTest { - source: "\u{FBF3}", - nfc: "\u{FBF3}", - nfd: "\u{FBF3}", - nfkc: "\u{0626}\u{06C6}", - nfkd: "\u{064A}\u{0654}\u{06C6}", - }, - NormalizationTest { - source: "\u{FBF4}", - nfc: "\u{FBF4}", - nfd: "\u{FBF4}", - nfkc: "\u{0626}\u{06C8}", - nfkd: "\u{064A}\u{0654}\u{06C8}", - }, - NormalizationTest { - source: "\u{FBF5}", - nfc: "\u{FBF5}", - nfd: "\u{FBF5}", - nfkc: "\u{0626}\u{06C8}", - nfkd: "\u{064A}\u{0654}\u{06C8}", - }, - NormalizationTest { - source: "\u{FBF6}", - nfc: "\u{FBF6}", - nfd: "\u{FBF6}", - nfkc: "\u{0626}\u{06D0}", - nfkd: "\u{064A}\u{0654}\u{06D0}", - }, - NormalizationTest { - source: "\u{FBF7}", - nfc: "\u{FBF7}", - nfd: "\u{FBF7}", - nfkc: "\u{0626}\u{06D0}", - nfkd: "\u{064A}\u{0654}\u{06D0}", - }, - NormalizationTest { - source: "\u{FBF8}", - nfc: "\u{FBF8}", - nfd: "\u{FBF8}", - nfkc: "\u{0626}\u{06D0}", - nfkd: "\u{064A}\u{0654}\u{06D0}", - }, - NormalizationTest { - source: "\u{FBF9}", - nfc: "\u{FBF9}", - nfd: "\u{FBF9}", - nfkc: "\u{0626}\u{0649}", - nfkd: "\u{064A}\u{0654}\u{0649}", - }, - NormalizationTest { - source: "\u{FBFA}", - nfc: "\u{FBFA}", - nfd: "\u{FBFA}", - nfkc: "\u{0626}\u{0649}", - nfkd: "\u{064A}\u{0654}\u{0649}", - }, - NormalizationTest { - source: "\u{FBFB}", - nfc: "\u{FBFB}", - nfd: "\u{FBFB}", - nfkc: "\u{0626}\u{0649}", - nfkd: "\u{064A}\u{0654}\u{0649}", - }, - NormalizationTest { - source: "\u{FBFC}", - nfc: "\u{FBFC}", - nfd: "\u{FBFC}", - nfkc: "\u{06CC}", - nfkd: "\u{06CC}", - }, - NormalizationTest { - source: "\u{FBFD}", - nfc: "\u{FBFD}", - nfd: "\u{FBFD}", - nfkc: "\u{06CC}", - nfkd: "\u{06CC}", - }, - NormalizationTest { - source: "\u{FBFE}", - nfc: "\u{FBFE}", - nfd: "\u{FBFE}", - nfkc: "\u{06CC}", - nfkd: "\u{06CC}", - }, - NormalizationTest { - source: "\u{FBFF}", - nfc: "\u{FBFF}", - nfd: "\u{FBFF}", - nfkc: "\u{06CC}", - nfkd: "\u{06CC}", - }, - NormalizationTest { - source: "\u{FC00}", - nfc: "\u{FC00}", - nfd: "\u{FC00}", - nfkc: "\u{0626}\u{062C}", - nfkd: "\u{064A}\u{0654}\u{062C}", - }, - NormalizationTest { - source: "\u{FC01}", - nfc: "\u{FC01}", - nfd: "\u{FC01}", - nfkc: "\u{0626}\u{062D}", - nfkd: "\u{064A}\u{0654}\u{062D}", - }, - NormalizationTest { - source: "\u{FC02}", - nfc: "\u{FC02}", - nfd: "\u{FC02}", - nfkc: "\u{0626}\u{0645}", - nfkd: "\u{064A}\u{0654}\u{0645}", - }, - NormalizationTest { - source: "\u{FC03}", - nfc: "\u{FC03}", - nfd: "\u{FC03}", - nfkc: "\u{0626}\u{0649}", - nfkd: "\u{064A}\u{0654}\u{0649}", - }, - NormalizationTest { - source: "\u{FC04}", - nfc: "\u{FC04}", - nfd: "\u{FC04}", - nfkc: "\u{0626}\u{064A}", - nfkd: "\u{064A}\u{0654}\u{064A}", - }, - NormalizationTest { - source: "\u{FC05}", - nfc: "\u{FC05}", - nfd: "\u{FC05}", - nfkc: "\u{0628}\u{062C}", - nfkd: "\u{0628}\u{062C}", - }, - NormalizationTest { - source: "\u{FC06}", - nfc: "\u{FC06}", - nfd: "\u{FC06}", - nfkc: "\u{0628}\u{062D}", - nfkd: "\u{0628}\u{062D}", - }, - NormalizationTest { - source: "\u{FC07}", - nfc: "\u{FC07}", - nfd: "\u{FC07}", - nfkc: "\u{0628}\u{062E}", - nfkd: "\u{0628}\u{062E}", - }, - NormalizationTest { - source: "\u{FC08}", - nfc: "\u{FC08}", - nfd: "\u{FC08}", - nfkc: "\u{0628}\u{0645}", - nfkd: "\u{0628}\u{0645}", - }, - NormalizationTest { - source: "\u{FC09}", - nfc: "\u{FC09}", - nfd: "\u{FC09}", - nfkc: "\u{0628}\u{0649}", - nfkd: "\u{0628}\u{0649}", - }, - NormalizationTest { - source: "\u{FC0A}", - nfc: "\u{FC0A}", - nfd: "\u{FC0A}", - nfkc: "\u{0628}\u{064A}", - nfkd: "\u{0628}\u{064A}", - }, - NormalizationTest { - source: "\u{FC0B}", - nfc: "\u{FC0B}", - nfd: "\u{FC0B}", - nfkc: "\u{062A}\u{062C}", - nfkd: "\u{062A}\u{062C}", - }, - NormalizationTest { - source: "\u{FC0C}", - nfc: "\u{FC0C}", - nfd: "\u{FC0C}", - nfkc: "\u{062A}\u{062D}", - nfkd: "\u{062A}\u{062D}", - }, - NormalizationTest { - source: "\u{FC0D}", - nfc: "\u{FC0D}", - nfd: "\u{FC0D}", - nfkc: "\u{062A}\u{062E}", - nfkd: "\u{062A}\u{062E}", - }, - NormalizationTest { - source: "\u{FC0E}", - nfc: "\u{FC0E}", - nfd: "\u{FC0E}", - nfkc: "\u{062A}\u{0645}", - nfkd: "\u{062A}\u{0645}", - }, - NormalizationTest { - source: "\u{FC0F}", - nfc: "\u{FC0F}", - nfd: "\u{FC0F}", - nfkc: "\u{062A}\u{0649}", - nfkd: "\u{062A}\u{0649}", - }, - NormalizationTest { - source: "\u{FC10}", - nfc: "\u{FC10}", - nfd: "\u{FC10}", - nfkc: "\u{062A}\u{064A}", - nfkd: "\u{062A}\u{064A}", - }, - NormalizationTest { - source: "\u{FC11}", - nfc: "\u{FC11}", - nfd: "\u{FC11}", - nfkc: "\u{062B}\u{062C}", - nfkd: "\u{062B}\u{062C}", - }, - NormalizationTest { - source: "\u{FC12}", - nfc: "\u{FC12}", - nfd: "\u{FC12}", - nfkc: "\u{062B}\u{0645}", - nfkd: "\u{062B}\u{0645}", - }, - NormalizationTest { - source: "\u{FC13}", - nfc: "\u{FC13}", - nfd: "\u{FC13}", - nfkc: "\u{062B}\u{0649}", - nfkd: "\u{062B}\u{0649}", - }, - NormalizationTest { - source: "\u{FC14}", - nfc: "\u{FC14}", - nfd: "\u{FC14}", - nfkc: "\u{062B}\u{064A}", - nfkd: "\u{062B}\u{064A}", - }, - NormalizationTest { - source: "\u{FC15}", - nfc: "\u{FC15}", - nfd: "\u{FC15}", - nfkc: "\u{062C}\u{062D}", - nfkd: "\u{062C}\u{062D}", - }, - NormalizationTest { - source: "\u{FC16}", - nfc: "\u{FC16}", - nfd: "\u{FC16}", - nfkc: "\u{062C}\u{0645}", - nfkd: "\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FC17}", - nfc: "\u{FC17}", - nfd: "\u{FC17}", - nfkc: "\u{062D}\u{062C}", - nfkd: "\u{062D}\u{062C}", - }, - NormalizationTest { - source: "\u{FC18}", - nfc: "\u{FC18}", - nfd: "\u{FC18}", - nfkc: "\u{062D}\u{0645}", - nfkd: "\u{062D}\u{0645}", - }, - NormalizationTest { - source: "\u{FC19}", - nfc: "\u{FC19}", - nfd: "\u{FC19}", - nfkc: "\u{062E}\u{062C}", - nfkd: "\u{062E}\u{062C}", - }, - NormalizationTest { - source: "\u{FC1A}", - nfc: "\u{FC1A}", - nfd: "\u{FC1A}", - nfkc: "\u{062E}\u{062D}", - nfkd: "\u{062E}\u{062D}", - }, - NormalizationTest { - source: "\u{FC1B}", - nfc: "\u{FC1B}", - nfd: "\u{FC1B}", - nfkc: "\u{062E}\u{0645}", - nfkd: "\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FC1C}", - nfc: "\u{FC1C}", - nfd: "\u{FC1C}", - nfkc: "\u{0633}\u{062C}", - nfkd: "\u{0633}\u{062C}", - }, - NormalizationTest { - source: "\u{FC1D}", - nfc: "\u{FC1D}", - nfd: "\u{FC1D}", - nfkc: "\u{0633}\u{062D}", - nfkd: "\u{0633}\u{062D}", - }, - NormalizationTest { - source: "\u{FC1E}", - nfc: "\u{FC1E}", - nfd: "\u{FC1E}", - nfkc: "\u{0633}\u{062E}", - nfkd: "\u{0633}\u{062E}", - }, - NormalizationTest { - source: "\u{FC1F}", - nfc: "\u{FC1F}", - nfd: "\u{FC1F}", - nfkc: "\u{0633}\u{0645}", - nfkd: "\u{0633}\u{0645}", - }, - NormalizationTest { - source: "\u{FC20}", - nfc: "\u{FC20}", - nfd: "\u{FC20}", - nfkc: "\u{0635}\u{062D}", - nfkd: "\u{0635}\u{062D}", - }, - NormalizationTest { - source: "\u{FC21}", - nfc: "\u{FC21}", - nfd: "\u{FC21}", - nfkc: "\u{0635}\u{0645}", - nfkd: "\u{0635}\u{0645}", - }, - NormalizationTest { - source: "\u{FC22}", - nfc: "\u{FC22}", - nfd: "\u{FC22}", - nfkc: "\u{0636}\u{062C}", - nfkd: "\u{0636}\u{062C}", - }, - NormalizationTest { - source: "\u{FC23}", - nfc: "\u{FC23}", - nfd: "\u{FC23}", - nfkc: "\u{0636}\u{062D}", - nfkd: "\u{0636}\u{062D}", - }, - NormalizationTest { - source: "\u{FC24}", - nfc: "\u{FC24}", - nfd: "\u{FC24}", - nfkc: "\u{0636}\u{062E}", - nfkd: "\u{0636}\u{062E}", - }, - NormalizationTest { - source: "\u{FC25}", - nfc: "\u{FC25}", - nfd: "\u{FC25}", - nfkc: "\u{0636}\u{0645}", - nfkd: "\u{0636}\u{0645}", - }, - NormalizationTest { - source: "\u{FC26}", - nfc: "\u{FC26}", - nfd: "\u{FC26}", - nfkc: "\u{0637}\u{062D}", - nfkd: "\u{0637}\u{062D}", - }, - NormalizationTest { - source: "\u{FC27}", - nfc: "\u{FC27}", - nfd: "\u{FC27}", - nfkc: "\u{0637}\u{0645}", - nfkd: "\u{0637}\u{0645}", - }, - NormalizationTest { - source: "\u{FC28}", - nfc: "\u{FC28}", - nfd: "\u{FC28}", - nfkc: "\u{0638}\u{0645}", - nfkd: "\u{0638}\u{0645}", - }, - NormalizationTest { - source: "\u{FC29}", - nfc: "\u{FC29}", - nfd: "\u{FC29}", - nfkc: "\u{0639}\u{062C}", - nfkd: "\u{0639}\u{062C}", - }, - NormalizationTest { - source: "\u{FC2A}", - nfc: "\u{FC2A}", - nfd: "\u{FC2A}", - nfkc: "\u{0639}\u{0645}", - nfkd: "\u{0639}\u{0645}", - }, - NormalizationTest { - source: "\u{FC2B}", - nfc: "\u{FC2B}", - nfd: "\u{FC2B}", - nfkc: "\u{063A}\u{062C}", - nfkd: "\u{063A}\u{062C}", - }, - NormalizationTest { - source: "\u{FC2C}", - nfc: "\u{FC2C}", - nfd: "\u{FC2C}", - nfkc: "\u{063A}\u{0645}", - nfkd: "\u{063A}\u{0645}", - }, - NormalizationTest { - source: "\u{FC2D}", - nfc: "\u{FC2D}", - nfd: "\u{FC2D}", - nfkc: "\u{0641}\u{062C}", - nfkd: "\u{0641}\u{062C}", - }, - NormalizationTest { - source: "\u{FC2E}", - nfc: "\u{FC2E}", - nfd: "\u{FC2E}", - nfkc: "\u{0641}\u{062D}", - nfkd: "\u{0641}\u{062D}", - }, - NormalizationTest { - source: "\u{FC2F}", - nfc: "\u{FC2F}", - nfd: "\u{FC2F}", - nfkc: "\u{0641}\u{062E}", - nfkd: "\u{0641}\u{062E}", - }, - NormalizationTest { - source: "\u{FC30}", - nfc: "\u{FC30}", - nfd: "\u{FC30}", - nfkc: "\u{0641}\u{0645}", - nfkd: "\u{0641}\u{0645}", - }, - NormalizationTest { - source: "\u{FC31}", - nfc: "\u{FC31}", - nfd: "\u{FC31}", - nfkc: "\u{0641}\u{0649}", - nfkd: "\u{0641}\u{0649}", - }, - NormalizationTest { - source: "\u{FC32}", - nfc: "\u{FC32}", - nfd: "\u{FC32}", - nfkc: "\u{0641}\u{064A}", - nfkd: "\u{0641}\u{064A}", - }, - NormalizationTest { - source: "\u{FC33}", - nfc: "\u{FC33}", - nfd: "\u{FC33}", - nfkc: "\u{0642}\u{062D}", - nfkd: "\u{0642}\u{062D}", - }, - NormalizationTest { - source: "\u{FC34}", - nfc: "\u{FC34}", - nfd: "\u{FC34}", - nfkc: "\u{0642}\u{0645}", - nfkd: "\u{0642}\u{0645}", - }, - NormalizationTest { - source: "\u{FC35}", - nfc: "\u{FC35}", - nfd: "\u{FC35}", - nfkc: "\u{0642}\u{0649}", - nfkd: "\u{0642}\u{0649}", - }, - NormalizationTest { - source: "\u{FC36}", - nfc: "\u{FC36}", - nfd: "\u{FC36}", - nfkc: "\u{0642}\u{064A}", - nfkd: "\u{0642}\u{064A}", - }, - NormalizationTest { - source: "\u{FC37}", - nfc: "\u{FC37}", - nfd: "\u{FC37}", - nfkc: "\u{0643}\u{0627}", - nfkd: "\u{0643}\u{0627}", - }, - NormalizationTest { - source: "\u{FC38}", - nfc: "\u{FC38}", - nfd: "\u{FC38}", - nfkc: "\u{0643}\u{062C}", - nfkd: "\u{0643}\u{062C}", - }, - NormalizationTest { - source: "\u{FC39}", - nfc: "\u{FC39}", - nfd: "\u{FC39}", - nfkc: "\u{0643}\u{062D}", - nfkd: "\u{0643}\u{062D}", - }, - NormalizationTest { - source: "\u{FC3A}", - nfc: "\u{FC3A}", - nfd: "\u{FC3A}", - nfkc: "\u{0643}\u{062E}", - nfkd: "\u{0643}\u{062E}", - }, - NormalizationTest { - source: "\u{FC3B}", - nfc: "\u{FC3B}", - nfd: "\u{FC3B}", - nfkc: "\u{0643}\u{0644}", - nfkd: "\u{0643}\u{0644}", - }, - NormalizationTest { - source: "\u{FC3C}", - nfc: "\u{FC3C}", - nfd: "\u{FC3C}", - nfkc: "\u{0643}\u{0645}", - nfkd: "\u{0643}\u{0645}", - }, - NormalizationTest { - source: "\u{FC3D}", - nfc: "\u{FC3D}", - nfd: "\u{FC3D}", - nfkc: "\u{0643}\u{0649}", - nfkd: "\u{0643}\u{0649}", - }, - NormalizationTest { - source: "\u{FC3E}", - nfc: "\u{FC3E}", - nfd: "\u{FC3E}", - nfkc: "\u{0643}\u{064A}", - nfkd: "\u{0643}\u{064A}", - }, - NormalizationTest { - source: "\u{FC3F}", - nfc: "\u{FC3F}", - nfd: "\u{FC3F}", - nfkc: "\u{0644}\u{062C}", - nfkd: "\u{0644}\u{062C}", - }, - NormalizationTest { - source: "\u{FC40}", - nfc: "\u{FC40}", - nfd: "\u{FC40}", - nfkc: "\u{0644}\u{062D}", - nfkd: "\u{0644}\u{062D}", - }, - NormalizationTest { - source: "\u{FC41}", - nfc: "\u{FC41}", - nfd: "\u{FC41}", - nfkc: "\u{0644}\u{062E}", - nfkd: "\u{0644}\u{062E}", - }, - NormalizationTest { - source: "\u{FC42}", - nfc: "\u{FC42}", - nfd: "\u{FC42}", - nfkc: "\u{0644}\u{0645}", - nfkd: "\u{0644}\u{0645}", - }, - NormalizationTest { - source: "\u{FC43}", - nfc: "\u{FC43}", - nfd: "\u{FC43}", - nfkc: "\u{0644}\u{0649}", - nfkd: "\u{0644}\u{0649}", - }, - NormalizationTest { - source: "\u{FC44}", - nfc: "\u{FC44}", - nfd: "\u{FC44}", - nfkc: "\u{0644}\u{064A}", - nfkd: "\u{0644}\u{064A}", - }, - NormalizationTest { - source: "\u{FC45}", - nfc: "\u{FC45}", - nfd: "\u{FC45}", - nfkc: "\u{0645}\u{062C}", - nfkd: "\u{0645}\u{062C}", - }, - NormalizationTest { - source: "\u{FC46}", - nfc: "\u{FC46}", - nfd: "\u{FC46}", - nfkc: "\u{0645}\u{062D}", - nfkd: "\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FC47}", - nfc: "\u{FC47}", - nfd: "\u{FC47}", - nfkc: "\u{0645}\u{062E}", - nfkd: "\u{0645}\u{062E}", - }, - NormalizationTest { - source: "\u{FC48}", - nfc: "\u{FC48}", - nfd: "\u{FC48}", - nfkc: "\u{0645}\u{0645}", - nfkd: "\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FC49}", - nfc: "\u{FC49}", - nfd: "\u{FC49}", - nfkc: "\u{0645}\u{0649}", - nfkd: "\u{0645}\u{0649}", - }, - NormalizationTest { - source: "\u{FC4A}", - nfc: "\u{FC4A}", - nfd: "\u{FC4A}", - nfkc: "\u{0645}\u{064A}", - nfkd: "\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FC4B}", - nfc: "\u{FC4B}", - nfd: "\u{FC4B}", - nfkc: "\u{0646}\u{062C}", - nfkd: "\u{0646}\u{062C}", - }, - NormalizationTest { - source: "\u{FC4C}", - nfc: "\u{FC4C}", - nfd: "\u{FC4C}", - nfkc: "\u{0646}\u{062D}", - nfkd: "\u{0646}\u{062D}", - }, - NormalizationTest { - source: "\u{FC4D}", - nfc: "\u{FC4D}", - nfd: "\u{FC4D}", - nfkc: "\u{0646}\u{062E}", - nfkd: "\u{0646}\u{062E}", - }, - NormalizationTest { - source: "\u{FC4E}", - nfc: "\u{FC4E}", - nfd: "\u{FC4E}", - nfkc: "\u{0646}\u{0645}", - nfkd: "\u{0646}\u{0645}", - }, - NormalizationTest { - source: "\u{FC4F}", - nfc: "\u{FC4F}", - nfd: "\u{FC4F}", - nfkc: "\u{0646}\u{0649}", - nfkd: "\u{0646}\u{0649}", - }, - NormalizationTest { - source: "\u{FC50}", - nfc: "\u{FC50}", - nfd: "\u{FC50}", - nfkc: "\u{0646}\u{064A}", - nfkd: "\u{0646}\u{064A}", - }, - NormalizationTest { - source: "\u{FC51}", - nfc: "\u{FC51}", - nfd: "\u{FC51}", - nfkc: "\u{0647}\u{062C}", - nfkd: "\u{0647}\u{062C}", - }, - NormalizationTest { - source: "\u{FC52}", - nfc: "\u{FC52}", - nfd: "\u{FC52}", - nfkc: "\u{0647}\u{0645}", - nfkd: "\u{0647}\u{0645}", - }, - NormalizationTest { - source: "\u{FC53}", - nfc: "\u{FC53}", - nfd: "\u{FC53}", - nfkc: "\u{0647}\u{0649}", - nfkd: "\u{0647}\u{0649}", - }, - NormalizationTest { - source: "\u{FC54}", - nfc: "\u{FC54}", - nfd: "\u{FC54}", - nfkc: "\u{0647}\u{064A}", - nfkd: "\u{0647}\u{064A}", - }, - NormalizationTest { - source: "\u{FC55}", - nfc: "\u{FC55}", - nfd: "\u{FC55}", - nfkc: "\u{064A}\u{062C}", - nfkd: "\u{064A}\u{062C}", - }, - NormalizationTest { - source: "\u{FC56}", - nfc: "\u{FC56}", - nfd: "\u{FC56}", - nfkc: "\u{064A}\u{062D}", - nfkd: "\u{064A}\u{062D}", - }, - NormalizationTest { - source: "\u{FC57}", - nfc: "\u{FC57}", - nfd: "\u{FC57}", - nfkc: "\u{064A}\u{062E}", - nfkd: "\u{064A}\u{062E}", - }, - NormalizationTest { - source: "\u{FC58}", - nfc: "\u{FC58}", - nfd: "\u{FC58}", - nfkc: "\u{064A}\u{0645}", - nfkd: "\u{064A}\u{0645}", - }, - NormalizationTest { - source: "\u{FC59}", - nfc: "\u{FC59}", - nfd: "\u{FC59}", - nfkc: "\u{064A}\u{0649}", - nfkd: "\u{064A}\u{0649}", - }, - NormalizationTest { - source: "\u{FC5A}", - nfc: "\u{FC5A}", - nfd: "\u{FC5A}", - nfkc: "\u{064A}\u{064A}", - nfkd: "\u{064A}\u{064A}", - }, - NormalizationTest { - source: "\u{FC5B}", - nfc: "\u{FC5B}", - nfd: "\u{FC5B}", - nfkc: "\u{0630}\u{0670}", - nfkd: "\u{0630}\u{0670}", - }, - NormalizationTest { - source: "\u{FC5C}", - nfc: "\u{FC5C}", - nfd: "\u{FC5C}", - nfkc: "\u{0631}\u{0670}", - nfkd: "\u{0631}\u{0670}", - }, - NormalizationTest { - source: "\u{FC5D}", - nfc: "\u{FC5D}", - nfd: "\u{FC5D}", - nfkc: "\u{0649}\u{0670}", - nfkd: "\u{0649}\u{0670}", - }, - NormalizationTest { - source: "\u{FC5E}", - nfc: "\u{FC5E}", - nfd: "\u{FC5E}", - nfkc: "\u{0020}\u{064C}\u{0651}", - nfkd: "\u{0020}\u{064C}\u{0651}", - }, - NormalizationTest { - source: "\u{FC5F}", - nfc: "\u{FC5F}", - nfd: "\u{FC5F}", - nfkc: "\u{0020}\u{064D}\u{0651}", - nfkd: "\u{0020}\u{064D}\u{0651}", - }, - NormalizationTest { - source: "\u{FC60}", - nfc: "\u{FC60}", - nfd: "\u{FC60}", - nfkc: "\u{0020}\u{064E}\u{0651}", - nfkd: "\u{0020}\u{064E}\u{0651}", - }, - NormalizationTest { - source: "\u{FC61}", - nfc: "\u{FC61}", - nfd: "\u{FC61}", - nfkc: "\u{0020}\u{064F}\u{0651}", - nfkd: "\u{0020}\u{064F}\u{0651}", - }, - NormalizationTest { - source: "\u{FC62}", - nfc: "\u{FC62}", - nfd: "\u{FC62}", - nfkc: "\u{0020}\u{0650}\u{0651}", - nfkd: "\u{0020}\u{0650}\u{0651}", - }, - NormalizationTest { - source: "\u{FC63}", - nfc: "\u{FC63}", - nfd: "\u{FC63}", - nfkc: "\u{0020}\u{0651}\u{0670}", - nfkd: "\u{0020}\u{0651}\u{0670}", - }, - NormalizationTest { - source: "\u{FC64}", - nfc: "\u{FC64}", - nfd: "\u{FC64}", - nfkc: "\u{0626}\u{0631}", - nfkd: "\u{064A}\u{0654}\u{0631}", - }, - NormalizationTest { - source: "\u{FC65}", - nfc: "\u{FC65}", - nfd: "\u{FC65}", - nfkc: "\u{0626}\u{0632}", - nfkd: "\u{064A}\u{0654}\u{0632}", - }, - NormalizationTest { - source: "\u{FC66}", - nfc: "\u{FC66}", - nfd: "\u{FC66}", - nfkc: "\u{0626}\u{0645}", - nfkd: "\u{064A}\u{0654}\u{0645}", - }, - NormalizationTest { - source: "\u{FC67}", - nfc: "\u{FC67}", - nfd: "\u{FC67}", - nfkc: "\u{0626}\u{0646}", - nfkd: "\u{064A}\u{0654}\u{0646}", - }, - NormalizationTest { - source: "\u{FC68}", - nfc: "\u{FC68}", - nfd: "\u{FC68}", - nfkc: "\u{0626}\u{0649}", - nfkd: "\u{064A}\u{0654}\u{0649}", - }, - NormalizationTest { - source: "\u{FC69}", - nfc: "\u{FC69}", - nfd: "\u{FC69}", - nfkc: "\u{0626}\u{064A}", - nfkd: "\u{064A}\u{0654}\u{064A}", - }, - NormalizationTest { - source: "\u{FC6A}", - nfc: "\u{FC6A}", - nfd: "\u{FC6A}", - nfkc: "\u{0628}\u{0631}", - nfkd: "\u{0628}\u{0631}", - }, - NormalizationTest { - source: "\u{FC6B}", - nfc: "\u{FC6B}", - nfd: "\u{FC6B}", - nfkc: "\u{0628}\u{0632}", - nfkd: "\u{0628}\u{0632}", - }, - NormalizationTest { - source: "\u{FC6C}", - nfc: "\u{FC6C}", - nfd: "\u{FC6C}", - nfkc: "\u{0628}\u{0645}", - nfkd: "\u{0628}\u{0645}", - }, - NormalizationTest { - source: "\u{FC6D}", - nfc: "\u{FC6D}", - nfd: "\u{FC6D}", - nfkc: "\u{0628}\u{0646}", - nfkd: "\u{0628}\u{0646}", - }, - NormalizationTest { - source: "\u{FC6E}", - nfc: "\u{FC6E}", - nfd: "\u{FC6E}", - nfkc: "\u{0628}\u{0649}", - nfkd: "\u{0628}\u{0649}", - }, - NormalizationTest { - source: "\u{FC6F}", - nfc: "\u{FC6F}", - nfd: "\u{FC6F}", - nfkc: "\u{0628}\u{064A}", - nfkd: "\u{0628}\u{064A}", - }, - NormalizationTest { - source: "\u{FC70}", - nfc: "\u{FC70}", - nfd: "\u{FC70}", - nfkc: "\u{062A}\u{0631}", - nfkd: "\u{062A}\u{0631}", - }, - NormalizationTest { - source: "\u{FC71}", - nfc: "\u{FC71}", - nfd: "\u{FC71}", - nfkc: "\u{062A}\u{0632}", - nfkd: "\u{062A}\u{0632}", - }, - NormalizationTest { - source: "\u{FC72}", - nfc: "\u{FC72}", - nfd: "\u{FC72}", - nfkc: "\u{062A}\u{0645}", - nfkd: "\u{062A}\u{0645}", - }, - NormalizationTest { - source: "\u{FC73}", - nfc: "\u{FC73}", - nfd: "\u{FC73}", - nfkc: "\u{062A}\u{0646}", - nfkd: "\u{062A}\u{0646}", - }, - NormalizationTest { - source: "\u{FC74}", - nfc: "\u{FC74}", - nfd: "\u{FC74}", - nfkc: "\u{062A}\u{0649}", - nfkd: "\u{062A}\u{0649}", - }, - NormalizationTest { - source: "\u{FC75}", - nfc: "\u{FC75}", - nfd: "\u{FC75}", - nfkc: "\u{062A}\u{064A}", - nfkd: "\u{062A}\u{064A}", - }, - NormalizationTest { - source: "\u{FC76}", - nfc: "\u{FC76}", - nfd: "\u{FC76}", - nfkc: "\u{062B}\u{0631}", - nfkd: "\u{062B}\u{0631}", - }, - NormalizationTest { - source: "\u{FC77}", - nfc: "\u{FC77}", - nfd: "\u{FC77}", - nfkc: "\u{062B}\u{0632}", - nfkd: "\u{062B}\u{0632}", - }, - NormalizationTest { - source: "\u{FC78}", - nfc: "\u{FC78}", - nfd: "\u{FC78}", - nfkc: "\u{062B}\u{0645}", - nfkd: "\u{062B}\u{0645}", - }, - NormalizationTest { - source: "\u{FC79}", - nfc: "\u{FC79}", - nfd: "\u{FC79}", - nfkc: "\u{062B}\u{0646}", - nfkd: "\u{062B}\u{0646}", - }, - NormalizationTest { - source: "\u{FC7A}", - nfc: "\u{FC7A}", - nfd: "\u{FC7A}", - nfkc: "\u{062B}\u{0649}", - nfkd: "\u{062B}\u{0649}", - }, - NormalizationTest { - source: "\u{FC7B}", - nfc: "\u{FC7B}", - nfd: "\u{FC7B}", - nfkc: "\u{062B}\u{064A}", - nfkd: "\u{062B}\u{064A}", - }, - NormalizationTest { - source: "\u{FC7C}", - nfc: "\u{FC7C}", - nfd: "\u{FC7C}", - nfkc: "\u{0641}\u{0649}", - nfkd: "\u{0641}\u{0649}", - }, - NormalizationTest { - source: "\u{FC7D}", - nfc: "\u{FC7D}", - nfd: "\u{FC7D}", - nfkc: "\u{0641}\u{064A}", - nfkd: "\u{0641}\u{064A}", - }, - NormalizationTest { - source: "\u{FC7E}", - nfc: "\u{FC7E}", - nfd: "\u{FC7E}", - nfkc: "\u{0642}\u{0649}", - nfkd: "\u{0642}\u{0649}", - }, - NormalizationTest { - source: "\u{FC7F}", - nfc: "\u{FC7F}", - nfd: "\u{FC7F}", - nfkc: "\u{0642}\u{064A}", - nfkd: "\u{0642}\u{064A}", - }, - NormalizationTest { - source: "\u{FC80}", - nfc: "\u{FC80}", - nfd: "\u{FC80}", - nfkc: "\u{0643}\u{0627}", - nfkd: "\u{0643}\u{0627}", - }, - NormalizationTest { - source: "\u{FC81}", - nfc: "\u{FC81}", - nfd: "\u{FC81}", - nfkc: "\u{0643}\u{0644}", - nfkd: "\u{0643}\u{0644}", - }, - NormalizationTest { - source: "\u{FC82}", - nfc: "\u{FC82}", - nfd: "\u{FC82}", - nfkc: "\u{0643}\u{0645}", - nfkd: "\u{0643}\u{0645}", - }, - NormalizationTest { - source: "\u{FC83}", - nfc: "\u{FC83}", - nfd: "\u{FC83}", - nfkc: "\u{0643}\u{0649}", - nfkd: "\u{0643}\u{0649}", - }, - NormalizationTest { - source: "\u{FC84}", - nfc: "\u{FC84}", - nfd: "\u{FC84}", - nfkc: "\u{0643}\u{064A}", - nfkd: "\u{0643}\u{064A}", - }, - NormalizationTest { - source: "\u{FC85}", - nfc: "\u{FC85}", - nfd: "\u{FC85}", - nfkc: "\u{0644}\u{0645}", - nfkd: "\u{0644}\u{0645}", - }, - NormalizationTest { - source: "\u{FC86}", - nfc: "\u{FC86}", - nfd: "\u{FC86}", - nfkc: "\u{0644}\u{0649}", - nfkd: "\u{0644}\u{0649}", - }, - NormalizationTest { - source: "\u{FC87}", - nfc: "\u{FC87}", - nfd: "\u{FC87}", - nfkc: "\u{0644}\u{064A}", - nfkd: "\u{0644}\u{064A}", - }, - NormalizationTest { - source: "\u{FC88}", - nfc: "\u{FC88}", - nfd: "\u{FC88}", - nfkc: "\u{0645}\u{0627}", - nfkd: "\u{0645}\u{0627}", - }, - NormalizationTest { - source: "\u{FC89}", - nfc: "\u{FC89}", - nfd: "\u{FC89}", - nfkc: "\u{0645}\u{0645}", - nfkd: "\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FC8A}", - nfc: "\u{FC8A}", - nfd: "\u{FC8A}", - nfkc: "\u{0646}\u{0631}", - nfkd: "\u{0646}\u{0631}", - }, - NormalizationTest { - source: "\u{FC8B}", - nfc: "\u{FC8B}", - nfd: "\u{FC8B}", - nfkc: "\u{0646}\u{0632}", - nfkd: "\u{0646}\u{0632}", - }, - NormalizationTest { - source: "\u{FC8C}", - nfc: "\u{FC8C}", - nfd: "\u{FC8C}", - nfkc: "\u{0646}\u{0645}", - nfkd: "\u{0646}\u{0645}", - }, - NormalizationTest { - source: "\u{FC8D}", - nfc: "\u{FC8D}", - nfd: "\u{FC8D}", - nfkc: "\u{0646}\u{0646}", - nfkd: "\u{0646}\u{0646}", - }, - NormalizationTest { - source: "\u{FC8E}", - nfc: "\u{FC8E}", - nfd: "\u{FC8E}", - nfkc: "\u{0646}\u{0649}", - nfkd: "\u{0646}\u{0649}", - }, - NormalizationTest { - source: "\u{FC8F}", - nfc: "\u{FC8F}", - nfd: "\u{FC8F}", - nfkc: "\u{0646}\u{064A}", - nfkd: "\u{0646}\u{064A}", - }, - NormalizationTest { - source: "\u{FC90}", - nfc: "\u{FC90}", - nfd: "\u{FC90}", - nfkc: "\u{0649}\u{0670}", - nfkd: "\u{0649}\u{0670}", - }, - NormalizationTest { - source: "\u{FC91}", - nfc: "\u{FC91}", - nfd: "\u{FC91}", - nfkc: "\u{064A}\u{0631}", - nfkd: "\u{064A}\u{0631}", - }, - NormalizationTest { - source: "\u{FC92}", - nfc: "\u{FC92}", - nfd: "\u{FC92}", - nfkc: "\u{064A}\u{0632}", - nfkd: "\u{064A}\u{0632}", - }, - NormalizationTest { - source: "\u{FC93}", - nfc: "\u{FC93}", - nfd: "\u{FC93}", - nfkc: "\u{064A}\u{0645}", - nfkd: "\u{064A}\u{0645}", - }, - NormalizationTest { - source: "\u{FC94}", - nfc: "\u{FC94}", - nfd: "\u{FC94}", - nfkc: "\u{064A}\u{0646}", - nfkd: "\u{064A}\u{0646}", - }, - NormalizationTest { - source: "\u{FC95}", - nfc: "\u{FC95}", - nfd: "\u{FC95}", - nfkc: "\u{064A}\u{0649}", - nfkd: "\u{064A}\u{0649}", - }, - NormalizationTest { - source: "\u{FC96}", - nfc: "\u{FC96}", - nfd: "\u{FC96}", - nfkc: "\u{064A}\u{064A}", - nfkd: "\u{064A}\u{064A}", - }, - NormalizationTest { - source: "\u{FC97}", - nfc: "\u{FC97}", - nfd: "\u{FC97}", - nfkc: "\u{0626}\u{062C}", - nfkd: "\u{064A}\u{0654}\u{062C}", - }, - NormalizationTest { - source: "\u{FC98}", - nfc: "\u{FC98}", - nfd: "\u{FC98}", - nfkc: "\u{0626}\u{062D}", - nfkd: "\u{064A}\u{0654}\u{062D}", - }, - NormalizationTest { - source: "\u{FC99}", - nfc: "\u{FC99}", - nfd: "\u{FC99}", - nfkc: "\u{0626}\u{062E}", - nfkd: "\u{064A}\u{0654}\u{062E}", - }, - NormalizationTest { - source: "\u{FC9A}", - nfc: "\u{FC9A}", - nfd: "\u{FC9A}", - nfkc: "\u{0626}\u{0645}", - nfkd: "\u{064A}\u{0654}\u{0645}", - }, - NormalizationTest { - source: "\u{FC9B}", - nfc: "\u{FC9B}", - nfd: "\u{FC9B}", - nfkc: "\u{0626}\u{0647}", - nfkd: "\u{064A}\u{0654}\u{0647}", - }, - NormalizationTest { - source: "\u{FC9C}", - nfc: "\u{FC9C}", - nfd: "\u{FC9C}", - nfkc: "\u{0628}\u{062C}", - nfkd: "\u{0628}\u{062C}", - }, - NormalizationTest { - source: "\u{FC9D}", - nfc: "\u{FC9D}", - nfd: "\u{FC9D}", - nfkc: "\u{0628}\u{062D}", - nfkd: "\u{0628}\u{062D}", - }, - NormalizationTest { - source: "\u{FC9E}", - nfc: "\u{FC9E}", - nfd: "\u{FC9E}", - nfkc: "\u{0628}\u{062E}", - nfkd: "\u{0628}\u{062E}", - }, - NormalizationTest { - source: "\u{FC9F}", - nfc: "\u{FC9F}", - nfd: "\u{FC9F}", - nfkc: "\u{0628}\u{0645}", - nfkd: "\u{0628}\u{0645}", - }, - NormalizationTest { - source: "\u{FCA0}", - nfc: "\u{FCA0}", - nfd: "\u{FCA0}", - nfkc: "\u{0628}\u{0647}", - nfkd: "\u{0628}\u{0647}", - }, - NormalizationTest { - source: "\u{FCA1}", - nfc: "\u{FCA1}", - nfd: "\u{FCA1}", - nfkc: "\u{062A}\u{062C}", - nfkd: "\u{062A}\u{062C}", - }, - NormalizationTest { - source: "\u{FCA2}", - nfc: "\u{FCA2}", - nfd: "\u{FCA2}", - nfkc: "\u{062A}\u{062D}", - nfkd: "\u{062A}\u{062D}", - }, - NormalizationTest { - source: "\u{FCA3}", - nfc: "\u{FCA3}", - nfd: "\u{FCA3}", - nfkc: "\u{062A}\u{062E}", - nfkd: "\u{062A}\u{062E}", - }, - NormalizationTest { - source: "\u{FCA4}", - nfc: "\u{FCA4}", - nfd: "\u{FCA4}", - nfkc: "\u{062A}\u{0645}", - nfkd: "\u{062A}\u{0645}", - }, - NormalizationTest { - source: "\u{FCA5}", - nfc: "\u{FCA5}", - nfd: "\u{FCA5}", - nfkc: "\u{062A}\u{0647}", - nfkd: "\u{062A}\u{0647}", - }, - NormalizationTest { - source: "\u{FCA6}", - nfc: "\u{FCA6}", - nfd: "\u{FCA6}", - nfkc: "\u{062B}\u{0645}", - nfkd: "\u{062B}\u{0645}", - }, - NormalizationTest { - source: "\u{FCA7}", - nfc: "\u{FCA7}", - nfd: "\u{FCA7}", - nfkc: "\u{062C}\u{062D}", - nfkd: "\u{062C}\u{062D}", - }, - NormalizationTest { - source: "\u{FCA8}", - nfc: "\u{FCA8}", - nfd: "\u{FCA8}", - nfkc: "\u{062C}\u{0645}", - nfkd: "\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FCA9}", - nfc: "\u{FCA9}", - nfd: "\u{FCA9}", - nfkc: "\u{062D}\u{062C}", - nfkd: "\u{062D}\u{062C}", - }, - NormalizationTest { - source: "\u{FCAA}", - nfc: "\u{FCAA}", - nfd: "\u{FCAA}", - nfkc: "\u{062D}\u{0645}", - nfkd: "\u{062D}\u{0645}", - }, - NormalizationTest { - source: "\u{FCAB}", - nfc: "\u{FCAB}", - nfd: "\u{FCAB}", - nfkc: "\u{062E}\u{062C}", - nfkd: "\u{062E}\u{062C}", - }, - NormalizationTest { - source: "\u{FCAC}", - nfc: "\u{FCAC}", - nfd: "\u{FCAC}", - nfkc: "\u{062E}\u{0645}", - nfkd: "\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FCAD}", - nfc: "\u{FCAD}", - nfd: "\u{FCAD}", - nfkc: "\u{0633}\u{062C}", - nfkd: "\u{0633}\u{062C}", - }, - NormalizationTest { - source: "\u{FCAE}", - nfc: "\u{FCAE}", - nfd: "\u{FCAE}", - nfkc: "\u{0633}\u{062D}", - nfkd: "\u{0633}\u{062D}", - }, - NormalizationTest { - source: "\u{FCAF}", - nfc: "\u{FCAF}", - nfd: "\u{FCAF}", - nfkc: "\u{0633}\u{062E}", - nfkd: "\u{0633}\u{062E}", - }, - NormalizationTest { - source: "\u{FCB0}", - nfc: "\u{FCB0}", - nfd: "\u{FCB0}", - nfkc: "\u{0633}\u{0645}", - nfkd: "\u{0633}\u{0645}", - }, - NormalizationTest { - source: "\u{FCB1}", - nfc: "\u{FCB1}", - nfd: "\u{FCB1}", - nfkc: "\u{0635}\u{062D}", - nfkd: "\u{0635}\u{062D}", - }, - NormalizationTest { - source: "\u{FCB2}", - nfc: "\u{FCB2}", - nfd: "\u{FCB2}", - nfkc: "\u{0635}\u{062E}", - nfkd: "\u{0635}\u{062E}", - }, - NormalizationTest { - source: "\u{FCB3}", - nfc: "\u{FCB3}", - nfd: "\u{FCB3}", - nfkc: "\u{0635}\u{0645}", - nfkd: "\u{0635}\u{0645}", - }, - NormalizationTest { - source: "\u{FCB4}", - nfc: "\u{FCB4}", - nfd: "\u{FCB4}", - nfkc: "\u{0636}\u{062C}", - nfkd: "\u{0636}\u{062C}", - }, - NormalizationTest { - source: "\u{FCB5}", - nfc: "\u{FCB5}", - nfd: "\u{FCB5}", - nfkc: "\u{0636}\u{062D}", - nfkd: "\u{0636}\u{062D}", - }, - NormalizationTest { - source: "\u{FCB6}", - nfc: "\u{FCB6}", - nfd: "\u{FCB6}", - nfkc: "\u{0636}\u{062E}", - nfkd: "\u{0636}\u{062E}", - }, - NormalizationTest { - source: "\u{FCB7}", - nfc: "\u{FCB7}", - nfd: "\u{FCB7}", - nfkc: "\u{0636}\u{0645}", - nfkd: "\u{0636}\u{0645}", - }, - NormalizationTest { - source: "\u{FCB8}", - nfc: "\u{FCB8}", - nfd: "\u{FCB8}", - nfkc: "\u{0637}\u{062D}", - nfkd: "\u{0637}\u{062D}", - }, - NormalizationTest { - source: "\u{FCB9}", - nfc: "\u{FCB9}", - nfd: "\u{FCB9}", - nfkc: "\u{0638}\u{0645}", - nfkd: "\u{0638}\u{0645}", - }, - NormalizationTest { - source: "\u{FCBA}", - nfc: "\u{FCBA}", - nfd: "\u{FCBA}", - nfkc: "\u{0639}\u{062C}", - nfkd: "\u{0639}\u{062C}", - }, - NormalizationTest { - source: "\u{FCBB}", - nfc: "\u{FCBB}", - nfd: "\u{FCBB}", - nfkc: "\u{0639}\u{0645}", - nfkd: "\u{0639}\u{0645}", - }, - NormalizationTest { - source: "\u{FCBC}", - nfc: "\u{FCBC}", - nfd: "\u{FCBC}", - nfkc: "\u{063A}\u{062C}", - nfkd: "\u{063A}\u{062C}", - }, - NormalizationTest { - source: "\u{FCBD}", - nfc: "\u{FCBD}", - nfd: "\u{FCBD}", - nfkc: "\u{063A}\u{0645}", - nfkd: "\u{063A}\u{0645}", - }, - NormalizationTest { - source: "\u{FCBE}", - nfc: "\u{FCBE}", - nfd: "\u{FCBE}", - nfkc: "\u{0641}\u{062C}", - nfkd: "\u{0641}\u{062C}", - }, - NormalizationTest { - source: "\u{FCBF}", - nfc: "\u{FCBF}", - nfd: "\u{FCBF}", - nfkc: "\u{0641}\u{062D}", - nfkd: "\u{0641}\u{062D}", - }, - NormalizationTest { - source: "\u{FCC0}", - nfc: "\u{FCC0}", - nfd: "\u{FCC0}", - nfkc: "\u{0641}\u{062E}", - nfkd: "\u{0641}\u{062E}", - }, - NormalizationTest { - source: "\u{FCC1}", - nfc: "\u{FCC1}", - nfd: "\u{FCC1}", - nfkc: "\u{0641}\u{0645}", - nfkd: "\u{0641}\u{0645}", - }, - NormalizationTest { - source: "\u{FCC2}", - nfc: "\u{FCC2}", - nfd: "\u{FCC2}", - nfkc: "\u{0642}\u{062D}", - nfkd: "\u{0642}\u{062D}", - }, - NormalizationTest { - source: "\u{FCC3}", - nfc: "\u{FCC3}", - nfd: "\u{FCC3}", - nfkc: "\u{0642}\u{0645}", - nfkd: "\u{0642}\u{0645}", - }, - NormalizationTest { - source: "\u{FCC4}", - nfc: "\u{FCC4}", - nfd: "\u{FCC4}", - nfkc: "\u{0643}\u{062C}", - nfkd: "\u{0643}\u{062C}", - }, - NormalizationTest { - source: "\u{FCC5}", - nfc: "\u{FCC5}", - nfd: "\u{FCC5}", - nfkc: "\u{0643}\u{062D}", - nfkd: "\u{0643}\u{062D}", - }, - NormalizationTest { - source: "\u{FCC6}", - nfc: "\u{FCC6}", - nfd: "\u{FCC6}", - nfkc: "\u{0643}\u{062E}", - nfkd: "\u{0643}\u{062E}", - }, - NormalizationTest { - source: "\u{FCC7}", - nfc: "\u{FCC7}", - nfd: "\u{FCC7}", - nfkc: "\u{0643}\u{0644}", - nfkd: "\u{0643}\u{0644}", - }, - NormalizationTest { - source: "\u{FCC8}", - nfc: "\u{FCC8}", - nfd: "\u{FCC8}", - nfkc: "\u{0643}\u{0645}", - nfkd: "\u{0643}\u{0645}", - }, - NormalizationTest { - source: "\u{FCC9}", - nfc: "\u{FCC9}", - nfd: "\u{FCC9}", - nfkc: "\u{0644}\u{062C}", - nfkd: "\u{0644}\u{062C}", - }, - NormalizationTest { - source: "\u{FCCA}", - nfc: "\u{FCCA}", - nfd: "\u{FCCA}", - nfkc: "\u{0644}\u{062D}", - nfkd: "\u{0644}\u{062D}", - }, - NormalizationTest { - source: "\u{FCCB}", - nfc: "\u{FCCB}", - nfd: "\u{FCCB}", - nfkc: "\u{0644}\u{062E}", - nfkd: "\u{0644}\u{062E}", - }, - NormalizationTest { - source: "\u{FCCC}", - nfc: "\u{FCCC}", - nfd: "\u{FCCC}", - nfkc: "\u{0644}\u{0645}", - nfkd: "\u{0644}\u{0645}", - }, - NormalizationTest { - source: "\u{FCCD}", - nfc: "\u{FCCD}", - nfd: "\u{FCCD}", - nfkc: "\u{0644}\u{0647}", - nfkd: "\u{0644}\u{0647}", - }, - NormalizationTest { - source: "\u{FCCE}", - nfc: "\u{FCCE}", - nfd: "\u{FCCE}", - nfkc: "\u{0645}\u{062C}", - nfkd: "\u{0645}\u{062C}", - }, - NormalizationTest { - source: "\u{FCCF}", - nfc: "\u{FCCF}", - nfd: "\u{FCCF}", - nfkc: "\u{0645}\u{062D}", - nfkd: "\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FCD0}", - nfc: "\u{FCD0}", - nfd: "\u{FCD0}", - nfkc: "\u{0645}\u{062E}", - nfkd: "\u{0645}\u{062E}", - }, - NormalizationTest { - source: "\u{FCD1}", - nfc: "\u{FCD1}", - nfd: "\u{FCD1}", - nfkc: "\u{0645}\u{0645}", - nfkd: "\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FCD2}", - nfc: "\u{FCD2}", - nfd: "\u{FCD2}", - nfkc: "\u{0646}\u{062C}", - nfkd: "\u{0646}\u{062C}", - }, - NormalizationTest { - source: "\u{FCD3}", - nfc: "\u{FCD3}", - nfd: "\u{FCD3}", - nfkc: "\u{0646}\u{062D}", - nfkd: "\u{0646}\u{062D}", - }, - NormalizationTest { - source: "\u{FCD4}", - nfc: "\u{FCD4}", - nfd: "\u{FCD4}", - nfkc: "\u{0646}\u{062E}", - nfkd: "\u{0646}\u{062E}", - }, - NormalizationTest { - source: "\u{FCD5}", - nfc: "\u{FCD5}", - nfd: "\u{FCD5}", - nfkc: "\u{0646}\u{0645}", - nfkd: "\u{0646}\u{0645}", - }, - NormalizationTest { - source: "\u{FCD6}", - nfc: "\u{FCD6}", - nfd: "\u{FCD6}", - nfkc: "\u{0646}\u{0647}", - nfkd: "\u{0646}\u{0647}", - }, - NormalizationTest { - source: "\u{FCD7}", - nfc: "\u{FCD7}", - nfd: "\u{FCD7}", - nfkc: "\u{0647}\u{062C}", - nfkd: "\u{0647}\u{062C}", - }, - NormalizationTest { - source: "\u{FCD8}", - nfc: "\u{FCD8}", - nfd: "\u{FCD8}", - nfkc: "\u{0647}\u{0645}", - nfkd: "\u{0647}\u{0645}", - }, - NormalizationTest { - source: "\u{FCD9}", - nfc: "\u{FCD9}", - nfd: "\u{FCD9}", - nfkc: "\u{0647}\u{0670}", - nfkd: "\u{0647}\u{0670}", - }, - NormalizationTest { - source: "\u{FCDA}", - nfc: "\u{FCDA}", - nfd: "\u{FCDA}", - nfkc: "\u{064A}\u{062C}", - nfkd: "\u{064A}\u{062C}", - }, - NormalizationTest { - source: "\u{FCDB}", - nfc: "\u{FCDB}", - nfd: "\u{FCDB}", - nfkc: "\u{064A}\u{062D}", - nfkd: "\u{064A}\u{062D}", - }, - NormalizationTest { - source: "\u{FCDC}", - nfc: "\u{FCDC}", - nfd: "\u{FCDC}", - nfkc: "\u{064A}\u{062E}", - nfkd: "\u{064A}\u{062E}", - }, - NormalizationTest { - source: "\u{FCDD}", - nfc: "\u{FCDD}", - nfd: "\u{FCDD}", - nfkc: "\u{064A}\u{0645}", - nfkd: "\u{064A}\u{0645}", - }, - NormalizationTest { - source: "\u{FCDE}", - nfc: "\u{FCDE}", - nfd: "\u{FCDE}", - nfkc: "\u{064A}\u{0647}", - nfkd: "\u{064A}\u{0647}", - }, - NormalizationTest { - source: "\u{FCDF}", - nfc: "\u{FCDF}", - nfd: "\u{FCDF}", - nfkc: "\u{0626}\u{0645}", - nfkd: "\u{064A}\u{0654}\u{0645}", - }, - NormalizationTest { - source: "\u{FCE0}", - nfc: "\u{FCE0}", - nfd: "\u{FCE0}", - nfkc: "\u{0626}\u{0647}", - nfkd: "\u{064A}\u{0654}\u{0647}", - }, - NormalizationTest { - source: "\u{FCE1}", - nfc: "\u{FCE1}", - nfd: "\u{FCE1}", - nfkc: "\u{0628}\u{0645}", - nfkd: "\u{0628}\u{0645}", - }, - NormalizationTest { - source: "\u{FCE2}", - nfc: "\u{FCE2}", - nfd: "\u{FCE2}", - nfkc: "\u{0628}\u{0647}", - nfkd: "\u{0628}\u{0647}", - }, - NormalizationTest { - source: "\u{FCE3}", - nfc: "\u{FCE3}", - nfd: "\u{FCE3}", - nfkc: "\u{062A}\u{0645}", - nfkd: "\u{062A}\u{0645}", - }, - NormalizationTest { - source: "\u{FCE4}", - nfc: "\u{FCE4}", - nfd: "\u{FCE4}", - nfkc: "\u{062A}\u{0647}", - nfkd: "\u{062A}\u{0647}", - }, - NormalizationTest { - source: "\u{FCE5}", - nfc: "\u{FCE5}", - nfd: "\u{FCE5}", - nfkc: "\u{062B}\u{0645}", - nfkd: "\u{062B}\u{0645}", - }, - NormalizationTest { - source: "\u{FCE6}", - nfc: "\u{FCE6}", - nfd: "\u{FCE6}", - nfkc: "\u{062B}\u{0647}", - nfkd: "\u{062B}\u{0647}", - }, - NormalizationTest { - source: "\u{FCE7}", - nfc: "\u{FCE7}", - nfd: "\u{FCE7}", - nfkc: "\u{0633}\u{0645}", - nfkd: "\u{0633}\u{0645}", - }, - NormalizationTest { - source: "\u{FCE8}", - nfc: "\u{FCE8}", - nfd: "\u{FCE8}", - nfkc: "\u{0633}\u{0647}", - nfkd: "\u{0633}\u{0647}", - }, - NormalizationTest { - source: "\u{FCE9}", - nfc: "\u{FCE9}", - nfd: "\u{FCE9}", - nfkc: "\u{0634}\u{0645}", - nfkd: "\u{0634}\u{0645}", - }, - NormalizationTest { - source: "\u{FCEA}", - nfc: "\u{FCEA}", - nfd: "\u{FCEA}", - nfkc: "\u{0634}\u{0647}", - nfkd: "\u{0634}\u{0647}", - }, - NormalizationTest { - source: "\u{FCEB}", - nfc: "\u{FCEB}", - nfd: "\u{FCEB}", - nfkc: "\u{0643}\u{0644}", - nfkd: "\u{0643}\u{0644}", - }, - NormalizationTest { - source: "\u{FCEC}", - nfc: "\u{FCEC}", - nfd: "\u{FCEC}", - nfkc: "\u{0643}\u{0645}", - nfkd: "\u{0643}\u{0645}", - }, - NormalizationTest { - source: "\u{FCED}", - nfc: "\u{FCED}", - nfd: "\u{FCED}", - nfkc: "\u{0644}\u{0645}", - nfkd: "\u{0644}\u{0645}", - }, - NormalizationTest { - source: "\u{FCEE}", - nfc: "\u{FCEE}", - nfd: "\u{FCEE}", - nfkc: "\u{0646}\u{0645}", - nfkd: "\u{0646}\u{0645}", - }, - NormalizationTest { - source: "\u{FCEF}", - nfc: "\u{FCEF}", - nfd: "\u{FCEF}", - nfkc: "\u{0646}\u{0647}", - nfkd: "\u{0646}\u{0647}", - }, - NormalizationTest { - source: "\u{FCF0}", - nfc: "\u{FCF0}", - nfd: "\u{FCF0}", - nfkc: "\u{064A}\u{0645}", - nfkd: "\u{064A}\u{0645}", - }, - NormalizationTest { - source: "\u{FCF1}", - nfc: "\u{FCF1}", - nfd: "\u{FCF1}", - nfkc: "\u{064A}\u{0647}", - nfkd: "\u{064A}\u{0647}", - }, - NormalizationTest { - source: "\u{FCF2}", - nfc: "\u{FCF2}", - nfd: "\u{FCF2}", - nfkc: "\u{0640}\u{064E}\u{0651}", - nfkd: "\u{0640}\u{064E}\u{0651}", - }, - NormalizationTest { - source: "\u{FCF3}", - nfc: "\u{FCF3}", - nfd: "\u{FCF3}", - nfkc: "\u{0640}\u{064F}\u{0651}", - nfkd: "\u{0640}\u{064F}\u{0651}", - }, - NormalizationTest { - source: "\u{FCF4}", - nfc: "\u{FCF4}", - nfd: "\u{FCF4}", - nfkc: "\u{0640}\u{0650}\u{0651}", - nfkd: "\u{0640}\u{0650}\u{0651}", - }, - NormalizationTest { - source: "\u{FCF5}", - nfc: "\u{FCF5}", - nfd: "\u{FCF5}", - nfkc: "\u{0637}\u{0649}", - nfkd: "\u{0637}\u{0649}", - }, - NormalizationTest { - source: "\u{FCF6}", - nfc: "\u{FCF6}", - nfd: "\u{FCF6}", - nfkc: "\u{0637}\u{064A}", - nfkd: "\u{0637}\u{064A}", - }, - NormalizationTest { - source: "\u{FCF7}", - nfc: "\u{FCF7}", - nfd: "\u{FCF7}", - nfkc: "\u{0639}\u{0649}", - nfkd: "\u{0639}\u{0649}", - }, - NormalizationTest { - source: "\u{FCF8}", - nfc: "\u{FCF8}", - nfd: "\u{FCF8}", - nfkc: "\u{0639}\u{064A}", - nfkd: "\u{0639}\u{064A}", - }, - NormalizationTest { - source: "\u{FCF9}", - nfc: "\u{FCF9}", - nfd: "\u{FCF9}", - nfkc: "\u{063A}\u{0649}", - nfkd: "\u{063A}\u{0649}", - }, - NormalizationTest { - source: "\u{FCFA}", - nfc: "\u{FCFA}", - nfd: "\u{FCFA}", - nfkc: "\u{063A}\u{064A}", - nfkd: "\u{063A}\u{064A}", - }, - NormalizationTest { - source: "\u{FCFB}", - nfc: "\u{FCFB}", - nfd: "\u{FCFB}", - nfkc: "\u{0633}\u{0649}", - nfkd: "\u{0633}\u{0649}", - }, - NormalizationTest { - source: "\u{FCFC}", - nfc: "\u{FCFC}", - nfd: "\u{FCFC}", - nfkc: "\u{0633}\u{064A}", - nfkd: "\u{0633}\u{064A}", - }, - NormalizationTest { - source: "\u{FCFD}", - nfc: "\u{FCFD}", - nfd: "\u{FCFD}", - nfkc: "\u{0634}\u{0649}", - nfkd: "\u{0634}\u{0649}", - }, - NormalizationTest { - source: "\u{FCFE}", - nfc: "\u{FCFE}", - nfd: "\u{FCFE}", - nfkc: "\u{0634}\u{064A}", - nfkd: "\u{0634}\u{064A}", - }, - NormalizationTest { - source: "\u{FCFF}", - nfc: "\u{FCFF}", - nfd: "\u{FCFF}", - nfkc: "\u{062D}\u{0649}", - nfkd: "\u{062D}\u{0649}", - }, - NormalizationTest { - source: "\u{FD00}", - nfc: "\u{FD00}", - nfd: "\u{FD00}", - nfkc: "\u{062D}\u{064A}", - nfkd: "\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FD01}", - nfc: "\u{FD01}", - nfd: "\u{FD01}", - nfkc: "\u{062C}\u{0649}", - nfkd: "\u{062C}\u{0649}", - }, - NormalizationTest { - source: "\u{FD02}", - nfc: "\u{FD02}", - nfd: "\u{FD02}", - nfkc: "\u{062C}\u{064A}", - nfkd: "\u{062C}\u{064A}", - }, - NormalizationTest { - source: "\u{FD03}", - nfc: "\u{FD03}", - nfd: "\u{FD03}", - nfkc: "\u{062E}\u{0649}", - nfkd: "\u{062E}\u{0649}", - }, - NormalizationTest { - source: "\u{FD04}", - nfc: "\u{FD04}", - nfd: "\u{FD04}", - nfkc: "\u{062E}\u{064A}", - nfkd: "\u{062E}\u{064A}", - }, - NormalizationTest { - source: "\u{FD05}", - nfc: "\u{FD05}", - nfd: "\u{FD05}", - nfkc: "\u{0635}\u{0649}", - nfkd: "\u{0635}\u{0649}", - }, - NormalizationTest { - source: "\u{FD06}", - nfc: "\u{FD06}", - nfd: "\u{FD06}", - nfkc: "\u{0635}\u{064A}", - nfkd: "\u{0635}\u{064A}", - }, - NormalizationTest { - source: "\u{FD07}", - nfc: "\u{FD07}", - nfd: "\u{FD07}", - nfkc: "\u{0636}\u{0649}", - nfkd: "\u{0636}\u{0649}", - }, - NormalizationTest { - source: "\u{FD08}", - nfc: "\u{FD08}", - nfd: "\u{FD08}", - nfkc: "\u{0636}\u{064A}", - nfkd: "\u{0636}\u{064A}", - }, - NormalizationTest { - source: "\u{FD09}", - nfc: "\u{FD09}", - nfd: "\u{FD09}", - nfkc: "\u{0634}\u{062C}", - nfkd: "\u{0634}\u{062C}", - }, - NormalizationTest { - source: "\u{FD0A}", - nfc: "\u{FD0A}", - nfd: "\u{FD0A}", - nfkc: "\u{0634}\u{062D}", - nfkd: "\u{0634}\u{062D}", - }, - NormalizationTest { - source: "\u{FD0B}", - nfc: "\u{FD0B}", - nfd: "\u{FD0B}", - nfkc: "\u{0634}\u{062E}", - nfkd: "\u{0634}\u{062E}", - }, - NormalizationTest { - source: "\u{FD0C}", - nfc: "\u{FD0C}", - nfd: "\u{FD0C}", - nfkc: "\u{0634}\u{0645}", - nfkd: "\u{0634}\u{0645}", - }, - NormalizationTest { - source: "\u{FD0D}", - nfc: "\u{FD0D}", - nfd: "\u{FD0D}", - nfkc: "\u{0634}\u{0631}", - nfkd: "\u{0634}\u{0631}", - }, - NormalizationTest { - source: "\u{FD0E}", - nfc: "\u{FD0E}", - nfd: "\u{FD0E}", - nfkc: "\u{0633}\u{0631}", - nfkd: "\u{0633}\u{0631}", - }, - NormalizationTest { - source: "\u{FD0F}", - nfc: "\u{FD0F}", - nfd: "\u{FD0F}", - nfkc: "\u{0635}\u{0631}", - nfkd: "\u{0635}\u{0631}", - }, - NormalizationTest { - source: "\u{FD10}", - nfc: "\u{FD10}", - nfd: "\u{FD10}", - nfkc: "\u{0636}\u{0631}", - nfkd: "\u{0636}\u{0631}", - }, - NormalizationTest { - source: "\u{FD11}", - nfc: "\u{FD11}", - nfd: "\u{FD11}", - nfkc: "\u{0637}\u{0649}", - nfkd: "\u{0637}\u{0649}", - }, - NormalizationTest { - source: "\u{FD12}", - nfc: "\u{FD12}", - nfd: "\u{FD12}", - nfkc: "\u{0637}\u{064A}", - nfkd: "\u{0637}\u{064A}", - }, - NormalizationTest { - source: "\u{FD13}", - nfc: "\u{FD13}", - nfd: "\u{FD13}", - nfkc: "\u{0639}\u{0649}", - nfkd: "\u{0639}\u{0649}", - }, - NormalizationTest { - source: "\u{FD14}", - nfc: "\u{FD14}", - nfd: "\u{FD14}", - nfkc: "\u{0639}\u{064A}", - nfkd: "\u{0639}\u{064A}", - }, - NormalizationTest { - source: "\u{FD15}", - nfc: "\u{FD15}", - nfd: "\u{FD15}", - nfkc: "\u{063A}\u{0649}", - nfkd: "\u{063A}\u{0649}", - }, - NormalizationTest { - source: "\u{FD16}", - nfc: "\u{FD16}", - nfd: "\u{FD16}", - nfkc: "\u{063A}\u{064A}", - nfkd: "\u{063A}\u{064A}", - }, - NormalizationTest { - source: "\u{FD17}", - nfc: "\u{FD17}", - nfd: "\u{FD17}", - nfkc: "\u{0633}\u{0649}", - nfkd: "\u{0633}\u{0649}", - }, - NormalizationTest { - source: "\u{FD18}", - nfc: "\u{FD18}", - nfd: "\u{FD18}", - nfkc: "\u{0633}\u{064A}", - nfkd: "\u{0633}\u{064A}", - }, - NormalizationTest { - source: "\u{FD19}", - nfc: "\u{FD19}", - nfd: "\u{FD19}", - nfkc: "\u{0634}\u{0649}", - nfkd: "\u{0634}\u{0649}", - }, - NormalizationTest { - source: "\u{FD1A}", - nfc: "\u{FD1A}", - nfd: "\u{FD1A}", - nfkc: "\u{0634}\u{064A}", - nfkd: "\u{0634}\u{064A}", - }, - NormalizationTest { - source: "\u{FD1B}", - nfc: "\u{FD1B}", - nfd: "\u{FD1B}", - nfkc: "\u{062D}\u{0649}", - nfkd: "\u{062D}\u{0649}", - }, - NormalizationTest { - source: "\u{FD1C}", - nfc: "\u{FD1C}", - nfd: "\u{FD1C}", - nfkc: "\u{062D}\u{064A}", - nfkd: "\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FD1D}", - nfc: "\u{FD1D}", - nfd: "\u{FD1D}", - nfkc: "\u{062C}\u{0649}", - nfkd: "\u{062C}\u{0649}", - }, - NormalizationTest { - source: "\u{FD1E}", - nfc: "\u{FD1E}", - nfd: "\u{FD1E}", - nfkc: "\u{062C}\u{064A}", - nfkd: "\u{062C}\u{064A}", - }, - NormalizationTest { - source: "\u{FD1F}", - nfc: "\u{FD1F}", - nfd: "\u{FD1F}", - nfkc: "\u{062E}\u{0649}", - nfkd: "\u{062E}\u{0649}", - }, - NormalizationTest { - source: "\u{FD20}", - nfc: "\u{FD20}", - nfd: "\u{FD20}", - nfkc: "\u{062E}\u{064A}", - nfkd: "\u{062E}\u{064A}", - }, - NormalizationTest { - source: "\u{FD21}", - nfc: "\u{FD21}", - nfd: "\u{FD21}", - nfkc: "\u{0635}\u{0649}", - nfkd: "\u{0635}\u{0649}", - }, - NormalizationTest { - source: "\u{FD22}", - nfc: "\u{FD22}", - nfd: "\u{FD22}", - nfkc: "\u{0635}\u{064A}", - nfkd: "\u{0635}\u{064A}", - }, - NormalizationTest { - source: "\u{FD23}", - nfc: "\u{FD23}", - nfd: "\u{FD23}", - nfkc: "\u{0636}\u{0649}", - nfkd: "\u{0636}\u{0649}", - }, - NormalizationTest { - source: "\u{FD24}", - nfc: "\u{FD24}", - nfd: "\u{FD24}", - nfkc: "\u{0636}\u{064A}", - nfkd: "\u{0636}\u{064A}", - }, - NormalizationTest { - source: "\u{FD25}", - nfc: "\u{FD25}", - nfd: "\u{FD25}", - nfkc: "\u{0634}\u{062C}", - nfkd: "\u{0634}\u{062C}", - }, - NormalizationTest { - source: "\u{FD26}", - nfc: "\u{FD26}", - nfd: "\u{FD26}", - nfkc: "\u{0634}\u{062D}", - nfkd: "\u{0634}\u{062D}", - }, - NormalizationTest { - source: "\u{FD27}", - nfc: "\u{FD27}", - nfd: "\u{FD27}", - nfkc: "\u{0634}\u{062E}", - nfkd: "\u{0634}\u{062E}", - }, - NormalizationTest { - source: "\u{FD28}", - nfc: "\u{FD28}", - nfd: "\u{FD28}", - nfkc: "\u{0634}\u{0645}", - nfkd: "\u{0634}\u{0645}", - }, - NormalizationTest { - source: "\u{FD29}", - nfc: "\u{FD29}", - nfd: "\u{FD29}", - nfkc: "\u{0634}\u{0631}", - nfkd: "\u{0634}\u{0631}", - }, - NormalizationTest { - source: "\u{FD2A}", - nfc: "\u{FD2A}", - nfd: "\u{FD2A}", - nfkc: "\u{0633}\u{0631}", - nfkd: "\u{0633}\u{0631}", - }, - NormalizationTest { - source: "\u{FD2B}", - nfc: "\u{FD2B}", - nfd: "\u{FD2B}", - nfkc: "\u{0635}\u{0631}", - nfkd: "\u{0635}\u{0631}", - }, - NormalizationTest { - source: "\u{FD2C}", - nfc: "\u{FD2C}", - nfd: "\u{FD2C}", - nfkc: "\u{0636}\u{0631}", - nfkd: "\u{0636}\u{0631}", - }, - NormalizationTest { - source: "\u{FD2D}", - nfc: "\u{FD2D}", - nfd: "\u{FD2D}", - nfkc: "\u{0634}\u{062C}", - nfkd: "\u{0634}\u{062C}", - }, - NormalizationTest { - source: "\u{FD2E}", - nfc: "\u{FD2E}", - nfd: "\u{FD2E}", - nfkc: "\u{0634}\u{062D}", - nfkd: "\u{0634}\u{062D}", - }, - NormalizationTest { - source: "\u{FD2F}", - nfc: "\u{FD2F}", - nfd: "\u{FD2F}", - nfkc: "\u{0634}\u{062E}", - nfkd: "\u{0634}\u{062E}", - }, - NormalizationTest { - source: "\u{FD30}", - nfc: "\u{FD30}", - nfd: "\u{FD30}", - nfkc: "\u{0634}\u{0645}", - nfkd: "\u{0634}\u{0645}", - }, - NormalizationTest { - source: "\u{FD31}", - nfc: "\u{FD31}", - nfd: "\u{FD31}", - nfkc: "\u{0633}\u{0647}", - nfkd: "\u{0633}\u{0647}", - }, - NormalizationTest { - source: "\u{FD32}", - nfc: "\u{FD32}", - nfd: "\u{FD32}", - nfkc: "\u{0634}\u{0647}", - nfkd: "\u{0634}\u{0647}", - }, - NormalizationTest { - source: "\u{FD33}", - nfc: "\u{FD33}", - nfd: "\u{FD33}", - nfkc: "\u{0637}\u{0645}", - nfkd: "\u{0637}\u{0645}", - }, - NormalizationTest { - source: "\u{FD34}", - nfc: "\u{FD34}", - nfd: "\u{FD34}", - nfkc: "\u{0633}\u{062C}", - nfkd: "\u{0633}\u{062C}", - }, - NormalizationTest { - source: "\u{FD35}", - nfc: "\u{FD35}", - nfd: "\u{FD35}", - nfkc: "\u{0633}\u{062D}", - nfkd: "\u{0633}\u{062D}", - }, - NormalizationTest { - source: "\u{FD36}", - nfc: "\u{FD36}", - nfd: "\u{FD36}", - nfkc: "\u{0633}\u{062E}", - nfkd: "\u{0633}\u{062E}", - }, - NormalizationTest { - source: "\u{FD37}", - nfc: "\u{FD37}", - nfd: "\u{FD37}", - nfkc: "\u{0634}\u{062C}", - nfkd: "\u{0634}\u{062C}", - }, - NormalizationTest { - source: "\u{FD38}", - nfc: "\u{FD38}", - nfd: "\u{FD38}", - nfkc: "\u{0634}\u{062D}", - nfkd: "\u{0634}\u{062D}", - }, - NormalizationTest { - source: "\u{FD39}", - nfc: "\u{FD39}", - nfd: "\u{FD39}", - nfkc: "\u{0634}\u{062E}", - nfkd: "\u{0634}\u{062E}", - }, - NormalizationTest { - source: "\u{FD3A}", - nfc: "\u{FD3A}", - nfd: "\u{FD3A}", - nfkc: "\u{0637}\u{0645}", - nfkd: "\u{0637}\u{0645}", - }, - NormalizationTest { - source: "\u{FD3B}", - nfc: "\u{FD3B}", - nfd: "\u{FD3B}", - nfkc: "\u{0638}\u{0645}", - nfkd: "\u{0638}\u{0645}", - }, - NormalizationTest { - source: "\u{FD3C}", - nfc: "\u{FD3C}", - nfd: "\u{FD3C}", - nfkc: "\u{0627}\u{064B}", - nfkd: "\u{0627}\u{064B}", - }, - NormalizationTest { - source: "\u{FD3D}", - nfc: "\u{FD3D}", - nfd: "\u{FD3D}", - nfkc: "\u{0627}\u{064B}", - nfkd: "\u{0627}\u{064B}", - }, - NormalizationTest { - source: "\u{FD50}", - nfc: "\u{FD50}", - nfd: "\u{FD50}", - nfkc: "\u{062A}\u{062C}\u{0645}", - nfkd: "\u{062A}\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FD51}", - nfc: "\u{FD51}", - nfd: "\u{FD51}", - nfkc: "\u{062A}\u{062D}\u{062C}", - nfkd: "\u{062A}\u{062D}\u{062C}", - }, - NormalizationTest { - source: "\u{FD52}", - nfc: "\u{FD52}", - nfd: "\u{FD52}", - nfkc: "\u{062A}\u{062D}\u{062C}", - nfkd: "\u{062A}\u{062D}\u{062C}", - }, - NormalizationTest { - source: "\u{FD53}", - nfc: "\u{FD53}", - nfd: "\u{FD53}", - nfkc: "\u{062A}\u{062D}\u{0645}", - nfkd: "\u{062A}\u{062D}\u{0645}", - }, - NormalizationTest { - source: "\u{FD54}", - nfc: "\u{FD54}", - nfd: "\u{FD54}", - nfkc: "\u{062A}\u{062E}\u{0645}", - nfkd: "\u{062A}\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FD55}", - nfc: "\u{FD55}", - nfd: "\u{FD55}", - nfkc: "\u{062A}\u{0645}\u{062C}", - nfkd: "\u{062A}\u{0645}\u{062C}", - }, - NormalizationTest { - source: "\u{FD56}", - nfc: "\u{FD56}", - nfd: "\u{FD56}", - nfkc: "\u{062A}\u{0645}\u{062D}", - nfkd: "\u{062A}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD57}", - nfc: "\u{FD57}", - nfd: "\u{FD57}", - nfkc: "\u{062A}\u{0645}\u{062E}", - nfkd: "\u{062A}\u{0645}\u{062E}", - }, - NormalizationTest { - source: "\u{FD58}", - nfc: "\u{FD58}", - nfd: "\u{FD58}", - nfkc: "\u{062C}\u{0645}\u{062D}", - nfkd: "\u{062C}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD59}", - nfc: "\u{FD59}", - nfd: "\u{FD59}", - nfkc: "\u{062C}\u{0645}\u{062D}", - nfkd: "\u{062C}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD5A}", - nfc: "\u{FD5A}", - nfd: "\u{FD5A}", - nfkc: "\u{062D}\u{0645}\u{064A}", - nfkd: "\u{062D}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FD5B}", - nfc: "\u{FD5B}", - nfd: "\u{FD5B}", - nfkc: "\u{062D}\u{0645}\u{0649}", - nfkd: "\u{062D}\u{0645}\u{0649}", - }, - NormalizationTest { - source: "\u{FD5C}", - nfc: "\u{FD5C}", - nfd: "\u{FD5C}", - nfkc: "\u{0633}\u{062D}\u{062C}", - nfkd: "\u{0633}\u{062D}\u{062C}", - }, - NormalizationTest { - source: "\u{FD5D}", - nfc: "\u{FD5D}", - nfd: "\u{FD5D}", - nfkc: "\u{0633}\u{062C}\u{062D}", - nfkd: "\u{0633}\u{062C}\u{062D}", - }, - NormalizationTest { - source: "\u{FD5E}", - nfc: "\u{FD5E}", - nfd: "\u{FD5E}", - nfkc: "\u{0633}\u{062C}\u{0649}", - nfkd: "\u{0633}\u{062C}\u{0649}", - }, - NormalizationTest { - source: "\u{FD5F}", - nfc: "\u{FD5F}", - nfd: "\u{FD5F}", - nfkc: "\u{0633}\u{0645}\u{062D}", - nfkd: "\u{0633}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD60}", - nfc: "\u{FD60}", - nfd: "\u{FD60}", - nfkc: "\u{0633}\u{0645}\u{062D}", - nfkd: "\u{0633}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD61}", - nfc: "\u{FD61}", - nfd: "\u{FD61}", - nfkc: "\u{0633}\u{0645}\u{062C}", - nfkd: "\u{0633}\u{0645}\u{062C}", - }, - NormalizationTest { - source: "\u{FD62}", - nfc: "\u{FD62}", - nfd: "\u{FD62}", - nfkc: "\u{0633}\u{0645}\u{0645}", - nfkd: "\u{0633}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD63}", - nfc: "\u{FD63}", - nfd: "\u{FD63}", - nfkc: "\u{0633}\u{0645}\u{0645}", - nfkd: "\u{0633}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD64}", - nfc: "\u{FD64}", - nfd: "\u{FD64}", - nfkc: "\u{0635}\u{062D}\u{062D}", - nfkd: "\u{0635}\u{062D}\u{062D}", - }, - NormalizationTest { - source: "\u{FD65}", - nfc: "\u{FD65}", - nfd: "\u{FD65}", - nfkc: "\u{0635}\u{062D}\u{062D}", - nfkd: "\u{0635}\u{062D}\u{062D}", - }, - NormalizationTest { - source: "\u{FD66}", - nfc: "\u{FD66}", - nfd: "\u{FD66}", - nfkc: "\u{0635}\u{0645}\u{0645}", - nfkd: "\u{0635}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD67}", - nfc: "\u{FD67}", - nfd: "\u{FD67}", - nfkc: "\u{0634}\u{062D}\u{0645}", - nfkd: "\u{0634}\u{062D}\u{0645}", - }, - NormalizationTest { - source: "\u{FD68}", - nfc: "\u{FD68}", - nfd: "\u{FD68}", - nfkc: "\u{0634}\u{062D}\u{0645}", - nfkd: "\u{0634}\u{062D}\u{0645}", - }, - NormalizationTest { - source: "\u{FD69}", - nfc: "\u{FD69}", - nfd: "\u{FD69}", - nfkc: "\u{0634}\u{062C}\u{064A}", - nfkd: "\u{0634}\u{062C}\u{064A}", - }, - NormalizationTest { - source: "\u{FD6A}", - nfc: "\u{FD6A}", - nfd: "\u{FD6A}", - nfkc: "\u{0634}\u{0645}\u{062E}", - nfkd: "\u{0634}\u{0645}\u{062E}", - }, - NormalizationTest { - source: "\u{FD6B}", - nfc: "\u{FD6B}", - nfd: "\u{FD6B}", - nfkc: "\u{0634}\u{0645}\u{062E}", - nfkd: "\u{0634}\u{0645}\u{062E}", - }, - NormalizationTest { - source: "\u{FD6C}", - nfc: "\u{FD6C}", - nfd: "\u{FD6C}", - nfkc: "\u{0634}\u{0645}\u{0645}", - nfkd: "\u{0634}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD6D}", - nfc: "\u{FD6D}", - nfd: "\u{FD6D}", - nfkc: "\u{0634}\u{0645}\u{0645}", - nfkd: "\u{0634}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD6E}", - nfc: "\u{FD6E}", - nfd: "\u{FD6E}", - nfkc: "\u{0636}\u{062D}\u{0649}", - nfkd: "\u{0636}\u{062D}\u{0649}", - }, - NormalizationTest { - source: "\u{FD6F}", - nfc: "\u{FD6F}", - nfd: "\u{FD6F}", - nfkc: "\u{0636}\u{062E}\u{0645}", - nfkd: "\u{0636}\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FD70}", - nfc: "\u{FD70}", - nfd: "\u{FD70}", - nfkc: "\u{0636}\u{062E}\u{0645}", - nfkd: "\u{0636}\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FD71}", - nfc: "\u{FD71}", - nfd: "\u{FD71}", - nfkc: "\u{0637}\u{0645}\u{062D}", - nfkd: "\u{0637}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD72}", - nfc: "\u{FD72}", - nfd: "\u{FD72}", - nfkc: "\u{0637}\u{0645}\u{062D}", - nfkd: "\u{0637}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD73}", - nfc: "\u{FD73}", - nfd: "\u{FD73}", - nfkc: "\u{0637}\u{0645}\u{0645}", - nfkd: "\u{0637}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD74}", - nfc: "\u{FD74}", - nfd: "\u{FD74}", - nfkc: "\u{0637}\u{0645}\u{064A}", - nfkd: "\u{0637}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FD75}", - nfc: "\u{FD75}", - nfd: "\u{FD75}", - nfkc: "\u{0639}\u{062C}\u{0645}", - nfkd: "\u{0639}\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FD76}", - nfc: "\u{FD76}", - nfd: "\u{FD76}", - nfkc: "\u{0639}\u{0645}\u{0645}", - nfkd: "\u{0639}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD77}", - nfc: "\u{FD77}", - nfd: "\u{FD77}", - nfkc: "\u{0639}\u{0645}\u{0645}", - nfkd: "\u{0639}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD78}", - nfc: "\u{FD78}", - nfd: "\u{FD78}", - nfkc: "\u{0639}\u{0645}\u{0649}", - nfkd: "\u{0639}\u{0645}\u{0649}", - }, - NormalizationTest { - source: "\u{FD79}", - nfc: "\u{FD79}", - nfd: "\u{FD79}", - nfkc: "\u{063A}\u{0645}\u{0645}", - nfkd: "\u{063A}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD7A}", - nfc: "\u{FD7A}", - nfd: "\u{FD7A}", - nfkc: "\u{063A}\u{0645}\u{064A}", - nfkd: "\u{063A}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FD7B}", - nfc: "\u{FD7B}", - nfd: "\u{FD7B}", - nfkc: "\u{063A}\u{0645}\u{0649}", - nfkd: "\u{063A}\u{0645}\u{0649}", - }, - NormalizationTest { - source: "\u{FD7C}", - nfc: "\u{FD7C}", - nfd: "\u{FD7C}", - nfkc: "\u{0641}\u{062E}\u{0645}", - nfkd: "\u{0641}\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FD7D}", - nfc: "\u{FD7D}", - nfd: "\u{FD7D}", - nfkc: "\u{0641}\u{062E}\u{0645}", - nfkd: "\u{0641}\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FD7E}", - nfc: "\u{FD7E}", - nfd: "\u{FD7E}", - nfkc: "\u{0642}\u{0645}\u{062D}", - nfkd: "\u{0642}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD7F}", - nfc: "\u{FD7F}", - nfd: "\u{FD7F}", - nfkc: "\u{0642}\u{0645}\u{0645}", - nfkd: "\u{0642}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD80}", - nfc: "\u{FD80}", - nfd: "\u{FD80}", - nfkc: "\u{0644}\u{062D}\u{0645}", - nfkd: "\u{0644}\u{062D}\u{0645}", - }, - NormalizationTest { - source: "\u{FD81}", - nfc: "\u{FD81}", - nfd: "\u{FD81}", - nfkc: "\u{0644}\u{062D}\u{064A}", - nfkd: "\u{0644}\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FD82}", - nfc: "\u{FD82}", - nfd: "\u{FD82}", - nfkc: "\u{0644}\u{062D}\u{0649}", - nfkd: "\u{0644}\u{062D}\u{0649}", - }, - NormalizationTest { - source: "\u{FD83}", - nfc: "\u{FD83}", - nfd: "\u{FD83}", - nfkc: "\u{0644}\u{062C}\u{062C}", - nfkd: "\u{0644}\u{062C}\u{062C}", - }, - NormalizationTest { - source: "\u{FD84}", - nfc: "\u{FD84}", - nfd: "\u{FD84}", - nfkc: "\u{0644}\u{062C}\u{062C}", - nfkd: "\u{0644}\u{062C}\u{062C}", - }, - NormalizationTest { - source: "\u{FD85}", - nfc: "\u{FD85}", - nfd: "\u{FD85}", - nfkc: "\u{0644}\u{062E}\u{0645}", - nfkd: "\u{0644}\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FD86}", - nfc: "\u{FD86}", - nfd: "\u{FD86}", - nfkc: "\u{0644}\u{062E}\u{0645}", - nfkd: "\u{0644}\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FD87}", - nfc: "\u{FD87}", - nfd: "\u{FD87}", - nfkc: "\u{0644}\u{0645}\u{062D}", - nfkd: "\u{0644}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD88}", - nfc: "\u{FD88}", - nfd: "\u{FD88}", - nfkc: "\u{0644}\u{0645}\u{062D}", - nfkd: "\u{0644}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FD89}", - nfc: "\u{FD89}", - nfd: "\u{FD89}", - nfkc: "\u{0645}\u{062D}\u{062C}", - nfkd: "\u{0645}\u{062D}\u{062C}", - }, - NormalizationTest { - source: "\u{FD8A}", - nfc: "\u{FD8A}", - nfd: "\u{FD8A}", - nfkc: "\u{0645}\u{062D}\u{0645}", - nfkd: "\u{0645}\u{062D}\u{0645}", - }, - NormalizationTest { - source: "\u{FD8B}", - nfc: "\u{FD8B}", - nfd: "\u{FD8B}", - nfkc: "\u{0645}\u{062D}\u{064A}", - nfkd: "\u{0645}\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FD8C}", - nfc: "\u{FD8C}", - nfd: "\u{FD8C}", - nfkc: "\u{0645}\u{062C}\u{062D}", - nfkd: "\u{0645}\u{062C}\u{062D}", - }, - NormalizationTest { - source: "\u{FD8D}", - nfc: "\u{FD8D}", - nfd: "\u{FD8D}", - nfkc: "\u{0645}\u{062C}\u{0645}", - nfkd: "\u{0645}\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FD8E}", - nfc: "\u{FD8E}", - nfd: "\u{FD8E}", - nfkc: "\u{0645}\u{062E}\u{062C}", - nfkd: "\u{0645}\u{062E}\u{062C}", - }, - NormalizationTest { - source: "\u{FD8F}", - nfc: "\u{FD8F}", - nfd: "\u{FD8F}", - nfkc: "\u{0645}\u{062E}\u{0645}", - nfkd: "\u{0645}\u{062E}\u{0645}", - }, - NormalizationTest { - source: "\u{FD92}", - nfc: "\u{FD92}", - nfd: "\u{FD92}", - nfkc: "\u{0645}\u{062C}\u{062E}", - nfkd: "\u{0645}\u{062C}\u{062E}", - }, - NormalizationTest { - source: "\u{FD93}", - nfc: "\u{FD93}", - nfd: "\u{FD93}", - nfkc: "\u{0647}\u{0645}\u{062C}", - nfkd: "\u{0647}\u{0645}\u{062C}", - }, - NormalizationTest { - source: "\u{FD94}", - nfc: "\u{FD94}", - nfd: "\u{FD94}", - nfkc: "\u{0647}\u{0645}\u{0645}", - nfkd: "\u{0647}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD95}", - nfc: "\u{FD95}", - nfd: "\u{FD95}", - nfkc: "\u{0646}\u{062D}\u{0645}", - nfkd: "\u{0646}\u{062D}\u{0645}", - }, - NormalizationTest { - source: "\u{FD96}", - nfc: "\u{FD96}", - nfd: "\u{FD96}", - nfkc: "\u{0646}\u{062D}\u{0649}", - nfkd: "\u{0646}\u{062D}\u{0649}", - }, - NormalizationTest { - source: "\u{FD97}", - nfc: "\u{FD97}", - nfd: "\u{FD97}", - nfkc: "\u{0646}\u{062C}\u{0645}", - nfkd: "\u{0646}\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FD98}", - nfc: "\u{FD98}", - nfd: "\u{FD98}", - nfkc: "\u{0646}\u{062C}\u{0645}", - nfkd: "\u{0646}\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FD99}", - nfc: "\u{FD99}", - nfd: "\u{FD99}", - nfkc: "\u{0646}\u{062C}\u{0649}", - nfkd: "\u{0646}\u{062C}\u{0649}", - }, - NormalizationTest { - source: "\u{FD9A}", - nfc: "\u{FD9A}", - nfd: "\u{FD9A}", - nfkc: "\u{0646}\u{0645}\u{064A}", - nfkd: "\u{0646}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FD9B}", - nfc: "\u{FD9B}", - nfd: "\u{FD9B}", - nfkc: "\u{0646}\u{0645}\u{0649}", - nfkd: "\u{0646}\u{0645}\u{0649}", - }, - NormalizationTest { - source: "\u{FD9C}", - nfc: "\u{FD9C}", - nfd: "\u{FD9C}", - nfkc: "\u{064A}\u{0645}\u{0645}", - nfkd: "\u{064A}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD9D}", - nfc: "\u{FD9D}", - nfd: "\u{FD9D}", - nfkc: "\u{064A}\u{0645}\u{0645}", - nfkd: "\u{064A}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FD9E}", - nfc: "\u{FD9E}", - nfd: "\u{FD9E}", - nfkc: "\u{0628}\u{062E}\u{064A}", - nfkd: "\u{0628}\u{062E}\u{064A}", - }, - NormalizationTest { - source: "\u{FD9F}", - nfc: "\u{FD9F}", - nfd: "\u{FD9F}", - nfkc: "\u{062A}\u{062C}\u{064A}", - nfkd: "\u{062A}\u{062C}\u{064A}", - }, - NormalizationTest { - source: "\u{FDA0}", - nfc: "\u{FDA0}", - nfd: "\u{FDA0}", - nfkc: "\u{062A}\u{062C}\u{0649}", - nfkd: "\u{062A}\u{062C}\u{0649}", - }, - NormalizationTest { - source: "\u{FDA1}", - nfc: "\u{FDA1}", - nfd: "\u{FDA1}", - nfkc: "\u{062A}\u{062E}\u{064A}", - nfkd: "\u{062A}\u{062E}\u{064A}", - }, - NormalizationTest { - source: "\u{FDA2}", - nfc: "\u{FDA2}", - nfd: "\u{FDA2}", - nfkc: "\u{062A}\u{062E}\u{0649}", - nfkd: "\u{062A}\u{062E}\u{0649}", - }, - NormalizationTest { - source: "\u{FDA3}", - nfc: "\u{FDA3}", - nfd: "\u{FDA3}", - nfkc: "\u{062A}\u{0645}\u{064A}", - nfkd: "\u{062A}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FDA4}", - nfc: "\u{FDA4}", - nfd: "\u{FDA4}", - nfkc: "\u{062A}\u{0645}\u{0649}", - nfkd: "\u{062A}\u{0645}\u{0649}", - }, - NormalizationTest { - source: "\u{FDA5}", - nfc: "\u{FDA5}", - nfd: "\u{FDA5}", - nfkc: "\u{062C}\u{0645}\u{064A}", - nfkd: "\u{062C}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FDA6}", - nfc: "\u{FDA6}", - nfd: "\u{FDA6}", - nfkc: "\u{062C}\u{062D}\u{0649}", - nfkd: "\u{062C}\u{062D}\u{0649}", - }, - NormalizationTest { - source: "\u{FDA7}", - nfc: "\u{FDA7}", - nfd: "\u{FDA7}", - nfkc: "\u{062C}\u{0645}\u{0649}", - nfkd: "\u{062C}\u{0645}\u{0649}", - }, - NormalizationTest { - source: "\u{FDA8}", - nfc: "\u{FDA8}", - nfd: "\u{FDA8}", - nfkc: "\u{0633}\u{062E}\u{0649}", - nfkd: "\u{0633}\u{062E}\u{0649}", - }, - NormalizationTest { - source: "\u{FDA9}", - nfc: "\u{FDA9}", - nfd: "\u{FDA9}", - nfkc: "\u{0635}\u{062D}\u{064A}", - nfkd: "\u{0635}\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FDAA}", - nfc: "\u{FDAA}", - nfd: "\u{FDAA}", - nfkc: "\u{0634}\u{062D}\u{064A}", - nfkd: "\u{0634}\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FDAB}", - nfc: "\u{FDAB}", - nfd: "\u{FDAB}", - nfkc: "\u{0636}\u{062D}\u{064A}", - nfkd: "\u{0636}\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FDAC}", - nfc: "\u{FDAC}", - nfd: "\u{FDAC}", - nfkc: "\u{0644}\u{062C}\u{064A}", - nfkd: "\u{0644}\u{062C}\u{064A}", - }, - NormalizationTest { - source: "\u{FDAD}", - nfc: "\u{FDAD}", - nfd: "\u{FDAD}", - nfkc: "\u{0644}\u{0645}\u{064A}", - nfkd: "\u{0644}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FDAE}", - nfc: "\u{FDAE}", - nfd: "\u{FDAE}", - nfkc: "\u{064A}\u{062D}\u{064A}", - nfkd: "\u{064A}\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FDAF}", - nfc: "\u{FDAF}", - nfd: "\u{FDAF}", - nfkc: "\u{064A}\u{062C}\u{064A}", - nfkd: "\u{064A}\u{062C}\u{064A}", - }, - NormalizationTest { - source: "\u{FDB0}", - nfc: "\u{FDB0}", - nfd: "\u{FDB0}", - nfkc: "\u{064A}\u{0645}\u{064A}", - nfkd: "\u{064A}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FDB1}", - nfc: "\u{FDB1}", - nfd: "\u{FDB1}", - nfkc: "\u{0645}\u{0645}\u{064A}", - nfkd: "\u{0645}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FDB2}", - nfc: "\u{FDB2}", - nfd: "\u{FDB2}", - nfkc: "\u{0642}\u{0645}\u{064A}", - nfkd: "\u{0642}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FDB3}", - nfc: "\u{FDB3}", - nfd: "\u{FDB3}", - nfkc: "\u{0646}\u{062D}\u{064A}", - nfkd: "\u{0646}\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FDB4}", - nfc: "\u{FDB4}", - nfd: "\u{FDB4}", - nfkc: "\u{0642}\u{0645}\u{062D}", - nfkd: "\u{0642}\u{0645}\u{062D}", - }, - NormalizationTest { - source: "\u{FDB5}", - nfc: "\u{FDB5}", - nfd: "\u{FDB5}", - nfkc: "\u{0644}\u{062D}\u{0645}", - nfkd: "\u{0644}\u{062D}\u{0645}", - }, - NormalizationTest { - source: "\u{FDB6}", - nfc: "\u{FDB6}", - nfd: "\u{FDB6}", - nfkc: "\u{0639}\u{0645}\u{064A}", - nfkd: "\u{0639}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FDB7}", - nfc: "\u{FDB7}", - nfd: "\u{FDB7}", - nfkc: "\u{0643}\u{0645}\u{064A}", - nfkd: "\u{0643}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FDB8}", - nfc: "\u{FDB8}", - nfd: "\u{FDB8}", - nfkc: "\u{0646}\u{062C}\u{062D}", - nfkd: "\u{0646}\u{062C}\u{062D}", - }, - NormalizationTest { - source: "\u{FDB9}", - nfc: "\u{FDB9}", - nfd: "\u{FDB9}", - nfkc: "\u{0645}\u{062E}\u{064A}", - nfkd: "\u{0645}\u{062E}\u{064A}", - }, - NormalizationTest { - source: "\u{FDBA}", - nfc: "\u{FDBA}", - nfd: "\u{FDBA}", - nfkc: "\u{0644}\u{062C}\u{0645}", - nfkd: "\u{0644}\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FDBB}", - nfc: "\u{FDBB}", - nfd: "\u{FDBB}", - nfkc: "\u{0643}\u{0645}\u{0645}", - nfkd: "\u{0643}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FDBC}", - nfc: "\u{FDBC}", - nfd: "\u{FDBC}", - nfkc: "\u{0644}\u{062C}\u{0645}", - nfkd: "\u{0644}\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FDBD}", - nfc: "\u{FDBD}", - nfd: "\u{FDBD}", - nfkc: "\u{0646}\u{062C}\u{062D}", - nfkd: "\u{0646}\u{062C}\u{062D}", - }, - NormalizationTest { - source: "\u{FDBE}", - nfc: "\u{FDBE}", - nfd: "\u{FDBE}", - nfkc: "\u{062C}\u{062D}\u{064A}", - nfkd: "\u{062C}\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FDBF}", - nfc: "\u{FDBF}", - nfd: "\u{FDBF}", - nfkc: "\u{062D}\u{062C}\u{064A}", - nfkd: "\u{062D}\u{062C}\u{064A}", - }, - NormalizationTest { - source: "\u{FDC0}", - nfc: "\u{FDC0}", - nfd: "\u{FDC0}", - nfkc: "\u{0645}\u{062C}\u{064A}", - nfkd: "\u{0645}\u{062C}\u{064A}", - }, - NormalizationTest { - source: "\u{FDC1}", - nfc: "\u{FDC1}", - nfd: "\u{FDC1}", - nfkc: "\u{0641}\u{0645}\u{064A}", - nfkd: "\u{0641}\u{0645}\u{064A}", - }, - NormalizationTest { - source: "\u{FDC2}", - nfc: "\u{FDC2}", - nfd: "\u{FDC2}", - nfkc: "\u{0628}\u{062D}\u{064A}", - nfkd: "\u{0628}\u{062D}\u{064A}", - }, - NormalizationTest { - source: "\u{FDC3}", - nfc: "\u{FDC3}", - nfd: "\u{FDC3}", - nfkc: "\u{0643}\u{0645}\u{0645}", - nfkd: "\u{0643}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FDC4}", - nfc: "\u{FDC4}", - nfd: "\u{FDC4}", - nfkc: "\u{0639}\u{062C}\u{0645}", - nfkd: "\u{0639}\u{062C}\u{0645}", - }, - NormalizationTest { - source: "\u{FDC5}", - nfc: "\u{FDC5}", - nfd: "\u{FDC5}", - nfkc: "\u{0635}\u{0645}\u{0645}", - nfkd: "\u{0635}\u{0645}\u{0645}", - }, - NormalizationTest { - source: "\u{FDC6}", - nfc: "\u{FDC6}", - nfd: "\u{FDC6}", - nfkc: "\u{0633}\u{062E}\u{064A}", - nfkd: "\u{0633}\u{062E}\u{064A}", - }, - NormalizationTest { - source: "\u{FDC7}", - nfc: "\u{FDC7}", - nfd: "\u{FDC7}", - nfkc: "\u{0646}\u{062C}\u{064A}", - nfkd: "\u{0646}\u{062C}\u{064A}", - }, - NormalizationTest { - source: "\u{FDF0}", - nfc: "\u{FDF0}", - nfd: "\u{FDF0}", - nfkc: "\u{0635}\u{0644}\u{06D2}", - nfkd: "\u{0635}\u{0644}\u{06D2}", - }, - NormalizationTest { - source: "\u{FDF1}", - nfc: "\u{FDF1}", - nfd: "\u{FDF1}", - nfkc: "\u{0642}\u{0644}\u{06D2}", - nfkd: "\u{0642}\u{0644}\u{06D2}", - }, - NormalizationTest { - source: "\u{FDF2}", - nfc: "\u{FDF2}", - nfd: "\u{FDF2}", - nfkc: "\u{0627}\u{0644}\u{0644}\u{0647}", - nfkd: "\u{0627}\u{0644}\u{0644}\u{0647}", - }, - NormalizationTest { - source: "\u{FDF3}", - nfc: "\u{FDF3}", - nfd: "\u{FDF3}", - nfkc: "\u{0627}\u{0643}\u{0628}\u{0631}", - nfkd: "\u{0627}\u{0643}\u{0628}\u{0631}", - }, - NormalizationTest { - source: "\u{FDF4}", - nfc: "\u{FDF4}", - nfd: "\u{FDF4}", - nfkc: "\u{0645}\u{062D}\u{0645}\u{062F}", - nfkd: "\u{0645}\u{062D}\u{0645}\u{062F}", - }, - NormalizationTest { - source: "\u{FDF5}", - nfc: "\u{FDF5}", - nfd: "\u{FDF5}", - nfkc: "\u{0635}\u{0644}\u{0639}\u{0645}", - nfkd: "\u{0635}\u{0644}\u{0639}\u{0645}", - }, - NormalizationTest { - source: "\u{FDF6}", - nfc: "\u{FDF6}", - nfd: "\u{FDF6}", - nfkc: "\u{0631}\u{0633}\u{0648}\u{0644}", - nfkd: "\u{0631}\u{0633}\u{0648}\u{0644}", - }, - NormalizationTest { - source: "\u{FDF7}", - nfc: "\u{FDF7}", - nfd: "\u{FDF7}", - nfkc: "\u{0639}\u{0644}\u{064A}\u{0647}", - nfkd: "\u{0639}\u{0644}\u{064A}\u{0647}", - }, - NormalizationTest { - source: "\u{FDF8}", - nfc: "\u{FDF8}", - nfd: "\u{FDF8}", - nfkc: "\u{0648}\u{0633}\u{0644}\u{0645}", - nfkd: "\u{0648}\u{0633}\u{0644}\u{0645}", - }, - NormalizationTest { - source: "\u{FDF9}", - nfc: "\u{FDF9}", - nfd: "\u{FDF9}", - nfkc: "\u{0635}\u{0644}\u{0649}", - nfkd: "\u{0635}\u{0644}\u{0649}", - }, - NormalizationTest { - source: "\u{FDFA}", - nfc: "\u{FDFA}", - nfd: "\u{FDFA}", - nfkc: "\u{0635}\u{0644}\u{0649}\u{0020}\u{0627}\u{0644}\u{0644}\u{0647}\u{0020}\u{0639}\u{0644}\u{064A}\u{0647}\u{0020}\u{0648}\u{0633}\u{0644}\u{0645}", - nfkd: "\u{0635}\u{0644}\u{0649}\u{0020}\u{0627}\u{0644}\u{0644}\u{0647}\u{0020}\u{0639}\u{0644}\u{064A}\u{0647}\u{0020}\u{0648}\u{0633}\u{0644}\u{0645}", - }, - NormalizationTest { - source: "\u{FDFB}", - nfc: "\u{FDFB}", - nfd: "\u{FDFB}", - nfkc: "\u{062C}\u{0644}\u{0020}\u{062C}\u{0644}\u{0627}\u{0644}\u{0647}", - nfkd: "\u{062C}\u{0644}\u{0020}\u{062C}\u{0644}\u{0627}\u{0644}\u{0647}", - }, - NormalizationTest { - source: "\u{FDFC}", - nfc: "\u{FDFC}", - nfd: "\u{FDFC}", - nfkc: "\u{0631}\u{06CC}\u{0627}\u{0644}", - nfkd: "\u{0631}\u{06CC}\u{0627}\u{0644}", - }, - NormalizationTest { - source: "\u{FE10}", - nfc: "\u{FE10}", - nfd: "\u{FE10}", - nfkc: "\u{002C}", - nfkd: "\u{002C}", - }, - NormalizationTest { - source: "\u{FE11}", - nfc: "\u{FE11}", - nfd: "\u{FE11}", - nfkc: "\u{3001}", - nfkd: "\u{3001}", - }, - NormalizationTest { - source: "\u{FE12}", - nfc: "\u{FE12}", - nfd: "\u{FE12}", - nfkc: "\u{3002}", - nfkd: "\u{3002}", - }, - NormalizationTest { - source: "\u{FE13}", - nfc: "\u{FE13}", - nfd: "\u{FE13}", - nfkc: "\u{003A}", - nfkd: "\u{003A}", - }, - NormalizationTest { - source: "\u{FE14}", - nfc: "\u{FE14}", - nfd: "\u{FE14}", - nfkc: "\u{003B}", - nfkd: "\u{003B}", - }, - NormalizationTest { - source: "\u{FE15}", - nfc: "\u{FE15}", - nfd: "\u{FE15}", - nfkc: "\u{0021}", - nfkd: "\u{0021}", - }, - NormalizationTest { - source: "\u{FE16}", - nfc: "\u{FE16}", - nfd: "\u{FE16}", - nfkc: "\u{003F}", - nfkd: "\u{003F}", - }, - NormalizationTest { - source: "\u{FE17}", - nfc: "\u{FE17}", - nfd: "\u{FE17}", - nfkc: "\u{3016}", - nfkd: "\u{3016}", - }, - NormalizationTest { - source: "\u{FE18}", - nfc: "\u{FE18}", - nfd: "\u{FE18}", - nfkc: "\u{3017}", - nfkd: "\u{3017}", - }, - NormalizationTest { - source: "\u{FE19}", - nfc: "\u{FE19}", - nfd: "\u{FE19}", - nfkc: "\u{002E}\u{002E}\u{002E}", - nfkd: "\u{002E}\u{002E}\u{002E}", - }, - NormalizationTest { - source: "\u{FE30}", - nfc: "\u{FE30}", - nfd: "\u{FE30}", - nfkc: "\u{002E}\u{002E}", - nfkd: "\u{002E}\u{002E}", - }, - NormalizationTest { - source: "\u{FE31}", - nfc: "\u{FE31}", - nfd: "\u{FE31}", - nfkc: "\u{2014}", - nfkd: "\u{2014}", - }, - NormalizationTest { - source: "\u{FE32}", - nfc: "\u{FE32}", - nfd: "\u{FE32}", - nfkc: "\u{2013}", - nfkd: "\u{2013}", - }, - NormalizationTest { - source: "\u{FE33}", - nfc: "\u{FE33}", - nfd: "\u{FE33}", - nfkc: "\u{005F}", - nfkd: "\u{005F}", - }, - NormalizationTest { - source: "\u{FE34}", - nfc: "\u{FE34}", - nfd: "\u{FE34}", - nfkc: "\u{005F}", - nfkd: "\u{005F}", - }, - NormalizationTest { - source: "\u{FE35}", - nfc: "\u{FE35}", - nfd: "\u{FE35}", - nfkc: "\u{0028}", - nfkd: "\u{0028}", - }, - NormalizationTest { - source: "\u{FE36}", - nfc: "\u{FE36}", - nfd: "\u{FE36}", - nfkc: "\u{0029}", - nfkd: "\u{0029}", - }, - NormalizationTest { - source: "\u{FE37}", - nfc: "\u{FE37}", - nfd: "\u{FE37}", - nfkc: "\u{007B}", - nfkd: "\u{007B}", - }, - NormalizationTest { - source: "\u{FE38}", - nfc: "\u{FE38}", - nfd: "\u{FE38}", - nfkc: "\u{007D}", - nfkd: "\u{007D}", - }, - NormalizationTest { - source: "\u{FE39}", - nfc: "\u{FE39}", - nfd: "\u{FE39}", - nfkc: "\u{3014}", - nfkd: "\u{3014}", - }, - NormalizationTest { - source: "\u{FE3A}", - nfc: "\u{FE3A}", - nfd: "\u{FE3A}", - nfkc: "\u{3015}", - nfkd: "\u{3015}", - }, - NormalizationTest { - source: "\u{FE3B}", - nfc: "\u{FE3B}", - nfd: "\u{FE3B}", - nfkc: "\u{3010}", - nfkd: "\u{3010}", - }, - NormalizationTest { - source: "\u{FE3C}", - nfc: "\u{FE3C}", - nfd: "\u{FE3C}", - nfkc: "\u{3011}", - nfkd: "\u{3011}", - }, - NormalizationTest { - source: "\u{FE3D}", - nfc: "\u{FE3D}", - nfd: "\u{FE3D}", - nfkc: "\u{300A}", - nfkd: "\u{300A}", - }, - NormalizationTest { - source: "\u{FE3E}", - nfc: "\u{FE3E}", - nfd: "\u{FE3E}", - nfkc: "\u{300B}", - nfkd: "\u{300B}", - }, - NormalizationTest { - source: "\u{FE3F}", - nfc: "\u{FE3F}", - nfd: "\u{FE3F}", - nfkc: "\u{3008}", - nfkd: "\u{3008}", - }, - NormalizationTest { - source: "\u{FE40}", - nfc: "\u{FE40}", - nfd: "\u{FE40}", - nfkc: "\u{3009}", - nfkd: "\u{3009}", - }, - NormalizationTest { - source: "\u{FE41}", - nfc: "\u{FE41}", - nfd: "\u{FE41}", - nfkc: "\u{300C}", - nfkd: "\u{300C}", - }, - NormalizationTest { - source: "\u{FE42}", - nfc: "\u{FE42}", - nfd: "\u{FE42}", - nfkc: "\u{300D}", - nfkd: "\u{300D}", - }, - NormalizationTest { - source: "\u{FE43}", - nfc: "\u{FE43}", - nfd: "\u{FE43}", - nfkc: "\u{300E}", - nfkd: "\u{300E}", - }, - NormalizationTest { - source: "\u{FE44}", - nfc: "\u{FE44}", - nfd: "\u{FE44}", - nfkc: "\u{300F}", - nfkd: "\u{300F}", - }, - NormalizationTest { - source: "\u{FE47}", - nfc: "\u{FE47}", - nfd: "\u{FE47}", - nfkc: "\u{005B}", - nfkd: "\u{005B}", - }, - NormalizationTest { - source: "\u{FE48}", - nfc: "\u{FE48}", - nfd: "\u{FE48}", - nfkc: "\u{005D}", - nfkd: "\u{005D}", - }, - NormalizationTest { - source: "\u{FE49}", - nfc: "\u{FE49}", - nfd: "\u{FE49}", - nfkc: "\u{0020}\u{0305}", - nfkd: "\u{0020}\u{0305}", - }, - NormalizationTest { - source: "\u{FE4A}", - nfc: "\u{FE4A}", - nfd: "\u{FE4A}", - nfkc: "\u{0020}\u{0305}", - nfkd: "\u{0020}\u{0305}", - }, - NormalizationTest { - source: "\u{FE4B}", - nfc: "\u{FE4B}", - nfd: "\u{FE4B}", - nfkc: "\u{0020}\u{0305}", - nfkd: "\u{0020}\u{0305}", - }, - NormalizationTest { - source: "\u{FE4C}", - nfc: "\u{FE4C}", - nfd: "\u{FE4C}", - nfkc: "\u{0020}\u{0305}", - nfkd: "\u{0020}\u{0305}", - }, - NormalizationTest { - source: "\u{FE4D}", - nfc: "\u{FE4D}", - nfd: "\u{FE4D}", - nfkc: "\u{005F}", - nfkd: "\u{005F}", - }, - NormalizationTest { - source: "\u{FE4E}", - nfc: "\u{FE4E}", - nfd: "\u{FE4E}", - nfkc: "\u{005F}", - nfkd: "\u{005F}", - }, - NormalizationTest { - source: "\u{FE4F}", - nfc: "\u{FE4F}", - nfd: "\u{FE4F}", - nfkc: "\u{005F}", - nfkd: "\u{005F}", - }, - NormalizationTest { - source: "\u{FE50}", - nfc: "\u{FE50}", - nfd: "\u{FE50}", - nfkc: "\u{002C}", - nfkd: "\u{002C}", - }, - NormalizationTest { - source: "\u{FE51}", - nfc: "\u{FE51}", - nfd: "\u{FE51}", - nfkc: "\u{3001}", - nfkd: "\u{3001}", - }, - NormalizationTest { - source: "\u{FE52}", - nfc: "\u{FE52}", - nfd: "\u{FE52}", - nfkc: "\u{002E}", - nfkd: "\u{002E}", - }, - NormalizationTest { - source: "\u{FE54}", - nfc: "\u{FE54}", - nfd: "\u{FE54}", - nfkc: "\u{003B}", - nfkd: "\u{003B}", - }, - NormalizationTest { - source: "\u{FE55}", - nfc: "\u{FE55}", - nfd: "\u{FE55}", - nfkc: "\u{003A}", - nfkd: "\u{003A}", - }, - NormalizationTest { - source: "\u{FE56}", - nfc: "\u{FE56}", - nfd: "\u{FE56}", - nfkc: "\u{003F}", - nfkd: "\u{003F}", - }, - NormalizationTest { - source: "\u{FE57}", - nfc: "\u{FE57}", - nfd: "\u{FE57}", - nfkc: "\u{0021}", - nfkd: "\u{0021}", - }, - NormalizationTest { - source: "\u{FE58}", - nfc: "\u{FE58}", - nfd: "\u{FE58}", - nfkc: "\u{2014}", - nfkd: "\u{2014}", - }, - NormalizationTest { - source: "\u{FE59}", - nfc: "\u{FE59}", - nfd: "\u{FE59}", - nfkc: "\u{0028}", - nfkd: "\u{0028}", - }, - NormalizationTest { - source: "\u{FE5A}", - nfc: "\u{FE5A}", - nfd: "\u{FE5A}", - nfkc: "\u{0029}", - nfkd: "\u{0029}", - }, - NormalizationTest { - source: "\u{FE5B}", - nfc: "\u{FE5B}", - nfd: "\u{FE5B}", - nfkc: "\u{007B}", - nfkd: "\u{007B}", - }, - NormalizationTest { - source: "\u{FE5C}", - nfc: "\u{FE5C}", - nfd: "\u{FE5C}", - nfkc: "\u{007D}", - nfkd: "\u{007D}", - }, - NormalizationTest { - source: "\u{FE5D}", - nfc: "\u{FE5D}", - nfd: "\u{FE5D}", - nfkc: "\u{3014}", - nfkd: "\u{3014}", - }, - NormalizationTest { - source: "\u{FE5E}", - nfc: "\u{FE5E}", - nfd: "\u{FE5E}", - nfkc: "\u{3015}", - nfkd: "\u{3015}", - }, - NormalizationTest { - source: "\u{FE5F}", - nfc: "\u{FE5F}", - nfd: "\u{FE5F}", - nfkc: "\u{0023}", - nfkd: "\u{0023}", - }, - NormalizationTest { - source: "\u{FE60}", - nfc: "\u{FE60}", - nfd: "\u{FE60}", - nfkc: "\u{0026}", - nfkd: "\u{0026}", - }, - NormalizationTest { - source: "\u{FE61}", - nfc: "\u{FE61}", - nfd: "\u{FE61}", - nfkc: "\u{002A}", - nfkd: "\u{002A}", - }, - NormalizationTest { - source: "\u{FE62}", - nfc: "\u{FE62}", - nfd: "\u{FE62}", - nfkc: "\u{002B}", - nfkd: "\u{002B}", - }, - NormalizationTest { - source: "\u{FE63}", - nfc: "\u{FE63}", - nfd: "\u{FE63}", - nfkc: "\u{002D}", - nfkd: "\u{002D}", - }, - NormalizationTest { - source: "\u{FE64}", - nfc: "\u{FE64}", - nfd: "\u{FE64}", - nfkc: "\u{003C}", - nfkd: "\u{003C}", - }, - NormalizationTest { - source: "\u{FE65}", - nfc: "\u{FE65}", - nfd: "\u{FE65}", - nfkc: "\u{003E}", - nfkd: "\u{003E}", - }, - NormalizationTest { - source: "\u{FE66}", - nfc: "\u{FE66}", - nfd: "\u{FE66}", - nfkc: "\u{003D}", - nfkd: "\u{003D}", - }, - NormalizationTest { - source: "\u{FE68}", - nfc: "\u{FE68}", - nfd: "\u{FE68}", - nfkc: "\u{005C}", - nfkd: "\u{005C}", - }, - NormalizationTest { - source: "\u{FE69}", - nfc: "\u{FE69}", - nfd: "\u{FE69}", - nfkc: "\u{0024}", - nfkd: "\u{0024}", - }, - NormalizationTest { - source: "\u{FE6A}", - nfc: "\u{FE6A}", - nfd: "\u{FE6A}", - nfkc: "\u{0025}", - nfkd: "\u{0025}", - }, - NormalizationTest { - source: "\u{FE6B}", - nfc: "\u{FE6B}", - nfd: "\u{FE6B}", - nfkc: "\u{0040}", - nfkd: "\u{0040}", - }, - NormalizationTest { - source: "\u{FE70}", - nfc: "\u{FE70}", - nfd: "\u{FE70}", - nfkc: "\u{0020}\u{064B}", - nfkd: "\u{0020}\u{064B}", - }, - NormalizationTest { - source: "\u{FE71}", - nfc: "\u{FE71}", - nfd: "\u{FE71}", - nfkc: "\u{0640}\u{064B}", - nfkd: "\u{0640}\u{064B}", - }, - NormalizationTest { - source: "\u{FE72}", - nfc: "\u{FE72}", - nfd: "\u{FE72}", - nfkc: "\u{0020}\u{064C}", - nfkd: "\u{0020}\u{064C}", - }, - NormalizationTest { - source: "\u{FE74}", - nfc: "\u{FE74}", - nfd: "\u{FE74}", - nfkc: "\u{0020}\u{064D}", - nfkd: "\u{0020}\u{064D}", - }, - NormalizationTest { - source: "\u{FE76}", - nfc: "\u{FE76}", - nfd: "\u{FE76}", - nfkc: "\u{0020}\u{064E}", - nfkd: "\u{0020}\u{064E}", - }, - NormalizationTest { - source: "\u{FE77}", - nfc: "\u{FE77}", - nfd: "\u{FE77}", - nfkc: "\u{0640}\u{064E}", - nfkd: "\u{0640}\u{064E}", - }, - NormalizationTest { - source: "\u{FE78}", - nfc: "\u{FE78}", - nfd: "\u{FE78}", - nfkc: "\u{0020}\u{064F}", - nfkd: "\u{0020}\u{064F}", - }, - NormalizationTest { - source: "\u{FE79}", - nfc: "\u{FE79}", - nfd: "\u{FE79}", - nfkc: "\u{0640}\u{064F}", - nfkd: "\u{0640}\u{064F}", - }, - NormalizationTest { - source: "\u{FE7A}", - nfc: "\u{FE7A}", - nfd: "\u{FE7A}", - nfkc: "\u{0020}\u{0650}", - nfkd: "\u{0020}\u{0650}", - }, - NormalizationTest { - source: "\u{FE7B}", - nfc: "\u{FE7B}", - nfd: "\u{FE7B}", - nfkc: "\u{0640}\u{0650}", - nfkd: "\u{0640}\u{0650}", - }, - NormalizationTest { - source: "\u{FE7C}", - nfc: "\u{FE7C}", - nfd: "\u{FE7C}", - nfkc: "\u{0020}\u{0651}", - nfkd: "\u{0020}\u{0651}", - }, - NormalizationTest { - source: "\u{FE7D}", - nfc: "\u{FE7D}", - nfd: "\u{FE7D}", - nfkc: "\u{0640}\u{0651}", - nfkd: "\u{0640}\u{0651}", - }, - NormalizationTest { - source: "\u{FE7E}", - nfc: "\u{FE7E}", - nfd: "\u{FE7E}", - nfkc: "\u{0020}\u{0652}", - nfkd: "\u{0020}\u{0652}", - }, - NormalizationTest { - source: "\u{FE7F}", - nfc: "\u{FE7F}", - nfd: "\u{FE7F}", - nfkc: "\u{0640}\u{0652}", - nfkd: "\u{0640}\u{0652}", - }, - NormalizationTest { - source: "\u{FE80}", - nfc: "\u{FE80}", - nfd: "\u{FE80}", - nfkc: "\u{0621}", - nfkd: "\u{0621}", - }, - NormalizationTest { - source: "\u{FE81}", - nfc: "\u{FE81}", - nfd: "\u{FE81}", - nfkc: "\u{0622}", - nfkd: "\u{0627}\u{0653}", - }, - NormalizationTest { - source: "\u{FE82}", - nfc: "\u{FE82}", - nfd: "\u{FE82}", - nfkc: "\u{0622}", - nfkd: "\u{0627}\u{0653}", - }, - NormalizationTest { - source: "\u{FE83}", - nfc: "\u{FE83}", - nfd: "\u{FE83}", - nfkc: "\u{0623}", - nfkd: "\u{0627}\u{0654}", - }, - NormalizationTest { - source: "\u{FE84}", - nfc: "\u{FE84}", - nfd: "\u{FE84}", - nfkc: "\u{0623}", - nfkd: "\u{0627}\u{0654}", - }, - NormalizationTest { - source: "\u{FE85}", - nfc: "\u{FE85}", - nfd: "\u{FE85}", - nfkc: "\u{0624}", - nfkd: "\u{0648}\u{0654}", - }, - NormalizationTest { - source: "\u{FE86}", - nfc: "\u{FE86}", - nfd: "\u{FE86}", - nfkc: "\u{0624}", - nfkd: "\u{0648}\u{0654}", - }, - NormalizationTest { - source: "\u{FE87}", - nfc: "\u{FE87}", - nfd: "\u{FE87}", - nfkc: "\u{0625}", - nfkd: "\u{0627}\u{0655}", - }, - NormalizationTest { - source: "\u{FE88}", - nfc: "\u{FE88}", - nfd: "\u{FE88}", - nfkc: "\u{0625}", - nfkd: "\u{0627}\u{0655}", - }, - NormalizationTest { - source: "\u{FE89}", - nfc: "\u{FE89}", - nfd: "\u{FE89}", - nfkc: "\u{0626}", - nfkd: "\u{064A}\u{0654}", - }, - NormalizationTest { - source: "\u{FE8A}", - nfc: "\u{FE8A}", - nfd: "\u{FE8A}", - nfkc: "\u{0626}", - nfkd: "\u{064A}\u{0654}", - }, - NormalizationTest { - source: "\u{FE8B}", - nfc: "\u{FE8B}", - nfd: "\u{FE8B}", - nfkc: "\u{0626}", - nfkd: "\u{064A}\u{0654}", - }, - NormalizationTest { - source: "\u{FE8C}", - nfc: "\u{FE8C}", - nfd: "\u{FE8C}", - nfkc: "\u{0626}", - nfkd: "\u{064A}\u{0654}", - }, - NormalizationTest { - source: "\u{FE8D}", - nfc: "\u{FE8D}", - nfd: "\u{FE8D}", - nfkc: "\u{0627}", - nfkd: "\u{0627}", - }, - NormalizationTest { - source: "\u{FE8E}", - nfc: "\u{FE8E}", - nfd: "\u{FE8E}", - nfkc: "\u{0627}", - nfkd: "\u{0627}", - }, - NormalizationTest { - source: "\u{FE8F}", - nfc: "\u{FE8F}", - nfd: "\u{FE8F}", - nfkc: "\u{0628}", - nfkd: "\u{0628}", - }, - NormalizationTest { - source: "\u{FE90}", - nfc: "\u{FE90}", - nfd: "\u{FE90}", - nfkc: "\u{0628}", - nfkd: "\u{0628}", - }, - NormalizationTest { - source: "\u{FE91}", - nfc: "\u{FE91}", - nfd: "\u{FE91}", - nfkc: "\u{0628}", - nfkd: "\u{0628}", - }, - NormalizationTest { - source: "\u{FE92}", - nfc: "\u{FE92}", - nfd: "\u{FE92}", - nfkc: "\u{0628}", - nfkd: "\u{0628}", - }, - NormalizationTest { - source: "\u{FE93}", - nfc: "\u{FE93}", - nfd: "\u{FE93}", - nfkc: "\u{0629}", - nfkd: "\u{0629}", - }, - NormalizationTest { - source: "\u{FE94}", - nfc: "\u{FE94}", - nfd: "\u{FE94}", - nfkc: "\u{0629}", - nfkd: "\u{0629}", - }, - NormalizationTest { - source: "\u{FE95}", - nfc: "\u{FE95}", - nfd: "\u{FE95}", - nfkc: "\u{062A}", - nfkd: "\u{062A}", - }, - NormalizationTest { - source: "\u{FE96}", - nfc: "\u{FE96}", - nfd: "\u{FE96}", - nfkc: "\u{062A}", - nfkd: "\u{062A}", - }, - NormalizationTest { - source: "\u{FE97}", - nfc: "\u{FE97}", - nfd: "\u{FE97}", - nfkc: "\u{062A}", - nfkd: "\u{062A}", - }, - NormalizationTest { - source: "\u{FE98}", - nfc: "\u{FE98}", - nfd: "\u{FE98}", - nfkc: "\u{062A}", - nfkd: "\u{062A}", - }, - NormalizationTest { - source: "\u{FE99}", - nfc: "\u{FE99}", - nfd: "\u{FE99}", - nfkc: "\u{062B}", - nfkd: "\u{062B}", - }, - NormalizationTest { - source: "\u{FE9A}", - nfc: "\u{FE9A}", - nfd: "\u{FE9A}", - nfkc: "\u{062B}", - nfkd: "\u{062B}", - }, - NormalizationTest { - source: "\u{FE9B}", - nfc: "\u{FE9B}", - nfd: "\u{FE9B}", - nfkc: "\u{062B}", - nfkd: "\u{062B}", - }, - NormalizationTest { - source: "\u{FE9C}", - nfc: "\u{FE9C}", - nfd: "\u{FE9C}", - nfkc: "\u{062B}", - nfkd: "\u{062B}", - }, - NormalizationTest { - source: "\u{FE9D}", - nfc: "\u{FE9D}", - nfd: "\u{FE9D}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{FE9E}", - nfc: "\u{FE9E}", - nfd: "\u{FE9E}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{FE9F}", - nfc: "\u{FE9F}", - nfd: "\u{FE9F}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{FEA0}", - nfc: "\u{FEA0}", - nfd: "\u{FEA0}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{FEA1}", - nfc: "\u{FEA1}", - nfd: "\u{FEA1}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{FEA2}", - nfc: "\u{FEA2}", - nfd: "\u{FEA2}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{FEA3}", - nfc: "\u{FEA3}", - nfd: "\u{FEA3}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{FEA4}", - nfc: "\u{FEA4}", - nfd: "\u{FEA4}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{FEA5}", - nfc: "\u{FEA5}", - nfd: "\u{FEA5}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{FEA6}", - nfc: "\u{FEA6}", - nfd: "\u{FEA6}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{FEA7}", - nfc: "\u{FEA7}", - nfd: "\u{FEA7}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{FEA8}", - nfc: "\u{FEA8}", - nfd: "\u{FEA8}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{FEA9}", - nfc: "\u{FEA9}", - nfd: "\u{FEA9}", - nfkc: "\u{062F}", - nfkd: "\u{062F}", - }, - NormalizationTest { - source: "\u{FEAA}", - nfc: "\u{FEAA}", - nfd: "\u{FEAA}", - nfkc: "\u{062F}", - nfkd: "\u{062F}", - }, - NormalizationTest { - source: "\u{FEAB}", - nfc: "\u{FEAB}", - nfd: "\u{FEAB}", - nfkc: "\u{0630}", - nfkd: "\u{0630}", - }, - NormalizationTest { - source: "\u{FEAC}", - nfc: "\u{FEAC}", - nfd: "\u{FEAC}", - nfkc: "\u{0630}", - nfkd: "\u{0630}", - }, - NormalizationTest { - source: "\u{FEAD}", - nfc: "\u{FEAD}", - nfd: "\u{FEAD}", - nfkc: "\u{0631}", - nfkd: "\u{0631}", - }, - NormalizationTest { - source: "\u{FEAE}", - nfc: "\u{FEAE}", - nfd: "\u{FEAE}", - nfkc: "\u{0631}", - nfkd: "\u{0631}", - }, - NormalizationTest { - source: "\u{FEAF}", - nfc: "\u{FEAF}", - nfd: "\u{FEAF}", - nfkc: "\u{0632}", - nfkd: "\u{0632}", - }, - NormalizationTest { - source: "\u{FEB0}", - nfc: "\u{FEB0}", - nfd: "\u{FEB0}", - nfkc: "\u{0632}", - nfkd: "\u{0632}", - }, - NormalizationTest { - source: "\u{FEB1}", - nfc: "\u{FEB1}", - nfd: "\u{FEB1}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{FEB2}", - nfc: "\u{FEB2}", - nfd: "\u{FEB2}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{FEB3}", - nfc: "\u{FEB3}", - nfd: "\u{FEB3}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{FEB4}", - nfc: "\u{FEB4}", - nfd: "\u{FEB4}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{FEB5}", - nfc: "\u{FEB5}", - nfd: "\u{FEB5}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{FEB6}", - nfc: "\u{FEB6}", - nfd: "\u{FEB6}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{FEB7}", - nfc: "\u{FEB7}", - nfd: "\u{FEB7}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{FEB8}", - nfc: "\u{FEB8}", - nfd: "\u{FEB8}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{FEB9}", - nfc: "\u{FEB9}", - nfd: "\u{FEB9}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{FEBA}", - nfc: "\u{FEBA}", - nfd: "\u{FEBA}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{FEBB}", - nfc: "\u{FEBB}", - nfd: "\u{FEBB}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{FEBC}", - nfc: "\u{FEBC}", - nfd: "\u{FEBC}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{FEBD}", - nfc: "\u{FEBD}", - nfd: "\u{FEBD}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{FEBE}", - nfc: "\u{FEBE}", - nfd: "\u{FEBE}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{FEBF}", - nfc: "\u{FEBF}", - nfd: "\u{FEBF}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{FEC0}", - nfc: "\u{FEC0}", - nfd: "\u{FEC0}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{FEC1}", - nfc: "\u{FEC1}", - nfd: "\u{FEC1}", - nfkc: "\u{0637}", - nfkd: "\u{0637}", - }, - NormalizationTest { - source: "\u{FEC2}", - nfc: "\u{FEC2}", - nfd: "\u{FEC2}", - nfkc: "\u{0637}", - nfkd: "\u{0637}", - }, - NormalizationTest { - source: "\u{FEC3}", - nfc: "\u{FEC3}", - nfd: "\u{FEC3}", - nfkc: "\u{0637}", - nfkd: "\u{0637}", - }, - NormalizationTest { - source: "\u{FEC4}", - nfc: "\u{FEC4}", - nfd: "\u{FEC4}", - nfkc: "\u{0637}", - nfkd: "\u{0637}", - }, - NormalizationTest { - source: "\u{FEC5}", - nfc: "\u{FEC5}", - nfd: "\u{FEC5}", - nfkc: "\u{0638}", - nfkd: "\u{0638}", - }, - NormalizationTest { - source: "\u{FEC6}", - nfc: "\u{FEC6}", - nfd: "\u{FEC6}", - nfkc: "\u{0638}", - nfkd: "\u{0638}", - }, - NormalizationTest { - source: "\u{FEC7}", - nfc: "\u{FEC7}", - nfd: "\u{FEC7}", - nfkc: "\u{0638}", - nfkd: "\u{0638}", - }, - NormalizationTest { - source: "\u{FEC8}", - nfc: "\u{FEC8}", - nfd: "\u{FEC8}", - nfkc: "\u{0638}", - nfkd: "\u{0638}", - }, - NormalizationTest { - source: "\u{FEC9}", - nfc: "\u{FEC9}", - nfd: "\u{FEC9}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{FECA}", - nfc: "\u{FECA}", - nfd: "\u{FECA}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{FECB}", - nfc: "\u{FECB}", - nfd: "\u{FECB}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{FECC}", - nfc: "\u{FECC}", - nfd: "\u{FECC}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{FECD}", - nfc: "\u{FECD}", - nfd: "\u{FECD}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{FECE}", - nfc: "\u{FECE}", - nfd: "\u{FECE}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{FECF}", - nfc: "\u{FECF}", - nfd: "\u{FECF}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{FED0}", - nfc: "\u{FED0}", - nfd: "\u{FED0}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{FED1}", - nfc: "\u{FED1}", - nfd: "\u{FED1}", - nfkc: "\u{0641}", - nfkd: "\u{0641}", - }, - NormalizationTest { - source: "\u{FED2}", - nfc: "\u{FED2}", - nfd: "\u{FED2}", - nfkc: "\u{0641}", - nfkd: "\u{0641}", - }, - NormalizationTest { - source: "\u{FED3}", - nfc: "\u{FED3}", - nfd: "\u{FED3}", - nfkc: "\u{0641}", - nfkd: "\u{0641}", - }, - NormalizationTest { - source: "\u{FED4}", - nfc: "\u{FED4}", - nfd: "\u{FED4}", - nfkc: "\u{0641}", - nfkd: "\u{0641}", - }, - NormalizationTest { - source: "\u{FED5}", - nfc: "\u{FED5}", - nfd: "\u{FED5}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{FED6}", - nfc: "\u{FED6}", - nfd: "\u{FED6}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{FED7}", - nfc: "\u{FED7}", - nfd: "\u{FED7}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{FED8}", - nfc: "\u{FED8}", - nfd: "\u{FED8}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{FED9}", - nfc: "\u{FED9}", - nfd: "\u{FED9}", - nfkc: "\u{0643}", - nfkd: "\u{0643}", - }, - NormalizationTest { - source: "\u{FEDA}", - nfc: "\u{FEDA}", - nfd: "\u{FEDA}", - nfkc: "\u{0643}", - nfkd: "\u{0643}", - }, - NormalizationTest { - source: "\u{FEDB}", - nfc: "\u{FEDB}", - nfd: "\u{FEDB}", - nfkc: "\u{0643}", - nfkd: "\u{0643}", - }, - NormalizationTest { - source: "\u{FEDC}", - nfc: "\u{FEDC}", - nfd: "\u{FEDC}", - nfkc: "\u{0643}", - nfkd: "\u{0643}", - }, - NormalizationTest { - source: "\u{FEDD}", - nfc: "\u{FEDD}", - nfd: "\u{FEDD}", - nfkc: "\u{0644}", - nfkd: "\u{0644}", - }, - NormalizationTest { - source: "\u{FEDE}", - nfc: "\u{FEDE}", - nfd: "\u{FEDE}", - nfkc: "\u{0644}", - nfkd: "\u{0644}", - }, - NormalizationTest { - source: "\u{FEDF}", - nfc: "\u{FEDF}", - nfd: "\u{FEDF}", - nfkc: "\u{0644}", - nfkd: "\u{0644}", - }, - NormalizationTest { - source: "\u{FEE0}", - nfc: "\u{FEE0}", - nfd: "\u{FEE0}", - nfkc: "\u{0644}", - nfkd: "\u{0644}", - }, - NormalizationTest { - source: "\u{FEE1}", - nfc: "\u{FEE1}", - nfd: "\u{FEE1}", - nfkc: "\u{0645}", - nfkd: "\u{0645}", - }, - NormalizationTest { - source: "\u{FEE2}", - nfc: "\u{FEE2}", - nfd: "\u{FEE2}", - nfkc: "\u{0645}", - nfkd: "\u{0645}", - }, - NormalizationTest { - source: "\u{FEE3}", - nfc: "\u{FEE3}", - nfd: "\u{FEE3}", - nfkc: "\u{0645}", - nfkd: "\u{0645}", - }, - NormalizationTest { - source: "\u{FEE4}", - nfc: "\u{FEE4}", - nfd: "\u{FEE4}", - nfkc: "\u{0645}", - nfkd: "\u{0645}", - }, - NormalizationTest { - source: "\u{FEE5}", - nfc: "\u{FEE5}", - nfd: "\u{FEE5}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{FEE6}", - nfc: "\u{FEE6}", - nfd: "\u{FEE6}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{FEE7}", - nfc: "\u{FEE7}", - nfd: "\u{FEE7}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{FEE8}", - nfc: "\u{FEE8}", - nfd: "\u{FEE8}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{FEE9}", - nfc: "\u{FEE9}", - nfd: "\u{FEE9}", - nfkc: "\u{0647}", - nfkd: "\u{0647}", - }, - NormalizationTest { - source: "\u{FEEA}", - nfc: "\u{FEEA}", - nfd: "\u{FEEA}", - nfkc: "\u{0647}", - nfkd: "\u{0647}", - }, - NormalizationTest { - source: "\u{FEEB}", - nfc: "\u{FEEB}", - nfd: "\u{FEEB}", - nfkc: "\u{0647}", - nfkd: "\u{0647}", - }, - NormalizationTest { - source: "\u{FEEC}", - nfc: "\u{FEEC}", - nfd: "\u{FEEC}", - nfkc: "\u{0647}", - nfkd: "\u{0647}", - }, - NormalizationTest { - source: "\u{FEED}", - nfc: "\u{FEED}", - nfd: "\u{FEED}", - nfkc: "\u{0648}", - nfkd: "\u{0648}", - }, - NormalizationTest { - source: "\u{FEEE}", - nfc: "\u{FEEE}", - nfd: "\u{FEEE}", - nfkc: "\u{0648}", - nfkd: "\u{0648}", - }, - NormalizationTest { - source: "\u{FEEF}", - nfc: "\u{FEEF}", - nfd: "\u{FEEF}", - nfkc: "\u{0649}", - nfkd: "\u{0649}", - }, - NormalizationTest { - source: "\u{FEF0}", - nfc: "\u{FEF0}", - nfd: "\u{FEF0}", - nfkc: "\u{0649}", - nfkd: "\u{0649}", - }, - NormalizationTest { - source: "\u{FEF1}", - nfc: "\u{FEF1}", - nfd: "\u{FEF1}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{FEF2}", - nfc: "\u{FEF2}", - nfd: "\u{FEF2}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{FEF3}", - nfc: "\u{FEF3}", - nfd: "\u{FEF3}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{FEF4}", - nfc: "\u{FEF4}", - nfd: "\u{FEF4}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{FEF5}", - nfc: "\u{FEF5}", - nfd: "\u{FEF5}", - nfkc: "\u{0644}\u{0622}", - nfkd: "\u{0644}\u{0627}\u{0653}", - }, - NormalizationTest { - source: "\u{FEF6}", - nfc: "\u{FEF6}", - nfd: "\u{FEF6}", - nfkc: "\u{0644}\u{0622}", - nfkd: "\u{0644}\u{0627}\u{0653}", - }, - NormalizationTest { - source: "\u{FEF7}", - nfc: "\u{FEF7}", - nfd: "\u{FEF7}", - nfkc: "\u{0644}\u{0623}", - nfkd: "\u{0644}\u{0627}\u{0654}", - }, - NormalizationTest { - source: "\u{FEF8}", - nfc: "\u{FEF8}", - nfd: "\u{FEF8}", - nfkc: "\u{0644}\u{0623}", - nfkd: "\u{0644}\u{0627}\u{0654}", - }, - NormalizationTest { - source: "\u{FEF9}", - nfc: "\u{FEF9}", - nfd: "\u{FEF9}", - nfkc: "\u{0644}\u{0625}", - nfkd: "\u{0644}\u{0627}\u{0655}", - }, - NormalizationTest { - source: "\u{FEFA}", - nfc: "\u{FEFA}", - nfd: "\u{FEFA}", - nfkc: "\u{0644}\u{0625}", - nfkd: "\u{0644}\u{0627}\u{0655}", - }, - NormalizationTest { - source: "\u{FEFB}", - nfc: "\u{FEFB}", - nfd: "\u{FEFB}", - nfkc: "\u{0644}\u{0627}", - nfkd: "\u{0644}\u{0627}", - }, - NormalizationTest { - source: "\u{FEFC}", - nfc: "\u{FEFC}", - nfd: "\u{FEFC}", - nfkc: "\u{0644}\u{0627}", - nfkd: "\u{0644}\u{0627}", - }, - NormalizationTest { - source: "\u{FF01}", - nfc: "\u{FF01}", - nfd: "\u{FF01}", - nfkc: "\u{0021}", - nfkd: "\u{0021}", - }, - NormalizationTest { - source: "\u{FF02}", - nfc: "\u{FF02}", - nfd: "\u{FF02}", - nfkc: "\u{0022}", - nfkd: "\u{0022}", - }, - NormalizationTest { - source: "\u{FF03}", - nfc: "\u{FF03}", - nfd: "\u{FF03}", - nfkc: "\u{0023}", - nfkd: "\u{0023}", - }, - NormalizationTest { - source: "\u{FF04}", - nfc: "\u{FF04}", - nfd: "\u{FF04}", - nfkc: "\u{0024}", - nfkd: "\u{0024}", - }, - NormalizationTest { - source: "\u{FF05}", - nfc: "\u{FF05}", - nfd: "\u{FF05}", - nfkc: "\u{0025}", - nfkd: "\u{0025}", - }, - NormalizationTest { - source: "\u{FF06}", - nfc: "\u{FF06}", - nfd: "\u{FF06}", - nfkc: "\u{0026}", - nfkd: "\u{0026}", - }, - NormalizationTest { - source: "\u{FF07}", - nfc: "\u{FF07}", - nfd: "\u{FF07}", - nfkc: "\u{0027}", - nfkd: "\u{0027}", - }, - NormalizationTest { - source: "\u{FF08}", - nfc: "\u{FF08}", - nfd: "\u{FF08}", - nfkc: "\u{0028}", - nfkd: "\u{0028}", - }, - NormalizationTest { - source: "\u{FF09}", - nfc: "\u{FF09}", - nfd: "\u{FF09}", - nfkc: "\u{0029}", - nfkd: "\u{0029}", - }, - NormalizationTest { - source: "\u{FF0A}", - nfc: "\u{FF0A}", - nfd: "\u{FF0A}", - nfkc: "\u{002A}", - nfkd: "\u{002A}", - }, - NormalizationTest { - source: "\u{FF0B}", - nfc: "\u{FF0B}", - nfd: "\u{FF0B}", - nfkc: "\u{002B}", - nfkd: "\u{002B}", - }, - NormalizationTest { - source: "\u{FF0C}", - nfc: "\u{FF0C}", - nfd: "\u{FF0C}", - nfkc: "\u{002C}", - nfkd: "\u{002C}", - }, - NormalizationTest { - source: "\u{FF0D}", - nfc: "\u{FF0D}", - nfd: "\u{FF0D}", - nfkc: "\u{002D}", - nfkd: "\u{002D}", - }, - NormalizationTest { - source: "\u{FF0E}", - nfc: "\u{FF0E}", - nfd: "\u{FF0E}", - nfkc: "\u{002E}", - nfkd: "\u{002E}", - }, - NormalizationTest { - source: "\u{FF0F}", - nfc: "\u{FF0F}", - nfd: "\u{FF0F}", - nfkc: "\u{002F}", - nfkd: "\u{002F}", - }, - NormalizationTest { - source: "\u{FF10}", - nfc: "\u{FF10}", - nfd: "\u{FF10}", - nfkc: "\u{0030}", - nfkd: "\u{0030}", - }, - NormalizationTest { - source: "\u{FF11}", - nfc: "\u{FF11}", - nfd: "\u{FF11}", - nfkc: "\u{0031}", - nfkd: "\u{0031}", - }, - NormalizationTest { - source: "\u{FF12}", - nfc: "\u{FF12}", - nfd: "\u{FF12}", - nfkc: "\u{0032}", - nfkd: "\u{0032}", - }, - NormalizationTest { - source: "\u{FF13}", - nfc: "\u{FF13}", - nfd: "\u{FF13}", - nfkc: "\u{0033}", - nfkd: "\u{0033}", - }, - NormalizationTest { - source: "\u{FF14}", - nfc: "\u{FF14}", - nfd: "\u{FF14}", - nfkc: "\u{0034}", - nfkd: "\u{0034}", - }, - NormalizationTest { - source: "\u{FF15}", - nfc: "\u{FF15}", - nfd: "\u{FF15}", - nfkc: "\u{0035}", - nfkd: "\u{0035}", - }, - NormalizationTest { - source: "\u{FF16}", - nfc: "\u{FF16}", - nfd: "\u{FF16}", - nfkc: "\u{0036}", - nfkd: "\u{0036}", - }, - NormalizationTest { - source: "\u{FF17}", - nfc: "\u{FF17}", - nfd: "\u{FF17}", - nfkc: "\u{0037}", - nfkd: "\u{0037}", - }, - NormalizationTest { - source: "\u{FF18}", - nfc: "\u{FF18}", - nfd: "\u{FF18}", - nfkc: "\u{0038}", - nfkd: "\u{0038}", - }, - NormalizationTest { - source: "\u{FF19}", - nfc: "\u{FF19}", - nfd: "\u{FF19}", - nfkc: "\u{0039}", - nfkd: "\u{0039}", - }, - NormalizationTest { - source: "\u{FF1A}", - nfc: "\u{FF1A}", - nfd: "\u{FF1A}", - nfkc: "\u{003A}", - nfkd: "\u{003A}", - }, - NormalizationTest { - source: "\u{FF1B}", - nfc: "\u{FF1B}", - nfd: "\u{FF1B}", - nfkc: "\u{003B}", - nfkd: "\u{003B}", - }, - NormalizationTest { - source: "\u{FF1C}", - nfc: "\u{FF1C}", - nfd: "\u{FF1C}", - nfkc: "\u{003C}", - nfkd: "\u{003C}", - }, - NormalizationTest { - source: "\u{FF1D}", - nfc: "\u{FF1D}", - nfd: "\u{FF1D}", - nfkc: "\u{003D}", - nfkd: "\u{003D}", - }, - NormalizationTest { - source: "\u{FF1E}", - nfc: "\u{FF1E}", - nfd: "\u{FF1E}", - nfkc: "\u{003E}", - nfkd: "\u{003E}", - }, - NormalizationTest { - source: "\u{FF1F}", - nfc: "\u{FF1F}", - nfd: "\u{FF1F}", - nfkc: "\u{003F}", - nfkd: "\u{003F}", - }, - NormalizationTest { - source: "\u{FF20}", - nfc: "\u{FF20}", - nfd: "\u{FF20}", - nfkc: "\u{0040}", - nfkd: "\u{0040}", - }, - NormalizationTest { - source: "\u{FF21}", - nfc: "\u{FF21}", - nfd: "\u{FF21}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{FF22}", - nfc: "\u{FF22}", - nfd: "\u{FF22}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{FF23}", - nfc: "\u{FF23}", - nfd: "\u{FF23}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{FF24}", - nfc: "\u{FF24}", - nfd: "\u{FF24}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{FF25}", - nfc: "\u{FF25}", - nfd: "\u{FF25}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{FF26}", - nfc: "\u{FF26}", - nfd: "\u{FF26}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{FF27}", - nfc: "\u{FF27}", - nfd: "\u{FF27}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{FF28}", - nfc: "\u{FF28}", - nfd: "\u{FF28}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{FF29}", - nfc: "\u{FF29}", - nfd: "\u{FF29}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{FF2A}", - nfc: "\u{FF2A}", - nfd: "\u{FF2A}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{FF2B}", - nfc: "\u{FF2B}", - nfd: "\u{FF2B}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{FF2C}", - nfc: "\u{FF2C}", - nfd: "\u{FF2C}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{FF2D}", - nfc: "\u{FF2D}", - nfd: "\u{FF2D}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{FF2E}", - nfc: "\u{FF2E}", - nfd: "\u{FF2E}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{FF2F}", - nfc: "\u{FF2F}", - nfd: "\u{FF2F}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{FF30}", - nfc: "\u{FF30}", - nfd: "\u{FF30}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{FF31}", - nfc: "\u{FF31}", - nfd: "\u{FF31}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{FF32}", - nfc: "\u{FF32}", - nfd: "\u{FF32}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{FF33}", - nfc: "\u{FF33}", - nfd: "\u{FF33}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{FF34}", - nfc: "\u{FF34}", - nfd: "\u{FF34}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{FF35}", - nfc: "\u{FF35}", - nfd: "\u{FF35}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{FF36}", - nfc: "\u{FF36}", - nfd: "\u{FF36}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{FF37}", - nfc: "\u{FF37}", - nfd: "\u{FF37}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{FF38}", - nfc: "\u{FF38}", - nfd: "\u{FF38}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{FF39}", - nfc: "\u{FF39}", - nfd: "\u{FF39}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{FF3A}", - nfc: "\u{FF3A}", - nfd: "\u{FF3A}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{FF3B}", - nfc: "\u{FF3B}", - nfd: "\u{FF3B}", - nfkc: "\u{005B}", - nfkd: "\u{005B}", - }, - NormalizationTest { - source: "\u{FF3C}", - nfc: "\u{FF3C}", - nfd: "\u{FF3C}", - nfkc: "\u{005C}", - nfkd: "\u{005C}", - }, - NormalizationTest { - source: "\u{FF3D}", - nfc: "\u{FF3D}", - nfd: "\u{FF3D}", - nfkc: "\u{005D}", - nfkd: "\u{005D}", - }, - NormalizationTest { - source: "\u{FF3E}", - nfc: "\u{FF3E}", - nfd: "\u{FF3E}", - nfkc: "\u{005E}", - nfkd: "\u{005E}", - }, - NormalizationTest { - source: "\u{FF3F}", - nfc: "\u{FF3F}", - nfd: "\u{FF3F}", - nfkc: "\u{005F}", - nfkd: "\u{005F}", - }, - NormalizationTest { - source: "\u{FF40}", - nfc: "\u{FF40}", - nfd: "\u{FF40}", - nfkc: "\u{0060}", - nfkd: "\u{0060}", - }, - NormalizationTest { - source: "\u{FF41}", - nfc: "\u{FF41}", - nfd: "\u{FF41}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{FF42}", - nfc: "\u{FF42}", - nfd: "\u{FF42}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{FF43}", - nfc: "\u{FF43}", - nfd: "\u{FF43}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{FF44}", - nfc: "\u{FF44}", - nfd: "\u{FF44}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{FF45}", - nfc: "\u{FF45}", - nfd: "\u{FF45}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{FF46}", - nfc: "\u{FF46}", - nfd: "\u{FF46}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{FF47}", - nfc: "\u{FF47}", - nfd: "\u{FF47}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{FF48}", - nfc: "\u{FF48}", - nfd: "\u{FF48}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{FF49}", - nfc: "\u{FF49}", - nfd: "\u{FF49}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{FF4A}", - nfc: "\u{FF4A}", - nfd: "\u{FF4A}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{FF4B}", - nfc: "\u{FF4B}", - nfd: "\u{FF4B}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{FF4C}", - nfc: "\u{FF4C}", - nfd: "\u{FF4C}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{FF4D}", - nfc: "\u{FF4D}", - nfd: "\u{FF4D}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{FF4E}", - nfc: "\u{FF4E}", - nfd: "\u{FF4E}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{FF4F}", - nfc: "\u{FF4F}", - nfd: "\u{FF4F}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{FF50}", - nfc: "\u{FF50}", - nfd: "\u{FF50}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{FF51}", - nfc: "\u{FF51}", - nfd: "\u{FF51}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{FF52}", - nfc: "\u{FF52}", - nfd: "\u{FF52}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{FF53}", - nfc: "\u{FF53}", - nfd: "\u{FF53}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{FF54}", - nfc: "\u{FF54}", - nfd: "\u{FF54}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{FF55}", - nfc: "\u{FF55}", - nfd: "\u{FF55}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{FF56}", - nfc: "\u{FF56}", - nfd: "\u{FF56}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{FF57}", - nfc: "\u{FF57}", - nfd: "\u{FF57}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{FF58}", - nfc: "\u{FF58}", - nfd: "\u{FF58}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{FF59}", - nfc: "\u{FF59}", - nfd: "\u{FF59}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{FF5A}", - nfc: "\u{FF5A}", - nfd: "\u{FF5A}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{FF5B}", - nfc: "\u{FF5B}", - nfd: "\u{FF5B}", - nfkc: "\u{007B}", - nfkd: "\u{007B}", - }, - NormalizationTest { - source: "\u{FF5C}", - nfc: "\u{FF5C}", - nfd: "\u{FF5C}", - nfkc: "\u{007C}", - nfkd: "\u{007C}", - }, - NormalizationTest { - source: "\u{FF5D}", - nfc: "\u{FF5D}", - nfd: "\u{FF5D}", - nfkc: "\u{007D}", - nfkd: "\u{007D}", - }, - NormalizationTest { - source: "\u{FF5E}", - nfc: "\u{FF5E}", - nfd: "\u{FF5E}", - nfkc: "\u{007E}", - nfkd: "\u{007E}", - }, - NormalizationTest { - source: "\u{FF5F}", - nfc: "\u{FF5F}", - nfd: "\u{FF5F}", - nfkc: "\u{2985}", - nfkd: "\u{2985}", - }, - NormalizationTest { - source: "\u{FF60}", - nfc: "\u{FF60}", - nfd: "\u{FF60}", - nfkc: "\u{2986}", - nfkd: "\u{2986}", - }, - NormalizationTest { - source: "\u{FF61}", - nfc: "\u{FF61}", - nfd: "\u{FF61}", - nfkc: "\u{3002}", - nfkd: "\u{3002}", - }, - NormalizationTest { - source: "\u{FF62}", - nfc: "\u{FF62}", - nfd: "\u{FF62}", - nfkc: "\u{300C}", - nfkd: "\u{300C}", - }, - NormalizationTest { - source: "\u{FF63}", - nfc: "\u{FF63}", - nfd: "\u{FF63}", - nfkc: "\u{300D}", - nfkd: "\u{300D}", - }, - NormalizationTest { - source: "\u{FF64}", - nfc: "\u{FF64}", - nfd: "\u{FF64}", - nfkc: "\u{3001}", - nfkd: "\u{3001}", - }, - NormalizationTest { - source: "\u{FF65}", - nfc: "\u{FF65}", - nfd: "\u{FF65}", - nfkc: "\u{30FB}", - nfkd: "\u{30FB}", - }, - NormalizationTest { - source: "\u{FF66}", - nfc: "\u{FF66}", - nfd: "\u{FF66}", - nfkc: "\u{30F2}", - nfkd: "\u{30F2}", - }, - NormalizationTest { - source: "\u{FF67}", - nfc: "\u{FF67}", - nfd: "\u{FF67}", - nfkc: "\u{30A1}", - nfkd: "\u{30A1}", - }, - NormalizationTest { - source: "\u{FF68}", - nfc: "\u{FF68}", - nfd: "\u{FF68}", - nfkc: "\u{30A3}", - nfkd: "\u{30A3}", - }, - NormalizationTest { - source: "\u{FF69}", - nfc: "\u{FF69}", - nfd: "\u{FF69}", - nfkc: "\u{30A5}", - nfkd: "\u{30A5}", - }, - NormalizationTest { - source: "\u{FF6A}", - nfc: "\u{FF6A}", - nfd: "\u{FF6A}", - nfkc: "\u{30A7}", - nfkd: "\u{30A7}", - }, - NormalizationTest { - source: "\u{FF6B}", - nfc: "\u{FF6B}", - nfd: "\u{FF6B}", - nfkc: "\u{30A9}", - nfkd: "\u{30A9}", - }, - NormalizationTest { - source: "\u{FF6C}", - nfc: "\u{FF6C}", - nfd: "\u{FF6C}", - nfkc: "\u{30E3}", - nfkd: "\u{30E3}", - }, - NormalizationTest { - source: "\u{FF6D}", - nfc: "\u{FF6D}", - nfd: "\u{FF6D}", - nfkc: "\u{30E5}", - nfkd: "\u{30E5}", - }, - NormalizationTest { - source: "\u{FF6E}", - nfc: "\u{FF6E}", - nfd: "\u{FF6E}", - nfkc: "\u{30E7}", - nfkd: "\u{30E7}", - }, - NormalizationTest { - source: "\u{FF6F}", - nfc: "\u{FF6F}", - nfd: "\u{FF6F}", - nfkc: "\u{30C3}", - nfkd: "\u{30C3}", - }, - NormalizationTest { - source: "\u{FF70}", - nfc: "\u{FF70}", - nfd: "\u{FF70}", - nfkc: "\u{30FC}", - nfkd: "\u{30FC}", - }, - NormalizationTest { - source: "\u{FF71}", - nfc: "\u{FF71}", - nfd: "\u{FF71}", - nfkc: "\u{30A2}", - nfkd: "\u{30A2}", - }, - NormalizationTest { - source: "\u{FF72}", - nfc: "\u{FF72}", - nfd: "\u{FF72}", - nfkc: "\u{30A4}", - nfkd: "\u{30A4}", - }, - NormalizationTest { - source: "\u{FF73}", - nfc: "\u{FF73}", - nfd: "\u{FF73}", - nfkc: "\u{30A6}", - nfkd: "\u{30A6}", - }, - NormalizationTest { - source: "\u{FF74}", - nfc: "\u{FF74}", - nfd: "\u{FF74}", - nfkc: "\u{30A8}", - nfkd: "\u{30A8}", - }, - NormalizationTest { - source: "\u{FF75}", - nfc: "\u{FF75}", - nfd: "\u{FF75}", - nfkc: "\u{30AA}", - nfkd: "\u{30AA}", - }, - NormalizationTest { - source: "\u{FF76}", - nfc: "\u{FF76}", - nfd: "\u{FF76}", - nfkc: "\u{30AB}", - nfkd: "\u{30AB}", - }, - NormalizationTest { - source: "\u{FF77}", - nfc: "\u{FF77}", - nfd: "\u{FF77}", - nfkc: "\u{30AD}", - nfkd: "\u{30AD}", - }, - NormalizationTest { - source: "\u{FF78}", - nfc: "\u{FF78}", - nfd: "\u{FF78}", - nfkc: "\u{30AF}", - nfkd: "\u{30AF}", - }, - NormalizationTest { - source: "\u{FF79}", - nfc: "\u{FF79}", - nfd: "\u{FF79}", - nfkc: "\u{30B1}", - nfkd: "\u{30B1}", - }, - NormalizationTest { - source: "\u{FF7A}", - nfc: "\u{FF7A}", - nfd: "\u{FF7A}", - nfkc: "\u{30B3}", - nfkd: "\u{30B3}", - }, - NormalizationTest { - source: "\u{FF7B}", - nfc: "\u{FF7B}", - nfd: "\u{FF7B}", - nfkc: "\u{30B5}", - nfkd: "\u{30B5}", - }, - NormalizationTest { - source: "\u{FF7C}", - nfc: "\u{FF7C}", - nfd: "\u{FF7C}", - nfkc: "\u{30B7}", - nfkd: "\u{30B7}", - }, - NormalizationTest { - source: "\u{FF7D}", - nfc: "\u{FF7D}", - nfd: "\u{FF7D}", - nfkc: "\u{30B9}", - nfkd: "\u{30B9}", - }, - NormalizationTest { - source: "\u{FF7E}", - nfc: "\u{FF7E}", - nfd: "\u{FF7E}", - nfkc: "\u{30BB}", - nfkd: "\u{30BB}", - }, - NormalizationTest { - source: "\u{FF7F}", - nfc: "\u{FF7F}", - nfd: "\u{FF7F}", - nfkc: "\u{30BD}", - nfkd: "\u{30BD}", - }, - NormalizationTest { - source: "\u{FF80}", - nfc: "\u{FF80}", - nfd: "\u{FF80}", - nfkc: "\u{30BF}", - nfkd: "\u{30BF}", - }, - NormalizationTest { - source: "\u{FF81}", - nfc: "\u{FF81}", - nfd: "\u{FF81}", - nfkc: "\u{30C1}", - nfkd: "\u{30C1}", - }, - NormalizationTest { - source: "\u{FF82}", - nfc: "\u{FF82}", - nfd: "\u{FF82}", - nfkc: "\u{30C4}", - nfkd: "\u{30C4}", - }, - NormalizationTest { - source: "\u{FF83}", - nfc: "\u{FF83}", - nfd: "\u{FF83}", - nfkc: "\u{30C6}", - nfkd: "\u{30C6}", - }, - NormalizationTest { - source: "\u{FF84}", - nfc: "\u{FF84}", - nfd: "\u{FF84}", - nfkc: "\u{30C8}", - nfkd: "\u{30C8}", - }, - NormalizationTest { - source: "\u{FF85}", - nfc: "\u{FF85}", - nfd: "\u{FF85}", - nfkc: "\u{30CA}", - nfkd: "\u{30CA}", - }, - NormalizationTest { - source: "\u{FF86}", - nfc: "\u{FF86}", - nfd: "\u{FF86}", - nfkc: "\u{30CB}", - nfkd: "\u{30CB}", - }, - NormalizationTest { - source: "\u{FF87}", - nfc: "\u{FF87}", - nfd: "\u{FF87}", - nfkc: "\u{30CC}", - nfkd: "\u{30CC}", - }, - NormalizationTest { - source: "\u{FF88}", - nfc: "\u{FF88}", - nfd: "\u{FF88}", - nfkc: "\u{30CD}", - nfkd: "\u{30CD}", - }, - NormalizationTest { - source: "\u{FF89}", - nfc: "\u{FF89}", - nfd: "\u{FF89}", - nfkc: "\u{30CE}", - nfkd: "\u{30CE}", - }, - NormalizationTest { - source: "\u{FF8A}", - nfc: "\u{FF8A}", - nfd: "\u{FF8A}", - nfkc: "\u{30CF}", - nfkd: "\u{30CF}", - }, - NormalizationTest { - source: "\u{FF8B}", - nfc: "\u{FF8B}", - nfd: "\u{FF8B}", - nfkc: "\u{30D2}", - nfkd: "\u{30D2}", - }, - NormalizationTest { - source: "\u{FF8C}", - nfc: "\u{FF8C}", - nfd: "\u{FF8C}", - nfkc: "\u{30D5}", - nfkd: "\u{30D5}", - }, - NormalizationTest { - source: "\u{FF8D}", - nfc: "\u{FF8D}", - nfd: "\u{FF8D}", - nfkc: "\u{30D8}", - nfkd: "\u{30D8}", - }, - NormalizationTest { - source: "\u{FF8E}", - nfc: "\u{FF8E}", - nfd: "\u{FF8E}", - nfkc: "\u{30DB}", - nfkd: "\u{30DB}", - }, - NormalizationTest { - source: "\u{FF8F}", - nfc: "\u{FF8F}", - nfd: "\u{FF8F}", - nfkc: "\u{30DE}", - nfkd: "\u{30DE}", - }, - NormalizationTest { - source: "\u{FF90}", - nfc: "\u{FF90}", - nfd: "\u{FF90}", - nfkc: "\u{30DF}", - nfkd: "\u{30DF}", - }, - NormalizationTest { - source: "\u{FF91}", - nfc: "\u{FF91}", - nfd: "\u{FF91}", - nfkc: "\u{30E0}", - nfkd: "\u{30E0}", - }, - NormalizationTest { - source: "\u{FF92}", - nfc: "\u{FF92}", - nfd: "\u{FF92}", - nfkc: "\u{30E1}", - nfkd: "\u{30E1}", - }, - NormalizationTest { - source: "\u{FF93}", - nfc: "\u{FF93}", - nfd: "\u{FF93}", - nfkc: "\u{30E2}", - nfkd: "\u{30E2}", - }, - NormalizationTest { - source: "\u{FF94}", - nfc: "\u{FF94}", - nfd: "\u{FF94}", - nfkc: "\u{30E4}", - nfkd: "\u{30E4}", - }, - NormalizationTest { - source: "\u{FF95}", - nfc: "\u{FF95}", - nfd: "\u{FF95}", - nfkc: "\u{30E6}", - nfkd: "\u{30E6}", - }, - NormalizationTest { - source: "\u{FF96}", - nfc: "\u{FF96}", - nfd: "\u{FF96}", - nfkc: "\u{30E8}", - nfkd: "\u{30E8}", - }, - NormalizationTest { - source: "\u{FF97}", - nfc: "\u{FF97}", - nfd: "\u{FF97}", - nfkc: "\u{30E9}", - nfkd: "\u{30E9}", - }, - NormalizationTest { - source: "\u{FF98}", - nfc: "\u{FF98}", - nfd: "\u{FF98}", - nfkc: "\u{30EA}", - nfkd: "\u{30EA}", - }, - NormalizationTest { - source: "\u{FF99}", - nfc: "\u{FF99}", - nfd: "\u{FF99}", - nfkc: "\u{30EB}", - nfkd: "\u{30EB}", - }, - NormalizationTest { - source: "\u{FF9A}", - nfc: "\u{FF9A}", - nfd: "\u{FF9A}", - nfkc: "\u{30EC}", - nfkd: "\u{30EC}", - }, - NormalizationTest { - source: "\u{FF9B}", - nfc: "\u{FF9B}", - nfd: "\u{FF9B}", - nfkc: "\u{30ED}", - nfkd: "\u{30ED}", - }, - NormalizationTest { - source: "\u{FF9C}", - nfc: "\u{FF9C}", - nfd: "\u{FF9C}", - nfkc: "\u{30EF}", - nfkd: "\u{30EF}", - }, - NormalizationTest { - source: "\u{FF9D}", - nfc: "\u{FF9D}", - nfd: "\u{FF9D}", - nfkc: "\u{30F3}", - nfkd: "\u{30F3}", - }, - NormalizationTest { - source: "\u{FF9E}", - nfc: "\u{FF9E}", - nfd: "\u{FF9E}", - nfkc: "\u{3099}", - nfkd: "\u{3099}", - }, - NormalizationTest { - source: "\u{FF9F}", - nfc: "\u{FF9F}", - nfd: "\u{FF9F}", - nfkc: "\u{309A}", - nfkd: "\u{309A}", - }, - NormalizationTest { - source: "\u{FFA0}", - nfc: "\u{FFA0}", - nfd: "\u{FFA0}", - nfkc: "\u{1160}", - nfkd: "\u{1160}", - }, - NormalizationTest { - source: "\u{FFA1}", - nfc: "\u{FFA1}", - nfd: "\u{FFA1}", - nfkc: "\u{1100}", - nfkd: "\u{1100}", - }, - NormalizationTest { - source: "\u{FFA2}", - nfc: "\u{FFA2}", - nfd: "\u{FFA2}", - nfkc: "\u{1101}", - nfkd: "\u{1101}", - }, - NormalizationTest { - source: "\u{FFA3}", - nfc: "\u{FFA3}", - nfd: "\u{FFA3}", - nfkc: "\u{11AA}", - nfkd: "\u{11AA}", - }, - NormalizationTest { - source: "\u{FFA4}", - nfc: "\u{FFA4}", - nfd: "\u{FFA4}", - nfkc: "\u{1102}", - nfkd: "\u{1102}", - }, - NormalizationTest { - source: "\u{FFA5}", - nfc: "\u{FFA5}", - nfd: "\u{FFA5}", - nfkc: "\u{11AC}", - nfkd: "\u{11AC}", - }, - NormalizationTest { - source: "\u{FFA6}", - nfc: "\u{FFA6}", - nfd: "\u{FFA6}", - nfkc: "\u{11AD}", - nfkd: "\u{11AD}", - }, - NormalizationTest { - source: "\u{FFA7}", - nfc: "\u{FFA7}", - nfd: "\u{FFA7}", - nfkc: "\u{1103}", - nfkd: "\u{1103}", - }, - NormalizationTest { - source: "\u{FFA8}", - nfc: "\u{FFA8}", - nfd: "\u{FFA8}", - nfkc: "\u{1104}", - nfkd: "\u{1104}", - }, - NormalizationTest { - source: "\u{FFA9}", - nfc: "\u{FFA9}", - nfd: "\u{FFA9}", - nfkc: "\u{1105}", - nfkd: "\u{1105}", - }, - NormalizationTest { - source: "\u{FFAA}", - nfc: "\u{FFAA}", - nfd: "\u{FFAA}", - nfkc: "\u{11B0}", - nfkd: "\u{11B0}", - }, - NormalizationTest { - source: "\u{FFAB}", - nfc: "\u{FFAB}", - nfd: "\u{FFAB}", - nfkc: "\u{11B1}", - nfkd: "\u{11B1}", - }, - NormalizationTest { - source: "\u{FFAC}", - nfc: "\u{FFAC}", - nfd: "\u{FFAC}", - nfkc: "\u{11B2}", - nfkd: "\u{11B2}", - }, - NormalizationTest { - source: "\u{FFAD}", - nfc: "\u{FFAD}", - nfd: "\u{FFAD}", - nfkc: "\u{11B3}", - nfkd: "\u{11B3}", - }, - NormalizationTest { - source: "\u{FFAE}", - nfc: "\u{FFAE}", - nfd: "\u{FFAE}", - nfkc: "\u{11B4}", - nfkd: "\u{11B4}", - }, - NormalizationTest { - source: "\u{FFAF}", - nfc: "\u{FFAF}", - nfd: "\u{FFAF}", - nfkc: "\u{11B5}", - nfkd: "\u{11B5}", - }, - NormalizationTest { - source: "\u{FFB0}", - nfc: "\u{FFB0}", - nfd: "\u{FFB0}", - nfkc: "\u{111A}", - nfkd: "\u{111A}", - }, - NormalizationTest { - source: "\u{FFB1}", - nfc: "\u{FFB1}", - nfd: "\u{FFB1}", - nfkc: "\u{1106}", - nfkd: "\u{1106}", - }, - NormalizationTest { - source: "\u{FFB2}", - nfc: "\u{FFB2}", - nfd: "\u{FFB2}", - nfkc: "\u{1107}", - nfkd: "\u{1107}", - }, - NormalizationTest { - source: "\u{FFB3}", - nfc: "\u{FFB3}", - nfd: "\u{FFB3}", - nfkc: "\u{1108}", - nfkd: "\u{1108}", - }, - NormalizationTest { - source: "\u{FFB4}", - nfc: "\u{FFB4}", - nfd: "\u{FFB4}", - nfkc: "\u{1121}", - nfkd: "\u{1121}", - }, - NormalizationTest { - source: "\u{FFB5}", - nfc: "\u{FFB5}", - nfd: "\u{FFB5}", - nfkc: "\u{1109}", - nfkd: "\u{1109}", - }, - NormalizationTest { - source: "\u{FFB6}", - nfc: "\u{FFB6}", - nfd: "\u{FFB6}", - nfkc: "\u{110A}", - nfkd: "\u{110A}", - }, - NormalizationTest { - source: "\u{FFB7}", - nfc: "\u{FFB7}", - nfd: "\u{FFB7}", - nfkc: "\u{110B}", - nfkd: "\u{110B}", - }, - NormalizationTest { - source: "\u{FFB8}", - nfc: "\u{FFB8}", - nfd: "\u{FFB8}", - nfkc: "\u{110C}", - nfkd: "\u{110C}", - }, - NormalizationTest { - source: "\u{FFB9}", - nfc: "\u{FFB9}", - nfd: "\u{FFB9}", - nfkc: "\u{110D}", - nfkd: "\u{110D}", - }, - NormalizationTest { - source: "\u{FFBA}", - nfc: "\u{FFBA}", - nfd: "\u{FFBA}", - nfkc: "\u{110E}", - nfkd: "\u{110E}", - }, - NormalizationTest { - source: "\u{FFBB}", - nfc: "\u{FFBB}", - nfd: "\u{FFBB}", - nfkc: "\u{110F}", - nfkd: "\u{110F}", - }, - NormalizationTest { - source: "\u{FFBC}", - nfc: "\u{FFBC}", - nfd: "\u{FFBC}", - nfkc: "\u{1110}", - nfkd: "\u{1110}", - }, - NormalizationTest { - source: "\u{FFBD}", - nfc: "\u{FFBD}", - nfd: "\u{FFBD}", - nfkc: "\u{1111}", - nfkd: "\u{1111}", - }, - NormalizationTest { - source: "\u{FFBE}", - nfc: "\u{FFBE}", - nfd: "\u{FFBE}", - nfkc: "\u{1112}", - nfkd: "\u{1112}", - }, - NormalizationTest { - source: "\u{FFC2}", - nfc: "\u{FFC2}", - nfd: "\u{FFC2}", - nfkc: "\u{1161}", - nfkd: "\u{1161}", - }, - NormalizationTest { - source: "\u{FFC3}", - nfc: "\u{FFC3}", - nfd: "\u{FFC3}", - nfkc: "\u{1162}", - nfkd: "\u{1162}", - }, - NormalizationTest { - source: "\u{FFC4}", - nfc: "\u{FFC4}", - nfd: "\u{FFC4}", - nfkc: "\u{1163}", - nfkd: "\u{1163}", - }, - NormalizationTest { - source: "\u{FFC5}", - nfc: "\u{FFC5}", - nfd: "\u{FFC5}", - nfkc: "\u{1164}", - nfkd: "\u{1164}", - }, - NormalizationTest { - source: "\u{FFC6}", - nfc: "\u{FFC6}", - nfd: "\u{FFC6}", - nfkc: "\u{1165}", - nfkd: "\u{1165}", - }, - NormalizationTest { - source: "\u{FFC7}", - nfc: "\u{FFC7}", - nfd: "\u{FFC7}", - nfkc: "\u{1166}", - nfkd: "\u{1166}", - }, - NormalizationTest { - source: "\u{FFCA}", - nfc: "\u{FFCA}", - nfd: "\u{FFCA}", - nfkc: "\u{1167}", - nfkd: "\u{1167}", - }, - NormalizationTest { - source: "\u{FFCB}", - nfc: "\u{FFCB}", - nfd: "\u{FFCB}", - nfkc: "\u{1168}", - nfkd: "\u{1168}", - }, - NormalizationTest { - source: "\u{FFCC}", - nfc: "\u{FFCC}", - nfd: "\u{FFCC}", - nfkc: "\u{1169}", - nfkd: "\u{1169}", - }, - NormalizationTest { - source: "\u{FFCD}", - nfc: "\u{FFCD}", - nfd: "\u{FFCD}", - nfkc: "\u{116A}", - nfkd: "\u{116A}", - }, - NormalizationTest { - source: "\u{FFCE}", - nfc: "\u{FFCE}", - nfd: "\u{FFCE}", - nfkc: "\u{116B}", - nfkd: "\u{116B}", - }, - NormalizationTest { - source: "\u{FFCF}", - nfc: "\u{FFCF}", - nfd: "\u{FFCF}", - nfkc: "\u{116C}", - nfkd: "\u{116C}", - }, - NormalizationTest { - source: "\u{FFD2}", - nfc: "\u{FFD2}", - nfd: "\u{FFD2}", - nfkc: "\u{116D}", - nfkd: "\u{116D}", - }, - NormalizationTest { - source: "\u{FFD3}", - nfc: "\u{FFD3}", - nfd: "\u{FFD3}", - nfkc: "\u{116E}", - nfkd: "\u{116E}", - }, - NormalizationTest { - source: "\u{FFD4}", - nfc: "\u{FFD4}", - nfd: "\u{FFD4}", - nfkc: "\u{116F}", - nfkd: "\u{116F}", - }, - NormalizationTest { - source: "\u{FFD5}", - nfc: "\u{FFD5}", - nfd: "\u{FFD5}", - nfkc: "\u{1170}", - nfkd: "\u{1170}", - }, - NormalizationTest { - source: "\u{FFD6}", - nfc: "\u{FFD6}", - nfd: "\u{FFD6}", - nfkc: "\u{1171}", - nfkd: "\u{1171}", - }, - NormalizationTest { - source: "\u{FFD7}", - nfc: "\u{FFD7}", - nfd: "\u{FFD7}", - nfkc: "\u{1172}", - nfkd: "\u{1172}", - }, - NormalizationTest { - source: "\u{FFDA}", - nfc: "\u{FFDA}", - nfd: "\u{FFDA}", - nfkc: "\u{1173}", - nfkd: "\u{1173}", - }, - NormalizationTest { - source: "\u{FFDB}", - nfc: "\u{FFDB}", - nfd: "\u{FFDB}", - nfkc: "\u{1174}", - nfkd: "\u{1174}", - }, - NormalizationTest { - source: "\u{FFDC}", - nfc: "\u{FFDC}", - nfd: "\u{FFDC}", - nfkc: "\u{1175}", - nfkd: "\u{1175}", - }, - NormalizationTest { - source: "\u{FFE0}", - nfc: "\u{FFE0}", - nfd: "\u{FFE0}", - nfkc: "\u{00A2}", - nfkd: "\u{00A2}", - }, - NormalizationTest { - source: "\u{FFE1}", - nfc: "\u{FFE1}", - nfd: "\u{FFE1}", - nfkc: "\u{00A3}", - nfkd: "\u{00A3}", - }, - NormalizationTest { - source: "\u{FFE2}", - nfc: "\u{FFE2}", - nfd: "\u{FFE2}", - nfkc: "\u{00AC}", - nfkd: "\u{00AC}", - }, - NormalizationTest { - source: "\u{FFE3}", - nfc: "\u{FFE3}", - nfd: "\u{FFE3}", - nfkc: "\u{0020}\u{0304}", - nfkd: "\u{0020}\u{0304}", - }, - NormalizationTest { - source: "\u{FFE4}", - nfc: "\u{FFE4}", - nfd: "\u{FFE4}", - nfkc: "\u{00A6}", - nfkd: "\u{00A6}", - }, - NormalizationTest { - source: "\u{FFE5}", - nfc: "\u{FFE5}", - nfd: "\u{FFE5}", - nfkc: "\u{00A5}", - nfkd: "\u{00A5}", - }, - NormalizationTest { - source: "\u{FFE6}", - nfc: "\u{FFE6}", - nfd: "\u{FFE6}", - nfkc: "\u{20A9}", - nfkd: "\u{20A9}", - }, - NormalizationTest { - source: "\u{FFE8}", - nfc: "\u{FFE8}", - nfd: "\u{FFE8}", - nfkc: "\u{2502}", - nfkd: "\u{2502}", - }, - NormalizationTest { - source: "\u{FFE9}", - nfc: "\u{FFE9}", - nfd: "\u{FFE9}", - nfkc: "\u{2190}", - nfkd: "\u{2190}", - }, - NormalizationTest { - source: "\u{FFEA}", - nfc: "\u{FFEA}", - nfd: "\u{FFEA}", - nfkc: "\u{2191}", - nfkd: "\u{2191}", - }, - NormalizationTest { - source: "\u{FFEB}", - nfc: "\u{FFEB}", - nfd: "\u{FFEB}", - nfkc: "\u{2192}", - nfkd: "\u{2192}", - }, - NormalizationTest { - source: "\u{FFEC}", - nfc: "\u{FFEC}", - nfd: "\u{FFEC}", - nfkc: "\u{2193}", - nfkd: "\u{2193}", - }, - NormalizationTest { - source: "\u{FFED}", - nfc: "\u{FFED}", - nfd: "\u{FFED}", - nfkc: "\u{25A0}", - nfkd: "\u{25A0}", - }, - NormalizationTest { - source: "\u{FFEE}", - nfc: "\u{FFEE}", - nfd: "\u{FFEE}", - nfkc: "\u{25CB}", - nfkd: "\u{25CB}", - }, - NormalizationTest { - source: "\u{1109A}", - nfc: "\u{1109A}", - nfd: "\u{11099}\u{110BA}", - nfkc: "\u{1109A}", - nfkd: "\u{11099}\u{110BA}", - }, - NormalizationTest { - source: "\u{1109C}", - nfc: "\u{1109C}", - nfd: "\u{1109B}\u{110BA}", - nfkc: "\u{1109C}", - nfkd: "\u{1109B}\u{110BA}", - }, - NormalizationTest { - source: "\u{110AB}", - nfc: "\u{110AB}", - nfd: "\u{110A5}\u{110BA}", - nfkc: "\u{110AB}", - nfkd: "\u{110A5}\u{110BA}", - }, - NormalizationTest { - source: "\u{1112E}", - nfc: "\u{1112E}", - nfd: "\u{11131}\u{11127}", - nfkc: "\u{1112E}", - nfkd: "\u{11131}\u{11127}", - }, - NormalizationTest { - source: "\u{1112F}", - nfc: "\u{1112F}", - nfd: "\u{11132}\u{11127}", - nfkc: "\u{1112F}", - nfkd: "\u{11132}\u{11127}", - }, - NormalizationTest { - source: "\u{1134B}", - nfc: "\u{1134B}", - nfd: "\u{11347}\u{1133E}", - nfkc: "\u{1134B}", - nfkd: "\u{11347}\u{1133E}", - }, - NormalizationTest { - source: "\u{1134C}", - nfc: "\u{1134C}", - nfd: "\u{11347}\u{11357}", - nfkc: "\u{1134C}", - nfkd: "\u{11347}\u{11357}", - }, - NormalizationTest { - source: "\u{114BB}", - nfc: "\u{114BB}", - nfd: "\u{114B9}\u{114BA}", - nfkc: "\u{114BB}", - nfkd: "\u{114B9}\u{114BA}", - }, - NormalizationTest { - source: "\u{114BC}", - nfc: "\u{114BC}", - nfd: "\u{114B9}\u{114B0}", - nfkc: "\u{114BC}", - nfkd: "\u{114B9}\u{114B0}", - }, - NormalizationTest { - source: "\u{114BE}", - nfc: "\u{114BE}", - nfd: "\u{114B9}\u{114BD}", - nfkc: "\u{114BE}", - nfkd: "\u{114B9}\u{114BD}", - }, - NormalizationTest { - source: "\u{115BA}", - nfc: "\u{115BA}", - nfd: "\u{115B8}\u{115AF}", - nfkc: "\u{115BA}", - nfkd: "\u{115B8}\u{115AF}", - }, - NormalizationTest { - source: "\u{115BB}", - nfc: "\u{115BB}", - nfd: "\u{115B9}\u{115AF}", - nfkc: "\u{115BB}", - nfkd: "\u{115B9}\u{115AF}", - }, - NormalizationTest { - source: "\u{1D15E}", - nfc: "\u{1D157}\u{1D165}", - nfd: "\u{1D157}\u{1D165}", - nfkc: "\u{1D157}\u{1D165}", - nfkd: "\u{1D157}\u{1D165}", - }, - NormalizationTest { - source: "\u{1D15F}", - nfc: "\u{1D158}\u{1D165}", - nfd: "\u{1D158}\u{1D165}", - nfkc: "\u{1D158}\u{1D165}", - nfkd: "\u{1D158}\u{1D165}", - }, - NormalizationTest { - source: "\u{1D160}", - nfc: "\u{1D158}\u{1D165}\u{1D16E}", - nfd: "\u{1D158}\u{1D165}\u{1D16E}", - nfkc: "\u{1D158}\u{1D165}\u{1D16E}", - nfkd: "\u{1D158}\u{1D165}\u{1D16E}", - }, - NormalizationTest { - source: "\u{1D161}", - nfc: "\u{1D158}\u{1D165}\u{1D16F}", - nfd: "\u{1D158}\u{1D165}\u{1D16F}", - nfkc: "\u{1D158}\u{1D165}\u{1D16F}", - nfkd: "\u{1D158}\u{1D165}\u{1D16F}", - }, - NormalizationTest { - source: "\u{1D162}", - nfc: "\u{1D158}\u{1D165}\u{1D170}", - nfd: "\u{1D158}\u{1D165}\u{1D170}", - nfkc: "\u{1D158}\u{1D165}\u{1D170}", - nfkd: "\u{1D158}\u{1D165}\u{1D170}", - }, - NormalizationTest { - source: "\u{1D163}", - nfc: "\u{1D158}\u{1D165}\u{1D171}", - nfd: "\u{1D158}\u{1D165}\u{1D171}", - nfkc: "\u{1D158}\u{1D165}\u{1D171}", - nfkd: "\u{1D158}\u{1D165}\u{1D171}", - }, - NormalizationTest { - source: "\u{1D164}", - nfc: "\u{1D158}\u{1D165}\u{1D172}", - nfd: "\u{1D158}\u{1D165}\u{1D172}", - nfkc: "\u{1D158}\u{1D165}\u{1D172}", - nfkd: "\u{1D158}\u{1D165}\u{1D172}", - }, - NormalizationTest { - source: "\u{1D1BB}", - nfc: "\u{1D1B9}\u{1D165}", - nfd: "\u{1D1B9}\u{1D165}", - nfkc: "\u{1D1B9}\u{1D165}", - nfkd: "\u{1D1B9}\u{1D165}", - }, - NormalizationTest { - source: "\u{1D1BC}", - nfc: "\u{1D1BA}\u{1D165}", - nfd: "\u{1D1BA}\u{1D165}", - nfkc: "\u{1D1BA}\u{1D165}", - nfkd: "\u{1D1BA}\u{1D165}", - }, - NormalizationTest { - source: "\u{1D1BD}", - nfc: "\u{1D1B9}\u{1D165}\u{1D16E}", - nfd: "\u{1D1B9}\u{1D165}\u{1D16E}", - nfkc: "\u{1D1B9}\u{1D165}\u{1D16E}", - nfkd: "\u{1D1B9}\u{1D165}\u{1D16E}", - }, - NormalizationTest { - source: "\u{1D1BE}", - nfc: "\u{1D1BA}\u{1D165}\u{1D16E}", - nfd: "\u{1D1BA}\u{1D165}\u{1D16E}", - nfkc: "\u{1D1BA}\u{1D165}\u{1D16E}", - nfkd: "\u{1D1BA}\u{1D165}\u{1D16E}", - }, - NormalizationTest { - source: "\u{1D1BF}", - nfc: "\u{1D1B9}\u{1D165}\u{1D16F}", - nfd: "\u{1D1B9}\u{1D165}\u{1D16F}", - nfkc: "\u{1D1B9}\u{1D165}\u{1D16F}", - nfkd: "\u{1D1B9}\u{1D165}\u{1D16F}", - }, - NormalizationTest { - source: "\u{1D1C0}", - nfc: "\u{1D1BA}\u{1D165}\u{1D16F}", - nfd: "\u{1D1BA}\u{1D165}\u{1D16F}", - nfkc: "\u{1D1BA}\u{1D165}\u{1D16F}", - nfkd: "\u{1D1BA}\u{1D165}\u{1D16F}", - }, - NormalizationTest { - source: "\u{1D400}", - nfc: "\u{1D400}", - nfd: "\u{1D400}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D401}", - nfc: "\u{1D401}", - nfd: "\u{1D401}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D402}", - nfc: "\u{1D402}", - nfd: "\u{1D402}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D403}", - nfc: "\u{1D403}", - nfd: "\u{1D403}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D404}", - nfc: "\u{1D404}", - nfd: "\u{1D404}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D405}", - nfc: "\u{1D405}", - nfd: "\u{1D405}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D406}", - nfc: "\u{1D406}", - nfd: "\u{1D406}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D407}", - nfc: "\u{1D407}", - nfd: "\u{1D407}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D408}", - nfc: "\u{1D408}", - nfd: "\u{1D408}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D409}", - nfc: "\u{1D409}", - nfd: "\u{1D409}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D40A}", - nfc: "\u{1D40A}", - nfd: "\u{1D40A}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D40B}", - nfc: "\u{1D40B}", - nfd: "\u{1D40B}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D40C}", - nfc: "\u{1D40C}", - nfd: "\u{1D40C}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D40D}", - nfc: "\u{1D40D}", - nfd: "\u{1D40D}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D40E}", - nfc: "\u{1D40E}", - nfd: "\u{1D40E}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D40F}", - nfc: "\u{1D40F}", - nfd: "\u{1D40F}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D410}", - nfc: "\u{1D410}", - nfd: "\u{1D410}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D411}", - nfc: "\u{1D411}", - nfd: "\u{1D411}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D412}", - nfc: "\u{1D412}", - nfd: "\u{1D412}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D413}", - nfc: "\u{1D413}", - nfd: "\u{1D413}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D414}", - nfc: "\u{1D414}", - nfd: "\u{1D414}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D415}", - nfc: "\u{1D415}", - nfd: "\u{1D415}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D416}", - nfc: "\u{1D416}", - nfd: "\u{1D416}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D417}", - nfc: "\u{1D417}", - nfd: "\u{1D417}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D418}", - nfc: "\u{1D418}", - nfd: "\u{1D418}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D419}", - nfc: "\u{1D419}", - nfd: "\u{1D419}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D41A}", - nfc: "\u{1D41A}", - nfd: "\u{1D41A}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D41B}", - nfc: "\u{1D41B}", - nfd: "\u{1D41B}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D41C}", - nfc: "\u{1D41C}", - nfd: "\u{1D41C}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D41D}", - nfc: "\u{1D41D}", - nfd: "\u{1D41D}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D41E}", - nfc: "\u{1D41E}", - nfd: "\u{1D41E}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D41F}", - nfc: "\u{1D41F}", - nfd: "\u{1D41F}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D420}", - nfc: "\u{1D420}", - nfd: "\u{1D420}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D421}", - nfc: "\u{1D421}", - nfd: "\u{1D421}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D422}", - nfc: "\u{1D422}", - nfd: "\u{1D422}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D423}", - nfc: "\u{1D423}", - nfd: "\u{1D423}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D424}", - nfc: "\u{1D424}", - nfd: "\u{1D424}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D425}", - nfc: "\u{1D425}", - nfd: "\u{1D425}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D426}", - nfc: "\u{1D426}", - nfd: "\u{1D426}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D427}", - nfc: "\u{1D427}", - nfd: "\u{1D427}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D428}", - nfc: "\u{1D428}", - nfd: "\u{1D428}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D429}", - nfc: "\u{1D429}", - nfd: "\u{1D429}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D42A}", - nfc: "\u{1D42A}", - nfd: "\u{1D42A}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D42B}", - nfc: "\u{1D42B}", - nfd: "\u{1D42B}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D42C}", - nfc: "\u{1D42C}", - nfd: "\u{1D42C}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D42D}", - nfc: "\u{1D42D}", - nfd: "\u{1D42D}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D42E}", - nfc: "\u{1D42E}", - nfd: "\u{1D42E}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D42F}", - nfc: "\u{1D42F}", - nfd: "\u{1D42F}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D430}", - nfc: "\u{1D430}", - nfd: "\u{1D430}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D431}", - nfc: "\u{1D431}", - nfd: "\u{1D431}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D432}", - nfc: "\u{1D432}", - nfd: "\u{1D432}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D433}", - nfc: "\u{1D433}", - nfd: "\u{1D433}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D434}", - nfc: "\u{1D434}", - nfd: "\u{1D434}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D435}", - nfc: "\u{1D435}", - nfd: "\u{1D435}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D436}", - nfc: "\u{1D436}", - nfd: "\u{1D436}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D437}", - nfc: "\u{1D437}", - nfd: "\u{1D437}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D438}", - nfc: "\u{1D438}", - nfd: "\u{1D438}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D439}", - nfc: "\u{1D439}", - nfd: "\u{1D439}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D43A}", - nfc: "\u{1D43A}", - nfd: "\u{1D43A}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D43B}", - nfc: "\u{1D43B}", - nfd: "\u{1D43B}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D43C}", - nfc: "\u{1D43C}", - nfd: "\u{1D43C}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D43D}", - nfc: "\u{1D43D}", - nfd: "\u{1D43D}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D43E}", - nfc: "\u{1D43E}", - nfd: "\u{1D43E}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D43F}", - nfc: "\u{1D43F}", - nfd: "\u{1D43F}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D440}", - nfc: "\u{1D440}", - nfd: "\u{1D440}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D441}", - nfc: "\u{1D441}", - nfd: "\u{1D441}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D442}", - nfc: "\u{1D442}", - nfd: "\u{1D442}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D443}", - nfc: "\u{1D443}", - nfd: "\u{1D443}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D444}", - nfc: "\u{1D444}", - nfd: "\u{1D444}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D445}", - nfc: "\u{1D445}", - nfd: "\u{1D445}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D446}", - nfc: "\u{1D446}", - nfd: "\u{1D446}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D447}", - nfc: "\u{1D447}", - nfd: "\u{1D447}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D448}", - nfc: "\u{1D448}", - nfd: "\u{1D448}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D449}", - nfc: "\u{1D449}", - nfd: "\u{1D449}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D44A}", - nfc: "\u{1D44A}", - nfd: "\u{1D44A}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D44B}", - nfc: "\u{1D44B}", - nfd: "\u{1D44B}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D44C}", - nfc: "\u{1D44C}", - nfd: "\u{1D44C}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D44D}", - nfc: "\u{1D44D}", - nfd: "\u{1D44D}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D44E}", - nfc: "\u{1D44E}", - nfd: "\u{1D44E}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D44F}", - nfc: "\u{1D44F}", - nfd: "\u{1D44F}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D450}", - nfc: "\u{1D450}", - nfd: "\u{1D450}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D451}", - nfc: "\u{1D451}", - nfd: "\u{1D451}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D452}", - nfc: "\u{1D452}", - nfd: "\u{1D452}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D453}", - nfc: "\u{1D453}", - nfd: "\u{1D453}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D454}", - nfc: "\u{1D454}", - nfd: "\u{1D454}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D456}", - nfc: "\u{1D456}", - nfd: "\u{1D456}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D457}", - nfc: "\u{1D457}", - nfd: "\u{1D457}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D458}", - nfc: "\u{1D458}", - nfd: "\u{1D458}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D459}", - nfc: "\u{1D459}", - nfd: "\u{1D459}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D45A}", - nfc: "\u{1D45A}", - nfd: "\u{1D45A}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D45B}", - nfc: "\u{1D45B}", - nfd: "\u{1D45B}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D45C}", - nfc: "\u{1D45C}", - nfd: "\u{1D45C}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D45D}", - nfc: "\u{1D45D}", - nfd: "\u{1D45D}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D45E}", - nfc: "\u{1D45E}", - nfd: "\u{1D45E}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D45F}", - nfc: "\u{1D45F}", - nfd: "\u{1D45F}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D460}", - nfc: "\u{1D460}", - nfd: "\u{1D460}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D461}", - nfc: "\u{1D461}", - nfd: "\u{1D461}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D462}", - nfc: "\u{1D462}", - nfd: "\u{1D462}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D463}", - nfc: "\u{1D463}", - nfd: "\u{1D463}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D464}", - nfc: "\u{1D464}", - nfd: "\u{1D464}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D465}", - nfc: "\u{1D465}", - nfd: "\u{1D465}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D466}", - nfc: "\u{1D466}", - nfd: "\u{1D466}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D467}", - nfc: "\u{1D467}", - nfd: "\u{1D467}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D468}", - nfc: "\u{1D468}", - nfd: "\u{1D468}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D469}", - nfc: "\u{1D469}", - nfd: "\u{1D469}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D46A}", - nfc: "\u{1D46A}", - nfd: "\u{1D46A}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D46B}", - nfc: "\u{1D46B}", - nfd: "\u{1D46B}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D46C}", - nfc: "\u{1D46C}", - nfd: "\u{1D46C}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D46D}", - nfc: "\u{1D46D}", - nfd: "\u{1D46D}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D46E}", - nfc: "\u{1D46E}", - nfd: "\u{1D46E}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D46F}", - nfc: "\u{1D46F}", - nfd: "\u{1D46F}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D470}", - nfc: "\u{1D470}", - nfd: "\u{1D470}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D471}", - nfc: "\u{1D471}", - nfd: "\u{1D471}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D472}", - nfc: "\u{1D472}", - nfd: "\u{1D472}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D473}", - nfc: "\u{1D473}", - nfd: "\u{1D473}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D474}", - nfc: "\u{1D474}", - nfd: "\u{1D474}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D475}", - nfc: "\u{1D475}", - nfd: "\u{1D475}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D476}", - nfc: "\u{1D476}", - nfd: "\u{1D476}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D477}", - nfc: "\u{1D477}", - nfd: "\u{1D477}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D478}", - nfc: "\u{1D478}", - nfd: "\u{1D478}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D479}", - nfc: "\u{1D479}", - nfd: "\u{1D479}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D47A}", - nfc: "\u{1D47A}", - nfd: "\u{1D47A}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D47B}", - nfc: "\u{1D47B}", - nfd: "\u{1D47B}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D47C}", - nfc: "\u{1D47C}", - nfd: "\u{1D47C}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D47D}", - nfc: "\u{1D47D}", - nfd: "\u{1D47D}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D47E}", - nfc: "\u{1D47E}", - nfd: "\u{1D47E}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D47F}", - nfc: "\u{1D47F}", - nfd: "\u{1D47F}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D480}", - nfc: "\u{1D480}", - nfd: "\u{1D480}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D481}", - nfc: "\u{1D481}", - nfd: "\u{1D481}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D482}", - nfc: "\u{1D482}", - nfd: "\u{1D482}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D483}", - nfc: "\u{1D483}", - nfd: "\u{1D483}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D484}", - nfc: "\u{1D484}", - nfd: "\u{1D484}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D485}", - nfc: "\u{1D485}", - nfd: "\u{1D485}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D486}", - nfc: "\u{1D486}", - nfd: "\u{1D486}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D487}", - nfc: "\u{1D487}", - nfd: "\u{1D487}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D488}", - nfc: "\u{1D488}", - nfd: "\u{1D488}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D489}", - nfc: "\u{1D489}", - nfd: "\u{1D489}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D48A}", - nfc: "\u{1D48A}", - nfd: "\u{1D48A}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D48B}", - nfc: "\u{1D48B}", - nfd: "\u{1D48B}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D48C}", - nfc: "\u{1D48C}", - nfd: "\u{1D48C}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D48D}", - nfc: "\u{1D48D}", - nfd: "\u{1D48D}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D48E}", - nfc: "\u{1D48E}", - nfd: "\u{1D48E}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D48F}", - nfc: "\u{1D48F}", - nfd: "\u{1D48F}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D490}", - nfc: "\u{1D490}", - nfd: "\u{1D490}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D491}", - nfc: "\u{1D491}", - nfd: "\u{1D491}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D492}", - nfc: "\u{1D492}", - nfd: "\u{1D492}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D493}", - nfc: "\u{1D493}", - nfd: "\u{1D493}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D494}", - nfc: "\u{1D494}", - nfd: "\u{1D494}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D495}", - nfc: "\u{1D495}", - nfd: "\u{1D495}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D496}", - nfc: "\u{1D496}", - nfd: "\u{1D496}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D497}", - nfc: "\u{1D497}", - nfd: "\u{1D497}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D498}", - nfc: "\u{1D498}", - nfd: "\u{1D498}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D499}", - nfc: "\u{1D499}", - nfd: "\u{1D499}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D49A}", - nfc: "\u{1D49A}", - nfd: "\u{1D49A}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D49B}", - nfc: "\u{1D49B}", - nfd: "\u{1D49B}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D49C}", - nfc: "\u{1D49C}", - nfd: "\u{1D49C}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D49E}", - nfc: "\u{1D49E}", - nfd: "\u{1D49E}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D49F}", - nfc: "\u{1D49F}", - nfd: "\u{1D49F}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D4A2}", - nfc: "\u{1D4A2}", - nfd: "\u{1D4A2}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D4A5}", - nfc: "\u{1D4A5}", - nfd: "\u{1D4A5}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D4A6}", - nfc: "\u{1D4A6}", - nfd: "\u{1D4A6}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D4A9}", - nfc: "\u{1D4A9}", - nfd: "\u{1D4A9}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D4AA}", - nfc: "\u{1D4AA}", - nfd: "\u{1D4AA}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D4AB}", - nfc: "\u{1D4AB}", - nfd: "\u{1D4AB}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D4AC}", - nfc: "\u{1D4AC}", - nfd: "\u{1D4AC}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D4AE}", - nfc: "\u{1D4AE}", - nfd: "\u{1D4AE}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D4AF}", - nfc: "\u{1D4AF}", - nfd: "\u{1D4AF}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D4B0}", - nfc: "\u{1D4B0}", - nfd: "\u{1D4B0}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D4B1}", - nfc: "\u{1D4B1}", - nfd: "\u{1D4B1}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D4B2}", - nfc: "\u{1D4B2}", - nfd: "\u{1D4B2}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D4B3}", - nfc: "\u{1D4B3}", - nfd: "\u{1D4B3}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D4B4}", - nfc: "\u{1D4B4}", - nfd: "\u{1D4B4}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D4B5}", - nfc: "\u{1D4B5}", - nfd: "\u{1D4B5}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D4B6}", - nfc: "\u{1D4B6}", - nfd: "\u{1D4B6}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D4B7}", - nfc: "\u{1D4B7}", - nfd: "\u{1D4B7}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D4B8}", - nfc: "\u{1D4B8}", - nfd: "\u{1D4B8}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D4B9}", - nfc: "\u{1D4B9}", - nfd: "\u{1D4B9}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D4BB}", - nfc: "\u{1D4BB}", - nfd: "\u{1D4BB}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D4BD}", - nfc: "\u{1D4BD}", - nfd: "\u{1D4BD}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D4BE}", - nfc: "\u{1D4BE}", - nfd: "\u{1D4BE}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D4BF}", - nfc: "\u{1D4BF}", - nfd: "\u{1D4BF}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D4C0}", - nfc: "\u{1D4C0}", - nfd: "\u{1D4C0}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D4C1}", - nfc: "\u{1D4C1}", - nfd: "\u{1D4C1}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D4C2}", - nfc: "\u{1D4C2}", - nfd: "\u{1D4C2}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D4C3}", - nfc: "\u{1D4C3}", - nfd: "\u{1D4C3}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D4C5}", - nfc: "\u{1D4C5}", - nfd: "\u{1D4C5}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D4C6}", - nfc: "\u{1D4C6}", - nfd: "\u{1D4C6}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D4C7}", - nfc: "\u{1D4C7}", - nfd: "\u{1D4C7}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D4C8}", - nfc: "\u{1D4C8}", - nfd: "\u{1D4C8}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D4C9}", - nfc: "\u{1D4C9}", - nfd: "\u{1D4C9}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D4CA}", - nfc: "\u{1D4CA}", - nfd: "\u{1D4CA}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D4CB}", - nfc: "\u{1D4CB}", - nfd: "\u{1D4CB}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D4CC}", - nfc: "\u{1D4CC}", - nfd: "\u{1D4CC}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D4CD}", - nfc: "\u{1D4CD}", - nfd: "\u{1D4CD}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D4CE}", - nfc: "\u{1D4CE}", - nfd: "\u{1D4CE}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D4CF}", - nfc: "\u{1D4CF}", - nfd: "\u{1D4CF}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D4D0}", - nfc: "\u{1D4D0}", - nfd: "\u{1D4D0}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D4D1}", - nfc: "\u{1D4D1}", - nfd: "\u{1D4D1}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D4D2}", - nfc: "\u{1D4D2}", - nfd: "\u{1D4D2}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D4D3}", - nfc: "\u{1D4D3}", - nfd: "\u{1D4D3}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D4D4}", - nfc: "\u{1D4D4}", - nfd: "\u{1D4D4}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D4D5}", - nfc: "\u{1D4D5}", - nfd: "\u{1D4D5}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D4D6}", - nfc: "\u{1D4D6}", - nfd: "\u{1D4D6}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D4D7}", - nfc: "\u{1D4D7}", - nfd: "\u{1D4D7}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D4D8}", - nfc: "\u{1D4D8}", - nfd: "\u{1D4D8}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D4D9}", - nfc: "\u{1D4D9}", - nfd: "\u{1D4D9}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D4DA}", - nfc: "\u{1D4DA}", - nfd: "\u{1D4DA}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D4DB}", - nfc: "\u{1D4DB}", - nfd: "\u{1D4DB}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D4DC}", - nfc: "\u{1D4DC}", - nfd: "\u{1D4DC}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D4DD}", - nfc: "\u{1D4DD}", - nfd: "\u{1D4DD}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D4DE}", - nfc: "\u{1D4DE}", - nfd: "\u{1D4DE}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D4DF}", - nfc: "\u{1D4DF}", - nfd: "\u{1D4DF}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D4E0}", - nfc: "\u{1D4E0}", - nfd: "\u{1D4E0}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D4E1}", - nfc: "\u{1D4E1}", - nfd: "\u{1D4E1}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D4E2}", - nfc: "\u{1D4E2}", - nfd: "\u{1D4E2}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D4E3}", - nfc: "\u{1D4E3}", - nfd: "\u{1D4E3}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D4E4}", - nfc: "\u{1D4E4}", - nfd: "\u{1D4E4}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D4E5}", - nfc: "\u{1D4E5}", - nfd: "\u{1D4E5}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D4E6}", - nfc: "\u{1D4E6}", - nfd: "\u{1D4E6}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D4E7}", - nfc: "\u{1D4E7}", - nfd: "\u{1D4E7}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D4E8}", - nfc: "\u{1D4E8}", - nfd: "\u{1D4E8}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D4E9}", - nfc: "\u{1D4E9}", - nfd: "\u{1D4E9}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D4EA}", - nfc: "\u{1D4EA}", - nfd: "\u{1D4EA}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D4EB}", - nfc: "\u{1D4EB}", - nfd: "\u{1D4EB}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D4EC}", - nfc: "\u{1D4EC}", - nfd: "\u{1D4EC}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D4ED}", - nfc: "\u{1D4ED}", - nfd: "\u{1D4ED}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D4EE}", - nfc: "\u{1D4EE}", - nfd: "\u{1D4EE}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D4EF}", - nfc: "\u{1D4EF}", - nfd: "\u{1D4EF}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D4F0}", - nfc: "\u{1D4F0}", - nfd: "\u{1D4F0}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D4F1}", - nfc: "\u{1D4F1}", - nfd: "\u{1D4F1}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D4F2}", - nfc: "\u{1D4F2}", - nfd: "\u{1D4F2}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D4F3}", - nfc: "\u{1D4F3}", - nfd: "\u{1D4F3}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D4F4}", - nfc: "\u{1D4F4}", - nfd: "\u{1D4F4}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D4F5}", - nfc: "\u{1D4F5}", - nfd: "\u{1D4F5}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D4F6}", - nfc: "\u{1D4F6}", - nfd: "\u{1D4F6}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D4F7}", - nfc: "\u{1D4F7}", - nfd: "\u{1D4F7}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D4F8}", - nfc: "\u{1D4F8}", - nfd: "\u{1D4F8}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D4F9}", - nfc: "\u{1D4F9}", - nfd: "\u{1D4F9}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D4FA}", - nfc: "\u{1D4FA}", - nfd: "\u{1D4FA}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D4FB}", - nfc: "\u{1D4FB}", - nfd: "\u{1D4FB}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D4FC}", - nfc: "\u{1D4FC}", - nfd: "\u{1D4FC}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D4FD}", - nfc: "\u{1D4FD}", - nfd: "\u{1D4FD}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D4FE}", - nfc: "\u{1D4FE}", - nfd: "\u{1D4FE}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D4FF}", - nfc: "\u{1D4FF}", - nfd: "\u{1D4FF}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D500}", - nfc: "\u{1D500}", - nfd: "\u{1D500}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D501}", - nfc: "\u{1D501}", - nfd: "\u{1D501}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D502}", - nfc: "\u{1D502}", - nfd: "\u{1D502}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D503}", - nfc: "\u{1D503}", - nfd: "\u{1D503}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D504}", - nfc: "\u{1D504}", - nfd: "\u{1D504}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D505}", - nfc: "\u{1D505}", - nfd: "\u{1D505}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D507}", - nfc: "\u{1D507}", - nfd: "\u{1D507}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D508}", - nfc: "\u{1D508}", - nfd: "\u{1D508}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D509}", - nfc: "\u{1D509}", - nfd: "\u{1D509}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D50A}", - nfc: "\u{1D50A}", - nfd: "\u{1D50A}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D50D}", - nfc: "\u{1D50D}", - nfd: "\u{1D50D}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D50E}", - nfc: "\u{1D50E}", - nfd: "\u{1D50E}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D50F}", - nfc: "\u{1D50F}", - nfd: "\u{1D50F}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D510}", - nfc: "\u{1D510}", - nfd: "\u{1D510}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D511}", - nfc: "\u{1D511}", - nfd: "\u{1D511}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D512}", - nfc: "\u{1D512}", - nfd: "\u{1D512}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D513}", - nfc: "\u{1D513}", - nfd: "\u{1D513}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D514}", - nfc: "\u{1D514}", - nfd: "\u{1D514}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D516}", - nfc: "\u{1D516}", - nfd: "\u{1D516}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D517}", - nfc: "\u{1D517}", - nfd: "\u{1D517}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D518}", - nfc: "\u{1D518}", - nfd: "\u{1D518}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D519}", - nfc: "\u{1D519}", - nfd: "\u{1D519}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D51A}", - nfc: "\u{1D51A}", - nfd: "\u{1D51A}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D51B}", - nfc: "\u{1D51B}", - nfd: "\u{1D51B}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D51C}", - nfc: "\u{1D51C}", - nfd: "\u{1D51C}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D51E}", - nfc: "\u{1D51E}", - nfd: "\u{1D51E}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D51F}", - nfc: "\u{1D51F}", - nfd: "\u{1D51F}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D520}", - nfc: "\u{1D520}", - nfd: "\u{1D520}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D521}", - nfc: "\u{1D521}", - nfd: "\u{1D521}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D522}", - nfc: "\u{1D522}", - nfd: "\u{1D522}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D523}", - nfc: "\u{1D523}", - nfd: "\u{1D523}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D524}", - nfc: "\u{1D524}", - nfd: "\u{1D524}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D525}", - nfc: "\u{1D525}", - nfd: "\u{1D525}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D526}", - nfc: "\u{1D526}", - nfd: "\u{1D526}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D527}", - nfc: "\u{1D527}", - nfd: "\u{1D527}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D528}", - nfc: "\u{1D528}", - nfd: "\u{1D528}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D529}", - nfc: "\u{1D529}", - nfd: "\u{1D529}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D52A}", - nfc: "\u{1D52A}", - nfd: "\u{1D52A}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D52B}", - nfc: "\u{1D52B}", - nfd: "\u{1D52B}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D52C}", - nfc: "\u{1D52C}", - nfd: "\u{1D52C}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D52D}", - nfc: "\u{1D52D}", - nfd: "\u{1D52D}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D52E}", - nfc: "\u{1D52E}", - nfd: "\u{1D52E}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D52F}", - nfc: "\u{1D52F}", - nfd: "\u{1D52F}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D530}", - nfc: "\u{1D530}", - nfd: "\u{1D530}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D531}", - nfc: "\u{1D531}", - nfd: "\u{1D531}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D532}", - nfc: "\u{1D532}", - nfd: "\u{1D532}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D533}", - nfc: "\u{1D533}", - nfd: "\u{1D533}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D534}", - nfc: "\u{1D534}", - nfd: "\u{1D534}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D535}", - nfc: "\u{1D535}", - nfd: "\u{1D535}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D536}", - nfc: "\u{1D536}", - nfd: "\u{1D536}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D537}", - nfc: "\u{1D537}", - nfd: "\u{1D537}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D538}", - nfc: "\u{1D538}", - nfd: "\u{1D538}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D539}", - nfc: "\u{1D539}", - nfd: "\u{1D539}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D53B}", - nfc: "\u{1D53B}", - nfd: "\u{1D53B}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D53C}", - nfc: "\u{1D53C}", - nfd: "\u{1D53C}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D53D}", - nfc: "\u{1D53D}", - nfd: "\u{1D53D}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D53E}", - nfc: "\u{1D53E}", - nfd: "\u{1D53E}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D540}", - nfc: "\u{1D540}", - nfd: "\u{1D540}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D541}", - nfc: "\u{1D541}", - nfd: "\u{1D541}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D542}", - nfc: "\u{1D542}", - nfd: "\u{1D542}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D543}", - nfc: "\u{1D543}", - nfd: "\u{1D543}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D544}", - nfc: "\u{1D544}", - nfd: "\u{1D544}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D546}", - nfc: "\u{1D546}", - nfd: "\u{1D546}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D54A}", - nfc: "\u{1D54A}", - nfd: "\u{1D54A}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D54B}", - nfc: "\u{1D54B}", - nfd: "\u{1D54B}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D54C}", - nfc: "\u{1D54C}", - nfd: "\u{1D54C}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D54D}", - nfc: "\u{1D54D}", - nfd: "\u{1D54D}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D54E}", - nfc: "\u{1D54E}", - nfd: "\u{1D54E}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D54F}", - nfc: "\u{1D54F}", - nfd: "\u{1D54F}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D550}", - nfc: "\u{1D550}", - nfd: "\u{1D550}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D552}", - nfc: "\u{1D552}", - nfd: "\u{1D552}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D553}", - nfc: "\u{1D553}", - nfd: "\u{1D553}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D554}", - nfc: "\u{1D554}", - nfd: "\u{1D554}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D555}", - nfc: "\u{1D555}", - nfd: "\u{1D555}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D556}", - nfc: "\u{1D556}", - nfd: "\u{1D556}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D557}", - nfc: "\u{1D557}", - nfd: "\u{1D557}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D558}", - nfc: "\u{1D558}", - nfd: "\u{1D558}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D559}", - nfc: "\u{1D559}", - nfd: "\u{1D559}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D55A}", - nfc: "\u{1D55A}", - nfd: "\u{1D55A}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D55B}", - nfc: "\u{1D55B}", - nfd: "\u{1D55B}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D55C}", - nfc: "\u{1D55C}", - nfd: "\u{1D55C}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D55D}", - nfc: "\u{1D55D}", - nfd: "\u{1D55D}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D55E}", - nfc: "\u{1D55E}", - nfd: "\u{1D55E}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D55F}", - nfc: "\u{1D55F}", - nfd: "\u{1D55F}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D560}", - nfc: "\u{1D560}", - nfd: "\u{1D560}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D561}", - nfc: "\u{1D561}", - nfd: "\u{1D561}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D562}", - nfc: "\u{1D562}", - nfd: "\u{1D562}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D563}", - nfc: "\u{1D563}", - nfd: "\u{1D563}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D564}", - nfc: "\u{1D564}", - nfd: "\u{1D564}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D565}", - nfc: "\u{1D565}", - nfd: "\u{1D565}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D566}", - nfc: "\u{1D566}", - nfd: "\u{1D566}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D567}", - nfc: "\u{1D567}", - nfd: "\u{1D567}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D568}", - nfc: "\u{1D568}", - nfd: "\u{1D568}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D569}", - nfc: "\u{1D569}", - nfd: "\u{1D569}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D56A}", - nfc: "\u{1D56A}", - nfd: "\u{1D56A}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D56B}", - nfc: "\u{1D56B}", - nfd: "\u{1D56B}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D56C}", - nfc: "\u{1D56C}", - nfd: "\u{1D56C}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D56D}", - nfc: "\u{1D56D}", - nfd: "\u{1D56D}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D56E}", - nfc: "\u{1D56E}", - nfd: "\u{1D56E}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D56F}", - nfc: "\u{1D56F}", - nfd: "\u{1D56F}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D570}", - nfc: "\u{1D570}", - nfd: "\u{1D570}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D571}", - nfc: "\u{1D571}", - nfd: "\u{1D571}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D572}", - nfc: "\u{1D572}", - nfd: "\u{1D572}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D573}", - nfc: "\u{1D573}", - nfd: "\u{1D573}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D574}", - nfc: "\u{1D574}", - nfd: "\u{1D574}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D575}", - nfc: "\u{1D575}", - nfd: "\u{1D575}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D576}", - nfc: "\u{1D576}", - nfd: "\u{1D576}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D577}", - nfc: "\u{1D577}", - nfd: "\u{1D577}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D578}", - nfc: "\u{1D578}", - nfd: "\u{1D578}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D579}", - nfc: "\u{1D579}", - nfd: "\u{1D579}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D57A}", - nfc: "\u{1D57A}", - nfd: "\u{1D57A}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D57B}", - nfc: "\u{1D57B}", - nfd: "\u{1D57B}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D57C}", - nfc: "\u{1D57C}", - nfd: "\u{1D57C}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D57D}", - nfc: "\u{1D57D}", - nfd: "\u{1D57D}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D57E}", - nfc: "\u{1D57E}", - nfd: "\u{1D57E}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D57F}", - nfc: "\u{1D57F}", - nfd: "\u{1D57F}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D580}", - nfc: "\u{1D580}", - nfd: "\u{1D580}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D581}", - nfc: "\u{1D581}", - nfd: "\u{1D581}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D582}", - nfc: "\u{1D582}", - nfd: "\u{1D582}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D583}", - nfc: "\u{1D583}", - nfd: "\u{1D583}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D584}", - nfc: "\u{1D584}", - nfd: "\u{1D584}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D585}", - nfc: "\u{1D585}", - nfd: "\u{1D585}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D586}", - nfc: "\u{1D586}", - nfd: "\u{1D586}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D587}", - nfc: "\u{1D587}", - nfd: "\u{1D587}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D588}", - nfc: "\u{1D588}", - nfd: "\u{1D588}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D589}", - nfc: "\u{1D589}", - nfd: "\u{1D589}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D58A}", - nfc: "\u{1D58A}", - nfd: "\u{1D58A}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D58B}", - nfc: "\u{1D58B}", - nfd: "\u{1D58B}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D58C}", - nfc: "\u{1D58C}", - nfd: "\u{1D58C}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D58D}", - nfc: "\u{1D58D}", - nfd: "\u{1D58D}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D58E}", - nfc: "\u{1D58E}", - nfd: "\u{1D58E}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D58F}", - nfc: "\u{1D58F}", - nfd: "\u{1D58F}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D590}", - nfc: "\u{1D590}", - nfd: "\u{1D590}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D591}", - nfc: "\u{1D591}", - nfd: "\u{1D591}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D592}", - nfc: "\u{1D592}", - nfd: "\u{1D592}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D593}", - nfc: "\u{1D593}", - nfd: "\u{1D593}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D594}", - nfc: "\u{1D594}", - nfd: "\u{1D594}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D595}", - nfc: "\u{1D595}", - nfd: "\u{1D595}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D596}", - nfc: "\u{1D596}", - nfd: "\u{1D596}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D597}", - nfc: "\u{1D597}", - nfd: "\u{1D597}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D598}", - nfc: "\u{1D598}", - nfd: "\u{1D598}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D599}", - nfc: "\u{1D599}", - nfd: "\u{1D599}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D59A}", - nfc: "\u{1D59A}", - nfd: "\u{1D59A}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D59B}", - nfc: "\u{1D59B}", - nfd: "\u{1D59B}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D59C}", - nfc: "\u{1D59C}", - nfd: "\u{1D59C}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D59D}", - nfc: "\u{1D59D}", - nfd: "\u{1D59D}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D59E}", - nfc: "\u{1D59E}", - nfd: "\u{1D59E}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D59F}", - nfc: "\u{1D59F}", - nfd: "\u{1D59F}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D5A0}", - nfc: "\u{1D5A0}", - nfd: "\u{1D5A0}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D5A1}", - nfc: "\u{1D5A1}", - nfd: "\u{1D5A1}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D5A2}", - nfc: "\u{1D5A2}", - nfd: "\u{1D5A2}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D5A3}", - nfc: "\u{1D5A3}", - nfd: "\u{1D5A3}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D5A4}", - nfc: "\u{1D5A4}", - nfd: "\u{1D5A4}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D5A5}", - nfc: "\u{1D5A5}", - nfd: "\u{1D5A5}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D5A6}", - nfc: "\u{1D5A6}", - nfd: "\u{1D5A6}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D5A7}", - nfc: "\u{1D5A7}", - nfd: "\u{1D5A7}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D5A8}", - nfc: "\u{1D5A8}", - nfd: "\u{1D5A8}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D5A9}", - nfc: "\u{1D5A9}", - nfd: "\u{1D5A9}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D5AA}", - nfc: "\u{1D5AA}", - nfd: "\u{1D5AA}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D5AB}", - nfc: "\u{1D5AB}", - nfd: "\u{1D5AB}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D5AC}", - nfc: "\u{1D5AC}", - nfd: "\u{1D5AC}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D5AD}", - nfc: "\u{1D5AD}", - nfd: "\u{1D5AD}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D5AE}", - nfc: "\u{1D5AE}", - nfd: "\u{1D5AE}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D5AF}", - nfc: "\u{1D5AF}", - nfd: "\u{1D5AF}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D5B0}", - nfc: "\u{1D5B0}", - nfd: "\u{1D5B0}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D5B1}", - nfc: "\u{1D5B1}", - nfd: "\u{1D5B1}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D5B2}", - nfc: "\u{1D5B2}", - nfd: "\u{1D5B2}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D5B3}", - nfc: "\u{1D5B3}", - nfd: "\u{1D5B3}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D5B4}", - nfc: "\u{1D5B4}", - nfd: "\u{1D5B4}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D5B5}", - nfc: "\u{1D5B5}", - nfd: "\u{1D5B5}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D5B6}", - nfc: "\u{1D5B6}", - nfd: "\u{1D5B6}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D5B7}", - nfc: "\u{1D5B7}", - nfd: "\u{1D5B7}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D5B8}", - nfc: "\u{1D5B8}", - nfd: "\u{1D5B8}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D5B9}", - nfc: "\u{1D5B9}", - nfd: "\u{1D5B9}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D5BA}", - nfc: "\u{1D5BA}", - nfd: "\u{1D5BA}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D5BB}", - nfc: "\u{1D5BB}", - nfd: "\u{1D5BB}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D5BC}", - nfc: "\u{1D5BC}", - nfd: "\u{1D5BC}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D5BD}", - nfc: "\u{1D5BD}", - nfd: "\u{1D5BD}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D5BE}", - nfc: "\u{1D5BE}", - nfd: "\u{1D5BE}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D5BF}", - nfc: "\u{1D5BF}", - nfd: "\u{1D5BF}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D5C0}", - nfc: "\u{1D5C0}", - nfd: "\u{1D5C0}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D5C1}", - nfc: "\u{1D5C1}", - nfd: "\u{1D5C1}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D5C2}", - nfc: "\u{1D5C2}", - nfd: "\u{1D5C2}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D5C3}", - nfc: "\u{1D5C3}", - nfd: "\u{1D5C3}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D5C4}", - nfc: "\u{1D5C4}", - nfd: "\u{1D5C4}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D5C5}", - nfc: "\u{1D5C5}", - nfd: "\u{1D5C5}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D5C6}", - nfc: "\u{1D5C6}", - nfd: "\u{1D5C6}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D5C7}", - nfc: "\u{1D5C7}", - nfd: "\u{1D5C7}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D5C8}", - nfc: "\u{1D5C8}", - nfd: "\u{1D5C8}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D5C9}", - nfc: "\u{1D5C9}", - nfd: "\u{1D5C9}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D5CA}", - nfc: "\u{1D5CA}", - nfd: "\u{1D5CA}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D5CB}", - nfc: "\u{1D5CB}", - nfd: "\u{1D5CB}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D5CC}", - nfc: "\u{1D5CC}", - nfd: "\u{1D5CC}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D5CD}", - nfc: "\u{1D5CD}", - nfd: "\u{1D5CD}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D5CE}", - nfc: "\u{1D5CE}", - nfd: "\u{1D5CE}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D5CF}", - nfc: "\u{1D5CF}", - nfd: "\u{1D5CF}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D5D0}", - nfc: "\u{1D5D0}", - nfd: "\u{1D5D0}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D5D1}", - nfc: "\u{1D5D1}", - nfd: "\u{1D5D1}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D5D2}", - nfc: "\u{1D5D2}", - nfd: "\u{1D5D2}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D5D3}", - nfc: "\u{1D5D3}", - nfd: "\u{1D5D3}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D5D4}", - nfc: "\u{1D5D4}", - nfd: "\u{1D5D4}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D5D5}", - nfc: "\u{1D5D5}", - nfd: "\u{1D5D5}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D5D6}", - nfc: "\u{1D5D6}", - nfd: "\u{1D5D6}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D5D7}", - nfc: "\u{1D5D7}", - nfd: "\u{1D5D7}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D5D8}", - nfc: "\u{1D5D8}", - nfd: "\u{1D5D8}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D5D9}", - nfc: "\u{1D5D9}", - nfd: "\u{1D5D9}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D5DA}", - nfc: "\u{1D5DA}", - nfd: "\u{1D5DA}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D5DB}", - nfc: "\u{1D5DB}", - nfd: "\u{1D5DB}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D5DC}", - nfc: "\u{1D5DC}", - nfd: "\u{1D5DC}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D5DD}", - nfc: "\u{1D5DD}", - nfd: "\u{1D5DD}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D5DE}", - nfc: "\u{1D5DE}", - nfd: "\u{1D5DE}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D5DF}", - nfc: "\u{1D5DF}", - nfd: "\u{1D5DF}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D5E0}", - nfc: "\u{1D5E0}", - nfd: "\u{1D5E0}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D5E1}", - nfc: "\u{1D5E1}", - nfd: "\u{1D5E1}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D5E2}", - nfc: "\u{1D5E2}", - nfd: "\u{1D5E2}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D5E3}", - nfc: "\u{1D5E3}", - nfd: "\u{1D5E3}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D5E4}", - nfc: "\u{1D5E4}", - nfd: "\u{1D5E4}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D5E5}", - nfc: "\u{1D5E5}", - nfd: "\u{1D5E5}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D5E6}", - nfc: "\u{1D5E6}", - nfd: "\u{1D5E6}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D5E7}", - nfc: "\u{1D5E7}", - nfd: "\u{1D5E7}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D5E8}", - nfc: "\u{1D5E8}", - nfd: "\u{1D5E8}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D5E9}", - nfc: "\u{1D5E9}", - nfd: "\u{1D5E9}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D5EA}", - nfc: "\u{1D5EA}", - nfd: "\u{1D5EA}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D5EB}", - nfc: "\u{1D5EB}", - nfd: "\u{1D5EB}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D5EC}", - nfc: "\u{1D5EC}", - nfd: "\u{1D5EC}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D5ED}", - nfc: "\u{1D5ED}", - nfd: "\u{1D5ED}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D5EE}", - nfc: "\u{1D5EE}", - nfd: "\u{1D5EE}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D5EF}", - nfc: "\u{1D5EF}", - nfd: "\u{1D5EF}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D5F0}", - nfc: "\u{1D5F0}", - nfd: "\u{1D5F0}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D5F1}", - nfc: "\u{1D5F1}", - nfd: "\u{1D5F1}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D5F2}", - nfc: "\u{1D5F2}", - nfd: "\u{1D5F2}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D5F3}", - nfc: "\u{1D5F3}", - nfd: "\u{1D5F3}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D5F4}", - nfc: "\u{1D5F4}", - nfd: "\u{1D5F4}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D5F5}", - nfc: "\u{1D5F5}", - nfd: "\u{1D5F5}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D5F6}", - nfc: "\u{1D5F6}", - nfd: "\u{1D5F6}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D5F7}", - nfc: "\u{1D5F7}", - nfd: "\u{1D5F7}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D5F8}", - nfc: "\u{1D5F8}", - nfd: "\u{1D5F8}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D5F9}", - nfc: "\u{1D5F9}", - nfd: "\u{1D5F9}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D5FA}", - nfc: "\u{1D5FA}", - nfd: "\u{1D5FA}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D5FB}", - nfc: "\u{1D5FB}", - nfd: "\u{1D5FB}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D5FC}", - nfc: "\u{1D5FC}", - nfd: "\u{1D5FC}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D5FD}", - nfc: "\u{1D5FD}", - nfd: "\u{1D5FD}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D5FE}", - nfc: "\u{1D5FE}", - nfd: "\u{1D5FE}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D5FF}", - nfc: "\u{1D5FF}", - nfd: "\u{1D5FF}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D600}", - nfc: "\u{1D600}", - nfd: "\u{1D600}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D601}", - nfc: "\u{1D601}", - nfd: "\u{1D601}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D602}", - nfc: "\u{1D602}", - nfd: "\u{1D602}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D603}", - nfc: "\u{1D603}", - nfd: "\u{1D603}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D604}", - nfc: "\u{1D604}", - nfd: "\u{1D604}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D605}", - nfc: "\u{1D605}", - nfd: "\u{1D605}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D606}", - nfc: "\u{1D606}", - nfd: "\u{1D606}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D607}", - nfc: "\u{1D607}", - nfd: "\u{1D607}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D608}", - nfc: "\u{1D608}", - nfd: "\u{1D608}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D609}", - nfc: "\u{1D609}", - nfd: "\u{1D609}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D60A}", - nfc: "\u{1D60A}", - nfd: "\u{1D60A}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D60B}", - nfc: "\u{1D60B}", - nfd: "\u{1D60B}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D60C}", - nfc: "\u{1D60C}", - nfd: "\u{1D60C}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D60D}", - nfc: "\u{1D60D}", - nfd: "\u{1D60D}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D60E}", - nfc: "\u{1D60E}", - nfd: "\u{1D60E}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D60F}", - nfc: "\u{1D60F}", - nfd: "\u{1D60F}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D610}", - nfc: "\u{1D610}", - nfd: "\u{1D610}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D611}", - nfc: "\u{1D611}", - nfd: "\u{1D611}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D612}", - nfc: "\u{1D612}", - nfd: "\u{1D612}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D613}", - nfc: "\u{1D613}", - nfd: "\u{1D613}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D614}", - nfc: "\u{1D614}", - nfd: "\u{1D614}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D615}", - nfc: "\u{1D615}", - nfd: "\u{1D615}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D616}", - nfc: "\u{1D616}", - nfd: "\u{1D616}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D617}", - nfc: "\u{1D617}", - nfd: "\u{1D617}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D618}", - nfc: "\u{1D618}", - nfd: "\u{1D618}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D619}", - nfc: "\u{1D619}", - nfd: "\u{1D619}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D61A}", - nfc: "\u{1D61A}", - nfd: "\u{1D61A}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D61B}", - nfc: "\u{1D61B}", - nfd: "\u{1D61B}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D61C}", - nfc: "\u{1D61C}", - nfd: "\u{1D61C}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D61D}", - nfc: "\u{1D61D}", - nfd: "\u{1D61D}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D61E}", - nfc: "\u{1D61E}", - nfd: "\u{1D61E}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D61F}", - nfc: "\u{1D61F}", - nfd: "\u{1D61F}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D620}", - nfc: "\u{1D620}", - nfd: "\u{1D620}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D621}", - nfc: "\u{1D621}", - nfd: "\u{1D621}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D622}", - nfc: "\u{1D622}", - nfd: "\u{1D622}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D623}", - nfc: "\u{1D623}", - nfd: "\u{1D623}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D624}", - nfc: "\u{1D624}", - nfd: "\u{1D624}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D625}", - nfc: "\u{1D625}", - nfd: "\u{1D625}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D626}", - nfc: "\u{1D626}", - nfd: "\u{1D626}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D627}", - nfc: "\u{1D627}", - nfd: "\u{1D627}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D628}", - nfc: "\u{1D628}", - nfd: "\u{1D628}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D629}", - nfc: "\u{1D629}", - nfd: "\u{1D629}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D62A}", - nfc: "\u{1D62A}", - nfd: "\u{1D62A}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D62B}", - nfc: "\u{1D62B}", - nfd: "\u{1D62B}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D62C}", - nfc: "\u{1D62C}", - nfd: "\u{1D62C}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D62D}", - nfc: "\u{1D62D}", - nfd: "\u{1D62D}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D62E}", - nfc: "\u{1D62E}", - nfd: "\u{1D62E}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D62F}", - nfc: "\u{1D62F}", - nfd: "\u{1D62F}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D630}", - nfc: "\u{1D630}", - nfd: "\u{1D630}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D631}", - nfc: "\u{1D631}", - nfd: "\u{1D631}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D632}", - nfc: "\u{1D632}", - nfd: "\u{1D632}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D633}", - nfc: "\u{1D633}", - nfd: "\u{1D633}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D634}", - nfc: "\u{1D634}", - nfd: "\u{1D634}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D635}", - nfc: "\u{1D635}", - nfd: "\u{1D635}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D636}", - nfc: "\u{1D636}", - nfd: "\u{1D636}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D637}", - nfc: "\u{1D637}", - nfd: "\u{1D637}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D638}", - nfc: "\u{1D638}", - nfd: "\u{1D638}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D639}", - nfc: "\u{1D639}", - nfd: "\u{1D639}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D63A}", - nfc: "\u{1D63A}", - nfd: "\u{1D63A}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D63B}", - nfc: "\u{1D63B}", - nfd: "\u{1D63B}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D63C}", - nfc: "\u{1D63C}", - nfd: "\u{1D63C}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D63D}", - nfc: "\u{1D63D}", - nfd: "\u{1D63D}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D63E}", - nfc: "\u{1D63E}", - nfd: "\u{1D63E}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D63F}", - nfc: "\u{1D63F}", - nfd: "\u{1D63F}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D640}", - nfc: "\u{1D640}", - nfd: "\u{1D640}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D641}", - nfc: "\u{1D641}", - nfd: "\u{1D641}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D642}", - nfc: "\u{1D642}", - nfd: "\u{1D642}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D643}", - nfc: "\u{1D643}", - nfd: "\u{1D643}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D644}", - nfc: "\u{1D644}", - nfd: "\u{1D644}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D645}", - nfc: "\u{1D645}", - nfd: "\u{1D645}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D646}", - nfc: "\u{1D646}", - nfd: "\u{1D646}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D647}", - nfc: "\u{1D647}", - nfd: "\u{1D647}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D648}", - nfc: "\u{1D648}", - nfd: "\u{1D648}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D649}", - nfc: "\u{1D649}", - nfd: "\u{1D649}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D64A}", - nfc: "\u{1D64A}", - nfd: "\u{1D64A}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D64B}", - nfc: "\u{1D64B}", - nfd: "\u{1D64B}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D64C}", - nfc: "\u{1D64C}", - nfd: "\u{1D64C}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D64D}", - nfc: "\u{1D64D}", - nfd: "\u{1D64D}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D64E}", - nfc: "\u{1D64E}", - nfd: "\u{1D64E}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D64F}", - nfc: "\u{1D64F}", - nfd: "\u{1D64F}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D650}", - nfc: "\u{1D650}", - nfd: "\u{1D650}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D651}", - nfc: "\u{1D651}", - nfd: "\u{1D651}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D652}", - nfc: "\u{1D652}", - nfd: "\u{1D652}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D653}", - nfc: "\u{1D653}", - nfd: "\u{1D653}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D654}", - nfc: "\u{1D654}", - nfd: "\u{1D654}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D655}", - nfc: "\u{1D655}", - nfd: "\u{1D655}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D656}", - nfc: "\u{1D656}", - nfd: "\u{1D656}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D657}", - nfc: "\u{1D657}", - nfd: "\u{1D657}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D658}", - nfc: "\u{1D658}", - nfd: "\u{1D658}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D659}", - nfc: "\u{1D659}", - nfd: "\u{1D659}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D65A}", - nfc: "\u{1D65A}", - nfd: "\u{1D65A}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D65B}", - nfc: "\u{1D65B}", - nfd: "\u{1D65B}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D65C}", - nfc: "\u{1D65C}", - nfd: "\u{1D65C}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D65D}", - nfc: "\u{1D65D}", - nfd: "\u{1D65D}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D65E}", - nfc: "\u{1D65E}", - nfd: "\u{1D65E}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D65F}", - nfc: "\u{1D65F}", - nfd: "\u{1D65F}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D660}", - nfc: "\u{1D660}", - nfd: "\u{1D660}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D661}", - nfc: "\u{1D661}", - nfd: "\u{1D661}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D662}", - nfc: "\u{1D662}", - nfd: "\u{1D662}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D663}", - nfc: "\u{1D663}", - nfd: "\u{1D663}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D664}", - nfc: "\u{1D664}", - nfd: "\u{1D664}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D665}", - nfc: "\u{1D665}", - nfd: "\u{1D665}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D666}", - nfc: "\u{1D666}", - nfd: "\u{1D666}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D667}", - nfc: "\u{1D667}", - nfd: "\u{1D667}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D668}", - nfc: "\u{1D668}", - nfd: "\u{1D668}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D669}", - nfc: "\u{1D669}", - nfd: "\u{1D669}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D66A}", - nfc: "\u{1D66A}", - nfd: "\u{1D66A}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D66B}", - nfc: "\u{1D66B}", - nfd: "\u{1D66B}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D66C}", - nfc: "\u{1D66C}", - nfd: "\u{1D66C}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D66D}", - nfc: "\u{1D66D}", - nfd: "\u{1D66D}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D66E}", - nfc: "\u{1D66E}", - nfd: "\u{1D66E}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D66F}", - nfc: "\u{1D66F}", - nfd: "\u{1D66F}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D670}", - nfc: "\u{1D670}", - nfd: "\u{1D670}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1D671}", - nfc: "\u{1D671}", - nfd: "\u{1D671}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1D672}", - nfc: "\u{1D672}", - nfd: "\u{1D672}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1D673}", - nfc: "\u{1D673}", - nfd: "\u{1D673}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1D674}", - nfc: "\u{1D674}", - nfd: "\u{1D674}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1D675}", - nfc: "\u{1D675}", - nfd: "\u{1D675}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1D676}", - nfc: "\u{1D676}", - nfd: "\u{1D676}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1D677}", - nfc: "\u{1D677}", - nfd: "\u{1D677}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1D678}", - nfc: "\u{1D678}", - nfd: "\u{1D678}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1D679}", - nfc: "\u{1D679}", - nfd: "\u{1D679}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1D67A}", - nfc: "\u{1D67A}", - nfd: "\u{1D67A}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1D67B}", - nfc: "\u{1D67B}", - nfd: "\u{1D67B}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1D67C}", - nfc: "\u{1D67C}", - nfd: "\u{1D67C}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1D67D}", - nfc: "\u{1D67D}", - nfd: "\u{1D67D}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1D67E}", - nfc: "\u{1D67E}", - nfd: "\u{1D67E}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1D67F}", - nfc: "\u{1D67F}", - nfd: "\u{1D67F}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1D680}", - nfc: "\u{1D680}", - nfd: "\u{1D680}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1D681}", - nfc: "\u{1D681}", - nfd: "\u{1D681}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1D682}", - nfc: "\u{1D682}", - nfd: "\u{1D682}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1D683}", - nfc: "\u{1D683}", - nfd: "\u{1D683}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1D684}", - nfc: "\u{1D684}", - nfd: "\u{1D684}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1D685}", - nfc: "\u{1D685}", - nfd: "\u{1D685}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1D686}", - nfc: "\u{1D686}", - nfd: "\u{1D686}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1D687}", - nfc: "\u{1D687}", - nfd: "\u{1D687}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1D688}", - nfc: "\u{1D688}", - nfd: "\u{1D688}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1D689}", - nfc: "\u{1D689}", - nfd: "\u{1D689}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1D68A}", - nfc: "\u{1D68A}", - nfd: "\u{1D68A}", - nfkc: "\u{0061}", - nfkd: "\u{0061}", - }, - NormalizationTest { - source: "\u{1D68B}", - nfc: "\u{1D68B}", - nfd: "\u{1D68B}", - nfkc: "\u{0062}", - nfkd: "\u{0062}", - }, - NormalizationTest { - source: "\u{1D68C}", - nfc: "\u{1D68C}", - nfd: "\u{1D68C}", - nfkc: "\u{0063}", - nfkd: "\u{0063}", - }, - NormalizationTest { - source: "\u{1D68D}", - nfc: "\u{1D68D}", - nfd: "\u{1D68D}", - nfkc: "\u{0064}", - nfkd: "\u{0064}", - }, - NormalizationTest { - source: "\u{1D68E}", - nfc: "\u{1D68E}", - nfd: "\u{1D68E}", - nfkc: "\u{0065}", - nfkd: "\u{0065}", - }, - NormalizationTest { - source: "\u{1D68F}", - nfc: "\u{1D68F}", - nfd: "\u{1D68F}", - nfkc: "\u{0066}", - nfkd: "\u{0066}", - }, - NormalizationTest { - source: "\u{1D690}", - nfc: "\u{1D690}", - nfd: "\u{1D690}", - nfkc: "\u{0067}", - nfkd: "\u{0067}", - }, - NormalizationTest { - source: "\u{1D691}", - nfc: "\u{1D691}", - nfd: "\u{1D691}", - nfkc: "\u{0068}", - nfkd: "\u{0068}", - }, - NormalizationTest { - source: "\u{1D692}", - nfc: "\u{1D692}", - nfd: "\u{1D692}", - nfkc: "\u{0069}", - nfkd: "\u{0069}", - }, - NormalizationTest { - source: "\u{1D693}", - nfc: "\u{1D693}", - nfd: "\u{1D693}", - nfkc: "\u{006A}", - nfkd: "\u{006A}", - }, - NormalizationTest { - source: "\u{1D694}", - nfc: "\u{1D694}", - nfd: "\u{1D694}", - nfkc: "\u{006B}", - nfkd: "\u{006B}", - }, - NormalizationTest { - source: "\u{1D695}", - nfc: "\u{1D695}", - nfd: "\u{1D695}", - nfkc: "\u{006C}", - nfkd: "\u{006C}", - }, - NormalizationTest { - source: "\u{1D696}", - nfc: "\u{1D696}", - nfd: "\u{1D696}", - nfkc: "\u{006D}", - nfkd: "\u{006D}", - }, - NormalizationTest { - source: "\u{1D697}", - nfc: "\u{1D697}", - nfd: "\u{1D697}", - nfkc: "\u{006E}", - nfkd: "\u{006E}", - }, - NormalizationTest { - source: "\u{1D698}", - nfc: "\u{1D698}", - nfd: "\u{1D698}", - nfkc: "\u{006F}", - nfkd: "\u{006F}", - }, - NormalizationTest { - source: "\u{1D699}", - nfc: "\u{1D699}", - nfd: "\u{1D699}", - nfkc: "\u{0070}", - nfkd: "\u{0070}", - }, - NormalizationTest { - source: "\u{1D69A}", - nfc: "\u{1D69A}", - nfd: "\u{1D69A}", - nfkc: "\u{0071}", - nfkd: "\u{0071}", - }, - NormalizationTest { - source: "\u{1D69B}", - nfc: "\u{1D69B}", - nfd: "\u{1D69B}", - nfkc: "\u{0072}", - nfkd: "\u{0072}", - }, - NormalizationTest { - source: "\u{1D69C}", - nfc: "\u{1D69C}", - nfd: "\u{1D69C}", - nfkc: "\u{0073}", - nfkd: "\u{0073}", - }, - NormalizationTest { - source: "\u{1D69D}", - nfc: "\u{1D69D}", - nfd: "\u{1D69D}", - nfkc: "\u{0074}", - nfkd: "\u{0074}", - }, - NormalizationTest { - source: "\u{1D69E}", - nfc: "\u{1D69E}", - nfd: "\u{1D69E}", - nfkc: "\u{0075}", - nfkd: "\u{0075}", - }, - NormalizationTest { - source: "\u{1D69F}", - nfc: "\u{1D69F}", - nfd: "\u{1D69F}", - nfkc: "\u{0076}", - nfkd: "\u{0076}", - }, - NormalizationTest { - source: "\u{1D6A0}", - nfc: "\u{1D6A0}", - nfd: "\u{1D6A0}", - nfkc: "\u{0077}", - nfkd: "\u{0077}", - }, - NormalizationTest { - source: "\u{1D6A1}", - nfc: "\u{1D6A1}", - nfd: "\u{1D6A1}", - nfkc: "\u{0078}", - nfkd: "\u{0078}", - }, - NormalizationTest { - source: "\u{1D6A2}", - nfc: "\u{1D6A2}", - nfd: "\u{1D6A2}", - nfkc: "\u{0079}", - nfkd: "\u{0079}", - }, - NormalizationTest { - source: "\u{1D6A3}", - nfc: "\u{1D6A3}", - nfd: "\u{1D6A3}", - nfkc: "\u{007A}", - nfkd: "\u{007A}", - }, - NormalizationTest { - source: "\u{1D6A4}", - nfc: "\u{1D6A4}", - nfd: "\u{1D6A4}", - nfkc: "\u{0131}", - nfkd: "\u{0131}", - }, - NormalizationTest { - source: "\u{1D6A5}", - nfc: "\u{1D6A5}", - nfd: "\u{1D6A5}", - nfkc: "\u{0237}", - nfkd: "\u{0237}", - }, - NormalizationTest { - source: "\u{1D6A8}", - nfc: "\u{1D6A8}", - nfd: "\u{1D6A8}", - nfkc: "\u{0391}", - nfkd: "\u{0391}", - }, - NormalizationTest { - source: "\u{1D6A9}", - nfc: "\u{1D6A9}", - nfd: "\u{1D6A9}", - nfkc: "\u{0392}", - nfkd: "\u{0392}", - }, - NormalizationTest { - source: "\u{1D6AA}", - nfc: "\u{1D6AA}", - nfd: "\u{1D6AA}", - nfkc: "\u{0393}", - nfkd: "\u{0393}", - }, - NormalizationTest { - source: "\u{1D6AB}", - nfc: "\u{1D6AB}", - nfd: "\u{1D6AB}", - nfkc: "\u{0394}", - nfkd: "\u{0394}", - }, - NormalizationTest { - source: "\u{1D6AC}", - nfc: "\u{1D6AC}", - nfd: "\u{1D6AC}", - nfkc: "\u{0395}", - nfkd: "\u{0395}", - }, - NormalizationTest { - source: "\u{1D6AD}", - nfc: "\u{1D6AD}", - nfd: "\u{1D6AD}", - nfkc: "\u{0396}", - nfkd: "\u{0396}", - }, - NormalizationTest { - source: "\u{1D6AE}", - nfc: "\u{1D6AE}", - nfd: "\u{1D6AE}", - nfkc: "\u{0397}", - nfkd: "\u{0397}", - }, - NormalizationTest { - source: "\u{1D6AF}", - nfc: "\u{1D6AF}", - nfd: "\u{1D6AF}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D6B0}", - nfc: "\u{1D6B0}", - nfd: "\u{1D6B0}", - nfkc: "\u{0399}", - nfkd: "\u{0399}", - }, - NormalizationTest { - source: "\u{1D6B1}", - nfc: "\u{1D6B1}", - nfd: "\u{1D6B1}", - nfkc: "\u{039A}", - nfkd: "\u{039A}", - }, - NormalizationTest { - source: "\u{1D6B2}", - nfc: "\u{1D6B2}", - nfd: "\u{1D6B2}", - nfkc: "\u{039B}", - nfkd: "\u{039B}", - }, - NormalizationTest { - source: "\u{1D6B3}", - nfc: "\u{1D6B3}", - nfd: "\u{1D6B3}", - nfkc: "\u{039C}", - nfkd: "\u{039C}", - }, - NormalizationTest { - source: "\u{1D6B4}", - nfc: "\u{1D6B4}", - nfd: "\u{1D6B4}", - nfkc: "\u{039D}", - nfkd: "\u{039D}", - }, - NormalizationTest { - source: "\u{1D6B5}", - nfc: "\u{1D6B5}", - nfd: "\u{1D6B5}", - nfkc: "\u{039E}", - nfkd: "\u{039E}", - }, - NormalizationTest { - source: "\u{1D6B6}", - nfc: "\u{1D6B6}", - nfd: "\u{1D6B6}", - nfkc: "\u{039F}", - nfkd: "\u{039F}", - }, - NormalizationTest { - source: "\u{1D6B7}", - nfc: "\u{1D6B7}", - nfd: "\u{1D6B7}", - nfkc: "\u{03A0}", - nfkd: "\u{03A0}", - }, - NormalizationTest { - source: "\u{1D6B8}", - nfc: "\u{1D6B8}", - nfd: "\u{1D6B8}", - nfkc: "\u{03A1}", - nfkd: "\u{03A1}", - }, - NormalizationTest { - source: "\u{1D6B9}", - nfc: "\u{1D6B9}", - nfd: "\u{1D6B9}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D6BA}", - nfc: "\u{1D6BA}", - nfd: "\u{1D6BA}", - nfkc: "\u{03A3}", - nfkd: "\u{03A3}", - }, - NormalizationTest { - source: "\u{1D6BB}", - nfc: "\u{1D6BB}", - nfd: "\u{1D6BB}", - nfkc: "\u{03A4}", - nfkd: "\u{03A4}", - }, - NormalizationTest { - source: "\u{1D6BC}", - nfc: "\u{1D6BC}", - nfd: "\u{1D6BC}", - nfkc: "\u{03A5}", - nfkd: "\u{03A5}", - }, - NormalizationTest { - source: "\u{1D6BD}", - nfc: "\u{1D6BD}", - nfd: "\u{1D6BD}", - nfkc: "\u{03A6}", - nfkd: "\u{03A6}", - }, - NormalizationTest { - source: "\u{1D6BE}", - nfc: "\u{1D6BE}", - nfd: "\u{1D6BE}", - nfkc: "\u{03A7}", - nfkd: "\u{03A7}", - }, - NormalizationTest { - source: "\u{1D6BF}", - nfc: "\u{1D6BF}", - nfd: "\u{1D6BF}", - nfkc: "\u{03A8}", - nfkd: "\u{03A8}", - }, - NormalizationTest { - source: "\u{1D6C0}", - nfc: "\u{1D6C0}", - nfd: "\u{1D6C0}", - nfkc: "\u{03A9}", - nfkd: "\u{03A9}", - }, - NormalizationTest { - source: "\u{1D6C1}", - nfc: "\u{1D6C1}", - nfd: "\u{1D6C1}", - nfkc: "\u{2207}", - nfkd: "\u{2207}", - }, - NormalizationTest { - source: "\u{1D6C2}", - nfc: "\u{1D6C2}", - nfd: "\u{1D6C2}", - nfkc: "\u{03B1}", - nfkd: "\u{03B1}", - }, - NormalizationTest { - source: "\u{1D6C3}", - nfc: "\u{1D6C3}", - nfd: "\u{1D6C3}", - nfkc: "\u{03B2}", - nfkd: "\u{03B2}", - }, - NormalizationTest { - source: "\u{1D6C4}", - nfc: "\u{1D6C4}", - nfd: "\u{1D6C4}", - nfkc: "\u{03B3}", - nfkd: "\u{03B3}", - }, - NormalizationTest { - source: "\u{1D6C5}", - nfc: "\u{1D6C5}", - nfd: "\u{1D6C5}", - nfkc: "\u{03B4}", - nfkd: "\u{03B4}", - }, - NormalizationTest { - source: "\u{1D6C6}", - nfc: "\u{1D6C6}", - nfd: "\u{1D6C6}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D6C7}", - nfc: "\u{1D6C7}", - nfd: "\u{1D6C7}", - nfkc: "\u{03B6}", - nfkd: "\u{03B6}", - }, - NormalizationTest { - source: "\u{1D6C8}", - nfc: "\u{1D6C8}", - nfd: "\u{1D6C8}", - nfkc: "\u{03B7}", - nfkd: "\u{03B7}", - }, - NormalizationTest { - source: "\u{1D6C9}", - nfc: "\u{1D6C9}", - nfd: "\u{1D6C9}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D6CA}", - nfc: "\u{1D6CA}", - nfd: "\u{1D6CA}", - nfkc: "\u{03B9}", - nfkd: "\u{03B9}", - }, - NormalizationTest { - source: "\u{1D6CB}", - nfc: "\u{1D6CB}", - nfd: "\u{1D6CB}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D6CC}", - nfc: "\u{1D6CC}", - nfd: "\u{1D6CC}", - nfkc: "\u{03BB}", - nfkd: "\u{03BB}", - }, - NormalizationTest { - source: "\u{1D6CD}", - nfc: "\u{1D6CD}", - nfd: "\u{1D6CD}", - nfkc: "\u{03BC}", - nfkd: "\u{03BC}", - }, - NormalizationTest { - source: "\u{1D6CE}", - nfc: "\u{1D6CE}", - nfd: "\u{1D6CE}", - nfkc: "\u{03BD}", - nfkd: "\u{03BD}", - }, - NormalizationTest { - source: "\u{1D6CF}", - nfc: "\u{1D6CF}", - nfd: "\u{1D6CF}", - nfkc: "\u{03BE}", - nfkd: "\u{03BE}", - }, - NormalizationTest { - source: "\u{1D6D0}", - nfc: "\u{1D6D0}", - nfd: "\u{1D6D0}", - nfkc: "\u{03BF}", - nfkd: "\u{03BF}", - }, - NormalizationTest { - source: "\u{1D6D1}", - nfc: "\u{1D6D1}", - nfd: "\u{1D6D1}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D6D2}", - nfc: "\u{1D6D2}", - nfd: "\u{1D6D2}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D6D3}", - nfc: "\u{1D6D3}", - nfd: "\u{1D6D3}", - nfkc: "\u{03C2}", - nfkd: "\u{03C2}", - }, - NormalizationTest { - source: "\u{1D6D4}", - nfc: "\u{1D6D4}", - nfd: "\u{1D6D4}", - nfkc: "\u{03C3}", - nfkd: "\u{03C3}", - }, - NormalizationTest { - source: "\u{1D6D5}", - nfc: "\u{1D6D5}", - nfd: "\u{1D6D5}", - nfkc: "\u{03C4}", - nfkd: "\u{03C4}", - }, - NormalizationTest { - source: "\u{1D6D6}", - nfc: "\u{1D6D6}", - nfd: "\u{1D6D6}", - nfkc: "\u{03C5}", - nfkd: "\u{03C5}", - }, - NormalizationTest { - source: "\u{1D6D7}", - nfc: "\u{1D6D7}", - nfd: "\u{1D6D7}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D6D8}", - nfc: "\u{1D6D8}", - nfd: "\u{1D6D8}", - nfkc: "\u{03C7}", - nfkd: "\u{03C7}", - }, - NormalizationTest { - source: "\u{1D6D9}", - nfc: "\u{1D6D9}", - nfd: "\u{1D6D9}", - nfkc: "\u{03C8}", - nfkd: "\u{03C8}", - }, - NormalizationTest { - source: "\u{1D6DA}", - nfc: "\u{1D6DA}", - nfd: "\u{1D6DA}", - nfkc: "\u{03C9}", - nfkd: "\u{03C9}", - }, - NormalizationTest { - source: "\u{1D6DB}", - nfc: "\u{1D6DB}", - nfd: "\u{1D6DB}", - nfkc: "\u{2202}", - nfkd: "\u{2202}", - }, - NormalizationTest { - source: "\u{1D6DC}", - nfc: "\u{1D6DC}", - nfd: "\u{1D6DC}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D6DD}", - nfc: "\u{1D6DD}", - nfd: "\u{1D6DD}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D6DE}", - nfc: "\u{1D6DE}", - nfd: "\u{1D6DE}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D6DF}", - nfc: "\u{1D6DF}", - nfd: "\u{1D6DF}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D6E0}", - nfc: "\u{1D6E0}", - nfd: "\u{1D6E0}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D6E1}", - nfc: "\u{1D6E1}", - nfd: "\u{1D6E1}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D6E2}", - nfc: "\u{1D6E2}", - nfd: "\u{1D6E2}", - nfkc: "\u{0391}", - nfkd: "\u{0391}", - }, - NormalizationTest { - source: "\u{1D6E3}", - nfc: "\u{1D6E3}", - nfd: "\u{1D6E3}", - nfkc: "\u{0392}", - nfkd: "\u{0392}", - }, - NormalizationTest { - source: "\u{1D6E4}", - nfc: "\u{1D6E4}", - nfd: "\u{1D6E4}", - nfkc: "\u{0393}", - nfkd: "\u{0393}", - }, - NormalizationTest { - source: "\u{1D6E5}", - nfc: "\u{1D6E5}", - nfd: "\u{1D6E5}", - nfkc: "\u{0394}", - nfkd: "\u{0394}", - }, - NormalizationTest { - source: "\u{1D6E6}", - nfc: "\u{1D6E6}", - nfd: "\u{1D6E6}", - nfkc: "\u{0395}", - nfkd: "\u{0395}", - }, - NormalizationTest { - source: "\u{1D6E7}", - nfc: "\u{1D6E7}", - nfd: "\u{1D6E7}", - nfkc: "\u{0396}", - nfkd: "\u{0396}", - }, - NormalizationTest { - source: "\u{1D6E8}", - nfc: "\u{1D6E8}", - nfd: "\u{1D6E8}", - nfkc: "\u{0397}", - nfkd: "\u{0397}", - }, - NormalizationTest { - source: "\u{1D6E9}", - nfc: "\u{1D6E9}", - nfd: "\u{1D6E9}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D6EA}", - nfc: "\u{1D6EA}", - nfd: "\u{1D6EA}", - nfkc: "\u{0399}", - nfkd: "\u{0399}", - }, - NormalizationTest { - source: "\u{1D6EB}", - nfc: "\u{1D6EB}", - nfd: "\u{1D6EB}", - nfkc: "\u{039A}", - nfkd: "\u{039A}", - }, - NormalizationTest { - source: "\u{1D6EC}", - nfc: "\u{1D6EC}", - nfd: "\u{1D6EC}", - nfkc: "\u{039B}", - nfkd: "\u{039B}", - }, - NormalizationTest { - source: "\u{1D6ED}", - nfc: "\u{1D6ED}", - nfd: "\u{1D6ED}", - nfkc: "\u{039C}", - nfkd: "\u{039C}", - }, - NormalizationTest { - source: "\u{1D6EE}", - nfc: "\u{1D6EE}", - nfd: "\u{1D6EE}", - nfkc: "\u{039D}", - nfkd: "\u{039D}", - }, - NormalizationTest { - source: "\u{1D6EF}", - nfc: "\u{1D6EF}", - nfd: "\u{1D6EF}", - nfkc: "\u{039E}", - nfkd: "\u{039E}", - }, - NormalizationTest { - source: "\u{1D6F0}", - nfc: "\u{1D6F0}", - nfd: "\u{1D6F0}", - nfkc: "\u{039F}", - nfkd: "\u{039F}", - }, - NormalizationTest { - source: "\u{1D6F1}", - nfc: "\u{1D6F1}", - nfd: "\u{1D6F1}", - nfkc: "\u{03A0}", - nfkd: "\u{03A0}", - }, - NormalizationTest { - source: "\u{1D6F2}", - nfc: "\u{1D6F2}", - nfd: "\u{1D6F2}", - nfkc: "\u{03A1}", - nfkd: "\u{03A1}", - }, - NormalizationTest { - source: "\u{1D6F3}", - nfc: "\u{1D6F3}", - nfd: "\u{1D6F3}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D6F4}", - nfc: "\u{1D6F4}", - nfd: "\u{1D6F4}", - nfkc: "\u{03A3}", - nfkd: "\u{03A3}", - }, - NormalizationTest { - source: "\u{1D6F5}", - nfc: "\u{1D6F5}", - nfd: "\u{1D6F5}", - nfkc: "\u{03A4}", - nfkd: "\u{03A4}", - }, - NormalizationTest { - source: "\u{1D6F6}", - nfc: "\u{1D6F6}", - nfd: "\u{1D6F6}", - nfkc: "\u{03A5}", - nfkd: "\u{03A5}", - }, - NormalizationTest { - source: "\u{1D6F7}", - nfc: "\u{1D6F7}", - nfd: "\u{1D6F7}", - nfkc: "\u{03A6}", - nfkd: "\u{03A6}", - }, - NormalizationTest { - source: "\u{1D6F8}", - nfc: "\u{1D6F8}", - nfd: "\u{1D6F8}", - nfkc: "\u{03A7}", - nfkd: "\u{03A7}", - }, - NormalizationTest { - source: "\u{1D6F9}", - nfc: "\u{1D6F9}", - nfd: "\u{1D6F9}", - nfkc: "\u{03A8}", - nfkd: "\u{03A8}", - }, - NormalizationTest { - source: "\u{1D6FA}", - nfc: "\u{1D6FA}", - nfd: "\u{1D6FA}", - nfkc: "\u{03A9}", - nfkd: "\u{03A9}", - }, - NormalizationTest { - source: "\u{1D6FB}", - nfc: "\u{1D6FB}", - nfd: "\u{1D6FB}", - nfkc: "\u{2207}", - nfkd: "\u{2207}", - }, - NormalizationTest { - source: "\u{1D6FC}", - nfc: "\u{1D6FC}", - nfd: "\u{1D6FC}", - nfkc: "\u{03B1}", - nfkd: "\u{03B1}", - }, - NormalizationTest { - source: "\u{1D6FD}", - nfc: "\u{1D6FD}", - nfd: "\u{1D6FD}", - nfkc: "\u{03B2}", - nfkd: "\u{03B2}", - }, - NormalizationTest { - source: "\u{1D6FE}", - nfc: "\u{1D6FE}", - nfd: "\u{1D6FE}", - nfkc: "\u{03B3}", - nfkd: "\u{03B3}", - }, - NormalizationTest { - source: "\u{1D6FF}", - nfc: "\u{1D6FF}", - nfd: "\u{1D6FF}", - nfkc: "\u{03B4}", - nfkd: "\u{03B4}", - }, - NormalizationTest { - source: "\u{1D700}", - nfc: "\u{1D700}", - nfd: "\u{1D700}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D701}", - nfc: "\u{1D701}", - nfd: "\u{1D701}", - nfkc: "\u{03B6}", - nfkd: "\u{03B6}", - }, - NormalizationTest { - source: "\u{1D702}", - nfc: "\u{1D702}", - nfd: "\u{1D702}", - nfkc: "\u{03B7}", - nfkd: "\u{03B7}", - }, - NormalizationTest { - source: "\u{1D703}", - nfc: "\u{1D703}", - nfd: "\u{1D703}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D704}", - nfc: "\u{1D704}", - nfd: "\u{1D704}", - nfkc: "\u{03B9}", - nfkd: "\u{03B9}", - }, - NormalizationTest { - source: "\u{1D705}", - nfc: "\u{1D705}", - nfd: "\u{1D705}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D706}", - nfc: "\u{1D706}", - nfd: "\u{1D706}", - nfkc: "\u{03BB}", - nfkd: "\u{03BB}", - }, - NormalizationTest { - source: "\u{1D707}", - nfc: "\u{1D707}", - nfd: "\u{1D707}", - nfkc: "\u{03BC}", - nfkd: "\u{03BC}", - }, - NormalizationTest { - source: "\u{1D708}", - nfc: "\u{1D708}", - nfd: "\u{1D708}", - nfkc: "\u{03BD}", - nfkd: "\u{03BD}", - }, - NormalizationTest { - source: "\u{1D709}", - nfc: "\u{1D709}", - nfd: "\u{1D709}", - nfkc: "\u{03BE}", - nfkd: "\u{03BE}", - }, - NormalizationTest { - source: "\u{1D70A}", - nfc: "\u{1D70A}", - nfd: "\u{1D70A}", - nfkc: "\u{03BF}", - nfkd: "\u{03BF}", - }, - NormalizationTest { - source: "\u{1D70B}", - nfc: "\u{1D70B}", - nfd: "\u{1D70B}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D70C}", - nfc: "\u{1D70C}", - nfd: "\u{1D70C}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D70D}", - nfc: "\u{1D70D}", - nfd: "\u{1D70D}", - nfkc: "\u{03C2}", - nfkd: "\u{03C2}", - }, - NormalizationTest { - source: "\u{1D70E}", - nfc: "\u{1D70E}", - nfd: "\u{1D70E}", - nfkc: "\u{03C3}", - nfkd: "\u{03C3}", - }, - NormalizationTest { - source: "\u{1D70F}", - nfc: "\u{1D70F}", - nfd: "\u{1D70F}", - nfkc: "\u{03C4}", - nfkd: "\u{03C4}", - }, - NormalizationTest { - source: "\u{1D710}", - nfc: "\u{1D710}", - nfd: "\u{1D710}", - nfkc: "\u{03C5}", - nfkd: "\u{03C5}", - }, - NormalizationTest { - source: "\u{1D711}", - nfc: "\u{1D711}", - nfd: "\u{1D711}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D712}", - nfc: "\u{1D712}", - nfd: "\u{1D712}", - nfkc: "\u{03C7}", - nfkd: "\u{03C7}", - }, - NormalizationTest { - source: "\u{1D713}", - nfc: "\u{1D713}", - nfd: "\u{1D713}", - nfkc: "\u{03C8}", - nfkd: "\u{03C8}", - }, - NormalizationTest { - source: "\u{1D714}", - nfc: "\u{1D714}", - nfd: "\u{1D714}", - nfkc: "\u{03C9}", - nfkd: "\u{03C9}", - }, - NormalizationTest { - source: "\u{1D715}", - nfc: "\u{1D715}", - nfd: "\u{1D715}", - nfkc: "\u{2202}", - nfkd: "\u{2202}", - }, - NormalizationTest { - source: "\u{1D716}", - nfc: "\u{1D716}", - nfd: "\u{1D716}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D717}", - nfc: "\u{1D717}", - nfd: "\u{1D717}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D718}", - nfc: "\u{1D718}", - nfd: "\u{1D718}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D719}", - nfc: "\u{1D719}", - nfd: "\u{1D719}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D71A}", - nfc: "\u{1D71A}", - nfd: "\u{1D71A}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D71B}", - nfc: "\u{1D71B}", - nfd: "\u{1D71B}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D71C}", - nfc: "\u{1D71C}", - nfd: "\u{1D71C}", - nfkc: "\u{0391}", - nfkd: "\u{0391}", - }, - NormalizationTest { - source: "\u{1D71D}", - nfc: "\u{1D71D}", - nfd: "\u{1D71D}", - nfkc: "\u{0392}", - nfkd: "\u{0392}", - }, - NormalizationTest { - source: "\u{1D71E}", - nfc: "\u{1D71E}", - nfd: "\u{1D71E}", - nfkc: "\u{0393}", - nfkd: "\u{0393}", - }, - NormalizationTest { - source: "\u{1D71F}", - nfc: "\u{1D71F}", - nfd: "\u{1D71F}", - nfkc: "\u{0394}", - nfkd: "\u{0394}", - }, - NormalizationTest { - source: "\u{1D720}", - nfc: "\u{1D720}", - nfd: "\u{1D720}", - nfkc: "\u{0395}", - nfkd: "\u{0395}", - }, - NormalizationTest { - source: "\u{1D721}", - nfc: "\u{1D721}", - nfd: "\u{1D721}", - nfkc: "\u{0396}", - nfkd: "\u{0396}", - }, - NormalizationTest { - source: "\u{1D722}", - nfc: "\u{1D722}", - nfd: "\u{1D722}", - nfkc: "\u{0397}", - nfkd: "\u{0397}", - }, - NormalizationTest { - source: "\u{1D723}", - nfc: "\u{1D723}", - nfd: "\u{1D723}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D724}", - nfc: "\u{1D724}", - nfd: "\u{1D724}", - nfkc: "\u{0399}", - nfkd: "\u{0399}", - }, - NormalizationTest { - source: "\u{1D725}", - nfc: "\u{1D725}", - nfd: "\u{1D725}", - nfkc: "\u{039A}", - nfkd: "\u{039A}", - }, - NormalizationTest { - source: "\u{1D726}", - nfc: "\u{1D726}", - nfd: "\u{1D726}", - nfkc: "\u{039B}", - nfkd: "\u{039B}", - }, - NormalizationTest { - source: "\u{1D727}", - nfc: "\u{1D727}", - nfd: "\u{1D727}", - nfkc: "\u{039C}", - nfkd: "\u{039C}", - }, - NormalizationTest { - source: "\u{1D728}", - nfc: "\u{1D728}", - nfd: "\u{1D728}", - nfkc: "\u{039D}", - nfkd: "\u{039D}", - }, - NormalizationTest { - source: "\u{1D729}", - nfc: "\u{1D729}", - nfd: "\u{1D729}", - nfkc: "\u{039E}", - nfkd: "\u{039E}", - }, - NormalizationTest { - source: "\u{1D72A}", - nfc: "\u{1D72A}", - nfd: "\u{1D72A}", - nfkc: "\u{039F}", - nfkd: "\u{039F}", - }, - NormalizationTest { - source: "\u{1D72B}", - nfc: "\u{1D72B}", - nfd: "\u{1D72B}", - nfkc: "\u{03A0}", - nfkd: "\u{03A0}", - }, - NormalizationTest { - source: "\u{1D72C}", - nfc: "\u{1D72C}", - nfd: "\u{1D72C}", - nfkc: "\u{03A1}", - nfkd: "\u{03A1}", - }, - NormalizationTest { - source: "\u{1D72D}", - nfc: "\u{1D72D}", - nfd: "\u{1D72D}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D72E}", - nfc: "\u{1D72E}", - nfd: "\u{1D72E}", - nfkc: "\u{03A3}", - nfkd: "\u{03A3}", - }, - NormalizationTest { - source: "\u{1D72F}", - nfc: "\u{1D72F}", - nfd: "\u{1D72F}", - nfkc: "\u{03A4}", - nfkd: "\u{03A4}", - }, - NormalizationTest { - source: "\u{1D730}", - nfc: "\u{1D730}", - nfd: "\u{1D730}", - nfkc: "\u{03A5}", - nfkd: "\u{03A5}", - }, - NormalizationTest { - source: "\u{1D731}", - nfc: "\u{1D731}", - nfd: "\u{1D731}", - nfkc: "\u{03A6}", - nfkd: "\u{03A6}", - }, - NormalizationTest { - source: "\u{1D732}", - nfc: "\u{1D732}", - nfd: "\u{1D732}", - nfkc: "\u{03A7}", - nfkd: "\u{03A7}", - }, - NormalizationTest { - source: "\u{1D733}", - nfc: "\u{1D733}", - nfd: "\u{1D733}", - nfkc: "\u{03A8}", - nfkd: "\u{03A8}", - }, - NormalizationTest { - source: "\u{1D734}", - nfc: "\u{1D734}", - nfd: "\u{1D734}", - nfkc: "\u{03A9}", - nfkd: "\u{03A9}", - }, - NormalizationTest { - source: "\u{1D735}", - nfc: "\u{1D735}", - nfd: "\u{1D735}", - nfkc: "\u{2207}", - nfkd: "\u{2207}", - }, - NormalizationTest { - source: "\u{1D736}", - nfc: "\u{1D736}", - nfd: "\u{1D736}", - nfkc: "\u{03B1}", - nfkd: "\u{03B1}", - }, - NormalizationTest { - source: "\u{1D737}", - nfc: "\u{1D737}", - nfd: "\u{1D737}", - nfkc: "\u{03B2}", - nfkd: "\u{03B2}", - }, - NormalizationTest { - source: "\u{1D738}", - nfc: "\u{1D738}", - nfd: "\u{1D738}", - nfkc: "\u{03B3}", - nfkd: "\u{03B3}", - }, - NormalizationTest { - source: "\u{1D739}", - nfc: "\u{1D739}", - nfd: "\u{1D739}", - nfkc: "\u{03B4}", - nfkd: "\u{03B4}", - }, - NormalizationTest { - source: "\u{1D73A}", - nfc: "\u{1D73A}", - nfd: "\u{1D73A}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D73B}", - nfc: "\u{1D73B}", - nfd: "\u{1D73B}", - nfkc: "\u{03B6}", - nfkd: "\u{03B6}", - }, - NormalizationTest { - source: "\u{1D73C}", - nfc: "\u{1D73C}", - nfd: "\u{1D73C}", - nfkc: "\u{03B7}", - nfkd: "\u{03B7}", - }, - NormalizationTest { - source: "\u{1D73D}", - nfc: "\u{1D73D}", - nfd: "\u{1D73D}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D73E}", - nfc: "\u{1D73E}", - nfd: "\u{1D73E}", - nfkc: "\u{03B9}", - nfkd: "\u{03B9}", - }, - NormalizationTest { - source: "\u{1D73F}", - nfc: "\u{1D73F}", - nfd: "\u{1D73F}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D740}", - nfc: "\u{1D740}", - nfd: "\u{1D740}", - nfkc: "\u{03BB}", - nfkd: "\u{03BB}", - }, - NormalizationTest { - source: "\u{1D741}", - nfc: "\u{1D741}", - nfd: "\u{1D741}", - nfkc: "\u{03BC}", - nfkd: "\u{03BC}", - }, - NormalizationTest { - source: "\u{1D742}", - nfc: "\u{1D742}", - nfd: "\u{1D742}", - nfkc: "\u{03BD}", - nfkd: "\u{03BD}", - }, - NormalizationTest { - source: "\u{1D743}", - nfc: "\u{1D743}", - nfd: "\u{1D743}", - nfkc: "\u{03BE}", - nfkd: "\u{03BE}", - }, - NormalizationTest { - source: "\u{1D744}", - nfc: "\u{1D744}", - nfd: "\u{1D744}", - nfkc: "\u{03BF}", - nfkd: "\u{03BF}", - }, - NormalizationTest { - source: "\u{1D745}", - nfc: "\u{1D745}", - nfd: "\u{1D745}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D746}", - nfc: "\u{1D746}", - nfd: "\u{1D746}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D747}", - nfc: "\u{1D747}", - nfd: "\u{1D747}", - nfkc: "\u{03C2}", - nfkd: "\u{03C2}", - }, - NormalizationTest { - source: "\u{1D748}", - nfc: "\u{1D748}", - nfd: "\u{1D748}", - nfkc: "\u{03C3}", - nfkd: "\u{03C3}", - }, - NormalizationTest { - source: "\u{1D749}", - nfc: "\u{1D749}", - nfd: "\u{1D749}", - nfkc: "\u{03C4}", - nfkd: "\u{03C4}", - }, - NormalizationTest { - source: "\u{1D74A}", - nfc: "\u{1D74A}", - nfd: "\u{1D74A}", - nfkc: "\u{03C5}", - nfkd: "\u{03C5}", - }, - NormalizationTest { - source: "\u{1D74B}", - nfc: "\u{1D74B}", - nfd: "\u{1D74B}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D74C}", - nfc: "\u{1D74C}", - nfd: "\u{1D74C}", - nfkc: "\u{03C7}", - nfkd: "\u{03C7}", - }, - NormalizationTest { - source: "\u{1D74D}", - nfc: "\u{1D74D}", - nfd: "\u{1D74D}", - nfkc: "\u{03C8}", - nfkd: "\u{03C8}", - }, - NormalizationTest { - source: "\u{1D74E}", - nfc: "\u{1D74E}", - nfd: "\u{1D74E}", - nfkc: "\u{03C9}", - nfkd: "\u{03C9}", - }, - NormalizationTest { - source: "\u{1D74F}", - nfc: "\u{1D74F}", - nfd: "\u{1D74F}", - nfkc: "\u{2202}", - nfkd: "\u{2202}", - }, - NormalizationTest { - source: "\u{1D750}", - nfc: "\u{1D750}", - nfd: "\u{1D750}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D751}", - nfc: "\u{1D751}", - nfd: "\u{1D751}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D752}", - nfc: "\u{1D752}", - nfd: "\u{1D752}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D753}", - nfc: "\u{1D753}", - nfd: "\u{1D753}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D754}", - nfc: "\u{1D754}", - nfd: "\u{1D754}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D755}", - nfc: "\u{1D755}", - nfd: "\u{1D755}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D756}", - nfc: "\u{1D756}", - nfd: "\u{1D756}", - nfkc: "\u{0391}", - nfkd: "\u{0391}", - }, - NormalizationTest { - source: "\u{1D757}", - nfc: "\u{1D757}", - nfd: "\u{1D757}", - nfkc: "\u{0392}", - nfkd: "\u{0392}", - }, - NormalizationTest { - source: "\u{1D758}", - nfc: "\u{1D758}", - nfd: "\u{1D758}", - nfkc: "\u{0393}", - nfkd: "\u{0393}", - }, - NormalizationTest { - source: "\u{1D759}", - nfc: "\u{1D759}", - nfd: "\u{1D759}", - nfkc: "\u{0394}", - nfkd: "\u{0394}", - }, - NormalizationTest { - source: "\u{1D75A}", - nfc: "\u{1D75A}", - nfd: "\u{1D75A}", - nfkc: "\u{0395}", - nfkd: "\u{0395}", - }, - NormalizationTest { - source: "\u{1D75B}", - nfc: "\u{1D75B}", - nfd: "\u{1D75B}", - nfkc: "\u{0396}", - nfkd: "\u{0396}", - }, - NormalizationTest { - source: "\u{1D75C}", - nfc: "\u{1D75C}", - nfd: "\u{1D75C}", - nfkc: "\u{0397}", - nfkd: "\u{0397}", - }, - NormalizationTest { - source: "\u{1D75D}", - nfc: "\u{1D75D}", - nfd: "\u{1D75D}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D75E}", - nfc: "\u{1D75E}", - nfd: "\u{1D75E}", - nfkc: "\u{0399}", - nfkd: "\u{0399}", - }, - NormalizationTest { - source: "\u{1D75F}", - nfc: "\u{1D75F}", - nfd: "\u{1D75F}", - nfkc: "\u{039A}", - nfkd: "\u{039A}", - }, - NormalizationTest { - source: "\u{1D760}", - nfc: "\u{1D760}", - nfd: "\u{1D760}", - nfkc: "\u{039B}", - nfkd: "\u{039B}", - }, - NormalizationTest { - source: "\u{1D761}", - nfc: "\u{1D761}", - nfd: "\u{1D761}", - nfkc: "\u{039C}", - nfkd: "\u{039C}", - }, - NormalizationTest { - source: "\u{1D762}", - nfc: "\u{1D762}", - nfd: "\u{1D762}", - nfkc: "\u{039D}", - nfkd: "\u{039D}", - }, - NormalizationTest { - source: "\u{1D763}", - nfc: "\u{1D763}", - nfd: "\u{1D763}", - nfkc: "\u{039E}", - nfkd: "\u{039E}", - }, - NormalizationTest { - source: "\u{1D764}", - nfc: "\u{1D764}", - nfd: "\u{1D764}", - nfkc: "\u{039F}", - nfkd: "\u{039F}", - }, - NormalizationTest { - source: "\u{1D765}", - nfc: "\u{1D765}", - nfd: "\u{1D765}", - nfkc: "\u{03A0}", - nfkd: "\u{03A0}", - }, - NormalizationTest { - source: "\u{1D766}", - nfc: "\u{1D766}", - nfd: "\u{1D766}", - nfkc: "\u{03A1}", - nfkd: "\u{03A1}", - }, - NormalizationTest { - source: "\u{1D767}", - nfc: "\u{1D767}", - nfd: "\u{1D767}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D768}", - nfc: "\u{1D768}", - nfd: "\u{1D768}", - nfkc: "\u{03A3}", - nfkd: "\u{03A3}", - }, - NormalizationTest { - source: "\u{1D769}", - nfc: "\u{1D769}", - nfd: "\u{1D769}", - nfkc: "\u{03A4}", - nfkd: "\u{03A4}", - }, - NormalizationTest { - source: "\u{1D76A}", - nfc: "\u{1D76A}", - nfd: "\u{1D76A}", - nfkc: "\u{03A5}", - nfkd: "\u{03A5}", - }, - NormalizationTest { - source: "\u{1D76B}", - nfc: "\u{1D76B}", - nfd: "\u{1D76B}", - nfkc: "\u{03A6}", - nfkd: "\u{03A6}", - }, - NormalizationTest { - source: "\u{1D76C}", - nfc: "\u{1D76C}", - nfd: "\u{1D76C}", - nfkc: "\u{03A7}", - nfkd: "\u{03A7}", - }, - NormalizationTest { - source: "\u{1D76D}", - nfc: "\u{1D76D}", - nfd: "\u{1D76D}", - nfkc: "\u{03A8}", - nfkd: "\u{03A8}", - }, - NormalizationTest { - source: "\u{1D76E}", - nfc: "\u{1D76E}", - nfd: "\u{1D76E}", - nfkc: "\u{03A9}", - nfkd: "\u{03A9}", - }, - NormalizationTest { - source: "\u{1D76F}", - nfc: "\u{1D76F}", - nfd: "\u{1D76F}", - nfkc: "\u{2207}", - nfkd: "\u{2207}", - }, - NormalizationTest { - source: "\u{1D770}", - nfc: "\u{1D770}", - nfd: "\u{1D770}", - nfkc: "\u{03B1}", - nfkd: "\u{03B1}", - }, - NormalizationTest { - source: "\u{1D771}", - nfc: "\u{1D771}", - nfd: "\u{1D771}", - nfkc: "\u{03B2}", - nfkd: "\u{03B2}", - }, - NormalizationTest { - source: "\u{1D772}", - nfc: "\u{1D772}", - nfd: "\u{1D772}", - nfkc: "\u{03B3}", - nfkd: "\u{03B3}", - }, - NormalizationTest { - source: "\u{1D773}", - nfc: "\u{1D773}", - nfd: "\u{1D773}", - nfkc: "\u{03B4}", - nfkd: "\u{03B4}", - }, - NormalizationTest { - source: "\u{1D774}", - nfc: "\u{1D774}", - nfd: "\u{1D774}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D775}", - nfc: "\u{1D775}", - nfd: "\u{1D775}", - nfkc: "\u{03B6}", - nfkd: "\u{03B6}", - }, - NormalizationTest { - source: "\u{1D776}", - nfc: "\u{1D776}", - nfd: "\u{1D776}", - nfkc: "\u{03B7}", - nfkd: "\u{03B7}", - }, - NormalizationTest { - source: "\u{1D777}", - nfc: "\u{1D777}", - nfd: "\u{1D777}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D778}", - nfc: "\u{1D778}", - nfd: "\u{1D778}", - nfkc: "\u{03B9}", - nfkd: "\u{03B9}", - }, - NormalizationTest { - source: "\u{1D779}", - nfc: "\u{1D779}", - nfd: "\u{1D779}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D77A}", - nfc: "\u{1D77A}", - nfd: "\u{1D77A}", - nfkc: "\u{03BB}", - nfkd: "\u{03BB}", - }, - NormalizationTest { - source: "\u{1D77B}", - nfc: "\u{1D77B}", - nfd: "\u{1D77B}", - nfkc: "\u{03BC}", - nfkd: "\u{03BC}", - }, - NormalizationTest { - source: "\u{1D77C}", - nfc: "\u{1D77C}", - nfd: "\u{1D77C}", - nfkc: "\u{03BD}", - nfkd: "\u{03BD}", - }, - NormalizationTest { - source: "\u{1D77D}", - nfc: "\u{1D77D}", - nfd: "\u{1D77D}", - nfkc: "\u{03BE}", - nfkd: "\u{03BE}", - }, - NormalizationTest { - source: "\u{1D77E}", - nfc: "\u{1D77E}", - nfd: "\u{1D77E}", - nfkc: "\u{03BF}", - nfkd: "\u{03BF}", - }, - NormalizationTest { - source: "\u{1D77F}", - nfc: "\u{1D77F}", - nfd: "\u{1D77F}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D780}", - nfc: "\u{1D780}", - nfd: "\u{1D780}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D781}", - nfc: "\u{1D781}", - nfd: "\u{1D781}", - nfkc: "\u{03C2}", - nfkd: "\u{03C2}", - }, - NormalizationTest { - source: "\u{1D782}", - nfc: "\u{1D782}", - nfd: "\u{1D782}", - nfkc: "\u{03C3}", - nfkd: "\u{03C3}", - }, - NormalizationTest { - source: "\u{1D783}", - nfc: "\u{1D783}", - nfd: "\u{1D783}", - nfkc: "\u{03C4}", - nfkd: "\u{03C4}", - }, - NormalizationTest { - source: "\u{1D784}", - nfc: "\u{1D784}", - nfd: "\u{1D784}", - nfkc: "\u{03C5}", - nfkd: "\u{03C5}", - }, - NormalizationTest { - source: "\u{1D785}", - nfc: "\u{1D785}", - nfd: "\u{1D785}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D786}", - nfc: "\u{1D786}", - nfd: "\u{1D786}", - nfkc: "\u{03C7}", - nfkd: "\u{03C7}", - }, - NormalizationTest { - source: "\u{1D787}", - nfc: "\u{1D787}", - nfd: "\u{1D787}", - nfkc: "\u{03C8}", - nfkd: "\u{03C8}", - }, - NormalizationTest { - source: "\u{1D788}", - nfc: "\u{1D788}", - nfd: "\u{1D788}", - nfkc: "\u{03C9}", - nfkd: "\u{03C9}", - }, - NormalizationTest { - source: "\u{1D789}", - nfc: "\u{1D789}", - nfd: "\u{1D789}", - nfkc: "\u{2202}", - nfkd: "\u{2202}", - }, - NormalizationTest { - source: "\u{1D78A}", - nfc: "\u{1D78A}", - nfd: "\u{1D78A}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D78B}", - nfc: "\u{1D78B}", - nfd: "\u{1D78B}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D78C}", - nfc: "\u{1D78C}", - nfd: "\u{1D78C}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D78D}", - nfc: "\u{1D78D}", - nfd: "\u{1D78D}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D78E}", - nfc: "\u{1D78E}", - nfd: "\u{1D78E}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D78F}", - nfc: "\u{1D78F}", - nfd: "\u{1D78F}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D790}", - nfc: "\u{1D790}", - nfd: "\u{1D790}", - nfkc: "\u{0391}", - nfkd: "\u{0391}", - }, - NormalizationTest { - source: "\u{1D791}", - nfc: "\u{1D791}", - nfd: "\u{1D791}", - nfkc: "\u{0392}", - nfkd: "\u{0392}", - }, - NormalizationTest { - source: "\u{1D792}", - nfc: "\u{1D792}", - nfd: "\u{1D792}", - nfkc: "\u{0393}", - nfkd: "\u{0393}", - }, - NormalizationTest { - source: "\u{1D793}", - nfc: "\u{1D793}", - nfd: "\u{1D793}", - nfkc: "\u{0394}", - nfkd: "\u{0394}", - }, - NormalizationTest { - source: "\u{1D794}", - nfc: "\u{1D794}", - nfd: "\u{1D794}", - nfkc: "\u{0395}", - nfkd: "\u{0395}", - }, - NormalizationTest { - source: "\u{1D795}", - nfc: "\u{1D795}", - nfd: "\u{1D795}", - nfkc: "\u{0396}", - nfkd: "\u{0396}", - }, - NormalizationTest { - source: "\u{1D796}", - nfc: "\u{1D796}", - nfd: "\u{1D796}", - nfkc: "\u{0397}", - nfkd: "\u{0397}", - }, - NormalizationTest { - source: "\u{1D797}", - nfc: "\u{1D797}", - nfd: "\u{1D797}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D798}", - nfc: "\u{1D798}", - nfd: "\u{1D798}", - nfkc: "\u{0399}", - nfkd: "\u{0399}", - }, - NormalizationTest { - source: "\u{1D799}", - nfc: "\u{1D799}", - nfd: "\u{1D799}", - nfkc: "\u{039A}", - nfkd: "\u{039A}", - }, - NormalizationTest { - source: "\u{1D79A}", - nfc: "\u{1D79A}", - nfd: "\u{1D79A}", - nfkc: "\u{039B}", - nfkd: "\u{039B}", - }, - NormalizationTest { - source: "\u{1D79B}", - nfc: "\u{1D79B}", - nfd: "\u{1D79B}", - nfkc: "\u{039C}", - nfkd: "\u{039C}", - }, - NormalizationTest { - source: "\u{1D79C}", - nfc: "\u{1D79C}", - nfd: "\u{1D79C}", - nfkc: "\u{039D}", - nfkd: "\u{039D}", - }, - NormalizationTest { - source: "\u{1D79D}", - nfc: "\u{1D79D}", - nfd: "\u{1D79D}", - nfkc: "\u{039E}", - nfkd: "\u{039E}", - }, - NormalizationTest { - source: "\u{1D79E}", - nfc: "\u{1D79E}", - nfd: "\u{1D79E}", - nfkc: "\u{039F}", - nfkd: "\u{039F}", - }, - NormalizationTest { - source: "\u{1D79F}", - nfc: "\u{1D79F}", - nfd: "\u{1D79F}", - nfkc: "\u{03A0}", - nfkd: "\u{03A0}", - }, - NormalizationTest { - source: "\u{1D7A0}", - nfc: "\u{1D7A0}", - nfd: "\u{1D7A0}", - nfkc: "\u{03A1}", - nfkd: "\u{03A1}", - }, - NormalizationTest { - source: "\u{1D7A1}", - nfc: "\u{1D7A1}", - nfd: "\u{1D7A1}", - nfkc: "\u{0398}", - nfkd: "\u{0398}", - }, - NormalizationTest { - source: "\u{1D7A2}", - nfc: "\u{1D7A2}", - nfd: "\u{1D7A2}", - nfkc: "\u{03A3}", - nfkd: "\u{03A3}", - }, - NormalizationTest { - source: "\u{1D7A3}", - nfc: "\u{1D7A3}", - nfd: "\u{1D7A3}", - nfkc: "\u{03A4}", - nfkd: "\u{03A4}", - }, - NormalizationTest { - source: "\u{1D7A4}", - nfc: "\u{1D7A4}", - nfd: "\u{1D7A4}", - nfkc: "\u{03A5}", - nfkd: "\u{03A5}", - }, - NormalizationTest { - source: "\u{1D7A5}", - nfc: "\u{1D7A5}", - nfd: "\u{1D7A5}", - nfkc: "\u{03A6}", - nfkd: "\u{03A6}", - }, - NormalizationTest { - source: "\u{1D7A6}", - nfc: "\u{1D7A6}", - nfd: "\u{1D7A6}", - nfkc: "\u{03A7}", - nfkd: "\u{03A7}", - }, - NormalizationTest { - source: "\u{1D7A7}", - nfc: "\u{1D7A7}", - nfd: "\u{1D7A7}", - nfkc: "\u{03A8}", - nfkd: "\u{03A8}", - }, - NormalizationTest { - source: "\u{1D7A8}", - nfc: "\u{1D7A8}", - nfd: "\u{1D7A8}", - nfkc: "\u{03A9}", - nfkd: "\u{03A9}", - }, - NormalizationTest { - source: "\u{1D7A9}", - nfc: "\u{1D7A9}", - nfd: "\u{1D7A9}", - nfkc: "\u{2207}", - nfkd: "\u{2207}", - }, - NormalizationTest { - source: "\u{1D7AA}", - nfc: "\u{1D7AA}", - nfd: "\u{1D7AA}", - nfkc: "\u{03B1}", - nfkd: "\u{03B1}", - }, - NormalizationTest { - source: "\u{1D7AB}", - nfc: "\u{1D7AB}", - nfd: "\u{1D7AB}", - nfkc: "\u{03B2}", - nfkd: "\u{03B2}", - }, - NormalizationTest { - source: "\u{1D7AC}", - nfc: "\u{1D7AC}", - nfd: "\u{1D7AC}", - nfkc: "\u{03B3}", - nfkd: "\u{03B3}", - }, - NormalizationTest { - source: "\u{1D7AD}", - nfc: "\u{1D7AD}", - nfd: "\u{1D7AD}", - nfkc: "\u{03B4}", - nfkd: "\u{03B4}", - }, - NormalizationTest { - source: "\u{1D7AE}", - nfc: "\u{1D7AE}", - nfd: "\u{1D7AE}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D7AF}", - nfc: "\u{1D7AF}", - nfd: "\u{1D7AF}", - nfkc: "\u{03B6}", - nfkd: "\u{03B6}", - }, - NormalizationTest { - source: "\u{1D7B0}", - nfc: "\u{1D7B0}", - nfd: "\u{1D7B0}", - nfkc: "\u{03B7}", - nfkd: "\u{03B7}", - }, - NormalizationTest { - source: "\u{1D7B1}", - nfc: "\u{1D7B1}", - nfd: "\u{1D7B1}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D7B2}", - nfc: "\u{1D7B2}", - nfd: "\u{1D7B2}", - nfkc: "\u{03B9}", - nfkd: "\u{03B9}", - }, - NormalizationTest { - source: "\u{1D7B3}", - nfc: "\u{1D7B3}", - nfd: "\u{1D7B3}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D7B4}", - nfc: "\u{1D7B4}", - nfd: "\u{1D7B4}", - nfkc: "\u{03BB}", - nfkd: "\u{03BB}", - }, - NormalizationTest { - source: "\u{1D7B5}", - nfc: "\u{1D7B5}", - nfd: "\u{1D7B5}", - nfkc: "\u{03BC}", - nfkd: "\u{03BC}", - }, - NormalizationTest { - source: "\u{1D7B6}", - nfc: "\u{1D7B6}", - nfd: "\u{1D7B6}", - nfkc: "\u{03BD}", - nfkd: "\u{03BD}", - }, - NormalizationTest { - source: "\u{1D7B7}", - nfc: "\u{1D7B7}", - nfd: "\u{1D7B7}", - nfkc: "\u{03BE}", - nfkd: "\u{03BE}", - }, - NormalizationTest { - source: "\u{1D7B8}", - nfc: "\u{1D7B8}", - nfd: "\u{1D7B8}", - nfkc: "\u{03BF}", - nfkd: "\u{03BF}", - }, - NormalizationTest { - source: "\u{1D7B9}", - nfc: "\u{1D7B9}", - nfd: "\u{1D7B9}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D7BA}", - nfc: "\u{1D7BA}", - nfd: "\u{1D7BA}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D7BB}", - nfc: "\u{1D7BB}", - nfd: "\u{1D7BB}", - nfkc: "\u{03C2}", - nfkd: "\u{03C2}", - }, - NormalizationTest { - source: "\u{1D7BC}", - nfc: "\u{1D7BC}", - nfd: "\u{1D7BC}", - nfkc: "\u{03C3}", - nfkd: "\u{03C3}", - }, - NormalizationTest { - source: "\u{1D7BD}", - nfc: "\u{1D7BD}", - nfd: "\u{1D7BD}", - nfkc: "\u{03C4}", - nfkd: "\u{03C4}", - }, - NormalizationTest { - source: "\u{1D7BE}", - nfc: "\u{1D7BE}", - nfd: "\u{1D7BE}", - nfkc: "\u{03C5}", - nfkd: "\u{03C5}", - }, - NormalizationTest { - source: "\u{1D7BF}", - nfc: "\u{1D7BF}", - nfd: "\u{1D7BF}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D7C0}", - nfc: "\u{1D7C0}", - nfd: "\u{1D7C0}", - nfkc: "\u{03C7}", - nfkd: "\u{03C7}", - }, - NormalizationTest { - source: "\u{1D7C1}", - nfc: "\u{1D7C1}", - nfd: "\u{1D7C1}", - nfkc: "\u{03C8}", - nfkd: "\u{03C8}", - }, - NormalizationTest { - source: "\u{1D7C2}", - nfc: "\u{1D7C2}", - nfd: "\u{1D7C2}", - nfkc: "\u{03C9}", - nfkd: "\u{03C9}", - }, - NormalizationTest { - source: "\u{1D7C3}", - nfc: "\u{1D7C3}", - nfd: "\u{1D7C3}", - nfkc: "\u{2202}", - nfkd: "\u{2202}", - }, - NormalizationTest { - source: "\u{1D7C4}", - nfc: "\u{1D7C4}", - nfd: "\u{1D7C4}", - nfkc: "\u{03B5}", - nfkd: "\u{03B5}", - }, - NormalizationTest { - source: "\u{1D7C5}", - nfc: "\u{1D7C5}", - nfd: "\u{1D7C5}", - nfkc: "\u{03B8}", - nfkd: "\u{03B8}", - }, - NormalizationTest { - source: "\u{1D7C6}", - nfc: "\u{1D7C6}", - nfd: "\u{1D7C6}", - nfkc: "\u{03BA}", - nfkd: "\u{03BA}", - }, - NormalizationTest { - source: "\u{1D7C7}", - nfc: "\u{1D7C7}", - nfd: "\u{1D7C7}", - nfkc: "\u{03C6}", - nfkd: "\u{03C6}", - }, - NormalizationTest { - source: "\u{1D7C8}", - nfc: "\u{1D7C8}", - nfd: "\u{1D7C8}", - nfkc: "\u{03C1}", - nfkd: "\u{03C1}", - }, - NormalizationTest { - source: "\u{1D7C9}", - nfc: "\u{1D7C9}", - nfd: "\u{1D7C9}", - nfkc: "\u{03C0}", - nfkd: "\u{03C0}", - }, - NormalizationTest { - source: "\u{1D7CA}", - nfc: "\u{1D7CA}", - nfd: "\u{1D7CA}", - nfkc: "\u{03DC}", - nfkd: "\u{03DC}", - }, - NormalizationTest { - source: "\u{1D7CB}", - nfc: "\u{1D7CB}", - nfd: "\u{1D7CB}", - nfkc: "\u{03DD}", - nfkd: "\u{03DD}", - }, - NormalizationTest { - source: "\u{1D7CE}", - nfc: "\u{1D7CE}", - nfd: "\u{1D7CE}", - nfkc: "\u{0030}", - nfkd: "\u{0030}", - }, - NormalizationTest { - source: "\u{1D7CF}", - nfc: "\u{1D7CF}", - nfd: "\u{1D7CF}", - nfkc: "\u{0031}", - nfkd: "\u{0031}", - }, - NormalizationTest { - source: "\u{1D7D0}", - nfc: "\u{1D7D0}", - nfd: "\u{1D7D0}", - nfkc: "\u{0032}", - nfkd: "\u{0032}", - }, - NormalizationTest { - source: "\u{1D7D1}", - nfc: "\u{1D7D1}", - nfd: "\u{1D7D1}", - nfkc: "\u{0033}", - nfkd: "\u{0033}", - }, - NormalizationTest { - source: "\u{1D7D2}", - nfc: "\u{1D7D2}", - nfd: "\u{1D7D2}", - nfkc: "\u{0034}", - nfkd: "\u{0034}", - }, - NormalizationTest { - source: "\u{1D7D3}", - nfc: "\u{1D7D3}", - nfd: "\u{1D7D3}", - nfkc: "\u{0035}", - nfkd: "\u{0035}", - }, - NormalizationTest { - source: "\u{1D7D4}", - nfc: "\u{1D7D4}", - nfd: "\u{1D7D4}", - nfkc: "\u{0036}", - nfkd: "\u{0036}", - }, - NormalizationTest { - source: "\u{1D7D5}", - nfc: "\u{1D7D5}", - nfd: "\u{1D7D5}", - nfkc: "\u{0037}", - nfkd: "\u{0037}", - }, - NormalizationTest { - source: "\u{1D7D6}", - nfc: "\u{1D7D6}", - nfd: "\u{1D7D6}", - nfkc: "\u{0038}", - nfkd: "\u{0038}", - }, - NormalizationTest { - source: "\u{1D7D7}", - nfc: "\u{1D7D7}", - nfd: "\u{1D7D7}", - nfkc: "\u{0039}", - nfkd: "\u{0039}", - }, - NormalizationTest { - source: "\u{1D7D8}", - nfc: "\u{1D7D8}", - nfd: "\u{1D7D8}", - nfkc: "\u{0030}", - nfkd: "\u{0030}", - }, - NormalizationTest { - source: "\u{1D7D9}", - nfc: "\u{1D7D9}", - nfd: "\u{1D7D9}", - nfkc: "\u{0031}", - nfkd: "\u{0031}", - }, - NormalizationTest { - source: "\u{1D7DA}", - nfc: "\u{1D7DA}", - nfd: "\u{1D7DA}", - nfkc: "\u{0032}", - nfkd: "\u{0032}", - }, - NormalizationTest { - source: "\u{1D7DB}", - nfc: "\u{1D7DB}", - nfd: "\u{1D7DB}", - nfkc: "\u{0033}", - nfkd: "\u{0033}", - }, - NormalizationTest { - source: "\u{1D7DC}", - nfc: "\u{1D7DC}", - nfd: "\u{1D7DC}", - nfkc: "\u{0034}", - nfkd: "\u{0034}", - }, - NormalizationTest { - source: "\u{1D7DD}", - nfc: "\u{1D7DD}", - nfd: "\u{1D7DD}", - nfkc: "\u{0035}", - nfkd: "\u{0035}", - }, - NormalizationTest { - source: "\u{1D7DE}", - nfc: "\u{1D7DE}", - nfd: "\u{1D7DE}", - nfkc: "\u{0036}", - nfkd: "\u{0036}", - }, - NormalizationTest { - source: "\u{1D7DF}", - nfc: "\u{1D7DF}", - nfd: "\u{1D7DF}", - nfkc: "\u{0037}", - nfkd: "\u{0037}", - }, - NormalizationTest { - source: "\u{1D7E0}", - nfc: "\u{1D7E0}", - nfd: "\u{1D7E0}", - nfkc: "\u{0038}", - nfkd: "\u{0038}", - }, - NormalizationTest { - source: "\u{1D7E1}", - nfc: "\u{1D7E1}", - nfd: "\u{1D7E1}", - nfkc: "\u{0039}", - nfkd: "\u{0039}", - }, - NormalizationTest { - source: "\u{1D7E2}", - nfc: "\u{1D7E2}", - nfd: "\u{1D7E2}", - nfkc: "\u{0030}", - nfkd: "\u{0030}", - }, - NormalizationTest { - source: "\u{1D7E3}", - nfc: "\u{1D7E3}", - nfd: "\u{1D7E3}", - nfkc: "\u{0031}", - nfkd: "\u{0031}", - }, - NormalizationTest { - source: "\u{1D7E4}", - nfc: "\u{1D7E4}", - nfd: "\u{1D7E4}", - nfkc: "\u{0032}", - nfkd: "\u{0032}", - }, - NormalizationTest { - source: "\u{1D7E5}", - nfc: "\u{1D7E5}", - nfd: "\u{1D7E5}", - nfkc: "\u{0033}", - nfkd: "\u{0033}", - }, - NormalizationTest { - source: "\u{1D7E6}", - nfc: "\u{1D7E6}", - nfd: "\u{1D7E6}", - nfkc: "\u{0034}", - nfkd: "\u{0034}", - }, - NormalizationTest { - source: "\u{1D7E7}", - nfc: "\u{1D7E7}", - nfd: "\u{1D7E7}", - nfkc: "\u{0035}", - nfkd: "\u{0035}", - }, - NormalizationTest { - source: "\u{1D7E8}", - nfc: "\u{1D7E8}", - nfd: "\u{1D7E8}", - nfkc: "\u{0036}", - nfkd: "\u{0036}", - }, - NormalizationTest { - source: "\u{1D7E9}", - nfc: "\u{1D7E9}", - nfd: "\u{1D7E9}", - nfkc: "\u{0037}", - nfkd: "\u{0037}", - }, - NormalizationTest { - source: "\u{1D7EA}", - nfc: "\u{1D7EA}", - nfd: "\u{1D7EA}", - nfkc: "\u{0038}", - nfkd: "\u{0038}", - }, - NormalizationTest { - source: "\u{1D7EB}", - nfc: "\u{1D7EB}", - nfd: "\u{1D7EB}", - nfkc: "\u{0039}", - nfkd: "\u{0039}", - }, - NormalizationTest { - source: "\u{1D7EC}", - nfc: "\u{1D7EC}", - nfd: "\u{1D7EC}", - nfkc: "\u{0030}", - nfkd: "\u{0030}", - }, - NormalizationTest { - source: "\u{1D7ED}", - nfc: "\u{1D7ED}", - nfd: "\u{1D7ED}", - nfkc: "\u{0031}", - nfkd: "\u{0031}", - }, - NormalizationTest { - source: "\u{1D7EE}", - nfc: "\u{1D7EE}", - nfd: "\u{1D7EE}", - nfkc: "\u{0032}", - nfkd: "\u{0032}", - }, - NormalizationTest { - source: "\u{1D7EF}", - nfc: "\u{1D7EF}", - nfd: "\u{1D7EF}", - nfkc: "\u{0033}", - nfkd: "\u{0033}", - }, - NormalizationTest { - source: "\u{1D7F0}", - nfc: "\u{1D7F0}", - nfd: "\u{1D7F0}", - nfkc: "\u{0034}", - nfkd: "\u{0034}", - }, - NormalizationTest { - source: "\u{1D7F1}", - nfc: "\u{1D7F1}", - nfd: "\u{1D7F1}", - nfkc: "\u{0035}", - nfkd: "\u{0035}", - }, - NormalizationTest { - source: "\u{1D7F2}", - nfc: "\u{1D7F2}", - nfd: "\u{1D7F2}", - nfkc: "\u{0036}", - nfkd: "\u{0036}", - }, - NormalizationTest { - source: "\u{1D7F3}", - nfc: "\u{1D7F3}", - nfd: "\u{1D7F3}", - nfkc: "\u{0037}", - nfkd: "\u{0037}", - }, - NormalizationTest { - source: "\u{1D7F4}", - nfc: "\u{1D7F4}", - nfd: "\u{1D7F4}", - nfkc: "\u{0038}", - nfkd: "\u{0038}", - }, - NormalizationTest { - source: "\u{1D7F5}", - nfc: "\u{1D7F5}", - nfd: "\u{1D7F5}", - nfkc: "\u{0039}", - nfkd: "\u{0039}", - }, - NormalizationTest { - source: "\u{1D7F6}", - nfc: "\u{1D7F6}", - nfd: "\u{1D7F6}", - nfkc: "\u{0030}", - nfkd: "\u{0030}", - }, - NormalizationTest { - source: "\u{1D7F7}", - nfc: "\u{1D7F7}", - nfd: "\u{1D7F7}", - nfkc: "\u{0031}", - nfkd: "\u{0031}", - }, - NormalizationTest { - source: "\u{1D7F8}", - nfc: "\u{1D7F8}", - nfd: "\u{1D7F8}", - nfkc: "\u{0032}", - nfkd: "\u{0032}", - }, - NormalizationTest { - source: "\u{1D7F9}", - nfc: "\u{1D7F9}", - nfd: "\u{1D7F9}", - nfkc: "\u{0033}", - nfkd: "\u{0033}", - }, - NormalizationTest { - source: "\u{1D7FA}", - nfc: "\u{1D7FA}", - nfd: "\u{1D7FA}", - nfkc: "\u{0034}", - nfkd: "\u{0034}", - }, - NormalizationTest { - source: "\u{1D7FB}", - nfc: "\u{1D7FB}", - nfd: "\u{1D7FB}", - nfkc: "\u{0035}", - nfkd: "\u{0035}", - }, - NormalizationTest { - source: "\u{1D7FC}", - nfc: "\u{1D7FC}", - nfd: "\u{1D7FC}", - nfkc: "\u{0036}", - nfkd: "\u{0036}", - }, - NormalizationTest { - source: "\u{1D7FD}", - nfc: "\u{1D7FD}", - nfd: "\u{1D7FD}", - nfkc: "\u{0037}", - nfkd: "\u{0037}", - }, - NormalizationTest { - source: "\u{1D7FE}", - nfc: "\u{1D7FE}", - nfd: "\u{1D7FE}", - nfkc: "\u{0038}", - nfkd: "\u{0038}", - }, - NormalizationTest { - source: "\u{1D7FF}", - nfc: "\u{1D7FF}", - nfd: "\u{1D7FF}", - nfkc: "\u{0039}", - nfkd: "\u{0039}", - }, - NormalizationTest { - source: "\u{1EE00}", - nfc: "\u{1EE00}", - nfd: "\u{1EE00}", - nfkc: "\u{0627}", - nfkd: "\u{0627}", - }, - NormalizationTest { - source: "\u{1EE01}", - nfc: "\u{1EE01}", - nfd: "\u{1EE01}", - nfkc: "\u{0628}", - nfkd: "\u{0628}", - }, - NormalizationTest { - source: "\u{1EE02}", - nfc: "\u{1EE02}", - nfd: "\u{1EE02}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{1EE03}", - nfc: "\u{1EE03}", - nfd: "\u{1EE03}", - nfkc: "\u{062F}", - nfkd: "\u{062F}", - }, - NormalizationTest { - source: "\u{1EE05}", - nfc: "\u{1EE05}", - nfd: "\u{1EE05}", - nfkc: "\u{0648}", - nfkd: "\u{0648}", - }, - NormalizationTest { - source: "\u{1EE06}", - nfc: "\u{1EE06}", - nfd: "\u{1EE06}", - nfkc: "\u{0632}", - nfkd: "\u{0632}", - }, - NormalizationTest { - source: "\u{1EE07}", - nfc: "\u{1EE07}", - nfd: "\u{1EE07}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{1EE08}", - nfc: "\u{1EE08}", - nfd: "\u{1EE08}", - nfkc: "\u{0637}", - nfkd: "\u{0637}", - }, - NormalizationTest { - source: "\u{1EE09}", - nfc: "\u{1EE09}", - nfd: "\u{1EE09}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{1EE0A}", - nfc: "\u{1EE0A}", - nfd: "\u{1EE0A}", - nfkc: "\u{0643}", - nfkd: "\u{0643}", - }, - NormalizationTest { - source: "\u{1EE0B}", - nfc: "\u{1EE0B}", - nfd: "\u{1EE0B}", - nfkc: "\u{0644}", - nfkd: "\u{0644}", - }, - NormalizationTest { - source: "\u{1EE0C}", - nfc: "\u{1EE0C}", - nfd: "\u{1EE0C}", - nfkc: "\u{0645}", - nfkd: "\u{0645}", - }, - NormalizationTest { - source: "\u{1EE0D}", - nfc: "\u{1EE0D}", - nfd: "\u{1EE0D}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{1EE0E}", - nfc: "\u{1EE0E}", - nfd: "\u{1EE0E}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{1EE0F}", - nfc: "\u{1EE0F}", - nfd: "\u{1EE0F}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{1EE10}", - nfc: "\u{1EE10}", - nfd: "\u{1EE10}", - nfkc: "\u{0641}", - nfkd: "\u{0641}", - }, - NormalizationTest { - source: "\u{1EE11}", - nfc: "\u{1EE11}", - nfd: "\u{1EE11}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{1EE12}", - nfc: "\u{1EE12}", - nfd: "\u{1EE12}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{1EE13}", - nfc: "\u{1EE13}", - nfd: "\u{1EE13}", - nfkc: "\u{0631}", - nfkd: "\u{0631}", - }, - NormalizationTest { - source: "\u{1EE14}", - nfc: "\u{1EE14}", - nfd: "\u{1EE14}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{1EE15}", - nfc: "\u{1EE15}", - nfd: "\u{1EE15}", - nfkc: "\u{062A}", - nfkd: "\u{062A}", - }, - NormalizationTest { - source: "\u{1EE16}", - nfc: "\u{1EE16}", - nfd: "\u{1EE16}", - nfkc: "\u{062B}", - nfkd: "\u{062B}", - }, - NormalizationTest { - source: "\u{1EE17}", - nfc: "\u{1EE17}", - nfd: "\u{1EE17}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{1EE18}", - nfc: "\u{1EE18}", - nfd: "\u{1EE18}", - nfkc: "\u{0630}", - nfkd: "\u{0630}", - }, - NormalizationTest { - source: "\u{1EE19}", - nfc: "\u{1EE19}", - nfd: "\u{1EE19}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{1EE1A}", - nfc: "\u{1EE1A}", - nfd: "\u{1EE1A}", - nfkc: "\u{0638}", - nfkd: "\u{0638}", - }, - NormalizationTest { - source: "\u{1EE1B}", - nfc: "\u{1EE1B}", - nfd: "\u{1EE1B}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{1EE1C}", - nfc: "\u{1EE1C}", - nfd: "\u{1EE1C}", - nfkc: "\u{066E}", - nfkd: "\u{066E}", - }, - NormalizationTest { - source: "\u{1EE1D}", - nfc: "\u{1EE1D}", - nfd: "\u{1EE1D}", - nfkc: "\u{06BA}", - nfkd: "\u{06BA}", - }, - NormalizationTest { - source: "\u{1EE1E}", - nfc: "\u{1EE1E}", - nfd: "\u{1EE1E}", - nfkc: "\u{06A1}", - nfkd: "\u{06A1}", - }, - NormalizationTest { - source: "\u{1EE1F}", - nfc: "\u{1EE1F}", - nfd: "\u{1EE1F}", - nfkc: "\u{066F}", - nfkd: "\u{066F}", - }, - NormalizationTest { - source: "\u{1EE21}", - nfc: "\u{1EE21}", - nfd: "\u{1EE21}", - nfkc: "\u{0628}", - nfkd: "\u{0628}", - }, - NormalizationTest { - source: "\u{1EE22}", - nfc: "\u{1EE22}", - nfd: "\u{1EE22}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{1EE24}", - nfc: "\u{1EE24}", - nfd: "\u{1EE24}", - nfkc: "\u{0647}", - nfkd: "\u{0647}", - }, - NormalizationTest { - source: "\u{1EE27}", - nfc: "\u{1EE27}", - nfd: "\u{1EE27}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{1EE29}", - nfc: "\u{1EE29}", - nfd: "\u{1EE29}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{1EE2A}", - nfc: "\u{1EE2A}", - nfd: "\u{1EE2A}", - nfkc: "\u{0643}", - nfkd: "\u{0643}", - }, - NormalizationTest { - source: "\u{1EE2B}", - nfc: "\u{1EE2B}", - nfd: "\u{1EE2B}", - nfkc: "\u{0644}", - nfkd: "\u{0644}", - }, - NormalizationTest { - source: "\u{1EE2C}", - nfc: "\u{1EE2C}", - nfd: "\u{1EE2C}", - nfkc: "\u{0645}", - nfkd: "\u{0645}", - }, - NormalizationTest { - source: "\u{1EE2D}", - nfc: "\u{1EE2D}", - nfd: "\u{1EE2D}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{1EE2E}", - nfc: "\u{1EE2E}", - nfd: "\u{1EE2E}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{1EE2F}", - nfc: "\u{1EE2F}", - nfd: "\u{1EE2F}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{1EE30}", - nfc: "\u{1EE30}", - nfd: "\u{1EE30}", - nfkc: "\u{0641}", - nfkd: "\u{0641}", - }, - NormalizationTest { - source: "\u{1EE31}", - nfc: "\u{1EE31}", - nfd: "\u{1EE31}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{1EE32}", - nfc: "\u{1EE32}", - nfd: "\u{1EE32}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{1EE34}", - nfc: "\u{1EE34}", - nfd: "\u{1EE34}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{1EE35}", - nfc: "\u{1EE35}", - nfd: "\u{1EE35}", - nfkc: "\u{062A}", - nfkd: "\u{062A}", - }, - NormalizationTest { - source: "\u{1EE36}", - nfc: "\u{1EE36}", - nfd: "\u{1EE36}", - nfkc: "\u{062B}", - nfkd: "\u{062B}", - }, - NormalizationTest { - source: "\u{1EE37}", - nfc: "\u{1EE37}", - nfd: "\u{1EE37}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{1EE39}", - nfc: "\u{1EE39}", - nfd: "\u{1EE39}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{1EE3B}", - nfc: "\u{1EE3B}", - nfd: "\u{1EE3B}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{1EE42}", - nfc: "\u{1EE42}", - nfd: "\u{1EE42}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{1EE47}", - nfc: "\u{1EE47}", - nfd: "\u{1EE47}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{1EE49}", - nfc: "\u{1EE49}", - nfd: "\u{1EE49}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{1EE4B}", - nfc: "\u{1EE4B}", - nfd: "\u{1EE4B}", - nfkc: "\u{0644}", - nfkd: "\u{0644}", - }, - NormalizationTest { - source: "\u{1EE4D}", - nfc: "\u{1EE4D}", - nfd: "\u{1EE4D}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{1EE4E}", - nfc: "\u{1EE4E}", - nfd: "\u{1EE4E}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{1EE4F}", - nfc: "\u{1EE4F}", - nfd: "\u{1EE4F}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{1EE51}", - nfc: "\u{1EE51}", - nfd: "\u{1EE51}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{1EE52}", - nfc: "\u{1EE52}", - nfd: "\u{1EE52}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{1EE54}", - nfc: "\u{1EE54}", - nfd: "\u{1EE54}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{1EE57}", - nfc: "\u{1EE57}", - nfd: "\u{1EE57}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{1EE59}", - nfc: "\u{1EE59}", - nfd: "\u{1EE59}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{1EE5B}", - nfc: "\u{1EE5B}", - nfd: "\u{1EE5B}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{1EE5D}", - nfc: "\u{1EE5D}", - nfd: "\u{1EE5D}", - nfkc: "\u{06BA}", - nfkd: "\u{06BA}", - }, - NormalizationTest { - source: "\u{1EE5F}", - nfc: "\u{1EE5F}", - nfd: "\u{1EE5F}", - nfkc: "\u{066F}", - nfkd: "\u{066F}", - }, - NormalizationTest { - source: "\u{1EE61}", - nfc: "\u{1EE61}", - nfd: "\u{1EE61}", - nfkc: "\u{0628}", - nfkd: "\u{0628}", - }, - NormalizationTest { - source: "\u{1EE62}", - nfc: "\u{1EE62}", - nfd: "\u{1EE62}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{1EE64}", - nfc: "\u{1EE64}", - nfd: "\u{1EE64}", - nfkc: "\u{0647}", - nfkd: "\u{0647}", - }, - NormalizationTest { - source: "\u{1EE67}", - nfc: "\u{1EE67}", - nfd: "\u{1EE67}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{1EE68}", - nfc: "\u{1EE68}", - nfd: "\u{1EE68}", - nfkc: "\u{0637}", - nfkd: "\u{0637}", - }, - NormalizationTest { - source: "\u{1EE69}", - nfc: "\u{1EE69}", - nfd: "\u{1EE69}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{1EE6A}", - nfc: "\u{1EE6A}", - nfd: "\u{1EE6A}", - nfkc: "\u{0643}", - nfkd: "\u{0643}", - }, - NormalizationTest { - source: "\u{1EE6C}", - nfc: "\u{1EE6C}", - nfd: "\u{1EE6C}", - nfkc: "\u{0645}", - nfkd: "\u{0645}", - }, - NormalizationTest { - source: "\u{1EE6D}", - nfc: "\u{1EE6D}", - nfd: "\u{1EE6D}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{1EE6E}", - nfc: "\u{1EE6E}", - nfd: "\u{1EE6E}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{1EE6F}", - nfc: "\u{1EE6F}", - nfd: "\u{1EE6F}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{1EE70}", - nfc: "\u{1EE70}", - nfd: "\u{1EE70}", - nfkc: "\u{0641}", - nfkd: "\u{0641}", - }, - NormalizationTest { - source: "\u{1EE71}", - nfc: "\u{1EE71}", - nfd: "\u{1EE71}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{1EE72}", - nfc: "\u{1EE72}", - nfd: "\u{1EE72}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{1EE74}", - nfc: "\u{1EE74}", - nfd: "\u{1EE74}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{1EE75}", - nfc: "\u{1EE75}", - nfd: "\u{1EE75}", - nfkc: "\u{062A}", - nfkd: "\u{062A}", - }, - NormalizationTest { - source: "\u{1EE76}", - nfc: "\u{1EE76}", - nfd: "\u{1EE76}", - nfkc: "\u{062B}", - nfkd: "\u{062B}", - }, - NormalizationTest { - source: "\u{1EE77}", - nfc: "\u{1EE77}", - nfd: "\u{1EE77}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{1EE79}", - nfc: "\u{1EE79}", - nfd: "\u{1EE79}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{1EE7A}", - nfc: "\u{1EE7A}", - nfd: "\u{1EE7A}", - nfkc: "\u{0638}", - nfkd: "\u{0638}", - }, - NormalizationTest { - source: "\u{1EE7B}", - nfc: "\u{1EE7B}", - nfd: "\u{1EE7B}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{1EE7C}", - nfc: "\u{1EE7C}", - nfd: "\u{1EE7C}", - nfkc: "\u{066E}", - nfkd: "\u{066E}", - }, - NormalizationTest { - source: "\u{1EE7E}", - nfc: "\u{1EE7E}", - nfd: "\u{1EE7E}", - nfkc: "\u{06A1}", - nfkd: "\u{06A1}", - }, - NormalizationTest { - source: "\u{1EE80}", - nfc: "\u{1EE80}", - nfd: "\u{1EE80}", - nfkc: "\u{0627}", - nfkd: "\u{0627}", - }, - NormalizationTest { - source: "\u{1EE81}", - nfc: "\u{1EE81}", - nfd: "\u{1EE81}", - nfkc: "\u{0628}", - nfkd: "\u{0628}", - }, - NormalizationTest { - source: "\u{1EE82}", - nfc: "\u{1EE82}", - nfd: "\u{1EE82}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{1EE83}", - nfc: "\u{1EE83}", - nfd: "\u{1EE83}", - nfkc: "\u{062F}", - nfkd: "\u{062F}", - }, - NormalizationTest { - source: "\u{1EE84}", - nfc: "\u{1EE84}", - nfd: "\u{1EE84}", - nfkc: "\u{0647}", - nfkd: "\u{0647}", - }, - NormalizationTest { - source: "\u{1EE85}", - nfc: "\u{1EE85}", - nfd: "\u{1EE85}", - nfkc: "\u{0648}", - nfkd: "\u{0648}", - }, - NormalizationTest { - source: "\u{1EE86}", - nfc: "\u{1EE86}", - nfd: "\u{1EE86}", - nfkc: "\u{0632}", - nfkd: "\u{0632}", - }, - NormalizationTest { - source: "\u{1EE87}", - nfc: "\u{1EE87}", - nfd: "\u{1EE87}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{1EE88}", - nfc: "\u{1EE88}", - nfd: "\u{1EE88}", - nfkc: "\u{0637}", - nfkd: "\u{0637}", - }, - NormalizationTest { - source: "\u{1EE89}", - nfc: "\u{1EE89}", - nfd: "\u{1EE89}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{1EE8B}", - nfc: "\u{1EE8B}", - nfd: "\u{1EE8B}", - nfkc: "\u{0644}", - nfkd: "\u{0644}", - }, - NormalizationTest { - source: "\u{1EE8C}", - nfc: "\u{1EE8C}", - nfd: "\u{1EE8C}", - nfkc: "\u{0645}", - nfkd: "\u{0645}", - }, - NormalizationTest { - source: "\u{1EE8D}", - nfc: "\u{1EE8D}", - nfd: "\u{1EE8D}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{1EE8E}", - nfc: "\u{1EE8E}", - nfd: "\u{1EE8E}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{1EE8F}", - nfc: "\u{1EE8F}", - nfd: "\u{1EE8F}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{1EE90}", - nfc: "\u{1EE90}", - nfd: "\u{1EE90}", - nfkc: "\u{0641}", - nfkd: "\u{0641}", - }, - NormalizationTest { - source: "\u{1EE91}", - nfc: "\u{1EE91}", - nfd: "\u{1EE91}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{1EE92}", - nfc: "\u{1EE92}", - nfd: "\u{1EE92}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{1EE93}", - nfc: "\u{1EE93}", - nfd: "\u{1EE93}", - nfkc: "\u{0631}", - nfkd: "\u{0631}", - }, - NormalizationTest { - source: "\u{1EE94}", - nfc: "\u{1EE94}", - nfd: "\u{1EE94}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{1EE95}", - nfc: "\u{1EE95}", - nfd: "\u{1EE95}", - nfkc: "\u{062A}", - nfkd: "\u{062A}", - }, - NormalizationTest { - source: "\u{1EE96}", - nfc: "\u{1EE96}", - nfd: "\u{1EE96}", - nfkc: "\u{062B}", - nfkd: "\u{062B}", - }, - NormalizationTest { - source: "\u{1EE97}", - nfc: "\u{1EE97}", - nfd: "\u{1EE97}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{1EE98}", - nfc: "\u{1EE98}", - nfd: "\u{1EE98}", - nfkc: "\u{0630}", - nfkd: "\u{0630}", - }, - NormalizationTest { - source: "\u{1EE99}", - nfc: "\u{1EE99}", - nfd: "\u{1EE99}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{1EE9A}", - nfc: "\u{1EE9A}", - nfd: "\u{1EE9A}", - nfkc: "\u{0638}", - nfkd: "\u{0638}", - }, - NormalizationTest { - source: "\u{1EE9B}", - nfc: "\u{1EE9B}", - nfd: "\u{1EE9B}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{1EEA1}", - nfc: "\u{1EEA1}", - nfd: "\u{1EEA1}", - nfkc: "\u{0628}", - nfkd: "\u{0628}", - }, - NormalizationTest { - source: "\u{1EEA2}", - nfc: "\u{1EEA2}", - nfd: "\u{1EEA2}", - nfkc: "\u{062C}", - nfkd: "\u{062C}", - }, - NormalizationTest { - source: "\u{1EEA3}", - nfc: "\u{1EEA3}", - nfd: "\u{1EEA3}", - nfkc: "\u{062F}", - nfkd: "\u{062F}", - }, - NormalizationTest { - source: "\u{1EEA5}", - nfc: "\u{1EEA5}", - nfd: "\u{1EEA5}", - nfkc: "\u{0648}", - nfkd: "\u{0648}", - }, - NormalizationTest { - source: "\u{1EEA6}", - nfc: "\u{1EEA6}", - nfd: "\u{1EEA6}", - nfkc: "\u{0632}", - nfkd: "\u{0632}", - }, - NormalizationTest { - source: "\u{1EEA7}", - nfc: "\u{1EEA7}", - nfd: "\u{1EEA7}", - nfkc: "\u{062D}", - nfkd: "\u{062D}", - }, - NormalizationTest { - source: "\u{1EEA8}", - nfc: "\u{1EEA8}", - nfd: "\u{1EEA8}", - nfkc: "\u{0637}", - nfkd: "\u{0637}", - }, - NormalizationTest { - source: "\u{1EEA9}", - nfc: "\u{1EEA9}", - nfd: "\u{1EEA9}", - nfkc: "\u{064A}", - nfkd: "\u{064A}", - }, - NormalizationTest { - source: "\u{1EEAB}", - nfc: "\u{1EEAB}", - nfd: "\u{1EEAB}", - nfkc: "\u{0644}", - nfkd: "\u{0644}", - }, - NormalizationTest { - source: "\u{1EEAC}", - nfc: "\u{1EEAC}", - nfd: "\u{1EEAC}", - nfkc: "\u{0645}", - nfkd: "\u{0645}", - }, - NormalizationTest { - source: "\u{1EEAD}", - nfc: "\u{1EEAD}", - nfd: "\u{1EEAD}", - nfkc: "\u{0646}", - nfkd: "\u{0646}", - }, - NormalizationTest { - source: "\u{1EEAE}", - nfc: "\u{1EEAE}", - nfd: "\u{1EEAE}", - nfkc: "\u{0633}", - nfkd: "\u{0633}", - }, - NormalizationTest { - source: "\u{1EEAF}", - nfc: "\u{1EEAF}", - nfd: "\u{1EEAF}", - nfkc: "\u{0639}", - nfkd: "\u{0639}", - }, - NormalizationTest { - source: "\u{1EEB0}", - nfc: "\u{1EEB0}", - nfd: "\u{1EEB0}", - nfkc: "\u{0641}", - nfkd: "\u{0641}", - }, - NormalizationTest { - source: "\u{1EEB1}", - nfc: "\u{1EEB1}", - nfd: "\u{1EEB1}", - nfkc: "\u{0635}", - nfkd: "\u{0635}", - }, - NormalizationTest { - source: "\u{1EEB2}", - nfc: "\u{1EEB2}", - nfd: "\u{1EEB2}", - nfkc: "\u{0642}", - nfkd: "\u{0642}", - }, - NormalizationTest { - source: "\u{1EEB3}", - nfc: "\u{1EEB3}", - nfd: "\u{1EEB3}", - nfkc: "\u{0631}", - nfkd: "\u{0631}", - }, - NormalizationTest { - source: "\u{1EEB4}", - nfc: "\u{1EEB4}", - nfd: "\u{1EEB4}", - nfkc: "\u{0634}", - nfkd: "\u{0634}", - }, - NormalizationTest { - source: "\u{1EEB5}", - nfc: "\u{1EEB5}", - nfd: "\u{1EEB5}", - nfkc: "\u{062A}", - nfkd: "\u{062A}", - }, - NormalizationTest { - source: "\u{1EEB6}", - nfc: "\u{1EEB6}", - nfd: "\u{1EEB6}", - nfkc: "\u{062B}", - nfkd: "\u{062B}", - }, - NormalizationTest { - source: "\u{1EEB7}", - nfc: "\u{1EEB7}", - nfd: "\u{1EEB7}", - nfkc: "\u{062E}", - nfkd: "\u{062E}", - }, - NormalizationTest { - source: "\u{1EEB8}", - nfc: "\u{1EEB8}", - nfd: "\u{1EEB8}", - nfkc: "\u{0630}", - nfkd: "\u{0630}", - }, - NormalizationTest { - source: "\u{1EEB9}", - nfc: "\u{1EEB9}", - nfd: "\u{1EEB9}", - nfkc: "\u{0636}", - nfkd: "\u{0636}", - }, - NormalizationTest { - source: "\u{1EEBA}", - nfc: "\u{1EEBA}", - nfd: "\u{1EEBA}", - nfkc: "\u{0638}", - nfkd: "\u{0638}", - }, - NormalizationTest { - source: "\u{1EEBB}", - nfc: "\u{1EEBB}", - nfd: "\u{1EEBB}", - nfkc: "\u{063A}", - nfkd: "\u{063A}", - }, - NormalizationTest { - source: "\u{1F100}", - nfc: "\u{1F100}", - nfd: "\u{1F100}", - nfkc: "\u{0030}\u{002E}", - nfkd: "\u{0030}\u{002E}", - }, - NormalizationTest { - source: "\u{1F101}", - nfc: "\u{1F101}", - nfd: "\u{1F101}", - nfkc: "\u{0030}\u{002C}", - nfkd: "\u{0030}\u{002C}", - }, - NormalizationTest { - source: "\u{1F102}", - nfc: "\u{1F102}", - nfd: "\u{1F102}", - nfkc: "\u{0031}\u{002C}", - nfkd: "\u{0031}\u{002C}", - }, - NormalizationTest { - source: "\u{1F103}", - nfc: "\u{1F103}", - nfd: "\u{1F103}", - nfkc: "\u{0032}\u{002C}", - nfkd: "\u{0032}\u{002C}", - }, - NormalizationTest { - source: "\u{1F104}", - nfc: "\u{1F104}", - nfd: "\u{1F104}", - nfkc: "\u{0033}\u{002C}", - nfkd: "\u{0033}\u{002C}", - }, - NormalizationTest { - source: "\u{1F105}", - nfc: "\u{1F105}", - nfd: "\u{1F105}", - nfkc: "\u{0034}\u{002C}", - nfkd: "\u{0034}\u{002C}", - }, - NormalizationTest { - source: "\u{1F106}", - nfc: "\u{1F106}", - nfd: "\u{1F106}", - nfkc: "\u{0035}\u{002C}", - nfkd: "\u{0035}\u{002C}", - }, - NormalizationTest { - source: "\u{1F107}", - nfc: "\u{1F107}", - nfd: "\u{1F107}", - nfkc: "\u{0036}\u{002C}", - nfkd: "\u{0036}\u{002C}", - }, - NormalizationTest { - source: "\u{1F108}", - nfc: "\u{1F108}", - nfd: "\u{1F108}", - nfkc: "\u{0037}\u{002C}", - nfkd: "\u{0037}\u{002C}", - }, - NormalizationTest { - source: "\u{1F109}", - nfc: "\u{1F109}", - nfd: "\u{1F109}", - nfkc: "\u{0038}\u{002C}", - nfkd: "\u{0038}\u{002C}", - }, - NormalizationTest { - source: "\u{1F10A}", - nfc: "\u{1F10A}", - nfd: "\u{1F10A}", - nfkc: "\u{0039}\u{002C}", - nfkd: "\u{0039}\u{002C}", - }, - NormalizationTest { - source: "\u{1F110}", - nfc: "\u{1F110}", - nfd: "\u{1F110}", - nfkc: "\u{0028}\u{0041}\u{0029}", - nfkd: "\u{0028}\u{0041}\u{0029}", - }, - NormalizationTest { - source: "\u{1F111}", - nfc: "\u{1F111}", - nfd: "\u{1F111}", - nfkc: "\u{0028}\u{0042}\u{0029}", - nfkd: "\u{0028}\u{0042}\u{0029}", - }, - NormalizationTest { - source: "\u{1F112}", - nfc: "\u{1F112}", - nfd: "\u{1F112}", - nfkc: "\u{0028}\u{0043}\u{0029}", - nfkd: "\u{0028}\u{0043}\u{0029}", - }, - NormalizationTest { - source: "\u{1F113}", - nfc: "\u{1F113}", - nfd: "\u{1F113}", - nfkc: "\u{0028}\u{0044}\u{0029}", - nfkd: "\u{0028}\u{0044}\u{0029}", - }, - NormalizationTest { - source: "\u{1F114}", - nfc: "\u{1F114}", - nfd: "\u{1F114}", - nfkc: "\u{0028}\u{0045}\u{0029}", - nfkd: "\u{0028}\u{0045}\u{0029}", - }, - NormalizationTest { - source: "\u{1F115}", - nfc: "\u{1F115}", - nfd: "\u{1F115}", - nfkc: "\u{0028}\u{0046}\u{0029}", - nfkd: "\u{0028}\u{0046}\u{0029}", - }, - NormalizationTest { - source: "\u{1F116}", - nfc: "\u{1F116}", - nfd: "\u{1F116}", - nfkc: "\u{0028}\u{0047}\u{0029}", - nfkd: "\u{0028}\u{0047}\u{0029}", - }, - NormalizationTest { - source: "\u{1F117}", - nfc: "\u{1F117}", - nfd: "\u{1F117}", - nfkc: "\u{0028}\u{0048}\u{0029}", - nfkd: "\u{0028}\u{0048}\u{0029}", - }, - NormalizationTest { - source: "\u{1F118}", - nfc: "\u{1F118}", - nfd: "\u{1F118}", - nfkc: "\u{0028}\u{0049}\u{0029}", - nfkd: "\u{0028}\u{0049}\u{0029}", - }, - NormalizationTest { - source: "\u{1F119}", - nfc: "\u{1F119}", - nfd: "\u{1F119}", - nfkc: "\u{0028}\u{004A}\u{0029}", - nfkd: "\u{0028}\u{004A}\u{0029}", - }, - NormalizationTest { - source: "\u{1F11A}", - nfc: "\u{1F11A}", - nfd: "\u{1F11A}", - nfkc: "\u{0028}\u{004B}\u{0029}", - nfkd: "\u{0028}\u{004B}\u{0029}", - }, - NormalizationTest { - source: "\u{1F11B}", - nfc: "\u{1F11B}", - nfd: "\u{1F11B}", - nfkc: "\u{0028}\u{004C}\u{0029}", - nfkd: "\u{0028}\u{004C}\u{0029}", - }, - NormalizationTest { - source: "\u{1F11C}", - nfc: "\u{1F11C}", - nfd: "\u{1F11C}", - nfkc: "\u{0028}\u{004D}\u{0029}", - nfkd: "\u{0028}\u{004D}\u{0029}", - }, - NormalizationTest { - source: "\u{1F11D}", - nfc: "\u{1F11D}", - nfd: "\u{1F11D}", - nfkc: "\u{0028}\u{004E}\u{0029}", - nfkd: "\u{0028}\u{004E}\u{0029}", - }, - NormalizationTest { - source: "\u{1F11E}", - nfc: "\u{1F11E}", - nfd: "\u{1F11E}", - nfkc: "\u{0028}\u{004F}\u{0029}", - nfkd: "\u{0028}\u{004F}\u{0029}", - }, - NormalizationTest { - source: "\u{1F11F}", - nfc: "\u{1F11F}", - nfd: "\u{1F11F}", - nfkc: "\u{0028}\u{0050}\u{0029}", - nfkd: "\u{0028}\u{0050}\u{0029}", - }, - NormalizationTest { - source: "\u{1F120}", - nfc: "\u{1F120}", - nfd: "\u{1F120}", - nfkc: "\u{0028}\u{0051}\u{0029}", - nfkd: "\u{0028}\u{0051}\u{0029}", - }, - NormalizationTest { - source: "\u{1F121}", - nfc: "\u{1F121}", - nfd: "\u{1F121}", - nfkc: "\u{0028}\u{0052}\u{0029}", - nfkd: "\u{0028}\u{0052}\u{0029}", - }, - NormalizationTest { - source: "\u{1F122}", - nfc: "\u{1F122}", - nfd: "\u{1F122}", - nfkc: "\u{0028}\u{0053}\u{0029}", - nfkd: "\u{0028}\u{0053}\u{0029}", - }, - NormalizationTest { - source: "\u{1F123}", - nfc: "\u{1F123}", - nfd: "\u{1F123}", - nfkc: "\u{0028}\u{0054}\u{0029}", - nfkd: "\u{0028}\u{0054}\u{0029}", - }, - NormalizationTest { - source: "\u{1F124}", - nfc: "\u{1F124}", - nfd: "\u{1F124}", - nfkc: "\u{0028}\u{0055}\u{0029}", - nfkd: "\u{0028}\u{0055}\u{0029}", - }, - NormalizationTest { - source: "\u{1F125}", - nfc: "\u{1F125}", - nfd: "\u{1F125}", - nfkc: "\u{0028}\u{0056}\u{0029}", - nfkd: "\u{0028}\u{0056}\u{0029}", - }, - NormalizationTest { - source: "\u{1F126}", - nfc: "\u{1F126}", - nfd: "\u{1F126}", - nfkc: "\u{0028}\u{0057}\u{0029}", - nfkd: "\u{0028}\u{0057}\u{0029}", - }, - NormalizationTest { - source: "\u{1F127}", - nfc: "\u{1F127}", - nfd: "\u{1F127}", - nfkc: "\u{0028}\u{0058}\u{0029}", - nfkd: "\u{0028}\u{0058}\u{0029}", - }, - NormalizationTest { - source: "\u{1F128}", - nfc: "\u{1F128}", - nfd: "\u{1F128}", - nfkc: "\u{0028}\u{0059}\u{0029}", - nfkd: "\u{0028}\u{0059}\u{0029}", - }, - NormalizationTest { - source: "\u{1F129}", - nfc: "\u{1F129}", - nfd: "\u{1F129}", - nfkc: "\u{0028}\u{005A}\u{0029}", - nfkd: "\u{0028}\u{005A}\u{0029}", - }, - NormalizationTest { - source: "\u{1F12A}", - nfc: "\u{1F12A}", - nfd: "\u{1F12A}", - nfkc: "\u{3014}\u{0053}\u{3015}", - nfkd: "\u{3014}\u{0053}\u{3015}", - }, - NormalizationTest { - source: "\u{1F12B}", - nfc: "\u{1F12B}", - nfd: "\u{1F12B}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1F12C}", - nfc: "\u{1F12C}", - nfd: "\u{1F12C}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1F12D}", - nfc: "\u{1F12D}", - nfd: "\u{1F12D}", - nfkc: "\u{0043}\u{0044}", - nfkd: "\u{0043}\u{0044}", - }, - NormalizationTest { - source: "\u{1F12E}", - nfc: "\u{1F12E}", - nfd: "\u{1F12E}", - nfkc: "\u{0057}\u{005A}", - nfkd: "\u{0057}\u{005A}", - }, - NormalizationTest { - source: "\u{1F130}", - nfc: "\u{1F130}", - nfd: "\u{1F130}", - nfkc: "\u{0041}", - nfkd: "\u{0041}", - }, - NormalizationTest { - source: "\u{1F131}", - nfc: "\u{1F131}", - nfd: "\u{1F131}", - nfkc: "\u{0042}", - nfkd: "\u{0042}", - }, - NormalizationTest { - source: "\u{1F132}", - nfc: "\u{1F132}", - nfd: "\u{1F132}", - nfkc: "\u{0043}", - nfkd: "\u{0043}", - }, - NormalizationTest { - source: "\u{1F133}", - nfc: "\u{1F133}", - nfd: "\u{1F133}", - nfkc: "\u{0044}", - nfkd: "\u{0044}", - }, - NormalizationTest { - source: "\u{1F134}", - nfc: "\u{1F134}", - nfd: "\u{1F134}", - nfkc: "\u{0045}", - nfkd: "\u{0045}", - }, - NormalizationTest { - source: "\u{1F135}", - nfc: "\u{1F135}", - nfd: "\u{1F135}", - nfkc: "\u{0046}", - nfkd: "\u{0046}", - }, - NormalizationTest { - source: "\u{1F136}", - nfc: "\u{1F136}", - nfd: "\u{1F136}", - nfkc: "\u{0047}", - nfkd: "\u{0047}", - }, - NormalizationTest { - source: "\u{1F137}", - nfc: "\u{1F137}", - nfd: "\u{1F137}", - nfkc: "\u{0048}", - nfkd: "\u{0048}", - }, - NormalizationTest { - source: "\u{1F138}", - nfc: "\u{1F138}", - nfd: "\u{1F138}", - nfkc: "\u{0049}", - nfkd: "\u{0049}", - }, - NormalizationTest { - source: "\u{1F139}", - nfc: "\u{1F139}", - nfd: "\u{1F139}", - nfkc: "\u{004A}", - nfkd: "\u{004A}", - }, - NormalizationTest { - source: "\u{1F13A}", - nfc: "\u{1F13A}", - nfd: "\u{1F13A}", - nfkc: "\u{004B}", - nfkd: "\u{004B}", - }, - NormalizationTest { - source: "\u{1F13B}", - nfc: "\u{1F13B}", - nfd: "\u{1F13B}", - nfkc: "\u{004C}", - nfkd: "\u{004C}", - }, - NormalizationTest { - source: "\u{1F13C}", - nfc: "\u{1F13C}", - nfd: "\u{1F13C}", - nfkc: "\u{004D}", - nfkd: "\u{004D}", - }, - NormalizationTest { - source: "\u{1F13D}", - nfc: "\u{1F13D}", - nfd: "\u{1F13D}", - nfkc: "\u{004E}", - nfkd: "\u{004E}", - }, - NormalizationTest { - source: "\u{1F13E}", - nfc: "\u{1F13E}", - nfd: "\u{1F13E}", - nfkc: "\u{004F}", - nfkd: "\u{004F}", - }, - NormalizationTest { - source: "\u{1F13F}", - nfc: "\u{1F13F}", - nfd: "\u{1F13F}", - nfkc: "\u{0050}", - nfkd: "\u{0050}", - }, - NormalizationTest { - source: "\u{1F140}", - nfc: "\u{1F140}", - nfd: "\u{1F140}", - nfkc: "\u{0051}", - nfkd: "\u{0051}", - }, - NormalizationTest { - source: "\u{1F141}", - nfc: "\u{1F141}", - nfd: "\u{1F141}", - nfkc: "\u{0052}", - nfkd: "\u{0052}", - }, - NormalizationTest { - source: "\u{1F142}", - nfc: "\u{1F142}", - nfd: "\u{1F142}", - nfkc: "\u{0053}", - nfkd: "\u{0053}", - }, - NormalizationTest { - source: "\u{1F143}", - nfc: "\u{1F143}", - nfd: "\u{1F143}", - nfkc: "\u{0054}", - nfkd: "\u{0054}", - }, - NormalizationTest { - source: "\u{1F144}", - nfc: "\u{1F144}", - nfd: "\u{1F144}", - nfkc: "\u{0055}", - nfkd: "\u{0055}", - }, - NormalizationTest { - source: "\u{1F145}", - nfc: "\u{1F145}", - nfd: "\u{1F145}", - nfkc: "\u{0056}", - nfkd: "\u{0056}", - }, - NormalizationTest { - source: "\u{1F146}", - nfc: "\u{1F146}", - nfd: "\u{1F146}", - nfkc: "\u{0057}", - nfkd: "\u{0057}", - }, - NormalizationTest { - source: "\u{1F147}", - nfc: "\u{1F147}", - nfd: "\u{1F147}", - nfkc: "\u{0058}", - nfkd: "\u{0058}", - }, - NormalizationTest { - source: "\u{1F148}", - nfc: "\u{1F148}", - nfd: "\u{1F148}", - nfkc: "\u{0059}", - nfkd: "\u{0059}", - }, - NormalizationTest { - source: "\u{1F149}", - nfc: "\u{1F149}", - nfd: "\u{1F149}", - nfkc: "\u{005A}", - nfkd: "\u{005A}", - }, - NormalizationTest { - source: "\u{1F14A}", - nfc: "\u{1F14A}", - nfd: "\u{1F14A}", - nfkc: "\u{0048}\u{0056}", - nfkd: "\u{0048}\u{0056}", - }, - NormalizationTest { - source: "\u{1F14B}", - nfc: "\u{1F14B}", - nfd: "\u{1F14B}", - nfkc: "\u{004D}\u{0056}", - nfkd: "\u{004D}\u{0056}", - }, - NormalizationTest { - source: "\u{1F14C}", - nfc: "\u{1F14C}", - nfd: "\u{1F14C}", - nfkc: "\u{0053}\u{0044}", - nfkd: "\u{0053}\u{0044}", - }, - NormalizationTest { - source: "\u{1F14D}", - nfc: "\u{1F14D}", - nfd: "\u{1F14D}", - nfkc: "\u{0053}\u{0053}", - nfkd: "\u{0053}\u{0053}", - }, - NormalizationTest { - source: "\u{1F14E}", - nfc: "\u{1F14E}", - nfd: "\u{1F14E}", - nfkc: "\u{0050}\u{0050}\u{0056}", - nfkd: "\u{0050}\u{0050}\u{0056}", - }, - NormalizationTest { - source: "\u{1F14F}", - nfc: "\u{1F14F}", - nfd: "\u{1F14F}", - nfkc: "\u{0057}\u{0043}", - nfkd: "\u{0057}\u{0043}", - }, - NormalizationTest { - source: "\u{1F16A}", - nfc: "\u{1F16A}", - nfd: "\u{1F16A}", - nfkc: "\u{004D}\u{0043}", - nfkd: "\u{004D}\u{0043}", - }, - NormalizationTest { - source: "\u{1F16B}", - nfc: "\u{1F16B}", - nfd: "\u{1F16B}", - nfkc: "\u{004D}\u{0044}", - nfkd: "\u{004D}\u{0044}", - }, - NormalizationTest { - source: "\u{1F190}", - nfc: "\u{1F190}", - nfd: "\u{1F190}", - nfkc: "\u{0044}\u{004A}", - nfkd: "\u{0044}\u{004A}", - }, - NormalizationTest { - source: "\u{1F200}", - nfc: "\u{1F200}", - nfd: "\u{1F200}", - nfkc: "\u{307B}\u{304B}", - nfkd: "\u{307B}\u{304B}", - }, - NormalizationTest { - source: "\u{1F201}", - nfc: "\u{1F201}", - nfd: "\u{1F201}", - nfkc: "\u{30B3}\u{30B3}", - nfkd: "\u{30B3}\u{30B3}", - }, - NormalizationTest { - source: "\u{1F202}", - nfc: "\u{1F202}", - nfd: "\u{1F202}", - nfkc: "\u{30B5}", - nfkd: "\u{30B5}", - }, - NormalizationTest { - source: "\u{1F210}", - nfc: "\u{1F210}", - nfd: "\u{1F210}", - nfkc: "\u{624B}", - nfkd: "\u{624B}", - }, - NormalizationTest { - source: "\u{1F211}", - nfc: "\u{1F211}", - nfd: "\u{1F211}", - nfkc: "\u{5B57}", - nfkd: "\u{5B57}", - }, - NormalizationTest { - source: "\u{1F212}", - nfc: "\u{1F212}", - nfd: "\u{1F212}", - nfkc: "\u{53CC}", - nfkd: "\u{53CC}", - }, - NormalizationTest { - source: "\u{1F213}", - nfc: "\u{1F213}", - nfd: "\u{1F213}", - nfkc: "\u{30C7}", - nfkd: "\u{30C6}\u{3099}", - }, - NormalizationTest { - source: "\u{1F214}", - nfc: "\u{1F214}", - nfd: "\u{1F214}", - nfkc: "\u{4E8C}", - nfkd: "\u{4E8C}", - }, - NormalizationTest { - source: "\u{1F215}", - nfc: "\u{1F215}", - nfd: "\u{1F215}", - nfkc: "\u{591A}", - nfkd: "\u{591A}", - }, - NormalizationTest { - source: "\u{1F216}", - nfc: "\u{1F216}", - nfd: "\u{1F216}", - nfkc: "\u{89E3}", - nfkd: "\u{89E3}", - }, - NormalizationTest { - source: "\u{1F217}", - nfc: "\u{1F217}", - nfd: "\u{1F217}", - nfkc: "\u{5929}", - nfkd: "\u{5929}", - }, - NormalizationTest { - source: "\u{1F218}", - nfc: "\u{1F218}", - nfd: "\u{1F218}", - nfkc: "\u{4EA4}", - nfkd: "\u{4EA4}", - }, - NormalizationTest { - source: "\u{1F219}", - nfc: "\u{1F219}", - nfd: "\u{1F219}", - nfkc: "\u{6620}", - nfkd: "\u{6620}", - }, - NormalizationTest { - source: "\u{1F21A}", - nfc: "\u{1F21A}", - nfd: "\u{1F21A}", - nfkc: "\u{7121}", - nfkd: "\u{7121}", - }, - NormalizationTest { - source: "\u{1F21B}", - nfc: "\u{1F21B}", - nfd: "\u{1F21B}", - nfkc: "\u{6599}", - nfkd: "\u{6599}", - }, - NormalizationTest { - source: "\u{1F21C}", - nfc: "\u{1F21C}", - nfd: "\u{1F21C}", - nfkc: "\u{524D}", - nfkd: "\u{524D}", - }, - NormalizationTest { - source: "\u{1F21D}", - nfc: "\u{1F21D}", - nfd: "\u{1F21D}", - nfkc: "\u{5F8C}", - nfkd: "\u{5F8C}", - }, - NormalizationTest { - source: "\u{1F21E}", - nfc: "\u{1F21E}", - nfd: "\u{1F21E}", - nfkc: "\u{518D}", - nfkd: "\u{518D}", - }, - NormalizationTest { - source: "\u{1F21F}", - nfc: "\u{1F21F}", - nfd: "\u{1F21F}", - nfkc: "\u{65B0}", - nfkd: "\u{65B0}", - }, - NormalizationTest { - source: "\u{1F220}", - nfc: "\u{1F220}", - nfd: "\u{1F220}", - nfkc: "\u{521D}", - nfkd: "\u{521D}", - }, - NormalizationTest { - source: "\u{1F221}", - nfc: "\u{1F221}", - nfd: "\u{1F221}", - nfkc: "\u{7D42}", - nfkd: "\u{7D42}", - }, - NormalizationTest { - source: "\u{1F222}", - nfc: "\u{1F222}", - nfd: "\u{1F222}", - nfkc: "\u{751F}", - nfkd: "\u{751F}", - }, - NormalizationTest { - source: "\u{1F223}", - nfc: "\u{1F223}", - nfd: "\u{1F223}", - nfkc: "\u{8CA9}", - nfkd: "\u{8CA9}", - }, - NormalizationTest { - source: "\u{1F224}", - nfc: "\u{1F224}", - nfd: "\u{1F224}", - nfkc: "\u{58F0}", - nfkd: "\u{58F0}", - }, - NormalizationTest { - source: "\u{1F225}", - nfc: "\u{1F225}", - nfd: "\u{1F225}", - nfkc: "\u{5439}", - nfkd: "\u{5439}", - }, - NormalizationTest { - source: "\u{1F226}", - nfc: "\u{1F226}", - nfd: "\u{1F226}", - nfkc: "\u{6F14}", - nfkd: "\u{6F14}", - }, - NormalizationTest { - source: "\u{1F227}", - nfc: "\u{1F227}", - nfd: "\u{1F227}", - nfkc: "\u{6295}", - nfkd: "\u{6295}", - }, - NormalizationTest { - source: "\u{1F228}", - nfc: "\u{1F228}", - nfd: "\u{1F228}", - nfkc: "\u{6355}", - nfkd: "\u{6355}", - }, - NormalizationTest { - source: "\u{1F229}", - nfc: "\u{1F229}", - nfd: "\u{1F229}", - nfkc: "\u{4E00}", - nfkd: "\u{4E00}", - }, - NormalizationTest { - source: "\u{1F22A}", - nfc: "\u{1F22A}", - nfd: "\u{1F22A}", - nfkc: "\u{4E09}", - nfkd: "\u{4E09}", - }, - NormalizationTest { - source: "\u{1F22B}", - nfc: "\u{1F22B}", - nfd: "\u{1F22B}", - nfkc: "\u{904A}", - nfkd: "\u{904A}", - }, - NormalizationTest { - source: "\u{1F22C}", - nfc: "\u{1F22C}", - nfd: "\u{1F22C}", - nfkc: "\u{5DE6}", - nfkd: "\u{5DE6}", - }, - NormalizationTest { - source: "\u{1F22D}", - nfc: "\u{1F22D}", - nfd: "\u{1F22D}", - nfkc: "\u{4E2D}", - nfkd: "\u{4E2D}", - }, - NormalizationTest { - source: "\u{1F22E}", - nfc: "\u{1F22E}", - nfd: "\u{1F22E}", - nfkc: "\u{53F3}", - nfkd: "\u{53F3}", - }, - NormalizationTest { - source: "\u{1F22F}", - nfc: "\u{1F22F}", - nfd: "\u{1F22F}", - nfkc: "\u{6307}", - nfkd: "\u{6307}", - }, - NormalizationTest { - source: "\u{1F230}", - nfc: "\u{1F230}", - nfd: "\u{1F230}", - nfkc: "\u{8D70}", - nfkd: "\u{8D70}", - }, - NormalizationTest { - source: "\u{1F231}", - nfc: "\u{1F231}", - nfd: "\u{1F231}", - nfkc: "\u{6253}", - nfkd: "\u{6253}", - }, - NormalizationTest { - source: "\u{1F232}", - nfc: "\u{1F232}", - nfd: "\u{1F232}", - nfkc: "\u{7981}", - nfkd: "\u{7981}", - }, - NormalizationTest { - source: "\u{1F233}", - nfc: "\u{1F233}", - nfd: "\u{1F233}", - nfkc: "\u{7A7A}", - nfkd: "\u{7A7A}", - }, - NormalizationTest { - source: "\u{1F234}", - nfc: "\u{1F234}", - nfd: "\u{1F234}", - nfkc: "\u{5408}", - nfkd: "\u{5408}", - }, - NormalizationTest { - source: "\u{1F235}", - nfc: "\u{1F235}", - nfd: "\u{1F235}", - nfkc: "\u{6E80}", - nfkd: "\u{6E80}", - }, - NormalizationTest { - source: "\u{1F236}", - nfc: "\u{1F236}", - nfd: "\u{1F236}", - nfkc: "\u{6709}", - nfkd: "\u{6709}", - }, - NormalizationTest { - source: "\u{1F237}", - nfc: "\u{1F237}", - nfd: "\u{1F237}", - nfkc: "\u{6708}", - nfkd: "\u{6708}", - }, - NormalizationTest { - source: "\u{1F238}", - nfc: "\u{1F238}", - nfd: "\u{1F238}", - nfkc: "\u{7533}", - nfkd: "\u{7533}", - }, - NormalizationTest { - source: "\u{1F239}", - nfc: "\u{1F239}", - nfd: "\u{1F239}", - nfkc: "\u{5272}", - nfkd: "\u{5272}", - }, - NormalizationTest { - source: "\u{1F23A}", - nfc: "\u{1F23A}", - nfd: "\u{1F23A}", - nfkc: "\u{55B6}", - nfkd: "\u{55B6}", - }, - NormalizationTest { - source: "\u{1F23B}", - nfc: "\u{1F23B}", - nfd: "\u{1F23B}", - nfkc: "\u{914D}", - nfkd: "\u{914D}", - }, - NormalizationTest { - source: "\u{1F240}", - nfc: "\u{1F240}", - nfd: "\u{1F240}", - nfkc: "\u{3014}\u{672C}\u{3015}", - nfkd: "\u{3014}\u{672C}\u{3015}", - }, - NormalizationTest { - source: "\u{1F241}", - nfc: "\u{1F241}", - nfd: "\u{1F241}", - nfkc: "\u{3014}\u{4E09}\u{3015}", - nfkd: "\u{3014}\u{4E09}\u{3015}", - }, - NormalizationTest { - source: "\u{1F242}", - nfc: "\u{1F242}", - nfd: "\u{1F242}", - nfkc: "\u{3014}\u{4E8C}\u{3015}", - nfkd: "\u{3014}\u{4E8C}\u{3015}", - }, - NormalizationTest { - source: "\u{1F243}", - nfc: "\u{1F243}", - nfd: "\u{1F243}", - nfkc: "\u{3014}\u{5B89}\u{3015}", - nfkd: "\u{3014}\u{5B89}\u{3015}", - }, - NormalizationTest { - source: "\u{1F244}", - nfc: "\u{1F244}", - nfd: "\u{1F244}", - nfkc: "\u{3014}\u{70B9}\u{3015}", - nfkd: "\u{3014}\u{70B9}\u{3015}", - }, - NormalizationTest { - source: "\u{1F245}", - nfc: "\u{1F245}", - nfd: "\u{1F245}", - nfkc: "\u{3014}\u{6253}\u{3015}", - nfkd: "\u{3014}\u{6253}\u{3015}", - }, - NormalizationTest { - source: "\u{1F246}", - nfc: "\u{1F246}", - nfd: "\u{1F246}", - nfkc: "\u{3014}\u{76D7}\u{3015}", - nfkd: "\u{3014}\u{76D7}\u{3015}", - }, - NormalizationTest { - source: "\u{1F247}", - nfc: "\u{1F247}", - nfd: "\u{1F247}", - nfkc: "\u{3014}\u{52DD}\u{3015}", - nfkd: "\u{3014}\u{52DD}\u{3015}", - }, - NormalizationTest { - source: "\u{1F248}", - nfc: "\u{1F248}", - nfd: "\u{1F248}", - nfkc: "\u{3014}\u{6557}\u{3015}", - nfkd: "\u{3014}\u{6557}\u{3015}", - }, - NormalizationTest { - source: "\u{1F250}", - nfc: "\u{1F250}", - nfd: "\u{1F250}", - nfkc: "\u{5F97}", - nfkd: "\u{5F97}", - }, - NormalizationTest { - source: "\u{1F251}", - nfc: "\u{1F251}", - nfd: "\u{1F251}", - nfkc: "\u{53EF}", - nfkd: "\u{53EF}", - }, - NormalizationTest { - source: "\u{2F800}", - nfc: "\u{4E3D}", - nfd: "\u{4E3D}", - nfkc: "\u{4E3D}", - nfkd: "\u{4E3D}", - }, - NormalizationTest { - source: "\u{2F801}", - nfc: "\u{4E38}", - nfd: "\u{4E38}", - nfkc: "\u{4E38}", - nfkd: "\u{4E38}", - }, - NormalizationTest { - source: "\u{2F802}", - nfc: "\u{4E41}", - nfd: "\u{4E41}", - nfkc: "\u{4E41}", - nfkd: "\u{4E41}", - }, - NormalizationTest { - source: "\u{2F803}", - nfc: "\u{20122}", - nfd: "\u{20122}", - nfkc: "\u{20122}", - nfkd: "\u{20122}", - }, - NormalizationTest { - source: "\u{2F804}", - nfc: "\u{4F60}", - nfd: "\u{4F60}", - nfkc: "\u{4F60}", - nfkd: "\u{4F60}", - }, - NormalizationTest { - source: "\u{2F805}", - nfc: "\u{4FAE}", - nfd: "\u{4FAE}", - nfkc: "\u{4FAE}", - nfkd: "\u{4FAE}", - }, - NormalizationTest { - source: "\u{2F806}", - nfc: "\u{4FBB}", - nfd: "\u{4FBB}", - nfkc: "\u{4FBB}", - nfkd: "\u{4FBB}", - }, - NormalizationTest { - source: "\u{2F807}", - nfc: "\u{5002}", - nfd: "\u{5002}", - nfkc: "\u{5002}", - nfkd: "\u{5002}", - }, - NormalizationTest { - source: "\u{2F808}", - nfc: "\u{507A}", - nfd: "\u{507A}", - nfkc: "\u{507A}", - nfkd: "\u{507A}", - }, - NormalizationTest { - source: "\u{2F809}", - nfc: "\u{5099}", - nfd: "\u{5099}", - nfkc: "\u{5099}", - nfkd: "\u{5099}", - }, - NormalizationTest { - source: "\u{2F80A}", - nfc: "\u{50E7}", - nfd: "\u{50E7}", - nfkc: "\u{50E7}", - nfkd: "\u{50E7}", - }, - NormalizationTest { - source: "\u{2F80B}", - nfc: "\u{50CF}", - nfd: "\u{50CF}", - nfkc: "\u{50CF}", - nfkd: "\u{50CF}", - }, - NormalizationTest { - source: "\u{2F80C}", - nfc: "\u{349E}", - nfd: "\u{349E}", - nfkc: "\u{349E}", - nfkd: "\u{349E}", - }, - NormalizationTest { - source: "\u{2F80D}", - nfc: "\u{2063A}", - nfd: "\u{2063A}", - nfkc: "\u{2063A}", - nfkd: "\u{2063A}", - }, - NormalizationTest { - source: "\u{2F80E}", - nfc: "\u{514D}", - nfd: "\u{514D}", - nfkc: "\u{514D}", - nfkd: "\u{514D}", - }, - NormalizationTest { - source: "\u{2F80F}", - nfc: "\u{5154}", - nfd: "\u{5154}", - nfkc: "\u{5154}", - nfkd: "\u{5154}", - }, - NormalizationTest { - source: "\u{2F810}", - nfc: "\u{5164}", - nfd: "\u{5164}", - nfkc: "\u{5164}", - nfkd: "\u{5164}", - }, - NormalizationTest { - source: "\u{2F811}", - nfc: "\u{5177}", - nfd: "\u{5177}", - nfkc: "\u{5177}", - nfkd: "\u{5177}", - }, - NormalizationTest { - source: "\u{2F812}", - nfc: "\u{2051C}", - nfd: "\u{2051C}", - nfkc: "\u{2051C}", - nfkd: "\u{2051C}", - }, - NormalizationTest { - source: "\u{2F813}", - nfc: "\u{34B9}", - nfd: "\u{34B9}", - nfkc: "\u{34B9}", - nfkd: "\u{34B9}", - }, - NormalizationTest { - source: "\u{2F814}", - nfc: "\u{5167}", - nfd: "\u{5167}", - nfkc: "\u{5167}", - nfkd: "\u{5167}", - }, - NormalizationTest { - source: "\u{2F815}", - nfc: "\u{518D}", - nfd: "\u{518D}", - nfkc: "\u{518D}", - nfkd: "\u{518D}", - }, - NormalizationTest { - source: "\u{2F816}", - nfc: "\u{2054B}", - nfd: "\u{2054B}", - nfkc: "\u{2054B}", - nfkd: "\u{2054B}", - }, - NormalizationTest { - source: "\u{2F817}", - nfc: "\u{5197}", - nfd: "\u{5197}", - nfkc: "\u{5197}", - nfkd: "\u{5197}", - }, - NormalizationTest { - source: "\u{2F818}", - nfc: "\u{51A4}", - nfd: "\u{51A4}", - nfkc: "\u{51A4}", - nfkd: "\u{51A4}", - }, - NormalizationTest { - source: "\u{2F819}", - nfc: "\u{4ECC}", - nfd: "\u{4ECC}", - nfkc: "\u{4ECC}", - nfkd: "\u{4ECC}", - }, - NormalizationTest { - source: "\u{2F81A}", - nfc: "\u{51AC}", - nfd: "\u{51AC}", - nfkc: "\u{51AC}", - nfkd: "\u{51AC}", - }, - NormalizationTest { - source: "\u{2F81B}", - nfc: "\u{51B5}", - nfd: "\u{51B5}", - nfkc: "\u{51B5}", - nfkd: "\u{51B5}", - }, - NormalizationTest { - source: "\u{2F81C}", - nfc: "\u{291DF}", - nfd: "\u{291DF}", - nfkc: "\u{291DF}", - nfkd: "\u{291DF}", - }, - NormalizationTest { - source: "\u{2F81D}", - nfc: "\u{51F5}", - nfd: "\u{51F5}", - nfkc: "\u{51F5}", - nfkd: "\u{51F5}", - }, - NormalizationTest { - source: "\u{2F81E}", - nfc: "\u{5203}", - nfd: "\u{5203}", - nfkc: "\u{5203}", - nfkd: "\u{5203}", - }, - NormalizationTest { - source: "\u{2F81F}", - nfc: "\u{34DF}", - nfd: "\u{34DF}", - nfkc: "\u{34DF}", - nfkd: "\u{34DF}", - }, - NormalizationTest { - source: "\u{2F820}", - nfc: "\u{523B}", - nfd: "\u{523B}", - nfkc: "\u{523B}", - nfkd: "\u{523B}", - }, - NormalizationTest { - source: "\u{2F821}", - nfc: "\u{5246}", - nfd: "\u{5246}", - nfkc: "\u{5246}", - nfkd: "\u{5246}", - }, - NormalizationTest { - source: "\u{2F822}", - nfc: "\u{5272}", - nfd: "\u{5272}", - nfkc: "\u{5272}", - nfkd: "\u{5272}", - }, - NormalizationTest { - source: "\u{2F823}", - nfc: "\u{5277}", - nfd: "\u{5277}", - nfkc: "\u{5277}", - nfkd: "\u{5277}", - }, - NormalizationTest { - source: "\u{2F824}", - nfc: "\u{3515}", - nfd: "\u{3515}", - nfkc: "\u{3515}", - nfkd: "\u{3515}", - }, - NormalizationTest { - source: "\u{2F825}", - nfc: "\u{52C7}", - nfd: "\u{52C7}", - nfkc: "\u{52C7}", - nfkd: "\u{52C7}", - }, - NormalizationTest { - source: "\u{2F826}", - nfc: "\u{52C9}", - nfd: "\u{52C9}", - nfkc: "\u{52C9}", - nfkd: "\u{52C9}", - }, - NormalizationTest { - source: "\u{2F827}", - nfc: "\u{52E4}", - nfd: "\u{52E4}", - nfkc: "\u{52E4}", - nfkd: "\u{52E4}", - }, - NormalizationTest { - source: "\u{2F828}", - nfc: "\u{52FA}", - nfd: "\u{52FA}", - nfkc: "\u{52FA}", - nfkd: "\u{52FA}", - }, - NormalizationTest { - source: "\u{2F829}", - nfc: "\u{5305}", - nfd: "\u{5305}", - nfkc: "\u{5305}", - nfkd: "\u{5305}", - }, - NormalizationTest { - source: "\u{2F82A}", - nfc: "\u{5306}", - nfd: "\u{5306}", - nfkc: "\u{5306}", - nfkd: "\u{5306}", - }, - NormalizationTest { - source: "\u{2F82B}", - nfc: "\u{5317}", - nfd: "\u{5317}", - nfkc: "\u{5317}", - nfkd: "\u{5317}", - }, - NormalizationTest { - source: "\u{2F82C}", - nfc: "\u{5349}", - nfd: "\u{5349}", - nfkc: "\u{5349}", - nfkd: "\u{5349}", - }, - NormalizationTest { - source: "\u{2F82D}", - nfc: "\u{5351}", - nfd: "\u{5351}", - nfkc: "\u{5351}", - nfkd: "\u{5351}", - }, - NormalizationTest { - source: "\u{2F82E}", - nfc: "\u{535A}", - nfd: "\u{535A}", - nfkc: "\u{535A}", - nfkd: "\u{535A}", - }, - NormalizationTest { - source: "\u{2F82F}", - nfc: "\u{5373}", - nfd: "\u{5373}", - nfkc: "\u{5373}", - nfkd: "\u{5373}", - }, - NormalizationTest { - source: "\u{2F830}", - nfc: "\u{537D}", - nfd: "\u{537D}", - nfkc: "\u{537D}", - nfkd: "\u{537D}", - }, - NormalizationTest { - source: "\u{2F831}", - nfc: "\u{537F}", - nfd: "\u{537F}", - nfkc: "\u{537F}", - nfkd: "\u{537F}", - }, - NormalizationTest { - source: "\u{2F832}", - nfc: "\u{537F}", - nfd: "\u{537F}", - nfkc: "\u{537F}", - nfkd: "\u{537F}", - }, - NormalizationTest { - source: "\u{2F833}", - nfc: "\u{537F}", - nfd: "\u{537F}", - nfkc: "\u{537F}", - nfkd: "\u{537F}", - }, - NormalizationTest { - source: "\u{2F834}", - nfc: "\u{20A2C}", - nfd: "\u{20A2C}", - nfkc: "\u{20A2C}", - nfkd: "\u{20A2C}", - }, - NormalizationTest { - source: "\u{2F835}", - nfc: "\u{7070}", - nfd: "\u{7070}", - nfkc: "\u{7070}", - nfkd: "\u{7070}", - }, - NormalizationTest { - source: "\u{2F836}", - nfc: "\u{53CA}", - nfd: "\u{53CA}", - nfkc: "\u{53CA}", - nfkd: "\u{53CA}", - }, - NormalizationTest { - source: "\u{2F837}", - nfc: "\u{53DF}", - nfd: "\u{53DF}", - nfkc: "\u{53DF}", - nfkd: "\u{53DF}", - }, - NormalizationTest { - source: "\u{2F838}", - nfc: "\u{20B63}", - nfd: "\u{20B63}", - nfkc: "\u{20B63}", - nfkd: "\u{20B63}", - }, - NormalizationTest { - source: "\u{2F839}", - nfc: "\u{53EB}", - nfd: "\u{53EB}", - nfkc: "\u{53EB}", - nfkd: "\u{53EB}", - }, - NormalizationTest { - source: "\u{2F83A}", - nfc: "\u{53F1}", - nfd: "\u{53F1}", - nfkc: "\u{53F1}", - nfkd: "\u{53F1}", - }, - NormalizationTest { - source: "\u{2F83B}", - nfc: "\u{5406}", - nfd: "\u{5406}", - nfkc: "\u{5406}", - nfkd: "\u{5406}", - }, - NormalizationTest { - source: "\u{2F83C}", - nfc: "\u{549E}", - nfd: "\u{549E}", - nfkc: "\u{549E}", - nfkd: "\u{549E}", - }, - NormalizationTest { - source: "\u{2F83D}", - nfc: "\u{5438}", - nfd: "\u{5438}", - nfkc: "\u{5438}", - nfkd: "\u{5438}", - }, - NormalizationTest { - source: "\u{2F83E}", - nfc: "\u{5448}", - nfd: "\u{5448}", - nfkc: "\u{5448}", - nfkd: "\u{5448}", - }, - NormalizationTest { - source: "\u{2F83F}", - nfc: "\u{5468}", - nfd: "\u{5468}", - nfkc: "\u{5468}", - nfkd: "\u{5468}", - }, - NormalizationTest { - source: "\u{2F840}", - nfc: "\u{54A2}", - nfd: "\u{54A2}", - nfkc: "\u{54A2}", - nfkd: "\u{54A2}", - }, - NormalizationTest { - source: "\u{2F841}", - nfc: "\u{54F6}", - nfd: "\u{54F6}", - nfkc: "\u{54F6}", - nfkd: "\u{54F6}", - }, - NormalizationTest { - source: "\u{2F842}", - nfc: "\u{5510}", - nfd: "\u{5510}", - nfkc: "\u{5510}", - nfkd: "\u{5510}", - }, - NormalizationTest { - source: "\u{2F843}", - nfc: "\u{5553}", - nfd: "\u{5553}", - nfkc: "\u{5553}", - nfkd: "\u{5553}", - }, - NormalizationTest { - source: "\u{2F844}", - nfc: "\u{5563}", - nfd: "\u{5563}", - nfkc: "\u{5563}", - nfkd: "\u{5563}", - }, - NormalizationTest { - source: "\u{2F845}", - nfc: "\u{5584}", - nfd: "\u{5584}", - nfkc: "\u{5584}", - nfkd: "\u{5584}", - }, - NormalizationTest { - source: "\u{2F846}", - nfc: "\u{5584}", - nfd: "\u{5584}", - nfkc: "\u{5584}", - nfkd: "\u{5584}", - }, - NormalizationTest { - source: "\u{2F847}", - nfc: "\u{5599}", - nfd: "\u{5599}", - nfkc: "\u{5599}", - nfkd: "\u{5599}", - }, - NormalizationTest { - source: "\u{2F848}", - nfc: "\u{55AB}", - nfd: "\u{55AB}", - nfkc: "\u{55AB}", - nfkd: "\u{55AB}", - }, - NormalizationTest { - source: "\u{2F849}", - nfc: "\u{55B3}", - nfd: "\u{55B3}", - nfkc: "\u{55B3}", - nfkd: "\u{55B3}", - }, - NormalizationTest { - source: "\u{2F84A}", - nfc: "\u{55C2}", - nfd: "\u{55C2}", - nfkc: "\u{55C2}", - nfkd: "\u{55C2}", - }, - NormalizationTest { - source: "\u{2F84B}", - nfc: "\u{5716}", - nfd: "\u{5716}", - nfkc: "\u{5716}", - nfkd: "\u{5716}", - }, - NormalizationTest { - source: "\u{2F84C}", - nfc: "\u{5606}", - nfd: "\u{5606}", - nfkc: "\u{5606}", - nfkd: "\u{5606}", - }, - NormalizationTest { - source: "\u{2F84D}", - nfc: "\u{5717}", - nfd: "\u{5717}", - nfkc: "\u{5717}", - nfkd: "\u{5717}", - }, - NormalizationTest { - source: "\u{2F84E}", - nfc: "\u{5651}", - nfd: "\u{5651}", - nfkc: "\u{5651}", - nfkd: "\u{5651}", - }, - NormalizationTest { - source: "\u{2F84F}", - nfc: "\u{5674}", - nfd: "\u{5674}", - nfkc: "\u{5674}", - nfkd: "\u{5674}", - }, - NormalizationTest { - source: "\u{2F850}", - nfc: "\u{5207}", - nfd: "\u{5207}", - nfkc: "\u{5207}", - nfkd: "\u{5207}", - }, - NormalizationTest { - source: "\u{2F851}", - nfc: "\u{58EE}", - nfd: "\u{58EE}", - nfkc: "\u{58EE}", - nfkd: "\u{58EE}", - }, - NormalizationTest { - source: "\u{2F852}", - nfc: "\u{57CE}", - nfd: "\u{57CE}", - nfkc: "\u{57CE}", - nfkd: "\u{57CE}", - }, - NormalizationTest { - source: "\u{2F853}", - nfc: "\u{57F4}", - nfd: "\u{57F4}", - nfkc: "\u{57F4}", - nfkd: "\u{57F4}", - }, - NormalizationTest { - source: "\u{2F854}", - nfc: "\u{580D}", - nfd: "\u{580D}", - nfkc: "\u{580D}", - nfkd: "\u{580D}", - }, - NormalizationTest { - source: "\u{2F855}", - nfc: "\u{578B}", - nfd: "\u{578B}", - nfkc: "\u{578B}", - nfkd: "\u{578B}", - }, - NormalizationTest { - source: "\u{2F856}", - nfc: "\u{5832}", - nfd: "\u{5832}", - nfkc: "\u{5832}", - nfkd: "\u{5832}", - }, - NormalizationTest { - source: "\u{2F857}", - nfc: "\u{5831}", - nfd: "\u{5831}", - nfkc: "\u{5831}", - nfkd: "\u{5831}", - }, - NormalizationTest { - source: "\u{2F858}", - nfc: "\u{58AC}", - nfd: "\u{58AC}", - nfkc: "\u{58AC}", - nfkd: "\u{58AC}", - }, - NormalizationTest { - source: "\u{2F859}", - nfc: "\u{214E4}", - nfd: "\u{214E4}", - nfkc: "\u{214E4}", - nfkd: "\u{214E4}", - }, - NormalizationTest { - source: "\u{2F85A}", - nfc: "\u{58F2}", - nfd: "\u{58F2}", - nfkc: "\u{58F2}", - nfkd: "\u{58F2}", - }, - NormalizationTest { - source: "\u{2F85B}", - nfc: "\u{58F7}", - nfd: "\u{58F7}", - nfkc: "\u{58F7}", - nfkd: "\u{58F7}", - }, - NormalizationTest { - source: "\u{2F85C}", - nfc: "\u{5906}", - nfd: "\u{5906}", - nfkc: "\u{5906}", - nfkd: "\u{5906}", - }, - NormalizationTest { - source: "\u{2F85D}", - nfc: "\u{591A}", - nfd: "\u{591A}", - nfkc: "\u{591A}", - nfkd: "\u{591A}", - }, - NormalizationTest { - source: "\u{2F85E}", - nfc: "\u{5922}", - nfd: "\u{5922}", - nfkc: "\u{5922}", - nfkd: "\u{5922}", - }, - NormalizationTest { - source: "\u{2F85F}", - nfc: "\u{5962}", - nfd: "\u{5962}", - nfkc: "\u{5962}", - nfkd: "\u{5962}", - }, - NormalizationTest { - source: "\u{2F860}", - nfc: "\u{216A8}", - nfd: "\u{216A8}", - nfkc: "\u{216A8}", - nfkd: "\u{216A8}", - }, - NormalizationTest { - source: "\u{2F861}", - nfc: "\u{216EA}", - nfd: "\u{216EA}", - nfkc: "\u{216EA}", - nfkd: "\u{216EA}", - }, - NormalizationTest { - source: "\u{2F862}", - nfc: "\u{59EC}", - nfd: "\u{59EC}", - nfkc: "\u{59EC}", - nfkd: "\u{59EC}", - }, - NormalizationTest { - source: "\u{2F863}", - nfc: "\u{5A1B}", - nfd: "\u{5A1B}", - nfkc: "\u{5A1B}", - nfkd: "\u{5A1B}", - }, - NormalizationTest { - source: "\u{2F864}", - nfc: "\u{5A27}", - nfd: "\u{5A27}", - nfkc: "\u{5A27}", - nfkd: "\u{5A27}", - }, - NormalizationTest { - source: "\u{2F865}", - nfc: "\u{59D8}", - nfd: "\u{59D8}", - nfkc: "\u{59D8}", - nfkd: "\u{59D8}", - }, - NormalizationTest { - source: "\u{2F866}", - nfc: "\u{5A66}", - nfd: "\u{5A66}", - nfkc: "\u{5A66}", - nfkd: "\u{5A66}", - }, - NormalizationTest { - source: "\u{2F867}", - nfc: "\u{36EE}", - nfd: "\u{36EE}", - nfkc: "\u{36EE}", - nfkd: "\u{36EE}", - }, - NormalizationTest { - source: "\u{2F868}", - nfc: "\u{36FC}", - nfd: "\u{36FC}", - nfkc: "\u{36FC}", - nfkd: "\u{36FC}", - }, - NormalizationTest { - source: "\u{2F869}", - nfc: "\u{5B08}", - nfd: "\u{5B08}", - nfkc: "\u{5B08}", - nfkd: "\u{5B08}", - }, - NormalizationTest { - source: "\u{2F86A}", - nfc: "\u{5B3E}", - nfd: "\u{5B3E}", - nfkc: "\u{5B3E}", - nfkd: "\u{5B3E}", - }, - NormalizationTest { - source: "\u{2F86B}", - nfc: "\u{5B3E}", - nfd: "\u{5B3E}", - nfkc: "\u{5B3E}", - nfkd: "\u{5B3E}", - }, - NormalizationTest { - source: "\u{2F86C}", - nfc: "\u{219C8}", - nfd: "\u{219C8}", - nfkc: "\u{219C8}", - nfkd: "\u{219C8}", - }, - NormalizationTest { - source: "\u{2F86D}", - nfc: "\u{5BC3}", - nfd: "\u{5BC3}", - nfkc: "\u{5BC3}", - nfkd: "\u{5BC3}", - }, - NormalizationTest { - source: "\u{2F86E}", - nfc: "\u{5BD8}", - nfd: "\u{5BD8}", - nfkc: "\u{5BD8}", - nfkd: "\u{5BD8}", - }, - NormalizationTest { - source: "\u{2F86F}", - nfc: "\u{5BE7}", - nfd: "\u{5BE7}", - nfkc: "\u{5BE7}", - nfkd: "\u{5BE7}", - }, - NormalizationTest { - source: "\u{2F870}", - nfc: "\u{5BF3}", - nfd: "\u{5BF3}", - nfkc: "\u{5BF3}", - nfkd: "\u{5BF3}", - }, - NormalizationTest { - source: "\u{2F871}", - nfc: "\u{21B18}", - nfd: "\u{21B18}", - nfkc: "\u{21B18}", - nfkd: "\u{21B18}", - }, - NormalizationTest { - source: "\u{2F872}", - nfc: "\u{5BFF}", - nfd: "\u{5BFF}", - nfkc: "\u{5BFF}", - nfkd: "\u{5BFF}", - }, - NormalizationTest { - source: "\u{2F873}", - nfc: "\u{5C06}", - nfd: "\u{5C06}", - nfkc: "\u{5C06}", - nfkd: "\u{5C06}", - }, - NormalizationTest { - source: "\u{2F874}", - nfc: "\u{5F53}", - nfd: "\u{5F53}", - nfkc: "\u{5F53}", - nfkd: "\u{5F53}", - }, - NormalizationTest { - source: "\u{2F875}", - nfc: "\u{5C22}", - nfd: "\u{5C22}", - nfkc: "\u{5C22}", - nfkd: "\u{5C22}", - }, - NormalizationTest { - source: "\u{2F876}", - nfc: "\u{3781}", - nfd: "\u{3781}", - nfkc: "\u{3781}", - nfkd: "\u{3781}", - }, - NormalizationTest { - source: "\u{2F877}", - nfc: "\u{5C60}", - nfd: "\u{5C60}", - nfkc: "\u{5C60}", - nfkd: "\u{5C60}", - }, - NormalizationTest { - source: "\u{2F878}", - nfc: "\u{5C6E}", - nfd: "\u{5C6E}", - nfkc: "\u{5C6E}", - nfkd: "\u{5C6E}", - }, - NormalizationTest { - source: "\u{2F879}", - nfc: "\u{5CC0}", - nfd: "\u{5CC0}", - nfkc: "\u{5CC0}", - nfkd: "\u{5CC0}", - }, - NormalizationTest { - source: "\u{2F87A}", - nfc: "\u{5C8D}", - nfd: "\u{5C8D}", - nfkc: "\u{5C8D}", - nfkd: "\u{5C8D}", - }, - NormalizationTest { - source: "\u{2F87B}", - nfc: "\u{21DE4}", - nfd: "\u{21DE4}", - nfkc: "\u{21DE4}", - nfkd: "\u{21DE4}", - }, - NormalizationTest { - source: "\u{2F87C}", - nfc: "\u{5D43}", - nfd: "\u{5D43}", - nfkc: "\u{5D43}", - nfkd: "\u{5D43}", - }, - NormalizationTest { - source: "\u{2F87D}", - nfc: "\u{21DE6}", - nfd: "\u{21DE6}", - nfkc: "\u{21DE6}", - nfkd: "\u{21DE6}", - }, - NormalizationTest { - source: "\u{2F87E}", - nfc: "\u{5D6E}", - nfd: "\u{5D6E}", - nfkc: "\u{5D6E}", - nfkd: "\u{5D6E}", - }, - NormalizationTest { - source: "\u{2F87F}", - nfc: "\u{5D6B}", - nfd: "\u{5D6B}", - nfkc: "\u{5D6B}", - nfkd: "\u{5D6B}", - }, - NormalizationTest { - source: "\u{2F880}", - nfc: "\u{5D7C}", - nfd: "\u{5D7C}", - nfkc: "\u{5D7C}", - nfkd: "\u{5D7C}", - }, - NormalizationTest { - source: "\u{2F881}", - nfc: "\u{5DE1}", - nfd: "\u{5DE1}", - nfkc: "\u{5DE1}", - nfkd: "\u{5DE1}", - }, - NormalizationTest { - source: "\u{2F882}", - nfc: "\u{5DE2}", - nfd: "\u{5DE2}", - nfkc: "\u{5DE2}", - nfkd: "\u{5DE2}", - }, - NormalizationTest { - source: "\u{2F883}", - nfc: "\u{382F}", - nfd: "\u{382F}", - nfkc: "\u{382F}", - nfkd: "\u{382F}", - }, - NormalizationTest { - source: "\u{2F884}", - nfc: "\u{5DFD}", - nfd: "\u{5DFD}", - nfkc: "\u{5DFD}", - nfkd: "\u{5DFD}", - }, - NormalizationTest { - source: "\u{2F885}", - nfc: "\u{5E28}", - nfd: "\u{5E28}", - nfkc: "\u{5E28}", - nfkd: "\u{5E28}", - }, - NormalizationTest { - source: "\u{2F886}", - nfc: "\u{5E3D}", - nfd: "\u{5E3D}", - nfkc: "\u{5E3D}", - nfkd: "\u{5E3D}", - }, - NormalizationTest { - source: "\u{2F887}", - nfc: "\u{5E69}", - nfd: "\u{5E69}", - nfkc: "\u{5E69}", - nfkd: "\u{5E69}", - }, - NormalizationTest { - source: "\u{2F888}", - nfc: "\u{3862}", - nfd: "\u{3862}", - nfkc: "\u{3862}", - nfkd: "\u{3862}", - }, - NormalizationTest { - source: "\u{2F889}", - nfc: "\u{22183}", - nfd: "\u{22183}", - nfkc: "\u{22183}", - nfkd: "\u{22183}", - }, - NormalizationTest { - source: "\u{2F88A}", - nfc: "\u{387C}", - nfd: "\u{387C}", - nfkc: "\u{387C}", - nfkd: "\u{387C}", - }, - NormalizationTest { - source: "\u{2F88B}", - nfc: "\u{5EB0}", - nfd: "\u{5EB0}", - nfkc: "\u{5EB0}", - nfkd: "\u{5EB0}", - }, - NormalizationTest { - source: "\u{2F88C}", - nfc: "\u{5EB3}", - nfd: "\u{5EB3}", - nfkc: "\u{5EB3}", - nfkd: "\u{5EB3}", - }, - NormalizationTest { - source: "\u{2F88D}", - nfc: "\u{5EB6}", - nfd: "\u{5EB6}", - nfkc: "\u{5EB6}", - nfkd: "\u{5EB6}", - }, - NormalizationTest { - source: "\u{2F88E}", - nfc: "\u{5ECA}", - nfd: "\u{5ECA}", - nfkc: "\u{5ECA}", - nfkd: "\u{5ECA}", - }, - NormalizationTest { - source: "\u{2F88F}", - nfc: "\u{2A392}", - nfd: "\u{2A392}", - nfkc: "\u{2A392}", - nfkd: "\u{2A392}", - }, - NormalizationTest { - source: "\u{2F890}", - nfc: "\u{5EFE}", - nfd: "\u{5EFE}", - nfkc: "\u{5EFE}", - nfkd: "\u{5EFE}", - }, - NormalizationTest { - source: "\u{2F891}", - nfc: "\u{22331}", - nfd: "\u{22331}", - nfkc: "\u{22331}", - nfkd: "\u{22331}", - }, - NormalizationTest { - source: "\u{2F892}", - nfc: "\u{22331}", - nfd: "\u{22331}", - nfkc: "\u{22331}", - nfkd: "\u{22331}", - }, - NormalizationTest { - source: "\u{2F893}", - nfc: "\u{8201}", - nfd: "\u{8201}", - nfkc: "\u{8201}", - nfkd: "\u{8201}", - }, - NormalizationTest { - source: "\u{2F894}", - nfc: "\u{5F22}", - nfd: "\u{5F22}", - nfkc: "\u{5F22}", - nfkd: "\u{5F22}", - }, - NormalizationTest { - source: "\u{2F895}", - nfc: "\u{5F22}", - nfd: "\u{5F22}", - nfkc: "\u{5F22}", - nfkd: "\u{5F22}", - }, - NormalizationTest { - source: "\u{2F896}", - nfc: "\u{38C7}", - nfd: "\u{38C7}", - nfkc: "\u{38C7}", - nfkd: "\u{38C7}", - }, - NormalizationTest { - source: "\u{2F897}", - nfc: "\u{232B8}", - nfd: "\u{232B8}", - nfkc: "\u{232B8}", - nfkd: "\u{232B8}", - }, - NormalizationTest { - source: "\u{2F898}", - nfc: "\u{261DA}", - nfd: "\u{261DA}", - nfkc: "\u{261DA}", - nfkd: "\u{261DA}", - }, - NormalizationTest { - source: "\u{2F899}", - nfc: "\u{5F62}", - nfd: "\u{5F62}", - nfkc: "\u{5F62}", - nfkd: "\u{5F62}", - }, - NormalizationTest { - source: "\u{2F89A}", - nfc: "\u{5F6B}", - nfd: "\u{5F6B}", - nfkc: "\u{5F6B}", - nfkd: "\u{5F6B}", - }, - NormalizationTest { - source: "\u{2F89B}", - nfc: "\u{38E3}", - nfd: "\u{38E3}", - nfkc: "\u{38E3}", - nfkd: "\u{38E3}", - }, - NormalizationTest { - source: "\u{2F89C}", - nfc: "\u{5F9A}", - nfd: "\u{5F9A}", - nfkc: "\u{5F9A}", - nfkd: "\u{5F9A}", - }, - NormalizationTest { - source: "\u{2F89D}", - nfc: "\u{5FCD}", - nfd: "\u{5FCD}", - nfkc: "\u{5FCD}", - nfkd: "\u{5FCD}", - }, - NormalizationTest { - source: "\u{2F89E}", - nfc: "\u{5FD7}", - nfd: "\u{5FD7}", - nfkc: "\u{5FD7}", - nfkd: "\u{5FD7}", - }, - NormalizationTest { - source: "\u{2F89F}", - nfc: "\u{5FF9}", - nfd: "\u{5FF9}", - nfkc: "\u{5FF9}", - nfkd: "\u{5FF9}", - }, - NormalizationTest { - source: "\u{2F8A0}", - nfc: "\u{6081}", - nfd: "\u{6081}", - nfkc: "\u{6081}", - nfkd: "\u{6081}", - }, - NormalizationTest { - source: "\u{2F8A1}", - nfc: "\u{393A}", - nfd: "\u{393A}", - nfkc: "\u{393A}", - nfkd: "\u{393A}", - }, - NormalizationTest { - source: "\u{2F8A2}", - nfc: "\u{391C}", - nfd: "\u{391C}", - nfkc: "\u{391C}", - nfkd: "\u{391C}", - }, - NormalizationTest { - source: "\u{2F8A3}", - nfc: "\u{6094}", - nfd: "\u{6094}", - nfkc: "\u{6094}", - nfkd: "\u{6094}", - }, - NormalizationTest { - source: "\u{2F8A4}", - nfc: "\u{226D4}", - nfd: "\u{226D4}", - nfkc: "\u{226D4}", - nfkd: "\u{226D4}", - }, - NormalizationTest { - source: "\u{2F8A5}", - nfc: "\u{60C7}", - nfd: "\u{60C7}", - nfkc: "\u{60C7}", - nfkd: "\u{60C7}", - }, - NormalizationTest { - source: "\u{2F8A6}", - nfc: "\u{6148}", - nfd: "\u{6148}", - nfkc: "\u{6148}", - nfkd: "\u{6148}", - }, - NormalizationTest { - source: "\u{2F8A7}", - nfc: "\u{614C}", - nfd: "\u{614C}", - nfkc: "\u{614C}", - nfkd: "\u{614C}", - }, - NormalizationTest { - source: "\u{2F8A8}", - nfc: "\u{614E}", - nfd: "\u{614E}", - nfkc: "\u{614E}", - nfkd: "\u{614E}", - }, - NormalizationTest { - source: "\u{2F8A9}", - nfc: "\u{614C}", - nfd: "\u{614C}", - nfkc: "\u{614C}", - nfkd: "\u{614C}", - }, - NormalizationTest { - source: "\u{2F8AA}", - nfc: "\u{617A}", - nfd: "\u{617A}", - nfkc: "\u{617A}", - nfkd: "\u{617A}", - }, - NormalizationTest { - source: "\u{2F8AB}", - nfc: "\u{618E}", - nfd: "\u{618E}", - nfkc: "\u{618E}", - nfkd: "\u{618E}", - }, - NormalizationTest { - source: "\u{2F8AC}", - nfc: "\u{61B2}", - nfd: "\u{61B2}", - nfkc: "\u{61B2}", - nfkd: "\u{61B2}", - }, - NormalizationTest { - source: "\u{2F8AD}", - nfc: "\u{61A4}", - nfd: "\u{61A4}", - nfkc: "\u{61A4}", - nfkd: "\u{61A4}", - }, - NormalizationTest { - source: "\u{2F8AE}", - nfc: "\u{61AF}", - nfd: "\u{61AF}", - nfkc: "\u{61AF}", - nfkd: "\u{61AF}", - }, - NormalizationTest { - source: "\u{2F8AF}", - nfc: "\u{61DE}", - nfd: "\u{61DE}", - nfkc: "\u{61DE}", - nfkd: "\u{61DE}", - }, - NormalizationTest { - source: "\u{2F8B0}", - nfc: "\u{61F2}", - nfd: "\u{61F2}", - nfkc: "\u{61F2}", - nfkd: "\u{61F2}", - }, - NormalizationTest { - source: "\u{2F8B1}", - nfc: "\u{61F6}", - nfd: "\u{61F6}", - nfkc: "\u{61F6}", - nfkd: "\u{61F6}", - }, - NormalizationTest { - source: "\u{2F8B2}", - nfc: "\u{6210}", - nfd: "\u{6210}", - nfkc: "\u{6210}", - nfkd: "\u{6210}", - }, - NormalizationTest { - source: "\u{2F8B3}", - nfc: "\u{621B}", - nfd: "\u{621B}", - nfkc: "\u{621B}", - nfkd: "\u{621B}", - }, - NormalizationTest { - source: "\u{2F8B4}", - nfc: "\u{625D}", - nfd: "\u{625D}", - nfkc: "\u{625D}", - nfkd: "\u{625D}", - }, - NormalizationTest { - source: "\u{2F8B5}", - nfc: "\u{62B1}", - nfd: "\u{62B1}", - nfkc: "\u{62B1}", - nfkd: "\u{62B1}", - }, - NormalizationTest { - source: "\u{2F8B6}", - nfc: "\u{62D4}", - nfd: "\u{62D4}", - nfkc: "\u{62D4}", - nfkd: "\u{62D4}", - }, - NormalizationTest { - source: "\u{2F8B7}", - nfc: "\u{6350}", - nfd: "\u{6350}", - nfkc: "\u{6350}", - nfkd: "\u{6350}", - }, - NormalizationTest { - source: "\u{2F8B8}", - nfc: "\u{22B0C}", - nfd: "\u{22B0C}", - nfkc: "\u{22B0C}", - nfkd: "\u{22B0C}", - }, - NormalizationTest { - source: "\u{2F8B9}", - nfc: "\u{633D}", - nfd: "\u{633D}", - nfkc: "\u{633D}", - nfkd: "\u{633D}", - }, - NormalizationTest { - source: "\u{2F8BA}", - nfc: "\u{62FC}", - nfd: "\u{62FC}", - nfkc: "\u{62FC}", - nfkd: "\u{62FC}", - }, - NormalizationTest { - source: "\u{2F8BB}", - nfc: "\u{6368}", - nfd: "\u{6368}", - nfkc: "\u{6368}", - nfkd: "\u{6368}", - }, - NormalizationTest { - source: "\u{2F8BC}", - nfc: "\u{6383}", - nfd: "\u{6383}", - nfkc: "\u{6383}", - nfkd: "\u{6383}", - }, - NormalizationTest { - source: "\u{2F8BD}", - nfc: "\u{63E4}", - nfd: "\u{63E4}", - nfkc: "\u{63E4}", - nfkd: "\u{63E4}", - }, - NormalizationTest { - source: "\u{2F8BE}", - nfc: "\u{22BF1}", - nfd: "\u{22BF1}", - nfkc: "\u{22BF1}", - nfkd: "\u{22BF1}", - }, - NormalizationTest { - source: "\u{2F8BF}", - nfc: "\u{6422}", - nfd: "\u{6422}", - nfkc: "\u{6422}", - nfkd: "\u{6422}", - }, - NormalizationTest { - source: "\u{2F8C0}", - nfc: "\u{63C5}", - nfd: "\u{63C5}", - nfkc: "\u{63C5}", - nfkd: "\u{63C5}", - }, - NormalizationTest { - source: "\u{2F8C1}", - nfc: "\u{63A9}", - nfd: "\u{63A9}", - nfkc: "\u{63A9}", - nfkd: "\u{63A9}", - }, - NormalizationTest { - source: "\u{2F8C2}", - nfc: "\u{3A2E}", - nfd: "\u{3A2E}", - nfkc: "\u{3A2E}", - nfkd: "\u{3A2E}", - }, - NormalizationTest { - source: "\u{2F8C3}", - nfc: "\u{6469}", - nfd: "\u{6469}", - nfkc: "\u{6469}", - nfkd: "\u{6469}", - }, - NormalizationTest { - source: "\u{2F8C4}", - nfc: "\u{647E}", - nfd: "\u{647E}", - nfkc: "\u{647E}", - nfkd: "\u{647E}", - }, - NormalizationTest { - source: "\u{2F8C5}", - nfc: "\u{649D}", - nfd: "\u{649D}", - nfkc: "\u{649D}", - nfkd: "\u{649D}", - }, - NormalizationTest { - source: "\u{2F8C6}", - nfc: "\u{6477}", - nfd: "\u{6477}", - nfkc: "\u{6477}", - nfkd: "\u{6477}", - }, - NormalizationTest { - source: "\u{2F8C7}", - nfc: "\u{3A6C}", - nfd: "\u{3A6C}", - nfkc: "\u{3A6C}", - nfkd: "\u{3A6C}", - }, - NormalizationTest { - source: "\u{2F8C8}", - nfc: "\u{654F}", - nfd: "\u{654F}", - nfkc: "\u{654F}", - nfkd: "\u{654F}", - }, - NormalizationTest { - source: "\u{2F8C9}", - nfc: "\u{656C}", - nfd: "\u{656C}", - nfkc: "\u{656C}", - nfkd: "\u{656C}", - }, - NormalizationTest { - source: "\u{2F8CA}", - nfc: "\u{2300A}", - nfd: "\u{2300A}", - nfkc: "\u{2300A}", - nfkd: "\u{2300A}", - }, - NormalizationTest { - source: "\u{2F8CB}", - nfc: "\u{65E3}", - nfd: "\u{65E3}", - nfkc: "\u{65E3}", - nfkd: "\u{65E3}", - }, - NormalizationTest { - source: "\u{2F8CC}", - nfc: "\u{66F8}", - nfd: "\u{66F8}", - nfkc: "\u{66F8}", - nfkd: "\u{66F8}", - }, - NormalizationTest { - source: "\u{2F8CD}", - nfc: "\u{6649}", - nfd: "\u{6649}", - nfkc: "\u{6649}", - nfkd: "\u{6649}", - }, - NormalizationTest { - source: "\u{2F8CE}", - nfc: "\u{3B19}", - nfd: "\u{3B19}", - nfkc: "\u{3B19}", - nfkd: "\u{3B19}", - }, - NormalizationTest { - source: "\u{2F8CF}", - nfc: "\u{6691}", - nfd: "\u{6691}", - nfkc: "\u{6691}", - nfkd: "\u{6691}", - }, - NormalizationTest { - source: "\u{2F8D0}", - nfc: "\u{3B08}", - nfd: "\u{3B08}", - nfkc: "\u{3B08}", - nfkd: "\u{3B08}", - }, - NormalizationTest { - source: "\u{2F8D1}", - nfc: "\u{3AE4}", - nfd: "\u{3AE4}", - nfkc: "\u{3AE4}", - nfkd: "\u{3AE4}", - }, - NormalizationTest { - source: "\u{2F8D2}", - nfc: "\u{5192}", - nfd: "\u{5192}", - nfkc: "\u{5192}", - nfkd: "\u{5192}", - }, - NormalizationTest { - source: "\u{2F8D3}", - nfc: "\u{5195}", - nfd: "\u{5195}", - nfkc: "\u{5195}", - nfkd: "\u{5195}", - }, - NormalizationTest { - source: "\u{2F8D4}", - nfc: "\u{6700}", - nfd: "\u{6700}", - nfkc: "\u{6700}", - nfkd: "\u{6700}", - }, - NormalizationTest { - source: "\u{2F8D5}", - nfc: "\u{669C}", - nfd: "\u{669C}", - nfkc: "\u{669C}", - nfkd: "\u{669C}", - }, - NormalizationTest { - source: "\u{2F8D6}", - nfc: "\u{80AD}", - nfd: "\u{80AD}", - nfkc: "\u{80AD}", - nfkd: "\u{80AD}", - }, - NormalizationTest { - source: "\u{2F8D7}", - nfc: "\u{43D9}", - nfd: "\u{43D9}", - nfkc: "\u{43D9}", - nfkd: "\u{43D9}", - }, - NormalizationTest { - source: "\u{2F8D8}", - nfc: "\u{6717}", - nfd: "\u{6717}", - nfkc: "\u{6717}", - nfkd: "\u{6717}", - }, - NormalizationTest { - source: "\u{2F8D9}", - nfc: "\u{671B}", - nfd: "\u{671B}", - nfkc: "\u{671B}", - nfkd: "\u{671B}", - }, - NormalizationTest { - source: "\u{2F8DA}", - nfc: "\u{6721}", - nfd: "\u{6721}", - nfkc: "\u{6721}", - nfkd: "\u{6721}", - }, - NormalizationTest { - source: "\u{2F8DB}", - nfc: "\u{675E}", - nfd: "\u{675E}", - nfkc: "\u{675E}", - nfkd: "\u{675E}", - }, - NormalizationTest { - source: "\u{2F8DC}", - nfc: "\u{6753}", - nfd: "\u{6753}", - nfkc: "\u{6753}", - nfkd: "\u{6753}", - }, - NormalizationTest { - source: "\u{2F8DD}", - nfc: "\u{233C3}", - nfd: "\u{233C3}", - nfkc: "\u{233C3}", - nfkd: "\u{233C3}", - }, - NormalizationTest { - source: "\u{2F8DE}", - nfc: "\u{3B49}", - nfd: "\u{3B49}", - nfkc: "\u{3B49}", - nfkd: "\u{3B49}", - }, - NormalizationTest { - source: "\u{2F8DF}", - nfc: "\u{67FA}", - nfd: "\u{67FA}", - nfkc: "\u{67FA}", - nfkd: "\u{67FA}", - }, - NormalizationTest { - source: "\u{2F8E0}", - nfc: "\u{6785}", - nfd: "\u{6785}", - nfkc: "\u{6785}", - nfkd: "\u{6785}", - }, - NormalizationTest { - source: "\u{2F8E1}", - nfc: "\u{6852}", - nfd: "\u{6852}", - nfkc: "\u{6852}", - nfkd: "\u{6852}", - }, - NormalizationTest { - source: "\u{2F8E2}", - nfc: "\u{6885}", - nfd: "\u{6885}", - nfkc: "\u{6885}", - nfkd: "\u{6885}", - }, - NormalizationTest { - source: "\u{2F8E3}", - nfc: "\u{2346D}", - nfd: "\u{2346D}", - nfkc: "\u{2346D}", - nfkd: "\u{2346D}", - }, - NormalizationTest { - source: "\u{2F8E4}", - nfc: "\u{688E}", - nfd: "\u{688E}", - nfkc: "\u{688E}", - nfkd: "\u{688E}", - }, - NormalizationTest { - source: "\u{2F8E5}", - nfc: "\u{681F}", - nfd: "\u{681F}", - nfkc: "\u{681F}", - nfkd: "\u{681F}", - }, - NormalizationTest { - source: "\u{2F8E6}", - nfc: "\u{6914}", - nfd: "\u{6914}", - nfkc: "\u{6914}", - nfkd: "\u{6914}", - }, - NormalizationTest { - source: "\u{2F8E7}", - nfc: "\u{3B9D}", - nfd: "\u{3B9D}", - nfkc: "\u{3B9D}", - nfkd: "\u{3B9D}", - }, - NormalizationTest { - source: "\u{2F8E8}", - nfc: "\u{6942}", - nfd: "\u{6942}", - nfkc: "\u{6942}", - nfkd: "\u{6942}", - }, - NormalizationTest { - source: "\u{2F8E9}", - nfc: "\u{69A3}", - nfd: "\u{69A3}", - nfkc: "\u{69A3}", - nfkd: "\u{69A3}", - }, - NormalizationTest { - source: "\u{2F8EA}", - nfc: "\u{69EA}", - nfd: "\u{69EA}", - nfkc: "\u{69EA}", - nfkd: "\u{69EA}", - }, - NormalizationTest { - source: "\u{2F8EB}", - nfc: "\u{6AA8}", - nfd: "\u{6AA8}", - nfkc: "\u{6AA8}", - nfkd: "\u{6AA8}", - }, - NormalizationTest { - source: "\u{2F8EC}", - nfc: "\u{236A3}", - nfd: "\u{236A3}", - nfkc: "\u{236A3}", - nfkd: "\u{236A3}", - }, - NormalizationTest { - source: "\u{2F8ED}", - nfc: "\u{6ADB}", - nfd: "\u{6ADB}", - nfkc: "\u{6ADB}", - nfkd: "\u{6ADB}", - }, - NormalizationTest { - source: "\u{2F8EE}", - nfc: "\u{3C18}", - nfd: "\u{3C18}", - nfkc: "\u{3C18}", - nfkd: "\u{3C18}", - }, - NormalizationTest { - source: "\u{2F8EF}", - nfc: "\u{6B21}", - nfd: "\u{6B21}", - nfkc: "\u{6B21}", - nfkd: "\u{6B21}", - }, - NormalizationTest { - source: "\u{2F8F0}", - nfc: "\u{238A7}", - nfd: "\u{238A7}", - nfkc: "\u{238A7}", - nfkd: "\u{238A7}", - }, - NormalizationTest { - source: "\u{2F8F1}", - nfc: "\u{6B54}", - nfd: "\u{6B54}", - nfkc: "\u{6B54}", - nfkd: "\u{6B54}", - }, - NormalizationTest { - source: "\u{2F8F2}", - nfc: "\u{3C4E}", - nfd: "\u{3C4E}", - nfkc: "\u{3C4E}", - nfkd: "\u{3C4E}", - }, - NormalizationTest { - source: "\u{2F8F3}", - nfc: "\u{6B72}", - nfd: "\u{6B72}", - nfkc: "\u{6B72}", - nfkd: "\u{6B72}", - }, - NormalizationTest { - source: "\u{2F8F4}", - nfc: "\u{6B9F}", - nfd: "\u{6B9F}", - nfkc: "\u{6B9F}", - nfkd: "\u{6B9F}", - }, - NormalizationTest { - source: "\u{2F8F5}", - nfc: "\u{6BBA}", - nfd: "\u{6BBA}", - nfkc: "\u{6BBA}", - nfkd: "\u{6BBA}", - }, - NormalizationTest { - source: "\u{2F8F6}", - nfc: "\u{6BBB}", - nfd: "\u{6BBB}", - nfkc: "\u{6BBB}", - nfkd: "\u{6BBB}", - }, - NormalizationTest { - source: "\u{2F8F7}", - nfc: "\u{23A8D}", - nfd: "\u{23A8D}", - nfkc: "\u{23A8D}", - nfkd: "\u{23A8D}", - }, - NormalizationTest { - source: "\u{2F8F8}", - nfc: "\u{21D0B}", - nfd: "\u{21D0B}", - nfkc: "\u{21D0B}", - nfkd: "\u{21D0B}", - }, - NormalizationTest { - source: "\u{2F8F9}", - nfc: "\u{23AFA}", - nfd: "\u{23AFA}", - nfkc: "\u{23AFA}", - nfkd: "\u{23AFA}", - }, - NormalizationTest { - source: "\u{2F8FA}", - nfc: "\u{6C4E}", - nfd: "\u{6C4E}", - nfkc: "\u{6C4E}", - nfkd: "\u{6C4E}", - }, - NormalizationTest { - source: "\u{2F8FB}", - nfc: "\u{23CBC}", - nfd: "\u{23CBC}", - nfkc: "\u{23CBC}", - nfkd: "\u{23CBC}", - }, - NormalizationTest { - source: "\u{2F8FC}", - nfc: "\u{6CBF}", - nfd: "\u{6CBF}", - nfkc: "\u{6CBF}", - nfkd: "\u{6CBF}", - }, - NormalizationTest { - source: "\u{2F8FD}", - nfc: "\u{6CCD}", - nfd: "\u{6CCD}", - nfkc: "\u{6CCD}", - nfkd: "\u{6CCD}", - }, - NormalizationTest { - source: "\u{2F8FE}", - nfc: "\u{6C67}", - nfd: "\u{6C67}", - nfkc: "\u{6C67}", - nfkd: "\u{6C67}", - }, - NormalizationTest { - source: "\u{2F8FF}", - nfc: "\u{6D16}", - nfd: "\u{6D16}", - nfkc: "\u{6D16}", - nfkd: "\u{6D16}", - }, - NormalizationTest { - source: "\u{2F900}", - nfc: "\u{6D3E}", - nfd: "\u{6D3E}", - nfkc: "\u{6D3E}", - nfkd: "\u{6D3E}", - }, - NormalizationTest { - source: "\u{2F901}", - nfc: "\u{6D77}", - nfd: "\u{6D77}", - nfkc: "\u{6D77}", - nfkd: "\u{6D77}", - }, - NormalizationTest { - source: "\u{2F902}", - nfc: "\u{6D41}", - nfd: "\u{6D41}", - nfkc: "\u{6D41}", - nfkd: "\u{6D41}", - }, - NormalizationTest { - source: "\u{2F903}", - nfc: "\u{6D69}", - nfd: "\u{6D69}", - nfkc: "\u{6D69}", - nfkd: "\u{6D69}", - }, - NormalizationTest { - source: "\u{2F904}", - nfc: "\u{6D78}", - nfd: "\u{6D78}", - nfkc: "\u{6D78}", - nfkd: "\u{6D78}", - }, - NormalizationTest { - source: "\u{2F905}", - nfc: "\u{6D85}", - nfd: "\u{6D85}", - nfkc: "\u{6D85}", - nfkd: "\u{6D85}", - }, - NormalizationTest { - source: "\u{2F906}", - nfc: "\u{23D1E}", - nfd: "\u{23D1E}", - nfkc: "\u{23D1E}", - nfkd: "\u{23D1E}", - }, - NormalizationTest { - source: "\u{2F907}", - nfc: "\u{6D34}", - nfd: "\u{6D34}", - nfkc: "\u{6D34}", - nfkd: "\u{6D34}", - }, - NormalizationTest { - source: "\u{2F908}", - nfc: "\u{6E2F}", - nfd: "\u{6E2F}", - nfkc: "\u{6E2F}", - nfkd: "\u{6E2F}", - }, - NormalizationTest { - source: "\u{2F909}", - nfc: "\u{6E6E}", - nfd: "\u{6E6E}", - nfkc: "\u{6E6E}", - nfkd: "\u{6E6E}", - }, - NormalizationTest { - source: "\u{2F90A}", - nfc: "\u{3D33}", - nfd: "\u{3D33}", - nfkc: "\u{3D33}", - nfkd: "\u{3D33}", - }, - NormalizationTest { - source: "\u{2F90B}", - nfc: "\u{6ECB}", - nfd: "\u{6ECB}", - nfkc: "\u{6ECB}", - nfkd: "\u{6ECB}", - }, - NormalizationTest { - source: "\u{2F90C}", - nfc: "\u{6EC7}", - nfd: "\u{6EC7}", - nfkc: "\u{6EC7}", - nfkd: "\u{6EC7}", - }, - NormalizationTest { - source: "\u{2F90D}", - nfc: "\u{23ED1}", - nfd: "\u{23ED1}", - nfkc: "\u{23ED1}", - nfkd: "\u{23ED1}", - }, - NormalizationTest { - source: "\u{2F90E}", - nfc: "\u{6DF9}", - nfd: "\u{6DF9}", - nfkc: "\u{6DF9}", - nfkd: "\u{6DF9}", - }, - NormalizationTest { - source: "\u{2F90F}", - nfc: "\u{6F6E}", - nfd: "\u{6F6E}", - nfkc: "\u{6F6E}", - nfkd: "\u{6F6E}", - }, - NormalizationTest { - source: "\u{2F910}", - nfc: "\u{23F5E}", - nfd: "\u{23F5E}", - nfkc: "\u{23F5E}", - nfkd: "\u{23F5E}", - }, - NormalizationTest { - source: "\u{2F911}", - nfc: "\u{23F8E}", - nfd: "\u{23F8E}", - nfkc: "\u{23F8E}", - nfkd: "\u{23F8E}", - }, - NormalizationTest { - source: "\u{2F912}", - nfc: "\u{6FC6}", - nfd: "\u{6FC6}", - nfkc: "\u{6FC6}", - nfkd: "\u{6FC6}", - }, - NormalizationTest { - source: "\u{2F913}", - nfc: "\u{7039}", - nfd: "\u{7039}", - nfkc: "\u{7039}", - nfkd: "\u{7039}", - }, - NormalizationTest { - source: "\u{2F914}", - nfc: "\u{701E}", - nfd: "\u{701E}", - nfkc: "\u{701E}", - nfkd: "\u{701E}", - }, - NormalizationTest { - source: "\u{2F915}", - nfc: "\u{701B}", - nfd: "\u{701B}", - nfkc: "\u{701B}", - nfkd: "\u{701B}", - }, - NormalizationTest { - source: "\u{2F916}", - nfc: "\u{3D96}", - nfd: "\u{3D96}", - nfkc: "\u{3D96}", - nfkd: "\u{3D96}", - }, - NormalizationTest { - source: "\u{2F917}", - nfc: "\u{704A}", - nfd: "\u{704A}", - nfkc: "\u{704A}", - nfkd: "\u{704A}", - }, - NormalizationTest { - source: "\u{2F918}", - nfc: "\u{707D}", - nfd: "\u{707D}", - nfkc: "\u{707D}", - nfkd: "\u{707D}", - }, - NormalizationTest { - source: "\u{2F919}", - nfc: "\u{7077}", - nfd: "\u{7077}", - nfkc: "\u{7077}", - nfkd: "\u{7077}", - }, - NormalizationTest { - source: "\u{2F91A}", - nfc: "\u{70AD}", - nfd: "\u{70AD}", - nfkc: "\u{70AD}", - nfkd: "\u{70AD}", - }, - NormalizationTest { - source: "\u{2F91B}", - nfc: "\u{20525}", - nfd: "\u{20525}", - nfkc: "\u{20525}", - nfkd: "\u{20525}", - }, - NormalizationTest { - source: "\u{2F91C}", - nfc: "\u{7145}", - nfd: "\u{7145}", - nfkc: "\u{7145}", - nfkd: "\u{7145}", - }, - NormalizationTest { - source: "\u{2F91D}", - nfc: "\u{24263}", - nfd: "\u{24263}", - nfkc: "\u{24263}", - nfkd: "\u{24263}", - }, - NormalizationTest { - source: "\u{2F91E}", - nfc: "\u{719C}", - nfd: "\u{719C}", - nfkc: "\u{719C}", - nfkd: "\u{719C}", - }, - NormalizationTest { - source: "\u{2F91F}", - nfc: "\u{243AB}", - nfd: "\u{243AB}", - nfkc: "\u{243AB}", - nfkd: "\u{243AB}", - }, - NormalizationTest { - source: "\u{2F920}", - nfc: "\u{7228}", - nfd: "\u{7228}", - nfkc: "\u{7228}", - nfkd: "\u{7228}", - }, - NormalizationTest { - source: "\u{2F921}", - nfc: "\u{7235}", - nfd: "\u{7235}", - nfkc: "\u{7235}", - nfkd: "\u{7235}", - }, - NormalizationTest { - source: "\u{2F922}", - nfc: "\u{7250}", - nfd: "\u{7250}", - nfkc: "\u{7250}", - nfkd: "\u{7250}", - }, - NormalizationTest { - source: "\u{2F923}", - nfc: "\u{24608}", - nfd: "\u{24608}", - nfkc: "\u{24608}", - nfkd: "\u{24608}", - }, - NormalizationTest { - source: "\u{2F924}", - nfc: "\u{7280}", - nfd: "\u{7280}", - nfkc: "\u{7280}", - nfkd: "\u{7280}", - }, - NormalizationTest { - source: "\u{2F925}", - nfc: "\u{7295}", - nfd: "\u{7295}", - nfkc: "\u{7295}", - nfkd: "\u{7295}", - }, - NormalizationTest { - source: "\u{2F926}", - nfc: "\u{24735}", - nfd: "\u{24735}", - nfkc: "\u{24735}", - nfkd: "\u{24735}", - }, - NormalizationTest { - source: "\u{2F927}", - nfc: "\u{24814}", - nfd: "\u{24814}", - nfkc: "\u{24814}", - nfkd: "\u{24814}", - }, - NormalizationTest { - source: "\u{2F928}", - nfc: "\u{737A}", - nfd: "\u{737A}", - nfkc: "\u{737A}", - nfkd: "\u{737A}", - }, - NormalizationTest { - source: "\u{2F929}", - nfc: "\u{738B}", - nfd: "\u{738B}", - nfkc: "\u{738B}", - nfkd: "\u{738B}", - }, - NormalizationTest { - source: "\u{2F92A}", - nfc: "\u{3EAC}", - nfd: "\u{3EAC}", - nfkc: "\u{3EAC}", - nfkd: "\u{3EAC}", - }, - NormalizationTest { - source: "\u{2F92B}", - nfc: "\u{73A5}", - nfd: "\u{73A5}", - nfkc: "\u{73A5}", - nfkd: "\u{73A5}", - }, - NormalizationTest { - source: "\u{2F92C}", - nfc: "\u{3EB8}", - nfd: "\u{3EB8}", - nfkc: "\u{3EB8}", - nfkd: "\u{3EB8}", - }, - NormalizationTest { - source: "\u{2F92D}", - nfc: "\u{3EB8}", - nfd: "\u{3EB8}", - nfkc: "\u{3EB8}", - nfkd: "\u{3EB8}", - }, - NormalizationTest { - source: "\u{2F92E}", - nfc: "\u{7447}", - nfd: "\u{7447}", - nfkc: "\u{7447}", - nfkd: "\u{7447}", - }, - NormalizationTest { - source: "\u{2F92F}", - nfc: "\u{745C}", - nfd: "\u{745C}", - nfkc: "\u{745C}", - nfkd: "\u{745C}", - }, - NormalizationTest { - source: "\u{2F930}", - nfc: "\u{7471}", - nfd: "\u{7471}", - nfkc: "\u{7471}", - nfkd: "\u{7471}", - }, - NormalizationTest { - source: "\u{2F931}", - nfc: "\u{7485}", - nfd: "\u{7485}", - nfkc: "\u{7485}", - nfkd: "\u{7485}", - }, - NormalizationTest { - source: "\u{2F932}", - nfc: "\u{74CA}", - nfd: "\u{74CA}", - nfkc: "\u{74CA}", - nfkd: "\u{74CA}", - }, - NormalizationTest { - source: "\u{2F933}", - nfc: "\u{3F1B}", - nfd: "\u{3F1B}", - nfkc: "\u{3F1B}", - nfkd: "\u{3F1B}", - }, - NormalizationTest { - source: "\u{2F934}", - nfc: "\u{7524}", - nfd: "\u{7524}", - nfkc: "\u{7524}", - nfkd: "\u{7524}", - }, - NormalizationTest { - source: "\u{2F935}", - nfc: "\u{24C36}", - nfd: "\u{24C36}", - nfkc: "\u{24C36}", - nfkd: "\u{24C36}", - }, - NormalizationTest { - source: "\u{2F936}", - nfc: "\u{753E}", - nfd: "\u{753E}", - nfkc: "\u{753E}", - nfkd: "\u{753E}", - }, - NormalizationTest { - source: "\u{2F937}", - nfc: "\u{24C92}", - nfd: "\u{24C92}", - nfkc: "\u{24C92}", - nfkd: "\u{24C92}", - }, - NormalizationTest { - source: "\u{2F938}", - nfc: "\u{7570}", - nfd: "\u{7570}", - nfkc: "\u{7570}", - nfkd: "\u{7570}", - }, - NormalizationTest { - source: "\u{2F939}", - nfc: "\u{2219F}", - nfd: "\u{2219F}", - nfkc: "\u{2219F}", - nfkd: "\u{2219F}", - }, - NormalizationTest { - source: "\u{2F93A}", - nfc: "\u{7610}", - nfd: "\u{7610}", - nfkc: "\u{7610}", - nfkd: "\u{7610}", - }, - NormalizationTest { - source: "\u{2F93B}", - nfc: "\u{24FA1}", - nfd: "\u{24FA1}", - nfkc: "\u{24FA1}", - nfkd: "\u{24FA1}", - }, - NormalizationTest { - source: "\u{2F93C}", - nfc: "\u{24FB8}", - nfd: "\u{24FB8}", - nfkc: "\u{24FB8}", - nfkd: "\u{24FB8}", - }, - NormalizationTest { - source: "\u{2F93D}", - nfc: "\u{25044}", - nfd: "\u{25044}", - nfkc: "\u{25044}", - nfkd: "\u{25044}", - }, - NormalizationTest { - source: "\u{2F93E}", - nfc: "\u{3FFC}", - nfd: "\u{3FFC}", - nfkc: "\u{3FFC}", - nfkd: "\u{3FFC}", - }, - NormalizationTest { - source: "\u{2F93F}", - nfc: "\u{4008}", - nfd: "\u{4008}", - nfkc: "\u{4008}", - nfkd: "\u{4008}", - }, - NormalizationTest { - source: "\u{2F940}", - nfc: "\u{76F4}", - nfd: "\u{76F4}", - nfkc: "\u{76F4}", - nfkd: "\u{76F4}", - }, - NormalizationTest { - source: "\u{2F941}", - nfc: "\u{250F3}", - nfd: "\u{250F3}", - nfkc: "\u{250F3}", - nfkd: "\u{250F3}", - }, - NormalizationTest { - source: "\u{2F942}", - nfc: "\u{250F2}", - nfd: "\u{250F2}", - nfkc: "\u{250F2}", - nfkd: "\u{250F2}", - }, - NormalizationTest { - source: "\u{2F943}", - nfc: "\u{25119}", - nfd: "\u{25119}", - nfkc: "\u{25119}", - nfkd: "\u{25119}", - }, - NormalizationTest { - source: "\u{2F944}", - nfc: "\u{25133}", - nfd: "\u{25133}", - nfkc: "\u{25133}", - nfkd: "\u{25133}", - }, - NormalizationTest { - source: "\u{2F945}", - nfc: "\u{771E}", - nfd: "\u{771E}", - nfkc: "\u{771E}", - nfkd: "\u{771E}", - }, - NormalizationTest { - source: "\u{2F946}", - nfc: "\u{771F}", - nfd: "\u{771F}", - nfkc: "\u{771F}", - nfkd: "\u{771F}", - }, - NormalizationTest { - source: "\u{2F947}", - nfc: "\u{771F}", - nfd: "\u{771F}", - nfkc: "\u{771F}", - nfkd: "\u{771F}", - }, - NormalizationTest { - source: "\u{2F948}", - nfc: "\u{774A}", - nfd: "\u{774A}", - nfkc: "\u{774A}", - nfkd: "\u{774A}", - }, - NormalizationTest { - source: "\u{2F949}", - nfc: "\u{4039}", - nfd: "\u{4039}", - nfkc: "\u{4039}", - nfkd: "\u{4039}", - }, - NormalizationTest { - source: "\u{2F94A}", - nfc: "\u{778B}", - nfd: "\u{778B}", - nfkc: "\u{778B}", - nfkd: "\u{778B}", - }, - NormalizationTest { - source: "\u{2F94B}", - nfc: "\u{4046}", - nfd: "\u{4046}", - nfkc: "\u{4046}", - nfkd: "\u{4046}", - }, - NormalizationTest { - source: "\u{2F94C}", - nfc: "\u{4096}", - nfd: "\u{4096}", - nfkc: "\u{4096}", - nfkd: "\u{4096}", - }, - NormalizationTest { - source: "\u{2F94D}", - nfc: "\u{2541D}", - nfd: "\u{2541D}", - nfkc: "\u{2541D}", - nfkd: "\u{2541D}", - }, - NormalizationTest { - source: "\u{2F94E}", - nfc: "\u{784E}", - nfd: "\u{784E}", - nfkc: "\u{784E}", - nfkd: "\u{784E}", - }, - NormalizationTest { - source: "\u{2F94F}", - nfc: "\u{788C}", - nfd: "\u{788C}", - nfkc: "\u{788C}", - nfkd: "\u{788C}", - }, - NormalizationTest { - source: "\u{2F950}", - nfc: "\u{78CC}", - nfd: "\u{78CC}", - nfkc: "\u{78CC}", - nfkd: "\u{78CC}", - }, - NormalizationTest { - source: "\u{2F951}", - nfc: "\u{40E3}", - nfd: "\u{40E3}", - nfkc: "\u{40E3}", - nfkd: "\u{40E3}", - }, - NormalizationTest { - source: "\u{2F952}", - nfc: "\u{25626}", - nfd: "\u{25626}", - nfkc: "\u{25626}", - nfkd: "\u{25626}", - }, - NormalizationTest { - source: "\u{2F953}", - nfc: "\u{7956}", - nfd: "\u{7956}", - nfkc: "\u{7956}", - nfkd: "\u{7956}", - }, - NormalizationTest { - source: "\u{2F954}", - nfc: "\u{2569A}", - nfd: "\u{2569A}", - nfkc: "\u{2569A}", - nfkd: "\u{2569A}", - }, - NormalizationTest { - source: "\u{2F955}", - nfc: "\u{256C5}", - nfd: "\u{256C5}", - nfkc: "\u{256C5}", - nfkd: "\u{256C5}", - }, - NormalizationTest { - source: "\u{2F956}", - nfc: "\u{798F}", - nfd: "\u{798F}", - nfkc: "\u{798F}", - nfkd: "\u{798F}", - }, - NormalizationTest { - source: "\u{2F957}", - nfc: "\u{79EB}", - nfd: "\u{79EB}", - nfkc: "\u{79EB}", - nfkd: "\u{79EB}", - }, - NormalizationTest { - source: "\u{2F958}", - nfc: "\u{412F}", - nfd: "\u{412F}", - nfkc: "\u{412F}", - nfkd: "\u{412F}", - }, - NormalizationTest { - source: "\u{2F959}", - nfc: "\u{7A40}", - nfd: "\u{7A40}", - nfkc: "\u{7A40}", - nfkd: "\u{7A40}", - }, - NormalizationTest { - source: "\u{2F95A}", - nfc: "\u{7A4A}", - nfd: "\u{7A4A}", - nfkc: "\u{7A4A}", - nfkd: "\u{7A4A}", - }, - NormalizationTest { - source: "\u{2F95B}", - nfc: "\u{7A4F}", - nfd: "\u{7A4F}", - nfkc: "\u{7A4F}", - nfkd: "\u{7A4F}", - }, - NormalizationTest { - source: "\u{2F95C}", - nfc: "\u{2597C}", - nfd: "\u{2597C}", - nfkc: "\u{2597C}", - nfkd: "\u{2597C}", - }, - NormalizationTest { - source: "\u{2F95D}", - nfc: "\u{25AA7}", - nfd: "\u{25AA7}", - nfkc: "\u{25AA7}", - nfkd: "\u{25AA7}", - }, - NormalizationTest { - source: "\u{2F95E}", - nfc: "\u{25AA7}", - nfd: "\u{25AA7}", - nfkc: "\u{25AA7}", - nfkd: "\u{25AA7}", - }, - NormalizationTest { - source: "\u{2F95F}", - nfc: "\u{7AEE}", - nfd: "\u{7AEE}", - nfkc: "\u{7AEE}", - nfkd: "\u{7AEE}", - }, - NormalizationTest { - source: "\u{2F960}", - nfc: "\u{4202}", - nfd: "\u{4202}", - nfkc: "\u{4202}", - nfkd: "\u{4202}", - }, - NormalizationTest { - source: "\u{2F961}", - nfc: "\u{25BAB}", - nfd: "\u{25BAB}", - nfkc: "\u{25BAB}", - nfkd: "\u{25BAB}", - }, - NormalizationTest { - source: "\u{2F962}", - nfc: "\u{7BC6}", - nfd: "\u{7BC6}", - nfkc: "\u{7BC6}", - nfkd: "\u{7BC6}", - }, - NormalizationTest { - source: "\u{2F963}", - nfc: "\u{7BC9}", - nfd: "\u{7BC9}", - nfkc: "\u{7BC9}", - nfkd: "\u{7BC9}", - }, - NormalizationTest { - source: "\u{2F964}", - nfc: "\u{4227}", - nfd: "\u{4227}", - nfkc: "\u{4227}", - nfkd: "\u{4227}", - }, - NormalizationTest { - source: "\u{2F965}", - nfc: "\u{25C80}", - nfd: "\u{25C80}", - nfkc: "\u{25C80}", - nfkd: "\u{25C80}", - }, - NormalizationTest { - source: "\u{2F966}", - nfc: "\u{7CD2}", - nfd: "\u{7CD2}", - nfkc: "\u{7CD2}", - nfkd: "\u{7CD2}", - }, - NormalizationTest { - source: "\u{2F967}", - nfc: "\u{42A0}", - nfd: "\u{42A0}", - nfkc: "\u{42A0}", - nfkd: "\u{42A0}", - }, - NormalizationTest { - source: "\u{2F968}", - nfc: "\u{7CE8}", - nfd: "\u{7CE8}", - nfkc: "\u{7CE8}", - nfkd: "\u{7CE8}", - }, - NormalizationTest { - source: "\u{2F969}", - nfc: "\u{7CE3}", - nfd: "\u{7CE3}", - nfkc: "\u{7CE3}", - nfkd: "\u{7CE3}", - }, - NormalizationTest { - source: "\u{2F96A}", - nfc: "\u{7D00}", - nfd: "\u{7D00}", - nfkc: "\u{7D00}", - nfkd: "\u{7D00}", - }, - NormalizationTest { - source: "\u{2F96B}", - nfc: "\u{25F86}", - nfd: "\u{25F86}", - nfkc: "\u{25F86}", - nfkd: "\u{25F86}", - }, - NormalizationTest { - source: "\u{2F96C}", - nfc: "\u{7D63}", - nfd: "\u{7D63}", - nfkc: "\u{7D63}", - nfkd: "\u{7D63}", - }, - NormalizationTest { - source: "\u{2F96D}", - nfc: "\u{4301}", - nfd: "\u{4301}", - nfkc: "\u{4301}", - nfkd: "\u{4301}", - }, - NormalizationTest { - source: "\u{2F96E}", - nfc: "\u{7DC7}", - nfd: "\u{7DC7}", - nfkc: "\u{7DC7}", - nfkd: "\u{7DC7}", - }, - NormalizationTest { - source: "\u{2F96F}", - nfc: "\u{7E02}", - nfd: "\u{7E02}", - nfkc: "\u{7E02}", - nfkd: "\u{7E02}", - }, - NormalizationTest { - source: "\u{2F970}", - nfc: "\u{7E45}", - nfd: "\u{7E45}", - nfkc: "\u{7E45}", - nfkd: "\u{7E45}", - }, - NormalizationTest { - source: "\u{2F971}", - nfc: "\u{4334}", - nfd: "\u{4334}", - nfkc: "\u{4334}", - nfkd: "\u{4334}", - }, - NormalizationTest { - source: "\u{2F972}", - nfc: "\u{26228}", - nfd: "\u{26228}", - nfkc: "\u{26228}", - nfkd: "\u{26228}", - }, - NormalizationTest { - source: "\u{2F973}", - nfc: "\u{26247}", - nfd: "\u{26247}", - nfkc: "\u{26247}", - nfkd: "\u{26247}", - }, - NormalizationTest { - source: "\u{2F974}", - nfc: "\u{4359}", - nfd: "\u{4359}", - nfkc: "\u{4359}", - nfkd: "\u{4359}", - }, - NormalizationTest { - source: "\u{2F975}", - nfc: "\u{262D9}", - nfd: "\u{262D9}", - nfkc: "\u{262D9}", - nfkd: "\u{262D9}", - }, - NormalizationTest { - source: "\u{2F976}", - nfc: "\u{7F7A}", - nfd: "\u{7F7A}", - nfkc: "\u{7F7A}", - nfkd: "\u{7F7A}", - }, - NormalizationTest { - source: "\u{2F977}", - nfc: "\u{2633E}", - nfd: "\u{2633E}", - nfkc: "\u{2633E}", - nfkd: "\u{2633E}", - }, - NormalizationTest { - source: "\u{2F978}", - nfc: "\u{7F95}", - nfd: "\u{7F95}", - nfkc: "\u{7F95}", - nfkd: "\u{7F95}", - }, - NormalizationTest { - source: "\u{2F979}", - nfc: "\u{7FFA}", - nfd: "\u{7FFA}", - nfkc: "\u{7FFA}", - nfkd: "\u{7FFA}", - }, - NormalizationTest { - source: "\u{2F97A}", - nfc: "\u{8005}", - nfd: "\u{8005}", - nfkc: "\u{8005}", - nfkd: "\u{8005}", - }, - NormalizationTest { - source: "\u{2F97B}", - nfc: "\u{264DA}", - nfd: "\u{264DA}", - nfkc: "\u{264DA}", - nfkd: "\u{264DA}", - }, - NormalizationTest { - source: "\u{2F97C}", - nfc: "\u{26523}", - nfd: "\u{26523}", - nfkc: "\u{26523}", - nfkd: "\u{26523}", - }, - NormalizationTest { - source: "\u{2F97D}", - nfc: "\u{8060}", - nfd: "\u{8060}", - nfkc: "\u{8060}", - nfkd: "\u{8060}", - }, - NormalizationTest { - source: "\u{2F97E}", - nfc: "\u{265A8}", - nfd: "\u{265A8}", - nfkc: "\u{265A8}", - nfkd: "\u{265A8}", - }, - NormalizationTest { - source: "\u{2F97F}", - nfc: "\u{8070}", - nfd: "\u{8070}", - nfkc: "\u{8070}", - nfkd: "\u{8070}", - }, - NormalizationTest { - source: "\u{2F980}", - nfc: "\u{2335F}", - nfd: "\u{2335F}", - nfkc: "\u{2335F}", - nfkd: "\u{2335F}", - }, - NormalizationTest { - source: "\u{2F981}", - nfc: "\u{43D5}", - nfd: "\u{43D5}", - nfkc: "\u{43D5}", - nfkd: "\u{43D5}", - }, - NormalizationTest { - source: "\u{2F982}", - nfc: "\u{80B2}", - nfd: "\u{80B2}", - nfkc: "\u{80B2}", - nfkd: "\u{80B2}", - }, - NormalizationTest { - source: "\u{2F983}", - nfc: "\u{8103}", - nfd: "\u{8103}", - nfkc: "\u{8103}", - nfkd: "\u{8103}", - }, - NormalizationTest { - source: "\u{2F984}", - nfc: "\u{440B}", - nfd: "\u{440B}", - nfkc: "\u{440B}", - nfkd: "\u{440B}", - }, - NormalizationTest { - source: "\u{2F985}", - nfc: "\u{813E}", - nfd: "\u{813E}", - nfkc: "\u{813E}", - nfkd: "\u{813E}", - }, - NormalizationTest { - source: "\u{2F986}", - nfc: "\u{5AB5}", - nfd: "\u{5AB5}", - nfkc: "\u{5AB5}", - nfkd: "\u{5AB5}", - }, - NormalizationTest { - source: "\u{2F987}", - nfc: "\u{267A7}", - nfd: "\u{267A7}", - nfkc: "\u{267A7}", - nfkd: "\u{267A7}", - }, - NormalizationTest { - source: "\u{2F988}", - nfc: "\u{267B5}", - nfd: "\u{267B5}", - nfkc: "\u{267B5}", - nfkd: "\u{267B5}", - }, - NormalizationTest { - source: "\u{2F989}", - nfc: "\u{23393}", - nfd: "\u{23393}", - nfkc: "\u{23393}", - nfkd: "\u{23393}", - }, - NormalizationTest { - source: "\u{2F98A}", - nfc: "\u{2339C}", - nfd: "\u{2339C}", - nfkc: "\u{2339C}", - nfkd: "\u{2339C}", - }, - NormalizationTest { - source: "\u{2F98B}", - nfc: "\u{8201}", - nfd: "\u{8201}", - nfkc: "\u{8201}", - nfkd: "\u{8201}", - }, - NormalizationTest { - source: "\u{2F98C}", - nfc: "\u{8204}", - nfd: "\u{8204}", - nfkc: "\u{8204}", - nfkd: "\u{8204}", - }, - NormalizationTest { - source: "\u{2F98D}", - nfc: "\u{8F9E}", - nfd: "\u{8F9E}", - nfkc: "\u{8F9E}", - nfkd: "\u{8F9E}", - }, - NormalizationTest { - source: "\u{2F98E}", - nfc: "\u{446B}", - nfd: "\u{446B}", - nfkc: "\u{446B}", - nfkd: "\u{446B}", - }, - NormalizationTest { - source: "\u{2F98F}", - nfc: "\u{8291}", - nfd: "\u{8291}", - nfkc: "\u{8291}", - nfkd: "\u{8291}", - }, - NormalizationTest { - source: "\u{2F990}", - nfc: "\u{828B}", - nfd: "\u{828B}", - nfkc: "\u{828B}", - nfkd: "\u{828B}", - }, - NormalizationTest { - source: "\u{2F991}", - nfc: "\u{829D}", - nfd: "\u{829D}", - nfkc: "\u{829D}", - nfkd: "\u{829D}", - }, - NormalizationTest { - source: "\u{2F992}", - nfc: "\u{52B3}", - nfd: "\u{52B3}", - nfkc: "\u{52B3}", - nfkd: "\u{52B3}", - }, - NormalizationTest { - source: "\u{2F993}", - nfc: "\u{82B1}", - nfd: "\u{82B1}", - nfkc: "\u{82B1}", - nfkd: "\u{82B1}", - }, - NormalizationTest { - source: "\u{2F994}", - nfc: "\u{82B3}", - nfd: "\u{82B3}", - nfkc: "\u{82B3}", - nfkd: "\u{82B3}", - }, - NormalizationTest { - source: "\u{2F995}", - nfc: "\u{82BD}", - nfd: "\u{82BD}", - nfkc: "\u{82BD}", - nfkd: "\u{82BD}", - }, - NormalizationTest { - source: "\u{2F996}", - nfc: "\u{82E6}", - nfd: "\u{82E6}", - nfkc: "\u{82E6}", - nfkd: "\u{82E6}", - }, - NormalizationTest { - source: "\u{2F997}", - nfc: "\u{26B3C}", - nfd: "\u{26B3C}", - nfkc: "\u{26B3C}", - nfkd: "\u{26B3C}", - }, - NormalizationTest { - source: "\u{2F998}", - nfc: "\u{82E5}", - nfd: "\u{82E5}", - nfkc: "\u{82E5}", - nfkd: "\u{82E5}", - }, - NormalizationTest { - source: "\u{2F999}", - nfc: "\u{831D}", - nfd: "\u{831D}", - nfkc: "\u{831D}", - nfkd: "\u{831D}", - }, - NormalizationTest { - source: "\u{2F99A}", - nfc: "\u{8363}", - nfd: "\u{8363}", - nfkc: "\u{8363}", - nfkd: "\u{8363}", - }, - NormalizationTest { - source: "\u{2F99B}", - nfc: "\u{83AD}", - nfd: "\u{83AD}", - nfkc: "\u{83AD}", - nfkd: "\u{83AD}", - }, - NormalizationTest { - source: "\u{2F99C}", - nfc: "\u{8323}", - nfd: "\u{8323}", - nfkc: "\u{8323}", - nfkd: "\u{8323}", - }, - NormalizationTest { - source: "\u{2F99D}", - nfc: "\u{83BD}", - nfd: "\u{83BD}", - nfkc: "\u{83BD}", - nfkd: "\u{83BD}", - }, - NormalizationTest { - source: "\u{2F99E}", - nfc: "\u{83E7}", - nfd: "\u{83E7}", - nfkc: "\u{83E7}", - nfkd: "\u{83E7}", - }, - NormalizationTest { - source: "\u{2F99F}", - nfc: "\u{8457}", - nfd: "\u{8457}", - nfkc: "\u{8457}", - nfkd: "\u{8457}", - }, - NormalizationTest { - source: "\u{2F9A0}", - nfc: "\u{8353}", - nfd: "\u{8353}", - nfkc: "\u{8353}", - nfkd: "\u{8353}", - }, - NormalizationTest { - source: "\u{2F9A1}", - nfc: "\u{83CA}", - nfd: "\u{83CA}", - nfkc: "\u{83CA}", - nfkd: "\u{83CA}", - }, - NormalizationTest { - source: "\u{2F9A2}", - nfc: "\u{83CC}", - nfd: "\u{83CC}", - nfkc: "\u{83CC}", - nfkd: "\u{83CC}", - }, - NormalizationTest { - source: "\u{2F9A3}", - nfc: "\u{83DC}", - nfd: "\u{83DC}", - nfkc: "\u{83DC}", - nfkd: "\u{83DC}", - }, - NormalizationTest { - source: "\u{2F9A4}", - nfc: "\u{26C36}", - nfd: "\u{26C36}", - nfkc: "\u{26C36}", - nfkd: "\u{26C36}", - }, - NormalizationTest { - source: "\u{2F9A5}", - nfc: "\u{26D6B}", - nfd: "\u{26D6B}", - nfkc: "\u{26D6B}", - nfkd: "\u{26D6B}", - }, - NormalizationTest { - source: "\u{2F9A6}", - nfc: "\u{26CD5}", - nfd: "\u{26CD5}", - nfkc: "\u{26CD5}", - nfkd: "\u{26CD5}", - }, - NormalizationTest { - source: "\u{2F9A7}", - nfc: "\u{452B}", - nfd: "\u{452B}", - nfkc: "\u{452B}", - nfkd: "\u{452B}", - }, - NormalizationTest { - source: "\u{2F9A8}", - nfc: "\u{84F1}", - nfd: "\u{84F1}", - nfkc: "\u{84F1}", - nfkd: "\u{84F1}", - }, - NormalizationTest { - source: "\u{2F9A9}", - nfc: "\u{84F3}", - nfd: "\u{84F3}", - nfkc: "\u{84F3}", - nfkd: "\u{84F3}", - }, - NormalizationTest { - source: "\u{2F9AA}", - nfc: "\u{8516}", - nfd: "\u{8516}", - nfkc: "\u{8516}", - nfkd: "\u{8516}", - }, - NormalizationTest { - source: "\u{2F9AB}", - nfc: "\u{273CA}", - nfd: "\u{273CA}", - nfkc: "\u{273CA}", - nfkd: "\u{273CA}", - }, - NormalizationTest { - source: "\u{2F9AC}", - nfc: "\u{8564}", - nfd: "\u{8564}", - nfkc: "\u{8564}", - nfkd: "\u{8564}", - }, - NormalizationTest { - source: "\u{2F9AD}", - nfc: "\u{26F2C}", - nfd: "\u{26F2C}", - nfkc: "\u{26F2C}", - nfkd: "\u{26F2C}", - }, - NormalizationTest { - source: "\u{2F9AE}", - nfc: "\u{455D}", - nfd: "\u{455D}", - nfkc: "\u{455D}", - nfkd: "\u{455D}", - }, - NormalizationTest { - source: "\u{2F9AF}", - nfc: "\u{4561}", - nfd: "\u{4561}", - nfkc: "\u{4561}", - nfkd: "\u{4561}", - }, - NormalizationTest { - source: "\u{2F9B0}", - nfc: "\u{26FB1}", - nfd: "\u{26FB1}", - nfkc: "\u{26FB1}", - nfkd: "\u{26FB1}", - }, - NormalizationTest { - source: "\u{2F9B1}", - nfc: "\u{270D2}", - nfd: "\u{270D2}", - nfkc: "\u{270D2}", - nfkd: "\u{270D2}", - }, - NormalizationTest { - source: "\u{2F9B2}", - nfc: "\u{456B}", - nfd: "\u{456B}", - nfkc: "\u{456B}", - nfkd: "\u{456B}", - }, - NormalizationTest { - source: "\u{2F9B3}", - nfc: "\u{8650}", - nfd: "\u{8650}", - nfkc: "\u{8650}", - nfkd: "\u{8650}", - }, - NormalizationTest { - source: "\u{2F9B4}", - nfc: "\u{865C}", - nfd: "\u{865C}", - nfkc: "\u{865C}", - nfkd: "\u{865C}", - }, - NormalizationTest { - source: "\u{2F9B5}", - nfc: "\u{8667}", - nfd: "\u{8667}", - nfkc: "\u{8667}", - nfkd: "\u{8667}", - }, - NormalizationTest { - source: "\u{2F9B6}", - nfc: "\u{8669}", - nfd: "\u{8669}", - nfkc: "\u{8669}", - nfkd: "\u{8669}", - }, - NormalizationTest { - source: "\u{2F9B7}", - nfc: "\u{86A9}", - nfd: "\u{86A9}", - nfkc: "\u{86A9}", - nfkd: "\u{86A9}", - }, - NormalizationTest { - source: "\u{2F9B8}", - nfc: "\u{8688}", - nfd: "\u{8688}", - nfkc: "\u{8688}", - nfkd: "\u{8688}", - }, - NormalizationTest { - source: "\u{2F9B9}", - nfc: "\u{870E}", - nfd: "\u{870E}", - nfkc: "\u{870E}", - nfkd: "\u{870E}", - }, - NormalizationTest { - source: "\u{2F9BA}", - nfc: "\u{86E2}", - nfd: "\u{86E2}", - nfkc: "\u{86E2}", - nfkd: "\u{86E2}", - }, - NormalizationTest { - source: "\u{2F9BB}", - nfc: "\u{8779}", - nfd: "\u{8779}", - nfkc: "\u{8779}", - nfkd: "\u{8779}", - }, - NormalizationTest { - source: "\u{2F9BC}", - nfc: "\u{8728}", - nfd: "\u{8728}", - nfkc: "\u{8728}", - nfkd: "\u{8728}", - }, - NormalizationTest { - source: "\u{2F9BD}", - nfc: "\u{876B}", - nfd: "\u{876B}", - nfkc: "\u{876B}", - nfkd: "\u{876B}", - }, - NormalizationTest { - source: "\u{2F9BE}", - nfc: "\u{8786}", - nfd: "\u{8786}", - nfkc: "\u{8786}", - nfkd: "\u{8786}", - }, - NormalizationTest { - source: "\u{2F9BF}", - nfc: "\u{45D7}", - nfd: "\u{45D7}", - nfkc: "\u{45D7}", - nfkd: "\u{45D7}", - }, - NormalizationTest { - source: "\u{2F9C0}", - nfc: "\u{87E1}", - nfd: "\u{87E1}", - nfkc: "\u{87E1}", - nfkd: "\u{87E1}", - }, - NormalizationTest { - source: "\u{2F9C1}", - nfc: "\u{8801}", - nfd: "\u{8801}", - nfkc: "\u{8801}", - nfkd: "\u{8801}", - }, - NormalizationTest { - source: "\u{2F9C2}", - nfc: "\u{45F9}", - nfd: "\u{45F9}", - nfkc: "\u{45F9}", - nfkd: "\u{45F9}", - }, - NormalizationTest { - source: "\u{2F9C3}", - nfc: "\u{8860}", - nfd: "\u{8860}", - nfkc: "\u{8860}", - nfkd: "\u{8860}", - }, - NormalizationTest { - source: "\u{2F9C4}", - nfc: "\u{8863}", - nfd: "\u{8863}", - nfkc: "\u{8863}", - nfkd: "\u{8863}", - }, - NormalizationTest { - source: "\u{2F9C5}", - nfc: "\u{27667}", - nfd: "\u{27667}", - nfkc: "\u{27667}", - nfkd: "\u{27667}", - }, - NormalizationTest { - source: "\u{2F9C6}", - nfc: "\u{88D7}", - nfd: "\u{88D7}", - nfkc: "\u{88D7}", - nfkd: "\u{88D7}", - }, - NormalizationTest { - source: "\u{2F9C7}", - nfc: "\u{88DE}", - nfd: "\u{88DE}", - nfkc: "\u{88DE}", - nfkd: "\u{88DE}", - }, - NormalizationTest { - source: "\u{2F9C8}", - nfc: "\u{4635}", - nfd: "\u{4635}", - nfkc: "\u{4635}", - nfkd: "\u{4635}", - }, - NormalizationTest { - source: "\u{2F9C9}", - nfc: "\u{88FA}", - nfd: "\u{88FA}", - nfkc: "\u{88FA}", - nfkd: "\u{88FA}", - }, - NormalizationTest { - source: "\u{2F9CA}", - nfc: "\u{34BB}", - nfd: "\u{34BB}", - nfkc: "\u{34BB}", - nfkd: "\u{34BB}", - }, - NormalizationTest { - source: "\u{2F9CB}", - nfc: "\u{278AE}", - nfd: "\u{278AE}", - nfkc: "\u{278AE}", - nfkd: "\u{278AE}", - }, - NormalizationTest { - source: "\u{2F9CC}", - nfc: "\u{27966}", - nfd: "\u{27966}", - nfkc: "\u{27966}", - nfkd: "\u{27966}", - }, - NormalizationTest { - source: "\u{2F9CD}", - nfc: "\u{46BE}", - nfd: "\u{46BE}", - nfkc: "\u{46BE}", - nfkd: "\u{46BE}", - }, - NormalizationTest { - source: "\u{2F9CE}", - nfc: "\u{46C7}", - nfd: "\u{46C7}", - nfkc: "\u{46C7}", - nfkd: "\u{46C7}", - }, - NormalizationTest { - source: "\u{2F9CF}", - nfc: "\u{8AA0}", - nfd: "\u{8AA0}", - nfkc: "\u{8AA0}", - nfkd: "\u{8AA0}", - }, - NormalizationTest { - source: "\u{2F9D0}", - nfc: "\u{8AED}", - nfd: "\u{8AED}", - nfkc: "\u{8AED}", - nfkd: "\u{8AED}", - }, - NormalizationTest { - source: "\u{2F9D1}", - nfc: "\u{8B8A}", - nfd: "\u{8B8A}", - nfkc: "\u{8B8A}", - nfkd: "\u{8B8A}", - }, - NormalizationTest { - source: "\u{2F9D2}", - nfc: "\u{8C55}", - nfd: "\u{8C55}", - nfkc: "\u{8C55}", - nfkd: "\u{8C55}", - }, - NormalizationTest { - source: "\u{2F9D3}", - nfc: "\u{27CA8}", - nfd: "\u{27CA8}", - nfkc: "\u{27CA8}", - nfkd: "\u{27CA8}", - }, - NormalizationTest { - source: "\u{2F9D4}", - nfc: "\u{8CAB}", - nfd: "\u{8CAB}", - nfkc: "\u{8CAB}", - nfkd: "\u{8CAB}", - }, - NormalizationTest { - source: "\u{2F9D5}", - nfc: "\u{8CC1}", - nfd: "\u{8CC1}", - nfkc: "\u{8CC1}", - nfkd: "\u{8CC1}", - }, - NormalizationTest { - source: "\u{2F9D6}", - nfc: "\u{8D1B}", - nfd: "\u{8D1B}", - nfkc: "\u{8D1B}", - nfkd: "\u{8D1B}", - }, - NormalizationTest { - source: "\u{2F9D7}", - nfc: "\u{8D77}", - nfd: "\u{8D77}", - nfkc: "\u{8D77}", - nfkd: "\u{8D77}", - }, - NormalizationTest { - source: "\u{2F9D8}", - nfc: "\u{27F2F}", - nfd: "\u{27F2F}", - nfkc: "\u{27F2F}", - nfkd: "\u{27F2F}", - }, - NormalizationTest { - source: "\u{2F9D9}", - nfc: "\u{20804}", - nfd: "\u{20804}", - nfkc: "\u{20804}", - nfkd: "\u{20804}", - }, - NormalizationTest { - source: "\u{2F9DA}", - nfc: "\u{8DCB}", - nfd: "\u{8DCB}", - nfkc: "\u{8DCB}", - nfkd: "\u{8DCB}", - }, - NormalizationTest { - source: "\u{2F9DB}", - nfc: "\u{8DBC}", - nfd: "\u{8DBC}", - nfkc: "\u{8DBC}", - nfkd: "\u{8DBC}", - }, - NormalizationTest { - source: "\u{2F9DC}", - nfc: "\u{8DF0}", - nfd: "\u{8DF0}", - nfkc: "\u{8DF0}", - nfkd: "\u{8DF0}", - }, - NormalizationTest { - source: "\u{2F9DD}", - nfc: "\u{208DE}", - nfd: "\u{208DE}", - nfkc: "\u{208DE}", - nfkd: "\u{208DE}", - }, - NormalizationTest { - source: "\u{2F9DE}", - nfc: "\u{8ED4}", - nfd: "\u{8ED4}", - nfkc: "\u{8ED4}", - nfkd: "\u{8ED4}", - }, - NormalizationTest { - source: "\u{2F9DF}", - nfc: "\u{8F38}", - nfd: "\u{8F38}", - nfkc: "\u{8F38}", - nfkd: "\u{8F38}", - }, - NormalizationTest { - source: "\u{2F9E0}", - nfc: "\u{285D2}", - nfd: "\u{285D2}", - nfkc: "\u{285D2}", - nfkd: "\u{285D2}", - }, - NormalizationTest { - source: "\u{2F9E1}", - nfc: "\u{285ED}", - nfd: "\u{285ED}", - nfkc: "\u{285ED}", - nfkd: "\u{285ED}", - }, - NormalizationTest { - source: "\u{2F9E2}", - nfc: "\u{9094}", - nfd: "\u{9094}", - nfkc: "\u{9094}", - nfkd: "\u{9094}", - }, - NormalizationTest { - source: "\u{2F9E3}", - nfc: "\u{90F1}", - nfd: "\u{90F1}", - nfkc: "\u{90F1}", - nfkd: "\u{90F1}", - }, - NormalizationTest { - source: "\u{2F9E4}", - nfc: "\u{9111}", - nfd: "\u{9111}", - nfkc: "\u{9111}", - nfkd: "\u{9111}", - }, - NormalizationTest { - source: "\u{2F9E5}", - nfc: "\u{2872E}", - nfd: "\u{2872E}", - nfkc: "\u{2872E}", - nfkd: "\u{2872E}", - }, - NormalizationTest { - source: "\u{2F9E6}", - nfc: "\u{911B}", - nfd: "\u{911B}", - nfkc: "\u{911B}", - nfkd: "\u{911B}", - }, - NormalizationTest { - source: "\u{2F9E7}", - nfc: "\u{9238}", - nfd: "\u{9238}", - nfkc: "\u{9238}", - nfkd: "\u{9238}", - }, - NormalizationTest { - source: "\u{2F9E8}", - nfc: "\u{92D7}", - nfd: "\u{92D7}", - nfkc: "\u{92D7}", - nfkd: "\u{92D7}", - }, - NormalizationTest { - source: "\u{2F9E9}", - nfc: "\u{92D8}", - nfd: "\u{92D8}", - nfkc: "\u{92D8}", - nfkd: "\u{92D8}", - }, - NormalizationTest { - source: "\u{2F9EA}", - nfc: "\u{927C}", - nfd: "\u{927C}", - nfkc: "\u{927C}", - nfkd: "\u{927C}", - }, - NormalizationTest { - source: "\u{2F9EB}", - nfc: "\u{93F9}", - nfd: "\u{93F9}", - nfkc: "\u{93F9}", - nfkd: "\u{93F9}", - }, - NormalizationTest { - source: "\u{2F9EC}", - nfc: "\u{9415}", - nfd: "\u{9415}", - nfkc: "\u{9415}", - nfkd: "\u{9415}", - }, - NormalizationTest { - source: "\u{2F9ED}", - nfc: "\u{28BFA}", - nfd: "\u{28BFA}", - nfkc: "\u{28BFA}", - nfkd: "\u{28BFA}", - }, - NormalizationTest { - source: "\u{2F9EE}", - nfc: "\u{958B}", - nfd: "\u{958B}", - nfkc: "\u{958B}", - nfkd: "\u{958B}", - }, - NormalizationTest { - source: "\u{2F9EF}", - nfc: "\u{4995}", - nfd: "\u{4995}", - nfkc: "\u{4995}", - nfkd: "\u{4995}", - }, - NormalizationTest { - source: "\u{2F9F0}", - nfc: "\u{95B7}", - nfd: "\u{95B7}", - nfkc: "\u{95B7}", - nfkd: "\u{95B7}", - }, - NormalizationTest { - source: "\u{2F9F1}", - nfc: "\u{28D77}", - nfd: "\u{28D77}", - nfkc: "\u{28D77}", - nfkd: "\u{28D77}", - }, - NormalizationTest { - source: "\u{2F9F2}", - nfc: "\u{49E6}", - nfd: "\u{49E6}", - nfkc: "\u{49E6}", - nfkd: "\u{49E6}", - }, - NormalizationTest { - source: "\u{2F9F3}", - nfc: "\u{96C3}", - nfd: "\u{96C3}", - nfkc: "\u{96C3}", - nfkd: "\u{96C3}", - }, - NormalizationTest { - source: "\u{2F9F4}", - nfc: "\u{5DB2}", - nfd: "\u{5DB2}", - nfkc: "\u{5DB2}", - nfkd: "\u{5DB2}", - }, - NormalizationTest { - source: "\u{2F9F5}", - nfc: "\u{9723}", - nfd: "\u{9723}", - nfkc: "\u{9723}", - nfkd: "\u{9723}", - }, - NormalizationTest { - source: "\u{2F9F6}", - nfc: "\u{29145}", - nfd: "\u{29145}", - nfkc: "\u{29145}", - nfkd: "\u{29145}", - }, - NormalizationTest { - source: "\u{2F9F7}", - nfc: "\u{2921A}", - nfd: "\u{2921A}", - nfkc: "\u{2921A}", - nfkd: "\u{2921A}", - }, - NormalizationTest { - source: "\u{2F9F8}", - nfc: "\u{4A6E}", - nfd: "\u{4A6E}", - nfkc: "\u{4A6E}", - nfkd: "\u{4A6E}", - }, - NormalizationTest { - source: "\u{2F9F9}", - nfc: "\u{4A76}", - nfd: "\u{4A76}", - nfkc: "\u{4A76}", - nfkd: "\u{4A76}", - }, - NormalizationTest { - source: "\u{2F9FA}", - nfc: "\u{97E0}", - nfd: "\u{97E0}", - nfkc: "\u{97E0}", - nfkd: "\u{97E0}", - }, - NormalizationTest { - source: "\u{2F9FB}", - nfc: "\u{2940A}", - nfd: "\u{2940A}", - nfkc: "\u{2940A}", - nfkd: "\u{2940A}", - }, - NormalizationTest { - source: "\u{2F9FC}", - nfc: "\u{4AB2}", - nfd: "\u{4AB2}", - nfkc: "\u{4AB2}", - nfkd: "\u{4AB2}", - }, - NormalizationTest { - source: "\u{2F9FD}", - nfc: "\u{29496}", - nfd: "\u{29496}", - nfkc: "\u{29496}", - nfkd: "\u{29496}", - }, - NormalizationTest { - source: "\u{2F9FE}", - nfc: "\u{980B}", - nfd: "\u{980B}", - nfkc: "\u{980B}", - nfkd: "\u{980B}", - }, - NormalizationTest { - source: "\u{2F9FF}", - nfc: "\u{980B}", - nfd: "\u{980B}", - nfkc: "\u{980B}", - nfkd: "\u{980B}", - }, - NormalizationTest { - source: "\u{2FA00}", - nfc: "\u{9829}", - nfd: "\u{9829}", - nfkc: "\u{9829}", - nfkd: "\u{9829}", - }, - NormalizationTest { - source: "\u{2FA01}", - nfc: "\u{295B6}", - nfd: "\u{295B6}", - nfkc: "\u{295B6}", - nfkd: "\u{295B6}", - }, - NormalizationTest { - source: "\u{2FA02}", - nfc: "\u{98E2}", - nfd: "\u{98E2}", - nfkc: "\u{98E2}", - nfkd: "\u{98E2}", - }, - NormalizationTest { - source: "\u{2FA03}", - nfc: "\u{4B33}", - nfd: "\u{4B33}", - nfkc: "\u{4B33}", - nfkd: "\u{4B33}", - }, - NormalizationTest { - source: "\u{2FA04}", - nfc: "\u{9929}", - nfd: "\u{9929}", - nfkc: "\u{9929}", - nfkd: "\u{9929}", - }, - NormalizationTest { - source: "\u{2FA05}", - nfc: "\u{99A7}", - nfd: "\u{99A7}", - nfkc: "\u{99A7}", - nfkd: "\u{99A7}", - }, - NormalizationTest { - source: "\u{2FA06}", - nfc: "\u{99C2}", - nfd: "\u{99C2}", - nfkc: "\u{99C2}", - nfkd: "\u{99C2}", - }, - NormalizationTest { - source: "\u{2FA07}", - nfc: "\u{99FE}", - nfd: "\u{99FE}", - nfkc: "\u{99FE}", - nfkd: "\u{99FE}", - }, - NormalizationTest { - source: "\u{2FA08}", - nfc: "\u{4BCE}", - nfd: "\u{4BCE}", - nfkc: "\u{4BCE}", - nfkd: "\u{4BCE}", - }, - NormalizationTest { - source: "\u{2FA09}", - nfc: "\u{29B30}", - nfd: "\u{29B30}", - nfkc: "\u{29B30}", - nfkd: "\u{29B30}", - }, - NormalizationTest { - source: "\u{2FA0A}", - nfc: "\u{9B12}", - nfd: "\u{9B12}", - nfkc: "\u{9B12}", - nfkd: "\u{9B12}", - }, - NormalizationTest { - source: "\u{2FA0B}", - nfc: "\u{9C40}", - nfd: "\u{9C40}", - nfkc: "\u{9C40}", - nfkd: "\u{9C40}", - }, - NormalizationTest { - source: "\u{2FA0C}", - nfc: "\u{9CFD}", - nfd: "\u{9CFD}", - nfkc: "\u{9CFD}", - nfkd: "\u{9CFD}", - }, - NormalizationTest { - source: "\u{2FA0D}", - nfc: "\u{4CCE}", - nfd: "\u{4CCE}", - nfkc: "\u{4CCE}", - nfkd: "\u{4CCE}", - }, - NormalizationTest { - source: "\u{2FA0E}", - nfc: "\u{4CED}", - nfd: "\u{4CED}", - nfkc: "\u{4CED}", - nfkd: "\u{4CED}", - }, - NormalizationTest { - source: "\u{2FA0F}", - nfc: "\u{9D67}", - nfd: "\u{9D67}", - nfkc: "\u{9D67}", - nfkd: "\u{9D67}", - }, - NormalizationTest { - source: "\u{2FA10}", - nfc: "\u{2A0CE}", - nfd: "\u{2A0CE}", - nfkc: "\u{2A0CE}", - nfkd: "\u{2A0CE}", - }, - NormalizationTest { - source: "\u{2FA11}", - nfc: "\u{4CF8}", - nfd: "\u{4CF8}", - nfkc: "\u{4CF8}", - nfkd: "\u{4CF8}", - }, - NormalizationTest { - source: "\u{2FA12}", - nfc: "\u{2A105}", - nfd: "\u{2A105}", - nfkc: "\u{2A105}", - nfkd: "\u{2A105}", - }, - NormalizationTest { - source: "\u{2FA13}", - nfc: "\u{2A20E}", - nfd: "\u{2A20E}", - nfkc: "\u{2A20E}", - nfkd: "\u{2A20E}", - }, - NormalizationTest { - source: "\u{2FA14}", - nfc: "\u{2A291}", - nfd: "\u{2A291}", - nfkc: "\u{2A291}", - nfkd: "\u{2A291}", - }, - NormalizationTest { - source: "\u{2FA15}", - nfc: "\u{9EBB}", - nfd: "\u{9EBB}", - nfkc: "\u{9EBB}", - nfkd: "\u{9EBB}", - }, - NormalizationTest { - source: "\u{2FA16}", - nfc: "\u{4D56}", - nfd: "\u{4D56}", - nfkc: "\u{4D56}", - nfkd: "\u{4D56}", - }, - NormalizationTest { - source: "\u{2FA17}", - nfc: "\u{9EF9}", - nfd: "\u{9EF9}", - nfkc: "\u{9EF9}", - nfkd: "\u{9EF9}", - }, - NormalizationTest { - source: "\u{2FA18}", - nfc: "\u{9EFE}", - nfd: "\u{9EFE}", - nfkc: "\u{9EFE}", - nfkd: "\u{9EFE}", - }, - NormalizationTest { - source: "\u{2FA19}", - nfc: "\u{9F05}", - nfd: "\u{9F05}", - nfkc: "\u{9F05}", - nfkd: "\u{9F05}", - }, - NormalizationTest { - source: "\u{2FA1A}", - nfc: "\u{9F0F}", - nfd: "\u{9F0F}", - nfkc: "\u{9F0F}", - nfkd: "\u{9F0F}", - }, - NormalizationTest { - source: "\u{2FA1B}", - nfc: "\u{9F16}", - nfd: "\u{9F16}", - nfkc: "\u{9F16}", - nfkd: "\u{9F16}", - }, - NormalizationTest { - source: "\u{2FA1C}", - nfc: "\u{9F3B}", - nfd: "\u{9F3B}", - nfkc: "\u{9F3B}", - nfkd: "\u{9F3B}", - }, - NormalizationTest { - source: "\u{2FA1D}", - nfc: "\u{2A600}", - nfd: "\u{2A600}", - nfkc: "\u{2A600}", - nfkd: "\u{2A600}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0300}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0300}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0301}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0301}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0301}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0301}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0301}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0301}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{00E1}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0301}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E1}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0301}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0302}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0302}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0302}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0302}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0302}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0302}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{1EA7}\u{05AE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0302}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{1EA7}\u{05AE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0302}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0303}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0303}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0303}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0303}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0303}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0303}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{00E3}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0303}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E3}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0303}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0304}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0304}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0304}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0304}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0304}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0304}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0101}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0304}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0101}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0304}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0305}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0305}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0305}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0305}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0305}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0305}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0305}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0305}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0305}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0305}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0306}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0306}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0306}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0306}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0306}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0306}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{1EB1}\u{05AE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0306}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{1EB1}\u{05AE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0306}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0307}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0307}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0307}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0307}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0307}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0307}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0227}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0307}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0227}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0307}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0308}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0308}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0308}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0308}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0308}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0308}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{00E4}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0308}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E4}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0308}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0309}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0309}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0309}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0309}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0309}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0309}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{1EA3}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0309}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{1EA3}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0309}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{030A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{030A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{030A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{030A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{030A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{030A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{00E5}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{030A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E5}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{030A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{030B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{030B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{030B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{030B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{030B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{030B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{030B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{030B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{030B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{030B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{030C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{030C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{030C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{030C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{030C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{030C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{01CE}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{030C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{01CE}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{030C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{030D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{030D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{030D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{030D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{030D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{030D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{030D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{030D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{030D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{030D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{030E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{030E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{030E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{030E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{030E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{030E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{030E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{030E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{030E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{030E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{030F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{030F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{030F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{030F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{030F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{030F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0201}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{030F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0201}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{030F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0310}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0310}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0310}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0310}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0310}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0310}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0310}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0310}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0310}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0310}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0311}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0311}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0311}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0311}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0311}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0311}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0203}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0311}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0203}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0311}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0312}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0312}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0312}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0312}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0312}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0312}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0312}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0312}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0312}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0312}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0313}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0313}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0313}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0313}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0313}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0313}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0313}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0313}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0313}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0313}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0314}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0314}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0314}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0314}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0314}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0314}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0314}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0314}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0314}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0314}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035C}\u{0315}\u{0300}\u{0315}\u{0062}", - nfc: "\u{00E0}\u{0315}\u{0315}\u{035C}\u{0062}", - nfd: "\u{0061}\u{0300}\u{0315}\u{0315}\u{035C}\u{0062}", - nfkc: "\u{00E0}\u{0315}\u{0315}\u{035C}\u{0062}", - nfkd: "\u{0061}\u{0300}\u{0315}\u{0315}\u{035C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{035C}\u{0315}\u{0300}\u{0062}", - nfc: "\u{00E0}\u{0315}\u{0315}\u{035C}\u{0062}", - nfd: "\u{0061}\u{0300}\u{0315}\u{0315}\u{035C}\u{0062}", - nfkc: "\u{00E0}\u{0315}\u{0315}\u{035C}\u{0062}", - nfkd: "\u{0061}\u{0300}\u{0315}\u{0315}\u{035C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0316}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0316}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0317}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0317}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0317}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0317}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0317}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0317}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0317}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0317}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0317}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0317}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0318}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0318}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0318}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0318}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0318}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0318}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0318}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0318}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0318}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0318}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0319}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0319}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0319}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0319}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0319}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0319}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0319}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0319}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0319}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0319}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035C}\u{0315}\u{0300}\u{031A}\u{0062}", - nfc: "\u{00E0}\u{0315}\u{031A}\u{035C}\u{0062}", - nfd: "\u{0061}\u{0300}\u{0315}\u{031A}\u{035C}\u{0062}", - nfkc: "\u{00E0}\u{0315}\u{031A}\u{035C}\u{0062}", - nfkd: "\u{0061}\u{0300}\u{0315}\u{031A}\u{035C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{031A}\u{035C}\u{0315}\u{0300}\u{0062}", - nfc: "\u{00E0}\u{031A}\u{0315}\u{035C}\u{0062}", - nfd: "\u{0061}\u{0300}\u{031A}\u{0315}\u{035C}\u{0062}", - nfkc: "\u{00E0}\u{031A}\u{0315}\u{035C}\u{0062}", - nfkd: "\u{0061}\u{0300}\u{031A}\u{0315}\u{035C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{031B}\u{1DCE}\u{031B}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{031B}\u{302A}\u{031B}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{031C}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{031C}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{031C}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{031C}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{031C}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{031C}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{031C}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{031C}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{031C}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{031C}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{031D}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{031D}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{031D}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{031D}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{031D}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{031D}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{031D}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{031D}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{031D}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{031D}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{031E}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{031E}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{031E}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{031E}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{031E}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{031E}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{031E}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{031E}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{031E}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{031E}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{031F}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{031F}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{031F}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{031F}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{031F}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{031F}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{031F}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{031F}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{031F}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{031F}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0320}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0320}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0320}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0320}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0320}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0320}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0320}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0320}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0320}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0320}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCE}\u{0321}\u{0F74}\u{0321}\u{0062}", - nfc: "\u{0061}\u{0F74}\u{0321}\u{0321}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{0321}\u{0321}\u{1DCE}\u{0062}", - nfkc: "\u{0061}\u{0F74}\u{0321}\u{0321}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{0321}\u{0321}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0321}\u{1DCE}\u{0321}\u{0F74}\u{0062}", - nfc: "\u{0061}\u{0F74}\u{0321}\u{0321}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{0321}\u{0321}\u{1DCE}\u{0062}", - nfkc: "\u{0061}\u{0F74}\u{0321}\u{0321}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{0321}\u{0321}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCE}\u{0321}\u{0F74}\u{0322}\u{0062}", - nfc: "\u{0061}\u{0F74}\u{0321}\u{0322}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{0321}\u{0322}\u{1DCE}\u{0062}", - nfkc: "\u{0061}\u{0F74}\u{0321}\u{0322}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{0321}\u{0322}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0322}\u{1DCE}\u{0321}\u{0F74}\u{0062}", - nfc: "\u{0061}\u{0F74}\u{0322}\u{0321}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{0322}\u{0321}\u{1DCE}\u{0062}", - nfkc: "\u{0061}\u{0F74}\u{0322}\u{0321}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{0322}\u{0321}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0323}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0323}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0323}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0323}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0323}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0323}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{1EA1}\u{302A}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0323}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{1EA1}\u{302A}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0323}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0324}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0324}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0324}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0324}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0324}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0324}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0324}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0324}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0324}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0324}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0325}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0325}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0325}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0325}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0325}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0325}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{1E01}\u{302A}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0325}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{1E01}\u{302A}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0325}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0326}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0326}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0326}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0326}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0326}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0326}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0326}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0326}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0326}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0326}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCE}\u{0321}\u{0F74}\u{0327}\u{0062}", - nfc: "\u{0061}\u{0F74}\u{0321}\u{0327}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{0321}\u{0327}\u{1DCE}\u{0062}", - nfkc: "\u{0061}\u{0F74}\u{0321}\u{0327}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{0321}\u{0327}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0327}\u{1DCE}\u{0321}\u{0F74}\u{0062}", - nfc: "\u{0061}\u{0F74}\u{0327}\u{0321}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{0327}\u{0321}\u{1DCE}\u{0062}", - nfkc: "\u{0061}\u{0F74}\u{0327}\u{0321}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{0327}\u{0321}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCE}\u{0321}\u{0F74}\u{0328}\u{0062}", - nfc: "\u{0061}\u{0F74}\u{0321}\u{0328}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{0321}\u{0328}\u{1DCE}\u{0062}", - nfkc: "\u{0061}\u{0F74}\u{0321}\u{0328}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{0321}\u{0328}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0328}\u{1DCE}\u{0321}\u{0F74}\u{0062}", - nfc: "\u{0105}\u{0F74}\u{0321}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{0328}\u{0321}\u{1DCE}\u{0062}", - nfkc: "\u{0105}\u{0F74}\u{0321}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{0328}\u{0321}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0329}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0329}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0329}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0329}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0329}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0329}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0329}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0329}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0329}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0329}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{032A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{032A}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{032A}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{032A}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{032A}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{032A}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{032A}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{032A}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{032A}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{032A}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{032B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{032B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{032B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{032B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{032B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{032B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{032B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{032B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{032B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{032B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{032C}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{032C}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{032C}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{032C}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{032C}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{032C}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{032C}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{032C}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{032C}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{032C}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{032D}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{032D}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{032D}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{032D}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{032D}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{032D}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{032D}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{032D}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{032D}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{032D}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{032E}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{032E}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{032E}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{032E}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{032E}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{032E}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{032E}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{032E}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{032E}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{032E}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{032F}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{032F}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{032F}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{032F}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{032F}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{032F}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{032F}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{032F}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{032F}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{032F}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0330}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0330}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0330}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0330}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0330}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0330}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0330}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0330}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0330}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0330}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0331}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0331}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0331}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0331}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0331}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0331}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0331}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0331}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0331}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0331}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0332}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0332}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0332}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0332}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0332}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0332}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0332}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0332}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0332}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0332}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0333}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0333}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0333}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0333}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0333}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0333}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0333}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0333}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0333}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0333}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0334}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{0335}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0335}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0335}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0335}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0335}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0335}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0335}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0335}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0335}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0335}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{0336}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0336}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0336}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0336}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0336}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0336}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0336}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0336}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0336}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0336}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{0337}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0337}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0337}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0337}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0337}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0337}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0337}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0337}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0337}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0337}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{0338}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0338}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0338}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0338}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0338}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0338}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0338}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0338}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0338}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0338}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0339}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0339}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0339}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0339}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0339}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0339}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0339}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0339}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0339}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0339}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{033A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{033A}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{033A}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{033A}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{033A}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{033A}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{033A}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{033A}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{033A}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{033A}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{033B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{033B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{033B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{033B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{033B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{033B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{033B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{033B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{033B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{033B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{033C}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{033C}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{033C}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{033C}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{033C}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{033C}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{033C}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{033C}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{033C}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{033C}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{033D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{033D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{033D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{033D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{033D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{033D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{033D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{033D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{033D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{033D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{033E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{033E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{033E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{033E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{033E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{033E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{033E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{033E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{033E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{033E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{033F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{033F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{033F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{033F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{033F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{033F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{033F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{033F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{033F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{033F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0340}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0340}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0341}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0301}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0301}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0301}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0301}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0341}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{00E1}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0301}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E1}\u{05AE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0301}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0342}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0342}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0342}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0342}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0342}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0342}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0342}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0342}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0342}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0342}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0343}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0313}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0313}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0313}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0313}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0343}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0313}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0313}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0313}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0313}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0344}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0308}\u{0301}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0308}\u{0301}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0308}\u{0301}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0308}\u{0301}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0344}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{00E4}\u{05AE}\u{0301}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0308}\u{0301}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{00E4}\u{05AE}\u{0301}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0308}\u{0301}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0345}\u{035D}\u{0345}\u{0062}", - nfc: "\u{0061}\u{035D}\u{0345}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035D}\u{0345}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035D}\u{0345}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035D}\u{0345}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0345}\u{0345}\u{035D}\u{0062}", - nfc: "\u{0061}\u{035D}\u{0345}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035D}\u{0345}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035D}\u{0345}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035D}\u{0345}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0346}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0346}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0346}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0346}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0346}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0346}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0346}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0346}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0346}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0346}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0347}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0347}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0347}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0347}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0347}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0347}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0347}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0347}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0347}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0347}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0348}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0348}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0348}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0348}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0348}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0348}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0348}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0348}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0348}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0348}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0349}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0349}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0349}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0349}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0349}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0349}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0349}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0349}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0349}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0349}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{034A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{034A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{034A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{034A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{034A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{034A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{034A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{034A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{034A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{034A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{034B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{034B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{034B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{034B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{034B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{034B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{034B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{034B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{034B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{034B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{034C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{034C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{034C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{034C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{034C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{034C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{034C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{034C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{034C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{034C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{034D}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{034D}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{034D}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{034D}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{034D}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{034D}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{034D}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{034D}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{034D}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{034D}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{034E}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{034E}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{034E}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{034E}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{034E}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{034E}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{034E}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{034E}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{034E}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{034E}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0350}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0350}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0350}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0350}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0350}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0350}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0350}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0350}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0350}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0350}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0351}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0351}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0351}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0351}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0351}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0351}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0351}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0351}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0351}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0351}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0352}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0352}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0352}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0352}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0352}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0352}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0352}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0352}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0352}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0352}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0353}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0353}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0353}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0353}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0353}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0353}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0353}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0353}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0353}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0353}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0354}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0354}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0354}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0354}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0354}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0354}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0354}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0354}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0354}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0354}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0355}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0355}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0355}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0355}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0355}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0355}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0355}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0355}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0355}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0355}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0356}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0356}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0356}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0356}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0356}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0356}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0356}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0356}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0356}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0356}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0357}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0357}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0357}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0357}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0357}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0357}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0357}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0357}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0357}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0357}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035C}\u{0315}\u{0300}\u{0358}\u{0062}", - nfc: "\u{00E0}\u{0315}\u{0358}\u{035C}\u{0062}", - nfd: "\u{0061}\u{0300}\u{0315}\u{0358}\u{035C}\u{0062}", - nfkc: "\u{00E0}\u{0315}\u{0358}\u{035C}\u{0062}", - nfkd: "\u{0061}\u{0300}\u{0315}\u{0358}\u{035C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0358}\u{035C}\u{0315}\u{0300}\u{0062}", - nfc: "\u{00E0}\u{0358}\u{0315}\u{035C}\u{0062}", - nfd: "\u{0061}\u{0300}\u{0358}\u{0315}\u{035C}\u{0062}", - nfkc: "\u{00E0}\u{0358}\u{0315}\u{035C}\u{0062}", - nfkd: "\u{0061}\u{0300}\u{0358}\u{0315}\u{035C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0359}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0359}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0359}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0359}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0359}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0359}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0359}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0359}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0359}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0359}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{035A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{035A}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{035A}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{035A}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{035A}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035A}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{035A}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{035A}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{035A}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{035A}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{035B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{035B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{035B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{035B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{035B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{035B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{035B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{035B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{035B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035D}\u{035C}\u{0315}\u{035C}\u{0062}", - nfc: "\u{0061}\u{0315}\u{035C}\u{035C}\u{035D}\u{0062}", - nfd: "\u{0061}\u{0315}\u{035C}\u{035C}\u{035D}\u{0062}", - nfkc: "\u{0061}\u{0315}\u{035C}\u{035C}\u{035D}\u{0062}", - nfkd: "\u{0061}\u{0315}\u{035C}\u{035C}\u{035D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035C}\u{035D}\u{035C}\u{0315}\u{0062}", - nfc: "\u{0061}\u{0315}\u{035C}\u{035C}\u{035D}\u{0062}", - nfd: "\u{0061}\u{0315}\u{035C}\u{035C}\u{035D}\u{0062}", - nfkc: "\u{0061}\u{0315}\u{035C}\u{035C}\u{035D}\u{0062}", - nfkd: "\u{0061}\u{0315}\u{035C}\u{035C}\u{035D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0345}\u{035D}\u{035C}\u{035D}\u{0062}", - nfc: "\u{0061}\u{035C}\u{035D}\u{035D}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{035D}\u{035D}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{035D}\u{035D}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{035D}\u{035D}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035D}\u{0345}\u{035D}\u{035C}\u{0062}", - nfc: "\u{0061}\u{035C}\u{035D}\u{035D}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{035D}\u{035D}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{035D}\u{035D}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{035D}\u{035D}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0345}\u{035D}\u{035C}\u{035E}\u{0062}", - nfc: "\u{0061}\u{035C}\u{035D}\u{035E}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{035D}\u{035E}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{035D}\u{035E}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{035D}\u{035E}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035E}\u{0345}\u{035D}\u{035C}\u{0062}", - nfc: "\u{0061}\u{035C}\u{035E}\u{035D}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{035E}\u{035D}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{035E}\u{035D}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{035E}\u{035D}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035D}\u{035C}\u{0315}\u{035F}\u{0062}", - nfc: "\u{0061}\u{0315}\u{035C}\u{035F}\u{035D}\u{0062}", - nfd: "\u{0061}\u{0315}\u{035C}\u{035F}\u{035D}\u{0062}", - nfkc: "\u{0061}\u{0315}\u{035C}\u{035F}\u{035D}\u{0062}", - nfkd: "\u{0061}\u{0315}\u{035C}\u{035F}\u{035D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035F}\u{035D}\u{035C}\u{0315}\u{0062}", - nfc: "\u{0061}\u{0315}\u{035F}\u{035C}\u{035D}\u{0062}", - nfd: "\u{0061}\u{0315}\u{035F}\u{035C}\u{035D}\u{0062}", - nfkc: "\u{0061}\u{0315}\u{035F}\u{035C}\u{035D}\u{0062}", - nfkd: "\u{0061}\u{0315}\u{035F}\u{035C}\u{035D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0345}\u{035D}\u{035C}\u{0360}\u{0062}", - nfc: "\u{0061}\u{035C}\u{035D}\u{0360}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{035D}\u{0360}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{035D}\u{0360}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{035D}\u{0360}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0360}\u{0345}\u{035D}\u{035C}\u{0062}", - nfc: "\u{0061}\u{035C}\u{0360}\u{035D}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{0360}\u{035D}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{0360}\u{035D}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{0360}\u{035D}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0345}\u{035D}\u{035C}\u{0361}\u{0062}", - nfc: "\u{0061}\u{035C}\u{035D}\u{0361}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{035D}\u{0361}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{035D}\u{0361}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{035D}\u{0361}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0361}\u{0345}\u{035D}\u{035C}\u{0062}", - nfc: "\u{0061}\u{035C}\u{0361}\u{035D}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{0361}\u{035D}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{0361}\u{035D}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{0361}\u{035D}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035D}\u{035C}\u{0315}\u{0362}\u{0062}", - nfc: "\u{0061}\u{0315}\u{035C}\u{0362}\u{035D}\u{0062}", - nfd: "\u{0061}\u{0315}\u{035C}\u{0362}\u{035D}\u{0062}", - nfkc: "\u{0061}\u{0315}\u{035C}\u{0362}\u{035D}\u{0062}", - nfkd: "\u{0061}\u{0315}\u{035C}\u{0362}\u{035D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0362}\u{035D}\u{035C}\u{0315}\u{0062}", - nfc: "\u{0061}\u{0315}\u{0362}\u{035C}\u{035D}\u{0062}", - nfd: "\u{0061}\u{0315}\u{0362}\u{035C}\u{035D}\u{0062}", - nfkc: "\u{0061}\u{0315}\u{0362}\u{035C}\u{035D}\u{0062}", - nfkd: "\u{0061}\u{0315}\u{0362}\u{035C}\u{035D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0363}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0363}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0363}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0363}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0363}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0363}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0363}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0363}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0363}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0363}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0364}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0364}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0364}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0364}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0364}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0364}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0364}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0364}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0364}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0364}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0365}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0365}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0365}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0365}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0365}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0365}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0365}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0365}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0365}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0365}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0366}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0366}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0366}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0366}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0366}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0366}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0366}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0366}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0366}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0366}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0367}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0367}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0367}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0367}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0367}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0367}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0367}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0367}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0367}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0367}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0368}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0368}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0368}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0368}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0368}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0368}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0368}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0368}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0368}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0368}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0369}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0369}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0369}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0369}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0369}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0369}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0369}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0369}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0369}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0369}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{036A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{036A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{036A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{036A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{036A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{036A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{036A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{036A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{036A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{036A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{036B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{036B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{036B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{036B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{036B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{036B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{036B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{036B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{036B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{036B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{036C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{036C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{036C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{036C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{036C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{036C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{036C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{036C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{036C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{036C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{036D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{036D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{036D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{036D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{036D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{036D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{036D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{036D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{036D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{036D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{036E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{036E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{036E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{036E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{036E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{036E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{036E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{036E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{036E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{036E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{036F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{036F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{036F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{036F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{036F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{036F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{036F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{036F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{036F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{036F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0483}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0483}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0483}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0483}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0483}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0483}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0483}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0483}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0483}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0483}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0484}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0484}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0484}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0484}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0484}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0484}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0484}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0484}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0484}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0484}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0485}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0485}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0485}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0485}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0485}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0485}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0485}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0485}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0485}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0485}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0486}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0486}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0486}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0486}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0486}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0486}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0486}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0486}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0486}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0486}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0487}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0487}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0487}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0487}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0487}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0487}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0487}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0487}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0487}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0487}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0591}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0591}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0591}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0591}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0591}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0591}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0591}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0591}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0591}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0591}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0592}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0592}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0592}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0592}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0592}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0592}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0592}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0592}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0592}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0592}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0593}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0593}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0593}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0593}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0593}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0593}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0593}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0593}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0593}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0593}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0594}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0594}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0594}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0594}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0594}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0594}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0594}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0594}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0594}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0594}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0595}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0595}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0595}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0595}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0595}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0595}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0595}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0595}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0595}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0595}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0596}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0596}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0596}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0596}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0596}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0596}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0596}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0596}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0596}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0596}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0597}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0597}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0597}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0597}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0597}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0597}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0597}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0597}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0597}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0597}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0598}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0598}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0598}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0598}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0598}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0598}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0598}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0598}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0598}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0598}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0599}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0599}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0599}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0599}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0599}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0599}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0599}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0599}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0599}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0599}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302E}\u{059A}\u{0316}\u{059A}\u{0062}", - nfc: "\u{0061}\u{0316}\u{059A}\u{059A}\u{302E}\u{0062}", - nfd: "\u{0061}\u{0316}\u{059A}\u{059A}\u{302E}\u{0062}", - nfkc: "\u{0061}\u{0316}\u{059A}\u{059A}\u{302E}\u{0062}", - nfkd: "\u{0061}\u{0316}\u{059A}\u{059A}\u{302E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{302E}\u{059A}\u{0316}\u{0062}", - nfc: "\u{0061}\u{0316}\u{059A}\u{059A}\u{302E}\u{0062}", - nfd: "\u{0061}\u{0316}\u{059A}\u{059A}\u{302E}\u{0062}", - nfkc: "\u{0061}\u{0316}\u{059A}\u{059A}\u{302E}\u{0062}", - nfkd: "\u{0061}\u{0316}\u{059A}\u{059A}\u{302E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{059B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{059B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{059B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{059B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{059B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{059B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{059B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{059B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{059B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{059C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{059C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{059C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{059C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{059C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{059C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{059C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{059C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{059C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{059D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{059D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{059D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{059D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{059D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{059D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{059D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{059D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{059D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{059E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{059E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{059E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{059E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{059E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{059E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{059E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{059E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{059E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{059F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{059F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{059F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{059F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{059F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{059F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{059F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{059F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{059F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{05A0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{05A0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{05A0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{05A0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{05A0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{05A0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{05A0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{05A0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{05A0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{05A1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{05A1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{05A1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{05A1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{05A1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{05A1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{05A1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{05A1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{05A1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{05A2}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{05A2}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{05A2}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{05A2}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{05A2}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A2}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{05A2}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{05A2}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{05A2}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{05A2}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{05A3}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{05A3}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{05A3}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{05A3}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{05A3}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A3}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{05A3}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{05A3}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{05A3}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{05A3}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{05A4}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{05A4}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{05A4}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{05A4}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{05A4}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A4}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{05A4}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{05A4}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{05A4}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{05A4}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{05A5}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{05A5}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{05A5}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{05A5}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{05A5}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A5}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{05A5}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{05A5}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{05A5}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{05A5}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{05A6}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{05A6}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{05A6}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{05A6}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{05A6}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A6}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{05A6}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{05A6}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{05A6}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{05A6}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{05A7}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{05A7}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{05A7}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{05A7}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{05A7}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A7}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{05A7}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{05A7}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{05A7}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{05A7}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{05A8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{05A8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{05A8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{05A8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{05A8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{05A8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{05A8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{05A8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{05A8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{05A9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{05A9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{05A9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{05A9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{05A9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05A9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{05A9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{05A9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{05A9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{05A9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{05AA}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{05AA}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{05AA}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{05AA}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{05AA}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05AA}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{05AA}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{05AA}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{05AA}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{05AA}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{05AB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{05AB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{05AB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{05AB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{05AB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05AB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{05AB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{05AB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{05AB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{05AB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{05AC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{05AC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{05AC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{05AC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{05AC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05AC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{05AC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{05AC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{05AC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{05AC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302E}\u{059A}\u{0316}\u{05AD}\u{0062}", - nfc: "\u{0061}\u{0316}\u{059A}\u{05AD}\u{302E}\u{0062}", - nfd: "\u{0061}\u{0316}\u{059A}\u{05AD}\u{302E}\u{0062}", - nfkc: "\u{0061}\u{0316}\u{059A}\u{05AD}\u{302E}\u{0062}", - nfkd: "\u{0061}\u{0316}\u{059A}\u{05AD}\u{302E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05AD}\u{302E}\u{059A}\u{0316}\u{0062}", - nfc: "\u{0061}\u{0316}\u{05AD}\u{059A}\u{302E}\u{0062}", - nfd: "\u{0061}\u{0316}\u{05AD}\u{059A}\u{302E}\u{0062}", - nfkc: "\u{0061}\u{0316}\u{05AD}\u{059A}\u{302E}\u{0062}", - nfkd: "\u{0061}\u{0316}\u{05AD}\u{059A}\u{302E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0300}\u{05AE}\u{1D16D}\u{05AE}\u{0062}", - nfc: "\u{00E0}\u{1D16D}\u{05AE}\u{05AE}\u{0062}", - nfd: "\u{0061}\u{1D16D}\u{05AE}\u{05AE}\u{0300}\u{0062}", - nfkc: "\u{00E0}\u{1D16D}\u{05AE}\u{05AE}\u{0062}", - nfkd: "\u{0061}\u{1D16D}\u{05AE}\u{05AE}\u{0300}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05AE}\u{0300}\u{05AE}\u{1D16D}\u{0062}", - nfc: "\u{00E0}\u{1D16D}\u{05AE}\u{05AE}\u{0062}", - nfd: "\u{0061}\u{1D16D}\u{05AE}\u{05AE}\u{0300}\u{0062}", - nfkc: "\u{00E0}\u{1D16D}\u{05AE}\u{05AE}\u{0062}", - nfkd: "\u{0061}\u{1D16D}\u{05AE}\u{05AE}\u{0300}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{05AF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{05AF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{05AF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{05AF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{05AF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05AF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{05AF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{05AF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{05AF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{05AF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B1}\u{05B0}\u{094D}\u{05B0}\u{0062}", - nfc: "\u{0061}\u{094D}\u{05B0}\u{05B0}\u{05B1}\u{0062}", - nfd: "\u{0061}\u{094D}\u{05B0}\u{05B0}\u{05B1}\u{0062}", - nfkc: "\u{0061}\u{094D}\u{05B0}\u{05B0}\u{05B1}\u{0062}", - nfkd: "\u{0061}\u{094D}\u{05B0}\u{05B0}\u{05B1}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{05B1}\u{05B0}\u{094D}\u{0062}", - nfc: "\u{0061}\u{094D}\u{05B0}\u{05B0}\u{05B1}\u{0062}", - nfd: "\u{0061}\u{094D}\u{05B0}\u{05B0}\u{05B1}\u{0062}", - nfkc: "\u{0061}\u{094D}\u{05B0}\u{05B0}\u{05B1}\u{0062}", - nfkd: "\u{0061}\u{094D}\u{05B0}\u{05B0}\u{05B1}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B2}\u{05B1}\u{05B0}\u{05B1}\u{0062}", - nfc: "\u{0061}\u{05B0}\u{05B1}\u{05B1}\u{05B2}\u{0062}", - nfd: "\u{0061}\u{05B0}\u{05B1}\u{05B1}\u{05B2}\u{0062}", - nfkc: "\u{0061}\u{05B0}\u{05B1}\u{05B1}\u{05B2}\u{0062}", - nfkd: "\u{0061}\u{05B0}\u{05B1}\u{05B1}\u{05B2}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B1}\u{05B2}\u{05B1}\u{05B0}\u{0062}", - nfc: "\u{0061}\u{05B0}\u{05B1}\u{05B1}\u{05B2}\u{0062}", - nfd: "\u{0061}\u{05B0}\u{05B1}\u{05B1}\u{05B2}\u{0062}", - nfkc: "\u{0061}\u{05B0}\u{05B1}\u{05B1}\u{05B2}\u{0062}", - nfkd: "\u{0061}\u{05B0}\u{05B1}\u{05B1}\u{05B2}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B3}\u{05B2}\u{05B1}\u{05B2}\u{0062}", - nfc: "\u{0061}\u{05B1}\u{05B2}\u{05B2}\u{05B3}\u{0062}", - nfd: "\u{0061}\u{05B1}\u{05B2}\u{05B2}\u{05B3}\u{0062}", - nfkc: "\u{0061}\u{05B1}\u{05B2}\u{05B2}\u{05B3}\u{0062}", - nfkd: "\u{0061}\u{05B1}\u{05B2}\u{05B2}\u{05B3}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B2}\u{05B3}\u{05B2}\u{05B1}\u{0062}", - nfc: "\u{0061}\u{05B1}\u{05B2}\u{05B2}\u{05B3}\u{0062}", - nfd: "\u{0061}\u{05B1}\u{05B2}\u{05B2}\u{05B3}\u{0062}", - nfkc: "\u{0061}\u{05B1}\u{05B2}\u{05B2}\u{05B3}\u{0062}", - nfkd: "\u{0061}\u{05B1}\u{05B2}\u{05B2}\u{05B3}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B4}\u{05B3}\u{05B2}\u{05B3}\u{0062}", - nfc: "\u{0061}\u{05B2}\u{05B3}\u{05B3}\u{05B4}\u{0062}", - nfd: "\u{0061}\u{05B2}\u{05B3}\u{05B3}\u{05B4}\u{0062}", - nfkc: "\u{0061}\u{05B2}\u{05B3}\u{05B3}\u{05B4}\u{0062}", - nfkd: "\u{0061}\u{05B2}\u{05B3}\u{05B3}\u{05B4}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B3}\u{05B4}\u{05B3}\u{05B2}\u{0062}", - nfc: "\u{0061}\u{05B2}\u{05B3}\u{05B3}\u{05B4}\u{0062}", - nfd: "\u{0061}\u{05B2}\u{05B3}\u{05B3}\u{05B4}\u{0062}", - nfkc: "\u{0061}\u{05B2}\u{05B3}\u{05B3}\u{05B4}\u{0062}", - nfkd: "\u{0061}\u{05B2}\u{05B3}\u{05B3}\u{05B4}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B5}\u{05B4}\u{05B3}\u{05B4}\u{0062}", - nfc: "\u{0061}\u{05B3}\u{05B4}\u{05B4}\u{05B5}\u{0062}", - nfd: "\u{0061}\u{05B3}\u{05B4}\u{05B4}\u{05B5}\u{0062}", - nfkc: "\u{0061}\u{05B3}\u{05B4}\u{05B4}\u{05B5}\u{0062}", - nfkd: "\u{0061}\u{05B3}\u{05B4}\u{05B4}\u{05B5}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B4}\u{05B5}\u{05B4}\u{05B3}\u{0062}", - nfc: "\u{0061}\u{05B3}\u{05B4}\u{05B4}\u{05B5}\u{0062}", - nfd: "\u{0061}\u{05B3}\u{05B4}\u{05B4}\u{05B5}\u{0062}", - nfkc: "\u{0061}\u{05B3}\u{05B4}\u{05B4}\u{05B5}\u{0062}", - nfkd: "\u{0061}\u{05B3}\u{05B4}\u{05B4}\u{05B5}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B6}\u{05B5}\u{05B4}\u{05B5}\u{0062}", - nfc: "\u{0061}\u{05B4}\u{05B5}\u{05B5}\u{05B6}\u{0062}", - nfd: "\u{0061}\u{05B4}\u{05B5}\u{05B5}\u{05B6}\u{0062}", - nfkc: "\u{0061}\u{05B4}\u{05B5}\u{05B5}\u{05B6}\u{0062}", - nfkd: "\u{0061}\u{05B4}\u{05B5}\u{05B5}\u{05B6}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B5}\u{05B6}\u{05B5}\u{05B4}\u{0062}", - nfc: "\u{0061}\u{05B4}\u{05B5}\u{05B5}\u{05B6}\u{0062}", - nfd: "\u{0061}\u{05B4}\u{05B5}\u{05B5}\u{05B6}\u{0062}", - nfkc: "\u{0061}\u{05B4}\u{05B5}\u{05B5}\u{05B6}\u{0062}", - nfkd: "\u{0061}\u{05B4}\u{05B5}\u{05B5}\u{05B6}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B7}\u{05B6}\u{05B5}\u{05B6}\u{0062}", - nfc: "\u{0061}\u{05B5}\u{05B6}\u{05B6}\u{05B7}\u{0062}", - nfd: "\u{0061}\u{05B5}\u{05B6}\u{05B6}\u{05B7}\u{0062}", - nfkc: "\u{0061}\u{05B5}\u{05B6}\u{05B6}\u{05B7}\u{0062}", - nfkd: "\u{0061}\u{05B5}\u{05B6}\u{05B6}\u{05B7}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B6}\u{05B7}\u{05B6}\u{05B5}\u{0062}", - nfc: "\u{0061}\u{05B5}\u{05B6}\u{05B6}\u{05B7}\u{0062}", - nfd: "\u{0061}\u{05B5}\u{05B6}\u{05B6}\u{05B7}\u{0062}", - nfkc: "\u{0061}\u{05B5}\u{05B6}\u{05B6}\u{05B7}\u{0062}", - nfkd: "\u{0061}\u{05B5}\u{05B6}\u{05B6}\u{05B7}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B8}\u{05B7}\u{05B6}\u{05B7}\u{0062}", - nfc: "\u{0061}\u{05B6}\u{05B7}\u{05B7}\u{05B8}\u{0062}", - nfd: "\u{0061}\u{05B6}\u{05B7}\u{05B7}\u{05B8}\u{0062}", - nfkc: "\u{0061}\u{05B6}\u{05B7}\u{05B7}\u{05B8}\u{0062}", - nfkd: "\u{0061}\u{05B6}\u{05B7}\u{05B7}\u{05B8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B7}\u{05B8}\u{05B7}\u{05B6}\u{0062}", - nfc: "\u{0061}\u{05B6}\u{05B7}\u{05B7}\u{05B8}\u{0062}", - nfd: "\u{0061}\u{05B6}\u{05B7}\u{05B7}\u{05B8}\u{0062}", - nfkc: "\u{0061}\u{05B6}\u{05B7}\u{05B7}\u{05B8}\u{0062}", - nfkd: "\u{0061}\u{05B6}\u{05B7}\u{05B7}\u{05B8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B9}\u{05B8}\u{05B7}\u{05B8}\u{0062}", - nfc: "\u{0061}\u{05B7}\u{05B8}\u{05B8}\u{05B9}\u{0062}", - nfd: "\u{0061}\u{05B7}\u{05B8}\u{05B8}\u{05B9}\u{0062}", - nfkc: "\u{0061}\u{05B7}\u{05B8}\u{05B8}\u{05B9}\u{0062}", - nfkd: "\u{0061}\u{05B7}\u{05B8}\u{05B8}\u{05B9}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B8}\u{05B9}\u{05B8}\u{05B7}\u{0062}", - nfc: "\u{0061}\u{05B7}\u{05B8}\u{05B8}\u{05B9}\u{0062}", - nfd: "\u{0061}\u{05B7}\u{05B8}\u{05B8}\u{05B9}\u{0062}", - nfkc: "\u{0061}\u{05B7}\u{05B8}\u{05B8}\u{05B9}\u{0062}", - nfkd: "\u{0061}\u{05B7}\u{05B8}\u{05B8}\u{05B9}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BB}\u{05B9}\u{05B8}\u{05B9}\u{0062}", - nfc: "\u{0061}\u{05B8}\u{05B9}\u{05B9}\u{05BB}\u{0062}", - nfd: "\u{0061}\u{05B8}\u{05B9}\u{05B9}\u{05BB}\u{0062}", - nfkc: "\u{0061}\u{05B8}\u{05B9}\u{05B9}\u{05BB}\u{0062}", - nfkd: "\u{0061}\u{05B8}\u{05B9}\u{05B9}\u{05BB}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B9}\u{05BB}\u{05B9}\u{05B8}\u{0062}", - nfc: "\u{0061}\u{05B8}\u{05B9}\u{05B9}\u{05BB}\u{0062}", - nfd: "\u{0061}\u{05B8}\u{05B9}\u{05B9}\u{05BB}\u{0062}", - nfkc: "\u{0061}\u{05B8}\u{05B9}\u{05B9}\u{05BB}\u{0062}", - nfkd: "\u{0061}\u{05B8}\u{05B9}\u{05B9}\u{05BB}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BB}\u{05B9}\u{05B8}\u{05BA}\u{0062}", - nfc: "\u{0061}\u{05B8}\u{05B9}\u{05BA}\u{05BB}\u{0062}", - nfd: "\u{0061}\u{05B8}\u{05B9}\u{05BA}\u{05BB}\u{0062}", - nfkc: "\u{0061}\u{05B8}\u{05B9}\u{05BA}\u{05BB}\u{0062}", - nfkd: "\u{0061}\u{05B8}\u{05B9}\u{05BA}\u{05BB}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BA}\u{05BB}\u{05B9}\u{05B8}\u{0062}", - nfc: "\u{0061}\u{05B8}\u{05BA}\u{05B9}\u{05BB}\u{0062}", - nfd: "\u{0061}\u{05B8}\u{05BA}\u{05B9}\u{05BB}\u{0062}", - nfkc: "\u{0061}\u{05B8}\u{05BA}\u{05B9}\u{05BB}\u{0062}", - nfkd: "\u{0061}\u{05B8}\u{05BA}\u{05B9}\u{05BB}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BC}\u{05BB}\u{05B9}\u{05BB}\u{0062}", - nfc: "\u{0061}\u{05B9}\u{05BB}\u{05BB}\u{05BC}\u{0062}", - nfd: "\u{0061}\u{05B9}\u{05BB}\u{05BB}\u{05BC}\u{0062}", - nfkc: "\u{0061}\u{05B9}\u{05BB}\u{05BB}\u{05BC}\u{0062}", - nfkd: "\u{0061}\u{05B9}\u{05BB}\u{05BB}\u{05BC}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BB}\u{05BC}\u{05BB}\u{05B9}\u{0062}", - nfc: "\u{0061}\u{05B9}\u{05BB}\u{05BB}\u{05BC}\u{0062}", - nfd: "\u{0061}\u{05B9}\u{05BB}\u{05BB}\u{05BC}\u{0062}", - nfkc: "\u{0061}\u{05B9}\u{05BB}\u{05BB}\u{05BC}\u{0062}", - nfkd: "\u{0061}\u{05B9}\u{05BB}\u{05BB}\u{05BC}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BD}\u{05BC}\u{05BB}\u{05BC}\u{0062}", - nfc: "\u{0061}\u{05BB}\u{05BC}\u{05BC}\u{05BD}\u{0062}", - nfd: "\u{0061}\u{05BB}\u{05BC}\u{05BC}\u{05BD}\u{0062}", - nfkc: "\u{0061}\u{05BB}\u{05BC}\u{05BC}\u{05BD}\u{0062}", - nfkd: "\u{0061}\u{05BB}\u{05BC}\u{05BC}\u{05BD}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BC}\u{05BD}\u{05BC}\u{05BB}\u{0062}", - nfc: "\u{0061}\u{05BB}\u{05BC}\u{05BC}\u{05BD}\u{0062}", - nfd: "\u{0061}\u{05BB}\u{05BC}\u{05BC}\u{05BD}\u{0062}", - nfkc: "\u{0061}\u{05BB}\u{05BC}\u{05BC}\u{05BD}\u{0062}", - nfkd: "\u{0061}\u{05BB}\u{05BC}\u{05BC}\u{05BD}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BF}\u{05BD}\u{05BC}\u{05BD}\u{0062}", - nfc: "\u{0061}\u{05BC}\u{05BD}\u{05BD}\u{05BF}\u{0062}", - nfd: "\u{0061}\u{05BC}\u{05BD}\u{05BD}\u{05BF}\u{0062}", - nfkc: "\u{0061}\u{05BC}\u{05BD}\u{05BD}\u{05BF}\u{0062}", - nfkd: "\u{0061}\u{05BC}\u{05BD}\u{05BD}\u{05BF}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BD}\u{05BF}\u{05BD}\u{05BC}\u{0062}", - nfc: "\u{0061}\u{05BC}\u{05BD}\u{05BD}\u{05BF}\u{0062}", - nfd: "\u{0061}\u{05BC}\u{05BD}\u{05BD}\u{05BF}\u{0062}", - nfkc: "\u{0061}\u{05BC}\u{05BD}\u{05BD}\u{05BF}\u{0062}", - nfkd: "\u{0061}\u{05BC}\u{05BD}\u{05BD}\u{05BF}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05C1}\u{05BF}\u{05BD}\u{05BF}\u{0062}", - nfc: "\u{0061}\u{05BD}\u{05BF}\u{05BF}\u{05C1}\u{0062}", - nfd: "\u{0061}\u{05BD}\u{05BF}\u{05BF}\u{05C1}\u{0062}", - nfkc: "\u{0061}\u{05BD}\u{05BF}\u{05BF}\u{05C1}\u{0062}", - nfkd: "\u{0061}\u{05BD}\u{05BF}\u{05BF}\u{05C1}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05BF}\u{05C1}\u{05BF}\u{05BD}\u{0062}", - nfc: "\u{0061}\u{05BD}\u{05BF}\u{05BF}\u{05C1}\u{0062}", - nfd: "\u{0061}\u{05BD}\u{05BF}\u{05BF}\u{05C1}\u{0062}", - nfkc: "\u{0061}\u{05BD}\u{05BF}\u{05BF}\u{05C1}\u{0062}", - nfkd: "\u{0061}\u{05BD}\u{05BF}\u{05BF}\u{05C1}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05C2}\u{05C1}\u{05BF}\u{05C1}\u{0062}", - nfc: "\u{0061}\u{05BF}\u{05C1}\u{05C1}\u{05C2}\u{0062}", - nfd: "\u{0061}\u{05BF}\u{05C1}\u{05C1}\u{05C2}\u{0062}", - nfkc: "\u{0061}\u{05BF}\u{05C1}\u{05C1}\u{05C2}\u{0062}", - nfkd: "\u{0061}\u{05BF}\u{05C1}\u{05C1}\u{05C2}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05C1}\u{05C2}\u{05C1}\u{05BF}\u{0062}", - nfc: "\u{0061}\u{05BF}\u{05C1}\u{05C1}\u{05C2}\u{0062}", - nfd: "\u{0061}\u{05BF}\u{05C1}\u{05C1}\u{05C2}\u{0062}", - nfkc: "\u{0061}\u{05BF}\u{05C1}\u{05C1}\u{05C2}\u{0062}", - nfkd: "\u{0061}\u{05BF}\u{05C1}\u{05C1}\u{05C2}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FB1E}\u{05C2}\u{05C1}\u{05C2}\u{0062}", - nfc: "\u{0061}\u{05C1}\u{05C2}\u{05C2}\u{FB1E}\u{0062}", - nfd: "\u{0061}\u{05C1}\u{05C2}\u{05C2}\u{FB1E}\u{0062}", - nfkc: "\u{0061}\u{05C1}\u{05C2}\u{05C2}\u{FB1E}\u{0062}", - nfkd: "\u{0061}\u{05C1}\u{05C2}\u{05C2}\u{FB1E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05C2}\u{FB1E}\u{05C2}\u{05C1}\u{0062}", - nfc: "\u{0061}\u{05C1}\u{05C2}\u{05C2}\u{FB1E}\u{0062}", - nfd: "\u{0061}\u{05C1}\u{05C2}\u{05C2}\u{FB1E}\u{0062}", - nfkc: "\u{0061}\u{05C1}\u{05C2}\u{05C2}\u{FB1E}\u{0062}", - nfkd: "\u{0061}\u{05C1}\u{05C2}\u{05C2}\u{FB1E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{05C4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{05C4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{05C4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{05C4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{05C4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05C4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{05C4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{05C4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{05C4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{05C4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{05C5}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{05C5}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{05C5}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{05C5}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{05C5}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05C5}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{05C5}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{05C5}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{05C5}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{05C5}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B9}\u{05B8}\u{05B7}\u{05C7}\u{0062}", - nfc: "\u{0061}\u{05B7}\u{05B8}\u{05C7}\u{05B9}\u{0062}", - nfd: "\u{0061}\u{05B7}\u{05B8}\u{05C7}\u{05B9}\u{0062}", - nfkc: "\u{0061}\u{05B7}\u{05B8}\u{05C7}\u{05B9}\u{0062}", - nfkd: "\u{0061}\u{05B7}\u{05B8}\u{05C7}\u{05B9}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05C7}\u{05B9}\u{05B8}\u{05B7}\u{0062}", - nfc: "\u{0061}\u{05B7}\u{05C7}\u{05B8}\u{05B9}\u{0062}", - nfd: "\u{0061}\u{05B7}\u{05C7}\u{05B8}\u{05B9}\u{0062}", - nfkc: "\u{0061}\u{05B7}\u{05C7}\u{05B8}\u{05B9}\u{0062}", - nfkd: "\u{0061}\u{05B7}\u{05C7}\u{05B8}\u{05B9}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0610}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0610}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0610}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0610}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0610}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0610}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0610}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0610}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0610}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0610}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0611}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0611}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0611}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0611}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0611}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0611}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0611}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0611}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0611}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0611}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0612}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0612}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0612}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0612}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0612}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0612}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0612}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0612}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0612}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0612}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0613}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0613}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0613}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0613}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0613}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0613}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0613}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0613}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0613}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0613}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0614}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0614}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0614}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0614}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0614}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0614}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0614}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0614}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0614}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0614}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0615}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0615}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0615}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0615}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0615}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0615}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0615}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0615}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0615}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0615}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0616}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0616}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0616}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0616}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0616}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0616}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0616}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0616}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0616}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0616}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0617}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0617}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0617}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0617}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0617}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0617}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0617}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0617}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0617}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0617}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0619}\u{0618}\u{064D}\u{0618}\u{0062}", - nfc: "\u{0061}\u{064D}\u{0618}\u{0618}\u{0619}\u{0062}", - nfd: "\u{0061}\u{064D}\u{0618}\u{0618}\u{0619}\u{0062}", - nfkc: "\u{0061}\u{064D}\u{0618}\u{0618}\u{0619}\u{0062}", - nfkd: "\u{0061}\u{064D}\u{0618}\u{0618}\u{0619}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0618}\u{0619}\u{0618}\u{064D}\u{0062}", - nfc: "\u{0061}\u{064D}\u{0618}\u{0618}\u{0619}\u{0062}", - nfd: "\u{0061}\u{064D}\u{0618}\u{0618}\u{0619}\u{0062}", - nfkc: "\u{0061}\u{064D}\u{0618}\u{0618}\u{0619}\u{0062}", - nfkd: "\u{0061}\u{064D}\u{0618}\u{0618}\u{0619}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{061A}\u{0619}\u{0618}\u{0619}\u{0062}", - nfc: "\u{0061}\u{0618}\u{0619}\u{0619}\u{061A}\u{0062}", - nfd: "\u{0061}\u{0618}\u{0619}\u{0619}\u{061A}\u{0062}", - nfkc: "\u{0061}\u{0618}\u{0619}\u{0619}\u{061A}\u{0062}", - nfkd: "\u{0061}\u{0618}\u{0619}\u{0619}\u{061A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0619}\u{061A}\u{0619}\u{0618}\u{0062}", - nfc: "\u{0061}\u{0618}\u{0619}\u{0619}\u{061A}\u{0062}", - nfd: "\u{0061}\u{0618}\u{0619}\u{0619}\u{061A}\u{0062}", - nfkc: "\u{0061}\u{0618}\u{0619}\u{0619}\u{061A}\u{0062}", - nfkd: "\u{0061}\u{0618}\u{0619}\u{0619}\u{061A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0651}\u{061A}\u{0619}\u{061A}\u{0062}", - nfc: "\u{0061}\u{0619}\u{061A}\u{061A}\u{0651}\u{0062}", - nfd: "\u{0061}\u{0619}\u{061A}\u{061A}\u{0651}\u{0062}", - nfkc: "\u{0061}\u{0619}\u{061A}\u{061A}\u{0651}\u{0062}", - nfkd: "\u{0061}\u{0619}\u{061A}\u{061A}\u{0651}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{061A}\u{0651}\u{061A}\u{0619}\u{0062}", - nfc: "\u{0061}\u{0619}\u{061A}\u{061A}\u{0651}\u{0062}", - nfd: "\u{0061}\u{0619}\u{061A}\u{061A}\u{0651}\u{0062}", - nfkc: "\u{0061}\u{0619}\u{061A}\u{061A}\u{0651}\u{0062}", - nfkd: "\u{0061}\u{0619}\u{061A}\u{061A}\u{0651}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064C}\u{064B}\u{FB1E}\u{064B}\u{0062}", - nfc: "\u{0061}\u{FB1E}\u{064B}\u{064B}\u{064C}\u{0062}", - nfd: "\u{0061}\u{FB1E}\u{064B}\u{064B}\u{064C}\u{0062}", - nfkc: "\u{0061}\u{FB1E}\u{064B}\u{064B}\u{064C}\u{0062}", - nfkd: "\u{0061}\u{FB1E}\u{064B}\u{064B}\u{064C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064B}\u{064C}\u{064B}\u{FB1E}\u{0062}", - nfc: "\u{0061}\u{FB1E}\u{064B}\u{064B}\u{064C}\u{0062}", - nfd: "\u{0061}\u{FB1E}\u{064B}\u{064B}\u{064C}\u{0062}", - nfkc: "\u{0061}\u{FB1E}\u{064B}\u{064B}\u{064C}\u{0062}", - nfkd: "\u{0061}\u{FB1E}\u{064B}\u{064B}\u{064C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064D}\u{064C}\u{064B}\u{064C}\u{0062}", - nfc: "\u{0061}\u{064B}\u{064C}\u{064C}\u{064D}\u{0062}", - nfd: "\u{0061}\u{064B}\u{064C}\u{064C}\u{064D}\u{0062}", - nfkc: "\u{0061}\u{064B}\u{064C}\u{064C}\u{064D}\u{0062}", - nfkd: "\u{0061}\u{064B}\u{064C}\u{064C}\u{064D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064C}\u{064D}\u{064C}\u{064B}\u{0062}", - nfc: "\u{0061}\u{064B}\u{064C}\u{064C}\u{064D}\u{0062}", - nfd: "\u{0061}\u{064B}\u{064C}\u{064C}\u{064D}\u{0062}", - nfkc: "\u{0061}\u{064B}\u{064C}\u{064C}\u{064D}\u{0062}", - nfkd: "\u{0061}\u{064B}\u{064C}\u{064C}\u{064D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0618}\u{064D}\u{064C}\u{064D}\u{0062}", - nfc: "\u{0061}\u{064C}\u{064D}\u{064D}\u{0618}\u{0062}", - nfd: "\u{0061}\u{064C}\u{064D}\u{064D}\u{0618}\u{0062}", - nfkc: "\u{0061}\u{064C}\u{064D}\u{064D}\u{0618}\u{0062}", - nfkd: "\u{0061}\u{064C}\u{064D}\u{064D}\u{0618}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064D}\u{0618}\u{064D}\u{064C}\u{0062}", - nfc: "\u{0061}\u{064C}\u{064D}\u{064D}\u{0618}\u{0062}", - nfd: "\u{0061}\u{064C}\u{064D}\u{064D}\u{0618}\u{0062}", - nfkc: "\u{0061}\u{064C}\u{064D}\u{064D}\u{0618}\u{0062}", - nfkd: "\u{0061}\u{064C}\u{064D}\u{064D}\u{0618}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0619}\u{0618}\u{064D}\u{064E}\u{0062}", - nfc: "\u{0061}\u{064D}\u{0618}\u{064E}\u{0619}\u{0062}", - nfd: "\u{0061}\u{064D}\u{0618}\u{064E}\u{0619}\u{0062}", - nfkc: "\u{0061}\u{064D}\u{0618}\u{064E}\u{0619}\u{0062}", - nfkd: "\u{0061}\u{064D}\u{0618}\u{064E}\u{0619}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064E}\u{0619}\u{0618}\u{064D}\u{0062}", - nfc: "\u{0061}\u{064D}\u{064E}\u{0618}\u{0619}\u{0062}", - nfd: "\u{0061}\u{064D}\u{064E}\u{0618}\u{0619}\u{0062}", - nfkc: "\u{0061}\u{064D}\u{064E}\u{0618}\u{0619}\u{0062}", - nfkd: "\u{0061}\u{064D}\u{064E}\u{0618}\u{0619}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{061A}\u{0619}\u{0618}\u{064F}\u{0062}", - nfc: "\u{0061}\u{0618}\u{0619}\u{064F}\u{061A}\u{0062}", - nfd: "\u{0061}\u{0618}\u{0619}\u{064F}\u{061A}\u{0062}", - nfkc: "\u{0061}\u{0618}\u{0619}\u{064F}\u{061A}\u{0062}", - nfkd: "\u{0061}\u{0618}\u{0619}\u{064F}\u{061A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064F}\u{061A}\u{0619}\u{0618}\u{0062}", - nfc: "\u{0061}\u{0618}\u{064F}\u{0619}\u{061A}\u{0062}", - nfd: "\u{0061}\u{0618}\u{064F}\u{0619}\u{061A}\u{0062}", - nfkc: "\u{0061}\u{0618}\u{064F}\u{0619}\u{061A}\u{0062}", - nfkd: "\u{0061}\u{0618}\u{064F}\u{0619}\u{061A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0651}\u{061A}\u{0619}\u{0650}\u{0062}", - nfc: "\u{0061}\u{0619}\u{061A}\u{0650}\u{0651}\u{0062}", - nfd: "\u{0061}\u{0619}\u{061A}\u{0650}\u{0651}\u{0062}", - nfkc: "\u{0061}\u{0619}\u{061A}\u{0650}\u{0651}\u{0062}", - nfkd: "\u{0061}\u{0619}\u{061A}\u{0650}\u{0651}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0650}\u{0651}\u{061A}\u{0619}\u{0062}", - nfc: "\u{0061}\u{0619}\u{0650}\u{061A}\u{0651}\u{0062}", - nfd: "\u{0061}\u{0619}\u{0650}\u{061A}\u{0651}\u{0062}", - nfkc: "\u{0061}\u{0619}\u{0650}\u{061A}\u{0651}\u{0062}", - nfkd: "\u{0061}\u{0619}\u{0650}\u{061A}\u{0651}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0652}\u{0651}\u{061A}\u{0651}\u{0062}", - nfc: "\u{0061}\u{061A}\u{0651}\u{0651}\u{0652}\u{0062}", - nfd: "\u{0061}\u{061A}\u{0651}\u{0651}\u{0652}\u{0062}", - nfkc: "\u{0061}\u{061A}\u{0651}\u{0651}\u{0652}\u{0062}", - nfkd: "\u{0061}\u{061A}\u{0651}\u{0651}\u{0652}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0651}\u{0652}\u{0651}\u{061A}\u{0062}", - nfc: "\u{0061}\u{061A}\u{0651}\u{0651}\u{0652}\u{0062}", - nfd: "\u{0061}\u{061A}\u{0651}\u{0651}\u{0652}\u{0062}", - nfkc: "\u{0061}\u{061A}\u{0651}\u{0651}\u{0652}\u{0062}", - nfkd: "\u{0061}\u{061A}\u{0651}\u{0651}\u{0652}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0670}\u{0652}\u{0651}\u{0652}\u{0062}", - nfc: "\u{0061}\u{0651}\u{0652}\u{0652}\u{0670}\u{0062}", - nfd: "\u{0061}\u{0651}\u{0652}\u{0652}\u{0670}\u{0062}", - nfkc: "\u{0061}\u{0651}\u{0652}\u{0652}\u{0670}\u{0062}", - nfkd: "\u{0061}\u{0651}\u{0652}\u{0652}\u{0670}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0652}\u{0670}\u{0652}\u{0651}\u{0062}", - nfc: "\u{0061}\u{0651}\u{0652}\u{0652}\u{0670}\u{0062}", - nfd: "\u{0061}\u{0651}\u{0652}\u{0652}\u{0670}\u{0062}", - nfkc: "\u{0061}\u{0651}\u{0652}\u{0652}\u{0670}\u{0062}", - nfkd: "\u{0061}\u{0651}\u{0652}\u{0652}\u{0670}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0653}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0653}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0653}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0653}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0653}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0653}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0653}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0653}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0653}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0653}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0654}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0654}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0654}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0654}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0654}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0654}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0654}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0654}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0654}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0654}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0655}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0655}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0655}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0655}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0655}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0655}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0655}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0655}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0655}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0655}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0656}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0656}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0656}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0656}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0656}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0656}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0656}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0656}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0656}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0656}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0657}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0657}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0657}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0657}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0657}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0657}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0657}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0657}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0657}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0657}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0658}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0658}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0658}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0658}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0658}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0658}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0658}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0658}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0658}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0658}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0659}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0659}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0659}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0659}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0659}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0659}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0659}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0659}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0659}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0659}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{065A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{065A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{065A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{065A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{065A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{065A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{065A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{065A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{065A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{065A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{065B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{065B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{065B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{065B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{065B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{065B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{065B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{065B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{065B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{065B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{065C}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{065C}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{065C}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{065C}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{065C}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{065C}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{065C}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{065C}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{065C}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{065C}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{065D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{065D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{065D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{065D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{065D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{065D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{065D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{065D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{065D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{065D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{065E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{065E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{065E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{065E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{065E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{065E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{065E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{065E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{065E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{065E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{065F}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{065F}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{065F}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{065F}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{065F}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{065F}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{065F}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{065F}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{065F}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{065F}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0711}\u{0670}\u{0652}\u{0670}\u{0062}", - nfc: "\u{0061}\u{0652}\u{0670}\u{0670}\u{0711}\u{0062}", - nfd: "\u{0061}\u{0652}\u{0670}\u{0670}\u{0711}\u{0062}", - nfkc: "\u{0061}\u{0652}\u{0670}\u{0670}\u{0711}\u{0062}", - nfkd: "\u{0061}\u{0652}\u{0670}\u{0670}\u{0711}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0670}\u{0711}\u{0670}\u{0652}\u{0062}", - nfc: "\u{0061}\u{0652}\u{0670}\u{0670}\u{0711}\u{0062}", - nfd: "\u{0061}\u{0652}\u{0670}\u{0670}\u{0711}\u{0062}", - nfkc: "\u{0061}\u{0652}\u{0670}\u{0670}\u{0711}\u{0062}", - nfkd: "\u{0061}\u{0652}\u{0670}\u{0670}\u{0711}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06D6}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06D6}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06D6}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06D6}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06D6}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06D6}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06D6}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06D6}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06D6}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06D6}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06D7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06D7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06D7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06D7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06D7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06D7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06D7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06D7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06D7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06D7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06D8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06D8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06D8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06D8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06D8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06D8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06D8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06D8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06D8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06D8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06D9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06D9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06D9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06D9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06D9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06D9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06D9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06D9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06D9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06D9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06DA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06DA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06DA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06DA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06DA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06DA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06DA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06DA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06DA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06DA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06DB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06DB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06DB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06DB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06DB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06DB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06DB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06DB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06DB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06DB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06DC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06DC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06DC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06DC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06DC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06DC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06DC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06DC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06DC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06DC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06DF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06DF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06DF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06DF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06DF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06DF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06DF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06DF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06DF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06DF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06E0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06E0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06E0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06E0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06E0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06E0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06E0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06E0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06E0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06E0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06E1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06E1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06E1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06E1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06E1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06E1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06E1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06E1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06E1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06E1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06E2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06E2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06E2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06E2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06E2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06E2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06E2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06E2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06E2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06E2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{06E3}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{06E3}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{06E3}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{06E3}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{06E3}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06E3}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{06E3}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{06E3}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{06E3}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{06E3}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06E4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06E4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06E4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06E4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06E4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06E4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06E4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06E4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06E4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06E4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06E7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06E7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06E7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06E7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06E7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06E7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06E7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06E7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06E7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06E7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06E8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06E8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06E8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06E8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06E8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06E8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06E8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06E8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06E8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06E8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{06EA}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{06EA}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{06EA}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{06EA}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{06EA}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06EA}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{06EA}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{06EA}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{06EA}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{06EA}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06EB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06EB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06EB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06EB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06EB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06EB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06EB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06EB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06EB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06EB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{06EC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{06EC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{06EC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{06EC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{06EC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06EC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{06EC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{06EC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{06EC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{06EC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{06ED}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{06ED}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{06ED}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{06ED}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{06ED}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{06ED}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{06ED}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{06ED}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{06ED}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{06ED}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0C55}\u{0711}\u{0670}\u{0711}\u{0062}", - nfc: "\u{0061}\u{0670}\u{0711}\u{0711}\u{0C55}\u{0062}", - nfd: "\u{0061}\u{0670}\u{0711}\u{0711}\u{0C55}\u{0062}", - nfkc: "\u{0061}\u{0670}\u{0711}\u{0711}\u{0C55}\u{0062}", - nfkd: "\u{0061}\u{0670}\u{0711}\u{0711}\u{0C55}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0711}\u{0C55}\u{0711}\u{0670}\u{0062}", - nfc: "\u{0061}\u{0670}\u{0711}\u{0711}\u{0C55}\u{0062}", - nfd: "\u{0061}\u{0670}\u{0711}\u{0711}\u{0C55}\u{0062}", - nfkc: "\u{0061}\u{0670}\u{0711}\u{0711}\u{0C55}\u{0062}", - nfkd: "\u{0061}\u{0670}\u{0711}\u{0711}\u{0C55}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0730}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0730}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0730}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0730}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0730}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0730}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0730}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0730}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0730}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0730}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0731}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0731}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0731}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0731}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0731}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0731}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0731}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0731}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0731}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0731}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0732}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0732}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0732}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0732}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0732}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0732}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0732}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0732}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0732}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0732}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0733}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0733}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0733}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0733}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0733}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0733}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0733}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0733}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0733}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0733}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0734}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0734}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0734}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0734}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0734}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0734}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0734}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0734}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0734}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0734}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0735}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0735}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0735}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0735}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0735}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0735}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0735}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0735}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0735}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0735}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0736}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0736}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0736}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0736}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0736}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0736}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0736}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0736}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0736}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0736}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0737}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0737}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0737}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0737}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0737}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0737}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0737}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0737}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0737}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0737}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0738}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0738}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0738}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0738}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0738}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0738}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0738}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0738}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0738}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0738}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0739}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0739}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0739}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0739}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0739}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0739}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0739}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0739}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0739}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0739}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{073A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{073A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{073A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{073A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{073A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{073A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{073A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{073A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{073A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{073A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{073B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{073B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{073B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{073B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{073B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{073B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{073B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{073B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{073B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{073B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{073C}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{073C}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{073C}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{073C}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{073C}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{073C}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{073C}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{073C}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{073C}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{073C}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{073D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{073D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{073D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{073D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{073D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{073D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{073D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{073D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{073D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{073D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{073E}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{073E}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{073E}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{073E}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{073E}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{073E}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{073E}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{073E}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{073E}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{073E}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{073F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{073F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{073F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{073F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{073F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{073F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{073F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{073F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{073F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{073F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0740}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0740}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0740}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0740}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0740}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0740}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0740}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0740}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0740}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0740}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0741}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0741}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0741}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0741}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0741}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0741}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0741}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0741}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0741}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0741}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0742}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0742}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0742}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0742}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0742}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0742}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0742}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0742}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0742}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0742}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0743}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0743}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0743}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0743}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0743}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0743}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0743}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0743}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0743}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0743}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0744}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0744}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0744}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0744}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0744}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0744}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0744}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0744}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0744}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0744}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0745}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0745}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0745}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0745}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0745}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0745}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0745}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0745}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0745}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0745}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0746}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0746}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0746}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0746}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0746}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0746}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0746}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0746}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0746}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0746}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0747}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0747}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0747}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0747}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0747}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0747}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0747}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0747}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0747}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0747}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0748}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0748}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0748}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0748}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0748}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0748}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0748}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0748}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0748}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0748}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0749}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0749}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0749}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0749}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0749}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0749}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0749}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0749}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0749}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0749}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{074A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{074A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{074A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{074A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{074A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{074A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{074A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{074A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{074A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{074A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{07EB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{07EB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{07EB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{07EB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{07EB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{07EB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{07EB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{07EB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{07EB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{07EB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{07EC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{07EC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{07EC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{07EC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{07EC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{07EC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{07EC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{07EC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{07EC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{07EC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{07ED}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{07ED}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{07ED}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{07ED}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{07ED}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{07ED}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{07ED}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{07ED}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{07ED}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{07ED}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{07EE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{07EE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{07EE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{07EE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{07EE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{07EE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{07EE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{07EE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{07EE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{07EE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{07EF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{07EF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{07EF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{07EF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{07EF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{07EF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{07EF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{07EF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{07EF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{07EF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{07F0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{07F0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{07F0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{07F0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{07F0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{07F0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{07F0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{07F0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{07F0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{07F0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{07F1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{07F1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{07F1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{07F1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{07F1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{07F1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{07F1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{07F1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{07F1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{07F1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{07F2}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{07F2}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{07F2}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{07F2}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{07F2}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{07F2}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{07F2}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{07F2}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{07F2}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{07F2}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{07F3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{07F3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{07F3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{07F3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{07F3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{07F3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{07F3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{07F3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{07F3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{07F3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0816}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0816}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0816}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0816}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0816}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0816}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0816}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0816}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0816}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0816}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0817}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0817}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0817}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0817}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0817}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0817}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0817}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0817}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0817}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0817}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0818}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0818}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0818}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0818}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0818}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0818}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0818}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0818}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0818}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0818}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0819}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0819}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0819}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0819}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0819}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0819}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0819}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0819}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0819}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0819}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{081B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{081B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{081B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{081B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{081B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{081B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{081B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{081B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{081B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{081B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{081C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{081C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{081C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{081C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{081C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{081C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{081C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{081C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{081C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{081C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{081D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{081D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{081D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{081D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{081D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{081D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{081D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{081D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{081D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{081D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{081E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{081E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{081E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{081E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{081E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{081E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{081E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{081E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{081E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{081E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{081F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{081F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{081F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{081F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{081F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{081F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{081F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{081F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{081F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{081F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0820}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0820}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0820}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0820}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0820}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0820}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0820}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0820}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0820}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0820}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0821}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0821}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0821}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0821}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0821}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0821}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0821}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0821}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0821}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0821}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0822}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0822}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0822}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0822}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0822}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0822}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0822}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0822}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0822}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0822}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0823}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0823}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0823}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0823}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0823}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0823}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0823}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0823}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0823}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0823}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0825}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0825}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0825}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0825}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0825}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0825}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0825}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0825}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0825}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0825}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0826}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0826}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0826}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0826}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0826}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0826}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0826}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0826}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0826}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0826}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0827}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0827}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0827}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0827}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0827}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0827}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0827}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0827}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0827}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0827}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0829}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0829}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0829}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0829}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0829}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0829}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0829}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0829}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0829}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0829}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{082A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{082A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{082A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{082A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{082A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{082A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{082A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{082A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{082A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{082A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{082B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{082B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{082B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{082B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{082B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{082B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{082B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{082B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{082B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{082B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{082C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{082C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{082C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{082C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{082C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{082C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{082C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{082C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{082C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{082C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{082D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{082D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{082D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{082D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{082D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{082D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{082D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{082D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{082D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{082D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0859}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0859}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0859}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0859}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0859}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0859}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0859}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0859}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0859}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0859}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{085A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{085A}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{085A}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{085A}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{085A}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{085A}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{085A}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{085A}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{085A}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{085A}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{085B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{085B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{085B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{085B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{085B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{085B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{085B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{085B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{085B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{085B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08D4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08D4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08D4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08D4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08D4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08D4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08D4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08D4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08D4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08D4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08D5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08D5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08D5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08D5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08D5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08D5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08D5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08D5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08D5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08D5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08D6}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08D6}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08D6}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08D6}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08D6}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08D6}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08D6}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08D6}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08D6}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08D6}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08D7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08D7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08D7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08D7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08D7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08D7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08D7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08D7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08D7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08D7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08D8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08D8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08D8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08D8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08D8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08D8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08D8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08D8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08D8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08D8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08D9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08D9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08D9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08D9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08D9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08D9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08D9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08D9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08D9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08D9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08DA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08DA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08DA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08DA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08DA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08DA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08DA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08DA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08DA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08DA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08DB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08DB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08DB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08DB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08DB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08DB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08DB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08DB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08DB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08DB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08DC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08DC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08DC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08DC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08DC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08DC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08DC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08DC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08DC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08DC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08DD}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08DD}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08DD}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08DD}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08DD}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08DD}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08DD}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08DD}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08DD}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08DD}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08DE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08DE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08DE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08DE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08DE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08DE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08DE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08DE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08DE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08DE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08DF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08DF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08DF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08DF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08DF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08DF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08DF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08DF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08DF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08DF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08E0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08E0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08E0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08E0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08E0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08E0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08E0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08E0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08E0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08E0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08E1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08E1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08E1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08E1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08E1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08E1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08E1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08E1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08E1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08E1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{08E3}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{08E3}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{08E3}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{08E3}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{08E3}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08E3}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{08E3}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{08E3}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{08E3}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{08E3}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08E4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08E4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08E4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08E4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08E4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08E4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08E4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08E4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08E4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08E4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08E5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08E5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08E5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08E5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08E5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08E5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08E5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08E5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08E5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08E5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{08E6}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{08E6}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{08E6}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{08E6}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{08E6}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08E6}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{08E6}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{08E6}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{08E6}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{08E6}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08E7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08E7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08E7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08E7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08E7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08E7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08E7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08E7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08E7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08E7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08E8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08E8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08E8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08E8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08E8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08E8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08E8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08E8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08E8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08E8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{08E9}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{08E9}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{08E9}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{08E9}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{08E9}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08E9}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{08E9}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{08E9}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{08E9}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{08E9}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08EA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08EA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08EA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08EA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08EA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08EA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08EA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08EA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08EA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08EA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08EB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08EB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08EB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08EB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08EB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08EB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08EB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08EB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08EB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08EB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08EC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08EC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08EC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08EC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08EC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08EC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08EC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08EC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08EC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08EC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{08ED}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{08ED}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{08ED}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{08ED}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{08ED}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08ED}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{08ED}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{08ED}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{08ED}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{08ED}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{08EE}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{08EE}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{08EE}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{08EE}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{08EE}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08EE}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{08EE}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{08EE}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{08EE}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{08EE}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{08EF}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{08EF}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{08EF}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{08EF}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{08EF}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08EF}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{08EF}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{08EF}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{08EF}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{08EF}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064C}\u{064B}\u{FB1E}\u{08F0}\u{0062}", - nfc: "\u{0061}\u{FB1E}\u{064B}\u{08F0}\u{064C}\u{0062}", - nfd: "\u{0061}\u{FB1E}\u{064B}\u{08F0}\u{064C}\u{0062}", - nfkc: "\u{0061}\u{FB1E}\u{064B}\u{08F0}\u{064C}\u{0062}", - nfkd: "\u{0061}\u{FB1E}\u{064B}\u{08F0}\u{064C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F0}\u{064C}\u{064B}\u{FB1E}\u{0062}", - nfc: "\u{0061}\u{FB1E}\u{08F0}\u{064B}\u{064C}\u{0062}", - nfd: "\u{0061}\u{FB1E}\u{08F0}\u{064B}\u{064C}\u{0062}", - nfkc: "\u{0061}\u{FB1E}\u{08F0}\u{064B}\u{064C}\u{0062}", - nfkd: "\u{0061}\u{FB1E}\u{08F0}\u{064B}\u{064C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064D}\u{064C}\u{064B}\u{08F1}\u{0062}", - nfc: "\u{0061}\u{064B}\u{064C}\u{08F1}\u{064D}\u{0062}", - nfd: "\u{0061}\u{064B}\u{064C}\u{08F1}\u{064D}\u{0062}", - nfkc: "\u{0061}\u{064B}\u{064C}\u{08F1}\u{064D}\u{0062}", - nfkd: "\u{0061}\u{064B}\u{064C}\u{08F1}\u{064D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F1}\u{064D}\u{064C}\u{064B}\u{0062}", - nfc: "\u{0061}\u{064B}\u{08F1}\u{064C}\u{064D}\u{0062}", - nfd: "\u{0061}\u{064B}\u{08F1}\u{064C}\u{064D}\u{0062}", - nfkc: "\u{0061}\u{064B}\u{08F1}\u{064C}\u{064D}\u{0062}", - nfkd: "\u{0061}\u{064B}\u{08F1}\u{064C}\u{064D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0618}\u{064D}\u{064C}\u{08F2}\u{0062}", - nfc: "\u{0061}\u{064C}\u{064D}\u{08F2}\u{0618}\u{0062}", - nfd: "\u{0061}\u{064C}\u{064D}\u{08F2}\u{0618}\u{0062}", - nfkc: "\u{0061}\u{064C}\u{064D}\u{08F2}\u{0618}\u{0062}", - nfkd: "\u{0061}\u{064C}\u{064D}\u{08F2}\u{0618}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F2}\u{0618}\u{064D}\u{064C}\u{0062}", - nfc: "\u{0061}\u{064C}\u{08F2}\u{064D}\u{0618}\u{0062}", - nfd: "\u{0061}\u{064C}\u{08F2}\u{064D}\u{0618}\u{0062}", - nfkc: "\u{0061}\u{064C}\u{08F2}\u{064D}\u{0618}\u{0062}", - nfkd: "\u{0061}\u{064C}\u{08F2}\u{064D}\u{0618}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08F3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08F3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08F3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08F3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08F3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08F3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08F3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08F3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08F3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08F4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08F4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08F4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08F4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08F4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08F4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08F4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08F4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08F4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08F5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08F5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08F5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08F5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08F5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08F5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08F5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08F5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08F5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{08F6}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{08F6}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{08F6}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{08F6}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{08F6}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F6}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{08F6}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{08F6}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{08F6}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{08F6}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08F7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08F7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08F7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08F7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08F7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08F7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08F7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08F7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08F7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08F8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08F8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08F8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08F8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08F8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08F8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08F8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08F8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08F8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{08F9}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{08F9}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{08F9}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{08F9}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{08F9}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08F9}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{08F9}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{08F9}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{08F9}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{08F9}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{08FA}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{08FA}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{08FA}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{08FA}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{08FA}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08FA}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{08FA}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{08FA}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{08FA}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{08FA}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08FB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08FB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08FB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08FB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08FB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08FB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08FB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08FB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08FB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08FB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08FC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08FC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08FC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08FC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08FC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08FC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08FC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08FC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08FC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08FC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08FD}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08FD}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08FD}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08FD}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08FD}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08FD}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08FD}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08FD}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08FD}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08FD}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08FE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08FE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08FE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08FE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08FE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08FE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08FE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08FE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08FE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08FE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{08FF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{08FF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{08FF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{08FF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{08FF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{08FF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{08FF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{08FF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{08FF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{08FF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{093C}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{094D}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{094D}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0951}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0951}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0951}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0951}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0951}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0951}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0951}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0951}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0951}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0951}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0952}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0952}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0952}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0952}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0952}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0952}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0952}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0952}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0952}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0952}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0953}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0953}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0953}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0953}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0953}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0953}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0953}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0953}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0953}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0953}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0954}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0954}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0954}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0954}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0954}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0954}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0954}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0954}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0954}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0954}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{09BC}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{09BC}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{09BC}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{09BC}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{09BC}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{09BC}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{09BC}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{09BC}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{09BC}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{09BC}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{09CD}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{09CD}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{09CD}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{09CD}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{09CD}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{09CD}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{09CD}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{09CD}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{09CD}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{09CD}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{0A3C}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{0A3C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{0A3C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{0A3C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{0A3C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0A3C}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0A3C}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0A3C}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0A3C}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0A3C}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0A4D}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0A4D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0A4D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0A4D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0A4D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0A4D}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0A4D}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0A4D}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0A4D}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0A4D}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{0ABC}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{0ABC}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{0ABC}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{0ABC}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{0ABC}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0ABC}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0ABC}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0ABC}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0ABC}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0ABC}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0ACD}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0ACD}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0ACD}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0ACD}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0ACD}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0ACD}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0ACD}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0ACD}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0ACD}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0ACD}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{0B3C}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{0B3C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{0B3C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{0B3C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{0B3C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0B3C}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0B3C}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0B3C}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0B3C}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0B3C}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0B4D}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0B4D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0B4D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0B4D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0B4D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0B4D}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0B4D}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0B4D}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0B4D}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0B4D}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0BCD}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0BCD}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0BCD}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0BCD}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0BCD}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0BCD}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0BCD}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0BCD}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0BCD}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0BCD}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0C4D}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0C4D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0C4D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0C4D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0C4D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0C4D}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0C4D}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0C4D}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0C4D}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0C4D}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0C56}\u{0C55}\u{0711}\u{0C55}\u{0062}", - nfc: "\u{0061}\u{0711}\u{0C55}\u{0C55}\u{0C56}\u{0062}", - nfd: "\u{0061}\u{0711}\u{0C55}\u{0C55}\u{0C56}\u{0062}", - nfkc: "\u{0061}\u{0711}\u{0C55}\u{0C55}\u{0C56}\u{0062}", - nfkd: "\u{0061}\u{0711}\u{0C55}\u{0C55}\u{0C56}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0C55}\u{0C56}\u{0C55}\u{0711}\u{0062}", - nfc: "\u{0061}\u{0711}\u{0C55}\u{0C55}\u{0C56}\u{0062}", - nfd: "\u{0061}\u{0711}\u{0C55}\u{0C55}\u{0C56}\u{0062}", - nfkc: "\u{0061}\u{0711}\u{0C55}\u{0C55}\u{0C56}\u{0062}", - nfkd: "\u{0061}\u{0711}\u{0C55}\u{0C55}\u{0C56}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E38}\u{0C56}\u{0C55}\u{0C56}\u{0062}", - nfc: "\u{0061}\u{0C55}\u{0C56}\u{0C56}\u{0E38}\u{0062}", - nfd: "\u{0061}\u{0C55}\u{0C56}\u{0C56}\u{0E38}\u{0062}", - nfkc: "\u{0061}\u{0C55}\u{0C56}\u{0C56}\u{0E38}\u{0062}", - nfkd: "\u{0061}\u{0C55}\u{0C56}\u{0C56}\u{0E38}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0C56}\u{0E38}\u{0C56}\u{0C55}\u{0062}", - nfc: "\u{0061}\u{0C55}\u{0C56}\u{0C56}\u{0E38}\u{0062}", - nfd: "\u{0061}\u{0C55}\u{0C56}\u{0C56}\u{0E38}\u{0062}", - nfkc: "\u{0061}\u{0C55}\u{0C56}\u{0C56}\u{0E38}\u{0062}", - nfkd: "\u{0061}\u{0C55}\u{0C56}\u{0C56}\u{0E38}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{0CBC}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{0CBC}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{0CBC}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{0CBC}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{0CBC}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0CBC}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{0CBC}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{0CBC}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{0CBC}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{0CBC}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0CCD}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0CCD}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0CCD}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0CCD}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0CCD}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0CCD}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0CCD}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0CCD}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0CCD}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0CCD}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0D4D}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0D4D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0D4D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0D4D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0D4D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0D4D}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0D4D}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0D4D}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0D4D}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0D4D}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0DCA}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0DCA}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0DCA}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0DCA}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0DCA}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0DCA}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0DCA}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0DCA}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0DCA}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0DCA}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E48}\u{0E38}\u{0C56}\u{0E38}\u{0062}", - nfc: "\u{0061}\u{0C56}\u{0E38}\u{0E38}\u{0E48}\u{0062}", - nfd: "\u{0061}\u{0C56}\u{0E38}\u{0E38}\u{0E48}\u{0062}", - nfkc: "\u{0061}\u{0C56}\u{0E38}\u{0E38}\u{0E48}\u{0062}", - nfkd: "\u{0061}\u{0C56}\u{0E38}\u{0E38}\u{0E48}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E38}\u{0E48}\u{0E38}\u{0C56}\u{0062}", - nfc: "\u{0061}\u{0C56}\u{0E38}\u{0E38}\u{0E48}\u{0062}", - nfd: "\u{0061}\u{0C56}\u{0E38}\u{0E38}\u{0E48}\u{0062}", - nfkc: "\u{0061}\u{0C56}\u{0E38}\u{0E38}\u{0E48}\u{0062}", - nfkd: "\u{0061}\u{0C56}\u{0E38}\u{0E38}\u{0E48}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E48}\u{0E38}\u{0C56}\u{0E39}\u{0062}", - nfc: "\u{0061}\u{0C56}\u{0E38}\u{0E39}\u{0E48}\u{0062}", - nfd: "\u{0061}\u{0C56}\u{0E38}\u{0E39}\u{0E48}\u{0062}", - nfkc: "\u{0061}\u{0C56}\u{0E38}\u{0E39}\u{0E48}\u{0062}", - nfkd: "\u{0061}\u{0C56}\u{0E38}\u{0E39}\u{0E48}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E39}\u{0E48}\u{0E38}\u{0C56}\u{0062}", - nfc: "\u{0061}\u{0C56}\u{0E39}\u{0E38}\u{0E48}\u{0062}", - nfd: "\u{0061}\u{0C56}\u{0E39}\u{0E38}\u{0E48}\u{0062}", - nfkc: "\u{0061}\u{0C56}\u{0E39}\u{0E38}\u{0E48}\u{0062}", - nfkd: "\u{0061}\u{0C56}\u{0E39}\u{0E38}\u{0E48}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0E3A}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0E3A}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0E3A}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0E3A}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0E3A}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E3A}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0E3A}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0E3A}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0E3A}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0E3A}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EB8}\u{0E48}\u{0E38}\u{0E48}\u{0062}", - nfc: "\u{0061}\u{0E38}\u{0E48}\u{0E48}\u{0EB8}\u{0062}", - nfd: "\u{0061}\u{0E38}\u{0E48}\u{0E48}\u{0EB8}\u{0062}", - nfkc: "\u{0061}\u{0E38}\u{0E48}\u{0E48}\u{0EB8}\u{0062}", - nfkd: "\u{0061}\u{0E38}\u{0E48}\u{0E48}\u{0EB8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E48}\u{0EB8}\u{0E48}\u{0E38}\u{0062}", - nfc: "\u{0061}\u{0E38}\u{0E48}\u{0E48}\u{0EB8}\u{0062}", - nfd: "\u{0061}\u{0E38}\u{0E48}\u{0E48}\u{0EB8}\u{0062}", - nfkc: "\u{0061}\u{0E38}\u{0E48}\u{0E48}\u{0EB8}\u{0062}", - nfkd: "\u{0061}\u{0E38}\u{0E48}\u{0E48}\u{0EB8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EB8}\u{0E48}\u{0E38}\u{0E49}\u{0062}", - nfc: "\u{0061}\u{0E38}\u{0E48}\u{0E49}\u{0EB8}\u{0062}", - nfd: "\u{0061}\u{0E38}\u{0E48}\u{0E49}\u{0EB8}\u{0062}", - nfkc: "\u{0061}\u{0E38}\u{0E48}\u{0E49}\u{0EB8}\u{0062}", - nfkd: "\u{0061}\u{0E38}\u{0E48}\u{0E49}\u{0EB8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E49}\u{0EB8}\u{0E48}\u{0E38}\u{0062}", - nfc: "\u{0061}\u{0E38}\u{0E49}\u{0E48}\u{0EB8}\u{0062}", - nfd: "\u{0061}\u{0E38}\u{0E49}\u{0E48}\u{0EB8}\u{0062}", - nfkc: "\u{0061}\u{0E38}\u{0E49}\u{0E48}\u{0EB8}\u{0062}", - nfkd: "\u{0061}\u{0E38}\u{0E49}\u{0E48}\u{0EB8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EB8}\u{0E48}\u{0E38}\u{0E4A}\u{0062}", - nfc: "\u{0061}\u{0E38}\u{0E48}\u{0E4A}\u{0EB8}\u{0062}", - nfd: "\u{0061}\u{0E38}\u{0E48}\u{0E4A}\u{0EB8}\u{0062}", - nfkc: "\u{0061}\u{0E38}\u{0E48}\u{0E4A}\u{0EB8}\u{0062}", - nfkd: "\u{0061}\u{0E38}\u{0E48}\u{0E4A}\u{0EB8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E4A}\u{0EB8}\u{0E48}\u{0E38}\u{0062}", - nfc: "\u{0061}\u{0E38}\u{0E4A}\u{0E48}\u{0EB8}\u{0062}", - nfd: "\u{0061}\u{0E38}\u{0E4A}\u{0E48}\u{0EB8}\u{0062}", - nfkc: "\u{0061}\u{0E38}\u{0E4A}\u{0E48}\u{0EB8}\u{0062}", - nfkd: "\u{0061}\u{0E38}\u{0E4A}\u{0E48}\u{0EB8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EB8}\u{0E48}\u{0E38}\u{0E4B}\u{0062}", - nfc: "\u{0061}\u{0E38}\u{0E48}\u{0E4B}\u{0EB8}\u{0062}", - nfd: "\u{0061}\u{0E38}\u{0E48}\u{0E4B}\u{0EB8}\u{0062}", - nfkc: "\u{0061}\u{0E38}\u{0E48}\u{0E4B}\u{0EB8}\u{0062}", - nfkd: "\u{0061}\u{0E38}\u{0E48}\u{0E4B}\u{0EB8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0E4B}\u{0EB8}\u{0E48}\u{0E38}\u{0062}", - nfc: "\u{0061}\u{0E38}\u{0E4B}\u{0E48}\u{0EB8}\u{0062}", - nfd: "\u{0061}\u{0E38}\u{0E4B}\u{0E48}\u{0EB8}\u{0062}", - nfkc: "\u{0061}\u{0E38}\u{0E4B}\u{0E48}\u{0EB8}\u{0062}", - nfkd: "\u{0061}\u{0E38}\u{0E4B}\u{0E48}\u{0EB8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EC8}\u{0EB8}\u{0E48}\u{0EB8}\u{0062}", - nfc: "\u{0061}\u{0E48}\u{0EB8}\u{0EB8}\u{0EC8}\u{0062}", - nfd: "\u{0061}\u{0E48}\u{0EB8}\u{0EB8}\u{0EC8}\u{0062}", - nfkc: "\u{0061}\u{0E48}\u{0EB8}\u{0EB8}\u{0EC8}\u{0062}", - nfkd: "\u{0061}\u{0E48}\u{0EB8}\u{0EB8}\u{0EC8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EB8}\u{0EC8}\u{0EB8}\u{0E48}\u{0062}", - nfc: "\u{0061}\u{0E48}\u{0EB8}\u{0EB8}\u{0EC8}\u{0062}", - nfd: "\u{0061}\u{0E48}\u{0EB8}\u{0EB8}\u{0EC8}\u{0062}", - nfkc: "\u{0061}\u{0E48}\u{0EB8}\u{0EB8}\u{0EC8}\u{0062}", - nfkd: "\u{0061}\u{0E48}\u{0EB8}\u{0EB8}\u{0EC8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EC8}\u{0EB8}\u{0E48}\u{0EB9}\u{0062}", - nfc: "\u{0061}\u{0E48}\u{0EB8}\u{0EB9}\u{0EC8}\u{0062}", - nfd: "\u{0061}\u{0E48}\u{0EB8}\u{0EB9}\u{0EC8}\u{0062}", - nfkc: "\u{0061}\u{0E48}\u{0EB8}\u{0EB9}\u{0EC8}\u{0062}", - nfkd: "\u{0061}\u{0E48}\u{0EB8}\u{0EB9}\u{0EC8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EB9}\u{0EC8}\u{0EB8}\u{0E48}\u{0062}", - nfc: "\u{0061}\u{0E48}\u{0EB9}\u{0EB8}\u{0EC8}\u{0062}", - nfd: "\u{0061}\u{0E48}\u{0EB9}\u{0EB8}\u{0EC8}\u{0062}", - nfkc: "\u{0061}\u{0E48}\u{0EB9}\u{0EB8}\u{0EC8}\u{0062}", - nfkd: "\u{0061}\u{0E48}\u{0EB9}\u{0EB8}\u{0EC8}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F71}\u{0EC8}\u{0EB8}\u{0EC8}\u{0062}", - nfc: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC8}\u{0F71}\u{0062}", - nfd: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC8}\u{0F71}\u{0062}", - nfkc: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC8}\u{0F71}\u{0062}", - nfkd: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC8}\u{0F71}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EC8}\u{0F71}\u{0EC8}\u{0EB8}\u{0062}", - nfc: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC8}\u{0F71}\u{0062}", - nfd: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC8}\u{0F71}\u{0062}", - nfkc: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC8}\u{0F71}\u{0062}", - nfkd: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC8}\u{0F71}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F71}\u{0EC8}\u{0EB8}\u{0EC9}\u{0062}", - nfc: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC9}\u{0F71}\u{0062}", - nfd: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC9}\u{0F71}\u{0062}", - nfkc: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC9}\u{0F71}\u{0062}", - nfkd: "\u{0061}\u{0EB8}\u{0EC8}\u{0EC9}\u{0F71}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0EC9}\u{0F71}\u{0EC8}\u{0EB8}\u{0062}", - nfc: "\u{0061}\u{0EB8}\u{0EC9}\u{0EC8}\u{0F71}\u{0062}", - nfd: "\u{0061}\u{0EB8}\u{0EC9}\u{0EC8}\u{0F71}\u{0062}", - nfkc: "\u{0061}\u{0EB8}\u{0EC9}\u{0EC8}\u{0F71}\u{0062}", - nfkd: "\u{0061}\u{0EB8}\u{0EC9}\u{0EC8}\u{0F71}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F71}\u{0EC8}\u{0EB8}\u{0ECA}\u{0062}", - nfc: "\u{0061}\u{0EB8}\u{0EC8}\u{0ECA}\u{0F71}\u{0062}", - nfd: "\u{0061}\u{0EB8}\u{0EC8}\u{0ECA}\u{0F71}\u{0062}", - nfkc: "\u{0061}\u{0EB8}\u{0EC8}\u{0ECA}\u{0F71}\u{0062}", - nfkd: "\u{0061}\u{0EB8}\u{0EC8}\u{0ECA}\u{0F71}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0ECA}\u{0F71}\u{0EC8}\u{0EB8}\u{0062}", - nfc: "\u{0061}\u{0EB8}\u{0ECA}\u{0EC8}\u{0F71}\u{0062}", - nfd: "\u{0061}\u{0EB8}\u{0ECA}\u{0EC8}\u{0F71}\u{0062}", - nfkc: "\u{0061}\u{0EB8}\u{0ECA}\u{0EC8}\u{0F71}\u{0062}", - nfkd: "\u{0061}\u{0EB8}\u{0ECA}\u{0EC8}\u{0F71}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F71}\u{0EC8}\u{0EB8}\u{0ECB}\u{0062}", - nfc: "\u{0061}\u{0EB8}\u{0EC8}\u{0ECB}\u{0F71}\u{0062}", - nfd: "\u{0061}\u{0EB8}\u{0EC8}\u{0ECB}\u{0F71}\u{0062}", - nfkc: "\u{0061}\u{0EB8}\u{0EC8}\u{0ECB}\u{0F71}\u{0062}", - nfkd: "\u{0061}\u{0EB8}\u{0EC8}\u{0ECB}\u{0F71}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0ECB}\u{0F71}\u{0EC8}\u{0EB8}\u{0062}", - nfc: "\u{0061}\u{0EB8}\u{0ECB}\u{0EC8}\u{0F71}\u{0062}", - nfd: "\u{0061}\u{0EB8}\u{0ECB}\u{0EC8}\u{0F71}\u{0062}", - nfkc: "\u{0061}\u{0EB8}\u{0ECB}\u{0EC8}\u{0F71}\u{0062}", - nfkd: "\u{0061}\u{0EB8}\u{0ECB}\u{0EC8}\u{0F71}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0F18}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0F18}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0F18}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0F18}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0F18}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F18}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0F18}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0F18}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0F18}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0F18}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0F19}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0F19}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0F19}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0F19}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0F19}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F19}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0F19}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0F19}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0F19}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0F19}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0F35}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0F35}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0F35}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0F35}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0F35}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F35}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0F35}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0F35}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0F35}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0F35}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0F37}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0F37}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0F37}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0F37}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0F37}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F37}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0F37}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0F37}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0F37}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0F37}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{031B}\u{1DCE}\u{0F39}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{0F39}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{0F39}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{0F39}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{0F39}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F39}\u{302A}\u{031B}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{0F39}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{0F39}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{0F39}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{0F39}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F72}\u{0F71}\u{0EC8}\u{0F71}\u{0062}", - nfc: "\u{0061}\u{0EC8}\u{0F71}\u{0F71}\u{0F72}\u{0062}", - nfd: "\u{0061}\u{0EC8}\u{0F71}\u{0F71}\u{0F72}\u{0062}", - nfkc: "\u{0061}\u{0EC8}\u{0F71}\u{0F71}\u{0F72}\u{0062}", - nfkd: "\u{0061}\u{0EC8}\u{0F71}\u{0F71}\u{0F72}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F71}\u{0F72}\u{0F71}\u{0EC8}\u{0062}", - nfc: "\u{0061}\u{0EC8}\u{0F71}\u{0F71}\u{0F72}\u{0062}", - nfd: "\u{0061}\u{0EC8}\u{0F71}\u{0F71}\u{0F72}\u{0062}", - nfkc: "\u{0061}\u{0EC8}\u{0F71}\u{0F71}\u{0F72}\u{0062}", - nfkd: "\u{0061}\u{0EC8}\u{0F71}\u{0F71}\u{0F72}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F74}\u{0F72}\u{0F71}\u{0F72}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F72}\u{0F72}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F72}\u{0F72}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F72}\u{0F72}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F72}\u{0F72}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F72}\u{0F74}\u{0F72}\u{0F71}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F72}\u{0F72}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F72}\u{0F72}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F72}\u{0F72}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F72}\u{0F72}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0321}\u{0F74}\u{0F72}\u{0F74}\u{0062}", - nfc: "\u{0061}\u{0F72}\u{0F74}\u{0F74}\u{0321}\u{0062}", - nfd: "\u{0061}\u{0F72}\u{0F74}\u{0F74}\u{0321}\u{0062}", - nfkc: "\u{0061}\u{0F72}\u{0F74}\u{0F74}\u{0321}\u{0062}", - nfkd: "\u{0061}\u{0F72}\u{0F74}\u{0F74}\u{0321}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F74}\u{0321}\u{0F74}\u{0F72}\u{0062}", - nfc: "\u{0061}\u{0F72}\u{0F74}\u{0F74}\u{0321}\u{0062}", - nfd: "\u{0061}\u{0F72}\u{0F74}\u{0F74}\u{0321}\u{0062}", - nfkc: "\u{0061}\u{0F72}\u{0F74}\u{0F74}\u{0321}\u{0062}", - nfkd: "\u{0061}\u{0F72}\u{0F74}\u{0F74}\u{0321}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F74}\u{0F72}\u{0F71}\u{0F7A}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F72}\u{0F7A}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F72}\u{0F7A}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F72}\u{0F7A}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F72}\u{0F7A}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F7A}\u{0F74}\u{0F72}\u{0F71}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F7A}\u{0F72}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F7A}\u{0F72}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F7A}\u{0F72}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F7A}\u{0F72}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F74}\u{0F72}\u{0F71}\u{0F7B}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F72}\u{0F7B}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F72}\u{0F7B}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F72}\u{0F7B}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F72}\u{0F7B}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F7B}\u{0F74}\u{0F72}\u{0F71}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F7B}\u{0F72}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F7B}\u{0F72}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F7B}\u{0F72}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F7B}\u{0F72}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F74}\u{0F72}\u{0F71}\u{0F7C}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F72}\u{0F7C}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F72}\u{0F7C}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F72}\u{0F7C}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F72}\u{0F7C}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F7C}\u{0F74}\u{0F72}\u{0F71}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F7C}\u{0F72}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F7C}\u{0F72}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F7C}\u{0F72}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F7C}\u{0F72}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F74}\u{0F72}\u{0F71}\u{0F7D}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F72}\u{0F7D}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F72}\u{0F7D}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F72}\u{0F7D}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F72}\u{0F7D}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F7D}\u{0F74}\u{0F72}\u{0F71}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F7D}\u{0F72}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F7D}\u{0F72}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F7D}\u{0F72}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F7D}\u{0F72}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F74}\u{0F72}\u{0F71}\u{0F80}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F72}\u{0F80}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F72}\u{0F80}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F72}\u{0F80}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F72}\u{0F80}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F80}\u{0F74}\u{0F72}\u{0F71}\u{0062}", - nfc: "\u{0061}\u{0F71}\u{0F80}\u{0F72}\u{0F74}\u{0062}", - nfd: "\u{0061}\u{0F71}\u{0F80}\u{0F72}\u{0F74}\u{0062}", - nfkc: "\u{0061}\u{0F71}\u{0F80}\u{0F72}\u{0F74}\u{0062}", - nfkd: "\u{0061}\u{0F71}\u{0F80}\u{0F72}\u{0F74}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0F82}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0F82}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0F82}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0F82}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0F82}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F82}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0F82}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0F82}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0F82}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0F82}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0F83}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0F83}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0F83}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0F83}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0F83}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F83}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0F83}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0F83}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0F83}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0F83}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{0F84}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{0F84}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{0F84}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{0F84}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{0F84}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F84}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{0F84}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{0F84}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{0F84}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{0F84}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0F86}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0F86}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0F86}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0F86}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0F86}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F86}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0F86}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0F86}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0F86}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0F86}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{0F87}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{0F87}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{0F87}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{0F87}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{0F87}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0F87}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{0F87}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0F87}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{0F87}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0F87}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{0FC6}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{0FC6}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{0FC6}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{0FC6}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{0FC6}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0FC6}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0FC6}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0FC6}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0FC6}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0FC6}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{1037}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{1037}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{1037}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{1037}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{1037}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1037}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1037}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1037}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1037}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1037}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1039}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1039}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1039}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1039}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1039}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1039}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1039}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1039}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1039}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1039}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{103A}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{103A}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{103A}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{103A}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{103A}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{103A}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{103A}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{103A}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{103A}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{103A}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{108D}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{108D}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{108D}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{108D}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{108D}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{108D}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{108D}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{108D}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{108D}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{108D}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{135D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{135D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{135D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{135D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{135D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{135D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{135D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{135D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{135D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{135D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{135E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{135E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{135E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{135E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{135E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{135E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{135E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{135E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{135E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{135E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{135F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{135F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{135F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{135F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{135F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{135F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{135F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{135F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{135F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{135F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1714}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1714}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1714}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1714}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1714}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1714}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1714}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1714}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1714}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1714}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1734}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1734}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1734}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1734}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1734}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1734}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1734}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1734}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1734}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1734}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{17D2}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{17D2}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{17D2}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{17D2}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{17D2}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{17D2}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{17D2}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{17D2}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{17D2}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{17D2}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{17DD}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{17DD}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{17DD}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{17DD}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{17DD}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{17DD}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{17DD}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{17DD}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{17DD}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{17DD}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0300}\u{05AE}\u{1D16D}\u{18A9}\u{0062}", - nfc: "\u{00E0}\u{1D16D}\u{05AE}\u{18A9}\u{0062}", - nfd: "\u{0061}\u{1D16D}\u{05AE}\u{18A9}\u{0300}\u{0062}", - nfkc: "\u{00E0}\u{1D16D}\u{05AE}\u{18A9}\u{0062}", - nfkd: "\u{0061}\u{1D16D}\u{05AE}\u{18A9}\u{0300}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{18A9}\u{0300}\u{05AE}\u{1D16D}\u{0062}", - nfc: "\u{00E0}\u{1D16D}\u{18A9}\u{05AE}\u{0062}", - nfd: "\u{0061}\u{1D16D}\u{18A9}\u{05AE}\u{0300}\u{0062}", - nfkc: "\u{00E0}\u{1D16D}\u{18A9}\u{05AE}\u{0062}", - nfkd: "\u{0061}\u{1D16D}\u{18A9}\u{05AE}\u{0300}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302E}\u{059A}\u{0316}\u{1939}\u{0062}", - nfc: "\u{0061}\u{0316}\u{059A}\u{1939}\u{302E}\u{0062}", - nfd: "\u{0061}\u{0316}\u{059A}\u{1939}\u{302E}\u{0062}", - nfkc: "\u{0061}\u{0316}\u{059A}\u{1939}\u{302E}\u{0062}", - nfkd: "\u{0061}\u{0316}\u{059A}\u{1939}\u{302E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1939}\u{302E}\u{059A}\u{0316}\u{0062}", - nfc: "\u{0061}\u{0316}\u{1939}\u{059A}\u{302E}\u{0062}", - nfd: "\u{0061}\u{0316}\u{1939}\u{059A}\u{302E}\u{0062}", - nfkc: "\u{0061}\u{0316}\u{1939}\u{059A}\u{302E}\u{0062}", - nfkd: "\u{0061}\u{0316}\u{1939}\u{059A}\u{302E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{193A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{193A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{193A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{193A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{193A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{193A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{193A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{193A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{193A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{193A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{193B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{193B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{193B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{193B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{193B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{193B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{193B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{193B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{193B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{193B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1A17}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1A17}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1A17}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1A17}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1A17}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A17}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1A17}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1A17}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1A17}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1A17}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1A18}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1A18}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1A18}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1A18}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1A18}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A18}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1A18}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1A18}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1A18}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1A18}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1A60}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1A60}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1A60}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1A60}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1A60}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A60}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1A60}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1A60}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1A60}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1A60}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1A75}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1A75}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1A75}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1A75}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1A75}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A75}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1A75}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1A75}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1A75}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1A75}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1A76}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1A76}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1A76}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1A76}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1A76}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A76}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1A76}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1A76}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1A76}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1A76}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1A77}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1A77}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1A77}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1A77}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1A77}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A77}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1A77}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1A77}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1A77}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1A77}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1A78}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1A78}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1A78}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1A78}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1A78}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A78}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1A78}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1A78}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1A78}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1A78}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1A79}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1A79}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1A79}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1A79}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1A79}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A79}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1A79}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1A79}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1A79}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1A79}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1A7A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1A7A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1A7A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1A7A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1A7A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A7A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1A7A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1A7A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1A7A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1A7A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1A7B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1A7B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1A7B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1A7B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1A7B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A7B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1A7B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1A7B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1A7B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1A7B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1A7C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1A7C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1A7C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1A7C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1A7C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A7C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1A7C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1A7C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1A7C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1A7C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1A7F}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1A7F}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1A7F}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1A7F}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1A7F}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1A7F}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1A7F}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1A7F}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1A7F}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1A7F}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1AB0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1AB0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1AB0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1AB0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1AB0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1AB0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1AB0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1AB0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1AB0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1AB1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1AB1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1AB1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1AB1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1AB1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1AB1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1AB1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1AB1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1AB1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1AB2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1AB2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1AB2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1AB2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1AB2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1AB2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1AB2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1AB2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1AB2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1AB3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1AB3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1AB3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1AB3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1AB3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1AB3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1AB3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1AB3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1AB3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1AB4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1AB4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1AB4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1AB4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1AB4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1AB4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1AB4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1AB4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1AB4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1AB5}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1AB5}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1AB5}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1AB5}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1AB5}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB5}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1AB5}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1AB5}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1AB5}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1AB5}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1AB6}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1AB6}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1AB6}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1AB6}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1AB6}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB6}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1AB6}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1AB6}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1AB6}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1AB6}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1AB7}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1AB7}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1AB7}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1AB7}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1AB7}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB7}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1AB7}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1AB7}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1AB7}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1AB7}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1AB8}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1AB8}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1AB8}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1AB8}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1AB8}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB8}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1AB8}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1AB8}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1AB8}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1AB8}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1AB9}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1AB9}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1AB9}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1AB9}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1AB9}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1AB9}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1AB9}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1AB9}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1AB9}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1AB9}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1ABA}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1ABA}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1ABA}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1ABA}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1ABA}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1ABA}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1ABA}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1ABA}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1ABA}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1ABA}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1ABB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1ABB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1ABB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1ABB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1ABB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1ABB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1ABB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1ABB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1ABB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1ABB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1ABC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1ABC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1ABC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1ABC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1ABC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1ABC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1ABC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1ABC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1ABC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1ABC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1ABD}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1ABD}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1ABD}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1ABD}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1ABD}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1ABD}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1ABD}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1ABD}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1ABD}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1ABD}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{1B34}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{1B34}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{1B34}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{1B34}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{1B34}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B34}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1B34}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1B34}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1B34}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1B34}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1B44}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1B44}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1B44}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1B44}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1B44}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B44}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1B44}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1B44}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1B44}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1B44}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1B6B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1B6B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1B6B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1B6B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1B6B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B6B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1B6B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1B6B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1B6B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1B6B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1B6C}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1B6C}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1B6C}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1B6C}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1B6C}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B6C}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1B6C}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1B6C}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1B6C}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1B6C}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1B6D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1B6D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1B6D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1B6D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1B6D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B6D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1B6D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1B6D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1B6D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1B6D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1B6E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1B6E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1B6E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1B6E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1B6E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B6E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1B6E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1B6E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1B6E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1B6E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1B6F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1B6F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1B6F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1B6F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1B6F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B6F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1B6F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1B6F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1B6F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1B6F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1B70}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1B70}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1B70}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1B70}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1B70}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B70}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1B70}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1B70}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1B70}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1B70}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1B71}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1B71}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1B71}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1B71}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1B71}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B71}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1B71}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1B71}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1B71}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1B71}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1B72}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1B72}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1B72}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1B72}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1B72}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B72}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1B72}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1B72}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1B72}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1B72}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1B73}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1B73}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1B73}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1B73}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1B73}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1B73}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1B73}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1B73}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1B73}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1B73}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1BAA}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1BAA}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1BAA}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1BAA}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1BAA}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1BAA}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1BAA}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1BAA}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1BAA}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1BAA}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1BAB}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1BAB}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1BAB}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1BAB}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1BAB}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1BAB}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1BAB}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1BAB}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1BAB}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1BAB}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{1BE6}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{1BE6}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{1BE6}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{1BE6}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{1BE6}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1BE6}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1BE6}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1BE6}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1BE6}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1BE6}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1BF2}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1BF2}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1BF2}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1BF2}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1BF2}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1BF2}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1BF2}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1BF2}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1BF2}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1BF2}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1BF3}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1BF3}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1BF3}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1BF3}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1BF3}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1BF3}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1BF3}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1BF3}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1BF3}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1BF3}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{1C37}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{1C37}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{1C37}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{1C37}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{1C37}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1C37}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1C37}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1C37}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1C37}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1C37}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1CD0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1CD0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1CD0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1CD0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1CD0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CD0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1CD0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1CD0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1CD0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1CD0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1CD1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1CD1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1CD1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1CD1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1CD1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CD1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1CD1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1CD1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1CD1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1CD1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1CD2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1CD2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1CD2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1CD2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1CD2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CD2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1CD2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1CD2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1CD2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1CD2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1CD4}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1CD4}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1CD4}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1CD4}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1CD4}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CD4}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1CD4}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1CD4}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1CD4}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1CD4}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CD5}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CD5}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CD5}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CD5}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CD5}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CD5}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CD5}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CD5}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CD5}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CD5}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CD6}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CD6}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CD6}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CD6}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CD6}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CD6}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CD6}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CD6}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CD6}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CD6}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CD7}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CD7}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CD7}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CD7}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CD7}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CD7}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CD7}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CD7}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CD7}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CD7}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CD8}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CD8}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CD8}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CD8}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CD8}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CD8}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CD8}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CD8}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CD8}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CD8}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CD9}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CD9}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CD9}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CD9}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CD9}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CD9}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CD9}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CD9}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CD9}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CD9}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1CDA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1CDA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1CDA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1CDA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1CDA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CDA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1CDA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1CDA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1CDA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1CDA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1CDB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1CDB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1CDB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1CDB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1CDB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CDB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1CDB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1CDB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1CDB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1CDB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CDC}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CDC}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CDC}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CDC}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CDC}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CDC}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CDC}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CDC}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CDC}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CDC}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CDD}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CDD}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CDD}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CDD}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CDD}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CDD}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CDD}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CDD}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CDD}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CDD}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CDE}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CDE}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CDE}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CDE}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CDE}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CDE}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CDE}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CDE}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CDE}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CDE}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CDF}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CDF}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CDF}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CDF}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CDF}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CDF}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CDF}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CDF}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CDF}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CDF}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1CE0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1CE0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1CE0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1CE0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1CE0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CE0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1CE0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1CE0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1CE0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1CE0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1CE2}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1CE2}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1CE2}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1CE2}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1CE2}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CE2}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1CE2}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1CE2}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1CE2}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1CE2}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1CE3}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1CE3}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1CE3}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1CE3}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1CE3}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CE3}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1CE3}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1CE3}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1CE3}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1CE3}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1CE4}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1CE4}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1CE4}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1CE4}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1CE4}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CE4}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1CE4}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1CE4}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1CE4}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1CE4}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1CE5}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1CE5}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1CE5}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1CE5}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1CE5}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CE5}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1CE5}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1CE5}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1CE5}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1CE5}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1CE6}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1CE6}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1CE6}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1CE6}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1CE6}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CE6}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1CE6}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1CE6}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1CE6}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1CE6}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1CE7}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1CE7}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1CE7}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1CE7}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1CE7}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CE7}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1CE7}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1CE7}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1CE7}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1CE7}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1CE8}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1CE8}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1CE8}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1CE8}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1CE8}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CE8}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1CE8}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1CE8}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1CE8}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1CE8}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1CED}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1CED}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1CED}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1CED}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1CED}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CED}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1CED}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1CED}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1CED}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1CED}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1CF4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1CF4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1CF4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1CF4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1CF4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CF4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1CF4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1CF4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1CF4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1CF4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1CF8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1CF8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1CF8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1CF8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1CF8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CF8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1CF8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1CF8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1CF8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1CF8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1CF9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1CF9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1CF9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1CF9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1CF9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1CF9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1CF9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1CF9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1CF9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1CF9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DC0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DC0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DC0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DC0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DC0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DC0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DC0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DC0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DC0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DC1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DC1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DC1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DC1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DC1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DC1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DC1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DC1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DC1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1DC2}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1DC2}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1DC2}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1DC2}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1DC2}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC2}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1DC2}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1DC2}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1DC2}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1DC2}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DC3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DC3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DC3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DC3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DC3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DC3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DC3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DC3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DC3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DC4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DC4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DC4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DC4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DC4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DC4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DC4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DC4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DC4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DC5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DC5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DC5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DC5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DC5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DC5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DC5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DC5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DC5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DC6}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DC6}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DC6}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DC6}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DC6}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC6}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DC6}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DC6}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DC6}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DC6}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DC7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DC7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DC7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DC7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DC7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DC7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DC7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DC7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DC7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DC8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DC8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DC8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DC8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DC8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DC8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DC8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DC8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DC8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DC9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DC9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DC9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DC9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DC9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DC9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DC9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DC9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DC9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DC9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1DCA}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1DCA}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1DCA}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1DCA}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1DCA}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCA}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1DCA}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1DCA}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1DCA}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1DCA}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DCB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DCB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DCB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DCB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DCB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DCB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DCB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DCB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DCB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DCC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DCC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DCC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DCC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DCC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DCC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DCC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DCC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DCC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0345}\u{035D}\u{035C}\u{1DCD}\u{0062}", - nfc: "\u{0061}\u{035C}\u{035D}\u{1DCD}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{035D}\u{1DCD}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{035D}\u{1DCD}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{035D}\u{1DCD}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCD}\u{0345}\u{035D}\u{035C}\u{0062}", - nfc: "\u{0061}\u{035C}\u{1DCD}\u{035D}\u{0345}\u{0062}", - nfd: "\u{0061}\u{035C}\u{1DCD}\u{035D}\u{0345}\u{0062}", - nfkc: "\u{0061}\u{035C}\u{1DCD}\u{035D}\u{0345}\u{0062}", - nfkd: "\u{0061}\u{035C}\u{1DCD}\u{035D}\u{0345}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{031B}\u{1DCE}\u{0321}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{0321}\u{1DCE}\u{1DCE}\u{031B}\u{0062}", - nfd: "\u{0061}\u{0321}\u{1DCE}\u{1DCE}\u{031B}\u{0062}", - nfkc: "\u{0061}\u{0321}\u{1DCE}\u{1DCE}\u{031B}\u{0062}", - nfkd: "\u{0061}\u{0321}\u{1DCE}\u{1DCE}\u{031B}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCE}\u{031B}\u{1DCE}\u{0321}\u{0062}", - nfc: "\u{0061}\u{0321}\u{1DCE}\u{1DCE}\u{031B}\u{0062}", - nfd: "\u{0061}\u{0321}\u{1DCE}\u{1DCE}\u{031B}\u{0062}", - nfkc: "\u{0061}\u{0321}\u{1DCE}\u{1DCE}\u{031B}\u{0062}", - nfkd: "\u{0061}\u{0321}\u{1DCE}\u{1DCE}\u{031B}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1DCF}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1DCF}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1DCF}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1DCF}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1DCF}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCF}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1DCF}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1DCF}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1DCF}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1DCF}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DCE}\u{0321}\u{0F74}\u{1DD0}\u{0062}", - nfc: "\u{0061}\u{0F74}\u{0321}\u{1DD0}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{0321}\u{1DD0}\u{1DCE}\u{0062}", - nfkc: "\u{0061}\u{0F74}\u{0321}\u{1DD0}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{0321}\u{1DD0}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD0}\u{1DCE}\u{0321}\u{0F74}\u{0062}", - nfc: "\u{0061}\u{0F74}\u{1DD0}\u{0321}\u{1DCE}\u{0062}", - nfd: "\u{0061}\u{0F74}\u{1DD0}\u{0321}\u{1DCE}\u{0062}", - nfkc: "\u{0061}\u{0F74}\u{1DD0}\u{0321}\u{1DCE}\u{0062}", - nfkd: "\u{0061}\u{0F74}\u{1DD0}\u{0321}\u{1DCE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DD1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DD1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DD1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DD1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DD1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DD1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DD1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DD1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DD1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DD2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DD2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DD2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DD2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DD2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DD2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DD2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DD2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DD2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DD3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DD3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DD3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DD3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DD3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DD3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DD3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DD3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DD3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DD4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DD4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DD4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DD4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DD4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DD4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DD4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DD4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DD4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DD5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DD5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DD5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DD5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DD5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DD5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DD5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DD5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DD5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DD6}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DD6}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DD6}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DD6}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DD6}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD6}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DD6}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DD6}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DD6}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DD6}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DD7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DD7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DD7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DD7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DD7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DD7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DD7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DD7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DD7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DD8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DD8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DD8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DD8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DD8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DD8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DD8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DD8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DD8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DD9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DD9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DD9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DD9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DD9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DD9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DD9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DD9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DD9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DD9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DDA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DDA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DDA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DDA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DDA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DDA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DDA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DDA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DDA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DDA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DDB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DDB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DDB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DDB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DDB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DDB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DDB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DDB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DDB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DDB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DDC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DDC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DDC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DDC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DDC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DDC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DDC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DDC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DDC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DDC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DDD}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DDD}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DDD}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DDD}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DDD}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DDD}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DDD}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DDD}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DDD}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DDD}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DDE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DDE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DDE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DDE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DDE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DDE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DDE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DDE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DDE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DDE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DDF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DDF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DDF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DDF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DDF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DDF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DDF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DDF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DDF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DDF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE6}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE6}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE6}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE6}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE6}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE6}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE6}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE6}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE6}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE6}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DE9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DE9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DE9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DE9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DE9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DE9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DE9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DE9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DE9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DE9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DEA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DEA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DEA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DEA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DEA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DEA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DEA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DEA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DEA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DEA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DEB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DEB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DEB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DEB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DEB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DEB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DEB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DEB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DEB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DEB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DEC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DEC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DEC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DEC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DEC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DEC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DEC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DEC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DEC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DEC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DED}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DED}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DED}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DED}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DED}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DED}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DED}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DED}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DED}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DED}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DEE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DEE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DEE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DEE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DEE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DEE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DEE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DEE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DEE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DEE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DEF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DEF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DEF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DEF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DEF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DEF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DEF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DEF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DEF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DEF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DF0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DF0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DF0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DF0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DF0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DF0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DF0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DF0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DF0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DF0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DF1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DF1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DF1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DF1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DF1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DF1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DF1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DF1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DF1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DF1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DF2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DF2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DF2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DF2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DF2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DF2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DF2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DF2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DF2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DF2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DF3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DF3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DF3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DF3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DF3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DF3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DF3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DF3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DF3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DF3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DF4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DF4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DF4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DF4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DF4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DF4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DF4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DF4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DF4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DF4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DF5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DF5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DF5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DF5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DF5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DF5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DF5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DF5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DF5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DF5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DFB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DFB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DFB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DFB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DFB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DFB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DFB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DFB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DFB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DFB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035D}\u{035C}\u{0315}\u{1DFC}\u{0062}", - nfc: "\u{0061}\u{0315}\u{035C}\u{1DFC}\u{035D}\u{0062}", - nfd: "\u{0061}\u{0315}\u{035C}\u{1DFC}\u{035D}\u{0062}", - nfkc: "\u{0061}\u{0315}\u{035C}\u{1DFC}\u{035D}\u{0062}", - nfkd: "\u{0061}\u{0315}\u{035C}\u{1DFC}\u{035D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DFC}\u{035D}\u{035C}\u{0315}\u{0062}", - nfc: "\u{0061}\u{0315}\u{1DFC}\u{035C}\u{035D}\u{0062}", - nfd: "\u{0061}\u{0315}\u{1DFC}\u{035C}\u{035D}\u{0062}", - nfkc: "\u{0061}\u{0315}\u{1DFC}\u{035C}\u{035D}\u{0062}", - nfkd: "\u{0061}\u{0315}\u{1DFC}\u{035C}\u{035D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1DFD}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1DFD}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1DFD}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1DFD}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1DFD}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DFD}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1DFD}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1DFD}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1DFD}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1DFD}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1DFE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1DFE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1DFE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1DFE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1DFE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DFE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1DFE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1DFE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1DFE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1DFE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1DFF}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1DFF}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1DFF}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1DFF}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1DFF}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1DFF}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1DFF}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1DFF}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1DFF}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1DFF}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20D0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20D0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20D0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20D0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20D0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20D0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20D0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20D0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20D0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20D1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20D1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20D1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20D1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20D1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20D1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20D1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20D1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20D1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{20D2}\u{0062}", - nfc: "\u{0061}\u{0334}\u{20D2}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{20D2}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{20D2}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{20D2}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D2}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{20D2}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{20D2}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{20D2}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{20D2}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{20D3}\u{0062}", - nfc: "\u{0061}\u{0334}\u{20D3}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{20D3}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{20D3}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{20D3}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D3}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{20D3}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{20D3}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{20D3}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{20D3}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20D4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20D4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20D4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20D4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20D4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20D4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20D4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20D4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20D4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20D5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20D5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20D5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20D5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20D5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20D5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20D5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20D5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20D5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20D6}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20D6}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20D6}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20D6}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20D6}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D6}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20D6}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20D6}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20D6}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20D6}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20D7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20D7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20D7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20D7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20D7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20D7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20D7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20D7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20D7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{20D8}\u{0062}", - nfc: "\u{0061}\u{0334}\u{20D8}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{20D8}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{20D8}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{20D8}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D8}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{20D8}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{20D8}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{20D8}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{20D8}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{20D9}\u{0062}", - nfc: "\u{0061}\u{0334}\u{20D9}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{20D9}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{20D9}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{20D9}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20D9}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{20D9}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{20D9}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{20D9}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{20D9}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{20DA}\u{0062}", - nfc: "\u{0061}\u{0334}\u{20DA}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{20DA}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{20DA}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{20DA}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20DA}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{20DA}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{20DA}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{20DA}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{20DA}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20DB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20DB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20DB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20DB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20DB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20DB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20DB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20DB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20DB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20DB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20DC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20DC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20DC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20DC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20DC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20DC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20DC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20DC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20DC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20DC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20E1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20E1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20E1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20E1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20E1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20E1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20E1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20E1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20E1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20E1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{20E5}\u{0062}", - nfc: "\u{0061}\u{0334}\u{20E5}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{20E5}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{20E5}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{20E5}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20E5}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{20E5}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{20E5}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{20E5}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{20E5}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{20E6}\u{0062}", - nfc: "\u{0061}\u{0334}\u{20E6}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{20E6}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{20E6}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{20E6}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20E6}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{20E6}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{20E6}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{20E6}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{20E6}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20E7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20E7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20E7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20E7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20E7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20E7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20E7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20E7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20E7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20E7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{20E8}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{20E8}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{20E8}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{20E8}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{20E8}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20E8}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{20E8}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{20E8}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{20E8}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{20E8}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20E9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20E9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20E9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20E9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20E9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20E9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20E9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20E9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20E9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20E9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{20EA}\u{0062}", - nfc: "\u{0061}\u{0334}\u{20EA}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{20EA}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{20EA}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{20EA}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20EA}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{20EA}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{20EA}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{20EA}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{20EA}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{20EB}\u{0062}", - nfc: "\u{0061}\u{0334}\u{20EB}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{20EB}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{20EB}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{20EB}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20EB}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{20EB}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{20EB}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{20EB}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{20EB}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{20EC}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{20EC}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{20EC}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{20EC}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{20EC}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20EC}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{20EC}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{20EC}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{20EC}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{20EC}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{20ED}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{20ED}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{20ED}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{20ED}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{20ED}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20ED}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{20ED}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{20ED}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{20ED}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{20ED}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{20EE}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{20EE}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{20EE}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{20EE}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{20EE}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20EE}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{20EE}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{20EE}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{20EE}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{20EE}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{20EF}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{20EF}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{20EF}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{20EF}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{20EF}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20EF}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{20EF}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{20EF}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{20EF}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{20EF}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{20F0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{20F0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{20F0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{20F0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{20F0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{20F0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{20F0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{20F0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{20F0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{20F0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2CEF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2CEF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2CEF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2CEF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2CEF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2CEF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2CEF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2CEF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2CEF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2CEF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2CF0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2CF0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2CF0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2CF0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2CF0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2CF0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2CF0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2CF0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2CF0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2CF0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2CF1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2CF1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2CF1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2CF1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2CF1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2CF1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2CF1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2CF1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2CF1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2CF1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{2D7F}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{2D7F}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{2D7F}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{2D7F}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{2D7F}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2D7F}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{2D7F}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{2D7F}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{2D7F}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{2D7F}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE6}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE6}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE6}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE6}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE6}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE6}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE6}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE6}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE6}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE6}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DE9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DE9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DE9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DE9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DE9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DE9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DE9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DE9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DE9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DE9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DEA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DEA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DEA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DEA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DEA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DEA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DEA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DEA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DEA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DEA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DEB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DEB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DEB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DEB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DEB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DEB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DEB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DEB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DEB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DEB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DEC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DEC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DEC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DEC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DEC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DEC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DEC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DEC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DEC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DEC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DED}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DED}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DED}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DED}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DED}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DED}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DED}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DED}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DED}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DED}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DEE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DEE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DEE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DEE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DEE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DEE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DEE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DEE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DEE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DEE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DEF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DEF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DEF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DEF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DEF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DEF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DEF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DEF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DEF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DEF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF6}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF6}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF6}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF6}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF6}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF6}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF6}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF6}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF6}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF6}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DF9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DF9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DF9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DF9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DF9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DF9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DF9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DF9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DF9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DF9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DFA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DFA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DFA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DFA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DFA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DFA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DFA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DFA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DFA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DFA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DFB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DFB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DFB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DFB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DFB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DFB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DFB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DFB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DFB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DFB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DFC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DFC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DFC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DFC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DFC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DFC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DFC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DFC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DFC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DFC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DFD}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DFD}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DFD}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DFD}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DFD}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DFD}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DFD}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DFD}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DFD}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DFD}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DFE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DFE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DFE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DFE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DFE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DFE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DFE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DFE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DFE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DFE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{2DFF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{2DFF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{2DFF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{2DFF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{2DFF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{2DFF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{2DFF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{2DFF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{2DFF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{2DFF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0316}\u{302A}\u{031B}\u{302A}\u{0062}", - nfc: "\u{0061}\u{031B}\u{302A}\u{302A}\u{0316}\u{0062}", - nfd: "\u{0061}\u{031B}\u{302A}\u{302A}\u{0316}\u{0062}", - nfkc: "\u{0061}\u{031B}\u{302A}\u{302A}\u{0316}\u{0062}", - nfkd: "\u{0061}\u{031B}\u{302A}\u{302A}\u{0316}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{0316}\u{302A}\u{031B}\u{0062}", - nfc: "\u{0061}\u{031B}\u{302A}\u{302A}\u{0316}\u{0062}", - nfd: "\u{0061}\u{031B}\u{302A}\u{302A}\u{0316}\u{0062}", - nfkc: "\u{0061}\u{031B}\u{302A}\u{302A}\u{0316}\u{0062}", - nfkd: "\u{0061}\u{031B}\u{302A}\u{302A}\u{0316}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0300}\u{05AE}\u{1D16D}\u{302B}\u{0062}", - nfc: "\u{00E0}\u{1D16D}\u{05AE}\u{302B}\u{0062}", - nfd: "\u{0061}\u{1D16D}\u{05AE}\u{302B}\u{0300}\u{0062}", - nfkc: "\u{00E0}\u{1D16D}\u{05AE}\u{302B}\u{0062}", - nfkd: "\u{0061}\u{1D16D}\u{05AE}\u{302B}\u{0300}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302B}\u{0300}\u{05AE}\u{1D16D}\u{0062}", - nfc: "\u{00E0}\u{1D16D}\u{302B}\u{05AE}\u{0062}", - nfd: "\u{0061}\u{1D16D}\u{302B}\u{05AE}\u{0300}\u{0062}", - nfkc: "\u{00E0}\u{1D16D}\u{302B}\u{05AE}\u{0062}", - nfkd: "\u{0061}\u{1D16D}\u{302B}\u{05AE}\u{0300}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{035C}\u{0315}\u{0300}\u{302C}\u{0062}", - nfc: "\u{00E0}\u{0315}\u{302C}\u{035C}\u{0062}", - nfd: "\u{0061}\u{0300}\u{0315}\u{302C}\u{035C}\u{0062}", - nfkc: "\u{00E0}\u{0315}\u{302C}\u{035C}\u{0062}", - nfkd: "\u{0061}\u{0300}\u{0315}\u{302C}\u{035C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302C}\u{035C}\u{0315}\u{0300}\u{0062}", - nfc: "\u{00E0}\u{302C}\u{0315}\u{035C}\u{0062}", - nfd: "\u{0061}\u{0300}\u{302C}\u{0315}\u{035C}\u{0062}", - nfkc: "\u{00E0}\u{302C}\u{0315}\u{035C}\u{0062}", - nfkd: "\u{0061}\u{0300}\u{302C}\u{0315}\u{035C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302E}\u{059A}\u{0316}\u{302D}\u{0062}", - nfc: "\u{0061}\u{0316}\u{059A}\u{302D}\u{302E}\u{0062}", - nfd: "\u{0061}\u{0316}\u{059A}\u{302D}\u{302E}\u{0062}", - nfkc: "\u{0061}\u{0316}\u{059A}\u{302D}\u{302E}\u{0062}", - nfkd: "\u{0061}\u{0316}\u{059A}\u{302D}\u{302E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302D}\u{302E}\u{059A}\u{0316}\u{0062}", - nfc: "\u{0061}\u{0316}\u{302D}\u{059A}\u{302E}\u{0062}", - nfd: "\u{0061}\u{0316}\u{302D}\u{059A}\u{302E}\u{0062}", - nfkc: "\u{0061}\u{0316}\u{302D}\u{059A}\u{302E}\u{0062}", - nfkd: "\u{0061}\u{0316}\u{302D}\u{059A}\u{302E}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D16D}\u{302E}\u{059A}\u{302E}\u{0062}", - nfc: "\u{0061}\u{059A}\u{302E}\u{302E}\u{1D16D}\u{0062}", - nfd: "\u{0061}\u{059A}\u{302E}\u{302E}\u{1D16D}\u{0062}", - nfkc: "\u{0061}\u{059A}\u{302E}\u{302E}\u{1D16D}\u{0062}", - nfkd: "\u{0061}\u{059A}\u{302E}\u{302E}\u{1D16D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302E}\u{1D16D}\u{302E}\u{059A}\u{0062}", - nfc: "\u{0061}\u{059A}\u{302E}\u{302E}\u{1D16D}\u{0062}", - nfd: "\u{0061}\u{059A}\u{302E}\u{302E}\u{1D16D}\u{0062}", - nfkc: "\u{0061}\u{059A}\u{302E}\u{302E}\u{1D16D}\u{0062}", - nfkd: "\u{0061}\u{059A}\u{302E}\u{302E}\u{1D16D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D16D}\u{302E}\u{059A}\u{302F}\u{0062}", - nfc: "\u{0061}\u{059A}\u{302E}\u{302F}\u{1D16D}\u{0062}", - nfd: "\u{0061}\u{059A}\u{302E}\u{302F}\u{1D16D}\u{0062}", - nfkc: "\u{0061}\u{059A}\u{302E}\u{302F}\u{1D16D}\u{0062}", - nfkd: "\u{0061}\u{059A}\u{302E}\u{302F}\u{1D16D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302F}\u{1D16D}\u{302E}\u{059A}\u{0062}", - nfc: "\u{0061}\u{059A}\u{302F}\u{302E}\u{1D16D}\u{0062}", - nfd: "\u{0061}\u{059A}\u{302F}\u{302E}\u{1D16D}\u{0062}", - nfkc: "\u{0061}\u{059A}\u{302F}\u{302E}\u{1D16D}\u{0062}", - nfkd: "\u{0061}\u{059A}\u{302F}\u{302E}\u{1D16D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{094D}\u{3099}\u{093C}\u{3099}\u{0062}", - nfc: "\u{0061}\u{093C}\u{3099}\u{3099}\u{094D}\u{0062}", - nfd: "\u{0061}\u{093C}\u{3099}\u{3099}\u{094D}\u{0062}", - nfkc: "\u{0061}\u{093C}\u{3099}\u{3099}\u{094D}\u{0062}", - nfkd: "\u{0061}\u{093C}\u{3099}\u{3099}\u{094D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{094D}\u{3099}\u{093C}\u{0062}", - nfc: "\u{0061}\u{093C}\u{3099}\u{3099}\u{094D}\u{0062}", - nfd: "\u{0061}\u{093C}\u{3099}\u{3099}\u{094D}\u{0062}", - nfkc: "\u{0061}\u{093C}\u{3099}\u{3099}\u{094D}\u{0062}", - nfkd: "\u{0061}\u{093C}\u{3099}\u{3099}\u{094D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{094D}\u{3099}\u{093C}\u{309A}\u{0062}", - nfc: "\u{0061}\u{093C}\u{3099}\u{309A}\u{094D}\u{0062}", - nfd: "\u{0061}\u{093C}\u{3099}\u{309A}\u{094D}\u{0062}", - nfkc: "\u{0061}\u{093C}\u{3099}\u{309A}\u{094D}\u{0062}", - nfkd: "\u{0061}\u{093C}\u{3099}\u{309A}\u{094D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{309A}\u{094D}\u{3099}\u{093C}\u{0062}", - nfc: "\u{0061}\u{093C}\u{309A}\u{3099}\u{094D}\u{0062}", - nfd: "\u{0061}\u{093C}\u{309A}\u{3099}\u{094D}\u{0062}", - nfkc: "\u{0061}\u{093C}\u{309A}\u{3099}\u{094D}\u{0062}", - nfkd: "\u{0061}\u{093C}\u{309A}\u{3099}\u{094D}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A66F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A66F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A66F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A66F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A66F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A66F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A66F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A66F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A66F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A66F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A674}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A674}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A674}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A674}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A674}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A674}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A674}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A674}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A674}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A674}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A675}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A675}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A675}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A675}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A675}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A675}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A675}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A675}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A675}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A675}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A676}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A676}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A676}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A676}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A676}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A676}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A676}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A676}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A676}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A676}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A677}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A677}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A677}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A677}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A677}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A677}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A677}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A677}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A677}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A677}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A678}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A678}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A678}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A678}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A678}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A678}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A678}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A678}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A678}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A678}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A679}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A679}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A679}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A679}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A679}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A679}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A679}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A679}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A679}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A679}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A67A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A67A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A67A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A67A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A67A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A67A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A67A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A67A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A67A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A67A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A67B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A67B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A67B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A67B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A67B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A67B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A67B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A67B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A67B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A67B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A67C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A67C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A67C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A67C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A67C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A67C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A67C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A67C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A67C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A67C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A67D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A67D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A67D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A67D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A67D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A67D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A67D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A67D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A67D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A67D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A69E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A69E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A69E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A69E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A69E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A69E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A69E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A69E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A69E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A69E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A69F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A69F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A69F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A69F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A69F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A69F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A69F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A69F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A69F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A69F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A6F0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A6F0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A6F0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A6F0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A6F0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A6F0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A6F0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A6F0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A6F0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A6F0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A6F1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A6F1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A6F1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A6F1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A6F1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A6F1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A6F1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A6F1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A6F1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A6F1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{A806}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{A806}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{A806}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{A806}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{A806}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A806}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{A806}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{A806}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{A806}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{A806}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{A8C4}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{A8C4}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{A8C4}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{A8C4}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{A8C4}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8C4}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{A8C4}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{A8C4}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{A8C4}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{A8C4}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E4}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E4}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E4}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E4}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E4}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E4}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E4}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E4}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E4}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E4}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E6}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E6}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E6}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E6}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E6}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E6}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E6}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E6}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E6}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E6}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8E9}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8E9}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8E9}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8E9}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8E9}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8E9}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8E9}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8E9}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8E9}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8E9}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8EA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8EA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8EA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8EA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8EA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8EA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8EA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8EA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8EA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8EA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8EB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8EB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8EB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8EB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8EB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8EB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8EB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8EB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8EB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8EB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8EC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8EC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8EC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8EC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8EC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8EC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8EC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8EC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8EC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8EC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8ED}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8ED}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8ED}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8ED}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8ED}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8ED}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8ED}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8ED}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8ED}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8ED}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8EE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8EE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8EE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8EE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8EE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8EE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8EE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8EE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8EE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8EE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8EF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8EF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8EF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8EF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8EF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8EF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8EF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8EF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8EF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8EF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8F0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8F0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8F0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8F0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8F0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8F0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8F0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8F0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8F0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8F0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{A8F1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{A8F1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{A8F1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{A8F1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{A8F1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A8F1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{A8F1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{A8F1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{A8F1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{A8F1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{A92B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{A92B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{A92B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{A92B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{A92B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A92B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{A92B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{A92B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{A92B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{A92B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{A92C}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{A92C}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{A92C}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{A92C}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{A92C}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A92C}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{A92C}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{A92C}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{A92C}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{A92C}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{A92D}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{A92D}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{A92D}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{A92D}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{A92D}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A92D}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{A92D}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{A92D}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{A92D}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{A92D}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{A953}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{A953}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{A953}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{A953}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{A953}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A953}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{A953}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{A953}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{A953}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{A953}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{A9B3}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{A9B3}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{A9B3}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{A9B3}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{A9B3}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A9B3}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{A9B3}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{A9B3}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{A9B3}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{A9B3}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{A9C0}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{A9C0}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{A9C0}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{A9C0}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{A9C0}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{A9C0}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{A9C0}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{A9C0}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{A9C0}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{A9C0}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{AAB0}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{AAB0}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{AAB0}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{AAB0}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{AAB0}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AAB0}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{AAB0}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{AAB0}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{AAB0}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{AAB0}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{AAB2}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{AAB2}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{AAB2}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{AAB2}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{AAB2}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AAB2}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{AAB2}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{AAB2}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{AAB2}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{AAB2}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{AAB3}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{AAB3}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{AAB3}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{AAB3}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{AAB3}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AAB3}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{AAB3}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{AAB3}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{AAB3}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{AAB3}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{AAB4}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{AAB4}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{AAB4}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{AAB4}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{AAB4}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AAB4}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{AAB4}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{AAB4}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{AAB4}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{AAB4}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{AAB7}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{AAB7}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{AAB7}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{AAB7}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{AAB7}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AAB7}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{AAB7}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{AAB7}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{AAB7}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{AAB7}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{AAB8}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{AAB8}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{AAB8}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{AAB8}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{AAB8}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AAB8}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{AAB8}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{AAB8}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{AAB8}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{AAB8}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{AABE}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{AABE}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{AABE}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{AABE}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{AABE}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AABE}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{AABE}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{AABE}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{AABE}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{AABE}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{AABF}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{AABF}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{AABF}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{AABF}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{AABF}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AABF}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{AABF}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{AABF}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{AABF}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{AABF}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{AAC1}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{AAC1}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{AAC1}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{AAC1}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{AAC1}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AAC1}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{AAC1}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{AAC1}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{AAC1}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{AAC1}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{AAF6}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{AAF6}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{AAF6}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{AAF6}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{AAF6}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{AAF6}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{AAF6}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{AAF6}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{AAF6}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{AAF6}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{ABED}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{ABED}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{ABED}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{ABED}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{ABED}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{ABED}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{ABED}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{ABED}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{ABED}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{ABED}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{064B}\u{FB1E}\u{05C2}\u{FB1E}\u{0062}", - nfc: "\u{0061}\u{05C2}\u{FB1E}\u{FB1E}\u{064B}\u{0062}", - nfd: "\u{0061}\u{05C2}\u{FB1E}\u{FB1E}\u{064B}\u{0062}", - nfkc: "\u{0061}\u{05C2}\u{FB1E}\u{FB1E}\u{064B}\u{0062}", - nfkd: "\u{0061}\u{05C2}\u{FB1E}\u{FB1E}\u{064B}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FB1E}\u{064B}\u{FB1E}\u{05C2}\u{0062}", - nfc: "\u{0061}\u{05C2}\u{FB1E}\u{FB1E}\u{064B}\u{0062}", - nfd: "\u{0061}\u{05C2}\u{FB1E}\u{FB1E}\u{064B}\u{0062}", - nfkc: "\u{0061}\u{05C2}\u{FB1E}\u{FB1E}\u{064B}\u{0062}", - nfkd: "\u{0061}\u{05C2}\u{FB1E}\u{FB1E}\u{064B}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{FE20}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{FE20}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{FE20}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{FE20}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{FE20}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE20}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{FE20}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{FE20}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{FE20}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{FE20}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{FE21}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{FE21}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{FE21}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{FE21}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{FE21}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE21}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{FE21}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{FE21}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{FE21}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{FE21}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{FE22}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{FE22}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{FE22}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{FE22}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{FE22}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE22}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{FE22}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{FE22}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{FE22}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{FE22}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{FE23}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{FE23}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{FE23}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{FE23}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{FE23}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE23}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{FE23}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{FE23}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{FE23}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{FE23}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{FE24}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{FE24}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{FE24}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{FE24}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{FE24}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE24}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{FE24}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{FE24}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{FE24}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{FE24}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{FE25}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{FE25}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{FE25}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{FE25}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{FE25}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE25}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{FE25}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{FE25}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{FE25}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{FE25}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{FE26}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{FE26}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{FE26}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{FE26}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{FE26}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE26}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{FE26}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{FE26}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{FE26}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{FE26}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{FE27}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{FE27}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{FE27}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{FE27}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{FE27}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE27}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{FE27}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{FE27}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{FE27}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{FE27}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{FE28}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{FE28}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{FE28}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{FE28}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{FE28}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE28}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{FE28}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{FE28}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{FE28}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{FE28}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{FE29}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{FE29}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{FE29}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{FE29}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{FE29}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE29}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{FE29}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{FE29}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{FE29}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{FE29}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{FE2A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{FE2A}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{FE2A}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{FE2A}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{FE2A}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE2A}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{FE2A}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{FE2A}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{FE2A}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{FE2A}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{FE2B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{FE2B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{FE2B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{FE2B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{FE2B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE2B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{FE2B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{FE2B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{FE2B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{FE2B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{FE2C}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{FE2C}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{FE2C}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{FE2C}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{FE2C}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE2C}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{FE2C}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{FE2C}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{FE2C}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{FE2C}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{FE2D}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{FE2D}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{FE2D}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{FE2D}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{FE2D}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE2D}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{FE2D}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{FE2D}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{FE2D}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{FE2D}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{FE2E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{FE2E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{FE2E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{FE2E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{FE2E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE2E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{FE2E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{FE2E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{FE2E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{FE2E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{FE2F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{FE2F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{FE2F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{FE2F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{FE2F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{FE2F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{FE2F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{FE2F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{FE2F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{FE2F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{101FD}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{101FD}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{101FD}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{101FD}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{101FD}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{101FD}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{101FD}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{101FD}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{101FD}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{101FD}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{102E0}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{102E0}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{102E0}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{102E0}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{102E0}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{102E0}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{102E0}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{102E0}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{102E0}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{102E0}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{10376}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{10376}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{10376}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{10376}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{10376}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10376}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{10376}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{10376}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{10376}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{10376}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{10377}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{10377}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{10377}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{10377}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{10377}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10377}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{10377}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{10377}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{10377}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{10377}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{10378}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{10378}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{10378}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{10378}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{10378}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10378}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{10378}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{10378}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{10378}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{10378}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{10379}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{10379}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{10379}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{10379}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{10379}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10379}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{10379}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{10379}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{10379}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{10379}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1037A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1037A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1037A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1037A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1037A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1037A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1037A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1037A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1037A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1037A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{10A0D}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{10A0D}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{10A0D}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{10A0D}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{10A0D}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10A0D}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{10A0D}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{10A0D}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{10A0D}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{10A0D}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{10A0F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{10A0F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{10A0F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{10A0F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{10A0F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10A0F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{10A0F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{10A0F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{10A0F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{10A0F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{10A38}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{10A38}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{10A38}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{10A38}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{10A38}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10A38}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{10A38}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{10A38}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{10A38}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{10A38}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{10A39}\u{0062}", - nfc: "\u{0061}\u{0334}\u{10A39}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{10A39}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{10A39}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{10A39}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10A39}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{10A39}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{10A39}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{10A39}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{10A39}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{10A3A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{10A3A}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{10A3A}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{10A3A}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{10A3A}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10A3A}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{10A3A}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{10A3A}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{10A3A}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{10A3A}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{10A3F}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{10A3F}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{10A3F}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{10A3F}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{10A3F}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10A3F}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{10A3F}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{10A3F}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{10A3F}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{10A3F}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{10AE5}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{10AE5}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{10AE5}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{10AE5}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{10AE5}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10AE5}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{10AE5}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{10AE5}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{10AE5}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{10AE5}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{10AE6}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{10AE6}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{10AE6}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{10AE6}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{10AE6}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{10AE6}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{10AE6}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{10AE6}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{10AE6}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{10AE6}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{11046}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{11046}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{11046}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{11046}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{11046}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11046}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{11046}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{11046}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{11046}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{11046}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1107F}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1107F}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1107F}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1107F}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1107F}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1107F}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1107F}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1107F}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1107F}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1107F}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{110B9}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{110B9}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{110B9}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{110B9}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{110B9}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{110B9}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{110B9}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{110B9}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{110B9}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{110B9}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{110BA}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{110BA}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{110BA}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{110BA}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{110BA}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{110BA}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{110BA}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{110BA}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{110BA}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{110BA}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11100}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11100}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11100}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11100}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11100}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11100}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11100}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11100}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11100}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11100}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11101}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11101}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11101}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11101}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11101}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11101}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11101}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11101}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11101}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11101}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11102}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11102}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11102}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11102}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11102}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11102}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11102}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11102}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11102}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11102}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{11133}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{11133}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{11133}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{11133}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{11133}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11133}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{11133}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{11133}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{11133}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{11133}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{11134}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{11134}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{11134}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{11134}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{11134}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11134}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{11134}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{11134}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{11134}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{11134}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{11173}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{11173}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{11173}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{11173}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{11173}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11173}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{11173}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{11173}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{11173}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{11173}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{111C0}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{111C0}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{111C0}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{111C0}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{111C0}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{111C0}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{111C0}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{111C0}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{111C0}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{111C0}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{111CA}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{111CA}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{111CA}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{111CA}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{111CA}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{111CA}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{111CA}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{111CA}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{111CA}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{111CA}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{11235}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{11235}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{11235}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{11235}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{11235}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11235}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{11235}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{11235}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{11235}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{11235}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{11236}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{11236}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{11236}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{11236}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{11236}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11236}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{11236}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{11236}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{11236}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{11236}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{112E9}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{112E9}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{112E9}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{112E9}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{112E9}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{112E9}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{112E9}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{112E9}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{112E9}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{112E9}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{112EA}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{112EA}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{112EA}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{112EA}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{112EA}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{112EA}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{112EA}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{112EA}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{112EA}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{112EA}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{1133C}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{1133C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{1133C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{1133C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{1133C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1133C}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1133C}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1133C}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1133C}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1133C}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1134D}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1134D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1134D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1134D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1134D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1134D}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1134D}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1134D}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1134D}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1134D}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11366}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11366}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11366}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11366}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11366}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11366}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11366}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11366}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11366}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11366}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11367}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11367}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11367}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11367}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11367}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11367}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11367}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11367}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11367}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11367}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11368}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11368}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11368}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11368}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11368}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11368}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11368}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11368}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11368}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11368}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11369}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11369}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11369}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11369}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11369}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11369}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11369}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11369}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11369}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11369}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1136A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1136A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1136A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1136A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1136A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1136A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1136A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1136A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1136A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1136A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1136B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1136B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1136B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1136B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1136B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1136B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1136B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1136B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1136B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1136B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1136C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1136C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1136C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1136C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1136C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1136C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1136C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1136C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1136C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1136C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11370}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11370}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11370}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11370}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11370}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11370}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11370}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11370}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11370}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11370}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11371}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11371}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11371}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11371}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11371}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11371}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11371}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11371}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11371}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11371}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11372}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11372}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11372}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11372}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11372}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11372}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11372}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11372}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11372}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11372}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11373}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11373}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11373}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11373}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11373}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11373}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11373}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11373}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11373}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11373}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{11374}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{11374}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{11374}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{11374}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{11374}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11374}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{11374}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{11374}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{11374}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{11374}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{11442}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{11442}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{11442}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{11442}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{11442}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11442}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{11442}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{11442}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{11442}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{11442}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{11446}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{11446}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{11446}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{11446}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{11446}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11446}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{11446}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{11446}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{11446}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{11446}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{114C2}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{114C2}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{114C2}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{114C2}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{114C2}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{114C2}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{114C2}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{114C2}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{114C2}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{114C2}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{114C3}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{114C3}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{114C3}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{114C3}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{114C3}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{114C3}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{114C3}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{114C3}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{114C3}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{114C3}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{115BF}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{115BF}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{115BF}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{115BF}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{115BF}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{115BF}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{115BF}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{115BF}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{115BF}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{115BF}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{115C0}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{115C0}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{115C0}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{115C0}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{115C0}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{115C0}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{115C0}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{115C0}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{115C0}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{115C0}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1163F}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1163F}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1163F}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1163F}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1163F}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1163F}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1163F}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1163F}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1163F}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1163F}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{116B6}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{116B6}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{116B6}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{116B6}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{116B6}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{116B6}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{116B6}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{116B6}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{116B6}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{116B6}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{116B7}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{116B7}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{116B7}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{116B7}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{116B7}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{116B7}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{116B7}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{116B7}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{116B7}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{116B7}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{1172B}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{1172B}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{1172B}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{1172B}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{1172B}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1172B}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{1172B}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{1172B}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{1172B}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{1172B}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05B0}\u{094D}\u{3099}\u{11C3F}\u{0062}", - nfc: "\u{0061}\u{3099}\u{094D}\u{11C3F}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{094D}\u{11C3F}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{094D}\u{11C3F}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{094D}\u{11C3F}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{11C3F}\u{05B0}\u{094D}\u{3099}\u{0062}", - nfc: "\u{0061}\u{3099}\u{11C3F}\u{094D}\u{05B0}\u{0062}", - nfd: "\u{0061}\u{3099}\u{11C3F}\u{094D}\u{05B0}\u{0062}", - nfkc: "\u{0061}\u{3099}\u{11C3F}\u{094D}\u{05B0}\u{0062}", - nfkd: "\u{0061}\u{3099}\u{11C3F}\u{094D}\u{05B0}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{16AF0}\u{0062}", - nfc: "\u{0061}\u{0334}\u{16AF0}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{16AF0}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{16AF0}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{16AF0}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16AF0}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{16AF0}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{16AF0}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{16AF0}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{16AF0}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{16AF1}\u{0062}", - nfc: "\u{0061}\u{0334}\u{16AF1}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{16AF1}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{16AF1}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{16AF1}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16AF1}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{16AF1}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{16AF1}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{16AF1}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{16AF1}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{16AF2}\u{0062}", - nfc: "\u{0061}\u{0334}\u{16AF2}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{16AF2}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{16AF2}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{16AF2}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16AF2}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{16AF2}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{16AF2}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{16AF2}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{16AF2}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{16AF3}\u{0062}", - nfc: "\u{0061}\u{0334}\u{16AF3}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{16AF3}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{16AF3}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{16AF3}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16AF3}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{16AF3}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{16AF3}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{16AF3}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{16AF3}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{16AF4}\u{0062}", - nfc: "\u{0061}\u{0334}\u{16AF4}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{16AF4}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{16AF4}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{16AF4}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16AF4}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{16AF4}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{16AF4}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{16AF4}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{16AF4}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{16B30}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{16B30}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{16B30}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{16B30}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{16B30}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16B30}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{16B30}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{16B30}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{16B30}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{16B30}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{16B31}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{16B31}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{16B31}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{16B31}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{16B31}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16B31}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{16B31}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{16B31}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{16B31}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{16B31}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{16B32}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{16B32}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{16B32}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{16B32}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{16B32}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16B32}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{16B32}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{16B32}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{16B32}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{16B32}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{16B33}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{16B33}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{16B33}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{16B33}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{16B33}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16B33}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{16B33}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{16B33}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{16B33}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{16B33}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{16B34}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{16B34}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{16B34}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{16B34}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{16B34}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16B34}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{16B34}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{16B34}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{16B34}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{16B34}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{16B35}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{16B35}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{16B35}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{16B35}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{16B35}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16B35}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{16B35}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{16B35}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{16B35}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{16B35}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{16B36}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{16B36}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{16B36}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{16B36}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{16B36}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{16B36}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{16B36}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{16B36}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{16B36}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{16B36}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1BC9E}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1BC9E}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1BC9E}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1BC9E}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1BC9E}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1BC9E}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1BC9E}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1BC9E}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1BC9E}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1BC9E}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{031B}\u{1DCE}\u{1D165}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{1D165}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{1D165}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{1D165}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{1D165}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D165}\u{302A}\u{031B}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{1D165}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{1D165}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{1D165}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{1D165}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{031B}\u{1DCE}\u{1D166}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{1D166}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{1D166}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{1D166}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{1D166}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D166}\u{302A}\u{031B}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{1D166}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{1D166}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{1D166}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{1D166}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1D167}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1D167}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1D167}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1D167}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1D167}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D167}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1D167}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1D167}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1D167}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1D167}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1D168}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1D168}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1D168}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1D168}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1D168}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D168}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1D168}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1D168}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1D168}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1D168}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{093C}\u{0334}\u{1D169}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1D169}\u{093C}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1D169}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1D169}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1D169}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D169}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{1D169}\u{0334}\u{093C}\u{0062}", - nfd: "\u{0061}\u{1D169}\u{0334}\u{093C}\u{0062}", - nfkc: "\u{0061}\u{1D169}\u{0334}\u{093C}\u{0062}", - nfkd: "\u{0061}\u{1D169}\u{0334}\u{093C}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{05AE}\u{1D16D}\u{302E}\u{1D16D}\u{0062}", - nfc: "\u{0061}\u{302E}\u{1D16D}\u{1D16D}\u{05AE}\u{0062}", - nfd: "\u{0061}\u{302E}\u{1D16D}\u{1D16D}\u{05AE}\u{0062}", - nfkc: "\u{0061}\u{302E}\u{1D16D}\u{1D16D}\u{05AE}\u{0062}", - nfkd: "\u{0061}\u{302E}\u{1D16D}\u{1D16D}\u{05AE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D16D}\u{05AE}\u{1D16D}\u{302E}\u{0062}", - nfc: "\u{0061}\u{302E}\u{1D16D}\u{1D16D}\u{05AE}\u{0062}", - nfd: "\u{0061}\u{302E}\u{1D16D}\u{1D16D}\u{05AE}\u{0062}", - nfkc: "\u{0061}\u{302E}\u{1D16D}\u{1D16D}\u{05AE}\u{0062}", - nfkd: "\u{0061}\u{302E}\u{1D16D}\u{1D16D}\u{05AE}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{031B}\u{1DCE}\u{1D16E}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{1D16E}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{1D16E}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{1D16E}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{1D16E}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D16E}\u{302A}\u{031B}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{1D16E}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{1D16E}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{1D16E}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{1D16E}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{031B}\u{1DCE}\u{1D16F}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{1D16F}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{1D16F}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{1D16F}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{1D16F}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D16F}\u{302A}\u{031B}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{1D16F}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{1D16F}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{1D16F}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{1D16F}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{031B}\u{1DCE}\u{1D170}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{1D170}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{1D170}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{1D170}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{1D170}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D170}\u{302A}\u{031B}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{1D170}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{1D170}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{1D170}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{1D170}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{031B}\u{1DCE}\u{1D171}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{1D171}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{1D171}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{1D171}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{1D171}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D171}\u{302A}\u{031B}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{1D171}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{1D171}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{1D171}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{1D171}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{302A}\u{031B}\u{1DCE}\u{1D172}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{031B}\u{1D172}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{031B}\u{1D172}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{031B}\u{1D172}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{031B}\u{1D172}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D172}\u{302A}\u{031B}\u{1DCE}\u{0062}", - nfc: "\u{0061}\u{1DCE}\u{1D172}\u{031B}\u{302A}\u{0062}", - nfd: "\u{0061}\u{1DCE}\u{1D172}\u{031B}\u{302A}\u{0062}", - nfkc: "\u{0061}\u{1DCE}\u{1D172}\u{031B}\u{302A}\u{0062}", - nfkd: "\u{0061}\u{1DCE}\u{1D172}\u{031B}\u{302A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D17B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D17B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D17B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D17B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D17B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D17B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D17B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D17B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D17B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D17B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D17C}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D17C}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D17C}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D17C}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D17C}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D17C}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D17C}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D17C}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D17C}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D17C}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D17D}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D17D}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D17D}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D17D}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D17D}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D17D}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D17D}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D17D}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D17D}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D17D}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D17E}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D17E}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D17E}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D17E}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D17E}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D17E}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D17E}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D17E}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D17E}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D17E}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D17F}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D17F}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D17F}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D17F}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D17F}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D17F}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D17F}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D17F}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D17F}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D17F}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D180}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D180}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D180}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D180}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D180}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D180}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D180}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D180}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D180}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D180}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D181}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D181}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D181}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D181}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D181}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D181}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D181}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D181}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D181}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D181}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D182}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D182}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D182}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D182}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D182}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D182}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D182}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D182}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D182}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D182}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D185}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D185}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D185}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D185}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D185}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D185}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D185}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D185}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D185}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D185}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D186}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D186}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D186}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D186}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D186}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D186}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D186}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D186}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D186}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D186}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D187}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D187}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D187}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D187}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D187}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D187}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D187}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D187}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D187}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D187}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D188}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D188}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D188}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D188}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D188}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D188}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D188}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D188}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D188}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D188}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D189}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D189}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D189}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D189}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D189}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D189}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D189}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D189}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D189}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D189}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D18A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D18A}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D18A}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D18A}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D18A}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D18A}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D18A}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D18A}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D18A}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D18A}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1D18B}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1D18B}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1D18B}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1D18B}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1D18B}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D18B}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1D18B}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1D18B}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1D18B}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1D18B}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D1AA}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D1AA}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D1AA}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D1AA}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D1AA}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D1AA}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D1AA}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D1AA}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D1AA}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D1AA}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D1AB}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D1AB}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D1AB}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D1AB}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D1AB}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D1AB}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D1AB}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D1AB}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D1AB}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D1AB}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D1AC}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D1AC}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D1AC}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D1AC}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D1AC}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D1AC}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D1AC}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D1AC}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D1AC}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D1AC}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D1AD}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D1AD}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D1AD}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D1AD}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D1AD}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D1AD}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D1AD}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D1AD}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D1AD}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D1AD}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D242}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D242}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D242}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D242}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D242}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D242}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D242}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D242}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D242}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D242}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D243}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D243}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D243}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D243}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D243}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D243}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D243}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D243}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D243}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D243}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1D244}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1D244}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1D244}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1D244}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1D244}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1D244}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1D244}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1D244}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1D244}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1D244}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E000}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E000}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E000}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E000}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E000}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E000}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E000}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E000}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E000}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E000}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E001}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E001}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E001}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E001}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E001}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E001}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E001}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E001}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E001}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E001}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E002}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E002}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E002}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E002}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E002}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E002}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E002}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E002}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E002}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E002}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E003}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E003}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E003}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E003}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E003}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E003}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E003}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E003}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E003}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E003}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E004}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E004}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E004}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E004}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E004}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E004}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E004}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E004}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E004}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E004}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E005}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E005}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E005}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E005}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E005}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E005}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E005}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E005}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E005}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E005}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E006}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E006}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E006}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E006}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E006}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E006}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E006}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E006}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E006}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E006}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E008}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E008}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E008}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E008}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E008}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E008}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E008}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E008}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E008}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E008}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E009}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E009}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E009}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E009}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E009}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E009}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E009}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E009}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E009}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E009}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E00A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E00A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E00A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E00A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E00A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E00A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E00A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E00A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E00A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E00A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E00B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E00B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E00B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E00B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E00B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E00B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E00B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E00B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E00B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E00B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E00C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E00C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E00C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E00C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E00C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E00C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E00C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E00C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E00C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E00C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E00D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E00D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E00D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E00D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E00D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E00D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E00D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E00D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E00D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E00D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E00E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E00E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E00E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E00E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E00E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E00E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E00E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E00E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E00E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E00E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E00F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E00F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E00F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E00F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E00F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E00F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E00F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E00F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E00F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E00F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E010}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E010}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E010}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E010}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E010}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E010}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E010}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E010}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E010}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E010}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E011}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E011}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E011}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E011}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E011}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E011}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E011}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E011}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E011}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E011}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E012}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E012}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E012}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E012}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E012}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E012}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E012}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E012}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E012}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E012}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E013}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E013}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E013}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E013}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E013}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E013}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E013}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E013}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E013}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E013}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E014}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E014}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E014}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E014}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E014}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E014}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E014}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E014}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E014}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E014}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E015}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E015}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E015}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E015}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E015}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E015}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E015}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E015}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E015}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E015}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E016}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E016}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E016}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E016}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E016}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E016}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E016}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E016}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E016}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E016}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E017}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E017}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E017}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E017}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E017}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E017}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E017}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E017}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E017}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E017}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E018}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E018}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E018}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E018}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E018}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E018}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E018}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E018}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E018}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E018}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E01B}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E01B}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E01B}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E01B}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E01B}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E01B}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E01B}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E01B}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E01B}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E01B}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E01C}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E01C}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E01C}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E01C}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E01C}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E01C}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E01C}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E01C}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E01C}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E01C}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E01D}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E01D}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E01D}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E01D}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E01D}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E01D}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E01D}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E01D}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E01D}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E01D}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E01E}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E01E}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E01E}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E01E}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E01E}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E01E}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E01E}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E01E}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E01E}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E01E}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E01F}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E01F}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E01F}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E01F}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E01F}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E01F}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E01F}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E01F}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E01F}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E01F}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E020}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E020}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E020}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E020}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E020}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E020}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E020}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E020}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E020}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E020}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E021}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E021}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E021}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E021}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E021}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E021}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E021}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E021}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E021}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E021}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E023}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E023}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E023}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E023}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E023}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E023}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E023}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E023}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E023}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E023}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E024}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E024}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E024}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E024}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E024}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E024}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E024}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E024}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E024}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E024}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E026}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E026}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E026}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E026}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E026}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E026}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E026}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E026}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E026}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E026}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E027}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E027}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E027}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E027}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E027}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E027}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E027}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E027}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E027}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E027}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E028}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E028}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E028}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E028}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E028}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E028}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E028}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E028}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E028}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E028}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E029}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E029}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E029}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E029}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E029}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E029}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E029}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E029}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E029}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E029}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E02A}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E02A}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E02A}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E02A}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E02A}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E02A}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E02A}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E02A}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E02A}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E02A}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1E8D0}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1E8D0}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1E8D0}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1E8D0}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1E8D0}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E8D0}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1E8D0}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1E8D0}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1E8D0}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1E8D0}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1E8D1}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1E8D1}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1E8D1}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1E8D1}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1E8D1}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E8D1}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1E8D1}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1E8D1}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1E8D1}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1E8D1}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1E8D2}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1E8D2}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1E8D2}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1E8D2}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1E8D2}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E8D2}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1E8D2}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1E8D2}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1E8D2}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1E8D2}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1E8D3}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1E8D3}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1E8D3}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1E8D3}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1E8D3}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E8D3}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1E8D3}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1E8D3}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1E8D3}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1E8D3}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1E8D4}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1E8D4}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1E8D4}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1E8D4}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1E8D4}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E8D4}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1E8D4}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1E8D4}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1E8D4}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1E8D4}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1E8D5}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1E8D5}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1E8D5}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1E8D5}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1E8D5}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E8D5}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1E8D5}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1E8D5}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1E8D5}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1E8D5}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{059A}\u{0316}\u{302A}\u{1E8D6}\u{0062}", - nfc: "\u{0061}\u{302A}\u{0316}\u{1E8D6}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{0316}\u{1E8D6}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{0316}\u{1E8D6}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{0316}\u{1E8D6}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E8D6}\u{059A}\u{0316}\u{302A}\u{0062}", - nfc: "\u{0061}\u{302A}\u{1E8D6}\u{0316}\u{059A}\u{0062}", - nfd: "\u{0061}\u{302A}\u{1E8D6}\u{0316}\u{059A}\u{0062}", - nfkc: "\u{0061}\u{302A}\u{1E8D6}\u{0316}\u{059A}\u{0062}", - nfkd: "\u{0061}\u{302A}\u{1E8D6}\u{0316}\u{059A}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E944}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E944}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E944}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E944}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E944}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E944}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E944}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E944}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E944}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E944}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E945}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E945}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E945}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E945}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E945}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E945}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E945}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E945}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E945}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E945}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E946}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E946}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E946}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E946}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E946}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E946}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E946}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E946}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E946}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E946}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E947}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E947}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E947}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E947}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E947}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E947}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E947}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E947}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E947}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E947}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E948}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E948}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E948}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E948}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E948}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E948}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E948}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E948}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E948}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E948}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{0315}\u{0300}\u{05AE}\u{1E949}\u{0062}", - nfc: "\u{00E0}\u{05AE}\u{1E949}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{0300}\u{1E949}\u{0315}\u{0062}", - nfkc: "\u{00E0}\u{05AE}\u{1E949}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{0300}\u{1E949}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E949}\u{0315}\u{0300}\u{05AE}\u{0062}", - nfc: "\u{0061}\u{05AE}\u{1E949}\u{0300}\u{0315}\u{0062}", - nfd: "\u{0061}\u{05AE}\u{1E949}\u{0300}\u{0315}\u{0062}", - nfkc: "\u{0061}\u{05AE}\u{1E949}\u{0300}\u{0315}\u{0062}", - nfkd: "\u{0061}\u{05AE}\u{1E949}\u{0300}\u{0315}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{3099}\u{093C}\u{0334}\u{1E94A}\u{0062}", - nfc: "\u{0061}\u{0334}\u{093C}\u{1E94A}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{093C}\u{1E94A}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{093C}\u{1E94A}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{093C}\u{1E94A}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{0061}\u{1E94A}\u{3099}\u{093C}\u{0334}\u{0062}", - nfc: "\u{0061}\u{0334}\u{1E94A}\u{093C}\u{3099}\u{0062}", - nfd: "\u{0061}\u{0334}\u{1E94A}\u{093C}\u{3099}\u{0062}", - nfkc: "\u{0061}\u{0334}\u{1E94A}\u{093C}\u{3099}\u{0062}", - nfkd: "\u{0061}\u{0334}\u{1E94A}\u{093C}\u{3099}\u{0062}", - }, - NormalizationTest { - source: "\u{09C7}\u{0334}\u{09BE}", - nfc: "\u{09C7}\u{0334}\u{09BE}", - nfd: "\u{09C7}\u{0334}\u{09BE}", - nfkc: "\u{09C7}\u{0334}\u{09BE}", - nfkd: "\u{09C7}\u{0334}\u{09BE}", - }, - NormalizationTest { - source: "\u{09C7}\u{0334}\u{09D7}", - nfc: "\u{09C7}\u{0334}\u{09D7}", - nfd: "\u{09C7}\u{0334}\u{09D7}", - nfkc: "\u{09C7}\u{0334}\u{09D7}", - nfkd: "\u{09C7}\u{0334}\u{09D7}", - }, - NormalizationTest { - source: "\u{0B47}\u{0334}\u{0B3E}", - nfc: "\u{0B47}\u{0334}\u{0B3E}", - nfd: "\u{0B47}\u{0334}\u{0B3E}", - nfkc: "\u{0B47}\u{0334}\u{0B3E}", - nfkd: "\u{0B47}\u{0334}\u{0B3E}", - }, - NormalizationTest { - source: "\u{0B47}\u{0334}\u{0B56}", - nfc: "\u{0B47}\u{0334}\u{0B56}", - nfd: "\u{0B47}\u{0334}\u{0B56}", - nfkc: "\u{0B47}\u{0334}\u{0B56}", - nfkd: "\u{0B47}\u{0334}\u{0B56}", - }, - NormalizationTest { - source: "\u{0B47}\u{0334}\u{0B57}", - nfc: "\u{0B47}\u{0334}\u{0B57}", - nfd: "\u{0B47}\u{0334}\u{0B57}", - nfkc: "\u{0B47}\u{0334}\u{0B57}", - nfkd: "\u{0B47}\u{0334}\u{0B57}", - }, - NormalizationTest { - source: "\u{0B92}\u{0334}\u{0BD7}", - nfc: "\u{0B92}\u{0334}\u{0BD7}", - nfd: "\u{0B92}\u{0334}\u{0BD7}", - nfkc: "\u{0B92}\u{0334}\u{0BD7}", - nfkd: "\u{0B92}\u{0334}\u{0BD7}", - }, - NormalizationTest { - source: "\u{0BC6}\u{0334}\u{0BBE}", - nfc: "\u{0BC6}\u{0334}\u{0BBE}", - nfd: "\u{0BC6}\u{0334}\u{0BBE}", - nfkc: "\u{0BC6}\u{0334}\u{0BBE}", - nfkd: "\u{0BC6}\u{0334}\u{0BBE}", - }, - NormalizationTest { - source: "\u{0BC6}\u{0334}\u{0BD7}", - nfc: "\u{0BC6}\u{0334}\u{0BD7}", - nfd: "\u{0BC6}\u{0334}\u{0BD7}", - nfkc: "\u{0BC6}\u{0334}\u{0BD7}", - nfkd: "\u{0BC6}\u{0334}\u{0BD7}", - }, - NormalizationTest { - source: "\u{0BC7}\u{0334}\u{0BBE}", - nfc: "\u{0BC7}\u{0334}\u{0BBE}", - nfd: "\u{0BC7}\u{0334}\u{0BBE}", - nfkc: "\u{0BC7}\u{0334}\u{0BBE}", - nfkd: "\u{0BC7}\u{0334}\u{0BBE}", - }, - NormalizationTest { - source: "\u{0CBF}\u{0334}\u{0CD5}", - nfc: "\u{0CBF}\u{0334}\u{0CD5}", - nfd: "\u{0CBF}\u{0334}\u{0CD5}", - nfkc: "\u{0CBF}\u{0334}\u{0CD5}", - nfkd: "\u{0CBF}\u{0334}\u{0CD5}", - }, - NormalizationTest { - source: "\u{0CC6}\u{0334}\u{0CC2}", - nfc: "\u{0CC6}\u{0334}\u{0CC2}", - nfd: "\u{0CC6}\u{0334}\u{0CC2}", - nfkc: "\u{0CC6}\u{0334}\u{0CC2}", - nfkd: "\u{0CC6}\u{0334}\u{0CC2}", - }, - NormalizationTest { - source: "\u{0CC6}\u{0334}\u{0CD5}", - nfc: "\u{0CC6}\u{0334}\u{0CD5}", - nfd: "\u{0CC6}\u{0334}\u{0CD5}", - nfkc: "\u{0CC6}\u{0334}\u{0CD5}", - nfkd: "\u{0CC6}\u{0334}\u{0CD5}", - }, - NormalizationTest { - source: "\u{0CC6}\u{0334}\u{0CD6}", - nfc: "\u{0CC6}\u{0334}\u{0CD6}", - nfd: "\u{0CC6}\u{0334}\u{0CD6}", - nfkc: "\u{0CC6}\u{0334}\u{0CD6}", - nfkd: "\u{0CC6}\u{0334}\u{0CD6}", - }, - NormalizationTest { - source: "\u{0CCA}\u{0334}\u{0CD5}", - nfc: "\u{0CCA}\u{0334}\u{0CD5}", - nfd: "\u{0CC6}\u{0CC2}\u{0334}\u{0CD5}", - nfkc: "\u{0CCA}\u{0334}\u{0CD5}", - nfkd: "\u{0CC6}\u{0CC2}\u{0334}\u{0CD5}", - }, - NormalizationTest { - source: "\u{0D46}\u{0334}\u{0D3E}", - nfc: "\u{0D46}\u{0334}\u{0D3E}", - nfd: "\u{0D46}\u{0334}\u{0D3E}", - nfkc: "\u{0D46}\u{0334}\u{0D3E}", - nfkd: "\u{0D46}\u{0334}\u{0D3E}", - }, - NormalizationTest { - source: "\u{0D46}\u{0334}\u{0D57}", - nfc: "\u{0D46}\u{0334}\u{0D57}", - nfd: "\u{0D46}\u{0334}\u{0D57}", - nfkc: "\u{0D46}\u{0334}\u{0D57}", - nfkd: "\u{0D46}\u{0334}\u{0D57}", - }, - NormalizationTest { - source: "\u{0D47}\u{0334}\u{0D3E}", - nfc: "\u{0D47}\u{0334}\u{0D3E}", - nfd: "\u{0D47}\u{0334}\u{0D3E}", - nfkc: "\u{0D47}\u{0334}\u{0D3E}", - nfkd: "\u{0D47}\u{0334}\u{0D3E}", - }, - NormalizationTest { - source: "\u{0DD9}\u{0334}\u{0DCF}", - nfc: "\u{0DD9}\u{0334}\u{0DCF}", - nfd: "\u{0DD9}\u{0334}\u{0DCF}", - nfkc: "\u{0DD9}\u{0334}\u{0DCF}", - nfkd: "\u{0DD9}\u{0334}\u{0DCF}", - }, - NormalizationTest { - source: "\u{0DD9}\u{0334}\u{0DDF}", - nfc: "\u{0DD9}\u{0334}\u{0DDF}", - nfd: "\u{0DD9}\u{0334}\u{0DDF}", - nfkc: "\u{0DD9}\u{0334}\u{0DDF}", - nfkd: "\u{0DD9}\u{0334}\u{0DDF}", - }, - NormalizationTest { - source: "\u{0F40}\u{0334}\u{0FB5}", - nfc: "\u{0F40}\u{0334}\u{0FB5}", - nfd: "\u{0F40}\u{0334}\u{0FB5}", - nfkc: "\u{0F40}\u{0334}\u{0FB5}", - nfkd: "\u{0F40}\u{0334}\u{0FB5}", - }, - NormalizationTest { - source: "\u{0F42}\u{0334}\u{0FB7}", - nfc: "\u{0F42}\u{0334}\u{0FB7}", - nfd: "\u{0F42}\u{0334}\u{0FB7}", - nfkc: "\u{0F42}\u{0334}\u{0FB7}", - nfkd: "\u{0F42}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F4C}\u{0334}\u{0FB7}", - nfc: "\u{0F4C}\u{0334}\u{0FB7}", - nfd: "\u{0F4C}\u{0334}\u{0FB7}", - nfkc: "\u{0F4C}\u{0334}\u{0FB7}", - nfkd: "\u{0F4C}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F51}\u{0334}\u{0FB7}", - nfc: "\u{0F51}\u{0334}\u{0FB7}", - nfd: "\u{0F51}\u{0334}\u{0FB7}", - nfkc: "\u{0F51}\u{0334}\u{0FB7}", - nfkd: "\u{0F51}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F56}\u{0334}\u{0FB7}", - nfc: "\u{0F56}\u{0334}\u{0FB7}", - nfd: "\u{0F56}\u{0334}\u{0FB7}", - nfkc: "\u{0F56}\u{0334}\u{0FB7}", - nfkd: "\u{0F56}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F5B}\u{0334}\u{0FB7}", - nfc: "\u{0F5B}\u{0334}\u{0FB7}", - nfd: "\u{0F5B}\u{0334}\u{0FB7}", - nfkc: "\u{0F5B}\u{0334}\u{0FB7}", - nfkd: "\u{0F5B}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F90}\u{0334}\u{0FB5}", - nfc: "\u{0F90}\u{0334}\u{0FB5}", - nfd: "\u{0F90}\u{0334}\u{0FB5}", - nfkc: "\u{0F90}\u{0334}\u{0FB5}", - nfkd: "\u{0F90}\u{0334}\u{0FB5}", - }, - NormalizationTest { - source: "\u{0F92}\u{0334}\u{0FB7}", - nfc: "\u{0F92}\u{0334}\u{0FB7}", - nfd: "\u{0F92}\u{0334}\u{0FB7}", - nfkc: "\u{0F92}\u{0334}\u{0FB7}", - nfkd: "\u{0F92}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0F9C}\u{0334}\u{0FB7}", - nfc: "\u{0F9C}\u{0334}\u{0FB7}", - nfd: "\u{0F9C}\u{0334}\u{0FB7}", - nfkc: "\u{0F9C}\u{0334}\u{0FB7}", - nfkd: "\u{0F9C}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0FA1}\u{0334}\u{0FB7}", - nfc: "\u{0FA1}\u{0334}\u{0FB7}", - nfd: "\u{0FA1}\u{0334}\u{0FB7}", - nfkc: "\u{0FA1}\u{0334}\u{0FB7}", - nfkd: "\u{0FA1}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0FA6}\u{0334}\u{0FB7}", - nfc: "\u{0FA6}\u{0334}\u{0FB7}", - nfd: "\u{0FA6}\u{0334}\u{0FB7}", - nfkc: "\u{0FA6}\u{0334}\u{0FB7}", - nfkd: "\u{0FA6}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{0FAB}\u{0334}\u{0FB7}", - nfc: "\u{0FAB}\u{0334}\u{0FB7}", - nfd: "\u{0FAB}\u{0334}\u{0FB7}", - nfkc: "\u{0FAB}\u{0334}\u{0FB7}", - nfkd: "\u{0FAB}\u{0334}\u{0FB7}", - }, - NormalizationTest { - source: "\u{1025}\u{0334}\u{102E}", - nfc: "\u{1025}\u{0334}\u{102E}", - nfd: "\u{1025}\u{0334}\u{102E}", - nfkc: "\u{1025}\u{0334}\u{102E}", - nfkd: "\u{1025}\u{0334}\u{102E}", - }, - NormalizationTest { - source: "\u{1100}\u{0334}\u{1161}", - nfc: "\u{1100}\u{0334}\u{1161}", - nfd: "\u{1100}\u{0334}\u{1161}", - nfkc: "\u{1100}\u{0334}\u{1161}", - nfkd: "\u{1100}\u{0334}\u{1161}", - }, - NormalizationTest { - source: "\u{1100}\u{0334}\u{116E}", - nfc: "\u{1100}\u{0334}\u{116E}", - nfd: "\u{1100}\u{0334}\u{116E}", - nfkc: "\u{1100}\u{0334}\u{116E}", - nfkd: "\u{1100}\u{0334}\u{116E}", - }, - NormalizationTest { - source: "\u{1101}\u{0334}\u{1166}", - nfc: "\u{1101}\u{0334}\u{1166}", - nfd: "\u{1101}\u{0334}\u{1166}", - nfkc: "\u{1101}\u{0334}\u{1166}", - nfkd: "\u{1101}\u{0334}\u{1166}", - }, - NormalizationTest { - source: "\u{1101}\u{0334}\u{1173}", - nfc: "\u{1101}\u{0334}\u{1173}", - nfd: "\u{1101}\u{0334}\u{1173}", - nfkc: "\u{1101}\u{0334}\u{1173}", - nfkd: "\u{1101}\u{0334}\u{1173}", - }, - NormalizationTest { - source: "\u{1102}\u{0334}\u{116B}", - nfc: "\u{1102}\u{0334}\u{116B}", - nfd: "\u{1102}\u{0334}\u{116B}", - nfkc: "\u{1102}\u{0334}\u{116B}", - nfkd: "\u{1102}\u{0334}\u{116B}", - }, - NormalizationTest { - source: "\u{1103}\u{0334}\u{1163}", - nfc: "\u{1103}\u{0334}\u{1163}", - nfd: "\u{1103}\u{0334}\u{1163}", - nfkc: "\u{1103}\u{0334}\u{1163}", - nfkd: "\u{1103}\u{0334}\u{1163}", - }, - NormalizationTest { - source: "\u{1103}\u{0334}\u{1170}", - nfc: "\u{1103}\u{0334}\u{1170}", - nfd: "\u{1103}\u{0334}\u{1170}", - nfkc: "\u{1103}\u{0334}\u{1170}", - nfkd: "\u{1103}\u{0334}\u{1170}", - }, - NormalizationTest { - source: "\u{1104}\u{0334}\u{1168}", - nfc: "\u{1104}\u{0334}\u{1168}", - nfd: "\u{1104}\u{0334}\u{1168}", - nfkc: "\u{1104}\u{0334}\u{1168}", - nfkd: "\u{1104}\u{0334}\u{1168}", - }, - NormalizationTest { - source: "\u{1104}\u{0334}\u{1175}", - nfc: "\u{1104}\u{0334}\u{1175}", - nfd: "\u{1104}\u{0334}\u{1175}", - nfkc: "\u{1104}\u{0334}\u{1175}", - nfkd: "\u{1104}\u{0334}\u{1175}", - }, - NormalizationTest { - source: "\u{1105}\u{0334}\u{116D}", - nfc: "\u{1105}\u{0334}\u{116D}", - nfd: "\u{1105}\u{0334}\u{116D}", - nfkc: "\u{1105}\u{0334}\u{116D}", - nfkd: "\u{1105}\u{0334}\u{116D}", - }, - NormalizationTest { - source: "\u{1106}\u{0334}\u{1165}", - nfc: "\u{1106}\u{0334}\u{1165}", - nfd: "\u{1106}\u{0334}\u{1165}", - nfkc: "\u{1106}\u{0334}\u{1165}", - nfkd: "\u{1106}\u{0334}\u{1165}", - }, - NormalizationTest { - source: "\u{1106}\u{0334}\u{1172}", - nfc: "\u{1106}\u{0334}\u{1172}", - nfd: "\u{1106}\u{0334}\u{1172}", - nfkc: "\u{1106}\u{0334}\u{1172}", - nfkd: "\u{1106}\u{0334}\u{1172}", - }, - NormalizationTest { - source: "\u{1107}\u{0334}\u{116A}", - nfc: "\u{1107}\u{0334}\u{116A}", - nfd: "\u{1107}\u{0334}\u{116A}", - nfkc: "\u{1107}\u{0334}\u{116A}", - nfkd: "\u{1107}\u{0334}\u{116A}", - }, - NormalizationTest { - source: "\u{1108}\u{0334}\u{1162}", - nfc: "\u{1108}\u{0334}\u{1162}", - nfd: "\u{1108}\u{0334}\u{1162}", - nfkc: "\u{1108}\u{0334}\u{1162}", - nfkd: "\u{1108}\u{0334}\u{1162}", - }, - NormalizationTest { - source: "\u{1108}\u{0334}\u{116F}", - nfc: "\u{1108}\u{0334}\u{116F}", - nfd: "\u{1108}\u{0334}\u{116F}", - nfkc: "\u{1108}\u{0334}\u{116F}", - nfkd: "\u{1108}\u{0334}\u{116F}", - }, - NormalizationTest { - source: "\u{1109}\u{0334}\u{1167}", - nfc: "\u{1109}\u{0334}\u{1167}", - nfd: "\u{1109}\u{0334}\u{1167}", - nfkc: "\u{1109}\u{0334}\u{1167}", - nfkd: "\u{1109}\u{0334}\u{1167}", - }, - NormalizationTest { - source: "\u{1109}\u{0334}\u{1174}", - nfc: "\u{1109}\u{0334}\u{1174}", - nfd: "\u{1109}\u{0334}\u{1174}", - nfkc: "\u{1109}\u{0334}\u{1174}", - nfkd: "\u{1109}\u{0334}\u{1174}", - }, - NormalizationTest { - source: "\u{110A}\u{0334}\u{116C}", - nfc: "\u{110A}\u{0334}\u{116C}", - nfd: "\u{110A}\u{0334}\u{116C}", - nfkc: "\u{110A}\u{0334}\u{116C}", - nfkd: "\u{110A}\u{0334}\u{116C}", - }, - NormalizationTest { - source: "\u{110B}\u{0334}\u{1164}", - nfc: "\u{110B}\u{0334}\u{1164}", - nfd: "\u{110B}\u{0334}\u{1164}", - nfkc: "\u{110B}\u{0334}\u{1164}", - nfkd: "\u{110B}\u{0334}\u{1164}", - }, - NormalizationTest { - source: "\u{110B}\u{0334}\u{1171}", - nfc: "\u{110B}\u{0334}\u{1171}", - nfd: "\u{110B}\u{0334}\u{1171}", - nfkc: "\u{110B}\u{0334}\u{1171}", - nfkd: "\u{110B}\u{0334}\u{1171}", - }, - NormalizationTest { - source: "\u{110C}\u{0334}\u{1169}", - nfc: "\u{110C}\u{0334}\u{1169}", - nfd: "\u{110C}\u{0334}\u{1169}", - nfkc: "\u{110C}\u{0334}\u{1169}", - nfkd: "\u{110C}\u{0334}\u{1169}", - }, - NormalizationTest { - source: "\u{110D}\u{0334}\u{1161}", - nfc: "\u{110D}\u{0334}\u{1161}", - nfd: "\u{110D}\u{0334}\u{1161}", - nfkc: "\u{110D}\u{0334}\u{1161}", - nfkd: "\u{110D}\u{0334}\u{1161}", - }, - NormalizationTest { - source: "\u{110D}\u{0334}\u{116E}", - nfc: "\u{110D}\u{0334}\u{116E}", - nfd: "\u{110D}\u{0334}\u{116E}", - nfkc: "\u{110D}\u{0334}\u{116E}", - nfkd: "\u{110D}\u{0334}\u{116E}", - }, - NormalizationTest { - source: "\u{110E}\u{0334}\u{1166}", - nfc: "\u{110E}\u{0334}\u{1166}", - nfd: "\u{110E}\u{0334}\u{1166}", - nfkc: "\u{110E}\u{0334}\u{1166}", - nfkd: "\u{110E}\u{0334}\u{1166}", - }, - NormalizationTest { - source: "\u{110E}\u{0334}\u{1173}", - nfc: "\u{110E}\u{0334}\u{1173}", - nfd: "\u{110E}\u{0334}\u{1173}", - nfkc: "\u{110E}\u{0334}\u{1173}", - nfkd: "\u{110E}\u{0334}\u{1173}", - }, - NormalizationTest { - source: "\u{110F}\u{0334}\u{116B}", - nfc: "\u{110F}\u{0334}\u{116B}", - nfd: "\u{110F}\u{0334}\u{116B}", - nfkc: "\u{110F}\u{0334}\u{116B}", - nfkd: "\u{110F}\u{0334}\u{116B}", - }, - NormalizationTest { - source: "\u{1110}\u{0334}\u{1163}", - nfc: "\u{1110}\u{0334}\u{1163}", - nfd: "\u{1110}\u{0334}\u{1163}", - nfkc: "\u{1110}\u{0334}\u{1163}", - nfkd: "\u{1110}\u{0334}\u{1163}", - }, - NormalizationTest { - source: "\u{1110}\u{0334}\u{1170}", - nfc: "\u{1110}\u{0334}\u{1170}", - nfd: "\u{1110}\u{0334}\u{1170}", - nfkc: "\u{1110}\u{0334}\u{1170}", - nfkd: "\u{1110}\u{0334}\u{1170}", - }, - NormalizationTest { - source: "\u{1111}\u{0334}\u{1168}", - nfc: "\u{1111}\u{0334}\u{1168}", - nfd: "\u{1111}\u{0334}\u{1168}", - nfkc: "\u{1111}\u{0334}\u{1168}", - nfkd: "\u{1111}\u{0334}\u{1168}", - }, - NormalizationTest { - source: "\u{1111}\u{0334}\u{1175}", - nfc: "\u{1111}\u{0334}\u{1175}", - nfd: "\u{1111}\u{0334}\u{1175}", - nfkc: "\u{1111}\u{0334}\u{1175}", - nfkd: "\u{1111}\u{0334}\u{1175}", - }, - NormalizationTest { - source: "\u{1112}\u{0334}\u{116D}", - nfc: "\u{1112}\u{0334}\u{116D}", - nfd: "\u{1112}\u{0334}\u{116D}", - nfkc: "\u{1112}\u{0334}\u{116D}", - nfkd: "\u{1112}\u{0334}\u{116D}", - }, - NormalizationTest { - source: "\u{1B05}\u{0334}\u{1B35}", - nfc: "\u{1B05}\u{0334}\u{1B35}", - nfd: "\u{1B05}\u{0334}\u{1B35}", - nfkc: "\u{1B05}\u{0334}\u{1B35}", - nfkd: "\u{1B05}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B07}\u{0334}\u{1B35}", - nfc: "\u{1B07}\u{0334}\u{1B35}", - nfd: "\u{1B07}\u{0334}\u{1B35}", - nfkc: "\u{1B07}\u{0334}\u{1B35}", - nfkd: "\u{1B07}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B09}\u{0334}\u{1B35}", - nfc: "\u{1B09}\u{0334}\u{1B35}", - nfd: "\u{1B09}\u{0334}\u{1B35}", - nfkc: "\u{1B09}\u{0334}\u{1B35}", - nfkd: "\u{1B09}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B0B}\u{0334}\u{1B35}", - nfc: "\u{1B0B}\u{0334}\u{1B35}", - nfd: "\u{1B0B}\u{0334}\u{1B35}", - nfkc: "\u{1B0B}\u{0334}\u{1B35}", - nfkd: "\u{1B0B}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B0D}\u{0334}\u{1B35}", - nfc: "\u{1B0D}\u{0334}\u{1B35}", - nfd: "\u{1B0D}\u{0334}\u{1B35}", - nfkc: "\u{1B0D}\u{0334}\u{1B35}", - nfkd: "\u{1B0D}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B11}\u{0334}\u{1B35}", - nfc: "\u{1B11}\u{0334}\u{1B35}", - nfd: "\u{1B11}\u{0334}\u{1B35}", - nfkc: "\u{1B11}\u{0334}\u{1B35}", - nfkd: "\u{1B11}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B3A}\u{0334}\u{1B35}", - nfc: "\u{1B3A}\u{0334}\u{1B35}", - nfd: "\u{1B3A}\u{0334}\u{1B35}", - nfkc: "\u{1B3A}\u{0334}\u{1B35}", - nfkd: "\u{1B3A}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B3C}\u{0334}\u{1B35}", - nfc: "\u{1B3C}\u{0334}\u{1B35}", - nfd: "\u{1B3C}\u{0334}\u{1B35}", - nfkc: "\u{1B3C}\u{0334}\u{1B35}", - nfkd: "\u{1B3C}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B3E}\u{0334}\u{1B35}", - nfc: "\u{1B3E}\u{0334}\u{1B35}", - nfd: "\u{1B3E}\u{0334}\u{1B35}", - nfkc: "\u{1B3E}\u{0334}\u{1B35}", - nfkd: "\u{1B3E}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B3F}\u{0334}\u{1B35}", - nfc: "\u{1B3F}\u{0334}\u{1B35}", - nfd: "\u{1B3F}\u{0334}\u{1B35}", - nfkc: "\u{1B3F}\u{0334}\u{1B35}", - nfkd: "\u{1B3F}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{1B42}\u{0334}\u{1B35}", - nfc: "\u{1B42}\u{0334}\u{1B35}", - nfd: "\u{1B42}\u{0334}\u{1B35}", - nfkc: "\u{1B42}\u{0334}\u{1B35}", - nfkd: "\u{1B42}\u{0334}\u{1B35}", - }, - NormalizationTest { - source: "\u{AC54}\u{0334}\u{11AE}", - nfc: "\u{AC54}\u{0334}\u{11AE}", - nfd: "\u{1100}\u{1164}\u{0334}\u{11AE}", - nfkc: "\u{AC54}\u{0334}\u{11AE}", - nfkd: "\u{1100}\u{1164}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{ACA8}\u{0334}\u{11B5}", - nfc: "\u{ACA8}\u{0334}\u{11B5}", - nfd: "\u{1100}\u{1167}\u{0334}\u{11B5}", - nfkc: "\u{ACA8}\u{0334}\u{11B5}", - nfkd: "\u{1100}\u{1167}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{ACFC}\u{0334}\u{11BC}", - nfc: "\u{ACFC}\u{0334}\u{11BC}", - nfd: "\u{1100}\u{116A}\u{0334}\u{11BC}", - nfkc: "\u{ACFC}\u{0334}\u{11BC}", - nfkd: "\u{1100}\u{116A}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{ADC0}\u{0334}\u{11AE}", - nfc: "\u{ADC0}\u{0334}\u{11AE}", - nfd: "\u{1100}\u{1171}\u{0334}\u{11AE}", - nfkc: "\u{ADC0}\u{0334}\u{11AE}", - nfkd: "\u{1100}\u{1171}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{AE14}\u{0334}\u{11B5}", - nfc: "\u{AE14}\u{0334}\u{11B5}", - nfd: "\u{1100}\u{1174}\u{0334}\u{11B5}", - nfkc: "\u{AE14}\u{0334}\u{11B5}", - nfkd: "\u{1100}\u{1174}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{AE68}\u{0334}\u{11BC}", - nfc: "\u{AE68}\u{0334}\u{11BC}", - nfd: "\u{1101}\u{1162}\u{0334}\u{11BC}", - nfkc: "\u{AE68}\u{0334}\u{11BC}", - nfkd: "\u{1101}\u{1162}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{AF2C}\u{0334}\u{11AE}", - nfc: "\u{AF2C}\u{0334}\u{11AE}", - nfd: "\u{1101}\u{1169}\u{0334}\u{11AE}", - nfkc: "\u{AF2C}\u{0334}\u{11AE}", - nfkd: "\u{1101}\u{1169}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{AF80}\u{0334}\u{11B5}", - nfc: "\u{AF80}\u{0334}\u{11B5}", - nfd: "\u{1101}\u{116C}\u{0334}\u{11B5}", - nfkc: "\u{AF80}\u{0334}\u{11B5}", - nfkd: "\u{1101}\u{116C}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{AFD4}\u{0334}\u{11BC}", - nfc: "\u{AFD4}\u{0334}\u{11BC}", - nfd: "\u{1101}\u{116F}\u{0334}\u{11BC}", - nfkc: "\u{AFD4}\u{0334}\u{11BC}", - nfkd: "\u{1101}\u{116F}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{B098}\u{0334}\u{11AE}", - nfc: "\u{B098}\u{0334}\u{11AE}", - nfd: "\u{1102}\u{1161}\u{0334}\u{11AE}", - nfkc: "\u{B098}\u{0334}\u{11AE}", - nfkd: "\u{1102}\u{1161}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{B0EC}\u{0334}\u{11B5}", - nfc: "\u{B0EC}\u{0334}\u{11B5}", - nfd: "\u{1102}\u{1164}\u{0334}\u{11B5}", - nfkc: "\u{B0EC}\u{0334}\u{11B5}", - nfkd: "\u{1102}\u{1164}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{B140}\u{0334}\u{11BC}", - nfc: "\u{B140}\u{0334}\u{11BC}", - nfd: "\u{1102}\u{1167}\u{0334}\u{11BC}", - nfkc: "\u{B140}\u{0334}\u{11BC}", - nfkd: "\u{1102}\u{1167}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{B204}\u{0334}\u{11AE}", - nfc: "\u{B204}\u{0334}\u{11AE}", - nfd: "\u{1102}\u{116E}\u{0334}\u{11AE}", - nfkc: "\u{B204}\u{0334}\u{11AE}", - nfkd: "\u{1102}\u{116E}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{B258}\u{0334}\u{11B5}", - nfc: "\u{B258}\u{0334}\u{11B5}", - nfd: "\u{1102}\u{1171}\u{0334}\u{11B5}", - nfkc: "\u{B258}\u{0334}\u{11B5}", - nfkd: "\u{1102}\u{1171}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{B2AC}\u{0334}\u{11BC}", - nfc: "\u{B2AC}\u{0334}\u{11BC}", - nfd: "\u{1102}\u{1174}\u{0334}\u{11BC}", - nfkc: "\u{B2AC}\u{0334}\u{11BC}", - nfkd: "\u{1102}\u{1174}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{B370}\u{0334}\u{11AE}", - nfc: "\u{B370}\u{0334}\u{11AE}", - nfd: "\u{1103}\u{1166}\u{0334}\u{11AE}", - nfkc: "\u{B370}\u{0334}\u{11AE}", - nfkd: "\u{1103}\u{1166}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{B3C4}\u{0334}\u{11B5}", - nfc: "\u{B3C4}\u{0334}\u{11B5}", - nfd: "\u{1103}\u{1169}\u{0334}\u{11B5}", - nfkc: "\u{B3C4}\u{0334}\u{11B5}", - nfkd: "\u{1103}\u{1169}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{B418}\u{0334}\u{11BC}", - nfc: "\u{B418}\u{0334}\u{11BC}", - nfd: "\u{1103}\u{116C}\u{0334}\u{11BC}", - nfkc: "\u{B418}\u{0334}\u{11BC}", - nfkd: "\u{1103}\u{116C}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{B4DC}\u{0334}\u{11AE}", - nfc: "\u{B4DC}\u{0334}\u{11AE}", - nfd: "\u{1103}\u{1173}\u{0334}\u{11AE}", - nfkc: "\u{B4DC}\u{0334}\u{11AE}", - nfkd: "\u{1103}\u{1173}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{B530}\u{0334}\u{11B5}", - nfc: "\u{B530}\u{0334}\u{11B5}", - nfd: "\u{1104}\u{1161}\u{0334}\u{11B5}", - nfkc: "\u{B530}\u{0334}\u{11B5}", - nfkd: "\u{1104}\u{1161}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{B584}\u{0334}\u{11BC}", - nfc: "\u{B584}\u{0334}\u{11BC}", - nfd: "\u{1104}\u{1164}\u{0334}\u{11BC}", - nfkc: "\u{B584}\u{0334}\u{11BC}", - nfkd: "\u{1104}\u{1164}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{B648}\u{0334}\u{11AE}", - nfc: "\u{B648}\u{0334}\u{11AE}", - nfd: "\u{1104}\u{116B}\u{0334}\u{11AE}", - nfkc: "\u{B648}\u{0334}\u{11AE}", - nfkd: "\u{1104}\u{116B}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{B69C}\u{0334}\u{11B5}", - nfc: "\u{B69C}\u{0334}\u{11B5}", - nfd: "\u{1104}\u{116E}\u{0334}\u{11B5}", - nfkc: "\u{B69C}\u{0334}\u{11B5}", - nfkd: "\u{1104}\u{116E}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{B6F0}\u{0334}\u{11BC}", - nfc: "\u{B6F0}\u{0334}\u{11BC}", - nfd: "\u{1104}\u{1171}\u{0334}\u{11BC}", - nfkc: "\u{B6F0}\u{0334}\u{11BC}", - nfkd: "\u{1104}\u{1171}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{B7B4}\u{0334}\u{11AE}", - nfc: "\u{B7B4}\u{0334}\u{11AE}", - nfd: "\u{1105}\u{1163}\u{0334}\u{11AE}", - nfkc: "\u{B7B4}\u{0334}\u{11AE}", - nfkd: "\u{1105}\u{1163}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{B808}\u{0334}\u{11B5}", - nfc: "\u{B808}\u{0334}\u{11B5}", - nfd: "\u{1105}\u{1166}\u{0334}\u{11B5}", - nfkc: "\u{B808}\u{0334}\u{11B5}", - nfkd: "\u{1105}\u{1166}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{B85C}\u{0334}\u{11BC}", - nfc: "\u{B85C}\u{0334}\u{11BC}", - nfd: "\u{1105}\u{1169}\u{0334}\u{11BC}", - nfkc: "\u{B85C}\u{0334}\u{11BC}", - nfkd: "\u{1105}\u{1169}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{B920}\u{0334}\u{11AE}", - nfc: "\u{B920}\u{0334}\u{11AE}", - nfd: "\u{1105}\u{1170}\u{0334}\u{11AE}", - nfkc: "\u{B920}\u{0334}\u{11AE}", - nfkd: "\u{1105}\u{1170}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{B974}\u{0334}\u{11B5}", - nfc: "\u{B974}\u{0334}\u{11B5}", - nfd: "\u{1105}\u{1173}\u{0334}\u{11B5}", - nfkc: "\u{B974}\u{0334}\u{11B5}", - nfkd: "\u{1105}\u{1173}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{B9C8}\u{0334}\u{11BC}", - nfc: "\u{B9C8}\u{0334}\u{11BC}", - nfd: "\u{1106}\u{1161}\u{0334}\u{11BC}", - nfkc: "\u{B9C8}\u{0334}\u{11BC}", - nfkd: "\u{1106}\u{1161}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{BA8C}\u{0334}\u{11AE}", - nfc: "\u{BA8C}\u{0334}\u{11AE}", - nfd: "\u{1106}\u{1168}\u{0334}\u{11AE}", - nfkc: "\u{BA8C}\u{0334}\u{11AE}", - nfkd: "\u{1106}\u{1168}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{BAE0}\u{0334}\u{11B5}", - nfc: "\u{BAE0}\u{0334}\u{11B5}", - nfd: "\u{1106}\u{116B}\u{0334}\u{11B5}", - nfkc: "\u{BAE0}\u{0334}\u{11B5}", - nfkd: "\u{1106}\u{116B}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{BB34}\u{0334}\u{11BC}", - nfc: "\u{BB34}\u{0334}\u{11BC}", - nfd: "\u{1106}\u{116E}\u{0334}\u{11BC}", - nfkc: "\u{BB34}\u{0334}\u{11BC}", - nfkd: "\u{1106}\u{116E}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{BBF8}\u{0334}\u{11AE}", - nfc: "\u{BBF8}\u{0334}\u{11AE}", - nfd: "\u{1106}\u{1175}\u{0334}\u{11AE}", - nfkc: "\u{BBF8}\u{0334}\u{11AE}", - nfkd: "\u{1106}\u{1175}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{BC4C}\u{0334}\u{11B5}", - nfc: "\u{BC4C}\u{0334}\u{11B5}", - nfd: "\u{1107}\u{1163}\u{0334}\u{11B5}", - nfkc: "\u{BC4C}\u{0334}\u{11B5}", - nfkd: "\u{1107}\u{1163}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{BCA0}\u{0334}\u{11BC}", - nfc: "\u{BCA0}\u{0334}\u{11BC}", - nfd: "\u{1107}\u{1166}\u{0334}\u{11BC}", - nfkc: "\u{BCA0}\u{0334}\u{11BC}", - nfkd: "\u{1107}\u{1166}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{BD64}\u{0334}\u{11AE}", - nfc: "\u{BD64}\u{0334}\u{11AE}", - nfd: "\u{1107}\u{116D}\u{0334}\u{11AE}", - nfkc: "\u{BD64}\u{0334}\u{11AE}", - nfkd: "\u{1107}\u{116D}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{BDB8}\u{0334}\u{11B5}", - nfc: "\u{BDB8}\u{0334}\u{11B5}", - nfd: "\u{1107}\u{1170}\u{0334}\u{11B5}", - nfkc: "\u{BDB8}\u{0334}\u{11B5}", - nfkd: "\u{1107}\u{1170}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{BE0C}\u{0334}\u{11BC}", - nfc: "\u{BE0C}\u{0334}\u{11BC}", - nfd: "\u{1107}\u{1173}\u{0334}\u{11BC}", - nfkc: "\u{BE0C}\u{0334}\u{11BC}", - nfkd: "\u{1107}\u{1173}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{BED0}\u{0334}\u{11AE}", - nfc: "\u{BED0}\u{0334}\u{11AE}", - nfd: "\u{1108}\u{1165}\u{0334}\u{11AE}", - nfkc: "\u{BED0}\u{0334}\u{11AE}", - nfkd: "\u{1108}\u{1165}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{BF24}\u{0334}\u{11B5}", - nfc: "\u{BF24}\u{0334}\u{11B5}", - nfd: "\u{1108}\u{1168}\u{0334}\u{11B5}", - nfkc: "\u{BF24}\u{0334}\u{11B5}", - nfkd: "\u{1108}\u{1168}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{BF78}\u{0334}\u{11BC}", - nfc: "\u{BF78}\u{0334}\u{11BC}", - nfd: "\u{1108}\u{116B}\u{0334}\u{11BC}", - nfkc: "\u{BF78}\u{0334}\u{11BC}", - nfkd: "\u{1108}\u{116B}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{C03C}\u{0334}\u{11AE}", - nfc: "\u{C03C}\u{0334}\u{11AE}", - nfd: "\u{1108}\u{1172}\u{0334}\u{11AE}", - nfkc: "\u{C03C}\u{0334}\u{11AE}", - nfkd: "\u{1108}\u{1172}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{C090}\u{0334}\u{11B5}", - nfc: "\u{C090}\u{0334}\u{11B5}", - nfd: "\u{1108}\u{1175}\u{0334}\u{11B5}", - nfkc: "\u{C090}\u{0334}\u{11B5}", - nfkd: "\u{1108}\u{1175}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{C0E4}\u{0334}\u{11BC}", - nfc: "\u{C0E4}\u{0334}\u{11BC}", - nfd: "\u{1109}\u{1163}\u{0334}\u{11BC}", - nfkc: "\u{C0E4}\u{0334}\u{11BC}", - nfkd: "\u{1109}\u{1163}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{C1A8}\u{0334}\u{11AE}", - nfc: "\u{C1A8}\u{0334}\u{11AE}", - nfd: "\u{1109}\u{116A}\u{0334}\u{11AE}", - nfkc: "\u{C1A8}\u{0334}\u{11AE}", - nfkd: "\u{1109}\u{116A}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{C1FC}\u{0334}\u{11B5}", - nfc: "\u{C1FC}\u{0334}\u{11B5}", - nfd: "\u{1109}\u{116D}\u{0334}\u{11B5}", - nfkc: "\u{C1FC}\u{0334}\u{11B5}", - nfkd: "\u{1109}\u{116D}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{C250}\u{0334}\u{11BC}", - nfc: "\u{C250}\u{0334}\u{11BC}", - nfd: "\u{1109}\u{1170}\u{0334}\u{11BC}", - nfkc: "\u{C250}\u{0334}\u{11BC}", - nfkd: "\u{1109}\u{1170}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{C314}\u{0334}\u{11AE}", - nfc: "\u{C314}\u{0334}\u{11AE}", - nfd: "\u{110A}\u{1162}\u{0334}\u{11AE}", - nfkc: "\u{C314}\u{0334}\u{11AE}", - nfkd: "\u{110A}\u{1162}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{C368}\u{0334}\u{11B5}", - nfc: "\u{C368}\u{0334}\u{11B5}", - nfd: "\u{110A}\u{1165}\u{0334}\u{11B5}", - nfkc: "\u{C368}\u{0334}\u{11B5}", - nfkd: "\u{110A}\u{1165}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{C3BC}\u{0334}\u{11BC}", - nfc: "\u{C3BC}\u{0334}\u{11BC}", - nfd: "\u{110A}\u{1168}\u{0334}\u{11BC}", - nfkc: "\u{C3BC}\u{0334}\u{11BC}", - nfkd: "\u{110A}\u{1168}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{C480}\u{0334}\u{11AE}", - nfc: "\u{C480}\u{0334}\u{11AE}", - nfd: "\u{110A}\u{116F}\u{0334}\u{11AE}", - nfkc: "\u{C480}\u{0334}\u{11AE}", - nfkd: "\u{110A}\u{116F}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{C4D4}\u{0334}\u{11B5}", - nfc: "\u{C4D4}\u{0334}\u{11B5}", - nfd: "\u{110A}\u{1172}\u{0334}\u{11B5}", - nfkc: "\u{C4D4}\u{0334}\u{11B5}", - nfkd: "\u{110A}\u{1172}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{C528}\u{0334}\u{11BC}", - nfc: "\u{C528}\u{0334}\u{11BC}", - nfd: "\u{110A}\u{1175}\u{0334}\u{11BC}", - nfkc: "\u{C528}\u{0334}\u{11BC}", - nfkd: "\u{110A}\u{1175}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{C5EC}\u{0334}\u{11AE}", - nfc: "\u{C5EC}\u{0334}\u{11AE}", - nfd: "\u{110B}\u{1167}\u{0334}\u{11AE}", - nfkc: "\u{C5EC}\u{0334}\u{11AE}", - nfkd: "\u{110B}\u{1167}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{C640}\u{0334}\u{11B5}", - nfc: "\u{C640}\u{0334}\u{11B5}", - nfd: "\u{110B}\u{116A}\u{0334}\u{11B5}", - nfkc: "\u{C640}\u{0334}\u{11B5}", - nfkd: "\u{110B}\u{116A}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{C694}\u{0334}\u{11BC}", - nfc: "\u{C694}\u{0334}\u{11BC}", - nfd: "\u{110B}\u{116D}\u{0334}\u{11BC}", - nfkc: "\u{C694}\u{0334}\u{11BC}", - nfkd: "\u{110B}\u{116D}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{C758}\u{0334}\u{11AE}", - nfc: "\u{C758}\u{0334}\u{11AE}", - nfd: "\u{110B}\u{1174}\u{0334}\u{11AE}", - nfkc: "\u{C758}\u{0334}\u{11AE}", - nfkd: "\u{110B}\u{1174}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{C7AC}\u{0334}\u{11B5}", - nfc: "\u{C7AC}\u{0334}\u{11B5}", - nfd: "\u{110C}\u{1162}\u{0334}\u{11B5}", - nfkc: "\u{C7AC}\u{0334}\u{11B5}", - nfkd: "\u{110C}\u{1162}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{C800}\u{0334}\u{11BC}", - nfc: "\u{C800}\u{0334}\u{11BC}", - nfd: "\u{110C}\u{1165}\u{0334}\u{11BC}", - nfkc: "\u{C800}\u{0334}\u{11BC}", - nfkd: "\u{110C}\u{1165}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{C8C4}\u{0334}\u{11AE}", - nfc: "\u{C8C4}\u{0334}\u{11AE}", - nfd: "\u{110C}\u{116C}\u{0334}\u{11AE}", - nfkc: "\u{C8C4}\u{0334}\u{11AE}", - nfkd: "\u{110C}\u{116C}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{C918}\u{0334}\u{11B5}", - nfc: "\u{C918}\u{0334}\u{11B5}", - nfd: "\u{110C}\u{116F}\u{0334}\u{11B5}", - nfkc: "\u{C918}\u{0334}\u{11B5}", - nfkd: "\u{110C}\u{116F}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{C96C}\u{0334}\u{11BC}", - nfc: "\u{C96C}\u{0334}\u{11BC}", - nfd: "\u{110C}\u{1172}\u{0334}\u{11BC}", - nfkc: "\u{C96C}\u{0334}\u{11BC}", - nfkd: "\u{110C}\u{1172}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{CA30}\u{0334}\u{11AE}", - nfc: "\u{CA30}\u{0334}\u{11AE}", - nfd: "\u{110D}\u{1164}\u{0334}\u{11AE}", - nfkc: "\u{CA30}\u{0334}\u{11AE}", - nfkd: "\u{110D}\u{1164}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{CA84}\u{0334}\u{11B5}", - nfc: "\u{CA84}\u{0334}\u{11B5}", - nfd: "\u{110D}\u{1167}\u{0334}\u{11B5}", - nfkc: "\u{CA84}\u{0334}\u{11B5}", - nfkd: "\u{110D}\u{1167}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{CAD8}\u{0334}\u{11BC}", - nfc: "\u{CAD8}\u{0334}\u{11BC}", - nfd: "\u{110D}\u{116A}\u{0334}\u{11BC}", - nfkc: "\u{CAD8}\u{0334}\u{11BC}", - nfkd: "\u{110D}\u{116A}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{CB9C}\u{0334}\u{11AE}", - nfc: "\u{CB9C}\u{0334}\u{11AE}", - nfd: "\u{110D}\u{1171}\u{0334}\u{11AE}", - nfkc: "\u{CB9C}\u{0334}\u{11AE}", - nfkd: "\u{110D}\u{1171}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{CBF0}\u{0334}\u{11B5}", - nfc: "\u{CBF0}\u{0334}\u{11B5}", - nfd: "\u{110D}\u{1174}\u{0334}\u{11B5}", - nfkc: "\u{CBF0}\u{0334}\u{11B5}", - nfkd: "\u{110D}\u{1174}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{CC44}\u{0334}\u{11BC}", - nfc: "\u{CC44}\u{0334}\u{11BC}", - nfd: "\u{110E}\u{1162}\u{0334}\u{11BC}", - nfkc: "\u{CC44}\u{0334}\u{11BC}", - nfkd: "\u{110E}\u{1162}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{CD08}\u{0334}\u{11AE}", - nfc: "\u{CD08}\u{0334}\u{11AE}", - nfd: "\u{110E}\u{1169}\u{0334}\u{11AE}", - nfkc: "\u{CD08}\u{0334}\u{11AE}", - nfkd: "\u{110E}\u{1169}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{CD5C}\u{0334}\u{11B5}", - nfc: "\u{CD5C}\u{0334}\u{11B5}", - nfd: "\u{110E}\u{116C}\u{0334}\u{11B5}", - nfkc: "\u{CD5C}\u{0334}\u{11B5}", - nfkd: "\u{110E}\u{116C}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{CDB0}\u{0334}\u{11BC}", - nfc: "\u{CDB0}\u{0334}\u{11BC}", - nfd: "\u{110E}\u{116F}\u{0334}\u{11BC}", - nfkc: "\u{CDB0}\u{0334}\u{11BC}", - nfkd: "\u{110E}\u{116F}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{CE74}\u{0334}\u{11AE}", - nfc: "\u{CE74}\u{0334}\u{11AE}", - nfd: "\u{110F}\u{1161}\u{0334}\u{11AE}", - nfkc: "\u{CE74}\u{0334}\u{11AE}", - nfkd: "\u{110F}\u{1161}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{CEC8}\u{0334}\u{11B5}", - nfc: "\u{CEC8}\u{0334}\u{11B5}", - nfd: "\u{110F}\u{1164}\u{0334}\u{11B5}", - nfkc: "\u{CEC8}\u{0334}\u{11B5}", - nfkd: "\u{110F}\u{1164}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{CF1C}\u{0334}\u{11BC}", - nfc: "\u{CF1C}\u{0334}\u{11BC}", - nfd: "\u{110F}\u{1167}\u{0334}\u{11BC}", - nfkc: "\u{CF1C}\u{0334}\u{11BC}", - nfkd: "\u{110F}\u{1167}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{CFE0}\u{0334}\u{11AE}", - nfc: "\u{CFE0}\u{0334}\u{11AE}", - nfd: "\u{110F}\u{116E}\u{0334}\u{11AE}", - nfkc: "\u{CFE0}\u{0334}\u{11AE}", - nfkd: "\u{110F}\u{116E}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{D034}\u{0334}\u{11B5}", - nfc: "\u{D034}\u{0334}\u{11B5}", - nfd: "\u{110F}\u{1171}\u{0334}\u{11B5}", - nfkc: "\u{D034}\u{0334}\u{11B5}", - nfkd: "\u{110F}\u{1171}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{D088}\u{0334}\u{11BC}", - nfc: "\u{D088}\u{0334}\u{11BC}", - nfd: "\u{110F}\u{1174}\u{0334}\u{11BC}", - nfkc: "\u{D088}\u{0334}\u{11BC}", - nfkd: "\u{110F}\u{1174}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{D14C}\u{0334}\u{11AE}", - nfc: "\u{D14C}\u{0334}\u{11AE}", - nfd: "\u{1110}\u{1166}\u{0334}\u{11AE}", - nfkc: "\u{D14C}\u{0334}\u{11AE}", - nfkd: "\u{1110}\u{1166}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{D1A0}\u{0334}\u{11B5}", - nfc: "\u{D1A0}\u{0334}\u{11B5}", - nfd: "\u{1110}\u{1169}\u{0334}\u{11B5}", - nfkc: "\u{D1A0}\u{0334}\u{11B5}", - nfkd: "\u{1110}\u{1169}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{D1F4}\u{0334}\u{11BC}", - nfc: "\u{D1F4}\u{0334}\u{11BC}", - nfd: "\u{1110}\u{116C}\u{0334}\u{11BC}", - nfkc: "\u{D1F4}\u{0334}\u{11BC}", - nfkd: "\u{1110}\u{116C}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{D2B8}\u{0334}\u{11AE}", - nfc: "\u{D2B8}\u{0334}\u{11AE}", - nfd: "\u{1110}\u{1173}\u{0334}\u{11AE}", - nfkc: "\u{D2B8}\u{0334}\u{11AE}", - nfkd: "\u{1110}\u{1173}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{D30C}\u{0334}\u{11B5}", - nfc: "\u{D30C}\u{0334}\u{11B5}", - nfd: "\u{1111}\u{1161}\u{0334}\u{11B5}", - nfkc: "\u{D30C}\u{0334}\u{11B5}", - nfkd: "\u{1111}\u{1161}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{D360}\u{0334}\u{11BC}", - nfc: "\u{D360}\u{0334}\u{11BC}", - nfd: "\u{1111}\u{1164}\u{0334}\u{11BC}", - nfkc: "\u{D360}\u{0334}\u{11BC}", - nfkd: "\u{1111}\u{1164}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{D424}\u{0334}\u{11AE}", - nfc: "\u{D424}\u{0334}\u{11AE}", - nfd: "\u{1111}\u{116B}\u{0334}\u{11AE}", - nfkc: "\u{D424}\u{0334}\u{11AE}", - nfkd: "\u{1111}\u{116B}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{D478}\u{0334}\u{11B5}", - nfc: "\u{D478}\u{0334}\u{11B5}", - nfd: "\u{1111}\u{116E}\u{0334}\u{11B5}", - nfkc: "\u{D478}\u{0334}\u{11B5}", - nfkd: "\u{1111}\u{116E}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{D4CC}\u{0334}\u{11BC}", - nfc: "\u{D4CC}\u{0334}\u{11BC}", - nfd: "\u{1111}\u{1171}\u{0334}\u{11BC}", - nfkc: "\u{D4CC}\u{0334}\u{11BC}", - nfkd: "\u{1111}\u{1171}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{D590}\u{0334}\u{11AE}", - nfc: "\u{D590}\u{0334}\u{11AE}", - nfd: "\u{1112}\u{1163}\u{0334}\u{11AE}", - nfkc: "\u{D590}\u{0334}\u{11AE}", - nfkd: "\u{1112}\u{1163}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{D5E4}\u{0334}\u{11B5}", - nfc: "\u{D5E4}\u{0334}\u{11B5}", - nfd: "\u{1112}\u{1166}\u{0334}\u{11B5}", - nfkc: "\u{D5E4}\u{0334}\u{11B5}", - nfkd: "\u{1112}\u{1166}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{D638}\u{0334}\u{11BC}", - nfc: "\u{D638}\u{0334}\u{11BC}", - nfd: "\u{1112}\u{1169}\u{0334}\u{11BC}", - nfkc: "\u{D638}\u{0334}\u{11BC}", - nfkd: "\u{1112}\u{1169}\u{0334}\u{11BC}", - }, - NormalizationTest { - source: "\u{D6FC}\u{0334}\u{11AE}", - nfc: "\u{D6FC}\u{0334}\u{11AE}", - nfd: "\u{1112}\u{1170}\u{0334}\u{11AE}", - nfkc: "\u{D6FC}\u{0334}\u{11AE}", - nfkd: "\u{1112}\u{1170}\u{0334}\u{11AE}", - }, - NormalizationTest { - source: "\u{D750}\u{0334}\u{11B5}", - nfc: "\u{D750}\u{0334}\u{11B5}", - nfd: "\u{1112}\u{1173}\u{0334}\u{11B5}", - nfkc: "\u{D750}\u{0334}\u{11B5}", - nfkd: "\u{1112}\u{1173}\u{0334}\u{11B5}", - }, - NormalizationTest { - source: "\u{11131}\u{0334}\u{11127}", - nfc: "\u{11131}\u{0334}\u{11127}", - nfd: "\u{11131}\u{0334}\u{11127}", - nfkc: "\u{11131}\u{0334}\u{11127}", - nfkd: "\u{11131}\u{0334}\u{11127}", - }, - NormalizationTest { - source: "\u{11132}\u{0334}\u{11127}", - nfc: "\u{11132}\u{0334}\u{11127}", - nfd: "\u{11132}\u{0334}\u{11127}", - nfkc: "\u{11132}\u{0334}\u{11127}", - nfkd: "\u{11132}\u{0334}\u{11127}", - }, - NormalizationTest { - source: "\u{11347}\u{0334}\u{1133E}", - nfc: "\u{11347}\u{0334}\u{1133E}", - nfd: "\u{11347}\u{0334}\u{1133E}", - nfkc: "\u{11347}\u{0334}\u{1133E}", - nfkd: "\u{11347}\u{0334}\u{1133E}", - }, - NormalizationTest { - source: "\u{11347}\u{0334}\u{11357}", - nfc: "\u{11347}\u{0334}\u{11357}", - nfd: "\u{11347}\u{0334}\u{11357}", - nfkc: "\u{11347}\u{0334}\u{11357}", - nfkd: "\u{11347}\u{0334}\u{11357}", - }, - NormalizationTest { - source: "\u{114B9}\u{0334}\u{114B0}", - nfc: "\u{114B9}\u{0334}\u{114B0}", - nfd: "\u{114B9}\u{0334}\u{114B0}", - nfkc: "\u{114B9}\u{0334}\u{114B0}", - nfkd: "\u{114B9}\u{0334}\u{114B0}", - }, - NormalizationTest { - source: "\u{114B9}\u{0334}\u{114BA}", - nfc: "\u{114B9}\u{0334}\u{114BA}", - nfd: "\u{114B9}\u{0334}\u{114BA}", - nfkc: "\u{114B9}\u{0334}\u{114BA}", - nfkd: "\u{114B9}\u{0334}\u{114BA}", - }, - NormalizationTest { - source: "\u{114B9}\u{0334}\u{114BD}", - nfc: "\u{114B9}\u{0334}\u{114BD}", - nfd: "\u{114B9}\u{0334}\u{114BD}", - nfkc: "\u{114B9}\u{0334}\u{114BD}", - nfkd: "\u{114B9}\u{0334}\u{114BD}", - }, - NormalizationTest { - source: "\u{115B8}\u{0334}\u{115AF}", - nfc: "\u{115B8}\u{0334}\u{115AF}", - nfd: "\u{115B8}\u{0334}\u{115AF}", - nfkc: "\u{115B8}\u{0334}\u{115AF}", - nfkd: "\u{115B8}\u{0334}\u{115AF}", - }, - NormalizationTest { - source: "\u{115B9}\u{0334}\u{115AF}", - nfc: "\u{115B9}\u{0334}\u{115AF}", - nfd: "\u{115B9}\u{0334}\u{115AF}", - nfkc: "\u{115B9}\u{0334}\u{115AF}", - nfkd: "\u{115B9}\u{0334}\u{115AF}", - }, -]; diff --git a/vendor/unicode-normalization/src/normalize.rs b/vendor/unicode-normalization/src/normalize.rs index b7f44345df..87456df16f 100644 --- a/vendor/unicode-normalization/src/normalize.rs +++ b/vendor/unicode-normalization/src/normalize.rs @@ -11,14 +11,14 @@ //! Functions for computing canonical and compatible decompositions for Unicode characters. use std::char; use std::ops::FnMut; -use tables; +use lookups::{canonical_fully_decomposed, composition_table, compatibility_fully_decomposed}; /// Compute canonical Unicode decomposition for character. /// See [Unicode Standard Annex #15](http://www.unicode.org/reports/tr15/) /// for more information. #[inline] pub fn decompose_canonical<F>(c: char, emit_char: F) where F: FnMut(char) { - decompose(c, tables::canonical_fully_decomposed, emit_char) + decompose(c, canonical_fully_decomposed, emit_char) } /// Compute canonical or compatible Unicode decomposition for character. @@ -26,8 +26,8 @@ pub fn decompose_canonical<F>(c: char, emit_char: F) where F: FnMut(char) { /// for more information. #[inline] pub fn decompose_compatible<F: FnMut(char)>(c: char, emit_char: F) { - let decompose_char = |c| tables::compatibility_fully_decomposed(c) - .or_else(|| tables::canonical_fully_decomposed(c)); + let decompose_char = |c| compatibility_fully_decomposed(c) + .or_else(|| canonical_fully_decomposed(c)); decompose(c, decompose_char, emit_char) } @@ -62,7 +62,7 @@ fn decompose<D, F>(c: char, decompose_char: D, mut emit_char: F) /// See [Unicode Standard Annex #15](http://www.unicode.org/reports/tr15/) /// for more information. pub fn compose(a: char, b: char) -> Option<char> { - compose_hangul(a, b).or_else(|| tables::composition_table(a, b)) + compose_hangul(a, b).or_else(|| composition_table(a, b)) } // Constants from Unicode 9.0.0 Section 3.12 Conjoining Jamo Behavior @@ -119,6 +119,7 @@ pub(crate) fn hangul_decomposition_length(s: char) -> usize { // Compose a pair of Hangul Jamo #[allow(unsafe_code)] #[inline(always)] +#[allow(ellipsis_inclusive_range_patterns)] fn compose_hangul(a: char, b: char) -> Option<char> { let (a, b) = (a as u32, b as u32); match (a, b) { diff --git a/vendor/unicode-normalization/src/perfect_hash.rs b/vendor/unicode-normalization/src/perfect_hash.rs new file mode 100644 index 0000000000..0a817144f3 --- /dev/null +++ b/vendor/unicode-normalization/src/perfect_hash.rs @@ -0,0 +1,41 @@ +// Copyright 2019 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Support for lookups based on minimal perfect hashing. + +// This function is based on multiplication being fast and is "good enough". Also +// it can share some work between the unsalted and salted versions. +#[inline] +fn my_hash(key: u32, salt: u32, n: usize) -> usize { + let y = key.wrapping_add(salt).wrapping_mul(2654435769); + let y = y ^ key.wrapping_mul(0x31415926); + (((y as u64) * (n as u64)) >> 32) as usize +} + +/// Do a lookup using minimal perfect hashing. +/// +/// The table is stored as a sequence of "salt" values, then a sequence of +/// values that contain packed key/value pairs. The strategy is to hash twice. +/// The first hash retrieves a salt value that makes the second hash unique. +/// The hash function doesn't have to be very good, just good enough that the +/// resulting map is unique. +#[inline] +pub(crate) fn mph_lookup<KV, V, FK, FV>(x: u32, salt: &[u16], kv: &[KV], fk: FK, fv: FV, + default: V) -> V + where KV: Copy, FK: Fn(KV) -> u32, FV: Fn(KV) -> V +{ + let s = salt[my_hash(x, 0, salt.len())] as u32; + let key_val = kv[my_hash(x, s, salt.len())]; + if x == fk(key_val) { + fv(key_val) + } else { + default + } +} diff --git a/vendor/unicode-normalization/src/quick_check.rs b/vendor/unicode-normalization/src/quick_check.rs index 63dab1cbe3..49b1460068 100644 --- a/vendor/unicode-normalization/src/quick_check.rs +++ b/vendor/unicode-normalization/src/quick_check.rs @@ -1,4 +1,5 @@ use UnicodeNormalization; +use lookups::canonical_combining_class; use stream_safe; use tables; @@ -32,7 +33,7 @@ fn quick_check<F, I>(s: I, is_allowed: F, stream_safe: bool) -> IsNormalized } // Otherwise, lookup the combining class and QC property - let cc = tables::canonical_combining_class(ch); + let cc = canonical_combining_class(ch); if last_cc > cc && cc != 0 { return IsNormalized::No; } @@ -70,12 +71,25 @@ pub fn is_nfc_quick<I: Iterator<Item=char>>(s: I) -> IsNormalized { quick_check(s, tables::qc_nfc, false) } + +/// Quickly check if a string is in NFKC. +#[inline] +pub fn is_nfkc_quick<I: Iterator<Item=char>>(s: I) -> IsNormalized { + quick_check(s, tables::qc_nfkc, false) +} + /// Quickly check if a string is in NFD. #[inline] pub fn is_nfd_quick<I: Iterator<Item=char>>(s: I) -> IsNormalized { quick_check(s, tables::qc_nfd, false) } +/// Quickly check if a string is in NFKD. +#[inline] +pub fn is_nfkd_quick<I: Iterator<Item=char>>(s: I) -> IsNormalized { + quick_check(s, tables::qc_nfkd, false) +} + /// Quickly check if a string is Stream-Safe NFC. #[inline] pub fn is_nfc_stream_safe_quick<I: Iterator<Item=char>>(s: I) -> IsNormalized { @@ -98,6 +112,16 @@ pub fn is_nfc(s: &str) -> bool { } } +/// Authoritatively check if a string is in NFKC. +#[inline] +pub fn is_nfkc(s: &str) -> bool { + match is_nfkc_quick(s.chars()) { + IsNormalized::Yes => true, + IsNormalized::No => false, + IsNormalized::Maybe => s.chars().eq(s.chars().nfkc()), + } +} + /// Authoritatively check if a string is in NFD. #[inline] pub fn is_nfd(s: &str) -> bool { @@ -108,6 +132,16 @@ pub fn is_nfd(s: &str) -> bool { } } +/// Authoritatively check if a string is in NFKD. +#[inline] +pub fn is_nfkd(s: &str) -> bool { + match is_nfkd_quick(s.chars()) { + IsNormalized::Yes => true, + IsNormalized::No => false, + IsNormalized::Maybe => s.chars().eq(s.chars().nfkd()), + } +} + /// Authoritatively check if a string is Stream-Safe NFC. #[inline] pub fn is_nfc_stream_safe(s: &str) -> bool { diff --git a/vendor/unicode-normalization/src/recompose.rs b/vendor/unicode-normalization/src/recompose.rs index 76740f0bfe..4c2bf9793c 100644 --- a/vendor/unicode-normalization/src/recompose.rs +++ b/vendor/unicode-normalization/src/recompose.rs @@ -8,15 +8,15 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use std::collections::VecDeque; -use std::fmt::{self, Write}; use decompose::Decompositions; +use smallvec::SmallVec; +use std::fmt::{self, Write}; #[derive(Clone)] enum RecompositionState { Composing, - Purging, - Finished + Purging(usize), + Finished(usize), } /// External iterator for a string recomposition's characters. @@ -24,9 +24,9 @@ enum RecompositionState { pub struct Recompositions<I> { iter: Decompositions<I>, state: RecompositionState, - buffer: VecDeque<char>, + buffer: SmallVec<[char; 4]>, composee: Option<char>, - last_ccc: Option<u8> + last_ccc: Option<u8>, } #[inline] @@ -34,7 +34,7 @@ pub fn new_canonical<I: Iterator<Item=char>>(iter: I) -> Recompositions<I> { Recompositions { iter: super::decompose::new_canonical(iter), state: self::RecompositionState::Composing, - buffer: VecDeque::new(), + buffer: SmallVec::new(), composee: None, last_ccc: None, } @@ -45,7 +45,7 @@ pub fn new_compatible<I: Iterator<Item=char>>(iter: I) -> Recompositions<I> { Recompositions { iter: super::decompose::new_compatible(iter), state: self::RecompositionState::Composing, - buffer: VecDeque::new(), + buffer: SmallVec::new(), composee: None, last_ccc: None, } @@ -85,7 +85,7 @@ impl<I: Iterator<Item=char>> Iterator for Recompositions<I> { self.composee = Some(ch); return Some(k); } - self.buffer.push_back(ch); + self.buffer.push(ch); self.last_ccc = Some(ch_class); } } @@ -96,10 +96,10 @@ impl<I: Iterator<Item=char>> Iterator for Recompositions<I> { if ch_class == 0 { self.composee = Some(ch); self.last_ccc = None; - self.state = Purging; + self.state = Purging(0); return Some(k); } - self.buffer.push_back(ch); + self.buffer.push(ch); self.last_ccc = Some(ch_class); continue; } @@ -109,28 +109,40 @@ impl<I: Iterator<Item=char>> Iterator for Recompositions<I> { continue; } None => { - self.buffer.push_back(ch); + self.buffer.push(ch); self.last_ccc = Some(ch_class); } } } } } - self.state = Finished; + self.state = Finished(0); if self.composee.is_some() { return self.composee.take(); } } - Purging => { - match self.buffer.pop_front() { - None => self.state = Composing, - s => return s + Purging(next) => { + match self.buffer.get(next).cloned() { + None => { + self.buffer.clear(); + self.state = Composing; + } + s => { + self.state = Purging(next + 1); + return s + } } } - Finished => { - match self.buffer.pop_front() { - None => return self.composee.take(), - s => return s + Finished(next) => { + match self.buffer.get(next).cloned() { + None => { + self.buffer.clear(); + return self.composee.take() + } + s => { + self.state = Finished(next + 1); + return s + } } } } diff --git a/vendor/unicode-normalization/src/stream_safe.rs b/vendor/unicode-normalization/src/stream_safe.rs index 8bc48f6367..2cfcc36a92 100644 --- a/vendor/unicode-normalization/src/stream_safe.rs +++ b/vendor/unicode-normalization/src/stream_safe.rs @@ -2,7 +2,11 @@ use normalize::{ hangul_decomposition_length, is_hangul_syllable, }; -use tables; +use lookups::{ + canonical_combining_class, canonical_fully_decomposed, compatibility_fully_decomposed, + stream_safe_trailing_nonstarters, +}; +use tables::stream_safe_leading_nonstarters; pub(crate) const MAX_NONSTARTERS: usize = 30; const COMBINING_GRAPHEME_JOINER: char = '\u{034F}'; @@ -78,18 +82,18 @@ pub(crate) fn classify_nonstarters(c: char) -> Decomposition { decomposition_len: hangul_decomposition_length(c), }; } - let decomp = tables::compatibility_fully_decomposed(c) - .or_else(|| tables::canonical_fully_decomposed(c)); + let decomp = compatibility_fully_decomposed(c) + .or_else(|| canonical_fully_decomposed(c)); match decomp { Some(decomp) => { Decomposition { - leading_nonstarters: tables::stream_safe_leading_nonstarters(c), - trailing_nonstarters: tables::stream_safe_trailing_nonstarters(c), + leading_nonstarters: stream_safe_leading_nonstarters(c), + trailing_nonstarters: stream_safe_trailing_nonstarters(c), decomposition_len: decomp.len(), } }, None => { - let is_nonstarter = tables::canonical_combining_class(c) != 0; + let is_nonstarter = canonical_combining_class(c) != 0; let nonstarter = if is_nonstarter { 1 } else { 0 }; Decomposition { leading_nonstarters: nonstarter, @@ -107,23 +111,13 @@ mod tests { classify_nonstarters, }; use std::char; - use normalization_tests::NORMALIZATION_TESTS; use normalize::decompose_compatible; - use tables; + use lookups::canonical_combining_class; fn stream_safe(s: &str) -> String { StreamSafe::new(s.chars()).collect() } - #[test] - fn test_normalization_tests_unaffected() { - for test in NORMALIZATION_TESTS { - for &s in &[test.source, test.nfc, test.nfd, test.nfkc, test.nfkd] { - assert_eq!(stream_safe(s), s); - } - } - } - #[test] fn test_simple() { let technically_okay = "Da\u{0300}\u{0301}\u{0302}\u{0303}\u{0304}\u{0305}\u{0306}\u{0307}\u{0308}\u{0309}\u{030a}\u{030b}\u{030c}\u{030d}\u{030e}\u{030f}\u{0310}\u{0311}\u{0312}\u{0313}\u{0314}\u{0315}\u{0316}\u{0317}\u{0318}\u{0319}\u{031a}\u{031b}\u{031c}\u{031d}ngerzone"; @@ -149,12 +143,12 @@ mod tests { let num_leading = s .iter() - .take_while(|&c| tables::canonical_combining_class(*c) != 0) + .take_while(|&c| canonical_combining_class(*c) != 0) .count(); let num_trailing = s .iter() .rev() - .take_while(|&c| tables::canonical_combining_class(*c) != 0) + .take_while(|&c| canonical_combining_class(*c) != 0) .count(); assert_eq!(num_leading, c.leading_nonstarters); diff --git a/vendor/unicode-normalization/src/tables.rs b/vendor/unicode-normalization/src/tables.rs index 17ff585f55..f92898d074 100644 --- a/vendor/unicode-normalization/src/tables.rs +++ b/vendor/unicode-normalization/src/tables.rs @@ -17,1758 +17,3503 @@ use quick_check::IsNormalized::*; #[allow(unused)] pub const UNICODE_VERSION: (u64, u64, u64) = (9, 0, 0); -#[inline] -pub fn canonical_combining_class(c: char) -> u8 { - match c { - '\u{0300}' => 230, - '\u{0301}' => 230, - '\u{0302}' => 230, - '\u{0303}' => 230, - '\u{0304}' => 230, - '\u{0305}' => 230, - '\u{0306}' => 230, - '\u{0307}' => 230, - '\u{0308}' => 230, - '\u{0309}' => 230, - '\u{030A}' => 230, - '\u{030B}' => 230, - '\u{030C}' => 230, - '\u{030D}' => 230, - '\u{030E}' => 230, - '\u{030F}' => 230, - '\u{0310}' => 230, - '\u{0311}' => 230, - '\u{0312}' => 230, - '\u{0313}' => 230, - '\u{0314}' => 230, - '\u{0315}' => 232, - '\u{0316}' => 220, - '\u{0317}' => 220, - '\u{0318}' => 220, - '\u{0319}' => 220, - '\u{031A}' => 232, - '\u{031B}' => 216, - '\u{031C}' => 220, - '\u{031D}' => 220, - '\u{031E}' => 220, - '\u{031F}' => 220, - '\u{0320}' => 220, - '\u{0321}' => 202, - '\u{0322}' => 202, - '\u{0323}' => 220, - '\u{0324}' => 220, - '\u{0325}' => 220, - '\u{0326}' => 220, - '\u{0327}' => 202, - '\u{0328}' => 202, - '\u{0329}' => 220, - '\u{032A}' => 220, - '\u{032B}' => 220, - '\u{032C}' => 220, - '\u{032D}' => 220, - '\u{032E}' => 220, - '\u{032F}' => 220, - '\u{0330}' => 220, - '\u{0331}' => 220, - '\u{0332}' => 220, - '\u{0333}' => 220, - '\u{0334}' => 1, - '\u{0335}' => 1, - '\u{0336}' => 1, - '\u{0337}' => 1, - '\u{0338}' => 1, - '\u{0339}' => 220, - '\u{033A}' => 220, - '\u{033B}' => 220, - '\u{033C}' => 220, - '\u{033D}' => 230, - '\u{033E}' => 230, - '\u{033F}' => 230, - '\u{0340}' => 230, - '\u{0341}' => 230, - '\u{0342}' => 230, - '\u{0343}' => 230, - '\u{0344}' => 230, - '\u{0345}' => 240, - '\u{0346}' => 230, - '\u{0347}' => 220, - '\u{0348}' => 220, - '\u{0349}' => 220, - '\u{034A}' => 230, - '\u{034B}' => 230, - '\u{034C}' => 230, - '\u{034D}' => 220, - '\u{034E}' => 220, - '\u{0350}' => 230, - '\u{0351}' => 230, - '\u{0352}' => 230, - '\u{0353}' => 220, - '\u{0354}' => 220, - '\u{0355}' => 220, - '\u{0356}' => 220, - '\u{0357}' => 230, - '\u{0358}' => 232, - '\u{0359}' => 220, - '\u{035A}' => 220, - '\u{035B}' => 230, - '\u{035C}' => 233, - '\u{035D}' => 234, - '\u{035E}' => 234, - '\u{035F}' => 233, - '\u{0360}' => 234, - '\u{0361}' => 234, - '\u{0362}' => 233, - '\u{0363}' => 230, - '\u{0364}' => 230, - '\u{0365}' => 230, - '\u{0366}' => 230, - '\u{0367}' => 230, - '\u{0368}' => 230, - '\u{0369}' => 230, - '\u{036A}' => 230, - '\u{036B}' => 230, - '\u{036C}' => 230, - '\u{036D}' => 230, - '\u{036E}' => 230, - '\u{036F}' => 230, - '\u{0483}' => 230, - '\u{0484}' => 230, - '\u{0485}' => 230, - '\u{0486}' => 230, - '\u{0487}' => 230, - '\u{0591}' => 220, - '\u{0592}' => 230, - '\u{0593}' => 230, - '\u{0594}' => 230, - '\u{0595}' => 230, - '\u{0596}' => 220, - '\u{0597}' => 230, - '\u{0598}' => 230, - '\u{0599}' => 230, - '\u{059A}' => 222, - '\u{059B}' => 220, - '\u{059C}' => 230, - '\u{059D}' => 230, - '\u{059E}' => 230, - '\u{059F}' => 230, - '\u{05A0}' => 230, - '\u{05A1}' => 230, - '\u{05A2}' => 220, - '\u{05A3}' => 220, - '\u{05A4}' => 220, - '\u{05A5}' => 220, - '\u{05A6}' => 220, - '\u{05A7}' => 220, - '\u{05A8}' => 230, - '\u{05A9}' => 230, - '\u{05AA}' => 220, - '\u{05AB}' => 230, - '\u{05AC}' => 230, - '\u{05AD}' => 222, - '\u{05AE}' => 228, - '\u{05AF}' => 230, - '\u{05B0}' => 10, - '\u{05B1}' => 11, - '\u{05B2}' => 12, - '\u{05B3}' => 13, - '\u{05B4}' => 14, - '\u{05B5}' => 15, - '\u{05B6}' => 16, - '\u{05B7}' => 17, - '\u{05B8}' => 18, - '\u{05B9}' => 19, - '\u{05BA}' => 19, - '\u{05BB}' => 20, - '\u{05BC}' => 21, - '\u{05BD}' => 22, - '\u{05BF}' => 23, - '\u{05C1}' => 24, - '\u{05C2}' => 25, - '\u{05C4}' => 230, - '\u{05C5}' => 220, - '\u{05C7}' => 18, - '\u{0610}' => 230, - '\u{0611}' => 230, - '\u{0612}' => 230, - '\u{0613}' => 230, - '\u{0614}' => 230, - '\u{0615}' => 230, - '\u{0616}' => 230, - '\u{0617}' => 230, - '\u{0618}' => 30, - '\u{0619}' => 31, - '\u{061A}' => 32, - '\u{064B}' => 27, - '\u{064C}' => 28, - '\u{064D}' => 29, - '\u{064E}' => 30, - '\u{064F}' => 31, - '\u{0650}' => 32, - '\u{0651}' => 33, - '\u{0652}' => 34, - '\u{0653}' => 230, - '\u{0654}' => 230, - '\u{0655}' => 220, - '\u{0656}' => 220, - '\u{0657}' => 230, - '\u{0658}' => 230, - '\u{0659}' => 230, - '\u{065A}' => 230, - '\u{065B}' => 230, - '\u{065C}' => 220, - '\u{065D}' => 230, - '\u{065E}' => 230, - '\u{065F}' => 220, - '\u{0670}' => 35, - '\u{06D6}' => 230, - '\u{06D7}' => 230, - '\u{06D8}' => 230, - '\u{06D9}' => 230, - '\u{06DA}' => 230, - '\u{06DB}' => 230, - '\u{06DC}' => 230, - '\u{06DF}' => 230, - '\u{06E0}' => 230, - '\u{06E1}' => 230, - '\u{06E2}' => 230, - '\u{06E3}' => 220, - '\u{06E4}' => 230, - '\u{06E7}' => 230, - '\u{06E8}' => 230, - '\u{06EA}' => 220, - '\u{06EB}' => 230, - '\u{06EC}' => 230, - '\u{06ED}' => 220, - '\u{0711}' => 36, - '\u{0730}' => 230, - '\u{0731}' => 220, - '\u{0732}' => 230, - '\u{0733}' => 230, - '\u{0734}' => 220, - '\u{0735}' => 230, - '\u{0736}' => 230, - '\u{0737}' => 220, - '\u{0738}' => 220, - '\u{0739}' => 220, - '\u{073A}' => 230, - '\u{073B}' => 220, - '\u{073C}' => 220, - '\u{073D}' => 230, - '\u{073E}' => 220, - '\u{073F}' => 230, - '\u{0740}' => 230, - '\u{0741}' => 230, - '\u{0742}' => 220, - '\u{0743}' => 230, - '\u{0744}' => 220, - '\u{0745}' => 230, - '\u{0746}' => 220, - '\u{0747}' => 230, - '\u{0748}' => 220, - '\u{0749}' => 230, - '\u{074A}' => 230, - '\u{07EB}' => 230, - '\u{07EC}' => 230, - '\u{07ED}' => 230, - '\u{07EE}' => 230, - '\u{07EF}' => 230, - '\u{07F0}' => 230, - '\u{07F1}' => 230, - '\u{07F2}' => 220, - '\u{07F3}' => 230, - '\u{0816}' => 230, - '\u{0817}' => 230, - '\u{0818}' => 230, - '\u{0819}' => 230, - '\u{081B}' => 230, - '\u{081C}' => 230, - '\u{081D}' => 230, - '\u{081E}' => 230, - '\u{081F}' => 230, - '\u{0820}' => 230, - '\u{0821}' => 230, - '\u{0822}' => 230, - '\u{0823}' => 230, - '\u{0825}' => 230, - '\u{0826}' => 230, - '\u{0827}' => 230, - '\u{0829}' => 230, - '\u{082A}' => 230, - '\u{082B}' => 230, - '\u{082C}' => 230, - '\u{082D}' => 230, - '\u{0859}' => 220, - '\u{085A}' => 220, - '\u{085B}' => 220, - '\u{08D4}' => 230, - '\u{08D5}' => 230, - '\u{08D6}' => 230, - '\u{08D7}' => 230, - '\u{08D8}' => 230, - '\u{08D9}' => 230, - '\u{08DA}' => 230, - '\u{08DB}' => 230, - '\u{08DC}' => 230, - '\u{08DD}' => 230, - '\u{08DE}' => 230, - '\u{08DF}' => 230, - '\u{08E0}' => 230, - '\u{08E1}' => 230, - '\u{08E3}' => 220, - '\u{08E4}' => 230, - '\u{08E5}' => 230, - '\u{08E6}' => 220, - '\u{08E7}' => 230, - '\u{08E8}' => 230, - '\u{08E9}' => 220, - '\u{08EA}' => 230, - '\u{08EB}' => 230, - '\u{08EC}' => 230, - '\u{08ED}' => 220, - '\u{08EE}' => 220, - '\u{08EF}' => 220, - '\u{08F0}' => 27, - '\u{08F1}' => 28, - '\u{08F2}' => 29, - '\u{08F3}' => 230, - '\u{08F4}' => 230, - '\u{08F5}' => 230, - '\u{08F6}' => 220, - '\u{08F7}' => 230, - '\u{08F8}' => 230, - '\u{08F9}' => 220, - '\u{08FA}' => 220, - '\u{08FB}' => 230, - '\u{08FC}' => 230, - '\u{08FD}' => 230, - '\u{08FE}' => 230, - '\u{08FF}' => 230, - '\u{093C}' => 7, - '\u{094D}' => 9, - '\u{0951}' => 230, - '\u{0952}' => 220, - '\u{0953}' => 230, - '\u{0954}' => 230, - '\u{09BC}' => 7, - '\u{09CD}' => 9, - '\u{0A3C}' => 7, - '\u{0A4D}' => 9, - '\u{0ABC}' => 7, - '\u{0ACD}' => 9, - '\u{0B3C}' => 7, - '\u{0B4D}' => 9, - '\u{0BCD}' => 9, - '\u{0C4D}' => 9, - '\u{0C55}' => 84, - '\u{0C56}' => 91, - '\u{0CBC}' => 7, - '\u{0CCD}' => 9, - '\u{0D4D}' => 9, - '\u{0DCA}' => 9, - '\u{0E38}' => 103, - '\u{0E39}' => 103, - '\u{0E3A}' => 9, - '\u{0E48}' => 107, - '\u{0E49}' => 107, - '\u{0E4A}' => 107, - '\u{0E4B}' => 107, - '\u{0EB8}' => 118, - '\u{0EB9}' => 118, - '\u{0EC8}' => 122, - '\u{0EC9}' => 122, - '\u{0ECA}' => 122, - '\u{0ECB}' => 122, - '\u{0F18}' => 220, - '\u{0F19}' => 220, - '\u{0F35}' => 220, - '\u{0F37}' => 220, - '\u{0F39}' => 216, - '\u{0F71}' => 129, - '\u{0F72}' => 130, - '\u{0F74}' => 132, - '\u{0F7A}' => 130, - '\u{0F7B}' => 130, - '\u{0F7C}' => 130, - '\u{0F7D}' => 130, - '\u{0F80}' => 130, - '\u{0F82}' => 230, - '\u{0F83}' => 230, - '\u{0F84}' => 9, - '\u{0F86}' => 230, - '\u{0F87}' => 230, - '\u{0FC6}' => 220, - '\u{1037}' => 7, - '\u{1039}' => 9, - '\u{103A}' => 9, - '\u{108D}' => 220, - '\u{135D}' => 230, - '\u{135E}' => 230, - '\u{135F}' => 230, - '\u{1714}' => 9, - '\u{1734}' => 9, - '\u{17D2}' => 9, - '\u{17DD}' => 230, - '\u{18A9}' => 228, - '\u{1939}' => 222, - '\u{193A}' => 230, - '\u{193B}' => 220, - '\u{1A17}' => 230, - '\u{1A18}' => 220, - '\u{1A60}' => 9, - '\u{1A75}' => 230, - '\u{1A76}' => 230, - '\u{1A77}' => 230, - '\u{1A78}' => 230, - '\u{1A79}' => 230, - '\u{1A7A}' => 230, - '\u{1A7B}' => 230, - '\u{1A7C}' => 230, - '\u{1A7F}' => 220, - '\u{1AB0}' => 230, - '\u{1AB1}' => 230, - '\u{1AB2}' => 230, - '\u{1AB3}' => 230, - '\u{1AB4}' => 230, - '\u{1AB5}' => 220, - '\u{1AB6}' => 220, - '\u{1AB7}' => 220, - '\u{1AB8}' => 220, - '\u{1AB9}' => 220, - '\u{1ABA}' => 220, - '\u{1ABB}' => 230, - '\u{1ABC}' => 230, - '\u{1ABD}' => 220, - '\u{1B34}' => 7, - '\u{1B44}' => 9, - '\u{1B6B}' => 230, - '\u{1B6C}' => 220, - '\u{1B6D}' => 230, - '\u{1B6E}' => 230, - '\u{1B6F}' => 230, - '\u{1B70}' => 230, - '\u{1B71}' => 230, - '\u{1B72}' => 230, - '\u{1B73}' => 230, - '\u{1BAA}' => 9, - '\u{1BAB}' => 9, - '\u{1BE6}' => 7, - '\u{1BF2}' => 9, - '\u{1BF3}' => 9, - '\u{1C37}' => 7, - '\u{1CD0}' => 230, - '\u{1CD1}' => 230, - '\u{1CD2}' => 230, - '\u{1CD4}' => 1, - '\u{1CD5}' => 220, - '\u{1CD6}' => 220, - '\u{1CD7}' => 220, - '\u{1CD8}' => 220, - '\u{1CD9}' => 220, - '\u{1CDA}' => 230, - '\u{1CDB}' => 230, - '\u{1CDC}' => 220, - '\u{1CDD}' => 220, - '\u{1CDE}' => 220, - '\u{1CDF}' => 220, - '\u{1CE0}' => 230, - '\u{1CE2}' => 1, - '\u{1CE3}' => 1, - '\u{1CE4}' => 1, - '\u{1CE5}' => 1, - '\u{1CE6}' => 1, - '\u{1CE7}' => 1, - '\u{1CE8}' => 1, - '\u{1CED}' => 220, - '\u{1CF4}' => 230, - '\u{1CF8}' => 230, - '\u{1CF9}' => 230, - '\u{1DC0}' => 230, - '\u{1DC1}' => 230, - '\u{1DC2}' => 220, - '\u{1DC3}' => 230, - '\u{1DC4}' => 230, - '\u{1DC5}' => 230, - '\u{1DC6}' => 230, - '\u{1DC7}' => 230, - '\u{1DC8}' => 230, - '\u{1DC9}' => 230, - '\u{1DCA}' => 220, - '\u{1DCB}' => 230, - '\u{1DCC}' => 230, - '\u{1DCD}' => 234, - '\u{1DCE}' => 214, - '\u{1DCF}' => 220, - '\u{1DD0}' => 202, - '\u{1DD1}' => 230, - '\u{1DD2}' => 230, - '\u{1DD3}' => 230, - '\u{1DD4}' => 230, - '\u{1DD5}' => 230, - '\u{1DD6}' => 230, - '\u{1DD7}' => 230, - '\u{1DD8}' => 230, - '\u{1DD9}' => 230, - '\u{1DDA}' => 230, - '\u{1DDB}' => 230, - '\u{1DDC}' => 230, - '\u{1DDD}' => 230, - '\u{1DDE}' => 230, - '\u{1DDF}' => 230, - '\u{1DE0}' => 230, - '\u{1DE1}' => 230, - '\u{1DE2}' => 230, - '\u{1DE3}' => 230, - '\u{1DE4}' => 230, - '\u{1DE5}' => 230, - '\u{1DE6}' => 230, - '\u{1DE7}' => 230, - '\u{1DE8}' => 230, - '\u{1DE9}' => 230, - '\u{1DEA}' => 230, - '\u{1DEB}' => 230, - '\u{1DEC}' => 230, - '\u{1DED}' => 230, - '\u{1DEE}' => 230, - '\u{1DEF}' => 230, - '\u{1DF0}' => 230, - '\u{1DF1}' => 230, - '\u{1DF2}' => 230, - '\u{1DF3}' => 230, - '\u{1DF4}' => 230, - '\u{1DF5}' => 230, - '\u{1DFB}' => 230, - '\u{1DFC}' => 233, - '\u{1DFD}' => 220, - '\u{1DFE}' => 230, - '\u{1DFF}' => 220, - '\u{20D0}' => 230, - '\u{20D1}' => 230, - '\u{20D2}' => 1, - '\u{20D3}' => 1, - '\u{20D4}' => 230, - '\u{20D5}' => 230, - '\u{20D6}' => 230, - '\u{20D7}' => 230, - '\u{20D8}' => 1, - '\u{20D9}' => 1, - '\u{20DA}' => 1, - '\u{20DB}' => 230, - '\u{20DC}' => 230, - '\u{20E1}' => 230, - '\u{20E5}' => 1, - '\u{20E6}' => 1, - '\u{20E7}' => 230, - '\u{20E8}' => 220, - '\u{20E9}' => 230, - '\u{20EA}' => 1, - '\u{20EB}' => 1, - '\u{20EC}' => 220, - '\u{20ED}' => 220, - '\u{20EE}' => 220, - '\u{20EF}' => 220, - '\u{20F0}' => 230, - '\u{2CEF}' => 230, - '\u{2CF0}' => 230, - '\u{2CF1}' => 230, - '\u{2D7F}' => 9, - '\u{2DE0}' => 230, - '\u{2DE1}' => 230, - '\u{2DE2}' => 230, - '\u{2DE3}' => 230, - '\u{2DE4}' => 230, - '\u{2DE5}' => 230, - '\u{2DE6}' => 230, - '\u{2DE7}' => 230, - '\u{2DE8}' => 230, - '\u{2DE9}' => 230, - '\u{2DEA}' => 230, - '\u{2DEB}' => 230, - '\u{2DEC}' => 230, - '\u{2DED}' => 230, - '\u{2DEE}' => 230, - '\u{2DEF}' => 230, - '\u{2DF0}' => 230, - '\u{2DF1}' => 230, - '\u{2DF2}' => 230, - '\u{2DF3}' => 230, - '\u{2DF4}' => 230, - '\u{2DF5}' => 230, - '\u{2DF6}' => 230, - '\u{2DF7}' => 230, - '\u{2DF8}' => 230, - '\u{2DF9}' => 230, - '\u{2DFA}' => 230, - '\u{2DFB}' => 230, - '\u{2DFC}' => 230, - '\u{2DFD}' => 230, - '\u{2DFE}' => 230, - '\u{2DFF}' => 230, - '\u{302A}' => 218, - '\u{302B}' => 228, - '\u{302C}' => 232, - '\u{302D}' => 222, - '\u{302E}' => 224, - '\u{302F}' => 224, - '\u{3099}' => 8, - '\u{309A}' => 8, - '\u{A66F}' => 230, - '\u{A674}' => 230, - '\u{A675}' => 230, - '\u{A676}' => 230, - '\u{A677}' => 230, - '\u{A678}' => 230, - '\u{A679}' => 230, - '\u{A67A}' => 230, - '\u{A67B}' => 230, - '\u{A67C}' => 230, - '\u{A67D}' => 230, - '\u{A69E}' => 230, - '\u{A69F}' => 230, - '\u{A6F0}' => 230, - '\u{A6F1}' => 230, - '\u{A806}' => 9, - '\u{A8C4}' => 9, - '\u{A8E0}' => 230, - '\u{A8E1}' => 230, - '\u{A8E2}' => 230, - '\u{A8E3}' => 230, - '\u{A8E4}' => 230, - '\u{A8E5}' => 230, - '\u{A8E6}' => 230, - '\u{A8E7}' => 230, - '\u{A8E8}' => 230, - '\u{A8E9}' => 230, - '\u{A8EA}' => 230, - '\u{A8EB}' => 230, - '\u{A8EC}' => 230, - '\u{A8ED}' => 230, - '\u{A8EE}' => 230, - '\u{A8EF}' => 230, - '\u{A8F0}' => 230, - '\u{A8F1}' => 230, - '\u{A92B}' => 220, - '\u{A92C}' => 220, - '\u{A92D}' => 220, - '\u{A953}' => 9, - '\u{A9B3}' => 7, - '\u{A9C0}' => 9, - '\u{AAB0}' => 230, - '\u{AAB2}' => 230, - '\u{AAB3}' => 230, - '\u{AAB4}' => 220, - '\u{AAB7}' => 230, - '\u{AAB8}' => 230, - '\u{AABE}' => 230, - '\u{AABF}' => 230, - '\u{AAC1}' => 230, - '\u{AAF6}' => 9, - '\u{ABED}' => 9, - '\u{FB1E}' => 26, - '\u{FE20}' => 230, - '\u{FE21}' => 230, - '\u{FE22}' => 230, - '\u{FE23}' => 230, - '\u{FE24}' => 230, - '\u{FE25}' => 230, - '\u{FE26}' => 230, - '\u{FE27}' => 220, - '\u{FE28}' => 220, - '\u{FE29}' => 220, - '\u{FE2A}' => 220, - '\u{FE2B}' => 220, - '\u{FE2C}' => 220, - '\u{FE2D}' => 220, - '\u{FE2E}' => 230, - '\u{FE2F}' => 230, - '\u{101FD}' => 220, - '\u{102E0}' => 220, - '\u{10376}' => 230, - '\u{10377}' => 230, - '\u{10378}' => 230, - '\u{10379}' => 230, - '\u{1037A}' => 230, - '\u{10A0D}' => 220, - '\u{10A0F}' => 230, - '\u{10A38}' => 230, - '\u{10A39}' => 1, - '\u{10A3A}' => 220, - '\u{10A3F}' => 9, - '\u{10AE5}' => 230, - '\u{10AE6}' => 220, - '\u{11046}' => 9, - '\u{1107F}' => 9, - '\u{110B9}' => 9, - '\u{110BA}' => 7, - '\u{11100}' => 230, - '\u{11101}' => 230, - '\u{11102}' => 230, - '\u{11133}' => 9, - '\u{11134}' => 9, - '\u{11173}' => 7, - '\u{111C0}' => 9, - '\u{111CA}' => 7, - '\u{11235}' => 9, - '\u{11236}' => 7, - '\u{112E9}' => 7, - '\u{112EA}' => 9, - '\u{1133C}' => 7, - '\u{1134D}' => 9, - '\u{11366}' => 230, - '\u{11367}' => 230, - '\u{11368}' => 230, - '\u{11369}' => 230, - '\u{1136A}' => 230, - '\u{1136B}' => 230, - '\u{1136C}' => 230, - '\u{11370}' => 230, - '\u{11371}' => 230, - '\u{11372}' => 230, - '\u{11373}' => 230, - '\u{11374}' => 230, - '\u{11442}' => 9, - '\u{11446}' => 7, - '\u{114C2}' => 9, - '\u{114C3}' => 7, - '\u{115BF}' => 9, - '\u{115C0}' => 7, - '\u{1163F}' => 9, - '\u{116B6}' => 9, - '\u{116B7}' => 7, - '\u{1172B}' => 9, - '\u{11C3F}' => 9, - '\u{16AF0}' => 1, - '\u{16AF1}' => 1, - '\u{16AF2}' => 1, - '\u{16AF3}' => 1, - '\u{16AF4}' => 1, - '\u{16B30}' => 230, - '\u{16B31}' => 230, - '\u{16B32}' => 230, - '\u{16B33}' => 230, - '\u{16B34}' => 230, - '\u{16B35}' => 230, - '\u{16B36}' => 230, - '\u{1BC9E}' => 1, - '\u{1D165}' => 216, - '\u{1D166}' => 216, - '\u{1D167}' => 1, - '\u{1D168}' => 1, - '\u{1D169}' => 1, - '\u{1D16D}' => 226, - '\u{1D16E}' => 216, - '\u{1D16F}' => 216, - '\u{1D170}' => 216, - '\u{1D171}' => 216, - '\u{1D172}' => 216, - '\u{1D17B}' => 220, - '\u{1D17C}' => 220, - '\u{1D17D}' => 220, - '\u{1D17E}' => 220, - '\u{1D17F}' => 220, - '\u{1D180}' => 220, - '\u{1D181}' => 220, - '\u{1D182}' => 220, - '\u{1D185}' => 230, - '\u{1D186}' => 230, - '\u{1D187}' => 230, - '\u{1D188}' => 230, - '\u{1D189}' => 230, - '\u{1D18A}' => 220, - '\u{1D18B}' => 220, - '\u{1D1AA}' => 230, - '\u{1D1AB}' => 230, - '\u{1D1AC}' => 230, - '\u{1D1AD}' => 230, - '\u{1D242}' => 230, - '\u{1D243}' => 230, - '\u{1D244}' => 230, - '\u{1E000}' => 230, - '\u{1E001}' => 230, - '\u{1E002}' => 230, - '\u{1E003}' => 230, - '\u{1E004}' => 230, - '\u{1E005}' => 230, - '\u{1E006}' => 230, - '\u{1E008}' => 230, - '\u{1E009}' => 230, - '\u{1E00A}' => 230, - '\u{1E00B}' => 230, - '\u{1E00C}' => 230, - '\u{1E00D}' => 230, - '\u{1E00E}' => 230, - '\u{1E00F}' => 230, - '\u{1E010}' => 230, - '\u{1E011}' => 230, - '\u{1E012}' => 230, - '\u{1E013}' => 230, - '\u{1E014}' => 230, - '\u{1E015}' => 230, - '\u{1E016}' => 230, - '\u{1E017}' => 230, - '\u{1E018}' => 230, - '\u{1E01B}' => 230, - '\u{1E01C}' => 230, - '\u{1E01D}' => 230, - '\u{1E01E}' => 230, - '\u{1E01F}' => 230, - '\u{1E020}' => 230, - '\u{1E021}' => 230, - '\u{1E023}' => 230, - '\u{1E024}' => 230, - '\u{1E026}' => 230, - '\u{1E027}' => 230, - '\u{1E028}' => 230, - '\u{1E029}' => 230, - '\u{1E02A}' => 230, - '\u{1E8D0}' => 220, - '\u{1E8D1}' => 220, - '\u{1E8D2}' => 220, - '\u{1E8D3}' => 220, - '\u{1E8D4}' => 220, - '\u{1E8D5}' => 220, - '\u{1E8D6}' => 220, - '\u{1E944}' => 230, - '\u{1E945}' => 230, - '\u{1E946}' => 230, - '\u{1E947}' => 230, - '\u{1E948}' => 230, - '\u{1E949}' => 230, - '\u{1E94A}' => 7, - _ => 0, - } -} +pub(crate) const CANONICAL_COMBINING_CLASS_SALT: &[u16] = &[ + 0x0, + 0x5, + 0x224, + 0xd1, + 0x11e, + 0x25c, + 0x11, + 0x3, + 0x0, + 0x6, + 0x6f, + 0x0, + 0x50, + 0x9b, + 0x6, + 0x0, + 0x0, + 0x0, + 0x1, + 0x3, + 0x7b, + 0x3, + 0x0, + 0x12, + 0x83, + 0x0, + 0x3c, + 0x1, + 0x0, + 0x0, + 0x31, + 0x2, + 0x0, + 0x51, + 0x3c, + 0x0, + 0x1, + 0x1, + 0x3, + 0x0, + 0x1, + 0x5, + 0xd, + 0xe, + 0x0, + 0x3e, + 0x5, + 0x1e, + 0x0, + 0x8, + 0x13, + 0x7, + 0x0, + 0xd8, + 0x0, + 0x0, + 0x0, + 0x0, + 0x11, + 0x1, + 0x4, + 0x1c, + 0x0, + 0x36, + 0x0, + 0x0, + 0x9, + 0x4b, + 0x0, + 0x0, + 0x5c, + 0x4, + 0x7, + 0x2, + 0x1a, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x7, + 0x1, + 0xd, + 0x36, + 0x2c, + 0x0, + 0x7, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x7, + 0x18, + 0x0, + 0x9, + 0x0, + 0x7, + 0xc, + 0x1, + 0x2b, + 0x0, + 0x2, + 0xf, + 0x39, + 0x19, + 0x0, + 0x2, + 0x6, + 0x6, + 0x2, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0xe, + 0x2, + 0x5, + 0x3c, + 0xc, + 0x0, + 0xb, + 0x0, + 0x0, + 0x0, + 0xf, + 0x0, + 0x1, + 0x4, + 0x0, + 0x31, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0xc, + 0xc, + 0x0, + 0x1d, + 0x27, + 0x6, + 0x9, + 0x32, + 0x7, + 0x8, + 0x0, + 0x0, + 0x7, + 0x4, + 0x0, + 0x3, + 0x10, + 0x4, + 0x0, + 0x0, + 0x13, + 0x3, + 0x0, + 0x10, + 0x0, + 0x38, + 0x2, + 0x15, + 0x0, + 0x0, + 0x2, + 0xa, + 0x1, + 0x6, + 0x9, + 0x4, + 0x2, + 0x4, + 0x2, + 0x0, + 0x2, + 0x49, + 0x0, + 0x0, + 0x0, + 0x2, + 0x3, + 0x2, + 0x0, + 0x0, + 0xc, + 0x0, + 0x0, + 0x5, + 0x0, + 0x0, + 0x0, + 0x0, + 0xe, + 0x25, + 0x0, + 0x0, + 0x0, + 0x23, + 0x7, + 0x3, + 0x0, + 0x1, + 0x4, + 0x1d, + 0x0, + 0x4, + 0x4, + 0x3, + 0x1, + 0x0, + 0x14, + 0x0, + 0x1, + 0x8, + 0x13, + 0x21, + 0x16, + 0x4, + 0x0, + 0x0, + 0x0, + 0xb, + 0x5, + 0x0, + 0xd, + 0x7, + 0x0, + 0x0, + 0x7, + 0x0, + 0x0, + 0x1, + 0x2, + 0xf, + 0xa, + 0x1, + 0x10, + 0x1, + 0x4, + 0x9, + 0x0, + 0x6, + 0x10, + 0x11, + 0x2, + 0x6, + 0x4, + 0xf, + 0x1, + 0xa, + 0x15, + 0x0, + 0x2, + 0xb, + 0x0, + 0x2, + 0x0, + 0x1, + 0xe, + 0x19, + 0x5, + 0x8, + 0x0, + 0x2, + 0x6, + 0xd, + 0xa, + 0x9, + 0x7, + 0x3, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x2, + 0xa, + 0x0, + 0x1, + 0x0, + 0x2, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x7, + 0x3, + 0x0, + 0x0, + 0x4, + 0x5, + 0x0, + 0xb, + 0x1, + 0x0, + 0x3, + 0x3, + 0xa, + 0x0, + 0x2, + 0x1, + 0x1, + 0x0, + 0x6, + 0x6, + 0x1, + 0xc, + 0x3, + 0x0, + 0x3, + 0x0, + 0x9, + 0x1, + 0x5, + 0x2, + 0x3, + 0xf, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x3, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x9, + 0x0, + 0x0, + 0x5, + 0x2, + 0x4, + 0x2, + 0x1, + 0x0, + 0x3, + 0x2, + 0x0, + 0x4, + 0x0, + 0x18, + 0x2, + 0x1, + 0x0, + 0x1, + 0x6, + 0x3, + 0x10, + 0x8, + 0x4, + 0x0, + 0x5, + 0x13, + 0x1, + 0x5, + 0x2, + 0x2, + 0x1, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x6, + 0x0, + 0x0, + 0x0, + 0x14, + 0x7, + 0x0, + 0x3, + 0x0, + 0x2, + 0x1, + 0x0, + 0x2, + 0x3, + 0x2, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0x1, + 0x2, + 0x1, + 0x4, + 0x0, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x0, + 0x1, + 0x1, + 0xa, + 0x9, + 0x0, + 0x0, + 0x5, + 0x13, + 0x1, + 0x1, + 0x0, + 0xc, + 0x4, + 0xb, + 0x1, + 0x0, + 0x8, + 0x1, + 0x2, + 0x8, + 0x3, + 0x0, + 0x8, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x4, + 0x4, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x2, + 0x2, + 0xe, + 0x2, + 0x1, + 0x1, + 0x4, + 0x0, + 0x7, + 0x0, + 0x0, + 0x3, + 0x1, + 0x0, + 0x2, + 0x2, + 0x1, + 0x0, + 0x3, + 0x3, + 0x0, + 0x3, + 0x3, + 0x0, + 0x0, + 0x0, + 0x6, + 0x1, + 0x0, + 0x7, + 0x3, + 0x1, + 0x5, + 0x1, + 0x0, + 0xc, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x2, + 0xf, + 0x1, + 0x0, + 0xa, + 0x2, + 0x2, + 0xc, + 0x2, + 0x3, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x9, + 0x7, + 0x0, + 0x1, + 0x2, + 0x0, + 0x1, + 0x7, + 0x0, + 0x6, + 0x0, + 0x0, + 0x5, + 0x0, + 0x9, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x1, + 0x2, + 0x6, + 0x0, + 0x7, + 0x1, + 0x3, + 0x0, + 0x5, + 0x1, + 0x1, + 0x1, + 0x0, + 0x2, + 0x1, + 0x2, + 0x3, + 0x0, + 0x4, + 0x0, + 0x5, + 0x2, + 0x2, + 0x2, + 0x0, + 0x1, + 0x1, + 0x1, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x5, + 0x2, + 0x0, + 0x0, + 0x3, + 0x2, + 0x0, + 0x0, + 0x2, + 0x0, + 0x3, + 0x1, + 0x3, + 0x4, + 0x1, + 0x4, + 0x1, + 0x0, + 0x5, + 0x2, + 0x0, + 0x2, + 0x2, + 0x0, + 0x1, + 0x0, + 0x4, + 0x1, + 0x7, + 0x4, + 0x4, + 0x2, + 0x0, + 0x0, + 0x1, + 0x4, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x5, + 0x1, + 0x2, + 0x0, + 0x1, + 0x1, + 0x2, + 0x7, + 0x2, + 0x1, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x8, + 0x3, + 0x2, + 0x8, + 0x3, + 0x3, + 0x1, + 0x3, + 0x1, + 0x0, + 0x1, + 0x0, + 0x3, + 0x8, + 0x5, + 0x3, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x0, + 0x2, + 0x2, + 0x4, + 0x1, + 0x1, + 0x0, + 0x0, + 0x8, + 0x2, + 0x1, + 0x1, + 0x7, + 0x4, + 0x0, + 0x3, + 0x1, + 0x5, + 0x0, + 0x1, + 0x0, + 0x1, + 0x4, + 0x4, + 0x1, + 0x1, + 0x0, + 0x1, + 0x4, + 0x4, + 0xb, + 0x0, + 0x2, + 0x2, + 0x1, + 0x2, + 0x5, + 0x3, + 0x3, + 0x0, + 0x0, + 0x2, + 0x4, + 0x3, + 0x0, + 0xa, + 0x0, + 0x3, + 0x0, + 0x4, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x1, + 0x0, + 0x3, + 0x2, + 0x0, + 0x0, + 0x2, + 0x0, + 0x3, + 0x0, + 0x1, + 0x1, + 0x4, + 0x1, + 0x0, + 0x5, + 0x0, + 0x2, + 0x1, + 0x1, + 0x2, + 0x1, + 0x1, + 0x1, + 0x2, + 0x0, + 0x1, + 0x1, + 0x2, + 0x2, + 0x2, + 0x1, + 0x3, + 0x8, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x4, + 0x0, + 0x3, + 0x0, + 0x1, + 0x1, + 0x1, + 0x2, + 0x0, + 0x5, + 0x0, + 0x0, + 0x1, + 0x1, + 0x3, + 0x2, + 0x9, + 0x0, + 0x4, + 0x3, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x3, + 0x1, + 0x3, + 0x5, + 0x0, + 0x1, + 0x2, + 0x5, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, +]; +pub(crate) const CANONICAL_COMBINING_CLASS_KV: &[u32] = &[ + 0x34AE6, + 0x348DC, + 0xFE24E6, + 0x2DEBE6, + 0xA67CE6, + 0xE496B, + 0x593E6, + 0x102E0DC, + 0x20E7E6, + 0xFE26E6, + 0xA8EDE6, + 0x342E6, + 0x6EADC, + 0xA6F0E6, + 0x1D243E6, + 0xA8EBE6, + 0xEB876, + 0x1AB8DC, + 0x1AB0E6, + 0x1BAA09, + 0xFE2DDC, + 0x322CA, + 0x1144607, + 0x1D170D8, + 0x1DD5E6, + 0x1CE301, + 0xF7484, + 0x1B6DE6, + 0x59ADE, + 0x30DE6, + 0x305E6, + 0x65DE6, + 0x5B812, + 0xFE2BDC, + 0x1123607, + 0x302EE0, + 0x749E6, + 0x1A75E6, + 0x111C009, + 0x1E02AE6, + 0x6E8E6, + 0x108DDC, + 0x1DECE6, + 0x351E6, + 0x954E6, + 0x2DE9E6, + 0x8FDE6, + 0xECA7A, + 0x1136CE6, + 0x1AB9DC, + 0x1DC3E6, + 0x1D1ADE6, + 0xA8EAE6, + 0x5ADDE, + 0x825E6, + 0xAABEE6, + 0x11102E6, + 0xA8E9E6, + 0x8E3DC, + 0x2DE4E6, + 0x315E8, + 0x111CA07, + 0x1CD7DC, + 0x1E8D3DC, + 0x10A3ADC, + 0x6E1E6, + 0x6E4E6, + 0x358E8, + 0x487E6, + 0x35DEA, + 0x65020, + 0xA8EEE6, + 0x1DE5E6, + 0x5B711, + 0x819E6, + 0x16B30E6, + 0x16AF301, + 0x9BC07, + 0x1DDAE6, + 0x35FE9, + 0xE4B6B, + 0x744DC, + 0x327CA, + 0x5B40E, + 0x1DF4E6, + 0x331DC, + 0x612E6, + 0x1D1AAE6, + 0x1E00DE6, + 0xF7B82, + 0x1B6EE6, + 0x1DF1E6, + 0x1D16FD8, + 0xF7181, + 0x1D16801, + 0x1E8D6DC, + 0x367E6, + 0x36DE6, + 0x1CE0E6, + 0x6D8E6, + 0x1CDAE6, + 0x32FDC, + 0x5C712, + 0xC4D09, + 0x598E6, + 0x81FE6, + 0x10AE6DC, + 0x2DFFE6, + 0x5A5DC, + 0x1DE1E6, + 0x316DC, + 0x2DE1E6, + 0x1E945E6, + 0xF18DC, + 0x743E6, + 0xD4D09, + 0x2DF0E6, + 0x18A9E4, + 0x17D209, + 0xA8E6E6, + 0x6DCE6, + 0x1DE3E6, + 0x302ADA, + 0x300E6, + 0xF35DC, + 0x30BE6, + 0x33EE6, + 0x73AE6, + 0x1CF8E6, + 0xF8409, + 0x317DC, + 0x483E6, + 0x85ADC, + 0x5AFE6, + 0x115C007, + 0x307E6, + 0x1CDDDC, + 0x319DC, + 0x6DFE6, + 0x1DE4E6, + 0x952DC, + 0x1E009E6, + 0x345F0, + 0xA69FE6, + 0x1E017E6, + 0x1E8D5DC, + 0x1DD1E6, + 0xA67DE6, + 0x1D17EDC, + 0x1136AE6, + 0xA8E4E6, + 0x8FBE6, + 0x5B20C, + 0x333DC, + 0x36EE6, + 0x31AE8, + 0x1E949E6, + 0x5BF17, + 0x8FCE6, + 0x309E6, + 0x35BE6, + 0x485E6, + 0xF86E6, + 0x2DF8E6, + 0x364E6, + 0x1104609, + 0x5B00A, + 0x1144209, + 0xFE2CDC, + 0x31DDC, + 0x93C07, + 0x73FE6, + 0x6ECE6, + 0xA8E2E6, + 0x343E6, + 0x1E002E6, + 0xFE25E6, + 0x67023, + 0x8DFE6, + 0x5AADC, + 0x658E6, + 0x2DE6E6, + 0x6E0E6, + 0x1113409, + 0x1DC9E6, + 0x1DC6E6, + 0x1AB4E6, + 0x135EE6, + 0x1172B09, + 0x1D17BDC, + 0x739DC, + 0x10AE5E6, + 0x1136BE6, + 0x308E6, + 0x823E6, + 0x313E6, + 0x8E0E6, + 0x355DC, + 0x353DC, + 0x1D166D8, + 0x733E6, + 0x1B72E6, + 0x1CDEDC, + 0x1E012E6, + 0x2DF7E6, + 0x951E6, + 0xABC07, + 0x8D8E6, + 0x1E024E6, + 0x20D901, + 0x1E948E6, + 0x321CA, + 0x1E011E6, + 0x1DE8E6, + 0x35EEA, + 0x20E8DC, + 0x16AF401, + 0x1D189E6, + 0x1E946E6, + 0x20DCE6, + 0xF83E6, + 0x2DF4E6, + 0x6EDDC, + 0xFE29DC, + 0x31EDC, + 0x1DFCE9, + 0x64D1D, + 0x344E6, + 0x352E6, + 0x732E6, + 0x1D186E6, + 0x1CD401, + 0x309A08, + 0x81DE6, + 0x11368E6, + 0x8E7E6, + 0x1DDEE6, + 0xA9B307, + 0x596DC, + 0x347DC, + 0x659E6, + 0xA3C07, + 0x5C219, + 0x2CEFE6, + 0x8F7E6, + 0x65CDC, + 0x32CDC, + 0x1B6BE6, + 0x33FE6, + 0x1AB7DC, + 0x1ABBE6, + 0x616E6, + 0xB3C07, + 0x59DE6, + 0x1E947E6, + 0x1AB1E6, + 0x73BDC, + 0xFE23E6, + 0x65AE6, + 0x2DE2E6, + 0xAAB7E6, + 0x8D7E6, + 0x610E6, + 0x33501, + 0x2DEEE6, + 0xA80609, + 0x73DE6, + 0x5A2DC, + 0xFE2FE6, + 0x1DC7E6, + 0x6E7E6, + 0x595E6, + 0x1DDDE6, + 0xA8F0E6, + 0x2DF1E6, + 0x36BE6, + 0x11372E6, + 0x16AF201, + 0x1DFDDC, + 0xAAB0E6, + 0x1DEFE6, + 0x1ABADC, + 0x7EDE6, + 0x103A09, + 0x346E6, + 0x1E000E6, + 0x656DC, + 0x361EA, + 0x1A78E6, + 0x5BC15, + 0x1E006E6, + 0x1DFEE6, + 0x1DCCE6, + 0x310E6, + 0x1DE7E6, + 0x1DC8E6, + 0x103909, + 0x1BE607, + 0x731DC, + 0x312E6, + 0x829E6, + 0x5C118, + 0x32ADC, + 0x1E026E6, + 0x1A76E6, + 0x8E1E6, + 0x1E01EE6, + 0x1DEDE6, + 0xA8E3E6, + 0x1B73E6, + 0x359DC, + 0xFE21E6, + 0x1E028E6, + 0xA6F1E6, + 0x1ABCE6, + 0x73CDC, + 0x11374E6, + 0x5ACE6, + 0x20EFDC, + 0x1CF4E6, + 0x332DC, + 0xFE2ADC, + 0x326DC, + 0x818E6, + 0x1DDCE6, + 0x59BDC, + 0x16B32E6, + 0x34DDC, + 0x31BD8, + 0xA677E6, + 0x1E003E6, + 0xDCA09, + 0x5A7DC, + 0x1DCDEA, + 0x1DFFDC, + 0x36AE6, + 0x30FE6, + 0x2DE5E6, + 0x33801, + 0x135DE6, + 0x193AE6, + 0xE3967, + 0xCCD09, + 0x1DD3E6, + 0x2DE3E6, + 0x33601, + 0x11371E6, + 0x20DBE6, + 0x657E6, + 0x311E6, + 0xFC6DC, + 0x20D301, + 0x65FDC, + 0x1E014E6, + 0x65BE6, + 0x2DFEE6, + 0x16B33E6, + 0x1CE401, + 0x304E6, + 0x8F21D, + 0x16AF101, + 0x1D188E6, + 0x1E01BE6, + 0x10A38E6, + 0x1CD5DC, + 0x730E6, + 0xEC87A, + 0x306E6, + 0x2DE0E6, + 0x61A20, + 0x5A1E6, + 0x82DE6, + 0x1D172D8, + 0x34EDC, + 0x745E6, + 0xA8E0E6, + 0x654E6, + 0x2DFAE6, + 0x11100E6, + 0x33DE6, + 0x1DC2DC, + 0x615E6, + 0x1CEDDC, + 0x1A17E6, + 0x1CE801, + 0x6EBE6, + 0xFE20E6, + 0x735E6, + 0x1E027E6, + 0x1DCFDC, + 0x1DF5E6, + 0x7F0E6, + 0x8EEDC, + 0x484E6, + 0x318DC, + 0x1E8D0DC, + 0x5A6DC, + 0x32EDC, + 0x748DC, + 0x591DC, + 0x737DC, + 0xAAC1E6, + 0x1E00AE6, + 0x1B3407, + 0x6D6E6, + 0xA679E6, + 0x8DDE6, + 0xF87E6, + 0x2CF1E6, + 0x1DD0CA, + 0x2DF2E6, + 0x1AB2E6, + 0x30CE6, + 0x1D180DC, + 0x365E6, + 0x323DC, + 0x1D16ED8, + 0x7F1E6, + 0x8F6DC, + 0xABED09, + 0xC5554, + 0xA8EFE6, + 0x1A7AE6, + 0x11C3F09, + 0x592E6, + 0x8E9DC, + 0x354DC, + 0x5B610, + 0x1CD1E6, + 0x1D1ACE6, + 0x1E01FE6, + 0x1DFBE6, + 0x116B707, + 0x357E6, + 0x1D1ABE6, + 0x366E6, + 0x5B50F, + 0xAAB4DC, + 0x20E501, + 0xA66FE6, + 0x340E6, + 0x171409, + 0x816E6, + 0x8FFE6, + 0x1D17CDC, + 0x826E6, + 0x1CDFDC, + 0x2DFBE6, + 0x329DC, + 0x362E9, + 0x302DDE, + 0x820E6, + 0x1E00FE6, + 0x1D16701, + 0x1A6009, + 0x11101E6, + 0x135FE6, + 0x1B6FE6, + 0x1B71E6, + 0xF7282, + 0x599E6, + 0x2DFDE6, + 0x1E018E6, + 0x655DC, + 0xA67BE6, + 0x114C307, + 0x2DE8E6, + 0x11366E6, + 0x1037AE6, + 0x736E6, + 0xFE27DC, + 0x20D1E6, + 0x8DAE6, + 0x114C209, + 0x1E01DE6, + 0xA95309, + 0x64E1E, + 0x2D7F09, + 0x1CDBE6, + 0x350E6, + 0x8F8E6, + 0xA676E6, + 0x16AF001, + 0x20D6E6, + 0x1113309, + 0x1D181DC, + 0x5B913, + 0x59EE6, + 0x115BF09, + 0x5A0E6, + 0x65222, + 0x1E020E6, + 0xF82E6, + 0x302E6, + 0x2DEDE6, + 0x6E2E6, + 0x110B909, + 0x2CF0E6, + 0x1E004E6, + 0x1CF9E6, + 0x65EE6, + 0x1E8D2DC, + 0x35ADC, + 0xA8E7E6, + 0x5C5DC, + 0xF39D8, + 0xF8082, + 0x1E944E6, + 0xA8E1E6, + 0x1DCBE6, + 0x8ECE6, + 0x1D165D8, + 0x1DD7E6, + 0xB4D09, + 0x7F3E6, + 0x314E6, + 0x827E6, + 0x33401, + 0x1CD2E6, + 0x368E6, + 0x8DBE6, + 0xA4D09, + 0x363E6, + 0xF19DC, + 0x6DAE6, + 0x324DC, + 0x81BE6, + 0x193BDC, + 0x36FE6, + 0x1DF3E6, + 0x64C1C, + 0xF37DC, + 0x1DC1E6, + 0x1D171D8, + 0x1163F09, + 0x1117307, + 0x8EFDC, + 0x1D244E6, + 0x33BDC, + 0x486E6, + 0xE486B, + 0x17DDE6, + 0x1E015E6, + 0x71124, + 0x1DE6E6, + 0x8E4E6, + 0x82CE6, + 0x613E6, + 0x5A3DC, + 0xF7D82, + 0xE4A6B, + 0x822E6, + 0x349DC, + 0x1A7BE6, + 0xF7A82, + 0x59FE6, + 0x1DEAE6, + 0x1DF0E6, + 0x1AB3E6, + 0xA8C409, + 0x302BE4, + 0x5B10B, + 0x2DF3E6, + 0x8DCE6, + 0xAAB2E6, + 0x2DE7E6, + 0x65121, + 0x1DE0E6, + 0xA8E5E6, + 0x1CE601, + 0x64B1B, + 0x16B36E6, + 0x7EFE6, + 0x10A0FE6, + 0xE3A09, + 0x746DC, + 0x1E016E6, + 0x31CDC, + 0x8FADC, + 0x1DD8E6, + 0x2DF6E6, + 0x20EEDC, + 0x653E6, + 0x1BC9E01, + 0x5BA13, + 0xE3867, + 0x5AEE4, + 0x1D16DE2, + 0xA92BDC, + 0x1E029E6, + 0x33701, + 0x1B6CDC, + 0x1E001E6, + 0x1DC4E6, + 0x1DD6E6, + 0x742DC, + 0x2DEAE6, + 0x173409, + 0x1CD8DC, + 0x20E9E6, + 0x11367E6, + 0x859DC, + 0x1E00EE6, + 0x20D7E6, + 0x1DEBE6, + 0x8EAE6, + 0xF7C82, + 0x1E010E6, + 0x1DEEE6, + 0x5A8E6, + 0x741E6, + 0xA675E6, + 0x1B70E6, + 0xA92DDC, + 0xA8ECE6, + 0x1E008E6, + 0x16B34E6, + 0x30AE6, + 0x20EDDC, + 0xC565B, + 0x1D242E6, + 0x1E023E6, + 0x1D187E6, + 0x5BB14, + 0x20D201, + 0x73EDC, + 0x1E005E6, + 0x339DC, + 0xA67AE6, + 0x81CE6, + 0x8FEE6, + 0x1E01CE6, + 0x1D18ADC, + 0x20EB01, + 0xAAF609, + 0x2DF5E6, + 0x64F1F, + 0x1DC0E6, + 0x302CE8, + 0x116B609, + 0x35CE9, + 0x1BF209, + 0x330DC, + 0x1AB5DC, + 0x1BAB09, + 0x8DEE6, + 0x32DDC, + 0x6181E, + 0x36CE6, + 0x112EA09, + 0x10378E6, + 0x1CD6DC, + 0x1A77E6, + 0x6191F, + 0x1B4409, + 0x7EEE6, + 0xA8E8E6, + 0x20F0E6, + 0x8D4E6, + 0x5B30D, + 0x1134D09, + 0x303E6, + 0x360EA, + 0x747E6, + 0x1DE2E6, + 0x11370E6, + 0x20EA01, + 0x1E013E6, + 0x328CA, + 0xAAB3E6, + 0x16B35E6, + 0x1107F09, + 0x738DC, + 0x112E907, + 0x10A3901, + 0x1A7FDC, + 0x1D17FDC, + 0x10A3F09, + 0x5C4E6, + 0x8EDDC, + 0x34BE6, + 0x11373E6, + 0x34CE6, + 0x617E6, + 0x8EBE6, + 0x31FDC, + 0xEB976, + 0x7EBE6, + 0x82AE6, + 0x74AE6, + 0x33CDC, + 0x1CE701, + 0x1D182DC, + 0x16B31E6, + 0x1DF2E6, + 0x94D09, + 0x821E6, + 0x1E00CE6, + 0x5A4DC, + 0x8F4E6, + 0x1DCED6, + 0x1D185E6, + 0x1DE9E6, + 0x2DECE6, + 0xCBC07, + 0x1DD4E6, + 0x2DF9E6, + 0x1D16901, + 0x369E6, + 0xEC97A, + 0x1123509, + 0x953E6, + 0xA678E6, + 0x1CE501, + 0xAAB8E6, + 0x10A0DDC, + 0x6E3DC, + 0x1BF309, + 0x8F11C, + 0x1A79E6, + 0x309908, + 0x614E6, + 0xFE2EE6, + 0x10379E6, + 0x11369E6, + 0x101FDDC, + 0x1DDBE6, + 0x302FE0, + 0x1939DE, + 0x20D801, + 0x2DFCE6, + 0xFE22E6, + 0x20E601, + 0x817E6, + 0x1E021E6, + 0xACD09, + 0x320DC, + 0x1DD2E6, + 0x356DC, + 0x341E6, + 0xFE28DC, + 0x20D5E6, + 0x20E1E6, + 0x7ECE6, + 0x301E6, + 0x1ABDDC, + 0x10377E6, + 0x594E6, + 0x8F5E6, + 0x7F2DC, + 0x8F9DC, + 0x1DC5E6, + 0xA8F1E6, + 0x5A9E6, + 0x8F3E6, + 0x1E00BE6, + 0x6D7E6, + 0x6D9E6, + 0x6DBE6, + 0x1CD9DC, + 0x1CE201, + 0x1E8D1DC, + 0x8D6E6, + 0x1CD0E6, + 0x81EE6, + 0x597E6, + 0x59CE6, + 0x1C3707, + 0x20D0E6, + 0x33ADC, + 0x82BE6, + 0x611E6, + 0x1A18DC, + 0xFB1E1A, + 0x8D9E6, + 0xA9C009, + 0xA92CDC, + 0x8E8E6, + 0x1133C07, + 0x740E6, + 0x10376E6, + 0x2DEFE6, + 0x325DC, + 0x1DDFE6, + 0x5ABE6, + 0xAABFE6, + 0x8E6DC, + 0x1D18BDC, + 0x8D5E6, + 0x1CDCDC, + 0x110BA07, + 0xECB7A, + 0xA674E6, + 0x20D4E6, + 0x1DD9E6, + 0x20DA01, + 0x1DCADC, + 0x103707, + 0xA69EE6, + 0x8E5E6, + 0xBCD09, + 0x20ECDC, + 0x30EE6, + 0x1E8D4DC, + 0x8F01B, + 0x734DC, + 0x1AB6DC, + 0x32BDC, + 0x1D17DDC, + 0x9CD09, + 0x5BD16, + 0x1A7CE6, + 0x85BDC, + 0x1E94A07, +]; -#[inline] -pub fn composition_table(c1: char, c2: char) -> Option<char> { + +pub(crate) const COMPOSITION_TABLE_SALT: &[u16] = &[ + 0x0, + 0x0, + 0x0, + 0x0, + 0x25d, + 0x3, + 0x5d, + 0x0, + 0x2, + 0x9, + 0x4, + 0x87, + 0x6, + 0x135, + 0x1, + 0x0, + 0x0, + 0x4, + 0x3, + 0xe1, + 0x78, + 0x0, + 0x2, + 0x29, + 0x8, + 0x8f, + 0x24, + 0x0, + 0x0, + 0x0, + 0x31, + 0x0, + 0x0, + 0x6d, + 0x0, + 0x33, + 0x1, + 0x4c, + 0x0, + 0x1, + 0x0, + 0x0, + 0x8, + 0x7c, + 0x6, + 0x4c, + 0x45, + 0x2a, + 0x2, + 0x0, + 0x0, + 0x0, + 0xa, + 0x0, + 0x0, + 0x59, + 0x0, + 0x10, + 0x3, + 0x9, + 0xe, + 0x6, + 0x1, + 0xc, + 0x10, + 0x0, + 0x0, + 0x0, + 0x3d, + 0x0, + 0x0, + 0x2a, + 0x0, + 0x0, + 0x1, + 0x20, + 0xa, + 0x0, + 0x1, + 0xe, + 0x2, + 0x10, + 0x22, + 0x0, + 0x61, + 0x0, + 0x4, + 0x15, + 0x0, + 0x4, + 0x3, + 0x0, + 0x0, + 0x3, + 0x0, + 0xd, + 0x1, + 0x1, + 0x24, + 0x3, + 0x4, + 0x0, + 0x0, + 0x18, + 0x58, + 0x0, + 0x0, + 0xa, + 0x19, + 0x10, + 0x0, + 0x2, + 0x0, + 0x0, + 0x12, + 0x15, + 0x0, + 0xc, + 0x7, + 0x3, + 0x0, + 0x1a, + 0x7, + 0xc, + 0x1, + 0x5, + 0x4, + 0x21, + 0x1, + 0x2, + 0x0, + 0x0, + 0x1, + 0xa, + 0x0, + 0xa, + 0x0, + 0x4, + 0x9, + 0x5, + 0xd, + 0x5, + 0x0, + 0x3, + 0x6, + 0x26, + 0xb, + 0x0, + 0x4, + 0x6, + 0x0, + 0x13, + 0x0, + 0x0, + 0x4, + 0x1, + 0x0, + 0x0, + 0x0, + 0x24, + 0x1, + 0x1d, + 0x1, + 0x0, + 0x0, + 0x10, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0xa, + 0x0, + 0xd, + 0x0, + 0x10, + 0x0, + 0x6, + 0x5, + 0x0, + 0x0, + 0x9, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x2, + 0x0, + 0x0, + 0x16, + 0x1, + 0x2, + 0x0, + 0x1, + 0x0, + 0x6, + 0x1, + 0x25, + 0x5, + 0x0, + 0xa, + 0xd, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x12, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x4, + 0x9, + 0x0, + 0x1, + 0x4, + 0x0, + 0x4, + 0x1, + 0x6, + 0xb, + 0x3, + 0x6, + 0x7, + 0x0, + 0x0, + 0x0, + 0xd, + 0xf, + 0xe, + 0x0, + 0x1, + 0x1, + 0x4, + 0xf, + 0x10, + 0x0, + 0x5, + 0x0, + 0x19, + 0x1, + 0xe, + 0x0, + 0x8, + 0x1, + 0x3, + 0x0, + 0x0, + 0x5, + 0x1, + 0x0, + 0x0, + 0x11, + 0x0, + 0x4, + 0x5, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0x1, + 0x5, + 0x8, + 0x0, + 0x0, + 0xc, + 0xa, + 0x0, + 0x6, + 0x9, + 0x3, + 0x1, + 0x6, + 0x1, + 0x0, + 0x1b, + 0x1, + 0xe, + 0x0, + 0x8, + 0x5, + 0x3, + 0x15, + 0x0, + 0x2, + 0x7, + 0xb, + 0x3, + 0x0, + 0xa, + 0x3, + 0x0, + 0x6, + 0x0, + 0xa, + 0x0, + 0x1, + 0x3, + 0x8, + 0x0, + 0x9, + 0x0, + 0x1, + 0x2, + 0x0, + 0x5, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x17, + 0x0, + 0x0, + 0x2, + 0x0, + 0x5, + 0x16, + 0x0, + 0x10, + 0x3, + 0x4, + 0x11, + 0x1, + 0x3, + 0x0, + 0x0, + 0x0, + 0x4, + 0x1, + 0x0, + 0x5, + 0x0, + 0x2, + 0x1, + 0x0, + 0x2, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x12, + 0x1, + 0x4, + 0xa, + 0xb, + 0x4, + 0x0, + 0x2, + 0x0, + 0x3, + 0x0, + 0x4, + 0x5, + 0x0, + 0x0, + 0x11, + 0x1, + 0x6, + 0x6, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x0, + 0x1, + 0x1, + 0x7, + 0x0, + 0x3, + 0xa, + 0x0, + 0x1, + 0xa, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0xd, + 0x5, + 0x1, + 0x1, + 0x0, + 0x0, + 0x5, + 0x6, + 0x8, + 0x4, + 0x5, + 0x0, + 0xb, + 0x0, + 0x4, + 0xb, + 0x0, + 0x0, + 0x1, + 0x5, + 0x0, + 0xb, + 0x0, + 0x6, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x6, + 0x0, + 0x0, + 0x7, + 0x13, + 0x4, + 0x19, + 0x3, + 0x1, + 0x0, + 0x1, + 0x6, + 0x6, + 0x0, + 0x0, + 0x0, + 0x0, + 0xc, + 0x2, + 0x3, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0x1, + 0x5, + 0x1, + 0x1, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x7, + 0x1, + 0x9, + 0x6, + 0x4, + 0x1, + 0x5, + 0x0, + 0x1, + 0x2, + 0x8, + 0x0, + 0x9, + 0x0, + 0x0, + 0x1, + 0x3, + 0xb, + 0x0, + 0x1, + 0x0, + 0x0, + 0x5, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x2, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x4, + 0x1, + 0x0, + 0x6, + 0x2, + 0x5, + 0x8, + 0x12, + 0x0, + 0x0, + 0x0, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x3, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x2, + 0x1, + 0x4, + 0xd, + 0x0, + 0x0, + 0xb, + 0x0, + 0x1, + 0x0, + 0x0, + 0xc, + 0x0, + 0x0, + 0x0, + 0x5, + 0x8, + 0x2, + 0x0, + 0x2, + 0x1, + 0x6, + 0x1, + 0x1, + 0x1, + 0x0, + 0x2, + 0x0, + 0x5, + 0x1, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0xe, + 0x10, + 0x0, + 0x5, + 0x4, + 0x2, + 0x1, + 0x0, + 0x0, + 0x3, + 0x1, + 0x0, + 0x2, + 0x1, + 0x4, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1, + 0x1, + 0x3, + 0x1, + 0x5, + 0x2, + 0x3, + 0x4, + 0x0, + 0x3, + 0x3, + 0x6, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0xe, + 0x1, + 0x2, + 0x1, + 0x4, + 0x2, + 0x5, + 0x2, + 0x1, + 0x1, + 0x0, + 0x1, + 0x0, + 0x5, + 0x5, + 0x6, + 0x6, + 0x5, + 0x0, + 0x2, + 0x1, + 0x0, + 0x2, + 0x4, + 0x1, + 0x0, + 0x5, + 0x0, + 0x6, + 0x2, + 0x8, + 0x0, + 0x0, + 0x7, + 0x1, + 0x2, + 0x2, + 0x5, + 0x4, + 0x11, + 0x0, + 0x3, + 0x0, + 0x1, + 0x0, + 0x1, + 0x4, + 0x0, + 0x3, + 0x2, + 0x0, + 0x1, + 0x3, + 0x0, + 0xb, + 0x6, + 0x0, + 0x6, + 0x0, + 0x4, + 0x1, + 0x2, + 0x0, + 0x1, + 0x0, + 0x2, + 0x1, + 0x2, + 0x0, + 0x5, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x3, + 0x2, + 0x6, + 0x0, + 0x0, + 0x2, + 0x4, + 0x6, + 0x0, + 0x0, + 0x0, + 0x0, + 0xc, + 0xc, + 0x0, + 0x0, + 0x0, + 0x4, + 0x4, + 0x0, + 0x8, + 0x3, + 0x1, + 0x0, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x5, + 0x0, + 0x5, + 0x1, + 0x0, + 0x3, + 0x4, + 0x1, + 0x2, + 0x3, + 0x0, + 0x1, + 0x7, + 0x0, + 0x0, + 0x7, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x1, + 0xb, + 0x0, + 0x4, + 0x0, + 0x1, + 0x1, + 0x0, + 0x2, + 0x1, + 0x1, + 0x5, + 0x0, + 0x0, + 0x3, + 0x6, + 0x0, + 0x0, + 0x4, + 0x2, + 0x1, + 0x3, + 0x3, + 0xa, + 0x7, + 0x0, + 0x4, + 0x1, + 0x6, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x1, + 0x1, + 0x4, + 0x0, + 0x3, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0x6, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x1, + 0x2, + 0x6, + 0x0, + 0x2, + 0x0, + 0x3, + 0x7, + 0x0, + 0x3, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x3, + 0x5, + 0x2, + 0x0, + 0x1, + 0x1, + 0x2, + 0x2, + 0x4, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x3, + 0x2, + 0x0, + 0x1, + 0x0, + 0x2, + 0x4, + 0x2, + 0x0, + 0x1, + 0x5, + 0x0, + 0x0, + 0x2, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x5, + 0x2, + 0x0, + 0x8, + 0x3, + 0x1, + 0x1, + 0x1, + 0x3, + 0x4, + 0x0, + 0x2, + 0x0, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x6, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x1, + 0x3, + 0x1, + 0x3, + 0x1, + 0x2, + 0x0, + 0x1, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0x3, + 0x1, + 0x2, + 0x0, + 0x2, + 0x1, + 0x0, + 0x2, + 0x4, + 0x0, + 0x5, + 0x5, + 0x0, + 0x5, + 0x2, + 0x0, + 0x1, + 0x3, + 0x1, + 0x0, + 0x2, + 0x6, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, +]; +pub(crate) const COMPOSITION_TABLE_KV: &[(u32, char)] = &[ + (0x64A0654, '\u{0626}'), + (0x690309, '\u{1EC9}'), + (0x650306, '\u{0115}'), + (0x423030B, '\u{04F2}'), + (0x47030C, '\u{01E6}'), + (0x570301, '\u{1E82}'), + (0xC50301, '\u{01FA}'), + (0x21D20338, '\u{21CF}'), + (0x430307, '\u{010A}'), + (0x7A0307, '\u{017C}'), + (0x49030C, '\u{01CF}'), + (0x720307, '\u{1E59}'), + (0x304B3099, '\u{304C}'), + (0x1F610345, '\u{1FA1}'), + (0x410307, '\u{0226}'), + (0x6B0323, '\u{1E33}'), + (0x3990304, '\u{1FD9}'), + (0x1F490301, '\u{1F4D}'), + (0x3CA0342, '\u{1FD7}'), + (0x550304, '\u{016A}'), + (0x30DB309A, '\u{30DD}'), + (0x1F6E0345, '\u{1FAE}'), + (0x420331, '\u{1E06}'), + (0x41E0308, '\u{04E6}'), + (0x410325, '\u{1E00}'), + (0x520331, '\u{1E5E}'), + (0x1FF60345, '\u{1FF7}'), + (0x22720338, '\u{2274}'), + (0x22480338, '\u{2249}'), + (0x1FBF0301, '\u{1FCE}'), + (0x30C63099, '\u{30C7}'), + (0x760323, '\u{1E7F}'), + (0x700307, '\u{1E57}'), + (0x1F510301, '\u{1F55}'), + (0x750328, '\u{0173}'), + (0x305B3099, '\u{305C}'), + (0x41030A, '\u{00C5}'), + (0x1A10323, '\u{1EE3}'), + (0x550311, '\u{0216}'), + (0x530307, '\u{1E60}'), + (0xDC030C, '\u{01D9}'), + (0x4F0300, '\u{00D2}'), + (0x6F0307, '\u{022F}'), + (0x470301, '\u{01F4}'), + (0x610309, '\u{1EA3}'), + (0x1F080301, '\u{1F0C}'), + (0x3B90301, '\u{03AF}'), + (0x4330301, '\u{0453}'), + (0x1F200345, '\u{1F90}'), + (0x620307, '\u{1E03}'), + (0x1F030345, '\u{1F83}'), + (0x570308, '\u{1E84}'), + (0x5A0307, '\u{017B}'), + (0x30C13099, '\u{30C2}'), + (0x1A10309, '\u{1EDF}'), + (0x6270655, '\u{0625}'), + (0x3BF0314, '\u{1F41}'), + (0x670301, '\u{01F5}'), + (0x39F0301, '\u{038C}'), + (0xEA0301, '\u{1EBF}'), + (0x63030C, '\u{010D}'), + (0x1F000345, '\u{1F80}'), + (0x4130301, '\u{0403}'), + (0x4B0323, '\u{1E32}'), + (0x790301, '\u{00FD}'), + (0x770301, '\u{1E83}'), + (0x1F0E0345, '\u{1F8E}'), + (0x480308, '\u{1E26}'), + (0x30A63099, '\u{30F4}'), + (0x1020300, '\u{1EB0}'), + (0x6C0301, '\u{013A}'), + (0x450309, '\u{1EBA}'), + (0x1F390301, '\u{1F3D}'), + (0x690311, '\u{020B}'), + (0x4230304, '\u{04EE}'), + (0x61030C, '\u{01CE}'), + (0x1F100300, '\u{1F12}'), + (0x4380300, '\u{045D}'), + (0x480323, '\u{1E24}'), + (0x1B111B35, '\u{1B12}'), + (0x430301, '\u{0106}'), + (0x540323, '\u{1E6C}'), + (0x490303, '\u{0128}'), + (0x1EA10302, '\u{1EAD}'), + (0x4350308, '\u{0451}'), + (0x610307, '\u{0227}'), + (0x1F000300, '\u{1F02}'), + (0x6D0307, '\u{1E41}'), + (0x760303, '\u{1E7D}'), + (0x730327, '\u{015F}'), + (0x470304, '\u{1E20}'), + (0x470306, '\u{011E}'), + (0x1F6D0345, '\u{1FAD}'), + (0x6F0303, '\u{00F5}'), + (0x6B0331, '\u{1E35}'), + (0x720331, '\u{1E5F}'), + (0x1B00300, '\u{1EEB}'), + (0x1B0B1B35, '\u{1B0C}'), + (0x55032D, '\u{1E76}'), + (0x61030A, '\u{00E5}'), + (0x30463099, '\u{3094}'), + (0x1B3A1B35, '\u{1B3B}'), + (0x55030A, '\u{016E}'), + (0x928093C, '\u{0929}'), + (0x3C90313, '\u{1F60}'), + (0x650330, '\u{1E1B}'), + (0x590303, '\u{1EF8}'), + (0x450330, '\u{1E1A}'), + (0x640331, '\u{1E0F}'), + (0x3B90308, '\u{03CA}'), + (0x309D3099, '\u{309E}'), + (0x443030B, '\u{04F3}'), + (0xB470B3E, '\u{0B4B}'), + (0x6F030F, '\u{020D}'), + (0x6E0323, '\u{1E47}'), + (0x690308, '\u{00EF}'), + (0x65032D, '\u{1E19}'), + (0x15A0307, '\u{1E64}'), + (0x1F180301, '\u{1F1C}'), + (0x1F090301, '\u{1F0D}'), + (0x1F270345, '\u{1F97}'), + (0x7A0302, '\u{1E91}'), + (0x590301, '\u{00DD}'), + (0x4C0331, '\u{1E3A}'), + (0x1F640345, '\u{1FA4}'), + (0x1EB90302, '\u{1EC7}'), + (0x1F240345, '\u{1F94}'), + (0x1130300, '\u{1E15}'), + (0x69030F, '\u{0209}'), + (0x740331, '\u{1E6F}'), + (0x1F480301, '\u{1F4C}'), + (0x7A0331, '\u{1E95}'), + (0x1F290345, '\u{1F99}'), + (0xD40301, '\u{1ED0}'), + (0xC40304, '\u{01DE}'), + (0x3970301, '\u{0389}'), + (0x72030C, '\u{0159}'), + (0x1F110301, '\u{1F15}'), + (0xF40309, '\u{1ED5}'), + (0x450327, '\u{0228}'), + (0x6F031B, '\u{01A1}'), + (0xC60304, '\u{01E2}'), + (0x3990308, '\u{03AA}'), + (0x3CE0345, '\u{1FF4}'), + (0x6D0301, '\u{1E3F}'), + (0x1030309, '\u{1EB3}'), + (0x6F0302, '\u{00F4}'), + (0x73030C, '\u{0161}'), + (0x750301, '\u{00FA}'), + (0x1F690301, '\u{1F6D}'), + (0x3A90301, '\u{038F}'), + (0x3D0338, '\u{2260}'), + (0x1FC60345, '\u{1FC7}'), + (0x770300, '\u{1E81}'), + (0x2280306, '\u{1E1C}'), + (0x6C0331, '\u{1E3B}'), + (0x30AD3099, '\u{30AE}'), + (0x1EB80302, '\u{1EC6}'), + (0x550302, '\u{00DB}'), + (0xDD90DCF, '\u{0DDC}'), + (0x3A50304, '\u{1FE9}'), + (0x3A90314, '\u{1F69}'), + (0x740327, '\u{0163}'), + (0x530326, '\u{0218}'), + (0x55030B, '\u{0170}'), + (0x306F309A, '\u{3071}'), + (0x6B0327, '\u{0137}'), + (0x750330, '\u{1E75}'), + (0x730301, '\u{015B}'), + (0x1F300342, '\u{1F36}'), + (0x470307, '\u{0120}'), + (0xCC60CD5, '\u{0CC7}'), + (0x1F690300, '\u{1F6B}'), + (0x1030301, '\u{1EAF}'), + (0x750311, '\u{0217}'), + (0x930093C, '\u{0931}'), + (0x30613099, '\u{3062}'), + (0x770323, '\u{1E89}'), + (0xF50301, '\u{1E4D}'), + (0xFC0300, '\u{01DC}'), + (0x49030F, '\u{0208}'), + (0x690302, '\u{00EE}'), + (0x1F230345, '\u{1F93}'), + (0xF40300, '\u{1ED3}'), + (0x44B0308, '\u{04F9}'), + (0x1F2E0345, '\u{1F9E}'), + (0x650300, '\u{00E8}'), + (0x490308, '\u{00CF}'), + (0x1F280301, '\u{1F2C}'), + (0x1F180300, '\u{1F1A}'), + (0x6270653, '\u{0622}'), + (0x1F200301, '\u{1F24}'), + (0x22030338, '\u{2204}'), + (0x790304, '\u{0233}'), + (0x1F390300, '\u{1F3B}'), + (0x610325, '\u{1E01}'), + (0x790309, '\u{1EF7}'), + (0x1AF0303, '\u{1EEE}'), + (0x6F0301, '\u{00F3}'), + (0x640323, '\u{1E0D}'), + (0x304F3099, '\u{3050}'), + (0x1F010345, '\u{1F81}'), + (0xCA0309, '\u{1EC2}'), + (0x3D20308, '\u{03D4}'), + (0x1F500301, '\u{1F54}'), + (0x1F010300, '\u{1F03}'), + (0x3A90345, '\u{1FFC}'), + (0x4270308, '\u{04F4}'), + (0x530302, '\u{015C}'), + (0x520301, '\u{0154}'), + (0x450306, '\u{0114}'), + (0x530323, '\u{1E62}'), + (0x670306, '\u{011F}'), + (0x22760338, '\u{2278}'), + (0x4350300, '\u{0450}'), + (0x30B53099, '\u{30B6}'), + (0x6F030B, '\u{0151}'), + (0x4180304, '\u{04E2}'), + (0x630307, '\u{010B}'), + (0x3D20301, '\u{03D3}'), + (0x227C0338, '\u{22E0}'), + (0x610304, '\u{0101}'), + (0xA80300, '\u{1FED}'), + (0x440331, '\u{1E0E}'), + (0x650311, '\u{0207}'), + (0xF80301, '\u{01FF}'), + (0x75030C, '\u{01D4}'), + (0x530327, '\u{015E}'), + (0x30573099, '\u{3058}'), + (0x3B70345, '\u{1FC3}'), + (0x69030C, '\u{01D0}'), + (0x6E0327, '\u{0146}'), + (0x780307, '\u{1E8B}'), + (0x1F000342, '\u{1F06}'), + (0x1B00303, '\u{1EEF}'), + (0x470327, '\u{0122}'), + (0xC20309, '\u{1EA8}'), + (0x6C032D, '\u{1E3D}'), + (0x304D3099, '\u{304E}'), + (0x690303, '\u{0129}'), + (0x1AF0323, '\u{1EF0}'), + (0x4F0302, '\u{00D4}'), + (0x1020301, '\u{1EAE}'), + (0x4470308, '\u{04F5}'), + (0x22A80338, '\u{22AD}'), + (0x3C50300, '\u{1F7A}'), + (0x3910313, '\u{1F08}'), + (0x64032D, '\u{1E13}'), + (0xCF0301, '\u{1E2E}'), + (0x61030F, '\u{0201}'), + (0x1EA10306, '\u{1EB7}'), + (0x790323, '\u{1EF5}'), + (0x21900338, '\u{219A}'), + (0x1F250345, '\u{1F95}'), + (0x4F0304, '\u{014C}'), + (0x4F0306, '\u{014E}'), + (0x30B33099, '\u{30B4}'), + (0x440327, '\u{1E10}'), + (0xB920BD7, '\u{0B94}'), + (0x550308, '\u{00DC}'), + (0x650323, '\u{1EB9}'), + (0x307B3099, '\u{307C}'), + (0x4F030C, '\u{01D1}'), + (0x670304, '\u{1E21}'), + (0x6A030C, '\u{01F0}'), + (0x550323, '\u{1EE4}'), + (0x1A10301, '\u{1EDB}'), + (0x590323, '\u{1EF4}'), + (0x410300, '\u{00C0}'), + (0x30B93099, '\u{30BA}'), + (0x4230308, '\u{04F0}'), + (0x530301, '\u{015A}'), + (0x30D8309A, '\u{30DA}'), + (0x750309, '\u{1EE7}'), + (0x550330, '\u{1E74}'), + (0x520327, '\u{0156}'), + (0x4370308, '\u{04DF}'), + (0xCA0300, '\u{1EC0}'), + (0x21940338, '\u{21AE}'), + (0x3B10306, '\u{1FB0}'), + (0x1F610342, '\u{1F67}'), + (0x223C0338, '\u{2241}'), + (0x30D23099, '\u{30D3}'), + (0x1F6B0345, '\u{1FAB}'), + (0x490307, '\u{0130}'), + (0x410323, '\u{1EA0}'), + (0x550309, '\u{1EE6}'), + (0x75030B, '\u{0171}'), + (0x30533099, '\u{3054}'), + (0x305D3099, '\u{305E}'), + (0x4C0323, '\u{1E36}'), + (0x2260304, '\u{01E0}'), + (0x475030F, '\u{0477}'), + (0x490328, '\u{012E}'), + (0x1F210300, '\u{1F23}'), + (0x1F610301, '\u{1F65}'), + (0x1F210342, '\u{1F27}'), + (0x670302, '\u{011D}'), + (0x4E0301, '\u{0143}'), + (0x4E0303, '\u{00D1}'), + (0x3990300, '\u{1FDA}'), + (0x3BF0301, '\u{03CC}'), + (0x4150300, '\u{0400}'), + (0x3C90314, '\u{1F61}'), + (0x22A20338, '\u{22AC}'), + (0x30DB3099, '\u{30DC}'), + (0x3A50314, '\u{1F59}'), + (0x52030F, '\u{0210}'), + (0x4E0323, '\u{1E46}'), + (0x1F0D0345, '\u{1F8D}'), + (0x1ECD0302, '\u{1ED9}'), + (0xFC030C, '\u{01DA}'), + (0xD60304, '\u{022A}'), + (0x1F000301, '\u{1F04}'), + (0x30CF3099, '\u{30D0}'), + (0x4350306, '\u{04D7}'), + (0x220B0338, '\u{220C}'), + (0x590300, '\u{1EF2}'), + (0x4170308, '\u{04DE}'), + (0x6E030C, '\u{0148}'), + (0x4C030C, '\u{013D}'), + (0x1690301, '\u{1E79}'), + (0x4100308, '\u{04D2}'), + (0x1A00301, '\u{1EDA}'), + (0x41030F, '\u{0200}'), + (0x720301, '\u{0155}'), + (0x450303, '\u{1EBC}'), + (0x1B0D1B35, '\u{1B0E}'), + (0x1120301, '\u{1E16}'), + (0x4A0302, '\u{0134}'), + (0x3BF0300, '\u{1F78}'), + (0x30593099, '\u{305A}'), + (0x4F030B, '\u{0150}'), + (0x610328, '\u{0105}'), + (0x30D83099, '\u{30D9}'), + (0x1F2B0345, '\u{1F9B}'), + (0x1F400301, '\u{1F44}'), + (0x65030F, '\u{0205}'), + (0x3AE0345, '\u{1FC4}'), + (0x1680301, '\u{1E78}'), + (0x740326, '\u{021B}'), + (0x3B90342, '\u{1FD6}'), + (0x1F6F0345, '\u{1FAF}'), + (0x3A50301, '\u{038E}'), + (0x1F090345, '\u{1F89}'), + (0x550300, '\u{00D9}'), + (0x41030C, '\u{01CD}'), + (0x430327, '\u{00C7}'), + (0x460307, '\u{1E1E}'), + (0x3B50301, '\u{03AD}'), + (0xD470D3E, '\u{0D4B}'), + (0x610311, '\u{0203}'), + (0xD50308, '\u{1E4E}'), + (0x3C90300, '\u{1F7C}'), + (0x4430306, '\u{045E}'), + (0x1FFE0301, '\u{1FDE}'), + (0x3990301, '\u{038A}'), + (0x790307, '\u{1E8F}'), + (0x1E5A0304, '\u{1E5C}'), + (0x75030F, '\u{0215}'), + (0x9C709BE, '\u{09CB}'), + (0x1B071B35, '\u{1B08}'), + (0x690330, '\u{1E2D}'), + (0x307B309A, '\u{307D}'), + (0x30C83099, '\u{30C9}'), + (0x22B30338, '\u{22EB}'), + (0x1B00301, '\u{1EE9}'), + (0x790300, '\u{1EF3}'), + (0x570307, '\u{1E86}'), + (0x690328, '\u{012F}'), + (0x5A0323, '\u{1E92}'), + (0x3C50342, '\u{1FE6}'), + (0x4F0309, '\u{1ECE}'), + (0x1F290342, '\u{1F2F}'), + (0x1A00300, '\u{1EDC}'), + (0x1F2A0345, '\u{1F9A}'), + (0x14D0301, '\u{1E53}'), + (0x21D00338, '\u{21CD}'), + (0x550328, '\u{0172}'), + (0x680331, '\u{1E96}'), + (0x68030C, '\u{021F}'), + (0x4C0301, '\u{0139}'), + (0x22860338, '\u{2288}'), + (0x39F0314, '\u{1F49}'), + (0x3A50306, '\u{1FE8}'), + (0xB470B56, '\u{0B48}'), + (0x30753099, '\u{3076}'), + (0x1E5B0304, '\u{1E5D}'), + (0x1F6A0345, '\u{1FAA}'), + (0x540327, '\u{0162}'), + (0x1020303, '\u{1EB4}'), + (0x39F0313, '\u{1F48}'), + (0x1F090342, '\u{1F0F}'), + (0x4100306, '\u{04D0}'), + (0x14D0300, '\u{1E51}'), + (0x4430304, '\u{04EF}'), + (0x21920338, '\u{219B}'), + (0x22610338, '\u{2262}'), + (0xF50304, '\u{022D}'), + (0x3B90313, '\u{1F30}'), + (0x6F0308, '\u{00F6}'), + (0x730307, '\u{1E61}'), + (0x75031B, '\u{01B0}'), + (0x30B73099, '\u{30B8}'), + (0x1E620307, '\u{1E68}'), + (0x410306, '\u{0102}'), + (0x3970314, '\u{1F29}'), + (0x630302, '\u{0109}'), + (0x6A0302, '\u{0135}'), + (0xE50301, '\u{01FB}'), + (0x730326, '\u{0219}'), + (0x1F740345, '\u{1FC2}'), + (0x650309, '\u{1EBB}'), + (0x5A030C, '\u{017D}'), + (0x22250338, '\u{2226}'), + (0x3A90313, '\u{1F68}'), + (0x720327, '\u{0157}'), + (0x1F090300, '\u{1F0B}'), + (0x4360308, '\u{04DD}'), + (0x1F080345, '\u{1F88}'), + (0x620331, '\u{1E07}'), + (0x22730338, '\u{2275}'), + (0x560323, '\u{1E7E}'), + (0x4F0323, '\u{1ECC}'), + (0x22E0304, '\u{0230}'), + (0x6D50654, '\u{06C0}'), + (0x3B10313, '\u{1F00}'), + (0x4F0303, '\u{00D5}'), + (0x1F010301, '\u{1F05}'), + (0x650304, '\u{0113}'), + (0x450323, '\u{1EB8}'), + (0xBC60BBE, '\u{0BCA}'), + (0x22650338, '\u{2271}'), + (0x3910314, '\u{1F09}'), + (0x1120300, '\u{1E14}'), + (0x4E0307, '\u{1E44}'), + (0x680308, '\u{1E27}'), + (0x4F0311, '\u{020E}'), + (0x550303, '\u{0168}'), + (0x3A10314, '\u{1FEC}'), + (0x3B10301, '\u{03AC}'), + (0x55030F, '\u{0214}'), + (0x3E0338, '\u{226F}'), + (0x1610307, '\u{1E67}'), + (0x1F040345, '\u{1F84}'), + (0x450300, '\u{00C8}'), + (0x1B091B35, '\u{1B0A}'), + (0x30FD3099, '\u{30FE}'), + (0x1F680301, '\u{1F6C}'), + (0x650303, '\u{1EBD}'), + (0x3B90304, '\u{1FD1}'), + (0x9C709D7, '\u{09CC}'), + (0x42B0308, '\u{04F8}'), + (0x4E0327, '\u{0145}'), + (0x1F630345, '\u{1FA3}'), + (0x4380306, '\u{0439}'), + (0x3B10314, '\u{1F01}'), + (0x540326, '\u{021A}'), + (0x740307, '\u{1E6B}'), + (0x3C90301, '\u{03CE}'), + (0x3990314, '\u{1F39}'), + (0x30B13099, '\u{30B2}'), + (0x750302, '\u{00FB}'), + (0xCC60CD6, '\u{0CC8}'), + (0x30BD3099, '\u{30BE}'), + (0x6E0300, '\u{01F9}'), + (0x1F390342, '\u{1F3F}'), + (0x2270304, '\u{01E1}'), + (0x22080338, '\u{2209}'), + (0x4180306, '\u{0419}'), + (0x44030C, '\u{010E}'), + (0x75030A, '\u{016F}'), + (0x6270654, '\u{0623}'), + (0x750306, '\u{016D}'), + (0x3B70300, '\u{1F74}'), + (0x1F660345, '\u{1FA6}'), + (0x1F690345, '\u{1FA9}'), + (0x15B0307, '\u{1E65}'), + (0x1F280342, '\u{1F2E}'), + (0x1F700345, '\u{1FB2}'), + (0x1F0F0345, '\u{1F8F}'), + (0x540331, '\u{1E6E}'), + (0x227B0338, '\u{2281}'), + (0x22870338, '\u{2289}'), + (0x1F010342, '\u{1F07}'), + (0x3A50308, '\u{03AB}'), + (0x1F650345, '\u{1FA5}'), + (0xD40300, '\u{1ED2}'), + (0xF60304, '\u{022B}'), + (0xCBF0CD5, '\u{0CC0}'), + (0x1F380342, '\u{1F3E}'), + (0x22B20338, '\u{22EA}'), + (0x72030F, '\u{0211}'), + (0x30BF3099, '\u{30C0}'), + (0x4E90308, '\u{04EB}'), + (0x22830338, '\u{2285}'), + (0x3CB0300, '\u{1FE2}'), + (0xCA0301, '\u{1EBE}'), + (0x590304, '\u{0232}'), + (0x690301, '\u{00ED}'), + (0x305F3099, '\u{3060}'), + (0x440307, '\u{1E0A}'), + (0x1ECC0302, '\u{1ED8}'), + (0x1F210345, '\u{1F91}'), + (0x410311, '\u{0202}'), + (0x720311, '\u{0213}'), + (0x3A50300, '\u{1FEA}'), + (0x1F590300, '\u{1F5B}'), + (0xE40304, '\u{01DF}'), + (0x1F500300, '\u{1F52}'), + (0x224D0338, '\u{226D}'), + (0x6E0301, '\u{0144}'), + (0x75032D, '\u{1E77}'), + (0xF40301, '\u{1ED1}'), + (0x3C90342, '\u{1FF6}'), + (0x3B70301, '\u{03AE}'), + (0x6E0307, '\u{1E45}'), + (0x410304, '\u{0100}'), + (0x1F190301, '\u{1F1D}'), + (0x3B10304, '\u{1FB1}'), + (0x3078309A, '\u{307A}'), + (0x570323, '\u{1E88}'), + (0x4430308, '\u{04F1}'), + (0x45032D, '\u{1E18}'), + (0x4150308, '\u{0401}'), + (0x4F0328, '\u{01EA}'), + (0x4D90308, '\u{04DB}'), + (0x4060308, '\u{0407}'), + (0xF40303, '\u{1ED7}'), + (0x3B90306, '\u{1FD0}'), + (0x650307, '\u{0117}'), + (0x1F680342, '\u{1F6E}'), + (0x4380304, '\u{04E3}'), + (0x1F410300, '\u{1F43}'), + (0x1FFE0300, '\u{1FDD}'), + (0x4F0301, '\u{00D3}'), + (0x640327, '\u{1E11}'), + (0x2290306, '\u{1E1D}'), + (0x7A0301, '\u{017A}'), + (0x620323, '\u{1E05}'), + (0x1F7C0345, '\u{1FF2}'), + (0x1B00323, '\u{1EF1}'), + (0x1F600301, '\u{1F64}'), + (0x30663099, '\u{3067}'), + (0x22640338, '\u{2270}'), + (0x1F310300, '\u{1F33}'), + (0x610323, '\u{1EA1}'), + (0x1F480300, '\u{1F4A}'), + (0x550301, '\u{00DA}'), + (0xC460C56, '\u{0C48}'), + (0x3CA0300, '\u{1FD2}'), + (0x1B7030C, '\u{01EE}'), + (0x720323, '\u{1E5B}'), + (0x1F200342, '\u{1F26}'), + (0x4300308, '\u{04D3}'), + (0x22820338, '\u{2284}'), + (0x1F590301, '\u{1F5D}'), + (0x1F080342, '\u{1F0E}'), + (0x440323, '\u{1E0C}'), + (0x1025102E, '\u{1026}'), + (0x3910304, '\u{1FB9}'), + (0x4B0331, '\u{1E34}'), + (0x690300, '\u{00EC}'), + (0x48032E, '\u{1E2A}'), + (0x630301, '\u{0107}'), + (0x1F690342, '\u{1F6F}'), + (0x3B50313, '\u{1F10}'), + (0x30CF309A, '\u{30D1}'), + (0x4E030C, '\u{0147}'), + (0xB470B57, '\u{0B4C}'), + (0x3910301, '\u{0386}'), + (0x650328, '\u{0119}'), + (0x1FBF0300, '\u{1FCD}'), + (0x3B70342, '\u{1FC6}'), + (0x450307, '\u{0116}'), + (0x1F380301, '\u{1F3C}'), + (0x3075309A, '\u{3077}'), + (0x4B0301, '\u{1E30}'), + (0x1030300, '\u{1EB1}'), + (0xE20303, '\u{1EAB}'), + (0x410302, '\u{00C2}'), + (0x650308, '\u{00EB}'), + (0x580307, '\u{1E8A}'), + (0x54030C, '\u{0164}'), + (0x3C50313, '\u{1F50}'), + (0x3B50314, '\u{1F11}'), + (0x1B3E1B35, '\u{1B40}'), + (0x1F100301, '\u{1F14}'), + (0x3072309A, '\u{3074}'), + (0x1F280345, '\u{1F98}'), + (0x22770338, '\u{2279}'), + (0x227A0338, '\u{2280}'), + (0x470302, '\u{011C}'), + (0x450308, '\u{00CB}'), + (0x550324, '\u{1E72}'), + (0x1F2C0345, '\u{1F9C}'), + (0x4B0327, '\u{0136}'), + (0x490302, '\u{00CE}'), + (0x680302, '\u{0125}'), + (0x520307, '\u{1E58}'), + (0x610301, '\u{00E1}'), + (0x4B030C, '\u{01E8}'), + (0x490309, '\u{1EC8}'), + (0x6C030C, '\u{013E}'), + (0x4D0307, '\u{1E40}'), + (0x1E360304, '\u{1E38}'), + (0x3C50304, '\u{1FE1}'), + (0x79030A, '\u{1E99}'), + (0x3970313, '\u{1F28}'), + (0x54032D, '\u{1E70}'), + (0x1F490300, '\u{1F4B}'), + (0x1B421B35, '\u{1B43}'), + (0x3B70313, '\u{1F20}'), + (0xEF0301, '\u{1E2F}'), + (0xE70301, '\u{1E09}'), + (0x16A0308, '\u{1E7A}'), + (0xCA0303, '\u{1EC4}'), + (0x3B10300, '\u{1F70}'), + (0x6D20654, '\u{06D3}'), + (0x30D53099, '\u{30D6}'), + (0x1F2F0345, '\u{1F9F}'), + (0x3B50300, '\u{1F72}'), + (0x750324, '\u{1E73}'), + (0x4150306, '\u{04D6}'), + (0x65030C, '\u{011B}'), + (0x570302, '\u{0174}'), + (0x1EA00306, '\u{1EB6}'), + (0x1F070345, '\u{1F87}'), + (0xA80301, '\u{0385}'), + (0x790302, '\u{0177}'), + (0x6E032D, '\u{1E4B}'), + (0x6F030C, '\u{01D2}'), + (0x3C90345, '\u{1FF3}'), + (0x430302, '\u{0108}'), + (0x790303, '\u{1EF9}'), + (0x740323, '\u{1E6D}'), + (0xE20309, '\u{1EA9}'), + (0x1F300300, '\u{1F32}'), + (0x6B0301, '\u{1E31}'), + (0x22920338, '\u{22E3}'), + (0x3950314, '\u{1F19}'), + (0x1F290301, '\u{1F2D}'), + (0x450328, '\u{0118}'), + (0x1FB60345, '\u{1FB7}'), + (0xD50304, '\u{022C}'), + (0x4300306, '\u{04D1}'), + (0xF50308, '\u{1E4F}'), + (0x1EA00302, '\u{1EAC}'), + (0x1F680300, '\u{1F6A}'), + (0x3970300, '\u{1FCA}'), + (0x450301, '\u{00C9}'), + (0x690304, '\u{012B}'), + (0xBC60BD7, '\u{0BCC}'), + (0x6F0304, '\u{014D}'), + (0x4F0308, '\u{00D6}'), + (0xBC70BBE, '\u{0BCB}'), + (0x55030C, '\u{01D3}'), + (0x3AC0345, '\u{1FB4}'), + (0x1FBF0342, '\u{1FCF}'), + (0x30D2309A, '\u{30D4}'), + (0x660307, '\u{1E1F}'), + (0x4E0300, '\u{01F8}'), + (0x790308, '\u{00FF}'), + (0x68032E, '\u{1E2B}'), + (0x64030C, '\u{010F}'), + (0x4F0307, '\u{022E}'), + (0x1F590342, '\u{1F5F}'), + (0x30AF3099, '\u{30B0}'), + (0xE60304, '\u{01E3}'), + (0x3C50301, '\u{03CD}'), + (0x770308, '\u{1E85}'), + (0x3B90314, '\u{1F31}'), + (0x750323, '\u{1EE5}'), + (0x590309, '\u{1EF6}'), + (0x292030C, '\u{01EF}'), + (0x550306, '\u{016C}'), + (0xE60301, '\u{01FD}'), + (0x16B0308, '\u{1E7B}'), + (0x4F030F, '\u{020C}'), + (0x3BF0313, '\u{1F40}'), + (0xD80301, '\u{01FE}'), + (0xC20303, '\u{1EAA}'), + (0x1F510300, '\u{1F53}'), + (0x1B00309, '\u{1EED}'), + (0x4E032D, '\u{1E4A}'), + (0x6F0309, '\u{1ECF}'), + (0x4180300, '\u{040D}'), + (0x22A90338, '\u{22AE}'), + (0x1F680345, '\u{1FA8}'), + (0x1B3C1B35, '\u{1B3D}'), + (0x1F400300, '\u{1F42}'), + (0x1F0B0345, '\u{1F8B}'), + (0x3C50306, '\u{1FE0}'), + (0x44032D, '\u{1E12}'), + (0xCCA0CD5, '\u{0CCB}'), + (0xEA0303, '\u{1EC5}'), + (0x4230306, '\u{040E}'), + (0xC70301, '\u{1E08}'), + (0x7A030C, '\u{017E}'), + (0x670307, '\u{0121}'), + (0x450311, '\u{0206}'), + (0x6F0300, '\u{00F2}'), + (0x30BB3099, '\u{30BC}'), + (0x4180308, '\u{04E4}'), + (0x30513099, '\u{3052}'), + (0x6C0323, '\u{1E37}'), + (0x3B70314, '\u{1F21}'), + (0x77030A, '\u{1E98}'), + (0x690323, '\u{1ECB}'), + (0x610303, '\u{00E3}'), + (0x30F13099, '\u{30F9}'), + (0x3B10345, '\u{1FB3}'), + (0xD460D3E, '\u{0D4A}'), + (0x3B90300, '\u{1F76}'), + (0x21D40338, '\u{21CE}'), + (0x1F620345, '\u{1FA2}'), + (0x770302, '\u{0175}'), + (0xFC0304, '\u{01D6}'), + (0x1130301, '\u{1E17}'), + (0x30683099, '\u{3069}'), + (0x1F600342, '\u{1F66}'), + (0x680323, '\u{1E25}'), + (0x3950313, '\u{1F18}'), + (0xEA0300, '\u{1EC1}'), + (0x3CB0342, '\u{1FE7}'), + (0x22430338, '\u{2244}'), + (0x30783099, '\u{3079}'), + (0x3990313, '\u{1F38}'), + (0x490330, '\u{1E2C}'), + (0x770307, '\u{1E87}'), + (0x650301, '\u{00E9}'), + (0x680327, '\u{1E29}'), + (0x22B50338, '\u{22ED}'), + (0x3B10342, '\u{1FB6}'), + (0x3910306, '\u{1FB8}'), + (0x4D0301, '\u{1E3E}'), + (0x410309, '\u{1EA2}'), + (0x1B051B35, '\u{1B06}'), + (0x3C0338, '\u{226E}'), + (0x590308, '\u{0178}'), + (0x1030303, '\u{1EB5}'), + (0x480327, '\u{1E28}'), + (0x6D0323, '\u{1E43}'), + (0x30643099, '\u{3065}'), + (0x4560308, '\u{0457}'), + (0x590302, '\u{0176}'), + (0x6C10654, '\u{06C2}'), + (0x43A0301, '\u{045C}'), + (0xE20300, '\u{1EA7}'), + (0x3950301, '\u{0388}'), + (0x630327, '\u{00E7}'), + (0x17F0307, '\u{1E9B}'), + (0x6480654, '\u{0624}'), + (0x30AB3099, '\u{30AC}'), + (0x1A00323, '\u{1EE2}'), + (0x4D80308, '\u{04DA}'), + (0x5A0331, '\u{1E94}'), + (0x67030C, '\u{01E7}'), + (0x39F0300, '\u{1FF8}'), + (0x650327, '\u{0229}'), + (0x490323, '\u{1ECA}'), + (0x1F110300, '\u{1F13}'), + (0x1F510342, '\u{1F57}'), + (0x4D0323, '\u{1E42}'), + (0x1F300301, '\u{1F34}'), + (0x6C0327, '\u{013C}'), + (0x1F050345, '\u{1F85}'), + (0x1A10300, '\u{1EDD}'), + (0x4160308, '\u{04DC}'), + (0x640307, '\u{1E0B}'), + (0x4C032D, '\u{1E3C}'), + (0x3C10314, '\u{1FE5}'), + (0x1EA0304, '\u{01EC}'), + (0x1F080300, '\u{1F0A}'), + (0x650302, '\u{00EA}'), + (0x3910300, '\u{1FBA}'), + (0x700301, '\u{1E55}'), + (0x1F020345, '\u{1F82}'), + (0x1020309, '\u{1EB2}'), + (0x750303, '\u{0169}'), + (0x1F0C0345, '\u{1F8C}'), + (0x3CB0301, '\u{03B0}'), + (0x740308, '\u{1E97}'), + (0x3950300, '\u{1FC8}'), + (0x227D0338, '\u{22E1}'), + (0x7A0323, '\u{1E93}'), + (0x6F0311, '\u{020F}'), + (0x6F0328, '\u{01EB}'), + (0x1F200300, '\u{1F22}'), + (0x1F190300, '\u{1F1B}'), + (0x560303, '\u{1E7C}'), + (0x6B030C, '\u{01E9}'), + (0x4E80308, '\u{04EA}'), + (0x3A90300, '\u{1FFA}'), + (0xA80342, '\u{1FC1}'), + (0x4360306, '\u{04C2}'), + (0xDC0301, '\u{01D7}'), + (0x750304, '\u{016B}'), + (0x22450338, '\u{2247}'), + (0x490304, '\u{012A}'), + (0x4380308, '\u{04E5}'), + (0xD460D57, '\u{0D4C}'), + (0x750300, '\u{00F9}'), + (0x22B40338, '\u{22EC}'), + (0x750308, '\u{00FC}'), + (0x3C50314, '\u{1F51}'), + (0x1600307, '\u{1E66}'), + (0x4160306, '\u{04C1}'), + (0x55031B, '\u{01AF}'), + (0x22AB0338, '\u{22AF}'), + (0x14C0300, '\u{1E50}'), + (0x1F310342, '\u{1F37}'), + (0x1F260345, '\u{1F96}'), + (0x22910338, '\u{22E2}'), + (0x500301, '\u{1E54}'), + (0x4C0327, '\u{013B}'), + (0x5A0301, '\u{0179}'), + (0x420307, '\u{1E02}'), + (0x3C10313, '\u{1FE4}'), + (0x1F410301, '\u{1F45}'), + (0x500307, '\u{1E56}'), + (0x43030C, '\u{010C}'), + (0x730323, '\u{1E63}'), + (0x30553099, '\u{3056}'), + (0x306F3099, '\u{3070}'), + (0x44D0308, '\u{04ED}'), + (0x1F670345, '\u{1FA7}'), + (0x1AF0301, '\u{1EE8}'), + (0x1F290300, '\u{1F2B}'), + (0x1B3F1B35, '\u{1B41}'), + (0x450302, '\u{00CA}'), + (0x6F0306, '\u{014F}'), + (0xFC0301, '\u{01D8}'), + (0x30F23099, '\u{30FA}'), + (0x1F2D0345, '\u{1F9D}'), + (0x14C0301, '\u{1E52}'), + (0x610308, '\u{00E4}'), + (0x1F600345, '\u{1FA0}'), + (0x1F0A0345, '\u{1F8A}'), + (0x610306, '\u{0103}'), + (0x1F600300, '\u{1F62}'), + (0x1AF0300, '\u{1EEA}'), + (0x43E0308, '\u{04E7}'), + (0x22230338, '\u{2224}'), + (0x3CA0301, '\u{0390}'), + (0x30D5309A, '\u{30D7}'), + (0x1F220345, '\u{1F92}'), + (0xD50301, '\u{1E4C}'), + (0x1F6C0345, '\u{1FAC}'), + (0x540307, '\u{1E6A}'), + (0x1E370304, '\u{1E39}'), + (0xDD90DCA, '\u{0DDA}'), + (0x1A10303, '\u{1EE1}'), + (0x48030C, '\u{021E}'), + (0xEA0309, '\u{1EC3}'), + (0x52030C, '\u{0158}'), + (0xD40303, '\u{1ED6}'), + (0x45030C, '\u{011A}'), + (0x30EF3099, '\u{30F7}'), + (0x480302, '\u{0124}'), + (0x520323, '\u{1E5A}'), + (0xC20300, '\u{1EA6}'), + (0x74032D, '\u{1E71}'), + (0x42D0308, '\u{04EC}'), + (0xDD90DDF, '\u{0DDE}'), + (0x410308, '\u{00C4}'), + (0x474030F, '\u{0476}'), + (0xC60301, '\u{01FC}'), + (0x1F310301, '\u{1F35}'), + (0x1F610300, '\u{1F63}'), + (0xCC60CC2, '\u{0CCA}'), + (0xC20301, '\u{1EA4}'), + (0x3C50308, '\u{03CB}'), + (0xE20301, '\u{1EA5}'), + (0x1F500342, '\u{1F56}'), + (0x610300, '\u{00E0}'), + (0x490311, '\u{020A}'), + (0x670327, '\u{0123}'), + (0x590307, '\u{1E8E}'), + (0x3970345, '\u{1FCC}'), + (0xD40309, '\u{1ED4}'), + (0x1A00303, '\u{1EE0}'), + (0x1FFE0342, '\u{1FDF}'), + (0x41A0301, '\u{040C}'), + (0x74030C, '\u{0165}'), + (0xDC0300, '\u{01DB}'), + (0x780308, '\u{1E8D}'), + (0xDC0304, '\u{01D5}'), + (0x610302, '\u{00E2}'), + (0x5A0302, '\u{1E90}'), + (0x933093C, '\u{0934}'), + (0x4F031B, '\u{01A0}'), + (0x520311, '\u{0212}'), + (0x6E0303, '\u{00F1}'), + (0x45030F, '\u{0204}'), + (0x1AF0309, '\u{1EEC}'), + (0x450304, '\u{0112}'), + (0x1F210301, '\u{1F25}'), + (0x22F0304, '\u{0231}'), + (0x3990306, '\u{1FD8}'), + (0x4E0331, '\u{1E48}'), + (0x1F380300, '\u{1F3A}'), + (0x490306, '\u{012C}'), + (0x690306, '\u{012D}'), + (0x1F060345, '\u{1F86}'), + (0x490301, '\u{00CD}'), + (0x570300, '\u{1E80}'), + (0x30F03099, '\u{30F8}'), + (0x53030C, '\u{0160}'), + (0x490300, '\u{00CC}'), + (0x30723099, '\u{3073}'), + (0x1F280300, '\u{1F2A}'), + (0x480307, '\u{1E22}'), + (0x1A00309, '\u{1EDE}'), + (0x1EB0304, '\u{01ED}'), + (0x1E630307, '\u{1E69}'), + (0x6F0323, '\u{1ECD}'), + (0x410303, '\u{00C3}'), + (0x3910345, '\u{1FBC}'), + (0x410328, '\u{0104}'), + (0x680307, '\u{1E23}'), + (0x6E0331, '\u{1E49}'), + (0xDDC0DCA, '\u{0DDD}'), + (0x580308, '\u{1E8C}'), + (0x410301, '\u{00C1}'), + (0x30C43099, '\u{30C5}'), + (0x420323, '\u{1E04}'), + (0x730302, '\u{015D}'), +]; + +pub(crate) fn composition_table_astral(c1: char, c2: char) -> Option<char> { match (c1, c2) { - ('\u{003C}', '\u{0338}') => Some('\u{226E}'), - ('\u{003D}', '\u{0338}') => Some('\u{2260}'), - ('\u{003E}', '\u{0338}') => Some('\u{226F}'), - ('\u{0041}', '\u{0300}') => Some('\u{00C0}'), - ('\u{0041}', '\u{0301}') => Some('\u{00C1}'), - ('\u{0041}', '\u{0302}') => Some('\u{00C2}'), - ('\u{0041}', '\u{0303}') => Some('\u{00C3}'), - ('\u{0041}', '\u{0304}') => Some('\u{0100}'), - ('\u{0041}', '\u{0306}') => Some('\u{0102}'), - ('\u{0041}', '\u{0307}') => Some('\u{0226}'), - ('\u{0041}', '\u{0308}') => Some('\u{00C4}'), - ('\u{0041}', '\u{0309}') => Some('\u{1EA2}'), - ('\u{0041}', '\u{030A}') => Some('\u{00C5}'), - ('\u{0041}', '\u{030C}') => Some('\u{01CD}'), - ('\u{0041}', '\u{030F}') => Some('\u{0200}'), - ('\u{0041}', '\u{0311}') => Some('\u{0202}'), - ('\u{0041}', '\u{0323}') => Some('\u{1EA0}'), - ('\u{0041}', '\u{0325}') => Some('\u{1E00}'), - ('\u{0041}', '\u{0328}') => Some('\u{0104}'), - ('\u{0042}', '\u{0307}') => Some('\u{1E02}'), - ('\u{0042}', '\u{0323}') => Some('\u{1E04}'), - ('\u{0042}', '\u{0331}') => Some('\u{1E06}'), - ('\u{0043}', '\u{0301}') => Some('\u{0106}'), - ('\u{0043}', '\u{0302}') => Some('\u{0108}'), - ('\u{0043}', '\u{0307}') => Some('\u{010A}'), - ('\u{0043}', '\u{030C}') => Some('\u{010C}'), - ('\u{0043}', '\u{0327}') => Some('\u{00C7}'), - ('\u{0044}', '\u{0307}') => Some('\u{1E0A}'), - ('\u{0044}', '\u{030C}') => Some('\u{010E}'), - ('\u{0044}', '\u{0323}') => Some('\u{1E0C}'), - ('\u{0044}', '\u{0327}') => Some('\u{1E10}'), - ('\u{0044}', '\u{032D}') => Some('\u{1E12}'), - ('\u{0044}', '\u{0331}') => Some('\u{1E0E}'), - ('\u{0045}', '\u{0300}') => Some('\u{00C8}'), - ('\u{0045}', '\u{0301}') => Some('\u{00C9}'), - ('\u{0045}', '\u{0302}') => Some('\u{00CA}'), - ('\u{0045}', '\u{0303}') => Some('\u{1EBC}'), - ('\u{0045}', '\u{0304}') => Some('\u{0112}'), - ('\u{0045}', '\u{0306}') => Some('\u{0114}'), - ('\u{0045}', '\u{0307}') => Some('\u{0116}'), - ('\u{0045}', '\u{0308}') => Some('\u{00CB}'), - ('\u{0045}', '\u{0309}') => Some('\u{1EBA}'), - ('\u{0045}', '\u{030C}') => Some('\u{011A}'), - ('\u{0045}', '\u{030F}') => Some('\u{0204}'), - ('\u{0045}', '\u{0311}') => Some('\u{0206}'), - ('\u{0045}', '\u{0323}') => Some('\u{1EB8}'), - ('\u{0045}', '\u{0327}') => Some('\u{0228}'), - ('\u{0045}', '\u{0328}') => Some('\u{0118}'), - ('\u{0045}', '\u{032D}') => Some('\u{1E18}'), - ('\u{0045}', '\u{0330}') => Some('\u{1E1A}'), - ('\u{0046}', '\u{0307}') => Some('\u{1E1E}'), - ('\u{0047}', '\u{0301}') => Some('\u{01F4}'), - ('\u{0047}', '\u{0302}') => Some('\u{011C}'), - ('\u{0047}', '\u{0304}') => Some('\u{1E20}'), - ('\u{0047}', '\u{0306}') => Some('\u{011E}'), - ('\u{0047}', '\u{0307}') => Some('\u{0120}'), - ('\u{0047}', '\u{030C}') => Some('\u{01E6}'), - ('\u{0047}', '\u{0327}') => Some('\u{0122}'), - ('\u{0048}', '\u{0302}') => Some('\u{0124}'), - ('\u{0048}', '\u{0307}') => Some('\u{1E22}'), - ('\u{0048}', '\u{0308}') => Some('\u{1E26}'), - ('\u{0048}', '\u{030C}') => Some('\u{021E}'), - ('\u{0048}', '\u{0323}') => Some('\u{1E24}'), - ('\u{0048}', '\u{0327}') => Some('\u{1E28}'), - ('\u{0048}', '\u{032E}') => Some('\u{1E2A}'), - ('\u{0049}', '\u{0300}') => Some('\u{00CC}'), - ('\u{0049}', '\u{0301}') => Some('\u{00CD}'), - ('\u{0049}', '\u{0302}') => Some('\u{00CE}'), - ('\u{0049}', '\u{0303}') => Some('\u{0128}'), - ('\u{0049}', '\u{0304}') => Some('\u{012A}'), - ('\u{0049}', '\u{0306}') => Some('\u{012C}'), - ('\u{0049}', '\u{0307}') => Some('\u{0130}'), - ('\u{0049}', '\u{0308}') => Some('\u{00CF}'), - ('\u{0049}', '\u{0309}') => Some('\u{1EC8}'), - ('\u{0049}', '\u{030C}') => Some('\u{01CF}'), - ('\u{0049}', '\u{030F}') => Some('\u{0208}'), - ('\u{0049}', '\u{0311}') => Some('\u{020A}'), - ('\u{0049}', '\u{0323}') => Some('\u{1ECA}'), - ('\u{0049}', '\u{0328}') => Some('\u{012E}'), - ('\u{0049}', '\u{0330}') => Some('\u{1E2C}'), - ('\u{004A}', '\u{0302}') => Some('\u{0134}'), - ('\u{004B}', '\u{0301}') => Some('\u{1E30}'), - ('\u{004B}', '\u{030C}') => Some('\u{01E8}'), - ('\u{004B}', '\u{0323}') => Some('\u{1E32}'), - ('\u{004B}', '\u{0327}') => Some('\u{0136}'), - ('\u{004B}', '\u{0331}') => Some('\u{1E34}'), - ('\u{004C}', '\u{0301}') => Some('\u{0139}'), - ('\u{004C}', '\u{030C}') => Some('\u{013D}'), - ('\u{004C}', '\u{0323}') => Some('\u{1E36}'), - ('\u{004C}', '\u{0327}') => Some('\u{013B}'), - ('\u{004C}', '\u{032D}') => Some('\u{1E3C}'), - ('\u{004C}', '\u{0331}') => Some('\u{1E3A}'), - ('\u{004D}', '\u{0301}') => Some('\u{1E3E}'), - ('\u{004D}', '\u{0307}') => Some('\u{1E40}'), - ('\u{004D}', '\u{0323}') => Some('\u{1E42}'), - ('\u{004E}', '\u{0300}') => Some('\u{01F8}'), - ('\u{004E}', '\u{0301}') => Some('\u{0143}'), - ('\u{004E}', '\u{0303}') => Some('\u{00D1}'), - ('\u{004E}', '\u{0307}') => Some('\u{1E44}'), - ('\u{004E}', '\u{030C}') => Some('\u{0147}'), - ('\u{004E}', '\u{0323}') => Some('\u{1E46}'), - ('\u{004E}', '\u{0327}') => Some('\u{0145}'), - ('\u{004E}', '\u{032D}') => Some('\u{1E4A}'), - ('\u{004E}', '\u{0331}') => Some('\u{1E48}'), - ('\u{004F}', '\u{0300}') => Some('\u{00D2}'), - ('\u{004F}', '\u{0301}') => Some('\u{00D3}'), - ('\u{004F}', '\u{0302}') => Some('\u{00D4}'), - ('\u{004F}', '\u{0303}') => Some('\u{00D5}'), - ('\u{004F}', '\u{0304}') => Some('\u{014C}'), - ('\u{004F}', '\u{0306}') => Some('\u{014E}'), - ('\u{004F}', '\u{0307}') => Some('\u{022E}'), - ('\u{004F}', '\u{0308}') => Some('\u{00D6}'), - ('\u{004F}', '\u{0309}') => Some('\u{1ECE}'), - ('\u{004F}', '\u{030B}') => Some('\u{0150}'), - ('\u{004F}', '\u{030C}') => Some('\u{01D1}'), - ('\u{004F}', '\u{030F}') => Some('\u{020C}'), - ('\u{004F}', '\u{0311}') => Some('\u{020E}'), - ('\u{004F}', '\u{031B}') => Some('\u{01A0}'), - ('\u{004F}', '\u{0323}') => Some('\u{1ECC}'), - ('\u{004F}', '\u{0328}') => Some('\u{01EA}'), - ('\u{0050}', '\u{0301}') => Some('\u{1E54}'), - ('\u{0050}', '\u{0307}') => Some('\u{1E56}'), - ('\u{0052}', '\u{0301}') => Some('\u{0154}'), - ('\u{0052}', '\u{0307}') => Some('\u{1E58}'), - ('\u{0052}', '\u{030C}') => Some('\u{0158}'), - ('\u{0052}', '\u{030F}') => Some('\u{0210}'), - ('\u{0052}', '\u{0311}') => Some('\u{0212}'), - ('\u{0052}', '\u{0323}') => Some('\u{1E5A}'), - ('\u{0052}', '\u{0327}') => Some('\u{0156}'), - ('\u{0052}', '\u{0331}') => Some('\u{1E5E}'), - ('\u{0053}', '\u{0301}') => Some('\u{015A}'), - ('\u{0053}', '\u{0302}') => Some('\u{015C}'), - ('\u{0053}', '\u{0307}') => Some('\u{1E60}'), - ('\u{0053}', '\u{030C}') => Some('\u{0160}'), - ('\u{0053}', '\u{0323}') => Some('\u{1E62}'), - ('\u{0053}', '\u{0326}') => Some('\u{0218}'), - ('\u{0053}', '\u{0327}') => Some('\u{015E}'), - ('\u{0054}', '\u{0307}') => Some('\u{1E6A}'), - ('\u{0054}', '\u{030C}') => Some('\u{0164}'), - ('\u{0054}', '\u{0323}') => Some('\u{1E6C}'), - ('\u{0054}', '\u{0326}') => Some('\u{021A}'), - ('\u{0054}', '\u{0327}') => Some('\u{0162}'), - ('\u{0054}', '\u{032D}') => Some('\u{1E70}'), - ('\u{0054}', '\u{0331}') => Some('\u{1E6E}'), - ('\u{0055}', '\u{0300}') => Some('\u{00D9}'), - ('\u{0055}', '\u{0301}') => Some('\u{00DA}'), - ('\u{0055}', '\u{0302}') => Some('\u{00DB}'), - ('\u{0055}', '\u{0303}') => Some('\u{0168}'), - ('\u{0055}', '\u{0304}') => Some('\u{016A}'), - ('\u{0055}', '\u{0306}') => Some('\u{016C}'), - ('\u{0055}', '\u{0308}') => Some('\u{00DC}'), - ('\u{0055}', '\u{0309}') => Some('\u{1EE6}'), - ('\u{0055}', '\u{030A}') => Some('\u{016E}'), - ('\u{0055}', '\u{030B}') => Some('\u{0170}'), - ('\u{0055}', '\u{030C}') => Some('\u{01D3}'), - ('\u{0055}', '\u{030F}') => Some('\u{0214}'), - ('\u{0055}', '\u{0311}') => Some('\u{0216}'), - ('\u{0055}', '\u{031B}') => Some('\u{01AF}'), - ('\u{0055}', '\u{0323}') => Some('\u{1EE4}'), - ('\u{0055}', '\u{0324}') => Some('\u{1E72}'), - ('\u{0055}', '\u{0328}') => Some('\u{0172}'), - ('\u{0055}', '\u{032D}') => Some('\u{1E76}'), - ('\u{0055}', '\u{0330}') => Some('\u{1E74}'), - ('\u{0056}', '\u{0303}') => Some('\u{1E7C}'), - ('\u{0056}', '\u{0323}') => Some('\u{1E7E}'), - ('\u{0057}', '\u{0300}') => Some('\u{1E80}'), - ('\u{0057}', '\u{0301}') => Some('\u{1E82}'), - ('\u{0057}', '\u{0302}') => Some('\u{0174}'), - ('\u{0057}', '\u{0307}') => Some('\u{1E86}'), - ('\u{0057}', '\u{0308}') => Some('\u{1E84}'), - ('\u{0057}', '\u{0323}') => Some('\u{1E88}'), - ('\u{0058}', '\u{0307}') => Some('\u{1E8A}'), - ('\u{0058}', '\u{0308}') => Some('\u{1E8C}'), - ('\u{0059}', '\u{0300}') => Some('\u{1EF2}'), - ('\u{0059}', '\u{0301}') => Some('\u{00DD}'), - ('\u{0059}', '\u{0302}') => Some('\u{0176}'), - ('\u{0059}', '\u{0303}') => Some('\u{1EF8}'), - ('\u{0059}', '\u{0304}') => Some('\u{0232}'), - ('\u{0059}', '\u{0307}') => Some('\u{1E8E}'), - ('\u{0059}', '\u{0308}') => Some('\u{0178}'), - ('\u{0059}', '\u{0309}') => Some('\u{1EF6}'), - ('\u{0059}', '\u{0323}') => Some('\u{1EF4}'), - ('\u{005A}', '\u{0301}') => Some('\u{0179}'), - ('\u{005A}', '\u{0302}') => Some('\u{1E90}'), - ('\u{005A}', '\u{0307}') => Some('\u{017B}'), - ('\u{005A}', '\u{030C}') => Some('\u{017D}'), - ('\u{005A}', '\u{0323}') => Some('\u{1E92}'), - ('\u{005A}', '\u{0331}') => Some('\u{1E94}'), - ('\u{0061}', '\u{0300}') => Some('\u{00E0}'), - ('\u{0061}', '\u{0301}') => Some('\u{00E1}'), - ('\u{0061}', '\u{0302}') => Some('\u{00E2}'), - ('\u{0061}', '\u{0303}') => Some('\u{00E3}'), - ('\u{0061}', '\u{0304}') => Some('\u{0101}'), - ('\u{0061}', '\u{0306}') => Some('\u{0103}'), - ('\u{0061}', '\u{0307}') => Some('\u{0227}'), - ('\u{0061}', '\u{0308}') => Some('\u{00E4}'), - ('\u{0061}', '\u{0309}') => Some('\u{1EA3}'), - ('\u{0061}', '\u{030A}') => Some('\u{00E5}'), - ('\u{0061}', '\u{030C}') => Some('\u{01CE}'), - ('\u{0061}', '\u{030F}') => Some('\u{0201}'), - ('\u{0061}', '\u{0311}') => Some('\u{0203}'), - ('\u{0061}', '\u{0323}') => Some('\u{1EA1}'), - ('\u{0061}', '\u{0325}') => Some('\u{1E01}'), - ('\u{0061}', '\u{0328}') => Some('\u{0105}'), - ('\u{0062}', '\u{0307}') => Some('\u{1E03}'), - ('\u{0062}', '\u{0323}') => Some('\u{1E05}'), - ('\u{0062}', '\u{0331}') => Some('\u{1E07}'), - ('\u{0063}', '\u{0301}') => Some('\u{0107}'), - ('\u{0063}', '\u{0302}') => Some('\u{0109}'), - ('\u{0063}', '\u{0307}') => Some('\u{010B}'), - ('\u{0063}', '\u{030C}') => Some('\u{010D}'), - ('\u{0063}', '\u{0327}') => Some('\u{00E7}'), - ('\u{0064}', '\u{0307}') => Some('\u{1E0B}'), - ('\u{0064}', '\u{030C}') => Some('\u{010F}'), - ('\u{0064}', '\u{0323}') => Some('\u{1E0D}'), - ('\u{0064}', '\u{0327}') => Some('\u{1E11}'), - ('\u{0064}', '\u{032D}') => Some('\u{1E13}'), - ('\u{0064}', '\u{0331}') => Some('\u{1E0F}'), - ('\u{0065}', '\u{0300}') => Some('\u{00E8}'), - ('\u{0065}', '\u{0301}') => Some('\u{00E9}'), - ('\u{0065}', '\u{0302}') => Some('\u{00EA}'), - ('\u{0065}', '\u{0303}') => Some('\u{1EBD}'), - ('\u{0065}', '\u{0304}') => Some('\u{0113}'), - ('\u{0065}', '\u{0306}') => Some('\u{0115}'), - ('\u{0065}', '\u{0307}') => Some('\u{0117}'), - ('\u{0065}', '\u{0308}') => Some('\u{00EB}'), - ('\u{0065}', '\u{0309}') => Some('\u{1EBB}'), - ('\u{0065}', '\u{030C}') => Some('\u{011B}'), - ('\u{0065}', '\u{030F}') => Some('\u{0205}'), - ('\u{0065}', '\u{0311}') => Some('\u{0207}'), - ('\u{0065}', '\u{0323}') => Some('\u{1EB9}'), - ('\u{0065}', '\u{0327}') => Some('\u{0229}'), - ('\u{0065}', '\u{0328}') => Some('\u{0119}'), - ('\u{0065}', '\u{032D}') => Some('\u{1E19}'), - ('\u{0065}', '\u{0330}') => Some('\u{1E1B}'), - ('\u{0066}', '\u{0307}') => Some('\u{1E1F}'), - ('\u{0067}', '\u{0301}') => Some('\u{01F5}'), - ('\u{0067}', '\u{0302}') => Some('\u{011D}'), - ('\u{0067}', '\u{0304}') => Some('\u{1E21}'), - ('\u{0067}', '\u{0306}') => Some('\u{011F}'), - ('\u{0067}', '\u{0307}') => Some('\u{0121}'), - ('\u{0067}', '\u{030C}') => Some('\u{01E7}'), - ('\u{0067}', '\u{0327}') => Some('\u{0123}'), - ('\u{0068}', '\u{0302}') => Some('\u{0125}'), - ('\u{0068}', '\u{0307}') => Some('\u{1E23}'), - ('\u{0068}', '\u{0308}') => Some('\u{1E27}'), - ('\u{0068}', '\u{030C}') => Some('\u{021F}'), - ('\u{0068}', '\u{0323}') => Some('\u{1E25}'), - ('\u{0068}', '\u{0327}') => Some('\u{1E29}'), - ('\u{0068}', '\u{032E}') => Some('\u{1E2B}'), - ('\u{0068}', '\u{0331}') => Some('\u{1E96}'), - ('\u{0069}', '\u{0300}') => Some('\u{00EC}'), - ('\u{0069}', '\u{0301}') => Some('\u{00ED}'), - ('\u{0069}', '\u{0302}') => Some('\u{00EE}'), - ('\u{0069}', '\u{0303}') => Some('\u{0129}'), - ('\u{0069}', '\u{0304}') => Some('\u{012B}'), - ('\u{0069}', '\u{0306}') => Some('\u{012D}'), - ('\u{0069}', '\u{0308}') => Some('\u{00EF}'), - ('\u{0069}', '\u{0309}') => Some('\u{1EC9}'), - ('\u{0069}', '\u{030C}') => Some('\u{01D0}'), - ('\u{0069}', '\u{030F}') => Some('\u{0209}'), - ('\u{0069}', '\u{0311}') => Some('\u{020B}'), - ('\u{0069}', '\u{0323}') => Some('\u{1ECB}'), - ('\u{0069}', '\u{0328}') => Some('\u{012F}'), - ('\u{0069}', '\u{0330}') => Some('\u{1E2D}'), - ('\u{006A}', '\u{0302}') => Some('\u{0135}'), - ('\u{006A}', '\u{030C}') => Some('\u{01F0}'), - ('\u{006B}', '\u{0301}') => Some('\u{1E31}'), - ('\u{006B}', '\u{030C}') => Some('\u{01E9}'), - ('\u{006B}', '\u{0323}') => Some('\u{1E33}'), - ('\u{006B}', '\u{0327}') => Some('\u{0137}'), - ('\u{006B}', '\u{0331}') => Some('\u{1E35}'), - ('\u{006C}', '\u{0301}') => Some('\u{013A}'), - ('\u{006C}', '\u{030C}') => Some('\u{013E}'), - ('\u{006C}', '\u{0323}') => Some('\u{1E37}'), - ('\u{006C}', '\u{0327}') => Some('\u{013C}'), - ('\u{006C}', '\u{032D}') => Some('\u{1E3D}'), - ('\u{006C}', '\u{0331}') => Some('\u{1E3B}'), - ('\u{006D}', '\u{0301}') => Some('\u{1E3F}'), - ('\u{006D}', '\u{0307}') => Some('\u{1E41}'), - ('\u{006D}', '\u{0323}') => Some('\u{1E43}'), - ('\u{006E}', '\u{0300}') => Some('\u{01F9}'), - ('\u{006E}', '\u{0301}') => Some('\u{0144}'), - ('\u{006E}', '\u{0303}') => Some('\u{00F1}'), - ('\u{006E}', '\u{0307}') => Some('\u{1E45}'), - ('\u{006E}', '\u{030C}') => Some('\u{0148}'), - ('\u{006E}', '\u{0323}') => Some('\u{1E47}'), - ('\u{006E}', '\u{0327}') => Some('\u{0146}'), - ('\u{006E}', '\u{032D}') => Some('\u{1E4B}'), - ('\u{006E}', '\u{0331}') => Some('\u{1E49}'), - ('\u{006F}', '\u{0300}') => Some('\u{00F2}'), - ('\u{006F}', '\u{0301}') => Some('\u{00F3}'), - ('\u{006F}', '\u{0302}') => Some('\u{00F4}'), - ('\u{006F}', '\u{0303}') => Some('\u{00F5}'), - ('\u{006F}', '\u{0304}') => Some('\u{014D}'), - ('\u{006F}', '\u{0306}') => Some('\u{014F}'), - ('\u{006F}', '\u{0307}') => Some('\u{022F}'), - ('\u{006F}', '\u{0308}') => Some('\u{00F6}'), - ('\u{006F}', '\u{0309}') => Some('\u{1ECF}'), - ('\u{006F}', '\u{030B}') => Some('\u{0151}'), - ('\u{006F}', '\u{030C}') => Some('\u{01D2}'), - ('\u{006F}', '\u{030F}') => Some('\u{020D}'), - ('\u{006F}', '\u{0311}') => Some('\u{020F}'), - ('\u{006F}', '\u{031B}') => Some('\u{01A1}'), - ('\u{006F}', '\u{0323}') => Some('\u{1ECD}'), - ('\u{006F}', '\u{0328}') => Some('\u{01EB}'), - ('\u{0070}', '\u{0301}') => Some('\u{1E55}'), - ('\u{0070}', '\u{0307}') => Some('\u{1E57}'), - ('\u{0072}', '\u{0301}') => Some('\u{0155}'), - ('\u{0072}', '\u{0307}') => Some('\u{1E59}'), - ('\u{0072}', '\u{030C}') => Some('\u{0159}'), - ('\u{0072}', '\u{030F}') => Some('\u{0211}'), - ('\u{0072}', '\u{0311}') => Some('\u{0213}'), - ('\u{0072}', '\u{0323}') => Some('\u{1E5B}'), - ('\u{0072}', '\u{0327}') => Some('\u{0157}'), - ('\u{0072}', '\u{0331}') => Some('\u{1E5F}'), - ('\u{0073}', '\u{0301}') => Some('\u{015B}'), - ('\u{0073}', '\u{0302}') => Some('\u{015D}'), - ('\u{0073}', '\u{0307}') => Some('\u{1E61}'), - ('\u{0073}', '\u{030C}') => Some('\u{0161}'), - ('\u{0073}', '\u{0323}') => Some('\u{1E63}'), - ('\u{0073}', '\u{0326}') => Some('\u{0219}'), - ('\u{0073}', '\u{0327}') => Some('\u{015F}'), - ('\u{0074}', '\u{0307}') => Some('\u{1E6B}'), - ('\u{0074}', '\u{0308}') => Some('\u{1E97}'), - ('\u{0074}', '\u{030C}') => Some('\u{0165}'), - ('\u{0074}', '\u{0323}') => Some('\u{1E6D}'), - ('\u{0074}', '\u{0326}') => Some('\u{021B}'), - ('\u{0074}', '\u{0327}') => Some('\u{0163}'), - ('\u{0074}', '\u{032D}') => Some('\u{1E71}'), - ('\u{0074}', '\u{0331}') => Some('\u{1E6F}'), - ('\u{0075}', '\u{0300}') => Some('\u{00F9}'), - ('\u{0075}', '\u{0301}') => Some('\u{00FA}'), - ('\u{0075}', '\u{0302}') => Some('\u{00FB}'), - ('\u{0075}', '\u{0303}') => Some('\u{0169}'), - ('\u{0075}', '\u{0304}') => Some('\u{016B}'), - ('\u{0075}', '\u{0306}') => Some('\u{016D}'), - ('\u{0075}', '\u{0308}') => Some('\u{00FC}'), - ('\u{0075}', '\u{0309}') => Some('\u{1EE7}'), - ('\u{0075}', '\u{030A}') => Some('\u{016F}'), - ('\u{0075}', '\u{030B}') => Some('\u{0171}'), - ('\u{0075}', '\u{030C}') => Some('\u{01D4}'), - ('\u{0075}', '\u{030F}') => Some('\u{0215}'), - ('\u{0075}', '\u{0311}') => Some('\u{0217}'), - ('\u{0075}', '\u{031B}') => Some('\u{01B0}'), - ('\u{0075}', '\u{0323}') => Some('\u{1EE5}'), - ('\u{0075}', '\u{0324}') => Some('\u{1E73}'), - ('\u{0075}', '\u{0328}') => Some('\u{0173}'), - ('\u{0075}', '\u{032D}') => Some('\u{1E77}'), - ('\u{0075}', '\u{0330}') => Some('\u{1E75}'), - ('\u{0076}', '\u{0303}') => Some('\u{1E7D}'), - ('\u{0076}', '\u{0323}') => Some('\u{1E7F}'), - ('\u{0077}', '\u{0300}') => Some('\u{1E81}'), - ('\u{0077}', '\u{0301}') => Some('\u{1E83}'), - ('\u{0077}', '\u{0302}') => Some('\u{0175}'), - ('\u{0077}', '\u{0307}') => Some('\u{1E87}'), - ('\u{0077}', '\u{0308}') => Some('\u{1E85}'), - ('\u{0077}', '\u{030A}') => Some('\u{1E98}'), - ('\u{0077}', '\u{0323}') => Some('\u{1E89}'), - ('\u{0078}', '\u{0307}') => Some('\u{1E8B}'), - ('\u{0078}', '\u{0308}') => Some('\u{1E8D}'), - ('\u{0079}', '\u{0300}') => Some('\u{1EF3}'), - ('\u{0079}', '\u{0301}') => Some('\u{00FD}'), - ('\u{0079}', '\u{0302}') => Some('\u{0177}'), - ('\u{0079}', '\u{0303}') => Some('\u{1EF9}'), - ('\u{0079}', '\u{0304}') => Some('\u{0233}'), - ('\u{0079}', '\u{0307}') => Some('\u{1E8F}'), - ('\u{0079}', '\u{0308}') => Some('\u{00FF}'), - ('\u{0079}', '\u{0309}') => Some('\u{1EF7}'), - ('\u{0079}', '\u{030A}') => Some('\u{1E99}'), - ('\u{0079}', '\u{0323}') => Some('\u{1EF5}'), - ('\u{007A}', '\u{0301}') => Some('\u{017A}'), - ('\u{007A}', '\u{0302}') => Some('\u{1E91}'), - ('\u{007A}', '\u{0307}') => Some('\u{017C}'), - ('\u{007A}', '\u{030C}') => Some('\u{017E}'), - ('\u{007A}', '\u{0323}') => Some('\u{1E93}'), - ('\u{007A}', '\u{0331}') => Some('\u{1E95}'), - ('\u{00A8}', '\u{0300}') => Some('\u{1FED}'), - ('\u{00A8}', '\u{0301}') => Some('\u{0385}'), - ('\u{00A8}', '\u{0342}') => Some('\u{1FC1}'), - ('\u{00C2}', '\u{0300}') => Some('\u{1EA6}'), - ('\u{00C2}', '\u{0301}') => Some('\u{1EA4}'), - ('\u{00C2}', '\u{0303}') => Some('\u{1EAA}'), - ('\u{00C2}', '\u{0309}') => Some('\u{1EA8}'), - ('\u{00C4}', '\u{0304}') => Some('\u{01DE}'), - ('\u{00C5}', '\u{0301}') => Some('\u{01FA}'), - ('\u{00C6}', '\u{0301}') => Some('\u{01FC}'), - ('\u{00C6}', '\u{0304}') => Some('\u{01E2}'), - ('\u{00C7}', '\u{0301}') => Some('\u{1E08}'), - ('\u{00CA}', '\u{0300}') => Some('\u{1EC0}'), - ('\u{00CA}', '\u{0301}') => Some('\u{1EBE}'), - ('\u{00CA}', '\u{0303}') => Some('\u{1EC4}'), - ('\u{00CA}', '\u{0309}') => Some('\u{1EC2}'), - ('\u{00CF}', '\u{0301}') => Some('\u{1E2E}'), - ('\u{00D4}', '\u{0300}') => Some('\u{1ED2}'), - ('\u{00D4}', '\u{0301}') => Some('\u{1ED0}'), - ('\u{00D4}', '\u{0303}') => Some('\u{1ED6}'), - ('\u{00D4}', '\u{0309}') => Some('\u{1ED4}'), - ('\u{00D5}', '\u{0301}') => Some('\u{1E4C}'), - ('\u{00D5}', '\u{0304}') => Some('\u{022C}'), - ('\u{00D5}', '\u{0308}') => Some('\u{1E4E}'), - ('\u{00D6}', '\u{0304}') => Some('\u{022A}'), - ('\u{00D8}', '\u{0301}') => Some('\u{01FE}'), - ('\u{00DC}', '\u{0300}') => Some('\u{01DB}'), - ('\u{00DC}', '\u{0301}') => Some('\u{01D7}'), - ('\u{00DC}', '\u{0304}') => Some('\u{01D5}'), - ('\u{00DC}', '\u{030C}') => Some('\u{01D9}'), - ('\u{00E2}', '\u{0300}') => Some('\u{1EA7}'), - ('\u{00E2}', '\u{0301}') => Some('\u{1EA5}'), - ('\u{00E2}', '\u{0303}') => Some('\u{1EAB}'), - ('\u{00E2}', '\u{0309}') => Some('\u{1EA9}'), - ('\u{00E4}', '\u{0304}') => Some('\u{01DF}'), - ('\u{00E5}', '\u{0301}') => Some('\u{01FB}'), - ('\u{00E6}', '\u{0301}') => Some('\u{01FD}'), - ('\u{00E6}', '\u{0304}') => Some('\u{01E3}'), - ('\u{00E7}', '\u{0301}') => Some('\u{1E09}'), - ('\u{00EA}', '\u{0300}') => Some('\u{1EC1}'), - ('\u{00EA}', '\u{0301}') => Some('\u{1EBF}'), - ('\u{00EA}', '\u{0303}') => Some('\u{1EC5}'), - ('\u{00EA}', '\u{0309}') => Some('\u{1EC3}'), - ('\u{00EF}', '\u{0301}') => Some('\u{1E2F}'), - ('\u{00F4}', '\u{0300}') => Some('\u{1ED3}'), - ('\u{00F4}', '\u{0301}') => Some('\u{1ED1}'), - ('\u{00F4}', '\u{0303}') => Some('\u{1ED7}'), - ('\u{00F4}', '\u{0309}') => Some('\u{1ED5}'), - ('\u{00F5}', '\u{0301}') => Some('\u{1E4D}'), - ('\u{00F5}', '\u{0304}') => Some('\u{022D}'), - ('\u{00F5}', '\u{0308}') => Some('\u{1E4F}'), - ('\u{00F6}', '\u{0304}') => Some('\u{022B}'), - ('\u{00F8}', '\u{0301}') => Some('\u{01FF}'), - ('\u{00FC}', '\u{0300}') => Some('\u{01DC}'), - ('\u{00FC}', '\u{0301}') => Some('\u{01D8}'), - ('\u{00FC}', '\u{0304}') => Some('\u{01D6}'), - ('\u{00FC}', '\u{030C}') => Some('\u{01DA}'), - ('\u{0102}', '\u{0300}') => Some('\u{1EB0}'), - ('\u{0102}', '\u{0301}') => Some('\u{1EAE}'), - ('\u{0102}', '\u{0303}') => Some('\u{1EB4}'), - ('\u{0102}', '\u{0309}') => Some('\u{1EB2}'), - ('\u{0103}', '\u{0300}') => Some('\u{1EB1}'), - ('\u{0103}', '\u{0301}') => Some('\u{1EAF}'), - ('\u{0103}', '\u{0303}') => Some('\u{1EB5}'), - ('\u{0103}', '\u{0309}') => Some('\u{1EB3}'), - ('\u{0112}', '\u{0300}') => Some('\u{1E14}'), - ('\u{0112}', '\u{0301}') => Some('\u{1E16}'), - ('\u{0113}', '\u{0300}') => Some('\u{1E15}'), - ('\u{0113}', '\u{0301}') => Some('\u{1E17}'), - ('\u{014C}', '\u{0300}') => Some('\u{1E50}'), - ('\u{014C}', '\u{0301}') => Some('\u{1E52}'), - ('\u{014D}', '\u{0300}') => Some('\u{1E51}'), - ('\u{014D}', '\u{0301}') => Some('\u{1E53}'), - ('\u{015A}', '\u{0307}') => Some('\u{1E64}'), - ('\u{015B}', '\u{0307}') => Some('\u{1E65}'), - ('\u{0160}', '\u{0307}') => Some('\u{1E66}'), - ('\u{0161}', '\u{0307}') => Some('\u{1E67}'), - ('\u{0168}', '\u{0301}') => Some('\u{1E78}'), - ('\u{0169}', '\u{0301}') => Some('\u{1E79}'), - ('\u{016A}', '\u{0308}') => Some('\u{1E7A}'), - ('\u{016B}', '\u{0308}') => Some('\u{1E7B}'), - ('\u{017F}', '\u{0307}') => Some('\u{1E9B}'), - ('\u{01A0}', '\u{0300}') => Some('\u{1EDC}'), - ('\u{01A0}', '\u{0301}') => Some('\u{1EDA}'), - ('\u{01A0}', '\u{0303}') => Some('\u{1EE0}'), - ('\u{01A0}', '\u{0309}') => Some('\u{1EDE}'), - ('\u{01A0}', '\u{0323}') => Some('\u{1EE2}'), - ('\u{01A1}', '\u{0300}') => Some('\u{1EDD}'), - ('\u{01A1}', '\u{0301}') => Some('\u{1EDB}'), - ('\u{01A1}', '\u{0303}') => Some('\u{1EE1}'), - ('\u{01A1}', '\u{0309}') => Some('\u{1EDF}'), - ('\u{01A1}', '\u{0323}') => Some('\u{1EE3}'), - ('\u{01AF}', '\u{0300}') => Some('\u{1EEA}'), - ('\u{01AF}', '\u{0301}') => Some('\u{1EE8}'), - ('\u{01AF}', '\u{0303}') => Some('\u{1EEE}'), - ('\u{01AF}', '\u{0309}') => Some('\u{1EEC}'), - ('\u{01AF}', '\u{0323}') => Some('\u{1EF0}'), - ('\u{01B0}', '\u{0300}') => Some('\u{1EEB}'), - ('\u{01B0}', '\u{0301}') => Some('\u{1EE9}'), - ('\u{01B0}', '\u{0303}') => Some('\u{1EEF}'), - ('\u{01B0}', '\u{0309}') => Some('\u{1EED}'), - ('\u{01B0}', '\u{0323}') => Some('\u{1EF1}'), - ('\u{01B7}', '\u{030C}') => Some('\u{01EE}'), - ('\u{01EA}', '\u{0304}') => Some('\u{01EC}'), - ('\u{01EB}', '\u{0304}') => Some('\u{01ED}'), - ('\u{0226}', '\u{0304}') => Some('\u{01E0}'), - ('\u{0227}', '\u{0304}') => Some('\u{01E1}'), - ('\u{0228}', '\u{0306}') => Some('\u{1E1C}'), - ('\u{0229}', '\u{0306}') => Some('\u{1E1D}'), - ('\u{022E}', '\u{0304}') => Some('\u{0230}'), - ('\u{022F}', '\u{0304}') => Some('\u{0231}'), - ('\u{0292}', '\u{030C}') => Some('\u{01EF}'), - ('\u{0391}', '\u{0300}') => Some('\u{1FBA}'), - ('\u{0391}', '\u{0301}') => Some('\u{0386}'), - ('\u{0391}', '\u{0304}') => Some('\u{1FB9}'), - ('\u{0391}', '\u{0306}') => Some('\u{1FB8}'), - ('\u{0391}', '\u{0313}') => Some('\u{1F08}'), - ('\u{0391}', '\u{0314}') => Some('\u{1F09}'), - ('\u{0391}', '\u{0345}') => Some('\u{1FBC}'), - ('\u{0395}', '\u{0300}') => Some('\u{1FC8}'), - ('\u{0395}', '\u{0301}') => Some('\u{0388}'), - ('\u{0395}', '\u{0313}') => Some('\u{1F18}'), - ('\u{0395}', '\u{0314}') => Some('\u{1F19}'), - ('\u{0397}', '\u{0300}') => Some('\u{1FCA}'), - ('\u{0397}', '\u{0301}') => Some('\u{0389}'), - ('\u{0397}', '\u{0313}') => Some('\u{1F28}'), - ('\u{0397}', '\u{0314}') => Some('\u{1F29}'), - ('\u{0397}', '\u{0345}') => Some('\u{1FCC}'), - ('\u{0399}', '\u{0300}') => Some('\u{1FDA}'), - ('\u{0399}', '\u{0301}') => Some('\u{038A}'), - ('\u{0399}', '\u{0304}') => Some('\u{1FD9}'), - ('\u{0399}', '\u{0306}') => Some('\u{1FD8}'), - ('\u{0399}', '\u{0308}') => Some('\u{03AA}'), - ('\u{0399}', '\u{0313}') => Some('\u{1F38}'), - ('\u{0399}', '\u{0314}') => Some('\u{1F39}'), - ('\u{039F}', '\u{0300}') => Some('\u{1FF8}'), - ('\u{039F}', '\u{0301}') => Some('\u{038C}'), - ('\u{039F}', '\u{0313}') => Some('\u{1F48}'), - ('\u{039F}', '\u{0314}') => Some('\u{1F49}'), - ('\u{03A1}', '\u{0314}') => Some('\u{1FEC}'), - ('\u{03A5}', '\u{0300}') => Some('\u{1FEA}'), - ('\u{03A5}', '\u{0301}') => Some('\u{038E}'), - ('\u{03A5}', '\u{0304}') => Some('\u{1FE9}'), - ('\u{03A5}', '\u{0306}') => Some('\u{1FE8}'), - ('\u{03A5}', '\u{0308}') => Some('\u{03AB}'), - ('\u{03A5}', '\u{0314}') => Some('\u{1F59}'), - ('\u{03A9}', '\u{0300}') => Some('\u{1FFA}'), - ('\u{03A9}', '\u{0301}') => Some('\u{038F}'), - ('\u{03A9}', '\u{0313}') => Some('\u{1F68}'), - ('\u{03A9}', '\u{0314}') => Some('\u{1F69}'), - ('\u{03A9}', '\u{0345}') => Some('\u{1FFC}'), - ('\u{03AC}', '\u{0345}') => Some('\u{1FB4}'), - ('\u{03AE}', '\u{0345}') => Some('\u{1FC4}'), - ('\u{03B1}', '\u{0300}') => Some('\u{1F70}'), - ('\u{03B1}', '\u{0301}') => Some('\u{03AC}'), - ('\u{03B1}', '\u{0304}') => Some('\u{1FB1}'), - ('\u{03B1}', '\u{0306}') => Some('\u{1FB0}'), - ('\u{03B1}', '\u{0313}') => Some('\u{1F00}'), - ('\u{03B1}', '\u{0314}') => Some('\u{1F01}'), - ('\u{03B1}', '\u{0342}') => Some('\u{1FB6}'), - ('\u{03B1}', '\u{0345}') => Some('\u{1FB3}'), - ('\u{03B5}', '\u{0300}') => Some('\u{1F72}'), - ('\u{03B5}', '\u{0301}') => Some('\u{03AD}'), - ('\u{03B5}', '\u{0313}') => Some('\u{1F10}'), - ('\u{03B5}', '\u{0314}') => Some('\u{1F11}'), - ('\u{03B7}', '\u{0300}') => Some('\u{1F74}'), - ('\u{03B7}', '\u{0301}') => Some('\u{03AE}'), - ('\u{03B7}', '\u{0313}') => Some('\u{1F20}'), - ('\u{03B7}', '\u{0314}') => Some('\u{1F21}'), - ('\u{03B7}', '\u{0342}') => Some('\u{1FC6}'), - ('\u{03B7}', '\u{0345}') => Some('\u{1FC3}'), - ('\u{03B9}', '\u{0300}') => Some('\u{1F76}'), - ('\u{03B9}', '\u{0301}') => Some('\u{03AF}'), - ('\u{03B9}', '\u{0304}') => Some('\u{1FD1}'), - ('\u{03B9}', '\u{0306}') => Some('\u{1FD0}'), - ('\u{03B9}', '\u{0308}') => Some('\u{03CA}'), - ('\u{03B9}', '\u{0313}') => Some('\u{1F30}'), - ('\u{03B9}', '\u{0314}') => Some('\u{1F31}'), - ('\u{03B9}', '\u{0342}') => Some('\u{1FD6}'), - ('\u{03BF}', '\u{0300}') => Some('\u{1F78}'), - ('\u{03BF}', '\u{0301}') => Some('\u{03CC}'), - ('\u{03BF}', '\u{0313}') => Some('\u{1F40}'), - ('\u{03BF}', '\u{0314}') => Some('\u{1F41}'), - ('\u{03C1}', '\u{0313}') => Some('\u{1FE4}'), - ('\u{03C1}', '\u{0314}') => Some('\u{1FE5}'), - ('\u{03C5}', '\u{0300}') => Some('\u{1F7A}'), - ('\u{03C5}', '\u{0301}') => Some('\u{03CD}'), - ('\u{03C5}', '\u{0304}') => Some('\u{1FE1}'), - ('\u{03C5}', '\u{0306}') => Some('\u{1FE0}'), - ('\u{03C5}', '\u{0308}') => Some('\u{03CB}'), - ('\u{03C5}', '\u{0313}') => Some('\u{1F50}'), - ('\u{03C5}', '\u{0314}') => Some('\u{1F51}'), - ('\u{03C5}', '\u{0342}') => Some('\u{1FE6}'), - ('\u{03C9}', '\u{0300}') => Some('\u{1F7C}'), - ('\u{03C9}', '\u{0301}') => Some('\u{03CE}'), - ('\u{03C9}', '\u{0313}') => Some('\u{1F60}'), - ('\u{03C9}', '\u{0314}') => Some('\u{1F61}'), - ('\u{03C9}', '\u{0342}') => Some('\u{1FF6}'), - ('\u{03C9}', '\u{0345}') => Some('\u{1FF3}'), - ('\u{03CA}', '\u{0300}') => Some('\u{1FD2}'), - ('\u{03CA}', '\u{0301}') => Some('\u{0390}'), - ('\u{03CA}', '\u{0342}') => Some('\u{1FD7}'), - ('\u{03CB}', '\u{0300}') => Some('\u{1FE2}'), - ('\u{03CB}', '\u{0301}') => Some('\u{03B0}'), - ('\u{03CB}', '\u{0342}') => Some('\u{1FE7}'), - ('\u{03CE}', '\u{0345}') => Some('\u{1FF4}'), - ('\u{03D2}', '\u{0301}') => Some('\u{03D3}'), - ('\u{03D2}', '\u{0308}') => Some('\u{03D4}'), - ('\u{0406}', '\u{0308}') => Some('\u{0407}'), - ('\u{0410}', '\u{0306}') => Some('\u{04D0}'), - ('\u{0410}', '\u{0308}') => Some('\u{04D2}'), - ('\u{0413}', '\u{0301}') => Some('\u{0403}'), - ('\u{0415}', '\u{0300}') => Some('\u{0400}'), - ('\u{0415}', '\u{0306}') => Some('\u{04D6}'), - ('\u{0415}', '\u{0308}') => Some('\u{0401}'), - ('\u{0416}', '\u{0306}') => Some('\u{04C1}'), - ('\u{0416}', '\u{0308}') => Some('\u{04DC}'), - ('\u{0417}', '\u{0308}') => Some('\u{04DE}'), - ('\u{0418}', '\u{0300}') => Some('\u{040D}'), - ('\u{0418}', '\u{0304}') => Some('\u{04E2}'), - ('\u{0418}', '\u{0306}') => Some('\u{0419}'), - ('\u{0418}', '\u{0308}') => Some('\u{04E4}'), - ('\u{041A}', '\u{0301}') => Some('\u{040C}'), - ('\u{041E}', '\u{0308}') => Some('\u{04E6}'), - ('\u{0423}', '\u{0304}') => Some('\u{04EE}'), - ('\u{0423}', '\u{0306}') => Some('\u{040E}'), - ('\u{0423}', '\u{0308}') => Some('\u{04F0}'), - ('\u{0423}', '\u{030B}') => Some('\u{04F2}'), - ('\u{0427}', '\u{0308}') => Some('\u{04F4}'), - ('\u{042B}', '\u{0308}') => Some('\u{04F8}'), - ('\u{042D}', '\u{0308}') => Some('\u{04EC}'), - ('\u{0430}', '\u{0306}') => Some('\u{04D1}'), - ('\u{0430}', '\u{0308}') => Some('\u{04D3}'), - ('\u{0433}', '\u{0301}') => Some('\u{0453}'), - ('\u{0435}', '\u{0300}') => Some('\u{0450}'), - ('\u{0435}', '\u{0306}') => Some('\u{04D7}'), - ('\u{0435}', '\u{0308}') => Some('\u{0451}'), - ('\u{0436}', '\u{0306}') => Some('\u{04C2}'), - ('\u{0436}', '\u{0308}') => Some('\u{04DD}'), - ('\u{0437}', '\u{0308}') => Some('\u{04DF}'), - ('\u{0438}', '\u{0300}') => Some('\u{045D}'), - ('\u{0438}', '\u{0304}') => Some('\u{04E3}'), - ('\u{0438}', '\u{0306}') => Some('\u{0439}'), - ('\u{0438}', '\u{0308}') => Some('\u{04E5}'), - ('\u{043A}', '\u{0301}') => Some('\u{045C}'), - ('\u{043E}', '\u{0308}') => Some('\u{04E7}'), - ('\u{0443}', '\u{0304}') => Some('\u{04EF}'), - ('\u{0443}', '\u{0306}') => Some('\u{045E}'), - ('\u{0443}', '\u{0308}') => Some('\u{04F1}'), - ('\u{0443}', '\u{030B}') => Some('\u{04F3}'), - ('\u{0447}', '\u{0308}') => Some('\u{04F5}'), - ('\u{044B}', '\u{0308}') => Some('\u{04F9}'), - ('\u{044D}', '\u{0308}') => Some('\u{04ED}'), - ('\u{0456}', '\u{0308}') => Some('\u{0457}'), - ('\u{0474}', '\u{030F}') => Some('\u{0476}'), - ('\u{0475}', '\u{030F}') => Some('\u{0477}'), - ('\u{04D8}', '\u{0308}') => Some('\u{04DA}'), - ('\u{04D9}', '\u{0308}') => Some('\u{04DB}'), - ('\u{04E8}', '\u{0308}') => Some('\u{04EA}'), - ('\u{04E9}', '\u{0308}') => Some('\u{04EB}'), - ('\u{0627}', '\u{0653}') => Some('\u{0622}'), - ('\u{0627}', '\u{0654}') => Some('\u{0623}'), - ('\u{0627}', '\u{0655}') => Some('\u{0625}'), - ('\u{0648}', '\u{0654}') => Some('\u{0624}'), - ('\u{064A}', '\u{0654}') => Some('\u{0626}'), - ('\u{06C1}', '\u{0654}') => Some('\u{06C2}'), - ('\u{06D2}', '\u{0654}') => Some('\u{06D3}'), - ('\u{06D5}', '\u{0654}') => Some('\u{06C0}'), - ('\u{0928}', '\u{093C}') => Some('\u{0929}'), - ('\u{0930}', '\u{093C}') => Some('\u{0931}'), - ('\u{0933}', '\u{093C}') => Some('\u{0934}'), - ('\u{09C7}', '\u{09BE}') => Some('\u{09CB}'), - ('\u{09C7}', '\u{09D7}') => Some('\u{09CC}'), - ('\u{0B47}', '\u{0B3E}') => Some('\u{0B4B}'), - ('\u{0B47}', '\u{0B56}') => Some('\u{0B48}'), - ('\u{0B47}', '\u{0B57}') => Some('\u{0B4C}'), - ('\u{0B92}', '\u{0BD7}') => Some('\u{0B94}'), - ('\u{0BC6}', '\u{0BBE}') => Some('\u{0BCA}'), - ('\u{0BC6}', '\u{0BD7}') => Some('\u{0BCC}'), - ('\u{0BC7}', '\u{0BBE}') => Some('\u{0BCB}'), - ('\u{0C46}', '\u{0C56}') => Some('\u{0C48}'), - ('\u{0CBF}', '\u{0CD5}') => Some('\u{0CC0}'), - ('\u{0CC6}', '\u{0CC2}') => Some('\u{0CCA}'), - ('\u{0CC6}', '\u{0CD5}') => Some('\u{0CC7}'), - ('\u{0CC6}', '\u{0CD6}') => Some('\u{0CC8}'), - ('\u{0CCA}', '\u{0CD5}') => Some('\u{0CCB}'), - ('\u{0D46}', '\u{0D3E}') => Some('\u{0D4A}'), - ('\u{0D46}', '\u{0D57}') => Some('\u{0D4C}'), - ('\u{0D47}', '\u{0D3E}') => Some('\u{0D4B}'), - ('\u{0DD9}', '\u{0DCA}') => Some('\u{0DDA}'), - ('\u{0DD9}', '\u{0DCF}') => Some('\u{0DDC}'), - ('\u{0DD9}', '\u{0DDF}') => Some('\u{0DDE}'), - ('\u{0DDC}', '\u{0DCA}') => Some('\u{0DDD}'), - ('\u{1025}', '\u{102E}') => Some('\u{1026}'), - ('\u{1B05}', '\u{1B35}') => Some('\u{1B06}'), - ('\u{1B07}', '\u{1B35}') => Some('\u{1B08}'), - ('\u{1B09}', '\u{1B35}') => Some('\u{1B0A}'), - ('\u{1B0B}', '\u{1B35}') => Some('\u{1B0C}'), - ('\u{1B0D}', '\u{1B35}') => Some('\u{1B0E}'), - ('\u{1B11}', '\u{1B35}') => Some('\u{1B12}'), - ('\u{1B3A}', '\u{1B35}') => Some('\u{1B3B}'), - ('\u{1B3C}', '\u{1B35}') => Some('\u{1B3D}'), - ('\u{1B3E}', '\u{1B35}') => Some('\u{1B40}'), - ('\u{1B3F}', '\u{1B35}') => Some('\u{1B41}'), - ('\u{1B42}', '\u{1B35}') => Some('\u{1B43}'), - ('\u{1E36}', '\u{0304}') => Some('\u{1E38}'), - ('\u{1E37}', '\u{0304}') => Some('\u{1E39}'), - ('\u{1E5A}', '\u{0304}') => Some('\u{1E5C}'), - ('\u{1E5B}', '\u{0304}') => Some('\u{1E5D}'), - ('\u{1E62}', '\u{0307}') => Some('\u{1E68}'), - ('\u{1E63}', '\u{0307}') => Some('\u{1E69}'), - ('\u{1EA0}', '\u{0302}') => Some('\u{1EAC}'), - ('\u{1EA0}', '\u{0306}') => Some('\u{1EB6}'), - ('\u{1EA1}', '\u{0302}') => Some('\u{1EAD}'), - ('\u{1EA1}', '\u{0306}') => Some('\u{1EB7}'), - ('\u{1EB8}', '\u{0302}') => Some('\u{1EC6}'), - ('\u{1EB9}', '\u{0302}') => Some('\u{1EC7}'), - ('\u{1ECC}', '\u{0302}') => Some('\u{1ED8}'), - ('\u{1ECD}', '\u{0302}') => Some('\u{1ED9}'), - ('\u{1F00}', '\u{0300}') => Some('\u{1F02}'), - ('\u{1F00}', '\u{0301}') => Some('\u{1F04}'), - ('\u{1F00}', '\u{0342}') => Some('\u{1F06}'), - ('\u{1F00}', '\u{0345}') => Some('\u{1F80}'), - ('\u{1F01}', '\u{0300}') => Some('\u{1F03}'), - ('\u{1F01}', '\u{0301}') => Some('\u{1F05}'), - ('\u{1F01}', '\u{0342}') => Some('\u{1F07}'), - ('\u{1F01}', '\u{0345}') => Some('\u{1F81}'), - ('\u{1F02}', '\u{0345}') => Some('\u{1F82}'), - ('\u{1F03}', '\u{0345}') => Some('\u{1F83}'), - ('\u{1F04}', '\u{0345}') => Some('\u{1F84}'), - ('\u{1F05}', '\u{0345}') => Some('\u{1F85}'), - ('\u{1F06}', '\u{0345}') => Some('\u{1F86}'), - ('\u{1F07}', '\u{0345}') => Some('\u{1F87}'), - ('\u{1F08}', '\u{0300}') => Some('\u{1F0A}'), - ('\u{1F08}', '\u{0301}') => Some('\u{1F0C}'), - ('\u{1F08}', '\u{0342}') => Some('\u{1F0E}'), - ('\u{1F08}', '\u{0345}') => Some('\u{1F88}'), - ('\u{1F09}', '\u{0300}') => Some('\u{1F0B}'), - ('\u{1F09}', '\u{0301}') => Some('\u{1F0D}'), - ('\u{1F09}', '\u{0342}') => Some('\u{1F0F}'), - ('\u{1F09}', '\u{0345}') => Some('\u{1F89}'), - ('\u{1F0A}', '\u{0345}') => Some('\u{1F8A}'), - ('\u{1F0B}', '\u{0345}') => Some('\u{1F8B}'), - ('\u{1F0C}', '\u{0345}') => Some('\u{1F8C}'), - ('\u{1F0D}', '\u{0345}') => Some('\u{1F8D}'), - ('\u{1F0E}', '\u{0345}') => Some('\u{1F8E}'), - ('\u{1F0F}', '\u{0345}') => Some('\u{1F8F}'), - ('\u{1F10}', '\u{0300}') => Some('\u{1F12}'), - ('\u{1F10}', '\u{0301}') => Some('\u{1F14}'), - ('\u{1F11}', '\u{0300}') => Some('\u{1F13}'), - ('\u{1F11}', '\u{0301}') => Some('\u{1F15}'), - ('\u{1F18}', '\u{0300}') => Some('\u{1F1A}'), - ('\u{1F18}', '\u{0301}') => Some('\u{1F1C}'), - ('\u{1F19}', '\u{0300}') => Some('\u{1F1B}'), - ('\u{1F19}', '\u{0301}') => Some('\u{1F1D}'), - ('\u{1F20}', '\u{0300}') => Some('\u{1F22}'), - ('\u{1F20}', '\u{0301}') => Some('\u{1F24}'), - ('\u{1F20}', '\u{0342}') => Some('\u{1F26}'), - ('\u{1F20}', '\u{0345}') => Some('\u{1F90}'), - ('\u{1F21}', '\u{0300}') => Some('\u{1F23}'), - ('\u{1F21}', '\u{0301}') => Some('\u{1F25}'), - ('\u{1F21}', '\u{0342}') => Some('\u{1F27}'), - ('\u{1F21}', '\u{0345}') => Some('\u{1F91}'), - ('\u{1F22}', '\u{0345}') => Some('\u{1F92}'), - ('\u{1F23}', '\u{0345}') => Some('\u{1F93}'), - ('\u{1F24}', '\u{0345}') => Some('\u{1F94}'), - ('\u{1F25}', '\u{0345}') => Some('\u{1F95}'), - ('\u{1F26}', '\u{0345}') => Some('\u{1F96}'), - ('\u{1F27}', '\u{0345}') => Some('\u{1F97}'), - ('\u{1F28}', '\u{0300}') => Some('\u{1F2A}'), - ('\u{1F28}', '\u{0301}') => Some('\u{1F2C}'), - ('\u{1F28}', '\u{0342}') => Some('\u{1F2E}'), - ('\u{1F28}', '\u{0345}') => Some('\u{1F98}'), - ('\u{1F29}', '\u{0300}') => Some('\u{1F2B}'), - ('\u{1F29}', '\u{0301}') => Some('\u{1F2D}'), - ('\u{1F29}', '\u{0342}') => Some('\u{1F2F}'), - ('\u{1F29}', '\u{0345}') => Some('\u{1F99}'), - ('\u{1F2A}', '\u{0345}') => Some('\u{1F9A}'), - ('\u{1F2B}', '\u{0345}') => Some('\u{1F9B}'), - ('\u{1F2C}', '\u{0345}') => Some('\u{1F9C}'), - ('\u{1F2D}', '\u{0345}') => Some('\u{1F9D}'), - ('\u{1F2E}', '\u{0345}') => Some('\u{1F9E}'), - ('\u{1F2F}', '\u{0345}') => Some('\u{1F9F}'), - ('\u{1F30}', '\u{0300}') => Some('\u{1F32}'), - ('\u{1F30}', '\u{0301}') => Some('\u{1F34}'), - ('\u{1F30}', '\u{0342}') => Some('\u{1F36}'), - ('\u{1F31}', '\u{0300}') => Some('\u{1F33}'), - ('\u{1F31}', '\u{0301}') => Some('\u{1F35}'), - ('\u{1F31}', '\u{0342}') => Some('\u{1F37}'), - ('\u{1F38}', '\u{0300}') => Some('\u{1F3A}'), - ('\u{1F38}', '\u{0301}') => Some('\u{1F3C}'), - ('\u{1F38}', '\u{0342}') => Some('\u{1F3E}'), - ('\u{1F39}', '\u{0300}') => Some('\u{1F3B}'), - ('\u{1F39}', '\u{0301}') => Some('\u{1F3D}'), - ('\u{1F39}', '\u{0342}') => Some('\u{1F3F}'), - ('\u{1F40}', '\u{0300}') => Some('\u{1F42}'), - ('\u{1F40}', '\u{0301}') => Some('\u{1F44}'), - ('\u{1F41}', '\u{0300}') => Some('\u{1F43}'), - ('\u{1F41}', '\u{0301}') => Some('\u{1F45}'), - ('\u{1F48}', '\u{0300}') => Some('\u{1F4A}'), - ('\u{1F48}', '\u{0301}') => Some('\u{1F4C}'), - ('\u{1F49}', '\u{0300}') => Some('\u{1F4B}'), - ('\u{1F49}', '\u{0301}') => Some('\u{1F4D}'), - ('\u{1F50}', '\u{0300}') => Some('\u{1F52}'), - ('\u{1F50}', '\u{0301}') => Some('\u{1F54}'), - ('\u{1F50}', '\u{0342}') => Some('\u{1F56}'), - ('\u{1F51}', '\u{0300}') => Some('\u{1F53}'), - ('\u{1F51}', '\u{0301}') => Some('\u{1F55}'), - ('\u{1F51}', '\u{0342}') => Some('\u{1F57}'), - ('\u{1F59}', '\u{0300}') => Some('\u{1F5B}'), - ('\u{1F59}', '\u{0301}') => Some('\u{1F5D}'), - ('\u{1F59}', '\u{0342}') => Some('\u{1F5F}'), - ('\u{1F60}', '\u{0300}') => Some('\u{1F62}'), - ('\u{1F60}', '\u{0301}') => Some('\u{1F64}'), - ('\u{1F60}', '\u{0342}') => Some('\u{1F66}'), - ('\u{1F60}', '\u{0345}') => Some('\u{1FA0}'), - ('\u{1F61}', '\u{0300}') => Some('\u{1F63}'), - ('\u{1F61}', '\u{0301}') => Some('\u{1F65}'), - ('\u{1F61}', '\u{0342}') => Some('\u{1F67}'), - ('\u{1F61}', '\u{0345}') => Some('\u{1FA1}'), - ('\u{1F62}', '\u{0345}') => Some('\u{1FA2}'), - ('\u{1F63}', '\u{0345}') => Some('\u{1FA3}'), - ('\u{1F64}', '\u{0345}') => Some('\u{1FA4}'), - ('\u{1F65}', '\u{0345}') => Some('\u{1FA5}'), - ('\u{1F66}', '\u{0345}') => Some('\u{1FA6}'), - ('\u{1F67}', '\u{0345}') => Some('\u{1FA7}'), - ('\u{1F68}', '\u{0300}') => Some('\u{1F6A}'), - ('\u{1F68}', '\u{0301}') => Some('\u{1F6C}'), - ('\u{1F68}', '\u{0342}') => Some('\u{1F6E}'), - ('\u{1F68}', '\u{0345}') => Some('\u{1FA8}'), - ('\u{1F69}', '\u{0300}') => Some('\u{1F6B}'), - ('\u{1F69}', '\u{0301}') => Some('\u{1F6D}'), - ('\u{1F69}', '\u{0342}') => Some('\u{1F6F}'), - ('\u{1F69}', '\u{0345}') => Some('\u{1FA9}'), - ('\u{1F6A}', '\u{0345}') => Some('\u{1FAA}'), - ('\u{1F6B}', '\u{0345}') => Some('\u{1FAB}'), - ('\u{1F6C}', '\u{0345}') => Some('\u{1FAC}'), - ('\u{1F6D}', '\u{0345}') => Some('\u{1FAD}'), - ('\u{1F6E}', '\u{0345}') => Some('\u{1FAE}'), - ('\u{1F6F}', '\u{0345}') => Some('\u{1FAF}'), - ('\u{1F70}', '\u{0345}') => Some('\u{1FB2}'), - ('\u{1F74}', '\u{0345}') => Some('\u{1FC2}'), - ('\u{1F7C}', '\u{0345}') => Some('\u{1FF2}'), - ('\u{1FB6}', '\u{0345}') => Some('\u{1FB7}'), - ('\u{1FBF}', '\u{0300}') => Some('\u{1FCD}'), - ('\u{1FBF}', '\u{0301}') => Some('\u{1FCE}'), - ('\u{1FBF}', '\u{0342}') => Some('\u{1FCF}'), - ('\u{1FC6}', '\u{0345}') => Some('\u{1FC7}'), - ('\u{1FF6}', '\u{0345}') => Some('\u{1FF7}'), - ('\u{1FFE}', '\u{0300}') => Some('\u{1FDD}'), - ('\u{1FFE}', '\u{0301}') => Some('\u{1FDE}'), - ('\u{1FFE}', '\u{0342}') => Some('\u{1FDF}'), - ('\u{2190}', '\u{0338}') => Some('\u{219A}'), - ('\u{2192}', '\u{0338}') => Some('\u{219B}'), - ('\u{2194}', '\u{0338}') => Some('\u{21AE}'), - ('\u{21D0}', '\u{0338}') => Some('\u{21CD}'), - ('\u{21D2}', '\u{0338}') => Some('\u{21CF}'), - ('\u{21D4}', '\u{0338}') => Some('\u{21CE}'), - ('\u{2203}', '\u{0338}') => Some('\u{2204}'), - ('\u{2208}', '\u{0338}') => Some('\u{2209}'), - ('\u{220B}', '\u{0338}') => Some('\u{220C}'), - ('\u{2223}', '\u{0338}') => Some('\u{2224}'), - ('\u{2225}', '\u{0338}') => Some('\u{2226}'), - ('\u{223C}', '\u{0338}') => Some('\u{2241}'), - ('\u{2243}', '\u{0338}') => Some('\u{2244}'), - ('\u{2245}', '\u{0338}') => Some('\u{2247}'), - ('\u{2248}', '\u{0338}') => Some('\u{2249}'), - ('\u{224D}', '\u{0338}') => Some('\u{226D}'), - ('\u{2261}', '\u{0338}') => Some('\u{2262}'), - ('\u{2264}', '\u{0338}') => Some('\u{2270}'), - ('\u{2265}', '\u{0338}') => Some('\u{2271}'), - ('\u{2272}', '\u{0338}') => Some('\u{2274}'), - ('\u{2273}', '\u{0338}') => Some('\u{2275}'), - ('\u{2276}', '\u{0338}') => Some('\u{2278}'), - ('\u{2277}', '\u{0338}') => Some('\u{2279}'), - ('\u{227A}', '\u{0338}') => Some('\u{2280}'), - ('\u{227B}', '\u{0338}') => Some('\u{2281}'), - ('\u{227C}', '\u{0338}') => Some('\u{22E0}'), - ('\u{227D}', '\u{0338}') => Some('\u{22E1}'), - ('\u{2282}', '\u{0338}') => Some('\u{2284}'), - ('\u{2283}', '\u{0338}') => Some('\u{2285}'), - ('\u{2286}', '\u{0338}') => Some('\u{2288}'), - ('\u{2287}', '\u{0338}') => Some('\u{2289}'), - ('\u{2291}', '\u{0338}') => Some('\u{22E2}'), - ('\u{2292}', '\u{0338}') => Some('\u{22E3}'), - ('\u{22A2}', '\u{0338}') => Some('\u{22AC}'), - ('\u{22A8}', '\u{0338}') => Some('\u{22AD}'), - ('\u{22A9}', '\u{0338}') => Some('\u{22AE}'), - ('\u{22AB}', '\u{0338}') => Some('\u{22AF}'), - ('\u{22B2}', '\u{0338}') => Some('\u{22EA}'), - ('\u{22B3}', '\u{0338}') => Some('\u{22EB}'), - ('\u{22B4}', '\u{0338}') => Some('\u{22EC}'), - ('\u{22B5}', '\u{0338}') => Some('\u{22ED}'), - ('\u{3046}', '\u{3099}') => Some('\u{3094}'), - ('\u{304B}', '\u{3099}') => Some('\u{304C}'), - ('\u{304D}', '\u{3099}') => Some('\u{304E}'), - ('\u{304F}', '\u{3099}') => Some('\u{3050}'), - ('\u{3051}', '\u{3099}') => Some('\u{3052}'), - ('\u{3053}', '\u{3099}') => Some('\u{3054}'), - ('\u{3055}', '\u{3099}') => Some('\u{3056}'), - ('\u{3057}', '\u{3099}') => Some('\u{3058}'), - ('\u{3059}', '\u{3099}') => Some('\u{305A}'), - ('\u{305B}', '\u{3099}') => Some('\u{305C}'), - ('\u{305D}', '\u{3099}') => Some('\u{305E}'), - ('\u{305F}', '\u{3099}') => Some('\u{3060}'), - ('\u{3061}', '\u{3099}') => Some('\u{3062}'), - ('\u{3064}', '\u{3099}') => Some('\u{3065}'), - ('\u{3066}', '\u{3099}') => Some('\u{3067}'), - ('\u{3068}', '\u{3099}') => Some('\u{3069}'), - ('\u{306F}', '\u{3099}') => Some('\u{3070}'), - ('\u{306F}', '\u{309A}') => Some('\u{3071}'), - ('\u{3072}', '\u{3099}') => Some('\u{3073}'), - ('\u{3072}', '\u{309A}') => Some('\u{3074}'), - ('\u{3075}', '\u{3099}') => Some('\u{3076}'), - ('\u{3075}', '\u{309A}') => Some('\u{3077}'), - ('\u{3078}', '\u{3099}') => Some('\u{3079}'), - ('\u{3078}', '\u{309A}') => Some('\u{307A}'), - ('\u{307B}', '\u{3099}') => Some('\u{307C}'), - ('\u{307B}', '\u{309A}') => Some('\u{307D}'), - ('\u{309D}', '\u{3099}') => Some('\u{309E}'), - ('\u{30A6}', '\u{3099}') => Some('\u{30F4}'), - ('\u{30AB}', '\u{3099}') => Some('\u{30AC}'), - ('\u{30AD}', '\u{3099}') => Some('\u{30AE}'), - ('\u{30AF}', '\u{3099}') => Some('\u{30B0}'), - ('\u{30B1}', '\u{3099}') => Some('\u{30B2}'), - ('\u{30B3}', '\u{3099}') => Some('\u{30B4}'), - ('\u{30B5}', '\u{3099}') => Some('\u{30B6}'), - ('\u{30B7}', '\u{3099}') => Some('\u{30B8}'), - ('\u{30B9}', '\u{3099}') => Some('\u{30BA}'), - ('\u{30BB}', '\u{3099}') => Some('\u{30BC}'), - ('\u{30BD}', '\u{3099}') => Some('\u{30BE}'), - ('\u{30BF}', '\u{3099}') => Some('\u{30C0}'), - ('\u{30C1}', '\u{3099}') => Some('\u{30C2}'), - ('\u{30C4}', '\u{3099}') => Some('\u{30C5}'), - ('\u{30C6}', '\u{3099}') => Some('\u{30C7}'), - ('\u{30C8}', '\u{3099}') => Some('\u{30C9}'), - ('\u{30CF}', '\u{3099}') => Some('\u{30D0}'), - ('\u{30CF}', '\u{309A}') => Some('\u{30D1}'), - ('\u{30D2}', '\u{3099}') => Some('\u{30D3}'), - ('\u{30D2}', '\u{309A}') => Some('\u{30D4}'), - ('\u{30D5}', '\u{3099}') => Some('\u{30D6}'), - ('\u{30D5}', '\u{309A}') => Some('\u{30D7}'), - ('\u{30D8}', '\u{3099}') => Some('\u{30D9}'), - ('\u{30D8}', '\u{309A}') => Some('\u{30DA}'), - ('\u{30DB}', '\u{3099}') => Some('\u{30DC}'), - ('\u{30DB}', '\u{309A}') => Some('\u{30DD}'), - ('\u{30EF}', '\u{3099}') => Some('\u{30F7}'), - ('\u{30F0}', '\u{3099}') => Some('\u{30F8}'), - ('\u{30F1}', '\u{3099}') => Some('\u{30F9}'), - ('\u{30F2}', '\u{3099}') => Some('\u{30FA}'), - ('\u{30FD}', '\u{3099}') => Some('\u{30FE}'), ('\u{11099}', '\u{110BA}') => Some('\u{1109A}'), ('\u{1109B}', '\u{110BA}') => Some('\u{1109C}'), ('\u{110A5}', '\u{110BA}') => Some('\u{110AB}'), @@ -1785,7863 +3530,15694 @@ pub fn composition_table(c1: char, c2: char) -> Option<char> { } } -#[inline] -pub fn canonical_fully_decomposed(c: char) -> Option<&'static [char]> { - match c { - '\u{00C0}' => Some(&['\u{0041}', '\u{0300}']), - '\u{00C1}' => Some(&['\u{0041}', '\u{0301}']), - '\u{00C2}' => Some(&['\u{0041}', '\u{0302}']), - '\u{00C3}' => Some(&['\u{0041}', '\u{0303}']), - '\u{00C4}' => Some(&['\u{0041}', '\u{0308}']), - '\u{00C5}' => Some(&['\u{0041}', '\u{030A}']), - '\u{00C7}' => Some(&['\u{0043}', '\u{0327}']), - '\u{00C8}' => Some(&['\u{0045}', '\u{0300}']), - '\u{00C9}' => Some(&['\u{0045}', '\u{0301}']), - '\u{00CA}' => Some(&['\u{0045}', '\u{0302}']), - '\u{00CB}' => Some(&['\u{0045}', '\u{0308}']), - '\u{00CC}' => Some(&['\u{0049}', '\u{0300}']), - '\u{00CD}' => Some(&['\u{0049}', '\u{0301}']), - '\u{00CE}' => Some(&['\u{0049}', '\u{0302}']), - '\u{00CF}' => Some(&['\u{0049}', '\u{0308}']), - '\u{00D1}' => Some(&['\u{004E}', '\u{0303}']), - '\u{00D2}' => Some(&['\u{004F}', '\u{0300}']), - '\u{00D3}' => Some(&['\u{004F}', '\u{0301}']), - '\u{00D4}' => Some(&['\u{004F}', '\u{0302}']), - '\u{00D5}' => Some(&['\u{004F}', '\u{0303}']), - '\u{00D6}' => Some(&['\u{004F}', '\u{0308}']), - '\u{00D9}' => Some(&['\u{0055}', '\u{0300}']), - '\u{00DA}' => Some(&['\u{0055}', '\u{0301}']), - '\u{00DB}' => Some(&['\u{0055}', '\u{0302}']), - '\u{00DC}' => Some(&['\u{0055}', '\u{0308}']), - '\u{00DD}' => Some(&['\u{0059}', '\u{0301}']), - '\u{00E0}' => Some(&['\u{0061}', '\u{0300}']), - '\u{00E1}' => Some(&['\u{0061}', '\u{0301}']), - '\u{00E2}' => Some(&['\u{0061}', '\u{0302}']), - '\u{00E3}' => Some(&['\u{0061}', '\u{0303}']), - '\u{00E4}' => Some(&['\u{0061}', '\u{0308}']), - '\u{00E5}' => Some(&['\u{0061}', '\u{030A}']), - '\u{00E7}' => Some(&['\u{0063}', '\u{0327}']), - '\u{00E8}' => Some(&['\u{0065}', '\u{0300}']), - '\u{00E9}' => Some(&['\u{0065}', '\u{0301}']), - '\u{00EA}' => Some(&['\u{0065}', '\u{0302}']), - '\u{00EB}' => Some(&['\u{0065}', '\u{0308}']), - '\u{00EC}' => Some(&['\u{0069}', '\u{0300}']), - '\u{00ED}' => Some(&['\u{0069}', '\u{0301}']), - '\u{00EE}' => Some(&['\u{0069}', '\u{0302}']), - '\u{00EF}' => Some(&['\u{0069}', '\u{0308}']), - '\u{00F1}' => Some(&['\u{006E}', '\u{0303}']), - '\u{00F2}' => Some(&['\u{006F}', '\u{0300}']), - '\u{00F3}' => Some(&['\u{006F}', '\u{0301}']), - '\u{00F4}' => Some(&['\u{006F}', '\u{0302}']), - '\u{00F5}' => Some(&['\u{006F}', '\u{0303}']), - '\u{00F6}' => Some(&['\u{006F}', '\u{0308}']), - '\u{00F9}' => Some(&['\u{0075}', '\u{0300}']), - '\u{00FA}' => Some(&['\u{0075}', '\u{0301}']), - '\u{00FB}' => Some(&['\u{0075}', '\u{0302}']), - '\u{00FC}' => Some(&['\u{0075}', '\u{0308}']), - '\u{00FD}' => Some(&['\u{0079}', '\u{0301}']), - '\u{00FF}' => Some(&['\u{0079}', '\u{0308}']), - '\u{0100}' => Some(&['\u{0041}', '\u{0304}']), - '\u{0101}' => Some(&['\u{0061}', '\u{0304}']), - '\u{0102}' => Some(&['\u{0041}', '\u{0306}']), - '\u{0103}' => Some(&['\u{0061}', '\u{0306}']), - '\u{0104}' => Some(&['\u{0041}', '\u{0328}']), - '\u{0105}' => Some(&['\u{0061}', '\u{0328}']), - '\u{0106}' => Some(&['\u{0043}', '\u{0301}']), - '\u{0107}' => Some(&['\u{0063}', '\u{0301}']), - '\u{0108}' => Some(&['\u{0043}', '\u{0302}']), - '\u{0109}' => Some(&['\u{0063}', '\u{0302}']), - '\u{010A}' => Some(&['\u{0043}', '\u{0307}']), - '\u{010B}' => Some(&['\u{0063}', '\u{0307}']), - '\u{010C}' => Some(&['\u{0043}', '\u{030C}']), - '\u{010D}' => Some(&['\u{0063}', '\u{030C}']), - '\u{010E}' => Some(&['\u{0044}', '\u{030C}']), - '\u{010F}' => Some(&['\u{0064}', '\u{030C}']), - '\u{0112}' => Some(&['\u{0045}', '\u{0304}']), - '\u{0113}' => Some(&['\u{0065}', '\u{0304}']), - '\u{0114}' => Some(&['\u{0045}', '\u{0306}']), - '\u{0115}' => Some(&['\u{0065}', '\u{0306}']), - '\u{0116}' => Some(&['\u{0045}', '\u{0307}']), - '\u{0117}' => Some(&['\u{0065}', '\u{0307}']), - '\u{0118}' => Some(&['\u{0045}', '\u{0328}']), - '\u{0119}' => Some(&['\u{0065}', '\u{0328}']), - '\u{011A}' => Some(&['\u{0045}', '\u{030C}']), - '\u{011B}' => Some(&['\u{0065}', '\u{030C}']), - '\u{011C}' => Some(&['\u{0047}', '\u{0302}']), - '\u{011D}' => Some(&['\u{0067}', '\u{0302}']), - '\u{011E}' => Some(&['\u{0047}', '\u{0306}']), - '\u{011F}' => Some(&['\u{0067}', '\u{0306}']), - '\u{0120}' => Some(&['\u{0047}', '\u{0307}']), - '\u{0121}' => Some(&['\u{0067}', '\u{0307}']), - '\u{0122}' => Some(&['\u{0047}', '\u{0327}']), - '\u{0123}' => Some(&['\u{0067}', '\u{0327}']), - '\u{0124}' => Some(&['\u{0048}', '\u{0302}']), - '\u{0125}' => Some(&['\u{0068}', '\u{0302}']), - '\u{0128}' => Some(&['\u{0049}', '\u{0303}']), - '\u{0129}' => Some(&['\u{0069}', '\u{0303}']), - '\u{012A}' => Some(&['\u{0049}', '\u{0304}']), - '\u{012B}' => Some(&['\u{0069}', '\u{0304}']), - '\u{012C}' => Some(&['\u{0049}', '\u{0306}']), - '\u{012D}' => Some(&['\u{0069}', '\u{0306}']), - '\u{012E}' => Some(&['\u{0049}', '\u{0328}']), - '\u{012F}' => Some(&['\u{0069}', '\u{0328}']), - '\u{0130}' => Some(&['\u{0049}', '\u{0307}']), - '\u{0134}' => Some(&['\u{004A}', '\u{0302}']), - '\u{0135}' => Some(&['\u{006A}', '\u{0302}']), - '\u{0136}' => Some(&['\u{004B}', '\u{0327}']), - '\u{0137}' => Some(&['\u{006B}', '\u{0327}']), - '\u{0139}' => Some(&['\u{004C}', '\u{0301}']), - '\u{013A}' => Some(&['\u{006C}', '\u{0301}']), - '\u{013B}' => Some(&['\u{004C}', '\u{0327}']), - '\u{013C}' => Some(&['\u{006C}', '\u{0327}']), - '\u{013D}' => Some(&['\u{004C}', '\u{030C}']), - '\u{013E}' => Some(&['\u{006C}', '\u{030C}']), - '\u{0143}' => Some(&['\u{004E}', '\u{0301}']), - '\u{0144}' => Some(&['\u{006E}', '\u{0301}']), - '\u{0145}' => Some(&['\u{004E}', '\u{0327}']), - '\u{0146}' => Some(&['\u{006E}', '\u{0327}']), - '\u{0147}' => Some(&['\u{004E}', '\u{030C}']), - '\u{0148}' => Some(&['\u{006E}', '\u{030C}']), - '\u{014C}' => Some(&['\u{004F}', '\u{0304}']), - '\u{014D}' => Some(&['\u{006F}', '\u{0304}']), - '\u{014E}' => Some(&['\u{004F}', '\u{0306}']), - '\u{014F}' => Some(&['\u{006F}', '\u{0306}']), - '\u{0150}' => Some(&['\u{004F}', '\u{030B}']), - '\u{0151}' => Some(&['\u{006F}', '\u{030B}']), - '\u{0154}' => Some(&['\u{0052}', '\u{0301}']), - '\u{0155}' => Some(&['\u{0072}', '\u{0301}']), - '\u{0156}' => Some(&['\u{0052}', '\u{0327}']), - '\u{0157}' => Some(&['\u{0072}', '\u{0327}']), - '\u{0158}' => Some(&['\u{0052}', '\u{030C}']), - '\u{0159}' => Some(&['\u{0072}', '\u{030C}']), - '\u{015A}' => Some(&['\u{0053}', '\u{0301}']), - '\u{015B}' => Some(&['\u{0073}', '\u{0301}']), - '\u{015C}' => Some(&['\u{0053}', '\u{0302}']), - '\u{015D}' => Some(&['\u{0073}', '\u{0302}']), - '\u{015E}' => Some(&['\u{0053}', '\u{0327}']), - '\u{015F}' => Some(&['\u{0073}', '\u{0327}']), - '\u{0160}' => Some(&['\u{0053}', '\u{030C}']), - '\u{0161}' => Some(&['\u{0073}', '\u{030C}']), - '\u{0162}' => Some(&['\u{0054}', '\u{0327}']), - '\u{0163}' => Some(&['\u{0074}', '\u{0327}']), - '\u{0164}' => Some(&['\u{0054}', '\u{030C}']), - '\u{0165}' => Some(&['\u{0074}', '\u{030C}']), - '\u{0168}' => Some(&['\u{0055}', '\u{0303}']), - '\u{0169}' => Some(&['\u{0075}', '\u{0303}']), - '\u{016A}' => Some(&['\u{0055}', '\u{0304}']), - '\u{016B}' => Some(&['\u{0075}', '\u{0304}']), - '\u{016C}' => Some(&['\u{0055}', '\u{0306}']), - '\u{016D}' => Some(&['\u{0075}', '\u{0306}']), - '\u{016E}' => Some(&['\u{0055}', '\u{030A}']), - '\u{016F}' => Some(&['\u{0075}', '\u{030A}']), - '\u{0170}' => Some(&['\u{0055}', '\u{030B}']), - '\u{0171}' => Some(&['\u{0075}', '\u{030B}']), - '\u{0172}' => Some(&['\u{0055}', '\u{0328}']), - '\u{0173}' => Some(&['\u{0075}', '\u{0328}']), - '\u{0174}' => Some(&['\u{0057}', '\u{0302}']), - '\u{0175}' => Some(&['\u{0077}', '\u{0302}']), - '\u{0176}' => Some(&['\u{0059}', '\u{0302}']), - '\u{0177}' => Some(&['\u{0079}', '\u{0302}']), - '\u{0178}' => Some(&['\u{0059}', '\u{0308}']), - '\u{0179}' => Some(&['\u{005A}', '\u{0301}']), - '\u{017A}' => Some(&['\u{007A}', '\u{0301}']), - '\u{017B}' => Some(&['\u{005A}', '\u{0307}']), - '\u{017C}' => Some(&['\u{007A}', '\u{0307}']), - '\u{017D}' => Some(&['\u{005A}', '\u{030C}']), - '\u{017E}' => Some(&['\u{007A}', '\u{030C}']), - '\u{01A0}' => Some(&['\u{004F}', '\u{031B}']), - '\u{01A1}' => Some(&['\u{006F}', '\u{031B}']), - '\u{01AF}' => Some(&['\u{0055}', '\u{031B}']), - '\u{01B0}' => Some(&['\u{0075}', '\u{031B}']), - '\u{01CD}' => Some(&['\u{0041}', '\u{030C}']), - '\u{01CE}' => Some(&['\u{0061}', '\u{030C}']), - '\u{01CF}' => Some(&['\u{0049}', '\u{030C}']), - '\u{01D0}' => Some(&['\u{0069}', '\u{030C}']), - '\u{01D1}' => Some(&['\u{004F}', '\u{030C}']), - '\u{01D2}' => Some(&['\u{006F}', '\u{030C}']), - '\u{01D3}' => Some(&['\u{0055}', '\u{030C}']), - '\u{01D4}' => Some(&['\u{0075}', '\u{030C}']), - '\u{01D5}' => Some(&['\u{0055}', '\u{0308}', '\u{0304}']), - '\u{01D6}' => Some(&['\u{0075}', '\u{0308}', '\u{0304}']), - '\u{01D7}' => Some(&['\u{0055}', '\u{0308}', '\u{0301}']), - '\u{01D8}' => Some(&['\u{0075}', '\u{0308}', '\u{0301}']), - '\u{01D9}' => Some(&['\u{0055}', '\u{0308}', '\u{030C}']), - '\u{01DA}' => Some(&['\u{0075}', '\u{0308}', '\u{030C}']), - '\u{01DB}' => Some(&['\u{0055}', '\u{0308}', '\u{0300}']), - '\u{01DC}' => Some(&['\u{0075}', '\u{0308}', '\u{0300}']), - '\u{01DE}' => Some(&['\u{0041}', '\u{0308}', '\u{0304}']), - '\u{01DF}' => Some(&['\u{0061}', '\u{0308}', '\u{0304}']), - '\u{01E0}' => Some(&['\u{0041}', '\u{0307}', '\u{0304}']), - '\u{01E1}' => Some(&['\u{0061}', '\u{0307}', '\u{0304}']), - '\u{01E2}' => Some(&['\u{00C6}', '\u{0304}']), - '\u{01E3}' => Some(&['\u{00E6}', '\u{0304}']), - '\u{01E6}' => Some(&['\u{0047}', '\u{030C}']), - '\u{01E7}' => Some(&['\u{0067}', '\u{030C}']), - '\u{01E8}' => Some(&['\u{004B}', '\u{030C}']), - '\u{01E9}' => Some(&['\u{006B}', '\u{030C}']), - '\u{01EA}' => Some(&['\u{004F}', '\u{0328}']), - '\u{01EB}' => Some(&['\u{006F}', '\u{0328}']), - '\u{01EC}' => Some(&['\u{004F}', '\u{0328}', '\u{0304}']), - '\u{01ED}' => Some(&['\u{006F}', '\u{0328}', '\u{0304}']), - '\u{01EE}' => Some(&['\u{01B7}', '\u{030C}']), - '\u{01EF}' => Some(&['\u{0292}', '\u{030C}']), - '\u{01F0}' => Some(&['\u{006A}', '\u{030C}']), - '\u{01F4}' => Some(&['\u{0047}', '\u{0301}']), - '\u{01F5}' => Some(&['\u{0067}', '\u{0301}']), - '\u{01F8}' => Some(&['\u{004E}', '\u{0300}']), - '\u{01F9}' => Some(&['\u{006E}', '\u{0300}']), - '\u{01FA}' => Some(&['\u{0041}', '\u{030A}', '\u{0301}']), - '\u{01FB}' => Some(&['\u{0061}', '\u{030A}', '\u{0301}']), - '\u{01FC}' => Some(&['\u{00C6}', '\u{0301}']), - '\u{01FD}' => Some(&['\u{00E6}', '\u{0301}']), - '\u{01FE}' => Some(&['\u{00D8}', '\u{0301}']), - '\u{01FF}' => Some(&['\u{00F8}', '\u{0301}']), - '\u{0200}' => Some(&['\u{0041}', '\u{030F}']), - '\u{0201}' => Some(&['\u{0061}', '\u{030F}']), - '\u{0202}' => Some(&['\u{0041}', '\u{0311}']), - '\u{0203}' => Some(&['\u{0061}', '\u{0311}']), - '\u{0204}' => Some(&['\u{0045}', '\u{030F}']), - '\u{0205}' => Some(&['\u{0065}', '\u{030F}']), - '\u{0206}' => Some(&['\u{0045}', '\u{0311}']), - '\u{0207}' => Some(&['\u{0065}', '\u{0311}']), - '\u{0208}' => Some(&['\u{0049}', '\u{030F}']), - '\u{0209}' => Some(&['\u{0069}', '\u{030F}']), - '\u{020A}' => Some(&['\u{0049}', '\u{0311}']), - '\u{020B}' => Some(&['\u{0069}', '\u{0311}']), - '\u{020C}' => Some(&['\u{004F}', '\u{030F}']), - '\u{020D}' => Some(&['\u{006F}', '\u{030F}']), - '\u{020E}' => Some(&['\u{004F}', '\u{0311}']), - '\u{020F}' => Some(&['\u{006F}', '\u{0311}']), - '\u{0210}' => Some(&['\u{0052}', '\u{030F}']), - '\u{0211}' => Some(&['\u{0072}', '\u{030F}']), - '\u{0212}' => Some(&['\u{0052}', '\u{0311}']), - '\u{0213}' => Some(&['\u{0072}', '\u{0311}']), - '\u{0214}' => Some(&['\u{0055}', '\u{030F}']), - '\u{0215}' => Some(&['\u{0075}', '\u{030F}']), - '\u{0216}' => Some(&['\u{0055}', '\u{0311}']), - '\u{0217}' => Some(&['\u{0075}', '\u{0311}']), - '\u{0218}' => Some(&['\u{0053}', '\u{0326}']), - '\u{0219}' => Some(&['\u{0073}', '\u{0326}']), - '\u{021A}' => Some(&['\u{0054}', '\u{0326}']), - '\u{021B}' => Some(&['\u{0074}', '\u{0326}']), - '\u{021E}' => Some(&['\u{0048}', '\u{030C}']), - '\u{021F}' => Some(&['\u{0068}', '\u{030C}']), - '\u{0226}' => Some(&['\u{0041}', '\u{0307}']), - '\u{0227}' => Some(&['\u{0061}', '\u{0307}']), - '\u{0228}' => Some(&['\u{0045}', '\u{0327}']), - '\u{0229}' => Some(&['\u{0065}', '\u{0327}']), - '\u{022A}' => Some(&['\u{004F}', '\u{0308}', '\u{0304}']), - '\u{022B}' => Some(&['\u{006F}', '\u{0308}', '\u{0304}']), - '\u{022C}' => Some(&['\u{004F}', '\u{0303}', '\u{0304}']), - '\u{022D}' => Some(&['\u{006F}', '\u{0303}', '\u{0304}']), - '\u{022E}' => Some(&['\u{004F}', '\u{0307}']), - '\u{022F}' => Some(&['\u{006F}', '\u{0307}']), - '\u{0230}' => Some(&['\u{004F}', '\u{0307}', '\u{0304}']), - '\u{0231}' => Some(&['\u{006F}', '\u{0307}', '\u{0304}']), - '\u{0232}' => Some(&['\u{0059}', '\u{0304}']), - '\u{0233}' => Some(&['\u{0079}', '\u{0304}']), - '\u{0340}' => Some(&['\u{0300}']), - '\u{0341}' => Some(&['\u{0301}']), - '\u{0343}' => Some(&['\u{0313}']), - '\u{0344}' => Some(&['\u{0308}', '\u{0301}']), - '\u{0374}' => Some(&['\u{02B9}']), - '\u{037E}' => Some(&['\u{003B}']), - '\u{0385}' => Some(&['\u{00A8}', '\u{0301}']), - '\u{0386}' => Some(&['\u{0391}', '\u{0301}']), - '\u{0387}' => Some(&['\u{00B7}']), - '\u{0388}' => Some(&['\u{0395}', '\u{0301}']), - '\u{0389}' => Some(&['\u{0397}', '\u{0301}']), - '\u{038A}' => Some(&['\u{0399}', '\u{0301}']), - '\u{038C}' => Some(&['\u{039F}', '\u{0301}']), - '\u{038E}' => Some(&['\u{03A5}', '\u{0301}']), - '\u{038F}' => Some(&['\u{03A9}', '\u{0301}']), - '\u{0390}' => Some(&['\u{03B9}', '\u{0308}', '\u{0301}']), - '\u{03AA}' => Some(&['\u{0399}', '\u{0308}']), - '\u{03AB}' => Some(&['\u{03A5}', '\u{0308}']), - '\u{03AC}' => Some(&['\u{03B1}', '\u{0301}']), - '\u{03AD}' => Some(&['\u{03B5}', '\u{0301}']), - '\u{03AE}' => Some(&['\u{03B7}', '\u{0301}']), - '\u{03AF}' => Some(&['\u{03B9}', '\u{0301}']), - '\u{03B0}' => Some(&['\u{03C5}', '\u{0308}', '\u{0301}']), - '\u{03CA}' => Some(&['\u{03B9}', '\u{0308}']), - '\u{03CB}' => Some(&['\u{03C5}', '\u{0308}']), - '\u{03CC}' => Some(&['\u{03BF}', '\u{0301}']), - '\u{03CD}' => Some(&['\u{03C5}', '\u{0301}']), - '\u{03CE}' => Some(&['\u{03C9}', '\u{0301}']), - '\u{03D3}' => Some(&['\u{03D2}', '\u{0301}']), - '\u{03D4}' => Some(&['\u{03D2}', '\u{0308}']), - '\u{0400}' => Some(&['\u{0415}', '\u{0300}']), - '\u{0401}' => Some(&['\u{0415}', '\u{0308}']), - '\u{0403}' => Some(&['\u{0413}', '\u{0301}']), - '\u{0407}' => Some(&['\u{0406}', '\u{0308}']), - '\u{040C}' => Some(&['\u{041A}', '\u{0301}']), - '\u{040D}' => Some(&['\u{0418}', '\u{0300}']), - '\u{040E}' => Some(&['\u{0423}', '\u{0306}']), - '\u{0419}' => Some(&['\u{0418}', '\u{0306}']), - '\u{0439}' => Some(&['\u{0438}', '\u{0306}']), - '\u{0450}' => Some(&['\u{0435}', '\u{0300}']), - '\u{0451}' => Some(&['\u{0435}', '\u{0308}']), - '\u{0453}' => Some(&['\u{0433}', '\u{0301}']), - '\u{0457}' => Some(&['\u{0456}', '\u{0308}']), - '\u{045C}' => Some(&['\u{043A}', '\u{0301}']), - '\u{045D}' => Some(&['\u{0438}', '\u{0300}']), - '\u{045E}' => Some(&['\u{0443}', '\u{0306}']), - '\u{0476}' => Some(&['\u{0474}', '\u{030F}']), - '\u{0477}' => Some(&['\u{0475}', '\u{030F}']), - '\u{04C1}' => Some(&['\u{0416}', '\u{0306}']), - '\u{04C2}' => Some(&['\u{0436}', '\u{0306}']), - '\u{04D0}' => Some(&['\u{0410}', '\u{0306}']), - '\u{04D1}' => Some(&['\u{0430}', '\u{0306}']), - '\u{04D2}' => Some(&['\u{0410}', '\u{0308}']), - '\u{04D3}' => Some(&['\u{0430}', '\u{0308}']), - '\u{04D6}' => Some(&['\u{0415}', '\u{0306}']), - '\u{04D7}' => Some(&['\u{0435}', '\u{0306}']), - '\u{04DA}' => Some(&['\u{04D8}', '\u{0308}']), - '\u{04DB}' => Some(&['\u{04D9}', '\u{0308}']), - '\u{04DC}' => Some(&['\u{0416}', '\u{0308}']), - '\u{04DD}' => Some(&['\u{0436}', '\u{0308}']), - '\u{04DE}' => Some(&['\u{0417}', '\u{0308}']), - '\u{04DF}' => Some(&['\u{0437}', '\u{0308}']), - '\u{04E2}' => Some(&['\u{0418}', '\u{0304}']), - '\u{04E3}' => Some(&['\u{0438}', '\u{0304}']), - '\u{04E4}' => Some(&['\u{0418}', '\u{0308}']), - '\u{04E5}' => Some(&['\u{0438}', '\u{0308}']), - '\u{04E6}' => Some(&['\u{041E}', '\u{0308}']), - '\u{04E7}' => Some(&['\u{043E}', '\u{0308}']), - '\u{04EA}' => Some(&['\u{04E8}', '\u{0308}']), - '\u{04EB}' => Some(&['\u{04E9}', '\u{0308}']), - '\u{04EC}' => Some(&['\u{042D}', '\u{0308}']), - '\u{04ED}' => Some(&['\u{044D}', '\u{0308}']), - '\u{04EE}' => Some(&['\u{0423}', '\u{0304}']), - '\u{04EF}' => Some(&['\u{0443}', '\u{0304}']), - '\u{04F0}' => Some(&['\u{0423}', '\u{0308}']), - '\u{04F1}' => Some(&['\u{0443}', '\u{0308}']), - '\u{04F2}' => Some(&['\u{0423}', '\u{030B}']), - '\u{04F3}' => Some(&['\u{0443}', '\u{030B}']), - '\u{04F4}' => Some(&['\u{0427}', '\u{0308}']), - '\u{04F5}' => Some(&['\u{0447}', '\u{0308}']), - '\u{04F8}' => Some(&['\u{042B}', '\u{0308}']), - '\u{04F9}' => Some(&['\u{044B}', '\u{0308}']), - '\u{0622}' => Some(&['\u{0627}', '\u{0653}']), - '\u{0623}' => Some(&['\u{0627}', '\u{0654}']), - '\u{0624}' => Some(&['\u{0648}', '\u{0654}']), - '\u{0625}' => Some(&['\u{0627}', '\u{0655}']), - '\u{0626}' => Some(&['\u{064A}', '\u{0654}']), - '\u{06C0}' => Some(&['\u{06D5}', '\u{0654}']), - '\u{06C2}' => Some(&['\u{06C1}', '\u{0654}']), - '\u{06D3}' => Some(&['\u{06D2}', '\u{0654}']), - '\u{0929}' => Some(&['\u{0928}', '\u{093C}']), - '\u{0931}' => Some(&['\u{0930}', '\u{093C}']), - '\u{0934}' => Some(&['\u{0933}', '\u{093C}']), - '\u{0958}' => Some(&['\u{0915}', '\u{093C}']), - '\u{0959}' => Some(&['\u{0916}', '\u{093C}']), - '\u{095A}' => Some(&['\u{0917}', '\u{093C}']), - '\u{095B}' => Some(&['\u{091C}', '\u{093C}']), - '\u{095C}' => Some(&['\u{0921}', '\u{093C}']), - '\u{095D}' => Some(&['\u{0922}', '\u{093C}']), - '\u{095E}' => Some(&['\u{092B}', '\u{093C}']), - '\u{095F}' => Some(&['\u{092F}', '\u{093C}']), - '\u{09CB}' => Some(&['\u{09C7}', '\u{09BE}']), - '\u{09CC}' => Some(&['\u{09C7}', '\u{09D7}']), - '\u{09DC}' => Some(&['\u{09A1}', '\u{09BC}']), - '\u{09DD}' => Some(&['\u{09A2}', '\u{09BC}']), - '\u{09DF}' => Some(&['\u{09AF}', '\u{09BC}']), - '\u{0A33}' => Some(&['\u{0A32}', '\u{0A3C}']), - '\u{0A36}' => Some(&['\u{0A38}', '\u{0A3C}']), - '\u{0A59}' => Some(&['\u{0A16}', '\u{0A3C}']), - '\u{0A5A}' => Some(&['\u{0A17}', '\u{0A3C}']), - '\u{0A5B}' => Some(&['\u{0A1C}', '\u{0A3C}']), - '\u{0A5E}' => Some(&['\u{0A2B}', '\u{0A3C}']), - '\u{0B48}' => Some(&['\u{0B47}', '\u{0B56}']), - '\u{0B4B}' => Some(&['\u{0B47}', '\u{0B3E}']), - '\u{0B4C}' => Some(&['\u{0B47}', '\u{0B57}']), - '\u{0B5C}' => Some(&['\u{0B21}', '\u{0B3C}']), - '\u{0B5D}' => Some(&['\u{0B22}', '\u{0B3C}']), - '\u{0B94}' => Some(&['\u{0B92}', '\u{0BD7}']), - '\u{0BCA}' => Some(&['\u{0BC6}', '\u{0BBE}']), - '\u{0BCB}' => Some(&['\u{0BC7}', '\u{0BBE}']), - '\u{0BCC}' => Some(&['\u{0BC6}', '\u{0BD7}']), - '\u{0C48}' => Some(&['\u{0C46}', '\u{0C56}']), - '\u{0CC0}' => Some(&['\u{0CBF}', '\u{0CD5}']), - '\u{0CC7}' => Some(&['\u{0CC6}', '\u{0CD5}']), - '\u{0CC8}' => Some(&['\u{0CC6}', '\u{0CD6}']), - '\u{0CCA}' => Some(&['\u{0CC6}', '\u{0CC2}']), - '\u{0CCB}' => Some(&['\u{0CC6}', '\u{0CC2}', '\u{0CD5}']), - '\u{0D4A}' => Some(&['\u{0D46}', '\u{0D3E}']), - '\u{0D4B}' => Some(&['\u{0D47}', '\u{0D3E}']), - '\u{0D4C}' => Some(&['\u{0D46}', '\u{0D57}']), - '\u{0DDA}' => Some(&['\u{0DD9}', '\u{0DCA}']), - '\u{0DDC}' => Some(&['\u{0DD9}', '\u{0DCF}']), - '\u{0DDD}' => Some(&['\u{0DD9}', '\u{0DCF}', '\u{0DCA}']), - '\u{0DDE}' => Some(&['\u{0DD9}', '\u{0DDF}']), - '\u{0F43}' => Some(&['\u{0F42}', '\u{0FB7}']), - '\u{0F4D}' => Some(&['\u{0F4C}', '\u{0FB7}']), - '\u{0F52}' => Some(&['\u{0F51}', '\u{0FB7}']), - '\u{0F57}' => Some(&['\u{0F56}', '\u{0FB7}']), - '\u{0F5C}' => Some(&['\u{0F5B}', '\u{0FB7}']), - '\u{0F69}' => Some(&['\u{0F40}', '\u{0FB5}']), - '\u{0F73}' => Some(&['\u{0F71}', '\u{0F72}']), - '\u{0F75}' => Some(&['\u{0F71}', '\u{0F74}']), - '\u{0F76}' => Some(&['\u{0FB2}', '\u{0F80}']), - '\u{0F78}' => Some(&['\u{0FB3}', '\u{0F80}']), - '\u{0F81}' => Some(&['\u{0F71}', '\u{0F80}']), - '\u{0F93}' => Some(&['\u{0F92}', '\u{0FB7}']), - '\u{0F9D}' => Some(&['\u{0F9C}', '\u{0FB7}']), - '\u{0FA2}' => Some(&['\u{0FA1}', '\u{0FB7}']), - '\u{0FA7}' => Some(&['\u{0FA6}', '\u{0FB7}']), - '\u{0FAC}' => Some(&['\u{0FAB}', '\u{0FB7}']), - '\u{0FB9}' => Some(&['\u{0F90}', '\u{0FB5}']), - '\u{1026}' => Some(&['\u{1025}', '\u{102E}']), - '\u{1B06}' => Some(&['\u{1B05}', '\u{1B35}']), - '\u{1B08}' => Some(&['\u{1B07}', '\u{1B35}']), - '\u{1B0A}' => Some(&['\u{1B09}', '\u{1B35}']), - '\u{1B0C}' => Some(&['\u{1B0B}', '\u{1B35}']), - '\u{1B0E}' => Some(&['\u{1B0D}', '\u{1B35}']), - '\u{1B12}' => Some(&['\u{1B11}', '\u{1B35}']), - '\u{1B3B}' => Some(&['\u{1B3A}', '\u{1B35}']), - '\u{1B3D}' => Some(&['\u{1B3C}', '\u{1B35}']), - '\u{1B40}' => Some(&['\u{1B3E}', '\u{1B35}']), - '\u{1B41}' => Some(&['\u{1B3F}', '\u{1B35}']), - '\u{1B43}' => Some(&['\u{1B42}', '\u{1B35}']), - '\u{1E00}' => Some(&['\u{0041}', '\u{0325}']), - '\u{1E01}' => Some(&['\u{0061}', '\u{0325}']), - '\u{1E02}' => Some(&['\u{0042}', '\u{0307}']), - '\u{1E03}' => Some(&['\u{0062}', '\u{0307}']), - '\u{1E04}' => Some(&['\u{0042}', '\u{0323}']), - '\u{1E05}' => Some(&['\u{0062}', '\u{0323}']), - '\u{1E06}' => Some(&['\u{0042}', '\u{0331}']), - '\u{1E07}' => Some(&['\u{0062}', '\u{0331}']), - '\u{1E08}' => Some(&['\u{0043}', '\u{0327}', '\u{0301}']), - '\u{1E09}' => Some(&['\u{0063}', '\u{0327}', '\u{0301}']), - '\u{1E0A}' => Some(&['\u{0044}', '\u{0307}']), - '\u{1E0B}' => Some(&['\u{0064}', '\u{0307}']), - '\u{1E0C}' => Some(&['\u{0044}', '\u{0323}']), - '\u{1E0D}' => Some(&['\u{0064}', '\u{0323}']), - '\u{1E0E}' => Some(&['\u{0044}', '\u{0331}']), - '\u{1E0F}' => Some(&['\u{0064}', '\u{0331}']), - '\u{1E10}' => Some(&['\u{0044}', '\u{0327}']), - '\u{1E11}' => Some(&['\u{0064}', '\u{0327}']), - '\u{1E12}' => Some(&['\u{0044}', '\u{032D}']), - '\u{1E13}' => Some(&['\u{0064}', '\u{032D}']), - '\u{1E14}' => Some(&['\u{0045}', '\u{0304}', '\u{0300}']), - '\u{1E15}' => Some(&['\u{0065}', '\u{0304}', '\u{0300}']), - '\u{1E16}' => Some(&['\u{0045}', '\u{0304}', '\u{0301}']), - '\u{1E17}' => Some(&['\u{0065}', '\u{0304}', '\u{0301}']), - '\u{1E18}' => Some(&['\u{0045}', '\u{032D}']), - '\u{1E19}' => Some(&['\u{0065}', '\u{032D}']), - '\u{1E1A}' => Some(&['\u{0045}', '\u{0330}']), - '\u{1E1B}' => Some(&['\u{0065}', '\u{0330}']), - '\u{1E1C}' => Some(&['\u{0045}', '\u{0327}', '\u{0306}']), - '\u{1E1D}' => Some(&['\u{0065}', '\u{0327}', '\u{0306}']), - '\u{1E1E}' => Some(&['\u{0046}', '\u{0307}']), - '\u{1E1F}' => Some(&['\u{0066}', '\u{0307}']), - '\u{1E20}' => Some(&['\u{0047}', '\u{0304}']), - '\u{1E21}' => Some(&['\u{0067}', '\u{0304}']), - '\u{1E22}' => Some(&['\u{0048}', '\u{0307}']), - '\u{1E23}' => Some(&['\u{0068}', '\u{0307}']), - '\u{1E24}' => Some(&['\u{0048}', '\u{0323}']), - '\u{1E25}' => Some(&['\u{0068}', '\u{0323}']), - '\u{1E26}' => Some(&['\u{0048}', '\u{0308}']), - '\u{1E27}' => Some(&['\u{0068}', '\u{0308}']), - '\u{1E28}' => Some(&['\u{0048}', '\u{0327}']), - '\u{1E29}' => Some(&['\u{0068}', '\u{0327}']), - '\u{1E2A}' => Some(&['\u{0048}', '\u{032E}']), - '\u{1E2B}' => Some(&['\u{0068}', '\u{032E}']), - '\u{1E2C}' => Some(&['\u{0049}', '\u{0330}']), - '\u{1E2D}' => Some(&['\u{0069}', '\u{0330}']), - '\u{1E2E}' => Some(&['\u{0049}', '\u{0308}', '\u{0301}']), - '\u{1E2F}' => Some(&['\u{0069}', '\u{0308}', '\u{0301}']), - '\u{1E30}' => Some(&['\u{004B}', '\u{0301}']), - '\u{1E31}' => Some(&['\u{006B}', '\u{0301}']), - '\u{1E32}' => Some(&['\u{004B}', '\u{0323}']), - '\u{1E33}' => Some(&['\u{006B}', '\u{0323}']), - '\u{1E34}' => Some(&['\u{004B}', '\u{0331}']), - '\u{1E35}' => Some(&['\u{006B}', '\u{0331}']), - '\u{1E36}' => Some(&['\u{004C}', '\u{0323}']), - '\u{1E37}' => Some(&['\u{006C}', '\u{0323}']), - '\u{1E38}' => Some(&['\u{004C}', '\u{0323}', '\u{0304}']), - '\u{1E39}' => Some(&['\u{006C}', '\u{0323}', '\u{0304}']), - '\u{1E3A}' => Some(&['\u{004C}', '\u{0331}']), - '\u{1E3B}' => Some(&['\u{006C}', '\u{0331}']), - '\u{1E3C}' => Some(&['\u{004C}', '\u{032D}']), - '\u{1E3D}' => Some(&['\u{006C}', '\u{032D}']), - '\u{1E3E}' => Some(&['\u{004D}', '\u{0301}']), - '\u{1E3F}' => Some(&['\u{006D}', '\u{0301}']), - '\u{1E40}' => Some(&['\u{004D}', '\u{0307}']), - '\u{1E41}' => Some(&['\u{006D}', '\u{0307}']), - '\u{1E42}' => Some(&['\u{004D}', '\u{0323}']), - '\u{1E43}' => Some(&['\u{006D}', '\u{0323}']), - '\u{1E44}' => Some(&['\u{004E}', '\u{0307}']), - '\u{1E45}' => Some(&['\u{006E}', '\u{0307}']), - '\u{1E46}' => Some(&['\u{004E}', '\u{0323}']), - '\u{1E47}' => Some(&['\u{006E}', '\u{0323}']), - '\u{1E48}' => Some(&['\u{004E}', '\u{0331}']), - '\u{1E49}' => Some(&['\u{006E}', '\u{0331}']), - '\u{1E4A}' => Some(&['\u{004E}', '\u{032D}']), - '\u{1E4B}' => Some(&['\u{006E}', '\u{032D}']), - '\u{1E4C}' => Some(&['\u{004F}', '\u{0303}', '\u{0301}']), - '\u{1E4D}' => Some(&['\u{006F}', '\u{0303}', '\u{0301}']), - '\u{1E4E}' => Some(&['\u{004F}', '\u{0303}', '\u{0308}']), - '\u{1E4F}' => Some(&['\u{006F}', '\u{0303}', '\u{0308}']), - '\u{1E50}' => Some(&['\u{004F}', '\u{0304}', '\u{0300}']), - '\u{1E51}' => Some(&['\u{006F}', '\u{0304}', '\u{0300}']), - '\u{1E52}' => Some(&['\u{004F}', '\u{0304}', '\u{0301}']), - '\u{1E53}' => Some(&['\u{006F}', '\u{0304}', '\u{0301}']), - '\u{1E54}' => Some(&['\u{0050}', '\u{0301}']), - '\u{1E55}' => Some(&['\u{0070}', '\u{0301}']), - '\u{1E56}' => Some(&['\u{0050}', '\u{0307}']), - '\u{1E57}' => Some(&['\u{0070}', '\u{0307}']), - '\u{1E58}' => Some(&['\u{0052}', '\u{0307}']), - '\u{1E59}' => Some(&['\u{0072}', '\u{0307}']), - '\u{1E5A}' => Some(&['\u{0052}', '\u{0323}']), - '\u{1E5B}' => Some(&['\u{0072}', '\u{0323}']), - '\u{1E5C}' => Some(&['\u{0052}', '\u{0323}', '\u{0304}']), - '\u{1E5D}' => Some(&['\u{0072}', '\u{0323}', '\u{0304}']), - '\u{1E5E}' => Some(&['\u{0052}', '\u{0331}']), - '\u{1E5F}' => Some(&['\u{0072}', '\u{0331}']), - '\u{1E60}' => Some(&['\u{0053}', '\u{0307}']), - '\u{1E61}' => Some(&['\u{0073}', '\u{0307}']), - '\u{1E62}' => Some(&['\u{0053}', '\u{0323}']), - '\u{1E63}' => Some(&['\u{0073}', '\u{0323}']), - '\u{1E64}' => Some(&['\u{0053}', '\u{0301}', '\u{0307}']), - '\u{1E65}' => Some(&['\u{0073}', '\u{0301}', '\u{0307}']), - '\u{1E66}' => Some(&['\u{0053}', '\u{030C}', '\u{0307}']), - '\u{1E67}' => Some(&['\u{0073}', '\u{030C}', '\u{0307}']), - '\u{1E68}' => Some(&['\u{0053}', '\u{0323}', '\u{0307}']), - '\u{1E69}' => Some(&['\u{0073}', '\u{0323}', '\u{0307}']), - '\u{1E6A}' => Some(&['\u{0054}', '\u{0307}']), - '\u{1E6B}' => Some(&['\u{0074}', '\u{0307}']), - '\u{1E6C}' => Some(&['\u{0054}', '\u{0323}']), - '\u{1E6D}' => Some(&['\u{0074}', '\u{0323}']), - '\u{1E6E}' => Some(&['\u{0054}', '\u{0331}']), - '\u{1E6F}' => Some(&['\u{0074}', '\u{0331}']), - '\u{1E70}' => Some(&['\u{0054}', '\u{032D}']), - '\u{1E71}' => Some(&['\u{0074}', '\u{032D}']), - '\u{1E72}' => Some(&['\u{0055}', '\u{0324}']), - '\u{1E73}' => Some(&['\u{0075}', '\u{0324}']), - '\u{1E74}' => Some(&['\u{0055}', '\u{0330}']), - '\u{1E75}' => Some(&['\u{0075}', '\u{0330}']), - '\u{1E76}' => Some(&['\u{0055}', '\u{032D}']), - '\u{1E77}' => Some(&['\u{0075}', '\u{032D}']), - '\u{1E78}' => Some(&['\u{0055}', '\u{0303}', '\u{0301}']), - '\u{1E79}' => Some(&['\u{0075}', '\u{0303}', '\u{0301}']), - '\u{1E7A}' => Some(&['\u{0055}', '\u{0304}', '\u{0308}']), - '\u{1E7B}' => Some(&['\u{0075}', '\u{0304}', '\u{0308}']), - '\u{1E7C}' => Some(&['\u{0056}', '\u{0303}']), - '\u{1E7D}' => Some(&['\u{0076}', '\u{0303}']), - '\u{1E7E}' => Some(&['\u{0056}', '\u{0323}']), - '\u{1E7F}' => Some(&['\u{0076}', '\u{0323}']), - '\u{1E80}' => Some(&['\u{0057}', '\u{0300}']), - '\u{1E81}' => Some(&['\u{0077}', '\u{0300}']), - '\u{1E82}' => Some(&['\u{0057}', '\u{0301}']), - '\u{1E83}' => Some(&['\u{0077}', '\u{0301}']), - '\u{1E84}' => Some(&['\u{0057}', '\u{0308}']), - '\u{1E85}' => Some(&['\u{0077}', '\u{0308}']), - '\u{1E86}' => Some(&['\u{0057}', '\u{0307}']), - '\u{1E87}' => Some(&['\u{0077}', '\u{0307}']), - '\u{1E88}' => Some(&['\u{0057}', '\u{0323}']), - '\u{1E89}' => Some(&['\u{0077}', '\u{0323}']), - '\u{1E8A}' => Some(&['\u{0058}', '\u{0307}']), - '\u{1E8B}' => Some(&['\u{0078}', '\u{0307}']), - '\u{1E8C}' => Some(&['\u{0058}', '\u{0308}']), - '\u{1E8D}' => Some(&['\u{0078}', '\u{0308}']), - '\u{1E8E}' => Some(&['\u{0059}', '\u{0307}']), - '\u{1E8F}' => Some(&['\u{0079}', '\u{0307}']), - '\u{1E90}' => Some(&['\u{005A}', '\u{0302}']), - '\u{1E91}' => Some(&['\u{007A}', '\u{0302}']), - '\u{1E92}' => Some(&['\u{005A}', '\u{0323}']), - '\u{1E93}' => Some(&['\u{007A}', '\u{0323}']), - '\u{1E94}' => Some(&['\u{005A}', '\u{0331}']), - '\u{1E95}' => Some(&['\u{007A}', '\u{0331}']), - '\u{1E96}' => Some(&['\u{0068}', '\u{0331}']), - '\u{1E97}' => Some(&['\u{0074}', '\u{0308}']), - '\u{1E98}' => Some(&['\u{0077}', '\u{030A}']), - '\u{1E99}' => Some(&['\u{0079}', '\u{030A}']), - '\u{1E9B}' => Some(&['\u{017F}', '\u{0307}']), - '\u{1EA0}' => Some(&['\u{0041}', '\u{0323}']), - '\u{1EA1}' => Some(&['\u{0061}', '\u{0323}']), - '\u{1EA2}' => Some(&['\u{0041}', '\u{0309}']), - '\u{1EA3}' => Some(&['\u{0061}', '\u{0309}']), - '\u{1EA4}' => Some(&['\u{0041}', '\u{0302}', '\u{0301}']), - '\u{1EA5}' => Some(&['\u{0061}', '\u{0302}', '\u{0301}']), - '\u{1EA6}' => Some(&['\u{0041}', '\u{0302}', '\u{0300}']), - '\u{1EA7}' => Some(&['\u{0061}', '\u{0302}', '\u{0300}']), - '\u{1EA8}' => Some(&['\u{0041}', '\u{0302}', '\u{0309}']), - '\u{1EA9}' => Some(&['\u{0061}', '\u{0302}', '\u{0309}']), - '\u{1EAA}' => Some(&['\u{0041}', '\u{0302}', '\u{0303}']), - '\u{1EAB}' => Some(&['\u{0061}', '\u{0302}', '\u{0303}']), - '\u{1EAC}' => Some(&['\u{0041}', '\u{0323}', '\u{0302}']), - '\u{1EAD}' => Some(&['\u{0061}', '\u{0323}', '\u{0302}']), - '\u{1EAE}' => Some(&['\u{0041}', '\u{0306}', '\u{0301}']), - '\u{1EAF}' => Some(&['\u{0061}', '\u{0306}', '\u{0301}']), - '\u{1EB0}' => Some(&['\u{0041}', '\u{0306}', '\u{0300}']), - '\u{1EB1}' => Some(&['\u{0061}', '\u{0306}', '\u{0300}']), - '\u{1EB2}' => Some(&['\u{0041}', '\u{0306}', '\u{0309}']), - '\u{1EB3}' => Some(&['\u{0061}', '\u{0306}', '\u{0309}']), - '\u{1EB4}' => Some(&['\u{0041}', '\u{0306}', '\u{0303}']), - '\u{1EB5}' => Some(&['\u{0061}', '\u{0306}', '\u{0303}']), - '\u{1EB6}' => Some(&['\u{0041}', '\u{0323}', '\u{0306}']), - '\u{1EB7}' => Some(&['\u{0061}', '\u{0323}', '\u{0306}']), - '\u{1EB8}' => Some(&['\u{0045}', '\u{0323}']), - '\u{1EB9}' => Some(&['\u{0065}', '\u{0323}']), - '\u{1EBA}' => Some(&['\u{0045}', '\u{0309}']), - '\u{1EBB}' => Some(&['\u{0065}', '\u{0309}']), - '\u{1EBC}' => Some(&['\u{0045}', '\u{0303}']), - '\u{1EBD}' => Some(&['\u{0065}', '\u{0303}']), - '\u{1EBE}' => Some(&['\u{0045}', '\u{0302}', '\u{0301}']), - '\u{1EBF}' => Some(&['\u{0065}', '\u{0302}', '\u{0301}']), - '\u{1EC0}' => Some(&['\u{0045}', '\u{0302}', '\u{0300}']), - '\u{1EC1}' => Some(&['\u{0065}', '\u{0302}', '\u{0300}']), - '\u{1EC2}' => Some(&['\u{0045}', '\u{0302}', '\u{0309}']), - '\u{1EC3}' => Some(&['\u{0065}', '\u{0302}', '\u{0309}']), - '\u{1EC4}' => Some(&['\u{0045}', '\u{0302}', '\u{0303}']), - '\u{1EC5}' => Some(&['\u{0065}', '\u{0302}', '\u{0303}']), - '\u{1EC6}' => Some(&['\u{0045}', '\u{0323}', '\u{0302}']), - '\u{1EC7}' => Some(&['\u{0065}', '\u{0323}', '\u{0302}']), - '\u{1EC8}' => Some(&['\u{0049}', '\u{0309}']), - '\u{1EC9}' => Some(&['\u{0069}', '\u{0309}']), - '\u{1ECA}' => Some(&['\u{0049}', '\u{0323}']), - '\u{1ECB}' => Some(&['\u{0069}', '\u{0323}']), - '\u{1ECC}' => Some(&['\u{004F}', '\u{0323}']), - '\u{1ECD}' => Some(&['\u{006F}', '\u{0323}']), - '\u{1ECE}' => Some(&['\u{004F}', '\u{0309}']), - '\u{1ECF}' => Some(&['\u{006F}', '\u{0309}']), - '\u{1ED0}' => Some(&['\u{004F}', '\u{0302}', '\u{0301}']), - '\u{1ED1}' => Some(&['\u{006F}', '\u{0302}', '\u{0301}']), - '\u{1ED2}' => Some(&['\u{004F}', '\u{0302}', '\u{0300}']), - '\u{1ED3}' => Some(&['\u{006F}', '\u{0302}', '\u{0300}']), - '\u{1ED4}' => Some(&['\u{004F}', '\u{0302}', '\u{0309}']), - '\u{1ED5}' => Some(&['\u{006F}', '\u{0302}', '\u{0309}']), - '\u{1ED6}' => Some(&['\u{004F}', '\u{0302}', '\u{0303}']), - '\u{1ED7}' => Some(&['\u{006F}', '\u{0302}', '\u{0303}']), - '\u{1ED8}' => Some(&['\u{004F}', '\u{0323}', '\u{0302}']), - '\u{1ED9}' => Some(&['\u{006F}', '\u{0323}', '\u{0302}']), - '\u{1EDA}' => Some(&['\u{004F}', '\u{031B}', '\u{0301}']), - '\u{1EDB}' => Some(&['\u{006F}', '\u{031B}', '\u{0301}']), - '\u{1EDC}' => Some(&['\u{004F}', '\u{031B}', '\u{0300}']), - '\u{1EDD}' => Some(&['\u{006F}', '\u{031B}', '\u{0300}']), - '\u{1EDE}' => Some(&['\u{004F}', '\u{031B}', '\u{0309}']), - '\u{1EDF}' => Some(&['\u{006F}', '\u{031B}', '\u{0309}']), - '\u{1EE0}' => Some(&['\u{004F}', '\u{031B}', '\u{0303}']), - '\u{1EE1}' => Some(&['\u{006F}', '\u{031B}', '\u{0303}']), - '\u{1EE2}' => Some(&['\u{004F}', '\u{031B}', '\u{0323}']), - '\u{1EE3}' => Some(&['\u{006F}', '\u{031B}', '\u{0323}']), - '\u{1EE4}' => Some(&['\u{0055}', '\u{0323}']), - '\u{1EE5}' => Some(&['\u{0075}', '\u{0323}']), - '\u{1EE6}' => Some(&['\u{0055}', '\u{0309}']), - '\u{1EE7}' => Some(&['\u{0075}', '\u{0309}']), - '\u{1EE8}' => Some(&['\u{0055}', '\u{031B}', '\u{0301}']), - '\u{1EE9}' => Some(&['\u{0075}', '\u{031B}', '\u{0301}']), - '\u{1EEA}' => Some(&['\u{0055}', '\u{031B}', '\u{0300}']), - '\u{1EEB}' => Some(&['\u{0075}', '\u{031B}', '\u{0300}']), - '\u{1EEC}' => Some(&['\u{0055}', '\u{031B}', '\u{0309}']), - '\u{1EED}' => Some(&['\u{0075}', '\u{031B}', '\u{0309}']), - '\u{1EEE}' => Some(&['\u{0055}', '\u{031B}', '\u{0303}']), - '\u{1EEF}' => Some(&['\u{0075}', '\u{031B}', '\u{0303}']), - '\u{1EF0}' => Some(&['\u{0055}', '\u{031B}', '\u{0323}']), - '\u{1EF1}' => Some(&['\u{0075}', '\u{031B}', '\u{0323}']), - '\u{1EF2}' => Some(&['\u{0059}', '\u{0300}']), - '\u{1EF3}' => Some(&['\u{0079}', '\u{0300}']), - '\u{1EF4}' => Some(&['\u{0059}', '\u{0323}']), - '\u{1EF5}' => Some(&['\u{0079}', '\u{0323}']), - '\u{1EF6}' => Some(&['\u{0059}', '\u{0309}']), - '\u{1EF7}' => Some(&['\u{0079}', '\u{0309}']), - '\u{1EF8}' => Some(&['\u{0059}', '\u{0303}']), - '\u{1EF9}' => Some(&['\u{0079}', '\u{0303}']), - '\u{1F00}' => Some(&['\u{03B1}', '\u{0313}']), - '\u{1F01}' => Some(&['\u{03B1}', '\u{0314}']), - '\u{1F02}' => Some(&['\u{03B1}', '\u{0313}', '\u{0300}']), - '\u{1F03}' => Some(&['\u{03B1}', '\u{0314}', '\u{0300}']), - '\u{1F04}' => Some(&['\u{03B1}', '\u{0313}', '\u{0301}']), - '\u{1F05}' => Some(&['\u{03B1}', '\u{0314}', '\u{0301}']), - '\u{1F06}' => Some(&['\u{03B1}', '\u{0313}', '\u{0342}']), - '\u{1F07}' => Some(&['\u{03B1}', '\u{0314}', '\u{0342}']), - '\u{1F08}' => Some(&['\u{0391}', '\u{0313}']), - '\u{1F09}' => Some(&['\u{0391}', '\u{0314}']), - '\u{1F0A}' => Some(&['\u{0391}', '\u{0313}', '\u{0300}']), - '\u{1F0B}' => Some(&['\u{0391}', '\u{0314}', '\u{0300}']), - '\u{1F0C}' => Some(&['\u{0391}', '\u{0313}', '\u{0301}']), - '\u{1F0D}' => Some(&['\u{0391}', '\u{0314}', '\u{0301}']), - '\u{1F0E}' => Some(&['\u{0391}', '\u{0313}', '\u{0342}']), - '\u{1F0F}' => Some(&['\u{0391}', '\u{0314}', '\u{0342}']), - '\u{1F10}' => Some(&['\u{03B5}', '\u{0313}']), - '\u{1F11}' => Some(&['\u{03B5}', '\u{0314}']), - '\u{1F12}' => Some(&['\u{03B5}', '\u{0313}', '\u{0300}']), - '\u{1F13}' => Some(&['\u{03B5}', '\u{0314}', '\u{0300}']), - '\u{1F14}' => Some(&['\u{03B5}', '\u{0313}', '\u{0301}']), - '\u{1F15}' => Some(&['\u{03B5}', '\u{0314}', '\u{0301}']), - '\u{1F18}' => Some(&['\u{0395}', '\u{0313}']), - '\u{1F19}' => Some(&['\u{0395}', '\u{0314}']), - '\u{1F1A}' => Some(&['\u{0395}', '\u{0313}', '\u{0300}']), - '\u{1F1B}' => Some(&['\u{0395}', '\u{0314}', '\u{0300}']), - '\u{1F1C}' => Some(&['\u{0395}', '\u{0313}', '\u{0301}']), - '\u{1F1D}' => Some(&['\u{0395}', '\u{0314}', '\u{0301}']), - '\u{1F20}' => Some(&['\u{03B7}', '\u{0313}']), - '\u{1F21}' => Some(&['\u{03B7}', '\u{0314}']), - '\u{1F22}' => Some(&['\u{03B7}', '\u{0313}', '\u{0300}']), - '\u{1F23}' => Some(&['\u{03B7}', '\u{0314}', '\u{0300}']), - '\u{1F24}' => Some(&['\u{03B7}', '\u{0313}', '\u{0301}']), - '\u{1F25}' => Some(&['\u{03B7}', '\u{0314}', '\u{0301}']), - '\u{1F26}' => Some(&['\u{03B7}', '\u{0313}', '\u{0342}']), - '\u{1F27}' => Some(&['\u{03B7}', '\u{0314}', '\u{0342}']), - '\u{1F28}' => Some(&['\u{0397}', '\u{0313}']), - '\u{1F29}' => Some(&['\u{0397}', '\u{0314}']), - '\u{1F2A}' => Some(&['\u{0397}', '\u{0313}', '\u{0300}']), - '\u{1F2B}' => Some(&['\u{0397}', '\u{0314}', '\u{0300}']), - '\u{1F2C}' => Some(&['\u{0397}', '\u{0313}', '\u{0301}']), - '\u{1F2D}' => Some(&['\u{0397}', '\u{0314}', '\u{0301}']), - '\u{1F2E}' => Some(&['\u{0397}', '\u{0313}', '\u{0342}']), - '\u{1F2F}' => Some(&['\u{0397}', '\u{0314}', '\u{0342}']), - '\u{1F30}' => Some(&['\u{03B9}', '\u{0313}']), - '\u{1F31}' => Some(&['\u{03B9}', '\u{0314}']), - '\u{1F32}' => Some(&['\u{03B9}', '\u{0313}', '\u{0300}']), - '\u{1F33}' => Some(&['\u{03B9}', '\u{0314}', '\u{0300}']), - '\u{1F34}' => Some(&['\u{03B9}', '\u{0313}', '\u{0301}']), - '\u{1F35}' => Some(&['\u{03B9}', '\u{0314}', '\u{0301}']), - '\u{1F36}' => Some(&['\u{03B9}', '\u{0313}', '\u{0342}']), - '\u{1F37}' => Some(&['\u{03B9}', '\u{0314}', '\u{0342}']), - '\u{1F38}' => Some(&['\u{0399}', '\u{0313}']), - '\u{1F39}' => Some(&['\u{0399}', '\u{0314}']), - '\u{1F3A}' => Some(&['\u{0399}', '\u{0313}', '\u{0300}']), - '\u{1F3B}' => Some(&['\u{0399}', '\u{0314}', '\u{0300}']), - '\u{1F3C}' => Some(&['\u{0399}', '\u{0313}', '\u{0301}']), - '\u{1F3D}' => Some(&['\u{0399}', '\u{0314}', '\u{0301}']), - '\u{1F3E}' => Some(&['\u{0399}', '\u{0313}', '\u{0342}']), - '\u{1F3F}' => Some(&['\u{0399}', '\u{0314}', '\u{0342}']), - '\u{1F40}' => Some(&['\u{03BF}', '\u{0313}']), - '\u{1F41}' => Some(&['\u{03BF}', '\u{0314}']), - '\u{1F42}' => Some(&['\u{03BF}', '\u{0313}', '\u{0300}']), - '\u{1F43}' => Some(&['\u{03BF}', '\u{0314}', '\u{0300}']), - '\u{1F44}' => Some(&['\u{03BF}', '\u{0313}', '\u{0301}']), - '\u{1F45}' => Some(&['\u{03BF}', '\u{0314}', '\u{0301}']), - '\u{1F48}' => Some(&['\u{039F}', '\u{0313}']), - '\u{1F49}' => Some(&['\u{039F}', '\u{0314}']), - '\u{1F4A}' => Some(&['\u{039F}', '\u{0313}', '\u{0300}']), - '\u{1F4B}' => Some(&['\u{039F}', '\u{0314}', '\u{0300}']), - '\u{1F4C}' => Some(&['\u{039F}', '\u{0313}', '\u{0301}']), - '\u{1F4D}' => Some(&['\u{039F}', '\u{0314}', '\u{0301}']), - '\u{1F50}' => Some(&['\u{03C5}', '\u{0313}']), - '\u{1F51}' => Some(&['\u{03C5}', '\u{0314}']), - '\u{1F52}' => Some(&['\u{03C5}', '\u{0313}', '\u{0300}']), - '\u{1F53}' => Some(&['\u{03C5}', '\u{0314}', '\u{0300}']), - '\u{1F54}' => Some(&['\u{03C5}', '\u{0313}', '\u{0301}']), - '\u{1F55}' => Some(&['\u{03C5}', '\u{0314}', '\u{0301}']), - '\u{1F56}' => Some(&['\u{03C5}', '\u{0313}', '\u{0342}']), - '\u{1F57}' => Some(&['\u{03C5}', '\u{0314}', '\u{0342}']), - '\u{1F59}' => Some(&['\u{03A5}', '\u{0314}']), - '\u{1F5B}' => Some(&['\u{03A5}', '\u{0314}', '\u{0300}']), - '\u{1F5D}' => Some(&['\u{03A5}', '\u{0314}', '\u{0301}']), - '\u{1F5F}' => Some(&['\u{03A5}', '\u{0314}', '\u{0342}']), - '\u{1F60}' => Some(&['\u{03C9}', '\u{0313}']), - '\u{1F61}' => Some(&['\u{03C9}', '\u{0314}']), - '\u{1F62}' => Some(&['\u{03C9}', '\u{0313}', '\u{0300}']), - '\u{1F63}' => Some(&['\u{03C9}', '\u{0314}', '\u{0300}']), - '\u{1F64}' => Some(&['\u{03C9}', '\u{0313}', '\u{0301}']), - '\u{1F65}' => Some(&['\u{03C9}', '\u{0314}', '\u{0301}']), - '\u{1F66}' => Some(&['\u{03C9}', '\u{0313}', '\u{0342}']), - '\u{1F67}' => Some(&['\u{03C9}', '\u{0314}', '\u{0342}']), - '\u{1F68}' => Some(&['\u{03A9}', '\u{0313}']), - '\u{1F69}' => Some(&['\u{03A9}', '\u{0314}']), - '\u{1F6A}' => Some(&['\u{03A9}', '\u{0313}', '\u{0300}']), - '\u{1F6B}' => Some(&['\u{03A9}', '\u{0314}', '\u{0300}']), - '\u{1F6C}' => Some(&['\u{03A9}', '\u{0313}', '\u{0301}']), - '\u{1F6D}' => Some(&['\u{03A9}', '\u{0314}', '\u{0301}']), - '\u{1F6E}' => Some(&['\u{03A9}', '\u{0313}', '\u{0342}']), - '\u{1F6F}' => Some(&['\u{03A9}', '\u{0314}', '\u{0342}']), - '\u{1F70}' => Some(&['\u{03B1}', '\u{0300}']), - '\u{1F71}' => Some(&['\u{03B1}', '\u{0301}']), - '\u{1F72}' => Some(&['\u{03B5}', '\u{0300}']), - '\u{1F73}' => Some(&['\u{03B5}', '\u{0301}']), - '\u{1F74}' => Some(&['\u{03B7}', '\u{0300}']), - '\u{1F75}' => Some(&['\u{03B7}', '\u{0301}']), - '\u{1F76}' => Some(&['\u{03B9}', '\u{0300}']), - '\u{1F77}' => Some(&['\u{03B9}', '\u{0301}']), - '\u{1F78}' => Some(&['\u{03BF}', '\u{0300}']), - '\u{1F79}' => Some(&['\u{03BF}', '\u{0301}']), - '\u{1F7A}' => Some(&['\u{03C5}', '\u{0300}']), - '\u{1F7B}' => Some(&['\u{03C5}', '\u{0301}']), - '\u{1F7C}' => Some(&['\u{03C9}', '\u{0300}']), - '\u{1F7D}' => Some(&['\u{03C9}', '\u{0301}']), - '\u{1F80}' => Some(&['\u{03B1}', '\u{0313}', '\u{0345}']), - '\u{1F81}' => Some(&['\u{03B1}', '\u{0314}', '\u{0345}']), - '\u{1F82}' => Some(&['\u{03B1}', '\u{0313}', '\u{0300}', '\u{0345}']), - '\u{1F83}' => Some(&['\u{03B1}', '\u{0314}', '\u{0300}', '\u{0345}']), - '\u{1F84}' => Some(&['\u{03B1}', '\u{0313}', '\u{0301}', '\u{0345}']), - '\u{1F85}' => Some(&['\u{03B1}', '\u{0314}', '\u{0301}', '\u{0345}']), - '\u{1F86}' => Some(&['\u{03B1}', '\u{0313}', '\u{0342}', '\u{0345}']), - '\u{1F87}' => Some(&['\u{03B1}', '\u{0314}', '\u{0342}', '\u{0345}']), - '\u{1F88}' => Some(&['\u{0391}', '\u{0313}', '\u{0345}']), - '\u{1F89}' => Some(&['\u{0391}', '\u{0314}', '\u{0345}']), - '\u{1F8A}' => Some(&['\u{0391}', '\u{0313}', '\u{0300}', '\u{0345}']), - '\u{1F8B}' => Some(&['\u{0391}', '\u{0314}', '\u{0300}', '\u{0345}']), - '\u{1F8C}' => Some(&['\u{0391}', '\u{0313}', '\u{0301}', '\u{0345}']), - '\u{1F8D}' => Some(&['\u{0391}', '\u{0314}', '\u{0301}', '\u{0345}']), - '\u{1F8E}' => Some(&['\u{0391}', '\u{0313}', '\u{0342}', '\u{0345}']), - '\u{1F8F}' => Some(&['\u{0391}', '\u{0314}', '\u{0342}', '\u{0345}']), - '\u{1F90}' => Some(&['\u{03B7}', '\u{0313}', '\u{0345}']), - '\u{1F91}' => Some(&['\u{03B7}', '\u{0314}', '\u{0345}']), - '\u{1F92}' => Some(&['\u{03B7}', '\u{0313}', '\u{0300}', '\u{0345}']), - '\u{1F93}' => Some(&['\u{03B7}', '\u{0314}', '\u{0300}', '\u{0345}']), - '\u{1F94}' => Some(&['\u{03B7}', '\u{0313}', '\u{0301}', '\u{0345}']), - '\u{1F95}' => Some(&['\u{03B7}', '\u{0314}', '\u{0301}', '\u{0345}']), - '\u{1F96}' => Some(&['\u{03B7}', '\u{0313}', '\u{0342}', '\u{0345}']), - '\u{1F97}' => Some(&['\u{03B7}', '\u{0314}', '\u{0342}', '\u{0345}']), - '\u{1F98}' => Some(&['\u{0397}', '\u{0313}', '\u{0345}']), - '\u{1F99}' => Some(&['\u{0397}', '\u{0314}', '\u{0345}']), - '\u{1F9A}' => Some(&['\u{0397}', '\u{0313}', '\u{0300}', '\u{0345}']), - '\u{1F9B}' => Some(&['\u{0397}', '\u{0314}', '\u{0300}', '\u{0345}']), - '\u{1F9C}' => Some(&['\u{0397}', '\u{0313}', '\u{0301}', '\u{0345}']), - '\u{1F9D}' => Some(&['\u{0397}', '\u{0314}', '\u{0301}', '\u{0345}']), - '\u{1F9E}' => Some(&['\u{0397}', '\u{0313}', '\u{0342}', '\u{0345}']), - '\u{1F9F}' => Some(&['\u{0397}', '\u{0314}', '\u{0342}', '\u{0345}']), - '\u{1FA0}' => Some(&['\u{03C9}', '\u{0313}', '\u{0345}']), - '\u{1FA1}' => Some(&['\u{03C9}', '\u{0314}', '\u{0345}']), - '\u{1FA2}' => Some(&['\u{03C9}', '\u{0313}', '\u{0300}', '\u{0345}']), - '\u{1FA3}' => Some(&['\u{03C9}', '\u{0314}', '\u{0300}', '\u{0345}']), - '\u{1FA4}' => Some(&['\u{03C9}', '\u{0313}', '\u{0301}', '\u{0345}']), - '\u{1FA5}' => Some(&['\u{03C9}', '\u{0314}', '\u{0301}', '\u{0345}']), - '\u{1FA6}' => Some(&['\u{03C9}', '\u{0313}', '\u{0342}', '\u{0345}']), - '\u{1FA7}' => Some(&['\u{03C9}', '\u{0314}', '\u{0342}', '\u{0345}']), - '\u{1FA8}' => Some(&['\u{03A9}', '\u{0313}', '\u{0345}']), - '\u{1FA9}' => Some(&['\u{03A9}', '\u{0314}', '\u{0345}']), - '\u{1FAA}' => Some(&['\u{03A9}', '\u{0313}', '\u{0300}', '\u{0345}']), - '\u{1FAB}' => Some(&['\u{03A9}', '\u{0314}', '\u{0300}', '\u{0345}']), - '\u{1FAC}' => Some(&['\u{03A9}', '\u{0313}', '\u{0301}', '\u{0345}']), - '\u{1FAD}' => Some(&['\u{03A9}', '\u{0314}', '\u{0301}', '\u{0345}']), - '\u{1FAE}' => Some(&['\u{03A9}', '\u{0313}', '\u{0342}', '\u{0345}']), - '\u{1FAF}' => Some(&['\u{03A9}', '\u{0314}', '\u{0342}', '\u{0345}']), - '\u{1FB0}' => Some(&['\u{03B1}', '\u{0306}']), - '\u{1FB1}' => Some(&['\u{03B1}', '\u{0304}']), - '\u{1FB2}' => Some(&['\u{03B1}', '\u{0300}', '\u{0345}']), - '\u{1FB3}' => Some(&['\u{03B1}', '\u{0345}']), - '\u{1FB4}' => Some(&['\u{03B1}', '\u{0301}', '\u{0345}']), - '\u{1FB6}' => Some(&['\u{03B1}', '\u{0342}']), - '\u{1FB7}' => Some(&['\u{03B1}', '\u{0342}', '\u{0345}']), - '\u{1FB8}' => Some(&['\u{0391}', '\u{0306}']), - '\u{1FB9}' => Some(&['\u{0391}', '\u{0304}']), - '\u{1FBA}' => Some(&['\u{0391}', '\u{0300}']), - '\u{1FBB}' => Some(&['\u{0391}', '\u{0301}']), - '\u{1FBC}' => Some(&['\u{0391}', '\u{0345}']), - '\u{1FBE}' => Some(&['\u{03B9}']), - '\u{1FC1}' => Some(&['\u{00A8}', '\u{0342}']), - '\u{1FC2}' => Some(&['\u{03B7}', '\u{0300}', '\u{0345}']), - '\u{1FC3}' => Some(&['\u{03B7}', '\u{0345}']), - '\u{1FC4}' => Some(&['\u{03B7}', '\u{0301}', '\u{0345}']), - '\u{1FC6}' => Some(&['\u{03B7}', '\u{0342}']), - '\u{1FC7}' => Some(&['\u{03B7}', '\u{0342}', '\u{0345}']), - '\u{1FC8}' => Some(&['\u{0395}', '\u{0300}']), - '\u{1FC9}' => Some(&['\u{0395}', '\u{0301}']), - '\u{1FCA}' => Some(&['\u{0397}', '\u{0300}']), - '\u{1FCB}' => Some(&['\u{0397}', '\u{0301}']), - '\u{1FCC}' => Some(&['\u{0397}', '\u{0345}']), - '\u{1FCD}' => Some(&['\u{1FBF}', '\u{0300}']), - '\u{1FCE}' => Some(&['\u{1FBF}', '\u{0301}']), - '\u{1FCF}' => Some(&['\u{1FBF}', '\u{0342}']), - '\u{1FD0}' => Some(&['\u{03B9}', '\u{0306}']), - '\u{1FD1}' => Some(&['\u{03B9}', '\u{0304}']), - '\u{1FD2}' => Some(&['\u{03B9}', '\u{0308}', '\u{0300}']), - '\u{1FD3}' => Some(&['\u{03B9}', '\u{0308}', '\u{0301}']), - '\u{1FD6}' => Some(&['\u{03B9}', '\u{0342}']), - '\u{1FD7}' => Some(&['\u{03B9}', '\u{0308}', '\u{0342}']), - '\u{1FD8}' => Some(&['\u{0399}', '\u{0306}']), - '\u{1FD9}' => Some(&['\u{0399}', '\u{0304}']), - '\u{1FDA}' => Some(&['\u{0399}', '\u{0300}']), - '\u{1FDB}' => Some(&['\u{0399}', '\u{0301}']), - '\u{1FDD}' => Some(&['\u{1FFE}', '\u{0300}']), - '\u{1FDE}' => Some(&['\u{1FFE}', '\u{0301}']), - '\u{1FDF}' => Some(&['\u{1FFE}', '\u{0342}']), - '\u{1FE0}' => Some(&['\u{03C5}', '\u{0306}']), - '\u{1FE1}' => Some(&['\u{03C5}', '\u{0304}']), - '\u{1FE2}' => Some(&['\u{03C5}', '\u{0308}', '\u{0300}']), - '\u{1FE3}' => Some(&['\u{03C5}', '\u{0308}', '\u{0301}']), - '\u{1FE4}' => Some(&['\u{03C1}', '\u{0313}']), - '\u{1FE5}' => Some(&['\u{03C1}', '\u{0314}']), - '\u{1FE6}' => Some(&['\u{03C5}', '\u{0342}']), - '\u{1FE7}' => Some(&['\u{03C5}', '\u{0308}', '\u{0342}']), - '\u{1FE8}' => Some(&['\u{03A5}', '\u{0306}']), - '\u{1FE9}' => Some(&['\u{03A5}', '\u{0304}']), - '\u{1FEA}' => Some(&['\u{03A5}', '\u{0300}']), - '\u{1FEB}' => Some(&['\u{03A5}', '\u{0301}']), - '\u{1FEC}' => Some(&['\u{03A1}', '\u{0314}']), - '\u{1FED}' => Some(&['\u{00A8}', '\u{0300}']), - '\u{1FEE}' => Some(&['\u{00A8}', '\u{0301}']), - '\u{1FEF}' => Some(&['\u{0060}']), - '\u{1FF2}' => Some(&['\u{03C9}', '\u{0300}', '\u{0345}']), - '\u{1FF3}' => Some(&['\u{03C9}', '\u{0345}']), - '\u{1FF4}' => Some(&['\u{03C9}', '\u{0301}', '\u{0345}']), - '\u{1FF6}' => Some(&['\u{03C9}', '\u{0342}']), - '\u{1FF7}' => Some(&['\u{03C9}', '\u{0342}', '\u{0345}']), - '\u{1FF8}' => Some(&['\u{039F}', '\u{0300}']), - '\u{1FF9}' => Some(&['\u{039F}', '\u{0301}']), - '\u{1FFA}' => Some(&['\u{03A9}', '\u{0300}']), - '\u{1FFB}' => Some(&['\u{03A9}', '\u{0301}']), - '\u{1FFC}' => Some(&['\u{03A9}', '\u{0345}']), - '\u{1FFD}' => Some(&['\u{00B4}']), - '\u{2000}' => Some(&['\u{2002}']), - '\u{2001}' => Some(&['\u{2003}']), - '\u{2126}' => Some(&['\u{03A9}']), - '\u{212A}' => Some(&['\u{004B}']), - '\u{212B}' => Some(&['\u{0041}', '\u{030A}']), - '\u{219A}' => Some(&['\u{2190}', '\u{0338}']), - '\u{219B}' => Some(&['\u{2192}', '\u{0338}']), - '\u{21AE}' => Some(&['\u{2194}', '\u{0338}']), - '\u{21CD}' => Some(&['\u{21D0}', '\u{0338}']), - '\u{21CE}' => Some(&['\u{21D4}', '\u{0338}']), - '\u{21CF}' => Some(&['\u{21D2}', '\u{0338}']), - '\u{2204}' => Some(&['\u{2203}', '\u{0338}']), - '\u{2209}' => Some(&['\u{2208}', '\u{0338}']), - '\u{220C}' => Some(&['\u{220B}', '\u{0338}']), - '\u{2224}' => Some(&['\u{2223}', '\u{0338}']), - '\u{2226}' => Some(&['\u{2225}', '\u{0338}']), - '\u{2241}' => Some(&['\u{223C}', '\u{0338}']), - '\u{2244}' => Some(&['\u{2243}', '\u{0338}']), - '\u{2247}' => Some(&['\u{2245}', '\u{0338}']), - '\u{2249}' => Some(&['\u{2248}', '\u{0338}']), - '\u{2260}' => Some(&['\u{003D}', '\u{0338}']), - '\u{2262}' => Some(&['\u{2261}', '\u{0338}']), - '\u{226D}' => Some(&['\u{224D}', '\u{0338}']), - '\u{226E}' => Some(&['\u{003C}', '\u{0338}']), - '\u{226F}' => Some(&['\u{003E}', '\u{0338}']), - '\u{2270}' => Some(&['\u{2264}', '\u{0338}']), - '\u{2271}' => Some(&['\u{2265}', '\u{0338}']), - '\u{2274}' => Some(&['\u{2272}', '\u{0338}']), - '\u{2275}' => Some(&['\u{2273}', '\u{0338}']), - '\u{2278}' => Some(&['\u{2276}', '\u{0338}']), - '\u{2279}' => Some(&['\u{2277}', '\u{0338}']), - '\u{2280}' => Some(&['\u{227A}', '\u{0338}']), - '\u{2281}' => Some(&['\u{227B}', '\u{0338}']), - '\u{2284}' => Some(&['\u{2282}', '\u{0338}']), - '\u{2285}' => Some(&['\u{2283}', '\u{0338}']), - '\u{2288}' => Some(&['\u{2286}', '\u{0338}']), - '\u{2289}' => Some(&['\u{2287}', '\u{0338}']), - '\u{22AC}' => Some(&['\u{22A2}', '\u{0338}']), - '\u{22AD}' => Some(&['\u{22A8}', '\u{0338}']), - '\u{22AE}' => Some(&['\u{22A9}', '\u{0338}']), - '\u{22AF}' => Some(&['\u{22AB}', '\u{0338}']), - '\u{22E0}' => Some(&['\u{227C}', '\u{0338}']), - '\u{22E1}' => Some(&['\u{227D}', '\u{0338}']), - '\u{22E2}' => Some(&['\u{2291}', '\u{0338}']), - '\u{22E3}' => Some(&['\u{2292}', '\u{0338}']), - '\u{22EA}' => Some(&['\u{22B2}', '\u{0338}']), - '\u{22EB}' => Some(&['\u{22B3}', '\u{0338}']), - '\u{22EC}' => Some(&['\u{22B4}', '\u{0338}']), - '\u{22ED}' => Some(&['\u{22B5}', '\u{0338}']), - '\u{2329}' => Some(&['\u{3008}']), - '\u{232A}' => Some(&['\u{3009}']), - '\u{2ADC}' => Some(&['\u{2ADD}', '\u{0338}']), - '\u{304C}' => Some(&['\u{304B}', '\u{3099}']), - '\u{304E}' => Some(&['\u{304D}', '\u{3099}']), - '\u{3050}' => Some(&['\u{304F}', '\u{3099}']), - '\u{3052}' => Some(&['\u{3051}', '\u{3099}']), - '\u{3054}' => Some(&['\u{3053}', '\u{3099}']), - '\u{3056}' => Some(&['\u{3055}', '\u{3099}']), - '\u{3058}' => Some(&['\u{3057}', '\u{3099}']), - '\u{305A}' => Some(&['\u{3059}', '\u{3099}']), - '\u{305C}' => Some(&['\u{305B}', '\u{3099}']), - '\u{305E}' => Some(&['\u{305D}', '\u{3099}']), - '\u{3060}' => Some(&['\u{305F}', '\u{3099}']), - '\u{3062}' => Some(&['\u{3061}', '\u{3099}']), - '\u{3065}' => Some(&['\u{3064}', '\u{3099}']), - '\u{3067}' => Some(&['\u{3066}', '\u{3099}']), - '\u{3069}' => Some(&['\u{3068}', '\u{3099}']), - '\u{3070}' => Some(&['\u{306F}', '\u{3099}']), - '\u{3071}' => Some(&['\u{306F}', '\u{309A}']), - '\u{3073}' => Some(&['\u{3072}', '\u{3099}']), - '\u{3074}' => Some(&['\u{3072}', '\u{309A}']), - '\u{3076}' => Some(&['\u{3075}', '\u{3099}']), - '\u{3077}' => Some(&['\u{3075}', '\u{309A}']), - '\u{3079}' => Some(&['\u{3078}', '\u{3099}']), - '\u{307A}' => Some(&['\u{3078}', '\u{309A}']), - '\u{307C}' => Some(&['\u{307B}', '\u{3099}']), - '\u{307D}' => Some(&['\u{307B}', '\u{309A}']), - '\u{3094}' => Some(&['\u{3046}', '\u{3099}']), - '\u{309E}' => Some(&['\u{309D}', '\u{3099}']), - '\u{30AC}' => Some(&['\u{30AB}', '\u{3099}']), - '\u{30AE}' => Some(&['\u{30AD}', '\u{3099}']), - '\u{30B0}' => Some(&['\u{30AF}', '\u{3099}']), - '\u{30B2}' => Some(&['\u{30B1}', '\u{3099}']), - '\u{30B4}' => Some(&['\u{30B3}', '\u{3099}']), - '\u{30B6}' => Some(&['\u{30B5}', '\u{3099}']), - '\u{30B8}' => Some(&['\u{30B7}', '\u{3099}']), - '\u{30BA}' => Some(&['\u{30B9}', '\u{3099}']), - '\u{30BC}' => Some(&['\u{30BB}', '\u{3099}']), - '\u{30BE}' => Some(&['\u{30BD}', '\u{3099}']), - '\u{30C0}' => Some(&['\u{30BF}', '\u{3099}']), - '\u{30C2}' => Some(&['\u{30C1}', '\u{3099}']), - '\u{30C5}' => Some(&['\u{30C4}', '\u{3099}']), - '\u{30C7}' => Some(&['\u{30C6}', '\u{3099}']), - '\u{30C9}' => Some(&['\u{30C8}', '\u{3099}']), - '\u{30D0}' => Some(&['\u{30CF}', '\u{3099}']), - '\u{30D1}' => Some(&['\u{30CF}', '\u{309A}']), - '\u{30D3}' => Some(&['\u{30D2}', '\u{3099}']), - '\u{30D4}' => Some(&['\u{30D2}', '\u{309A}']), - '\u{30D6}' => Some(&['\u{30D5}', '\u{3099}']), - '\u{30D7}' => Some(&['\u{30D5}', '\u{309A}']), - '\u{30D9}' => Some(&['\u{30D8}', '\u{3099}']), - '\u{30DA}' => Some(&['\u{30D8}', '\u{309A}']), - '\u{30DC}' => Some(&['\u{30DB}', '\u{3099}']), - '\u{30DD}' => Some(&['\u{30DB}', '\u{309A}']), - '\u{30F4}' => Some(&['\u{30A6}', '\u{3099}']), - '\u{30F7}' => Some(&['\u{30EF}', '\u{3099}']), - '\u{30F8}' => Some(&['\u{30F0}', '\u{3099}']), - '\u{30F9}' => Some(&['\u{30F1}', '\u{3099}']), - '\u{30FA}' => Some(&['\u{30F2}', '\u{3099}']), - '\u{30FE}' => Some(&['\u{30FD}', '\u{3099}']), - '\u{F900}' => Some(&['\u{8C48}']), - '\u{F901}' => Some(&['\u{66F4}']), - '\u{F902}' => Some(&['\u{8ECA}']), - '\u{F903}' => Some(&['\u{8CC8}']), - '\u{F904}' => Some(&['\u{6ED1}']), - '\u{F905}' => Some(&['\u{4E32}']), - '\u{F906}' => Some(&['\u{53E5}']), - '\u{F907}' => Some(&['\u{9F9C}']), - '\u{F908}' => Some(&['\u{9F9C}']), - '\u{F909}' => Some(&['\u{5951}']), - '\u{F90A}' => Some(&['\u{91D1}']), - '\u{F90B}' => Some(&['\u{5587}']), - '\u{F90C}' => Some(&['\u{5948}']), - '\u{F90D}' => Some(&['\u{61F6}']), - '\u{F90E}' => Some(&['\u{7669}']), - '\u{F90F}' => Some(&['\u{7F85}']), - '\u{F910}' => Some(&['\u{863F}']), - '\u{F911}' => Some(&['\u{87BA}']), - '\u{F912}' => Some(&['\u{88F8}']), - '\u{F913}' => Some(&['\u{908F}']), - '\u{F914}' => Some(&['\u{6A02}']), - '\u{F915}' => Some(&['\u{6D1B}']), - '\u{F916}' => Some(&['\u{70D9}']), - '\u{F917}' => Some(&['\u{73DE}']), - '\u{F918}' => Some(&['\u{843D}']), - '\u{F919}' => Some(&['\u{916A}']), - '\u{F91A}' => Some(&['\u{99F1}']), - '\u{F91B}' => Some(&['\u{4E82}']), - '\u{F91C}' => Some(&['\u{5375}']), - '\u{F91D}' => Some(&['\u{6B04}']), - '\u{F91E}' => Some(&['\u{721B}']), - '\u{F91F}' => Some(&['\u{862D}']), - '\u{F920}' => Some(&['\u{9E1E}']), - '\u{F921}' => Some(&['\u{5D50}']), - '\u{F922}' => Some(&['\u{6FEB}']), - '\u{F923}' => Some(&['\u{85CD}']), - '\u{F924}' => Some(&['\u{8964}']), - '\u{F925}' => Some(&['\u{62C9}']), - '\u{F926}' => Some(&['\u{81D8}']), - '\u{F927}' => Some(&['\u{881F}']), - '\u{F928}' => Some(&['\u{5ECA}']), - '\u{F929}' => Some(&['\u{6717}']), - '\u{F92A}' => Some(&['\u{6D6A}']), - '\u{F92B}' => Some(&['\u{72FC}']), - '\u{F92C}' => Some(&['\u{90CE}']), - '\u{F92D}' => Some(&['\u{4F86}']), - '\u{F92E}' => Some(&['\u{51B7}']), - '\u{F92F}' => Some(&['\u{52DE}']), - '\u{F930}' => Some(&['\u{64C4}']), - '\u{F931}' => Some(&['\u{6AD3}']), - '\u{F932}' => Some(&['\u{7210}']), - '\u{F933}' => Some(&['\u{76E7}']), - '\u{F934}' => Some(&['\u{8001}']), - '\u{F935}' => Some(&['\u{8606}']), - '\u{F936}' => Some(&['\u{865C}']), - '\u{F937}' => Some(&['\u{8DEF}']), - '\u{F938}' => Some(&['\u{9732}']), - '\u{F939}' => Some(&['\u{9B6F}']), - '\u{F93A}' => Some(&['\u{9DFA}']), - '\u{F93B}' => Some(&['\u{788C}']), - '\u{F93C}' => Some(&['\u{797F}']), - '\u{F93D}' => Some(&['\u{7DA0}']), - '\u{F93E}' => Some(&['\u{83C9}']), - '\u{F93F}' => Some(&['\u{9304}']), - '\u{F940}' => Some(&['\u{9E7F}']), - '\u{F941}' => Some(&['\u{8AD6}']), - '\u{F942}' => Some(&['\u{58DF}']), - '\u{F943}' => Some(&['\u{5F04}']), - '\u{F944}' => Some(&['\u{7C60}']), - '\u{F945}' => Some(&['\u{807E}']), - '\u{F946}' => Some(&['\u{7262}']), - '\u{F947}' => Some(&['\u{78CA}']), - '\u{F948}' => Some(&['\u{8CC2}']), - '\u{F949}' => Some(&['\u{96F7}']), - '\u{F94A}' => Some(&['\u{58D8}']), - '\u{F94B}' => Some(&['\u{5C62}']), - '\u{F94C}' => Some(&['\u{6A13}']), - '\u{F94D}' => Some(&['\u{6DDA}']), - '\u{F94E}' => Some(&['\u{6F0F}']), - '\u{F94F}' => Some(&['\u{7D2F}']), - '\u{F950}' => Some(&['\u{7E37}']), - '\u{F951}' => Some(&['\u{964B}']), - '\u{F952}' => Some(&['\u{52D2}']), - '\u{F953}' => Some(&['\u{808B}']), - '\u{F954}' => Some(&['\u{51DC}']), - '\u{F955}' => Some(&['\u{51CC}']), - '\u{F956}' => Some(&['\u{7A1C}']), - '\u{F957}' => Some(&['\u{7DBE}']), - '\u{F958}' => Some(&['\u{83F1}']), - '\u{F959}' => Some(&['\u{9675}']), - '\u{F95A}' => Some(&['\u{8B80}']), - '\u{F95B}' => Some(&['\u{62CF}']), - '\u{F95C}' => Some(&['\u{6A02}']), - '\u{F95D}' => Some(&['\u{8AFE}']), - '\u{F95E}' => Some(&['\u{4E39}']), - '\u{F95F}' => Some(&['\u{5BE7}']), - '\u{F960}' => Some(&['\u{6012}']), - '\u{F961}' => Some(&['\u{7387}']), - '\u{F962}' => Some(&['\u{7570}']), - '\u{F963}' => Some(&['\u{5317}']), - '\u{F964}' => Some(&['\u{78FB}']), - '\u{F965}' => Some(&['\u{4FBF}']), - '\u{F966}' => Some(&['\u{5FA9}']), - '\u{F967}' => Some(&['\u{4E0D}']), - '\u{F968}' => Some(&['\u{6CCC}']), - '\u{F969}' => Some(&['\u{6578}']), - '\u{F96A}' => Some(&['\u{7D22}']), - '\u{F96B}' => Some(&['\u{53C3}']), - '\u{F96C}' => Some(&['\u{585E}']), - '\u{F96D}' => Some(&['\u{7701}']), - '\u{F96E}' => Some(&['\u{8449}']), - '\u{F96F}' => Some(&['\u{8AAA}']), - '\u{F970}' => Some(&['\u{6BBA}']), - '\u{F971}' => Some(&['\u{8FB0}']), - '\u{F972}' => Some(&['\u{6C88}']), - '\u{F973}' => Some(&['\u{62FE}']), - '\u{F974}' => Some(&['\u{82E5}']), - '\u{F975}' => Some(&['\u{63A0}']), - '\u{F976}' => Some(&['\u{7565}']), - '\u{F977}' => Some(&['\u{4EAE}']), - '\u{F978}' => Some(&['\u{5169}']), - '\u{F979}' => Some(&['\u{51C9}']), - '\u{F97A}' => Some(&['\u{6881}']), - '\u{F97B}' => Some(&['\u{7CE7}']), - '\u{F97C}' => Some(&['\u{826F}']), - '\u{F97D}' => Some(&['\u{8AD2}']), - '\u{F97E}' => Some(&['\u{91CF}']), - '\u{F97F}' => Some(&['\u{52F5}']), - '\u{F980}' => Some(&['\u{5442}']), - '\u{F981}' => Some(&['\u{5973}']), - '\u{F982}' => Some(&['\u{5EEC}']), - '\u{F983}' => Some(&['\u{65C5}']), - '\u{F984}' => Some(&['\u{6FFE}']), - '\u{F985}' => Some(&['\u{792A}']), - '\u{F986}' => Some(&['\u{95AD}']), - '\u{F987}' => Some(&['\u{9A6A}']), - '\u{F988}' => Some(&['\u{9E97}']), - '\u{F989}' => Some(&['\u{9ECE}']), - '\u{F98A}' => Some(&['\u{529B}']), - '\u{F98B}' => Some(&['\u{66C6}']), - '\u{F98C}' => Some(&['\u{6B77}']), - '\u{F98D}' => Some(&['\u{8F62}']), - '\u{F98E}' => Some(&['\u{5E74}']), - '\u{F98F}' => Some(&['\u{6190}']), - '\u{F990}' => Some(&['\u{6200}']), - '\u{F991}' => Some(&['\u{649A}']), - '\u{F992}' => Some(&['\u{6F23}']), - '\u{F993}' => Some(&['\u{7149}']), - '\u{F994}' => Some(&['\u{7489}']), - '\u{F995}' => Some(&['\u{79CA}']), - '\u{F996}' => Some(&['\u{7DF4}']), - '\u{F997}' => Some(&['\u{806F}']), - '\u{F998}' => Some(&['\u{8F26}']), - '\u{F999}' => Some(&['\u{84EE}']), - '\u{F99A}' => Some(&['\u{9023}']), - '\u{F99B}' => Some(&['\u{934A}']), - '\u{F99C}' => Some(&['\u{5217}']), - '\u{F99D}' => Some(&['\u{52A3}']), - '\u{F99E}' => Some(&['\u{54BD}']), - '\u{F99F}' => Some(&['\u{70C8}']), - '\u{F9A0}' => Some(&['\u{88C2}']), - '\u{F9A1}' => Some(&['\u{8AAA}']), - '\u{F9A2}' => Some(&['\u{5EC9}']), - '\u{F9A3}' => Some(&['\u{5FF5}']), - '\u{F9A4}' => Some(&['\u{637B}']), - '\u{F9A5}' => Some(&['\u{6BAE}']), - '\u{F9A6}' => Some(&['\u{7C3E}']), - '\u{F9A7}' => Some(&['\u{7375}']), - '\u{F9A8}' => Some(&['\u{4EE4}']), - '\u{F9A9}' => Some(&['\u{56F9}']), - '\u{F9AA}' => Some(&['\u{5BE7}']), - '\u{F9AB}' => Some(&['\u{5DBA}']), - '\u{F9AC}' => Some(&['\u{601C}']), - '\u{F9AD}' => Some(&['\u{73B2}']), - '\u{F9AE}' => Some(&['\u{7469}']), - '\u{F9AF}' => Some(&['\u{7F9A}']), - '\u{F9B0}' => Some(&['\u{8046}']), - '\u{F9B1}' => Some(&['\u{9234}']), - '\u{F9B2}' => Some(&['\u{96F6}']), - '\u{F9B3}' => Some(&['\u{9748}']), - '\u{F9B4}' => Some(&['\u{9818}']), - '\u{F9B5}' => Some(&['\u{4F8B}']), - '\u{F9B6}' => Some(&['\u{79AE}']), - '\u{F9B7}' => Some(&['\u{91B4}']), - '\u{F9B8}' => Some(&['\u{96B8}']), - '\u{F9B9}' => Some(&['\u{60E1}']), - '\u{F9BA}' => Some(&['\u{4E86}']), - '\u{F9BB}' => Some(&['\u{50DA}']), - '\u{F9BC}' => Some(&['\u{5BEE}']), - '\u{F9BD}' => Some(&['\u{5C3F}']), - '\u{F9BE}' => Some(&['\u{6599}']), - '\u{F9BF}' => Some(&['\u{6A02}']), - '\u{F9C0}' => Some(&['\u{71CE}']), - '\u{F9C1}' => Some(&['\u{7642}']), - '\u{F9C2}' => Some(&['\u{84FC}']), - '\u{F9C3}' => Some(&['\u{907C}']), - '\u{F9C4}' => Some(&['\u{9F8D}']), - '\u{F9C5}' => Some(&['\u{6688}']), - '\u{F9C6}' => Some(&['\u{962E}']), - '\u{F9C7}' => Some(&['\u{5289}']), - '\u{F9C8}' => Some(&['\u{677B}']), - '\u{F9C9}' => Some(&['\u{67F3}']), - '\u{F9CA}' => Some(&['\u{6D41}']), - '\u{F9CB}' => Some(&['\u{6E9C}']), - '\u{F9CC}' => Some(&['\u{7409}']), - '\u{F9CD}' => Some(&['\u{7559}']), - '\u{F9CE}' => Some(&['\u{786B}']), - '\u{F9CF}' => Some(&['\u{7D10}']), - '\u{F9D0}' => Some(&['\u{985E}']), - '\u{F9D1}' => Some(&['\u{516D}']), - '\u{F9D2}' => Some(&['\u{622E}']), - '\u{F9D3}' => Some(&['\u{9678}']), - '\u{F9D4}' => Some(&['\u{502B}']), - '\u{F9D5}' => Some(&['\u{5D19}']), - '\u{F9D6}' => Some(&['\u{6DEA}']), - '\u{F9D7}' => Some(&['\u{8F2A}']), - '\u{F9D8}' => Some(&['\u{5F8B}']), - '\u{F9D9}' => Some(&['\u{6144}']), - '\u{F9DA}' => Some(&['\u{6817}']), - '\u{F9DB}' => Some(&['\u{7387}']), - '\u{F9DC}' => Some(&['\u{9686}']), - '\u{F9DD}' => Some(&['\u{5229}']), - '\u{F9DE}' => Some(&['\u{540F}']), - '\u{F9DF}' => Some(&['\u{5C65}']), - '\u{F9E0}' => Some(&['\u{6613}']), - '\u{F9E1}' => Some(&['\u{674E}']), - '\u{F9E2}' => Some(&['\u{68A8}']), - '\u{F9E3}' => Some(&['\u{6CE5}']), - '\u{F9E4}' => Some(&['\u{7406}']), - '\u{F9E5}' => Some(&['\u{75E2}']), - '\u{F9E6}' => Some(&['\u{7F79}']), - '\u{F9E7}' => Some(&['\u{88CF}']), - '\u{F9E8}' => Some(&['\u{88E1}']), - '\u{F9E9}' => Some(&['\u{91CC}']), - '\u{F9EA}' => Some(&['\u{96E2}']), - '\u{F9EB}' => Some(&['\u{533F}']), - '\u{F9EC}' => Some(&['\u{6EBA}']), - '\u{F9ED}' => Some(&['\u{541D}']), - '\u{F9EE}' => Some(&['\u{71D0}']), - '\u{F9EF}' => Some(&['\u{7498}']), - '\u{F9F0}' => Some(&['\u{85FA}']), - '\u{F9F1}' => Some(&['\u{96A3}']), - '\u{F9F2}' => Some(&['\u{9C57}']), - '\u{F9F3}' => Some(&['\u{9E9F}']), - '\u{F9F4}' => Some(&['\u{6797}']), - '\u{F9F5}' => Some(&['\u{6DCB}']), - '\u{F9F6}' => Some(&['\u{81E8}']), - '\u{F9F7}' => Some(&['\u{7ACB}']), - '\u{F9F8}' => Some(&['\u{7B20}']), - '\u{F9F9}' => Some(&['\u{7C92}']), - '\u{F9FA}' => Some(&['\u{72C0}']), - '\u{F9FB}' => Some(&['\u{7099}']), - '\u{F9FC}' => Some(&['\u{8B58}']), - '\u{F9FD}' => Some(&['\u{4EC0}']), - '\u{F9FE}' => Some(&['\u{8336}']), - '\u{F9FF}' => Some(&['\u{523A}']), - '\u{FA00}' => Some(&['\u{5207}']), - '\u{FA01}' => Some(&['\u{5EA6}']), - '\u{FA02}' => Some(&['\u{62D3}']), - '\u{FA03}' => Some(&['\u{7CD6}']), - '\u{FA04}' => Some(&['\u{5B85}']), - '\u{FA05}' => Some(&['\u{6D1E}']), - '\u{FA06}' => Some(&['\u{66B4}']), - '\u{FA07}' => Some(&['\u{8F3B}']), - '\u{FA08}' => Some(&['\u{884C}']), - '\u{FA09}' => Some(&['\u{964D}']), - '\u{FA0A}' => Some(&['\u{898B}']), - '\u{FA0B}' => Some(&['\u{5ED3}']), - '\u{FA0C}' => Some(&['\u{5140}']), - '\u{FA0D}' => Some(&['\u{55C0}']), - '\u{FA10}' => Some(&['\u{585A}']), - '\u{FA12}' => Some(&['\u{6674}']), - '\u{FA15}' => Some(&['\u{51DE}']), - '\u{FA16}' => Some(&['\u{732A}']), - '\u{FA17}' => Some(&['\u{76CA}']), - '\u{FA18}' => Some(&['\u{793C}']), - '\u{FA19}' => Some(&['\u{795E}']), - '\u{FA1A}' => Some(&['\u{7965}']), - '\u{FA1B}' => Some(&['\u{798F}']), - '\u{FA1C}' => Some(&['\u{9756}']), - '\u{FA1D}' => Some(&['\u{7CBE}']), - '\u{FA1E}' => Some(&['\u{7FBD}']), - '\u{FA20}' => Some(&['\u{8612}']), - '\u{FA22}' => Some(&['\u{8AF8}']), - '\u{FA25}' => Some(&['\u{9038}']), - '\u{FA26}' => Some(&['\u{90FD}']), - '\u{FA2A}' => Some(&['\u{98EF}']), - '\u{FA2B}' => Some(&['\u{98FC}']), - '\u{FA2C}' => Some(&['\u{9928}']), - '\u{FA2D}' => Some(&['\u{9DB4}']), - '\u{FA2E}' => Some(&['\u{90DE}']), - '\u{FA2F}' => Some(&['\u{96B7}']), - '\u{FA30}' => Some(&['\u{4FAE}']), - '\u{FA31}' => Some(&['\u{50E7}']), - '\u{FA32}' => Some(&['\u{514D}']), - '\u{FA33}' => Some(&['\u{52C9}']), - '\u{FA34}' => Some(&['\u{52E4}']), - '\u{FA35}' => Some(&['\u{5351}']), - '\u{FA36}' => Some(&['\u{559D}']), - '\u{FA37}' => Some(&['\u{5606}']), - '\u{FA38}' => Some(&['\u{5668}']), - '\u{FA39}' => Some(&['\u{5840}']), - '\u{FA3A}' => Some(&['\u{58A8}']), - '\u{FA3B}' => Some(&['\u{5C64}']), - '\u{FA3C}' => Some(&['\u{5C6E}']), - '\u{FA3D}' => Some(&['\u{6094}']), - '\u{FA3E}' => Some(&['\u{6168}']), - '\u{FA3F}' => Some(&['\u{618E}']), - '\u{FA40}' => Some(&['\u{61F2}']), - '\u{FA41}' => Some(&['\u{654F}']), - '\u{FA42}' => Some(&['\u{65E2}']), - '\u{FA43}' => Some(&['\u{6691}']), - '\u{FA44}' => Some(&['\u{6885}']), - '\u{FA45}' => Some(&['\u{6D77}']), - '\u{FA46}' => Some(&['\u{6E1A}']), - '\u{FA47}' => Some(&['\u{6F22}']), - '\u{FA48}' => Some(&['\u{716E}']), - '\u{FA49}' => Some(&['\u{722B}']), - '\u{FA4A}' => Some(&['\u{7422}']), - '\u{FA4B}' => Some(&['\u{7891}']), - '\u{FA4C}' => Some(&['\u{793E}']), - '\u{FA4D}' => Some(&['\u{7949}']), - '\u{FA4E}' => Some(&['\u{7948}']), - '\u{FA4F}' => Some(&['\u{7950}']), - '\u{FA50}' => Some(&['\u{7956}']), - '\u{FA51}' => Some(&['\u{795D}']), - '\u{FA52}' => Some(&['\u{798D}']), - '\u{FA53}' => Some(&['\u{798E}']), - '\u{FA54}' => Some(&['\u{7A40}']), - '\u{FA55}' => Some(&['\u{7A81}']), - '\u{FA56}' => Some(&['\u{7BC0}']), - '\u{FA57}' => Some(&['\u{7DF4}']), - '\u{FA58}' => Some(&['\u{7E09}']), - '\u{FA59}' => Some(&['\u{7E41}']), - '\u{FA5A}' => Some(&['\u{7F72}']), - '\u{FA5B}' => Some(&['\u{8005}']), - '\u{FA5C}' => Some(&['\u{81ED}']), - '\u{FA5D}' => Some(&['\u{8279}']), - '\u{FA5E}' => Some(&['\u{8279}']), - '\u{FA5F}' => Some(&['\u{8457}']), - '\u{FA60}' => Some(&['\u{8910}']), - '\u{FA61}' => Some(&['\u{8996}']), - '\u{FA62}' => Some(&['\u{8B01}']), - '\u{FA63}' => Some(&['\u{8B39}']), - '\u{FA64}' => Some(&['\u{8CD3}']), - '\u{FA65}' => Some(&['\u{8D08}']), - '\u{FA66}' => Some(&['\u{8FB6}']), - '\u{FA67}' => Some(&['\u{9038}']), - '\u{FA68}' => Some(&['\u{96E3}']), - '\u{FA69}' => Some(&['\u{97FF}']), - '\u{FA6A}' => Some(&['\u{983B}']), - '\u{FA6B}' => Some(&['\u{6075}']), - '\u{FA6C}' => Some(&['\u{242EE}']), - '\u{FA6D}' => Some(&['\u{8218}']), - '\u{FA70}' => Some(&['\u{4E26}']), - '\u{FA71}' => Some(&['\u{51B5}']), - '\u{FA72}' => Some(&['\u{5168}']), - '\u{FA73}' => Some(&['\u{4F80}']), - '\u{FA74}' => Some(&['\u{5145}']), - '\u{FA75}' => Some(&['\u{5180}']), - '\u{FA76}' => Some(&['\u{52C7}']), - '\u{FA77}' => Some(&['\u{52FA}']), - '\u{FA78}' => Some(&['\u{559D}']), - '\u{FA79}' => Some(&['\u{5555}']), - '\u{FA7A}' => Some(&['\u{5599}']), - '\u{FA7B}' => Some(&['\u{55E2}']), - '\u{FA7C}' => Some(&['\u{585A}']), - '\u{FA7D}' => Some(&['\u{58B3}']), - '\u{FA7E}' => Some(&['\u{5944}']), - '\u{FA7F}' => Some(&['\u{5954}']), - '\u{FA80}' => Some(&['\u{5A62}']), - '\u{FA81}' => Some(&['\u{5B28}']), - '\u{FA82}' => Some(&['\u{5ED2}']), - '\u{FA83}' => Some(&['\u{5ED9}']), - '\u{FA84}' => Some(&['\u{5F69}']), - '\u{FA85}' => Some(&['\u{5FAD}']), - '\u{FA86}' => Some(&['\u{60D8}']), - '\u{FA87}' => Some(&['\u{614E}']), - '\u{FA88}' => Some(&['\u{6108}']), - '\u{FA89}' => Some(&['\u{618E}']), - '\u{FA8A}' => Some(&['\u{6160}']), - '\u{FA8B}' => Some(&['\u{61F2}']), - '\u{FA8C}' => Some(&['\u{6234}']), - '\u{FA8D}' => Some(&['\u{63C4}']), - '\u{FA8E}' => Some(&['\u{641C}']), - '\u{FA8F}' => Some(&['\u{6452}']), - '\u{FA90}' => Some(&['\u{6556}']), - '\u{FA91}' => Some(&['\u{6674}']), - '\u{FA92}' => Some(&['\u{6717}']), - '\u{FA93}' => Some(&['\u{671B}']), - '\u{FA94}' => Some(&['\u{6756}']), - '\u{FA95}' => Some(&['\u{6B79}']), - '\u{FA96}' => Some(&['\u{6BBA}']), - '\u{FA97}' => Some(&['\u{6D41}']), - '\u{FA98}' => Some(&['\u{6EDB}']), - '\u{FA99}' => Some(&['\u{6ECB}']), - '\u{FA9A}' => Some(&['\u{6F22}']), - '\u{FA9B}' => Some(&['\u{701E}']), - '\u{FA9C}' => Some(&['\u{716E}']), - '\u{FA9D}' => Some(&['\u{77A7}']), - '\u{FA9E}' => Some(&['\u{7235}']), - '\u{FA9F}' => Some(&['\u{72AF}']), - '\u{FAA0}' => Some(&['\u{732A}']), - '\u{FAA1}' => Some(&['\u{7471}']), - '\u{FAA2}' => Some(&['\u{7506}']), - '\u{FAA3}' => Some(&['\u{753B}']), - '\u{FAA4}' => Some(&['\u{761D}']), - '\u{FAA5}' => Some(&['\u{761F}']), - '\u{FAA6}' => Some(&['\u{76CA}']), - '\u{FAA7}' => Some(&['\u{76DB}']), - '\u{FAA8}' => Some(&['\u{76F4}']), - '\u{FAA9}' => Some(&['\u{774A}']), - '\u{FAAA}' => Some(&['\u{7740}']), - '\u{FAAB}' => Some(&['\u{78CC}']), - '\u{FAAC}' => Some(&['\u{7AB1}']), - '\u{FAAD}' => Some(&['\u{7BC0}']), - '\u{FAAE}' => Some(&['\u{7C7B}']), - '\u{FAAF}' => Some(&['\u{7D5B}']), - '\u{FAB0}' => Some(&['\u{7DF4}']), - '\u{FAB1}' => Some(&['\u{7F3E}']), - '\u{FAB2}' => Some(&['\u{8005}']), - '\u{FAB3}' => Some(&['\u{8352}']), - '\u{FAB4}' => Some(&['\u{83EF}']), - '\u{FAB5}' => Some(&['\u{8779}']), - '\u{FAB6}' => Some(&['\u{8941}']), - '\u{FAB7}' => Some(&['\u{8986}']), - '\u{FAB8}' => Some(&['\u{8996}']), - '\u{FAB9}' => Some(&['\u{8ABF}']), - '\u{FABA}' => Some(&['\u{8AF8}']), - '\u{FABB}' => Some(&['\u{8ACB}']), - '\u{FABC}' => Some(&['\u{8B01}']), - '\u{FABD}' => Some(&['\u{8AFE}']), - '\u{FABE}' => Some(&['\u{8AED}']), - '\u{FABF}' => Some(&['\u{8B39}']), - '\u{FAC0}' => Some(&['\u{8B8A}']), - '\u{FAC1}' => Some(&['\u{8D08}']), - '\u{FAC2}' => Some(&['\u{8F38}']), - '\u{FAC3}' => Some(&['\u{9072}']), - '\u{FAC4}' => Some(&['\u{9199}']), - '\u{FAC5}' => Some(&['\u{9276}']), - '\u{FAC6}' => Some(&['\u{967C}']), - '\u{FAC7}' => Some(&['\u{96E3}']), - '\u{FAC8}' => Some(&['\u{9756}']), - '\u{FAC9}' => Some(&['\u{97DB}']), - '\u{FACA}' => Some(&['\u{97FF}']), - '\u{FACB}' => Some(&['\u{980B}']), - '\u{FACC}' => Some(&['\u{983B}']), - '\u{FACD}' => Some(&['\u{9B12}']), - '\u{FACE}' => Some(&['\u{9F9C}']), - '\u{FACF}' => Some(&['\u{2284A}']), - '\u{FAD0}' => Some(&['\u{22844}']), - '\u{FAD1}' => Some(&['\u{233D5}']), - '\u{FAD2}' => Some(&['\u{3B9D}']), - '\u{FAD3}' => Some(&['\u{4018}']), - '\u{FAD4}' => Some(&['\u{4039}']), - '\u{FAD5}' => Some(&['\u{25249}']), - '\u{FAD6}' => Some(&['\u{25CD0}']), - '\u{FAD7}' => Some(&['\u{27ED3}']), - '\u{FAD8}' => Some(&['\u{9F43}']), - '\u{FAD9}' => Some(&['\u{9F8E}']), - '\u{FB1D}' => Some(&['\u{05D9}', '\u{05B4}']), - '\u{FB1F}' => Some(&['\u{05F2}', '\u{05B7}']), - '\u{FB2A}' => Some(&['\u{05E9}', '\u{05C1}']), - '\u{FB2B}' => Some(&['\u{05E9}', '\u{05C2}']), - '\u{FB2C}' => Some(&['\u{05E9}', '\u{05BC}', '\u{05C1}']), - '\u{FB2D}' => Some(&['\u{05E9}', '\u{05BC}', '\u{05C2}']), - '\u{FB2E}' => Some(&['\u{05D0}', '\u{05B7}']), - '\u{FB2F}' => Some(&['\u{05D0}', '\u{05B8}']), - '\u{FB30}' => Some(&['\u{05D0}', '\u{05BC}']), - '\u{FB31}' => Some(&['\u{05D1}', '\u{05BC}']), - '\u{FB32}' => Some(&['\u{05D2}', '\u{05BC}']), - '\u{FB33}' => Some(&['\u{05D3}', '\u{05BC}']), - '\u{FB34}' => Some(&['\u{05D4}', '\u{05BC}']), - '\u{FB35}' => Some(&['\u{05D5}', '\u{05BC}']), - '\u{FB36}' => Some(&['\u{05D6}', '\u{05BC}']), - '\u{FB38}' => Some(&['\u{05D8}', '\u{05BC}']), - '\u{FB39}' => Some(&['\u{05D9}', '\u{05BC}']), - '\u{FB3A}' => Some(&['\u{05DA}', '\u{05BC}']), - '\u{FB3B}' => Some(&['\u{05DB}', '\u{05BC}']), - '\u{FB3C}' => Some(&['\u{05DC}', '\u{05BC}']), - '\u{FB3E}' => Some(&['\u{05DE}', '\u{05BC}']), - '\u{FB40}' => Some(&['\u{05E0}', '\u{05BC}']), - '\u{FB41}' => Some(&['\u{05E1}', '\u{05BC}']), - '\u{FB43}' => Some(&['\u{05E3}', '\u{05BC}']), - '\u{FB44}' => Some(&['\u{05E4}', '\u{05BC}']), - '\u{FB46}' => Some(&['\u{05E6}', '\u{05BC}']), - '\u{FB47}' => Some(&['\u{05E7}', '\u{05BC}']), - '\u{FB48}' => Some(&['\u{05E8}', '\u{05BC}']), - '\u{FB49}' => Some(&['\u{05E9}', '\u{05BC}']), - '\u{FB4A}' => Some(&['\u{05EA}', '\u{05BC}']), - '\u{FB4B}' => Some(&['\u{05D5}', '\u{05B9}']), - '\u{FB4C}' => Some(&['\u{05D1}', '\u{05BF}']), - '\u{FB4D}' => Some(&['\u{05DB}', '\u{05BF}']), - '\u{FB4E}' => Some(&['\u{05E4}', '\u{05BF}']), - '\u{1109A}' => Some(&['\u{11099}', '\u{110BA}']), - '\u{1109C}' => Some(&['\u{1109B}', '\u{110BA}']), - '\u{110AB}' => Some(&['\u{110A5}', '\u{110BA}']), - '\u{1112E}' => Some(&['\u{11131}', '\u{11127}']), - '\u{1112F}' => Some(&['\u{11132}', '\u{11127}']), - '\u{1134B}' => Some(&['\u{11347}', '\u{1133E}']), - '\u{1134C}' => Some(&['\u{11347}', '\u{11357}']), - '\u{114BB}' => Some(&['\u{114B9}', '\u{114BA}']), - '\u{114BC}' => Some(&['\u{114B9}', '\u{114B0}']), - '\u{114BE}' => Some(&['\u{114B9}', '\u{114BD}']), - '\u{115BA}' => Some(&['\u{115B8}', '\u{115AF}']), - '\u{115BB}' => Some(&['\u{115B9}', '\u{115AF}']), - '\u{1D15E}' => Some(&['\u{1D157}', '\u{1D165}']), - '\u{1D15F}' => Some(&['\u{1D158}', '\u{1D165}']), - '\u{1D160}' => Some(&['\u{1D158}', '\u{1D165}', '\u{1D16E}']), - '\u{1D161}' => Some(&['\u{1D158}', '\u{1D165}', '\u{1D16F}']), - '\u{1D162}' => Some(&['\u{1D158}', '\u{1D165}', '\u{1D170}']), - '\u{1D163}' => Some(&['\u{1D158}', '\u{1D165}', '\u{1D171}']), - '\u{1D164}' => Some(&['\u{1D158}', '\u{1D165}', '\u{1D172}']), - '\u{1D1BB}' => Some(&['\u{1D1B9}', '\u{1D165}']), - '\u{1D1BC}' => Some(&['\u{1D1BA}', '\u{1D165}']), - '\u{1D1BD}' => Some(&['\u{1D1B9}', '\u{1D165}', '\u{1D16E}']), - '\u{1D1BE}' => Some(&['\u{1D1BA}', '\u{1D165}', '\u{1D16E}']), - '\u{1D1BF}' => Some(&['\u{1D1B9}', '\u{1D165}', '\u{1D16F}']), - '\u{1D1C0}' => Some(&['\u{1D1BA}', '\u{1D165}', '\u{1D16F}']), - '\u{2F800}' => Some(&['\u{4E3D}']), - '\u{2F801}' => Some(&['\u{4E38}']), - '\u{2F802}' => Some(&['\u{4E41}']), - '\u{2F803}' => Some(&['\u{20122}']), - '\u{2F804}' => Some(&['\u{4F60}']), - '\u{2F805}' => Some(&['\u{4FAE}']), - '\u{2F806}' => Some(&['\u{4FBB}']), - '\u{2F807}' => Some(&['\u{5002}']), - '\u{2F808}' => Some(&['\u{507A}']), - '\u{2F809}' => Some(&['\u{5099}']), - '\u{2F80A}' => Some(&['\u{50E7}']), - '\u{2F80B}' => Some(&['\u{50CF}']), - '\u{2F80C}' => Some(&['\u{349E}']), - '\u{2F80D}' => Some(&['\u{2063A}']), - '\u{2F80E}' => Some(&['\u{514D}']), - '\u{2F80F}' => Some(&['\u{5154}']), - '\u{2F810}' => Some(&['\u{5164}']), - '\u{2F811}' => Some(&['\u{5177}']), - '\u{2F812}' => Some(&['\u{2051C}']), - '\u{2F813}' => Some(&['\u{34B9}']), - '\u{2F814}' => Some(&['\u{5167}']), - '\u{2F815}' => Some(&['\u{518D}']), - '\u{2F816}' => Some(&['\u{2054B}']), - '\u{2F817}' => Some(&['\u{5197}']), - '\u{2F818}' => Some(&['\u{51A4}']), - '\u{2F819}' => Some(&['\u{4ECC}']), - '\u{2F81A}' => Some(&['\u{51AC}']), - '\u{2F81B}' => Some(&['\u{51B5}']), - '\u{2F81C}' => Some(&['\u{291DF}']), - '\u{2F81D}' => Some(&['\u{51F5}']), - '\u{2F81E}' => Some(&['\u{5203}']), - '\u{2F81F}' => Some(&['\u{34DF}']), - '\u{2F820}' => Some(&['\u{523B}']), - '\u{2F821}' => Some(&['\u{5246}']), - '\u{2F822}' => Some(&['\u{5272}']), - '\u{2F823}' => Some(&['\u{5277}']), - '\u{2F824}' => Some(&['\u{3515}']), - '\u{2F825}' => Some(&['\u{52C7}']), - '\u{2F826}' => Some(&['\u{52C9}']), - '\u{2F827}' => Some(&['\u{52E4}']), - '\u{2F828}' => Some(&['\u{52FA}']), - '\u{2F829}' => Some(&['\u{5305}']), - '\u{2F82A}' => Some(&['\u{5306}']), - '\u{2F82B}' => Some(&['\u{5317}']), - '\u{2F82C}' => Some(&['\u{5349}']), - '\u{2F82D}' => Some(&['\u{5351}']), - '\u{2F82E}' => Some(&['\u{535A}']), - '\u{2F82F}' => Some(&['\u{5373}']), - '\u{2F830}' => Some(&['\u{537D}']), - '\u{2F831}' => Some(&['\u{537F}']), - '\u{2F832}' => Some(&['\u{537F}']), - '\u{2F833}' => Some(&['\u{537F}']), - '\u{2F834}' => Some(&['\u{20A2C}']), - '\u{2F835}' => Some(&['\u{7070}']), - '\u{2F836}' => Some(&['\u{53CA}']), - '\u{2F837}' => Some(&['\u{53DF}']), - '\u{2F838}' => Some(&['\u{20B63}']), - '\u{2F839}' => Some(&['\u{53EB}']), - '\u{2F83A}' => Some(&['\u{53F1}']), - '\u{2F83B}' => Some(&['\u{5406}']), - '\u{2F83C}' => Some(&['\u{549E}']), - '\u{2F83D}' => Some(&['\u{5438}']), - '\u{2F83E}' => Some(&['\u{5448}']), - '\u{2F83F}' => Some(&['\u{5468}']), - '\u{2F840}' => Some(&['\u{54A2}']), - '\u{2F841}' => Some(&['\u{54F6}']), - '\u{2F842}' => Some(&['\u{5510}']), - '\u{2F843}' => Some(&['\u{5553}']), - '\u{2F844}' => Some(&['\u{5563}']), - '\u{2F845}' => Some(&['\u{5584}']), - '\u{2F846}' => Some(&['\u{5584}']), - '\u{2F847}' => Some(&['\u{5599}']), - '\u{2F848}' => Some(&['\u{55AB}']), - '\u{2F849}' => Some(&['\u{55B3}']), - '\u{2F84A}' => Some(&['\u{55C2}']), - '\u{2F84B}' => Some(&['\u{5716}']), - '\u{2F84C}' => Some(&['\u{5606}']), - '\u{2F84D}' => Some(&['\u{5717}']), - '\u{2F84E}' => Some(&['\u{5651}']), - '\u{2F84F}' => Some(&['\u{5674}']), - '\u{2F850}' => Some(&['\u{5207}']), - '\u{2F851}' => Some(&['\u{58EE}']), - '\u{2F852}' => Some(&['\u{57CE}']), - '\u{2F853}' => Some(&['\u{57F4}']), - '\u{2F854}' => Some(&['\u{580D}']), - '\u{2F855}' => Some(&['\u{578B}']), - '\u{2F856}' => Some(&['\u{5832}']), - '\u{2F857}' => Some(&['\u{5831}']), - '\u{2F858}' => Some(&['\u{58AC}']), - '\u{2F859}' => Some(&['\u{214E4}']), - '\u{2F85A}' => Some(&['\u{58F2}']), - '\u{2F85B}' => Some(&['\u{58F7}']), - '\u{2F85C}' => Some(&['\u{5906}']), - '\u{2F85D}' => Some(&['\u{591A}']), - '\u{2F85E}' => Some(&['\u{5922}']), - '\u{2F85F}' => Some(&['\u{5962}']), - '\u{2F860}' => Some(&['\u{216A8}']), - '\u{2F861}' => Some(&['\u{216EA}']), - '\u{2F862}' => Some(&['\u{59EC}']), - '\u{2F863}' => Some(&['\u{5A1B}']), - '\u{2F864}' => Some(&['\u{5A27}']), - '\u{2F865}' => Some(&['\u{59D8}']), - '\u{2F866}' => Some(&['\u{5A66}']), - '\u{2F867}' => Some(&['\u{36EE}']), - '\u{2F868}' => Some(&['\u{36FC}']), - '\u{2F869}' => Some(&['\u{5B08}']), - '\u{2F86A}' => Some(&['\u{5B3E}']), - '\u{2F86B}' => Some(&['\u{5B3E}']), - '\u{2F86C}' => Some(&['\u{219C8}']), - '\u{2F86D}' => Some(&['\u{5BC3}']), - '\u{2F86E}' => Some(&['\u{5BD8}']), - '\u{2F86F}' => Some(&['\u{5BE7}']), - '\u{2F870}' => Some(&['\u{5BF3}']), - '\u{2F871}' => Some(&['\u{21B18}']), - '\u{2F872}' => Some(&['\u{5BFF}']), - '\u{2F873}' => Some(&['\u{5C06}']), - '\u{2F874}' => Some(&['\u{5F53}']), - '\u{2F875}' => Some(&['\u{5C22}']), - '\u{2F876}' => Some(&['\u{3781}']), - '\u{2F877}' => Some(&['\u{5C60}']), - '\u{2F878}' => Some(&['\u{5C6E}']), - '\u{2F879}' => Some(&['\u{5CC0}']), - '\u{2F87A}' => Some(&['\u{5C8D}']), - '\u{2F87B}' => Some(&['\u{21DE4}']), - '\u{2F87C}' => Some(&['\u{5D43}']), - '\u{2F87D}' => Some(&['\u{21DE6}']), - '\u{2F87E}' => Some(&['\u{5D6E}']), - '\u{2F87F}' => Some(&['\u{5D6B}']), - '\u{2F880}' => Some(&['\u{5D7C}']), - '\u{2F881}' => Some(&['\u{5DE1}']), - '\u{2F882}' => Some(&['\u{5DE2}']), - '\u{2F883}' => Some(&['\u{382F}']), - '\u{2F884}' => Some(&['\u{5DFD}']), - '\u{2F885}' => Some(&['\u{5E28}']), - '\u{2F886}' => Some(&['\u{5E3D}']), - '\u{2F887}' => Some(&['\u{5E69}']), - '\u{2F888}' => Some(&['\u{3862}']), - '\u{2F889}' => Some(&['\u{22183}']), - '\u{2F88A}' => Some(&['\u{387C}']), - '\u{2F88B}' => Some(&['\u{5EB0}']), - '\u{2F88C}' => Some(&['\u{5EB3}']), - '\u{2F88D}' => Some(&['\u{5EB6}']), - '\u{2F88E}' => Some(&['\u{5ECA}']), - '\u{2F88F}' => Some(&['\u{2A392}']), - '\u{2F890}' => Some(&['\u{5EFE}']), - '\u{2F891}' => Some(&['\u{22331}']), - '\u{2F892}' => Some(&['\u{22331}']), - '\u{2F893}' => Some(&['\u{8201}']), - '\u{2F894}' => Some(&['\u{5F22}']), - '\u{2F895}' => Some(&['\u{5F22}']), - '\u{2F896}' => Some(&['\u{38C7}']), - '\u{2F897}' => Some(&['\u{232B8}']), - '\u{2F898}' => Some(&['\u{261DA}']), - '\u{2F899}' => Some(&['\u{5F62}']), - '\u{2F89A}' => Some(&['\u{5F6B}']), - '\u{2F89B}' => Some(&['\u{38E3}']), - '\u{2F89C}' => Some(&['\u{5F9A}']), - '\u{2F89D}' => Some(&['\u{5FCD}']), - '\u{2F89E}' => Some(&['\u{5FD7}']), - '\u{2F89F}' => Some(&['\u{5FF9}']), - '\u{2F8A0}' => Some(&['\u{6081}']), - '\u{2F8A1}' => Some(&['\u{393A}']), - '\u{2F8A2}' => Some(&['\u{391C}']), - '\u{2F8A3}' => Some(&['\u{6094}']), - '\u{2F8A4}' => Some(&['\u{226D4}']), - '\u{2F8A5}' => Some(&['\u{60C7}']), - '\u{2F8A6}' => Some(&['\u{6148}']), - '\u{2F8A7}' => Some(&['\u{614C}']), - '\u{2F8A8}' => Some(&['\u{614E}']), - '\u{2F8A9}' => Some(&['\u{614C}']), - '\u{2F8AA}' => Some(&['\u{617A}']), - '\u{2F8AB}' => Some(&['\u{618E}']), - '\u{2F8AC}' => Some(&['\u{61B2}']), - '\u{2F8AD}' => Some(&['\u{61A4}']), - '\u{2F8AE}' => Some(&['\u{61AF}']), - '\u{2F8AF}' => Some(&['\u{61DE}']), - '\u{2F8B0}' => Some(&['\u{61F2}']), - '\u{2F8B1}' => Some(&['\u{61F6}']), - '\u{2F8B2}' => Some(&['\u{6210}']), - '\u{2F8B3}' => Some(&['\u{621B}']), - '\u{2F8B4}' => Some(&['\u{625D}']), - '\u{2F8B5}' => Some(&['\u{62B1}']), - '\u{2F8B6}' => Some(&['\u{62D4}']), - '\u{2F8B7}' => Some(&['\u{6350}']), - '\u{2F8B8}' => Some(&['\u{22B0C}']), - '\u{2F8B9}' => Some(&['\u{633D}']), - '\u{2F8BA}' => Some(&['\u{62FC}']), - '\u{2F8BB}' => Some(&['\u{6368}']), - '\u{2F8BC}' => Some(&['\u{6383}']), - '\u{2F8BD}' => Some(&['\u{63E4}']), - '\u{2F8BE}' => Some(&['\u{22BF1}']), - '\u{2F8BF}' => Some(&['\u{6422}']), - '\u{2F8C0}' => Some(&['\u{63C5}']), - '\u{2F8C1}' => Some(&['\u{63A9}']), - '\u{2F8C2}' => Some(&['\u{3A2E}']), - '\u{2F8C3}' => Some(&['\u{6469}']), - '\u{2F8C4}' => Some(&['\u{647E}']), - '\u{2F8C5}' => Some(&['\u{649D}']), - '\u{2F8C6}' => Some(&['\u{6477}']), - '\u{2F8C7}' => Some(&['\u{3A6C}']), - '\u{2F8C8}' => Some(&['\u{654F}']), - '\u{2F8C9}' => Some(&['\u{656C}']), - '\u{2F8CA}' => Some(&['\u{2300A}']), - '\u{2F8CB}' => Some(&['\u{65E3}']), - '\u{2F8CC}' => Some(&['\u{66F8}']), - '\u{2F8CD}' => Some(&['\u{6649}']), - '\u{2F8CE}' => Some(&['\u{3B19}']), - '\u{2F8CF}' => Some(&['\u{6691}']), - '\u{2F8D0}' => Some(&['\u{3B08}']), - '\u{2F8D1}' => Some(&['\u{3AE4}']), - '\u{2F8D2}' => Some(&['\u{5192}']), - '\u{2F8D3}' => Some(&['\u{5195}']), - '\u{2F8D4}' => Some(&['\u{6700}']), - '\u{2F8D5}' => Some(&['\u{669C}']), - '\u{2F8D6}' => Some(&['\u{80AD}']), - '\u{2F8D7}' => Some(&['\u{43D9}']), - '\u{2F8D8}' => Some(&['\u{6717}']), - '\u{2F8D9}' => Some(&['\u{671B}']), - '\u{2F8DA}' => Some(&['\u{6721}']), - '\u{2F8DB}' => Some(&['\u{675E}']), - '\u{2F8DC}' => Some(&['\u{6753}']), - '\u{2F8DD}' => Some(&['\u{233C3}']), - '\u{2F8DE}' => Some(&['\u{3B49}']), - '\u{2F8DF}' => Some(&['\u{67FA}']), - '\u{2F8E0}' => Some(&['\u{6785}']), - '\u{2F8E1}' => Some(&['\u{6852}']), - '\u{2F8E2}' => Some(&['\u{6885}']), - '\u{2F8E3}' => Some(&['\u{2346D}']), - '\u{2F8E4}' => Some(&['\u{688E}']), - '\u{2F8E5}' => Some(&['\u{681F}']), - '\u{2F8E6}' => Some(&['\u{6914}']), - '\u{2F8E7}' => Some(&['\u{3B9D}']), - '\u{2F8E8}' => Some(&['\u{6942}']), - '\u{2F8E9}' => Some(&['\u{69A3}']), - '\u{2F8EA}' => Some(&['\u{69EA}']), - '\u{2F8EB}' => Some(&['\u{6AA8}']), - '\u{2F8EC}' => Some(&['\u{236A3}']), - '\u{2F8ED}' => Some(&['\u{6ADB}']), - '\u{2F8EE}' => Some(&['\u{3C18}']), - '\u{2F8EF}' => Some(&['\u{6B21}']), - '\u{2F8F0}' => Some(&['\u{238A7}']), - '\u{2F8F1}' => Some(&['\u{6B54}']), - '\u{2F8F2}' => Some(&['\u{3C4E}']), - '\u{2F8F3}' => Some(&['\u{6B72}']), - '\u{2F8F4}' => Some(&['\u{6B9F}']), - '\u{2F8F5}' => Some(&['\u{6BBA}']), - '\u{2F8F6}' => Some(&['\u{6BBB}']), - '\u{2F8F7}' => Some(&['\u{23A8D}']), - '\u{2F8F8}' => Some(&['\u{21D0B}']), - '\u{2F8F9}' => Some(&['\u{23AFA}']), - '\u{2F8FA}' => Some(&['\u{6C4E}']), - '\u{2F8FB}' => Some(&['\u{23CBC}']), - '\u{2F8FC}' => Some(&['\u{6CBF}']), - '\u{2F8FD}' => Some(&['\u{6CCD}']), - '\u{2F8FE}' => Some(&['\u{6C67}']), - '\u{2F8FF}' => Some(&['\u{6D16}']), - '\u{2F900}' => Some(&['\u{6D3E}']), - '\u{2F901}' => Some(&['\u{6D77}']), - '\u{2F902}' => Some(&['\u{6D41}']), - '\u{2F903}' => Some(&['\u{6D69}']), - '\u{2F904}' => Some(&['\u{6D78}']), - '\u{2F905}' => Some(&['\u{6D85}']), - '\u{2F906}' => Some(&['\u{23D1E}']), - '\u{2F907}' => Some(&['\u{6D34}']), - '\u{2F908}' => Some(&['\u{6E2F}']), - '\u{2F909}' => Some(&['\u{6E6E}']), - '\u{2F90A}' => Some(&['\u{3D33}']), - '\u{2F90B}' => Some(&['\u{6ECB}']), - '\u{2F90C}' => Some(&['\u{6EC7}']), - '\u{2F90D}' => Some(&['\u{23ED1}']), - '\u{2F90E}' => Some(&['\u{6DF9}']), - '\u{2F90F}' => Some(&['\u{6F6E}']), - '\u{2F910}' => Some(&['\u{23F5E}']), - '\u{2F911}' => Some(&['\u{23F8E}']), - '\u{2F912}' => Some(&['\u{6FC6}']), - '\u{2F913}' => Some(&['\u{7039}']), - '\u{2F914}' => Some(&['\u{701E}']), - '\u{2F915}' => Some(&['\u{701B}']), - '\u{2F916}' => Some(&['\u{3D96}']), - '\u{2F917}' => Some(&['\u{704A}']), - '\u{2F918}' => Some(&['\u{707D}']), - '\u{2F919}' => Some(&['\u{7077}']), - '\u{2F91A}' => Some(&['\u{70AD}']), - '\u{2F91B}' => Some(&['\u{20525}']), - '\u{2F91C}' => Some(&['\u{7145}']), - '\u{2F91D}' => Some(&['\u{24263}']), - '\u{2F91E}' => Some(&['\u{719C}']), - '\u{2F91F}' => Some(&['\u{243AB}']), - '\u{2F920}' => Some(&['\u{7228}']), - '\u{2F921}' => Some(&['\u{7235}']), - '\u{2F922}' => Some(&['\u{7250}']), - '\u{2F923}' => Some(&['\u{24608}']), - '\u{2F924}' => Some(&['\u{7280}']), - '\u{2F925}' => Some(&['\u{7295}']), - '\u{2F926}' => Some(&['\u{24735}']), - '\u{2F927}' => Some(&['\u{24814}']), - '\u{2F928}' => Some(&['\u{737A}']), - '\u{2F929}' => Some(&['\u{738B}']), - '\u{2F92A}' => Some(&['\u{3EAC}']), - '\u{2F92B}' => Some(&['\u{73A5}']), - '\u{2F92C}' => Some(&['\u{3EB8}']), - '\u{2F92D}' => Some(&['\u{3EB8}']), - '\u{2F92E}' => Some(&['\u{7447}']), - '\u{2F92F}' => Some(&['\u{745C}']), - '\u{2F930}' => Some(&['\u{7471}']), - '\u{2F931}' => Some(&['\u{7485}']), - '\u{2F932}' => Some(&['\u{74CA}']), - '\u{2F933}' => Some(&['\u{3F1B}']), - '\u{2F934}' => Some(&['\u{7524}']), - '\u{2F935}' => Some(&['\u{24C36}']), - '\u{2F936}' => Some(&['\u{753E}']), - '\u{2F937}' => Some(&['\u{24C92}']), - '\u{2F938}' => Some(&['\u{7570}']), - '\u{2F939}' => Some(&['\u{2219F}']), - '\u{2F93A}' => Some(&['\u{7610}']), - '\u{2F93B}' => Some(&['\u{24FA1}']), - '\u{2F93C}' => Some(&['\u{24FB8}']), - '\u{2F93D}' => Some(&['\u{25044}']), - '\u{2F93E}' => Some(&['\u{3FFC}']), - '\u{2F93F}' => Some(&['\u{4008}']), - '\u{2F940}' => Some(&['\u{76F4}']), - '\u{2F941}' => Some(&['\u{250F3}']), - '\u{2F942}' => Some(&['\u{250F2}']), - '\u{2F943}' => Some(&['\u{25119}']), - '\u{2F944}' => Some(&['\u{25133}']), - '\u{2F945}' => Some(&['\u{771E}']), - '\u{2F946}' => Some(&['\u{771F}']), - '\u{2F947}' => Some(&['\u{771F}']), - '\u{2F948}' => Some(&['\u{774A}']), - '\u{2F949}' => Some(&['\u{4039}']), - '\u{2F94A}' => Some(&['\u{778B}']), - '\u{2F94B}' => Some(&['\u{4046}']), - '\u{2F94C}' => Some(&['\u{4096}']), - '\u{2F94D}' => Some(&['\u{2541D}']), - '\u{2F94E}' => Some(&['\u{784E}']), - '\u{2F94F}' => Some(&['\u{788C}']), - '\u{2F950}' => Some(&['\u{78CC}']), - '\u{2F951}' => Some(&['\u{40E3}']), - '\u{2F952}' => Some(&['\u{25626}']), - '\u{2F953}' => Some(&['\u{7956}']), - '\u{2F954}' => Some(&['\u{2569A}']), - '\u{2F955}' => Some(&['\u{256C5}']), - '\u{2F956}' => Some(&['\u{798F}']), - '\u{2F957}' => Some(&['\u{79EB}']), - '\u{2F958}' => Some(&['\u{412F}']), - '\u{2F959}' => Some(&['\u{7A40}']), - '\u{2F95A}' => Some(&['\u{7A4A}']), - '\u{2F95B}' => Some(&['\u{7A4F}']), - '\u{2F95C}' => Some(&['\u{2597C}']), - '\u{2F95D}' => Some(&['\u{25AA7}']), - '\u{2F95E}' => Some(&['\u{25AA7}']), - '\u{2F95F}' => Some(&['\u{7AEE}']), - '\u{2F960}' => Some(&['\u{4202}']), - '\u{2F961}' => Some(&['\u{25BAB}']), - '\u{2F962}' => Some(&['\u{7BC6}']), - '\u{2F963}' => Some(&['\u{7BC9}']), - '\u{2F964}' => Some(&['\u{4227}']), - '\u{2F965}' => Some(&['\u{25C80}']), - '\u{2F966}' => Some(&['\u{7CD2}']), - '\u{2F967}' => Some(&['\u{42A0}']), - '\u{2F968}' => Some(&['\u{7CE8}']), - '\u{2F969}' => Some(&['\u{7CE3}']), - '\u{2F96A}' => Some(&['\u{7D00}']), - '\u{2F96B}' => Some(&['\u{25F86}']), - '\u{2F96C}' => Some(&['\u{7D63}']), - '\u{2F96D}' => Some(&['\u{4301}']), - '\u{2F96E}' => Some(&['\u{7DC7}']), - '\u{2F96F}' => Some(&['\u{7E02}']), - '\u{2F970}' => Some(&['\u{7E45}']), - '\u{2F971}' => Some(&['\u{4334}']), - '\u{2F972}' => Some(&['\u{26228}']), - '\u{2F973}' => Some(&['\u{26247}']), - '\u{2F974}' => Some(&['\u{4359}']), - '\u{2F975}' => Some(&['\u{262D9}']), - '\u{2F976}' => Some(&['\u{7F7A}']), - '\u{2F977}' => Some(&['\u{2633E}']), - '\u{2F978}' => Some(&['\u{7F95}']), - '\u{2F979}' => Some(&['\u{7FFA}']), - '\u{2F97A}' => Some(&['\u{8005}']), - '\u{2F97B}' => Some(&['\u{264DA}']), - '\u{2F97C}' => Some(&['\u{26523}']), - '\u{2F97D}' => Some(&['\u{8060}']), - '\u{2F97E}' => Some(&['\u{265A8}']), - '\u{2F97F}' => Some(&['\u{8070}']), - '\u{2F980}' => Some(&['\u{2335F}']), - '\u{2F981}' => Some(&['\u{43D5}']), - '\u{2F982}' => Some(&['\u{80B2}']), - '\u{2F983}' => Some(&['\u{8103}']), - '\u{2F984}' => Some(&['\u{440B}']), - '\u{2F985}' => Some(&['\u{813E}']), - '\u{2F986}' => Some(&['\u{5AB5}']), - '\u{2F987}' => Some(&['\u{267A7}']), - '\u{2F988}' => Some(&['\u{267B5}']), - '\u{2F989}' => Some(&['\u{23393}']), - '\u{2F98A}' => Some(&['\u{2339C}']), - '\u{2F98B}' => Some(&['\u{8201}']), - '\u{2F98C}' => Some(&['\u{8204}']), - '\u{2F98D}' => Some(&['\u{8F9E}']), - '\u{2F98E}' => Some(&['\u{446B}']), - '\u{2F98F}' => Some(&['\u{8291}']), - '\u{2F990}' => Some(&['\u{828B}']), - '\u{2F991}' => Some(&['\u{829D}']), - '\u{2F992}' => Some(&['\u{52B3}']), - '\u{2F993}' => Some(&['\u{82B1}']), - '\u{2F994}' => Some(&['\u{82B3}']), - '\u{2F995}' => Some(&['\u{82BD}']), - '\u{2F996}' => Some(&['\u{82E6}']), - '\u{2F997}' => Some(&['\u{26B3C}']), - '\u{2F998}' => Some(&['\u{82E5}']), - '\u{2F999}' => Some(&['\u{831D}']), - '\u{2F99A}' => Some(&['\u{8363}']), - '\u{2F99B}' => Some(&['\u{83AD}']), - '\u{2F99C}' => Some(&['\u{8323}']), - '\u{2F99D}' => Some(&['\u{83BD}']), - '\u{2F99E}' => Some(&['\u{83E7}']), - '\u{2F99F}' => Some(&['\u{8457}']), - '\u{2F9A0}' => Some(&['\u{8353}']), - '\u{2F9A1}' => Some(&['\u{83CA}']), - '\u{2F9A2}' => Some(&['\u{83CC}']), - '\u{2F9A3}' => Some(&['\u{83DC}']), - '\u{2F9A4}' => Some(&['\u{26C36}']), - '\u{2F9A5}' => Some(&['\u{26D6B}']), - '\u{2F9A6}' => Some(&['\u{26CD5}']), - '\u{2F9A7}' => Some(&['\u{452B}']), - '\u{2F9A8}' => Some(&['\u{84F1}']), - '\u{2F9A9}' => Some(&['\u{84F3}']), - '\u{2F9AA}' => Some(&['\u{8516}']), - '\u{2F9AB}' => Some(&['\u{273CA}']), - '\u{2F9AC}' => Some(&['\u{8564}']), - '\u{2F9AD}' => Some(&['\u{26F2C}']), - '\u{2F9AE}' => Some(&['\u{455D}']), - '\u{2F9AF}' => Some(&['\u{4561}']), - '\u{2F9B0}' => Some(&['\u{26FB1}']), - '\u{2F9B1}' => Some(&['\u{270D2}']), - '\u{2F9B2}' => Some(&['\u{456B}']), - '\u{2F9B3}' => Some(&['\u{8650}']), - '\u{2F9B4}' => Some(&['\u{865C}']), - '\u{2F9B5}' => Some(&['\u{8667}']), - '\u{2F9B6}' => Some(&['\u{8669}']), - '\u{2F9B7}' => Some(&['\u{86A9}']), - '\u{2F9B8}' => Some(&['\u{8688}']), - '\u{2F9B9}' => Some(&['\u{870E}']), - '\u{2F9BA}' => Some(&['\u{86E2}']), - '\u{2F9BB}' => Some(&['\u{8779}']), - '\u{2F9BC}' => Some(&['\u{8728}']), - '\u{2F9BD}' => Some(&['\u{876B}']), - '\u{2F9BE}' => Some(&['\u{8786}']), - '\u{2F9BF}' => Some(&['\u{45D7}']), - '\u{2F9C0}' => Some(&['\u{87E1}']), - '\u{2F9C1}' => Some(&['\u{8801}']), - '\u{2F9C2}' => Some(&['\u{45F9}']), - '\u{2F9C3}' => Some(&['\u{8860}']), - '\u{2F9C4}' => Some(&['\u{8863}']), - '\u{2F9C5}' => Some(&['\u{27667}']), - '\u{2F9C6}' => Some(&['\u{88D7}']), - '\u{2F9C7}' => Some(&['\u{88DE}']), - '\u{2F9C8}' => Some(&['\u{4635}']), - '\u{2F9C9}' => Some(&['\u{88FA}']), - '\u{2F9CA}' => Some(&['\u{34BB}']), - '\u{2F9CB}' => Some(&['\u{278AE}']), - '\u{2F9CC}' => Some(&['\u{27966}']), - '\u{2F9CD}' => Some(&['\u{46BE}']), - '\u{2F9CE}' => Some(&['\u{46C7}']), - '\u{2F9CF}' => Some(&['\u{8AA0}']), - '\u{2F9D0}' => Some(&['\u{8AED}']), - '\u{2F9D1}' => Some(&['\u{8B8A}']), - '\u{2F9D2}' => Some(&['\u{8C55}']), - '\u{2F9D3}' => Some(&['\u{27CA8}']), - '\u{2F9D4}' => Some(&['\u{8CAB}']), - '\u{2F9D5}' => Some(&['\u{8CC1}']), - '\u{2F9D6}' => Some(&['\u{8D1B}']), - '\u{2F9D7}' => Some(&['\u{8D77}']), - '\u{2F9D8}' => Some(&['\u{27F2F}']), - '\u{2F9D9}' => Some(&['\u{20804}']), - '\u{2F9DA}' => Some(&['\u{8DCB}']), - '\u{2F9DB}' => Some(&['\u{8DBC}']), - '\u{2F9DC}' => Some(&['\u{8DF0}']), - '\u{2F9DD}' => Some(&['\u{208DE}']), - '\u{2F9DE}' => Some(&['\u{8ED4}']), - '\u{2F9DF}' => Some(&['\u{8F38}']), - '\u{2F9E0}' => Some(&['\u{285D2}']), - '\u{2F9E1}' => Some(&['\u{285ED}']), - '\u{2F9E2}' => Some(&['\u{9094}']), - '\u{2F9E3}' => Some(&['\u{90F1}']), - '\u{2F9E4}' => Some(&['\u{9111}']), - '\u{2F9E5}' => Some(&['\u{2872E}']), - '\u{2F9E6}' => Some(&['\u{911B}']), - '\u{2F9E7}' => Some(&['\u{9238}']), - '\u{2F9E8}' => Some(&['\u{92D7}']), - '\u{2F9E9}' => Some(&['\u{92D8}']), - '\u{2F9EA}' => Some(&['\u{927C}']), - '\u{2F9EB}' => Some(&['\u{93F9}']), - '\u{2F9EC}' => Some(&['\u{9415}']), - '\u{2F9ED}' => Some(&['\u{28BFA}']), - '\u{2F9EE}' => Some(&['\u{958B}']), - '\u{2F9EF}' => Some(&['\u{4995}']), - '\u{2F9F0}' => Some(&['\u{95B7}']), - '\u{2F9F1}' => Some(&['\u{28D77}']), - '\u{2F9F2}' => Some(&['\u{49E6}']), - '\u{2F9F3}' => Some(&['\u{96C3}']), - '\u{2F9F4}' => Some(&['\u{5DB2}']), - '\u{2F9F5}' => Some(&['\u{9723}']), - '\u{2F9F6}' => Some(&['\u{29145}']), - '\u{2F9F7}' => Some(&['\u{2921A}']), - '\u{2F9F8}' => Some(&['\u{4A6E}']), - '\u{2F9F9}' => Some(&['\u{4A76}']), - '\u{2F9FA}' => Some(&['\u{97E0}']), - '\u{2F9FB}' => Some(&['\u{2940A}']), - '\u{2F9FC}' => Some(&['\u{4AB2}']), - '\u{2F9FD}' => Some(&['\u{29496}']), - '\u{2F9FE}' => Some(&['\u{980B}']), - '\u{2F9FF}' => Some(&['\u{980B}']), - '\u{2FA00}' => Some(&['\u{9829}']), - '\u{2FA01}' => Some(&['\u{295B6}']), - '\u{2FA02}' => Some(&['\u{98E2}']), - '\u{2FA03}' => Some(&['\u{4B33}']), - '\u{2FA04}' => Some(&['\u{9929}']), - '\u{2FA05}' => Some(&['\u{99A7}']), - '\u{2FA06}' => Some(&['\u{99C2}']), - '\u{2FA07}' => Some(&['\u{99FE}']), - '\u{2FA08}' => Some(&['\u{4BCE}']), - '\u{2FA09}' => Some(&['\u{29B30}']), - '\u{2FA0A}' => Some(&['\u{9B12}']), - '\u{2FA0B}' => Some(&['\u{9C40}']), - '\u{2FA0C}' => Some(&['\u{9CFD}']), - '\u{2FA0D}' => Some(&['\u{4CCE}']), - '\u{2FA0E}' => Some(&['\u{4CED}']), - '\u{2FA0F}' => Some(&['\u{9D67}']), - '\u{2FA10}' => Some(&['\u{2A0CE}']), - '\u{2FA11}' => Some(&['\u{4CF8}']), - '\u{2FA12}' => Some(&['\u{2A105}']), - '\u{2FA13}' => Some(&['\u{2A20E}']), - '\u{2FA14}' => Some(&['\u{2A291}']), - '\u{2FA15}' => Some(&['\u{9EBB}']), - '\u{2FA16}' => Some(&['\u{4D56}']), - '\u{2FA17}' => Some(&['\u{9EF9}']), - '\u{2FA18}' => Some(&['\u{9EFE}']), - '\u{2FA19}' => Some(&['\u{9F05}']), - '\u{2FA1A}' => Some(&['\u{9F0F}']), - '\u{2FA1B}' => Some(&['\u{9F16}']), - '\u{2FA1C}' => Some(&['\u{9F3B}']), - '\u{2FA1D}' => Some(&['\u{2A600}']), - _ => None, - } -} +pub(crate) const CANONICAL_DECOMPOSED_SALT: &[u16] = &[ + 0x58b, + 0x18, + 0x0, + 0x0, + 0x308, + 0x293, + 0x0, + 0x1be, + 0x1ca, + 0x13, + 0x0, + 0x4, + 0x0, + 0x82, + 0xc0, + 0x66, + 0x4, + 0x0, + 0x4f, + 0x91, + 0x22, + 0x2f, + 0x6, + 0x10, + 0x2, + 0x7b, + 0x45, + 0x1, + 0x2, + 0x33, + 0x6, + 0x0, + 0x0, + 0x25, + 0xc, + 0xf3, + 0x0, + 0x5f, + 0x3, + 0x0, + 0x0, + 0x0, + 0x8, + 0x0, + 0x6, + 0x63, + 0x21, + 0x0, + 0x2a, + 0x0, + 0x0, + 0xab, + 0xc, + 0x0, + 0x0, + 0x3d, + 0x2b, + 0x0, + 0x0, + 0x67, + 0x0, + 0x1, + 0x8, + 0x3, + 0x0, + 0x0, + 0x2, + 0x0, + 0x53, + 0x4, + 0x0, + 0x84, + 0x0, + 0x30, + 0x0, + 0x0, + 0x5, + 0x6, + 0x70, + 0x9, + 0x42, + 0x1, + 0x6d, + 0x2, + 0x2f, + 0x0, + 0x1a, + 0x0, + 0x11, + 0x2, + 0x0, + 0x1b, + 0x1, + 0x0, + 0x6, + 0x0, + 0x1b, + 0x0, + 0xb, + 0x0, + 0x0, + 0x15, + 0x0, + 0x0, + 0x5f, + 0x0, + 0x5, + 0x0, + 0x37, + 0xc, + 0x0, + 0x5, + 0x3, + 0x48, + 0x17, + 0x9, + 0x21, + 0x7, + 0x4, + 0x1, + 0x0, + 0x53, + 0xaa, + 0x0, + 0x3, + 0x0, + 0x0, + 0x25, + 0x10, + 0x1f, + 0x2e, + 0x48, + 0x0, + 0x1, + 0x0, + 0x19, + 0x1, + 0x2, + 0x0, + 0x1, + 0x4, + 0x0, + 0x0, + 0x22, + 0x0, + 0x2, + 0x4, + 0x0, + 0x0, + 0x7, + 0x11, + 0x1b, + 0x1a, + 0x11, + 0x10, + 0x8, + 0x2, + 0x2a, + 0x4, + 0x0, + 0x35, + 0x19, + 0xd, + 0x0, + 0x5, + 0x27, + 0x0, + 0x3, + 0x5, + 0x0, + 0x1c, + 0x2, + 0x26, + 0x1, + 0x0, + 0x0, + 0x7, + 0x2f, + 0x5, + 0x3c, + 0x0, + 0xb, + 0x8, + 0x0, + 0x0, + 0x1a, + 0x19, + 0x2, + 0x6, + 0x0, + 0x1, + 0x0, + 0xe, + 0x2, + 0x18, + 0x3, + 0x2, + 0x3, + 0x8, + 0x0, + 0x9, + 0xf, + 0x4e, + 0x0, + 0x27, + 0xe, + 0xd, + 0x0, + 0x18, + 0x0, + 0x1a, + 0x0, + 0x0, + 0x5, + 0x1, + 0x2, + 0x0, + 0x3, + 0x2e, + 0x2a, + 0x1b, + 0x0, + 0x0, + 0x4, + 0x0, + 0x25, + 0x1b, + 0x7, + 0x0, + 0x0, + 0x42, + 0xa, + 0x8, + 0x1, + 0x1, + 0x0, + 0x6, + 0x5, + 0x16, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x23, + 0x3, + 0xc, + 0x1, + 0x7, + 0x9, + 0x9, + 0x0, + 0x1, + 0x9, + 0x2, + 0x2, + 0x4, + 0x0, + 0x7, + 0x1, + 0x6, + 0xa, + 0xc, + 0x3, + 0x20, + 0x0, + 0x12, + 0x1, + 0x1, + 0x2, + 0x4, + 0x8, + 0x8, + 0x1b, + 0x4, + 0x1, + 0x10, + 0x0, + 0xb, + 0x0, + 0x5, + 0x0, + 0x5, + 0x0, + 0xc, + 0x0, + 0x14, + 0x0, + 0x33, + 0x0, + 0x0, + 0x0, + 0x0, + 0xd, + 0x0, + 0x0, + 0x35, + 0x5, + 0x0, + 0x0, + 0x0, + 0x15, + 0x0, + 0x0, + 0x7, + 0x4, + 0x0, + 0x3b, + 0x1, + 0x1, + 0x1, + 0x0, + 0x6, + 0x0, + 0x4, + 0x18, + 0x0, + 0x0, + 0x3, + 0xd, + 0xc, + 0x2, + 0x4, + 0x1, + 0x1, + 0x1, + 0x0, + 0x10, + 0x0, + 0x8, + 0x36, + 0x9, + 0x1, + 0xb, + 0x3, + 0xb, + 0x3, + 0x0, + 0x0, + 0xf, + 0x6, + 0x0, + 0x0, + 0x7, + 0x2, + 0x3f, + 0xa, + 0x0, + 0x0, + 0x1e, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x1a, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x9, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x8, + 0x0, + 0x0, + 0x1, + 0x0, + 0x7, + 0x0, + 0xa, + 0x5, + 0xf, + 0x10, + 0x1, + 0x0, + 0x6, + 0x1, + 0x2, + 0x7, + 0x9, + 0x3, + 0x1, + 0xe, + 0x7, + 0x0, + 0x0, + 0x1, + 0x8, + 0x1, + 0xd, + 0x0, + 0x0, + 0x1, + 0x2, + 0xb, + 0x0, + 0x3, + 0x6, + 0x0, + 0x9, + 0xe, + 0x2, + 0x0, + 0x7, + 0x32, + 0x8, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1e, + 0x0, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x2, + 0x7, + 0x0, + 0x0, + 0x6, + 0xb, + 0x14, + 0xb, + 0xc, + 0x0, + 0x2, + 0x4, + 0x1, + 0x2, + 0x10, + 0x1, + 0x1, + 0x1, + 0x4, + 0x3, + 0x1, + 0xb, + 0x8, + 0x4, + 0x1, + 0x4, + 0x4, + 0x0, + 0x18, + 0x0, + 0x0, + 0x0, + 0x2c, + 0xe, + 0x7, + 0x2, + 0x6, + 0x2, + 0x13, + 0x6, + 0x4, + 0x2, + 0x0, + 0x1d, + 0x12, + 0x6, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0xa, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0xa, + 0x2, + 0x0, + 0x0, + 0xe, + 0x4, + 0x1, + 0x0, + 0x9, + 0x1, + 0x2, + 0x2, + 0x7, + 0x0, + 0x0, + 0x2, + 0x4, + 0x6, + 0x0, + 0x9, + 0x0, + 0x5, + 0x0, + 0x0, + 0x1, + 0x1a, + 0x9, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x4, + 0xd, + 0x8, + 0x17, + 0x7, + 0x0, + 0x0, + 0x5, + 0xe, + 0x12, + 0xa, + 0x0, + 0x1b, + 0x7, + 0x0, + 0x0, + 0x11, + 0x1, + 0x4, + 0x9, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x0, + 0x9, + 0x0, + 0x2, + 0xc, + 0x4, + 0x1, + 0x15, + 0x4, + 0x0, + 0x4, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x12, + 0x2, + 0x5, + 0x2, + 0x1, + 0x5, + 0x9, + 0x0, + 0x0, + 0x8, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x1, + 0x7, + 0x1, + 0x0, + 0x0, + 0x9, + 0x0, + 0x3, + 0xb, + 0x2, + 0x6, + 0x4, + 0x0, + 0x0, + 0x5, + 0x0, + 0xa, + 0x2, + 0x9, + 0x8, + 0x0, + 0x0, + 0x7, + 0x0, + 0x1d, + 0xa, + 0x3, + 0x0, + 0x8, + 0x0, + 0xc, + 0x1, + 0x1, + 0x0, + 0x0, + 0x4, + 0x7, + 0x0, + 0x4, + 0x16, + 0x3, + 0x1, + 0x8, + 0xd, + 0x0, + 0x3, + 0x4, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x6, + 0x6, + 0x0, + 0x2, + 0x0, + 0x0, + 0x9, + 0x8, + 0xb, + 0x0, + 0x0, + 0x0, + 0x0, + 0x12, + 0x0, + 0x0, + 0x4, + 0x1, + 0x0, + 0xc, + 0x5, + 0x3, + 0xb, + 0x4, + 0x0, + 0x0, + 0x3, + 0x1, + 0x7, + 0x1, + 0x0, + 0x0, + 0xa, + 0x5, + 0x0, + 0x9, + 0x0, + 0x0, + 0x14, + 0x0, + 0xc, + 0x0, + 0x6, + 0x0, + 0x3, + 0x2, + 0x0, + 0x5, + 0x3, + 0x0, + 0x5, + 0x1, + 0x12, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x7, + 0x0, + 0x0, + 0x0, + 0x0, + 0x6, + 0xd, + 0x1, + 0x6, + 0x0, + 0xb, + 0x1, + 0x2, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1, + 0x4, + 0x0, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x5, + 0x7, + 0x0, + 0x0, + 0xc, + 0x2, + 0x0, + 0x3, + 0x17, + 0x2, + 0x0, + 0x3, + 0x0, + 0xe, + 0x0, + 0xe, + 0x7, + 0x0, + 0x9, + 0x5, + 0x1, + 0x2, + 0x1, + 0x3, + 0x0, + 0x0, + 0x0, + 0x3, + 0x3, + 0x2, + 0x1, + 0x2, + 0x0, + 0x7, + 0x5, + 0x0, + 0x8, + 0x3, + 0x1, + 0x0, + 0x7, + 0x1, + 0x0, + 0xc, + 0x0, + 0x1, + 0x5, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x6, + 0x0, + 0x0, + 0x0, + 0x8, + 0xd, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x6, + 0x1, + 0xd, + 0x2, + 0x0, + 0x0, + 0x4, + 0x6, + 0x0, + 0x6, + 0x1, + 0x6, + 0x1, + 0x2, + 0x8, + 0x4, + 0x2, + 0x2, + 0x2, + 0x4, + 0x0, + 0x0, + 0x14, + 0x11, + 0x0, + 0x0, + 0x8, + 0x1, + 0x2, + 0x2, + 0x2, + 0x7, + 0x1, + 0x0, + 0x0, + 0x4, + 0xa, + 0x0, + 0x0, + 0x0, + 0x0, + 0x7, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x3, + 0x5, + 0x3, + 0x4, + 0x0, + 0x0, + 0x3, + 0x5, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x1a, + 0x0, + 0x6, + 0x0, + 0x4, + 0x6, + 0x4, + 0x0, + 0x1, + 0x1, + 0x5, + 0x1, + 0x4, + 0x6, + 0x0, + 0x4, + 0x1, + 0x0, + 0x9, + 0x1, + 0x5, + 0x5, + 0x1, + 0x9, + 0x2, + 0x6, + 0x3, + 0x0, + 0x8, + 0x0, + 0x0, + 0x1, + 0x5, + 0x9, + 0x12, + 0x1, + 0x2, + 0x8, + 0x0, + 0x6, + 0x1, + 0x0, + 0xd, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0xb, + 0x0, + 0xb, + 0x1, + 0x2, + 0x0, + 0x0, + 0x3, + 0x0, + 0x3, + 0x0, + 0x2, + 0x5, + 0x1, + 0x1, + 0x7, + 0x1, + 0x2, + 0x3, + 0xa, + 0x7, + 0x8, + 0xa, + 0x1, + 0x0, + 0x1, + 0x12, + 0x2, + 0x4, + 0x0, + 0x2, + 0x6, + 0x2, + 0x9, + 0x0, + 0x6, + 0x0, + 0x2, + 0x1, + 0x0, + 0x1, + 0x4, + 0x0, + 0x0, + 0x0, + 0x12, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x5, + 0x2, + 0x0, + 0x3, + 0x0, + 0x1, + 0x1, + 0x3, + 0x0, + 0x2, + 0x0, + 0x1, + 0x4, + 0x0, + 0x5, + 0x1, + 0x1, + 0x1, + 0x2, + 0x8, + 0x4, + 0x1, + 0x1, + 0x2, + 0x0, + 0x2, + 0x0, + 0x2, + 0x3, + 0x1, + 0x0, + 0xc, + 0x1, + 0x0, + 0x0, + 0x0, + 0xd, + 0x3, + 0x0, + 0x4, + 0x1, + 0x0, + 0x2, + 0x7, + 0x11, + 0x0, + 0x5, + 0x0, + 0x9, + 0x2, + 0x0, + 0x2, + 0x1, + 0x4, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x5, + 0x2, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x5, + 0x1, + 0x0, + 0x1, + 0x3, + 0x0, + 0x2, + 0xc, + 0x1, + 0x2, + 0x5, + 0x0, + 0x3, + 0x2, + 0x5, + 0x0, + 0x5, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x4, + 0x0, + 0x0, + 0xb, + 0x3, + 0x6, + 0x0, + 0x0, + 0x0, + 0x0, + 0x5, + 0x3, + 0x0, + 0x4, + 0x0, + 0x3, + 0xb, + 0x0, + 0x0, + 0x3, + 0x2, + 0x3, + 0x4, + 0x3, + 0x6, + 0x9, + 0x2, + 0x0, + 0x1, + 0x1, + 0x8, + 0x4, + 0x8, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x5, + 0x1, + 0x1, + 0xa, + 0x7, + 0x9, + 0x8, + 0x9, + 0x2, + 0x0, + 0x0, + 0x3, + 0x5, + 0x1, + 0x6, + 0x6, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x7, + 0x8, + 0x0, + 0x0, + 0xe, + 0x2, + 0x0, + 0x0, + 0x0, + 0x1, + 0x6, + 0x0, + 0x1, + 0x0, + 0x0, + 0x5, + 0x0, + 0x1, + 0x1, + 0x3, + 0x1, + 0x0, + 0x5, + 0x0, + 0x0, + 0x5, + 0x3, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x3, + 0x11, + 0x2, + 0x5, + 0x3, + 0x0, + 0x0, + 0x1, + 0x3, + 0x2, + 0x5, + 0x1, + 0xa, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x1, + 0x5, + 0x2, + 0x2, + 0x0, + 0x8, + 0x1, + 0x2, + 0x0, + 0x0, + 0x6, + 0x6, + 0x6, + 0x2, + 0xc, + 0x0, + 0x1, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x8, + 0x1, + 0x0, + 0x0, + 0x0, + 0xc, + 0x0, + 0x2, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x4, + 0x8, + 0x7, + 0x6, + 0x1, + 0x2, + 0x0, + 0x1, + 0x2, + 0xb, + 0x3, + 0x2, + 0x4, + 0x0, + 0xa, + 0x1, + 0x3, + 0xc, + 0x1, + 0x0, + 0x3, + 0x1, + 0x0, + 0xd, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x8, + 0x4, + 0x2, + 0x0, + 0x1, + 0x1, + 0x6, + 0x7, + 0x1, + 0x4, + 0x0, + 0x1, + 0xd, + 0x2, + 0x2, + 0x0, + 0x2, + 0x1, + 0x0, + 0x1, + 0x2, + 0x5, + 0x1, + 0x1, + 0x1, + 0x0, + 0x2, + 0xa, + 0x4, + 0x1, + 0x4, + 0x2, + 0x1, + 0x1, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x4, + 0x3, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0xb, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x3, + 0x5, + 0x0, + 0xb, + 0x1, + 0x3, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x3, + 0x6, + 0x0, + 0x0, + 0x6, + 0x0, + 0x1, + 0x3, + 0x0, + 0x4, + 0x4, + 0x1, + 0x2, + 0x2, + 0x1, + 0x1, + 0x4, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x5, + 0x3, + 0x4, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x5, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x2, + 0x2, + 0x4, + 0x0, + 0x2, + 0x4, + 0x0, + 0x0, + 0x1, + 0x2, + 0x5, + 0x2, + 0x1, + 0x1, + 0x1, + 0x1, + 0x2, + 0x7, + 0x0, + 0x1, + 0x5, + 0x1, + 0x1, + 0x0, + 0x1, + 0x0, + 0x2, + 0x2, + 0x3, + 0x1, + 0x2, + 0x2, + 0x5, + 0x1, + 0xa, + 0x1, + 0x4, + 0x6, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x1, + 0x3, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0xe, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x2, + 0x2, + 0x8, + 0x0, + 0x2, + 0xe, + 0x3, + 0x0, + 0x2, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1, + 0x7, + 0x0, + 0xd, + 0x7, + 0x1, + 0x2, + 0x2, + 0x0, + 0x1, + 0x3, + 0x1, + 0x2, + 0x1, + 0x9, + 0x4, + 0x3, + 0x1, + 0x2, + 0x5, + 0x0, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x1, + 0x8, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x3, + 0x0, + 0x2, + 0x0, + 0x2, + 0xc, + 0x0, + 0x3, + 0x9, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x2, + 0x9, + 0x1, + 0x0, + 0x2, + 0x1, + 0x0, + 0x1, + 0xb, + 0x0, + 0x7, + 0x1, + 0x2, + 0x1, + 0x0, + 0x0, + 0xd, + 0x1, + 0x0, + 0x3, + 0x1, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x2, + 0x2, + 0x3, + 0x2, + 0x1, + 0x1, + 0x2, + 0x3, + 0x2, + 0x2, + 0x0, + 0x9, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x4, + 0x1, + 0x1, + 0x1, + 0x0, + 0x5, + 0x8, + 0x2, + 0x2, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x1, + 0x4, + 0x4, + 0x3, + 0x1, + 0x4, + 0x8, + 0x2, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x3, + 0x0, + 0x2, + 0x5, + 0x0, + 0x5, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x3, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x3, + 0x0, + 0x2, + 0x2, + 0x1, + 0x0, + 0x2, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x1, + 0xb, + 0x0, + 0x4, + 0x1, + 0x1, + 0x1, + 0x0, + 0x2, + 0x1, + 0x1, + 0x3, + 0x0, + 0x0, + 0x2, + 0x1, + 0x3, + 0x7, + 0x1, + 0x3, + 0x1, + 0x0, + 0x9, + 0x3, + 0x0, + 0x2, + 0x0, + 0x1, + 0x3, + 0x0, + 0x0, + 0x0, + 0x3, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0xd, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x8, + 0x1, + 0x0, + 0x1, + 0x8, + 0x6, + 0x0, + 0x1, + 0x2, + 0x1, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x5, + 0x0, + 0x1, + 0x4, + 0x0, + 0x1, + 0x1, + 0x0, + 0x4, + 0x0, + 0x1, + 0x4, + 0x5, + 0x2, + 0x1, + 0x5, + 0x0, + 0x0, + 0x0, + 0x0, + 0x6, + 0x2, + 0xa, + 0x2, + 0x1, + 0x4, + 0x6, + 0x6, + 0x2, + 0x1, + 0x1, + 0x0, + 0x4, + 0x1, + 0x2, + 0x0, + 0x8, + 0x1, + 0x1, + 0x2, + 0x3, + 0x0, + 0x3, + 0x4, + 0x0, + 0x1, + 0x1, + 0x3, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0x4, + 0x2, + 0x3, + 0x4, + 0x2, + 0x0, + 0x1, + 0x2, + 0x1, + 0x1, + 0x2, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x8, + 0x4, + 0x0, + 0x4, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x5, + 0x0, + 0x1, + 0x1, + 0x4, + 0x2, + 0xa, + 0x5, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x2, + 0x2, + 0x2, + 0x2, + 0x1, + 0x1, + 0x4, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x6, + 0x0, + 0x1, + 0x1, + 0x4, + 0x1, + 0x2, + 0x1, + 0x0, + 0x2, + 0x0, + 0x3, + 0x3, + 0x7, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x5, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x2, + 0x4, + 0x1, + 0x1, + 0x6, + 0x3, + 0x0, + 0x0, + 0x2, + 0x2, + 0x4, + 0x0, + 0x2, + 0x1, + 0x3, + 0x2, + 0x4, + 0x1, + 0x2, + 0x2, + 0x0, + 0x0, + 0x0, + 0x7, + 0x2, + 0x3, + 0x0, + 0x0, + 0x2, + 0x4, + 0x0, + 0x1, + 0x0, + 0x0, + 0xb, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x1, + 0x5, + 0x1, + 0x2, + 0x2, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x3, + 0x3, + 0x6, + 0x2, + 0x0, + 0x4, + 0x3, + 0x1, + 0x4, + 0x0, + 0x4, + 0x4, + 0x1, + 0x0, + 0x2, + 0x1, + 0x1, + 0x1, + 0x4, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x1, + 0x0, + 0x6, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0x1, + 0x0, + 0x0, + 0x5, + 0x6, + 0x2, + 0x0, + 0x5, + 0x0, + 0x1, + 0x2, + 0x2, + 0x5, + 0x1, + 0x1, + 0x2, + 0x0, + 0x1, + 0x2, + 0x1, + 0x1, + 0x4, + 0x1, + 0x1, + 0x1, + 0x2, + 0x3, + 0x2, + 0x5, + 0x3, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x3, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x3, + 0x4, +]; +pub(crate) const CANONICAL_DECOMPOSED_KV: &[(u32, &'static [char])] = &[ + (0xfa08, &['\u{884C}']), + (0x2f869, &['\u{5B08}']), + (0x2247, &['\u{2245}', '\u{0338}']), + (0x1f2e, &['\u{0397}', '\u{0313}', '\u{0342}']), + (0x2000, &['\u{2002}']), + (0x1e3c, &['\u{004C}', '\u{032D}']), + (0x164, &['\u{0054}', '\u{030C}']), + (0x2f95b, &['\u{7A4F}']), + (0xf965, &['\u{4FBF}']), + (0x1f3d, &['\u{0399}', '\u{0314}', '\u{0301}']), + (0x2f83a, &['\u{53F1}']), + (0x95b, &['\u{091C}', '\u{093C}']), + (0x1faf, &['\u{03A9}', '\u{0314}', '\u{0342}', '\u{0345}']), + (0x1f0c, &['\u{0391}', '\u{0313}', '\u{0301}']), + (0xf916, &['\u{70D9}']), + (0x4df, &['\u{0437}', '\u{0308}']), + (0x1e2, &['\u{00C6}', '\u{0304}']), + (0x229, &['\u{0065}', '\u{0327}']), + (0xcc, &['\u{0049}', '\u{0300}']), + (0xfa66, &['\u{8FB6}']), + (0x1f39, &['\u{0399}', '\u{0314}']), + (0x1e7a, &['\u{0055}', '\u{0304}', '\u{0308}']), + (0x1f6c, &['\u{03A9}', '\u{0313}', '\u{0301}']), + (0x2f9ef, &['\u{4995}']), + (0x2f8ce, &['\u{3B19}']), + (0xf970, &['\u{6BBA}']), + (0x211, &['\u{0072}', '\u{030F}']), + (0xfa17, &['\u{76CA}']), + (0xfa95, &['\u{6B79}']), + (0xf974, &['\u{82E5}']), + (0x1ea9, &['\u{0061}', '\u{0302}', '\u{0309}']), + (0x4ec, &['\u{042D}', '\u{0308}']), + (0x2f833, &['\u{537F}']), + (0x231, &['\u{006F}', '\u{0307}', '\u{0304}']), + (0xf96c, &['\u{585E}']), + (0xfa5e, &['\u{8279}']), + (0x1ee7, &['\u{0075}', '\u{0309}']), + (0x1e72, &['\u{0055}', '\u{0324}']), + (0x2f914, &['\u{701E}']), + (0x1f64, &['\u{03C9}', '\u{0313}', '\u{0301}']), + (0x343, &['\u{0313}']), + (0x16c, &['\u{0055}', '\u{0306}']), + (0xf94c, &['\u{6A13}']), + (0x2f925, &['\u{7295}']), + (0xf92f, &['\u{52DE}']), + (0x1ff8, &['\u{039F}', '\u{0300}']), + (0xf73, &['\u{0F71}', '\u{0F72}']), + (0x1e15, &['\u{0065}', '\u{0304}', '\u{0300}']), + (0xf930, &['\u{64C4}']), + (0xf9ca, &['\u{6D41}']), + (0x1f3b, &['\u{0399}', '\u{0314}', '\u{0300}']), + (0x1fa2, &['\u{03C9}', '\u{0313}', '\u{0300}', '\u{0345}']), + (0x2f9f6, &['\u{29145}']), + (0x1fc2, &['\u{03B7}', '\u{0300}', '\u{0345}']), + (0x2f8c7, &['\u{3A6C}']), + (0xfabc, &['\u{8B01}']), + (0xfa3f, &['\u{618E}']), + (0x2f9b9, &['\u{870E}']), + (0x1e73, &['\u{0075}', '\u{0324}']), + (0xfa9d, &['\u{77A7}']), + (0x2f952, &['\u{25626}']), + (0xfa5f, &['\u{8457}']), + (0x3060, &['\u{305F}', '\u{3099}']), + (0x2f849, &['\u{55B3}']), + (0x13e, &['\u{006C}', '\u{030C}']), + (0xf99c, &['\u{5217}']), + (0x129, &['\u{0069}', '\u{0303}']), + (0xfa63, &['\u{8B39}']), + (0x2f8c0, &['\u{63C5}']), + (0x1e93, &['\u{007A}', '\u{0323}']), + (0x2fa15, &['\u{9EBB}']), + (0xfb43, &['\u{05E3}', '\u{05BC}']), + (0x2f9d6, &['\u{8D1B}']), + (0xfa50, &['\u{7956}']), + (0xf9ab, &['\u{5DBA}']), + (0x2fa02, &['\u{98E2}']), + (0x16d, &['\u{0075}', '\u{0306}']), + (0x21b, &['\u{0074}', '\u{0326}']), + (0x1ea8, &['\u{0041}', '\u{0302}', '\u{0309}']), + (0x1e64, &['\u{0053}', '\u{0301}', '\u{0307}']), + (0xfa94, &['\u{6756}']), + (0x1f1a, &['\u{0395}', '\u{0313}', '\u{0300}']), + (0x22eb, &['\u{22B3}', '\u{0338}']), + (0x3073, &['\u{3072}', '\u{3099}']), + (0xfad7, &['\u{27ED3}']), + (0xf93d, &['\u{7DA0}']), + (0xf9e0, &['\u{6613}']), + (0x2f870, &['\u{5BF3}']), + (0xdde, &['\u{0DD9}', '\u{0DDF}']), + (0x1fa9, &['\u{03A9}', '\u{0314}', '\u{0345}']), + (0xfa2f, &['\u{96B7}']), + (0xf90a, &['\u{91D1}']), + (0xf937, &['\u{8DEF}']), + (0x2f842, &['\u{5510}']), + (0x307d, &['\u{307B}', '\u{309A}']), + (0x1ef0, &['\u{0055}', '\u{031B}', '\u{0323}']), + (0x1eb8, &['\u{0045}', '\u{0323}']), + (0x1e6c, &['\u{0054}', '\u{0323}']), + (0xfaca, &['\u{97FF}']), + (0xf97b, &['\u{7CE7}']), + (0x2f9fd, &['\u{29496}']), + (0x2f86e, &['\u{5BD8}']), + (0x2f817, &['\u{5197}']), + (0xf93b, &['\u{788C}']), + (0x1fa, &['\u{0041}', '\u{030A}', '\u{0301}']), + (0x115ba, &['\u{115B8}', '\u{115AF}']), + (0x1f73, &['\u{03B5}', '\u{0301}']), + (0xa5a, &['\u{0A17}', '\u{0A3C}']), + (0x1ede, &['\u{004F}', '\u{031B}', '\u{0309}']), + (0x2f8f6, &['\u{6BBB}']), + (0xf928, &['\u{5ECA}']), + (0x1fd0, &['\u{03B9}', '\u{0306}']), + (0xf975, &['\u{63A0}']), + (0x125, &['\u{0068}', '\u{0302}']), + (0x1e2e, &['\u{0049}', '\u{0308}', '\u{0301}']), + (0x387, &['\u{00B7}']), + (0x1d162, &['\u{1D158}', '\u{1D165}', '\u{1D170}']), + (0x2289, &['\u{2287}', '\u{0338}']), + (0x2270, &['\u{2264}', '\u{0338}']), + (0x1f1c, &['\u{0395}', '\u{0313}', '\u{0301}']), + (0xfb4a, &['\u{05EA}', '\u{05BC}']), + (0x1e24, &['\u{0048}', '\u{0323}']), + (0x2f824, &['\u{3515}']), + (0xf907, &['\u{9F9C}']), + (0x2f857, &['\u{5831}']), + (0x1e0d, &['\u{0064}', '\u{0323}']), + (0x1f4a, &['\u{039F}', '\u{0313}', '\u{0300}']), + (0xf9f9, &['\u{7C92}']), + (0xf94b, &['\u{5C62}']), + (0x1e51, &['\u{006F}', '\u{0304}', '\u{0300}']), + (0x4f2, &['\u{0423}', '\u{030B}']), + (0x1e36, &['\u{004C}', '\u{0323}']), + (0x2f9b6, &['\u{8669}']), + (0x4f4, &['\u{0427}', '\u{0308}']), + (0x2f890, &['\u{5EFE}']), + (0x2f97b, &['\u{264DA}']), + (0x2f917, &['\u{704A}']), + (0x38e, &['\u{03A5}', '\u{0301}']), + (0xf9dd, &['\u{5229}']), + (0x2f84f, &['\u{5674}']), + (0x1f9a, &['\u{0397}', '\u{0313}', '\u{0300}', '\u{0345}']), + (0x1d1bc, &['\u{1D1BA}', '\u{1D165}']), + (0x21cf, &['\u{21D2}', '\u{0338}']), + (0xf921, &['\u{5D50}']), + (0x1ee5, &['\u{0075}', '\u{0323}']), + (0x2f99f, &['\u{8457}']), + (0xf9b5, &['\u{4F8B}']), + (0xf9df, &['\u{5C65}']), + (0x1eaf, &['\u{0061}', '\u{0306}', '\u{0301}']), + (0x1e43, &['\u{006D}', '\u{0323}']), + (0x2f975, &['\u{262D9}']), + (0x1fb2, &['\u{03B1}', '\u{0300}', '\u{0345}']), + (0x1e22, &['\u{0048}', '\u{0307}']), + (0x1eea, &['\u{0055}', '\u{031B}', '\u{0300}']), + (0x1ef4, &['\u{0059}', '\u{0323}']), + (0x1f75, &['\u{03B7}', '\u{0301}']), + (0x1d4, &['\u{0075}', '\u{030C}']), + (0xa33, &['\u{0A32}', '\u{0A3C}']), + (0x1e08, &['\u{0043}', '\u{0327}', '\u{0301}']), + (0xf75, &['\u{0F71}', '\u{0F74}']), + (0x2f892, &['\u{22331}']), + (0x1e1b, &['\u{0065}', '\u{0330}']), + (0x11d, &['\u{0067}', '\u{0302}']), + (0x2f8fa, &['\u{6C4E}']), + (0xfb36, &['\u{05D6}', '\u{05BC}']), + (0xf957, &['\u{7DBE}']), + (0x2f828, &['\u{52FA}']), + (0x1e4a, &['\u{004E}', '\u{032D}']), + (0xfa4d, &['\u{7949}']), + (0x122, &['\u{0047}', '\u{0327}']), + (0xf9f8, &['\u{7B20}']), + (0x2f8e1, &['\u{6852}']), + (0x1b41, &['\u{1B3F}', '\u{1B35}']), + (0x2f8e7, &['\u{3B9D}']), + (0x12a, &['\u{0049}', '\u{0304}']), + (0x2f9a0, &['\u{8353}']), + (0xf9a9, &['\u{56F9}']), + (0xfabd, &['\u{8AFE}']), + (0xf9eb, &['\u{533F}']), + (0xfaa2, &['\u{7506}']), + (0xfa76, &['\u{52C7}']), + (0xf973, &['\u{62FE}']), + (0x1e42, &['\u{004D}', '\u{0323}']), + (0x114, &['\u{0045}', '\u{0306}']), + (0x1fa8, &['\u{03A9}', '\u{0313}', '\u{0345}']), + (0xf93, &['\u{0F92}', '\u{0FB7}']), + (0xfad9, &['\u{9F8E}']), + (0x2f9cd, &['\u{46BE}']), + (0x1e58, &['\u{0052}', '\u{0307}']), + (0x2f9d0, &['\u{8AED}']), + (0xfa8f, &['\u{6452}']), + (0xf952, &['\u{52D2}']), + (0xfa6d, &['\u{8218}']), + (0xfb48, &['\u{05E8}', '\u{05BC}']), + (0x2f812, &['\u{2051C}']), + (0x205, &['\u{0065}', '\u{030F}']), + (0x2f8b3, &['\u{621B}']), + (0xa5e, &['\u{0A2B}', '\u{0A3C}']), + (0x1e82, &['\u{0057}', '\u{0301}']), + (0xf991, &['\u{649A}']), + (0x2f839, &['\u{53EB}']), + (0x1e88, &['\u{0057}', '\u{0323}']), + (0xfab8, &['\u{8996}']), + (0x1ec, &['\u{004F}', '\u{0328}', '\u{0304}']), + (0x1eeb, &['\u{0075}', '\u{031B}', '\u{0300}']), + (0xf9d9, &['\u{6144}']), + (0x1fc9, &['\u{0395}', '\u{0301}']), + (0x2f94e, &['\u{784E}']), + (0xfa45, &['\u{6D77}']), + (0x1f06, &['\u{03B1}', '\u{0313}', '\u{0342}']), + (0x2f90d, &['\u{23ED1}']), + (0xbcc, &['\u{0BC6}', '\u{0BD7}']), + (0x1fe4, &['\u{03C1}', '\u{0313}']), + (0xfac3, &['\u{9072}']), + (0x1f27, &['\u{03B7}', '\u{0314}', '\u{0342}']), + (0xf909, &['\u{5951}']), + (0xcb, &['\u{0045}', '\u{0308}']), + (0x1f51, &['\u{03C5}', '\u{0314}']), + (0xfa99, &['\u{6ECB}']), + (0x143, &['\u{004E}', '\u{0301}']), + (0x2f90f, &['\u{6F6E}']), + (0xf988, &['\u{9E97}']), + (0x2f959, &['\u{7A40}']), + (0xf978, &['\u{5169}']), + (0x1e8e, &['\u{0059}', '\u{0307}']), + (0x109, &['\u{0063}', '\u{0302}']), + (0x1e06, &['\u{0042}', '\u{0331}']), + (0x2f81e, &['\u{5203}']), + (0x1eb2, &['\u{0041}', '\u{0306}', '\u{0309}']), + (0x1ecf, &['\u{006F}', '\u{0309}']), + (0x1e10, &['\u{0044}', '\u{0327}']), + (0x1e48, &['\u{004E}', '\u{0331}']), + (0x2f8dd, &['\u{233C3}']), + (0x1e1d, &['\u{0065}', '\u{0327}', '\u{0306}']), + (0xfacf, &['\u{2284A}']), + (0x2f9a8, &['\u{84F1}']), + (0x2f875, &['\u{5C22}']), + (0xf9fa, &['\u{72C0}']), + (0x304c, &['\u{304B}', '\u{3099}']), + (0x2f94d, &['\u{2541D}']), + (0xf9c3, &['\u{907C}']), + (0x2f9c4, &['\u{8863}']), + (0xfa36, &['\u{559D}']), + (0x2f9a3, &['\u{83DC}']), + (0x2f984, &['\u{440B}']), + (0x1134b, &['\u{11347}', '\u{1133E}']), + (0x1f5d, &['\u{03A5}', '\u{0314}', '\u{0301}']), + (0x2f9ab, &['\u{273CA}']), + (0x2f8f1, &['\u{6B54}']), + (0x1ec1, &['\u{0065}', '\u{0302}', '\u{0300}']), + (0xf9b8, &['\u{96B8}']), + (0x400, &['\u{0415}', '\u{0300}']), + (0x1edf, &['\u{006F}', '\u{031B}', '\u{0309}']), + (0x1f84, &['\u{03B1}', '\u{0313}', '\u{0301}', '\u{0345}']), + (0x934, &['\u{0933}', '\u{093C}']), + (0x2f98a, &['\u{2339C}']), + (0x2278, &['\u{2276}', '\u{0338}']), + (0x1e21, &['\u{0067}', '\u{0304}']), + (0x2271, &['\u{2265}', '\u{0338}']), + (0x1ffb, &['\u{03A9}', '\u{0301}']), + (0x30bc, &['\u{30BB}', '\u{3099}']), + (0x2fa03, &['\u{4B33}']), + (0x1f05, &['\u{03B1}', '\u{0314}', '\u{0301}']), + (0x1ee4, &['\u{0055}', '\u{0323}']), + (0x2f8a2, &['\u{391C}']), + (0xf90c, &['\u{5948}']), + (0xfaa1, &['\u{7471}']), + (0x16b, &['\u{0075}', '\u{0304}']), + (0x1d1bd, &['\u{1D1B9}', '\u{1D165}', '\u{1D16E}']), + (0xf969, &['\u{6578}']), + (0x2f911, &['\u{23F8E}']), + (0x2f873, &['\u{5C06}']), + (0x2f965, &['\u{25C80}']), + (0xcd, &['\u{0049}', '\u{0301}']), + (0x2f835, &['\u{7070}']), + (0xf902, &['\u{8ECA}']), + (0x1f32, &['\u{03B9}', '\u{0313}', '\u{0300}']), + (0x1f56, &['\u{03C5}', '\u{0313}', '\u{0342}']), + (0x2f8f8, &['\u{21D0B}']), + (0xf9c5, &['\u{6688}']), + (0x1ec7, &['\u{0065}', '\u{0323}', '\u{0302}']), + (0xf97e, &['\u{91CF}']), + (0xfb4e, &['\u{05E4}', '\u{05BF}']), + (0xf90f, &['\u{7F85}']), + (0x623, &['\u{0627}', '\u{0654}']), + (0x2f8cc, &['\u{66F8}']), + (0x2f82e, &['\u{535A}']), + (0x161, &['\u{0073}', '\u{030C}']), + (0x2f972, &['\u{26228}']), + (0x1f13, &['\u{03B5}', '\u{0314}', '\u{0300}']), + (0xf996, &['\u{7DF4}']), + (0x388, &['\u{0395}', '\u{0301}']), + (0xf9a6, &['\u{7C3E}']), + (0x3074, &['\u{3072}', '\u{309A}']), + (0x1d5, &['\u{0055}', '\u{0308}', '\u{0304}']), + (0x1eac, &['\u{0041}', '\u{0323}', '\u{0302}']), + (0x2274, &['\u{2272}', '\u{0338}']), + (0x1fdb, &['\u{0399}', '\u{0301}']), + (0x3071, &['\u{306F}', '\u{309A}']), + (0x1f9e, &['\u{0397}', '\u{0313}', '\u{0342}', '\u{0345}']), + (0x1f6b, &['\u{03A9}', '\u{0314}', '\u{0300}']), + (0x2f988, &['\u{267B5}']), + (0x2f8a4, &['\u{226D4}']), + (0xf948, &['\u{8CC2}']), + (0xf9ed, &['\u{541D}']), + (0xfaba, &['\u{8AF8}']), + (0x1fcf, &['\u{1FBF}', '\u{0342}']), + (0xe9, &['\u{0065}', '\u{0301}']), + (0x1f30, &['\u{03B9}', '\u{0313}']), + (0x1f87, &['\u{03B1}', '\u{0314}', '\u{0342}', '\u{0345}']), + (0xf968, &['\u{6CCC}']), + (0x2f84b, &['\u{5716}']), + (0xf9a5, &['\u{6BAE}']), + (0x2f93d, &['\u{25044}']), + (0x30b4, &['\u{30B3}', '\u{3099}']), + (0xf9b9, &['\u{60E1}']), + (0x1f36, &['\u{03B9}', '\u{0313}', '\u{0342}']), + (0xff, &['\u{0079}', '\u{0308}']), + (0x2fa12, &['\u{2A105}']), + (0x1fbb, &['\u{0391}', '\u{0301}']), + (0x2f920, &['\u{7228}']), + (0xfa81, &['\u{5B28}']), + (0x1b43, &['\u{1B42}', '\u{1B35}']), + (0xf987, &['\u{9A6A}']), + (0x4e6, &['\u{041E}', '\u{0308}']), + (0x3af, &['\u{03B9}', '\u{0301}']), + (0x2f96c, &['\u{7D63}']), + (0x2f97d, &['\u{8060}']), + (0x215, &['\u{0075}', '\u{030F}']), + (0xfb4c, &['\u{05D1}', '\u{05BF}']), + (0xf98c, &['\u{6B77}']), + (0xb48, &['\u{0B47}', '\u{0B56}']), + (0x2f885, &['\u{5E28}']), + (0xfa79, &['\u{5555}']), + (0x1e87, &['\u{0077}', '\u{0307}']), + (0x2f971, &['\u{4334}']), + (0x45e, &['\u{0443}', '\u{0306}']), + (0x2f92c, &['\u{3EB8}']), + (0xfab3, &['\u{8352}']), + (0x30c5, &['\u{30C4}', '\u{3099}']), + (0x1f10, &['\u{03B5}', '\u{0313}']), + (0xfa86, &['\u{60D8}']), + (0x1e7, &['\u{0067}', '\u{030C}']), + (0x2f8a1, &['\u{393A}']), + (0xfa5a, &['\u{7F72}']), + (0x1fce, &['\u{1FBF}', '\u{0301}']), + (0x232a, &['\u{3009}']), + (0x2f964, &['\u{4227}']), + (0xf933, &['\u{76E7}']), + (0x2f938, &['\u{7570}']), + (0x2f872, &['\u{5BFF}']), + (0x1f50, &['\u{03C5}', '\u{0313}']), + (0x2fa0b, &['\u{9C40}']), + (0xfb1d, &['\u{05D9}', '\u{05B4}']), + (0x3aa, &['\u{0399}', '\u{0308}']), + (0xf981, &['\u{5973}']), + (0x2f8e2, &['\u{6885}']), + (0x1ebd, &['\u{0065}', '\u{0303}']), + (0x1e0b, &['\u{0064}', '\u{0307}']), + (0xfb3a, &['\u{05DA}', '\u{05BC}']), + (0x1e62, &['\u{0053}', '\u{0323}']), + (0x2f85d, &['\u{591A}']), + (0xfa4e, &['\u{7948}']), + (0x1f22, &['\u{03B7}', '\u{0313}', '\u{0300}']), + (0x2fa16, &['\u{4D56}']), + (0x2f855, &['\u{578B}']), + (0x2f98f, &['\u{8291}']), + (0x2f9f3, &['\u{96C3}']), + (0x1f6f, &['\u{03A9}', '\u{0314}', '\u{0342}']), + (0x1e7f, &['\u{0076}', '\u{0323}']), + (0x2f8d1, &['\u{3AE4}']), + (0xfa9f, &['\u{72AF}']), + (0x1f0, &['\u{006A}', '\u{030C}']), + (0x1ea4, &['\u{0041}', '\u{0302}', '\u{0301}']), + (0x14c, &['\u{004F}', '\u{0304}']), + (0x1ea6, &['\u{0041}', '\u{0302}', '\u{0300}']), + (0x2f9c9, &['\u{88FA}']), + (0x1f92, &['\u{03B7}', '\u{0313}', '\u{0300}', '\u{0345}']), + (0x2f94f, &['\u{788C}']), + (0xf963, &['\u{5317}']), + (0xf905, &['\u{4E32}']), + (0xfa8c, &['\u{6234}']), + (0x2f8d0, &['\u{3B08}']), + (0xfac0, &['\u{8B8A}']), + (0x226e, &['\u{003C}', '\u{0338}']), + (0x1fc6, &['\u{03B7}', '\u{0342}']), + (0x1fb0, &['\u{03B1}', '\u{0306}']), + (0xb94, &['\u{0B92}', '\u{0BD7}']), + (0x2f93f, &['\u{4008}']), + (0x2f810, &['\u{5164}']), + (0x4ef, &['\u{0443}', '\u{0304}']), + (0x1fda, &['\u{0399}', '\u{0300}']), + (0x2f864, &['\u{5A27}']), + (0x145, &['\u{004E}', '\u{0327}']), + (0x2f955, &['\u{256C5}']), + (0x1fbc, &['\u{0391}', '\u{0345}']), + (0xfab6, &['\u{8941}']), + (0x1e60, &['\u{0053}', '\u{0307}']), + (0x2f86a, &['\u{5B3E}']), + (0xcca, &['\u{0CC6}', '\u{0CC2}']), + (0xeb, &['\u{0065}', '\u{0308}']), + (0x17b, &['\u{005A}', '\u{0307}']), + (0x30ac, &['\u{30AB}', '\u{3099}']), + (0x2f949, &['\u{4039}']), + (0x214, &['\u{0055}', '\u{030F}']), + (0x2f8d5, &['\u{669C}']), + (0x2f825, &['\u{52C7}']), + (0x2fa19, &['\u{9F05}']), + (0x1e8, &['\u{004B}', '\u{030C}']), + (0x22ed, &['\u{22B5}', '\u{0338}']), + (0x2f83e, &['\u{5448}']), + (0x2f9ce, &['\u{46C7}']), + (0xf986, &['\u{95AD}']), + (0x1fcb, &['\u{0397}', '\u{0301}']), + (0x119, &['\u{0065}', '\u{0328}']), + (0xe5, &['\u{0061}', '\u{030A}']), + (0x4e4, &['\u{0418}', '\u{0308}']), + (0x2f8be, &['\u{22BF1}']), + (0x2f823, &['\u{5277}']), + (0xfaa0, &['\u{732A}']), + (0x2f8e6, &['\u{6914}']), + (0x1f08, &['\u{0391}', '\u{0313}']), + (0x2001, &['\u{2003}']), + (0xf9cc, &['\u{7409}']), + (0x2f88f, &['\u{2A392}']), + (0x1f0d, &['\u{0391}', '\u{0314}', '\u{0301}']), + (0x1e2c, &['\u{0049}', '\u{0330}']), + (0xf926, &['\u{81D8}']), + (0xfa51, &['\u{795D}']), + (0xf9b0, &['\u{8046}']), + (0x453, &['\u{0433}', '\u{0301}']), + (0x1e74, &['\u{0055}', '\u{0330}']), + (0x2f977, &['\u{2633E}']), + (0x2f87f, &['\u{5D6B}']), + (0x1e20, &['\u{0047}', '\u{0304}']), + (0xf989, &['\u{9ECE}']), + (0x176, &['\u{0059}', '\u{0302}']), + (0x2f989, &['\u{23393}']), + (0xfb34, &['\u{05D4}', '\u{05BC}']), + (0x2fa10, &['\u{2A0CE}']), + (0xf96e, &['\u{8449}']), + (0x1fb9, &['\u{0391}', '\u{0304}']), + (0x4de, &['\u{0417}', '\u{0308}']), + (0x2fa0e, &['\u{4CED}']), + (0xf964, &['\u{78FB}']), + (0x2f87e, &['\u{5D6E}']), + (0x4e7, &['\u{043E}', '\u{0308}']), + (0x2f8fe, &['\u{6C67}']), + (0x1d2, &['\u{006F}', '\u{030C}']), + (0x1f41, &['\u{03BF}', '\u{0314}']), + (0x1f77, &['\u{03B9}', '\u{0301}']), + (0x1fa4, &['\u{03C9}', '\u{0313}', '\u{0301}', '\u{0345}']), + (0xfa8d, &['\u{63C4}']), + (0x1f8f, &['\u{0391}', '\u{0314}', '\u{0342}', '\u{0345}']), + (0x2f997, &['\u{26B3C}']), + (0x1eb, &['\u{006F}', '\u{0328}']), + (0x1e4f, &['\u{006F}', '\u{0303}', '\u{0308}']), + (0xf993, &['\u{7149}']), + (0xfa9e, &['\u{7235}']), + (0x1ebc, &['\u{0045}', '\u{0303}']), + (0x2f8bf, &['\u{6422}']), + (0xf9cb, &['\u{6E9C}']), + (0x2f8d4, &['\u{6700}']), + (0x2281, &['\u{227B}', '\u{0338}']), + (0x1e0e, &['\u{0044}', '\u{0331}']), + (0xf95d, &['\u{8AFE}']), + (0x2f8a5, &['\u{60C7}']), + (0x22f, &['\u{006F}', '\u{0307}']), + (0x2f850, &['\u{5207}']), + (0x2f826, &['\u{52C9}']), + (0xf972, &['\u{6C88}']), + (0x1e25, &['\u{0068}', '\u{0323}']), + (0x4c2, &['\u{0436}', '\u{0306}']), + (0x2f852, &['\u{57CE}']), + (0x1d1bf, &['\u{1D1B9}', '\u{1D165}', '\u{1D16F}']), + (0x390, &['\u{03B9}', '\u{0308}', '\u{0301}']), + (0x40e, &['\u{0423}', '\u{0306}']), + (0x419, &['\u{0418}', '\u{0306}']), + (0x2f8e9, &['\u{69A3}']), + (0xf959, &['\u{9675}']), + (0x1f25, &['\u{03B7}', '\u{0314}', '\u{0301}']), + (0xfa31, &['\u{50E7}']), + (0x124, &['\u{0048}', '\u{0302}']), + (0xfa34, &['\u{52E4}']), + (0x2f967, &['\u{42A0}']), + (0x1e9, &['\u{006B}', '\u{030C}']), + (0x1f74, &['\u{03B7}', '\u{0300}']), + (0x2f910, &['\u{23F5E}']), + (0xfa8b, &['\u{61F2}']), + (0x1ee3, &['\u{006F}', '\u{031B}', '\u{0323}']), + (0x1e8c, &['\u{0058}', '\u{0308}']), + (0x3ad, &['\u{03B5}', '\u{0301}']), + (0xfa2c, &['\u{9928}']), + (0x2f8b9, &['\u{633D}']), + (0xf99b, &['\u{934A}']), + (0xe8, &['\u{0065}', '\u{0300}']), + (0x179, &['\u{005A}', '\u{0301}']), + (0x2fa00, &['\u{9829}']), + (0x2f94a, &['\u{778B}']), + (0x1d15e, &['\u{1D157}', '\u{1D165}']), + (0x114bc, &['\u{114B9}', '\u{114B0}']), + (0x1fd, &['\u{00E6}', '\u{0301}']), + (0x2f8c6, &['\u{6477}']), + (0xf69, &['\u{0F40}', '\u{0FB5}']), + (0x1d1bb, &['\u{1D1B9}', '\u{1D165}']), + (0x10f, &['\u{0064}', '\u{030C}']), + (0x1e63, &['\u{0073}', '\u{0323}']), + (0x1fd3, &['\u{03B9}', '\u{0308}', '\u{0301}']), + (0x1fb6, &['\u{03B1}', '\u{0342}']), + (0x2f8cb, &['\u{65E3}']), + (0x2f92b, &['\u{73A5}']), + (0x2f9a9, &['\u{84F3}']), + (0x386, &['\u{0391}', '\u{0301}']), + (0x2f95f, &['\u{7AEE}']), + (0x4d7, &['\u{0435}', '\u{0306}']), + (0x1f53, &['\u{03C5}', '\u{0314}', '\u{0300}']), + (0x1e17, &['\u{0065}', '\u{0304}', '\u{0301}']), + (0x2f907, &['\u{6D34}']), + (0x2f980, &['\u{2335F}']), + (0xf94a, &['\u{58D8}']), + (0x2f88e, &['\u{5ECA}']), + (0xf917, &['\u{73DE}']), + (0x2f88c, &['\u{5EB3}']), + (0x1f09, &['\u{0391}', '\u{0314}']), + (0x2f815, &['\u{518D}']), + (0x2f9ca, &['\u{34BB}']), + (0x307c, &['\u{307B}', '\u{3099}']), + (0x2f9f9, &['\u{4A76}']), + (0xfa01, &['\u{5EA6}']), + (0x106, &['\u{0043}', '\u{0301}']), + (0x1ebf, &['\u{0065}', '\u{0302}', '\u{0301}']), + (0x1f38, &['\u{0399}', '\u{0313}']), + (0x2f99c, &['\u{8323}']), + (0x1fe8, &['\u{03A5}', '\u{0306}']), + (0x1ef5, &['\u{0079}', '\u{0323}']), + (0x2f82d, &['\u{5351}']), + (0x1e00, &['\u{0041}', '\u{0325}']), + (0x1edb, &['\u{006F}', '\u{031B}', '\u{0301}']), + (0xfac2, &['\u{8F38}']), + (0x22e0, &['\u{227C}', '\u{0338}']), + (0x1f9d, &['\u{0397}', '\u{0314}', '\u{0301}', '\u{0345}']), + (0x2f9af, &['\u{4561}']), + (0x1fa3, &['\u{03C9}', '\u{0314}', '\u{0300}', '\u{0345}']), + (0x1ed1, &['\u{006F}', '\u{0302}', '\u{0301}']), + (0xf76, &['\u{0FB2}', '\u{0F80}']), + (0x2f8e3, &['\u{2346D}']), + (0x1fcc, &['\u{0397}', '\u{0345}']), + (0x1f54, &['\u{03C5}', '\u{0313}', '\u{0301}']), + (0xf98d, &['\u{8F62}']), + (0x13c, &['\u{006C}', '\u{0327}']), + (0x1f89, &['\u{0391}', '\u{0314}', '\u{0345}']), + (0xfb35, &['\u{05D5}', '\u{05BC}']), + (0x2f80e, &['\u{514D}']), + (0x2f887, &['\u{5E69}']), + (0xfa0a, &['\u{898B}']), + (0x2f91b, &['\u{20525}']), + (0x22e, &['\u{004F}', '\u{0307}']), + (0x1eee, &['\u{0055}', '\u{031B}', '\u{0303}']), + (0x15c, &['\u{0053}', '\u{0302}']), + (0x2f8fb, &['\u{23CBC}']), + (0xe3, &['\u{0061}', '\u{0303}']), + (0x1f01, &['\u{03B1}', '\u{0314}']), + (0x3079, &['\u{3078}', '\u{3099}']), + (0x2f974, &['\u{4359}']), + (0x2f882, &['\u{5DE2}']), + (0x2f99b, &['\u{83AD}']), + (0x220c, &['\u{220B}', '\u{0338}']), + (0x1e75, &['\u{0075}', '\u{0330}']), + (0xfa46, &['\u{6E1A}']), + (0x2f922, &['\u{7250}']), + (0x30ba, &['\u{30B9}', '\u{3099}']), + (0xf9cd, &['\u{7559}']), + (0x3058, &['\u{3057}', '\u{3099}']), + (0xfa05, &['\u{6D1E}']), + (0x2f9b2, &['\u{456B}']), + (0xf9ac, &['\u{601C}']), + (0xfa7e, &['\u{5944}']), + (0x1f2d, &['\u{0397}', '\u{0314}', '\u{0301}']), + (0x2f867, &['\u{36EE}']), + (0x1f8c, &['\u{0391}', '\u{0313}', '\u{0301}', '\u{0345}']), + (0xf97d, &['\u{8AD2}']), + (0x1e76, &['\u{0055}', '\u{032D}']), + (0x2f8f4, &['\u{6B9F}']), + (0x2226, &['\u{2225}', '\u{0338}']), + (0x1e7d, &['\u{0076}', '\u{0303}']), + (0xfac8, &['\u{9756}']), + (0x1a0, &['\u{004F}', '\u{031B}']), + (0x2f802, &['\u{4E41}']), + (0x1f8a, &['\u{0391}', '\u{0313}', '\u{0300}', '\u{0345}']), + (0x1e13, &['\u{0064}', '\u{032D}']), + (0xfa2b, &['\u{98FC}']), + (0x2f8c5, &['\u{649D}']), + (0x2f91f, &['\u{243AB}']), + (0xfa73, &['\u{4F80}']), + (0x14e, &['\u{004F}', '\u{0306}']), + (0xf998, &['\u{8F26}']), + (0xf94d, &['\u{6DDA}']), + (0xfad5, &['\u{25249}']), + (0xf92b, &['\u{72FC}']), + (0x2f853, &['\u{57F4}']), + (0x1e98, &['\u{0077}', '\u{030A}']), + (0xfa8a, &['\u{6160}']), + (0xfa69, &['\u{97FF}']), + (0x230, &['\u{004F}', '\u{0307}', '\u{0304}']), + (0x1fe3, &['\u{03C5}', '\u{0308}', '\u{0301}']), + (0x1f12, &['\u{03B5}', '\u{0313}', '\u{0300}']), + (0x2f9c7, &['\u{88DE}']), + (0x2241, &['\u{223C}', '\u{0338}']), + (0xfa10, &['\u{585A}']), + (0xf9af, &['\u{7F9A}']), + (0xfa80, &['\u{5A62}']), + (0xf9e2, &['\u{68A8}']), + (0x1fed, &['\u{00A8}', '\u{0300}']), + (0x2f926, &['\u{24735}']), + (0xce, &['\u{0049}', '\u{0302}']), + (0x21f, &['\u{0068}', '\u{030C}']), + (0xfa92, &['\u{6717}']), + (0xfa65, &['\u{8D08}']), + (0x1fba, &['\u{0391}', '\u{0300}']), + (0xf9a0, &['\u{88C2}']), + (0x1f03, &['\u{03B1}', '\u{0314}', '\u{0300}']), + (0x1d15f, &['\u{1D158}', '\u{1D165}']), + (0xfabe, &['\u{8AED}']), + (0x2f841, &['\u{54F6}']), + (0x1fb1, &['\u{03B1}', '\u{0304}']), + (0x2f819, &['\u{4ECC}']), + (0xf95e, &['\u{4E39}']), + (0xf9f5, &['\u{6DCB}']), + (0x1f14, &['\u{03B5}', '\u{0313}', '\u{0301}']), + (0x17c, &['\u{007A}', '\u{0307}']), + (0x1e39, &['\u{006C}', '\u{0323}', '\u{0304}']), + (0x1ef7, &['\u{0079}', '\u{0309}']), + (0xfad1, &['\u{233D5}']), + (0x1f18, &['\u{0395}', '\u{0313}']), + (0xf57, &['\u{0F56}', '\u{0FB7}']), + (0x148, &['\u{006E}', '\u{030C}']), + (0x2f9a4, &['\u{26C36}']), + (0x157, &['\u{0072}', '\u{0327}']), + (0x385, &['\u{00A8}', '\u{0301}']), + (0x30f4, &['\u{30A6}', '\u{3099}']), + (0xfa90, &['\u{6556}']), + (0x2f947, &['\u{771F}']), + (0xf979, &['\u{51C9}']), + (0x1de, &['\u{0041}', '\u{0308}', '\u{0304}']), + (0x212a, &['\u{004B}']), + (0x2f9e4, &['\u{9111}']), + (0x1e18, &['\u{0045}', '\u{032D}']), + (0x2f8eb, &['\u{6AA8}']), + (0x1fe1, &['\u{03C5}', '\u{0304}']), + (0x2f9ea, &['\u{927C}']), + (0x228, &['\u{0045}', '\u{0327}']), + (0x11b, &['\u{0065}', '\u{030C}']), + (0x1f6d, &['\u{03A9}', '\u{0314}', '\u{0301}']), + (0x11f, &['\u{0067}', '\u{0306}']), + (0x2f93c, &['\u{24FB8}']), + (0x2f94b, &['\u{4046}']), + (0x1ed, &['\u{006F}', '\u{0328}', '\u{0304}']), + (0xea, &['\u{0065}', '\u{0302}']), + (0x38c, &['\u{039F}', '\u{0301}']), + (0xfa0c, &['\u{5140}']), + (0x154, &['\u{0052}', '\u{0301}']), + (0x1f23, &['\u{03B7}', '\u{0314}', '\u{0300}']), + (0x1f9c, &['\u{0397}', '\u{0313}', '\u{0301}', '\u{0345}']), + (0x1f7c, &['\u{03C9}', '\u{0300}']), + (0x1fa1, &['\u{03C9}', '\u{0314}', '\u{0345}']), + (0x1e41, &['\u{006D}', '\u{0307}']), + (0x2f8ed, &['\u{6ADB}']), + (0x2f981, &['\u{43D5}']), + (0x171, &['\u{0075}', '\u{030B}']), + (0x1e16, &['\u{0045}', '\u{0304}', '\u{0301}']), + (0x120, &['\u{0047}', '\u{0307}']), + (0x1fcd, &['\u{1FBF}', '\u{0300}']), + (0x2f915, &['\u{701B}']), + (0xf935, &['\u{8606}']), + (0x2f9b0, &['\u{26FB1}']), + (0x2f937, &['\u{24C92}']), + (0xf932, &['\u{7210}']), + (0x219b, &['\u{2192}', '\u{0338}']), + (0x2f86d, &['\u{5BC3}']), + (0x151, &['\u{006F}', '\u{030B}']), + (0x1e40, &['\u{004D}', '\u{0307}']), + (0x135, &['\u{006A}', '\u{0302}']), + (0x1ed7, &['\u{006F}', '\u{0302}', '\u{0303}']), + (0x4e5, &['\u{0438}', '\u{0308}']), + (0x1026, &['\u{1025}', '\u{102E}']), + (0x2f84d, &['\u{5717}']), + (0xfa3b, &['\u{5C64}']), + (0x1f34, &['\u{03B9}', '\u{0313}', '\u{0301}']), + (0x2f88d, &['\u{5EB6}']), + (0x2f9cc, &['\u{27966}']), + (0x2f906, &['\u{23D1E}']), + (0xfa98, &['\u{6EDB}']), + (0x2f901, &['\u{6D77}']), + (0x304e, &['\u{304D}', '\u{3099}']), + (0x1e96, &['\u{0068}', '\u{0331}']), + (0xfa60, &['\u{8910}']), + (0xfa62, &['\u{8B01}']), + (0x2f8c3, &['\u{6469}']), + (0x113, &['\u{0065}', '\u{0304}']), + (0x1eca, &['\u{0049}', '\u{0323}']), + (0x1e85, &['\u{0077}', '\u{0308}']), + (0x2f99a, &['\u{8363}']), + (0x15f, &['\u{0073}', '\u{0327}']), + (0x2f8f7, &['\u{23A8D}']), + (0x2fa13, &['\u{2A20E}']), + (0x1e0c, &['\u{0044}', '\u{0323}']), + (0xf1, &['\u{006E}', '\u{0303}']), + (0x2f94c, &['\u{4096}']), + (0xf919, &['\u{916A}']), + (0x1eba, &['\u{0045}', '\u{0309}']), + (0xfb32, &['\u{05D2}', '\u{05BC}']), + (0x1ea2, &['\u{0041}', '\u{0309}']), + (0xfa6b, &['\u{6075}']), + (0xfa1c, &['\u{9756}']), + (0x2f821, &['\u{5246}']), + (0x1dc, &['\u{0075}', '\u{0308}', '\u{0300}']), + (0xf9b2, &['\u{96F6}']), + (0xf94e, &['\u{6F0F}']), + (0x2f929, &['\u{738B}']), + (0x1f0b, &['\u{0391}', '\u{0314}', '\u{0300}']), + (0x305e, &['\u{305D}', '\u{3099}']), + (0x1e78, &['\u{0055}', '\u{0303}', '\u{0301}']), + (0x1b3b, &['\u{1B3A}', '\u{1B35}']), + (0x175, &['\u{0077}', '\u{0302}']), + (0x11c, &['\u{0047}', '\u{0302}']), + (0x2f982, &['\u{80B2}']), + (0xf945, &['\u{807E}']), + (0x2f973, &['\u{26247}']), + (0xfa3a, &['\u{58A8}']), + (0x3cd, &['\u{03C5}', '\u{0301}']), + (0x2f9d5, &['\u{8CC1}']), + (0xf967, &['\u{4E0D}']), + (0x1b0e, &['\u{1B0D}', '\u{1B35}']), + (0xfad3, &['\u{4018}']), + (0x2f836, &['\u{53CA}']), + (0xf92d, &['\u{4F86}']), + (0x1f4b, &['\u{039F}', '\u{0314}', '\u{0300}']), + (0xfa49, &['\u{722B}']), + (0xfa89, &['\u{618E}']), + (0xf9a8, &['\u{4EE4}']), + (0xf91d, &['\u{6B04}']), + (0x2f803, &['\u{20122}']), + (0x1e27, &['\u{0068}', '\u{0308}']), + (0xf938, &['\u{9732}']), + (0xfa9c, &['\u{716E}']), + (0x2f919, &['\u{7077}']), + (0x1ed5, &['\u{006F}', '\u{0302}', '\u{0309}']), + (0x2f843, &['\u{5553}']), + (0xf985, &['\u{792A}']), + (0xf97c, &['\u{826F}']), + (0x2f8ba, &['\u{62FC}']), + (0x147, &['\u{004E}', '\u{030C}']), + (0x2f9ba, &['\u{86E2}']), + (0x1ef8, &['\u{0059}', '\u{0303}']), + (0x1e8a, &['\u{0058}', '\u{0307}']), + (0x1f5b, &['\u{03A5}', '\u{0314}', '\u{0300}']), + (0x2f950, &['\u{78CC}']), + (0x177, &['\u{0079}', '\u{0302}']), + (0xfa6c, &['\u{242EE}']), + (0xe2, &['\u{0061}', '\u{0302}']), + (0x1e89, &['\u{0077}', '\u{0323}']), + (0xfa74, &['\u{5145}']), + (0x1f59, &['\u{03A5}', '\u{0314}']), + (0x30d7, &['\u{30D5}', '\u{309A}']), + (0xfa70, &['\u{4E26}']), + (0xfb41, &['\u{05E1}', '\u{05BC}']), + (0x2f879, &['\u{5CC0}']), + (0x2f8b7, &['\u{6350}']), + (0xf9db, &['\u{7387}']), + (0x624, &['\u{0648}', '\u{0654}']), + (0xf900, &['\u{8C48}']), + (0x16f, &['\u{0075}', '\u{030A}']), + (0x1f97, &['\u{03B7}', '\u{0314}', '\u{0342}', '\u{0345}']), + (0x2f931, &['\u{7485}']), + (0x2f956, &['\u{798F}']), + (0xf91e, &['\u{721B}']), + (0x2f9aa, &['\u{8516}']), + (0x1af, &['\u{0055}', '\u{031B}']), + (0xfb2c, &['\u{05E9}', '\u{05BC}', '\u{05C1}']), + (0x1e66, &['\u{0053}', '\u{030C}', '\u{0307}']), + (0x2f903, &['\u{6D69}']), + (0x2f963, &['\u{7BC9}']), + (0x2f8ea, &['\u{69EA}']), + (0x1f11, &['\u{03B5}', '\u{0314}']), + (0x1fb3, &['\u{03B1}', '\u{0345}']), + (0x1f29, &['\u{0397}', '\u{0314}']), + (0x1eb0, &['\u{0041}', '\u{0306}', '\u{0300}']), + (0x1ff6, &['\u{03C9}', '\u{0342}']), + (0x2f9fc, &['\u{4AB2}']), + (0x1ee9, &['\u{0075}', '\u{031B}', '\u{0301}']), + (0xf939, &['\u{9B6F}']), + (0xd2, &['\u{004F}', '\u{0300}']), + (0xfb44, &['\u{05E4}', '\u{05BC}']), + (0x2f8c8, &['\u{654F}']), + (0x2f9e8, &['\u{92D7}']), + (0x1f33, &['\u{03B9}', '\u{0314}', '\u{0300}']), + (0xf936, &['\u{865C}']), + (0x1fec, &['\u{03A1}', '\u{0314}']), + (0xf9aa, &['\u{5BE7}']), + (0xfa37, &['\u{5606}']), + (0x2f927, &['\u{24814}']), + (0x17d, &['\u{005A}', '\u{030C}']), + (0x1e70, &['\u{0054}', '\u{032D}']), + (0x2f948, &['\u{774A}']), + (0x3076, &['\u{3075}', '\u{3099}']), + (0x2f954, &['\u{2569A}']), + (0xfa2, &['\u{0FA1}', '\u{0FB7}']), + (0x107, &['\u{0063}', '\u{0301}']), + (0x2f809, &['\u{5099}']), + (0x2f936, &['\u{753E}']), + (0x1eae, &['\u{0041}', '\u{0306}', '\u{0301}']), + (0x340, &['\u{0300}']), + (0x1e01, &['\u{0061}', '\u{0325}']), + (0x1f1b, &['\u{0395}', '\u{0314}', '\u{0300}']), + (0x2f829, &['\u{5305}']), + (0x103, &['\u{0061}', '\u{0306}']), + (0xfa1e, &['\u{7FBD}']), + (0x2f95e, &['\u{25AA7}']), + (0xf92c, &['\u{90CE}']), + (0x1e12, &['\u{0044}', '\u{032D}']), + (0xf9d5, &['\u{5D19}']), + (0x2f939, &['\u{2219F}']), + (0xf913, &['\u{908F}']), + (0x1f42, &['\u{03BF}', '\u{0313}', '\u{0300}']), + (0xf3, &['\u{006F}', '\u{0301}']), + (0xf911, &['\u{87BA}']), + (0x2f87d, &['\u{21DE6}']), + (0x1fae, &['\u{03A9}', '\u{0313}', '\u{0342}', '\u{0345}']), + (0x2f847, &['\u{5599}']), + (0x1e1c, &['\u{0045}', '\u{0327}', '\u{0306}']), + (0x11e, &['\u{0047}', '\u{0306}']), + (0x1f91, &['\u{03B7}', '\u{0314}', '\u{0345}']), + (0xa59, &['\u{0A16}', '\u{0A3C}']), + (0x1f0e, &['\u{0391}', '\u{0313}', '\u{0342}']), + (0x1e95, &['\u{007A}', '\u{0331}']), + (0x2f92a, &['\u{3EAC}']), + (0x219, &['\u{0073}', '\u{0326}']), + (0x2f8d9, &['\u{671B}']), + (0x2f913, &['\u{7039}']), + (0x206, &['\u{0045}', '\u{0311}']), + (0x3cb, &['\u{03C5}', '\u{0308}']), + (0xf9dc, &['\u{9686}']), + (0xfb2d, &['\u{05E9}', '\u{05BC}', '\u{05C2}']), + (0x22b, &['\u{006F}', '\u{0308}', '\u{0304}']), + (0xf92e, &['\u{51B7}']), + (0xf9e6, &['\u{7F79}']), + (0x1f8e, &['\u{0391}', '\u{0313}', '\u{0342}', '\u{0345}']), + (0x2f806, &['\u{4FBB}']), + (0xfa84, &['\u{5F69}']), + (0x2f8b4, &['\u{625D}']), + (0x2f9cb, &['\u{278AE}']), + (0x15d, &['\u{0073}', '\u{0302}']), + (0x1ee6, &['\u{0055}', '\u{0309}']), + (0x1e6e, &['\u{0054}', '\u{0331}']), + (0xfa2d, &['\u{9DB4}']), + (0x30f7, &['\u{30EF}', '\u{3099}']), + (0xf977, &['\u{4EAE}']), + (0xfac4, &['\u{9199}']), + (0xf9, &['\u{0075}', '\u{0300}']), + (0x2f89c, &['\u{5F9A}']), + (0x2f908, &['\u{6E2F}']), + (0xf9e3, &['\u{6CE5}']), + (0x1fe2, &['\u{03C5}', '\u{0308}', '\u{0300}']), + (0xed, &['\u{0069}', '\u{0301}']), + (0x12f, &['\u{0069}', '\u{0328}']), + (0x4ed, &['\u{044D}', '\u{0308}']), + (0x2f9d4, &['\u{8CAB}']), + (0x110ab, &['\u{110A5}', '\u{110BA}']), + (0x2f9e6, &['\u{911B}']), + (0x2285, &['\u{2283}', '\u{0338}']), + (0xfa4a, &['\u{7422}']), + (0x1e79, &['\u{0075}', '\u{0303}', '\u{0301}']), + (0x3054, &['\u{3053}', '\u{3099}']), + (0xfa5b, &['\u{8005}']), + (0x4f3, &['\u{0443}', '\u{030B}']), + (0x2f8b2, &['\u{6210}']), + (0x1f7b, &['\u{03C5}', '\u{0301}']), + (0x1f7a, &['\u{03C5}', '\u{0300}']), + (0x1e5c, &['\u{0052}', '\u{0323}', '\u{0304}']), + (0x174, &['\u{0057}', '\u{0302}']), + (0x134, &['\u{004A}', '\u{0302}']), + (0x1db, &['\u{0055}', '\u{0308}', '\u{0300}']), + (0x1fa7, &['\u{03C9}', '\u{0314}', '\u{0342}', '\u{0345}']), + (0x2fa0d, &['\u{4CCE}']), + (0x1a1, &['\u{006F}', '\u{031B}']), + (0x21cd, &['\u{21D0}', '\u{0338}']), + (0x1e4b, &['\u{006E}', '\u{032D}']), + (0x40c, &['\u{041A}', '\u{0301}']), + (0x2f8b0, &['\u{61F2}']), + (0x2f92d, &['\u{3EB8}']), + (0x2f8d7, &['\u{43D9}']), + (0xf9fb, &['\u{7099}']), + (0x2f878, &['\u{5C6E}']), + (0x217, &['\u{0075}', '\u{0311}']), + (0x1eb7, &['\u{0061}', '\u{0323}', '\u{0306}']), + (0xc8, &['\u{0045}', '\u{0300}']), + (0xfa16, &['\u{732A}']), + (0x2f9e2, &['\u{9094}']), + (0x625, &['\u{0627}', '\u{0655}']), + (0x1e1, &['\u{0061}', '\u{0307}', '\u{0304}']), + (0x165, &['\u{0074}', '\u{030C}']), + (0x1e28, &['\u{0048}', '\u{0327}']), + (0x1fb7, &['\u{03B1}', '\u{0342}', '\u{0345}']), + (0x1f8d, &['\u{0391}', '\u{0314}', '\u{0301}', '\u{0345}']), + (0x2f8f2, &['\u{3C4E}']), + (0x2f9df, &['\u{8F38}']), + (0x2288, &['\u{2286}', '\u{0338}']), + (0x2f859, &['\u{214E4}']), + (0x2f883, &['\u{382F}']), + (0x1f3e, &['\u{0399}', '\u{0313}', '\u{0342}']), + (0x22ad, &['\u{22A8}', '\u{0338}']), + (0x2f85e, &['\u{5922}']), + (0x2f9b5, &['\u{8667}']), + (0xe7, &['\u{0063}', '\u{0327}']), + (0x1e6a, &['\u{0054}', '\u{0307}']), + (0x1f95, &['\u{03B7}', '\u{0314}', '\u{0301}', '\u{0345}']), + (0x2f9da, &['\u{8DCB}']), + (0x1e7b, &['\u{0075}', '\u{0304}', '\u{0308}']), + (0x2f814, &['\u{5167}']), + (0xf9bf, &['\u{6A02}']), + (0x1e90, &['\u{005A}', '\u{0302}']), + (0x1eaa, &['\u{0041}', '\u{0302}', '\u{0303}']), + (0xf81, &['\u{0F71}', '\u{0F80}']), + (0xf9f1, &['\u{96A3}']), + (0x1e31, &['\u{006B}', '\u{0301}']), + (0x2f97a, &['\u{8005}']), + (0x2f966, &['\u{7CD2}']), + (0x2f834, &['\u{20A2C}']), + (0x1f4, &['\u{0047}', '\u{0301}']), + (0x1fad, &['\u{03A9}', '\u{0314}', '\u{0301}', '\u{0345}']), + (0x1f43, &['\u{03BF}', '\u{0314}', '\u{0300}']), + (0xfa83, &['\u{5ED9}']), + (0x2f863, &['\u{5A1B}']), + (0x1f8b, &['\u{0391}', '\u{0314}', '\u{0300}', '\u{0345}']), + (0x1df, &['\u{0061}', '\u{0308}', '\u{0304}']), + (0xfa04, &['\u{5B85}']), + (0xbca, &['\u{0BC6}', '\u{0BBE}']), + (0x626, &['\u{064A}', '\u{0654}']), + (0x210, &['\u{0052}', '\u{030F}']), + (0x2f8a6, &['\u{6148}']), + (0x2fa1b, &['\u{9F16}']), + (0xfa78, &['\u{559D}']), + (0x95f, &['\u{092F}', '\u{093C}']), + (0x2f9d8, &['\u{27F2F}']), + (0x1ea5, &['\u{0061}', '\u{0302}', '\u{0301}']), + (0xddd, &['\u{0DD9}', '\u{0DCF}', '\u{0DCA}']), + (0x30d0, &['\u{30CF}', '\u{3099}']), + (0x374, &['\u{02B9}']), + (0x2f9b8, &['\u{8688}']), + (0x2f886, &['\u{5E3D}']), + (0x1e91, &['\u{007A}', '\u{0302}']), + (0xda, &['\u{0055}', '\u{0301}']), + (0x2f888, &['\u{3862}']), + (0x2f851, &['\u{58EE}']), + (0x2f862, &['\u{59EC}']), + (0x1b0a, &['\u{1B09}', '\u{1B35}']), + (0xf9e4, &['\u{7406}']), + (0xf906, &['\u{53E5}']), + (0x1e68, &['\u{0053}', '\u{0323}', '\u{0307}']), + (0x1f86, &['\u{03B1}', '\u{0313}', '\u{0342}', '\u{0345}']), + (0x2f921, &['\u{7235}']), + (0xf947, &['\u{78CA}']), + (0x1fd9, &['\u{0399}', '\u{0304}']), + (0x2f9e0, &['\u{285D2}']), + (0x2f860, &['\u{216A8}']), + (0x1eed, &['\u{0075}', '\u{031B}', '\u{0309}']), + (0xfd, &['\u{0079}', '\u{0301}']), + (0xfa30, &['\u{4FAE}']), + (0xfaa4, &['\u{761D}']), + (0x2f9a1, &['\u{83CA}']), + (0x2f918, &['\u{707D}']), + (0x95d, &['\u{0922}', '\u{093C}']), + (0xf9d1, &['\u{516D}']), + (0xf9bb, &['\u{50DA}']), + (0x1ecd, &['\u{006F}', '\u{0323}']), + (0xf982, &['\u{5EEC}']), + (0x1f26, &['\u{03B7}', '\u{0313}', '\u{0342}']), + (0x1e6, &['\u{0047}', '\u{030C}']), + (0xfa0b, &['\u{5ED3}']), + (0xf96d, &['\u{7701}']), + (0x3d3, &['\u{03D2}', '\u{0301}']), + (0x1f5f, &['\u{03A5}', '\u{0314}', '\u{0342}']), + (0xf942, &['\u{58DF}']), + (0x1e1f, &['\u{0066}', '\u{0307}']), + (0xddc, &['\u{0DD9}', '\u{0DCF}']), + (0x1fb, &['\u{0061}', '\u{030A}', '\u{0301}']), + (0x1e7e, &['\u{0056}', '\u{0323}']), + (0x162, &['\u{0054}', '\u{0327}']), + (0x30f9, &['\u{30F1}', '\u{3099}']), + (0xf9ae, &['\u{7469}']), + (0xf997, &['\u{806F}']), + (0x2f8bb, &['\u{6368}']), + (0xd9, &['\u{0055}', '\u{0300}']), + (0x1d1be, &['\u{1D1BA}', '\u{1D165}', '\u{1D16E}']), + (0xfb4b, &['\u{05D5}', '\u{05B9}']), + (0xfa7a, &['\u{5599}']), + (0xf9d6, &['\u{6DEA}']), + (0xf90e, &['\u{7669}']), + (0xc5, &['\u{0041}', '\u{030A}']), + (0x2f9dd, &['\u{208DE}']), + (0x2f98e, &['\u{446B}']), + (0xfa53, &['\u{798E}']), + (0xf9c9, &['\u{67F3}']), + (0x2f80c, &['\u{349E}']), + (0x1f02, &['\u{03B1}', '\u{0313}', '\u{0300}']), + (0x2fa0f, &['\u{9D67}']), + (0xfac6, &['\u{967C}']), + (0x15e, &['\u{0053}', '\u{0327}']), + (0xfabf, &['\u{8B39}']), + (0x30c0, &['\u{30BF}', '\u{3099}']), + (0x4d3, &['\u{0430}', '\u{0308}']), + (0x1f72, &['\u{03B5}', '\u{0300}']), + (0x22af, &['\u{22AB}', '\u{0338}']), + (0x30d1, &['\u{30CF}', '\u{309A}']), + (0x2f837, &['\u{53DF}']), + (0xfa96, &['\u{6BBA}']), + (0x14d, &['\u{006F}', '\u{0304}']), + (0x1f7d, &['\u{03C9}', '\u{0301}']), + (0xf923, &['\u{85CD}']), + (0xf9f0, &['\u{85FA}']), + (0x1f0f, &['\u{0391}', '\u{0314}', '\u{0342}']), + (0x1ed9, &['\u{006F}', '\u{0323}', '\u{0302}']), + (0xee, &['\u{0069}', '\u{0302}']), + (0x30c2, &['\u{30C1}', '\u{3099}']), + (0xf5, &['\u{006F}', '\u{0303}']), + (0x2f990, &['\u{828B}']), + (0x1f78, &['\u{03BF}', '\u{0300}']), + (0xec, &['\u{0069}', '\u{0300}']), + (0x2f969, &['\u{7CE3}']), + (0x2f898, &['\u{261DA}']), + (0x1eb5, &['\u{0061}', '\u{0306}', '\u{0303}']), + (0x155, &['\u{0072}', '\u{0301}']), + (0x2f994, &['\u{82B3}']), + (0x20e, &['\u{004F}', '\u{0311}']), + (0x2f8af, &['\u{61DE}']), + (0x1d6, &['\u{0075}', '\u{0308}', '\u{0304}']), + (0x22e2, &['\u{2291}', '\u{0338}']), + (0x2f985, &['\u{813E}']), + (0x1f85, &['\u{03B1}', '\u{0314}', '\u{0301}', '\u{0345}']), + (0xf9be, &['\u{6599}']), + (0x1ec4, &['\u{0045}', '\u{0302}', '\u{0303}']), + (0x2f9c3, &['\u{8860}']), + (0x1e44, &['\u{004E}', '\u{0307}']), + (0x1f67, &['\u{03C9}', '\u{0314}', '\u{0342}']), + (0xf9de, &['\u{540F}']), + (0x2f9a5, &['\u{26D6B}']), + (0x1fea, &['\u{03A5}', '\u{0300}']), + (0x2f9f2, &['\u{49E6}']), + (0x1ffc, &['\u{03A9}', '\u{0345}']), + (0x457, &['\u{0456}', '\u{0308}']), + (0xfa0d, &['\u{55C0}']), + (0x2f9d2, &['\u{8C55}']), + (0x22c, &['\u{004F}', '\u{0303}', '\u{0304}']), + (0xf91b, &['\u{4E82}']), + (0x1e50, &['\u{004F}', '\u{0304}', '\u{0300}']), + (0x1faa, &['\u{03A9}', '\u{0313}', '\u{0300}', '\u{0345}']), + (0x2fa0a, &['\u{9B12}']), + (0x2284, &['\u{2282}', '\u{0338}']), + (0x2f81d, &['\u{51F5}']), + (0x1e30, &['\u{004B}', '\u{0301}']), + (0x1f76, &['\u{03B9}', '\u{0300}']), + (0x16e, &['\u{0055}', '\u{030A}']), + (0xf9e5, &['\u{75E2}']), + (0xfac, &['\u{0FAB}', '\u{0FB7}']), + (0x2f8ac, &['\u{61B2}']), + (0x95e, &['\u{092B}', '\u{093C}']), + (0xcc8, &['\u{0CC6}', '\u{0CD6}']), + (0x450, &['\u{0435}', '\u{0300}']), + (0x4da, &['\u{04D8}', '\u{0308}']), + (0x1fdd, &['\u{1FFE}', '\u{0300}']), + (0x45d, &['\u{0438}', '\u{0300}']), + (0x2f8d8, &['\u{6717}']), + (0xfa82, &['\u{5ED2}']), + (0x4eb, &['\u{04E9}', '\u{0308}']), + (0x1b0, &['\u{0075}', '\u{031B}']), + (0x1fd2, &['\u{03B9}', '\u{0308}', '\u{0300}']), + (0x3ac, &['\u{03B1}', '\u{0301}']), + (0x1ee0, &['\u{004F}', '\u{031B}', '\u{0303}']), + (0x112, &['\u{0045}', '\u{0304}']), + (0x2f81b, &['\u{51B5}']), + (0xf951, &['\u{964B}']), + (0x1e38, &['\u{004C}', '\u{0323}', '\u{0304}']), + (0xdc, &['\u{0055}', '\u{0308}']), + (0x2f940, &['\u{76F4}']), + (0x128, &['\u{0049}', '\u{0303}']), + (0x2f84e, &['\u{5651}']), + (0x2f807, &['\u{5002}']), + (0x9dc, &['\u{09A1}', '\u{09BC}']), + (0xf931, &['\u{6AD3}']), + (0xfc, &['\u{0075}', '\u{0308}']), + (0xf9b3, &['\u{9748}']), + (0x1109a, &['\u{11099}', '\u{110BA}']), + (0x30b2, &['\u{30B1}', '\u{3099}']), + (0xfa77, &['\u{52FA}']), + (0x2f8c2, &['\u{3A2E}']), + (0x2f928, &['\u{737A}']), + (0xd4, &['\u{004F}', '\u{0302}']), + (0x4d0, &['\u{0410}', '\u{0306}']), + (0x1112e, &['\u{11131}', '\u{11127}']), + (0x1e5e, &['\u{0052}', '\u{0331}']), + (0xfab4, &['\u{83EF}']), + (0xf918, &['\u{843D}']), + (0x30d6, &['\u{30D5}', '\u{3099}']), + (0x2f968, &['\u{7CE8}']), + (0xf91f, &['\u{862D}']), + (0x1e09, &['\u{0063}', '\u{0327}', '\u{0301}']), + (0xfb33, &['\u{05D3}', '\u{05BC}']), + (0x1e56, &['\u{0050}', '\u{0307}']), + (0xf903, &['\u{8CC8}']), + (0x1ed0, &['\u{004F}', '\u{0302}', '\u{0301}']), + (0x1fa0, &['\u{03C9}', '\u{0313}', '\u{0345}']), + (0xfb3c, &['\u{05DC}', '\u{05BC}']), + (0xe4, &['\u{0061}', '\u{0308}']), + (0x2f9e5, &['\u{2872E}']), + (0x1e8d, &['\u{0078}', '\u{0308}']), + (0xfb30, &['\u{05D0}', '\u{05BC}']), + (0xcc7, &['\u{0CC6}', '\u{0CD5}']), + (0x2f9dc, &['\u{8DF0}']), + (0x305c, &['\u{305B}', '\u{3099}']), + (0x108, &['\u{0043}', '\u{0302}']), + (0x2f8ae, &['\u{61AF}']), + (0x1f88, &['\u{0391}', '\u{0313}', '\u{0345}']), + (0x2f9bb, &['\u{8779}']), + (0x1e4c, &['\u{004F}', '\u{0303}', '\u{0301}']), + (0x1b3d, &['\u{1B3C}', '\u{1B35}']), + (0x1109c, &['\u{1109B}', '\u{110BA}']), + (0xdda, &['\u{0DD9}', '\u{0DCA}']), + (0x22ac, &['\u{22A2}', '\u{0338}']), + (0xfa20, &['\u{8612}']), + (0xf90d, &['\u{61F6}']), + (0x1f04, &['\u{03B1}', '\u{0313}', '\u{0301}']), + (0xf922, &['\u{6FEB}']), + (0x1f37, &['\u{03B9}', '\u{0314}', '\u{0342}']), + (0xfa9b, &['\u{701E}']), + (0xfa88, &['\u{6108}']), + (0x1e3f, &['\u{006D}', '\u{0301}']), + (0x1e67, &['\u{0073}', '\u{030C}', '\u{0307}']), + (0x2f8fc, &['\u{6CBF}']), + (0x1ed4, &['\u{004F}', '\u{0302}', '\u{0309}']), + (0x2f9f7, &['\u{2921A}']), + (0x2f9ac, &['\u{8564}']), + (0x4f9, &['\u{044B}', '\u{0308}']), + (0x3062, &['\u{3061}', '\u{3099}']), + (0x401, &['\u{0415}', '\u{0308}']), + (0x1fd6, &['\u{03B9}', '\u{0342}']), + (0xf9bd, &['\u{5C3F}']), + (0x2f8f0, &['\u{238A7}']), + (0x1e45, &['\u{006E}', '\u{0307}']), + (0xface, &['\u{9F9C}']), + (0xfaa9, &['\u{774A}']), + (0x17e, &['\u{007A}', '\u{030C}']), + (0x1fc, &['\u{00C6}', '\u{0301}']), + (0xfa02, &['\u{62D3}']), + (0xf927, &['\u{881F}']), + (0x1ec3, &['\u{0065}', '\u{0302}', '\u{0309}']), + (0x200, &['\u{0041}', '\u{030F}']), + (0xf93f, &['\u{9304}']), + (0x2f81f, &['\u{34DF}']), + (0xf943, &['\u{5F04}']), + (0x1e8f, &['\u{0079}', '\u{0307}']), + (0x136, &['\u{004B}', '\u{0327}']), + (0x1f9, &['\u{006E}', '\u{0300}']), + (0xf9a2, &['\u{5EC9}']), + (0x2f8ad, &['\u{61A4}']), + (0xf912, &['\u{88F8}']), + (0x2f8ab, &['\u{618E}']), + (0x1fab, &['\u{03A9}', '\u{0314}', '\u{0300}', '\u{0345}']), + (0x1e37, &['\u{006C}', '\u{0323}']), + (0x6c0, &['\u{06D5}', '\u{0654}']), + (0x1d9, &['\u{0055}', '\u{0308}', '\u{030C}']), + (0x1e80, &['\u{0057}', '\u{0300}']), + (0x407, &['\u{0406}', '\u{0308}']), + (0xfac5, &['\u{9276}']), + (0x2f961, &['\u{25BAB}']), + (0x2f9e9, &['\u{92D8}']), + (0x344, &['\u{0308}', '\u{0301}']), + (0xfa38, &['\u{5668}']), + (0x2f935, &['\u{24C36}']), + (0x6c2, &['\u{06C1}', '\u{0654}']), + (0x1f28, &['\u{0397}', '\u{0313}']), + (0x1e71, &['\u{0074}', '\u{032D}']), + (0xf96b, &['\u{53C3}']), + (0xf9f3, &['\u{9E9F}']), + (0x2f970, &['\u{7E45}']), + (0xc2, &['\u{0041}', '\u{0302}']), + (0x1f4d, &['\u{039F}', '\u{0314}', '\u{0301}']), + (0x1ef9, &['\u{0079}', '\u{0303}']), + (0x2f830, &['\u{537D}']), + (0x2f9bf, &['\u{45D7}']), + (0xfa2e, &['\u{90DE}']), + (0x30da, &['\u{30D8}', '\u{309A}']), + (0x1fe, &['\u{00D8}', '\u{0301}']), + (0xf9f4, &['\u{6797}']), + (0x9df, &['\u{09AF}', '\u{09BC}']), + (0x1d160, &['\u{1D158}', '\u{1D165}', '\u{1D16E}']), + (0x1e6b, &['\u{0074}', '\u{0307}']), + (0xfa48, &['\u{716E}']), + (0x1eb6, &['\u{0041}', '\u{0323}', '\u{0306}']), + (0x2f866, &['\u{5A66}']), + (0x1e0a, &['\u{0044}', '\u{0307}']), + (0x2f868, &['\u{36FC}']), + (0xf9bc, &['\u{5BEE}']), + (0xfb2e, &['\u{05D0}', '\u{05B7}']), + (0x1fc8, &['\u{0395}', '\u{0300}']), + (0xf9e7, &['\u{88CF}']), + (0xf915, &['\u{6D1B}']), + (0xf99f, &['\u{70C8}']), + (0x30dd, &['\u{30DB}', '\u{309A}']), + (0x1f6a, &['\u{03A9}', '\u{0313}', '\u{0300}']), + (0xfabb, &['\u{8ACB}']), + (0x118, &['\u{0045}', '\u{0328}']), + (0x2f9ec, &['\u{9415}']), + (0x139, &['\u{004C}', '\u{0301}']), + (0x1ef2, &['\u{0059}', '\u{0300}']), + (0xfa72, &['\u{5168}']), + (0x1e11, &['\u{0064}', '\u{0327}']), + (0xd4c, &['\u{0D46}', '\u{0D57}']), + (0x1f98, &['\u{0397}', '\u{0313}', '\u{0345}']), + (0x2279, &['\u{2277}', '\u{0338}']), + (0x2f95c, &['\u{2597C}']), + (0x2f91a, &['\u{70AD}']), + (0x1e3b, &['\u{006C}', '\u{0331}']), + (0xcc0, &['\u{0CBF}', '\u{0CD5}']), + (0x2f85a, &['\u{58F2}']), + (0x21ce, &['\u{21D4}', '\u{0338}']), + (0xf9ff, &['\u{523A}']), + (0x30d3, &['\u{30D2}', '\u{3099}']), + (0x2f871, &['\u{21B18}']), + (0xc3, &['\u{0041}', '\u{0303}']), + (0x4dd, &['\u{0436}', '\u{0308}']), + (0x2f902, &['\u{6D41}']), + (0xa5b, &['\u{0A1C}', '\u{0A3C}']), + (0x1e92, &['\u{005A}', '\u{0323}']), + (0x1f65, &['\u{03C9}', '\u{0314}', '\u{0301}']), + (0xf4, &['\u{006F}', '\u{0302}']), + (0xf9ea, &['\u{96E2}']), + (0xf9d7, &['\u{8F2A}']), + (0x2f84c, &['\u{5606}']), + (0x1e2f, &['\u{0069}', '\u{0308}', '\u{0301}']), + (0xfa4f, &['\u{7950}']), + (0x2f98c, &['\u{8204}']), + (0xfa59, &['\u{7E41}']), + (0xf92a, &['\u{6D6A}']), + (0x3ab, &['\u{03A5}', '\u{0308}']), + (0xf9c2, &['\u{84FC}']), + (0x22ec, &['\u{22B4}', '\u{0338}']), + (0x2f995, &['\u{82BD}']), + (0xf9d8, &['\u{5F8B}']), + (0xf9b6, &['\u{79AE}']), + (0x1ee1, &['\u{006F}', '\u{031B}', '\u{0303}']), + (0xfa5c, &['\u{81ED}']), + (0x4f5, &['\u{0447}', '\u{0308}']), + (0x116, &['\u{0045}', '\u{0307}']), + (0x1e3a, &['\u{004C}', '\u{0331}']), + (0xfb47, &['\u{05E7}', '\u{05BC}']), + (0x2f992, &['\u{52B3}']), + (0x2f98d, &['\u{8F9E}']), + (0x11a, &['\u{0045}', '\u{030C}']), + (0x2f820, &['\u{523B}']), + (0x1fe9, &['\u{03A5}', '\u{0304}']), + (0xf908, &['\u{9F9C}']), + (0xf95f, &['\u{5BE7}']), + (0x4d1, &['\u{0430}', '\u{0306}']), + (0x1e5f, &['\u{0072}', '\u{0331}']), + (0xd3, &['\u{004F}', '\u{0301}']), + (0x3069, &['\u{3068}', '\u{3099}']), + (0x2f944, &['\u{25133}']), + (0xf944, &['\u{7C60}']), + (0xf9a1, &['\u{8AAA}']), + (0x1d0, &['\u{0069}', '\u{030C}']), + (0x1f9b, &['\u{0397}', '\u{0314}', '\u{0300}', '\u{0345}']), + (0x2fa04, &['\u{9929}']), + (0x2f96b, &['\u{25F86}']), + (0x1f1d, &['\u{0395}', '\u{0314}', '\u{0301}']), + (0x101, &['\u{0061}', '\u{0304}']), + (0x1d163, &['\u{1D158}', '\u{1D165}', '\u{1D171}']), + (0x2f8f5, &['\u{6BBA}']), + (0x1ea7, &['\u{0061}', '\u{0302}', '\u{0300}']), + (0x2f9c2, &['\u{45F9}']), + (0xfacb, &['\u{980B}']), + (0x1ea1, &['\u{0061}', '\u{0323}']), + (0x226f, &['\u{003E}', '\u{0338}']), + (0x2f8a3, &['\u{6094}']), + (0xf9c7, &['\u{5289}']), + (0x2f85c, &['\u{5906}']), + (0x1e57, &['\u{0070}', '\u{0307}']), + (0x1fc3, &['\u{03B7}', '\u{0345}']), + (0x1ff2, &['\u{03C9}', '\u{0300}', '\u{0345}']), + (0x2f8ec, &['\u{236A3}']), + (0x218, &['\u{0053}', '\u{0326}']), + (0x3065, &['\u{3064}', '\u{3099}']), + (0x216, &['\u{0055}', '\u{0311}']), + (0xfa7c, &['\u{585A}']), + (0x1e9b, &['\u{017F}', '\u{0307}']), + (0x209, &['\u{0069}', '\u{030F}']), + (0xf999, &['\u{84EE}']), + (0x1fd1, &['\u{03B9}', '\u{0304}']), + (0x1e29, &['\u{0068}', '\u{0327}']), + (0x2f90a, &['\u{3D33}']), + (0xf2, &['\u{006F}', '\u{0300}']), + (0xf956, &['\u{7A1C}']), + (0x2f9de, &['\u{8ED4}']), + (0x2209, &['\u{2208}', '\u{0338}']), + (0xf925, &['\u{62C9}']), + (0x1da, &['\u{0075}', '\u{0308}', '\u{030C}']), + (0xf914, &['\u{6A02}']), + (0xfa3e, &['\u{6168}']), + (0x1ec9, &['\u{0069}', '\u{0309}']), + (0x117, &['\u{0065}', '\u{0307}']), + (0x2f9fe, &['\u{980B}']), + (0x1f2c, &['\u{0397}', '\u{0313}', '\u{0301}']), + (0x2f804, &['\u{4F60}']), + (0x1e52, &['\u{004F}', '\u{0304}', '\u{0301}']), + (0x2249, &['\u{2248}', '\u{0338}']), + (0x123, &['\u{0067}', '\u{0327}']), + (0x1cf, &['\u{0049}', '\u{030C}']), + (0x1f44, &['\u{03BF}', '\u{0313}', '\u{0301}']), + (0x13b, &['\u{004C}', '\u{0327}']), + (0x227, &['\u{0061}', '\u{0307}']), + (0x1d3, &['\u{0055}', '\u{030C}']), + (0x2f999, &['\u{831D}']), + (0x1e2d, &['\u{0069}', '\u{0330}']), + (0x2f80b, &['\u{50CF}']), + (0x2f840, &['\u{54A2}']), + (0x1e02, &['\u{0042}', '\u{0307}']), + (0x1f62, &['\u{03C9}', '\u{0313}', '\u{0300}']), + (0x1e35, &['\u{006B}', '\u{0331}']), + (0xd4a, &['\u{0D46}', '\u{0D3E}']), + (0xfa7, &['\u{0FA6}', '\u{0FB7}']), + (0x2f91d, &['\u{24263}']), + (0x1e5a, &['\u{0052}', '\u{0323}']), + (0x2f942, &['\u{250F2}']), + (0x30ae, &['\u{30AD}', '\u{3099}']), + (0x1e55, &['\u{0070}', '\u{0301}']), + (0x160, &['\u{0053}', '\u{030C}']), + (0xc1, &['\u{0041}', '\u{0301}']), + (0x2f8d2, &['\u{5192}']), + (0x2f91e, &['\u{719C}']), + (0x2f93b, &['\u{24FA1}']), + (0x1eb3, &['\u{0061}', '\u{0306}', '\u{0309}']), + (0x40d, &['\u{0418}', '\u{0300}']), + (0xfa7f, &['\u{5954}']), + (0x2f822, &['\u{5272}']), + (0x2f8c4, &['\u{647E}']), + (0xf9e1, &['\u{674E}']), + (0x20b, &['\u{0069}', '\u{0311}']), + (0xfa, &['\u{0075}', '\u{0301}']), + (0x2f9cf, &['\u{8AA0}']), + (0x2f8a7, &['\u{614C}']), + (0x137, &['\u{006B}', '\u{0327}']), + (0xf9ad, &['\u{73B2}']), + (0xfab0, &['\u{7DF4}']), + (0x1d1c0, &['\u{1D1BA}', '\u{1D165}', '\u{1D16F}']), + (0xf9b4, &['\u{9818}']), + (0x439, &['\u{0438}', '\u{0306}']), + (0x21ae, &['\u{2194}', '\u{0338}']), + (0x1e34, &['\u{004B}', '\u{0331}']), + (0x1d1, &['\u{004F}', '\u{030C}']), + (0xfa25, &['\u{9038}']), + (0xfa54, &['\u{7A40}']), + (0xfaaa, &['\u{7740}']), + (0xfac9, &['\u{97DB}']), + (0x2f80f, &['\u{5154}']), + (0x2f85b, &['\u{58F7}']), + (0xf9b1, &['\u{9234}']), + (0xf962, &['\u{7570}']), + (0x22a, &['\u{004F}', '\u{0308}', '\u{0304}']), + (0x1f35, &['\u{03B9}', '\u{0314}', '\u{0301}']), + (0x2280, &['\u{227A}', '\u{0338}']), + (0x2f996, &['\u{82E6}']), + (0x1ea, &['\u{004F}', '\u{0328}']), + (0x2f89f, &['\u{5FF9}']), + (0x1ea0, &['\u{0041}', '\u{0323}']), + (0xf99a, &['\u{9023}']), + (0x1ed8, &['\u{004F}', '\u{0323}', '\u{0302}']), + (0x1f20, &['\u{03B7}', '\u{0313}']), + (0x3d4, &['\u{03D2}', '\u{0308}']), + (0x4d6, &['\u{0415}', '\u{0306}']), + (0xf95c, &['\u{6A02}']), + (0x1e03, &['\u{0062}', '\u{0307}']), + (0x2f962, &['\u{7BC6}']), + (0x2fa1d, &['\u{2A600}']), + (0x2f943, &['\u{25119}']), + (0x2f98b, &['\u{8201}']), + (0xf9a7, &['\u{7375}']), + (0x2fa05, &['\u{99A7}']), + (0xfad2, &['\u{3B9D}']), + (0x2f897, &['\u{232B8}']), + (0x2fa08, &['\u{4BCE}']), + (0x2f9ae, &['\u{455D}']), + (0xfa44, &['\u{6885}']), + (0x2f8bc, &['\u{6383}']), + (0x2f96a, &['\u{7D00}']), + (0x2f8a8, &['\u{614E}']), + (0x2f8cd, &['\u{6649}']), + (0xfb1f, &['\u{05F2}', '\u{05B7}']), + (0x2f88b, &['\u{5EB0}']), + (0x2f811, &['\u{5177}']), + (0x1b06, &['\u{1B05}', '\u{1B35}']), + (0x1fef, &['\u{0060}']), + (0x2f899, &['\u{5F62}']), + (0x2f83b, &['\u{5406}']), + (0x1e47, &['\u{006E}', '\u{0323}']), + (0x2f90b, &['\u{6ECB}']), + (0xfa8e, &['\u{641C}']), + (0xf901, &['\u{66F4}']), + (0x1e2a, &['\u{0048}', '\u{032E}']), + (0x1e99, &['\u{0079}', '\u{030A}']), + (0xf941, &['\u{8AD6}']), + (0x1fe5, &['\u{03C1}', '\u{0314}']), + (0x1d161, &['\u{1D158}', '\u{1D165}', '\u{1D16F}']), + (0xf958, &['\u{83F1}']), + (0xf924, &['\u{8964}']), + (0xf96f, &['\u{8AAA}']), + (0x6d3, &['\u{06D2}', '\u{0654}']), + (0x1ec6, &['\u{0045}', '\u{0323}', '\u{0302}']), + (0xfaad, &['\u{7BC0}']), + (0x1d7, &['\u{0055}', '\u{0308}', '\u{0301}']), + (0x1e81, &['\u{0077}', '\u{0300}']), + (0xfa42, &['\u{65E2}']), + (0xfa85, &['\u{5FAD}']), + (0x1ecb, &['\u{0069}', '\u{0323}']), + (0x2f92f, &['\u{745C}']), + (0xf9fc, &['\u{8B58}']), + (0xfaaf, &['\u{7D5B}']), + (0xfa71, &['\u{51B5}']), + (0x1f90, &['\u{03B7}', '\u{0313}', '\u{0345}']), + (0xdd, &['\u{0059}', '\u{0301}']), + (0xfb2f, &['\u{05D0}', '\u{05B8}']), + (0xfa91, &['\u{6674}']), + (0x1eb4, &['\u{0041}', '\u{0306}', '\u{0303}']), + (0x2f930, &['\u{7471}']), + (0xf966, &['\u{5FA9}']), + (0x1feb, &['\u{03A5}', '\u{0301}']), + (0xfac1, &['\u{8D08}']), + (0x2f86f, &['\u{5BE7}']), + (0xf99d, &['\u{52A3}']), + (0x2f93a, &['\u{7610}']), + (0x2fa18, &['\u{9EFE}']), + (0x451, &['\u{0435}', '\u{0308}']), + (0x1f52, &['\u{03C5}', '\u{0313}', '\u{0300}']), + (0xccb, &['\u{0CC6}', '\u{0CC2}', '\u{0CD5}']), + (0x232, &['\u{0059}', '\u{0304}']), + (0x12d, &['\u{0069}', '\u{0306}']), + (0x1ea3, &['\u{0061}', '\u{0309}']), + (0xf93c, &['\u{797F}']), + (0x1fbe, &['\u{03B9}']), + (0xf9fd, &['\u{4EC0}']), + (0xfa40, &['\u{61F2}']), + (0x2fa11, &['\u{4CF8}']), + (0xfad6, &['\u{25CD0}']), + (0x2f9f0, &['\u{95B7}']), + (0x2f95a, &['\u{7A4A}']), + (0x2f91c, &['\u{7145}']), + (0x1e3d, &['\u{006C}', '\u{032D}']), + (0x2f87a, &['\u{5C8D}']), + (0x1fdf, &['\u{1FFE}', '\u{0342}']), + (0xf98a, &['\u{529B}']), + (0xf950, &['\u{7E37}']), + (0x173, &['\u{0075}', '\u{0328}']), + (0x1f2a, &['\u{0397}', '\u{0313}', '\u{0300}']), + (0xfa1b, &['\u{798F}']), + (0x1ed6, &['\u{004F}', '\u{0302}', '\u{0303}']), + (0x2f978, &['\u{7F95}']), + (0x2f97f, &['\u{8070}']), + (0x1ef, &['\u{0292}', '\u{030C}']), + (0x1e65, &['\u{0073}', '\u{0301}', '\u{0307}']), + (0x226, &['\u{0041}', '\u{0307}']), + (0x2f848, &['\u{55AB}']), + (0x1ff, &['\u{00F8}', '\u{0301}']), + (0x21a, &['\u{0054}', '\u{0326}']), + (0xc0, &['\u{0041}', '\u{0300}']), + (0xdb, &['\u{0055}', '\u{0302}']), + (0x3ce, &['\u{03C9}', '\u{0301}']), + (0x20d, &['\u{006F}', '\u{030F}']), + (0x1d164, &['\u{1D158}', '\u{1D165}', '\u{1D172}']), + (0x212b, &['\u{0041}', '\u{030A}']), + (0x2f846, &['\u{5584}']), + (0x2f805, &['\u{4FAE}']), + (0x159, &['\u{0072}', '\u{030C}']), + (0x2f9f1, &['\u{28D77}']), + (0x1f40, &['\u{03BF}', '\u{0313}']), + (0x2f958, &['\u{412F}']), + (0x1fe6, &['\u{03C5}', '\u{0342}']), + (0xfaae, &['\u{7C7B}']), + (0x2275, &['\u{2273}', '\u{0338}']), + (0xfa15, &['\u{51DE}']), + (0x1fc1, &['\u{00A8}', '\u{0342}']), + (0xd5, &['\u{004F}', '\u{0303}']), + (0xfad0, &['\u{22844}']), + (0x4c1, &['\u{0416}', '\u{0306}']), + (0x2f976, &['\u{7F7A}']), + (0x1e19, &['\u{0065}', '\u{032D}']), + (0x1f71, &['\u{03B1}', '\u{0301}']), + (0x1f9f, &['\u{0397}', '\u{0314}', '\u{0342}', '\u{0345}']), + (0x2f81c, &['\u{291DF}']), + (0x1e05, &['\u{0062}', '\u{0323}']), + (0xfa26, &['\u{90FD}']), + (0x1fac, &['\u{03A9}', '\u{0313}', '\u{0301}', '\u{0345}']), + (0x2f88a, &['\u{387C}']), + (0x1fde, &['\u{1FFE}', '\u{0301}']), + (0x1e97, &['\u{0074}', '\u{0308}']), + (0xf98b, &['\u{66C6}']), + (0x2f816, &['\u{2054B}']), + (0x2f9eb, &['\u{93F9}']), + (0x1e6d, &['\u{0074}', '\u{0323}']), + (0xfa12, &['\u{6674}']), + (0x2f9b1, &['\u{270D2}']), + (0xfa43, &['\u{6691}']), + (0xfa2a, &['\u{98EF}']), + (0x4e2, &['\u{0418}', '\u{0304}']), + (0x1f5, &['\u{0067}', '\u{0301}']), + (0x1e5d, &['\u{0072}', '\u{0323}', '\u{0304}']), + (0x1fc7, &['\u{03B7}', '\u{0342}', '\u{0345}']), + (0x1f00, &['\u{03B1}', '\u{0313}']), + (0x2f96f, &['\u{7E02}']), + (0xfa3c, &['\u{5C6E}']), + (0x2f99d, &['\u{83BD}']), + (0x2f8d6, &['\u{80AD}']), + (0x1f70, &['\u{03B1}', '\u{0300}']), + (0x2f9f8, &['\u{4A6E}']), + (0x10d, &['\u{0063}', '\u{030C}']), + (0xfb46, &['\u{05E6}', '\u{05BC}']), + (0x1ebe, &['\u{0045}', '\u{0302}', '\u{0301}']), + (0xfa93, &['\u{671B}']), + (0xf9c0, &['\u{71CE}']), + (0xb4c, &['\u{0B47}', '\u{0B57}']), + (0x1f57, &['\u{03C5}', '\u{0314}', '\u{0342}']), + (0x3ca, &['\u{03B9}', '\u{0308}']), + (0x1e7c, &['\u{0056}', '\u{0303}']), + (0xfa22, &['\u{8AF8}']), + (0x1ff3, &['\u{03C9}', '\u{0345}']), + (0x1e2b, &['\u{0068}', '\u{032E}']), + (0xf9ec, &['\u{6EBA}']), + (0x1e04, &['\u{0042}', '\u{0323}']), + (0xfb9, &['\u{0F90}', '\u{0FB5}']), + (0x1e0, &['\u{0041}', '\u{0307}', '\u{0304}']), + (0x2f90c, &['\u{6EC7}']), + (0xc48, &['\u{0C46}', '\u{0C56}']), + (0x3067, &['\u{3066}', '\u{3099}']), + (0x2f9c6, &['\u{88D7}']), + (0x2f8f3, &['\u{6B72}']), + (0x12c, &['\u{0049}', '\u{0306}']), + (0x2f8a9, &['\u{614C}']), + (0x2f83d, &['\u{5438}']), + (0x170, &['\u{0055}', '\u{030B}']), + (0x2244, &['\u{2243}', '\u{0338}']), + (0xf9d4, &['\u{502B}']), + (0x2f89d, &['\u{5FCD}']), + (0x233, &['\u{0079}', '\u{0304}']), + (0xfa75, &['\u{5180}']), + (0x2f84a, &['\u{55C2}']), + (0x1ef1, &['\u{0075}', '\u{031B}', '\u{0323}']), + (0x1e61, &['\u{0073}', '\u{0307}']), + (0x219a, &['\u{2190}', '\u{0338}']), + (0x30d9, &['\u{30D8}', '\u{3099}']), + (0x202, &['\u{0041}', '\u{0311}']), + (0x1f24, &['\u{03B7}', '\u{0313}', '\u{0301}']), + (0x2126, &['\u{03A9}']), + (0x204, &['\u{0045}', '\u{030F}']), + (0x931, &['\u{0930}', '\u{093C}']), + (0xfa68, &['\u{96E3}']), + (0xf93e, &['\u{83C9}']), + (0x3077, &['\u{3075}', '\u{309A}']), + (0x341, &['\u{0301}']), + (0x1e6f, &['\u{0074}', '\u{0331}']), + (0x2f8e4, &['\u{688E}']), + (0x2f83f, &['\u{5468}']), + (0xf9ef, &['\u{7498}']), + (0xf976, &['\u{7565}']), + (0xf9c6, &['\u{962E}']), + (0xfa97, &['\u{6D41}']), + (0x114bb, &['\u{114B9}', '\u{114BA}']), + (0x2f916, &['\u{3D96}']), + (0x1f99, &['\u{0397}', '\u{0314}', '\u{0345}']), + (0x30d4, &['\u{30D2}', '\u{309A}']), + (0x2f932, &['\u{74CA}']), + (0xb4b, &['\u{0B47}', '\u{0B3E}']), + (0x201, &['\u{0061}', '\u{030F}']), + (0x20c, &['\u{004F}', '\u{030F}']), + (0x13a, &['\u{006C}', '\u{0301}']), + (0x30f8, &['\u{30F0}', '\u{3099}']), + (0x2f858, &['\u{58AC}']), + (0x2f8e8, &['\u{6942}']), + (0xf954, &['\u{51DC}']), + (0x2f900, &['\u{6D3E}']), + (0x2fa1c, &['\u{9F3B}']), + (0xfb40, &['\u{05E0}', '\u{05BC}']), + (0x1f69, &['\u{03A9}', '\u{0314}']), + (0xfac7, &['\u{96E3}']), + (0x1e77, &['\u{0075}', '\u{032D}']), + (0x1ce, &['\u{0061}', '\u{030C}']), + (0xf934, &['\u{8001}']), + (0xf94f, &['\u{7D2F}']), + (0x22ea, &['\u{22B2}', '\u{0338}']), + (0xf920, &['\u{9E1E}']), + (0x2f9f4, &['\u{5DB2}']), + (0x1f2b, &['\u{0397}', '\u{0314}', '\u{0300}']), + (0x2f979, &['\u{7FFA}']), + (0x2f86c, &['\u{219C8}']), + (0x1e1e, &['\u{0046}', '\u{0307}']), + (0x144, &['\u{006E}', '\u{0301}']), + (0x2f8e5, &['\u{681F}']), + (0xfaa8, &['\u{76F4}']), + (0x3094, &['\u{3046}', '\u{3099}']), + (0x1ed3, &['\u{006F}', '\u{0302}', '\u{0300}']), + (0x2f934, &['\u{7524}']), + (0xfa41, &['\u{654F}']), + (0xf9c8, &['\u{677B}']), + (0x2f89b, &['\u{38E3}']), + (0x1e94, &['\u{005A}', '\u{0331}']), + (0x1e83, &['\u{0077}', '\u{0301}']), + (0xf9c1, &['\u{7642}']), + (0x1f60, &['\u{03C9}', '\u{0313}']), + (0xfa1a, &['\u{7965}']), + (0x2f9fb, &['\u{2940A}']), + (0x2f9c8, &['\u{4635}']), + (0xb5d, &['\u{0B22}', '\u{0B3C}']), + (0x4f1, &['\u{0443}', '\u{0308}']), + (0x2f9bd, &['\u{876B}']), + (0x17a, &['\u{007A}', '\u{0301}']), + (0x1f79, &['\u{03BF}', '\u{0301}']), + (0xca, &['\u{0045}', '\u{0302}']), + (0x2f813, &['\u{34B9}']), + (0x1f31, &['\u{03B9}', '\u{0314}']), + (0x2f880, &['\u{5D7C}']), + (0x2224, &['\u{2223}', '\u{0338}']), + (0x2adc, &['\u{2ADD}', '\u{0338}']), + (0x2f8ff, &['\u{6D16}']), + (0x1112f, &['\u{11132}', '\u{11127}']), + (0xfa35, &['\u{5351}']), + (0x1b0c, &['\u{1B0B}', '\u{1B35}']), + (0x1e53, &['\u{006F}', '\u{0304}', '\u{0301}']), + (0x1eb9, &['\u{0065}', '\u{0323}']), + (0xf960, &['\u{6012}']), + (0x2f8b1, &['\u{61F6}']), + (0x1ee8, &['\u{0055}', '\u{031B}', '\u{0301}']), + (0xf992, &['\u{6F23}']), + (0x4f8, &['\u{042B}', '\u{0308}']), + (0x2f9a6, &['\u{26CD5}']), + (0x2f808, &['\u{507A}']), + (0x2f8d3, &['\u{5195}']), + (0x16a, &['\u{0055}', '\u{0304}']), + (0x1e4d, &['\u{006F}', '\u{0303}', '\u{0301}']), + (0x1f96, &['\u{03B7}', '\u{0313}', '\u{0342}', '\u{0345}']), + (0x115bb, &['\u{115B9}', '\u{115AF}']), + (0xf9f7, &['\u{7ACB}']), + (0x2f9c5, &['\u{27667}']), + (0x10b, &['\u{0063}', '\u{0307}']), + (0x1b12, &['\u{1B11}', '\u{1B35}']), + (0x30be, &['\u{30BD}', '\u{3099}']), + (0x2f987, &['\u{267A7}']), + (0x2f876, &['\u{3781}']), + (0xfb2b, &['\u{05E9}', '\u{05C2}']), + (0xfaab, &['\u{78CC}']), + (0x1fd7, &['\u{03B9}', '\u{0308}', '\u{0342}']), + (0x2f89e, &['\u{5FD7}']), + (0xfa39, &['\u{5840}']), + (0x2fa07, &['\u{99FE}']), + (0x2f8ee, &['\u{3C18}']), + (0x30b0, &['\u{30AF}', '\u{3099}']), + (0x2f895, &['\u{5F22}']), + (0x1e3, &['\u{00E6}', '\u{0304}']), + (0x114be, &['\u{114B9}', '\u{114BD}']), + (0xcf, &['\u{0049}', '\u{0308}']), + (0xfaa7, &['\u{76DB}']), + (0x45c, &['\u{043A}', '\u{0301}']), + (0x2f8c9, &['\u{656C}']), + (0xfa18, &['\u{793C}']), + (0xf9da, &['\u{6817}']), + (0x2f983, &['\u{8103}']), + (0x2f891, &['\u{22331}']), + (0xf99e, &['\u{54BD}']), + (0x403, &['\u{0413}', '\u{0301}']), + (0x10c, &['\u{0043}', '\u{030C}']), + (0x476, &['\u{0474}', '\u{030F}']), + (0x389, &['\u{0397}', '\u{0301}']), + (0x2f8df, &['\u{67FA}']), + (0xfa07, &['\u{8F3B}']), + (0xfab7, &['\u{8986}']), + (0x1e5b, &['\u{0072}', '\u{0323}']), + (0xf98e, &['\u{5E74}']), + (0xfa7b, &['\u{55E2}']), + (0xfa67, &['\u{9038}']), + (0xf946, &['\u{7262}']), + (0x121, &['\u{0067}', '\u{0307}']), + (0x2f946, &['\u{771F}']), + (0x2204, &['\u{2203}', '\u{0338}']), + (0xfa7d, &['\u{58B3}']), + (0xf4d, &['\u{0F4C}', '\u{0FB7}']), + (0x2fa09, &['\u{29B30}']), + (0xfa1d, &['\u{7CBE}']), + (0xfb, &['\u{0075}', '\u{0302}']), + (0x1f3c, &['\u{0399}', '\u{0313}', '\u{0301}']), + (0x307a, &['\u{3078}', '\u{309A}']), + (0xfa52, &['\u{798D}']), + (0xfb39, &['\u{05D9}', '\u{05BC}']), + (0x1f82, &['\u{03B1}', '\u{0313}', '\u{0300}', '\u{0345}']), + (0x1e26, &['\u{0048}', '\u{0308}']), + (0x3050, &['\u{304F}', '\u{3099}']), + (0x2f96e, &['\u{7DC7}']), + (0x305a, &['\u{3059}', '\u{3099}']), + (0x2fa17, &['\u{9EF9}']), + (0xf95a, &['\u{8B80}']), + (0xf9d3, &['\u{9678}']), + (0x30fe, &['\u{30FD}', '\u{3099}']), + (0x2f865, &['\u{59D8}']), + (0x1b40, &['\u{1B3E}', '\u{1B35}']), + (0x212, &['\u{0052}', '\u{0311}']), + (0xfb4d, &['\u{05DB}', '\u{05BF}']), + (0x1f2f, &['\u{0397}', '\u{0314}', '\u{0342}']), + (0xf93a, &['\u{9DFA}']), + (0xf910, &['\u{863F}']), + (0xf949, &['\u{96F7}']), + (0xfa19, &['\u{795E}']), + (0xfab1, &['\u{7F3E}']), + (0x2f923, &['\u{24608}']), + (0x2f861, &['\u{216EA}']), + (0x2f97c, &['\u{26523}']), + (0x1f63, &['\u{03C9}', '\u{0314}', '\u{0300}']), + (0x1f48, &['\u{039F}', '\u{0313}']), + (0x2f845, &['\u{5584}']), + (0xf9ce, &['\u{786B}']), + (0xfab9, &['\u{8ABF}']), + (0xfa47, &['\u{6F22}']), + (0x2f8aa, &['\u{617A}']), + (0xfa00, &['\u{5207}']), + (0xf990, &['\u{6200}']), + (0x2f884, &['\u{5DFD}']), + (0x1f68, &['\u{03A9}', '\u{0313}']), + (0x2f9b7, &['\u{86A9}']), + (0x9cc, &['\u{09C7}', '\u{09D7}']), + (0xfa09, &['\u{964D}']), + (0x2f8dc, &['\u{6753}']), + (0x1fd8, &['\u{0399}', '\u{0306}']), + (0x226d, &['\u{224D}', '\u{0338}']), + (0x4e3, &['\u{0438}', '\u{0304}']), + (0x1e59, &['\u{0072}', '\u{0307}']), + (0xfa03, &['\u{7CD6}']), + (0x2f993, &['\u{82B1}']), + (0x2f894, &['\u{5F22}']), + (0x10a, &['\u{0043}', '\u{0307}']), + (0x163, &['\u{0074}', '\u{0327}']), + (0xf940, &['\u{9E7F}']), + (0x2f951, &['\u{40E3}']), + (0x2f896, &['\u{38C7}']), + (0x1fee, &['\u{00A8}', '\u{0301}']), + (0x2fa06, &['\u{99C2}']), + (0x1e54, &['\u{0050}', '\u{0301}']), + (0xf96a, &['\u{7D22}']), + (0x1ec0, &['\u{0045}', '\u{0302}', '\u{0300}']), + (0xfb3b, &['\u{05DB}', '\u{05BC}']), + (0x2f8e0, &['\u{6785}']), + (0xa36, &['\u{0A38}', '\u{0A3C}']), + (0xbcb, &['\u{0BC7}', '\u{0BBE}']), + (0x2f9bc, &['\u{8728}']), + (0xfa6a, &['\u{983B}']), + (0x2f827, &['\u{52E4}']), + (0xfa55, &['\u{7A81}']), + (0x2f8f9, &['\u{23AFA}']), + (0x13d, &['\u{004C}', '\u{030C}']), + (0x1ef6, &['\u{0059}', '\u{0309}']), + (0x20a, &['\u{0049}', '\u{0311}']), + (0x2f881, &['\u{5DE1}']), + (0x1134c, &['\u{11347}', '\u{11357}']), + (0x2f8b8, &['\u{22B0C}']), + (0x1f61, &['\u{03C9}', '\u{0314}']), + (0xfa64, &['\u{8CD3}']), + (0x2f9be, &['\u{8786}']), + (0x2f9ed, &['\u{28BFA}']), + (0x1e33, &['\u{006B}', '\u{0323}']), + (0x2f801, &['\u{4E38}']), + (0x14f, &['\u{006F}', '\u{0306}']), + (0xf97a, &['\u{6881}']), + (0x1ec8, &['\u{0049}', '\u{0309}']), + (0x4ee, &['\u{0423}', '\u{0304}']), + (0x207, &['\u{0065}', '\u{0311}']), + (0xf995, &['\u{79CA}']), + (0x1e8b, &['\u{0078}', '\u{0307}']), + (0x2f893, &['\u{8201}']), + (0xf984, &['\u{6FFE}']), + (0xf9cf, &['\u{7D10}']), + (0x2f90e, &['\u{6DF9}']), + (0x1e07, &['\u{0062}', '\u{0331}']), + (0x30fa, &['\u{30F2}', '\u{3099}']), + (0xfab2, &['\u{8005}']), + (0x2f9db, &['\u{8DBC}']), + (0x1f3a, &['\u{0399}', '\u{0313}', '\u{0300}']), + (0xfa32, &['\u{514D}']), + (0x1e49, &['\u{006E}', '\u{0331}']), + (0x2f96d, &['\u{4301}']), + (0x2f9a7, &['\u{452B}']), + (0x22e3, &['\u{2292}', '\u{0338}']), + (0xf9ba, &['\u{4E86}']), + (0x1f15, &['\u{03B5}', '\u{0314}', '\u{0301}']), + (0x2f8db, &['\u{675E}']), + (0xf5c, &['\u{0F5B}', '\u{0FB7}']), + (0x1fe0, &['\u{03C5}', '\u{0306}']), + (0x1e69, &['\u{0073}', '\u{0323}', '\u{0307}']), + (0x15b, &['\u{0073}', '\u{0301}']), + (0x38a, &['\u{0399}', '\u{0301}']), + (0x2f832, &['\u{537F}']), + (0x21e, &['\u{0048}', '\u{030C}']), + (0xf9fe, &['\u{8336}']), + (0x169, &['\u{0075}', '\u{0303}']), + (0x2f9e3, &['\u{90F1}']), + (0x1ece, &['\u{004F}', '\u{0309}']), + (0x2262, &['\u{2261}', '\u{0338}']), + (0x1f94, &['\u{03B7}', '\u{0313}', '\u{0301}', '\u{0345}']), + (0x1ef3, &['\u{0079}', '\u{0300}']), + (0xf9d0, &['\u{985E}']), + (0x2f8bd, &['\u{63E4}']), + (0x30dc, &['\u{30DB}', '\u{3099}']), + (0x115, &['\u{0065}', '\u{0306}']), + (0x2f9b4, &['\u{865C}']), + (0x1e84, &['\u{0057}', '\u{0308}']), + (0x213, &['\u{0072}', '\u{0311}']), + (0xf9f2, &['\u{9C57}']), + (0xf91a, &['\u{99F1}']), + (0xfa61, &['\u{8996}']), + (0x38f, &['\u{03A9}', '\u{0301}']), + (0xf9e8, &['\u{88E1}']), + (0xf78, &['\u{0FB3}', '\u{0F80}']), + (0x2f844, &['\u{5563}']), + (0xfab5, &['\u{8779}']), + (0x2f905, &['\u{6D85}']), + (0x178, &['\u{0059}', '\u{0308}']), + (0xfa5d, &['\u{8279}']), + (0xfb2a, &['\u{05E9}', '\u{05C1}']), + (0xf9b7, &['\u{91B4}']), + (0x1ffa, &['\u{03A9}', '\u{0300}']), + (0x2f85f, &['\u{5962}']), + (0x1f8, &['\u{004E}', '\u{0300}']), + (0x1f6e, &['\u{03A9}', '\u{0313}', '\u{0342}']), + (0x1fe7, &['\u{03C5}', '\u{0308}', '\u{0342}']), + (0x1fb4, &['\u{03B1}', '\u{0301}', '\u{0345}']), + (0x2f874, &['\u{5F53}']), + (0xfb38, &['\u{05D8}', '\u{05BC}']), + (0x4f0, &['\u{0423}', '\u{0308}']), + (0x2f8fd, &['\u{6CCD}']), + (0x1e32, &['\u{004B}', '\u{0323}']), + (0x1eab, &['\u{0061}', '\u{0302}', '\u{0303}']), + (0xfa9a, &['\u{6F22}']), + (0xfb49, &['\u{05E9}', '\u{05BC}']), + (0xf9d2, &['\u{622E}']), + (0x2f9fa, &['\u{97E0}']), + (0x622, &['\u{0627}', '\u{0653}']), + (0xfa4b, &['\u{7891}']), + (0xfa56, &['\u{7BC0}']), + (0x1ecc, &['\u{004F}', '\u{0323}']), + (0x1f45, &['\u{03BF}', '\u{0314}', '\u{0301}']), + (0xfa06, &['\u{66B4}']), + (0xd4b, &['\u{0D47}', '\u{0D3E}']), + (0xfad8, &['\u{9F43}']), + (0x2f97e, &['\u{265A8}']), + (0xe1, &['\u{0061}', '\u{0301}']), + (0x1edd, &['\u{006F}', '\u{031B}', '\u{0300}']), + (0x1cd, &['\u{0041}', '\u{030C}']), + (0xf52, &['\u{0F51}', '\u{0FB7}']), + (0x3056, &['\u{3055}', '\u{3099}']), + (0xfacc, &['\u{983B}']), + (0x15a, &['\u{0053}', '\u{0301}']), + (0x2f957, &['\u{79EB}']), + (0x1d8, &['\u{0075}', '\u{0308}', '\u{0301}']), + (0x1fc4, &['\u{03B7}', '\u{0301}', '\u{0345}']), + (0x3b0, &['\u{03C5}', '\u{0308}', '\u{0301}']), + (0x30c9, &['\u{30C8}', '\u{3099}']), + (0x10e, &['\u{0044}', '\u{030C}']), + (0x2fa01, &['\u{295B6}']), + (0x1ffd, &['\u{00B4}']), + (0xf980, &['\u{5442}']), + (0xfaa6, &['\u{76CA}']), + (0x2f9c1, &['\u{8801}']), + (0xc4, &['\u{0041}', '\u{0308}']), + (0x1e0f, &['\u{0064}', '\u{0331}']), + (0x2f8de, &['\u{3B49}']), + (0x2f953, &['\u{7956}']), + (0x1eef, &['\u{0075}', '\u{031B}', '\u{0303}']), + (0xfaa3, &['\u{753B}']), + (0x2f889, &['\u{22183}']), + (0x4dc, &['\u{0416}', '\u{0308}']), + (0x1f66, &['\u{03C9}', '\u{0313}', '\u{0342}']), + (0x2f924, &['\u{7280}']), + (0x2f8cf, &['\u{6691}']), + (0x172, &['\u{0055}', '\u{0328}']), + (0x2f909, &['\u{6E6E}']), + (0xf9a3, &['\u{5FF5}']), + (0x104, &['\u{0041}', '\u{0328}']), + (0x2f991, &['\u{829D}']), + (0x22ae, &['\u{22A9}', '\u{0338}']), + (0x1fca, &['\u{0397}', '\u{0300}']), + (0xf971, &['\u{8FB0}']), + (0x1f3f, &['\u{0399}', '\u{0314}', '\u{0342}']), + (0x20f, &['\u{006F}', '\u{0311}']), + (0x2f856, &['\u{5832}']), + (0x30b6, &['\u{30B5}', '\u{3099}']), + (0x1ff9, &['\u{039F}', '\u{0301}']), + (0x1eb1, &['\u{0061}', '\u{0306}', '\u{0300}']), + (0x1f07, &['\u{03B1}', '\u{0314}', '\u{0342}']), + (0x1ebb, &['\u{0065}', '\u{0309}']), + (0x2f99e, &['\u{83E7}']), + (0x2260, &['\u{003D}', '\u{0338}']), + (0x146, &['\u{006E}', '\u{0327}']), + (0x2f9ff, &['\u{980B}']), + (0x929, &['\u{0928}', '\u{093C}']), + (0xf91c, &['\u{5375}']), + (0xf929, &['\u{6717}']), + (0x1e14, &['\u{0045}', '\u{0304}', '\u{0300}']), + (0x477, &['\u{0475}', '\u{030F}']), + (0x102, &['\u{0041}', '\u{0306}']), + (0x2f800, &['\u{4E3D}']), + (0x2f9a2, &['\u{83CC}']), + (0x2fa1a, &['\u{9F0F}']), + (0x95a, &['\u{0917}', '\u{093C}']), + (0xc7, &['\u{0043}', '\u{0327}']), + (0xf97f, &['\u{52F5}']), + (0x2f960, &['\u{4202}']), + (0x12b, &['\u{0069}', '\u{0304}']), + (0x309e, &['\u{309D}', '\u{3099}']), + (0xf95b, &['\u{62CF}']), + (0x2f92e, &['\u{7447}']), + (0x1f55, &['\u{03C5}', '\u{0314}', '\u{0301}']), + (0x4d2, &['\u{0410}', '\u{0308}']), + (0xf9d, &['\u{0F9C}', '\u{0FB7}']), + (0xf994, &['\u{7489}']), + (0x1e4e, &['\u{004F}', '\u{0303}', '\u{0308}']), + (0x2f83c, &['\u{549E}']), + (0x2f80d, &['\u{2063A}']), + (0x2f941, &['\u{250F3}']), + (0x168, &['\u{0055}', '\u{0303}']), + (0x9dd, &['\u{09A2}', '\u{09BC}']), + (0x3070, &['\u{306F}', '\u{3099}']), + (0xf9e9, &['\u{91CC}']), + (0xe0, &['\u{0061}', '\u{0300}']), + (0x1fa5, &['\u{03C9}', '\u{0314}', '\u{0301}', '\u{0345}']), + (0x1fa6, &['\u{03C9}', '\u{0313}', '\u{0342}', '\u{0345}']), + (0xfaac, &['\u{7AB1}']), + (0xfa87, &['\u{614E}']), + (0x105, &['\u{0061}', '\u{0328}']), + (0x100, &['\u{0041}', '\u{0304}']), + (0xfa33, &['\u{52C9}']), + (0x2f8c1, &['\u{63A9}']), + (0xf9ee, &['\u{71D0}']), + (0x30c7, &['\u{30C6}', '\u{3099}']), + (0x203, &['\u{0061}', '\u{0311}']), + (0x2f877, &['\u{5C60}']), + (0x2f9d3, &['\u{27CA8}']), + (0xfb3e, &['\u{05DE}', '\u{05BC}']), + (0x2f854, &['\u{580D}']), + (0x2f82f, &['\u{5373}']), + (0x208, &['\u{0049}', '\u{030F}']), + (0xf90b, &['\u{5587}']), + (0x2f87c, &['\u{5D43}']), + (0xf9a4, &['\u{637B}']), + (0x1ec5, &['\u{0065}', '\u{0302}', '\u{0303}']), + (0x3cc, &['\u{03BF}', '\u{0301}']), + (0xfaa5, &['\u{761F}']), + (0xf6, &['\u{006F}', '\u{0308}']), + (0x22e1, &['\u{227D}', '\u{0338}']), + (0x1ee2, &['\u{004F}', '\u{031B}', '\u{0323}']), + (0xf9c4, &['\u{9F8D}']), + (0x1eda, &['\u{004F}', '\u{031B}', '\u{0301}']), + (0xfa3d, &['\u{6094}']), + (0x1f0a, &['\u{0391}', '\u{0313}', '\u{0300}']), + (0xfad4, &['\u{4039}']), + (0x95c, &['\u{0921}', '\u{093C}']), + (0x1ff7, &['\u{03C9}', '\u{0342}', '\u{0345}']), + (0x2f86b, &['\u{5B3E}']), + (0x2f9d1, &['\u{8B8A}']), + (0x1f83, &['\u{03B1}', '\u{0314}', '\u{0300}', '\u{0345}']), + (0xf9f6, &['\u{81E8}']), + (0x2f9b3, &['\u{8650}']), + (0xf983, &['\u{65C5}']), + (0xef, &['\u{0069}', '\u{0308}']), + (0xf98f, &['\u{6190}']), + (0x156, &['\u{0052}', '\u{0327}']), + (0x1f4c, &['\u{039F}', '\u{0313}', '\u{0301}']), + (0x958, &['\u{0915}', '\u{093C}']), + (0x2f9f5, &['\u{9723}']), + (0x2f9d9, &['\u{20804}']), + (0x2f831, &['\u{537F}']), + (0x2f9ee, &['\u{958B}']), + (0x2f89a, &['\u{5F6B}']), + (0xf955, &['\u{51CC}']), + (0x2fa14, &['\u{2A291}']), + (0x2f80a, &['\u{50E7}']), + (0x1f49, &['\u{039F}', '\u{0314}']), + (0x2f82c, &['\u{5349}']), + (0x2f945, &['\u{771E}']), + (0x2f998, &['\u{82E5}']), + (0x1e1a, &['\u{0045}', '\u{0330}']), + (0x2f82a, &['\u{5306}']), + (0x2f93e, &['\u{3FFC}']), + (0x22d, &['\u{006F}', '\u{0303}', '\u{0304}']), + (0x1f81, &['\u{03B1}', '\u{0314}', '\u{0345}']), + (0x1ed2, &['\u{004F}', '\u{0302}', '\u{0300}']), + (0x1f21, &['\u{03B7}', '\u{0314}']), + (0x2f9d7, &['\u{8D77}']), + (0x1ead, &['\u{0061}', '\u{0323}', '\u{0302}']), + (0xfb31, &['\u{05D1}', '\u{05BC}']), + (0x2f8da, &['\u{6721}']), + (0xb5c, &['\u{0B21}', '\u{0B3C}']), + (0x2f9e7, &['\u{9238}']), + (0x2f904, &['\u{6D78}']), + (0x959, &['\u{0916}', '\u{093C}']), + (0x158, &['\u{0052}', '\u{030C}']), + (0x2f8ca, &['\u{2300A}']), + (0x1b08, &['\u{1B07}', '\u{1B35}']), + (0x2f9ad, &['\u{26F2C}']), + (0x1e3e, &['\u{004D}', '\u{0301}']), + (0x2f838, &['\u{20B63}']), + (0x2f8ef, &['\u{6B21}']), + (0x1ee, &['\u{01B7}', '\u{030C}']), + (0xf953, &['\u{808B}']), + (0x2329, &['\u{3008}']), + (0xf961, &['\u{7387}']), + (0x150, &['\u{004F}', '\u{030B}']), + (0xfa58, &['\u{7E09}']), + (0x1e46, &['\u{004E}', '\u{0323}']), + (0x12e, &['\u{0049}', '\u{0328}']), + (0x1f19, &['\u{0395}', '\u{0314}']), + (0x2f82b, &['\u{5317}']), + (0x2fa0c, &['\u{9CFD}']), + (0x1edc, &['\u{004F}', '\u{031B}', '\u{0300}']), + (0xfacd, &['\u{9B12}']), + (0x2f8a0, &['\u{6081}']), + (0x1f80, &['\u{03B1}', '\u{0313}', '\u{0345}']), + (0x1eec, &['\u{0055}', '\u{031B}', '\u{0309}']), + (0x2f9e1, &['\u{285ED}']), + (0x2f8b6, &['\u{62D4}']), + (0x1f93, &['\u{03B7}', '\u{0314}', '\u{0300}', '\u{0345}']), + (0x2f986, &['\u{5AB5}']), + (0x30b8, &['\u{30B7}', '\u{3099}']), + (0x37e, &['\u{003B}']), + (0x1fb8, &['\u{0391}', '\u{0306}']), + (0xc9, &['\u{0045}', '\u{0301}']), + (0x1e86, &['\u{0057}', '\u{0307}']), + (0xfa57, &['\u{7DF4}']), + (0x2f95d, &['\u{25AA7}']), + (0x130, &['\u{0049}', '\u{0307}']), + (0x2f933, &['\u{3F1B}']), + (0x2f912, &['\u{6FC6}']), + (0x4db, &['\u{04D9}', '\u{0308}']), + (0x2f9c0, &['\u{87E1}']), + (0xf904, &['\u{6ED1}']), + (0x2f81a, &['\u{51AC}']), + (0x4ea, &['\u{04E8}', '\u{0308}']), + (0x3ae, &['\u{03B7}', '\u{0301}']), + (0xf43, &['\u{0F42}', '\u{0FB7}']), + (0x1ff4, &['\u{03C9}', '\u{0301}', '\u{0345}']), + (0x1e23, &['\u{0068}', '\u{0307}']), + (0xd6, &['\u{004F}', '\u{0308}']), + (0x2f8b5, &['\u{62B1}']), + (0x2f87b, &['\u{21DE4}']), + (0x9cb, &['\u{09C7}', '\u{09BE}']), + (0x1ec2, &['\u{0045}', '\u{0302}', '\u{0309}']), + (0xfa4c, &['\u{793E}']), + (0x3052, &['\u{3051}', '\u{3099}']), + (0xd1, &['\u{004E}', '\u{0303}']), + (0x2f818, &['\u{51A4}']), +]; -#[inline] -pub fn compatibility_fully_decomposed(c: char) -> Option<&'static [char]> { - match c { - '\u{00A0}' => Some(&['\u{0020}']), - '\u{00A8}' => Some(&['\u{0020}', '\u{0308}']), - '\u{00AA}' => Some(&['\u{0061}']), - '\u{00AF}' => Some(&['\u{0020}', '\u{0304}']), - '\u{00B2}' => Some(&['\u{0032}']), - '\u{00B3}' => Some(&['\u{0033}']), - '\u{00B4}' => Some(&['\u{0020}', '\u{0301}']), - '\u{00B5}' => Some(&['\u{03BC}']), - '\u{00B8}' => Some(&['\u{0020}', '\u{0327}']), - '\u{00B9}' => Some(&['\u{0031}']), - '\u{00BA}' => Some(&['\u{006F}']), - '\u{00BC}' => Some(&['\u{0031}', '\u{2044}', '\u{0034}']), - '\u{00BD}' => Some(&['\u{0031}', '\u{2044}', '\u{0032}']), - '\u{00BE}' => Some(&['\u{0033}', '\u{2044}', '\u{0034}']), - '\u{0132}' => Some(&['\u{0049}', '\u{004A}']), - '\u{0133}' => Some(&['\u{0069}', '\u{006A}']), - '\u{013F}' => Some(&['\u{004C}', '\u{00B7}']), - '\u{0140}' => Some(&['\u{006C}', '\u{00B7}']), - '\u{0149}' => Some(&['\u{02BC}', '\u{006E}']), - '\u{017F}' => Some(&['\u{0073}']), - '\u{01C4}' => Some(&['\u{0044}', '\u{005A}', '\u{030C}']), - '\u{01C5}' => Some(&['\u{0044}', '\u{007A}', '\u{030C}']), - '\u{01C6}' => Some(&['\u{0064}', '\u{007A}', '\u{030C}']), - '\u{01C7}' => Some(&['\u{004C}', '\u{004A}']), - '\u{01C8}' => Some(&['\u{004C}', '\u{006A}']), - '\u{01C9}' => Some(&['\u{006C}', '\u{006A}']), - '\u{01CA}' => Some(&['\u{004E}', '\u{004A}']), - '\u{01CB}' => Some(&['\u{004E}', '\u{006A}']), - '\u{01CC}' => Some(&['\u{006E}', '\u{006A}']), - '\u{01F1}' => Some(&['\u{0044}', '\u{005A}']), - '\u{01F2}' => Some(&['\u{0044}', '\u{007A}']), - '\u{01F3}' => Some(&['\u{0064}', '\u{007A}']), - '\u{02B0}' => Some(&['\u{0068}']), - '\u{02B1}' => Some(&['\u{0266}']), - '\u{02B2}' => Some(&['\u{006A}']), - '\u{02B3}' => Some(&['\u{0072}']), - '\u{02B4}' => Some(&['\u{0279}']), - '\u{02B5}' => Some(&['\u{027B}']), - '\u{02B6}' => Some(&['\u{0281}']), - '\u{02B7}' => Some(&['\u{0077}']), - '\u{02B8}' => Some(&['\u{0079}']), - '\u{02D8}' => Some(&['\u{0020}', '\u{0306}']), - '\u{02D9}' => Some(&['\u{0020}', '\u{0307}']), - '\u{02DA}' => Some(&['\u{0020}', '\u{030A}']), - '\u{02DB}' => Some(&['\u{0020}', '\u{0328}']), - '\u{02DC}' => Some(&['\u{0020}', '\u{0303}']), - '\u{02DD}' => Some(&['\u{0020}', '\u{030B}']), - '\u{02E0}' => Some(&['\u{0263}']), - '\u{02E1}' => Some(&['\u{006C}']), - '\u{02E2}' => Some(&['\u{0073}']), - '\u{02E3}' => Some(&['\u{0078}']), - '\u{02E4}' => Some(&['\u{0295}']), - '\u{037A}' => Some(&['\u{0020}', '\u{0345}']), - '\u{0384}' => Some(&['\u{0020}', '\u{0301}']), - '\u{0385}' => Some(&['\u{0020}', '\u{0308}', '\u{0301}']), - '\u{03D0}' => Some(&['\u{03B2}']), - '\u{03D1}' => Some(&['\u{03B8}']), - '\u{03D2}' => Some(&['\u{03A5}']), - '\u{03D3}' => Some(&['\u{03A5}', '\u{0301}']), - '\u{03D4}' => Some(&['\u{03A5}', '\u{0308}']), - '\u{03D5}' => Some(&['\u{03C6}']), - '\u{03D6}' => Some(&['\u{03C0}']), - '\u{03F0}' => Some(&['\u{03BA}']), - '\u{03F1}' => Some(&['\u{03C1}']), - '\u{03F2}' => Some(&['\u{03C2}']), - '\u{03F4}' => Some(&['\u{0398}']), - '\u{03F5}' => Some(&['\u{03B5}']), - '\u{03F9}' => Some(&['\u{03A3}']), - '\u{0587}' => Some(&['\u{0565}', '\u{0582}']), - '\u{0675}' => Some(&['\u{0627}', '\u{0674}']), - '\u{0676}' => Some(&['\u{0648}', '\u{0674}']), - '\u{0677}' => Some(&['\u{06C7}', '\u{0674}']), - '\u{0678}' => Some(&['\u{064A}', '\u{0674}']), - '\u{0E33}' => Some(&['\u{0E4D}', '\u{0E32}']), - '\u{0EB3}' => Some(&['\u{0ECD}', '\u{0EB2}']), - '\u{0EDC}' => Some(&['\u{0EAB}', '\u{0E99}']), - '\u{0EDD}' => Some(&['\u{0EAB}', '\u{0EA1}']), - '\u{0F0C}' => Some(&['\u{0F0B}']), - '\u{0F77}' => Some(&['\u{0FB2}', '\u{0F71}', '\u{0F80}']), - '\u{0F79}' => Some(&['\u{0FB3}', '\u{0F71}', '\u{0F80}']), - '\u{10FC}' => Some(&['\u{10DC}']), - '\u{1D2C}' => Some(&['\u{0041}']), - '\u{1D2D}' => Some(&['\u{00C6}']), - '\u{1D2E}' => Some(&['\u{0042}']), - '\u{1D30}' => Some(&['\u{0044}']), - '\u{1D31}' => Some(&['\u{0045}']), - '\u{1D32}' => Some(&['\u{018E}']), - '\u{1D33}' => Some(&['\u{0047}']), - '\u{1D34}' => Some(&['\u{0048}']), - '\u{1D35}' => Some(&['\u{0049}']), - '\u{1D36}' => Some(&['\u{004A}']), - '\u{1D37}' => Some(&['\u{004B}']), - '\u{1D38}' => Some(&['\u{004C}']), - '\u{1D39}' => Some(&['\u{004D}']), - '\u{1D3A}' => Some(&['\u{004E}']), - '\u{1D3C}' => Some(&['\u{004F}']), - '\u{1D3D}' => Some(&['\u{0222}']), - '\u{1D3E}' => Some(&['\u{0050}']), - '\u{1D3F}' => Some(&['\u{0052}']), - '\u{1D40}' => Some(&['\u{0054}']), - '\u{1D41}' => Some(&['\u{0055}']), - '\u{1D42}' => Some(&['\u{0057}']), - '\u{1D43}' => Some(&['\u{0061}']), - '\u{1D44}' => Some(&['\u{0250}']), - '\u{1D45}' => Some(&['\u{0251}']), - '\u{1D46}' => Some(&['\u{1D02}']), - '\u{1D47}' => Some(&['\u{0062}']), - '\u{1D48}' => Some(&['\u{0064}']), - '\u{1D49}' => Some(&['\u{0065}']), - '\u{1D4A}' => Some(&['\u{0259}']), - '\u{1D4B}' => Some(&['\u{025B}']), - '\u{1D4C}' => Some(&['\u{025C}']), - '\u{1D4D}' => Some(&['\u{0067}']), - '\u{1D4F}' => Some(&['\u{006B}']), - '\u{1D50}' => Some(&['\u{006D}']), - '\u{1D51}' => Some(&['\u{014B}']), - '\u{1D52}' => Some(&['\u{006F}']), - '\u{1D53}' => Some(&['\u{0254}']), - '\u{1D54}' => Some(&['\u{1D16}']), - '\u{1D55}' => Some(&['\u{1D17}']), - '\u{1D56}' => Some(&['\u{0070}']), - '\u{1D57}' => Some(&['\u{0074}']), - '\u{1D58}' => Some(&['\u{0075}']), - '\u{1D59}' => Some(&['\u{1D1D}']), - '\u{1D5A}' => Some(&['\u{026F}']), - '\u{1D5B}' => Some(&['\u{0076}']), - '\u{1D5C}' => Some(&['\u{1D25}']), - '\u{1D5D}' => Some(&['\u{03B2}']), - '\u{1D5E}' => Some(&['\u{03B3}']), - '\u{1D5F}' => Some(&['\u{03B4}']), - '\u{1D60}' => Some(&['\u{03C6}']), - '\u{1D61}' => Some(&['\u{03C7}']), - '\u{1D62}' => Some(&['\u{0069}']), - '\u{1D63}' => Some(&['\u{0072}']), - '\u{1D64}' => Some(&['\u{0075}']), - '\u{1D65}' => Some(&['\u{0076}']), - '\u{1D66}' => Some(&['\u{03B2}']), - '\u{1D67}' => Some(&['\u{03B3}']), - '\u{1D68}' => Some(&['\u{03C1}']), - '\u{1D69}' => Some(&['\u{03C6}']), - '\u{1D6A}' => Some(&['\u{03C7}']), - '\u{1D78}' => Some(&['\u{043D}']), - '\u{1D9B}' => Some(&['\u{0252}']), - '\u{1D9C}' => Some(&['\u{0063}']), - '\u{1D9D}' => Some(&['\u{0255}']), - '\u{1D9E}' => Some(&['\u{00F0}']), - '\u{1D9F}' => Some(&['\u{025C}']), - '\u{1DA0}' => Some(&['\u{0066}']), - '\u{1DA1}' => Some(&['\u{025F}']), - '\u{1DA2}' => Some(&['\u{0261}']), - '\u{1DA3}' => Some(&['\u{0265}']), - '\u{1DA4}' => Some(&['\u{0268}']), - '\u{1DA5}' => Some(&['\u{0269}']), - '\u{1DA6}' => Some(&['\u{026A}']), - '\u{1DA7}' => Some(&['\u{1D7B}']), - '\u{1DA8}' => Some(&['\u{029D}']), - '\u{1DA9}' => Some(&['\u{026D}']), - '\u{1DAA}' => Some(&['\u{1D85}']), - '\u{1DAB}' => Some(&['\u{029F}']), - '\u{1DAC}' => Some(&['\u{0271}']), - '\u{1DAD}' => Some(&['\u{0270}']), - '\u{1DAE}' => Some(&['\u{0272}']), - '\u{1DAF}' => Some(&['\u{0273}']), - '\u{1DB0}' => Some(&['\u{0274}']), - '\u{1DB1}' => Some(&['\u{0275}']), - '\u{1DB2}' => Some(&['\u{0278}']), - '\u{1DB3}' => Some(&['\u{0282}']), - '\u{1DB4}' => Some(&['\u{0283}']), - '\u{1DB5}' => Some(&['\u{01AB}']), - '\u{1DB6}' => Some(&['\u{0289}']), - '\u{1DB7}' => Some(&['\u{028A}']), - '\u{1DB8}' => Some(&['\u{1D1C}']), - '\u{1DB9}' => Some(&['\u{028B}']), - '\u{1DBA}' => Some(&['\u{028C}']), - '\u{1DBB}' => Some(&['\u{007A}']), - '\u{1DBC}' => Some(&['\u{0290}']), - '\u{1DBD}' => Some(&['\u{0291}']), - '\u{1DBE}' => Some(&['\u{0292}']), - '\u{1DBF}' => Some(&['\u{03B8}']), - '\u{1E9A}' => Some(&['\u{0061}', '\u{02BE}']), - '\u{1E9B}' => Some(&['\u{0073}', '\u{0307}']), - '\u{1FBD}' => Some(&['\u{0020}', '\u{0313}']), - '\u{1FBF}' => Some(&['\u{0020}', '\u{0313}']), - '\u{1FC0}' => Some(&['\u{0020}', '\u{0342}']), - '\u{1FC1}' => Some(&['\u{0020}', '\u{0308}', '\u{0342}']), - '\u{1FCD}' => Some(&['\u{0020}', '\u{0313}', '\u{0300}']), - '\u{1FCE}' => Some(&['\u{0020}', '\u{0313}', '\u{0301}']), - '\u{1FCF}' => Some(&['\u{0020}', '\u{0313}', '\u{0342}']), - '\u{1FDD}' => Some(&['\u{0020}', '\u{0314}', '\u{0300}']), - '\u{1FDE}' => Some(&['\u{0020}', '\u{0314}', '\u{0301}']), - '\u{1FDF}' => Some(&['\u{0020}', '\u{0314}', '\u{0342}']), - '\u{1FED}' => Some(&['\u{0020}', '\u{0308}', '\u{0300}']), - '\u{1FEE}' => Some(&['\u{0020}', '\u{0308}', '\u{0301}']), - '\u{1FFD}' => Some(&['\u{0020}', '\u{0301}']), - '\u{1FFE}' => Some(&['\u{0020}', '\u{0314}']), - '\u{2000}' => Some(&['\u{0020}']), - '\u{2001}' => Some(&['\u{0020}']), - '\u{2002}' => Some(&['\u{0020}']), - '\u{2003}' => Some(&['\u{0020}']), - '\u{2004}' => Some(&['\u{0020}']), - '\u{2005}' => Some(&['\u{0020}']), - '\u{2006}' => Some(&['\u{0020}']), - '\u{2007}' => Some(&['\u{0020}']), - '\u{2008}' => Some(&['\u{0020}']), - '\u{2009}' => Some(&['\u{0020}']), - '\u{200A}' => Some(&['\u{0020}']), - '\u{2011}' => Some(&['\u{2010}']), - '\u{2017}' => Some(&['\u{0020}', '\u{0333}']), - '\u{2024}' => Some(&['\u{002E}']), - '\u{2025}' => Some(&['\u{002E}', '\u{002E}']), - '\u{2026}' => Some(&['\u{002E}', '\u{002E}', '\u{002E}']), - '\u{202F}' => Some(&['\u{0020}']), - '\u{2033}' => Some(&['\u{2032}', '\u{2032}']), - '\u{2034}' => Some(&['\u{2032}', '\u{2032}', '\u{2032}']), - '\u{2036}' => Some(&['\u{2035}', '\u{2035}']), - '\u{2037}' => Some(&['\u{2035}', '\u{2035}', '\u{2035}']), - '\u{203C}' => Some(&['\u{0021}', '\u{0021}']), - '\u{203E}' => Some(&['\u{0020}', '\u{0305}']), - '\u{2047}' => Some(&['\u{003F}', '\u{003F}']), - '\u{2048}' => Some(&['\u{003F}', '\u{0021}']), - '\u{2049}' => Some(&['\u{0021}', '\u{003F}']), - '\u{2057}' => Some(&['\u{2032}', '\u{2032}', '\u{2032}', '\u{2032}']), - '\u{205F}' => Some(&['\u{0020}']), - '\u{2070}' => Some(&['\u{0030}']), - '\u{2071}' => Some(&['\u{0069}']), - '\u{2074}' => Some(&['\u{0034}']), - '\u{2075}' => Some(&['\u{0035}']), - '\u{2076}' => Some(&['\u{0036}']), - '\u{2077}' => Some(&['\u{0037}']), - '\u{2078}' => Some(&['\u{0038}']), - '\u{2079}' => Some(&['\u{0039}']), - '\u{207A}' => Some(&['\u{002B}']), - '\u{207B}' => Some(&['\u{2212}']), - '\u{207C}' => Some(&['\u{003D}']), - '\u{207D}' => Some(&['\u{0028}']), - '\u{207E}' => Some(&['\u{0029}']), - '\u{207F}' => Some(&['\u{006E}']), - '\u{2080}' => Some(&['\u{0030}']), - '\u{2081}' => Some(&['\u{0031}']), - '\u{2082}' => Some(&['\u{0032}']), - '\u{2083}' => Some(&['\u{0033}']), - '\u{2084}' => Some(&['\u{0034}']), - '\u{2085}' => Some(&['\u{0035}']), - '\u{2086}' => Some(&['\u{0036}']), - '\u{2087}' => Some(&['\u{0037}']), - '\u{2088}' => Some(&['\u{0038}']), - '\u{2089}' => Some(&['\u{0039}']), - '\u{208A}' => Some(&['\u{002B}']), - '\u{208B}' => Some(&['\u{2212}']), - '\u{208C}' => Some(&['\u{003D}']), - '\u{208D}' => Some(&['\u{0028}']), - '\u{208E}' => Some(&['\u{0029}']), - '\u{2090}' => Some(&['\u{0061}']), - '\u{2091}' => Some(&['\u{0065}']), - '\u{2092}' => Some(&['\u{006F}']), - '\u{2093}' => Some(&['\u{0078}']), - '\u{2094}' => Some(&['\u{0259}']), - '\u{2095}' => Some(&['\u{0068}']), - '\u{2096}' => Some(&['\u{006B}']), - '\u{2097}' => Some(&['\u{006C}']), - '\u{2098}' => Some(&['\u{006D}']), - '\u{2099}' => Some(&['\u{006E}']), - '\u{209A}' => Some(&['\u{0070}']), - '\u{209B}' => Some(&['\u{0073}']), - '\u{209C}' => Some(&['\u{0074}']), - '\u{20A8}' => Some(&['\u{0052}', '\u{0073}']), - '\u{2100}' => Some(&['\u{0061}', '\u{002F}', '\u{0063}']), - '\u{2101}' => Some(&['\u{0061}', '\u{002F}', '\u{0073}']), - '\u{2102}' => Some(&['\u{0043}']), - '\u{2103}' => Some(&['\u{00B0}', '\u{0043}']), - '\u{2105}' => Some(&['\u{0063}', '\u{002F}', '\u{006F}']), - '\u{2106}' => Some(&['\u{0063}', '\u{002F}', '\u{0075}']), - '\u{2107}' => Some(&['\u{0190}']), - '\u{2109}' => Some(&['\u{00B0}', '\u{0046}']), - '\u{210A}' => Some(&['\u{0067}']), - '\u{210B}' => Some(&['\u{0048}']), - '\u{210C}' => Some(&['\u{0048}']), - '\u{210D}' => Some(&['\u{0048}']), - '\u{210E}' => Some(&['\u{0068}']), - '\u{210F}' => Some(&['\u{0127}']), - '\u{2110}' => Some(&['\u{0049}']), - '\u{2111}' => Some(&['\u{0049}']), - '\u{2112}' => Some(&['\u{004C}']), - '\u{2113}' => Some(&['\u{006C}']), - '\u{2115}' => Some(&['\u{004E}']), - '\u{2116}' => Some(&['\u{004E}', '\u{006F}']), - '\u{2119}' => Some(&['\u{0050}']), - '\u{211A}' => Some(&['\u{0051}']), - '\u{211B}' => Some(&['\u{0052}']), - '\u{211C}' => Some(&['\u{0052}']), - '\u{211D}' => Some(&['\u{0052}']), - '\u{2120}' => Some(&['\u{0053}', '\u{004D}']), - '\u{2121}' => Some(&['\u{0054}', '\u{0045}', '\u{004C}']), - '\u{2122}' => Some(&['\u{0054}', '\u{004D}']), - '\u{2124}' => Some(&['\u{005A}']), - '\u{2128}' => Some(&['\u{005A}']), - '\u{212C}' => Some(&['\u{0042}']), - '\u{212D}' => Some(&['\u{0043}']), - '\u{212F}' => Some(&['\u{0065}']), - '\u{2130}' => Some(&['\u{0045}']), - '\u{2131}' => Some(&['\u{0046}']), - '\u{2133}' => Some(&['\u{004D}']), - '\u{2134}' => Some(&['\u{006F}']), - '\u{2135}' => Some(&['\u{05D0}']), - '\u{2136}' => Some(&['\u{05D1}']), - '\u{2137}' => Some(&['\u{05D2}']), - '\u{2138}' => Some(&['\u{05D3}']), - '\u{2139}' => Some(&['\u{0069}']), - '\u{213B}' => Some(&['\u{0046}', '\u{0041}', '\u{0058}']), - '\u{213C}' => Some(&['\u{03C0}']), - '\u{213D}' => Some(&['\u{03B3}']), - '\u{213E}' => Some(&['\u{0393}']), - '\u{213F}' => Some(&['\u{03A0}']), - '\u{2140}' => Some(&['\u{2211}']), - '\u{2145}' => Some(&['\u{0044}']), - '\u{2146}' => Some(&['\u{0064}']), - '\u{2147}' => Some(&['\u{0065}']), - '\u{2148}' => Some(&['\u{0069}']), - '\u{2149}' => Some(&['\u{006A}']), - '\u{2150}' => Some(&['\u{0031}', '\u{2044}', '\u{0037}']), - '\u{2151}' => Some(&['\u{0031}', '\u{2044}', '\u{0039}']), - '\u{2152}' => Some(&['\u{0031}', '\u{2044}', '\u{0031}', '\u{0030}']), - '\u{2153}' => Some(&['\u{0031}', '\u{2044}', '\u{0033}']), - '\u{2154}' => Some(&['\u{0032}', '\u{2044}', '\u{0033}']), - '\u{2155}' => Some(&['\u{0031}', '\u{2044}', '\u{0035}']), - '\u{2156}' => Some(&['\u{0032}', '\u{2044}', '\u{0035}']), - '\u{2157}' => Some(&['\u{0033}', '\u{2044}', '\u{0035}']), - '\u{2158}' => Some(&['\u{0034}', '\u{2044}', '\u{0035}']), - '\u{2159}' => Some(&['\u{0031}', '\u{2044}', '\u{0036}']), - '\u{215A}' => Some(&['\u{0035}', '\u{2044}', '\u{0036}']), - '\u{215B}' => Some(&['\u{0031}', '\u{2044}', '\u{0038}']), - '\u{215C}' => Some(&['\u{0033}', '\u{2044}', '\u{0038}']), - '\u{215D}' => Some(&['\u{0035}', '\u{2044}', '\u{0038}']), - '\u{215E}' => Some(&['\u{0037}', '\u{2044}', '\u{0038}']), - '\u{215F}' => Some(&['\u{0031}', '\u{2044}']), - '\u{2160}' => Some(&['\u{0049}']), - '\u{2161}' => Some(&['\u{0049}', '\u{0049}']), - '\u{2162}' => Some(&['\u{0049}', '\u{0049}', '\u{0049}']), - '\u{2163}' => Some(&['\u{0049}', '\u{0056}']), - '\u{2164}' => Some(&['\u{0056}']), - '\u{2165}' => Some(&['\u{0056}', '\u{0049}']), - '\u{2166}' => Some(&['\u{0056}', '\u{0049}', '\u{0049}']), - '\u{2167}' => Some(&['\u{0056}', '\u{0049}', '\u{0049}', '\u{0049}']), - '\u{2168}' => Some(&['\u{0049}', '\u{0058}']), - '\u{2169}' => Some(&['\u{0058}']), - '\u{216A}' => Some(&['\u{0058}', '\u{0049}']), - '\u{216B}' => Some(&['\u{0058}', '\u{0049}', '\u{0049}']), - '\u{216C}' => Some(&['\u{004C}']), - '\u{216D}' => Some(&['\u{0043}']), - '\u{216E}' => Some(&['\u{0044}']), - '\u{216F}' => Some(&['\u{004D}']), - '\u{2170}' => Some(&['\u{0069}']), - '\u{2171}' => Some(&['\u{0069}', '\u{0069}']), - '\u{2172}' => Some(&['\u{0069}', '\u{0069}', '\u{0069}']), - '\u{2173}' => Some(&['\u{0069}', '\u{0076}']), - '\u{2174}' => Some(&['\u{0076}']), - '\u{2175}' => Some(&['\u{0076}', '\u{0069}']), - '\u{2176}' => Some(&['\u{0076}', '\u{0069}', '\u{0069}']), - '\u{2177}' => Some(&['\u{0076}', '\u{0069}', '\u{0069}', '\u{0069}']), - '\u{2178}' => Some(&['\u{0069}', '\u{0078}']), - '\u{2179}' => Some(&['\u{0078}']), - '\u{217A}' => Some(&['\u{0078}', '\u{0069}']), - '\u{217B}' => Some(&['\u{0078}', '\u{0069}', '\u{0069}']), - '\u{217C}' => Some(&['\u{006C}']), - '\u{217D}' => Some(&['\u{0063}']), - '\u{217E}' => Some(&['\u{0064}']), - '\u{217F}' => Some(&['\u{006D}']), - '\u{2189}' => Some(&['\u{0030}', '\u{2044}', '\u{0033}']), - '\u{222C}' => Some(&['\u{222B}', '\u{222B}']), - '\u{222D}' => Some(&['\u{222B}', '\u{222B}', '\u{222B}']), - '\u{222F}' => Some(&['\u{222E}', '\u{222E}']), - '\u{2230}' => Some(&['\u{222E}', '\u{222E}', '\u{222E}']), - '\u{2460}' => Some(&['\u{0031}']), - '\u{2461}' => Some(&['\u{0032}']), - '\u{2462}' => Some(&['\u{0033}']), - '\u{2463}' => Some(&['\u{0034}']), - '\u{2464}' => Some(&['\u{0035}']), - '\u{2465}' => Some(&['\u{0036}']), - '\u{2466}' => Some(&['\u{0037}']), - '\u{2467}' => Some(&['\u{0038}']), - '\u{2468}' => Some(&['\u{0039}']), - '\u{2469}' => Some(&['\u{0031}', '\u{0030}']), - '\u{246A}' => Some(&['\u{0031}', '\u{0031}']), - '\u{246B}' => Some(&['\u{0031}', '\u{0032}']), - '\u{246C}' => Some(&['\u{0031}', '\u{0033}']), - '\u{246D}' => Some(&['\u{0031}', '\u{0034}']), - '\u{246E}' => Some(&['\u{0031}', '\u{0035}']), - '\u{246F}' => Some(&['\u{0031}', '\u{0036}']), - '\u{2470}' => Some(&['\u{0031}', '\u{0037}']), - '\u{2471}' => Some(&['\u{0031}', '\u{0038}']), - '\u{2472}' => Some(&['\u{0031}', '\u{0039}']), - '\u{2473}' => Some(&['\u{0032}', '\u{0030}']), - '\u{2474}' => Some(&['\u{0028}', '\u{0031}', '\u{0029}']), - '\u{2475}' => Some(&['\u{0028}', '\u{0032}', '\u{0029}']), - '\u{2476}' => Some(&['\u{0028}', '\u{0033}', '\u{0029}']), - '\u{2477}' => Some(&['\u{0028}', '\u{0034}', '\u{0029}']), - '\u{2478}' => Some(&['\u{0028}', '\u{0035}', '\u{0029}']), - '\u{2479}' => Some(&['\u{0028}', '\u{0036}', '\u{0029}']), - '\u{247A}' => Some(&['\u{0028}', '\u{0037}', '\u{0029}']), - '\u{247B}' => Some(&['\u{0028}', '\u{0038}', '\u{0029}']), - '\u{247C}' => Some(&['\u{0028}', '\u{0039}', '\u{0029}']), - '\u{247D}' => Some(&['\u{0028}', '\u{0031}', '\u{0030}', '\u{0029}']), - '\u{247E}' => Some(&['\u{0028}', '\u{0031}', '\u{0031}', '\u{0029}']), - '\u{247F}' => Some(&['\u{0028}', '\u{0031}', '\u{0032}', '\u{0029}']), - '\u{2480}' => Some(&['\u{0028}', '\u{0031}', '\u{0033}', '\u{0029}']), - '\u{2481}' => Some(&['\u{0028}', '\u{0031}', '\u{0034}', '\u{0029}']), - '\u{2482}' => Some(&['\u{0028}', '\u{0031}', '\u{0035}', '\u{0029}']), - '\u{2483}' => Some(&['\u{0028}', '\u{0031}', '\u{0036}', '\u{0029}']), - '\u{2484}' => Some(&['\u{0028}', '\u{0031}', '\u{0037}', '\u{0029}']), - '\u{2485}' => Some(&['\u{0028}', '\u{0031}', '\u{0038}', '\u{0029}']), - '\u{2486}' => Some(&['\u{0028}', '\u{0031}', '\u{0039}', '\u{0029}']), - '\u{2487}' => Some(&['\u{0028}', '\u{0032}', '\u{0030}', '\u{0029}']), - '\u{2488}' => Some(&['\u{0031}', '\u{002E}']), - '\u{2489}' => Some(&['\u{0032}', '\u{002E}']), - '\u{248A}' => Some(&['\u{0033}', '\u{002E}']), - '\u{248B}' => Some(&['\u{0034}', '\u{002E}']), - '\u{248C}' => Some(&['\u{0035}', '\u{002E}']), - '\u{248D}' => Some(&['\u{0036}', '\u{002E}']), - '\u{248E}' => Some(&['\u{0037}', '\u{002E}']), - '\u{248F}' => Some(&['\u{0038}', '\u{002E}']), - '\u{2490}' => Some(&['\u{0039}', '\u{002E}']), - '\u{2491}' => Some(&['\u{0031}', '\u{0030}', '\u{002E}']), - '\u{2492}' => Some(&['\u{0031}', '\u{0031}', '\u{002E}']), - '\u{2493}' => Some(&['\u{0031}', '\u{0032}', '\u{002E}']), - '\u{2494}' => Some(&['\u{0031}', '\u{0033}', '\u{002E}']), - '\u{2495}' => Some(&['\u{0031}', '\u{0034}', '\u{002E}']), - '\u{2496}' => Some(&['\u{0031}', '\u{0035}', '\u{002E}']), - '\u{2497}' => Some(&['\u{0031}', '\u{0036}', '\u{002E}']), - '\u{2498}' => Some(&['\u{0031}', '\u{0037}', '\u{002E}']), - '\u{2499}' => Some(&['\u{0031}', '\u{0038}', '\u{002E}']), - '\u{249A}' => Some(&['\u{0031}', '\u{0039}', '\u{002E}']), - '\u{249B}' => Some(&['\u{0032}', '\u{0030}', '\u{002E}']), - '\u{249C}' => Some(&['\u{0028}', '\u{0061}', '\u{0029}']), - '\u{249D}' => Some(&['\u{0028}', '\u{0062}', '\u{0029}']), - '\u{249E}' => Some(&['\u{0028}', '\u{0063}', '\u{0029}']), - '\u{249F}' => Some(&['\u{0028}', '\u{0064}', '\u{0029}']), - '\u{24A0}' => Some(&['\u{0028}', '\u{0065}', '\u{0029}']), - '\u{24A1}' => Some(&['\u{0028}', '\u{0066}', '\u{0029}']), - '\u{24A2}' => Some(&['\u{0028}', '\u{0067}', '\u{0029}']), - '\u{24A3}' => Some(&['\u{0028}', '\u{0068}', '\u{0029}']), - '\u{24A4}' => Some(&['\u{0028}', '\u{0069}', '\u{0029}']), - '\u{24A5}' => Some(&['\u{0028}', '\u{006A}', '\u{0029}']), - '\u{24A6}' => Some(&['\u{0028}', '\u{006B}', '\u{0029}']), - '\u{24A7}' => Some(&['\u{0028}', '\u{006C}', '\u{0029}']), - '\u{24A8}' => Some(&['\u{0028}', '\u{006D}', '\u{0029}']), - '\u{24A9}' => Some(&['\u{0028}', '\u{006E}', '\u{0029}']), - '\u{24AA}' => Some(&['\u{0028}', '\u{006F}', '\u{0029}']), - '\u{24AB}' => Some(&['\u{0028}', '\u{0070}', '\u{0029}']), - '\u{24AC}' => Some(&['\u{0028}', '\u{0071}', '\u{0029}']), - '\u{24AD}' => Some(&['\u{0028}', '\u{0072}', '\u{0029}']), - '\u{24AE}' => Some(&['\u{0028}', '\u{0073}', '\u{0029}']), - '\u{24AF}' => Some(&['\u{0028}', '\u{0074}', '\u{0029}']), - '\u{24B0}' => Some(&['\u{0028}', '\u{0075}', '\u{0029}']), - '\u{24B1}' => Some(&['\u{0028}', '\u{0076}', '\u{0029}']), - '\u{24B2}' => Some(&['\u{0028}', '\u{0077}', '\u{0029}']), - '\u{24B3}' => Some(&['\u{0028}', '\u{0078}', '\u{0029}']), - '\u{24B4}' => Some(&['\u{0028}', '\u{0079}', '\u{0029}']), - '\u{24B5}' => Some(&['\u{0028}', '\u{007A}', '\u{0029}']), - '\u{24B6}' => Some(&['\u{0041}']), - '\u{24B7}' => Some(&['\u{0042}']), - '\u{24B8}' => Some(&['\u{0043}']), - '\u{24B9}' => Some(&['\u{0044}']), - '\u{24BA}' => Some(&['\u{0045}']), - '\u{24BB}' => Some(&['\u{0046}']), - '\u{24BC}' => Some(&['\u{0047}']), - '\u{24BD}' => Some(&['\u{0048}']), - '\u{24BE}' => Some(&['\u{0049}']), - '\u{24BF}' => Some(&['\u{004A}']), - '\u{24C0}' => Some(&['\u{004B}']), - '\u{24C1}' => Some(&['\u{004C}']), - '\u{24C2}' => Some(&['\u{004D}']), - '\u{24C3}' => Some(&['\u{004E}']), - '\u{24C4}' => Some(&['\u{004F}']), - '\u{24C5}' => Some(&['\u{0050}']), - '\u{24C6}' => Some(&['\u{0051}']), - '\u{24C7}' => Some(&['\u{0052}']), - '\u{24C8}' => Some(&['\u{0053}']), - '\u{24C9}' => Some(&['\u{0054}']), - '\u{24CA}' => Some(&['\u{0055}']), - '\u{24CB}' => Some(&['\u{0056}']), - '\u{24CC}' => Some(&['\u{0057}']), - '\u{24CD}' => Some(&['\u{0058}']), - '\u{24CE}' => Some(&['\u{0059}']), - '\u{24CF}' => Some(&['\u{005A}']), - '\u{24D0}' => Some(&['\u{0061}']), - '\u{24D1}' => Some(&['\u{0062}']), - '\u{24D2}' => Some(&['\u{0063}']), - '\u{24D3}' => Some(&['\u{0064}']), - '\u{24D4}' => Some(&['\u{0065}']), - '\u{24D5}' => Some(&['\u{0066}']), - '\u{24D6}' => Some(&['\u{0067}']), - '\u{24D7}' => Some(&['\u{0068}']), - '\u{24D8}' => Some(&['\u{0069}']), - '\u{24D9}' => Some(&['\u{006A}']), - '\u{24DA}' => Some(&['\u{006B}']), - '\u{24DB}' => Some(&['\u{006C}']), - '\u{24DC}' => Some(&['\u{006D}']), - '\u{24DD}' => Some(&['\u{006E}']), - '\u{24DE}' => Some(&['\u{006F}']), - '\u{24DF}' => Some(&['\u{0070}']), - '\u{24E0}' => Some(&['\u{0071}']), - '\u{24E1}' => Some(&['\u{0072}']), - '\u{24E2}' => Some(&['\u{0073}']), - '\u{24E3}' => Some(&['\u{0074}']), - '\u{24E4}' => Some(&['\u{0075}']), - '\u{24E5}' => Some(&['\u{0076}']), - '\u{24E6}' => Some(&['\u{0077}']), - '\u{24E7}' => Some(&['\u{0078}']), - '\u{24E8}' => Some(&['\u{0079}']), - '\u{24E9}' => Some(&['\u{007A}']), - '\u{24EA}' => Some(&['\u{0030}']), - '\u{2A0C}' => Some(&['\u{222B}', '\u{222B}', '\u{222B}', '\u{222B}']), - '\u{2A74}' => Some(&['\u{003A}', '\u{003A}', '\u{003D}']), - '\u{2A75}' => Some(&['\u{003D}', '\u{003D}']), - '\u{2A76}' => Some(&['\u{003D}', '\u{003D}', '\u{003D}']), - '\u{2C7C}' => Some(&['\u{006A}']), - '\u{2C7D}' => Some(&['\u{0056}']), - '\u{2D6F}' => Some(&['\u{2D61}']), - '\u{2E9F}' => Some(&['\u{6BCD}']), - '\u{2EF3}' => Some(&['\u{9F9F}']), - '\u{2F00}' => Some(&['\u{4E00}']), - '\u{2F01}' => Some(&['\u{4E28}']), - '\u{2F02}' => Some(&['\u{4E36}']), - '\u{2F03}' => Some(&['\u{4E3F}']), - '\u{2F04}' => Some(&['\u{4E59}']), - '\u{2F05}' => Some(&['\u{4E85}']), - '\u{2F06}' => Some(&['\u{4E8C}']), - '\u{2F07}' => Some(&['\u{4EA0}']), - '\u{2F08}' => Some(&['\u{4EBA}']), - '\u{2F09}' => Some(&['\u{513F}']), - '\u{2F0A}' => Some(&['\u{5165}']), - '\u{2F0B}' => Some(&['\u{516B}']), - '\u{2F0C}' => Some(&['\u{5182}']), - '\u{2F0D}' => Some(&['\u{5196}']), - '\u{2F0E}' => Some(&['\u{51AB}']), - '\u{2F0F}' => Some(&['\u{51E0}']), - '\u{2F10}' => Some(&['\u{51F5}']), - '\u{2F11}' => Some(&['\u{5200}']), - '\u{2F12}' => Some(&['\u{529B}']), - '\u{2F13}' => Some(&['\u{52F9}']), - '\u{2F14}' => Some(&['\u{5315}']), - '\u{2F15}' => Some(&['\u{531A}']), - '\u{2F16}' => Some(&['\u{5338}']), - '\u{2F17}' => Some(&['\u{5341}']), - '\u{2F18}' => Some(&['\u{535C}']), - '\u{2F19}' => Some(&['\u{5369}']), - '\u{2F1A}' => Some(&['\u{5382}']), - '\u{2F1B}' => Some(&['\u{53B6}']), - '\u{2F1C}' => Some(&['\u{53C8}']), - '\u{2F1D}' => Some(&['\u{53E3}']), - '\u{2F1E}' => Some(&['\u{56D7}']), - '\u{2F1F}' => Some(&['\u{571F}']), - '\u{2F20}' => Some(&['\u{58EB}']), - '\u{2F21}' => Some(&['\u{5902}']), - '\u{2F22}' => Some(&['\u{590A}']), - '\u{2F23}' => Some(&['\u{5915}']), - '\u{2F24}' => Some(&['\u{5927}']), - '\u{2F25}' => Some(&['\u{5973}']), - '\u{2F26}' => Some(&['\u{5B50}']), - '\u{2F27}' => Some(&['\u{5B80}']), - '\u{2F28}' => Some(&['\u{5BF8}']), - '\u{2F29}' => Some(&['\u{5C0F}']), - '\u{2F2A}' => Some(&['\u{5C22}']), - '\u{2F2B}' => Some(&['\u{5C38}']), - '\u{2F2C}' => Some(&['\u{5C6E}']), - '\u{2F2D}' => Some(&['\u{5C71}']), - '\u{2F2E}' => Some(&['\u{5DDB}']), - '\u{2F2F}' => Some(&['\u{5DE5}']), - '\u{2F30}' => Some(&['\u{5DF1}']), - '\u{2F31}' => Some(&['\u{5DFE}']), - '\u{2F32}' => Some(&['\u{5E72}']), - '\u{2F33}' => Some(&['\u{5E7A}']), - '\u{2F34}' => Some(&['\u{5E7F}']), - '\u{2F35}' => Some(&['\u{5EF4}']), - '\u{2F36}' => Some(&['\u{5EFE}']), - '\u{2F37}' => Some(&['\u{5F0B}']), - '\u{2F38}' => Some(&['\u{5F13}']), - '\u{2F39}' => Some(&['\u{5F50}']), - '\u{2F3A}' => Some(&['\u{5F61}']), - '\u{2F3B}' => Some(&['\u{5F73}']), - '\u{2F3C}' => Some(&['\u{5FC3}']), - '\u{2F3D}' => Some(&['\u{6208}']), - '\u{2F3E}' => Some(&['\u{6236}']), - '\u{2F3F}' => Some(&['\u{624B}']), - '\u{2F40}' => Some(&['\u{652F}']), - '\u{2F41}' => Some(&['\u{6534}']), - '\u{2F42}' => Some(&['\u{6587}']), - '\u{2F43}' => Some(&['\u{6597}']), - '\u{2F44}' => Some(&['\u{65A4}']), - '\u{2F45}' => Some(&['\u{65B9}']), - '\u{2F46}' => Some(&['\u{65E0}']), - '\u{2F47}' => Some(&['\u{65E5}']), - '\u{2F48}' => Some(&['\u{66F0}']), - '\u{2F49}' => Some(&['\u{6708}']), - '\u{2F4A}' => Some(&['\u{6728}']), - '\u{2F4B}' => Some(&['\u{6B20}']), - '\u{2F4C}' => Some(&['\u{6B62}']), - '\u{2F4D}' => Some(&['\u{6B79}']), - '\u{2F4E}' => Some(&['\u{6BB3}']), - '\u{2F4F}' => Some(&['\u{6BCB}']), - '\u{2F50}' => Some(&['\u{6BD4}']), - '\u{2F51}' => Some(&['\u{6BDB}']), - '\u{2F52}' => Some(&['\u{6C0F}']), - '\u{2F53}' => Some(&['\u{6C14}']), - '\u{2F54}' => Some(&['\u{6C34}']), - '\u{2F55}' => Some(&['\u{706B}']), - '\u{2F56}' => Some(&['\u{722A}']), - '\u{2F57}' => Some(&['\u{7236}']), - '\u{2F58}' => Some(&['\u{723B}']), - '\u{2F59}' => Some(&['\u{723F}']), - '\u{2F5A}' => Some(&['\u{7247}']), - '\u{2F5B}' => Some(&['\u{7259}']), - '\u{2F5C}' => Some(&['\u{725B}']), - '\u{2F5D}' => Some(&['\u{72AC}']), - '\u{2F5E}' => Some(&['\u{7384}']), - '\u{2F5F}' => Some(&['\u{7389}']), - '\u{2F60}' => Some(&['\u{74DC}']), - '\u{2F61}' => Some(&['\u{74E6}']), - '\u{2F62}' => Some(&['\u{7518}']), - '\u{2F63}' => Some(&['\u{751F}']), - '\u{2F64}' => Some(&['\u{7528}']), - '\u{2F65}' => Some(&['\u{7530}']), - '\u{2F66}' => Some(&['\u{758B}']), - '\u{2F67}' => Some(&['\u{7592}']), - '\u{2F68}' => Some(&['\u{7676}']), - '\u{2F69}' => Some(&['\u{767D}']), - '\u{2F6A}' => Some(&['\u{76AE}']), - '\u{2F6B}' => Some(&['\u{76BF}']), - '\u{2F6C}' => Some(&['\u{76EE}']), - '\u{2F6D}' => Some(&['\u{77DB}']), - '\u{2F6E}' => Some(&['\u{77E2}']), - '\u{2F6F}' => Some(&['\u{77F3}']), - '\u{2F70}' => Some(&['\u{793A}']), - '\u{2F71}' => Some(&['\u{79B8}']), - '\u{2F72}' => Some(&['\u{79BE}']), - '\u{2F73}' => Some(&['\u{7A74}']), - '\u{2F74}' => Some(&['\u{7ACB}']), - '\u{2F75}' => Some(&['\u{7AF9}']), - '\u{2F76}' => Some(&['\u{7C73}']), - '\u{2F77}' => Some(&['\u{7CF8}']), - '\u{2F78}' => Some(&['\u{7F36}']), - '\u{2F79}' => Some(&['\u{7F51}']), - '\u{2F7A}' => Some(&['\u{7F8A}']), - '\u{2F7B}' => Some(&['\u{7FBD}']), - '\u{2F7C}' => Some(&['\u{8001}']), - '\u{2F7D}' => Some(&['\u{800C}']), - '\u{2F7E}' => Some(&['\u{8012}']), - '\u{2F7F}' => Some(&['\u{8033}']), - '\u{2F80}' => Some(&['\u{807F}']), - '\u{2F81}' => Some(&['\u{8089}']), - '\u{2F82}' => Some(&['\u{81E3}']), - '\u{2F83}' => Some(&['\u{81EA}']), - '\u{2F84}' => Some(&['\u{81F3}']), - '\u{2F85}' => Some(&['\u{81FC}']), - '\u{2F86}' => Some(&['\u{820C}']), - '\u{2F87}' => Some(&['\u{821B}']), - '\u{2F88}' => Some(&['\u{821F}']), - '\u{2F89}' => Some(&['\u{826E}']), - '\u{2F8A}' => Some(&['\u{8272}']), - '\u{2F8B}' => Some(&['\u{8278}']), - '\u{2F8C}' => Some(&['\u{864D}']), - '\u{2F8D}' => Some(&['\u{866B}']), - '\u{2F8E}' => Some(&['\u{8840}']), - '\u{2F8F}' => Some(&['\u{884C}']), - '\u{2F90}' => Some(&['\u{8863}']), - '\u{2F91}' => Some(&['\u{897E}']), - '\u{2F92}' => Some(&['\u{898B}']), - '\u{2F93}' => Some(&['\u{89D2}']), - '\u{2F94}' => Some(&['\u{8A00}']), - '\u{2F95}' => Some(&['\u{8C37}']), - '\u{2F96}' => Some(&['\u{8C46}']), - '\u{2F97}' => Some(&['\u{8C55}']), - '\u{2F98}' => Some(&['\u{8C78}']), - '\u{2F99}' => Some(&['\u{8C9D}']), - '\u{2F9A}' => Some(&['\u{8D64}']), - '\u{2F9B}' => Some(&['\u{8D70}']), - '\u{2F9C}' => Some(&['\u{8DB3}']), - '\u{2F9D}' => Some(&['\u{8EAB}']), - '\u{2F9E}' => Some(&['\u{8ECA}']), - '\u{2F9F}' => Some(&['\u{8F9B}']), - '\u{2FA0}' => Some(&['\u{8FB0}']), - '\u{2FA1}' => Some(&['\u{8FB5}']), - '\u{2FA2}' => Some(&['\u{9091}']), - '\u{2FA3}' => Some(&['\u{9149}']), - '\u{2FA4}' => Some(&['\u{91C6}']), - '\u{2FA5}' => Some(&['\u{91CC}']), - '\u{2FA6}' => Some(&['\u{91D1}']), - '\u{2FA7}' => Some(&['\u{9577}']), - '\u{2FA8}' => Some(&['\u{9580}']), - '\u{2FA9}' => Some(&['\u{961C}']), - '\u{2FAA}' => Some(&['\u{96B6}']), - '\u{2FAB}' => Some(&['\u{96B9}']), - '\u{2FAC}' => Some(&['\u{96E8}']), - '\u{2FAD}' => Some(&['\u{9751}']), - '\u{2FAE}' => Some(&['\u{975E}']), - '\u{2FAF}' => Some(&['\u{9762}']), - '\u{2FB0}' => Some(&['\u{9769}']), - '\u{2FB1}' => Some(&['\u{97CB}']), - '\u{2FB2}' => Some(&['\u{97ED}']), - '\u{2FB3}' => Some(&['\u{97F3}']), - '\u{2FB4}' => Some(&['\u{9801}']), - '\u{2FB5}' => Some(&['\u{98A8}']), - '\u{2FB6}' => Some(&['\u{98DB}']), - '\u{2FB7}' => Some(&['\u{98DF}']), - '\u{2FB8}' => Some(&['\u{9996}']), - '\u{2FB9}' => Some(&['\u{9999}']), - '\u{2FBA}' => Some(&['\u{99AC}']), - '\u{2FBB}' => Some(&['\u{9AA8}']), - '\u{2FBC}' => Some(&['\u{9AD8}']), - '\u{2FBD}' => Some(&['\u{9ADF}']), - '\u{2FBE}' => Some(&['\u{9B25}']), - '\u{2FBF}' => Some(&['\u{9B2F}']), - '\u{2FC0}' => Some(&['\u{9B32}']), - '\u{2FC1}' => Some(&['\u{9B3C}']), - '\u{2FC2}' => Some(&['\u{9B5A}']), - '\u{2FC3}' => Some(&['\u{9CE5}']), - '\u{2FC4}' => Some(&['\u{9E75}']), - '\u{2FC5}' => Some(&['\u{9E7F}']), - '\u{2FC6}' => Some(&['\u{9EA5}']), - '\u{2FC7}' => Some(&['\u{9EBB}']), - '\u{2FC8}' => Some(&['\u{9EC3}']), - '\u{2FC9}' => Some(&['\u{9ECD}']), - '\u{2FCA}' => Some(&['\u{9ED1}']), - '\u{2FCB}' => Some(&['\u{9EF9}']), - '\u{2FCC}' => Some(&['\u{9EFD}']), - '\u{2FCD}' => Some(&['\u{9F0E}']), - '\u{2FCE}' => Some(&['\u{9F13}']), - '\u{2FCF}' => Some(&['\u{9F20}']), - '\u{2FD0}' => Some(&['\u{9F3B}']), - '\u{2FD1}' => Some(&['\u{9F4A}']), - '\u{2FD2}' => Some(&['\u{9F52}']), - '\u{2FD3}' => Some(&['\u{9F8D}']), - '\u{2FD4}' => Some(&['\u{9F9C}']), - '\u{2FD5}' => Some(&['\u{9FA0}']), - '\u{3000}' => Some(&['\u{0020}']), - '\u{3036}' => Some(&['\u{3012}']), - '\u{3038}' => Some(&['\u{5341}']), - '\u{3039}' => Some(&['\u{5344}']), - '\u{303A}' => Some(&['\u{5345}']), - '\u{309B}' => Some(&['\u{0020}', '\u{3099}']), - '\u{309C}' => Some(&['\u{0020}', '\u{309A}']), - '\u{309F}' => Some(&['\u{3088}', '\u{308A}']), - '\u{30FF}' => Some(&['\u{30B3}', '\u{30C8}']), - '\u{3131}' => Some(&['\u{1100}']), - '\u{3132}' => Some(&['\u{1101}']), - '\u{3133}' => Some(&['\u{11AA}']), - '\u{3134}' => Some(&['\u{1102}']), - '\u{3135}' => Some(&['\u{11AC}']), - '\u{3136}' => Some(&['\u{11AD}']), - '\u{3137}' => Some(&['\u{1103}']), - '\u{3138}' => Some(&['\u{1104}']), - '\u{3139}' => Some(&['\u{1105}']), - '\u{313A}' => Some(&['\u{11B0}']), - '\u{313B}' => Some(&['\u{11B1}']), - '\u{313C}' => Some(&['\u{11B2}']), - '\u{313D}' => Some(&['\u{11B3}']), - '\u{313E}' => Some(&['\u{11B4}']), - '\u{313F}' => Some(&['\u{11B5}']), - '\u{3140}' => Some(&['\u{111A}']), - '\u{3141}' => Some(&['\u{1106}']), - '\u{3142}' => Some(&['\u{1107}']), - '\u{3143}' => Some(&['\u{1108}']), - '\u{3144}' => Some(&['\u{1121}']), - '\u{3145}' => Some(&['\u{1109}']), - '\u{3146}' => Some(&['\u{110A}']), - '\u{3147}' => Some(&['\u{110B}']), - '\u{3148}' => Some(&['\u{110C}']), - '\u{3149}' => Some(&['\u{110D}']), - '\u{314A}' => Some(&['\u{110E}']), - '\u{314B}' => Some(&['\u{110F}']), - '\u{314C}' => Some(&['\u{1110}']), - '\u{314D}' => Some(&['\u{1111}']), - '\u{314E}' => Some(&['\u{1112}']), - '\u{314F}' => Some(&['\u{1161}']), - '\u{3150}' => Some(&['\u{1162}']), - '\u{3151}' => Some(&['\u{1163}']), - '\u{3152}' => Some(&['\u{1164}']), - '\u{3153}' => Some(&['\u{1165}']), - '\u{3154}' => Some(&['\u{1166}']), - '\u{3155}' => Some(&['\u{1167}']), - '\u{3156}' => Some(&['\u{1168}']), - '\u{3157}' => Some(&['\u{1169}']), - '\u{3158}' => Some(&['\u{116A}']), - '\u{3159}' => Some(&['\u{116B}']), - '\u{315A}' => Some(&['\u{116C}']), - '\u{315B}' => Some(&['\u{116D}']), - '\u{315C}' => Some(&['\u{116E}']), - '\u{315D}' => Some(&['\u{116F}']), - '\u{315E}' => Some(&['\u{1170}']), - '\u{315F}' => Some(&['\u{1171}']), - '\u{3160}' => Some(&['\u{1172}']), - '\u{3161}' => Some(&['\u{1173}']), - '\u{3162}' => Some(&['\u{1174}']), - '\u{3163}' => Some(&['\u{1175}']), - '\u{3164}' => Some(&['\u{1160}']), - '\u{3165}' => Some(&['\u{1114}']), - '\u{3166}' => Some(&['\u{1115}']), - '\u{3167}' => Some(&['\u{11C7}']), - '\u{3168}' => Some(&['\u{11C8}']), - '\u{3169}' => Some(&['\u{11CC}']), - '\u{316A}' => Some(&['\u{11CE}']), - '\u{316B}' => Some(&['\u{11D3}']), - '\u{316C}' => Some(&['\u{11D7}']), - '\u{316D}' => Some(&['\u{11D9}']), - '\u{316E}' => Some(&['\u{111C}']), - '\u{316F}' => Some(&['\u{11DD}']), - '\u{3170}' => Some(&['\u{11DF}']), - '\u{3171}' => Some(&['\u{111D}']), - '\u{3172}' => Some(&['\u{111E}']), - '\u{3173}' => Some(&['\u{1120}']), - '\u{3174}' => Some(&['\u{1122}']), - '\u{3175}' => Some(&['\u{1123}']), - '\u{3176}' => Some(&['\u{1127}']), - '\u{3177}' => Some(&['\u{1129}']), - '\u{3178}' => Some(&['\u{112B}']), - '\u{3179}' => Some(&['\u{112C}']), - '\u{317A}' => Some(&['\u{112D}']), - '\u{317B}' => Some(&['\u{112E}']), - '\u{317C}' => Some(&['\u{112F}']), - '\u{317D}' => Some(&['\u{1132}']), - '\u{317E}' => Some(&['\u{1136}']), - '\u{317F}' => Some(&['\u{1140}']), - '\u{3180}' => Some(&['\u{1147}']), - '\u{3181}' => Some(&['\u{114C}']), - '\u{3182}' => Some(&['\u{11F1}']), - '\u{3183}' => Some(&['\u{11F2}']), - '\u{3184}' => Some(&['\u{1157}']), - '\u{3185}' => Some(&['\u{1158}']), - '\u{3186}' => Some(&['\u{1159}']), - '\u{3187}' => Some(&['\u{1184}']), - '\u{3188}' => Some(&['\u{1185}']), - '\u{3189}' => Some(&['\u{1188}']), - '\u{318A}' => Some(&['\u{1191}']), - '\u{318B}' => Some(&['\u{1192}']), - '\u{318C}' => Some(&['\u{1194}']), - '\u{318D}' => Some(&['\u{119E}']), - '\u{318E}' => Some(&['\u{11A1}']), - '\u{3192}' => Some(&['\u{4E00}']), - '\u{3193}' => Some(&['\u{4E8C}']), - '\u{3194}' => Some(&['\u{4E09}']), - '\u{3195}' => Some(&['\u{56DB}']), - '\u{3196}' => Some(&['\u{4E0A}']), - '\u{3197}' => Some(&['\u{4E2D}']), - '\u{3198}' => Some(&['\u{4E0B}']), - '\u{3199}' => Some(&['\u{7532}']), - '\u{319A}' => Some(&['\u{4E59}']), - '\u{319B}' => Some(&['\u{4E19}']), - '\u{319C}' => Some(&['\u{4E01}']), - '\u{319D}' => Some(&['\u{5929}']), - '\u{319E}' => Some(&['\u{5730}']), - '\u{319F}' => Some(&['\u{4EBA}']), - '\u{3200}' => Some(&['\u{0028}', '\u{1100}', '\u{0029}']), - '\u{3201}' => Some(&['\u{0028}', '\u{1102}', '\u{0029}']), - '\u{3202}' => Some(&['\u{0028}', '\u{1103}', '\u{0029}']), - '\u{3203}' => Some(&['\u{0028}', '\u{1105}', '\u{0029}']), - '\u{3204}' => Some(&['\u{0028}', '\u{1106}', '\u{0029}']), - '\u{3205}' => Some(&['\u{0028}', '\u{1107}', '\u{0029}']), - '\u{3206}' => Some(&['\u{0028}', '\u{1109}', '\u{0029}']), - '\u{3207}' => Some(&['\u{0028}', '\u{110B}', '\u{0029}']), - '\u{3208}' => Some(&['\u{0028}', '\u{110C}', '\u{0029}']), - '\u{3209}' => Some(&['\u{0028}', '\u{110E}', '\u{0029}']), - '\u{320A}' => Some(&['\u{0028}', '\u{110F}', '\u{0029}']), - '\u{320B}' => Some(&['\u{0028}', '\u{1110}', '\u{0029}']), - '\u{320C}' => Some(&['\u{0028}', '\u{1111}', '\u{0029}']), - '\u{320D}' => Some(&['\u{0028}', '\u{1112}', '\u{0029}']), - '\u{320E}' => Some(&['\u{0028}', '\u{1100}', '\u{1161}', '\u{0029}']), - '\u{320F}' => Some(&['\u{0028}', '\u{1102}', '\u{1161}', '\u{0029}']), - '\u{3210}' => Some(&['\u{0028}', '\u{1103}', '\u{1161}', '\u{0029}']), - '\u{3211}' => Some(&['\u{0028}', '\u{1105}', '\u{1161}', '\u{0029}']), - '\u{3212}' => Some(&['\u{0028}', '\u{1106}', '\u{1161}', '\u{0029}']), - '\u{3213}' => Some(&['\u{0028}', '\u{1107}', '\u{1161}', '\u{0029}']), - '\u{3214}' => Some(&['\u{0028}', '\u{1109}', '\u{1161}', '\u{0029}']), - '\u{3215}' => Some(&['\u{0028}', '\u{110B}', '\u{1161}', '\u{0029}']), - '\u{3216}' => Some(&['\u{0028}', '\u{110C}', '\u{1161}', '\u{0029}']), - '\u{3217}' => Some(&['\u{0028}', '\u{110E}', '\u{1161}', '\u{0029}']), - '\u{3218}' => Some(&['\u{0028}', '\u{110F}', '\u{1161}', '\u{0029}']), - '\u{3219}' => Some(&['\u{0028}', '\u{1110}', '\u{1161}', '\u{0029}']), - '\u{321A}' => Some(&['\u{0028}', '\u{1111}', '\u{1161}', '\u{0029}']), - '\u{321B}' => Some(&['\u{0028}', '\u{1112}', '\u{1161}', '\u{0029}']), - '\u{321C}' => Some(&['\u{0028}', '\u{110C}', '\u{116E}', '\u{0029}']), - '\u{321D}' => Some(&['\u{0028}', '\u{110B}', '\u{1169}', '\u{110C}', '\u{1165}', '\u{11AB}', '\u{0029}']), - '\u{321E}' => Some(&['\u{0028}', '\u{110B}', '\u{1169}', '\u{1112}', '\u{116E}', '\u{0029}']), - '\u{3220}' => Some(&['\u{0028}', '\u{4E00}', '\u{0029}']), - '\u{3221}' => Some(&['\u{0028}', '\u{4E8C}', '\u{0029}']), - '\u{3222}' => Some(&['\u{0028}', '\u{4E09}', '\u{0029}']), - '\u{3223}' => Some(&['\u{0028}', '\u{56DB}', '\u{0029}']), - '\u{3224}' => Some(&['\u{0028}', '\u{4E94}', '\u{0029}']), - '\u{3225}' => Some(&['\u{0028}', '\u{516D}', '\u{0029}']), - '\u{3226}' => Some(&['\u{0028}', '\u{4E03}', '\u{0029}']), - '\u{3227}' => Some(&['\u{0028}', '\u{516B}', '\u{0029}']), - '\u{3228}' => Some(&['\u{0028}', '\u{4E5D}', '\u{0029}']), - '\u{3229}' => Some(&['\u{0028}', '\u{5341}', '\u{0029}']), - '\u{322A}' => Some(&['\u{0028}', '\u{6708}', '\u{0029}']), - '\u{322B}' => Some(&['\u{0028}', '\u{706B}', '\u{0029}']), - '\u{322C}' => Some(&['\u{0028}', '\u{6C34}', '\u{0029}']), - '\u{322D}' => Some(&['\u{0028}', '\u{6728}', '\u{0029}']), - '\u{322E}' => Some(&['\u{0028}', '\u{91D1}', '\u{0029}']), - '\u{322F}' => Some(&['\u{0028}', '\u{571F}', '\u{0029}']), - '\u{3230}' => Some(&['\u{0028}', '\u{65E5}', '\u{0029}']), - '\u{3231}' => Some(&['\u{0028}', '\u{682A}', '\u{0029}']), - '\u{3232}' => Some(&['\u{0028}', '\u{6709}', '\u{0029}']), - '\u{3233}' => Some(&['\u{0028}', '\u{793E}', '\u{0029}']), - '\u{3234}' => Some(&['\u{0028}', '\u{540D}', '\u{0029}']), - '\u{3235}' => Some(&['\u{0028}', '\u{7279}', '\u{0029}']), - '\u{3236}' => Some(&['\u{0028}', '\u{8CA1}', '\u{0029}']), - '\u{3237}' => Some(&['\u{0028}', '\u{795D}', '\u{0029}']), - '\u{3238}' => Some(&['\u{0028}', '\u{52B4}', '\u{0029}']), - '\u{3239}' => Some(&['\u{0028}', '\u{4EE3}', '\u{0029}']), - '\u{323A}' => Some(&['\u{0028}', '\u{547C}', '\u{0029}']), - '\u{323B}' => Some(&['\u{0028}', '\u{5B66}', '\u{0029}']), - '\u{323C}' => Some(&['\u{0028}', '\u{76E3}', '\u{0029}']), - '\u{323D}' => Some(&['\u{0028}', '\u{4F01}', '\u{0029}']), - '\u{323E}' => Some(&['\u{0028}', '\u{8CC7}', '\u{0029}']), - '\u{323F}' => Some(&['\u{0028}', '\u{5354}', '\u{0029}']), - '\u{3240}' => Some(&['\u{0028}', '\u{796D}', '\u{0029}']), - '\u{3241}' => Some(&['\u{0028}', '\u{4F11}', '\u{0029}']), - '\u{3242}' => Some(&['\u{0028}', '\u{81EA}', '\u{0029}']), - '\u{3243}' => Some(&['\u{0028}', '\u{81F3}', '\u{0029}']), - '\u{3244}' => Some(&['\u{554F}']), - '\u{3245}' => Some(&['\u{5E7C}']), - '\u{3246}' => Some(&['\u{6587}']), - '\u{3247}' => Some(&['\u{7B8F}']), - '\u{3250}' => Some(&['\u{0050}', '\u{0054}', '\u{0045}']), - '\u{3251}' => Some(&['\u{0032}', '\u{0031}']), - '\u{3252}' => Some(&['\u{0032}', '\u{0032}']), - '\u{3253}' => Some(&['\u{0032}', '\u{0033}']), - '\u{3254}' => Some(&['\u{0032}', '\u{0034}']), - '\u{3255}' => Some(&['\u{0032}', '\u{0035}']), - '\u{3256}' => Some(&['\u{0032}', '\u{0036}']), - '\u{3257}' => Some(&['\u{0032}', '\u{0037}']), - '\u{3258}' => Some(&['\u{0032}', '\u{0038}']), - '\u{3259}' => Some(&['\u{0032}', '\u{0039}']), - '\u{325A}' => Some(&['\u{0033}', '\u{0030}']), - '\u{325B}' => Some(&['\u{0033}', '\u{0031}']), - '\u{325C}' => Some(&['\u{0033}', '\u{0032}']), - '\u{325D}' => Some(&['\u{0033}', '\u{0033}']), - '\u{325E}' => Some(&['\u{0033}', '\u{0034}']), - '\u{325F}' => Some(&['\u{0033}', '\u{0035}']), - '\u{3260}' => Some(&['\u{1100}']), - '\u{3261}' => Some(&['\u{1102}']), - '\u{3262}' => Some(&['\u{1103}']), - '\u{3263}' => Some(&['\u{1105}']), - '\u{3264}' => Some(&['\u{1106}']), - '\u{3265}' => Some(&['\u{1107}']), - '\u{3266}' => Some(&['\u{1109}']), - '\u{3267}' => Some(&['\u{110B}']), - '\u{3268}' => Some(&['\u{110C}']), - '\u{3269}' => Some(&['\u{110E}']), - '\u{326A}' => Some(&['\u{110F}']), - '\u{326B}' => Some(&['\u{1110}']), - '\u{326C}' => Some(&['\u{1111}']), - '\u{326D}' => Some(&['\u{1112}']), - '\u{326E}' => Some(&['\u{1100}', '\u{1161}']), - '\u{326F}' => Some(&['\u{1102}', '\u{1161}']), - '\u{3270}' => Some(&['\u{1103}', '\u{1161}']), - '\u{3271}' => Some(&['\u{1105}', '\u{1161}']), - '\u{3272}' => Some(&['\u{1106}', '\u{1161}']), - '\u{3273}' => Some(&['\u{1107}', '\u{1161}']), - '\u{3274}' => Some(&['\u{1109}', '\u{1161}']), - '\u{3275}' => Some(&['\u{110B}', '\u{1161}']), - '\u{3276}' => Some(&['\u{110C}', '\u{1161}']), - '\u{3277}' => Some(&['\u{110E}', '\u{1161}']), - '\u{3278}' => Some(&['\u{110F}', '\u{1161}']), - '\u{3279}' => Some(&['\u{1110}', '\u{1161}']), - '\u{327A}' => Some(&['\u{1111}', '\u{1161}']), - '\u{327B}' => Some(&['\u{1112}', '\u{1161}']), - '\u{327C}' => Some(&['\u{110E}', '\u{1161}', '\u{11B7}', '\u{1100}', '\u{1169}']), - '\u{327D}' => Some(&['\u{110C}', '\u{116E}', '\u{110B}', '\u{1174}']), - '\u{327E}' => Some(&['\u{110B}', '\u{116E}']), - '\u{3280}' => Some(&['\u{4E00}']), - '\u{3281}' => Some(&['\u{4E8C}']), - '\u{3282}' => Some(&['\u{4E09}']), - '\u{3283}' => Some(&['\u{56DB}']), - '\u{3284}' => Some(&['\u{4E94}']), - '\u{3285}' => Some(&['\u{516D}']), - '\u{3286}' => Some(&['\u{4E03}']), - '\u{3287}' => Some(&['\u{516B}']), - '\u{3288}' => Some(&['\u{4E5D}']), - '\u{3289}' => Some(&['\u{5341}']), - '\u{328A}' => Some(&['\u{6708}']), - '\u{328B}' => Some(&['\u{706B}']), - '\u{328C}' => Some(&['\u{6C34}']), - '\u{328D}' => Some(&['\u{6728}']), - '\u{328E}' => Some(&['\u{91D1}']), - '\u{328F}' => Some(&['\u{571F}']), - '\u{3290}' => Some(&['\u{65E5}']), - '\u{3291}' => Some(&['\u{682A}']), - '\u{3292}' => Some(&['\u{6709}']), - '\u{3293}' => Some(&['\u{793E}']), - '\u{3294}' => Some(&['\u{540D}']), - '\u{3295}' => Some(&['\u{7279}']), - '\u{3296}' => Some(&['\u{8CA1}']), - '\u{3297}' => Some(&['\u{795D}']), - '\u{3298}' => Some(&['\u{52B4}']), - '\u{3299}' => Some(&['\u{79D8}']), - '\u{329A}' => Some(&['\u{7537}']), - '\u{329B}' => Some(&['\u{5973}']), - '\u{329C}' => Some(&['\u{9069}']), - '\u{329D}' => Some(&['\u{512A}']), - '\u{329E}' => Some(&['\u{5370}']), - '\u{329F}' => Some(&['\u{6CE8}']), - '\u{32A0}' => Some(&['\u{9805}']), - '\u{32A1}' => Some(&['\u{4F11}']), - '\u{32A2}' => Some(&['\u{5199}']), - '\u{32A3}' => Some(&['\u{6B63}']), - '\u{32A4}' => Some(&['\u{4E0A}']), - '\u{32A5}' => Some(&['\u{4E2D}']), - '\u{32A6}' => Some(&['\u{4E0B}']), - '\u{32A7}' => Some(&['\u{5DE6}']), - '\u{32A8}' => Some(&['\u{53F3}']), - '\u{32A9}' => Some(&['\u{533B}']), - '\u{32AA}' => Some(&['\u{5B97}']), - '\u{32AB}' => Some(&['\u{5B66}']), - '\u{32AC}' => Some(&['\u{76E3}']), - '\u{32AD}' => Some(&['\u{4F01}']), - '\u{32AE}' => Some(&['\u{8CC7}']), - '\u{32AF}' => Some(&['\u{5354}']), - '\u{32B0}' => Some(&['\u{591C}']), - '\u{32B1}' => Some(&['\u{0033}', '\u{0036}']), - '\u{32B2}' => Some(&['\u{0033}', '\u{0037}']), - '\u{32B3}' => Some(&['\u{0033}', '\u{0038}']), - '\u{32B4}' => Some(&['\u{0033}', '\u{0039}']), - '\u{32B5}' => Some(&['\u{0034}', '\u{0030}']), - '\u{32B6}' => Some(&['\u{0034}', '\u{0031}']), - '\u{32B7}' => Some(&['\u{0034}', '\u{0032}']), - '\u{32B8}' => Some(&['\u{0034}', '\u{0033}']), - '\u{32B9}' => Some(&['\u{0034}', '\u{0034}']), - '\u{32BA}' => Some(&['\u{0034}', '\u{0035}']), - '\u{32BB}' => Some(&['\u{0034}', '\u{0036}']), - '\u{32BC}' => Some(&['\u{0034}', '\u{0037}']), - '\u{32BD}' => Some(&['\u{0034}', '\u{0038}']), - '\u{32BE}' => Some(&['\u{0034}', '\u{0039}']), - '\u{32BF}' => Some(&['\u{0035}', '\u{0030}']), - '\u{32C0}' => Some(&['\u{0031}', '\u{6708}']), - '\u{32C1}' => Some(&['\u{0032}', '\u{6708}']), - '\u{32C2}' => Some(&['\u{0033}', '\u{6708}']), - '\u{32C3}' => Some(&['\u{0034}', '\u{6708}']), - '\u{32C4}' => Some(&['\u{0035}', '\u{6708}']), - '\u{32C5}' => Some(&['\u{0036}', '\u{6708}']), - '\u{32C6}' => Some(&['\u{0037}', '\u{6708}']), - '\u{32C7}' => Some(&['\u{0038}', '\u{6708}']), - '\u{32C8}' => Some(&['\u{0039}', '\u{6708}']), - '\u{32C9}' => Some(&['\u{0031}', '\u{0030}', '\u{6708}']), - '\u{32CA}' => Some(&['\u{0031}', '\u{0031}', '\u{6708}']), - '\u{32CB}' => Some(&['\u{0031}', '\u{0032}', '\u{6708}']), - '\u{32CC}' => Some(&['\u{0048}', '\u{0067}']), - '\u{32CD}' => Some(&['\u{0065}', '\u{0072}', '\u{0067}']), - '\u{32CE}' => Some(&['\u{0065}', '\u{0056}']), - '\u{32CF}' => Some(&['\u{004C}', '\u{0054}', '\u{0044}']), - '\u{32D0}' => Some(&['\u{30A2}']), - '\u{32D1}' => Some(&['\u{30A4}']), - '\u{32D2}' => Some(&['\u{30A6}']), - '\u{32D3}' => Some(&['\u{30A8}']), - '\u{32D4}' => Some(&['\u{30AA}']), - '\u{32D5}' => Some(&['\u{30AB}']), - '\u{32D6}' => Some(&['\u{30AD}']), - '\u{32D7}' => Some(&['\u{30AF}']), - '\u{32D8}' => Some(&['\u{30B1}']), - '\u{32D9}' => Some(&['\u{30B3}']), - '\u{32DA}' => Some(&['\u{30B5}']), - '\u{32DB}' => Some(&['\u{30B7}']), - '\u{32DC}' => Some(&['\u{30B9}']), - '\u{32DD}' => Some(&['\u{30BB}']), - '\u{32DE}' => Some(&['\u{30BD}']), - '\u{32DF}' => Some(&['\u{30BF}']), - '\u{32E0}' => Some(&['\u{30C1}']), - '\u{32E1}' => Some(&['\u{30C4}']), - '\u{32E2}' => Some(&['\u{30C6}']), - '\u{32E3}' => Some(&['\u{30C8}']), - '\u{32E4}' => Some(&['\u{30CA}']), - '\u{32E5}' => Some(&['\u{30CB}']), - '\u{32E6}' => Some(&['\u{30CC}']), - '\u{32E7}' => Some(&['\u{30CD}']), - '\u{32E8}' => Some(&['\u{30CE}']), - '\u{32E9}' => Some(&['\u{30CF}']), - '\u{32EA}' => Some(&['\u{30D2}']), - '\u{32EB}' => Some(&['\u{30D5}']), - '\u{32EC}' => Some(&['\u{30D8}']), - '\u{32ED}' => Some(&['\u{30DB}']), - '\u{32EE}' => Some(&['\u{30DE}']), - '\u{32EF}' => Some(&['\u{30DF}']), - '\u{32F0}' => Some(&['\u{30E0}']), - '\u{32F1}' => Some(&['\u{30E1}']), - '\u{32F2}' => Some(&['\u{30E2}']), - '\u{32F3}' => Some(&['\u{30E4}']), - '\u{32F4}' => Some(&['\u{30E6}']), - '\u{32F5}' => Some(&['\u{30E8}']), - '\u{32F6}' => Some(&['\u{30E9}']), - '\u{32F7}' => Some(&['\u{30EA}']), - '\u{32F8}' => Some(&['\u{30EB}']), - '\u{32F9}' => Some(&['\u{30EC}']), - '\u{32FA}' => Some(&['\u{30ED}']), - '\u{32FB}' => Some(&['\u{30EF}']), - '\u{32FC}' => Some(&['\u{30F0}']), - '\u{32FD}' => Some(&['\u{30F1}']), - '\u{32FE}' => Some(&['\u{30F2}']), - '\u{3300}' => Some(&['\u{30A2}', '\u{30CF}', '\u{309A}', '\u{30FC}', '\u{30C8}']), - '\u{3301}' => Some(&['\u{30A2}', '\u{30EB}', '\u{30D5}', '\u{30A1}']), - '\u{3302}' => Some(&['\u{30A2}', '\u{30F3}', '\u{30D8}', '\u{309A}', '\u{30A2}']), - '\u{3303}' => Some(&['\u{30A2}', '\u{30FC}', '\u{30EB}']), - '\u{3304}' => Some(&['\u{30A4}', '\u{30CB}', '\u{30F3}', '\u{30AF}', '\u{3099}']), - '\u{3305}' => Some(&['\u{30A4}', '\u{30F3}', '\u{30C1}']), - '\u{3306}' => Some(&['\u{30A6}', '\u{30A9}', '\u{30F3}']), - '\u{3307}' => Some(&['\u{30A8}', '\u{30B9}', '\u{30AF}', '\u{30FC}', '\u{30C8}', '\u{3099}']), - '\u{3308}' => Some(&['\u{30A8}', '\u{30FC}', '\u{30AB}', '\u{30FC}']), - '\u{3309}' => Some(&['\u{30AA}', '\u{30F3}', '\u{30B9}']), - '\u{330A}' => Some(&['\u{30AA}', '\u{30FC}', '\u{30E0}']), - '\u{330B}' => Some(&['\u{30AB}', '\u{30A4}', '\u{30EA}']), - '\u{330C}' => Some(&['\u{30AB}', '\u{30E9}', '\u{30C3}', '\u{30C8}']), - '\u{330D}' => Some(&['\u{30AB}', '\u{30ED}', '\u{30EA}', '\u{30FC}']), - '\u{330E}' => Some(&['\u{30AB}', '\u{3099}', '\u{30ED}', '\u{30F3}']), - '\u{330F}' => Some(&['\u{30AB}', '\u{3099}', '\u{30F3}', '\u{30DE}']), - '\u{3310}' => Some(&['\u{30AD}', '\u{3099}', '\u{30AB}', '\u{3099}']), - '\u{3311}' => Some(&['\u{30AD}', '\u{3099}', '\u{30CB}', '\u{30FC}']), - '\u{3312}' => Some(&['\u{30AD}', '\u{30E5}', '\u{30EA}', '\u{30FC}']), - '\u{3313}' => Some(&['\u{30AD}', '\u{3099}', '\u{30EB}', '\u{30BF}', '\u{3099}', '\u{30FC}']), - '\u{3314}' => Some(&['\u{30AD}', '\u{30ED}']), - '\u{3315}' => Some(&['\u{30AD}', '\u{30ED}', '\u{30AF}', '\u{3099}', '\u{30E9}', '\u{30E0}']), - '\u{3316}' => Some(&['\u{30AD}', '\u{30ED}', '\u{30E1}', '\u{30FC}', '\u{30C8}', '\u{30EB}']), - '\u{3317}' => Some(&['\u{30AD}', '\u{30ED}', '\u{30EF}', '\u{30C3}', '\u{30C8}']), - '\u{3318}' => Some(&['\u{30AF}', '\u{3099}', '\u{30E9}', '\u{30E0}']), - '\u{3319}' => Some(&['\u{30AF}', '\u{3099}', '\u{30E9}', '\u{30E0}', '\u{30C8}', '\u{30F3}']), - '\u{331A}' => Some(&['\u{30AF}', '\u{30EB}', '\u{30BB}', '\u{3099}', '\u{30A4}', '\u{30ED}']), - '\u{331B}' => Some(&['\u{30AF}', '\u{30ED}', '\u{30FC}', '\u{30CD}']), - '\u{331C}' => Some(&['\u{30B1}', '\u{30FC}', '\u{30B9}']), - '\u{331D}' => Some(&['\u{30B3}', '\u{30EB}', '\u{30CA}']), - '\u{331E}' => Some(&['\u{30B3}', '\u{30FC}', '\u{30DB}', '\u{309A}']), - '\u{331F}' => Some(&['\u{30B5}', '\u{30A4}', '\u{30AF}', '\u{30EB}']), - '\u{3320}' => Some(&['\u{30B5}', '\u{30F3}', '\u{30C1}', '\u{30FC}', '\u{30E0}']), - '\u{3321}' => Some(&['\u{30B7}', '\u{30EA}', '\u{30F3}', '\u{30AF}', '\u{3099}']), - '\u{3322}' => Some(&['\u{30BB}', '\u{30F3}', '\u{30C1}']), - '\u{3323}' => Some(&['\u{30BB}', '\u{30F3}', '\u{30C8}']), - '\u{3324}' => Some(&['\u{30BF}', '\u{3099}', '\u{30FC}', '\u{30B9}']), - '\u{3325}' => Some(&['\u{30C6}', '\u{3099}', '\u{30B7}']), - '\u{3326}' => Some(&['\u{30C8}', '\u{3099}', '\u{30EB}']), - '\u{3327}' => Some(&['\u{30C8}', '\u{30F3}']), - '\u{3328}' => Some(&['\u{30CA}', '\u{30CE}']), - '\u{3329}' => Some(&['\u{30CE}', '\u{30C3}', '\u{30C8}']), - '\u{332A}' => Some(&['\u{30CF}', '\u{30A4}', '\u{30C4}']), - '\u{332B}' => Some(&['\u{30CF}', '\u{309A}', '\u{30FC}', '\u{30BB}', '\u{30F3}', '\u{30C8}']), - '\u{332C}' => Some(&['\u{30CF}', '\u{309A}', '\u{30FC}', '\u{30C4}']), - '\u{332D}' => Some(&['\u{30CF}', '\u{3099}', '\u{30FC}', '\u{30EC}', '\u{30EB}']), - '\u{332E}' => Some(&['\u{30D2}', '\u{309A}', '\u{30A2}', '\u{30B9}', '\u{30C8}', '\u{30EB}']), - '\u{332F}' => Some(&['\u{30D2}', '\u{309A}', '\u{30AF}', '\u{30EB}']), - '\u{3330}' => Some(&['\u{30D2}', '\u{309A}', '\u{30B3}']), - '\u{3331}' => Some(&['\u{30D2}', '\u{3099}', '\u{30EB}']), - '\u{3332}' => Some(&['\u{30D5}', '\u{30A1}', '\u{30E9}', '\u{30C3}', '\u{30C8}', '\u{3099}']), - '\u{3333}' => Some(&['\u{30D5}', '\u{30A3}', '\u{30FC}', '\u{30C8}']), - '\u{3334}' => Some(&['\u{30D5}', '\u{3099}', '\u{30C3}', '\u{30B7}', '\u{30A7}', '\u{30EB}']), - '\u{3335}' => Some(&['\u{30D5}', '\u{30E9}', '\u{30F3}']), - '\u{3336}' => Some(&['\u{30D8}', '\u{30AF}', '\u{30BF}', '\u{30FC}', '\u{30EB}']), - '\u{3337}' => Some(&['\u{30D8}', '\u{309A}', '\u{30BD}']), - '\u{3338}' => Some(&['\u{30D8}', '\u{309A}', '\u{30CB}', '\u{30D2}']), - '\u{3339}' => Some(&['\u{30D8}', '\u{30EB}', '\u{30C4}']), - '\u{333A}' => Some(&['\u{30D8}', '\u{309A}', '\u{30F3}', '\u{30B9}']), - '\u{333B}' => Some(&['\u{30D8}', '\u{309A}', '\u{30FC}', '\u{30B7}', '\u{3099}']), - '\u{333C}' => Some(&['\u{30D8}', '\u{3099}', '\u{30FC}', '\u{30BF}']), - '\u{333D}' => Some(&['\u{30DB}', '\u{309A}', '\u{30A4}', '\u{30F3}', '\u{30C8}']), - '\u{333E}' => Some(&['\u{30DB}', '\u{3099}', '\u{30EB}', '\u{30C8}']), - '\u{333F}' => Some(&['\u{30DB}', '\u{30F3}']), - '\u{3340}' => Some(&['\u{30DB}', '\u{309A}', '\u{30F3}', '\u{30C8}', '\u{3099}']), - '\u{3341}' => Some(&['\u{30DB}', '\u{30FC}', '\u{30EB}']), - '\u{3342}' => Some(&['\u{30DB}', '\u{30FC}', '\u{30F3}']), - '\u{3343}' => Some(&['\u{30DE}', '\u{30A4}', '\u{30AF}', '\u{30ED}']), - '\u{3344}' => Some(&['\u{30DE}', '\u{30A4}', '\u{30EB}']), - '\u{3345}' => Some(&['\u{30DE}', '\u{30C3}', '\u{30CF}']), - '\u{3346}' => Some(&['\u{30DE}', '\u{30EB}', '\u{30AF}']), - '\u{3347}' => Some(&['\u{30DE}', '\u{30F3}', '\u{30B7}', '\u{30E7}', '\u{30F3}']), - '\u{3348}' => Some(&['\u{30DF}', '\u{30AF}', '\u{30ED}', '\u{30F3}']), - '\u{3349}' => Some(&['\u{30DF}', '\u{30EA}']), - '\u{334A}' => Some(&['\u{30DF}', '\u{30EA}', '\u{30CF}', '\u{3099}', '\u{30FC}', '\u{30EB}']), - '\u{334B}' => Some(&['\u{30E1}', '\u{30AB}', '\u{3099}']), - '\u{334C}' => Some(&['\u{30E1}', '\u{30AB}', '\u{3099}', '\u{30C8}', '\u{30F3}']), - '\u{334D}' => Some(&['\u{30E1}', '\u{30FC}', '\u{30C8}', '\u{30EB}']), - '\u{334E}' => Some(&['\u{30E4}', '\u{30FC}', '\u{30C8}', '\u{3099}']), - '\u{334F}' => Some(&['\u{30E4}', '\u{30FC}', '\u{30EB}']), - '\u{3350}' => Some(&['\u{30E6}', '\u{30A2}', '\u{30F3}']), - '\u{3351}' => Some(&['\u{30EA}', '\u{30C3}', '\u{30C8}', '\u{30EB}']), - '\u{3352}' => Some(&['\u{30EA}', '\u{30E9}']), - '\u{3353}' => Some(&['\u{30EB}', '\u{30D2}', '\u{309A}', '\u{30FC}']), - '\u{3354}' => Some(&['\u{30EB}', '\u{30FC}', '\u{30D5}', '\u{3099}', '\u{30EB}']), - '\u{3355}' => Some(&['\u{30EC}', '\u{30E0}']), - '\u{3356}' => Some(&['\u{30EC}', '\u{30F3}', '\u{30C8}', '\u{30B1}', '\u{3099}', '\u{30F3}']), - '\u{3357}' => Some(&['\u{30EF}', '\u{30C3}', '\u{30C8}']), - '\u{3358}' => Some(&['\u{0030}', '\u{70B9}']), - '\u{3359}' => Some(&['\u{0031}', '\u{70B9}']), - '\u{335A}' => Some(&['\u{0032}', '\u{70B9}']), - '\u{335B}' => Some(&['\u{0033}', '\u{70B9}']), - '\u{335C}' => Some(&['\u{0034}', '\u{70B9}']), - '\u{335D}' => Some(&['\u{0035}', '\u{70B9}']), - '\u{335E}' => Some(&['\u{0036}', '\u{70B9}']), - '\u{335F}' => Some(&['\u{0037}', '\u{70B9}']), - '\u{3360}' => Some(&['\u{0038}', '\u{70B9}']), - '\u{3361}' => Some(&['\u{0039}', '\u{70B9}']), - '\u{3362}' => Some(&['\u{0031}', '\u{0030}', '\u{70B9}']), - '\u{3363}' => Some(&['\u{0031}', '\u{0031}', '\u{70B9}']), - '\u{3364}' => Some(&['\u{0031}', '\u{0032}', '\u{70B9}']), - '\u{3365}' => Some(&['\u{0031}', '\u{0033}', '\u{70B9}']), - '\u{3366}' => Some(&['\u{0031}', '\u{0034}', '\u{70B9}']), - '\u{3367}' => Some(&['\u{0031}', '\u{0035}', '\u{70B9}']), - '\u{3368}' => Some(&['\u{0031}', '\u{0036}', '\u{70B9}']), - '\u{3369}' => Some(&['\u{0031}', '\u{0037}', '\u{70B9}']), - '\u{336A}' => Some(&['\u{0031}', '\u{0038}', '\u{70B9}']), - '\u{336B}' => Some(&['\u{0031}', '\u{0039}', '\u{70B9}']), - '\u{336C}' => Some(&['\u{0032}', '\u{0030}', '\u{70B9}']), - '\u{336D}' => Some(&['\u{0032}', '\u{0031}', '\u{70B9}']), - '\u{336E}' => Some(&['\u{0032}', '\u{0032}', '\u{70B9}']), - '\u{336F}' => Some(&['\u{0032}', '\u{0033}', '\u{70B9}']), - '\u{3370}' => Some(&['\u{0032}', '\u{0034}', '\u{70B9}']), - '\u{3371}' => Some(&['\u{0068}', '\u{0050}', '\u{0061}']), - '\u{3372}' => Some(&['\u{0064}', '\u{0061}']), - '\u{3373}' => Some(&['\u{0041}', '\u{0055}']), - '\u{3374}' => Some(&['\u{0062}', '\u{0061}', '\u{0072}']), - '\u{3375}' => Some(&['\u{006F}', '\u{0056}']), - '\u{3376}' => Some(&['\u{0070}', '\u{0063}']), - '\u{3377}' => Some(&['\u{0064}', '\u{006D}']), - '\u{3378}' => Some(&['\u{0064}', '\u{006D}', '\u{0032}']), - '\u{3379}' => Some(&['\u{0064}', '\u{006D}', '\u{0033}']), - '\u{337A}' => Some(&['\u{0049}', '\u{0055}']), - '\u{337B}' => Some(&['\u{5E73}', '\u{6210}']), - '\u{337C}' => Some(&['\u{662D}', '\u{548C}']), - '\u{337D}' => Some(&['\u{5927}', '\u{6B63}']), - '\u{337E}' => Some(&['\u{660E}', '\u{6CBB}']), - '\u{337F}' => Some(&['\u{682A}', '\u{5F0F}', '\u{4F1A}', '\u{793E}']), - '\u{3380}' => Some(&['\u{0070}', '\u{0041}']), - '\u{3381}' => Some(&['\u{006E}', '\u{0041}']), - '\u{3382}' => Some(&['\u{03BC}', '\u{0041}']), - '\u{3383}' => Some(&['\u{006D}', '\u{0041}']), - '\u{3384}' => Some(&['\u{006B}', '\u{0041}']), - '\u{3385}' => Some(&['\u{004B}', '\u{0042}']), - '\u{3386}' => Some(&['\u{004D}', '\u{0042}']), - '\u{3387}' => Some(&['\u{0047}', '\u{0042}']), - '\u{3388}' => Some(&['\u{0063}', '\u{0061}', '\u{006C}']), - '\u{3389}' => Some(&['\u{006B}', '\u{0063}', '\u{0061}', '\u{006C}']), - '\u{338A}' => Some(&['\u{0070}', '\u{0046}']), - '\u{338B}' => Some(&['\u{006E}', '\u{0046}']), - '\u{338C}' => Some(&['\u{03BC}', '\u{0046}']), - '\u{338D}' => Some(&['\u{03BC}', '\u{0067}']), - '\u{338E}' => Some(&['\u{006D}', '\u{0067}']), - '\u{338F}' => Some(&['\u{006B}', '\u{0067}']), - '\u{3390}' => Some(&['\u{0048}', '\u{007A}']), - '\u{3391}' => Some(&['\u{006B}', '\u{0048}', '\u{007A}']), - '\u{3392}' => Some(&['\u{004D}', '\u{0048}', '\u{007A}']), - '\u{3393}' => Some(&['\u{0047}', '\u{0048}', '\u{007A}']), - '\u{3394}' => Some(&['\u{0054}', '\u{0048}', '\u{007A}']), - '\u{3395}' => Some(&['\u{03BC}', '\u{006C}']), - '\u{3396}' => Some(&['\u{006D}', '\u{006C}']), - '\u{3397}' => Some(&['\u{0064}', '\u{006C}']), - '\u{3398}' => Some(&['\u{006B}', '\u{006C}']), - '\u{3399}' => Some(&['\u{0066}', '\u{006D}']), - '\u{339A}' => Some(&['\u{006E}', '\u{006D}']), - '\u{339B}' => Some(&['\u{03BC}', '\u{006D}']), - '\u{339C}' => Some(&['\u{006D}', '\u{006D}']), - '\u{339D}' => Some(&['\u{0063}', '\u{006D}']), - '\u{339E}' => Some(&['\u{006B}', '\u{006D}']), - '\u{339F}' => Some(&['\u{006D}', '\u{006D}', '\u{0032}']), - '\u{33A0}' => Some(&['\u{0063}', '\u{006D}', '\u{0032}']), - '\u{33A1}' => Some(&['\u{006D}', '\u{0032}']), - '\u{33A2}' => Some(&['\u{006B}', '\u{006D}', '\u{0032}']), - '\u{33A3}' => Some(&['\u{006D}', '\u{006D}', '\u{0033}']), - '\u{33A4}' => Some(&['\u{0063}', '\u{006D}', '\u{0033}']), - '\u{33A5}' => Some(&['\u{006D}', '\u{0033}']), - '\u{33A6}' => Some(&['\u{006B}', '\u{006D}', '\u{0033}']), - '\u{33A7}' => Some(&['\u{006D}', '\u{2215}', '\u{0073}']), - '\u{33A8}' => Some(&['\u{006D}', '\u{2215}', '\u{0073}', '\u{0032}']), - '\u{33A9}' => Some(&['\u{0050}', '\u{0061}']), - '\u{33AA}' => Some(&['\u{006B}', '\u{0050}', '\u{0061}']), - '\u{33AB}' => Some(&['\u{004D}', '\u{0050}', '\u{0061}']), - '\u{33AC}' => Some(&['\u{0047}', '\u{0050}', '\u{0061}']), - '\u{33AD}' => Some(&['\u{0072}', '\u{0061}', '\u{0064}']), - '\u{33AE}' => Some(&['\u{0072}', '\u{0061}', '\u{0064}', '\u{2215}', '\u{0073}']), - '\u{33AF}' => Some(&['\u{0072}', '\u{0061}', '\u{0064}', '\u{2215}', '\u{0073}', '\u{0032}']), - '\u{33B0}' => Some(&['\u{0070}', '\u{0073}']), - '\u{33B1}' => Some(&['\u{006E}', '\u{0073}']), - '\u{33B2}' => Some(&['\u{03BC}', '\u{0073}']), - '\u{33B3}' => Some(&['\u{006D}', '\u{0073}']), - '\u{33B4}' => Some(&['\u{0070}', '\u{0056}']), - '\u{33B5}' => Some(&['\u{006E}', '\u{0056}']), - '\u{33B6}' => Some(&['\u{03BC}', '\u{0056}']), - '\u{33B7}' => Some(&['\u{006D}', '\u{0056}']), - '\u{33B8}' => Some(&['\u{006B}', '\u{0056}']), - '\u{33B9}' => Some(&['\u{004D}', '\u{0056}']), - '\u{33BA}' => Some(&['\u{0070}', '\u{0057}']), - '\u{33BB}' => Some(&['\u{006E}', '\u{0057}']), - '\u{33BC}' => Some(&['\u{03BC}', '\u{0057}']), - '\u{33BD}' => Some(&['\u{006D}', '\u{0057}']), - '\u{33BE}' => Some(&['\u{006B}', '\u{0057}']), - '\u{33BF}' => Some(&['\u{004D}', '\u{0057}']), - '\u{33C0}' => Some(&['\u{006B}', '\u{03A9}']), - '\u{33C1}' => Some(&['\u{004D}', '\u{03A9}']), - '\u{33C2}' => Some(&['\u{0061}', '\u{002E}', '\u{006D}', '\u{002E}']), - '\u{33C3}' => Some(&['\u{0042}', '\u{0071}']), - '\u{33C4}' => Some(&['\u{0063}', '\u{0063}']), - '\u{33C5}' => Some(&['\u{0063}', '\u{0064}']), - '\u{33C6}' => Some(&['\u{0043}', '\u{2215}', '\u{006B}', '\u{0067}']), - '\u{33C7}' => Some(&['\u{0043}', '\u{006F}', '\u{002E}']), - '\u{33C8}' => Some(&['\u{0064}', '\u{0042}']), - '\u{33C9}' => Some(&['\u{0047}', '\u{0079}']), - '\u{33CA}' => Some(&['\u{0068}', '\u{0061}']), - '\u{33CB}' => Some(&['\u{0048}', '\u{0050}']), - '\u{33CC}' => Some(&['\u{0069}', '\u{006E}']), - '\u{33CD}' => Some(&['\u{004B}', '\u{004B}']), - '\u{33CE}' => Some(&['\u{004B}', '\u{004D}']), - '\u{33CF}' => Some(&['\u{006B}', '\u{0074}']), - '\u{33D0}' => Some(&['\u{006C}', '\u{006D}']), - '\u{33D1}' => Some(&['\u{006C}', '\u{006E}']), - '\u{33D2}' => Some(&['\u{006C}', '\u{006F}', '\u{0067}']), - '\u{33D3}' => Some(&['\u{006C}', '\u{0078}']), - '\u{33D4}' => Some(&['\u{006D}', '\u{0062}']), - '\u{33D5}' => Some(&['\u{006D}', '\u{0069}', '\u{006C}']), - '\u{33D6}' => Some(&['\u{006D}', '\u{006F}', '\u{006C}']), - '\u{33D7}' => Some(&['\u{0050}', '\u{0048}']), - '\u{33D8}' => Some(&['\u{0070}', '\u{002E}', '\u{006D}', '\u{002E}']), - '\u{33D9}' => Some(&['\u{0050}', '\u{0050}', '\u{004D}']), - '\u{33DA}' => Some(&['\u{0050}', '\u{0052}']), - '\u{33DB}' => Some(&['\u{0073}', '\u{0072}']), - '\u{33DC}' => Some(&['\u{0053}', '\u{0076}']), - '\u{33DD}' => Some(&['\u{0057}', '\u{0062}']), - '\u{33DE}' => Some(&['\u{0056}', '\u{2215}', '\u{006D}']), - '\u{33DF}' => Some(&['\u{0041}', '\u{2215}', '\u{006D}']), - '\u{33E0}' => Some(&['\u{0031}', '\u{65E5}']), - '\u{33E1}' => Some(&['\u{0032}', '\u{65E5}']), - '\u{33E2}' => Some(&['\u{0033}', '\u{65E5}']), - '\u{33E3}' => Some(&['\u{0034}', '\u{65E5}']), - '\u{33E4}' => Some(&['\u{0035}', '\u{65E5}']), - '\u{33E5}' => Some(&['\u{0036}', '\u{65E5}']), - '\u{33E6}' => Some(&['\u{0037}', '\u{65E5}']), - '\u{33E7}' => Some(&['\u{0038}', '\u{65E5}']), - '\u{33E8}' => Some(&['\u{0039}', '\u{65E5}']), - '\u{33E9}' => Some(&['\u{0031}', '\u{0030}', '\u{65E5}']), - '\u{33EA}' => Some(&['\u{0031}', '\u{0031}', '\u{65E5}']), - '\u{33EB}' => Some(&['\u{0031}', '\u{0032}', '\u{65E5}']), - '\u{33EC}' => Some(&['\u{0031}', '\u{0033}', '\u{65E5}']), - '\u{33ED}' => Some(&['\u{0031}', '\u{0034}', '\u{65E5}']), - '\u{33EE}' => Some(&['\u{0031}', '\u{0035}', '\u{65E5}']), - '\u{33EF}' => Some(&['\u{0031}', '\u{0036}', '\u{65E5}']), - '\u{33F0}' => Some(&['\u{0031}', '\u{0037}', '\u{65E5}']), - '\u{33F1}' => Some(&['\u{0031}', '\u{0038}', '\u{65E5}']), - '\u{33F2}' => Some(&['\u{0031}', '\u{0039}', '\u{65E5}']), - '\u{33F3}' => Some(&['\u{0032}', '\u{0030}', '\u{65E5}']), - '\u{33F4}' => Some(&['\u{0032}', '\u{0031}', '\u{65E5}']), - '\u{33F5}' => Some(&['\u{0032}', '\u{0032}', '\u{65E5}']), - '\u{33F6}' => Some(&['\u{0032}', '\u{0033}', '\u{65E5}']), - '\u{33F7}' => Some(&['\u{0032}', '\u{0034}', '\u{65E5}']), - '\u{33F8}' => Some(&['\u{0032}', '\u{0035}', '\u{65E5}']), - '\u{33F9}' => Some(&['\u{0032}', '\u{0036}', '\u{65E5}']), - '\u{33FA}' => Some(&['\u{0032}', '\u{0037}', '\u{65E5}']), - '\u{33FB}' => Some(&['\u{0032}', '\u{0038}', '\u{65E5}']), - '\u{33FC}' => Some(&['\u{0032}', '\u{0039}', '\u{65E5}']), - '\u{33FD}' => Some(&['\u{0033}', '\u{0030}', '\u{65E5}']), - '\u{33FE}' => Some(&['\u{0033}', '\u{0031}', '\u{65E5}']), - '\u{33FF}' => Some(&['\u{0067}', '\u{0061}', '\u{006C}']), - '\u{A69C}' => Some(&['\u{044A}']), - '\u{A69D}' => Some(&['\u{044C}']), - '\u{A770}' => Some(&['\u{A76F}']), - '\u{A7F8}' => Some(&['\u{0126}']), - '\u{A7F9}' => Some(&['\u{0153}']), - '\u{AB5C}' => Some(&['\u{A727}']), - '\u{AB5D}' => Some(&['\u{AB37}']), - '\u{AB5E}' => Some(&['\u{026B}']), - '\u{AB5F}' => Some(&['\u{AB52}']), - '\u{FB00}' => Some(&['\u{0066}', '\u{0066}']), - '\u{FB01}' => Some(&['\u{0066}', '\u{0069}']), - '\u{FB02}' => Some(&['\u{0066}', '\u{006C}']), - '\u{FB03}' => Some(&['\u{0066}', '\u{0066}', '\u{0069}']), - '\u{FB04}' => Some(&['\u{0066}', '\u{0066}', '\u{006C}']), - '\u{FB05}' => Some(&['\u{0073}', '\u{0074}']), - '\u{FB06}' => Some(&['\u{0073}', '\u{0074}']), - '\u{FB13}' => Some(&['\u{0574}', '\u{0576}']), - '\u{FB14}' => Some(&['\u{0574}', '\u{0565}']), - '\u{FB15}' => Some(&['\u{0574}', '\u{056B}']), - '\u{FB16}' => Some(&['\u{057E}', '\u{0576}']), - '\u{FB17}' => Some(&['\u{0574}', '\u{056D}']), - '\u{FB20}' => Some(&['\u{05E2}']), - '\u{FB21}' => Some(&['\u{05D0}']), - '\u{FB22}' => Some(&['\u{05D3}']), - '\u{FB23}' => Some(&['\u{05D4}']), - '\u{FB24}' => Some(&['\u{05DB}']), - '\u{FB25}' => Some(&['\u{05DC}']), - '\u{FB26}' => Some(&['\u{05DD}']), - '\u{FB27}' => Some(&['\u{05E8}']), - '\u{FB28}' => Some(&['\u{05EA}']), - '\u{FB29}' => Some(&['\u{002B}']), - '\u{FB4F}' => Some(&['\u{05D0}', '\u{05DC}']), - '\u{FB50}' => Some(&['\u{0671}']), - '\u{FB51}' => Some(&['\u{0671}']), - '\u{FB52}' => Some(&['\u{067B}']), - '\u{FB53}' => Some(&['\u{067B}']), - '\u{FB54}' => Some(&['\u{067B}']), - '\u{FB55}' => Some(&['\u{067B}']), - '\u{FB56}' => Some(&['\u{067E}']), - '\u{FB57}' => Some(&['\u{067E}']), - '\u{FB58}' => Some(&['\u{067E}']), - '\u{FB59}' => Some(&['\u{067E}']), - '\u{FB5A}' => Some(&['\u{0680}']), - '\u{FB5B}' => Some(&['\u{0680}']), - '\u{FB5C}' => Some(&['\u{0680}']), - '\u{FB5D}' => Some(&['\u{0680}']), - '\u{FB5E}' => Some(&['\u{067A}']), - '\u{FB5F}' => Some(&['\u{067A}']), - '\u{FB60}' => Some(&['\u{067A}']), - '\u{FB61}' => Some(&['\u{067A}']), - '\u{FB62}' => Some(&['\u{067F}']), - '\u{FB63}' => Some(&['\u{067F}']), - '\u{FB64}' => Some(&['\u{067F}']), - '\u{FB65}' => Some(&['\u{067F}']), - '\u{FB66}' => Some(&['\u{0679}']), - '\u{FB67}' => Some(&['\u{0679}']), - '\u{FB68}' => Some(&['\u{0679}']), - '\u{FB69}' => Some(&['\u{0679}']), - '\u{FB6A}' => Some(&['\u{06A4}']), - '\u{FB6B}' => Some(&['\u{06A4}']), - '\u{FB6C}' => Some(&['\u{06A4}']), - '\u{FB6D}' => Some(&['\u{06A4}']), - '\u{FB6E}' => Some(&['\u{06A6}']), - '\u{FB6F}' => Some(&['\u{06A6}']), - '\u{FB70}' => Some(&['\u{06A6}']), - '\u{FB71}' => Some(&['\u{06A6}']), - '\u{FB72}' => Some(&['\u{0684}']), - '\u{FB73}' => Some(&['\u{0684}']), - '\u{FB74}' => Some(&['\u{0684}']), - '\u{FB75}' => Some(&['\u{0684}']), - '\u{FB76}' => Some(&['\u{0683}']), - '\u{FB77}' => Some(&['\u{0683}']), - '\u{FB78}' => Some(&['\u{0683}']), - '\u{FB79}' => Some(&['\u{0683}']), - '\u{FB7A}' => Some(&['\u{0686}']), - '\u{FB7B}' => Some(&['\u{0686}']), - '\u{FB7C}' => Some(&['\u{0686}']), - '\u{FB7D}' => Some(&['\u{0686}']), - '\u{FB7E}' => Some(&['\u{0687}']), - '\u{FB7F}' => Some(&['\u{0687}']), - '\u{FB80}' => Some(&['\u{0687}']), - '\u{FB81}' => Some(&['\u{0687}']), - '\u{FB82}' => Some(&['\u{068D}']), - '\u{FB83}' => Some(&['\u{068D}']), - '\u{FB84}' => Some(&['\u{068C}']), - '\u{FB85}' => Some(&['\u{068C}']), - '\u{FB86}' => Some(&['\u{068E}']), - '\u{FB87}' => Some(&['\u{068E}']), - '\u{FB88}' => Some(&['\u{0688}']), - '\u{FB89}' => Some(&['\u{0688}']), - '\u{FB8A}' => Some(&['\u{0698}']), - '\u{FB8B}' => Some(&['\u{0698}']), - '\u{FB8C}' => Some(&['\u{0691}']), - '\u{FB8D}' => Some(&['\u{0691}']), - '\u{FB8E}' => Some(&['\u{06A9}']), - '\u{FB8F}' => Some(&['\u{06A9}']), - '\u{FB90}' => Some(&['\u{06A9}']), - '\u{FB91}' => Some(&['\u{06A9}']), - '\u{FB92}' => Some(&['\u{06AF}']), - '\u{FB93}' => Some(&['\u{06AF}']), - '\u{FB94}' => Some(&['\u{06AF}']), - '\u{FB95}' => Some(&['\u{06AF}']), - '\u{FB96}' => Some(&['\u{06B3}']), - '\u{FB97}' => Some(&['\u{06B3}']), - '\u{FB98}' => Some(&['\u{06B3}']), - '\u{FB99}' => Some(&['\u{06B3}']), - '\u{FB9A}' => Some(&['\u{06B1}']), - '\u{FB9B}' => Some(&['\u{06B1}']), - '\u{FB9C}' => Some(&['\u{06B1}']), - '\u{FB9D}' => Some(&['\u{06B1}']), - '\u{FB9E}' => Some(&['\u{06BA}']), - '\u{FB9F}' => Some(&['\u{06BA}']), - '\u{FBA0}' => Some(&['\u{06BB}']), - '\u{FBA1}' => Some(&['\u{06BB}']), - '\u{FBA2}' => Some(&['\u{06BB}']), - '\u{FBA3}' => Some(&['\u{06BB}']), - '\u{FBA4}' => Some(&['\u{06D5}', '\u{0654}']), - '\u{FBA5}' => Some(&['\u{06D5}', '\u{0654}']), - '\u{FBA6}' => Some(&['\u{06C1}']), - '\u{FBA7}' => Some(&['\u{06C1}']), - '\u{FBA8}' => Some(&['\u{06C1}']), - '\u{FBA9}' => Some(&['\u{06C1}']), - '\u{FBAA}' => Some(&['\u{06BE}']), - '\u{FBAB}' => Some(&['\u{06BE}']), - '\u{FBAC}' => Some(&['\u{06BE}']), - '\u{FBAD}' => Some(&['\u{06BE}']), - '\u{FBAE}' => Some(&['\u{06D2}']), - '\u{FBAF}' => Some(&['\u{06D2}']), - '\u{FBB0}' => Some(&['\u{06D2}', '\u{0654}']), - '\u{FBB1}' => Some(&['\u{06D2}', '\u{0654}']), - '\u{FBD3}' => Some(&['\u{06AD}']), - '\u{FBD4}' => Some(&['\u{06AD}']), - '\u{FBD5}' => Some(&['\u{06AD}']), - '\u{FBD6}' => Some(&['\u{06AD}']), - '\u{FBD7}' => Some(&['\u{06C7}']), - '\u{FBD8}' => Some(&['\u{06C7}']), - '\u{FBD9}' => Some(&['\u{06C6}']), - '\u{FBDA}' => Some(&['\u{06C6}']), - '\u{FBDB}' => Some(&['\u{06C8}']), - '\u{FBDC}' => Some(&['\u{06C8}']), - '\u{FBDD}' => Some(&['\u{06C7}', '\u{0674}']), - '\u{FBDE}' => Some(&['\u{06CB}']), - '\u{FBDF}' => Some(&['\u{06CB}']), - '\u{FBE0}' => Some(&['\u{06C5}']), - '\u{FBE1}' => Some(&['\u{06C5}']), - '\u{FBE2}' => Some(&['\u{06C9}']), - '\u{FBE3}' => Some(&['\u{06C9}']), - '\u{FBE4}' => Some(&['\u{06D0}']), - '\u{FBE5}' => Some(&['\u{06D0}']), - '\u{FBE6}' => Some(&['\u{06D0}']), - '\u{FBE7}' => Some(&['\u{06D0}']), - '\u{FBE8}' => Some(&['\u{0649}']), - '\u{FBE9}' => Some(&['\u{0649}']), - '\u{FBEA}' => Some(&['\u{064A}', '\u{0654}', '\u{0627}']), - '\u{FBEB}' => Some(&['\u{064A}', '\u{0654}', '\u{0627}']), - '\u{FBEC}' => Some(&['\u{064A}', '\u{0654}', '\u{06D5}']), - '\u{FBED}' => Some(&['\u{064A}', '\u{0654}', '\u{06D5}']), - '\u{FBEE}' => Some(&['\u{064A}', '\u{0654}', '\u{0648}']), - '\u{FBEF}' => Some(&['\u{064A}', '\u{0654}', '\u{0648}']), - '\u{FBF0}' => Some(&['\u{064A}', '\u{0654}', '\u{06C7}']), - '\u{FBF1}' => Some(&['\u{064A}', '\u{0654}', '\u{06C7}']), - '\u{FBF2}' => Some(&['\u{064A}', '\u{0654}', '\u{06C6}']), - '\u{FBF3}' => Some(&['\u{064A}', '\u{0654}', '\u{06C6}']), - '\u{FBF4}' => Some(&['\u{064A}', '\u{0654}', '\u{06C8}']), - '\u{FBF5}' => Some(&['\u{064A}', '\u{0654}', '\u{06C8}']), - '\u{FBF6}' => Some(&['\u{064A}', '\u{0654}', '\u{06D0}']), - '\u{FBF7}' => Some(&['\u{064A}', '\u{0654}', '\u{06D0}']), - '\u{FBF8}' => Some(&['\u{064A}', '\u{0654}', '\u{06D0}']), - '\u{FBF9}' => Some(&['\u{064A}', '\u{0654}', '\u{0649}']), - '\u{FBFA}' => Some(&['\u{064A}', '\u{0654}', '\u{0649}']), - '\u{FBFB}' => Some(&['\u{064A}', '\u{0654}', '\u{0649}']), - '\u{FBFC}' => Some(&['\u{06CC}']), - '\u{FBFD}' => Some(&['\u{06CC}']), - '\u{FBFE}' => Some(&['\u{06CC}']), - '\u{FBFF}' => Some(&['\u{06CC}']), - '\u{FC00}' => Some(&['\u{064A}', '\u{0654}', '\u{062C}']), - '\u{FC01}' => Some(&['\u{064A}', '\u{0654}', '\u{062D}']), - '\u{FC02}' => Some(&['\u{064A}', '\u{0654}', '\u{0645}']), - '\u{FC03}' => Some(&['\u{064A}', '\u{0654}', '\u{0649}']), - '\u{FC04}' => Some(&['\u{064A}', '\u{0654}', '\u{064A}']), - '\u{FC05}' => Some(&['\u{0628}', '\u{062C}']), - '\u{FC06}' => Some(&['\u{0628}', '\u{062D}']), - '\u{FC07}' => Some(&['\u{0628}', '\u{062E}']), - '\u{FC08}' => Some(&['\u{0628}', '\u{0645}']), - '\u{FC09}' => Some(&['\u{0628}', '\u{0649}']), - '\u{FC0A}' => Some(&['\u{0628}', '\u{064A}']), - '\u{FC0B}' => Some(&['\u{062A}', '\u{062C}']), - '\u{FC0C}' => Some(&['\u{062A}', '\u{062D}']), - '\u{FC0D}' => Some(&['\u{062A}', '\u{062E}']), - '\u{FC0E}' => Some(&['\u{062A}', '\u{0645}']), - '\u{FC0F}' => Some(&['\u{062A}', '\u{0649}']), - '\u{FC10}' => Some(&['\u{062A}', '\u{064A}']), - '\u{FC11}' => Some(&['\u{062B}', '\u{062C}']), - '\u{FC12}' => Some(&['\u{062B}', '\u{0645}']), - '\u{FC13}' => Some(&['\u{062B}', '\u{0649}']), - '\u{FC14}' => Some(&['\u{062B}', '\u{064A}']), - '\u{FC15}' => Some(&['\u{062C}', '\u{062D}']), - '\u{FC16}' => Some(&['\u{062C}', '\u{0645}']), - '\u{FC17}' => Some(&['\u{062D}', '\u{062C}']), - '\u{FC18}' => Some(&['\u{062D}', '\u{0645}']), - '\u{FC19}' => Some(&['\u{062E}', '\u{062C}']), - '\u{FC1A}' => Some(&['\u{062E}', '\u{062D}']), - '\u{FC1B}' => Some(&['\u{062E}', '\u{0645}']), - '\u{FC1C}' => Some(&['\u{0633}', '\u{062C}']), - '\u{FC1D}' => Some(&['\u{0633}', '\u{062D}']), - '\u{FC1E}' => Some(&['\u{0633}', '\u{062E}']), - '\u{FC1F}' => Some(&['\u{0633}', '\u{0645}']), - '\u{FC20}' => Some(&['\u{0635}', '\u{062D}']), - '\u{FC21}' => Some(&['\u{0635}', '\u{0645}']), - '\u{FC22}' => Some(&['\u{0636}', '\u{062C}']), - '\u{FC23}' => Some(&['\u{0636}', '\u{062D}']), - '\u{FC24}' => Some(&['\u{0636}', '\u{062E}']), - '\u{FC25}' => Some(&['\u{0636}', '\u{0645}']), - '\u{FC26}' => Some(&['\u{0637}', '\u{062D}']), - '\u{FC27}' => Some(&['\u{0637}', '\u{0645}']), - '\u{FC28}' => Some(&['\u{0638}', '\u{0645}']), - '\u{FC29}' => Some(&['\u{0639}', '\u{062C}']), - '\u{FC2A}' => Some(&['\u{0639}', '\u{0645}']), - '\u{FC2B}' => Some(&['\u{063A}', '\u{062C}']), - '\u{FC2C}' => Some(&['\u{063A}', '\u{0645}']), - '\u{FC2D}' => Some(&['\u{0641}', '\u{062C}']), - '\u{FC2E}' => Some(&['\u{0641}', '\u{062D}']), - '\u{FC2F}' => Some(&['\u{0641}', '\u{062E}']), - '\u{FC30}' => Some(&['\u{0641}', '\u{0645}']), - '\u{FC31}' => Some(&['\u{0641}', '\u{0649}']), - '\u{FC32}' => Some(&['\u{0641}', '\u{064A}']), - '\u{FC33}' => Some(&['\u{0642}', '\u{062D}']), - '\u{FC34}' => Some(&['\u{0642}', '\u{0645}']), - '\u{FC35}' => Some(&['\u{0642}', '\u{0649}']), - '\u{FC36}' => Some(&['\u{0642}', '\u{064A}']), - '\u{FC37}' => Some(&['\u{0643}', '\u{0627}']), - '\u{FC38}' => Some(&['\u{0643}', '\u{062C}']), - '\u{FC39}' => Some(&['\u{0643}', '\u{062D}']), - '\u{FC3A}' => Some(&['\u{0643}', '\u{062E}']), - '\u{FC3B}' => Some(&['\u{0643}', '\u{0644}']), - '\u{FC3C}' => Some(&['\u{0643}', '\u{0645}']), - '\u{FC3D}' => Some(&['\u{0643}', '\u{0649}']), - '\u{FC3E}' => Some(&['\u{0643}', '\u{064A}']), - '\u{FC3F}' => Some(&['\u{0644}', '\u{062C}']), - '\u{FC40}' => Some(&['\u{0644}', '\u{062D}']), - '\u{FC41}' => Some(&['\u{0644}', '\u{062E}']), - '\u{FC42}' => Some(&['\u{0644}', '\u{0645}']), - '\u{FC43}' => Some(&['\u{0644}', '\u{0649}']), - '\u{FC44}' => Some(&['\u{0644}', '\u{064A}']), - '\u{FC45}' => Some(&['\u{0645}', '\u{062C}']), - '\u{FC46}' => Some(&['\u{0645}', '\u{062D}']), - '\u{FC47}' => Some(&['\u{0645}', '\u{062E}']), - '\u{FC48}' => Some(&['\u{0645}', '\u{0645}']), - '\u{FC49}' => Some(&['\u{0645}', '\u{0649}']), - '\u{FC4A}' => Some(&['\u{0645}', '\u{064A}']), - '\u{FC4B}' => Some(&['\u{0646}', '\u{062C}']), - '\u{FC4C}' => Some(&['\u{0646}', '\u{062D}']), - '\u{FC4D}' => Some(&['\u{0646}', '\u{062E}']), - '\u{FC4E}' => Some(&['\u{0646}', '\u{0645}']), - '\u{FC4F}' => Some(&['\u{0646}', '\u{0649}']), - '\u{FC50}' => Some(&['\u{0646}', '\u{064A}']), - '\u{FC51}' => Some(&['\u{0647}', '\u{062C}']), - '\u{FC52}' => Some(&['\u{0647}', '\u{0645}']), - '\u{FC53}' => Some(&['\u{0647}', '\u{0649}']), - '\u{FC54}' => Some(&['\u{0647}', '\u{064A}']), - '\u{FC55}' => Some(&['\u{064A}', '\u{062C}']), - '\u{FC56}' => Some(&['\u{064A}', '\u{062D}']), - '\u{FC57}' => Some(&['\u{064A}', '\u{062E}']), - '\u{FC58}' => Some(&['\u{064A}', '\u{0645}']), - '\u{FC59}' => Some(&['\u{064A}', '\u{0649}']), - '\u{FC5A}' => Some(&['\u{064A}', '\u{064A}']), - '\u{FC5B}' => Some(&['\u{0630}', '\u{0670}']), - '\u{FC5C}' => Some(&['\u{0631}', '\u{0670}']), - '\u{FC5D}' => Some(&['\u{0649}', '\u{0670}']), - '\u{FC5E}' => Some(&['\u{0020}', '\u{064C}', '\u{0651}']), - '\u{FC5F}' => Some(&['\u{0020}', '\u{064D}', '\u{0651}']), - '\u{FC60}' => Some(&['\u{0020}', '\u{064E}', '\u{0651}']), - '\u{FC61}' => Some(&['\u{0020}', '\u{064F}', '\u{0651}']), - '\u{FC62}' => Some(&['\u{0020}', '\u{0650}', '\u{0651}']), - '\u{FC63}' => Some(&['\u{0020}', '\u{0651}', '\u{0670}']), - '\u{FC64}' => Some(&['\u{064A}', '\u{0654}', '\u{0631}']), - '\u{FC65}' => Some(&['\u{064A}', '\u{0654}', '\u{0632}']), - '\u{FC66}' => Some(&['\u{064A}', '\u{0654}', '\u{0645}']), - '\u{FC67}' => Some(&['\u{064A}', '\u{0654}', '\u{0646}']), - '\u{FC68}' => Some(&['\u{064A}', '\u{0654}', '\u{0649}']), - '\u{FC69}' => Some(&['\u{064A}', '\u{0654}', '\u{064A}']), - '\u{FC6A}' => Some(&['\u{0628}', '\u{0631}']), - '\u{FC6B}' => Some(&['\u{0628}', '\u{0632}']), - '\u{FC6C}' => Some(&['\u{0628}', '\u{0645}']), - '\u{FC6D}' => Some(&['\u{0628}', '\u{0646}']), - '\u{FC6E}' => Some(&['\u{0628}', '\u{0649}']), - '\u{FC6F}' => Some(&['\u{0628}', '\u{064A}']), - '\u{FC70}' => Some(&['\u{062A}', '\u{0631}']), - '\u{FC71}' => Some(&['\u{062A}', '\u{0632}']), - '\u{FC72}' => Some(&['\u{062A}', '\u{0645}']), - '\u{FC73}' => Some(&['\u{062A}', '\u{0646}']), - '\u{FC74}' => Some(&['\u{062A}', '\u{0649}']), - '\u{FC75}' => Some(&['\u{062A}', '\u{064A}']), - '\u{FC76}' => Some(&['\u{062B}', '\u{0631}']), - '\u{FC77}' => Some(&['\u{062B}', '\u{0632}']), - '\u{FC78}' => Some(&['\u{062B}', '\u{0645}']), - '\u{FC79}' => Some(&['\u{062B}', '\u{0646}']), - '\u{FC7A}' => Some(&['\u{062B}', '\u{0649}']), - '\u{FC7B}' => Some(&['\u{062B}', '\u{064A}']), - '\u{FC7C}' => Some(&['\u{0641}', '\u{0649}']), - '\u{FC7D}' => Some(&['\u{0641}', '\u{064A}']), - '\u{FC7E}' => Some(&['\u{0642}', '\u{0649}']), - '\u{FC7F}' => Some(&['\u{0642}', '\u{064A}']), - '\u{FC80}' => Some(&['\u{0643}', '\u{0627}']), - '\u{FC81}' => Some(&['\u{0643}', '\u{0644}']), - '\u{FC82}' => Some(&['\u{0643}', '\u{0645}']), - '\u{FC83}' => Some(&['\u{0643}', '\u{0649}']), - '\u{FC84}' => Some(&['\u{0643}', '\u{064A}']), - '\u{FC85}' => Some(&['\u{0644}', '\u{0645}']), - '\u{FC86}' => Some(&['\u{0644}', '\u{0649}']), - '\u{FC87}' => Some(&['\u{0644}', '\u{064A}']), - '\u{FC88}' => Some(&['\u{0645}', '\u{0627}']), - '\u{FC89}' => Some(&['\u{0645}', '\u{0645}']), - '\u{FC8A}' => Some(&['\u{0646}', '\u{0631}']), - '\u{FC8B}' => Some(&['\u{0646}', '\u{0632}']), - '\u{FC8C}' => Some(&['\u{0646}', '\u{0645}']), - '\u{FC8D}' => Some(&['\u{0646}', '\u{0646}']), - '\u{FC8E}' => Some(&['\u{0646}', '\u{0649}']), - '\u{FC8F}' => Some(&['\u{0646}', '\u{064A}']), - '\u{FC90}' => Some(&['\u{0649}', '\u{0670}']), - '\u{FC91}' => Some(&['\u{064A}', '\u{0631}']), - '\u{FC92}' => Some(&['\u{064A}', '\u{0632}']), - '\u{FC93}' => Some(&['\u{064A}', '\u{0645}']), - '\u{FC94}' => Some(&['\u{064A}', '\u{0646}']), - '\u{FC95}' => Some(&['\u{064A}', '\u{0649}']), - '\u{FC96}' => Some(&['\u{064A}', '\u{064A}']), - '\u{FC97}' => Some(&['\u{064A}', '\u{0654}', '\u{062C}']), - '\u{FC98}' => Some(&['\u{064A}', '\u{0654}', '\u{062D}']), - '\u{FC99}' => Some(&['\u{064A}', '\u{0654}', '\u{062E}']), - '\u{FC9A}' => Some(&['\u{064A}', '\u{0654}', '\u{0645}']), - '\u{FC9B}' => Some(&['\u{064A}', '\u{0654}', '\u{0647}']), - '\u{FC9C}' => Some(&['\u{0628}', '\u{062C}']), - '\u{FC9D}' => Some(&['\u{0628}', '\u{062D}']), - '\u{FC9E}' => Some(&['\u{0628}', '\u{062E}']), - '\u{FC9F}' => Some(&['\u{0628}', '\u{0645}']), - '\u{FCA0}' => Some(&['\u{0628}', '\u{0647}']), - '\u{FCA1}' => Some(&['\u{062A}', '\u{062C}']), - '\u{FCA2}' => Some(&['\u{062A}', '\u{062D}']), - '\u{FCA3}' => Some(&['\u{062A}', '\u{062E}']), - '\u{FCA4}' => Some(&['\u{062A}', '\u{0645}']), - '\u{FCA5}' => Some(&['\u{062A}', '\u{0647}']), - '\u{FCA6}' => Some(&['\u{062B}', '\u{0645}']), - '\u{FCA7}' => Some(&['\u{062C}', '\u{062D}']), - '\u{FCA8}' => Some(&['\u{062C}', '\u{0645}']), - '\u{FCA9}' => Some(&['\u{062D}', '\u{062C}']), - '\u{FCAA}' => Some(&['\u{062D}', '\u{0645}']), - '\u{FCAB}' => Some(&['\u{062E}', '\u{062C}']), - '\u{FCAC}' => Some(&['\u{062E}', '\u{0645}']), - '\u{FCAD}' => Some(&['\u{0633}', '\u{062C}']), - '\u{FCAE}' => Some(&['\u{0633}', '\u{062D}']), - '\u{FCAF}' => Some(&['\u{0633}', '\u{062E}']), - '\u{FCB0}' => Some(&['\u{0633}', '\u{0645}']), - '\u{FCB1}' => Some(&['\u{0635}', '\u{062D}']), - '\u{FCB2}' => Some(&['\u{0635}', '\u{062E}']), - '\u{FCB3}' => Some(&['\u{0635}', '\u{0645}']), - '\u{FCB4}' => Some(&['\u{0636}', '\u{062C}']), - '\u{FCB5}' => Some(&['\u{0636}', '\u{062D}']), - '\u{FCB6}' => Some(&['\u{0636}', '\u{062E}']), - '\u{FCB7}' => Some(&['\u{0636}', '\u{0645}']), - '\u{FCB8}' => Some(&['\u{0637}', '\u{062D}']), - '\u{FCB9}' => Some(&['\u{0638}', '\u{0645}']), - '\u{FCBA}' => Some(&['\u{0639}', '\u{062C}']), - '\u{FCBB}' => Some(&['\u{0639}', '\u{0645}']), - '\u{FCBC}' => Some(&['\u{063A}', '\u{062C}']), - '\u{FCBD}' => Some(&['\u{063A}', '\u{0645}']), - '\u{FCBE}' => Some(&['\u{0641}', '\u{062C}']), - '\u{FCBF}' => Some(&['\u{0641}', '\u{062D}']), - '\u{FCC0}' => Some(&['\u{0641}', '\u{062E}']), - '\u{FCC1}' => Some(&['\u{0641}', '\u{0645}']), - '\u{FCC2}' => Some(&['\u{0642}', '\u{062D}']), - '\u{FCC3}' => Some(&['\u{0642}', '\u{0645}']), - '\u{FCC4}' => Some(&['\u{0643}', '\u{062C}']), - '\u{FCC5}' => Some(&['\u{0643}', '\u{062D}']), - '\u{FCC6}' => Some(&['\u{0643}', '\u{062E}']), - '\u{FCC7}' => Some(&['\u{0643}', '\u{0644}']), - '\u{FCC8}' => Some(&['\u{0643}', '\u{0645}']), - '\u{FCC9}' => Some(&['\u{0644}', '\u{062C}']), - '\u{FCCA}' => Some(&['\u{0644}', '\u{062D}']), - '\u{FCCB}' => Some(&['\u{0644}', '\u{062E}']), - '\u{FCCC}' => Some(&['\u{0644}', '\u{0645}']), - '\u{FCCD}' => Some(&['\u{0644}', '\u{0647}']), - '\u{FCCE}' => Some(&['\u{0645}', '\u{062C}']), - '\u{FCCF}' => Some(&['\u{0645}', '\u{062D}']), - '\u{FCD0}' => Some(&['\u{0645}', '\u{062E}']), - '\u{FCD1}' => Some(&['\u{0645}', '\u{0645}']), - '\u{FCD2}' => Some(&['\u{0646}', '\u{062C}']), - '\u{FCD3}' => Some(&['\u{0646}', '\u{062D}']), - '\u{FCD4}' => Some(&['\u{0646}', '\u{062E}']), - '\u{FCD5}' => Some(&['\u{0646}', '\u{0645}']), - '\u{FCD6}' => Some(&['\u{0646}', '\u{0647}']), - '\u{FCD7}' => Some(&['\u{0647}', '\u{062C}']), - '\u{FCD8}' => Some(&['\u{0647}', '\u{0645}']), - '\u{FCD9}' => Some(&['\u{0647}', '\u{0670}']), - '\u{FCDA}' => Some(&['\u{064A}', '\u{062C}']), - '\u{FCDB}' => Some(&['\u{064A}', '\u{062D}']), - '\u{FCDC}' => Some(&['\u{064A}', '\u{062E}']), - '\u{FCDD}' => Some(&['\u{064A}', '\u{0645}']), - '\u{FCDE}' => Some(&['\u{064A}', '\u{0647}']), - '\u{FCDF}' => Some(&['\u{064A}', '\u{0654}', '\u{0645}']), - '\u{FCE0}' => Some(&['\u{064A}', '\u{0654}', '\u{0647}']), - '\u{FCE1}' => Some(&['\u{0628}', '\u{0645}']), - '\u{FCE2}' => Some(&['\u{0628}', '\u{0647}']), - '\u{FCE3}' => Some(&['\u{062A}', '\u{0645}']), - '\u{FCE4}' => Some(&['\u{062A}', '\u{0647}']), - '\u{FCE5}' => Some(&['\u{062B}', '\u{0645}']), - '\u{FCE6}' => Some(&['\u{062B}', '\u{0647}']), - '\u{FCE7}' => Some(&['\u{0633}', '\u{0645}']), - '\u{FCE8}' => Some(&['\u{0633}', '\u{0647}']), - '\u{FCE9}' => Some(&['\u{0634}', '\u{0645}']), - '\u{FCEA}' => Some(&['\u{0634}', '\u{0647}']), - '\u{FCEB}' => Some(&['\u{0643}', '\u{0644}']), - '\u{FCEC}' => Some(&['\u{0643}', '\u{0645}']), - '\u{FCED}' => Some(&['\u{0644}', '\u{0645}']), - '\u{FCEE}' => Some(&['\u{0646}', '\u{0645}']), - '\u{FCEF}' => Some(&['\u{0646}', '\u{0647}']), - '\u{FCF0}' => Some(&['\u{064A}', '\u{0645}']), - '\u{FCF1}' => Some(&['\u{064A}', '\u{0647}']), - '\u{FCF2}' => Some(&['\u{0640}', '\u{064E}', '\u{0651}']), - '\u{FCF3}' => Some(&['\u{0640}', '\u{064F}', '\u{0651}']), - '\u{FCF4}' => Some(&['\u{0640}', '\u{0650}', '\u{0651}']), - '\u{FCF5}' => Some(&['\u{0637}', '\u{0649}']), - '\u{FCF6}' => Some(&['\u{0637}', '\u{064A}']), - '\u{FCF7}' => Some(&['\u{0639}', '\u{0649}']), - '\u{FCF8}' => Some(&['\u{0639}', '\u{064A}']), - '\u{FCF9}' => Some(&['\u{063A}', '\u{0649}']), - '\u{FCFA}' => Some(&['\u{063A}', '\u{064A}']), - '\u{FCFB}' => Some(&['\u{0633}', '\u{0649}']), - '\u{FCFC}' => Some(&['\u{0633}', '\u{064A}']), - '\u{FCFD}' => Some(&['\u{0634}', '\u{0649}']), - '\u{FCFE}' => Some(&['\u{0634}', '\u{064A}']), - '\u{FCFF}' => Some(&['\u{062D}', '\u{0649}']), - '\u{FD00}' => Some(&['\u{062D}', '\u{064A}']), - '\u{FD01}' => Some(&['\u{062C}', '\u{0649}']), - '\u{FD02}' => Some(&['\u{062C}', '\u{064A}']), - '\u{FD03}' => Some(&['\u{062E}', '\u{0649}']), - '\u{FD04}' => Some(&['\u{062E}', '\u{064A}']), - '\u{FD05}' => Some(&['\u{0635}', '\u{0649}']), - '\u{FD06}' => Some(&['\u{0635}', '\u{064A}']), - '\u{FD07}' => Some(&['\u{0636}', '\u{0649}']), - '\u{FD08}' => Some(&['\u{0636}', '\u{064A}']), - '\u{FD09}' => Some(&['\u{0634}', '\u{062C}']), - '\u{FD0A}' => Some(&['\u{0634}', '\u{062D}']), - '\u{FD0B}' => Some(&['\u{0634}', '\u{062E}']), - '\u{FD0C}' => Some(&['\u{0634}', '\u{0645}']), - '\u{FD0D}' => Some(&['\u{0634}', '\u{0631}']), - '\u{FD0E}' => Some(&['\u{0633}', '\u{0631}']), - '\u{FD0F}' => Some(&['\u{0635}', '\u{0631}']), - '\u{FD10}' => Some(&['\u{0636}', '\u{0631}']), - '\u{FD11}' => Some(&['\u{0637}', '\u{0649}']), - '\u{FD12}' => Some(&['\u{0637}', '\u{064A}']), - '\u{FD13}' => Some(&['\u{0639}', '\u{0649}']), - '\u{FD14}' => Some(&['\u{0639}', '\u{064A}']), - '\u{FD15}' => Some(&['\u{063A}', '\u{0649}']), - '\u{FD16}' => Some(&['\u{063A}', '\u{064A}']), - '\u{FD17}' => Some(&['\u{0633}', '\u{0649}']), - '\u{FD18}' => Some(&['\u{0633}', '\u{064A}']), - '\u{FD19}' => Some(&['\u{0634}', '\u{0649}']), - '\u{FD1A}' => Some(&['\u{0634}', '\u{064A}']), - '\u{FD1B}' => Some(&['\u{062D}', '\u{0649}']), - '\u{FD1C}' => Some(&['\u{062D}', '\u{064A}']), - '\u{FD1D}' => Some(&['\u{062C}', '\u{0649}']), - '\u{FD1E}' => Some(&['\u{062C}', '\u{064A}']), - '\u{FD1F}' => Some(&['\u{062E}', '\u{0649}']), - '\u{FD20}' => Some(&['\u{062E}', '\u{064A}']), - '\u{FD21}' => Some(&['\u{0635}', '\u{0649}']), - '\u{FD22}' => Some(&['\u{0635}', '\u{064A}']), - '\u{FD23}' => Some(&['\u{0636}', '\u{0649}']), - '\u{FD24}' => Some(&['\u{0636}', '\u{064A}']), - '\u{FD25}' => Some(&['\u{0634}', '\u{062C}']), - '\u{FD26}' => Some(&['\u{0634}', '\u{062D}']), - '\u{FD27}' => Some(&['\u{0634}', '\u{062E}']), - '\u{FD28}' => Some(&['\u{0634}', '\u{0645}']), - '\u{FD29}' => Some(&['\u{0634}', '\u{0631}']), - '\u{FD2A}' => Some(&['\u{0633}', '\u{0631}']), - '\u{FD2B}' => Some(&['\u{0635}', '\u{0631}']), - '\u{FD2C}' => Some(&['\u{0636}', '\u{0631}']), - '\u{FD2D}' => Some(&['\u{0634}', '\u{062C}']), - '\u{FD2E}' => Some(&['\u{0634}', '\u{062D}']), - '\u{FD2F}' => Some(&['\u{0634}', '\u{062E}']), - '\u{FD30}' => Some(&['\u{0634}', '\u{0645}']), - '\u{FD31}' => Some(&['\u{0633}', '\u{0647}']), - '\u{FD32}' => Some(&['\u{0634}', '\u{0647}']), - '\u{FD33}' => Some(&['\u{0637}', '\u{0645}']), - '\u{FD34}' => Some(&['\u{0633}', '\u{062C}']), - '\u{FD35}' => Some(&['\u{0633}', '\u{062D}']), - '\u{FD36}' => Some(&['\u{0633}', '\u{062E}']), - '\u{FD37}' => Some(&['\u{0634}', '\u{062C}']), - '\u{FD38}' => Some(&['\u{0634}', '\u{062D}']), - '\u{FD39}' => Some(&['\u{0634}', '\u{062E}']), - '\u{FD3A}' => Some(&['\u{0637}', '\u{0645}']), - '\u{FD3B}' => Some(&['\u{0638}', '\u{0645}']), - '\u{FD3C}' => Some(&['\u{0627}', '\u{064B}']), - '\u{FD3D}' => Some(&['\u{0627}', '\u{064B}']), - '\u{FD50}' => Some(&['\u{062A}', '\u{062C}', '\u{0645}']), - '\u{FD51}' => Some(&['\u{062A}', '\u{062D}', '\u{062C}']), - '\u{FD52}' => Some(&['\u{062A}', '\u{062D}', '\u{062C}']), - '\u{FD53}' => Some(&['\u{062A}', '\u{062D}', '\u{0645}']), - '\u{FD54}' => Some(&['\u{062A}', '\u{062E}', '\u{0645}']), - '\u{FD55}' => Some(&['\u{062A}', '\u{0645}', '\u{062C}']), - '\u{FD56}' => Some(&['\u{062A}', '\u{0645}', '\u{062D}']), - '\u{FD57}' => Some(&['\u{062A}', '\u{0645}', '\u{062E}']), - '\u{FD58}' => Some(&['\u{062C}', '\u{0645}', '\u{062D}']), - '\u{FD59}' => Some(&['\u{062C}', '\u{0645}', '\u{062D}']), - '\u{FD5A}' => Some(&['\u{062D}', '\u{0645}', '\u{064A}']), - '\u{FD5B}' => Some(&['\u{062D}', '\u{0645}', '\u{0649}']), - '\u{FD5C}' => Some(&['\u{0633}', '\u{062D}', '\u{062C}']), - '\u{FD5D}' => Some(&['\u{0633}', '\u{062C}', '\u{062D}']), - '\u{FD5E}' => Some(&['\u{0633}', '\u{062C}', '\u{0649}']), - '\u{FD5F}' => Some(&['\u{0633}', '\u{0645}', '\u{062D}']), - '\u{FD60}' => Some(&['\u{0633}', '\u{0645}', '\u{062D}']), - '\u{FD61}' => Some(&['\u{0633}', '\u{0645}', '\u{062C}']), - '\u{FD62}' => Some(&['\u{0633}', '\u{0645}', '\u{0645}']), - '\u{FD63}' => Some(&['\u{0633}', '\u{0645}', '\u{0645}']), - '\u{FD64}' => Some(&['\u{0635}', '\u{062D}', '\u{062D}']), - '\u{FD65}' => Some(&['\u{0635}', '\u{062D}', '\u{062D}']), - '\u{FD66}' => Some(&['\u{0635}', '\u{0645}', '\u{0645}']), - '\u{FD67}' => Some(&['\u{0634}', '\u{062D}', '\u{0645}']), - '\u{FD68}' => Some(&['\u{0634}', '\u{062D}', '\u{0645}']), - '\u{FD69}' => Some(&['\u{0634}', '\u{062C}', '\u{064A}']), - '\u{FD6A}' => Some(&['\u{0634}', '\u{0645}', '\u{062E}']), - '\u{FD6B}' => Some(&['\u{0634}', '\u{0645}', '\u{062E}']), - '\u{FD6C}' => Some(&['\u{0634}', '\u{0645}', '\u{0645}']), - '\u{FD6D}' => Some(&['\u{0634}', '\u{0645}', '\u{0645}']), - '\u{FD6E}' => Some(&['\u{0636}', '\u{062D}', '\u{0649}']), - '\u{FD6F}' => Some(&['\u{0636}', '\u{062E}', '\u{0645}']), - '\u{FD70}' => Some(&['\u{0636}', '\u{062E}', '\u{0645}']), - '\u{FD71}' => Some(&['\u{0637}', '\u{0645}', '\u{062D}']), - '\u{FD72}' => Some(&['\u{0637}', '\u{0645}', '\u{062D}']), - '\u{FD73}' => Some(&['\u{0637}', '\u{0645}', '\u{0645}']), - '\u{FD74}' => Some(&['\u{0637}', '\u{0645}', '\u{064A}']), - '\u{FD75}' => Some(&['\u{0639}', '\u{062C}', '\u{0645}']), - '\u{FD76}' => Some(&['\u{0639}', '\u{0645}', '\u{0645}']), - '\u{FD77}' => Some(&['\u{0639}', '\u{0645}', '\u{0645}']), - '\u{FD78}' => Some(&['\u{0639}', '\u{0645}', '\u{0649}']), - '\u{FD79}' => Some(&['\u{063A}', '\u{0645}', '\u{0645}']), - '\u{FD7A}' => Some(&['\u{063A}', '\u{0645}', '\u{064A}']), - '\u{FD7B}' => Some(&['\u{063A}', '\u{0645}', '\u{0649}']), - '\u{FD7C}' => Some(&['\u{0641}', '\u{062E}', '\u{0645}']), - '\u{FD7D}' => Some(&['\u{0641}', '\u{062E}', '\u{0645}']), - '\u{FD7E}' => Some(&['\u{0642}', '\u{0645}', '\u{062D}']), - '\u{FD7F}' => Some(&['\u{0642}', '\u{0645}', '\u{0645}']), - '\u{FD80}' => Some(&['\u{0644}', '\u{062D}', '\u{0645}']), - '\u{FD81}' => Some(&['\u{0644}', '\u{062D}', '\u{064A}']), - '\u{FD82}' => Some(&['\u{0644}', '\u{062D}', '\u{0649}']), - '\u{FD83}' => Some(&['\u{0644}', '\u{062C}', '\u{062C}']), - '\u{FD84}' => Some(&['\u{0644}', '\u{062C}', '\u{062C}']), - '\u{FD85}' => Some(&['\u{0644}', '\u{062E}', '\u{0645}']), - '\u{FD86}' => Some(&['\u{0644}', '\u{062E}', '\u{0645}']), - '\u{FD87}' => Some(&['\u{0644}', '\u{0645}', '\u{062D}']), - '\u{FD88}' => Some(&['\u{0644}', '\u{0645}', '\u{062D}']), - '\u{FD89}' => Some(&['\u{0645}', '\u{062D}', '\u{062C}']), - '\u{FD8A}' => Some(&['\u{0645}', '\u{062D}', '\u{0645}']), - '\u{FD8B}' => Some(&['\u{0645}', '\u{062D}', '\u{064A}']), - '\u{FD8C}' => Some(&['\u{0645}', '\u{062C}', '\u{062D}']), - '\u{FD8D}' => Some(&['\u{0645}', '\u{062C}', '\u{0645}']), - '\u{FD8E}' => Some(&['\u{0645}', '\u{062E}', '\u{062C}']), - '\u{FD8F}' => Some(&['\u{0645}', '\u{062E}', '\u{0645}']), - '\u{FD92}' => Some(&['\u{0645}', '\u{062C}', '\u{062E}']), - '\u{FD93}' => Some(&['\u{0647}', '\u{0645}', '\u{062C}']), - '\u{FD94}' => Some(&['\u{0647}', '\u{0645}', '\u{0645}']), - '\u{FD95}' => Some(&['\u{0646}', '\u{062D}', '\u{0645}']), - '\u{FD96}' => Some(&['\u{0646}', '\u{062D}', '\u{0649}']), - '\u{FD97}' => Some(&['\u{0646}', '\u{062C}', '\u{0645}']), - '\u{FD98}' => Some(&['\u{0646}', '\u{062C}', '\u{0645}']), - '\u{FD99}' => Some(&['\u{0646}', '\u{062C}', '\u{0649}']), - '\u{FD9A}' => Some(&['\u{0646}', '\u{0645}', '\u{064A}']), - '\u{FD9B}' => Some(&['\u{0646}', '\u{0645}', '\u{0649}']), - '\u{FD9C}' => Some(&['\u{064A}', '\u{0645}', '\u{0645}']), - '\u{FD9D}' => Some(&['\u{064A}', '\u{0645}', '\u{0645}']), - '\u{FD9E}' => Some(&['\u{0628}', '\u{062E}', '\u{064A}']), - '\u{FD9F}' => Some(&['\u{062A}', '\u{062C}', '\u{064A}']), - '\u{FDA0}' => Some(&['\u{062A}', '\u{062C}', '\u{0649}']), - '\u{FDA1}' => Some(&['\u{062A}', '\u{062E}', '\u{064A}']), - '\u{FDA2}' => Some(&['\u{062A}', '\u{062E}', '\u{0649}']), - '\u{FDA3}' => Some(&['\u{062A}', '\u{0645}', '\u{064A}']), - '\u{FDA4}' => Some(&['\u{062A}', '\u{0645}', '\u{0649}']), - '\u{FDA5}' => Some(&['\u{062C}', '\u{0645}', '\u{064A}']), - '\u{FDA6}' => Some(&['\u{062C}', '\u{062D}', '\u{0649}']), - '\u{FDA7}' => Some(&['\u{062C}', '\u{0645}', '\u{0649}']), - '\u{FDA8}' => Some(&['\u{0633}', '\u{062E}', '\u{0649}']), - '\u{FDA9}' => Some(&['\u{0635}', '\u{062D}', '\u{064A}']), - '\u{FDAA}' => Some(&['\u{0634}', '\u{062D}', '\u{064A}']), - '\u{FDAB}' => Some(&['\u{0636}', '\u{062D}', '\u{064A}']), - '\u{FDAC}' => Some(&['\u{0644}', '\u{062C}', '\u{064A}']), - '\u{FDAD}' => Some(&['\u{0644}', '\u{0645}', '\u{064A}']), - '\u{FDAE}' => Some(&['\u{064A}', '\u{062D}', '\u{064A}']), - '\u{FDAF}' => Some(&['\u{064A}', '\u{062C}', '\u{064A}']), - '\u{FDB0}' => Some(&['\u{064A}', '\u{0645}', '\u{064A}']), - '\u{FDB1}' => Some(&['\u{0645}', '\u{0645}', '\u{064A}']), - '\u{FDB2}' => Some(&['\u{0642}', '\u{0645}', '\u{064A}']), - '\u{FDB3}' => Some(&['\u{0646}', '\u{062D}', '\u{064A}']), - '\u{FDB4}' => Some(&['\u{0642}', '\u{0645}', '\u{062D}']), - '\u{FDB5}' => Some(&['\u{0644}', '\u{062D}', '\u{0645}']), - '\u{FDB6}' => Some(&['\u{0639}', '\u{0645}', '\u{064A}']), - '\u{FDB7}' => Some(&['\u{0643}', '\u{0645}', '\u{064A}']), - '\u{FDB8}' => Some(&['\u{0646}', '\u{062C}', '\u{062D}']), - '\u{FDB9}' => Some(&['\u{0645}', '\u{062E}', '\u{064A}']), - '\u{FDBA}' => Some(&['\u{0644}', '\u{062C}', '\u{0645}']), - '\u{FDBB}' => Some(&['\u{0643}', '\u{0645}', '\u{0645}']), - '\u{FDBC}' => Some(&['\u{0644}', '\u{062C}', '\u{0645}']), - '\u{FDBD}' => Some(&['\u{0646}', '\u{062C}', '\u{062D}']), - '\u{FDBE}' => Some(&['\u{062C}', '\u{062D}', '\u{064A}']), - '\u{FDBF}' => Some(&['\u{062D}', '\u{062C}', '\u{064A}']), - '\u{FDC0}' => Some(&['\u{0645}', '\u{062C}', '\u{064A}']), - '\u{FDC1}' => Some(&['\u{0641}', '\u{0645}', '\u{064A}']), - '\u{FDC2}' => Some(&['\u{0628}', '\u{062D}', '\u{064A}']), - '\u{FDC3}' => Some(&['\u{0643}', '\u{0645}', '\u{0645}']), - '\u{FDC4}' => Some(&['\u{0639}', '\u{062C}', '\u{0645}']), - '\u{FDC5}' => Some(&['\u{0635}', '\u{0645}', '\u{0645}']), - '\u{FDC6}' => Some(&['\u{0633}', '\u{062E}', '\u{064A}']), - '\u{FDC7}' => Some(&['\u{0646}', '\u{062C}', '\u{064A}']), - '\u{FDF0}' => Some(&['\u{0635}', '\u{0644}', '\u{06D2}']), - '\u{FDF1}' => Some(&['\u{0642}', '\u{0644}', '\u{06D2}']), - '\u{FDF2}' => Some(&['\u{0627}', '\u{0644}', '\u{0644}', '\u{0647}']), - '\u{FDF3}' => Some(&['\u{0627}', '\u{0643}', '\u{0628}', '\u{0631}']), - '\u{FDF4}' => Some(&['\u{0645}', '\u{062D}', '\u{0645}', '\u{062F}']), - '\u{FDF5}' => Some(&['\u{0635}', '\u{0644}', '\u{0639}', '\u{0645}']), - '\u{FDF6}' => Some(&['\u{0631}', '\u{0633}', '\u{0648}', '\u{0644}']), - '\u{FDF7}' => Some(&['\u{0639}', '\u{0644}', '\u{064A}', '\u{0647}']), - '\u{FDF8}' => Some(&['\u{0648}', '\u{0633}', '\u{0644}', '\u{0645}']), - '\u{FDF9}' => Some(&['\u{0635}', '\u{0644}', '\u{0649}']), - '\u{FDFA}' => Some(&['\u{0635}', '\u{0644}', '\u{0649}', '\u{0020}', '\u{0627}', '\u{0644}', '\u{0644}', '\u{0647}', '\u{0020}', '\u{0639}', '\u{0644}', '\u{064A}', '\u{0647}', '\u{0020}', '\u{0648}', '\u{0633}', '\u{0644}', '\u{0645}']), - '\u{FDFB}' => Some(&['\u{062C}', '\u{0644}', '\u{0020}', '\u{062C}', '\u{0644}', '\u{0627}', '\u{0644}', '\u{0647}']), - '\u{FDFC}' => Some(&['\u{0631}', '\u{06CC}', '\u{0627}', '\u{0644}']), - '\u{FE10}' => Some(&['\u{002C}']), - '\u{FE11}' => Some(&['\u{3001}']), - '\u{FE12}' => Some(&['\u{3002}']), - '\u{FE13}' => Some(&['\u{003A}']), - '\u{FE14}' => Some(&['\u{003B}']), - '\u{FE15}' => Some(&['\u{0021}']), - '\u{FE16}' => Some(&['\u{003F}']), - '\u{FE17}' => Some(&['\u{3016}']), - '\u{FE18}' => Some(&['\u{3017}']), - '\u{FE19}' => Some(&['\u{002E}', '\u{002E}', '\u{002E}']), - '\u{FE30}' => Some(&['\u{002E}', '\u{002E}']), - '\u{FE31}' => Some(&['\u{2014}']), - '\u{FE32}' => Some(&['\u{2013}']), - '\u{FE33}' => Some(&['\u{005F}']), - '\u{FE34}' => Some(&['\u{005F}']), - '\u{FE35}' => Some(&['\u{0028}']), - '\u{FE36}' => Some(&['\u{0029}']), - '\u{FE37}' => Some(&['\u{007B}']), - '\u{FE38}' => Some(&['\u{007D}']), - '\u{FE39}' => Some(&['\u{3014}']), - '\u{FE3A}' => Some(&['\u{3015}']), - '\u{FE3B}' => Some(&['\u{3010}']), - '\u{FE3C}' => Some(&['\u{3011}']), - '\u{FE3D}' => Some(&['\u{300A}']), - '\u{FE3E}' => Some(&['\u{300B}']), - '\u{FE3F}' => Some(&['\u{3008}']), - '\u{FE40}' => Some(&['\u{3009}']), - '\u{FE41}' => Some(&['\u{300C}']), - '\u{FE42}' => Some(&['\u{300D}']), - '\u{FE43}' => Some(&['\u{300E}']), - '\u{FE44}' => Some(&['\u{300F}']), - '\u{FE47}' => Some(&['\u{005B}']), - '\u{FE48}' => Some(&['\u{005D}']), - '\u{FE49}' => Some(&['\u{0020}', '\u{0305}']), - '\u{FE4A}' => Some(&['\u{0020}', '\u{0305}']), - '\u{FE4B}' => Some(&['\u{0020}', '\u{0305}']), - '\u{FE4C}' => Some(&['\u{0020}', '\u{0305}']), - '\u{FE4D}' => Some(&['\u{005F}']), - '\u{FE4E}' => Some(&['\u{005F}']), - '\u{FE4F}' => Some(&['\u{005F}']), - '\u{FE50}' => Some(&['\u{002C}']), - '\u{FE51}' => Some(&['\u{3001}']), - '\u{FE52}' => Some(&['\u{002E}']), - '\u{FE54}' => Some(&['\u{003B}']), - '\u{FE55}' => Some(&['\u{003A}']), - '\u{FE56}' => Some(&['\u{003F}']), - '\u{FE57}' => Some(&['\u{0021}']), - '\u{FE58}' => Some(&['\u{2014}']), - '\u{FE59}' => Some(&['\u{0028}']), - '\u{FE5A}' => Some(&['\u{0029}']), - '\u{FE5B}' => Some(&['\u{007B}']), - '\u{FE5C}' => Some(&['\u{007D}']), - '\u{FE5D}' => Some(&['\u{3014}']), - '\u{FE5E}' => Some(&['\u{3015}']), - '\u{FE5F}' => Some(&['\u{0023}']), - '\u{FE60}' => Some(&['\u{0026}']), - '\u{FE61}' => Some(&['\u{002A}']), - '\u{FE62}' => Some(&['\u{002B}']), - '\u{FE63}' => Some(&['\u{002D}']), - '\u{FE64}' => Some(&['\u{003C}']), - '\u{FE65}' => Some(&['\u{003E}']), - '\u{FE66}' => Some(&['\u{003D}']), - '\u{FE68}' => Some(&['\u{005C}']), - '\u{FE69}' => Some(&['\u{0024}']), - '\u{FE6A}' => Some(&['\u{0025}']), - '\u{FE6B}' => Some(&['\u{0040}']), - '\u{FE70}' => Some(&['\u{0020}', '\u{064B}']), - '\u{FE71}' => Some(&['\u{0640}', '\u{064B}']), - '\u{FE72}' => Some(&['\u{0020}', '\u{064C}']), - '\u{FE74}' => Some(&['\u{0020}', '\u{064D}']), - '\u{FE76}' => Some(&['\u{0020}', '\u{064E}']), - '\u{FE77}' => Some(&['\u{0640}', '\u{064E}']), - '\u{FE78}' => Some(&['\u{0020}', '\u{064F}']), - '\u{FE79}' => Some(&['\u{0640}', '\u{064F}']), - '\u{FE7A}' => Some(&['\u{0020}', '\u{0650}']), - '\u{FE7B}' => Some(&['\u{0640}', '\u{0650}']), - '\u{FE7C}' => Some(&['\u{0020}', '\u{0651}']), - '\u{FE7D}' => Some(&['\u{0640}', '\u{0651}']), - '\u{FE7E}' => Some(&['\u{0020}', '\u{0652}']), - '\u{FE7F}' => Some(&['\u{0640}', '\u{0652}']), - '\u{FE80}' => Some(&['\u{0621}']), - '\u{FE81}' => Some(&['\u{0627}', '\u{0653}']), - '\u{FE82}' => Some(&['\u{0627}', '\u{0653}']), - '\u{FE83}' => Some(&['\u{0627}', '\u{0654}']), - '\u{FE84}' => Some(&['\u{0627}', '\u{0654}']), - '\u{FE85}' => Some(&['\u{0648}', '\u{0654}']), - '\u{FE86}' => Some(&['\u{0648}', '\u{0654}']), - '\u{FE87}' => Some(&['\u{0627}', '\u{0655}']), - '\u{FE88}' => Some(&['\u{0627}', '\u{0655}']), - '\u{FE89}' => Some(&['\u{064A}', '\u{0654}']), - '\u{FE8A}' => Some(&['\u{064A}', '\u{0654}']), - '\u{FE8B}' => Some(&['\u{064A}', '\u{0654}']), - '\u{FE8C}' => Some(&['\u{064A}', '\u{0654}']), - '\u{FE8D}' => Some(&['\u{0627}']), - '\u{FE8E}' => Some(&['\u{0627}']), - '\u{FE8F}' => Some(&['\u{0628}']), - '\u{FE90}' => Some(&['\u{0628}']), - '\u{FE91}' => Some(&['\u{0628}']), - '\u{FE92}' => Some(&['\u{0628}']), - '\u{FE93}' => Some(&['\u{0629}']), - '\u{FE94}' => Some(&['\u{0629}']), - '\u{FE95}' => Some(&['\u{062A}']), - '\u{FE96}' => Some(&['\u{062A}']), - '\u{FE97}' => Some(&['\u{062A}']), - '\u{FE98}' => Some(&['\u{062A}']), - '\u{FE99}' => Some(&['\u{062B}']), - '\u{FE9A}' => Some(&['\u{062B}']), - '\u{FE9B}' => Some(&['\u{062B}']), - '\u{FE9C}' => Some(&['\u{062B}']), - '\u{FE9D}' => Some(&['\u{062C}']), - '\u{FE9E}' => Some(&['\u{062C}']), - '\u{FE9F}' => Some(&['\u{062C}']), - '\u{FEA0}' => Some(&['\u{062C}']), - '\u{FEA1}' => Some(&['\u{062D}']), - '\u{FEA2}' => Some(&['\u{062D}']), - '\u{FEA3}' => Some(&['\u{062D}']), - '\u{FEA4}' => Some(&['\u{062D}']), - '\u{FEA5}' => Some(&['\u{062E}']), - '\u{FEA6}' => Some(&['\u{062E}']), - '\u{FEA7}' => Some(&['\u{062E}']), - '\u{FEA8}' => Some(&['\u{062E}']), - '\u{FEA9}' => Some(&['\u{062F}']), - '\u{FEAA}' => Some(&['\u{062F}']), - '\u{FEAB}' => Some(&['\u{0630}']), - '\u{FEAC}' => Some(&['\u{0630}']), - '\u{FEAD}' => Some(&['\u{0631}']), - '\u{FEAE}' => Some(&['\u{0631}']), - '\u{FEAF}' => Some(&['\u{0632}']), - '\u{FEB0}' => Some(&['\u{0632}']), - '\u{FEB1}' => Some(&['\u{0633}']), - '\u{FEB2}' => Some(&['\u{0633}']), - '\u{FEB3}' => Some(&['\u{0633}']), - '\u{FEB4}' => Some(&['\u{0633}']), - '\u{FEB5}' => Some(&['\u{0634}']), - '\u{FEB6}' => Some(&['\u{0634}']), - '\u{FEB7}' => Some(&['\u{0634}']), - '\u{FEB8}' => Some(&['\u{0634}']), - '\u{FEB9}' => Some(&['\u{0635}']), - '\u{FEBA}' => Some(&['\u{0635}']), - '\u{FEBB}' => Some(&['\u{0635}']), - '\u{FEBC}' => Some(&['\u{0635}']), - '\u{FEBD}' => Some(&['\u{0636}']), - '\u{FEBE}' => Some(&['\u{0636}']), - '\u{FEBF}' => Some(&['\u{0636}']), - '\u{FEC0}' => Some(&['\u{0636}']), - '\u{FEC1}' => Some(&['\u{0637}']), - '\u{FEC2}' => Some(&['\u{0637}']), - '\u{FEC3}' => Some(&['\u{0637}']), - '\u{FEC4}' => Some(&['\u{0637}']), - '\u{FEC5}' => Some(&['\u{0638}']), - '\u{FEC6}' => Some(&['\u{0638}']), - '\u{FEC7}' => Some(&['\u{0638}']), - '\u{FEC8}' => Some(&['\u{0638}']), - '\u{FEC9}' => Some(&['\u{0639}']), - '\u{FECA}' => Some(&['\u{0639}']), - '\u{FECB}' => Some(&['\u{0639}']), - '\u{FECC}' => Some(&['\u{0639}']), - '\u{FECD}' => Some(&['\u{063A}']), - '\u{FECE}' => Some(&['\u{063A}']), - '\u{FECF}' => Some(&['\u{063A}']), - '\u{FED0}' => Some(&['\u{063A}']), - '\u{FED1}' => Some(&['\u{0641}']), - '\u{FED2}' => Some(&['\u{0641}']), - '\u{FED3}' => Some(&['\u{0641}']), - '\u{FED4}' => Some(&['\u{0641}']), - '\u{FED5}' => Some(&['\u{0642}']), - '\u{FED6}' => Some(&['\u{0642}']), - '\u{FED7}' => Some(&['\u{0642}']), - '\u{FED8}' => Some(&['\u{0642}']), - '\u{FED9}' => Some(&['\u{0643}']), - '\u{FEDA}' => Some(&['\u{0643}']), - '\u{FEDB}' => Some(&['\u{0643}']), - '\u{FEDC}' => Some(&['\u{0643}']), - '\u{FEDD}' => Some(&['\u{0644}']), - '\u{FEDE}' => Some(&['\u{0644}']), - '\u{FEDF}' => Some(&['\u{0644}']), - '\u{FEE0}' => Some(&['\u{0644}']), - '\u{FEE1}' => Some(&['\u{0645}']), - '\u{FEE2}' => Some(&['\u{0645}']), - '\u{FEE3}' => Some(&['\u{0645}']), - '\u{FEE4}' => Some(&['\u{0645}']), - '\u{FEE5}' => Some(&['\u{0646}']), - '\u{FEE6}' => Some(&['\u{0646}']), - '\u{FEE7}' => Some(&['\u{0646}']), - '\u{FEE8}' => Some(&['\u{0646}']), - '\u{FEE9}' => Some(&['\u{0647}']), - '\u{FEEA}' => Some(&['\u{0647}']), - '\u{FEEB}' => Some(&['\u{0647}']), - '\u{FEEC}' => Some(&['\u{0647}']), - '\u{FEED}' => Some(&['\u{0648}']), - '\u{FEEE}' => Some(&['\u{0648}']), - '\u{FEEF}' => Some(&['\u{0649}']), - '\u{FEF0}' => Some(&['\u{0649}']), - '\u{FEF1}' => Some(&['\u{064A}']), - '\u{FEF2}' => Some(&['\u{064A}']), - '\u{FEF3}' => Some(&['\u{064A}']), - '\u{FEF4}' => Some(&['\u{064A}']), - '\u{FEF5}' => Some(&['\u{0644}', '\u{0627}', '\u{0653}']), - '\u{FEF6}' => Some(&['\u{0644}', '\u{0627}', '\u{0653}']), - '\u{FEF7}' => Some(&['\u{0644}', '\u{0627}', '\u{0654}']), - '\u{FEF8}' => Some(&['\u{0644}', '\u{0627}', '\u{0654}']), - '\u{FEF9}' => Some(&['\u{0644}', '\u{0627}', '\u{0655}']), - '\u{FEFA}' => Some(&['\u{0644}', '\u{0627}', '\u{0655}']), - '\u{FEFB}' => Some(&['\u{0644}', '\u{0627}']), - '\u{FEFC}' => Some(&['\u{0644}', '\u{0627}']), - '\u{FF01}' => Some(&['\u{0021}']), - '\u{FF02}' => Some(&['\u{0022}']), - '\u{FF03}' => Some(&['\u{0023}']), - '\u{FF04}' => Some(&['\u{0024}']), - '\u{FF05}' => Some(&['\u{0025}']), - '\u{FF06}' => Some(&['\u{0026}']), - '\u{FF07}' => Some(&['\u{0027}']), - '\u{FF08}' => Some(&['\u{0028}']), - '\u{FF09}' => Some(&['\u{0029}']), - '\u{FF0A}' => Some(&['\u{002A}']), - '\u{FF0B}' => Some(&['\u{002B}']), - '\u{FF0C}' => Some(&['\u{002C}']), - '\u{FF0D}' => Some(&['\u{002D}']), - '\u{FF0E}' => Some(&['\u{002E}']), - '\u{FF0F}' => Some(&['\u{002F}']), - '\u{FF10}' => Some(&['\u{0030}']), - '\u{FF11}' => Some(&['\u{0031}']), - '\u{FF12}' => Some(&['\u{0032}']), - '\u{FF13}' => Some(&['\u{0033}']), - '\u{FF14}' => Some(&['\u{0034}']), - '\u{FF15}' => Some(&['\u{0035}']), - '\u{FF16}' => Some(&['\u{0036}']), - '\u{FF17}' => Some(&['\u{0037}']), - '\u{FF18}' => Some(&['\u{0038}']), - '\u{FF19}' => Some(&['\u{0039}']), - '\u{FF1A}' => Some(&['\u{003A}']), - '\u{FF1B}' => Some(&['\u{003B}']), - '\u{FF1C}' => Some(&['\u{003C}']), - '\u{FF1D}' => Some(&['\u{003D}']), - '\u{FF1E}' => Some(&['\u{003E}']), - '\u{FF1F}' => Some(&['\u{003F}']), - '\u{FF20}' => Some(&['\u{0040}']), - '\u{FF21}' => Some(&['\u{0041}']), - '\u{FF22}' => Some(&['\u{0042}']), - '\u{FF23}' => Some(&['\u{0043}']), - '\u{FF24}' => Some(&['\u{0044}']), - '\u{FF25}' => Some(&['\u{0045}']), - '\u{FF26}' => Some(&['\u{0046}']), - '\u{FF27}' => Some(&['\u{0047}']), - '\u{FF28}' => Some(&['\u{0048}']), - '\u{FF29}' => Some(&['\u{0049}']), - '\u{FF2A}' => Some(&['\u{004A}']), - '\u{FF2B}' => Some(&['\u{004B}']), - '\u{FF2C}' => Some(&['\u{004C}']), - '\u{FF2D}' => Some(&['\u{004D}']), - '\u{FF2E}' => Some(&['\u{004E}']), - '\u{FF2F}' => Some(&['\u{004F}']), - '\u{FF30}' => Some(&['\u{0050}']), - '\u{FF31}' => Some(&['\u{0051}']), - '\u{FF32}' => Some(&['\u{0052}']), - '\u{FF33}' => Some(&['\u{0053}']), - '\u{FF34}' => Some(&['\u{0054}']), - '\u{FF35}' => Some(&['\u{0055}']), - '\u{FF36}' => Some(&['\u{0056}']), - '\u{FF37}' => Some(&['\u{0057}']), - '\u{FF38}' => Some(&['\u{0058}']), - '\u{FF39}' => Some(&['\u{0059}']), - '\u{FF3A}' => Some(&['\u{005A}']), - '\u{FF3B}' => Some(&['\u{005B}']), - '\u{FF3C}' => Some(&['\u{005C}']), - '\u{FF3D}' => Some(&['\u{005D}']), - '\u{FF3E}' => Some(&['\u{005E}']), - '\u{FF3F}' => Some(&['\u{005F}']), - '\u{FF40}' => Some(&['\u{0060}']), - '\u{FF41}' => Some(&['\u{0061}']), - '\u{FF42}' => Some(&['\u{0062}']), - '\u{FF43}' => Some(&['\u{0063}']), - '\u{FF44}' => Some(&['\u{0064}']), - '\u{FF45}' => Some(&['\u{0065}']), - '\u{FF46}' => Some(&['\u{0066}']), - '\u{FF47}' => Some(&['\u{0067}']), - '\u{FF48}' => Some(&['\u{0068}']), - '\u{FF49}' => Some(&['\u{0069}']), - '\u{FF4A}' => Some(&['\u{006A}']), - '\u{FF4B}' => Some(&['\u{006B}']), - '\u{FF4C}' => Some(&['\u{006C}']), - '\u{FF4D}' => Some(&['\u{006D}']), - '\u{FF4E}' => Some(&['\u{006E}']), - '\u{FF4F}' => Some(&['\u{006F}']), - '\u{FF50}' => Some(&['\u{0070}']), - '\u{FF51}' => Some(&['\u{0071}']), - '\u{FF52}' => Some(&['\u{0072}']), - '\u{FF53}' => Some(&['\u{0073}']), - '\u{FF54}' => Some(&['\u{0074}']), - '\u{FF55}' => Some(&['\u{0075}']), - '\u{FF56}' => Some(&['\u{0076}']), - '\u{FF57}' => Some(&['\u{0077}']), - '\u{FF58}' => Some(&['\u{0078}']), - '\u{FF59}' => Some(&['\u{0079}']), - '\u{FF5A}' => Some(&['\u{007A}']), - '\u{FF5B}' => Some(&['\u{007B}']), - '\u{FF5C}' => Some(&['\u{007C}']), - '\u{FF5D}' => Some(&['\u{007D}']), - '\u{FF5E}' => Some(&['\u{007E}']), - '\u{FF5F}' => Some(&['\u{2985}']), - '\u{FF60}' => Some(&['\u{2986}']), - '\u{FF61}' => Some(&['\u{3002}']), - '\u{FF62}' => Some(&['\u{300C}']), - '\u{FF63}' => Some(&['\u{300D}']), - '\u{FF64}' => Some(&['\u{3001}']), - '\u{FF65}' => Some(&['\u{30FB}']), - '\u{FF66}' => Some(&['\u{30F2}']), - '\u{FF67}' => Some(&['\u{30A1}']), - '\u{FF68}' => Some(&['\u{30A3}']), - '\u{FF69}' => Some(&['\u{30A5}']), - '\u{FF6A}' => Some(&['\u{30A7}']), - '\u{FF6B}' => Some(&['\u{30A9}']), - '\u{FF6C}' => Some(&['\u{30E3}']), - '\u{FF6D}' => Some(&['\u{30E5}']), - '\u{FF6E}' => Some(&['\u{30E7}']), - '\u{FF6F}' => Some(&['\u{30C3}']), - '\u{FF70}' => Some(&['\u{30FC}']), - '\u{FF71}' => Some(&['\u{30A2}']), - '\u{FF72}' => Some(&['\u{30A4}']), - '\u{FF73}' => Some(&['\u{30A6}']), - '\u{FF74}' => Some(&['\u{30A8}']), - '\u{FF75}' => Some(&['\u{30AA}']), - '\u{FF76}' => Some(&['\u{30AB}']), - '\u{FF77}' => Some(&['\u{30AD}']), - '\u{FF78}' => Some(&['\u{30AF}']), - '\u{FF79}' => Some(&['\u{30B1}']), - '\u{FF7A}' => Some(&['\u{30B3}']), - '\u{FF7B}' => Some(&['\u{30B5}']), - '\u{FF7C}' => Some(&['\u{30B7}']), - '\u{FF7D}' => Some(&['\u{30B9}']), - '\u{FF7E}' => Some(&['\u{30BB}']), - '\u{FF7F}' => Some(&['\u{30BD}']), - '\u{FF80}' => Some(&['\u{30BF}']), - '\u{FF81}' => Some(&['\u{30C1}']), - '\u{FF82}' => Some(&['\u{30C4}']), - '\u{FF83}' => Some(&['\u{30C6}']), - '\u{FF84}' => Some(&['\u{30C8}']), - '\u{FF85}' => Some(&['\u{30CA}']), - '\u{FF86}' => Some(&['\u{30CB}']), - '\u{FF87}' => Some(&['\u{30CC}']), - '\u{FF88}' => Some(&['\u{30CD}']), - '\u{FF89}' => Some(&['\u{30CE}']), - '\u{FF8A}' => Some(&['\u{30CF}']), - '\u{FF8B}' => Some(&['\u{30D2}']), - '\u{FF8C}' => Some(&['\u{30D5}']), - '\u{FF8D}' => Some(&['\u{30D8}']), - '\u{FF8E}' => Some(&['\u{30DB}']), - '\u{FF8F}' => Some(&['\u{30DE}']), - '\u{FF90}' => Some(&['\u{30DF}']), - '\u{FF91}' => Some(&['\u{30E0}']), - '\u{FF92}' => Some(&['\u{30E1}']), - '\u{FF93}' => Some(&['\u{30E2}']), - '\u{FF94}' => Some(&['\u{30E4}']), - '\u{FF95}' => Some(&['\u{30E6}']), - '\u{FF96}' => Some(&['\u{30E8}']), - '\u{FF97}' => Some(&['\u{30E9}']), - '\u{FF98}' => Some(&['\u{30EA}']), - '\u{FF99}' => Some(&['\u{30EB}']), - '\u{FF9A}' => Some(&['\u{30EC}']), - '\u{FF9B}' => Some(&['\u{30ED}']), - '\u{FF9C}' => Some(&['\u{30EF}']), - '\u{FF9D}' => Some(&['\u{30F3}']), - '\u{FF9E}' => Some(&['\u{3099}']), - '\u{FF9F}' => Some(&['\u{309A}']), - '\u{FFA0}' => Some(&['\u{1160}']), - '\u{FFA1}' => Some(&['\u{1100}']), - '\u{FFA2}' => Some(&['\u{1101}']), - '\u{FFA3}' => Some(&['\u{11AA}']), - '\u{FFA4}' => Some(&['\u{1102}']), - '\u{FFA5}' => Some(&['\u{11AC}']), - '\u{FFA6}' => Some(&['\u{11AD}']), - '\u{FFA7}' => Some(&['\u{1103}']), - '\u{FFA8}' => Some(&['\u{1104}']), - '\u{FFA9}' => Some(&['\u{1105}']), - '\u{FFAA}' => Some(&['\u{11B0}']), - '\u{FFAB}' => Some(&['\u{11B1}']), - '\u{FFAC}' => Some(&['\u{11B2}']), - '\u{FFAD}' => Some(&['\u{11B3}']), - '\u{FFAE}' => Some(&['\u{11B4}']), - '\u{FFAF}' => Some(&['\u{11B5}']), - '\u{FFB0}' => Some(&['\u{111A}']), - '\u{FFB1}' => Some(&['\u{1106}']), - '\u{FFB2}' => Some(&['\u{1107}']), - '\u{FFB3}' => Some(&['\u{1108}']), - '\u{FFB4}' => Some(&['\u{1121}']), - '\u{FFB5}' => Some(&['\u{1109}']), - '\u{FFB6}' => Some(&['\u{110A}']), - '\u{FFB7}' => Some(&['\u{110B}']), - '\u{FFB8}' => Some(&['\u{110C}']), - '\u{FFB9}' => Some(&['\u{110D}']), - '\u{FFBA}' => Some(&['\u{110E}']), - '\u{FFBB}' => Some(&['\u{110F}']), - '\u{FFBC}' => Some(&['\u{1110}']), - '\u{FFBD}' => Some(&['\u{1111}']), - '\u{FFBE}' => Some(&['\u{1112}']), - '\u{FFC2}' => Some(&['\u{1161}']), - '\u{FFC3}' => Some(&['\u{1162}']), - '\u{FFC4}' => Some(&['\u{1163}']), - '\u{FFC5}' => Some(&['\u{1164}']), - '\u{FFC6}' => Some(&['\u{1165}']), - '\u{FFC7}' => Some(&['\u{1166}']), - '\u{FFCA}' => Some(&['\u{1167}']), - '\u{FFCB}' => Some(&['\u{1168}']), - '\u{FFCC}' => Some(&['\u{1169}']), - '\u{FFCD}' => Some(&['\u{116A}']), - '\u{FFCE}' => Some(&['\u{116B}']), - '\u{FFCF}' => Some(&['\u{116C}']), - '\u{FFD2}' => Some(&['\u{116D}']), - '\u{FFD3}' => Some(&['\u{116E}']), - '\u{FFD4}' => Some(&['\u{116F}']), - '\u{FFD5}' => Some(&['\u{1170}']), - '\u{FFD6}' => Some(&['\u{1171}']), - '\u{FFD7}' => Some(&['\u{1172}']), - '\u{FFDA}' => Some(&['\u{1173}']), - '\u{FFDB}' => Some(&['\u{1174}']), - '\u{FFDC}' => Some(&['\u{1175}']), - '\u{FFE0}' => Some(&['\u{00A2}']), - '\u{FFE1}' => Some(&['\u{00A3}']), - '\u{FFE2}' => Some(&['\u{00AC}']), - '\u{FFE3}' => Some(&['\u{0020}', '\u{0304}']), - '\u{FFE4}' => Some(&['\u{00A6}']), - '\u{FFE5}' => Some(&['\u{00A5}']), - '\u{FFE6}' => Some(&['\u{20A9}']), - '\u{FFE8}' => Some(&['\u{2502}']), - '\u{FFE9}' => Some(&['\u{2190}']), - '\u{FFEA}' => Some(&['\u{2191}']), - '\u{FFEB}' => Some(&['\u{2192}']), - '\u{FFEC}' => Some(&['\u{2193}']), - '\u{FFED}' => Some(&['\u{25A0}']), - '\u{FFEE}' => Some(&['\u{25CB}']), - '\u{1D400}' => Some(&['\u{0041}']), - '\u{1D401}' => Some(&['\u{0042}']), - '\u{1D402}' => Some(&['\u{0043}']), - '\u{1D403}' => Some(&['\u{0044}']), - '\u{1D404}' => Some(&['\u{0045}']), - '\u{1D405}' => Some(&['\u{0046}']), - '\u{1D406}' => Some(&['\u{0047}']), - '\u{1D407}' => Some(&['\u{0048}']), - '\u{1D408}' => Some(&['\u{0049}']), - '\u{1D409}' => Some(&['\u{004A}']), - '\u{1D40A}' => Some(&['\u{004B}']), - '\u{1D40B}' => Some(&['\u{004C}']), - '\u{1D40C}' => Some(&['\u{004D}']), - '\u{1D40D}' => Some(&['\u{004E}']), - '\u{1D40E}' => Some(&['\u{004F}']), - '\u{1D40F}' => Some(&['\u{0050}']), - '\u{1D410}' => Some(&['\u{0051}']), - '\u{1D411}' => Some(&['\u{0052}']), - '\u{1D412}' => Some(&['\u{0053}']), - '\u{1D413}' => Some(&['\u{0054}']), - '\u{1D414}' => Some(&['\u{0055}']), - '\u{1D415}' => Some(&['\u{0056}']), - '\u{1D416}' => Some(&['\u{0057}']), - '\u{1D417}' => Some(&['\u{0058}']), - '\u{1D418}' => Some(&['\u{0059}']), - '\u{1D419}' => Some(&['\u{005A}']), - '\u{1D41A}' => Some(&['\u{0061}']), - '\u{1D41B}' => Some(&['\u{0062}']), - '\u{1D41C}' => Some(&['\u{0063}']), - '\u{1D41D}' => Some(&['\u{0064}']), - '\u{1D41E}' => Some(&['\u{0065}']), - '\u{1D41F}' => Some(&['\u{0066}']), - '\u{1D420}' => Some(&['\u{0067}']), - '\u{1D421}' => Some(&['\u{0068}']), - '\u{1D422}' => Some(&['\u{0069}']), - '\u{1D423}' => Some(&['\u{006A}']), - '\u{1D424}' => Some(&['\u{006B}']), - '\u{1D425}' => Some(&['\u{006C}']), - '\u{1D426}' => Some(&['\u{006D}']), - '\u{1D427}' => Some(&['\u{006E}']), - '\u{1D428}' => Some(&['\u{006F}']), - '\u{1D429}' => Some(&['\u{0070}']), - '\u{1D42A}' => Some(&['\u{0071}']), - '\u{1D42B}' => Some(&['\u{0072}']), - '\u{1D42C}' => Some(&['\u{0073}']), - '\u{1D42D}' => Some(&['\u{0074}']), - '\u{1D42E}' => Some(&['\u{0075}']), - '\u{1D42F}' => Some(&['\u{0076}']), - '\u{1D430}' => Some(&['\u{0077}']), - '\u{1D431}' => Some(&['\u{0078}']), - '\u{1D432}' => Some(&['\u{0079}']), - '\u{1D433}' => Some(&['\u{007A}']), - '\u{1D434}' => Some(&['\u{0041}']), - '\u{1D435}' => Some(&['\u{0042}']), - '\u{1D436}' => Some(&['\u{0043}']), - '\u{1D437}' => Some(&['\u{0044}']), - '\u{1D438}' => Some(&['\u{0045}']), - '\u{1D439}' => Some(&['\u{0046}']), - '\u{1D43A}' => Some(&['\u{0047}']), - '\u{1D43B}' => Some(&['\u{0048}']), - '\u{1D43C}' => Some(&['\u{0049}']), - '\u{1D43D}' => Some(&['\u{004A}']), - '\u{1D43E}' => Some(&['\u{004B}']), - '\u{1D43F}' => Some(&['\u{004C}']), - '\u{1D440}' => Some(&['\u{004D}']), - '\u{1D441}' => Some(&['\u{004E}']), - '\u{1D442}' => Some(&['\u{004F}']), - '\u{1D443}' => Some(&['\u{0050}']), - '\u{1D444}' => Some(&['\u{0051}']), - '\u{1D445}' => Some(&['\u{0052}']), - '\u{1D446}' => Some(&['\u{0053}']), - '\u{1D447}' => Some(&['\u{0054}']), - '\u{1D448}' => Some(&['\u{0055}']), - '\u{1D449}' => Some(&['\u{0056}']), - '\u{1D44A}' => Some(&['\u{0057}']), - '\u{1D44B}' => Some(&['\u{0058}']), - '\u{1D44C}' => Some(&['\u{0059}']), - '\u{1D44D}' => Some(&['\u{005A}']), - '\u{1D44E}' => Some(&['\u{0061}']), - '\u{1D44F}' => Some(&['\u{0062}']), - '\u{1D450}' => Some(&['\u{0063}']), - '\u{1D451}' => Some(&['\u{0064}']), - '\u{1D452}' => Some(&['\u{0065}']), - '\u{1D453}' => Some(&['\u{0066}']), - '\u{1D454}' => Some(&['\u{0067}']), - '\u{1D456}' => Some(&['\u{0069}']), - '\u{1D457}' => Some(&['\u{006A}']), - '\u{1D458}' => Some(&['\u{006B}']), - '\u{1D459}' => Some(&['\u{006C}']), - '\u{1D45A}' => Some(&['\u{006D}']), - '\u{1D45B}' => Some(&['\u{006E}']), - '\u{1D45C}' => Some(&['\u{006F}']), - '\u{1D45D}' => Some(&['\u{0070}']), - '\u{1D45E}' => Some(&['\u{0071}']), - '\u{1D45F}' => Some(&['\u{0072}']), - '\u{1D460}' => Some(&['\u{0073}']), - '\u{1D461}' => Some(&['\u{0074}']), - '\u{1D462}' => Some(&['\u{0075}']), - '\u{1D463}' => Some(&['\u{0076}']), - '\u{1D464}' => Some(&['\u{0077}']), - '\u{1D465}' => Some(&['\u{0078}']), - '\u{1D466}' => Some(&['\u{0079}']), - '\u{1D467}' => Some(&['\u{007A}']), - '\u{1D468}' => Some(&['\u{0041}']), - '\u{1D469}' => Some(&['\u{0042}']), - '\u{1D46A}' => Some(&['\u{0043}']), - '\u{1D46B}' => Some(&['\u{0044}']), - '\u{1D46C}' => Some(&['\u{0045}']), - '\u{1D46D}' => Some(&['\u{0046}']), - '\u{1D46E}' => Some(&['\u{0047}']), - '\u{1D46F}' => Some(&['\u{0048}']), - '\u{1D470}' => Some(&['\u{0049}']), - '\u{1D471}' => Some(&['\u{004A}']), - '\u{1D472}' => Some(&['\u{004B}']), - '\u{1D473}' => Some(&['\u{004C}']), - '\u{1D474}' => Some(&['\u{004D}']), - '\u{1D475}' => Some(&['\u{004E}']), - '\u{1D476}' => Some(&['\u{004F}']), - '\u{1D477}' => Some(&['\u{0050}']), - '\u{1D478}' => Some(&['\u{0051}']), - '\u{1D479}' => Some(&['\u{0052}']), - '\u{1D47A}' => Some(&['\u{0053}']), - '\u{1D47B}' => Some(&['\u{0054}']), - '\u{1D47C}' => Some(&['\u{0055}']), - '\u{1D47D}' => Some(&['\u{0056}']), - '\u{1D47E}' => Some(&['\u{0057}']), - '\u{1D47F}' => Some(&['\u{0058}']), - '\u{1D480}' => Some(&['\u{0059}']), - '\u{1D481}' => Some(&['\u{005A}']), - '\u{1D482}' => Some(&['\u{0061}']), - '\u{1D483}' => Some(&['\u{0062}']), - '\u{1D484}' => Some(&['\u{0063}']), - '\u{1D485}' => Some(&['\u{0064}']), - '\u{1D486}' => Some(&['\u{0065}']), - '\u{1D487}' => Some(&['\u{0066}']), - '\u{1D488}' => Some(&['\u{0067}']), - '\u{1D489}' => Some(&['\u{0068}']), - '\u{1D48A}' => Some(&['\u{0069}']), - '\u{1D48B}' => Some(&['\u{006A}']), - '\u{1D48C}' => Some(&['\u{006B}']), - '\u{1D48D}' => Some(&['\u{006C}']), - '\u{1D48E}' => Some(&['\u{006D}']), - '\u{1D48F}' => Some(&['\u{006E}']), - '\u{1D490}' => Some(&['\u{006F}']), - '\u{1D491}' => Some(&['\u{0070}']), - '\u{1D492}' => Some(&['\u{0071}']), - '\u{1D493}' => Some(&['\u{0072}']), - '\u{1D494}' => Some(&['\u{0073}']), - '\u{1D495}' => Some(&['\u{0074}']), - '\u{1D496}' => Some(&['\u{0075}']), - '\u{1D497}' => Some(&['\u{0076}']), - '\u{1D498}' => Some(&['\u{0077}']), - '\u{1D499}' => Some(&['\u{0078}']), - '\u{1D49A}' => Some(&['\u{0079}']), - '\u{1D49B}' => Some(&['\u{007A}']), - '\u{1D49C}' => Some(&['\u{0041}']), - '\u{1D49E}' => Some(&['\u{0043}']), - '\u{1D49F}' => Some(&['\u{0044}']), - '\u{1D4A2}' => Some(&['\u{0047}']), - '\u{1D4A5}' => Some(&['\u{004A}']), - '\u{1D4A6}' => Some(&['\u{004B}']), - '\u{1D4A9}' => Some(&['\u{004E}']), - '\u{1D4AA}' => Some(&['\u{004F}']), - '\u{1D4AB}' => Some(&['\u{0050}']), - '\u{1D4AC}' => Some(&['\u{0051}']), - '\u{1D4AE}' => Some(&['\u{0053}']), - '\u{1D4AF}' => Some(&['\u{0054}']), - '\u{1D4B0}' => Some(&['\u{0055}']), - '\u{1D4B1}' => Some(&['\u{0056}']), - '\u{1D4B2}' => Some(&['\u{0057}']), - '\u{1D4B3}' => Some(&['\u{0058}']), - '\u{1D4B4}' => Some(&['\u{0059}']), - '\u{1D4B5}' => Some(&['\u{005A}']), - '\u{1D4B6}' => Some(&['\u{0061}']), - '\u{1D4B7}' => Some(&['\u{0062}']), - '\u{1D4B8}' => Some(&['\u{0063}']), - '\u{1D4B9}' => Some(&['\u{0064}']), - '\u{1D4BB}' => Some(&['\u{0066}']), - '\u{1D4BD}' => Some(&['\u{0068}']), - '\u{1D4BE}' => Some(&['\u{0069}']), - '\u{1D4BF}' => Some(&['\u{006A}']), - '\u{1D4C0}' => Some(&['\u{006B}']), - '\u{1D4C1}' => Some(&['\u{006C}']), - '\u{1D4C2}' => Some(&['\u{006D}']), - '\u{1D4C3}' => Some(&['\u{006E}']), - '\u{1D4C5}' => Some(&['\u{0070}']), - '\u{1D4C6}' => Some(&['\u{0071}']), - '\u{1D4C7}' => Some(&['\u{0072}']), - '\u{1D4C8}' => Some(&['\u{0073}']), - '\u{1D4C9}' => Some(&['\u{0074}']), - '\u{1D4CA}' => Some(&['\u{0075}']), - '\u{1D4CB}' => Some(&['\u{0076}']), - '\u{1D4CC}' => Some(&['\u{0077}']), - '\u{1D4CD}' => Some(&['\u{0078}']), - '\u{1D4CE}' => Some(&['\u{0079}']), - '\u{1D4CF}' => Some(&['\u{007A}']), - '\u{1D4D0}' => Some(&['\u{0041}']), - '\u{1D4D1}' => Some(&['\u{0042}']), - '\u{1D4D2}' => Some(&['\u{0043}']), - '\u{1D4D3}' => Some(&['\u{0044}']), - '\u{1D4D4}' => Some(&['\u{0045}']), - '\u{1D4D5}' => Some(&['\u{0046}']), - '\u{1D4D6}' => Some(&['\u{0047}']), - '\u{1D4D7}' => Some(&['\u{0048}']), - '\u{1D4D8}' => Some(&['\u{0049}']), - '\u{1D4D9}' => Some(&['\u{004A}']), - '\u{1D4DA}' => Some(&['\u{004B}']), - '\u{1D4DB}' => Some(&['\u{004C}']), - '\u{1D4DC}' => Some(&['\u{004D}']), - '\u{1D4DD}' => Some(&['\u{004E}']), - '\u{1D4DE}' => Some(&['\u{004F}']), - '\u{1D4DF}' => Some(&['\u{0050}']), - '\u{1D4E0}' => Some(&['\u{0051}']), - '\u{1D4E1}' => Some(&['\u{0052}']), - '\u{1D4E2}' => Some(&['\u{0053}']), - '\u{1D4E3}' => Some(&['\u{0054}']), - '\u{1D4E4}' => Some(&['\u{0055}']), - '\u{1D4E5}' => Some(&['\u{0056}']), - '\u{1D4E6}' => Some(&['\u{0057}']), - '\u{1D4E7}' => Some(&['\u{0058}']), - '\u{1D4E8}' => Some(&['\u{0059}']), - '\u{1D4E9}' => Some(&['\u{005A}']), - '\u{1D4EA}' => Some(&['\u{0061}']), - '\u{1D4EB}' => Some(&['\u{0062}']), - '\u{1D4EC}' => Some(&['\u{0063}']), - '\u{1D4ED}' => Some(&['\u{0064}']), - '\u{1D4EE}' => Some(&['\u{0065}']), - '\u{1D4EF}' => Some(&['\u{0066}']), - '\u{1D4F0}' => Some(&['\u{0067}']), - '\u{1D4F1}' => Some(&['\u{0068}']), - '\u{1D4F2}' => Some(&['\u{0069}']), - '\u{1D4F3}' => Some(&['\u{006A}']), - '\u{1D4F4}' => Some(&['\u{006B}']), - '\u{1D4F5}' => Some(&['\u{006C}']), - '\u{1D4F6}' => Some(&['\u{006D}']), - '\u{1D4F7}' => Some(&['\u{006E}']), - '\u{1D4F8}' => Some(&['\u{006F}']), - '\u{1D4F9}' => Some(&['\u{0070}']), - '\u{1D4FA}' => Some(&['\u{0071}']), - '\u{1D4FB}' => Some(&['\u{0072}']), - '\u{1D4FC}' => Some(&['\u{0073}']), - '\u{1D4FD}' => Some(&['\u{0074}']), - '\u{1D4FE}' => Some(&['\u{0075}']), - '\u{1D4FF}' => Some(&['\u{0076}']), - '\u{1D500}' => Some(&['\u{0077}']), - '\u{1D501}' => Some(&['\u{0078}']), - '\u{1D502}' => Some(&['\u{0079}']), - '\u{1D503}' => Some(&['\u{007A}']), - '\u{1D504}' => Some(&['\u{0041}']), - '\u{1D505}' => Some(&['\u{0042}']), - '\u{1D507}' => Some(&['\u{0044}']), - '\u{1D508}' => Some(&['\u{0045}']), - '\u{1D509}' => Some(&['\u{0046}']), - '\u{1D50A}' => Some(&['\u{0047}']), - '\u{1D50D}' => Some(&['\u{004A}']), - '\u{1D50E}' => Some(&['\u{004B}']), - '\u{1D50F}' => Some(&['\u{004C}']), - '\u{1D510}' => Some(&['\u{004D}']), - '\u{1D511}' => Some(&['\u{004E}']), - '\u{1D512}' => Some(&['\u{004F}']), - '\u{1D513}' => Some(&['\u{0050}']), - '\u{1D514}' => Some(&['\u{0051}']), - '\u{1D516}' => Some(&['\u{0053}']), - '\u{1D517}' => Some(&['\u{0054}']), - '\u{1D518}' => Some(&['\u{0055}']), - '\u{1D519}' => Some(&['\u{0056}']), - '\u{1D51A}' => Some(&['\u{0057}']), - '\u{1D51B}' => Some(&['\u{0058}']), - '\u{1D51C}' => Some(&['\u{0059}']), - '\u{1D51E}' => Some(&['\u{0061}']), - '\u{1D51F}' => Some(&['\u{0062}']), - '\u{1D520}' => Some(&['\u{0063}']), - '\u{1D521}' => Some(&['\u{0064}']), - '\u{1D522}' => Some(&['\u{0065}']), - '\u{1D523}' => Some(&['\u{0066}']), - '\u{1D524}' => Some(&['\u{0067}']), - '\u{1D525}' => Some(&['\u{0068}']), - '\u{1D526}' => Some(&['\u{0069}']), - '\u{1D527}' => Some(&['\u{006A}']), - '\u{1D528}' => Some(&['\u{006B}']), - '\u{1D529}' => Some(&['\u{006C}']), - '\u{1D52A}' => Some(&['\u{006D}']), - '\u{1D52B}' => Some(&['\u{006E}']), - '\u{1D52C}' => Some(&['\u{006F}']), - '\u{1D52D}' => Some(&['\u{0070}']), - '\u{1D52E}' => Some(&['\u{0071}']), - '\u{1D52F}' => Some(&['\u{0072}']), - '\u{1D530}' => Some(&['\u{0073}']), - '\u{1D531}' => Some(&['\u{0074}']), - '\u{1D532}' => Some(&['\u{0075}']), - '\u{1D533}' => Some(&['\u{0076}']), - '\u{1D534}' => Some(&['\u{0077}']), - '\u{1D535}' => Some(&['\u{0078}']), - '\u{1D536}' => Some(&['\u{0079}']), - '\u{1D537}' => Some(&['\u{007A}']), - '\u{1D538}' => Some(&['\u{0041}']), - '\u{1D539}' => Some(&['\u{0042}']), - '\u{1D53B}' => Some(&['\u{0044}']), - '\u{1D53C}' => Some(&['\u{0045}']), - '\u{1D53D}' => Some(&['\u{0046}']), - '\u{1D53E}' => Some(&['\u{0047}']), - '\u{1D540}' => Some(&['\u{0049}']), - '\u{1D541}' => Some(&['\u{004A}']), - '\u{1D542}' => Some(&['\u{004B}']), - '\u{1D543}' => Some(&['\u{004C}']), - '\u{1D544}' => Some(&['\u{004D}']), - '\u{1D546}' => Some(&['\u{004F}']), - '\u{1D54A}' => Some(&['\u{0053}']), - '\u{1D54B}' => Some(&['\u{0054}']), - '\u{1D54C}' => Some(&['\u{0055}']), - '\u{1D54D}' => Some(&['\u{0056}']), - '\u{1D54E}' => Some(&['\u{0057}']), - '\u{1D54F}' => Some(&['\u{0058}']), - '\u{1D550}' => Some(&['\u{0059}']), - '\u{1D552}' => Some(&['\u{0061}']), - '\u{1D553}' => Some(&['\u{0062}']), - '\u{1D554}' => Some(&['\u{0063}']), - '\u{1D555}' => Some(&['\u{0064}']), - '\u{1D556}' => Some(&['\u{0065}']), - '\u{1D557}' => Some(&['\u{0066}']), - '\u{1D558}' => Some(&['\u{0067}']), - '\u{1D559}' => Some(&['\u{0068}']), - '\u{1D55A}' => Some(&['\u{0069}']), - '\u{1D55B}' => Some(&['\u{006A}']), - '\u{1D55C}' => Some(&['\u{006B}']), - '\u{1D55D}' => Some(&['\u{006C}']), - '\u{1D55E}' => Some(&['\u{006D}']), - '\u{1D55F}' => Some(&['\u{006E}']), - '\u{1D560}' => Some(&['\u{006F}']), - '\u{1D561}' => Some(&['\u{0070}']), - '\u{1D562}' => Some(&['\u{0071}']), - '\u{1D563}' => Some(&['\u{0072}']), - '\u{1D564}' => Some(&['\u{0073}']), - '\u{1D565}' => Some(&['\u{0074}']), - '\u{1D566}' => Some(&['\u{0075}']), - '\u{1D567}' => Some(&['\u{0076}']), - '\u{1D568}' => Some(&['\u{0077}']), - '\u{1D569}' => Some(&['\u{0078}']), - '\u{1D56A}' => Some(&['\u{0079}']), - '\u{1D56B}' => Some(&['\u{007A}']), - '\u{1D56C}' => Some(&['\u{0041}']), - '\u{1D56D}' => Some(&['\u{0042}']), - '\u{1D56E}' => Some(&['\u{0043}']), - '\u{1D56F}' => Some(&['\u{0044}']), - '\u{1D570}' => Some(&['\u{0045}']), - '\u{1D571}' => Some(&['\u{0046}']), - '\u{1D572}' => Some(&['\u{0047}']), - '\u{1D573}' => Some(&['\u{0048}']), - '\u{1D574}' => Some(&['\u{0049}']), - '\u{1D575}' => Some(&['\u{004A}']), - '\u{1D576}' => Some(&['\u{004B}']), - '\u{1D577}' => Some(&['\u{004C}']), - '\u{1D578}' => Some(&['\u{004D}']), - '\u{1D579}' => Some(&['\u{004E}']), - '\u{1D57A}' => Some(&['\u{004F}']), - '\u{1D57B}' => Some(&['\u{0050}']), - '\u{1D57C}' => Some(&['\u{0051}']), - '\u{1D57D}' => Some(&['\u{0052}']), - '\u{1D57E}' => Some(&['\u{0053}']), - '\u{1D57F}' => Some(&['\u{0054}']), - '\u{1D580}' => Some(&['\u{0055}']), - '\u{1D581}' => Some(&['\u{0056}']), - '\u{1D582}' => Some(&['\u{0057}']), - '\u{1D583}' => Some(&['\u{0058}']), - '\u{1D584}' => Some(&['\u{0059}']), - '\u{1D585}' => Some(&['\u{005A}']), - '\u{1D586}' => Some(&['\u{0061}']), - '\u{1D587}' => Some(&['\u{0062}']), - '\u{1D588}' => Some(&['\u{0063}']), - '\u{1D589}' => Some(&['\u{0064}']), - '\u{1D58A}' => Some(&['\u{0065}']), - '\u{1D58B}' => Some(&['\u{0066}']), - '\u{1D58C}' => Some(&['\u{0067}']), - '\u{1D58D}' => Some(&['\u{0068}']), - '\u{1D58E}' => Some(&['\u{0069}']), - '\u{1D58F}' => Some(&['\u{006A}']), - '\u{1D590}' => Some(&['\u{006B}']), - '\u{1D591}' => Some(&['\u{006C}']), - '\u{1D592}' => Some(&['\u{006D}']), - '\u{1D593}' => Some(&['\u{006E}']), - '\u{1D594}' => Some(&['\u{006F}']), - '\u{1D595}' => Some(&['\u{0070}']), - '\u{1D596}' => Some(&['\u{0071}']), - '\u{1D597}' => Some(&['\u{0072}']), - '\u{1D598}' => Some(&['\u{0073}']), - '\u{1D599}' => Some(&['\u{0074}']), - '\u{1D59A}' => Some(&['\u{0075}']), - '\u{1D59B}' => Some(&['\u{0076}']), - '\u{1D59C}' => Some(&['\u{0077}']), - '\u{1D59D}' => Some(&['\u{0078}']), - '\u{1D59E}' => Some(&['\u{0079}']), - '\u{1D59F}' => Some(&['\u{007A}']), - '\u{1D5A0}' => Some(&['\u{0041}']), - '\u{1D5A1}' => Some(&['\u{0042}']), - '\u{1D5A2}' => Some(&['\u{0043}']), - '\u{1D5A3}' => Some(&['\u{0044}']), - '\u{1D5A4}' => Some(&['\u{0045}']), - '\u{1D5A5}' => Some(&['\u{0046}']), - '\u{1D5A6}' => Some(&['\u{0047}']), - '\u{1D5A7}' => Some(&['\u{0048}']), - '\u{1D5A8}' => Some(&['\u{0049}']), - '\u{1D5A9}' => Some(&['\u{004A}']), - '\u{1D5AA}' => Some(&['\u{004B}']), - '\u{1D5AB}' => Some(&['\u{004C}']), - '\u{1D5AC}' => Some(&['\u{004D}']), - '\u{1D5AD}' => Some(&['\u{004E}']), - '\u{1D5AE}' => Some(&['\u{004F}']), - '\u{1D5AF}' => Some(&['\u{0050}']), - '\u{1D5B0}' => Some(&['\u{0051}']), - '\u{1D5B1}' => Some(&['\u{0052}']), - '\u{1D5B2}' => Some(&['\u{0053}']), - '\u{1D5B3}' => Some(&['\u{0054}']), - '\u{1D5B4}' => Some(&['\u{0055}']), - '\u{1D5B5}' => Some(&['\u{0056}']), - '\u{1D5B6}' => Some(&['\u{0057}']), - '\u{1D5B7}' => Some(&['\u{0058}']), - '\u{1D5B8}' => Some(&['\u{0059}']), - '\u{1D5B9}' => Some(&['\u{005A}']), - '\u{1D5BA}' => Some(&['\u{0061}']), - '\u{1D5BB}' => Some(&['\u{0062}']), - '\u{1D5BC}' => Some(&['\u{0063}']), - '\u{1D5BD}' => Some(&['\u{0064}']), - '\u{1D5BE}' => Some(&['\u{0065}']), - '\u{1D5BF}' => Some(&['\u{0066}']), - '\u{1D5C0}' => Some(&['\u{0067}']), - '\u{1D5C1}' => Some(&['\u{0068}']), - '\u{1D5C2}' => Some(&['\u{0069}']), - '\u{1D5C3}' => Some(&['\u{006A}']), - '\u{1D5C4}' => Some(&['\u{006B}']), - '\u{1D5C5}' => Some(&['\u{006C}']), - '\u{1D5C6}' => Some(&['\u{006D}']), - '\u{1D5C7}' => Some(&['\u{006E}']), - '\u{1D5C8}' => Some(&['\u{006F}']), - '\u{1D5C9}' => Some(&['\u{0070}']), - '\u{1D5CA}' => Some(&['\u{0071}']), - '\u{1D5CB}' => Some(&['\u{0072}']), - '\u{1D5CC}' => Some(&['\u{0073}']), - '\u{1D5CD}' => Some(&['\u{0074}']), - '\u{1D5CE}' => Some(&['\u{0075}']), - '\u{1D5CF}' => Some(&['\u{0076}']), - '\u{1D5D0}' => Some(&['\u{0077}']), - '\u{1D5D1}' => Some(&['\u{0078}']), - '\u{1D5D2}' => Some(&['\u{0079}']), - '\u{1D5D3}' => Some(&['\u{007A}']), - '\u{1D5D4}' => Some(&['\u{0041}']), - '\u{1D5D5}' => Some(&['\u{0042}']), - '\u{1D5D6}' => Some(&['\u{0043}']), - '\u{1D5D7}' => Some(&['\u{0044}']), - '\u{1D5D8}' => Some(&['\u{0045}']), - '\u{1D5D9}' => Some(&['\u{0046}']), - '\u{1D5DA}' => Some(&['\u{0047}']), - '\u{1D5DB}' => Some(&['\u{0048}']), - '\u{1D5DC}' => Some(&['\u{0049}']), - '\u{1D5DD}' => Some(&['\u{004A}']), - '\u{1D5DE}' => Some(&['\u{004B}']), - '\u{1D5DF}' => Some(&['\u{004C}']), - '\u{1D5E0}' => Some(&['\u{004D}']), - '\u{1D5E1}' => Some(&['\u{004E}']), - '\u{1D5E2}' => Some(&['\u{004F}']), - '\u{1D5E3}' => Some(&['\u{0050}']), - '\u{1D5E4}' => Some(&['\u{0051}']), - '\u{1D5E5}' => Some(&['\u{0052}']), - '\u{1D5E6}' => Some(&['\u{0053}']), - '\u{1D5E7}' => Some(&['\u{0054}']), - '\u{1D5E8}' => Some(&['\u{0055}']), - '\u{1D5E9}' => Some(&['\u{0056}']), - '\u{1D5EA}' => Some(&['\u{0057}']), - '\u{1D5EB}' => Some(&['\u{0058}']), - '\u{1D5EC}' => Some(&['\u{0059}']), - '\u{1D5ED}' => Some(&['\u{005A}']), - '\u{1D5EE}' => Some(&['\u{0061}']), - '\u{1D5EF}' => Some(&['\u{0062}']), - '\u{1D5F0}' => Some(&['\u{0063}']), - '\u{1D5F1}' => Some(&['\u{0064}']), - '\u{1D5F2}' => Some(&['\u{0065}']), - '\u{1D5F3}' => Some(&['\u{0066}']), - '\u{1D5F4}' => Some(&['\u{0067}']), - '\u{1D5F5}' => Some(&['\u{0068}']), - '\u{1D5F6}' => Some(&['\u{0069}']), - '\u{1D5F7}' => Some(&['\u{006A}']), - '\u{1D5F8}' => Some(&['\u{006B}']), - '\u{1D5F9}' => Some(&['\u{006C}']), - '\u{1D5FA}' => Some(&['\u{006D}']), - '\u{1D5FB}' => Some(&['\u{006E}']), - '\u{1D5FC}' => Some(&['\u{006F}']), - '\u{1D5FD}' => Some(&['\u{0070}']), - '\u{1D5FE}' => Some(&['\u{0071}']), - '\u{1D5FF}' => Some(&['\u{0072}']), - '\u{1D600}' => Some(&['\u{0073}']), - '\u{1D601}' => Some(&['\u{0074}']), - '\u{1D602}' => Some(&['\u{0075}']), - '\u{1D603}' => Some(&['\u{0076}']), - '\u{1D604}' => Some(&['\u{0077}']), - '\u{1D605}' => Some(&['\u{0078}']), - '\u{1D606}' => Some(&['\u{0079}']), - '\u{1D607}' => Some(&['\u{007A}']), - '\u{1D608}' => Some(&['\u{0041}']), - '\u{1D609}' => Some(&['\u{0042}']), - '\u{1D60A}' => Some(&['\u{0043}']), - '\u{1D60B}' => Some(&['\u{0044}']), - '\u{1D60C}' => Some(&['\u{0045}']), - '\u{1D60D}' => Some(&['\u{0046}']), - '\u{1D60E}' => Some(&['\u{0047}']), - '\u{1D60F}' => Some(&['\u{0048}']), - '\u{1D610}' => Some(&['\u{0049}']), - '\u{1D611}' => Some(&['\u{004A}']), - '\u{1D612}' => Some(&['\u{004B}']), - '\u{1D613}' => Some(&['\u{004C}']), - '\u{1D614}' => Some(&['\u{004D}']), - '\u{1D615}' => Some(&['\u{004E}']), - '\u{1D616}' => Some(&['\u{004F}']), - '\u{1D617}' => Some(&['\u{0050}']), - '\u{1D618}' => Some(&['\u{0051}']), - '\u{1D619}' => Some(&['\u{0052}']), - '\u{1D61A}' => Some(&['\u{0053}']), - '\u{1D61B}' => Some(&['\u{0054}']), - '\u{1D61C}' => Some(&['\u{0055}']), - '\u{1D61D}' => Some(&['\u{0056}']), - '\u{1D61E}' => Some(&['\u{0057}']), - '\u{1D61F}' => Some(&['\u{0058}']), - '\u{1D620}' => Some(&['\u{0059}']), - '\u{1D621}' => Some(&['\u{005A}']), - '\u{1D622}' => Some(&['\u{0061}']), - '\u{1D623}' => Some(&['\u{0062}']), - '\u{1D624}' => Some(&['\u{0063}']), - '\u{1D625}' => Some(&['\u{0064}']), - '\u{1D626}' => Some(&['\u{0065}']), - '\u{1D627}' => Some(&['\u{0066}']), - '\u{1D628}' => Some(&['\u{0067}']), - '\u{1D629}' => Some(&['\u{0068}']), - '\u{1D62A}' => Some(&['\u{0069}']), - '\u{1D62B}' => Some(&['\u{006A}']), - '\u{1D62C}' => Some(&['\u{006B}']), - '\u{1D62D}' => Some(&['\u{006C}']), - '\u{1D62E}' => Some(&['\u{006D}']), - '\u{1D62F}' => Some(&['\u{006E}']), - '\u{1D630}' => Some(&['\u{006F}']), - '\u{1D631}' => Some(&['\u{0070}']), - '\u{1D632}' => Some(&['\u{0071}']), - '\u{1D633}' => Some(&['\u{0072}']), - '\u{1D634}' => Some(&['\u{0073}']), - '\u{1D635}' => Some(&['\u{0074}']), - '\u{1D636}' => Some(&['\u{0075}']), - '\u{1D637}' => Some(&['\u{0076}']), - '\u{1D638}' => Some(&['\u{0077}']), - '\u{1D639}' => Some(&['\u{0078}']), - '\u{1D63A}' => Some(&['\u{0079}']), - '\u{1D63B}' => Some(&['\u{007A}']), - '\u{1D63C}' => Some(&['\u{0041}']), - '\u{1D63D}' => Some(&['\u{0042}']), - '\u{1D63E}' => Some(&['\u{0043}']), - '\u{1D63F}' => Some(&['\u{0044}']), - '\u{1D640}' => Some(&['\u{0045}']), - '\u{1D641}' => Some(&['\u{0046}']), - '\u{1D642}' => Some(&['\u{0047}']), - '\u{1D643}' => Some(&['\u{0048}']), - '\u{1D644}' => Some(&['\u{0049}']), - '\u{1D645}' => Some(&['\u{004A}']), - '\u{1D646}' => Some(&['\u{004B}']), - '\u{1D647}' => Some(&['\u{004C}']), - '\u{1D648}' => Some(&['\u{004D}']), - '\u{1D649}' => Some(&['\u{004E}']), - '\u{1D64A}' => Some(&['\u{004F}']), - '\u{1D64B}' => Some(&['\u{0050}']), - '\u{1D64C}' => Some(&['\u{0051}']), - '\u{1D64D}' => Some(&['\u{0052}']), - '\u{1D64E}' => Some(&['\u{0053}']), - '\u{1D64F}' => Some(&['\u{0054}']), - '\u{1D650}' => Some(&['\u{0055}']), - '\u{1D651}' => Some(&['\u{0056}']), - '\u{1D652}' => Some(&['\u{0057}']), - '\u{1D653}' => Some(&['\u{0058}']), - '\u{1D654}' => Some(&['\u{0059}']), - '\u{1D655}' => Some(&['\u{005A}']), - '\u{1D656}' => Some(&['\u{0061}']), - '\u{1D657}' => Some(&['\u{0062}']), - '\u{1D658}' => Some(&['\u{0063}']), - '\u{1D659}' => Some(&['\u{0064}']), - '\u{1D65A}' => Some(&['\u{0065}']), - '\u{1D65B}' => Some(&['\u{0066}']), - '\u{1D65C}' => Some(&['\u{0067}']), - '\u{1D65D}' => Some(&['\u{0068}']), - '\u{1D65E}' => Some(&['\u{0069}']), - '\u{1D65F}' => Some(&['\u{006A}']), - '\u{1D660}' => Some(&['\u{006B}']), - '\u{1D661}' => Some(&['\u{006C}']), - '\u{1D662}' => Some(&['\u{006D}']), - '\u{1D663}' => Some(&['\u{006E}']), - '\u{1D664}' => Some(&['\u{006F}']), - '\u{1D665}' => Some(&['\u{0070}']), - '\u{1D666}' => Some(&['\u{0071}']), - '\u{1D667}' => Some(&['\u{0072}']), - '\u{1D668}' => Some(&['\u{0073}']), - '\u{1D669}' => Some(&['\u{0074}']), - '\u{1D66A}' => Some(&['\u{0075}']), - '\u{1D66B}' => Some(&['\u{0076}']), - '\u{1D66C}' => Some(&['\u{0077}']), - '\u{1D66D}' => Some(&['\u{0078}']), - '\u{1D66E}' => Some(&['\u{0079}']), - '\u{1D66F}' => Some(&['\u{007A}']), - '\u{1D670}' => Some(&['\u{0041}']), - '\u{1D671}' => Some(&['\u{0042}']), - '\u{1D672}' => Some(&['\u{0043}']), - '\u{1D673}' => Some(&['\u{0044}']), - '\u{1D674}' => Some(&['\u{0045}']), - '\u{1D675}' => Some(&['\u{0046}']), - '\u{1D676}' => Some(&['\u{0047}']), - '\u{1D677}' => Some(&['\u{0048}']), - '\u{1D678}' => Some(&['\u{0049}']), - '\u{1D679}' => Some(&['\u{004A}']), - '\u{1D67A}' => Some(&['\u{004B}']), - '\u{1D67B}' => Some(&['\u{004C}']), - '\u{1D67C}' => Some(&['\u{004D}']), - '\u{1D67D}' => Some(&['\u{004E}']), - '\u{1D67E}' => Some(&['\u{004F}']), - '\u{1D67F}' => Some(&['\u{0050}']), - '\u{1D680}' => Some(&['\u{0051}']), - '\u{1D681}' => Some(&['\u{0052}']), - '\u{1D682}' => Some(&['\u{0053}']), - '\u{1D683}' => Some(&['\u{0054}']), - '\u{1D684}' => Some(&['\u{0055}']), - '\u{1D685}' => Some(&['\u{0056}']), - '\u{1D686}' => Some(&['\u{0057}']), - '\u{1D687}' => Some(&['\u{0058}']), - '\u{1D688}' => Some(&['\u{0059}']), - '\u{1D689}' => Some(&['\u{005A}']), - '\u{1D68A}' => Some(&['\u{0061}']), - '\u{1D68B}' => Some(&['\u{0062}']), - '\u{1D68C}' => Some(&['\u{0063}']), - '\u{1D68D}' => Some(&['\u{0064}']), - '\u{1D68E}' => Some(&['\u{0065}']), - '\u{1D68F}' => Some(&['\u{0066}']), - '\u{1D690}' => Some(&['\u{0067}']), - '\u{1D691}' => Some(&['\u{0068}']), - '\u{1D692}' => Some(&['\u{0069}']), - '\u{1D693}' => Some(&['\u{006A}']), - '\u{1D694}' => Some(&['\u{006B}']), - '\u{1D695}' => Some(&['\u{006C}']), - '\u{1D696}' => Some(&['\u{006D}']), - '\u{1D697}' => Some(&['\u{006E}']), - '\u{1D698}' => Some(&['\u{006F}']), - '\u{1D699}' => Some(&['\u{0070}']), - '\u{1D69A}' => Some(&['\u{0071}']), - '\u{1D69B}' => Some(&['\u{0072}']), - '\u{1D69C}' => Some(&['\u{0073}']), - '\u{1D69D}' => Some(&['\u{0074}']), - '\u{1D69E}' => Some(&['\u{0075}']), - '\u{1D69F}' => Some(&['\u{0076}']), - '\u{1D6A0}' => Some(&['\u{0077}']), - '\u{1D6A1}' => Some(&['\u{0078}']), - '\u{1D6A2}' => Some(&['\u{0079}']), - '\u{1D6A3}' => Some(&['\u{007A}']), - '\u{1D6A4}' => Some(&['\u{0131}']), - '\u{1D6A5}' => Some(&['\u{0237}']), - '\u{1D6A8}' => Some(&['\u{0391}']), - '\u{1D6A9}' => Some(&['\u{0392}']), - '\u{1D6AA}' => Some(&['\u{0393}']), - '\u{1D6AB}' => Some(&['\u{0394}']), - '\u{1D6AC}' => Some(&['\u{0395}']), - '\u{1D6AD}' => Some(&['\u{0396}']), - '\u{1D6AE}' => Some(&['\u{0397}']), - '\u{1D6AF}' => Some(&['\u{0398}']), - '\u{1D6B0}' => Some(&['\u{0399}']), - '\u{1D6B1}' => Some(&['\u{039A}']), - '\u{1D6B2}' => Some(&['\u{039B}']), - '\u{1D6B3}' => Some(&['\u{039C}']), - '\u{1D6B4}' => Some(&['\u{039D}']), - '\u{1D6B5}' => Some(&['\u{039E}']), - '\u{1D6B6}' => Some(&['\u{039F}']), - '\u{1D6B7}' => Some(&['\u{03A0}']), - '\u{1D6B8}' => Some(&['\u{03A1}']), - '\u{1D6B9}' => Some(&['\u{0398}']), - '\u{1D6BA}' => Some(&['\u{03A3}']), - '\u{1D6BB}' => Some(&['\u{03A4}']), - '\u{1D6BC}' => Some(&['\u{03A5}']), - '\u{1D6BD}' => Some(&['\u{03A6}']), - '\u{1D6BE}' => Some(&['\u{03A7}']), - '\u{1D6BF}' => Some(&['\u{03A8}']), - '\u{1D6C0}' => Some(&['\u{03A9}']), - '\u{1D6C1}' => Some(&['\u{2207}']), - '\u{1D6C2}' => Some(&['\u{03B1}']), - '\u{1D6C3}' => Some(&['\u{03B2}']), - '\u{1D6C4}' => Some(&['\u{03B3}']), - '\u{1D6C5}' => Some(&['\u{03B4}']), - '\u{1D6C6}' => Some(&['\u{03B5}']), - '\u{1D6C7}' => Some(&['\u{03B6}']), - '\u{1D6C8}' => Some(&['\u{03B7}']), - '\u{1D6C9}' => Some(&['\u{03B8}']), - '\u{1D6CA}' => Some(&['\u{03B9}']), - '\u{1D6CB}' => Some(&['\u{03BA}']), - '\u{1D6CC}' => Some(&['\u{03BB}']), - '\u{1D6CD}' => Some(&['\u{03BC}']), - '\u{1D6CE}' => Some(&['\u{03BD}']), - '\u{1D6CF}' => Some(&['\u{03BE}']), - '\u{1D6D0}' => Some(&['\u{03BF}']), - '\u{1D6D1}' => Some(&['\u{03C0}']), - '\u{1D6D2}' => Some(&['\u{03C1}']), - '\u{1D6D3}' => Some(&['\u{03C2}']), - '\u{1D6D4}' => Some(&['\u{03C3}']), - '\u{1D6D5}' => Some(&['\u{03C4}']), - '\u{1D6D6}' => Some(&['\u{03C5}']), - '\u{1D6D7}' => Some(&['\u{03C6}']), - '\u{1D6D8}' => Some(&['\u{03C7}']), - '\u{1D6D9}' => Some(&['\u{03C8}']), - '\u{1D6DA}' => Some(&['\u{03C9}']), - '\u{1D6DB}' => Some(&['\u{2202}']), - '\u{1D6DC}' => Some(&['\u{03B5}']), - '\u{1D6DD}' => Some(&['\u{03B8}']), - '\u{1D6DE}' => Some(&['\u{03BA}']), - '\u{1D6DF}' => Some(&['\u{03C6}']), - '\u{1D6E0}' => Some(&['\u{03C1}']), - '\u{1D6E1}' => Some(&['\u{03C0}']), - '\u{1D6E2}' => Some(&['\u{0391}']), - '\u{1D6E3}' => Some(&['\u{0392}']), - '\u{1D6E4}' => Some(&['\u{0393}']), - '\u{1D6E5}' => Some(&['\u{0394}']), - '\u{1D6E6}' => Some(&['\u{0395}']), - '\u{1D6E7}' => Some(&['\u{0396}']), - '\u{1D6E8}' => Some(&['\u{0397}']), - '\u{1D6E9}' => Some(&['\u{0398}']), - '\u{1D6EA}' => Some(&['\u{0399}']), - '\u{1D6EB}' => Some(&['\u{039A}']), - '\u{1D6EC}' => Some(&['\u{039B}']), - '\u{1D6ED}' => Some(&['\u{039C}']), - '\u{1D6EE}' => Some(&['\u{039D}']), - '\u{1D6EF}' => Some(&['\u{039E}']), - '\u{1D6F0}' => Some(&['\u{039F}']), - '\u{1D6F1}' => Some(&['\u{03A0}']), - '\u{1D6F2}' => Some(&['\u{03A1}']), - '\u{1D6F3}' => Some(&['\u{0398}']), - '\u{1D6F4}' => Some(&['\u{03A3}']), - '\u{1D6F5}' => Some(&['\u{03A4}']), - '\u{1D6F6}' => Some(&['\u{03A5}']), - '\u{1D6F7}' => Some(&['\u{03A6}']), - '\u{1D6F8}' => Some(&['\u{03A7}']), - '\u{1D6F9}' => Some(&['\u{03A8}']), - '\u{1D6FA}' => Some(&['\u{03A9}']), - '\u{1D6FB}' => Some(&['\u{2207}']), - '\u{1D6FC}' => Some(&['\u{03B1}']), - '\u{1D6FD}' => Some(&['\u{03B2}']), - '\u{1D6FE}' => Some(&['\u{03B3}']), - '\u{1D6FF}' => Some(&['\u{03B4}']), - '\u{1D700}' => Some(&['\u{03B5}']), - '\u{1D701}' => Some(&['\u{03B6}']), - '\u{1D702}' => Some(&['\u{03B7}']), - '\u{1D703}' => Some(&['\u{03B8}']), - '\u{1D704}' => Some(&['\u{03B9}']), - '\u{1D705}' => Some(&['\u{03BA}']), - '\u{1D706}' => Some(&['\u{03BB}']), - '\u{1D707}' => Some(&['\u{03BC}']), - '\u{1D708}' => Some(&['\u{03BD}']), - '\u{1D709}' => Some(&['\u{03BE}']), - '\u{1D70A}' => Some(&['\u{03BF}']), - '\u{1D70B}' => Some(&['\u{03C0}']), - '\u{1D70C}' => Some(&['\u{03C1}']), - '\u{1D70D}' => Some(&['\u{03C2}']), - '\u{1D70E}' => Some(&['\u{03C3}']), - '\u{1D70F}' => Some(&['\u{03C4}']), - '\u{1D710}' => Some(&['\u{03C5}']), - '\u{1D711}' => Some(&['\u{03C6}']), - '\u{1D712}' => Some(&['\u{03C7}']), - '\u{1D713}' => Some(&['\u{03C8}']), - '\u{1D714}' => Some(&['\u{03C9}']), - '\u{1D715}' => Some(&['\u{2202}']), - '\u{1D716}' => Some(&['\u{03B5}']), - '\u{1D717}' => Some(&['\u{03B8}']), - '\u{1D718}' => Some(&['\u{03BA}']), - '\u{1D719}' => Some(&['\u{03C6}']), - '\u{1D71A}' => Some(&['\u{03C1}']), - '\u{1D71B}' => Some(&['\u{03C0}']), - '\u{1D71C}' => Some(&['\u{0391}']), - '\u{1D71D}' => Some(&['\u{0392}']), - '\u{1D71E}' => Some(&['\u{0393}']), - '\u{1D71F}' => Some(&['\u{0394}']), - '\u{1D720}' => Some(&['\u{0395}']), - '\u{1D721}' => Some(&['\u{0396}']), - '\u{1D722}' => Some(&['\u{0397}']), - '\u{1D723}' => Some(&['\u{0398}']), - '\u{1D724}' => Some(&['\u{0399}']), - '\u{1D725}' => Some(&['\u{039A}']), - '\u{1D726}' => Some(&['\u{039B}']), - '\u{1D727}' => Some(&['\u{039C}']), - '\u{1D728}' => Some(&['\u{039D}']), - '\u{1D729}' => Some(&['\u{039E}']), - '\u{1D72A}' => Some(&['\u{039F}']), - '\u{1D72B}' => Some(&['\u{03A0}']), - '\u{1D72C}' => Some(&['\u{03A1}']), - '\u{1D72D}' => Some(&['\u{0398}']), - '\u{1D72E}' => Some(&['\u{03A3}']), - '\u{1D72F}' => Some(&['\u{03A4}']), - '\u{1D730}' => Some(&['\u{03A5}']), - '\u{1D731}' => Some(&['\u{03A6}']), - '\u{1D732}' => Some(&['\u{03A7}']), - '\u{1D733}' => Some(&['\u{03A8}']), - '\u{1D734}' => Some(&['\u{03A9}']), - '\u{1D735}' => Some(&['\u{2207}']), - '\u{1D736}' => Some(&['\u{03B1}']), - '\u{1D737}' => Some(&['\u{03B2}']), - '\u{1D738}' => Some(&['\u{03B3}']), - '\u{1D739}' => Some(&['\u{03B4}']), - '\u{1D73A}' => Some(&['\u{03B5}']), - '\u{1D73B}' => Some(&['\u{03B6}']), - '\u{1D73C}' => Some(&['\u{03B7}']), - '\u{1D73D}' => Some(&['\u{03B8}']), - '\u{1D73E}' => Some(&['\u{03B9}']), - '\u{1D73F}' => Some(&['\u{03BA}']), - '\u{1D740}' => Some(&['\u{03BB}']), - '\u{1D741}' => Some(&['\u{03BC}']), - '\u{1D742}' => Some(&['\u{03BD}']), - '\u{1D743}' => Some(&['\u{03BE}']), - '\u{1D744}' => Some(&['\u{03BF}']), - '\u{1D745}' => Some(&['\u{03C0}']), - '\u{1D746}' => Some(&['\u{03C1}']), - '\u{1D747}' => Some(&['\u{03C2}']), - '\u{1D748}' => Some(&['\u{03C3}']), - '\u{1D749}' => Some(&['\u{03C4}']), - '\u{1D74A}' => Some(&['\u{03C5}']), - '\u{1D74B}' => Some(&['\u{03C6}']), - '\u{1D74C}' => Some(&['\u{03C7}']), - '\u{1D74D}' => Some(&['\u{03C8}']), - '\u{1D74E}' => Some(&['\u{03C9}']), - '\u{1D74F}' => Some(&['\u{2202}']), - '\u{1D750}' => Some(&['\u{03B5}']), - '\u{1D751}' => Some(&['\u{03B8}']), - '\u{1D752}' => Some(&['\u{03BA}']), - '\u{1D753}' => Some(&['\u{03C6}']), - '\u{1D754}' => Some(&['\u{03C1}']), - '\u{1D755}' => Some(&['\u{03C0}']), - '\u{1D756}' => Some(&['\u{0391}']), - '\u{1D757}' => Some(&['\u{0392}']), - '\u{1D758}' => Some(&['\u{0393}']), - '\u{1D759}' => Some(&['\u{0394}']), - '\u{1D75A}' => Some(&['\u{0395}']), - '\u{1D75B}' => Some(&['\u{0396}']), - '\u{1D75C}' => Some(&['\u{0397}']), - '\u{1D75D}' => Some(&['\u{0398}']), - '\u{1D75E}' => Some(&['\u{0399}']), - '\u{1D75F}' => Some(&['\u{039A}']), - '\u{1D760}' => Some(&['\u{039B}']), - '\u{1D761}' => Some(&['\u{039C}']), - '\u{1D762}' => Some(&['\u{039D}']), - '\u{1D763}' => Some(&['\u{039E}']), - '\u{1D764}' => Some(&['\u{039F}']), - '\u{1D765}' => Some(&['\u{03A0}']), - '\u{1D766}' => Some(&['\u{03A1}']), - '\u{1D767}' => Some(&['\u{0398}']), - '\u{1D768}' => Some(&['\u{03A3}']), - '\u{1D769}' => Some(&['\u{03A4}']), - '\u{1D76A}' => Some(&['\u{03A5}']), - '\u{1D76B}' => Some(&['\u{03A6}']), - '\u{1D76C}' => Some(&['\u{03A7}']), - '\u{1D76D}' => Some(&['\u{03A8}']), - '\u{1D76E}' => Some(&['\u{03A9}']), - '\u{1D76F}' => Some(&['\u{2207}']), - '\u{1D770}' => Some(&['\u{03B1}']), - '\u{1D771}' => Some(&['\u{03B2}']), - '\u{1D772}' => Some(&['\u{03B3}']), - '\u{1D773}' => Some(&['\u{03B4}']), - '\u{1D774}' => Some(&['\u{03B5}']), - '\u{1D775}' => Some(&['\u{03B6}']), - '\u{1D776}' => Some(&['\u{03B7}']), - '\u{1D777}' => Some(&['\u{03B8}']), - '\u{1D778}' => Some(&['\u{03B9}']), - '\u{1D779}' => Some(&['\u{03BA}']), - '\u{1D77A}' => Some(&['\u{03BB}']), - '\u{1D77B}' => Some(&['\u{03BC}']), - '\u{1D77C}' => Some(&['\u{03BD}']), - '\u{1D77D}' => Some(&['\u{03BE}']), - '\u{1D77E}' => Some(&['\u{03BF}']), - '\u{1D77F}' => Some(&['\u{03C0}']), - '\u{1D780}' => Some(&['\u{03C1}']), - '\u{1D781}' => Some(&['\u{03C2}']), - '\u{1D782}' => Some(&['\u{03C3}']), - '\u{1D783}' => Some(&['\u{03C4}']), - '\u{1D784}' => Some(&['\u{03C5}']), - '\u{1D785}' => Some(&['\u{03C6}']), - '\u{1D786}' => Some(&['\u{03C7}']), - '\u{1D787}' => Some(&['\u{03C8}']), - '\u{1D788}' => Some(&['\u{03C9}']), - '\u{1D789}' => Some(&['\u{2202}']), - '\u{1D78A}' => Some(&['\u{03B5}']), - '\u{1D78B}' => Some(&['\u{03B8}']), - '\u{1D78C}' => Some(&['\u{03BA}']), - '\u{1D78D}' => Some(&['\u{03C6}']), - '\u{1D78E}' => Some(&['\u{03C1}']), - '\u{1D78F}' => Some(&['\u{03C0}']), - '\u{1D790}' => Some(&['\u{0391}']), - '\u{1D791}' => Some(&['\u{0392}']), - '\u{1D792}' => Some(&['\u{0393}']), - '\u{1D793}' => Some(&['\u{0394}']), - '\u{1D794}' => Some(&['\u{0395}']), - '\u{1D795}' => Some(&['\u{0396}']), - '\u{1D796}' => Some(&['\u{0397}']), - '\u{1D797}' => Some(&['\u{0398}']), - '\u{1D798}' => Some(&['\u{0399}']), - '\u{1D799}' => Some(&['\u{039A}']), - '\u{1D79A}' => Some(&['\u{039B}']), - '\u{1D79B}' => Some(&['\u{039C}']), - '\u{1D79C}' => Some(&['\u{039D}']), - '\u{1D79D}' => Some(&['\u{039E}']), - '\u{1D79E}' => Some(&['\u{039F}']), - '\u{1D79F}' => Some(&['\u{03A0}']), - '\u{1D7A0}' => Some(&['\u{03A1}']), - '\u{1D7A1}' => Some(&['\u{0398}']), - '\u{1D7A2}' => Some(&['\u{03A3}']), - '\u{1D7A3}' => Some(&['\u{03A4}']), - '\u{1D7A4}' => Some(&['\u{03A5}']), - '\u{1D7A5}' => Some(&['\u{03A6}']), - '\u{1D7A6}' => Some(&['\u{03A7}']), - '\u{1D7A7}' => Some(&['\u{03A8}']), - '\u{1D7A8}' => Some(&['\u{03A9}']), - '\u{1D7A9}' => Some(&['\u{2207}']), - '\u{1D7AA}' => Some(&['\u{03B1}']), - '\u{1D7AB}' => Some(&['\u{03B2}']), - '\u{1D7AC}' => Some(&['\u{03B3}']), - '\u{1D7AD}' => Some(&['\u{03B4}']), - '\u{1D7AE}' => Some(&['\u{03B5}']), - '\u{1D7AF}' => Some(&['\u{03B6}']), - '\u{1D7B0}' => Some(&['\u{03B7}']), - '\u{1D7B1}' => Some(&['\u{03B8}']), - '\u{1D7B2}' => Some(&['\u{03B9}']), - '\u{1D7B3}' => Some(&['\u{03BA}']), - '\u{1D7B4}' => Some(&['\u{03BB}']), - '\u{1D7B5}' => Some(&['\u{03BC}']), - '\u{1D7B6}' => Some(&['\u{03BD}']), - '\u{1D7B7}' => Some(&['\u{03BE}']), - '\u{1D7B8}' => Some(&['\u{03BF}']), - '\u{1D7B9}' => Some(&['\u{03C0}']), - '\u{1D7BA}' => Some(&['\u{03C1}']), - '\u{1D7BB}' => Some(&['\u{03C2}']), - '\u{1D7BC}' => Some(&['\u{03C3}']), - '\u{1D7BD}' => Some(&['\u{03C4}']), - '\u{1D7BE}' => Some(&['\u{03C5}']), - '\u{1D7BF}' => Some(&['\u{03C6}']), - '\u{1D7C0}' => Some(&['\u{03C7}']), - '\u{1D7C1}' => Some(&['\u{03C8}']), - '\u{1D7C2}' => Some(&['\u{03C9}']), - '\u{1D7C3}' => Some(&['\u{2202}']), - '\u{1D7C4}' => Some(&['\u{03B5}']), - '\u{1D7C5}' => Some(&['\u{03B8}']), - '\u{1D7C6}' => Some(&['\u{03BA}']), - '\u{1D7C7}' => Some(&['\u{03C6}']), - '\u{1D7C8}' => Some(&['\u{03C1}']), - '\u{1D7C9}' => Some(&['\u{03C0}']), - '\u{1D7CA}' => Some(&['\u{03DC}']), - '\u{1D7CB}' => Some(&['\u{03DD}']), - '\u{1D7CE}' => Some(&['\u{0030}']), - '\u{1D7CF}' => Some(&['\u{0031}']), - '\u{1D7D0}' => Some(&['\u{0032}']), - '\u{1D7D1}' => Some(&['\u{0033}']), - '\u{1D7D2}' => Some(&['\u{0034}']), - '\u{1D7D3}' => Some(&['\u{0035}']), - '\u{1D7D4}' => Some(&['\u{0036}']), - '\u{1D7D5}' => Some(&['\u{0037}']), - '\u{1D7D6}' => Some(&['\u{0038}']), - '\u{1D7D7}' => Some(&['\u{0039}']), - '\u{1D7D8}' => Some(&['\u{0030}']), - '\u{1D7D9}' => Some(&['\u{0031}']), - '\u{1D7DA}' => Some(&['\u{0032}']), - '\u{1D7DB}' => Some(&['\u{0033}']), - '\u{1D7DC}' => Some(&['\u{0034}']), - '\u{1D7DD}' => Some(&['\u{0035}']), - '\u{1D7DE}' => Some(&['\u{0036}']), - '\u{1D7DF}' => Some(&['\u{0037}']), - '\u{1D7E0}' => Some(&['\u{0038}']), - '\u{1D7E1}' => Some(&['\u{0039}']), - '\u{1D7E2}' => Some(&['\u{0030}']), - '\u{1D7E3}' => Some(&['\u{0031}']), - '\u{1D7E4}' => Some(&['\u{0032}']), - '\u{1D7E5}' => Some(&['\u{0033}']), - '\u{1D7E6}' => Some(&['\u{0034}']), - '\u{1D7E7}' => Some(&['\u{0035}']), - '\u{1D7E8}' => Some(&['\u{0036}']), - '\u{1D7E9}' => Some(&['\u{0037}']), - '\u{1D7EA}' => Some(&['\u{0038}']), - '\u{1D7EB}' => Some(&['\u{0039}']), - '\u{1D7EC}' => Some(&['\u{0030}']), - '\u{1D7ED}' => Some(&['\u{0031}']), - '\u{1D7EE}' => Some(&['\u{0032}']), - '\u{1D7EF}' => Some(&['\u{0033}']), - '\u{1D7F0}' => Some(&['\u{0034}']), - '\u{1D7F1}' => Some(&['\u{0035}']), - '\u{1D7F2}' => Some(&['\u{0036}']), - '\u{1D7F3}' => Some(&['\u{0037}']), - '\u{1D7F4}' => Some(&['\u{0038}']), - '\u{1D7F5}' => Some(&['\u{0039}']), - '\u{1D7F6}' => Some(&['\u{0030}']), - '\u{1D7F7}' => Some(&['\u{0031}']), - '\u{1D7F8}' => Some(&['\u{0032}']), - '\u{1D7F9}' => Some(&['\u{0033}']), - '\u{1D7FA}' => Some(&['\u{0034}']), - '\u{1D7FB}' => Some(&['\u{0035}']), - '\u{1D7FC}' => Some(&['\u{0036}']), - '\u{1D7FD}' => Some(&['\u{0037}']), - '\u{1D7FE}' => Some(&['\u{0038}']), - '\u{1D7FF}' => Some(&['\u{0039}']), - '\u{1EE00}' => Some(&['\u{0627}']), - '\u{1EE01}' => Some(&['\u{0628}']), - '\u{1EE02}' => Some(&['\u{062C}']), - '\u{1EE03}' => Some(&['\u{062F}']), - '\u{1EE05}' => Some(&['\u{0648}']), - '\u{1EE06}' => Some(&['\u{0632}']), - '\u{1EE07}' => Some(&['\u{062D}']), - '\u{1EE08}' => Some(&['\u{0637}']), - '\u{1EE09}' => Some(&['\u{064A}']), - '\u{1EE0A}' => Some(&['\u{0643}']), - '\u{1EE0B}' => Some(&['\u{0644}']), - '\u{1EE0C}' => Some(&['\u{0645}']), - '\u{1EE0D}' => Some(&['\u{0646}']), - '\u{1EE0E}' => Some(&['\u{0633}']), - '\u{1EE0F}' => Some(&['\u{0639}']), - '\u{1EE10}' => Some(&['\u{0641}']), - '\u{1EE11}' => Some(&['\u{0635}']), - '\u{1EE12}' => Some(&['\u{0642}']), - '\u{1EE13}' => Some(&['\u{0631}']), - '\u{1EE14}' => Some(&['\u{0634}']), - '\u{1EE15}' => Some(&['\u{062A}']), - '\u{1EE16}' => Some(&['\u{062B}']), - '\u{1EE17}' => Some(&['\u{062E}']), - '\u{1EE18}' => Some(&['\u{0630}']), - '\u{1EE19}' => Some(&['\u{0636}']), - '\u{1EE1A}' => Some(&['\u{0638}']), - '\u{1EE1B}' => Some(&['\u{063A}']), - '\u{1EE1C}' => Some(&['\u{066E}']), - '\u{1EE1D}' => Some(&['\u{06BA}']), - '\u{1EE1E}' => Some(&['\u{06A1}']), - '\u{1EE1F}' => Some(&['\u{066F}']), - '\u{1EE21}' => Some(&['\u{0628}']), - '\u{1EE22}' => Some(&['\u{062C}']), - '\u{1EE24}' => Some(&['\u{0647}']), - '\u{1EE27}' => Some(&['\u{062D}']), - '\u{1EE29}' => Some(&['\u{064A}']), - '\u{1EE2A}' => Some(&['\u{0643}']), - '\u{1EE2B}' => Some(&['\u{0644}']), - '\u{1EE2C}' => Some(&['\u{0645}']), - '\u{1EE2D}' => Some(&['\u{0646}']), - '\u{1EE2E}' => Some(&['\u{0633}']), - '\u{1EE2F}' => Some(&['\u{0639}']), - '\u{1EE30}' => Some(&['\u{0641}']), - '\u{1EE31}' => Some(&['\u{0635}']), - '\u{1EE32}' => Some(&['\u{0642}']), - '\u{1EE34}' => Some(&['\u{0634}']), - '\u{1EE35}' => Some(&['\u{062A}']), - '\u{1EE36}' => Some(&['\u{062B}']), - '\u{1EE37}' => Some(&['\u{062E}']), - '\u{1EE39}' => Some(&['\u{0636}']), - '\u{1EE3B}' => Some(&['\u{063A}']), - '\u{1EE42}' => Some(&['\u{062C}']), - '\u{1EE47}' => Some(&['\u{062D}']), - '\u{1EE49}' => Some(&['\u{064A}']), - '\u{1EE4B}' => Some(&['\u{0644}']), - '\u{1EE4D}' => Some(&['\u{0646}']), - '\u{1EE4E}' => Some(&['\u{0633}']), - '\u{1EE4F}' => Some(&['\u{0639}']), - '\u{1EE51}' => Some(&['\u{0635}']), - '\u{1EE52}' => Some(&['\u{0642}']), - '\u{1EE54}' => Some(&['\u{0634}']), - '\u{1EE57}' => Some(&['\u{062E}']), - '\u{1EE59}' => Some(&['\u{0636}']), - '\u{1EE5B}' => Some(&['\u{063A}']), - '\u{1EE5D}' => Some(&['\u{06BA}']), - '\u{1EE5F}' => Some(&['\u{066F}']), - '\u{1EE61}' => Some(&['\u{0628}']), - '\u{1EE62}' => Some(&['\u{062C}']), - '\u{1EE64}' => Some(&['\u{0647}']), - '\u{1EE67}' => Some(&['\u{062D}']), - '\u{1EE68}' => Some(&['\u{0637}']), - '\u{1EE69}' => Some(&['\u{064A}']), - '\u{1EE6A}' => Some(&['\u{0643}']), - '\u{1EE6C}' => Some(&['\u{0645}']), - '\u{1EE6D}' => Some(&['\u{0646}']), - '\u{1EE6E}' => Some(&['\u{0633}']), - '\u{1EE6F}' => Some(&['\u{0639}']), - '\u{1EE70}' => Some(&['\u{0641}']), - '\u{1EE71}' => Some(&['\u{0635}']), - '\u{1EE72}' => Some(&['\u{0642}']), - '\u{1EE74}' => Some(&['\u{0634}']), - '\u{1EE75}' => Some(&['\u{062A}']), - '\u{1EE76}' => Some(&['\u{062B}']), - '\u{1EE77}' => Some(&['\u{062E}']), - '\u{1EE79}' => Some(&['\u{0636}']), - '\u{1EE7A}' => Some(&['\u{0638}']), - '\u{1EE7B}' => Some(&['\u{063A}']), - '\u{1EE7C}' => Some(&['\u{066E}']), - '\u{1EE7E}' => Some(&['\u{06A1}']), - '\u{1EE80}' => Some(&['\u{0627}']), - '\u{1EE81}' => Some(&['\u{0628}']), - '\u{1EE82}' => Some(&['\u{062C}']), - '\u{1EE83}' => Some(&['\u{062F}']), - '\u{1EE84}' => Some(&['\u{0647}']), - '\u{1EE85}' => Some(&['\u{0648}']), - '\u{1EE86}' => Some(&['\u{0632}']), - '\u{1EE87}' => Some(&['\u{062D}']), - '\u{1EE88}' => Some(&['\u{0637}']), - '\u{1EE89}' => Some(&['\u{064A}']), - '\u{1EE8B}' => Some(&['\u{0644}']), - '\u{1EE8C}' => Some(&['\u{0645}']), - '\u{1EE8D}' => Some(&['\u{0646}']), - '\u{1EE8E}' => Some(&['\u{0633}']), - '\u{1EE8F}' => Some(&['\u{0639}']), - '\u{1EE90}' => Some(&['\u{0641}']), - '\u{1EE91}' => Some(&['\u{0635}']), - '\u{1EE92}' => Some(&['\u{0642}']), - '\u{1EE93}' => Some(&['\u{0631}']), - '\u{1EE94}' => Some(&['\u{0634}']), - '\u{1EE95}' => Some(&['\u{062A}']), - '\u{1EE96}' => Some(&['\u{062B}']), - '\u{1EE97}' => Some(&['\u{062E}']), - '\u{1EE98}' => Some(&['\u{0630}']), - '\u{1EE99}' => Some(&['\u{0636}']), - '\u{1EE9A}' => Some(&['\u{0638}']), - '\u{1EE9B}' => Some(&['\u{063A}']), - '\u{1EEA1}' => Some(&['\u{0628}']), - '\u{1EEA2}' => Some(&['\u{062C}']), - '\u{1EEA3}' => Some(&['\u{062F}']), - '\u{1EEA5}' => Some(&['\u{0648}']), - '\u{1EEA6}' => Some(&['\u{0632}']), - '\u{1EEA7}' => Some(&['\u{062D}']), - '\u{1EEA8}' => Some(&['\u{0637}']), - '\u{1EEA9}' => Some(&['\u{064A}']), - '\u{1EEAB}' => Some(&['\u{0644}']), - '\u{1EEAC}' => Some(&['\u{0645}']), - '\u{1EEAD}' => Some(&['\u{0646}']), - '\u{1EEAE}' => Some(&['\u{0633}']), - '\u{1EEAF}' => Some(&['\u{0639}']), - '\u{1EEB0}' => Some(&['\u{0641}']), - '\u{1EEB1}' => Some(&['\u{0635}']), - '\u{1EEB2}' => Some(&['\u{0642}']), - '\u{1EEB3}' => Some(&['\u{0631}']), - '\u{1EEB4}' => Some(&['\u{0634}']), - '\u{1EEB5}' => Some(&['\u{062A}']), - '\u{1EEB6}' => Some(&['\u{062B}']), - '\u{1EEB7}' => Some(&['\u{062E}']), - '\u{1EEB8}' => Some(&['\u{0630}']), - '\u{1EEB9}' => Some(&['\u{0636}']), - '\u{1EEBA}' => Some(&['\u{0638}']), - '\u{1EEBB}' => Some(&['\u{063A}']), - '\u{1F100}' => Some(&['\u{0030}', '\u{002E}']), - '\u{1F101}' => Some(&['\u{0030}', '\u{002C}']), - '\u{1F102}' => Some(&['\u{0031}', '\u{002C}']), - '\u{1F103}' => Some(&['\u{0032}', '\u{002C}']), - '\u{1F104}' => Some(&['\u{0033}', '\u{002C}']), - '\u{1F105}' => Some(&['\u{0034}', '\u{002C}']), - '\u{1F106}' => Some(&['\u{0035}', '\u{002C}']), - '\u{1F107}' => Some(&['\u{0036}', '\u{002C}']), - '\u{1F108}' => Some(&['\u{0037}', '\u{002C}']), - '\u{1F109}' => Some(&['\u{0038}', '\u{002C}']), - '\u{1F10A}' => Some(&['\u{0039}', '\u{002C}']), - '\u{1F110}' => Some(&['\u{0028}', '\u{0041}', '\u{0029}']), - '\u{1F111}' => Some(&['\u{0028}', '\u{0042}', '\u{0029}']), - '\u{1F112}' => Some(&['\u{0028}', '\u{0043}', '\u{0029}']), - '\u{1F113}' => Some(&['\u{0028}', '\u{0044}', '\u{0029}']), - '\u{1F114}' => Some(&['\u{0028}', '\u{0045}', '\u{0029}']), - '\u{1F115}' => Some(&['\u{0028}', '\u{0046}', '\u{0029}']), - '\u{1F116}' => Some(&['\u{0028}', '\u{0047}', '\u{0029}']), - '\u{1F117}' => Some(&['\u{0028}', '\u{0048}', '\u{0029}']), - '\u{1F118}' => Some(&['\u{0028}', '\u{0049}', '\u{0029}']), - '\u{1F119}' => Some(&['\u{0028}', '\u{004A}', '\u{0029}']), - '\u{1F11A}' => Some(&['\u{0028}', '\u{004B}', '\u{0029}']), - '\u{1F11B}' => Some(&['\u{0028}', '\u{004C}', '\u{0029}']), - '\u{1F11C}' => Some(&['\u{0028}', '\u{004D}', '\u{0029}']), - '\u{1F11D}' => Some(&['\u{0028}', '\u{004E}', '\u{0029}']), - '\u{1F11E}' => Some(&['\u{0028}', '\u{004F}', '\u{0029}']), - '\u{1F11F}' => Some(&['\u{0028}', '\u{0050}', '\u{0029}']), - '\u{1F120}' => Some(&['\u{0028}', '\u{0051}', '\u{0029}']), - '\u{1F121}' => Some(&['\u{0028}', '\u{0052}', '\u{0029}']), - '\u{1F122}' => Some(&['\u{0028}', '\u{0053}', '\u{0029}']), - '\u{1F123}' => Some(&['\u{0028}', '\u{0054}', '\u{0029}']), - '\u{1F124}' => Some(&['\u{0028}', '\u{0055}', '\u{0029}']), - '\u{1F125}' => Some(&['\u{0028}', '\u{0056}', '\u{0029}']), - '\u{1F126}' => Some(&['\u{0028}', '\u{0057}', '\u{0029}']), - '\u{1F127}' => Some(&['\u{0028}', '\u{0058}', '\u{0029}']), - '\u{1F128}' => Some(&['\u{0028}', '\u{0059}', '\u{0029}']), - '\u{1F129}' => Some(&['\u{0028}', '\u{005A}', '\u{0029}']), - '\u{1F12A}' => Some(&['\u{3014}', '\u{0053}', '\u{3015}']), - '\u{1F12B}' => Some(&['\u{0043}']), - '\u{1F12C}' => Some(&['\u{0052}']), - '\u{1F12D}' => Some(&['\u{0043}', '\u{0044}']), - '\u{1F12E}' => Some(&['\u{0057}', '\u{005A}']), - '\u{1F130}' => Some(&['\u{0041}']), - '\u{1F131}' => Some(&['\u{0042}']), - '\u{1F132}' => Some(&['\u{0043}']), - '\u{1F133}' => Some(&['\u{0044}']), - '\u{1F134}' => Some(&['\u{0045}']), - '\u{1F135}' => Some(&['\u{0046}']), - '\u{1F136}' => Some(&['\u{0047}']), - '\u{1F137}' => Some(&['\u{0048}']), - '\u{1F138}' => Some(&['\u{0049}']), - '\u{1F139}' => Some(&['\u{004A}']), - '\u{1F13A}' => Some(&['\u{004B}']), - '\u{1F13B}' => Some(&['\u{004C}']), - '\u{1F13C}' => Some(&['\u{004D}']), - '\u{1F13D}' => Some(&['\u{004E}']), - '\u{1F13E}' => Some(&['\u{004F}']), - '\u{1F13F}' => Some(&['\u{0050}']), - '\u{1F140}' => Some(&['\u{0051}']), - '\u{1F141}' => Some(&['\u{0052}']), - '\u{1F142}' => Some(&['\u{0053}']), - '\u{1F143}' => Some(&['\u{0054}']), - '\u{1F144}' => Some(&['\u{0055}']), - '\u{1F145}' => Some(&['\u{0056}']), - '\u{1F146}' => Some(&['\u{0057}']), - '\u{1F147}' => Some(&['\u{0058}']), - '\u{1F148}' => Some(&['\u{0059}']), - '\u{1F149}' => Some(&['\u{005A}']), - '\u{1F14A}' => Some(&['\u{0048}', '\u{0056}']), - '\u{1F14B}' => Some(&['\u{004D}', '\u{0056}']), - '\u{1F14C}' => Some(&['\u{0053}', '\u{0044}']), - '\u{1F14D}' => Some(&['\u{0053}', '\u{0053}']), - '\u{1F14E}' => Some(&['\u{0050}', '\u{0050}', '\u{0056}']), - '\u{1F14F}' => Some(&['\u{0057}', '\u{0043}']), - '\u{1F16A}' => Some(&['\u{004D}', '\u{0043}']), - '\u{1F16B}' => Some(&['\u{004D}', '\u{0044}']), - '\u{1F190}' => Some(&['\u{0044}', '\u{004A}']), - '\u{1F200}' => Some(&['\u{307B}', '\u{304B}']), - '\u{1F201}' => Some(&['\u{30B3}', '\u{30B3}']), - '\u{1F202}' => Some(&['\u{30B5}']), - '\u{1F210}' => Some(&['\u{624B}']), - '\u{1F211}' => Some(&['\u{5B57}']), - '\u{1F212}' => Some(&['\u{53CC}']), - '\u{1F213}' => Some(&['\u{30C6}', '\u{3099}']), - '\u{1F214}' => Some(&['\u{4E8C}']), - '\u{1F215}' => Some(&['\u{591A}']), - '\u{1F216}' => Some(&['\u{89E3}']), - '\u{1F217}' => Some(&['\u{5929}']), - '\u{1F218}' => Some(&['\u{4EA4}']), - '\u{1F219}' => Some(&['\u{6620}']), - '\u{1F21A}' => Some(&['\u{7121}']), - '\u{1F21B}' => Some(&['\u{6599}']), - '\u{1F21C}' => Some(&['\u{524D}']), - '\u{1F21D}' => Some(&['\u{5F8C}']), - '\u{1F21E}' => Some(&['\u{518D}']), - '\u{1F21F}' => Some(&['\u{65B0}']), - '\u{1F220}' => Some(&['\u{521D}']), - '\u{1F221}' => Some(&['\u{7D42}']), - '\u{1F222}' => Some(&['\u{751F}']), - '\u{1F223}' => Some(&['\u{8CA9}']), - '\u{1F224}' => Some(&['\u{58F0}']), - '\u{1F225}' => Some(&['\u{5439}']), - '\u{1F226}' => Some(&['\u{6F14}']), - '\u{1F227}' => Some(&['\u{6295}']), - '\u{1F228}' => Some(&['\u{6355}']), - '\u{1F229}' => Some(&['\u{4E00}']), - '\u{1F22A}' => Some(&['\u{4E09}']), - '\u{1F22B}' => Some(&['\u{904A}']), - '\u{1F22C}' => Some(&['\u{5DE6}']), - '\u{1F22D}' => Some(&['\u{4E2D}']), - '\u{1F22E}' => Some(&['\u{53F3}']), - '\u{1F22F}' => Some(&['\u{6307}']), - '\u{1F230}' => Some(&['\u{8D70}']), - '\u{1F231}' => Some(&['\u{6253}']), - '\u{1F232}' => Some(&['\u{7981}']), - '\u{1F233}' => Some(&['\u{7A7A}']), - '\u{1F234}' => Some(&['\u{5408}']), - '\u{1F235}' => Some(&['\u{6E80}']), - '\u{1F236}' => Some(&['\u{6709}']), - '\u{1F237}' => Some(&['\u{6708}']), - '\u{1F238}' => Some(&['\u{7533}']), - '\u{1F239}' => Some(&['\u{5272}']), - '\u{1F23A}' => Some(&['\u{55B6}']), - '\u{1F23B}' => Some(&['\u{914D}']), - '\u{1F240}' => Some(&['\u{3014}', '\u{672C}', '\u{3015}']), - '\u{1F241}' => Some(&['\u{3014}', '\u{4E09}', '\u{3015}']), - '\u{1F242}' => Some(&['\u{3014}', '\u{4E8C}', '\u{3015}']), - '\u{1F243}' => Some(&['\u{3014}', '\u{5B89}', '\u{3015}']), - '\u{1F244}' => Some(&['\u{3014}', '\u{70B9}', '\u{3015}']), - '\u{1F245}' => Some(&['\u{3014}', '\u{6253}', '\u{3015}']), - '\u{1F246}' => Some(&['\u{3014}', '\u{76D7}', '\u{3015}']), - '\u{1F247}' => Some(&['\u{3014}', '\u{52DD}', '\u{3015}']), - '\u{1F248}' => Some(&['\u{3014}', '\u{6557}', '\u{3015}']), - '\u{1F250}' => Some(&['\u{5F97}']), - '\u{1F251}' => Some(&['\u{53EF}']), - _ => None, - } -} +pub(crate) const COMPATIBILITY_DECOMPOSED_SALT: &[u16] = &[ + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x66, + 0x9d7, + 0x2cc, + 0x3, + 0xe3, + 0x5, + 0x0, + 0x0, + 0x1e, + 0x105, + 0x2, + 0x3, + 0x11, + 0x0, + 0x161, + 0x0, + 0x44, + 0x0, + 0x5, + 0x0, + 0x7d, + 0x0, + 0x0, + 0x0, + 0x0, + 0xa, + 0x122, + 0x1d, + 0x81, + 0x10, + 0x203, + 0x0, + 0x12, + 0x0, + 0xa, + 0x45, + 0x2, + 0x222, + 0x0, + 0x7a, + 0x12, + 0x13, + 0x3d, + 0x0, + 0x0, + 0x5, + 0x8e, + 0x0, + 0x0, + 0x137, + 0xd5, + 0x150, + 0x8, + 0x0, + 0x0, + 0x6, + 0x50, + 0x80, + 0x0, + 0x1, + 0x15, + 0x8, + 0xd6, + 0x88, + 0x4c, + 0x17, + 0x34, + 0x0, + 0x0, + 0x17b, + 0x7, + 0x1, + 0x18, + 0x26, + 0x4, + 0x1, + 0x0, + 0x46, + 0x9, + 0xa, + 0x2, + 0x0, + 0x1a, + 0x0, + 0x0, + 0x7, + 0x25, + 0x3a, + 0x78, + 0x0, + 0x52, + 0x0, + 0x9, + 0x0, + 0x45, + 0x7, + 0xc, + 0x5, + 0x25, + 0x97, + 0x6, + 0x7, + 0x0, + 0x0, + 0xd, + 0x59, + 0x0, + 0x3e, + 0x6, + 0x0, + 0x5b, + 0x4d, + 0x17, + 0xd, + 0x0, + 0x12, + 0xe, + 0xe, + 0x0, + 0x0, + 0xd, + 0x19, + 0x1b, + 0x19, + 0x9, + 0x0, + 0xa7, + 0x2, + 0x0, + 0x0, + 0x0, + 0x17, + 0x12c, + 0x0, + 0x0, + 0x4d, + 0xe, + 0x11, + 0x45, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x11, + 0x13, + 0xb, + 0xd, + 0x1, + 0x1f, + 0x3, + 0x1, + 0x0, + 0x5, + 0x2, + 0x3, + 0x0, + 0x7b, + 0x5, + 0xa, + 0x0, + 0x2c, + 0x0, + 0x1, + 0x80, + 0x87, + 0x0, + 0x7d, + 0x0, + 0x49, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x3c, + 0x1f, + 0x0, + 0x2, + 0xd, + 0x72, + 0x0, + 0x0, + 0x8, + 0x7, + 0x16, + 0x7, + 0x0, + 0x18, + 0x7, + 0x0, + 0x25, + 0x0, + 0x28, + 0x0, + 0x49, + 0x1f, + 0x3, + 0x0, + 0x2f, + 0x4, + 0x0, + 0x11, + 0x0, + 0x41, + 0x0, + 0x39, + 0x28, + 0x0, + 0xa, + 0x0, + 0x0, + 0x3, + 0xf, + 0x1, + 0x0, + 0x4, + 0x2, + 0x1b, + 0x0, + 0x0, + 0x0, + 0x24, + 0x1, + 0x1b, + 0x0, + 0x13, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x5, + 0x0, + 0x30, + 0x3, + 0x9, + 0x0, + 0x0, + 0x1, + 0x3, + 0x3, + 0x1, + 0x0, + 0x2, + 0x0, + 0x15, + 0x1, + 0x27, + 0x0, + 0x0, + 0x12, + 0x1, + 0x3, + 0x23, + 0x9, + 0x0, + 0x22, + 0x0, + 0x1, + 0x3, + 0x0, + 0x11, + 0x2, + 0x1, + 0x7, + 0x2e, + 0x1b, + 0x18, + 0x2, + 0x32, + 0x44, + 0xe, + 0x1e, + 0x0, + 0x1, + 0x0, + 0xb, + 0x0, + 0x1, + 0xe, + 0x0, + 0x1, + 0x6, + 0x0, + 0x0, + 0x72, + 0x1, + 0x0, + 0x0, + 0x6, + 0x0, + 0x0, + 0x13, + 0x0, + 0x0, + 0x19, + 0x0, + 0x2, + 0x0, + 0x7, + 0x3, + 0x0, + 0x2, + 0x0, + 0x8, + 0x1, + 0x4, + 0x2, + 0x0, + 0x1, + 0x49, + 0x13, + 0x1, + 0x8, + 0x1b, + 0x3, + 0x20, + 0x1, + 0x5, + 0x4, + 0x0, + 0x1c, + 0x4d, + 0x4, + 0x0, + 0x0, + 0x1, + 0x25, + 0x2, + 0x0, + 0x2e, + 0x0, + 0x4, + 0x0, + 0x0, + 0xd, + 0x14, + 0x0, + 0x0, + 0x5, + 0x56, + 0x19, + 0x15, + 0x4, + 0x0, + 0x6, + 0x0, + 0x2, + 0x14, + 0x6, + 0x7, + 0x7, + 0x3, + 0x1, + 0x0, + 0x1e, + 0x7, + 0xf, + 0x9, + 0x6, + 0x13, + 0x0, + 0x0, + 0x3, + 0x1, + 0x7, + 0x0, + 0xb, + 0xa, + 0x4, + 0x0, + 0x0, + 0x0, + 0x1, + 0x4, + 0x0, + 0x15, + 0x1b, + 0x11, + 0x6, + 0x1e, + 0x9, + 0x1, + 0x0, + 0x0, + 0x3, + 0x7, + 0x43, + 0x0, + 0x1, + 0x4, + 0x0, + 0x14, + 0x16, + 0x0, + 0x1e, + 0x1, + 0x16, + 0x5, + 0x17, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x11, + 0xe, + 0x0, + 0x0, + 0x1, + 0x0, + 0x9, + 0x0, + 0x0, + 0x21, + 0x27, + 0x61, + 0x3, + 0x0, + 0x0, + 0x1, + 0x1a, + 0x27, + 0xe, + 0x8, + 0x1b, + 0x1, + 0x1c, + 0x1b, + 0x0, + 0x2, + 0x3, + 0x0, + 0x4, + 0x0, + 0x0, + 0x1c, + 0x0, + 0x0, + 0x1f, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1b, + 0x1, + 0x7, + 0x12, + 0x2, + 0x1, + 0x0, + 0x5, + 0x0, + 0x0, + 0x4, + 0xc, + 0xb, + 0x0, + 0x1a, + 0x30, + 0x0, + 0x12, + 0xa, + 0x5, + 0x0, + 0x16, + 0x2, + 0x16, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x1, + 0xd, + 0x0, + 0x8, + 0x0, + 0x0, + 0x1a, + 0x0, + 0xb, + 0x1, + 0x1, + 0x47, + 0x0, + 0x4, + 0xc, + 0x0, + 0x4, + 0xa, + 0xa, + 0x0, + 0x0, + 0x0, + 0x0, + 0x7, + 0x12, + 0x3, + 0x0, + 0x0, + 0x5, + 0x8, + 0x2, + 0x0, + 0x4, + 0x1b, + 0x0, + 0x6, + 0x0, + 0x5, + 0x0, + 0x10, + 0x0, + 0x1, + 0x1, + 0x3, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x11, + 0x13, + 0xf, + 0x2, + 0x0, + 0xe, + 0x15, + 0x0, + 0x7, + 0xc, + 0x28, + 0x2, + 0x6f, + 0x17, + 0x5, + 0x3, + 0x11, + 0x19, + 0x9, + 0x7, + 0xf, + 0x0, + 0x7, + 0x0, + 0x4, + 0x0, + 0x3, + 0x16, + 0x1e, + 0x6, + 0x0, + 0x2b, + 0x1, + 0x21, + 0x3, + 0x1, + 0x4, + 0x9, + 0x10, + 0x0, + 0x5, + 0x1d, + 0x3, + 0xe, + 0x1d, + 0x0, + 0x6, + 0x0, + 0x2, + 0x7, + 0x0, + 0x2, + 0x2, + 0xc, + 0x1, + 0x5, + 0x14, + 0x3, + 0x0, + 0x21, + 0x3, + 0x0, + 0x0, + 0x2, + 0x0, + 0x3, + 0x0, + 0x11, + 0x0, + 0x1b, + 0x3e, + 0x0, + 0xe, + 0x1, + 0x0, + 0x7, + 0x0, + 0x3, + 0x0, + 0xc, + 0x0, + 0x0, + 0x1, + 0x6, + 0x3d, + 0x9, + 0x4, + 0x0, + 0x2, + 0x0, + 0xa, + 0x0, + 0x4, + 0x1, + 0x5, + 0x1, + 0x3, + 0x0, + 0x5, + 0x8, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x8, + 0x0, + 0x0, + 0x1, + 0x4, + 0x0, + 0x1f, + 0x1, + 0xc, + 0x5, + 0x2, + 0x1, + 0x3, + 0x8, + 0x2, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0xd, + 0x0, + 0xe, + 0x0, + 0x25, + 0x11, + 0x0, + 0x9, + 0x1, + 0x0, + 0x2, + 0x4, + 0x1, + 0x0, + 0x12, + 0x0, + 0x1, + 0x0, + 0x1a, + 0x0, + 0x15, + 0x1, + 0x10, + 0x1, + 0x0, + 0x0, + 0x0, + 0xd, + 0x2, + 0x0, + 0x5, + 0x12, + 0x5, + 0x0, + 0x3, + 0x3, + 0x13, + 0x0, + 0x19, + 0x11, + 0xa, + 0x0, + 0x0, + 0x0, + 0x1, + 0x5, + 0x8, + 0x2e, + 0x4, + 0x0, + 0x2, + 0x0, + 0x7, + 0x1, + 0x3, + 0x0, + 0x5, + 0x0, + 0xb, + 0xa, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x30, + 0x4, + 0x0, + 0x1, + 0x0, + 0x2, + 0x0, + 0x1, + 0x4, + 0x0, + 0x0, + 0x9, + 0x0, + 0x4, + 0x5, + 0x19, + 0x6, + 0x1, + 0x1, + 0x9, + 0x1, + 0x2, + 0x2, + 0x0, + 0x0, + 0x30, + 0x19, + 0x1, + 0x5, + 0x0, + 0x4, + 0xf, + 0x4, + 0x3, + 0x0, + 0x0, + 0x14, + 0x2, + 0x0, + 0x1, + 0xa, + 0x15, + 0xc, + 0x7, + 0x20, + 0x0, + 0x0, + 0x3, + 0x2, + 0x0, + 0x0, + 0x0, + 0x3, + 0xb, + 0x6, + 0xc, + 0x12, + 0x7, + 0x15, + 0x8, + 0x2, + 0x2, + 0x0, + 0x1, + 0x6, + 0x5, + 0x0, + 0x0, + 0x5, + 0x21, + 0x0, + 0xa, + 0x8, + 0x5, + 0x15, + 0x1, + 0x0, + 0x1, + 0x8, + 0x0, + 0x3, + 0x1, + 0x4, + 0x3, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x1, + 0x10, + 0x2, + 0x3, + 0x0, + 0x20, + 0x6, + 0x1, + 0x0, + 0x17, + 0x0, + 0x6, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x10, + 0x0, + 0x13, + 0x1, + 0x13, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1e, + 0x0, + 0x0, + 0x1, + 0x4, + 0x7, + 0x0, + 0x0, + 0x4, + 0x1c, + 0x3, + 0x7, + 0x5, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x0, + 0x6, + 0x1, + 0x1, + 0x7, + 0x0, + 0xd, + 0x0, + 0x0, + 0x1, + 0x1, + 0x2, + 0x0, + 0x0, + 0x5, + 0x2, + 0x3, + 0x4, + 0x0, + 0xd, + 0x9, + 0x4, + 0x2, + 0xe, + 0x0, + 0x0, + 0xa, + 0x2, + 0x0, + 0x0, + 0xf, + 0x0, + 0x0, + 0x1, + 0xa, + 0x2, + 0x0, + 0x2, + 0x1, + 0x0, + 0x9, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0xa, + 0x0, + 0x3, + 0x0, + 0x2, + 0x5, + 0x5, + 0x1, + 0x6, + 0x2, + 0x0, + 0x5, + 0x1, + 0x0, + 0x1, + 0xa, + 0x0, + 0x2, + 0x27, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x1, + 0x7, + 0x3, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x9, + 0x0, + 0x3, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x7, + 0x1, + 0x0, + 0x2, + 0x2, + 0x2, + 0x3, + 0x1, + 0x4, + 0x3, + 0x2, + 0x7, + 0xb, + 0x0, + 0x0, + 0xe, + 0x1, + 0xd, + 0x1, + 0x0, + 0x8, + 0xa, + 0x15, + 0x0, + 0x0, + 0x14, + 0x4, + 0x0, + 0x0, + 0x7, + 0xc, + 0x1, + 0x0, + 0x0, + 0x8, + 0x7, + 0x0, + 0x4, + 0x6, + 0x9, + 0x2, + 0xb, + 0x2, + 0x0, + 0x6, + 0x7, + 0x4, + 0x1d, + 0x0, + 0x0, + 0xc, + 0x3, + 0x0, + 0x4, + 0x0, + 0x1b, + 0x1, + 0x12, + 0x0, + 0x0, + 0x6, + 0x11, + 0x1, + 0x1, + 0x1, + 0x9, + 0xa, + 0x0, + 0x10, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x8, + 0x0, + 0x1b, + 0xb, + 0x1, + 0x0, + 0xf, + 0x2, + 0x0, + 0x7, + 0xe, + 0x4, + 0x0, + 0xb, + 0x0, + 0x8, + 0x5, + 0x1, + 0x0, + 0x1, + 0x7, + 0x0, + 0x0, + 0x2, + 0x3, + 0x0, + 0x0, + 0x6, + 0x0, + 0x0, + 0x4, + 0x1, + 0x0, + 0xb, + 0x0, + 0x0, + 0x4, + 0x9, + 0x13, + 0x0, + 0x6, + 0x6, + 0x2, + 0x0, + 0x8, + 0x6, + 0x3, + 0x5, + 0x0, + 0x2, + 0x0, + 0x0, + 0x5, + 0xa, + 0x6, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x2, + 0x2, + 0x1, + 0xd, + 0x0, + 0x5, + 0x6, + 0x4, + 0x0, + 0x0, + 0x0, + 0x1c, + 0x0, + 0x0, + 0x18, + 0x2, + 0x8, + 0x2, + 0xb, + 0x0, + 0x0, + 0x1, + 0x3, + 0x6, + 0x1, + 0x0, + 0x1, + 0x3, + 0x0, + 0x0, + 0x5, + 0xa, + 0x9, + 0x0, + 0x1, + 0x3, + 0x0, + 0x0, + 0x1, + 0x3, + 0x9, + 0x1, + 0x25, + 0x0, + 0x1, + 0x9, + 0x2, + 0x1b, + 0x0, + 0x5, + 0x4, + 0x1, + 0xa, + 0xf, + 0x6, + 0x1, + 0xf, + 0x17, + 0x0, + 0xd, + 0x4, + 0x1, + 0x1, + 0x4, + 0x0, + 0x4, + 0x0, + 0x0, + 0x5, + 0x8, + 0x2, + 0x8, + 0x3, + 0x1, + 0x2, + 0x0, + 0x5, + 0x0, + 0x1, + 0x10, + 0x5, + 0x5, + 0x2, + 0x0, + 0x7, + 0x9, + 0x7, + 0x1, + 0x0, + 0x2, + 0x0, + 0x9, + 0x0, + 0x0, + 0x0, + 0x1, + 0x3, + 0xb, + 0x0, + 0x0, + 0x0, + 0x1, + 0xa, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x11, + 0x1, + 0x4, + 0x0, + 0x0, + 0x0, + 0x7, + 0xc, + 0x1, + 0x0, + 0x18, + 0xa, + 0x3, + 0x3, + 0x1, + 0x0, + 0x10, + 0x0, + 0x3, + 0x8, + 0x0, + 0x2, + 0x0, + 0xa, + 0x7, + 0x1, + 0x1, + 0x2, + 0xa, + 0x2, + 0x8, + 0x2, + 0x0, + 0x1, + 0x1, + 0x0, + 0x6, + 0x2, + 0x2, + 0x3, + 0x0, + 0x0, + 0xb, + 0x8, + 0x0, + 0x0, + 0x1, + 0x5, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0xf, + 0x3, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x0, + 0x9, + 0x6, + 0x0, + 0x2, + 0x0, + 0x2, + 0x2, + 0x4, + 0x2, + 0x17, + 0x0, + 0x1, + 0x4, + 0x3, + 0x6, + 0x0, + 0x1, + 0x2, + 0x1, + 0x6, + 0x3, + 0xa, + 0x0, + 0x0, + 0x0, + 0x9, + 0x3, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x6, + 0x2, + 0x0, + 0x7, + 0x0, + 0x2, + 0x1, + 0xf, + 0x0, + 0x0, + 0x0, + 0x4, + 0x3, + 0xa, + 0x0, + 0x0, + 0x0, + 0x0, + 0x11, + 0x5, + 0x9, + 0x7, + 0x1, + 0x7, + 0x5, + 0x1, + 0x0, + 0x0, + 0x0, + 0xc, + 0x1, + 0x7, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x7, + 0x2, + 0x7, + 0x15, + 0xe, + 0x2, + 0x9, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x5, + 0x3, + 0x1, + 0x4, + 0x1, + 0x0, + 0x7, + 0x1, + 0x1, + 0x1, + 0x3, + 0xc, + 0x2, + 0x2, + 0x1, + 0x6, + 0x2, + 0x2, + 0x0, + 0x3, + 0x1, + 0x0, + 0x1, + 0x5, + 0x1, + 0x6, + 0x0, + 0x0, + 0x0, + 0x0, + 0x5, + 0x11, + 0x2, + 0x1, + 0x2, + 0x9, + 0x0, + 0xe, + 0x2, + 0x0, + 0x8, + 0x2, + 0xd, + 0x1, + 0x2, + 0x4, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x5, + 0x0, + 0xa, + 0xa, + 0x1, + 0x6, + 0x7, + 0x1, + 0x0, + 0x2, + 0x4, + 0xd, + 0x1, + 0x0, + 0x0, + 0x6, + 0x3, + 0x2, + 0x2, + 0x2, + 0x0, + 0x6, + 0x0, + 0x4, + 0x3, + 0x6, + 0x9, + 0x1, + 0x1, + 0xe, + 0x0, + 0xe, + 0x2, + 0x0, + 0x3, + 0x0, + 0x5, + 0x10, + 0xf, + 0x0, + 0x1, + 0x8, + 0x3, + 0x0, + 0x0, + 0x2, + 0xb, + 0x3, + 0x0, + 0x3, + 0x3, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x0, + 0x5, + 0x3, + 0x4, + 0x1, + 0x1, + 0x3, + 0x0, + 0x6, + 0x0, + 0x1, + 0x4, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x0, + 0xe, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x1, + 0x0, + 0x9, + 0x3, + 0x0, + 0x0, + 0x0, + 0x6, + 0x1, + 0x0, + 0x7, + 0x4, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0xe, + 0x0, + 0x3, + 0x3, + 0x5, + 0x3, + 0x0, + 0x3, + 0x1, + 0x1, + 0x4, + 0x4, + 0x0, + 0x6, + 0x5, + 0x5, + 0x4, + 0x1, + 0x3, + 0x0, + 0x0, + 0x0, + 0x5, + 0x5, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x4, + 0x8, + 0x0, + 0x2, + 0x0, + 0x1, + 0x4, + 0x5, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0xa, + 0xa, + 0x0, + 0x3, + 0x2, + 0x1, + 0x0, + 0x0, + 0x4, + 0x5, + 0x3, + 0x0, + 0x15, + 0x23, + 0x4, + 0x0, + 0x2, + 0x0, + 0x2, + 0x2, + 0x6, + 0x1, + 0x3, + 0x3, + 0x1, + 0x0, + 0x5, + 0x6, + 0xa, + 0x1, + 0x11, + 0x5, + 0x0, + 0xd, + 0x4, + 0x2, + 0x1, + 0x0, + 0x2, + 0xa, + 0x1, + 0x0, + 0x0, + 0x4, + 0x2, + 0x7, + 0x3, + 0x2, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x1, + 0x1, + 0x2, + 0x1, + 0x0, + 0x2, + 0x2, + 0x6, + 0xa, + 0x0, + 0x2, + 0x1, + 0x5, + 0x3, + 0x0, + 0x2, + 0x2, + 0x3, + 0x0, + 0x8, + 0x7, + 0x1, + 0x2, + 0x3, + 0x3, + 0x1a, + 0x2, + 0x1, + 0x10, + 0x0, + 0x2, + 0x1, + 0x0, + 0x4, + 0xa, + 0x2, + 0x6, + 0x0, + 0x1, + 0x1, + 0xc, + 0xf, + 0x0, + 0x1, + 0x5, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x8, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x3, + 0x2, + 0x1, + 0x0, + 0x3, + 0x5, + 0x0, + 0x9, + 0x3, + 0x0, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x4, + 0x1, + 0x0, + 0x0, + 0x5, + 0x1, + 0x1f, + 0x5, + 0x4, + 0x0, + 0x3, + 0x2, + 0x15, + 0x7, + 0x0, + 0x0, + 0xc, + 0x0, + 0x0, + 0x0, + 0x4, + 0x7, + 0x2, + 0x9, + 0x0, + 0x9, + 0x1, + 0xc, + 0x3, + 0x1, + 0xa, + 0x0, + 0x0, + 0x4, + 0x0, + 0x2, + 0x7, + 0x4, + 0x0, + 0x0, + 0x2, + 0x0, + 0x2, + 0x3, + 0x0, + 0x0, + 0x4, + 0x0, + 0x2, + 0x1, + 0x0, + 0x7, + 0x0, + 0x1, + 0x5, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x6, + 0x7, + 0x0, + 0x0, + 0xb, + 0xe, + 0x6, + 0x4, + 0x0, + 0x0, + 0x0, + 0x2, + 0xc, + 0x1, + 0x1, + 0x3, + 0x3, + 0x9, + 0x0, + 0x1, + 0x5, + 0x2, + 0x4, + 0x0, + 0x4, + 0x1, + 0x0, + 0x4, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x9, + 0x6, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x3, + 0x2, + 0x1, + 0x5, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x7, + 0x0, + 0x2, + 0x7, + 0x2, + 0x4, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x5, + 0x6, + 0x1, + 0x0, + 0x4, + 0x2, + 0x4, + 0x1, + 0x0, + 0x5, + 0x1, + 0x0, + 0x6, + 0x0, + 0x0, + 0x1, + 0x5, + 0x0, + 0x1, + 0x8, + 0x3, + 0x0, + 0x4, + 0x4, + 0x9, + 0x1, + 0x2, + 0x0, + 0x1, + 0x1, + 0x0, + 0x1, + 0xe, + 0x2, + 0x1, + 0x0, + 0x4, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0x0, + 0x1, + 0x2, + 0x5, + 0x9, + 0x0, + 0x0, + 0x7, + 0x0, + 0x0, + 0x5, + 0x3, + 0x1, + 0x0, + 0x4, + 0xc, + 0x1, + 0xd, + 0x5, + 0x2, + 0x4, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x2, + 0x0, + 0x2, + 0x3, + 0x0, + 0x4, + 0x0, + 0x2, + 0x0, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x13, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x6, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x2, + 0x4, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x2, + 0x0, + 0x0, + 0x5, + 0x1, + 0x1, + 0x1, + 0x2, + 0x1, + 0x1, + 0x2, + 0x3, + 0x2, + 0x2, + 0x0, + 0x1, + 0x6, + 0x3, + 0x0, + 0x7, + 0x0, + 0x0, + 0x1, + 0x8, + 0x2, + 0x1, + 0x3, + 0x2, + 0x0, + 0x0, + 0x0, + 0x2, + 0xa, + 0x0, + 0x2, + 0x0, + 0xc, + 0x0, + 0x1, + 0x6, + 0x0, + 0x3, + 0xa, + 0x8, + 0x3, + 0x0, + 0x0, + 0x6, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x5, + 0x0, + 0x5, + 0x3, + 0x2, + 0x4, + 0x0, + 0x5, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x5, + 0x1, + 0x0, + 0x1, + 0x5, + 0x0, + 0x1, + 0x8, + 0x2, + 0x1, + 0x1, + 0x2, + 0x0, + 0x2, + 0x0, + 0x2, + 0x0, + 0x0, + 0x16, + 0x2, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x1, + 0x3, + 0x0, + 0x0, + 0x0, + 0x7, + 0x2, + 0x0, + 0x1, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x3, + 0x1, + 0x3, + 0x4, + 0x2, + 0x0, + 0x1, + 0x1, + 0x2, + 0x8, + 0x0, + 0x3, + 0x1, + 0x1, + 0x2, + 0xe, + 0x2, + 0x2, + 0x0, + 0x0, + 0x7, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x2, + 0x0, + 0x2, + 0x0, + 0x6, + 0x2, + 0x0, + 0x4, + 0x1, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0x1, + 0x8, + 0x2, + 0x5, + 0x0, + 0x7, + 0x0, + 0x2, + 0x0, + 0x9, + 0x0, + 0x0, + 0x6, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x3, + 0x2, + 0x3, + 0x3, + 0x0, + 0x3, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x4, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x3, + 0x3, + 0x2, + 0x0, + 0x0, + 0xa, + 0x1, + 0x0, + 0x2, + 0x2, + 0x10, + 0x0, + 0x2, + 0x2, + 0x1, + 0x4, + 0xa, + 0x5, + 0x1, + 0x1, + 0x0, + 0x1, + 0x6, + 0x5, + 0x0, + 0x2, + 0x4, + 0x2, + 0x3, + 0x0, + 0x9, + 0x0, + 0x13, + 0x8, + 0x0, + 0x0, + 0x1, + 0x0, + 0x6, + 0x9, + 0x1, + 0x0, + 0x0, + 0x5, + 0x0, + 0x3, + 0x0, + 0x2, + 0x4, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x7, + 0x1, + 0x3, + 0x0, + 0x2, + 0x5, + 0x1, + 0x3, + 0x5, + 0x5, + 0xc, + 0x1, + 0x2, + 0x0, + 0x0, + 0x4, + 0x1, + 0x0, + 0x0, + 0x1, + 0x12, + 0x1, + 0x1, + 0x6, + 0x2, + 0x0, + 0x9, + 0xa, + 0x2, + 0x1, + 0x4, + 0x2, + 0x0, + 0x5, + 0x1, + 0x1, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x12, + 0x2, + 0x0, + 0x2, + 0x6, + 0x0, + 0x4, + 0x5, + 0x3, + 0x6, + 0x2, + 0x1, + 0x1, + 0x2, + 0x7, + 0x1, + 0x0, + 0x0, + 0x2, + 0x5, + 0xd, + 0x0, + 0xa, + 0x4, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x1, + 0x7, + 0x2, + 0x6, + 0x2, + 0x1, + 0x1, + 0x2, + 0x14, + 0x5, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x2, + 0x2, + 0x0, + 0x1, + 0x2, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0x2, + 0x2, + 0x2, + 0x0, + 0x0, + 0x9, + 0x0, + 0x6, + 0x0, + 0x1, + 0x0, + 0x4, + 0x2, + 0x3, + 0x1, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x4, + 0x0, + 0x1, + 0x7, + 0x4, + 0x3, + 0x5, + 0x0, + 0x0, + 0x5, + 0x4, + 0x2, + 0x6, + 0x6, + 0x4, + 0x9, + 0x0, + 0x0, + 0x5, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x1, + 0x1, + 0x0, + 0x2, + 0x2, + 0x3, + 0x0, + 0x0, + 0x1, + 0x1, + 0x3, + 0x5, + 0x1, + 0x8, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x6, + 0x0, + 0x3, + 0x2, + 0x0, + 0x1, + 0x0, + 0x3, + 0x1, + 0x1, + 0x3, + 0x2, + 0x2, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x4, + 0x0, + 0xf, + 0x2, + 0x1, + 0x5, + 0x0, + 0x0, + 0x1, + 0x0, + 0x4, + 0x1, + 0x0, + 0x0, + 0x3, + 0x1, + 0x1, + 0x4, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x5, + 0xd, + 0x3, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x6, + 0x1, + 0x0, + 0x7, + 0x4, + 0x0, + 0x2, + 0x0, + 0x3, + 0x6, + 0x2, + 0x0, + 0x3, + 0x1, + 0x0, + 0x2, + 0x4, + 0x2, + 0x2, + 0x2, + 0x6, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x17, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x2, + 0x4, + 0x2, + 0x0, + 0x0, + 0xa, + 0x0, + 0x2, + 0x2, + 0x2, + 0x3, + 0x1, + 0x1, + 0x1, + 0x2, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0xb, + 0x1, + 0x1, + 0x1, + 0xb, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x7, + 0x0, + 0x0, + 0x1, + 0x14, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0x4, + 0x1, + 0xb, + 0x5, + 0xa, + 0x0, + 0x1, + 0x2, + 0x0, + 0x4, + 0x0, + 0x1, + 0x1, + 0x3, + 0x0, + 0x2, + 0x8, + 0x3, + 0x2, + 0x0, + 0x0, + 0x6, + 0x5, + 0x4, + 0x6, + 0x0, + 0x1, + 0x1, + 0x1, + 0x4, + 0x0, + 0x3, + 0x3, + 0x1, + 0x2, + 0xa, + 0x3, + 0x2, + 0x1, + 0x0, + 0x7, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x1, + 0x2, + 0x1, + 0x5, + 0x1, + 0x3, + 0x0, + 0x3, + 0x2, + 0x1, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x2, + 0x2, + 0x0, + 0x2, + 0x2, + 0x1, + 0x3, + 0x4, + 0x4, + 0x1, + 0x1, + 0x2, + 0x0, + 0x0, + 0x1, + 0x2, + 0x7, + 0x5, + 0x2, + 0x1, + 0x5, + 0x0, + 0x4, + 0x3, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x1, + 0x6, + 0x3, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x4, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x7, + 0x0, + 0x3, + 0x2, + 0x3, + 0x2, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x2, + 0x2, + 0xa, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x8, + 0xa, + 0x3, + 0x3, + 0x1, + 0x2, + 0x0, + 0x4, + 0x1, + 0x0, + 0x0, + 0x7, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x6, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x2, + 0xe, + 0x2, + 0x1, + 0x1, + 0x1, + 0x2, + 0x0, + 0x0, + 0x4, + 0x1, + 0x0, + 0x0, + 0x6, + 0x6, + 0x1, + 0x1, + 0x0, + 0x1, + 0x2, + 0x8, + 0x3, + 0x0, + 0x1, + 0x5, + 0x1, + 0x0, + 0x2, + 0x1, + 0x4, + 0x2, + 0x0, + 0x1, + 0x9, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x0, + 0x4, + 0x1, + 0x0, + 0x2, + 0x1, + 0x0, + 0x1, + 0x1, + 0x5, + 0x1, + 0x0, + 0x3, + 0x0, + 0x9, + 0x1, + 0x1, + 0x7, + 0x0, + 0x2, + 0x1, + 0x6, + 0x0, + 0x5, + 0x0, + 0x8, + 0x11, + 0x0, + 0x6, + 0x1, + 0x7, + 0x0, + 0x2, + 0x0, + 0x4, + 0x1, + 0x1, + 0x0, + 0x4, + 0x4, + 0x5, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x8, + 0x1, + 0x5, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x7, + 0x1, + 0x0, + 0x6, + 0x1, + 0x5, + 0xa, + 0x2, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x2, + 0x0, + 0x0, + 0x13, + 0x0, + 0x0, + 0x3, + 0x0, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0xb, + 0x1, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x3, + 0x1, + 0x1, + 0xd, + 0x3, + 0x5, + 0x1, + 0x0, + 0x1, + 0x7, + 0x0, + 0x3, + 0x1, + 0x1, + 0x8, + 0x0, + 0x3, + 0x8, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x5, + 0x2, + 0x2, + 0x2, + 0x0, + 0x2, + 0x1, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x1, + 0x2, + 0x5, + 0x0, + 0x3, + 0x2, + 0x0, + 0x2, + 0x0, + 0x0, + 0x4, + 0x0, + 0x1, + 0x3, + 0x5, + 0x0, + 0x2, + 0x1, + 0x8, + 0x1, + 0x3, + 0x1, + 0x0, + 0x8, + 0x3, + 0x1, + 0x4, + 0x0, + 0x0, + 0x1, + 0x7, + 0x0, + 0x2, + 0x0, + 0x7, + 0x2, + 0x0, + 0x1, + 0x1, + 0x1, + 0x6, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x3, + 0x2, + 0x1, + 0x0, + 0x3, + 0x1, + 0x1, + 0x1, + 0x0, + 0x2, + 0x1, + 0x3, + 0x2, + 0x0, + 0x1, + 0x1, + 0x2, + 0x1, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x3, + 0x2, + 0x4, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x1, + 0x5, + 0x3, + 0x0, + 0x0, + 0x2, + 0x4, + 0x9, + 0x0, + 0x5, + 0x3, + 0x1, + 0x0, + 0x1, + 0x3, + 0x2, + 0x3, + 0x1, + 0x1, + 0x0, + 0x3, + 0x1, + 0x1, + 0x2, + 0x1, + 0x2, + 0x0, + 0x3, + 0x7, + 0x1, + 0x1, + 0x0, + 0x1, + 0x2, + 0x3, + 0x0, + 0xe, + 0x2, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x2, + 0x3, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0xa, + 0x0, + 0x0, + 0x0, + 0x3, + 0x3, + 0x2, + 0x7, + 0x1, + 0x1, + 0x1, + 0x2, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x3, + 0x2, + 0x0, + 0x2, + 0x3, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x3, + 0x5, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x3, + 0x0, + 0x3, + 0x1, + 0x0, + 0x2, + 0x7, + 0x1, + 0x1, + 0x2, + 0x7, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x4, + 0x2, + 0x2, + 0x7, + 0x2, + 0x4, + 0x2, + 0x1, + 0x5, + 0x2, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x6, + 0x0, + 0x0, + 0x5, + 0x5, + 0x1, + 0x1, + 0x4, + 0x2, + 0x0, + 0x0, + 0x0, + 0x3, + 0x3, + 0x1, + 0x1, + 0x5, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x4, + 0x2, + 0x0, + 0x0, + 0x0, + 0x4, + 0x2, + 0x1, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x3, + 0x2, + 0x3, + 0x0, + 0x1, + 0x0, + 0x3, + 0x4, + 0x5, + 0x0, + 0x1, + 0x1, + 0x1, + 0x3, + 0xa, + 0x1, + 0x3, + 0x1, + 0x0, + 0x1, + 0x2, + 0x3, + 0x7, + 0x0, + 0x3, + 0x1, + 0x1, + 0x0, + 0x3, + 0x0, + 0x8, + 0xa, + 0x1, + 0x3, + 0x0, + 0x0, + 0x1, + 0x4, + 0x0, + 0x7, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x3, + 0x5, + 0x0, + 0x1, + 0x1, + 0x4, + 0x4, + 0x0, + 0x0, + 0x5, + 0x1, + 0x1, + 0x3, + 0x0, + 0x4, + 0x1, + 0x2, + 0x4, + 0x2, + 0x3, + 0x0, + 0x2, + 0x1, + 0x1, + 0x2, + 0x0, + 0x2, + 0x1, + 0x1, + 0x1, + 0x3, + 0x1, + 0x4, + 0x3, + 0x20, + 0x4, + 0x0, + 0x1, + 0x0, + 0x5, + 0x0, + 0x3, + 0x2, + 0x1, + 0x0, + 0x2, + 0x4, + 0x5, + 0x0, + 0x2, + 0x6, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x5, + 0x0, + 0x0, + 0x3, + 0x4, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x1, + 0x5, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x2, + 0x3, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x7, + 0x3, + 0x0, + 0x5, + 0x6, + 0x0, + 0x2, + 0x0, + 0x2, + 0x1, + 0x1, + 0x4, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x4, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x3, + 0xf, + 0x0, + 0x3, + 0x0, + 0x2, + 0x0, + 0x3, + 0x2, + 0x5, + 0x2, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x1, + 0x6, + 0x1, + 0x0, + 0x1, + 0x3, + 0x0, + 0x1, + 0x3, + 0x0, + 0x2, + 0x1, + 0x3, + 0x4, + 0x4, + 0x1, + 0x1, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x3, + 0x3, + 0x2, + 0x1, + 0x0, + 0x4, + 0x2, + 0x2, + 0x4, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x2, + 0x1, + 0x0, + 0x2, + 0x0, + 0x3, + 0x7, + 0x1, + 0x4, + 0x1, + 0x3, + 0x1, + 0x1, + 0x5, + 0x5, + 0x0, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x1, + 0x3, + 0x0, + 0x0, + 0x1, + 0x1, + 0x2, + 0x0, + 0x3, + 0x0, + 0x1, + 0x7, + 0x2, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x5, + 0xd, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x5, + 0x0, + 0x1, + 0x3, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x1, + 0x0, + 0x2, + 0x3, + 0x1, + 0x1, + 0x0, + 0x2, + 0x5, + 0x1, + 0x3, + 0x1, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x2, + 0x2, + 0x3, + 0x1, + 0x0, + 0x1, + 0x6, + 0x0, + 0x1, + 0x4, + 0x0, + 0x1, + 0x0, + 0x6, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x6, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x1, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x2, + 0x0, + 0x0, + 0x0, + 0x2, + 0x3, + 0x1, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x2, + 0x2, + 0x2, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x1, + 0x0, + 0x4, + 0x1, + 0x1, + 0x1, + 0x1, + 0x1, + 0x0, + 0x1, + 0x4, + 0x1, + 0x1, + 0x1, + 0x0, + 0x7, + 0x0, + 0x0, + 0x3, + 0x4, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x5, + 0x0, + 0x3, + 0x4, + 0x3, + 0x0, + 0x1, + 0x2, + 0x1, + 0x2, + 0x1, + 0x1, + 0x4, + 0x4, + 0x2, + 0x2, + 0x2, + 0x5, + 0x0, + 0x3, + 0x1, + 0x2, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x2, + 0x0, + 0x4, + 0x1, + 0x0, + 0x1, + 0x4, + 0x1, + 0x0, + 0x5, + 0x4, + 0x3, + 0x1, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x3, + 0x7, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x9, + 0x1, + 0x3, + 0x3, + 0x1, + 0x0, + 0x3, + 0x0, + 0x2, + 0x1, + 0x1, + 0x1, + 0x1, + 0x1, + 0x1, + 0x1, + 0x3, + 0x1, + 0x0, + 0x0, + 0x8, + 0x2, + 0x3, + 0x1, + 0x2, + 0x1, + 0x3, + 0x0, + 0x3, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x3, + 0x6, + 0x4, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1, + 0x4, + 0x1, + 0x1, + 0x0, + 0x5, + 0x1, + 0x0, +]; +pub(crate) const COMPATIBILITY_DECOMPOSED_KV: &[(u32, &'static [char])] = &[ + (0x2f1f, &['\u{571F}']), + (0x1d430, &['\u{0077}']), + (0xfca0, &['\u{0628}', '\u{0647}']), + (0x1d769, &['\u{03A4}']), + (0x1d59, &['\u{1D1D}']), + (0xfd72, &['\u{0637}', '\u{0645}', '\u{062D}']), + (0x1d5a3, &['\u{0044}']), + (0x1d4e2, &['\u{0053}']), + (0xfbae, &['\u{06D2}']), + (0x3396, &['\u{006D}', '\u{006C}']), + (0x1d51a, &['\u{0057}']), + (0x1d600, &['\u{0073}']), + (0xfcff, &['\u{062D}', '\u{0649}']), + (0xffea, &['\u{2191}']), + (0x1d4b1, &['\u{0056}']), + (0x207d, &['\u{0028}']), + (0x1d5e0, &['\u{004D}']), + (0x1ee6e, &['\u{0633}']), + (0xfbec, &['\u{064A}', '\u{0654}', '\u{06D5}']), + (0x33de, &['\u{0056}', '\u{2215}', '\u{006D}']), + (0x2177, &['\u{0076}', '\u{0069}', '\u{0069}', '\u{0069}']), + (0x1d4d3, &['\u{0044}']), + (0x1ee8e, &['\u{0633}']), + (0x1d695, &['\u{006C}']), + (0xfed8, &['\u{0642}']), + (0xfb7f, &['\u{0687}']), + (0x247f, &['\u{0028}', '\u{0031}', '\u{0032}', '\u{0029}']), + (0x33e0, &['\u{0031}', '\u{65E5}']), + (0x2f0e, &['\u{51AB}']), + (0xffac, &['\u{11B2}']), + (0xff9b, &['\u{30ED}']), + (0x2f4f, &['\u{6BCB}']), + (0x1d4cb, &['\u{0076}']), + (0x2148, &['\u{0069}']), + (0x338a, &['\u{0070}', '\u{0046}']), + (0x1d73c, &['\u{03B7}']), + (0x1da8, &['\u{029D}']), + (0xfeba, &['\u{0635}']), + (0xff54, &['\u{0074}']), + (0x1d48e, &['\u{006D}']), + (0x1ee10, &['\u{0641}']), + (0x1eeb3, &['\u{0631}']), + (0x1d44e, &['\u{0061}']), + (0x1d580, &['\u{0055}']), + (0x1d7b4, &['\u{03BB}']), + (0x2f4e, &['\u{6BB3}']), + (0x1d594, &['\u{006F}']), + (0x3224, &['\u{0028}', '\u{4E94}', '\u{0029}']), + (0xffdb, &['\u{1174}']), + (0x1d7ff, &['\u{0039}']), + (0x3132, &['\u{1101}']), + (0xfee9, &['\u{0647}']), + (0x2fa2, &['\u{9091}']), + (0xffbb, &['\u{110F}']), + (0x1d46e, &['\u{0047}']), + (0xfc7e, &['\u{0642}', '\u{0649}']), + (0x1d560, &['\u{006F}']), + (0xfd05, &['\u{0635}', '\u{0649}']), + (0x325b, &['\u{0033}', '\u{0031}']), + (0x1d77d, &['\u{03BE}']), + (0x2170, &['\u{0069}']), + (0x1d681, &['\u{0052}']), + (0x3382, &['\u{03BC}', '\u{0041}']), + (0x1d60a, &['\u{0043}']), + (0xfbaf, &['\u{06D2}']), + (0x2f24, &['\u{5927}']), + (0x213f, &['\u{03A0}']), + (0x1d43, &['\u{0061}']), + (0xfec2, &['\u{0637}']), + (0x33d5, &['\u{006D}', '\u{0069}', '\u{006C}']), + (0xfb67, &['\u{0679}']), + (0x1d446, &['\u{0053}']), + (0x1d7a1, &['\u{0398}']), + (0x2f7b, &['\u{7FBD}']), + (0xff7d, &['\u{30B9}']), + (0xfea2, &['\u{062D}']), + (0xfca7, &['\u{062C}', '\u{062D}']), + (0x1d484, &['\u{0063}']), + (0xfc19, &['\u{062E}', '\u{062C}']), + (0xfd99, &['\u{0646}', '\u{062C}', '\u{0649}']), + (0xfb78, &['\u{0683}']), + (0xfe58, &['\u{2014}']), + (0x32ee, &['\u{30DE}']), + (0x1f236, &['\u{6709}']), + (0x1d466, &['\u{0079}']), + (0x32bb, &['\u{0034}', '\u{0036}']), + (0x1f14e, &['\u{0050}', '\u{0050}', '\u{0056}']), + (0x1ee37, &['\u{062E}']), + (0x2490, &['\u{0039}', '\u{002E}']), + (0xff8a, &['\u{30CF}']), + (0x1d576, &['\u{004B}']), + (0xff6a, &['\u{30A7}']), + (0xff40, &['\u{0060}']), + (0x1f124, &['\u{0028}', '\u{0055}', '\u{0029}']), + (0x2db, &['\u{0020}', '\u{0328}']), + (0x3230, &['\u{0028}', '\u{65E5}', '\u{0029}']), + (0x1d5cd, &['\u{0074}']), + (0x1d7b1, &['\u{03B8}']), + (0x2f26, &['\u{5B50}']), + (0x323a, &['\u{0028}', '\u{547C}', '\u{0029}']), + (0x1d706, &['\u{03BB}']), + (0x33cf, &['\u{006B}', '\u{0074}']), + (0x325a, &['\u{0033}', '\u{0030}']), + (0xfb8e, &['\u{06A9}']), + (0xfe5b, &['\u{007B}']), + (0x1d5b6, &['\u{0057}']), + (0xfd3b, &['\u{0638}', '\u{0645}']), + (0x1ee4e, &['\u{0633}']), + (0xfe98, &['\u{062A}']), + (0x1d5ea, &['\u{0057}']), + (0x1d563, &['\u{0072}']), + (0x334c, &['\u{30E1}', '\u{30AB}', '\u{3099}', '\u{30C8}', '\u{30F3}']), + (0xfee2, &['\u{0645}']), + (0x1f141, &['\u{0052}']), + (0x2f06, &['\u{4E8C}']), + (0x32cf, &['\u{004C}', '\u{0054}', '\u{0044}']), + (0x2466, &['\u{0037}']), + (0xfb13, &['\u{0574}', '\u{0576}']), + (0x1d49c, &['\u{0041}']), + (0x1d63c, &['\u{0041}']), + (0x1f220, &['\u{521D}']), + (0x2f8b, &['\u{8278}']), + (0x2048, &['\u{003F}', '\u{0021}']), + (0x32d5, &['\u{30AB}']), + (0x1d423, &['\u{006A}']), + (0xfc49, &['\u{0645}', '\u{0649}']), + (0x32d3, &['\u{30A8}']), + (0xff53, &['\u{0073}']), + (0x222c, &['\u{222B}', '\u{222B}']), + (0x248a, &['\u{0033}', '\u{002E}']), + (0x32c6, &['\u{0037}', '\u{6708}']), + (0x208c, &['\u{003D}']), + (0x1d680, &['\u{0051}']), + (0xfb71, &['\u{06A6}']), + (0x1d773, &['\u{03B4}']), + (0xfc09, &['\u{0628}', '\u{0649}']), + (0xfcd7, &['\u{0647}', '\u{062C}']), + (0x1d46d, &['\u{0046}']), + (0x2f74, &['\u{7ACB}']), + (0xfbe5, &['\u{06D0}']), + (0x32b1, &['\u{0033}', '\u{0036}']), + (0xfda0, &['\u{062A}', '\u{062C}', '\u{0649}']), + (0x1da0, &['\u{0066}']), + (0x1d50e, &['\u{004B}']), + (0xfca8, &['\u{062C}', '\u{0645}']), + (0x1d7a2, &['\u{03A3}']), + (0x3261, &['\u{1102}']), + (0x1d51, &['\u{014B}']), + (0x1d6c8, &['\u{03B7}']), + (0x1d51f, &['\u{0062}']), + (0x1d689, &['\u{005A}']), + (0x1d793, &['\u{0394}']), + (0x319e, &['\u{5730}']), + (0x3282, &['\u{4E09}']), + (0x3374, &['\u{0062}', '\u{0061}', '\u{0072}']), + (0x3194, &['\u{4E09}']), + (0xffad, &['\u{11B3}']), + (0x1f139, &['\u{004A}']), + (0x2f59, &['\u{723F}']), + (0x3290, &['\u{65E5}']), + (0x1d429, &['\u{0070}']), + (0x3246, &['\u{6587}']), + (0x1d5c6, &['\u{006D}']), + (0x1d45c, &['\u{006F}']), + (0x1d7b5, &['\u{03BC}']), + (0x2f11, &['\u{5200}']), + (0x2fb4, &['\u{9801}']), + (0x1d781, &['\u{03C2}']), + (0x1ee21, &['\u{0628}']), + (0x1ee47, &['\u{062D}']), + (0xff43, &['\u{0063}']), + (0x316f, &['\u{11DD}']), + (0xfef7, &['\u{0644}', '\u{0627}', '\u{0654}']), + (0x1d7aa, &['\u{03B1}']), + (0x2f7d, &['\u{800C}']), + (0x207c, &['\u{003D}']), + (0x33ec, &['\u{0031}', '\u{0033}', '\u{65E5}']), + (0x1d6db, &['\u{2202}']), + (0x2fb0, &['\u{9769}']), + (0x1ee0f, &['\u{0639}']), + (0x33ee, &['\u{0031}', '\u{0035}', '\u{65E5}']), + (0x3202, &['\u{0028}', '\u{1103}', '\u{0029}']), + (0x1d4d2, &['\u{0043}']), + (0x1d694, &['\u{006B}']), + (0x1d7b9, &['\u{03C0}']), + (0x3299, &['\u{79D8}']), + (0x1d6b6, &['\u{039F}']), + (0x338f, &['\u{006B}', '\u{0067}']), + (0x1d7ea, &['\u{0038}']), + (0x1d4b0, &['\u{0055}']), + (0x315d, &['\u{116F}']), + (0x33d9, &['\u{0050}', '\u{0050}', '\u{004D}']), + (0x1d5a8, &['\u{0049}']), + (0x24d5, &['\u{0066}']), + (0x1d510, &['\u{004D}']), + (0xfcae, &['\u{0633}', '\u{062D}']), + (0x2121, &['\u{0054}', '\u{0045}', '\u{004C}']), + (0xfd5a, &['\u{062D}', '\u{0645}', '\u{064A}']), + (0x1d41e, &['\u{0065}']), + (0x1d514, &['\u{0051}']), + (0xff85, &['\u{30CA}']), + (0xfdc1, &['\u{0641}', '\u{0645}', '\u{064A}']), + (0x1d6d2, &['\u{03C1}']), + (0xfc72, &['\u{062A}', '\u{0645}']), + (0x1d7fd, &['\u{0037}']), + (0xfd94, &['\u{0647}', '\u{0645}', '\u{0645}']), + (0x1d76c, &['\u{03A7}']), + (0x333e, &['\u{30DB}', '\u{3099}', '\u{30EB}', '\u{30C8}']), + (0x1d67a, &['\u{004B}']), + (0x217e, &['\u{0064}']), + (0x2b7, &['\u{0077}']), + (0x1d458, &['\u{006B}']), + (0xfbfa, &['\u{064A}', '\u{0654}', '\u{0649}']), + (0xfeb3, &['\u{0633}']), + (0xfb5f, &['\u{067A}']), + (0xfb79, &['\u{0683}']), + (0x315a, &['\u{116C}']), + (0x1d4a9, &['\u{004E}']), + (0x1d47a, &['\u{0053}']), + (0x1c4, &['\u{0044}', '\u{005A}', '\u{030C}']), + (0x3156, &['\u{1168}']), + (0x24c8, &['\u{0053}']), + (0x1d418, &['\u{0059}']), + (0x2f6c, &['\u{76EE}']), + (0x1d475, &['\u{004E}']), + (0x1d768, &['\u{03A3}']), + (0x1d6d7, &['\u{03C6}']), + (0x1f22e, &['\u{53F3}']), + (0x1d7c9, &['\u{03C0}']), + (0x2086, &['\u{0036}']), + (0x1d64, &['\u{0075}']), + (0x2006, &['\u{0020}']), + (0xfc69, &['\u{064A}', '\u{0654}', '\u{064A}']), + (0x1d5fa, &['\u{006D}']), + (0x2f0a, &['\u{5165}']), + (0xfe4a, &['\u{0020}', '\u{0305}']), + (0xfe6a, &['\u{0025}']), + (0x1d6c2, &['\u{03B1}']), + (0xfd7d, &['\u{0641}', '\u{062E}', '\u{0645}']), + (0x3370, &['\u{0032}', '\u{0034}', '\u{70B9}']), + (0x326f, &['\u{1102}', '\u{1161}']), + (0x3183, &['\u{11F2}']), + (0xfb00, &['\u{0066}', '\u{0066}']), + (0xff12, &['\u{0032}']), + (0x1d439, &['\u{0046}']), + (0x1d5ff, &['\u{0072}']), + (0x1ee1b, &['\u{063A}']), + (0xfcee, &['\u{0646}', '\u{0645}']), + (0xfbf6, &['\u{064A}', '\u{0654}', '\u{06D0}']), + (0x1d4be, &['\u{0069}']), + (0x2f8f, &['\u{884C}']), + (0x1f211, &['\u{5B57}']), + (0x3182, &['\u{11F1}']), + (0x1d760, &['\u{039B}']), + (0xfe5e, &['\u{3015}']), + (0x1ee32, &['\u{0642}']), + (0x3225, &['\u{0028}', '\u{516D}', '\u{0029}']), + (0xfb03, &['\u{0066}', '\u{0066}', '\u{0069}']), + (0x1ee15, &['\u{062A}']), + (0x1d4af, &['\u{0054}']), + (0x24c7, &['\u{0052}']), + (0x1d7ed, &['\u{0031}']), + (0x1d63b, &['\u{007A}']), + (0x303a, &['\u{5345}']), + (0x1d486, &['\u{0065}']), + (0x2467, &['\u{0038}']), + (0x2fc8, &['\u{9EC3}']), + (0x1d4d9, &['\u{004A}']), + (0x3d1, &['\u{03B8}']), + (0xfce9, &['\u{0634}', '\u{0645}']), + (0x32cd, &['\u{0065}', '\u{0072}', '\u{0067}']), + (0xfb54, &['\u{067B}']), + (0x1d7de, &['\u{0036}']), + (0x2496, &['\u{0031}', '\u{0035}', '\u{002E}']), + (0x217b, &['\u{0078}', '\u{0069}', '\u{0069}']), + (0x3390, &['\u{0048}', '\u{007A}']), + (0x338b, &['\u{006E}', '\u{0046}']), + (0xfc75, &['\u{062A}', '\u{064A}']), + (0xfc6b, &['\u{0628}', '\u{0632}']), + (0x1eea8, &['\u{0637}']), + (0x24af, &['\u{0028}', '\u{0074}', '\u{0029}']), + (0x1f223, &['\u{8CA9}']), + (0xff7a, &['\u{30B3}']), + (0xff95, &['\u{30E6}']), + (0xfdac, &['\u{0644}', '\u{062C}', '\u{064A}']), + (0x33c3, &['\u{0042}', '\u{0071}']), + (0x32f2, &['\u{30E2}']), + (0x3308, &['\u{30A8}', '\u{30FC}', '\u{30AB}', '\u{30FC}']), + (0x1f241, &['\u{3014}', '\u{4E09}', '\u{3015}']), + (0x1d2e, &['\u{0042}']), + (0x1d40f, &['\u{0050}']), + (0x3f1, &['\u{03C1}']), + (0x2078, &['\u{0038}']), + (0x1d66c, &['\u{0077}']), + (0xfb8d, &['\u{0691}']), + (0x320b, &['\u{0028}', '\u{1110}', '\u{0029}']), + (0x1d6d6, &['\u{03C5}']), + (0x1d573, &['\u{0048}']), + (0x1d6c9, &['\u{03B8}']), + (0x3330, &['\u{30D2}', '\u{309A}', '\u{30B3}']), + (0x2093, &['\u{0078}']), + (0x1d43d, &['\u{004A}']), + (0xff9a, &['\u{30EC}']), + (0xfb21, &['\u{05D0}']), + (0xfc26, &['\u{0637}', '\u{062D}']), + (0x2f20, &['\u{58EB}']), + (0x3294, &['\u{540D}']), + (0x339a, &['\u{006E}', '\u{006D}']), + (0xfcbc, &['\u{063A}', '\u{062C}']), + (0x314c, &['\u{1110}']), + (0x321e, &['\u{0028}', '\u{110B}', '\u{1169}', '\u{1112}', '\u{116E}', '\u{0029}']), + (0xfb8b, &['\u{0698}']), + (0x212c, &['\u{0042}']), + (0x1d687, &['\u{0058}']), + (0x1d488, &['\u{0067}']), + (0x2f68, &['\u{7676}']), + (0xfe83, &['\u{0627}', '\u{0654}']), + (0x1d59c, &['\u{0077}']), + (0xfd55, &['\u{062A}', '\u{0645}', '\u{062C}']), + (0x1f145, &['\u{0056}']), + (0x1d5d2, &['\u{0079}']), + (0x3328, &['\u{30CA}', '\u{30CE}']), + (0xff97, &['\u{30E9}']), + (0x216c, &['\u{004C}']), + (0xfd35, &['\u{0633}', '\u{062D}']), + (0x1d796, &['\u{0397}']), + (0x2fb7, &['\u{98DF}']), + (0xfcdd, &['\u{064A}', '\u{0645}']), + (0xfe38, &['\u{007D}']), + (0x1ee72, &['\u{0642}']), + (0x1d5d3, &['\u{007A}']), + (0x33c6, &['\u{0043}', '\u{2215}', '\u{006B}', '\u{0067}']), + (0x330f, &['\u{30AB}', '\u{3099}', '\u{30F3}', '\u{30DE}']), + (0x32eb, &['\u{30D5}']), + (0xfef5, &['\u{0644}', '\u{0627}', '\u{0653}']), + (0xfd56, &['\u{062A}', '\u{0645}', '\u{062D}']), + (0x1d44c, &['\u{0059}']), + (0x1d5f3, &['\u{0066}']), + (0x2479, &['\u{0028}', '\u{0036}', '\u{0029}']), + (0xfb92, &['\u{06AF}']), + (0x2098, &['\u{006D}']), + (0x1fdf, &['\u{0020}', '\u{0314}', '\u{0342}']), + (0xfed5, &['\u{0642}']), + (0xfc1f, &['\u{0633}', '\u{0645}']), + (0xfc18, &['\u{062D}', '\u{0645}']), + (0x3140, &['\u{111A}']), + (0xfeac, &['\u{0630}']), + (0x3155, &['\u{1167}']), + (0xfcc0, &['\u{0641}', '\u{062E}']), + (0x1dbb, &['\u{007A}']), + (0x33bd, &['\u{006D}', '\u{0057}']), + (0x1d666, &['\u{0071}']), + (0x2124, &['\u{005A}']), + (0x3d0, &['\u{03B2}']), + (0x33d2, &['\u{006C}', '\u{006F}', '\u{0067}']), + (0x1f112, &['\u{0028}', '\u{0043}', '\u{0029}']), + (0x1d37, &['\u{004B}']), + (0x2057, &['\u{2032}', '\u{2032}', '\u{2032}', '\u{2032}']), + (0x2105, &['\u{0063}', '\u{002F}', '\u{006F}']), + (0x1d65a, &['\u{0065}']), + (0xfee5, &['\u{0646}']), + (0x385, &['\u{0020}', '\u{0308}', '\u{0301}']), + (0x2f71, &['\u{79B8}']), + (0x1f103, &['\u{0032}', '\u{002C}']), + (0xfe13, &['\u{003A}']), + (0x1d7ab, &['\u{03B2}']), + (0x3203, &['\u{0028}', '\u{1105}', '\u{0029}']), + (0x1d7d7, &['\u{0039}']), + (0x1d476, &['\u{004F}']), + (0x33dc, &['\u{0053}', '\u{0076}']), + (0xfcb4, &['\u{0636}', '\u{062C}']), + (0xff49, &['\u{0069}']), + (0x32a6, &['\u{4E0B}']), + (0xfea6, &['\u{062E}']), + (0x32ac, &['\u{76E3}']), + (0x1d51b, &['\u{0058}']), + (0xff1e, &['\u{003E}']), + (0xffe6, &['\u{20A9}']), + (0xffc7, &['\u{1166}']), + (0xaa, &['\u{0061}']), + (0xffee, &['\u{25CB}']), + (0x1d777, &['\u{03B8}']), + (0xfcd2, &['\u{0646}', '\u{062C}']), + (0x1d5de, &['\u{004B}']), + (0xfba9, &['\u{06C1}']), + (0x1d47b, &['\u{0054}']), + (0x1f227, &['\u{6295}']), + (0xfd71, &['\u{0637}', '\u{0645}', '\u{062D}']), + (0x207b, &['\u{2212}']), + (0x33d6, &['\u{006D}', '\u{006F}', '\u{006C}']), + (0x3345, &['\u{30DE}', '\u{30C3}', '\u{30CF}']), + (0x1ee5b, &['\u{063A}']), + (0x2f5c, &['\u{725B}']), + (0x1d472, &['\u{004B}']), + (0x1d41c, &['\u{0063}']), + (0x1f235, &['\u{6E80}']), + (0x1d6de, &['\u{03BA}']), + (0x677, &['\u{06C7}', '\u{0674}']), + (0x1d7c2, &['\u{03C9}']), + (0x2fa3, &['\u{9149}']), + (0xfd59, &['\u{062C}', '\u{0645}', '\u{062D}']), + (0xfe34, &['\u{005F}']), + (0xff22, &['\u{0042}']), + (0x1d501, &['\u{0078}']), + (0x1d799, &['\u{039A}']), + (0x1d75d, &['\u{0398}']), + (0x1d492, &['\u{0071}']), + (0x1f147, &['\u{0058}']), + (0xfbf9, &['\u{064A}', '\u{0654}', '\u{0649}']), + (0x1d6d8, &['\u{03C7}']), + (0x1d4ac, &['\u{0051}']), + (0xfecd, &['\u{063A}']), + (0x1d726, &['\u{039B}']), + (0xfc2c, &['\u{063A}', '\u{0645}']), + (0x1d74a, &['\u{03C5}']), + (0x1d6f3, &['\u{0398}']), + (0xfce7, &['\u{0633}', '\u{0645}']), + (0x322e, &['\u{0028}', '\u{91D1}', '\u{0029}']), + (0x33b1, &['\u{006E}', '\u{0073}']), + (0x3154, &['\u{1166}']), + (0xfe89, &['\u{064A}', '\u{0654}']), + (0x2047, &['\u{003F}', '\u{003F}']), + (0x3266, &['\u{1109}']), + (0x1d7b2, &['\u{03B9}']), + (0xfed0, &['\u{063A}']), + (0x2fce, &['\u{9F13}']), + (0xffdc, &['\u{1175}']), + (0x1ee4d, &['\u{0646}']), + (0x1f214, &['\u{4E8C}']), + (0x2485, &['\u{0028}', '\u{0031}', '\u{0038}', '\u{0029}']), + (0x2ef3, &['\u{9F9F}']), + (0xffe2, &['\u{00AC}']), + (0x222f, &['\u{222E}', '\u{222E}']), + (0x336d, &['\u{0032}', '\u{0031}', '\u{70B9}']), + (0x1d70a, &['\u{03BF}']), + (0x2fb3, &['\u{97F3}']), + (0x24e8, &['\u{0079}']), + (0x1ee82, &['\u{062C}']), + (0xffa6, &['\u{11AD}']), + (0x3303, &['\u{30A2}', '\u{30FC}', '\u{30EB}']), + (0x24ac, &['\u{0028}', '\u{0071}', '\u{0029}']), + (0x2470, &['\u{0031}', '\u{0037}']), + (0x1eea3, &['\u{062F}']), + (0xff8b, &['\u{30D2}']), + (0xfb70, &['\u{06A6}']), + (0x320f, &['\u{0028}', '\u{1102}', '\u{1161}', '\u{0029}']), + (0x3281, &['\u{4E8C}']), + (0x1d79c, &['\u{039D}']), + (0xffa0, &['\u{1160}']), + (0x1d78c, &['\u{03BA}']), + (0xff0d, &['\u{002D}']), + (0x1d7c0, &['\u{03C7}']), + (0x587, &['\u{0565}', '\u{0582}']), + (0x24da, &['\u{006B}']), + (0x1d58, &['\u{0075}']), + (0xfdbc, &['\u{0644}', '\u{062C}', '\u{0645}']), + (0x2471, &['\u{0031}', '\u{0038}']), + (0x20a8, &['\u{0052}', '\u{0073}']), + (0x32e2, &['\u{30C6}']), + (0x2c7d, &['\u{0056}']), + (0x3312, &['\u{30AD}', '\u{30E5}', '\u{30EA}', '\u{30FC}']), + (0x329d, &['\u{512A}']), + (0x1d3e, &['\u{0050}']), + (0x325f, &['\u{0033}', '\u{0035}']), + (0x1d4f, &['\u{006B}']), + (0x320c, &['\u{0028}', '\u{1111}', '\u{0029}']), + (0xffaf, &['\u{11B5}']), + (0x1d406, &['\u{0047}']), + (0xfcca, &['\u{0644}', '\u{062D}']), + (0x2d6f, &['\u{2D61}']), + (0x33e1, &['\u{0032}', '\u{65E5}']), + (0x1d415, &['\u{0056}']), + (0x1d770, &['\u{03B1}']), + (0x1ee49, &['\u{064A}']), + (0x1d79f, &['\u{03A0}']), + (0xfca5, &['\u{062A}', '\u{0647}']), + (0xff13, &['\u{0033}']), + (0x3253, &['\u{0032}', '\u{0033}']), + (0xfed6, &['\u{0642}']), + (0x1d6b2, &['\u{039B}']), + (0xfdfc, &['\u{0631}', '\u{06CC}', '\u{0627}', '\u{0644}']), + (0xff46, &['\u{0066}']), + (0x3343, &['\u{30DE}', '\u{30A4}', '\u{30AF}', '\u{30ED}']), + (0x3322, &['\u{30BB}', '\u{30F3}', '\u{30C1}']), + (0xfcfa, &['\u{063A}', '\u{064A}']), + (0xfd28, &['\u{0634}', '\u{0645}']), + (0x1d7f3, &['\u{0037}']), + (0x3376, &['\u{0070}', '\u{0063}']), + (0x1f202, &['\u{30B5}']), + (0x1d619, &['\u{0052}']), + (0xfcd4, &['\u{0646}', '\u{062E}']), + (0x33c8, &['\u{0064}', '\u{0042}']), + (0x32ca, &['\u{0031}', '\u{0031}', '\u{6708}']), + (0x1ee0b, &['\u{0644}']), + (0xfdc7, &['\u{0646}', '\u{062C}', '\u{064A}']), + (0xffc5, &['\u{1164}']), + (0x1d6dc, &['\u{03B5}']), + (0x2106, &['\u{0063}', '\u{002F}', '\u{0075}']), + (0xfe9b, &['\u{062B}']), + (0xfd08, &['\u{0636}', '\u{064A}']), + (0xfc7b, &['\u{062B}', '\u{064A}']), + (0x2025, &['\u{002E}', '\u{002E}']), + (0xfe17, &['\u{3016}']), + (0x330d, &['\u{30AB}', '\u{30ED}', '\u{30EA}', '\u{30FC}']), + (0x1d4d4, &['\u{0045}']), + (0xfb5a, &['\u{0680}']), + (0x1d648, &['\u{004D}']), + (0x33bb, &['\u{006E}', '\u{0057}']), + (0x328e, &['\u{91D1}']), + (0x1d795, &['\u{0396}']), + (0x2488, &['\u{0031}', '\u{002E}']), + (0xfc4c, &['\u{0646}', '\u{062D}']), + (0x1d597, &['\u{0072}']), + (0xfce3, &['\u{062A}', '\u{0645}']), + (0x314d, &['\u{1111}']), + (0x2f87, &['\u{821B}']), + (0xfc9b, &['\u{064A}', '\u{0654}', '\u{0647}']), + (0x3173, &['\u{1120}']), + (0xff78, &['\u{30AF}']), + (0xfce0, &['\u{064A}', '\u{0654}', '\u{0647}']), + (0x1d4e7, &['\u{0058}']), + (0x676, &['\u{0648}', '\u{0674}']), + (0x1d5be, &['\u{0065}']), + (0x1d60c, &['\u{0045}']), + (0xedd, &['\u{0EAB}', '\u{0EA1}']), + (0x2f5d, &['\u{72AC}']), + (0x1d46b, &['\u{0044}']), + (0xff24, &['\u{0044}']), + (0x1d605, &['\u{0078}']), + (0xfe49, &['\u{0020}', '\u{0305}']), + (0xffcf, &['\u{116C}']), + (0x2f0b, &['\u{516B}']), + (0xfdf2, &['\u{0627}', '\u{0644}', '\u{0644}', '\u{0647}']), + (0x1d60f, &['\u{0048}']), + (0xfef3, &['\u{064A}']), + (0x1d616, &['\u{004F}']), + (0x1fc0, &['\u{0020}', '\u{0342}']), + (0xfee7, &['\u{0646}']), + (0x3d2, &['\u{03A5}']), + (0x1d524, &['\u{0067}']), + (0xfebd, &['\u{0636}']), + (0x2f2b, &['\u{5C38}']), + (0x33fb, &['\u{0032}', '\u{0038}', '\u{65E5}']), + (0x2f7f, &['\u{8033}']), + (0x24df, &['\u{0070}']), + (0x1f148, &['\u{0059}']), + (0x1ee2c, &['\u{0645}']), + (0x212d, &['\u{0043}']), + (0x2475, &['\u{0028}', '\u{0032}', '\u{0029}']), + (0x1f222, &['\u{751F}']), + (0x1c7, &['\u{004C}', '\u{004A}']), + (0x1d57b, &['\u{0050}']), + (0x1d608, &['\u{0041}']), + (0x33b6, &['\u{03BC}', '\u{0056}']), + (0x2079, &['\u{0039}']), + (0x1d5e8, &['\u{0055}']), + (0x1d62f, &['\u{006E}']), + (0x2175, &['\u{0076}', '\u{0069}']), + (0xff3b, &['\u{005B}']), + (0x1d721, &['\u{0396}']), + (0x3215, &['\u{0028}', '\u{110B}', '\u{1161}', '\u{0029}']), + (0xffed, &['\u{25A0}']), + (0xfe7f, &['\u{0640}', '\u{0652}']), + (0xfea7, &['\u{062E}']), + (0x1d55d, &['\u{006C}']), + (0x1f228, &['\u{6355}']), + (0xfba7, &['\u{06C1}']), + (0xfd39, &['\u{0634}', '\u{062E}']), + (0x1d6aa, &['\u{0393}']), + (0xfb6c, &['\u{06A4}']), + (0x1d4df, &['\u{0050}']), + (0xff25, &['\u{0045}']), + (0x1d48, &['\u{0064}']), + (0xfbb0, &['\u{06D2}', '\u{0654}']), + (0x1d704, &['\u{03B9}']), + (0x1f102, &['\u{0031}', '\u{002C}']), + (0x3333, &['\u{30D5}', '\u{30A3}', '\u{30FC}', '\u{30C8}']), + (0x33c7, &['\u{0043}', '\u{006F}', '\u{002E}']), + (0x2b2, &['\u{006A}']), + (0x1f13c, &['\u{004D}']), + (0x1d7f9, &['\u{0033}']), + (0xfce2, &['\u{0628}', '\u{0647}']), + (0x1d44b, &['\u{0058}']), + (0x1d7c7, &['\u{03C6}']), + (0x32b6, &['\u{0034}', '\u{0031}']), + (0x3218, &['\u{0028}', '\u{110F}', '\u{1161}', '\u{0029}']), + (0x2110, &['\u{0049}']), + (0x1d636, &['\u{0075}']), + (0x330a, &['\u{30AA}', '\u{30FC}', '\u{30E0}']), + (0xfed4, &['\u{0641}']), + (0x2f60, &['\u{74DC}']), + (0x2119, &['\u{0050}']), + (0x32e5, &['\u{30CB}']), + (0xff23, &['\u{0043}']), + (0x1eebb, &['\u{063A}']), + (0x1d43b, &['\u{0048}']), + (0x1da6, &['\u{026A}']), + (0x1d450, &['\u{0063}']), + (0x1d61b, &['\u{0054}']), + (0x1d670, &['\u{0041}']), + (0x1d52f, &['\u{0072}']), + (0xfc44, &['\u{0644}', '\u{064A}']), + (0x24a1, &['\u{0028}', '\u{0066}', '\u{0029}']), + (0x1d7dc, &['\u{0034}']), + (0x1d4f3, &['\u{006A}']), + (0x2f1d, &['\u{53E3}']), + (0x1d78b, &['\u{03B8}']), + (0x1ee3b, &['\u{063A}']), + (0xff16, &['\u{0036}']), + (0x3384, &['\u{006B}', '\u{0041}']), + (0x322c, &['\u{0028}', '\u{6C34}', '\u{0029}']), + (0xfd00, &['\u{062D}', '\u{064A}']), + (0x1d66, &['\u{03B2}']), + (0x2162, &['\u{0049}', '\u{0049}', '\u{0049}']), + (0x1d4f5, &['\u{006C}']), + (0xfb9b, &['\u{06B1}']), + (0xffd7, &['\u{1172}']), + (0x1d5d, &['\u{03B2}']), + (0x32fa, &['\u{30ED}']), + (0x32db, &['\u{30B7}']), + (0x1ee01, &['\u{0628}']), + (0xfe41, &['\u{300C}']), + (0x1d5df, &['\u{004C}']), + (0x1f108, &['\u{0037}', '\u{002C}']), + (0xff8e, &['\u{30DB}']), + (0xff19, &['\u{0039}']), + (0x1d751, &['\u{03B8}']), + (0xfcf6, &['\u{0637}', '\u{064A}']), + (0x2f9e, &['\u{8ECA}']), + (0x1d5b8, &['\u{0059}']), + (0x1d6d1, &['\u{03C0}']), + (0x33cd, &['\u{004B}', '\u{004B}']), + (0xfedf, &['\u{0644}']), + (0x2fc5, &['\u{9E7F}']), + (0x2f3d, &['\u{6208}']), + (0xfe18, &['\u{3017}']), + (0x1d490, &['\u{006F}']), + (0x1d7c5, &['\u{03B8}']), + (0x1d7e9, &['\u{0037}']), + (0x1ee57, &['\u{062E}']), + (0x2076, &['\u{0036}']), + (0x2b8, &['\u{0079}']), + (0xfd16, &['\u{063A}', '\u{064A}']), + (0xfb95, &['\u{06AF}']), + (0x1d73d, &['\u{03B8}']), + (0xff2d, &['\u{004D}']), + (0x1f13a, &['\u{004B}']), + (0xfb88, &['\u{0688}']), + (0x1f14b, &['\u{004D}', '\u{0056}']), + (0x32e1, &['\u{30C4}']), + (0x1d601, &['\u{0074}']), + (0x208e, &['\u{0029}']), + (0x1d69f, &['\u{0076}']), + (0xfe7b, &['\u{0640}', '\u{0650}']), + (0xfdbb, &['\u{0643}', '\u{0645}', '\u{0645}']), + (0x1d5c2, &['\u{0069}']), + (0x2f30, &['\u{5DF1}']), + (0x1d52b, &['\u{006E}']), + (0xff0c, &['\u{002C}']), + (0x2f34, &['\u{5E7F}']), + (0xff50, &['\u{0070}']), + (0x24a7, &['\u{0028}', '\u{006C}', '\u{0029}']), + (0xfb68, &['\u{0679}']), + (0x213c, &['\u{03C0}']), + (0x24e1, &['\u{0072}']), + (0x1d49a, &['\u{0079}']), + (0xfe37, &['\u{007B}']), + (0x1d61d, &['\u{0056}']), + (0xff6d, &['\u{30E5}']), + (0x1d6fd, &['\u{03B2}']), + (0x1d6d9, &['\u{03C8}']), + (0xfbdf, &['\u{06CB}']), + (0x1d730, &['\u{03A5}']), + (0x3338, &['\u{30D8}', '\u{309A}', '\u{30CB}', '\u{30D2}']), + (0x1d523, &['\u{0066}']), + (0x3175, &['\u{1123}']), + (0xfc30, &['\u{0641}', '\u{0645}']), + (0x3355, &['\u{30EC}', '\u{30E0}']), + (0x1d5dd, &['\u{004A}']), + (0x1ee64, &['\u{0647}']), + (0x24ad, &['\u{0028}', '\u{0072}', '\u{0029}']), + (0x1d611, &['\u{004A}']), + (0x331f, &['\u{30B5}', '\u{30A4}', '\u{30AF}', '\u{30EB}']), + (0x1d77b, &['\u{03BC}']), + (0x2f2a, &['\u{5C22}']), + (0x1eeaf, &['\u{0639}']), + (0x1d56b, &['\u{007A}']), + (0x217c, &['\u{006C}']), + (0x1d7e4, &['\u{0032}']), + (0x2f70, &['\u{793A}']), + (0x2157, &['\u{0033}', '\u{2044}', '\u{0035}']), + (0x1d5b5, &['\u{0056}']), + (0xfd53, &['\u{062A}', '\u{062D}', '\u{0645}']), + (0x1d5e2, &['\u{004F}']), + (0x1d5da, &['\u{0047}']), + (0x1d691, &['\u{0068}']), + (0x1ee6f, &['\u{0639}']), + (0x1f23a, &['\u{55B6}']), + (0x675, &['\u{0627}', '\u{0674}']), + (0xfd6f, &['\u{0636}', '\u{062E}', '\u{0645}']), + (0xfb9a, &['\u{06B1}']), + (0x1f117, &['\u{0028}', '\u{0048}', '\u{0029}']), + (0x33e5, &['\u{0036}', '\u{65E5}']), + (0xb8, &['\u{0020}', '\u{0327}']), + (0x1d6c3, &['\u{03B2}']), + (0xfd73, &['\u{0637}', '\u{0645}', '\u{0645}']), + (0x1d5d5, &['\u{0042}']), + (0x1d454, &['\u{0067}']), + (0x33d0, &['\u{006C}', '\u{006D}']), + (0x1d5ce, &['\u{0075}']), + (0xfc4b, &['\u{0646}', '\u{062C}']), + (0x332b, &['\u{30CF}', '\u{309A}', '\u{30FC}', '\u{30BB}', '\u{30F3}', '\u{30C8}']), + (0x1f16a, &['\u{004D}', '\u{0043}']), + (0x1d7af, &['\u{03B6}']), + (0xfc90, &['\u{0649}', '\u{0670}']), + (0x1d68c, &['\u{0063}']), + (0x1d6f1, &['\u{03A0}']), + (0xfd6c, &['\u{0634}', '\u{0645}', '\u{0645}']), + (0x211d, &['\u{0052}']), + (0xfccc, &['\u{0644}', '\u{0645}']), + (0xfc21, &['\u{0635}', '\u{0645}']), + (0x1d7fe, &['\u{0038}']), + (0x1d6b0, &['\u{0399}']), + (0x2fb2, &['\u{97ED}']), + (0x1d653, &['\u{0058}']), + (0x3187, &['\u{1184}']), + (0xfe36, &['\u{0029}']), + (0x3205, &['\u{0028}', '\u{1107}', '\u{0029}']), + (0xfcd3, &['\u{0646}', '\u{062D}']), + (0x1d495, &['\u{0074}']), + (0x1d658, &['\u{0063}']), + (0x1d7cf, &['\u{0031}']), + (0x1d5f1, &['\u{0064}']), + (0x1f201, &['\u{30B3}', '\u{30B3}']), + (0x32d2, &['\u{30A6}']), + (0x33fa, &['\u{0032}', '\u{0037}', '\u{65E5}']), + (0x1d6ec, &['\u{039B}']), + (0x1d69d, &['\u{0074}']), + (0xfcba, &['\u{0639}', '\u{062C}']), + (0x33f8, &['\u{0032}', '\u{0035}', '\u{65E5}']), + (0x1d5bf, &['\u{0066}']), + (0x3378, &['\u{0064}', '\u{006D}', '\u{0032}']), + (0x1eeb4, &['\u{0634}']), + (0x1f217, &['\u{5929}']), + (0x2f99, &['\u{8C9D}']), + (0x1d705, &['\u{03BA}']), + (0x1d71b, &['\u{03C0}']), + (0x1d665, &['\u{0070}']), + (0x1d4fc, &['\u{0073}']), + (0xfb6b, &['\u{06A4}']), + (0x2469, &['\u{0031}', '\u{0030}']), + (0x33a1, &['\u{006D}', '\u{0032}']), + (0x1d4a5, &['\u{004A}']), + (0x2f9c, &['\u{8DB3}']), + (0x1f14c, &['\u{0053}', '\u{0044}']), + (0xffb9, &['\u{110D}']), + (0xfc64, &['\u{064A}', '\u{0654}', '\u{0631}']), + (0x32d8, &['\u{30B1}']), + (0x1d543, &['\u{004C}']), + (0xfda7, &['\u{062C}', '\u{0645}', '\u{0649}']), + (0x3366, &['\u{0031}', '\u{0034}', '\u{70B9}']), + (0x1d414, &['\u{0055}']), + (0x24b9, &['\u{0044}']), + (0x1d54b, &['\u{0054}']), + (0x3277, &['\u{110E}', '\u{1161}']), + (0x32a8, &['\u{53F3}']), + (0xfefc, &['\u{0644}', '\u{0627}']), + (0x2fbc, &['\u{9AD8}']), + (0x24c0, &['\u{004B}']), + (0x1ee2d, &['\u{0646}']), + (0x1d6c4, &['\u{03B3}']), + (0x1d407, &['\u{0048}']), + (0x1f140, &['\u{0051}']), + (0x328f, &['\u{571F}']), + (0x1d7ac, &['\u{03B3}']), + (0x249b, &['\u{0032}', '\u{0030}', '\u{002E}']), + (0x1f126, &['\u{0028}', '\u{0057}', '\u{0029}']), + (0x1da2, &['\u{0261}']), + (0x1d49e, &['\u{0043}']), + (0x3189, &['\u{1188}']), + (0x2107, &['\u{0190}']), + (0x205f, &['\u{0020}']), + (0x1d6e0, &['\u{03C1}']), + (0x2f77, &['\u{7CF8}']), + (0x2fba, &['\u{99AC}']), + (0x32ad, &['\u{4F01}']), + (0x1d468, &['\u{0041}']), + (0x3147, &['\u{110B}']), + (0x3184, &['\u{1157}']), + (0x1d5d7, &['\u{0044}']), + (0x1d57f, &['\u{0054}']), + (0x3236, &['\u{0028}', '\u{8CA1}', '\u{0029}']), + (0xfea5, &['\u{062E}']), + (0x321b, &['\u{0028}', '\u{1112}', '\u{1161}', '\u{0029}']), + (0x32f0, &['\u{30E0}']), + (0x1d4f9, &['\u{0070}']), + (0x1d4c0, &['\u{006B}']), + (0x3279, &['\u{1110}', '\u{1161}']), + (0x321d, &['\u{0028}', '\u{110B}', '\u{1169}', '\u{110C}', '\u{1165}', '\u{11AB}', '\u{0029}']), + (0x1d6c7, &['\u{03B6}']), + (0x3375, &['\u{006F}', '\u{0056}']), + (0x1d537, &['\u{007A}']), + (0x319d, &['\u{5929}']), + (0x1fc1, &['\u{0020}', '\u{0308}', '\u{0342}']), + (0x331d, &['\u{30B3}', '\u{30EB}', '\u{30CA}']), + (0x1d4ae, &['\u{0053}']), + (0x32e0, &['\u{30C1}']), + (0xfd21, &['\u{0635}', '\u{0649}']), + (0x32e4, &['\u{30CA}']), + (0xfcf7, &['\u{0639}', '\u{0649}']), + (0x3038, &['\u{5341}']), + (0x313d, &['\u{11B3}']), + (0x1d620, &['\u{0059}']), + (0x1d7e1, &['\u{0039}']), + (0x1d7d0, &['\u{0032}']), + (0xfdc2, &['\u{0628}', '\u{062D}', '\u{064A}']), + (0x1d6ba, &['\u{03A3}']), + (0x1d7f1, &['\u{0035}']), + (0x3232, &['\u{0028}', '\u{6709}', '\u{0029}']), + (0x1ee1d, &['\u{06BA}']), + (0x2f75, &['\u{7AF9}']), + (0x33b3, &['\u{006D}', '\u{0073}']), + (0x338e, &['\u{006D}', '\u{0067}']), + (0xff0f, &['\u{002F}']), + (0x1d782, &['\u{03C3}']), + (0x1f107, &['\u{0036}', '\u{002C}']), + (0x3305, &['\u{30A4}', '\u{30F3}', '\u{30C1}']), + (0x3196, &['\u{4E0A}']), + (0xfda9, &['\u{0635}', '\u{062D}', '\u{064A}']), + (0x3199, &['\u{7532}']), + (0x33cb, &['\u{0048}', '\u{0050}']), + (0x1d614, &['\u{004D}']), + (0xfc88, &['\u{0645}', '\u{0627}']), + (0x1ee00, &['\u{0627}']), + (0x1d6a0, &['\u{0077}']), + (0x1d9c, &['\u{0063}']), + (0x1d651, &['\u{0056}']), + (0xfea9, &['\u{062F}']), + (0xffcc, &['\u{1169}']), + (0x1d419, &['\u{005A}']), + (0x1d6bf, &['\u{03A8}']), + (0x2f10, &['\u{51F5}']), + (0x339e, &['\u{006B}', '\u{006D}']), + (0x1d641, &['\u{0046}']), + (0xfe63, &['\u{002D}']), + (0x3288, &['\u{4E5D}']), + (0x1d77e, &['\u{03BF}']), + (0x1d49b, &['\u{007A}']), + (0x2f03, &['\u{4E3F}']), + (0xa7f9, &['\u{0153}']), + (0xff26, &['\u{0046}']), + (0x1d758, &['\u{0393}']), + (0x1d54, &['\u{1D16}']), + (0xfc77, &['\u{062B}', '\u{0632}']), + (0x1d6fa, &['\u{03A9}']), + (0xfdb8, &['\u{0646}', '\u{062C}', '\u{062D}']), + (0x1d748, &['\u{03C3}']), + (0x2e1, &['\u{006C}']), + (0xff36, &['\u{0056}']), + (0x1d5ec, &['\u{0059}']), + (0x3168, &['\u{11C8}']), + (0x2011, &['\u{2010}']), + (0x222d, &['\u{222B}', '\u{222B}', '\u{222B}']), + (0x384, &['\u{0020}', '\u{0301}']), + (0x1f122, &['\u{0028}', '\u{0053}', '\u{0029}']), + (0x1d52e, &['\u{0071}']), + (0xfdc4, &['\u{0639}', '\u{062C}', '\u{0645}']), + (0xfd61, &['\u{0633}', '\u{0645}', '\u{062C}']), + (0x3320, &['\u{30B5}', '\u{30F3}', '\u{30C1}', '\u{30FC}', '\u{30E0}']), + (0xffaa, &['\u{11B0}']), + (0x33e7, &['\u{0038}', '\u{65E5}']), + (0x1d553, &['\u{0062}']), + (0x1d5aa, &['\u{004B}']), + (0xfe62, &['\u{002B}']), + (0x1d4ec, &['\u{0063}']), + (0x24de, &['\u{006F}']), + (0xfc8e, &['\u{0646}', '\u{0649}']), + (0x2b1, &['\u{0266}']), + (0xfe55, &['\u{003A}']), + (0x32bd, &['\u{0034}', '\u{0038}']), + (0x2f5a, &['\u{7247}']), + (0x1d33, &['\u{0047}']), + (0x1ee29, &['\u{064A}']), + (0x2f23, &['\u{5915}']), + (0x2103, &['\u{00B0}', '\u{0043}']), + (0x1f22b, &['\u{904A}']), + (0x246e, &['\u{0031}', '\u{0035}']), + (0x32f3, &['\u{30E4}']), + (0xfe72, &['\u{0020}', '\u{064C}']), + (0x1d70c, &['\u{03C1}']), + (0xedc, &['\u{0EAB}', '\u{0E99}']), + (0x2171, &['\u{0069}', '\u{0069}']), + (0x3157, &['\u{1169}']), + (0x1d417, &['\u{0058}']), + (0x1ee8b, &['\u{0644}']), + (0x1d4fd, &['\u{0074}']), + (0x2f4c, &['\u{6B62}']), + (0x1d74c, &['\u{03C7}']), + (0x1d731, &['\u{03A6}']), + (0x2173, &['\u{0069}', '\u{0076}']), + (0xff47, &['\u{0067}']), + (0x33f5, &['\u{0032}', '\u{0032}', '\u{65E5}']), + (0x339d, &['\u{0063}', '\u{006D}']), + (0x1d75c, &['\u{0397}']), + (0x2487, &['\u{0028}', '\u{0032}', '\u{0030}', '\u{0029}']), + (0xfdfa, &['\u{0635}', '\u{0644}', '\u{0649}', '\u{0020}', '\u{0627}', '\u{0644}', '\u{0644}', '\u{0647}', '\u{0020}', '\u{0639}', '\u{0644}', '\u{064A}', '\u{0647}', '\u{0020}', '\u{0648}', '\u{0633}', '\u{0644}', '\u{0645}']), + (0xff66, &['\u{30F2}']), + (0x1d58d, &['\u{0068}']), + (0xff33, &['\u{0053}']), + (0x1d5c7, &['\u{006E}']), + (0x335c, &['\u{0034}', '\u{70B9}']), + (0x320d, &['\u{0028}', '\u{1112}', '\u{0029}']), + (0xfda5, &['\u{062C}', '\u{0645}', '\u{064A}']), + (0x32f9, &['\u{30EC}']), + (0x3314, &['\u{30AD}', '\u{30ED}']), + (0x3241, &['\u{0028}', '\u{4F11}', '\u{0029}']), + (0x1d621, &['\u{005A}']), + (0x1d635, &['\u{0074}']), + (0x326c, &['\u{1111}']), + (0x1d683, &['\u{0054}']), + (0x1ee84, &['\u{0647}']), + (0xfc4a, &['\u{0645}', '\u{064A}']), + (0x1fdd, &['\u{0020}', '\u{0314}', '\u{0300}']), + (0xff98, &['\u{30EA}']), + (0x1d9e, &['\u{00F0}']), + (0x210c, &['\u{0048}']), + (0xff6c, &['\u{30E3}']), + (0x3377, &['\u{0064}', '\u{006D}']), + (0x1d6da, &['\u{03C9}']), + (0x1d746, &['\u{03C1}']), + (0xfceb, &['\u{0643}', '\u{0644}']), + (0x1eeac, &['\u{0645}']), + (0xfcf4, &['\u{0640}', '\u{0650}', '\u{0651}']), + (0x32d4, &['\u{30AA}']), + (0x1d7dd, &['\u{0035}']), + (0x1d70b, &['\u{03C0}']), + (0xfdb5, &['\u{0644}', '\u{062D}', '\u{0645}']), + (0x3388, &['\u{0063}', '\u{0061}', '\u{006C}']), + (0x3264, &['\u{1106}']), + (0xff7b, &['\u{30B5}']), + (0x1d692, &['\u{0069}']), + (0x2f38, &['\u{5F13}']), + (0x1d790, &['\u{0391}']), + (0x2f31, &['\u{5DFE}']), + (0x2152, &['\u{0031}', '\u{2044}', '\u{0031}', '\u{0030}']), + (0xfe30, &['\u{002E}', '\u{002E}']), + (0x1f232, &['\u{7981}']), + (0x2e0, &['\u{0263}']), + (0x1d668, &['\u{0073}']), + (0x2146, &['\u{0064}']), + (0x32b8, &['\u{0034}', '\u{0033}']), + (0xa8, &['\u{0020}', '\u{0308}']), + (0x2074, &['\u{0034}']), + (0x1d5ef, &['\u{0062}']), + (0x323f, &['\u{0028}', '\u{5354}', '\u{0029}']), + (0x1f149, &['\u{005A}']), + (0x1d470, &['\u{0049}']), + (0x1f3, &['\u{0064}', '\u{007A}']), + (0xfc56, &['\u{064A}', '\u{062D}']), + (0xfbe7, &['\u{06D0}']), + (0x2fa0, &['\u{8FB0}']), + (0x33d4, &['\u{006D}', '\u{0062}']), + (0x1d654, &['\u{0059}']), + (0xfcfe, &['\u{0634}', '\u{064A}']), + (0x2f47, &['\u{65E5}']), + (0xfbdd, &['\u{06C7}', '\u{0674}']), + (0xfd52, &['\u{062A}', '\u{062D}', '\u{062C}']), + (0xfe15, &['\u{0021}']), + (0xfe8e, &['\u{0627}']), + (0x24e9, &['\u{007A}']), + (0x3039, &['\u{5344}']), + (0xfe65, &['\u{003E}']), + (0x33a0, &['\u{0063}', '\u{006D}', '\u{0032}']), + (0xfd9c, &['\u{064A}', '\u{0645}', '\u{0645}']), + (0xffbe, &['\u{1112}']), + (0xfc31, &['\u{0641}', '\u{0649}']), + (0x1f125, &['\u{0028}', '\u{0056}', '\u{0029}']), + (0x334a, &['\u{30DF}', '\u{30EA}', '\u{30CF}', '\u{3099}', '\u{30FC}', '\u{30EB}']), + (0x1d7e6, &['\u{0034}']), + (0x1d68, &['\u{03C1}']), + (0x2e2, &['\u{0073}']), + (0xff80, &['\u{30BF}']), + (0x1d42e, &['\u{0075}']), + (0xfe44, &['\u{300F}']), + (0x1f132, &['\u{0043}']), + (0x1d6b7, &['\u{03A0}']), + (0xfef8, &['\u{0644}', '\u{0627}', '\u{0654}']), + (0xfd78, &['\u{0639}', '\u{0645}', '\u{0649}']), + (0x1d7f5, &['\u{0039}']), + (0x24d0, &['\u{0061}']), + (0xfd50, &['\u{062A}', '\u{062C}', '\u{0645}']), + (0x32f4, &['\u{30E6}']), + (0x1d6e8, &['\u{0397}']), + (0x1d520, &['\u{0063}']), + (0x328d, &['\u{6728}']), + (0xfd37, &['\u{0634}', '\u{062C}']), + (0xa7f8, &['\u{0126}']), + (0x2fc4, &['\u{9E75}']), + (0x210f, &['\u{0127}']), + (0x10fc, &['\u{10DC}']), + (0xfdb0, &['\u{064A}', '\u{0645}', '\u{064A}']), + (0x1ee87, &['\u{062D}']), + (0x1ee70, &['\u{0641}']), + (0x316b, &['\u{11D3}']), + (0x3285, &['\u{516D}']), + (0xfcb7, &['\u{0636}', '\u{0645}']), + (0xffb2, &['\u{1107}']), + (0x1d68b, &['\u{0062}']), + (0xfd6b, &['\u{0634}', '\u{0645}', '\u{062E}']), + (0x1ee35, &['\u{062A}']), + (0x32d6, &['\u{30AD}']), + (0x149, &['\u{02BC}', '\u{006E}']), + (0xfbb1, &['\u{06D2}', '\u{0654}']), + (0x1f14d, &['\u{0053}', '\u{0053}']), + (0x1d56a, &['\u{0079}']), + (0x1d4b8, &['\u{0063}']), + (0x1d7da, &['\u{0032}']), + (0xfcfc, &['\u{0633}', '\u{064A}']), + (0x1d761, &['\u{039C}']), + (0x2097, &['\u{006C}']), + (0xfca3, &['\u{062A}', '\u{062E}']), + (0x33e3, &['\u{0034}', '\u{65E5}']), + (0x1d753, &['\u{03C6}']), + (0x1d657, &['\u{0062}']), + (0xfd34, &['\u{0633}', '\u{062C}']), + (0x1d55b, &['\u{006A}']), + (0x1eeae, &['\u{0633}']), + (0x1d62d, &['\u{006C}']), + (0xfedc, &['\u{0643}']), + (0xffb6, &['\u{110A}']), + (0x1d469, &['\u{0042}']), + (0x3186, &['\u{1159}']), + (0x216d, &['\u{0043}']), + (0x2092, &['\u{006F}']), + (0x24b3, &['\u{0028}', '\u{0078}', '\u{0029}']), + (0xfc6e, &['\u{0628}', '\u{0649}']), + (0x3f5, &['\u{03B5}']), + (0x32f8, &['\u{30EB}']), + (0xffb8, &['\u{110C}']), + (0x3237, &['\u{0028}', '\u{795D}', '\u{0029}']), + (0xfec0, &['\u{0636}']), + (0x3351, &['\u{30EA}', '\u{30C3}', '\u{30C8}', '\u{30EB}']), + (0xfcc5, &['\u{0643}', '\u{062D}']), + (0x3329, &['\u{30CE}', '\u{30C3}', '\u{30C8}']), + (0xfe5c, &['\u{007D}']), + (0x2f9b, &['\u{8D70}']), + (0x24d2, &['\u{0063}']), + (0xfd75, &['\u{0639}', '\u{062C}', '\u{0645}']), + (0x33e4, &['\u{0035}', '\u{65E5}']), + (0xe33, &['\u{0E4D}', '\u{0E32}']), + (0x1d5fd, &['\u{0070}']), + (0x2494, &['\u{0031}', '\u{0033}', '\u{002E}']), + (0x2f80, &['\u{807F}']), + (0x2dd, &['\u{0020}', '\u{030B}']), + (0x32a1, &['\u{4F11}']), + (0x328c, &['\u{6C34}']), + (0x309c, &['\u{0020}', '\u{309A}']), + (0x1d7fb, &['\u{0035}']), + (0xfd7b, &['\u{063A}', '\u{0645}', '\u{0649}']), + (0xfb61, &['\u{067A}']), + (0x3323, &['\u{30BB}', '\u{30F3}', '\u{30C8}']), + (0x3280, &['\u{4E00}']), + (0x1f138, &['\u{0049}']), + (0xfc89, &['\u{0645}', '\u{0645}']), + (0xfb02, &['\u{0066}', '\u{006C}']), + (0x2111, &['\u{0049}']), + (0x1f22a, &['\u{4E09}']), + (0x1d772, &['\u{03B3}']), + (0x315f, &['\u{1171}']), + (0x1d4d, &['\u{0067}']), + (0xfd89, &['\u{0645}', '\u{062D}', '\u{062C}']), + (0x3135, &['\u{11AC}']), + (0x1db9, &['\u{028B}']), + (0xfb97, &['\u{06B3}']), + (0x1d4d6, &['\u{0047}']), + (0x2fb6, &['\u{98DB}']), + (0x1ee59, &['\u{0636}']), + (0x1d743, &['\u{03BE}']), + (0xfd11, &['\u{0637}', '\u{0649}']), + (0xff1f, &['\u{003F}']), + (0x24b5, &['\u{0028}', '\u{007A}', '\u{0029}']), + (0x1dac, &['\u{0271}']), + (0xfcb8, &['\u{0637}', '\u{062D}']), + (0x317f, &['\u{1140}']), + (0x2037, &['\u{2035}', '\u{2035}', '\u{2035}']), + (0x1d5f8, &['\u{006B}']), + (0x3150, &['\u{1162}']), + (0x1d5c9, &['\u{0070}']), + (0x1d57e, &['\u{0053}']), + (0x32bc, &['\u{0034}', '\u{0037}']), + (0x133, &['\u{0069}', '\u{006A}']), + (0x1f245, &['\u{3014}', '\u{6253}', '\u{3015}']), + (0x213e, &['\u{0393}']), + (0x1d78d, &['\u{03C6}']), + (0x2f1b, &['\u{53B6}']), + (0x1d5e1, &['\u{004E}']), + (0x1d4f1, &['\u{0068}']), + (0x1d498, &['\u{0077}']), + (0xfed2, &['\u{0641}']), + (0x3306, &['\u{30A6}', '\u{30A9}', '\u{30F3}']), + (0x2473, &['\u{0032}', '\u{0030}']), + (0x1d504, &['\u{0041}']), + (0xfc62, &['\u{0020}', '\u{0650}', '\u{0651}']), + (0x3214, &['\u{0028}', '\u{1109}', '\u{1161}', '\u{0029}']), + (0x32c2, &['\u{0033}', '\u{6708}']), + (0x1d52c, &['\u{006F}']), + (0x24ca, &['\u{0055}']), + (0x1d533, &['\u{0076}']), + (0x1d6a, &['\u{03C7}']), + (0x1d4f7, &['\u{006E}']), + (0x3158, &['\u{116A}']), + (0xffca, &['\u{1167}']), + (0x1eeb8, &['\u{0630}']), + (0xfbe1, &['\u{06C5}']), + (0xfc32, &['\u{0641}', '\u{064A}']), + (0x1d625, &['\u{0064}']), + (0xfee3, &['\u{0645}']), + (0xfdb7, &['\u{0643}', '\u{0645}', '\u{064A}']), + (0x1d6d3, &['\u{03C2}']), + (0x1d7a8, &['\u{03A9}']), + (0x1ee7b, &['\u{063A}']), + (0xfb25, &['\u{05DC}']), + (0x24a5, &['\u{0028}', '\u{006A}', '\u{0029}']), + (0x1d4b3, &['\u{0058}']), + (0x322f, &['\u{0028}', '\u{571F}', '\u{0029}']), + (0x3399, &['\u{0066}', '\u{006D}']), + (0x1d65d, &['\u{0068}']), + (0xfc74, &['\u{062A}', '\u{0649}']), + (0x1d5a5, &['\u{0046}']), + (0x33f2, &['\u{0031}', '\u{0039}', '\u{65E5}']), + (0x1d74f, &['\u{2202}']), + (0xfd66, &['\u{0635}', '\u{0645}', '\u{0645}']), + (0x3221, &['\u{0028}', '\u{4E8C}', '\u{0029}']), + (0xff30, &['\u{0050}']), + (0x1d512, &['\u{004F}']), + (0x1d632, &['\u{0071}']), + (0x1db2, &['\u{0278}']), + (0xfb82, &['\u{068D}']), + (0xffa9, &['\u{1105}']), + (0x1d711, &['\u{03C6}']), + (0x3317, &['\u{30AD}', '\u{30ED}', '\u{30EF}', '\u{30C3}', '\u{30C8}']), + (0xa69d, &['\u{044C}']), + (0x1d640, &['\u{0045}']), + (0x1da4, &['\u{0268}']), + (0x1f11d, &['\u{0028}', '\u{004E}', '\u{0029}']), + (0xfdbf, &['\u{062D}', '\u{062C}', '\u{064A}']), + (0x1d732, &['\u{03A7}']), + (0x1f11a, &['\u{0028}', '\u{004B}', '\u{0029}']), + (0x24b1, &['\u{0028}', '\u{0076}', '\u{0029}']), + (0x2f3e, &['\u{6236}']), + (0x1d6e7, &['\u{0396}']), + (0x1d43e, &['\u{004B}']), + (0xff87, &['\u{30CC}']), + (0x1d66e, &['\u{0079}']), + (0x1ee88, &['\u{0637}']), + (0xfed7, &['\u{0642}']), + (0xff52, &['\u{0072}']), + (0x1d420, &['\u{0067}']), + (0x1f238, &['\u{7533}']), + (0x3176, &['\u{1127}']), + (0x2f39, &['\u{5F50}']), + (0x1d698, &['\u{006F}']), + (0x1db8, &['\u{1D1C}']), + (0x1d61f, &['\u{0058}']), + (0x1ee6a, &['\u{0643}']), + (0x1d67b, &['\u{004C}']), + (0x213d, &['\u{03B3}']), + (0x1ee4f, &['\u{0639}']), + (0x249c, &['\u{0028}', '\u{0061}', '\u{0029}']), + (0x2fa4, &['\u{91C6}']), + (0x2f1e, &['\u{56D7}']), + (0xff86, &['\u{30CB}']), + (0x1d624, &['\u{0063}']), + (0x1d577, &['\u{004C}']), + (0xfbd5, &['\u{06AD}']), + (0x3341, &['\u{30DB}', '\u{30FC}', '\u{30EB}']), + (0x1d4b9, &['\u{0064}']), + (0x1d6e2, &['\u{0391}']), + (0x1f111, &['\u{0028}', '\u{0042}', '\u{0029}']), + (0xffb0, &['\u{111A}']), + (0x1d7f7, &['\u{0031}']), + (0x1d6b3, &['\u{039C}']), + (0x24db, &['\u{006C}']), + (0x1d570, &['\u{0045}']), + (0x1ee99, &['\u{0636}']), + (0x1d590, &['\u{006B}']), + (0x1d5c1, &['\u{0068}']), + (0xfb77, &['\u{0683}']), + (0x1d723, &['\u{0398}']), + (0x1d7a5, &['\u{03A6}']), + (0x1f120, &['\u{0028}', '\u{0051}', '\u{0029}']), + (0x1d72c, &['\u{03A1}']), + (0xffbc, &['\u{1110}']), + (0x1d5c4, &['\u{006B}']), + (0xfe86, &['\u{0648}', '\u{0654}']), + (0x1d7ad, &['\u{03B4}']), + (0x1d633, &['\u{0072}']), + (0x32e7, &['\u{30CD}']), + (0x2f4b, &['\u{6B20}']), + (0x1fcd, &['\u{0020}', '\u{0313}', '\u{0300}']), + (0x3188, &['\u{1185}']), + (0x33c5, &['\u{0063}', '\u{0064}']), + (0xffeb, &['\u{2192}']), + (0x2491, &['\u{0031}', '\u{0030}', '\u{002E}']), + (0xfe16, &['\u{003F}']), + (0x1d754, &['\u{03C1}']), + (0x1d7ef, &['\u{0033}']), + (0x1d6ce, &['\u{03BD}']), + (0x330e, &['\u{30AB}', '\u{3099}', '\u{30ED}', '\u{30F3}']), + (0xfea8, &['\u{062E}']), + (0x1d434, &['\u{0041}']), + (0x1d483, &['\u{0062}']), + (0x1d443, &['\u{0050}']), + (0xff1c, &['\u{003C}']), + (0x210a, &['\u{0067}']), + (0x2fd5, &['\u{9FA0}']), + (0x1d6a4, &['\u{0131}']), + (0x1dbd, &['\u{0291}']), + (0xfb6a, &['\u{06A4}']), + (0xfc2b, &['\u{063A}', '\u{062C}']), + (0x1d4de, &['\u{004F}']), + (0xfd2e, &['\u{0634}', '\u{062D}']), + (0x328b, &['\u{706B}']), + (0x1d552, &['\u{0061}']), + (0xfea3, &['\u{062D}']), + (0x330b, &['\u{30AB}', '\u{30A4}', '\u{30EA}']), + (0xfb5b, &['\u{0680}']), + (0x1d40a, &['\u{004B}']), + (0x1f21c, &['\u{524D}']), + (0x2460, &['\u{0031}']), + (0x1d541, &['\u{004A}']), + (0x3271, &['\u{1105}', '\u{1161}']), + (0x2122, &['\u{0054}', '\u{004D}']), + (0x1ee19, &['\u{0636}']), + (0xff01, &['\u{0021}']), + (0x3216, &['\u{0028}', '\u{110C}', '\u{1161}', '\u{0029}']), + (0xfcc1, &['\u{0641}', '\u{0645}']), + (0x1fbf, &['\u{0020}', '\u{0313}']), + (0x216e, &['\u{0044}']), + (0x2fb9, &['\u{9999}']), + (0xbd, &['\u{0031}', '\u{2044}', '\u{0032}']), + (0xff3c, &['\u{005C}']), + (0x1d66f, &['\u{007A}']), + (0x1ee14, &['\u{0634}']), + (0x1d48a, &['\u{0069}']), + (0xffb5, &['\u{1109}']), + (0xfd38, &['\u{0634}', '\u{062D}']), + (0x2f81, &['\u{8089}']), + (0x1d610, &['\u{0049}']), + (0xfcbf, &['\u{0641}', '\u{062D}']), + (0x1d64e, &['\u{0053}']), + (0xfe3c, &['\u{3011}']), + (0x1d4c3, &['\u{006E}']), + (0x3162, &['\u{1174}']), + (0x2f65, &['\u{7530}']), + (0xfd96, &['\u{0646}', '\u{062D}', '\u{0649}']), + (0x1d5e7, &['\u{0054}']), + (0xffb7, &['\u{110B}']), + (0x207a, &['\u{002B}']), + (0x3d5, &['\u{03C6}']), + (0x1d445, &['\u{0052}']), + (0x32d0, &['\u{30A2}']), + (0x2f09, &['\u{513F}']), + (0x1ee6d, &['\u{0646}']), + (0x2fb5, &['\u{98A8}']), + (0xfeea, &['\u{0647}']), + (0xfee0, &['\u{0644}']), + (0x1f1, &['\u{0044}', '\u{005A}']), + (0xfba0, &['\u{06BB}']), + (0xfbf5, &['\u{064A}', '\u{0654}', '\u{06C8}']), + (0x1d43c, &['\u{0049}']), + (0xfc4e, &['\u{0646}', '\u{0645}']), + (0xfbe0, &['\u{06C5}']), + (0x2483, &['\u{0028}', '\u{0031}', '\u{0036}', '\u{0029}']), + (0x33f1, &['\u{0031}', '\u{0038}', '\u{65E5}']), + (0x3165, &['\u{1114}']), + (0x1d56, &['\u{0070}']), + (0xfb9d, &['\u{06B1}']), + (0xfc24, &['\u{0636}', '\u{062E}']), + (0xfc54, &['\u{0647}', '\u{064A}']), + (0x1d763, &['\u{039E}']), + (0xfda8, &['\u{0633}', '\u{062E}', '\u{0649}']), + (0x1d6eb, &['\u{039A}']), + (0x1f11c, &['\u{0028}', '\u{004D}', '\u{0029}']), + (0xfe8b, &['\u{064A}', '\u{0654}']), + (0x2f57, &['\u{7236}']), + (0x1d518, &['\u{0055}']), + (0x1d784, &['\u{03C5}']), + (0xfce5, &['\u{062B}', '\u{0645}']), + (0x2f96, &['\u{8C46}']), + (0xfc39, &['\u{0643}', '\u{062D}']), + (0xfc48, &['\u{0645}', '\u{0645}']), + (0xfedb, &['\u{0643}']), + (0x2495, &['\u{0031}', '\u{0034}', '\u{002E}']), + (0x1ee71, &['\u{0635}']), + (0x3272, &['\u{1106}', '\u{1161}']), + (0x2f9a, &['\u{8D64}']), + (0x333d, &['\u{30DB}', '\u{309A}', '\u{30A4}', '\u{30F3}', '\u{30C8}']), + (0xfcb0, &['\u{0633}', '\u{0645}']), + (0xfd02, &['\u{062C}', '\u{064A}']), + (0x1d7eb, &['\u{0039}']), + (0xfdba, &['\u{0644}', '\u{062C}', '\u{0645}']), + (0x1ee86, &['\u{0632}']), + (0x1d66b, &['\u{0076}']), + (0xff9e, &['\u{3099}']), + (0x1f225, &['\u{5439}']), + (0x2499, &['\u{0031}', '\u{0038}', '\u{002E}']), + (0xfce8, &['\u{0633}', '\u{0647}']), + (0x1f11b, &['\u{0028}', '\u{004C}', '\u{0029}']), + (0x1d505, &['\u{0042}']), + (0x1d767, &['\u{0398}']), + (0x33ce, &['\u{004B}', '\u{004D}']), + (0x2f01, &['\u{4E28}']), + (0xfc3f, &['\u{0644}', '\u{062C}']), + (0x3222, &['\u{0028}', '\u{4E09}', '\u{0029}']), + (0x33d8, &['\u{0070}', '\u{002E}', '\u{006D}', '\u{002E}']), + (0x1ee12, &['\u{0642}']), + (0x3335, &['\u{30D5}', '\u{30E9}', '\u{30F3}']), + (0x32aa, &['\u{5B97}']), + (0xfbf4, &['\u{064A}', '\u{0654}', '\u{06C8}']), + (0xff4d, &['\u{006D}']), + (0xba, &['\u{006F}']), + (0x1d6bb, &['\u{03A4}']), + (0xff03, &['\u{0023}']), + (0x1d6b9, &['\u{0398}']), + (0x318d, &['\u{119E}']), + (0x1d48f, &['\u{006E}']), + (0x2017, &['\u{0020}', '\u{0333}']), + (0x1d48d, &['\u{006C}']), + (0x32b5, &['\u{0034}', '\u{0030}']), + (0x132, &['\u{0049}', '\u{004A}']), + (0x2f16, &['\u{5338}']), + (0x319b, &['\u{4E19}']), + (0x337f, &['\u{682A}', '\u{5F0F}', '\u{4F1A}', '\u{793E}']), + (0x313c, &['\u{11B2}']), + (0xfb7d, &['\u{0686}']), + (0x3394, &['\u{0054}', '\u{0048}', '\u{007A}']), + (0x1d42c, &['\u{0073}']), + (0x1d47e, &['\u{0057}']), + (0xfebf, &['\u{0636}']), + (0x33ed, &['\u{0031}', '\u{0034}', '\u{65E5}']), + (0x1f114, &['\u{0028}', '\u{0045}', '\u{0029}']), + (0x1f231, &['\u{6253}']), + (0xff51, &['\u{0071}']), + (0x1d7c6, &['\u{03BA}']), + (0x309f, &['\u{3088}', '\u{308A}']), + (0x1d7d9, &['\u{0031}']), + (0xfeee, &['\u{0648}']), + (0x2135, &['\u{05D0}']), + (0x1d493, &['\u{0072}']), + (0x1d45a, &['\u{006D}']), + (0x1d650, &['\u{0055}']), + (0x1d54d, &['\u{0056}']), + (0xfd25, &['\u{0634}', '\u{062C}']), + (0x2024, &['\u{002E}']), + (0x24cf, &['\u{005A}']), + (0x1ee2b, &['\u{0644}']), + (0x2faf, &['\u{9762}']), + (0x2b3, &['\u{0072}']), + (0x1d58b, &['\u{0066}']), + (0xfb01, &['\u{0066}', '\u{0069}']), + (0xfece, &['\u{063A}']), + (0x24e2, &['\u{0073}']), + (0xfd7a, &['\u{063A}', '\u{0645}', '\u{064A}']), + (0x1d669, &['\u{0074}']), + (0x2f37, &['\u{5F0B}']), + (0x1f248, &['\u{3014}', '\u{6557}', '\u{3015}']), + (0xff5b, &['\u{007B}']), + (0x215e, &['\u{0037}', '\u{2044}', '\u{0038}']), + (0xfef2, &['\u{064A}']), + (0x2f6f, &['\u{77F3}']), + (0x1d78a, &['\u{03B5}']), + (0x3357, &['\u{30EF}', '\u{30C3}', '\u{30C8}']), + (0x1d5cc, &['\u{0073}']), + (0x2b5, &['\u{027B}']), + (0x3258, &['\u{0032}', '\u{0038}']), + (0xfca4, &['\u{062A}', '\u{0645}']), + (0x3287, &['\u{516B}']), + (0x1f210, &['\u{624B}']), + (0x33be, &['\u{006B}', '\u{0057}']), + (0xfc99, &['\u{064A}', '\u{0654}', '\u{062E}']), + (0x1d596, &['\u{0071}']), + (0x1d4f8, &['\u{006F}']), + (0xfec9, &['\u{0639}']), + (0x1f22c, &['\u{5DE6}']), + (0x2a75, &['\u{003D}', '\u{003D}']), + (0xfe76, &['\u{0020}', '\u{064E}']), + (0xff1d, &['\u{003D}']), + (0x217f, &['\u{006D}']), + (0xfb04, &['\u{0066}', '\u{0066}', '\u{006C}']), + (0x336a, &['\u{0031}', '\u{0038}', '\u{70B9}']), + (0xfe4e, &['\u{005F}']), + (0x248b, &['\u{0034}', '\u{002E}']), + (0x1d4c9, &['\u{0074}']), + (0x1d567, &['\u{0076}']), + (0x1d511, &['\u{004E}']), + (0x1d7ee, &['\u{0032}']), + (0xff8c, &['\u{30D5}']), + (0x1d65c, &['\u{0067}']), + (0x315c, &['\u{116E}']), + (0x1d52d, &['\u{0070}']), + (0x33ef, &['\u{0031}', '\u{0036}', '\u{65E5}']), + (0x1d659, &['\u{0064}']), + (0x248e, &['\u{0037}', '\u{002E}']), + (0x3137, &['\u{1103}']), + (0xfe8f, &['\u{0628}']), + (0x1d4ee, &['\u{0065}']), + (0xffe0, &['\u{00A2}']), + (0x2172, &['\u{0069}', '\u{0069}', '\u{0069}']), + (0x1d5b1, &['\u{0052}']), + (0xff27, &['\u{0047}']), + (0xfd9a, &['\u{0646}', '\u{0645}', '\u{064A}']), + (0x1d766, &['\u{03A1}']), + (0x3380, &['\u{0070}', '\u{0041}']), + (0xfd1c, &['\u{062D}', '\u{064A}']), + (0xfe35, &['\u{0028}']), + (0x1f219, &['\u{6620}']), + (0x1d62a, &['\u{0069}']), + (0x1d4dd, &['\u{004E}']), + (0x33b2, &['\u{03BC}', '\u{0073}']), + (0xfcb2, &['\u{0635}', '\u{062E}']), + (0x1d464, &['\u{0077}']), + (0x2080, &['\u{0030}']), + (0x1d71c, &['\u{0391}']), + (0x2128, &['\u{005A}']), + (0x2f9d, &['\u{8EAB}']), + (0xfced, &['\u{0644}', '\u{0645}']), + (0xff71, &['\u{30A2}']), + (0x2a74, &['\u{003A}', '\u{003A}', '\u{003D}']), + (0x1d764, &['\u{039F}']), + (0x1f116, &['\u{0028}', '\u{0047}', '\u{0029}']), + (0x3336, &['\u{30D8}', '\u{30AF}', '\u{30BF}', '\u{30FC}', '\u{30EB}']), + (0x1d7e2, &['\u{0030}']), + (0x1ee69, &['\u{064A}']), + (0x2036, &['\u{2035}', '\u{2035}']), + (0x1fbd, &['\u{0020}', '\u{0313}']), + (0x1d5fb, &['\u{006E}']), + (0xfd57, &['\u{062A}', '\u{0645}', '\u{062E}']), + (0x2115, &['\u{004E}']), + (0xff4b, &['\u{006B}']), + (0xfdf5, &['\u{0635}', '\u{0644}', '\u{0639}', '\u{0645}']), + (0x24d7, &['\u{0068}']), + (0x32cb, &['\u{0031}', '\u{0032}', '\u{6708}']), + (0x1d6e3, &['\u{0392}']), + (0x32ec, &['\u{30D8}']), + (0xfd8d, &['\u{0645}', '\u{062C}', '\u{0645}']), + (0x3204, &['\u{0028}', '\u{1106}', '\u{0029}']), + (0x331e, &['\u{30B3}', '\u{30FC}', '\u{30DB}', '\u{309A}']), + (0x3365, &['\u{0031}', '\u{0033}', '\u{70B9}']), + (0xff45, &['\u{0065}']), + (0x1ee17, &['\u{062E}']), + (0xfe9a, &['\u{062B}']), + (0x1d606, &['\u{0079}']), + (0x32b3, &['\u{0033}', '\u{0038}']), + (0x1d7d5, &['\u{0037}']), + (0xfe64, &['\u{003C}']), + (0x1d496, &['\u{0075}']), + (0x2f84, &['\u{81F3}']), + (0xfbac, &['\u{06BE}']), + (0x1d478, &['\u{0051}']), + (0x1d5af, &['\u{0050}']), + (0x1c9, &['\u{006C}', '\u{006A}']), + (0x1d45, &['\u{0251}']), + (0x2fc3, &['\u{9CE5}']), + (0x1d708, &['\u{03BD}']), + (0xfe11, &['\u{3001}']), + (0x1d64f, &['\u{0054}']), + (0xfd95, &['\u{0646}', '\u{062D}', '\u{0645}']), + (0x1d5d4, &['\u{0041}']), + (0x1eea9, &['\u{064A}']), + (0x33a3, &['\u{006D}', '\u{006D}', '\u{0033}']), + (0x1d502, &['\u{0079}']), + (0x1d41d, &['\u{0064}']), + (0x1ee75, &['\u{062A}']), + (0x1d489, &['\u{0068}']), + (0xffd6, &['\u{1171}']), + (0x1d64d, &['\u{0052}']), + (0x33a5, &['\u{006D}', '\u{0033}']), + (0x1d5ab, &['\u{004C}']), + (0x1d7d3, &['\u{0035}']), + (0x1d73f, &['\u{03BA}']), + (0x1d6cb, &['\u{03BA}']), + (0x1d717, &['\u{03B8}']), + (0xff1b, &['\u{003B}']), + (0xfc8d, &['\u{0646}', '\u{0646}']), + (0xfc65, &['\u{064A}', '\u{0654}', '\u{0632}']), + (0x1d703, &['\u{03B8}']), + (0xfb91, &['\u{06A9}']), + (0xfd12, &['\u{0637}', '\u{064A}']), + (0xfc63, &['\u{0020}', '\u{0651}', '\u{0670}']), + (0x1d44f, &['\u{0062}']), + (0x249f, &['\u{0028}', '\u{0064}', '\u{0029}']), + (0x1da3, &['\u{0265}']), + (0x1d6df, &['\u{03C6}']), + (0xff4e, &['\u{006E}']), + (0x2f02, &['\u{4E36}']), + (0x3363, &['\u{0031}', '\u{0031}', '\u{70B9}']), + (0x2f3c, &['\u{5FC3}']), + (0x3192, &['\u{4E00}']), + (0xfd92, &['\u{0645}', '\u{062C}', '\u{062E}']), + (0x1f105, &['\u{0034}', '\u{002C}']), + (0x1cc, &['\u{006E}', '\u{006A}']), + (0xfd6a, &['\u{0634}', '\u{0645}', '\u{062E}']), + (0x2140, &['\u{2211}']), + (0xfeda, &['\u{0643}']), + (0x1f230, &['\u{8D70}']), + (0xfd6e, &['\u{0636}', '\u{062D}', '\u{0649}']), + (0x24ce, &['\u{0059}']), + (0xfb52, &['\u{067B}']), + (0xfd60, &['\u{0633}', '\u{0645}', '\u{062D}']), + (0x1f123, &['\u{0028}', '\u{0054}', '\u{0029}']), + (0xfbf0, &['\u{064A}', '\u{0654}', '\u{06C7}']), + (0xfbdb, &['\u{06C8}']), + (0x1d5ad, &['\u{004E}']), + (0x1d9b, &['\u{0252}']), + (0x1f104, &['\u{0033}', '\u{002C}']), + (0x1f21b, &['\u{6599}']), + (0x2f0f, &['\u{51E0}']), + (0x2f61, &['\u{74E6}']), + (0x2484, &['\u{0028}', '\u{0031}', '\u{0037}', '\u{0029}']), + (0x1d462, &['\u{0075}']), + (0x1f129, &['\u{0028}', '\u{005A}', '\u{0029}']), + (0x1d4ce, &['\u{0079}']), + (0x1d55, &['\u{1D17}']), + (0xfc5d, &['\u{0649}', '\u{0670}']), + (0x1ee1f, &['\u{066F}']), + (0xfe33, &['\u{005F}']), + (0xfc01, &['\u{064A}', '\u{0654}', '\u{062D}']), + (0x3233, &['\u{0028}', '\u{793E}', '\u{0029}']), + (0xfb23, &['\u{05D4}']), + (0xfc15, &['\u{062C}', '\u{062D}']), + (0x1d55f, &['\u{006E}']), + (0x2faa, &['\u{96B6}']), + (0x1d525, &['\u{0068}']), + (0xfdbe, &['\u{062C}', '\u{062D}', '\u{064A}']), + (0x1d762, &['\u{039D}']), + (0xfe88, &['\u{0627}', '\u{0655}']), + (0x1d433, &['\u{007A}']), + (0xfb6d, &['\u{06A4}']), + (0xfd22, &['\u{0635}', '\u{064A}']), + (0x3141, &['\u{1106}']), + (0x32ab, &['\u{5B66}']), + (0x1d56d, &['\u{0042}']), + (0x1d630, &['\u{006F}']), + (0x1db4, &['\u{0283}']), + (0x1f224, &['\u{58F0}']), + (0xfc5f, &['\u{0020}', '\u{064D}', '\u{0651}']), + (0x1d69c, &['\u{0073}']), + (0x1f136, &['\u{0047}']), + (0xfd7c, &['\u{0641}', '\u{062E}', '\u{0645}']), + (0xfd9e, &['\u{0628}', '\u{062E}', '\u{064A}']), + (0x24e3, &['\u{0074}']), + (0x3159, &['\u{116B}']), + (0x3284, &['\u{4E94}']), + (0x1d4b7, &['\u{0062}']), + (0x1d7a6, &['\u{03A7}']), + (0xff38, &['\u{0058}']), + (0x1d7c8, &['\u{03C1}']), + (0xb9, &['\u{0031}']), + (0x3139, &['\u{1105}']), + (0xfc7a, &['\u{062B}', '\u{0649}']), + (0xfe3b, &['\u{3010}']), + (0x2088, &['\u{0038}']), + (0x1ee02, &['\u{062C}']), + (0x3263, &['\u{1105}']), + (0xffc4, &['\u{1163}']), + (0x1d584, &['\u{0059}']), + (0x1ee85, &['\u{0648}']), + (0xfe3f, &['\u{3008}']), + (0x3332, &['\u{30D5}', '\u{30A1}', '\u{30E9}', '\u{30C3}', '\u{30C8}', '\u{3099}']), + (0xff7e, &['\u{30BB}']), + (0x24cc, &['\u{0057}']), + (0x1d5a9, &['\u{004A}']), + (0x1c6, &['\u{0064}', '\u{007A}', '\u{030C}']), + (0x1d791, &['\u{0392}']), + (0x326d, &['\u{1112}']), + (0x1d53, &['\u{0254}']), + (0x314a, &['\u{110E}']), + (0x2049, &['\u{0021}', '\u{003F}']), + (0x2178, &['\u{0069}', '\u{0078}']), + (0x1d41a, &['\u{0061}']), + (0xfb7c, &['\u{0686}']), + (0x1ee94, &['\u{0634}']), + (0x215d, &['\u{0035}', '\u{2044}', '\u{0038}']), + (0xfda4, &['\u{062A}', '\u{0645}', '\u{0649}']), + (0xfd87, &['\u{0644}', '\u{0645}', '\u{062D}']), + (0x1d43f, &['\u{004C}']), + (0x2fcd, &['\u{9F0E}']), + (0xfeb6, &['\u{0634}']), + (0x1d56c, &['\u{0041}']), + (0x1d65f, &['\u{006A}']), + (0x3393, &['\u{0047}', '\u{0048}', '\u{007A}']), + (0x334f, &['\u{30E4}', '\u{30FC}', '\u{30EB}']), + (0x1d477, &['\u{0050}']), + (0xfd0b, &['\u{0634}', '\u{062E}']), + (0x208a, &['\u{002B}']), + (0x2f1a, &['\u{5382}']), + (0xfd0d, &['\u{0634}', '\u{0631}']), + (0xfd26, &['\u{0634}', '\u{062D}']), + (0x1d54a, &['\u{0053}']), + (0x2fcf, &['\u{9F20}']), + (0xfe92, &['\u{0628}']), + (0xfe4c, &['\u{0020}', '\u{0305}']), + (0xff96, &['\u{30E8}']), + (0xfe96, &['\u{062A}']), + (0x327a, &['\u{1111}', '\u{1161}']), + (0x335b, &['\u{0033}', '\u{70B9}']), + (0xff4c, &['\u{006C}']), + (0x1d561, &['\u{0070}']), + (0x1f21a, &['\u{7121}']), + (0xfeb5, &['\u{0634}']), + (0xff7c, &['\u{30B7}']), + (0x2f48, &['\u{66F0}']), + (0x33d3, &['\u{006C}', '\u{0078}']), + (0x33a9, &['\u{0050}', '\u{0061}']), + (0x1d67d, &['\u{004E}']), + (0x1ee2f, &['\u{0639}']), + (0x1d70f, &['\u{03C4}']), + (0x1ee7e, &['\u{06A1}']), + (0x335f, &['\u{0037}', '\u{70B9}']), + (0x1d602, &['\u{0075}']), + (0x1d5b3, &['\u{0054}']), + (0x1d57c, &['\u{0051}']), + (0x1d6a3, &['\u{007A}']), + (0x1d5cb, &['\u{0072}']), + (0x1d76f, &['\u{2207}']), + (0x1d4e8, &['\u{0059}']), + (0x1d58e, &['\u{0069}']), + (0x320a, &['\u{0028}', '\u{110F}', '\u{0029}']), + (0x1d644, &['\u{0049}']), + (0x1d474, &['\u{004D}']), + (0x1eeab, &['\u{0644}']), + (0xff29, &['\u{0049}']), + (0x3297, &['\u{795D}']), + (0x1ee83, &['\u{062F}']), + (0xff32, &['\u{0052}']), + (0x1ee0a, &['\u{0643}']), + (0xffab, &['\u{11B1}']), + (0x1d725, &['\u{039A}']), + (0x1d460, &['\u{0073}']), + (0xfcc2, &['\u{0642}', '\u{062D}']), + (0x1d63a, &['\u{0079}']), + (0x1d408, &['\u{0049}']), + (0x33bf, &['\u{004D}', '\u{0057}']), + (0x1d664, &['\u{006F}']), + (0x1d6dd, &['\u{03B8}']), + (0x1d54e, &['\u{0057}']), + (0x1d7f2, &['\u{0036}']), + (0xff37, &['\u{0057}']), + (0x33e9, &['\u{0031}', '\u{0030}', '\u{65E5}']), + (0xfebe, &['\u{0636}']), + (0xfee8, &['\u{0646}']), + (0x3200, &['\u{0028}', '\u{1100}', '\u{0029}']), + (0x1d61a, &['\u{0053}']), + (0x1d9d, &['\u{0255}']), + (0xfcad, &['\u{0633}', '\u{062C}']), + (0x1f212, &['\u{53CC}']), + (0xfc66, &['\u{064A}', '\u{0654}', '\u{0645}']), + (0x1d5a1, &['\u{0042}']), + (0xfcc9, &['\u{0644}', '\u{062C}']), + (0x1d71f, &['\u{0394}']), + (0x1d425, &['\u{006C}']), + (0x1d508, &['\u{0045}']), + (0x3326, &['\u{30C8}', '\u{3099}', '\u{30EB}']), + (0xfd5b, &['\u{062D}', '\u{0645}', '\u{0649}']), + (0xff08, &['\u{0028}']), + (0x1d745, &['\u{03C0}']), + (0x3386, &['\u{004D}', '\u{0042}']), + (0x3315, &['\u{30AD}', '\u{30ED}', '\u{30AF}', '\u{3099}', '\u{30E9}', '\u{30E0}']), + (0x1ee31, &['\u{0635}']), + (0x32b2, &['\u{0033}', '\u{0037}']), + (0x3358, &['\u{0030}', '\u{70B9}']), + (0x1d7bb, &['\u{03C2}']), + (0x1d73a, &['\u{03B5}']), + (0x3274, &['\u{1109}', '\u{1161}']), + (0xfc7f, &['\u{0642}', '\u{064A}']), + (0x1d747, &['\u{03C2}']), + (0xfcf8, &['\u{0639}', '\u{064A}']), + (0xfe60, &['\u{0026}']), + (0x1d4e1, &['\u{0052}']), + (0x1d494, &['\u{0073}']), + (0x3292, &['\u{6709}']), + (0xfd3d, &['\u{0627}', '\u{064B}']), + (0xfd29, &['\u{0634}', '\u{0631}']), + (0x3149, &['\u{110D}']), + (0xfbab, &['\u{06BE}']), + (0x1f247, &['\u{3014}', '\u{52DD}', '\u{3015}']), + (0xfdb6, &['\u{0639}', '\u{0645}', '\u{064A}']), + (0xfebc, &['\u{0635}']), + (0x2095, &['\u{0068}']), + (0x1d57a, &['\u{004F}']), + (0x1eeb6, &['\u{062B}']), + (0x1d6ca, &['\u{03B9}']), + (0x210e, &['\u{0068}']), + (0x1d652, &['\u{0057}']), + (0xfec3, &['\u{0637}']), + (0xfbeb, &['\u{064A}', '\u{0654}', '\u{0627}']), + (0x1d702, &['\u{03B7}']), + (0x1d615, &['\u{004E}']), + (0x2f0c, &['\u{5182}']), + (0x3185, &['\u{1158}']), + (0x1d42a, &['\u{0071}']), + (0x247b, &['\u{0028}', '\u{0038}', '\u{0029}']), + (0x2f7e, &['\u{8012}']), + (0xfd2a, &['\u{0633}', '\u{0631}']), + (0x209a, &['\u{0070}']), + (0xfb72, &['\u{0684}']), + (0x1d503, &['\u{007A}']), + (0xff5a, &['\u{007A}']), + (0x334e, &['\u{30E4}', '\u{30FC}', '\u{30C8}', '\u{3099}']), + (0xfbda, &['\u{06C6}']), + (0x1ee36, &['\u{062B}']), + (0xff5c, &['\u{007C}']), + (0x1d722, &['\u{0397}']), + (0x1d79b, &['\u{039C}']), + (0x1d720, &['\u{0395}']), + (0x2f05, &['\u{4E85}']), + (0xfb16, &['\u{057E}', '\u{0576}']), + (0xfc80, &['\u{0643}', '\u{0627}']), + (0xfec1, &['\u{0637}']), + (0x2fa7, &['\u{9577}']), + (0xfc84, &['\u{0643}', '\u{064A}']), + (0x1ee34, &['\u{0634}']), + (0x1d4c1, &['\u{006C}']), + (0x33ca, &['\u{0068}', '\u{0061}']), + (0x1f143, &['\u{0054}']), + (0x24b4, &['\u{0028}', '\u{0079}', '\u{0029}']), + (0x24c9, &['\u{0054}']), + (0x1d5b7, &['\u{0058}']), + (0x248f, &['\u{0038}', '\u{002E}']), + (0xff84, &['\u{30C8}']), + (0x3324, &['\u{30BF}', '\u{3099}', '\u{30FC}', '\u{30B9}']), + (0x1d5f0, &['\u{0063}']), + (0x2147, &['\u{0065}']), + (0x24a4, &['\u{0028}', '\u{0069}', '\u{0029}']), + (0x3251, &['\u{0032}', '\u{0031}']), + (0xfc92, &['\u{064A}', '\u{0632}']), + (0xfcdf, &['\u{064A}', '\u{0654}', '\u{0645}']), + (0xfe9c, &['\u{062B}']), + (0x1d740, &['\u{03BB}']), + (0x1f240, &['\u{3014}', '\u{672C}', '\u{3015}']), + (0x2f07, &['\u{4EA0}']), + (0x3373, &['\u{0041}', '\u{0055}']), + (0xff18, &['\u{0038}']), + (0xfd1b, &['\u{062D}', '\u{0649}']), + (0x1f250, &['\u{5F97}']), + (0xff60, &['\u{2986}']), + (0xfd06, &['\u{0635}', '\u{064A}']), + (0x2fca, &['\u{9ED1}']), + (0xfbe3, &['\u{06C9}']), + (0x32ea, &['\u{30D2}']), + (0x1d6f0, &['\u{039F}']), + (0xfc7d, &['\u{0641}', '\u{064A}']), + (0xfb87, &['\u{068E}']), + (0x24bb, &['\u{0046}']), + (0x1ee74, &['\u{0634}']), + (0xfbd4, &['\u{06AD}']), + (0xfeab, &['\u{0630}']), + (0x3170, &['\u{11DF}']), + (0xfd7f, &['\u{0642}', '\u{0645}', '\u{0645}']), + (0x1ee06, &['\u{0632}']), + (0xfdfb, &['\u{062C}', '\u{0644}', '\u{0020}', '\u{062C}', '\u{0644}', '\u{0627}', '\u{0644}', '\u{0647}']), + (0xfbe4, &['\u{06D0}']), + (0xfb85, &['\u{068C}']), + (0x1f216, &['\u{89E3}']), + (0x1d5c8, &['\u{006F}']), + (0xfcdb, &['\u{064A}', '\u{062D}']), + (0xfc6f, &['\u{0628}', '\u{064A}']), + (0x327b, &['\u{1112}', '\u{1161}']), + (0x2f04, &['\u{4E59}']), + (0x1d7f6, &['\u{0030}']), + (0xfca9, &['\u{062D}', '\u{062C}']), + (0xff2e, &['\u{004E}']), + (0x2f6b, &['\u{76BF}']), + (0x1d4f6, &['\u{006D}']), + (0xfdae, &['\u{064A}', '\u{062D}', '\u{064A}']), + (0x1d672, &['\u{0043}']), + (0xfef6, &['\u{0644}', '\u{0627}', '\u{0653}']), + (0x32af, &['\u{5354}']), + (0xfcb9, &['\u{0638}', '\u{0645}']), + (0xfbd6, &['\u{06AD}']), + (0x1d7f4, &['\u{0038}']), + (0x1d4e9, &['\u{005A}']), + (0x32c7, &['\u{0038}', '\u{6708}']), + (0x32dc, &['\u{30B9}']), + (0x1d530, &['\u{0073}']), + (0x33cc, &['\u{0069}', '\u{006E}']), + (0x1ee80, &['\u{0627}']), + (0xfcf3, &['\u{0640}', '\u{064F}', '\u{0651}']), + (0x333b, &['\u{30D8}', '\u{309A}', '\u{30FC}', '\u{30B7}', '\u{3099}']), + (0x1d5a0, &['\u{0041}']), + (0xfd70, &['\u{0636}', '\u{062E}', '\u{0645}']), + (0xb4, &['\u{0020}', '\u{0301}']), + (0xfd2d, &['\u{0634}', '\u{062C}']), + (0x1eeba, &['\u{0638}']), + (0x1f229, &['\u{4E00}']), + (0x2158, &['\u{0034}', '\u{2044}', '\u{0035}']), + (0x1d737, &['\u{03B2}']), + (0xfc5a, &['\u{064A}', '\u{064A}']), + (0x1eeb0, &['\u{0641}']), + (0x1d35, &['\u{0049}']), + (0x1d7a7, &['\u{03A8}']), + (0x1d771, &['\u{03B2}']), + (0x1d639, &['\u{0078}']), + (0x2083, &['\u{0033}']), + (0x322a, &['\u{0028}', '\u{6708}', '\u{0029}']), + (0x1d516, &['\u{0053}']), + (0xfc35, &['\u{0642}', '\u{0649}']), + (0x1fde, &['\u{0020}', '\u{0314}', '\u{0301}']), + (0x1d69e, &['\u{0075}']), + (0x339f, &['\u{006D}', '\u{006D}', '\u{0032}']), + (0xfecf, &['\u{063A}']), + (0x323d, &['\u{0028}', '\u{4F01}', '\u{0029}']), + (0xff07, &['\u{0027}']), + (0x1f127, &['\u{0028}', '\u{0058}', '\u{0029}']), + (0xff41, &['\u{0061}']), + (0x315b, &['\u{116D}']), + (0x2f8a, &['\u{8272}']), + (0x1d712, &['\u{03C7}']), + (0xfe99, &['\u{062B}']), + (0xfed1, &['\u{0641}']), + (0xfcc8, &['\u{0643}', '\u{0645}']), + (0x323b, &['\u{0028}', '\u{5B66}', '\u{0029}']), + (0x30ff, &['\u{30B3}', '\u{30C8}']), + (0xfb96, &['\u{06B3}']), + (0x329e, &['\u{5370}']), + (0x1d49, &['\u{0065}']), + (0xfb5e, &['\u{067A}']), + (0x2f27, &['\u{5B80}']), + (0x2f8c, &['\u{864D}']), + (0x2f56, &['\u{722A}']), + (0x1d507, &['\u{0044}']), + (0xfc94, &['\u{064A}', '\u{0646}']), + (0x1d63f, &['\u{0044}']), + (0xfd67, &['\u{0634}', '\u{062D}', '\u{0645}']), + (0xff09, &['\u{0029}']), + (0x1d5a4, &['\u{0045}']), + (0xfed3, &['\u{0641}']), + (0x1d39, &['\u{004D}']), + (0x1d61c, &['\u{0055}']), + (0x2497, &['\u{0031}', '\u{0036}', '\u{002E}']), + (0xff91, &['\u{30E0}']), + (0x2f78, &['\u{7F36}']), + (0x33b4, &['\u{0070}', '\u{0056}']), + (0x1eea7, &['\u{062D}']), + (0x2486, &['\u{0028}', '\u{0031}', '\u{0039}', '\u{0029}']), + (0xfc36, &['\u{0642}', '\u{064A}']), + (0x2f25, &['\u{5973}']), + (0x2f98, &['\u{8C78}']), + (0x2477, &['\u{0028}', '\u{0034}', '\u{0029}']), + (0xfc27, &['\u{0637}', '\u{0645}']), + (0x1ee96, &['\u{062B}']), + (0xfdab, &['\u{0636}', '\u{062D}', '\u{064A}']), + (0x1f242, &['\u{3014}', '\u{4E8C}', '\u{3015}']), + (0x3385, &['\u{004B}', '\u{0042}']), + (0x1d59b, &['\u{0076}']), + (0xfc45, &['\u{0645}', '\u{062C}']), + (0x1d6f2, &['\u{03A1}']), + (0x1d54c, &['\u{0055}']), + (0x24a6, &['\u{0028}', '\u{006B}', '\u{0029}']), + (0x1d5ed, &['\u{005A}']), + (0x1d4d8, &['\u{0049}']), + (0x3293, &['\u{793E}']), + (0x2f36, &['\u{5EFE}']), + (0xfcea, &['\u{0634}', '\u{0647}']), + (0x1f121, &['\u{0028}', '\u{0052}', '\u{0029}']), + (0x2149, &['\u{006A}']), + (0xfbf8, &['\u{064A}', '\u{0654}', '\u{06D0}']), + (0xfeca, &['\u{0639}']), + (0x1d5ca, &['\u{0071}']), + (0x1d5b9, &['\u{005A}']), + (0xfe70, &['\u{0020}', '\u{064B}']), + (0x318b, &['\u{1192}']), + (0xff42, &['\u{0062}']), + (0x1d43a, &['\u{0047}']), + (0x1d7ba, &['\u{03C1}']), + (0x1ee7a, &['\u{0638}']), + (0x325d, &['\u{0033}', '\u{0033}']), + (0x1d452, &['\u{0065}']), + (0x317c, &['\u{112F}']), + (0x1d424, &['\u{006B}']), + (0xfcbb, &['\u{0639}', '\u{0645}']), + (0x1d58a, &['\u{0065}']), + (0x327d, &['\u{110C}', '\u{116E}', '\u{110B}', '\u{1174}']), + (0x24c6, &['\u{0051}']), + (0xfdad, &['\u{0644}', '\u{0645}', '\u{064A}']), + (0x32f1, &['\u{30E1}']), + (0xfe3a, &['\u{3015}']), + (0x2498, &['\u{0031}', '\u{0037}', '\u{002E}']), + (0xfb9f, &['\u{06BA}']), + (0xfd7e, &['\u{0642}', '\u{0645}', '\u{062D}']), + (0x336f, &['\u{0032}', '\u{0033}', '\u{70B9}']), + (0xfebb, &['\u{0635}']), + (0xffe5, &['\u{00A5}']), + (0x1ee22, &['\u{062C}']), + (0xff5e, &['\u{007E}']), + (0x1d735, &['\u{2207}']), + (0xfcc3, &['\u{0642}', '\u{0645}']), + (0x2f42, &['\u{6587}']), + (0xfee4, &['\u{0645}']), + (0x2f17, &['\u{5341}']), + (0x2091, &['\u{0065}']), + (0x24ab, &['\u{0028}', '\u{0070}', '\u{0029}']), + (0x1d7e7, &['\u{0035}']), + (0x33db, &['\u{0073}', '\u{0072}']), + (0x1dbc, &['\u{0290}']), + (0x1f109, &['\u{0038}', '\u{002C}']), + (0x3255, &['\u{0032}', '\u{0035}']), + (0x1d5f9, &['\u{006C}']), + (0x1d4bf, &['\u{006A}']), + (0x2f9f, &['\u{8F9B}']), + (0x319a, &['\u{4E59}']), + (0x3275, &['\u{110B}', '\u{1161}']), + (0xfd20, &['\u{062E}', '\u{064A}']), + (0x1d40b, &['\u{004C}']), + (0x2f2f, &['\u{5DE5}']), + (0x1d422, &['\u{0069}']), + (0xfc2e, &['\u{0641}', '\u{062D}']), + (0xff04, &['\u{0024}']), + (0x1eeb1, &['\u{0635}']), + (0x3350, &['\u{30E6}', '\u{30A2}', '\u{30F3}']), + (0x3367, &['\u{0031}', '\u{0035}', '\u{70B9}']), + (0x337e, &['\u{660E}', '\u{6CBB}']), + (0xbe, &['\u{0033}', '\u{2044}', '\u{0034}']), + (0xfbfd, &['\u{06CC}']), + (0x2f5f, &['\u{7389}']), + (0x3348, &['\u{30DF}', '\u{30AF}', '\u{30ED}', '\u{30F3}']), + (0xff11, &['\u{0031}']), + (0x32c9, &['\u{0031}', '\u{0030}', '\u{6708}']), + (0x1ee90, &['\u{0641}']), + (0x1d6f7, &['\u{03A6}']), + (0x247e, &['\u{0028}', '\u{0031}', '\u{0031}', '\u{0029}']), + (0xfeaa, &['\u{062F}']), + (0x1d68d, &['\u{0064}']), + (0x317a, &['\u{112D}']), + (0x1d42b, &['\u{0072}']), + (0x3f2, &['\u{03C2}']), + (0x2f18, &['\u{535C}']), + (0x3347, &['\u{30DE}', '\u{30F3}', '\u{30B7}', '\u{30E7}', '\u{30F3}']), + (0x1d65, &['\u{0076}']), + (0x1d775, &['\u{03B6}']), + (0x1d554, &['\u{0063}']), + (0xff65, &['\u{30FB}']), + (0x249e, &['\u{0028}', '\u{0063}', '\u{0029}']), + (0x2f22, &['\u{590A}']), + (0x1d571, &['\u{0046}']), + (0x1d46a, &['\u{0043}']), + (0x1d53d, &['\u{0046}']), + (0x2099, &['\u{006E}']), + (0xfc52, &['\u{0647}', '\u{0645}']), + (0x1d534, &['\u{0077}']), + (0xfd81, &['\u{0644}', '\u{062D}', '\u{064A}']), + (0x1d701, &['\u{03B6}']), + (0xfe69, &['\u{0024}']), + (0x1d75a, &['\u{0395}']), + (0xfbaa, &['\u{06BE}']), + (0x2f21, &['\u{5902}']), + (0xff1a, &['\u{003A}']), + (0x3276, &['\u{110C}', '\u{1161}']), + (0xfc60, &['\u{0020}', '\u{064E}', '\u{0651}']), + (0x1d6a8, &['\u{0391}']), + (0x1d778, &['\u{03B9}']), + (0xfcc7, &['\u{0643}', '\u{0644}']), + (0x1d574, &['\u{0049}']), + (0x3359, &['\u{0031}', '\u{70B9}']), + (0xfd1f, &['\u{062E}', '\u{0649}']), + (0x3179, &['\u{112C}']), + (0x1eea2, &['\u{062C}']), + (0x3267, &['\u{110B}']), + (0x24ea, &['\u{0030}']), + (0x318a, &['\u{1191}']), + (0x3278, &['\u{110F}', '\u{1161}']), + (0x1d31, &['\u{0045}']), + (0x1d686, &['\u{0057}']), + (0x32a5, &['\u{4E2D}']), + (0x2f2c, &['\u{5C6E}']), + (0xfcd1, &['\u{0645}', '\u{0645}']), + (0x1d500, &['\u{0077}']), + (0xfc0b, &['\u{062A}', '\u{062C}']), + (0x327c, &['\u{110E}', '\u{1161}', '\u{11B7}', '\u{1100}', '\u{1169}']), + (0xff14, &['\u{0034}']), + (0x1d74d, &['\u{03C8}']), + (0xfe71, &['\u{0640}', '\u{064B}']), + (0xff99, &['\u{30EB}']), + (0xfdc3, &['\u{0643}', '\u{0645}', '\u{0645}']), + (0x2f95, &['\u{8C37}']), + (0x1f113, &['\u{0028}', '\u{0044}', '\u{0029}']), + (0x1d481, &['\u{005A}']), + (0x2155, &['\u{0031}', '\u{2044}', '\u{0035}']), + (0x1daa, &['\u{1D85}']), + (0x1d7cb, &['\u{03DD}']), + (0xfc13, &['\u{062B}', '\u{0649}']), + (0x2f6a, &['\u{76AE}']), + (0xfb8c, &['\u{0691}']), + (0x2f5b, &['\u{7259}']), + (0xfc96, &['\u{064A}', '\u{064A}']), + (0x1d728, &['\u{039D}']), + (0x1d565, &['\u{0074}']), + (0x1ee6c, &['\u{0645}']), + (0x1fcf, &['\u{0020}', '\u{0313}', '\u{0342}']), + (0x1f142, &['\u{0053}']), + (0x1f115, &['\u{0028}', '\u{0046}', '\u{0029}']), + (0x1d544, &['\u{004D}']), + (0x1db7, &['\u{028A}']), + (0x1eeb7, &['\u{062E}']), + (0xfec4, &['\u{0637}']), + (0x678, &['\u{064A}', '\u{0674}']), + (0xfbee, &['\u{064A}', '\u{0654}', '\u{0648}']), + (0xfc4f, &['\u{0646}', '\u{0649}']), + (0xfead, &['\u{0631}']), + (0x2002, &['\u{0020}']), + (0xfda6, &['\u{062C}', '\u{062D}', '\u{0649}']), + (0x1d431, &['\u{0078}']), + (0xfeb9, &['\u{0635}']), + (0x1d757, &['\u{0392}']), + (0x1ee07, &['\u{062D}']), + (0x1d36, &['\u{004A}']), + (0x1d724, &['\u{0399}']), + (0xfd09, &['\u{0634}', '\u{062C}']), + (0x1ee05, &['\u{0648}']), + (0x1d7c3, &['\u{2202}']), + (0x1d4c8, &['\u{0073}']), + (0x1d30, &['\u{0044}']), + (0x2b0, &['\u{0068}']), + (0x1d7c1, &['\u{03C8}']), + (0x1f234, &['\u{5408}']), + (0xffe1, &['\u{00A3}']), + (0x2468, &['\u{0039}']), + (0x1d416, &['\u{0057}']), + (0x1d569, &['\u{0078}']), + (0xfc87, &['\u{0644}', '\u{064A}']), + (0x215c, &['\u{0033}', '\u{2044}', '\u{0038}']), + (0x1ee4b, &['\u{0644}']), + (0xfe6b, &['\u{0040}']), + (0x313b, &['\u{11B1}']), + (0x1d7ae, &['\u{03B5}']), + (0x1d6bc, &['\u{03A5}']), + (0x1ee62, &['\u{062C}']), + (0x1ee79, &['\u{0636}']), + (0xfc57, &['\u{064A}', '\u{062E}']), + (0x2f3a, &['\u{5F61}']), + (0xfdf9, &['\u{0635}', '\u{0644}', '\u{0649}']), + (0x1ee24, &['\u{0647}']), + (0x1ee03, &['\u{062F}']), + (0x2f19, &['\u{5369}']), + (0xfb27, &['\u{05E8}']), + (0xfd23, &['\u{0636}', '\u{0649}']), + (0x1ee2a, &['\u{0643}']), + (0x2a76, &['\u{003D}', '\u{003D}', '\u{003D}']), + (0xff69, &['\u{30A5}']), + (0x246f, &['\u{0031}', '\u{0036}']), + (0x2f13, &['\u{52F9}']), + (0xfd07, &['\u{0636}', '\u{0649}']), + (0x1d59f, &['\u{007A}']), + (0x1ee52, &['\u{0642}']), + (0xfe77, &['\u{0640}', '\u{064E}']), + (0x2153, &['\u{0031}', '\u{2044}', '\u{0033}']), + (0xfc4d, &['\u{0646}', '\u{062E}']), + (0xfeaf, &['\u{0632}']), + (0x33f4, &['\u{0032}', '\u{0031}', '\u{65E5}']), + (0xfd8a, &['\u{0645}', '\u{062D}', '\u{0645}']), + (0x1d69b, &['\u{0072}']), + (0x1d713, &['\u{03C8}']), + (0xfc93, &['\u{064A}', '\u{0645}']), + (0x3344, &['\u{30DE}', '\u{30A4}', '\u{30EB}']), + (0x1d7a4, &['\u{03A5}']), + (0x1d47f, &['\u{0058}']), + (0x1d546, &['\u{004F}']), + (0xfba1, &['\u{06BB}']), + (0x1d736, &['\u{03B1}']), + (0xfc3c, &['\u{0643}', '\u{0645}']), + (0xfb59, &['\u{067E}']), + (0xfb4f, &['\u{05D0}', '\u{05DC}']), + (0xfeef, &['\u{0649}']), + (0x33c9, &['\u{0047}', '\u{0079}']), + (0x207f, &['\u{006E}']), + (0xff3a, &['\u{005A}']), + (0x1d673, &['\u{0044}']), + (0x1f119, &['\u{0028}', '\u{004A}', '\u{0029}']), + (0xfc1c, &['\u{0633}', '\u{062C}']), + (0x1d649, &['\u{004E}']), + (0x1d589, &['\u{0064}']), + (0x3231, &['\u{0028}', '\u{682A}', '\u{0029}']), + (0x3138, &['\u{1104}']), + (0x247d, &['\u{0028}', '\u{0031}', '\u{0030}', '\u{0029}']), + (0xfcd9, &['\u{0647}', '\u{0670}']), + (0x1dae, &['\u{0272}']), + (0x1d7be, &['\u{03C5}']), + (0x33df, &['\u{0041}', '\u{2215}', '\u{006D}']), + (0x337a, &['\u{0049}', '\u{0055}']), + (0x2f5e, &['\u{7384}']), + (0xa770, &['\u{A76F}']), + (0x1ee8f, &['\u{0639}']), + (0x32b9, &['\u{0034}', '\u{0034}']), + (0x1d44, &['\u{0250}']), + (0x1f2, &['\u{0044}', '\u{007A}']), + (0x1d463, &['\u{0076}']), + (0x3346, &['\u{30DE}', '\u{30EB}', '\u{30AF}']), + (0x1d7a0, &['\u{03A1}']), + (0x2096, &['\u{006B}']), + (0x1d76a, &['\u{03A5}']), + (0xff48, &['\u{0068}']), + (0x1d532, &['\u{0075}']), + (0x24e0, &['\u{0071}']), + (0xfd5d, &['\u{0633}', '\u{062C}', '\u{062D}']), + (0x2134, &['\u{006F}']), + (0xfd1e, &['\u{062C}', '\u{064A}']), + (0x1f226, &['\u{6F14}']), + (0xffda, &['\u{1173}']), + (0x1d69, &['\u{03C6}']), + (0xff21, &['\u{0041}']), + (0x3145, &['\u{1109}']), + (0x3136, &['\u{11AD}']), + (0xfbf2, &['\u{064A}', '\u{0654}', '\u{06C6}']), + (0xfdf6, &['\u{0631}', '\u{0633}', '\u{0648}', '\u{0644}']), + (0x1d68e, &['\u{0065}']), + (0x1d46f, &['\u{0048}']), + (0xffe9, &['\u{2190}']), + (0xfbd7, &['\u{06C7}']), + (0x3133, &['\u{11AA}']), + (0xfd33, &['\u{0637}', '\u{0645}']), + (0x1f13e, &['\u{004F}']), + (0xffba, &['\u{110E}']), + (0x1d50, &['\u{006D}']), + (0xff17, &['\u{0037}']), + (0x24d9, &['\u{006A}']), + (0xfc8c, &['\u{0646}', '\u{0645}']), + (0x1d797, &['\u{0398}']), + (0xfc06, &['\u{0628}', '\u{062D}']), + (0x1d529, &['\u{006C}']), + (0x213b, &['\u{0046}', '\u{0041}', '\u{0058}']), + (0x2167, &['\u{0056}', '\u{0049}', '\u{0049}', '\u{0049}']), + (0x1d75b, &['\u{0396}']), + (0x1d4b, &['\u{025B}']), + (0x2f00, &['\u{4E00}']), + (0xaf, &['\u{0020}', '\u{0304}']), + (0x2f92, &['\u{898B}']), + (0xfc85, &['\u{0644}', '\u{0645}']), + (0xfe61, &['\u{002A}']), + (0x1d671, &['\u{0042}']), + (0x1d411, &['\u{0052}']), + (0x1d42f, &['\u{0076}']), + (0x3244, &['\u{554F}']), + (0x1d51c, &['\u{0059}']), + (0xff92, &['\u{30E1}']), + (0x3395, &['\u{03BC}', '\u{006C}']), + (0x1d674, &['\u{0045}']), + (0xfbe6, &['\u{06D0}']), + (0x1da7, &['\u{1D7B}']), + (0x33a4, &['\u{0063}', '\u{006D}', '\u{0033}']), + (0xfbea, &['\u{064A}', '\u{0654}', '\u{0627}']), + (0x2001, &['\u{0020}']), + (0x1d6cf, &['\u{03BE}']), + (0x2f28, &['\u{5BF8}']), + (0xfe81, &['\u{0627}', '\u{0653}']), + (0x1d7d8, &['\u{0030}']), + (0x1d78, &['\u{043D}']), + (0x2f85, &['\u{81FC}']), + (0x3310, &['\u{30AD}', '\u{3099}', '\u{30AB}', '\u{3099}']), + (0x1d7bd, &['\u{03C4}']), + (0x3259, &['\u{0032}', '\u{0039}']), + (0x1f200, &['\u{307B}', '\u{304B}']), + (0xff57, &['\u{0077}']), + (0x1d517, &['\u{0054}']), + (0x1d62b, &['\u{006A}']), + (0x1d5e, &['\u{03B3}']), + (0x1d55e, &['\u{006D}']), + (0xff82, &['\u{30C4}']), + (0x1f221, &['\u{7D42}']), + (0xfd93, &['\u{0647}', '\u{0645}', '\u{062C}']), + (0xfeb0, &['\u{0632}']), + (0x1d4c5, &['\u{0070}']), + (0x1d792, &['\u{0393}']), + (0x334d, &['\u{30E1}', '\u{30FC}', '\u{30C8}', '\u{30EB}']), + (0x2113, &['\u{006C}']), + (0x1d58c, &['\u{0067}']), + (0xff15, &['\u{0035}']), + (0xfcfd, &['\u{0634}', '\u{0649}']), + (0x1d6a9, &['\u{0392}']), + (0xffd5, &['\u{1170}']), + (0x1ee1c, &['\u{066E}']), + (0xfccb, &['\u{0644}', '\u{062E}']), + (0x1d595, &['\u{0070}']), + (0x1d426, &['\u{006D}']), + (0x1d5f, &['\u{03B4}']), + (0x1d655, &['\u{005A}']), + (0x1d6b5, &['\u{039E}']), + (0xfe48, &['\u{005D}']), + (0xffb1, &['\u{1106}']), + (0x1ffe, &['\u{0020}', '\u{0314}']), + (0xfdf3, &['\u{0627}', '\u{0643}', '\u{0628}', '\u{0631}']), + (0x1d6af, &['\u{0398}']), + (0x1ee1e, &['\u{06A1}']), + (0x1d5f2, &['\u{0065}']), + (0x325c, &['\u{0033}', '\u{0032}']), + (0x1d77c, &['\u{03BD}']), + (0x3383, &['\u{006D}', '\u{0041}']), + (0xfb22, &['\u{05D3}']), + (0x24a8, &['\u{0028}', '\u{006D}', '\u{0029}']), + (0x24c4, &['\u{004F}']), + (0x3142, &['\u{1107}']), + (0x24d8, &['\u{0069}']), + (0xfd9f, &['\u{062A}', '\u{062C}', '\u{064A}']), + (0xfc5e, &['\u{0020}', '\u{064C}', '\u{0651}']), + (0x1f213, &['\u{30C6}', '\u{3099}']), + (0xfe4b, &['\u{0020}', '\u{0305}']), + (0x3238, &['\u{0028}', '\u{52B4}', '\u{0029}']), + (0x1d41b, &['\u{0062}']), + (0x1ee0e, &['\u{0633}']), + (0x24aa, &['\u{0028}', '\u{006F}', '\u{0029}']), + (0x3209, &['\u{0028}', '\u{110E}', '\u{0029}']), + (0xfc79, &['\u{062B}', '\u{0646}']), + (0xfd85, &['\u{0644}', '\u{062E}', '\u{0645}']), + (0x1d64a, &['\u{004F}']), + (0x32fb, &['\u{30EF}']), + (0x2d8, &['\u{0020}', '\u{0306}']), + (0x338c, &['\u{03BC}', '\u{0046}']), + (0xffae, &['\u{11B4}']), + (0x2493, &['\u{0031}', '\u{0032}', '\u{002E}']), + (0x1f128, &['\u{0028}', '\u{0059}', '\u{0029}']), + (0x1ee95, &['\u{062A}']), + (0x2fab, &['\u{96B9}']), + (0x2fc7, &['\u{9EBB}']), + (0xfcd6, &['\u{0646}', '\u{0647}']), + (0x2164, &['\u{0056}']), + (0xff83, &['\u{30C6}']), + (0x2f94, &['\u{8A00}']), + (0x1d6ed, &['\u{039C}']), + (0xfc25, &['\u{0636}', '\u{0645}']), + (0xfb63, &['\u{067F}']), + (0xfc3a, &['\u{0643}', '\u{062E}']), + (0x3262, &['\u{1103}']), + (0x1d7fa, &['\u{0034}']), + (0x336c, &['\u{0032}', '\u{0030}', '\u{70B9}']), + (0x24ae, &['\u{0028}', '\u{0073}', '\u{0029}']), + (0x1d4aa, &['\u{004F}']), + (0x1d755, &['\u{03C0}']), + (0x32f5, &['\u{30E8}']), + (0xfea0, &['\u{062C}']), + (0xffa8, &['\u{1104}']), + (0xfe68, &['\u{005C}']), + (0x1d556, &['\u{0065}']), + (0x2156, &['\u{0032}', '\u{2044}', '\u{0035}']), + (0xfe93, &['\u{0629}']), + (0x1d6f5, &['\u{03A4}']), + (0xfbfb, &['\u{064A}', '\u{0654}', '\u{0649}']), + (0x33b0, &['\u{0070}', '\u{0073}']), + (0x2d9, &['\u{0020}', '\u{0307}']), + (0x1d44d, &['\u{005A}']), + (0x1f14a, &['\u{0048}', '\u{0056}']), + (0xfbdc, &['\u{06C8}']), + (0xff2a, &['\u{004A}']), + (0x3220, &['\u{0028}', '\u{4E00}', '\u{0029}']), + (0x1d63d, &['\u{0042}']), + (0x1d6e9, &['\u{0398}']), + (0xfdc0, &['\u{0645}', '\u{062C}', '\u{064A}']), + (0x1d7a3, &['\u{03A4}']), + (0x1d622, &['\u{0061}']), + (0xff9c, &['\u{30EF}']), + (0x3268, &['\u{110C}']), + (0x1da5, &['\u{0269}']), + (0x3226, &['\u{0028}', '\u{4E03}', '\u{0029}']), + (0x33b9, &['\u{004D}', '\u{0056}']), + (0x1d451, &['\u{0064}']), + (0x1d5d0, &['\u{0077}']), + (0xff6e, &['\u{30E7}']), + (0x2f15, &['\u{531A}']), + (0x32e6, &['\u{30CC}']), + (0xfb28, &['\u{05EA}']), + (0xfd27, &['\u{0634}', '\u{062E}']), + (0xfcf1, &['\u{064A}', '\u{0647}']), + (0x32c5, &['\u{0036}', '\u{6708}']), + (0x1d568, &['\u{0077}']), + (0x1d626, &['\u{0065}']), + (0xfd82, &['\u{0644}', '\u{062D}', '\u{0649}']), + (0x331c, &['\u{30B1}', '\u{30FC}', '\u{30B9}']), + (0x1d513, &['\u{0050}']), + (0x33ad, &['\u{0072}', '\u{0061}', '\u{0064}']), + (0xfcaf, &['\u{0633}', '\u{062E}']), + (0x1d5cf, &['\u{0076}']), + (0x32a4, &['\u{4E0A}']), + (0xffbd, &['\u{1111}']), + (0x1d7a9, &['\u{2207}']), + (0xff2c, &['\u{004C}']), + (0x1d5e6, &['\u{0053}']), + (0x2f54, &['\u{6C34}']), + (0x1ee08, &['\u{0637}']), + (0x2179, &['\u{0078}']), + (0x1db0, &['\u{0274}']), + (0x1d4ea, &['\u{0061}']), + (0x1d5c5, &['\u{006C}']), + (0x1d7e5, &['\u{0033}']), + (0x1d4f2, &['\u{0069}']), + (0x1d65e, &['\u{0069}']), + (0x1d679, &['\u{004A}']), + (0xfcd0, &['\u{0645}', '\u{062E}']), + (0xfb64, &['\u{067F}']), + (0xfc10, &['\u{062A}', '\u{064A}']), + (0xffa7, &['\u{1103}']), + (0x1dba, &['\u{028C}']), + (0xfcef, &['\u{0646}', '\u{0647}']), + (0x3379, &['\u{0064}', '\u{006D}', '\u{0033}']), + (0x1d74b, &['\u{03C6}']), + (0x247c, &['\u{0028}', '\u{0039}', '\u{0029}']), + (0x1da9, &['\u{026D}']), + (0x1d7ec, &['\u{0030}']), + (0x1f106, &['\u{0035}', '\u{002C}']), + (0xfe31, &['\u{2014}']), + (0x1d2d, &['\u{00C6}']), + (0x3252, &['\u{0032}', '\u{0032}']), + (0x33c0, &['\u{006B}', '\u{03A9}']), + (0xfb6e, &['\u{06A6}']), + (0xfc51, &['\u{0647}', '\u{062C}']), + (0xfcdc, &['\u{064A}', '\u{062E}']), + (0x32a9, &['\u{533B}']), + (0x32c8, &['\u{0039}', '\u{6708}']), + (0xfb05, &['\u{0073}', '\u{0074}']), + (0x1d688, &['\u{0059}']), + (0x32ce, &['\u{0065}', '\u{0056}']), + (0x2094, &['\u{0259}']), + (0x1d6fc, &['\u{03B1}']), + (0x32f6, &['\u{30E9}']), + (0x1f135, &['\u{0046}']), + (0x1dbe, &['\u{0292}']), + (0x1d5e5, &['\u{0052}']), + (0xfdf0, &['\u{0635}', '\u{0644}', '\u{06D2}']), + (0xfda1, &['\u{062A}', '\u{062E}', '\u{064A}']), + (0x1d7bf, &['\u{03C6}']), + (0x3316, &['\u{30AD}', '\u{30ED}', '\u{30E1}', '\u{30FC}', '\u{30C8}', '\u{30EB}']), + (0x3391, &['\u{006B}', '\u{0048}', '\u{007A}']), + (0xfc5b, &['\u{0630}', '\u{0670}']), + (0x1d41f, &['\u{0066}']), + (0xfc17, &['\u{062D}', '\u{062C}']), + (0xfcda, &['\u{064A}', '\u{062C}']), + (0x249a, &['\u{0031}', '\u{0039}', '\u{002E}']), + (0x3289, &['\u{5341}']), + (0x2fd1, &['\u{9F4A}']), + (0xfb98, &['\u{06B3}']), + (0x1d538, &['\u{0041}']), + (0xfb58, &['\u{067E}']), + (0x3197, &['\u{4E2D}']), + (0xfc02, &['\u{064A}', '\u{0654}', '\u{0645}']), + (0xff44, &['\u{0064}']), + (0x1d678, &['\u{0049}']), + (0x3254, &['\u{0032}', '\u{0034}']), + (0xfd5c, &['\u{0633}', '\u{062D}', '\u{062C}']), + (0x1d6cd, &['\u{03BC}']), + (0x330c, &['\u{30AB}', '\u{30E9}', '\u{30C3}', '\u{30C8}']), + (0x3307, &['\u{30A8}', '\u{30B9}', '\u{30AF}', '\u{30FC}', '\u{30C8}', '\u{3099}']), + (0x1d7df, &['\u{0037}']), + (0xfc43, &['\u{0644}', '\u{0649}']), + (0x1d643, &['\u{0048}']), + (0x3146, &['\u{110A}']), + (0x1e9a, &['\u{0061}', '\u{02BE}']), + (0xfb99, &['\u{06B3}']), + (0xfd14, &['\u{0639}', '\u{064A}']), + (0x1d4d1, &['\u{0042}']), + (0xfc42, &['\u{0644}', '\u{0645}']), + (0x1d50d, &['\u{004A}']), + (0x2e9f, &['\u{6BCD}']), + (0xfd8b, &['\u{0645}', '\u{062D}', '\u{064A}']), + (0x3250, &['\u{0050}', '\u{0054}', '\u{0045}']), + (0x1f251, &['\u{53EF}']), + (0xfc33, &['\u{0642}', '\u{062D}']), + (0x1ee27, &['\u{062D}']), + (0x1d585, &['\u{005A}']), + (0x209b, &['\u{0073}']), + (0x319f, &['\u{4EBA}']), + (0xff56, &['\u{0076}']), + (0xfdb4, &['\u{0642}', '\u{0645}', '\u{062D}']), + (0xfd31, &['\u{0633}', '\u{0647}']), + (0x1f233, &['\u{7A7A}']), + (0xfc2a, &['\u{0639}', '\u{0645}']), + (0x1d7ce, &['\u{0030}']), + (0xfc2f, &['\u{0641}', '\u{062E}']), + (0x1d59d, &['\u{0078}']), + (0x1d53b, &['\u{0044}']), + (0x1d68f, &['\u{0066}']), + (0x3181, &['\u{114C}']), + (0xff39, &['\u{0059}']), + (0x24ba, &['\u{0045}']), + (0x3302, &['\u{30A2}', '\u{30F3}', '\u{30D8}', '\u{309A}', '\u{30A2}']), + (0x210b, &['\u{0048}']), + (0xfe3d, &['\u{300A}']), + (0x1ee30, &['\u{0641}']), + (0xff81, &['\u{30C1}']), + (0xff5d, &['\u{007D}']), + (0xf0c, &['\u{0F0B}']), + (0x32ae, &['\u{8CC7}']), + (0x2000, &['\u{0020}']), + (0xfc81, &['\u{0643}', '\u{0644}']), + (0xfb60, &['\u{067A}']), + (0x3160, &['\u{1172}']), + (0x1d79a, &['\u{039B}']), + (0x32a2, &['\u{5199}']), + (0x1d521, &['\u{0064}']), + (0xffb4, &['\u{1121}']), + (0x3362, &['\u{0031}', '\u{0030}', '\u{70B9}']), + (0xfd3c, &['\u{0627}', '\u{064B}']), + (0x332c, &['\u{30CF}', '\u{309A}', '\u{30FC}', '\u{30C4}']), + (0x1f12b, &['\u{0043}']), + (0x33fe, &['\u{0033}', '\u{0031}', '\u{65E5}']), + (0x2034, &['\u{2032}', '\u{2032}', '\u{2032}']), + (0xfba2, &['\u{06BB}']), + (0x1d631, &['\u{0070}']), + (0x33f7, &['\u{0032}', '\u{0034}', '\u{65E5}']), + (0xfd2c, &['\u{0636}', '\u{0631}']), + (0x1d5f4, &['\u{0067}']), + (0xff76, &['\u{30AB}']), + (0xfc22, &['\u{0636}', '\u{062C}']), + (0x1f12d, &['\u{0043}', '\u{0044}']), + (0x2f64, &['\u{7528}']), + (0x1d6e6, &['\u{0395}']), + (0x313f, &['\u{11B5}']), + (0x1d742, &['\u{03BD}']), + (0x1d6ae, &['\u{0397}']), + (0x3000, &['\u{0020}']), + (0x1f22d, &['\u{4E2D}']), + (0x1d427, &['\u{006E}']), + (0x3311, &['\u{30AD}', '\u{3099}', '\u{30CB}', '\u{30FC}']), + (0xfc97, &['\u{064A}', '\u{0654}', '\u{062C}']), + (0x24e7, &['\u{0078}']), + (0x2100, &['\u{0061}', '\u{002F}', '\u{0063}']), + (0x3369, &['\u{0031}', '\u{0037}', '\u{70B9}']), + (0x1d42, &['\u{0057}']), + (0x1ee13, &['\u{0631}']), + (0x1d437, &['\u{0044}']), + (0xfc73, &['\u{062A}', '\u{0646}']), + (0xfc16, &['\u{062C}', '\u{0645}']), + (0xfd62, &['\u{0633}', '\u{0645}', '\u{0645}']), + (0x1d4cf, &['\u{007A}']), + (0xfd64, &['\u{0635}', '\u{062D}', '\u{062D}']), + (0x2f89, &['\u{826E}']), + (0x1d6be, &['\u{03A7}']), + (0xfb93, &['\u{06AF}']), + (0xfd17, &['\u{0633}', '\u{0649}']), + (0x333a, &['\u{30D8}', '\u{309A}', '\u{30F3}', '\u{30B9}']), + (0xfd5e, &['\u{0633}', '\u{062C}', '\u{0649}']), + (0xff73, &['\u{30A6}']), + (0x2f0d, &['\u{5196}']), + (0x3212, &['\u{0028}', '\u{1106}', '\u{1161}', '\u{0029}']), + (0x32c0, &['\u{0031}', '\u{6708}']), + (0x215f, &['\u{0031}', '\u{2044}']), + (0x2f62, &['\u{7518}']), + (0xfc04, &['\u{064A}', '\u{0654}', '\u{064A}']), + (0xfb57, &['\u{067E}']), + (0x1f215, &['\u{591A}']), + (0x1f101, &['\u{0030}', '\u{002C}']), + (0x329b, &['\u{5973}']), + (0x1d465, &['\u{0078}']), + (0xff06, &['\u{0026}']), + (0xff3f, &['\u{005F}']), + (0x1d634, &['\u{0073}']), + (0x3242, &['\u{0028}', '\u{81EA}', '\u{0029}']), + (0xfe14, &['\u{003B}']), + (0x1f21e, &['\u{518D}']), + (0xfc59, &['\u{064A}', '\u{0649}']), + (0xfe43, &['\u{300E}']), + (0x1d57, &['\u{0074}']), + (0x1d7d1, &['\u{0033}']), + (0x1d744, &['\u{03BF}']), + (0xfb86, &['\u{068E}']), + (0x1d4da, &['\u{004B}']), + (0xfb06, &['\u{0073}', '\u{0074}']), + (0x1d661, &['\u{006C}']), + (0x1eeb2, &['\u{0642}']), + (0x2f49, &['\u{6708}']), + (0xfcfb, &['\u{0633}', '\u{0649}']), + (0xfd51, &['\u{062A}', '\u{062D}', '\u{062C}']), + (0xfb8f, &['\u{06A9}']), + (0x24be, &['\u{0049}']), + (0x1d4cc, &['\u{0077}']), + (0xfdc5, &['\u{0635}', '\u{0645}', '\u{0645}']), + (0x1d638, &['\u{0077}']), + (0x2b4, &['\u{0279}']), + (0x33ae, &['\u{0072}', '\u{0061}', '\u{0064}', '\u{2215}', '\u{0073}']), + (0xfdf7, &['\u{0639}', '\u{0644}', '\u{064A}', '\u{0647}']), + (0x1d5fe, &['\u{0071}']), + (0x337b, &['\u{5E73}', '\u{6210}']), + (0x1ee0c, &['\u{0645}']), + (0xfb29, &['\u{002B}']), + (0xff0b, &['\u{002B}']), + (0x1d707, &['\u{03BC}']), + (0x1d623, &['\u{0062}']), + (0x322b, &['\u{0028}', '\u{706B}', '\u{0029}']), + (0x32d9, &['\u{30B3}']), + (0xfca2, &['\u{062A}', '\u{062D}']), + (0x1d77f, &['\u{03C0}']), + (0x1d550, &['\u{0059}']), + (0xfcf0, &['\u{064A}', '\u{0645}']), + (0xfb80, &['\u{0687}']), + (0x1d6b8, &['\u{03A1}']), + (0x3d3, &['\u{03A5}', '\u{0301}']), + (0xb3, &['\u{0033}']), + (0x2482, &['\u{0028}', '\u{0031}', '\u{0035}', '\u{0029}']), + (0x2f69, &['\u{767D}']), + (0x2176, &['\u{0076}', '\u{0069}', '\u{0069}']), + (0xffc2, &['\u{1161}']), + (0xb2, &['\u{0032}']), + (0x1d693, &['\u{006A}']), + (0xfc98, &['\u{064A}', '\u{0654}', '\u{062D}']), + (0x2f55, &['\u{706B}']), + (0x2fa1, &['\u{8FB5}']), + (0x1d38, &['\u{004C}']), + (0xffa3, &['\u{11AA}']), + (0x1d436, &['\u{0043}']), + (0xfd83, &['\u{0644}', '\u{062C}', '\u{062C}']), + (0xfc34, &['\u{0642}', '\u{0645}']), + (0xfc95, &['\u{064A}', '\u{0649}']), + (0x1d78f, &['\u{03C0}']), + (0x1d588, &['\u{0063}']), + (0xfcec, &['\u{0643}', '\u{0645}']), + (0x332a, &['\u{30CF}', '\u{30A4}', '\u{30C4}']), + (0x1d4ed, &['\u{0064}']), + (0x32fe, &['\u{30F2}']), + (0x2230, &['\u{222E}', '\u{222E}', '\u{222E}']), + (0x336e, &['\u{0032}', '\u{0032}', '\u{70B9}']), + (0x3177, &['\u{1129}']), + (0x335e, &['\u{0036}', '\u{70B9}']), + (0xfeed, &['\u{0648}']), + (0x1d5db, &['\u{0048}']), + (0x1f12a, &['\u{3014}', '\u{0053}', '\u{3015}']), + (0x1d72e, &['\u{03A3}']), + (0x248c, &['\u{0035}', '\u{002E}']), + (0xff6b, &['\u{30A9}']), + (0xfef1, &['\u{064A}']), + (0x3f9, &['\u{03A3}']), + (0xfedd, &['\u{0644}']), + (0x24b6, &['\u{0041}']), + (0x32c3, &['\u{0034}', '\u{6708}']), + (0x1d79d, &['\u{039E}']), + (0x1d7d4, &['\u{0036}']), + (0xff61, &['\u{3002}']), + (0x1d6f4, &['\u{03A3}']), + (0x337d, &['\u{5927}', '\u{6B63}']), + (0xfd04, &['\u{062E}', '\u{064A}']), + (0xfe57, &['\u{0021}']), + (0x33c4, &['\u{0063}', '\u{0063}']), + (0x216b, &['\u{0058}', '\u{0049}', '\u{0049}']), + (0x3389, &['\u{006B}', '\u{0063}', '\u{0061}', '\u{006C}']), + (0x1d53c, &['\u{0045}']), + (0x1d73b, &['\u{03B6}']), + (0x1eea1, &['\u{0628}']), + (0x1d4e5, &['\u{0056}']), + (0x3219, &['\u{0028}', '\u{1110}', '\u{1161}', '\u{0029}']), + (0x1d4cd, &['\u{0078}']), + (0x2f08, &['\u{4EBA}']), + (0x2136, &['\u{05D1}']), + (0xff2b, &['\u{004B}']), + (0xff90, &['\u{30DF}']), + (0x1db1, &['\u{0275}']), + (0x1eea6, &['\u{0632}']), + (0x32ed, &['\u{30DB}']), + (0xf77, &['\u{0FB2}', '\u{0F71}', '\u{0F80}']), + (0x1d72f, &['\u{03A4}']), + (0x2e4, &['\u{0295}']), + (0x33ab, &['\u{004D}', '\u{0050}', '\u{0061}']), + (0xfef0, &['\u{0649}']), + (0x1f134, &['\u{0045}']), + (0xfdbd, &['\u{0646}', '\u{062C}', '\u{062D}']), + (0x1d6bd, &['\u{03A6}']), + (0x316c, &['\u{11D7}']), + (0x1d6cc, &['\u{03BB}']), + (0x32fd, &['\u{30F1}']), + (0x1d509, &['\u{0046}']), + (0x24a3, &['\u{0028}', '\u{0068}', '\u{0029}']), + (0x33ac, &['\u{0047}', '\u{0050}', '\u{0061}']), + (0xfc86, &['\u{0644}', '\u{0649}']), + (0x2fc6, &['\u{9EA5}']), + (0x2084, &['\u{0034}']), + (0x1d44a, &['\u{0057}']), + (0x1d756, &['\u{0391}']), + (0xfc5c, &['\u{0631}', '\u{0670}']), + (0x318c, &['\u{1194}']), + (0xfe7c, &['\u{0020}', '\u{0651}']), + (0xfc41, &['\u{0644}', '\u{062E}']), + (0x1d609, &['\u{0042}']), + (0x2f73, &['\u{7A74}']), + (0x1eeb9, &['\u{0636}']), + (0x3349, &['\u{30DF}', '\u{30EA}']), + (0x1ca, &['\u{004E}', '\u{004A}']), + (0xfd9d, &['\u{064A}', '\u{0645}', '\u{0645}']), + (0xfba8, &['\u{06C1}']), + (0x1d6a2, &['\u{0079}']), + (0x3381, &['\u{006E}', '\u{0041}']), + (0xfe79, &['\u{0640}', '\u{064F}']), + (0x1d4ca, &['\u{0075}']), + (0x1f218, &['\u{4EA4}']), + (0x1d627, &['\u{0066}']), + (0x1d7d2, &['\u{0034}']), + (0x1d592, &['\u{006D}']), + (0x1d682, &['\u{0053}']), + (0x1d526, &['\u{0069}']), + (0xfb5d, &['\u{0680}']), + (0x32b0, &['\u{591C}']), + (0x1d575, &['\u{004A}']), + (0xfb6f, &['\u{06A6}']), + (0x24dd, &['\u{006E}']), + (0xfd1a, &['\u{0634}', '\u{064A}']), + (0xff9d, &['\u{30F3}']), + (0x1d5b2, &['\u{0053}']), + (0x1f10a, &['\u{0039}', '\u{002C}']), + (0x1f21f, &['\u{65B0}']), + (0x1d794, &['\u{0395}']), + (0xfdb3, &['\u{0646}', '\u{062D}', '\u{064A}']), + (0xfb83, &['\u{068D}']), + (0x3321, &['\u{30B7}', '\u{30EA}', '\u{30F3}', '\u{30AF}', '\u{3099}']), + (0xff10, &['\u{0030}']), + (0x1d60e, &['\u{0047}']), + (0xfbad, &['\u{06BE}']), + (0x1ee92, &['\u{0642}']), + (0xfd8f, &['\u{0645}', '\u{062E}', '\u{0645}']), + (0x2f4a, &['\u{6728}']), + (0xfcd8, &['\u{0647}', '\u{0645}']), + (0x1d647, &['\u{004C}']), + (0x2f40, &['\u{652F}']), + (0x1d64b, &['\u{0050}']), + (0xfbef, &['\u{064A}', '\u{0654}', '\u{0648}']), + (0x1dbf, &['\u{03B8}']), + (0x33a6, &['\u{006B}', '\u{006D}', '\u{0033}']), + (0x1d759, &['\u{0394}']), + (0x1d76d, &['\u{03A8}']), + (0x33c1, &['\u{004D}', '\u{03A9}']), + (0xff28, &['\u{0048}']), + (0xfbe8, &['\u{0649}']), + (0xfea1, &['\u{062D}']), + (0x1d4e4, &['\u{0055}']), + (0x2f41, &['\u{6534}']), + (0x3300, &['\u{30A2}', '\u{30CF}', '\u{309A}', '\u{30FC}', '\u{30C8}']), + (0xfe3e, &['\u{300B}']), + (0x1d539, &['\u{0042}']), + (0x2f72, &['\u{79BE}']), + (0x1d67, &['\u{03B3}']), + (0x1d51e, &['\u{0061}']), + (0x24a0, &['\u{0028}', '\u{0065}', '\u{0029}']), + (0xfb56, &['\u{067E}']), + (0x24bd, &['\u{0048}']), + (0x1d3a, &['\u{004E}']), + (0x1d559, &['\u{0068}']), + (0x1ee16, &['\u{062B}']), + (0x3296, &['\u{8CA1}']), + (0xfc9c, &['\u{0628}', '\u{062C}']), + (0xfe7d, &['\u{0640}', '\u{0651}']), + (0x3291, &['\u{682A}']), + (0x1d4a, &['\u{0259}']), + (0x24d3, &['\u{0064}']), + (0xffcd, &['\u{116A}']), + (0x1ee67, &['\u{062D}']), + (0x1ee7c, &['\u{066E}']), + (0x1d7b7, &['\u{03BE}']), + (0x1d72a, &['\u{039F}']), + (0x1d50f, &['\u{004C}']), + (0x2003, &['\u{0020}']), + (0x2090, &['\u{0061}']), + (0x1f118, &['\u{0028}', '\u{0049}', '\u{0029}']), + (0xfd5f, &['\u{0633}', '\u{0645}', '\u{062D}']), + (0x2189, &['\u{0030}', '\u{2044}', '\u{0033}']), + (0x1d5bd, &['\u{0064}']), + (0xfbf1, &['\u{064A}', '\u{0654}', '\u{06C7}']), + (0x1d656, &['\u{0061}']), + (0x2464, &['\u{0035}']), + (0x1d461, &['\u{0074}']), + (0xfb5c, &['\u{0680}']), + (0xfe47, &['\u{005B}']), + (0x329a, &['\u{7537}']), + (0x1ee42, &['\u{062C}']), + (0x1d6f9, &['\u{03A8}']), + (0xfe19, &['\u{002E}', '\u{002E}', '\u{002E}']), + (0x1f190, &['\u{0044}', '\u{004A}']), + (0xfb75, &['\u{0684}']), + (0x3361, &['\u{0039}', '\u{70B9}']), + (0xfc23, &['\u{0636}', '\u{062D}']), + (0xfb51, &['\u{0671}']), + (0x33fd, &['\u{0033}', '\u{0030}', '\u{65E5}']), + (0xff58, &['\u{0078}']), + (0x1d7f8, &['\u{0032}']), + (0x2f44, &['\u{65A4}']), + (0x1d404, &['\u{0045}']), + (0x2081, &['\u{0031}']), + (0xfe9d, &['\u{062C}']), + (0xf79, &['\u{0FB3}', '\u{0F71}', '\u{0F80}']), + (0x1d70e, &['\u{03C3}']), + (0x316a, &['\u{11CE}']), + (0x1d52, &['\u{006F}']), + (0x1d6b4, &['\u{039D}']), + (0xff4f, &['\u{006F}']), + (0x32ef, &['\u{30DF}']), + (0x3213, &['\u{0028}', '\u{1107}', '\u{1161}', '\u{0029}']), + (0xfb14, &['\u{0574}', '\u{0565}']), + (0x329c, &['\u{9069}']), + (0x1f137, &['\u{0048}']), + (0xfc12, &['\u{062B}', '\u{0645}']), + (0x2e3, &['\u{0078}']), + (0x1d675, &['\u{0046}']), + (0x209c, &['\u{0074}']), + (0x3354, &['\u{30EB}', '\u{30FC}', '\u{30D5}', '\u{3099}', '\u{30EB}']), + (0x211a, &['\u{0051}']), + (0x1ee5f, &['\u{066F}']), + (0xff63, &['\u{300D}']), + (0x339c, &['\u{006D}', '\u{006D}']), + (0xfb7b, &['\u{0686}']), + (0x3318, &['\u{30AF}', '\u{3099}', '\u{30E9}', '\u{30E0}']), + (0x24cd, &['\u{0058}']), + (0x2da, &['\u{0020}', '\u{030A}']), + (0x1d69a, &['\u{0071}']), + (0x2476, &['\u{0028}', '\u{0033}', '\u{0029}']), + (0x2f3f, &['\u{624B}']), + (0x1ee09, &['\u{064A}']), + (0xfb62, &['\u{067F}']), + (0x335a, &['\u{0032}', '\u{70B9}']), + (0x1d7fc, &['\u{0036}']), + (0xffa2, &['\u{1101}']), + (0x1ffd, &['\u{0020}', '\u{0301}']), + (0x1d581, &['\u{0056}']), + (0x32da, &['\u{30B5}']), + (0xfd9b, &['\u{0646}', '\u{0645}', '\u{0649}']), + (0x2f52, &['\u{6C0F}']), + (0x33eb, &['\u{0031}', '\u{0032}', '\u{65E5}']), + (0x1d4b2, &['\u{0057}']), + (0x1ee11, &['\u{0635}']), + (0x326a, &['\u{110F}']), + (0x1d61e, &['\u{0057}']), + (0xfc1a, &['\u{062E}', '\u{062D}']), + (0xfd86, &['\u{0644}', '\u{062E}', '\u{0645}']), + (0x1d714, &['\u{03C9}']), + (0x2fa5, &['\u{91CC}']), + (0xfb24, &['\u{05DB}']), + (0x1ee9b, &['\u{063A}']), + (0x1d3c, &['\u{004F}']), + (0x2089, &['\u{0039}']), + (0xfc91, &['\u{064A}', '\u{0631}']), + (0xfbd8, &['\u{06C7}']), + (0xfecb, &['\u{0639}']), + (0xfe52, &['\u{002E}']), + (0x1d660, &['\u{006B}']), + (0x1d6d4, &['\u{03C3}']), + (0x2005, &['\u{0020}']), + (0xff62, &['\u{300C}']), + (0xfe74, &['\u{0020}', '\u{064D}']), + (0x1d74e, &['\u{03C9}']), + (0x1d5e9, &['\u{0056}']), + (0x2f50, &['\u{6BD4}']), + (0x2f35, &['\u{5EF4}']), + (0xfb9c, &['\u{06B1}']), + (0x1f11f, &['\u{0028}', '\u{0050}', '\u{0029}']), + (0x1d5e4, &['\u{0051}']), + (0x246a, &['\u{0031}', '\u{0031}']), + (0x1d45b, &['\u{006E}']), + (0xfc0c, &['\u{062A}', '\u{062D}']), + (0x1f22f, &['\u{6307}']), + (0x3243, &['\u{0028}', '\u{81F3}', '\u{0029}']), + (0x3228, &['\u{0028}', '\u{4E5D}', '\u{0029}']), + (0x337c, &['\u{662D}', '\u{548C}']), + (0x32c1, &['\u{0032}', '\u{6708}']), + (0x33af, &['\u{0072}', '\u{0061}', '\u{0064}', '\u{2215}', '\u{0073}', '\u{0032}']), + (0xff64, &['\u{3001}']), + (0x1daf, &['\u{0273}']), + (0x1d750, &['\u{03B5}']), + (0xff31, &['\u{0051}']), + (0x1d4bd, &['\u{0068}']), + (0xfb89, &['\u{0688}']), + (0x1d5a, &['\u{026F}']), + (0xffa5, &['\u{11AC}']), + (0x33d1, &['\u{006C}', '\u{006E}']), + (0x207e, &['\u{0029}']), + (0x1db3, &['\u{0282}']), + (0x24bc, &['\u{0047}']), + (0x2fbb, &['\u{9AA8}']), + (0x1d5a7, &['\u{0048}']), + (0x3036, &['\u{3012}']), + (0xfd97, &['\u{0646}', '\u{062C}', '\u{0645}']), + (0xfc11, &['\u{062B}', '\u{062C}']), + (0x1dad, &['\u{0270}']), + (0xfbd3, &['\u{06AD}']), + (0x1d54f, &['\u{0058}']), + (0xfd0f, &['\u{0635}', '\u{0631}']), + (0x1f146, &['\u{0057}']), + (0x33a8, &['\u{006D}', '\u{2215}', '\u{0073}', '\u{0032}']), + (0x319c, &['\u{4E01}']), + (0x2f82, &['\u{81E3}']), + (0x1f144, &['\u{0055}']), + (0xfe82, &['\u{0627}', '\u{0653}']), + (0x1d527, &['\u{006A}']), + (0x1d6ad, &['\u{0396}']), + (0x2f8e, &['\u{8840}']), + (0xfd68, &['\u{0634}', '\u{062D}', '\u{0645}']), + (0x1d435, &['\u{0042}']), + (0xfc40, &['\u{0644}', '\u{062D}']), + (0x339b, &['\u{03BC}', '\u{006D}']), + (0x2112, &['\u{004C}']), + (0xfc76, &['\u{062B}', '\u{0631}']), + (0xfcbe, &['\u{0641}', '\u{062C}']), + (0x3342, &['\u{30DB}', '\u{30FC}', '\u{30F3}']), + (0x1d6e1, &['\u{03C0}']), + (0x1d72b, &['\u{03A0}']), + (0x2f46, &['\u{65E0}']), + (0x1d41, &['\u{0055}']), + (0xfd03, &['\u{062E}', '\u{0649}']), + (0xfec7, &['\u{0638}']), + (0x1d67e, &['\u{004F}']), + (0x1d75e, &['\u{0399}']), + (0x1d522, &['\u{0065}']), + (0xfdc6, &['\u{0633}', '\u{062E}', '\u{064A}']), + (0x3143, &['\u{1108}']), + (0xffd4, &['\u{116F}']), + (0x32dd, &['\u{30BB}']), + (0x2137, &['\u{05D2}']), + (0xfca6, &['\u{062B}', '\u{0645}']), + (0xfd69, &['\u{0634}', '\u{062C}', '\u{064A}']), + (0x2166, &['\u{0056}', '\u{0049}', '\u{0049}']), + (0xfbd9, &['\u{06C6}']), + (0x2fa9, &['\u{961C}']), + (0x3206, &['\u{0028}', '\u{1109}', '\u{0029}']), + (0xfbe2, &['\u{06C9}']), + (0x1d676, &['\u{0047}']), + (0x1d5bb, &['\u{0062}']), + (0xfd74, &['\u{0637}', '\u{0645}', '\u{064A}']), + (0x2151, &['\u{0031}', '\u{2044}', '\u{0039}']), + (0xffe8, &['\u{2502}']), + (0x1e9b, &['\u{0073}', '\u{0307}']), + (0x3269, &['\u{110E}']), + (0xfc9e, &['\u{0628}', '\u{062E}']), + (0x1d4e6, &['\u{0057}']), + (0x1d6c1, &['\u{2207}']), + (0x1eea5, &['\u{0648}']), + (0x1d6c6, &['\u{03B5}']), + (0x3d4, &['\u{03A5}', '\u{0308}']), + (0xfc82, &['\u{0643}', '\u{0645}']), + (0x1ee98, &['\u{0630}']), + (0xfcf9, &['\u{063A}', '\u{0649}']), + (0x3313, &['\u{30AD}', '\u{3099}', '\u{30EB}', '\u{30BF}', '\u{3099}', '\u{30FC}']), + (0x1d4c7, &['\u{0072}']), + (0xff20, &['\u{0040}']), + (0x32de, &['\u{30BD}']), + (0xfd32, &['\u{0634}', '\u{0647}']), + (0x1da1, &['\u{025F}']), + (0xfe66, &['\u{003D}']), + (0xab5c, &['\u{A727}']), + (0xfd0e, &['\u{0633}', '\u{0631}']), + (0x1d48b, &['\u{006A}']), + (0x24b2, &['\u{0028}', '\u{0077}', '\u{0029}']), + (0xfe5f, &['\u{0023}']), + (0xff6f, &['\u{30C3}']), + (0x1d741, &['\u{03BC}']), + (0x32a7, &['\u{5DE6}']), + (0x1d4a2, &['\u{0047}']), + (0x203e, &['\u{0020}', '\u{0305}']), + (0x1d598, &['\u{0073}']), + (0x323c, &['\u{0028}', '\u{76E3}', '\u{0029}']), + (0x247a, &['\u{0028}', '\u{0037}', '\u{0029}']), + (0x1ee8c, &['\u{0645}']), + (0xfb50, &['\u{0671}']), + (0x2fd4, &['\u{9F9C}']), + (0x1d71a, &['\u{03C1}']), + (0x1d402, &['\u{0043}']), + (0x1d6a1, &['\u{0078}']), + (0x3166, &['\u{1115}']), + (0x1d2c, &['\u{0041}']), + (0x1d7b8, &['\u{03BF}']), + (0x1d42d, &['\u{0074}']), + (0x2168, &['\u{0049}', '\u{0058}']), + (0x1d4ff, &['\u{0076}']), + (0x320e, &['\u{0028}', '\u{1100}', '\u{1161}', '\u{0029}']), + (0xfc67, &['\u{064A}', '\u{0654}', '\u{0646}']), + (0xfeb7, &['\u{0634}']), + (0xff34, &['\u{0054}']), + (0xfc05, &['\u{0628}', '\u{062C}']), + (0x3f0, &['\u{03BA}']), + (0x32be, &['\u{0034}', '\u{0039}']), + (0x1d444, &['\u{0051}']), + (0x33a7, &['\u{006D}', '\u{2215}', '\u{0073}']), + (0x32cc, &['\u{0048}', '\u{0067}']), + (0x332e, &['\u{30D2}', '\u{309A}', '\u{30A2}', '\u{30B9}', '\u{30C8}', '\u{30EB}']), + (0xff5f, &['\u{2985}']), + (0x2174, &['\u{0076}']), + (0x1ee97, &['\u{062E}']), + (0x2fbf, &['\u{9B2F}']), + (0x3169, &['\u{11CC}']), + (0x326e, &['\u{1100}', '\u{1161}']), + (0xfb69, &['\u{0679}']), + (0x1ee0d, &['\u{0646}']), + (0x2f33, &['\u{5E7A}']), + (0x13f, &['\u{004C}', '\u{00B7}']), + (0x1fce, &['\u{0020}', '\u{0313}', '\u{0301}']), + (0x3163, &['\u{1175}']), + (0xff4a, &['\u{006A}']), + (0xff72, &['\u{30A4}']), + (0xff0e, &['\u{002E}']), + (0xfda2, &['\u{062A}', '\u{062E}', '\u{0649}']), + (0xff94, &['\u{30E4}']), + (0x1d7f0, &['\u{0034}']), + (0x3331, &['\u{30D2}', '\u{3099}', '\u{30EB}']), + (0x1d709, &['\u{03BE}']), + (0x2101, &['\u{0061}', '\u{002F}', '\u{0073}']), + (0x1ee1a, &['\u{0638}']), + (0x1ee77, &['\u{062E}']), + (0xfc0d, &['\u{062A}', '\u{062E}']), + (0xfcce, &['\u{0645}', '\u{062C}']), + (0x1d6a5, &['\u{0237}']), + (0x33c2, &['\u{0061}', '\u{002E}', '\u{006D}', '\u{002E}']), + (0xfd01, &['\u{062C}', '\u{0649}']), + (0x1d56f, &['\u{0044}']), + (0x2008, &['\u{0020}']), + (0xfc78, &['\u{062B}', '\u{0645}']), + (0x3227, &['\u{0028}', '\u{516B}', '\u{0029}']), + (0x1d447, &['\u{0054}']), + (0x3223, &['\u{0028}', '\u{56DB}', '\u{0029}']), + (0x249d, &['\u{0028}', '\u{0062}', '\u{0029}']), + (0x1d5fc, &['\u{006F}']), + (0x1d50a, &['\u{0047}']), + (0x3397, &['\u{0064}', '\u{006C}']), + (0x1d719, &['\u{03C6}']), + (0xfd30, &['\u{0634}', '\u{0645}']), + (0x3319, &['\u{30AF}', '\u{3099}', '\u{30E9}', '\u{30E0}', '\u{30C8}', '\u{30F3}']), + (0xfc9d, &['\u{0628}', '\u{062D}']), + (0xfc3e, &['\u{0643}', '\u{064A}']), + (0x1d783, &['\u{03C4}']), + (0x1d491, &['\u{0070}']), + (0x3172, &['\u{111E}']), + (0xfbfe, &['\u{06CC}']), + (0x1d4dc, &['\u{004D}']), + (0x1d646, &['\u{004B}']), + (0x1d5d6, &['\u{0043}']), + (0x33dd, &['\u{0057}', '\u{0062}']), + (0x1d540, &['\u{0049}']), + (0xfce6, &['\u{062B}', '\u{0647}']), + (0x1d5dc, &['\u{0049}']), + (0xfcde, &['\u{064A}', '\u{0647}']), + (0x2082, &['\u{0032}']), + (0x1d5c0, &['\u{0067}']), + (0x3152, &['\u{1164}']), + (0x1d5b4, &['\u{0055}']), + (0xfc38, &['\u{0643}', '\u{062C}']), + (0x1d789, &['\u{2202}']), + (0x1d441, &['\u{004E}']), + (0x2f6e, &['\u{77E2}']), + (0x2f45, &['\u{65B9}']), + (0x1d4ef, &['\u{0066}']), + (0x1f239, &['\u{5272}']), + (0x326b, &['\u{1110}']), + (0x1d699, &['\u{0070}']), + (0x2f32, &['\u{5E72}']), + (0x1f130, &['\u{0041}']), + (0x335d, &['\u{0035}', '\u{70B9}']), + (0xab5f, &['\u{AB52}']), + (0x24e5, &['\u{0076}']), + (0x1d6fe, &['\u{03B3}']), + (0xfb17, &['\u{0574}', '\u{056D}']), + (0x1d586, &['\u{0061}']), + (0x1d62, &['\u{0069}']), + (0xfe90, &['\u{0628}']), + (0x1d787, &['\u{03C8}']), + (0x33f0, &['\u{0031}', '\u{0037}', '\u{65E5}']), + (0x2138, &['\u{05D3}']), + (0xfc20, &['\u{0635}', '\u{062D}']), + (0x3298, &['\u{52B4}']), + (0xfd24, &['\u{0636}', '\u{064A}']), + (0xab5d, &['\u{AB37}']), + (0x1ee9a, &['\u{0638}']), + (0xfc53, &['\u{0647}', '\u{0649}']), + (0x1d76e, &['\u{03A9}']), + (0xfe50, &['\u{002C}']), + (0xff9f, &['\u{309A}']), + (0x1d482, &['\u{0061}']), + (0x2102, &['\u{0043}']), + (0xff2f, &['\u{004F}']), + (0xfc1d, &['\u{0633}', '\u{062D}']), + (0xfe54, &['\u{003B}']), + (0x3286, &['\u{4E03}']), + (0xfc0f, &['\u{062A}', '\u{0649}']), + (0x333c, &['\u{30D8}', '\u{3099}', '\u{30FC}', '\u{30BF}']), + (0xfc55, &['\u{064A}', '\u{062C}']), + (0x1d4a6, &['\u{004B}']), + (0x217a, &['\u{0078}', '\u{0069}']), + (0x3353, &['\u{30EB}', '\u{30D2}', '\u{309A}', '\u{30FC}']), + (0x1cb, &['\u{004E}', '\u{006A}']), + (0x331b, &['\u{30AF}', '\u{30ED}', '\u{30FC}', '\u{30CD}']), + (0x3240, &['\u{0028}', '\u{796D}', '\u{0029}']), + (0x1d473, &['\u{004C}']), + (0xfd88, &['\u{0644}', '\u{0645}', '\u{062D}']), + (0x1d456, &['\u{0069}']), + (0x1d593, &['\u{006E}']), + (0x1d785, &['\u{03C6}']), + (0x1d4c2, &['\u{006D}']), + (0x1d6ab, &['\u{0394}']), + (0xfdf8, &['\u{0648}', '\u{0633}', '\u{0644}', '\u{0645}']), + (0xff02, &['\u{0022}']), + (0x3229, &['\u{0028}', '\u{5341}', '\u{0029}']), + (0xfba4, &['\u{06D5}', '\u{0654}']), + (0xfbed, &['\u{064A}', '\u{0654}', '\u{06D5}']), + (0xfe7e, &['\u{0020}', '\u{0652}']), + (0xfbf7, &['\u{064A}', '\u{0654}', '\u{06D0}']), + (0x215a, &['\u{0035}', '\u{2044}', '\u{0036}']), + (0x3167, &['\u{11C7}']), + (0xfb9e, &['\u{06BA}']), + (0xfecc, &['\u{0639}']), + (0xfc61, &['\u{0020}', '\u{064F}', '\u{0651}']), + (0x1d700, &['\u{03B5}']), + (0x1d4fe, &['\u{0075}']), + (0x1d459, &['\u{006C}']), + (0x1d6e5, &['\u{0394}']), + (0xfba3, &['\u{06BB}']), + (0xfc46, &['\u{0645}', '\u{062D}']), + (0x334b, &['\u{30E1}', '\u{30AB}', '\u{3099}']), + (0x1d499, &['\u{0078}']), + (0xfb81, &['\u{0687}']), + (0x1d7e3, &['\u{0031}']), + (0x1d5c, &['\u{1D25}']), + (0x1d4b5, &['\u{005A}']), + (0x1d45e, &['\u{0071}']), + (0x1d55c, &['\u{006B}']), + (0x24a2, &['\u{0028}', '\u{0067}', '\u{0029}']), + (0x1f131, &['\u{0042}']), + (0xfe9e, &['\u{062C}']), + (0x1d4e3, &['\u{0054}']), + (0xfbfc, &['\u{06CC}']), + (0x1d479, &['\u{0052}']), + (0x2dc, &['\u{0020}', '\u{0303}']), + (0xfdf4, &['\u{0645}', '\u{062D}', '\u{0645}', '\u{062F}']), + (0x1d412, &['\u{0053}']), + (0xffcb, &['\u{1168}']), + (0x3171, &['\u{111D}']), + (0xfc8b, &['\u{0646}', '\u{0632}']), + (0xfcf5, &['\u{0637}', '\u{0649}']), + (0x2f79, &['\u{7F51}']), + (0x323e, &['\u{0028}', '\u{8CC7}', '\u{0029}']), + (0x246c, &['\u{0031}', '\u{0033}']), + (0xfd76, &['\u{0639}', '\u{0645}', '\u{0645}']), + (0x1d6c0, &['\u{03A9}']), + (0x2fbd, &['\u{9ADF}']), + (0x1d607, &['\u{007A}']), + (0x2fae, &['\u{975E}']), + (0xfd8e, &['\u{0645}', '\u{062E}', '\u{062C}']), + (0x2f6d, &['\u{77DB}']), + (0xfcb3, &['\u{0635}', '\u{0645}']), + (0x33f3, &['\u{0032}', '\u{0030}', '\u{65E5}']), + (0x1dab, &['\u{029F}']), + (0xfcab, &['\u{062E}', '\u{062C}']), + (0x1d32, &['\u{018E}']), + (0x216f, &['\u{004D}']), + (0xffb3, &['\u{1108}']), + (0x1d613, &['\u{004C}']), + (0x1d5ae, &['\u{004F}']), + (0xfb8a, &['\u{0698}']), + (0x1f14f, &['\u{0057}', '\u{0043}']), + (0x3372, &['\u{0064}', '\u{0061}']), + (0xfec5, &['\u{0638}']), + (0x1d66a, &['\u{0075}']), + (0x1d485, &['\u{0064}']), + (0xfba6, &['\u{06C1}']), + (0x2070, &['\u{0030}']), + (0x2f7a, &['\u{7F8A}']), + (0x2131, &['\u{0046}']), + (0x1ee8d, &['\u{0646}']), + (0x1f110, &['\u{0028}', '\u{0041}', '\u{0029}']), + (0x2133, &['\u{004D}']), + (0x3180, &['\u{1147}']), + (0xfdb2, &['\u{0642}', '\u{0645}', '\u{064A}']), + (0x2109, &['\u{00B0}', '\u{0046}']), + (0x1d542, &['\u{004B}']), + (0x2075, &['\u{0035}']), + (0xfe59, &['\u{0028}']), + (0xfd19, &['\u{0634}', '\u{0649}']), + (0x1d75f, &['\u{039A}']), + (0x24c2, &['\u{004D}']), + (0x1d6ac, &['\u{0395}']), + (0x2f43, &['\u{6597}']), + (0xfd1d, &['\u{062C}', '\u{0649}']), + (0xfc2d, &['\u{0641}', '\u{062C}']), + (0x2f7c, &['\u{8001}']), + (0xff3e, &['\u{005E}']), + (0x1d776, &['\u{03B7}']), + (0x1d9f, &['\u{025C}']), + (0x1f237, &['\u{6708}']), + (0x3256, &['\u{0032}', '\u{0036}']), + (0x332d, &['\u{30CF}', '\u{3099}', '\u{30FC}', '\u{30EC}', '\u{30EB}']), + (0x1d629, &['\u{0068}']), + (0x1ee54, &['\u{0634}']), + (0xff59, &['\u{0079}']), + (0x1f12c, &['\u{0052}']), + (0x1d519, &['\u{0056}']), + (0x33b5, &['\u{006E}', '\u{0056}']), + (0x3392, &['\u{004D}', '\u{0048}', '\u{007A}']), + (0xffd2, &['\u{116D}']), + (0x317d, &['\u{1132}']), + (0xb5, &['\u{03BC}']), + (0x1d557, &['\u{0066}']), + (0xfc68, &['\u{064A}', '\u{0654}', '\u{0649}']), + (0xfce1, &['\u{0628}', '\u{0645}']), + (0x3174, &['\u{1122}']), + (0x3217, &['\u{0028}', '\u{110E}', '\u{1161}', '\u{0029}']), + (0xff55, &['\u{0075}']), + (0xfeb2, &['\u{0633}']), + (0x1d71e, &['\u{0393}']), + (0xfdb1, &['\u{0645}', '\u{0645}', '\u{064A}']), + (0x1d400, &['\u{0041}']), + (0x1f244, &['\u{3014}', '\u{70B9}', '\u{3015}']), + (0xfc0e, &['\u{062A}', '\u{0645}']), + (0x32b4, &['\u{0033}', '\u{0039}']), + (0xfb74, &['\u{0684}']), + (0xfd18, &['\u{0633}', '\u{064A}']), + (0xfe87, &['\u{0627}', '\u{0655}']), + (0x1d5b0, &['\u{0051}']), + (0x33e2, &['\u{0033}', '\u{65E5}']), + (0xfd13, &['\u{0639}', '\u{0649}']), + (0x1d685, &['\u{0056}']), + (0x2087, &['\u{0037}']), + (0xfbde, &['\u{06CB}']), + (0x1d47, &['\u{0062}']), + (0x309b, &['\u{0020}', '\u{3099}']), + (0x1d690, &['\u{0067}']), + (0x1d6c5, &['\u{03B4}']), + (0xfef9, &['\u{0644}', '\u{0627}', '\u{0655}']), + (0x2154, &['\u{0032}', '\u{2044}', '\u{0033}']), + (0xfd54, &['\u{062A}', '\u{062E}', '\u{0645}']), + (0x1d6ef, &['\u{039E}']), + (0x316e, &['\u{111C}']), + (0x1fee, &['\u{0020}', '\u{0308}', '\u{0301}']), + (0x1d448, &['\u{0055}']), + (0xfb26, &['\u{05DD}']), + (0x1d68a, &['\u{0061}']), + (0x24a9, &['\u{0028}', '\u{006E}', '\u{0029}']), + (0x1d45d, &['\u{0070}']), + (0x1d733, &['\u{03A8}']), + (0x2f97, &['\u{8C55}']), + (0x1f11e, &['\u{0028}', '\u{004F}', '\u{0029}']), + (0x2f3b, &['\u{5F73}']), + (0xfdaf, &['\u{064A}', '\u{062C}', '\u{064A}']), + (0xfc8a, &['\u{0646}', '\u{0631}']), + (0xffec, &['\u{2193}']), + (0x1d62c, &['\u{006B}']), + (0xfee6, &['\u{0646}']), + (0xff93, &['\u{30E2}']), + (0xfe10, &['\u{002C}']), + (0x1d46, &['\u{1D02}']), + (0xff8f, &['\u{30DE}']), + (0x1d5a2, &['\u{0043}']), + (0x1d583, &['\u{0058}']), + (0x1d684, &['\u{0055}']), + (0x1ee81, &['\u{0628}']), + (0x17f, &['\u{0073}']), + (0x37a, &['\u{0020}', '\u{0345}']), + (0x2474, &['\u{0028}', '\u{0031}', '\u{0029}']), + (0xff7f, &['\u{30BD}']), + (0x1f133, &['\u{0044}']), + (0x32a0, &['\u{9805}']), + (0xfd63, &['\u{0633}', '\u{0645}', '\u{0645}']), + (0x1d739, &['\u{03B4}']), + (0x1d558, &['\u{0067}']), + (0xfc6d, &['\u{0628}', '\u{0646}']), + (0x1d667, &['\u{0072}']), + (0x2f1c, &['\u{53C8}']), + (0xfefa, &['\u{0644}', '\u{0627}', '\u{0655}']), + (0x1ee5d, &['\u{06BA}']), + (0x1f13d, &['\u{004E}']), + (0x1d555, &['\u{0064}']), + (0x3207, &['\u{0028}', '\u{110B}', '\u{0029}']), + (0x1d7ca, &['\u{03DC}']), + (0x1d6b1, &['\u{039A}']), + (0x317e, &['\u{1136}']), + (0xfe95, &['\u{062A}']), + (0x1d438, &['\u{0045}']), + (0x3195, &['\u{56DB}']), + (0x1d727, &['\u{039C}']), + (0x1d662, &['\u{006D}']), + (0x325e, &['\u{0033}', '\u{0034}']), + (0xfcd5, &['\u{0646}', '\u{0645}']), + (0x1d677, &['\u{0048}']), + (0x1d7db, &['\u{0033}']), + (0x3134, &['\u{1102}']), + (0x1d6fb, &['\u{2207}']), + (0x212f, &['\u{0065}']), + (0x3193, &['\u{4E8C}']), + (0x1d780, &['\u{03C1}']), + (0x2c7c, &['\u{006A}']), + (0x1d59a, &['\u{0075}']), + (0xfe4d, &['\u{005F}']), + (0x24c3, &['\u{004E}']), + (0x2026, &['\u{002E}', '\u{002E}', '\u{002E}']), + (0x217d, &['\u{0063}']), + (0x211c, &['\u{0052}']), + (0x2f58, &['\u{723B}']), + (0x1d40e, &['\u{004F}']), + (0x1d76b, &['\u{03A6}']), + (0xfd2f, &['\u{0634}', '\u{062E}']), + (0x1d710, &['\u{03C5}']), + (0xffa4, &['\u{1102}']), + (0xfc1e, &['\u{0633}', '\u{062E}']), + (0x24c5, &['\u{0050}']), + (0x24cb, &['\u{0056}']), + (0x3339, &['\u{30D8}', '\u{30EB}', '\u{30C4}']), + (0x1d4eb, &['\u{0062}']), + (0xfd77, &['\u{0639}', '\u{0645}', '\u{0645}']), + (0xfc00, &['\u{064A}', '\u{0654}', '\u{062C}']), + (0x3337, &['\u{30D8}', '\u{309A}', '\u{30BD}']), + (0x248d, &['\u{0036}', '\u{002E}']), + (0xfd65, &['\u{0635}', '\u{062D}', '\u{062D}']), + (0x315e, &['\u{1170}']), + (0x1d566, &['\u{0075}']), + (0x2fcc, &['\u{9EFD}']), + (0x1d4d5, &['\u{0046}']), + (0x1d5a6, &['\u{0047}']), + (0x3309, &['\u{30AA}', '\u{30F3}', '\u{30B9}']), + (0x1d637, &['\u{0076}']), + (0x24c1, &['\u{004C}']), + (0xfc58, &['\u{064A}', '\u{0645}']), + (0x1d57d, &['\u{0052}']), + (0xfc37, &['\u{0643}', '\u{0627}']), + (0xff0a, &['\u{002A}']), + (0xfda3, &['\u{062A}', '\u{0645}', '\u{064A}']), + (0xff68, &['\u{30A3}']), + (0x1d432, &['\u{0079}']), + (0xab5e, &['\u{026B}']), + (0x2a0c, &['\u{222B}', '\u{222B}', '\u{222B}', '\u{222B}']), + (0xfd2b, &['\u{0635}', '\u{0631}']), + (0x2161, &['\u{0049}', '\u{0049}']), + (0x3398, &['\u{006B}', '\u{006C}']), + (0x2489, &['\u{0032}', '\u{002E}']), + (0x333f, &['\u{30DB}', '\u{30F3}']), + (0x24e6, &['\u{0077}']), + (0x202f, &['\u{0020}']), + (0xfcaa, &['\u{062D}', '\u{0645}']), + (0x2139, &['\u{0069}']), + (0x1d449, &['\u{0056}']), + (0x3148, &['\u{110C}']), + (0xfccf, &['\u{0645}', '\u{062D}']), + (0x1d531, &['\u{0074}']), + (0x33aa, &['\u{006B}', '\u{0050}', '\u{0061}']), + (0xfd6d, &['\u{0634}', '\u{0645}', '\u{0645}']), + (0x316d, &['\u{11D9}']), + (0x1d53e, &['\u{0047}']), + (0x3356, &['\u{30EC}', '\u{30F3}', '\u{30C8}', '\u{30B1}', '\u{3099}', '\u{30F3}']), + (0x1d749, &['\u{03C4}']), + (0xfb7e, &['\u{0687}']), + (0x1d5d9, &['\u{0046}']), + (0x2492, &['\u{0031}', '\u{0031}', '\u{002E}']), + (0x2130, &['\u{0045}']), + (0x1d6f6, &['\u{03A5}']), + (0x1d5b, &['\u{0076}']), + (0x2fc2, &['\u{9B5A}']), + (0x1d6e4, &['\u{0393}']), + (0x1d7e8, &['\u{0036}']), + (0xff88, &['\u{30CD}']), + (0x1d61, &['\u{03C7}']), + (0xfb15, &['\u{0574}', '\u{056B}']), + (0x32d1, &['\u{30A4}']), + (0x1d7bc, &['\u{03C3}']), + (0x313e, &['\u{11B4}']), + (0x33ea, &['\u{0031}', '\u{0031}', '\u{65E5}']), + (0xfc6c, &['\u{0628}', '\u{0645}']), + (0x2fac, &['\u{96E8}']), + (0xfbf3, &['\u{064A}', '\u{0654}', '\u{06C6}']), + (0x1d6ff, &['\u{03B4}']), + (0xfe78, &['\u{0020}', '\u{064F}']), + (0x329f, &['\u{6CE8}']), + (0x2f2e, &['\u{5DDB}']), + (0x3371, &['\u{0068}', '\u{0050}', '\u{0061}']), + (0x24b7, &['\u{0042}']), + (0x1ee18, &['\u{0630}']), + (0xfc3b, &['\u{0643}', '\u{0644}']), + (0x1d63e, &['\u{0043}']), + (0x1d47d, &['\u{0056}']), + (0x1d72d, &['\u{0398}']), + (0x1d579, &['\u{004E}']), + (0x2fb8, &['\u{9996}']), + (0x2461, &['\u{0032}']), + (0x2077, &['\u{0037}']), + (0xfb7a, &['\u{0686}']), + (0x2f2d, &['\u{5C71}']), + (0x32e9, &['\u{30CF}']), + (0x1d4f4, &['\u{006B}']), + (0x1d45f, &['\u{0072}']), + (0x1d66d, &['\u{0078}']), + (0x3334, &['\u{30D5}', '\u{3099}', '\u{30C3}', '\u{30B7}', '\u{30A7}', '\u{30EB}']), + (0xfc6a, &['\u{0628}', '\u{0631}']), + (0xeb3, &['\u{0ECD}', '\u{0EB2}']), + (0x1d71d, &['\u{0392}']), + (0x1d471, &['\u{004A}']), + (0x3295, &['\u{7279}']), + (0x1d7b3, &['\u{03BA}']), + (0x1d60, &['\u{03C6}']), + (0x2b6, &['\u{0281}']), + (0x3387, &['\u{0047}', '\u{0042}']), + (0x321c, &['\u{0028}', '\u{110C}', '\u{116E}', '\u{0029}']), + (0xfe5d, &['\u{3014}']), + (0x32ba, &['\u{0034}', '\u{0035}']), + (0x24bf, &['\u{004A}']), + (0xfeb8, &['\u{0634}']), + (0xfc83, &['\u{0643}', '\u{0649}']), + (0x1d67c, &['\u{004D}']), + (0x2fc0, &['\u{9B32}']), + (0x33f9, &['\u{0032}', '\u{0036}', '\u{65E5}']), + (0x3178, &['\u{112B}']), + (0x1ee89, &['\u{064A}']), + (0xfd79, &['\u{063A}', '\u{0645}', '\u{0645}']), + (0x3210, &['\u{0028}', '\u{1103}', '\u{1161}', '\u{0029}']), + (0xfcf2, &['\u{0640}', '\u{064E}', '\u{0651}']), + (0x1d591, &['\u{006C}']), + (0x1d604, &['\u{0077}']), + (0xfe9f, &['\u{062C}']), + (0xff3d, &['\u{005D}']), + (0x3235, &['\u{0028}', '\u{7279}', '\u{0029}']), + (0x1d49f, &['\u{0044}']), + (0xfbe9, &['\u{0649}']), + (0x33bc, &['\u{03BC}', '\u{0057}']), + (0x3161, &['\u{1173}']), + (0x1d77a, &['\u{03BB}']), + (0xfe5a, &['\u{0029}']), + (0x1d697, &['\u{006E}']), + (0xfb53, &['\u{067B}']), + (0x1d58f, &['\u{006A}']), + (0x1ee93, &['\u{0631}']), + (0xfe56, &['\u{003F}']), + (0x3201, &['\u{0028}', '\u{1102}', '\u{0029}']), + (0x1ee91, &['\u{0635}']), + (0x1d40d, &['\u{004E}']), + (0x2150, &['\u{0031}', '\u{2044}', '\u{0037}']), + (0x210d, &['\u{0048}']), + (0x1f13f, &['\u{0050}']), + (0x1d734, &['\u{03A9}']), + (0x1d5d1, &['\u{0078}']), + (0x3340, &['\u{30DB}', '\u{309A}', '\u{30F3}', '\u{30C8}', '\u{3099}']), + (0x1d599, &['\u{0074}']), + (0x1d409, &['\u{004A}']), + (0xfc1b, &['\u{062E}', '\u{0645}']), + (0x1f23b, &['\u{914D}']), + (0xfc47, &['\u{0645}', '\u{062E}']), + (0x3257, &['\u{0032}', '\u{0037}']), + (0x2169, &['\u{0058}']), + (0x246d, &['\u{0031}', '\u{0034}']), + (0x1d612, &['\u{004B}']), + (0xfb55, &['\u{067B}']), + (0xfe84, &['\u{0627}', '\u{0654}']), + (0x1d798, &['\u{0399}']), + (0x216a, &['\u{0058}', '\u{0049}']), + (0x2fc9, &['\u{9ECD}']), + (0xfe80, &['\u{0621}']), + (0x1d428, &['\u{006F}']), + (0x2159, &['\u{0031}', '\u{2044}', '\u{0036}']), + (0x3283, &['\u{56DB}']), + (0x1d480, &['\u{0059}']), + (0xfeeb, &['\u{0647}']), + (0x1d536, &['\u{0079}']), + (0xff67, &['\u{30A1}']), + (0x3144, &['\u{1121}']), + (0x1d738, &['\u{03B3}']), + (0xfefb, &['\u{0644}', '\u{0627}']), + (0x1d6ea, &['\u{0399}']), + (0x1d6ee, &['\u{039D}']), + (0xfec6, &['\u{0638}']), + (0x1d64c, &['\u{0051}']), + (0xfba5, &['\u{06D5}', '\u{0654}']), + (0x2033, &['\u{2032}', '\u{2032}']), + (0xfe8c, &['\u{064A}', '\u{0654}']), + (0x2fd3, &['\u{9F8D}']), + (0x32e3, &['\u{30C8}']), + (0x1d48c, &['\u{006B}']), + (0xff8d, &['\u{30D8}']), + (0x1d4d0, &['\u{0041}']), + (0x1d403, &['\u{0044}']), + (0x1d7e0, &['\u{0038}']), + (0xfeb1, &['\u{0633}']), + (0x24e4, &['\u{0075}']), + (0xfb76, &['\u{0683}']), + (0x2f76, &['\u{7C73}']), + (0x2465, &['\u{0036}']), + (0x2163, &['\u{0049}', '\u{0056}']), + (0x1d4ab, &['\u{0050}']), + (0xfcb5, &['\u{0636}', '\u{062D}']), + (0x2f66, &['\u{758B}']), + (0x211b, &['\u{0052}']), + (0x1d5f6, &['\u{0069}']), + (0x2fb1, &['\u{97CB}']), + (0x1ee2e, &['\u{0633}']), + (0x2071, &['\u{0069}']), + (0x1d4bb, &['\u{0066}']), + (0x33fc, &['\u{0032}', '\u{0039}', '\u{65E5}']), + (0x2fc1, &['\u{9B3C}']), + (0x1d4fb, &['\u{0072}']), + (0x2478, &['\u{0028}', '\u{0035}', '\u{0029}']), + (0xbc, &['\u{0031}', '\u{2044}', '\u{0034}']), + (0x1d6f8, &['\u{03A7}']), + (0x1d535, &['\u{0078}']), + (0x1d5bc, &['\u{0063}']), + (0x2165, &['\u{0056}', '\u{0049}']), + (0xff35, &['\u{0055}']), + (0x24b0, &['\u{0028}', '\u{0075}', '\u{0029}']), + (0x322d, &['\u{0028}', '\u{6728}', '\u{0029}']), + (0x1d413, &['\u{0054}']), + (0x1d65b, &['\u{0066}']), + (0x2463, &['\u{0034}']), + (0x1eeb5, &['\u{062A}']), + (0x208b, &['\u{2212}']), + (0x32d7, &['\u{30AF}']), + (0x1d67f, &['\u{0050}']), + (0x2f91, &['\u{897E}']), + (0x246b, &['\u{0031}', '\u{0032}']), + (0x2fa6, &['\u{91D1}']), + (0x1d628, &['\u{0067}']), + (0x2f8d, &['\u{866B}']), + (0xfec8, &['\u{0638}']), + (0x1d788, &['\u{03C9}']), + (0x1d715, &['\u{2202}']), + (0xfcac, &['\u{062E}', '\u{0645}']), + (0x1d774, &['\u{03B5}']), + (0xfef4, &['\u{064A}']), + (0x1d401, &['\u{0042}']), + (0x32e8, &['\u{30CE}']), + (0x328a, &['\u{6708}']), + (0x33f6, &['\u{0032}', '\u{0033}', '\u{65E5}']), + (0x1d70d, &['\u{03C2}']), + (0x1d642, &['\u{0047}']), + (0xfcbd, &['\u{063A}', '\u{0645}']), + (0x3304, &['\u{30A4}', '\u{30CB}', '\u{30F3}', '\u{30AF}', '\u{3099}']), + (0x3198, &['\u{4E0B}']), + (0xffc6, &['\u{1165}']), + (0x3265, &['\u{1107}']), + (0x33e8, &['\u{0039}', '\u{65E5}']), + (0xfccd, &['\u{0644}', '\u{0647}']), + (0x2f53, &['\u{6C14}']), + (0x1d410, &['\u{0051}']), + (0x1d5e3, &['\u{0050}']), + (0xfee1, &['\u{0645}']), + (0xfc07, &['\u{0628}', '\u{062E}']), + (0x2f51, &['\u{6BDB}']), + (0xffa1, &['\u{1100}']), + (0xfe12, &['\u{3002}']), + (0x33e6, &['\u{0037}', '\u{65E5}']), + (0x33d7, &['\u{0050}', '\u{0048}']), + (0x1d40c, &['\u{004D}']), + (0x1fed, &['\u{0020}', '\u{0308}', '\u{0300}']), + (0x1d6d5, &['\u{03C4}']), + (0x2f4d, &['\u{6B79}']), + (0xfd98, &['\u{0646}', '\u{062C}', '\u{0645}']), + (0x32c4, &['\u{0035}', '\u{6708}']), + (0xffe3, &['\u{0020}', '\u{0304}']), + (0x1d40, &['\u{0054}']), + (0xfb65, &['\u{067F}']), + (0x3208, &['\u{0028}', '\u{110C}', '\u{0029}']), + (0x32fc, &['\u{30F0}']), + (0xfe94, &['\u{0629}']), + (0x32a3, &['\u{6B63}']), + (0x1d34, &['\u{0048}']), + (0xfe85, &['\u{0648}', '\u{0654}']), + (0x200a, &['\u{0020}']), + (0x1d617, &['\u{0050}']), + (0x2fcb, &['\u{9EF9}']), + (0x318e, &['\u{11A1}']), + (0x32df, &['\u{30BF}']), + (0x327e, &['\u{110B}', '\u{116E}']), + (0xfea4, &['\u{062D}']), + (0x2f83, &['\u{81EA}']), + (0xffe4, &['\u{00A6}']), + (0xfce4, &['\u{062A}', '\u{0647}']), + (0x1f13b, &['\u{004C}']), + (0x24d1, &['\u{0062}']), + (0x24d6, &['\u{0067}']), + (0x1d578, &['\u{004D}']), + (0xfc9a, &['\u{064A}', '\u{0654}', '\u{0645}']), + (0x32f7, &['\u{30EA}']), + (0xfc70, &['\u{062A}', '\u{0631}']), + (0x1d4c, &['\u{025C}']), + (0xfb84, &['\u{068C}']), + (0x1d4d7, &['\u{0048}']), + (0x2f88, &['\u{821F}']), + (0xfe97, &['\u{062A}']), + (0xff70, &['\u{30FC}']), + (0xfd58, &['\u{062C}', '\u{0645}', '\u{062D}']), + (0x314b, &['\u{110F}']), + (0x1d62e, &['\u{006D}']), + (0x2fad, &['\u{9751}']), + (0x2f14, &['\u{5315}']), + (0xfc50, &['\u{0646}', '\u{064A}']), + (0x336b, &['\u{0031}', '\u{0039}', '\u{70B9}']), + (0x3234, &['\u{0028}', '\u{540D}', '\u{0029}']), + (0x2fd2, &['\u{9F52}']), + (0x1f243, &['\u{3014}', '\u{5B89}', '\u{3015}']), + (0x1d442, &['\u{004F}']), + (0x140, &['\u{006C}', '\u{00B7}']), + (0x32bf, &['\u{0035}', '\u{0030}']), + (0x1f100, &['\u{0030}', '\u{002E}']), + (0xffce, &['\u{116B}']), + (0xfdf1, &['\u{0642}', '\u{0644}', '\u{06D2}']), + (0x3131, &['\u{1100}']), + (0x33da, &['\u{0050}', '\u{0052}']), + (0x314e, &['\u{1112}']), + (0xfe8a, &['\u{064A}', '\u{0654}']), + (0x3153, &['\u{1165}']), + (0x2120, &['\u{0053}', '\u{004D}']), + (0xfed9, &['\u{0643}']), + (0x1d3f, &['\u{0052}']), + (0x1d716, &['\u{03B5}']), + (0x317b, &['\u{112E}']), + (0x3260, &['\u{1100}']), + (0xfc03, &['\u{064A}', '\u{0654}', '\u{0649}']), + (0x1d421, &['\u{0068}']), + (0xfd15, &['\u{063A}', '\u{0649}']), + (0xfcc4, &['\u{0643}', '\u{062C}']), + (0xfc7c, &['\u{0641}', '\u{0649}']), + (0x1d73e, &['\u{03B9}']), + (0x1d440, &['\u{004D}']), + (0x2fa8, &['\u{9580}']), + (0x33ba, &['\u{0070}', '\u{0057}']), + (0xfe40, &['\u{3009}']), + (0xfb20, &['\u{05E2}']), + (0xfdb9, &['\u{0645}', '\u{062E}', '\u{064A}']), + (0x1d5eb, &['\u{0058}']), + (0x32b7, &['\u{0034}', '\u{0032}']), + (0x1d618, &['\u{0051}']), + (0x1d79e, &['\u{039F}']), + (0x1d572, &['\u{0047}']), + (0xfd8c, &['\u{0645}', '\u{062C}', '\u{062D}']), + (0x2480, &['\u{0028}', '\u{0031}', '\u{0033}', '\u{0029}']), + (0x3301, &['\u{30A2}', '\u{30EB}', '\u{30D5}', '\u{30A1}']), + (0x1d5ee, &['\u{0061}']), + (0xfdaa, &['\u{0634}', '\u{062D}', '\u{064A}']), + (0xfcc6, &['\u{0643}', '\u{062E}']), + (0x1d56e, &['\u{0043}']), + (0x1ee39, &['\u{0636}']), + (0x2f29, &['\u{5C0F}']), + (0x1d3d, &['\u{0222}']), + (0x3273, &['\u{1107}', '\u{1161}']), + (0x1d60b, &['\u{0044}']), + (0xfd36, &['\u{0633}', '\u{062E}']), + (0x3368, &['\u{0031}', '\u{0036}', '\u{70B9}']), + (0x1d4fa, &['\u{0071}']), + (0x1db6, &['\u{0289}']), + (0x1d779, &['\u{03BA}']), + (0x1d5ba, &['\u{0061}']), + (0x1eead, &['\u{0646}']), + (0x2116, &['\u{004E}', '\u{006F}']), + (0x338d, &['\u{03BC}', '\u{0067}']), + (0x24d4, &['\u{0065}']), + (0x1d405, &['\u{0046}']), + (0xfc08, &['\u{0628}', '\u{0645}']), + (0x1d497, &['\u{0076}']), + (0x33ff, &['\u{0067}', '\u{0061}', '\u{006C}']), + (0x1d582, &['\u{0057}']), + (0xfede, &['\u{0644}']), + (0x1d603, &['\u{0076}']), + (0x2004, &['\u{0020}']), + (0x3239, &['\u{0028}', '\u{4EE3}', '\u{0029}']), + (0xfb94, &['\u{06AF}']), + (0x2f63, &['\u{751F}']), + (0x1d46c, &['\u{0045}']), + (0x1d4c6, &['\u{0071}']), + (0x203c, &['\u{0021}', '\u{0021}']), + (0xff75, &['\u{30AA}']), + (0xff79, &['\u{30B1}']), + (0x215b, &['\u{0031}', '\u{2044}', '\u{0038}']), + (0x2462, &['\u{0033}']), + (0xfca1, &['\u{062A}', '\u{062C}']), + (0xfc28, &['\u{0638}', '\u{0645}']), + (0xff77, &['\u{30AD}']), + (0x1ee51, &['\u{0635}']), + (0x3360, &['\u{0038}', '\u{70B9}']), + (0x1d78e, &['\u{03C1}']), + (0x2145, &['\u{0044}']), + (0x1d7b6, &['\u{03BD}']), + (0x1c8, &['\u{004C}', '\u{006A}']), + (0x3364, &['\u{0031}', '\u{0032}', '\u{70B9}']), + (0xfc9f, &['\u{0628}', '\u{0645}']), + (0xfd3a, &['\u{0637}', '\u{0645}']), + (0xfb73, &['\u{0684}']), + (0x1d55a, &['\u{0069}']), + (0xffc3, &['\u{1162}']), + (0x1d564, &['\u{0073}']), + (0x3352, &['\u{30EA}', '\u{30E9}']), + (0x1d52a, &['\u{006D}']), + (0x1d5d8, &['\u{0045}']), + (0x1d4f0, &['\u{0067}']), + (0xffd3, &['\u{116E}']), + (0x1f12e, &['\u{0057}', '\u{005A}']), + (0x1ee76, &['\u{062B}']), + (0x1d59e, &['\u{0079}']), + (0xfe39, &['\u{3014}']), + (0xff74, &['\u{30A8}']), + (0x3164, &['\u{1160}']), + (0xfb90, &['\u{06A9}']), + (0x314f, &['\u{1161}']), + (0x1d47c, &['\u{0055}']), + (0x1d467, &['\u{007A}']), + (0x1d5c3, &['\u{006A}']), + (0x2f93, &['\u{89D2}']), + (0x1d60d, &['\u{0046}']), + (0x3245, &['\u{5E7C}']), + (0xff05, &['\u{0025}']), + (0x1d457, &['\u{006A}']), + (0x1d696, &['\u{006D}']), + (0x1d7b0, &['\u{03B7}']), + (0xfe7a, &['\u{0020}', '\u{0650}']), + (0x1d6d0, &['\u{03BF}']), + (0xfe42, &['\u{300D}']), + (0xfe91, &['\u{0628}']), + (0x1d786, &['\u{03C7}']), + (0x33b8, &['\u{006B}', '\u{0056}']), + (0x2f90, &['\u{8863}']), + (0xfc29, &['\u{0639}', '\u{062C}']), + (0x1c5, &['\u{0044}', '\u{007A}', '\u{030C}']), + (0x33a2, &['\u{006B}', '\u{006D}', '\u{0032}']), + (0x1d645, &['\u{004A}']), + (0xfc71, &['\u{062A}', '\u{0632}']), + (0xfbff, &['\u{06CC}']), + (0x1d752, &['\u{03BA}']), + (0xfe32, &['\u{2013}']), + (0x2fbe, &['\u{9B25}']), + (0x2085, &['\u{0035}']), + (0x2009, &['\u{0020}']), + (0x1d4e0, &['\u{0051}']), + (0x2f86, &['\u{820C}']), + (0xfeae, &['\u{0631}']), + (0x313a, &['\u{11B0}']), + (0xfb66, &['\u{0679}']), + (0x2f67, &['\u{7592}']), + (0x1d5ac, &['\u{004D}']), + (0x3f4, &['\u{0398}']), + (0x1d718, &['\u{03BA}']), + (0x1d4db, &['\u{004C}']), + (0x332f, &['\u{30D2}', '\u{309A}', '\u{30AF}', '\u{30EB}']), + (0xfc0a, &['\u{0628}', '\u{064A}']), + (0xfd0a, &['\u{0634}', '\u{062D}']), + (0x1d63, &['\u{0072}']), + (0x1f21d, &['\u{5F8C}']), + (0x1d5f7, &['\u{006A}']), + (0x3270, &['\u{1103}', '\u{1161}']), + (0x24b8, &['\u{0043}']), + (0xfd80, &['\u{0644}', '\u{062D}', '\u{0645}']), + (0x1d587, &['\u{0062}']), + (0xa69c, &['\u{044A}']), + (0xfd0c, &['\u{0634}', '\u{0645}']), + (0x2fd0, &['\u{9F3B}']), + (0x2007, &['\u{0020}']), + (0xfd84, &['\u{0644}', '\u{062C}', '\u{062C}']), + (0x331a, &['\u{30AF}', '\u{30EB}', '\u{30BB}', '\u{3099}', '\u{30A4}', '\u{30ED}']), + (0x1d562, &['\u{0071}']), + (0xfc3d, &['\u{0643}', '\u{0649}']), + (0x1d4b4, &['\u{0059}']), + (0x1f246, &['\u{3014}', '\u{76D7}', '\u{3015}']), + (0x3247, &['\u{7B8F}']), + (0x2160, &['\u{0049}']), + (0xfe4f, &['\u{005F}']), + (0x3211, &['\u{0028}', '\u{1105}', '\u{1161}', '\u{0029}']), + (0x2481, &['\u{0028}', '\u{0031}', '\u{0034}', '\u{0029}']), + (0x1d528, &['\u{006B}']), + (0x1f16b, &['\u{004D}', '\u{0044}']), + (0xfc8f, &['\u{0646}', '\u{064A}']), + (0xfd10, &['\u{0636}', '\u{0631}']), + (0x208d, &['\u{0028}']), + (0x3151, &['\u{1163}']), + (0x1d453, &['\u{0066}']), + (0xfc14, &['\u{062B}', '\u{064A}']), + (0xfeec, &['\u{0647}']), + (0x3325, &['\u{30C6}', '\u{3099}', '\u{30B7}']), + (0xfeb4, &['\u{0633}']), + (0x2f12, &['\u{529B}']), + (0x1db5, &['\u{01AB}']), + (0x3327, &['\u{30C8}', '\u{30F3}']), + (0xfe8d, &['\u{0627}']), + (0x24dc, &['\u{006D}']), + (0x1d765, &['\u{03A0}']), + (0x1d729, &['\u{039E}']), + (0x321a, &['\u{0028}', '\u{1111}', '\u{1161}', '\u{0029}']), + (0xa0, &['\u{0020}']), + (0xfcb6, &['\u{0636}', '\u{062E}']), + (0xfe51, &['\u{3001}']), + (0x1d7c4, &['\u{03B5}']), + (0x1d7d6, &['\u{0038}']), + (0x1d4b6, &['\u{0061}']), + (0x1d663, &['\u{006E}']), + (0x33b7, &['\u{006D}', '\u{0056}']), + (0x1d487, &['\u{0066}']), + (0xfcb1, &['\u{0635}', '\u{062D}']), + (0x1ee61, &['\u{0628}']), + (0x2472, &['\u{0031}', '\u{0039}']), + (0x3d6, &['\u{03C0}']), + (0x1ee68, &['\u{0637}']), + (0xff89, &['\u{30CE}']), + (0x1d5f5, &['\u{0068}']), +]; + +pub(crate) const COMBINING_MARK_SALT: &[u16] = &[ + 0x0, + 0x2, + 0x0, + 0x4, + 0x2, + 0x43f, + 0x1, + 0x477, + 0x96, + 0x13, + 0x4, + 0x0, + 0x0, + 0x0, + 0x149, + 0x0, + 0x0, + 0x4, + 0x36, + 0x0, + 0x8, + 0x0, + 0x152, + 0x0, + 0x0, + 0x2, + 0x100, + 0x204, + 0x0, + 0x0, + 0x2d, + 0x4, + 0x0, + 0x70, + 0x161, + 0x0, + 0xca, + 0xc, + 0x0, + 0x0, + 0x0, + 0x3e, + 0x2, + 0x1, + 0x68, + 0x0, + 0x3, + 0xd, + 0x75, + 0xcf, + 0x0, + 0x18, + 0x3, + 0x0, + 0x39, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x3, + 0x0, + 0x0, + 0x5, + 0x0, + 0x2c, + 0x31, + 0x0, + 0x0, + 0x41, + 0x1, + 0xd, + 0x30, + 0x0, + 0x0, + 0x10, + 0x10, + 0x0, + 0x42, + 0x1, + 0x53, + 0x0, + 0x0, + 0x7e, + 0x1, + 0x2e, + 0x0, + 0x2a, + 0x0, + 0x2, + 0x0, + 0x4e, + 0xd, + 0x60, + 0x0, + 0x7, + 0x2, + 0x79, + 0x3, + 0x41, + 0x0, + 0x0, + 0xb, + 0x0, + 0x21, + 0x3, + 0x2a, + 0x0, + 0x52, + 0x7, + 0x1a, + 0x0, + 0x1a, + 0x18, + 0xee, + 0x0, + 0x10, + 0x13, + 0x1a, + 0x18, + 0x0, + 0x2, + 0x1, + 0x58, + 0x1, + 0x7, + 0x0, + 0x6, + 0x9, + 0xa, + 0x4, + 0x64, + 0x2b, + 0x12, + 0x0, + 0x3, + 0xe, + 0x0, + 0x0, + 0x0, + 0x7, + 0x4, + 0x17, + 0x4, + 0x0, + 0x40, + 0x13, + 0x43, + 0xa, + 0x15, + 0x22, + 0x0, + 0x0, + 0x2, + 0xb, + 0x0, + 0x0, + 0x4, + 0x0, + 0x6, + 0x0, + 0x0, + 0xa, + 0xd, + 0x18, + 0x5, + 0x46, + 0x0, + 0x0, + 0x0, + 0x3, + 0x21, + 0x29, + 0x41, + 0x0, + 0x2, + 0x8, + 0x0, + 0xe, + 0x3a, + 0xe, + 0x38, + 0x13, + 0x30, + 0x1, + 0x4e, + 0x7, + 0x16, + 0xf, + 0x2, + 0x11, + 0x18, + 0x0, + 0x0, + 0x5, + 0xb, + 0x0, + 0x6, + 0x1, + 0x0, + 0x2, + 0x1, + 0x5, + 0x0, + 0x0, + 0x8, + 0x13, + 0x28, + 0x1, + 0x4, + 0x0, + 0x1e, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x4, + 0x0, + 0x0, + 0x12, + 0x4, + 0x2, + 0xe, + 0x1, + 0x10, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0xa, + 0x4f, + 0x4, + 0x17, + 0x0, + 0x20, + 0x0, + 0x9, + 0x7, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x7, + 0x0, + 0xb, + 0x2, + 0x1a, + 0x0, + 0x21, + 0x0, + 0xa, + 0xc, + 0x0, + 0x0, + 0x0, + 0x0, + 0x22, + 0x4, + 0x2, + 0x3, + 0x1, + 0x20, + 0x1, + 0x6, + 0x1d, + 0x0, + 0x6, + 0x0, + 0x0, + 0x0, + 0x2, + 0x4, + 0x0, + 0x2, + 0x5, + 0x38, + 0x0, + 0x10, + 0x0, + 0x8, + 0xa, + 0x0, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0xf, + 0x0, + 0x3, + 0x1, + 0x0, + 0x1, + 0x6, + 0x0, + 0x0, + 0x1f, + 0x0, + 0x0, + 0xb, + 0x4, + 0x2, + 0x0, + 0x1c, + 0xb, + 0x0, + 0x8, + 0x0, + 0x11, + 0x8, + 0x2, + 0xb, + 0x0, + 0x2, + 0x7, + 0x1, + 0x0, + 0x0, + 0x25, + 0x2, + 0x0, + 0x0, + 0x0, + 0xd, + 0x0, + 0xb, + 0x0, + 0x0, + 0x0, + 0x7, + 0x0, + 0x4, + 0x3, + 0x4, + 0x1, + 0x0, + 0xc, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0xb, + 0x23, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x11, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x8, + 0xc, + 0x0, + 0x0, + 0x1, + 0x8, + 0x18, + 0x0, + 0x0, + 0x2, + 0x0, + 0x4, + 0x0, + 0x28, + 0x16, + 0x1, + 0x4, + 0x0, + 0xb, + 0x0, + 0xa, + 0x0, + 0x1, + 0x1, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x4, + 0x5, + 0x0, + 0xa, + 0x9, + 0x27, + 0xc, + 0x2, + 0x0, + 0x0, + 0x8, + 0x0, + 0x5, + 0x8, + 0xb, + 0x1, + 0x4d, + 0x0, + 0x6, + 0x4, + 0x4, + 0x0, + 0x22, + 0x32, + 0x3, + 0x45, + 0x0, + 0x7, + 0xa, + 0x0, + 0x9, + 0x3a, + 0x1, + 0x0, + 0x0, + 0x4, + 0x2, + 0xd, + 0x0, + 0x21, + 0x0, + 0x1, + 0x16, + 0x1, + 0x0, + 0x12, + 0x0, + 0x0, + 0x6, + 0x5, + 0x2, + 0x19, + 0x9, + 0x0, + 0x0, + 0x2, + 0x7, + 0x6, + 0x0, + 0x4, + 0x0, + 0xd, + 0x0, + 0xb, + 0x9, + 0xd, + 0x3, + 0x1, + 0x14, + 0x0, + 0x1, + 0x19, + 0x4, + 0x0, + 0x1, + 0x4, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x2c, + 0xb, + 0x8, + 0x0, + 0x4, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0xf, + 0x12, + 0x2, + 0x0, + 0xa, + 0x3, + 0x9, + 0x0, + 0x7, + 0x1, + 0x0, + 0x0, + 0xf, + 0x0, + 0x0, + 0x6, + 0x0, + 0x14, + 0x2, + 0x15, + 0x6, + 0x3, + 0x0, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x0, + 0x12, + 0x0, + 0x1, + 0x3, + 0x0, + 0x15, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1f, + 0x0, + 0x5, + 0x3, + 0x1, + 0x1, + 0x3, + 0x1, + 0x8, + 0x2, + 0x0, + 0x1, + 0x2, + 0xd, + 0x3, + 0x4, + 0xd, + 0x0, + 0x5, + 0x0, + 0x16, + 0x0, + 0x0, + 0x0, + 0x2, + 0x3, + 0x2, + 0x0, + 0x7, + 0x0, + 0x0, + 0x5, + 0x11, + 0x3, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0xd, + 0x5, + 0x2, + 0x0, + 0x2, + 0x17, + 0x7, + 0x5, + 0x2, + 0x10, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0xd, + 0x0, + 0x1, + 0x0, + 0x3, + 0x7, + 0x6, + 0x51, + 0x0, + 0x0, + 0x1, + 0xc, + 0x2, + 0x3, + 0x2, + 0x7, + 0x0, + 0x1, + 0x2, + 0x0, + 0x16, + 0x0, + 0x4, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x4, + 0x2, + 0x0, + 0x4, + 0x5, + 0x2, + 0x0, + 0x0, + 0x4, + 0x0, + 0x1e, + 0x0, + 0x4, + 0x1, + 0x11, + 0x19, + 0x7, + 0x1, + 0x10, + 0x11, + 0x7, + 0x3, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x3, + 0x6, + 0xb, + 0x0, + 0x2, + 0x4, + 0x3, + 0x6, + 0x1, + 0x11, + 0x1, + 0x0, + 0x10, + 0x0, + 0x1, + 0x7, + 0x3, + 0x3, + 0xc, + 0x1, + 0x4, + 0x18, + 0x0, + 0x0, + 0x1, + 0x6, + 0x0, + 0x7, + 0x4, + 0x3, + 0x3, + 0x0, + 0x4, + 0x5, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x9, + 0x0, + 0x5, + 0xe, + 0x8, + 0x1, + 0x7, + 0x5, + 0x0, + 0x7, + 0x4, + 0x1, + 0x1b, + 0x0, + 0x2, + 0x0, + 0x15, + 0x2, + 0x0, + 0x3, + 0x12, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x7, + 0x0, + 0x2, + 0x0, + 0x2, + 0x4, + 0x11, + 0x1, + 0x5, + 0x1, + 0x0, + 0x0, + 0xd, + 0x0, + 0x2, + 0x1, + 0x4, + 0x5, + 0x2, + 0x0, + 0x16, + 0x1, + 0xc, + 0x0, + 0x4, + 0x3, + 0x0, + 0x3, + 0x1, + 0x0, + 0x0, + 0x4, + 0x0, + 0x4, + 0xc, + 0x0, + 0x1d, + 0x1, + 0x0, + 0x1, + 0x19, + 0x0, + 0x1, + 0x2, + 0x3, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0xa, + 0x5, + 0x0, + 0xb, + 0x5, + 0x0, + 0x4, + 0x3, + 0x2, + 0x0, + 0x17, + 0x9, + 0x0, + 0x1, + 0x2, + 0x3, + 0x0, + 0x1a, + 0x2, + 0x0, + 0x2, + 0xc, + 0x7, + 0x0, + 0x4, + 0x2, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x4, + 0x7, + 0x0, + 0x0, + 0x1, + 0xe, + 0x0, + 0x5, + 0x1, + 0x0, + 0x1, + 0x2, + 0x1, + 0x4, + 0x3, + 0xc, + 0x6, + 0xc, + 0x5, + 0x7, + 0x0, + 0x1, + 0x8, + 0x9, + 0x1, + 0x0, + 0x1b, + 0xb, + 0x9, + 0x1, + 0x4, + 0x4, + 0x9, + 0x3, + 0x0, + 0x2, + 0x4, + 0x3, + 0x0, + 0x3, + 0x2, + 0xa, + 0x2, + 0x15, + 0x3, + 0x2, + 0x0, + 0x0, + 0xb, + 0x1a, + 0x1, + 0x2, + 0x6, + 0x4, + 0x0, + 0xa, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0xc, + 0x17, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x2, + 0x3, + 0x0, + 0xd, + 0x14, + 0x2, + 0x3, + 0x7, + 0xe, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x7, + 0x9, + 0x6, + 0x0, + 0x0, + 0x7, + 0x1, + 0x6, + 0x0, + 0x2, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x9, + 0xb, + 0xe, + 0x1, + 0x11, + 0x1, + 0x2, + 0x6, + 0x4, + 0x4, + 0x1, + 0x0, + 0x0, + 0x8, + 0x1, + 0x1, + 0x1, + 0x0, + 0x4, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x0, + 0x6, + 0x5, + 0x1, + 0x3, + 0x7, + 0x0, + 0x0, + 0x4, + 0x1, + 0x0, + 0x0, + 0x13, + 0x2, + 0x2, + 0x8, + 0x0, + 0x4, + 0x3, + 0x0, + 0x5, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x6, + 0x0, + 0x1, + 0x1e, + 0x0, + 0x0, + 0x9, + 0x2, + 0x1, + 0x8, + 0x1, + 0x1, + 0x2, + 0x1, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0xd, + 0x1, + 0x1, + 0x3, + 0x2, + 0x1, + 0x6, + 0x8, + 0xd, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x7, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x7, + 0x0, + 0x2, + 0x13, + 0x0, + 0xe, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x4, + 0x2, + 0x0, + 0x1, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x7, + 0x0, + 0x1, + 0x1, + 0x0, + 0x1, + 0x7, + 0x2, + 0x4, + 0x5, + 0x3, + 0x0, + 0x11, + 0x6, + 0x0, + 0x2, + 0x6, + 0x1, + 0x2, + 0x4, + 0x0, + 0x1, + 0x2, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x2, + 0x4, + 0x5, + 0x0, + 0x2, + 0xa, + 0x2, + 0xb, + 0x0, + 0xb, + 0x4, + 0x0, + 0x8, + 0xc, + 0x0, + 0x1, + 0x1, + 0x2, + 0x7, + 0x0, + 0x0, + 0x0, + 0x6, + 0xa, + 0x3, + 0x3, + 0x7, + 0x2, + 0x0, + 0x9, + 0x2, + 0x0, + 0x0, + 0x4, + 0x2, + 0x4, + 0x4, + 0x0, + 0x2, + 0x0, + 0x5, + 0x2, + 0x5, + 0x1, + 0x3, + 0x1, + 0x1, + 0x1, + 0x0, + 0x1, + 0x0, + 0x8, + 0x0, + 0x3, + 0x4, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x4, + 0x1, + 0x1, + 0x1, + 0x2, + 0x1, + 0xa, + 0x3, + 0x0, + 0x0, + 0x1, + 0x9, + 0x1, + 0x3, + 0x0, + 0x0, + 0xd, + 0x2, + 0xb, + 0x1, + 0x1, + 0x0, + 0x3, + 0x0, + 0x9, + 0x0, + 0x1, + 0x8, + 0x0, + 0x2, + 0x2, + 0x3, + 0x0, + 0x3, + 0x6, + 0x0, + 0x0, + 0x1, + 0x1, + 0x8, + 0x1, + 0x0, + 0x1, + 0x4, + 0x1, + 0x2, + 0x3, + 0x2, + 0x2, + 0x0, + 0x1, + 0x1, + 0x0, + 0x1, + 0x3, + 0x3, + 0x0, + 0x3, + 0x0, + 0x1, + 0x2, + 0x6, + 0x0, + 0x4, + 0x1, + 0x0, + 0x0, + 0xa, + 0x2, + 0x3, + 0x1, + 0x6, + 0x0, + 0x0, + 0x1, + 0x1, + 0x3, + 0x5, + 0x0, + 0xf, + 0x3, + 0x3, + 0x1, + 0x2, + 0x1, + 0x2, + 0x0, + 0x1, + 0x3, + 0x5, + 0x6, + 0x1, + 0x0, + 0x5, + 0x1, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x8, + 0x8, + 0x7, + 0x3, + 0x2, + 0x0, + 0x0, + 0x1, + 0x1, + 0x7, + 0x0, + 0x1, + 0x1, + 0x0, + 0x5, + 0x2, + 0x8, + 0x0, + 0x0, + 0x3, + 0x9, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x8, + 0x7, + 0x0, + 0x6, + 0x1, + 0x2, + 0x4, + 0x0, + 0x0, + 0x1, + 0x2, + 0x3, + 0x1, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x9, + 0x0, + 0x6, + 0x0, + 0x2, + 0x0, + 0x4, + 0x4, + 0x3, + 0x0, + 0x0, + 0x7, + 0x8, + 0x0, + 0x8, + 0x3, + 0x0, + 0x5, + 0x0, + 0x5, + 0x0, + 0x1, + 0x0, + 0xc, + 0x6, + 0x4, + 0x0, + 0x7, + 0x0, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x5, + 0x0, + 0x0, + 0x5, + 0x1, + 0x3, + 0xd, + 0x1, + 0x0, + 0x2, + 0x2, + 0x1, + 0x9, + 0x4, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x5, + 0x0, + 0x2, + 0x0, + 0x17, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x2, + 0x1, + 0x0, + 0x5, + 0x1, + 0x1, + 0x2, + 0x2, + 0x0, + 0x2, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x6, + 0x0, + 0x2, + 0x3, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x4, + 0x4, + 0x16, + 0x3, + 0x1, + 0x0, + 0x6, + 0x2, + 0x2, + 0x5, + 0x0, + 0x0, + 0x2, + 0x8, + 0x0, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x2, + 0x4, + 0x0, + 0x2, + 0x7, + 0x2, + 0x0, + 0x1, + 0x6, + 0x1, + 0x1, + 0x1, + 0x0, + 0x3, + 0x1, + 0x0, + 0x3, + 0x1, + 0x9, + 0x1, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0xe, + 0x4, + 0x0, + 0x0, + 0x1, + 0x1, + 0x7, + 0x0, + 0x2, + 0x2, + 0x0, + 0x2, + 0x0, + 0x1, + 0x7, + 0x0, + 0x0, + 0x6, + 0x5, + 0x0, + 0x3, + 0x3, + 0x0, + 0x1, + 0x1, + 0x0, + 0x2, + 0x2, + 0x4, + 0x5, + 0x1, + 0x2, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x7, + 0x4, + 0x1, + 0x4, + 0x1, + 0x6, + 0x2, + 0x2, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x5, + 0x6, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x2, + 0x0, + 0x9, + 0x8, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x1, + 0x11, + 0x1, + 0x0, + 0x1, + 0x4, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x1, + 0x2, + 0x4, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x1, + 0x0, + 0x2, + 0x0, + 0x5, + 0x6, + 0x3, + 0x1, + 0x0, + 0x1, + 0x3, + 0x2, + 0x0, + 0x2, + 0x1, + 0x2, + 0x0, + 0x5, + 0x3, + 0x0, + 0x3, + 0x4, + 0x1, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0x1, + 0x5, + 0x5, + 0x2, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x5, + 0x0, + 0x0, + 0x5, + 0x2, + 0x5, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x1, + 0x4, + 0x0, + 0x1, + 0x1, + 0x1, + 0x2, + 0x6, + 0x1, + 0xa, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x3, + 0x0, + 0x5, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x2, + 0x1, + 0x1, + 0x1, + 0x0, + 0x2, + 0x2, + 0x3, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x2, + 0x0, + 0x3, + 0x7, + 0xa, + 0x0, + 0x0, + 0x9, + 0x0, + 0x8, + 0x1, + 0x1, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x7, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x0, + 0x2, + 0x2, + 0x2, + 0x6, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x2, + 0x1, + 0x0, + 0xa, + 0xa, + 0x0, + 0x0, + 0x4, + 0x3, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x4, + 0x7, + 0x3, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x4, + 0x2, + 0x1, + 0x0, + 0x6, + 0x4, + 0x3, + 0x0, + 0x2, + 0x4, + 0x3, + 0x0, + 0x7, + 0x4, + 0x0, + 0x1, + 0x3, + 0x5, + 0x2, + 0x0, + 0x2, + 0x4, + 0x2, + 0x0, + 0x4, + 0x1, + 0x6, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x1, + 0x0, + 0x1, + 0x3, + 0x3, + 0x0, + 0x0, + 0x2, + 0x5, + 0x0, + 0x1, + 0x0, + 0x0, + 0x4, + 0x1, + 0x1, + 0x2, + 0xe, + 0x1, + 0x2, + 0x5, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x11, + 0x1, + 0x9, + 0x2, + 0x0, + 0xf, + 0x0, + 0x4, + 0x2, + 0x3, + 0x1, + 0x2, + 0x3, + 0x3, + 0x1, + 0x2, + 0x3, + 0x9, + 0x1, + 0x0, + 0x1, + 0x3, + 0x0, + 0x2, + 0x7, + 0xa, + 0x1, + 0x1, + 0x3, + 0x9, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x5, + 0x0, + 0x4, + 0x1, + 0x2, + 0x0, + 0x0, + 0x2, + 0x0, + 0x6, + 0x1, + 0x1, + 0x2, + 0x0, + 0x1, + 0x1, + 0x0, + 0x8, + 0x1, + 0x4, + 0x4, + 0x1, + 0x0, + 0x3, + 0x0, + 0x3, + 0x3, + 0x0, + 0x1, + 0x0, + 0xa, + 0x0, + 0x4, + 0x1, + 0x2, + 0x8, + 0x4, + 0x0, + 0x1, + 0xb, + 0x2, + 0xb, + 0x2, + 0x6, + 0x5, + 0x1, + 0x3, + 0x0, + 0x1, + 0x3, + 0x0, + 0x2, + 0x3, + 0x0, + 0x1, + 0x1, + 0x1, + 0x3, + 0x0, + 0x3, + 0x1, + 0x1, + 0x2, + 0x8, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x3, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x5, + 0x6, + 0x0, + 0x0, + 0x2, + 0x4, + 0x4, + 0x3, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x5, + 0x3, + 0x1, + 0x3, + 0x3, + 0x2, + 0xd, + 0x3, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x4, + 0x3, + 0x0, + 0x0, + 0x1, + 0x4, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x1, + 0x2, + 0x0, + 0x5, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x7, + 0x1, + 0x0, + 0x2, + 0x2, + 0x3, + 0x0, + 0x0, + 0x1, + 0x6, + 0x2, + 0x0, + 0x1, + 0x2, + 0x5, + 0x1, + 0x1, + 0x2, + 0x1, + 0x3, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0x3, + 0x3, + 0x4, + 0x3, + 0x1, + 0x1, + 0x1, + 0x1, + 0x12, + 0x0, + 0x3, + 0x1, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x2, + 0x6, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x2, + 0x4, + 0x5, + 0x2, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x1, + 0x5, + 0x2, + 0x0, + 0x0, + 0x2, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0x1, + 0x2, + 0x0, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0xc, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x1, + 0x0, + 0x2, + 0x9, + 0x0, + 0x0, + 0x4, + 0x0, + 0x5, + 0x2, + 0x4, + 0x7, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0xc, + 0x4, + 0x1, + 0x4, + 0x1, + 0x1, + 0x1, + 0x1, + 0x3, + 0x5, + 0x2, + 0x6, + 0x0, + 0x2, + 0x2, + 0x6, + 0x2, + 0x2, + 0x2, + 0x1, + 0x0, + 0x4, + 0x2, + 0x0, + 0x4, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x2, + 0x0, + 0x5, + 0x3, + 0x3, + 0x1, + 0x1, + 0x0, + 0x2, + 0x2, + 0x0, + 0x2, + 0x1, + 0x1, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0x2, + 0x3, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x0, +]; +pub(crate) const COMBINING_MARK_KV: &[u32] = &[ + 0x1a6c, + 0x115dd, + 0x0e3a, + 0x1da01, + 0x11cb1, + 0x115bd, + 0x0faf, + 0xe01dc, + 0x1da41, + 0x11374, + 0xfe00, + 0xa67c, + 0x1c36, + 0x0b42, + 0xfe04, + 0x16f7d, + 0x180b, + 0x2dfe, + 0x0e4a, + 0x101fd, + 0xe017e, + 0x102f, + 0x082b, + 0x0fa2, + 0x05a2, + 0x1ab2, + 0x06e3, + 0x1dd7, + 0x0f79, + 0x1ba4, + 0x16f70, + 0x1bf3, + 0x16f6b, + 0x034d, + 0xa675, + 0xa6f0, + 0x2cf0, + 0x0c40, + 0xe0186, + 0xe0153, + 0x0faa, + 0x1a74, + 0x0332, + 0xa8bb, + 0x111b7, + 0x1ab8, + 0x105e, + 0x1a6d, + 0x0b44, + 0x1924, + 0xa94b, + 0xfe2d, + 0x1da50, + 0xe01c3, + 0x1cdb, + 0x0322, + 0x0c02, + 0x1e023, + 0x1b73, + 0x1da30, + 0x1089, + 0xa802, + 0x193b, + 0x11634, + 0x1da47, + 0xa8b7, + 0x0eb7, + 0x11041, + 0x1057, + 0xe0150, + 0x1b6d, + 0xe0185, + 0x1b71, + 0x0619, + 0x11081, + 0x030d, + 0xe017f, + 0x1a79, + 0xe01a3, + 0x11636, + 0x1ce0, + 0x065d, + 0x0320, + 0xa92a, + 0x1da04, + 0xe01ce, + 0x08f6, + 0x111be, + 0x1dee, + 0xe0141, + 0x11236, + 0x2de3, + 0x10376, + 0x1e947, + 0x1dc5, + 0x0486, + 0x1a75, + 0x1033, + 0x111c0, + 0x09c8, + 0x16f5d, + 0x1d182, + 0x11366, + 0xfe05, + 0xe0155, + 0x1036, + 0xe0168, + 0x1ba1, + 0xe01ca, + 0x1cf2, + 0x1dec, + 0x17d1, + 0x1163c, + 0x0f8e, + 0xa8bf, + 0x0954, + 0x2de9, + 0x1bab, + 0xe0198, + 0x0dd8, + 0xa9b7, + 0x0eca, + 0xa8c5, + 0x0fbc, + 0x08dc, + 0x1c29, + 0xa8e2, + 0x1da3e, + 0x0e48, + 0x1abd, + 0x1da42, + 0x1143d, + 0x1e01b, + 0x08e4, + 0xe01c0, + 0xe0163, + 0x0acc, + 0x0d44, + 0xe012e, + 0x07aa, + 0x0825, + 0x0901, + 0x0ac7, + 0xaabe, + 0xe01b3, + 0x11c9c, + 0xe01c7, + 0x0820, + 0x1da5b, + 0x08e8, + 0x11044, + 0x16b33, + 0x1a5d, + 0xa826, + 0x2de4, + 0x11cab, + 0x16f74, + 0xa8e8, + 0x17bb, + 0x1171f, + 0x11232, + 0x0364, + 0x1daab, + 0x0c81, + 0x1a5a, + 0x10a3a, + 0x1dc4, + 0x1def, + 0x17bc, + 0x0cc1, + 0x16f71, + 0x073b, + 0xe018c, + 0x0358, + 0x0fb0, + 0x1b41, + 0x0487, + 0x1da33, + 0x1ab1, + 0x0bc0, + 0x11c3e, + 0x102c, + 0x1cd0, + 0x11c95, + 0x1da0a, + 0xa8ee, + 0x1a5b, + 0x0738, + 0x033c, + 0x20d5, + 0x1da54, + 0x0819, + 0x0b43, + 0x16b30, + 0x11726, + 0x16af3, + 0x0b40, + 0xe015b, + 0x0f9e, + 0x16f6d, + 0x0f7f, + 0xe0101, + 0x1b36, + 0xa9be, + 0x0359, + 0x09cb, + 0x1ddd, + 0x114b6, + 0x0c48, + 0x114c1, + 0x0744, + 0x1bf0, + 0x11181, + 0x0327, + 0x0e38, + 0x0bcc, + 0x1d16d, + 0x0340, + 0x116b3, + 0x11002, + 0x1e946, + 0x1da49, + 0x0c44, + 0x1da2e, + 0x2df0, + 0x1103f, + 0x0337, + 0x0b03, + 0xe01b7, + 0x11373, + 0x1c33, + 0xaa36, + 0x0ccc, + 0x11c32, + 0x07ad, + 0x17cd, + 0xa8b4, + 0x11ca5, + 0x07ef, + 0xe014d, + 0x1073, + 0x0f71, + 0x1d168, + 0xa69e, + 0x1ab9, + 0x0b3f, + 0x110b0, + 0xe01bb, + 0x032b, + 0x1134c, + 0x036d, + 0x11367, + 0x1e010, + 0x302b, + 0x1a6a, + 0x16f64, + 0x11130, + 0x10a0f, + 0x11133, + 0x1da1a, + 0x10a0e, + 0x0735, + 0x032f, + 0xa928, + 0x05c7, + 0x20de, + 0xa825, + 0xe0114, + 0xa94d, + 0xe01c6, + 0x1da0d, + 0xe01d7, + 0xe01a0, + 0x05bd, + 0x17ce, + 0x1a57, + 0x0a82, + 0x20e8, + 0x059d, + 0xe011c, + 0xe012d, + 0x07ae, + 0x1a68, + 0x0e4e, + 0x0316, + 0x16f73, + 0x103a, + 0xa670, + 0x1163f, + 0x1e008, + 0xe0191, + 0x16f76, + 0x1143f, + 0x085b, + 0x1a7f, + 0x09be, + 0x0d4d, + 0x0fa3, + 0xa927, + 0x0bbf, + 0xe01e8, + 0x114bf, + 0x0746, + 0x1cd1, + 0x1da75, + 0x0596, + 0xa67a, + 0x0f9c, + 0x16f77, + 0x11630, + 0xa8bd, + 0x17ba, + 0x0304, + 0x1de3, + 0x059f, + 0xe01a8, + 0x0fae, + 0x111b3, + 0x11728, + 0x0357, + 0x116ac, + 0x073c, + 0x11cad, + 0x1da61, + 0x2df9, + 0x20f0, + 0xa981, + 0x1da62, + 0x2deb, + 0x16f52, + 0x1cf8, + 0x112e4, + 0x1e8d3, + 0x1163e, + 0x0cc3, + 0x034e, + 0x1dcb, + 0xe016b, + 0x16f7c, + 0x1c2b, + 0x17b6, + 0x112e8, + 0x1da1d, + 0x05af, + 0x1143b, + 0x1da10, + 0xe01d8, + 0x1da9b, + 0x094e, + 0x0366, + 0x05c4, + 0x1cdd, + 0x10a05, + 0xabec, + 0x20e2, + 0x0319, + 0x0f9d, + 0xa9bd, + 0x111bc, + 0x11c9a, + 0xa9e5, + 0x0d62, + 0x065a, + 0x1bad, + 0x0956, + 0x1714, + 0x0345, + 0x11caf, + 0xa69f, + 0x110b5, + 0xe0122, + 0x1e017, + 0x0c3f, + 0x0a3e, + 0x1cdf, + 0x0abe, + 0x1dd1, + 0x0c83, + 0x2cf1, + 0x06d7, + 0x1930, + 0x0f97, + 0x1032, + 0x0f76, + 0x09c4, + 0x1da57, + 0x030f, + 0x1daa1, + 0x1b35, + 0x0d3f, + 0x08fb, + 0x1034, + 0xe014c, + 0x05b2, + 0x2d7f, + 0x1daa6, + 0x302f, + 0x11001, + 0x11ca1, + 0x0bbe, + 0x1dc8, + 0x09bf, + 0x1ab6, + 0x0b4d, + 0x2dee, + 0x0dd0, + 0xfe2a, + 0xe0190, + 0x0dd6, + 0x17b5, + 0x1a58, + 0x16f65, + 0xe0171, + 0xe01bd, + 0x0485, + 0x1d165, + 0x1c37, + 0x1beb, + 0x2dec, + 0xe018e, + 0x0949, + 0x1a5e, + 0xe016c, + 0x18a9, + 0x05b9, + 0x1067, + 0x1e005, + 0x11046, + 0x0d43, + 0x11c3c, + 0xfe23, + 0x08e6, + 0x1ce4, + 0x094d, + 0x0341, + 0xfe0f, + 0x1a55, + 0xa947, + 0x06e2, + 0x0f7d, + 0xaab0, + 0x1a59, + 0x102e, + 0x114c2, + 0x0e4c, + 0x073d, + 0x105f, + 0x112e1, + 0xe01c5, + 0xe0167, + 0x07ab, + 0x1d244, + 0x1e002, + 0x103b, + 0x0cbf, + 0xfe25, + 0x1b82, + 0xa8ed, + 0x10a3f, + 0x0595, + 0x1e8d4, + 0x05aa, + 0xe0113, + 0x0b41, + 0x2de2, + 0x1da25, + 0x1cf3, + 0x1bac, + 0x08d4, + 0x06e0, + 0x111bd, + 0x16f92, + 0x0f83, + 0x20d6, + 0xa823, + 0x1da3d, + 0xe0127, + 0xe0151, + 0x05b7, + 0x1ab4, + 0x0d40, + 0x1712, + 0x0336, + 0x1c35, + 0x1086, + 0xe0156, + 0x1da5d, + 0x1072, + 0xaac1, + 0x1da68, + 0x1c30, + 0x0329, + 0xaa2e, + 0x10ae5, + 0x035a, + 0xa679, + 0xfe07, + 0x11c9b, + 0x1083, + 0x1de9, + 0x1da0b, + 0xe01d5, + 0x0f3f, + 0x0342, + 0x0fb7, + 0x1936, + 0x102d, + 0x0d42, + 0x1dce, + 0x1063, + 0xe0193, + 0xe013c, + 0x06dc, + 0x0cc4, + 0x16f72, + 0x0733, + 0x1da60, + 0x11440, + 0x1b72, + 0x11342, + 0xa827, + 0xa8c0, + 0x0a3f, + 0x1e012, + 0xe019b, + 0x2df7, + 0x108d, + 0x08d6, + 0xfe01, + 0x115b8, + 0x0951, + 0x1b6e, + 0x1dcd, + 0x1e004, + 0x08d8, + 0x11723, + 0x036b, + 0xe011e, + 0x11c3d, + 0x10379, + 0x20d9, + 0x11c31, + 0x1ab0, + 0x1ce8, + 0x0321, + 0x103e, + 0x0ac9, + 0x11233, + 0x20e9, + 0xa948, + 0x112e0, + 0xa9bc, + 0x0326, + 0x07a9, + 0x1da55, + 0x16f5c, + 0xe017c, + 0x1da69, + 0x116b1, + 0x0eb5, + 0x11102, + 0x0a75, + 0x16f75, + 0x1c2e, + 0x093b, + 0xe01be, + 0xa672, + 0x0348, + 0xe01c4, + 0x2df4, + 0xfe21, + 0x111cc, + 0x0d57, + 0x06ed, + 0x08ec, + 0xfe29, + 0xe014b, + 0x0cd6, + 0xfe09, + 0x0303, + 0x1daa7, + 0xabe8, + 0x0fa7, + 0x0ecc, + 0x16f90, + 0x17d2, + 0x1d16e, + 0xe0183, + 0xe010a, + 0xa8ec, + 0x1d171, + 0x1da44, + 0x16af0, + 0x1d186, + 0x11cb4, + 0xa8e0, + 0x0940, + 0x11180, + 0x0acd, + 0xa8c1, + 0x1daa3, + 0xaa2d, + 0x1ce7, + 0xe017b, + 0x11368, + 0xa953, + 0xe0179, + 0x16f69, + 0x1886, + 0xa92d, + 0xe01c2, + 0x033b, + 0xe0145, + 0x0362, + 0x1daa9, + 0x0f84, + 0x0317, + 0x0483, + 0x0610, + 0x11cae, + 0xe0194, + 0xaaef, + 0x1da0e, + 0x1d172, + 0x0f78, + 0x0f9a, + 0x1da67, + 0x1c32, + 0x0b3e, + 0x036a, + 0xa8ea, + 0xa8e4, + 0x1112e, + 0x11234, + 0x032c, + 0x106a, + 0x0368, + 0xe01b8, + 0xa824, + 0x0ac2, + 0x16f61, + 0x05a5, + 0x05a7, + 0x0a40, + 0x1934, + 0x1a71, + 0x1068, + 0x1da29, + 0x0fb1, + 0x11640, + 0x302a, + 0x1e013, + 0x11724, + 0x05ab, + 0x0ec8, + 0x0f99, + 0xe01ac, + 0x1163d, + 0x1e006, + 0x1064, + 0x082a, + 0x0d82, + 0x1ced, + 0x0dde, + 0x1927, + 0xe01d4, + 0x16f59, + 0x11637, + 0xa8ba, + 0xaa35, + 0x1da3b, + 0x115be, + 0x135f, + 0x08d7, + 0x1773, + 0x16f5b, + 0xabe6, + 0x0902, + 0x1e018, + 0x1171d, + 0x16f8f, + 0x0ac5, + 0x180c, + 0x08f8, + 0x115b2, + 0x1103e, + 0x08e1, + 0x0903, + 0x111b4, + 0x1dd6, + 0x1031, + 0x20da, + 0x10a02, + 0x1da14, + 0x1dc7, + 0xaab2, + 0x0653, + 0x1da58, + 0x1daa8, + 0x17bd, + 0x0f90, + 0x0e4b, + 0x115b3, + 0xa8f0, + 0xe01a9, + 0x114b7, + 0xe0118, + 0x0cd5, + 0x115bf, + 0x111ca, + 0x11632, + 0xa8b5, + 0xe0120, + 0x1133c, + 0x036e, + 0x0740, + 0x1a70, + 0x1062, + 0xa94e, + 0x1122d, + 0x059c, + 0xaa32, + 0x20e4, + 0x0b48, + 0x0cc8, + 0x1a6b, + 0xe0136, + 0xe0192, + 0x17c9, + 0xe0126, + 0x17c7, + 0xe018d, + 0x1da2a, + 0xe01df, + 0x0fb3, + 0x1e000, + 0x11340, + 0x05b0, + 0xe0109, + 0x05c5, + 0x11363, + 0x1136b, + 0x11639, + 0x20dd, + 0x0fc6, + 0xa8b6, + 0x11134, + 0x05bf, + 0xfe2c, + 0x1e027, + 0xe0180, + 0xaab8, + 0x11c35, + 0x0fa4, + 0x0fa0, + 0x0821, + 0x114ba, + 0xe0159, + 0x20d8, + 0x1df0, + 0xe015f, + 0x1dfe, + 0x1734, + 0xe0111, + 0xaa2c, + 0x0b4c, + 0x0333, + 0x1b3a, + 0x16f60, + 0xe0174, + 0x0e34, + 0x0312, + 0xa8c4, + 0x034c, + 0xe01e2, + 0x0829, + 0x1daa2, + 0x11348, + 0x0957, + 0x1dc6, + 0x064e, + 0x0fb5, + 0x0ac3, + 0x0fb4, + 0xe01d3, + 0x1da09, + 0x1d17d, + 0xa8e6, + 0x1e01e, + 0xe0148, + 0xa8be, + 0x102e0, + 0x17c6, + 0x0363, + 0x16f66, + 0xe0132, + 0x1bef, + 0xe01ab, + 0x1daa4, + 0x20ed, + 0x05bb, + 0x1de1, + 0x0ac4, + 0x1cde, + 0x1e028, + 0x1da16, + 0x11437, + 0x114b0, + 0x094a, + 0xa678, + 0x1da66, + 0x09c3, + 0x1bee, + 0xa952, + 0x0fb9, + 0x036f, + 0x1171e, + 0xe01b5, + 0xe016d, + 0x11082, + 0x20ef, + 0x05b6, + 0x1cf4, + 0x0599, + 0x112e7, + 0x1b3f, + 0x0e37, + 0x1e01c, + 0x0cca, + 0x1d169, + 0xe0188, + 0x0bca, + 0xa676, + 0xe0121, + 0xabed, + 0x1ddc, + 0x1da12, + 0x0cbe, + 0x059b, + 0x16b32, + 0x0816, + 0x109c, + 0x0dd2, + 0x0827, + 0x1dd9, + 0x10a03, + 0x031b, + 0x1b44, + 0x20d2, + 0xa677, + 0x0b62, + 0x1e003, + 0xabe7, + 0x0dca, + 0x11303, + 0xa806, + 0xe01ad, + 0x031d, + 0x1030, + 0x0f8f, + 0xe018a, + 0xaa4c, + 0x0ebc, + 0xe0175, + 0x0dda, + 0x1b39, + 0x1136c, + 0x111b8, + 0x112ea, + 0x2de5, + 0xe01b9, + 0x032a, + 0x11c34, + 0x114b1, + 0x0618, + 0x0bc6, + 0x0743, + 0x193a, + 0x1b00, + 0x0e39, + 0x1ab5, + 0x0eb6, + 0x1da2f, + 0x1da40, + 0x17c4, + 0x17cc, + 0x1134b, + 0x1de2, + 0xe01d2, + 0x1da08, + 0xe0135, + 0x0ac8, + 0x0cc7, + 0x1da00, + 0xe01d9, + 0xe015d, + 0x1da0f, + 0x0657, + 0x20eb, + 0x16b34, + 0x0311, + 0x064f, + 0x16f58, + 0xa8e3, + 0x110b2, + 0x0df2, + 0xfe2f, + 0x0305, + 0x17dd, + 0x1e945, + 0x11301, + 0x0ce2, + 0x17c8, + 0x0bcb, + 0x0fa6, + 0x09c2, + 0x1172b, + 0xa671, + 0x0941, + 0x1752, + 0x1ba9, + 0x0bc7, + 0x1926, + 0x0fb8, + 0x1da6a, + 0x08f2, + 0x093c, + 0x16f51, + 0x11729, + 0x302c, + 0x1d188, + 0xaa2a, + 0x0736, + 0x1de7, + 0x114c0, + 0x1da4c, + 0xaaeb, + 0x1da24, + 0xe0104, + 0x20e7, + 0x1da1f, + 0xe01e9, + 0x0d63, + 0x0731, + 0xe017d, + 0x16f7b, + 0x16f63, + 0x116b5, + 0x0306, + 0x2dfd, + 0x1daae, + 0xe01da, + 0xa66f, + 0x0301, + 0x1133f, + 0x05a1, + 0x1e944, + 0x1dd3, + 0xe010b, + 0x10a0c, + 0x1082, + 0x116ae, + 0x0ddd, + 0x1935, + 0x11c2f, + 0x11371, + 0x0d4b, + 0x16f54, + 0x1bed, + 0x0823, + 0x1e026, + 0x16f56, + 0x07f1, + 0x1b40, + 0x11357, + 0x114c3, + 0x033d, + 0x0351, + 0x11720, + 0x11c39, + 0x1ce6, + 0x11038, + 0x0615, + 0x2de8, + 0x0ae3, + 0x11042, + 0x1a17, + 0x0352, + 0x1c2a, + 0x1112a, + 0x08fe, + 0x11c3b, + 0x06eb, + 0x0b01, + 0xe019e, + 0xe0165, + 0x0367, + 0x112e3, + 0x0c82, + 0xe01ae, + 0x11237, + 0x1df3, + 0x1de5, + 0x1abe, + 0x074a, + 0x16f62, + 0xe01c9, + 0x1ba6, + 0x0dcf, + 0xe019f, + 0x0eb9, + 0x11c38, + 0xe012a, + 0x0484, + 0xe0172, + 0x0318, + 0x094b, + 0x11369, + 0x1e8d0, + 0x111b9, + 0x05a6, + 0x093a, + 0x0ae2, + 0x1058, + 0x106d, + 0x1da5c, + 0xfe0c, + 0x0612, + 0x094f, + 0x1cda, + 0x0ccb, + 0x0b56, + 0xe0178, + 0x1da56, + 0x0cc2, + 0x0817, + 0x0cc0, + 0xe017a, + 0x0a83, + 0x06d8, + 0x1b34, + 0x06d6, + 0x1a61, + 0x0cbc, + 0xe01b4, + 0x0742, + 0xe0119, + 0x08dd, + 0x1dd2, + 0x1dc1, + 0x1e8d6, + 0xe0161, + 0xaa7d, + 0x1a77, + 0x0300, + 0xa8b9, + 0xe0170, + 0xfe0b, + 0x2df2, + 0xe012c, + 0x17c1, + 0x0f96, + 0x1df2, + 0x10a01, + 0xe01e4, + 0x1d180, + 0xabe5, + 0x0365, + 0x0fad, + 0x1d17b, + 0x1da3c, + 0x115af, + 0x1ab7, + 0x081f, + 0x08f1, + 0x07b0, + 0x0eb1, + 0x032d, + 0x116b4, + 0x05b4, + 0x09e3, + 0x1b6c, + 0x1732, + 0x1b04, + 0x1d1aa, + 0x11438, + 0x0614, + 0x11344, + 0x0b02, + 0x0307, + 0x11c3f, + 0x11230, + 0xe01c8, + 0x05a3, + 0x033e, + 0xa926, + 0xe0197, + 0x1da15, + 0x1dda, + 0x0354, + 0xe014a, + 0x110b7, + 0x16f57, + 0x112e5, + 0x1060, + 0x11c96, + 0x035e, + 0xe014e, + 0x1a5c, + 0xe0181, + 0xa80b, + 0x07f0, + 0x0fa5, + 0x1923, + 0x11ca4, + 0xe01de, + 0x11435, + 0x0ac1, + 0x20d0, + 0x11343, + 0x1d1ab, + 0x1069, + 0xa951, + 0x05b5, + 0x11ca2, + 0xaa31, + 0x1ce2, + 0xabea, + 0x1da2c, + 0x0e36, + 0x0611, + 0x1087, + 0x1b42, + 0xa983, + 0x1da4e, + 0x0b82, + 0x1da32, + 0xe0138, + 0x1c2f, + 0x0328, + 0x2dfa, + 0x1713, + 0x11372, + 0x08ff, + 0x1d17c, + 0xe019a, + 0x1038, + 0x1be7, + 0x0826, + 0x0c62, + 0x0df3, + 0x16f5f, + 0x035c, + 0x11cb2, + 0x1cd9, + 0x11127, + 0x1938, + 0xe015c, + 0x09d7, + 0x1da59, + 0x0b57, + 0x11443, + 0xa9b9, + 0x1da0c, + 0xe01d6, + 0x1e00f, + 0x1da63, + 0x17cb, + 0x1d167, + 0x108a, + 0x1a60, + 0x110b1, + 0x1e949, + 0x10a0d, + 0x0d01, + 0x1da06, + 0xe01d0, + 0x20d7, + 0xe01e7, + 0x0f19, + 0x1a73, + 0x16f6f, + 0x302e, + 0x1dcc, + 0x16f6a, + 0x036c, + 0x1123e, + 0x111ba, + 0x114bb, + 0x0fab, + 0x08f7, + 0x0fa1, + 0x0fa9, + 0x115b0, + 0x1103a, + 0xa67b, + 0x0344, + 0x035f, + 0x09e2, + 0x114b9, + 0x1ba3, + 0x11c9f, + 0x110b8, + 0x031a, + 0xe01db, + 0xa929, + 0xe01e5, + 0x1da1b, + 0x0324, + 0x1da4f, + 0x17c0, + 0x0f18, + 0xa8f1, + 0xaaf5, + 0xe0182, + 0x0a4d, + 0x0945, + 0x16af4, + 0x081b, + 0xaa43, + 0x115dc, + 0x1de4, + 0x1e01d, + 0x17b4, + 0xe0184, + 0xe01a2, + 0xe0147, + 0x20ea, + 0x1de0, + 0xe01af, + 0xa92c, + 0x0734, + 0x1b6b, + 0x110b6, + 0x10a39, + 0x1a65, + 0x05bc, + 0xe01a5, + 0x0d4c, + 0x0c01, + 0x1daad, + 0xa94f, + 0x1b37, + 0x1c2d, + 0x08fd, + 0x115b9, + 0xaabf, + 0x1da18, + 0x05b3, + 0x0963, + 0x1d181, + 0x1088, + 0x1ba2, + 0xe01ba, + 0x0953, + 0x0654, + 0x0abf, + 0xe011f, + 0xe0106, + 0x05a0, + 0xe01cf, + 0x11c3a, + 0x1cd2, + 0x065c, + 0xe010d, + 0x0308, + 0x1143e, + 0x1da53, + 0x0658, + 0x030c, + 0x11444, + 0x20d4, + 0xe0100, + 0x1a76, + 0x0a03, + 0xe0130, + 0x1da2d, + 0x11631, + 0xe0157, + 0x1b70, + 0x1da1e, + 0x114bc, + 0x17c5, + 0x16f5a, + 0x1163b, + 0x0f75, + 0x192b, + 0x1cf9, + 0xaaec, + 0x065e, + 0x0350, + 0x07af, + 0xa980, + 0x1056, + 0x034a, + 0x030e, + 0x2de0, + 0xa8e7, + 0x1e014, + 0x1da9e, + 0x08db, + 0x11cb6, + 0x111bb, + 0x1da26, + 0x0dd3, + 0x1035, + 0x1c24, + 0x0e49, + 0x08fc, + 0x0a4c, + 0x0c47, + 0x1da84, + 0xa9b5, + 0x0f80, + 0x1da5f, + 0x1172a, + 0x1dfc, + 0x0ddc, + 0xe015a, + 0xe0177, + 0x0818, + 0xe015e, + 0x1a63, + 0xa8c3, + 0x0591, + 0x1b01, + 0x0c43, + 0x0314, + 0xe01a6, + 0xfe22, + 0x1d187, + 0x11235, + 0x0acb, + 0xe0195, + 0x1da03, + 0xe01cd, + 0x1e00a, + 0x1d243, + 0xaaee, + 0x1da45, + 0x1da13, + 0xe01dd, + 0xe0112, + 0x08ee, + 0x1134d, + 0x1e00e, + 0x0b47, + 0x0f93, + 0x1dde, + 0x0659, + 0x0593, + 0x0616, + 0x1da5a, + 0x11446, + 0x0737, + 0x1ce1, + 0xe012f, + 0x1e009, + 0x1dd5, + 0x0360, + 0x073f, + 0x116af, + 0x08f9, + 0x08e5, + 0x1122c, + 0xe0108, + 0xfe2e, + 0x0bc2, + 0xe0133, + 0x081d, + 0x0489, + 0x0eb8, + 0x11c98, + 0x0302, + 0x1c31, + 0x0741, + 0x1133e, + 0xe0110, + 0x11173, + 0x0fb6, + 0x08f3, + 0x0942, + 0x08ef, + 0x11445, + 0x115b5, + 0x0347, + 0x1da19, + 0x0f72, + 0x114bd, + 0x1d17e, + 0x08de, + 0x0749, + 0x20d3, + 0x06ea, + 0x0b3c, + 0x0dd4, + 0x0d47, + 0x0f74, + 0x06d9, + 0x0f9f, + 0x0711, + 0x07ac, + 0x11c30, + 0xe0107, + 0xa9bf, + 0x08ed, + 0x0309, + 0x16f7a, + 0x1a66, + 0x11362, + 0x1e00d, + 0x1112b, + 0x1e8d1, + 0x0a70, + 0x1da65, + 0x034b, + 0x1e011, + 0x20e1, + 0x2df8, + 0x0e35, + 0xe011a, + 0x16f7e, + 0x05c2, + 0xaa7c, + 0x08da, + 0x1a7b, + 0x1e02a, + 0x106c, + 0x0f7a, + 0x10378, + 0x103c, + 0x20e3, + 0x1da9f, + 0x1a67, + 0x1e029, + 0x0d03, + 0x1da21, + 0x0948, + 0x11039, + 0xa8ef, + 0x1da02, + 0xe01cc, + 0x0f95, + 0x1733, + 0x0f73, + 0xa8e9, + 0xabe4, + 0x05b1, + 0x1daaa, + 0x2df3, + 0x1daaf, + 0x0592, + 0xaa4d, + 0x1a78, + 0x061a, + 0x2de7, + 0x1d1ad, + 0x11727, + 0x1da05, + 0x1d18b, + 0xe01ea, + 0x1da20, + 0xe01b6, + 0x17c2, + 0xaa34, + 0x109d, + 0x0739, + 0x065f, + 0x1885, + 0x064b, + 0x1b3b, + 0x1e8d5, + 0x0e47, + 0x1dc2, + 0xfe20, + 0x0335, + 0xe013b, + 0xe0158, + 0xa67d, + 0xe01ed, + 0x11635, + 0xfe28, + 0x0ebb, + 0x1da34, + 0x1b6f, + 0x103d, + 0x031c, + 0x1b3e, + 0x17b8, + 0x0944, + 0x1a6e, + 0xe01e0, + 0x1da31, + 0x112df, + 0x108c, + 0x2df6, + 0xe0149, + 0x20ee, + 0x0946, + 0x1b80, + 0x09c1, + 0x06e7, + 0x20e5, + 0x16f6e, + 0x10a38, + 0x1d166, + 0x05ba, + 0x0c42, + 0x0361, + 0x0e4d, + 0x11c99, + 0x2dff, + 0xa949, + 0x1103c, + 0x1939, + 0xe016e, + 0x1074, + 0x09c7, + 0xa9b4, + 0x0488, + 0x20e0, + 0xaa7b, + 0xe019c, + 0xe018b, + 0x09bc, + 0xe01ec, + 0x106b, + 0x11045, + 0x0f94, + 0x07ed, + 0xe0189, + 0x1da2b, + 0x1929, + 0xa9b8, + 0xe016a, + 0x1bc9d, + 0x109a, + 0x2dea, + 0x1037a, + 0x0656, + 0x0c3e, + 0x0346, + 0x1143a, + 0x1cd4, + 0x1c26, + 0x11436, + 0x0331, + 0xe016f, + 0x192a, + 0xe0154, + 0x0859, + 0x0325, + 0x0c55, + 0xe01b0, + 0x111bf, + 0xe013f, + 0xaa30, + 0x102b, + 0x17be, + 0x1abc, + 0x1b38, + 0xe013a, + 0x20dc, + 0x0c4a, + 0x1da28, + 0x0323, + 0x0955, + 0x1da5e, + 0x1da43, + 0x1aba, + 0x0c63, + 0xe018f, + 0x07ee, + 0xa94a, + 0xaab3, + 0x114b5, + 0x1be9, + 0x08e7, + 0x06e8, + 0x1772, + 0x1136a, + 0x108b, + 0x111b5, + 0x1a72, + 0x302d, + 0xe01e6, + 0x1da1c, + 0x2ded, + 0x0a4b, + 0x0597, + 0xe0123, + 0x08e0, + 0x11441, + 0xe0128, + 0x0c56, + 0x1b3d, + 0x1da4b, + 0x1bec, + 0x17d0, + 0x1d242, + 0xa8e1, + 0x114b2, + 0x094c, + 0x1bf1, + 0x115bb, + 0x16af1, + 0x035b, + 0xe0187, + 0x0bc8, + 0x11c93, + 0x11043, + 0x073e, + 0x0d48, + 0x064c, + 0x033f, + 0x0a3c, + 0xa950, + 0x0bd7, + 0x11638, + 0x073a, + 0xe0125, + 0x081c, + 0x0c00, + 0x07a8, + 0xe01eb, + 0xe0146, + 0x11725, + 0x1da52, + 0x05b8, + 0xe0105, + 0x17b7, + 0x0598, + 0xe010f, + 0x1bc9e, + 0x111cb, + 0xaaf6, + 0x135e, + 0x2df5, + 0x0822, + 0x1931, + 0xe012b, + 0x08e3, + 0x1dc0, + 0x07f3, + 0x1da48, + 0x116b0, + 0x1da11, + 0x16af2, + 0x116b6, + 0x06e4, + 0xfe27, + 0x16f6c, + 0x1c25, + 0x11129, + 0x0655, + 0x1e00b, + 0x0943, + 0x111b6, + 0x1112f, + 0x1c28, + 0x1da27, + 0x115b1, + 0x1da23, + 0x059e, + 0xe01e3, + 0x1a62, + 0x1dc3, + 0x20df, + 0x0f81, + 0xe0169, + 0x0abc, + 0x07ec, + 0x1921, + 0xe0143, + 0x11439, + 0x085a, + 0x11347, + 0xe01ef, + 0x0982, + 0x20db, + 0x032e, + 0x065b, + 0x10ae6, + 0x11341, + 0x0356, + 0xe0137, + 0x08d9, + 0x07a7, + 0x0fbb, + 0x1112d, + 0x0952, + 0x1c27, + 0x1103b, + 0x114be, + 0x1c34, + 0x0ddb, + 0x1a56, + 0xaa33, + 0xa9b6, + 0x1d18a, + 0x1a18, + 0x0732, + 0x09cc, + 0x1da9d, + 0x1071, + 0x1df1, + 0xe0129, + 0x309a, + 0xfe0a, + 0x0747, + 0x2de1, + 0x1cd5, + 0x17d3, + 0x1084, + 0x0a71, + 0x11370, + 0x0b63, + 0x1d170, + 0x0a51, + 0x0f86, + 0xa880, + 0x1928, + 0x1ba5, + 0x1da6c, + 0xe011b, + 0x1bf2, + 0x16b35, + 0x1da35, + 0x0a42, + 0xe0124, + 0x1107f, + 0xe019d, + 0x0f39, + 0x0355, + 0x0f77, + 0x0313, + 0x0bc1, + 0x030a, + 0x11633, + 0x1e020, + 0x1122e, + 0x1b3c, + 0x1be8, + 0x0983, + 0x1dc9, + 0x0670, + 0x11100, + 0x115b4, + 0x082d, + 0x114b4, + 0xe0140, + 0x0730, + 0x11722, + 0xabe9, + 0xaab7, + 0x11cb0, + 0x1b81, + 0xe0139, + 0x0349, + 0x05ae, + 0x0617, + 0x1e016, + 0x08eb, + 0x16f53, + 0x0745, + 0x1da36, + 0x031f, + 0x0652, + 0x1df4, + 0xfe0e, + 0xe0199, + 0x06db, + 0x05a9, + 0x08fa, + 0x20e6, + 0x1df5, + 0xe01a4, + 0x1059, + 0xe0164, + 0x0dd9, + 0x11131, + 0x064d, + 0x0a01, + 0x20d1, + 0xe014f, + 0xa8e5, + 0xa8c2, + 0x0981, + 0xa6f1, + 0x0f35, + 0x2dfb, + 0xfe0d, + 0x135d, + 0xe0115, + 0x093e, + 0x1e00c, + 0x11ca9, + 0xa8bc, + 0xe0102, + 0x05a4, + 0x1e01f, + 0x08f4, + 0xe0176, + 0x05ac, + 0x0fa8, + 0x16f5e, + 0x10a06, + 0x1dd0, + 0x1d185, + 0x16f79, + 0x17bf, + 0x16f68, + 0xe0117, + 0x0900, + 0x0a81, + 0xfe02, + 0x1dd4, + 0x1ba8, + 0xfb1e, + 0x3099, + 0x1e8d2, + 0x11128, + 0x11c92, + 0x17cf, + 0x0369, + 0x1cdc, + 0x08df, + 0x0748, + 0x0ec9, + 0xe01bf, + 0x17c3, + 0x1dcf, + 0x1112c, + 0x1143c, + 0x06da, + 0x1922, + 0x0d83, + 0x11cac, + 0x1ce5, + 0x0a41, + 0x11c33, + 0xa9bb, + 0x034f, + 0x11231, + 0x11000, + 0x11442, + 0x07a6, + 0x11ca3, + 0xfe06, + 0xa9ba, + 0x0f82, + 0x0d46, + 0x11101, + 0x0339, + 0x05c1, + 0x2de6, + 0x11c94, + 0x0ccd, + 0x0a48, + 0x11132, + 0x16f55, + 0x0343, + 0x110b9, + 0x1039, + 0x1da6b, + 0x1c2c, + 0xe01bc, + 0xe01c1, + 0x1085, + 0x082c, + 0x0947, + 0x09c0, + 0x1ddb, + 0x06e1, + 0x1a1a, + 0x031e, + 0xaab4, + 0xe01a1, + 0xfe26, + 0xe010e, + 0x1ce3, + 0x1163a, + 0x2dfc, + 0x0f87, + 0xe0173, + 0x1e015, + 0x1d189, + 0x035d, + 0x0ddf, + 0xfe24, + 0x11040, + 0x11300, + 0x1e021, + 0x11302, + 0xe01e1, + 0x0651, + 0x1da17, + 0x1920, + 0x115ba, + 0x0962, + 0x06df, + 0xa9b3, + 0x08ea, + 0x1cd8, + 0x0f7e, + 0x11721, + 0x116b2, + 0x11182, + 0x0c4c, + 0xe013e, + 0xe0160, + 0x1cd7, + 0x1a6f, + 0xfe03, + 0xe0116, + 0x1daac, + 0x11cb3, + 0x093f, + 0xa881, + 0xe0131, + 0x0fac, + 0x0a02, + 0x0d41, + 0x10377, + 0x114b3, + 0x112e2, + 0x0594, + 0x08f5, + 0xe0134, + 0x0334, + 0x2cef, + 0x07f2, + 0x0c4d, + 0x11caa, + 0x16b36, + 0x0f91, + 0x16f67, + 0x0c4b, + 0x1abb, + 0x0315, + 0x0c03, + 0xe013d, + 0x1de8, + 0xe0103, + 0x0fba, + 0x1dfd, + 0x11ca0, + 0x0f3e, + 0x16b31, + 0xfe2b, + 0x0a47, + 0x1da46, + 0xe0152, + 0x1de6, + 0x1ba7, + 0x1a64, + 0x11c9e, + 0x0f9b, + 0x0e31, + 0x110b3, + 0x0330, + 0x0b4b, + 0x1932, + 0x108f, + 0xaa2b, + 0x17ca, + 0x1dea, + 0x0310, + 0x2df1, + 0x1da4d, + 0x081e, + 0x112e6, + 0x030b, + 0xe01a7, + 0xaa2f, + 0x115c0, + 0xe0196, + 0x1daa5, + 0x1da51, + 0x11080, + 0x1937, + 0x033a, + 0x1dfb, + 0x1d16f, + 0x1dd8, + 0x0ce3, + 0x0f92, + 0x1b02, + 0x0dd1, + 0x1ab3, + 0x06ec, + 0x0c46, + 0x0fb2, + 0x115bc, + 0xe0162, + 0x1a69, + 0x0ecd, + 0x180d, + 0xa9c0, + 0x1e024, + 0x0f7c, + 0x0eb4, + 0xa8b8, + 0xa92b, + 0x11ca6, + 0x116ab, + 0xaa29, + 0x110b4, + 0xa982, + 0x1d1ac, + 0x059a, + 0x16f91, + 0x1753, + 0x0c41, + 0x109b, + 0xabe3, + 0xe0144, + 0x1ddf, + 0x05ad, + 0xe0142, + 0x11cb5, + 0x1122f, + 0xe010c, + 0x1b03, + 0x1925, + 0x1deb, + 0x1dff, + 0x11c97, + 0xe01b2, + 0x0f8d, + 0x0ac0, + 0x08d5, + 0x1a1b, + 0xa8eb, + 0xe011d, + 0x110ba, + 0x0613, + 0x1e001, + 0x0f37, + 0x0ecb, + 0xa674, + 0x1da9c, + 0x17b9, + 0x16f78, + 0x08e9, + 0x1da22, + 0x0353, + 0x1103d, + 0xe01aa, + 0x116ad, + 0x1baa, + 0x1dca, + 0x1cd6, + 0x1037, + 0xfe08, + 0x0338, + 0x05a8, + 0x1933, + 0xe01ee, + 0x0d4a, + 0x0bcd, + 0x11c9d, + 0xaaed, + 0x20ec, + 0x0cc6, + 0x116b7, + 0xe0166, + 0x1e948, + 0xe01b1, + 0x1b43, + 0x1a19, + 0x1bea, + 0x08f0, + 0x1da4a, + 0x0650, + 0x1da3f, + 0x1d17f, + 0xa94c, + 0x07eb, + 0x1da64, + 0x0d02, + 0x1ded, + 0x114b8, + 0xe01cb, + 0x112e9, + 0x09cd, + 0x1da07, + 0xe01d1, + 0x11c36, + 0x1a7c, + 0x1a7a, + 0x1be6, + 0x2def, + 0x0d3e, + 0x0f7b, + 0x1e94a, + 0x11ca7, +]; -#[inline] -pub fn is_combining_mark(c: char) -> bool { - match c { - '\u{0300}' => true, - '\u{0301}' => true, - '\u{0302}' => true, - '\u{0303}' => true, - '\u{0304}' => true, - '\u{0305}' => true, - '\u{0306}' => true, - '\u{0307}' => true, - '\u{0308}' => true, - '\u{0309}' => true, - '\u{030A}' => true, - '\u{030B}' => true, - '\u{030C}' => true, - '\u{030D}' => true, - '\u{030E}' => true, - '\u{030F}' => true, - '\u{0310}' => true, - '\u{0311}' => true, - '\u{0312}' => true, - '\u{0313}' => true, - '\u{0314}' => true, - '\u{0315}' => true, - '\u{0316}' => true, - '\u{0317}' => true, - '\u{0318}' => true, - '\u{0319}' => true, - '\u{031A}' => true, - '\u{031B}' => true, - '\u{031C}' => true, - '\u{031D}' => true, - '\u{031E}' => true, - '\u{031F}' => true, - '\u{0320}' => true, - '\u{0321}' => true, - '\u{0322}' => true, - '\u{0323}' => true, - '\u{0324}' => true, - '\u{0325}' => true, - '\u{0326}' => true, - '\u{0327}' => true, - '\u{0328}' => true, - '\u{0329}' => true, - '\u{032A}' => true, - '\u{032B}' => true, - '\u{032C}' => true, - '\u{032D}' => true, - '\u{032E}' => true, - '\u{032F}' => true, - '\u{0330}' => true, - '\u{0331}' => true, - '\u{0332}' => true, - '\u{0333}' => true, - '\u{0334}' => true, - '\u{0335}' => true, - '\u{0336}' => true, - '\u{0337}' => true, - '\u{0338}' => true, - '\u{0339}' => true, - '\u{033A}' => true, - '\u{033B}' => true, - '\u{033C}' => true, - '\u{033D}' => true, - '\u{033E}' => true, - '\u{033F}' => true, - '\u{0340}' => true, - '\u{0341}' => true, - '\u{0342}' => true, - '\u{0343}' => true, - '\u{0344}' => true, - '\u{0345}' => true, - '\u{0346}' => true, - '\u{0347}' => true, - '\u{0348}' => true, - '\u{0349}' => true, - '\u{034A}' => true, - '\u{034B}' => true, - '\u{034C}' => true, - '\u{034D}' => true, - '\u{034E}' => true, - '\u{034F}' => true, - '\u{0350}' => true, - '\u{0351}' => true, - '\u{0352}' => true, - '\u{0353}' => true, - '\u{0354}' => true, - '\u{0355}' => true, - '\u{0356}' => true, - '\u{0357}' => true, - '\u{0358}' => true, - '\u{0359}' => true, - '\u{035A}' => true, - '\u{035B}' => true, - '\u{035C}' => true, - '\u{035D}' => true, - '\u{035E}' => true, - '\u{035F}' => true, - '\u{0360}' => true, - '\u{0361}' => true, - '\u{0362}' => true, - '\u{0363}' => true, - '\u{0364}' => true, - '\u{0365}' => true, - '\u{0366}' => true, - '\u{0367}' => true, - '\u{0368}' => true, - '\u{0369}' => true, - '\u{036A}' => true, - '\u{036B}' => true, - '\u{036C}' => true, - '\u{036D}' => true, - '\u{036E}' => true, - '\u{036F}' => true, - '\u{0483}' => true, - '\u{0484}' => true, - '\u{0485}' => true, - '\u{0486}' => true, - '\u{0487}' => true, - '\u{0488}' => true, - '\u{0489}' => true, - '\u{0591}' => true, - '\u{0592}' => true, - '\u{0593}' => true, - '\u{0594}' => true, - '\u{0595}' => true, - '\u{0596}' => true, - '\u{0597}' => true, - '\u{0598}' => true, - '\u{0599}' => true, - '\u{059A}' => true, - '\u{059B}' => true, - '\u{059C}' => true, - '\u{059D}' => true, - '\u{059E}' => true, - '\u{059F}' => true, - '\u{05A0}' => true, - '\u{05A1}' => true, - '\u{05A2}' => true, - '\u{05A3}' => true, - '\u{05A4}' => true, - '\u{05A5}' => true, - '\u{05A6}' => true, - '\u{05A7}' => true, - '\u{05A8}' => true, - '\u{05A9}' => true, - '\u{05AA}' => true, - '\u{05AB}' => true, - '\u{05AC}' => true, - '\u{05AD}' => true, - '\u{05AE}' => true, - '\u{05AF}' => true, - '\u{05B0}' => true, - '\u{05B1}' => true, - '\u{05B2}' => true, - '\u{05B3}' => true, - '\u{05B4}' => true, - '\u{05B5}' => true, - '\u{05B6}' => true, - '\u{05B7}' => true, - '\u{05B8}' => true, - '\u{05B9}' => true, - '\u{05BA}' => true, - '\u{05BB}' => true, - '\u{05BC}' => true, - '\u{05BD}' => true, - '\u{05BF}' => true, - '\u{05C1}' => true, - '\u{05C2}' => true, - '\u{05C4}' => true, - '\u{05C5}' => true, - '\u{05C7}' => true, - '\u{0610}' => true, - '\u{0611}' => true, - '\u{0612}' => true, - '\u{0613}' => true, - '\u{0614}' => true, - '\u{0615}' => true, - '\u{0616}' => true, - '\u{0617}' => true, - '\u{0618}' => true, - '\u{0619}' => true, - '\u{061A}' => true, - '\u{064B}' => true, - '\u{064C}' => true, - '\u{064D}' => true, - '\u{064E}' => true, - '\u{064F}' => true, - '\u{0650}' => true, - '\u{0651}' => true, - '\u{0652}' => true, - '\u{0653}' => true, - '\u{0654}' => true, - '\u{0655}' => true, - '\u{0656}' => true, - '\u{0657}' => true, - '\u{0658}' => true, - '\u{0659}' => true, - '\u{065A}' => true, - '\u{065B}' => true, - '\u{065C}' => true, - '\u{065D}' => true, - '\u{065E}' => true, - '\u{065F}' => true, - '\u{0670}' => true, - '\u{06D6}' => true, - '\u{06D7}' => true, - '\u{06D8}' => true, - '\u{06D9}' => true, - '\u{06DA}' => true, - '\u{06DB}' => true, - '\u{06DC}' => true, - '\u{06DF}' => true, - '\u{06E0}' => true, - '\u{06E1}' => true, - '\u{06E2}' => true, - '\u{06E3}' => true, - '\u{06E4}' => true, - '\u{06E7}' => true, - '\u{06E8}' => true, - '\u{06EA}' => true, - '\u{06EB}' => true, - '\u{06EC}' => true, - '\u{06ED}' => true, - '\u{0711}' => true, - '\u{0730}' => true, - '\u{0731}' => true, - '\u{0732}' => true, - '\u{0733}' => true, - '\u{0734}' => true, - '\u{0735}' => true, - '\u{0736}' => true, - '\u{0737}' => true, - '\u{0738}' => true, - '\u{0739}' => true, - '\u{073A}' => true, - '\u{073B}' => true, - '\u{073C}' => true, - '\u{073D}' => true, - '\u{073E}' => true, - '\u{073F}' => true, - '\u{0740}' => true, - '\u{0741}' => true, - '\u{0742}' => true, - '\u{0743}' => true, - '\u{0744}' => true, - '\u{0745}' => true, - '\u{0746}' => true, - '\u{0747}' => true, - '\u{0748}' => true, - '\u{0749}' => true, - '\u{074A}' => true, - '\u{07A6}' => true, - '\u{07A7}' => true, - '\u{07A8}' => true, - '\u{07A9}' => true, - '\u{07AA}' => true, - '\u{07AB}' => true, - '\u{07AC}' => true, - '\u{07AD}' => true, - '\u{07AE}' => true, - '\u{07AF}' => true, - '\u{07B0}' => true, - '\u{07EB}' => true, - '\u{07EC}' => true, - '\u{07ED}' => true, - '\u{07EE}' => true, - '\u{07EF}' => true, - '\u{07F0}' => true, - '\u{07F1}' => true, - '\u{07F2}' => true, - '\u{07F3}' => true, - '\u{0816}' => true, - '\u{0817}' => true, - '\u{0818}' => true, - '\u{0819}' => true, - '\u{081B}' => true, - '\u{081C}' => true, - '\u{081D}' => true, - '\u{081E}' => true, - '\u{081F}' => true, - '\u{0820}' => true, - '\u{0821}' => true, - '\u{0822}' => true, - '\u{0823}' => true, - '\u{0825}' => true, - '\u{0826}' => true, - '\u{0827}' => true, - '\u{0829}' => true, - '\u{082A}' => true, - '\u{082B}' => true, - '\u{082C}' => true, - '\u{082D}' => true, - '\u{0859}' => true, - '\u{085A}' => true, - '\u{085B}' => true, - '\u{08D4}' => true, - '\u{08D5}' => true, - '\u{08D6}' => true, - '\u{08D7}' => true, - '\u{08D8}' => true, - '\u{08D9}' => true, - '\u{08DA}' => true, - '\u{08DB}' => true, - '\u{08DC}' => true, - '\u{08DD}' => true, - '\u{08DE}' => true, - '\u{08DF}' => true, - '\u{08E0}' => true, - '\u{08E1}' => true, - '\u{08E3}' => true, - '\u{08E4}' => true, - '\u{08E5}' => true, - '\u{08E6}' => true, - '\u{08E7}' => true, - '\u{08E8}' => true, - '\u{08E9}' => true, - '\u{08EA}' => true, - '\u{08EB}' => true, - '\u{08EC}' => true, - '\u{08ED}' => true, - '\u{08EE}' => true, - '\u{08EF}' => true, - '\u{08F0}' => true, - '\u{08F1}' => true, - '\u{08F2}' => true, - '\u{08F3}' => true, - '\u{08F4}' => true, - '\u{08F5}' => true, - '\u{08F6}' => true, - '\u{08F7}' => true, - '\u{08F8}' => true, - '\u{08F9}' => true, - '\u{08FA}' => true, - '\u{08FB}' => true, - '\u{08FC}' => true, - '\u{08FD}' => true, - '\u{08FE}' => true, - '\u{08FF}' => true, - '\u{0900}' => true, - '\u{0901}' => true, - '\u{0902}' => true, - '\u{0903}' => true, - '\u{093A}' => true, - '\u{093B}' => true, - '\u{093C}' => true, - '\u{093E}' => true, - '\u{093F}' => true, - '\u{0940}' => true, - '\u{0941}' => true, - '\u{0942}' => true, - '\u{0943}' => true, - '\u{0944}' => true, - '\u{0945}' => true, - '\u{0946}' => true, - '\u{0947}' => true, - '\u{0948}' => true, - '\u{0949}' => true, - '\u{094A}' => true, - '\u{094B}' => true, - '\u{094C}' => true, - '\u{094D}' => true, - '\u{094E}' => true, - '\u{094F}' => true, - '\u{0951}' => true, - '\u{0952}' => true, - '\u{0953}' => true, - '\u{0954}' => true, - '\u{0955}' => true, - '\u{0956}' => true, - '\u{0957}' => true, - '\u{0962}' => true, - '\u{0963}' => true, - '\u{0981}' => true, - '\u{0982}' => true, - '\u{0983}' => true, - '\u{09BC}' => true, - '\u{09BE}' => true, - '\u{09BF}' => true, - '\u{09C0}' => true, - '\u{09C1}' => true, - '\u{09C2}' => true, - '\u{09C3}' => true, - '\u{09C4}' => true, - '\u{09C7}' => true, - '\u{09C8}' => true, - '\u{09CB}' => true, - '\u{09CC}' => true, - '\u{09CD}' => true, - '\u{09D7}' => true, - '\u{09E2}' => true, - '\u{09E3}' => true, - '\u{0A01}' => true, - '\u{0A02}' => true, - '\u{0A03}' => true, - '\u{0A3C}' => true, - '\u{0A3E}' => true, - '\u{0A3F}' => true, - '\u{0A40}' => true, - '\u{0A41}' => true, - '\u{0A42}' => true, - '\u{0A47}' => true, - '\u{0A48}' => true, - '\u{0A4B}' => true, - '\u{0A4C}' => true, - '\u{0A4D}' => true, - '\u{0A51}' => true, - '\u{0A70}' => true, - '\u{0A71}' => true, - '\u{0A75}' => true, - '\u{0A81}' => true, - '\u{0A82}' => true, - '\u{0A83}' => true, - '\u{0ABC}' => true, - '\u{0ABE}' => true, - '\u{0ABF}' => true, - '\u{0AC0}' => true, - '\u{0AC1}' => true, - '\u{0AC2}' => true, - '\u{0AC3}' => true, - '\u{0AC4}' => true, - '\u{0AC5}' => true, - '\u{0AC7}' => true, - '\u{0AC8}' => true, - '\u{0AC9}' => true, - '\u{0ACB}' => true, - '\u{0ACC}' => true, - '\u{0ACD}' => true, - '\u{0AE2}' => true, - '\u{0AE3}' => true, - '\u{0B01}' => true, - '\u{0B02}' => true, - '\u{0B03}' => true, - '\u{0B3C}' => true, - '\u{0B3E}' => true, - '\u{0B3F}' => true, - '\u{0B40}' => true, - '\u{0B41}' => true, - '\u{0B42}' => true, - '\u{0B43}' => true, - '\u{0B44}' => true, - '\u{0B47}' => true, - '\u{0B48}' => true, - '\u{0B4B}' => true, - '\u{0B4C}' => true, - '\u{0B4D}' => true, - '\u{0B56}' => true, - '\u{0B57}' => true, - '\u{0B62}' => true, - '\u{0B63}' => true, - '\u{0B82}' => true, - '\u{0BBE}' => true, - '\u{0BBF}' => true, - '\u{0BC0}' => true, - '\u{0BC1}' => true, - '\u{0BC2}' => true, - '\u{0BC6}' => true, - '\u{0BC7}' => true, - '\u{0BC8}' => true, - '\u{0BCA}' => true, - '\u{0BCB}' => true, - '\u{0BCC}' => true, - '\u{0BCD}' => true, - '\u{0BD7}' => true, - '\u{0C00}' => true, - '\u{0C01}' => true, - '\u{0C02}' => true, - '\u{0C03}' => true, - '\u{0C3E}' => true, - '\u{0C3F}' => true, - '\u{0C40}' => true, - '\u{0C41}' => true, - '\u{0C42}' => true, - '\u{0C43}' => true, - '\u{0C44}' => true, - '\u{0C46}' => true, - '\u{0C47}' => true, - '\u{0C48}' => true, - '\u{0C4A}' => true, - '\u{0C4B}' => true, - '\u{0C4C}' => true, - '\u{0C4D}' => true, - '\u{0C55}' => true, - '\u{0C56}' => true, - '\u{0C62}' => true, - '\u{0C63}' => true, - '\u{0C81}' => true, - '\u{0C82}' => true, - '\u{0C83}' => true, - '\u{0CBC}' => true, - '\u{0CBE}' => true, - '\u{0CBF}' => true, - '\u{0CC0}' => true, - '\u{0CC1}' => true, - '\u{0CC2}' => true, - '\u{0CC3}' => true, - '\u{0CC4}' => true, - '\u{0CC6}' => true, - '\u{0CC7}' => true, - '\u{0CC8}' => true, - '\u{0CCA}' => true, - '\u{0CCB}' => true, - '\u{0CCC}' => true, - '\u{0CCD}' => true, - '\u{0CD5}' => true, - '\u{0CD6}' => true, - '\u{0CE2}' => true, - '\u{0CE3}' => true, - '\u{0D01}' => true, - '\u{0D02}' => true, - '\u{0D03}' => true, - '\u{0D3E}' => true, - '\u{0D3F}' => true, - '\u{0D40}' => true, - '\u{0D41}' => true, - '\u{0D42}' => true, - '\u{0D43}' => true, - '\u{0D44}' => true, - '\u{0D46}' => true, - '\u{0D47}' => true, - '\u{0D48}' => true, - '\u{0D4A}' => true, - '\u{0D4B}' => true, - '\u{0D4C}' => true, - '\u{0D4D}' => true, - '\u{0D57}' => true, - '\u{0D62}' => true, - '\u{0D63}' => true, - '\u{0D82}' => true, - '\u{0D83}' => true, - '\u{0DCA}' => true, - '\u{0DCF}' => true, - '\u{0DD0}' => true, - '\u{0DD1}' => true, - '\u{0DD2}' => true, - '\u{0DD3}' => true, - '\u{0DD4}' => true, - '\u{0DD6}' => true, - '\u{0DD8}' => true, - '\u{0DD9}' => true, - '\u{0DDA}' => true, - '\u{0DDB}' => true, - '\u{0DDC}' => true, - '\u{0DDD}' => true, - '\u{0DDE}' => true, - '\u{0DDF}' => true, - '\u{0DF2}' => true, - '\u{0DF3}' => true, - '\u{0E31}' => true, - '\u{0E34}' => true, - '\u{0E35}' => true, - '\u{0E36}' => true, - '\u{0E37}' => true, - '\u{0E38}' => true, - '\u{0E39}' => true, - '\u{0E3A}' => true, - '\u{0E47}' => true, - '\u{0E48}' => true, - '\u{0E49}' => true, - '\u{0E4A}' => true, - '\u{0E4B}' => true, - '\u{0E4C}' => true, - '\u{0E4D}' => true, - '\u{0E4E}' => true, - '\u{0EB1}' => true, - '\u{0EB4}' => true, - '\u{0EB5}' => true, - '\u{0EB6}' => true, - '\u{0EB7}' => true, - '\u{0EB8}' => true, - '\u{0EB9}' => true, - '\u{0EBB}' => true, - '\u{0EBC}' => true, - '\u{0EC8}' => true, - '\u{0EC9}' => true, - '\u{0ECA}' => true, - '\u{0ECB}' => true, - '\u{0ECC}' => true, - '\u{0ECD}' => true, - '\u{0F18}' => true, - '\u{0F19}' => true, - '\u{0F35}' => true, - '\u{0F37}' => true, - '\u{0F39}' => true, - '\u{0F3E}' => true, - '\u{0F3F}' => true, - '\u{0F71}' => true, - '\u{0F72}' => true, - '\u{0F73}' => true, - '\u{0F74}' => true, - '\u{0F75}' => true, - '\u{0F76}' => true, - '\u{0F77}' => true, - '\u{0F78}' => true, - '\u{0F79}' => true, - '\u{0F7A}' => true, - '\u{0F7B}' => true, - '\u{0F7C}' => true, - '\u{0F7D}' => true, - '\u{0F7E}' => true, - '\u{0F7F}' => true, - '\u{0F80}' => true, - '\u{0F81}' => true, - '\u{0F82}' => true, - '\u{0F83}' => true, - '\u{0F84}' => true, - '\u{0F86}' => true, - '\u{0F87}' => true, - '\u{0F8D}' => true, - '\u{0F8E}' => true, - '\u{0F8F}' => true, - '\u{0F90}' => true, - '\u{0F91}' => true, - '\u{0F92}' => true, - '\u{0F93}' => true, - '\u{0F94}' => true, - '\u{0F95}' => true, - '\u{0F96}' => true, - '\u{0F97}' => true, - '\u{0F99}' => true, - '\u{0F9A}' => true, - '\u{0F9B}' => true, - '\u{0F9C}' => true, - '\u{0F9D}' => true, - '\u{0F9E}' => true, - '\u{0F9F}' => true, - '\u{0FA0}' => true, - '\u{0FA1}' => true, - '\u{0FA2}' => true, - '\u{0FA3}' => true, - '\u{0FA4}' => true, - '\u{0FA5}' => true, - '\u{0FA6}' => true, - '\u{0FA7}' => true, - '\u{0FA8}' => true, - '\u{0FA9}' => true, - '\u{0FAA}' => true, - '\u{0FAB}' => true, - '\u{0FAC}' => true, - '\u{0FAD}' => true, - '\u{0FAE}' => true, - '\u{0FAF}' => true, - '\u{0FB0}' => true, - '\u{0FB1}' => true, - '\u{0FB2}' => true, - '\u{0FB3}' => true, - '\u{0FB4}' => true, - '\u{0FB5}' => true, - '\u{0FB6}' => true, - '\u{0FB7}' => true, - '\u{0FB8}' => true, - '\u{0FB9}' => true, - '\u{0FBA}' => true, - '\u{0FBB}' => true, - '\u{0FBC}' => true, - '\u{0FC6}' => true, - '\u{102B}' => true, - '\u{102C}' => true, - '\u{102D}' => true, - '\u{102E}' => true, - '\u{102F}' => true, - '\u{1030}' => true, - '\u{1031}' => true, - '\u{1032}' => true, - '\u{1033}' => true, - '\u{1034}' => true, - '\u{1035}' => true, - '\u{1036}' => true, - '\u{1037}' => true, - '\u{1038}' => true, - '\u{1039}' => true, - '\u{103A}' => true, - '\u{103B}' => true, - '\u{103C}' => true, - '\u{103D}' => true, - '\u{103E}' => true, - '\u{1056}' => true, - '\u{1057}' => true, - '\u{1058}' => true, - '\u{1059}' => true, - '\u{105E}' => true, - '\u{105F}' => true, - '\u{1060}' => true, - '\u{1062}' => true, - '\u{1063}' => true, - '\u{1064}' => true, - '\u{1067}' => true, - '\u{1068}' => true, - '\u{1069}' => true, - '\u{106A}' => true, - '\u{106B}' => true, - '\u{106C}' => true, - '\u{106D}' => true, - '\u{1071}' => true, - '\u{1072}' => true, - '\u{1073}' => true, - '\u{1074}' => true, - '\u{1082}' => true, - '\u{1083}' => true, - '\u{1084}' => true, - '\u{1085}' => true, - '\u{1086}' => true, - '\u{1087}' => true, - '\u{1088}' => true, - '\u{1089}' => true, - '\u{108A}' => true, - '\u{108B}' => true, - '\u{108C}' => true, - '\u{108D}' => true, - '\u{108F}' => true, - '\u{109A}' => true, - '\u{109B}' => true, - '\u{109C}' => true, - '\u{109D}' => true, - '\u{135D}' => true, - '\u{135E}' => true, - '\u{135F}' => true, - '\u{1712}' => true, - '\u{1713}' => true, - '\u{1714}' => true, - '\u{1732}' => true, - '\u{1733}' => true, - '\u{1734}' => true, - '\u{1752}' => true, - '\u{1753}' => true, - '\u{1772}' => true, - '\u{1773}' => true, - '\u{17B4}' => true, - '\u{17B5}' => true, - '\u{17B6}' => true, - '\u{17B7}' => true, - '\u{17B8}' => true, - '\u{17B9}' => true, - '\u{17BA}' => true, - '\u{17BB}' => true, - '\u{17BC}' => true, - '\u{17BD}' => true, - '\u{17BE}' => true, - '\u{17BF}' => true, - '\u{17C0}' => true, - '\u{17C1}' => true, - '\u{17C2}' => true, - '\u{17C3}' => true, - '\u{17C4}' => true, - '\u{17C5}' => true, - '\u{17C6}' => true, - '\u{17C7}' => true, - '\u{17C8}' => true, - '\u{17C9}' => true, - '\u{17CA}' => true, - '\u{17CB}' => true, - '\u{17CC}' => true, - '\u{17CD}' => true, - '\u{17CE}' => true, - '\u{17CF}' => true, - '\u{17D0}' => true, - '\u{17D1}' => true, - '\u{17D2}' => true, - '\u{17D3}' => true, - '\u{17DD}' => true, - '\u{180B}' => true, - '\u{180C}' => true, - '\u{180D}' => true, - '\u{1885}' => true, - '\u{1886}' => true, - '\u{18A9}' => true, - '\u{1920}' => true, - '\u{1921}' => true, - '\u{1922}' => true, - '\u{1923}' => true, - '\u{1924}' => true, - '\u{1925}' => true, - '\u{1926}' => true, - '\u{1927}' => true, - '\u{1928}' => true, - '\u{1929}' => true, - '\u{192A}' => true, - '\u{192B}' => true, - '\u{1930}' => true, - '\u{1931}' => true, - '\u{1932}' => true, - '\u{1933}' => true, - '\u{1934}' => true, - '\u{1935}' => true, - '\u{1936}' => true, - '\u{1937}' => true, - '\u{1938}' => true, - '\u{1939}' => true, - '\u{193A}' => true, - '\u{193B}' => true, - '\u{1A17}' => true, - '\u{1A18}' => true, - '\u{1A19}' => true, - '\u{1A1A}' => true, - '\u{1A1B}' => true, - '\u{1A55}' => true, - '\u{1A56}' => true, - '\u{1A57}' => true, - '\u{1A58}' => true, - '\u{1A59}' => true, - '\u{1A5A}' => true, - '\u{1A5B}' => true, - '\u{1A5C}' => true, - '\u{1A5D}' => true, - '\u{1A5E}' => true, - '\u{1A60}' => true, - '\u{1A61}' => true, - '\u{1A62}' => true, - '\u{1A63}' => true, - '\u{1A64}' => true, - '\u{1A65}' => true, - '\u{1A66}' => true, - '\u{1A67}' => true, - '\u{1A68}' => true, - '\u{1A69}' => true, - '\u{1A6A}' => true, - '\u{1A6B}' => true, - '\u{1A6C}' => true, - '\u{1A6D}' => true, - '\u{1A6E}' => true, - '\u{1A6F}' => true, - '\u{1A70}' => true, - '\u{1A71}' => true, - '\u{1A72}' => true, - '\u{1A73}' => true, - '\u{1A74}' => true, - '\u{1A75}' => true, - '\u{1A76}' => true, - '\u{1A77}' => true, - '\u{1A78}' => true, - '\u{1A79}' => true, - '\u{1A7A}' => true, - '\u{1A7B}' => true, - '\u{1A7C}' => true, - '\u{1A7F}' => true, - '\u{1AB0}' => true, - '\u{1AB1}' => true, - '\u{1AB2}' => true, - '\u{1AB3}' => true, - '\u{1AB4}' => true, - '\u{1AB5}' => true, - '\u{1AB6}' => true, - '\u{1AB7}' => true, - '\u{1AB8}' => true, - '\u{1AB9}' => true, - '\u{1ABA}' => true, - '\u{1ABB}' => true, - '\u{1ABC}' => true, - '\u{1ABD}' => true, - '\u{1ABE}' => true, - '\u{1B00}' => true, - '\u{1B01}' => true, - '\u{1B02}' => true, - '\u{1B03}' => true, - '\u{1B04}' => true, - '\u{1B34}' => true, - '\u{1B35}' => true, - '\u{1B36}' => true, - '\u{1B37}' => true, - '\u{1B38}' => true, - '\u{1B39}' => true, - '\u{1B3A}' => true, - '\u{1B3B}' => true, - '\u{1B3C}' => true, - '\u{1B3D}' => true, - '\u{1B3E}' => true, - '\u{1B3F}' => true, - '\u{1B40}' => true, - '\u{1B41}' => true, - '\u{1B42}' => true, - '\u{1B43}' => true, - '\u{1B44}' => true, - '\u{1B6B}' => true, - '\u{1B6C}' => true, - '\u{1B6D}' => true, - '\u{1B6E}' => true, - '\u{1B6F}' => true, - '\u{1B70}' => true, - '\u{1B71}' => true, - '\u{1B72}' => true, - '\u{1B73}' => true, - '\u{1B80}' => true, - '\u{1B81}' => true, - '\u{1B82}' => true, - '\u{1BA1}' => true, - '\u{1BA2}' => true, - '\u{1BA3}' => true, - '\u{1BA4}' => true, - '\u{1BA5}' => true, - '\u{1BA6}' => true, - '\u{1BA7}' => true, - '\u{1BA8}' => true, - '\u{1BA9}' => true, - '\u{1BAA}' => true, - '\u{1BAB}' => true, - '\u{1BAC}' => true, - '\u{1BAD}' => true, - '\u{1BE6}' => true, - '\u{1BE7}' => true, - '\u{1BE8}' => true, - '\u{1BE9}' => true, - '\u{1BEA}' => true, - '\u{1BEB}' => true, - '\u{1BEC}' => true, - '\u{1BED}' => true, - '\u{1BEE}' => true, - '\u{1BEF}' => true, - '\u{1BF0}' => true, - '\u{1BF1}' => true, - '\u{1BF2}' => true, - '\u{1BF3}' => true, - '\u{1C24}' => true, - '\u{1C25}' => true, - '\u{1C26}' => true, - '\u{1C27}' => true, - '\u{1C28}' => true, - '\u{1C29}' => true, - '\u{1C2A}' => true, - '\u{1C2B}' => true, - '\u{1C2C}' => true, - '\u{1C2D}' => true, - '\u{1C2E}' => true, - '\u{1C2F}' => true, - '\u{1C30}' => true, - '\u{1C31}' => true, - '\u{1C32}' => true, - '\u{1C33}' => true, - '\u{1C34}' => true, - '\u{1C35}' => true, - '\u{1C36}' => true, - '\u{1C37}' => true, - '\u{1CD0}' => true, - '\u{1CD1}' => true, - '\u{1CD2}' => true, - '\u{1CD4}' => true, - '\u{1CD5}' => true, - '\u{1CD6}' => true, - '\u{1CD7}' => true, - '\u{1CD8}' => true, - '\u{1CD9}' => true, - '\u{1CDA}' => true, - '\u{1CDB}' => true, - '\u{1CDC}' => true, - '\u{1CDD}' => true, - '\u{1CDE}' => true, - '\u{1CDF}' => true, - '\u{1CE0}' => true, - '\u{1CE1}' => true, - '\u{1CE2}' => true, - '\u{1CE3}' => true, - '\u{1CE4}' => true, - '\u{1CE5}' => true, - '\u{1CE6}' => true, - '\u{1CE7}' => true, - '\u{1CE8}' => true, - '\u{1CED}' => true, - '\u{1CF2}' => true, - '\u{1CF3}' => true, - '\u{1CF4}' => true, - '\u{1CF8}' => true, - '\u{1CF9}' => true, - '\u{1DC0}' => true, - '\u{1DC1}' => true, - '\u{1DC2}' => true, - '\u{1DC3}' => true, - '\u{1DC4}' => true, - '\u{1DC5}' => true, - '\u{1DC6}' => true, - '\u{1DC7}' => true, - '\u{1DC8}' => true, - '\u{1DC9}' => true, - '\u{1DCA}' => true, - '\u{1DCB}' => true, - '\u{1DCC}' => true, - '\u{1DCD}' => true, - '\u{1DCE}' => true, - '\u{1DCF}' => true, - '\u{1DD0}' => true, - '\u{1DD1}' => true, - '\u{1DD2}' => true, - '\u{1DD3}' => true, - '\u{1DD4}' => true, - '\u{1DD5}' => true, - '\u{1DD6}' => true, - '\u{1DD7}' => true, - '\u{1DD8}' => true, - '\u{1DD9}' => true, - '\u{1DDA}' => true, - '\u{1DDB}' => true, - '\u{1DDC}' => true, - '\u{1DDD}' => true, - '\u{1DDE}' => true, - '\u{1DDF}' => true, - '\u{1DE0}' => true, - '\u{1DE1}' => true, - '\u{1DE2}' => true, - '\u{1DE3}' => true, - '\u{1DE4}' => true, - '\u{1DE5}' => true, - '\u{1DE6}' => true, - '\u{1DE7}' => true, - '\u{1DE8}' => true, - '\u{1DE9}' => true, - '\u{1DEA}' => true, - '\u{1DEB}' => true, - '\u{1DEC}' => true, - '\u{1DED}' => true, - '\u{1DEE}' => true, - '\u{1DEF}' => true, - '\u{1DF0}' => true, - '\u{1DF1}' => true, - '\u{1DF2}' => true, - '\u{1DF3}' => true, - '\u{1DF4}' => true, - '\u{1DF5}' => true, - '\u{1DFB}' => true, - '\u{1DFC}' => true, - '\u{1DFD}' => true, - '\u{1DFE}' => true, - '\u{1DFF}' => true, - '\u{20D0}' => true, - '\u{20D1}' => true, - '\u{20D2}' => true, - '\u{20D3}' => true, - '\u{20D4}' => true, - '\u{20D5}' => true, - '\u{20D6}' => true, - '\u{20D7}' => true, - '\u{20D8}' => true, - '\u{20D9}' => true, - '\u{20DA}' => true, - '\u{20DB}' => true, - '\u{20DC}' => true, - '\u{20DD}' => true, - '\u{20DE}' => true, - '\u{20DF}' => true, - '\u{20E0}' => true, - '\u{20E1}' => true, - '\u{20E2}' => true, - '\u{20E3}' => true, - '\u{20E4}' => true, - '\u{20E5}' => true, - '\u{20E6}' => true, - '\u{20E7}' => true, - '\u{20E8}' => true, - '\u{20E9}' => true, - '\u{20EA}' => true, - '\u{20EB}' => true, - '\u{20EC}' => true, - '\u{20ED}' => true, - '\u{20EE}' => true, - '\u{20EF}' => true, - '\u{20F0}' => true, - '\u{2CEF}' => true, - '\u{2CF0}' => true, - '\u{2CF1}' => true, - '\u{2D7F}' => true, - '\u{2DE0}' => true, - '\u{2DE1}' => true, - '\u{2DE2}' => true, - '\u{2DE3}' => true, - '\u{2DE4}' => true, - '\u{2DE5}' => true, - '\u{2DE6}' => true, - '\u{2DE7}' => true, - '\u{2DE8}' => true, - '\u{2DE9}' => true, - '\u{2DEA}' => true, - '\u{2DEB}' => true, - '\u{2DEC}' => true, - '\u{2DED}' => true, - '\u{2DEE}' => true, - '\u{2DEF}' => true, - '\u{2DF0}' => true, - '\u{2DF1}' => true, - '\u{2DF2}' => true, - '\u{2DF3}' => true, - '\u{2DF4}' => true, - '\u{2DF5}' => true, - '\u{2DF6}' => true, - '\u{2DF7}' => true, - '\u{2DF8}' => true, - '\u{2DF9}' => true, - '\u{2DFA}' => true, - '\u{2DFB}' => true, - '\u{2DFC}' => true, - '\u{2DFD}' => true, - '\u{2DFE}' => true, - '\u{2DFF}' => true, - '\u{302A}' => true, - '\u{302B}' => true, - '\u{302C}' => true, - '\u{302D}' => true, - '\u{302E}' => true, - '\u{302F}' => true, - '\u{3099}' => true, - '\u{309A}' => true, - '\u{A66F}' => true, - '\u{A670}' => true, - '\u{A671}' => true, - '\u{A672}' => true, - '\u{A674}' => true, - '\u{A675}' => true, - '\u{A676}' => true, - '\u{A677}' => true, - '\u{A678}' => true, - '\u{A679}' => true, - '\u{A67A}' => true, - '\u{A67B}' => true, - '\u{A67C}' => true, - '\u{A67D}' => true, - '\u{A69E}' => true, - '\u{A69F}' => true, - '\u{A6F0}' => true, - '\u{A6F1}' => true, - '\u{A802}' => true, - '\u{A806}' => true, - '\u{A80B}' => true, - '\u{A823}' => true, - '\u{A824}' => true, - '\u{A825}' => true, - '\u{A826}' => true, - '\u{A827}' => true, - '\u{A880}' => true, - '\u{A881}' => true, - '\u{A8B4}' => true, - '\u{A8B5}' => true, - '\u{A8B6}' => true, - '\u{A8B7}' => true, - '\u{A8B8}' => true, - '\u{A8B9}' => true, - '\u{A8BA}' => true, - '\u{A8BB}' => true, - '\u{A8BC}' => true, - '\u{A8BD}' => true, - '\u{A8BE}' => true, - '\u{A8BF}' => true, - '\u{A8C0}' => true, - '\u{A8C1}' => true, - '\u{A8C2}' => true, - '\u{A8C3}' => true, - '\u{A8C4}' => true, - '\u{A8C5}' => true, - '\u{A8E0}' => true, - '\u{A8E1}' => true, - '\u{A8E2}' => true, - '\u{A8E3}' => true, - '\u{A8E4}' => true, - '\u{A8E5}' => true, - '\u{A8E6}' => true, - '\u{A8E7}' => true, - '\u{A8E8}' => true, - '\u{A8E9}' => true, - '\u{A8EA}' => true, - '\u{A8EB}' => true, - '\u{A8EC}' => true, - '\u{A8ED}' => true, - '\u{A8EE}' => true, - '\u{A8EF}' => true, - '\u{A8F0}' => true, - '\u{A8F1}' => true, - '\u{A926}' => true, - '\u{A927}' => true, - '\u{A928}' => true, - '\u{A929}' => true, - '\u{A92A}' => true, - '\u{A92B}' => true, - '\u{A92C}' => true, - '\u{A92D}' => true, - '\u{A947}' => true, - '\u{A948}' => true, - '\u{A949}' => true, - '\u{A94A}' => true, - '\u{A94B}' => true, - '\u{A94C}' => true, - '\u{A94D}' => true, - '\u{A94E}' => true, - '\u{A94F}' => true, - '\u{A950}' => true, - '\u{A951}' => true, - '\u{A952}' => true, - '\u{A953}' => true, - '\u{A980}' => true, - '\u{A981}' => true, - '\u{A982}' => true, - '\u{A983}' => true, - '\u{A9B3}' => true, - '\u{A9B4}' => true, - '\u{A9B5}' => true, - '\u{A9B6}' => true, - '\u{A9B7}' => true, - '\u{A9B8}' => true, - '\u{A9B9}' => true, - '\u{A9BA}' => true, - '\u{A9BB}' => true, - '\u{A9BC}' => true, - '\u{A9BD}' => true, - '\u{A9BE}' => true, - '\u{A9BF}' => true, - '\u{A9C0}' => true, - '\u{A9E5}' => true, - '\u{AA29}' => true, - '\u{AA2A}' => true, - '\u{AA2B}' => true, - '\u{AA2C}' => true, - '\u{AA2D}' => true, - '\u{AA2E}' => true, - '\u{AA2F}' => true, - '\u{AA30}' => true, - '\u{AA31}' => true, - '\u{AA32}' => true, - '\u{AA33}' => true, - '\u{AA34}' => true, - '\u{AA35}' => true, - '\u{AA36}' => true, - '\u{AA43}' => true, - '\u{AA4C}' => true, - '\u{AA4D}' => true, - '\u{AA7B}' => true, - '\u{AA7C}' => true, - '\u{AA7D}' => true, - '\u{AAB0}' => true, - '\u{AAB2}' => true, - '\u{AAB3}' => true, - '\u{AAB4}' => true, - '\u{AAB7}' => true, - '\u{AAB8}' => true, - '\u{AABE}' => true, - '\u{AABF}' => true, - '\u{AAC1}' => true, - '\u{AAEB}' => true, - '\u{AAEC}' => true, - '\u{AAED}' => true, - '\u{AAEE}' => true, - '\u{AAEF}' => true, - '\u{AAF5}' => true, - '\u{AAF6}' => true, - '\u{ABE3}' => true, - '\u{ABE4}' => true, - '\u{ABE5}' => true, - '\u{ABE6}' => true, - '\u{ABE7}' => true, - '\u{ABE8}' => true, - '\u{ABE9}' => true, - '\u{ABEA}' => true, - '\u{ABEC}' => true, - '\u{ABED}' => true, - '\u{FB1E}' => true, - '\u{FE00}' => true, - '\u{FE01}' => true, - '\u{FE02}' => true, - '\u{FE03}' => true, - '\u{FE04}' => true, - '\u{FE05}' => true, - '\u{FE06}' => true, - '\u{FE07}' => true, - '\u{FE08}' => true, - '\u{FE09}' => true, - '\u{FE0A}' => true, - '\u{FE0B}' => true, - '\u{FE0C}' => true, - '\u{FE0D}' => true, - '\u{FE0E}' => true, - '\u{FE0F}' => true, - '\u{FE20}' => true, - '\u{FE21}' => true, - '\u{FE22}' => true, - '\u{FE23}' => true, - '\u{FE24}' => true, - '\u{FE25}' => true, - '\u{FE26}' => true, - '\u{FE27}' => true, - '\u{FE28}' => true, - '\u{FE29}' => true, - '\u{FE2A}' => true, - '\u{FE2B}' => true, - '\u{FE2C}' => true, - '\u{FE2D}' => true, - '\u{FE2E}' => true, - '\u{FE2F}' => true, - '\u{101FD}' => true, - '\u{102E0}' => true, - '\u{10376}' => true, - '\u{10377}' => true, - '\u{10378}' => true, - '\u{10379}' => true, - '\u{1037A}' => true, - '\u{10A01}' => true, - '\u{10A02}' => true, - '\u{10A03}' => true, - '\u{10A05}' => true, - '\u{10A06}' => true, - '\u{10A0C}' => true, - '\u{10A0D}' => true, - '\u{10A0E}' => true, - '\u{10A0F}' => true, - '\u{10A38}' => true, - '\u{10A39}' => true, - '\u{10A3A}' => true, - '\u{10A3F}' => true, - '\u{10AE5}' => true, - '\u{10AE6}' => true, - '\u{11000}' => true, - '\u{11001}' => true, - '\u{11002}' => true, - '\u{11038}' => true, - '\u{11039}' => true, - '\u{1103A}' => true, - '\u{1103B}' => true, - '\u{1103C}' => true, - '\u{1103D}' => true, - '\u{1103E}' => true, - '\u{1103F}' => true, - '\u{11040}' => true, - '\u{11041}' => true, - '\u{11042}' => true, - '\u{11043}' => true, - '\u{11044}' => true, - '\u{11045}' => true, - '\u{11046}' => true, - '\u{1107F}' => true, - '\u{11080}' => true, - '\u{11081}' => true, - '\u{11082}' => true, - '\u{110B0}' => true, - '\u{110B1}' => true, - '\u{110B2}' => true, - '\u{110B3}' => true, - '\u{110B4}' => true, - '\u{110B5}' => true, - '\u{110B6}' => true, - '\u{110B7}' => true, - '\u{110B8}' => true, - '\u{110B9}' => true, - '\u{110BA}' => true, - '\u{11100}' => true, - '\u{11101}' => true, - '\u{11102}' => true, - '\u{11127}' => true, - '\u{11128}' => true, - '\u{11129}' => true, - '\u{1112A}' => true, - '\u{1112B}' => true, - '\u{1112C}' => true, - '\u{1112D}' => true, - '\u{1112E}' => true, - '\u{1112F}' => true, - '\u{11130}' => true, - '\u{11131}' => true, - '\u{11132}' => true, - '\u{11133}' => true, - '\u{11134}' => true, - '\u{11173}' => true, - '\u{11180}' => true, - '\u{11181}' => true, - '\u{11182}' => true, - '\u{111B3}' => true, - '\u{111B4}' => true, - '\u{111B5}' => true, - '\u{111B6}' => true, - '\u{111B7}' => true, - '\u{111B8}' => true, - '\u{111B9}' => true, - '\u{111BA}' => true, - '\u{111BB}' => true, - '\u{111BC}' => true, - '\u{111BD}' => true, - '\u{111BE}' => true, - '\u{111BF}' => true, - '\u{111C0}' => true, - '\u{111CA}' => true, - '\u{111CB}' => true, - '\u{111CC}' => true, - '\u{1122C}' => true, - '\u{1122D}' => true, - '\u{1122E}' => true, - '\u{1122F}' => true, - '\u{11230}' => true, - '\u{11231}' => true, - '\u{11232}' => true, - '\u{11233}' => true, - '\u{11234}' => true, - '\u{11235}' => true, - '\u{11236}' => true, - '\u{11237}' => true, - '\u{1123E}' => true, - '\u{112DF}' => true, - '\u{112E0}' => true, - '\u{112E1}' => true, - '\u{112E2}' => true, - '\u{112E3}' => true, - '\u{112E4}' => true, - '\u{112E5}' => true, - '\u{112E6}' => true, - '\u{112E7}' => true, - '\u{112E8}' => true, - '\u{112E9}' => true, - '\u{112EA}' => true, - '\u{11300}' => true, - '\u{11301}' => true, - '\u{11302}' => true, - '\u{11303}' => true, - '\u{1133C}' => true, - '\u{1133E}' => true, - '\u{1133F}' => true, - '\u{11340}' => true, - '\u{11341}' => true, - '\u{11342}' => true, - '\u{11343}' => true, - '\u{11344}' => true, - '\u{11347}' => true, - '\u{11348}' => true, - '\u{1134B}' => true, - '\u{1134C}' => true, - '\u{1134D}' => true, - '\u{11357}' => true, - '\u{11362}' => true, - '\u{11363}' => true, - '\u{11366}' => true, - '\u{11367}' => true, - '\u{11368}' => true, - '\u{11369}' => true, - '\u{1136A}' => true, - '\u{1136B}' => true, - '\u{1136C}' => true, - '\u{11370}' => true, - '\u{11371}' => true, - '\u{11372}' => true, - '\u{11373}' => true, - '\u{11374}' => true, - '\u{11435}' => true, - '\u{11436}' => true, - '\u{11437}' => true, - '\u{11438}' => true, - '\u{11439}' => true, - '\u{1143A}' => true, - '\u{1143B}' => true, - '\u{1143C}' => true, - '\u{1143D}' => true, - '\u{1143E}' => true, - '\u{1143F}' => true, - '\u{11440}' => true, - '\u{11441}' => true, - '\u{11442}' => true, - '\u{11443}' => true, - '\u{11444}' => true, - '\u{11445}' => true, - '\u{11446}' => true, - '\u{114B0}' => true, - '\u{114B1}' => true, - '\u{114B2}' => true, - '\u{114B3}' => true, - '\u{114B4}' => true, - '\u{114B5}' => true, - '\u{114B6}' => true, - '\u{114B7}' => true, - '\u{114B8}' => true, - '\u{114B9}' => true, - '\u{114BA}' => true, - '\u{114BB}' => true, - '\u{114BC}' => true, - '\u{114BD}' => true, - '\u{114BE}' => true, - '\u{114BF}' => true, - '\u{114C0}' => true, - '\u{114C1}' => true, - '\u{114C2}' => true, - '\u{114C3}' => true, - '\u{115AF}' => true, - '\u{115B0}' => true, - '\u{115B1}' => true, - '\u{115B2}' => true, - '\u{115B3}' => true, - '\u{115B4}' => true, - '\u{115B5}' => true, - '\u{115B8}' => true, - '\u{115B9}' => true, - '\u{115BA}' => true, - '\u{115BB}' => true, - '\u{115BC}' => true, - '\u{115BD}' => true, - '\u{115BE}' => true, - '\u{115BF}' => true, - '\u{115C0}' => true, - '\u{115DC}' => true, - '\u{115DD}' => true, - '\u{11630}' => true, - '\u{11631}' => true, - '\u{11632}' => true, - '\u{11633}' => true, - '\u{11634}' => true, - '\u{11635}' => true, - '\u{11636}' => true, - '\u{11637}' => true, - '\u{11638}' => true, - '\u{11639}' => true, - '\u{1163A}' => true, - '\u{1163B}' => true, - '\u{1163C}' => true, - '\u{1163D}' => true, - '\u{1163E}' => true, - '\u{1163F}' => true, - '\u{11640}' => true, - '\u{116AB}' => true, - '\u{116AC}' => true, - '\u{116AD}' => true, - '\u{116AE}' => true, - '\u{116AF}' => true, - '\u{116B0}' => true, - '\u{116B1}' => true, - '\u{116B2}' => true, - '\u{116B3}' => true, - '\u{116B4}' => true, - '\u{116B5}' => true, - '\u{116B6}' => true, - '\u{116B7}' => true, - '\u{1171D}' => true, - '\u{1171E}' => true, - '\u{1171F}' => true, - '\u{11720}' => true, - '\u{11721}' => true, - '\u{11722}' => true, - '\u{11723}' => true, - '\u{11724}' => true, - '\u{11725}' => true, - '\u{11726}' => true, - '\u{11727}' => true, - '\u{11728}' => true, - '\u{11729}' => true, - '\u{1172A}' => true, - '\u{1172B}' => true, - '\u{11C2F}' => true, - '\u{11C30}' => true, - '\u{11C31}' => true, - '\u{11C32}' => true, - '\u{11C33}' => true, - '\u{11C34}' => true, - '\u{11C35}' => true, - '\u{11C36}' => true, - '\u{11C38}' => true, - '\u{11C39}' => true, - '\u{11C3A}' => true, - '\u{11C3B}' => true, - '\u{11C3C}' => true, - '\u{11C3D}' => true, - '\u{11C3E}' => true, - '\u{11C3F}' => true, - '\u{11C92}' => true, - '\u{11C93}' => true, - '\u{11C94}' => true, - '\u{11C95}' => true, - '\u{11C96}' => true, - '\u{11C97}' => true, - '\u{11C98}' => true, - '\u{11C99}' => true, - '\u{11C9A}' => true, - '\u{11C9B}' => true, - '\u{11C9C}' => true, - '\u{11C9D}' => true, - '\u{11C9E}' => true, - '\u{11C9F}' => true, - '\u{11CA0}' => true, - '\u{11CA1}' => true, - '\u{11CA2}' => true, - '\u{11CA3}' => true, - '\u{11CA4}' => true, - '\u{11CA5}' => true, - '\u{11CA6}' => true, - '\u{11CA7}' => true, - '\u{11CA9}' => true, - '\u{11CAA}' => true, - '\u{11CAB}' => true, - '\u{11CAC}' => true, - '\u{11CAD}' => true, - '\u{11CAE}' => true, - '\u{11CAF}' => true, - '\u{11CB0}' => true, - '\u{11CB1}' => true, - '\u{11CB2}' => true, - '\u{11CB3}' => true, - '\u{11CB4}' => true, - '\u{11CB5}' => true, - '\u{11CB6}' => true, - '\u{16AF0}' => true, - '\u{16AF1}' => true, - '\u{16AF2}' => true, - '\u{16AF3}' => true, - '\u{16AF4}' => true, - '\u{16B30}' => true, - '\u{16B31}' => true, - '\u{16B32}' => true, - '\u{16B33}' => true, - '\u{16B34}' => true, - '\u{16B35}' => true, - '\u{16B36}' => true, - '\u{16F51}' => true, - '\u{16F52}' => true, - '\u{16F53}' => true, - '\u{16F54}' => true, - '\u{16F55}' => true, - '\u{16F56}' => true, - '\u{16F57}' => true, - '\u{16F58}' => true, - '\u{16F59}' => true, - '\u{16F5A}' => true, - '\u{16F5B}' => true, - '\u{16F5C}' => true, - '\u{16F5D}' => true, - '\u{16F5E}' => true, - '\u{16F5F}' => true, - '\u{16F60}' => true, - '\u{16F61}' => true, - '\u{16F62}' => true, - '\u{16F63}' => true, - '\u{16F64}' => true, - '\u{16F65}' => true, - '\u{16F66}' => true, - '\u{16F67}' => true, - '\u{16F68}' => true, - '\u{16F69}' => true, - '\u{16F6A}' => true, - '\u{16F6B}' => true, - '\u{16F6C}' => true, - '\u{16F6D}' => true, - '\u{16F6E}' => true, - '\u{16F6F}' => true, - '\u{16F70}' => true, - '\u{16F71}' => true, - '\u{16F72}' => true, - '\u{16F73}' => true, - '\u{16F74}' => true, - '\u{16F75}' => true, - '\u{16F76}' => true, - '\u{16F77}' => true, - '\u{16F78}' => true, - '\u{16F79}' => true, - '\u{16F7A}' => true, - '\u{16F7B}' => true, - '\u{16F7C}' => true, - '\u{16F7D}' => true, - '\u{16F7E}' => true, - '\u{16F8F}' => true, - '\u{16F90}' => true, - '\u{16F91}' => true, - '\u{16F92}' => true, - '\u{1BC9D}' => true, - '\u{1BC9E}' => true, - '\u{1D165}' => true, - '\u{1D166}' => true, - '\u{1D167}' => true, - '\u{1D168}' => true, - '\u{1D169}' => true, - '\u{1D16D}' => true, - '\u{1D16E}' => true, - '\u{1D16F}' => true, - '\u{1D170}' => true, - '\u{1D171}' => true, - '\u{1D172}' => true, - '\u{1D17B}' => true, - '\u{1D17C}' => true, - '\u{1D17D}' => true, - '\u{1D17E}' => true, - '\u{1D17F}' => true, - '\u{1D180}' => true, - '\u{1D181}' => true, - '\u{1D182}' => true, - '\u{1D185}' => true, - '\u{1D186}' => true, - '\u{1D187}' => true, - '\u{1D188}' => true, - '\u{1D189}' => true, - '\u{1D18A}' => true, - '\u{1D18B}' => true, - '\u{1D1AA}' => true, - '\u{1D1AB}' => true, - '\u{1D1AC}' => true, - '\u{1D1AD}' => true, - '\u{1D242}' => true, - '\u{1D243}' => true, - '\u{1D244}' => true, - '\u{1DA00}' => true, - '\u{1DA01}' => true, - '\u{1DA02}' => true, - '\u{1DA03}' => true, - '\u{1DA04}' => true, - '\u{1DA05}' => true, - '\u{1DA06}' => true, - '\u{1DA07}' => true, - '\u{1DA08}' => true, - '\u{1DA09}' => true, - '\u{1DA0A}' => true, - '\u{1DA0B}' => true, - '\u{1DA0C}' => true, - '\u{1DA0D}' => true, - '\u{1DA0E}' => true, - '\u{1DA0F}' => true, - '\u{1DA10}' => true, - '\u{1DA11}' => true, - '\u{1DA12}' => true, - '\u{1DA13}' => true, - '\u{1DA14}' => true, - '\u{1DA15}' => true, - '\u{1DA16}' => true, - '\u{1DA17}' => true, - '\u{1DA18}' => true, - '\u{1DA19}' => true, - '\u{1DA1A}' => true, - '\u{1DA1B}' => true, - '\u{1DA1C}' => true, - '\u{1DA1D}' => true, - '\u{1DA1E}' => true, - '\u{1DA1F}' => true, - '\u{1DA20}' => true, - '\u{1DA21}' => true, - '\u{1DA22}' => true, - '\u{1DA23}' => true, - '\u{1DA24}' => true, - '\u{1DA25}' => true, - '\u{1DA26}' => true, - '\u{1DA27}' => true, - '\u{1DA28}' => true, - '\u{1DA29}' => true, - '\u{1DA2A}' => true, - '\u{1DA2B}' => true, - '\u{1DA2C}' => true, - '\u{1DA2D}' => true, - '\u{1DA2E}' => true, - '\u{1DA2F}' => true, - '\u{1DA30}' => true, - '\u{1DA31}' => true, - '\u{1DA32}' => true, - '\u{1DA33}' => true, - '\u{1DA34}' => true, - '\u{1DA35}' => true, - '\u{1DA36}' => true, - '\u{1DA3B}' => true, - '\u{1DA3C}' => true, - '\u{1DA3D}' => true, - '\u{1DA3E}' => true, - '\u{1DA3F}' => true, - '\u{1DA40}' => true, - '\u{1DA41}' => true, - '\u{1DA42}' => true, - '\u{1DA43}' => true, - '\u{1DA44}' => true, - '\u{1DA45}' => true, - '\u{1DA46}' => true, - '\u{1DA47}' => true, - '\u{1DA48}' => true, - '\u{1DA49}' => true, - '\u{1DA4A}' => true, - '\u{1DA4B}' => true, - '\u{1DA4C}' => true, - '\u{1DA4D}' => true, - '\u{1DA4E}' => true, - '\u{1DA4F}' => true, - '\u{1DA50}' => true, - '\u{1DA51}' => true, - '\u{1DA52}' => true, - '\u{1DA53}' => true, - '\u{1DA54}' => true, - '\u{1DA55}' => true, - '\u{1DA56}' => true, - '\u{1DA57}' => true, - '\u{1DA58}' => true, - '\u{1DA59}' => true, - '\u{1DA5A}' => true, - '\u{1DA5B}' => true, - '\u{1DA5C}' => true, - '\u{1DA5D}' => true, - '\u{1DA5E}' => true, - '\u{1DA5F}' => true, - '\u{1DA60}' => true, - '\u{1DA61}' => true, - '\u{1DA62}' => true, - '\u{1DA63}' => true, - '\u{1DA64}' => true, - '\u{1DA65}' => true, - '\u{1DA66}' => true, - '\u{1DA67}' => true, - '\u{1DA68}' => true, - '\u{1DA69}' => true, - '\u{1DA6A}' => true, - '\u{1DA6B}' => true, - '\u{1DA6C}' => true, - '\u{1DA75}' => true, - '\u{1DA84}' => true, - '\u{1DA9B}' => true, - '\u{1DA9C}' => true, - '\u{1DA9D}' => true, - '\u{1DA9E}' => true, - '\u{1DA9F}' => true, - '\u{1DAA1}' => true, - '\u{1DAA2}' => true, - '\u{1DAA3}' => true, - '\u{1DAA4}' => true, - '\u{1DAA5}' => true, - '\u{1DAA6}' => true, - '\u{1DAA7}' => true, - '\u{1DAA8}' => true, - '\u{1DAA9}' => true, - '\u{1DAAA}' => true, - '\u{1DAAB}' => true, - '\u{1DAAC}' => true, - '\u{1DAAD}' => true, - '\u{1DAAE}' => true, - '\u{1DAAF}' => true, - '\u{1E000}' => true, - '\u{1E001}' => true, - '\u{1E002}' => true, - '\u{1E003}' => true, - '\u{1E004}' => true, - '\u{1E005}' => true, - '\u{1E006}' => true, - '\u{1E008}' => true, - '\u{1E009}' => true, - '\u{1E00A}' => true, - '\u{1E00B}' => true, - '\u{1E00C}' => true, - '\u{1E00D}' => true, - '\u{1E00E}' => true, - '\u{1E00F}' => true, - '\u{1E010}' => true, - '\u{1E011}' => true, - '\u{1E012}' => true, - '\u{1E013}' => true, - '\u{1E014}' => true, - '\u{1E015}' => true, - '\u{1E016}' => true, - '\u{1E017}' => true, - '\u{1E018}' => true, - '\u{1E01B}' => true, - '\u{1E01C}' => true, - '\u{1E01D}' => true, - '\u{1E01E}' => true, - '\u{1E01F}' => true, - '\u{1E020}' => true, - '\u{1E021}' => true, - '\u{1E023}' => true, - '\u{1E024}' => true, - '\u{1E026}' => true, - '\u{1E027}' => true, - '\u{1E028}' => true, - '\u{1E029}' => true, - '\u{1E02A}' => true, - '\u{1E8D0}' => true, - '\u{1E8D1}' => true, - '\u{1E8D2}' => true, - '\u{1E8D3}' => true, - '\u{1E8D4}' => true, - '\u{1E8D5}' => true, - '\u{1E8D6}' => true, - '\u{1E944}' => true, - '\u{1E945}' => true, - '\u{1E946}' => true, - '\u{1E947}' => true, - '\u{1E948}' => true, - '\u{1E949}' => true, - '\u{1E94A}' => true, - '\u{E0100}' => true, - '\u{E0101}' => true, - '\u{E0102}' => true, - '\u{E0103}' => true, - '\u{E0104}' => true, - '\u{E0105}' => true, - '\u{E0106}' => true, - '\u{E0107}' => true, - '\u{E0108}' => true, - '\u{E0109}' => true, - '\u{E010A}' => true, - '\u{E010B}' => true, - '\u{E010C}' => true, - '\u{E010D}' => true, - '\u{E010E}' => true, - '\u{E010F}' => true, - '\u{E0110}' => true, - '\u{E0111}' => true, - '\u{E0112}' => true, - '\u{E0113}' => true, - '\u{E0114}' => true, - '\u{E0115}' => true, - '\u{E0116}' => true, - '\u{E0117}' => true, - '\u{E0118}' => true, - '\u{E0119}' => true, - '\u{E011A}' => true, - '\u{E011B}' => true, - '\u{E011C}' => true, - '\u{E011D}' => true, - '\u{E011E}' => true, - '\u{E011F}' => true, - '\u{E0120}' => true, - '\u{E0121}' => true, - '\u{E0122}' => true, - '\u{E0123}' => true, - '\u{E0124}' => true, - '\u{E0125}' => true, - '\u{E0126}' => true, - '\u{E0127}' => true, - '\u{E0128}' => true, - '\u{E0129}' => true, - '\u{E012A}' => true, - '\u{E012B}' => true, - '\u{E012C}' => true, - '\u{E012D}' => true, - '\u{E012E}' => true, - '\u{E012F}' => true, - '\u{E0130}' => true, - '\u{E0131}' => true, - '\u{E0132}' => true, - '\u{E0133}' => true, - '\u{E0134}' => true, - '\u{E0135}' => true, - '\u{E0136}' => true, - '\u{E0137}' => true, - '\u{E0138}' => true, - '\u{E0139}' => true, - '\u{E013A}' => true, - '\u{E013B}' => true, - '\u{E013C}' => true, - '\u{E013D}' => true, - '\u{E013E}' => true, - '\u{E013F}' => true, - '\u{E0140}' => true, - '\u{E0141}' => true, - '\u{E0142}' => true, - '\u{E0143}' => true, - '\u{E0144}' => true, - '\u{E0145}' => true, - '\u{E0146}' => true, - '\u{E0147}' => true, - '\u{E0148}' => true, - '\u{E0149}' => true, - '\u{E014A}' => true, - '\u{E014B}' => true, - '\u{E014C}' => true, - '\u{E014D}' => true, - '\u{E014E}' => true, - '\u{E014F}' => true, - '\u{E0150}' => true, - '\u{E0151}' => true, - '\u{E0152}' => true, - '\u{E0153}' => true, - '\u{E0154}' => true, - '\u{E0155}' => true, - '\u{E0156}' => true, - '\u{E0157}' => true, - '\u{E0158}' => true, - '\u{E0159}' => true, - '\u{E015A}' => true, - '\u{E015B}' => true, - '\u{E015C}' => true, - '\u{E015D}' => true, - '\u{E015E}' => true, - '\u{E015F}' => true, - '\u{E0160}' => true, - '\u{E0161}' => true, - '\u{E0162}' => true, - '\u{E0163}' => true, - '\u{E0164}' => true, - '\u{E0165}' => true, - '\u{E0166}' => true, - '\u{E0167}' => true, - '\u{E0168}' => true, - '\u{E0169}' => true, - '\u{E016A}' => true, - '\u{E016B}' => true, - '\u{E016C}' => true, - '\u{E016D}' => true, - '\u{E016E}' => true, - '\u{E016F}' => true, - '\u{E0170}' => true, - '\u{E0171}' => true, - '\u{E0172}' => true, - '\u{E0173}' => true, - '\u{E0174}' => true, - '\u{E0175}' => true, - '\u{E0176}' => true, - '\u{E0177}' => true, - '\u{E0178}' => true, - '\u{E0179}' => true, - '\u{E017A}' => true, - '\u{E017B}' => true, - '\u{E017C}' => true, - '\u{E017D}' => true, - '\u{E017E}' => true, - '\u{E017F}' => true, - '\u{E0180}' => true, - '\u{E0181}' => true, - '\u{E0182}' => true, - '\u{E0183}' => true, - '\u{E0184}' => true, - '\u{E0185}' => true, - '\u{E0186}' => true, - '\u{E0187}' => true, - '\u{E0188}' => true, - '\u{E0189}' => true, - '\u{E018A}' => true, - '\u{E018B}' => true, - '\u{E018C}' => true, - '\u{E018D}' => true, - '\u{E018E}' => true, - '\u{E018F}' => true, - '\u{E0190}' => true, - '\u{E0191}' => true, - '\u{E0192}' => true, - '\u{E0193}' => true, - '\u{E0194}' => true, - '\u{E0195}' => true, - '\u{E0196}' => true, - '\u{E0197}' => true, - '\u{E0198}' => true, - '\u{E0199}' => true, - '\u{E019A}' => true, - '\u{E019B}' => true, - '\u{E019C}' => true, - '\u{E019D}' => true, - '\u{E019E}' => true, - '\u{E019F}' => true, - '\u{E01A0}' => true, - '\u{E01A1}' => true, - '\u{E01A2}' => true, - '\u{E01A3}' => true, - '\u{E01A4}' => true, - '\u{E01A5}' => true, - '\u{E01A6}' => true, - '\u{E01A7}' => true, - '\u{E01A8}' => true, - '\u{E01A9}' => true, - '\u{E01AA}' => true, - '\u{E01AB}' => true, - '\u{E01AC}' => true, - '\u{E01AD}' => true, - '\u{E01AE}' => true, - '\u{E01AF}' => true, - '\u{E01B0}' => true, - '\u{E01B1}' => true, - '\u{E01B2}' => true, - '\u{E01B3}' => true, - '\u{E01B4}' => true, - '\u{E01B5}' => true, - '\u{E01B6}' => true, - '\u{E01B7}' => true, - '\u{E01B8}' => true, - '\u{E01B9}' => true, - '\u{E01BA}' => true, - '\u{E01BB}' => true, - '\u{E01BC}' => true, - '\u{E01BD}' => true, - '\u{E01BE}' => true, - '\u{E01BF}' => true, - '\u{E01C0}' => true, - '\u{E01C1}' => true, - '\u{E01C2}' => true, - '\u{E01C3}' => true, - '\u{E01C4}' => true, - '\u{E01C5}' => true, - '\u{E01C6}' => true, - '\u{E01C7}' => true, - '\u{E01C8}' => true, - '\u{E01C9}' => true, - '\u{E01CA}' => true, - '\u{E01CB}' => true, - '\u{E01CC}' => true, - '\u{E01CD}' => true, - '\u{E01CE}' => true, - '\u{E01CF}' => true, - '\u{E01D0}' => true, - '\u{E01D1}' => true, - '\u{E01D2}' => true, - '\u{E01D3}' => true, - '\u{E01D4}' => true, - '\u{E01D5}' => true, - '\u{E01D6}' => true, - '\u{E01D7}' => true, - '\u{E01D8}' => true, - '\u{E01D9}' => true, - '\u{E01DA}' => true, - '\u{E01DB}' => true, - '\u{E01DC}' => true, - '\u{E01DD}' => true, - '\u{E01DE}' => true, - '\u{E01DF}' => true, - '\u{E01E0}' => true, - '\u{E01E1}' => true, - '\u{E01E2}' => true, - '\u{E01E3}' => true, - '\u{E01E4}' => true, - '\u{E01E5}' => true, - '\u{E01E6}' => true, - '\u{E01E7}' => true, - '\u{E01E8}' => true, - '\u{E01E9}' => true, - '\u{E01EA}' => true, - '\u{E01EB}' => true, - '\u{E01EC}' => true, - '\u{E01ED}' => true, - '\u{E01EE}' => true, - '\u{E01EF}' => true, - _ => false, - } -} #[inline] +#[allow(ellipsis_inclusive_range_patterns)] pub fn qc_nfc(c: char) -> IsNormalized { match c { '\u{0340}'...'\u{0341}' => No, @@ -9765,6 +19341,444 @@ pub fn qc_nfc(c: char) -> IsNormalized { } #[inline] +#[allow(ellipsis_inclusive_range_patterns)] +pub fn qc_nfkc(c: char) -> IsNormalized { + match c { + '\u{00A0}' => No, + '\u{00A8}' => No, + '\u{00AA}' => No, + '\u{00AF}' => No, + '\u{00B2}'...'\u{00B3}' => No, + '\u{00B4}' => No, + '\u{00B5}' => No, + '\u{00B8}' => No, + '\u{00B9}' => No, + '\u{00BA}' => No, + '\u{00BC}'...'\u{00BE}' => No, + '\u{0132}'...'\u{0133}' => No, + '\u{013F}'...'\u{0140}' => No, + '\u{0149}' => No, + '\u{017F}' => No, + '\u{01C4}'...'\u{01CC}' => No, + '\u{01F1}'...'\u{01F3}' => No, + '\u{02B0}'...'\u{02B8}' => No, + '\u{02D8}'...'\u{02DD}' => No, + '\u{02E0}'...'\u{02E4}' => No, + '\u{0340}'...'\u{0341}' => No, + '\u{0343}'...'\u{0344}' => No, + '\u{0374}' => No, + '\u{037A}' => No, + '\u{037E}' => No, + '\u{0384}'...'\u{0385}' => No, + '\u{0387}' => No, + '\u{03D0}'...'\u{03D6}' => No, + '\u{03F0}'...'\u{03F2}' => No, + '\u{03F4}'...'\u{03F5}' => No, + '\u{03F9}' => No, + '\u{0587}' => No, + '\u{0675}'...'\u{0678}' => No, + '\u{0958}'...'\u{095F}' => No, + '\u{09DC}'...'\u{09DD}' => No, + '\u{09DF}' => No, + '\u{0A33}' => No, + '\u{0A36}' => No, + '\u{0A59}'...'\u{0A5B}' => No, + '\u{0A5E}' => No, + '\u{0B5C}'...'\u{0B5D}' => No, + '\u{0E33}' => No, + '\u{0EB3}' => No, + '\u{0EDC}'...'\u{0EDD}' => No, + '\u{0F0C}' => No, + '\u{0F43}' => No, + '\u{0F4D}' => No, + '\u{0F52}' => No, + '\u{0F57}' => No, + '\u{0F5C}' => No, + '\u{0F69}' => No, + '\u{0F73}' => No, + '\u{0F75}'...'\u{0F79}' => No, + '\u{0F81}' => No, + '\u{0F93}' => No, + '\u{0F9D}' => No, + '\u{0FA2}' => No, + '\u{0FA7}' => No, + '\u{0FAC}' => No, + '\u{0FB9}' => No, + '\u{10FC}' => No, + '\u{1D2C}'...'\u{1D2E}' => No, + '\u{1D30}'...'\u{1D3A}' => No, + '\u{1D3C}'...'\u{1D4D}' => No, + '\u{1D4F}'...'\u{1D6A}' => No, + '\u{1D78}' => No, + '\u{1D9B}'...'\u{1DBF}' => No, + '\u{1E9A}'...'\u{1E9B}' => No, + '\u{1F71}' => No, + '\u{1F73}' => No, + '\u{1F75}' => No, + '\u{1F77}' => No, + '\u{1F79}' => No, + '\u{1F7B}' => No, + '\u{1F7D}' => No, + '\u{1FBB}' => No, + '\u{1FBD}' => No, + '\u{1FBE}' => No, + '\u{1FBF}'...'\u{1FC1}' => No, + '\u{1FC9}' => No, + '\u{1FCB}' => No, + '\u{1FCD}'...'\u{1FCF}' => No, + '\u{1FD3}' => No, + '\u{1FDB}' => No, + '\u{1FDD}'...'\u{1FDF}' => No, + '\u{1FE3}' => No, + '\u{1FEB}' => No, + '\u{1FED}'...'\u{1FEF}' => No, + '\u{1FF9}' => No, + '\u{1FFB}' => No, + '\u{1FFD}'...'\u{1FFE}' => No, + '\u{2000}'...'\u{200A}' => No, + '\u{2011}' => No, + '\u{2017}' => No, + '\u{2024}'...'\u{2026}' => No, + '\u{202F}' => No, + '\u{2033}'...'\u{2034}' => No, + '\u{2036}'...'\u{2037}' => No, + '\u{203C}' => No, + '\u{203E}' => No, + '\u{2047}'...'\u{2049}' => No, + '\u{2057}' => No, + '\u{205F}' => No, + '\u{2070}' => No, + '\u{2071}' => No, + '\u{2074}'...'\u{2079}' => No, + '\u{207A}'...'\u{207C}' => No, + '\u{207D}' => No, + '\u{207E}' => No, + '\u{207F}' => No, + '\u{2080}'...'\u{2089}' => No, + '\u{208A}'...'\u{208C}' => No, + '\u{208D}' => No, + '\u{208E}' => No, + '\u{2090}'...'\u{209C}' => No, + '\u{20A8}' => No, + '\u{2100}'...'\u{2101}' => No, + '\u{2102}' => No, + '\u{2103}' => No, + '\u{2105}'...'\u{2106}' => No, + '\u{2107}' => No, + '\u{2109}' => No, + '\u{210A}'...'\u{2113}' => No, + '\u{2115}' => No, + '\u{2116}' => No, + '\u{2119}'...'\u{211D}' => No, + '\u{2120}'...'\u{2122}' => No, + '\u{2124}' => No, + '\u{2126}' => No, + '\u{2128}' => No, + '\u{212A}'...'\u{212D}' => No, + '\u{212F}'...'\u{2131}' => No, + '\u{2133}'...'\u{2134}' => No, + '\u{2135}'...'\u{2138}' => No, + '\u{2139}' => No, + '\u{213B}' => No, + '\u{213C}'...'\u{213F}' => No, + '\u{2140}' => No, + '\u{2145}'...'\u{2149}' => No, + '\u{2150}'...'\u{215F}' => No, + '\u{2160}'...'\u{217F}' => No, + '\u{2189}' => No, + '\u{222C}'...'\u{222D}' => No, + '\u{222F}'...'\u{2230}' => No, + '\u{2329}' => No, + '\u{232A}' => No, + '\u{2460}'...'\u{249B}' => No, + '\u{249C}'...'\u{24E9}' => No, + '\u{24EA}' => No, + '\u{2A0C}' => No, + '\u{2A74}'...'\u{2A76}' => No, + '\u{2ADC}' => No, + '\u{2C7C}'...'\u{2C7D}' => No, + '\u{2D6F}' => No, + '\u{2E9F}' => No, + '\u{2EF3}' => No, + '\u{2F00}'...'\u{2FD5}' => No, + '\u{3000}' => No, + '\u{3036}' => No, + '\u{3038}'...'\u{303A}' => No, + '\u{309B}'...'\u{309C}' => No, + '\u{309F}' => No, + '\u{30FF}' => No, + '\u{3131}'...'\u{318E}' => No, + '\u{3192}'...'\u{3195}' => No, + '\u{3196}'...'\u{319F}' => No, + '\u{3200}'...'\u{321E}' => No, + '\u{3220}'...'\u{3229}' => No, + '\u{322A}'...'\u{3247}' => No, + '\u{3250}' => No, + '\u{3251}'...'\u{325F}' => No, + '\u{3260}'...'\u{327E}' => No, + '\u{3280}'...'\u{3289}' => No, + '\u{328A}'...'\u{32B0}' => No, + '\u{32B1}'...'\u{32BF}' => No, + '\u{32C0}'...'\u{32FE}' => No, + '\u{3300}'...'\u{33FF}' => No, + '\u{A69C}'...'\u{A69D}' => No, + '\u{A770}' => No, + '\u{A7F8}'...'\u{A7F9}' => No, + '\u{AB5C}'...'\u{AB5F}' => No, + '\u{F900}'...'\u{FA0D}' => No, + '\u{FA10}' => No, + '\u{FA12}' => No, + '\u{FA15}'...'\u{FA1E}' => No, + '\u{FA20}' => No, + '\u{FA22}' => No, + '\u{FA25}'...'\u{FA26}' => No, + '\u{FA2A}'...'\u{FA6D}' => No, + '\u{FA70}'...'\u{FAD9}' => No, + '\u{FB00}'...'\u{FB06}' => No, + '\u{FB13}'...'\u{FB17}' => No, + '\u{FB1D}' => No, + '\u{FB1F}'...'\u{FB28}' => No, + '\u{FB29}' => No, + '\u{FB2A}'...'\u{FB36}' => No, + '\u{FB38}'...'\u{FB3C}' => No, + '\u{FB3E}' => No, + '\u{FB40}'...'\u{FB41}' => No, + '\u{FB43}'...'\u{FB44}' => No, + '\u{FB46}'...'\u{FBB1}' => No, + '\u{FBD3}'...'\u{FD3D}' => No, + '\u{FD50}'...'\u{FD8F}' => No, + '\u{FD92}'...'\u{FDC7}' => No, + '\u{FDF0}'...'\u{FDFB}' => No, + '\u{FDFC}' => No, + '\u{FE10}'...'\u{FE16}' => No, + '\u{FE17}' => No, + '\u{FE18}' => No, + '\u{FE19}' => No, + '\u{FE30}' => No, + '\u{FE31}'...'\u{FE32}' => No, + '\u{FE33}'...'\u{FE34}' => No, + '\u{FE35}' => No, + '\u{FE36}' => No, + '\u{FE37}' => No, + '\u{FE38}' => No, + '\u{FE39}' => No, + '\u{FE3A}' => No, + '\u{FE3B}' => No, + '\u{FE3C}' => No, + '\u{FE3D}' => No, + '\u{FE3E}' => No, + '\u{FE3F}' => No, + '\u{FE40}' => No, + '\u{FE41}' => No, + '\u{FE42}' => No, + '\u{FE43}' => No, + '\u{FE44}' => No, + '\u{FE47}' => No, + '\u{FE48}' => No, + '\u{FE49}'...'\u{FE4C}' => No, + '\u{FE4D}'...'\u{FE4F}' => No, + '\u{FE50}'...'\u{FE52}' => No, + '\u{FE54}'...'\u{FE57}' => No, + '\u{FE58}' => No, + '\u{FE59}' => No, + '\u{FE5A}' => No, + '\u{FE5B}' => No, + '\u{FE5C}' => No, + '\u{FE5D}' => No, + '\u{FE5E}' => No, + '\u{FE5F}'...'\u{FE61}' => No, + '\u{FE62}' => No, + '\u{FE63}' => No, + '\u{FE64}'...'\u{FE66}' => No, + '\u{FE68}' => No, + '\u{FE69}' => No, + '\u{FE6A}'...'\u{FE6B}' => No, + '\u{FE70}'...'\u{FE72}' => No, + '\u{FE74}' => No, + '\u{FE76}'...'\u{FEFC}' => No, + '\u{FF01}'...'\u{FF03}' => No, + '\u{FF04}' => No, + '\u{FF05}'...'\u{FF07}' => No, + '\u{FF08}' => No, + '\u{FF09}' => No, + '\u{FF0A}' => No, + '\u{FF0B}' => No, + '\u{FF0C}' => No, + '\u{FF0D}' => No, + '\u{FF0E}'...'\u{FF0F}' => No, + '\u{FF10}'...'\u{FF19}' => No, + '\u{FF1A}'...'\u{FF1B}' => No, + '\u{FF1C}'...'\u{FF1E}' => No, + '\u{FF1F}'...'\u{FF20}' => No, + '\u{FF21}'...'\u{FF3A}' => No, + '\u{FF3B}' => No, + '\u{FF3C}' => No, + '\u{FF3D}' => No, + '\u{FF3E}' => No, + '\u{FF3F}' => No, + '\u{FF40}' => No, + '\u{FF41}'...'\u{FF5A}' => No, + '\u{FF5B}' => No, + '\u{FF5C}' => No, + '\u{FF5D}' => No, + '\u{FF5E}' => No, + '\u{FF5F}' => No, + '\u{FF60}' => No, + '\u{FF61}' => No, + '\u{FF62}' => No, + '\u{FF63}' => No, + '\u{FF64}'...'\u{FF65}' => No, + '\u{FF66}'...'\u{FF6F}' => No, + '\u{FF70}' => No, + '\u{FF71}'...'\u{FF9D}' => No, + '\u{FF9E}'...'\u{FF9F}' => No, + '\u{FFA0}'...'\u{FFBE}' => No, + '\u{FFC2}'...'\u{FFC7}' => No, + '\u{FFCA}'...'\u{FFCF}' => No, + '\u{FFD2}'...'\u{FFD7}' => No, + '\u{FFDA}'...'\u{FFDC}' => No, + '\u{FFE0}'...'\u{FFE1}' => No, + '\u{FFE2}' => No, + '\u{FFE3}' => No, + '\u{FFE4}' => No, + '\u{FFE5}'...'\u{FFE6}' => No, + '\u{FFE8}' => No, + '\u{FFE9}'...'\u{FFEC}' => No, + '\u{FFED}'...'\u{FFEE}' => No, + '\u{1D15E}'...'\u{1D164}' => No, + '\u{1D1BB}'...'\u{1D1C0}' => No, + '\u{1D400}'...'\u{1D454}' => No, + '\u{1D456}'...'\u{1D49C}' => No, + '\u{1D49E}'...'\u{1D49F}' => No, + '\u{1D4A2}' => No, + '\u{1D4A5}'...'\u{1D4A6}' => No, + '\u{1D4A9}'...'\u{1D4AC}' => No, + '\u{1D4AE}'...'\u{1D4B9}' => No, + '\u{1D4BB}' => No, + '\u{1D4BD}'...'\u{1D4C3}' => No, + '\u{1D4C5}'...'\u{1D505}' => No, + '\u{1D507}'...'\u{1D50A}' => No, + '\u{1D50D}'...'\u{1D514}' => No, + '\u{1D516}'...'\u{1D51C}' => No, + '\u{1D51E}'...'\u{1D539}' => No, + '\u{1D53B}'...'\u{1D53E}' => No, + '\u{1D540}'...'\u{1D544}' => No, + '\u{1D546}' => No, + '\u{1D54A}'...'\u{1D550}' => No, + '\u{1D552}'...'\u{1D6A5}' => No, + '\u{1D6A8}'...'\u{1D6C0}' => No, + '\u{1D6C1}' => No, + '\u{1D6C2}'...'\u{1D6DA}' => No, + '\u{1D6DB}' => No, + '\u{1D6DC}'...'\u{1D6FA}' => No, + '\u{1D6FB}' => No, + '\u{1D6FC}'...'\u{1D714}' => No, + '\u{1D715}' => No, + '\u{1D716}'...'\u{1D734}' => No, + '\u{1D735}' => No, + '\u{1D736}'...'\u{1D74E}' => No, + '\u{1D74F}' => No, + '\u{1D750}'...'\u{1D76E}' => No, + '\u{1D76F}' => No, + '\u{1D770}'...'\u{1D788}' => No, + '\u{1D789}' => No, + '\u{1D78A}'...'\u{1D7A8}' => No, + '\u{1D7A9}' => No, + '\u{1D7AA}'...'\u{1D7C2}' => No, + '\u{1D7C3}' => No, + '\u{1D7C4}'...'\u{1D7CB}' => No, + '\u{1D7CE}'...'\u{1D7FF}' => No, + '\u{1EE00}'...'\u{1EE03}' => No, + '\u{1EE05}'...'\u{1EE1F}' => No, + '\u{1EE21}'...'\u{1EE22}' => No, + '\u{1EE24}' => No, + '\u{1EE27}' => No, + '\u{1EE29}'...'\u{1EE32}' => No, + '\u{1EE34}'...'\u{1EE37}' => No, + '\u{1EE39}' => No, + '\u{1EE3B}' => No, + '\u{1EE42}' => No, + '\u{1EE47}' => No, + '\u{1EE49}' => No, + '\u{1EE4B}' => No, + '\u{1EE4D}'...'\u{1EE4F}' => No, + '\u{1EE51}'...'\u{1EE52}' => No, + '\u{1EE54}' => No, + '\u{1EE57}' => No, + '\u{1EE59}' => No, + '\u{1EE5B}' => No, + '\u{1EE5D}' => No, + '\u{1EE5F}' => No, + '\u{1EE61}'...'\u{1EE62}' => No, + '\u{1EE64}' => No, + '\u{1EE67}'...'\u{1EE6A}' => No, + '\u{1EE6C}'...'\u{1EE72}' => No, + '\u{1EE74}'...'\u{1EE77}' => No, + '\u{1EE79}'...'\u{1EE7C}' => No, + '\u{1EE7E}' => No, + '\u{1EE80}'...'\u{1EE89}' => No, + '\u{1EE8B}'...'\u{1EE9B}' => No, + '\u{1EEA1}'...'\u{1EEA3}' => No, + '\u{1EEA5}'...'\u{1EEA9}' => No, + '\u{1EEAB}'...'\u{1EEBB}' => No, + '\u{1F100}'...'\u{1F10A}' => No, + '\u{1F110}'...'\u{1F12E}' => No, + '\u{1F130}'...'\u{1F14F}' => No, + '\u{1F16A}'...'\u{1F16B}' => No, + '\u{1F190}' => No, + '\u{1F200}'...'\u{1F202}' => No, + '\u{1F210}'...'\u{1F23B}' => No, + '\u{1F240}'...'\u{1F248}' => No, + '\u{1F250}'...'\u{1F251}' => No, + '\u{2F800}'...'\u{2FA1D}' => No, + '\u{0300}'...'\u{0304}' => Maybe, + '\u{0306}'...'\u{030C}' => Maybe, + '\u{030F}' => Maybe, + '\u{0311}' => Maybe, + '\u{0313}'...'\u{0314}' => Maybe, + '\u{031B}' => Maybe, + '\u{0323}'...'\u{0328}' => Maybe, + '\u{032D}'...'\u{032E}' => Maybe, + '\u{0330}'...'\u{0331}' => Maybe, + '\u{0338}' => Maybe, + '\u{0342}' => Maybe, + '\u{0345}' => Maybe, + '\u{0653}'...'\u{0655}' => Maybe, + '\u{093C}' => Maybe, + '\u{09BE}' => Maybe, + '\u{09D7}' => Maybe, + '\u{0B3E}' => Maybe, + '\u{0B56}' => Maybe, + '\u{0B57}' => Maybe, + '\u{0BBE}' => Maybe, + '\u{0BD7}' => Maybe, + '\u{0C56}' => Maybe, + '\u{0CC2}' => Maybe, + '\u{0CD5}'...'\u{0CD6}' => Maybe, + '\u{0D3E}' => Maybe, + '\u{0D57}' => Maybe, + '\u{0DCA}' => Maybe, + '\u{0DCF}' => Maybe, + '\u{0DDF}' => Maybe, + '\u{102E}' => Maybe, + '\u{1161}'...'\u{1175}' => Maybe, + '\u{11A8}'...'\u{11C2}' => Maybe, + '\u{1B35}' => Maybe, + '\u{3099}'...'\u{309A}' => Maybe, + '\u{110BA}' => Maybe, + '\u{11127}' => Maybe, + '\u{1133E}' => Maybe, + '\u{11357}' => Maybe, + '\u{114B0}' => Maybe, + '\u{114BA}' => Maybe, + '\u{114BD}' => Maybe, + '\u{115AF}' => Maybe, + _ => Yes, + } +} + +#[inline] +#[allow(ellipsis_inclusive_range_patterns)] pub fn qc_nfd(c: char) -> IsNormalized { match c { '\u{00C0}'...'\u{00C5}' => No, @@ -10014,1115 +20028,2753 @@ pub fn qc_nfd(c: char) -> IsNormalized { } #[inline] -pub fn stream_safe_leading_nonstarters(c: char) -> usize { +#[allow(ellipsis_inclusive_range_patterns)] +pub fn qc_nfkd(c: char) -> IsNormalized { match c { - '\u{0340}' => 1, - '\u{0341}' => 1, - '\u{0343}' => 1, - '\u{0344}' => 2, - '\u{0F81}' => 2, - '\u{0F73}' => 2, - '\u{0F75}' => 2, - '\u{FF9E}' => 1, - '\u{FF9F}' => 1, - _ => 0, + '\u{00A0}' => No, + '\u{00A8}' => No, + '\u{00AA}' => No, + '\u{00AF}' => No, + '\u{00B2}'...'\u{00B3}' => No, + '\u{00B4}' => No, + '\u{00B5}' => No, + '\u{00B8}' => No, + '\u{00B9}' => No, + '\u{00BA}' => No, + '\u{00BC}'...'\u{00BE}' => No, + '\u{00C0}'...'\u{00C5}' => No, + '\u{00C7}'...'\u{00CF}' => No, + '\u{00D1}'...'\u{00D6}' => No, + '\u{00D9}'...'\u{00DD}' => No, + '\u{00E0}'...'\u{00E5}' => No, + '\u{00E7}'...'\u{00EF}' => No, + '\u{00F1}'...'\u{00F6}' => No, + '\u{00F9}'...'\u{00FD}' => No, + '\u{00FF}'...'\u{010F}' => No, + '\u{0112}'...'\u{0125}' => No, + '\u{0128}'...'\u{0130}' => No, + '\u{0132}'...'\u{0137}' => No, + '\u{0139}'...'\u{0140}' => No, + '\u{0143}'...'\u{0149}' => No, + '\u{014C}'...'\u{0151}' => No, + '\u{0154}'...'\u{0165}' => No, + '\u{0168}'...'\u{017F}' => No, + '\u{01A0}'...'\u{01A1}' => No, + '\u{01AF}'...'\u{01B0}' => No, + '\u{01C4}'...'\u{01DC}' => No, + '\u{01DE}'...'\u{01E3}' => No, + '\u{01E6}'...'\u{01F5}' => No, + '\u{01F8}'...'\u{021B}' => No, + '\u{021E}'...'\u{021F}' => No, + '\u{0226}'...'\u{0233}' => No, + '\u{02B0}'...'\u{02B8}' => No, + '\u{02D8}'...'\u{02DD}' => No, + '\u{02E0}'...'\u{02E4}' => No, + '\u{0340}'...'\u{0341}' => No, + '\u{0343}'...'\u{0344}' => No, + '\u{0374}' => No, + '\u{037A}' => No, + '\u{037E}' => No, + '\u{0384}'...'\u{0385}' => No, + '\u{0386}' => No, + '\u{0387}' => No, + '\u{0388}'...'\u{038A}' => No, + '\u{038C}' => No, + '\u{038E}'...'\u{0390}' => No, + '\u{03AA}'...'\u{03B0}' => No, + '\u{03CA}'...'\u{03CE}' => No, + '\u{03D0}'...'\u{03D6}' => No, + '\u{03F0}'...'\u{03F2}' => No, + '\u{03F4}'...'\u{03F5}' => No, + '\u{03F9}' => No, + '\u{0400}'...'\u{0401}' => No, + '\u{0403}' => No, + '\u{0407}' => No, + '\u{040C}'...'\u{040E}' => No, + '\u{0419}' => No, + '\u{0439}' => No, + '\u{0450}'...'\u{0451}' => No, + '\u{0453}' => No, + '\u{0457}' => No, + '\u{045C}'...'\u{045E}' => No, + '\u{0476}'...'\u{0477}' => No, + '\u{04C1}'...'\u{04C2}' => No, + '\u{04D0}'...'\u{04D3}' => No, + '\u{04D6}'...'\u{04D7}' => No, + '\u{04DA}'...'\u{04DF}' => No, + '\u{04E2}'...'\u{04E7}' => No, + '\u{04EA}'...'\u{04F5}' => No, + '\u{04F8}'...'\u{04F9}' => No, + '\u{0587}' => No, + '\u{0622}'...'\u{0626}' => No, + '\u{0675}'...'\u{0678}' => No, + '\u{06C0}' => No, + '\u{06C2}' => No, + '\u{06D3}' => No, + '\u{0929}' => No, + '\u{0931}' => No, + '\u{0934}' => No, + '\u{0958}'...'\u{095F}' => No, + '\u{09CB}'...'\u{09CC}' => No, + '\u{09DC}'...'\u{09DD}' => No, + '\u{09DF}' => No, + '\u{0A33}' => No, + '\u{0A36}' => No, + '\u{0A59}'...'\u{0A5B}' => No, + '\u{0A5E}' => No, + '\u{0B48}' => No, + '\u{0B4B}'...'\u{0B4C}' => No, + '\u{0B5C}'...'\u{0B5D}' => No, + '\u{0B94}' => No, + '\u{0BCA}'...'\u{0BCC}' => No, + '\u{0C48}' => No, + '\u{0CC0}' => No, + '\u{0CC7}'...'\u{0CC8}' => No, + '\u{0CCA}'...'\u{0CCB}' => No, + '\u{0D4A}'...'\u{0D4C}' => No, + '\u{0DDA}' => No, + '\u{0DDC}'...'\u{0DDE}' => No, + '\u{0E33}' => No, + '\u{0EB3}' => No, + '\u{0EDC}'...'\u{0EDD}' => No, + '\u{0F0C}' => No, + '\u{0F43}' => No, + '\u{0F4D}' => No, + '\u{0F52}' => No, + '\u{0F57}' => No, + '\u{0F5C}' => No, + '\u{0F69}' => No, + '\u{0F73}' => No, + '\u{0F75}'...'\u{0F79}' => No, + '\u{0F81}' => No, + '\u{0F93}' => No, + '\u{0F9D}' => No, + '\u{0FA2}' => No, + '\u{0FA7}' => No, + '\u{0FAC}' => No, + '\u{0FB9}' => No, + '\u{1026}' => No, + '\u{10FC}' => No, + '\u{1B06}' => No, + '\u{1B08}' => No, + '\u{1B0A}' => No, + '\u{1B0C}' => No, + '\u{1B0E}' => No, + '\u{1B12}' => No, + '\u{1B3B}' => No, + '\u{1B3D}' => No, + '\u{1B40}'...'\u{1B41}' => No, + '\u{1B43}' => No, + '\u{1D2C}'...'\u{1D2E}' => No, + '\u{1D30}'...'\u{1D3A}' => No, + '\u{1D3C}'...'\u{1D4D}' => No, + '\u{1D4F}'...'\u{1D6A}' => No, + '\u{1D78}' => No, + '\u{1D9B}'...'\u{1DBF}' => No, + '\u{1E00}'...'\u{1E9B}' => No, + '\u{1EA0}'...'\u{1EF9}' => No, + '\u{1F00}'...'\u{1F15}' => No, + '\u{1F18}'...'\u{1F1D}' => No, + '\u{1F20}'...'\u{1F45}' => No, + '\u{1F48}'...'\u{1F4D}' => No, + '\u{1F50}'...'\u{1F57}' => No, + '\u{1F59}' => No, + '\u{1F5B}' => No, + '\u{1F5D}' => No, + '\u{1F5F}'...'\u{1F7D}' => No, + '\u{1F80}'...'\u{1FB4}' => No, + '\u{1FB6}'...'\u{1FBC}' => No, + '\u{1FBD}' => No, + '\u{1FBE}' => No, + '\u{1FBF}'...'\u{1FC1}' => No, + '\u{1FC2}'...'\u{1FC4}' => No, + '\u{1FC6}'...'\u{1FCC}' => No, + '\u{1FCD}'...'\u{1FCF}' => No, + '\u{1FD0}'...'\u{1FD3}' => No, + '\u{1FD6}'...'\u{1FDB}' => No, + '\u{1FDD}'...'\u{1FDF}' => No, + '\u{1FE0}'...'\u{1FEC}' => No, + '\u{1FED}'...'\u{1FEF}' => No, + '\u{1FF2}'...'\u{1FF4}' => No, + '\u{1FF6}'...'\u{1FFC}' => No, + '\u{1FFD}'...'\u{1FFE}' => No, + '\u{2000}'...'\u{200A}' => No, + '\u{2011}' => No, + '\u{2017}' => No, + '\u{2024}'...'\u{2026}' => No, + '\u{202F}' => No, + '\u{2033}'...'\u{2034}' => No, + '\u{2036}'...'\u{2037}' => No, + '\u{203C}' => No, + '\u{203E}' => No, + '\u{2047}'...'\u{2049}' => No, + '\u{2057}' => No, + '\u{205F}' => No, + '\u{2070}' => No, + '\u{2071}' => No, + '\u{2074}'...'\u{2079}' => No, + '\u{207A}'...'\u{207C}' => No, + '\u{207D}' => No, + '\u{207E}' => No, + '\u{207F}' => No, + '\u{2080}'...'\u{2089}' => No, + '\u{208A}'...'\u{208C}' => No, + '\u{208D}' => No, + '\u{208E}' => No, + '\u{2090}'...'\u{209C}' => No, + '\u{20A8}' => No, + '\u{2100}'...'\u{2101}' => No, + '\u{2102}' => No, + '\u{2103}' => No, + '\u{2105}'...'\u{2106}' => No, + '\u{2107}' => No, + '\u{2109}' => No, + '\u{210A}'...'\u{2113}' => No, + '\u{2115}' => No, + '\u{2116}' => No, + '\u{2119}'...'\u{211D}' => No, + '\u{2120}'...'\u{2122}' => No, + '\u{2124}' => No, + '\u{2126}' => No, + '\u{2128}' => No, + '\u{212A}'...'\u{212D}' => No, + '\u{212F}'...'\u{2131}' => No, + '\u{2133}'...'\u{2134}' => No, + '\u{2135}'...'\u{2138}' => No, + '\u{2139}' => No, + '\u{213B}' => No, + '\u{213C}'...'\u{213F}' => No, + '\u{2140}' => No, + '\u{2145}'...'\u{2149}' => No, + '\u{2150}'...'\u{215F}' => No, + '\u{2160}'...'\u{217F}' => No, + '\u{2189}' => No, + '\u{219A}'...'\u{219B}' => No, + '\u{21AE}' => No, + '\u{21CD}' => No, + '\u{21CE}'...'\u{21CF}' => No, + '\u{2204}' => No, + '\u{2209}' => No, + '\u{220C}' => No, + '\u{2224}' => No, + '\u{2226}' => No, + '\u{222C}'...'\u{222D}' => No, + '\u{222F}'...'\u{2230}' => No, + '\u{2241}' => No, + '\u{2244}' => No, + '\u{2247}' => No, + '\u{2249}' => No, + '\u{2260}' => No, + '\u{2262}' => No, + '\u{226D}'...'\u{2271}' => No, + '\u{2274}'...'\u{2275}' => No, + '\u{2278}'...'\u{2279}' => No, + '\u{2280}'...'\u{2281}' => No, + '\u{2284}'...'\u{2285}' => No, + '\u{2288}'...'\u{2289}' => No, + '\u{22AC}'...'\u{22AF}' => No, + '\u{22E0}'...'\u{22E3}' => No, + '\u{22EA}'...'\u{22ED}' => No, + '\u{2329}' => No, + '\u{232A}' => No, + '\u{2460}'...'\u{249B}' => No, + '\u{249C}'...'\u{24E9}' => No, + '\u{24EA}' => No, + '\u{2A0C}' => No, + '\u{2A74}'...'\u{2A76}' => No, + '\u{2ADC}' => No, + '\u{2C7C}'...'\u{2C7D}' => No, + '\u{2D6F}' => No, + '\u{2E9F}' => No, + '\u{2EF3}' => No, + '\u{2F00}'...'\u{2FD5}' => No, + '\u{3000}' => No, + '\u{3036}' => No, + '\u{3038}'...'\u{303A}' => No, + '\u{304C}' => No, + '\u{304E}' => No, + '\u{3050}' => No, + '\u{3052}' => No, + '\u{3054}' => No, + '\u{3056}' => No, + '\u{3058}' => No, + '\u{305A}' => No, + '\u{305C}' => No, + '\u{305E}' => No, + '\u{3060}' => No, + '\u{3062}' => No, + '\u{3065}' => No, + '\u{3067}' => No, + '\u{3069}' => No, + '\u{3070}'...'\u{3071}' => No, + '\u{3073}'...'\u{3074}' => No, + '\u{3076}'...'\u{3077}' => No, + '\u{3079}'...'\u{307A}' => No, + '\u{307C}'...'\u{307D}' => No, + '\u{3094}' => No, + '\u{309B}'...'\u{309C}' => No, + '\u{309E}' => No, + '\u{309F}' => No, + '\u{30AC}' => No, + '\u{30AE}' => No, + '\u{30B0}' => No, + '\u{30B2}' => No, + '\u{30B4}' => No, + '\u{30B6}' => No, + '\u{30B8}' => No, + '\u{30BA}' => No, + '\u{30BC}' => No, + '\u{30BE}' => No, + '\u{30C0}' => No, + '\u{30C2}' => No, + '\u{30C5}' => No, + '\u{30C7}' => No, + '\u{30C9}' => No, + '\u{30D0}'...'\u{30D1}' => No, + '\u{30D3}'...'\u{30D4}' => No, + '\u{30D6}'...'\u{30D7}' => No, + '\u{30D9}'...'\u{30DA}' => No, + '\u{30DC}'...'\u{30DD}' => No, + '\u{30F4}' => No, + '\u{30F7}'...'\u{30FA}' => No, + '\u{30FE}' => No, + '\u{30FF}' => No, + '\u{3131}'...'\u{318E}' => No, + '\u{3192}'...'\u{3195}' => No, + '\u{3196}'...'\u{319F}' => No, + '\u{3200}'...'\u{321E}' => No, + '\u{3220}'...'\u{3229}' => No, + '\u{322A}'...'\u{3247}' => No, + '\u{3250}' => No, + '\u{3251}'...'\u{325F}' => No, + '\u{3260}'...'\u{327E}' => No, + '\u{3280}'...'\u{3289}' => No, + '\u{328A}'...'\u{32B0}' => No, + '\u{32B1}'...'\u{32BF}' => No, + '\u{32C0}'...'\u{32FE}' => No, + '\u{3300}'...'\u{33FF}' => No, + '\u{A69C}'...'\u{A69D}' => No, + '\u{A770}' => No, + '\u{A7F8}'...'\u{A7F9}' => No, + '\u{AB5C}'...'\u{AB5F}' => No, + '\u{AC00}'...'\u{D7A3}' => No, + '\u{F900}'...'\u{FA0D}' => No, + '\u{FA10}' => No, + '\u{FA12}' => No, + '\u{FA15}'...'\u{FA1E}' => No, + '\u{FA20}' => No, + '\u{FA22}' => No, + '\u{FA25}'...'\u{FA26}' => No, + '\u{FA2A}'...'\u{FA6D}' => No, + '\u{FA70}'...'\u{FAD9}' => No, + '\u{FB00}'...'\u{FB06}' => No, + '\u{FB13}'...'\u{FB17}' => No, + '\u{FB1D}' => No, + '\u{FB1F}'...'\u{FB28}' => No, + '\u{FB29}' => No, + '\u{FB2A}'...'\u{FB36}' => No, + '\u{FB38}'...'\u{FB3C}' => No, + '\u{FB3E}' => No, + '\u{FB40}'...'\u{FB41}' => No, + '\u{FB43}'...'\u{FB44}' => No, + '\u{FB46}'...'\u{FBB1}' => No, + '\u{FBD3}'...'\u{FD3D}' => No, + '\u{FD50}'...'\u{FD8F}' => No, + '\u{FD92}'...'\u{FDC7}' => No, + '\u{FDF0}'...'\u{FDFB}' => No, + '\u{FDFC}' => No, + '\u{FE10}'...'\u{FE16}' => No, + '\u{FE17}' => No, + '\u{FE18}' => No, + '\u{FE19}' => No, + '\u{FE30}' => No, + '\u{FE31}'...'\u{FE32}' => No, + '\u{FE33}'...'\u{FE34}' => No, + '\u{FE35}' => No, + '\u{FE36}' => No, + '\u{FE37}' => No, + '\u{FE38}' => No, + '\u{FE39}' => No, + '\u{FE3A}' => No, + '\u{FE3B}' => No, + '\u{FE3C}' => No, + '\u{FE3D}' => No, + '\u{FE3E}' => No, + '\u{FE3F}' => No, + '\u{FE40}' => No, + '\u{FE41}' => No, + '\u{FE42}' => No, + '\u{FE43}' => No, + '\u{FE44}' => No, + '\u{FE47}' => No, + '\u{FE48}' => No, + '\u{FE49}'...'\u{FE4C}' => No, + '\u{FE4D}'...'\u{FE4F}' => No, + '\u{FE50}'...'\u{FE52}' => No, + '\u{FE54}'...'\u{FE57}' => No, + '\u{FE58}' => No, + '\u{FE59}' => No, + '\u{FE5A}' => No, + '\u{FE5B}' => No, + '\u{FE5C}' => No, + '\u{FE5D}' => No, + '\u{FE5E}' => No, + '\u{FE5F}'...'\u{FE61}' => No, + '\u{FE62}' => No, + '\u{FE63}' => No, + '\u{FE64}'...'\u{FE66}' => No, + '\u{FE68}' => No, + '\u{FE69}' => No, + '\u{FE6A}'...'\u{FE6B}' => No, + '\u{FE70}'...'\u{FE72}' => No, + '\u{FE74}' => No, + '\u{FE76}'...'\u{FEFC}' => No, + '\u{FF01}'...'\u{FF03}' => No, + '\u{FF04}' => No, + '\u{FF05}'...'\u{FF07}' => No, + '\u{FF08}' => No, + '\u{FF09}' => No, + '\u{FF0A}' => No, + '\u{FF0B}' => No, + '\u{FF0C}' => No, + '\u{FF0D}' => No, + '\u{FF0E}'...'\u{FF0F}' => No, + '\u{FF10}'...'\u{FF19}' => No, + '\u{FF1A}'...'\u{FF1B}' => No, + '\u{FF1C}'...'\u{FF1E}' => No, + '\u{FF1F}'...'\u{FF20}' => No, + '\u{FF21}'...'\u{FF3A}' => No, + '\u{FF3B}' => No, + '\u{FF3C}' => No, + '\u{FF3D}' => No, + '\u{FF3E}' => No, + '\u{FF3F}' => No, + '\u{FF40}' => No, + '\u{FF41}'...'\u{FF5A}' => No, + '\u{FF5B}' => No, + '\u{FF5C}' => No, + '\u{FF5D}' => No, + '\u{FF5E}' => No, + '\u{FF5F}' => No, + '\u{FF60}' => No, + '\u{FF61}' => No, + '\u{FF62}' => No, + '\u{FF63}' => No, + '\u{FF64}'...'\u{FF65}' => No, + '\u{FF66}'...'\u{FF6F}' => No, + '\u{FF70}' => No, + '\u{FF71}'...'\u{FF9D}' => No, + '\u{FF9E}'...'\u{FF9F}' => No, + '\u{FFA0}'...'\u{FFBE}' => No, + '\u{FFC2}'...'\u{FFC7}' => No, + '\u{FFCA}'...'\u{FFCF}' => No, + '\u{FFD2}'...'\u{FFD7}' => No, + '\u{FFDA}'...'\u{FFDC}' => No, + '\u{FFE0}'...'\u{FFE1}' => No, + '\u{FFE2}' => No, + '\u{FFE3}' => No, + '\u{FFE4}' => No, + '\u{FFE5}'...'\u{FFE6}' => No, + '\u{FFE8}' => No, + '\u{FFE9}'...'\u{FFEC}' => No, + '\u{FFED}'...'\u{FFEE}' => No, + '\u{1109A}' => No, + '\u{1109C}' => No, + '\u{110AB}' => No, + '\u{1112E}'...'\u{1112F}' => No, + '\u{1134B}'...'\u{1134C}' => No, + '\u{114BB}'...'\u{114BC}' => No, + '\u{114BE}' => No, + '\u{115BA}'...'\u{115BB}' => No, + '\u{1D15E}'...'\u{1D164}' => No, + '\u{1D1BB}'...'\u{1D1C0}' => No, + '\u{1D400}'...'\u{1D454}' => No, + '\u{1D456}'...'\u{1D49C}' => No, + '\u{1D49E}'...'\u{1D49F}' => No, + '\u{1D4A2}' => No, + '\u{1D4A5}'...'\u{1D4A6}' => No, + '\u{1D4A9}'...'\u{1D4AC}' => No, + '\u{1D4AE}'...'\u{1D4B9}' => No, + '\u{1D4BB}' => No, + '\u{1D4BD}'...'\u{1D4C3}' => No, + '\u{1D4C5}'...'\u{1D505}' => No, + '\u{1D507}'...'\u{1D50A}' => No, + '\u{1D50D}'...'\u{1D514}' => No, + '\u{1D516}'...'\u{1D51C}' => No, + '\u{1D51E}'...'\u{1D539}' => No, + '\u{1D53B}'...'\u{1D53E}' => No, + '\u{1D540}'...'\u{1D544}' => No, + '\u{1D546}' => No, + '\u{1D54A}'...'\u{1D550}' => No, + '\u{1D552}'...'\u{1D6A5}' => No, + '\u{1D6A8}'...'\u{1D6C0}' => No, + '\u{1D6C1}' => No, + '\u{1D6C2}'...'\u{1D6DA}' => No, + '\u{1D6DB}' => No, + '\u{1D6DC}'...'\u{1D6FA}' => No, + '\u{1D6FB}' => No, + '\u{1D6FC}'...'\u{1D714}' => No, + '\u{1D715}' => No, + '\u{1D716}'...'\u{1D734}' => No, + '\u{1D735}' => No, + '\u{1D736}'...'\u{1D74E}' => No, + '\u{1D74F}' => No, + '\u{1D750}'...'\u{1D76E}' => No, + '\u{1D76F}' => No, + '\u{1D770}'...'\u{1D788}' => No, + '\u{1D789}' => No, + '\u{1D78A}'...'\u{1D7A8}' => No, + '\u{1D7A9}' => No, + '\u{1D7AA}'...'\u{1D7C2}' => No, + '\u{1D7C3}' => No, + '\u{1D7C4}'...'\u{1D7CB}' => No, + '\u{1D7CE}'...'\u{1D7FF}' => No, + '\u{1EE00}'...'\u{1EE03}' => No, + '\u{1EE05}'...'\u{1EE1F}' => No, + '\u{1EE21}'...'\u{1EE22}' => No, + '\u{1EE24}' => No, + '\u{1EE27}' => No, + '\u{1EE29}'...'\u{1EE32}' => No, + '\u{1EE34}'...'\u{1EE37}' => No, + '\u{1EE39}' => No, + '\u{1EE3B}' => No, + '\u{1EE42}' => No, + '\u{1EE47}' => No, + '\u{1EE49}' => No, + '\u{1EE4B}' => No, + '\u{1EE4D}'...'\u{1EE4F}' => No, + '\u{1EE51}'...'\u{1EE52}' => No, + '\u{1EE54}' => No, + '\u{1EE57}' => No, + '\u{1EE59}' => No, + '\u{1EE5B}' => No, + '\u{1EE5D}' => No, + '\u{1EE5F}' => No, + '\u{1EE61}'...'\u{1EE62}' => No, + '\u{1EE64}' => No, + '\u{1EE67}'...'\u{1EE6A}' => No, + '\u{1EE6C}'...'\u{1EE72}' => No, + '\u{1EE74}'...'\u{1EE77}' => No, + '\u{1EE79}'...'\u{1EE7C}' => No, + '\u{1EE7E}' => No, + '\u{1EE80}'...'\u{1EE89}' => No, + '\u{1EE8B}'...'\u{1EE9B}' => No, + '\u{1EEA1}'...'\u{1EEA3}' => No, + '\u{1EEA5}'...'\u{1EEA9}' => No, + '\u{1EEAB}'...'\u{1EEBB}' => No, + '\u{1F100}'...'\u{1F10A}' => No, + '\u{1F110}'...'\u{1F12E}' => No, + '\u{1F130}'...'\u{1F14F}' => No, + '\u{1F16A}'...'\u{1F16B}' => No, + '\u{1F190}' => No, + '\u{1F200}'...'\u{1F202}' => No, + '\u{1F210}'...'\u{1F23B}' => No, + '\u{1F240}'...'\u{1F248}' => No, + '\u{1F250}'...'\u{1F251}' => No, + '\u{2F800}'...'\u{2FA1D}' => No, + _ => Yes, } } #[inline] -pub fn stream_safe_trailing_nonstarters(c: char) -> usize { +pub fn stream_safe_leading_nonstarters(c: char) -> usize { match c { - '\u{0958}' => 1, - '\u{0959}' => 1, - '\u{095A}' => 1, - '\u{095B}' => 1, - '\u{095C}' => 1, - '\u{FE87}' => 1, - '\u{095D}' => 1, - '\u{095E}' => 1, - '\u{095F}' => 1, - '\u{203E}' => 1, - '\u{1D160}' => 2, - '\u{1D161}' => 2, - '\u{FEF9}' => 1, - '\u{304C}' => 1, - '\u{1D162}' => 2, - '\u{304E}' => 1, - '\u{3050}' => 1, - '\u{3052}' => 1, - '\u{1D163}' => 2, - '\u{3054}' => 1, - '\u{3056}' => 1, - '\u{3058}' => 1, - '\u{1D164}' => 2, - '\u{305A}' => 1, - '\u{305C}' => 1, - '\u{305E}' => 1, - '\u{3060}' => 1, - '\u{3062}' => 1, - '\u{3065}' => 1, - '\u{3067}' => 1, - '\u{3069}' => 1, - '\u{3070}' => 1, - '\u{3071}' => 1, - '\u{3073}' => 1, - '\u{3074}' => 1, - '\u{3076}' => 1, - '\u{3077}' => 1, - '\u{3079}' => 1, - '\u{307A}' => 1, - '\u{307C}' => 1, - '\u{307D}' => 1, - '\u{1EC0}' => 2, - '\u{2017}' => 1, - '\u{1EC2}' => 2, - '\u{3094}' => 1, - '\u{FEF7}' => 1, - '\u{1109A}' => 1, - '\u{309B}' => 1, - '\u{1109C}' => 1, - '\u{309E}' => 1, - '\u{FB32}' => 1, - '\u{00A8}' => 1, - '\u{110AB}' => 1, - '\u{30AC}' => 1, - '\u{FE71}' => 1, - '\u{30AE}' => 1, - '\u{00AF}' => 1, - '\u{30B0}' => 1, - '\u{30B2}' => 1, - '\u{FEF5}' => 1, - '\u{00B4}' => 1, - '\u{30B6}' => 1, - '\u{00B8}' => 1, - '\u{30BA}' => 1, - '\u{30BC}' => 1, - '\u{30BE}' => 1, - '\u{00C0}' => 1, - '\u{00C1}' => 1, - '\u{00C2}' => 1, - '\u{00C3}' => 1, - '\u{00C4}' => 1, - '\u{00C5}' => 1, - '\u{00C7}' => 1, - '\u{00C8}' => 1, - '\u{00C9}' => 1, - '\u{00CA}' => 1, - '\u{00CB}' => 1, - '\u{00CC}' => 1, - '\u{00CD}' => 1, - '\u{00CE}' => 1, - '\u{00CF}' => 1, - '\u{30D0}' => 1, - '\u{00D1}' => 1, - '\u{00D2}' => 1, - '\u{00D3}' => 1, - '\u{00D4}' => 1, - '\u{00D5}' => 1, - '\u{00D6}' => 1, - '\u{30D7}' => 1, - '\u{00D9}' => 1, - '\u{00DA}' => 1, - '\u{00DB}' => 1, - '\u{00DC}' => 1, - '\u{00DD}' => 1, - '\u{00E0}' => 1, - '\u{00E1}' => 1, - '\u{00E2}' => 1, - '\u{00E3}' => 1, - '\u{00E4}' => 1, - '\u{00E5}' => 1, - '\u{00E7}' => 1, - '\u{00E8}' => 1, - '\u{00E9}' => 1, - '\u{00EA}' => 1, - '\u{00EB}' => 1, - '\u{00EC}' => 1, - '\u{00ED}' => 1, - '\u{00EE}' => 1, - '\u{00EF}' => 1, - '\u{00F1}' => 1, - '\u{00F2}' => 1, - '\u{00F3}' => 1, - '\u{00F4}' => 1, - '\u{00F5}' => 1, - '\u{00F6}' => 1, - '\u{30F7}' => 1, - '\u{30F8}' => 1, - '\u{00F9}' => 1, - '\u{00FA}' => 1, - '\u{00FB}' => 1, - '\u{00FC}' => 1, - '\u{00FD}' => 1, - '\u{30FE}' => 1, - '\u{00FF}' => 1, - '\u{0100}' => 1, - '\u{0101}' => 1, - '\u{0102}' => 1, - '\u{0103}' => 1, - '\u{0104}' => 1, - '\u{0105}' => 1, - '\u{0106}' => 1, - '\u{0107}' => 1, - '\u{0108}' => 1, - '\u{0109}' => 1, - '\u{010A}' => 1, - '\u{010B}' => 1, - '\u{010C}' => 1, - '\u{010D}' => 1, - '\u{010E}' => 1, - '\u{010F}' => 1, - '\u{1E23}' => 1, - '\u{0112}' => 1, - '\u{0113}' => 1, - '\u{0114}' => 1, - '\u{0115}' => 1, - '\u{0116}' => 1, - '\u{0117}' => 1, - '\u{0118}' => 1, - '\u{0119}' => 1, - '\u{011A}' => 1, - '\u{011B}' => 1, - '\u{011C}' => 1, - '\u{011D}' => 1, - '\u{011E}' => 1, - '\u{011F}' => 1, - '\u{0120}' => 1, - '\u{0121}' => 1, - '\u{0122}' => 1, - '\u{0123}' => 1, - '\u{0124}' => 1, - '\u{0125}' => 1, - '\u{0128}' => 1, - '\u{0129}' => 1, - '\u{012A}' => 1, - '\u{012B}' => 1, - '\u{012C}' => 1, - '\u{012D}' => 1, - '\u{012E}' => 1, - '\u{012F}' => 1, - '\u{0130}' => 1, - '\u{0931}' => 1, - '\u{0134}' => 1, - '\u{0135}' => 1, - '\u{0136}' => 1, - '\u{0137}' => 1, - '\u{0139}' => 1, - '\u{013A}' => 1, - '\u{013B}' => 1, - '\u{013C}' => 1, - '\u{013D}' => 1, - '\u{013E}' => 1, - '\u{FE76}' => 1, - '\u{0143}' => 1, - '\u{0144}' => 1, - '\u{0145}' => 1, - '\u{0146}' => 1, - '\u{0147}' => 1, - '\u{0148}' => 1, - '\u{014C}' => 1, - '\u{014D}' => 1, - '\u{014E}' => 1, - '\u{014F}' => 1, - '\u{0150}' => 1, - '\u{0151}' => 1, - '\u{0154}' => 1, - '\u{0155}' => 1, - '\u{0156}' => 1, - '\u{0157}' => 1, - '\u{0158}' => 1, - '\u{0159}' => 1, - '\u{015A}' => 1, - '\u{015B}' => 1, - '\u{015C}' => 1, - '\u{015D}' => 1, - '\u{015E}' => 1, - '\u{015F}' => 1, - '\u{0160}' => 1, - '\u{0161}' => 1, - '\u{0162}' => 1, - '\u{0163}' => 1, - '\u{0164}' => 1, - '\u{0165}' => 1, - '\u{0168}' => 1, - '\u{0169}' => 1, - '\u{016A}' => 1, - '\u{016B}' => 1, - '\u{016C}' => 1, - '\u{016D}' => 1, - '\u{016E}' => 1, - '\u{016F}' => 1, - '\u{0170}' => 1, - '\u{0171}' => 1, - '\u{0172}' => 1, - '\u{0173}' => 1, - '\u{0174}' => 1, - '\u{0175}' => 1, - '\u{0176}' => 1, - '\u{0177}' => 1, - '\u{0178}' => 1, - '\u{0179}' => 1, - '\u{017A}' => 1, - '\u{017B}' => 1, - '\u{017C}' => 1, - '\u{017D}' => 1, - '\u{017E}' => 1, - '\u{FE82}' => 1, - '\u{2226}' => 1, - '\u{FE74}' => 1, - '\u{219A}' => 1, - '\u{219B}' => 1, - '\u{01A0}' => 1, - '\u{01A1}' => 1, - '\u{FEF8}' => 1, - '\u{21AE}' => 1, - '\u{01AF}' => 1, - '\u{01B0}' => 1, - '\u{1D1BB}' => 1, - '\u{1D1BC}' => 1, - '\u{1D1BD}' => 2, - '\u{1D1BE}' => 2, - '\u{1D1BF}' => 2, - '\u{1D1C0}' => 2, - '\u{01C4}' => 1, - '\u{01C5}' => 1, - '\u{01C6}' => 1, - '\u{1EF7}' => 1, - '\u{01CD}' => 1, - '\u{01CE}' => 1, - '\u{01CF}' => 1, - '\u{01D0}' => 1, - '\u{01D1}' => 1, - '\u{01D2}' => 1, - '\u{01D3}' => 1, - '\u{01D4}' => 1, - '\u{01D5}' => 2, - '\u{01D6}' => 2, - '\u{01D7}' => 2, - '\u{01D8}' => 2, - '\u{01D9}' => 2, - '\u{01DA}' => 2, - '\u{01DB}' => 2, - '\u{01DC}' => 2, - '\u{09DD}' => 1, - '\u{01DE}' => 2, - '\u{01DF}' => 2, - '\u{01E0}' => 2, - '\u{01E1}' => 2, - '\u{01E2}' => 1, - '\u{01E3}' => 1, - '\u{01E6}' => 1, - '\u{01E7}' => 1, - '\u{01E8}' => 1, - '\u{01E9}' => 1, - '\u{01EA}' => 1, - '\u{01EB}' => 1, - '\u{01EC}' => 2, - '\u{01ED}' => 2, - '\u{01EE}' => 1, - '\u{01EF}' => 1, - '\u{01F0}' => 1, - '\u{01F4}' => 1, - '\u{01F5}' => 1, - '\u{01F8}' => 1, - '\u{01F9}' => 1, - '\u{01FA}' => 2, - '\u{01FB}' => 2, - '\u{01FC}' => 1, - '\u{01FD}' => 1, - '\u{01FE}' => 1, - '\u{01FF}' => 1, - '\u{0200}' => 1, - '\u{0201}' => 1, - '\u{0202}' => 1, - '\u{0203}' => 1, - '\u{0204}' => 1, - '\u{0205}' => 1, - '\u{0206}' => 1, - '\u{0207}' => 1, - '\u{0208}' => 1, - '\u{0209}' => 1, - '\u{020A}' => 1, - '\u{020B}' => 1, - '\u{020C}' => 1, - '\u{020D}' => 1, - '\u{020E}' => 1, - '\u{020F}' => 1, - '\u{0210}' => 1, - '\u{0211}' => 1, - '\u{0212}' => 1, - '\u{0213}' => 1, - '\u{0214}' => 1, - '\u{0215}' => 1, - '\u{0216}' => 1, - '\u{0217}' => 1, - '\u{0218}' => 1, - '\u{0219}' => 1, - '\u{021A}' => 1, - '\u{021B}' => 1, - '\u{021E}' => 1, - '\u{021F}' => 1, - '\u{2224}' => 1, - '\u{FE8C}' => 1, - '\u{0226}' => 1, - '\u{0227}' => 1, - '\u{0228}' => 1, - '\u{0229}' => 1, - '\u{022A}' => 2, - '\u{022B}' => 2, - '\u{022C}' => 2, - '\u{022D}' => 2, - '\u{022E}' => 1, - '\u{022F}' => 1, - '\u{0230}' => 2, - '\u{0231}' => 2, - '\u{0232}' => 1, - '\u{0233}' => 1, - '\u{FC5E}' => 2, - '\u{0A36}' => 1, - '\u{30D1}' => 1, - '\u{2241}' => 1, - '\u{2244}' => 1, - '\u{FE7A}' => 1, - '\u{30D3}' => 1, - '\u{2247}' => 1, - '\u{2249}' => 1, - '\u{30FA}' => 1, - '\u{FE85}' => 1, - '\u{0A59}' => 1, - '\u{0A5A}' => 1, - '\u{0A5B}' => 1, - '\u{0A5E}' => 1, - '\u{2260}' => 1, - '\u{2262}' => 1, - '\u{FE7B}' => 1, - '\u{30D4}' => 1, - '\u{30B4}' => 1, - '\u{226D}' => 1, - '\u{226E}' => 1, - '\u{226F}' => 1, - '\u{2270}' => 1, - '\u{2271}' => 1, - '\u{2274}' => 1, - '\u{2275}' => 1, - '\u{2278}' => 1, - '\u{2279}' => 1, - '\u{2280}' => 1, - '\u{2281}' => 1, - '\u{2284}' => 1, - '\u{2285}' => 1, - '\u{2288}' => 1, - '\u{2289}' => 1, - '\u{FE72}' => 1, - '\u{FE7D}' => 1, - '\u{FE86}' => 1, - '\u{FB4B}' => 1, - '\u{22AC}' => 1, - '\u{22AD}' => 1, - '\u{22AE}' => 1, - '\u{22AF}' => 1, - '\u{FC5C}' => 1, - '\u{FE7E}' => 1, - '\u{FC5D}' => 1, - '\u{21CD}' => 1, - '\u{21CE}' => 1, - '\u{02D8}' => 1, - '\u{02D9}' => 1, - '\u{02DA}' => 1, - '\u{02DB}' => 1, - '\u{02DC}' => 1, - '\u{02DD}' => 1, - '\u{22E0}' => 1, - '\u{22E1}' => 1, - '\u{22E2}' => 1, - '\u{22E3}' => 1, - '\u{22EA}' => 1, - '\u{22EB}' => 1, - '\u{22EC}' => 1, - '\u{22ED}' => 1, - '\u{FE77}' => 1, - '\u{FE79}' => 1, - '\u{3304}' => 1, - '\u{3307}' => 1, - '\u{FCD9}' => 1, - '\u{3310}' => 1, - '\u{FE81}' => 1, - '\u{FB1D}' => 1, - '\u{331E}' => 1, - '\u{FB1F}' => 1, - '\u{3321}' => 1, - '\u{09DC}' => 1, - '\u{FB2A}' => 1, - '\u{FB2B}' => 1, - '\u{FB2C}' => 2, - '\u{FB2D}' => 2, - '\u{FB2E}' => 1, - '\u{FB2F}' => 1, - '\u{FB30}' => 1, - '\u{FB31}' => 1, - '\u{3332}' => 1, - '\u{FB33}' => 1, - '\u{FB34}' => 1, - '\u{FB35}' => 1, - '\u{FB36}' => 1, - '\u{FB38}' => 1, - '\u{FB39}' => 1, - '\u{FB3A}' => 1, - '\u{09DF}' => 1, - '\u{FB3C}' => 1, - '\u{FB3E}' => 1, '\u{0340}' => 1, '\u{0341}' => 1, '\u{0343}' => 1, '\u{0344}' => 2, - '\u{FB46}' => 1, - '\u{FB47}' => 1, - '\u{FB48}' => 1, - '\u{FB49}' => 1, - '\u{FB4A}' => 1, - '\u{1F37}' => 2, - '\u{FB4C}' => 1, - '\u{FB4D}' => 1, - '\u{334E}' => 1, - '\u{FE83}' => 1, - '\u{1F39}' => 1, - '\u{0B5C}' => 1, - '\u{0B5D}' => 1, - '\u{333B}' => 1, - '\u{FE84}' => 1, - '\u{037A}' => 1, - '\u{3340}' => 1, - '\u{0384}' => 1, - '\u{0385}' => 2, - '\u{0386}' => 1, - '\u{FB41}' => 1, - '\u{0388}' => 1, - '\u{0389}' => 1, - '\u{038A}' => 1, - '\u{038C}' => 1, - '\u{038E}' => 1, - '\u{038F}' => 1, - '\u{0390}' => 2, - '\u{FB43}' => 1, - '\u{30B8}' => 1, - '\u{FB44}' => 1, - '\u{FB40}' => 1, - '\u{FBA4}' => 1, - '\u{FBA5}' => 1, - '\u{309C}' => 1, - '\u{03AA}' => 1, - '\u{03AB}' => 1, - '\u{03AC}' => 1, - '\u{03AD}' => 1, - '\u{03AE}' => 1, - '\u{03AF}' => 1, - '\u{03B0}' => 2, - '\u{FBB1}' => 1, - '\u{2ADC}' => 1, - '\u{334B}' => 1, - '\u{03CA}' => 1, - '\u{03CB}' => 1, - '\u{03CC}' => 1, - '\u{03CD}' => 1, - '\u{03CE}' => 1, - '\u{03D3}' => 1, - '\u{03D4}' => 1, - '\u{FB4E}' => 1, - '\u{FE88}' => 1, - '\u{0400}' => 1, - '\u{0401}' => 1, - '\u{0403}' => 1, - '\u{0407}' => 1, - '\u{FBB0}' => 1, - '\u{040C}' => 1, - '\u{040D}' => 1, - '\u{040E}' => 1, - '\u{0419}' => 1, - '\u{FE78}' => 1, - '\u{FE8A}' => 1, - '\u{FB3B}' => 1, - '\u{2209}' => 1, - '\u{0439}' => 1, - '\u{FE8B}' => 1, - '\u{0C48}' => 1, - '\u{220C}' => 1, - '\u{0450}' => 1, - '\u{0451}' => 1, - '\u{0453}' => 1, - '\u{FEF6}' => 1, - '\u{0457}' => 1, - '\u{FC5B}' => 1, - '\u{045C}' => 1, - '\u{045D}' => 1, - '\u{045E}' => 1, - '\u{FC5F}' => 2, - '\u{FC60}' => 2, - '\u{FC61}' => 2, - '\u{FC62}' => 2, - '\u{FC63}' => 2, - '\u{FE89}' => 1, - '\u{FE7C}' => 1, - '\u{1F213}' => 1, - '\u{0476}' => 1, - '\u{0477}' => 1, - '\u{30C0}' => 1, - '\u{FCF4}' => 2, - '\u{212B}' => 1, - '\u{30C2}' => 1, - '\u{FC90}' => 1, - '\u{30C5}' => 1, - '\u{30C7}' => 1, - '\u{1F73}' => 1, - '\u{21CF}' => 1, - '\u{1F75}' => 1, - '\u{04C1}' => 1, - '\u{04C2}' => 1, - '\u{1F76}' => 1, - '\u{FFE3}' => 1, - '\u{1F77}' => 1, - '\u{1E22}' => 1, - '\u{04D0}' => 1, - '\u{04D1}' => 1, - '\u{04D2}' => 1, - '\u{04D3}' => 1, - '\u{04D6}' => 1, - '\u{04D7}' => 1, - '\u{1E24}' => 1, - '\u{04DA}' => 1, - '\u{04DB}' => 1, - '\u{04DC}' => 1, - '\u{04DD}' => 1, - '\u{04DE}' => 1, - '\u{04DF}' => 1, - '\u{04E2}' => 1, - '\u{04E3}' => 1, - '\u{04E4}' => 1, - '\u{04E5}' => 1, - '\u{04E6}' => 1, - '\u{04E7}' => 1, - '\u{04EA}' => 1, - '\u{04EB}' => 1, - '\u{04EC}' => 1, - '\u{04ED}' => 1, - '\u{04EE}' => 1, - '\u{04EF}' => 1, - '\u{04F0}' => 1, - '\u{04F1}' => 1, - '\u{04F2}' => 1, - '\u{04F3}' => 1, - '\u{04F4}' => 1, - '\u{04F5}' => 1, - '\u{04F8}' => 1, - '\u{04F9}' => 1, - '\u{30D6}' => 1, - '\u{1F81}' => 2, - '\u{30D9}' => 1, - '\u{30DA}' => 1, - '\u{1FDF}' => 2, - '\u{30DC}' => 1, - '\u{30DD}' => 1, - '\u{0A33}' => 1, - '\u{FD3C}' => 1, - '\u{FD3D}' => 1, - '\u{1F78}' => 1, - '\u{1F94}' => 3, - '\u{FE70}' => 1, - '\u{2204}' => 1, - '\u{30C9}' => 1, - '\u{FCF2}' => 2, - '\u{FCF3}' => 2, - '\u{FF9E}' => 1, - '\u{1ED3}' => 2, - '\u{FE49}' => 1, - '\u{30F4}' => 1, - '\u{FF9F}' => 1, - '\u{FE4A}' => 1, - '\u{FE4B}' => 1, - '\u{FE4C}' => 1, - '\u{30F9}' => 1, - '\u{0DDA}' => 1, - '\u{0DDD}' => 1, - '\u{1F79}' => 1, - '\u{1E00}' => 1, - '\u{1E01}' => 1, - '\u{1E02}' => 1, - '\u{1E03}' => 1, - '\u{1E04}' => 1, - '\u{1E05}' => 1, - '\u{1E06}' => 1, - '\u{1E07}' => 1, - '\u{1E08}' => 2, - '\u{1E09}' => 2, - '\u{1E0A}' => 1, - '\u{1E0B}' => 1, - '\u{1E0C}' => 1, - '\u{1E0D}' => 1, - '\u{1E0E}' => 1, - '\u{1E0F}' => 1, - '\u{1E10}' => 1, - '\u{1E11}' => 1, - '\u{1E12}' => 1, - '\u{1E13}' => 1, - '\u{1E14}' => 2, - '\u{1E15}' => 2, - '\u{1E16}' => 2, - '\u{1E17}' => 2, - '\u{1E18}' => 1, - '\u{1E19}' => 1, - '\u{1E1A}' => 1, - '\u{1E1B}' => 1, - '\u{1E1C}' => 2, - '\u{1E1D}' => 2, - '\u{1E1E}' => 1, - '\u{1E1F}' => 1, - '\u{1E20}' => 1, - '\u{1E21}' => 1, - '\u{0622}' => 1, - '\u{0623}' => 1, - '\u{0624}' => 1, - '\u{0625}' => 1, - '\u{0626}' => 1, - '\u{1E27}' => 1, - '\u{1E28}' => 1, - '\u{1E29}' => 1, - '\u{1E2A}' => 1, - '\u{1E2B}' => 1, - '\u{1E2C}' => 1, - '\u{1E2D}' => 1, - '\u{1E2E}' => 2, - '\u{1E2F}' => 2, - '\u{1E30}' => 1, - '\u{1E31}' => 1, - '\u{1E32}' => 1, - '\u{1E33}' => 1, - '\u{1E34}' => 1, - '\u{1E35}' => 1, - '\u{1E36}' => 1, - '\u{1E37}' => 1, - '\u{1E38}' => 2, - '\u{1E39}' => 2, - '\u{1E3A}' => 1, - '\u{1E3B}' => 1, - '\u{1E3C}' => 1, - '\u{1E3D}' => 1, - '\u{1E3E}' => 1, - '\u{1E3F}' => 1, - '\u{1E40}' => 1, - '\u{1E41}' => 1, - '\u{1E42}' => 1, - '\u{1E43}' => 1, - '\u{1E44}' => 1, - '\u{1E45}' => 1, - '\u{1E46}' => 1, - '\u{1E47}' => 1, - '\u{1E48}' => 1, - '\u{1E49}' => 1, - '\u{1E4A}' => 1, - '\u{1E4B}' => 1, - '\u{1E4C}' => 2, - '\u{1E4D}' => 2, - '\u{1E4E}' => 2, - '\u{1E4F}' => 2, - '\u{1E50}' => 2, - '\u{1E51}' => 2, - '\u{1E52}' => 2, - '\u{1E53}' => 2, - '\u{1E54}' => 1, - '\u{1E55}' => 1, - '\u{1E56}' => 1, - '\u{1E57}' => 1, - '\u{1E58}' => 1, - '\u{1E59}' => 1, - '\u{1E5A}' => 1, - '\u{1E5B}' => 1, - '\u{1E5C}' => 2, - '\u{1E5D}' => 2, - '\u{1E5E}' => 1, - '\u{1E5F}' => 1, - '\u{1E60}' => 1, - '\u{1E61}' => 1, - '\u{1E62}' => 1, - '\u{1E63}' => 1, - '\u{1E64}' => 2, - '\u{1E65}' => 2, - '\u{1E66}' => 2, - '\u{1E67}' => 2, - '\u{1E68}' => 2, - '\u{1E69}' => 2, - '\u{1E6A}' => 1, - '\u{1E6B}' => 1, - '\u{1E6C}' => 1, - '\u{1E6D}' => 1, - '\u{1E6E}' => 1, - '\u{1E6F}' => 1, - '\u{1E70}' => 1, - '\u{1E71}' => 1, - '\u{1E72}' => 1, - '\u{1E73}' => 1, - '\u{1E74}' => 1, - '\u{1E75}' => 1, - '\u{1E76}' => 1, - '\u{1E77}' => 1, - '\u{1E78}' => 2, - '\u{1E79}' => 2, - '\u{1E7A}' => 2, - '\u{1E7B}' => 2, - '\u{1E7C}' => 1, - '\u{1E7D}' => 1, - '\u{1E7E}' => 1, - '\u{1E7F}' => 1, - '\u{1E80}' => 1, - '\u{1E81}' => 1, - '\u{1E82}' => 1, - '\u{1E83}' => 1, - '\u{1E84}' => 1, - '\u{1E85}' => 1, - '\u{1E86}' => 1, - '\u{1E87}' => 1, - '\u{1E88}' => 1, - '\u{1E25}' => 1, - '\u{1E8A}' => 1, - '\u{1E8B}' => 1, - '\u{1E8C}' => 1, - '\u{1E8D}' => 1, - '\u{1E8E}' => 1, - '\u{1E8F}' => 1, - '\u{1E90}' => 1, - '\u{1E91}' => 1, - '\u{1E92}' => 1, - '\u{1E93}' => 1, - '\u{1E94}' => 1, - '\u{1E95}' => 1, - '\u{1E96}' => 1, - '\u{1E97}' => 1, - '\u{1E98}' => 1, - '\u{1E99}' => 1, - '\u{1E9B}' => 1, - '\u{1EA0}' => 1, - '\u{1EA1}' => 1, - '\u{1EA2}' => 1, - '\u{1EA3}' => 1, - '\u{1EA4}' => 2, - '\u{1EA5}' => 2, - '\u{1EA6}' => 2, - '\u{1EA7}' => 2, - '\u{1EA8}' => 2, - '\u{1EA9}' => 2, - '\u{1EAA}' => 2, - '\u{1EAB}' => 2, - '\u{1EAC}' => 2, - '\u{1EAD}' => 2, - '\u{1EAE}' => 2, - '\u{1EAF}' => 2, - '\u{1EB0}' => 2, - '\u{1EB1}' => 2, - '\u{1EB2}' => 2, - '\u{1EB3}' => 2, - '\u{1EB4}' => 2, - '\u{1EB5}' => 2, - '\u{1EB6}' => 2, - '\u{1EB7}' => 2, - '\u{1EB8}' => 1, - '\u{1EB9}' => 1, - '\u{1EBA}' => 1, - '\u{1EBB}' => 1, - '\u{1EBC}' => 1, - '\u{1EBD}' => 1, - '\u{1EBE}' => 2, - '\u{1EBF}' => 2, - '\u{06C0}' => 1, - '\u{1EC1}' => 2, - '\u{06C2}' => 1, - '\u{1EC3}' => 2, - '\u{1EC4}' => 2, - '\u{1EC5}' => 2, - '\u{1EC6}' => 2, - '\u{1EC7}' => 2, - '\u{1EC8}' => 1, - '\u{1EC9}' => 1, - '\u{1ECA}' => 1, - '\u{1ECB}' => 1, - '\u{1ECC}' => 1, - '\u{1ECD}' => 1, - '\u{1ECE}' => 1, - '\u{1ECF}' => 1, - '\u{1ED0}' => 2, - '\u{1ED1}' => 2, - '\u{1ED2}' => 2, - '\u{06D3}' => 1, - '\u{1ED4}' => 2, - '\u{1ED5}' => 2, - '\u{1ED6}' => 2, - '\u{1ED7}' => 2, - '\u{1ED8}' => 2, - '\u{1ED9}' => 2, - '\u{1EDA}' => 2, - '\u{1EDB}' => 2, - '\u{1EDC}' => 2, - '\u{1EDD}' => 2, - '\u{1EDE}' => 2, - '\u{1EDF}' => 2, - '\u{1EE0}' => 2, - '\u{1EE1}' => 2, - '\u{1EE2}' => 2, - '\u{1EE3}' => 2, - '\u{1EE4}' => 1, - '\u{1EE5}' => 1, - '\u{1EE6}' => 1, - '\u{1EE7}' => 1, - '\u{1EE8}' => 2, - '\u{1EE9}' => 2, - '\u{1EEA}' => 2, - '\u{1EEB}' => 2, - '\u{1EEC}' => 2, - '\u{1EED}' => 2, - '\u{1EEE}' => 2, - '\u{1EEF}' => 2, - '\u{1EF0}' => 2, - '\u{1EF1}' => 2, - '\u{1EF2}' => 1, - '\u{1EF3}' => 1, - '\u{1EF4}' => 1, - '\u{1EF5}' => 1, - '\u{1EF6}' => 1, - '\u{0929}' => 1, - '\u{1EF8}' => 1, - '\u{1EF9}' => 1, - '\u{FEFA}' => 1, - '\u{FE7F}' => 1, - '\u{1F00}' => 1, - '\u{1F01}' => 1, - '\u{1F02}' => 2, - '\u{1F03}' => 2, - '\u{1F04}' => 2, - '\u{1F05}' => 2, - '\u{1F06}' => 2, - '\u{1F07}' => 2, - '\u{1F08}' => 1, - '\u{1F09}' => 1, - '\u{1F0A}' => 2, - '\u{1F0B}' => 2, - '\u{1F0C}' => 2, - '\u{1F0D}' => 2, - '\u{1F0E}' => 2, - '\u{1F0F}' => 2, - '\u{1F10}' => 1, - '\u{1F11}' => 1, - '\u{1F12}' => 2, - '\u{1F13}' => 2, - '\u{1F14}' => 2, - '\u{1F15}' => 2, - '\u{1F18}' => 1, - '\u{1F19}' => 1, - '\u{1F1A}' => 2, - '\u{1F1B}' => 2, - '\u{1F1C}' => 2, - '\u{1F1D}' => 2, - '\u{1E26}' => 1, - '\u{1F20}' => 1, - '\u{1F21}' => 1, - '\u{1F22}' => 2, - '\u{1F23}' => 2, - '\u{1F24}' => 2, - '\u{1F25}' => 2, - '\u{1F26}' => 2, - '\u{1F27}' => 2, - '\u{1F28}' => 1, - '\u{1F29}' => 1, - '\u{1F2A}' => 2, - '\u{1F2B}' => 2, - '\u{1F2C}' => 2, - '\u{1F2D}' => 2, - '\u{1F2E}' => 2, - '\u{1F2F}' => 2, - '\u{1F30}' => 1, - '\u{1F31}' => 1, - '\u{1F32}' => 2, - '\u{1F33}' => 2, - '\u{1F34}' => 2, - '\u{1F35}' => 2, - '\u{1F36}' => 2, - '\u{1E89}' => 1, - '\u{1F38}' => 1, - '\u{0934}' => 1, - '\u{1F3A}' => 2, - '\u{1F3B}' => 2, - '\u{1F3C}' => 2, - '\u{1F3D}' => 2, - '\u{1F3E}' => 2, - '\u{1F3F}' => 2, - '\u{1F40}' => 1, - '\u{1F41}' => 1, - '\u{1F42}' => 2, - '\u{1F43}' => 2, - '\u{1F44}' => 2, - '\u{1F45}' => 2, - '\u{1F48}' => 1, - '\u{1F49}' => 1, - '\u{1F4A}' => 2, - '\u{1F4B}' => 2, - '\u{1F4C}' => 2, - '\u{1F4D}' => 2, - '\u{1F50}' => 1, - '\u{1F51}' => 1, - '\u{1F52}' => 2, - '\u{1F53}' => 2, - '\u{1F54}' => 2, - '\u{1F55}' => 2, - '\u{1F56}' => 2, - '\u{1F57}' => 2, - '\u{1F59}' => 1, - '\u{1F5B}' => 2, - '\u{1F5D}' => 2, - '\u{1F5F}' => 2, - '\u{1F60}' => 1, - '\u{1F61}' => 1, - '\u{1F62}' => 2, - '\u{1F63}' => 2, - '\u{1F64}' => 2, - '\u{1F65}' => 2, - '\u{1F66}' => 2, - '\u{1F67}' => 2, - '\u{1F68}' => 1, - '\u{1F69}' => 1, - '\u{1F6A}' => 2, - '\u{1F6B}' => 2, - '\u{1F6C}' => 2, - '\u{1F6D}' => 2, - '\u{1F6E}' => 2, - '\u{1F6F}' => 2, - '\u{1F70}' => 1, - '\u{1F71}' => 1, - '\u{1F72}' => 1, '\u{0F73}' => 2, - '\u{1F74}' => 1, '\u{0F75}' => 2, - '\u{0F76}' => 1, - '\u{0F77}' => 2, - '\u{0F78}' => 1, - '\u{0F79}' => 2, - '\u{1F7A}' => 1, - '\u{1F7B}' => 1, - '\u{1F7C}' => 1, - '\u{1F7D}' => 1, - '\u{1F80}' => 2, '\u{0F81}' => 2, - '\u{1F82}' => 3, - '\u{1F83}' => 3, - '\u{1F84}' => 3, - '\u{1F85}' => 3, - '\u{1F86}' => 3, - '\u{1F87}' => 3, - '\u{1F88}' => 2, - '\u{1F89}' => 2, - '\u{1F8A}' => 3, - '\u{1F8B}' => 3, - '\u{1F8C}' => 3, - '\u{1F8D}' => 3, - '\u{1F8E}' => 3, - '\u{1F8F}' => 3, - '\u{1F90}' => 2, - '\u{1F91}' => 2, - '\u{1F92}' => 3, - '\u{1F93}' => 3, - '\u{1D15E}' => 1, - '\u{1F95}' => 3, - '\u{1F96}' => 3, - '\u{1F97}' => 3, - '\u{1F98}' => 2, - '\u{1F99}' => 2, - '\u{1F9A}' => 3, - '\u{1F9B}' => 3, - '\u{1F9C}' => 3, - '\u{1F9D}' => 3, - '\u{1F9E}' => 3, - '\u{1F9F}' => 3, - '\u{1FA0}' => 2, - '\u{1FA1}' => 2, - '\u{1FA2}' => 3, - '\u{1FA3}' => 3, - '\u{1FA4}' => 3, - '\u{1FA5}' => 3, - '\u{1FA6}' => 3, - '\u{1FA7}' => 3, - '\u{1FA8}' => 2, - '\u{1FA9}' => 2, - '\u{1FAA}' => 3, - '\u{1FAB}' => 3, - '\u{1FAC}' => 3, - '\u{1FAD}' => 3, - '\u{1FAE}' => 3, - '\u{1FAF}' => 3, - '\u{1FB0}' => 1, - '\u{1FB1}' => 1, - '\u{1D15F}' => 1, - '\u{1FB3}' => 1, - '\u{1FB4}' => 2, - '\u{1FB6}' => 1, - '\u{1FB7}' => 2, - '\u{1FB8}' => 1, - '\u{1FB9}' => 1, - '\u{1FBA}' => 1, - '\u{1FBB}' => 1, - '\u{1FBC}' => 1, - '\u{1FBD}' => 1, - '\u{1FBF}' => 1, - '\u{1FC0}' => 1, - '\u{1FC1}' => 2, - '\u{1FC2}' => 2, - '\u{1FC3}' => 1, - '\u{1FC4}' => 2, - '\u{1FC6}' => 1, - '\u{1FC7}' => 2, - '\u{1FC8}' => 1, - '\u{1FC9}' => 1, - '\u{1FCA}' => 1, - '\u{1FCB}' => 1, - '\u{1FCC}' => 1, - '\u{1FCD}' => 2, - '\u{1FCE}' => 2, - '\u{1FCF}' => 2, - '\u{1FD0}' => 1, - '\u{1FD1}' => 1, - '\u{1FD2}' => 2, - '\u{1FD3}' => 2, - '\u{1FD6}' => 1, - '\u{1FD7}' => 2, - '\u{1FD8}' => 1, - '\u{1FD9}' => 1, - '\u{1FDA}' => 1, - '\u{1FDB}' => 1, - '\u{1FDD}' => 2, - '\u{1FDE}' => 2, - '\u{1FB2}' => 2, - '\u{1FE0}' => 1, - '\u{1FE1}' => 1, - '\u{1FE2}' => 2, - '\u{1FE3}' => 2, - '\u{1FE4}' => 1, - '\u{1FE5}' => 1, - '\u{1FE6}' => 1, - '\u{1FE7}' => 2, - '\u{1FE8}' => 1, - '\u{1FE9}' => 1, - '\u{1FEA}' => 1, - '\u{1FEB}' => 1, - '\u{1FEC}' => 1, - '\u{1FED}' => 2, - '\u{1FEE}' => 2, - '\u{1FF2}' => 2, - '\u{1FF3}' => 1, - '\u{1FF4}' => 2, - '\u{1FF6}' => 1, - '\u{1FF7}' => 2, - '\u{1FF8}' => 1, - '\u{1FF9}' => 1, - '\u{1FFA}' => 1, - '\u{1FFB}' => 1, - '\u{1FFC}' => 1, - '\u{1FFD}' => 1, - '\u{1FFE}' => 1, + '\u{FF9E}' => 1, + '\u{FF9F}' => 1, _ => 0, } } +pub(crate) const TRAILING_NONSTARTERS_SALT: &[u16] = &[ + 0x1bb, + 0x0, + 0x8, + 0x162, + 0x0, + 0x5, + 0x0, + 0x75, + 0x4, + 0x0, + 0x0, + 0x5, + 0x18, + 0x2, + 0x0, + 0x1, + 0x90, + 0x0, + 0x2, + 0x5f, + 0xc6, + 0x0, + 0x0, + 0x20, + 0x0, + 0x0, + 0x0, + 0x6, + 0x0, + 0x39, + 0x0, + 0x0, + 0x48, + 0x3, + 0x0, + 0x95, + 0xaf, + 0x30, + 0x6f, + 0x0, + 0x0, + 0x4, + 0x8, + 0x10b, + 0x13, + 0x0, + 0x2f, + 0x16, + 0x6d, + 0x1, + 0x3, + 0xe, + 0x0, + 0x2c, + 0x83, + 0x37, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x2, + 0x0, + 0x1, + 0x0, + 0x6, + 0x2, + 0x46, + 0xa, + 0xb, + 0x16, + 0x4c, + 0x0, + 0x0, + 0x0, + 0xe, + 0x1, + 0x0, + 0x7, + 0xf, + 0x26, + 0x2, + 0xb, + 0xb, + 0x3, + 0x6, + 0x1a, + 0x0, + 0x1, + 0x6, + 0x5, + 0x5c, + 0x6, + 0x8, + 0x0, + 0x0, + 0x0, + 0x4, + 0x59, + 0x9, + 0x20, + 0x3, + 0x0, + 0x4, + 0x1a, + 0x1, + 0x0, + 0xb, + 0x0, + 0x0, + 0x0, + 0x0, + 0x23, + 0x2, + 0x8, + 0x0, + 0x0, + 0x0, + 0x1, + 0x29, + 0x1a, + 0x20, + 0x6, + 0x15, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x13, + 0x14, + 0x3, + 0x1, + 0x14, + 0x1, + 0x1, + 0x0, + 0x3, + 0x4, + 0x0, + 0x5, + 0x8, + 0x3, + 0x2, + 0x1c, + 0x5, + 0x1, + 0x0, + 0x17, + 0x0, + 0x0, + 0x1b, + 0x0, + 0x6, + 0x0, + 0x3a, + 0x0, + 0x23, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x5, + 0x1, + 0x0, + 0x0, + 0x16, + 0x2d, + 0x3, + 0x1, + 0x4, + 0x14, + 0x0, + 0x0, + 0x16, + 0x2, + 0x3, + 0x9, + 0x0, + 0x56, + 0x0, + 0xd, + 0x0, + 0x4, + 0xd, + 0x0, + 0x2, + 0x10, + 0x0, + 0x0, + 0x0, + 0x3, + 0x23, + 0x0, + 0x0, + 0x0, + 0x6, + 0x13, + 0x10, + 0xd, + 0x5c, + 0x0, + 0x9, + 0xe, + 0x5, + 0x1, + 0x0, + 0xc, + 0xd, + 0x1, + 0x4, + 0x1, + 0x2, + 0x13, + 0x0, + 0x0, + 0x1, + 0xc, + 0xb, + 0x6, + 0x0, + 0x0, + 0x0, + 0x0, + 0xc, + 0x0, + 0x7, + 0x0, + 0xf, + 0x0, + 0x5, + 0x4, + 0x4, + 0x3, + 0x2, + 0x4, + 0x1, + 0x11, + 0x11, + 0xc, + 0x5, + 0x6, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x2, + 0x2, + 0xc, + 0x0, + 0x0, + 0x11, + 0x6, + 0x0, + 0x0, + 0x0, + 0x4, + 0x8, + 0x0, + 0x0, + 0x2, + 0x12, + 0x9, + 0x1, + 0x0, + 0x3, + 0x9, + 0x0, + 0x0, + 0x3, + 0x9, + 0x0, + 0x0, + 0x1, + 0x0, + 0xc, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x9, + 0x2, + 0x2, + 0x8, + 0x0, + 0x0, + 0x5, + 0x13, + 0x7, + 0xc, + 0x0, + 0x9, + 0x1, + 0x3a, + 0x1, + 0x1, + 0x9, + 0x0, + 0x0, + 0x0, + 0x9, + 0x1, + 0x4, + 0x12, + 0x0, + 0x7, + 0x4, + 0x5, + 0x0, + 0x1, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x0, + 0x7, + 0x1, + 0x0, + 0x12, + 0x2, + 0x1, + 0x6, + 0x1a, + 0x4, + 0x6, + 0x0, + 0x0, + 0x1, + 0x0, + 0x9, + 0x3, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x0, + 0x5, + 0xb, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0xb, + 0x0, + 0x0, + 0x5, + 0x0, + 0x0, + 0x8, + 0x0, + 0x5, + 0x0, + 0x0, + 0x5, + 0x4, + 0xa, + 0x0, + 0x0, + 0x9, + 0x0, + 0xa, + 0x5, + 0x8, + 0x1, + 0x0, + 0x1c, + 0x2, + 0x1, + 0x3, + 0x0, + 0x1a, + 0x9, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x1, + 0x3, + 0x0, + 0x5, + 0x4, + 0x4, + 0xe, + 0x0, + 0x9, + 0x1, + 0x8, + 0x2, + 0x0, + 0x0, + 0x4, + 0x3, + 0x0, + 0x4, + 0xf, + 0x1, + 0x0, + 0x2, + 0x3, + 0x6, + 0x0, + 0x0, + 0x2, + 0x0, + 0x10, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1, + 0x0, + 0x0, + 0x4, + 0x0, + 0x7, + 0x2, + 0x5, + 0x1, + 0x6, + 0x0, + 0x4, + 0x3, + 0xa, + 0x1, + 0xa, + 0x1, + 0x0, + 0x7, + 0x2, + 0x0, + 0x3, + 0x0, + 0x0, + 0x2b, + 0x8, + 0x1, + 0x0, + 0xe, + 0xa, + 0x0, + 0xb, + 0x0, + 0x0, + 0x4, + 0x1, + 0xb, + 0x6, + 0x0, + 0x0, + 0x3, + 0x0, + 0x1, + 0x1, + 0x6, + 0x2, + 0x2, + 0x0, + 0x1, + 0x1e, + 0x5, + 0xa, + 0x5, + 0x7, + 0x9, + 0x0, + 0x0, + 0x0, + 0xa, + 0x3, + 0x0, + 0x0, + 0x4, + 0x0, + 0x5, + 0x4, + 0x4, + 0x0, + 0x1, + 0x0, + 0x2, + 0x0, + 0x8, + 0x1, + 0x5, + 0x6, + 0x1, + 0x0, + 0x1, + 0x1, + 0x0, + 0x4, + 0x6, + 0x1, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x0, + 0x9, + 0x1, + 0xb, + 0x0, + 0x1, + 0x0, + 0x6, + 0x1, + 0x2, + 0x3, + 0x4, + 0x2, + 0x1, + 0x1, + 0x0, + 0x8, + 0x1, + 0x2, + 0x0, + 0x0, + 0x3, + 0x0, + 0x5, + 0xa, + 0x4, + 0x1, + 0x0, + 0x1, + 0x3, + 0x1, + 0x8, + 0x0, + 0x1, + 0x2, + 0x1, + 0x0, + 0x2, + 0xc, + 0x2, + 0x2, + 0x8, + 0xd, + 0x1, + 0x1, + 0x3, + 0x0, + 0x2, + 0x0, + 0x1, + 0x1, + 0x0, + 0x6, + 0x4, + 0x0, + 0x0, + 0x8, + 0x6, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0xb, + 0x3, + 0x8, + 0x5, + 0x3, + 0x0, + 0x0, + 0x0, + 0x2, + 0x7, + 0x1, + 0x5, + 0x0, + 0x0, + 0x3, + 0x1, + 0x4, + 0x0, + 0x0, + 0x0, + 0xd, + 0x0, + 0x2, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x4, + 0x8, + 0x0, + 0x3, + 0x1, + 0x0, + 0x7, + 0x0, + 0x1, + 0x2, + 0x0, + 0x3, + 0x0, + 0x7, + 0x0, + 0x1, + 0x1, + 0x9, + 0x2, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x3, + 0x0, + 0x2, + 0x0, + 0x1, + 0x4, + 0x2, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x5, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x1, + 0x0, + 0x7, + 0x6, + 0x3, + 0x0, + 0x1, + 0x1, + 0x2, + 0x7, + 0x2, + 0x0, + 0x3, + 0x0, + 0x5, + 0x3, + 0x2, + 0x0, + 0x1, + 0x2, + 0x1, + 0x2, + 0x3, + 0x1, + 0x0, + 0x3, + 0x1, + 0x2, + 0x1, + 0x0, + 0x0, + 0x6, + 0x5, + 0xa, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x3, + 0x2, + 0x2, + 0x1, + 0x1, + 0x0, + 0x1, + 0x0, + 0x0, + 0x6, + 0x1, + 0x0, + 0x3, + 0x1, + 0x1, + 0x1, + 0x1, + 0x0, + 0x8, + 0x0, + 0x4, + 0x5, + 0x0, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x2, + 0x9, + 0x3, + 0x0, + 0x4, + 0x1, + 0x1, + 0xc, + 0x1, + 0x1, + 0x0, + 0x3, + 0x0, + 0x0, + 0x2, + 0x1, + 0x2, + 0x0, + 0xa, + 0x9, + 0x0, + 0x0, + 0x4, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x8, + 0x0, + 0x8, + 0x2, + 0x5, + 0x6, + 0x3, + 0x1, + 0x0, + 0x6, + 0x0, + 0x6, + 0x0, + 0x2, + 0x1, + 0x0, + 0x2, + 0x4, + 0x0, + 0x7, + 0x3, + 0x0, + 0xb, + 0x1, + 0x0, + 0x4, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x6, + 0x6, + 0x2, + 0x1, + 0x2, + 0x1, + 0x9, + 0x0, + 0x0, + 0x0, + 0x8, + 0x12, + 0x0, + 0x9, + 0x0, + 0x1, + 0x3, + 0x0, + 0x7, + 0x0, + 0x2, + 0x1, + 0x1, + 0x3, + 0x2, + 0x1, + 0x2, + 0x0, + 0x2, + 0x1, + 0x0, + 0x1, + 0x0, + 0x3, + 0x1, + 0x3, + 0x5, + 0x1, + 0x0, + 0x3, + 0x7, + 0x4, + 0x1, + 0x0, + 0x1, + 0x6, + 0x3, + 0x1, + 0x0, + 0x4, + 0x2, + 0x0, + 0x1, + 0x2, + 0x1, + 0x1, + 0x0, + 0x0, + 0x3, + 0x0, + 0x2, + 0x0, + 0x7, + 0x1, + 0x1, + 0x0, + 0x4, + 0x3, + 0x3, + 0x4, + 0x6, + 0x0, + 0x3, + 0x0, + 0x1, + 0x3, + 0x3, + 0x2, + 0x3, + 0x1, + 0x0, + 0x0, + 0x8, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x0, + 0x2, + 0x3, + 0x1, + 0x2, + 0x3, + 0x3, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x3, + 0x0, + 0xe, + 0x4, + 0x5, + 0x3, + 0x0, + 0x0, + 0x3, + 0x7, + 0x1, + 0x7, + 0x1, + 0x0, + 0x2, + 0x0, + 0x3, + 0x3, + 0x2, + 0x3, + 0x3, + 0x5, + 0x1, + 0x4, + 0x3, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x3, + 0x6, + 0x0, + 0x3, + 0x1, + 0x0, + 0x2, + 0x2, + 0x6, + 0x3, + 0x6, + 0x4, + 0x3, + 0x0, + 0x0, + 0x2, + 0x0, + 0x3, + 0x0, + 0x1, + 0x1, + 0x2, + 0x2, + 0x4, + 0x1, + 0x2, + 0x1, + 0x0, + 0x8, + 0x1, + 0x1, + 0x2, + 0x0, + 0x0, + 0x3, + 0x1, + 0x7, + 0x6, + 0x3, + 0x9, + 0x0, + 0x0, + 0x1, + 0x0, + 0x5, + 0x4, + 0x0, + 0x0, + 0x0, + 0x3, + 0x6, + 0x0, + 0x1, + 0x4, + 0x8, + 0x0, + 0x0, + 0x5, + 0x0, + 0x3, + 0x3, + 0x1, + 0x4, + 0x1, + 0x0, + 0x1, + 0x0, + 0x4, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x2, + 0x0, + 0x0, + 0x2, + 0x1, + 0x4, + 0x0, + 0x0, + 0x0, + 0x1, + 0x1, + 0x1, + 0x0, + 0x3, + 0x1, + 0x3, + 0x1, + 0x0, + 0x0, + 0x3, + 0x1, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x1, + 0x1, + 0x2, + 0x1, + 0x1, + 0x0, + 0x2, + 0x1, + 0x3, + 0x4, + 0x0, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x0, + 0x5, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x2, + 0x1, + 0x5, + 0x0, + 0x4, + 0x2, + 0x1, + 0x4, + 0x3, + 0x1, + 0x0, + 0x1, + 0x2, + 0x4, +]; +pub(crate) const TRAILING_NONSTARTERS_KV: &[u32] = &[ + 0x4EE01, + 0x1E4B01, + 0x1F1D02, + 0x1E3C01, + 0x224901, + 0x1FB101, + 0x1E6902, + 0xFE8401, + 0x1E1A01, + 0x22901, + 0xFC6202, + 0xFE7101, + 0x1E5A01, + 0xEC01, + 0x15001, + 0x1E8901, + 0x21CF01, + 0x1F1101, + 0x1E5002, + 0x1E7201, + 0x1FB901, + 0x34301, + 0x1FD901, + 0x1FF801, + 0x1F8C03, + 0xDA01, + 0x1E5302, + 0x1FA203, + 0x1FC202, + 0x334E01, + 0x1F4502, + 0x12B01, + 0xFB4401, + 0x220401, + 0x13E01, + 0x12901, + 0x1E9301, + 0x1F001, + 0x307701, + 0xFE7D01, + 0x21B01, + 0x1EA802, + 0x1E6402, + 0x40301, + 0x95801, + 0x1E3902, + 0x30AC01, + 0x1F3502, + 0x4F501, + 0x1E7101, + 0x4E701, + 0x10801, + 0x334B01, + 0x14E01, + 0x1EC901, + 0x1FA02, + 0x4ED01, + 0x4EB01, + 0x21701, + 0x1FD001, + 0x14601, + 0x1D101, + 0x34101, + 0x1E3401, + 0x304C01, + 0xE901, + 0x1F9403, + 0x330701, + 0x1E4001, + 0x1E3601, + 0x1E3101, + 0x22AD01, + 0x1E0701, + 0x1F5202, + 0xF601, + 0x1FEB01, + 0x1EE501, + 0x1F7201, + 0x1EAF02, + 0x1F6D02, + 0x1E2201, + 0x1EEA02, + 0x1E4D02, + 0xA3301, + 0x4F901, + 0x17401, + 0x11D01, + 0xFB3601, + 0x305C01, + 0x12201, + 0x1F8802, + 0x1E5D02, + 0x1EC102, + 0x13D01, + 0x1EF102, + 0x30F401, + 0x40701, + 0x1FA802, + 0x1EB402, + 0x1E5801, + 0x1E0501, + 0xE001, + 0xFB3301, + 0xEB01, + 0xA5E01, + 0x1F3202, + 0x20A01, + 0x20801, + 0x1FF702, + 0x1FC901, + 0x228001, + 0xE401, + 0x1F2101, + 0x21CE01, + 0xCB01, + 0x1F9F03, + 0x14301, + 0x306701, + 0x1E601, + 0x1E4601, + 0x45D01, + 0x1E1001, + 0x1E4801, + 0x1FF402, + 0x30D701, + 0x22E301, + 0x1EB801, + 0x12C01, + 0x331E01, + 0x1F7001, + 0x1F5D02, + 0x21901, + 0x10D01, + 0x1FB402, + 0xA801, + 0x1FE801, + 0x15401, + 0x4D301, + 0xFC01, + 0x1EE401, + 0x1F0901, + 0x16B01, + 0x1E1201, + 0x1E2E02, + 0x4C201, + 0xFB1F01, + 0x1F5602, + 0x4DA01, + 0x1EC02, + 0x228801, + 0x1ECB01, + 0x16101, + 0x1E9101, + 0x1ECE01, + 0x1F8002, + 0x307401, + 0xFE4901, + 0x307101, + 0x1D16202, + 0x1FC001, + 0x3CB01, + 0x1FCF02, + 0x1FBF01, + 0x1FBD01, + 0xFB3501, + 0x1D15E01, + 0xFE7F01, + 0x22E01, + 0x1E7701, + 0xFBB001, + 0xE101, + 0x30B001, + 0x22EA01, + 0x1F3F02, + 0x1C601, + 0x1E1E01, + 0x9DC01, + 0x1F6302, + 0x1FC01, + 0x4D001, + 0x1FDE02, + 0x1E1301, + 0x1FCE02, + 0x4F101, + 0x228101, + 0x1F0101, + 0xFB1D01, + 0xDB01, + 0x1E8701, + 0x224101, + 0xFB3A01, + 0x40101, + 0x1FC402, + 0xFE7B01, + 0x30BA01, + 0xFBA501, + 0x30F701, + 0x1FF301, + 0x14C01, + 0x1D16302, + 0x15701, + 0x17801, + 0x1F7901, + 0x306201, + 0x1EAE02, + 0x30B801, + 0x1F2302, + 0x1F4D02, + 0x17C01, + 0x15601, + 0x22D02, + 0xFC9001, + 0x1E3B01, + 0x1E6A01, + 0x1EBE02, + 0x17301, + 0x22ED01, + 0x10E01, + 0x1E8A01, + 0x1F6B02, + 0x6C201, + 0xFEF901, + 0x1EB901, + 0x1EB102, + 0x1F5702, + 0x1F0D02, + 0x305A01, + 0x1FD702, + 0x30AE01, + 0x1E2001, + 0x17601, + 0xFB3401, + 0x1F8E03, + 0xFB4D01, + 0xFE8101, + 0x1E6101, + 0x1FE302, + 0x1D201, + 0x1FA403, + 0x1EE002, + 0x1F7A01, + 0xFB2F01, + 0x1F5502, + 0xFEFA01, + 0x1D602, + 0xFA01, + 0xFE8501, + 0x22F01, + 0x4DB01, + 0x1E5F01, + 0x1E2701, + 0x39002, + 0x41901, + 0x30F801, + 0x16C01, + 0x12401, + 0xC701, + 0x1F9503, + 0x228401, + 0x1E8C01, + 0xF7502, + 0x1FC301, + 0x1F7C01, + 0xFE7201, + 0x20C01, + 0xFB4901, + 0x1FBB01, + 0x10F01, + 0x1FB601, + 0x1F8902, + 0x1FF01, + 0x1F2402, + 0x1F5302, + 0x1E1702, + 0x1D802, + 0x309E01, + 0xFE7A01, + 0x305E01, + 0x226E01, + 0x1FE702, + 0x1EBF02, + 0x1F3801, + 0x1E3201, + 0x1FFB01, + 0x1E6B01, + 0x1F9D03, + 0x222401, + 0x201701, + 0xF7601, + 0x1FCC01, + 0x1FA002, + 0x1F7401, + 0x1F2C02, + 0x40D01, + 0x1EEE02, + 0x15C01, + 0xE301, + 0xCC01, + 0xFB3801, + 0x333201, + 0x1E7501, + 0x334001, + 0x11501, + 0x1E3001, + 0x34402, + 0x17701, + 0x1E9201, + 0x1E2D01, + 0xCA01, + 0x1E7D01, + 0x13001, + 0x1F6801, + 0x3AA01, + 0x309C01, + 0x1F4001, + 0x3AC01, + 0x1EBA01, + 0x43901, + 0xFB4C01, + 0x1E201, + 0x1109A01, + 0x1DB02, + 0x1E4101, + 0x1FE001, + 0xCE01, + 0x21F01, + 0x4DF01, + 0x47701, + 0x1F0302, + 0x3D401, + 0x23201, + 0x1E1101, + 0x1FD202, + 0x14401, + 0x1F4C02, + 0x1EF301, + 0x10C01, + 0x30D001, + 0x1E4C02, + 0x1E2C01, + 0x1F1C02, + 0xFC5F02, + 0x1FE101, + 0x1EC502, + 0x22801, + 0x22E101, + 0x1EC002, + 0xEA01, + 0x1E0802, + 0x95A01, + 0x1F8303, + 0x1EE302, + 0x306901, + 0x17101, + 0x1E1602, + 0x212B01, + 0x1E6001, + 0x22EC01, + 0x219B01, + 0x1E8F01, + 0x1F4302, + 0x4E501, + 0x1FA303, + 0x1F3C02, + 0x16D01, + 0x30BE01, + 0x1FA603, + 0x1E9601, + 0xFD01, + 0x1F0602, + 0x1ED402, + 0x1D502, + 0x1A001, + 0x222601, + 0x9DF01, + 0xFB3201, + 0xFB4701, + 0x1E6301, + 0x1DC02, + 0x1E4701, + 0x30BC01, + 0x1D1BB01, + 0x1FC702, + 0x1D1BC01, + 0x309B01, + 0xF7702, + 0xFF9E01, + 0x1EA702, + 0x95901, + 0xE501, + 0x30B601, + 0xFCF402, + 0x21601, + 0x4EA01, + 0x20501, + 0x4F001, + 0xC4801, + 0x14701, + 0x1EF801, + 0x1F5B02, + 0x1EA001, + 0xE201, + 0x1F9303, + 0x1F5901, + 0xFB4B01, + 0x1F3001, + 0x1E8401, + 0x62401, + 0x1F9703, + 0xDC01, + 0x1E8B01, + 0x1EDF02, + 0x3B002, + 0x1C401, + 0x1ED502, + 0x1F2901, + 0x1F7D01, + 0x1EE902, + 0x30DA01, + 0xD201, + 0x1F6A02, + 0x1EA402, + 0x1EB01, + 0xFEF801, + 0x93101, + 0x307601, + 0x1F0A02, + 0x1F2702, + 0x1FD601, + 0x3AB01, + 0x1E0101, + 0xFB2C02, + 0x11C01, + 0x203E01, + 0x16001, + 0x21001, + 0x1E0B01, + 0xFE8901, + 0x1E1C02, + 0x1E1801, + 0x1F9102, + 0x1E9501, + 0x11901, + 0x45C01, + 0x30DC01, + 0xFB2D02, + 0x22B02, + 0x2D901, + 0x1D001, + 0xDDA01, + 0x15D01, + 0x1E6E01, + 0x1EA602, + 0x1E4A01, + 0x1EDA02, + 0x306501, + 0x4F401, + 0x306001, + 0x110AB01, + 0x228501, + 0x1E8E01, + 0x227801, + 0x4F301, + 0x1F0502, + 0x1F7101, + 0x1E5C02, + 0xAF01, + 0x1EC302, + 0xFE8C01, + 0x1E8501, + 0x1F9802, + 0x1EA01, + 0xFB4801, + 0xC801, + 0xFE7901, + 0x62501, + 0x16501, + 0xF101, + 0x11601, + 0x1FDF02, + 0x1FEC01, + 0x1F3E02, + 0x331001, + 0xE701, + 0x1FB202, + 0x22601, + 0x6D301, + 0x1EAA02, + 0x1E1B01, + 0x12301, + 0x1F7701, + 0x1FAD03, + 0x1EDC02, + 0x11401, + 0x1F8B03, + 0x14501, + 0x1FBC01, + 0x1E7902, + 0x95F01, + 0x1F2801, + 0xDDD01, + 0x1FFA01, + 0x1CD01, + 0xFE4A01, + 0xFE7E01, + 0x1AF01, + 0x17E01, + 0x1F8603, + 0x227401, + 0x1FB301, + 0x13401, + 0xFB4A01, + 0x1F2502, + 0x1FD302, + 0x1F21301, + 0x20B01, + 0x38C01, + 0xFE8701, + 0x1F3101, + 0x1F1402, + 0x1E1F01, + 0x1FB02, + 0x1E7E01, + 0x1E0201, + 0xFE4B01, + 0xD901, + 0x1F0001, + 0xF7302, + 0xC501, + 0x4E401, + 0xFCF302, + 0x1F5101, + 0x1FE601, + 0x30C001, + 0x4F801, + 0x12801, + 0x1EB202, + 0x1E0A01, + 0x1E0C01, + 0x1E4401, + 0xEE01, + 0x30C201, + 0x16F01, + 0x1EA502, + 0x30FA01, + 0x1EB502, + 0x1D1BE02, + 0x22E001, + 0x22E201, + 0x1D1C002, + 0x1EC402, + 0x1F6702, + 0x30FE01, + 0x1F3402, + 0xFE7001, + 0x1E2101, + 0x1F5F02, + 0x220C01, + 0x1D902, + 0x1E0601, + 0x13B01, + 0x1ED802, + 0x1EEB02, + 0xC201, + 0x45001, + 0x1FDD02, + 0x1E7601, + 0x1D16402, + 0x1B001, + 0x20401, + 0x11201, + 0x21301, + 0x3D301, + 0x1EC202, + 0x1EAB02, + 0x1FAE03, + 0x1EE01, + 0x1ED602, + 0x1E3701, + 0x309401, + 0xD401, + 0x1E5E01, + 0x1E0D01, + 0x30D601, + 0x1ED702, + 0x1F5001, + 0x1D401, + 0x1FFD01, + 0xFB3C01, + 0x1E8D01, + 0x21501, + 0x3AF01, + 0x224701, + 0x1ECA01, + 0x305801, + 0x1E7F01, + 0x22AC01, + 0x15B01, + 0x4D601, + 0x17A01, + 0x1ED02, + 0x1E6702, + 0x1E2801, + 0x20D01, + 0x1EBD01, + 0x1FD01, + 0xFB2E01, + 0x1E4501, + 0x1EF701, + 0x45E01, + 0x1F3B02, + 0x20001, + 0x1FCD02, + 0x38502, + 0x13601, + 0x20301, + 0x21201, + 0x1E9B01, + 0x1F401, + 0x1E8001, + 0x1FC102, + 0x1F7601, + 0x3CA01, + 0x16301, + 0x1FCB01, + 0x95C01, + 0x21101, + 0x1EF901, + 0x1E7B02, + 0x1E901, + 0x1E1D02, + 0x1EDE02, + 0x15F01, + 0x1F6402, + 0x10001, + 0x20F01, + 0x1E6602, + 0x40E01, + 0x38E01, + 0x1F0801, + 0x11801, + 0xFB3101, + 0x1D702, + 0x1ED102, + 0x305201, + 0x1E2A01, + 0x227001, + 0x1F8503, + 0x1FFE01, + 0x1EF002, + 0x4DD01, + 0x95D01, + 0x1F6502, + 0xF401, + 0x4D701, + 0x38601, + 0x2D801, + 0x1EC801, + 0x45701, + 0xFF01, + 0x22AF01, + 0x1EBC01, + 0x11E01, + 0x45301, + 0xFE7801, + 0x21E01, + 0xB5D01, + 0x12A01, + 0xF501, + 0xD301, + 0x1E6502, + 0x21A01, + 0x1F6E02, + 0x1FB001, + 0x62201, + 0x333B01, + 0x30D301, + 0x1EA101, + 0x226F01, + 0x1E0E01, + 0x15E01, + 0x1FF202, + 0x21801, + 0x1F8203, + 0x20901, + 0x1FD101, + 0x2DB01, + 0xF201, + 0xF7902, + 0xA5A01, + 0x1F0E02, + 0x1F1801, + 0x307C01, + 0xFC5C01, + 0x2ADC01, + 0xE801, + 0x15801, + 0x1FDB01, + 0x1F6C02, + 0x1EB002, + 0x1E2301, + 0x1F1502, + 0x11F01, + 0xFC6002, + 0x1FA902, + 0x1E5501, + 0x23102, + 0x1FE01, + 0x1E3D01, + 0x21AE01, + 0xFD3C01, + 0x38401, + 0x1EE701, + 0x13701, + 0xFB3001, + 0xEF01, + 0x1FA703, + 0x10A01, + 0x1F2B02, + 0x1D16002, + 0xF901, + 0xFEF501, + 0x40C01, + 0x22A02, + 0xF301, + 0x12D01, + 0x1F9A03, + 0x1E4201, + 0x1E102, + 0xA5B01, + 0x1EAC02, + 0x1E1502, + 0x1F9E03, + 0x1FD801, + 0x1F4A02, + 0x20201, + 0x1E9801, + 0x1E2401, + 0x1EE601, + 0x304E01, + 0x1E6C01, + 0xFE8A01, + 0xFB4001, + 0x1F2D02, + 0xFD3D01, + 0x1FC801, + 0x1FB801, + 0x1F3D02, + 0x1EF501, + 0x13901, + 0x1E8101, + 0x1F9C03, + 0x10301, + 0xA5901, + 0x1F9002, + 0x1ED902, + 0x1EF201, + 0x4E301, + 0xFEF701, + 0x1ECD01, + 0x11A01, + 0xFB2A01, + 0x1E301, + 0x1F6602, + 0x1FB702, + 0x1E2501, + 0x30C701, + 0x1F8102, + 0xCF01, + 0x1EEF02, + 0x1E9701, + 0x1F6F02, + 0x1F2A02, + 0x10901, + 0x1E5601, + 0x1E0001, + 0xFB4E01, + 0x1FC601, + 0xC001, + 0x220901, + 0xFE8801, + 0x1CE01, + 0xED01, + 0x15901, + 0x15A01, + 0x37A01, + 0x227501, + 0xD501, + 0x4C101, + 0x1E1901, + 0x30D101, + 0x10701, + 0x1FAC03, + 0x1EA301, + 0x1F2E02, + 0x14D01, + 0x1F4901, + 0x1E8801, + 0x1EB302, + 0x20701, + 0x1F7801, + 0x1F8D03, + 0xFBA401, + 0x1F9902, + 0x38801, + 0x1F2001, + 0xFB4101, + 0x1EC602, + 0x40001, + 0x1EB602, + 0x1E2B01, + 0x1E3A01, + 0x1C501, + 0x16201, + 0x17D01, + 0x1E8201, + 0x1F1B02, + 0x17001, + 0x224401, + 0x23301, + 0x1E2601, + 0x1F3302, + 0x10401, + 0x30D901, + 0x30F901, + 0x1F8A03, + 0x93401, + 0x3CD01, + 0x1FFC01, + 0x10101, + 0x1F5402, + 0xFB4601, + 0x3AD01, + 0x1F0402, + 0x1FF601, + 0x30B201, + 0x1F1001, + 0x1E7301, + 0x20E01, + 0x1E0301, + 0x1F6901, + 0xFEF601, + 0x95B01, + 0x227101, + 0x22701, + 0x1E3501, + 0x34001, + 0x1F0B02, + 0x1E701, + 0x1ED302, + 0x1F8403, + 0x1F2F02, + 0x1E8301, + 0x1F6001, + 0x62301, + 0xFC5D01, + 0x226001, + 0x22C02, + 0x1E3F01, + 0x1F7501, + 0x226201, + 0x1FDA01, + 0x20601, + 0xFE7701, + 0x305601, + 0x12101, + 0x1F2602, + 0x1E9001, + 0x95E01, + 0x12F01, + 0x1F9603, + 0x1E4901, + 0x10B01, + 0x1DF02, + 0x1D16102, + 0xFB2B01, + 0x1E0902, + 0x11701, + 0xFF9F01, + 0x1F7B01, + 0x1E9901, + 0x1F9203, + 0x1FCA01, + 0xB801, + 0x1A101, + 0x1F3901, + 0xFE7401, + 0xFC6102, + 0x1E5B01, + 0x92901, + 0xFE8301, + 0x1FE202, + 0x305401, + 0x1CF01, + 0x2DC01, + 0xFB01, + 0x307A01, + 0xFB3901, + 0x17501, + 0x305001, + 0x1E801, + 0x1FE901, + 0x1D301, + 0x307D01, + 0x1E2F02, + 0xFE4C01, + 0xF8102, + 0x1FA503, + 0x1FAB03, + 0x1EDB02, + 0x1F4801, + 0x1EED02, + 0x1F4402, + 0x1DA02, + 0xD101, + 0x1E6802, + 0x2DA01, + 0x30B401, + 0x1ECF01, + 0x1E5901, + 0x1E002, + 0x1E5701, + 0x1F0F02, + 0x17201, + 0x1FEE02, + 0x1E5401, + 0xC901, + 0xA3601, + 0x228901, + 0x1ECC01, + 0xB401, + 0x16901, + 0x1EF601, + 0x10501, + 0x1E7C01, + 0x1F8F03, + 0x1E3301, + 0x14F01, + 0x1EE802, + 0x1F4202, + 0x1E3E01, + 0xFC6302, + 0x1F501, + 0x16401, + 0x4F201, + 0x1F0202, + 0x1E0F01, + 0x1FEA01, + 0x1F1901, + 0xFC5B01, + 0x1D1BD02, + 0xC101, + 0x38A01, + 0x1EE102, + 0xD601, + 0x1E7802, + 0x1F7301, + 0x1E7A02, + 0x1EA902, + 0xFCD901, + 0x1F9B03, + 0x1F2202, + 0x10601, + 0x38F01, + 0xF7801, + 0x1D15F01, + 0x1F8703, + 0x1FE501, + 0x1EE202, + 0x1F801, + 0x307901, + 0xFE8201, + 0x1ED002, + 0x4E201, + 0x13501, + 0x1109C01, + 0xFCF202, + 0x1E6F01, + 0x21CD01, + 0x1EB702, + 0x4EF01, + 0x1E6201, + 0x1EDD02, + 0xFC5E02, + 0xDD01, + 0x1F6202, + 0x1F4B02, + 0x4E601, + 0x14801, + 0x1F3A02, + 0x1FAF03, + 0xC401, + 0x1EEC02, + 0x1F4101, + 0x1EC702, + 0x4DC01, + 0x16E01, + 0x1F1A02, + 0x307301, + 0x22AE01, + 0x38901, + 0x23002, + 0x13C01, + 0x1FF901, + 0x1F0702, + 0x1EBB01, + 0x12501, + 0x1F1202, + 0x1E2901, + 0x1E4301, + 0x10201, + 0x330401, + 0x6C001, + 0x11301, + 0x1EA201, + 0x1F3702, + 0x1FED02, + 0x4D201, + 0xFFE301, + 0x30D401, + 0x15101, + 0x307001, + 0x3AE01, + 0x1F901, + 0x1FA102, + 0x1E9401, + 0x332101, + 0xC301, + 0x17901, + 0x1DE02, + 0xFB3E01, + 0x1E5102, + 0x4DE01, + 0x62601, + 0x3CC01, + 0x2DD01, + 0x1F6101, + 0x15501, + 0x3CE01, + 0x30C901, + 0x1E7001, + 0x227901, + 0x30C501, + 0x12001, + 0xFE8601, + 0x1E4F02, + 0x13A01, + 0x1E7401, + 0x1F1302, + 0x1D1BF02, + 0x11B01, + 0x9DD01, + 0x22EB01, + 0x1E6D01, + 0x1E5202, + 0x1ED202, + 0x1F3602, + 0x1EAD02, + 0x1FE401, + 0xB5C01, + 0x1FBA01, + 0x1E4E02, + 0x16801, + 0xFE7C01, + 0x1FAA03, + 0x1E0401, + 0x20101, + 0x1EF01, + 0x12E01, + 0x1F0C02, + 0x1E1402, + 0xFE7601, + 0x1E3802, + 0xFB3B01, + 0xCD01, + 0x226D01, + 0x4D101, + 0x1E8601, + 0x45101, + 0x17B01, + 0x47601, + 0x4EC01, + 0x21401, + 0x1EF401, + 0x16A01, + 0x30DD01, + 0xFE8B01, + 0xFBB101, + 0x219A01, + 0xFB4301, +]; + + diff --git a/vendor/unicode-normalization/src/test.rs b/vendor/unicode-normalization/src/test.rs index b32e4c138c..8aaadbac97 100644 --- a/vendor/unicode-normalization/src/test.rs +++ b/vendor/unicode-normalization/src/test.rs @@ -95,84 +95,6 @@ fn test_nfkc() { t!("a\u{300}\u{305}\u{315}\u{5ae}b", "\u{e0}\u{5ae}\u{305}\u{315}b"); } -#[test] -fn test_official() { - use normalization_tests::NORMALIZATION_TESTS; - macro_rules! normString { - ($method: ident, $input: expr) => { $input.$method().collect::<String>() } - } - - for test in NORMALIZATION_TESTS { - // these invariants come from the CONFORMANCE section of - // http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt - { - let r1 = normString!(nfc, test.source); - let r2 = normString!(nfc, test.nfc); - let r3 = normString!(nfc, test.nfd); - let r4 = normString!(nfc, test.nfkc); - let r5 = normString!(nfc, test.nfkd); - assert_eq!(test.nfc, &r1[..]); - assert_eq!(test.nfc, &r2[..]); - assert_eq!(test.nfc, &r3[..]); - assert_eq!(test.nfkc, &r4[..]); - assert_eq!(test.nfkc, &r5[..]); - } - - { - let r1 = normString!(nfd, test.source); - let r2 = normString!(nfd, test.nfc); - let r3 = normString!(nfd, test.nfd); - let r4 = normString!(nfd, test.nfkc); - let r5 = normString!(nfd, test.nfkd); - assert_eq!(test.nfd, &r1[..]); - assert_eq!(test.nfd, &r2[..]); - assert_eq!(test.nfd, &r3[..]); - assert_eq!(test.nfkd, &r4[..]); - assert_eq!(test.nfkd, &r5[..]); - } - - { - let r1 = normString!(nfkc, test.source); - let r2 = normString!(nfkc, test.nfc); - let r3 = normString!(nfkc, test.nfd); - let r4 = normString!(nfkc, test.nfkc); - let r5 = normString!(nfkc, test.nfkd); - assert_eq!(test.nfkc, &r1[..]); - assert_eq!(test.nfkc, &r2[..]); - assert_eq!(test.nfkc, &r3[..]); - assert_eq!(test.nfkc, &r4[..]); - assert_eq!(test.nfkc, &r5[..]); - } - - { - let r1 = normString!(nfkd, test.source); - let r2 = normString!(nfkd, test.nfc); - let r3 = normString!(nfkd, test.nfd); - let r4 = normString!(nfkd, test.nfkc); - let r5 = normString!(nfkd, test.nfkd); - assert_eq!(test.nfkd, &r1[..]); - assert_eq!(test.nfkd, &r2[..]); - assert_eq!(test.nfkd, &r3[..]); - assert_eq!(test.nfkd, &r4[..]); - assert_eq!(test.nfkd, &r5[..]); - } - } -} - -#[test] -fn test_quick_check() { - use normalization_tests::NORMALIZATION_TESTS; - use quick_check; - for test in NORMALIZATION_TESTS { - assert!(quick_check::is_nfc(test.nfc)); - assert!(quick_check::is_nfd(test.nfd)); - if test.nfc != test.nfd { - assert!(!quick_check::is_nfc(test.nfd)); - assert!(!quick_check::is_nfd(test.nfc)); - } - } -} - #[test] fn test_is_combining_mark_ascii() { for cp in 0..0x7f { diff --git a/vendor/unicode-script/.cargo-checksum.json b/vendor/unicode-script/.cargo-checksum.json new file mode 100644 index 0000000000..e842e9e858 --- /dev/null +++ b/vendor/unicode-script/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"bb8e286a566fd2cb8049e7f5e6118f074e3acf734f6311521e5cd52742dbcba4","README.md":"14f5fffdc485176a2ab2e04555231042d0f7d818dbf1a0749a1ecbd8a0d4d500","scripts/unicode.py":"63a32a9e8cdc1114362d239aa0d50019ac47192ad8f1b7b1c95fd726e3efb80f","src/lib.rs":"f81ab05b75c37adb2a2785d0d2d6aafa29abda37466648b41e6a9667eba5b932","src/tables.rs":"d39080faba4a028c381154d8e925d11556afc2c4e0cfdbecfa81e6795764e57a"},"package":"5b2c5c29e805da6817f5af6a627d65adb045cebf05cccd5a3493d6109454391c"} \ No newline at end of file diff --git a/vendor/wasi-0.7.0/Cargo.toml b/vendor/unicode-script/Cargo.toml similarity index 52% rename from vendor/wasi-0.7.0/Cargo.toml rename to vendor/unicode-script/Cargo.toml index 88f2888ced..2d0c8c5705 100644 --- a/vendor/wasi-0.7.0/Cargo.toml +++ b/vendor/unicode-script/Cargo.toml @@ -12,16 +12,17 @@ [package] edition = "2018" -name = "wasi" -version = "0.7.0" -authors = ["The Cranelift Project Developers"] -description = "Experimental WASI API bindings for Rust" -documentation = "https://docs.rs/wasi" +name = "unicode-script" +version = "0.4.0" +authors = ["Manish Goregaokar <manishsmail@gmail.com>"] +exclude = ["target/*", "Cargo.lock", "scripts/tmp", "*.txt"] +description = "This crate exposes the Unicode `Script` and `Script_Extension` properties from [UAX #24](http://www.unicode.org/reports/tr24/)\n" +homepage = "https://github.com/unicode-rs/unicode-script" +documentation = "https://docs.rs/unicode-script" readme = "README.md" -keywords = ["webassembly", "wasm"] -categories = ["no-std", "wasm"] -license = "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT" -repository = "https://github.com/CraneStation/rust-wasi" +keywords = ["text", "unicode", "script", "language"] +license = "MIT/Apache-2.0" +repository = "https://github.com/unicode-rs/unicode-script" [dependencies.compiler_builtins] version = "0.1" optional = true @@ -31,13 +32,12 @@ version = "1.0" optional = true package = "rustc-std-workspace-core" -[dependencies.rustc-std-workspace-alloc] +[dependencies.std] version = "1.0" optional = true +package = "rustc-std-workspace-std" [features] -alloc = [] -default = ["alloc"] -rustc-dep-of-std = ["compiler_builtins", "core", "rustc-std-workspace-alloc"] -[badges.maintenance] -status = "experimental" +default_features = ["with_std"] +rustc-dep-of-std = ["std", "core", "compiler_builtins"] +with_std = [] diff --git a/vendor/unicode-script/README.md b/vendor/unicode-script/README.md new file mode 100644 index 0000000000..85fd60b114 --- /dev/null +++ b/vendor/unicode-script/README.md @@ -0,0 +1,7 @@ +# unicode-script + +[![Build Status](https://github.com/unicode-rs/unicode-script/workflows/Tests/badge.svg)](https://github.com/unicode-rs/unicode-script/actions) +[![Current Version](https://meritbadge.herokuapp.com/unicode-script)](https://crates.io/crates/unicode-script) +[![License: MIT/Apache-2.0](https://img.shields.io/crates/l/unicode-script.svg)](#license) + +This crate exposes the Unicode `Script` and `Script_Extension` properties from [UAX #24](http://www.unicode.org/reports/tr24/) \ No newline at end of file diff --git a/vendor/unicode-script/scripts/unicode.py b/vendor/unicode-script/scripts/unicode.py new file mode 100644 index 0000000000..36ef94dd3f --- /dev/null +++ b/vendor/unicode-script/scripts/unicode.py @@ -0,0 +1,416 @@ +#!/usr/bin/env python +# +# Copyright 2011-2015 The Rust Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution and at +# http://rust-lang.org/COPYRIGHT. +# +# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + +# This script uses the following Unicode tables: +# - DerivedCoreProperties.txt +# - auxiliary/GraphemeBreakProperty.txt +# - auxiliary/WordBreakProperty.txt +# - ReadMe.txt +# - UnicodeData.txt +# +# Since this should not require frequent updates, we just store this +# out-of-line and check the unicode.rs file into git. + +import fileinput, re, os, sys + +preamble = '''// Copyright 2012-2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// NOTE: The following code was generated by "scripts/unicode.py", do not edit directly + +#![allow(missing_docs, non_upper_case_globals, non_snake_case)] +''' + +UNICODE_VERSION = (12, 0, 0) + +UNICODE_VERSION_NUMBER = "%s.%s.%s" %UNICODE_VERSION + +def escape_char(c): + return "'\\u{%x}'" % c + +def fetch(f): + if not os.path.exists(os.path.basename(f)): + if "emoji" in f: + os.system("curl -O https://www.unicode.org/Public/emoji/%s.%s/%s" + % (UNICODE_VERSION[0], UNICODE_VERSION[1], f)) + else: + os.system("curl -O http://www.unicode.org/Public/%s/ucd/%s" + % (UNICODE_VERSION_NUMBER, f)) + + if not os.path.exists(os.path.basename(f)): + sys.stderr.write("cannot load %s" % f) + exit(1) + +def group_cats(cats): + cats_out = {} + for cat in cats: + cats_out[cat] = group_cat(cats[cat]) + return cats_out + +def aliases(): + """ + Fetch the shorthand aliases for each longhand Script name + """ + fetch("PropertyValueAliases.txt") + longforms = {} + shortforms = {} + re1 = re.compile(r"^ *sc *; *(\w+) *; *(\w+)") + for line in fileinput.input(os.path.basename("PropertyValueAliases.txt")): + m = re1.match(line) + if m: + l = m.group(2).strip() + s = m.group(1).strip() + assert(s not in longforms) + assert(l not in shortforms) + longforms[s] = l + shortforms[l] = s + else: + continue + + return (longforms, shortforms) + +def format_table_content(f, content, indent): + line = " "*indent + first = True + for chunk in content.split(","): + if len(line) + len(chunk) < 98: + if first: + line += chunk + else: + line += ", " + chunk + first = False + else: + f.write(line + ",\n") + line = " "*indent + chunk + f.write(line) + +# Implementation from unicode-segmentation +def load_properties(f, interestingprops): + fetch(f) + props = {} + # Note: these regexes are different from those in unicode-segmentation, + # becase we need to handle spaces here + re1 = re.compile(r"^ *([0-9A-F]+) *; *([^#]+) *#") + re2 = re.compile(r"^ *([0-9A-F]+)\.\.([0-9A-F]+) *; *([^#]+) *#") + + for line in fileinput.input(os.path.basename(f)): + prop = None + d_lo = 0 + d_hi = 0 + m = re1.match(line) + if m: + d_lo = m.group(1) + d_hi = m.group(1) + prop = m.group(2).strip() + else: + m = re2.match(line) + if m: + d_lo = m.group(1) + d_hi = m.group(2) + prop = m.group(3).strip() + else: + continue + if interestingprops and prop not in interestingprops: + continue + d_lo = int(d_lo, 16) + d_hi = int(d_hi, 16) + if prop not in props: + props[prop] = [] + props[prop].append((d_lo, d_hi)) + + return props + +# Implementation from unicode-segmentation +def emit_table(f, name, t_data, t_type = "&'static [(char, char)]", is_pub=True, + pfun=lambda x: "(%s,%s)" % (escape_char(x[0]), escape_char(x[1])), is_const=True): + pub_string = "const" + if not is_const: + pub_string = "let" + if is_pub: + pub_string = "pub " + pub_string + f.write(" %s %s: %s = &[\n" % (pub_string, name, t_type)) + data = "" + first = True + for dat in t_data: + if not first: + data += "," + first = False + data += pfun(dat) + format_table_content(f, data, 8) + f.write("\n ];\n\n") + +def emit_search(f): + f.write(""" +pub fn bsearch_range_value_table<T: Copy>(c: char, r: &'static [(char, char, T)]) -> Option<T> { + use core::cmp::Ordering::{Equal, Less, Greater}; + match r.binary_search_by(|&(lo, hi, _)| { + if lo <= c && c <= hi { Equal } + else if hi < c { Less } + else { Greater } + }) { + Ok(idx) => { + let (_, _, cat) = r[idx]; + Some(cat) + } + Err(_) => None + } +} + +#[inline] +pub fn get_script(c: char) -> Option<Script> { + bsearch_range_value_table(c, SCRIPTS) +} + +#[inline] +pub fn get_script_extension(c: char) -> Option<ScriptExtension> { + bsearch_range_value_table(c, SCRIPT_EXTENSIONS) +} +""") + +def emit_enums(f, script_list, extension_list, longforms, intersections): + """ + Emit the Script and ScriptExtension enums as well as any related utility functions + """ + f.write(""" +use core::convert::TryFrom; +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] +#[non_exhaustive] +#[allow(non_camel_case_types)] +/// A value of the Script property +pub enum Script { + /// Unknown script + Unknown, +""") + for script in script_list: + f.write(" /// %s\n %s,\n" % (script, longforms[script])) + f.write("""} +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] +#[non_exhaustive] +/// A value for the Script_Extension property +/// +/// Script_Extension is one or more Script +/// This is essentially an optimized version of Vec<Script>, +/// optimized by script sets actually present in Unicode. +pub enum ScriptExtension { + /// A single script + Single(Script), +""") + for ext in extension_list: + longform = ", ".join([longforms[s] for s in ext]) + f.write(" /// %s\n %s,\n" % (longform, "".join(ext))) + f.write("""} + +impl From<Script> for ScriptExtension { + fn from(script: Script) -> Self { + ScriptExtension::Single(script) + } +} + +impl TryFrom<ScriptExtension> for Script { + type Error = (); + fn try_from(ext: ScriptExtension) -> Result<Self, ()> { + match ext { + ScriptExtension::Single(s) => Ok(s), + _ => Err(()) + } + } +} + +impl Script { + pub(crate) fn inner_full_name(self) -> &'static str { + match self { + Script::Unknown => "Unknown", +""") + for script in script_list: + f.write(" Script::%s => \"%s\",\n" % (longforms[script], longforms[script])) + f.write(""" } + } + + pub(crate) fn inner_short_name(self) -> &'static str { + match self { + Script::Unknown => "", +""") + for script in script_list: + f.write(" Script::%s => \"%s\",\n" % (longforms[script], script)) + f.write(""" } + } +} + +impl ScriptExtension { + #[inline] + #[cfg(feature = "with_std")] + pub(crate) fn inner_scripts(self) -> Vec<Script> { + match self { + ScriptExtension::Single(s) => vec![s], +""") + for ext in extension_list: + scripts = ", ".join(["Script::%s" % longforms[s] for s in ext]) + f.write(" %s => vec![%s],\n" % (extension_name(ext), scripts)) + f.write(""" _ => unreachable!() + } + } + + #[inline] + pub(crate) fn inner_contains_script(self, other: Script) -> bool { + match self { + ScriptExtension::Single(s) => s == other, +""") + for ext in extension_list: + scripts = " || ".join(["other == Script::%s" % longforms[s] for s in ext]) + f.write(" %s => %s,\n" % (extension_name(ext), scripts)) + f.write(""" } + } + + #[inline] + pub(crate) fn inner_intersect(self, other: Self) -> Self { + match (self, other) { + (ScriptExtension::Single(Script::Unknown), _) | + (_, ScriptExtension::Single(Script::Unknown)) => ScriptExtension::Single(Script::Unknown), + (a, b) if a == b => a, + (ScriptExtension::Single(Script::Common), a) | + (ScriptExtension::Single(Script::Inherited), a) | + (a, ScriptExtension::Single(Script::Common)) | + (a, ScriptExtension::Single(Script::Inherited)) => a, + (ScriptExtension::Single(s), o) | (o, ScriptExtension::Single(s)) if o.inner_contains_script(s) => ScriptExtension::Single(s), +""") + for (e1, e2, i) in intersections: + f.write(" (%s, %s) => %s,\n" % (extension_name(e1), extension_name(e2), extension_name(i, longforms))) + f.write(""" _ => ScriptExtension::Single(Script::Unknown), + } + } +} +""") + + +def compute_intersections_elements(extension_list): + """ + Compute all intersections between the script extensions. + This will add new elements to extension_list, be sure to call it first! + """ + + # This is the only third-level intersection + # It's easier to hardcode things here rather than + # do the below calculation in a loop + extension_list.append(['Deva', 'Knda', 'Tirh']) + intersections = [] + # Some intersections will not exist in extension_list and we'll need to add them + new_elements = [] + sets = [(e, set(e)) for e in extension_list] + for (e1, s1) in sets: + for (e2, s2) in sets: + if e1 == e2: + continue + intersection = s1.intersection(s2) + if len(intersection) > 0: + intersection = [i for i in intersection] + intersection.sort() + if len(intersection) > 1 and intersection not in extension_list and intersection not in new_elements: + new_elements.append(intersection) + if (e1, e2, intersection) not in intersections: + intersections.append((e1, e2, intersection)) + extension_list.extend(new_elements) + + # We now go through the newly added second-level extension values and calculate their intersections + # with the original set and each other + new_sets = [(e, set(e)) for e in new_elements] + sets = [(e, set(e)) for e in extension_list] + for (e1, s1) in new_sets: + for (e2, s2) in sets: + if e1 == e2: + continue + intersection = s1.intersection(s2) + if len(intersection) > 0: + intersection = [i for i in intersection] + intersection.sort() + if len(intersection) > 1 and intersection not in extension_list: + raise "Found new third-level intersection, please hardcode it" + # The previous routine would automatically get both versions + # of an intersection because it would iterate each pair in both orders, + # but here we're working on an asymmetric pair, so we insert both in order to not + # miss anything + if (e1, e2, intersection) not in intersections: + intersections.append((e1, e2, intersection)) + if (e2, e1, intersection) not in intersections: + intersections.append((e2, e1, intersection)) + + intersections.sort() + return intersections + +def extension_name(ext, longforms={}): + """Get the rust source for a given ScriptExtension""" + if len(ext) == 1: + return "ScriptExtension::Single(Script::%s)" % longforms[ext[0]] + else: + return "ScriptExtension::%s" % "".join(ext) + + + + +if __name__ == "__main__": + r = "tables.rs" + if os.path.exists(r): + os.remove(r) + with open(r, "w") as rf: + # write the file's preamble + rf.write(preamble) + rf.write(""" +/// The version of [Unicode](http://www.unicode.org/) +/// that this version of unicode-segmentation is based on. +pub const UNICODE_VERSION: (u64, u64, u64) = (%s, %s, %s); +""" % UNICODE_VERSION) + + + (longforms, shortforms) = aliases() + + scripts = load_properties("Scripts.txt", []) + + script_table = [] + script_list = [] + + for script in scripts: + script_list.append(shortforms[script]) + script_table.extend([(x, y, shortforms[script]) for (x, y) in scripts[script]]) + script_table.sort(key=lambda w: w[0]) + + + extensions = load_properties("ScriptExtensions.txt", []) + extension_table = [] + extension_list = [] + + for ext in extensions: + split = ext.split(" ") + split.sort() + output_ext = [ext] + if len(split) > 1: + extension_list.append(split) + output_ext = split + extension_table.extend([(x, y, output_ext) for (x, y) in extensions[ext]]) + extension_table.sort(key=lambda w: w[0]) + + intersections = compute_intersections_elements(extension_list) + + emit_enums(rf, script_list, extension_list, longforms, intersections) + emit_search(rf) + + emit_table(rf, "SCRIPTS", script_table, t_type = "&'static [(char, char, Script)]", + is_pub=False , pfun=lambda x: "(%s,%s, Script::%s)" % (escape_char(x[0]), escape_char(x[1]), longforms[x[2]])) + emit_table(rf, "SCRIPT_EXTENSIONS", extension_table, t_type = "&'static [(char, char, ScriptExtension)]", + is_pub=False , pfun=lambda x: "(%s,%s,%s)" % (escape_char(x[0]), escape_char(x[1]), extension_name(x[2], longforms))) + + # emit_table(rf, "FOObar", properties) diff --git a/vendor/unicode-script/src/lib.rs b/vendor/unicode-script/src/lib.rs new file mode 100644 index 0000000000..0cab668e87 --- /dev/null +++ b/vendor/unicode-script/src/lib.rs @@ -0,0 +1,103 @@ +//! This crate exposes the Unicode `Script` and `Script_Extension` +//! properties from [UAX #24](http://www.unicode.org/reports/tr24/) + +#![cfg_attr(not(feature = "with_std"), no_std)] + +#[rustfmt::skip] +mod tables; + +pub use tables::{Script, ScriptExtension, UNICODE_VERSION}; + +use tables::{get_script, get_script_extension}; + +impl Script { + /// Get the full name of a script + pub fn full_name(self) -> &'static str { + self.inner_full_name() + } + + /// Get the four-character short name of a script + pub fn short_name(self) -> &'static str { + self.inner_short_name() + } + + /// Is this script "Recommended" according to + /// [UAX #31](www.unicode.org/reports/tr31/#Table_Recommended_Scripts)? + pub fn is_recommended(self) -> bool { + use Script::*; + match self { + Common | Inherited | Arabic | Armenian | Bengali | Bopomofo | Cyrillic | Devanagari + | Ethiopic | Georgian | Greek | Gujarati | Gurmukhi | Han | Hangul | Hebrew + | Hiragana | Kannada | Katakana | Khmer | Lao | Latin | Malayalam | Myanmar | Oriya + | Sinhala | Tamil | Telugu | Thaana | Thai | Tibetan => true, + _ => false, + } + } +} + +impl From<char> for Script { + fn from(o: char) -> Self { + o.script() + } +} + +impl ScriptExtension { + /// Obtain the list of scripts contained inside this ScriptExtension + #[cfg(feature = "with_std")] + pub fn scripts(self) -> Vec<Script> { + self.inner_scripts() + } + + /// Check if this ScriptExtension contains the given script + pub fn contains_script(self, script: Script) -> bool { + self.inner_contains_script(script) + } + + /// Find the intersection between two ScriptExtensions. Returns Unknown if things + /// do not intersect. + /// + /// "Common" (`Zyyy`) and "Inherited" (`Zinh`) are considered as intersecting + /// everything. + pub fn intersection(&mut self, other: Self) -> Self { + self.inner_intersect(other) + } + + /// Intersect this ScriptExtension with another ScriptExtension. Produces Unknown if things + /// do not intersect. This is equivalent to [`ScriptExtension::intersection`] but it stores the result + /// in `self` + /// + /// "Common" (`Zyyy`) and "Inherited" (`Zinh`) are considered as intersecting + /// everything. + pub fn intersect_with(&mut self, other: Self) { + *self = self.inner_intersect(other) + } + + /// Checks if the script extension is empty (unknown) + pub fn is_empty(self) -> bool { + self == ScriptExtension::Single(Script::Unknown) + } +} + +impl From<char> for ScriptExtension { + fn from(o: char) -> Self { + o.script_extension() + } +} + +/// Extension trait on `char` for calculating script properties +pub trait UnicodeScript { + /// Get the script for a given character + fn script(&self) -> Script; + /// Get the Script_Extension for a given character + fn script_extension(&self) -> ScriptExtension; +} + +impl UnicodeScript for char { + fn script(&self) -> Script { + get_script(*self).unwrap_or(Script::Unknown) + } + + fn script_extension(&self) -> ScriptExtension { + get_script_extension(*self).unwrap_or_else(|| ScriptExtension::Single(self.script())) + } +} diff --git a/vendor/unicode-script/src/tables.rs b/vendor/unicode-script/src/tables.rs new file mode 100644 index 0000000000..79d8b392f6 --- /dev/null +++ b/vendor/unicode-script/src/tables.rs @@ -0,0 +1,3526 @@ +// Copyright 2012-2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// NOTE: The following code was generated by "scripts/unicode.py", do not edit directly + +#![allow(missing_docs, non_upper_case_globals, non_snake_case)] + +/// The version of [Unicode](http://www.unicode.org/) +/// that this version of unicode-segmentation is based on. +pub const UNICODE_VERSION: (u64, u64, u64) = (12, 0, 0); + +use core::convert::TryFrom; +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] +#[non_exhaustive] +#[allow(non_camel_case_types)] +/// A value of the Script property +pub enum Script { + /// Unknown script + Unknown, + /// Tang + Tangut, + /// Thaa + Thaana, + /// Adlm + Adlam, + /// Telu + Telugu, + /// Cyrl + Cyrillic, + /// Zanb + Zanabazar_Square, + /// Hang + Hangul, + /// Hmnp + Nyiakeng_Puachue_Hmong, + /// Sarb + Old_South_Arabian, + /// Ethi + Ethiopic, + /// Zinh + Inherited, + /// Merc + Meroitic_Cursive, + /// Bhks + Bhaiksuki, + /// Ahom + Ahom, + /// Hani + Han, + /// Narb + Old_North_Arabian, + /// Armn + Armenian, + /// Taml + Tamil, + /// Bopo + Bopomofo, + /// Bass + Bassa_Vah, + /// Sund + Sundanese, + /// Osge + Osage, + /// Sogo + Old_Sogdian, + /// Tglg + Tagalog, + /// Mlym + Malayalam, + /// Marc + Marchen, + /// Cari + Carian, + /// Hira + Hiragana, + /// Tagb + Tagbanwa, + /// Mtei + Meetei_Mayek, + /// Rohg + Hanifi_Rohingya, + /// Hmng + Pahawh_Hmong, + /// Tale + Tai_Le, + /// Kali + Kayah_Li, + /// Bugi + Buginese, + /// Khar + Kharoshthi, + /// Lana + Tai_Tham, + /// Ital + Old_Italic, + /// Xpeo + Old_Persian, + /// Wara + Warang_Citi, + /// Latn + Latin, + /// Saur + Saurashtra, + /// Shaw + Shavian, + /// Geor + Georgian, + /// Gran + Grantha, + /// Dupl + Duployan, + /// Batk + Batak, + /// Deva + Devanagari, + /// Thai + Thai, + /// Tibt + Tibetan, + /// Tfng + Tifinagh, + /// Elym + Elymaic, + /// Ugar + Ugaritic, + /// Brai + Braille, + /// Hluw + Anatolian_Hieroglyphs, + /// Grek + Greek, + /// Lyci + Lycian, + /// Mend + Mende_Kikakui, + /// Tavt + Tai_Viet, + /// Vaii + Vai, + /// Ogam + Ogham, + /// Prti + Inscriptional_Parthian, + /// Cham + Cham, + /// Syrc + Syriac, + /// Runr + Runic, + /// Goth + Gothic, + /// Mahj + Mahajani, + /// Kana + Katakana, + /// Osma + Osmanya, + /// Talu + New_Tai_Lue, + /// Olck + Ol_Chiki, + /// Newa + Newa, + /// Limb + Limbu, + /// Pauc + Pau_Cin_Hau, + /// Cher + Cherokee, + /// Plrd + Miao, + /// Orya + Oriya, + /// Medf + Medefaidrin, + /// Shrd + Sharada, + /// Gujr + Gujarati, + /// Nshu + Nushu, + /// Modi + Modi, + /// Gong + Gunjala_Gondi, + /// Phli + Inscriptional_Pahlavi, + /// Mani + Manichaean, + /// Khmr + Khmer, + /// Xsux + Cuneiform, + /// Sind + Khudawadi, + /// Mand + Mandaic, + /// Hatr + Hatran, + /// Sylo + Syloti_Nagri, + /// Nkoo + Nko, + /// Cans + Canadian_Aboriginal, + /// Mero + Meroitic_Hieroglyphs, + /// Phnx + Phoenician, + /// Nbat + Nabataean, + /// Wcho + Wancho, + /// Beng + Bengali, + /// Kthi + Kaithi, + /// Glag + Glagolitic, + /// Armi + Imperial_Aramaic, + /// Sora + Sora_Sompeng, + /// Guru + Gurmukhi, + /// Java + Javanese, + /// Perm + Old_Permic, + /// Phag + Phags_Pa, + /// Cprt + Cypriot, + /// Knda + Kannada, + /// Khoj + Khojki, + /// Mong + Mongolian, + /// Sinh + Sinhala, + /// Brah + Brahmi, + /// Elba + Elbasan, + /// Dsrt + Deseret, + /// Rjng + Rejang, + /// Sgnw + SignWriting, + /// Mult + Multani, + /// Yiii + Yi, + /// Bali + Balinese, + /// Laoo + Lao, + /// Hano + Hanunoo, + /// Gonm + Masaram_Gondi, + /// Linb + Linear_B, + /// Lina + Linear_A, + /// Dogr + Dogra, + /// Orkh + Old_Turkic, + /// Lepc + Lepcha, + /// Lydi + Lydian, + /// Egyp + Egyptian_Hieroglyphs, + /// Sogd + Sogdian, + /// Aghb + Caucasian_Albanian, + /// Nand + Nandinagari, + /// Maka + Makasar, + /// Hung + Old_Hungarian, + /// Samr + Samaritan, + /// Lisu + Lisu, + /// Buhd + Buhid, + /// Palm + Palmyrene, + /// Tirh + Tirhuta, + /// Mroo + Mro, + /// Zyyy + Common, + /// Copt + Coptic, + /// Cakm + Chakma, + /// Arab + Arabic, + /// Bamu + Bamum, + /// Mymr + Myanmar, + /// Sidd + Siddham, + /// Soyo + Soyombo, + /// Avst + Avestan, + /// Hebr + Hebrew, + /// Phlp + Psalter_Pahlavi, + /// Takr + Takri, +} +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] +#[non_exhaustive] +/// A value for the Script_Extension property +/// +/// Script_Extension is one or more Script +/// This is essentially an optimized version of Vec<Script>, +/// optimized by script sets actually present in Unicode. +pub enum ScriptExtension { + /// A single script + Single(Script), + /// Devanagari, Grantha + DevaGran, + /// Cypriot, Linear_A, Linear_B + CprtLinaLinb, + /// Arabic, Thaana + ArabThaa, + /// Han, Hiragana, Katakana + HaniHiraKana, + /// Bengali, Devanagari, Dogra, Gunjala_Gondi, Masaram_Gondi, Grantha, Gujarati, Gurmukhi, Kannada, Mahajani, Malayalam, Nandinagari, Oriya, Khudawadi, Sinhala, Syloti_Nagri, Takri, Tamil, Telugu, Tirhuta + BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, + /// Armenian, Georgian + ArmnGeor, + /// Bengali, Devanagari, Grantha, Gujarati, Gurmukhi, Kannada, Latin, Malayalam, Oriya, Sharada, Tamil, Telugu, Tirhuta + BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, + /// Cyrillic, Latin + CyrlLatn, + /// Devanagari, Dogra, Gujarati, Gurmukhi, Khojki, Kannada, Kaithi, Mahajani, Malayalam, Modi, Nandinagari, Khudawadi, Takri, Tirhuta + DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, + /// Arabic, Hanifi_Rohingya + ArabRohg, + /// Devanagari, Dogra, Gujarati, Gurmukhi, Khojki, Kaithi, Mahajani, Modi, Khudawadi, Takri, Tirhuta + DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, + /// Buginese, Javanese + BugiJava, + /// Georgian, Latin + GeorLatn, + /// Arabic, Hanifi_Rohingya, Syriac, Thaana + ArabRohgSyrcThaa, + /// Devanagari, Dogra, Kaithi, Mahajani + DevaDogrKthiMahj, + /// Adlam, Arabic, Mandaic, Manichaean, Psalter_Pahlavi, Hanifi_Rohingya, Sogdian, Syriac + AdlmArabMandManiPhlpRohgSogdSyrc, + /// Kayah_Li, Latin, Myanmar + KaliLatnMymr, + /// Bengali, Devanagari, Grantha, Kannada + BengDevaGranKnda, + /// Devanagari, Tamil + DevaTaml, + /// Kannada, Nandinagari + KndaNand, + /// Bopomofo, Hangul, Han, Hiragana, Katakana + BopoHangHaniHiraKana, + /// Arabic, Syriac, Thaana + ArabSyrcThaa, + /// Devanagari, Grantha, Kannada + DevaGranKnda, + /// Bengali, Chakma, Syloti_Nagri + BengCakmSylo, + /// Gurmukhi, Multani + GuruMult, + /// Devanagari, Kannada, Malayalam, Oriya, Tamil, Telugu + DevaKndaMlymOryaTamlTelu, + /// Gujarati, Khojki + GujrKhoj, + /// Cyrillic, Old_Permic + CyrlPerm, + /// Devanagari, Dogra, Gujarati, Gurmukhi, Khojki, Kannada, Kaithi, Mahajani, Modi, Nandinagari, Khudawadi, Takri, Tirhuta + DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, + /// Hiragana, Katakana + HiraKana, + /// Devanagari, Nandinagari + DevaNand, + /// Cypriot, Linear_B + CprtLinb, + /// Devanagari, Grantha, Latin + DevaGranLatn, + /// Buhid, Hanunoo, Tagbanwa, Tagalog + BuhdHanoTagbTglg, + /// Bengali, Devanagari, Dogra, Gunjala_Gondi, Masaram_Gondi, Grantha, Gujarati, Gurmukhi, Kannada, Limbu, Mahajani, Malayalam, Nandinagari, Oriya, Khudawadi, Sinhala, Syloti_Nagri, Takri, Tamil, Telugu, Tirhuta + BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, + /// Arabic, Syriac + ArabSyrc, + /// Grantha, Tamil + GranTaml, + /// Bopomofo, Hangul, Han, Hiragana, Katakana, Yi + BopoHangHaniHiraKanaYiii, + /// Chakma, Myanmar, Tai_Le + CakmMymrTale, + /// Bengali, Devanagari + BengDeva, + /// Bengali, Devanagari, Grantha, Kannada, Nandinagari, Oriya, Telugu, Tirhuta + BengDevaGranKndaNandOryaTeluTirh, + /// Latin, Mongolian + LatnMong, + /// Bengali, Devanagari, Grantha, Gujarati, Gurmukhi, Kannada, Latin, Malayalam, Oriya, Tamil, Telugu, Tirhuta + BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, + /// Bopomofo, Han + BopoHani, + /// Arabic, Coptic + ArabCopt, + /// Devanagari, Sharada + DevaShrd, + /// Mongolian, Phags_Pa + MongPhag, + /// Cyrillic, Glagolitic + CyrlGlag, + /// Devanagari, Kannada, Tirhuta + DevaKndaTirh, + /// Bengali, Devanagari, Grantha, Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu, Tirhuta + BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + /// Devanagari, Dogra, Gujarati, Gurmukhi, Kannada, Mahajani, Malayalam, Nandinagari, Khudawadi, Takri, Tirhuta + DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + /// Devanagari, Dogra, Gujarati, Gurmukhi, Mahajani, Khudawadi, Takri, Tirhuta + DevaDogrGujrGuruMahjSindTakrTirh, + /// Devanagari, Dogra, Mahajani + DevaDogrMahj, + /// Bengali, Syloti_Nagri + BengSylo, + /// Devanagari, Dogra, Gujarati, Gurmukhi, Kannada, Mahajani, Nandinagari, Khudawadi, Takri, Tirhuta + DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + /// Devanagari, Gujarati, Gurmukhi, Kannada, Malayalam, Tirhuta + DevaGujrGuruKndaMlymTirh, + /// Devanagari, Gujarati, Gurmukhi, Tirhuta + DevaGujrGuruTirh, + /// Devanagari, Gujarati, Gurmukhi, Kannada, Tirhuta + DevaGujrGuruKndaTirh, + /// Bengali, Devanagari, Grantha, Kannada, Oriya, Telugu, Tirhuta + BengDevaGranKndaOryaTeluTirh, + /// Devanagari, Kannada + DevaKnda, + /// Devanagari, Kannada, Malayalam + DevaKndaMlym, + /// Devanagari, Kannada, Nandinagari, Tirhuta + DevaKndaNandTirh, + /// Devanagari, Tirhuta + DevaTirh, + /// Arabic, Hanifi_Rohingya, Syriac + ArabRohgSyrc, + /// Devanagari, Kannada, Oriya, Telugu + DevaKndaOryaTelu, +} + +impl From<Script> for ScriptExtension { + fn from(script: Script) -> Self { + ScriptExtension::Single(script) + } +} + +impl TryFrom<ScriptExtension> for Script { + type Error = (); + fn try_from(ext: ScriptExtension) -> Result<Self, ()> { + match ext { + ScriptExtension::Single(s) => Ok(s), + _ => Err(()) + } + } +} + +impl Script { + pub(crate) fn inner_full_name(self) -> &'static str { + match self { + Script::Unknown => "Unknown", + Script::Tangut => "Tangut", + Script::Thaana => "Thaana", + Script::Adlam => "Adlam", + Script::Telugu => "Telugu", + Script::Cyrillic => "Cyrillic", + Script::Zanabazar_Square => "Zanabazar_Square", + Script::Hangul => "Hangul", + Script::Nyiakeng_Puachue_Hmong => "Nyiakeng_Puachue_Hmong", + Script::Old_South_Arabian => "Old_South_Arabian", + Script::Ethiopic => "Ethiopic", + Script::Inherited => "Inherited", + Script::Meroitic_Cursive => "Meroitic_Cursive", + Script::Bhaiksuki => "Bhaiksuki", + Script::Ahom => "Ahom", + Script::Han => "Han", + Script::Old_North_Arabian => "Old_North_Arabian", + Script::Armenian => "Armenian", + Script::Tamil => "Tamil", + Script::Bopomofo => "Bopomofo", + Script::Bassa_Vah => "Bassa_Vah", + Script::Sundanese => "Sundanese", + Script::Osage => "Osage", + Script::Old_Sogdian => "Old_Sogdian", + Script::Tagalog => "Tagalog", + Script::Malayalam => "Malayalam", + Script::Marchen => "Marchen", + Script::Carian => "Carian", + Script::Hiragana => "Hiragana", + Script::Tagbanwa => "Tagbanwa", + Script::Meetei_Mayek => "Meetei_Mayek", + Script::Hanifi_Rohingya => "Hanifi_Rohingya", + Script::Pahawh_Hmong => "Pahawh_Hmong", + Script::Tai_Le => "Tai_Le", + Script::Kayah_Li => "Kayah_Li", + Script::Buginese => "Buginese", + Script::Kharoshthi => "Kharoshthi", + Script::Tai_Tham => "Tai_Tham", + Script::Old_Italic => "Old_Italic", + Script::Old_Persian => "Old_Persian", + Script::Warang_Citi => "Warang_Citi", + Script::Latin => "Latin", + Script::Saurashtra => "Saurashtra", + Script::Shavian => "Shavian", + Script::Georgian => "Georgian", + Script::Grantha => "Grantha", + Script::Duployan => "Duployan", + Script::Batak => "Batak", + Script::Devanagari => "Devanagari", + Script::Thai => "Thai", + Script::Tibetan => "Tibetan", + Script::Tifinagh => "Tifinagh", + Script::Elymaic => "Elymaic", + Script::Ugaritic => "Ugaritic", + Script::Braille => "Braille", + Script::Anatolian_Hieroglyphs => "Anatolian_Hieroglyphs", + Script::Greek => "Greek", + Script::Lycian => "Lycian", + Script::Mende_Kikakui => "Mende_Kikakui", + Script::Tai_Viet => "Tai_Viet", + Script::Vai => "Vai", + Script::Ogham => "Ogham", + Script::Inscriptional_Parthian => "Inscriptional_Parthian", + Script::Cham => "Cham", + Script::Syriac => "Syriac", + Script::Runic => "Runic", + Script::Gothic => "Gothic", + Script::Mahajani => "Mahajani", + Script::Katakana => "Katakana", + Script::Osmanya => "Osmanya", + Script::New_Tai_Lue => "New_Tai_Lue", + Script::Ol_Chiki => "Ol_Chiki", + Script::Newa => "Newa", + Script::Limbu => "Limbu", + Script::Pau_Cin_Hau => "Pau_Cin_Hau", + Script::Cherokee => "Cherokee", + Script::Miao => "Miao", + Script::Oriya => "Oriya", + Script::Medefaidrin => "Medefaidrin", + Script::Sharada => "Sharada", + Script::Gujarati => "Gujarati", + Script::Nushu => "Nushu", + Script::Modi => "Modi", + Script::Gunjala_Gondi => "Gunjala_Gondi", + Script::Inscriptional_Pahlavi => "Inscriptional_Pahlavi", + Script::Manichaean => "Manichaean", + Script::Khmer => "Khmer", + Script::Cuneiform => "Cuneiform", + Script::Khudawadi => "Khudawadi", + Script::Mandaic => "Mandaic", + Script::Hatran => "Hatran", + Script::Syloti_Nagri => "Syloti_Nagri", + Script::Nko => "Nko", + Script::Canadian_Aboriginal => "Canadian_Aboriginal", + Script::Meroitic_Hieroglyphs => "Meroitic_Hieroglyphs", + Script::Phoenician => "Phoenician", + Script::Nabataean => "Nabataean", + Script::Wancho => "Wancho", + Script::Bengali => "Bengali", + Script::Kaithi => "Kaithi", + Script::Glagolitic => "Glagolitic", + Script::Imperial_Aramaic => "Imperial_Aramaic", + Script::Sora_Sompeng => "Sora_Sompeng", + Script::Gurmukhi => "Gurmukhi", + Script::Javanese => "Javanese", + Script::Old_Permic => "Old_Permic", + Script::Phags_Pa => "Phags_Pa", + Script::Cypriot => "Cypriot", + Script::Kannada => "Kannada", + Script::Khojki => "Khojki", + Script::Mongolian => "Mongolian", + Script::Sinhala => "Sinhala", + Script::Brahmi => "Brahmi", + Script::Elbasan => "Elbasan", + Script::Deseret => "Deseret", + Script::Rejang => "Rejang", + Script::SignWriting => "SignWriting", + Script::Multani => "Multani", + Script::Yi => "Yi", + Script::Balinese => "Balinese", + Script::Lao => "Lao", + Script::Hanunoo => "Hanunoo", + Script::Masaram_Gondi => "Masaram_Gondi", + Script::Linear_B => "Linear_B", + Script::Linear_A => "Linear_A", + Script::Dogra => "Dogra", + Script::Old_Turkic => "Old_Turkic", + Script::Lepcha => "Lepcha", + Script::Lydian => "Lydian", + Script::Egyptian_Hieroglyphs => "Egyptian_Hieroglyphs", + Script::Sogdian => "Sogdian", + Script::Caucasian_Albanian => "Caucasian_Albanian", + Script::Nandinagari => "Nandinagari", + Script::Makasar => "Makasar", + Script::Old_Hungarian => "Old_Hungarian", + Script::Samaritan => "Samaritan", + Script::Lisu => "Lisu", + Script::Buhid => "Buhid", + Script::Palmyrene => "Palmyrene", + Script::Tirhuta => "Tirhuta", + Script::Mro => "Mro", + Script::Common => "Common", + Script::Coptic => "Coptic", + Script::Chakma => "Chakma", + Script::Arabic => "Arabic", + Script::Bamum => "Bamum", + Script::Myanmar => "Myanmar", + Script::Siddham => "Siddham", + Script::Soyombo => "Soyombo", + Script::Avestan => "Avestan", + Script::Hebrew => "Hebrew", + Script::Psalter_Pahlavi => "Psalter_Pahlavi", + Script::Takri => "Takri", + } + } + + pub(crate) fn inner_short_name(self) -> &'static str { + match self { + Script::Unknown => "", + Script::Tangut => "Tang", + Script::Thaana => "Thaa", + Script::Adlam => "Adlm", + Script::Telugu => "Telu", + Script::Cyrillic => "Cyrl", + Script::Zanabazar_Square => "Zanb", + Script::Hangul => "Hang", + Script::Nyiakeng_Puachue_Hmong => "Hmnp", + Script::Old_South_Arabian => "Sarb", + Script::Ethiopic => "Ethi", + Script::Inherited => "Zinh", + Script::Meroitic_Cursive => "Merc", + Script::Bhaiksuki => "Bhks", + Script::Ahom => "Ahom", + Script::Han => "Hani", + Script::Old_North_Arabian => "Narb", + Script::Armenian => "Armn", + Script::Tamil => "Taml", + Script::Bopomofo => "Bopo", + Script::Bassa_Vah => "Bass", + Script::Sundanese => "Sund", + Script::Osage => "Osge", + Script::Old_Sogdian => "Sogo", + Script::Tagalog => "Tglg", + Script::Malayalam => "Mlym", + Script::Marchen => "Marc", + Script::Carian => "Cari", + Script::Hiragana => "Hira", + Script::Tagbanwa => "Tagb", + Script::Meetei_Mayek => "Mtei", + Script::Hanifi_Rohingya => "Rohg", + Script::Pahawh_Hmong => "Hmng", + Script::Tai_Le => "Tale", + Script::Kayah_Li => "Kali", + Script::Buginese => "Bugi", + Script::Kharoshthi => "Khar", + Script::Tai_Tham => "Lana", + Script::Old_Italic => "Ital", + Script::Old_Persian => "Xpeo", + Script::Warang_Citi => "Wara", + Script::Latin => "Latn", + Script::Saurashtra => "Saur", + Script::Shavian => "Shaw", + Script::Georgian => "Geor", + Script::Grantha => "Gran", + Script::Duployan => "Dupl", + Script::Batak => "Batk", + Script::Devanagari => "Deva", + Script::Thai => "Thai", + Script::Tibetan => "Tibt", + Script::Tifinagh => "Tfng", + Script::Elymaic => "Elym", + Script::Ugaritic => "Ugar", + Script::Braille => "Brai", + Script::Anatolian_Hieroglyphs => "Hluw", + Script::Greek => "Grek", + Script::Lycian => "Lyci", + Script::Mende_Kikakui => "Mend", + Script::Tai_Viet => "Tavt", + Script::Vai => "Vaii", + Script::Ogham => "Ogam", + Script::Inscriptional_Parthian => "Prti", + Script::Cham => "Cham", + Script::Syriac => "Syrc", + Script::Runic => "Runr", + Script::Gothic => "Goth", + Script::Mahajani => "Mahj", + Script::Katakana => "Kana", + Script::Osmanya => "Osma", + Script::New_Tai_Lue => "Talu", + Script::Ol_Chiki => "Olck", + Script::Newa => "Newa", + Script::Limbu => "Limb", + Script::Pau_Cin_Hau => "Pauc", + Script::Cherokee => "Cher", + Script::Miao => "Plrd", + Script::Oriya => "Orya", + Script::Medefaidrin => "Medf", + Script::Sharada => "Shrd", + Script::Gujarati => "Gujr", + Script::Nushu => "Nshu", + Script::Modi => "Modi", + Script::Gunjala_Gondi => "Gong", + Script::Inscriptional_Pahlavi => "Phli", + Script::Manichaean => "Mani", + Script::Khmer => "Khmr", + Script::Cuneiform => "Xsux", + Script::Khudawadi => "Sind", + Script::Mandaic => "Mand", + Script::Hatran => "Hatr", + Script::Syloti_Nagri => "Sylo", + Script::Nko => "Nkoo", + Script::Canadian_Aboriginal => "Cans", + Script::Meroitic_Hieroglyphs => "Mero", + Script::Phoenician => "Phnx", + Script::Nabataean => "Nbat", + Script::Wancho => "Wcho", + Script::Bengali => "Beng", + Script::Kaithi => "Kthi", + Script::Glagolitic => "Glag", + Script::Imperial_Aramaic => "Armi", + Script::Sora_Sompeng => "Sora", + Script::Gurmukhi => "Guru", + Script::Javanese => "Java", + Script::Old_Permic => "Perm", + Script::Phags_Pa => "Phag", + Script::Cypriot => "Cprt", + Script::Kannada => "Knda", + Script::Khojki => "Khoj", + Script::Mongolian => "Mong", + Script::Sinhala => "Sinh", + Script::Brahmi => "Brah", + Script::Elbasan => "Elba", + Script::Deseret => "Dsrt", + Script::Rejang => "Rjng", + Script::SignWriting => "Sgnw", + Script::Multani => "Mult", + Script::Yi => "Yiii", + Script::Balinese => "Bali", + Script::Lao => "Laoo", + Script::Hanunoo => "Hano", + Script::Masaram_Gondi => "Gonm", + Script::Linear_B => "Linb", + Script::Linear_A => "Lina", + Script::Dogra => "Dogr", + Script::Old_Turkic => "Orkh", + Script::Lepcha => "Lepc", + Script::Lydian => "Lydi", + Script::Egyptian_Hieroglyphs => "Egyp", + Script::Sogdian => "Sogd", + Script::Caucasian_Albanian => "Aghb", + Script::Nandinagari => "Nand", + Script::Makasar => "Maka", + Script::Old_Hungarian => "Hung", + Script::Samaritan => "Samr", + Script::Lisu => "Lisu", + Script::Buhid => "Buhd", + Script::Palmyrene => "Palm", + Script::Tirhuta => "Tirh", + Script::Mro => "Mroo", + Script::Common => "Zyyy", + Script::Coptic => "Copt", + Script::Chakma => "Cakm", + Script::Arabic => "Arab", + Script::Bamum => "Bamu", + Script::Myanmar => "Mymr", + Script::Siddham => "Sidd", + Script::Soyombo => "Soyo", + Script::Avestan => "Avst", + Script::Hebrew => "Hebr", + Script::Psalter_Pahlavi => "Phlp", + Script::Takri => "Takr", + } + } +} + +impl ScriptExtension { + #[inline] + #[cfg(feature = "with_std")] + pub(crate) fn inner_scripts(self) -> Vec<Script> { + match self { + ScriptExtension::Single(s) => vec![s], + ScriptExtension::DevaGran => vec![Script::Devanagari, Script::Grantha], + ScriptExtension::CprtLinaLinb => vec![Script::Cypriot, Script::Linear_A, Script::Linear_B], + ScriptExtension::ArabThaa => vec![Script::Arabic, Script::Thaana], + ScriptExtension::HaniHiraKana => vec![Script::Han, Script::Hiragana, Script::Katakana], + ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh => vec![Script::Bengali, Script::Devanagari, Script::Dogra, Script::Gunjala_Gondi, Script::Masaram_Gondi, Script::Grantha, Script::Gujarati, Script::Gurmukhi, Script::Kannada, Script::Mahajani, Script::Malayalam, Script::Nandinagari, Script::Oriya, Script::Khudawadi, Script::Sinhala, Script::Syloti_Nagri, Script::Takri, Script::Tamil, Script::Telugu, Script::Tirhuta], + ScriptExtension::ArmnGeor => vec![Script::Armenian, Script::Georgian], + ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh => vec![Script::Bengali, Script::Devanagari, Script::Grantha, Script::Gujarati, Script::Gurmukhi, Script::Kannada, Script::Latin, Script::Malayalam, Script::Oriya, Script::Sharada, Script::Tamil, Script::Telugu, Script::Tirhuta], + ScriptExtension::CyrlLatn => vec![Script::Cyrillic, Script::Latin], + ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh => vec![Script::Devanagari, Script::Dogra, Script::Gujarati, Script::Gurmukhi, Script::Khojki, Script::Kannada, Script::Kaithi, Script::Mahajani, Script::Malayalam, Script::Modi, Script::Nandinagari, Script::Khudawadi, Script::Takri, Script::Tirhuta], + ScriptExtension::ArabRohg => vec![Script::Arabic, Script::Hanifi_Rohingya], + ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh => vec![Script::Devanagari, Script::Dogra, Script::Gujarati, Script::Gurmukhi, Script::Khojki, Script::Kaithi, Script::Mahajani, Script::Modi, Script::Khudawadi, Script::Takri, Script::Tirhuta], + ScriptExtension::BugiJava => vec![Script::Buginese, Script::Javanese], + ScriptExtension::GeorLatn => vec![Script::Georgian, Script::Latin], + ScriptExtension::ArabRohgSyrcThaa => vec![Script::Arabic, Script::Hanifi_Rohingya, Script::Syriac, Script::Thaana], + ScriptExtension::DevaDogrKthiMahj => vec![Script::Devanagari, Script::Dogra, Script::Kaithi, Script::Mahajani], + ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc => vec![Script::Adlam, Script::Arabic, Script::Mandaic, Script::Manichaean, Script::Psalter_Pahlavi, Script::Hanifi_Rohingya, Script::Sogdian, Script::Syriac], + ScriptExtension::KaliLatnMymr => vec![Script::Kayah_Li, Script::Latin, Script::Myanmar], + ScriptExtension::BengDevaGranKnda => vec![Script::Bengali, Script::Devanagari, Script::Grantha, Script::Kannada], + ScriptExtension::DevaTaml => vec![Script::Devanagari, Script::Tamil], + ScriptExtension::KndaNand => vec![Script::Kannada, Script::Nandinagari], + ScriptExtension::BopoHangHaniHiraKana => vec![Script::Bopomofo, Script::Hangul, Script::Han, Script::Hiragana, Script::Katakana], + ScriptExtension::ArabSyrcThaa => vec![Script::Arabic, Script::Syriac, Script::Thaana], + ScriptExtension::DevaGranKnda => vec![Script::Devanagari, Script::Grantha, Script::Kannada], + ScriptExtension::BengCakmSylo => vec![Script::Bengali, Script::Chakma, Script::Syloti_Nagri], + ScriptExtension::GuruMult => vec![Script::Gurmukhi, Script::Multani], + ScriptExtension::DevaKndaMlymOryaTamlTelu => vec![Script::Devanagari, Script::Kannada, Script::Malayalam, Script::Oriya, Script::Tamil, Script::Telugu], + ScriptExtension::GujrKhoj => vec![Script::Gujarati, Script::Khojki], + ScriptExtension::CyrlPerm => vec![Script::Cyrillic, Script::Old_Permic], + ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh => vec![Script::Devanagari, Script::Dogra, Script::Gujarati, Script::Gurmukhi, Script::Khojki, Script::Kannada, Script::Kaithi, Script::Mahajani, Script::Modi, Script::Nandinagari, Script::Khudawadi, Script::Takri, Script::Tirhuta], + ScriptExtension::HiraKana => vec![Script::Hiragana, Script::Katakana], + ScriptExtension::DevaNand => vec![Script::Devanagari, Script::Nandinagari], + ScriptExtension::CprtLinb => vec![Script::Cypriot, Script::Linear_B], + ScriptExtension::DevaGranLatn => vec![Script::Devanagari, Script::Grantha, Script::Latin], + ScriptExtension::BuhdHanoTagbTglg => vec![Script::Buhid, Script::Hanunoo, Script::Tagbanwa, Script::Tagalog], + ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh => vec![Script::Bengali, Script::Devanagari, Script::Dogra, Script::Gunjala_Gondi, Script::Masaram_Gondi, Script::Grantha, Script::Gujarati, Script::Gurmukhi, Script::Kannada, Script::Limbu, Script::Mahajani, Script::Malayalam, Script::Nandinagari, Script::Oriya, Script::Khudawadi, Script::Sinhala, Script::Syloti_Nagri, Script::Takri, Script::Tamil, Script::Telugu, Script::Tirhuta], + ScriptExtension::ArabSyrc => vec![Script::Arabic, Script::Syriac], + ScriptExtension::GranTaml => vec![Script::Grantha, Script::Tamil], + ScriptExtension::BopoHangHaniHiraKanaYiii => vec![Script::Bopomofo, Script::Hangul, Script::Han, Script::Hiragana, Script::Katakana, Script::Yi], + ScriptExtension::CakmMymrTale => vec![Script::Chakma, Script::Myanmar, Script::Tai_Le], + ScriptExtension::BengDeva => vec![Script::Bengali, Script::Devanagari], + ScriptExtension::BengDevaGranKndaNandOryaTeluTirh => vec![Script::Bengali, Script::Devanagari, Script::Grantha, Script::Kannada, Script::Nandinagari, Script::Oriya, Script::Telugu, Script::Tirhuta], + ScriptExtension::LatnMong => vec![Script::Latin, Script::Mongolian], + ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh => vec![Script::Bengali, Script::Devanagari, Script::Grantha, Script::Gujarati, Script::Gurmukhi, Script::Kannada, Script::Latin, Script::Malayalam, Script::Oriya, Script::Tamil, Script::Telugu, Script::Tirhuta], + ScriptExtension::BopoHani => vec![Script::Bopomofo, Script::Han], + ScriptExtension::ArabCopt => vec![Script::Arabic, Script::Coptic], + ScriptExtension::DevaShrd => vec![Script::Devanagari, Script::Sharada], + ScriptExtension::MongPhag => vec![Script::Mongolian, Script::Phags_Pa], + ScriptExtension::CyrlGlag => vec![Script::Cyrillic, Script::Glagolitic], + ScriptExtension::DevaKndaTirh => vec![Script::Devanagari, Script::Kannada, Script::Tirhuta], + ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh => vec![Script::Bengali, Script::Devanagari, Script::Grantha, Script::Gujarati, Script::Gurmukhi, Script::Kannada, Script::Malayalam, Script::Oriya, Script::Tamil, Script::Telugu, Script::Tirhuta], + ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh => vec![Script::Devanagari, Script::Dogra, Script::Gujarati, Script::Gurmukhi, Script::Kannada, Script::Mahajani, Script::Malayalam, Script::Nandinagari, Script::Khudawadi, Script::Takri, Script::Tirhuta], + ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh => vec![Script::Devanagari, Script::Dogra, Script::Gujarati, Script::Gurmukhi, Script::Mahajani, Script::Khudawadi, Script::Takri, Script::Tirhuta], + ScriptExtension::DevaDogrMahj => vec![Script::Devanagari, Script::Dogra, Script::Mahajani], + ScriptExtension::BengSylo => vec![Script::Bengali, Script::Syloti_Nagri], + ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh => vec![Script::Devanagari, Script::Dogra, Script::Gujarati, Script::Gurmukhi, Script::Kannada, Script::Mahajani, Script::Nandinagari, Script::Khudawadi, Script::Takri, Script::Tirhuta], + ScriptExtension::DevaGujrGuruKndaMlymTirh => vec![Script::Devanagari, Script::Gujarati, Script::Gurmukhi, Script::Kannada, Script::Malayalam, Script::Tirhuta], + ScriptExtension::DevaGujrGuruTirh => vec![Script::Devanagari, Script::Gujarati, Script::Gurmukhi, Script::Tirhuta], + ScriptExtension::DevaGujrGuruKndaTirh => vec![Script::Devanagari, Script::Gujarati, Script::Gurmukhi, Script::Kannada, Script::Tirhuta], + ScriptExtension::BengDevaGranKndaOryaTeluTirh => vec![Script::Bengali, Script::Devanagari, Script::Grantha, Script::Kannada, Script::Oriya, Script::Telugu, Script::Tirhuta], + ScriptExtension::DevaKnda => vec![Script::Devanagari, Script::Kannada], + ScriptExtension::DevaKndaMlym => vec![Script::Devanagari, Script::Kannada, Script::Malayalam], + ScriptExtension::DevaKndaNandTirh => vec![Script::Devanagari, Script::Kannada, Script::Nandinagari, Script::Tirhuta], + ScriptExtension::DevaTirh => vec![Script::Devanagari, Script::Tirhuta], + ScriptExtension::ArabRohgSyrc => vec![Script::Arabic, Script::Hanifi_Rohingya, Script::Syriac], + ScriptExtension::DevaKndaOryaTelu => vec![Script::Devanagari, Script::Kannada, Script::Oriya, Script::Telugu], + _ => unreachable!() + } + } + + #[inline] + pub(crate) fn inner_contains_script(self, other: Script) -> bool { + match self { + ScriptExtension::Single(s) => s == other, + ScriptExtension::DevaGran => other == Script::Devanagari || other == Script::Grantha, + ScriptExtension::CprtLinaLinb => other == Script::Cypriot || other == Script::Linear_A || other == Script::Linear_B, + ScriptExtension::ArabThaa => other == Script::Arabic || other == Script::Thaana, + ScriptExtension::HaniHiraKana => other == Script::Han || other == Script::Hiragana || other == Script::Katakana, + ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh => other == Script::Bengali || other == Script::Devanagari || other == Script::Dogra || other == Script::Gunjala_Gondi || other == Script::Masaram_Gondi || other == Script::Grantha || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Kannada || other == Script::Mahajani || other == Script::Malayalam || other == Script::Nandinagari || other == Script::Oriya || other == Script::Khudawadi || other == Script::Sinhala || other == Script::Syloti_Nagri || other == Script::Takri || other == Script::Tamil || other == Script::Telugu || other == Script::Tirhuta, + ScriptExtension::ArmnGeor => other == Script::Armenian || other == Script::Georgian, + ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh => other == Script::Bengali || other == Script::Devanagari || other == Script::Grantha || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Kannada || other == Script::Latin || other == Script::Malayalam || other == Script::Oriya || other == Script::Sharada || other == Script::Tamil || other == Script::Telugu || other == Script::Tirhuta, + ScriptExtension::CyrlLatn => other == Script::Cyrillic || other == Script::Latin, + ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh => other == Script::Devanagari || other == Script::Dogra || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Khojki || other == Script::Kannada || other == Script::Kaithi || other == Script::Mahajani || other == Script::Malayalam || other == Script::Modi || other == Script::Nandinagari || other == Script::Khudawadi || other == Script::Takri || other == Script::Tirhuta, + ScriptExtension::ArabRohg => other == Script::Arabic || other == Script::Hanifi_Rohingya, + ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh => other == Script::Devanagari || other == Script::Dogra || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Khojki || other == Script::Kaithi || other == Script::Mahajani || other == Script::Modi || other == Script::Khudawadi || other == Script::Takri || other == Script::Tirhuta, + ScriptExtension::BugiJava => other == Script::Buginese || other == Script::Javanese, + ScriptExtension::GeorLatn => other == Script::Georgian || other == Script::Latin, + ScriptExtension::ArabRohgSyrcThaa => other == Script::Arabic || other == Script::Hanifi_Rohingya || other == Script::Syriac || other == Script::Thaana, + ScriptExtension::DevaDogrKthiMahj => other == Script::Devanagari || other == Script::Dogra || other == Script::Kaithi || other == Script::Mahajani, + ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc => other == Script::Adlam || other == Script::Arabic || other == Script::Mandaic || other == Script::Manichaean || other == Script::Psalter_Pahlavi || other == Script::Hanifi_Rohingya || other == Script::Sogdian || other == Script::Syriac, + ScriptExtension::KaliLatnMymr => other == Script::Kayah_Li || other == Script::Latin || other == Script::Myanmar, + ScriptExtension::BengDevaGranKnda => other == Script::Bengali || other == Script::Devanagari || other == Script::Grantha || other == Script::Kannada, + ScriptExtension::DevaTaml => other == Script::Devanagari || other == Script::Tamil, + ScriptExtension::KndaNand => other == Script::Kannada || other == Script::Nandinagari, + ScriptExtension::BopoHangHaniHiraKana => other == Script::Bopomofo || other == Script::Hangul || other == Script::Han || other == Script::Hiragana || other == Script::Katakana, + ScriptExtension::ArabSyrcThaa => other == Script::Arabic || other == Script::Syriac || other == Script::Thaana, + ScriptExtension::DevaGranKnda => other == Script::Devanagari || other == Script::Grantha || other == Script::Kannada, + ScriptExtension::BengCakmSylo => other == Script::Bengali || other == Script::Chakma || other == Script::Syloti_Nagri, + ScriptExtension::GuruMult => other == Script::Gurmukhi || other == Script::Multani, + ScriptExtension::DevaKndaMlymOryaTamlTelu => other == Script::Devanagari || other == Script::Kannada || other == Script::Malayalam || other == Script::Oriya || other == Script::Tamil || other == Script::Telugu, + ScriptExtension::GujrKhoj => other == Script::Gujarati || other == Script::Khojki, + ScriptExtension::CyrlPerm => other == Script::Cyrillic || other == Script::Old_Permic, + ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh => other == Script::Devanagari || other == Script::Dogra || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Khojki || other == Script::Kannada || other == Script::Kaithi || other == Script::Mahajani || other == Script::Modi || other == Script::Nandinagari || other == Script::Khudawadi || other == Script::Takri || other == Script::Tirhuta, + ScriptExtension::HiraKana => other == Script::Hiragana || other == Script::Katakana, + ScriptExtension::DevaNand => other == Script::Devanagari || other == Script::Nandinagari, + ScriptExtension::CprtLinb => other == Script::Cypriot || other == Script::Linear_B, + ScriptExtension::DevaGranLatn => other == Script::Devanagari || other == Script::Grantha || other == Script::Latin, + ScriptExtension::BuhdHanoTagbTglg => other == Script::Buhid || other == Script::Hanunoo || other == Script::Tagbanwa || other == Script::Tagalog, + ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh => other == Script::Bengali || other == Script::Devanagari || other == Script::Dogra || other == Script::Gunjala_Gondi || other == Script::Masaram_Gondi || other == Script::Grantha || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Kannada || other == Script::Limbu || other == Script::Mahajani || other == Script::Malayalam || other == Script::Nandinagari || other == Script::Oriya || other == Script::Khudawadi || other == Script::Sinhala || other == Script::Syloti_Nagri || other == Script::Takri || other == Script::Tamil || other == Script::Telugu || other == Script::Tirhuta, + ScriptExtension::ArabSyrc => other == Script::Arabic || other == Script::Syriac, + ScriptExtension::GranTaml => other == Script::Grantha || other == Script::Tamil, + ScriptExtension::BopoHangHaniHiraKanaYiii => other == Script::Bopomofo || other == Script::Hangul || other == Script::Han || other == Script::Hiragana || other == Script::Katakana || other == Script::Yi, + ScriptExtension::CakmMymrTale => other == Script::Chakma || other == Script::Myanmar || other == Script::Tai_Le, + ScriptExtension::BengDeva => other == Script::Bengali || other == Script::Devanagari, + ScriptExtension::BengDevaGranKndaNandOryaTeluTirh => other == Script::Bengali || other == Script::Devanagari || other == Script::Grantha || other == Script::Kannada || other == Script::Nandinagari || other == Script::Oriya || other == Script::Telugu || other == Script::Tirhuta, + ScriptExtension::LatnMong => other == Script::Latin || other == Script::Mongolian, + ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh => other == Script::Bengali || other == Script::Devanagari || other == Script::Grantha || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Kannada || other == Script::Latin || other == Script::Malayalam || other == Script::Oriya || other == Script::Tamil || other == Script::Telugu || other == Script::Tirhuta, + ScriptExtension::BopoHani => other == Script::Bopomofo || other == Script::Han, + ScriptExtension::ArabCopt => other == Script::Arabic || other == Script::Coptic, + ScriptExtension::DevaShrd => other == Script::Devanagari || other == Script::Sharada, + ScriptExtension::MongPhag => other == Script::Mongolian || other == Script::Phags_Pa, + ScriptExtension::CyrlGlag => other == Script::Cyrillic || other == Script::Glagolitic, + ScriptExtension::DevaKndaTirh => other == Script::Devanagari || other == Script::Kannada || other == Script::Tirhuta, + ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh => other == Script::Bengali || other == Script::Devanagari || other == Script::Grantha || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Kannada || other == Script::Malayalam || other == Script::Oriya || other == Script::Tamil || other == Script::Telugu || other == Script::Tirhuta, + ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh => other == Script::Devanagari || other == Script::Dogra || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Kannada || other == Script::Mahajani || other == Script::Malayalam || other == Script::Nandinagari || other == Script::Khudawadi || other == Script::Takri || other == Script::Tirhuta, + ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh => other == Script::Devanagari || other == Script::Dogra || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Mahajani || other == Script::Khudawadi || other == Script::Takri || other == Script::Tirhuta, + ScriptExtension::DevaDogrMahj => other == Script::Devanagari || other == Script::Dogra || other == Script::Mahajani, + ScriptExtension::BengSylo => other == Script::Bengali || other == Script::Syloti_Nagri, + ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh => other == Script::Devanagari || other == Script::Dogra || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Kannada || other == Script::Mahajani || other == Script::Nandinagari || other == Script::Khudawadi || other == Script::Takri || other == Script::Tirhuta, + ScriptExtension::DevaGujrGuruKndaMlymTirh => other == Script::Devanagari || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Kannada || other == Script::Malayalam || other == Script::Tirhuta, + ScriptExtension::DevaGujrGuruTirh => other == Script::Devanagari || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Tirhuta, + ScriptExtension::DevaGujrGuruKndaTirh => other == Script::Devanagari || other == Script::Gujarati || other == Script::Gurmukhi || other == Script::Kannada || other == Script::Tirhuta, + ScriptExtension::BengDevaGranKndaOryaTeluTirh => other == Script::Bengali || other == Script::Devanagari || other == Script::Grantha || other == Script::Kannada || other == Script::Oriya || other == Script::Telugu || other == Script::Tirhuta, + ScriptExtension::DevaKnda => other == Script::Devanagari || other == Script::Kannada, + ScriptExtension::DevaKndaMlym => other == Script::Devanagari || other == Script::Kannada || other == Script::Malayalam, + ScriptExtension::DevaKndaNandTirh => other == Script::Devanagari || other == Script::Kannada || other == Script::Nandinagari || other == Script::Tirhuta, + ScriptExtension::DevaTirh => other == Script::Devanagari || other == Script::Tirhuta, + ScriptExtension::ArabRohgSyrc => other == Script::Arabic || other == Script::Hanifi_Rohingya || other == Script::Syriac, + ScriptExtension::DevaKndaOryaTelu => other == Script::Devanagari || other == Script::Kannada || other == Script::Oriya || other == Script::Telugu, + } + } + + #[inline] + pub(crate) fn inner_intersect(self, other: Self) -> Self { + match (self, other) { + (ScriptExtension::Single(Script::Unknown), _) | + (_, ScriptExtension::Single(Script::Unknown)) => ScriptExtension::Single(Script::Unknown), + (a, b) if a == b => a, + (ScriptExtension::Single(Script::Common), a) | + (ScriptExtension::Single(Script::Inherited), a) | + (a, ScriptExtension::Single(Script::Common)) | + (a, ScriptExtension::Single(Script::Inherited)) => a, + (ScriptExtension::Single(s), o) | (o, ScriptExtension::Single(s)) if o.inner_contains_script(s) => ScriptExtension::Single(s), + (ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc, ScriptExtension::ArabCopt) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc, ScriptExtension::ArabRohg) => ScriptExtension::ArabRohg, + (ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc, ScriptExtension::ArabRohgSyrc) => ScriptExtension::ArabRohgSyrc, + (ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc, ScriptExtension::ArabRohgSyrcThaa) => ScriptExtension::ArabRohgSyrc, + (ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc, ScriptExtension::ArabSyrc) => ScriptExtension::ArabSyrc, + (ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc, ScriptExtension::ArabSyrcThaa) => ScriptExtension::ArabSyrc, + (ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc, ScriptExtension::ArabThaa) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabCopt, ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabCopt, ScriptExtension::ArabRohg) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabCopt, ScriptExtension::ArabRohgSyrc) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabCopt, ScriptExtension::ArabRohgSyrcThaa) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabCopt, ScriptExtension::ArabSyrc) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabCopt, ScriptExtension::ArabSyrcThaa) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabCopt, ScriptExtension::ArabThaa) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabRohg, ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc) => ScriptExtension::ArabRohg, + (ScriptExtension::ArabRohg, ScriptExtension::ArabCopt) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabRohg, ScriptExtension::ArabRohgSyrc) => ScriptExtension::ArabRohg, + (ScriptExtension::ArabRohg, ScriptExtension::ArabRohgSyrcThaa) => ScriptExtension::ArabRohg, + (ScriptExtension::ArabRohg, ScriptExtension::ArabSyrc) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabRohg, ScriptExtension::ArabSyrcThaa) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabRohg, ScriptExtension::ArabThaa) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabRohgSyrc, ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc) => ScriptExtension::ArabRohgSyrc, + (ScriptExtension::ArabRohgSyrc, ScriptExtension::ArabCopt) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabRohgSyrc, ScriptExtension::ArabRohg) => ScriptExtension::ArabRohg, + (ScriptExtension::ArabRohgSyrc, ScriptExtension::ArabRohgSyrcThaa) => ScriptExtension::ArabRohgSyrc, + (ScriptExtension::ArabRohgSyrc, ScriptExtension::ArabSyrc) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabRohgSyrc, ScriptExtension::ArabSyrcThaa) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabRohgSyrc, ScriptExtension::ArabThaa) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabRohgSyrcThaa, ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc) => ScriptExtension::ArabRohgSyrc, + (ScriptExtension::ArabRohgSyrcThaa, ScriptExtension::ArabCopt) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabRohgSyrcThaa, ScriptExtension::ArabRohg) => ScriptExtension::ArabRohg, + (ScriptExtension::ArabRohgSyrcThaa, ScriptExtension::ArabRohgSyrc) => ScriptExtension::ArabRohgSyrc, + (ScriptExtension::ArabRohgSyrcThaa, ScriptExtension::ArabSyrc) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabRohgSyrcThaa, ScriptExtension::ArabSyrcThaa) => ScriptExtension::ArabSyrcThaa, + (ScriptExtension::ArabRohgSyrcThaa, ScriptExtension::ArabThaa) => ScriptExtension::ArabThaa, + (ScriptExtension::ArabSyrc, ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabSyrc, ScriptExtension::ArabCopt) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabSyrc, ScriptExtension::ArabRohg) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabSyrc, ScriptExtension::ArabRohgSyrc) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabSyrc, ScriptExtension::ArabRohgSyrcThaa) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabSyrc, ScriptExtension::ArabSyrcThaa) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabSyrc, ScriptExtension::ArabThaa) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabSyrcThaa, ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabSyrcThaa, ScriptExtension::ArabCopt) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabSyrcThaa, ScriptExtension::ArabRohg) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabSyrcThaa, ScriptExtension::ArabRohgSyrc) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabSyrcThaa, ScriptExtension::ArabRohgSyrcThaa) => ScriptExtension::ArabSyrcThaa, + (ScriptExtension::ArabSyrcThaa, ScriptExtension::ArabSyrc) => ScriptExtension::ArabSyrc, + (ScriptExtension::ArabSyrcThaa, ScriptExtension::ArabThaa) => ScriptExtension::ArabThaa, + (ScriptExtension::ArabThaa, ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabThaa, ScriptExtension::ArabCopt) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabThaa, ScriptExtension::ArabRohg) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabThaa, ScriptExtension::ArabRohgSyrc) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabThaa, ScriptExtension::ArabRohgSyrcThaa) => ScriptExtension::ArabThaa, + (ScriptExtension::ArabThaa, ScriptExtension::ArabSyrc) => ScriptExtension::Single(Script::Arabic), + (ScriptExtension::ArabThaa, ScriptExtension::ArabSyrcThaa) => ScriptExtension::ArabThaa, + (ScriptExtension::ArmnGeor, ScriptExtension::GeorLatn) => ScriptExtension::Single(Script::Georgian), + (ScriptExtension::BengCakmSylo, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengCakmSylo, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengSylo, + (ScriptExtension::BengCakmSylo, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengSylo, + (ScriptExtension::BengCakmSylo, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengCakmSylo, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengCakmSylo, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengCakmSylo, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengCakmSylo, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengCakmSylo, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengCakmSylo, ScriptExtension::BengSylo) => ScriptExtension::BengSylo, + (ScriptExtension::BengCakmSylo, ScriptExtension::CakmMymrTale) => ScriptExtension::Single(Script::Chakma), + (ScriptExtension::BengDeva, ScriptExtension::BengCakmSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDeva, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDeva, + (ScriptExtension::BengDeva, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDeva, + (ScriptExtension::BengDeva, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::BengDeva, + (ScriptExtension::BengDeva, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::BengDeva, + (ScriptExtension::BengDeva, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::BengDeva, + (ScriptExtension::BengDeva, ScriptExtension::BengDevaGranKnda) => ScriptExtension::BengDeva, + (ScriptExtension::BengDeva, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::BengDeva, + (ScriptExtension::BengDeva, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::BengDeva, + (ScriptExtension::BengDeva, ScriptExtension::BengSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDeva, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDeva, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengCakmSylo) => ScriptExtension::BengSylo, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDeva) => ScriptExtension::BengDeva, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengSylo) => ScriptExtension::BengSylo, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGranKnda, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaNand) => ScriptExtension::DevaNand, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaTaml) => ScriptExtension::DevaTaml, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::GranTaml) => ScriptExtension::GranTaml, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::KndaNand) => ScriptExtension::KndaNand, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengCakmSylo) => ScriptExtension::BengSylo, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDeva) => ScriptExtension::BengDeva, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::BengSylo) => ScriptExtension::BengSylo, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGranKnda, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaNand) => ScriptExtension::DevaNand, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaTaml) => ScriptExtension::DevaTaml, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::GranTaml) => ScriptExtension::GranTaml, + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh, ScriptExtension::KndaNand) => ScriptExtension::KndaNand, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengCakmSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengDeva) => ScriptExtension::BengDeva, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::BengSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::CyrlLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGranKnda, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGranLatn, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaShrd) => ScriptExtension::DevaShrd, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaTaml) => ScriptExtension::DevaTaml, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::GeorLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::GranTaml) => ScriptExtension::GranTaml, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::KaliLatnMymr) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh, ScriptExtension::LatnMong) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengCakmSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengDeva) => ScriptExtension::BengDeva, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::BengSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::CyrlLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGranKnda, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGranLatn, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaTaml) => ScriptExtension::DevaTaml, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::GeorLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::GranTaml) => ScriptExtension::GranTaml, + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::KaliLatnMymr) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh, ScriptExtension::LatnMong) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengCakmSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengDeva) => ScriptExtension::BengDeva, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::BengSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGranKnda, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaTaml) => ScriptExtension::DevaTaml, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::GranTaml) => ScriptExtension::GranTaml, + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengCakmSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengDeva) => ScriptExtension::BengDeva, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::BengSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGranKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::GranTaml) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::BengDevaGranKnda, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengCakmSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengDeva) => ScriptExtension::BengDeva, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::BengSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGranKnda, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaNand) => ScriptExtension::DevaNand, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::GranTaml) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::BengDevaGranKndaNandOryaTeluTirh, ScriptExtension::KndaNand) => ScriptExtension::KndaNand, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengCakmSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengDeva) => ScriptExtension::BengDeva, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::BengDevaGranKnda, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::BengDevaGranKndaOryaTeluTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::BengSylo) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGranKnda, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGran, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::GranTaml) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::BengDevaGranKndaOryaTeluTirh, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::BengSylo, ScriptExtension::BengCakmSylo) => ScriptExtension::BengSylo, + (ScriptExtension::BengSylo, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengSylo, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengSylo, + (ScriptExtension::BengSylo, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::BengSylo, + (ScriptExtension::BengSylo, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengSylo, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengSylo, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengSylo, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengSylo, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BengSylo, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::Single(Script::Bengali), + (ScriptExtension::BopoHangHaniHiraKana, ScriptExtension::BopoHangHaniHiraKanaYiii) => ScriptExtension::BopoHangHaniHiraKana, + (ScriptExtension::BopoHangHaniHiraKana, ScriptExtension::BopoHani) => ScriptExtension::BopoHani, + (ScriptExtension::BopoHangHaniHiraKana, ScriptExtension::HaniHiraKana) => ScriptExtension::HaniHiraKana, + (ScriptExtension::BopoHangHaniHiraKana, ScriptExtension::HiraKana) => ScriptExtension::HiraKana, + (ScriptExtension::BopoHangHaniHiraKanaYiii, ScriptExtension::BopoHangHaniHiraKana) => ScriptExtension::BopoHangHaniHiraKana, + (ScriptExtension::BopoHangHaniHiraKanaYiii, ScriptExtension::BopoHani) => ScriptExtension::BopoHani, + (ScriptExtension::BopoHangHaniHiraKanaYiii, ScriptExtension::HaniHiraKana) => ScriptExtension::HaniHiraKana, + (ScriptExtension::BopoHangHaniHiraKanaYiii, ScriptExtension::HiraKana) => ScriptExtension::HiraKana, + (ScriptExtension::BopoHani, ScriptExtension::BopoHangHaniHiraKana) => ScriptExtension::BopoHani, + (ScriptExtension::BopoHani, ScriptExtension::BopoHangHaniHiraKanaYiii) => ScriptExtension::BopoHani, + (ScriptExtension::BopoHani, ScriptExtension::HaniHiraKana) => ScriptExtension::Single(Script::Han), + (ScriptExtension::CakmMymrTale, ScriptExtension::BengCakmSylo) => ScriptExtension::Single(Script::Chakma), + (ScriptExtension::CakmMymrTale, ScriptExtension::KaliLatnMymr) => ScriptExtension::Single(Script::Myanmar), + (ScriptExtension::CprtLinaLinb, ScriptExtension::CprtLinb) => ScriptExtension::CprtLinb, + (ScriptExtension::CprtLinb, ScriptExtension::CprtLinaLinb) => ScriptExtension::CprtLinb, + (ScriptExtension::CyrlGlag, ScriptExtension::CyrlLatn) => ScriptExtension::Single(Script::Cyrillic), + (ScriptExtension::CyrlGlag, ScriptExtension::CyrlPerm) => ScriptExtension::Single(Script::Cyrillic), + (ScriptExtension::CyrlLatn, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::CyrlLatn, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::CyrlLatn, ScriptExtension::CyrlGlag) => ScriptExtension::Single(Script::Cyrillic), + (ScriptExtension::CyrlLatn, ScriptExtension::CyrlPerm) => ScriptExtension::Single(Script::Cyrillic), + (ScriptExtension::CyrlLatn, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::CyrlLatn, ScriptExtension::GeorLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::CyrlLatn, ScriptExtension::KaliLatnMymr) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::CyrlLatn, ScriptExtension::LatnMong) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::CyrlPerm, ScriptExtension::CyrlGlag) => ScriptExtension::Single(Script::Cyrillic), + (ScriptExtension::CyrlPerm, ScriptExtension::CyrlLatn) => ScriptExtension::Single(Script::Cyrillic), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::DevaDogrKthiMahj, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaNand) => ScriptExtension::DevaNand, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::GujrKhoj) => ScriptExtension::GujrKhoj, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh, ScriptExtension::KndaNand) => ScriptExtension::KndaNand, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::DevaDogrKthiMahj, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaNand) => ScriptExtension::DevaNand, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::GujrKhoj) => ScriptExtension::GujrKhoj, + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh, ScriptExtension::KndaNand) => ScriptExtension::KndaNand, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::DevaDogrKthiMahj, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::GujrKhoj) => ScriptExtension::GujrKhoj, + (ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaNand) => ScriptExtension::DevaNand, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh, ScriptExtension::KndaNand) => ScriptExtension::KndaNand, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaNand) => ScriptExtension::DevaNand, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh, ScriptExtension::KndaNand) => ScriptExtension::KndaNand, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaDogrKthiMahj, + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaDogrKthiMahj, + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaDogrKthiMahj, + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaDogrMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrKthiMahj, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrMahj, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrMahj, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::DevaDogrMahj, + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaDogrMahj, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGran, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGran, ScriptExtension::GranTaml) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::DevaGranKnda, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGranKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGranKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGranKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGranKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGranKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaGranKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaGranKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaGranKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaGranLatn) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranKnda, ScriptExtension::GranTaml) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::DevaGranKnda, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::DevaGranLatn, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranLatn, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranLatn, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGranLatn, + (ScriptExtension::DevaGranLatn, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGranLatn, + (ScriptExtension::DevaGranLatn, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranLatn, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranLatn, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranLatn, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranLatn, ScriptExtension::CyrlLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaGran) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaGran, + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGranLatn, ScriptExtension::GeorLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::DevaGranLatn, ScriptExtension::GranTaml) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::DevaGranLatn, ScriptExtension::KaliLatnMymr) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::DevaGranLatn, ScriptExtension::LatnMong) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaMlymTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::DevaGujrGuruKndaMlymTirh, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::DevaGujrGuruKndaTirh, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaGujrGuruTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::GujrKhoj) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::DevaGujrGuruTirh, ScriptExtension::GuruMult) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::DevaKnda, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKnda, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKnda, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::DevaKndaMlym, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlym, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlym, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlym, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlym, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlym, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlym, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaMlymOryaTamlTelu, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKndaMlym, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaTaml) => ScriptExtension::DevaTaml, + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::GranTaml) => ScriptExtension::Single(Script::Tamil), + (ScriptExtension::DevaKndaMlymOryaTamlTelu, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKndaNandTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaNand) => ScriptExtension::DevaNand, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaKndaNandTirh, ScriptExtension::KndaNand) => ScriptExtension::KndaNand, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKndaOryaTelu, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaOryaTelu, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::DevaKndaTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaKnda) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaKndaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::DevaKnda, + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaKndaTirh, ScriptExtension::DevaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaKndaTirh, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::DevaNand, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaNand, + (ScriptExtension::DevaNand, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaNand, + (ScriptExtension::DevaNand, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaNand, + (ScriptExtension::DevaNand, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaNand, + (ScriptExtension::DevaNand, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaNand, + (ScriptExtension::DevaNand, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaNand, + (ScriptExtension::DevaNand, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaNand, + (ScriptExtension::DevaNand, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaNand, + (ScriptExtension::DevaNand, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaNand, ScriptExtension::KndaNand) => ScriptExtension::Single(Script::Nandinagari), + (ScriptExtension::DevaShrd, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaShrd, + (ScriptExtension::DevaShrd, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaShrd, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaTaml, + (ScriptExtension::DevaTaml, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaTaml, + (ScriptExtension::DevaTaml, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaTaml, + (ScriptExtension::DevaTaml, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaTaml, + (ScriptExtension::DevaTaml, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaTaml, + (ScriptExtension::DevaTaml, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::DevaTaml, + (ScriptExtension::DevaTaml, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaKndaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::DevaTirh) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTaml, ScriptExtension::GranTaml) => ScriptExtension::Single(Script::Tamil), + (ScriptExtension::DevaTirh, ScriptExtension::BengDeva) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaDogrKthiMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaDogrMahj) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaKndaTirh) => ScriptExtension::DevaTirh, + (ScriptExtension::DevaTirh, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaShrd) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::DevaTirh, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Devanagari), + (ScriptExtension::GeorLatn, ScriptExtension::ArmnGeor) => ScriptExtension::Single(Script::Georgian), + (ScriptExtension::GeorLatn, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::GeorLatn, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::GeorLatn, ScriptExtension::CyrlLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::GeorLatn, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::GeorLatn, ScriptExtension::KaliLatnMymr) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::GeorLatn, ScriptExtension::LatnMong) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::GranTaml, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::GranTaml, + (ScriptExtension::GranTaml, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::GranTaml, + (ScriptExtension::GranTaml, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::GranTaml, + (ScriptExtension::GranTaml, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::GranTaml, + (ScriptExtension::GranTaml, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::GranTaml, + (ScriptExtension::GranTaml, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::GranTaml, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::GranTaml, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::GranTaml, ScriptExtension::DevaGran) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::GranTaml, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::GranTaml, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Grantha), + (ScriptExtension::GranTaml, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Tamil), + (ScriptExtension::GranTaml, ScriptExtension::DevaTaml) => ScriptExtension::Single(Script::Tamil), + (ScriptExtension::GujrKhoj, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::GujrKhoj, + (ScriptExtension::GujrKhoj, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::GujrKhoj, + (ScriptExtension::GujrKhoj, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::GujrKhoj, + (ScriptExtension::GujrKhoj, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GujrKhoj, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Gujarati), + (ScriptExtension::GuruMult, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::DevaDogrGujrGuruMahjSindTakrTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::GuruMult, ScriptExtension::DevaGujrGuruTirh) => ScriptExtension::Single(Script::Gurmukhi), + (ScriptExtension::HaniHiraKana, ScriptExtension::BopoHangHaniHiraKana) => ScriptExtension::HaniHiraKana, + (ScriptExtension::HaniHiraKana, ScriptExtension::BopoHangHaniHiraKanaYiii) => ScriptExtension::HaniHiraKana, + (ScriptExtension::HaniHiraKana, ScriptExtension::BopoHani) => ScriptExtension::Single(Script::Han), + (ScriptExtension::HaniHiraKana, ScriptExtension::HiraKana) => ScriptExtension::HiraKana, + (ScriptExtension::HiraKana, ScriptExtension::BopoHangHaniHiraKana) => ScriptExtension::HiraKana, + (ScriptExtension::HiraKana, ScriptExtension::BopoHangHaniHiraKanaYiii) => ScriptExtension::HiraKana, + (ScriptExtension::HiraKana, ScriptExtension::HaniHiraKana) => ScriptExtension::HiraKana, + (ScriptExtension::KaliLatnMymr, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::KaliLatnMymr, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::KaliLatnMymr, ScriptExtension::CakmMymrTale) => ScriptExtension::Single(Script::Myanmar), + (ScriptExtension::KaliLatnMymr, ScriptExtension::CyrlLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::KaliLatnMymr, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::KaliLatnMymr, ScriptExtension::GeorLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::KaliLatnMymr, ScriptExtension::LatnMong) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::KndaNand, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::KndaNand, + (ScriptExtension::KndaNand, ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh) => ScriptExtension::KndaNand, + (ScriptExtension::KndaNand, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::BengDevaGranGujrGuruKndaMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::BengDevaGranKnda) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::BengDevaGranKndaNandOryaTeluTirh) => ScriptExtension::KndaNand, + (ScriptExtension::KndaNand, ScriptExtension::BengDevaGranKndaOryaTeluTirh) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh) => ScriptExtension::KndaNand, + (ScriptExtension::KndaNand, ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh) => ScriptExtension::KndaNand, + (ScriptExtension::KndaNand, ScriptExtension::DevaDogrGujrGuruKndaMahjMlymNandSindTakrTirh) => ScriptExtension::KndaNand, + (ScriptExtension::KndaNand, ScriptExtension::DevaDogrGujrGuruKndaMahjNandSindTakrTirh) => ScriptExtension::KndaNand, + (ScriptExtension::KndaNand, ScriptExtension::DevaGranKnda) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::DevaGujrGuruKndaMlymTirh) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::DevaGujrGuruKndaTirh) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::DevaKnda) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::DevaKndaMlym) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::DevaKndaMlymOryaTamlTelu) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::DevaKndaNandTirh) => ScriptExtension::KndaNand, + (ScriptExtension::KndaNand, ScriptExtension::DevaKndaOryaTelu) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::DevaKndaTirh) => ScriptExtension::Single(Script::Kannada), + (ScriptExtension::KndaNand, ScriptExtension::DevaNand) => ScriptExtension::Single(Script::Nandinagari), + (ScriptExtension::LatnMong, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::LatnMong, ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::LatnMong, ScriptExtension::CyrlLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::LatnMong, ScriptExtension::DevaGranLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::LatnMong, ScriptExtension::GeorLatn) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::LatnMong, ScriptExtension::KaliLatnMymr) => ScriptExtension::Single(Script::Latin), + (ScriptExtension::LatnMong, ScriptExtension::MongPhag) => ScriptExtension::Single(Script::Mongolian), + (ScriptExtension::MongPhag, ScriptExtension::LatnMong) => ScriptExtension::Single(Script::Mongolian), + _ => ScriptExtension::Single(Script::Unknown), + } + } +} + +pub fn bsearch_range_value_table<T: Copy>(c: char, r: &'static [(char, char, T)]) -> Option<T> { + use core::cmp::Ordering::{Equal, Less, Greater}; + match r.binary_search_by(|&(lo, hi, _)| { + if lo <= c && c <= hi { Equal } + else if hi < c { Less } + else { Greater } + }) { + Ok(idx) => { + let (_, _, cat) = r[idx]; + Some(cat) + } + Err(_) => None + } +} + +#[inline] +pub fn get_script(c: char) -> Option<Script> { + bsearch_range_value_table(c, SCRIPTS) +} + +#[inline] +pub fn get_script_extension(c: char) -> Option<ScriptExtension> { + bsearch_range_value_table(c, SCRIPT_EXTENSIONS) +} + const SCRIPTS: &'static [(char, char, Script)] = &[ + ('\u{0}', '\u{1f}', Script::Common), ('\u{20}', '\u{20}', Script::Common), ('\u{21}', + '\u{23}', Script::Common), ('\u{24}', '\u{24}', Script::Common), ('\u{25}', '\u{27}', + Script::Common), ('\u{28}', '\u{28}', Script::Common), ('\u{29}', '\u{29}', + Script::Common), ('\u{2a}', '\u{2a}', Script::Common), ('\u{2b}', '\u{2b}', + Script::Common), ('\u{2c}', '\u{2c}', Script::Common), ('\u{2d}', '\u{2d}', + Script::Common), ('\u{2e}', '\u{2f}', Script::Common), ('\u{30}', '\u{39}', + Script::Common), ('\u{3a}', '\u{3b}', Script::Common), ('\u{3c}', '\u{3e}', + Script::Common), ('\u{3f}', '\u{40}', Script::Common), ('\u{41}', '\u{5a}', + Script::Latin), ('\u{5b}', '\u{5b}', Script::Common), ('\u{5c}', '\u{5c}', + Script::Common), ('\u{5d}', '\u{5d}', Script::Common), ('\u{5e}', '\u{5e}', + Script::Common), ('\u{5f}', '\u{5f}', Script::Common), ('\u{60}', '\u{60}', + Script::Common), ('\u{61}', '\u{7a}', Script::Latin), ('\u{7b}', '\u{7b}', + Script::Common), ('\u{7c}', '\u{7c}', Script::Common), ('\u{7d}', '\u{7d}', + Script::Common), ('\u{7e}', '\u{7e}', Script::Common), ('\u{7f}', '\u{9f}', + Script::Common), ('\u{a0}', '\u{a0}', Script::Common), ('\u{a1}', '\u{a1}', + Script::Common), ('\u{a2}', '\u{a5}', Script::Common), ('\u{a6}', '\u{a6}', + Script::Common), ('\u{a7}', '\u{a7}', Script::Common), ('\u{a8}', '\u{a8}', + Script::Common), ('\u{a9}', '\u{a9}', Script::Common), ('\u{aa}', '\u{aa}', + Script::Latin), ('\u{ab}', '\u{ab}', Script::Common), ('\u{ac}', '\u{ac}', + Script::Common), ('\u{ad}', '\u{ad}', Script::Common), ('\u{ae}', '\u{ae}', + Script::Common), ('\u{af}', '\u{af}', Script::Common), ('\u{b0}', '\u{b0}', + Script::Common), ('\u{b1}', '\u{b1}', Script::Common), ('\u{b2}', '\u{b3}', + Script::Common), ('\u{b4}', '\u{b4}', Script::Common), ('\u{b5}', '\u{b5}', + Script::Common), ('\u{b6}', '\u{b7}', Script::Common), ('\u{b8}', '\u{b8}', + Script::Common), ('\u{b9}', '\u{b9}', Script::Common), ('\u{ba}', '\u{ba}', + Script::Latin), ('\u{bb}', '\u{bb}', Script::Common), ('\u{bc}', '\u{be}', + Script::Common), ('\u{bf}', '\u{bf}', Script::Common), ('\u{c0}', '\u{d6}', + Script::Latin), ('\u{d7}', '\u{d7}', Script::Common), ('\u{d8}', '\u{f6}', + Script::Latin), ('\u{f7}', '\u{f7}', Script::Common), ('\u{f8}', '\u{1ba}', + Script::Latin), ('\u{1bb}', '\u{1bb}', Script::Latin), ('\u{1bc}', '\u{1bf}', + Script::Latin), ('\u{1c0}', '\u{1c3}', Script::Latin), ('\u{1c4}', '\u{293}', + Script::Latin), ('\u{294}', '\u{294}', Script::Latin), ('\u{295}', '\u{2af}', + Script::Latin), ('\u{2b0}', '\u{2b8}', Script::Latin), ('\u{2b9}', '\u{2c1}', + Script::Common), ('\u{2c2}', '\u{2c5}', Script::Common), ('\u{2c6}', '\u{2d1}', + Script::Common), ('\u{2d2}', '\u{2df}', Script::Common), ('\u{2e0}', '\u{2e4}', + Script::Latin), ('\u{2e5}', '\u{2e9}', Script::Common), ('\u{2ea}', '\u{2eb}', + Script::Bopomofo), ('\u{2ec}', '\u{2ec}', Script::Common), ('\u{2ed}', '\u{2ed}', + Script::Common), ('\u{2ee}', '\u{2ee}', Script::Common), ('\u{2ef}', '\u{2ff}', + Script::Common), ('\u{300}', '\u{36f}', Script::Inherited), ('\u{370}', '\u{373}', + Script::Greek), ('\u{374}', '\u{374}', Script::Common), ('\u{375}', '\u{375}', + Script::Greek), ('\u{376}', '\u{377}', Script::Greek), ('\u{37a}', '\u{37a}', + Script::Greek), ('\u{37b}', '\u{37d}', Script::Greek), ('\u{37e}', '\u{37e}', + Script::Common), ('\u{37f}', '\u{37f}', Script::Greek), ('\u{384}', '\u{384}', + Script::Greek), ('\u{385}', '\u{385}', Script::Common), ('\u{386}', '\u{386}', + Script::Greek), ('\u{387}', '\u{387}', Script::Common), ('\u{388}', '\u{38a}', + Script::Greek), ('\u{38c}', '\u{38c}', Script::Greek), ('\u{38e}', '\u{3a1}', + Script::Greek), ('\u{3a3}', '\u{3e1}', Script::Greek), ('\u{3e2}', '\u{3ef}', + Script::Coptic), ('\u{3f0}', '\u{3f5}', Script::Greek), ('\u{3f6}', '\u{3f6}', + Script::Greek), ('\u{3f7}', '\u{3ff}', Script::Greek), ('\u{400}', '\u{481}', + Script::Cyrillic), ('\u{482}', '\u{482}', Script::Cyrillic), ('\u{483}', '\u{484}', + Script::Cyrillic), ('\u{485}', '\u{486}', Script::Inherited), ('\u{487}', '\u{487}', + Script::Cyrillic), ('\u{488}', '\u{489}', Script::Cyrillic), ('\u{48a}', '\u{52f}', + Script::Cyrillic), ('\u{531}', '\u{556}', Script::Armenian), ('\u{559}', '\u{559}', + Script::Armenian), ('\u{55a}', '\u{55f}', Script::Armenian), ('\u{560}', '\u{588}', + Script::Armenian), ('\u{589}', '\u{589}', Script::Common), ('\u{58a}', '\u{58a}', + Script::Armenian), ('\u{58d}', '\u{58e}', Script::Armenian), ('\u{58f}', '\u{58f}', + Script::Armenian), ('\u{591}', '\u{5bd}', Script::Hebrew), ('\u{5be}', '\u{5be}', + Script::Hebrew), ('\u{5bf}', '\u{5bf}', Script::Hebrew), ('\u{5c0}', '\u{5c0}', + Script::Hebrew), ('\u{5c1}', '\u{5c2}', Script::Hebrew), ('\u{5c3}', '\u{5c3}', + Script::Hebrew), ('\u{5c4}', '\u{5c5}', Script::Hebrew), ('\u{5c6}', '\u{5c6}', + Script::Hebrew), ('\u{5c7}', '\u{5c7}', Script::Hebrew), ('\u{5d0}', '\u{5ea}', + Script::Hebrew), ('\u{5ef}', '\u{5f2}', Script::Hebrew), ('\u{5f3}', '\u{5f4}', + Script::Hebrew), ('\u{600}', '\u{604}', Script::Arabic), ('\u{605}', '\u{605}', + Script::Common), ('\u{606}', '\u{608}', Script::Arabic), ('\u{609}', '\u{60a}', + Script::Arabic), ('\u{60b}', '\u{60b}', Script::Arabic), ('\u{60c}', '\u{60c}', + Script::Common), ('\u{60d}', '\u{60d}', Script::Arabic), ('\u{60e}', '\u{60f}', + Script::Arabic), ('\u{610}', '\u{61a}', Script::Arabic), ('\u{61b}', '\u{61b}', + Script::Common), ('\u{61c}', '\u{61c}', Script::Arabic), ('\u{61e}', '\u{61e}', + Script::Arabic), ('\u{61f}', '\u{61f}', Script::Common), ('\u{620}', '\u{63f}', + Script::Arabic), ('\u{640}', '\u{640}', Script::Common), ('\u{641}', '\u{64a}', + Script::Arabic), ('\u{64b}', '\u{655}', Script::Inherited), ('\u{656}', '\u{65f}', + Script::Arabic), ('\u{660}', '\u{669}', Script::Arabic), ('\u{66a}', '\u{66d}', + Script::Arabic), ('\u{66e}', '\u{66f}', Script::Arabic), ('\u{670}', '\u{670}', + Script::Inherited), ('\u{671}', '\u{6d3}', Script::Arabic), ('\u{6d4}', '\u{6d4}', + Script::Arabic), ('\u{6d5}', '\u{6d5}', Script::Arabic), ('\u{6d6}', '\u{6dc}', + Script::Arabic), ('\u{6dd}', '\u{6dd}', Script::Common), ('\u{6de}', '\u{6de}', + Script::Arabic), ('\u{6df}', '\u{6e4}', Script::Arabic), ('\u{6e5}', '\u{6e6}', + Script::Arabic), ('\u{6e7}', '\u{6e8}', Script::Arabic), ('\u{6e9}', '\u{6e9}', + Script::Arabic), ('\u{6ea}', '\u{6ed}', Script::Arabic), ('\u{6ee}', '\u{6ef}', + Script::Arabic), ('\u{6f0}', '\u{6f9}', Script::Arabic), ('\u{6fa}', '\u{6fc}', + Script::Arabic), ('\u{6fd}', '\u{6fe}', Script::Arabic), ('\u{6ff}', '\u{6ff}', + Script::Arabic), ('\u{700}', '\u{70d}', Script::Syriac), ('\u{70f}', '\u{70f}', + Script::Syriac), ('\u{710}', '\u{710}', Script::Syriac), ('\u{711}', '\u{711}', + Script::Syriac), ('\u{712}', '\u{72f}', Script::Syriac), ('\u{730}', '\u{74a}', + Script::Syriac), ('\u{74d}', '\u{74f}', Script::Syriac), ('\u{750}', '\u{77f}', + Script::Arabic), ('\u{780}', '\u{7a5}', Script::Thaana), ('\u{7a6}', '\u{7b0}', + Script::Thaana), ('\u{7b1}', '\u{7b1}', Script::Thaana), ('\u{7c0}', '\u{7c9}', + Script::Nko), ('\u{7ca}', '\u{7ea}', Script::Nko), ('\u{7eb}', '\u{7f3}', Script::Nko), + ('\u{7f4}', '\u{7f5}', Script::Nko), ('\u{7f6}', '\u{7f6}', Script::Nko), ('\u{7f7}', + '\u{7f9}', Script::Nko), ('\u{7fa}', '\u{7fa}', Script::Nko), ('\u{7fd}', '\u{7fd}', + Script::Nko), ('\u{7fe}', '\u{7ff}', Script::Nko), ('\u{800}', '\u{815}', + Script::Samaritan), ('\u{816}', '\u{819}', Script::Samaritan), ('\u{81a}', '\u{81a}', + Script::Samaritan), ('\u{81b}', '\u{823}', Script::Samaritan), ('\u{824}', '\u{824}', + Script::Samaritan), ('\u{825}', '\u{827}', Script::Samaritan), ('\u{828}', '\u{828}', + Script::Samaritan), ('\u{829}', '\u{82d}', Script::Samaritan), ('\u{830}', '\u{83e}', + Script::Samaritan), ('\u{840}', '\u{858}', Script::Mandaic), ('\u{859}', '\u{85b}', + Script::Mandaic), ('\u{85e}', '\u{85e}', Script::Mandaic), ('\u{860}', '\u{86a}', + Script::Syriac), ('\u{8a0}', '\u{8b4}', Script::Arabic), ('\u{8b6}', '\u{8bd}', + Script::Arabic), ('\u{8d3}', '\u{8e1}', Script::Arabic), ('\u{8e2}', '\u{8e2}', + Script::Common), ('\u{8e3}', '\u{8ff}', Script::Arabic), ('\u{900}', '\u{902}', + Script::Devanagari), ('\u{903}', '\u{903}', Script::Devanagari), ('\u{904}', '\u{939}', + Script::Devanagari), ('\u{93a}', '\u{93a}', Script::Devanagari), ('\u{93b}', '\u{93b}', + Script::Devanagari), ('\u{93c}', '\u{93c}', Script::Devanagari), ('\u{93d}', '\u{93d}', + Script::Devanagari), ('\u{93e}', '\u{940}', Script::Devanagari), ('\u{941}', '\u{948}', + Script::Devanagari), ('\u{949}', '\u{94c}', Script::Devanagari), ('\u{94d}', '\u{94d}', + Script::Devanagari), ('\u{94e}', '\u{94f}', Script::Devanagari), ('\u{950}', '\u{950}', + Script::Devanagari), ('\u{951}', '\u{954}', Script::Inherited), ('\u{955}', '\u{957}', + Script::Devanagari), ('\u{958}', '\u{961}', Script::Devanagari), ('\u{962}', '\u{963}', + Script::Devanagari), ('\u{964}', '\u{965}', Script::Common), ('\u{966}', '\u{96f}', + Script::Devanagari), ('\u{970}', '\u{970}', Script::Devanagari), ('\u{971}', '\u{971}', + Script::Devanagari), ('\u{972}', '\u{97f}', Script::Devanagari), ('\u{980}', '\u{980}', + Script::Bengali), ('\u{981}', '\u{981}', Script::Bengali), ('\u{982}', '\u{983}', + Script::Bengali), ('\u{985}', '\u{98c}', Script::Bengali), ('\u{98f}', '\u{990}', + Script::Bengali), ('\u{993}', '\u{9a8}', Script::Bengali), ('\u{9aa}', '\u{9b0}', + Script::Bengali), ('\u{9b2}', '\u{9b2}', Script::Bengali), ('\u{9b6}', '\u{9b9}', + Script::Bengali), ('\u{9bc}', '\u{9bc}', Script::Bengali), ('\u{9bd}', '\u{9bd}', + Script::Bengali), ('\u{9be}', '\u{9c0}', Script::Bengali), ('\u{9c1}', '\u{9c4}', + Script::Bengali), ('\u{9c7}', '\u{9c8}', Script::Bengali), ('\u{9cb}', '\u{9cc}', + Script::Bengali), ('\u{9cd}', '\u{9cd}', Script::Bengali), ('\u{9ce}', '\u{9ce}', + Script::Bengali), ('\u{9d7}', '\u{9d7}', Script::Bengali), ('\u{9dc}', '\u{9dd}', + Script::Bengali), ('\u{9df}', '\u{9e1}', Script::Bengali), ('\u{9e2}', '\u{9e3}', + Script::Bengali), ('\u{9e6}', '\u{9ef}', Script::Bengali), ('\u{9f0}', '\u{9f1}', + Script::Bengali), ('\u{9f2}', '\u{9f3}', Script::Bengali), ('\u{9f4}', '\u{9f9}', + Script::Bengali), ('\u{9fa}', '\u{9fa}', Script::Bengali), ('\u{9fb}', '\u{9fb}', + Script::Bengali), ('\u{9fc}', '\u{9fc}', Script::Bengali), ('\u{9fd}', '\u{9fd}', + Script::Bengali), ('\u{9fe}', '\u{9fe}', Script::Bengali), ('\u{a01}', '\u{a02}', + Script::Gurmukhi), ('\u{a03}', '\u{a03}', Script::Gurmukhi), ('\u{a05}', '\u{a0a}', + Script::Gurmukhi), ('\u{a0f}', '\u{a10}', Script::Gurmukhi), ('\u{a13}', '\u{a28}', + Script::Gurmukhi), ('\u{a2a}', '\u{a30}', Script::Gurmukhi), ('\u{a32}', '\u{a33}', + Script::Gurmukhi), ('\u{a35}', '\u{a36}', Script::Gurmukhi), ('\u{a38}', '\u{a39}', + Script::Gurmukhi), ('\u{a3c}', '\u{a3c}', Script::Gurmukhi), ('\u{a3e}', '\u{a40}', + Script::Gurmukhi), ('\u{a41}', '\u{a42}', Script::Gurmukhi), ('\u{a47}', '\u{a48}', + Script::Gurmukhi), ('\u{a4b}', '\u{a4d}', Script::Gurmukhi), ('\u{a51}', '\u{a51}', + Script::Gurmukhi), ('\u{a59}', '\u{a5c}', Script::Gurmukhi), ('\u{a5e}', '\u{a5e}', + Script::Gurmukhi), ('\u{a66}', '\u{a6f}', Script::Gurmukhi), ('\u{a70}', '\u{a71}', + Script::Gurmukhi), ('\u{a72}', '\u{a74}', Script::Gurmukhi), ('\u{a75}', '\u{a75}', + Script::Gurmukhi), ('\u{a76}', '\u{a76}', Script::Gurmukhi), ('\u{a81}', '\u{a82}', + Script::Gujarati), ('\u{a83}', '\u{a83}', Script::Gujarati), ('\u{a85}', '\u{a8d}', + Script::Gujarati), ('\u{a8f}', '\u{a91}', Script::Gujarati), ('\u{a93}', '\u{aa8}', + Script::Gujarati), ('\u{aaa}', '\u{ab0}', Script::Gujarati), ('\u{ab2}', '\u{ab3}', + Script::Gujarati), ('\u{ab5}', '\u{ab9}', Script::Gujarati), ('\u{abc}', '\u{abc}', + Script::Gujarati), ('\u{abd}', '\u{abd}', Script::Gujarati), ('\u{abe}', '\u{ac0}', + Script::Gujarati), ('\u{ac1}', '\u{ac5}', Script::Gujarati), ('\u{ac7}', '\u{ac8}', + Script::Gujarati), ('\u{ac9}', '\u{ac9}', Script::Gujarati), ('\u{acb}', '\u{acc}', + Script::Gujarati), ('\u{acd}', '\u{acd}', Script::Gujarati), ('\u{ad0}', '\u{ad0}', + Script::Gujarati), ('\u{ae0}', '\u{ae1}', Script::Gujarati), ('\u{ae2}', '\u{ae3}', + Script::Gujarati), ('\u{ae6}', '\u{aef}', Script::Gujarati), ('\u{af0}', '\u{af0}', + Script::Gujarati), ('\u{af1}', '\u{af1}', Script::Gujarati), ('\u{af9}', '\u{af9}', + Script::Gujarati), ('\u{afa}', '\u{aff}', Script::Gujarati), ('\u{b01}', '\u{b01}', + Script::Oriya), ('\u{b02}', '\u{b03}', Script::Oriya), ('\u{b05}', '\u{b0c}', + Script::Oriya), ('\u{b0f}', '\u{b10}', Script::Oriya), ('\u{b13}', '\u{b28}', + Script::Oriya), ('\u{b2a}', '\u{b30}', Script::Oriya), ('\u{b32}', '\u{b33}', + Script::Oriya), ('\u{b35}', '\u{b39}', Script::Oriya), ('\u{b3c}', '\u{b3c}', + Script::Oriya), ('\u{b3d}', '\u{b3d}', Script::Oriya), ('\u{b3e}', '\u{b3e}', + Script::Oriya), ('\u{b3f}', '\u{b3f}', Script::Oriya), ('\u{b40}', '\u{b40}', + Script::Oriya), ('\u{b41}', '\u{b44}', Script::Oriya), ('\u{b47}', '\u{b48}', + Script::Oriya), ('\u{b4b}', '\u{b4c}', Script::Oriya), ('\u{b4d}', '\u{b4d}', + Script::Oriya), ('\u{b56}', '\u{b56}', Script::Oriya), ('\u{b57}', '\u{b57}', + Script::Oriya), ('\u{b5c}', '\u{b5d}', Script::Oriya), ('\u{b5f}', '\u{b61}', + Script::Oriya), ('\u{b62}', '\u{b63}', Script::Oriya), ('\u{b66}', '\u{b6f}', + Script::Oriya), ('\u{b70}', '\u{b70}', Script::Oriya), ('\u{b71}', '\u{b71}', + Script::Oriya), ('\u{b72}', '\u{b77}', Script::Oriya), ('\u{b82}', '\u{b82}', + Script::Tamil), ('\u{b83}', '\u{b83}', Script::Tamil), ('\u{b85}', '\u{b8a}', + Script::Tamil), ('\u{b8e}', '\u{b90}', Script::Tamil), ('\u{b92}', '\u{b95}', + Script::Tamil), ('\u{b99}', '\u{b9a}', Script::Tamil), ('\u{b9c}', '\u{b9c}', + Script::Tamil), ('\u{b9e}', '\u{b9f}', Script::Tamil), ('\u{ba3}', '\u{ba4}', + Script::Tamil), ('\u{ba8}', '\u{baa}', Script::Tamil), ('\u{bae}', '\u{bb9}', + Script::Tamil), ('\u{bbe}', '\u{bbf}', Script::Tamil), ('\u{bc0}', '\u{bc0}', + Script::Tamil), ('\u{bc1}', '\u{bc2}', Script::Tamil), ('\u{bc6}', '\u{bc8}', + Script::Tamil), ('\u{bca}', '\u{bcc}', Script::Tamil), ('\u{bcd}', '\u{bcd}', + Script::Tamil), ('\u{bd0}', '\u{bd0}', Script::Tamil), ('\u{bd7}', '\u{bd7}', + Script::Tamil), ('\u{be6}', '\u{bef}', Script::Tamil), ('\u{bf0}', '\u{bf2}', + Script::Tamil), ('\u{bf3}', '\u{bf8}', Script::Tamil), ('\u{bf9}', '\u{bf9}', + Script::Tamil), ('\u{bfa}', '\u{bfa}', Script::Tamil), ('\u{c00}', '\u{c00}', + Script::Telugu), ('\u{c01}', '\u{c03}', Script::Telugu), ('\u{c04}', '\u{c04}', + Script::Telugu), ('\u{c05}', '\u{c0c}', Script::Telugu), ('\u{c0e}', '\u{c10}', + Script::Telugu), ('\u{c12}', '\u{c28}', Script::Telugu), ('\u{c2a}', '\u{c39}', + Script::Telugu), ('\u{c3d}', '\u{c3d}', Script::Telugu), ('\u{c3e}', '\u{c40}', + Script::Telugu), ('\u{c41}', '\u{c44}', Script::Telugu), ('\u{c46}', '\u{c48}', + Script::Telugu), ('\u{c4a}', '\u{c4d}', Script::Telugu), ('\u{c55}', '\u{c56}', + Script::Telugu), ('\u{c58}', '\u{c5a}', Script::Telugu), ('\u{c60}', '\u{c61}', + Script::Telugu), ('\u{c62}', '\u{c63}', Script::Telugu), ('\u{c66}', '\u{c6f}', + Script::Telugu), ('\u{c77}', '\u{c77}', Script::Telugu), ('\u{c78}', '\u{c7e}', + Script::Telugu), ('\u{c7f}', '\u{c7f}', Script::Telugu), ('\u{c80}', '\u{c80}', + Script::Kannada), ('\u{c81}', '\u{c81}', Script::Kannada), ('\u{c82}', '\u{c83}', + Script::Kannada), ('\u{c84}', '\u{c84}', Script::Kannada), ('\u{c85}', '\u{c8c}', + Script::Kannada), ('\u{c8e}', '\u{c90}', Script::Kannada), ('\u{c92}', '\u{ca8}', + Script::Kannada), ('\u{caa}', '\u{cb3}', Script::Kannada), ('\u{cb5}', '\u{cb9}', + Script::Kannada), ('\u{cbc}', '\u{cbc}', Script::Kannada), ('\u{cbd}', '\u{cbd}', + Script::Kannada), ('\u{cbe}', '\u{cbe}', Script::Kannada), ('\u{cbf}', '\u{cbf}', + Script::Kannada), ('\u{cc0}', '\u{cc4}', Script::Kannada), ('\u{cc6}', '\u{cc6}', + Script::Kannada), ('\u{cc7}', '\u{cc8}', Script::Kannada), ('\u{cca}', '\u{ccb}', + Script::Kannada), ('\u{ccc}', '\u{ccd}', Script::Kannada), ('\u{cd5}', '\u{cd6}', + Script::Kannada), ('\u{cde}', '\u{cde}', Script::Kannada), ('\u{ce0}', '\u{ce1}', + Script::Kannada), ('\u{ce2}', '\u{ce3}', Script::Kannada), ('\u{ce6}', '\u{cef}', + Script::Kannada), ('\u{cf1}', '\u{cf2}', Script::Kannada), ('\u{d00}', '\u{d01}', + Script::Malayalam), ('\u{d02}', '\u{d03}', Script::Malayalam), ('\u{d05}', '\u{d0c}', + Script::Malayalam), ('\u{d0e}', '\u{d10}', Script::Malayalam), ('\u{d12}', '\u{d3a}', + Script::Malayalam), ('\u{d3b}', '\u{d3c}', Script::Malayalam), ('\u{d3d}', '\u{d3d}', + Script::Malayalam), ('\u{d3e}', '\u{d40}', Script::Malayalam), ('\u{d41}', '\u{d44}', + Script::Malayalam), ('\u{d46}', '\u{d48}', Script::Malayalam), ('\u{d4a}', '\u{d4c}', + Script::Malayalam), ('\u{d4d}', '\u{d4d}', Script::Malayalam), ('\u{d4e}', '\u{d4e}', + Script::Malayalam), ('\u{d4f}', '\u{d4f}', Script::Malayalam), ('\u{d54}', '\u{d56}', + Script::Malayalam), ('\u{d57}', '\u{d57}', Script::Malayalam), ('\u{d58}', '\u{d5e}', + Script::Malayalam), ('\u{d5f}', '\u{d61}', Script::Malayalam), ('\u{d62}', '\u{d63}', + Script::Malayalam), ('\u{d66}', '\u{d6f}', Script::Malayalam), ('\u{d70}', '\u{d78}', + Script::Malayalam), ('\u{d79}', '\u{d79}', Script::Malayalam), ('\u{d7a}', '\u{d7f}', + Script::Malayalam), ('\u{d82}', '\u{d83}', Script::Sinhala), ('\u{d85}', '\u{d96}', + Script::Sinhala), ('\u{d9a}', '\u{db1}', Script::Sinhala), ('\u{db3}', '\u{dbb}', + Script::Sinhala), ('\u{dbd}', '\u{dbd}', Script::Sinhala), ('\u{dc0}', '\u{dc6}', + Script::Sinhala), ('\u{dca}', '\u{dca}', Script::Sinhala), ('\u{dcf}', '\u{dd1}', + Script::Sinhala), ('\u{dd2}', '\u{dd4}', Script::Sinhala), ('\u{dd6}', '\u{dd6}', + Script::Sinhala), ('\u{dd8}', '\u{ddf}', Script::Sinhala), ('\u{de6}', '\u{def}', + Script::Sinhala), ('\u{df2}', '\u{df3}', Script::Sinhala), ('\u{df4}', '\u{df4}', + Script::Sinhala), ('\u{e01}', '\u{e30}', Script::Thai), ('\u{e31}', '\u{e31}', + Script::Thai), ('\u{e32}', '\u{e33}', Script::Thai), ('\u{e34}', '\u{e3a}', + Script::Thai), ('\u{e3f}', '\u{e3f}', Script::Common), ('\u{e40}', '\u{e45}', + Script::Thai), ('\u{e46}', '\u{e46}', Script::Thai), ('\u{e47}', '\u{e4e}', + Script::Thai), ('\u{e4f}', '\u{e4f}', Script::Thai), ('\u{e50}', '\u{e59}', + Script::Thai), ('\u{e5a}', '\u{e5b}', Script::Thai), ('\u{e81}', '\u{e82}', Script::Lao), + ('\u{e84}', '\u{e84}', Script::Lao), ('\u{e86}', '\u{e8a}', Script::Lao), ('\u{e8c}', + '\u{ea3}', Script::Lao), ('\u{ea5}', '\u{ea5}', Script::Lao), ('\u{ea7}', '\u{eb0}', + Script::Lao), ('\u{eb1}', '\u{eb1}', Script::Lao), ('\u{eb2}', '\u{eb3}', Script::Lao), + ('\u{eb4}', '\u{ebc}', Script::Lao), ('\u{ebd}', '\u{ebd}', Script::Lao), ('\u{ec0}', + '\u{ec4}', Script::Lao), ('\u{ec6}', '\u{ec6}', Script::Lao), ('\u{ec8}', '\u{ecd}', + Script::Lao), ('\u{ed0}', '\u{ed9}', Script::Lao), ('\u{edc}', '\u{edf}', Script::Lao), + ('\u{f00}', '\u{f00}', Script::Tibetan), ('\u{f01}', '\u{f03}', Script::Tibetan), + ('\u{f04}', '\u{f12}', Script::Tibetan), ('\u{f13}', '\u{f13}', Script::Tibetan), + ('\u{f14}', '\u{f14}', Script::Tibetan), ('\u{f15}', '\u{f17}', Script::Tibetan), + ('\u{f18}', '\u{f19}', Script::Tibetan), ('\u{f1a}', '\u{f1f}', Script::Tibetan), + ('\u{f20}', '\u{f29}', Script::Tibetan), ('\u{f2a}', '\u{f33}', Script::Tibetan), + ('\u{f34}', '\u{f34}', Script::Tibetan), ('\u{f35}', '\u{f35}', Script::Tibetan), + ('\u{f36}', '\u{f36}', Script::Tibetan), ('\u{f37}', '\u{f37}', Script::Tibetan), + ('\u{f38}', '\u{f38}', Script::Tibetan), ('\u{f39}', '\u{f39}', Script::Tibetan), + ('\u{f3a}', '\u{f3a}', Script::Tibetan), ('\u{f3b}', '\u{f3b}', Script::Tibetan), + ('\u{f3c}', '\u{f3c}', Script::Tibetan), ('\u{f3d}', '\u{f3d}', Script::Tibetan), + ('\u{f3e}', '\u{f3f}', Script::Tibetan), ('\u{f40}', '\u{f47}', Script::Tibetan), + ('\u{f49}', '\u{f6c}', Script::Tibetan), ('\u{f71}', '\u{f7e}', Script::Tibetan), + ('\u{f7f}', '\u{f7f}', Script::Tibetan), ('\u{f80}', '\u{f84}', Script::Tibetan), + ('\u{f85}', '\u{f85}', Script::Tibetan), ('\u{f86}', '\u{f87}', Script::Tibetan), + ('\u{f88}', '\u{f8c}', Script::Tibetan), ('\u{f8d}', '\u{f97}', Script::Tibetan), + ('\u{f99}', '\u{fbc}', Script::Tibetan), ('\u{fbe}', '\u{fc5}', Script::Tibetan), + ('\u{fc6}', '\u{fc6}', Script::Tibetan), ('\u{fc7}', '\u{fcc}', Script::Tibetan), + ('\u{fce}', '\u{fcf}', Script::Tibetan), ('\u{fd0}', '\u{fd4}', Script::Tibetan), + ('\u{fd5}', '\u{fd8}', Script::Common), ('\u{fd9}', '\u{fda}', Script::Tibetan), + ('\u{1000}', '\u{102a}', Script::Myanmar), ('\u{102b}', '\u{102c}', Script::Myanmar), + ('\u{102d}', '\u{1030}', Script::Myanmar), ('\u{1031}', '\u{1031}', Script::Myanmar), + ('\u{1032}', '\u{1037}', Script::Myanmar), ('\u{1038}', '\u{1038}', Script::Myanmar), + ('\u{1039}', '\u{103a}', Script::Myanmar), ('\u{103b}', '\u{103c}', Script::Myanmar), + ('\u{103d}', '\u{103e}', Script::Myanmar), ('\u{103f}', '\u{103f}', Script::Myanmar), + ('\u{1040}', '\u{1049}', Script::Myanmar), ('\u{104a}', '\u{104f}', Script::Myanmar), + ('\u{1050}', '\u{1055}', Script::Myanmar), ('\u{1056}', '\u{1057}', Script::Myanmar), + ('\u{1058}', '\u{1059}', Script::Myanmar), ('\u{105a}', '\u{105d}', Script::Myanmar), + ('\u{105e}', '\u{1060}', Script::Myanmar), ('\u{1061}', '\u{1061}', Script::Myanmar), + ('\u{1062}', '\u{1064}', Script::Myanmar), ('\u{1065}', '\u{1066}', Script::Myanmar), + ('\u{1067}', '\u{106d}', Script::Myanmar), ('\u{106e}', '\u{1070}', Script::Myanmar), + ('\u{1071}', '\u{1074}', Script::Myanmar), ('\u{1075}', '\u{1081}', Script::Myanmar), + ('\u{1082}', '\u{1082}', Script::Myanmar), ('\u{1083}', '\u{1084}', Script::Myanmar), + ('\u{1085}', '\u{1086}', Script::Myanmar), ('\u{1087}', '\u{108c}', Script::Myanmar), + ('\u{108d}', '\u{108d}', Script::Myanmar), ('\u{108e}', '\u{108e}', Script::Myanmar), + ('\u{108f}', '\u{108f}', Script::Myanmar), ('\u{1090}', '\u{1099}', Script::Myanmar), + ('\u{109a}', '\u{109c}', Script::Myanmar), ('\u{109d}', '\u{109d}', Script::Myanmar), + ('\u{109e}', '\u{109f}', Script::Myanmar), ('\u{10a0}', '\u{10c5}', Script::Georgian), + ('\u{10c7}', '\u{10c7}', Script::Georgian), ('\u{10cd}', '\u{10cd}', Script::Georgian), + ('\u{10d0}', '\u{10fa}', Script::Georgian), ('\u{10fb}', '\u{10fb}', Script::Common), + ('\u{10fc}', '\u{10fc}', Script::Georgian), ('\u{10fd}', '\u{10ff}', Script::Georgian), + ('\u{1100}', '\u{11ff}', Script::Hangul), ('\u{1200}', '\u{1248}', Script::Ethiopic), + ('\u{124a}', '\u{124d}', Script::Ethiopic), ('\u{1250}', '\u{1256}', Script::Ethiopic), + ('\u{1258}', '\u{1258}', Script::Ethiopic), ('\u{125a}', '\u{125d}', Script::Ethiopic), + ('\u{1260}', '\u{1288}', Script::Ethiopic), ('\u{128a}', '\u{128d}', Script::Ethiopic), + ('\u{1290}', '\u{12b0}', Script::Ethiopic), ('\u{12b2}', '\u{12b5}', Script::Ethiopic), + ('\u{12b8}', '\u{12be}', Script::Ethiopic), ('\u{12c0}', '\u{12c0}', Script::Ethiopic), + ('\u{12c2}', '\u{12c5}', Script::Ethiopic), ('\u{12c8}', '\u{12d6}', Script::Ethiopic), + ('\u{12d8}', '\u{1310}', Script::Ethiopic), ('\u{1312}', '\u{1315}', Script::Ethiopic), + ('\u{1318}', '\u{135a}', Script::Ethiopic), ('\u{135d}', '\u{135f}', Script::Ethiopic), + ('\u{1360}', '\u{1368}', Script::Ethiopic), ('\u{1369}', '\u{137c}', Script::Ethiopic), + ('\u{1380}', '\u{138f}', Script::Ethiopic), ('\u{1390}', '\u{1399}', Script::Ethiopic), + ('\u{13a0}', '\u{13f5}', Script::Cherokee), ('\u{13f8}', '\u{13fd}', Script::Cherokee), + ('\u{1400}', '\u{1400}', Script::Canadian_Aboriginal), ('\u{1401}', '\u{166c}', + Script::Canadian_Aboriginal), ('\u{166d}', '\u{166d}', Script::Canadian_Aboriginal), + ('\u{166e}', '\u{166e}', Script::Canadian_Aboriginal), ('\u{166f}', '\u{167f}', + Script::Canadian_Aboriginal), ('\u{1680}', '\u{1680}', Script::Ogham), ('\u{1681}', + '\u{169a}', Script::Ogham), ('\u{169b}', '\u{169b}', Script::Ogham), ('\u{169c}', + '\u{169c}', Script::Ogham), ('\u{16a0}', '\u{16ea}', Script::Runic), ('\u{16eb}', + '\u{16ed}', Script::Common), ('\u{16ee}', '\u{16f0}', Script::Runic), ('\u{16f1}', + '\u{16f8}', Script::Runic), ('\u{1700}', '\u{170c}', Script::Tagalog), ('\u{170e}', + '\u{1711}', Script::Tagalog), ('\u{1712}', '\u{1714}', Script::Tagalog), ('\u{1720}', + '\u{1731}', Script::Hanunoo), ('\u{1732}', '\u{1734}', Script::Hanunoo), ('\u{1735}', + '\u{1736}', Script::Common), ('\u{1740}', '\u{1751}', Script::Buhid), ('\u{1752}', + '\u{1753}', Script::Buhid), ('\u{1760}', '\u{176c}', Script::Tagbanwa), ('\u{176e}', + '\u{1770}', Script::Tagbanwa), ('\u{1772}', '\u{1773}', Script::Tagbanwa), ('\u{1780}', + '\u{17b3}', Script::Khmer), ('\u{17b4}', '\u{17b5}', Script::Khmer), ('\u{17b6}', + '\u{17b6}', Script::Khmer), ('\u{17b7}', '\u{17bd}', Script::Khmer), ('\u{17be}', + '\u{17c5}', Script::Khmer), ('\u{17c6}', '\u{17c6}', Script::Khmer), ('\u{17c7}', + '\u{17c8}', Script::Khmer), ('\u{17c9}', '\u{17d3}', Script::Khmer), ('\u{17d4}', + '\u{17d6}', Script::Khmer), ('\u{17d7}', '\u{17d7}', Script::Khmer), ('\u{17d8}', + '\u{17da}', Script::Khmer), ('\u{17db}', '\u{17db}', Script::Khmer), ('\u{17dc}', + '\u{17dc}', Script::Khmer), ('\u{17dd}', '\u{17dd}', Script::Khmer), ('\u{17e0}', + '\u{17e9}', Script::Khmer), ('\u{17f0}', '\u{17f9}', Script::Khmer), ('\u{1800}', + '\u{1801}', Script::Mongolian), ('\u{1802}', '\u{1803}', Script::Common), ('\u{1804}', + '\u{1804}', Script::Mongolian), ('\u{1805}', '\u{1805}', Script::Common), ('\u{1806}', + '\u{1806}', Script::Mongolian), ('\u{1807}', '\u{180a}', Script::Mongolian), ('\u{180b}', + '\u{180d}', Script::Mongolian), ('\u{180e}', '\u{180e}', Script::Mongolian), ('\u{1810}', + '\u{1819}', Script::Mongolian), ('\u{1820}', '\u{1842}', Script::Mongolian), ('\u{1843}', + '\u{1843}', Script::Mongolian), ('\u{1844}', '\u{1878}', Script::Mongolian), ('\u{1880}', + '\u{1884}', Script::Mongolian), ('\u{1885}', '\u{1886}', Script::Mongolian), ('\u{1887}', + '\u{18a8}', Script::Mongolian), ('\u{18a9}', '\u{18a9}', Script::Mongolian), ('\u{18aa}', + '\u{18aa}', Script::Mongolian), ('\u{18b0}', '\u{18f5}', Script::Canadian_Aboriginal), + ('\u{1900}', '\u{191e}', Script::Limbu), ('\u{1920}', '\u{1922}', Script::Limbu), + ('\u{1923}', '\u{1926}', Script::Limbu), ('\u{1927}', '\u{1928}', Script::Limbu), + ('\u{1929}', '\u{192b}', Script::Limbu), ('\u{1930}', '\u{1931}', Script::Limbu), + ('\u{1932}', '\u{1932}', Script::Limbu), ('\u{1933}', '\u{1938}', Script::Limbu), + ('\u{1939}', '\u{193b}', Script::Limbu), ('\u{1940}', '\u{1940}', Script::Limbu), + ('\u{1944}', '\u{1945}', Script::Limbu), ('\u{1946}', '\u{194f}', Script::Limbu), + ('\u{1950}', '\u{196d}', Script::Tai_Le), ('\u{1970}', '\u{1974}', Script::Tai_Le), + ('\u{1980}', '\u{19ab}', Script::New_Tai_Lue), ('\u{19b0}', '\u{19c9}', + Script::New_Tai_Lue), ('\u{19d0}', '\u{19d9}', Script::New_Tai_Lue), ('\u{19da}', + '\u{19da}', Script::New_Tai_Lue), ('\u{19de}', '\u{19df}', Script::New_Tai_Lue), + ('\u{19e0}', '\u{19ff}', Script::Khmer), ('\u{1a00}', '\u{1a16}', Script::Buginese), + ('\u{1a17}', '\u{1a18}', Script::Buginese), ('\u{1a19}', '\u{1a1a}', Script::Buginese), + ('\u{1a1b}', '\u{1a1b}', Script::Buginese), ('\u{1a1e}', '\u{1a1f}', Script::Buginese), + ('\u{1a20}', '\u{1a54}', Script::Tai_Tham), ('\u{1a55}', '\u{1a55}', Script::Tai_Tham), + ('\u{1a56}', '\u{1a56}', Script::Tai_Tham), ('\u{1a57}', '\u{1a57}', Script::Tai_Tham), + ('\u{1a58}', '\u{1a5e}', Script::Tai_Tham), ('\u{1a60}', '\u{1a60}', Script::Tai_Tham), + ('\u{1a61}', '\u{1a61}', Script::Tai_Tham), ('\u{1a62}', '\u{1a62}', Script::Tai_Tham), + ('\u{1a63}', '\u{1a64}', Script::Tai_Tham), ('\u{1a65}', '\u{1a6c}', Script::Tai_Tham), + ('\u{1a6d}', '\u{1a72}', Script::Tai_Tham), ('\u{1a73}', '\u{1a7c}', Script::Tai_Tham), + ('\u{1a7f}', '\u{1a7f}', Script::Tai_Tham), ('\u{1a80}', '\u{1a89}', Script::Tai_Tham), + ('\u{1a90}', '\u{1a99}', Script::Tai_Tham), ('\u{1aa0}', '\u{1aa6}', Script::Tai_Tham), + ('\u{1aa7}', '\u{1aa7}', Script::Tai_Tham), ('\u{1aa8}', '\u{1aad}', Script::Tai_Tham), + ('\u{1ab0}', '\u{1abd}', Script::Inherited), ('\u{1abe}', '\u{1abe}', Script::Inherited), + ('\u{1b00}', '\u{1b03}', Script::Balinese), ('\u{1b04}', '\u{1b04}', Script::Balinese), + ('\u{1b05}', '\u{1b33}', Script::Balinese), ('\u{1b34}', '\u{1b34}', Script::Balinese), + ('\u{1b35}', '\u{1b35}', Script::Balinese), ('\u{1b36}', '\u{1b3a}', Script::Balinese), + ('\u{1b3b}', '\u{1b3b}', Script::Balinese), ('\u{1b3c}', '\u{1b3c}', Script::Balinese), + ('\u{1b3d}', '\u{1b41}', Script::Balinese), ('\u{1b42}', '\u{1b42}', Script::Balinese), + ('\u{1b43}', '\u{1b44}', Script::Balinese), ('\u{1b45}', '\u{1b4b}', Script::Balinese), + ('\u{1b50}', '\u{1b59}', Script::Balinese), ('\u{1b5a}', '\u{1b60}', Script::Balinese), + ('\u{1b61}', '\u{1b6a}', Script::Balinese), ('\u{1b6b}', '\u{1b73}', Script::Balinese), + ('\u{1b74}', '\u{1b7c}', Script::Balinese), ('\u{1b80}', '\u{1b81}', Script::Sundanese), + ('\u{1b82}', '\u{1b82}', Script::Sundanese), ('\u{1b83}', '\u{1ba0}', Script::Sundanese), + ('\u{1ba1}', '\u{1ba1}', Script::Sundanese), ('\u{1ba2}', '\u{1ba5}', Script::Sundanese), + ('\u{1ba6}', '\u{1ba7}', Script::Sundanese), ('\u{1ba8}', '\u{1ba9}', Script::Sundanese), + ('\u{1baa}', '\u{1baa}', Script::Sundanese), ('\u{1bab}', '\u{1bad}', Script::Sundanese), + ('\u{1bae}', '\u{1baf}', Script::Sundanese), ('\u{1bb0}', '\u{1bb9}', Script::Sundanese), + ('\u{1bba}', '\u{1bbf}', Script::Sundanese), ('\u{1bc0}', '\u{1be5}', Script::Batak), + ('\u{1be6}', '\u{1be6}', Script::Batak), ('\u{1be7}', '\u{1be7}', Script::Batak), + ('\u{1be8}', '\u{1be9}', Script::Batak), ('\u{1bea}', '\u{1bec}', Script::Batak), + ('\u{1bed}', '\u{1bed}', Script::Batak), ('\u{1bee}', '\u{1bee}', Script::Batak), + ('\u{1bef}', '\u{1bf1}', Script::Batak), ('\u{1bf2}', '\u{1bf3}', Script::Batak), + ('\u{1bfc}', '\u{1bff}', Script::Batak), ('\u{1c00}', '\u{1c23}', Script::Lepcha), + ('\u{1c24}', '\u{1c2b}', Script::Lepcha), ('\u{1c2c}', '\u{1c33}', Script::Lepcha), + ('\u{1c34}', '\u{1c35}', Script::Lepcha), ('\u{1c36}', '\u{1c37}', Script::Lepcha), + ('\u{1c3b}', '\u{1c3f}', Script::Lepcha), ('\u{1c40}', '\u{1c49}', Script::Lepcha), + ('\u{1c4d}', '\u{1c4f}', Script::Lepcha), ('\u{1c50}', '\u{1c59}', Script::Ol_Chiki), + ('\u{1c5a}', '\u{1c77}', Script::Ol_Chiki), ('\u{1c78}', '\u{1c7d}', Script::Ol_Chiki), + ('\u{1c7e}', '\u{1c7f}', Script::Ol_Chiki), ('\u{1c80}', '\u{1c88}', Script::Cyrillic), + ('\u{1c90}', '\u{1cba}', Script::Georgian), ('\u{1cbd}', '\u{1cbf}', Script::Georgian), + ('\u{1cc0}', '\u{1cc7}', Script::Sundanese), ('\u{1cd0}', '\u{1cd2}', Script::Inherited), + ('\u{1cd3}', '\u{1cd3}', Script::Common), ('\u{1cd4}', '\u{1ce0}', Script::Inherited), + ('\u{1ce1}', '\u{1ce1}', Script::Common), ('\u{1ce2}', '\u{1ce8}', Script::Inherited), + ('\u{1ce9}', '\u{1cec}', Script::Common), ('\u{1ced}', '\u{1ced}', Script::Inherited), + ('\u{1cee}', '\u{1cf3}', Script::Common), ('\u{1cf4}', '\u{1cf4}', Script::Inherited), + ('\u{1cf5}', '\u{1cf6}', Script::Common), ('\u{1cf7}', '\u{1cf7}', Script::Common), + ('\u{1cf8}', '\u{1cf9}', Script::Inherited), ('\u{1cfa}', '\u{1cfa}', Script::Common), + ('\u{1d00}', '\u{1d25}', Script::Latin), ('\u{1d26}', '\u{1d2a}', Script::Greek), + ('\u{1d2b}', '\u{1d2b}', Script::Cyrillic), ('\u{1d2c}', '\u{1d5c}', Script::Latin), + ('\u{1d5d}', '\u{1d61}', Script::Greek), ('\u{1d62}', '\u{1d65}', Script::Latin), + ('\u{1d66}', '\u{1d6a}', Script::Greek), ('\u{1d6b}', '\u{1d77}', Script::Latin), + ('\u{1d78}', '\u{1d78}', Script::Cyrillic), ('\u{1d79}', '\u{1d9a}', Script::Latin), + ('\u{1d9b}', '\u{1dbe}', Script::Latin), ('\u{1dbf}', '\u{1dbf}', Script::Greek), + ('\u{1dc0}', '\u{1df9}', Script::Inherited), ('\u{1dfb}', '\u{1dff}', Script::Inherited), + ('\u{1e00}', '\u{1eff}', Script::Latin), ('\u{1f00}', '\u{1f15}', Script::Greek), + ('\u{1f18}', '\u{1f1d}', Script::Greek), ('\u{1f20}', '\u{1f45}', Script::Greek), + ('\u{1f48}', '\u{1f4d}', Script::Greek), ('\u{1f50}', '\u{1f57}', Script::Greek), + ('\u{1f59}', '\u{1f59}', Script::Greek), ('\u{1f5b}', '\u{1f5b}', Script::Greek), + ('\u{1f5d}', '\u{1f5d}', Script::Greek), ('\u{1f5f}', '\u{1f7d}', Script::Greek), + ('\u{1f80}', '\u{1fb4}', Script::Greek), ('\u{1fb6}', '\u{1fbc}', Script::Greek), + ('\u{1fbd}', '\u{1fbd}', Script::Greek), ('\u{1fbe}', '\u{1fbe}', Script::Greek), + ('\u{1fbf}', '\u{1fc1}', Script::Greek), ('\u{1fc2}', '\u{1fc4}', Script::Greek), + ('\u{1fc6}', '\u{1fcc}', Script::Greek), ('\u{1fcd}', '\u{1fcf}', Script::Greek), + ('\u{1fd0}', '\u{1fd3}', Script::Greek), ('\u{1fd6}', '\u{1fdb}', Script::Greek), + ('\u{1fdd}', '\u{1fdf}', Script::Greek), ('\u{1fe0}', '\u{1fec}', Script::Greek), + ('\u{1fed}', '\u{1fef}', Script::Greek), ('\u{1ff2}', '\u{1ff4}', Script::Greek), + ('\u{1ff6}', '\u{1ffc}', Script::Greek), ('\u{1ffd}', '\u{1ffe}', Script::Greek), + ('\u{2000}', '\u{200a}', Script::Common), ('\u{200b}', '\u{200b}', Script::Common), + ('\u{200c}', '\u{200d}', Script::Inherited), ('\u{200e}', '\u{200f}', Script::Common), + ('\u{2010}', '\u{2015}', Script::Common), ('\u{2016}', '\u{2017}', Script::Common), + ('\u{2018}', '\u{2018}', Script::Common), ('\u{2019}', '\u{2019}', Script::Common), + ('\u{201a}', '\u{201a}', Script::Common), ('\u{201b}', '\u{201c}', Script::Common), + ('\u{201d}', '\u{201d}', Script::Common), ('\u{201e}', '\u{201e}', Script::Common), + ('\u{201f}', '\u{201f}', Script::Common), ('\u{2020}', '\u{2027}', Script::Common), + ('\u{2028}', '\u{2028}', Script::Common), ('\u{2029}', '\u{2029}', Script::Common), + ('\u{202a}', '\u{202e}', Script::Common), ('\u{202f}', '\u{202f}', Script::Common), + ('\u{2030}', '\u{2038}', Script::Common), ('\u{2039}', '\u{2039}', Script::Common), + ('\u{203a}', '\u{203a}', Script::Common), ('\u{203b}', '\u{203e}', Script::Common), + ('\u{203f}', '\u{2040}', Script::Common), ('\u{2041}', '\u{2043}', Script::Common), + ('\u{2044}', '\u{2044}', Script::Common), ('\u{2045}', '\u{2045}', Script::Common), + ('\u{2046}', '\u{2046}', Script::Common), ('\u{2047}', '\u{2051}', Script::Common), + ('\u{2052}', '\u{2052}', Script::Common), ('\u{2053}', '\u{2053}', Script::Common), + ('\u{2054}', '\u{2054}', Script::Common), ('\u{2055}', '\u{205e}', Script::Common), + ('\u{205f}', '\u{205f}', Script::Common), ('\u{2060}', '\u{2064}', Script::Common), + ('\u{2066}', '\u{206f}', Script::Common), ('\u{2070}', '\u{2070}', Script::Common), + ('\u{2071}', '\u{2071}', Script::Latin), ('\u{2074}', '\u{2079}', Script::Common), + ('\u{207a}', '\u{207c}', Script::Common), ('\u{207d}', '\u{207d}', Script::Common), + ('\u{207e}', '\u{207e}', Script::Common), ('\u{207f}', '\u{207f}', Script::Latin), + ('\u{2080}', '\u{2089}', Script::Common), ('\u{208a}', '\u{208c}', Script::Common), + ('\u{208d}', '\u{208d}', Script::Common), ('\u{208e}', '\u{208e}', Script::Common), + ('\u{2090}', '\u{209c}', Script::Latin), ('\u{20a0}', '\u{20bf}', Script::Common), + ('\u{20d0}', '\u{20dc}', Script::Inherited), ('\u{20dd}', '\u{20e0}', Script::Inherited), + ('\u{20e1}', '\u{20e1}', Script::Inherited), ('\u{20e2}', '\u{20e4}', Script::Inherited), + ('\u{20e5}', '\u{20f0}', Script::Inherited), ('\u{2100}', '\u{2101}', Script::Common), + ('\u{2102}', '\u{2102}', Script::Common), ('\u{2103}', '\u{2106}', Script::Common), + ('\u{2107}', '\u{2107}', Script::Common), ('\u{2108}', '\u{2109}', Script::Common), + ('\u{210a}', '\u{2113}', Script::Common), ('\u{2114}', '\u{2114}', Script::Common), + ('\u{2115}', '\u{2115}', Script::Common), ('\u{2116}', '\u{2117}', Script::Common), + ('\u{2118}', '\u{2118}', Script::Common), ('\u{2119}', '\u{211d}', Script::Common), + ('\u{211e}', '\u{2123}', Script::Common), ('\u{2124}', '\u{2124}', Script::Common), + ('\u{2125}', '\u{2125}', Script::Common), ('\u{2126}', '\u{2126}', Script::Greek), + ('\u{2127}', '\u{2127}', Script::Common), ('\u{2128}', '\u{2128}', Script::Common), + ('\u{2129}', '\u{2129}', Script::Common), ('\u{212a}', '\u{212b}', Script::Latin), + ('\u{212c}', '\u{212d}', Script::Common), ('\u{212e}', '\u{212e}', Script::Common), + ('\u{212f}', '\u{2131}', Script::Common), ('\u{2132}', '\u{2132}', Script::Latin), + ('\u{2133}', '\u{2134}', Script::Common), ('\u{2135}', '\u{2138}', Script::Common), + ('\u{2139}', '\u{2139}', Script::Common), ('\u{213a}', '\u{213b}', Script::Common), + ('\u{213c}', '\u{213f}', Script::Common), ('\u{2140}', '\u{2144}', Script::Common), + ('\u{2145}', '\u{2149}', Script::Common), ('\u{214a}', '\u{214a}', Script::Common), + ('\u{214b}', '\u{214b}', Script::Common), ('\u{214c}', '\u{214d}', Script::Common), + ('\u{214e}', '\u{214e}', Script::Latin), ('\u{214f}', '\u{214f}', Script::Common), + ('\u{2150}', '\u{215f}', Script::Common), ('\u{2160}', '\u{2182}', Script::Latin), + ('\u{2183}', '\u{2184}', Script::Latin), ('\u{2185}', '\u{2188}', Script::Latin), + ('\u{2189}', '\u{2189}', Script::Common), ('\u{218a}', '\u{218b}', Script::Common), + ('\u{2190}', '\u{2194}', Script::Common), ('\u{2195}', '\u{2199}', Script::Common), + ('\u{219a}', '\u{219b}', Script::Common), ('\u{219c}', '\u{219f}', Script::Common), + ('\u{21a0}', '\u{21a0}', Script::Common), ('\u{21a1}', '\u{21a2}', Script::Common), + ('\u{21a3}', '\u{21a3}', Script::Common), ('\u{21a4}', '\u{21a5}', Script::Common), + ('\u{21a6}', '\u{21a6}', Script::Common), ('\u{21a7}', '\u{21ad}', Script::Common), + ('\u{21ae}', '\u{21ae}', Script::Common), ('\u{21af}', '\u{21cd}', Script::Common), + ('\u{21ce}', '\u{21cf}', Script::Common), ('\u{21d0}', '\u{21d1}', Script::Common), + ('\u{21d2}', '\u{21d2}', Script::Common), ('\u{21d3}', '\u{21d3}', Script::Common), + ('\u{21d4}', '\u{21d4}', Script::Common), ('\u{21d5}', '\u{21f3}', Script::Common), + ('\u{21f4}', '\u{22ff}', Script::Common), ('\u{2300}', '\u{2307}', Script::Common), + ('\u{2308}', '\u{2308}', Script::Common), ('\u{2309}', '\u{2309}', Script::Common), + ('\u{230a}', '\u{230a}', Script::Common), ('\u{230b}', '\u{230b}', Script::Common), + ('\u{230c}', '\u{231f}', Script::Common), ('\u{2320}', '\u{2321}', Script::Common), + ('\u{2322}', '\u{2328}', Script::Common), ('\u{2329}', '\u{2329}', Script::Common), + ('\u{232a}', '\u{232a}', Script::Common), ('\u{232b}', '\u{237b}', Script::Common), + ('\u{237c}', '\u{237c}', Script::Common), ('\u{237d}', '\u{239a}', Script::Common), + ('\u{239b}', '\u{23b3}', Script::Common), ('\u{23b4}', '\u{23db}', Script::Common), + ('\u{23dc}', '\u{23e1}', Script::Common), ('\u{23e2}', '\u{2426}', Script::Common), + ('\u{2440}', '\u{244a}', Script::Common), ('\u{2460}', '\u{249b}', Script::Common), + ('\u{249c}', '\u{24e9}', Script::Common), ('\u{24ea}', '\u{24ff}', Script::Common), + ('\u{2500}', '\u{25b6}', Script::Common), ('\u{25b7}', '\u{25b7}', Script::Common), + ('\u{25b8}', '\u{25c0}', Script::Common), ('\u{25c1}', '\u{25c1}', Script::Common), + ('\u{25c2}', '\u{25f7}', Script::Common), ('\u{25f8}', '\u{25ff}', Script::Common), + ('\u{2600}', '\u{266e}', Script::Common), ('\u{266f}', '\u{266f}', Script::Common), + ('\u{2670}', '\u{2767}', Script::Common), ('\u{2768}', '\u{2768}', Script::Common), + ('\u{2769}', '\u{2769}', Script::Common), ('\u{276a}', '\u{276a}', Script::Common), + ('\u{276b}', '\u{276b}', Script::Common), ('\u{276c}', '\u{276c}', Script::Common), + ('\u{276d}', '\u{276d}', Script::Common), ('\u{276e}', '\u{276e}', Script::Common), + ('\u{276f}', '\u{276f}', Script::Common), ('\u{2770}', '\u{2770}', Script::Common), + ('\u{2771}', '\u{2771}', Script::Common), ('\u{2772}', '\u{2772}', Script::Common), + ('\u{2773}', '\u{2773}', Script::Common), ('\u{2774}', '\u{2774}', Script::Common), + ('\u{2775}', '\u{2775}', Script::Common), ('\u{2776}', '\u{2793}', Script::Common), + ('\u{2794}', '\u{27bf}', Script::Common), ('\u{27c0}', '\u{27c4}', Script::Common), + ('\u{27c5}', '\u{27c5}', Script::Common), ('\u{27c6}', '\u{27c6}', Script::Common), + ('\u{27c7}', '\u{27e5}', Script::Common), ('\u{27e6}', '\u{27e6}', Script::Common), + ('\u{27e7}', '\u{27e7}', Script::Common), ('\u{27e8}', '\u{27e8}', Script::Common), + ('\u{27e9}', '\u{27e9}', Script::Common), ('\u{27ea}', '\u{27ea}', Script::Common), + ('\u{27eb}', '\u{27eb}', Script::Common), ('\u{27ec}', '\u{27ec}', Script::Common), + ('\u{27ed}', '\u{27ed}', Script::Common), ('\u{27ee}', '\u{27ee}', Script::Common), + ('\u{27ef}', '\u{27ef}', Script::Common), ('\u{27f0}', '\u{27ff}', Script::Common), + ('\u{2800}', '\u{28ff}', Script::Braille), ('\u{2900}', '\u{2982}', Script::Common), + ('\u{2983}', '\u{2983}', Script::Common), ('\u{2984}', '\u{2984}', Script::Common), + ('\u{2985}', '\u{2985}', Script::Common), ('\u{2986}', '\u{2986}', Script::Common), + ('\u{2987}', '\u{2987}', Script::Common), ('\u{2988}', '\u{2988}', Script::Common), + ('\u{2989}', '\u{2989}', Script::Common), ('\u{298a}', '\u{298a}', Script::Common), + ('\u{298b}', '\u{298b}', Script::Common), ('\u{298c}', '\u{298c}', Script::Common), + ('\u{298d}', '\u{298d}', Script::Common), ('\u{298e}', '\u{298e}', Script::Common), + ('\u{298f}', '\u{298f}', Script::Common), ('\u{2990}', '\u{2990}', Script::Common), + ('\u{2991}', '\u{2991}', Script::Common), ('\u{2992}', '\u{2992}', Script::Common), + ('\u{2993}', '\u{2993}', Script::Common), ('\u{2994}', '\u{2994}', Script::Common), + ('\u{2995}', '\u{2995}', Script::Common), ('\u{2996}', '\u{2996}', Script::Common), + ('\u{2997}', '\u{2997}', Script::Common), ('\u{2998}', '\u{2998}', Script::Common), + ('\u{2999}', '\u{29d7}', Script::Common), ('\u{29d8}', '\u{29d8}', Script::Common), + ('\u{29d9}', '\u{29d9}', Script::Common), ('\u{29da}', '\u{29da}', Script::Common), + ('\u{29db}', '\u{29db}', Script::Common), ('\u{29dc}', '\u{29fb}', Script::Common), + ('\u{29fc}', '\u{29fc}', Script::Common), ('\u{29fd}', '\u{29fd}', Script::Common), + ('\u{29fe}', '\u{2aff}', Script::Common), ('\u{2b00}', '\u{2b2f}', Script::Common), + ('\u{2b30}', '\u{2b44}', Script::Common), ('\u{2b45}', '\u{2b46}', Script::Common), + ('\u{2b47}', '\u{2b4c}', Script::Common), ('\u{2b4d}', '\u{2b73}', Script::Common), + ('\u{2b76}', '\u{2b95}', Script::Common), ('\u{2b98}', '\u{2bff}', Script::Common), + ('\u{2c00}', '\u{2c2e}', Script::Glagolitic), ('\u{2c30}', '\u{2c5e}', + Script::Glagolitic), ('\u{2c60}', '\u{2c7b}', Script::Latin), ('\u{2c7c}', '\u{2c7d}', + Script::Latin), ('\u{2c7e}', '\u{2c7f}', Script::Latin), ('\u{2c80}', '\u{2ce4}', + Script::Coptic), ('\u{2ce5}', '\u{2cea}', Script::Coptic), ('\u{2ceb}', '\u{2cee}', + Script::Coptic), ('\u{2cef}', '\u{2cf1}', Script::Coptic), ('\u{2cf2}', '\u{2cf3}', + Script::Coptic), ('\u{2cf9}', '\u{2cfc}', Script::Coptic), ('\u{2cfd}', '\u{2cfd}', + Script::Coptic), ('\u{2cfe}', '\u{2cff}', Script::Coptic), ('\u{2d00}', '\u{2d25}', + Script::Georgian), ('\u{2d27}', '\u{2d27}', Script::Georgian), ('\u{2d2d}', '\u{2d2d}', + Script::Georgian), ('\u{2d30}', '\u{2d67}', Script::Tifinagh), ('\u{2d6f}', '\u{2d6f}', + Script::Tifinagh), ('\u{2d70}', '\u{2d70}', Script::Tifinagh), ('\u{2d7f}', '\u{2d7f}', + Script::Tifinagh), ('\u{2d80}', '\u{2d96}', Script::Ethiopic), ('\u{2da0}', '\u{2da6}', + Script::Ethiopic), ('\u{2da8}', '\u{2dae}', Script::Ethiopic), ('\u{2db0}', '\u{2db6}', + Script::Ethiopic), ('\u{2db8}', '\u{2dbe}', Script::Ethiopic), ('\u{2dc0}', '\u{2dc6}', + Script::Ethiopic), ('\u{2dc8}', '\u{2dce}', Script::Ethiopic), ('\u{2dd0}', '\u{2dd6}', + Script::Ethiopic), ('\u{2dd8}', '\u{2dde}', Script::Ethiopic), ('\u{2de0}', '\u{2dff}', + Script::Cyrillic), ('\u{2e00}', '\u{2e01}', Script::Common), ('\u{2e02}', '\u{2e02}', + Script::Common), ('\u{2e03}', '\u{2e03}', Script::Common), ('\u{2e04}', '\u{2e04}', + Script::Common), ('\u{2e05}', '\u{2e05}', Script::Common), ('\u{2e06}', '\u{2e08}', + Script::Common), ('\u{2e09}', '\u{2e09}', Script::Common), ('\u{2e0a}', '\u{2e0a}', + Script::Common), ('\u{2e0b}', '\u{2e0b}', Script::Common), ('\u{2e0c}', '\u{2e0c}', + Script::Common), ('\u{2e0d}', '\u{2e0d}', Script::Common), ('\u{2e0e}', '\u{2e16}', + Script::Common), ('\u{2e17}', '\u{2e17}', Script::Common), ('\u{2e18}', '\u{2e19}', + Script::Common), ('\u{2e1a}', '\u{2e1a}', Script::Common), ('\u{2e1b}', '\u{2e1b}', + Script::Common), ('\u{2e1c}', '\u{2e1c}', Script::Common), ('\u{2e1d}', '\u{2e1d}', + Script::Common), ('\u{2e1e}', '\u{2e1f}', Script::Common), ('\u{2e20}', '\u{2e20}', + Script::Common), ('\u{2e21}', '\u{2e21}', Script::Common), ('\u{2e22}', '\u{2e22}', + Script::Common), ('\u{2e23}', '\u{2e23}', Script::Common), ('\u{2e24}', '\u{2e24}', + Script::Common), ('\u{2e25}', '\u{2e25}', Script::Common), ('\u{2e26}', '\u{2e26}', + Script::Common), ('\u{2e27}', '\u{2e27}', Script::Common), ('\u{2e28}', '\u{2e28}', + Script::Common), ('\u{2e29}', '\u{2e29}', Script::Common), ('\u{2e2a}', '\u{2e2e}', + Script::Common), ('\u{2e2f}', '\u{2e2f}', Script::Common), ('\u{2e30}', '\u{2e39}', + Script::Common), ('\u{2e3a}', '\u{2e3b}', Script::Common), ('\u{2e3c}', '\u{2e3f}', + Script::Common), ('\u{2e40}', '\u{2e40}', Script::Common), ('\u{2e41}', '\u{2e41}', + Script::Common), ('\u{2e42}', '\u{2e42}', Script::Common), ('\u{2e43}', '\u{2e4f}', + Script::Common), ('\u{2e80}', '\u{2e99}', Script::Han), ('\u{2e9b}', '\u{2ef3}', + Script::Han), ('\u{2f00}', '\u{2fd5}', Script::Han), ('\u{2ff0}', '\u{2ffb}', + Script::Common), ('\u{3000}', '\u{3000}', Script::Common), ('\u{3001}', '\u{3003}', + Script::Common), ('\u{3004}', '\u{3004}', Script::Common), ('\u{3005}', '\u{3005}', + Script::Han), ('\u{3006}', '\u{3006}', Script::Common), ('\u{3007}', '\u{3007}', + Script::Han), ('\u{3008}', '\u{3008}', Script::Common), ('\u{3009}', '\u{3009}', + Script::Common), ('\u{300a}', '\u{300a}', Script::Common), ('\u{300b}', '\u{300b}', + Script::Common), ('\u{300c}', '\u{300c}', Script::Common), ('\u{300d}', '\u{300d}', + Script::Common), ('\u{300e}', '\u{300e}', Script::Common), ('\u{300f}', '\u{300f}', + Script::Common), ('\u{3010}', '\u{3010}', Script::Common), ('\u{3011}', '\u{3011}', + Script::Common), ('\u{3012}', '\u{3013}', Script::Common), ('\u{3014}', '\u{3014}', + Script::Common), ('\u{3015}', '\u{3015}', Script::Common), ('\u{3016}', '\u{3016}', + Script::Common), ('\u{3017}', '\u{3017}', Script::Common), ('\u{3018}', '\u{3018}', + Script::Common), ('\u{3019}', '\u{3019}', Script::Common), ('\u{301a}', '\u{301a}', + Script::Common), ('\u{301b}', '\u{301b}', Script::Common), ('\u{301c}', '\u{301c}', + Script::Common), ('\u{301d}', '\u{301d}', Script::Common), ('\u{301e}', '\u{301f}', + Script::Common), ('\u{3020}', '\u{3020}', Script::Common), ('\u{3021}', '\u{3029}', + Script::Han), ('\u{302a}', '\u{302d}', Script::Inherited), ('\u{302e}', '\u{302f}', + Script::Hangul), ('\u{3030}', '\u{3030}', Script::Common), ('\u{3031}', '\u{3035}', + Script::Common), ('\u{3036}', '\u{3037}', Script::Common), ('\u{3038}', '\u{303a}', + Script::Han), ('\u{303b}', '\u{303b}', Script::Han), ('\u{303c}', '\u{303c}', + Script::Common), ('\u{303d}', '\u{303d}', Script::Common), ('\u{303e}', '\u{303f}', + Script::Common), ('\u{3041}', '\u{3096}', Script::Hiragana), ('\u{3099}', '\u{309a}', + Script::Inherited), ('\u{309b}', '\u{309c}', Script::Common), ('\u{309d}', '\u{309e}', + Script::Hiragana), ('\u{309f}', '\u{309f}', Script::Hiragana), ('\u{30a0}', '\u{30a0}', + Script::Common), ('\u{30a1}', '\u{30fa}', Script::Katakana), ('\u{30fb}', '\u{30fb}', + Script::Common), ('\u{30fc}', '\u{30fc}', Script::Common), ('\u{30fd}', '\u{30fe}', + Script::Katakana), ('\u{30ff}', '\u{30ff}', Script::Katakana), ('\u{3105}', '\u{312f}', + Script::Bopomofo), ('\u{3131}', '\u{318e}', Script::Hangul), ('\u{3190}', '\u{3191}', + Script::Common), ('\u{3192}', '\u{3195}', Script::Common), ('\u{3196}', '\u{319f}', + Script::Common), ('\u{31a0}', '\u{31ba}', Script::Bopomofo), ('\u{31c0}', '\u{31e3}', + Script::Common), ('\u{31f0}', '\u{31ff}', Script::Katakana), ('\u{3200}', '\u{321e}', + Script::Hangul), ('\u{3220}', '\u{3229}', Script::Common), ('\u{322a}', '\u{3247}', + Script::Common), ('\u{3248}', '\u{324f}', Script::Common), ('\u{3250}', '\u{3250}', + Script::Common), ('\u{3251}', '\u{325f}', Script::Common), ('\u{3260}', '\u{327e}', + Script::Hangul), ('\u{327f}', '\u{327f}', Script::Common), ('\u{3280}', '\u{3289}', + Script::Common), ('\u{328a}', '\u{32b0}', Script::Common), ('\u{32b1}', '\u{32bf}', + Script::Common), ('\u{32c0}', '\u{32cf}', Script::Common), ('\u{32d0}', '\u{32fe}', + Script::Katakana), ('\u{3300}', '\u{3357}', Script::Katakana), ('\u{3358}', '\u{33ff}', + Script::Common), ('\u{3400}', '\u{4db5}', Script::Han), ('\u{4dc0}', '\u{4dff}', + Script::Common), ('\u{4e00}', '\u{9fef}', Script::Han), ('\u{a000}', '\u{a014}', + Script::Yi), ('\u{a015}', '\u{a015}', Script::Yi), ('\u{a016}', '\u{a48c}', Script::Yi), + ('\u{a490}', '\u{a4c6}', Script::Yi), ('\u{a4d0}', '\u{a4f7}', Script::Lisu), ('\u{a4f8}', + '\u{a4fd}', Script::Lisu), ('\u{a4fe}', '\u{a4ff}', Script::Lisu), ('\u{a500}', + '\u{a60b}', Script::Vai), ('\u{a60c}', '\u{a60c}', Script::Vai), ('\u{a60d}', '\u{a60f}', + Script::Vai), ('\u{a610}', '\u{a61f}', Script::Vai), ('\u{a620}', '\u{a629}', + Script::Vai), ('\u{a62a}', '\u{a62b}', Script::Vai), ('\u{a640}', '\u{a66d}', + Script::Cyrillic), ('\u{a66e}', '\u{a66e}', Script::Cyrillic), ('\u{a66f}', '\u{a66f}', + Script::Cyrillic), ('\u{a670}', '\u{a672}', Script::Cyrillic), ('\u{a673}', '\u{a673}', + Script::Cyrillic), ('\u{a674}', '\u{a67d}', Script::Cyrillic), ('\u{a67e}', '\u{a67e}', + Script::Cyrillic), ('\u{a67f}', '\u{a67f}', Script::Cyrillic), ('\u{a680}', '\u{a69b}', + Script::Cyrillic), ('\u{a69c}', '\u{a69d}', Script::Cyrillic), ('\u{a69e}', '\u{a69f}', + Script::Cyrillic), ('\u{a6a0}', '\u{a6e5}', Script::Bamum), ('\u{a6e6}', '\u{a6ef}', + Script::Bamum), ('\u{a6f0}', '\u{a6f1}', Script::Bamum), ('\u{a6f2}', '\u{a6f7}', + Script::Bamum), ('\u{a700}', '\u{a716}', Script::Common), ('\u{a717}', '\u{a71f}', + Script::Common), ('\u{a720}', '\u{a721}', Script::Common), ('\u{a722}', '\u{a76f}', + Script::Latin), ('\u{a770}', '\u{a770}', Script::Latin), ('\u{a771}', '\u{a787}', + Script::Latin), ('\u{a788}', '\u{a788}', Script::Common), ('\u{a789}', '\u{a78a}', + Script::Common), ('\u{a78b}', '\u{a78e}', Script::Latin), ('\u{a78f}', '\u{a78f}', + Script::Latin), ('\u{a790}', '\u{a7bf}', Script::Latin), ('\u{a7c2}', '\u{a7c6}', + Script::Latin), ('\u{a7f7}', '\u{a7f7}', Script::Latin), ('\u{a7f8}', '\u{a7f9}', + Script::Latin), ('\u{a7fa}', '\u{a7fa}', Script::Latin), ('\u{a7fb}', '\u{a7ff}', + Script::Latin), ('\u{a800}', '\u{a801}', Script::Syloti_Nagri), ('\u{a802}', '\u{a802}', + Script::Syloti_Nagri), ('\u{a803}', '\u{a805}', Script::Syloti_Nagri), ('\u{a806}', + '\u{a806}', Script::Syloti_Nagri), ('\u{a807}', '\u{a80a}', Script::Syloti_Nagri), + ('\u{a80b}', '\u{a80b}', Script::Syloti_Nagri), ('\u{a80c}', '\u{a822}', + Script::Syloti_Nagri), ('\u{a823}', '\u{a824}', Script::Syloti_Nagri), ('\u{a825}', + '\u{a826}', Script::Syloti_Nagri), ('\u{a827}', '\u{a827}', Script::Syloti_Nagri), + ('\u{a828}', '\u{a82b}', Script::Syloti_Nagri), ('\u{a830}', '\u{a835}', Script::Common), + ('\u{a836}', '\u{a837}', Script::Common), ('\u{a838}', '\u{a838}', Script::Common), + ('\u{a839}', '\u{a839}', Script::Common), ('\u{a840}', '\u{a873}', Script::Phags_Pa), + ('\u{a874}', '\u{a877}', Script::Phags_Pa), ('\u{a880}', '\u{a881}', Script::Saurashtra), + ('\u{a882}', '\u{a8b3}', Script::Saurashtra), ('\u{a8b4}', '\u{a8c3}', + Script::Saurashtra), ('\u{a8c4}', '\u{a8c5}', Script::Saurashtra), ('\u{a8ce}', + '\u{a8cf}', Script::Saurashtra), ('\u{a8d0}', '\u{a8d9}', Script::Saurashtra), + ('\u{a8e0}', '\u{a8f1}', Script::Devanagari), ('\u{a8f2}', '\u{a8f7}', + Script::Devanagari), ('\u{a8f8}', '\u{a8fa}', Script::Devanagari), ('\u{a8fb}', + '\u{a8fb}', Script::Devanagari), ('\u{a8fc}', '\u{a8fc}', Script::Devanagari), + ('\u{a8fd}', '\u{a8fe}', Script::Devanagari), ('\u{a8ff}', '\u{a8ff}', + Script::Devanagari), ('\u{a900}', '\u{a909}', Script::Kayah_Li), ('\u{a90a}', '\u{a925}', + Script::Kayah_Li), ('\u{a926}', '\u{a92d}', Script::Kayah_Li), ('\u{a92e}', '\u{a92e}', + Script::Common), ('\u{a92f}', '\u{a92f}', Script::Kayah_Li), ('\u{a930}', '\u{a946}', + Script::Rejang), ('\u{a947}', '\u{a951}', Script::Rejang), ('\u{a952}', '\u{a953}', + Script::Rejang), ('\u{a95f}', '\u{a95f}', Script::Rejang), ('\u{a960}', '\u{a97c}', + Script::Hangul), ('\u{a980}', '\u{a982}', Script::Javanese), ('\u{a983}', '\u{a983}', + Script::Javanese), ('\u{a984}', '\u{a9b2}', Script::Javanese), ('\u{a9b3}', '\u{a9b3}', + Script::Javanese), ('\u{a9b4}', '\u{a9b5}', Script::Javanese), ('\u{a9b6}', '\u{a9b9}', + Script::Javanese), ('\u{a9ba}', '\u{a9bb}', Script::Javanese), ('\u{a9bc}', '\u{a9bd}', + Script::Javanese), ('\u{a9be}', '\u{a9c0}', Script::Javanese), ('\u{a9c1}', '\u{a9cd}', + Script::Javanese), ('\u{a9cf}', '\u{a9cf}', Script::Common), ('\u{a9d0}', '\u{a9d9}', + Script::Javanese), ('\u{a9de}', '\u{a9df}', Script::Javanese), ('\u{a9e0}', '\u{a9e4}', + Script::Myanmar), ('\u{a9e5}', '\u{a9e5}', Script::Myanmar), ('\u{a9e6}', '\u{a9e6}', + Script::Myanmar), ('\u{a9e7}', '\u{a9ef}', Script::Myanmar), ('\u{a9f0}', '\u{a9f9}', + Script::Myanmar), ('\u{a9fa}', '\u{a9fe}', Script::Myanmar), ('\u{aa00}', '\u{aa28}', + Script::Cham), ('\u{aa29}', '\u{aa2e}', Script::Cham), ('\u{aa2f}', '\u{aa30}', + Script::Cham), ('\u{aa31}', '\u{aa32}', Script::Cham), ('\u{aa33}', '\u{aa34}', + Script::Cham), ('\u{aa35}', '\u{aa36}', Script::Cham), ('\u{aa40}', '\u{aa42}', + Script::Cham), ('\u{aa43}', '\u{aa43}', Script::Cham), ('\u{aa44}', '\u{aa4b}', + Script::Cham), ('\u{aa4c}', '\u{aa4c}', Script::Cham), ('\u{aa4d}', '\u{aa4d}', + Script::Cham), ('\u{aa50}', '\u{aa59}', Script::Cham), ('\u{aa5c}', '\u{aa5f}', + Script::Cham), ('\u{aa60}', '\u{aa6f}', Script::Myanmar), ('\u{aa70}', '\u{aa70}', + Script::Myanmar), ('\u{aa71}', '\u{aa76}', Script::Myanmar), ('\u{aa77}', '\u{aa79}', + Script::Myanmar), ('\u{aa7a}', '\u{aa7a}', Script::Myanmar), ('\u{aa7b}', '\u{aa7b}', + Script::Myanmar), ('\u{aa7c}', '\u{aa7c}', Script::Myanmar), ('\u{aa7d}', '\u{aa7d}', + Script::Myanmar), ('\u{aa7e}', '\u{aa7f}', Script::Myanmar), ('\u{aa80}', '\u{aaaf}', + Script::Tai_Viet), ('\u{aab0}', '\u{aab0}', Script::Tai_Viet), ('\u{aab1}', '\u{aab1}', + Script::Tai_Viet), ('\u{aab2}', '\u{aab4}', Script::Tai_Viet), ('\u{aab5}', '\u{aab6}', + Script::Tai_Viet), ('\u{aab7}', '\u{aab8}', Script::Tai_Viet), ('\u{aab9}', '\u{aabd}', + Script::Tai_Viet), ('\u{aabe}', '\u{aabf}', Script::Tai_Viet), ('\u{aac0}', '\u{aac0}', + Script::Tai_Viet), ('\u{aac1}', '\u{aac1}', Script::Tai_Viet), ('\u{aac2}', '\u{aac2}', + Script::Tai_Viet), ('\u{aadb}', '\u{aadc}', Script::Tai_Viet), ('\u{aadd}', '\u{aadd}', + Script::Tai_Viet), ('\u{aade}', '\u{aadf}', Script::Tai_Viet), ('\u{aae0}', '\u{aaea}', + Script::Meetei_Mayek), ('\u{aaeb}', '\u{aaeb}', Script::Meetei_Mayek), ('\u{aaec}', + '\u{aaed}', Script::Meetei_Mayek), ('\u{aaee}', '\u{aaef}', Script::Meetei_Mayek), + ('\u{aaf0}', '\u{aaf1}', Script::Meetei_Mayek), ('\u{aaf2}', '\u{aaf2}', + Script::Meetei_Mayek), ('\u{aaf3}', '\u{aaf4}', Script::Meetei_Mayek), ('\u{aaf5}', + '\u{aaf5}', Script::Meetei_Mayek), ('\u{aaf6}', '\u{aaf6}', Script::Meetei_Mayek), + ('\u{ab01}', '\u{ab06}', Script::Ethiopic), ('\u{ab09}', '\u{ab0e}', Script::Ethiopic), + ('\u{ab11}', '\u{ab16}', Script::Ethiopic), ('\u{ab20}', '\u{ab26}', Script::Ethiopic), + ('\u{ab28}', '\u{ab2e}', Script::Ethiopic), ('\u{ab30}', '\u{ab5a}', Script::Latin), + ('\u{ab5b}', '\u{ab5b}', Script::Common), ('\u{ab5c}', '\u{ab5f}', Script::Latin), + ('\u{ab60}', '\u{ab64}', Script::Latin), ('\u{ab65}', '\u{ab65}', Script::Greek), + ('\u{ab66}', '\u{ab67}', Script::Latin), ('\u{ab70}', '\u{abbf}', Script::Cherokee), + ('\u{abc0}', '\u{abe2}', Script::Meetei_Mayek), ('\u{abe3}', '\u{abe4}', + Script::Meetei_Mayek), ('\u{abe5}', '\u{abe5}', Script::Meetei_Mayek), ('\u{abe6}', + '\u{abe7}', Script::Meetei_Mayek), ('\u{abe8}', '\u{abe8}', Script::Meetei_Mayek), + ('\u{abe9}', '\u{abea}', Script::Meetei_Mayek), ('\u{abeb}', '\u{abeb}', + Script::Meetei_Mayek), ('\u{abec}', '\u{abec}', Script::Meetei_Mayek), ('\u{abed}', + '\u{abed}', Script::Meetei_Mayek), ('\u{abf0}', '\u{abf9}', Script::Meetei_Mayek), + ('\u{ac00}', '\u{d7a3}', Script::Hangul), ('\u{d7b0}', '\u{d7c6}', Script::Hangul), + ('\u{d7cb}', '\u{d7fb}', Script::Hangul), ('\u{f900}', '\u{fa6d}', Script::Han), + ('\u{fa70}', '\u{fad9}', Script::Han), ('\u{fb00}', '\u{fb06}', Script::Latin), + ('\u{fb13}', '\u{fb17}', Script::Armenian), ('\u{fb1d}', '\u{fb1d}', Script::Hebrew), + ('\u{fb1e}', '\u{fb1e}', Script::Hebrew), ('\u{fb1f}', '\u{fb28}', Script::Hebrew), + ('\u{fb29}', '\u{fb29}', Script::Hebrew), ('\u{fb2a}', '\u{fb36}', Script::Hebrew), + ('\u{fb38}', '\u{fb3c}', Script::Hebrew), ('\u{fb3e}', '\u{fb3e}', Script::Hebrew), + ('\u{fb40}', '\u{fb41}', Script::Hebrew), ('\u{fb43}', '\u{fb44}', Script::Hebrew), + ('\u{fb46}', '\u{fb4f}', Script::Hebrew), ('\u{fb50}', '\u{fbb1}', Script::Arabic), + ('\u{fbb2}', '\u{fbc1}', Script::Arabic), ('\u{fbd3}', '\u{fd3d}', Script::Arabic), + ('\u{fd3e}', '\u{fd3e}', Script::Common), ('\u{fd3f}', '\u{fd3f}', Script::Common), + ('\u{fd50}', '\u{fd8f}', Script::Arabic), ('\u{fd92}', '\u{fdc7}', Script::Arabic), + ('\u{fdf0}', '\u{fdfb}', Script::Arabic), ('\u{fdfc}', '\u{fdfc}', Script::Arabic), + ('\u{fdfd}', '\u{fdfd}', Script::Arabic), ('\u{fe00}', '\u{fe0f}', Script::Inherited), + ('\u{fe10}', '\u{fe16}', Script::Common), ('\u{fe17}', '\u{fe17}', Script::Common), + ('\u{fe18}', '\u{fe18}', Script::Common), ('\u{fe19}', '\u{fe19}', Script::Common), + ('\u{fe20}', '\u{fe2d}', Script::Inherited), ('\u{fe2e}', '\u{fe2f}', Script::Cyrillic), + ('\u{fe30}', '\u{fe30}', Script::Common), ('\u{fe31}', '\u{fe32}', Script::Common), + ('\u{fe33}', '\u{fe34}', Script::Common), ('\u{fe35}', '\u{fe35}', Script::Common), + ('\u{fe36}', '\u{fe36}', Script::Common), ('\u{fe37}', '\u{fe37}', Script::Common), + ('\u{fe38}', '\u{fe38}', Script::Common), ('\u{fe39}', '\u{fe39}', Script::Common), + ('\u{fe3a}', '\u{fe3a}', Script::Common), ('\u{fe3b}', '\u{fe3b}', Script::Common), + ('\u{fe3c}', '\u{fe3c}', Script::Common), ('\u{fe3d}', '\u{fe3d}', Script::Common), + ('\u{fe3e}', '\u{fe3e}', Script::Common), ('\u{fe3f}', '\u{fe3f}', Script::Common), + ('\u{fe40}', '\u{fe40}', Script::Common), ('\u{fe41}', '\u{fe41}', Script::Common), + ('\u{fe42}', '\u{fe42}', Script::Common), ('\u{fe43}', '\u{fe43}', Script::Common), + ('\u{fe44}', '\u{fe44}', Script::Common), ('\u{fe45}', '\u{fe46}', Script::Common), + ('\u{fe47}', '\u{fe47}', Script::Common), ('\u{fe48}', '\u{fe48}', Script::Common), + ('\u{fe49}', '\u{fe4c}', Script::Common), ('\u{fe4d}', '\u{fe4f}', Script::Common), + ('\u{fe50}', '\u{fe52}', Script::Common), ('\u{fe54}', '\u{fe57}', Script::Common), + ('\u{fe58}', '\u{fe58}', Script::Common), ('\u{fe59}', '\u{fe59}', Script::Common), + ('\u{fe5a}', '\u{fe5a}', Script::Common), ('\u{fe5b}', '\u{fe5b}', Script::Common), + ('\u{fe5c}', '\u{fe5c}', Script::Common), ('\u{fe5d}', '\u{fe5d}', Script::Common), + ('\u{fe5e}', '\u{fe5e}', Script::Common), ('\u{fe5f}', '\u{fe61}', Script::Common), + ('\u{fe62}', '\u{fe62}', Script::Common), ('\u{fe63}', '\u{fe63}', Script::Common), + ('\u{fe64}', '\u{fe66}', Script::Common), ('\u{fe68}', '\u{fe68}', Script::Common), + ('\u{fe69}', '\u{fe69}', Script::Common), ('\u{fe6a}', '\u{fe6b}', Script::Common), + ('\u{fe70}', '\u{fe74}', Script::Arabic), ('\u{fe76}', '\u{fefc}', Script::Arabic), + ('\u{feff}', '\u{feff}', Script::Common), ('\u{ff01}', '\u{ff03}', Script::Common), + ('\u{ff04}', '\u{ff04}', Script::Common), ('\u{ff05}', '\u{ff07}', Script::Common), + ('\u{ff08}', '\u{ff08}', Script::Common), ('\u{ff09}', '\u{ff09}', Script::Common), + ('\u{ff0a}', '\u{ff0a}', Script::Common), ('\u{ff0b}', '\u{ff0b}', Script::Common), + ('\u{ff0c}', '\u{ff0c}', Script::Common), ('\u{ff0d}', '\u{ff0d}', Script::Common), + ('\u{ff0e}', '\u{ff0f}', Script::Common), ('\u{ff10}', '\u{ff19}', Script::Common), + ('\u{ff1a}', '\u{ff1b}', Script::Common), ('\u{ff1c}', '\u{ff1e}', Script::Common), + ('\u{ff1f}', '\u{ff20}', Script::Common), ('\u{ff21}', '\u{ff3a}', Script::Latin), + ('\u{ff3b}', '\u{ff3b}', Script::Common), ('\u{ff3c}', '\u{ff3c}', Script::Common), + ('\u{ff3d}', '\u{ff3d}', Script::Common), ('\u{ff3e}', '\u{ff3e}', Script::Common), + ('\u{ff3f}', '\u{ff3f}', Script::Common), ('\u{ff40}', '\u{ff40}', Script::Common), + ('\u{ff41}', '\u{ff5a}', Script::Latin), ('\u{ff5b}', '\u{ff5b}', Script::Common), + ('\u{ff5c}', '\u{ff5c}', Script::Common), ('\u{ff5d}', '\u{ff5d}', Script::Common), + ('\u{ff5e}', '\u{ff5e}', Script::Common), ('\u{ff5f}', '\u{ff5f}', Script::Common), + ('\u{ff60}', '\u{ff60}', Script::Common), ('\u{ff61}', '\u{ff61}', Script::Common), + ('\u{ff62}', '\u{ff62}', Script::Common), ('\u{ff63}', '\u{ff63}', Script::Common), + ('\u{ff64}', '\u{ff65}', Script::Common), ('\u{ff66}', '\u{ff6f}', Script::Katakana), + ('\u{ff70}', '\u{ff70}', Script::Common), ('\u{ff71}', '\u{ff9d}', Script::Katakana), + ('\u{ff9e}', '\u{ff9f}', Script::Common), ('\u{ffa0}', '\u{ffbe}', Script::Hangul), + ('\u{ffc2}', '\u{ffc7}', Script::Hangul), ('\u{ffca}', '\u{ffcf}', Script::Hangul), + ('\u{ffd2}', '\u{ffd7}', Script::Hangul), ('\u{ffda}', '\u{ffdc}', Script::Hangul), + ('\u{ffe0}', '\u{ffe1}', Script::Common), ('\u{ffe2}', '\u{ffe2}', Script::Common), + ('\u{ffe3}', '\u{ffe3}', Script::Common), ('\u{ffe4}', '\u{ffe4}', Script::Common), + ('\u{ffe5}', '\u{ffe6}', Script::Common), ('\u{ffe8}', '\u{ffe8}', Script::Common), + ('\u{ffe9}', '\u{ffec}', Script::Common), ('\u{ffed}', '\u{ffee}', Script::Common), + ('\u{fff9}', '\u{fffb}', Script::Common), ('\u{fffc}', '\u{fffd}', Script::Common), + ('\u{10000}', '\u{1000b}', Script::Linear_B), ('\u{1000d}', '\u{10026}', + Script::Linear_B), ('\u{10028}', '\u{1003a}', Script::Linear_B), ('\u{1003c}', + '\u{1003d}', Script::Linear_B), ('\u{1003f}', '\u{1004d}', Script::Linear_B), + ('\u{10050}', '\u{1005d}', Script::Linear_B), ('\u{10080}', '\u{100fa}', + Script::Linear_B), ('\u{10100}', '\u{10102}', Script::Common), ('\u{10107}', '\u{10133}', + Script::Common), ('\u{10137}', '\u{1013f}', Script::Common), ('\u{10140}', '\u{10174}', + Script::Greek), ('\u{10175}', '\u{10178}', Script::Greek), ('\u{10179}', '\u{10189}', + Script::Greek), ('\u{1018a}', '\u{1018b}', Script::Greek), ('\u{1018c}', '\u{1018e}', + Script::Greek), ('\u{10190}', '\u{1019b}', Script::Common), ('\u{101a0}', '\u{101a0}', + Script::Greek), ('\u{101d0}', '\u{101fc}', Script::Common), ('\u{101fd}', '\u{101fd}', + Script::Inherited), ('\u{10280}', '\u{1029c}', Script::Lycian), ('\u{102a0}', '\u{102d0}', + Script::Carian), ('\u{102e0}', '\u{102e0}', Script::Inherited), ('\u{102e1}', '\u{102fb}', + Script::Common), ('\u{10300}', '\u{1031f}', Script::Old_Italic), ('\u{10320}', + '\u{10323}', Script::Old_Italic), ('\u{1032d}', '\u{1032f}', Script::Old_Italic), + ('\u{10330}', '\u{10340}', Script::Gothic), ('\u{10341}', '\u{10341}', Script::Gothic), + ('\u{10342}', '\u{10349}', Script::Gothic), ('\u{1034a}', '\u{1034a}', Script::Gothic), + ('\u{10350}', '\u{10375}', Script::Old_Permic), ('\u{10376}', '\u{1037a}', + Script::Old_Permic), ('\u{10380}', '\u{1039d}', Script::Ugaritic), ('\u{1039f}', + '\u{1039f}', Script::Ugaritic), ('\u{103a0}', '\u{103c3}', Script::Old_Persian), + ('\u{103c8}', '\u{103cf}', Script::Old_Persian), ('\u{103d0}', '\u{103d0}', + Script::Old_Persian), ('\u{103d1}', '\u{103d5}', Script::Old_Persian), ('\u{10400}', + '\u{1044f}', Script::Deseret), ('\u{10450}', '\u{1047f}', Script::Shavian), ('\u{10480}', + '\u{1049d}', Script::Osmanya), ('\u{104a0}', '\u{104a9}', Script::Osmanya), ('\u{104b0}', + '\u{104d3}', Script::Osage), ('\u{104d8}', '\u{104fb}', Script::Osage), ('\u{10500}', + '\u{10527}', Script::Elbasan), ('\u{10530}', '\u{10563}', Script::Caucasian_Albanian), + ('\u{1056f}', '\u{1056f}', Script::Caucasian_Albanian), ('\u{10600}', '\u{10736}', + Script::Linear_A), ('\u{10740}', '\u{10755}', Script::Linear_A), ('\u{10760}', + '\u{10767}', Script::Linear_A), ('\u{10800}', '\u{10805}', Script::Cypriot), ('\u{10808}', + '\u{10808}', Script::Cypriot), ('\u{1080a}', '\u{10835}', Script::Cypriot), ('\u{10837}', + '\u{10838}', Script::Cypriot), ('\u{1083c}', '\u{1083c}', Script::Cypriot), ('\u{1083f}', + '\u{1083f}', Script::Cypriot), ('\u{10840}', '\u{10855}', Script::Imperial_Aramaic), + ('\u{10857}', '\u{10857}', Script::Imperial_Aramaic), ('\u{10858}', '\u{1085f}', + Script::Imperial_Aramaic), ('\u{10860}', '\u{10876}', Script::Palmyrene), ('\u{10877}', + '\u{10878}', Script::Palmyrene), ('\u{10879}', '\u{1087f}', Script::Palmyrene), + ('\u{10880}', '\u{1089e}', Script::Nabataean), ('\u{108a7}', '\u{108af}', + Script::Nabataean), ('\u{108e0}', '\u{108f2}', Script::Hatran), ('\u{108f4}', '\u{108f5}', + Script::Hatran), ('\u{108fb}', '\u{108ff}', Script::Hatran), ('\u{10900}', '\u{10915}', + Script::Phoenician), ('\u{10916}', '\u{1091b}', Script::Phoenician), ('\u{1091f}', + '\u{1091f}', Script::Phoenician), ('\u{10920}', '\u{10939}', Script::Lydian), + ('\u{1093f}', '\u{1093f}', Script::Lydian), ('\u{10980}', '\u{1099f}', + Script::Meroitic_Hieroglyphs), ('\u{109a0}', '\u{109b7}', Script::Meroitic_Cursive), + ('\u{109bc}', '\u{109bd}', Script::Meroitic_Cursive), ('\u{109be}', '\u{109bf}', + Script::Meroitic_Cursive), ('\u{109c0}', '\u{109cf}', Script::Meroitic_Cursive), + ('\u{109d2}', '\u{109ff}', Script::Meroitic_Cursive), ('\u{10a00}', '\u{10a00}', + Script::Kharoshthi), ('\u{10a01}', '\u{10a03}', Script::Kharoshthi), ('\u{10a05}', + '\u{10a06}', Script::Kharoshthi), ('\u{10a0c}', '\u{10a0f}', Script::Kharoshthi), + ('\u{10a10}', '\u{10a13}', Script::Kharoshthi), ('\u{10a15}', '\u{10a17}', + Script::Kharoshthi), ('\u{10a19}', '\u{10a35}', Script::Kharoshthi), ('\u{10a38}', + '\u{10a3a}', Script::Kharoshthi), ('\u{10a3f}', '\u{10a3f}', Script::Kharoshthi), + ('\u{10a40}', '\u{10a48}', Script::Kharoshthi), ('\u{10a50}', '\u{10a58}', + Script::Kharoshthi), ('\u{10a60}', '\u{10a7c}', Script::Old_South_Arabian), ('\u{10a7d}', + '\u{10a7e}', Script::Old_South_Arabian), ('\u{10a7f}', '\u{10a7f}', + Script::Old_South_Arabian), ('\u{10a80}', '\u{10a9c}', Script::Old_North_Arabian), + ('\u{10a9d}', '\u{10a9f}', Script::Old_North_Arabian), ('\u{10ac0}', '\u{10ac7}', + Script::Manichaean), ('\u{10ac8}', '\u{10ac8}', Script::Manichaean), ('\u{10ac9}', + '\u{10ae4}', Script::Manichaean), ('\u{10ae5}', '\u{10ae6}', Script::Manichaean), + ('\u{10aeb}', '\u{10aef}', Script::Manichaean), ('\u{10af0}', '\u{10af6}', + Script::Manichaean), ('\u{10b00}', '\u{10b35}', Script::Avestan), ('\u{10b39}', + '\u{10b3f}', Script::Avestan), ('\u{10b40}', '\u{10b55}', Script::Inscriptional_Parthian), + ('\u{10b58}', '\u{10b5f}', Script::Inscriptional_Parthian), ('\u{10b60}', '\u{10b72}', + Script::Inscriptional_Pahlavi), ('\u{10b78}', '\u{10b7f}', Script::Inscriptional_Pahlavi), + ('\u{10b80}', '\u{10b91}', Script::Psalter_Pahlavi), ('\u{10b99}', '\u{10b9c}', + Script::Psalter_Pahlavi), ('\u{10ba9}', '\u{10baf}', Script::Psalter_Pahlavi), + ('\u{10c00}', '\u{10c48}', Script::Old_Turkic), ('\u{10c80}', '\u{10cb2}', + Script::Old_Hungarian), ('\u{10cc0}', '\u{10cf2}', Script::Old_Hungarian), ('\u{10cfa}', + '\u{10cff}', Script::Old_Hungarian), ('\u{10d00}', '\u{10d23}', Script::Hanifi_Rohingya), + ('\u{10d24}', '\u{10d27}', Script::Hanifi_Rohingya), ('\u{10d30}', '\u{10d39}', + Script::Hanifi_Rohingya), ('\u{10e60}', '\u{10e7e}', Script::Arabic), ('\u{10f00}', + '\u{10f1c}', Script::Old_Sogdian), ('\u{10f1d}', '\u{10f26}', Script::Old_Sogdian), + ('\u{10f27}', '\u{10f27}', Script::Old_Sogdian), ('\u{10f30}', '\u{10f45}', + Script::Sogdian), ('\u{10f46}', '\u{10f50}', Script::Sogdian), ('\u{10f51}', '\u{10f54}', + Script::Sogdian), ('\u{10f55}', '\u{10f59}', Script::Sogdian), ('\u{10fe0}', '\u{10ff6}', + Script::Elymaic), ('\u{11000}', '\u{11000}', Script::Brahmi), ('\u{11001}', '\u{11001}', + Script::Brahmi), ('\u{11002}', '\u{11002}', Script::Brahmi), ('\u{11003}', '\u{11037}', + Script::Brahmi), ('\u{11038}', '\u{11046}', Script::Brahmi), ('\u{11047}', '\u{1104d}', + Script::Brahmi), ('\u{11052}', '\u{11065}', Script::Brahmi), ('\u{11066}', '\u{1106f}', + Script::Brahmi), ('\u{1107f}', '\u{1107f}', Script::Brahmi), ('\u{11080}', '\u{11081}', + Script::Kaithi), ('\u{11082}', '\u{11082}', Script::Kaithi), ('\u{11083}', '\u{110af}', + Script::Kaithi), ('\u{110b0}', '\u{110b2}', Script::Kaithi), ('\u{110b3}', '\u{110b6}', + Script::Kaithi), ('\u{110b7}', '\u{110b8}', Script::Kaithi), ('\u{110b9}', '\u{110ba}', + Script::Kaithi), ('\u{110bb}', '\u{110bc}', Script::Kaithi), ('\u{110bd}', '\u{110bd}', + Script::Kaithi), ('\u{110be}', '\u{110c1}', Script::Kaithi), ('\u{110cd}', '\u{110cd}', + Script::Kaithi), ('\u{110d0}', '\u{110e8}', Script::Sora_Sompeng), ('\u{110f0}', + '\u{110f9}', Script::Sora_Sompeng), ('\u{11100}', '\u{11102}', Script::Chakma), + ('\u{11103}', '\u{11126}', Script::Chakma), ('\u{11127}', '\u{1112b}', Script::Chakma), + ('\u{1112c}', '\u{1112c}', Script::Chakma), ('\u{1112d}', '\u{11134}', Script::Chakma), + ('\u{11136}', '\u{1113f}', Script::Chakma), ('\u{11140}', '\u{11143}', Script::Chakma), + ('\u{11144}', '\u{11144}', Script::Chakma), ('\u{11145}', '\u{11146}', Script::Chakma), + ('\u{11150}', '\u{11172}', Script::Mahajani), ('\u{11173}', '\u{11173}', + Script::Mahajani), ('\u{11174}', '\u{11175}', Script::Mahajani), ('\u{11176}', + '\u{11176}', Script::Mahajani), ('\u{11180}', '\u{11181}', Script::Sharada), ('\u{11182}', + '\u{11182}', Script::Sharada), ('\u{11183}', '\u{111b2}', Script::Sharada), ('\u{111b3}', + '\u{111b5}', Script::Sharada), ('\u{111b6}', '\u{111be}', Script::Sharada), ('\u{111bf}', + '\u{111c0}', Script::Sharada), ('\u{111c1}', '\u{111c4}', Script::Sharada), ('\u{111c5}', + '\u{111c8}', Script::Sharada), ('\u{111c9}', '\u{111cc}', Script::Sharada), ('\u{111cd}', + '\u{111cd}', Script::Sharada), ('\u{111d0}', '\u{111d9}', Script::Sharada), ('\u{111da}', + '\u{111da}', Script::Sharada), ('\u{111db}', '\u{111db}', Script::Sharada), ('\u{111dc}', + '\u{111dc}', Script::Sharada), ('\u{111dd}', '\u{111df}', Script::Sharada), ('\u{111e1}', + '\u{111f4}', Script::Sinhala), ('\u{11200}', '\u{11211}', Script::Khojki), ('\u{11213}', + '\u{1122b}', Script::Khojki), ('\u{1122c}', '\u{1122e}', Script::Khojki), ('\u{1122f}', + '\u{11231}', Script::Khojki), ('\u{11232}', '\u{11233}', Script::Khojki), ('\u{11234}', + '\u{11234}', Script::Khojki), ('\u{11235}', '\u{11235}', Script::Khojki), ('\u{11236}', + '\u{11237}', Script::Khojki), ('\u{11238}', '\u{1123d}', Script::Khojki), ('\u{1123e}', + '\u{1123e}', Script::Khojki), ('\u{11280}', '\u{11286}', Script::Multani), ('\u{11288}', + '\u{11288}', Script::Multani), ('\u{1128a}', '\u{1128d}', Script::Multani), ('\u{1128f}', + '\u{1129d}', Script::Multani), ('\u{1129f}', '\u{112a8}', Script::Multani), ('\u{112a9}', + '\u{112a9}', Script::Multani), ('\u{112b0}', '\u{112de}', Script::Khudawadi), + ('\u{112df}', '\u{112df}', Script::Khudawadi), ('\u{112e0}', '\u{112e2}', + Script::Khudawadi), ('\u{112e3}', '\u{112ea}', Script::Khudawadi), ('\u{112f0}', + '\u{112f9}', Script::Khudawadi), ('\u{11300}', '\u{11301}', Script::Grantha), + ('\u{11302}', '\u{11303}', Script::Grantha), ('\u{11305}', '\u{1130c}', Script::Grantha), + ('\u{1130f}', '\u{11310}', Script::Grantha), ('\u{11313}', '\u{11328}', Script::Grantha), + ('\u{1132a}', '\u{11330}', Script::Grantha), ('\u{11332}', '\u{11333}', Script::Grantha), + ('\u{11335}', '\u{11339}', Script::Grantha), ('\u{1133b}', '\u{1133b}', + Script::Inherited), ('\u{1133c}', '\u{1133c}', Script::Grantha), ('\u{1133d}', + '\u{1133d}', Script::Grantha), ('\u{1133e}', '\u{1133f}', Script::Grantha), ('\u{11340}', + '\u{11340}', Script::Grantha), ('\u{11341}', '\u{11344}', Script::Grantha), ('\u{11347}', + '\u{11348}', Script::Grantha), ('\u{1134b}', '\u{1134d}', Script::Grantha), ('\u{11350}', + '\u{11350}', Script::Grantha), ('\u{11357}', '\u{11357}', Script::Grantha), ('\u{1135d}', + '\u{11361}', Script::Grantha), ('\u{11362}', '\u{11363}', Script::Grantha), ('\u{11366}', + '\u{1136c}', Script::Grantha), ('\u{11370}', '\u{11374}', Script::Grantha), ('\u{11400}', + '\u{11434}', Script::Newa), ('\u{11435}', '\u{11437}', Script::Newa), ('\u{11438}', + '\u{1143f}', Script::Newa), ('\u{11440}', '\u{11441}', Script::Newa), ('\u{11442}', + '\u{11444}', Script::Newa), ('\u{11445}', '\u{11445}', Script::Newa), ('\u{11446}', + '\u{11446}', Script::Newa), ('\u{11447}', '\u{1144a}', Script::Newa), ('\u{1144b}', + '\u{1144f}', Script::Newa), ('\u{11450}', '\u{11459}', Script::Newa), ('\u{1145b}', + '\u{1145b}', Script::Newa), ('\u{1145d}', '\u{1145d}', Script::Newa), ('\u{1145e}', + '\u{1145e}', Script::Newa), ('\u{1145f}', '\u{1145f}', Script::Newa), ('\u{11480}', + '\u{114af}', Script::Tirhuta), ('\u{114b0}', '\u{114b2}', Script::Tirhuta), ('\u{114b3}', + '\u{114b8}', Script::Tirhuta), ('\u{114b9}', '\u{114b9}', Script::Tirhuta), ('\u{114ba}', + '\u{114ba}', Script::Tirhuta), ('\u{114bb}', '\u{114be}', Script::Tirhuta), ('\u{114bf}', + '\u{114c0}', Script::Tirhuta), ('\u{114c1}', '\u{114c1}', Script::Tirhuta), ('\u{114c2}', + '\u{114c3}', Script::Tirhuta), ('\u{114c4}', '\u{114c5}', Script::Tirhuta), ('\u{114c6}', + '\u{114c6}', Script::Tirhuta), ('\u{114c7}', '\u{114c7}', Script::Tirhuta), ('\u{114d0}', + '\u{114d9}', Script::Tirhuta), ('\u{11580}', '\u{115ae}', Script::Siddham), ('\u{115af}', + '\u{115b1}', Script::Siddham), ('\u{115b2}', '\u{115b5}', Script::Siddham), ('\u{115b8}', + '\u{115bb}', Script::Siddham), ('\u{115bc}', '\u{115bd}', Script::Siddham), ('\u{115be}', + '\u{115be}', Script::Siddham), ('\u{115bf}', '\u{115c0}', Script::Siddham), ('\u{115c1}', + '\u{115d7}', Script::Siddham), ('\u{115d8}', '\u{115db}', Script::Siddham), ('\u{115dc}', + '\u{115dd}', Script::Siddham), ('\u{11600}', '\u{1162f}', Script::Modi), ('\u{11630}', + '\u{11632}', Script::Modi), ('\u{11633}', '\u{1163a}', Script::Modi), ('\u{1163b}', + '\u{1163c}', Script::Modi), ('\u{1163d}', '\u{1163d}', Script::Modi), ('\u{1163e}', + '\u{1163e}', Script::Modi), ('\u{1163f}', '\u{11640}', Script::Modi), ('\u{11641}', + '\u{11643}', Script::Modi), ('\u{11644}', '\u{11644}', Script::Modi), ('\u{11650}', + '\u{11659}', Script::Modi), ('\u{11660}', '\u{1166c}', Script::Mongolian), ('\u{11680}', + '\u{116aa}', Script::Takri), ('\u{116ab}', '\u{116ab}', Script::Takri), ('\u{116ac}', + '\u{116ac}', Script::Takri), ('\u{116ad}', '\u{116ad}', Script::Takri), ('\u{116ae}', + '\u{116af}', Script::Takri), ('\u{116b0}', '\u{116b5}', Script::Takri), ('\u{116b6}', + '\u{116b6}', Script::Takri), ('\u{116b7}', '\u{116b7}', Script::Takri), ('\u{116b8}', + '\u{116b8}', Script::Takri), ('\u{116c0}', '\u{116c9}', Script::Takri), ('\u{11700}', + '\u{1171a}', Script::Ahom), ('\u{1171d}', '\u{1171f}', Script::Ahom), ('\u{11720}', + '\u{11721}', Script::Ahom), ('\u{11722}', '\u{11725}', Script::Ahom), ('\u{11726}', + '\u{11726}', Script::Ahom), ('\u{11727}', '\u{1172b}', Script::Ahom), ('\u{11730}', + '\u{11739}', Script::Ahom), ('\u{1173a}', '\u{1173b}', Script::Ahom), ('\u{1173c}', + '\u{1173e}', Script::Ahom), ('\u{1173f}', '\u{1173f}', Script::Ahom), ('\u{11800}', + '\u{1182b}', Script::Dogra), ('\u{1182c}', '\u{1182e}', Script::Dogra), ('\u{1182f}', + '\u{11837}', Script::Dogra), ('\u{11838}', '\u{11838}', Script::Dogra), ('\u{11839}', + '\u{1183a}', Script::Dogra), ('\u{1183b}', '\u{1183b}', Script::Dogra), ('\u{118a0}', + '\u{118df}', Script::Warang_Citi), ('\u{118e0}', '\u{118e9}', Script::Warang_Citi), + ('\u{118ea}', '\u{118f2}', Script::Warang_Citi), ('\u{118ff}', '\u{118ff}', + Script::Warang_Citi), ('\u{119a0}', '\u{119a7}', Script::Nandinagari), ('\u{119aa}', + '\u{119d0}', Script::Nandinagari), ('\u{119d1}', '\u{119d3}', Script::Nandinagari), + ('\u{119d4}', '\u{119d7}', Script::Nandinagari), ('\u{119da}', '\u{119db}', + Script::Nandinagari), ('\u{119dc}', '\u{119df}', Script::Nandinagari), ('\u{119e0}', + '\u{119e0}', Script::Nandinagari), ('\u{119e1}', '\u{119e1}', Script::Nandinagari), + ('\u{119e2}', '\u{119e2}', Script::Nandinagari), ('\u{119e3}', '\u{119e3}', + Script::Nandinagari), ('\u{119e4}', '\u{119e4}', Script::Nandinagari), ('\u{11a00}', + '\u{11a00}', Script::Zanabazar_Square), ('\u{11a01}', '\u{11a0a}', + Script::Zanabazar_Square), ('\u{11a0b}', '\u{11a32}', Script::Zanabazar_Square), + ('\u{11a33}', '\u{11a38}', Script::Zanabazar_Square), ('\u{11a39}', '\u{11a39}', + Script::Zanabazar_Square), ('\u{11a3a}', '\u{11a3a}', Script::Zanabazar_Square), + ('\u{11a3b}', '\u{11a3e}', Script::Zanabazar_Square), ('\u{11a3f}', '\u{11a46}', + Script::Zanabazar_Square), ('\u{11a47}', '\u{11a47}', Script::Zanabazar_Square), + ('\u{11a50}', '\u{11a50}', Script::Soyombo), ('\u{11a51}', '\u{11a56}', Script::Soyombo), + ('\u{11a57}', '\u{11a58}', Script::Soyombo), ('\u{11a59}', '\u{11a5b}', Script::Soyombo), + ('\u{11a5c}', '\u{11a89}', Script::Soyombo), ('\u{11a8a}', '\u{11a96}', Script::Soyombo), + ('\u{11a97}', '\u{11a97}', Script::Soyombo), ('\u{11a98}', '\u{11a99}', Script::Soyombo), + ('\u{11a9a}', '\u{11a9c}', Script::Soyombo), ('\u{11a9d}', '\u{11a9d}', Script::Soyombo), + ('\u{11a9e}', '\u{11aa2}', Script::Soyombo), ('\u{11ac0}', '\u{11af8}', + Script::Pau_Cin_Hau), ('\u{11c00}', '\u{11c08}', Script::Bhaiksuki), ('\u{11c0a}', + '\u{11c2e}', Script::Bhaiksuki), ('\u{11c2f}', '\u{11c2f}', Script::Bhaiksuki), + ('\u{11c30}', '\u{11c36}', Script::Bhaiksuki), ('\u{11c38}', '\u{11c3d}', + Script::Bhaiksuki), ('\u{11c3e}', '\u{11c3e}', Script::Bhaiksuki), ('\u{11c3f}', + '\u{11c3f}', Script::Bhaiksuki), ('\u{11c40}', '\u{11c40}', Script::Bhaiksuki), + ('\u{11c41}', '\u{11c45}', Script::Bhaiksuki), ('\u{11c50}', '\u{11c59}', + Script::Bhaiksuki), ('\u{11c5a}', '\u{11c6c}', Script::Bhaiksuki), ('\u{11c70}', + '\u{11c71}', Script::Marchen), ('\u{11c72}', '\u{11c8f}', Script::Marchen), ('\u{11c92}', + '\u{11ca7}', Script::Marchen), ('\u{11ca9}', '\u{11ca9}', Script::Marchen), ('\u{11caa}', + '\u{11cb0}', Script::Marchen), ('\u{11cb1}', '\u{11cb1}', Script::Marchen), ('\u{11cb2}', + '\u{11cb3}', Script::Marchen), ('\u{11cb4}', '\u{11cb4}', Script::Marchen), ('\u{11cb5}', + '\u{11cb6}', Script::Marchen), ('\u{11d00}', '\u{11d06}', Script::Masaram_Gondi), + ('\u{11d08}', '\u{11d09}', Script::Masaram_Gondi), ('\u{11d0b}', '\u{11d30}', + Script::Masaram_Gondi), ('\u{11d31}', '\u{11d36}', Script::Masaram_Gondi), ('\u{11d3a}', + '\u{11d3a}', Script::Masaram_Gondi), ('\u{11d3c}', '\u{11d3d}', Script::Masaram_Gondi), + ('\u{11d3f}', '\u{11d45}', Script::Masaram_Gondi), ('\u{11d46}', '\u{11d46}', + Script::Masaram_Gondi), ('\u{11d47}', '\u{11d47}', Script::Masaram_Gondi), ('\u{11d50}', + '\u{11d59}', Script::Masaram_Gondi), ('\u{11d60}', '\u{11d65}', Script::Gunjala_Gondi), + ('\u{11d67}', '\u{11d68}', Script::Gunjala_Gondi), ('\u{11d6a}', '\u{11d89}', + Script::Gunjala_Gondi), ('\u{11d8a}', '\u{11d8e}', Script::Gunjala_Gondi), ('\u{11d90}', + '\u{11d91}', Script::Gunjala_Gondi), ('\u{11d93}', '\u{11d94}', Script::Gunjala_Gondi), + ('\u{11d95}', '\u{11d95}', Script::Gunjala_Gondi), ('\u{11d96}', '\u{11d96}', + Script::Gunjala_Gondi), ('\u{11d97}', '\u{11d97}', Script::Gunjala_Gondi), ('\u{11d98}', + '\u{11d98}', Script::Gunjala_Gondi), ('\u{11da0}', '\u{11da9}', Script::Gunjala_Gondi), + ('\u{11ee0}', '\u{11ef2}', Script::Makasar), ('\u{11ef3}', '\u{11ef4}', Script::Makasar), + ('\u{11ef5}', '\u{11ef6}', Script::Makasar), ('\u{11ef7}', '\u{11ef8}', Script::Makasar), + ('\u{11fc0}', '\u{11fd4}', Script::Tamil), ('\u{11fd5}', '\u{11fdc}', Script::Tamil), + ('\u{11fdd}', '\u{11fe0}', Script::Tamil), ('\u{11fe1}', '\u{11ff1}', Script::Tamil), + ('\u{11fff}', '\u{11fff}', Script::Tamil), ('\u{12000}', '\u{12399}', Script::Cuneiform), + ('\u{12400}', '\u{1246e}', Script::Cuneiform), ('\u{12470}', '\u{12474}', + Script::Cuneiform), ('\u{12480}', '\u{12543}', Script::Cuneiform), ('\u{13000}', + '\u{1342e}', Script::Egyptian_Hieroglyphs), ('\u{13430}', '\u{13438}', + Script::Egyptian_Hieroglyphs), ('\u{14400}', '\u{14646}', Script::Anatolian_Hieroglyphs), + ('\u{16800}', '\u{16a38}', Script::Bamum), ('\u{16a40}', '\u{16a5e}', Script::Mro), + ('\u{16a60}', '\u{16a69}', Script::Mro), ('\u{16a6e}', '\u{16a6f}', Script::Mro), + ('\u{16ad0}', '\u{16aed}', Script::Bassa_Vah), ('\u{16af0}', '\u{16af4}', + Script::Bassa_Vah), ('\u{16af5}', '\u{16af5}', Script::Bassa_Vah), ('\u{16b00}', + '\u{16b2f}', Script::Pahawh_Hmong), ('\u{16b30}', '\u{16b36}', Script::Pahawh_Hmong), + ('\u{16b37}', '\u{16b3b}', Script::Pahawh_Hmong), ('\u{16b3c}', '\u{16b3f}', + Script::Pahawh_Hmong), ('\u{16b40}', '\u{16b43}', Script::Pahawh_Hmong), ('\u{16b44}', + '\u{16b44}', Script::Pahawh_Hmong), ('\u{16b45}', '\u{16b45}', Script::Pahawh_Hmong), + ('\u{16b50}', '\u{16b59}', Script::Pahawh_Hmong), ('\u{16b5b}', '\u{16b61}', + Script::Pahawh_Hmong), ('\u{16b63}', '\u{16b77}', Script::Pahawh_Hmong), ('\u{16b7d}', + '\u{16b8f}', Script::Pahawh_Hmong), ('\u{16e40}', '\u{16e7f}', Script::Medefaidrin), + ('\u{16e80}', '\u{16e96}', Script::Medefaidrin), ('\u{16e97}', '\u{16e9a}', + Script::Medefaidrin), ('\u{16f00}', '\u{16f4a}', Script::Miao), ('\u{16f4f}', '\u{16f4f}', + Script::Miao), ('\u{16f50}', '\u{16f50}', Script::Miao), ('\u{16f51}', '\u{16f87}', + Script::Miao), ('\u{16f8f}', '\u{16f92}', Script::Miao), ('\u{16f93}', '\u{16f9f}', + Script::Miao), ('\u{16fe0}', '\u{16fe0}', Script::Tangut), ('\u{16fe1}', '\u{16fe1}', + Script::Nushu), ('\u{16fe2}', '\u{16fe2}', Script::Common), ('\u{16fe3}', '\u{16fe3}', + Script::Common), ('\u{17000}', '\u{187f7}', Script::Tangut), ('\u{18800}', '\u{18af2}', + Script::Tangut), ('\u{1b000}', '\u{1b000}', Script::Katakana), ('\u{1b001}', '\u{1b11e}', + Script::Hiragana), ('\u{1b150}', '\u{1b152}', Script::Hiragana), ('\u{1b164}', + '\u{1b167}', Script::Katakana), ('\u{1b170}', '\u{1b2fb}', Script::Nushu), ('\u{1bc00}', + '\u{1bc6a}', Script::Duployan), ('\u{1bc70}', '\u{1bc7c}', Script::Duployan), + ('\u{1bc80}', '\u{1bc88}', Script::Duployan), ('\u{1bc90}', '\u{1bc99}', + Script::Duployan), ('\u{1bc9c}', '\u{1bc9c}', Script::Duployan), ('\u{1bc9d}', + '\u{1bc9e}', Script::Duployan), ('\u{1bc9f}', '\u{1bc9f}', Script::Duployan), + ('\u{1bca0}', '\u{1bca3}', Script::Common), ('\u{1d000}', '\u{1d0f5}', Script::Common), + ('\u{1d100}', '\u{1d126}', Script::Common), ('\u{1d129}', '\u{1d164}', Script::Common), + ('\u{1d165}', '\u{1d166}', Script::Common), ('\u{1d167}', '\u{1d169}', Script::Inherited), + ('\u{1d16a}', '\u{1d16c}', Script::Common), ('\u{1d16d}', '\u{1d172}', Script::Common), + ('\u{1d173}', '\u{1d17a}', Script::Common), ('\u{1d17b}', '\u{1d182}', Script::Inherited), + ('\u{1d183}', '\u{1d184}', Script::Common), ('\u{1d185}', '\u{1d18b}', Script::Inherited), + ('\u{1d18c}', '\u{1d1a9}', Script::Common), ('\u{1d1aa}', '\u{1d1ad}', Script::Inherited), + ('\u{1d1ae}', '\u{1d1e8}', Script::Common), ('\u{1d200}', '\u{1d241}', Script::Greek), + ('\u{1d242}', '\u{1d244}', Script::Greek), ('\u{1d245}', '\u{1d245}', Script::Greek), + ('\u{1d2e0}', '\u{1d2f3}', Script::Common), ('\u{1d300}', '\u{1d356}', Script::Common), + ('\u{1d360}', '\u{1d378}', Script::Common), ('\u{1d400}', '\u{1d454}', Script::Common), + ('\u{1d456}', '\u{1d49c}', Script::Common), ('\u{1d49e}', '\u{1d49f}', Script::Common), + ('\u{1d4a2}', '\u{1d4a2}', Script::Common), ('\u{1d4a5}', '\u{1d4a6}', Script::Common), + ('\u{1d4a9}', '\u{1d4ac}', Script::Common), ('\u{1d4ae}', '\u{1d4b9}', Script::Common), + ('\u{1d4bb}', '\u{1d4bb}', Script::Common), ('\u{1d4bd}', '\u{1d4c3}', Script::Common), + ('\u{1d4c5}', '\u{1d505}', Script::Common), ('\u{1d507}', '\u{1d50a}', Script::Common), + ('\u{1d50d}', '\u{1d514}', Script::Common), ('\u{1d516}', '\u{1d51c}', Script::Common), + ('\u{1d51e}', '\u{1d539}', Script::Common), ('\u{1d53b}', '\u{1d53e}', Script::Common), + ('\u{1d540}', '\u{1d544}', Script::Common), ('\u{1d546}', '\u{1d546}', Script::Common), + ('\u{1d54a}', '\u{1d550}', Script::Common), ('\u{1d552}', '\u{1d6a5}', Script::Common), + ('\u{1d6a8}', '\u{1d6c0}', Script::Common), ('\u{1d6c1}', '\u{1d6c1}', Script::Common), + ('\u{1d6c2}', '\u{1d6da}', Script::Common), ('\u{1d6db}', '\u{1d6db}', Script::Common), + ('\u{1d6dc}', '\u{1d6fa}', Script::Common), ('\u{1d6fb}', '\u{1d6fb}', Script::Common), + ('\u{1d6fc}', '\u{1d714}', Script::Common), ('\u{1d715}', '\u{1d715}', Script::Common), + ('\u{1d716}', '\u{1d734}', Script::Common), ('\u{1d735}', '\u{1d735}', Script::Common), + ('\u{1d736}', '\u{1d74e}', Script::Common), ('\u{1d74f}', '\u{1d74f}', Script::Common), + ('\u{1d750}', '\u{1d76e}', Script::Common), ('\u{1d76f}', '\u{1d76f}', Script::Common), + ('\u{1d770}', '\u{1d788}', Script::Common), ('\u{1d789}', '\u{1d789}', Script::Common), + ('\u{1d78a}', '\u{1d7a8}', Script::Common), ('\u{1d7a9}', '\u{1d7a9}', Script::Common), + ('\u{1d7aa}', '\u{1d7c2}', Script::Common), ('\u{1d7c3}', '\u{1d7c3}', Script::Common), + ('\u{1d7c4}', '\u{1d7cb}', Script::Common), ('\u{1d7ce}', '\u{1d7ff}', Script::Common), + ('\u{1d800}', '\u{1d9ff}', Script::SignWriting), ('\u{1da00}', '\u{1da36}', + Script::SignWriting), ('\u{1da37}', '\u{1da3a}', Script::SignWriting), ('\u{1da3b}', + '\u{1da6c}', Script::SignWriting), ('\u{1da6d}', '\u{1da74}', Script::SignWriting), + ('\u{1da75}', '\u{1da75}', Script::SignWriting), ('\u{1da76}', '\u{1da83}', + Script::SignWriting), ('\u{1da84}', '\u{1da84}', Script::SignWriting), ('\u{1da85}', + '\u{1da86}', Script::SignWriting), ('\u{1da87}', '\u{1da8b}', Script::SignWriting), + ('\u{1da9b}', '\u{1da9f}', Script::SignWriting), ('\u{1daa1}', '\u{1daaf}', + Script::SignWriting), ('\u{1e000}', '\u{1e006}', Script::Glagolitic), ('\u{1e008}', + '\u{1e018}', Script::Glagolitic), ('\u{1e01b}', '\u{1e021}', Script::Glagolitic), + ('\u{1e023}', '\u{1e024}', Script::Glagolitic), ('\u{1e026}', '\u{1e02a}', + Script::Glagolitic), ('\u{1e100}', '\u{1e12c}', Script::Nyiakeng_Puachue_Hmong), + ('\u{1e130}', '\u{1e136}', Script::Nyiakeng_Puachue_Hmong), ('\u{1e137}', '\u{1e13d}', + Script::Nyiakeng_Puachue_Hmong), ('\u{1e140}', '\u{1e149}', + Script::Nyiakeng_Puachue_Hmong), ('\u{1e14e}', '\u{1e14e}', + Script::Nyiakeng_Puachue_Hmong), ('\u{1e14f}', '\u{1e14f}', + Script::Nyiakeng_Puachue_Hmong), ('\u{1e2c0}', '\u{1e2eb}', Script::Wancho), ('\u{1e2ec}', + '\u{1e2ef}', Script::Wancho), ('\u{1e2f0}', '\u{1e2f9}', Script::Wancho), ('\u{1e2ff}', + '\u{1e2ff}', Script::Wancho), ('\u{1e800}', '\u{1e8c4}', Script::Mende_Kikakui), + ('\u{1e8c7}', '\u{1e8cf}', Script::Mende_Kikakui), ('\u{1e8d0}', '\u{1e8d6}', + Script::Mende_Kikakui), ('\u{1e900}', '\u{1e943}', Script::Adlam), ('\u{1e944}', + '\u{1e94a}', Script::Adlam), ('\u{1e94b}', '\u{1e94b}', Script::Adlam), ('\u{1e950}', + '\u{1e959}', Script::Adlam), ('\u{1e95e}', '\u{1e95f}', Script::Adlam), ('\u{1ec71}', + '\u{1ecab}', Script::Common), ('\u{1ecac}', '\u{1ecac}', Script::Common), ('\u{1ecad}', + '\u{1ecaf}', Script::Common), ('\u{1ecb0}', '\u{1ecb0}', Script::Common), ('\u{1ecb1}', + '\u{1ecb4}', Script::Common), ('\u{1ed01}', '\u{1ed2d}', Script::Common), ('\u{1ed2e}', + '\u{1ed2e}', Script::Common), ('\u{1ed2f}', '\u{1ed3d}', Script::Common), ('\u{1ee00}', + '\u{1ee03}', Script::Arabic), ('\u{1ee05}', '\u{1ee1f}', Script::Arabic), ('\u{1ee21}', + '\u{1ee22}', Script::Arabic), ('\u{1ee24}', '\u{1ee24}', Script::Arabic), ('\u{1ee27}', + '\u{1ee27}', Script::Arabic), ('\u{1ee29}', '\u{1ee32}', Script::Arabic), ('\u{1ee34}', + '\u{1ee37}', Script::Arabic), ('\u{1ee39}', '\u{1ee39}', Script::Arabic), ('\u{1ee3b}', + '\u{1ee3b}', Script::Arabic), ('\u{1ee42}', '\u{1ee42}', Script::Arabic), ('\u{1ee47}', + '\u{1ee47}', Script::Arabic), ('\u{1ee49}', '\u{1ee49}', Script::Arabic), ('\u{1ee4b}', + '\u{1ee4b}', Script::Arabic), ('\u{1ee4d}', '\u{1ee4f}', Script::Arabic), ('\u{1ee51}', + '\u{1ee52}', Script::Arabic), ('\u{1ee54}', '\u{1ee54}', Script::Arabic), ('\u{1ee57}', + '\u{1ee57}', Script::Arabic), ('\u{1ee59}', '\u{1ee59}', Script::Arabic), ('\u{1ee5b}', + '\u{1ee5b}', Script::Arabic), ('\u{1ee5d}', '\u{1ee5d}', Script::Arabic), ('\u{1ee5f}', + '\u{1ee5f}', Script::Arabic), ('\u{1ee61}', '\u{1ee62}', Script::Arabic), ('\u{1ee64}', + '\u{1ee64}', Script::Arabic), ('\u{1ee67}', '\u{1ee6a}', Script::Arabic), ('\u{1ee6c}', + '\u{1ee72}', Script::Arabic), ('\u{1ee74}', '\u{1ee77}', Script::Arabic), ('\u{1ee79}', + '\u{1ee7c}', Script::Arabic), ('\u{1ee7e}', '\u{1ee7e}', Script::Arabic), ('\u{1ee80}', + '\u{1ee89}', Script::Arabic), ('\u{1ee8b}', '\u{1ee9b}', Script::Arabic), ('\u{1eea1}', + '\u{1eea3}', Script::Arabic), ('\u{1eea5}', '\u{1eea9}', Script::Arabic), ('\u{1eeab}', + '\u{1eebb}', Script::Arabic), ('\u{1eef0}', '\u{1eef1}', Script::Arabic), ('\u{1f000}', + '\u{1f02b}', Script::Common), ('\u{1f030}', '\u{1f093}', Script::Common), ('\u{1f0a0}', + '\u{1f0ae}', Script::Common), ('\u{1f0b1}', '\u{1f0bf}', Script::Common), ('\u{1f0c1}', + '\u{1f0cf}', Script::Common), ('\u{1f0d1}', '\u{1f0f5}', Script::Common), ('\u{1f100}', + '\u{1f10c}', Script::Common), ('\u{1f110}', '\u{1f16c}', Script::Common), ('\u{1f170}', + '\u{1f1ac}', Script::Common), ('\u{1f1e6}', '\u{1f1ff}', Script::Common), ('\u{1f200}', + '\u{1f200}', Script::Hiragana), ('\u{1f201}', '\u{1f202}', Script::Common), ('\u{1f210}', + '\u{1f23b}', Script::Common), ('\u{1f240}', '\u{1f248}', Script::Common), ('\u{1f250}', + '\u{1f251}', Script::Common), ('\u{1f260}', '\u{1f265}', Script::Common), ('\u{1f300}', + '\u{1f3fa}', Script::Common), ('\u{1f3fb}', '\u{1f3ff}', Script::Common), ('\u{1f400}', + '\u{1f6d5}', Script::Common), ('\u{1f6e0}', '\u{1f6ec}', Script::Common), ('\u{1f6f0}', + '\u{1f6fa}', Script::Common), ('\u{1f700}', '\u{1f773}', Script::Common), ('\u{1f780}', + '\u{1f7d8}', Script::Common), ('\u{1f7e0}', '\u{1f7eb}', Script::Common), ('\u{1f800}', + '\u{1f80b}', Script::Common), ('\u{1f810}', '\u{1f847}', Script::Common), ('\u{1f850}', + '\u{1f859}', Script::Common), ('\u{1f860}', '\u{1f887}', Script::Common), ('\u{1f890}', + '\u{1f8ad}', Script::Common), ('\u{1f900}', '\u{1f90b}', Script::Common), ('\u{1f90d}', + '\u{1f971}', Script::Common), ('\u{1f973}', '\u{1f976}', Script::Common), ('\u{1f97a}', + '\u{1f9a2}', Script::Common), ('\u{1f9a5}', '\u{1f9aa}', Script::Common), ('\u{1f9ae}', + '\u{1f9ca}', Script::Common), ('\u{1f9cd}', '\u{1fa53}', Script::Common), ('\u{1fa60}', + '\u{1fa6d}', Script::Common), ('\u{1fa70}', '\u{1fa73}', Script::Common), ('\u{1fa78}', + '\u{1fa7a}', Script::Common), ('\u{1fa80}', '\u{1fa82}', Script::Common), ('\u{1fa90}', + '\u{1fa95}', Script::Common), ('\u{20000}', '\u{2a6d6}', Script::Han), ('\u{2a700}', + '\u{2b734}', Script::Han), ('\u{2b740}', '\u{2b81d}', Script::Han), ('\u{2b820}', + '\u{2cea1}', Script::Han), ('\u{2ceb0}', '\u{2ebe0}', Script::Han), ('\u{2f800}', + '\u{2fa1d}', Script::Han), ('\u{e0001}', '\u{e0001}', Script::Common), ('\u{e0020}', + '\u{e007f}', Script::Common), ('\u{e0100}', '\u{e01ef}', Script::Inherited) + ]; + + const SCRIPT_EXTENSIONS: &'static [(char, char, ScriptExtension)] = &[ + ('\u{342}', '\u{342}', ScriptExtension::Single(Script::Greek)), ('\u{345}', '\u{345}', + ScriptExtension::Single(Script::Greek)), ('\u{363}', '\u{36f}', + ScriptExtension::Single(Script::Latin)), ('\u{483}', '\u{483}', ScriptExtension::CyrlPerm), + ('\u{484}', '\u{484}', ScriptExtension::CyrlGlag), ('\u{485}', '\u{486}', + ScriptExtension::CyrlLatn), ('\u{487}', '\u{487}', ScriptExtension::CyrlGlag), ('\u{589}', + '\u{589}', ScriptExtension::ArmnGeor), ('\u{60c}', '\u{60c}', + ScriptExtension::ArabRohgSyrcThaa), ('\u{61b}', '\u{61b}', + ScriptExtension::ArabRohgSyrcThaa), ('\u{61c}', '\u{61c}', ScriptExtension::ArabSyrcThaa), + ('\u{61f}', '\u{61f}', ScriptExtension::ArabRohgSyrcThaa), ('\u{640}', '\u{640}', + ScriptExtension::AdlmArabMandManiPhlpRohgSogdSyrc), ('\u{64b}', '\u{655}', + ScriptExtension::ArabSyrc), ('\u{660}', '\u{669}', ScriptExtension::ArabThaa), ('\u{670}', + '\u{670}', ScriptExtension::ArabSyrc), ('\u{6d4}', '\u{6d4}', ScriptExtension::ArabRohg), + ('\u{951}', '\u{951}', + ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaShrdTamlTeluTirh), ('\u{952}', + '\u{952}', ScriptExtension::BengDevaGranGujrGuruKndaLatnMlymOryaTamlTeluTirh), ('\u{964}', + '\u{964}', + ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh), + ('\u{965}', '\u{965}', + ScriptExtension::BengDevaDogrGongGonmGranGujrGuruKndaLimbMahjMlymNandOryaSindSinhSyloTakrTamlTeluTirh), + ('\u{966}', '\u{96f}', ScriptExtension::DevaDogrKthiMahj), ('\u{9e6}', '\u{9ef}', + ScriptExtension::BengCakmSylo), ('\u{a66}', '\u{a6f}', ScriptExtension::GuruMult), + ('\u{ae6}', '\u{aef}', ScriptExtension::GujrKhoj), ('\u{be6}', '\u{bef}', + ScriptExtension::GranTaml), ('\u{bf0}', '\u{bf2}', ScriptExtension::GranTaml), ('\u{bf3}', + '\u{bf3}', ScriptExtension::GranTaml), ('\u{ce6}', '\u{cef}', ScriptExtension::KndaNand), + ('\u{1040}', '\u{1049}', ScriptExtension::CakmMymrTale), ('\u{10fb}', '\u{10fb}', + ScriptExtension::GeorLatn), ('\u{1735}', '\u{1736}', ScriptExtension::BuhdHanoTagbTglg), + ('\u{1802}', '\u{1803}', ScriptExtension::MongPhag), ('\u{1805}', '\u{1805}', + ScriptExtension::MongPhag), ('\u{1cd0}', '\u{1cd0}', ScriptExtension::BengDevaGranKnda), + ('\u{1cd1}', '\u{1cd1}', ScriptExtension::Single(Script::Devanagari)), ('\u{1cd2}', + '\u{1cd2}', ScriptExtension::BengDevaGranKnda), ('\u{1cd3}', '\u{1cd3}', + ScriptExtension::DevaGran), ('\u{1cd4}', '\u{1cd4}', + ScriptExtension::Single(Script::Devanagari)), ('\u{1cd5}', '\u{1cd6}', + ScriptExtension::BengDeva), ('\u{1cd7}', '\u{1cd7}', ScriptExtension::DevaShrd), + ('\u{1cd8}', '\u{1cd8}', ScriptExtension::BengDeva), ('\u{1cd9}', '\u{1cd9}', + ScriptExtension::DevaShrd), ('\u{1cda}', '\u{1cda}', + ScriptExtension::DevaKndaMlymOryaTamlTelu), ('\u{1cdb}', '\u{1cdb}', + ScriptExtension::Single(Script::Devanagari)), ('\u{1cdc}', '\u{1cdd}', + ScriptExtension::DevaShrd), ('\u{1cde}', '\u{1cdf}', + ScriptExtension::Single(Script::Devanagari)), ('\u{1ce0}', '\u{1ce0}', + ScriptExtension::DevaShrd), ('\u{1ce1}', '\u{1ce1}', ScriptExtension::BengDeva), + ('\u{1ce2}', '\u{1ce8}', ScriptExtension::Single(Script::Devanagari)), ('\u{1ce9}', + '\u{1ce9}', ScriptExtension::DevaNand), ('\u{1cea}', '\u{1cea}', ScriptExtension::BengDeva), + ('\u{1ceb}', '\u{1cec}', ScriptExtension::Single(Script::Devanagari)), ('\u{1ced}', + '\u{1ced}', ScriptExtension::BengDeva), ('\u{1cee}', '\u{1cf1}', + ScriptExtension::Single(Script::Devanagari)), ('\u{1cf2}', '\u{1cf2}', + ScriptExtension::BengDevaGranKndaNandOryaTeluTirh), ('\u{1cf3}', '\u{1cf3}', + ScriptExtension::DevaGran), ('\u{1cf4}', '\u{1cf4}', ScriptExtension::DevaGranKnda), + ('\u{1cf5}', '\u{1cf6}', ScriptExtension::BengDeva), ('\u{1cf7}', '\u{1cf7}', + ScriptExtension::Single(Script::Bengali)), ('\u{1cf8}', '\u{1cf9}', + ScriptExtension::DevaGran), ('\u{1cfa}', '\u{1cfa}', + ScriptExtension::Single(Script::Nandinagari)), ('\u{1dc0}', '\u{1dc1}', + ScriptExtension::Single(Script::Greek)), ('\u{202f}', '\u{202f}', + ScriptExtension::LatnMong), ('\u{20f0}', '\u{20f0}', ScriptExtension::DevaGranLatn), + ('\u{2e43}', '\u{2e43}', ScriptExtension::CyrlGlag), ('\u{3001}', '\u{3002}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3003}', '\u{3003}', + ScriptExtension::BopoHangHaniHiraKana), ('\u{3006}', '\u{3006}', + ScriptExtension::Single(Script::Han)), ('\u{3008}', '\u{3008}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3009}', '\u{3009}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{300a}', '\u{300a}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{300b}', '\u{300b}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{300c}', '\u{300c}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{300d}', '\u{300d}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{300e}', '\u{300e}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{300f}', '\u{300f}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3010}', '\u{3010}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3011}', '\u{3011}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3013}', '\u{3013}', + ScriptExtension::BopoHangHaniHiraKana), ('\u{3014}', '\u{3014}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3015}', '\u{3015}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3016}', '\u{3016}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3017}', '\u{3017}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3018}', '\u{3018}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{3019}', '\u{3019}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{301a}', '\u{301a}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{301b}', '\u{301b}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{301c}', '\u{301c}', + ScriptExtension::BopoHangHaniHiraKana), ('\u{301d}', '\u{301d}', + ScriptExtension::BopoHangHaniHiraKana), ('\u{301e}', '\u{301f}', + ScriptExtension::BopoHangHaniHiraKana), ('\u{302a}', '\u{302d}', ScriptExtension::BopoHani), + ('\u{3030}', '\u{3030}', ScriptExtension::BopoHangHaniHiraKana), ('\u{3031}', '\u{3035}', + ScriptExtension::HiraKana), ('\u{3037}', '\u{3037}', ScriptExtension::BopoHangHaniHiraKana), + ('\u{303c}', '\u{303c}', ScriptExtension::HaniHiraKana), ('\u{303d}', '\u{303d}', + ScriptExtension::HaniHiraKana), ('\u{303e}', '\u{303f}', + ScriptExtension::Single(Script::Han)), ('\u{3099}', '\u{309a}', ScriptExtension::HiraKana), + ('\u{309b}', '\u{309c}', ScriptExtension::HiraKana), ('\u{30a0}', '\u{30a0}', + ScriptExtension::HiraKana), ('\u{30fb}', '\u{30fb}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{30fc}', '\u{30fc}', + ScriptExtension::HiraKana), ('\u{3190}', '\u{3191}', ScriptExtension::Single(Script::Han)), + ('\u{3192}', '\u{3195}', ScriptExtension::Single(Script::Han)), ('\u{3196}', '\u{319f}', + ScriptExtension::Single(Script::Han)), ('\u{31c0}', '\u{31e3}', + ScriptExtension::Single(Script::Han)), ('\u{3220}', '\u{3229}', + ScriptExtension::Single(Script::Han)), ('\u{322a}', '\u{3247}', + ScriptExtension::Single(Script::Han)), ('\u{3280}', '\u{3289}', + ScriptExtension::Single(Script::Han)), ('\u{328a}', '\u{32b0}', + ScriptExtension::Single(Script::Han)), ('\u{32c0}', '\u{32cb}', + ScriptExtension::Single(Script::Han)), ('\u{3358}', '\u{3370}', + ScriptExtension::Single(Script::Han)), ('\u{337b}', '\u{337f}', + ScriptExtension::Single(Script::Han)), ('\u{33e0}', '\u{33fe}', + ScriptExtension::Single(Script::Han)), ('\u{a66f}', '\u{a66f}', ScriptExtension::CyrlGlag), + ('\u{a830}', '\u{a832}', + ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjMlymModiNandSindTakrTirh), ('\u{a833}', + '\u{a835}', ScriptExtension::DevaDogrGujrGuruKhojKndaKthiMahjModiNandSindTakrTirh), + ('\u{a836}', '\u{a837}', ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh), + ('\u{a838}', '\u{a838}', ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh), + ('\u{a839}', '\u{a839}', ScriptExtension::DevaDogrGujrGuruKhojKthiMahjModiSindTakrTirh), + ('\u{a8f1}', '\u{a8f1}', ScriptExtension::BengDeva), ('\u{a8f3}', '\u{a8f3}', + ScriptExtension::DevaTaml), ('\u{a92e}', '\u{a92e}', ScriptExtension::KaliLatnMymr), + ('\u{a9cf}', '\u{a9cf}', ScriptExtension::BugiJava), ('\u{fdf2}', '\u{fdf2}', + ScriptExtension::ArabThaa), ('\u{fdfd}', '\u{fdfd}', ScriptExtension::ArabThaa), + ('\u{fe45}', '\u{fe46}', ScriptExtension::BopoHangHaniHiraKana), ('\u{ff61}', '\u{ff61}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{ff62}', '\u{ff62}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{ff63}', '\u{ff63}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{ff64}', '\u{ff65}', + ScriptExtension::BopoHangHaniHiraKanaYiii), ('\u{ff70}', '\u{ff70}', + ScriptExtension::HiraKana), ('\u{ff9e}', '\u{ff9f}', ScriptExtension::HiraKana), + ('\u{10100}', '\u{10102}', ScriptExtension::CprtLinb), ('\u{10107}', '\u{10133}', + ScriptExtension::CprtLinaLinb), ('\u{10137}', '\u{1013f}', ScriptExtension::CprtLinb), + ('\u{102e0}', '\u{102e0}', ScriptExtension::ArabCopt), ('\u{102e1}', '\u{102fb}', + ScriptExtension::ArabCopt), ('\u{11301}', '\u{11301}', ScriptExtension::GranTaml), + ('\u{11303}', '\u{11303}', ScriptExtension::GranTaml), ('\u{1133b}', '\u{1133c}', + ScriptExtension::GranTaml), ('\u{11fd0}', '\u{11fd1}', ScriptExtension::GranTaml), + ('\u{11fd3}', '\u{11fd3}', ScriptExtension::GranTaml), ('\u{1bca0}', '\u{1bca3}', + ScriptExtension::Single(Script::Duployan)), ('\u{1d360}', '\u{1d371}', + ScriptExtension::Single(Script::Han)), ('\u{1f250}', '\u{1f251}', + ScriptExtension::Single(Script::Han)) + ]; + diff --git a/vendor/unicode-security/.cargo-checksum.json b/vendor/unicode-security/.cargo-checksum.json new file mode 100644 index 0000000000..b7f661996c --- /dev/null +++ b/vendor/unicode-security/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"417adadd966d030ebe4c4cf826852ae9519f14afb9918ea5f673d1124cecfe21","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"cf597d1e3c462dcac6a525aab647e7b6557e03b1d6a7623ddb571cbfffc089ab","scripts/unicode.py":"b888176ce671ea20386a9c9d3fe6ea9c4cbf14a3d86b0d5f5e6e03a05b964e0c","src/general_security_profile.rs":"e7e979876f9414cec50a58301f635bb4216089f2cb2cab83487fcafb0e13c0ac","src/lib.rs":"fafc97a0e62626b431ae42f149bb48bd837eac1a80bee48030dbae44169215fd","src/mixed_script.rs":"1a36a40881e5c31b5afd048f95db830e2562c8645be6a4b53eb77072f8984f28","src/restriction_level.rs":"53cec47b30247093b81722558e90ef8400ef3ca7bea0922bd384c6e5998cb85b","src/tables.rs":"bb2952fc3c79727872c655e3962ed9892d775a5de476cc495de9b70bc5c78910","src/tests.rs":"6b65185c2cdb23953eef1759e8418ca0851123d0e4b9e02da83bc8dd528a42e0"},"package":"c49d35967fa037b881acc34ef717c38c4b5560eba10e3685271b3f530bb19634"} \ No newline at end of file diff --git a/vendor/unicode-security/COPYRIGHT b/vendor/unicode-security/COPYRIGHT new file mode 100644 index 0000000000..b286ec16ab --- /dev/null +++ b/vendor/unicode-security/COPYRIGHT @@ -0,0 +1,7 @@ +Licensed under the Apache License, Version 2.0 +<LICENSE-APACHE or +http://www.apache.org/licenses/LICENSE-2.0> or the MIT +license <LICENSE-MIT or http://opensource.org/licenses/MIT>, +at your option. All files in the project carrying such +notice may not be copied, modified, or distributed except +according to those terms. diff --git a/vendor/unicode-security/Cargo.toml b/vendor/unicode-security/Cargo.toml new file mode 100644 index 0000000000..8bcabeb5fa --- /dev/null +++ b/vendor/unicode-security/Cargo.toml @@ -0,0 +1,47 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +edition = "2018" +name = "unicode-security" +version = "0.0.2" +authors = ["Charles Lew <crlf0710@gmail.com>", "Manish Goregaokar <manishsmail@gmail.com>"] +exclude = ["target/*", "Cargo.lock"] +description = "Detect possible security problems with Unicode usage\naccording to Unicode Technical Standard #39 rules.\n" +homepage = "https://github.com/unicode-rs/unicode-security" +documentation = "https://unicode-rs.github.io/unicode-security" +readme = "README.md" +keywords = ["text", "security", "unicode"] +license = "MIT/Apache-2.0" +repository = "https://github.com/unicode-rs/unicode-security" +[dependencies.compiler_builtins] +version = "0.1" +optional = true + +[dependencies.core] +version = "1.0" +optional = true +package = "rustc-std-workspace-core" + +[dependencies.std] +version = "1.0" +optional = true +package = "rustc-std-workspace-std" + +[dependencies.unicode-script] +version = "0.4.0" +default-features = false + +[features] +bench = [] +default = [] +rustc-dep-of-std = ["std", "core", "compiler_builtins"] diff --git a/vendor/petgraph/LICENSE-APACHE b/vendor/unicode-security/LICENSE-APACHE similarity index 100% rename from vendor/petgraph/LICENSE-APACHE rename to vendor/unicode-security/LICENSE-APACHE diff --git a/vendor/ordermap/LICENSE-MIT b/vendor/unicode-security/LICENSE-MIT similarity index 95% rename from vendor/ordermap/LICENSE-MIT rename to vendor/unicode-security/LICENSE-MIT index 8b8181068b..e69282e381 100644 --- a/vendor/ordermap/LICENSE-MIT +++ b/vendor/unicode-security/LICENSE-MIT @@ -1,4 +1,4 @@ -Copyright (c) 2016--2017 +Copyright (c) 2015 The Rust Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/vendor/unicode-security/README.md b/vendor/unicode-security/README.md new file mode 100644 index 0000000000..22e8b6d358 --- /dev/null +++ b/vendor/unicode-security/README.md @@ -0,0 +1,7 @@ +# unicode-security + +[![Build Status](https://github.com/unicode-rs/unicode-security/workflows/Tests/badge.svg)](https://github.com/unicode-rs/unicode-security/actions) +[![Current Version](https://meritbadge.herokuapp.com/unicode-security)](https://crates.io/crates/unicode-security) +[![License: MIT/Apache-2.0](https://img.shields.io/crates/l/unicode-security.svg)](#license) + +This crate exposes various utilities from [UAX #39 Unicode Security Mechanisms](https://www.unicode.org/reports/tr39/) \ No newline at end of file diff --git a/vendor/unicode-security/scripts/unicode.py b/vendor/unicode-security/scripts/unicode.py new file mode 100644 index 0000000000..482d7ad89a --- /dev/null +++ b/vendor/unicode-security/scripts/unicode.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 +# +# Copyright 2011-2015 The Rust Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution and at +# http://rust-lang.org/COPYRIGHT. +# +# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + +# This script uses the following Unicode security tables: +# - IdentifierStatus.txt +# - ReadMe.txt +# +# Since this should not require frequent updates, we just store this +# out-of-line and check the unicode.rs file into git. + +import fileinput, re, os, sys, operator + +preamble = '''// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// NOTE: The following code was generated by "scripts/unicode.py", do not edit directly + +#![allow(missing_docs, non_upper_case_globals, non_snake_case)] +''' + +UNICODE_VERSION = (12, 1, 0) + +UNICODE_VERSION_NUMBER = "%s.%s.%s" %UNICODE_VERSION + +def fetch(f): + if not os.path.exists(os.path.basename(f)): + os.system("curl -O http://www.unicode.org/Public/security/%s/%s" + % (UNICODE_VERSION_NUMBER, f)) + + if not os.path.exists(os.path.basename(f)): + sys.stderr.write("cannot load %s\n" % f) + exit(1) + +# Implementation from unicode-segmentation +def load_properties(f, interestingprops = None): + fetch(f) + props = {} + re1 = re.compile(r"^ *([0-9A-F]+) *; *(\w+)") + re2 = re.compile(r"^ *([0-9A-F]+)\.\.([0-9A-F]+) *; *(\w+)") + + for line in fileinput.input(os.path.basename(f)): + prop = None + d_lo = 0 + d_hi = 0 + m = re1.match(line) + if m: + d_lo = m.group(1) + d_hi = m.group(1) + prop = m.group(2).strip() + else: + m = re2.match(line) + if m: + d_lo = m.group(1) + d_hi = m.group(2) + prop = m.group(3).strip() + else: + continue + if interestingprops and prop not in interestingprops: + continue + d_lo = int(d_lo, 16) + d_hi = int(d_hi, 16) + if prop not in props: + props[prop] = [] + props[prop].append((d_lo, d_hi)) + + return props + +def format_table_content(f, content, indent): + line = " "*indent + first = True + for chunk in content.split(","): + if len(line) + len(chunk) < 98: + if first: + line += chunk + else: + line += ", " + chunk + first = False + else: + f.write(line + ",\n") + line = " "*indent + chunk + f.write(line) + +def escape_char(c): + return "'\\u{%x}'" % c + +def emit_table(f, name, t_data, t_type = "&'static [(char, char)]", is_pub=True, + pfun=lambda x: "(%s,%s)" % (escape_char(x[0]), escape_char(x[1])), is_const=True): + pub_string = "const" + if not is_const: + pub_string = "let" + if is_pub: + pub_string = "pub " + pub_string + f.write(" %s %s: %s = &[\n" % (pub_string, name, t_type)) + data = "" + first = True + for dat in t_data: + if not first: + data += "," + first = False + data += pfun(dat) + format_table_content(f, data, 8) + f.write("\n ];\n\n") + +def emit_identifier_module(f): + f.write("pub mod identifier {") + f.write(""" + + #[derive(Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd, Debug)] + #[allow(non_camel_case_types)] + /// https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type + pub enum IdentifierType { + // Restricted + Not_Character, + Deprecated, + Default_Ignorable, + Not_NFKC, + Not_XID, + Exclusion, + Obsolete, + Technical, + Uncommon_Use, + Limited_Use, + + // Allowed + Inclusion, + Recommended + } + #[inline] + pub fn identifier_status_allowed(c: char) -> bool { + // FIXME: do we want to special case ASCII here? + match c as usize { + _ => super::util::bsearch_range_table(c, IDENTIFIER_STATUS) + } + } + + #[inline] + pub fn identifier_type(c: char) -> Option<IdentifierType> { + // FIXME: do we want to special case ASCII here? + match c as usize { + _ => super::util::bsearch_range_value_table(c, IDENTIFIER_TYPE) + } + } +""") + + f.write(" // Identifier status table:\n") + identifier_status_table = load_properties("IdentifierStatus.txt") + emit_table(f, "IDENTIFIER_STATUS", identifier_status_table['Allowed'], "&'static [(char, char)]", is_pub=False, + pfun=lambda x: "(%s,%s)" % (escape_char(x[0]), escape_char(x[1]))) + identifier_type = load_properties("IdentifierType.txt") + type_table = [] + for ty in identifier_type: + type_table.extend([(x, y, ty) for (x, y) in identifier_type[ty]]) + + type_table.sort(key=lambda w: w[0]) + + emit_table(f, "IDENTIFIER_TYPE", type_table, "&'static [(char, char, IdentifierType)]", is_pub=False, + pfun=lambda x: "(%s,%s, IdentifierType::%s)" % (escape_char(x[0]), escape_char(x[1]), x[2])) + f.write("}\n\n") + +def emit_util_mod(f): + f.write(""" +pub mod util { + use core::result::Result::{Ok, Err}; + #[inline] + pub fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool { + use core::cmp::Ordering::{Equal, Less, Greater}; + r.binary_search_by(|&(lo,hi)| { + if lo <= c && c <= hi { Equal } + else if hi < c { Less } + else { Greater } + }).is_ok() + } + + pub fn bsearch_range_value_table<T: Copy>(c: char, r: &'static [(char, char, T)]) -> Option<T> { + use core::cmp::Ordering::{Equal, Less, Greater}; + match r.binary_search_by(|&(lo, hi, _)| { + if lo <= c && c <= hi { Equal } + else if hi < c { Less } + else { Greater } + }) { + Ok(idx) => { + let (_, _, cat) = r[idx]; + Some(cat) + } + Err(_) => None + } + } + +} + +""") + +if __name__ == "__main__": + r = "tables.rs" + if os.path.exists(r): + os.remove(r) + with open(r, "w") as rf: + # write the file's preamble + rf.write(preamble) + + rf.write(""" +/// The version of [Unicode](http://www.unicode.org/) +/// that this version of unicode-security is based on. +pub const UNICODE_VERSION: (u64, u64, u64) = (%s, %s, %s); + +""" % UNICODE_VERSION) + + emit_util_mod(rf) + ### identifier module + emit_identifier_module(rf) diff --git a/vendor/unicode-security/src/general_security_profile.rs b/vendor/unicode-security/src/general_security_profile.rs new file mode 100644 index 0000000000..7daedddab2 --- /dev/null +++ b/vendor/unicode-security/src/general_security_profile.rs @@ -0,0 +1,26 @@ +//! Utilities for working with the [General Security Profile](https://www.unicode.org/reports/tr39/#General_Security_Profile) +//! for identifiers + +use crate::tables::identifier; + +pub use identifier::IdentifierType; + +/// Methods for determining characters not restricted from use for identifiers. +pub trait GeneralSecurityProfile { + /// Returns whether the character is not restricted from use for identifiers. + fn identifier_allowed(self) -> bool; + + /// Returns the [identifier type](https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type) + fn identifier_type(self) -> Option<IdentifierType>; +} + +impl GeneralSecurityProfile for char { + #[inline] + fn identifier_allowed(self) -> bool { + identifier::identifier_status_allowed(self) + } + #[inline] + fn identifier_type(self) -> Option<IdentifierType> { + identifier::identifier_type(self) + } +} diff --git a/vendor/unicode-security/src/lib.rs b/vendor/unicode-security/src/lib.rs new file mode 100644 index 0000000000..3ad4b80e0a --- /dev/null +++ b/vendor/unicode-security/src/lib.rs @@ -0,0 +1,72 @@ +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Detect possible security problems with Unicode usage according to +//! [Unicode Technical Standard #39](http://www.unicode.org/reports/tr39/) +//! rules. +//! +//! ```rust +//! extern crate unicode_security; +//! +//! use unicode_security::GeneralSecurityProfile; +//! +//! fn main() { +//! let ch = 'µ'; // U+00B5 MICRO SIGN +//! let allowed = 'µ'.identifier_allowed(); +//! println!("{}", ch); +//! println!("The above char is {} in unicode identifiers.", +//! if allowed { "allowed" } else { "restricted" }); +//! } +//! ``` +//! +//! # features +//! +//! unicode-security supports a `no_std` feature. This eliminates dependence +//! on std, and instead uses equivalent functions from core. +//! +//! # crates.io +//! +//! You can use this package in your project by adding the following +//! to your `Cargo.toml`: +//! +//! ```toml +//! [dependencies] +//! unicode-security = "0.0.1" +//! ``` + +#![deny(missing_docs, unsafe_code)] +#![doc( + html_logo_url = "https://unicode-rs.github.io/unicode-rs_sm.png", + html_favicon_url = "https://unicode-rs.github.io/unicode-rs_sm.png" +)] +#![cfg_attr(feature = "bench", feature(test))] +#![no_std] + +#[cfg(test)] +#[macro_use] +extern crate std; + +#[cfg(feature = "bench")] +extern crate test; + +pub use tables::UNICODE_VERSION; + +pub mod general_security_profile; +pub mod mixed_script; +pub mod restriction_level; + +pub use general_security_profile::GeneralSecurityProfile; +pub use mixed_script::MixedScript; + +#[rustfmt::skip] +pub(crate) mod tables; + +#[cfg(test)] +mod tests; diff --git a/vendor/unicode-security/src/mixed_script.rs b/vendor/unicode-security/src/mixed_script.rs new file mode 100644 index 0000000000..092c83a788 --- /dev/null +++ b/vendor/unicode-security/src/mixed_script.rs @@ -0,0 +1,132 @@ +//! [Mixed-script detection](https://www.unicode.org/reports/tr39/#Mixed_Script_Detection) + +use unicode_script::{Script, ScriptExtension}; + +/// An Augmented script set, as defined by UTS 39 +/// +/// https://www.unicode.org/reports/tr39/#def-augmented-script-set +#[derive(Copy, Clone, PartialEq, Debug, Hash)] +pub struct AugmentedScriptSet { + /// The base ScriptExtension value + pub base: ScriptExtension, + /// Han With Bopomofo + pub hanb: bool, + /// Japanese + pub jpan: bool, + /// Korean + pub kore: bool, +} + +impl From<ScriptExtension> for AugmentedScriptSet { + fn from(ext: ScriptExtension) -> Self { + let mut hanb = false; + let mut jpan = false; + let mut kore = false; + + if ext == ScriptExtension::Single(Script::Common) + || ext == ScriptExtension::Single(Script::Inherited) + || ext.contains_script(Script::Han) + { + hanb = true; + jpan = true; + kore = true; + } else { + if ext.contains_script(Script::Hiragana) || ext.contains_script(Script::Katakana) { + jpan = true; + } + + if ext.contains_script(Script::Hangul) { + kore = true; + } + + if ext.contains_script(Script::Bopomofo) { + hanb = true; + } + } + Self { + base: ext, + hanb, + jpan, + kore, + } + } +} + +impl From<char> for AugmentedScriptSet { + fn from(c: char) -> Self { + AugmentedScriptSet::for_char(c) + } +} + +impl From<&'_ str> for AugmentedScriptSet { + fn from(s: &'_ str) -> Self { + AugmentedScriptSet::for_str(s) + } +} + +impl Default for AugmentedScriptSet { + fn default() -> Self { + AugmentedScriptSet { + base: ScriptExtension::Single(Script::Common), + hanb: true, + jpan: true, + kore: true, + } + } +} + +impl AugmentedScriptSet { + /// Intersect this set with another + pub fn intersect_with(&mut self, other: Self) { + self.base.intersect_with(other.base); + self.hanb = self.hanb && other.hanb; + self.jpan = self.jpan && other.jpan; + self.kore = self.kore && other.kore; + } + + /// Check if the set is empty + pub fn is_empty(&self) -> bool { + self.base.is_empty() && !self.hanb && !self.jpan && !self.kore + } + + /// Check if the set is "All" (Common or Inherited) + pub fn is_all(&self) -> bool { + self.base == ScriptExtension::Single(Script::Common) + || self.base == ScriptExtension::Single(Script::Inherited) + } + + /// Construct an AugmentedScriptSet for a given character + pub fn for_char(c: char) -> Self { + ScriptExtension::from(c).into() + } + + /// Find the [resolved script set](https://www.unicode.org/reports/tr39/#def-resolved-script-set) of a given string + pub fn for_str(s: &str) -> Self { + let mut set = AugmentedScriptSet::default(); + for ch in s.chars() { + set.intersect_with(ch.into()) + } + set + } +} + +/// Extension trait for [mixed-script detection](https://www.unicode.org/reports/tr39/#Mixed_Script_Detection) +pub trait MixedScript { + /// Check if a string is [single-script](https://www.unicode.org/reports/tr39/#def-single-script) + /// + /// Note that a single-script string may still contain multiple Script properties! + fn is_single_script(self) -> bool; + + /// Find the [resolved script set](https://www.unicode.org/reports/tr39/#def-resolved-script-set) of a given string + fn resolve_script_set(self) -> AugmentedScriptSet; +} + +impl MixedScript for &'_ str { + fn is_single_script(self) -> bool { + !AugmentedScriptSet::for_str(self).is_empty() + } + + fn resolve_script_set(self) -> AugmentedScriptSet { + self.into() + } +} diff --git a/vendor/unicode-security/src/restriction_level.rs b/vendor/unicode-security/src/restriction_level.rs new file mode 100644 index 0000000000..292a4fa59a --- /dev/null +++ b/vendor/unicode-security/src/restriction_level.rs @@ -0,0 +1,74 @@ +//! For detecting the [restriction level](https://www.unicode.org/reports/tr39/#Restriction_Level_Detection) +//! a string conforms to + +use crate::mixed_script::AugmentedScriptSet; +use crate::GeneralSecurityProfile; +use unicode_script::{Script, ScriptExtension}; + +#[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)] +/// The [Restriction level](https://www.unicode.org/reports/tr39/#Restriction_Level_Detection) +/// a string conforms to +pub enum RestrictionLevel { + /// https://www.unicode.org/reports/tr39/#ascii_only + ASCIIOnly, + /// https://www.unicode.org/reports/tr39/#single_script + SingleScript, + /// https://www.unicode.org/reports/tr39/#highly_restrictive + HighlyRestrictive, + /// https://www.unicode.org/reports/tr39/#moderately_restrictive + ModeratelyRestrictive, + /// https://www.unicode.org/reports/tr39/#minimally_restrictive + MinimallyRestrictive, + /// https://www.unicode.org/reports/tr39/#unrestricted + Unrestricted, +} + +/// Utilities for determining which [restriction level](https://www.unicode.org/reports/tr39/#Restriction_Level_Detection) +/// a string satisfies +pub trait RestrictionLevelDetection: Sized { + /// Detect the [restriction level](https://www.unicode.org/reports/tr39/#Restriction_Level_Detection) + /// + /// This will _not_ check identifier well-formedness, as different applications may have different notions of well-formedness + fn detect_restriction_level(self) -> RestrictionLevel; + + /// Check if a string satisfies the supplied [restriction level](https://www.unicode.org/reports/tr39/#Restriction_Level_Detection) + /// + /// This will _not_ check identifier well-formedness, as different applications may have different notions of well-formedness + fn check_restriction_level(self, level: RestrictionLevel) -> bool { + self.detect_restriction_level() <= level + } +} + +impl RestrictionLevelDetection for &'_ str { + fn detect_restriction_level(self) -> RestrictionLevel { + let mut ascii_only = true; + let mut set = AugmentedScriptSet::default(); + let mut exclude_latin_set = AugmentedScriptSet::default(); + for ch in self.chars() { + if !GeneralSecurityProfile::identifier_allowed(ch) { + return RestrictionLevel::Unrestricted; + } + if ch.is_ascii() { + ascii_only = false; + } + let ch_set = ch.into(); + set.intersect_with(ch_set); + if !ch_set.base.contains_script(Script::Latin) { + exclude_latin_set.intersect_with(ch_set); + } + } + + if ascii_only { + return RestrictionLevel::ASCIIOnly; + } else if !set.is_empty() { + return RestrictionLevel::SingleScript; + } else if exclude_latin_set.kore || exclude_latin_set.hanb || exclude_latin_set.jpan { + return RestrictionLevel::HighlyRestrictive; + } else if let ScriptExtension::Single(script) = exclude_latin_set.base { + if script.is_recommended() && script != Script::Cyrillic && script != Script::Greek { + return RestrictionLevel::ModeratelyRestrictive; + } + } + return RestrictionLevel::MinimallyRestrictive; + } +} diff --git a/vendor/unicode-security/src/tables.rs b/vendor/unicode-security/src/tables.rs new file mode 100644 index 0000000000..864ff7ea24 --- /dev/null +++ b/vendor/unicode-security/src/tables.rs @@ -0,0 +1,1701 @@ +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// NOTE: The following code was generated by "scripts/unicode.py", do not edit directly + +#![allow(missing_docs, non_upper_case_globals, non_snake_case)] + +/// The version of [Unicode](http://www.unicode.org/) +/// that this version of unicode-security is based on. +pub const UNICODE_VERSION: (u64, u64, u64) = (12, 1, 0); + + +pub mod util { + use core::result::Result::{Ok, Err}; + #[inline] + pub fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool { + use core::cmp::Ordering::{Equal, Less, Greater}; + r.binary_search_by(|&(lo,hi)| { + if lo <= c && c <= hi { Equal } + else if hi < c { Less } + else { Greater } + }).is_ok() + } + + pub fn bsearch_range_value_table<T: Copy>(c: char, r: &'static [(char, char, T)]) -> Option<T> { + use core::cmp::Ordering::{Equal, Less, Greater}; + match r.binary_search_by(|&(lo, hi, _)| { + if lo <= c && c <= hi { Equal } + else if hi < c { Less } + else { Greater } + }) { + Ok(idx) => { + let (_, _, cat) = r[idx]; + Some(cat) + } + Err(_) => None + } + } + +} + +pub mod identifier { + + #[derive(Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd, Debug)] + #[allow(non_camel_case_types)] + /// https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type + pub enum IdentifierType { + // Restricted + Not_Character, + Deprecated, + Default_Ignorable, + Not_NFKC, + Not_XID, + Exclusion, + Obsolete, + Technical, + Uncommon_Use, + Limited_Use, + + // Allowed + Inclusion, + Recommended + } + #[inline] + pub fn identifier_status_allowed(c: char) -> bool { + // FIXME: do we want to special case ASCII here? + match c as usize { + _ => super::util::bsearch_range_table(c, IDENTIFIER_STATUS) + } + } + + #[inline] + pub fn identifier_type(c: char) -> Option<IdentifierType> { + // FIXME: do we want to special case ASCII here? + match c as usize { + _ => super::util::bsearch_range_value_table(c, IDENTIFIER_TYPE) + } + } + // Identifier status table: + const IDENTIFIER_STATUS: &'static [(char, char)] = &[ + ('\u{27}', '\u{27}'), ('\u{2d}', '\u{2e}'), ('\u{30}', '\u{3a}'), ('\u{41}', '\u{5a}'), + ('\u{5f}', '\u{5f}'), ('\u{61}', '\u{7a}'), ('\u{b7}', '\u{b7}'), ('\u{c0}', '\u{d6}'), + ('\u{d8}', '\u{f6}'), ('\u{f8}', '\u{131}'), ('\u{134}', '\u{13e}'), ('\u{141}', '\u{148}'), + ('\u{14a}', '\u{17e}'), ('\u{18f}', '\u{18f}'), ('\u{1a0}', '\u{1a1}'), ('\u{1af}', + '\u{1b0}'), ('\u{1cd}', '\u{1dc}'), ('\u{1de}', '\u{1e3}'), ('\u{1e6}', '\u{1f0}'), + ('\u{1f4}', '\u{1f5}'), ('\u{1f8}', '\u{1f9}'), ('\u{1fa}', '\u{217}'), ('\u{218}', + '\u{21b}'), ('\u{21e}', '\u{21f}'), ('\u{226}', '\u{233}'), ('\u{259}', '\u{259}'), + ('\u{2bb}', '\u{2bc}'), ('\u{2ec}', '\u{2ec}'), ('\u{300}', '\u{304}'), ('\u{306}', + '\u{30c}'), ('\u{30f}', '\u{311}'), ('\u{313}', '\u{314}'), ('\u{31b}', '\u{31b}'), + ('\u{323}', '\u{328}'), ('\u{32d}', '\u{32e}'), ('\u{330}', '\u{331}'), ('\u{335}', + '\u{335}'), ('\u{338}', '\u{339}'), ('\u{342}', '\u{342}'), ('\u{345}', '\u{345}'), + ('\u{375}', '\u{375}'), ('\u{37b}', '\u{37d}'), ('\u{386}', '\u{386}'), ('\u{388}', + '\u{38a}'), ('\u{38c}', '\u{38c}'), ('\u{38e}', '\u{3a1}'), ('\u{3a3}', '\u{3ce}'), + ('\u{3fc}', '\u{3ff}'), ('\u{400}', '\u{400}'), ('\u{401}', '\u{40c}'), ('\u{40d}', + '\u{40d}'), ('\u{40e}', '\u{44f}'), ('\u{450}', '\u{450}'), ('\u{451}', '\u{45c}'), + ('\u{45d}', '\u{45d}'), ('\u{45e}', '\u{45f}'), ('\u{48a}', '\u{48b}'), ('\u{48c}', + '\u{48f}'), ('\u{490}', '\u{4c4}'), ('\u{4c5}', '\u{4c6}'), ('\u{4c7}', '\u{4c8}'), + ('\u{4c9}', '\u{4ca}'), ('\u{4cb}', '\u{4cc}'), ('\u{4cd}', '\u{4ce}'), ('\u{4cf}', + '\u{4cf}'), ('\u{4d0}', '\u{4eb}'), ('\u{4ec}', '\u{4ed}'), ('\u{4ee}', '\u{4f5}'), + ('\u{4f6}', '\u{4f7}'), ('\u{4f8}', '\u{4f9}'), ('\u{4fa}', '\u{4ff}'), ('\u{500}', + '\u{50f}'), ('\u{510}', '\u{513}'), ('\u{514}', '\u{523}'), ('\u{524}', '\u{525}'), + ('\u{526}', '\u{527}'), ('\u{528}', '\u{529}'), ('\u{52e}', '\u{52f}'), ('\u{531}', + '\u{556}'), ('\u{559}', '\u{559}'), ('\u{560}', '\u{560}'), ('\u{561}', '\u{586}'), + ('\u{588}', '\u{588}'), ('\u{58a}', '\u{58a}'), ('\u{5b4}', '\u{5b4}'), ('\u{5d0}', + '\u{5ea}'), ('\u{5ef}', '\u{5ef}'), ('\u{5f0}', '\u{5f4}'), ('\u{620}', '\u{620}'), + ('\u{621}', '\u{63a}'), ('\u{63b}', '\u{63f}'), ('\u{641}', '\u{652}'), ('\u{653}', + '\u{655}'), ('\u{660}', '\u{669}'), ('\u{670}', '\u{672}'), ('\u{674}', '\u{674}'), + ('\u{679}', '\u{68d}'), ('\u{68f}', '\u{6b7}'), ('\u{6b8}', '\u{6b9}'), ('\u{6ba}', + '\u{6be}'), ('\u{6bf}', '\u{6bf}'), ('\u{6c0}', '\u{6ce}'), ('\u{6cf}', '\u{6cf}'), + ('\u{6d0}', '\u{6d3}'), ('\u{6d5}', '\u{6d5}'), ('\u{6e5}', '\u{6e6}'), ('\u{6ee}', + '\u{6ef}'), ('\u{6f0}', '\u{6f9}'), ('\u{6fa}', '\u{6fe}'), ('\u{6ff}', '\u{6ff}'), + ('\u{750}', '\u{76d}'), ('\u{76e}', '\u{77f}'), ('\u{780}', '\u{7b0}'), ('\u{7b1}', + '\u{7b1}'), ('\u{8a0}', '\u{8a0}'), ('\u{8a1}', '\u{8a1}'), ('\u{8a2}', '\u{8ac}'), + ('\u{8b2}', '\u{8b2}'), ('\u{8b6}', '\u{8bd}'), ('\u{901}', '\u{903}'), ('\u{904}', + '\u{904}'), ('\u{905}', '\u{939}'), ('\u{93a}', '\u{93b}'), ('\u{93c}', '\u{94d}'), + ('\u{94f}', '\u{94f}'), ('\u{950}', '\u{950}'), ('\u{956}', '\u{957}'), ('\u{960}', + '\u{963}'), ('\u{966}', '\u{96f}'), ('\u{971}', '\u{972}'), ('\u{973}', '\u{977}'), + ('\u{979}', '\u{97a}'), ('\u{97b}', '\u{97c}'), ('\u{97d}', '\u{97d}'), ('\u{97e}', + '\u{97f}'), ('\u{981}', '\u{983}'), ('\u{985}', '\u{98c}'), ('\u{98f}', '\u{990}'), + ('\u{993}', '\u{9a8}'), ('\u{9aa}', '\u{9b0}'), ('\u{9b2}', '\u{9b2}'), ('\u{9b6}', + '\u{9b9}'), ('\u{9bc}', '\u{9bc}'), ('\u{9bd}', '\u{9bd}'), ('\u{9be}', '\u{9c4}'), + ('\u{9c7}', '\u{9c8}'), ('\u{9cb}', '\u{9cd}'), ('\u{9ce}', '\u{9ce}'), ('\u{9d7}', + '\u{9d7}'), ('\u{9e0}', '\u{9e3}'), ('\u{9e6}', '\u{9f1}'), ('\u{9fc}', '\u{9fc}'), + ('\u{9fe}', '\u{9fe}'), ('\u{a01}', '\u{a01}'), ('\u{a02}', '\u{a02}'), ('\u{a03}', + '\u{a03}'), ('\u{a05}', '\u{a0a}'), ('\u{a0f}', '\u{a10}'), ('\u{a13}', '\u{a28}'), + ('\u{a2a}', '\u{a30}'), ('\u{a32}', '\u{a32}'), ('\u{a35}', '\u{a35}'), ('\u{a38}', + '\u{a39}'), ('\u{a3c}', '\u{a3c}'), ('\u{a3e}', '\u{a42}'), ('\u{a47}', '\u{a48}'), + ('\u{a4b}', '\u{a4d}'), ('\u{a5c}', '\u{a5c}'), ('\u{a66}', '\u{a74}'), ('\u{a81}', + '\u{a83}'), ('\u{a85}', '\u{a8b}'), ('\u{a8c}', '\u{a8c}'), ('\u{a8d}', '\u{a8d}'), + ('\u{a8f}', '\u{a91}'), ('\u{a93}', '\u{aa8}'), ('\u{aaa}', '\u{ab0}'), ('\u{ab2}', + '\u{ab3}'), ('\u{ab5}', '\u{ab9}'), ('\u{abc}', '\u{ac5}'), ('\u{ac7}', '\u{ac9}'), + ('\u{acb}', '\u{acd}'), ('\u{ad0}', '\u{ad0}'), ('\u{ae0}', '\u{ae0}'), ('\u{ae1}', + '\u{ae3}'), ('\u{ae6}', '\u{aef}'), ('\u{afa}', '\u{aff}'), ('\u{b01}', '\u{b03}'), + ('\u{b05}', '\u{b0c}'), ('\u{b0f}', '\u{b10}'), ('\u{b13}', '\u{b28}'), ('\u{b2a}', + '\u{b30}'), ('\u{b32}', '\u{b33}'), ('\u{b35}', '\u{b35}'), ('\u{b36}', '\u{b39}'), + ('\u{b3c}', '\u{b43}'), ('\u{b47}', '\u{b48}'), ('\u{b4b}', '\u{b4d}'), ('\u{b56}', + '\u{b57}'), ('\u{b5f}', '\u{b61}'), ('\u{b66}', '\u{b6f}'), ('\u{b71}', '\u{b71}'), + ('\u{b82}', '\u{b83}'), ('\u{b85}', '\u{b8a}'), ('\u{b8e}', '\u{b90}'), ('\u{b92}', + '\u{b95}'), ('\u{b99}', '\u{b9a}'), ('\u{b9c}', '\u{b9c}'), ('\u{b9e}', '\u{b9f}'), + ('\u{ba3}', '\u{ba4}'), ('\u{ba8}', '\u{baa}'), ('\u{bae}', '\u{bb5}'), ('\u{bb6}', + '\u{bb6}'), ('\u{bb7}', '\u{bb9}'), ('\u{bbe}', '\u{bc2}'), ('\u{bc6}', '\u{bc8}'), + ('\u{bca}', '\u{bcd}'), ('\u{bd0}', '\u{bd0}'), ('\u{bd7}', '\u{bd7}'), ('\u{be6}', + '\u{be6}'), ('\u{be7}', '\u{bef}'), ('\u{c01}', '\u{c03}'), ('\u{c04}', '\u{c04}'), + ('\u{c05}', '\u{c0c}'), ('\u{c0e}', '\u{c10}'), ('\u{c12}', '\u{c28}'), ('\u{c2a}', + '\u{c33}'), ('\u{c35}', '\u{c39}'), ('\u{c3d}', '\u{c3d}'), ('\u{c3e}', '\u{c44}'), + ('\u{c46}', '\u{c48}'), ('\u{c4a}', '\u{c4d}'), ('\u{c55}', '\u{c56}'), ('\u{c60}', + '\u{c61}'), ('\u{c66}', '\u{c6f}'), ('\u{c80}', '\u{c80}'), ('\u{c82}', '\u{c83}'), + ('\u{c85}', '\u{c8c}'), ('\u{c8e}', '\u{c90}'), ('\u{c92}', '\u{ca8}'), ('\u{caa}', + '\u{cb3}'), ('\u{cb5}', '\u{cb9}'), ('\u{cbc}', '\u{cbd}'), ('\u{cbe}', '\u{cc4}'), + ('\u{cc6}', '\u{cc8}'), ('\u{cca}', '\u{ccd}'), ('\u{cd5}', '\u{cd6}'), ('\u{ce0}', + '\u{ce1}'), ('\u{ce2}', '\u{ce3}'), ('\u{ce6}', '\u{cef}'), ('\u{cf1}', '\u{cf2}'), + ('\u{d00}', '\u{d00}'), ('\u{d02}', '\u{d03}'), ('\u{d05}', '\u{d0c}'), ('\u{d0e}', + '\u{d10}'), ('\u{d12}', '\u{d28}'), ('\u{d29}', '\u{d29}'), ('\u{d2a}', '\u{d39}'), + ('\u{d3a}', '\u{d3a}'), ('\u{d3b}', '\u{d3c}'), ('\u{d3d}', '\u{d3d}'), ('\u{d3e}', + '\u{d43}'), ('\u{d46}', '\u{d48}'), ('\u{d4a}', '\u{d4d}'), ('\u{d4e}', '\u{d4e}'), + ('\u{d54}', '\u{d56}'), ('\u{d57}', '\u{d57}'), ('\u{d60}', '\u{d61}'), ('\u{d66}', + '\u{d6f}'), ('\u{d7a}', '\u{d7f}'), ('\u{d82}', '\u{d83}'), ('\u{d85}', '\u{d8e}'), + ('\u{d91}', '\u{d96}'), ('\u{d9a}', '\u{da5}'), ('\u{da7}', '\u{db1}'), ('\u{db3}', + '\u{dbb}'), ('\u{dbd}', '\u{dbd}'), ('\u{dc0}', '\u{dc6}'), ('\u{dca}', '\u{dca}'), + ('\u{dcf}', '\u{dd4}'), ('\u{dd6}', '\u{dd6}'), ('\u{dd8}', '\u{dde}'), ('\u{df2}', + '\u{df2}'), ('\u{e01}', '\u{e32}'), ('\u{e34}', '\u{e3a}'), ('\u{e40}', '\u{e4e}'), + ('\u{e50}', '\u{e59}'), ('\u{e81}', '\u{e82}'), ('\u{e84}', '\u{e84}'), ('\u{e86}', + '\u{e86}'), ('\u{e87}', '\u{e88}'), ('\u{e89}', '\u{e89}'), ('\u{e8a}', '\u{e8a}'), + ('\u{e8c}', '\u{e8c}'), ('\u{e8d}', '\u{e8d}'), ('\u{e8e}', '\u{e93}'), ('\u{e94}', + '\u{e97}'), ('\u{e98}', '\u{e98}'), ('\u{e99}', '\u{e9f}'), ('\u{ea0}', '\u{ea0}'), + ('\u{ea1}', '\u{ea3}'), ('\u{ea5}', '\u{ea5}'), ('\u{ea7}', '\u{ea7}'), ('\u{ea8}', + '\u{ea9}'), ('\u{eaa}', '\u{eab}'), ('\u{eac}', '\u{eac}'), ('\u{ead}', '\u{eb2}'), + ('\u{eb4}', '\u{eb9}'), ('\u{eba}', '\u{eba}'), ('\u{ebb}', '\u{ebd}'), ('\u{ec0}', + '\u{ec4}'), ('\u{ec6}', '\u{ec6}'), ('\u{ec8}', '\u{ecd}'), ('\u{ed0}', '\u{ed9}'), + ('\u{ede}', '\u{edf}'), ('\u{f00}', '\u{f00}'), ('\u{f0b}', '\u{f0b}'), ('\u{f20}', + '\u{f29}'), ('\u{f35}', '\u{f35}'), ('\u{f37}', '\u{f37}'), ('\u{f3e}', '\u{f42}'), + ('\u{f44}', '\u{f47}'), ('\u{f49}', '\u{f4c}'), ('\u{f4e}', '\u{f51}'), ('\u{f53}', + '\u{f56}'), ('\u{f58}', '\u{f5b}'), ('\u{f5d}', '\u{f68}'), ('\u{f6a}', '\u{f6a}'), + ('\u{f6b}', '\u{f6c}'), ('\u{f71}', '\u{f72}'), ('\u{f74}', '\u{f74}'), ('\u{f7a}', + '\u{f80}'), ('\u{f82}', '\u{f84}'), ('\u{f86}', '\u{f8b}'), ('\u{f8c}', '\u{f8f}'), + ('\u{f90}', '\u{f92}'), ('\u{f94}', '\u{f95}'), ('\u{f96}', '\u{f96}'), ('\u{f97}', + '\u{f97}'), ('\u{f99}', '\u{f9c}'), ('\u{f9e}', '\u{fa1}'), ('\u{fa3}', '\u{fa6}'), + ('\u{fa8}', '\u{fab}'), ('\u{fad}', '\u{fad}'), ('\u{fae}', '\u{fb0}'), ('\u{fb1}', + '\u{fb7}'), ('\u{fb8}', '\u{fb8}'), ('\u{fba}', '\u{fbc}'), ('\u{fc6}', '\u{fc6}'), + ('\u{1000}', '\u{1021}'), ('\u{1022}', '\u{1022}'), ('\u{1023}', '\u{1027}'), ('\u{1028}', + '\u{1028}'), ('\u{1029}', '\u{102a}'), ('\u{102b}', '\u{102b}'), ('\u{102c}', '\u{1032}'), + ('\u{1033}', '\u{1035}'), ('\u{1036}', '\u{1039}'), ('\u{103a}', '\u{103f}'), ('\u{1040}', + '\u{1049}'), ('\u{1050}', '\u{1059}'), ('\u{105a}', '\u{1099}'), ('\u{109a}', '\u{109d}'), + ('\u{10c7}', '\u{10c7}'), ('\u{10cd}', '\u{10cd}'), ('\u{10d0}', '\u{10f0}'), ('\u{10f7}', + '\u{10f8}'), ('\u{10f9}', '\u{10fa}'), ('\u{10fd}', '\u{10ff}'), ('\u{1200}', '\u{1206}'), + ('\u{1207}', '\u{1207}'), ('\u{1208}', '\u{1246}'), ('\u{1247}', '\u{1247}'), ('\u{1248}', + '\u{1248}'), ('\u{124a}', '\u{124d}'), ('\u{1250}', '\u{1256}'), ('\u{1258}', '\u{1258}'), + ('\u{125a}', '\u{125d}'), ('\u{1260}', '\u{1286}'), ('\u{1287}', '\u{1287}'), ('\u{1288}', + '\u{1288}'), ('\u{128a}', '\u{128d}'), ('\u{1290}', '\u{12ae}'), ('\u{12af}', '\u{12af}'), + ('\u{12b0}', '\u{12b0}'), ('\u{12b2}', '\u{12b5}'), ('\u{12b8}', '\u{12be}'), ('\u{12c0}', + '\u{12c0}'), ('\u{12c2}', '\u{12c5}'), ('\u{12c8}', '\u{12ce}'), ('\u{12cf}', '\u{12cf}'), + ('\u{12d0}', '\u{12d6}'), ('\u{12d8}', '\u{12ee}'), ('\u{12ef}', '\u{12ef}'), ('\u{12f0}', + '\u{130e}'), ('\u{130f}', '\u{130f}'), ('\u{1310}', '\u{1310}'), ('\u{1312}', '\u{1315}'), + ('\u{1318}', '\u{131e}'), ('\u{131f}', '\u{131f}'), ('\u{1320}', '\u{1346}'), ('\u{1347}', + '\u{1347}'), ('\u{1348}', '\u{135a}'), ('\u{135d}', '\u{135e}'), ('\u{135f}', '\u{135f}'), + ('\u{1380}', '\u{138f}'), ('\u{1780}', '\u{17a2}'), ('\u{17a5}', '\u{17a7}'), ('\u{17a9}', + '\u{17b3}'), ('\u{17b6}', '\u{17ca}'), ('\u{17d2}', '\u{17d2}'), ('\u{17d7}', '\u{17d7}'), + ('\u{17dc}', '\u{17dc}'), ('\u{17e0}', '\u{17e9}'), ('\u{1c80}', '\u{1c88}'), ('\u{1c90}', + '\u{1cba}'), ('\u{1cbd}', '\u{1cbf}'), ('\u{1e00}', '\u{1e99}'), ('\u{1e9e}', '\u{1e9e}'), + ('\u{1ea0}', '\u{1ef9}'), ('\u{1f00}', '\u{1f15}'), ('\u{1f18}', '\u{1f1d}'), ('\u{1f20}', + '\u{1f45}'), ('\u{1f48}', '\u{1f4d}'), ('\u{1f50}', '\u{1f57}'), ('\u{1f59}', '\u{1f59}'), + ('\u{1f5b}', '\u{1f5b}'), ('\u{1f5d}', '\u{1f5d}'), ('\u{1f5f}', '\u{1f70}'), ('\u{1f72}', + '\u{1f72}'), ('\u{1f74}', '\u{1f74}'), ('\u{1f76}', '\u{1f76}'), ('\u{1f78}', '\u{1f78}'), + ('\u{1f7a}', '\u{1f7a}'), ('\u{1f7c}', '\u{1f7c}'), ('\u{1f80}', '\u{1fb4}'), ('\u{1fb6}', + '\u{1fba}'), ('\u{1fbc}', '\u{1fbc}'), ('\u{1fc2}', '\u{1fc4}'), ('\u{1fc6}', '\u{1fc8}'), + ('\u{1fca}', '\u{1fca}'), ('\u{1fcc}', '\u{1fcc}'), ('\u{1fd0}', '\u{1fd2}'), ('\u{1fd6}', + '\u{1fda}'), ('\u{1fe0}', '\u{1fe2}'), ('\u{1fe4}', '\u{1fea}'), ('\u{1fec}', '\u{1fec}'), + ('\u{1ff2}', '\u{1ff4}'), ('\u{1ff6}', '\u{1ff8}'), ('\u{1ffa}', '\u{1ffa}'), ('\u{1ffc}', + '\u{1ffc}'), ('\u{200c}', '\u{200d}'), ('\u{2010}', '\u{2010}'), ('\u{2019}', '\u{2019}'), + ('\u{2027}', '\u{2027}'), ('\u{2d27}', '\u{2d27}'), ('\u{2d2d}', '\u{2d2d}'), ('\u{2d80}', + '\u{2d96}'), ('\u{2da0}', '\u{2da6}'), ('\u{2da8}', '\u{2dae}'), ('\u{2db0}', '\u{2db6}'), + ('\u{2db8}', '\u{2dbe}'), ('\u{2dc0}', '\u{2dc6}'), ('\u{2dc8}', '\u{2dce}'), ('\u{2dd0}', + '\u{2dd6}'), ('\u{2dd8}', '\u{2dde}'), ('\u{3005}', '\u{3007}'), ('\u{3041}', '\u{3094}'), + ('\u{3095}', '\u{3096}'), ('\u{3099}', '\u{309a}'), ('\u{309d}', '\u{309e}'), ('\u{30a0}', + '\u{30a0}'), ('\u{30a1}', '\u{30fe}'), ('\u{3105}', '\u{312c}'), ('\u{312d}', '\u{312d}'), + ('\u{312e}', '\u{312e}'), ('\u{312f}', '\u{312f}'), ('\u{31a0}', '\u{31b7}'), ('\u{31b8}', + '\u{31ba}'), ('\u{3400}', '\u{4db5}'), ('\u{4e00}', '\u{9fa5}'), ('\u{9fa6}', '\u{9fbb}'), + ('\u{9fbc}', '\u{9fc3}'), ('\u{9fc4}', '\u{9fcb}'), ('\u{9fcc}', '\u{9fcc}'), ('\u{9fcd}', + '\u{9fd5}'), ('\u{9fd6}', '\u{9fea}'), ('\u{9feb}', '\u{9fef}'), ('\u{a660}', '\u{a661}'), + ('\u{a674}', '\u{a67b}'), ('\u{a67f}', '\u{a67f}'), ('\u{a69f}', '\u{a69f}'), ('\u{a717}', + '\u{a71a}'), ('\u{a71b}', '\u{a71f}'), ('\u{a788}', '\u{a788}'), ('\u{a78d}', '\u{a78e}'), + ('\u{a790}', '\u{a791}'), ('\u{a792}', '\u{a793}'), ('\u{a7a0}', '\u{a7a9}'), ('\u{a7aa}', + '\u{a7aa}'), ('\u{a7ae}', '\u{a7ae}'), ('\u{a7af}', '\u{a7af}'), ('\u{a7b8}', '\u{a7b9}'), + ('\u{a7ba}', '\u{a7bf}'), ('\u{a7c2}', '\u{a7c6}'), ('\u{a7fa}', '\u{a7fa}'), ('\u{a9e7}', + '\u{a9fe}'), ('\u{aa60}', '\u{aa76}'), ('\u{aa7a}', '\u{aa7b}'), ('\u{aa7c}', '\u{aa7f}'), + ('\u{ab01}', '\u{ab06}'), ('\u{ab09}', '\u{ab0e}'), ('\u{ab11}', '\u{ab16}'), ('\u{ab20}', + '\u{ab26}'), ('\u{ab28}', '\u{ab2e}'), ('\u{ab66}', '\u{ab67}'), ('\u{ac00}', '\u{d7a3}'), + ('\u{fa0e}', '\u{fa0f}'), ('\u{fa11}', '\u{fa11}'), ('\u{fa13}', '\u{fa14}'), ('\u{fa1f}', + '\u{fa1f}'), ('\u{fa21}', '\u{fa21}'), ('\u{fa23}', '\u{fa24}'), ('\u{fa27}', '\u{fa29}'), + ('\u{1133b}', '\u{1133b}'), ('\u{1b150}', '\u{1b152}'), ('\u{1b164}', '\u{1b167}'), + ('\u{20000}', '\u{2a6d6}'), ('\u{2a700}', '\u{2b734}'), ('\u{2b740}', '\u{2b81d}'), + ('\u{2b820}', '\u{2cea1}'), ('\u{2ceb0}', '\u{2ebe0}') + ]; + + const IDENTIFIER_TYPE: &'static [(char, char, IdentifierType)] = &[ + ('\u{9}', '\u{d}', IdentifierType::Not_XID), ('\u{20}', '\u{26}', + IdentifierType::Not_XID), ('\u{27}', '\u{27}', IdentifierType::Inclusion), ('\u{28}', + '\u{2c}', IdentifierType::Not_XID), ('\u{2d}', '\u{2e}', IdentifierType::Inclusion), + ('\u{2f}', '\u{2f}', IdentifierType::Not_XID), ('\u{30}', '\u{39}', + IdentifierType::Recommended), ('\u{3a}', '\u{3a}', IdentifierType::Inclusion), ('\u{3b}', + '\u{40}', IdentifierType::Not_XID), ('\u{41}', '\u{5a}', IdentifierType::Recommended), + ('\u{5b}', '\u{5e}', IdentifierType::Not_XID), ('\u{5f}', '\u{5f}', + IdentifierType::Recommended), ('\u{60}', '\u{60}', IdentifierType::Not_XID), ('\u{61}', + '\u{7a}', IdentifierType::Recommended), ('\u{7b}', '\u{7e}', IdentifierType::Not_XID), + ('\u{85}', '\u{85}', IdentifierType::Not_XID), ('\u{a0}', '\u{a0}', + IdentifierType::Not_XID), ('\u{a1}', '\u{a7}', IdentifierType::Not_XID), ('\u{a8}', + '\u{a8}', IdentifierType::Not_XID), ('\u{a9}', '\u{a9}', IdentifierType::Not_XID), + ('\u{aa}', '\u{aa}', IdentifierType::Not_NFKC), ('\u{ab}', '\u{ac}', + IdentifierType::Not_XID), ('\u{ad}', '\u{ad}', IdentifierType::Exclusion), ('\u{ae}', + '\u{ae}', IdentifierType::Not_XID), ('\u{af}', '\u{af}', IdentifierType::Not_XID), + ('\u{b0}', '\u{b1}', IdentifierType::Not_XID), ('\u{b2}', '\u{b4}', + IdentifierType::Not_XID), ('\u{b5}', '\u{b5}', IdentifierType::Not_NFKC), ('\u{b6}', + '\u{b6}', IdentifierType::Not_XID), ('\u{b7}', '\u{b7}', IdentifierType::Inclusion), + ('\u{b8}', '\u{b9}', IdentifierType::Not_XID), ('\u{ba}', '\u{ba}', + IdentifierType::Not_NFKC), ('\u{bb}', '\u{bb}', IdentifierType::Not_XID), ('\u{bc}', + '\u{be}', IdentifierType::Not_XID), ('\u{bf}', '\u{bf}', IdentifierType::Not_XID), + ('\u{c0}', '\u{d6}', IdentifierType::Recommended), ('\u{d7}', '\u{d7}', + IdentifierType::Not_XID), ('\u{d8}', '\u{f6}', IdentifierType::Recommended), ('\u{f7}', + '\u{f7}', IdentifierType::Not_XID), ('\u{f8}', '\u{131}', IdentifierType::Recommended), + ('\u{132}', '\u{133}', IdentifierType::Not_NFKC), ('\u{134}', '\u{13e}', + IdentifierType::Recommended), ('\u{13f}', '\u{140}', IdentifierType::Not_NFKC), + ('\u{141}', '\u{148}', IdentifierType::Recommended), ('\u{149}', '\u{149}', + IdentifierType::Obsolete), ('\u{14a}', '\u{17e}', IdentifierType::Recommended), + ('\u{17f}', '\u{17f}', IdentifierType::Not_NFKC), ('\u{180}', '\u{180}', + IdentifierType::Technical), ('\u{181}', '\u{18c}', IdentifierType::Uncommon_Use), + ('\u{18d}', '\u{18d}', IdentifierType::Technical), ('\u{18e}', '\u{18e}', + IdentifierType::Uncommon_Use), ('\u{18f}', '\u{18f}', IdentifierType::Recommended), + ('\u{190}', '\u{19f}', IdentifierType::Uncommon_Use), ('\u{1a0}', '\u{1a1}', + IdentifierType::Recommended), ('\u{1a2}', '\u{1a9}', IdentifierType::Uncommon_Use), + ('\u{1aa}', '\u{1ab}', IdentifierType::Technical), ('\u{1ac}', '\u{1ae}', + IdentifierType::Uncommon_Use), ('\u{1af}', '\u{1b0}', IdentifierType::Recommended), + ('\u{1b1}', '\u{1b8}', IdentifierType::Uncommon_Use), ('\u{1b9}', '\u{1b9}', + IdentifierType::Obsolete), ('\u{1ba}', '\u{1bb}', IdentifierType::Technical), ('\u{1bc}', + '\u{1bd}', IdentifierType::Uncommon_Use), ('\u{1be}', '\u{1be}', + IdentifierType::Technical), ('\u{1bf}', '\u{1bf}', IdentifierType::Obsolete), ('\u{1c0}', + '\u{1c3}', IdentifierType::Technical), ('\u{1c4}', '\u{1cc}', IdentifierType::Not_NFKC), + ('\u{1cd}', '\u{1dc}', IdentifierType::Recommended), ('\u{1dd}', '\u{1dd}', + IdentifierType::Uncommon_Use), ('\u{1de}', '\u{1e3}', IdentifierType::Recommended), + ('\u{1e4}', '\u{1e5}', IdentifierType::Uncommon_Use), ('\u{1e6}', '\u{1f0}', + IdentifierType::Recommended), ('\u{1f1}', '\u{1f3}', IdentifierType::Not_NFKC), + ('\u{1f4}', '\u{1f5}', IdentifierType::Recommended), ('\u{1f6}', '\u{1f7}', + IdentifierType::Obsolete), ('\u{1f8}', '\u{1f9}', IdentifierType::Recommended), + ('\u{1fa}', '\u{217}', IdentifierType::Recommended), ('\u{218}', '\u{21b}', + IdentifierType::Recommended), ('\u{21c}', '\u{21d}', IdentifierType::Obsolete), + ('\u{21e}', '\u{21f}', IdentifierType::Recommended), ('\u{220}', '\u{220}', + IdentifierType::Uncommon_Use), ('\u{221}', '\u{221}', IdentifierType::Uncommon_Use), + ('\u{222}', '\u{225}', IdentifierType::Uncommon_Use), ('\u{226}', '\u{233}', + IdentifierType::Recommended), ('\u{234}', '\u{236}', IdentifierType::Technical), + ('\u{237}', '\u{241}', IdentifierType::Uncommon_Use), ('\u{242}', '\u{24f}', + IdentifierType::Uncommon_Use), ('\u{250}', '\u{252}', IdentifierType::Technical), + ('\u{253}', '\u{254}', IdentifierType::Uncommon_Use), ('\u{255}', '\u{255}', + IdentifierType::Technical), ('\u{256}', '\u{257}', IdentifierType::Uncommon_Use), + ('\u{258}', '\u{258}', IdentifierType::Technical), ('\u{259}', '\u{259}', + IdentifierType::Recommended), ('\u{25a}', '\u{25a}', IdentifierType::Technical), + ('\u{25b}', '\u{25b}', IdentifierType::Uncommon_Use), ('\u{25c}', '\u{25f}', + IdentifierType::Technical), ('\u{260}', '\u{260}', IdentifierType::Uncommon_Use), + ('\u{261}', '\u{262}', IdentifierType::Technical), ('\u{263}', '\u{263}', + IdentifierType::Uncommon_Use), ('\u{264}', '\u{267}', IdentifierType::Technical), + ('\u{268}', '\u{269}', IdentifierType::Uncommon_Use), ('\u{26a}', '\u{26e}', + IdentifierType::Technical), ('\u{26f}', '\u{26f}', IdentifierType::Uncommon_Use), + ('\u{270}', '\u{271}', IdentifierType::Technical), ('\u{272}', '\u{272}', + IdentifierType::Uncommon_Use), ('\u{273}', '\u{274}', IdentifierType::Technical), + ('\u{275}', '\u{275}', IdentifierType::Uncommon_Use), ('\u{276}', '\u{276}', + IdentifierType::Technical), ('\u{277}', '\u{277}', IdentifierType::Technical), ('\u{278}', + '\u{27b}', IdentifierType::Technical), ('\u{27c}', '\u{27c}', IdentifierType::Technical), + ('\u{27d}', '\u{27f}', IdentifierType::Technical), ('\u{280}', '\u{280}', + IdentifierType::Uncommon_Use), ('\u{281}', '\u{282}', IdentifierType::Technical), + ('\u{283}', '\u{283}', IdentifierType::Uncommon_Use), ('\u{284}', '\u{287}', + IdentifierType::Technical), ('\u{288}', '\u{288}', IdentifierType::Uncommon_Use), + ('\u{289}', '\u{289}', IdentifierType::Uncommon_Use), ('\u{28a}', '\u{28b}', + IdentifierType::Uncommon_Use), ('\u{28c}', '\u{291}', IdentifierType::Technical), + ('\u{292}', '\u{292}', IdentifierType::Uncommon_Use), ('\u{293}', '\u{293}', + IdentifierType::Technical), ('\u{294}', '\u{294}', IdentifierType::Uncommon_Use), + ('\u{295}', '\u{29d}', IdentifierType::Technical), ('\u{29e}', '\u{29e}', + IdentifierType::Technical), ('\u{29f}', '\u{2a8}', IdentifierType::Technical), ('\u{2a9}', + '\u{2ad}', IdentifierType::Technical), ('\u{2ae}', '\u{2af}', IdentifierType::Technical), + ('\u{2b0}', '\u{2b8}', IdentifierType::Not_NFKC), ('\u{2b9}', '\u{2ba}', + IdentifierType::Technical), ('\u{2bb}', '\u{2bc}', IdentifierType::Recommended), + ('\u{2bd}', '\u{2c1}', IdentifierType::Technical), ('\u{2c2}', '\u{2c5}', + IdentifierType::Not_XID), ('\u{2c6}', '\u{2d1}', IdentifierType::Technical), ('\u{2d2}', + '\u{2d7}', IdentifierType::Not_XID), ('\u{2d8}', '\u{2dd}', IdentifierType::Not_XID), + ('\u{2de}', '\u{2de}', IdentifierType::Not_XID), ('\u{2df}', '\u{2df}', + IdentifierType::Not_XID), ('\u{2e0}', '\u{2e4}', IdentifierType::Not_NFKC), ('\u{2e5}', + '\u{2e9}', IdentifierType::Not_XID), ('\u{2ea}', '\u{2eb}', IdentifierType::Not_XID), + ('\u{2ec}', '\u{2ec}', IdentifierType::Recommended), ('\u{2ed}', '\u{2ed}', + IdentifierType::Not_XID), ('\u{2ee}', '\u{2ee}', IdentifierType::Technical), ('\u{2ef}', + '\u{2ff}', IdentifierType::Not_XID), ('\u{300}', '\u{304}', IdentifierType::Recommended), + ('\u{305}', '\u{305}', IdentifierType::Uncommon_Use), ('\u{306}', '\u{30c}', + IdentifierType::Recommended), ('\u{30d}', '\u{30d}', IdentifierType::Uncommon_Use), + ('\u{30e}', '\u{30e}', IdentifierType::Technical), ('\u{30f}', '\u{311}', + IdentifierType::Recommended), ('\u{312}', '\u{312}', IdentifierType::Technical), + ('\u{313}', '\u{314}', IdentifierType::Recommended), ('\u{315}', '\u{315}', + IdentifierType::Technical), ('\u{316}', '\u{316}', IdentifierType::Uncommon_Use), + ('\u{317}', '\u{31a}', IdentifierType::Technical), ('\u{31b}', '\u{31b}', + IdentifierType::Recommended), ('\u{31c}', '\u{320}', IdentifierType::Technical), + ('\u{321}', '\u{322}', IdentifierType::Uncommon_Use), ('\u{323}', '\u{328}', + IdentifierType::Recommended), ('\u{329}', '\u{32c}', IdentifierType::Technical), + ('\u{32d}', '\u{32e}', IdentifierType::Recommended), ('\u{32f}', '\u{32f}', + IdentifierType::Technical), ('\u{330}', '\u{331}', IdentifierType::Recommended), + ('\u{332}', '\u{332}', IdentifierType::Uncommon_Use), ('\u{333}', '\u{333}', + IdentifierType::Technical), ('\u{334}', '\u{334}', IdentifierType::Uncommon_Use), + ('\u{335}', '\u{335}', IdentifierType::Recommended), ('\u{336}', '\u{336}', + IdentifierType::Uncommon_Use), ('\u{337}', '\u{337}', IdentifierType::Technical), + ('\u{338}', '\u{339}', IdentifierType::Recommended), ('\u{33a}', '\u{33f}', + IdentifierType::Technical), ('\u{340}', '\u{341}', IdentifierType::Technical), ('\u{342}', + '\u{342}', IdentifierType::Recommended), ('\u{343}', '\u{343}', + IdentifierType::Technical), ('\u{344}', '\u{344}', IdentifierType::Obsolete), ('\u{345}', + '\u{345}', IdentifierType::Recommended), ('\u{346}', '\u{34e}', + IdentifierType::Technical), ('\u{34f}', '\u{34f}', IdentifierType::Exclusion), ('\u{350}', + '\u{357}', IdentifierType::Technical), ('\u{358}', '\u{358}', + IdentifierType::Uncommon_Use), ('\u{359}', '\u{35c}', IdentifierType::Technical), + ('\u{35d}', '\u{35f}', IdentifierType::Technical), ('\u{360}', '\u{361}', + IdentifierType::Technical), ('\u{362}', '\u{362}', IdentifierType::Technical), ('\u{363}', + '\u{36f}', IdentifierType::Obsolete), ('\u{370}', '\u{373}', IdentifierType::Obsolete), + ('\u{374}', '\u{374}', IdentifierType::Not_NFKC), ('\u{375}', '\u{375}', + IdentifierType::Inclusion), ('\u{376}', '\u{377}', IdentifierType::Obsolete), ('\u{37a}', + '\u{37a}', IdentifierType::Not_XID), ('\u{37b}', '\u{37d}', IdentifierType::Recommended), + ('\u{37e}', '\u{37e}', IdentifierType::Not_XID), ('\u{37f}', '\u{37f}', + IdentifierType::Obsolete), ('\u{384}', '\u{385}', IdentifierType::Not_XID), ('\u{386}', + '\u{386}', IdentifierType::Recommended), ('\u{387}', '\u{387}', IdentifierType::Not_NFKC), + ('\u{388}', '\u{38a}', IdentifierType::Recommended), ('\u{38c}', '\u{38c}', + IdentifierType::Recommended), ('\u{38e}', '\u{3a1}', IdentifierType::Recommended), + ('\u{3a3}', '\u{3ce}', IdentifierType::Recommended), ('\u{3cf}', '\u{3cf}', + IdentifierType::Technical), ('\u{3d0}', '\u{3d1}', IdentifierType::Obsolete), ('\u{3d2}', + '\u{3d4}', IdentifierType::Not_NFKC), ('\u{3d5}', '\u{3d6}', IdentifierType::Obsolete), + ('\u{3d7}', '\u{3d7}', IdentifierType::Technical), ('\u{3d8}', '\u{3d9}', + IdentifierType::Obsolete), ('\u{3da}', '\u{3da}', IdentifierType::Obsolete), ('\u{3db}', + '\u{3db}', IdentifierType::Obsolete), ('\u{3dc}', '\u{3dc}', IdentifierType::Obsolete), + ('\u{3dd}', '\u{3dd}', IdentifierType::Obsolete), ('\u{3de}', '\u{3de}', + IdentifierType::Obsolete), ('\u{3df}', '\u{3df}', IdentifierType::Obsolete), ('\u{3e0}', + '\u{3e0}', IdentifierType::Obsolete), ('\u{3e1}', '\u{3e1}', IdentifierType::Obsolete), + ('\u{3e2}', '\u{3ef}', IdentifierType::Exclusion), ('\u{3f0}', '\u{3f2}', + IdentifierType::Not_NFKC), ('\u{3f3}', '\u{3f3}', IdentifierType::Technical), ('\u{3f4}', + '\u{3f5}', IdentifierType::Not_NFKC), ('\u{3f6}', '\u{3f6}', IdentifierType::Not_XID), + ('\u{3f7}', '\u{3f8}', IdentifierType::Obsolete), ('\u{3f9}', '\u{3f9}', + IdentifierType::Obsolete), ('\u{3fa}', '\u{3fb}', IdentifierType::Obsolete), ('\u{3fc}', + '\u{3ff}', IdentifierType::Recommended), ('\u{400}', '\u{400}', + IdentifierType::Recommended), ('\u{401}', '\u{40c}', IdentifierType::Recommended), + ('\u{40d}', '\u{40d}', IdentifierType::Recommended), ('\u{40e}', '\u{44f}', + IdentifierType::Recommended), ('\u{450}', '\u{450}', IdentifierType::Recommended), + ('\u{451}', '\u{45c}', IdentifierType::Recommended), ('\u{45d}', '\u{45d}', + IdentifierType::Recommended), ('\u{45e}', '\u{45f}', IdentifierType::Recommended), + ('\u{460}', '\u{481}', IdentifierType::Obsolete), ('\u{482}', '\u{482}', + IdentifierType::Obsolete), ('\u{483}', '\u{483}', IdentifierType::Obsolete), ('\u{484}', + '\u{486}', IdentifierType::Technical), ('\u{487}', '\u{487}', IdentifierType::Technical), + ('\u{488}', '\u{489}', IdentifierType::Obsolete), ('\u{48a}', '\u{48b}', + IdentifierType::Recommended), ('\u{48c}', '\u{48f}', IdentifierType::Recommended), + ('\u{490}', '\u{4c4}', IdentifierType::Recommended), ('\u{4c5}', '\u{4c6}', + IdentifierType::Recommended), ('\u{4c7}', '\u{4c8}', IdentifierType::Recommended), + ('\u{4c9}', '\u{4ca}', IdentifierType::Recommended), ('\u{4cb}', '\u{4cc}', + IdentifierType::Recommended), ('\u{4cd}', '\u{4ce}', IdentifierType::Recommended), + ('\u{4cf}', '\u{4cf}', IdentifierType::Recommended), ('\u{4d0}', '\u{4eb}', + IdentifierType::Recommended), ('\u{4ec}', '\u{4ed}', IdentifierType::Recommended), + ('\u{4ee}', '\u{4f5}', IdentifierType::Recommended), ('\u{4f6}', '\u{4f7}', + IdentifierType::Recommended), ('\u{4f8}', '\u{4f9}', IdentifierType::Recommended), + ('\u{4fa}', '\u{4ff}', IdentifierType::Recommended), ('\u{500}', '\u{50f}', + IdentifierType::Recommended), ('\u{510}', '\u{513}', IdentifierType::Recommended), + ('\u{514}', '\u{523}', IdentifierType::Recommended), ('\u{524}', '\u{525}', + IdentifierType::Recommended), ('\u{526}', '\u{527}', IdentifierType::Recommended), + ('\u{528}', '\u{529}', IdentifierType::Recommended), ('\u{52a}', '\u{52d}', + IdentifierType::Obsolete), ('\u{52e}', '\u{52f}', IdentifierType::Recommended), + ('\u{531}', '\u{556}', IdentifierType::Recommended), ('\u{559}', '\u{559}', + IdentifierType::Recommended), ('\u{55a}', '\u{55f}', IdentifierType::Not_XID), ('\u{560}', + '\u{560}', IdentifierType::Recommended), ('\u{561}', '\u{586}', + IdentifierType::Recommended), ('\u{587}', '\u{587}', IdentifierType::Not_NFKC), + ('\u{588}', '\u{588}', IdentifierType::Recommended), ('\u{589}', '\u{589}', + IdentifierType::Not_XID), ('\u{58a}', '\u{58a}', IdentifierType::Inclusion), ('\u{58d}', + '\u{58e}', IdentifierType::Not_XID), ('\u{58f}', '\u{58f}', IdentifierType::Not_XID), + ('\u{591}', '\u{5a1}', IdentifierType::Uncommon_Use), ('\u{5a2}', '\u{5a2}', + IdentifierType::Uncommon_Use), ('\u{5a3}', '\u{5af}', IdentifierType::Uncommon_Use), + ('\u{5b0}', '\u{5b3}', IdentifierType::Uncommon_Use), ('\u{5b4}', '\u{5b4}', + IdentifierType::Recommended), ('\u{5b5}', '\u{5b9}', IdentifierType::Uncommon_Use), + ('\u{5ba}', '\u{5ba}', IdentifierType::Uncommon_Use), ('\u{5bb}', '\u{5bd}', + IdentifierType::Uncommon_Use), ('\u{5be}', '\u{5be}', IdentifierType::Not_XID), + ('\u{5bf}', '\u{5bf}', IdentifierType::Uncommon_Use), ('\u{5c0}', '\u{5c0}', + IdentifierType::Not_XID), ('\u{5c1}', '\u{5c2}', IdentifierType::Uncommon_Use), + ('\u{5c3}', '\u{5c3}', IdentifierType::Not_XID), ('\u{5c4}', '\u{5c4}', + IdentifierType::Uncommon_Use), ('\u{5c5}', '\u{5c5}', IdentifierType::Uncommon_Use), + ('\u{5c6}', '\u{5c6}', IdentifierType::Obsolete), ('\u{5c7}', '\u{5c7}', + IdentifierType::Uncommon_Use), ('\u{5d0}', '\u{5ea}', IdentifierType::Recommended), + ('\u{5ef}', '\u{5ef}', IdentifierType::Recommended), ('\u{5f0}', '\u{5f2}', + IdentifierType::Recommended), ('\u{5f3}', '\u{5f4}', IdentifierType::Inclusion), + ('\u{600}', '\u{603}', IdentifierType::Not_XID), ('\u{604}', '\u{604}', + IdentifierType::Not_XID), ('\u{605}', '\u{605}', IdentifierType::Not_XID), ('\u{606}', + '\u{60a}', IdentifierType::Not_XID), ('\u{60b}', '\u{60b}', IdentifierType::Not_XID), + ('\u{60c}', '\u{60c}', IdentifierType::Not_XID), ('\u{60d}', '\u{60f}', + IdentifierType::Not_XID), ('\u{610}', '\u{615}', IdentifierType::Uncommon_Use), + ('\u{616}', '\u{61a}', IdentifierType::Uncommon_Use), ('\u{61b}', '\u{61b}', + IdentifierType::Not_XID), ('\u{61c}', '\u{61c}', IdentifierType::Exclusion), ('\u{61e}', + '\u{61e}', IdentifierType::Not_XID), ('\u{61f}', '\u{61f}', IdentifierType::Not_XID), + ('\u{620}', '\u{620}', IdentifierType::Recommended), ('\u{621}', '\u{63a}', + IdentifierType::Recommended), ('\u{63b}', '\u{63f}', IdentifierType::Recommended), + ('\u{640}', '\u{640}', IdentifierType::Exclusion), ('\u{641}', '\u{652}', + IdentifierType::Recommended), ('\u{653}', '\u{655}', IdentifierType::Recommended), + ('\u{656}', '\u{658}', IdentifierType::Uncommon_Use), ('\u{659}', '\u{65e}', + IdentifierType::Uncommon_Use), ('\u{65f}', '\u{65f}', IdentifierType::Uncommon_Use), + ('\u{660}', '\u{669}', IdentifierType::Recommended), ('\u{66a}', '\u{66d}', + IdentifierType::Not_XID), ('\u{66e}', '\u{66f}', IdentifierType::Obsolete), ('\u{670}', + '\u{672}', IdentifierType::Recommended), ('\u{673}', '\u{673}', IdentifierType::Obsolete), + ('\u{674}', '\u{674}', IdentifierType::Recommended), ('\u{675}', '\u{678}', + IdentifierType::Not_NFKC), ('\u{679}', '\u{68d}', IdentifierType::Recommended), + ('\u{68e}', '\u{68e}', IdentifierType::Obsolete), ('\u{68f}', '\u{6b7}', + IdentifierType::Recommended), ('\u{6b8}', '\u{6b9}', IdentifierType::Recommended), + ('\u{6ba}', '\u{6be}', IdentifierType::Recommended), ('\u{6bf}', '\u{6bf}', + IdentifierType::Recommended), ('\u{6c0}', '\u{6ce}', IdentifierType::Recommended), + ('\u{6cf}', '\u{6cf}', IdentifierType::Recommended), ('\u{6d0}', '\u{6d3}', + IdentifierType::Recommended), ('\u{6d4}', '\u{6d4}', IdentifierType::Not_XID), ('\u{6d5}', + '\u{6d5}', IdentifierType::Recommended), ('\u{6d6}', '\u{6dc}', + IdentifierType::Uncommon_Use), ('\u{6dd}', '\u{6dd}', IdentifierType::Not_XID), + ('\u{6de}', '\u{6de}', IdentifierType::Not_XID), ('\u{6df}', '\u{6e4}', + IdentifierType::Uncommon_Use), ('\u{6e5}', '\u{6e6}', IdentifierType::Recommended), + ('\u{6e7}', '\u{6e8}', IdentifierType::Uncommon_Use), ('\u{6e9}', '\u{6e9}', + IdentifierType::Not_XID), ('\u{6ea}', '\u{6ed}', IdentifierType::Uncommon_Use), + ('\u{6ee}', '\u{6ef}', IdentifierType::Recommended), ('\u{6f0}', '\u{6f9}', + IdentifierType::Recommended), ('\u{6fa}', '\u{6fc}', IdentifierType::Recommended), + ('\u{6fd}', '\u{6fe}', IdentifierType::Inclusion), ('\u{6ff}', '\u{6ff}', + IdentifierType::Recommended), ('\u{700}', '\u{70d}', IdentifierType::Limited_Use), + ('\u{70f}', '\u{70f}', IdentifierType::Limited_Use), ('\u{710}', '\u{72c}', + IdentifierType::Limited_Use), ('\u{72d}', '\u{72f}', IdentifierType::Limited_Use), + ('\u{730}', '\u{73f}', IdentifierType::Limited_Use), ('\u{740}', '\u{74a}', + IdentifierType::Limited_Use), ('\u{74d}', '\u{74f}', IdentifierType::Limited_Use), + ('\u{750}', '\u{76d}', IdentifierType::Recommended), ('\u{76e}', '\u{77f}', + IdentifierType::Recommended), ('\u{780}', '\u{7b0}', IdentifierType::Recommended), + ('\u{7b1}', '\u{7b1}', IdentifierType::Recommended), ('\u{7c0}', '\u{7e7}', + IdentifierType::Limited_Use), ('\u{7e8}', '\u{7ea}', IdentifierType::Limited_Use), + ('\u{7eb}', '\u{7f5}', IdentifierType::Limited_Use), ('\u{7f6}', '\u{7f9}', + IdentifierType::Limited_Use), ('\u{7fa}', '\u{7fa}', IdentifierType::Limited_Use), + ('\u{7fd}', '\u{7fd}', IdentifierType::Limited_Use), ('\u{7fe}', '\u{7ff}', + IdentifierType::Limited_Use), ('\u{800}', '\u{82d}', IdentifierType::Exclusion), + ('\u{830}', '\u{83e}', IdentifierType::Exclusion), ('\u{840}', '\u{85b}', + IdentifierType::Limited_Use), ('\u{85e}', '\u{85e}', IdentifierType::Limited_Use), + ('\u{860}', '\u{86a}', IdentifierType::Limited_Use), ('\u{8a0}', '\u{8a0}', + IdentifierType::Recommended), ('\u{8a1}', '\u{8a1}', IdentifierType::Recommended), + ('\u{8a2}', '\u{8ac}', IdentifierType::Recommended), ('\u{8ad}', '\u{8b1}', + IdentifierType::Obsolete), ('\u{8b2}', '\u{8b2}', IdentifierType::Recommended), + ('\u{8b3}', '\u{8b4}', IdentifierType::Uncommon_Use), ('\u{8b6}', '\u{8bd}', + IdentifierType::Recommended), ('\u{8d3}', '\u{8d3}', IdentifierType::Uncommon_Use), + ('\u{8d4}', '\u{8e1}', IdentifierType::Uncommon_Use), ('\u{8e2}', '\u{8e2}', + IdentifierType::Not_XID), ('\u{8e3}', '\u{8e3}', IdentifierType::Uncommon_Use), + ('\u{8e4}', '\u{8fe}', IdentifierType::Uncommon_Use), ('\u{8ff}', '\u{8ff}', + IdentifierType::Uncommon_Use), ('\u{900}', '\u{900}', IdentifierType::Uncommon_Use), + ('\u{901}', '\u{903}', IdentifierType::Recommended), ('\u{904}', '\u{904}', + IdentifierType::Recommended), ('\u{905}', '\u{939}', IdentifierType::Recommended), + ('\u{93a}', '\u{93b}', IdentifierType::Recommended), ('\u{93c}', '\u{94d}', + IdentifierType::Recommended), ('\u{94e}', '\u{94e}', IdentifierType::Obsolete), + ('\u{94f}', '\u{94f}', IdentifierType::Recommended), ('\u{950}', '\u{950}', + IdentifierType::Recommended), ('\u{951}', '\u{952}', IdentifierType::Obsolete), + ('\u{953}', '\u{954}', IdentifierType::Technical), ('\u{955}', '\u{955}', + IdentifierType::Uncommon_Use), ('\u{956}', '\u{957}', IdentifierType::Recommended), + ('\u{958}', '\u{95f}', IdentifierType::Not_NFKC), ('\u{960}', '\u{963}', + IdentifierType::Recommended), ('\u{964}', '\u{965}', IdentifierType::Not_XID), ('\u{966}', + '\u{96f}', IdentifierType::Recommended), ('\u{970}', '\u{970}', IdentifierType::Not_XID), + ('\u{971}', '\u{972}', IdentifierType::Recommended), ('\u{973}', '\u{977}', + IdentifierType::Recommended), ('\u{978}', '\u{978}', IdentifierType::Obsolete), + ('\u{979}', '\u{97a}', IdentifierType::Recommended), ('\u{97b}', '\u{97c}', + IdentifierType::Recommended), ('\u{97d}', '\u{97d}', IdentifierType::Recommended), + ('\u{97e}', '\u{97f}', IdentifierType::Recommended), ('\u{980}', '\u{980}', + IdentifierType::Obsolete), ('\u{981}', '\u{983}', IdentifierType::Recommended), + ('\u{985}', '\u{98c}', IdentifierType::Recommended), ('\u{98f}', '\u{990}', + IdentifierType::Recommended), ('\u{993}', '\u{9a8}', IdentifierType::Recommended), + ('\u{9aa}', '\u{9b0}', IdentifierType::Recommended), ('\u{9b2}', '\u{9b2}', + IdentifierType::Recommended), ('\u{9b6}', '\u{9b9}', IdentifierType::Recommended), + ('\u{9bc}', '\u{9bc}', IdentifierType::Recommended), ('\u{9bd}', '\u{9bd}', + IdentifierType::Recommended), ('\u{9be}', '\u{9c4}', IdentifierType::Recommended), + ('\u{9c7}', '\u{9c8}', IdentifierType::Recommended), ('\u{9cb}', '\u{9cd}', + IdentifierType::Recommended), ('\u{9ce}', '\u{9ce}', IdentifierType::Recommended), + ('\u{9d7}', '\u{9d7}', IdentifierType::Recommended), ('\u{9dc}', '\u{9dd}', + IdentifierType::Not_NFKC), ('\u{9df}', '\u{9df}', IdentifierType::Not_NFKC), ('\u{9e0}', + '\u{9e3}', IdentifierType::Recommended), ('\u{9e6}', '\u{9f1}', + IdentifierType::Recommended), ('\u{9f2}', '\u{9fa}', IdentifierType::Not_XID), ('\u{9fb}', + '\u{9fb}', IdentifierType::Not_XID), ('\u{9fc}', '\u{9fc}', IdentifierType::Recommended), + ('\u{9fd}', '\u{9fd}', IdentifierType::Not_XID), ('\u{9fe}', '\u{9fe}', + IdentifierType::Recommended), ('\u{a01}', '\u{a01}', IdentifierType::Recommended), + ('\u{a02}', '\u{a02}', IdentifierType::Recommended), ('\u{a03}', '\u{a03}', + IdentifierType::Recommended), ('\u{a05}', '\u{a0a}', IdentifierType::Recommended), + ('\u{a0f}', '\u{a10}', IdentifierType::Recommended), ('\u{a13}', '\u{a28}', + IdentifierType::Recommended), ('\u{a2a}', '\u{a30}', IdentifierType::Recommended), + ('\u{a32}', '\u{a32}', IdentifierType::Recommended), ('\u{a33}', '\u{a33}', + IdentifierType::Not_NFKC), ('\u{a35}', '\u{a35}', IdentifierType::Recommended), + ('\u{a36}', '\u{a36}', IdentifierType::Not_NFKC), ('\u{a38}', '\u{a39}', + IdentifierType::Recommended), ('\u{a3c}', '\u{a3c}', IdentifierType::Recommended), + ('\u{a3e}', '\u{a42}', IdentifierType::Recommended), ('\u{a47}', '\u{a48}', + IdentifierType::Recommended), ('\u{a4b}', '\u{a4d}', IdentifierType::Recommended), + ('\u{a51}', '\u{a51}', IdentifierType::Uncommon_Use), ('\u{a59}', '\u{a5b}', + IdentifierType::Not_NFKC), ('\u{a5c}', '\u{a5c}', IdentifierType::Recommended), + ('\u{a5e}', '\u{a5e}', IdentifierType::Not_NFKC), ('\u{a66}', '\u{a74}', + IdentifierType::Recommended), ('\u{a75}', '\u{a75}', IdentifierType::Uncommon_Use), + ('\u{a76}', '\u{a76}', IdentifierType::Not_XID), ('\u{a81}', '\u{a83}', + IdentifierType::Recommended), ('\u{a85}', '\u{a8b}', IdentifierType::Recommended), + ('\u{a8c}', '\u{a8c}', IdentifierType::Recommended), ('\u{a8d}', '\u{a8d}', + IdentifierType::Recommended), ('\u{a8f}', '\u{a91}', IdentifierType::Recommended), + ('\u{a93}', '\u{aa8}', IdentifierType::Recommended), ('\u{aaa}', '\u{ab0}', + IdentifierType::Recommended), ('\u{ab2}', '\u{ab3}', IdentifierType::Recommended), + ('\u{ab5}', '\u{ab9}', IdentifierType::Recommended), ('\u{abc}', '\u{ac5}', + IdentifierType::Recommended), ('\u{ac7}', '\u{ac9}', IdentifierType::Recommended), + ('\u{acb}', '\u{acd}', IdentifierType::Recommended), ('\u{ad0}', '\u{ad0}', + IdentifierType::Recommended), ('\u{ae0}', '\u{ae0}', IdentifierType::Recommended), + ('\u{ae1}', '\u{ae3}', IdentifierType::Recommended), ('\u{ae6}', '\u{aef}', + IdentifierType::Recommended), ('\u{af0}', '\u{af0}', IdentifierType::Not_XID), ('\u{af1}', + '\u{af1}', IdentifierType::Not_XID), ('\u{af9}', '\u{af9}', IdentifierType::Uncommon_Use), + ('\u{afa}', '\u{aff}', IdentifierType::Recommended), ('\u{b01}', '\u{b03}', + IdentifierType::Recommended), ('\u{b05}', '\u{b0c}', IdentifierType::Recommended), + ('\u{b0f}', '\u{b10}', IdentifierType::Recommended), ('\u{b13}', '\u{b28}', + IdentifierType::Recommended), ('\u{b2a}', '\u{b30}', IdentifierType::Recommended), + ('\u{b32}', '\u{b33}', IdentifierType::Recommended), ('\u{b35}', '\u{b35}', + IdentifierType::Recommended), ('\u{b36}', '\u{b39}', IdentifierType::Recommended), + ('\u{b3c}', '\u{b43}', IdentifierType::Recommended), ('\u{b44}', '\u{b44}', + IdentifierType::Uncommon_Use), ('\u{b47}', '\u{b48}', IdentifierType::Recommended), + ('\u{b4b}', '\u{b4d}', IdentifierType::Recommended), ('\u{b56}', '\u{b57}', + IdentifierType::Recommended), ('\u{b5c}', '\u{b5d}', IdentifierType::Not_NFKC), + ('\u{b5f}', '\u{b61}', IdentifierType::Recommended), ('\u{b62}', '\u{b63}', + IdentifierType::Uncommon_Use), ('\u{b66}', '\u{b6f}', IdentifierType::Recommended), + ('\u{b70}', '\u{b70}', IdentifierType::Not_XID), ('\u{b71}', '\u{b71}', + IdentifierType::Recommended), ('\u{b72}', '\u{b77}', IdentifierType::Not_XID), ('\u{b82}', + '\u{b83}', IdentifierType::Recommended), ('\u{b85}', '\u{b8a}', + IdentifierType::Recommended), ('\u{b8e}', '\u{b90}', IdentifierType::Recommended), + ('\u{b92}', '\u{b95}', IdentifierType::Recommended), ('\u{b99}', '\u{b9a}', + IdentifierType::Recommended), ('\u{b9c}', '\u{b9c}', IdentifierType::Recommended), + ('\u{b9e}', '\u{b9f}', IdentifierType::Recommended), ('\u{ba3}', '\u{ba4}', + IdentifierType::Recommended), ('\u{ba8}', '\u{baa}', IdentifierType::Recommended), + ('\u{bae}', '\u{bb5}', IdentifierType::Recommended), ('\u{bb6}', '\u{bb6}', + IdentifierType::Recommended), ('\u{bb7}', '\u{bb9}', IdentifierType::Recommended), + ('\u{bbe}', '\u{bc2}', IdentifierType::Recommended), ('\u{bc6}', '\u{bc8}', + IdentifierType::Recommended), ('\u{bca}', '\u{bcd}', IdentifierType::Recommended), + ('\u{bd0}', '\u{bd0}', IdentifierType::Recommended), ('\u{bd7}', '\u{bd7}', + IdentifierType::Recommended), ('\u{be6}', '\u{be6}', IdentifierType::Recommended), + ('\u{be7}', '\u{bef}', IdentifierType::Recommended), ('\u{bf0}', '\u{bf2}', + IdentifierType::Not_XID), ('\u{bf3}', '\u{bfa}', IdentifierType::Not_XID), ('\u{c00}', + '\u{c00}', IdentifierType::Obsolete), ('\u{c01}', '\u{c03}', IdentifierType::Recommended), + ('\u{c04}', '\u{c04}', IdentifierType::Recommended), ('\u{c05}', '\u{c0c}', + IdentifierType::Recommended), ('\u{c0e}', '\u{c10}', IdentifierType::Recommended), + ('\u{c12}', '\u{c28}', IdentifierType::Recommended), ('\u{c2a}', '\u{c33}', + IdentifierType::Recommended), ('\u{c34}', '\u{c34}', IdentifierType::Obsolete), + ('\u{c35}', '\u{c39}', IdentifierType::Recommended), ('\u{c3d}', '\u{c3d}', + IdentifierType::Recommended), ('\u{c3e}', '\u{c44}', IdentifierType::Recommended), + ('\u{c46}', '\u{c48}', IdentifierType::Recommended), ('\u{c4a}', '\u{c4d}', + IdentifierType::Recommended), ('\u{c55}', '\u{c56}', IdentifierType::Recommended), + ('\u{c58}', '\u{c59}', IdentifierType::Obsolete), ('\u{c5a}', '\u{c5a}', + IdentifierType::Uncommon_Use), ('\u{c60}', '\u{c61}', IdentifierType::Recommended), + ('\u{c62}', '\u{c63}', IdentifierType::Uncommon_Use), ('\u{c66}', '\u{c6f}', + IdentifierType::Recommended), ('\u{c77}', '\u{c77}', IdentifierType::Not_XID), ('\u{c78}', + '\u{c7f}', IdentifierType::Not_XID), ('\u{c80}', '\u{c80}', IdentifierType::Recommended), + ('\u{c81}', '\u{c81}', IdentifierType::Obsolete), ('\u{c82}', '\u{c83}', + IdentifierType::Recommended), ('\u{c84}', '\u{c84}', IdentifierType::Not_XID), ('\u{c85}', + '\u{c8c}', IdentifierType::Recommended), ('\u{c8e}', '\u{c90}', + IdentifierType::Recommended), ('\u{c92}', '\u{ca8}', IdentifierType::Recommended), + ('\u{caa}', '\u{cb3}', IdentifierType::Recommended), ('\u{cb5}', '\u{cb9}', + IdentifierType::Recommended), ('\u{cbc}', '\u{cbd}', IdentifierType::Recommended), + ('\u{cbe}', '\u{cc4}', IdentifierType::Recommended), ('\u{cc6}', '\u{cc8}', + IdentifierType::Recommended), ('\u{cca}', '\u{ccd}', IdentifierType::Recommended), + ('\u{cd5}', '\u{cd6}', IdentifierType::Recommended), ('\u{cde}', '\u{cde}', + IdentifierType::Obsolete), ('\u{ce0}', '\u{ce1}', IdentifierType::Recommended), + ('\u{ce2}', '\u{ce3}', IdentifierType::Recommended), ('\u{ce6}', '\u{cef}', + IdentifierType::Recommended), ('\u{cf1}', '\u{cf2}', IdentifierType::Recommended), + ('\u{d00}', '\u{d00}', IdentifierType::Recommended), ('\u{d01}', '\u{d01}', + IdentifierType::Obsolete), ('\u{d02}', '\u{d03}', IdentifierType::Recommended), + ('\u{d05}', '\u{d0c}', IdentifierType::Recommended), ('\u{d0e}', '\u{d10}', + IdentifierType::Recommended), ('\u{d12}', '\u{d28}', IdentifierType::Recommended), + ('\u{d29}', '\u{d29}', IdentifierType::Recommended), ('\u{d2a}', '\u{d39}', + IdentifierType::Recommended), ('\u{d3a}', '\u{d3a}', IdentifierType::Recommended), + ('\u{d3b}', '\u{d3c}', IdentifierType::Recommended), ('\u{d3d}', '\u{d3d}', + IdentifierType::Recommended), ('\u{d3e}', '\u{d43}', IdentifierType::Recommended), + ('\u{d44}', '\u{d44}', IdentifierType::Uncommon_Use), ('\u{d46}', '\u{d48}', + IdentifierType::Recommended), ('\u{d4a}', '\u{d4d}', IdentifierType::Recommended), + ('\u{d4e}', '\u{d4e}', IdentifierType::Recommended), ('\u{d4f}', '\u{d4f}', + IdentifierType::Not_XID), ('\u{d54}', '\u{d56}', IdentifierType::Recommended), ('\u{d57}', + '\u{d57}', IdentifierType::Recommended), ('\u{d58}', '\u{d5e}', IdentifierType::Not_XID), + ('\u{d5f}', '\u{d5f}', IdentifierType::Obsolete), ('\u{d60}', '\u{d61}', + IdentifierType::Recommended), ('\u{d62}', '\u{d63}', IdentifierType::Uncommon_Use), + ('\u{d66}', '\u{d6f}', IdentifierType::Recommended), ('\u{d70}', '\u{d75}', + IdentifierType::Not_XID), ('\u{d76}', '\u{d78}', IdentifierType::Not_XID), ('\u{d79}', + '\u{d79}', IdentifierType::Not_XID), ('\u{d7a}', '\u{d7f}', IdentifierType::Recommended), + ('\u{d82}', '\u{d83}', IdentifierType::Recommended), ('\u{d85}', '\u{d8e}', + IdentifierType::Recommended), ('\u{d8f}', '\u{d90}', IdentifierType::Uncommon_Use), + ('\u{d91}', '\u{d96}', IdentifierType::Recommended), ('\u{d9a}', '\u{da5}', + IdentifierType::Recommended), ('\u{da6}', '\u{da6}', IdentifierType::Uncommon_Use), + ('\u{da7}', '\u{db1}', IdentifierType::Recommended), ('\u{db3}', '\u{dbb}', + IdentifierType::Recommended), ('\u{dbd}', '\u{dbd}', IdentifierType::Recommended), + ('\u{dc0}', '\u{dc6}', IdentifierType::Recommended), ('\u{dca}', '\u{dca}', + IdentifierType::Recommended), ('\u{dcf}', '\u{dd4}', IdentifierType::Recommended), + ('\u{dd6}', '\u{dd6}', IdentifierType::Recommended), ('\u{dd8}', '\u{dde}', + IdentifierType::Recommended), ('\u{ddf}', '\u{ddf}', IdentifierType::Uncommon_Use), + ('\u{de6}', '\u{def}', IdentifierType::Obsolete), ('\u{df2}', '\u{df2}', + IdentifierType::Recommended), ('\u{df3}', '\u{df3}', IdentifierType::Uncommon_Use), + ('\u{df4}', '\u{df4}', IdentifierType::Not_XID), ('\u{e01}', '\u{e32}', + IdentifierType::Recommended), ('\u{e33}', '\u{e33}', IdentifierType::Not_NFKC), + ('\u{e34}', '\u{e3a}', IdentifierType::Recommended), ('\u{e3f}', '\u{e3f}', + IdentifierType::Not_XID), ('\u{e40}', '\u{e4e}', IdentifierType::Recommended), ('\u{e4f}', + '\u{e4f}', IdentifierType::Not_XID), ('\u{e50}', '\u{e59}', IdentifierType::Recommended), + ('\u{e5a}', '\u{e5b}', IdentifierType::Not_XID), ('\u{e81}', '\u{e82}', + IdentifierType::Recommended), ('\u{e84}', '\u{e84}', IdentifierType::Recommended), + ('\u{e86}', '\u{e86}', IdentifierType::Recommended), ('\u{e87}', '\u{e88}', + IdentifierType::Recommended), ('\u{e89}', '\u{e89}', IdentifierType::Recommended), + ('\u{e8a}', '\u{e8a}', IdentifierType::Recommended), ('\u{e8c}', '\u{e8c}', + IdentifierType::Recommended), ('\u{e8d}', '\u{e8d}', IdentifierType::Recommended), + ('\u{e8e}', '\u{e93}', IdentifierType::Recommended), ('\u{e94}', '\u{e97}', + IdentifierType::Recommended), ('\u{e98}', '\u{e98}', IdentifierType::Recommended), + ('\u{e99}', '\u{e9f}', IdentifierType::Recommended), ('\u{ea0}', '\u{ea0}', + IdentifierType::Recommended), ('\u{ea1}', '\u{ea3}', IdentifierType::Recommended), + ('\u{ea5}', '\u{ea5}', IdentifierType::Recommended), ('\u{ea7}', '\u{ea7}', + IdentifierType::Recommended), ('\u{ea8}', '\u{ea9}', IdentifierType::Recommended), + ('\u{eaa}', '\u{eab}', IdentifierType::Recommended), ('\u{eac}', '\u{eac}', + IdentifierType::Recommended), ('\u{ead}', '\u{eb2}', IdentifierType::Recommended), + ('\u{eb3}', '\u{eb3}', IdentifierType::Not_NFKC), ('\u{eb4}', '\u{eb9}', + IdentifierType::Recommended), ('\u{eba}', '\u{eba}', IdentifierType::Recommended), + ('\u{ebb}', '\u{ebd}', IdentifierType::Recommended), ('\u{ec0}', '\u{ec4}', + IdentifierType::Recommended), ('\u{ec6}', '\u{ec6}', IdentifierType::Recommended), + ('\u{ec8}', '\u{ecd}', IdentifierType::Recommended), ('\u{ed0}', '\u{ed9}', + IdentifierType::Recommended), ('\u{edc}', '\u{edd}', IdentifierType::Not_NFKC), + ('\u{ede}', '\u{edf}', IdentifierType::Recommended), ('\u{f00}', '\u{f00}', + IdentifierType::Recommended), ('\u{f01}', '\u{f0a}', IdentifierType::Not_XID), ('\u{f0b}', + '\u{f0b}', IdentifierType::Inclusion), ('\u{f0c}', '\u{f0c}', IdentifierType::Not_XID), + ('\u{f0d}', '\u{f17}', IdentifierType::Not_XID), ('\u{f18}', '\u{f19}', + IdentifierType::Technical), ('\u{f1a}', '\u{f1f}', IdentifierType::Not_XID), ('\u{f20}', + '\u{f29}', IdentifierType::Recommended), ('\u{f2a}', '\u{f34}', IdentifierType::Not_XID), + ('\u{f35}', '\u{f35}', IdentifierType::Recommended), ('\u{f36}', '\u{f36}', + IdentifierType::Not_XID), ('\u{f37}', '\u{f37}', IdentifierType::Recommended), ('\u{f38}', + '\u{f38}', IdentifierType::Not_XID), ('\u{f39}', '\u{f39}', IdentifierType::Uncommon_Use), + ('\u{f3a}', '\u{f3d}', IdentifierType::Not_XID), ('\u{f3e}', '\u{f42}', + IdentifierType::Recommended), ('\u{f43}', '\u{f43}', IdentifierType::Not_NFKC), + ('\u{f44}', '\u{f47}', IdentifierType::Recommended), ('\u{f49}', '\u{f4c}', + IdentifierType::Recommended), ('\u{f4d}', '\u{f4d}', IdentifierType::Not_NFKC), + ('\u{f4e}', '\u{f51}', IdentifierType::Recommended), ('\u{f52}', '\u{f52}', + IdentifierType::Not_NFKC), ('\u{f53}', '\u{f56}', IdentifierType::Recommended), + ('\u{f57}', '\u{f57}', IdentifierType::Not_NFKC), ('\u{f58}', '\u{f5b}', + IdentifierType::Recommended), ('\u{f5c}', '\u{f5c}', IdentifierType::Not_NFKC), + ('\u{f5d}', '\u{f68}', IdentifierType::Recommended), ('\u{f69}', '\u{f69}', + IdentifierType::Not_NFKC), ('\u{f6a}', '\u{f6a}', IdentifierType::Recommended), + ('\u{f6b}', '\u{f6c}', IdentifierType::Recommended), ('\u{f71}', '\u{f72}', + IdentifierType::Recommended), ('\u{f73}', '\u{f73}', IdentifierType::Obsolete), + ('\u{f74}', '\u{f74}', IdentifierType::Recommended), ('\u{f75}', '\u{f75}', + IdentifierType::Obsolete), ('\u{f76}', '\u{f76}', IdentifierType::Not_NFKC), ('\u{f77}', + '\u{f77}', IdentifierType::Obsolete), ('\u{f78}', '\u{f78}', IdentifierType::Not_NFKC), + ('\u{f79}', '\u{f79}', IdentifierType::Obsolete), ('\u{f7a}', '\u{f80}', + IdentifierType::Recommended), ('\u{f81}', '\u{f81}', IdentifierType::Obsolete), + ('\u{f82}', '\u{f84}', IdentifierType::Recommended), ('\u{f85}', '\u{f85}', + IdentifierType::Not_XID), ('\u{f86}', '\u{f8b}', IdentifierType::Recommended), ('\u{f8c}', + '\u{f8f}', IdentifierType::Recommended), ('\u{f90}', '\u{f92}', + IdentifierType::Recommended), ('\u{f93}', '\u{f93}', IdentifierType::Not_NFKC), + ('\u{f94}', '\u{f95}', IdentifierType::Recommended), ('\u{f96}', '\u{f96}', + IdentifierType::Recommended), ('\u{f97}', '\u{f97}', IdentifierType::Recommended), + ('\u{f99}', '\u{f9c}', IdentifierType::Recommended), ('\u{f9d}', '\u{f9d}', + IdentifierType::Not_NFKC), ('\u{f9e}', '\u{fa1}', IdentifierType::Recommended), + ('\u{fa2}', '\u{fa2}', IdentifierType::Not_NFKC), ('\u{fa3}', '\u{fa6}', + IdentifierType::Recommended), ('\u{fa7}', '\u{fa7}', IdentifierType::Not_NFKC), + ('\u{fa8}', '\u{fab}', IdentifierType::Recommended), ('\u{fac}', '\u{fac}', + IdentifierType::Not_NFKC), ('\u{fad}', '\u{fad}', IdentifierType::Recommended), + ('\u{fae}', '\u{fb0}', IdentifierType::Recommended), ('\u{fb1}', '\u{fb7}', + IdentifierType::Recommended), ('\u{fb8}', '\u{fb8}', IdentifierType::Recommended), + ('\u{fb9}', '\u{fb9}', IdentifierType::Not_NFKC), ('\u{fba}', '\u{fbc}', + IdentifierType::Recommended), ('\u{fbe}', '\u{fc5}', IdentifierType::Not_XID), ('\u{fc6}', + '\u{fc6}', IdentifierType::Recommended), ('\u{fc7}', '\u{fcc}', IdentifierType::Not_XID), + ('\u{fce}', '\u{fce}', IdentifierType::Not_XID), ('\u{fcf}', '\u{fcf}', + IdentifierType::Not_XID), ('\u{fd0}', '\u{fd1}', IdentifierType::Not_XID), ('\u{fd2}', + '\u{fd4}', IdentifierType::Not_XID), ('\u{fd5}', '\u{fd8}', IdentifierType::Not_XID), + ('\u{fd9}', '\u{fda}', IdentifierType::Not_XID), ('\u{1000}', '\u{1021}', + IdentifierType::Recommended), ('\u{1022}', '\u{1022}', IdentifierType::Recommended), + ('\u{1023}', '\u{1027}', IdentifierType::Recommended), ('\u{1028}', '\u{1028}', + IdentifierType::Recommended), ('\u{1029}', '\u{102a}', IdentifierType::Recommended), + ('\u{102b}', '\u{102b}', IdentifierType::Recommended), ('\u{102c}', '\u{1032}', + IdentifierType::Recommended), ('\u{1033}', '\u{1035}', IdentifierType::Recommended), + ('\u{1036}', '\u{1039}', IdentifierType::Recommended), ('\u{103a}', '\u{103f}', + IdentifierType::Recommended), ('\u{1040}', '\u{1049}', IdentifierType::Recommended), + ('\u{104a}', '\u{104f}', IdentifierType::Not_XID), ('\u{1050}', '\u{1059}', + IdentifierType::Recommended), ('\u{105a}', '\u{1099}', IdentifierType::Recommended), + ('\u{109a}', '\u{109d}', IdentifierType::Recommended), ('\u{109e}', '\u{109f}', + IdentifierType::Not_XID), ('\u{10a0}', '\u{10c5}', IdentifierType::Obsolete), ('\u{10c7}', + '\u{10c7}', IdentifierType::Recommended), ('\u{10cd}', '\u{10cd}', + IdentifierType::Recommended), ('\u{10d0}', '\u{10f0}', IdentifierType::Recommended), + ('\u{10f1}', '\u{10f6}', IdentifierType::Obsolete), ('\u{10f7}', '\u{10f8}', + IdentifierType::Recommended), ('\u{10f9}', '\u{10fa}', IdentifierType::Recommended), + ('\u{10fb}', '\u{10fb}', IdentifierType::Not_XID), ('\u{10fc}', '\u{10fc}', + IdentifierType::Not_NFKC), ('\u{10fd}', '\u{10ff}', IdentifierType::Recommended), + ('\u{1100}', '\u{1159}', IdentifierType::Obsolete), ('\u{115a}', '\u{115e}', + IdentifierType::Obsolete), ('\u{115f}', '\u{1160}', IdentifierType::Exclusion), + ('\u{1161}', '\u{11a2}', IdentifierType::Obsolete), ('\u{11a3}', '\u{11a7}', + IdentifierType::Obsolete), ('\u{11a8}', '\u{11f9}', IdentifierType::Obsolete), + ('\u{11fa}', '\u{11ff}', IdentifierType::Obsolete), ('\u{1200}', '\u{1206}', + IdentifierType::Recommended), ('\u{1207}', '\u{1207}', IdentifierType::Recommended), + ('\u{1208}', '\u{1246}', IdentifierType::Recommended), ('\u{1247}', '\u{1247}', + IdentifierType::Recommended), ('\u{1248}', '\u{1248}', IdentifierType::Recommended), + ('\u{124a}', '\u{124d}', IdentifierType::Recommended), ('\u{1250}', '\u{1256}', + IdentifierType::Recommended), ('\u{1258}', '\u{1258}', IdentifierType::Recommended), + ('\u{125a}', '\u{125d}', IdentifierType::Recommended), ('\u{1260}', '\u{1286}', + IdentifierType::Recommended), ('\u{1287}', '\u{1287}', IdentifierType::Recommended), + ('\u{1288}', '\u{1288}', IdentifierType::Recommended), ('\u{128a}', '\u{128d}', + IdentifierType::Recommended), ('\u{1290}', '\u{12ae}', IdentifierType::Recommended), + ('\u{12af}', '\u{12af}', IdentifierType::Recommended), ('\u{12b0}', '\u{12b0}', + IdentifierType::Recommended), ('\u{12b2}', '\u{12b5}', IdentifierType::Recommended), + ('\u{12b8}', '\u{12be}', IdentifierType::Recommended), ('\u{12c0}', '\u{12c0}', + IdentifierType::Recommended), ('\u{12c2}', '\u{12c5}', IdentifierType::Recommended), + ('\u{12c8}', '\u{12ce}', IdentifierType::Recommended), ('\u{12cf}', '\u{12cf}', + IdentifierType::Recommended), ('\u{12d0}', '\u{12d6}', IdentifierType::Recommended), + ('\u{12d8}', '\u{12ee}', IdentifierType::Recommended), ('\u{12ef}', '\u{12ef}', + IdentifierType::Recommended), ('\u{12f0}', '\u{130e}', IdentifierType::Recommended), + ('\u{130f}', '\u{130f}', IdentifierType::Recommended), ('\u{1310}', '\u{1310}', + IdentifierType::Recommended), ('\u{1312}', '\u{1315}', IdentifierType::Recommended), + ('\u{1318}', '\u{131e}', IdentifierType::Recommended), ('\u{131f}', '\u{131f}', + IdentifierType::Recommended), ('\u{1320}', '\u{1346}', IdentifierType::Recommended), + ('\u{1347}', '\u{1347}', IdentifierType::Recommended), ('\u{1348}', '\u{135a}', + IdentifierType::Recommended), ('\u{135d}', '\u{135e}', IdentifierType::Recommended), + ('\u{135f}', '\u{135f}', IdentifierType::Recommended), ('\u{1360}', '\u{1360}', + IdentifierType::Not_XID), ('\u{1361}', '\u{1368}', IdentifierType::Not_XID), ('\u{1369}', + '\u{1371}', IdentifierType::Obsolete), ('\u{1372}', '\u{137c}', IdentifierType::Not_XID), + ('\u{1380}', '\u{138f}', IdentifierType::Recommended), ('\u{1390}', '\u{1399}', + IdentifierType::Not_XID), ('\u{13a0}', '\u{13f4}', IdentifierType::Limited_Use), + ('\u{13f5}', '\u{13f5}', IdentifierType::Limited_Use), ('\u{13f8}', '\u{13fd}', + IdentifierType::Limited_Use), ('\u{1400}', '\u{1400}', IdentifierType::Limited_Use), + ('\u{1401}', '\u{166c}', IdentifierType::Limited_Use), ('\u{166d}', '\u{166e}', + IdentifierType::Limited_Use), ('\u{166f}', '\u{1676}', IdentifierType::Limited_Use), + ('\u{1677}', '\u{167f}', IdentifierType::Limited_Use), ('\u{1680}', '\u{1680}', + IdentifierType::Exclusion), ('\u{1681}', '\u{169a}', IdentifierType::Exclusion), + ('\u{169b}', '\u{169c}', IdentifierType::Exclusion), ('\u{16a0}', '\u{16ea}', + IdentifierType::Exclusion), ('\u{16eb}', '\u{16ed}', IdentifierType::Not_XID), + ('\u{16ee}', '\u{16f0}', IdentifierType::Exclusion), ('\u{16f1}', '\u{16f8}', + IdentifierType::Exclusion), ('\u{1700}', '\u{170c}', IdentifierType::Exclusion), + ('\u{170e}', '\u{1714}', IdentifierType::Exclusion), ('\u{1720}', '\u{1734}', + IdentifierType::Exclusion), ('\u{1735}', '\u{1736}', IdentifierType::Exclusion), + ('\u{1740}', '\u{1753}', IdentifierType::Exclusion), ('\u{1760}', '\u{176c}', + IdentifierType::Exclusion), ('\u{176e}', '\u{1770}', IdentifierType::Exclusion), + ('\u{1772}', '\u{1773}', IdentifierType::Exclusion), ('\u{1780}', '\u{17a2}', + IdentifierType::Recommended), ('\u{17a3}', '\u{17a4}', IdentifierType::Obsolete), + ('\u{17a5}', '\u{17a7}', IdentifierType::Recommended), ('\u{17a8}', '\u{17a8}', + IdentifierType::Obsolete), ('\u{17a9}', '\u{17b3}', IdentifierType::Recommended), + ('\u{17b4}', '\u{17b5}', IdentifierType::Exclusion), ('\u{17b6}', '\u{17ca}', + IdentifierType::Recommended), ('\u{17cb}', '\u{17d0}', IdentifierType::Technical), + ('\u{17d1}', '\u{17d1}', IdentifierType::Technical), ('\u{17d2}', '\u{17d2}', + IdentifierType::Recommended), ('\u{17d3}', '\u{17d3}', IdentifierType::Obsolete), + ('\u{17d4}', '\u{17d6}', IdentifierType::Not_XID), ('\u{17d7}', '\u{17d7}', + IdentifierType::Recommended), ('\u{17d8}', '\u{17d8}', IdentifierType::Obsolete), + ('\u{17d9}', '\u{17db}', IdentifierType::Not_XID), ('\u{17dc}', '\u{17dc}', + IdentifierType::Recommended), ('\u{17dd}', '\u{17dd}', IdentifierType::Technical), + ('\u{17e0}', '\u{17e9}', IdentifierType::Recommended), ('\u{17f0}', '\u{17f9}', + IdentifierType::Not_XID), ('\u{1800}', '\u{1801}', IdentifierType::Limited_Use), + ('\u{1802}', '\u{1803}', IdentifierType::Exclusion), ('\u{1804}', '\u{1804}', + IdentifierType::Limited_Use), ('\u{1805}', '\u{1805}', IdentifierType::Exclusion), + ('\u{1806}', '\u{180a}', IdentifierType::Limited_Use), ('\u{180b}', '\u{180d}', + IdentifierType::Limited_Use), ('\u{180e}', '\u{180e}', IdentifierType::Limited_Use), + ('\u{1810}', '\u{1819}', IdentifierType::Limited_Use), ('\u{1820}', '\u{1877}', + IdentifierType::Limited_Use), ('\u{1878}', '\u{1878}', IdentifierType::Limited_Use), + ('\u{1880}', '\u{18a8}', IdentifierType::Limited_Use), ('\u{18a9}', '\u{18a9}', + IdentifierType::Limited_Use), ('\u{18aa}', '\u{18aa}', IdentifierType::Limited_Use), + ('\u{18b0}', '\u{18f5}', IdentifierType::Limited_Use), ('\u{1900}', '\u{191c}', + IdentifierType::Limited_Use), ('\u{191d}', '\u{191e}', IdentifierType::Limited_Use), + ('\u{1920}', '\u{192b}', IdentifierType::Limited_Use), ('\u{1930}', '\u{193b}', + IdentifierType::Limited_Use), ('\u{1940}', '\u{1940}', IdentifierType::Limited_Use), + ('\u{1944}', '\u{1945}', IdentifierType::Limited_Use), ('\u{1946}', '\u{196d}', + IdentifierType::Limited_Use), ('\u{1970}', '\u{1974}', IdentifierType::Limited_Use), + ('\u{1980}', '\u{19a9}', IdentifierType::Limited_Use), ('\u{19aa}', '\u{19ab}', + IdentifierType::Limited_Use), ('\u{19b0}', '\u{19c9}', IdentifierType::Limited_Use), + ('\u{19d0}', '\u{19d9}', IdentifierType::Limited_Use), ('\u{19da}', '\u{19da}', + IdentifierType::Limited_Use), ('\u{19de}', '\u{19df}', IdentifierType::Limited_Use), + ('\u{19e0}', '\u{19ff}', IdentifierType::Not_XID), ('\u{1a00}', '\u{1a1b}', + IdentifierType::Exclusion), ('\u{1a1e}', '\u{1a1f}', IdentifierType::Exclusion), + ('\u{1a20}', '\u{1a5e}', IdentifierType::Limited_Use), ('\u{1a60}', '\u{1a7c}', + IdentifierType::Limited_Use), ('\u{1a7f}', '\u{1a89}', IdentifierType::Limited_Use), + ('\u{1a90}', '\u{1a99}', IdentifierType::Limited_Use), ('\u{1aa0}', '\u{1aa6}', + IdentifierType::Limited_Use), ('\u{1aa7}', '\u{1aa7}', IdentifierType::Limited_Use), + ('\u{1aa8}', '\u{1aad}', IdentifierType::Limited_Use), ('\u{1ab0}', '\u{1abd}', + IdentifierType::Obsolete), ('\u{1abe}', '\u{1abe}', IdentifierType::Not_XID), ('\u{1b00}', + '\u{1b4b}', IdentifierType::Limited_Use), ('\u{1b50}', '\u{1b59}', + IdentifierType::Limited_Use), ('\u{1b5a}', '\u{1b6a}', IdentifierType::Limited_Use), + ('\u{1b6b}', '\u{1b73}', IdentifierType::Limited_Use), ('\u{1b74}', '\u{1b7c}', + IdentifierType::Limited_Use), ('\u{1b80}', '\u{1baa}', IdentifierType::Limited_Use), + ('\u{1bab}', '\u{1bad}', IdentifierType::Limited_Use), ('\u{1bae}', '\u{1bb9}', + IdentifierType::Limited_Use), ('\u{1bba}', '\u{1bbf}', IdentifierType::Limited_Use), + ('\u{1bc0}', '\u{1bf3}', IdentifierType::Limited_Use), ('\u{1bfc}', '\u{1bff}', + IdentifierType::Limited_Use), ('\u{1c00}', '\u{1c37}', IdentifierType::Limited_Use), + ('\u{1c3b}', '\u{1c3f}', IdentifierType::Limited_Use), ('\u{1c40}', '\u{1c49}', + IdentifierType::Limited_Use), ('\u{1c4d}', '\u{1c7d}', IdentifierType::Limited_Use), + ('\u{1c7e}', '\u{1c7f}', IdentifierType::Limited_Use), ('\u{1c80}', '\u{1c88}', + IdentifierType::Recommended), ('\u{1c90}', '\u{1cba}', IdentifierType::Recommended), + ('\u{1cbd}', '\u{1cbf}', IdentifierType::Recommended), ('\u{1cc0}', '\u{1cc7}', + IdentifierType::Limited_Use), ('\u{1cd0}', '\u{1cd2}', IdentifierType::Obsolete), + ('\u{1cd3}', '\u{1cd3}', IdentifierType::Obsolete), ('\u{1cd4}', '\u{1cf2}', + IdentifierType::Obsolete), ('\u{1cf3}', '\u{1cf6}', IdentifierType::Obsolete), + ('\u{1cf7}', '\u{1cf7}', IdentifierType::Obsolete), ('\u{1cf8}', '\u{1cf9}', + IdentifierType::Obsolete), ('\u{1cfa}', '\u{1cfa}', IdentifierType::Exclusion), + ('\u{1d00}', '\u{1d2b}', IdentifierType::Technical), ('\u{1d2c}', '\u{1d2e}', + IdentifierType::Technical), ('\u{1d2f}', '\u{1d2f}', IdentifierType::Technical), + ('\u{1d30}', '\u{1d3a}', IdentifierType::Technical), ('\u{1d3b}', '\u{1d3b}', + IdentifierType::Technical), ('\u{1d3c}', '\u{1d4d}', IdentifierType::Technical), + ('\u{1d4e}', '\u{1d4e}', IdentifierType::Technical), ('\u{1d4f}', '\u{1d6a}', + IdentifierType::Technical), ('\u{1d6b}', '\u{1d6b}', IdentifierType::Technical), + ('\u{1d6c}', '\u{1d77}', IdentifierType::Technical), ('\u{1d78}', '\u{1d78}', + IdentifierType::Technical), ('\u{1d79}', '\u{1d9a}', IdentifierType::Technical), + ('\u{1d9b}', '\u{1dbf}', IdentifierType::Technical), ('\u{1dc0}', '\u{1dc3}', + IdentifierType::Technical), ('\u{1dc4}', '\u{1dca}', IdentifierType::Technical), + ('\u{1dcb}', '\u{1dcd}', IdentifierType::Technical), ('\u{1dce}', '\u{1dce}', + IdentifierType::Technical), ('\u{1dcf}', '\u{1dd0}', IdentifierType::Technical), + ('\u{1dd1}', '\u{1de6}', IdentifierType::Technical), ('\u{1de7}', '\u{1df5}', + IdentifierType::Technical), ('\u{1df6}', '\u{1df9}', IdentifierType::Technical), + ('\u{1dfb}', '\u{1dfb}', IdentifierType::Technical), ('\u{1dfc}', '\u{1dfc}', + IdentifierType::Technical), ('\u{1dfd}', '\u{1dfd}', IdentifierType::Technical), + ('\u{1dfe}', '\u{1dff}', IdentifierType::Technical), ('\u{1e00}', '\u{1e99}', + IdentifierType::Recommended), ('\u{1e9a}', '\u{1e9a}', IdentifierType::Not_NFKC), + ('\u{1e9b}', '\u{1e9b}', IdentifierType::Not_NFKC), ('\u{1e9c}', '\u{1e9d}', + IdentifierType::Technical), ('\u{1e9e}', '\u{1e9e}', IdentifierType::Recommended), + ('\u{1e9f}', '\u{1e9f}', IdentifierType::Technical), ('\u{1ea0}', '\u{1ef9}', + IdentifierType::Recommended), ('\u{1efa}', '\u{1eff}', IdentifierType::Technical), + ('\u{1f00}', '\u{1f15}', IdentifierType::Recommended), ('\u{1f18}', '\u{1f1d}', + IdentifierType::Recommended), ('\u{1f20}', '\u{1f45}', IdentifierType::Recommended), + ('\u{1f48}', '\u{1f4d}', IdentifierType::Recommended), ('\u{1f50}', '\u{1f57}', + IdentifierType::Recommended), ('\u{1f59}', '\u{1f59}', IdentifierType::Recommended), + ('\u{1f5b}', '\u{1f5b}', IdentifierType::Recommended), ('\u{1f5d}', '\u{1f5d}', + IdentifierType::Recommended), ('\u{1f5f}', '\u{1f70}', IdentifierType::Recommended), + ('\u{1f71}', '\u{1f71}', IdentifierType::Not_NFKC), ('\u{1f72}', '\u{1f72}', + IdentifierType::Recommended), ('\u{1f73}', '\u{1f73}', IdentifierType::Not_NFKC), + ('\u{1f74}', '\u{1f74}', IdentifierType::Recommended), ('\u{1f75}', '\u{1f75}', + IdentifierType::Not_NFKC), ('\u{1f76}', '\u{1f76}', IdentifierType::Recommended), + ('\u{1f77}', '\u{1f77}', IdentifierType::Not_NFKC), ('\u{1f78}', '\u{1f78}', + IdentifierType::Recommended), ('\u{1f79}', '\u{1f79}', IdentifierType::Not_NFKC), + ('\u{1f7a}', '\u{1f7a}', IdentifierType::Recommended), ('\u{1f7b}', '\u{1f7b}', + IdentifierType::Not_NFKC), ('\u{1f7c}', '\u{1f7c}', IdentifierType::Recommended), + ('\u{1f7d}', '\u{1f7d}', IdentifierType::Not_NFKC), ('\u{1f80}', '\u{1fb4}', + IdentifierType::Recommended), ('\u{1fb6}', '\u{1fba}', IdentifierType::Recommended), + ('\u{1fbb}', '\u{1fbb}', IdentifierType::Not_NFKC), ('\u{1fbc}', '\u{1fbc}', + IdentifierType::Recommended), ('\u{1fbd}', '\u{1fbd}', IdentifierType::Not_XID), + ('\u{1fbe}', '\u{1fbe}', IdentifierType::Not_NFKC), ('\u{1fbf}', '\u{1fc1}', + IdentifierType::Not_XID), ('\u{1fc2}', '\u{1fc4}', IdentifierType::Recommended), + ('\u{1fc6}', '\u{1fc8}', IdentifierType::Recommended), ('\u{1fc9}', '\u{1fc9}', + IdentifierType::Not_NFKC), ('\u{1fca}', '\u{1fca}', IdentifierType::Recommended), + ('\u{1fcb}', '\u{1fcb}', IdentifierType::Not_NFKC), ('\u{1fcc}', '\u{1fcc}', + IdentifierType::Recommended), ('\u{1fcd}', '\u{1fcf}', IdentifierType::Not_XID), + ('\u{1fd0}', '\u{1fd2}', IdentifierType::Recommended), ('\u{1fd3}', '\u{1fd3}', + IdentifierType::Not_NFKC), ('\u{1fd6}', '\u{1fda}', IdentifierType::Recommended), + ('\u{1fdb}', '\u{1fdb}', IdentifierType::Not_NFKC), ('\u{1fdd}', '\u{1fdf}', + IdentifierType::Not_XID), ('\u{1fe0}', '\u{1fe2}', IdentifierType::Recommended), + ('\u{1fe3}', '\u{1fe3}', IdentifierType::Not_NFKC), ('\u{1fe4}', '\u{1fea}', + IdentifierType::Recommended), ('\u{1feb}', '\u{1feb}', IdentifierType::Not_NFKC), + ('\u{1fec}', '\u{1fec}', IdentifierType::Recommended), ('\u{1fed}', '\u{1fef}', + IdentifierType::Not_XID), ('\u{1ff2}', '\u{1ff4}', IdentifierType::Recommended), + ('\u{1ff6}', '\u{1ff8}', IdentifierType::Recommended), ('\u{1ff9}', '\u{1ff9}', + IdentifierType::Not_NFKC), ('\u{1ffa}', '\u{1ffa}', IdentifierType::Recommended), + ('\u{1ffb}', '\u{1ffb}', IdentifierType::Not_NFKC), ('\u{1ffc}', '\u{1ffc}', + IdentifierType::Recommended), ('\u{1ffd}', '\u{1ffe}', IdentifierType::Not_XID), + ('\u{2000}', '\u{200a}', IdentifierType::Not_XID), ('\u{200b}', '\u{200b}', + IdentifierType::Exclusion), ('\u{200c}', '\u{200d}', IdentifierType::Inclusion), + ('\u{200e}', '\u{200f}', IdentifierType::Exclusion), ('\u{2010}', '\u{2010}', + IdentifierType::Inclusion), ('\u{2011}', '\u{2011}', IdentifierType::Not_XID), + ('\u{2012}', '\u{2016}', IdentifierType::Not_XID), ('\u{2017}', '\u{2017}', + IdentifierType::Not_XID), ('\u{2018}', '\u{2018}', IdentifierType::Not_XID), ('\u{2019}', + '\u{2019}', IdentifierType::Inclusion), ('\u{201a}', '\u{2023}', IdentifierType::Not_XID), + ('\u{2024}', '\u{2026}', IdentifierType::Not_XID), ('\u{2027}', '\u{2027}', + IdentifierType::Inclusion), ('\u{2028}', '\u{2029}', IdentifierType::Not_XID), + ('\u{202a}', '\u{202e}', IdentifierType::Exclusion), ('\u{202f}', '\u{202f}', + IdentifierType::Not_XID), ('\u{2030}', '\u{2032}', IdentifierType::Not_XID), ('\u{2033}', + '\u{2034}', IdentifierType::Not_XID), ('\u{2035}', '\u{2035}', IdentifierType::Not_XID), + ('\u{2036}', '\u{2037}', IdentifierType::Not_XID), ('\u{2038}', '\u{203b}', + IdentifierType::Not_XID), ('\u{203c}', '\u{203c}', IdentifierType::Not_XID), ('\u{203d}', + '\u{203d}', IdentifierType::Not_XID), ('\u{203e}', '\u{203e}', IdentifierType::Not_XID), + ('\u{203f}', '\u{2040}', IdentifierType::Technical), ('\u{2041}', '\u{2046}', + IdentifierType::Not_XID), ('\u{2047}', '\u{2047}', IdentifierType::Not_XID), ('\u{2048}', + '\u{2049}', IdentifierType::Not_XID), ('\u{204a}', '\u{204d}', IdentifierType::Not_XID), + ('\u{204e}', '\u{2052}', IdentifierType::Not_XID), ('\u{2053}', '\u{2053}', + IdentifierType::Not_XID), ('\u{2054}', '\u{2054}', IdentifierType::Uncommon_Use), + ('\u{2055}', '\u{2055}', IdentifierType::Not_XID), ('\u{2056}', '\u{2056}', + IdentifierType::Obsolete), ('\u{2057}', '\u{2057}', IdentifierType::Not_XID), ('\u{2058}', + '\u{205e}', IdentifierType::Obsolete), ('\u{205f}', '\u{205f}', IdentifierType::Not_XID), + ('\u{2060}', '\u{2063}', IdentifierType::Exclusion), ('\u{2064}', '\u{2064}', + IdentifierType::Exclusion), ('\u{2066}', '\u{2069}', IdentifierType::Exclusion), + ('\u{206a}', '\u{206f}', IdentifierType::Exclusion), ('\u{2070}', '\u{2070}', + IdentifierType::Not_XID), ('\u{2071}', '\u{2071}', IdentifierType::Not_NFKC), ('\u{2074}', + '\u{207e}', IdentifierType::Not_XID), ('\u{207f}', '\u{207f}', IdentifierType::Not_NFKC), + ('\u{2080}', '\u{208e}', IdentifierType::Not_XID), ('\u{2090}', '\u{2094}', + IdentifierType::Not_NFKC), ('\u{2095}', '\u{209c}', IdentifierType::Not_NFKC), + ('\u{20a0}', '\u{20a7}', IdentifierType::Not_XID), ('\u{20a8}', '\u{20a8}', + IdentifierType::Not_XID), ('\u{20a9}', '\u{20aa}', IdentifierType::Not_XID), ('\u{20ab}', + '\u{20ab}', IdentifierType::Not_XID), ('\u{20ac}', '\u{20ac}', IdentifierType::Not_XID), + ('\u{20ad}', '\u{20af}', IdentifierType::Not_XID), ('\u{20b0}', '\u{20b1}', + IdentifierType::Not_XID), ('\u{20b2}', '\u{20b5}', IdentifierType::Not_XID), ('\u{20b6}', + '\u{20b8}', IdentifierType::Not_XID), ('\u{20b9}', '\u{20b9}', IdentifierType::Not_XID), + ('\u{20ba}', '\u{20ba}', IdentifierType::Not_XID), ('\u{20bb}', '\u{20bd}', + IdentifierType::Not_XID), ('\u{20be}', '\u{20be}', IdentifierType::Not_XID), ('\u{20bf}', + '\u{20bf}', IdentifierType::Not_XID), ('\u{20d0}', '\u{20dc}', IdentifierType::Technical), + ('\u{20dd}', '\u{20dd}', IdentifierType::Exclusion), ('\u{20de}', '\u{20e0}', + IdentifierType::Technical), ('\u{20e1}', '\u{20e1}', IdentifierType::Technical), + ('\u{20e2}', '\u{20e3}', IdentifierType::Technical), ('\u{20e4}', '\u{20e4}', + IdentifierType::Technical), ('\u{20e5}', '\u{20ea}', IdentifierType::Technical), + ('\u{20eb}', '\u{20eb}', IdentifierType::Technical), ('\u{20ec}', '\u{20ef}', + IdentifierType::Technical), ('\u{20f0}', '\u{20f0}', IdentifierType::Exclusion), + ('\u{2100}', '\u{2101}', IdentifierType::Not_XID), ('\u{2102}', '\u{2102}', + IdentifierType::Not_NFKC), ('\u{2103}', '\u{2103}', IdentifierType::Not_XID), ('\u{2104}', + '\u{2104}', IdentifierType::Not_XID), ('\u{2105}', '\u{2106}', IdentifierType::Not_XID), + ('\u{2107}', '\u{2107}', IdentifierType::Not_NFKC), ('\u{2108}', '\u{2108}', + IdentifierType::Not_XID), ('\u{2109}', '\u{2109}', IdentifierType::Not_XID), ('\u{210a}', + '\u{2113}', IdentifierType::Not_NFKC), ('\u{2114}', '\u{2114}', IdentifierType::Not_XID), + ('\u{2115}', '\u{2115}', IdentifierType::Not_NFKC), ('\u{2116}', '\u{2116}', + IdentifierType::Not_XID), ('\u{2117}', '\u{2117}', IdentifierType::Not_XID), ('\u{2118}', + '\u{2118}', IdentifierType::Technical), ('\u{2119}', '\u{211d}', + IdentifierType::Not_NFKC), ('\u{211e}', '\u{211f}', IdentifierType::Not_XID), ('\u{2120}', + '\u{2122}', IdentifierType::Not_XID), ('\u{2123}', '\u{2123}', IdentifierType::Not_XID), + ('\u{2124}', '\u{2124}', IdentifierType::Not_NFKC), ('\u{2125}', '\u{2125}', + IdentifierType::Not_XID), ('\u{2126}', '\u{2126}', IdentifierType::Not_NFKC), ('\u{2127}', + '\u{2127}', IdentifierType::Obsolete), ('\u{2128}', '\u{2128}', IdentifierType::Not_NFKC), + ('\u{2129}', '\u{2129}', IdentifierType::Not_XID), ('\u{212a}', '\u{212d}', + IdentifierType::Not_NFKC), ('\u{212e}', '\u{212e}', IdentifierType::Technical), + ('\u{212f}', '\u{2131}', IdentifierType::Not_NFKC), ('\u{2132}', '\u{2132}', + IdentifierType::Obsolete), ('\u{2133}', '\u{2138}', IdentifierType::Not_NFKC), + ('\u{2139}', '\u{2139}', IdentifierType::Not_NFKC), ('\u{213a}', '\u{213a}', + IdentifierType::Not_XID), ('\u{213b}', '\u{213b}', IdentifierType::Not_XID), ('\u{213c}', + '\u{213c}', IdentifierType::Not_NFKC), ('\u{213d}', '\u{213f}', IdentifierType::Not_NFKC), + ('\u{2140}', '\u{2140}', IdentifierType::Not_XID), ('\u{2141}', '\u{2144}', + IdentifierType::Not_XID), ('\u{2145}', '\u{2149}', IdentifierType::Not_NFKC), ('\u{214a}', + '\u{214b}', IdentifierType::Not_XID), ('\u{214c}', '\u{214c}', IdentifierType::Not_XID), + ('\u{214d}', '\u{214d}', IdentifierType::Not_XID), ('\u{214e}', '\u{214e}', + IdentifierType::Obsolete), ('\u{214f}', '\u{214f}', IdentifierType::Obsolete), + ('\u{2150}', '\u{2152}', IdentifierType::Not_XID), ('\u{2153}', '\u{215f}', + IdentifierType::Not_XID), ('\u{2160}', '\u{217f}', IdentifierType::Not_NFKC), ('\u{2180}', + '\u{2182}', IdentifierType::Technical), ('\u{2183}', '\u{2183}', + IdentifierType::Technical), ('\u{2184}', '\u{2184}', IdentifierType::Obsolete), + ('\u{2185}', '\u{2188}', IdentifierType::Obsolete), ('\u{2189}', '\u{2189}', + IdentifierType::Not_XID), ('\u{218a}', '\u{218b}', IdentifierType::Uncommon_Use), + ('\u{2190}', '\u{21ea}', IdentifierType::Not_XID), ('\u{21eb}', '\u{21f3}', + IdentifierType::Not_XID), ('\u{21f4}', '\u{21ff}', IdentifierType::Not_XID), ('\u{2200}', + '\u{222b}', IdentifierType::Not_XID), ('\u{222c}', '\u{222d}', IdentifierType::Not_XID), + ('\u{222e}', '\u{222e}', IdentifierType::Not_XID), ('\u{222f}', '\u{2230}', + IdentifierType::Not_XID), ('\u{2231}', '\u{22f1}', IdentifierType::Not_XID), ('\u{22f2}', + '\u{22ff}', IdentifierType::Not_XID), ('\u{2300}', '\u{2300}', IdentifierType::Not_XID), + ('\u{2301}', '\u{2301}', IdentifierType::Not_XID), ('\u{2302}', '\u{2328}', + IdentifierType::Not_XID), ('\u{2329}', '\u{232a}', IdentifierType::Obsolete), ('\u{232b}', + '\u{237a}', IdentifierType::Not_XID), ('\u{237b}', '\u{237b}', IdentifierType::Not_XID), + ('\u{237c}', '\u{237c}', IdentifierType::Not_XID), ('\u{237d}', '\u{239a}', + IdentifierType::Not_XID), ('\u{239b}', '\u{23ce}', IdentifierType::Not_XID), ('\u{23cf}', + '\u{23d0}', IdentifierType::Not_XID), ('\u{23d1}', '\u{23db}', IdentifierType::Not_XID), + ('\u{23dc}', '\u{23e7}', IdentifierType::Not_XID), ('\u{23e8}', '\u{23e8}', + IdentifierType::Not_XID), ('\u{23e9}', '\u{23f3}', IdentifierType::Not_XID), ('\u{23f4}', + '\u{23fa}', IdentifierType::Not_XID), ('\u{23fb}', '\u{23fe}', IdentifierType::Not_XID), + ('\u{23ff}', '\u{23ff}', IdentifierType::Not_XID), ('\u{2400}', '\u{2424}', + IdentifierType::Not_XID), ('\u{2425}', '\u{2426}', IdentifierType::Not_XID), ('\u{2440}', + '\u{244a}', IdentifierType::Not_XID), ('\u{2460}', '\u{24ea}', IdentifierType::Technical), + ('\u{24eb}', '\u{24fe}', IdentifierType::Technical), ('\u{24ff}', '\u{24ff}', + IdentifierType::Technical), ('\u{2500}', '\u{2595}', IdentifierType::Not_XID), + ('\u{2596}', '\u{259f}', IdentifierType::Not_XID), ('\u{25a0}', '\u{25ef}', + IdentifierType::Not_XID), ('\u{25f0}', '\u{25f7}', IdentifierType::Not_XID), ('\u{25f8}', + '\u{25ff}', IdentifierType::Not_XID), ('\u{2600}', '\u{2613}', IdentifierType::Not_XID), + ('\u{2614}', '\u{2615}', IdentifierType::Not_XID), ('\u{2616}', '\u{2617}', + IdentifierType::Not_XID), ('\u{2618}', '\u{2618}', IdentifierType::Not_XID), ('\u{2619}', + '\u{2619}', IdentifierType::Not_XID), ('\u{261a}', '\u{266f}', IdentifierType::Not_XID), + ('\u{2670}', '\u{2671}', IdentifierType::Not_XID), ('\u{2672}', '\u{267d}', + IdentifierType::Not_XID), ('\u{267e}', '\u{267f}', IdentifierType::Not_XID), ('\u{2680}', + '\u{2689}', IdentifierType::Not_XID), ('\u{268a}', '\u{2691}', IdentifierType::Not_XID), + ('\u{2692}', '\u{269c}', IdentifierType::Not_XID), ('\u{269d}', '\u{269d}', + IdentifierType::Not_XID), ('\u{269e}', '\u{269f}', IdentifierType::Not_XID), ('\u{26a0}', + '\u{26a1}', IdentifierType::Not_XID), ('\u{26a2}', '\u{26b1}', IdentifierType::Not_XID), + ('\u{26b2}', '\u{26b2}', IdentifierType::Not_XID), ('\u{26b3}', '\u{26bc}', + IdentifierType::Not_XID), ('\u{26bd}', '\u{26bf}', IdentifierType::Not_XID), ('\u{26c0}', + '\u{26c3}', IdentifierType::Not_XID), ('\u{26c4}', '\u{26cd}', IdentifierType::Not_XID), + ('\u{26ce}', '\u{26ce}', IdentifierType::Not_XID), ('\u{26cf}', '\u{26e1}', + IdentifierType::Not_XID), ('\u{26e2}', '\u{26e2}', IdentifierType::Not_XID), ('\u{26e3}', + '\u{26e3}', IdentifierType::Not_XID), ('\u{26e4}', '\u{26e7}', IdentifierType::Not_XID), + ('\u{26e8}', '\u{26ff}', IdentifierType::Not_XID), ('\u{2700}', '\u{2700}', + IdentifierType::Not_XID), ('\u{2701}', '\u{2704}', IdentifierType::Not_XID), ('\u{2705}', + '\u{2705}', IdentifierType::Not_XID), ('\u{2706}', '\u{2709}', IdentifierType::Not_XID), + ('\u{270a}', '\u{270b}', IdentifierType::Not_XID), ('\u{270c}', '\u{2727}', + IdentifierType::Not_XID), ('\u{2728}', '\u{2728}', IdentifierType::Not_XID), ('\u{2729}', + '\u{274b}', IdentifierType::Not_XID), ('\u{274c}', '\u{274c}', IdentifierType::Not_XID), + ('\u{274d}', '\u{274d}', IdentifierType::Not_XID), ('\u{274e}', '\u{274e}', + IdentifierType::Not_XID), ('\u{274f}', '\u{2752}', IdentifierType::Not_XID), ('\u{2753}', + '\u{2755}', IdentifierType::Not_XID), ('\u{2756}', '\u{2756}', IdentifierType::Not_XID), + ('\u{2757}', '\u{2757}', IdentifierType::Not_XID), ('\u{2758}', '\u{275e}', + IdentifierType::Not_XID), ('\u{275f}', '\u{2760}', IdentifierType::Not_XID), ('\u{2761}', + '\u{2767}', IdentifierType::Not_XID), ('\u{2768}', '\u{2775}', IdentifierType::Not_XID), + ('\u{2776}', '\u{2794}', IdentifierType::Not_XID), ('\u{2795}', '\u{2797}', + IdentifierType::Not_XID), ('\u{2798}', '\u{27af}', IdentifierType::Not_XID), ('\u{27b0}', + '\u{27b0}', IdentifierType::Not_XID), ('\u{27b1}', '\u{27be}', IdentifierType::Not_XID), + ('\u{27bf}', '\u{27bf}', IdentifierType::Not_XID), ('\u{27c0}', '\u{27c6}', + IdentifierType::Not_XID), ('\u{27c7}', '\u{27ca}', IdentifierType::Not_XID), ('\u{27cb}', + '\u{27cb}', IdentifierType::Not_XID), ('\u{27cc}', '\u{27cc}', IdentifierType::Not_XID), + ('\u{27cd}', '\u{27cd}', IdentifierType::Not_XID), ('\u{27ce}', '\u{27cf}', + IdentifierType::Not_XID), ('\u{27d0}', '\u{27eb}', IdentifierType::Not_XID), ('\u{27ec}', + '\u{27ef}', IdentifierType::Not_XID), ('\u{27f0}', '\u{27ff}', IdentifierType::Not_XID), + ('\u{2800}', '\u{28ff}', IdentifierType::Technical), ('\u{2900}', '\u{2a0b}', + IdentifierType::Not_XID), ('\u{2a0c}', '\u{2a0c}', IdentifierType::Not_XID), ('\u{2a0d}', + '\u{2a73}', IdentifierType::Not_XID), ('\u{2a74}', '\u{2a76}', IdentifierType::Not_XID), + ('\u{2a77}', '\u{2adb}', IdentifierType::Not_XID), ('\u{2adc}', '\u{2adc}', + IdentifierType::Not_XID), ('\u{2add}', '\u{2aff}', IdentifierType::Not_XID), ('\u{2b00}', + '\u{2b0d}', IdentifierType::Not_XID), ('\u{2b0e}', '\u{2b13}', IdentifierType::Not_XID), + ('\u{2b14}', '\u{2b1a}', IdentifierType::Not_XID), ('\u{2b1b}', '\u{2b1f}', + IdentifierType::Not_XID), ('\u{2b20}', '\u{2b23}', IdentifierType::Not_XID), ('\u{2b24}', + '\u{2b4c}', IdentifierType::Not_XID), ('\u{2b4d}', '\u{2b4f}', IdentifierType::Not_XID), + ('\u{2b50}', '\u{2b54}', IdentifierType::Not_XID), ('\u{2b55}', '\u{2b59}', + IdentifierType::Not_XID), ('\u{2b5a}', '\u{2b73}', IdentifierType::Not_XID), ('\u{2b76}', + '\u{2b95}', IdentifierType::Not_XID), ('\u{2b98}', '\u{2bb9}', IdentifierType::Not_XID), + ('\u{2bba}', '\u{2bbc}', IdentifierType::Not_XID), ('\u{2bbd}', '\u{2bc8}', + IdentifierType::Not_XID), ('\u{2bc9}', '\u{2bc9}', IdentifierType::Not_XID), ('\u{2bca}', + '\u{2bd1}', IdentifierType::Not_XID), ('\u{2bd2}', '\u{2bd2}', IdentifierType::Not_XID), + ('\u{2bd3}', '\u{2beb}', IdentifierType::Not_XID), ('\u{2bec}', '\u{2bef}', + IdentifierType::Uncommon_Use), ('\u{2bf0}', '\u{2bfe}', IdentifierType::Not_XID), + ('\u{2bff}', '\u{2bff}', IdentifierType::Not_XID), ('\u{2c00}', '\u{2c2e}', + IdentifierType::Exclusion), ('\u{2c30}', '\u{2c5e}', IdentifierType::Exclusion), + ('\u{2c60}', '\u{2c66}', IdentifierType::Technical), ('\u{2c67}', '\u{2c6c}', + IdentifierType::Uncommon_Use), ('\u{2c6d}', '\u{2c6f}', IdentifierType::Obsolete), + ('\u{2c70}', '\u{2c70}', IdentifierType::Obsolete), ('\u{2c71}', '\u{2c73}', + IdentifierType::Obsolete), ('\u{2c74}', '\u{2c76}', IdentifierType::Obsolete), + ('\u{2c77}', '\u{2c77}', IdentifierType::Technical), ('\u{2c78}', '\u{2c7b}', + IdentifierType::Technical), ('\u{2c7c}', '\u{2c7d}', IdentifierType::Not_NFKC), + ('\u{2c7e}', '\u{2c7f}', IdentifierType::Obsolete), ('\u{2c80}', '\u{2cb1}', + IdentifierType::Exclusion), ('\u{2cb2}', '\u{2ce3}', IdentifierType::Exclusion), + ('\u{2ce4}', '\u{2ce4}', IdentifierType::Exclusion), ('\u{2ce5}', '\u{2cea}', + IdentifierType::Exclusion), ('\u{2ceb}', '\u{2cef}', IdentifierType::Exclusion), + ('\u{2cf0}', '\u{2cf1}', IdentifierType::Technical), ('\u{2cf2}', '\u{2cf3}', + IdentifierType::Exclusion), ('\u{2cf9}', '\u{2cfc}', IdentifierType::Exclusion), + ('\u{2cfd}', '\u{2cff}', IdentifierType::Exclusion), ('\u{2d00}', '\u{2d25}', + IdentifierType::Obsolete), ('\u{2d27}', '\u{2d27}', IdentifierType::Recommended), + ('\u{2d2d}', '\u{2d2d}', IdentifierType::Recommended), ('\u{2d30}', '\u{2d65}', + IdentifierType::Limited_Use), ('\u{2d66}', '\u{2d67}', IdentifierType::Limited_Use), + ('\u{2d6f}', '\u{2d6f}', IdentifierType::Limited_Use), ('\u{2d70}', '\u{2d70}', + IdentifierType::Limited_Use), ('\u{2d7f}', '\u{2d7f}', IdentifierType::Limited_Use), + ('\u{2d80}', '\u{2d96}', IdentifierType::Recommended), ('\u{2da0}', '\u{2da6}', + IdentifierType::Recommended), ('\u{2da8}', '\u{2dae}', IdentifierType::Recommended), + ('\u{2db0}', '\u{2db6}', IdentifierType::Recommended), ('\u{2db8}', '\u{2dbe}', + IdentifierType::Recommended), ('\u{2dc0}', '\u{2dc6}', IdentifierType::Recommended), + ('\u{2dc8}', '\u{2dce}', IdentifierType::Recommended), ('\u{2dd0}', '\u{2dd6}', + IdentifierType::Recommended), ('\u{2dd8}', '\u{2dde}', IdentifierType::Recommended), + ('\u{2de0}', '\u{2dff}', IdentifierType::Obsolete), ('\u{2e00}', '\u{2e0d}', + IdentifierType::Technical), ('\u{2e0e}', '\u{2e16}', IdentifierType::Obsolete), + ('\u{2e17}', '\u{2e17}', IdentifierType::Not_XID), ('\u{2e18}', '\u{2e1b}', + IdentifierType::Not_XID), ('\u{2e1c}', '\u{2e1d}', IdentifierType::Not_XID), ('\u{2e1e}', + '\u{2e29}', IdentifierType::Not_XID), ('\u{2e2a}', '\u{2e30}', IdentifierType::Obsolete), + ('\u{2e31}', '\u{2e31}', IdentifierType::Obsolete), ('\u{2e32}', '\u{2e32}', + IdentifierType::Obsolete), ('\u{2e33}', '\u{2e34}', IdentifierType::Not_XID), ('\u{2e35}', + '\u{2e35}', IdentifierType::Obsolete), ('\u{2e36}', '\u{2e38}', IdentifierType::Not_XID), + ('\u{2e39}', '\u{2e39}', IdentifierType::Obsolete), ('\u{2e3a}', '\u{2e3b}', + IdentifierType::Not_XID), ('\u{2e3c}', '\u{2e42}', IdentifierType::Not_XID), ('\u{2e43}', + '\u{2e44}', IdentifierType::Not_XID), ('\u{2e45}', '\u{2e49}', IdentifierType::Not_XID), + ('\u{2e4a}', '\u{2e4e}', IdentifierType::Not_XID), ('\u{2e4f}', '\u{2e4f}', + IdentifierType::Not_XID), ('\u{2e80}', '\u{2e99}', IdentifierType::Not_XID), ('\u{2e9b}', + '\u{2e9e}', IdentifierType::Not_XID), ('\u{2e9f}', '\u{2e9f}', IdentifierType::Not_XID), + ('\u{2ea0}', '\u{2ef2}', IdentifierType::Not_XID), ('\u{2ef3}', '\u{2ef3}', + IdentifierType::Not_XID), ('\u{2f00}', '\u{2fd5}', IdentifierType::Not_XID), ('\u{2ff0}', + '\u{2ffb}', IdentifierType::Not_XID), ('\u{3000}', '\u{3000}', IdentifierType::Not_XID), + ('\u{3001}', '\u{3004}', IdentifierType::Not_XID), ('\u{3005}', '\u{3007}', + IdentifierType::Recommended), ('\u{3008}', '\u{301d}', IdentifierType::Not_XID), + ('\u{301e}', '\u{301e}', IdentifierType::Obsolete), ('\u{301f}', '\u{3020}', + IdentifierType::Not_XID), ('\u{3021}', '\u{302d}', IdentifierType::Technical), + ('\u{302e}', '\u{302f}', IdentifierType::Technical), ('\u{3030}', '\u{3030}', + IdentifierType::Not_XID), ('\u{3031}', '\u{3035}', IdentifierType::Technical), + ('\u{3036}', '\u{3036}', IdentifierType::Not_XID), ('\u{3037}', '\u{3037}', + IdentifierType::Not_XID), ('\u{3038}', '\u{303a}', IdentifierType::Not_NFKC), ('\u{303b}', + '\u{303c}', IdentifierType::Technical), ('\u{303d}', '\u{303d}', IdentifierType::Not_XID), + ('\u{303e}', '\u{303e}', IdentifierType::Not_XID), ('\u{303f}', '\u{303f}', + IdentifierType::Not_XID), ('\u{3041}', '\u{3094}', IdentifierType::Recommended), + ('\u{3095}', '\u{3096}', IdentifierType::Recommended), ('\u{3099}', '\u{309a}', + IdentifierType::Recommended), ('\u{309b}', '\u{309c}', IdentifierType::Not_XID), + ('\u{309d}', '\u{309e}', IdentifierType::Recommended), ('\u{309f}', '\u{309f}', + IdentifierType::Not_NFKC), ('\u{30a0}', '\u{30a0}', IdentifierType::Inclusion), + ('\u{30a1}', '\u{30fa}', IdentifierType::Recommended), ('\u{30fb}', '\u{30fb}', + IdentifierType::Inclusion), ('\u{30fc}', '\u{30fe}', IdentifierType::Recommended), + ('\u{30ff}', '\u{30ff}', IdentifierType::Not_NFKC), ('\u{3105}', '\u{312c}', + IdentifierType::Recommended), ('\u{312d}', '\u{312d}', IdentifierType::Recommended), + ('\u{312e}', '\u{312e}', IdentifierType::Recommended), ('\u{312f}', '\u{312f}', + IdentifierType::Recommended), ('\u{3131}', '\u{3163}', IdentifierType::Obsolete), + ('\u{3164}', '\u{3164}', IdentifierType::Exclusion), ('\u{3165}', '\u{318e}', + IdentifierType::Obsolete), ('\u{3190}', '\u{3191}', IdentifierType::Not_XID), ('\u{3192}', + '\u{319f}', IdentifierType::Not_XID), ('\u{31a0}', '\u{31b7}', + IdentifierType::Recommended), ('\u{31b8}', '\u{31ba}', IdentifierType::Recommended), + ('\u{31c0}', '\u{31cf}', IdentifierType::Not_XID), ('\u{31d0}', '\u{31e3}', + IdentifierType::Not_XID), ('\u{31f0}', '\u{31ff}', IdentifierType::Technical), + ('\u{3200}', '\u{321c}', IdentifierType::Obsolete), ('\u{321d}', '\u{321e}', + IdentifierType::Obsolete), ('\u{3220}', '\u{3243}', IdentifierType::Not_XID), ('\u{3244}', + '\u{3247}', IdentifierType::Not_XID), ('\u{3248}', '\u{324f}', IdentifierType::Not_XID), + ('\u{3250}', '\u{3250}', IdentifierType::Not_XID), ('\u{3251}', '\u{325f}', + IdentifierType::Technical), ('\u{3260}', '\u{327b}', IdentifierType::Technical), + ('\u{327c}', '\u{327d}', IdentifierType::Technical), ('\u{327e}', '\u{327e}', + IdentifierType::Technical), ('\u{327f}', '\u{327f}', IdentifierType::Technical), + ('\u{3280}', '\u{32b0}', IdentifierType::Technical), ('\u{32b1}', '\u{32bf}', + IdentifierType::Technical), ('\u{32c0}', '\u{32cb}', IdentifierType::Technical), + ('\u{32cc}', '\u{32cf}', IdentifierType::Technical), ('\u{32d0}', '\u{32fe}', + IdentifierType::Technical), ('\u{32ff}', '\u{32ff}', IdentifierType::Technical), + ('\u{3300}', '\u{3376}', IdentifierType::Technical), ('\u{3377}', '\u{337a}', + IdentifierType::Technical), ('\u{337b}', '\u{33dd}', IdentifierType::Technical), + ('\u{33de}', '\u{33df}', IdentifierType::Technical), ('\u{33e0}', '\u{33fe}', + IdentifierType::Technical), ('\u{33ff}', '\u{33ff}', IdentifierType::Technical), + ('\u{3400}', '\u{4db5}', IdentifierType::Recommended), ('\u{4dc0}', '\u{4dff}', + IdentifierType::Technical), ('\u{4e00}', '\u{9fa5}', IdentifierType::Recommended), + ('\u{9fa6}', '\u{9fbb}', IdentifierType::Recommended), ('\u{9fbc}', '\u{9fc3}', + IdentifierType::Recommended), ('\u{9fc4}', '\u{9fcb}', IdentifierType::Recommended), + ('\u{9fcc}', '\u{9fcc}', IdentifierType::Recommended), ('\u{9fcd}', '\u{9fd5}', + IdentifierType::Recommended), ('\u{9fd6}', '\u{9fea}', IdentifierType::Recommended), + ('\u{9feb}', '\u{9fef}', IdentifierType::Recommended), ('\u{a000}', '\u{a48c}', + IdentifierType::Limited_Use), ('\u{a490}', '\u{a4a1}', IdentifierType::Limited_Use), + ('\u{a4a2}', '\u{a4a3}', IdentifierType::Limited_Use), ('\u{a4a4}', '\u{a4b3}', + IdentifierType::Limited_Use), ('\u{a4b4}', '\u{a4b4}', IdentifierType::Limited_Use), + ('\u{a4b5}', '\u{a4c0}', IdentifierType::Limited_Use), ('\u{a4c1}', '\u{a4c1}', + IdentifierType::Limited_Use), ('\u{a4c2}', '\u{a4c4}', IdentifierType::Limited_Use), + ('\u{a4c5}', '\u{a4c5}', IdentifierType::Limited_Use), ('\u{a4c6}', '\u{a4c6}', + IdentifierType::Limited_Use), ('\u{a4d0}', '\u{a4fd}', IdentifierType::Limited_Use), + ('\u{a4fe}', '\u{a4ff}', IdentifierType::Limited_Use), ('\u{a500}', '\u{a60c}', + IdentifierType::Limited_Use), ('\u{a60d}', '\u{a60f}', IdentifierType::Limited_Use), + ('\u{a610}', '\u{a612}', IdentifierType::Limited_Use), ('\u{a613}', '\u{a629}', + IdentifierType::Limited_Use), ('\u{a62a}', '\u{a62b}', IdentifierType::Limited_Use), + ('\u{a640}', '\u{a65f}', IdentifierType::Obsolete), ('\u{a660}', '\u{a661}', + IdentifierType::Recommended), ('\u{a662}', '\u{a66e}', IdentifierType::Obsolete), + ('\u{a66f}', '\u{a66f}', IdentifierType::Uncommon_Use), ('\u{a670}', '\u{a673}', + IdentifierType::Obsolete), ('\u{a674}', '\u{a67b}', IdentifierType::Recommended), + ('\u{a67c}', '\u{a67d}', IdentifierType::Uncommon_Use), ('\u{a67e}', '\u{a67e}', + IdentifierType::Not_XID), ('\u{a67f}', '\u{a67f}', IdentifierType::Recommended), + ('\u{a680}', '\u{a697}', IdentifierType::Obsolete), ('\u{a698}', '\u{a69b}', + IdentifierType::Obsolete), ('\u{a69c}', '\u{a69d}', IdentifierType::Not_NFKC), + ('\u{a69e}', '\u{a69e}', IdentifierType::Uncommon_Use), ('\u{a69f}', '\u{a69f}', + IdentifierType::Recommended), ('\u{a6a0}', '\u{a6f1}', IdentifierType::Limited_Use), + ('\u{a6f2}', '\u{a6f7}', IdentifierType::Limited_Use), ('\u{a700}', '\u{a707}', + IdentifierType::Obsolete), ('\u{a708}', '\u{a716}', IdentifierType::Technical), + ('\u{a717}', '\u{a71a}', IdentifierType::Recommended), ('\u{a71b}', '\u{a71f}', + IdentifierType::Recommended), ('\u{a720}', '\u{a721}', IdentifierType::Not_XID), + ('\u{a722}', '\u{a72f}', IdentifierType::Technical), ('\u{a730}', '\u{a76f}', + IdentifierType::Obsolete), ('\u{a770}', '\u{a770}', IdentifierType::Obsolete), + ('\u{a771}', '\u{a787}', IdentifierType::Obsolete), ('\u{a788}', '\u{a788}', + IdentifierType::Recommended), ('\u{a789}', '\u{a78a}', IdentifierType::Not_XID), + ('\u{a78b}', '\u{a78c}', IdentifierType::Uncommon_Use), ('\u{a78d}', '\u{a78e}', + IdentifierType::Recommended), ('\u{a78f}', '\u{a78f}', IdentifierType::Uncommon_Use), + ('\u{a790}', '\u{a791}', IdentifierType::Recommended), ('\u{a792}', '\u{a793}', + IdentifierType::Recommended), ('\u{a794}', '\u{a79f}', IdentifierType::Obsolete), + ('\u{a7a0}', '\u{a7a9}', IdentifierType::Recommended), ('\u{a7aa}', '\u{a7aa}', + IdentifierType::Recommended), ('\u{a7ab}', '\u{a7ad}', IdentifierType::Obsolete), + ('\u{a7ae}', '\u{a7ae}', IdentifierType::Recommended), ('\u{a7af}', '\u{a7af}', + IdentifierType::Recommended), ('\u{a7b0}', '\u{a7b1}', IdentifierType::Obsolete), + ('\u{a7b2}', '\u{a7b7}', IdentifierType::Uncommon_Use), ('\u{a7b8}', '\u{a7b9}', + IdentifierType::Recommended), ('\u{a7ba}', '\u{a7bf}', IdentifierType::Recommended), + ('\u{a7c2}', '\u{a7c6}', IdentifierType::Recommended), ('\u{a7f7}', '\u{a7f7}', + IdentifierType::Obsolete), ('\u{a7f8}', '\u{a7f9}', IdentifierType::Not_NFKC), + ('\u{a7fa}', '\u{a7fa}', IdentifierType::Recommended), ('\u{a7fb}', '\u{a7ff}', + IdentifierType::Obsolete), ('\u{a800}', '\u{a827}', IdentifierType::Limited_Use), + ('\u{a828}', '\u{a82b}', IdentifierType::Limited_Use), ('\u{a830}', '\u{a839}', + IdentifierType::Not_XID), ('\u{a840}', '\u{a873}', IdentifierType::Exclusion), + ('\u{a874}', '\u{a877}', IdentifierType::Exclusion), ('\u{a880}', '\u{a8c4}', + IdentifierType::Limited_Use), ('\u{a8c5}', '\u{a8c5}', IdentifierType::Limited_Use), + ('\u{a8ce}', '\u{a8cf}', IdentifierType::Limited_Use), ('\u{a8d0}', '\u{a8d9}', + IdentifierType::Limited_Use), ('\u{a8e0}', '\u{a8f7}', IdentifierType::Obsolete), + ('\u{a8f8}', '\u{a8fa}', IdentifierType::Obsolete), ('\u{a8fb}', '\u{a8fb}', + IdentifierType::Obsolete), ('\u{a8fc}', '\u{a8fc}', IdentifierType::Uncommon_Use), + ('\u{a8fd}', '\u{a8fd}', IdentifierType::Uncommon_Use), ('\u{a8fe}', '\u{a8ff}', + IdentifierType::Obsolete), ('\u{a900}', '\u{a92d}', IdentifierType::Limited_Use), + ('\u{a92e}', '\u{a92e}', IdentifierType::Not_XID), ('\u{a92f}', '\u{a92f}', + IdentifierType::Limited_Use), ('\u{a930}', '\u{a953}', IdentifierType::Exclusion), + ('\u{a95f}', '\u{a95f}', IdentifierType::Exclusion), ('\u{a960}', '\u{a97c}', + IdentifierType::Obsolete), ('\u{a980}', '\u{a9c0}', IdentifierType::Limited_Use), + ('\u{a9c1}', '\u{a9cd}', IdentifierType::Limited_Use), ('\u{a9cf}', '\u{a9cf}', + IdentifierType::Limited_Use), ('\u{a9d0}', '\u{a9d9}', IdentifierType::Limited_Use), + ('\u{a9de}', '\u{a9df}', IdentifierType::Limited_Use), ('\u{a9e0}', '\u{a9e6}', + IdentifierType::Obsolete), ('\u{a9e7}', '\u{a9fe}', IdentifierType::Recommended), + ('\u{aa00}', '\u{aa36}', IdentifierType::Limited_Use), ('\u{aa40}', '\u{aa4d}', + IdentifierType::Limited_Use), ('\u{aa50}', '\u{aa59}', IdentifierType::Limited_Use), + ('\u{aa5c}', '\u{aa5f}', IdentifierType::Limited_Use), ('\u{aa60}', '\u{aa76}', + IdentifierType::Recommended), ('\u{aa77}', '\u{aa79}', IdentifierType::Not_XID), + ('\u{aa7a}', '\u{aa7b}', IdentifierType::Recommended), ('\u{aa7c}', '\u{aa7f}', + IdentifierType::Recommended), ('\u{aa80}', '\u{aac2}', IdentifierType::Limited_Use), + ('\u{aadb}', '\u{aadd}', IdentifierType::Limited_Use), ('\u{aade}', '\u{aadf}', + IdentifierType::Limited_Use), ('\u{aae0}', '\u{aaef}', IdentifierType::Limited_Use), + ('\u{aaf0}', '\u{aaf1}', IdentifierType::Limited_Use), ('\u{aaf2}', '\u{aaf6}', + IdentifierType::Limited_Use), ('\u{ab01}', '\u{ab06}', IdentifierType::Recommended), + ('\u{ab09}', '\u{ab0e}', IdentifierType::Recommended), ('\u{ab11}', '\u{ab16}', + IdentifierType::Recommended), ('\u{ab20}', '\u{ab26}', IdentifierType::Recommended), + ('\u{ab28}', '\u{ab2e}', IdentifierType::Recommended), ('\u{ab30}', '\u{ab5a}', + IdentifierType::Obsolete), ('\u{ab5b}', '\u{ab5b}', IdentifierType::Not_XID), ('\u{ab5c}', + '\u{ab5f}', IdentifierType::Not_NFKC), ('\u{ab60}', '\u{ab63}', + IdentifierType::Uncommon_Use), ('\u{ab64}', '\u{ab65}', IdentifierType::Obsolete), + ('\u{ab66}', '\u{ab67}', IdentifierType::Recommended), ('\u{ab70}', '\u{abbf}', + IdentifierType::Limited_Use), ('\u{abc0}', '\u{abea}', IdentifierType::Limited_Use), + ('\u{abeb}', '\u{abeb}', IdentifierType::Limited_Use), ('\u{abec}', '\u{abed}', + IdentifierType::Limited_Use), ('\u{abf0}', '\u{abf9}', IdentifierType::Limited_Use), + ('\u{ac00}', '\u{d7a3}', IdentifierType::Recommended), ('\u{d7b0}', '\u{d7c6}', + IdentifierType::Obsolete), ('\u{d7cb}', '\u{d7fb}', IdentifierType::Obsolete), + ('\u{f900}', '\u{fa0d}', IdentifierType::Not_NFKC), ('\u{fa0e}', '\u{fa0f}', + IdentifierType::Recommended), ('\u{fa10}', '\u{fa10}', IdentifierType::Not_NFKC), + ('\u{fa11}', '\u{fa11}', IdentifierType::Recommended), ('\u{fa12}', '\u{fa12}', + IdentifierType::Not_NFKC), ('\u{fa13}', '\u{fa14}', IdentifierType::Recommended), + ('\u{fa15}', '\u{fa1e}', IdentifierType::Not_NFKC), ('\u{fa1f}', '\u{fa1f}', + IdentifierType::Recommended), ('\u{fa20}', '\u{fa20}', IdentifierType::Not_NFKC), + ('\u{fa21}', '\u{fa21}', IdentifierType::Recommended), ('\u{fa22}', '\u{fa22}', + IdentifierType::Not_NFKC), ('\u{fa23}', '\u{fa24}', IdentifierType::Recommended), + ('\u{fa25}', '\u{fa26}', IdentifierType::Not_NFKC), ('\u{fa27}', '\u{fa29}', + IdentifierType::Recommended), ('\u{fa2a}', '\u{fa2d}', IdentifierType::Not_NFKC), + ('\u{fa2e}', '\u{fa2f}', IdentifierType::Not_NFKC), ('\u{fa30}', '\u{fa6a}', + IdentifierType::Not_NFKC), ('\u{fa6b}', '\u{fa6d}', IdentifierType::Not_NFKC), + ('\u{fa70}', '\u{fad9}', IdentifierType::Not_NFKC), ('\u{fb00}', '\u{fb06}', + IdentifierType::Technical), ('\u{fb13}', '\u{fb17}', IdentifierType::Technical), + ('\u{fb1d}', '\u{fb1d}', IdentifierType::Technical), ('\u{fb1e}', '\u{fb1e}', + IdentifierType::Uncommon_Use), ('\u{fb1f}', '\u{fb28}', IdentifierType::Technical), + ('\u{fb29}', '\u{fb29}', IdentifierType::Technical), ('\u{fb2a}', '\u{fb36}', + IdentifierType::Technical), ('\u{fb38}', '\u{fb3c}', IdentifierType::Technical), + ('\u{fb3e}', '\u{fb3e}', IdentifierType::Technical), ('\u{fb40}', '\u{fb41}', + IdentifierType::Technical), ('\u{fb43}', '\u{fb44}', IdentifierType::Technical), + ('\u{fb46}', '\u{fbb1}', IdentifierType::Technical), ('\u{fbb2}', '\u{fbc1}', + IdentifierType::Technical), ('\u{fbd3}', '\u{fc5d}', IdentifierType::Technical), + ('\u{fc5e}', '\u{fc63}', IdentifierType::Technical), ('\u{fc64}', '\u{fd3d}', + IdentifierType::Technical), ('\u{fd3e}', '\u{fd3f}', IdentifierType::Technical), + ('\u{fd50}', '\u{fd8f}', IdentifierType::Technical), ('\u{fd92}', '\u{fdc7}', + IdentifierType::Technical), ('\u{fdf0}', '\u{fdf9}', IdentifierType::Technical), + ('\u{fdfa}', '\u{fdfb}', IdentifierType::Technical), ('\u{fdfc}', '\u{fdfc}', + IdentifierType::Technical), ('\u{fdfd}', '\u{fdfd}', IdentifierType::Technical), + ('\u{fe00}', '\u{fe0f}', IdentifierType::Technical), ('\u{fe10}', '\u{fe19}', + IdentifierType::Technical), ('\u{fe20}', '\u{fe23}', IdentifierType::Technical), + ('\u{fe24}', '\u{fe26}', IdentifierType::Technical), ('\u{fe27}', '\u{fe2d}', + IdentifierType::Technical), ('\u{fe2e}', '\u{fe2f}', IdentifierType::Uncommon_Use), + ('\u{fe30}', '\u{fe32}', IdentifierType::Technical), ('\u{fe33}', '\u{fe34}', + IdentifierType::Technical), ('\u{fe35}', '\u{fe44}', IdentifierType::Technical), + ('\u{fe45}', '\u{fe46}', IdentifierType::Technical), ('\u{fe47}', '\u{fe48}', + IdentifierType::Technical), ('\u{fe49}', '\u{fe4c}', IdentifierType::Technical), + ('\u{fe4d}', '\u{fe4f}', IdentifierType::Technical), ('\u{fe50}', '\u{fe52}', + IdentifierType::Technical), ('\u{fe54}', '\u{fe66}', IdentifierType::Technical), + ('\u{fe68}', '\u{fe6b}', IdentifierType::Technical), ('\u{fe70}', '\u{fe70}', + IdentifierType::Technical), ('\u{fe71}', '\u{fe71}', IdentifierType::Technical), + ('\u{fe72}', '\u{fe72}', IdentifierType::Technical), ('\u{fe73}', '\u{fe73}', + IdentifierType::Technical), ('\u{fe74}', '\u{fe74}', IdentifierType::Technical), + ('\u{fe76}', '\u{fe76}', IdentifierType::Technical), ('\u{fe77}', '\u{fe77}', + IdentifierType::Technical), ('\u{fe78}', '\u{fe78}', IdentifierType::Technical), + ('\u{fe79}', '\u{fe79}', IdentifierType::Technical), ('\u{fe7a}', '\u{fe7a}', + IdentifierType::Technical), ('\u{fe7b}', '\u{fe7b}', IdentifierType::Technical), + ('\u{fe7c}', '\u{fe7c}', IdentifierType::Technical), ('\u{fe7d}', '\u{fe7d}', + IdentifierType::Technical), ('\u{fe7e}', '\u{fe7e}', IdentifierType::Technical), + ('\u{fe7f}', '\u{fefc}', IdentifierType::Technical), ('\u{feff}', '\u{feff}', + IdentifierType::Exclusion), ('\u{ff01}', '\u{ff0f}', IdentifierType::Not_XID), + ('\u{ff10}', '\u{ff19}', IdentifierType::Not_NFKC), ('\u{ff1a}', '\u{ff20}', + IdentifierType::Not_XID), ('\u{ff21}', '\u{ff3a}', IdentifierType::Not_NFKC), ('\u{ff3b}', + '\u{ff3e}', IdentifierType::Not_XID), ('\u{ff3f}', '\u{ff3f}', IdentifierType::Not_NFKC), + ('\u{ff40}', '\u{ff40}', IdentifierType::Not_XID), ('\u{ff41}', '\u{ff5a}', + IdentifierType::Not_NFKC), ('\u{ff5b}', '\u{ff5e}', IdentifierType::Not_XID), ('\u{ff5f}', + '\u{ff60}', IdentifierType::Not_XID), ('\u{ff61}', '\u{ff65}', IdentifierType::Not_XID), + ('\u{ff66}', '\u{ff9f}', IdentifierType::Not_NFKC), ('\u{ffa0}', '\u{ffa0}', + IdentifierType::Exclusion), ('\u{ffa1}', '\u{ffbe}', IdentifierType::Obsolete), + ('\u{ffc2}', '\u{ffc7}', IdentifierType::Obsolete), ('\u{ffca}', '\u{ffcf}', + IdentifierType::Obsolete), ('\u{ffd2}', '\u{ffd7}', IdentifierType::Obsolete), + ('\u{ffda}', '\u{ffdc}', IdentifierType::Obsolete), ('\u{ffe0}', '\u{ffe6}', + IdentifierType::Not_XID), ('\u{ffe8}', '\u{ffee}', IdentifierType::Not_XID), ('\u{fff9}', + '\u{fffb}', IdentifierType::Not_XID), ('\u{fffc}', '\u{fffc}', IdentifierType::Not_XID), + ('\u{fffd}', '\u{fffd}', IdentifierType::Not_XID), ('\u{10000}', '\u{1000b}', + IdentifierType::Exclusion), ('\u{1000d}', '\u{10026}', IdentifierType::Exclusion), + ('\u{10028}', '\u{1003a}', IdentifierType::Exclusion), ('\u{1003c}', '\u{1003d}', + IdentifierType::Exclusion), ('\u{1003f}', '\u{1004d}', IdentifierType::Exclusion), + ('\u{10050}', '\u{1005d}', IdentifierType::Exclusion), ('\u{10080}', '\u{100fa}', + IdentifierType::Exclusion), ('\u{10100}', '\u{10102}', IdentifierType::Exclusion), + ('\u{10107}', '\u{10133}', IdentifierType::Exclusion), ('\u{10137}', '\u{1013f}', + IdentifierType::Exclusion), ('\u{10140}', '\u{10174}', IdentifierType::Obsolete), + ('\u{10175}', '\u{1018a}', IdentifierType::Not_XID), ('\u{1018b}', '\u{1018c}', + IdentifierType::Not_XID), ('\u{1018d}', '\u{1018e}', IdentifierType::Not_XID), + ('\u{10190}', '\u{1019b}', IdentifierType::Not_XID), ('\u{101a0}', '\u{101a0}', + IdentifierType::Not_XID), ('\u{101d0}', '\u{101fc}', IdentifierType::Exclusion), + ('\u{101fd}', '\u{101fd}', IdentifierType::Exclusion), ('\u{10280}', '\u{1029c}', + IdentifierType::Exclusion), ('\u{102a0}', '\u{102d0}', IdentifierType::Exclusion), + ('\u{102e0}', '\u{102e0}', IdentifierType::Obsolete), ('\u{102e1}', '\u{102fb}', + IdentifierType::Not_XID), ('\u{10300}', '\u{1031e}', IdentifierType::Exclusion), + ('\u{1031f}', '\u{1031f}', IdentifierType::Exclusion), ('\u{10320}', '\u{10323}', + IdentifierType::Exclusion), ('\u{1032d}', '\u{1032f}', IdentifierType::Exclusion), + ('\u{10330}', '\u{1034a}', IdentifierType::Exclusion), ('\u{10350}', '\u{1037a}', + IdentifierType::Exclusion), ('\u{10380}', '\u{1039d}', IdentifierType::Exclusion), + ('\u{1039f}', '\u{1039f}', IdentifierType::Exclusion), ('\u{103a0}', '\u{103c3}', + IdentifierType::Exclusion), ('\u{103c8}', '\u{103cf}', IdentifierType::Exclusion), + ('\u{103d0}', '\u{103d0}', IdentifierType::Exclusion), ('\u{103d1}', '\u{103d5}', + IdentifierType::Exclusion), ('\u{10400}', '\u{10425}', IdentifierType::Exclusion), + ('\u{10426}', '\u{10427}', IdentifierType::Exclusion), ('\u{10428}', '\u{1044d}', + IdentifierType::Exclusion), ('\u{1044e}', '\u{1049d}', IdentifierType::Exclusion), + ('\u{104a0}', '\u{104a9}', IdentifierType::Exclusion), ('\u{104b0}', '\u{104d3}', + IdentifierType::Limited_Use), ('\u{104d8}', '\u{104fb}', IdentifierType::Limited_Use), + ('\u{10500}', '\u{10527}', IdentifierType::Exclusion), ('\u{10530}', '\u{10563}', + IdentifierType::Exclusion), ('\u{1056f}', '\u{1056f}', IdentifierType::Exclusion), + ('\u{10600}', '\u{10736}', IdentifierType::Exclusion), ('\u{10740}', '\u{10755}', + IdentifierType::Exclusion), ('\u{10760}', '\u{10767}', IdentifierType::Exclusion), + ('\u{10800}', '\u{10805}', IdentifierType::Exclusion), ('\u{10808}', '\u{10808}', + IdentifierType::Exclusion), ('\u{1080a}', '\u{10835}', IdentifierType::Exclusion), + ('\u{10837}', '\u{10838}', IdentifierType::Exclusion), ('\u{1083c}', '\u{1083c}', + IdentifierType::Exclusion), ('\u{1083f}', '\u{1083f}', IdentifierType::Exclusion), + ('\u{10840}', '\u{10855}', IdentifierType::Exclusion), ('\u{10857}', '\u{1085f}', + IdentifierType::Exclusion), ('\u{10860}', '\u{10876}', IdentifierType::Exclusion), + ('\u{10877}', '\u{1087f}', IdentifierType::Exclusion), ('\u{10880}', '\u{1089e}', + IdentifierType::Exclusion), ('\u{108a7}', '\u{108af}', IdentifierType::Exclusion), + ('\u{108e0}', '\u{108f2}', IdentifierType::Exclusion), ('\u{108f4}', '\u{108f5}', + IdentifierType::Exclusion), ('\u{108fb}', '\u{108ff}', IdentifierType::Exclusion), + ('\u{10900}', '\u{10915}', IdentifierType::Exclusion), ('\u{10916}', '\u{10919}', + IdentifierType::Exclusion), ('\u{1091a}', '\u{1091b}', IdentifierType::Exclusion), + ('\u{1091f}', '\u{1091f}', IdentifierType::Exclusion), ('\u{10920}', '\u{10939}', + IdentifierType::Exclusion), ('\u{1093f}', '\u{1093f}', IdentifierType::Exclusion), + ('\u{10980}', '\u{109b7}', IdentifierType::Exclusion), ('\u{109bc}', '\u{109bd}', + IdentifierType::Exclusion), ('\u{109be}', '\u{109bf}', IdentifierType::Exclusion), + ('\u{109c0}', '\u{109cf}', IdentifierType::Exclusion), ('\u{109d2}', '\u{109ff}', + IdentifierType::Exclusion), ('\u{10a00}', '\u{10a03}', IdentifierType::Exclusion), + ('\u{10a05}', '\u{10a06}', IdentifierType::Exclusion), ('\u{10a0c}', '\u{10a0c}', + IdentifierType::Exclusion), ('\u{10a0d}', '\u{10a0d}', IdentifierType::Technical), + ('\u{10a0e}', '\u{10a13}', IdentifierType::Exclusion), ('\u{10a15}', '\u{10a17}', + IdentifierType::Exclusion), ('\u{10a19}', '\u{10a33}', IdentifierType::Exclusion), + ('\u{10a34}', '\u{10a35}', IdentifierType::Exclusion), ('\u{10a38}', '\u{10a3a}', + IdentifierType::Exclusion), ('\u{10a3f}', '\u{10a3f}', IdentifierType::Exclusion), + ('\u{10a40}', '\u{10a47}', IdentifierType::Exclusion), ('\u{10a48}', '\u{10a48}', + IdentifierType::Exclusion), ('\u{10a50}', '\u{10a58}', IdentifierType::Exclusion), + ('\u{10a60}', '\u{10a7c}', IdentifierType::Exclusion), ('\u{10a7d}', '\u{10a7f}', + IdentifierType::Exclusion), ('\u{10a80}', '\u{10a9c}', IdentifierType::Exclusion), + ('\u{10a9d}', '\u{10a9f}', IdentifierType::Exclusion), ('\u{10ac0}', '\u{10ac7}', + IdentifierType::Exclusion), ('\u{10ac8}', '\u{10ac8}', IdentifierType::Exclusion), + ('\u{10ac9}', '\u{10ae6}', IdentifierType::Exclusion), ('\u{10aeb}', '\u{10af6}', + IdentifierType::Exclusion), ('\u{10b00}', '\u{10b35}', IdentifierType::Exclusion), + ('\u{10b39}', '\u{10b3f}', IdentifierType::Exclusion), ('\u{10b40}', '\u{10b55}', + IdentifierType::Exclusion), ('\u{10b58}', '\u{10b5f}', IdentifierType::Exclusion), + ('\u{10b60}', '\u{10b72}', IdentifierType::Exclusion), ('\u{10b78}', '\u{10b7f}', + IdentifierType::Exclusion), ('\u{10b80}', '\u{10b91}', IdentifierType::Exclusion), + ('\u{10b99}', '\u{10b9c}', IdentifierType::Exclusion), ('\u{10ba9}', '\u{10baf}', + IdentifierType::Exclusion), ('\u{10c00}', '\u{10c48}', IdentifierType::Exclusion), + ('\u{10c80}', '\u{10cb2}', IdentifierType::Exclusion), ('\u{10cc0}', '\u{10cf2}', + IdentifierType::Exclusion), ('\u{10cfa}', '\u{10cff}', IdentifierType::Exclusion), + ('\u{10d00}', '\u{10d27}', IdentifierType::Limited_Use), ('\u{10d30}', '\u{10d39}', + IdentifierType::Limited_Use), ('\u{10e60}', '\u{10e7e}', IdentifierType::Not_XID), + ('\u{10f00}', '\u{10f1c}', IdentifierType::Exclusion), ('\u{10f1d}', '\u{10f26}', + IdentifierType::Exclusion), ('\u{10f27}', '\u{10f27}', IdentifierType::Exclusion), + ('\u{10f30}', '\u{10f50}', IdentifierType::Exclusion), ('\u{10f51}', '\u{10f59}', + IdentifierType::Exclusion), ('\u{10fe0}', '\u{10ff6}', IdentifierType::Exclusion), + ('\u{11000}', '\u{11046}', IdentifierType::Exclusion), ('\u{11047}', '\u{1104d}', + IdentifierType::Exclusion), ('\u{11052}', '\u{11065}', IdentifierType::Exclusion), + ('\u{11066}', '\u{1106f}', IdentifierType::Exclusion), ('\u{1107f}', '\u{1107f}', + IdentifierType::Exclusion), ('\u{11080}', '\u{110ba}', IdentifierType::Exclusion), + ('\u{110bb}', '\u{110bc}', IdentifierType::Exclusion), ('\u{110bd}', '\u{110bd}', + IdentifierType::Exclusion), ('\u{110be}', '\u{110c1}', IdentifierType::Exclusion), + ('\u{110cd}', '\u{110cd}', IdentifierType::Exclusion), ('\u{110d0}', '\u{110e8}', + IdentifierType::Exclusion), ('\u{110f0}', '\u{110f9}', IdentifierType::Exclusion), + ('\u{11100}', '\u{11134}', IdentifierType::Limited_Use), ('\u{11136}', '\u{1113f}', + IdentifierType::Limited_Use), ('\u{11140}', '\u{11143}', IdentifierType::Limited_Use), + ('\u{11144}', '\u{11146}', IdentifierType::Limited_Use), ('\u{11150}', '\u{11173}', + IdentifierType::Exclusion), ('\u{11174}', '\u{11175}', IdentifierType::Exclusion), + ('\u{11176}', '\u{11176}', IdentifierType::Exclusion), ('\u{11180}', '\u{111c4}', + IdentifierType::Exclusion), ('\u{111c5}', '\u{111c8}', IdentifierType::Exclusion), + ('\u{111c9}', '\u{111cc}', IdentifierType::Exclusion), ('\u{111cd}', '\u{111cd}', + IdentifierType::Exclusion), ('\u{111d0}', '\u{111d9}', IdentifierType::Exclusion), + ('\u{111da}', '\u{111da}', IdentifierType::Exclusion), ('\u{111db}', '\u{111db}', + IdentifierType::Exclusion), ('\u{111dc}', '\u{111dc}', IdentifierType::Exclusion), + ('\u{111dd}', '\u{111df}', IdentifierType::Exclusion), ('\u{111e1}', '\u{111f4}', + IdentifierType::Not_XID), ('\u{11200}', '\u{11211}', IdentifierType::Exclusion), + ('\u{11213}', '\u{11237}', IdentifierType::Exclusion), ('\u{11238}', '\u{1123d}', + IdentifierType::Exclusion), ('\u{1123e}', '\u{1123e}', IdentifierType::Exclusion), + ('\u{11280}', '\u{11286}', IdentifierType::Exclusion), ('\u{11288}', '\u{11288}', + IdentifierType::Exclusion), ('\u{1128a}', '\u{1128d}', IdentifierType::Exclusion), + ('\u{1128f}', '\u{1129d}', IdentifierType::Exclusion), ('\u{1129f}', '\u{112a8}', + IdentifierType::Exclusion), ('\u{112a9}', '\u{112a9}', IdentifierType::Exclusion), + ('\u{112b0}', '\u{112ea}', IdentifierType::Exclusion), ('\u{112f0}', '\u{112f9}', + IdentifierType::Exclusion), ('\u{11300}', '\u{11300}', IdentifierType::Exclusion), + ('\u{11301}', '\u{11303}', IdentifierType::Exclusion), ('\u{11305}', '\u{1130c}', + IdentifierType::Exclusion), ('\u{1130f}', '\u{11310}', IdentifierType::Exclusion), + ('\u{11313}', '\u{11328}', IdentifierType::Exclusion), ('\u{1132a}', '\u{11330}', + IdentifierType::Exclusion), ('\u{11332}', '\u{11333}', IdentifierType::Exclusion), + ('\u{11335}', '\u{11339}', IdentifierType::Exclusion), ('\u{1133b}', '\u{1133b}', + IdentifierType::Recommended), ('\u{1133c}', '\u{11344}', IdentifierType::Exclusion), + ('\u{11347}', '\u{11348}', IdentifierType::Exclusion), ('\u{1134b}', '\u{1134d}', + IdentifierType::Exclusion), ('\u{11350}', '\u{11350}', IdentifierType::Exclusion), + ('\u{11357}', '\u{11357}', IdentifierType::Exclusion), ('\u{1135d}', '\u{11363}', + IdentifierType::Exclusion), ('\u{11366}', '\u{1136c}', IdentifierType::Exclusion), + ('\u{11370}', '\u{11374}', IdentifierType::Exclusion), ('\u{11400}', '\u{1144a}', + IdentifierType::Limited_Use), ('\u{1144b}', '\u{1144f}', IdentifierType::Limited_Use), + ('\u{11450}', '\u{11459}', IdentifierType::Limited_Use), ('\u{1145b}', '\u{1145b}', + IdentifierType::Limited_Use), ('\u{1145d}', '\u{1145d}', IdentifierType::Limited_Use), + ('\u{1145e}', '\u{1145e}', IdentifierType::Limited_Use), ('\u{1145f}', '\u{1145f}', + IdentifierType::Limited_Use), ('\u{11480}', '\u{114c5}', IdentifierType::Exclusion), + ('\u{114c6}', '\u{114c6}', IdentifierType::Exclusion), ('\u{114c7}', '\u{114c7}', + IdentifierType::Exclusion), ('\u{114d0}', '\u{114d9}', IdentifierType::Exclusion), + ('\u{11580}', '\u{115b5}', IdentifierType::Exclusion), ('\u{115b8}', '\u{115c0}', + IdentifierType::Exclusion), ('\u{115c1}', '\u{115c9}', IdentifierType::Exclusion), + ('\u{115ca}', '\u{115d7}', IdentifierType::Exclusion), ('\u{115d8}', '\u{115dd}', + IdentifierType::Exclusion), ('\u{11600}', '\u{11640}', IdentifierType::Exclusion), + ('\u{11641}', '\u{11643}', IdentifierType::Exclusion), ('\u{11644}', '\u{11644}', + IdentifierType::Exclusion), ('\u{11650}', '\u{11659}', IdentifierType::Exclusion), + ('\u{11660}', '\u{1166c}', IdentifierType::Limited_Use), ('\u{11680}', '\u{116b7}', + IdentifierType::Exclusion), ('\u{116b8}', '\u{116b8}', IdentifierType::Exclusion), + ('\u{116c0}', '\u{116c9}', IdentifierType::Exclusion), ('\u{11700}', '\u{11719}', + IdentifierType::Exclusion), ('\u{1171a}', '\u{1171a}', IdentifierType::Exclusion), + ('\u{1171d}', '\u{1172b}', IdentifierType::Exclusion), ('\u{11730}', '\u{11739}', + IdentifierType::Exclusion), ('\u{1173a}', '\u{1173f}', IdentifierType::Exclusion), + ('\u{11800}', '\u{1183a}', IdentifierType::Exclusion), ('\u{1183b}', '\u{1183b}', + IdentifierType::Exclusion), ('\u{118a0}', '\u{118e9}', IdentifierType::Exclusion), + ('\u{118ea}', '\u{118f2}', IdentifierType::Exclusion), ('\u{118ff}', '\u{118ff}', + IdentifierType::Exclusion), ('\u{119a0}', '\u{119a7}', IdentifierType::Exclusion), + ('\u{119aa}', '\u{119d7}', IdentifierType::Exclusion), ('\u{119da}', '\u{119e1}', + IdentifierType::Exclusion), ('\u{119e2}', '\u{119e2}', IdentifierType::Exclusion), + ('\u{119e3}', '\u{119e4}', IdentifierType::Exclusion), ('\u{11a00}', '\u{11a3e}', + IdentifierType::Exclusion), ('\u{11a3f}', '\u{11a46}', IdentifierType::Exclusion), + ('\u{11a47}', '\u{11a47}', IdentifierType::Exclusion), ('\u{11a50}', '\u{11a83}', + IdentifierType::Exclusion), ('\u{11a84}', '\u{11a85}', IdentifierType::Exclusion), + ('\u{11a86}', '\u{11a99}', IdentifierType::Exclusion), ('\u{11a9a}', '\u{11a9c}', + IdentifierType::Exclusion), ('\u{11a9d}', '\u{11a9d}', IdentifierType::Exclusion), + ('\u{11a9e}', '\u{11aa2}', IdentifierType::Exclusion), ('\u{11ac0}', '\u{11af8}', + IdentifierType::Exclusion), ('\u{11c00}', '\u{11c08}', IdentifierType::Exclusion), + ('\u{11c0a}', '\u{11c36}', IdentifierType::Exclusion), ('\u{11c38}', '\u{11c40}', + IdentifierType::Exclusion), ('\u{11c41}', '\u{11c45}', IdentifierType::Exclusion), + ('\u{11c50}', '\u{11c59}', IdentifierType::Exclusion), ('\u{11c5a}', '\u{11c6c}', + IdentifierType::Exclusion), ('\u{11c70}', '\u{11c71}', IdentifierType::Exclusion), + ('\u{11c72}', '\u{11c8f}', IdentifierType::Exclusion), ('\u{11c92}', '\u{11ca7}', + IdentifierType::Exclusion), ('\u{11ca9}', '\u{11cb6}', IdentifierType::Exclusion), + ('\u{11d00}', '\u{11d06}', IdentifierType::Exclusion), ('\u{11d08}', '\u{11d09}', + IdentifierType::Exclusion), ('\u{11d0b}', '\u{11d36}', IdentifierType::Exclusion), + ('\u{11d3a}', '\u{11d3a}', IdentifierType::Exclusion), ('\u{11d3c}', '\u{11d3d}', + IdentifierType::Exclusion), ('\u{11d3f}', '\u{11d47}', IdentifierType::Exclusion), + ('\u{11d50}', '\u{11d59}', IdentifierType::Exclusion), ('\u{11d60}', '\u{11d65}', + IdentifierType::Limited_Use), ('\u{11d67}', '\u{11d68}', IdentifierType::Limited_Use), + ('\u{11d6a}', '\u{11d8e}', IdentifierType::Limited_Use), ('\u{11d90}', '\u{11d91}', + IdentifierType::Limited_Use), ('\u{11d93}', '\u{11d98}', IdentifierType::Limited_Use), + ('\u{11da0}', '\u{11da9}', IdentifierType::Limited_Use), ('\u{11ee0}', '\u{11ef6}', + IdentifierType::Exclusion), ('\u{11ef7}', '\u{11ef8}', IdentifierType::Exclusion), + ('\u{11fc0}', '\u{11ff1}', IdentifierType::Not_XID), ('\u{11fff}', '\u{11fff}', + IdentifierType::Not_XID), ('\u{12000}', '\u{1236e}', IdentifierType::Exclusion), + ('\u{1236f}', '\u{12398}', IdentifierType::Exclusion), ('\u{12399}', '\u{12399}', + IdentifierType::Exclusion), ('\u{12400}', '\u{12462}', IdentifierType::Exclusion), + ('\u{12463}', '\u{1246e}', IdentifierType::Exclusion), ('\u{12470}', '\u{12473}', + IdentifierType::Exclusion), ('\u{12474}', '\u{12474}', IdentifierType::Exclusion), + ('\u{12480}', '\u{12543}', IdentifierType::Exclusion), ('\u{13000}', '\u{1342e}', + IdentifierType::Exclusion), ('\u{13430}', '\u{13438}', IdentifierType::Exclusion), + ('\u{14400}', '\u{14646}', IdentifierType::Exclusion), ('\u{16800}', '\u{16a38}', + IdentifierType::Limited_Use), ('\u{16a40}', '\u{16a5e}', IdentifierType::Uncommon_Use), + ('\u{16a60}', '\u{16a69}', IdentifierType::Uncommon_Use), ('\u{16a6e}', '\u{16a6f}', + IdentifierType::Exclusion), ('\u{16ad0}', '\u{16aed}', IdentifierType::Exclusion), + ('\u{16af0}', '\u{16af4}', IdentifierType::Exclusion), ('\u{16af5}', '\u{16af5}', + IdentifierType::Exclusion), ('\u{16b00}', '\u{16b36}', IdentifierType::Exclusion), + ('\u{16b37}', '\u{16b3f}', IdentifierType::Exclusion), ('\u{16b40}', '\u{16b43}', + IdentifierType::Exclusion), ('\u{16b44}', '\u{16b45}', IdentifierType::Exclusion), + ('\u{16b50}', '\u{16b59}', IdentifierType::Exclusion), ('\u{16b5b}', '\u{16b61}', + IdentifierType::Exclusion), ('\u{16b63}', '\u{16b77}', IdentifierType::Exclusion), + ('\u{16b7d}', '\u{16b8f}', IdentifierType::Exclusion), ('\u{16e40}', '\u{16e7f}', + IdentifierType::Exclusion), ('\u{16e80}', '\u{16e9a}', IdentifierType::Exclusion), + ('\u{16f00}', '\u{16f44}', IdentifierType::Limited_Use), ('\u{16f45}', '\u{16f4a}', + IdentifierType::Limited_Use), ('\u{16f4f}', '\u{16f4f}', IdentifierType::Limited_Use), + ('\u{16f50}', '\u{16f7e}', IdentifierType::Limited_Use), ('\u{16f7f}', '\u{16f87}', + IdentifierType::Limited_Use), ('\u{16f8f}', '\u{16f9f}', IdentifierType::Limited_Use), + ('\u{16fe0}', '\u{16fe0}', IdentifierType::Exclusion), ('\u{16fe1}', '\u{16fe1}', + IdentifierType::Exclusion), ('\u{16fe2}', '\u{16fe2}', IdentifierType::Not_XID), + ('\u{16fe3}', '\u{16fe3}', IdentifierType::Obsolete), ('\u{17000}', '\u{187ec}', + IdentifierType::Exclusion), ('\u{187ed}', '\u{187f1}', IdentifierType::Exclusion), + ('\u{187f2}', '\u{187f7}', IdentifierType::Exclusion), ('\u{18800}', '\u{18af2}', + IdentifierType::Exclusion), ('\u{1b000}', '\u{1b001}', IdentifierType::Obsolete), + ('\u{1b002}', '\u{1b11e}', IdentifierType::Obsolete), ('\u{1b150}', '\u{1b152}', + IdentifierType::Recommended), ('\u{1b164}', '\u{1b167}', IdentifierType::Recommended), + ('\u{1b170}', '\u{1b2fb}', IdentifierType::Exclusion), ('\u{1bc00}', '\u{1bc6a}', + IdentifierType::Exclusion), ('\u{1bc70}', '\u{1bc7c}', IdentifierType::Exclusion), + ('\u{1bc80}', '\u{1bc88}', IdentifierType::Exclusion), ('\u{1bc90}', '\u{1bc99}', + IdentifierType::Exclusion), ('\u{1bc9c}', '\u{1bc9c}', IdentifierType::Exclusion), + ('\u{1bc9d}', '\u{1bc9e}', IdentifierType::Exclusion), ('\u{1bc9f}', '\u{1bc9f}', + IdentifierType::Exclusion), ('\u{1bca0}', '\u{1bca3}', IdentifierType::Exclusion), + ('\u{1d000}', '\u{1d0f5}', IdentifierType::Technical), ('\u{1d100}', '\u{1d126}', + IdentifierType::Technical), ('\u{1d129}', '\u{1d129}', IdentifierType::Technical), + ('\u{1d12a}', '\u{1d15d}', IdentifierType::Technical), ('\u{1d15e}', '\u{1d164}', + IdentifierType::Technical), ('\u{1d165}', '\u{1d169}', IdentifierType::Technical), + ('\u{1d16a}', '\u{1d16c}', IdentifierType::Technical), ('\u{1d16d}', '\u{1d172}', + IdentifierType::Technical), ('\u{1d173}', '\u{1d17a}', IdentifierType::Technical), + ('\u{1d17b}', '\u{1d182}', IdentifierType::Technical), ('\u{1d183}', '\u{1d184}', + IdentifierType::Technical), ('\u{1d185}', '\u{1d18b}', IdentifierType::Technical), + ('\u{1d18c}', '\u{1d1a9}', IdentifierType::Technical), ('\u{1d1aa}', '\u{1d1ad}', + IdentifierType::Technical), ('\u{1d1ae}', '\u{1d1ba}', IdentifierType::Technical), + ('\u{1d1bb}', '\u{1d1c0}', IdentifierType::Technical), ('\u{1d1c1}', '\u{1d1dd}', + IdentifierType::Technical), ('\u{1d1de}', '\u{1d1e8}', IdentifierType::Uncommon_Use), + ('\u{1d200}', '\u{1d241}', IdentifierType::Exclusion), ('\u{1d242}', '\u{1d244}', + IdentifierType::Technical), ('\u{1d245}', '\u{1d245}', IdentifierType::Exclusion), + ('\u{1d2e0}', '\u{1d2f3}', IdentifierType::Not_XID), ('\u{1d300}', '\u{1d356}', + IdentifierType::Technical), ('\u{1d360}', '\u{1d371}', IdentifierType::Not_XID), + ('\u{1d372}', '\u{1d378}', IdentifierType::Not_XID), ('\u{1d400}', '\u{1d454}', + IdentifierType::Technical), ('\u{1d456}', '\u{1d49c}', IdentifierType::Technical), + ('\u{1d49e}', '\u{1d49f}', IdentifierType::Technical), ('\u{1d4a2}', '\u{1d4a2}', + IdentifierType::Technical), ('\u{1d4a5}', '\u{1d4a6}', IdentifierType::Technical), + ('\u{1d4a9}', '\u{1d4ac}', IdentifierType::Technical), ('\u{1d4ae}', '\u{1d4b9}', + IdentifierType::Technical), ('\u{1d4bb}', '\u{1d4bb}', IdentifierType::Technical), + ('\u{1d4bd}', '\u{1d4c0}', IdentifierType::Technical), ('\u{1d4c1}', '\u{1d4c1}', + IdentifierType::Technical), ('\u{1d4c2}', '\u{1d4c3}', IdentifierType::Technical), + ('\u{1d4c5}', '\u{1d505}', IdentifierType::Technical), ('\u{1d507}', '\u{1d50a}', + IdentifierType::Technical), ('\u{1d50d}', '\u{1d514}', IdentifierType::Technical), + ('\u{1d516}', '\u{1d51c}', IdentifierType::Technical), ('\u{1d51e}', '\u{1d539}', + IdentifierType::Technical), ('\u{1d53b}', '\u{1d53e}', IdentifierType::Technical), + ('\u{1d540}', '\u{1d544}', IdentifierType::Technical), ('\u{1d546}', '\u{1d546}', + IdentifierType::Technical), ('\u{1d54a}', '\u{1d550}', IdentifierType::Technical), + ('\u{1d552}', '\u{1d6a3}', IdentifierType::Technical), ('\u{1d6a4}', '\u{1d6a5}', + IdentifierType::Technical), ('\u{1d6a8}', '\u{1d6c0}', IdentifierType::Technical), + ('\u{1d6c1}', '\u{1d6c1}', IdentifierType::Technical), ('\u{1d6c2}', '\u{1d6da}', + IdentifierType::Technical), ('\u{1d6db}', '\u{1d6db}', IdentifierType::Technical), + ('\u{1d6dc}', '\u{1d6fa}', IdentifierType::Technical), ('\u{1d6fb}', '\u{1d6fb}', + IdentifierType::Technical), ('\u{1d6fc}', '\u{1d714}', IdentifierType::Technical), + ('\u{1d715}', '\u{1d715}', IdentifierType::Technical), ('\u{1d716}', '\u{1d734}', + IdentifierType::Technical), ('\u{1d735}', '\u{1d735}', IdentifierType::Technical), + ('\u{1d736}', '\u{1d74e}', IdentifierType::Technical), ('\u{1d74f}', '\u{1d74f}', + IdentifierType::Technical), ('\u{1d750}', '\u{1d76e}', IdentifierType::Technical), + ('\u{1d76f}', '\u{1d76f}', IdentifierType::Technical), ('\u{1d770}', '\u{1d788}', + IdentifierType::Technical), ('\u{1d789}', '\u{1d789}', IdentifierType::Technical), + ('\u{1d78a}', '\u{1d7a8}', IdentifierType::Technical), ('\u{1d7a9}', '\u{1d7a9}', + IdentifierType::Technical), ('\u{1d7aa}', '\u{1d7c2}', IdentifierType::Technical), + ('\u{1d7c3}', '\u{1d7c3}', IdentifierType::Technical), ('\u{1d7c4}', '\u{1d7c9}', + IdentifierType::Technical), ('\u{1d7ca}', '\u{1d7cb}', IdentifierType::Technical), + ('\u{1d7ce}', '\u{1d7ff}', IdentifierType::Technical), ('\u{1d800}', '\u{1d9ff}', + IdentifierType::Exclusion), ('\u{1da00}', '\u{1da36}', IdentifierType::Exclusion), + ('\u{1da37}', '\u{1da3a}', IdentifierType::Exclusion), ('\u{1da3b}', '\u{1da6c}', + IdentifierType::Exclusion), ('\u{1da6d}', '\u{1da74}', IdentifierType::Exclusion), + ('\u{1da75}', '\u{1da75}', IdentifierType::Exclusion), ('\u{1da76}', '\u{1da83}', + IdentifierType::Exclusion), ('\u{1da84}', '\u{1da84}', IdentifierType::Exclusion), + ('\u{1da85}', '\u{1da8b}', IdentifierType::Exclusion), ('\u{1da9b}', '\u{1da9f}', + IdentifierType::Exclusion), ('\u{1daa1}', '\u{1daaf}', IdentifierType::Exclusion), + ('\u{1e000}', '\u{1e006}', IdentifierType::Exclusion), ('\u{1e008}', '\u{1e018}', + IdentifierType::Exclusion), ('\u{1e01b}', '\u{1e021}', IdentifierType::Exclusion), + ('\u{1e023}', '\u{1e024}', IdentifierType::Exclusion), ('\u{1e026}', '\u{1e02a}', + IdentifierType::Exclusion), ('\u{1e100}', '\u{1e12c}', IdentifierType::Limited_Use), + ('\u{1e130}', '\u{1e13d}', IdentifierType::Limited_Use), ('\u{1e140}', '\u{1e149}', + IdentifierType::Limited_Use), ('\u{1e14e}', '\u{1e14e}', IdentifierType::Limited_Use), + ('\u{1e14f}', '\u{1e14f}', IdentifierType::Limited_Use), ('\u{1e2c0}', '\u{1e2f9}', + IdentifierType::Limited_Use), ('\u{1e2ff}', '\u{1e2ff}', IdentifierType::Limited_Use), + ('\u{1e800}', '\u{1e8c4}', IdentifierType::Exclusion), ('\u{1e8c7}', '\u{1e8cf}', + IdentifierType::Exclusion), ('\u{1e8d0}', '\u{1e8d6}', IdentifierType::Exclusion), + ('\u{1e900}', '\u{1e94a}', IdentifierType::Limited_Use), ('\u{1e94b}', '\u{1e94b}', + IdentifierType::Limited_Use), ('\u{1e950}', '\u{1e959}', IdentifierType::Limited_Use), + ('\u{1e95e}', '\u{1e95f}', IdentifierType::Limited_Use), ('\u{1ec71}', '\u{1ecb4}', + IdentifierType::Not_XID), ('\u{1ed01}', '\u{1ed3d}', IdentifierType::Not_XID), + ('\u{1ee00}', '\u{1ee03}', IdentifierType::Not_NFKC), ('\u{1ee05}', '\u{1ee1f}', + IdentifierType::Not_NFKC), ('\u{1ee21}', '\u{1ee22}', IdentifierType::Not_NFKC), + ('\u{1ee24}', '\u{1ee24}', IdentifierType::Not_NFKC), ('\u{1ee27}', '\u{1ee27}', + IdentifierType::Not_NFKC), ('\u{1ee29}', '\u{1ee32}', IdentifierType::Not_NFKC), + ('\u{1ee34}', '\u{1ee37}', IdentifierType::Not_NFKC), ('\u{1ee39}', '\u{1ee39}', + IdentifierType::Not_NFKC), ('\u{1ee3b}', '\u{1ee3b}', IdentifierType::Not_NFKC), + ('\u{1ee42}', '\u{1ee42}', IdentifierType::Not_NFKC), ('\u{1ee47}', '\u{1ee47}', + IdentifierType::Not_NFKC), ('\u{1ee49}', '\u{1ee49}', IdentifierType::Not_NFKC), + ('\u{1ee4b}', '\u{1ee4b}', IdentifierType::Not_NFKC), ('\u{1ee4d}', '\u{1ee4f}', + IdentifierType::Not_NFKC), ('\u{1ee51}', '\u{1ee52}', IdentifierType::Not_NFKC), + ('\u{1ee54}', '\u{1ee54}', IdentifierType::Not_NFKC), ('\u{1ee57}', '\u{1ee57}', + IdentifierType::Not_NFKC), ('\u{1ee59}', '\u{1ee59}', IdentifierType::Not_NFKC), + ('\u{1ee5b}', '\u{1ee5b}', IdentifierType::Not_NFKC), ('\u{1ee5d}', '\u{1ee5d}', + IdentifierType::Not_NFKC), ('\u{1ee5f}', '\u{1ee5f}', IdentifierType::Not_NFKC), + ('\u{1ee61}', '\u{1ee62}', IdentifierType::Not_NFKC), ('\u{1ee64}', '\u{1ee64}', + IdentifierType::Not_NFKC), ('\u{1ee67}', '\u{1ee6a}', IdentifierType::Not_NFKC), + ('\u{1ee6c}', '\u{1ee72}', IdentifierType::Not_NFKC), ('\u{1ee74}', '\u{1ee77}', + IdentifierType::Not_NFKC), ('\u{1ee79}', '\u{1ee7c}', IdentifierType::Not_NFKC), + ('\u{1ee7e}', '\u{1ee7e}', IdentifierType::Not_NFKC), ('\u{1ee80}', '\u{1ee89}', + IdentifierType::Not_NFKC), ('\u{1ee8b}', '\u{1ee9b}', IdentifierType::Not_NFKC), + ('\u{1eea1}', '\u{1eea3}', IdentifierType::Not_NFKC), ('\u{1eea5}', '\u{1eea9}', + IdentifierType::Not_NFKC), ('\u{1eeab}', '\u{1eebb}', IdentifierType::Not_NFKC), + ('\u{1eef0}', '\u{1eef1}', IdentifierType::Not_XID), ('\u{1f000}', '\u{1f02b}', + IdentifierType::Not_XID), ('\u{1f030}', '\u{1f093}', IdentifierType::Not_XID), + ('\u{1f0a0}', '\u{1f0ae}', IdentifierType::Not_XID), ('\u{1f0b1}', '\u{1f0be}', + IdentifierType::Not_XID), ('\u{1f0bf}', '\u{1f0bf}', IdentifierType::Not_XID), + ('\u{1f0c1}', '\u{1f0cf}', IdentifierType::Not_XID), ('\u{1f0d1}', '\u{1f0df}', + IdentifierType::Not_XID), ('\u{1f0e0}', '\u{1f0f5}', IdentifierType::Not_XID), + ('\u{1f100}', '\u{1f10a}', IdentifierType::Not_XID), ('\u{1f10b}', '\u{1f10c}', + IdentifierType::Not_XID), ('\u{1f110}', '\u{1f12e}', IdentifierType::Not_XID), + ('\u{1f12f}', '\u{1f12f}', IdentifierType::Not_XID), ('\u{1f130}', '\u{1f130}', + IdentifierType::Not_XID), ('\u{1f131}', '\u{1f131}', IdentifierType::Not_XID), + ('\u{1f132}', '\u{1f13c}', IdentifierType::Not_XID), ('\u{1f13d}', '\u{1f13d}', + IdentifierType::Not_XID), ('\u{1f13e}', '\u{1f13e}', IdentifierType::Not_XID), + ('\u{1f13f}', '\u{1f13f}', IdentifierType::Not_XID), ('\u{1f140}', '\u{1f141}', + IdentifierType::Not_XID), ('\u{1f142}', '\u{1f142}', IdentifierType::Not_XID), + ('\u{1f143}', '\u{1f145}', IdentifierType::Not_XID), ('\u{1f146}', '\u{1f146}', + IdentifierType::Not_XID), ('\u{1f147}', '\u{1f149}', IdentifierType::Not_XID), + ('\u{1f14a}', '\u{1f14e}', IdentifierType::Not_XID), ('\u{1f14f}', '\u{1f14f}', + IdentifierType::Not_XID), ('\u{1f150}', '\u{1f156}', IdentifierType::Not_XID), + ('\u{1f157}', '\u{1f157}', IdentifierType::Not_XID), ('\u{1f158}', '\u{1f15e}', + IdentifierType::Not_XID), ('\u{1f15f}', '\u{1f15f}', IdentifierType::Not_XID), + ('\u{1f160}', '\u{1f169}', IdentifierType::Not_XID), ('\u{1f16a}', '\u{1f16b}', + IdentifierType::Not_XID), ('\u{1f16c}', '\u{1f16c}', IdentifierType::Not_XID), + ('\u{1f170}', '\u{1f178}', IdentifierType::Not_XID), ('\u{1f179}', '\u{1f179}', + IdentifierType::Not_XID), ('\u{1f17a}', '\u{1f17a}', IdentifierType::Not_XID), + ('\u{1f17b}', '\u{1f17c}', IdentifierType::Not_XID), ('\u{1f17d}', '\u{1f17e}', + IdentifierType::Not_XID), ('\u{1f17f}', '\u{1f17f}', IdentifierType::Not_XID), + ('\u{1f180}', '\u{1f189}', IdentifierType::Not_XID), ('\u{1f18a}', '\u{1f18d}', + IdentifierType::Not_XID), ('\u{1f18e}', '\u{1f18f}', IdentifierType::Not_XID), + ('\u{1f190}', '\u{1f190}', IdentifierType::Not_XID), ('\u{1f191}', '\u{1f19a}', + IdentifierType::Not_XID), ('\u{1f19b}', '\u{1f1ac}', IdentifierType::Not_XID), + ('\u{1f1e6}', '\u{1f1ff}', IdentifierType::Not_XID), ('\u{1f200}', '\u{1f200}', + IdentifierType::Not_XID), ('\u{1f201}', '\u{1f202}', IdentifierType::Not_XID), + ('\u{1f210}', '\u{1f231}', IdentifierType::Not_XID), ('\u{1f232}', '\u{1f23a}', + IdentifierType::Not_XID), ('\u{1f23b}', '\u{1f23b}', IdentifierType::Not_XID), + ('\u{1f240}', '\u{1f248}', IdentifierType::Not_XID), ('\u{1f250}', '\u{1f251}', + IdentifierType::Not_XID), ('\u{1f260}', '\u{1f265}', IdentifierType::Not_XID), + ('\u{1f300}', '\u{1f320}', IdentifierType::Not_XID), ('\u{1f321}', '\u{1f32c}', + IdentifierType::Not_XID), ('\u{1f32d}', '\u{1f32f}', IdentifierType::Not_XID), + ('\u{1f330}', '\u{1f335}', IdentifierType::Not_XID), ('\u{1f336}', '\u{1f336}', + IdentifierType::Not_XID), ('\u{1f337}', '\u{1f37c}', IdentifierType::Not_XID), + ('\u{1f37d}', '\u{1f37d}', IdentifierType::Not_XID), ('\u{1f37e}', '\u{1f37f}', + IdentifierType::Not_XID), ('\u{1f380}', '\u{1f393}', IdentifierType::Not_XID), + ('\u{1f394}', '\u{1f39f}', IdentifierType::Not_XID), ('\u{1f3a0}', '\u{1f3c4}', + IdentifierType::Not_XID), ('\u{1f3c5}', '\u{1f3c5}', IdentifierType::Not_XID), + ('\u{1f3c6}', '\u{1f3ca}', IdentifierType::Not_XID), ('\u{1f3cb}', '\u{1f3ce}', + IdentifierType::Not_XID), ('\u{1f3cf}', '\u{1f3d3}', IdentifierType::Not_XID), + ('\u{1f3d4}', '\u{1f3df}', IdentifierType::Not_XID), ('\u{1f3e0}', '\u{1f3f0}', + IdentifierType::Not_XID), ('\u{1f3f1}', '\u{1f3f7}', IdentifierType::Not_XID), + ('\u{1f3f8}', '\u{1f3ff}', IdentifierType::Not_XID), ('\u{1f400}', '\u{1f43e}', + IdentifierType::Not_XID), ('\u{1f43f}', '\u{1f43f}', IdentifierType::Not_XID), + ('\u{1f440}', '\u{1f440}', IdentifierType::Not_XID), ('\u{1f441}', '\u{1f441}', + IdentifierType::Not_XID), ('\u{1f442}', '\u{1f4f7}', IdentifierType::Not_XID), + ('\u{1f4f8}', '\u{1f4f8}', IdentifierType::Not_XID), ('\u{1f4f9}', '\u{1f4fc}', + IdentifierType::Not_XID), ('\u{1f4fd}', '\u{1f4fe}', IdentifierType::Not_XID), + ('\u{1f4ff}', '\u{1f4ff}', IdentifierType::Not_XID), ('\u{1f500}', '\u{1f53d}', + IdentifierType::Not_XID), ('\u{1f53e}', '\u{1f53f}', IdentifierType::Not_XID), + ('\u{1f540}', '\u{1f543}', IdentifierType::Not_XID), ('\u{1f544}', '\u{1f54a}', + IdentifierType::Not_XID), ('\u{1f54b}', '\u{1f54e}', IdentifierType::Not_XID), + ('\u{1f54f}', '\u{1f54f}', IdentifierType::Uncommon_Use), ('\u{1f550}', '\u{1f567}', + IdentifierType::Not_XID), ('\u{1f568}', '\u{1f579}', IdentifierType::Not_XID), + ('\u{1f57a}', '\u{1f57a}', IdentifierType::Not_XID), ('\u{1f57b}', '\u{1f5a3}', + IdentifierType::Not_XID), ('\u{1f5a4}', '\u{1f5a4}', IdentifierType::Not_XID), + ('\u{1f5a5}', '\u{1f5fa}', IdentifierType::Not_XID), ('\u{1f5fb}', '\u{1f5ff}', + IdentifierType::Not_XID), ('\u{1f600}', '\u{1f600}', IdentifierType::Not_XID), + ('\u{1f601}', '\u{1f610}', IdentifierType::Not_XID), ('\u{1f611}', '\u{1f611}', + IdentifierType::Not_XID), ('\u{1f612}', '\u{1f614}', IdentifierType::Not_XID), + ('\u{1f615}', '\u{1f615}', IdentifierType::Not_XID), ('\u{1f616}', '\u{1f616}', + IdentifierType::Not_XID), ('\u{1f617}', '\u{1f617}', IdentifierType::Not_XID), + ('\u{1f618}', '\u{1f618}', IdentifierType::Not_XID), ('\u{1f619}', '\u{1f619}', + IdentifierType::Not_XID), ('\u{1f61a}', '\u{1f61a}', IdentifierType::Not_XID), + ('\u{1f61b}', '\u{1f61b}', IdentifierType::Not_XID), ('\u{1f61c}', '\u{1f61e}', + IdentifierType::Not_XID), ('\u{1f61f}', '\u{1f61f}', IdentifierType::Not_XID), + ('\u{1f620}', '\u{1f625}', IdentifierType::Not_XID), ('\u{1f626}', '\u{1f627}', + IdentifierType::Not_XID), ('\u{1f628}', '\u{1f62b}', IdentifierType::Not_XID), + ('\u{1f62c}', '\u{1f62c}', IdentifierType::Not_XID), ('\u{1f62d}', '\u{1f62d}', + IdentifierType::Not_XID), ('\u{1f62e}', '\u{1f62f}', IdentifierType::Not_XID), + ('\u{1f630}', '\u{1f633}', IdentifierType::Not_XID), ('\u{1f634}', '\u{1f634}', + IdentifierType::Not_XID), ('\u{1f635}', '\u{1f640}', IdentifierType::Not_XID), + ('\u{1f641}', '\u{1f642}', IdentifierType::Not_XID), ('\u{1f643}', '\u{1f644}', + IdentifierType::Not_XID), ('\u{1f645}', '\u{1f64f}', IdentifierType::Not_XID), + ('\u{1f650}', '\u{1f67f}', IdentifierType::Not_XID), ('\u{1f680}', '\u{1f6c5}', + IdentifierType::Not_XID), ('\u{1f6c6}', '\u{1f6cf}', IdentifierType::Not_XID), + ('\u{1f6d0}', '\u{1f6d0}', IdentifierType::Not_XID), ('\u{1f6d1}', '\u{1f6d2}', + IdentifierType::Not_XID), ('\u{1f6d3}', '\u{1f6d4}', IdentifierType::Not_XID), + ('\u{1f6d5}', '\u{1f6d5}', IdentifierType::Not_XID), ('\u{1f6e0}', '\u{1f6ec}', + IdentifierType::Not_XID), ('\u{1f6f0}', '\u{1f6f3}', IdentifierType::Not_XID), + ('\u{1f6f4}', '\u{1f6f6}', IdentifierType::Not_XID), ('\u{1f6f7}', '\u{1f6f8}', + IdentifierType::Not_XID), ('\u{1f6f9}', '\u{1f6f9}', IdentifierType::Not_XID), + ('\u{1f6fa}', '\u{1f6fa}', IdentifierType::Not_XID), ('\u{1f700}', '\u{1f773}', + IdentifierType::Not_XID), ('\u{1f780}', '\u{1f7d4}', IdentifierType::Not_XID), + ('\u{1f7d5}', '\u{1f7d8}', IdentifierType::Not_XID), ('\u{1f7e0}', '\u{1f7eb}', + IdentifierType::Not_XID), ('\u{1f800}', '\u{1f80b}', IdentifierType::Not_XID), + ('\u{1f810}', '\u{1f847}', IdentifierType::Not_XID), ('\u{1f850}', '\u{1f859}', + IdentifierType::Not_XID), ('\u{1f860}', '\u{1f887}', IdentifierType::Not_XID), + ('\u{1f890}', '\u{1f8ad}', IdentifierType::Not_XID), ('\u{1f900}', '\u{1f90b}', + IdentifierType::Not_XID), ('\u{1f90d}', '\u{1f90f}', IdentifierType::Not_XID), + ('\u{1f910}', '\u{1f918}', IdentifierType::Not_XID), ('\u{1f919}', '\u{1f91e}', + IdentifierType::Not_XID), ('\u{1f91f}', '\u{1f91f}', IdentifierType::Not_XID), + ('\u{1f920}', '\u{1f927}', IdentifierType::Not_XID), ('\u{1f928}', '\u{1f92f}', + IdentifierType::Not_XID), ('\u{1f930}', '\u{1f930}', IdentifierType::Not_XID), + ('\u{1f931}', '\u{1f932}', IdentifierType::Not_XID), ('\u{1f933}', '\u{1f93e}', + IdentifierType::Not_XID), ('\u{1f93f}', '\u{1f93f}', IdentifierType::Not_XID), + ('\u{1f940}', '\u{1f94b}', IdentifierType::Not_XID), ('\u{1f94c}', '\u{1f94c}', + IdentifierType::Not_XID), ('\u{1f94d}', '\u{1f94f}', IdentifierType::Not_XID), + ('\u{1f950}', '\u{1f95e}', IdentifierType::Not_XID), ('\u{1f95f}', '\u{1f96b}', + IdentifierType::Not_XID), ('\u{1f96c}', '\u{1f970}', IdentifierType::Not_XID), + ('\u{1f971}', '\u{1f971}', IdentifierType::Not_XID), ('\u{1f973}', '\u{1f976}', + IdentifierType::Not_XID), ('\u{1f97a}', '\u{1f97a}', IdentifierType::Not_XID), + ('\u{1f97b}', '\u{1f97b}', IdentifierType::Not_XID), ('\u{1f97c}', '\u{1f97f}', + IdentifierType::Not_XID), ('\u{1f980}', '\u{1f984}', IdentifierType::Not_XID), + ('\u{1f985}', '\u{1f991}', IdentifierType::Not_XID), ('\u{1f992}', '\u{1f997}', + IdentifierType::Not_XID), ('\u{1f998}', '\u{1f9a2}', IdentifierType::Not_XID), + ('\u{1f9a5}', '\u{1f9aa}', IdentifierType::Not_XID), ('\u{1f9ae}', '\u{1f9af}', + IdentifierType::Not_XID), ('\u{1f9b0}', '\u{1f9b9}', IdentifierType::Not_XID), + ('\u{1f9ba}', '\u{1f9bf}', IdentifierType::Not_XID), ('\u{1f9c0}', '\u{1f9c0}', + IdentifierType::Not_XID), ('\u{1f9c1}', '\u{1f9c2}', IdentifierType::Not_XID), + ('\u{1f9c3}', '\u{1f9ca}', IdentifierType::Not_XID), ('\u{1f9cd}', '\u{1f9cf}', + IdentifierType::Not_XID), ('\u{1f9d0}', '\u{1f9e6}', IdentifierType::Not_XID), + ('\u{1f9e7}', '\u{1f9ff}', IdentifierType::Not_XID), ('\u{1fa00}', '\u{1fa53}', + IdentifierType::Not_XID), ('\u{1fa60}', '\u{1fa6d}', IdentifierType::Not_XID), + ('\u{1fa70}', '\u{1fa73}', IdentifierType::Not_XID), ('\u{1fa78}', '\u{1fa7a}', + IdentifierType::Not_XID), ('\u{1fa80}', '\u{1fa82}', IdentifierType::Not_XID), + ('\u{1fa90}', '\u{1fa95}', IdentifierType::Not_XID), ('\u{20000}', '\u{2a6d6}', + IdentifierType::Recommended), ('\u{2a700}', '\u{2b734}', IdentifierType::Recommended), + ('\u{2b740}', '\u{2b81d}', IdentifierType::Recommended), ('\u{2b820}', '\u{2cea1}', + IdentifierType::Recommended), ('\u{2ceb0}', '\u{2ebe0}', IdentifierType::Recommended), + ('\u{2f800}', '\u{2fa1d}', IdentifierType::Not_NFKC), ('\u{e0001}', '\u{e0001}', + IdentifierType::Exclusion), ('\u{e0020}', '\u{e007f}', IdentifierType::Exclusion), + ('\u{e0100}', '\u{e01ef}', IdentifierType::Exclusion) + ]; + +} + diff --git a/vendor/unicode-security/src/tests.rs b/vendor/unicode-security/src/tests.rs new file mode 100644 index 0000000000..95d89eb8b7 --- /dev/null +++ b/vendor/unicode-security/src/tests.rs @@ -0,0 +1,60 @@ +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[test] +fn test_general_security_profile_identifier_allowed() { + use crate::GeneralSecurityProfile; + assert_eq!(GeneralSecurityProfile::identifier_allowed('A'), true); + assert_eq!('A'.identifier_allowed(), true); + assert_eq!(GeneralSecurityProfile::identifier_allowed('0'), true); + assert_eq!('0'.identifier_allowed(), true); + assert_eq!(GeneralSecurityProfile::identifier_allowed('_'), true); + assert_eq!('_'.identifier_allowed(), true); + assert_eq!(GeneralSecurityProfile::identifier_allowed('\x00'), false); + assert_eq!('\x00'.identifier_allowed(), false); + // U+00B5 MICRO SIGN + assert_eq!(GeneralSecurityProfile::identifier_allowed('µ'), false); + assert_eq!('µ'.identifier_allowed(), false); + // U+2160 ROMAN NUMERAL ONE + assert_eq!(GeneralSecurityProfile::identifier_allowed('Ⅰ'), false); + assert_eq!('Ⅰ'.identifier_allowed(), false); +} + +#[test] +fn test_mixed_script() { + use crate::MixedScript; + assert_eq!("".is_single_script(), true); + assert_eq!("".resolve_script_set().is_empty(), false); + assert_eq!("".resolve_script_set().is_all(), true); + assert_eq!("A".is_single_script(), true); + assert_eq!("A".resolve_script_set().is_empty(), false); + assert_eq!("A".resolve_script_set().is_all(), false); + assert_eq!("A0".is_single_script(), true); + assert_eq!("A0".resolve_script_set().is_empty(), false); + assert_eq!("A0".resolve_script_set().is_all(), false); + assert_eq!("0.".is_single_script(), true); + assert_eq!("0.".resolve_script_set().is_empty(), false); + assert_eq!("0.".resolve_script_set().is_all(), true); + assert_eq!("福".is_single_script(), true); + assert_eq!("福".resolve_script_set().is_empty(), false); + assert_eq!("福".resolve_script_set().is_all(), false); + assert_eq!("冬の雪".is_single_script(), true); + assert_eq!("冬の雪".resolve_script_set().is_empty(), false); + assert_eq!("冬の雪".resolve_script_set().is_all(), false); + assert_eq!("幻ㄒㄧㄤ".is_single_script(), true); + assert_eq!("幻ㄒㄧㄤ".resolve_script_set().is_empty(), false); + assert_eq!("幻ㄒㄧㄤ".resolve_script_set().is_all(), false); + assert_eq!("日出은".is_single_script(), true); + assert_eq!("日出은".resolve_script_set().is_empty(), false); + assert_eq!("日出은".resolve_script_set().is_all(), false); + assert_eq!("夏の幻ㄒㄧㄤ".is_single_script(), false); + assert_eq!("夏の幻ㄒㄧㄤ".resolve_script_set().is_empty(), true); + assert_eq!("夏の幻ㄒㄧㄤ".resolve_script_set().is_all(), false); +} diff --git a/vendor/vcpkg/.cargo-checksum.json b/vendor/vcpkg/.cargo-checksum.json index 5b765192ec..cd65eb401b 100644 --- a/vendor/vcpkg/.cargo-checksum.json +++ b/vendor/vcpkg/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"99439b4457782b6ec61e0ec19f1b43b029ffcadc4592320fd60e498c2a79a619","src/lib.rs":"0c34c8a7bd30bc74c6f6c6f6d566a5e6ab79836a32048f733890cf7a9dd611e1"},"package":"def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d"} \ No newline at end of file +{"files":{"Cargo.toml":"c12213960e82380c69cbc3355b9b016e283dfc16fa48f18086b95b5bb0a94481","src/lib.rs":"5462f4ea0d5d81e900f0d52f0995de866be3008bc62029052996e46638bbd5bd"},"package":"3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168"} \ No newline at end of file diff --git a/vendor/vcpkg/Cargo.toml b/vendor/vcpkg/Cargo.toml index e1a9260abb..3f68e355fd 100644 --- a/vendor/vcpkg/Cargo.toml +++ b/vendor/vcpkg/Cargo.toml @@ -3,7 +3,7 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g. crates.io) dependencies +# to registry (e.g., crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're @@ -12,7 +12,7 @@ [package] name = "vcpkg" -version = "0.2.6" +version = "0.2.8" authors = ["Jim McGrath <jimmc2@gmail.com>"] description = "A library to find native dependencies in a vcpkg tree at build\ntime in order to be used in Cargo build scripts.\n" documentation = "https://docs.rs/vcpkg" diff --git a/vendor/vcpkg/src/lib.rs b/vendor/vcpkg/src/lib.rs index 14ef0577cc..fc10073ecd 100644 --- a/vendor/vcpkg/src/lib.rs +++ b/vendor/vcpkg/src/lib.rs @@ -59,11 +59,15 @@ //! cargo:rustc-link-lib=static=mysqlclient //! ``` +// The CI will test vcpkg-rs on 1.10 because at this point rust-openssl's +// openssl-sys is backward compatible that far. (Actually, the oldest release +// crate openssl version 0.10 seems to build against is now Rust 1.24.1?) +#![allow(deprecated)] + #[cfg(test)] #[macro_use] extern crate lazy_static; -#[allow(deprecated)] #[allow(unused_imports)] use std::ascii::AsciiExt; @@ -84,7 +88,7 @@ pub struct Config { /// should cargo:include= metadata be emitted (defaults to false) emit_includes: bool, - /// .libs that must be be found for probing to be considered successful + /// .lib/.a files that must be be found for probing to be considered successful required_libs: Vec<String>, /// .dlls that must be be found for probing to be considered successful @@ -92,6 +96,9 @@ pub struct Config { /// should DLLs be copies to OUT_DIR? copy_dlls: bool, + + /// override VCPKG_ROOT environment variable + vcpkg_root: Option<PathBuf>, } /// Details of a package that was found @@ -112,23 +119,33 @@ pub struct Library { /// libraries found are static pub is_static: bool, - // DLLs found + /// DLLs found pub found_dlls: Vec<PathBuf>, - // static libs or import libs found + /// static libs or import libs found pub found_libs: Vec<PathBuf>, + + /// link name of libraries found, this is useful to emit linker commands + pub found_names: Vec<String>, + + /// ports that are providing the libraries to link to, in port link order + pub ports: Vec<String>, } enum MSVCTarget { - X86, - X64, + X86Windows, + X64Windows, + X64Linux, + X64MacOS, } impl fmt::Display for MSVCTarget { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { - MSVCTarget::X86 => write!(f, "x86-windows"), - MSVCTarget::X64 => write!(f, "x64-windows"), + MSVCTarget::X86Windows => write!(f, "x86-windows"), + MSVCTarget::X64Windows => write!(f, "x64-windows"), + MSVCTarget::X64Linux => write!(f, "x64-linux"), + MSVCTarget::X64MacOS => write!(f, "x64-osx"), } } } @@ -143,7 +160,7 @@ pub enum Error { /// Aborted because a required environment variable was not set. RequiredEnvMissing(String), - /// Only MSVC ABI is supported + /// On Windows, only MSVC ABI is supported NotMSVC, /// Can't find a vcpkg tree @@ -220,8 +237,13 @@ pub fn find_package(package: &str) -> Result<Library, Error> { Config::new().find_package(package) } -fn find_vcpkg_root() -> Result<PathBuf, Error> { - // prefer the setting from the environment is there is one +fn find_vcpkg_root(cfg: &Config) -> Result<PathBuf, Error> { + // prefer the setting from the use if there is one + if let &Some(ref path) = &cfg.vcpkg_root { + return Ok(path.clone()); + } + + // otherwise, use the setting from the environment if let Some(path) = env::var_os("VCPKG_ROOT") { return Ok(PathBuf::from(path)); } @@ -229,7 +251,7 @@ fn find_vcpkg_root() -> Result<PathBuf, Error> { // see if there is a per-user vcpkg tree that has been integrated into msbuild // using `vcpkg integrate install` let local_app_data = try!(env::var("LOCALAPPDATA").map_err(|_| Error::VcpkgNotFound( - "Failed to read LOCALAPPDATA environment variable".to_string() + "Failed to read either VCPKG_ROOT or LOCALAPPDATA environment variables".to_string() ))); // not present or can't utf8 let vcpkg_user_targets_path = Path::new(local_app_data.as_str()) .join("vcpkg") @@ -286,20 +308,25 @@ fn validate_vcpkg_root(path: &PathBuf) -> Result<(), Error> { } } -fn find_vcpkg_target(msvc_target: &MSVCTarget) -> Result<VcpkgTarget, Error> { - let vcpkg_root = try!(find_vcpkg_root()); +fn find_vcpkg_target(cfg: &Config, msvc_target: &MSVCTarget) -> Result<VcpkgTarget, Error> { + let vcpkg_root = try!(find_vcpkg_root(&cfg)); try!(validate_vcpkg_root(&vcpkg_root)); - let static_lib = env::var("CARGO_CFG_TARGET_FEATURE") - .unwrap_or(String::new()) // rustc 1.10 - .contains("crt-static"); + let (static_lib, static_appendage, lib_suffix, strip_lib_prefix) = match msvc_target { + &MSVCTarget::X64Windows | &MSVCTarget::X86Windows => { + let static_lib = env::var("CARGO_CFG_TARGET_FEATURE") + .unwrap_or(String::new()) // rustc 1.10 + .contains("crt-static"); + let static_appendage = if static_lib { "-static" } else { "" }; + (static_lib, static_appendage, "lib", false) + } + _ => (true, "", "a", true), + }; let mut base = vcpkg_root; base.push("installed"); let status_path = base.join("vcpkg"); - let static_appendage = if static_lib { "-static" } else { "" }; - let vcpkg_triple = format!("{}{}", msvc_target.to_string(), static_appendage); base.push(&vcpkg_triple); @@ -314,6 +341,8 @@ fn find_vcpkg_target(msvc_target: &MSVCTarget) -> Result<VcpkgTarget, Error> { include_path: include_path, is_static: static_lib, status_path: status_path, + lib_suffix: lib_suffix.to_owned(), + strip_lib_prefix: strip_lib_prefix, }) } @@ -333,11 +362,12 @@ fn load_port_manifest( path: &PathBuf, port: &str, version: &str, - vcpkg_triple: &str, + vcpkg_target: &VcpkgTarget, ) -> Result<(Vec<String>, Vec<String>), Error> { - let manifest_file = path - .join("info") - .join(format!("{}_{}_{}.list", port, version, vcpkg_triple)); + let manifest_file = path.join("info").join(format!( + "{}_{}_{}.list", + port, version, vcpkg_target.vcpkg_triple + )); let mut dlls = Vec::new(); let mut libs = Vec::new(); @@ -351,8 +381,8 @@ fn load_port_manifest( let file = BufReader::new(&f); - let dll_prefix = Path::new(vcpkg_triple).join("bin"); - let lib_prefix = Path::new(vcpkg_triple).join("lib"); + let dll_prefix = Path::new(&vcpkg_target.vcpkg_triple).join("bin"); + let lib_prefix = Path::new(&vcpkg_target.vcpkg_triple).join("lib"); for line in file.lines() { let line = line.unwrap(); @@ -368,10 +398,12 @@ fn load_port_manifest( dll.to_str().map(|s| dlls.push(s.to_owned())); } } else if let Ok(lib) = file_path.strip_prefix(&lib_prefix) { - if lib.extension() == Some(OsStr::new("lib")) + if lib.extension() == Some(OsStr::new(&vcpkg_target.lib_suffix)) && lib.components().collect::<Vec<_>>().len() == 1 { - lib.to_str().map(|s| libs.push(s.to_owned())); + if let Some(lib) = vcpkg_target.link_name_for_lib(lib) { + libs.push(lib); + } } } } @@ -423,7 +455,7 @@ fn load_port_file( } fn load_ports(target: &VcpkgTarget) -> Result<BTreeMap<String, Port>, Error> { - let mut ports = BTreeMap::new(); + let mut ports: BTreeMap<String, Port> = BTreeMap::new(); let mut port_info: Vec<BTreeMap<String, String>> = Vec::new(); @@ -446,17 +478,15 @@ fn load_ports(target: &VcpkgTarget) -> Result<BTreeMap<String, Port>, Error> { ); // get all of the paths of the update files into a Vec<PathBuf> - let mut paths = try!( - paths - .map(|rde| rde.map(|de| de.path())) // Result<DirEntry, io::Error> -> Result<PathBuf, io::Error> - .collect::<Result<Vec<_>, _>>() // collect into Result<Vec<PathBuf>, io::Error> - .map_err(|e| { - Error::VcpkgInstallation(format!( - "could not read status file update filenames: {}", - e - )) - }) - ); + let mut paths = try!(paths + .map(|rde| rde.map(|de| de.path())) // Result<DirEntry, io::Error> -> Result<PathBuf, io::Error> + .collect::<Result<Vec<_>, _>>() // collect into Result<Vec<PathBuf>, io::Error> + .map_err(|e| { + Error::VcpkgInstallation(format!( + "could not read status file update filenames: {}", + e + )) + })); // Sort the paths and read them. This could be done directly from the iterator if // read_dir() guarantees that the files will be read in alpha order but that appears @@ -464,65 +494,70 @@ fn load_ports(target: &VcpkgTarget) -> Result<BTreeMap<String, Port>, Error> { // https://doc.rust-lang.org/nightly/std/fs/fn.read_dir.html#platform-specific-behavior paths.sort(); for path in paths { - // println!("Name: {}", path.display()); + // println!("Name: {}", path.display()); try!(load_port_file(&path, &mut port_info)); } + //println!("{:#?}", port_info); + let mut seen_names = BTreeMap::new(); for current in &port_info { - if let Some(name) = current.get("Package") { - if let Some(arch) = current.get("Architecture") { - if *arch == target.vcpkg_triple { - // println!("-++++++-"); - // println!("{:?}", current); - // println!("--------"); - - let mut deps = if let Some(deps) = current.get("Depends") { - deps.split(", ").map(|x| x.to_owned()).collect() - } else { - Vec::new() - }; - - if current - .get("Status") - .unwrap_or(&String::new()) - .ends_with(" installed") - { - match (current.get("Version"), current.get("Feature")) { - (Some(version), _) => { - let lib_info = try!(load_port_manifest( - &target.status_path, - name, - version, - &target.vcpkg_triple - )); - let port = Port { - dlls: lib_info.0, - libs: lib_info.1, - deps: deps, - }; - - ports.insert(name.clone(), port); - } - (_, Some(_feature)) => match ports.get_mut(name) { - Some(ref mut port) => { - port.deps.append(&mut deps); - } - _ => { - println!("found a feature that had no corresponding port :-"); - println!("current {:+?}", current); - continue; - } - }, - (_, _) => { - println!("didn't know how to deal with status file entry :-"); - println!("{:+?}", current); - continue; - } + // store them by name and arch, clobbering older details + match ( + current.get("Package"), + current.get("Architecture"), + current.get("Feature"), + ) { + (Some(pkg), Some(arch), feature) => { + seen_names.insert((pkg, arch, feature), current); + } + _ => {} + } + } + + for (&(name, arch, feature), current) in &seen_names { + if **arch == target.vcpkg_triple { + let mut deps = if let Some(deps) = current.get("Depends") { + deps.split(", ").map(|x| x.to_owned()).collect() + } else { + Vec::new() + }; + + if current + .get("Status") + .unwrap_or(&String::new()) + .ends_with(" installed") + { + match (current.get("Version"), feature) { + (Some(version), _) => { + // this failing here and bailing out causes everything to fail + let lib_info = try!(load_port_manifest( + &target.status_path, + &name, + version, + &target + )); + let port = Port { + dlls: lib_info.0, + libs: lib_info.1, + deps: deps, + }; + + ports.insert(name.to_string(), port); + } + (_, Some(_feature)) => match ports.get_mut(name) { + Some(ref mut port) => { + port.deps.append(&mut deps); + } + _ => { + println!("found a feature that had no corresponding port :-"); + println!("current {:+?}", current); + continue; } - } else { - // remove it? - //ports.remove(name); - //println!("would delete {} for arch {}", name, arch); + }, + (_, _) => { + println!("didn't know how to deal with status file entry :-"); + println!("{:+?}", current); + continue; } } } @@ -543,6 +578,23 @@ struct VcpkgTarget { status_path: PathBuf, is_static: bool, + lib_suffix: String, + + /// strip 'lib' from library names in linker args? + strip_lib_prefix: bool, +} + +impl VcpkgTarget { + fn link_name_for_lib(&self, filename: &std::path::Path) -> Option<String> { + if self.strip_lib_prefix { + filename.to_str().map(|s| s.to_owned()) + // filename + // .to_str() + // .map(|s| s.trim_left_matches("lib").to_owned()) + } else { + filename.to_str().map(|s| s.to_owned()) + } + } } impl Config { @@ -602,6 +654,13 @@ impl Config { self } + /// Define which path to use as vcpkg root overriding the VCPKG_ROOT environment variable + /// Default to `None`, which means use VCPKG_ROOT or try to find out automatically + pub fn vcpkg_root(&mut self, vcpkg_root: PathBuf) -> &mut Config { + self.vcpkg_root = Some(vcpkg_root); + self + } + /// Find the library `port_name` in a Vcpkg tree. /// /// This will use all configuration previously set to select the @@ -642,7 +701,7 @@ impl Config { self.required_dlls.push(port_name.to_owned()); } - let vcpkg_target = try!(find_vcpkg_target(&msvc_target)); + let vcpkg_target = try!(find_vcpkg_target(&self, &msvc_target)); // require explicit opt-in before using dynamically linked // variants, otherwise cargo install of various things will @@ -699,12 +758,20 @@ impl Config { for required_lib in &self.required_libs { // this could use static-nobundle= for static libraries but it is apparently // not necessary to make the distinction for windows-msvc. + + let link_name = match vcpkg_target.strip_lib_prefix { + true => required_lib.trim_left_matches("lib"), + false => required_lib, + }; + lib.cargo_metadata - .push(format!("cargo:rustc-link-lib={}", required_lib)); + .push(format!("cargo:rustc-link-lib={}", link_name)); + + lib.found_names.push(String::from(link_name)); // verify that the library exists let mut lib_location = vcpkg_target.lib_path.clone(); - lib_location.push(required_lib.clone() + ".lib"); + lib_location.push(required_lib.clone() + "." + &vcpkg_target.lib_suffix); if !lib_location.exists() { return Err(Error::LibNotFound(lib_location.display().to_string())); @@ -798,7 +865,8 @@ impl Config { return Err(Error::DisabledByEnv(abort_var_name)); } - let vcpkg_target = try!(find_vcpkg_target(&msvc_target)); + let vcpkg_target = try!(find_vcpkg_target(&self, &msvc_target)); + let mut required_port_order = Vec::new(); // if no overrides have been selected, then the Vcpkg port name // is the the .lib name and the .dll name @@ -811,7 +879,6 @@ impl Config { // the complete set of ports required let mut required_ports: BTreeMap<String, Port> = BTreeMap::new(); - // working of ports that we need to include // let mut ports_to_scan: BTreeSet<String> = BTreeSet::new(); // ports_to_scan.insert(port_name.to_owned()); @@ -828,7 +895,9 @@ impl Config { for dep in &port.deps { ports_to_scan.push(dep.clone()); } - required_ports.insert(port_name, (*port).clone()); + required_ports.insert(port_name.clone(), (*port).clone()); + remove_item(&mut required_port_order, &port_name); + required_port_order.push(port_name); } else { // what? } @@ -837,15 +906,20 @@ impl Config { // for port in ports { // println!("port {:?}", port); // } + // println!("== Looking for port {}", port_name); + // for port in &required_port_order { + // println!("ordered required port {:?}", port); + // } // println!("============================="); - //for port in &required_ports { - // println!("required port {:?}", port); - //} + // for port in &required_ports { + // println!("required port {:?}", port); + // } // if no overrides have been selected, then the Vcpkg port name // is the the .lib name and the .dll name if self.required_libs.is_empty() { - for (_, port) in &required_ports { + for port_name in &required_port_order { + let port = required_ports.get(port_name).unwrap(); self.required_libs.extend(port.libs.iter().map(|s| { Path::new(&s) .file_stem() @@ -901,6 +975,8 @@ impl Config { lib.dll_paths.push(vcpkg_target.bin_path.clone()); } + lib.ports = required_port_order; + try!(self.emit_libs(&mut lib, &vcpkg_target)); if self.copy_dlls { @@ -916,6 +992,13 @@ impl Config { } } +fn remove_item(cont: &mut Vec<String>, item: &String) -> Option<String> { + match cont.iter().position(|x| *x == *item) { + Some(pos) => Some(cont.remove(pos)), + None => None, + } +} + impl Library { fn new(is_static: bool) -> Library { Library { @@ -926,6 +1009,8 @@ impl Library { is_static: is_static, found_dlls: Vec::new(), found_libs: Vec::new(), + found_names: Vec::new(), + ports: Vec::new(), } } } @@ -939,13 +1024,17 @@ fn envify(name: &str) -> String { fn msvc_target() -> Result<MSVCTarget, Error> { let target = env::var("TARGET").unwrap_or(String::new()); - if !target.contains("-pc-windows-msvc") { + if target == "x86_64-apple-darwin" { + Ok(MSVCTarget::X64MacOS) + } else if target == "x86_64-unknown-linux-gnu" { + Ok(MSVCTarget::X64Linux) + } else if !target.contains("-pc-windows-msvc") { Err(Error::NotMSVC) } else if target.starts_with("x86_64-") { - Ok(MSVCTarget::X64) + Ok(MSVCTarget::X64Windows) } else { // everything else is x86 - Ok(MSVCTarget::X86) + Ok(MSVCTarget::X86Windows) } } @@ -963,10 +1052,10 @@ mod tests { } #[test] - fn do_nothing_for_non_msvc_target() { + fn do_nothing_for_unsupported_target() { let _g = LOCK.lock(); env::set_var("VCPKG_ROOT", "/"); - env::set_var("TARGET", "x86_64-unknown-linux-gnu"); + env::set_var("TARGET", "x86_64-pc-windows-gnu"); assert!(match ::probe_package("foo") { Err(Error::NotMSVC) => true, _ => false, @@ -1100,6 +1189,75 @@ mod tests { clean_env(); } + #[test] + fn link_lib_name_is_correct() { + let _g = LOCK.lock(); + + for target in &[ + "x86_64-apple-darwin", + "i686-pc-windows-msvc", + // "x86_64-pc-windows-msvc", + // "x86_64-unknown-linux-gnu", + ] { + clean_env(); + env::set_var("VCPKG_ROOT", vcpkg_test_tree_loc("normalized")); + env::set_var("TARGET", target); + env::set_var("VCPKGRS_DYNAMIC", "1"); + let tmp_dir = tempdir::TempDir::new("vcpkg_tests").unwrap(); + env::set_var("OUT_DIR", tmp_dir.path()); + + println!("Result is {:?}", ::find_package("harfbuzz")); + assert!(match ::find_package("harfbuzz") { + Ok(lib) => lib + .cargo_metadata + .iter() + .find(|&x| x == "cargo:rustc-link-lib=harfbuzz") + .is_some(), + _ => false, + }); + clean_env(); + } + } + + #[test] + fn link_dependencies_after_port() { + let _g = LOCK.lock(); + clean_env(); + env::set_var("VCPKG_ROOT", vcpkg_test_tree_loc("normalized")); + env::set_var("TARGET", "i686-pc-windows-msvc"); + env::set_var("VCPKGRS_DYNAMIC", "1"); + let tmp_dir = tempdir::TempDir::new("vcpkg_tests").unwrap(); + env::set_var("OUT_DIR", tmp_dir.path()); + + let lib = ::find_package("harfbuzz").unwrap(); + + check_before(&lib, "freetype", "zlib"); + check_before(&lib, "freetype", "bzip2"); + check_before(&lib, "freetype", "libpng"); + check_before(&lib, "harfbuzz", "freetype"); + check_before(&lib, "harfbuzz", "ragel"); + check_before(&lib, "libpng", "zlib"); + + clean_env(); + + fn check_before(lib: &Library, earlier: &str, later: &str) { + match ( + lib.ports.iter().position(|x| *x == *earlier), + lib.ports.iter().position(|x| *x == *later), + ) { + (Some(earlier_pos), Some(later_pos)) if earlier_pos < later_pos => { + // ok + } + _ => { + println!( + "earlier: {}, later: {}\nLibrary found: {:#?}", + earlier, later, lib + ); + panic!(); + } + } + } + } // #[test] // fn dynamic_build_package_specific_bailout() { // clean_env(); diff --git a/vendor/wasi-0.7.0/.cargo-checksum.json b/vendor/wasi-0.7.0/.cargo-checksum.json deleted file mode 100644 index 05b3487c5b..0000000000 --- a/vendor/wasi-0.7.0/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"0001-maybe.patch":"dd31bce7efe504936997f9c70393669c7de0c5540e3959ed0fc0f8a6995e3dc7","CODE_OF_CONDUCT.md":"150186a4a1b800deb2c6a3b92d45309d642bf4a4809c6b9ad0d0cecc748ff35f","CONTRIBUTING.md":"2c908a3e263dc35dfed131c02ff907cd72fafb2c2096e4ba9b1e0cbb7a1b76df","Cargo.toml":"08fb0a100434ed14b2cff8df249f1f64fed24475c42bb83f80d66aaa75994286","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-Apache-2.0_WITH_LLVM-exception":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"8c2c48d3d9bedad58a5f009de60dfde23a881c1876e0614a79e3ae5812a8e501","clip.log":"aeeb8345316e353928688a115b56bb871d8f02922d585a610e896bce76ef62ad","old-bitflags.patch":"6a35cdbe866fbb51608195b74f0e6c0d37201ed933e473588cc2ab6211916b40","rusty-tags.vi":"6da631ead7ad10debc2898a056f6b296bb2747430b22d4316e53cf1c75f44c68","src/lib.rs":"7fdbffee8f74702cfc98f277ebbc61b3b056d2da45c97735bf9477d1de72bebd","src/wasi_unstable/mod.rs":"8c2c276ff116b0f350815c9583228d594fae9ee33d665ae9cc5a0d685003fa23","src/wasi_unstable/raw.rs":"57914dc0d1425ec1f406aa902dce5076feafda05aeb89de0df53dcf26a948615"},"package":"b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"} \ No newline at end of file diff --git a/vendor/wasi-0.7.0/0001-maybe.patch b/vendor/wasi-0.7.0/0001-maybe.patch deleted file mode 100644 index 1a2e2b138e..0000000000 --- a/vendor/wasi-0.7.0/0001-maybe.patch +++ /dev/null @@ -1,1178 +0,0 @@ -From 62f535fa4e1a259aabd5f22449af01e32aeb6f47 Mon Sep 17 00:00:00 2001 -From: Dan Gohman <sunfish@mozilla.com> -Date: Tue, 23 Jul 2019 10:23:06 -0700 -Subject: [PATCH] maybe - ---- - src/wasi_unstable/constants.rs | 188 +++++++++++++ - src/wasi_unstable/minimal_safe.rs | 336 +++++++++++++++++++++++ - src/wasi_unstable/mod.rs | 431 ++++-------------------------- - src/wasi_unstable/types.rs | 41 +++ - 4 files changed, 623 insertions(+), 373 deletions(-) - create mode 100644 src/wasi_unstable/constants.rs - create mode 100644 src/wasi_unstable/minimal_safe.rs - create mode 100644 src/wasi_unstable/types.rs - -diff --git a/src/wasi_unstable/constants.rs b/src/wasi_unstable/constants.rs -new file mode 100644 -index 0000000..0af896b ---- /dev/null -+++ b/src/wasi_unstable/constants.rs -@@ -0,0 +1,188 @@ -+//! This file defines idiomatic Rust names for constants. -+ -+use crate::wasi_unstable::raw::*; -+use crate::wasi_unstable::types::*; -+ -+pub const ADVICE_NORMAL: Advice = __WASI_ADVICE_NORMAL; -+pub const ADVICE_SEQUENTIAL: Advice = __WASI_ADVICE_SEQUENTIAL; -+pub const ADVICE_RANDOM: Advice = __WASI_ADVICE_RANDOM; -+pub const ADVICE_WILLNEED: Advice = __WASI_ADVICE_WILLNEED; -+pub const ADVICE_DONTNEED: Advice = __WASI_ADVICE_DONTNEED; -+pub const ADVICE_NOREUSE: Advice = __WASI_ADVICE_NOREUSE; -+pub const CLOCK_REALTIME: ClockId = __WASI_CLOCK_REALTIME; -+pub const CLOCK_MONOTONIC: ClockId = __WASI_CLOCK_MONOTONIC; -+pub const CLOCK_PROCESS_CPUTIME_ID: ClockId = __WASI_CLOCK_PROCESS_CPUTIME_ID; -+pub const CLOCK_THREAD_CPUTIME_ID: ClockId = __WASI_CLOCK_THREAD_CPUTIME_ID; -+pub const DIRCOOKIE_START: DirCookie = __WASI_DIRCOOKIE_START; -+pub const ESUCCESS: Errno = __WASI_ESUCCESS; -+pub const E2BIG: Errno = __WASI_E2BIG; -+pub const EACCES: Errno = __WASI_EACCES; -+pub const EADDRINUSE: Errno = __WASI_EADDRINUSE; -+pub const EADDRNOTAVAIL: Errno = __WASI_EADDRNOTAVAIL; -+pub const EAFNOSUPPORT: Errno = __WASI_EAFNOSUPPORT; -+pub const EAGAIN: Errno = __WASI_EAGAIN; -+pub const EALREADY: Errno = __WASI_EALREADY; -+pub const EBADF: Errno = __WASI_EBADF; -+pub const EBADMSG: Errno = __WASI_EBADMSG; -+pub const EBUSY: Errno = __WASI_EBUSY; -+pub const ECANCELED: Errno = __WASI_ECANCELED; -+pub const ECHILD: Errno = __WASI_ECHILD; -+pub const ECONNABORTED: Errno = __WASI_ECONNABORTED; -+pub const ECONNREFUSED: Errno = __WASI_ECONNREFUSED; -+pub const ECONNRESET: Errno = __WASI_ECONNRESET; -+pub const EDEADLK: Errno = __WASI_EDEADLK; -+pub const EDESTADDRREQ: Errno = __WASI_EDESTADDRREQ; -+pub const EDOM: Errno = __WASI_EDOM; -+pub const EDQUOT: Errno = __WASI_EDQUOT; -+pub const EEXIST: Errno = __WASI_EEXIST; -+pub const EFAULT: Errno = __WASI_EFAULT; -+pub const EFBIG: Errno = __WASI_EFBIG; -+pub const EHOSTUNREACH: Errno = __WASI_EHOSTUNREACH; -+pub const EIDRM: Errno = __WASI_EIDRM; -+pub const EILSEQ: Errno = __WASI_EILSEQ; -+pub const EINPROGRESS: Errno = __WASI_EINPROGRESS; -+pub const EINTR: Errno = __WASI_EINTR; -+pub const EINVAL: Errno = __WASI_EINVAL; -+pub const EIO: Errno = __WASI_EIO; -+pub const EISCONN: Errno = __WASI_EISCONN; -+pub const EISDIR: Errno = __WASI_EISDIR; -+pub const ELOOP: Errno = __WASI_ELOOP; -+pub const EMFILE: Errno = __WASI_EMFILE; -+pub const EMLINK: Errno = __WASI_EMLINK; -+pub const EMSGSIZE: Errno = __WASI_EMSGSIZE; -+pub const EMULTIHOP: Errno = __WASI_EMULTIHOP; -+pub const ENAMETOOLONG: Errno = __WASI_ENAMETOOLONG; -+pub const ENETDOWN: Errno = __WASI_ENETDOWN; -+pub const ENETRESET: Errno = __WASI_ENETRESET; -+pub const ENETUNREACH: Errno = __WASI_ENETUNREACH; -+pub const ENFILE: Errno = __WASI_ENFILE; -+pub const ENOBUFS: Errno = __WASI_ENOBUFS; -+pub const ENODEV: Errno = __WASI_ENODEV; -+pub const ENOENT: Errno = __WASI_ENOENT; -+pub const ENOEXEC: Errno = __WASI_ENOEXEC; -+pub const ENOLCK: Errno = __WASI_ENOLCK; -+pub const ENOLINK: Errno = __WASI_ENOLINK; -+pub const ENOMEM: Errno = __WASI_ENOMEM; -+pub const ENOMSG: Errno = __WASI_ENOMSG; -+pub const ENOPROTOOPT: Errno = __WASI_ENOPROTOOPT; -+pub const ENOSPC: Errno = __WASI_ENOSPC; -+pub const ENOSYS: Errno = __WASI_ENOSYS; -+pub const ENOTCONN: Errno = __WASI_ENOTCONN; -+pub const ENOTDIR: Errno = __WASI_ENOTDIR; -+pub const ENOTEMPTY: Errno = __WASI_ENOTEMPTY; -+pub const ENOTRECOVERABLE: Errno = __WASI_ENOTRECOVERABLE; -+pub const ENOTSOCK: Errno = __WASI_ENOTSOCK; -+pub const ENOTSUP: Errno = __WASI_ENOTSUP; -+pub const ENOTTY: Errno = __WASI_ENOTTY; -+pub const ENXIO: Errno = __WASI_ENXIO; -+pub const EOVERFLOW: Errno = __WASI_EOVERFLOW; -+pub const EOWNERDEAD: Errno = __WASI_EOWNERDEAD; -+pub const EPERM: Errno = __WASI_EPERM; -+pub const EPIPE: Errno = __WASI_EPIPE; -+pub const EPROTO: Errno = __WASI_EPROTO; -+pub const EPROTONOSUPPORT: Errno = __WASI_EPROTONOSUPPORT; -+pub const EPROTOTYPE: Errno = __WASI_EPROTOTYPE; -+pub const ERANGE: Errno = __WASI_ERANGE; -+pub const EROFS: Errno = __WASI_EROFS; -+pub const ESPIPE: Errno = __WASI_ESPIPE; -+pub const ESRCH: Errno = __WASI_ESRCH; -+pub const ESTALE: Errno = __WASI_ESTALE; -+pub const ETIMEDOUT: Errno = __WASI_ETIMEDOUT; -+pub const ETXTBSY: Errno = __WASI_ETXTBSY; -+pub const EXDEV: Errno = __WASI_EXDEV; -+pub const ENOTCAPABLE: Errno = __WASI_ENOTCAPABLE; -+pub const EVENT_FD_READWRITE_HANGUP: EventRwFlags = __WASI_EVENT_FD_READWRITE_HANGUP; -+pub const EVENTTYPE_CLOCK: EventType = __WASI_EVENTTYPE_CLOCK; -+pub const EVENTTYPE_FD_READ: EventType = __WASI_EVENTTYPE_FD_READ; -+pub const EVENTTYPE_FD_WRITE: EventType = __WASI_EVENTTYPE_FD_WRITE; -+pub const FDFLAG_APPEND: FdFlags = __WASI_FDFLAG_APPEND; -+pub const FDFLAG_DSYNC: FdFlags = __WASI_FDFLAG_DSYNC; -+pub const FDFLAG_NONBLOCK: FdFlags = __WASI_FDFLAG_NONBLOCK; -+pub const FDFLAG_RSYNC: FdFlags = __WASI_FDFLAG_RSYNC; -+pub const FDFLAG_SYNC: FdFlags = __WASI_FDFLAG_SYNC; -+pub const FILETYPE_UNKNOWN: FileType = __WASI_FILETYPE_UNKNOWN; -+pub const FILETYPE_BLOCK_DEVICE: FileType = __WASI_FILETYPE_BLOCK_DEVICE; -+pub const FILETYPE_CHARACTER_DEVICE: FileType = __WASI_FILETYPE_CHARACTER_DEVICE; -+pub const FILETYPE_DIRECTORY: FileType = __WASI_FILETYPE_DIRECTORY; -+pub const FILETYPE_REGULAR_FILE: FileType = __WASI_FILETYPE_REGULAR_FILE; -+pub const FILETYPE_SOCKET_DGRAM: FileType = __WASI_FILETYPE_SOCKET_DGRAM; -+pub const FILETYPE_SOCKET_STREAM: FileType = __WASI_FILETYPE_SOCKET_STREAM; -+pub const FILETYPE_SYMBOLIC_LINK: FileType = __WASI_FILETYPE_SYMBOLIC_LINK; -+pub const FILESTAT_SET_ATIM: FstFlags = __WASI_FILESTAT_SET_ATIM; -+pub const FILESTAT_SET_ATIM_NOW: FstFlags = __WASI_FILESTAT_SET_ATIM_NOW; -+pub const FILESTAT_SET_MTIM: FstFlags = __WASI_FILESTAT_SET_MTIM; -+pub const FILESTAT_SET_MTIM_NOW: FstFlags = __WASI_FILESTAT_SET_MTIM_NOW; -+pub const LOOKUP_SYMLINK_FOLLOW: LookupFlags = __WASI_LOOKUP_SYMLINK_FOLLOW; -+pub const O_CREAT: OFlags = __WASI_O_CREAT; -+pub const O_DIRECTORY: OFlags = __WASI_O_DIRECTORY; -+pub const O_EXCL: OFlags = __WASI_O_EXCL; -+pub const O_TRUNC: OFlags = __WASI_O_TRUNC; -+pub const PREOPENTYPE_DIR: PreopenType = __WASI_PREOPENTYPE_DIR; -+pub const SOCK_RECV_PEEK: RiFlags = __WASI_SOCK_RECV_PEEK; -+pub const SOCK_RECV_WAITALL: RiFlags = __WASI_SOCK_RECV_WAITALL; -+pub const RIGHT_FD_DATASYNC: Rights = __WASI_RIGHT_FD_DATASYNC; -+pub const RIGHT_FD_READ: Rights = __WASI_RIGHT_FD_READ; -+pub const RIGHT_FD_SEEK: Rights = __WASI_RIGHT_FD_SEEK; -+pub const RIGHT_FD_FDSTAT_SET_FLAGS: Rights = __WASI_RIGHT_FD_FDSTAT_SET_FLAGS; -+pub const RIGHT_FD_SYNC: Rights = __WASI_RIGHT_FD_SYNC; -+pub const RIGHT_FD_TELL: Rights = __WASI_RIGHT_FD_TELL; -+pub const RIGHT_FD_WRITE: Rights = __WASI_RIGHT_FD_WRITE; -+pub const RIGHT_FD_ADVISE: Rights = __WASI_RIGHT_FD_ADVISE; -+pub const RIGHT_FD_ALLOCATE: Rights = __WASI_RIGHT_FD_ALLOCATE; -+pub const RIGHT_PATH_CREATE_DIRECTORY: Rights = __WASI_RIGHT_PATH_CREATE_DIRECTORY; -+pub const RIGHT_PATH_CREATE_FILE: Rights = __WASI_RIGHT_PATH_CREATE_FILE; -+pub const RIGHT_PATH_LINK_SOURCE: Rights = __WASI_RIGHT_PATH_LINK_SOURCE; -+pub const RIGHT_PATH_LINK_TARGET: Rights = __WASI_RIGHT_PATH_LINK_TARGET; -+pub const RIGHT_PATH_OPEN: Rights = __WASI_RIGHT_PATH_OPEN; -+pub const RIGHT_FD_READDIR: Rights = __WASI_RIGHT_FD_READDIR; -+pub const RIGHT_PATH_READLINK: Rights = __WASI_RIGHT_PATH_READLINK; -+pub const RIGHT_PATH_RENAME_SOURCE: Rights = __WASI_RIGHT_PATH_RENAME_SOURCE; -+pub const RIGHT_PATH_RENAME_TARGET: Rights = __WASI_RIGHT_PATH_RENAME_TARGET; -+pub const RIGHT_PATH_FILESTAT_GET: Rights = __WASI_RIGHT_PATH_FILESTAT_GET; -+pub const RIGHT_PATH_FILESTAT_SET_SIZE: Rights = __WASI_RIGHT_PATH_FILESTAT_SET_SIZE; -+pub const RIGHT_PATH_FILESTAT_SET_TIMES: Rights = __WASI_RIGHT_PATH_FILESTAT_SET_TIMES; -+pub const RIGHT_FD_FILESTAT_GET: Rights = __WASI_RIGHT_FD_FILESTAT_GET; -+pub const RIGHT_FD_FILESTAT_SET_SIZE: Rights = __WASI_RIGHT_FD_FILESTAT_SET_SIZE; -+pub const RIGHT_FD_FILESTAT_SET_TIMES: Rights = __WASI_RIGHT_FD_FILESTAT_SET_TIMES; -+pub const RIGHT_PATH_SYMLINK: Rights = __WASI_RIGHT_PATH_SYMLINK; -+pub const RIGHT_PATH_REMOVE_DIRECTORY: Rights = __WASI_RIGHT_PATH_REMOVE_DIRECTORY; -+pub const RIGHT_PATH_UNLINK_FILE: Rights = __WASI_RIGHT_PATH_UNLINK_FILE; -+pub const RIGHT_POLL_FD_READWRITE: Rights = __WASI_RIGHT_POLL_FD_READWRITE; -+pub const RIGHT_SOCK_SHUTDOWN: Rights = __WASI_RIGHT_SOCK_SHUTDOWN; -+pub const SOCK_RECV_DATA_TRUNCATED: RoFlags = __WASI_SOCK_RECV_DATA_TRUNCATED; -+pub const SHUT_RD: SdFlags = __WASI_SHUT_RD; -+pub const SHUT_WR: SdFlags = __WASI_SHUT_WR; -+pub const SIGHUP: Signal = __WASI_SIGHUP; -+pub const SIGINT: Signal = __WASI_SIGINT; -+pub const SIGQUIT: Signal = __WASI_SIGQUIT; -+pub const SIGILL: Signal = __WASI_SIGILL; -+pub const SIGTRAP: Signal = __WASI_SIGTRAP; -+pub const SIGABRT: Signal = __WASI_SIGABRT; -+pub const SIGBUS: Signal = __WASI_SIGBUS; -+pub const SIGFPE: Signal = __WASI_SIGFPE; -+pub const SIGKILL: Signal = __WASI_SIGKILL; -+pub const SIGUSR1: Signal = __WASI_SIGUSR1; -+pub const SIGSEGV: Signal = __WASI_SIGSEGV; -+pub const SIGUSR2: Signal = __WASI_SIGUSR2; -+pub const SIGPIPE: Signal = __WASI_SIGPIPE; -+pub const SIGALRM: Signal = __WASI_SIGALRM; -+pub const SIGTERM: Signal = __WASI_SIGTERM; -+pub const SIGCHLD: Signal = __WASI_SIGCHLD; -+pub const SIGCONT: Signal = __WASI_SIGCONT; -+pub const SIGSTOP: Signal = __WASI_SIGSTOP; -+pub const SIGTSTP: Signal = __WASI_SIGTSTP; -+pub const SIGTTIN: Signal = __WASI_SIGTTIN; -+pub const SIGTTOU: Signal = __WASI_SIGTTOU; -+pub const SIGURG: Signal = __WASI_SIGURG; -+pub const SIGXCPU: Signal = __WASI_SIGXCPU; -+pub const SIGXFSZ: Signal = __WASI_SIGXFSZ; -+pub const SIGVTALRM: Signal = __WASI_SIGVTALRM; -+pub const SIGPROF: Signal = __WASI_SIGPROF; -+pub const SIGWINCH: Signal = __WASI_SIGWINCH; -+pub const SIGPOLL: Signal = __WASI_SIGPOLL; -+pub const SIGPWR: Signal = __WASI_SIGPWR; -+pub const SIGSYS: Signal = __WASI_SIGSYS; -+pub const SUBSCRIPTION_CLOCK_ABSTIME: SubclockFlags = __WASI_SUBSCRIPTION_CLOCK_ABSTIME; -+pub const WHENCE_CUR: Whence = __WASI_WHENCE_CUR; -+pub const WHENCE_END: Whence = __WASI_WHENCE_END; -+pub const WHENCE_SET: Whence = __WASI_WHENCE_SET; -diff --git a/src/wasi_unstable/minimal_safe.rs b/src/wasi_unstable/minimal_safe.rs -new file mode 100644 -index 0000000..91a1ef1 ---- /dev/null -+++ b/src/wasi_unstable/minimal_safe.rs -@@ -0,0 +1,336 @@ -+//! This file defines minimally safe wrappers around the raw functions. -+//! Pointer-length pairs are translated to Rust slice, and output pointer -+//! parameters are translated to output reference parameters. -+//! -+//! These are primarily useful for writing low-level API tests. For most -+//! other use cases, the interfaces defined in the top-level `wasi_unstable` -+//! module will be easier to use. -+ -+use crate::wasi_unstable::raw::*; -+use core::ffi::c_void; -+ -+pub use crate::wasi_unstable::constants::*; -+pub use crate::wasi_unstable::types::*; -+ -+#[inline] -+pub fn clock_res_get(clock_id: ClockId, resolution: &mut Timestamp) -> Errno { -+ unsafe { __wasi_clock_res_get(clock_id, resolution) } -+} -+ -+#[inline] -+pub fn clock_time_get(clock_id: ClockId, precision: Timestamp, time: &mut Timestamp) -> Errno { -+ unsafe { __wasi_clock_time_get(clock_id, precision, time) } -+} -+ -+#[inline] -+pub fn fd_pread(fd: Fd, iovs: &[IoVec], offset: FileSize, nread: &mut usize) -> Errno { -+ unsafe { __wasi_fd_pread(fd, iovs.as_ptr(), iovs.len(), offset, nread) } -+} -+ -+#[inline] -+pub fn fd_pwrite(fd: Fd, iovs: &[CIoVec], offset: FileSize, nwritten: &mut usize) -> Errno { -+ unsafe { __wasi_fd_pwrite(fd, iovs.as_ptr(), iovs.len(), offset, nwritten) } -+} -+ -+#[inline] -+pub fn random_get(buf: &mut [u8]) -> Errno { -+ unsafe { __wasi_random_get(buf.as_mut_ptr() as *mut c_void, buf.len()) } -+} -+ -+#[inline] -+pub fn fd_close(fd: Fd) -> Errno { -+ unsafe { __wasi_fd_close(fd) } -+} -+ -+#[inline] -+pub fn fd_datasync(fd: Fd) -> Errno { -+ unsafe { __wasi_fd_datasync(fd) } -+} -+ -+#[inline] -+pub fn fd_read(fd: Fd, iovs: &[IoVec], nread: &mut usize) -> Errno { -+ unsafe { __wasi_fd_read(fd, iovs.as_ptr(), iovs.len(), nread) } -+} -+ -+#[inline] -+pub fn fd_renumber(from: Fd, to: Fd) -> Errno { -+ unsafe { __wasi_fd_renumber(from, to) } -+} -+ -+#[inline] -+pub fn fd_seek(fd: Fd, offset: FileDelta, whence: Whence, newoffset: &mut FileSize) -> Errno { -+ unsafe { __wasi_fd_seek(fd, offset, whence, newoffset) } -+} -+ -+#[inline] -+pub fn fd_tell(fd: Fd, newoffset: &mut FileSize) -> Errno { -+ unsafe { __wasi_fd_tell(fd, newoffset) } -+} -+ -+#[inline] -+pub fn fd_fdstat_get(fd: Fd, buf: &mut FdStat) -> Errno { -+ unsafe { __wasi_fd_fdstat_get(fd, buf) } -+} -+ -+#[inline] -+pub fn fd_fdstat_set_flags(fd: Fd, flags: FdFlags) -> Errno { -+ unsafe { __wasi_fd_fdstat_set_flags(fd, flags) } -+} -+ -+#[inline] -+pub fn fd_fdstat_set_rights(fd: Fd, fs_rights_base: Rights, fs_rights_inheriting: Rights) -> Errno { -+ unsafe { __wasi_fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting) } -+} -+ -+#[inline] -+pub fn fd_sync(fd: Fd) -> Errno { -+ unsafe { __wasi_fd_sync(fd) } -+} -+ -+#[inline] -+pub fn fd_write(fd: Fd, iovs: &[CIoVec], nwritten: &mut usize) -> Errno { -+ unsafe { __wasi_fd_write(fd, iovs.as_ptr(), iovs.len(), nwritten) } -+} -+ -+#[inline] -+pub fn fd_advise(fd: Fd, offset: FileSize, len: FileSize, advice: Advice) -> Errno { -+ unsafe { __wasi_fd_advise(fd, offset, len, advice) } -+} -+ -+#[inline] -+pub fn fd_allocate(fd: Fd, offset: FileSize, len: FileSize) -> Errno { -+ unsafe { __wasi_fd_allocate(fd, offset, len) } -+} -+ -+#[inline] -+pub fn path_create_directory(fd: Fd, path: &[u8]) -> Errno { -+ unsafe { __wasi_path_create_directory(fd, path.as_ptr(), path.len()) } -+} -+ -+#[inline] -+pub fn path_link( -+ old_fd: Fd, -+ old_flags: LookupFlags, -+ old_path: &[u8], -+ new_fd: Fd, -+ new_path: &[u8], -+) -> Errno { -+ unsafe { -+ __wasi_path_link( -+ old_fd, -+ old_flags, -+ old_path.as_ptr(), -+ old_path.len(), -+ new_fd, -+ new_path.as_ptr(), -+ new_path.len(), -+ ) -+ } -+} -+ -+#[inline] -+#[allow(clippy::too_many_arguments)] -+pub fn path_open( -+ dirfd: Fd, -+ dirflags: LookupFlags, -+ path: &[u8], -+ oflags: OFlags, -+ fs_rights_base: Rights, -+ fs_rights_inheriting: Rights, -+ fs_flags: FdFlags, -+ fd: &mut Fd, -+) -> Errno { -+ unsafe { -+ __wasi_path_open( -+ dirfd, -+ dirflags, -+ path.as_ptr(), -+ path.len(), -+ oflags, -+ fs_rights_base, -+ fs_rights_inheriting, -+ fs_flags, -+ fd, -+ ) -+ } -+} -+ -+#[inline] -+pub fn fd_readdir(fd: Fd, buf: &mut [u8], cookie: DirCookie, bufused: &mut usize) -> Errno { -+ unsafe { -+ __wasi_fd_readdir( -+ fd, -+ buf.as_mut_ptr() as *mut c_void, -+ buf.len(), -+ cookie, -+ bufused, -+ ) -+ } -+} -+ -+#[inline] -+pub fn path_readlink(fd: Fd, path: &[u8], buf: &mut [u8], bufused: &mut usize) -> Errno { -+ unsafe { -+ __wasi_path_readlink( -+ fd, -+ path.as_ptr(), -+ path.len(), -+ buf.as_mut_ptr(), -+ buf.len(), -+ bufused, -+ ) -+ } -+} -+ -+#[inline] -+pub fn path_rename(old_fd: Fd, old_path: &[u8], new_fd: Fd, new_path: &[u8]) -> Errno { -+ unsafe { -+ __wasi_path_rename( -+ old_fd, -+ old_path.as_ptr(), -+ old_path.len(), -+ new_fd, -+ new_path.as_ptr(), -+ new_path.len(), -+ ) -+ } -+} -+ -+#[inline] -+pub fn fd_filestat_get(fd: Fd, buf: &mut FileStat) -> Errno { -+ unsafe { __wasi_fd_filestat_get(fd, buf) } -+} -+ -+#[inline] -+pub fn fd_filestat_set_times( -+ fd: Fd, -+ st_atim: Timestamp, -+ st_mtim: Timestamp, -+ fstflags: FstFlags, -+) -> Errno { -+ unsafe { __wasi_fd_filestat_set_times(fd, st_atim, st_mtim, fstflags) } -+} -+ -+#[inline] -+pub fn fd_filestat_set_size(fd: Fd, st_size: FileSize) -> Errno { -+ unsafe { __wasi_fd_filestat_set_size(fd, st_size) } -+} -+ -+#[inline] -+pub fn path_filestat_get(fd: Fd, flags: LookupFlags, path: &[u8], buf: &mut FileStat) -> Errno { -+ unsafe { __wasi_path_filestat_get(fd, flags, path.as_ptr(), path.len(), buf) } -+} -+ -+#[inline] -+pub fn path_filestat_set_times( -+ fd: Fd, -+ flags: LookupFlags, -+ path: &[u8], -+ st_atim: Timestamp, -+ st_mtim: Timestamp, -+ fstflags: FstFlags, -+) -> Errno { -+ unsafe { -+ __wasi_path_filestat_set_times( -+ fd, -+ flags, -+ path.as_ptr(), -+ path.len(), -+ st_atim, -+ st_mtim, -+ fstflags, -+ ) -+ } -+} -+ -+#[inline] -+pub fn path_symlink(old_path: &[u8], fd: Fd, new_path: &[u8]) -> Errno { -+ unsafe { -+ __wasi_path_symlink( -+ old_path.as_ptr(), -+ old_path.len(), -+ fd, -+ new_path.as_ptr(), -+ new_path.len(), -+ ) -+ } -+} -+ -+#[inline] -+pub fn path_unlink_file(fd: Fd, path: &[u8]) -> Errno { -+ unsafe { __wasi_path_unlink_file(fd, path.as_ptr(), path.len()) } -+} -+ -+#[inline] -+pub fn path_remove_directory(fd: Fd, path: &[u8]) -> Errno { -+ unsafe { __wasi_path_remove_directory(fd, path.as_ptr(), path.len()) } -+} -+ -+#[inline] -+pub fn poll_oneoff(in_: &[Subscription], out: &mut [Event], nevents: &mut usize) -> Errno { -+ assert!(out.len() >= in_.len()); -+ unsafe { __wasi_poll_oneoff(in_.as_ptr(), out.as_mut_ptr(), in_.len(), nevents) } -+} -+ -+#[inline] -+pub fn proc_exit(rval: ExitCode) { -+ unsafe { __wasi_proc_exit(rval) } -+} -+ -+#[inline] -+pub fn proc_raise(sig: Signal) -> Errno { -+ unsafe { __wasi_proc_raise(sig) } -+} -+ -+#[inline] -+pub fn sock_recv( -+ sock: Fd, -+ ri_data: &[IoVec], -+ ri_flags: RiFlags, -+ ro_datalen: &mut usize, -+ ro_flags: &mut RoFlags, -+) -> Errno { -+ unsafe { -+ __wasi_sock_recv( -+ sock, -+ ri_data.as_ptr(), -+ ri_data.len(), -+ ri_flags, -+ ro_datalen, -+ ro_flags, -+ ) -+ } -+} -+ -+#[inline] -+pub fn sock_send(sock: Fd, si_data: &[CIoVec], si_flags: SiFlags, so_datalen: &mut usize) -> Errno { -+ unsafe { __wasi_sock_send(sock, si_data.as_ptr(), si_data.len(), si_flags, so_datalen) } -+} -+ -+#[inline] -+pub fn sock_shutdown(sock: Fd, how: SdFlags) -> Errno { -+ unsafe { __wasi_sock_shutdown(sock, how) } -+} -+ -+#[inline] -+pub fn sched_yield() -> Errno { -+ unsafe { __wasi_sched_yield() } -+} -+ -+#[inline] -+pub fn fd_prestat_get(fd: Fd, buf: &mut Prestat) -> Errno { -+ unsafe { __wasi_fd_prestat_get(fd, buf) } -+} -+ -+#[inline] -+pub fn fd_prestat_dir_name(fd: Fd, path: &mut [u8]) -> Errno { -+ unsafe { __wasi_fd_prestat_dir_name(fd, path.as_mut_ptr(), path.len()) } -+} -+ -+// TODO: Safe interfaces to the args and environ functions -+/* -+pub fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Errno {} -+pub fn args_sizes_get(argc: *mut usize, argv_buf_size: *mut usize) -> Errno {} -+pub fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Errno {} -+pub fn environ_sizes_get(environ_count: *mut usize, environ_buf_size: *mut usize) -> Errno {} -+*/ -diff --git a/src/wasi_unstable/mod.rs b/src/wasi_unstable/mod.rs -index 37bec24..893f59a 100644 ---- a/src/wasi_unstable/mod.rs -+++ b/src/wasi_unstable/mod.rs -@@ -1,241 +1,56 @@ - //! This module declares the Rust bindings to the `wasi_unstable` API. - //! - //! The raw bindings are in the `raw` submodule. They use raw pointers and --//! are unsafe. In the the top-level module, raw pointer-length pairs are --//! replaced by Rust slice types, output parameters are converted to normal -+//! are unsafe. Minimally safe versions which replace raw pointers with -+//! slices and references are in the `minimal_safe` module. -+//! -+//! In the the top-level module, output parameters are converted to normal - //! return values, names are translated to be more Rust-idiomatic, and the - //! functions are safe. --//! --//! TODO: Not all functions are covered yet; implement the rest of the API. - -+mod constants; -+mod types; -+ -+pub mod minimal_safe; - pub mod raw; - - use core::ffi::c_void; - use core::mem::MaybeUninit; - use raw::*; - --pub type Advice = __wasi_advice_t; --pub type ClockId = __wasi_clockid_t; --pub type Device = __wasi_device_t; --pub type DirCookie = __wasi_dircookie_t; --pub type Errno = __wasi_errno_t; --pub type EventRwFlags = __wasi_eventrwflags_t; --pub type EventType = __wasi_eventtype_t; --pub type ExitCode = __wasi_exitcode_t; --pub type Fd = __wasi_fd_t; --pub type FdFlags = __wasi_fdflags_t; --pub type FileDelta = __wasi_filedelta_t; --pub type FileSize = __wasi_filesize_t; --pub type FileType = __wasi_filetype_t; --pub type FstFlags = __wasi_fstflags_t; --pub type Inode = __wasi_inode_t; --pub type LinkCount = __wasi_linkcount_t; --pub type LookupFlags = __wasi_lookupflags_t; --pub type OFlags = __wasi_oflags_t; --pub type PreopenType = __wasi_preopentype_t; --pub type RiFlags = __wasi_riflags_t; --pub type Rights = __wasi_rights_t; --pub type RoFlags = __wasi_roflags_t; --pub type SdFlags = __wasi_sdflags_t; --pub type SiFlags = __wasi_siflags_t; --pub type Signal = __wasi_signal_t; --pub type SubclockFlags = __wasi_subclockflags_t; --pub type Timestamp = __wasi_timestamp_t; --pub type Userdata = __wasi_userdata_t; --pub type Whence = __wasi_whence_t; --pub type Dirent = __wasi_dirent_t; --pub type FdStat = __wasi_fdstat_t; --pub type FileStat = __wasi_filestat_t; --pub type CIoVec = __wasi_ciovec_t; --pub type IoVec = __wasi_iovec_t; --pub type Subscription = __wasi_subscription_t; --pub type Event = __wasi_event_t; --pub type Prestat = __wasi_prestat_t; -- --pub const ADVICE_NORMAL: Advice = __WASI_ADVICE_NORMAL; --pub const ADVICE_SEQUENTIAL: Advice = __WASI_ADVICE_SEQUENTIAL; --pub const ADVICE_RANDOM: Advice = __WASI_ADVICE_RANDOM; --pub const ADVICE_WILLNEED: Advice = __WASI_ADVICE_WILLNEED; --pub const ADVICE_DONTNEED: Advice = __WASI_ADVICE_DONTNEED; --pub const ADVICE_NOREUSE: Advice = __WASI_ADVICE_NOREUSE; --pub const CLOCK_REALTIME: ClockId = __WASI_CLOCK_REALTIME; --pub const CLOCK_MONOTONIC: ClockId = __WASI_CLOCK_MONOTONIC; --pub const CLOCK_PROCESS_CPUTIME_ID: ClockId = __WASI_CLOCK_PROCESS_CPUTIME_ID; --pub const CLOCK_THREAD_CPUTIME_ID: ClockId = __WASI_CLOCK_THREAD_CPUTIME_ID; --pub const DIRCOOKIE_START: DirCookie = __WASI_DIRCOOKIE_START; --pub const ESUCCESS: Errno = __WASI_ESUCCESS; --pub const E2BIG: Errno = __WASI_E2BIG; --pub const EACCES: Errno = __WASI_EACCES; --pub const EADDRINUSE: Errno = __WASI_EADDRINUSE; --pub const EADDRNOTAVAIL: Errno = __WASI_EADDRNOTAVAIL; --pub const EAFNOSUPPORT: Errno = __WASI_EAFNOSUPPORT; --pub const EAGAIN: Errno = __WASI_EAGAIN; --pub const EALREADY: Errno = __WASI_EALREADY; --pub const EBADF: Errno = __WASI_EBADF; --pub const EBADMSG: Errno = __WASI_EBADMSG; --pub const EBUSY: Errno = __WASI_EBUSY; --pub const ECANCELED: Errno = __WASI_ECANCELED; --pub const ECHILD: Errno = __WASI_ECHILD; --pub const ECONNABORTED: Errno = __WASI_ECONNABORTED; --pub const ECONNREFUSED: Errno = __WASI_ECONNREFUSED; --pub const ECONNRESET: Errno = __WASI_ECONNRESET; --pub const EDEADLK: Errno = __WASI_EDEADLK; --pub const EDESTADDRREQ: Errno = __WASI_EDESTADDRREQ; --pub const EDOM: Errno = __WASI_EDOM; --pub const EDQUOT: Errno = __WASI_EDQUOT; --pub const EEXIST: Errno = __WASI_EEXIST; --pub const EFAULT: Errno = __WASI_EFAULT; --pub const EFBIG: Errno = __WASI_EFBIG; --pub const EHOSTUNREACH: Errno = __WASI_EHOSTUNREACH; --pub const EIDRM: Errno = __WASI_EIDRM; --pub const EILSEQ: Errno = __WASI_EILSEQ; --pub const EINPROGRESS: Errno = __WASI_EINPROGRESS; --pub const EINTR: Errno = __WASI_EINTR; --pub const EINVAL: Errno = __WASI_EINVAL; --pub const EIO: Errno = __WASI_EIO; --pub const EISCONN: Errno = __WASI_EISCONN; --pub const EISDIR: Errno = __WASI_EISDIR; --pub const ELOOP: Errno = __WASI_ELOOP; --pub const EMFILE: Errno = __WASI_EMFILE; --pub const EMLINK: Errno = __WASI_EMLINK; --pub const EMSGSIZE: Errno = __WASI_EMSGSIZE; --pub const EMULTIHOP: Errno = __WASI_EMULTIHOP; --pub const ENAMETOOLONG: Errno = __WASI_ENAMETOOLONG; --pub const ENETDOWN: Errno = __WASI_ENETDOWN; --pub const ENETRESET: Errno = __WASI_ENETRESET; --pub const ENETUNREACH: Errno = __WASI_ENETUNREACH; --pub const ENFILE: Errno = __WASI_ENFILE; --pub const ENOBUFS: Errno = __WASI_ENOBUFS; --pub const ENODEV: Errno = __WASI_ENODEV; --pub const ENOENT: Errno = __WASI_ENOENT; --pub const ENOEXEC: Errno = __WASI_ENOEXEC; --pub const ENOLCK: Errno = __WASI_ENOLCK; --pub const ENOLINK: Errno = __WASI_ENOLINK; --pub const ENOMEM: Errno = __WASI_ENOMEM; --pub const ENOMSG: Errno = __WASI_ENOMSG; --pub const ENOPROTOOPT: Errno = __WASI_ENOPROTOOPT; --pub const ENOSPC: Errno = __WASI_ENOSPC; --pub const ENOSYS: Errno = __WASI_ENOSYS; --pub const ENOTCONN: Errno = __WASI_ENOTCONN; --pub const ENOTDIR: Errno = __WASI_ENOTDIR; --pub const ENOTEMPTY: Errno = __WASI_ENOTEMPTY; --pub const ENOTRECOVERABLE: Errno = __WASI_ENOTRECOVERABLE; --pub const ENOTSOCK: Errno = __WASI_ENOTSOCK; --pub const ENOTSUP: Errno = __WASI_ENOTSUP; --pub const ENOTTY: Errno = __WASI_ENOTTY; --pub const ENXIO: Errno = __WASI_ENXIO; --pub const EOVERFLOW: Errno = __WASI_EOVERFLOW; --pub const EOWNERDEAD: Errno = __WASI_EOWNERDEAD; --pub const EPERM: Errno = __WASI_EPERM; --pub const EPIPE: Errno = __WASI_EPIPE; --pub const EPROTO: Errno = __WASI_EPROTO; --pub const EPROTONOSUPPORT: Errno = __WASI_EPROTONOSUPPORT; --pub const EPROTOTYPE: Errno = __WASI_EPROTOTYPE; --pub const ERANGE: Errno = __WASI_ERANGE; --pub const EROFS: Errno = __WASI_EROFS; --pub const ESPIPE: Errno = __WASI_ESPIPE; --pub const ESRCH: Errno = __WASI_ESRCH; --pub const ESTALE: Errno = __WASI_ESTALE; --pub const ETIMEDOUT: Errno = __WASI_ETIMEDOUT; --pub const ETXTBSY: Errno = __WASI_ETXTBSY; --pub const EXDEV: Errno = __WASI_EXDEV; --pub const ENOTCAPABLE: Errno = __WASI_ENOTCAPABLE; --pub const EVENT_FD_READWRITE_HANGUP: EventRwFlags = __WASI_EVENT_FD_READWRITE_HANGUP; --pub const EVENTTYPE_CLOCK: EventType = __WASI_EVENTTYPE_CLOCK; --pub const EVENTTYPE_FD_READ: EventType = __WASI_EVENTTYPE_FD_READ; --pub const EVENTTYPE_FD_WRITE: EventType = __WASI_EVENTTYPE_FD_WRITE; --pub const FDFLAG_APPEND: FdFlags = __WASI_FDFLAG_APPEND; --pub const FDFLAG_DSYNC: FdFlags = __WASI_FDFLAG_DSYNC; --pub const FDFLAG_NONBLOCK: FdFlags = __WASI_FDFLAG_NONBLOCK; --pub const FDFLAG_RSYNC: FdFlags = __WASI_FDFLAG_RSYNC; --pub const FDFLAG_SYNC: FdFlags = __WASI_FDFLAG_SYNC; --pub const FILETYPE_UNKNOWN: FileType = __WASI_FILETYPE_UNKNOWN; --pub const FILETYPE_BLOCK_DEVICE: FileType = __WASI_FILETYPE_BLOCK_DEVICE; --pub const FILETYPE_CHARACTER_DEVICE: FileType = __WASI_FILETYPE_CHARACTER_DEVICE; --pub const FILETYPE_DIRECTORY: FileType = __WASI_FILETYPE_DIRECTORY; --pub const FILETYPE_REGULAR_FILE: FileType = __WASI_FILETYPE_REGULAR_FILE; --pub const FILETYPE_SOCKET_DGRAM: FileType = __WASI_FILETYPE_SOCKET_DGRAM; --pub const FILETYPE_SOCKET_STREAM: FileType = __WASI_FILETYPE_SOCKET_STREAM; --pub const FILETYPE_SYMBOLIC_LINK: FileType = __WASI_FILETYPE_SYMBOLIC_LINK; --pub const FILESTAT_SET_ATIM: FstFlags = __WASI_FILESTAT_SET_ATIM; --pub const FILESTAT_SET_ATIM_NOW: FstFlags = __WASI_FILESTAT_SET_ATIM_NOW; --pub const FILESTAT_SET_MTIM: FstFlags = __WASI_FILESTAT_SET_MTIM; --pub const FILESTAT_SET_MTIM_NOW: FstFlags = __WASI_FILESTAT_SET_MTIM_NOW; --pub const LOOKUP_SYMLINK_FOLLOW: LookupFlags = __WASI_LOOKUP_SYMLINK_FOLLOW; --pub const O_CREAT: OFlags = __WASI_O_CREAT; --pub const O_DIRECTORY: OFlags = __WASI_O_DIRECTORY; --pub const O_EXCL: OFlags = __WASI_O_EXCL; --pub const O_TRUNC: OFlags = __WASI_O_TRUNC; --pub const PREOPENTYPE_DIR: PreopenType = __WASI_PREOPENTYPE_DIR; --pub const SOCK_RECV_PEEK: RiFlags = __WASI_SOCK_RECV_PEEK; --pub const SOCK_RECV_WAITALL: RiFlags = __WASI_SOCK_RECV_WAITALL; --pub const RIGHT_FD_DATASYNC: Rights = __WASI_RIGHT_FD_DATASYNC; --pub const RIGHT_FD_READ: Rights = __WASI_RIGHT_FD_READ; --pub const RIGHT_FD_SEEK: Rights = __WASI_RIGHT_FD_SEEK; --pub const RIGHT_FD_FDSTAT_SET_FLAGS: Rights = __WASI_RIGHT_FD_FDSTAT_SET_FLAGS; --pub const RIGHT_FD_SYNC: Rights = __WASI_RIGHT_FD_SYNC; --pub const RIGHT_FD_TELL: Rights = __WASI_RIGHT_FD_TELL; --pub const RIGHT_FD_WRITE: Rights = __WASI_RIGHT_FD_WRITE; --pub const RIGHT_FD_ADVISE: Rights = __WASI_RIGHT_FD_ADVISE; --pub const RIGHT_FD_ALLOCATE: Rights = __WASI_RIGHT_FD_ALLOCATE; --pub const RIGHT_PATH_CREATE_DIRECTORY: Rights = __WASI_RIGHT_PATH_CREATE_DIRECTORY; --pub const RIGHT_PATH_CREATE_FILE: Rights = __WASI_RIGHT_PATH_CREATE_FILE; --pub const RIGHT_PATH_LINK_SOURCE: Rights = __WASI_RIGHT_PATH_LINK_SOURCE; --pub const RIGHT_PATH_LINK_TARGET: Rights = __WASI_RIGHT_PATH_LINK_TARGET; --pub const RIGHT_PATH_OPEN: Rights = __WASI_RIGHT_PATH_OPEN; --pub const RIGHT_FD_READDIR: Rights = __WASI_RIGHT_FD_READDIR; --pub const RIGHT_PATH_READLINK: Rights = __WASI_RIGHT_PATH_READLINK; --pub const RIGHT_PATH_RENAME_SOURCE: Rights = __WASI_RIGHT_PATH_RENAME_SOURCE; --pub const RIGHT_PATH_RENAME_TARGET: Rights = __WASI_RIGHT_PATH_RENAME_TARGET; --pub const RIGHT_PATH_FILESTAT_GET: Rights = __WASI_RIGHT_PATH_FILESTAT_GET; --pub const RIGHT_PATH_FILESTAT_SET_SIZE: Rights = __WASI_RIGHT_PATH_FILESTAT_SET_SIZE; --pub const RIGHT_PATH_FILESTAT_SET_TIMES: Rights = __WASI_RIGHT_PATH_FILESTAT_SET_TIMES; --pub const RIGHT_FD_FILESTAT_GET: Rights = __WASI_RIGHT_FD_FILESTAT_GET; --pub const RIGHT_FD_FILESTAT_SET_SIZE: Rights = __WASI_RIGHT_FD_FILESTAT_SET_SIZE; --pub const RIGHT_FD_FILESTAT_SET_TIMES: Rights = __WASI_RIGHT_FD_FILESTAT_SET_TIMES; --pub const RIGHT_PATH_SYMLINK: Rights = __WASI_RIGHT_PATH_SYMLINK; --pub const RIGHT_PATH_REMOVE_DIRECTORY: Rights = __WASI_RIGHT_PATH_REMOVE_DIRECTORY; --pub const RIGHT_PATH_UNLINK_FILE: Rights = __WASI_RIGHT_PATH_UNLINK_FILE; --pub const RIGHT_POLL_FD_READWRITE: Rights = __WASI_RIGHT_POLL_FD_READWRITE; --pub const RIGHT_SOCK_SHUTDOWN: Rights = __WASI_RIGHT_SOCK_SHUTDOWN; --pub const SOCK_RECV_DATA_TRUNCATED: RoFlags = __WASI_SOCK_RECV_DATA_TRUNCATED; --pub const SHUT_RD: SdFlags = __WASI_SHUT_RD; --pub const SHUT_WR: SdFlags = __WASI_SHUT_WR; --pub const SIGHUP: Signal = __WASI_SIGHUP; --pub const SIGINT: Signal = __WASI_SIGINT; --pub const SIGQUIT: Signal = __WASI_SIGQUIT; --pub const SIGILL: Signal = __WASI_SIGILL; --pub const SIGTRAP: Signal = __WASI_SIGTRAP; --pub const SIGABRT: Signal = __WASI_SIGABRT; --pub const SIGBUS: Signal = __WASI_SIGBUS; --pub const SIGFPE: Signal = __WASI_SIGFPE; --pub const SIGKILL: Signal = __WASI_SIGKILL; --pub const SIGUSR1: Signal = __WASI_SIGUSR1; --pub const SIGSEGV: Signal = __WASI_SIGSEGV; --pub const SIGUSR2: Signal = __WASI_SIGUSR2; --pub const SIGPIPE: Signal = __WASI_SIGPIPE; --pub const SIGALRM: Signal = __WASI_SIGALRM; --pub const SIGTERM: Signal = __WASI_SIGTERM; --pub const SIGCHLD: Signal = __WASI_SIGCHLD; --pub const SIGCONT: Signal = __WASI_SIGCONT; --pub const SIGSTOP: Signal = __WASI_SIGSTOP; --pub const SIGTSTP: Signal = __WASI_SIGTSTP; --pub const SIGTTIN: Signal = __WASI_SIGTTIN; --pub const SIGTTOU: Signal = __WASI_SIGTTOU; --pub const SIGURG: Signal = __WASI_SIGURG; --pub const SIGXCPU: Signal = __WASI_SIGXCPU; --pub const SIGXFSZ: Signal = __WASI_SIGXFSZ; --pub const SIGVTALRM: Signal = __WASI_SIGVTALRM; --pub const SIGPROF: Signal = __WASI_SIGPROF; --pub const SIGWINCH: Signal = __WASI_SIGWINCH; --pub const SIGPOLL: Signal = __WASI_SIGPOLL; --pub const SIGPWR: Signal = __WASI_SIGPWR; --pub const SIGSYS: Signal = __WASI_SIGSYS; --pub const SUBSCRIPTION_CLOCK_ABSTIME: SubclockFlags = __WASI_SUBSCRIPTION_CLOCK_ABSTIME; --pub const WHENCE_CUR: Whence = __WASI_WHENCE_CUR; --pub const WHENCE_END: Whence = __WASI_WHENCE_END; --pub const WHENCE_SET: Whence = __WASI_WHENCE_SET; -- -+pub use constants::*; -+pub use types::*; -+ -+// These are for WASI functions which don't use output parameters, so we can -+// just export the minimal_safe versions. -+pub use minimal_safe::fd_advise; -+pub use minimal_safe::fd_allocate; -+pub use minimal_safe::fd_close; -+pub use minimal_safe::fd_datasync; -+pub use minimal_safe::fd_fdstat_set_flags; -+pub use minimal_safe::fd_fdstat_set_rights; -+pub use minimal_safe::fd_filestat_set_size; -+pub use minimal_safe::fd_filestat_set_times; -+pub use minimal_safe::fd_prestat_dir_name; -+pub use minimal_safe::fd_renumber; -+pub use minimal_safe::fd_sync; -+pub use minimal_safe::path_create_directory; -+pub use minimal_safe::path_filestat_set_times; -+pub use minimal_safe::path_link; -+pub use minimal_safe::path_remove_directory; -+pub use minimal_safe::path_rename; -+pub use minimal_safe::path_symlink; -+pub use minimal_safe::path_unlink_file; -+pub use minimal_safe::proc_exit; -+pub use minimal_safe::proc_raise; -+pub use minimal_safe::random_get; -+pub use minimal_safe::sched_yield; -+pub use minimal_safe::sock_shutdown; -+ -+// The following are for WASI functions which do use output parameters. We -+// wrap them separately to avoid creating references to uninitialized data. -+ -+#[inline] - pub fn clock_res_get(clock_id: ClockId) -> (Errno, Timestamp) { - let mut resolution = MaybeUninit::<Timestamp>::uninit(); - unsafe { -@@ -246,6 +61,7 @@ pub fn clock_res_get(clock_id: ClockId) -> (Errno, Timestamp) { - } - } - -+#[inline] - pub fn clock_time_get(clock_id: ClockId, precision: Timestamp) -> (Errno, Timestamp) { - let mut time = MaybeUninit::<Timestamp>::uninit(); - unsafe { -@@ -256,6 +72,7 @@ pub fn clock_time_get(clock_id: ClockId, precision: Timestamp) -> (Errno, Timest - } - } - -+#[inline] - pub fn fd_pread(fd: Fd, iovs: &[IoVec], offset: FileSize) -> (Errno, usize) { - let mut nread = MaybeUninit::<usize>::uninit(); - unsafe { -@@ -266,6 +83,7 @@ pub fn fd_pread(fd: Fd, iovs: &[IoVec], offset: FileSize) -> (Errno, usize) { - } - } - -+#[inline] - pub fn fd_pwrite(fd: Fd, iovs: &[CIoVec], offset: FileSize) -> (Errno, usize) { - let mut nwritten = MaybeUninit::<usize>::uninit(); - unsafe { -@@ -276,18 +94,7 @@ pub fn fd_pwrite(fd: Fd, iovs: &[CIoVec], offset: FileSize) -> (Errno, usize) { - } - } - --pub fn random_get(buf: &mut [u8]) -> Errno { -- unsafe { __wasi_random_get(buf.as_mut_ptr() as *mut c_void, buf.len()) } --} -- --pub fn fd_close(fd: Fd) -> Errno { -- unsafe { __wasi_fd_close(fd) } --} -- --pub fn fd_datasync(fd: Fd) -> Errno { -- unsafe { __wasi_fd_datasync(fd) } --} -- -+#[inline] - pub fn fd_read(fd: Fd, iovs: &[IoVec]) -> (Errno, usize) { - let mut nread = MaybeUninit::<usize>::uninit(); - unsafe { -@@ -298,10 +105,7 @@ pub fn fd_read(fd: Fd, iovs: &[IoVec]) -> (Errno, usize) { - } - } - --pub fn fd_renumber(from: Fd, to: Fd) -> Errno { -- unsafe { __wasi_fd_renumber(from, to) } --} -- -+#[inline] - pub fn fd_seek(fd: Fd, offset: FileDelta, whence: Whence) -> (Errno, FileSize) { - let mut newoffset = MaybeUninit::<FileSize>::uninit(); - unsafe { -@@ -312,6 +116,7 @@ pub fn fd_seek(fd: Fd, offset: FileDelta, whence: Whence) -> (Errno, FileSize) { - } - } - -+#[inline] - pub fn fd_tell(fd: Fd) -> (Errno, FileSize) { - let mut newoffset = MaybeUninit::<FileSize>::uninit(); - unsafe { -@@ -322,6 +127,7 @@ pub fn fd_tell(fd: Fd) -> (Errno, FileSize) { - } - } - -+#[inline] - pub fn fd_fdstat_get(fd: Fd) -> (Errno, FdStat) { - let mut buf = MaybeUninit::<FdStat>::uninit(); - unsafe { -@@ -332,18 +138,7 @@ pub fn fd_fdstat_get(fd: Fd) -> (Errno, FdStat) { - } - } - --pub fn fd_fdstat_set_flags(fd: Fd, flags: FdFlags) -> Errno { -- unsafe { __wasi_fd_fdstat_set_flags(fd, flags) } --} -- --pub fn fd_fdstat_set_rights(fd: Fd, fs_rights_base: Rights, fs_rights_inheriting: Rights) -> Errno { -- unsafe { __wasi_fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting) } --} -- --pub fn fd_sync(fd: Fd) -> Errno { -- unsafe { __wasi_fd_sync(fd) } --} -- -+#[inline] - pub fn fd_write(fd: Fd, iovs: &[CIoVec]) -> (Errno, usize) { - let mut nwritten = MaybeUninit::<usize>::uninit(); - unsafe { -@@ -354,38 +149,7 @@ pub fn fd_write(fd: Fd, iovs: &[CIoVec]) -> (Errno, usize) { - } - } - --pub fn fd_advise(fd: Fd, offset: FileSize, len: FileSize, advice: Advice) -> Errno { -- unsafe { __wasi_fd_advise(fd, offset, len, advice) } --} -- --pub fn fd_allocate(fd: Fd, offset: FileSize, len: FileSize) -> Errno { -- unsafe { __wasi_fd_allocate(fd, offset, len) } --} -- --pub fn path_create_directory(fd: Fd, path: &[u8]) -> Errno { -- unsafe { __wasi_path_create_directory(fd, path.as_ptr(), path.len()) } --} -- --pub fn path_link( -- old_fd: Fd, -- old_flags: LookupFlags, -- old_path: &[u8], -- new_fd: Fd, -- new_path: &[u8], --) -> Errno { -- unsafe { -- __wasi_path_link( -- old_fd, -- old_flags, -- old_path.as_ptr(), -- old_path.len(), -- new_fd, -- new_path.as_ptr(), -- new_path.len(), -- ) -- } --} -- -+#[inline] - pub fn path_open( - dirfd: Fd, - dirflags: LookupFlags, -@@ -414,6 +178,7 @@ pub fn path_open( - } - } - -+#[inline] - pub fn fd_readdir(fd: Fd, buf: &mut [u8], cookie: DirCookie) -> (Errno, usize) { - let mut bufused = MaybeUninit::<usize>::uninit(); - unsafe { -@@ -430,6 +195,7 @@ pub fn fd_readdir(fd: Fd, buf: &mut [u8], cookie: DirCookie) -> (Errno, usize) { - } - } - -+#[inline] - pub fn path_readlink(fd: Fd, path: &[u8], buf: &mut [u8]) -> (Errno, usize) { - let mut bufused = MaybeUninit::<usize>::uninit(); - unsafe { -@@ -447,19 +213,7 @@ pub fn path_readlink(fd: Fd, path: &[u8], buf: &mut [u8]) -> (Errno, usize) { - } - } - --pub fn path_rename(old_fd: Fd, old_path: &[u8], new_fd: Fd, new_path: &[u8]) -> Errno { -- unsafe { -- __wasi_path_rename( -- old_fd, -- old_path.as_ptr(), -- old_path.len(), -- new_fd, -- new_path.as_ptr(), -- new_path.len(), -- ) -- } --} -- -+#[inline] - pub fn fd_filestat_get(fd: Fd) -> (Errno, FileStat) { - let mut buf = MaybeUninit::<FileStat>::uninit(); - unsafe { -@@ -470,19 +224,7 @@ pub fn fd_filestat_get(fd: Fd) -> (Errno, FileStat) { - } - } - --pub fn fd_filestat_set_times( -- fd: Fd, -- st_atim: Timestamp, -- st_mtim: Timestamp, -- fstflags: FstFlags, --) -> Errno { -- unsafe { __wasi_fd_filestat_set_times(fd, st_atim, st_mtim, fstflags) } --} -- --pub fn fd_filestat_set_size(fd: Fd, st_size: FileSize) -> Errno { -- unsafe { __wasi_fd_filestat_set_size(fd, st_size) } --} -- -+#[inline] - pub fn path_filestat_get(fd: Fd, flags: LookupFlags, path: &[u8]) -> (Errno, FileStat) { - let mut buf = MaybeUninit::<FileStat>::uninit(); - unsafe { -@@ -493,47 +235,7 @@ pub fn path_filestat_get(fd: Fd, flags: LookupFlags, path: &[u8]) -> (Errno, Fil - } - } - --pub fn path_filestat_set_times( -- fd: Fd, -- flags: LookupFlags, -- path: &[u8], -- st_atim: Timestamp, -- st_mtim: Timestamp, -- fstflags: FstFlags, --) -> Errno { -- unsafe { -- __wasi_path_filestat_set_times( -- fd, -- flags, -- path.as_ptr(), -- path.len(), -- st_atim, -- st_mtim, -- fstflags, -- ) -- } --} -- --pub fn path_symlink(old_path: &[u8], fd: Fd, new_path: &[u8]) -> Errno { -- unsafe { -- __wasi_path_symlink( -- old_path.as_ptr(), -- old_path.len(), -- fd, -- new_path.as_ptr(), -- new_path.len(), -- ) -- } --} -- --pub fn path_unlink_file(fd: Fd, path: &[u8]) -> Errno { -- unsafe { __wasi_path_unlink_file(fd, path.as_ptr(), path.len()) } --} -- --pub fn path_remove_directory(fd: Fd, path: &[u8]) -> Errno { -- unsafe { __wasi_path_remove_directory(fd, path.as_ptr(), path.len()) } --} -- -+#[inline] - pub fn poll_oneoff(in_: &[Subscription], out: &mut [Event]) -> (Errno, usize) { - assert!(out.len() >= in_.len()); - let mut nevents = MaybeUninit::<usize>::uninit(); -@@ -550,14 +252,7 @@ pub fn poll_oneoff(in_: &[Subscription], out: &mut [Event]) -> (Errno, usize) { - } - } - --pub fn proc_exit(rval: ExitCode) { -- unsafe { __wasi_proc_exit(rval) } --} -- --pub fn proc_raise(sig: Signal) -> Errno { -- unsafe { __wasi_proc_raise(sig) } --} -- -+#[inline] - pub fn sock_recv(sock: Fd, ri_data: &[IoVec], ri_flags: RiFlags) -> (Errno, usize, RoFlags) { - let mut ro_datalen = MaybeUninit::<usize>::uninit(); - let mut ro_flags = MaybeUninit::<RoFlags>::uninit(); -@@ -577,6 +272,7 @@ pub fn sock_recv(sock: Fd, ri_data: &[IoVec], ri_flags: RiFlags) -> (Errno, usiz - } - } - -+#[inline] - pub fn sock_send(sock: Fd, si_data: &[CIoVec], si_flags: SiFlags) -> (Errno, usize) { - let mut so_datalen = MaybeUninit::<usize>::uninit(); - unsafe { -@@ -593,14 +289,7 @@ pub fn sock_send(sock: Fd, si_data: &[CIoVec], si_flags: SiFlags) -> (Errno, usi - } - } - --pub fn sock_shutdown(sock: Fd, how: SdFlags) -> Errno { -- unsafe { __wasi_sock_shutdown(sock, how) } --} -- --pub fn sched_yield() -> Errno { -- unsafe { __wasi_sched_yield() } --} -- -+#[inline] - pub fn fd_prestat_get(fd: Fd) -> (Errno, Prestat) { - let mut buf = MaybeUninit::<Prestat>::uninit(); - unsafe { -@@ -611,10 +300,6 @@ pub fn fd_prestat_get(fd: Fd) -> (Errno, Prestat) { - } - } - --pub fn fd_prestat_dir_name(fd: Fd, path: &mut [u8]) -> Errno { -- unsafe { __wasi_fd_prestat_dir_name(fd, path.as_mut_ptr(), path.len()) } --} -- - // TODO: Safe interfaces to the args and environ functions - /* - pub fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Errno {} -diff --git a/src/wasi_unstable/types.rs b/src/wasi_unstable/types.rs -new file mode 100644 -index 0000000..dd744c9 ---- /dev/null -+++ b/src/wasi_unstable/types.rs -@@ -0,0 +1,41 @@ -+//! This file defines idiomatic Rust names for types. -+ -+use crate::wasi_unstable::raw::*; -+ -+pub type Advice = __wasi_advice_t; -+pub type ClockId = __wasi_clockid_t; -+pub type Device = __wasi_device_t; -+pub type DirCookie = __wasi_dircookie_t; -+pub type Errno = __wasi_errno_t; -+pub type EventRwFlags = __wasi_eventrwflags_t; -+pub type EventType = __wasi_eventtype_t; -+pub type ExitCode = __wasi_exitcode_t; -+pub type Fd = __wasi_fd_t; -+pub type FdFlags = __wasi_fdflags_t; -+pub type FileDelta = __wasi_filedelta_t; -+pub type FileSize = __wasi_filesize_t; -+pub type FileType = __wasi_filetype_t; -+pub type FstFlags = __wasi_fstflags_t; -+pub type Inode = __wasi_inode_t; -+pub type LinkCount = __wasi_linkcount_t; -+pub type LookupFlags = __wasi_lookupflags_t; -+pub type OFlags = __wasi_oflags_t; -+pub type PreopenType = __wasi_preopentype_t; -+pub type RiFlags = __wasi_riflags_t; -+pub type Rights = __wasi_rights_t; -+pub type RoFlags = __wasi_roflags_t; -+pub type SdFlags = __wasi_sdflags_t; -+pub type SiFlags = __wasi_siflags_t; -+pub type Signal = __wasi_signal_t; -+pub type SubclockFlags = __wasi_subclockflags_t; -+pub type Timestamp = __wasi_timestamp_t; -+pub type Userdata = __wasi_userdata_t; -+pub type Whence = __wasi_whence_t; -+pub type Dirent = __wasi_dirent_t; -+pub type FdStat = __wasi_fdstat_t; -+pub type FileStat = __wasi_filestat_t; -+pub type CIoVec = __wasi_ciovec_t; -+pub type IoVec = __wasi_iovec_t; -+pub type Subscription = __wasi_subscription_t; -+pub type Event = __wasi_event_t; -+pub type Prestat = __wasi_prestat_t; --- -2.17.1 - diff --git a/vendor/wasi-0.7.0/CODE_OF_CONDUCT.md b/vendor/wasi-0.7.0/CODE_OF_CONDUCT.md deleted file mode 100644 index 38ef2efa50..0000000000 --- a/vendor/wasi-0.7.0/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at either sunfish@mozilla.com or tyler@fastly.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/wasi-0.7.0/CONTRIBUTING.md b/vendor/wasi-0.7.0/CONTRIBUTING.md deleted file mode 100644 index 2db6d0ddf3..0000000000 --- a/vendor/wasi-0.7.0/CONTRIBUTING.md +++ /dev/null @@ -1,8 +0,0 @@ -# Contributing to wasi-core - -wasi-core follows the same development style as Cranelift, so checkout -[Cranelift's CONTRIBUTING.md]. Of course, for wasi-core-specific issues, please -use the [wasi-core issue tracker]. - -[Cranelift's CONTRIBUTING.md]: https://github.com/CraneStation/cranelift/blob/master/CONTRIBUTING.md -[wasi-core issue tracker]: https://github.com/CraneStation/wasi-core/issues/new diff --git a/vendor/wasi-0.7.0/LICENSE-APACHE b/vendor/wasi-0.7.0/LICENSE-APACHE deleted file mode 100644 index 16fe87b06e..0000000000 --- a/vendor/wasi-0.7.0/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/wasi-0.7.0/LICENSE-Apache-2.0_WITH_LLVM-exception b/vendor/wasi-0.7.0/LICENSE-Apache-2.0_WITH_LLVM-exception deleted file mode 100644 index f9d81955f4..0000000000 --- a/vendor/wasi-0.7.0/LICENSE-Apache-2.0_WITH_LLVM-exception +++ /dev/null @@ -1,220 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - diff --git a/vendor/wasi-0.7.0/README.md b/vendor/wasi-0.7.0/README.md deleted file mode 100644 index 9f8143e74e..0000000000 --- a/vendor/wasi-0.7.0/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# WASI API Bindings for Rust - -This package contains experimental [WASI](https://github.com/WebAssembly/WASI) -API bindings in Rust. - -There are two modules: - - - `wasi_unstable::raw`, which provides raw access to the literal binding to - the API. These functions are unsafe and use raw pointers. - - - `wasi_unstable`, which provides thin wrappers around the raw functions - which use idiomatic Rust types rather than raw pointers, and are safe. - -This crate is quite low-level and provides conceptually a "system call" -interface. In most settings, it's better to use the Rust standard library, -which has WASI support. - -To compile Rust projects to wasm using WASI, use the `wasm32-wasi` target, -like this: - -``` -rustup target add wasm32-wasi -cargo build --target wasm32-wasi -``` diff --git a/vendor/wasi-0.7.0/clip.log b/vendor/wasi-0.7.0/clip.log deleted file mode 100644 index 3235f156ee..0000000000 --- a/vendor/wasi-0.7.0/clip.log +++ /dev/null @@ -1,20 +0,0 @@ - Updating crates.io index - Checking wasi v0.6.0 (/home/sunfish/rust-wasi) -warning: use of `offset` with a `usize` casted to an `isize` - --> src/wasi_unstable/mod.rs:629:21 - | -629 | if *ptr.offset(n as isize) == 0 { - | ^^^^^^^^^^^^^^^^^^^^^^ help: try: `ptr.add(n)` - | - = note: #[warn(clippy::ptr_offset_with_cast)] on by default - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_offset_with_cast - -warning: use of `offset` with a `usize` casted to an `isize` - --> src/wasi_unstable/mod.rs:684:24 - | -684 | match *ptr.offset(n as isize) { - | ^^^^^^^^^^^^^^^^^^^^^^ help: try: `ptr.add(n)` - | - = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_offset_with_cast - - Finished dev [unoptimized + debuginfo] target(s) in 3.08s diff --git a/vendor/wasi-0.7.0/old-bitflags.patch b/vendor/wasi-0.7.0/old-bitflags.patch deleted file mode 100644 index 7c874d4954..0000000000 --- a/vendor/wasi-0.7.0/old-bitflags.patch +++ /dev/null @@ -1,570 +0,0 @@ -diff --git a/Cargo.toml b/Cargo.toml -index 47ecced..ec6e7c9 100644 ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -12,6 +12,7 @@ readme = "README.md" - documentation = "https://docs.rs/wasi" - - [dependencies] -+bitflags = "1.1.0" - - [badges] - maintenance = { status = "experimental" } -diff --git a/src/lib.rs b/src/lib.rs -index 42e13ea..03d3d19 100644 ---- a/src/lib.rs -+++ b/src/lib.rs -@@ -13,4 +13,7 @@ - )] - #![no_std] - -+#[macro_use] -+extern crate bitflags; -+ - pub mod wasi_unstable; -diff --git a/src/wasi_unstable/mod.rs b/src/wasi_unstable/mod.rs -index 4703cc9..b3fd897 100644 ---- a/src/wasi_unstable/mod.rs -+++ b/src/wasi_unstable/mod.rs -@@ -19,27 +19,18 @@ pub type Clockid = __wasi_clockid_t; - pub type Device = __wasi_device_t; - pub type Dircookie = __wasi_dircookie_t; - pub type Errno = __wasi_errno_t; --pub type Eventrwflags = __wasi_eventrwflags_t; - pub type Eventtype = __wasi_eventtype_t; - pub type Exitcode = __wasi_exitcode_t; - pub type Fd = __wasi_fd_t; --pub type Fdflags = __wasi_fdflags_t; - pub type Filedelta = __wasi_filedelta_t; - pub type Filesize = __wasi_filesize_t; - pub type Filetype = __wasi_filetype_t; --pub type Fstflags = __wasi_fstflags_t; - pub type Inode = __wasi_inode_t; - pub type Linkcount = __wasi_linkcount_t; --pub type Lookupflags = __wasi_lookupflags_t; --pub type Oflags = __wasi_oflags_t; - pub type Preopentype = __wasi_preopentype_t; --pub type Riflags = __wasi_riflags_t; --pub type Rights = __wasi_rights_t; - pub type Roflags = __wasi_roflags_t; --pub type Sdflags = __wasi_sdflags_t; - pub type Siflags = __wasi_siflags_t; - pub type Signal = __wasi_signal_t; --pub type Subclockflags = __wasi_subclockflags_t; - pub type Timestamp = __wasi_timestamp_t; - pub type Userdata = __wasi_userdata_t; - pub type Whence = __wasi_whence_t; -@@ -52,189 +43,231 @@ pub type Subscription = __wasi_subscription_t; - pub type Event = __wasi_event_t; - pub type Prestat = __wasi_prestat_t; - --pub const ADVICE_NORMAL: u8 = __WASI_ADVICE_NORMAL; --pub const ADVICE_SEQUENTIAL: u8 = __WASI_ADVICE_SEQUENTIAL; --pub const ADVICE_RANDOM: u8 = __WASI_ADVICE_RANDOM; --pub const ADVICE_WILLNEED: u8 = __WASI_ADVICE_WILLNEED; --pub const ADVICE_DONTNEED: u8 = __WASI_ADVICE_DONTNEED; --pub const ADVICE_NOREUSE: u8 = __WASI_ADVICE_NOREUSE; --pub const CLOCK_REALTIME: u32 = __WASI_CLOCK_REALTIME; --pub const CLOCK_MONOTONIC: u32 = __WASI_CLOCK_MONOTONIC; --pub const CLOCK_PROCESS_CPUTIME_ID: u32 = __WASI_CLOCK_PROCESS_CPUTIME_ID; --pub const CLOCK_THREAD_CPUTIME_ID: u32 = __WASI_CLOCK_THREAD_CPUTIME_ID; --pub const DIRCOOKIE_START: u64 = __WASI_DIRCOOKIE_START; --pub const ESUCCESS: u16 = __WASI_ESUCCESS; --pub const E2BIG: u16 = __WASI_E2BIG; --pub const EACCES: u16 = __WASI_EACCES; --pub const EADDRINUSE: u16 = __WASI_EADDRINUSE; --pub const EADDRNOTAVAIL: u16 = __WASI_EADDRNOTAVAIL; --pub const EAFNOSUPPORT: u16 = __WASI_EAFNOSUPPORT; --pub const EAGAIN: u16 = __WASI_EAGAIN; --pub const EALREADY: u16 = __WASI_EALREADY; --pub const EBADF: u16 = __WASI_EBADF; --pub const EBADMSG: u16 = __WASI_EBADMSG; --pub const EBUSY: u16 = __WASI_EBUSY; --pub const ECANCELED: u16 = __WASI_ECANCELED; --pub const ECHILD: u16 = __WASI_ECHILD; --pub const ECONNABORTED: u16 = __WASI_ECONNABORTED; --pub const ECONNREFUSED: u16 = __WASI_ECONNREFUSED; --pub const ECONNRESET: u16 = __WASI_ECONNRESET; --pub const EDEADLK: u16 = __WASI_EDEADLK; --pub const EDESTADDRREQ: u16 = __WASI_EDESTADDRREQ; --pub const EDOM: u16 = __WASI_EDOM; --pub const EDQUOT: u16 = __WASI_EDQUOT; --pub const EEXIST: u16 = __WASI_EEXIST; --pub const EFAULT: u16 = __WASI_EFAULT; --pub const EFBIG: u16 = __WASI_EFBIG; --pub const EHOSTUNREACH: u16 = __WASI_EHOSTUNREACH; --pub const EIDRM: u16 = __WASI_EIDRM; --pub const EILSEQ: u16 = __WASI_EILSEQ; --pub const EINPROGRESS: u16 = __WASI_EINPROGRESS; --pub const EINTR: u16 = __WASI_EINTR; --pub const EINVAL: u16 = __WASI_EINVAL; --pub const EIO: u16 = __WASI_EIO; --pub const EISCONN: u16 = __WASI_EISCONN; --pub const EISDIR: u16 = __WASI_EISDIR; --pub const ELOOP: u16 = __WASI_ELOOP; --pub const EMFILE: u16 = __WASI_EMFILE; --pub const EMLINK: u16 = __WASI_EMLINK; --pub const EMSGSIZE: u16 = __WASI_EMSGSIZE; --pub const EMULTIHOP: u16 = __WASI_EMULTIHOP; --pub const ENAMETOOLONG: u16 = __WASI_ENAMETOOLONG; --pub const ENETDOWN: u16 = __WASI_ENETDOWN; --pub const ENETRESET: u16 = __WASI_ENETRESET; --pub const ENETUNREACH: u16 = __WASI_ENETUNREACH; --pub const ENFILE: u16 = __WASI_ENFILE; --pub const ENOBUFS: u16 = __WASI_ENOBUFS; --pub const ENODEV: u16 = __WASI_ENODEV; --pub const ENOENT: u16 = __WASI_ENOENT; --pub const ENOEXEC: u16 = __WASI_ENOEXEC; --pub const ENOLCK: u16 = __WASI_ENOLCK; --pub const ENOLINK: u16 = __WASI_ENOLINK; --pub const ENOMEM: u16 = __WASI_ENOMEM; --pub const ENOMSG: u16 = __WASI_ENOMSG; --pub const ENOPROTOOPT: u16 = __WASI_ENOPROTOOPT; --pub const ENOSPC: u16 = __WASI_ENOSPC; --pub const ENOSYS: u16 = __WASI_ENOSYS; --pub const ENOTCONN: u16 = __WASI_ENOTCONN; --pub const ENOTDIR: u16 = __WASI_ENOTDIR; --pub const ENOTEMPTY: u16 = __WASI_ENOTEMPTY; --pub const ENOTRECOVERABLE: u16 = __WASI_ENOTRECOVERABLE; --pub const ENOTSOCK: u16 = __WASI_ENOTSOCK; --pub const ENOTSUP: u16 = __WASI_ENOTSUP; --pub const ENOTTY: u16 = __WASI_ENOTTY; --pub const ENXIO: u16 = __WASI_ENXIO; --pub const EOVERFLOW: u16 = __WASI_EOVERFLOW; --pub const EOWNERDEAD: u16 = __WASI_EOWNERDEAD; --pub const EPERM: u16 = __WASI_EPERM; --pub const EPIPE: u16 = __WASI_EPIPE; --pub const EPROTO: u16 = __WASI_EPROTO; --pub const EPROTONOSUPPORT: u16 = __WASI_EPROTONOSUPPORT; --pub const EPROTOTYPE: u16 = __WASI_EPROTOTYPE; --pub const ERANGE: u16 = __WASI_ERANGE; --pub const EROFS: u16 = __WASI_EROFS; --pub const ESPIPE: u16 = __WASI_ESPIPE; --pub const ESRCH: u16 = __WASI_ESRCH; --pub const ESTALE: u16 = __WASI_ESTALE; --pub const ETIMEDOUT: u16 = __WASI_ETIMEDOUT; --pub const ETXTBSY: u16 = __WASI_ETXTBSY; --pub const EXDEV: u16 = __WASI_EXDEV; --pub const ENOTCAPABLE: u16 = __WASI_ENOTCAPABLE; --pub const EVENT_FD_READWRITE_HANGUP: u16 = __WASI_EVENT_FD_READWRITE_HANGUP; --pub const EVENTTYPE_CLOCK: u8 = __WASI_EVENTTYPE_CLOCK; --pub const EVENTTYPE_FD_READ: u8 = __WASI_EVENTTYPE_FD_READ; --pub const EVENTTYPE_FD_WRITE: u8 = __WASI_EVENTTYPE_FD_WRITE; --pub const FDFLAG_APPEND: u16 = __WASI_FDFLAG_APPEND; --pub const FDFLAG_DSYNC: u16 = __WASI_FDFLAG_DSYNC; --pub const FDFLAG_NONBLOCK: u16 = __WASI_FDFLAG_NONBLOCK; --pub const FDFLAG_RSYNC: u16 = __WASI_FDFLAG_RSYNC; --pub const FDFLAG_SYNC: u16 = __WASI_FDFLAG_SYNC; --pub const FILETYPE_UNKNOWN: u8 = __WASI_FILETYPE_UNKNOWN; --pub const FILETYPE_BLOCK_DEVICE: u8 = __WASI_FILETYPE_BLOCK_DEVICE; --pub const FILETYPE_CHARACTER_DEVICE: u8 = __WASI_FILETYPE_CHARACTER_DEVICE; --pub const FILETYPE_DIRECTORY: u8 = __WASI_FILETYPE_DIRECTORY; --pub const FILETYPE_REGULAR_FILE: u8 = __WASI_FILETYPE_REGULAR_FILE; --pub const FILETYPE_SOCKET_DGRAM: u8 = __WASI_FILETYPE_SOCKET_DGRAM; --pub const FILETYPE_SOCKET_STREAM: u8 = __WASI_FILETYPE_SOCKET_STREAM; --pub const FILETYPE_SYMBOLIC_LINK: u8 = __WASI_FILETYPE_SYMBOLIC_LINK; --pub const FILESTAT_SET_ATIM: u16 = __WASI_FILESTAT_SET_ATIM; --pub const FILESTAT_SET_ATIM_NOW: u16 = __WASI_FILESTAT_SET_ATIM_NOW; --pub const FILESTAT_SET_MTIM: u16 = __WASI_FILESTAT_SET_MTIM; --pub const FILESTAT_SET_MTIM_NOW: u16 = __WASI_FILESTAT_SET_MTIM_NOW; --pub const LOOKUP_SYMLINK_FOLLOW: u32 = __WASI_LOOKUP_SYMLINK_FOLLOW; --pub const O_CREAT: u16 = __WASI_O_CREAT; --pub const O_DIRECTORY: u16 = __WASI_O_DIRECTORY; --pub const O_EXCL: u16 = __WASI_O_EXCL; --pub const O_TRUNC: u16 = __WASI_O_TRUNC; --pub const PREOPENTYPE_DIR: u8 = __WASI_PREOPENTYPE_DIR; --pub const SOCK_RECV_PEEK: u16 = __WASI_SOCK_RECV_PEEK; --pub const SOCK_RECV_WAITALL: u16 = __WASI_SOCK_RECV_WAITALL; --pub const RIGHT_FD_DATASYNC: u64 = __WASI_RIGHT_FD_DATASYNC; --pub const RIGHT_FD_READ: u64 = __WASI_RIGHT_FD_READ; --pub const RIGHT_FD_SEEK: u64 = __WASI_RIGHT_FD_SEEK; --pub const RIGHT_FD_FDSTAT_SET_FLAGS: u64 = __WASI_RIGHT_FD_FDSTAT_SET_FLAGS; --pub const RIGHT_FD_SYNC: u64 = __WASI_RIGHT_FD_SYNC; --pub const RIGHT_FD_TELL: u64 = __WASI_RIGHT_FD_TELL; --pub const RIGHT_FD_WRITE: u64 = __WASI_RIGHT_FD_WRITE; --pub const RIGHT_FD_ADVISE: u64 = __WASI_RIGHT_FD_ADVISE; --pub const RIGHT_FD_ALLOCATE: u64 = __WASI_RIGHT_FD_ALLOCATE; --pub const RIGHT_PATH_CREATE_DIRECTORY: u64 = __WASI_RIGHT_PATH_CREATE_DIRECTORY; --pub const RIGHT_PATH_CREATE_FILE: u64 = __WASI_RIGHT_PATH_CREATE_FILE; --pub const RIGHT_PATH_LINK_SOURCE: u64 = __WASI_RIGHT_PATH_LINK_SOURCE; --pub const RIGHT_PATH_LINK_TARGET: u64 = __WASI_RIGHT_PATH_LINK_TARGET; --pub const RIGHT_PATH_OPEN: u64 = __WASI_RIGHT_PATH_OPEN; --pub const RIGHT_FD_READDIR: u64 = __WASI_RIGHT_FD_READDIR; --pub const RIGHT_PATH_READLINK: u64 = __WASI_RIGHT_PATH_READLINK; --pub const RIGHT_PATH_RENAME_SOURCE: u64 = __WASI_RIGHT_PATH_RENAME_SOURCE; --pub const RIGHT_PATH_RENAME_TARGET: u64 = __WASI_RIGHT_PATH_RENAME_TARGET; --pub const RIGHT_PATH_FILESTAT_GET: u64 = __WASI_RIGHT_PATH_FILESTAT_GET; --pub const RIGHT_PATH_FILESTAT_SET_SIZE: u64 = __WASI_RIGHT_PATH_FILESTAT_SET_SIZE; --pub const RIGHT_PATH_FILESTAT_SET_TIMES: u64 = __WASI_RIGHT_PATH_FILESTAT_SET_TIMES; --pub const RIGHT_FD_FILESTAT_GET: u64 = __WASI_RIGHT_FD_FILESTAT_GET; --pub const RIGHT_FD_FILESTAT_SET_SIZE: u64 = __WASI_RIGHT_FD_FILESTAT_SET_SIZE; --pub const RIGHT_FD_FILESTAT_SET_TIMES: u64 = __WASI_RIGHT_FD_FILESTAT_SET_TIMES; --pub const RIGHT_PATH_SYMLINK: u64 = __WASI_RIGHT_PATH_SYMLINK; --pub const RIGHT_PATH_REMOVE_DIRECTORY: u64 = __WASI_RIGHT_PATH_REMOVE_DIRECTORY; --pub const RIGHT_PATH_UNLINK_FILE: u64 = __WASI_RIGHT_PATH_UNLINK_FILE; --pub const RIGHT_POLL_FD_READWRITE: u64 = __WASI_RIGHT_POLL_FD_READWRITE; --pub const RIGHT_SOCK_SHUTDOWN: u64 = __WASI_RIGHT_SOCK_SHUTDOWN; --pub const SOCK_RECV_DATA_TRUNCATED: u16 = __WASI_SOCK_RECV_DATA_TRUNCATED; --pub const SHUT_RD: u8 = __WASI_SHUT_RD; --pub const SHUT_WR: u8 = __WASI_SHUT_WR; --pub const SIGHUP: u8 = __WASI_SIGHUP; --pub const SIGINT: u8 = __WASI_SIGINT; --pub const SIGQUIT: u8 = __WASI_SIGQUIT; --pub const SIGILL: u8 = __WASI_SIGILL; --pub const SIGTRAP: u8 = __WASI_SIGTRAP; --pub const SIGABRT: u8 = __WASI_SIGABRT; --pub const SIGBUS: u8 = __WASI_SIGBUS; --pub const SIGFPE: u8 = __WASI_SIGFPE; --pub const SIGKILL: u8 = __WASI_SIGKILL; --pub const SIGUSR1: u8 = __WASI_SIGUSR1; --pub const SIGSEGV: u8 = __WASI_SIGSEGV; --pub const SIGUSR2: u8 = __WASI_SIGUSR2; --pub const SIGPIPE: u8 = __WASI_SIGPIPE; --pub const SIGALRM: u8 = __WASI_SIGALRM; --pub const SIGTERM: u8 = __WASI_SIGTERM; --pub const SIGCHLD: u8 = __WASI_SIGCHLD; --pub const SIGCONT: u8 = __WASI_SIGCONT; --pub const SIGSTOP: u8 = __WASI_SIGSTOP; --pub const SIGTSTP: u8 = __WASI_SIGTSTP; --pub const SIGTTIN: u8 = __WASI_SIGTTIN; --pub const SIGTTOU: u8 = __WASI_SIGTTOU; --pub const SIGURG: u8 = __WASI_SIGURG; --pub const SIGXCPU: u8 = __WASI_SIGXCPU; --pub const SIGXFSZ: u8 = __WASI_SIGXFSZ; --pub const SIGVTALRM: u8 = __WASI_SIGVTALRM; --pub const SIGPROF: u8 = __WASI_SIGPROF; --pub const SIGWINCH: u8 = __WASI_SIGWINCH; --pub const SIGPOLL: u8 = __WASI_SIGPOLL; --pub const SIGPWR: u8 = __WASI_SIGPWR; --pub const SIGSYS: u8 = __WASI_SIGSYS; --pub const SUBSCRIPTION_CLOCK_ABSTIME: u16 = __WASI_SUBSCRIPTION_CLOCK_ABSTIME; --pub const WHENCE_CUR: u8 = __WASI_WHENCE_CUR; --pub const WHENCE_END: u8 = __WASI_WHENCE_END; --pub const WHENCE_SET: u8 = __WASI_WHENCE_SET; -+pub const ADVICE_NORMAL: Advice = __WASI_ADVICE_NORMAL; -+pub const ADVICE_SEQUENTIAL: Advice = __WASI_ADVICE_SEQUENTIAL; -+pub const ADVICE_RANDOM: Advice = __WASI_ADVICE_RANDOM; -+pub const ADVICE_WILLNEED: Advice = __WASI_ADVICE_WILLNEED; -+pub const ADVICE_DONTNEED: Advice = __WASI_ADVICE_DONTNEED; -+pub const ADVICE_NOREUSE: Advice = __WASI_ADVICE_NOREUSE; -+pub const CLOCK_REALTIME: Clockid = __WASI_CLOCK_REALTIME; -+pub const CLOCK_MONOTONIC: Clockid = __WASI_CLOCK_MONOTONIC; -+pub const CLOCK_PROCESS_CPUTIME_ID: Clockid = __WASI_CLOCK_PROCESS_CPUTIME_ID; -+pub const CLOCK_THREAD_CPUTIME_ID: Clockid = __WASI_CLOCK_THREAD_CPUTIME_ID; -+pub const DIRCOOKIE_START: Dircookie = __WASI_DIRCOOKIE_START; -+pub const ESUCCESS: Errno = __WASI_ESUCCESS; -+pub const E2BIG: Errno = __WASI_E2BIG; -+pub const EACCES: Errno = __WASI_EACCES; -+pub const EADDRINUSE: Errno = __WASI_EADDRINUSE; -+pub const EADDRNOTAVAIL: Errno = __WASI_EADDRNOTAVAIL; -+pub const EAFNOSUPPORT: Errno = __WASI_EAFNOSUPPORT; -+pub const EAGAIN: Errno = __WASI_EAGAIN; -+pub const EALREADY: Errno = __WASI_EALREADY; -+pub const EBADF: Errno = __WASI_EBADF; -+pub const EBADMSG: Errno = __WASI_EBADMSG; -+pub const EBUSY: Errno = __WASI_EBUSY; -+pub const ECANCELED: Errno = __WASI_ECANCELED; -+pub const ECHILD: Errno = __WASI_ECHILD; -+pub const ECONNABORTED: Errno = __WASI_ECONNABORTED; -+pub const ECONNREFUSED: Errno = __WASI_ECONNREFUSED; -+pub const ECONNRESET: Errno = __WASI_ECONNRESET; -+pub const EDEADLK: Errno = __WASI_EDEADLK; -+pub const EDESTADDRREQ: Errno = __WASI_EDESTADDRREQ; -+pub const EDOM: Errno = __WASI_EDOM; -+pub const EDQUOT: Errno = __WASI_EDQUOT; -+pub const EEXIST: Errno = __WASI_EEXIST; -+pub const EFAULT: Errno = __WASI_EFAULT; -+pub const EFBIG: Errno = __WASI_EFBIG; -+pub const EHOSTUNREACH: Errno = __WASI_EHOSTUNREACH; -+pub const EIDRM: Errno = __WASI_EIDRM; -+pub const EILSEQ: Errno = __WASI_EILSEQ; -+pub const EINPROGRESS: Errno = __WASI_EINPROGRESS; -+pub const EINTR: Errno = __WASI_EINTR; -+pub const EINVAL: Errno = __WASI_EINVAL; -+pub const EIO: Errno = __WASI_EIO; -+pub const EISCONN: Errno = __WASI_EISCONN; -+pub const EISDIR: Errno = __WASI_EISDIR; -+pub const ELOOP: Errno = __WASI_ELOOP; -+pub const EMFILE: Errno = __WASI_EMFILE; -+pub const EMLINK: Errno = __WASI_EMLINK; -+pub const EMSGSIZE: Errno = __WASI_EMSGSIZE; -+pub const EMULTIHOP: Errno = __WASI_EMULTIHOP; -+pub const ENAMETOOLONG: Errno = __WASI_ENAMETOOLONG; -+pub const ENETDOWN: Errno = __WASI_ENETDOWN; -+pub const ENETRESET: Errno = __WASI_ENETRESET; -+pub const ENETUNREACH: Errno = __WASI_ENETUNREACH; -+pub const ENFILE: Errno = __WASI_ENFILE; -+pub const ENOBUFS: Errno = __WASI_ENOBUFS; -+pub const ENODEV: Errno = __WASI_ENODEV; -+pub const ENOENT: Errno = __WASI_ENOENT; -+pub const ENOEXEC: Errno = __WASI_ENOEXEC; -+pub const ENOLCK: Errno = __WASI_ENOLCK; -+pub const ENOLINK: Errno = __WASI_ENOLINK; -+pub const ENOMEM: Errno = __WASI_ENOMEM; -+pub const ENOMSG: Errno = __WASI_ENOMSG; -+pub const ENOPROTOOPT: Errno = __WASI_ENOPROTOOPT; -+pub const ENOSPC: Errno = __WASI_ENOSPC; -+pub const ENOSYS: Errno = __WASI_ENOSYS; -+pub const ENOTCONN: Errno = __WASI_ENOTCONN; -+pub const ENOTDIR: Errno = __WASI_ENOTDIR; -+pub const ENOTEMPTY: Errno = __WASI_ENOTEMPTY; -+pub const ENOTRECOVERABLE: Errno = __WASI_ENOTRECOVERABLE; -+pub const ENOTSOCK: Errno = __WASI_ENOTSOCK; -+pub const ENOTSUP: Errno = __WASI_ENOTSUP; -+pub const ENOTTY: Errno = __WASI_ENOTTY; -+pub const ENXIO: Errno = __WASI_ENXIO; -+pub const EOVERFLOW: Errno = __WASI_EOVERFLOW; -+pub const EOWNERDEAD: Errno = __WASI_EOWNERDEAD; -+pub const EPERM: Errno = __WASI_EPERM; -+pub const EPIPE: Errno = __WASI_EPIPE; -+pub const EPROTO: Errno = __WASI_EPROTO; -+pub const EPROTONOSUPPORT: Errno = __WASI_EPROTONOSUPPORT; -+pub const EPROTOTYPE: Errno = __WASI_EPROTOTYPE; -+pub const ERANGE: Errno = __WASI_ERANGE; -+pub const EROFS: Errno = __WASI_EROFS; -+pub const ESPIPE: Errno = __WASI_ESPIPE; -+pub const ESRCH: Errno = __WASI_ESRCH; -+pub const ESTALE: Errno = __WASI_ESTALE; -+pub const ETIMEDOUT: Errno = __WASI_ETIMEDOUT; -+pub const ETXTBSY: Errno = __WASI_ETXTBSY; -+pub const EXDEV: Errno = __WASI_EXDEV; -+pub const ENOTCAPABLE: Errno = __WASI_ENOTCAPABLE; -+pub const EVENTTYPE_CLOCK: Eventtype = __WASI_EVENTTYPE_CLOCK; -+pub const EVENTTYPE_FD_READ: Eventtype = __WASI_EVENTTYPE_FD_READ; -+pub const EVENTTYPE_FD_WRITE: Eventtype = __WASI_EVENTTYPE_FD_WRITE; -+pub const FILETYPE_UNKNOWN: Filetype = __WASI_FILETYPE_UNKNOWN; -+pub const FILETYPE_BLOCK_DEVICE: Filetype = __WASI_FILETYPE_BLOCK_DEVICE; -+pub const FILETYPE_CHARACTER_DEVICE: Filetype = __WASI_FILETYPE_CHARACTER_DEVICE; -+pub const FILETYPE_DIRECTORY: Filetype = __WASI_FILETYPE_DIRECTORY; -+pub const FILETYPE_REGULAR_FILE: Filetype = __WASI_FILETYPE_REGULAR_FILE; -+pub const FILETYPE_SOCKET_DGRAM: Filetype = __WASI_FILETYPE_SOCKET_DGRAM; -+pub const FILETYPE_SOCKET_STREAM: Filetype = __WASI_FILETYPE_SOCKET_STREAM; -+pub const FILETYPE_SYMBOLIC_LINK: Filetype = __WASI_FILETYPE_SYMBOLIC_LINK; -+pub const PREOPENTYPE_DIR: Preopentype = __WASI_PREOPENTYPE_DIR; -+pub const SIGHUP: Signal = __WASI_SIGHUP; -+pub const SIGINT: Signal = __WASI_SIGINT; -+pub const SIGQUIT: Signal = __WASI_SIGQUIT; -+pub const SIGILL: Signal = __WASI_SIGILL; -+pub const SIGTRAP: Signal = __WASI_SIGTRAP; -+pub const SIGABRT: Signal = __WASI_SIGABRT; -+pub const SIGBUS: Signal = __WASI_SIGBUS; -+pub const SIGFPE: Signal = __WASI_SIGFPE; -+pub const SIGKILL: Signal = __WASI_SIGKILL; -+pub const SIGUSR1: Signal = __WASI_SIGUSR1; -+pub const SIGSEGV: Signal = __WASI_SIGSEGV; -+pub const SIGUSR2: Signal = __WASI_SIGUSR2; -+pub const SIGPIPE: Signal = __WASI_SIGPIPE; -+pub const SIGALRM: Signal = __WASI_SIGALRM; -+pub const SIGTERM: Signal = __WASI_SIGTERM; -+pub const SIGCHLD: Signal = __WASI_SIGCHLD; -+pub const SIGCONT: Signal = __WASI_SIGCONT; -+pub const SIGSTOP: Signal = __WASI_SIGSTOP; -+pub const SIGTSTP: Signal = __WASI_SIGTSTP; -+pub const SIGTTIN: Signal = __WASI_SIGTTIN; -+pub const SIGTTOU: Signal = __WASI_SIGTTOU; -+pub const SIGURG: Signal = __WASI_SIGURG; -+pub const SIGXCPU: Signal = __WASI_SIGXCPU; -+pub const SIGXFSZ: Signal = __WASI_SIGXFSZ; -+pub const SIGVTALRM: Signal = __WASI_SIGVTALRM; -+pub const SIGPROF: Signal = __WASI_SIGPROF; -+pub const SIGWINCH: Signal = __WASI_SIGWINCH; -+pub const SIGPOLL: Signal = __WASI_SIGPOLL; -+pub const SIGPWR: Signal = __WASI_SIGPWR; -+pub const SIGSYS: Signal = __WASI_SIGSYS; -+pub const SOCK_RECV_DATA_TRUNCATED: Roflags = __WASI_SOCK_RECV_DATA_TRUNCATED; -+ -+bitflags! { -+ pub struct Sdflags: __wasi_sdflags_t { -+ const SHUT_RD = __WASI_SHUT_RD; -+ const SHUT_WR = __WASI_SHUT_WR; -+ } -+} -+ -+bitflags! { -+ pub struct Riflags: __wasi_riflags_t { -+ const PEEK = __WASI_SOCK_RECV_PEEK; -+ const WAITALL = __WASI_SOCK_RECV_WAITALL; -+ } -+} -+ -+bitflags! { -+ pub struct Eventrwflags: __wasi_eventrwflags_t { -+ const FD_READWRITE_HANGUP = __WASI_EVENT_FD_READWRITE_HANGUP; -+ } -+} -+ -+bitflags! { -+ pub struct Subclockflags: __wasi_subclockflags_t { -+ const SUBSCRIPTION_CLOCK_ABSTIME = __WASI_SUBSCRIPTION_CLOCK_ABSTIME; -+ } -+} -+ -+bitflags! { -+ pub struct Oflags: __wasi_oflags_t { -+ const CREAT = __WASI_O_CREAT; -+ const DIRECTORY = __WASI_O_DIRECTORY; -+ const EXCL = __WASI_O_EXCL; -+ const TRUNC = __WASI_O_TRUNC; -+ } -+} -+ -+bitflags! { -+ pub struct Fdflags: __wasi_fdflags_t { -+ const APPEND = __WASI_FDFLAG_APPEND; -+ const DSYNC = __WASI_FDFLAG_DSYNC; -+ const NONBLOCK = __WASI_FDFLAG_NONBLOCK; -+ const RSYNC = __WASI_FDFLAG_RSYNC; -+ const SYNC = __WASI_FDFLAG_SYNC; -+ } -+} -+ -+bitflags! { -+ pub struct Lookupflags: __wasi_lookupflags_t { -+ const SYMLINK_FOLLOW = __WASI_LOOKUP_SYMLINK_FOLLOW; -+ } -+} -+ -+bitflags! { -+ pub struct Rights: __wasi_rights_t { -+ const FD_DATASYNC = __WASI_RIGHT_FD_DATASYNC; -+ const FD_READ = __WASI_RIGHT_FD_READ; -+ const FD_SEEK = __WASI_RIGHT_FD_SEEK; -+ const FD_FDSTAT_SET_FLAGS = __WASI_RIGHT_FD_FDSTAT_SET_FLAGS; -+ const FD_SYNC = __WASI_RIGHT_FD_SYNC; -+ const FD_TELL = __WASI_RIGHT_FD_TELL; -+ const FD_WRITE = __WASI_RIGHT_FD_WRITE; -+ const FD_ADVISE = __WASI_RIGHT_FD_ADVISE; -+ const FD_ALLOCATE = __WASI_RIGHT_FD_ALLOCATE; -+ const PATH_CREATE_DIRECTORY = __WASI_RIGHT_PATH_CREATE_DIRECTORY; -+ const PATH_CREATE_FILE = __WASI_RIGHT_PATH_CREATE_FILE; -+ const PATH_LINK_SOURCE = __WASI_RIGHT_PATH_LINK_SOURCE; -+ const PATH_LINK_TARGET = __WASI_RIGHT_PATH_LINK_TARGET; -+ const PATH_OPEN = __WASI_RIGHT_PATH_OPEN; -+ const FD_READDIR = __WASI_RIGHT_FD_READDIR; -+ const PATH_READLINK = __WASI_RIGHT_PATH_READLINK; -+ const PATH_RENAME_SOURCE = __WASI_RIGHT_PATH_RENAME_SOURCE; -+ const PATH_RENAME_TARGET = __WASI_RIGHT_PATH_RENAME_TARGET; -+ const PATH_FILESTAT_GET = __WASI_RIGHT_PATH_FILESTAT_GET; -+ const PATH_FILESTAT_SET_SIZE = __WASI_RIGHT_PATH_FILESTAT_SET_SIZE; -+ const PATH_FILESTAT_SET_TIMES = __WASI_RIGHT_PATH_FILESTAT_SET_TIMES; -+ const FD_FILESTAT_GET = __WASI_RIGHT_FD_FILESTAT_GET; -+ const FD_FILESTAT_SET_SIZE = __WASI_RIGHT_FD_FILESTAT_SET_SIZE; -+ const FD_FILESTAT_SET_TIMES = __WASI_RIGHT_FD_FILESTAT_SET_TIMES; -+ const PATH_SYMLINK = __WASI_RIGHT_PATH_SYMLINK; -+ const PATH_REMOVE_DIRECTORY = __WASI_RIGHT_PATH_REMOVE_DIRECTORY; -+ const PATH_UNLINK_FILE = __WASI_RIGHT_PATH_UNLINK_FILE; -+ const POLL_FD_READWRITE = __WASI_RIGHT_POLL_FD_READWRITE; -+ const SOCK_SHUTDOWN = __WASI_RIGHT_SOCK_SHUTDOWN; -+ } -+} -+ -+bitflags! { -+ pub struct Fstflags: __wasi_fstflags_t { -+ const SET_ATIM = __WASI_FILESTAT_SET_ATIM; -+ const SET_ATIM_NOW = __WASI_FILESTAT_SET_ATIM_NOW; -+ const SET_MTIM = __WASI_FILESTAT_SET_MTIM; -+ const SET_MTIM_NOW = __WASI_FILESTAT_SET_MTIM_NOW; -+ } -+} - - pub fn clock_res_get(clock_id: Clockid) -> (Errno, Timestamp) { - let mut resolution = MaybeUninit::<Timestamp>::uninit(); -@@ -333,11 +366,11 @@ pub fn fd_fdstat_get(fd: Fd) -> (Errno, Fdstat) { - } - - pub fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Errno { -- unsafe { __wasi_fd_fdstat_set_flags(fd, flags) } -+ unsafe { __wasi_fd_fdstat_set_flags(fd, flags.bits()) } - } - - pub fn fd_fdstat_set_rights(fd: Fd, fs_rights_base: Rights, fs_rights_inheriting: Rights) -> Errno { -- unsafe { __wasi_fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting) } -+ unsafe { __wasi_fd_fdstat_set_rights(fd, fs_rights_base.bits(), fs_rights_inheriting.bits()) } - } - - pub fn fd_sync(fd: Fd) -> Errno { -@@ -376,7 +409,7 @@ pub fn path_link( - unsafe { - __wasi_path_link( - old_fd, -- old_flags, -+ old_flags.bits(), - old_path.as_ptr(), - old_path.len(), - new_fd, -@@ -400,13 +433,13 @@ pub fn path_open( - ( - __wasi_path_open( - dirfd, -- dirflags, -+ dirflags.bits(), - path.as_ptr(), - path.len(), -- oflags, -- fs_rights_base, -- fs_rights_inheriting, -- fs_flags, -+ oflags.bits(), -+ fs_rights_base.bits(), -+ fs_rights_inheriting.bits(), -+ fs_flags.bits(), - fd.as_mut_ptr(), - ), - fd.assume_init(), -@@ -476,7 +509,7 @@ pub fn fd_filestat_set_times( - st_mtim: Timestamp, - fstflags: Fstflags, - ) -> Errno { -- unsafe { __wasi_fd_filestat_set_times(fd, st_atim, st_mtim, fstflags) } -+ unsafe { __wasi_fd_filestat_set_times(fd, st_atim, st_mtim, fstflags.bits()) } - } - - pub fn fd_filestat_set_size(fd: Fd, st_size: Filesize) -> Errno { -@@ -487,7 +520,13 @@ pub fn path_filestat_get(fd: Fd, flags: Lookupflags, path: &[u8]) -> (Errno, Fil - let mut buf = MaybeUninit::<Filestat>::uninit(); - unsafe { - ( -- __wasi_path_filestat_get(fd, flags, path.as_ptr(), path.len(), buf.as_mut_ptr()), -+ __wasi_path_filestat_get( -+ fd, -+ flags.bits(), -+ path.as_ptr(), -+ path.len(), -+ buf.as_mut_ptr(), -+ ), - buf.assume_init(), - ) - } -@@ -504,12 +543,12 @@ pub fn path_filestat_set_times( - unsafe { - __wasi_path_filestat_set_times( - fd, -- flags, -+ flags.bits(), - path.as_ptr(), - path.len(), - st_atim, - st_mtim, -- fstflags, -+ fstflags.bits(), - ) - } - } -@@ -567,7 +606,7 @@ pub fn sock_recv(sock: Fd, ri_data: &[Iovec], ri_flags: Riflags) -> (Errno, usiz - sock, - ri_data.as_ptr(), - ri_data.len(), -- ri_flags, -+ ri_flags.bits(), - ro_datalen.as_mut_ptr(), - ro_flags.as_mut_ptr(), - ), -@@ -594,7 +633,7 @@ pub fn sock_send(sock: Fd, si_data: &[Ciovec], si_flags: Siflags) -> (Errno, usi - } - - pub fn sock_shutdown(sock: Fd, how: Sdflags) -> Errno { -- unsafe { __wasi_sock_shutdown(sock, how) } -+ unsafe { __wasi_sock_shutdown(sock, how.bits()) } - } - - pub fn sched_yield() -> Errno { diff --git a/vendor/wasi-0.7.0/rusty-tags.vi b/vendor/wasi-0.7.0/rusty-tags.vi deleted file mode 100644 index 48185c1ce4..0000000000 --- a/vendor/wasi-0.7.0/rusty-tags.vi +++ /dev/null @@ -1,477 +0,0 @@ -!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ -!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ -!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ -!_TAG_PROGRAM_NAME Exuberant Ctags // -!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ -!_TAG_PROGRAM_VERSION 5.9~svn20110310 // -ADVICE_DONTNEED /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const ADVICE_DONTNEED: Advice = __WASI_ADVICE_DONTNEED;$/;" c -ADVICE_NOREUSE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const ADVICE_NOREUSE: Advice = __WASI_ADVICE_NOREUSE;$/;" c -ADVICE_NORMAL /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const ADVICE_NORMAL: Advice = __WASI_ADVICE_NORMAL;$/;" c -ADVICE_RANDOM /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const ADVICE_RANDOM: Advice = __WASI_ADVICE_RANDOM;$/;" c -ADVICE_SEQUENTIAL /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const ADVICE_SEQUENTIAL: Advice = __WASI_ADVICE_SEQUENTIAL;$/;" c -ADVICE_WILLNEED /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const ADVICE_WILLNEED: Advice = __WASI_ADVICE_WILLNEED;$/;" c -Advice /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Advice = __wasi_advice_t;$/;" T -ArgsSizes /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub struct ArgsSizes {$/;" s -CIoVec /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type CIoVec = __wasi_ciovec_t;$/;" T -CLOCK_MONOTONIC /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const CLOCK_MONOTONIC: ClockId = __WASI_CLOCK_MONOTONIC;$/;" c -CLOCK_PROCESS_CPUTIME_ID /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const CLOCK_PROCESS_CPUTIME_ID: ClockId = __WASI_CLOCK_PROCESS_CPUTIME_ID;$/;" c -CLOCK_REALTIME /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const CLOCK_REALTIME: ClockId = __WASI_CLOCK_REALTIME;$/;" c -CLOCK_THREAD_CPUTIME_ID /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const CLOCK_THREAD_CPUTIME_ID: ClockId = __WASI_CLOCK_THREAD_CPUTIME_ID;$/;" c -ClockId /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type ClockId = __wasi_clockid_t;$/;" T -DIRCOOKIE_START /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const DIRCOOKIE_START: DirCookie = __WASI_DIRCOOKIE_START;$/;" c -Device /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Device = __wasi_device_t;$/;" T -DirCookie /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type DirCookie = __wasi_dircookie_t;$/;" T -Dirent /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Dirent = __wasi_dirent_t;$/;" T -EVENTTYPE_CLOCK /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const EVENTTYPE_CLOCK: EventType = __WASI_EVENTTYPE_CLOCK;$/;" c -EVENTTYPE_FD_READ /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const EVENTTYPE_FD_READ: EventType = __WASI_EVENTTYPE_FD_READ;$/;" c -EVENTTYPE_FD_WRITE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const EVENTTYPE_FD_WRITE: EventType = __WASI_EVENTTYPE_FD_WRITE;$/;" c -EVENT_FD_READWRITE_HANGUP /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const EVENT_FD_READWRITE_HANGUP: EventRwFlags = __WASI_EVENT_FD_READWRITE_HANGUP;$/;" c -EnvironSizes /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub struct EnvironSizes {$/;" s -Errno /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Errno = __wasi_errno_t;$/;" T -Error /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Error = NonZeroU16;$/;" T -Event /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Event = __wasi_event_t;$/;" T -EventRwFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type EventRwFlags = __wasi_eventrwflags_t;$/;" T -EventType /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type EventType = __wasi_eventtype_t;$/;" T -ExitCode /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type ExitCode = __wasi_exitcode_t;$/;" T -FDFLAG_APPEND /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FDFLAG_APPEND: FdFlags = __WASI_FDFLAG_APPEND;$/;" c -FDFLAG_DSYNC /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FDFLAG_DSYNC: FdFlags = __WASI_FDFLAG_DSYNC;$/;" c -FDFLAG_NONBLOCK /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FDFLAG_NONBLOCK: FdFlags = __WASI_FDFLAG_NONBLOCK;$/;" c -FDFLAG_RSYNC /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FDFLAG_RSYNC: FdFlags = __WASI_FDFLAG_RSYNC;$/;" c -FDFLAG_SYNC /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FDFLAG_SYNC: FdFlags = __WASI_FDFLAG_SYNC;$/;" c -FILESTAT_SET_ATIM /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILESTAT_SET_ATIM: FstFlags = __WASI_FILESTAT_SET_ATIM;$/;" c -FILESTAT_SET_ATIM_NOW /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILESTAT_SET_ATIM_NOW: FstFlags = __WASI_FILESTAT_SET_ATIM_NOW;$/;" c -FILESTAT_SET_MTIM /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILESTAT_SET_MTIM: FstFlags = __WASI_FILESTAT_SET_MTIM;$/;" c -FILESTAT_SET_MTIM_NOW /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILESTAT_SET_MTIM_NOW: FstFlags = __WASI_FILESTAT_SET_MTIM_NOW;$/;" c -FILETYPE_BLOCK_DEVICE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILETYPE_BLOCK_DEVICE: FileType = __WASI_FILETYPE_BLOCK_DEVICE;$/;" c -FILETYPE_CHARACTER_DEVICE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILETYPE_CHARACTER_DEVICE: FileType = __WASI_FILETYPE_CHARACTER_DEVICE;$/;" c -FILETYPE_DIRECTORY /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILETYPE_DIRECTORY: FileType = __WASI_FILETYPE_DIRECTORY;$/;" c -FILETYPE_REGULAR_FILE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILETYPE_REGULAR_FILE: FileType = __WASI_FILETYPE_REGULAR_FILE;$/;" c -FILETYPE_SOCKET_DGRAM /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILETYPE_SOCKET_DGRAM: FileType = __WASI_FILETYPE_SOCKET_DGRAM;$/;" c -FILETYPE_SOCKET_STREAM /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILETYPE_SOCKET_STREAM: FileType = __WASI_FILETYPE_SOCKET_STREAM;$/;" c -FILETYPE_SYMBOLIC_LINK /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILETYPE_SYMBOLIC_LINK: FileType = __WASI_FILETYPE_SYMBOLIC_LINK;$/;" c -FILETYPE_UNKNOWN /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const FILETYPE_UNKNOWN: FileType = __WASI_FILETYPE_UNKNOWN;$/;" c -Fd /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Fd = __wasi_fd_t;$/;" T -FdFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type FdFlags = __wasi_fdflags_t;$/;" T -FdStat /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type FdStat = __wasi_fdstat_t;$/;" T -FileDelta /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type FileDelta = __wasi_filedelta_t;$/;" T -FileSize /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type FileSize = __wasi_filesize_t;$/;" T -FileStat /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type FileStat = __wasi_filestat_t;$/;" T -FileType /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type FileType = __wasi_filetype_t;$/;" T -FstFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type FstFlags = __wasi_fstflags_t;$/;" T -Inode /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Inode = __wasi_inode_t;$/;" T -IoVec /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type IoVec = __wasi_iovec_t;$/;" T -LOOKUP_SYMLINK_FOLLOW /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const LOOKUP_SYMLINK_FOLLOW: LookupFlags = __WASI_LOOKUP_SYMLINK_FOLLOW;$/;" c -LinkCount /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type LinkCount = __wasi_linkcount_t;$/;" T -LookupFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type LookupFlags = __wasi_lookupflags_t;$/;" T -OFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type OFlags = __wasi_oflags_t;$/;" T -O_CREAT /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const O_CREAT: OFlags = __WASI_O_CREAT;$/;" c -O_DIRECTORY /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const O_DIRECTORY: OFlags = __WASI_O_DIRECTORY;$/;" c -O_EXCL /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const O_EXCL: OFlags = __WASI_O_EXCL;$/;" c -O_TRUNC /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const O_TRUNC: OFlags = __WASI_O_TRUNC;$/;" c -PREOPENTYPE_DIR /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const PREOPENTYPE_DIR: PreopenType = __WASI_PREOPENTYPE_DIR;$/;" c -PreopenType /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type PreopenType = __wasi_preopentype_t;$/;" T -Prestat /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Prestat = __wasi_prestat_t;$/;" T -RIGHT_FD_ADVISE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_ADVISE: Rights = __WASI_RIGHT_FD_ADVISE;$/;" c -RIGHT_FD_ALLOCATE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_ALLOCATE: Rights = __WASI_RIGHT_FD_ALLOCATE;$/;" c -RIGHT_FD_DATASYNC /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_DATASYNC: Rights = __WASI_RIGHT_FD_DATASYNC;$/;" c -RIGHT_FD_FDSTAT_SET_FLAGS /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_FDSTAT_SET_FLAGS: Rights = __WASI_RIGHT_FD_FDSTAT_SET_FLAGS;$/;" c -RIGHT_FD_FILESTAT_GET /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_FILESTAT_GET: Rights = __WASI_RIGHT_FD_FILESTAT_GET;$/;" c -RIGHT_FD_FILESTAT_SET_SIZE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_FILESTAT_SET_SIZE: Rights = __WASI_RIGHT_FD_FILESTAT_SET_SIZE;$/;" c -RIGHT_FD_FILESTAT_SET_TIMES /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_FILESTAT_SET_TIMES: Rights = __WASI_RIGHT_FD_FILESTAT_SET_TIMES;$/;" c -RIGHT_FD_READ /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_READ: Rights = __WASI_RIGHT_FD_READ;$/;" c -RIGHT_FD_READDIR /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_READDIR: Rights = __WASI_RIGHT_FD_READDIR;$/;" c -RIGHT_FD_SEEK /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_SEEK: Rights = __WASI_RIGHT_FD_SEEK;$/;" c -RIGHT_FD_SYNC /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_SYNC: Rights = __WASI_RIGHT_FD_SYNC;$/;" c -RIGHT_FD_TELL /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_TELL: Rights = __WASI_RIGHT_FD_TELL;$/;" c -RIGHT_FD_WRITE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_FD_WRITE: Rights = __WASI_RIGHT_FD_WRITE;$/;" c -RIGHT_PATH_CREATE_DIRECTORY /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_CREATE_DIRECTORY: Rights = __WASI_RIGHT_PATH_CREATE_DIRECTORY;$/;" c -RIGHT_PATH_CREATE_FILE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_CREATE_FILE: Rights = __WASI_RIGHT_PATH_CREATE_FILE;$/;" c -RIGHT_PATH_FILESTAT_GET /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_FILESTAT_GET: Rights = __WASI_RIGHT_PATH_FILESTAT_GET;$/;" c -RIGHT_PATH_FILESTAT_SET_SIZE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_FILESTAT_SET_SIZE: Rights = __WASI_RIGHT_PATH_FILESTAT_SET_SIZE;$/;" c -RIGHT_PATH_FILESTAT_SET_TIMES /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_FILESTAT_SET_TIMES: Rights = __WASI_RIGHT_PATH_FILESTAT_SET_TIMES;$/;" c -RIGHT_PATH_LINK_SOURCE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_LINK_SOURCE: Rights = __WASI_RIGHT_PATH_LINK_SOURCE;$/;" c -RIGHT_PATH_LINK_TARGET /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_LINK_TARGET: Rights = __WASI_RIGHT_PATH_LINK_TARGET;$/;" c -RIGHT_PATH_OPEN /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_OPEN: Rights = __WASI_RIGHT_PATH_OPEN;$/;" c -RIGHT_PATH_READLINK /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_READLINK: Rights = __WASI_RIGHT_PATH_READLINK;$/;" c -RIGHT_PATH_REMOVE_DIRECTORY /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_REMOVE_DIRECTORY: Rights = __WASI_RIGHT_PATH_REMOVE_DIRECTORY;$/;" c -RIGHT_PATH_RENAME_SOURCE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_RENAME_SOURCE: Rights = __WASI_RIGHT_PATH_RENAME_SOURCE;$/;" c -RIGHT_PATH_RENAME_TARGET /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_RENAME_TARGET: Rights = __WASI_RIGHT_PATH_RENAME_TARGET;$/;" c -RIGHT_PATH_SYMLINK /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_SYMLINK: Rights = __WASI_RIGHT_PATH_SYMLINK;$/;" c -RIGHT_PATH_UNLINK_FILE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_PATH_UNLINK_FILE: Rights = __WASI_RIGHT_PATH_UNLINK_FILE;$/;" c -RIGHT_POLL_FD_READWRITE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_POLL_FD_READWRITE: Rights = __WASI_RIGHT_POLL_FD_READWRITE;$/;" c -RIGHT_SOCK_SHUTDOWN /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const RIGHT_SOCK_SHUTDOWN: Rights = __WASI_RIGHT_SOCK_SHUTDOWN;$/;" c -RiFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type RiFlags = __wasi_riflags_t;$/;" T -Rights /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Rights = __wasi_rights_t;$/;" T -RoFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type RoFlags = __wasi_roflags_t;$/;" T -SHUT_RD /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SHUT_RD: SdFlags = __WASI_SHUT_RD;$/;" c -SHUT_WR /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SHUT_WR: SdFlags = __WASI_SHUT_WR;$/;" c -SIGABRT /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGABRT: Signal = __WASI_SIGABRT;$/;" c -SIGALRM /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGALRM: Signal = __WASI_SIGALRM;$/;" c -SIGBUS /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGBUS: Signal = __WASI_SIGBUS;$/;" c -SIGCHLD /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGCHLD: Signal = __WASI_SIGCHLD;$/;" c -SIGCONT /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGCONT: Signal = __WASI_SIGCONT;$/;" c -SIGFPE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGFPE: Signal = __WASI_SIGFPE;$/;" c -SIGHUP /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGHUP: Signal = __WASI_SIGHUP;$/;" c -SIGILL /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGILL: Signal = __WASI_SIGILL;$/;" c -SIGINT /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGINT: Signal = __WASI_SIGINT;$/;" c -SIGKILL /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGKILL: Signal = __WASI_SIGKILL;$/;" c -SIGPIPE /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGPIPE: Signal = __WASI_SIGPIPE;$/;" c -SIGPOLL /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGPOLL: Signal = __WASI_SIGPOLL;$/;" c -SIGPROF /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGPROF: Signal = __WASI_SIGPROF;$/;" c -SIGPWR /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGPWR: Signal = __WASI_SIGPWR;$/;" c -SIGQUIT /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGQUIT: Signal = __WASI_SIGQUIT;$/;" c -SIGSEGV /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGSEGV: Signal = __WASI_SIGSEGV;$/;" c -SIGSTOP /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGSTOP: Signal = __WASI_SIGSTOP;$/;" c -SIGSYS /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGSYS: Signal = __WASI_SIGSYS;$/;" c -SIGTERM /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGTERM: Signal = __WASI_SIGTERM;$/;" c -SIGTRAP /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGTRAP: Signal = __WASI_SIGTRAP;$/;" c -SIGTSTP /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGTSTP: Signal = __WASI_SIGTSTP;$/;" c -SIGTTIN /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGTTIN: Signal = __WASI_SIGTTIN;$/;" c -SIGTTOU /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGTTOU: Signal = __WASI_SIGTTOU;$/;" c -SIGURG /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGURG: Signal = __WASI_SIGURG;$/;" c -SIGUSR1 /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGUSR1: Signal = __WASI_SIGUSR1;$/;" c -SIGUSR2 /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGUSR2: Signal = __WASI_SIGUSR2;$/;" c -SIGVTALRM /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGVTALRM: Signal = __WASI_SIGVTALRM;$/;" c -SIGWINCH /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGWINCH: Signal = __WASI_SIGWINCH;$/;" c -SIGXCPU /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGXCPU: Signal = __WASI_SIGXCPU;$/;" c -SIGXFSZ /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SIGXFSZ: Signal = __WASI_SIGXFSZ;$/;" c -SOCK_RECV_DATA_TRUNCATED /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SOCK_RECV_DATA_TRUNCATED: RoFlags = __WASI_SOCK_RECV_DATA_TRUNCATED;$/;" c -SOCK_RECV_PEEK /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SOCK_RECV_PEEK: RiFlags = __WASI_SOCK_RECV_PEEK;$/;" c -SOCK_RECV_WAITALL /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SOCK_RECV_WAITALL: RiFlags = __WASI_SOCK_RECV_WAITALL;$/;" c -STDERR_FD /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const STDERR_FD: Fd = __WASI_STDERR_FD;$/;" c -STDIN_FD /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const STDIN_FD: Fd = __WASI_STDIN_FD;$/;" c -STDOUT_FD /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const STDOUT_FD: Fd = __WASI_STDOUT_FD;$/;" c -SUBSCRIPTION_CLOCK_ABSTIME /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const SUBSCRIPTION_CLOCK_ABSTIME: SubclockFlags = __WASI_SUBSCRIPTION_CLOCK_ABSTIME;$/;" c -SdFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type SdFlags = __wasi_sdflags_t;$/;" T -SiFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type SiFlags = __wasi_siflags_t;$/;" T -Signal /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Signal = __wasi_signal_t;$/;" T -SubclockFlags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type SubclockFlags = __wasi_subclockflags_t;$/;" T -Subscription /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Subscription = __wasi_subscription_t;$/;" T -Timestamp /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Timestamp = __wasi_timestamp_t;$/;" T -Userdata /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Userdata = __wasi_userdata_t;$/;" T -WHENCE_CUR /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const WHENCE_CUR: Whence = __WASI_WHENCE_CUR;$/;" c -WHENCE_END /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const WHENCE_END: Whence = __WASI_WHENCE_END;$/;" c -WHENCE_SET /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub const WHENCE_SET: Whence = __WASI_WHENCE_SET;$/;" c -Whence /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub type Whence = __wasi_whence_t;$/;" T -_ASSERT1 /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^const _ASSERT1: [(); 0] = [(); __WASI_ESUCCESS as usize];$/;" c -__WASI_ADVICE_DONTNEED /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ADVICE_DONTNEED: u8 = 4;$/;" c -__WASI_ADVICE_NOREUSE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ADVICE_NOREUSE: u8 = 5;$/;" c -__WASI_ADVICE_NORMAL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ADVICE_NORMAL: u8 = 0;$/;" c -__WASI_ADVICE_RANDOM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ADVICE_RANDOM: u8 = 2;$/;" c -__WASI_ADVICE_SEQUENTIAL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ADVICE_SEQUENTIAL: u8 = 1;$/;" c -__WASI_ADVICE_WILLNEED /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ADVICE_WILLNEED: u8 = 3;$/;" c -__WASI_CLOCK_MONOTONIC /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_CLOCK_MONOTONIC: u32 = 1;$/;" c -__WASI_CLOCK_PROCESS_CPUTIME_ID /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_CLOCK_PROCESS_CPUTIME_ID: u32 = 2;$/;" c -__WASI_CLOCK_REALTIME /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_CLOCK_REALTIME: u32 = 0;$/;" c -__WASI_CLOCK_THREAD_CPUTIME_ID /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_CLOCK_THREAD_CPUTIME_ID: u32 = 3;$/;" c -__WASI_DIRCOOKIE_START /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_DIRCOOKIE_START: u64 = 0;$/;" c -__WASI_E2BIG /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_E2BIG: u16 = 1;$/;" c -__WASI_EACCES /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EACCES: u16 = 2;$/;" c -__WASI_EADDRINUSE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EADDRINUSE: u16 = 3;$/;" c -__WASI_EADDRNOTAVAIL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EADDRNOTAVAIL: u16 = 4;$/;" c -__WASI_EAFNOSUPPORT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EAFNOSUPPORT: u16 = 5;$/;" c -__WASI_EAGAIN /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EAGAIN: u16 = 6;$/;" c -__WASI_EALREADY /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EALREADY: u16 = 7;$/;" c -__WASI_EBADF /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EBADF: u16 = 8;$/;" c -__WASI_EBADMSG /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EBADMSG: u16 = 9;$/;" c -__WASI_EBUSY /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EBUSY: u16 = 10;$/;" c -__WASI_ECANCELED /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ECANCELED: u16 = 11;$/;" c -__WASI_ECHILD /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ECHILD: u16 = 12;$/;" c -__WASI_ECONNABORTED /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ECONNABORTED: u16 = 13;$/;" c -__WASI_ECONNREFUSED /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ECONNREFUSED: u16 = 14;$/;" c -__WASI_ECONNRESET /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ECONNRESET: u16 = 15;$/;" c -__WASI_EDEADLK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EDEADLK: u16 = 16;$/;" c -__WASI_EDESTADDRREQ /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EDESTADDRREQ: u16 = 17;$/;" c -__WASI_EDOM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EDOM: u16 = 18;$/;" c -__WASI_EDQUOT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EDQUOT: u16 = 19;$/;" c -__WASI_EEXIST /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EEXIST: u16 = 20;$/;" c -__WASI_EFAULT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EFAULT: u16 = 21;$/;" c -__WASI_EFBIG /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EFBIG: u16 = 22;$/;" c -__WASI_EHOSTUNREACH /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EHOSTUNREACH: u16 = 23;$/;" c -__WASI_EIDRM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EIDRM: u16 = 24;$/;" c -__WASI_EILSEQ /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EILSEQ: u16 = 25;$/;" c -__WASI_EINPROGRESS /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EINPROGRESS: u16 = 26;$/;" c -__WASI_EINTR /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EINTR: u16 = 27;$/;" c -__WASI_EINVAL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EINVAL: u16 = 28;$/;" c -__WASI_EIO /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EIO: u16 = 29;$/;" c -__WASI_EISCONN /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EISCONN: u16 = 30;$/;" c -__WASI_EISDIR /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EISDIR: u16 = 31;$/;" c -__WASI_ELOOP /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ELOOP: u16 = 32;$/;" c -__WASI_EMFILE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EMFILE: u16 = 33;$/;" c -__WASI_EMLINK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EMLINK: u16 = 34;$/;" c -__WASI_EMSGSIZE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EMSGSIZE: u16 = 35;$/;" c -__WASI_EMULTIHOP /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EMULTIHOP: u16 = 36;$/;" c -__WASI_ENAMETOOLONG /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENAMETOOLONG: u16 = 37;$/;" c -__WASI_ENETDOWN /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENETDOWN: u16 = 38;$/;" c -__WASI_ENETRESET /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENETRESET: u16 = 39;$/;" c -__WASI_ENETUNREACH /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENETUNREACH: u16 = 40;$/;" c -__WASI_ENFILE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENFILE: u16 = 41;$/;" c -__WASI_ENOBUFS /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOBUFS: u16 = 42;$/;" c -__WASI_ENODEV /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENODEV: u16 = 43;$/;" c -__WASI_ENOENT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOENT: u16 = 44;$/;" c -__WASI_ENOEXEC /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOEXEC: u16 = 45;$/;" c -__WASI_ENOLCK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOLCK: u16 = 46;$/;" c -__WASI_ENOLINK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOLINK: u16 = 47;$/;" c -__WASI_ENOMEM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOMEM: u16 = 48;$/;" c -__WASI_ENOMSG /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOMSG: u16 = 49;$/;" c -__WASI_ENOPROTOOPT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOPROTOOPT: u16 = 50;$/;" c -__WASI_ENOSPC /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOSPC: u16 = 51;$/;" c -__WASI_ENOSYS /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOSYS: u16 = 52;$/;" c -__WASI_ENOTCAPABLE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOTCAPABLE: u16 = 76;$/;" c -__WASI_ENOTCONN /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOTCONN: u16 = 53;$/;" c -__WASI_ENOTDIR /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOTDIR: u16 = 54;$/;" c -__WASI_ENOTEMPTY /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOTEMPTY: u16 = 55;$/;" c -__WASI_ENOTRECOVERABLE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOTRECOVERABLE: u16 = 56;$/;" c -__WASI_ENOTSOCK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOTSOCK: u16 = 57;$/;" c -__WASI_ENOTSUP /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOTSUP: u16 = 58;$/;" c -__WASI_ENOTTY /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENOTTY: u16 = 59;$/;" c -__WASI_ENXIO /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ENXIO: u16 = 60;$/;" c -__WASI_EOVERFLOW /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EOVERFLOW: u16 = 61;$/;" c -__WASI_EOWNERDEAD /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EOWNERDEAD: u16 = 62;$/;" c -__WASI_EPERM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EPERM: u16 = 63;$/;" c -__WASI_EPIPE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EPIPE: u16 = 64;$/;" c -__WASI_EPROTO /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EPROTO: u16 = 65;$/;" c -__WASI_EPROTONOSUPPORT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EPROTONOSUPPORT: u16 = 66;$/;" c -__WASI_EPROTOTYPE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EPROTOTYPE: u16 = 67;$/;" c -__WASI_ERANGE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ERANGE: u16 = 68;$/;" c -__WASI_EROFS /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EROFS: u16 = 69;$/;" c -__WASI_ESPIPE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ESPIPE: u16 = 70;$/;" c -__WASI_ESRCH /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ESRCH: u16 = 71;$/;" c -__WASI_ESTALE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ESTALE: u16 = 72;$/;" c -__WASI_ESUCCESS /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ESUCCESS: u16 = 0;$/;" c -__WASI_ETIMEDOUT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ETIMEDOUT: u16 = 73;$/;" c -__WASI_ETXTBSY /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_ETXTBSY: u16 = 74;$/;" c -__WASI_EVENTTYPE_CLOCK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EVENTTYPE_CLOCK: u8 = 0;$/;" c -__WASI_EVENTTYPE_FD_READ /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EVENTTYPE_FD_READ: u8 = 1;$/;" c -__WASI_EVENTTYPE_FD_WRITE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EVENTTYPE_FD_WRITE: u8 = 2;$/;" c -__WASI_EVENT_FD_READWRITE_HANGUP /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EVENT_FD_READWRITE_HANGUP: u16 = 0x0001;$/;" c -__WASI_EXDEV /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_EXDEV: u16 = 75;$/;" c -__WASI_FDFLAG_APPEND /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FDFLAG_APPEND: u16 = 0x0001;$/;" c -__WASI_FDFLAG_DSYNC /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FDFLAG_DSYNC: u16 = 0x0002;$/;" c -__WASI_FDFLAG_NONBLOCK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FDFLAG_NONBLOCK: u16 = 0x0004;$/;" c -__WASI_FDFLAG_RSYNC /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FDFLAG_RSYNC: u16 = 0x0008;$/;" c -__WASI_FDFLAG_SYNC /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FDFLAG_SYNC: u16 = 0x0010;$/;" c -__WASI_FILESTAT_SET_ATIM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILESTAT_SET_ATIM: u16 = 0x0001;$/;" c -__WASI_FILESTAT_SET_ATIM_NOW /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILESTAT_SET_ATIM_NOW: u16 = 0x0002;$/;" c -__WASI_FILESTAT_SET_MTIM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILESTAT_SET_MTIM: u16 = 0x0004;$/;" c -__WASI_FILESTAT_SET_MTIM_NOW /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILESTAT_SET_MTIM_NOW: u16 = 0x0008;$/;" c -__WASI_FILETYPE_BLOCK_DEVICE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILETYPE_BLOCK_DEVICE: u8 = 1;$/;" c -__WASI_FILETYPE_CHARACTER_DEVICE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILETYPE_CHARACTER_DEVICE: u8 = 2;$/;" c -__WASI_FILETYPE_DIRECTORY /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILETYPE_DIRECTORY: u8 = 3;$/;" c -__WASI_FILETYPE_REGULAR_FILE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILETYPE_REGULAR_FILE: u8 = 4;$/;" c -__WASI_FILETYPE_SOCKET_DGRAM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILETYPE_SOCKET_DGRAM: u8 = 5;$/;" c -__WASI_FILETYPE_SOCKET_STREAM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILETYPE_SOCKET_STREAM: u8 = 6;$/;" c -__WASI_FILETYPE_SYMBOLIC_LINK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILETYPE_SYMBOLIC_LINK: u8 = 7;$/;" c -__WASI_FILETYPE_UNKNOWN /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_FILETYPE_UNKNOWN: u8 = 0;$/;" c -__WASI_LOOKUP_SYMLINK_FOLLOW /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_LOOKUP_SYMLINK_FOLLOW: u32 = 0x0000_0001;$/;" c -__WASI_O_CREAT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_O_CREAT: u16 = 0x0001;$/;" c -__WASI_O_DIRECTORY /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_O_DIRECTORY: u16 = 0x0002;$/;" c -__WASI_O_EXCL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_O_EXCL: u16 = 0x0004;$/;" c -__WASI_O_TRUNC /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_O_TRUNC: u16 = 0x0008;$/;" c -__WASI_PREOPENTYPE_DIR /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_PREOPENTYPE_DIR: u8 = 0;$/;" c -__WASI_RIGHT_FD_ADVISE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_ADVISE: u64 = 0x0000_0000_0000_0080;$/;" c -__WASI_RIGHT_FD_ALLOCATE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_ALLOCATE: u64 = 0x0000_0000_0000_0100;$/;" c -__WASI_RIGHT_FD_DATASYNC /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_DATASYNC: u64 = 0x0000_0000_0000_0001;$/;" c -__WASI_RIGHT_FD_FDSTAT_SET_FLAGS /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_FDSTAT_SET_FLAGS: u64 = 0x0000_0000_0000_0008;$/;" c -__WASI_RIGHT_FD_FILESTAT_GET /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_FILESTAT_GET: u64 = 0x0000_0000_0020_0000;$/;" c -__WASI_RIGHT_FD_FILESTAT_SET_SIZE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_FILESTAT_SET_SIZE: u64 = 0x0000_0000_0040_0000;$/;" c -__WASI_RIGHT_FD_FILESTAT_SET_TIMES /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_FILESTAT_SET_TIMES: u64 = 0x0000_0000_0080_0000;$/;" c -__WASI_RIGHT_FD_READ /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_READ: u64 = 0x0000_0000_0000_0002;$/;" c -__WASI_RIGHT_FD_READDIR /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_READDIR: u64 = 0x0000_0000_0000_4000;$/;" c -__WASI_RIGHT_FD_SEEK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_SEEK: u64 = 0x0000_0000_0000_0004;$/;" c -__WASI_RIGHT_FD_SYNC /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_SYNC: u64 = 0x0000_0000_0000_0010;$/;" c -__WASI_RIGHT_FD_TELL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_TELL: u64 = 0x0000_0000_0000_0020;$/;" c -__WASI_RIGHT_FD_WRITE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_FD_WRITE: u64 = 0x0000_0000_0000_0040;$/;" c -__WASI_RIGHT_PATH_CREATE_DIRECTORY /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_CREATE_DIRECTORY: u64 = 0x0000_0000_0000_0200;$/;" c -__WASI_RIGHT_PATH_CREATE_FILE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_CREATE_FILE: u64 = 0x0000_0000_0000_0400;$/;" c -__WASI_RIGHT_PATH_FILESTAT_GET /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_FILESTAT_GET: u64 = 0x0000_0000_0004_0000;$/;" c -__WASI_RIGHT_PATH_FILESTAT_SET_SIZE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_FILESTAT_SET_SIZE: u64 = 0x0000_0000_0008_0000;$/;" c -__WASI_RIGHT_PATH_FILESTAT_SET_TIMES /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_FILESTAT_SET_TIMES: u64 = 0x0000_0000_0010_0000;$/;" c -__WASI_RIGHT_PATH_LINK_SOURCE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_LINK_SOURCE: u64 = 0x0000_0000_0000_0800;$/;" c -__WASI_RIGHT_PATH_LINK_TARGET /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_LINK_TARGET: u64 = 0x0000_0000_0000_1000;$/;" c -__WASI_RIGHT_PATH_OPEN /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_OPEN: u64 = 0x0000_0000_0000_2000;$/;" c -__WASI_RIGHT_PATH_READLINK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_READLINK: u64 = 0x0000_0000_0000_8000;$/;" c -__WASI_RIGHT_PATH_REMOVE_DIRECTORY /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_REMOVE_DIRECTORY: u64 = 0x0000_0000_0200_0000;$/;" c -__WASI_RIGHT_PATH_RENAME_SOURCE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_RENAME_SOURCE: u64 = 0x0000_0000_0001_0000;$/;" c -__WASI_RIGHT_PATH_RENAME_TARGET /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_RENAME_TARGET: u64 = 0x0000_0000_0002_0000;$/;" c -__WASI_RIGHT_PATH_SYMLINK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_SYMLINK: u64 = 0x0000_0000_0100_0000;$/;" c -__WASI_RIGHT_PATH_UNLINK_FILE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_PATH_UNLINK_FILE: u64 = 0x0000_0000_0400_0000;$/;" c -__WASI_RIGHT_POLL_FD_READWRITE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_POLL_FD_READWRITE: u64 = 0x0000_0000_0800_0000;$/;" c -__WASI_RIGHT_SOCK_SHUTDOWN /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_RIGHT_SOCK_SHUTDOWN: u64 = 0x0000_0000_1000_0000;$/;" c -__WASI_SHUT_RD /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SHUT_RD: u8 = 0x01;$/;" c -__WASI_SHUT_WR /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SHUT_WR: u8 = 0x02;$/;" c -__WASI_SIGABRT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGABRT: u8 = 6;$/;" c -__WASI_SIGALRM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGALRM: u8 = 14;$/;" c -__WASI_SIGBUS /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGBUS: u8 = 7;$/;" c -__WASI_SIGCHLD /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGCHLD: u8 = 16;$/;" c -__WASI_SIGCONT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGCONT: u8 = 17;$/;" c -__WASI_SIGFPE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGFPE: u8 = 8;$/;" c -__WASI_SIGHUP /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGHUP: u8 = 1;$/;" c -__WASI_SIGILL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGILL: u8 = 4;$/;" c -__WASI_SIGINT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGINT: u8 = 2;$/;" c -__WASI_SIGKILL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGKILL: u8 = 9;$/;" c -__WASI_SIGPIPE /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGPIPE: u8 = 13;$/;" c -__WASI_SIGPOLL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGPOLL: u8 = 28;$/;" c -__WASI_SIGPROF /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGPROF: u8 = 26;$/;" c -__WASI_SIGPWR /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGPWR: u8 = 29;$/;" c -__WASI_SIGQUIT /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGQUIT: u8 = 3;$/;" c -__WASI_SIGSEGV /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGSEGV: u8 = 11;$/;" c -__WASI_SIGSTOP /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGSTOP: u8 = 18;$/;" c -__WASI_SIGSYS /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGSYS: u8 = 30;$/;" c -__WASI_SIGTERM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGTERM: u8 = 15;$/;" c -__WASI_SIGTRAP /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGTRAP: u8 = 5;$/;" c -__WASI_SIGTSTP /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGTSTP: u8 = 19;$/;" c -__WASI_SIGTTIN /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGTTIN: u8 = 20;$/;" c -__WASI_SIGTTOU /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGTTOU: u8 = 21;$/;" c -__WASI_SIGURG /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGURG: u8 = 22;$/;" c -__WASI_SIGUSR1 /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGUSR1: u8 = 10;$/;" c -__WASI_SIGUSR2 /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGUSR2: u8 = 12;$/;" c -__WASI_SIGVTALRM /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGVTALRM: u8 = 25;$/;" c -__WASI_SIGWINCH /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGWINCH: u8 = 27;$/;" c -__WASI_SIGXCPU /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGXCPU: u8 = 23;$/;" c -__WASI_SIGXFSZ /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SIGXFSZ: u8 = 24;$/;" c -__WASI_SOCK_RECV_DATA_TRUNCATED /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SOCK_RECV_DATA_TRUNCATED: u16 = 0x0001;$/;" c -__WASI_SOCK_RECV_PEEK /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SOCK_RECV_PEEK: u16 = 0x0001;$/;" c -__WASI_SOCK_RECV_WAITALL /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SOCK_RECV_WAITALL: u16 = 0x0002;$/;" c -__WASI_STDERR_FD /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_STDERR_FD: u32 = 2;$/;" c -__WASI_STDIN_FD /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_STDIN_FD: u32 = 0;$/;" c -__WASI_STDOUT_FD /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_STDOUT_FD: u32 = 1;$/;" c -__WASI_SUBSCRIPTION_CLOCK_ABSTIME /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_SUBSCRIPTION_CLOCK_ABSTIME: u16 = 0x0001;$/;" c -__WASI_WHENCE_CUR /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_WHENCE_CUR: u8 = 0;$/;" c -__WASI_WHENCE_END /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_WHENCE_END: u8 = 1;$/;" c -__WASI_WHENCE_SET /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub const __WASI_WHENCE_SET: u8 = 2;$/;" c -__wasi_advice_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_advice_t = u8;$/;" T -__wasi_args_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> __wasi_errno_t;$/;" f -__wasi_args_sizes_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_args_sizes_get(argc: *mut usize, argv_buf_size: *mut usize) -> __wasi_errno_t;$/;" f -__wasi_ciovec_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_ciovec_t {$/;" s -__wasi_clock_res_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_clock_res_get($/;" f -__wasi_clock_time_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_clock_time_get($/;" f -__wasi_clockid_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_clockid_t = u32;$/;" T -__wasi_device_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_device_t = u64;$/;" T -__wasi_dircookie_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_dircookie_t = u64;$/;" T -__wasi_dirent_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_dirent_t {$/;" s -__wasi_environ_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> __wasi_errno_t;$/;" f -__wasi_environ_sizes_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_environ_sizes_get($/;" f -__wasi_errno_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_errno_t = u16;$/;" T -__wasi_event_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_event_t {$/;" s -__wasi_event_u_fd_readwrite_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_event_u_fd_readwrite_t {$/;" s -__wasi_eventrwflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_eventrwflags_t = u16;$/;" T -__wasi_eventtype_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_eventtype_t = u8;$/;" T -__wasi_exitcode_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_exitcode_t = u32;$/;" T -__wasi_fd_advise /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_advise($/;" f -__wasi_fd_allocate /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_allocate($/;" f -__wasi_fd_close /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_close(fd: __wasi_fd_t) -> __wasi_errno_t;$/;" f -__wasi_fd_datasync /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_datasync(fd: __wasi_fd_t) -> __wasi_errno_t;$/;" f -__wasi_fd_fdstat_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_fdstat_get(fd: __wasi_fd_t, buf: *mut __wasi_fdstat_t) -> __wasi_errno_t;$/;" f -__wasi_fd_fdstat_set_flags /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_fdstat_set_flags(fd: __wasi_fd_t, flags: __wasi_fdflags_t) -> __wasi_errno_t;$/;" f -__wasi_fd_fdstat_set_rights /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_fdstat_set_rights($/;" f -__wasi_fd_filestat_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_filestat_get(fd: __wasi_fd_t, buf: *mut __wasi_filestat_t) -> __wasi_errno_t;$/;" f -__wasi_fd_filestat_set_size /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_filestat_set_size($/;" f -__wasi_fd_filestat_set_times /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_filestat_set_times($/;" f -__wasi_fd_pread /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_pread($/;" f -__wasi_fd_prestat_dir_name /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_prestat_dir_name($/;" f -__wasi_fd_prestat_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_prestat_get(fd: __wasi_fd_t, buf: *mut __wasi_prestat_t) -> __wasi_errno_t;$/;" f -__wasi_fd_pwrite /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_pwrite($/;" f -__wasi_fd_read /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_read($/;" f -__wasi_fd_readdir /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_readdir($/;" f -__wasi_fd_renumber /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_renumber(from: __wasi_fd_t, to: __wasi_fd_t) -> __wasi_errno_t;$/;" f -__wasi_fd_seek /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_seek($/;" f -__wasi_fd_sync /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_sync(fd: __wasi_fd_t) -> __wasi_errno_t;$/;" f -__wasi_fd_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_fd_t = u32;$/;" T -__wasi_fd_tell /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_tell(fd: __wasi_fd_t, newoffset: *mut __wasi_filesize_t) -> __wasi_errno_t;$/;" f -__wasi_fd_write /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_fd_write($/;" f -__wasi_fdflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_fdflags_t = u16;$/;" T -__wasi_fdstat_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_fdstat_t {$/;" s -__wasi_filedelta_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_filedelta_t = i64;$/;" T -__wasi_filesize_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_filesize_t = u64;$/;" T -__wasi_filestat_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_filestat_t {$/;" s -__wasi_filetype_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_filetype_t = u8;$/;" T -__wasi_fstflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_fstflags_t = u16;$/;" T -__wasi_inode_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_inode_t = u64;$/;" T -__wasi_iovec_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_iovec_t {$/;" s -__wasi_linkcount_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_linkcount_t = u32;$/;" T -__wasi_lookupflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_lookupflags_t = u32;$/;" T -__wasi_oflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_oflags_t = u16;$/;" T -__wasi_path_create_directory /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_create_directory($/;" f -__wasi_path_filestat_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_filestat_get($/;" f -__wasi_path_filestat_set_times /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_filestat_set_times($/;" f -__wasi_path_link /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_link($/;" f -__wasi_path_open /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_open($/;" f -__wasi_path_readlink /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_readlink($/;" f -__wasi_path_remove_directory /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_remove_directory($/;" f -__wasi_path_rename /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_rename($/;" f -__wasi_path_symlink /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_symlink($/;" f -__wasi_path_unlink_file /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_path_unlink_file($/;" f -__wasi_poll_oneoff /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_poll_oneoff($/;" f -__wasi_preopentype_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_preopentype_t = u8;$/;" T -__wasi_prestat_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_prestat_t {$/;" s -__wasi_prestat_u_dir_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_prestat_u_dir_t {$/;" s -__wasi_proc_exit /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_proc_exit(rval: __wasi_exitcode_t) -> !;$/;" f -__wasi_random_get /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_random_get(buf: *mut c_void, buf_len: usize) -> __wasi_errno_t;$/;" f -__wasi_riflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_riflags_t = u16;$/;" T -__wasi_rights_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_rights_t = u64;$/;" T -__wasi_roflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_roflags_t = u16;$/;" T -__wasi_sched_yield /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_sched_yield() -> __wasi_errno_t;$/;" f -__wasi_sdflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_sdflags_t = u8;$/;" T -__wasi_siflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_siflags_t = u16;$/;" T -__wasi_signal_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_signal_t = u8;$/;" T -__wasi_sock_recv /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_sock_recv($/;" f -__wasi_sock_send /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_sock_send($/;" f -__wasi_sock_shutdown /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^ pub fn __wasi_sock_shutdown(sock: __wasi_fd_t, how: __wasi_sdflags_t) -> __wasi_errno_t;$/;" f -__wasi_subclockflags_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_subclockflags_t = u16;$/;" T -__wasi_subscription_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_subscription_t {$/;" s -__wasi_subscription_u_clock_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_subscription_u_clock_t {$/;" s -__wasi_subscription_u_fd_readwrite_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub struct __wasi_subscription_u_fd_readwrite_t {$/;" s -__wasi_timestamp_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_timestamp_t = u64;$/;" T -__wasi_userdata_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_userdata_t = u64;$/;" T -__wasi_whence_t /home/sunfish/rust-wasi/src/wasi_unstable/raw.rs /^pub type __wasi_whence_t = u8;$/;" T -args_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn args_get(ars: ArgsSizes, mut process_arg: impl FnMut(&[u8])) -> Result<(), Error> {$/;" f -args_sizes_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn args_sizes_get() -> Result<ArgsSizes, Error> {$/;" f -clock_res_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn clock_res_get(clock_id: ClockId) -> Result<Timestamp, Error> {$/;" f -clock_time_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn clock_time_get(clock_id: ClockId, precision: Timestamp) -> Result<Timestamp, Error> {$/;" f -environ_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn environ_get($/;" f -environ_sizes_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn environ_sizes_get() -> Result<EnvironSizes, Error> {$/;" f -errno_set /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^macro_rules! errno_set {$/;" d -error_str /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn error_str(err: Error) -> Option<&'static str> {$/;" f -fd_advise /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_advise($/;" f -fd_allocate /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_allocate(fd: Fd, offset: FileSize, len: FileSize) -> Result<(), Error> {$/;" f -fd_close /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_close(fd: Fd) -> Result<(), Error> {$/;" f -fd_datasync /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_datasync(fd: Fd) -> Result<(), Error> {$/;" f -fd_fdstat_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_fdstat_get(fd: Fd) -> Result<FdStat, Error> {$/;" f -fd_fdstat_set_flags /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_fdstat_set_flags(fd: Fd, flags: FdFlags) -> Result<(), Error> {$/;" f -fd_fdstat_set_rights /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_fdstat_set_rights($/;" f -fd_filestat_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_filestat_get(fd: Fd) -> Result<FileStat, Error> {$/;" f -fd_filestat_set_size /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_filestat_set_size(fd: Fd, st_size: FileSize) -> Result<(), Error> {$/;" f -fd_filestat_set_times /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_filestat_set_times($/;" f -fd_pread /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_pread(fd: Fd, iovs: &[IoVec], offset: FileSize) -> Result<usize, Error> {$/;" f -fd_prestat_dir_name /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_prestat_dir_name(fd: Fd, path: &mut [u8]) -> Result<(), Error> {$/;" f -fd_prestat_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_prestat_get(fd: Fd) -> Result<Prestat, Error> {$/;" f -fd_pwrite /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_pwrite(fd: Fd, iovs: &[CIoVec], offset: FileSize) -> Result<usize, Error> {$/;" f -fd_read /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_read(fd: Fd, iovs: &[IoVec]) -> Result<usize, Error> {$/;" f -fd_readdir /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_readdir(fd: Fd, buf: &mut [u8], cookie: DirCookie) -> Result<usize, Error> {$/;" f -fd_renumber /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_renumber(from: Fd, to: Fd) -> Result<(), Error> {$/;" f -fd_seek /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_seek(fd: Fd, offset: FileDelta, whence: Whence) -> Result<FileSize, Error> {$/;" f -fd_sync /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_sync(fd: Fd) -> Result<(), Error> {$/;" f -fd_tell /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_tell(fd: Fd) -> Result<FileSize, Error> {$/;" f -fd_write /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn fd_write(fd: Fd, iovs: &[CIoVec]) -> Result<usize, Error> {$/;" f -get_buf_len /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^ pub fn get_buf_len(&self) -> usize {$/;" f -get_count /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^ pub fn get_count(&self) -> usize {$/;" f -path_create_directory /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_create_directory(fd: Fd, path: &[u8]) -> Result<(), Error> {$/;" f -path_filestat_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_filestat_get($/;" f -path_filestat_set_times /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_filestat_set_times($/;" f -path_link /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_link($/;" f -path_open /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_open($/;" f -path_readlink /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_readlink(fd: Fd, path: &[u8], buf: &mut [u8]) -> Result<usize, Error> {$/;" f -path_remove_directory /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_remove_directory(fd: Fd, path: &[u8]) -> Result<(), Error> {$/;" f -path_rename /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_rename($/;" f -path_symlink /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_symlink(old_path: &[u8], fd: Fd, new_path: &[u8]) -> Result<(), Error> {$/;" f -path_unlink_file /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn path_unlink_file(fd: Fd, path: &[u8]) -> Result<(), Error> {$/;" f -poll_oneoff /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn poll_oneoff(in_: &[Subscription], out: &mut [Event]) -> Result<usize, Error> {$/;" f -proc_exit /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn proc_exit(rval: ExitCode) -> ! {$/;" f -random_get /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn random_get(buf: &mut [u8]) -> Result<(), Error> {$/;" f -sched_yield /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub fn sched_yield() -> Result<(), Error> {$/;" f -sock_recv /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn sock_recv($/;" f -sock_send /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn sock_send(sock: Fd, si_data: &[CIoVec], si_flags: SiFlags) -> Result<usize, Error> {$/;" f -sock_shutdown /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^pub unsafe fn sock_shutdown(sock: Fd, how: SdFlags) -> Result<(), Error> {$/;" f -wrap /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^macro_rules! wrap {$/;" d -wrap0 /home/sunfish/rust-wasi/src/wasi_unstable/mod.rs /^macro_rules! wrap0 {$/;" d diff --git a/vendor/wasi-0.7.0/src/lib.rs b/vendor/wasi-0.7.0/src/lib.rs deleted file mode 100644 index 64321e884e..0000000000 --- a/vendor/wasi-0.7.0/src/lib.rs +++ /dev/null @@ -1,20 +0,0 @@ -#![cfg_attr( - feature = "cargo-clippy", - warn( - clippy::float_arithmetic, - clippy::mut_mut, - clippy::nonminimal_bool, - clippy::option_map_unwrap_or, - clippy::option_map_unwrap_or_else, - clippy::print_stdout, - clippy::unicode_not_nfc, - clippy::use_self - ) -)] -#![no_std] -#[cfg(all(feature = "alloc", not(feature = "rustc-std-workspace-alloc")))] -extern crate alloc; -#[cfg(all(feature = "alloc", feature = "rustc-std-workspace-alloc"))] -extern crate rustc_std_workspace_alloc as alloc; - -pub mod wasi_unstable; diff --git a/vendor/wasi-0.7.0/src/wasi_unstable/mod.rs b/vendor/wasi-0.7.0/src/wasi_unstable/mod.rs deleted file mode 100644 index 040c1f6801..0000000000 --- a/vendor/wasi-0.7.0/src/wasi_unstable/mod.rs +++ /dev/null @@ -1,824 +0,0 @@ -//! This module declares the Rust bindings to the `wasi_unstable` API. -//! -//! The raw bindings are in the `raw` submodule. They use raw pointers and -//! are unsafe. In the the top-level module, raw pointer-length pairs are -//! replaced by Rust slice types, output parameters are converted to normal -//! return values, names are translated to be more Rust-idiomatic, and the -//! functions are safe. -//! -//! TODO: Not all functions are covered yet; implement the rest of the API. - -pub mod raw; - -use core::ffi::c_void; -use core::mem::MaybeUninit; -use core::num::NonZeroU16; -use raw::*; - -pub type Advice = __wasi_advice_t; -pub type ClockId = __wasi_clockid_t; -pub type Device = __wasi_device_t; -pub type DirCookie = __wasi_dircookie_t; -pub type Errno = __wasi_errno_t; -pub type Error = NonZeroU16; -pub type EventRwFlags = __wasi_eventrwflags_t; -pub type EventType = __wasi_eventtype_t; -pub type ExitCode = __wasi_exitcode_t; -pub type Fd = __wasi_fd_t; -pub type FdFlags = __wasi_fdflags_t; -pub type FileDelta = __wasi_filedelta_t; -pub type FileSize = __wasi_filesize_t; -pub type FileType = __wasi_filetype_t; -pub type FstFlags = __wasi_fstflags_t; -pub type Inode = __wasi_inode_t; -pub type LinkCount = __wasi_linkcount_t; -pub type LookupFlags = __wasi_lookupflags_t; -pub type OFlags = __wasi_oflags_t; -pub type PreopenType = __wasi_preopentype_t; -pub type RiFlags = __wasi_riflags_t; -pub type Rights = __wasi_rights_t; -pub type RoFlags = __wasi_roflags_t; -pub type SdFlags = __wasi_sdflags_t; -pub type SiFlags = __wasi_siflags_t; -pub type Signal = __wasi_signal_t; -pub type SubclockFlags = __wasi_subclockflags_t; -pub type Timestamp = __wasi_timestamp_t; -pub type Userdata = __wasi_userdata_t; -pub type Whence = __wasi_whence_t; -pub type Dirent = __wasi_dirent_t; -pub type FdStat = __wasi_fdstat_t; -pub type FileStat = __wasi_filestat_t; -pub type CIoVec = __wasi_ciovec_t; -pub type IoVec = __wasi_iovec_t; -pub type Subscription = __wasi_subscription_t; -pub type Event = __wasi_event_t; -pub type Prestat = __wasi_prestat_t; - -// Assert that `__WASI_ESUCCESS` equals to 0 -const _ASSERT1: [(); 0] = [(); __WASI_ESUCCESS as usize]; - -pub const ADVICE_NORMAL: Advice = __WASI_ADVICE_NORMAL; -pub const ADVICE_SEQUENTIAL: Advice = __WASI_ADVICE_SEQUENTIAL; -pub const ADVICE_RANDOM: Advice = __WASI_ADVICE_RANDOM; -pub const ADVICE_WILLNEED: Advice = __WASI_ADVICE_WILLNEED; -pub const ADVICE_DONTNEED: Advice = __WASI_ADVICE_DONTNEED; -pub const ADVICE_NOREUSE: Advice = __WASI_ADVICE_NOREUSE; -pub const CLOCK_REALTIME: ClockId = __WASI_CLOCK_REALTIME; -pub const CLOCK_MONOTONIC: ClockId = __WASI_CLOCK_MONOTONIC; -pub const CLOCK_PROCESS_CPUTIME_ID: ClockId = __WASI_CLOCK_PROCESS_CPUTIME_ID; -pub const CLOCK_THREAD_CPUTIME_ID: ClockId = __WASI_CLOCK_THREAD_CPUTIME_ID; -pub const DIRCOOKIE_START: DirCookie = __WASI_DIRCOOKIE_START; - -pub const STDIN_FD: Fd = __WASI_STDIN_FD; -pub const STDOUT_FD: Fd = __WASI_STDOUT_FD; -pub const STDERR_FD: Fd = __WASI_STDERR_FD; - -macro_rules! errno_set { - {$($safe_const:ident = $raw_const:ident;)*} => { - $( - pub const $safe_const: Error = unsafe { - NonZeroU16::new_unchecked($raw_const) - }; - )* - }; -} - -errno_set! { - E2BIG = __WASI_E2BIG; - EACCES = __WASI_EACCES; - EADDRINUSE = __WASI_EADDRINUSE; - EADDRNOTAVAIL = __WASI_EADDRNOTAVAIL; - EAFNOSUPPORT = __WASI_EAFNOSUPPORT; - EAGAIN = __WASI_EAGAIN; - EALREADY = __WASI_EALREADY; - EBADF = __WASI_EBADF; - EBADMSG = __WASI_EBADMSG; - EBUSY = __WASI_EBUSY; - ECANCELED = __WASI_ECANCELED; - ECHILD = __WASI_ECHILD; - ECONNABORTED = __WASI_ECONNABORTED; - ECONNREFUSED = __WASI_ECONNREFUSED; - ECONNRESET = __WASI_ECONNRESET; - EDEADLK = __WASI_EDEADLK; - EDESTADDRREQ = __WASI_EDESTADDRREQ; - EDOM = __WASI_EDOM; - EDQUOT = __WASI_EDQUOT; - EEXIST = __WASI_EEXIST; - EFAULT = __WASI_EFAULT; - EFBIG = __WASI_EFBIG; - EHOSTUNREACH = __WASI_EHOSTUNREACH; - EIDRM = __WASI_EIDRM; - EILSEQ = __WASI_EILSEQ; - EINPROGRESS = __WASI_EINPROGRESS; - EINTR = __WASI_EINTR; - EINVAL = __WASI_EINVAL; - EIO = __WASI_EIO; - EISCONN = __WASI_EISCONN; - EISDIR = __WASI_EISDIR; - ELOOP = __WASI_ELOOP; - EMFILE = __WASI_EMFILE; - EMLINK = __WASI_EMLINK; - EMSGSIZE = __WASI_EMSGSIZE; - EMULTIHOP = __WASI_EMULTIHOP; - ENAMETOOLONG = __WASI_ENAMETOOLONG; - ENETDOWN = __WASI_ENETDOWN; - ENETRESET = __WASI_ENETRESET; - ENETUNREACH = __WASI_ENETUNREACH; - ENFILE = __WASI_ENFILE; - ENOBUFS = __WASI_ENOBUFS; - ENODEV = __WASI_ENODEV; - ENOENT = __WASI_ENOENT; - ENOEXEC = __WASI_ENOEXEC; - ENOLCK = __WASI_ENOLCK; - ENOLINK = __WASI_ENOLINK; - ENOMEM = __WASI_ENOMEM; - ENOMSG = __WASI_ENOMSG; - ENOPROTOOPT = __WASI_ENOPROTOOPT; - ENOSPC = __WASI_ENOSPC; - ENOSYS = __WASI_ENOSYS; - ENOTCONN = __WASI_ENOTCONN; - ENOTDIR = __WASI_ENOTDIR; - ENOTEMPTY = __WASI_ENOTEMPTY; - ENOTRECOVERABLE = __WASI_ENOTRECOVERABLE; - ENOTSOCK = __WASI_ENOTSOCK; - ENOTSUP = __WASI_ENOTSUP; - ENOTTY = __WASI_ENOTTY; - ENXIO = __WASI_ENXIO; - EOVERFLOW = __WASI_EOVERFLOW; - EOWNERDEAD = __WASI_EOWNERDEAD; - EPERM = __WASI_EPERM; - EPIPE = __WASI_EPIPE; - EPROTO = __WASI_EPROTO; - EPROTONOSUPPORT = __WASI_EPROTONOSUPPORT; - EPROTOTYPE = __WASI_EPROTOTYPE; - ERANGE = __WASI_ERANGE; - EROFS = __WASI_EROFS; - ESPIPE = __WASI_ESPIPE; - ESRCH = __WASI_ESRCH; - ESTALE = __WASI_ESTALE; - ETIMEDOUT = __WASI_ETIMEDOUT; - ETXTBSY = __WASI_ETXTBSY; - EXDEV = __WASI_EXDEV; - ENOTCAPABLE = __WASI_ENOTCAPABLE; -} - -pub const EVENT_FD_READWRITE_HANGUP: EventRwFlags = __WASI_EVENT_FD_READWRITE_HANGUP; -pub const EVENTTYPE_CLOCK: EventType = __WASI_EVENTTYPE_CLOCK; -pub const EVENTTYPE_FD_READ: EventType = __WASI_EVENTTYPE_FD_READ; -pub const EVENTTYPE_FD_WRITE: EventType = __WASI_EVENTTYPE_FD_WRITE; -pub const FDFLAG_APPEND: FdFlags = __WASI_FDFLAG_APPEND; -pub const FDFLAG_DSYNC: FdFlags = __WASI_FDFLAG_DSYNC; -pub const FDFLAG_NONBLOCK: FdFlags = __WASI_FDFLAG_NONBLOCK; -pub const FDFLAG_RSYNC: FdFlags = __WASI_FDFLAG_RSYNC; -pub const FDFLAG_SYNC: FdFlags = __WASI_FDFLAG_SYNC; -pub const FILETYPE_UNKNOWN: FileType = __WASI_FILETYPE_UNKNOWN; -pub const FILETYPE_BLOCK_DEVICE: FileType = __WASI_FILETYPE_BLOCK_DEVICE; -pub const FILETYPE_CHARACTER_DEVICE: FileType = __WASI_FILETYPE_CHARACTER_DEVICE; -pub const FILETYPE_DIRECTORY: FileType = __WASI_FILETYPE_DIRECTORY; -pub const FILETYPE_REGULAR_FILE: FileType = __WASI_FILETYPE_REGULAR_FILE; -pub const FILETYPE_SOCKET_DGRAM: FileType = __WASI_FILETYPE_SOCKET_DGRAM; -pub const FILETYPE_SOCKET_STREAM: FileType = __WASI_FILETYPE_SOCKET_STREAM; -pub const FILETYPE_SYMBOLIC_LINK: FileType = __WASI_FILETYPE_SYMBOLIC_LINK; -pub const FILESTAT_SET_ATIM: FstFlags = __WASI_FILESTAT_SET_ATIM; -pub const FILESTAT_SET_ATIM_NOW: FstFlags = __WASI_FILESTAT_SET_ATIM_NOW; -pub const FILESTAT_SET_MTIM: FstFlags = __WASI_FILESTAT_SET_MTIM; -pub const FILESTAT_SET_MTIM_NOW: FstFlags = __WASI_FILESTAT_SET_MTIM_NOW; -pub const LOOKUP_SYMLINK_FOLLOW: LookupFlags = __WASI_LOOKUP_SYMLINK_FOLLOW; -pub const O_CREAT: OFlags = __WASI_O_CREAT; -pub const O_DIRECTORY: OFlags = __WASI_O_DIRECTORY; -pub const O_EXCL: OFlags = __WASI_O_EXCL; -pub const O_TRUNC: OFlags = __WASI_O_TRUNC; -pub const PREOPENTYPE_DIR: PreopenType = __WASI_PREOPENTYPE_DIR; -pub const SOCK_RECV_PEEK: RiFlags = __WASI_SOCK_RECV_PEEK; -pub const SOCK_RECV_WAITALL: RiFlags = __WASI_SOCK_RECV_WAITALL; -pub const RIGHT_FD_DATASYNC: Rights = __WASI_RIGHT_FD_DATASYNC; -pub const RIGHT_FD_READ: Rights = __WASI_RIGHT_FD_READ; -pub const RIGHT_FD_SEEK: Rights = __WASI_RIGHT_FD_SEEK; -pub const RIGHT_FD_FDSTAT_SET_FLAGS: Rights = __WASI_RIGHT_FD_FDSTAT_SET_FLAGS; -pub const RIGHT_FD_SYNC: Rights = __WASI_RIGHT_FD_SYNC; -pub const RIGHT_FD_TELL: Rights = __WASI_RIGHT_FD_TELL; -pub const RIGHT_FD_WRITE: Rights = __WASI_RIGHT_FD_WRITE; -pub const RIGHT_FD_ADVISE: Rights = __WASI_RIGHT_FD_ADVISE; -pub const RIGHT_FD_ALLOCATE: Rights = __WASI_RIGHT_FD_ALLOCATE; -pub const RIGHT_PATH_CREATE_DIRECTORY: Rights = __WASI_RIGHT_PATH_CREATE_DIRECTORY; -pub const RIGHT_PATH_CREATE_FILE: Rights = __WASI_RIGHT_PATH_CREATE_FILE; -pub const RIGHT_PATH_LINK_SOURCE: Rights = __WASI_RIGHT_PATH_LINK_SOURCE; -pub const RIGHT_PATH_LINK_TARGET: Rights = __WASI_RIGHT_PATH_LINK_TARGET; -pub const RIGHT_PATH_OPEN: Rights = __WASI_RIGHT_PATH_OPEN; -pub const RIGHT_FD_READDIR: Rights = __WASI_RIGHT_FD_READDIR; -pub const RIGHT_PATH_READLINK: Rights = __WASI_RIGHT_PATH_READLINK; -pub const RIGHT_PATH_RENAME_SOURCE: Rights = __WASI_RIGHT_PATH_RENAME_SOURCE; -pub const RIGHT_PATH_RENAME_TARGET: Rights = __WASI_RIGHT_PATH_RENAME_TARGET; -pub const RIGHT_PATH_FILESTAT_GET: Rights = __WASI_RIGHT_PATH_FILESTAT_GET; -pub const RIGHT_PATH_FILESTAT_SET_SIZE: Rights = __WASI_RIGHT_PATH_FILESTAT_SET_SIZE; -pub const RIGHT_PATH_FILESTAT_SET_TIMES: Rights = __WASI_RIGHT_PATH_FILESTAT_SET_TIMES; -pub const RIGHT_FD_FILESTAT_GET: Rights = __WASI_RIGHT_FD_FILESTAT_GET; -pub const RIGHT_FD_FILESTAT_SET_SIZE: Rights = __WASI_RIGHT_FD_FILESTAT_SET_SIZE; -pub const RIGHT_FD_FILESTAT_SET_TIMES: Rights = __WASI_RIGHT_FD_FILESTAT_SET_TIMES; -pub const RIGHT_PATH_SYMLINK: Rights = __WASI_RIGHT_PATH_SYMLINK; -pub const RIGHT_PATH_REMOVE_DIRECTORY: Rights = __WASI_RIGHT_PATH_REMOVE_DIRECTORY; -pub const RIGHT_PATH_UNLINK_FILE: Rights = __WASI_RIGHT_PATH_UNLINK_FILE; -pub const RIGHT_POLL_FD_READWRITE: Rights = __WASI_RIGHT_POLL_FD_READWRITE; -pub const RIGHT_SOCK_SHUTDOWN: Rights = __WASI_RIGHT_SOCK_SHUTDOWN; -pub const SOCK_RECV_DATA_TRUNCATED: RoFlags = __WASI_SOCK_RECV_DATA_TRUNCATED; -pub const SHUT_RD: SdFlags = __WASI_SHUT_RD; -pub const SHUT_WR: SdFlags = __WASI_SHUT_WR; -pub const SIGHUP: Signal = __WASI_SIGHUP; -pub const SIGINT: Signal = __WASI_SIGINT; -pub const SIGQUIT: Signal = __WASI_SIGQUIT; -pub const SIGILL: Signal = __WASI_SIGILL; -pub const SIGTRAP: Signal = __WASI_SIGTRAP; -pub const SIGABRT: Signal = __WASI_SIGABRT; -pub const SIGBUS: Signal = __WASI_SIGBUS; -pub const SIGFPE: Signal = __WASI_SIGFPE; -pub const SIGKILL: Signal = __WASI_SIGKILL; -pub const SIGUSR1: Signal = __WASI_SIGUSR1; -pub const SIGSEGV: Signal = __WASI_SIGSEGV; -pub const SIGUSR2: Signal = __WASI_SIGUSR2; -pub const SIGPIPE: Signal = __WASI_SIGPIPE; -pub const SIGALRM: Signal = __WASI_SIGALRM; -pub const SIGTERM: Signal = __WASI_SIGTERM; -pub const SIGCHLD: Signal = __WASI_SIGCHLD; -pub const SIGCONT: Signal = __WASI_SIGCONT; -pub const SIGSTOP: Signal = __WASI_SIGSTOP; -pub const SIGTSTP: Signal = __WASI_SIGTSTP; -pub const SIGTTIN: Signal = __WASI_SIGTTIN; -pub const SIGTTOU: Signal = __WASI_SIGTTOU; -pub const SIGURG: Signal = __WASI_SIGURG; -pub const SIGXCPU: Signal = __WASI_SIGXCPU; -pub const SIGXFSZ: Signal = __WASI_SIGXFSZ; -pub const SIGVTALRM: Signal = __WASI_SIGVTALRM; -pub const SIGPROF: Signal = __WASI_SIGPROF; -pub const SIGWINCH: Signal = __WASI_SIGWINCH; -pub const SIGPOLL: Signal = __WASI_SIGPOLL; -pub const SIGPWR: Signal = __WASI_SIGPWR; -pub const SIGSYS: Signal = __WASI_SIGSYS; -pub const SUBSCRIPTION_CLOCK_ABSTIME: SubclockFlags = __WASI_SUBSCRIPTION_CLOCK_ABSTIME; -pub const WHENCE_CUR: Whence = __WASI_WHENCE_CUR; -pub const WHENCE_END: Whence = __WASI_WHENCE_END; -pub const WHENCE_SET: Whence = __WASI_WHENCE_SET; - -macro_rules! wrap0 { - {$f:expr} => { - if let Some(code) = NonZeroU16::new($f) { - Err(code) - } else { - Ok(()) - } - }; -} - -macro_rules! wrap { - {$f:ident($($args:expr),* $(,)?)} => { - let mut t = MaybeUninit::uninit(); - let r = $f($($args,)* t.as_mut_ptr()); - if let Some(code) = NonZeroU16::new(r) { - Err(code) - } else { - Ok(t.assume_init()) - } - }; -} - -#[inline] -pub fn clock_res_get(clock_id: ClockId) -> Result<Timestamp, Error> { - unsafe { - wrap! { __wasi_clock_res_get(clock_id) } - } -} - -#[inline] -pub fn clock_time_get(clock_id: ClockId, precision: Timestamp) -> Result<Timestamp, Error> { - unsafe { - wrap! { __wasi_clock_time_get(clock_id, precision) } - } -} - -#[inline] -pub unsafe fn fd_pread(fd: Fd, iovs: &[IoVec], offset: FileSize) -> Result<usize, Error> { - wrap! { __wasi_fd_pread(fd, iovs.as_ptr(), iovs.len(), offset) } -} - -#[inline] -pub unsafe fn fd_pwrite(fd: Fd, iovs: &[CIoVec], offset: FileSize) -> Result<usize, Error> { - wrap! { __wasi_fd_pwrite(fd, iovs.as_ptr(), iovs.len(), offset) } -} - -#[inline] -pub fn random_get(buf: &mut [u8]) -> Result<(), Error> { - unsafe { - wrap0! { __wasi_random_get(buf.as_mut_ptr() as *mut c_void, buf.len()) } - } -} - -#[inline] -pub unsafe fn fd_close(fd: Fd) -> Result<(), Error> { - wrap0! { __wasi_fd_close(fd) } -} - -#[inline] -pub unsafe fn fd_datasync(fd: Fd) -> Result<(), Error> { - wrap0! { __wasi_fd_datasync(fd) } -} - -#[inline] -pub unsafe fn fd_read(fd: Fd, iovs: &[IoVec]) -> Result<usize, Error> { - wrap! { __wasi_fd_read(fd, iovs.as_ptr(), iovs.len()) } -} - -#[inline] -pub unsafe fn fd_renumber(from: Fd, to: Fd) -> Result<(), Error> { - wrap0! { __wasi_fd_renumber(from, to) } -} - -#[inline] -pub unsafe fn fd_seek(fd: Fd, offset: FileDelta, whence: Whence) -> Result<FileSize, Error> { - wrap! { __wasi_fd_seek(fd, offset, whence) } -} - -#[inline] -pub unsafe fn fd_tell(fd: Fd) -> Result<FileSize, Error> { - wrap! { __wasi_fd_tell(fd) } -} - -#[inline] -pub unsafe fn fd_fdstat_get(fd: Fd) -> Result<FdStat, Error> { - wrap! { __wasi_fd_fdstat_get(fd) } -} - -#[inline] -pub unsafe fn fd_fdstat_set_flags(fd: Fd, flags: FdFlags) -> Result<(), Error> { - wrap0! { __wasi_fd_fdstat_set_flags(fd, flags) } -} - -#[inline] -pub unsafe fn fd_fdstat_set_rights( - fd: Fd, - fs_rights_base: Rights, - fs_rights_inheriting: Rights, -) -> Result<(), Error> { - wrap0! { __wasi_fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting) } -} - -#[inline] -pub unsafe fn fd_sync(fd: Fd) -> Result<(), Error> { - wrap0! { __wasi_fd_sync(fd) } -} - -#[inline] -pub unsafe fn fd_write(fd: Fd, iovs: &[CIoVec]) -> Result<usize, Error> { - wrap! { __wasi_fd_write(fd, iovs.as_ptr(), iovs.len()) } -} - -#[inline] -pub unsafe fn fd_advise( - fd: Fd, - offset: FileSize, - len: FileSize, - advice: Advice, -) -> Result<(), Error> { - wrap0! { __wasi_fd_advise(fd, offset, len, advice) } -} - -#[inline] -pub unsafe fn fd_allocate(fd: Fd, offset: FileSize, len: FileSize) -> Result<(), Error> { - wrap0! { __wasi_fd_allocate(fd, offset, len) } -} - -#[inline] -pub unsafe fn path_create_directory(fd: Fd, path: &[u8]) -> Result<(), Error> { - wrap0! { __wasi_path_create_directory(fd, path.as_ptr(), path.len()) } -} - -#[inline] -pub unsafe fn path_link( - old_fd: Fd, - old_flags: LookupFlags, - old_path: &[u8], - new_fd: Fd, - new_path: &[u8], -) -> Result<(), Error> { - wrap0! { - __wasi_path_link( - old_fd, - old_flags, - old_path.as_ptr(), - old_path.len(), - new_fd, - new_path.as_ptr(), - new_path.len(), - ) - } -} - -#[inline] -pub unsafe fn path_open( - dirfd: Fd, - dirflags: LookupFlags, - path: &[u8], - oflags: OFlags, - fs_rights_base: Rights, - fs_rights_inheriting: Rights, - fs_flags: FdFlags, -) -> Result<Fd, Error> { - wrap! { - __wasi_path_open( - dirfd, - dirflags, - path.as_ptr(), - path.len(), - oflags, - fs_rights_base, - fs_rights_inheriting, - fs_flags, - ) - } -} - -#[inline] -pub unsafe fn fd_readdir(fd: Fd, buf: &mut [u8], cookie: DirCookie) -> Result<usize, Error> { - let ptr = buf.as_mut_ptr() as *mut c_void; - wrap! { __wasi_fd_readdir(fd, ptr, buf.len(), cookie) } -} - -#[inline] -pub unsafe fn path_readlink(fd: Fd, path: &[u8], buf: &mut [u8]) -> Result<usize, Error> { - let ptr = buf.as_mut_ptr(); - wrap! { - __wasi_path_readlink(fd, path.as_ptr(), path.len(), ptr, buf.len()) - } -} - -#[inline] -pub unsafe fn path_rename( - old_fd: Fd, - old_path: &[u8], - new_fd: Fd, - new_path: &[u8], -) -> Result<(), Error> { - wrap0! { - __wasi_path_rename( - old_fd, - old_path.as_ptr(), - old_path.len(), - new_fd, - new_path.as_ptr(), - new_path.len(), - ) - } -} - -#[inline] -pub unsafe fn fd_filestat_get(fd: Fd) -> Result<FileStat, Error> { - wrap! { __wasi_fd_filestat_get(fd) } -} - -#[inline] -pub unsafe fn fd_filestat_set_times( - fd: Fd, - st_atim: Timestamp, - st_mtim: Timestamp, - fstflags: FstFlags, -) -> Result<(), Error> { - wrap0! { __wasi_fd_filestat_set_times(fd, st_atim, st_mtim, fstflags) } -} - -#[inline] -pub unsafe fn fd_filestat_set_size(fd: Fd, st_size: FileSize) -> Result<(), Error> { - wrap0! { __wasi_fd_filestat_set_size(fd, st_size) } -} - -#[inline] -pub unsafe fn path_filestat_get( - fd: Fd, - flags: LookupFlags, - path: &[u8], -) -> Result<FileStat, Error> { - wrap! { - __wasi_path_filestat_get(fd, flags, path.as_ptr(), path.len()) - } -} - -#[inline] -pub unsafe fn path_filestat_set_times( - fd: Fd, - flags: LookupFlags, - path: &[u8], - st_atim: Timestamp, - st_mtim: Timestamp, - fstflags: FstFlags, -) -> Result<(), Error> { - wrap0! { - __wasi_path_filestat_set_times( - fd, - flags, - path.as_ptr(), - path.len(), - st_atim, - st_mtim, - fstflags, - ) - } -} - -#[inline] -pub unsafe fn path_symlink(old_path: &[u8], fd: Fd, new_path: &[u8]) -> Result<(), Error> { - wrap0! { - __wasi_path_symlink( - old_path.as_ptr(), - old_path.len(), - fd, - new_path.as_ptr(), - new_path.len(), - ) - } -} - -#[inline] -pub unsafe fn path_unlink_file(fd: Fd, path: &[u8]) -> Result<(), Error> { - wrap0! { __wasi_path_unlink_file(fd, path.as_ptr(), path.len()) } -} - -#[inline] -pub unsafe fn path_remove_directory(fd: Fd, path: &[u8]) -> Result<(), Error> { - wrap0! { __wasi_path_remove_directory(fd, path.as_ptr(), path.len()) } -} - -#[inline] -pub unsafe fn poll_oneoff(in_: &[Subscription], out: &mut [Event]) -> Result<usize, Error> { - assert!(out.len() >= in_.len()); - let ptr = out.as_mut_ptr() as *mut __wasi_event_t; - wrap! { - __wasi_poll_oneoff( - in_.as_ptr(), - ptr, - in_.len(), - ) - } -} - -#[inline] -pub fn proc_exit(rval: ExitCode) -> ! { - unsafe { __wasi_proc_exit(rval) } -} - -#[inline] -pub unsafe fn sock_recv( - sock: Fd, - ri_data: &[IoVec], - ri_flags: RiFlags, -) -> Result<(usize, RoFlags), Error> { - let mut ro_datalen = MaybeUninit::<usize>::uninit(); - let mut ro_flags = MaybeUninit::<RoFlags>::uninit(); - let r = __wasi_sock_recv( - sock, - ri_data.as_ptr(), - ri_data.len(), - ri_flags, - ro_datalen.as_mut_ptr(), - ro_flags.as_mut_ptr(), - ); - if let Some(code) = NonZeroU16::new(r) { - Err(code) - } else { - Ok((ro_datalen.assume_init(), ro_flags.assume_init())) - } -} - -#[inline] -pub unsafe fn sock_send(sock: Fd, si_data: &[CIoVec], si_flags: SiFlags) -> Result<usize, Error> { - wrap! { __wasi_sock_send(sock, si_data.as_ptr(), si_data.len(), si_flags) } -} - -#[inline] -pub unsafe fn sock_shutdown(sock: Fd, how: SdFlags) -> Result<(), Error> { - wrap0! { __wasi_sock_shutdown(sock, how) } -} - -#[inline] -pub fn sched_yield() -> Result<(), Error> { - unsafe { - wrap0! { __wasi_sched_yield() } - } -} - -#[inline] -pub unsafe fn fd_prestat_get(fd: Fd) -> Result<Prestat, Error> { - wrap! { __wasi_fd_prestat_get(fd) } -} - -#[inline] -pub unsafe fn fd_prestat_dir_name(fd: Fd, path: &mut [u8]) -> Result<(), Error> { - wrap0! { __wasi_fd_prestat_dir_name(fd, path.as_mut_ptr(), path.len()) } -} - -#[derive(Copy, Clone)] -pub struct ArgsSizes { - count: usize, - buf_len: usize, -} - -impl ArgsSizes { - #[inline] - pub fn get_count(&self) -> usize { - self.count - } - #[inline] - pub fn get_buf_len(&self) -> usize { - self.buf_len - } -} - -#[inline] -pub fn args_sizes_get() -> Result<ArgsSizes, Error> { - let mut res = ArgsSizes { - count: 0, - buf_len: 0, - }; - let code = unsafe { __wasi_args_sizes_get(&mut res.count, &mut res.buf_len) }; - if let Some(err) = NonZeroU16::new(code) { - return Err(err); - } - Ok(res) -} - -#[cfg(feature = "alloc")] -#[inline] -pub fn args_get(ars: ArgsSizes, mut process_arg: impl FnMut(&[u8])) -> Result<(), Error> { - use alloc::vec; - - // TODO: remove allocations after stabilization of unsized rvalues, see: - // https://github.com/rust-lang/rust/issues/48055 - let mut arg_ptrs = vec![core::ptr::null_mut::<u8>(); ars.count]; - let mut arg_buf = vec![0u8; ars.buf_len]; - let ret = unsafe { __wasi_args_get(arg_ptrs.as_mut_ptr(), arg_buf.as_mut_ptr()) }; - if let Some(err) = NonZeroU16::new(ret) { - return Err(err); - } - - for ptr in arg_ptrs { - for n in 0.. { - unsafe { - if *ptr.add(n) == 0 { - let slice = core::slice::from_raw_parts(ptr, n); - process_arg(slice); - break; - } - } - } - } - - Ok(()) -} - -#[derive(Copy, Clone)] -pub struct EnvironSizes { - count: usize, - buf_len: usize, -} - -impl EnvironSizes { - #[inline] - pub fn get_count(&self) -> usize { - self.count - } - #[inline] - pub fn get_buf_len(&self) -> usize { - self.buf_len - } -} - -#[inline] -pub fn environ_sizes_get() -> Result<EnvironSizes, Error> { - let mut res = EnvironSizes { - count: 0, - buf_len: 0, - }; - let code = unsafe { __wasi_environ_sizes_get(&mut res.count, &mut res.buf_len) }; - if let Some(err) = NonZeroU16::new(code) { - return Err(err); - } - Ok(res) -} - -#[cfg(feature = "alloc")] -#[inline] -pub fn environ_get( - es: EnvironSizes, - mut process_env: impl FnMut(&[u8], &[u8]), -) -> Result<(), Error> { - use alloc::vec; - - // TODO: remove allocations after stabilization of unsized rvalues, see: - // https://github.com/rust-lang/rust/issues/48055 - let mut env_ptrs = vec![core::ptr::null_mut::<u8>(); es.count]; - let mut env_buf = vec![0u8; es.buf_len]; - let ret = unsafe { __wasi_environ_get(env_ptrs.as_mut_ptr(), env_buf.as_mut_ptr()) }; - if let Some(err) = NonZeroU16::new(ret) { - return Err(err); - } - - for ptr in env_ptrs { - let mut key: &[u8] = &[]; - for n in 0.. { - unsafe { - match *ptr.add(n) { - 0 => { - let val = core::slice::from_raw_parts(ptr, n); - process_env(key, val); - break; - } - b'=' if key.is_empty() => { - key = core::slice::from_raw_parts(ptr, n); - } - _ => {} - } - } - } - } - - Ok(()) -} - -pub fn error_str(err: Error) -> Option<&'static str> { - let desc = match err { - E2BIG => "Argument list too long", - EACCES => "Permission denied", - EADDRINUSE => "Address in use", - EADDRNOTAVAIL => "Address not available", - EAFNOSUPPORT => "Address family not supported by protocol", - EAGAIN => "Resource temporarily unavailable", - EALREADY => "Operation already in progress", - EBADF => "Bad file descriptor", - EBADMSG => "Bad message", - EBUSY => "Resource busy", - ECANCELED => "Operation canceled", - ECHILD => "No child process", - ECONNABORTED => "Connection aborted", - ECONNREFUSED => "Connection refused", - ECONNRESET => "Connection reset by peer", - EDEADLK => "Resource deadlock would occur", - EDESTADDRREQ => "Destination address required", - EDOM => "Domain error", - EDQUOT => "Quota exceeded", - EEXIST => "File exists", - EFAULT => "Bad address", - EFBIG => "File too large", - EHOSTUNREACH => "Host is unreachable", - EIDRM => "Identifier removed", - EILSEQ => "Illegal byte sequence", - EINPROGRESS => "Operation in progress", - EINTR => "Interrupted system call", - EINVAL => "Invalid argument", - EIO => "Remote I/O error", - EISCONN => "Socket is connected", - EISDIR => "Is a directory", - ELOOP => "Symbolic link loop", - EMFILE => "No file descriptors available", - EMLINK => "Too many links", - EMSGSIZE => "Message too large", - EMULTIHOP => "Multihop attempted", - ENAMETOOLONG => "Filename too long", - ENETDOWN => "Network is down", - ENETRESET => "Connection reset by network", - ENETUNREACH => "Network unreachable", - ENFILE => "Too many open files in system", - ENOBUFS => "No buffer space available", - ENODEV => "No such device", - ENOENT => "No such file or directory", - ENOEXEC => "Exec format error", - ENOLCK => "No locks available", - ENOLINK => "Link has been severed", - ENOMEM => "Out of memory", - ENOMSG => "No message of desired type", - ENOPROTOOPT => "Protocol not available", - ENOSPC => "No space left on device", - ENOSYS => "Function not implemented", - ENOTCONN => "Socket not connected", - ENOTDIR => "Not a directory", - ENOTEMPTY => "Directory not empty", - ENOTRECOVERABLE => "State not recoverable", - ENOTSOCK => "Not a socket", - ENOTSUP => "Not supported", - ENOTTY => "Not a tty", - ENXIO => "No such device or address", - EOVERFLOW => "Value too large for data type", - EOWNERDEAD => "Previous owner died", - EPERM => "Operation not permitted", - EPIPE => "Broken pipe", - EPROTO => "Protocol error", - EPROTONOSUPPORT => "Protocol not supported", - EPROTOTYPE => "Protocol wrong type for socket", - ERANGE => "Result not representable", - EROFS => "Read-only file system", - ESPIPE => "Invalid seek", - ESRCH => "No such process", - ESTALE => "Stale file handle", - ETIMEDOUT => "Operation timed out", - ETXTBSY => "Text file busy", - EXDEV => "Cross-device link", - ENOTCAPABLE => "Capabilities insufficient", - _ => return None, - }; - Some(desc) -} diff --git a/vendor/wasi-0.7.0/src/wasi_unstable/raw.rs b/vendor/wasi-0.7.0/src/wasi_unstable/raw.rs deleted file mode 100644 index 962aef29cc..0000000000 --- a/vendor/wasi-0.7.0/src/wasi_unstable/raw.rs +++ /dev/null @@ -1,632 +0,0 @@ -//! This file defines the raw WASI bindings. - -#![allow(non_camel_case_types)] - -use core::ffi::c_void; - -pub type __wasi_advice_t = u8; -pub type __wasi_clockid_t = u32; -pub type __wasi_device_t = u64; -pub type __wasi_dircookie_t = u64; -pub type __wasi_errno_t = u16; -pub type __wasi_eventrwflags_t = u16; -pub type __wasi_eventtype_t = u8; -pub type __wasi_exitcode_t = u32; -pub type __wasi_fd_t = u32; -pub type __wasi_fdflags_t = u16; -pub type __wasi_filedelta_t = i64; -pub type __wasi_filesize_t = u64; -pub type __wasi_filetype_t = u8; -pub type __wasi_fstflags_t = u16; -pub type __wasi_inode_t = u64; -pub type __wasi_linkcount_t = u32; -pub type __wasi_lookupflags_t = u32; -pub type __wasi_oflags_t = u16; -pub type __wasi_riflags_t = u16; -pub type __wasi_rights_t = u64; -pub type __wasi_roflags_t = u16; -pub type __wasi_sdflags_t = u8; -pub type __wasi_siflags_t = u16; -pub type __wasi_signal_t = u8; -pub type __wasi_subclockflags_t = u16; -pub type __wasi_timestamp_t = u64; -pub type __wasi_userdata_t = u64; -pub type __wasi_whence_t = u8; -pub type __wasi_preopentype_t = u8; - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct __wasi_dirent_t { - pub d_next: __wasi_dircookie_t, - pub d_ino: __wasi_inode_t, - pub d_namlen: u32, - pub d_type: __wasi_filetype_t, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct __wasi_event_u_fd_readwrite_t { - pub nbytes: __wasi_filesize_t, - pub flags: __wasi_eventrwflags_t, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct __wasi_fdstat_t { - pub fs_filetype: __wasi_filetype_t, - pub fs_flags: __wasi_fdflags_t, - pub fs_rights_base: __wasi_rights_t, - pub fs_rights_inheriting: __wasi_rights_t, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct __wasi_filestat_t { - pub st_dev: __wasi_device_t, - pub st_ino: __wasi_inode_t, - pub st_filetype: __wasi_filetype_t, - pub st_nlink: __wasi_linkcount_t, - pub st_size: __wasi_filesize_t, - pub st_atim: __wasi_timestamp_t, - pub st_mtim: __wasi_timestamp_t, - pub st_ctim: __wasi_timestamp_t, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct __wasi_ciovec_t { - pub buf: *const c_void, - pub buf_len: usize, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct __wasi_iovec_t { - pub buf: *mut c_void, - pub buf_len: usize, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct __wasi_subscription_u_clock_t { - pub identifier: __wasi_userdata_t, - pub clock_id: __wasi_clockid_t, - pub timeout: __wasi_timestamp_t, - pub precision: __wasi_timestamp_t, - pub flags: __wasi_subclockflags_t, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct __wasi_subscription_u_fd_readwrite_t { - pub fd: __wasi_fd_t, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -pub struct __wasi_prestat_u_dir_t { - pub pr_name_len: usize, -} - -#[repr(C)] -#[derive(Copy, Clone)] -#[allow(missing_debug_implementations)] -pub struct __wasi_subscription_t { - pub userdata: __wasi_userdata_t, - pub type_: __wasi_eventtype_t, - pub u: __wasi_subscription_u, -} - -#[repr(C)] -#[derive(Copy, Clone)] -#[allow(missing_debug_implementations)] -pub struct __wasi_event_t { - pub userdata: __wasi_userdata_t, - pub error: __wasi_errno_t, - pub type_: __wasi_eventtype_t, - pub u: __wasi_event_u, -} - -#[repr(C)] -#[derive(Copy, Clone)] -#[allow(missing_debug_implementations)] -pub union __wasi_event_u { - pub fd_readwrite: __wasi_event_u_fd_readwrite_t, - _bindgen_union_align: [u64; 2], -} - -#[repr(C)] -#[derive(Copy, Clone)] -#[allow(missing_debug_implementations)] -pub union __wasi_subscription_u { - pub clock: __wasi_subscription_u_clock_t, - pub fd_readwrite: __wasi_subscription_u_fd_readwrite_t, - _bindgen_union_align: [u64; 5], -} - -#[repr(C)] -#[derive(Copy, Clone)] -#[allow(missing_debug_implementations)] -pub struct __wasi_prestat_t { - pub pr_type: __wasi_preopentype_t, - pub u: __wasi_prestat_u, -} - -#[repr(C)] -#[derive(Copy, Clone)] -#[allow(missing_debug_implementations)] -pub union __wasi_prestat_u { - pub dir: __wasi_prestat_u_dir_t, -} - -pub const __WASI_ADVICE_NORMAL: u8 = 0; -pub const __WASI_ADVICE_SEQUENTIAL: u8 = 1; -pub const __WASI_ADVICE_RANDOM: u8 = 2; -pub const __WASI_ADVICE_WILLNEED: u8 = 3; -pub const __WASI_ADVICE_DONTNEED: u8 = 4; -pub const __WASI_ADVICE_NOREUSE: u8 = 5; -pub const __WASI_CLOCK_REALTIME: u32 = 0; -pub const __WASI_CLOCK_MONOTONIC: u32 = 1; -pub const __WASI_CLOCK_PROCESS_CPUTIME_ID: u32 = 2; -pub const __WASI_CLOCK_THREAD_CPUTIME_ID: u32 = 3; -pub const __WASI_DIRCOOKIE_START: u64 = 0; -pub const __WASI_ESUCCESS: u16 = 0; -pub const __WASI_E2BIG: u16 = 1; -pub const __WASI_EACCES: u16 = 2; -pub const __WASI_EADDRINUSE: u16 = 3; -pub const __WASI_EADDRNOTAVAIL: u16 = 4; -pub const __WASI_EAFNOSUPPORT: u16 = 5; -pub const __WASI_EAGAIN: u16 = 6; -pub const __WASI_EALREADY: u16 = 7; -pub const __WASI_EBADF: u16 = 8; -pub const __WASI_EBADMSG: u16 = 9; -pub const __WASI_EBUSY: u16 = 10; -pub const __WASI_ECANCELED: u16 = 11; -pub const __WASI_ECHILD: u16 = 12; -pub const __WASI_ECONNABORTED: u16 = 13; -pub const __WASI_ECONNREFUSED: u16 = 14; -pub const __WASI_ECONNRESET: u16 = 15; -pub const __WASI_EDEADLK: u16 = 16; -pub const __WASI_EDESTADDRREQ: u16 = 17; -pub const __WASI_EDOM: u16 = 18; -pub const __WASI_EDQUOT: u16 = 19; -pub const __WASI_EEXIST: u16 = 20; -pub const __WASI_EFAULT: u16 = 21; -pub const __WASI_EFBIG: u16 = 22; -pub const __WASI_EHOSTUNREACH: u16 = 23; -pub const __WASI_EIDRM: u16 = 24; -pub const __WASI_EILSEQ: u16 = 25; -pub const __WASI_EINPROGRESS: u16 = 26; -pub const __WASI_EINTR: u16 = 27; -pub const __WASI_EINVAL: u16 = 28; -pub const __WASI_EIO: u16 = 29; -pub const __WASI_EISCONN: u16 = 30; -pub const __WASI_EISDIR: u16 = 31; -pub const __WASI_ELOOP: u16 = 32; -pub const __WASI_EMFILE: u16 = 33; -pub const __WASI_EMLINK: u16 = 34; -pub const __WASI_EMSGSIZE: u16 = 35; -pub const __WASI_EMULTIHOP: u16 = 36; -pub const __WASI_ENAMETOOLONG: u16 = 37; -pub const __WASI_ENETDOWN: u16 = 38; -pub const __WASI_ENETRESET: u16 = 39; -pub const __WASI_ENETUNREACH: u16 = 40; -pub const __WASI_ENFILE: u16 = 41; -pub const __WASI_ENOBUFS: u16 = 42; -pub const __WASI_ENODEV: u16 = 43; -pub const __WASI_ENOENT: u16 = 44; -pub const __WASI_ENOEXEC: u16 = 45; -pub const __WASI_ENOLCK: u16 = 46; -pub const __WASI_ENOLINK: u16 = 47; -pub const __WASI_ENOMEM: u16 = 48; -pub const __WASI_ENOMSG: u16 = 49; -pub const __WASI_ENOPROTOOPT: u16 = 50; -pub const __WASI_ENOSPC: u16 = 51; -pub const __WASI_ENOSYS: u16 = 52; -pub const __WASI_ENOTCONN: u16 = 53; -pub const __WASI_ENOTDIR: u16 = 54; -pub const __WASI_ENOTEMPTY: u16 = 55; -pub const __WASI_ENOTRECOVERABLE: u16 = 56; -pub const __WASI_ENOTSOCK: u16 = 57; -pub const __WASI_ENOTSUP: u16 = 58; -pub const __WASI_ENOTTY: u16 = 59; -pub const __WASI_ENXIO: u16 = 60; -pub const __WASI_EOVERFLOW: u16 = 61; -pub const __WASI_EOWNERDEAD: u16 = 62; -pub const __WASI_EPERM: u16 = 63; -pub const __WASI_EPIPE: u16 = 64; -pub const __WASI_EPROTO: u16 = 65; -pub const __WASI_EPROTONOSUPPORT: u16 = 66; -pub const __WASI_EPROTOTYPE: u16 = 67; -pub const __WASI_ERANGE: u16 = 68; -pub const __WASI_EROFS: u16 = 69; -pub const __WASI_ESPIPE: u16 = 70; -pub const __WASI_ESRCH: u16 = 71; -pub const __WASI_ESTALE: u16 = 72; -pub const __WASI_ETIMEDOUT: u16 = 73; -pub const __WASI_ETXTBSY: u16 = 74; -pub const __WASI_EXDEV: u16 = 75; -pub const __WASI_ENOTCAPABLE: u16 = 76; -pub const __WASI_EVENT_FD_READWRITE_HANGUP: u16 = 0x0001; -pub const __WASI_EVENTTYPE_CLOCK: u8 = 0; -pub const __WASI_EVENTTYPE_FD_READ: u8 = 1; -pub const __WASI_EVENTTYPE_FD_WRITE: u8 = 2; -pub const __WASI_FDFLAG_APPEND: u16 = 0x0001; -pub const __WASI_FDFLAG_DSYNC: u16 = 0x0002; -pub const __WASI_FDFLAG_NONBLOCK: u16 = 0x0004; -pub const __WASI_FDFLAG_RSYNC: u16 = 0x0008; -pub const __WASI_FDFLAG_SYNC: u16 = 0x0010; -pub const __WASI_FILETYPE_UNKNOWN: u8 = 0; -pub const __WASI_FILETYPE_BLOCK_DEVICE: u8 = 1; -pub const __WASI_FILETYPE_CHARACTER_DEVICE: u8 = 2; -pub const __WASI_FILETYPE_DIRECTORY: u8 = 3; -pub const __WASI_FILETYPE_REGULAR_FILE: u8 = 4; -pub const __WASI_FILETYPE_SOCKET_DGRAM: u8 = 5; -pub const __WASI_FILETYPE_SOCKET_STREAM: u8 = 6; -pub const __WASI_FILETYPE_SYMBOLIC_LINK: u8 = 7; -pub const __WASI_FILESTAT_SET_ATIM: u16 = 0x0001; -pub const __WASI_FILESTAT_SET_ATIM_NOW: u16 = 0x0002; -pub const __WASI_FILESTAT_SET_MTIM: u16 = 0x0004; -pub const __WASI_FILESTAT_SET_MTIM_NOW: u16 = 0x0008; -pub const __WASI_LOOKUP_SYMLINK_FOLLOW: u32 = 0x0000_0001; -pub const __WASI_O_CREAT: u16 = 0x0001; -pub const __WASI_O_DIRECTORY: u16 = 0x0002; -pub const __WASI_O_EXCL: u16 = 0x0004; -pub const __WASI_O_TRUNC: u16 = 0x0008; -pub const __WASI_PREOPENTYPE_DIR: u8 = 0; -pub const __WASI_SOCK_RECV_PEEK: u16 = 0x0001; -pub const __WASI_SOCK_RECV_WAITALL: u16 = 0x0002; -pub const __WASI_RIGHT_FD_DATASYNC: u64 = 0x0000_0000_0000_0001; -pub const __WASI_RIGHT_FD_READ: u64 = 0x0000_0000_0000_0002; -pub const __WASI_RIGHT_FD_SEEK: u64 = 0x0000_0000_0000_0004; -pub const __WASI_RIGHT_FD_FDSTAT_SET_FLAGS: u64 = 0x0000_0000_0000_0008; -pub const __WASI_RIGHT_FD_SYNC: u64 = 0x0000_0000_0000_0010; -pub const __WASI_RIGHT_FD_TELL: u64 = 0x0000_0000_0000_0020; -pub const __WASI_RIGHT_FD_WRITE: u64 = 0x0000_0000_0000_0040; -pub const __WASI_RIGHT_FD_ADVISE: u64 = 0x0000_0000_0000_0080; -pub const __WASI_RIGHT_FD_ALLOCATE: u64 = 0x0000_0000_0000_0100; -pub const __WASI_RIGHT_PATH_CREATE_DIRECTORY: u64 = 0x0000_0000_0000_0200; -pub const __WASI_RIGHT_PATH_CREATE_FILE: u64 = 0x0000_0000_0000_0400; -pub const __WASI_RIGHT_PATH_LINK_SOURCE: u64 = 0x0000_0000_0000_0800; -pub const __WASI_RIGHT_PATH_LINK_TARGET: u64 = 0x0000_0000_0000_1000; -pub const __WASI_RIGHT_PATH_OPEN: u64 = 0x0000_0000_0000_2000; -pub const __WASI_RIGHT_FD_READDIR: u64 = 0x0000_0000_0000_4000; -pub const __WASI_RIGHT_PATH_READLINK: u64 = 0x0000_0000_0000_8000; -pub const __WASI_RIGHT_PATH_RENAME_SOURCE: u64 = 0x0000_0000_0001_0000; -pub const __WASI_RIGHT_PATH_RENAME_TARGET: u64 = 0x0000_0000_0002_0000; -pub const __WASI_RIGHT_PATH_FILESTAT_GET: u64 = 0x0000_0000_0004_0000; -pub const __WASI_RIGHT_PATH_FILESTAT_SET_SIZE: u64 = 0x0000_0000_0008_0000; -pub const __WASI_RIGHT_PATH_FILESTAT_SET_TIMES: u64 = 0x0000_0000_0010_0000; -pub const __WASI_RIGHT_FD_FILESTAT_GET: u64 = 0x0000_0000_0020_0000; -pub const __WASI_RIGHT_FD_FILESTAT_SET_SIZE: u64 = 0x0000_0000_0040_0000; -pub const __WASI_RIGHT_FD_FILESTAT_SET_TIMES: u64 = 0x0000_0000_0080_0000; -pub const __WASI_RIGHT_PATH_SYMLINK: u64 = 0x0000_0000_0100_0000; -pub const __WASI_RIGHT_PATH_REMOVE_DIRECTORY: u64 = 0x0000_0000_0200_0000; -pub const __WASI_RIGHT_PATH_UNLINK_FILE: u64 = 0x0000_0000_0400_0000; -pub const __WASI_RIGHT_POLL_FD_READWRITE: u64 = 0x0000_0000_0800_0000; -pub const __WASI_RIGHT_SOCK_SHUTDOWN: u64 = 0x0000_0000_1000_0000; -pub const __WASI_SOCK_RECV_DATA_TRUNCATED: u16 = 0x0001; -pub const __WASI_SHUT_RD: u8 = 0x01; -pub const __WASI_SHUT_WR: u8 = 0x02; -pub const __WASI_SIGHUP: u8 = 1; -pub const __WASI_SIGINT: u8 = 2; -pub const __WASI_SIGQUIT: u8 = 3; -pub const __WASI_SIGILL: u8 = 4; -pub const __WASI_SIGTRAP: u8 = 5; -pub const __WASI_SIGABRT: u8 = 6; -pub const __WASI_SIGBUS: u8 = 7; -pub const __WASI_SIGFPE: u8 = 8; -pub const __WASI_SIGKILL: u8 = 9; -pub const __WASI_SIGUSR1: u8 = 10; -pub const __WASI_SIGSEGV: u8 = 11; -pub const __WASI_SIGUSR2: u8 = 12; -pub const __WASI_SIGPIPE: u8 = 13; -pub const __WASI_SIGALRM: u8 = 14; -pub const __WASI_SIGTERM: u8 = 15; -pub const __WASI_SIGCHLD: u8 = 16; -pub const __WASI_SIGCONT: u8 = 17; -pub const __WASI_SIGSTOP: u8 = 18; -pub const __WASI_SIGTSTP: u8 = 19; -pub const __WASI_SIGTTIN: u8 = 20; -pub const __WASI_SIGTTOU: u8 = 21; -pub const __WASI_SIGURG: u8 = 22; -pub const __WASI_SIGXCPU: u8 = 23; -pub const __WASI_SIGXFSZ: u8 = 24; -pub const __WASI_SIGVTALRM: u8 = 25; -pub const __WASI_SIGPROF: u8 = 26; -pub const __WASI_SIGWINCH: u8 = 27; -pub const __WASI_SIGPOLL: u8 = 28; -pub const __WASI_SIGPWR: u8 = 29; -pub const __WASI_SIGSYS: u8 = 30; -pub const __WASI_SUBSCRIPTION_CLOCK_ABSTIME: u16 = 0x0001; -pub const __WASI_WHENCE_CUR: u8 = 0; -pub const __WASI_WHENCE_END: u8 = 1; -pub const __WASI_WHENCE_SET: u8 = 2; -pub const __WASI_STDIN_FD: u32 = 0; -pub const __WASI_STDOUT_FD: u32 = 1; -pub const __WASI_STDERR_FD: u32 = 2; - -#[link(wasm_import_module = "wasi_unstable")] -extern "C" { - #[link_name = "clock_res_get"] - pub fn __wasi_clock_res_get( - clock_id: __wasi_clockid_t, - resolution: *mut __wasi_timestamp_t, - ) -> __wasi_errno_t; - - #[link_name = "clock_time_get"] - pub fn __wasi_clock_time_get( - clock_id: __wasi_clockid_t, - precision: __wasi_timestamp_t, - time: *mut __wasi_timestamp_t, - ) -> __wasi_errno_t; - - #[link_name = "fd_close"] - pub fn __wasi_fd_close(fd: __wasi_fd_t) -> __wasi_errno_t; - - #[link_name = "fd_datasync"] - pub fn __wasi_fd_datasync(fd: __wasi_fd_t) -> __wasi_errno_t; - - #[link_name = "fd_pread"] - pub fn __wasi_fd_pread( - fd: __wasi_fd_t, - iovs: *const __wasi_iovec_t, - iovs_len: usize, - offset: __wasi_filesize_t, - nread: *mut usize, - ) -> __wasi_errno_t; - - #[link_name = "fd_pwrite"] - pub fn __wasi_fd_pwrite( - fd: __wasi_fd_t, - iovs: *const __wasi_ciovec_t, - iovs_len: usize, - offset: __wasi_filesize_t, - nwritten: *mut usize, - ) -> __wasi_errno_t; - - #[link_name = "fd_read"] - pub fn __wasi_fd_read( - fd: __wasi_fd_t, - iovs: *const __wasi_iovec_t, - iovs_len: usize, - nread: *mut usize, - ) -> __wasi_errno_t; - - #[link_name = "fd_renumber"] - pub fn __wasi_fd_renumber(from: __wasi_fd_t, to: __wasi_fd_t) -> __wasi_errno_t; - - #[link_name = "fd_seek"] - pub fn __wasi_fd_seek( - fd: __wasi_fd_t, - offset: __wasi_filedelta_t, - whence: __wasi_whence_t, - newoffset: *mut __wasi_filesize_t, - ) -> __wasi_errno_t; - - #[link_name = "fd_tell"] - pub fn __wasi_fd_tell(fd: __wasi_fd_t, newoffset: *mut __wasi_filesize_t) -> __wasi_errno_t; - - #[link_name = "fd_fdstat_get"] - pub fn __wasi_fd_fdstat_get(fd: __wasi_fd_t, buf: *mut __wasi_fdstat_t) -> __wasi_errno_t; - - #[link_name = "fd_fdstat_set_flags"] - pub fn __wasi_fd_fdstat_set_flags(fd: __wasi_fd_t, flags: __wasi_fdflags_t) -> __wasi_errno_t; - - #[link_name = "fd_fdstat_set_rights"] - pub fn __wasi_fd_fdstat_set_rights( - fd: __wasi_fd_t, - fs_rights_base: __wasi_rights_t, - fs_rights_inheriting: __wasi_rights_t, - ) -> __wasi_errno_t; - - #[link_name = "fd_sync"] - pub fn __wasi_fd_sync(fd: __wasi_fd_t) -> __wasi_errno_t; - - #[link_name = "fd_write"] - pub fn __wasi_fd_write( - fd: __wasi_fd_t, - iovs: *const __wasi_ciovec_t, - iovs_len: usize, - nwritten: *mut usize, - ) -> __wasi_errno_t; - - #[link_name = "fd_advise"] - pub fn __wasi_fd_advise( - fd: __wasi_fd_t, - offset: __wasi_filesize_t, - len: __wasi_filesize_t, - advice: __wasi_advice_t, - ) -> __wasi_errno_t; - - #[link_name = "fd_allocate"] - pub fn __wasi_fd_allocate( - fd: __wasi_fd_t, - offset: __wasi_filesize_t, - len: __wasi_filesize_t, - ) -> __wasi_errno_t; - - #[link_name = "path_create_directory"] - pub fn __wasi_path_create_directory( - fd: __wasi_fd_t, - path: *const u8, - path_len: usize, - ) -> __wasi_errno_t; - - #[link_name = "path_link"] - pub fn __wasi_path_link( - old_fd: __wasi_fd_t, - old_flags: __wasi_lookupflags_t, - old_path: *const u8, - old_path_len: usize, - new_fd: __wasi_fd_t, - new_path: *const u8, - new_path_len: usize, - ) -> __wasi_errno_t; - - #[link_name = "path_open"] - pub fn __wasi_path_open( - dirfd: __wasi_fd_t, - dirflags: __wasi_lookupflags_t, - path: *const u8, - path_len: usize, - oflags: __wasi_oflags_t, - fs_rights_base: __wasi_rights_t, - fs_rights_inheriting: __wasi_rights_t, - fs_flags: __wasi_fdflags_t, - fd: *mut __wasi_fd_t, - ) -> __wasi_errno_t; - - #[link_name = "fd_readdir"] - pub fn __wasi_fd_readdir( - fd: __wasi_fd_t, - buf: *mut c_void, - buf_len: usize, - cookie: __wasi_dircookie_t, - bufused: *mut usize, - ) -> __wasi_errno_t; - - #[link_name = "path_readlink"] - pub fn __wasi_path_readlink( - fd: __wasi_fd_t, - path: *const u8, - path_len: usize, - buf: *mut u8, - buf_len: usize, - bufused: *mut usize, - ) -> __wasi_errno_t; - - #[link_name = "path_rename"] - pub fn __wasi_path_rename( - old_fd: __wasi_fd_t, - old_path: *const u8, - old_path_len: usize, - new_fd: __wasi_fd_t, - new_path: *const u8, - new_path_len: usize, - ) -> __wasi_errno_t; - - #[link_name = "fd_filestat_get"] - pub fn __wasi_fd_filestat_get(fd: __wasi_fd_t, buf: *mut __wasi_filestat_t) -> __wasi_errno_t; - - #[link_name = "fd_filestat_set_times"] - pub fn __wasi_fd_filestat_set_times( - fd: __wasi_fd_t, - st_atim: __wasi_timestamp_t, - st_mtim: __wasi_timestamp_t, - fstflags: __wasi_fstflags_t, - ) -> __wasi_errno_t; - - #[link_name = "fd_filestat_set_size"] - pub fn __wasi_fd_filestat_set_size( - fd: __wasi_fd_t, - st_size: __wasi_filesize_t, - ) -> __wasi_errno_t; - - #[link_name = "path_filestat_get"] - pub fn __wasi_path_filestat_get( - fd: __wasi_fd_t, - flags: __wasi_lookupflags_t, - path: *const u8, - path_len: usize, - buf: *mut __wasi_filestat_t, - ) -> __wasi_errno_t; - - #[link_name = "path_filestat_set_times"] - pub fn __wasi_path_filestat_set_times( - fd: __wasi_fd_t, - flags: __wasi_lookupflags_t, - path: *const u8, - path_len: usize, - st_atim: __wasi_timestamp_t, - st_mtim: __wasi_timestamp_t, - fstflags: __wasi_fstflags_t, - ) -> __wasi_errno_t; - - #[link_name = "path_symlink"] - pub fn __wasi_path_symlink( - old_path: *const u8, - old_path_len: usize, - fd: __wasi_fd_t, - new_path: *const u8, - new_path_len: usize, - ) -> __wasi_errno_t; - - #[link_name = "path_unlink_file"] - pub fn __wasi_path_unlink_file( - fd: __wasi_fd_t, - path: *const u8, - path_len: usize, - ) -> __wasi_errno_t; - - #[link_name = "path_remove_directory"] - pub fn __wasi_path_remove_directory( - fd: __wasi_fd_t, - path: *const u8, - path_len: usize, - ) -> __wasi_errno_t; - - #[link_name = "poll_oneoff"] - pub fn __wasi_poll_oneoff( - in_: *const __wasi_subscription_t, - out: *mut __wasi_event_t, - nsubscriptions: usize, - nevents: *mut usize, - ) -> __wasi_errno_t; - - #[link_name = "proc_exit"] - pub fn __wasi_proc_exit(rval: __wasi_exitcode_t) -> !; - - #[link_name = "random_get"] - pub fn __wasi_random_get(buf: *mut c_void, buf_len: usize) -> __wasi_errno_t; - - #[link_name = "sock_recv"] - pub fn __wasi_sock_recv( - sock: __wasi_fd_t, - ri_data: *const __wasi_iovec_t, - ri_data_len: usize, - ri_flags: __wasi_riflags_t, - ro_datalen: *mut usize, - ro_flags: *mut __wasi_roflags_t, - ) -> __wasi_errno_t; - - #[link_name = "sock_send"] - pub fn __wasi_sock_send( - sock: __wasi_fd_t, - si_data: *const __wasi_ciovec_t, - si_data_len: usize, - si_flags: __wasi_siflags_t, - so_datalen: *mut usize, - ) -> __wasi_errno_t; - - #[link_name = "sock_shutdown"] - pub fn __wasi_sock_shutdown(sock: __wasi_fd_t, how: __wasi_sdflags_t) -> __wasi_errno_t; - - #[link_name = "sched_yield"] - pub fn __wasi_sched_yield() -> __wasi_errno_t; - - #[link_name = "args_get"] - pub fn __wasi_args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> __wasi_errno_t; - - #[link_name = "args_sizes_get"] - pub fn __wasi_args_sizes_get(argc: *mut usize, argv_buf_size: *mut usize) -> __wasi_errno_t; - - #[link_name = "environ_get"] - pub fn __wasi_environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> __wasi_errno_t; - - #[link_name = "environ_sizes_get"] - pub fn __wasi_environ_sizes_get( - environ_count: *mut usize, - environ_buf_size: *mut usize, - ) -> __wasi_errno_t; - - #[link_name = "fd_prestat_get"] - pub fn __wasi_fd_prestat_get(fd: __wasi_fd_t, buf: *mut __wasi_prestat_t) -> __wasi_errno_t; - - #[link_name = "fd_prestat_dir_name"] - pub fn __wasi_fd_prestat_dir_name( - fd: __wasi_fd_t, - path: *mut u8, - path_len: usize, - ) -> __wasi_errno_t; -} diff --git a/version b/version index 661758f261..3eab4d62da 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.41.1 (f3e1a954d 2020-02-24) \ No newline at end of file +1.42.0 (b8cedc004 2020-03-09) \ No newline at end of file -- 2.39.5

    {}extern crate {} as {};", - myitem.visibility.print_with_space(), - anchor(myitem.def_id, src), - name) - } - None => { - write!(w, "
    {}extern crate {};", - myitem.visibility.print_with_space(), - anchor(myitem.def_id, name)) - } + Some(ref src) => write!( + w, + "
    {}extern crate {} as {};", + myitem.visibility.print_with_space(), + anchor(myitem.def_id, src), + name + ), + None => write!( + w, + "
    {}extern crate {};", + myitem.visibility.print_with_space(), + anchor(myitem.def_id, name) + ), } write!(w, "
    {}{}
    {}{}
    {name}{unsafety_flag}{stab_tags}{docs}